ZGlmZiAtLWdpdCBhLy5tYWlsbWFwIGIvLm1haWxtYXAKaW5kZXggOTdmN2I0Zi4uNGU4M2U3YiAxMDA2NDQKLS0tIGEvLm1haWxtYXAKKysrIGIvLm1haWxtYXAKQEAgLTMyLDYgKzMyLDcgQEAKIENvcmV5IE1pbnlhcmQgPG1pbnlhcmRAYWNtLm9yZz4KIERhdmlkIEJyb3duZWxsIDxkYXZpZC1iQHBhY2JlbGwubmV0PgogRGF2aWQgV29vZGhvdXNlIDxkd213MkBzaGlueWJvb2suaW5mcmFkZWFkLm9yZz4KK0RtaXRyeSBFcmVtaW4tU29sZW5pa292IDxkYmFyeXNoa292QGdtYWlsLmNvbT4KIERvbWVuIFB1bmNlciA8ZG9tZW5AY29kZXJvY2sub3JnPgogRG91Z2xhcyBHaWxiZXJ0IDxkb3VnZ0B0b3JxdWUubmV0PgogRWQgTC4gQ2FzaGluIDxlY2FzaGluQGNvcmFpZC5jb20+CmRpZmYgLS1naXQgYS9DUkVESVRTIGIvQ1JFRElUUwppbmRleCBhYmUwNWEwLi45MzlkYTQ2IDEwMDY0NAotLS0gYS9DUkVESVRTCisrKyBiL0NSRURJVFMKQEAgLTQ2NCw2ICs0NjQsMTEgQEAKIFM6IE5hbXBhLCBJZGFobyA4MzY4NgogUzogVVNBCiAKK046IERpcmsgSi4gQnJhbmRld2llCitFOiBkaXJrLmouYnJhbmRld2llQGludGVsLmNvbQorRTogbGludXgtd2ltYXhAaW50ZWwuY29tCitEOiBJbnRlbCBXaXJlbGVzcyBXaU1BWCBDb25uZWN0aW9uIDI0MDAgU0RJTyBkcml2ZXIKKwogTjogRGVycmljayBKLiBCcmFzaGVhcgogRTogc2hhZG93QGRlbWVudGlhLm9yZwogVzogaHR0cDovL3d3dy5kZW1lbnRpYS5vcmcvfnNoYWRvdwpAQCAtMTY4MSw3ICsxNjg2LDcgQEAKIEQ6IGZiZGV2IGhhY2tpbmcKIAogTjogSmVzcGVyIEp1aGwKLUU6IGplc3Blci5qdWhsQGdtYWlsLmNvbQorRTogampAY2hhb3NiaXRzLm5ldAogRDogVmFyaW91cyBmaXhlcywgY2xlYW51cHMgYW5kIG1pbm9yIGZlYXR1cmVzIGFsbCBvdmVyIHRoZSB0cmVlLgogRDogV3JvdGUgaW5pdGlhbCB2ZXJzaW9uIG9mIHRoZSBoZGFwcyBkcml2ZXIgKHNpbmNlIHBhc3NlZCBvbiB0byBvdGhlcnMpLgogUzogTGVtbm9zdmVqIDEsIDMudHYKQEAgLTIxMTksNiArMjEyNCwxMSBAQAogRTogaGpsQGdudS5haS5taXQuZWR1CiBEOiBHQ0MgKyBsaWJyYXJpZXMgaGFja2VyCiAKK046IFlhbmlyIEx1YmV0a2luCitFOiB5YW5pcngubHViYXRraW5AaW50ZWwuY29tCitFOiBsaW51eC13aW1heEBpbnRlbC5jb20KK0Q6IEludGVsIFdpcmVsZXNzIFdpTUFYIENvbm5lY3Rpb24gMjQwMCBkcml2ZXIKKwogTjogTWljaGFsIEx1ZHZpZwogRTogbWljaGFsQGxvZ2l4LmN6CiBFOiBtaWNoYWwubHVkdmlnQGFzdGVyaXNrLmNvLm56CkBAIC0yNjkzLDYgKzI3MDMsMTMgQEAKIFM6IFRodW5kZXIgQmF5LCBPbnRhcmlvCiBTOiBDQU5BREEgUDdDIDVNOQogCitOOiBJbmFreSBQZXJlei1Hb256YWxlegorRTogaW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tCitFOiBsaW51eC13aW1heEBpbnRlbC5jb20KK0U6IGluYWt5cGdAeWFob28uY29tCitEOiBXaU1BWCBzdGFjaworRDogSW50ZWwgV2lyZWxlc3MgV2lNQVggQ29ubmVjdGlvbiAyNDAwIGRyaXZlcgorCiBOOiBZdXJpIFBlcgogRTogeXVyaUBwdHMubWlwdC5ydQogRDogU29tZSBzbWJmcyBmaXhlcwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1yZWd1bGF0b3IgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLXJlZ3VsYXRvcgppbmRleCAzNzMxZjZmLi44NzNlZjFmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLXJlZ3VsYXRvcgorKysgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLXJlZ3VsYXRvcgpAQCAtMyw4ICszLDkgQEAKIEtlcm5lbFZlcnNpb246CTIuNi4yNgogQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KIERlc2NyaXB0aW9uOgotCQlFYWNoIHJlZ3VsYXRvciBkaXJlY3Rvcnkgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCi0JCXN0YXRlLiBUaGlzIGhvbGRzIHRoZSByZWd1bGF0b3Igb3V0cHV0IHN0YXRlLgorCQlTb21lIHJlZ3VsYXRvciBkaXJlY3RvcmllcyB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKKwkJc3RhdGUuIFRoaXMgcmVwb3J0cyB0aGUgcmVndWxhdG9yIGVuYWJsZSBzdGF0dXMsIGZvcgorCQlyZWd1bGF0b3JzIHdoaWNoIGNhbiByZXBvcnQgdGhhdCB2YWx1ZS4KIAogCQlUaGlzIHdpbGwgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgc3RyaW5nczoKIApAQCAtMTgsNyArMTksOCBAQAogCQknZGlzYWJsZWQnIG1lYW5zIHRoZSByZWd1bGF0b3Igb3V0cHV0IGlzIE9GRiBhbmQgaXMgbm90CiAJCXN1cHBseWluZyBwb3dlciB0byB0aGUgc3lzdGVtLi4KIAotCQkndW5rbm93bicgbWVhbnMgc29mdHdhcmUgY2Fubm90IGRldGVybWluZSB0aGUgc3RhdGUuCisJCSd1bmtub3duJyBtZWFucyBzb2Z0d2FyZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBzdGF0ZSwgb3IKKwkJdGhlIHJlcG9ydGVkIHN0YXRlIGlzIGludmFsaWQuCiAKIAkJTk9URTogdGhpcyBmaWVsZCBjYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIG1pY3Jvdm9sdHMKIAkJYW5kIG1pY3JvYW1wcyB0byBkZXRlcm1pbmUgcmVndWxhdG9yIG91dHB1dCBsZXZlbHMuCkBAIC01Myw5ICs1NSwxMCBAQAogS2VybmVsVmVyc2lvbjoJMi42LjI2CiBDb250YWN0OglMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPgogRGVzY3JpcHRpb246Ci0JCUVhY2ggcmVndWxhdG9yIGRpcmVjdG9yeSB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKKwkJU29tZSByZWd1bGF0b3IgZGlyZWN0b3JpZXMgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCiAJCW1pY3Jvdm9sdHMuIFRoaXMgaG9sZHMgdGhlIHJlZ3VsYXRvciBvdXRwdXQgdm9sdGFnZSBzZXR0aW5nCi0JCW1lYXN1cmVkIGluIG1pY3Jvdm9sdHMgKGkuZS4gRS02IFZvbHRzKS4KKwkJbWVhc3VyZWQgaW4gbWljcm92b2x0cyAoaS5lLiBFLTYgVm9sdHMpLCBmb3IgcmVndWxhdG9ycworCQl3aGljaCBjYW4gcmVwb3J0IHRoYXQgdm9sdGFnZS4KIAogCQlOT1RFOiBUaGlzIHZhbHVlIHNob3VsZCBub3QgYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHJlZ3VsYXRvcgogCQlvdXRwdXQgdm9sdGFnZSBsZXZlbCBhcyB0aGlzIHZhbHVlIGlzIHRoZSBzYW1lIHJlZ2FyZGxlc3Mgb2YKQEAgLTY3LDkgKzcwLDEwIEBACiBLZXJuZWxWZXJzaW9uOgkyLjYuMjYKIENvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBEZXNjcmlwdGlvbjoKLQkJRWFjaCByZWd1bGF0b3IgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAorCQlTb21lIHJlZ3VsYXRvciBkaXJlY3RvcmllcyB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKIAkJbWljcm9hbXBzLiBUaGlzIGhvbGRzIHRoZSByZWd1bGF0b3Igb3V0cHV0IGN1cnJlbnQgbGltaXQKLQkJc2V0dGluZyBtZWFzdXJlZCBpbiBtaWNyb2FtcHMgKGkuZS4gRS02IEFtcHMpLgorCQlzZXR0aW5nIG1lYXN1cmVkIGluIG1pY3JvYW1wcyAoaS5lLiBFLTYgQW1wcyksIGZvciByZWd1bGF0b3JzCisJCXdoaWNoIGNhbiByZXBvcnQgdGhhdCBjdXJyZW50LgogCiAJCU5PVEU6IFRoaXMgdmFsdWUgc2hvdWxkIG5vdCBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgcmVndWxhdG9yCiAJCW91dHB1dCBjdXJyZW50IGxldmVsIGFzIHRoaXMgdmFsdWUgaXMgdGhlIHNhbWUgcmVnYXJkbGVzcyBvZgpAQCAtODEsOCArODUsOSBAQAogS2VybmVsVmVyc2lvbjoJMi42LjI2CiBDb250YWN0OglMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPgogRGVzY3JpcHRpb246Ci0JCUVhY2ggcmVndWxhdG9yIGRpcmVjdG9yeSB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKLQkJb3Btb2RlLiBUaGlzIGhvbGRzIHRoZSByZWd1bGF0b3Igb3BlcmF0aW5nIG1vZGUgc2V0dGluZy4KKwkJU29tZSByZWd1bGF0b3IgZGlyZWN0b3JpZXMgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCisJCW9wbW9kZS4gVGhpcyBob2xkcyB0aGUgY3VycmVudCByZWd1bGF0b3Igb3BlcmF0aW5nIG1vZGUsCisJCWZvciByZWd1bGF0b3JzIHdoaWNoIGNhbiByZXBvcnQgaXQuCiAKIAkJVGhlIG9wbW9kZSB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgc3RyaW5nczoKIApAQCAtOTIsNyArOTcsNyBAQAogCQknc3RhbmRieScKIAkJJ3Vua25vd24nCiAKLQkJVGhlIG1vZGVzIGFyZSBkZXNjcmliZWQgaW4gaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvcmVndWxhdG9yLmgKKwkJVGhlIG1vZGVzIGFyZSBkZXNjcmliZWQgaW4gaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaAogCiAJCU5PVEU6IFRoaXMgdmFsdWUgc2hvdWxkIG5vdCBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgcmVndWxhdG9yCiAJCW91dHB1dCBvcGVyYXRpbmcgbW9kZSBhcyB0aGlzIHZhbHVlIGlzIHRoZSBzYW1lIHJlZ2FyZGxlc3Mgb2YKQEAgLTEwNCw5ICsxMDksMTAgQEAKIEtlcm5lbFZlcnNpb246CTIuNi4yNgogQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KIERlc2NyaXB0aW9uOgotCQlFYWNoIHJlZ3VsYXRvciBkaXJlY3Rvcnkgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCisJCVNvbWUgcmVndWxhdG9yIGRpcmVjdG9yaWVzIHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAogCQltaW5fbWljcm92b2x0cy4gVGhpcyBob2xkcyB0aGUgbWluaW11bSBzYWZlIHdvcmtpbmcgcmVndWxhdG9yCi0JCW91dHB1dCB2b2x0YWdlIHNldHRpbmcgZm9yIHRoaXMgZG9tYWluIG1lYXN1cmVkIGluIG1pY3Jvdm9sdHMuCisJCW91dHB1dCB2b2x0YWdlIHNldHRpbmcgZm9yIHRoaXMgZG9tYWluIG1lYXN1cmVkIGluIG1pY3Jvdm9sdHMsCisJCWZvciByZWd1bGF0b3JzIHdoaWNoIHN1cHBvcnQgdm9sdGFnZSBjb25zdHJhaW50cy4KIAogCQlOT1RFOiB0aGlzIHdpbGwgcmV0dXJuIHRoZSBzdHJpbmcgJ2NvbnN0cmFpbnQgbm90IGRlZmluZWQnIGlmCiAJCXRoZSBwb3dlciBkb21haW4gaGFzIG5vIG1pbiBtaWNyb3ZvbHRzIGNvbnN0cmFpbnQgZGVmaW5lZCBieQpAQCAtMTE4LDkgKzEyNCwxMCBAQAogS2VybmVsVmVyc2lvbjoJMi42LjI2CiBDb250YWN0OglMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPgogRGVzY3JpcHRpb246Ci0JCUVhY2ggcmVndWxhdG9yIGRpcmVjdG9yeSB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKKwkJU29tZSByZWd1bGF0b3IgZGlyZWN0b3JpZXMgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCiAJCW1heF9taWNyb3ZvbHRzLiBUaGlzIGhvbGRzIHRoZSBtYXhpbXVtIHNhZmUgd29ya2luZyByZWd1bGF0b3IKLQkJb3V0cHV0IHZvbHRhZ2Ugc2V0dGluZyBmb3IgdGhpcyBkb21haW4gbWVhc3VyZWQgaW4gbWljcm92b2x0cy4KKwkJb3V0cHV0IHZvbHRhZ2Ugc2V0dGluZyBmb3IgdGhpcyBkb21haW4gbWVhc3VyZWQgaW4gbWljcm92b2x0cywKKwkJZm9yIHJlZ3VsYXRvcnMgd2hpY2ggc3VwcG9ydCB2b2x0YWdlIGNvbnN0cmFpbnRzLgogCiAJCU5PVEU6IHRoaXMgd2lsbCByZXR1cm4gdGhlIHN0cmluZyAnY29uc3RyYWludCBub3QgZGVmaW5lZCcgaWYKIAkJdGhlIHBvd2VyIGRvbWFpbiBoYXMgbm8gbWF4IG1pY3Jvdm9sdHMgY29uc3RyYWludCBkZWZpbmVkIGJ5CkBAIC0xMzIsMTAgKzEzOSwxMCBAQAogS2VybmVsVmVyc2lvbjoJMi42LjI2CiBDb250YWN0OglMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPgogRGVzY3JpcHRpb246Ci0JCUVhY2ggcmVndWxhdG9yIGRpcmVjdG9yeSB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKKwkJU29tZSByZWd1bGF0b3IgZGlyZWN0b3JpZXMgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCiAJCW1pbl9taWNyb2FtcHMuIFRoaXMgaG9sZHMgdGhlIG1pbmltdW0gc2FmZSB3b3JraW5nIHJlZ3VsYXRvcgogCQlvdXRwdXQgY3VycmVudCBsaW1pdCBzZXR0aW5nIGZvciB0aGlzIGRvbWFpbiBtZWFzdXJlZCBpbgotCQltaWNyb2FtcHMuCisJCW1pY3JvYW1wcywgZm9yIHJlZ3VsYXRvcnMgd2hpY2ggc3VwcG9ydCBjdXJyZW50IGNvbnN0cmFpbnRzLgogCiAJCU5PVEU6IHRoaXMgd2lsbCByZXR1cm4gdGhlIHN0cmluZyAnY29uc3RyYWludCBub3QgZGVmaW5lZCcgaWYKIAkJdGhlIHBvd2VyIGRvbWFpbiBoYXMgbm8gbWluIG1pY3JvYW1wcyBjb25zdHJhaW50IGRlZmluZWQgYnkKQEAgLTE0NywxMCArMTU0LDEwIEBACiBLZXJuZWxWZXJzaW9uOgkyLjYuMjYKIENvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBEZXNjcmlwdGlvbjoKLQkJRWFjaCByZWd1bGF0b3IgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAorCQlTb21lIHJlZ3VsYXRvciBkaXJlY3RvcmllcyB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKIAkJbWF4X21pY3JvYW1wcy4gVGhpcyBob2xkcyB0aGUgbWF4aW11bSBzYWZlIHdvcmtpbmcgcmVndWxhdG9yCiAJCW91dHB1dCBjdXJyZW50IGxpbWl0IHNldHRpbmcgZm9yIHRoaXMgZG9tYWluIG1lYXN1cmVkIGluCi0JCW1pY3JvYW1wcy4KKwkJbWljcm9hbXBzLCBmb3IgcmVndWxhdG9ycyB3aGljaCBzdXBwb3J0IGN1cnJlbnQgY29uc3RyYWludHMuCiAKIAkJTk9URTogdGhpcyB3aWxsIHJldHVybiB0aGUgc3RyaW5nICdjb25zdHJhaW50IG5vdCBkZWZpbmVkJyBpZgogCQl0aGUgcG93ZXIgZG9tYWluIGhhcyBubyBtYXggbWljcm9hbXBzIGNvbnN0cmFpbnQgZGVmaW5lZCBieQpAQCAtMTg1LDcgKzE5Miw3IEBACiBLZXJuZWxWZXJzaW9uOgkyLjYuMjYKIENvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBEZXNjcmlwdGlvbjoKLQkJRWFjaCByZWd1bGF0b3IgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAorCQlTb21lIHJlZ3VsYXRvciBkaXJlY3RvcmllcyB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKIAkJcmVxdWVzdGVkX21pY3JvYW1wcy4gVGhpcyBob2xkcyB0aGUgdG90YWwgcmVxdWVzdGVkIGxvYWQKIAkJY3VycmVudCBpbiBtaWNyb2FtcHMgZm9yIHRoaXMgcmVndWxhdG9yIGZyb20gYWxsIGl0cyBjb25zdW1lcgogCQlkZXZpY2VzLgpAQCAtMjA0LDEyNSArMjExLDEwMiBAQAogS2VybmVsVmVyc2lvbjoJMi42LjI2CiBDb250YWN0OglMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPgogRGVzY3JpcHRpb246Ci0JCUVhY2ggcmVndWxhdG9yIGRpcmVjdG9yeSB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKKwkJU29tZSByZWd1bGF0b3IgZGlyZWN0b3JpZXMgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCiAJCXN1c3BlbmRfbWVtX21pY3Jvdm9sdHMuIFRoaXMgaG9sZHMgdGhlIHJlZ3VsYXRvciBvdXRwdXQKIAkJdm9sdGFnZSBzZXR0aW5nIGZvciB0aGlzIGRvbWFpbiBtZWFzdXJlZCBpbiBtaWNyb3ZvbHRzIHdoZW4KLQkJdGhlIHN5c3RlbSBpcyBzdXNwZW5kZWQgdG8gbWVtb3J5LgotCi0JCU5PVEU6IHRoaXMgd2lsbCByZXR1cm4gdGhlIHN0cmluZyAnbm90IGRlZmluZWQnIGlmCi0JCXRoZSBwb3dlciBkb21haW4gaGFzIG5vIHN1c3BlbmQgdG8gbWVtb3J5IHZvbHRhZ2UgZGVmaW5lZCBieQotCQlwbGF0Zm9ybSBjb2RlLgorCQl0aGUgc3lzdGVtIGlzIHN1c3BlbmRlZCB0byBtZW1vcnksIGZvciB2b2x0YWdlIHJlZ3VsYXRvcnMKKwkJaW1wbGVtZW50aW5nIHN1c3BlbmQgdm9sdGFnZSBjb25maWd1cmF0aW9uIGNvbnN0cmFpbnRzLgogCiBXaGF0OgkJL3N5cy9jbGFzcy9yZWd1bGF0b3IvLi4uL3N1c3BlbmRfZGlza19taWNyb3ZvbHRzCiBEYXRlOgkJTWF5IDIwMDgKIEtlcm5lbFZlcnNpb246CTIuNi4yNgogQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KIERlc2NyaXB0aW9uOgotCQlFYWNoIHJlZ3VsYXRvciBkaXJlY3Rvcnkgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCisJCVNvbWUgcmVndWxhdG9yIGRpcmVjdG9yaWVzIHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAogCQlzdXNwZW5kX2Rpc2tfbWljcm92b2x0cy4gVGhpcyBob2xkcyB0aGUgcmVndWxhdG9yIG91dHB1dAogCQl2b2x0YWdlIHNldHRpbmcgZm9yIHRoaXMgZG9tYWluIG1lYXN1cmVkIGluIG1pY3Jvdm9sdHMgd2hlbgotCQl0aGUgc3lzdGVtIGlzIHN1c3BlbmRlZCB0byBkaXNrLgotCi0JCU5PVEU6IHRoaXMgd2lsbCByZXR1cm4gdGhlIHN0cmluZyAnbm90IGRlZmluZWQnIGlmCi0JCXRoZSBwb3dlciBkb21haW4gaGFzIG5vIHN1c3BlbmQgdG8gZGlzayB2b2x0YWdlIGRlZmluZWQgYnkKLQkJcGxhdGZvcm0gY29kZS4KKwkJdGhlIHN5c3RlbSBpcyBzdXNwZW5kZWQgdG8gZGlzaywgZm9yIHZvbHRhZ2UgcmVndWxhdG9ycworCQlpbXBsZW1lbnRpbmcgc3VzcGVuZCB2b2x0YWdlIGNvbmZpZ3VyYXRpb24gY29uc3RyYWludHMuCiAKIFdoYXQ6CQkvc3lzL2NsYXNzL3JlZ3VsYXRvci8uLi4vc3VzcGVuZF9zdGFuZGJ5X21pY3Jvdm9sdHMKIERhdGU6CQlNYXkgMjAwOAogS2VybmVsVmVyc2lvbjoJMi42LjI2CiBDb250YWN0OglMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPgogRGVzY3JpcHRpb246Ci0JCUVhY2ggcmVndWxhdG9yIGRpcmVjdG9yeSB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKKwkJU29tZSByZWd1bGF0b3IgZGlyZWN0b3JpZXMgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCiAJCXN1c3BlbmRfc3RhbmRieV9taWNyb3ZvbHRzLiBUaGlzIGhvbGRzIHRoZSByZWd1bGF0b3Igb3V0cHV0CiAJCXZvbHRhZ2Ugc2V0dGluZyBmb3IgdGhpcyBkb21haW4gbWVhc3VyZWQgaW4gbWljcm92b2x0cyB3aGVuCi0JCXRoZSBzeXN0ZW0gaXMgc3VzcGVuZGVkIHRvIHN0YW5kYnkuCi0KLQkJTk9URTogdGhpcyB3aWxsIHJldHVybiB0aGUgc3RyaW5nICdub3QgZGVmaW5lZCcgaWYKLQkJdGhlIHBvd2VyIGRvbWFpbiBoYXMgbm8gc3VzcGVuZCB0byBzdGFuZGJ5IHZvbHRhZ2UgZGVmaW5lZCBieQotCQlwbGF0Zm9ybSBjb2RlLgorCQl0aGUgc3lzdGVtIGlzIHN1c3BlbmRlZCB0byBzdGFuZGJ5LCBmb3Igdm9sdGFnZSByZWd1bGF0b3JzCisJCWltcGxlbWVudGluZyBzdXNwZW5kIHZvbHRhZ2UgY29uZmlndXJhdGlvbiBjb25zdHJhaW50cy4KIAogV2hhdDoJCS9zeXMvY2xhc3MvcmVndWxhdG9yLy4uLi9zdXNwZW5kX21lbV9tb2RlCiBEYXRlOgkJTWF5IDIwMDgKIEtlcm5lbFZlcnNpb246CTIuNi4yNgogQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KIERlc2NyaXB0aW9uOgotCQlFYWNoIHJlZ3VsYXRvciBkaXJlY3Rvcnkgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCisJCVNvbWUgcmVndWxhdG9yIGRpcmVjdG9yaWVzIHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAogCQlzdXNwZW5kX21lbV9tb2RlLiBUaGlzIGhvbGRzIHRoZSByZWd1bGF0b3Igb3BlcmF0aW5nIG1vZGUKIAkJc2V0dGluZyBmb3IgdGhpcyBkb21haW4gd2hlbiB0aGUgc3lzdGVtIGlzIHN1c3BlbmRlZCB0bwotCQltZW1vcnkuCi0KLQkJTk9URTogdGhpcyB3aWxsIHJldHVybiB0aGUgc3RyaW5nICdub3QgZGVmaW5lZCcgaWYKLQkJdGhlIHBvd2VyIGRvbWFpbiBoYXMgbm8gc3VzcGVuZCB0byBtZW1vcnkgbW9kZSBkZWZpbmVkIGJ5Ci0JCXBsYXRmb3JtIGNvZGUuCisJCW1lbW9yeSwgZm9yIHJlZ3VsYXRvcnMgaW1wbGVtZW50aW5nIHN1c3BlbmQgbW9kZQorCQljb25maWd1cmF0aW9uIGNvbnN0cmFpbnRzLgogCiBXaGF0OgkJL3N5cy9jbGFzcy9yZWd1bGF0b3IvLi4uL3N1c3BlbmRfZGlza19tb2RlCiBEYXRlOgkJTWF5IDIwMDgKIEtlcm5lbFZlcnNpb246CTIuNi4yNgogQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KIERlc2NyaXB0aW9uOgotCQlFYWNoIHJlZ3VsYXRvciBkaXJlY3Rvcnkgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCisJCVNvbWUgcmVndWxhdG9yIGRpcmVjdG9yaWVzIHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAogCQlzdXNwZW5kX2Rpc2tfbW9kZS4gVGhpcyBob2xkcyB0aGUgcmVndWxhdG9yIG9wZXJhdGluZyBtb2RlCi0JCXNldHRpbmcgZm9yIHRoaXMgZG9tYWluIHdoZW4gdGhlIHN5c3RlbSBpcyBzdXNwZW5kZWQgdG8gZGlzay4KLQotCQlOT1RFOiB0aGlzIHdpbGwgcmV0dXJuIHRoZSBzdHJpbmcgJ25vdCBkZWZpbmVkJyBpZgotCQl0aGUgcG93ZXIgZG9tYWluIGhhcyBubyBzdXNwZW5kIHRvIGRpc2sgbW9kZSBkZWZpbmVkIGJ5Ci0JCXBsYXRmb3JtIGNvZGUuCisJCXNldHRpbmcgZm9yIHRoaXMgZG9tYWluIHdoZW4gdGhlIHN5c3RlbSBpcyBzdXNwZW5kZWQgdG8gZGlzaywKKwkJZm9yIHJlZ3VsYXRvcnMgaW1wbGVtZW50aW5nIHN1c3BlbmQgbW9kZSBjb25maWd1cmF0aW9uCisJCWNvbnN0cmFpbnRzLgogCiBXaGF0OgkJL3N5cy9jbGFzcy9yZWd1bGF0b3IvLi4uL3N1c3BlbmRfc3RhbmRieV9tb2RlCiBEYXRlOgkJTWF5IDIwMDgKIEtlcm5lbFZlcnNpb246CTIuNi4yNgogQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KIERlc2NyaXB0aW9uOgotCQlFYWNoIHJlZ3VsYXRvciBkaXJlY3Rvcnkgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCisJCVNvbWUgcmVndWxhdG9yIGRpcmVjdG9yaWVzIHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAogCQlzdXNwZW5kX3N0YW5kYnlfbW9kZS4gVGhpcyBob2xkcyB0aGUgcmVndWxhdG9yIG9wZXJhdGluZyBtb2RlCiAJCXNldHRpbmcgZm9yIHRoaXMgZG9tYWluIHdoZW4gdGhlIHN5c3RlbSBpcyBzdXNwZW5kZWQgdG8KLQkJc3RhbmRieS4KLQotCQlOT1RFOiB0aGlzIHdpbGwgcmV0dXJuIHRoZSBzdHJpbmcgJ25vdCBkZWZpbmVkJyBpZgotCQl0aGUgcG93ZXIgZG9tYWluIGhhcyBubyBzdXNwZW5kIHRvIHN0YW5kYnkgbW9kZSBkZWZpbmVkIGJ5Ci0JCXBsYXRmb3JtIGNvZGUuCisJCXN0YW5kYnksIGZvciByZWd1bGF0b3JzIGltcGxlbWVudGluZyBzdXNwZW5kIG1vZGUKKwkJY29uZmlndXJhdGlvbiBjb25zdHJhaW50cy4KIAogV2hhdDoJCS9zeXMvY2xhc3MvcmVndWxhdG9yLy4uLi9zdXNwZW5kX21lbV9zdGF0ZQogRGF0ZToJCU1heSAyMDA4CiBLZXJuZWxWZXJzaW9uOgkyLjYuMjYKIENvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBEZXNjcmlwdGlvbjoKLQkJRWFjaCByZWd1bGF0b3IgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAorCQlTb21lIHJlZ3VsYXRvciBkaXJlY3RvcmllcyB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKIAkJc3VzcGVuZF9tZW1fc3RhdGUuIFRoaXMgaG9sZHMgdGhlIHJlZ3VsYXRvciBvcGVyYXRpbmcgc3RhdGUKLQkJd2hlbiBzdXNwZW5kZWQgdG8gbWVtb3J5LgorCQl3aGVuIHN1c3BlbmRlZCB0byBtZW1vcnksIGZvciByZWd1bGF0b3JzIGltcGxlbWVudGluZyBzdXNwZW5kCisJCWNvbmZpZ3VyYXRpb24gY29uc3RyYWludHMuCiAKLQkJVGhpcyB3aWxsIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHN0cmluZ3M6Ci0KLQkJJ2VuYWJsZWQnCi0JCSdkaXNhYmxlZCcKLQkJJ25vdCBkZWZpbmVkJworCQlUaGlzIHdpbGwgYmUgb25lIG9mIHRoZSBzYW1lIHN0cmluZ3MgcmVwb3J0ZWQgYnkKKwkJdGhlICJzdGF0ZSIgYXR0cmlidXRlLgogCiBXaGF0OgkJL3N5cy9jbGFzcy9yZWd1bGF0b3IvLi4uL3N1c3BlbmRfZGlza19zdGF0ZQogRGF0ZToJCU1heSAyMDA4CiBLZXJuZWxWZXJzaW9uOgkyLjYuMjYKIENvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBEZXNjcmlwdGlvbjoKLQkJRWFjaCByZWd1bGF0b3IgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAorCQlTb21lIHJlZ3VsYXRvciBkaXJlY3RvcmllcyB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKIAkJc3VzcGVuZF9kaXNrX3N0YXRlLiBUaGlzIGhvbGRzIHRoZSByZWd1bGF0b3Igb3BlcmF0aW5nIHN0YXRlCi0JCXdoZW4gc3VzcGVuZGVkIHRvIGRpc2suCisJCXdoZW4gc3VzcGVuZGVkIHRvIGRpc2ssIGZvciByZWd1bGF0b3JzIGltcGxlbWVudGluZworCQlzdXNwZW5kIGNvbmZpZ3VyYXRpb24gY29uc3RyYWludHMuCiAKLQkJVGhpcyB3aWxsIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHN0cmluZ3M6Ci0KLQkJJ2VuYWJsZWQnCi0JCSdkaXNhYmxlZCcKLQkJJ25vdCBkZWZpbmVkJworCQlUaGlzIHdpbGwgYmUgb25lIG9mIHRoZSBzYW1lIHN0cmluZ3MgcmVwb3J0ZWQgYnkKKwkJdGhlICJzdGF0ZSIgYXR0cmlidXRlLgogCiBXaGF0OgkJL3N5cy9jbGFzcy9yZWd1bGF0b3IvLi4uL3N1c3BlbmRfc3RhbmRieV9zdGF0ZQogRGF0ZToJCU1heSAyMDA4CiBLZXJuZWxWZXJzaW9uOgkyLjYuMjYKIENvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBEZXNjcmlwdGlvbjoKLQkJRWFjaCByZWd1bGF0b3IgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAorCQlTb21lIHJlZ3VsYXRvciBkaXJlY3RvcmllcyB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKIAkJc3VzcGVuZF9zdGFuZGJ5X3N0YXRlLiBUaGlzIGhvbGRzIHRoZSByZWd1bGF0b3Igb3BlcmF0aW5nCi0JCXN0YXRlIHdoZW4gc3VzcGVuZGVkIHRvIHN0YW5kYnkuCisJCXN0YXRlIHdoZW4gc3VzcGVuZGVkIHRvIHN0YW5kYnksIGZvciByZWd1bGF0b3JzIGltcGxlbWVudGluZworCQlzdXNwZW5kIGNvbmZpZ3VyYXRpb24gY29uc3RyYWludHMuCiAKLQkJVGhpcyB3aWxsIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHN0cmluZ3M6Ci0KLQkJJ2VuYWJsZWQnCi0JCSdkaXNhYmxlZCcKLQkJJ25vdCBkZWZpbmVkJworCQlUaGlzIHdpbGwgYmUgb25lIG9mIHRoZSBzYW1lIHN0cmluZ3MgcmVwb3J0ZWQgYnkKKwkJdGhlICJzdGF0ZSIgYXR0cmlidXRlLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kZXZpY2VzLW1lbW9yeSBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZGV2aWNlcy1tZW1vcnkKaW5kZXggN2ExNmZlMS4uOWZlOTFjMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kZXZpY2VzLW1lbW9yeQorKysgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRldmljZXMtbWVtb3J5CkBAIC02LDcgKzYsNiBAQAogCQlpbnRlcm5hbCBzdGF0ZSBvZiB0aGUga2VybmVsIG1lbW9yeSBibG9ja3MuIEZpbGVzIGNvdWxkIGJlCiAJCWFkZGVkIG9yIHJlbW92ZWQgZHluYW1pY2FsbHkgdG8gcmVwcmVzZW50IGhvdC1hZGQvcmVtb3ZlCiAJCW9wZXJhdGlvbnMuCi0KIFVzZXJzOgkJaG90cGx1ZyBtZW1vcnkgYWRkL3JlbW92ZSB0b29scwogCQlodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9wcm9qZWN0cy9wb3dlcnBjLXV0aWxzLwogCkBAIC0xOSw2ICsxOCw1NiBAQAogCQlUaGlzIGlzIHVzZWZ1bCBmb3IgYSB1c2VyLWxldmVsIGFnZW50IHRvIGRldGVybWluZQogCQlpZGVudGlmeSByZW1vdmFibGUgc2VjdGlvbnMgb2YgdGhlIG1lbW9yeSBiZWZvcmUgYXR0ZW1wdGluZwogCQlwb3RlbnRpYWxseSBleHBlbnNpdmUgaG90LXJlbW92ZSBtZW1vcnkgb3BlcmF0aW9uCi0KIFVzZXJzOgkJaG90cGx1ZyBtZW1vcnkgcmVtb3ZlIHRvb2xzCiAJCWh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL3Byb2plY3RzL3Bvd2VycGMtdXRpbHMvCisKK1doYXQ6CQkvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS9tZW1vcnlYL3BoeXNfZGV2aWNlCitEYXRlOgkJU2VwdGVtYmVyIDIwMDgKK0NvbnRhY3Q6CUJhZGFyaSBQdWxhdmFydHkgPHBiYWRhcmlAdXMuaWJtLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlUaGUgZmlsZSAvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS9tZW1vcnlYL3BoeXNfZGV2aWNlCisJCWlzIHJlYWQtb25seSBhbmQgaXMgZGVzaWduZWQgdG8gc2hvdyB0aGUgbmFtZSBvZiBwaHlzaWNhbAorCQltZW1vcnkgZGV2aWNlLiAgSW1wbGVtZW50YXRpb24gaXMgY3VycmVudGx5IGluY29tcGxldGUuCisKK1doYXQ6CQkvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS9tZW1vcnlYL3BoeXNfaW5kZXgKK0RhdGU6CQlTZXB0ZW1iZXIgMjAwOAorQ29udGFjdDoJQmFkYXJpIFB1bGF2YXJ0eSA8cGJhZGFyaUB1cy5pYm0uY29tPgorRGVzY3JpcHRpb246CisJCVRoZSBmaWxlIC9zeXMvZGV2aWNlcy9zeXN0ZW0vbWVtb3J5L21lbW9yeVgvcGh5c19pbmRleAorCQlpcyByZWFkLW9ubHkgYW5kIGNvbnRhaW5zIHRoZSBzZWN0aW9uIElEIGluIGhleGFkZWNpbWFsCisJCXdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gZGVjaW1hbCBYIGNvbnRhaW5lZCBpbiB0aGUKKwkJbWVtb3J5IHNlY3Rpb24gZGlyZWN0b3J5IG5hbWUuCisKK1doYXQ6CQkvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS9tZW1vcnlYL3N0YXRlCitEYXRlOgkJU2VwdGVtYmVyIDIwMDgKK0NvbnRhY3Q6CUJhZGFyaSBQdWxhdmFydHkgPHBiYWRhcmlAdXMuaWJtLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlUaGUgZmlsZSAvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS9tZW1vcnlYL3N0YXRlCisJCWlzIHJlYWQtd3JpdGUuICBXaGVuIHJlYWQsIGl0J3MgY29udGVudHMgc2hvdyB0aGUKKwkJb25saW5lL29mZmxpbmUgc3RhdGUgb2YgdGhlIG1lbW9yeSBzZWN0aW9uLiAgV2hlbiB3cml0dGVuLAorCQlyb290IGNhbiB0b2dnbGUgdGhlIHRoZSBvbmxpbmUvb2ZmbGluZSBzdGF0ZSBvZiBhIHJlbW92YWJsZQorCQltZW1vcnkgc2VjdGlvbiAoc2VlIHJlbW92YWJsZSBmaWxlIGRlc2NyaXB0aW9uIGFib3ZlKQorCQl1c2luZyB0aGUgZm9sbG93aW5nIGNvbW1hbmRzLgorCQkjIGVjaG8gb25saW5lID4gL3N5cy9kZXZpY2VzL3N5c3RlbS9tZW1vcnkvbWVtb3J5WC9zdGF0ZQorCQkjIGVjaG8gb2ZmbGluZSA+IC9zeXMvZGV2aWNlcy9zeXN0ZW0vbWVtb3J5L21lbW9yeVgvc3RhdGUKKworCQlGb3IgZXhhbXBsZSwgaWYgL3N5cy9kZXZpY2VzL3N5c3RlbS9tZW1vcnkvbWVtb3J5MjIvcmVtb3ZhYmxlCisJCWNvbnRhaW5zIGEgdmFsdWUgb2YgMSBhbmQKKwkJL3N5cy9kZXZpY2VzL3N5c3RlbS9tZW1vcnkvbWVtb3J5MjIvc3RhdGUgY29udGFpbnMgdGhlCisJCXN0cmluZyAib25saW5lIiB0aGUgZm9sbG93aW5nIGNvbW1hbmQgY2FuIGJlIGV4ZWN1dGVkIGJ5CisJCWJ5IHJvb3QgdG8gb2ZmbGluZSB0aGF0IHNlY3Rpb24uCisJCSMgZWNobyBvZmZsaW5lID4gL3N5cy9kZXZpY2VzL3N5c3RlbS9tZW1vcnkvbWVtb3J5MjIvc3RhdGUKK1VzZXJzOgkJaG90cGx1ZyBtZW1vcnkgcmVtb3ZlIHRvb2xzCisJCWh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL3Byb2plY3RzL3Bvd2VycGMtdXRpbHMvCisKK1doYXQ6CQkvc3lzL2RldmljZXMvc3lzdGVtL25vZGUvbm9kZVgvbWVtb3J5WQorRGF0ZToJCVNlcHRlbWJlciAyMDA4CitDb250YWN0OglHYXJ5IEhhZGUgPGdhcnloYWRlQHVzLmlibS5jb20+CitEZXNjcmlwdGlvbjoKKwkJV2hlbiBDT05GSUdfTlVNQSBpcyBlbmFibGVkCisJCS9zeXMvZGV2aWNlcy9zeXN0ZW0vbm9kZS9ub2RlWC9tZW1vcnlZIGlzIGEgc3ltYm9saWMgbGluayB0aGF0CisJCXBvaW50cyB0byB0aGUgY29ycmVzcG9uZGluZyAvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS9tZW1vcnlZCisJCW1lbW9yeSBzZWN0aW9uIGRpcmVjdG9yeS4gIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHN5bWJvbGljCisJCWxpbmsgaXMgY3JlYXRlZCBmb3IgbWVtb3J5IHNlY3Rpb24gOSBvbiBub2RlMC4KKwkJL3N5cy9kZXZpY2VzL3N5c3RlbS9ub2RlL25vZGUwL21lbW9yeTkgLT4gLi4vLi4vbWVtb3J5L21lbW9yeTkKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ETUEtbWFwcGluZy50eHQgYi9Eb2N1bWVudGF0aW9uL0RNQS1tYXBwaW5nLnR4dAppbmRleCBjNzRmZWM4Li5iMmE0ZDZkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RNQS1tYXBwaW5nLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL0RNQS1tYXBwaW5nLnR4dApAQCAtMjYsNyArMjYsNyBAQAogdHJhbnNmZXIuCiAKIFRoZSBmb2xsb3dpbmcgQVBJIHdpbGwgd29yayBvZiBjb3Vyc2UgZXZlbiBvbiBwbGF0Zm9ybXMgd2hlcmUgbm8gc3VjaAotaGFyZHdhcmUgZXhpc3RzLCBzZWUgZS5nLiBpbmNsdWRlL2FzbS1pMzg2L3BjaS5oIGZvciBob3cgaXQgaXMgaW1wbGVtZW50ZWQgb24KK2hhcmR3YXJlIGV4aXN0cywgc2VlIGUuZy4gYXJjaC94ODYvaW5jbHVkZS9hc20vcGNpLmggZm9yIGhvdyBpdCBpcyBpbXBsZW1lbnRlZCBvbgogdG9wIG9mIHRoZSB2aXJ0X3RvX2J1cyBpbnRlcmZhY2UuCiAKIEZpcnN0IG9mIGFsbCwgeW91IHNob3VsZCBtYWtlIHN1cmUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9NYWtlZmlsZSBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9NYWtlZmlsZQppbmRleCAwYTA4MTI2Li5kYzMxNTRlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svTWFrZWZpbGUKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL01ha2VmaWxlCkBAIC0xMiw3ICsxMiw3IEBACiAJICAgIGtlcm5lbC1hcGkueG1sIGZpbGVzeXN0ZW1zLnhtbCBsc20ueG1sIHVzYi54bWwga2dkYi54bWwgXAogCSAgICBnYWRnZXQueG1sIGxpYmF0YS54bWwgbXRkbmFuZC54bWwgbGlicnMueG1sIHJhcGlkaW8ueG1sIFwKIAkgICAgZ2VuZXJpY2lycS54bWwgczM5MC1kcml2ZXJzLnhtbCB1aW8taG93dG8ueG1sIHNjc2kueG1sIFwKLQkgICAgbWFjODAyMTEueG1sIGRlYnVnb2JqZWN0cy54bWwgc2gueG1sCisJICAgIG1hYzgwMjExLnhtbCBkZWJ1Z29iamVjdHMueG1sIHNoLnhtbCByZWd1bGF0b3IueG1sCiAKICMjIwogIyBUaGUgYnVpbGQgcHJvY2VzcyBpcyBhcyBmb2xsb3dzICh0YXJnZXRzKToKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9uZXR3b3JraW5nLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbmV0d29ya2luZy50bXBsCmluZGV4IDYyNzcwN2EuLjU5YWQ2OWEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9uZXR3b3JraW5nLnRtcGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL25ldHdvcmtpbmcudG1wbApAQCAtNzQsNiArNzQsMTQgQEAKICFFbmV0L3N1bnJwYy9ycGNiX2NsbnQuYwogIUVuZXQvc3VucnBjL2NsbnQuYwogICAgICA8L3NlY3QxPgorICAgICA8c2VjdDE+PHRpdGxlPldpTUFYPC90aXRsZT4KKyFFbmV0L3dpbWF4L29wLW1zZy5jCishRW5ldC93aW1heC9vcC1yZXNldC5jCishRW5ldC93aW1heC9vcC1yZmtpbGwuYworIUVuZXQvd2ltYXgvc3RhY2suYworIUlpbmNsdWRlL25ldC93aW1heC5oCishSWluY2x1ZGUvbGludXgvd2ltYXguaAorICAgICA8L3NlY3QxPgogICA8L2NoYXB0ZXI+CiAKICAgPGNoYXB0ZXIgaWQ9Im5ldGRldiI+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svcmVndWxhdG9yLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svcmVndWxhdG9yLnRtcGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNmNGY4ZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9yZWd1bGF0b3IudG1wbApAQCAtMCwwICsxLDMwNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBib29rIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBEb2NCb29rIFhNTCBWNC4xLjIvL0VOIgorCSJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuMS4yL2RvY2Jvb2t4LmR0ZCIgW10+CisKKzxib29rIGlkPSJyZWd1bGF0b3ItYXBpIj4KKyA8Ym9va2luZm8+CisgIDx0aXRsZT5Wb2x0YWdlIGFuZCBjdXJyZW50IHJlZ3VsYXRvciBBUEk8L3RpdGxlPgorCisgIDxhdXRob3Jncm91cD4KKyAgIDxhdXRob3I+CisgICAgPGZpcnN0bmFtZT5MaWFtPC9maXJzdG5hbWU+CisgICAgPHN1cm5hbWU+R2lyZHdvb2Q8L3N1cm5hbWU+CisgICAgPGFmZmlsaWF0aW9uPgorICAgICA8YWRkcmVzcz4KKyAgICAgIDxlbWFpbD5scmdAc2xpbWxvZ2ljLmNvLnVrPC9lbWFpbD4KKyAgICAgPC9hZGRyZXNzPgorICAgIDwvYWZmaWxpYXRpb24+CisgICA8L2F1dGhvcj4KKyAgIDxhdXRob3I+CisgICAgPGZpcnN0bmFtZT5NYXJrPC9maXJzdG5hbWU+CisgICAgPHN1cm5hbWU+QnJvd248L3N1cm5hbWU+CisgICAgPGFmZmlsaWF0aW9uPgorICAgICA8b3JnbmFtZT5Xb2xmc29uIE1pY3JvZWxlY3Ryb25pY3M8L29yZ25hbWU+CisgICAgIDxhZGRyZXNzPgorICAgICAgPGVtYWlsPmJyb29uaWVAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tPC9lbWFpbD4KKyAgICAgPC9hZGRyZXNzPgorICAgIDwvYWZmaWxpYXRpb24+CisgICA8L2F1dGhvcj4KKyAgPC9hdXRob3Jncm91cD4KKworICA8Y29weXJpZ2h0PgorICAgPHllYXI+MjAwNy0yMDA4PC95ZWFyPgorICAgPGhvbGRlcj5Xb2xmc29uIE1pY3JvZWxlY3Ryb25pY3M8L2hvbGRlcj4KKyAgPC9jb3B5cmlnaHQ+CisgIDxjb3B5cmlnaHQ+CisgICA8eWVhcj4yMDA4PC95ZWFyPgorICAgPGhvbGRlcj5MaWFtIEdpcmR3b29kPC9ob2xkZXI+CisgIDwvY29weXJpZ2h0PgorCisgIDxsZWdhbG5vdGljZT4KKyAgIDxwYXJhPgorICAgICBUaGlzIGRvY3VtZW50YXRpb24gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKKyAgICAgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICAgICBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAgIDwvcGFyYT4KKworICAgPHBhcmE+CisgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAgICAgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAorICAgICB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgICAgIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAgIDwvcGFyYT4KKworICAgPHBhcmE+CisgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgICAgIE1BIDAyMTExLTEzMDcgVVNBCisgICA8L3BhcmE+CisKKyAgIDxwYXJhPgorICAgICBGb3IgbW9yZSBkZXRhaWxzIHNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBzb3VyY2UKKyAgICAgZGlzdHJpYnV0aW9uIG9mIExpbnV4LgorICAgPC9wYXJhPgorICA8L2xlZ2Fsbm90aWNlPgorIDwvYm9va2luZm8+CisKKzx0b2M+PC90b2M+CisKKyAgPGNoYXB0ZXIgaWQ9ImludHJvIj4KKyAgICA8dGl0bGU+SW50cm9kdWN0aW9uPC90aXRsZT4KKyAgICA8cGFyYT4KKwlUaGlzIGZyYW1ld29yayBpcyBkZXNpZ25lZCB0byBwcm92aWRlIGEgc3RhbmRhcmQga2VybmVsCisJaW50ZXJmYWNlIHRvIGNvbnRyb2wgdm9sdGFnZSBhbmQgY3VycmVudCByZWd1bGF0b3JzLgorICAgIDwvcGFyYT4KKyAgICA8cGFyYT4KKwlUaGUgaW50ZW50aW9uIGlzIHRvIGFsbG93IHN5c3RlbXMgdG8gZHluYW1pY2FsbHkgY29udHJvbAorCXJlZ3VsYXRvciBwb3dlciBvdXRwdXQgaW4gb3JkZXIgdG8gc2F2ZSBwb3dlciBhbmQgcHJvbG9uZworCWJhdHRlcnkgbGlmZS4gIFRoaXMgYXBwbGllcyB0byBib3RoIHZvbHRhZ2UgcmVndWxhdG9ycyAod2hlcmUKKwl2b2x0YWdlIG91dHB1dCBpcyBjb250cm9sbGFibGUpIGFuZCBjdXJyZW50IHNpbmtzICh3aGVyZSBjdXJyZW50CisJbGltaXQgaXMgY29udHJvbGxhYmxlKS4KKyAgICA8L3BhcmE+CisgICAgPHBhcmE+CisJTm90ZSB0aGF0IGFkZGl0aW9uYWwgKGFuZCBjdXJyZW50bHkgbW9yZSBjb21wbGV0ZSkgZG9jdW1lbnRhdGlvbgorCWlzIGF2YWlsYWJsZSBpbiB0aGUgTGludXgga2VybmVsIHNvdXJjZSB1bmRlcgorCTxmaWxlbmFtZT5Eb2N1bWVudGF0aW9uL3Bvd2VyL3JlZ3VsYXRvcjwvZmlsZW5hbWU+LgorICAgIDwvcGFyYT4KKworICAgIDxzZWN0MSBpZD0iZ2xvc3NhcnkiPgorICAgICAgIDx0aXRsZT5HbG9zc2FyeTwvdGl0bGU+CisgICAgICAgPHBhcmE+CisJVGhlIHJlZ3VsYXRvciBBUEkgdXNlcyBhIG51bWJlciBvZiB0ZXJtcyB3aGljaCBtYXkgbm90IGJlCisJZmFtaWxpYXI6CisgICAgICAgPC9wYXJhPgorICAgICAgIDxnbG9zc2FyeT4KKworICAgICAgICAgPGdsb3NzZW50cnk+CisJICAgPGdsb3NzdGVybT5SZWd1bGF0b3I8L2dsb3NzdGVybT4KKwkgICA8Z2xvc3NkZWY+CisJICAgICA8cGFyYT4KKwlFbGVjdHJvbmljIGRldmljZSB0aGF0IHN1cHBsaWVzIHBvd2VyIHRvIG90aGVyIGRldmljZXMuICBNb3N0CisJcmVndWxhdG9ycyBjYW4gZW5hYmxlIGFuZCBkaXNhYmxlIHRoZWlyIG91dHB1dCBhbmQgc29tZSBjYW4gYWxzbworCWNvbnRyb2wgdGhlaXIgb3V0cHV0IHZvbHRhZ2Ugb3IgY3VycmVudC4KKwkgICAgIDwvcGFyYT4KKwkgICA8L2dsb3NzZGVmPgorICAgICAgICAgPC9nbG9zc2VudHJ5PgorCisJIDxnbG9zc2VudHJ5PgorCSAgIDxnbG9zc3Rlcm0+Q29uc3VtZXI8L2dsb3NzdGVybT4KKwkgICA8Z2xvc3NkZWY+CisJICAgICA8cGFyYT4KKwlFbGVjdHJvbmljIGRldmljZSB3aGljaCBjb25zdW1lcyBwb3dlciBwcm92aWRlZCBieSBhIHJlZ3VsYXRvci4KKwlUaGVzZSBtYXkgZWl0aGVyIGJlIHN0YXRpYywgcmVxdWlyaW5nIG9ubHkgYSBmaXhlZCBzdXBwbHksIG9yCisJZHluYW1pYywgcmVxdWlyaW5nIGFjdGl2ZSBtYW5hZ2VtZW50IG9mIHRoZSByZWd1bGF0b3IgYXQKKwlydW50aW1lLgorCSAgICAgPC9wYXJhPgorCSAgIDwvZ2xvc3NkZWY+CisJIDwvZ2xvc3NlbnRyeT4KKworCSA8Z2xvc3NlbnRyeT4KKwkgICA8Z2xvc3N0ZXJtPlBvd2VyIERvbWFpbjwvZ2xvc3N0ZXJtPgorCSAgIDxnbG9zc2RlZj4KKwkgICAgIDxwYXJhPgorCVRoZSBlbGVjdHJvbmljIGNpcmN1aXQgc3VwcGxpZWQgYnkgYSBnaXZlbiByZWd1bGF0b3IsIGluY2x1ZGluZworCXRoZSByZWd1bGF0b3IgYW5kIGFsbCBjb25zdW1lciBkZXZpY2VzLiAgVGhlIGNvbmZpZ3VyYXRpb24gb2YKKwl0aGUgcmVndWxhdG9yIGlzIHNoYXJlZCBiZXR3ZWVuIGFsbCB0aGUgY29tcG9uZW50cyBpbiB0aGUKKwljaXJjdWl0LgorCSAgICAgPC9wYXJhPgorCSAgIDwvZ2xvc3NkZWY+CisJIDwvZ2xvc3NlbnRyeT4KKworCSA8Z2xvc3NlbnRyeT4KKwkgICA8Z2xvc3N0ZXJtPlBvd2VyIE1hbmFnZW1lbnQgSW50ZWdyYXRlZCBDaXJjdWl0PC9nbG9zc3Rlcm0+CisJICAgPGFjcm9ueW0+UE1JQzwvYWNyb255bT4KKwkgICA8Z2xvc3NkZWY+CisJICAgICA8cGFyYT4KKwlBbiBJQyB3aGljaCBjb250YWlucyBudW1lcm91cyByZWd1bGF0b3JzIGFuZCBvZnRlbiBhbHNvIG90aGVyCisJc3Vic3lzdGVtcy4gIEluIGFuIGVtYmVkZGVkIHN5c3RlbSB0aGUgcHJpbWFyeSBQTUlDIGlzIG9mdGVuCisJZXF1aXZhbGVudCB0byBhIGNvbWJpbmF0aW9uIG9mIHRoZSBQU1UgYW5kIHNvdXRoYnJpZGdlIGluIGEKKwlkZXNrdG9wIHN5c3RlbS4KKwkgICAgIDwvcGFyYT4KKwkgICA8L2dsb3NzZGVmPgorCSA8L2dsb3NzZW50cnk+CisJPC9nbG9zc2FyeT4KKyAgICAgPC9zZWN0MT4KKyAgPC9jaGFwdGVyPgorCisgIDxjaGFwdGVyIGlkPSJjb25zdW1lciI+CisgICAgIDx0aXRsZT5Db25zdW1lciBkcml2ZXIgaW50ZXJmYWNlPC90aXRsZT4KKyAgICAgPHBhcmE+CisgICAgICAgVGhpcyBvZmZlcnMgYSBzaW1pbGFyIEFQSSB0byB0aGUga2VybmVsIGNsb2NrIGZyYW1ld29yay4KKyAgICAgICBDb25zdW1lciBkcml2ZXJzIHVzZSA8bGluaworICAgICAgIGxpbmtlbmQ9J0FQSS1yZWd1bGF0b3ItZ2V0Jz5nZXQ8L2xpbms+IGFuZCA8bGluaworICAgICAgIGxpbmtlbmQ9J0FQSS1yZWd1bGF0b3ItcHV0Jz5wdXQ8L2xpbms+IG9wZXJhdGlvbnMgdG8gYWNxdWlyZSBhbmQKKyAgICAgICByZWxlYXNlIHJlZ3VsYXRvcnMuICBGdW5jdGlvbnMgYXJlCisgICAgICAgcHJvdmlkZWQgdG8gPGxpbmsgbGlua2VuZD0nQVBJLXJlZ3VsYXRvci1lbmFibGUnPmVuYWJsZTwvbGluaz4KKyAgICAgICBhbmQgPGxpbmsgbGlua2VuZD0nQVBJLXJlZ3VsYXRvci1kaXNhYmxlJz5kaXNhYmxlPC9saW5rPiB0aGUKKyAgICAgICByZWd1YXRvciBhbmQgdG8gZ2V0IGFuZCBzZXQgdGhlIHJ1bnRpbWUgcGFyYW1ldGVycyBvZiB0aGUKKyAgICAgICByZWd1bGF0b3IuCisgICAgIDwvcGFyYT4KKyAgICAgPHBhcmE+CisgICAgICAgV2hlbiByZXF1ZXN0aW5nIHJlZ3VsYXRvcnMgY29uc3VtZXJzIHVzZSBzeW1ib2xpYyBuYW1lcyBmb3IgdGhlaXIKKyAgICAgICBzdXBwbGllcywgc3VjaCBhcyAiVmNjIiwgd2hpY2ggYXJlIG1hcHBlZCBpbnRvIGFjdHVhbCByZWd1bGF0b3IKKyAgICAgICBkZXZpY2VzIGJ5IHRoZSBtYWNoaW5lIGludGVyZmFjZS4KKyAgICAgPC9wYXJhPgorICAgICA8cGFyYT4KKwlBIHN0dWIgdmVyc2lvbiBvZiB0aGlzIEFQSSBpcyBwcm92aWRlZCB3aGVuIHRoZSByZWd1bGF0b3IKKwlmcmFtZXdvcmsgaXMgbm90IGluIHVzZSBpbiBvcmRlciB0byBtaW5pbWlzZSB0aGUgbmVlZCB0byB1c2UKKwlpZmRlZnMuCisgICAgIDwvcGFyYT4KKworICAgICA8c2VjdDEgaWQ9ImNvbnN1bWVyLWVuYWJsZSI+CisgICAgICAgPHRpdGxlPkVuYWJsaW5nIGFuZCBkaXNhYmxpbmc8L3RpdGxlPgorICAgICAgIDxwYXJhPgorICAgICAgICAgVGhlIHJlZ3VsYXRvciBBUEkgcHJvdmlkZXMgcmVmZXJlbmNlIGNvdW50ZWQgZW5hYmxpbmcgYW5kCisJIGRpc2FibGluZyBvZiByZWd1bGF0b3JzLiBDb25zdW1lciBkZXZpY2VzIHVzZSB0aGUgPGZ1bmN0aW9uPjxsaW5rCisJIGxpbmtlbmQ9J0FQSS1yZWd1bGF0b3ItZW5hYmxlJz5yZWd1bGF0b3JfZW5hYmxlPC9saW5rPjwvZnVuY3Rpb24+CisJIGFuZCA8ZnVuY3Rpb24+PGxpbmsKKwkgbGlua2VuZD0nQVBJLXJlZ3VsYXRvci1kaXNhYmxlJz5yZWd1bGF0b3JfZGlzYWJsZTwvbGluaz4KKwkgPC9mdW5jdGlvbj4gZnVuY3Rpb25zIHRvIGVuYWJsZSBhbmQgZGlzYWJsZSByZWd1bGF0b3JzLiAgQ2FsbHMKKwkgdG8gdGhlIHR3byBmdW5jdGlvbnMgbXVzdCBiZSBiYWxhbmNlZC4KKyAgICAgICA8L3BhcmE+CisgICAgICAgPHBhcmE+CisgICAgICAgICBOb3RlIHRoYXQgc2luY2UgbXVsdGlwbGUgY29uc3VtZXJzIG1heSBiZSB1c2luZyBhIHJlZ3VsYXRvciBhbmQKKwkgbWFjaGluZSBjb25zdHJhaW50cyBtYXkgbm90IGFsbG93IHRoZSByZWd1bGF0b3IgdG8gYmUgZGlzYWJsZWQKKwkgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgY2FsbGluZworCSA8ZnVuY3Rpb24+cmVndWxhdG9yX2Rpc2FibGU8L2Z1bmN0aW9uPiB3aWxsIGFjdHVhbGx5IGNhdXNlIHRoZQorCSBzdXBwbHkgcHJvdmlkZWQgYnkgdGhlIHJlZ3VsYXRvciB0byBiZSBkaXNhYmxlZC4gQ29uc3VtZXIKKwkgZHJpdmVycyBzaG91bGQgYXNzdW1lIHRoYXQgdGhlIHJlZ3VsYXRvciBtYXkgYmUgZW5hYmxlZCBhdCBhbGwKKwkgdGltZXMuCisgICAgICAgPC9wYXJhPgorICAgICA8L3NlY3QxPgorCisgICAgIDxzZWN0MSBpZD0iY29uc3VtZXItY29uZmlnIj4KKyAgICAgICA8dGl0bGU+Q29uZmlndXJhdGlvbjwvdGl0bGU+CisgICAgICAgPHBhcmE+CisgICAgICAgICBTb21lIGNvbnN1bWVyIGRldmljZXMgbWF5IG5lZWQgdG8gYmUgYWJsZSB0byBkeW5hbWljYWxseQorCSBjb25maWd1cmUgdGhlaXIgc3VwcGxpZXMuICBGb3IgZXhhbXBsZSwgTU1DIGRyaXZlcnMgbWF5IG5lZWQgdG8KKwkgc2VsZWN0IHRoZSBjb3JyZWN0IG9wZXJhdGluZyB2b2x0YWdlIGZvciB0aGVpciBjYXJkcy4gIFRoaXMgbWF5CisJIGJlIGRvbmUgd2hpbGUgdGhlIHJlZ3VsYXRvciBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorICAgICAgIDwvcGFyYT4KKyAgICAgICA8cGFyYT4KKwkgVGhlIDxmdW5jdGlvbj48bGluaworCSBsaW5rZW5kPSdBUEktcmVndWxhdG9yLXNldC12b2x0YWdlJz5yZWd1bGF0b3Jfc2V0X3ZvbHRhZ2U8L2xpbms+CisJIDwvZnVuY3Rpb24+IGFuZCA8ZnVuY3Rpb24+PGxpbmsKKwkgbGlua2VuZD0nQVBJLXJlZ3VsYXRvci1zZXQtY3VycmVudC1saW1pdCcKKwkgPnJlZ3VsYXRvcl9zZXRfY3VycmVudF9saW1pdDwvbGluaz4KKwkgPC9mdW5jdGlvbj4gZnVuY3Rpb25zIHByb3ZpZGUgdGhlIHByaW1hcnkgaW50ZXJmYWNlIGZvciB0aGlzLgorCSBCb3RoIHRha2UgcmFuZ2VzIG9mIHZvbHRhZ2VzIGFuZCBjdXJyZW50cywgc3VwcG9ydGluZyBkcml2ZXJzCisJIHRoYXQgZG8gbm90IHJlcXVpcmUgYSBzcGVjaWZpYyB2YWx1ZSAoZWcsIENQVSBmcmVxdWVuY3kgc2NhbGluZworCSBub3JtYWxseSBwZXJtaXRzIHRoZSBDUFUgdG8gdXNlIGEgd2lkZXIgcmFuZ2Ugb2Ygc3VwcGx5CisJIHZvbHRhZ2VzIGF0IGxvd2VyIGZyZXF1ZW5jaWVzIGJ1dCBkb2VzIG5vdCByZXF1aXJlIHRoYXQgdGhlCisJIHN1cHBseSB2b2x0YWdlIGJlIGxvd2VyZWQpLiAgV2hlcmUgYW4gZXhhY3QgdmFsdWUgaXMgcmVxdWlyZWQKKwkgYm90aCBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBzaG91bGQgYmUgaWRlbnRpY2FsLgorICAgICAgIDwvcGFyYT4KKyAgICAgPC9zZWN0MT4KKworICAgICA8c2VjdDEgaWQ9ImNvbnN1bWVyLWNhbGxiYWNrIj4KKyAgICAgICA8dGl0bGU+Q2FsbGJhY2tzPC90aXRsZT4KKyAgICAgICA8cGFyYT4KKwkgIENhbGxiYWNrcyBtYXkgYWxzbyBiZSA8bGluaworCSAgbGlua2VuZD0nQVBJLXJlZ3VsYXRvci1yZWdpc3Rlci1ub3RpZmllcic+cmVnaXN0ZXJlZDwvbGluaz4KKwkgIGZvciBldmVudHMgc3VjaCBhcyByZWd1bGF0aW9uIGZhaWx1cmVzLgorICAgICAgIDwvcGFyYT4KKyAgICAgPC9zZWN0MT4KKyAgIDwvY2hhcHRlcj4KKworICAgPGNoYXB0ZXIgaWQ9ImRyaXZlciI+CisgICAgIDx0aXRsZT5SZWd1bGF0b3IgZHJpdmVyIGludGVyZmFjZTwvdGl0bGU+CisgICAgIDxwYXJhPgorICAgICAgIERyaXZlcnMgZm9yIHJlZ3VsYXRvciBjaGlwcyA8bGluaworICAgICAgIGxpbmtlbmQ9J0FQSS1yZWd1bGF0b3ItcmVnaXN0ZXInPnJlZ2lzdGVyPC9saW5rPiB0aGUgcmVndWxhdG9ycworICAgICAgIHdpdGggdGhlIHJlZ3VsYXRvciBjb3JlLCBwcm92aWRpbmcgb3BlcmF0aW9ucyBzdHJ1Y3R1cmVzIHRvIHRoZQorICAgICAgIGNvcmUuICBBIDxsaW5rCisgICAgICAgbGlua2VuZD0nQVBJLXJlZ3VsYXRvci1ub3RpZmllci1jYWxsLWNoYWluJz5ub3RpZmllcjwvbGluaz4gaW50ZXJmYWNlCisgICAgICAgYWxsb3dzIGVycm9yIGNvbmRpdGlvbnMgdG8gYmUgcmVwb3J0ZWQgdG8gdGhlIGNvcmUuCisgICAgIDwvcGFyYT4KKyAgICAgPHBhcmE+CisgICAgICAgUmVnaXN0cmF0aW9uIHNob3VsZCBiZSB0cmlnZ2VyZWQgYnkgZXhwbGljaXQgc2V0dXAgZG9uZSBieSB0aGUKKyAgICAgICBwbGF0Zm9ybSwgc3VwcGx5aW5nIGEgPGxpbmsKKyAgICAgICBsaW5rZW5kPSdBUEktc3RydWN0LXJlZ3VsYXRvci1pbml0LWRhdGEnPnN0cnVjdAorICAgICAgIHJlZ3VsYXRvcl9pbml0X2RhdGE8L2xpbms+IGZvciB0aGUgcmVndWxhdG9yIGNvbnRhaW5pbmcKKyAgICAgICA8bGluayBsaW5rZW5kPSdtYWNoaW5lLWNvbnN0cmFpbnQnPmNvbnN0cmFpbnQ8L2xpbms+IGFuZAorICAgICAgIDxsaW5rIGxpbmtlbmQ9J21hY2hpbmUtc3VwcGx5Jz5zdXBwbHk8L2xpbms+IGluZm9ybWF0aW9uLgorICAgICA8L3BhcmE+CisgICA8L2NoYXB0ZXI+CisKKyAgIDxjaGFwdGVyIGlkPSJtYWNoaW5lIj4KKyAgICAgPHRpdGxlPk1hY2hpbmUgaW50ZXJmYWNlPC90aXRsZT4KKyAgICAgPHBhcmE+CisgICAgICAgVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgYSB3YXkgdG8gZGVmaW5lIGhvdyByZWd1bGF0b3JzIGFyZQorICAgICAgIGNvbm5lY3RlZCB0byBjb25zdW1lcnMgb24gYSBnaXZlbiBzeXN0ZW0gYW5kIHdoYXQgdGhlIHZhbGlkCisgICAgICAgb3BlcmF0aW5nIHBhcmFtZXRlcnMgYXJlIGZvciB0aGUgc3lzdGVtLgorICAgICA8L3BhcmE+CisKKyAgICAgPHNlY3QxIGlkPSJtYWNoaW5lLXN1cHBseSI+CisgICAgICAgPHRpdGxlPlN1cHBsaWVzPC90aXRsZT4KKyAgICAgICA8cGFyYT4KKyAgICAgICAgIFJlZ3VsYXRvciBzdXBwbGllcyBhcmUgc3BlY2lmaWVkIHVzaW5nIDxsaW5rCisJIGxpbmtlbmQ9J0FQSS1zdHJ1Y3QtcmVndWxhdG9yLWNvbnN1bWVyLXN1cHBseSc+c3RydWN0CisJIHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHk8L2xpbms+LiAgVGhpcyBpcyBkb25lIGF0CisJIDxsaW5rIGxpbmtlbmQ9J2RyaXZlcic+ZHJpdmVyIHJlZ2lzdHJhdGlvbgorCSB0aW1lPC9saW5rPiBhcyBwYXJ0IG9mIHRoZSBtYWNoaW5lIGNvbnN0cmFpbnRzLgorICAgICAgIDwvcGFyYT4KKyAgICAgPC9zZWN0MT4KKworICAgICA8c2VjdDEgaWQ9Im1hY2hpbmUtY29uc3RyYWludCI+CisgICAgICAgPHRpdGxlPkNvbnN0cmFpbnRzPC90aXRsZT4KKyAgICAgICA8cGFyYT4KKwkgQXMgd2VsbCBhcyBkZWZpbmluaW5nIHRoZSBjb25uZWN0aW9ucyB0aGUgbWFjaGluZSBpbnRlcmZhY2UKKwkgYWxzbyBwcm92aWRlcyBjb25zdHJhaW50cyBkZWZpbmluaW5nIHRoZSBvcGVyYXRpb25zIHRoYXQKKwkgY2xpZW50cyBhcmUgYWxsb3dlZCB0byBwZXJmb3JtIGFuZCB0aGUgcGFyYW1ldGVycyB0aGF0IG1heSBiZQorCSBzZXQuICBUaGlzIGlzIHJlcXVpcmVkIHNpbmNlIGdlbmVyYWxseSByZWd1bGF0b3IgZGV2aWNlcyB3aWxsCisJIG9mZmVyIG1vcmUgZmxleGliaWxpdHkgdGhhbiBpdCBpcyBzYWZlIHRvIHVzZSBvbiBhIGdpdmVuCisJIHN5c3RlbSwgZm9yIGV4YW1wbGUgc3VwcG9ydGluZyBoaWdoZXIgc3VwcGx5IHZvbHRhZ2VzIHRoYW4gdGhlCisJIGNvbnN1bWVycyBhcmUgcmF0ZWQgZm9yLgorICAgICAgIDwvcGFyYT4KKyAgICAgICA8cGFyYT4KKwkgVGhpcyBpcyBkb25lIGF0IDxsaW5rIGxpbmtlbmQ9J2RyaXZlcic+ZHJpdmVyCisJIHJlZ2lzdHJhdGlvbiB0aW1lPC9saW5rPiBieSBwcm92aWRpbmcgYSA8bGluaworCSBsaW5rZW5kPSdBUEktc3RydWN0LXJlZ3VsYXRpb24tY29uc3RyYWludHMnPnN0cnVjdAorCSByZWd1bGF0aW9uX2NvbnN0cmFpbnRzPC9saW5rPi4KKyAgICAgICA8L3BhcmE+CisgICAgICAgPHBhcmE+CisgICAgICAgICBUaGUgY29uc3RyYWludHMgbWF5IGFsc28gc3BlY2lmeSBhbiBpbml0aWFsIGNvbmZpZ3VyYXRpb24gZm9yIHRoZQorICAgICAgICAgcmVndWxhdG9yIGluIHRoZSBjb25zdHJhaW50cywgd2hpY2ggaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IKKyAgICAgICAgIHVzZSB3aXRoIHN0YXRpYyBjb25zdW1lcnMuCisgICAgICAgPC9wYXJhPgorICAgICA8L3NlY3QxPgorICA8L2NoYXB0ZXI+CisKKyAgPGNoYXB0ZXIgaWQ9ImFwaSI+CisgICAgPHRpdGxlPkFQSSByZWZlcmVuY2U8L3RpdGxlPgorICAgIDxwYXJhPgorICAgICAgRHVlIHRvIGxpbWl0YXRpb25zIG9mIHRoZSBrZXJuZWwgZG9jdW1lbnRhdGlvbiBmcmFtZXdvcmsgYW5kIHRoZQorICAgICAgZXhpc3RpbmcgbGF5b3V0IG9mIHRoZSBzb3VyY2UgY29kZSB0aGUgZW50aXJlIHJlZ3VsYXRvciBBUEkgaXMKKyAgICAgIGRvY3VtZW50ZWQgaGVyZS4KKyAgICA8L3BhcmE+CishSWluY2x1ZGUvbGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmgKKyFJaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvbWFjaGluZS5oCishSWluY2x1ZGUvbGludXgvcmVndWxhdG9yL2RyaXZlci5oCishRWRyaXZlcnMvcmVndWxhdG9yL2NvcmUuYworICA8L2NoYXB0ZXI+Cis8L2Jvb2s+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdWlvLWhvd3RvLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdWlvLWhvd3RvLnRtcGwKaW5kZXggZGY4N2QxYi4uYjc4N2U0NyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Vpby1ob3d0by50bXBsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay91aW8taG93dG8udG1wbApAQCAtNDIsNiArNDIsMTIgQEAKIAogPHJldmhpc3Rvcnk+CiAJPHJldmlzaW9uPgorCTxyZXZudW1iZXI+MC42PC9yZXZudW1iZXI+CisJPGRhdGU+MjAwOC0xMi0wNTwvZGF0ZT4KKwk8YXV0aG9yaW5pdGlhbHM+aGprPC9hdXRob3Jpbml0aWFscz4KKwk8cmV2cmVtYXJrPkFkZGVkIGRlc2NyaXB0aW9uIG9mIHBvcnRpbyBzeXNmcyBhdHRyaWJ1dGVzLjwvcmV2cmVtYXJrPgorCTwvcmV2aXNpb24+CisJPHJldmlzaW9uPgogCTxyZXZudW1iZXI+MC41PC9yZXZudW1iZXI+CiAJPGRhdGU+MjAwOC0wNS0yMjwvZGF0ZT4KIAk8YXV0aG9yaW5pdGlhbHM+aGprPC9hdXRob3Jpbml0aWFscz4KQEAgLTMxOCw2ICszMjQsNTQgQEAKIG9mZnNldCA9IE4gKiBnZXRwYWdlc2l6ZSgpOwogPC9wcm9ncmFtbGlzdGluZz4KIAorPHBhcmE+CisJU29tZXRpbWVzIHRoZXJlIGlzIGhhcmR3YXJlIHdpdGggbWVtb3J5LWxpa2UgcmVnaW9ucyB0aGF0IGNhbiBub3QgYmUKKwltYXBwZWQgd2l0aCB0aGUgdGVjaG5pcXVlIGRlc2NyaWJlZCBoZXJlLCBidXQgdGhlcmUgYXJlIHN0aWxsIHdheXMgdG8KKwlhY2Nlc3MgdGhlbSBmcm9tIHVzZXJzcGFjZS4gVGhlIG1vc3QgY29tbW9uIGV4YW1wbGUgYXJlIHg4NiBpb3BvcnRzLgorCU9uIHg4NiBzeXN0ZW1zLCB1c2Vyc3BhY2UgY2FuIGFjY2VzcyB0aGVzZSBpb3BvcnRzIHVzaW5nCisJPGZ1bmN0aW9uPmlvcGVybSgpPC9mdW5jdGlvbj4sIDxmdW5jdGlvbj5pb3BsKCk8L2Z1bmN0aW9uPiwKKwk8ZnVuY3Rpb24+aW5iKCk8L2Z1bmN0aW9uPiwgPGZ1bmN0aW9uPm91dGIoKTwvZnVuY3Rpb24+LCBhbmQgc2ltaWxhcgorCWZ1bmN0aW9ucy4KKzwvcGFyYT4KKzxwYXJhPgorCVNpbmNlIHRoZXNlIGlvcG9ydCByZWdpb25zIGNhbiBub3QgYmUgbWFwcGVkLCB0aGV5IHdpbGwgbm90IGFwcGVhciB1bmRlcgorCTxmaWxlbmFtZT4vc3lzL2NsYXNzL3Vpby91aW9YL21hcHMvPC9maWxlbmFtZT4gbGlrZSB0aGUgbm9ybWFsIG1lbW9yeQorCWRlc2NyaWJlZCBhYm92ZS4gV2l0aG91dCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcG9ydCByZWdpb25zIGEgaGFyZHdhcmUKKwloYXMgdG8gb2ZmZXIsIGl0IGJlY29tZXMgZGlmZmljdWx0IGZvciB0aGUgdXNlcnNwYWNlIHBhcnQgb2YgdGhlCisJZHJpdmVyIHRvIGZpbmQgb3V0IHdoaWNoIHBvcnRzIGJlbG9uZyB0byB3aGljaCBVSU8gZGV2aWNlLgorPC9wYXJhPgorPHBhcmE+CisJVG8gYWRkcmVzcyB0aGlzIHNpdHVhdGlvbiwgdGhlIG5ldyBkaXJlY3RvcnkKKwk8ZmlsZW5hbWU+L3N5cy9jbGFzcy91aW8vdWlvWC9wb3J0aW8vPC9maWxlbmFtZT4gd2FzIGFkZGVkLiBJdCBvbmx5CisJZXhpc3RzIGlmIHRoZSBkcml2ZXIgd2FudHMgdG8gcGFzcyBpbmZvcm1hdGlvbiBhYm91dCBvbmUgb3IgbW9yZSBwb3J0CisJcmVnaW9ucyB0byB1c2Vyc3BhY2UuIElmIHRoYXQgaXMgdGhlIGNhc2UsIHN1YmRpcmVjdG9yaWVzIG5hbWVkCisJPGZpbGVuYW1lPnBvcnQwPC9maWxlbmFtZT4sIDxmaWxlbmFtZT5wb3J0MTwvZmlsZW5hbWU+LCBhbmQgc28gb24sCisJd2lsbCBhcHBlYXIgdW5kZXJuZWF0aAorCTxmaWxlbmFtZT4vc3lzL2NsYXNzL3Vpby91aW9YL3BvcnRpby88L2ZpbGVuYW1lPi4KKzwvcGFyYT4KKzxwYXJhPgorCUVhY2ggPGZpbGVuYW1lPnBvcnRYLzwvZmlsZW5hbWU+IGRpcmVjdG9yeSBjb250YWlucyB0aHJlZSByZWFkLW9ubHkKKwlmaWxlcyB0aGF0IHNob3cgc3RhcnQsIHNpemUsIGFuZCB0eXBlIG9mIHRoZSBwb3J0IHJlZ2lvbjoKKzwvcGFyYT4KKzxpdGVtaXplZGxpc3Q+Cis8bGlzdGl0ZW0+CisJPHBhcmE+CisJPGZpbGVuYW1lPnN0YXJ0PC9maWxlbmFtZT46IFRoZSBmaXJzdCBwb3J0IG9mIHRoaXMgcmVnaW9uLgorCTwvcGFyYT4KKzwvbGlzdGl0ZW0+Cis8bGlzdGl0ZW0+CisJPHBhcmE+CisJPGZpbGVuYW1lPnNpemU8L2ZpbGVuYW1lPjogVGhlIG51bWJlciBvZiBwb3J0cyBpbiB0aGlzIHJlZ2lvbi4KKwk8L3BhcmE+Cis8L2xpc3RpdGVtPgorPGxpc3RpdGVtPgorCTxwYXJhPgorCTxmaWxlbmFtZT5wb3J0dHlwZTwvZmlsZW5hbWU+OiBBIHN0cmluZyBkZXNjcmliaW5nIHRoZSB0eXBlIG9mIHBvcnQuCisJPC9wYXJhPgorPC9saXN0aXRlbT4KKzwvaXRlbWl6ZWRsaXN0PgorCisKIDwvc2VjdDE+CiA8L2NoYXB0ZXI+CiAKQEAgLTMzOSwxMiArMzkzLDEyIEBACiAKIDxpdGVtaXplZGxpc3Q+CiA8bGlzdGl0ZW0+PHBhcmE+Ci08dmFybmFtZT5jaGFyICpuYW1lPC92YXJuYW1lPjogUmVxdWlyZWQuIFRoZSBuYW1lIG9mIHlvdXIgZHJpdmVyIGFzCis8dmFybmFtZT5jb25zdCBjaGFyICpuYW1lPC92YXJuYW1lPjogUmVxdWlyZWQuIFRoZSBuYW1lIG9mIHlvdXIgZHJpdmVyIGFzCiBpdCB3aWxsIGFwcGVhciBpbiBzeXNmcy4gSSByZWNvbW1lbmQgdXNpbmcgdGhlIG5hbWUgb2YgeW91ciBtb2R1bGUgZm9yIHRoaXMuCiA8L3BhcmE+PC9saXN0aXRlbT4KIAogPGxpc3RpdGVtPjxwYXJhPgotPHZhcm5hbWU+Y2hhciAqdmVyc2lvbjwvdmFybmFtZT46IFJlcXVpcmVkLiBUaGlzIHN0cmluZyBhcHBlYXJzIGluCis8dmFybmFtZT5jb25zdCBjaGFyICp2ZXJzaW9uPC92YXJuYW1lPjogUmVxdWlyZWQuIFRoaXMgc3RyaW5nIGFwcGVhcnMgaW4KIDxmaWxlbmFtZT4vc3lzL2NsYXNzL3Vpby91aW9YL3ZlcnNpb248L2ZpbGVuYW1lPi4KIDwvcGFyYT48L2xpc3RpdGVtPgogCkBAIC0zNTYsNiArNDEwLDEzIEBACiA8L3BhcmE+PC9saXN0aXRlbT4KIAogPGxpc3RpdGVtPjxwYXJhPgorPHZhcm5hbWU+c3RydWN0IHVpb19wb3J0IHBvcnRbIE1BWF9VSU9fUE9SVFNfUkVHSU9OUyBdPC92YXJuYW1lPjogUmVxdWlyZWQKK2lmIHlvdSB3YW50IHRvIHBhc3MgaW5mb3JtYXRpb24gYWJvdXQgaW9wb3J0cyB0byB1c2Vyc3BhY2UuIEZvciBlYWNoIHBvcnQKK3JlZ2lvbiB5b3UgbmVlZCB0byBmaWxsIG9uZSBvZiB0aGUgPHZhcm5hbWU+dWlvX3BvcnQ8L3Zhcm5hbWU+IHN0cnVjdHVyZXMuCitTZWUgdGhlIGRlc2NyaXB0aW9uIGJlbG93IGZvciBkZXRhaWxzLgorPC9wYXJhPjwvbGlzdGl0ZW0+CisKKzxsaXN0aXRlbT48cGFyYT4KIDx2YXJuYW1lPmxvbmcgaXJxPC92YXJuYW1lPjogUmVxdWlyZWQuIElmIHlvdXIgaGFyZHdhcmUgZ2VuZXJhdGVzIGFuCiBpbnRlcnJ1cHQsIGl0J3MgeW91ciBtb2R1bGVzIHRhc2sgdG8gZGV0ZXJtaW5lIHRoZSBpcnEgbnVtYmVyIGR1cmluZwogaW5pdGlhbGl6YXRpb24uIElmIHlvdSBkb24ndCBoYXZlIGEgaGFyZHdhcmUgZ2VuZXJhdGVkIGludGVycnVwdCBidXQKQEAgLTQ0OCw2ICs1MDksNDIgQEAKIDx2YXJuYW1lPnN0cnVjdCB1aW9fbWVtPC92YXJuYW1lPiEgSXQgaXMgdXNlZCBieSB0aGUgVUlPIGZyYW1ld29yawogdG8gc2V0IHVwIHN5c2ZzIGZpbGVzIGZvciB0aGlzIG1hcHBpbmcuIFNpbXBseSBsZWF2ZSBpdCBhbG9uZS4KIDwvcGFyYT4KKworPHBhcmE+CitTb21ldGltZXMsIHlvdXIgZGV2aWNlIGNhbiBoYXZlIG9uZSBvciBtb3JlIHBvcnQgcmVnaW9ucyB3aGljaCBjYW4gbm90IGJlCittYXBwZWQgdG8gdXNlcnNwYWNlLiBCdXQgaWYgdGhlcmUgYXJlIG90aGVyIHBvc3NpYmlsaXRpZXMgZm9yIHVzZXJzcGFjZSB0bworYWNjZXNzIHRoZXNlIHBvcnRzLCBpdCBtYWtlcyBzZW5zZSB0byBtYWtlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwb3J0cworYXZhaWxhYmxlIGluIHN5c2ZzLiBGb3IgZWFjaCByZWdpb24sIHlvdSBoYXZlIHRvIHNldCB1cCBhCis8dmFybmFtZT5zdHJ1Y3QgdWlvX3BvcnQ8L3Zhcm5hbWU+IGluIHRoZSA8dmFybmFtZT5wb3J0W108L3Zhcm5hbWU+IGFycmF5LgorSGVyZSdzIGEgZGVzY3JpcHRpb24gb2YgdGhlIGZpZWxkcyBvZiA8dmFybmFtZT5zdHJ1Y3QgdWlvX3BvcnQ8L3Zhcm5hbWU+OgorPC9wYXJhPgorCis8aXRlbWl6ZWRsaXN0PgorPGxpc3RpdGVtPjxwYXJhPgorPHZhcm5hbWU+Y2hhciAqcG9ydHR5cGU8L3Zhcm5hbWU+OiBSZXF1aXJlZC4gU2V0IHRoaXMgdG8gb25lIG9mIHRoZSBwcmVkZWZpbmVkCitjb25zdGFudHMuIFVzZSA8dmFybmFtZT5VSU9fUE9SVF9YODY8L3Zhcm5hbWU+IGZvciB0aGUgaW9wb3J0cyBmb3VuZCBpbiB4ODYKK2FyY2hpdGVjdHVyZXMuCis8L3BhcmE+PC9saXN0aXRlbT4KKworPGxpc3RpdGVtPjxwYXJhPgorPHZhcm5hbWU+dW5zaWduZWQgbG9uZyBzdGFydDwvdmFybmFtZT46IFJlcXVpcmVkIGlmIHRoZSBwb3J0IHJlZ2lvbiBpcyB1c2VkLgorRmlsbCBpbiB0aGUgbnVtYmVyIG9mIHRoZSBmaXJzdCBwb3J0IG9mIHRoaXMgcmVnaW9uLgorPC9wYXJhPjwvbGlzdGl0ZW0+CisKKzxsaXN0aXRlbT48cGFyYT4KKzx2YXJuYW1lPnVuc2lnbmVkIGxvbmcgc2l6ZTwvdmFybmFtZT46IEZpbGwgaW4gdGhlIG51bWJlciBvZiBwb3J0cyBpbiB0aGlzCityZWdpb24uIElmIDx2YXJuYW1lPnNpemU8L3Zhcm5hbWU+IGlzIHplcm8sIHRoZSByZWdpb24gaXMgY29uc2lkZXJlZCB1bnVzZWQuCitOb3RlIHRoYXQgeW91IDxlbXBoYXNpcz5tdXN0PC9lbXBoYXNpcz4gaW5pdGlhbGl6ZSA8dmFybmFtZT5zaXplPC92YXJuYW1lPgord2l0aCB6ZXJvIGZvciBhbGwgdW51c2VkIHJlZ2lvbnMuCis8L3BhcmE+PC9saXN0aXRlbT4KKzwvaXRlbWl6ZWRsaXN0PgorCis8cGFyYT4KK1BsZWFzZSBkbyBub3QgdG91Y2ggdGhlIDx2YXJuYW1lPnBvcnRpbzwvdmFybmFtZT4gZWxlbWVudCBvZgorPHZhcm5hbWU+c3RydWN0IHVpb19wb3J0PC92YXJuYW1lPiEgSXQgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBVSU8KK2ZyYW1ld29yayB0byBzZXQgdXAgc3lzZnMgZmlsZXMgZm9yIHRoaXMgcmVnaW9uLiBTaW1wbHkgbGVhdmUgaXQgYWxvbmUuCis8L3BhcmE+CisKIDwvc2VjdDE+CiAKIDxzZWN0MSBpZD0iYWRkaW5nX2lycV9oYW5kbGVyIj4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vUENJL3BjaS50eHQgYi9Eb2N1bWVudGF0aW9uL1BDSS9wY2kudHh0CmluZGV4IGZkNDkwN2EuLjdmNmRlNmUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vUENJL3BjaS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9QQ0kvcGNpLnR4dApAQCAtMjk0LDcgKzI5NCw4IEBACiAKIHBjaV9zZXRfbWFzdGVyKCkgd2lsbCBlbmFibGUgRE1BIGJ5IHNldHRpbmcgdGhlIGJ1cyBtYXN0ZXIgYml0CiBpbiB0aGUgUENJX0NPTU1BTkQgcmVnaXN0ZXIuIEl0IGFsc28gZml4ZXMgdGhlIGxhdGVuY3kgdGltZXIgdmFsdWUgaWYKLWl0J3Mgc2V0IHRvIHNvbWV0aGluZyBib2d1cyBieSB0aGUgQklPUy4KK2l0J3Mgc2V0IHRvIHNvbWV0aGluZyBib2d1cyBieSB0aGUgQklPUy4gIHBjaV9jbGVhcl9tYXN0ZXIoKSB3aWxsCitkaXNhYmxlIERNQSBieSBjbGVhcmluZyB0aGUgYnVzIG1hc3RlciBiaXQuCiAKIElmIHRoZSBQQ0kgZGV2aWNlIGNhbiB1c2UgdGhlIFBDSSBNZW1vcnktV3JpdGUtSW52YWxpZGF0ZSB0cmFuc2FjdGlvbiwKIGNhbGwgcGNpX3NldF9td2koKS4gIFRoaXMgZW5hYmxlcyB0aGUgUENJX0NPTU1BTkQgYml0IGZvciBNZW0tV3ItSW52YWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vUkNVLzAwLUlOREVYIGIvRG9jdW1lbnRhdGlvbi9SQ1UvMDAtSU5ERVgKaW5kZXggN2RjMDY5NS4uOWJiNjJmNyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9SQ1UvMDAtSU5ERVgKKysrIGIvRG9jdW1lbnRhdGlvbi9SQ1UvMDAtSU5ERVgKQEAgLTEyLDYgKzEyLDggQEAKIAktIFJlZmVyZW5jZS1jb3VudCBkZXNpZ24gZm9yIGVsZW1lbnRzIG9mIGxpc3RzL2FycmF5cyBwcm90ZWN0ZWQgYnkgUkNVCiByY3UudHh0CiAJLSBSQ1UgQ29uY2VwdHMKK3JjdWJhcnJpZXIudHh0CisJLSBVbmxvYWRpbmcgbW9kdWxlcyB0aGF0IHVzZSBSQ1UgY2FsbGJhY2tzCiBSVEZQLnR4dAogCS0gTGlzdCBvZiBSQ1UgcGFwZXJzIChiaWJsaW9ncmFwaHkpIGdvaW5nIGJhY2sgdG8gMTk4MC4KIHRvcnR1cmUudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JDVS9yY3ViYXJyaWVyLnR4dCBiL0RvY3VtZW50YXRpb24vUkNVL3JjdWJhcnJpZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwOTYwMmQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL1JDVS9yY3ViYXJyaWVyLnR4dApAQCAtMCwwICsxLDMwNCBAQAorUkNVIGFuZCBVbmxvYWRhYmxlIE1vZHVsZXMKKworW09yaWdpbmFsbHkgcHVibGlzaGVkIGluIExXTiBKYW4uIDE0LCAyMDA3OiBodHRwOi8vbHduLm5ldC9BcnRpY2xlcy8yMTc0ODQvXQorCitSQ1UgKHJlYWQtY29weSB1cGRhdGUpIGlzIGEgc3luY2hyb25pemF0aW9uIG1lY2hhbmlzbSB0aGF0IGNhbiBiZSB0aG91Z2h0CitvZiBhcyBhIHJlcGxhY2VtZW50IGZvciByZWFkLXdyaXRlciBsb2NraW5nIChhbW9uZyBvdGhlciB0aGluZ3MpLCBidXQgd2l0aAordmVyeSBsb3ctb3ZlcmhlYWQgcmVhZGVycyB0aGF0IGFyZSBpbW11bmUgdG8gZGVhZGxvY2ssIHByaW9yaXR5IGludmVyc2lvbiwKK2FuZCB1bmJvdW5kZWQgbGF0ZW5jeS4gUkNVIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9ucyBhcmUgZGVsaW1pdGVkCitieSByY3VfcmVhZF9sb2NrKCkgYW5kIHJjdV9yZWFkX3VubG9jaygpLCB3aGljaCwgaW4gbm9uLUNPTkZJR19QUkVFTVBUCitrZXJuZWxzLCBnZW5lcmF0ZSBubyBjb2RlIHdoYXRzb2V2ZXIuCisKK1RoaXMgbWVhbnMgdGhhdCBSQ1Ugd3JpdGVycyBhcmUgdW5hd2FyZSBvZiB0aGUgcHJlc2VuY2Ugb2YgY29uY3VycmVudAorcmVhZGVycywgc28gdGhhdCBSQ1UgdXBkYXRlcyB0byBzaGFyZWQgZGF0YSBtdXN0IGJlIHVuZGVydGFrZW4gcXVpdGUKK2NhcmVmdWxseSwgbGVhdmluZyBhbiBvbGQgdmVyc2lvbiBvZiB0aGUgZGF0YSBzdHJ1Y3R1cmUgaW4gcGxhY2UgdW50aWwgYWxsCitwcmUtZXhpc3RpbmcgcmVhZGVycyBoYXZlIGZpbmlzaGVkLiBUaGVzZSBvbGQgdmVyc2lvbnMgYXJlIG5lZWRlZCBiZWNhdXNlCitzdWNoIHJlYWRlcnMgbWlnaHQgaG9sZCBhIHJlZmVyZW5jZSB0byB0aGVtLiBSQ1UgdXBkYXRlcyBjYW4gdGhlcmVmb3JlIGJlCityYXRoZXIgZXhwZW5zaXZlLCBhbmQgUkNVIGlzIHRodXMgYmVzdCBzdWl0ZWQgZm9yIHJlYWQtbW9zdGx5IHNpdHVhdGlvbnMuCisKK0hvdyBjYW4gYW4gUkNVIHdyaXRlciBwb3NzaWJseSBkZXRlcm1pbmUgd2hlbiBhbGwgcmVhZGVycyBhcmUgZmluaXNoZWQsCitnaXZlbiB0aGF0IHJlYWRlcnMgbWlnaHQgd2VsbCBsZWF2ZSBhYnNvbHV0ZWx5IG5vIHRyYWNlIG9mIHRoZWlyCitwcmVzZW5jZT8gVGhlcmUgaXMgYSBzeW5jaHJvbml6ZV9yY3UoKSBwcmltaXRpdmUgdGhhdCBibG9ja3MgdW50aWwgYWxsCitwcmUtZXhpc3RpbmcgcmVhZGVycyBoYXZlIGNvbXBsZXRlZC4gQW4gdXBkYXRlciB3aXNoaW5nIHRvIGRlbGV0ZSBhbgorZWxlbWVudCBwIGZyb20gYSBsaW5rZWQgbGlzdCBtaWdodCBkbyB0aGUgZm9sbG93aW5nLCB3aGlsZSBob2xkaW5nIGFuCithcHByb3ByaWF0ZSBsb2NrLCBvZiBjb3Vyc2U6CisKKwlsaXN0X2RlbF9yY3UocCk7CisJc3luY2hyb25pemVfcmN1KCk7CisJa2ZyZWUocCk7CisKK0J1dCB0aGUgYWJvdmUgY29kZSBjYW5ub3QgYmUgdXNlZCBpbiBJUlEgY29udGV4dCAtLSB0aGUgY2FsbF9yY3UoKQorcHJpbWl0aXZlIG11c3QgYmUgdXNlZCBpbnN0ZWFkLiBUaGlzIHByaW1pdGl2ZSB0YWtlcyBhIHBvaW50ZXIgdG8gYW4KK3JjdV9oZWFkIHN0cnVjdCBwbGFjZWQgd2l0aGluIHRoZSBSQ1UtcHJvdGVjdGVkIGRhdGEgc3RydWN0dXJlIGFuZAorYW5vdGhlciBwb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhhdCBtYXkgYmUgaW52b2tlZCBsYXRlciB0byBmcmVlIHRoYXQKK3N0cnVjdHVyZS4gQ29kZSB0byBkZWxldGUgYW4gZWxlbWVudCBwIGZyb20gdGhlIGxpbmtlZCBsaXN0IGZyb20gSVJRCitjb250ZXh0IG1pZ2h0IHRoZW4gYmUgYXMgZm9sbG93czoKKworCWxpc3RfZGVsX3JjdShwKTsKKwljYWxsX3JjdSgmcC0+cmN1LCBwX2NhbGxiYWNrKTsKKworU2luY2UgY2FsbF9yY3UoKSBuZXZlciBibG9ja3MsIHRoaXMgY29kZSBjYW4gc2FmZWx5IGJlIHVzZWQgZnJvbSB3aXRoaW4KK0lSUSBjb250ZXh0LiBUaGUgZnVuY3Rpb24gcF9jYWxsYmFjaygpIG1pZ2h0IGJlIGRlZmluZWQgYXMgZm9sbG93czoKKworCXN0YXRpYyB2b2lkIHBfY2FsbGJhY2soc3RydWN0IHJjdV9oZWFkICpycCkKKwl7CisJCXN0cnVjdCBwc3RydWN0ICpwID0gY29udGFpbmVyX29mKHJwLCBzdHJ1Y3QgcHN0cnVjdCwgcmN1KTsKKworCQlrZnJlZShwKTsKKwl9CisKKworVW5sb2FkaW5nIE1vZHVsZXMgVGhhdCBVc2UgY2FsbF9yY3UoKQorCitCdXQgd2hhdCBpZiBwX2NhbGxiYWNrIGlzIGRlZmluZWQgaW4gYW4gdW5sb2FkYWJsZSBtb2R1bGU/CisKK0lmIHdlIHVubG9hZCB0aGUgbW9kdWxlIHdoaWxlIHNvbWUgUkNVIGNhbGxiYWNrcyBhcmUgcGVuZGluZywKK3RoZSBDUFVzIGV4ZWN1dGluZyB0aGVzZSBjYWxsYmFja3MgYXJlIGdvaW5nIHRvIGJlIHNldmVyZWx5CitkaXNhcHBvaW50ZWQgd2hlbiB0aGV5IGFyZSBsYXRlciBpbnZva2VkLCBhcyBmYW5jaWZ1bGx5IGRlcGljdGVkIGF0CitodHRwOi8vbHduLm5ldC9pbWFnZXMvbnMva2VybmVsL3JjdS1kcm9wLmpwZy4KKworV2UgY291bGQgdHJ5IHBsYWNpbmcgYSBzeW5jaHJvbml6ZV9yY3UoKSBpbiB0aGUgbW9kdWxlLWV4aXQgY29kZSBwYXRoLAorYnV0IHRoaXMgaXMgbm90IHN1ZmZpY2llbnQuIEFsdGhvdWdoIHN5bmNocm9uaXplX3JjdSgpIGRvZXMgd2FpdCBmb3IgYQorZ3JhY2UgcGVyaW9kIHRvIGVsYXBzZSwgaXQgZG9lcyBub3Qgd2FpdCBmb3IgdGhlIGNhbGxiYWNrcyB0byBjb21wbGV0ZS4KKworT25lIG1pZ2h0IGJlIHRlbXB0ZWQgdG8gdHJ5IHNldmVyYWwgYmFjay10by1iYWNrIHN5bmNocm9uaXplX3JjdSgpCitjYWxscywgYnV0IHRoaXMgaXMgc3RpbGwgbm90IGd1YXJhbnRlZWQgdG8gd29yay4gSWYgdGhlcmUgaXMgYSB2ZXJ5CitoZWF2eSBSQ1UtY2FsbGJhY2sgbG9hZCwgdGhlbiBzb21lIG9mIHRoZSBjYWxsYmFja3MgbWlnaHQgYmUgZGVmZXJyZWQKK2luIG9yZGVyIHRvIGFsbG93IG90aGVyIHByb2Nlc3NpbmcgdG8gcHJvY2VlZC4gU3VjaCBkZWZlcnJhbCBpcyByZXF1aXJlZAoraW4gcmVhbHRpbWUga2VybmVscyBpbiBvcmRlciB0byBhdm9pZCBleGNlc3NpdmUgc2NoZWR1bGluZyBsYXRlbmNpZXMuCisKKworcmN1X2JhcnJpZXIoKQorCitXZSBpbnN0ZWFkIG5lZWQgdGhlIHJjdV9iYXJyaWVyKCkgcHJpbWl0aXZlLiBUaGlzIHByaW1pdGl2ZSBpcyBzaW1pbGFyCit0byBzeW5jaHJvbml6ZV9yY3UoKSwgYnV0IGluc3RlYWQgb2Ygd2FpdGluZyBzb2xlbHkgZm9yIGEgZ3JhY2UKK3BlcmlvZCB0byBlbGFwc2UsIGl0IGFsc28gd2FpdHMgZm9yIGFsbCBvdXRzdGFuZGluZyBSQ1UgY2FsbGJhY2tzIHRvCitjb21wbGV0ZS4gUHNldWRvLWNvZGUgdXNpbmcgcmN1X2JhcnJpZXIoKSBpcyBhcyBmb2xsb3dzOgorCisgICAxLiBQcmV2ZW50IGFueSBuZXcgUkNVIGNhbGxiYWNrcyBmcm9tIGJlaW5nIHBvc3RlZC4KKyAgIDIuIEV4ZWN1dGUgcmN1X2JhcnJpZXIoKS4KKyAgIDMuIEFsbG93IHRoZSBtb2R1bGUgdG8gYmUgdW5sb2FkZWQuCisKK1F1aWNrIFF1aXogIzE6IFdoeSBpcyB0aGVyZSBubyBzcmN1X2JhcnJpZXIoKT8KKworVGhlIHJjdXRvcnR1cmUgbW9kdWxlIG1ha2VzIHVzZSBvZiByY3VfYmFycmllciBpbiBpdHMgZXhpdCBmdW5jdGlvbgorYXMgZm9sbG93czoKKworIDEgc3RhdGljIHZvaWQKKyAyIHJjdV90b3J0dXJlX2NsZWFudXAodm9pZCkKKyAzIHsKKyA0ICAgaW50IGk7CisgNQorIDYgICBmdWxsc3RvcCA9IDE7CisgNyAgIGlmIChzaHVmZmxlcl90YXNrICE9IE5VTEwpIHsKKyA4ICAgICBWRVJCT1NFX1BSSU5US19TVFJJTkcoIlN0b3BwaW5nIHJjdV90b3J0dXJlX3NodWZmbGUgdGFzayIpOworIDkgICAgIGt0aHJlYWRfc3RvcChzaHVmZmxlcl90YXNrKTsKKzEwICAgfQorMTEgICBzaHVmZmxlcl90YXNrID0gTlVMTDsKKzEyCisxMyAgIGlmICh3cml0ZXJfdGFzayAhPSBOVUxMKSB7CisxNCAgICAgVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJTdG9wcGluZyByY3VfdG9ydHVyZV93cml0ZXIgdGFzayIpOworMTUgICAgIGt0aHJlYWRfc3RvcCh3cml0ZXJfdGFzayk7CisxNiAgIH0KKzE3ICAgd3JpdGVyX3Rhc2sgPSBOVUxMOworMTgKKzE5ICAgaWYgKHJlYWRlcl90YXNrcyAhPSBOVUxMKSB7CisyMCAgICAgZm9yIChpID0gMDsgaSA8IG5yZWFscmVhZGVyczsgaSsrKSB7CisyMSAgICAgICBpZiAocmVhZGVyX3Rhc2tzW2ldICE9IE5VTEwpIHsKKzIyICAgICAgICAgVkVSQk9TRV9QUklOVEtfU1RSSU5HKAorMjMgICAgICAgICAgICJTdG9wcGluZyByY3VfdG9ydHVyZV9yZWFkZXIgdGFzayIpOworMjQgICAgICAgICBrdGhyZWFkX3N0b3AocmVhZGVyX3Rhc2tzW2ldKTsKKzI1ICAgICAgIH0KKzI2ICAgICAgIHJlYWRlcl90YXNrc1tpXSA9IE5VTEw7CisyNyAgICAgfQorMjggICAgIGtmcmVlKHJlYWRlcl90YXNrcyk7CisyOSAgICAgcmVhZGVyX3Rhc2tzID0gTlVMTDsKKzMwICAgfQorMzEgICByY3VfdG9ydHVyZV9jdXJyZW50ID0gTlVMTDsKKzMyCiszMyAgIGlmIChmYWtld3JpdGVyX3Rhc2tzICE9IE5VTEwpIHsKKzM0ICAgICBmb3IgKGkgPSAwOyBpIDwgbmZha2V3cml0ZXJzOyBpKyspIHsKKzM1ICAgICAgIGlmIChmYWtld3JpdGVyX3Rhc2tzW2ldICE9IE5VTEwpIHsKKzM2ICAgICAgICAgVkVSQk9TRV9QUklOVEtfU1RSSU5HKAorMzcgICAgICAgICAgICJTdG9wcGluZyByY3VfdG9ydHVyZV9mYWtld3JpdGVyIHRhc2siKTsKKzM4ICAgICAgICAga3RocmVhZF9zdG9wKGZha2V3cml0ZXJfdGFza3NbaV0pOworMzkgICAgICAgfQorNDAgICAgICAgZmFrZXdyaXRlcl90YXNrc1tpXSA9IE5VTEw7Cis0MSAgICAgfQorNDIgICAgIGtmcmVlKGZha2V3cml0ZXJfdGFza3MpOworNDMgICAgIGZha2V3cml0ZXJfdGFza3MgPSBOVUxMOworNDQgICB9Cis0NQorNDYgICBpZiAoc3RhdHNfdGFzayAhPSBOVUxMKSB7Cis0NyAgICAgVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJTdG9wcGluZyByY3VfdG9ydHVyZV9zdGF0cyB0YXNrIik7Cis0OCAgICAga3RocmVhZF9zdG9wKHN0YXRzX3Rhc2spOworNDkgICB9Cis1MCAgIHN0YXRzX3Rhc2sgPSBOVUxMOworNTEKKzUyICAgLyogV2FpdCBmb3IgYWxsIFJDVSBjYWxsYmFja3MgdG8gZmlyZS4gKi8KKzUzICAgcmN1X2JhcnJpZXIoKTsKKzU0Cis1NSAgIHJjdV90b3J0dXJlX3N0YXRzX3ByaW50KCk7IC8qIC1BZnRlci0gdGhlIHN0YXRzIHRocmVhZCBpcyBzdG9wcGVkISAqLworNTYKKzU3ICAgaWYgKGN1cl9vcHMtPmNsZWFudXAgIT0gTlVMTCkKKzU4ICAgICBjdXJfb3BzLT5jbGVhbnVwKCk7Cis1OSAgIGlmIChhdG9taWNfcmVhZCgmbl9yY3VfdG9ydHVyZV9lcnJvcikpCis2MCAgICAgcmN1X3RvcnR1cmVfcHJpbnRfbW9kdWxlX3Bhcm1zKCJFbmQgb2YgdGVzdDogRkFJTFVSRSIpOworNjEgICBlbHNlCis2MiAgICAgcmN1X3RvcnR1cmVfcHJpbnRfbW9kdWxlX3Bhcm1zKCJFbmQgb2YgdGVzdDogU1VDQ0VTUyIpOworNjMgfQorCitMaW5lIDYgc2V0cyBhIGdsb2JhbCB2YXJpYWJsZSB0aGF0IHByZXZlbnRzIGFueSBSQ1UgY2FsbGJhY2tzIGZyb20KK3JlLXBvc3RpbmcgdGhlbXNlbHZlcy4gVGhpcyB3aWxsIG5vdCBiZSBuZWNlc3NhcnkgaW4gbW9zdCBjYXNlcywgc2luY2UKK1JDVSBjYWxsYmFja3MgcmFyZWx5IGluY2x1ZGUgY2FsbHMgdG8gY2FsbF9yY3UoKS4gSG93ZXZlciwgdGhlIHJjdXRvcnR1cmUKK21vZHVsZSBpcyBhbiBleGNlcHRpb24gdG8gdGhpcyBydWxlLCBhbmQgdGhlcmVmb3JlIG5lZWRzIHRvIHNldCB0aGlzCitnbG9iYWwgdmFyaWFibGUuCisKK0xpbmVzIDctNTAgc3RvcCBhbGwgdGhlIGtlcm5lbCB0YXNrcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJjdXRvcnR1cmUKK21vZHVsZS4gVGhlcmVmb3JlLCBvbmNlIGV4ZWN1dGlvbiByZWFjaGVzIGxpbmUgNTMsIG5vIG1vcmUgcmN1dG9ydHVyZQorUkNVIGNhbGxiYWNrcyB3aWxsIGJlIHBvc3RlZC4gVGhlIHJjdV9iYXJyaWVyKCkgY2FsbCBvbiBsaW5lIDUzIHdhaXRzCitmb3IgYW55IHByZS1leGlzdGluZyBjYWxsYmFja3MgdG8gY29tcGxldGUuCisKK1RoZW4gbGluZXMgNTUtNjIgcHJpbnQgc3RhdHVzIGFuZCBkbyBvcGVyYXRpb24tc3BlY2lmaWMgY2xlYW51cCwgYW5kCit0aGVuIHJldHVybiwgcGVybWl0dGluZyB0aGUgbW9kdWxlLXVubG9hZCBvcGVyYXRpb24gdG8gYmUgY29tcGxldGVkLgorCitRdWljayBRdWl6ICMyOiBJcyB0aGVyZSBhbnkgb3RoZXIgc2l0dWF0aW9uIHdoZXJlIHJjdV9iYXJyaWVyKCkgbWlnaHQKKwliZSByZXF1aXJlZD8KKworWW91ciBtb2R1bGUgbWlnaHQgaGF2ZSBhZGRpdGlvbmFsIGNvbXBsaWNhdGlvbnMuIEZvciBleGFtcGxlLCBpZiB5b3VyCittb2R1bGUgaW52b2tlcyBjYWxsX3JjdSgpIGZyb20gdGltZXJzLCB5b3Ugd2lsbCBuZWVkIHRvIGZpcnN0IGNhbmNlbCBhbGwKK3RoZSB0aW1lcnMsIGFuZCBvbmx5IHRoZW4gaW52b2tlIHJjdV9iYXJyaWVyKCkgdG8gd2FpdCBmb3IgYW55IHJlbWFpbmluZworUkNVIGNhbGxiYWNrcyB0byBjb21wbGV0ZS4KKworCitJbXBsZW1lbnRpbmcgcmN1X2JhcnJpZXIoKQorCitEaXBhbmthciBTYXJtYSdzIGltcGxlbWVudGF0aW9uIG9mIHJjdV9iYXJyaWVyKCkgbWFrZXMgdXNlIG9mIHRoZSBmYWN0Cit0aGF0IFJDVSBjYWxsYmFja3MgYXJlIG5ldmVyIHJlb3JkZXJlZCBvbmNlIHF1ZXVlZCBvbiBvbmUgb2YgdGhlIHBlci1DUFUKK3F1ZXVlcy4gSGlzIGltcGxlbWVudGF0aW9uIHF1ZXVlcyBhbiBSQ1UgY2FsbGJhY2sgb24gZWFjaCBvZiB0aGUgcGVyLUNQVQorY2FsbGJhY2sgcXVldWVzLCBhbmQgdGhlbiB3YWl0cyB1bnRpbCB0aGV5IGhhdmUgYWxsIHN0YXJ0ZWQgZXhlY3V0aW5nLCBhdAord2hpY2ggcG9pbnQsIGFsbCBlYXJsaWVyIFJDVSBjYWxsYmFja3MgYXJlIGd1YXJhbnRlZWQgdG8gaGF2ZSBjb21wbGV0ZWQuCisKK1RoZSBvcmlnaW5hbCBjb2RlIGZvciByY3VfYmFycmllcigpIHdhcyBhcyBmb2xsb3dzOgorCisgMSB2b2lkIHJjdV9iYXJyaWVyKHZvaWQpCisgMiB7CisgMyAgIEJVR19PTihpbl9pbnRlcnJ1cHQoKSk7CisgNCAgIC8qIFRha2UgY3B1Y29udHJvbCBtdXRleCB0byBwcm90ZWN0IGFnYWluc3QgQ1BVIGhvdHBsdWcgKi8KKyA1ICAgbXV0ZXhfbG9jaygmcmN1X2JhcnJpZXJfbXV0ZXgpOworIDYgICBpbml0X2NvbXBsZXRpb24oJnJjdV9iYXJyaWVyX2NvbXBsZXRpb24pOworIDcgICBhdG9taWNfc2V0KCZyY3VfYmFycmllcl9jcHVfY291bnQsIDApOworIDggICBvbl9lYWNoX2NwdShyY3VfYmFycmllcl9mdW5jLCBOVUxMLCAwLCAxKTsKKyA5ICAgd2FpdF9mb3JfY29tcGxldGlvbigmcmN1X2JhcnJpZXJfY29tcGxldGlvbik7CisxMCAgIG11dGV4X3VubG9jaygmcmN1X2JhcnJpZXJfbXV0ZXgpOworMTEgfQorCitMaW5lIDMgdmVyaWZpZXMgdGhhdCB0aGUgY2FsbGVyIGlzIGluIHByb2Nlc3MgY29udGV4dCwgYW5kIGxpbmVzIDUgYW5kIDEwCit1c2UgcmN1X2JhcnJpZXJfbXV0ZXggdG8gZW5zdXJlIHRoYXQgb25seSBvbmUgcmN1X2JhcnJpZXIoKSBpcyB1c2luZyB0aGUKK2dsb2JhbCBjb21wbGV0aW9uIGFuZCBjb3VudGVycyBhdCBhIHRpbWUsIHdoaWNoIGFyZSBpbml0aWFsaXplZCBvbiBsaW5lcworNiBhbmQgNy4gTGluZSA4IGNhdXNlcyBlYWNoIENQVSB0byBpbnZva2UgcmN1X2JhcnJpZXJfZnVuYygpLCB3aGljaCBpcworc2hvd24gYmVsb3cuIE5vdGUgdGhhdCB0aGUgZmluYWwgIjEiIGluIG9uX2VhY2hfY3B1KCkncyBhcmd1bWVudCBsaXN0CitlbnN1cmVzIHRoYXQgYWxsIHRoZSBjYWxscyB0byByY3VfYmFycmllcl9mdW5jKCkgd2lsbCBoYXZlIGNvbXBsZXRlZAorYmVmb3JlIG9uX2VhY2hfY3B1KCkgcmV0dXJucy4gTGluZSA5IHRoZW4gd2FpdHMgZm9yIHRoZSBjb21wbGV0aW9uLgorCitUaGlzIGNvZGUgd2FzIHJld3JpdHRlbiBpbiAyMDA4IHRvIHN1cHBvcnQgcmN1X2JhcnJpZXJfYmgoKSBhbmQKK3JjdV9iYXJyaWVyX3NjaGVkKCkgaW4gYWRkaXRpb24gdG8gdGhlIG9yaWdpbmFsIHJjdV9iYXJyaWVyKCkuCisKK1RoZSByY3VfYmFycmllcl9mdW5jKCkgcnVucyBvbiBlYWNoIENQVSwgd2hlcmUgaXQgaW52b2tlcyBjYWxsX3JjdSgpCit0byBwb3N0IGFuIFJDVSBjYWxsYmFjaywgYXMgZm9sbG93czoKKworIDEgc3RhdGljIHZvaWQgcmN1X2JhcnJpZXJfZnVuYyh2b2lkICpub3R1c2VkKQorIDIgeworIDMgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKyA0IHN0cnVjdCByY3VfZGF0YSAqcmRwID0gJnBlcl9jcHUocmN1X2RhdGEsIGNwdSk7CisgNSBzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQ7CisgNgorIDcgaGVhZCA9ICZyZHAtPmJhcnJpZXI7CisgOCBhdG9taWNfaW5jKCZyY3VfYmFycmllcl9jcHVfY291bnQpOworIDkgY2FsbF9yY3UoaGVhZCwgcmN1X2JhcnJpZXJfY2FsbGJhY2spOworMTAgfQorCitMaW5lcyAzIGFuZCA0IGxvY2F0ZSBSQ1UncyBpbnRlcm5hbCBwZXItQ1BVIHJjdV9kYXRhIHN0cnVjdHVyZSwKK3doaWNoIGNvbnRhaW5zIHRoZSBzdHJ1Y3QgcmN1X2hlYWQgdGhhdCBuZWVkZWQgZm9yIHRoZSBsYXRlciBjYWxsIHRvCitjYWxsX3JjdSgpLiBMaW5lIDcgcGlja3MgdXAgYSBwb2ludGVyIHRvIHRoaXMgc3RydWN0IHJjdV9oZWFkLCBhbmQgbGluZQorOCBpbmNyZW1lbnRzIGEgZ2xvYmFsIGNvdW50ZXIuIFRoaXMgY291bnRlciB3aWxsIGxhdGVyIGJlIGRlY3JlbWVudGVkCitieSB0aGUgY2FsbGJhY2suIExpbmUgOSB0aGVuIHJlZ2lzdGVycyB0aGUgcmN1X2JhcnJpZXJfY2FsbGJhY2soKSBvbgordGhlIGN1cnJlbnQgQ1BVJ3MgcXVldWUuCisKK1RoZSByY3VfYmFycmllcl9jYWxsYmFjaygpIGZ1bmN0aW9uIHNpbXBseSBhdG9taWNhbGx5IGRlY3JlbWVudHMgdGhlCityY3VfYmFycmllcl9jcHVfY291bnQgdmFyaWFibGUgYW5kIGZpbmFsaXplcyB0aGUgY29tcGxldGlvbiB3aGVuIGl0CityZWFjaGVzIHplcm8sIGFzIGZvbGxvd3M6CisKKyAxIHN0YXRpYyB2b2lkIHJjdV9iYXJyaWVyX2NhbGxiYWNrKHN0cnVjdCByY3VfaGVhZCAqbm90dXNlZCkKKyAyIHsKKyAzIGlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZyY3VfYmFycmllcl9jcHVfY291bnQpKQorIDQgY29tcGxldGUoJnJjdV9iYXJyaWVyX2NvbXBsZXRpb24pOworIDUgfQorCitRdWljayBRdWl6ICMzOiBXaGF0IGhhcHBlbnMgaWYgQ1BVIDAncyByY3VfYmFycmllcl9mdW5jKCkgZXhlY3V0ZXMKKwlpbW1lZGlhdGVseSAodGh1cyBpbmNyZW1lbnRpbmcgcmN1X2JhcnJpZXJfY3B1X2NvdW50IHRvIHRoZQorCXZhbHVlIG9uZSksIGJ1dCB0aGUgb3RoZXIgQ1BVJ3MgcmN1X2JhcnJpZXJfZnVuYygpIGludm9jYXRpb25zCisJYXJlIGRlbGF5ZWQgZm9yIGEgZnVsbCBncmFjZSBwZXJpb2Q/IENvdWxkbid0IHRoaXMgcmVzdWx0IGluCisJcmN1X2JhcnJpZXIoKSByZXR1cm5pbmcgcHJlbWF0dXJlbHk/CisKKworcmN1X2JhcnJpZXIoKSBTdW1tYXJ5CisKK1RoZSByY3VfYmFycmllcigpIHByaW1pdGl2ZSBoYXMgc2VlbiByZWxhdGl2ZWx5IGxpdHRsZSB1c2UsIHNpbmNlIG1vc3QKK2NvZGUgdXNpbmcgUkNVIGlzIGluIHRoZSBjb3JlIGtlcm5lbCByYXRoZXIgdGhhbiBpbiBtb2R1bGVzLiBIb3dldmVyLCBpZgoreW91IGFyZSB1c2luZyBSQ1UgZnJvbSBhbiB1bmxvYWRhYmxlIG1vZHVsZSwgeW91IG5lZWQgdG8gdXNlIHJjdV9iYXJyaWVyKCkKK3NvIHRoYXQgeW91ciBtb2R1bGUgbWF5IGJlIHNhZmVseSB1bmxvYWRlZC4KKworCitBbnN3ZXJzIHRvIFF1aWNrIFF1aXp6ZXMKKworUXVpY2sgUXVpeiAjMTogV2h5IGlzIHRoZXJlIG5vIHNyY3VfYmFycmllcigpPworCitBbnN3ZXI6IFNpbmNlIHRoZXJlIGlzIG5vIGNhbGxfc3JjdSgpLCB0aGVyZSBjYW4gYmUgbm8gb3V0c3RhbmRpbmcgU1JDVQorCWNhbGxiYWNrcy4gVGhlcmVmb3JlLCB0aGVyZSBpcyBubyBuZWVkIHRvIHdhaXQgZm9yIHRoZW0uCisKK1F1aWNrIFF1aXogIzI6IElzIHRoZXJlIGFueSBvdGhlciBzaXR1YXRpb24gd2hlcmUgcmN1X2JhcnJpZXIoKSBtaWdodAorCWJlIHJlcXVpcmVkPworCitBbnN3ZXI6IEludGVyZXN0aW5nbHkgZW5vdWdoLCByY3VfYmFycmllcigpIHdhcyBub3Qgb3JpZ2luYWxseQorCWltcGxlbWVudGVkIGZvciBtb2R1bGUgdW5sb2FkaW5nLiBOaWtpdGEgRGFuaWxvdiB3YXMgdXNpbmcKKwlSQ1UgaW4gYSBmaWxlc3lzdGVtLCB3aGljaCByZXN1bHRlZCBpbiBhIHNpbWlsYXIgc2l0dWF0aW9uIGF0CisJZmlsZXN5c3RlbS11bm1vdW50IHRpbWUuIERpcGFua2FyIFNhcm1hIGNvZGVkIHVwIHJjdV9iYXJyaWVyKCkKKwlpbiByZXNwb25zZSwgc28gdGhhdCBOaWtpdGEgY291bGQgaW52b2tlIGl0IGR1cmluZyB0aGUKKwlmaWxlc3lzdGVtLXVubW91bnQgcHJvY2Vzcy4KKworCU11Y2ggbGF0ZXIsIHlvdXJzIHRydWx5IGhpdCB0aGUgUkNVIG1vZHVsZS11bmxvYWQgcHJvYmxlbSB3aGVuCisJaW1wbGVtZW50aW5nIHJjdXRvcnR1cmUsIGFuZCBmb3VuZCB0aGF0IHJjdV9iYXJyaWVyKCkgc29sdmVzCisJdGhpcyBwcm9ibGVtIGFzIHdlbGwuCisKK1F1aWNrIFF1aXogIzM6IFdoYXQgaGFwcGVucyBpZiBDUFUgMCdzIHJjdV9iYXJyaWVyX2Z1bmMoKSBleGVjdXRlcworCWltbWVkaWF0ZWx5ICh0aHVzIGluY3JlbWVudGluZyByY3VfYmFycmllcl9jcHVfY291bnQgdG8gdGhlCisJdmFsdWUgb25lKSwgYnV0IHRoZSBvdGhlciBDUFUncyByY3VfYmFycmllcl9mdW5jKCkgaW52b2NhdGlvbnMKKwlhcmUgZGVsYXllZCBmb3IgYSBmdWxsIGdyYWNlIHBlcmlvZD8gQ291bGRuJ3QgdGhpcyByZXN1bHQgaW4KKwlyY3VfYmFycmllcigpIHJldHVybmluZyBwcmVtYXR1cmVseT8KKworQW5zd2VyOiBUaGlzIGNhbm5vdCBoYXBwZW4uIFRoZSByZWFzb24gaXMgdGhhdCBvbl9lYWNoX2NwdSgpIGhhcyBpdHMgbGFzdAorCWFyZ3VtZW50LCB0aGUgd2FpdCBmbGFnLCBzZXQgdG8gIjEiLiBUaGlzIGZsYWcgaXMgcGFzc2VkIHRocm91Z2gKKwl0byBzbXBfY2FsbF9mdW5jdGlvbigpIGFuZCBmdXJ0aGVyIHRvIHNtcF9jYWxsX2Z1bmN0aW9uX29uX2NwdSgpLAorCWNhdXNpbmcgdGhpcyBsYXR0ZXIgdG8gc3BpbiB1bnRpbCB0aGUgY3Jvc3MtQ1BVIGludm9jYXRpb24gb2YKKwlyY3VfYmFycmllcl9mdW5jKCkgaGFzIGNvbXBsZXRlZC4gVGhpcyBieSBpdHNlbGYgd291bGQgcHJldmVudAorCWEgZ3JhY2UgcGVyaW9kIGZyb20gY29tcGxldGluZyBvbiBub24tQ09ORklHX1BSRUVNUFQga2VybmVscywKKwlzaW5jZSBlYWNoIENQVSBtdXN0IHVuZGVyZ28gYSBjb250ZXh0IHN3aXRjaCAob3Igb3RoZXIgcXVpZXNjZW50CisJc3RhdGUpIGJlZm9yZSB0aGUgZ3JhY2UgcGVyaW9kIGNhbiBjb21wbGV0ZS4gSG93ZXZlciwgdGhpcyBpcworCW9mIG5vIHVzZSBpbiBDT05GSUdfUFJFRU1QVCBrZXJuZWxzLgorCisJVGhlcmVmb3JlLCBvbl9lYWNoX2NwdSgpIGRpc2FibGVzIHByZWVtcHRpb24gYWNyb3NzIGl0cyBjYWxsCisJdG8gc21wX2NhbGxfZnVuY3Rpb24oKSBhbmQgYWxzbyBhY3Jvc3MgdGhlIGxvY2FsIGNhbGwgdG8KKwlyY3VfYmFycmllcl9mdW5jKCkuIFRoaXMgcHJldmVudHMgdGhlIGxvY2FsIENQVSBmcm9tIGNvbnRleHQKKwlzd2l0Y2hpbmcsIGFnYWluIHByZXZlbnRpbmcgZ3JhY2UgcGVyaW9kcyBmcm9tIGNvbXBsZXRpbmcuIFRoaXMKKwltZWFucyB0aGF0IGFsbCBDUFVzIGhhdmUgZXhlY3V0ZWQgcmN1X2JhcnJpZXJfZnVuYygpIGJlZm9yZQorCXRoZSBmaXJzdCByY3VfYmFycmllcl9jYWxsYmFjaygpIGNhbiBwb3NzaWJseSBleGVjdXRlLCBpbiB0dXJuCisJcHJldmVudGluZyByY3VfYmFycmllcl9jcHVfY291bnQgZnJvbSBwcmVtYXR1cmVseSByZWFjaGluZyB6ZXJvLgorCisJQ3VycmVudGx5LCAtcnQgaW1wbGVtZW50YXRpb25zIG9mIFJDVSBrZWVwIGJ1dCBhIHNpbmdsZSBnbG9iYWwKKwlxdWV1ZSBmb3IgUkNVIGNhbGxiYWNrcywgYW5kIHRodXMgZG8gbm90IHN1ZmZlciBmcm9tIHRoaXMKKwlwcm9ibGVtLiBIb3dldmVyLCB3aGVuIHRoZSAtcnQgUkNVIGV2ZW50dWFsbHkgZG9lcyBoYXZlIHBlci1DUFUKKwljYWxsYmFjayBxdWV1ZXMsIHRoaW5ncyB3aWxsIGhhdmUgdG8gY2hhbmdlLiBPbmUgc2ltcGxlIGNoYW5nZQorCWlzIHRvIGFkZCBhbiByY3VfcmVhZF9sb2NrKCkgYmVmb3JlIGxpbmUgOCBvZiByY3VfYmFycmllcigpCisJYW5kIGFuIHJjdV9yZWFkX3VubG9jaygpIGFmdGVyIGxpbmUgOCBvZiB0aGlzIHNhbWUgZnVuY3Rpb24uIElmCisJeW91IGNhbiB0aGluayBvZiBhIGJldHRlciBjaGFuZ2UsIHBsZWFzZSBsZXQgbWUga25vdyEKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYmFkX21lbW9yeS50eHQgYi9Eb2N1bWVudGF0aW9uL2JhZF9tZW1vcnkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmODQxNjIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2JhZF9tZW1vcnkudHh0CkBAIC0wLDAgKzEsNDUgQEAKK01hcmNoIDIwMDgKK0phbi1TaW1vbiBNb2VsbGVyLCBkbDlwZkBnbXguZGUKKworCitIb3cgdG8gZGVhbCB3aXRoIGJhZCBtZW1vcnkgZS5nLiByZXBvcnRlZCBieSBtZW10ZXN0ODYrID8KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitUaGVyZSBhcmUgdGhyZWUgcG9zc2liaWxpdGllcyBJIGtub3cgb2Y6CisKKzEpIFJlaW5zZXJ0L3N3YXAgdGhlIG1lbW9yeSBtb2R1bGVzCisKKzIpIEJ1eSBuZXcgbW9kdWxlcyAoYmVzdCEpIG9yIHRyeSB0byBleGNoYW5nZSB0aGUgbWVtb3J5CisgICBpZiB5b3UgaGF2ZSBzcGFyZS1wYXJ0cworCiszKSBVc2UgQmFkUkFNIG9yIG1lbW1hcAorCitUaGlzIEhvd3RvIGlzIGFib3V0IG51bWJlciAzKSAuCisKKworQmFkUkFNCisjIyMjIyMKK0JhZFJBTSBpcyB0aGUgYWN0aXZlbHkgZGV2ZWxvcGVkIGFuZCBhdmFpbGFibGUgYXMga2VybmVsLXBhdGNoCitoZXJlOiAgaHR0cDovL3JpY2sudmFucmVpbi5vcmcvbGludXgvYmFkcmFtLworCitGb3IgbW9yZSBkZXRhaWxzIHNlZSB0aGUgQmFkUkFNIGRvY3VtZW50YXRpb24uCisKK21lbW1hcAorIyMjIyMjCisKK21lbW1hcCBpcyBhbHJlYWR5IGluIHRoZSBrZXJuZWwgYW5kIHVzYWJsZSBhcyBrZXJuZWwtcGFyYW1ldGVyIGF0Citib290LXRpbWUuICBJdHMgc3ludGF4IGlzIHNsaWdodGx5IHN0cmFuZ2UgYW5kIHlvdSBtYXkgbmVlZCB0bworY2FsY3VsYXRlIHRoZSB2YWx1ZXMgYnkgeW91cnNlbGYhCisKK1N5bnRheCB0byBleGNsdWRlIGEgbWVtb3J5IGFyZWEgKHNlZSBrZXJuZWwtcGFyYW1ldGVycy50eHQgZm9yIGRldGFpbHMpOgorbWVtbWFwPTxzaXplPiQ8YWRkcmVzcz4KKworRXhhbXBsZTogbWVtdGVzdDg2KyByZXBvcnRlZCBoZXJlIGVycm9ycyBhdCBhZGRyZXNzIDB4MTg2OTE0NTgsIDB4MTg2OTg0MjQgYW5kCisgICAgICAgICBzb21lIG90aGVycy4gQWxsIGhhZCAweDE4Njl4eHh4IGluIGNvbW1vbiwgc28gSSBjaG9zZSBhIHBhdHRlcm4gb2YKKyAgICAgICAgIDB4MTg2OTAwMDAsMHhmZmZmMDAwMC4KKworV2l0aCB0aGUgbnVtYmVycyBvZiB0aGUgZXhhbXBsZSBhYm92ZToKK21lbW1hcD02NEskMHgxODY5MDAwMAorIG9yCittZW1tYXA9MHgxMDAwMCQweDE4NjkwMDAwCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYmxhY2tmaW4vMDAtSU5ERVggYi9Eb2N1bWVudGF0aW9uL2JsYWNrZmluLzAwLUlOREVYCmluZGV4IDdjYjNiMzUuLmQ2ODQwYTkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vYmxhY2tmaW4vMDAtSU5ERVgKKysrIGIvRG9jdW1lbnRhdGlvbi9ibGFja2Zpbi8wMC1JTkRFWApAQCAtOSwzICs5LDYgQEAKIAogRmlsZXN5c3RlbXMKIAktIFJlcXVpcmVtZW50cyBmb3IgbW91bnRpbmcgdGhlIHJvb3QgZmlsZSBzeXN0ZW0uCisKK2JmaW4tZ3Bpby1ub3RlLnR4dAorCS0gTm90ZXMgaW4gZGV2ZWxvcGluZy91c2luZyBiZmluLWdwaW8gZHJpdmVyLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ibGFja2Zpbi9iZmluLWdwaW8tbm90ZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9ibGFja2Zpbi9iZmluLWdwaW8tbm90ZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4OThjN2QKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2JsYWNrZmluL2JmaW4tZ3Bpby1ub3Rlcy50eHQKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIEZpbGU6ICAgICAgICAgRG9jdW1lbnRhdGlvbi9ibGFja2Zpbi9iZmluLWdwaW8tbm90ZS50eHQKKyAqIEJhc2VkIG9uOgorICogQXV0aG9yOgorICoKKyAqIENyZWF0ZWQ6ICAgICAgJElkOiBiZmluLWdwaW8tbm90ZS50eHQgMjAwOC0xMS0yNCAxNjo0MiBncmFmeWFuZyAkCisgKiBEZXNjcmlwdGlvbjogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbm90ZXMgaW4gZGV2ZWxvcGluZy91c2luZyBiZmluLWdwaW8uCisgKgorICoKKyAqIFJldjoKKyAqCisgKiBNb2RpZmllZDoKKyAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKi8KKworCisxLiBCbGFja2ZpbiBHUElPIGludHJvZHVjdGlvbgorCisgICAgVGhlcmUgYXJlIG1hbnkgR1BJTyBwaW5zIG9uIEJsYWNrZmluLiBNb3N0IG9mIHRoZXNlIHBpbnMgYXJlIG11eGVkIHRvCisgICAgbXVsdGktZnVuY3Rpb25zLiBUaGV5IGNhbiBiZSBjb25maWd1cmVkIGFzIHBlcmlwaGVyYWwsIG9yIGp1c3QgYXMgR1BJTywKKyAgICBjb25maWd1cmVkIHRvIGlucHV0IHdpdGggaW50ZXJydXB0IGVuYWJsZWQsIG9yIG91dHB1dC4KKworICAgIEZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiwgcGxlYXNlIHNlZSAiYXJjaC9ibGFja2Zpbi9rZXJuZWwvYmZpbl9ncGlvLmMiLAorICAgIG9yIHRoZSByZWxldmFudCBIUk0uCisKKworMi4gQXZvaWRpbmcgcmVzb3VyY2UgY29uZmxpY3QKKworICAgIEZvbGxvd2VkIGZ1bmN0aW9uIGdyb3VwcyBhcmUgdXNlZCB0byBhdm9pZGluZyByZXNvdXJjZSBjb25mbGljdCwKKyAgICAtIFVzZSB0aGUgcGluIGFzIHBlcmlwaGVyYWwsCisJaW50IHBlcmlwaGVyYWxfcmVxdWVzdCh1bnNpZ25lZCBzaG9ydCBwZXIsIGNvbnN0IGNoYXIgKmxhYmVsKTsKKwlpbnQgcGVyaXBoZXJhbF9yZXF1ZXN0X2xpc3QoY29uc3QgdW5zaWduZWQgc2hvcnQgcGVyW10sIGNvbnN0IGNoYXIgKmxhYmVsKTsKKwl2b2lkIHBlcmlwaGVyYWxfZnJlZSh1bnNpZ25lZCBzaG9ydCBwZXIpOworCXZvaWQgcGVyaXBoZXJhbF9mcmVlX2xpc3QoY29uc3QgdW5zaWduZWQgc2hvcnQgcGVyW10pOworICAgIC0gVXNlIHRoZSBwaW4gYXMgR1BJTywKKwlpbnQgYmZpbl9ncGlvX3JlcXVlc3QodW5zaWduZWQgZ3BpbywgY29uc3QgY2hhciAqbGFiZWwpOworCXZvaWQgYmZpbl9ncGlvX2ZyZWUodW5zaWduZWQgZ3Bpbyk7CisgICAgLSBVc2UgdGhlIHBpbiBhcyBHUElPIGludGVycnVwdCwKKwlpbnQgYmZpbl9ncGlvX2lycV9yZXF1ZXN0KHVuc2lnbmVkIGdwaW8sIGNvbnN0IGNoYXIgKmxhYmVsKTsKKwl2b2lkIGJmaW5fZ3Bpb19pcnFfZnJlZSh1bnNpZ25lZCBncGlvKTsKKworICAgIFRoZSByZXF1ZXN0IGZ1bmN0aW9ucyB3aWxsIHJlY29yZCB0aGUgZnVuY3Rpb24gc3RhdGUgZm9yIGEgY2VydGFpbiBwaW4sCisgICAgdGhlIGZyZWUgZnVuY3Rpb25zIHdpbGwgY2xlYXIgaXQncyBmdW5jdGlvbiBzdGF0ZS4KKyAgICBPbmNlIGEgcGluIGlzIHJlcXVlc3RlZCwgaXQgY2FuJ3QgYmUgcmVxdWVzdGVkIGFnYWluIGJlZm9yZSBpdCBpcyBmcmVlZCBieQorICAgIHByZXZpb3VzIGNhbGxlciwgb3RoZXJ3aXNlIGtlcm5lbCB3aWxsIGR1bXAgc3RhY2tzLCBhbmQgdGhlIHJlcXVlc3QKKyAgICBmdW5jdGlvbiBmYWlsLgorICAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgd3JhcHBlZCBieSBvdGhlciBmdW5jdGlvbnMsIG1vc3Qgb2YgdGhlIHVzZXJzIG5lZWQgbm90CisgICAgY2FyZS4KKworCiszLiBCdXQgdGhlcmUgYXJlIHNvbWUgZXhjZXB0aW9ucworICAgIC0gS2VybmVsIHBlcm1pdCB0aGUgaWRlbnRpY2FsIEdQSU8gYmUgcmVxdWVzdGVkIGJvdGggYXMgR1BJTyBhbmQgR1BJTworICAgIGludGVycnV0LgorICAgIFNvbWUgZHJpdmVycywgbGlrZSBncGlvLWtleXMsIG5lZWQgdGhpcyBiZWhhdmlvci4gS2VybmVsIG9ubHkgcHJpbnQgb3V0CisgICAgd2FybmluZyBtZXNzYWdlcyBsaWtlLAorCWJmaW4tZ3BpbzogR1BJTyAyNCBpcyBhbHJlYWR5IHJlc2VydmVkIGJ5IGdwaW8ta2V5czogQlROMCwgYW5kIHlvdSBhcmUKK2NvbmZpZ3VyaW5nIGl0IGFzIElSUSEKKworICAgICAgICBOb3RlOiBDb25zaWRlciB0aGUgY2FzZSB0aGF0LCBpZiB0aGVyZSBhcmUgdHdvIGRyaXZlcnMgbmVlZCB0aGUKKwlpZGVudGljYWwgR1BJTywgb25lIG9mIHRoZW0gdXNlIGl0IGFzIEdQSU8sIHRoZSBvdGhlciB1c2UgaXQgYXMKKwlHUElPIGludGVycnVwdC4gVGhpcyB3aWxsIHJlYWxseSBjYXVzZSByZXNvdXJjZSBjb25mbGljdC4gU28gaWYKKwl0aGVyZSBpcyBhbnkgYWJub3JtYWwgZHJpdmVyIGJlaGF2aW9yLCBwbGVhc2UgY2hlY2sgdGhlIGJmaW4tZ3BpbworCXdhcm5pbmcgbWVzc2FnZXMuCisKKyAgICAtIEtlcm5lbCBwZXJtaXQgdGhlIGlkZW50aWNhbCBHUElPIGJlIHJlcXVlc3RlZCBmcm9tIHRoZSBzYW1lIGRyaXZlciB0d2ljZS4KKworCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9jZ3JvdXBzLnR4dCBiL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9jZ3JvdXBzLnR4dAppbmRleCBkOTAxNGFhLi5lMzNlZTc0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2Nncm91cHMvY2dyb3Vwcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2Nncm91cHMudHh0CkBAIC0yMjcsNyArMjI3LDYgQEAKIGNvbnRhaW5pbmcgdGhlIGZvbGxvd2luZyBmaWxlcyBkZXNjcmliaW5nIHRoYXQgY2dyb3VwOgogCiAgLSB0YXNrczogbGlzdCBvZiB0YXNrcyAoYnkgcGlkKSBhdHRhY2hlZCB0byB0aGF0IGNncm91cAotIC0gcmVsZWFzYWJsZSBmbGFnOiBjZ3JvdXAgY3VycmVudGx5IHJlbW92ZWFibGU/CiAgLSBub3RpZnlfb25fcmVsZWFzZSBmbGFnOiBydW4gdGhlIHJlbGVhc2UgYWdlbnQgb24gZXhpdD8KICAtIHJlbGVhc2VfYWdlbnQ6IHRoZSBwYXRoIHRvIHVzZSBmb3IgcmVsZWFzZSBub3RpZmljYXRpb25zICh0aGlzIGZpbGUKICAgIGV4aXN0cyBpbiB0aGUgdG9wIGNncm91cCBvbmx5KQpAQCAtMzYwLDcgKzM1OSw3IEBACiAKIEluIHRoaXMgZGlyZWN0b3J5IHlvdSBjYW4gZmluZCBzZXZlcmFsIGZpbGVzOgogIyBscwotbm90aWZ5X29uX3JlbGVhc2UgcmVsZWFzYWJsZSB0YXNrcworbm90aWZ5X29uX3JlbGVhc2UgdGFza3MKIChwbHVzIHdoYXRldmVyIGZpbGVzIGFkZGVkIGJ5IHRoZSBhdHRhY2hlZCBzdWJzeXN0ZW1zKQogCiBOb3cgYXR0YWNoIHlvdXIgc2hlbGwgdG8gdGhpcyBjZ3JvdXA6CkBAIC00NzksNyArNDc4LDYgQEAKIGNyZWF0ZSgpIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgZm9yIHRoZSBuZXcgY2dyb3VwKS4KIAogdm9pZCBwcmVfZGVzdHJveShzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsIHN0cnVjdCBjZ3JvdXAgKmNncnApOwotKGNncm91cF9tdXRleCBoZWxkIGJ5IGNhbGxlcikKIAogQ2FsbGVkIGJlZm9yZSBjaGVja2luZyB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIGVhY2ggc3Vic3lzdGVtLiBUaGlzIG1heQogYmUgdXNlZnVsIGZvciBzdWJzeXN0ZW1zIHdoaWNoIGhhdmUgc29tZSBleHRyYSByZWZlcmVuY2VzIGV2ZW4gaWYKQEAgLTQ5OCw2ICs0OTYsNyBAQAogCiB2b2lkIGF0dGFjaChzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsIHN0cnVjdCBjZ3JvdXAgKmNncnAsCiAJICAgIHN0cnVjdCBjZ3JvdXAgKm9sZF9jZ3JwLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCisoY2dyb3VwX211dGV4IGhlbGQgYnkgY2FsbGVyKQogCiBDYWxsZWQgYWZ0ZXIgdGhlIHRhc2sgaGFzIGJlZW4gYXR0YWNoZWQgdG8gdGhlIGNncm91cCwgdG8gYWxsb3cgYW55CiBwb3N0LWF0dGFjaG1lbnQgYWN0aXZpdHkgdGhhdCByZXF1aXJlcyBtZW1vcnkgYWxsb2NhdGlvbnMgb3IgYmxvY2tpbmcuCkBAIC01MTEsNiArNTEwLDcgQEAKIENhbGxlZCBkdXJpbmcgdGFzayBleGl0LgogCiBpbnQgcG9wdWxhdGUoc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLCBzdHJ1Y3QgY2dyb3VwICpjZ3JwKQorKGNncm91cF9tdXRleCBoZWxkIGJ5IGNhbGxlcikKIAogQ2FsbGVkIGFmdGVyIGNyZWF0aW9uIG9mIGEgY2dyb3VwIHRvIGFsbG93IGEgc3Vic3lzdGVtIHRvIHBvcHVsYXRlCiB0aGUgY2dyb3VwIGRpcmVjdG9yeSB3aXRoIGZpbGUgZW50cmllcy4gIFRoZSBzdWJzeXN0ZW0gc2hvdWxkIG1ha2UKQEAgLTUyMCw2ICs1MjAsNyBAQAogYWx3YXlzIGhhbmRsZWQgd2VsbC4KIAogdm9pZCBwb3N0X2Nsb25lKHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcywgc3RydWN0IGNncm91cCAqY2dycCkKKyhjZ3JvdXBfbXV0ZXggaGVsZCBieSBjYWxsZXIpCiAKIENhbGxlZCBhdCB0aGUgZW5kIG9mIGNncm91cF9jbG9uZSgpIHRvIGRvIGFueSBwYXJhbWF0ZXIKIGluaXRpYWxpemF0aW9uIHdoaWNoIG1pZ2h0IGJlIHJlcXVpcmVkIGJlZm9yZSBhIHRhc2sgY291bGQgYXR0YWNoLiAgRm9yCkBAIC01MjcsNyArNTI4LDcgQEAKIHVwLgogCiB2b2lkIGJpbmQoc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLCBzdHJ1Y3QgY2dyb3VwICpyb290KQotKGNncm91cF9tdXRleCBoZWxkIGJ5IGNhbGxlcikKKyhjZ3JvdXBfbXV0ZXggYW5kIHNzLT5oaWVyYXJjaHlfbXV0ZXggaGVsZCBieSBjYWxsZXIpCiAKIENhbGxlZCB3aGVuIGEgY2dyb3VwIHN1YnN5c3RlbSBpcyByZWJvdW5kIHRvIGEgZGlmZmVyZW50IGhpZXJhcmNoeQogYW5kIHJvb3QgY2dyb3VwLiBDdXJyZW50bHkgdGhpcyB3aWxsIG9ubHkgaW52b2x2ZSBtb3ZlbWVudCBiZXR3ZWVuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NvbnRyb2xsZXJzL21lbWNnX3Rlc3QudHh0IGIvRG9jdW1lbnRhdGlvbi9jb250cm9sbGVycy9tZW1jZ190ZXN0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGQ0ZDNlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9jb250cm9sbGVycy9tZW1jZ190ZXN0LnR4dApAQCAtMCwwICsxLDM0MiBAQAorTWVtb3J5IFJlc291cmNlIENvbnRyb2xsZXIoTWVtY2cpICBJbXBsZW1lbnRhdGlvbiBNZW1vLgorTGFzdCBVcGRhdGVkOiAyMDA4LzEyLzE1CitCYXNlIEtlcm5lbCBWZXJzaW9uOiBiYXNlZCBvbiAyLjYuMjgtcmM4LW1tLgorCitCZWNhdXNlIFZNIGlzIGdldHRpbmcgY29tcGxleCAob25lIG9mIHJlYXNvbnMgaXMgbWVtY2cuLi4pLCBtZW1jZydzIGJlaGF2aW9yCitpcyBjb21wbGV4LiBUaGlzIGlzIGEgZG9jdW1lbnQgZm9yIG1lbWNnJ3MgaW50ZXJuYWwgYmVoYXZpb3IuCitQbGVhc2Ugbm90ZSB0aGF0IGltcGxlbWVudGF0aW9uIGRldGFpbHMgY2FuIGJlIGNoYW5nZWQuCisKKygqKSBUb3BpY3Mgb24gQVBJIHNob3VsZCBiZSBpbiBEb2N1bWVudGF0aW9uL2NvbnRyb2xsZXJzL21lbW9yeS50eHQpCisKKzAuIEhvdyB0byByZWNvcmQgdXNhZ2UgPworICAgMiBvYmplY3RzIGFyZSB1c2VkLgorCisgICBwYWdlX2Nncm91cCAuLi4uYW4gb2JqZWN0IHBlciBwYWdlLgorCUFsbG9jYXRlZCBhdCBib290IG9yIG1lbW9yeSBob3RwbHVnLiBGcmVlZCBhdCBtZW1vcnkgaG90IHJlbW92YWwuCisKKyAgIHN3YXBfY2dyb3VwIC4uLiBhbiBlbnRyeSBwZXIgc3dwX2VudHJ5LgorCUFsbG9jYXRlZCBhdCBzd2Fwb24oKS4gRnJlZWQgYXQgc3dhcG9mZigpLgorCisgICBUaGUgcGFnZV9jZ3JvdXAgaGFzIFVTRUQgYml0IGFuZCBkb3VibGUgY291bnQgYWdhaW5zdCBhIHBhZ2VfY2dyb3VwIG5ldmVyCisgICBvY2N1cnMuIHN3YXBfY2dyb3VwIGlzIHVzZWQgb25seSB3aGVuIGEgY2hhcmdlZCBwYWdlIGlzIHN3YXBwZWQtb3V0LgorCisxLiBDaGFyZ2UKKworICAgYSBwYWdlL3N3cF9lbnRyeSBtYXkgYmUgY2hhcmdlZCAodXNhZ2UgKz0gUEFHRV9TSVpFKSBhdAorCisJbWVtX2Nncm91cF9uZXdwYWdlX2NoYXJnZSgpCisJICBDYWxsZWQgYXQgbmV3IHBhZ2UgZmF1bHQgYW5kIENvcHktT24tV3JpdGUuCisKKwltZW1fY2dyb3VwX3RyeV9jaGFyZ2Vfc3dhcGluKCkKKwkgIENhbGxlZCBhdCBkb19zd2FwX3BhZ2UoKSAocGFnZSBmYXVsdCBvbiBzd2FwIGVudHJ5KSBhbmQgc3dhcG9mZi4KKwkgIEZvbGxvd2VkIGJ5IGNoYXJnZS1jb21taXQtY2FuY2VsIHByb3RvY29sLiAoV2l0aCBzd2FwIGFjY291bnRpbmcpCisJICBBdCBjb21taXQsIGEgY2hhcmdlIHJlY29yZGVkIGluIHN3YXBfY2dyb3VwIGlzIHJlbW92ZWQuCisKKwltZW1fY2dyb3VwX2NhY2hlX2NoYXJnZSgpCisJICBDYWxsZWQgYXQgYWRkX3RvX3BhZ2VfY2FjaGUoKQorCisJbWVtX2Nncm91cF9jYWNoZV9jaGFyZ2Vfc3dhcGluKCkKKwkgIENhbGxlZCBhdCBzaG1lbSdzIHN3YXBpbi4KKworCW1lbV9jZ3JvdXBfcHJlcGFyZV9taWdyYXRpb24oKQorCSAgQ2FsbGVkIGJlZm9yZSBtaWdyYXRpb24uICJleHRyYSIgY2hhcmdlIGlzIGRvbmUgYW5kIGZvbGxvd2VkIGJ5CisJICBjaGFyZ2UtY29tbWl0LWNhbmNlbCBwcm90b2NvbC4KKwkgIEF0IGNvbW1pdCwgY2hhcmdlIGFnYWluc3Qgb2xkcGFnZSBvciBuZXdwYWdlIHdpbGwgYmUgY29tbWl0dGVkLgorCisyLiBVbmNoYXJnZQorICBhIHBhZ2Uvc3dwX2VudHJ5IG1heSBiZSB1bmNoYXJnZWQgKHVzYWdlIC09IFBBR0VfU0laRSkgYnkKKworCW1lbV9jZ3JvdXBfdW5jaGFyZ2VfcGFnZSgpCisJICBDYWxsZWQgd2hlbiBhbiBhbm9ueW1vdXMgcGFnZSBpcyBmdWxseSB1bm1hcHBlZC4gSS5lLiwgbWFwY291bnQgZ29lcworCSAgdG8gMC4gSWYgdGhlIHBhZ2UgaXMgU3dhcENhY2hlLCB1bmNoYXJnZSBpcyBkZWxheWVkIHVudGlsCisJICBtZW1fY2dyb3VwX3VuY2hhcmdlX3N3YXBjYWNoZSgpLgorCisJbWVtX2Nncm91cF91bmNoYXJnZV9jYWNoZV9wYWdlKCkKKwkgIENhbGxlZCB3aGVuIGEgcGFnZS1jYWNoZSBpcyBkZWxldGVkIGZyb20gcmFkaXgtdHJlZS4gSWYgdGhlIHBhZ2UgaXMKKwkgIFN3YXBDYWNoZSwgdW5jaGFyZ2UgaXMgZGVsYXllZCB1bnRpbCBtZW1fY2dyb3VwX3VuY2hhcmdlX3N3YXBjYWNoZSgpLgorCisJbWVtX2Nncm91cF91bmNoYXJnZV9zd2FwY2FjaGUoKQorCSAgQ2FsbGVkIHdoZW4gU3dhcENhY2hlIGlzIHJlbW92ZWQgZnJvbSByYWRpeC10cmVlLiBUaGUgY2hhcmdlIGl0c2VsZgorCSAgaXMgbW92ZWQgdG8gc3dhcF9jZ3JvdXAuIChJZiBtZW0rc3dhcCBjb250cm9sbGVyIGlzIGRpc2FibGVkLCBubworCSAgY2hhcmdlIHRvIHN3YXAgb2NjdXJzLikKKworCW1lbV9jZ3JvdXBfdW5jaGFyZ2Vfc3dhcCgpCisJICBDYWxsZWQgd2hlbiBzd3BfZW50cnkncyByZWZjbnQgZ29lcyBkb3duIHRvIDAuIEEgY2hhcmdlIGFnYWluc3Qgc3dhcAorCSAgZGlzYXBwZWFycy4KKworCW1lbV9jZ3JvdXBfZW5kX21pZ3JhdGlvbihvbGQsIG5ldykKKwlBdCBzdWNjZXNzIG9mIG1pZ3JhdGlvbiBvbGQgaXMgdW5jaGFyZ2VkIChpZiBuZWNlc3NhcnkpLCBhIGNoYXJnZQorCXRvIG5ldyBwYWdlIGlzIGNvbW1pdHRlZC4gQXQgZmFpbHVyZSwgY2hhcmdlIHRvIG9sZCBwYWdlIGlzIGNvbW1pdHRlZC4KKworMy4gY2hhcmdlLWNvbW1pdC1jYW5jZWwKKwlJbiBzb21lIGNhc2UsIHdlIGNhbid0IGtub3cgdGhpcyAiY2hhcmdlIiBpcyB2YWxpZCBvciBub3QgYXQgY2hhcmdpbmcKKwkoYmVjYXVzZSBvZiByYWNlcykuCisJVG8gaGFuZGxlIHN1Y2ggY2FzZSwgdGhlcmUgYXJlIGNoYXJnZS1jb21taXQtY2FuY2VsIGZ1bmN0aW9ucy4KKwkJbWVtX2Nncm91cF90cnlfY2hhcmdlX1hYWAorCQltZW1fY2dyb3VwX2NvbW1pdF9jaGFyZ2VfWFhYCisJCW1lbV9jZ3JvdXBfY2FuY2VsX2NoYXJnZV9YWFgKKwl0aGVzZSBhcmUgdXNlZCBpbiBzd2FwLWluIGFuZCBtaWdyYXRpb24uCisKKwlBdCB0cnlfY2hhcmdlKCksIHRoZXJlIGFyZSBubyBmbGFncyB0byBzYXkgInRoaXMgcGFnZSBpcyBjaGFyZ2VkIi4KKwlhdCB0aGlzIHBvaW50LCB1c2FnZSArPSBQQUdFX1NJWkUuCisKKwlBdCBjb21taXQoKSwgdGhlIGZ1bmN0aW9uIGNoZWNrcyB0aGUgcGFnZSBzaG91bGQgYmUgY2hhcmdlZCBvciBub3QKKwlhbmQgc2V0IGZsYWdzIG9yIGF2b2lkIGNoYXJnaW5nLih1c2FnZSAtPSBQQUdFX1NJWkUpCisKKwlBdCBjYW5jZWwoKSwgc2ltcGx5IHVzYWdlIC09IFBBR0VfU0laRS4KKworVW5kZXIgYmVsb3cgZXhwbGFuYXRpb24sIHdlIGFzc3VtZSBDT05GSUdfTUVNX1JFU19DVFJMX1NXQVA9eS4KKworNC4gQW5vbnltb3VzCisJQW5vbnltb3VzIHBhZ2UgaXMgbmV3bHkgYWxsb2NhdGVkIGF0CisJCSAgLSBwYWdlIGZhdWx0IGludG8gTUFQX0FOT05ZTU9VUyBtYXBwaW5nLgorCQkgIC0gQ29weS1Pbi1Xcml0ZS4KKyAJSXQgaXMgY2hhcmdlZCByaWdodCBhZnRlciBpdCdzIGFsbG9jYXRlZCBiZWZvcmUgZG9pbmcgYW55IHBhZ2UgdGFibGUKKwlyZWxhdGVkIG9wZXJhdGlvbnMuIE9mIGNvdXJzZSwgaXQncyB1bmNoYXJnZWQgd2hlbiBhbm90aGVyIHBhZ2UgaXMgdXNlZAorCWZvciB0aGUgZmF1bHQgYWRkcmVzcy4KKworCUF0IGZyZWVpbmcgYW5vbnltb3VzIHBhZ2UgKGJ5IGV4aXQoKSBvciBtdW5tYXAoKSksIHphcF9wdGUoKSBpcyBjYWxsZWQKKwlhbmQgcGFnZXMgZm9yIHB0ZXMgYXJlIGZyZWVkIG9uZSBieSBvbmUuKHNlZSBtbS9tZW1vcnkuYykuIFVuY2hhcmdlcworCWFyZSBkb25lIGF0IHBhZ2VfcmVtb3ZlX3JtYXAoKSB3aGVuIHBhZ2VfbWFwY291bnQoKSBnb2VzIGRvd24gdG8gMC4KKworCUFub3RoZXIgcGFnZSBmcmVlaW5nIGlzIGJ5IHBhZ2UtcmVjbGFpbSAodm1zY2FuLmMpIGFuZCBhbm9ueW1vdXMKKwlwYWdlcyBhcmUgc3dhcHBlZCBvdXQuIEluIHRoaXMgY2FzZSwgdGhlIHBhZ2UgaXMgbWFya2VkIGFzCisJUGFnZVN3YXBDYWNoZSgpLiB1bmNoYXJnZSgpIHJvdXRpbmUgZG9lc24ndCB1bmNoYXJnZSB0aGUgcGFnZSBtYXJrZWQKKwlhcyBTd2FwQ2FjaGUoKS4gSXQncyBkZWxheWVkIHVudGlsIF9fZGVsZXRlX2Zyb21fc3dhcF9jYWNoZSgpLgorCisJNC4xIFN3YXAtaW4uCisJQXQgc3dhcC1pbiwgdGhlIHBhZ2UgaXMgdGFrZW4gZnJvbSBzd2FwLWNhY2hlLiBUaGVyZSBhcmUgMiBjYXNlcy4KKworCShhKSBJZiB0aGUgU3dhcENhY2hlIGlzIG5ld2x5IGFsbG9jYXRlZCBhbmQgcmVhZCwgaXQgaGFzIG5vIGNoYXJnZXMuCisJKGIpIElmIHRoZSBTd2FwQ2FjaGUgaGFzIGJlZW4gbWFwcGVkIGJ5IHByb2Nlc3NlcywgaXQgaGFzIGJlZW4KKwkgICAgY2hhcmdlZCBhbHJlYWR5LgorCisJVGhpcyBzd2FwLWluIGlzIG9uZSBvZiB0aGUgbW9zdCBjb21wbGljYXRlZCB3b3JrLiBJbiBkb19zd2FwX3BhZ2UoKSwKKwlmb2xsb3dpbmcgZXZlbnRzIG9jY3VyIHdoZW4gcHRlIGlzIHVuY2hhbmdlZC4KKworCSgxKSB0aGUgcGFnZSAoU3dhcENhY2hlKSBpcyBsb29rZWQgdXAuCisJKDIpIGxvY2tfcGFnZSgpCisJKDMpIHRyeV9jaGFyZ2Vfc3dhcGluKCkKKwkoNCkgcmV1c2Vfc3dhcF9wYWdlKCkgKG1heSBjYWxsIGRlbGV0ZV9zd2FwX2NhY2hlKCkpCisJKDUpIGNvbW1pdF9jaGFyZ2Vfc3dhcGluKCkKKwkoNikgc3dhcF9mcmVlKCkuCisKKwlDb25zaWRlcmluZyBmb2xsb3dpbmcgc2l0dWF0aW9uIGZvciBleGFtcGxlLgorCisJKEEpIFRoZSBwYWdlIGhhcyBub3QgYmVlbiBjaGFyZ2VkIGJlZm9yZSAoMikgYW5kIHJldXNlX3N3YXBfcGFnZSgpCisJICAgIGRvZXNuJ3QgY2FsbCBkZWxldGVfZnJvbV9zd2FwX2NhY2hlKCkuCisJKEIpIFRoZSBwYWdlIGhhcyBub3QgYmVlbiBjaGFyZ2VkIGJlZm9yZSAoMikgYW5kIHJldXNlX3N3YXBfcGFnZSgpCisJICAgIGNhbGxzIGRlbGV0ZV9mcm9tX3N3YXBfY2FjaGUoKS4KKwkoQykgVGhlIHBhZ2UgaGFzIGJlZW4gY2hhcmdlZCBiZWZvcmUgKDIpIGFuZCByZXVzZV9zd2FwX3BhZ2UoKSBkb2Vzbid0CisJICAgIGNhbGwgZGVsZXRlX2Zyb21fc3dhcF9jYWNoZSgpLgorCShEKSBUaGUgcGFnZSBoYXMgYmVlbiBjaGFyZ2VkIGJlZm9yZSAoMikgYW5kIHJldXNlX3N3YXBfcGFnZSgpIGNhbGxzCisJICAgIGRlbGV0ZV9mcm9tX3N3YXBfY2FjaGUoKS4KKworCSAgICBtZW1vcnkudXNhZ2UvbWVtc3cudXNhZ2UgY2hhbmdlcyB0byB0aGlzIHBhZ2Uvc3dwX2VudHJ5IHdpbGwgYmUKKwkgQ2FzZSAgICAgICAgICAoQSkgICAgICAoQikgICAgICAgKEMpICAgICAoRCkKKyAgICAgICAgIEV2ZW50CisgICAgICAgQmVmb3JlICgyKSAgICAgMC8gMSAgICAgMC8gMSAgICAgIDEvIDEgICAgMS8gMQorICAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAoMykgICAgICAgICsxLysxICAgICsxLysxICAgICArMS8rMSAgICsxLysxCisgICAgICAgICAgKDQpICAgICAgICAgIC0gICAgICAgMC8gMCAgICAgICAtICAgICAtMS8gMAorICAgICAgICAgICg1KSAgICAgICAgIDAvLTEgICAgIDAvIDAgICAgIC0xLy0xICAgIDAvIDAKKyAgICAgICAgICAoNikgICAgICAgICAgLSAgICAgICAwLy0xICAgICAgIC0gICAgICAwLy0xCisgICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgIFJlc3VsdCAgICAgICAgIDEvIDEgICAgIDEvIDEgICAgICAxLyAxICAgIDEvIDEKKworICAgICAgIEluIGFueSBjYXNlcywgY2hhcmdlcyB0byB0aGlzIHBhZ2Ugc2hvdWxkIGJlIDEvIDEuCisKKwk0LjIgU3dhcC1vdXQuCisJQXQgc3dhcC1vdXQsIHR5cGljYWwgc3RhdGUgdHJhbnNpdGlvbiBpcyBiZWxvdy4KKworCShhKSBhZGQgdG8gc3dhcCBjYWNoZS4gKG1hcmtlZCBhcyBTd2FwQ2FjaGUpCisJICAgIHN3cF9lbnRyeSdzIHJlZmNudCArPSAxLgorCShiKSBmdWxseSB1bm1hcHBlZC4KKwkgICAgc3dwX2VudHJ5J3MgcmVmY250ICs9ICMgb2YgcHRlcy4KKwkoYykgd3JpdGUgYmFjayB0byBzd2FwLgorCShkKSBkZWxldGUgZnJvbSBzd2FwIGNhY2hlLiAocmVtb3ZlIGZyb20gU3dhcENhY2hlKQorCSAgICBzd3BfZW50cnkncyByZWZjbnQgLT0gMS4KKworCisJQXQgKGIpLCB0aGUgcGFnZSBpcyBtYXJrZWQgYXMgU3dhcENhY2hlIGFuZCBub3QgdW5jaGFyZ2VkLgorCUF0IChkKSwgdGhlIHBhZ2UgaXMgcmVtb3ZlZCBmcm9tIFN3YXBDYWNoZSBhbmQgYSBjaGFyZ2UgaW4gcGFnZV9jZ3JvdXAKKwlpcyBtb3ZlZCB0byBzd2FwX2Nncm91cC4KKworCUZpbmFsbHksIGF0IHRhc2sgZXhpdCwKKwkoZSkgemFwX3B0ZSgpIGlzIGNhbGxlZCBhbmQgc3dwX2VudHJ5J3MgcmVmY250IC09MSAtPiAwLgorCUhlcmUsIGEgY2hhcmdlIGluIHN3YXBfY2dyb3VwIGRpc2FwcGVhcnMuCisKKzUuIFBhZ2UgQ2FjaGUKKyAgIAlQYWdlIENhY2hlIGlzIGNoYXJnZWQgYXQKKwktIGFkZF90b19wYWdlX2NhY2hlX2xvY2tlZCgpLgorCisJdW5jaGFyZ2VkIGF0CisJLSBfX3JlbW92ZV9mcm9tX3BhZ2VfY2FjaGUoKS4KKworCVRoZSBsb2dpYyBpcyB2ZXJ5IGNsZWFyLiAoQWJvdXQgbWlncmF0aW9uLCBzZWUgYmVsb3cpCisJTm90ZTogX19yZW1vdmVfZnJvbV9wYWdlX2NhY2hlKCkgaXMgY2FsbGVkIGJ5IHJlbW92ZV9mcm9tX3BhZ2VfY2FjaGUoKQorCWFuZCBfX3JlbW92ZV9tYXBwaW5nKCkuCisKKzYuIFNobWVtKHRtcGZzKSBQYWdlIENhY2hlCisJTWVtY2cncyBjaGFyZ2UvdW5jaGFyZ2UgaGF2ZSBzcGVjaWFsIGhhbmRsZXJzIG9mIHNobWVtLiBUaGUgYmVzdCB3YXkKKwl0byB1bmRlcnN0YW5kIHNobWVtJ3MgcGFnZSBzdGF0ZSB0cmFuc2l0aW9uIGlzIHRvIHJlYWQgbW0vc2htZW0uYy4KKwlCdXQgYnJpZWYgZXhwbGFuYXRpb24gb2YgdGhlIGJlaGF2aW9yIG9mIG1lbWNnIGFyb3VuZCBzaG1lbSB3aWxsIGJlCisJaGVscGZ1bCB0byB1bmRlcnN0YW5kIHRoZSBsb2dpYy4KKworCVNobWVtJ3MgcGFnZSAoanVzdCBsZWFmIHBhZ2UsIG5vdCBkaXJlY3QvaW5kaXJlY3QgYmxvY2spIGNhbiBiZSBvbgorCQktIHJhZGl4LXRyZWUgb2Ygc2htZW0ncyBpbm9kZS4KKwkJLSBTd2FwQ2FjaGUuCisJCS0gQm90aCBvbiByYWRpeC10cmVlIGFuZCBTd2FwQ2FjaGUuIFRoaXMgaGFwcGVucyBhdCBzd2FwLWluCisJCSAgYW5kIHN3YXAtb3V0LAorCisJSXQncyBjaGFyZ2VkIHdoZW4uLi4KKwktIEEgbmV3IHBhZ2UgaXMgYWRkZWQgdG8gc2htZW0ncyByYWRpeC10cmVlLgorCS0gQSBzd3AgcGFnZSBpcyByZWFkLiAobW92ZSBhIGNoYXJnZSBmcm9tIHN3YXBfY2dyb3VwIHRvIHBhZ2VfY2dyb3VwKQorCUl0J3MgdW5jaGFyZ2VkIHdoZW4KKwktIEEgcGFnZSBpcyByZW1vdmVkIGZyb20gcmFkaXgtdHJlZSBhbmQgbm90IFN3YXBDYWNoZS4KKwktIFdoZW4gU3dhcENhY2hlIGlzIHJlbW92ZWQsIGEgY2hhcmdlIGlzIG1vdmVkIHRvIHN3YXBfY2dyb3VwLgorCS0gV2hlbiBzd3BfZW50cnkncyByZWZjbnQgZ29lcyBkb3duIHRvIDAsIGEgY2hhcmdlIGluIHN3YXBfY2dyb3VwCisJICBkaXNhcHBlYXJzLgorCis3LiBQYWdlIE1pZ3JhdGlvbgorICAgCU9uZSBvZiB0aGUgbW9zdCBjb21wbGljYXRlZCBmdW5jdGlvbnMgaXMgcGFnZS1taWdyYXRpb24taGFuZGxlci4KKwlNZW1jZyBoYXMgMiByb3V0aW5lcy4gQXNzdW1lIHRoYXQgd2UgYXJlIG1pZ3JhdGluZyBhIHBhZ2UncyBjb250ZW50cworCWZyb20gT0xEUEFHRSB0byBORVdQQUdFLgorCisJVXN1YWwgbWlncmF0aW9uIGxvZ2ljIGlzLi4KKwkoYSkgcmVtb3ZlIHRoZSBwYWdlIGZyb20gTFJVLgorCShiKSBhbGxvY2F0ZSBORVdQQUdFIChtaWdyYXRpb24gdGFyZ2V0KQorCShjKSBsb2NrIGJ5IGxvY2tfcGFnZSgpLgorCShkKSB1bm1hcCBhbGwgbWFwcGluZ3MuCisJKGUtMSkgSWYgbmVjZXNzYXJ5LCByZXBsYWNlIGVudHJ5IGluIHJhZGl4LXRyZWUuCisJKGUtMikgbW92ZSBjb250ZW50cyBvZiBhIHBhZ2UuCisJKGYpIG1hcCBhbGwgbWFwcGluZ3MgYWdhaW4uCisJKGcpIHB1c2hiYWNrIHRoZSBwYWdlIHRvIExSVS4KKwkoLSkgT0xEUEFHRSB3aWxsIGJlIGZyZWVkLgorCisJQmVmb3JlIChnKSwgbWVtY2cgc2hvdWxkIGNvbXBsZXRlIGFsbCBuZWNlc3NhcnkgY2hhcmdlL3VuY2hhcmdlIHRvCisJTkVXUEFHRS9PTERQQUdFLgorCisJVGhlIHBvaW50IGlzLi4uLgorCS0gSWYgT0xEUEFHRSBpcyBhbm9ueW1vdXMsIGFsbCBjaGFyZ2VzIHdpbGwgYmUgZHJvcHBlZCBhdCAoZCkgYmVjYXVzZQorICAgICAgICAgIHRyeV90b191bm1hcCgpIGRyb3BzIGFsbCBtYXBjb3VudCBhbmQgdGhlIHBhZ2Ugd2lsbCBub3QgYmUKKwkgIFN3YXBDYWNoZS4KKworCS0gSWYgT0xEUEFHRSBpcyBTd2FwQ2FjaGUsIGNoYXJnZXMgd2lsbCBiZSBrZXB0IGF0IChnKSBiZWNhdXNlCisJICBfX2RlbGV0ZV9mcm9tX3N3YXBfY2FjaGUoKSBpc24ndCBjYWxsZWQgYXQgKGUtMSkKKworCS0gSWYgT0xEUEFHRSBpcyBwYWdlLWNhY2hlLCBjaGFyZ2VzIHdpbGwgYmUga2VwdCBhdCAoZykgYmVjYXVzZQorCSAgcmVtb3ZlX2Zyb21fc3dhcF9jYWNoZSgpIGlzbid0IGNhbGxlZCBhdCAoZS0xKQorCisJbWVtY2cgcHJvdmlkZXMgZm9sbG93aW5nIGhvb2tzLgorCisJLSBtZW1fY2dyb3VwX3ByZXBhcmVfbWlncmF0aW9uKE9MRFBBR0UpCisJICBDYWxsZWQgYWZ0ZXIgKGIpIHRvIGFjY291bnQgYSBjaGFyZ2UgKHVzYWdlICs9IFBBR0VfU0laRSkgYWdhaW5zdAorCSAgbWVtY2cgd2hpY2ggT0xEUEFHRSBiZWxvbmdzIHRvLgorCisgICAgICAgIC0gbWVtX2Nncm91cF9lbmRfbWlncmF0aW9uKE9MRFBBR0UsIE5FV1BBR0UpCisJICBDYWxsZWQgYWZ0ZXIgKGYpIGJlZm9yZSAoZykuCisJICBJZiBPTERQQUdFIGlzIHVzZWQsIGNvbW1pdCBPTERQQUdFIGFnYWluLiBJZiBPTERQQUdFIGlzIGFscmVhZHkKKwkgIGNoYXJnZWQsIGEgY2hhcmdlIGJ5IHByZXBhcmVfbWlncmF0aW9uKCkgaXMgYXV0b21hdGljYWxseSBjYW5jZWxlZC4KKwkgIElmIE5FV1BBR0UgaXMgdXNlZCwgY29tbWl0IE5FV1BBR0UgYW5kIHVuY2hhcmdlIE9MRFBBR0UuCisKKwkgIEJ1dCB6YXBfcHRlKCkgKGJ5IGV4aXQgb3IgbXVubWFwKSBjYW4gYmUgY2FsbGVkIHdoaWxlIG1pZ3JhdGlvbiwKKwkgIHdlIGhhdmUgdG8gY2hlY2sgaWYgT0xEUEFHRS9ORVdQQUdFIGlzIGEgdmFsaWQgcGFnZSBhZnRlciBjb21taXQoKS4KKworOC4gTFJVCisgICAgICAgIEVhY2ggbWVtY2cgaGFzIGl0cyBvd24gcHJpdmF0ZSBMUlUuIE5vdywgaXQncyBoYW5kbGluZyBpcyB1bmRlciBnbG9iYWwKKwlWTSdzIGNvbnRyb2wgKG1lYW5zIHRoYXQgaXQncyBoYW5kbGVkIHVuZGVyIGdsb2JhbCB6b25lLT5scnVfbG9jaykuCisJQWxtb3N0IGFsbCByb3V0aW5lcyBhcm91bmQgbWVtY2cncyBMUlUgaXMgY2FsbGVkIGJ5IGdsb2JhbCBMUlUncworCWxpc3QgbWFuYWdlbWVudCBmdW5jdGlvbnMgdW5kZXIgem9uZS0+bHJ1X2xvY2soKS4KKworCUEgc3BlY2lhbCBmdW5jdGlvbiBpcyBtZW1fY2dyb3VwX2lzb2xhdGVfcGFnZXMoKS4gVGhpcyBzY2FucworCW1lbWNnJ3MgcHJpdmF0ZSBMUlUgYW5kIGNhbGwgX19pc29sYXRlX2xydV9wYWdlKCkgdG8gZXh0cmFjdCBhIHBhZ2UKKwlmcm9tIExSVS4KKwkoQnkgX19pc29sYXRlX2xydV9wYWdlKCksIHRoZSBwYWdlIGlzIHJlbW92ZWQgZnJvbSBib3RoIG9mIGdsb2JhbCBhbmQKKwkgcHJpdmF0ZSBMUlUuKQorCisKKzkuIFR5cGljYWwgVGVzdHMuCisKKyBUZXN0cyBmb3IgcmFjeSBjYXNlcy4KKworIDkuMSBTbWFsbCBsaW1pdCB0byBtZW1jZy4KKwlXaGVuIHlvdSBkbyB0ZXN0IHRvIGRvIHJhY3kgY2FzZSwgaXQncyBnb29kIHRlc3QgdG8gc2V0IG1lbWNnJ3MgbGltaXQKKwl0byBiZSB2ZXJ5IHNtYWxsIHJhdGhlciB0aGFuIEdCLiBNYW55IHJhY2VzIGZvdW5kIGluIHRoZSB0ZXN0IHVuZGVyCisJeEtCIG9yIHh4TUIgbGltaXRzLgorCShNZW1vcnkgYmVoYXZpb3IgdW5kZXIgR0IgYW5kIE1lbW9yeSBiZWhhdmlvciB1bmRlciBNQiBzaG93cyB2ZXJ5CisJIGRpZmZlcmVudCBzaXR1YXRpb24uKQorCisgOS4yIFNobWVtCisJSGlzdG9yaWNhbGx5LCBtZW1jZydzIHNobWVtIGhhbmRsaW5nIHdhcyBwb29yIGFuZCB3ZSBzYXcgc29tZSBhbW91bnQKKwlvZiB0cm91YmxlcyBoZXJlLiBUaGlzIGlzIGJlY2F1c2Ugc2htZW0gaXMgcGFnZS1jYWNoZSBidXQgY2FuIGJlCisJU3dhcENhY2hlLiBUZXN0IHdpdGggc2htZW0vdG1wZnMgaXMgYWx3YXlzIGdvb2QgdGVzdC4KKworIDkuMyBNaWdyYXRpb24KKwlGb3IgTlVNQSwgbWlncmF0aW9uIGlzIGFuIGFub3RoZXIgc3BlY2lhbCBjYXNlLiBUbyBkbyBlYXN5IHRlc3QsIGNwdXNldAorCWlzIHVzZWZ1bC4gRm9sbG93aW5nIGlzIGEgc2FtcGxlIHNjcmlwdCB0byBkbyBtaWdyYXRpb24uCisKKwltb3VudCAtdCBjZ3JvdXAgLW8gY3B1c2V0IG5vbmUgL29wdC9jcHVzZXQKKworCW1rZGlyIC9vcHQvY3B1c2V0LzAxCisJZWNobyAxID4gL29wdC9jcHVzZXQvMDEvY3B1c2V0LmNwdXMKKwllY2hvIDAgPiAvb3B0L2NwdXNldC8wMS9jcHVzZXQubWVtcworCWVjaG8gMSA+IC9vcHQvY3B1c2V0LzAxL2NwdXNldC5tZW1vcnlfbWlncmF0ZQorCW1rZGlyIC9vcHQvY3B1c2V0LzAyCisJZWNobyAxID4gL29wdC9jcHVzZXQvMDIvY3B1c2V0LmNwdXMKKwllY2hvIDEgPiAvb3B0L2NwdXNldC8wMi9jcHVzZXQubWVtcworCWVjaG8gMSA+IC9vcHQvY3B1c2V0LzAyL2NwdXNldC5tZW1vcnlfbWlncmF0ZQorCisJSW4gYWJvdmUgc2V0LCB3aGVuIHlvdSBtb3ZlcyBhIHRhc2sgZnJvbSAwMSB0byAwMiwgcGFnZSBtaWdyYXRpb24gdG8KKwlub2RlIDAgdG8gbm9kZSAxIHdpbGwgb2NjdXIuIEZvbGxvd2luZyBpcyBhIHNjcmlwdCB0byBtaWdyYXRlIGFsbAorCXVuZGVyIGNwdXNldC4KKwktLQorCW1vdmVfdGFzaygpCisJeworCWZvciBwaWQgaW4gJDEKKyAgICAgICAgZG8KKyAgICAgICAgICAgICAgICAvYmluL2VjaG8gJHBpZCA+JDIvdGFza3MgMj4vZGV2L251bGwKKwkJZWNobyAtbiAkcGlkCisJCWVjaG8gLW4gIiAiCisgICAgICAgIGRvbmUKKwllY2hvIEVORAorCX0KKworCUcxX1RBU0s9YGNhdCAke0cxfS90YXNrc2AKKwlHMl9UQVNLPWBjYXQgJHtHMn0vdGFza3NgCisJbW92ZV90YXNrICIke0cxX1RBU0t9IiAke0cyfSAmCisJLS0KKyA5LjQgTWVtb3J5IGhvdHBsdWcuCisJbWVtb3J5IGhvdHBsdWcgdGVzdCBpcyBvbmUgb2YgZ29vZCB0ZXN0LgorCXRvIG9mZmxpbmUgbWVtb3J5LCBkbyBmb2xsb3dpbmcuCisJIyBlY2hvIG9mZmxpbmUgPiAvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS9tZW1vcnlYWFgvc3RhdGUKKwkoWFhYIGlzIHRoZSBwbGFjZSBvZiBtZW1vcnkpCisJVGhpcyBpcyBhbiBlYXN5IHdheSB0byB0ZXN0IHBhZ2UgbWlncmF0aW9uLCB0b28uCisKKyA5LjUgbWtkaXIvcm1kaXIKKwlXaGVuIHVzaW5nIGhpZXJhcmNoeSwgbWtkaXIvcm1kaXIgdGVzdCBzaG91bGQgYmUgZG9uZS4KKwlVc2UgdGVzdHMgbGlrZSB0aGUgZm9sbG93aW5nLgorCisJZWNobyAxID4vb3B0L2Nncm91cC8wMS9tZW1vcnkvdXNlX2hpZXJhcmNoeQorCW1rZGlyIC9vcHQvY2dyb3VwLzAxL2NoaWxkX2EKKwlta2RpciAvb3B0L2Nncm91cC8wMS9jaGlsZF9iCisKKwlzZXQgbGltaXQgdG8gMDEuCisJYWRkIGxpbWl0IHRvIDAxL2NoaWxkX2IKKwlydW4gam9icyB1bmRlciBjaGlsZF9hIGFuZCBjaGlsZF9iCisKKwljcmVhdGUvZGVsZXRlIGZvbGxvd2luZyBncm91cHMgYXQgcmFuZG9tIHdoaWxlIGpvYnMgYXJlIHJ1bm5pbmcuCisJL29wdC9jZ3JvdXAvMDEvY2hpbGRfYS9jaGlsZF9hYQorCS9vcHQvY2dyb3VwLzAxL2NoaWxkX2IvY2hpbGRfYmIKKwkvb3B0L2Nncm91cC8wMS9jaGlsZF9jCisKKwlydW5uaW5nIG5ldyBqb2JzIGluIG5ldyBncm91cCBpcyBhbHNvIGdvb2QuCisKKyA5LjYgTW91bnQgd2l0aCBvdGhlciBzdWJzeXN0ZW1zLgorCU1vdW50aW5nIHdpdGggb3RoZXIgc3Vic3lzdGVtcyBpcyBhIGdvb2QgdGVzdCBiZWNhdXNlIHRoZXJlIGlzIGEKKwlyYWNlIGFuZCBsb2NrIGRlcGVuZGVuY3kgd2l0aCBvdGhlciBjZ3JvdXAgc3Vic3lzdGVtcy4KKworCWV4YW1wbGUpCisJIyBtb3VudCAtdCBjZ3JvdXAgbm9uZSAvY2dyb3VwIC10IGNwdXNldCxtZW1vcnksY3B1LGRldmljZXMKKworCWFuZCBkbyB0YXNrIG1vdmUsIG1rZGlyLCBybWRpciBldGMuLi51bmRlciB0aGlzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jb250cm9sbGVycy9tZW1vcnkudHh0IGIvRG9jdW1lbnRhdGlvbi9jb250cm9sbGVycy9tZW1vcnkudHh0CmluZGV4IDFjMDc1NDcuLmUxNTAxOTYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY29udHJvbGxlcnMvbWVtb3J5LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2NvbnRyb2xsZXJzL21lbW9yeS50eHQKQEAgLTEzNyw3ICsxMzcsMzIgQEAKIHBhZ2Ugd2lsbCBldmVudHVhbGx5IGdldCBjaGFyZ2VkIGZvciBpdCAob25jZSBpdCBpcyB1bmNoYXJnZWQgZnJvbQogdGhlIGNncm91cCB0aGF0IGJyb3VnaHQgaXQgaW4gLS0gdGhpcyB3aWxsIGhhcHBlbiBvbiBtZW1vcnkgcHJlc3N1cmUpLgogCi0yLjQgUmVjbGFpbQorRXhjZXB0aW9uOiBJZiBDT05GSUdfQ0dST1VQX0NHUk9VUF9NRU1fUkVTX0NUTFJfU1dBUCBpcyBub3QgdXNlZC4uCitXaGVuIHlvdSBkbyBzd2Fwb2ZmIGFuZCBtYWtlIHN3YXBwZWQtb3V0IHBhZ2VzIG9mIHNobWVtKHRtcGZzKSB0bworYmUgYmFja2VkIGludG8gbWVtb3J5IGluIGZvcmNlLCBjaGFyZ2VzIGZvciBwYWdlcyBhcmUgYWNjb3VudGVkIGFnYWluc3QgdGhlCitjYWxsZXIgb2Ygc3dhcG9mZiByYXRoZXIgdGhhbiB0aGUgdXNlcnMgb2Ygc2htZW0uCisKKworMi40IFN3YXAgRXh0ZW5zaW9uIChDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUl9TV0FQKQorU3dhcCBFeHRlbnNpb24gYWxsb3dzIHlvdSB0byByZWNvcmQgY2hhcmdlIGZvciBzd2FwLiBBIHN3YXBwZWQtaW4gcGFnZSBpcworY2hhcmdlZCBiYWNrIHRvIG9yaWdpbmFsIHBhZ2UgYWxsb2NhdG9yIGlmIHBvc3NpYmxlLgorCitXaGVuIHN3YXAgaXMgYWNjb3VudGVkLCBmb2xsb3dpbmcgZmlsZXMgYXJlIGFkZGVkLgorIC0gbWVtb3J5Lm1lbXN3LnVzYWdlX2luX2J5dGVzLgorIC0gbWVtb3J5Lm1lbXN3LmxpbWl0X2luX2J5dGVzLgorCit1c2FnZSBvZiBtZW0rc3dhcCBpcyBsaW1pdGVkIGJ5IG1lbXN3LmxpbWl0X2luX2J5dGVzLgorCitOb3RlOiB3aHkgJ21lbStzd2FwJyByYXRoZXIgdGhhbiBzd2FwLgorVGhlIGdsb2JhbCBMUlUoa3N3YXBkKSBjYW4gc3dhcCBvdXQgYXJiaXRyYXJ5IHBhZ2VzLiBTd2FwLW91dCBtZWFucwordG8gbW92ZSBhY2NvdW50IGZyb20gbWVtb3J5IHRvIHN3YXAuLi50aGVyZSBpcyBubyBjaGFuZ2UgaW4gdXNhZ2Ugb2YKK21lbStzd2FwLgorCitJbiBvdGhlciB3b3Jkcywgd2hlbiB3ZSB3YW50IHRvIGxpbWl0IHRoZSB1c2FnZSBvZiBzd2FwIHdpdGhvdXQgYWZmZWN0aW5nCitnbG9iYWwgTFJVLCBtZW0rc3dhcCBsaW1pdCBpcyBiZXR0ZXIgdGhhbiBqdXN0IGxpbWl0aW5nIHN3YXAgZnJvbSBPUyBwb2ludAorb2Ygdmlldy4KKworMi41IFJlY2xhaW0KIAogRWFjaCBjZ3JvdXAgbWFpbnRhaW5zIGEgcGVyIGNncm91cCBMUlUgdGhhdCBjb25zaXN0cyBvZiBhbiBhY3RpdmUKIGFuZCBpbmFjdGl2ZSBsaXN0LiBXaGVuIGEgY2dyb3VwIGdvZXMgb3ZlciBpdHMgbGltaXQsIHdlIGZpcnN0IHRyeQpAQCAtMjA3LDEyICsyMzIsNiBAQAogVGhlIG1lbW9yeS5zdGF0IGZpbGUgZ2l2ZXMgYWNjb3VudGluZyBpbmZvcm1hdGlvbi4gTm93LCB0aGUgbnVtYmVyIG9mCiBjYWNoZXMsIFJTUyBhbmQgQWN0aXZlIHBhZ2VzL0luYWN0aXZlIHBhZ2VzIGFyZSBzaG93bi4KIAotVGhlIG1lbW9yeS5mb3JjZV9lbXB0eSBnaXZlcyBhbiBpbnRlcmZhY2UgdG8gZHJvcCAqYWxsKiBjaGFyZ2VzIGJ5IGZvcmNlLgotCi0jIGVjaG8gMSA+IG1lbW9yeS5mb3JjZV9lbXB0eQotCi13aWxsIGRyb3AgYWxsIGNoYXJnZXMgaW4gY2dyb3VwLiBDdXJyZW50bHksIHRoaXMgaXMgbWFpbnRhaW5lZCBmb3IgdGVzdC4KLQogNC4gVGVzdGluZwogCiBCYWxiaXIgcG9zdGVkIGxtYmVuY2gsIEFJTTksIExUUCBhbmQgdm1tc3RyZXNzIHJlc3VsdHMgWzEwXSBhbmQgWzExXS4KQEAgLTI0MiwxMCArMjYxLDEwNiBAQAogCiBBIGNncm91cCBjYW4gYmUgcmVtb3ZlZCBieSBybWRpciwgYnV0IGFzIGRpc2N1c3NlZCBpbiBzZWN0aW9ucyA0LjEgYW5kIDQuMiwgYQogY2dyb3VwIG1pZ2h0IGhhdmUgc29tZSBjaGFyZ2UgYXNzb2NpYXRlZCB3aXRoIGl0LCBldmVuIHRob3VnaCBhbGwKLXRhc2tzIGhhdmUgbWlncmF0ZWQgYXdheSBmcm9tIGl0LiBTdWNoIGNoYXJnZXMgYXJlIGF1dG9tYXRpY2FsbHkgZHJvcHBlZCBhdAotcm1kaXIoKSBpZiB0aGVyZSBhcmUgbm8gdGFza3MuCit0YXNrcyBoYXZlIG1pZ3JhdGVkIGF3YXkgZnJvbSBpdC4KK1N1Y2ggY2hhcmdlcyBhcmUgZnJlZWQoYXQgZGVmYXVsdCkgb3IgbW92ZWQgdG8gaXRzIHBhcmVudC4gV2hlbiBtb3ZlZCwKK2JvdGggb2YgUlNTIGFuZCBDQUNIRVMgYXJlIG1vdmVkIHRvIHBhcmVudC4KK0lmIGJvdGggb2YgdGhlbSBhcmUgYnVzeSwgcm1kaXIoKSByZXR1cm5zIC1FQlVTWS4gU2VlIDUuMSBBbHNvLgogCi01LiBUT0RPCitDaGFyZ2VzIHJlY29yZGVkIGluIHN3YXAgaW5mb3JtYXRpb24gaXMgbm90IHVwZGF0ZWQgYXQgcmVtb3ZhbCBvZiBjZ3JvdXAuCitSZWNvcmRlZCBpbmZvcm1hdGlvbiBpcyBkaXNjYXJkZWQgYW5kIGEgY2dyb3VwIHdoaWNoIHVzZXMgc3dhcCAoc3dhcGNhY2hlKQord2lsbCBiZSBjaGFyZ2VkIGFzIGEgbmV3IG93bmVyIG9mIGl0LgorCisKKzUuIE1pc2MuIGludGVyZmFjZXMuCisKKzUuMSBmb3JjZV9lbXB0eQorICBtZW1vcnkuZm9yY2VfZW1wdHkgaW50ZXJmYWNlIGlzIHByb3ZpZGVkIHRvIG1ha2UgY2dyb3VwJ3MgbWVtb3J5IHVzYWdlIGVtcHR5LgorICBZb3UgY2FuIHVzZSB0aGlzIGludGVyZmFjZSBvbmx5IHdoZW4gdGhlIGNncm91cCBoYXMgbm8gdGFza3MuCisgIFdoZW4gd3JpdGluZyBhbnl0aGluZyB0byB0aGlzCisKKyAgIyBlY2hvIDAgPiBtZW1vcnkuZm9yY2VfZW1wdHkKKworICBBbG1vc3QgYWxsIHBhZ2VzIHRyYWNrZWQgYnkgdGhpcyBtZW1jZyB3aWxsIGJlIHVubWFwcGVkIGFuZCBmcmVlZC4gU29tZSBvZgorICBwYWdlcyBjYW5ub3QgYmUgZnJlZWQgYmVjYXVzZSBpdCdzIGxvY2tlZCBvciBpbi11c2UuIFN1Y2ggcGFnZXMgYXJlIG1vdmVkCisgIHRvIHBhcmVudCBhbmQgdGhpcyBjZ3JvdXAgd2lsbCBiZSBlbXB0eS4gQnV0IHRoaXMgbWF5IHJldHVybiAtRUJVU1kgaW4KKyAgc29tZSB0b28gYnVzeSBjYXNlLgorCisgIFR5cGljYWwgdXNlIGNhc2Ugb2YgdGhpcyBpbnRlcmZhY2UgaXMgdGhhdCBjYWxsaW5nIHRoaXMgYmVmb3JlIHJtZGlyKCkuCisgIEJlY2F1c2Ugcm1kaXIoKSBtb3ZlcyBhbGwgcGFnZXMgdG8gcGFyZW50LCBzb21lIG91dC1vZi11c2UgcGFnZSBjYWNoZXMgY2FuIGJlCisgIG1vdmVkIHRvIHRoZSBwYXJlbnQuIElmIHlvdSB3YW50IHRvIGF2b2lkIHRoYXQsIGZvcmNlX2VtcHR5IHdpbGwgYmUgdXNlZnVsLgorCis1LjIgc3RhdCBmaWxlCisgIG1lbW9yeS5zdGF0IGZpbGUgaW5jbHVkZXMgZm9sbG93aW5nIHN0YXRpc3RpY3MgKG5vdykKKwljYWNoZQkJCS0gIyBvZiBwYWdlcyBmcm9tIHBhZ2UtY2FjaGUgYW5kIHNobWVtLgorCXJzcwkJCS0gIyBvZiBwYWdlcyBmcm9tIGFub255bW91cyBtZW1vcnkuCisJcGdwZ2luCQkJLSAjIG9mIGV2ZW50IG9mIGNoYXJnaW5nCisJcGdwZ291dAkJCS0gIyBvZiBldmVudCBvZiB1bmNoYXJnaW5nCisJYWN0aXZlX2Fub24JCS0gIyBvZiBwYWdlcyBvbiBhY3RpdmUgbHJ1IG9mIGFub24sIHNobWVtLgorCWluYWN0aXZlX2Fub24gCQktICMgb2YgcGFnZXMgb24gYWN0aXZlIGxydSBvZiBhbm9uLCBzaG1lbQorCWFjdGl2ZV9maWxlCQktICMgb2YgcGFnZXMgb24gYWN0aXZlIGxydSBvZiBmaWxlLWNhY2hlCisJaW5hY3RpdmVfZmlsZQkJLSAjIG9mIHBhZ2VzIG9uIGluYWN0aXZlIGxydSBvZiBmaWxlIGNhY2hlCisJdW5ldmljdGFibGUJCS0gIyBvZiBwYWdlcyBjYW5ub3QgYmUgcmVjbGFpbWVkLihtbG9ja2VkIGV0YykKKworCUJlbG93IGlzIGRlcGVuZCBvbiBDT05GSUdfREVCVUdfVk0uCisJaW5hY3RpdmVfcmF0aW8JCS0gVk0gaW5lcm5hbCBwYXJhbWV0ZXIuIChzZWUgbW0vcGFnZV9hbGxvYy5jKQorCXJlY2VudF9yb3RhdGVkX2Fub24JLSBWTSBpbnRlcm5hbCBwYXJhbWV0ZXIuIChzZWUgbW0vdm1zY2FuLmMpCisJcmVjZW50X3JvdGF0ZWRfZmlsZQktIFZNIGludGVybmFsIHBhcmFtZXRlci4gKHNlZSBtbS92bXNjYW4uYykKKwlyZWNlbnRfc2Nhbm5lZF9hbm9uIAktIFZNIGludGVybmFsIHBhcmFtZXRlci4gKHNlZSBtbS92bXNjYW4uYykKKwlyZWNlbnRfc2Nhbm5lZF9maWxlIAktIFZNIGludGVybmFsIHBhcmFtZXRlci4gKHNlZSBtbS92bXNjYW4uYykKKworICBNZW1vOgorCXJlY2VudF9yb3RhdGVkIG1lYW5zIHJlY2VudCBmcmVxdWVuY3kgb2YgbHJ1IHJvdGF0aW9uLgorCXJlY2VudF9zY2FubmVkIG1lYW5zIHJlY2VudCAjIG9mIHNjYW5zIHRvIGxydS4KKwlzaG93aW5nIGZvciBiZXR0ZXIgZGVidWcgcGxlYXNlIHNlZSB0aGUgY29kZSBmb3IgbWVhbmluZ3MuCisKKworNS4zIHN3YXBwaW5lc3MKKyAgU2ltaWxhciB0byAvcHJvYy9zeXMvdm0vc3dhcHBpbmVzcywgYnV0IGFmZmVjdGluZyBhIGhpZXJhcmNoeSBvZiBncm91cHMgb25seS4KKworICBGb2xsb3dpbmcgY2dyb3VwJ3Mgc3dhcGluZXNzIGNhbid0IGJlIGNoYW5nZWQuCisgIC0gcm9vdCBjZ3JvdXAgKHVzZXMgL3Byb2Mvc3lzL3ZtL3N3YXBwaW5lc3MpLgorICAtIGEgY2dyb3VwIHdoaWNoIHVzZXMgaGllcmFyY2h5IGFuZCBpdCBoYXMgY2hpbGQgY2dyb3VwLgorICAtIGEgY2dyb3VwIHdoaWNoIHVzZXMgaGllcmFyY2h5IGFuZCBub3QgdGhlIHJvb3Qgb2YgaGllcmFyY2h5LgorCisKKzYuIEhpZXJhcmNoeSBzdXBwb3J0CisKK1RoZSBtZW1vcnkgY29udHJvbGxlciBzdXBwb3J0cyBhIGRlZXAgaGllcmFyY2h5IGFuZCBoaWVyYXJjaGljYWwgYWNjb3VudGluZy4KK1RoZSBoaWVyYXJjaHkgaXMgY3JlYXRlZCBieSBjcmVhdGluZyB0aGUgYXBwcm9wcmlhdGUgY2dyb3VwcyBpbiB0aGUKK2Nncm91cCBmaWxlc3lzdGVtLiBDb25zaWRlciBmb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjZ3JvdXAgZmlsZXN5c3RlbQoraGllcmFyY2h5CisKKwkJcm9vdAorCSAgICAgLyAgfCAgIFwKKyAgICAgICAgICAgLwl8ICAgIFwKKwkgIGEJYgljCisJCQl8IFwKKwkJCXwgIFwKKwkJCWQgICBlCisKK0luIHRoZSBkaWFncmFtIGFib3ZlLCB3aXRoIGhpZXJhcmNoaWNhbCBhY2NvdW50aW5nIGVuYWJsZWQsIGFsbCBtZW1vcnkKK3VzYWdlIG9mIGUsIGlzIGFjY291bnRlZCB0byBpdHMgYW5jZXN0b3JzIHVwIHVudGlsIHRoZSByb290IChpLmUsIGMgYW5kIHJvb3QpLAordGhhdCBoYXMgbWVtb3J5LnVzZV9oaWVyYXJjaHkgZW5hYmxlZC4gIElmIG9uZSBvZiB0aGUgYW5jZXN0b3JzIGdvZXMgb3ZlciBpdHMKK2xpbWl0LCB0aGUgcmVjbGFpbSBhbGdvcml0aG0gcmVjbGFpbXMgZnJvbSB0aGUgdGFza3MgaW4gdGhlIGFuY2VzdG9yIGFuZCB0aGUKK2NoaWxkcmVuIG9mIHRoZSBhbmNlc3Rvci4KKworNi4xIEVuYWJsaW5nIGhpZXJhcmNoaWNhbCBhY2NvdW50aW5nIGFuZCByZWNsYWltCisKK1RoZSBtZW1vcnkgY29udHJvbGxlciBieSBkZWZhdWx0IGRpc2FibGVzIHRoZSBoaWVyYXJjaHkgZmVhdHVyZS4gU3VwcG9ydAorY2FuIGJlIGVuYWJsZWQgYnkgd3JpdGluZyAxIHRvIG1lbW9yeS51c2VfaGllcmFyY2h5IGZpbGUgb2YgdGhlIHJvb3QgY2dyb3VwCisKKyMgZWNobyAxID4gbWVtb3J5LnVzZV9oaWVyYXJjaHkKKworVGhlIGZlYXR1cmUgY2FuIGJlIGRpc2FibGVkIGJ5CisKKyMgZWNobyAwID4gbWVtb3J5LnVzZV9oaWVyYXJjaHkKKworTk9URTE6IEVuYWJsaW5nL2Rpc2FibGluZyB3aWxsIGZhaWwgaWYgdGhlIGNncm91cCBhbHJlYWR5IGhhcyBvdGhlcgorY2dyb3VwcyBjcmVhdGVkIGJlbG93IGl0LgorCitOT1RFMjogVGhpcyBmZWF0dXJlIGNhbiBiZSBlbmFibGVkL2Rpc2FibGVkIHBlciBzdWJ0cmVlLgorCis3LiBUT0RPCiAKIDEuIEFkZCBzdXBwb3J0IGZvciBhY2NvdW50aW5nIGh1Z2UgcGFnZXMgKGFzIGEgc2VwYXJhdGUgY29udHJvbGxlcikKIDIuIE1ha2UgcGVyLWNncm91cCBzY2FubmVyIHJlY2xhaW0gbm90LXNoYXJlZCBwYWdlcyBmaXJzdApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jcnlwdG8vYXN5bmMtdHgtYXBpLnR4dCBiL0RvY3VtZW50YXRpb24vY3J5cHRvL2FzeW5jLXR4LWFwaS50eHQKaW5kZXggYzFlOTU0NS4uOWY1OWZjYiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9jcnlwdG8vYXN5bmMtdHgtYXBpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2NyeXB0by9hc3luYy10eC1hcGkudHh0CkBAIC0xMyw5ICsxMyw5IEBACiAzLjYgQ29uc3RyYWludHMKIDMuNyBFeGFtcGxlCiAKLTQgRFJJVkVSIERFVkVMT1BFUiBOT1RFUworNCBETUFFTkdJTkUgRFJJVkVSIERFVkVMT1BFUiBOT1RFUwogNC4xIENvbmZvcm1hbmNlIHBvaW50cwotNC4yICJNeSBhcHBsaWNhdGlvbiBuZWVkcyBmaW5lciBjb250cm9sIG9mIGhhcmR3YXJlIGNoYW5uZWxzIgorNC4yICJNeSBhcHBsaWNhdGlvbiBuZWVkcyBleGNsdXNpdmUgY29udHJvbCBvZiBoYXJkd2FyZSBjaGFubmVscyIKIAogNSBTT1VSQ0UKIApAQCAtMTUwLDYgKzE1MCw3IEBACiBpbXBsZW1lbnRhdGlvbiBleGFtcGxlcy4KIAogNCBEUklWRVIgREVWRUxPUE1FTlQgTk9URVMKKwogNC4xIENvbmZvcm1hbmNlIHBvaW50czoKIFRoZXJlIGFyZSBhIGZldyBjb25mb3JtYW5jZSBwb2ludHMgcmVxdWlyZWQgaW4gZG1hZW5naW5lIGRyaXZlcnMgdG8KIGFjY29tbW9kYXRlIGFzc3VtcHRpb25zIG1hZGUgYnkgYXBwbGljYXRpb25zIHVzaW5nIHRoZSBhc3luY190eCBBUEk6CkBAIC0xNTgsNTggKzE1OSw0OSBAQAogMy8gVXNlIGFzeW5jX3R4X3J1bl9kZXBlbmRlbmNpZXMoKSBpbiB0aGUgZGVzY3JpcHRvciBjbGVhbiB1cCBwYXRoIHRvCiAgICBoYW5kbGUgc3VibWlzc2lvbiBvZiBkZXBlbmRlbnQgb3BlcmF0aW9ucwogCi00LjIgIk15IGFwcGxpY2F0aW9uIG5lZWRzIGZpbmVyIGNvbnRyb2wgb2YgaGFyZHdhcmUgY2hhbm5lbHMiCi1UaGlzIHJlcXVpcmVtZW50IHNlZW1zIHRvIGFyaXNlIGZyb20gY2FzZXMgd2hlcmUgYSBETUEgZW5naW5lIGRyaXZlciBpcwotdHJ5aW5nIHRvIHN1cHBvcnQgZGV2aWNlLXRvLW1lbW9yeSBETUEuICBUaGUgZG1hZW5naW5lIGFuZCBhc3luY190eAotaW1wbGVtZW50YXRpb25zIHdlcmUgZGVzaWduZWQgZm9yIG9mZmxvYWRpbmcgbWVtb3J5LXRvLW1lbW9yeQotb3BlcmF0aW9uczsgaG93ZXZlciwgdGhlcmUgYXJlIHNvbWUgY2FwYWJpbGl0aWVzIG9mIHRoZSBkbWFlbmdpbmUgbGF5ZXIKLXRoYXQgY2FuIGJlIHVzZWQgZm9yIHBsYXRmb3JtLXNwZWNpZmljIGNoYW5uZWwgbWFuYWdlbWVudC4KLVBsYXRmb3JtLXNwZWNpZmljIGNvbnN0cmFpbnRzIGNhbiBiZSBoYW5kbGVkIGJ5IHJlZ2lzdGVyaW5nIHRoZQotYXBwbGljYXRpb24gYXMgYSAnZG1hX2NsaWVudCcgYW5kIGltcGxlbWVudGluZyBhICdkbWFfZXZlbnRfY2FsbGJhY2snIHRvCi1hcHBseSBhIGZpbHRlciB0byB0aGUgYXZhaWxhYmxlIGNoYW5uZWxzIGluIHRoZSBzeXN0ZW0uICBCZWZvcmUgc2hvd2luZwotaG93IHRvIGltcGxlbWVudCBhIGN1c3RvbSBkbWFfZXZlbnQgY2FsbGJhY2sgc29tZSBiYWNrZ3JvdW5kIG9mCi1kbWFlbmdpbmUncyBjbGllbnQgc3VwcG9ydCBpcyByZXF1aXJlZC4KKzQuMiAiTXkgYXBwbGljYXRpb24gbmVlZHMgZXhjbHVzaXZlIGNvbnRyb2wgb2YgaGFyZHdhcmUgY2hhbm5lbHMiCitQcmltYXJpbHkgdGhpcyByZXF1aXJlbWVudCBhcmlzZXMgZnJvbSBjYXNlcyB3aGVyZSBhIERNQSBlbmdpbmUgZHJpdmVyCitpcyBiZWluZyB1c2VkIHRvIHN1cHBvcnQgZGV2aWNlLXRvLW1lbW9yeSBvcGVyYXRpb25zLiAgQSBjaGFubmVsIHRoYXQgaXMKK3BlcmZvcm1pbmcgdGhlc2Ugb3BlcmF0aW9ucyBjYW5ub3QsIGZvciBtYW55IHBsYXRmb3JtIHNwZWNpZmljIHJlYXNvbnMsCitiZSBzaGFyZWQuICBGb3IgdGhlc2UgY2FzZXMgdGhlIGRtYV9yZXF1ZXN0X2NoYW5uZWwoKSBpbnRlcmZhY2UgaXMKK3Byb3ZpZGVkLgogCi1UaGUgZm9sbG93aW5nIHJvdXRpbmVzIGluIGRtYWVuZ2luZSBzdXBwb3J0IG11bHRpcGxlIGNsaWVudHMgcmVxdWVzdGluZwotdXNlIG9mIGEgY2hhbm5lbDoKLS0gZG1hX2FzeW5jX2NsaWVudF9yZWdpc3RlcihzdHJ1Y3QgZG1hX2NsaWVudCAqY2xpZW50KQotLSBkbWFfYXN5bmNfY2xpZW50X2NoYW5fcmVxdWVzdChzdHJ1Y3QgZG1hX2NsaWVudCAqY2xpZW50KQorVGhlIGludGVyZmFjZSBpczoKK3N0cnVjdCBkbWFfY2hhbiAqZG1hX3JlcXVlc3RfY2hhbm5lbChkbWFfY2FwX21hc2tfdCBtYXNrLAorCQkJCSAgICAgZG1hX2ZpbHRlcl9mbiBmaWx0ZXJfZm4sCisJCQkJICAgICB2b2lkICpmaWx0ZXJfcGFyYW0pOwogCi1kbWFfYXN5bmNfY2xpZW50X3JlZ2lzdGVyIHRha2VzIGEgcG9pbnRlciB0byBhbiBpbml0aWFsaXplZCBkbWFfY2xpZW50Ci1zdHJ1Y3R1cmUuICBJdCBleHBlY3RzIHRoYXQgdGhlICdldmVudF9jYWxsYmFjaycgYW5kICdjYXBfbWFzaycgZmllbGRzCi1hcmUgYWxyZWFkeSBpbml0aWFsaXplZC4KK1doZXJlIGRtYV9maWx0ZXJfZm4gaXMgZGVmaW5lZCBhczoKK3R5cGVkZWYgYm9vbCAoKmRtYV9maWx0ZXJfZm4pKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgdm9pZCAqZmlsdGVyX3BhcmFtKTsKIAotZG1hX2FzeW5jX2NsaWVudF9jaGFuX3JlcXVlc3QgdHJpZ2dlcnMgZG1hZW5naW5lIHRvIG5vdGlmeSB0aGUgY2xpZW50IG9mCi1hbGwgY2hhbm5lbHMgdGhhdCBzYXRpc2Z5IHRoZSBjYXBhYmlsaXR5IG1hc2suICBJdCBpcyB1cCB0byB0aGUgY2xpZW50J3MKLWV2ZW50X2NhbGxiYWNrIHJvdXRpbmUgdG8gdHJhY2sgaG93IG1hbnkgY2hhbm5lbHMgdGhlIGNsaWVudCBuZWVkcyBhbmQKLWhvdyBtYW55IGl0IGlzIGN1cnJlbnRseSB1c2luZy4gIFRoZSBkbWFfZXZlbnRfY2FsbGJhY2sgcm91dGluZSByZXR1cm5zIGEKLWRtYV9zdGF0ZV9jbGllbnQgY29kZSB0byBsZXQgZG1hZW5naW5lIGtub3cgdGhlIHN0YXR1cyBvZiB0aGUKLWFsbG9jYXRpb24uCitXaGVuIHRoZSBvcHRpb25hbCAnZmlsdGVyX2ZuJyBwYXJhbWV0ZXIgaXMgc2V0IHRvIE5VTEwKK2RtYV9yZXF1ZXN0X2NoYW5uZWwgc2ltcGx5IHJldHVybnMgdGhlIGZpcnN0IGNoYW5uZWwgdGhhdCBzYXRpc2ZpZXMgdGhlCitjYXBhYmlsaXR5IG1hc2suICBPdGhlcndpc2UsIHdoZW4gdGhlIG1hc2sgcGFyYW1ldGVyIGlzIGluc3VmZmljaWVudCBmb3IKK3NwZWNpZnlpbmcgdGhlIG5lY2Vzc2FyeSBjaGFubmVsLCB0aGUgZmlsdGVyX2ZuIHJvdXRpbmUgY2FuIGJlIHVzZWQgdG8KK2Rpc3Bvc2l0aW9uIHRoZSBhdmFpbGFibGUgY2hhbm5lbHMgaW4gdGhlIHN5c3RlbS4gVGhlIGZpbHRlcl9mbiByb3V0aW5lCitpcyBjYWxsZWQgb25jZSBmb3IgZWFjaCBmcmVlIGNoYW5uZWwgaW4gdGhlIHN5c3RlbS4gIFVwb24gc2VlaW5nIGEKK3N1aXRhYmxlIGNoYW5uZWwgZmlsdGVyX2ZuIHJldHVybnMgRE1BX0FDSyB3aGljaCBmbGFncyB0aGF0IGNoYW5uZWwgdG8KK2JlIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBkbWFfcmVxdWVzdF9jaGFubmVsLiAgQSBjaGFubmVsIGFsbG9jYXRlZCB2aWEKK3RoaXMgaW50ZXJmYWNlIGlzIGV4Y2x1c2l2ZSB0byB0aGUgY2FsbGVyLCB1bnRpbCBkbWFfcmVsZWFzZV9jaGFubmVsKCkKK2lzIGNhbGxlZC4KIAotQmVsb3cgaXMgdGhlIGV4YW1wbGUgb2YgaG93IHRvIGV4dGVuZCB0aGlzIGZ1bmN0aW9uYWxpdHkgZm9yCi1wbGF0Zm9ybS1zcGVjaWZpYyBmaWx0ZXJpbmcgb2YgdGhlIGF2YWlsYWJsZSBjaGFubmVscyBiZXlvbmQgdGhlCi1zdGFuZGFyZCBjYXBhYmlsaXR5IG1hc2s6CitUaGUgRE1BX1BSSVZBVEUgY2FwYWJpbGl0eSBmbGFnIGlzIHVzZWQgdG8gdGFnIGRtYSBkZXZpY2VzIHRoYXQgc2hvdWxkCitub3QgYmUgdXNlZCBieSB0aGUgZ2VuZXJhbC1wdXJwb3NlIGFsbG9jYXRvci4gIEl0IGNhbiBiZSBzZXQgYXQKK2luaXRpYWxpemF0aW9uIHRpbWUgaWYgaXQgaXMga25vd24gdGhhdCBhIGNoYW5uZWwgd2lsbCBhbHdheXMgYmUKK3ByaXZhdGUuICBBbHRlcm5hdGl2ZWx5LCBpdCBpcyBzZXQgd2hlbiBkbWFfcmVxdWVzdF9jaGFubmVsKCkgZmluZHMgYW4KK3VudXNlZCAicHVibGljIiBjaGFubmVsLgogCi1zdGF0aWMgZW51bSBkbWFfc3RhdGVfY2xpZW50Ci1teV9kbWFfY2xpZW50X2NhbGxiYWNrKHN0cnVjdCBkbWFfY2xpZW50ICpjbGllbnQsCi0JCQlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIGVudW0gZG1hX3N0YXRlIHN0YXRlKQotewotCXN0cnVjdCBkbWFfZGV2aWNlICpkbWFfZGV2OwotCXN0cnVjdCBteV9wbGF0Zm9ybV9zcGVjaWZpY19kbWEgKnBsYXRfZG1hX2RldjsKLQkKLQlkbWFfZGV2ID0gY2hhbi0+ZGV2aWNlOwotCXBsYXRfZG1hX2RldiA9IGNvbnRhaW5lcl9vZihkbWFfZGV2LAotCQkJCSAgICBzdHJ1Y3QgbXlfcGxhdGZvcm1fc3BlY2lmaWNfZG1hLAotCQkJCSAgICBkbWFfZGV2KTsKLQotCWlmICghcGxhdF9kbWFfZGV2LT5wbGF0Zm9ybV9zcGVjaWZpY19jYXBhYmlsaXR5KQotCQlyZXR1cm4gRE1BX0RVUDsKLQotCS4gLiAuCi19CitBIGNvdXBsZSBjYXZlYXRzIHRvIG5vdGUgd2hlbiBpbXBsZW1lbnRpbmcgYSBkcml2ZXIgYW5kIGNvbnN1bWVyOgorMS8gT25jZSBhIGNoYW5uZWwgaGFzIGJlZW4gcHJpdmF0ZWx5IGFsbG9jYXRlZCBpdCB3aWxsIG5vIGxvbmdlciBiZQorICAgY29uc2lkZXJlZCBieSB0aGUgZ2VuZXJhbC1wdXJwb3NlIGFsbG9jYXRvciBldmVuIGFmdGVyIGEgY2FsbCB0bworICAgZG1hX3JlbGVhc2VfY2hhbm5lbCgpLgorMi8gU2luY2UgY2FwYWJpbGl0aWVzIGFyZSBzcGVjaWZpZWQgYXQgdGhlIGRldmljZSBsZXZlbCBhIGRtYV9kZXZpY2UKKyAgIHdpdGggbXVsdGlwbGUgY2hhbm5lbHMgd2lsbCBlaXRoZXIgaGF2ZSBhbGwgY2hhbm5lbHMgcHVibGljLCBvciBhbGwKKyAgIGNoYW5uZWxzIHByaXZhdGUuCiAKIDUgU09VUkNFCi1pbmNsdWRlL2xpbnV4L2RtYWVuZ2luZS5oOiBjb3JlIGhlYWRlciBmaWxlIGZvciBETUEgZHJpdmVycyBhbmQgY2xpZW50cworCitpbmNsdWRlL2xpbnV4L2RtYWVuZ2luZS5oOiBjb3JlIGhlYWRlciBmaWxlIGZvciBETUEgZHJpdmVycyBhbmQgYXBpIHVzZXJzCiBkcml2ZXJzL2RtYS9kbWFlbmdpbmUuYzogb2ZmbG9hZCBlbmdpbmUgY2hhbm5lbCBtYW5hZ2VtZW50IHJvdXRpbmVzCiBkcml2ZXJzL2RtYS86IGxvY2F0aW9uIGZvciBvZmZsb2FkIGVuZ2luZSBkcml2ZXJzCiBpbmNsdWRlL2xpbnV4L2FzeW5jX3R4Lmg6IGNvcmUgaGVhZGVyIGZpbGUgZm9yIHRoZSBhc3luY190eCBhcGkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGVsbF9yYnUudHh0IGIvRG9jdW1lbnRhdGlvbi9kZWxsX3JidS50eHQKaW5kZXggMmMwZDYzMS4uYzExYjkzMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZWxsX3JidS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZWxsX3JidS50eHQKQEAgLTgxLDggKzgxLDggQEAKIEFsc28gZWNob2luZyBlaXRoZXIgbW9ubyAscGFja2V0IG9yIGluaXQgaW4gdG8gaW1hZ2VfdHlwZSB3aWxsIGZyZWUgdXAgdGhlCiBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoZSBkcml2ZXIuCiAKLUlmIGFuIHVzZXIgYnkgYWNjaWRlbnQgZXhlY3V0ZXMgc3RlcHMgMSBhbmQgMyBhYm92ZSB3aXRob3V0IGV4ZWN1dGluZyBzdGVwIDI7Ci1pdCB3aWxsIG1ha2UgdGhlIC9zeXMvY2xhc3MvZmlybXdhcmUvZGVsbF9yYnUvIGVudHJpZXMgdG8gZGlzYXBwZWFyLgorSWYgYSB1c2VyIGJ5IGFjY2lkZW50IGV4ZWN1dGVzIHN0ZXBzIDEgYW5kIDMgYWJvdmUgd2l0aG91dCBleGVjdXRpbmcgc3RlcCAyOworaXQgd2lsbCBtYWtlIHRoZSAvc3lzL2NsYXNzL2Zpcm13YXJlL2RlbGxfcmJ1LyBlbnRyaWVzIGRpc2FwcGVhci4KIFRoZSBlbnRyaWVzIGNhbiBiZSByZWNyZWF0ZWQgYnkgZG9pbmcgdGhlIGZvbGxvd2luZwogZWNobyBpbml0ID4gL3N5cy9kZXZpY2VzL3BsYXRmb3JtL2RlbGxfcmJ1L2ltYWdlX3R5cGUKIE5PVEU6IGVjaG9pbmcgaW5pdCBpbiBpbWFnZV90eXBlIGRvZXMgbm90IGNoYW5nZSBpdCBvcmlnaW5hbCB2YWx1ZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy80LkNvZGluZyBiL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy80LkNvZGluZwppbmRleCAwMTRhY2E4Li5hNWEzNDUwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvNC5Db2RpbmcKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzQuQ29kaW5nCkBAIC0zNzUsMTAgKzM3NSwxMCBAQAoganVzdGlmaWNhdGlvbiBpcyBzb2xpZC4KIAogV2hlbiBtYWtpbmcgYW4gaW5jb21wYXRpYmxlIEFQSSBjaGFuZ2UsIG9uZSBzaG91bGQsIHdoZW5ldmVyIHBvc3NpYmxlLAotZW5zdXJlIHRoYXQgY29kZSB3aGljaCBoYXMgbm90IGJlZW4gdXBkYXRlZCBpcyBjYXVnaHQgYnkgdGhlIGNvbXBpbGVyLiAgCitlbnN1cmUgdGhhdCBjb2RlIHdoaWNoIGhhcyBub3QgYmVlbiB1cGRhdGVkIGlzIGNhdWdodCBieSB0aGUgY29tcGlsZXIuCiBUaGlzIHdpbGwgaGVscCB5b3UgdG8gYmUgc3VyZSB0aGF0IHlvdSBoYXZlIGZvdW5kIGFsbCBpbi10cmVlIHVzZXMgb2YgdGhhdAogaW50ZXJmYWNlLiAgSXQgd2lsbCBhbHNvIGFsZXJ0IGRldmVsb3BlcnMgb2Ygb3V0LW9mLXRyZWUgY29kZSB0aGF0IHRoZXJlIGlzCiBhIGNoYW5nZSB0aGF0IHRoZXkgbmVlZCB0byByZXNwb25kIHRvLiAgU3VwcG9ydGluZyBvdXQtb2YtdHJlZSBjb2RlIGlzIG5vdAogc29tZXRoaW5nIHRoYXQga2VybmVsIGRldmVsb3BlcnMgbmVlZCB0byBiZSB3b3JyaWVkIGFib3V0LCBidXQgd2UgYWxzbyBkbwotbm90IGhhdmUgdG8gbWFrZSBsaWZlIGhhcmRlciBmb3Igb3V0LW9mLXRyZWUgZGV2ZWxvcGVycyB0aGFuIGl0IGl0IG5lZWRzIHRvCi1iZS4gCitub3QgaGF2ZSB0byBtYWtlIGxpZmUgaGFyZGVyIGZvciBvdXQtb2YtdHJlZSBkZXZlbG9wZXJzIHRoYW4gaXQgbmVlZHMgdG8KK2JlLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kbWFlbmdpbmUudHh0IGIvRG9jdW1lbnRhdGlvbi9kbWFlbmdpbmUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMWMyZjYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RtYWVuZ2luZS50eHQKQEAgLTAsMCArMSBAQAorU2VlIERvY3VtZW50YXRpb24vY3J5cHRvL2FzeW5jLXR4LWFwaS50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dCBiL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dAppbmRleCBkZjE4ZDg3Li41ZGRiZTM1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CkBAIC0zMTUsMyArMzE1LDIzIEBACiBXaHk6CURlcHJlY2F0ZWQgYnkgdGhlIG5ldyAoc3RhbmRhcmQpIGRldmljZSBkcml2ZXIgYmluZGluZyBtb2RlbC4gVXNlCiAJaTJjX2RyaXZlci0+cHJvYmUoKSBhbmQgLT5yZW1vdmUoKSBpbnN0ZWFkLgogV2hvOglKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doYXQ6CWZzY2hlciBhbmQgZnNjcG9zIGRyaXZlcnMKK1doZW46CUp1bmUgMjAwOQorV2h5OglEZXByZWNhdGVkIGJ5IHRoZSBuZXcgZnNjaG1kIGRyaXZlci4KK1dobzoJSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4KKwlKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doYXQ6CVNFTGludXggImNvbXBhdF9uZXQiIGZ1bmN0aW9uYWxpdHkKK1doZW46CTIuNi4zMCBhdCB0aGUgZWFybGllc3QKK1doeToJSW4gMi42LjE4IHRoZSBTZWNtYXJrIGNvbmNlcHQgd2FzIGludHJvZHVjZWQgdG8gcmVwbGFjZSB0aGUgImNvbXBhdF9uZXQiCisJbmV0d29yayBhY2Nlc3MgY29udHJvbCBmdW5jdGlvbmFsaXR5IG9mIFNFTGludXguICBTZWNtYXJrIG9mZmVycyBib3RoCisJYmV0dGVyIHBlcmZvcm1hbmNlIGFuZCBncmVhdGVyIGZsZXhpYmlsaXR5IHRoYW4gdGhlICJjb21wYXRfbmV0IgorCW1lY2hhbmlzbS4gIE5vdyB0aGF0IHRoZSBtYWpvciBMaW51eCBkaXN0cmlidXRpb25zIGhhdmUgbW92ZWQgdG8KKwlTZWNtYXJrLCBpdCBpcyB0aW1lIHRvIGRlcHJlY2F0ZSB0aGUgb2xkZXIgbWVjaGFuaXNtIGFuZCBzdGFydCB0aGUKKwlwcm9jZXNzIG9mIHJlbW92aW5nIHRoZSBvbGQgY29kZS4KK1dobzoJUGF1bCBNb29yZSA8cGF1bC5tb29yZUBocC5jb20+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL0xvY2tpbmcgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL0xvY2tpbmcKaW5kZXggY2NlYzU1My4uY2ZiZmExNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9Mb2NraW5nCisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvTG9ja2luZwpAQCAtMzk3LDcgKzM5Nyw3IEBACiB9OwogCiBsb2NraW5nIHJ1bGVzOgotCUFsbCBleGNlcHQgLT5wb2xsKCkgbWF5IGJsb2NrLgorCUFsbCBtYXkgYmxvY2suCiAJCQlCS0wKIGxsc2VlazoJCQlubwkoc2VlIGJlbG93KQogcmVhZDoJCQlubwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9leHQ0LnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZXh0NC50eHQKaW5kZXggMTc0ZWFmZi4uY2VjODI5YiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9leHQ0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2V4dDQudHh0CkBAIC01OCwxMyArNTgsMjIgQEAKIAogCSMgbW91bnQgLXQgZXh0NCAvZGV2L2hkYTEgL3doZXJldmVyCiAKLSAgLSBXaGVuIGNvbXBhcmluZyBwZXJmb3JtYW5jZSB3aXRoIG90aGVyIGZpbGVzeXN0ZW1zLCByZW1lbWJlciB0aGF0Ci0gICAgZXh0My80IGJ5IGRlZmF1bHQgb2ZmZXJzIGhpZ2hlciBkYXRhIGludGVncml0eSBndWFyYW50ZWVzIHRoYW4gbW9zdC4KLSAgICBTbyB3aGVuIGNvbXBhcmluZyB3aXRoIGEgbWV0YWRhdGEtb25seSBqb3VybmFsbGluZyBmaWxlc3lzdGVtLCBzdWNoCi0gICAgYXMgZXh0MywgdXNlIGBtb3VudCAtbyBkYXRhPXdyaXRlYmFjaycuICBBbmQgeW91IG1pZ2h0IGFzIHdlbGwgdXNlCi0gICAgYG1vdW50IC1vIG5vYmgnIHRvbyBhbG9uZyB3aXRoIGl0LiAgTWFraW5nIHRoZSBqb3VybmFsIGxhcmdlciB0aGFuCi0gICAgdGhlIG1rZTJmcyBkZWZhdWx0IG9mdGVuIGhlbHBzIHBlcmZvcm1hbmNlIHdpdGggbWV0YWRhdGEtaW50ZW5zaXZlCi0gICAgd29ya2xvYWRzLgorICAtIFdoZW4gY29tcGFyaW5nIHBlcmZvcm1hbmNlIHdpdGggb3RoZXIgZmlsZXN5c3RlbXMsIGl0J3MgYWx3YXlzCisgICAgaW1wb3J0YW50IHRvIHRyeSBtdWx0aXBsZSB3b3JrbG9hZHM7IHZlcnkgb2Z0ZW4gYSBzdWJ0bGUgY2hhbmdlIGluIGEKKyAgICB3b3JrbG9hZCBwYXJhbWV0ZXIgY2FuIGNvbXBsZXRlbHkgY2hhbmdlIHRoZSByYW5raW5nIG9mIHdoaWNoCisgICAgZmlsZXN5c3RlbXMgZG8gd2VsbCBjb21wYXJlZCB0byBvdGhlcnMuICBXaGVuIGNvbXBhcmluZyB2ZXJzdXMgZXh0MywKKyAgICBub3RlIHRoYXQgZXh0NCBlbmFibGVzIHdyaXRlIGJhcnJpZXJzIGJ5IGRlZmF1bHQsIHdoaWxlIGV4dDMgZG9lcworICAgIG5vdCBlbmFibGUgd3JpdGUgYmFycmllcnMgYnkgZGVmYXVsdC4gIFNvIGl0IGlzIHVzZWZ1bCB0byB1c2UKKyAgICBleHBsaWNpdGx5IHNwZWNpZnkgd2hldGhlciBiYXJyaWVycyBhcmUgZW5hYmxlZCBvciBub3Qgd2hlbiB2aWEgdGhlCisgICAgJy1vIGJhcnJpZXJzPVswfDFdJyBtb3VudCBvcHRpb24gZm9yIGJvdGggZXh0MyBhbmQgZXh0NCBmaWxlc3lzdGVtcworICAgIGZvciBhIGZhaXIgY29tcGFyaXNvbi4gIFdoZW4gdHVuaW5nIGV4dDMgZm9yIGJlc3QgYmVuY2htYXJrIG51bWJlcnMsCisgICAgaXQgaXMgb2Z0ZW4gd29ydGh3aGlsZSB0byB0cnkgY2hhbmdpbmcgdGhlIGRhdGEgam91cm5hbGluZyBtb2RlOyAnLW8KKyAgICBkYXRhPXdyaXRlYmFjayxub2JoJyBjYW4gYmUgZmFzdGVyIGZvciBzb21lIHdvcmtsb2Fkcy4gIChOb3RlCisgICAgaG93ZXZlciB0aGF0IHJ1bm5pbmcgbW91bnRlZCB3aXRoIGRhdGE9d3JpdGViYWNrIGNhbiBwb3RlbnRpYWxseQorICAgIGxlYXZlIHN0YWxlIGRhdGEgZXhwb3NlZCBpbiByZWNlbnRseSB3cml0dGVuIGZpbGVzIGluIGNhc2Ugb2YgYW4KKyAgICB1bmNsZWFuIHNodXRkb3duLCB3aGljaCBjb3VsZCBiZSBhIHNlY3VyaXR5IGV4cG9zdXJlIGluIHNvbWUKKyAgICBzaXR1YXRpb25zLikgIENvbmZpZ3VyaW5nIHRoZSBmaWxlc3lzdGVtIHdpdGggYSBsYXJnZSBqb3VybmFsIGNhbgorICAgIGFsc28gYmUgaGVscGZ1bCBmb3IgbWV0YWRhdGEtaW50ZW5zaXZlIHdvcmtsb2Fkcy4KIAogMi4gRmVhdHVyZXMKID09PT09PT09PT09CkBAIC03NCw3ICs4Myw3IEBACiAqIGFiaWxpdHkgdG8gdXNlIGZpbGVzeXN0ZW1zID4gMTZUQiAoZTJmc3Byb2dzIHN1cHBvcnQgbm90IGF2YWlsYWJsZSB5ZXQpCiAqIGV4dGVudCBmb3JtYXQgcmVkdWNlcyBtZXRhZGF0YSBvdmVyaGVhZCAoUkFNLCBJTyBmb3IgYWNjZXNzLCB0cmFuc2FjdGlvbnMpCiAqIGV4dGVudCBmb3JtYXQgbW9yZSByb2J1c3QgaW4gZmFjZSBvZiBvbi1kaXNrIGNvcnJ1cHRpb24gZHVlIHRvIG1hZ2ljcywKLSogaW50ZXJuYWwgcmVkdW5hbmN5IGluIHRyZWUKKyogaW50ZXJuYWwgcmVkdW5kYW5jeSBpbiB0cmVlCiAqIGltcHJvdmVkIGZpbGUgYWxsb2NhdGlvbiAobXVsdGktYmxvY2sgYWxsb2MpCiAqIGZpeCAzMjAwMCBzdWJkaXJlY3RvcnkgbGltaXQKICogbnNlYyB0aW1lc3RhbXBzIGZvciBtdGltZSwgYXRpbWUsIGN0aW1lLCBjcmVhdGUgdGltZQpAQCAtMTE2LDEwICsxMjUsMTEgQEAKIFdoZW4gbW91bnRpbmcgYW4gZXh0NCBmaWxlc3lzdGVtLCB0aGUgZm9sbG93aW5nIG9wdGlvbiBhcmUgYWNjZXB0ZWQ6CiAoKikgPT0gZGVmYXVsdAogCi1leHRlbnRzCQkoKikJZXh0NCB3aWxsIHVzZSBleHRlbnRzIHRvIGFkZHJlc3MgZmlsZSBkYXRhLiAgVGhlCi0JCQlmaWxlIHN5c3RlbSB3aWxsIG5vIGxvbmdlciBiZSBtb3VudGFibGUgYnkgZXh0My4KLQotbm9leHRlbnRzCQlleHQ0IHdpbGwgbm90IHVzZSBleHRlbnRzIGZvciBuZXdseSBjcmVhdGVkIGZpbGVzCitybyAgICAgICAgICAgICAgICAgICAJTW91bnQgZmlsZXN5c3RlbSByZWFkIG9ubHkuIE5vdGUgdGhhdCBleHQ0IHdpbGwKKyAgICAgICAgICAgICAgICAgICAgIAlyZXBsYXkgdGhlIGpvdXJuYWwgKGFuZCB0aHVzIHdyaXRlIHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgCXBhcnRpdGlvbikgZXZlbiB3aGVuIG1vdW50ZWQgInJlYWQgb25seSIuIFRoZQorICAgICAgICAgICAgICAgICAgICAgCW1vdW50IG9wdGlvbnMgInJvLG5vbG9hZCIgY2FuIGJlIHVzZWQgdG8gcHJldmVudAorCQkgICAgIAl3cml0ZXMgdG8gdGhlIGZpbGVzeXN0ZW0uCiAKIGpvdXJuYWxfY2hlY2tzdW0JRW5hYmxlIGNoZWNrc3VtbWluZyBvZiB0aGUgam91cm5hbCB0cmFuc2FjdGlvbnMuCiAJCQlUaGlzIHdpbGwgYWxsb3cgdGhlIHJlY292ZXJ5IGNvZGUgaW4gZTJmc2NrIGFuZCB0aGUKQEAgLTEzNCwxNyArMTQ0LDE3IEBACiBqb3VybmFsPXVwZGF0ZQkJVXBkYXRlIHRoZSBleHQ0IGZpbGUgc3lzdGVtJ3Mgam91cm5hbCB0byB0aGUgY3VycmVudAogCQkJZm9ybWF0LgogCi1qb3VybmFsPWludW0JCVdoZW4gYSBqb3VybmFsIGFscmVhZHkgZXhpc3RzLCB0aGlzIG9wdGlvbiBpcyBpZ25vcmVkLgotCQkJT3RoZXJ3aXNlLCBpdCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0aGUgaW5vZGUgd2hpY2gKLQkJCXdpbGwgcmVwcmVzZW50IHRoZSBleHQ0IGZpbGUgc3lzdGVtJ3Mgam91cm5hbCBmaWxlLgotCiBqb3VybmFsX2Rldj1kZXZudW0JV2hlbiB0aGUgZXh0ZXJuYWwgam91cm5hbCBkZXZpY2UncyBtYWpvci9taW5vciBudW1iZXJzCiAJCQloYXZlIGNoYW5nZWQsIHRoaXMgb3B0aW9uIGFsbG93cyB0aGUgdXNlciB0byBzcGVjaWZ5CiAJCQl0aGUgbmV3IGpvdXJuYWwgbG9jYXRpb24uICBUaGUgam91cm5hbCBkZXZpY2UgaXMKIAkJCWlkZW50aWZpZWQgdGhyb3VnaCBpdHMgbmV3IG1ham9yL21pbm9yIG51bWJlcnMgZW5jb2RlZAogCQkJaW4gZGV2bnVtLgogCi1ub2xvYWQJCQlEb24ndCBsb2FkIHRoZSBqb3VybmFsIG9uIG1vdW50aW5nLgorbm9sb2FkCQkJRG9uJ3QgbG9hZCB0aGUgam91cm5hbCBvbiBtb3VudGluZy4gIE5vdGUgdGhhdAorICAgICAgICAgICAgICAgICAgICAgCWlmIHRoZSBmaWxlc3lzdGVtIHdhcyBub3QgdW5tb3VudGVkIGNsZWFubHksCisgICAgICAgICAgICAgICAgICAgICAJc2tpcHBpbmcgdGhlIGpvdXJuYWwgcmVwbGF5IHdpbGwgbGVhZCB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgIAlmaWxlc3lzdGVtIGNvbnRhaW5pbmcgaW5jb25zaXN0ZW5jaWVzIHRoYXQgY2FuCisgICAgICAgICAgICAgICAgICAgICAJbGVhZCB0byBhbnkgbnVtYmVyIG9mIHByb2JsZW1zLgogCiBkYXRhPWpvdXJuYWwJCUFsbCBkYXRhIGFyZSBjb21taXR0ZWQgaW50byB0aGUgam91cm5hbCBwcmlvciB0byBiZWluZwogCQkJd3JpdHRlbiBpbnRvIHRoZSBtYWluIGZpbGUgc3lzdGVtLgpAQCAtMjE5LDkgKzIyOSwxMiBAQAogCiBkZWJ1ZwkJCUV4dHJhIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpcyBzZW50IHRvIHN5c2xvZy4KIAotZXJyb3JzPXJlbW91bnQtcm8oKikJUmVtb3VudCB0aGUgZmlsZXN5c3RlbSByZWFkLW9ubHkgb24gYW4gZXJyb3IuCitlcnJvcnM9cmVtb3VudC1ybwlSZW1vdW50IHRoZSBmaWxlc3lzdGVtIHJlYWQtb25seSBvbiBhbiBlcnJvci4KIGVycm9ycz1jb250aW51ZQkJS2VlcCBnb2luZyBvbiBhIGZpbGVzeXN0ZW0gZXJyb3IuCiBlcnJvcnM9cGFuaWMJCVBhbmljIGFuZCBoYWx0IHRoZSBtYWNoaW5lIGlmIGFuIGVycm9yIG9jY3Vycy4KKyAgICAgICAgICAgICAgICAgICAgICAgIChUaGVzZSBtb3VudCBvcHRpb25zIG92ZXJyaWRlIHRoZSBlcnJvcnMgYmVoYXZpb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBpbiB0aGUgc3VwZXJibG9jaywgd2hpY2ggY2FuIGJlIGNvbmZpZ3VyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIHR1bmUyZnMpCiAKIGRhdGFfZXJyPWlnbm9yZSgqKQlKdXN0IHByaW50IGFuIGVycm9yIG1lc3NhZ2UgaWYgYW4gZXJyb3Igb2NjdXJzCiAJCQlpbiBhIGZpbGUgZGF0YSBidWZmZXIgaW4gb3JkZXJlZCBtb2RlLgpAQCAtMjYxLDYgKzI3NCw0MiBAQAogbm9kZWxhbGxvYwkJRGlzYWJsZSBkZWxheWVkIGFsbG9jYXRpb24uIEJsb2NrcyBhcmUgYWxsb2NhdGlvbgogCQkJd2hlbiBkYXRhIGlzIGNvcGllZCBmcm9tIHVzZXIgdG8gcGFnZSBjYWNoZS4KIAorbWF4X2JhdGNoX3RpbWU9dXNlYwlNYXhpbXVtIGFtb3VudCBvZiB0aW1lIGV4dDQgc2hvdWxkIHdhaXQgZm9yCisJCQlhZGRpdGlvbmFsIGZpbGVzeXN0ZW0gb3BlcmF0aW9ucyB0byBiZSBiYXRjaAorCQkJdG9nZXRoZXIgd2l0aCBhIHN5bmNocm9ub3VzIHdyaXRlIG9wZXJhdGlvbi4KKwkJCVNpbmNlIGEgc3luY2hyb25vdXMgd3JpdGUgb3BlcmF0aW9uIGlzIGdvaW5nIHRvCisJCQlmb3JjZSBhIGNvbW1pdCBhbmQgdGhlbiBhIHdhaXQgZm9yIHRoZSBJL08KKwkJCWNvbXBsZXRlLCBpdCBkb2Vzbid0IGNvc3QgbXVjaCwgYW5kIGNhbiBiZSBhCisJCQlodWdlIHRocm91Z2hwdXQgd2luLCB3ZSB3YWl0IGZvciBhIHNtYWxsIGFtb3VudAorCQkJb2YgdGltZSB0byBzZWUgaWYgYW55IG90aGVyIHRyYW5zYWN0aW9ucyBjYW4KKwkJCXBpZ2d5YmFjayBvbiB0aGUgc3luY2hyb25vdXMgd3JpdGUuICAgVGhlCisJCQlhbGdvcml0aG0gdXNlZCBpcyBkZXNpZ25lZCB0byBhdXRvbWF0aWNhbGx5IHR1bmUKKwkJCWZvciB0aGUgc3BlZWQgb2YgdGhlIGRpc2ssIGJ5IG1lYXN1cmluZyB0aGUKKwkJCWFtb3VudCBvZiB0aW1lIChvbiBhdmVyYWdlKSB0aGF0IGl0IHRha2VzIHRvCisJCQlmaW5pc2ggY29tbWl0dGluZyBhIHRyYW5zYWN0aW9uLiAgQ2FsbCB0aGlzIHRpbWUKKwkJCXRoZSAiY29tbWl0IHRpbWUiLiAgSWYgdGhlIHRpbWUgdGhhdCB0aGUKKwkJCXRyYW5zYWN0b2luIGhhcyBiZWVuIHJ1bm5pbmcgaXMgbGVzcyB0aGFuIHRoZQorCQkJY29tbWl0IHRpbWUsIGV4dDQgd2lsbCB0cnkgc2xlZXBpbmcgZm9yIHRoZQorCQkJY29tbWl0IHRpbWUgdG8gc2VlIGlmIG90aGVyIG9wZXJhdGlvbnMgd2lsbCBqb2luCisJCQl0aGUgdHJhbnNhY3Rpb24uICAgVGhlIGNvbW1pdCB0aW1lIGlzIGNhcHBlZCBieQorCQkJdGhlIG1heF9iYXRjaF90aW1lLCB3aGljaCBkZWZhdWx0cyB0byAxNTAwMHVzCisJCQkoMTVtcykuICAgVGhpcyBvcHRpbWl6YXRpb24gY2FuIGJlIHR1cm5lZCBvZmYKKwkJCWVudGlyZWx5IGJ5IHNldHRpbmcgbWF4X2JhdGNoX3RpbWUgdG8gMC4KKworbWluX2JhdGNoX3RpbWU9dXNlYwlUaGlzIHBhcmFtZXRlciBzZXRzIHRoZSBjb21taXQgdGltZSAoYXMKKwkJCWRlc2NyaWJlZCBhYm92ZSkgdG8gYmUgYXQgbGVhc3QgbWluX2JhdGNoX3RpbWUuCisJCQlJdCBkZWZhdWx0cyB0byB6ZXJvIG1pY3Jvc2Vjb25kcy4gIEluY3JlYXNpbmcKKwkJCXRoaXMgcGFyYW1ldGVyIG1heSBpbXByb3ZlIHRoZSB0aHJvdWdocHV0IG9mCisJCQltdWx0aS10aHJlYWRlZCwgc3luY2hyb25vdXMgd29ya2xvYWRzIG9uIHZlcnkKKwkJCWZhc3QgZGlza3MsIGF0IHRoZSBjb3N0IG9mIGluY3JlYXNpbmcgbGF0ZW5jeS4KKworam91cm5hbF9pb3ByaW89cHJpbwlUaGUgSS9PIHByaW9yaXR5IChmcm9tIDAgdG8gNywgd2hlcmUgMCBpcyB0aGUKKwkJCWhpZ2hlc3QgcHJpb3J0eSkgd2hpY2ggc2hvdWxkIGJlIHVzZWQgZm9yIEkvTworCQkJb3BlcmF0aW9ucyBzdWJtaXR0ZWQgYnkga2pvdXJuYWxkMiBkdXJpbmcgYQorCQkJY29tbWl0IG9wZXJhdGlvbi4gIFRoaXMgZGVmYXVsdHMgdG8gMywgd2hpY2ggaXMKKwkJCWEgc2xpZ2h0bHkgaGlnaGVyIHByaW9yaXR5IHRoYW4gdGhlIGRlZmF1bHQgSS9PCisJCQlwcmlvcml0eS4KKwogRGF0YSBNb2RlCiA9PT09PT09PT0KIFRoZXJlIGFyZSAzIGRpZmZlcmVudCBkYXRhIG1vZGVzOgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9vY2ZzMi50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL29jZnMyLnR4dAppbmRleCA2NzMxMGZiLi5jMmEwODcxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL29jZnMyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL29jZnMyLnR4dApAQCAtMzEsNyArMzEsNiBAQAogCS0gcXVvdGFzCiAJLSBEaXJlY3RvcnkgY2hhbmdlIG5vdGlmaWNhdGlvbiAoRl9OT1RJRlkpCiAJLSBEaXN0cmlidXRlZCBDYWNoaW5nIChGX1NFVExFQVNFL0ZfR0VUTEVBU0UvYnJlYWtfbGVhc2UpCi0JLSBQT1NJWCBBQ0xzCiAKIE1vdW50IG9wdGlvbnMKID09PT09PT09PT09PT0KQEAgLTc5LDMgKzc4LDUgQEAKIAkJCWJpdHMgb2Ygc2lnbmlmaWNhbmNlLgogdXNlcl94YXR0cgkoKikJRW5hYmxlcyBFeHRlbmRlZCBVc2VyIEF0dHJpYnV0ZXMuCiBub3VzZXJfeGF0dHIJCURpc2FibGVzIEV4dGVuZGVkIFVzZXIgQXR0cmlidXRlcy4KK2FjbAkJCUVuYWJsZXMgUE9TSVggQWNjZXNzIENvbnRyb2wgTGlzdHMgc3VwcG9ydC4KK25vYWNsCQkoKikJRGlzYWJsZXMgUE9TSVggQWNjZXNzIENvbnRyb2wgTGlzdHMgc3VwcG9ydC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0CmluZGV4IDcxZGYzNTMuLmQxMDVlYjQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dApAQCAtMTQwLDYgKzE0MCw3IEBACiAgc3RhdG0JCVByb2Nlc3MgbWVtb3J5IHN0YXR1cyBpbmZvcm1hdGlvbgogIHN0YXR1cwkJUHJvY2VzcyBzdGF0dXMgaW4gaHVtYW4gcmVhZGFibGUgZm9ybQogIHdjaGFuCQlJZiBDT05GSUdfS0FMTFNZTVMgaXMgc2V0LCBhIHByZS1kZWNvZGVkIHdjaGFuCisgc3RhY2sJCVJlcG9ydCBmdWxsIHN0YWNrIHRyYWNlLCBlbmFibGUgdmlhIENPTkZJR19TVEFDS1RSQUNFCiAgc21hcHMJCUV4dGVuc2lvbiBiYXNlZCBvbiBtYXBzLCB0aGUgcnNzIHNpemUgZm9yIGVhY2ggbWFwcGVkIGZpbGUKIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgogCkBAIC0xMzg1LDYgKzEzODYsMTUgQEAKIHRvIHJldGFpbiBkZW50cnkgYW5kIGlub2RlIGNhY2hlcy4gIEluY3JlYXNpbmcgdmZzX2NhY2hlX3ByZXNzdXJlIGJleW9uZCAxMDAKIGNhdXNlcyB0aGUga2VybmVsIHRvIHByZWZlciB0byByZWNsYWltIGRlbnRyaWVzIGFuZCBpbm9kZXMuCiAKK2RpcnR5X2JhY2tncm91bmRfYnl0ZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ29udGFpbnMgdGhlIGFtb3VudCBvZiBkaXJ0eSBtZW1vcnkgYXQgd2hpY2ggdGhlIHBkZmx1c2ggYmFja2dyb3VuZCB3cml0ZWJhY2sKK2RhZW1vbiB3aWxsIHN0YXJ0IHdyaXRlYmFjay4KKworSWYgZGlydHlfYmFja2dyb3VuZF9ieXRlcyBpcyB3cml0dGVuLCBkaXJ0eV9iYWNrZ3JvdW5kX3JhdGlvIGJlY29tZXMgYSBmdW5jdGlvbgorb2YgaXRzIHZhbHVlIChkaXJ0eV9iYWNrZ3JvdW5kX2J5dGVzIC8gdGhlIGFtb3VudCBvZiBkaXJ0eWFibGUgc3lzdGVtIG1lbW9yeSkuCisKIGRpcnR5X2JhY2tncm91bmRfcmF0aW8KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMTM5MywxNCArMTQwMywyOSBAQAogcGFnZXMgYXQgd2hpY2ggdGhlIHBkZmx1c2ggYmFja2dyb3VuZCB3cml0ZWJhY2sgZGFlbW9uIHdpbGwgc3RhcnQgd3JpdGluZyBvdXQKIGRpcnR5IGRhdGEuCiAKK0lmIGRpcnR5X2JhY2tncm91bmRfcmF0aW8gaXMgd3JpdHRlbiwgZGlydHlfYmFja2dyb3VuZF9ieXRlcyBiZWNvbWVzIGEgZnVuY3Rpb24KK29mIGl0cyB2YWx1ZSAoZGlydHlfYmFja2dyb3VuZF9yYXRpbyAqIHRoZSBhbW91bnQgb2YgZGlydHlhYmxlIHN5c3RlbSBtZW1vcnkpLgorCitkaXJ0eV9ieXRlcworLS0tLS0tLS0tLS0KKworQ29udGFpbnMgdGhlIGFtb3VudCBvZiBkaXJ0eSBtZW1vcnkgYXQgd2hpY2ggYSBwcm9jZXNzIGdlbmVyYXRpbmcgZGlzayB3cml0ZXMKK3dpbGwgaXRzZWxmIHN0YXJ0IHdyaXRlYmFjay4KKworSWYgZGlydHlfYnl0ZXMgaXMgd3JpdHRlbiwgZGlydHlfcmF0aW8gYmVjb21lcyBhIGZ1bmN0aW9uIG9mIGl0cyB2YWx1ZQorKGRpcnR5X2J5dGVzIC8gdGhlIGFtb3VudCBvZiBkaXJ0eWFibGUgc3lzdGVtIG1lbW9yeSkuCisKIGRpcnR5X3JhdGlvCi0tLS0tLS0tLS0tLS0tLS0tLQorLS0tLS0tLS0tLS0KIAogQ29udGFpbnMsIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgZGlydHlhYmxlIHN5c3RlbSBtZW1vcnkgKGZyZWUgcGFnZXMgKyBtYXBwZWQKIHBhZ2VzICsgZmlsZSBjYWNoZSwgbm90IGluY2x1ZGluZyBsb2NrZWQgcGFnZXMgYW5kIEh1Z2VQYWdlcyksIHRoZSBudW1iZXIgb2YKIHBhZ2VzIGF0IHdoaWNoIGEgcHJvY2VzcyB3aGljaCBpcyBnZW5lcmF0aW5nIGRpc2sgd3JpdGVzIHdpbGwgaXRzZWxmIHN0YXJ0CiB3cml0aW5nIG91dCBkaXJ0eSBkYXRhLgogCitJZiBkaXJ0eV9yYXRpbyBpcyB3cml0dGVuLCBkaXJ0eV9ieXRlcyBiZWNvbWVzIGEgZnVuY3Rpb24gb2YgaXRzIHZhbHVlCisoZGlydHlfcmF0aW8gKiB0aGUgYW1vdW50IG9mIGRpcnR5YWJsZSBzeXN0ZW0gbWVtb3J5KS4KKwogZGlydHlfd3JpdGViYWNrX2NlbnRpc2VjcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2FiaXR1Z3VydS1kYXRhc2hlZXQgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2FiaXR1Z3VydS1kYXRhc2hlZXQKaW5kZXggYWVmNWE5Yi4uZDkyNTFlZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9hYml0dWd1cnUtZGF0YXNoZWV0CisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vYWJpdHVndXJ1LWRhdGFzaGVldApAQCAtNzQsNyArNzQsNyBAQAogTm90aWNlIHRoYXQgc29tZSBiYW5rcyBoYXZlIGJvdGggYSByZWFkIGFuZCBhIHdyaXRlIGFkZHJlc3MgdGhpcyBpcyBob3cgdGhlCiB1R3VydSBkZXRlcm1pbmVzIGlmIGEgcmVhZCBmcm9tIG9yIGEgd3JpdGUgdG8gdGhlIGJhbmsgaXMgdGFraW5nIHBsYWNlLCB0aHVzCiB3aGVuIHJlYWRpbmcgeW91IHNob3VsZCBhbHdheXMgdXNlIHRoZSByZWFkIGFkZHJlc3MgYW5kIHdoZW4gd3JpdGluZyB0aGUKLXdyaXRlIGFkZHJlc3MuIFRoZSB3cml0ZSBhZGRyZXNzIGlzIGFsd2F5cyBvbmUgKDEpIG1vcmUgdGhlbiB0aGUgcmVhZCBhZGRyZXNzLgord3JpdGUgYWRkcmVzcy4gVGhlIHdyaXRlIGFkZHJlc3MgaXMgYWx3YXlzIG9uZSAoMSkgbW9yZSB0aGFuIHRoZSByZWFkIGFkZHJlc3MuCiAKIAogdUd1cnUgcmVhZHkKQEAgLTEyMSw3ICsxMjEsNyBAQAogdGVzdCBmb3IgdGhpcy4gTm90aWNlIHRoYXQgdGhlIG51bWJlciBvZiBieXRlcyBpcyBiYW5rIGFkZHJlc3MgZGVwZW5kZW50IHNlZQogYWJvdmUgYW5kIGJlbG93LgogCi1BZnRlciBjb21wbGV0aW5nIGEgc3VjY2Vzc2Z1bGwgcmVhZCBpdCBpcyBhZHZpc2VkIHRvIHB1dCB0aGUgdUd1cnUgYmFjayBpbgorQWZ0ZXIgY29tcGxldGluZyBhIHN1Y2Nlc3NmdWwgcmVhZCBpdCBpcyBhZHZpc2VkIHRvIHB1dCB0aGUgdUd1cnUgYmFjayBpbgogcmVhZHkgbW9kZSwgc28gdGhhdCBpdCBpcyByZWFkeSBmb3IgdGhlIG5leHQgcmVhZCAvIHdyaXRlIGN5Y2xlLiBUaGlzIHdheQogaWYgeW91ciBwcm9ncmFtIC8gZHJpdmVyIGlzIHVubG9hZGVkIGFuZCBsYXRlciBsb2FkZWQgYWdhaW4gdGhlIGRldGVjdGlvbgogYWxnb3JpdGhtIGRlc2NyaWJlZCBhYm92ZSB3aWxsIHN0aWxsIHdvcmsuCkBAIC0xNDEsNyArMTQxLDcgQEAKIAogT25jZSBEQVRBIGhvbGRzIDB4MDEgcmVhZCBDTUQgaXQgc2hvdWxkIGhvbGQgMHhBQyBub3cuCiAKLUFmdGVyIGNvbXBsZXRpbmcgYSBzdWNjZXNzZnVsbCB3cml0ZSBpdCBpcyBhZHZpc2VkIHRvIHB1dCB0aGUgdUd1cnUgYmFjayBpbgorQWZ0ZXIgY29tcGxldGluZyBhIHN1Y2Nlc3NmdWwgd3JpdGUgaXQgaXMgYWR2aXNlZCB0byBwdXQgdGhlIHVHdXJ1IGJhY2sgaW4KIHJlYWR5IG1vZGUsIHNvIHRoYXQgaXQgaXMgcmVhZHkgZm9yIHRoZSBuZXh0IHJlYWQgLyB3cml0ZSBjeWNsZS4gVGhpcyB3YXkKIGlmIHlvdXIgcHJvZ3JhbSAvIGRyaXZlciBpcyB1bmxvYWRlZCBhbmQgbGF0ZXIgbG9hZGVkIGFnYWluIHRoZSBkZXRlY3Rpb24KIGFsZ29yaXRobSBkZXNjcmliZWQgYWJvdmUgd2lsbCBzdGlsbCB3b3JrLgpAQCAtMjI0LDcgKzIyNCw3IEBACiBCaXQgNDogMSBpZiBhbGFybSBjYXVzZSBtZWFzdXJlZCB0ZW1wIGlzIG92ZXIgdGhlIHdhcm5pbmcgdGhyZXNob2xkCShSKQogQml0IDU6IDEgaWYgYWxhcm0gY2F1c2UgbWVhc3VyZWQgdm9sdCBpcyBvdmVyIHRoZSBtYXggdGhyZXNob2xkCQkoUikKIEJpdCA2OiAxIGlmIGFsYXJtIGNhdXNlIG1lYXN1cmVkIHZvbHQgaXMgdW5kZXIgdGhlIG1pbiB0aHJlc2hvbGQJKFIpCi1CaXQgNzogVm9sdCBzZW5zb3I6IFNodXRkb3duIGlmIGFsYXJtIHBlcnNpc3QgZm9yIG1vcmUgdGhlbiA0IHNlY29uZHMJKFJXKQorQml0IDc6IFZvbHQgc2Vuc29yOiBTaHV0ZG93biBpZiBhbGFybSBwZXJzaXN0IGZvciBtb3JlIHRoYW4gNCBzZWNvbmRzCShSVykKICAgICAgICBUZW1wIHNlbnNvcjogU2h1dGRvd24gaWYgdGVtcCBpcyBvdmVyIHRoZSBzaHV0ZG93biB0aHJlc2hvbGQJKFJXKQogCiAqICBUaGlzIGJpdCBpcyBvbmx5IGhvbm9yZWQvdXNlZCBieSB0aGUgdUd1cnUgaWYgYSB0ZW1wIHNlbnNvciBpcyBjb25uZWN0ZWQKQEAgLTI5Myw3ICsyOTMsNyBAQAogQWxhcm0gYmVoYXZpb3VyIGZvciB0aGUgc2VsZWN0ZWQgc2Vuc29yLiBBIDEgZW5hYmxlcyB0aGUgZGVzY3JpYmVkIGJlaGF2aW91ci4KIEJpdCAwOiBHaXZlIGFuIGFsYXJtIGlmIG1lYXN1cmVkIHJwbSBpcyB1bmRlciB0aGUgbWluIHRocmVzaG9sZAkoUlcpCiBCaXQgMzogQmVlcCBpZiBhbGFybQkJCQkJCShSVykKLUJpdCA3OiBTaHV0ZG93biBpZiBhbGFybSBwZXJzaXN0IGZvciBtb3JlIHRoZW4gNCBzZWNvbmRzCShSVykKK0JpdCA3OiBTaHV0ZG93biBpZiBhbGFybSBwZXJzaXN0IGZvciBtb3JlIHRoYW4gNCBzZWNvbmRzCShSVykKIAogQnl0ZSAxOgogbWluIHRocmVzaG9sZCAoc2NhbGUgYXMgYmFuayAweDI2KQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9hZHQ3NDcwIGIvRG9jdW1lbnRhdGlvbi9od21vbi9hZHQ3NDcwCmluZGV4IDc1ZDEzY2EuLjhjZTRhYTAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vYWR0NzQ3MAorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkdDc0NzAKQEAgLTMxLDE1ICszMSwxMSBAQAogbGltaXQgdmFsdWVzLiBUaGUgQURUNzQ3MCB3aWxsIHNpZ25hbCBhbiBBTEFSTSBpZiBhbnkgbWVhc3VyZWQgdmFsdWUgZXhjZWVkcwogZWl0aGVyIGxpbWl0LgogCi1UaGUgQURUNzQ3MCBET0VTIE5PVCBzYW1wbGUgYWxsIGlucHV0cyBjb250aW51b3VzbHkuICBBIHNpbmdsZSBwaW4gb24gdGhlCi1BRFQ3NDcwIGlzIGNvbm5lY3RlZCB0byBhIG11bHRpdHVkZSBvZiB0aGVybWFsIGRpb2RlcywgYnV0IHRoZSBjaGlwIG11c3QgYmUKLWluc3RydWN0ZWQgZXhwbGljaXRseSB0byByZWFkIHRoZSBtdWx0aXR1ZGUgb2YgZGlvZGVzLiAgSWYgeW91IHdhbnQgdG8gdXNlCi1hdXRvbWF0aWMgZmFuIGNvbnRyb2wgbW9kZSwgeW91IG11c3QgbWFudWFsbHkgcmVhZCBhbnkgb2YgdGhlIHRlbXBlcmF0dXJlCi1zZW5zb3JzIG9yIHRoZSBmYW4gY29udHJvbCBhbGdvcml0aG0gd2lsbCBub3QgcnVuLiAgVGhlIGNoaXAgV0lMTCBOT1QgRE8gVEhJUwotQVVUT01BVElDQUxMWTsgdGhpcyBtdXN0IGJlIGRvbmUgZnJvbSB1c2Vyc3BhY2UuICBUaGlzIG1heSBiZSBhIGJ1ZyBpbiB0aGUgY2hpcAotZGVzaWduLCBnaXZlbiB0aGF0IG1hbnkgb3RoZXIgQUQgY2hpcHMgdGFrZSBjYXJlIG9mIHRoaXMuICBUaGUgZHJpdmVyIHdpbGwgbm90Ci1yZWFkIHRoZSByZWdpc3RlcnMgbW9yZSBvZnRlbiB0aGFuIG9uY2UgZXZlcnkgNSBzZWNvbmRzLiAgRnVydGhlciwKLWNvbmZpZ3VyYXRpb24gZGF0YSBpcyBvbmx5IHJlYWQgb25jZSBwZXIgbWludXRlLgorVGhlIEFEVDc0NzAgc2FtcGxlcyBhbGwgaW5wdXRzIGNvbnRpbnVvdXNseS4gIEEga2VybmVsIHRocmVhZCBpcyBzdGFydGVkIHVwIGZvcgordGhlIHB1cnBvc2Ugb2YgcGVyaW9kaWNhbGx5IHF1ZXJ5aW5nIHRoZSB0ZW1wZXJhdHVyZSBzZW5zb3JzLCB0aHVzIGFsbG93aW5nIHRoZQorYXV0b21hdGljIGZhbiBwd20gY29udHJvbCB0byBzZXQgdGhlIGZhbiBzcGVlZC4gIFRoZSBkcml2ZXIgd2lsbCBub3QgcmVhZCB0aGUKK3JlZ2lzdGVycyBtb3JlIG9mdGVuIHRoYW4gb25jZSBldmVyeSA1IHNlY29uZHMuICBGdXJ0aGVyLCBjb25maWd1cmF0aW9uIGRhdGEgaXMKK29ubHkgcmVhZCBvbmNlIHBlciBtaW51dGUuCiAKIFNwZWNpYWwgRmVhdHVyZXMKIC0tLS0tLS0tLS0tLS0tLS0KQEAgLTcyLDUgKzY4LDYgQEAKIE5vdGVzCiAtLS0tLQogCi1BcyBzdGF0ZWQgYWJvdmUsIHRoZSB0ZW1wZXJhdHVyZSBpbnB1dHMgbXVzdCBiZSByZWFkIHBlcmlvZGljYWxseSBmcm9tCi11c2Vyc3BhY2UgaW4gb3JkZXIgZm9yIHRoZSBhdXRvbWF0aWMgcHdtIGFsZ29yaXRobSB0byBydW4uCitUaGUgdGVtcGVyYXR1cmUgaW5wdXRzIG5vIGxvbmdlciBuZWVkIHRvIGJlIHJlYWQgcGVyaW9kaWNhbGx5IGZyb20gdXNlcnNwYWNlIGluCitvcmRlciBmb3IgdGhlIGF1dG9tYXRpYyBwd20gYWxnb3JpdGhtIHRvIHJ1bi4gIFRoaXMgd2FzIHRoZSBjYXNlIGZvciBlYXJsaWVyCit2ZXJzaW9ucyBvZiB0aGUgZHJpdmVyLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9mNzE4ODJmZyBiL0RvY3VtZW50YXRpb24vaHdtb24vZjcxODgyZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgzMjEyNgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vZjcxODgyZmcKQEAgLTAsMCArMSw4OSBAQAorS2VybmVsIGRyaXZlciBmNzE4ODJmZworPT09PT09PT09PT09PT09PT09PT09PQorCitTdXBwb3J0ZWQgY2hpcHM6CisgICogRmludGVrIEY3MTg4MkZHIGFuZCBGNzE4ODNGRworICAgIFByZWZpeDogJ2Y3MTg4MmZnJworICAgIEFkZHJlc3NlcyBzY2FubmVkOiBub25lLCBhZGRyZXNzIHJlYWQgZnJvbSBTdXBlciBJL08gY29uZmlnIHNwYWNlCisgICAgRGF0YXNoZWV0OiBBdmFpbGFibGUgZnJvbSB0aGUgRmludGVrIHdlYnNpdGUKKyAgKiBGaW50ZWsgRjcxODYyRkcgYW5kIEY3MTg2M0ZHCisgICAgUHJlZml4OiAnZjcxODYyZmcnCisgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IG5vbmUsIGFkZHJlc3MgcmVhZCBmcm9tIFN1cGVyIEkvTyBjb25maWcgc3BhY2UKKyAgICBEYXRhc2hlZXQ6IEF2YWlsYWJsZSBmcm9tIHRoZSBGaW50ZWsgd2Vic2l0ZQorICAqIEZpbnRlayBGODAwMAorICAgIFByZWZpeDogJ2Y4MDAwJworICAgIEFkZHJlc3NlcyBzY2FubmVkOiBub25lLCBhZGRyZXNzIHJlYWQgZnJvbSBTdXBlciBJL08gY29uZmlnIHNwYWNlCisgICAgRGF0YXNoZWV0OiBOb3QgcHVibGljCisKK0F1dGhvcjogSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4KKworCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKworRmludGVrIEY3MTh4eEZHL0Y4MDAwIFN1cGVyIEkvTyBjaGlwcyBpbmNsdWRlIGNvbXBsZXRlIGhhcmR3YXJlIG1vbml0b3JpbmcKK2NhcGFiaWxpdGllcy4gVGhleSBjYW4gbW9uaXRvciB1cCB0byA5IHZvbHRhZ2VzICgzIGZvciB0aGUgRjgwMDApLCA0IGZhbnMgYW5kCiszIHRlbXBlcmF0dXJlIHNlbnNvcnMuCisKK1RoZXNlIGNoaXBzIGFsc28gaGF2ZSBmYW4gY29udHJvbGxpbmcgZmVhdHVyZXMsIHVzaW5nIGVpdGhlciBEQyBvciBQV00sIGluCit0aHJlZSBkaWZmZXJlbnQgbW9kZXMgKG9uZSBtYW51YWwsIHR3byBhdXRvbWF0aWMpLgorCitUaGUgZHJpdmVyIGFzc3VtZXMgdGhhdCBubyBtb3JlIHRoYW4gb25lIGNoaXAgaXMgcHJlc2VudCwgd2hpY2ggc2VlbXMKK3JlYXNvbmFibGUuCisKKworTW9uaXRvcmluZworLS0tLS0tLS0tLQorCitUaGUgVm9sdGFnZSwgRmFuIGFuZCBUZW1wZXJhdHVyZSBNb25pdG9yaW5nIHVzZXMgdGhlIHN0YW5kYXJkIHN5c2ZzCitpbnRlcmZhY2UgYXMgZG9jdW1lbnRlZCBpbiBzeXNmcy1pbnRlcmZhY2UsIHdpdGhvdXQgYW55IGV4Y2VwdGlvbnMuCisKKworRmFuIENvbnRyb2wKKy0tLS0tLS0tLS0tCisKK0JvdGggUFdNIChwdWxzZS13aWR0aCBtb2R1bGF0aW9uKSBhbmQgREMgZmFuIHNwZWVkIGNvbnRyb2wgbWV0aG9kcyBhcmUKK3N1cHBvcnRlZC4gVGhlIHJpZ2h0IG9uZSB0byB1c2UgZGVwZW5kcyBvbiBleHRlcm5hbCBjaXJjdWl0cnkgb24gdGhlCittb3RoZXJib2FyZCwgc28gdGhlIGRyaXZlciBhc3N1bWVzIHRoYXQgdGhlIEJJT1Mgc2V0IHRoZSBtZXRob2QKK3Byb3Blcmx5LgorCitUaGVyZSBhcmUgMiBtb2RlcyB0byBzcGVjaWZ5IHRoZSBzcGVlZCBvZiB0aGUgZmFuLCBQV00gZHV0eSBjeWNsZSAob3IgREMKK3ZvbHRhZ2UpIG1vZGUsIHdoZXJlIDAtMTAwJSBkdXR5IGN5Y2xlICgwLTEwMCUgb2YgMTJWKSBpcyBzcGVjaWZpZWQuIEFuZCBSUE0KK21vZGUgd2hlcmUgdGhlIGFjdHVhbCBSUE0gb2YgdGhlIGZhbiAoYXMgbWVhc3VyZWQpIGlzIGNvbnRyb2xsZWQgYW5kIHRoZSBzcGVlZAorZ2V0cyBzcGVjaWZpZWQgYXMgMC0xMDAlIG9mIHRoZSBmYW4jX2Z1bGxfc3BlZWQgZmlsZS4KKworU2luY2UgYm90aCBtb2RlcyB3b3JrIGluIGEgMC0xMDAlIChtYXBwZWQgdG8gMC0yNTUpIHNjYWxlLCB0aGVyZSBpc24ndCBhCit3aG9sZSBsb3Qgb2YgYSBkaWZmZXJlbmNlIHdoZW4gbW9kaWZ5aW5nIGZhbiBjb250cm9sIHNldHRpbmdzLiBUaGUgb25seQoraW1wb3J0YW50IGRpZmZlcmVuY2UgaXMgdGhhdCBpbiBSUE0gbW9kZSB0aGUgMC0xMDAlIGNvbnRyb2xzIHRoZSBmYW4gc3BlZWQKK2JldHdlZW4gMC0xMDAlIG9mIGZhbiNfZnVsbF9zcGVlZC4gSXQgaXMgYXNzdW1lZCB0aGF0IGlmIHRoZSBCSU9TIHByb2dyYW1zCitSUE0gbW9kZSwgaXQgd2lsbCBhbHNvIHNldCBmYW4jX2Z1bGxfc3BlZWQgcHJvcGVybHksIGlmIGl0IGRvZXMgbm90IHRoZW4KK2ZhbiBjb250cm9sIHdpbGwgbm90IHdvcmsgcHJvcGVybHksIHVubGVzcyB5b3Ugc2V0IGEgc2FuZSBmYW4jX2Z1bGxfc3BlZWQKK3ZhbHVlIHlvdXJzZWxmLgorCitTd2l0Y2hpbmcgYmV0d2VlbiB0aGVzZSBtb2RlcyByZXF1aXJlcyByZS1pbml0aWFsaXppbmcgYSB3aG9sZSBidW5jaCBvZgorcmVnaXN0ZXJzLCBzbyB0aGUgbW9kZSB3aGljaCB0aGUgQklPUyBoYXMgc2V0IGlzIGtlcHQuIFRoZSBtb2RlIGlzCitwcmludGVkIHdoZW4gbG9hZGluZyB0aGUgZHJpdmVyLgorCitUaHJlZSBkaWZmZXJlbnQgZmFuIGNvbnRyb2wgbW9kZXMgYXJlIHN1cHBvcnRlZDsgdGhlIG1vZGUgbnVtYmVyIGlzIHdyaXR0ZW4KK3RvIHRoZSBwd20jX2VuYWJsZSBmaWxlLiBOb3RlIHRoYXQgbm90IGFsbCBtb2RlcyBhcmUgc3VwcG9ydGVkIG9uIGFsbAorY2hpcHMsIGFuZCBzb21lIG1vZGVzIG1heSBvbmx5IGJlIGF2YWlsYWJsZSBpbiBSUE0gLyBQV00gbW9kZSBvbiB0aGUgRjgwMDAuCitXcml0aW5nIGFuIHVuc3VwcG9ydGVkIG1vZGUgd2lsbCByZXN1bHQgaW4gYW4gaW52YWxpZCBwYXJhbWV0ZXIgZXJyb3IuCisKKyogMTogTWFudWFsIG1vZGUKKyAgWW91IGFzayBmb3IgYSBzcGVjaWZpYyBQV00gZHV0eSBjeWNsZSAvIERDIHZvbHRhZ2Ugb3IgYSBzcGVjaWZpYyAlIG9mCisgIGZhbiNfZnVsbF9zcGVlZCBieSB3cml0aW5nIHRvIHRoZSBwd20jIGZpbGUuIFRoaXMgbW9kZSBpcyBvbmx5CisgIGF2YWlsYWJsZSBvbiB0aGUgRjgwMDAgaWYgdGhlIGZhbiBjaGFubmVsIGlzIGluIFJQTSBtb2RlLgorCisqIDI6IE5vcm1hbCBhdXRvIG1vZGUKKyAgWW91IGNhbiBkZWZpbmUgYSBudW1iZXIgb2YgdGVtcGVyYXR1cmUvZmFuIHNwZWVkIHRyaXAgcG9pbnRzLCB3aGljaCAlIHRoZQorICBmYW4gc2hvdWxkIHJ1biBhdCBhdCB0aGlzIHRlbXAgYW5kIHdoaWNoIHRlbXAgYSBmYW4gc2hvdWxkIGZvbGxvdyB1c2luZyB0aGUKKyAgc3RhbmRhcmQgc3lzZnMgaW50ZXJmYWNlLiBUaGUgbnVtYmVyIGFuZCB0eXBlIG9mIHRyaXAgcG9pbnRzIGlzIGNoaXAKKyAgZGVwZW5kZWQsIHNlZSB3aGljaCBmaWxlcyBhcmUgYXZhaWxhYmxlIGluIHN5c2ZzLgorICBGYW4vUFdNIGNoYW5uZWwgMyBvZiB0aGUgRjgwMDAgaXMgYWx3YXlzIGluIHRoaXMgbW9kZSEKKworKiAzOiBUaGVybW9zdGF0IG1vZGUgKE9ubHkgYXZhaWxhYmxlIG9uIHRoZSBGODAwMCB3aGVuIGluIGR1dHkgY3ljbGUgbW9kZSkKKyAgVGhlIGZhbiBzcGVlZCBpcyByZWd1bGF0ZWQgdG8ga2VlcCB0aGUgdGVtcCB0aGUgZmFuIGlzIG1hcHBlZCB0byBiZXR3ZWVuCisgIHRlbXAjX2F1dG9fcG9pbnQyX3RlbXAgYW5kIHRlbXAjX2F1dG9fcG9pbnQzX3RlbXAuCisKK0JvdGggb2YgdGhlIGF1dG9tYXRpYyBtb2RlcyByZXF1aXJlIHRoYXQgcHdtMSBjb3JyZXNwb25kcyB0byBmYW4xLCBwd20yIHRvCitmYW4yIGFuZCBwd20zIHRvIGZhbjMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2l0ODcgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2l0ODcKaW5kZXggMDQyYzA0MS4uNjU5MzE1ZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9pdDg3CisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vaXQ4NwpAQCAtMjYsNiArMjYsMTAgQEAKICAgICBEYXRhc2hlZXQ6IFB1YmxpY2x5IGF2YWlsYWJsZSBhdCB0aGUgSVRFIHdlYnNpdGUKICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuaXRlLmNvbS50dy9wcm9kdWN0X2luZm8vZmlsZS9wYy9JVDg3MThGX1YwLjIuemlwCiAgICAgICAgICAgICAgICBodHRwOi8vd3d3Lml0ZS5jb20udHcvcHJvZHVjdF9pbmZvL2ZpbGUvcGMvSVQ4NzE4Rl9WMCUyMDNfKGZvciUyMEMlMjB2ZXJzaW9uKS56aXAKKyAgKiBJVDg3MjBGCisgICAgUHJlZml4OiAnaXQ4NzIwJworICAgIEFkZHJlc3NlcyBzY2FubmVkOiBmcm9tIFN1cGVyIEkvTyBjb25maWcgc3BhY2UgKDggSS9PIHBvcnRzKQorICAgIERhdGFzaGVldDogTm90IHlldCBwdWJsaWNseSBhdmFpbGFibGUuCiAgICogU2lTOTUwICAgW2Nsb25lIG9mIElUODcwNUZdCiAgICAgUHJlZml4OiAnaXQ4NycKICAgICBBZGRyZXNzZXMgc2Nhbm5lZDogZnJvbSBTdXBlciBJL08gY29uZmlnIHNwYWNlICg4IEkvTyBwb3J0cykKQEAgLTcxLDcgKzc1LDcgQEAKIC0tLS0tLS0tLS0tCiAKIFRoaXMgZHJpdmVyIGltcGxlbWVudHMgc3VwcG9ydCBmb3IgdGhlIElUODcwNUYsIElUODcxMkYsIElUODcxNkYsCi1JVDg3MThGLCBJVDg3MjZGIGFuZCBTaVM5NTAgY2hpcHMuCitJVDg3MThGLCBJVDg3MjBGLCBJVDg3MjZGIGFuZCBTaVM5NTAgY2hpcHMuCiAKIFRoZXNlIGNoaXBzIGFyZSAnU3VwZXIgSS9PIGNoaXBzJywgc3VwcG9ydGluZyBmbG9wcHkgZGlza3MsIGluZnJhcmVkIHBvcnRzLAogam95c3RpY2tzIGFuZCBvdGhlciBtaXNjZWxsYW5lb3VzIHN0dWZmLiBGb3IgaGFyZHdhcmUgbW9uaXRvcmluZywgdGhleQpAQCAtODQsMTkgKzg4LDE5IEBACiB0aG91Z2gsIHNvIHRoZSBmdW5jdGlvbmFsaXR5IG1heSBub3QgYmUgYXZhaWxhYmxlIG9uIGEgZ2l2ZW4gc3lzdGVtLgogVGhlIGRyaXZlciBkdW1ibHkgYXNzdW1lIGl0IGlzIHRoZXJlLgogCi1UaGUgSVQ4NzE4RiBhbHNvIGZlYXR1cmVzIFZJRCBpbnB1dHMgKHVwIHRvIDggcGlucykgYnV0IHRoZSB2YWx1ZSBpcwotc3RvcmVkIGluIHRoZSBTdXBlci1JL08gY29uZmlndXJhdGlvbiBzcGFjZS4gRHVlIHRvIHRlY2huaWNhbCBsaW1pdGF0aW9ucywKK1RoZSBJVDg3MThGIGFuZCBJVDg3MjBGIGFsc28gZmVhdHVyZXMgVklEIGlucHV0cyAodXAgdG8gOCBwaW5zKSBidXQgdGhlIHZhbHVlCitpcyBzdG9yZWQgaW4gdGhlIFN1cGVyLUkvTyBjb25maWd1cmF0aW9uIHNwYWNlLiBEdWUgdG8gdGVjaG5pY2FsIGxpbWl0YXRpb25zLAogdGhpcyB2YWx1ZSBjYW4gY3VycmVudGx5IG9ubHkgYmUgcmVhZCBvbmNlIGF0IGluaXRpYWxpemF0aW9uIHRpbWUsIHNvCiB0aGUgZHJpdmVyIHdvbid0IG5vdGljZSBhbmQgcmVwb3J0IGNoYW5nZXMgaW4gdGhlIFZJRCB2YWx1ZS4gVGhlIHR3bwogdXBwZXIgVklEIGJpdHMgc2hhcmUgdGhlaXIgcGlucyB3aXRoIHZvbHRhZ2UgaW5wdXRzIChpbjUgYW5kIGluNikgc28geW91CiBjYW4ndCBoYXZlIGJvdGggb24gYSBnaXZlbiBib2FyZC4KIAotVGhlIElUODcxNkYsIElUODcxOEYgYW5kIGxhdGVyIElUODcxMkYgcmV2aXNpb25zIGhhdmUgc3VwcG9ydCBmb3IKK1RoZSBJVDg3MTZGLCBJVDg3MThGLCBJVDg3MjBGIGFuZCBsYXRlciBJVDg3MTJGIHJldmlzaW9ucyBoYXZlIHN1cHBvcnQgZm9yCiAyIGFkZGl0aW9uYWwgZmFucy4gVGhlIGFkZGl0aW9uYWwgZmFucyBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBkcml2ZXIuCiAKLVRoZSBJVDg3MTZGIGFuZCBJVDg3MThGLCBhbmQgbGF0ZSBJVDg3MTJGIGFuZCBJVDg3MDVGIGFsc28gaGF2ZSBvcHRpb25hbAotMTYtYml0IHRhY2hvbWV0ZXIgY291bnRlcnMgZm9yIGZhbnMgMSB0byAzLiBUaGlzIGlzIGJldHRlciAobm8gbW9yZSBmYW4KLWNsb2NrIGRpdmlkZXIgbWVzcykgYnV0IG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIG9sZGVyIGNoaXBzIGFuZAorVGhlIElUODcxNkYsIElUODcxOEYgYW5kIElUODcyMEYsIGFuZCBsYXRlIElUODcxMkYgYW5kIElUODcwNUYgYWxzbyBoYXZlCitvcHRpb25hbCAxNi1iaXQgdGFjaG9tZXRlciBjb3VudGVycyBmb3IgZmFucyAxIHRvIDMuIFRoaXMgaXMgYmV0dGVyIChubyBtb3JlCitmYW4gY2xvY2sgZGl2aWRlciBtZXNzKSBidXQgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgb2xkZXIgY2hpcHMgYW5kCiByZXZpc2lvbnMuIFRoZSAxNi1iaXQgdGFjaG9tZXRlciBtb2RlIGlzIGVuYWJsZWQgYnkgdGhlIGRyaXZlciB3aGVuIG9uZQogb2YgdGhlIGFib3ZlIGNoaXBzIGlzIGRldGVjdGVkLgogCkBAIC0xMjIsNyArMTI2LDcgQEAKIGlucHV0cyBjYW4gbWVhc3VyZSB2b2x0YWdlcyBiZXR3ZWVuIDAgYW5kIDQuMDggdm9sdHMsIHdpdGggYSByZXNvbHV0aW9uIG9mCiAwLjAxNiB2b2x0LiBUaGUgYmF0dGVyeSB2b2x0YWdlIGluOCBkb2VzIG5vdCBoYXZlIGxpbWl0IHJlZ2lzdGVycy4KIAotVGhlIFZJRCBsaW5lcyAoSVQ4NzEyRi9JVDg3MTZGL0lUODcxOEYpIGVuY29kZSB0aGUgY29yZSB2b2x0YWdlIHZhbHVlOgorVGhlIFZJRCBsaW5lcyAoSVQ4NzEyRi9JVDg3MTZGL0lUODcxOEYvSVQ4NzIwRikgZW5jb2RlIHRoZSBjb3JlIHZvbHRhZ2UgdmFsdWU6CiB0aGUgdm9sdGFnZSBsZXZlbCB5b3VyIHByb2Nlc3NvciBzaG91bGQgd29yayB3aXRoLiBUaGlzIGlzIGhhcmRjb2RlZCBieQogdGhlIG1haW5ib2FyZCBhbmQvb3IgcHJvY2Vzc29yIGl0c2VsZi4gSXQgaXMgYSB2YWx1ZSBpbiB2b2x0cy4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9sbTcwIGIvRG9jdW1lbnRhdGlvbi9od21vbi9sbTcwCmluZGV4IDJiZGQzZmUuLjBkMjQwMjkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vbG03MAorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtNzAKQEAgLTEsOSArMSwxMSBAQAogS2VybmVsIGRyaXZlciBsbTcwCiA9PT09PT09PT09PT09PT09PT0KIAotU3VwcG9ydGVkIGNoaXA6CitTdXBwb3J0ZWQgY2hpcHM6CiAgICogTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTcwCiAgICAgRGF0YXNoZWV0OiBodHRwOi8vd3d3Lm5hdGlvbmFsLmNvbS9wZi9MTS9MTTcwLmh0bWwKKyAgKiBUZXhhcyBJbnN0cnVtZW50cyBUTVAxMjEvVE1QMTIzCisgICAgSW5mb3JtYXRpb246IGh0dHA6Ly9mb2N1cy50aS5jb20vZG9jcy9wcm9kL2ZvbGRlcnMvcHJpbnQvdG1wMTIxLmh0bWwKIAogQXV0aG9yOgogICAgICAgICBLYWl3YW4gTiBCaWxsaW1vcmlhIDxrYWl3YW5AZGVzaWduZXJncmFwaGl4LmNvbT4KQEAgLTI1LDYgKzI3LDE0IEBACiBkcml2ZXIgZm9yIGludGVycHJldGF0aW9uLiBUaGlzIGRyaXZlciBtYWtlcyB1c2Ugb2YgdGhlIGtlcm5lbCdzIGluLWNvcmUKIFNQSSBzdXBwb3J0LgogCitBcyBhIHJlYWwgKGluLXRyZWUpIGV4YW1wbGUgb2YgdGhpcyAiU1BJIHByb3RvY29sIGRyaXZlciIgaW50ZXJmYWNpbmcKK3dpdGggYSAiU1BJIG1hc3RlciBjb250cm9sbGVyIGRyaXZlciIsIHNlZSBkcml2ZXJzL3NwaS9zcGlfbG03MGxscC5jCithbmQgaXRzIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbi4KKworVGhlIFRNUDEyMS9UTVAxMjMgYXJlIHZlcnkgc2ltaWxhcjsgbWFpbiBkaWZmZXJlbmNlcyBhcmUgNCB3aXJlIFNQSSBpbnRlci0KK2ZhY2UgKHJlYWQgb25seSkgYW5kIDEzLWJpdCB0ZW1wZXJhdHVyZSBkYXRhICgwLjA2MjUgZGVncmVlcyBjZWxzaXVzIHJlc28tCitsdXRpb24pLgorCiBUaGFua3MgdG8KIC0tLS0tLS0tLQogSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+IGZvciBtZW50b3JpbmcgdGhlIGh3bW9uLXNpZGUgZHJpdmVyCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtODUgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtODUKaW5kZXggNDAwNjIwNy4uYTEzNjgwOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9sbTg1CisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vbG04NQpAQCAtMTY0LDcgKzE2NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgdGVtcGVyYXR1cmUuIChQV00gdmFsdWUgZnJvbSAwIHRvIDI1NSkKIAogKiBwd20jX2F1dG9fcHdtX21pbmN0bCAtIHRoaXMgZmxhZ3Mgc2VsZWN0cyBmb3IgdGVtcCNfYXV0b190ZW1wX29mZiB0ZW1wZXJhdHVyZQotICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiYWhhdmlvdXIgb2YgZmFucy4gV3JpdGUgMSB0byBsZXQgZmFucyBzcGlubmluZyBhdAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiZWhhdmlvdXIgb2YgZmFucy4gV3JpdGUgMSB0byBsZXQgZmFucyBzcGlubmluZyBhdAogCQkJIHB3bSNfYXV0b19wd21fbWluIG9yIHdyaXRlIDAgdG8gbGV0IHRoZW0gb2ZmLgogCiBOT1RFOiBJdCBoYXMgYmVlbiByZXBvcnRlZCB0aGF0IHRoZXJlIGlzIGEgYnVnIGluIHRoZSBMTTg1IHRoYXQgY2F1c2VzIHRoZSBmbGFnCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2x0YzQyNDUgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2x0YzQyNDUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFlN2EzYQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vbHRjNDI0NQpAQCAtMCwwICsxLDgxIEBACitLZXJuZWwgZHJpdmVyIGx0YzQyNDUKKz09PT09PT09PT09PT09PT09PT09PQorCitTdXBwb3J0ZWQgY2hpcHM6CisgICogTGluZWFyIFRlY2hub2xvZ3kgTFRDNDI0NQorICAgIFByZWZpeDogJ2x0YzQyNDUnCisgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IDB4MjAtMHgzZgorICAgIERhdGFzaGVldDoKKyAgICAgICAgaHR0cDovL3d3dy5saW5lYXIuY29tL3BjL2Rvd25sb2FkRG9jdW1lbnQuZG8/bmF2SWQ9SDAsQzEsQzEwMDMsQzEwMDYsQzExNDAsUDE5MzkyLEQxMzUxNworCitBdXRob3I6IElyYSBXLiBTbnlkZXIgPGl3c0BvdnJvLmNhbHRlY2guZWR1PgorCisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorCitUaGUgTFRDNDI0NSBjb250cm9sbGVyIGFsbG93cyBhIGJvYXJkIHRvIGJlIHNhZmVseSBpbnNlcnRlZCBhbmQgcmVtb3ZlZAorZnJvbSBhIGxpdmUgYmFja3BsYW5lIGluIG11bHRpcGxlIHN1cHBseSBzeXN0ZW1zIHN1Y2ggYXMgQ29tcGFjdFBDSSBhbmQKK1BDSSBFeHByZXNzLgorCisKK1VzYWdlIE5vdGVzCistLS0tLS0tLS0tLQorCitUaGlzIGRyaXZlciBkb2VzIG5vdCBwcm9iZSBmb3IgTFRDNDI0NSBkZXZpY2VzLCBkdWUgdG8gdGhlIGZhY3QgdGhhdCBzb21lCitvZiB0aGUgcG9zc2libGUgYWRkcmVzc2VzIGFyZSB1bmZyaWVuZGx5IHRvIHByb2JpbmcuIFlvdSB3aWxsIG5lZWQgdG8gdXNlCit0aGUgImZvcmNlIiBwYXJhbWV0ZXIgdG8gdGVsbCB0aGUgZHJpdmVyIHdoZXJlIHRvIGZpbmQgdGhlIGRldmljZS4KKworRXhhbXBsZTogdGhlIGZvbGxvd2luZyB3aWxsIGxvYWQgdGhlIGRyaXZlciBmb3IgYW4gTFRDNDI0NSBhdCBhZGRyZXNzIDB4MjMKK29uIEkyQyBidXMgIzE6CiskIG1vZHByb2JlIGx0YzQyNDUgZm9yY2U9MSwweDIzCisKKworU3lzZnMgZW50cmllcworLS0tLS0tLS0tLS0tLQorCitUaGUgTFRDNDI0NSBoYXMgYnVpbHQtaW4gbGltaXRzIGZvciBvdmVyIGFuZCB1bmRlciBjdXJyZW50IHdhcm5pbmdzLiBUaGlzCittYWtlcyBpdCB2ZXJ5IGxpa2VseSB0aGF0IHRoZSByZWZlcmVuY2UgY2lyY3VpdCB3aWxsIGJlIHVzZWQuCisKK1RoaXMgZHJpdmVyIHVzZXMgdGhlIHZhbHVlcyBpbiB0aGUgZGF0YXNoZWV0IHRvIGNoYW5nZSB0aGUgcmVnaXN0ZXIgdmFsdWVzCitpbnRvIHRoZSB2YWx1ZXMgc3BlY2lmaWVkIGluIHRoZSBzeXNmcy1pbnRlcmZhY2UgZG9jdW1lbnQuIFRoZSBjdXJyZW50IHJlYWRpbmdzCityZWx5IG9uIHRoZSBzZW5zZSByZXNpc3RvcnMgbGlzdGVkIGluIFRhYmxlIDI6ICJTZW5zZSBSZXNpc3RvciBWYWx1ZXMiLgorCitpbjFfaW5wdXQJCTEydiBpbnB1dCB2b2x0YWdlIChtVikKK2luMl9pbnB1dAkJNXYgIGlucHV0IHZvbHRhZ2UgKG1WKQoraW4zX2lucHV0CQkzdiAgaW5wdXQgdm9sdGFnZSAobVYpCitpbjRfaW5wdXQJCVZlZSAoLTEydikgaW5wdXQgdm9sdGFnZSAobVYpCisKK2luMV9taW5fYWxhcm0JCTEydiBpbnB1dCB1bmRlcnZvbHRhZ2UgYWxhcm0KK2luMl9taW5fYWxhcm0JCTV2ICBpbnB1dCB1bmRlcnZvbHRhZ2UgYWxhcm0KK2luM19taW5fYWxhcm0JCTN2ICBpbnB1dCB1bmRlcnZvbHRhZ2UgYWxhcm0KK2luNF9taW5fYWxhcm0JCVZlZSAoLTEydikgaW5wdXQgdW5kZXJ2b2x0YWdlIGFsYXJtCisKK2N1cnIxX2lucHV0CQkxMnYgY3VycmVudCAobUEpCitjdXJyMl9pbnB1dAkJNXYgIGN1cnJlbnQgKG1BKQorY3VycjNfaW5wdXQJCTN2ICBjdXJyZW50IChtQSkKK2N1cnI0X2lucHV0CQlWZWUgKC0xMnYpIGN1cnJlbnQgKG1BKQorCitjdXJyMV9tYXhfYWxhcm0JCTEydiBvdmVyY3VycmVudCBhbGFybQorY3VycjJfbWF4X2FsYXJtCQk1diAgb3ZlcmN1cnJlbnQgYWxhcm0KK2N1cnIzX21heF9hbGFybQkJM3YgIG92ZXJjdXJyZW50IGFsYXJtCitjdXJyNF9tYXhfYWxhcm0JCVZlZSAoLTEydikgb3ZlcmN1cnJlbnQgYWxhcm0KKworaW41X2lucHV0CQkxMnYgb3V0cHV0IHZvbHRhZ2UgKG1WKQoraW42X2lucHV0CQk1diAgb3V0cHV0IHZvbHRhZ2UgKG1WKQoraW43X2lucHV0CQkzdiAgb3V0cHV0IHZvbHRhZ2UgKG1WKQoraW44X2lucHV0CQlWZWUgKC0xMnYpIG91dHB1dCB2b2x0YWdlIChtVikKKworaW41X21pbl9hbGFybQkJMTJ2IG91dHB1dCB1bmRlcnZvbHRhZ2UgYWxhcm0KK2luNl9taW5fYWxhcm0JCTV2ICBvdXRwdXQgdW5kZXJ2b2x0YWdlIGFsYXJtCitpbjdfbWluX2FsYXJtCQkzdiAgb3V0cHV0IHVuZGVydm9sdGFnZSBhbGFybQoraW44X21pbl9hbGFybQkJVmVlICgtMTJ2KSBvdXRwdXQgdW5kZXJ2b2x0YWdlIGFsYXJtCisKK2luOV9pbnB1dAkJR1BJTyAjMSB2b2x0YWdlIGRhdGEKK2luMTBfaW5wdXQJCUdQSU8gIzIgdm9sdGFnZSBkYXRhCitpbjExX2lucHV0CQlHUElPICMzIHZvbHRhZ2UgZGF0YQorCitwb3dlcjFfaW5wdXQJCTEydiBwb3dlciB1c2FnZSAobVcpCitwb3dlcjJfaW5wdXQJCTV2ICBwb3dlciB1c2FnZSAobVcpCitwb3dlcjNfaW5wdXQJCTN2ICBwb3dlciB1c2FnZSAobVcpCitwb3dlcjRfaW5wdXQJCVZlZSAoLTEydikgcG93ZXIgdXNhZ2UgKG1XKQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pZGUvd2FybS1wbHVnLWhvd3RvLnR4dCBiL0RvY3VtZW50YXRpb24vaWRlL3dhcm0tcGx1Zy1ob3d0by50eHQKaW5kZXggZDU4ODU0Ni4uOTgxNTJiYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pZGUvd2FybS1wbHVnLWhvd3RvLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2lkZS93YXJtLXBsdWctaG93dG8udHh0CkBAIC0xMSwzICsxMSw4IEBACiAjIGVjaG8gLW4gIjEiID4gL3N5cy9jbGFzcy9pZGVfcG9ydC9pZGV4L3NjYW4KIAogZG9uZQorCitOT1RFOiBwbGVhc2UgbWFrZSBzdXJlIHRoYXQgcGFydGl0aW9ucyBhcmUgdW5tb3VudGVkIGFuZCB0aGF0IHRoZXJlIGFyZQorbm8gb3RoZXIgYWN0aXZlIHJlZmVyZW5jZXMgdG8gZGV2aWNlcyBiZWZvcmUgZG9pbmcgImRlbGV0ZV9kZXZpY2VzIiBzdGVwLAorYWxzbyBkbyBub3QgYXR0ZW1wdCAic2NhbiIgc3RlcCBvbiBkZXZpY2VzIGN1cnJlbnRseSBpbiB1c2UgLS0gb3RoZXJ3aXNlCityZXN1bHRzIG1heSBiZSB1bnByZWRpY3RhYmxlIGFuZCBsZWFkIHRvIGRhdGEgbG9zcyBpZiB5b3UncmUgdW5sdWNreQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pbnB1dC93YWxrZXJhMDcwMS50eHQgYi9Eb2N1bWVudGF0aW9uL2lucHV0L3dhbGtlcmEwNzAxLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjQyODllCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9pbnB1dC93YWxrZXJhMDcwMS50eHQKQEAgLTAsMCArMSwxMDkgQEAKKworV2Fsa2VyYSBXSy0wNzAxIHRyYW5zbWl0dGVyIGlzIHN1cHBsaWVkIHdpdGggYSByZWFkeSB0byBmbHkgV2Fsa2VyYQoraGVsaWNvcHRlcnMgc3VjaCBhcyBITTM2LCBITTM3LCBITTYwLiBUaGUgd2Fsa2VyYTA3MDEgbW9kdWxlIGVuYWJsZXMgdG8gdXNlCit0aGlzIHRyYW5zbWl0dGVyIGFzIGpveXN0aWNrCisKK0RldmVsIGhvbWVwYWdlIGFuZCBkb3dubG9hZDoKK2h0dHA6Ly96dWIuZmVpLnR1a2Uuc2svd2Fsa2VyYS13azA3MDEvCisKK29yIHVzZSBjb2dpdG86CitjZy1jbG9uZSBodHRwOi8venViLmZlaS50dWtlLnNrL0dJVC93YWxrZXJhMDcwMS1qb3lzdGljaworCisKK0Nvbm5lY3RpbmcgdG8gUEM6CisKK0F0IGJhY2sgc2lkZSBvZiB0cmFuc21pdHRlciBTLXZpZGVvIGNvbm5lY3RvciBjYW4gYmUgZm91bmQuIE1vZHVsYXRpb24KK3B1bHNlcyBmcm9tIHByb2Nlc3NvciB0byBIRiBwYXJ0IGNhbiBiZSBmb3VuZCBhdCBwaW4gMiBvZiB0aGlzIGNvbm5lY3RvciwKK3BpbiAzIGlzIEdORC4gQmV0d2VlbiBwaW4gMyBhbmQgQ1BVIDVrNiByZXNpc3RvciBjYW4gYmUgZm91bmQuIFRvIGdldAorbW9kdWxhdGlvbiBwdWxzZXMgdG8gUEMsIHNpZ25hbCBwdWxzZXMgbXVzdCBiZSBhbXBsaWZpZWQuCisKK0NhYmxlOiAod2Fsa2VyYSBUWCB0byBwYXJwb3J0KQorCitXYWxrZXJhIFdLLTA3MDEgVFggUy1WSURFTyBjb25uZWN0b3I6CisgKGJhY2sgc2lkZSBvZiBUWCkKKyAgICAgX18gICBfXyAgICAgICAgICAgICAgUy12aWRlbzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Fub24yNQorICAgIC8gIHxffCAgXCAgICAgICAgICAgICBwaW4gMiAoc2lnbmFsKSAgICAgICAgICAgICAgTlBOICAgICAgICAgICBwYXJwb3J0CisgICAvIE8gNCAzIE8gXCAgICAgICAgICAgIHBpbiAzIChHTkQpICAgICAgICBMRUQgICAgICAgIF9fX19fX19fX19fX19fX18gIDEwIEFDSworICAoIE8gMiAgIDEgTyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEMKKyAgIFwgICBfX18gICAvICAgICAgMiBfX19fX19fX19fX19fX19fX19fX19fX198XHxfX19fX3wvCisgICAgfCBbX19fXSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC98ICAgQiB8XAorICAgICAtLS0tLS0tICAgICAgICAzIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198X19fX19fX19fX19fX19fXyAyNSBHTkQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFCisKKworSSB1c2UgZ3JlZW4gTEVEIGFuZCBCQzEwOSBOUE4gdHJhbnNpc3Rvci4KKworU29mdHdhcmU6CisKK0J1aWxkIGtlcm5lbCB3aXRoIHdhbGtlcmEwNzAxIG1vZHVsZS4gTW9kdWxlIHdhbGtlcmEwNzAxIG5lZWQgZXhjbHVzaXZlCithY2Nlc3MgdG8gcGFycG9ydCwgbW9kdWxlcyBsaWtlIGxwIG11c3QgYmUgdW5sb2FkZWQgYmVmb3JlIGxvYWRpbmcKK3dhbGtlcmEwNzAxIG1vZHVsZSwgY2hlY2sgZG1lc2cgZm9yIGVycm9yIG1lc3NhZ2VzLiBDb25uZWN0IFRYIHRvIFBDIGJ5CitjYWJsZSBhbmQgcnVuIGpzdGVzdCAvZGV2L2lucHV0L2pzMCB0byBzZWUgdmFsdWVzIGZyb20gVFguIElmIG5vIHZhbHVlIGNhbgorYmUgY2hhbmdlZCBieSBUWCAiam95c3RpY2siLCBjaGVjayBvdXRwdXQgZnJvbSAvcHJvYy9pbnRlcnJ1cHRzLiBWYWx1ZSBmb3IKKyh1c3VhbGx5IGlycTcpIHBhcnBvcnQgbXVzdCBpbmNyZWFzZSBpZiBUWCBpcyBvbi4KKworCisKK1RlY2huaWNhbCBkZXRhaWxzOgorCitEcml2ZXIgdXNlIGludGVycnVwdCBmcm9tIHBhcnBvcnQgQUNLIGlucHV0IGJpdCB0byBtZWFzdXJlIHB1bHNlIGxlbmd0aAordXNpbmcgaHJ0aW1lcnMuCisKK0ZyYW1lIGZvcm1hdDoKK0Jhc2VkIG9uIHdhbGtlcmEgV0stMDcwMSBQQ00gRm9ybWF0IGRlc2NyaXB0aW9uIGJ5IFNoYXVsIEVpemlrb3ZpY2guCisoZG93bmxvYWRlZCBmcm9tIGh0dHA6Ly93d3cuc21hcnRwcm9wb3BsdXMuY29tL0RvY3MvV2Fsa2VyYV9Xay0wNzAxX1BDTS5wZGYpCisKK1NpZ25hbCBwdWxzZXM6CisgICAgICAgICAgICAgICAgICAgKEFOQUxPRykKKyAgICBTWU5DICAgICAgQklOICAgT0NUCisgICstLS0tLS0tLS0rICAgICAgKy0tLS0tLSsKKyAgfCAgICAgICAgIHwgICAgICB8ICAgICAgfAorLS0rICAgICAgICAgKy0tLS0tLSsgICAgICArLS0tCisKK0ZyYW1lOgorIFNZTkMgLCBCSU4xLCBPQ1QxLCBCSU4yLCBPQ1QyIC4uLiBCSU4yNCwgT0NUMjQsIEJJTjI1LCBuZXh0IGZyYW1lIFNZTkMgLi4KKworcHVsc2UgbGVuZ3RoOgorICAgQmluYXJ5IHZhbHVlczoJCUFuYWxvZyBvY3RhbCB2YWx1ZXM6CisKKyAgIDI4OCB1UyBCaW5hcnkgMAkJMzE4IHVTICAgICAgIDAwMAorICAgNDM4IHVTIEJpbmFyeSAxCQkzOTggdVMgICAgICAgMDAxCisJCQkJNDc4IHVTICAgICAgIDAxMAorCQkJCTU1OCB1UyAgICAgICAwMTEKKwkJCQk2MzggdVMgICAgICAgMTAwCisgIDEzMDYgdVMgU1lOQwkJCTcxOCB1UyAgICAgICAxMDEKKwkJCQk3OTggdVMgICAgICAgMTEwCisJCQkJODc4IHVTICAgICAgIDExMQorCisyNCBiaW4rb2N0IHZhbHVlcyArIDEgYmluIHZhbHVlID0gMjQqNCsxIGJpdHMgID0gOTcgYml0cworCisoV2FybmluZywgcHVsc2VzIG9uIEFDSyBhciBpbnZlcnRlZCBieSB0cmFuc2lzdG9yLCBpcnEgaXMgcmlzZWQgdXAgb24gc3luYwordG8gYmluIGNoYW5nZSBvciBvY3RhbCB2YWx1ZSB0byBiaW4gY2hhbmdlKS4KKworQmluYXJ5IGRhdGEgcmVwcmVzZW50YXRpb25zOgorCitPbmUgYmluYXJ5IGFuZCBvY3RhbCB2YWx1ZSBjYW4gYmUgZ3JvdXBlZCB0byBuaWJibGUuIDI0IG5pYmJsZXMgKyBvbmUgYmluYXJ5Cit2YWx1ZXMgY2FuIGJlIHNhbXBsZWQgYmV0d2VlbiBzeW5jIHB1bHNlcy4KKworVmFsdWVzIGZvciBmaXJzdCBmb3VyIGNoYW5uZWxzIChhbmFsb2cgam95c3RpY2sgdmFsdWVzKSBjYW4gYmUgZm91bmQgaW4KK2ZpcnN0IDEwIG5pYmJsZXMuIEFuYWxvZyB2YWx1ZSBpcyByZXByZXNlbnRlZCBieSBvbmUgc2lnbiBiaXQgYW5kIDkgYml0CithYnNvbHV0ZSBiaW5hcnkgdmFsdWUuICgxMCBiaXRzIHBlciBjaGFubmVsKS4gTmV4dCBuaWJibGUgaXMgY2hlY2tzdW0gZm9yCitmaXJzdCB0ZW4gbmliYmxlcy4KKworTmV4dCBuaWJibGVzIDEyIC4uIDIxIHJlcHJlc2VudHMgZm91ciBjaGFubmVscyAobm90IGFsbCBjaGFubmVscyBjYW4gYmUKK2RpcmVjdGx5IGNvbnRyb2xsZWQgZnJvbSBUWCkuIEJpbmFyeSByZXByZXNlbnRhdGlvbnMgYXIgdGhlIHNhbWUgYXMgaW4gZmlyc3QKK2ZvdXIgY2hhbm5lbHMuIEluIG5pYmJsZXMgMjIgYW5kIDIzIGlzIGEgc3BlY2lhbCBtYWdpYyBudW1iZXIuIE5pYmJsZSAyNCBpcworY2hlY2tzdW0gZm9yIG5pYmJsZXMgMTIuLjIzLgorCitBZnRlciBsYXN0IG9jdGFsIHZhbHVlIGZvciBuaWJibGUgMjQgYW5kIG5leHQgc3luYyBwdWxzZSBvbmUgYWRkaXRpb25hbAorYmluYXJ5IHZhbHVlIGNhbiBiZSBzYW1wbGVkLiBUaGlzIGJpdCBhbmQgbWFnaWMgbnVtYmVyIGlzIG5vdCB1c2VkIGluCitzb2Z0d2FyZSBkcml2ZXIuIFNvbWUgZGV0YWlscyBhYm91dCB0aGlzIG1hZ2ljIG51bWJlcnMgY2FuIGJlIGZvdW5kIGluCitXYWxrZXJhX1drLTA3MDFfUENNLnBkZi4KKworQ2hlY2tzdW0gY2FsY3VsYXRpb246CisKK1N1bW1hcnkgb2Ygb2N0YWwgdmFsdWVzIGluIG5pYmJsZXMgbXVzdCBiZSBzYW1lIGFzIG9jdGFsIHZhbHVlIGluIGNoZWNrc3VtCituaWJibGUgKG9ubHkgZmlyc3QgMyBiaXRzIGFyZSB1c2VkKS4gQmluYXJ5IHZhbHVlIGZvciBjaGVja3N1bSBuaWJibGUgaXMKK2NhbGN1bGF0ZWQgYnkgc3VtIG9mIGJpbmFyeSB2YWx1ZXMgaW4gY2hlY2tlZCBuaWJibGVzICsgc3VtIG9mIG9jdGFsIHZhbHVlcworaW4gY2hlY2tlZCBuaWJibGVzIGRpdmlkZWQgYnkgOC4gT25seSBiaXQgMCBvZiB0aGlzIHN1bSBpcyB1c2VkLgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2lvY3RsL2lvY3RsLW51bWJlci50eHQgYi9Eb2N1bWVudGF0aW9uL2lvY3RsL2lvY3RsLW51bWJlci50eHQKaW5kZXggODI0Njk5MS4uZjFkNjM5OSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pb2N0bC9pb2N0bC1udW1iZXIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vaW9jdGwvaW9jdGwtbnVtYmVyLnR4dApAQCAtODQsNyArODQsNyBAQAogJ0InCUMwLUZGCQkJCWFkdmFuY2VkIGJidXMKIAkJCQkJPG1haWx0bzptYWFzc2VuQHVuaS1mcmVpYnVyZy5kZT4KICdDJwlhbGwJbGludXgvc291bmRjYXJkLmgKLSdEJwlhbGwJYXNtLXMzOTAvZGFzZC5oCisnRCcJYWxsCWFyY2gvczM5MC9pbmNsdWRlL2FzbS9kYXNkLmgKICdFJwlhbGwJbGludXgvaW5wdXQuaAogJ0YnCWFsbAlsaW51eC9mYi5oCiAnSCcJYWxsCWxpbnV4L2hpZGRldi5oCkBAIC0xMDUsNyArMTA1LDcgQEAKICdTJwk4MC04MQlzY3NpL3Njc2lfaW9jdGwuaAljb25mbGljdCEKICdTJwk4Mi1GRglzY3NpL3Njc2kuaAkJY29uZmxpY3QhCiAnVCcJYWxsCWxpbnV4L3NvdW5kY2FyZC5oCWNvbmZsaWN0IQotJ1QnCWFsbAlhc20taTM4Ni9pb2N0bHMuaAljb25mbGljdCEKKydUJwlhbGwJYXJjaC94ODYvaW5jbHVkZS9hc20vaW9jdGxzLmgJY29uZmxpY3QhCiAnVScJMDAtRUYJbGludXgvZHJpdmVycy91c2IvdXNiLmgKICdWJwlhbGwJbGludXgvdnQuaAogJ1cnCTAwLTFGCWxpbnV4L3dhdGNoZG9nLmgJY29uZmxpY3QhCkBAIC0xMjAsNyArMTIwLDcgQEAKIAkJCQkJPG1haWx0bzpuYXRhbGlhQG5pa2hlZmsubmlraGVmLm5sPgogJ2MnCTAwLTdGCWxpbnV4L2NvbXN0YXRzLmgJY29uZmxpY3QhCiAnYycJMDAtN0YJbGludXgvY29kYS5oCQljb25mbGljdCEKLSdjJwk4MC05Rglhc20tczM5MC9jaHNjLmgKKydjJwk4MC05RglhcmNoL3MzOTAvaW5jbHVkZS9hc20vY2hzYy5oCiAnZCcJMDAtRkYJbGludXgvY2hhci9kcm0vZHJtL2gJY29uZmxpY3QhCiAnZCcJMDAtREYJbGludXgvdmlkZW9fZGVjb2Rlci5oCWNvbmZsaWN0IQogJ2QnCUYwLUZGCWxpbnV4L2RpZ2kxLmgKQEAgLTE3MCw3ICsxNzAsNyBAQAogCQkJCQk8bWFpbHRvOm9lQHBvcnQuZGU+CiAweDgwCTAwLTFGCWxpbnV4L2ZiLmgKIDB4ODEJMDAtMUYJbGludXgvdmlkZW90ZXh0LmgKLTB4ODkJMDAtMDYJYXNtLWkzODYvc29ja2lvcy5oCisweDg5CTAwLTA2CWFyY2gveDg2L2luY2x1ZGUvYXNtL3NvY2tpb3MuaAogMHg4OQkwQi1ERglsaW51eC9zb2NraW9zLmgKIDB4ODkJRTAtRUYJbGludXgvc29ja2lvcy5oCQlTSU9DUFJPVE9QUklWQVRFIHJhbmdlCiAweDg5CUYwLUZGCWxpbnV4L3NvY2tpb3MuaAkJU0lPQ0RFVlBSSVZBVEUgcmFuZ2UKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2J1aWxkL2tidWlsZC50eHQgYi9Eb2N1bWVudGF0aW9uL2tidWlsZC9rYnVpbGQudHh0CmluZGV4IDUxNzcxODQuLjkyM2Y5ZGQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2J1aWxkL2tidWlsZC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rYnVpbGQva2J1aWxkLnR4dApAQCAtMTI0LDMgKzEyNCwxMCBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIEZvciBtb2R1bGVzIHVzZSBzeW1ib2xzIGZyb20gYW5vdGhlciBtb2R1bGVzLgogU2VlIG1vcmUgZGV0YWlscyBpbiBtb2R1bGVzLnR4dC4KKworQUxMU09VUkNFX0FSQ0hTCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRm9yIHRhZ3MvVEFHUy9jc2NvcGUgdGFyZ2V0cywgeW91IGNhbiBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXJjaHMKK3RvIGJlIGluY2x1ZGVkIGluIHRoZSBkYXRhYmFzZXMsIHNlcGFyYXRlZCBieSBibGFua3NwYWNlLiBlLmcuCisKKyAgICAkIG1ha2UgQUxMU09VUkNFX0FSQ0hTPSJ4ODYgbWlwcyBhcm0iIHRhZ3MKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2J1aWxkL21vZHVsZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9rYnVpbGQvbW9kdWxlcy50eHQKaW5kZXggMTgyMWMwNy4uYjEwOTZkYSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rYnVpbGQvbW9kdWxlcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rYnVpbGQvbW9kdWxlcy50eHQKQEAgLTI1Myw3ICsyNTMsNyBAQAogCiAJCSMgTW9kdWxlIHNwZWNpZmljIHRhcmdldHMKIAkJZ2VuYmluOgotCQkJZWNobyAiWCIgPiA4MTIzX2Jpbl9zaGlwcGVkCisJCQllY2hvICJYIiA+IDgxMjNfYmluLm9fc2hpcHBlZAogCiAKIAlJbiBleGFtcGxlIDIsIHdlIGFyZSBkb3duIHRvIHR3byBmYWlybHkgc2ltcGxlIGZpbGVzIGFuZCBmb3Igc2ltcGxlCkBAIC0yNzksNyArMjc5LDcgQEAKIAogCQkjIE1vZHVsZSBzcGVjaWZpYyB0YXJnZXRzCiAJCWdlbmJpbjoKLQkJCWVjaG8gIlgiID4gODEyM19iaW5fc2hpcHBlZAorCQkJZWNobyAiWCIgPiA4MTIzX2Jpbi5vX3NoaXBwZWQKIAogCQllbmRpZgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1kb2MtbmFuby1IT1dUTy50eHQgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1kb2MtbmFuby1IT1dUTy50eHQKaW5kZXggYzY4NDFlZS4uZDczZmJkMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtZG9jLW5hbm8tSE9XVE8udHh0CisrKyBiL0RvY3VtZW50YXRpb24va2VybmVsLWRvYy1uYW5vLUhPV1RPLnR4dApAQCAtNzEsNiArNzEsMTEgQEAKIHRoaXMgb3BlbmluZyBzaG9ydCBmdW5jdGlvbiBkZXNjcmlwdGlvbiBsaW5lLCB3aXRoIG5vIGludGVydmVuaW5nCiBlbXB0eSBjb21tZW50IGxpbmVzLgogCitJZiBhIGZ1bmN0aW9uIHBhcmFtZXRlciBpcyAiLi4uIiAodmFyYXJncyksIGl0IHNob3VsZCBiZSBsaXN0ZWQgaW4KK2tlcm5lbC1kb2Mgbm90YXRpb24gYXM6CisgKiBALi4uOiBkZXNjcmlwdGlvbgorCisKIEV4YW1wbGUga2VybmVsLWRvYyBkYXRhIHN0cnVjdHVyZSBjb21tZW50LgogCiAvKioKQEAgLTI4Miw2ICsyODcsMzIgQEAKIH07CiAKIAorSW5jbHVkaW5nIGRvY3VtZW50YXRpb24gYmxvY2tzIGluIHNvdXJjZSBmaWxlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUbyBmYWNpbGl0YXRlIGhhdmluZyBzb3VyY2UgY29kZSBhbmQgY29tbWVudHMgY2xvc2UgdG9nZXRoZXIsIHlvdSBjYW4KK2luY2x1ZGUga2VybmVsLWRvYyBkb2N1bWVudGF0aW9uIGJsb2NrcyB0aGF0IGFyZSBmcmVlLWZvcm0gY29tbWVudHMKK2luc3RlYWQgb2YgYmVpbmcga2VybmVsLWRvYyBmb3IgZnVuY3Rpb25zLCBzdHJ1Y3R1cmVzLCB1bmlvbnMsCitlbnVtcywgb3IgdHlwZWRlZnMuICBUaGlzIGNvdWxkIGJlIHVzZWQgZm9yIHNvbWV0aGluZyBsaWtlIGEKK3RoZW9yeSBvZiBvcGVyYXRpb24gZm9yIGEgZHJpdmVyIG9yIGxpYnJhcnkgY29kZSwgZm9yIGV4YW1wbGUuCisKK1RoaXMgaXMgZG9uZSBieSB1c2luZyBhIERPQzogc2VjdGlvbiBrZXl3b3JkIHdpdGggYSBzZWN0aW9uIHRpdGxlLiAgRS5nLjoKKworLyoqCisgKiBET0M6IFRoZW9yeSBvZiBPcGVyYXRpb24KKyAqCisgKiBUaGUgd2hpemJhbmcgZm9vYmFyIGlzIGEgZGlsbHkgb2YgYSBnaXptby4gIEl0IGNhbiBkbyB3aGF0ZXZlciB5b3UKKyAqIHdhbnQgaXQgdG8gZG8sIGF0IGFueSB0aW1lLiAgSXQgcmVhZHMgeW91ciBtaW5kLiAgSGVyZSdzIGhvdyBpdCB3b3Jrcy4KKyAqCisgKiBmb28gYmFyIHNwbGF0CisgKgorICogVGhlIG9ubHkgZHJhd2JhY2sgdG8gdGhpcyBnaXptbyBpcyB0aGF0IGlzIGNhbiBzb21ldGltZXMgZGFtYWdlCisgKiBoYXJkd2FyZSwgc29mdHdhcmUsIG9yIGl0cyBzdWJqZWN0KHMpLgorICovCisKK0RPQzogc2VjdGlvbnMgYXJlIHVzZWQgaW4gU0dNTCB0ZW1wbGF0ZXMgZmlsZXMgYXMgaW5kaWNhdGVkIGJlbG93LgorCisKIEhvdyB0byBtYWtlIG5ldyBTR01MIHRlbXBsYXRlIGZpbGVzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0zMDIsNiArMzMzLDkgQEAKICFGPGZpbGVuYW1lPiA8ZnVuY3Rpb24gW2Z1bmN0aW9ucy4uLl0+IGlzIHJlcGxhY2VkIGJ5IHRoZQogZG9jdW1lbnRhdGlvbiwgaW4gPGZpbGVuYW1lPiwgZm9yIHRoZSBmdW5jdGlvbnMgbGlzdGVkLgogCishUDxmaWxlbmFtZT4gPHNlY3Rpb24gdGl0bGU+IGlzIHJlcGxhY2VkIGJ5IHRoZSBjb250ZW50cyBvZiB0aGUgRE9DOgorc2VjdGlvbiB0aXRsZWQgPHNlY3Rpb24gdGl0bGU+IGZyb20gPGZpbGVuYW1lPi4KK1NwYWNlcyBhcmUgYWxsb3dlZCBpbiA8c2VjdGlvbiB0aXRsZT47IGRvIG5vdCBxdW90ZSB0aGUgPHNlY3Rpb24gdGl0bGU+LgogCiBUaW0uCiAqLyA8dHdhdWdoQHJlZGhhdC5jb20+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dCBiL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CmluZGV4IGEyZDg4MDUuLmZiODQ5MDIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CkBAIC05MSw2ICs5MSw3IEBACiAJU1VTUEVORAlTeXN0ZW0gc3VzcGVuZCBzdGF0ZXMgYXJlIGVuYWJsZWQuCiAJRlRSQUNFCUZ1bmN0aW9uIHRyYWNpbmcgZW5hYmxlZC4KIAlUUwlBcHByb3ByaWF0ZSB0b3VjaHNjcmVlbiBzdXBwb3J0IGlzIGVuYWJsZWQuCisJVU1TCVVTQiBNYXNzIFN0b3JhZ2Ugc3VwcG9ydCBpcyBlbmFibGVkLgogCVVTQglVU0Igc3VwcG9ydCBpcyBlbmFibGVkLgogCVVTQkhJRAlVU0IgSHVtYW4gSW50ZXJmYWNlIERldmljZSBzdXBwb3J0IGlzIGVuYWJsZWQuCiAJVjRMCVZpZGVvIEZvciBMaW51eCBzdXBwb3J0IGlzIGVuYWJsZWQuCkBAIC00NjksOCArNDcwLDggQEAKIAogCWNsZWFyY3B1aWQ9QklUTlVNIFtYODZdCiAJCQlEaXNhYmxlIENQVUlEIGZlYXR1cmUgWCBmb3IgdGhlIGtlcm5lbC4gU2VlCi0JCQlpbmNsdWRlL2FzbS14ODYvY3B1ZmVhdHVyZS5oIGZvciB0aGUgdmFsaWQgYml0IG51bWJlcnMuCi0JCQlOb3RlIHRoZSBMaW51eCBzcGVjaWZpYyBiaXRzIGFyZSBub3QgbmVjZXNzYXJpbHkKKwkJCWFyY2gveDg2L2luY2x1ZGUvYXNtL2NwdWZlYXR1cmUuaCBmb3IgdGhlIHZhbGlkIGJpdAorCQkJbnVtYmVycy4gTm90ZSB0aGUgTGludXggc3BlY2lmaWMgYml0cyBhcmUgbm90IG5lY2Vzc2FyaWx5CiAJCQlzdGFibGUgb3ZlciBrZXJuZWwgb3B0aW9ucywgYnV0IHRoZSB2ZW5kb3Igc3BlY2lmaWMKIAkJCW9uZXMgc2hvdWxkIGJlLgogCQkJQWxzbyBub3RlIHRoYXQgdXNlciBwcm9ncmFtcyBjYWxsaW5nIENQVUlEIGRpcmVjdGx5CkBAIC01NTEsNiArNTUyLDExIEBACiAJCQlub3Qgd29yayByZWxpYWJseSB3aXRoIGFsbCBjb25zb2xlcywgYnV0IGlzIGtub3duCiAJCQl0byB3b3JrIHdpdGggc2VyaWFsIGFuZCBWR0EgY29uc29sZXMuCiAKKwljb3JlZHVtcF9maWx0ZXI9CisJCQlbS05MXSBDaGFuZ2UgdGhlIGRlZmF1bHQgdmFsdWUgZm9yCisJCQkvcHJvYy88cGlkPi9jb3JlZHVtcF9maWx0ZXIuCisJCQlTZWUgYWxzbyBEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0LgorCiAJY3BjaWhwX2dlbmVyaWM9CVtIVyxQQ0ldIEdlbmVyaWMgcG9ydCBJL08gQ29tcGFjdFBDSSBkcml2ZXIKIAkJCUZvcm1hdDoKIAkJCTxmaXJzdF9zbG90Piw8bGFzdF9zbG90Piw8cG9ydD4sPGVudW1fYml0PlssPGRlYnVnPl0KQEAgLTkxMyw2ICs5MTksMTAgQEAKIAogCWludHRlc3Q9CVtJQTY0XQogCisJaW9tZW09CQlEaXNhYmxlIHN0cmljdCBjaGVja2luZyBvZiBhY2Nlc3MgdG8gTU1JTyBtZW1vcnkKKwkJc3RyaWN0CXJlZ2lvbnMgZnJvbSB1c2Vyc3BhY2UuCisJCXJlbGF4ZWQKKwogCWlvbW11PQkJW3g4Nl0KIAkJb2ZmCiAJCWZvcmNlCkBAIC0xMTE3LDYgKzExMjcsOCBAQAogCQkJSWYgdGhlcmUgYXJlIG11bHRpcGxlIG1hdGNoaW5nIGNvbmZpZ3VyYXRpb25zIGNoYW5naW5nCiAJCQl0aGUgc2FtZSBhdHRyaWJ1dGUsIHRoZSBsYXN0IG9uZSBpcyB1c2VkLgogCisJbG1iPWRlYnVnCVtLTkxdIEVuYWJsZSBsbWIgZGVidWcgbWVzc2FnZXMuCisKIAlsb2FkX3JhbWRpc2s9CVtSQU1dIExpc3Qgb2YgcmFtZGlza3MgdG8gbG9hZCBmcm9tIGZsb3BweQogCQkJU2VlIERvY3VtZW50YXRpb24vYmxvY2tkZXYvcmFtZGlzay50eHQuCiAKQEAgLTE1NTAsNiArMTU2Miw5IEBACiAKIAlub3NvZnRsb2NrdXAJW0tOTF0gRGlzYWJsZSB0aGUgc29mdC1sb2NrdXAgZGV0ZWN0b3IuCiAKKwlub3N3YXBhY2NvdW50CVtLTkxdIERpc2FibGUgYWNjb3VudGluZyBvZiBzd2FwIGluIG1lbW9yeSByZXNvdXJjZQorCQkJY29udHJvbGxlci4gKFNlZSBEb2N1bWVudGF0aW9uL2NvbnRyb2xsZXJzL21lbW9yeS50eHQpCisKIAlub3N5bmMJCVtIVyxNNjhLXSBEaXNhYmxlcyBzeW5jIG5lZ290aWF0aW9uIGZvciBhbGwgZGV2aWNlcy4KIAogCW5vdHNjCQlbQlVHUz1YODYtMzJdIERpc2FibGUgVGltZSBTdGFtcCBDb3VudGVyCkBAIC0xNTY5LDYgKzE1ODQsMTAgQEAKIAogCW5yX3VhcnRzPQlbU0VSSUFMXSBtYXhpbXVtIG51bWJlciBvZiBVQVJUcyB0byBiZSByZWdpc3RlcmVkLgogCisJb2hjaTEzOTRfZG1hPWVhcmx5CVtIV10gZW5hYmxlIGRlYnVnZ2luZyB2aWEgdGhlIG9oY2kxMzk0IGRyaXZlci4KKwkJCVNlZSBEb2N1bWVudGF0aW9uL2RlYnVnZ2luZy12aWEtb2hjaTEzOTQudHh0IGZvciBtb3JlCisJCQlpbmZvLgorCiAJb2xwY19lY190aW1lb3V0PSBbT0xQQ10gbXMgZGVsYXkgd2hlbiBpc3N1aW5nIEVDIGNvbW1hbmRzCiAJCQlSYXRoZXIgdGhhbiB0aW1pbmcgb3V0IGFmdGVyIDIwIG1zIGlmIGFuIEVDCiAJCQljb21tYW5kIGlzIG5vdCBwcm9wZXJseSBBQ0tlZCwgb3ZlcnJpZGUgdGhlIGxlbmd0aApAQCAtMTc5MywxMCArMTgxMiwxMCBAQAogCQkJYXV0b2NvbmZpZ3VyYXRpb24uCiAJCQlSYW5nZXMgYXJlIGluIHBhaXJzIChtZW1vcnkgYmFzZSBhbmQgc2l6ZSkuCiAKLQlkeW5hbWljX3ByaW50awotCQkJRW5hYmxlcyBwcl9kZWJ1ZygpL2Rldl9kYmcoKSBjYWxscyBpZgotCQkJQ09ORklHX0RZTkFNSUNfUFJJTlRLX0RFQlVHIGhhcyBiZWVuIGVuYWJsZWQuIFRoZXNlIGNhbiBhbHNvCi0JCQliZSBzd2l0Y2hlZCBvbi9vZmYgdmlhIDxkZWJ1Z2ZzPi9keW5hbWljX3ByaW50ay9tb2R1bGVzCisJZHluYW1pY19wcmludGsJRW5hYmxlcyBwcl9kZWJ1ZygpL2Rldl9kYmcoKSBjYWxscyBpZgorCQkJQ09ORklHX0RZTkFNSUNfUFJJTlRLX0RFQlVHIGhhcyBiZWVuIGVuYWJsZWQuCisJCQlUaGVzZSBjYW4gYWxzbyBiZSBzd2l0Y2hlZCBvbi9vZmYgdmlhCisJCQk8ZGVidWdmcz4vZHluYW1pY19wcmludGsvbW9kdWxlcwogCiAJcHJpbnQtZmF0YWwtc2lnbmFscz0KIAkJCVtLTkxdIGRlYnVnOiBwcmludCBmYXRhbCBzaWduYWxzCkBAIC0xODg0LDcgKzE5MDMsNyBAQAogCiAJcmVib290PQkJW0JVR1M9WDg2LTMyLEJVR1M9QVJNLEJVR1M9SUEtNjRdIFJlYm9vdGluZyBtb2RlCiAJCQlGb3JtYXQ6IDxyZWJvb3RfbW9kZT5bLDxyZWJvb3RfbW9kZTI+WywuLi5dXQotCQkJU2VlIGFyY2gvKi9rZXJuZWwvcmVib290LmMgb3IgYXJjaC8qL2tlcm5lbC9wcm9jZXNzLmMJCQkKKwkJCVNlZSBhcmNoLyova2VybmVsL3JlYm9vdC5jIG9yIGFyY2gvKi9rZXJuZWwvcHJvY2Vzcy5jCiAKIAlyZWxheF9kb21haW5fbGV2ZWw9CiAJCQlbS05MLCBTTVBdIFNldCBzY2hlZHVsZXIncyBkZWZhdWx0IHJlbGF4X2RvbWFpbl9sZXZlbC4KQEAgLTIzNzIsNiArMjM5MSw0MSBAQAogCXVzYmhpZC5tb3VzZXBvbGw9CiAJCQlbVVNCSElEXSBUaGUgaW50ZXJ2YWwgd2hpY2ggbWljZSBhcmUgdG8gYmUgcG9sbGVkIGF0LgogCisJdXNiLXN0b3JhZ2UuZGVsYXlfdXNlPQorCQkJW1VNU10gVGhlIGRlbGF5IGluIHNlY29uZHMgYmVmb3JlIGEgbmV3IGRldmljZSBpcworCQkJc2Nhbm5lZCBmb3IgTG9naWNhbCBVbml0cyAoZGVmYXVsdCA1KS4KKworCXVzYi1zdG9yYWdlLnF1aXJrcz0KKwkJCVtVTVNdIEEgbGlzdCBvZiBxdWlya3MgZW50cmllcyB0byBzdXBwbGVtZW50IG9yCisJCQlvdmVycmlkZSB0aGUgYnVpbHQtaW4gdW51c3VhbF9kZXZzIGxpc3QuICBMaXN0CisJCQllbnRyaWVzIGFyZSBzZXBhcmF0ZWQgYnkgY29tbWFzLiAgRWFjaCBlbnRyeSBoYXMKKwkJCXRoZSBmb3JtIFZJRDpQSUQ6RmxhZ3Mgd2hlcmUgVklEIGFuZCBQSUQgYXJlIFZlbmRvcgorCQkJYW5kIFByb2R1Y3QgSUQgdmFsdWVzICg0LWRpZ2l0IGhleCBudW1iZXJzKSBhbmQKKwkJCUZsYWdzIGlzIGEgc2V0IG9mIGNoYXJhY3RlcnMsIGVhY2ggY29ycmVzcG9uZGluZworCQkJdG8gYSBjb21tb24gdXNiLXN0b3JhZ2UgcXVpcmsgZmxhZyBhcyBmb2xsb3dzOgorCQkJCWEgPSBTQU5FX1NFTlNFIChjb2xsZWN0IG1vcmUgdGhhbiAxOCBieXRlcworCQkJCQlvZiBzZW5zZSBkYXRhKTsKKwkJCQljID0gRklYX0NBUEFDSVRZIChkZWNyZWFzZSB0aGUgcmVwb3J0ZWQKKwkJCQkJZGV2aWNlIGNhcGFjaXR5IGJ5IG9uZSBzZWN0b3IpOworCQkJCWggPSBDQVBBQ0lUWV9IRVVSSVNUSUNTIChkZWNyZWFzZSB0aGUKKwkJCQkJcmVwb3J0ZWQgZGV2aWNlIGNhcGFjaXR5IGJ5IG9uZQorCQkJCQlzZWN0b3IgaWYgdGhlIG51bWJlciBpcyBvZGQpOworCQkJCWkgPSBJR05PUkVfREVWSUNFIChkb24ndCBiaW5kIHRvIHRoaXMKKwkJCQkJZGV2aWNlKTsKKwkJCQlsID0gTk9UX0xPQ0tBQkxFIChkb24ndCB0cnkgdG8gbG9jayBhbmQKKwkJCQkJdW5sb2NrIGVqZWN0YWJsZSBtZWRpYSk7CisJCQkJbSA9IE1BWF9TRUNUT1JTXzY0IChkb24ndCB0cmFuc2ZlciBtb3JlCisJCQkJCXRoYW4gNjQgc2VjdG9ycyA9IDMyIEtCIGF0IGEgdGltZSk7CisJCQkJbyA9IENBUEFDSVRZX09LIChhY2NlcHQgdGhlIGNhcGFjaXR5CisJCQkJCXJlcG9ydGVkIGJ5IHRoZSBkZXZpY2UpOworCQkJCXIgPSBJR05PUkVfUkVTSURVRSAodGhlIGRldmljZSByZXBvcnRzCisJCQkJCWJvZ3VzIHJlc2lkdWUgdmFsdWVzKTsKKwkJCQlzID0gU0lOR0xFX0xVTiAodGhlIGRldmljZSBoYXMgb25seSBvbmUKKwkJCQkJTG9naWNhbCBVbml0KTsKKwkJCQl3ID0gTk9fV1BfREVURUNUIChkb24ndCB0ZXN0IHdoZXRoZXIgdGhlCisJCQkJCW1lZGl1bSBpcyB3cml0ZS1wcm90ZWN0ZWQpLgorCQkJRXhhbXBsZTogcXVpcmtzPTA0MTk6YWFmNTpybCwwNDIxOjA0MzM6cmMKKwogCWFkZF9lZmlfbWVtbWFwCVtFRkk7IHg4Ni0zMixYODYtNjRdIEluY2x1ZGUgRUZJIG1lbW9yeSBtYXAgaW4KIAkJCWtlcm5lbCdzIG1hcCBvZiBhdmFpbGFibGUgcGh5c2ljYWwgUkFNLgogCkBAIC0yNDMyLDggKzI0ODYsOCBAQAogCQkJRm9ybWF0OgogCQkJPGlycT4sPGlycV9tYXNrPiw8aW8+LDxmdWxsX2R1cGxleD4sPGRvX3NvdW5kPiw8bG9ja3VwX2hhY2s+Wyw8aXJxMj5bLDxpcnEzPlssPGlycTQ+XV1dCiAKLQlub3JhbmRtYXBzCURvbid0IHVzZSBhZGRyZXNzIHNwYWNlIHJhbmRvbWl6YXRpb24KLQkJCUVxdWl2YWxlbnQgdG8gZWNobyAwID4gL3Byb2Mvc3lzL2tlcm5lbC9yYW5kb21pemVfdmFfc3BhY2UKKwlub3JhbmRtYXBzCURvbid0IHVzZSBhZGRyZXNzIHNwYWNlIHJhbmRvbWl6YXRpb24uICBFcXVpdmFsZW50IHRvCisJCQllY2hvIDAgPiAvcHJvYy9zeXMva2VybmVsL3JhbmRvbWl6ZV92YV9zcGFjZQogCiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va29iamVjdC50eHQgYi9Eb2N1bWVudGF0aW9uL2tvYmplY3QudHh0CmluZGV4IGY1ZDJhYWQuLmIyZTM3NDUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va29iamVjdC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rb2JqZWN0LnR4dApAQCAtMTE4LDggKzExOCw4IEBACiAKICAgICBpbnQga29iamVjdF9yZW5hbWUoc3RydWN0IGtvYmplY3QgKmtvYmosIGNvbnN0IGNoYXIgKm5ld19uYW1lKTsKIAotTm90ZSBrb2JqZWN0X3JlbmFtZSBkb2VzIHBlcmZvcm0gYW55IGxvY2tpbmcgb3IgaGF2ZSBhIHNvbGlkIG5vdGlvbiBvZgotd2hhdCBuYW1lcyBhcmUgdmFsaWQgc28gdGhlIHByb3ZpZGUgbXVzdCBwcm92aWRlIHRoZWlyIG93biBzYW5pdHkgY2hlY2tpbmcKK2tvYmplY3RfcmVuYW1lIGRvZXMgbm90IHBlcmZvcm0gYW55IGxvY2tpbmcgb3IgaGF2ZSBhIHNvbGlkIG5vdGlvbiBvZgord2hhdCBuYW1lcyBhcmUgdmFsaWQgc28gdGhlIGNhbGxlciBtdXN0IHByb3ZpZGUgdGhlaXIgb3duIHNhbml0eSBjaGVja2luZwogYW5kIHNlcmlhbGl6YXRpb24uCiAKIFRoZXJlIGlzIGEgZnVuY3Rpb24gY2FsbGVkIGtvYmplY3Rfc2V0X25hbWUoKSBidXQgdGhhdCBpcyBsZWdhY3kgY3J1ZnQgYW5kCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2twcm9iZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9rcHJvYmVzLnR4dAppbmRleCBhNzk2MzNkLi40OGIzZGU5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2twcm9iZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24va3Byb2Jlcy50eHQKQEAgLTQ5Nyw3ICs0OTcsMTAgQEAKIFRoZSBzZWNvbmQgY29sdW1uIGlkZW50aWZpZXMgdGhlIHR5cGUgb2YgcHJvYmUgKGsgLSBrcHJvYmUsIHIgLSBrcmV0cHJvYmUKIGFuZCBqIC0ganByb2JlKSwgd2hpbGUgdGhlIHRoaXJkIGNvbHVtbiBzcGVjaWZpZXMgdGhlIHN5bWJvbCtvZmZzZXQgb2YKIHRoZSBwcm9iZS4gSWYgdGhlIHByb2JlZCBmdW5jdGlvbiBiZWxvbmdzIHRvIGEgbW9kdWxlLCB0aGUgbW9kdWxlIG5hbWUKLWlzIGFsc28gc3BlY2lmaWVkLgoraXMgYWxzbyBzcGVjaWZpZWQuIEZvbGxvd2luZyBjb2x1bW5zIHNob3cgcHJvYmUgc3RhdHVzLiBJZiB0aGUgcHJvYmUgaXMgb24KK2EgdmlydHVhbCBhZGRyZXNzIHRoYXQgaXMgbm8gbG9uZ2VyIHZhbGlkIChtb2R1bGUgaW5pdCBzZWN0aW9ucywgbW9kdWxlCit2aXJ0dWFsIGFkZHJlc3NlcyB0aGF0IGNvcnJlc3BvbmQgdG8gbW9kdWxlcyB0aGF0J3ZlIGJlZW4gdW5sb2FkZWQpLAorc3VjaCBwcm9iZXMgYXJlIG1hcmtlZCB3aXRoIFtHT05FXS4KIAogL2RlYnVnL2twcm9iZXMvZW5hYmxlZDogVHVybiBrcHJvYmVzIE9OL09GRgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2xhcHRvcHMvdGhpbmtwYWQtYWNwaS50eHQgYi9Eb2N1bWVudGF0aW9uL2xhcHRvcHMvdGhpbmtwYWQtYWNwaS50eHQKaW5kZXggNzFmMGZlMS4uODk4YjQ5OCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9sYXB0b3BzL3RoaW5rcGFkLWFjcGkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbGFwdG9wcy90aGlua3BhZC1hY3BpLnR4dApAQCAtMTQ3NSw3ICsxNDc1LDcgQEAKIAogMHgwMjAxMDA6CU1hcmtlciBmb3IgdGhpbmtwYWQtYWNwaSB3aXRoIGhvdCBrZXkgTlZSQU0gcG9sbGluZwogCQlzdXBwb3J0LiAgSWYgeW91IG11c3QsIHVzZSBpdCB0byBrbm93IHlvdSBzaG91bGQgbm90Ci0JCXN0YXJ0IGFuIHVzZXJzcGFjZSBOVlJBTSBwb2xsZXIgKGFsbG93cyB0byBkZXRlY3Qgd2hlbgorCQlzdGFydCBhIHVzZXJzcGFjZSBOVlJBTSBwb2xsZXIgKGFsbG93cyB0byBkZXRlY3Qgd2hlbgogCQlOVlJBTSBpcyBjb21waWxlZCBvdXQgYnkgdGhlIHVzZXIgYmVjYXVzZSBpdCBpcwogCQl1bm5lZWRlZC91bmRlc2lyZWQgaW4gdGhlIGZpcnN0IHBsYWNlKS4KIDB4MDIwMTAxOglNYXJrZXIgZm9yIHRoaW5rcGFkLWFjcGkgd2l0aCBob3Qga2V5IE5WUkFNIHBvbGxpbmcKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbWFnaWMtbnVtYmVyLnR4dCBiL0RvY3VtZW50YXRpb24vbWFnaWMtbnVtYmVyLnR4dAppbmRleCA5NTA3MDAyLi41MDVmMTk2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL21hZ2ljLW51bWJlci50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9tYWdpYy1udW1iZXIudHh0CkBAIC0xMjUsMTQgKzEyNSwxNCBAQAogUk9VVEVSX01BR0lDICAgICAgICAgIDB4NTI0ZDQxNTcgIHdhbl9kZXZpY2UgICAgICAgIGluY2x1ZGUvbGludXgvd2Fucm91dGVyLmgKIFNDQ19NQUdJQyAgICAgICAgICAgICAweDUyNjk2MzY4ICBnc19wb3J0ICAgICAgICAgICBkcml2ZXJzL2NoYXIvc2NjLmgKIFNBVkVLTVNHX01BR0lDMSAgICAgICAweDUzNDE1NjQ1ICBzYXZla21zZyAgICAgICAgICBhcmNoLyovYW1pZ2EvY29uZmlnLmMKLUdEQV9NQUdJQyAgICAgICAgICAgICAweDU4NDY0NTUyICBnZGEgICAgICAgICAgICAgICBpbmNsdWRlL2FzbS1taXBzNjQvc24vZ2RhLmgKK0dEQV9NQUdJQyAgICAgICAgICAgICAweDU4NDY0NTUyICBnZGEgICAgICAgICAgICAgICBhcmNoL21pcHMvaW5jbHVkZS9hc20vc24vZ2RhLmgKIFJFRF9NQUdJQzEgICAgICAgICAgICAweDVhMmNmMDcxICAoYW55KSAgICAgICAgICAgICBtbS9zbGFiLmMKIFNUTF9QT1JUTUFHSUMgICAgICAgICAweDVhNzE4MmM5ICBzdGxwb3J0ICAgICAgICAgICBpbmNsdWRlL2xpbnV4L3N0YWxsaW9uLmgKIEVFUFJPTV9NQUdJQ19WQUxVRSAgICAweDVhYjQ3OGQyICBsYW5haV9kZXYgICAgICAgICBkcml2ZXJzL2F0bS9sYW5haS5jCiBIRExDRFJWX01BR0lDICAgICAgICAgMHg1YWM2ZTc3OCAgaGRsY2Rydl9zdGF0ZSAgICAgaW5jbHVkZS9saW51eC9oZGxjZHJ2LmgKIEVQQ0FfTUFHSUMgICAgICAgICAgICAweDVjNmRmMTA0ICBjaGFubmVsICAgICAgICAgICBpbmNsdWRlL2xpbnV4L2VwY2EuaAogUENYWF9NQUdJQyAgICAgICAgICAgIDB4NWM2ZGYxMDQgIGNoYW5uZWwgICAgICAgICAgIGRyaXZlcnMvY2hhci9wY3h4LmgKLUtWX01BR0lDICAgICAgICAgICAgICAweDVmNGI1NjVmICBrZXJuZWxfdmFyc19zICAgICBpbmNsdWRlL2FzbS1taXBzNjQvc24va2xrZXJudmFycy5oCitLVl9NQUdJQyAgICAgICAgICAgICAgMHg1ZjRiNTY1ZiAga2VybmVsX3ZhcnNfcyAgICAgYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NuL2tsa2VybnZhcnMuaAogSTgxMF9TVEFURV9NQUdJQyAgICAgIDB4NjM2NTczNzMgIGk4MTBfc3RhdGUgICAgICAgIHNvdW5kL29zcy9pODEwX2F1ZGlvLmMKIFRSSURFTlRfU1RBVEVfTUFHSUMgICAweDYzNjU3MzczICB0cmllbnRfc3RhdGUgICAgICBzb3VuZC9vc3MvdHJpZGVudC5jCiBNM19DQVJEX01BR0lDICAgICAgICAgMHg2NDZlNmY1MCAgbTNfY2FyZCAgICAgICAgICAgc291bmQvb3NzL21hZXN0cm8zLmMKQEAgLTE1OCw3ICsxNTgsNyBAQAogUVVFVUVfTUFHSUNfRlJFRSAgICAgIDB4ZjdlMWM5YTMgIHF1ZXVlX2VudHJ5ICAgICAgIGRyaXZlcnMvc2NzaS9hcm0vcXVldWUuYwogUVVFVUVfTUFHSUNfVVNFRCAgICAgIDB4ZjdlMWNjMzMgIHF1ZXVlX2VudHJ5ICAgICAgIGRyaXZlcnMvc2NzaS9hcm0vcXVldWUuYwogSFRCX0NNQUdJQyAgICAgICAgICAgIDB4RkVGQUZFRjEgIGh0Yl9jbGFzcyAgICAgICAgIG5ldC9zY2hlZC9zY2hfaHRiLmMKLU5NSV9NQUdJQyAgICAgICAgICAgICAweDQ4NDE0ZDRkNDU1MjAxIG5taV9zICAgICAgICBpbmNsdWRlL2FzbS1taXBzNjQvc24vbm1pLmgKK05NSV9NQUdJQyAgICAgICAgICAgICAweDQ4NDE0ZDRkNDU1MjAxIG5taV9zICAgICAgICBhcmNoL21pcHMvaW5jbHVkZS9hc20vc24vbm1pLmgKIAogTm90ZSB0aGF0IHRoZXJlIGFyZSBhbHNvIGRlZmluZWQgc3BlY2lhbCBwZXItZHJpdmVyIG1hZ2ljIG51bWJlcnMgaW4gc291bmQKIG1lbW9yeSBtYW5hZ2VtZW50LiBTZWUgaW5jbHVkZS9zb3VuZC9zbmRtYWdpYy5oIGZvciBjb21wbGV0ZSBsaXN0IG9mIHRoZW0uIE1hbnkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbWVtb3J5LWhvdHBsdWcudHh0IGIvRG9jdW1lbnRhdGlvbi9tZW1vcnktaG90cGx1Zy50eHQKaW5kZXggMTY4MTE3Yi4uNGMyZWNmNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9tZW1vcnktaG90cGx1Zy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9tZW1vcnktaG90cGx1Zy50eHQKQEAgLTEyNCw3ICsxMjQsNyBAQAogICAgIFRoaXMgb3B0aW9uIGNhbiBiZSBrZXJuZWwgbW9kdWxlIHRvby4KIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTMgc3lzZnMgZmlsZXMgZm9yIG1lbW9yeSBob3RwbHVnCis0IHN5c2ZzIGZpbGVzIGZvciBtZW1vcnkgaG90cGx1ZwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIEFsbCBzZWN0aW9ucyBoYXZlIHRoZWlyIGRldmljZSBpbmZvcm1hdGlvbiB1bmRlciAvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeSBhcwogCkBAIC0xMzgsMTEgKzEzOCwxMiBAQAogKDB4MTAwMDAwMDAwIC8gMUdpYiA9IDQpCiBUaGlzIGRldmljZSBjb3ZlcnMgYWRkcmVzcyByYW5nZSBbMHgxMDAwMDAwMDAgLi4uIDB4MTQwMDAwMDAwKQogCi1VbmRlciBlYWNoIHNlY3Rpb24sIHlvdSBjYW4gc2VlIDMgZmlsZXMuCitVbmRlciBlYWNoIHNlY3Rpb24sIHlvdSBjYW4gc2VlIDQgZmlsZXMuCiAKIC9zeXMvZGV2aWNlcy9zeXN0ZW0vbWVtb3J5L21lbW9yeVhYWC9waHlzX2luZGV4CiAvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS9tZW1vcnlYWFgvcGh5c19kZXZpY2UKIC9zeXMvZGV2aWNlcy9zeXN0ZW0vbWVtb3J5L21lbW9yeVhYWC9zdGF0ZQorL3N5cy9kZXZpY2VzL3N5c3RlbS9tZW1vcnkvbWVtb3J5WFhYL3JlbW92YWJsZQogCiAncGh5c19pbmRleCcgOiByZWFkLW9ubHkgYW5kIGNvbnRhaW5zIHNlY3Rpb24gaWQsIHNhbWUgYXMgWFhYLgogJ3N0YXRlJyAgICAgIDogcmVhZC13cml0ZQpAQCAtMTUwLDEwICsxNTEsMjAgQEAKICAgICAgICAgICAgICAgIGF0IHdyaXRlOiB1c2VyIGNhbiBzcGVjaWZ5ICJvbmxpbmUiLCAib2ZmbGluZSIgY29tbWFuZAogJ3BoeXNfZGV2aWNlJzogcmVhZC1vbmx5OiBkZXNpZ25lZCB0byBzaG93IHRoZSBuYW1lIG9mIHBoeXNpY2FsIG1lbW9yeSBkZXZpY2UuCiAgICAgICAgICAgICAgICBUaGlzIGlzIG5vdCB3ZWxsIGltcGxlbWVudGVkIG5vdy4KKydyZW1vdmFibGUnICA6IHJlYWQtb25seTogY29udGFpbnMgYW4gaW50ZWdlciB2YWx1ZSBpbmRpY2F0aW5nCisgICAgICAgICAgICAgICB3aGV0aGVyIHRoZSBtZW1vcnkgc2VjdGlvbiBpcyByZW1vdmFibGUgb3Igbm90CisgICAgICAgICAgICAgICByZW1vdmFibGUuICBBIHZhbHVlIG9mIDEgaW5kaWNhdGVzIHRoYXQgdGhlIG1lbW9yeQorICAgICAgICAgICAgICAgc2VjdGlvbiBpcyByZW1vdmFibGUgYW5kIGEgdmFsdWUgb2YgMCBpbmRpY2F0ZXMgdGhhdAorICAgICAgICAgICAgICAgaXQgaXMgbm90IHJlbW92YWJsZS4KIAogTk9URToKICAgVGhlc2UgZGlyZWN0b3JpZXMvZmlsZXMgYXBwZWFyIGFmdGVyIHBoeXNpY2FsIG1lbW9yeSBob3RwbHVnIHBoYXNlLgogCitJZiBDT05GSUdfTlVNQSBpcyBlbmFibGVkIHRoZQorL3N5cy9kZXZpY2VzL3N5c3RlbS9tZW1vcnkvbWVtb3J5WFhYIG1lbW9yeSBzZWN0aW9uCitkaXJlY3RvcmllcyBjYW4gYWxzbyBiZSBhY2Nlc3NlZCB2aWEgc3ltYm9saWMgbGlua3MgbG9jYXRlZCBpbgordGhlIC9zeXMvZGV2aWNlcy9zeXN0ZW0vbm9kZS9ub2RlKiBkaXJlY3Rvcmllcy4gIEZvciBleGFtcGxlOgorL3N5cy9kZXZpY2VzL3N5c3RlbS9ub2RlL25vZGUwL21lbW9yeTkgLT4gLi4vLi4vbWVtb3J5L21lbW9yeTkKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIDQuIFBoeXNpY2FsIG1lbW9yeSBob3QtYWRkIHBoYXNlCkBAIC0zNjUsNyArMzc2LDYgQEAKICAgLSBhbGxvd2luZyBtZW1vcnkgaG90LWFkZCB0byBaT05FX01PVkFCTEUuIG1heWJlIHdlIG5lZWQgc29tZSBzd2l0Y2ggbGlrZQogICAgIHN5c2N0bCBvciBuZXcgY29udHJvbCBmaWxlLgogICAtIHNob3dpbmcgbWVtb3J5IHNlY3Rpb24gYW5kIHBoeXNpY2FsIGRldmljZSByZWxhdGlvbnNoaXAuCi0gIC0gc2hvd2luZyBtZW1vcnkgc2VjdGlvbiBhbmQgbm9kZSByZWxhdGlvbnNoaXAgKG1heWJlIGdvb2QgZm9yIE5VTUEpCiAgIC0gc2hvd2luZyBtZW1vcnkgc2VjdGlvbiBpcyB1bmRlciBaT05FX01PVkFCTEUgb3Igbm90CiAgIC0gdGVzdCBhbmQgbWFrZSBpdCBiZXR0ZXIgbWVtb3J5IG9mZmxpbmluZy4KICAgLSBzdXBwb3J0IEh1Z2VUTEIgcGFnZSBtaWdyYXRpb24gYW5kIG9mZmxpbmluZy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbWlwcy9BVTF4eHhfSURFLlJFQURNRSBiL0RvY3VtZW50YXRpb24vbWlwcy9BVTF4eHhfSURFLlJFQURNRQppbmRleCAyNWE2ZWQxLi5mNTQ5NjJhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL21pcHMvQVUxeHh4X0lERS5SRUFETUUKKysrIGIvRG9jdW1lbnRhdGlvbi9taXBzL0FVMXh4eF9JREUuUkVBRE1FCkBAIC00NCw3ICs0NCw3IEBACiAKIFR3byBmaWxlcyBhcmUgaW50cm9kdWNlZDoKIAotICBhKSAnaW5jbHVkZS9hc20tbWlwcy9tYWNoLWF1MXgwMC9hdTF4eHhfaWRlLmgnCisgIGEpICdhcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvYXUxeHh4X2lkZS5oJwogICAgICBjb250YWluZXMgOiBzdHJ1Y3QgX2F1aWRlX2h3aWYKICAgICAgICAgICAgICAgICAgdGltaW5nIHBhcmFtZXRlcnMgZm9yIFBJTyBtb2RlIDAvMS8yLzMvNAogICAgICAgICAgICAgICAgICB0aW1pbmcgcGFyYW1ldGVycyBmb3IgTVdETUEgMC8xLzIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9yeHJwYy50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcnhycGMudHh0CmluZGV4IGMzNjY5YTMuLjYwZDA1ZWIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9yeHJwYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3J4cnBjLnR4dApAQCAtNTQwLDcgKzU0MCw3IEBACiAgICAgIE1TR19NT1JFIHNob3VsZCBiZSBzZXQgaW4gbXNnaGRyOjptc2dfZmxhZ3Mgb24gYWxsIGJ1dCB0aGUgbGFzdCBwYXJ0IG9mCiAgICAgIHRoZSByZXF1ZXN0LiAgTXVsdGlwbGUgcmVxdWVzdHMgbWF5IGJlIG1hZGUgc2ltdWx0YW5lb3VzbHkuCiAKLSAgICAgSWYgYSBjYWxsIGlzIGludGVuZGVkIHRvIGdvIHRvIGEgZGVzdGluYXRpb24gb3RoZXIgdGhlbiB0aGUgZGVmYXVsdAorICAgICBJZiBhIGNhbGwgaXMgaW50ZW5kZWQgdG8gZ28gdG8gYSBkZXN0aW5hdGlvbiBvdGhlciB0aGFuIHRoZSBkZWZhdWx0CiAgICAgIHNwZWNpZmllZCB0aHJvdWdoIGNvbm5lY3QoKSwgdGhlbiBtc2doZHI6Om1zZ19uYW1lIHNob3VsZCBiZSBzZXQgb24gdGhlCiAgICAgIGZpcnN0IHJlcXVlc3QgbWVzc2FnZSBvZiB0aGF0IGNhbGwuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy90dW50YXAudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3R1bnRhcC50eHQKaW5kZXggODM5Y2JiNy4uYzBhYWI5OCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3R1bnRhcC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3R1bnRhcC50eHQKQEAgLTExOCw3ICsxMTgsNyBAQAogSXQgaXMgdXNlZCBieSBWVHVuIChodHRwOi8vdnR1bi5zb3VyY2Vmb3JnZS5uZXQpLgogCiBBbm90aGVyIGludGVyZXN0aW5nIGFwcGxpY2F0aW9uIHVzaW5nIFRVTi9UQVAgaXMgcGlwc2VjZAotKGh0dHA6Ly9wZXJzby5lbnN0LmZyL35iZXlzc2FjL3BpcHNlYy8pLCBhbiB1c2Vyc3BhY2UgSVBTZWMKKyhodHRwOi8vcGVyc28uZW5zdC5mci9+YmV5c3NhYy9waXBzZWMvKSwgYSB1c2Vyc3BhY2UgSVBTZWMKIGltcGxlbWVudGF0aW9uIHRoYXQgY2FuIHVzZSBjb21wbGV0ZSBrZXJuZWwgcm91dGluZyAodW5saWtlIEZyZWVTL1dBTikuCiAKIDMuIEhvdyBkb2VzIFZpcnR1YWwgbmV0d29yayBkZXZpY2UgYWN0dWFsbHkgd29yayA/IApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2NwdV9mZWF0dXJlcy50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvY3B1X2ZlYXR1cmVzLnR4dAppbmRleCA0NzI3Mzk4Li5mZmE0MTgzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvY3B1X2ZlYXR1cmVzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvY3B1X2ZlYXR1cmVzLnR4dApAQCAtMzEsNyArMzEsNyBAQAogCiBBZnRlciBkZXRlY3RpbmcgdGhlIHByb2Nlc3NvciB0eXBlLCB0aGUga2VybmVsIHBhdGNoZXMgb3V0IHNlY3Rpb25zIG9mIGNvZGUKIHRoYXQgc2hvdWxkbid0IGJlIHVzZWQgYnkgd3JpdGluZyBub3AncyBvdmVyIGl0LiBVc2luZyBjcHVmZWF0dXJlcyByZXF1aXJlcwotanVzdCAyIG1hY3JvcyAoZm91bmQgaW4gaW5jbHVkZS9hc20tcHBjL2NwdXRhYmxlLmgpLCBhcyBzZWVuIGluIGhlYWQuUworanVzdCAyIG1hY3JvcyAoZm91bmQgaW4gYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NwdXRhYmxlLmgpLCBhcyBzZWVuIGluIGhlYWQuUwogdHJhbnNmZXJfdG9faGFuZGxlcjoKIAogCSNpZmRlZiBDT05GSUdfQUxUSVZFQwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2R0cy1iaW5kaW5ncy9mc2wvYm9hcmQudHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2R0cy1iaW5kaW5ncy9mc2wvYm9hcmQudHh0CmluZGV4IDgxYTkxN2UuLjZjOTc0ZDIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXJwYy9kdHMtYmluZGluZ3MvZnNsL2JvYXJkLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvZHRzLWJpbmRpbmdzL2ZzbC9ib2FyZC50eHQKQEAgLTE4LDcgKzE4LDcgQEAKIAogUmVxdWlyZWQgcHJvcGVyaXRpZXM6CiAtIGNvbXBhdGlibGUgOiBzaG91bGQgYmUgImZzbCxmcGdhLXBpeGlzIi4KLS0gcmVnIDogc2hvdWxkIGNvbnRhaW4gdGhlIGFkZHJlc3MgYW5kIHRoZSBsZW5naHQgb2YgdGhlIEZQUEdBIHJlZ2lzdGVyCistIHJlZyA6IHNob3VsZCBjb250YWluIHRoZSBhZGRyZXNzIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBGUFBHQSByZWdpc3RlcgogICBzZXQuCiAKIEV4YW1wbGUgKE1QQzg2MTBIUENEKToKQEAgLTI3LDMgKzI3LDMzIEBACiAJCWNvbXBhdGlibGUgPSAiZnNsLGZwZ2EtcGl4aXMiOwogCQlyZWcgPSA8MHhlODAwMDAwMCAzMj47CiAJfTsKKworKiBGcmVlc2NhbGUgQkNTUiBHUElPIGJhbmtzCisKK1NvbWUgQkNTUiByZWdpc3RlcnMgYWN0IGFzIHNpbXBsZSBHUElPIGNvbnRyb2xsZXJzLCBlYWNoIHN1Y2gKK3JlZ2lzdGVyIGNhbiBiZSByZXByZXNlbnRlZCBieSB0aGUgZ3Bpby1jb250cm9sbGVyIG5vZGUuCisKK1JlcXVpcmVkIHByb3Blcml0aWVzOgorLSBjb21wYXRpYmxlIDogU2hvdWxkIGJlICJmc2wsPGJvYXJkPi1iY3NyLWdwaW8iLgorLSByZWcgOiBTaG91bGQgY29udGFpbiB0aGUgYWRkcmVzcyBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgR1BJTyBiYW5rCisgIHJlZ2lzdGVyLgorLSAjZ3Bpby1jZWxscyA6IFNob3VsZCBiZSB0d28uIFRoZSBmaXJzdCBjZWxsIGlzIHRoZSBwaW4gbnVtYmVyIGFuZCB0aGUKKyAgc2Vjb25kIGNlbGwgaXMgdXNlZCB0byBzcGVjaWZ5IG9wdGlvbmFsIHBhcmFtdGVycyAoY3VycmVudGx5IHVudXNlZCkuCistIGdwaW8tY29udHJvbGxlciA6IE1hcmtzIHRoZSBwb3J0IGFzIEdQSU8gY29udHJvbGxlci4KKworRXhhbXBsZToKKworCWJjc3JAMSwwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzYwbWRzLWJjc3IiOworCQlyZWcgPSA8MSAwIDB4ODAwMD47CisJCXJhbmdlcyA9IDwwIDEgMCAweDgwMDA+OworCisJCWJjc3IxMzogZ3Bpby1jb250cm9sbGVyQGQgeworCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzYwbWRzLWJjc3ItZ3BpbyI7CisJCQlyZWcgPSA8MHhkIDE+OworCQkJZ3Bpby1jb250cm9sbGVyOworCQl9OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3MzOTAvRGVidWdnaW5nMzkwLnR4dCBiL0RvY3VtZW50YXRpb24vczM5MC9EZWJ1Z2dpbmczOTAudHh0CmluZGV4IGQzMGEyODEuLjEwNzExZDkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vczM5MC9EZWJ1Z2dpbmczOTAudHh0CisrKyBiL0RvY3VtZW50YXRpb24vczM5MC9EZWJ1Z2dpbmczOTAudHh0CkBAIC0xNDAyLDcgKzE0MDIsNyBAQAogcG9zc2liaWxpdGllcyBvZiB0aGVzZSBhcyB0aGUgaW5zdHJ1Y3Rpb24gaXMgbWFkZSB1cCBvZiBhICAweEEgb3Bjb2RlICYgdGhlIHNlY29uZCBieXRlIGJlaW5nCiB0aGUgc3lzY2FsbCBudW1iZXIuIFRoZXkgYXJlIHRyYWNlZCB1c2luZyB0aGUgc2ltcGxlIGNvbW1hbmQuCiBUUiBTVkMgIDxPcHRpb25hbCB2YWx1ZSBvciByYW5nZT4KLXRoZSBzeXNjYWxscyBhcmUgZGVmaW5lZCBpbiBsaW51eC9pbmNsdWRlL2FzbS1zMzkwL3VuaXN0ZC5oCit0aGUgc3lzY2FsbHMgYXJlIGRlZmluZWQgaW4gbGludXgvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3VuaXN0ZC5oCiBlLmcuIHRvIHRyYWNlIGFsbCBmaWxlIG9wZW5zIGp1c3QgZG8KIFRSIFNWQyA1ICggYXMgdGhpcyBpcyB0aGUgc3lzY2FsbCBudW1iZXIgb2Ygb3BlbiApCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vczM5MC9jZHMudHh0IGIvRG9jdW1lbnRhdGlvbi9zMzkwL2Nkcy50eHQKaW5kZXggYzRiN2IyYi4uNDgwYTc4ZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zMzkwL2Nkcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zMzkwL2Nkcy50eHQKQEAgLTk4LDcgKzk4LDcgQEAKIG9mIHRoZW0gY2FuIGJlIGZvdW5kIG9uIG90aGVyIExpbnV4IHBsYXRmb3JtcyBpbXBsZW1lbnRhdGlvbnMgdG9vLgogTWlzY2VsbGFuZW91cyBmdW5jdGlvbiBwcm90b3R5cGVzLCBkYXRhIGRlY2xhcmF0aW9ucywgYW5kIG1hY3JvIGRlZmluaXRpb25zCiBjYW4gYmUgZm91bmQgaW4gdGhlIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBDIGhlYWRlciBmaWxlCi1saW51eC9pbmNsdWRlL2FzbS1zMzkwL2lycS5oLgorbGludXgvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2lycS5oLgogCiBPdmVydmlldyBvZiBDRFMgaW50ZXJmYWNlIGNvbmNlcHRzCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vczM5MC9zMzkwZGJmLnR4dCBiL0RvY3VtZW50YXRpb24vczM5MC9zMzkwZGJmLnR4dAppbmRleCBlMDU0MjA5Li4yZDEwMDUzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3MzOTAvczM5MGRiZi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zMzkwL3MzOTBkYmYudHh0CkBAIC0yLDcgKzIsNyBAQAogPT09PT09PT09PT09PT09PT09CiAKIGZpbGVzOiBhcmNoL3MzOTAva2VybmVsL2RlYnVnLmMKLSAgICAgICBpbmNsdWRlL2FzbS1zMzkwL2RlYnVnLmgKKyAgICAgICBhcmNoL3MzOTAvaW5jbHVkZS9hc20vZGVidWcuaAogCiBEZXNjcmlwdGlvbjoKIC0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL0NoYW5nZUxvZy5scGZjIGIvRG9jdW1lbnRhdGlvbi9zY3NpL0NoYW5nZUxvZy5scGZjCmluZGV4IGFlM2Y5NjJhLi5mZjE5YTUyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Njc2kvQ2hhbmdlTG9nLmxwZmMKKysrIGIvRG9jdW1lbnRhdGlvbi9zY3NpL0NoYW5nZUxvZy5scGZjCkBAIC03MzMsNyArNzMzLDcgQEAKIAkgIEkvTyBjb21wbGV0aW9uIHBhdGggYSBsaXR0bGUgbW9yZSwgZXNwZWNpYWxseSB0YWtpbmcgY2FyZSBvZgogCSAgZmFzdC1wYXRoaW5nIHRoZSBub24tZXJyb3IgY2FzZS4gIEFsc28gcmVtb3ZlcyB0b25zIG9mIGRlYWQKIAkgIG1lbWJlcnMgYW5kIGRlZmluZXMgZnJvbSBscGZjX3Njc2kuaCAtIGUuZy4gbHBmY190YXJnZXQgaXMgZG93bgotCSAgdG8gbm90aGluZyBtb3JlIHRoZW4gdGhlIGxwZmNfbm9kZWxpc3QgcG9pbnRlci4KKwkgIHRvIG5vdGhpbmcgbW9yZSB0aGFuIHRoZSBscGZjX25vZGVsaXN0IHBvaW50ZXIuCiAJKiBBZGRlZCBiaW5hcnkgc3lzZnMgZmlsZSB0byBpc3N1ZSBtYm94IGNvbW1hbmRzCiAJKiBSZXBsYWNlZCAjaWYgX19CSUdfRU5ESUFOIHdpdGggI2lmIF9fQklHX0VORElBTl9CSVRGSUVMRCBmb3IKIAkgIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgdXNlciBzcGFjZSBhcHBsaWNhdGlvbnMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Njc2kvQ2hhbmdlTG9nLm5jcjUzYzh4eCBiL0RvY3VtZW50YXRpb24vc2NzaS9DaGFuZ2VMb2cubmNyNTNjOHh4CmluZGV4IGE5ZjcyMWEuLjhiMjc4YzEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2NzaS9DaGFuZ2VMb2cubmNyNTNjOHh4CisrKyBiL0RvY3VtZW50YXRpb24vc2NzaS9DaGFuZ2VMb2cubmNyNTNjOHh4CkBAIC0xOSw3ICsxOSw3IEBACiAKIFdlZCBKdWwgMjYgMjM6MzAgMjAwMCBHZXJhcmQgUm91ZGllciAoZ3JvdWRpZXJAY2x1Yi1pbnRlcm5ldC5mcikKIAkqIHZlcnNpb24gbmNyNTNjOHh4LTMuNC4xCi0JLSBQcm92aWRlIE9wZW5GaXJtYXJlIHBhdGggdGhyb3VnaCB0aGUgcHJvYyBGUyBvbiBQUEMuCisJLSBQcm92aWRlIE9wZW5GaXJtd2FyZSBwYXRoIHRocm91Z2ggdGhlIHByb2MgRlMgb24gUFBDLgogCS0gUmVtb3ZlIHRyYWlsaW5nIGFyZ3VtZW50ICMyIGZyb20gYSBjb3VwbGUgb2YgI3VuZGVmcy4KIAogU3VuIEp1bCAwOSAxNjozMCAyMDAwIEdlcmFyZCBSb3VkaWVyIChncm91ZGllckBjbHViLWludGVybmV0LmZyKQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL0NoYW5nZUxvZy5zeW01M2M4eHggYi9Eb2N1bWVudGF0aW9uL3Njc2kvQ2hhbmdlTG9nLnN5bTUzYzh4eAppbmRleCBlZjk4NWVjLi4wMmZmYmMxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Njc2kvQ2hhbmdlTG9nLnN5bTUzYzh4eAorKysgYi9Eb2N1bWVudGF0aW9uL3Njc2kvQ2hhbmdlTG9nLnN5bTUzYzh4eApAQCAtODEsNyArODEsNyBAQAogCiBXZWQgSnVsIDI2IDIzOjMwIDIwMDAgR2VyYXJkIFJvdWRpZXIgKGdyb3VkaWVyQGNsdWItaW50ZXJuZXQuZnIpCiAJKiB2ZXJzaW9uIHN5bTUzYzh4eC0xLjcuMQotCS0gUHJvdmlkZSBPcGVuRmlybWFyZSBwYXRoIHRocm91Z2ggdGhlIHByb2MgRlMgb24gUFBDLgorCS0gUHJvdmlkZSBPcGVuRmlybXdhcmUgcGF0aCB0aHJvdWdoIHRoZSBwcm9jIEZTIG9uIFBQQy4KIAktIERvd25sb2FkIG9mIG9uLWNoaXAgU1JBTSB1c2luZyBtZW1jcHlfdG9pbygpIGRvZXNuJ3Qgd29yayAKIAkgIG9uIFBQQy4gUmVzdG9yZSBwcmV2aW91cyBtZXRob2QgKE1FTU9SWSBNT1ZFIGZyb20gU0NSSVBUUykuCiAJLSBSZW1vdmUgdHJhaWxpbmcgYXJndW1lbnQgIzIgZnJvbSBhIGNvdXBsZSBvZiAjdW5kZWZzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL3Njc2lfZmNfdHJhbnNwb3J0LnR4dCBiL0RvY3VtZW50YXRpb24vc2NzaS9zY3NpX2ZjX3RyYW5zcG9ydC50eHQKaW5kZXggMzhkMzI0ZDYuLmU1YjA3MWQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2NzaS9zY3NpX2ZjX3RyYW5zcG9ydC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zY3NpL3Njc2lfZmNfdHJhbnNwb3J0LnR4dApAQCAtMTkxLDcgKzE5MSw3IEBACiAgICAgICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYSBkcml2ZXIgImF0dGFjaCIgb24gYW4gYWRhcHRlciwgd2hpY2ggaXMKICAgICAgIGluZGVwZW5kZW50IG9mIHRoZSBhZGFwdGVyJ3MgbGluayBzdGF0ZS4KICAgICAtIEluc3RhbnRpYXRpb24gb2YgdGhlIHZwb3J0IG9uIHRoZSBGQyBsaW5rIHZpYSBFTFMgdHJhZmZpYywgZXRjLgotICAgICAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGEgImxpbmsgdXAiIGFuZCBzdWNjZXNzZnVsbCBsaW5rIGluaXRpYWxpemF0aW9uLgorICAgICAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGEgImxpbmsgdXAiIGFuZCBzdWNjZXNzZnVsIGxpbmsgaW5pdGlhbGl6YXRpb24uCiAgIEZ1cnRoZXIgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIHRoZSBpbnRlcmZhY2VzIHNlY3Rpb24gYmVsb3cgZm9yCiAgIFZwb3J0IENyZWF0aW9uLgogCkBAIC0zMjAsNyArMzIwLDcgQEAKICAgICAgIFRoaXMgaXMgZXF1aXZhbGVudCB0byBhIGRyaXZlciAiYXR0YWNoIiBvbiBhbiBhZGFwdGVyLCB3aGljaCBpcwogICAgICAgaW5kZXBlbmRlbnQgb2YgdGhlIGFkYXB0ZXIncyBsaW5rIHN0YXRlLgogICAgIC0gSW5zdGFudGlhdGlvbiBvZiB0aGUgdnBvcnQgb24gdGhlIEZDIGxpbmsgdmlhIEVMUyB0cmFmZmljLCBldGMuCi0gICAgICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYSAibGluayB1cCIgYW5kIHN1Y2Nlc3NmdWxsIGxpbmsgaW5pdGlhbGl6YXRpb24uCisgICAgICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYSAibGluayB1cCIgYW5kIHN1Y2Nlc3NmdWwgbGluayBpbml0aWFsaXphdGlvbi4KIAogICBUaGUgTExERCdzIHZwb3J0X2NyZWF0ZSgpIGZ1bmN0aW9uIHdpbGwgbm90IHN5bmNocm9ub3VzbHkgd2FpdCBmb3IgYm90aAogICBwYXJ0cyB0byBiZSBmdWxseSBjb21wbGV0ZWQgYmVmb3JlIHJldHVybmluZy4gSXQgbXVzdCB2YWxpZGF0ZSB0aGF0IHRoZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zcGkvc3BpLWxtNzBsbHAgYi9Eb2N1bWVudGF0aW9uL3NwaS9zcGktbG03MGxscAppbmRleCAxNTRiZDAyLi4zNGE5Y2ZkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NwaS9zcGktbG03MGxscAorKysgYi9Eb2N1bWVudGF0aW9uL3NwaS9zcGktbG03MGxscApAQCAtMTMsMTAgKzEzLDIwIEBACiBUaGlzIGRyaXZlciBwcm92aWRlcyBnbHVlIGNvZGUgY29ubmVjdGluZyBhIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE03MCBMTFAKIHRlbXBlcmF0dXJlIHNlbnNvciBldmFsdWF0aW9uIGJvYXJkIHRvIHRoZSBrZXJuZWwncyBTUEkgY29yZSBzdWJzeXN0ZW0uCiAKK1RoaXMgaXMgYSBTUEkgbWFzdGVyIGNvbnRyb2xsZXIgZHJpdmVyLiBJdCBjYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoCisobGF5ZXJlZCB1bmRlcikgdGhlIExNNzAgbG9naWNhbCBkcml2ZXIgKGEgIlNQSSBwcm90b2NvbCBkcml2ZXIiKS4KIEluIGVmZmVjdCwgdGhpcyBkcml2ZXIgdHVybnMgdGhlIHBhcmFsbGVsIHBvcnQgaW50ZXJmYWNlIG9uIHRoZSBldmFsIGJvYXJkCiBpbnRvIGEgU1BJIGJ1cyB3aXRoIGEgc2luZ2xlIGRldmljZSwgd2hpY2ggd2lsbCBiZSBkcml2ZW4gYnkgdGhlIGdlbmVyaWMKIExNNzAgZHJpdmVyIChkcml2ZXJzL2h3bW9uL2xtNzAuYykuCiAKKworSGFyZHdhcmUgSW50ZXJmYWNpbmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgc2NoZW1hdGljIGZvciB0aGlzIHBhcnRpY3VsYXIgYm9hcmQgKHRoZSBMTTcwRVZBTC1MTFApIGlzCithdmFpbGFibGUgKG9uIHBhZ2UgNCkgaGVyZToKKworICBodHRwOi8vd3d3Lm5hdGlvbmFsLmNvbS9hcHBpbmZvL3RlbXBzZW5zb3JzL2ZpbGVzL0xNNzBMTFBFVkFMbWFudWFsLnBkZgorCiBUaGUgaGFyZHdhcmUgaW50ZXJmYWNpbmcgb24gdGhlIExNNzAgTExQIGV2YWwgYm9hcmQgaXMgYXMgZm9sbG93czoKIAogICAgUGFyYWxsZWwgICAgICAgICAgICAgICAgIExNNzAgTExQCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3N5c2N0bC92bS50eHQgYi9Eb2N1bWVudGF0aW9uL3N5c2N0bC92bS50eHQKaW5kZXggZDc5ZWVkYS4uY2QwNTk5NCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zeXNjdGwvdm0udHh0CisrKyBiL0RvY3VtZW50YXRpb24vc3lzY3RsL3ZtLnR4dApAQCAtNDEsNyArNDEsOCBAQAogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1kaXJ0eV9yYXRpbywgZGlydHlfYmFja2dyb3VuZF9yYXRpbywgZGlydHlfZXhwaXJlX2NlbnRpc2VjcywKK2RpcnR5X2J5dGVzLCBkaXJ0eV9yYXRpbywgZGlydHlfYmFja2dyb3VuZF9ieXRlcywKK2RpcnR5X2JhY2tncm91bmRfcmF0aW8sIGRpcnR5X2V4cGlyZV9jZW50aXNlY3MsCiBkaXJ0eV93cml0ZWJhY2tfY2VudGlzZWNzLCBoaWdobWVtX2lzX2RpcnR5YWJsZSwKIHZmc19jYWNoZV9wcmVzc3VyZSwgbGFwdG9wX21vZGUsIGJsb2NrX2R1bXAsIHN3YXBfdG9rZW5fdGltZW91dCwKIGRyb3AtY2FjaGVzLCBodWdlcGFnZXNfdHJlYXRfYXNfbW92YWJsZToKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdXNiL3Bvd2VyLW1hbmFnZW1lbnQudHh0IGIvRG9jdW1lbnRhdGlvbi91c2IvcG93ZXItbWFuYWdlbWVudC50eHQKaW5kZXggZTQ4ZWExZC4uYWQ2NDI2MSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi91c2IvcG93ZXItbWFuYWdlbWVudC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi91c2IvcG93ZXItbWFuYWdlbWVudC50eHQKQEAgLTMxMywxMSArMzEzLDEzIEBACiB0aGF0IGl0IHN1cHBvcnRzIGF1dG9zdXNwZW5kIGJ5IHNldHRpbmcgdGhlIC5zdXBwb3J0c19hdXRvc3VzcGVuZCBmbGFnCiBpbiBpdHMgdXNiX2RyaXZlciBzdHJ1Y3R1cmUuICBJdCBpcyB0aGVuIHJlc3BvbnNpYmxlIGZvciBpbmZvcm1pbmcgdGhlCiBVU0IgY29yZSB3aGVuZXZlciBvbmUgb2YgaXRzIGludGVyZmFjZXMgYmVjb21lcyBidXN5IG9yIGlkbGUuICBUaGUKLWRyaXZlciBkb2VzIHNvIGJ5IGNhbGxpbmcgdGhlc2UgdGhyZWUgZnVuY3Rpb25zOgorZHJpdmVyIGRvZXMgc28gYnkgY2FsbGluZyB0aGVzZSBmaXZlIGZ1bmN0aW9uczoKIAogCWludCAgdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKIAl2b2lkIHVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CiAJaW50ICB1c2JfYXV0b3BtX3NldF9pbnRlcmZhY2Uoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOworCWludCAgdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlX2FzeW5jKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKKwl2b2lkIHVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZV9hc3luYyhzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CiAKIFRoZSBmdW5jdGlvbnMgd29yayBieSBtYWludGFpbmluZyBhIGNvdW50ZXIgaW4gdGhlIHVzYl9pbnRlcmZhY2UKIHN0cnVjdHVyZS4gIFdoZW4gaW50Zi0+cG1fdXNhZ2VfY291bnQgaXMgPiAwIHRoZW4gdGhlIGludGVyZmFjZSBpcwpAQCAtMzMwLDEwICszMzIsMTIgQEAKIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGJ5IHRoZSBVU0IgY29yZS4pCiAKIFRoZSBkcml2ZXIgb3ducyBpbnRmLT5wbV91c2FnZV9jb3VudDsgaXQgY2FuIG1vZGlmeSB0aGUgdmFsdWUgaG93ZXZlcgotYW5kIHdoZW5ldmVyIGl0IGxpa2VzLiAgQSBuaWNlIGFzcGVjdCBvZiB0aGUgdXNiX2F1dG9wbV8qIHJvdXRpbmVzIGlzCi10aGF0IHRoZSBjaGFuZ2VzIHRoZXkgbWFrZSBhcmUgcHJvdGVjdGVkIGJ5IHRoZSB1c2JfZGV2aWNlIHN0cnVjdHVyZSdzCi1QTSBtdXRleCAodWRldi0+cG1fbXV0ZXgpOyBob3dldmVyIGRyaXZlcnMgbWF5IGNoYW5nZSBwbV91c2FnZV9jb3VudAotd2l0aG91dCBob2xkaW5nIHRoZSBtdXRleC4KK2FuZCB3aGVuZXZlciBpdCBsaWtlcy4gIEEgbmljZSBhc3BlY3Qgb2YgdGhlIG5vbi1hc3luYyB1c2JfYXV0b3BtXyoKK3JvdXRpbmVzIGlzIHRoYXQgdGhlIGNoYW5nZXMgdGhleSBtYWtlIGFyZSBwcm90ZWN0ZWQgYnkgdGhlIHVzYl9kZXZpY2UKK3N0cnVjdHVyZSdzIFBNIG11dGV4ICh1ZGV2LT5wbV9tdXRleCk7IGhvd2V2ZXIgZHJpdmVycyBtYXkgY2hhbmdlCitwbV91c2FnZV9jb3VudCB3aXRob3V0IGhvbGRpbmcgdGhlIG11dGV4LiAgRHJpdmVycyB1c2luZyB0aGUgYXN5bmMKK3JvdXRpbmVzIGFyZSByZXNwb25zaWJsZSBmb3IgdGhlaXIgb3duIHN5bmNocm9uaXphdGlvbiBhbmQgbXV0dWFsCitleGNsdXNpb24uCiAKIAl1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2UoKSBpbmNyZW1lbnRzIHBtX3VzYWdlX2NvdW50IGFuZAogCWF0dGVtcHRzIGFuIGF1dG9yZXN1bWUgaWYgdGhlIG5ldyB2YWx1ZSBpcyA+IDAgYW5kIHRoZQpAQCAtMzQ4LDYgKzM1MiwxNCBAQAogCWlzIHN1c3BlbmRlZCwgYW5kIGl0IGF0dGVtcHRzIGFuIGF1dG9zdXNwZW5kIGlmIHRoZSB2YWx1ZSBpcwogCTw9IDAgYW5kIHRoZSBkZXZpY2UgaXNuJ3Qgc3VzcGVuZGVkLgogCisJdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlX2FzeW5jKCkgYW5kCisJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlX2FzeW5jKCkgZG8gYWxtb3N0IHRoZSBzYW1lIHRoaW5ncyBhcworCXRoZWlyIG5vbi1hc3luYyBjb3VudGVycGFydHMuICBUaGUgZGlmZmVyZW5jZXMgYXJlOiB0aGV5IGRvCisJbm90IGFjcXVpcmUgdGhlIFBNIG11dGV4LCBhbmQgdGhleSB1c2UgYSB3b3JrcXVldWUgdG8gZG8gdGhlaXIKKwlqb2JzLiAgQXMgYSByZXN1bHQgdGhleSBjYW4gYmUgY2FsbGVkIGluIGFuIGF0b21pYyBjb250ZXh0LAorCXN1Y2ggYXMgYW4gVVJCJ3MgY29tcGxldGlvbiBoYW5kbGVyLCBidXQgd2hlbiB0aGV5IHJldHVybiB0aGUKKwlkZXZpY2Ugd2lsbCBub3QgZ2VuZXJhbGx5IG5vdCB5ZXQgYmUgaW4gdGhlIGRlc2lyZWQgc3RhdGUuCisKIFRoZXJlIGFsc28gYXJlIGEgY291cGxlIG9mIHV0aWxpdHkgcm91dGluZXMgZHJpdmVycyBjYW4gdXNlOgogCiAJdXNiX2F1dG9wbV9lbmFibGUoKSBzZXRzIHBtX3VzYWdlX2NudCB0byAwIGFuZCB0aGVuIGNhbGxzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZtL3VuZXZpY3RhYmxlLWxydS50eHQgYi9Eb2N1bWVudGF0aW9uL3ZtL3VuZXZpY3RhYmxlLWxydS50eHQKaW5kZXggMTI1ZWVkNS4uMDcwNmE3MiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92bS91bmV2aWN0YWJsZS1scnUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vdm0vdW5ldmljdGFibGUtbHJ1LnR4dApAQCAtMTM3LDEzICsxMzcsNiBAQAogbWFwIGluIHRyeV90b191bm1hcCgpLiAgSWYgdHJ5X3RvX3VubWFwKCkgcmV0dXJucyBTV0FQX01MT0NLLCBzaHJpbmtfcGFnZV9saXN0KCkKIHdpbGwgY3VsbCB0aGUgcGFnZSBhdCB0aGF0IHBvaW50LgogCi1Ob3RlIHRoYXQgZm9yIGFub255bW91cyBwYWdlcywgc2hyaW5rX3BhZ2VfbGlzdCgpIGF0dGVtcHRzIHRvIGFkZCB0aGUgcGFnZSB0bwotdGhlIHN3YXAgY2FjaGUgYmVmb3JlIGl0IHRyaWVzIHRvIHVubWFwIHRoZSBwYWdlLiAgVG8gYXZvaWQgdGhpcyB1bm5lY2Vzc2FyeQotY29uc3VtcHRpb24gb2Ygc3dhcCBzcGFjZSwgc2hyaW5rX3BhZ2VfbGlzdCgpIGNhbGxzIHRyeV90b19tdW5sb2NrKCkgdG8gY2hlY2sKLXdoZXRoZXIgYW55IFZNX0xPQ0tFRCB2bWFzIG1hcCB0aGUgcGFnZSB3aXRob3V0IGF0dGVtcHRpbmcgdG8gdW5tYXAgdGhlIHBhZ2UuCi1JZiB0cnlfdG9fbXVubG9jaygpIHJldHVybnMgU1dBUF9NTE9DSywgc2hyaW5rX3BhZ2VfbGlzdCgpIHdpbGwgY3VsbCB0aGUgcGFnZQotd2l0aG91dCBjb25zdW1pbmcgc3dhcCBzcGFjZS4gIHRyeV90b19tdW5sb2NrKCkgd2lsbCBiZSBkZXNjcmliZWQgYmVsb3cuCi0KIFRvICJjdWxsIiBhbiB1bmV2aWN0YWJsZSBwYWdlLCB2bXNjYW4gc2ltcGx5IHB1dHMgdGhlIHBhZ2UgYmFjayBvbiB0aGUgbHJ1CiBsaXN0IHVzaW5nIHB1dGJhY2tfbHJ1X3BhZ2UoKS0tdGhlIGludmVyc2Ugb3BlcmF0aW9uIHRvIGlzb2xhdGVfbHJ1X3BhZ2UoKS0tCiBhZnRlciBkcm9wcGluZyB0aGUgcGFnZSBsb2NrLiAgQmVjYXVzZSB0aGUgY29uZGl0aW9uIHdoaWNoIG1ha2VzIHRoZSBwYWdlCkBAIC0xOTAsOCArMTgzLDggQEAKICAgIGluIHRoZSBWTV9MT0NLRUQgZmxhZyBiZWluZyBzZXQgZm9yIHRoZSB2bWEuCiAzKSBpbiB0aGUgZmF1bHQgcGF0aCwgaWYgbWxvY2tlZCBwYWdlcyBhcmUgImN1bGxlZCIgaW4gdGhlIGZhdWx0IHBhdGgsCiAgICBhbmQgd2hlbiBhIFZNX0xPQ0tFRCBzdGFjayBzZWdtZW50IGlzIGV4cGFuZGVkLgotNCkgYXMgbWVudGlvbmVkIGFib3ZlLCBpbiB2bXNjYW46c2hyaW5rX3BhZ2VfbGlzdCgpIHdpdGggYXR0ZW1wdGluZyB0bwotICAgcmVjbGFpbSBhIHBhZ2UgaW4gYSBWTV9MT0NLRUQgdm1hLS12aWEgdHJ5X3RvX3VubWFwKCkgb3IgdHJ5X3RvX211bmxvY2soKS4KKzQpIGFzIG1lbnRpb25lZCBhYm92ZSwgaW4gdm1zY2FuOnNocmlua19wYWdlX2xpc3QoKSB3aGVuIGF0dGVtcHRpbmcgdG8KKyAgIHJlY2xhaW0gYSBwYWdlIGluIGEgVk1fTE9DS0VEIHZtYSB2aWEgdHJ5X3RvX3VubWFwKCkuCiAKIE1sb2NrZWQgcGFnZXMgYmVjb21lIHVubG9ja2VkIGFuZCByZXNjdWVkIGZyb20gdGhlIHVuZXZpY3RhYmxlIGxpc3Qgd2hlbjoKIApAQCAtMjYwLDkgKzI1Myw5IEBACiAKIDIpIHZtYXMgbWFwcGluZyBodWdldGxiZnMgcGFnZSBhcmUgYWxyZWFkeSBlZmZlY3RpdmVseSBwaW5uZWQgaW50byBtZW1vcnkuCiAgICBXZSBkb24ndCBuZWVkIG5vciB3YW50IHRvIG1sb2NrKCkgdGhlc2UgcGFnZXMuICBIb3dldmVyLCB0byBwcmVzZXJ2ZSB0aGUKLSAgIHByaW9yIGJlaGF2aW9yIG9mIG1sb2NrKCktLWJlZm9yZSB0aGUgdW5ldmljdGFibGUvbWxvY2sgY2hhbmdlcy0tbWxvY2tfZml4dXAoKQotICAgd2lsbCBjYWxsIG1ha2VfcGFnZXNfcHJlc2VudCgpIGluIHRoZSBodWdldGxiZnMgdm1hIHJhbmdlIHRvIGFsbG9jYXRlIHRoZQotICAgaHVnZSBwYWdlcyBhbmQgcG9wdWxhdGUgdGhlIHB0ZXMuCisgICBwcmlvciBiZWhhdmlvciBvZiBtbG9jaygpLS1iZWZvcmUgdGhlIHVuZXZpY3RhYmxlL21sb2NrIGNoYW5nZXMtLQorICAgbWxvY2tfZml4dXAoKSB3aWxsIGNhbGwgbWFrZV9wYWdlc19wcmVzZW50KCkgaW4gdGhlIGh1Z2V0bGJmcyB2bWEgcmFuZ2UKKyAgIHRvIGFsbG9jYXRlIHRoZSBodWdlIHBhZ2VzIGFuZCBwb3B1bGF0ZSB0aGUgcHRlcy4KIAogMykgdm1hcyB3aXRoIFZNX0RPTlRFWFBBTkR8Vk1fUkVTRVJWRUQgYXJlIGdlbmVyYWxseSB1c2VyIHNwYWNlIG1hcHBpbmdzIG9mCiAgICBrZXJuZWwgcGFnZXMsIHN1Y2ggYXMgdGhlIHZkc28gcGFnZSwgcmVsYXkgY2hhbm5lbCBwYWdlcywgZXRjLiAgVGhlc2UgcGFnZXMKQEAgLTMyMiw3ICszMTUsNyBAQAogcGFzc2luZyBhIGZsYWcgdG8gaW5kaWNhdGUgdGhhdCBtdW5sb2NrKCkgaXMgYmVpbmcgcGVyZm9ybWVkLgogCiBCZWNhdXNlIHRoZSB2bWEgYWNjZXNzIHByb3RlY3Rpb25zIGNvdWxkIGhhdmUgYmVlbiBjaGFuZ2VkIHRvIFBST1RfTk9ORSBhZnRlcgotZmF1bHRpbmcgaW4gYW5kIG1sb2NraW5nIHNvbWUgcGFnZXMsIGdldF91c2VyX3BhZ2VzKCkgd2FzIHVucmVsaWFibGUgZm9yIHZpc2l0aW5nCitmYXVsdGluZyBpbiBhbmQgbWxvY2tpbmcgcGFnZXMsIGdldF91c2VyX3BhZ2VzKCkgd2FzIHVucmVsaWFibGUgZm9yIHZpc2l0aW5nCiB0aGVzZSBwYWdlcyBmb3IgbXVubG9ja2luZy4gIEJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBsZWF2ZSBwYWdlcyBtbG9ja2VkKCksCiBnZXRfdXNlcl9wYWdlcygpIHdhcyBlbmhhbmNlZCB0byBhY2NlcHQgYSBmbGFnIHRvIGlnbm9yZSB0aGUgcGVybWlzc2lvbnMgd2hlbgogZmV0Y2hpbmcgdGhlIHBhZ2VzLS1hbGwgb2Ygd2hpY2ggc2hvdWxkIGJlIHJlc2lkZW50IGFzIGEgcmVzdWx0IG9mIHByZXZpb3VzCkBAIC00MTYsOCArNDA5LDggQEAKIFdoZW4gdW5tYXBwaW5nIGFuIG1sb2NrZWQgcmVnaW9uIG9mIG1lbW9yeSwgd2hldGhlciBieSBhbiBleHBsaWNpdCBjYWxsIHRvCiBtdW5tYXAoKSBvciB2aWEgYW4gaW50ZXJuYWwgdW5tYXAgZnJvbSBleGl0KCkgb3IgZXhlYygpIHByb2Nlc3NpbmcsIHdlIG11c3QKIG11bmxvY2sgdGhlIHBhZ2VzIGlmIHdlJ3JlIHJlbW92aW5nIHRoZSBsYXN0IFZNX0xPQ0tFRCB2bWEgdGhhdCBtYXBzIHRoZSBwYWdlcy4KLUJlZm9yZSB0aGUgdW5ldmljdGFibGUvbWxvY2sgY2hhbmdlcywgbWxvY2tpbmcgZGlkIG5vdCBtYXJrIHRoZSBwYWdlcyBpbiBhbnkgd2F5LAotc28gdW5tYXBwaW5nIHRoZW0gcmVxdWlyZWQgbm8gcHJvY2Vzc2luZy4KK0JlZm9yZSB0aGUgdW5ldmljdGFibGUvbWxvY2sgY2hhbmdlcywgbWxvY2tpbmcgZGlkIG5vdCBtYXJrIHRoZSBwYWdlcyBpbiBhbnkKK3dheSwgc28gdW5tYXBwaW5nIHRoZW0gcmVxdWlyZWQgbm8gcHJvY2Vzc2luZy4KIAogVG8gbXVubG9jayBhIHJhbmdlIG9mIG1lbW9yeSB1bmRlciB0aGUgdW5ldmljdGFibGUvbWxvY2sgaW5mcmFzdHJ1Y3R1cmUsIHRoZQogbXVubWFwKCkgaGFuZGVyIGFuZCB0YXNrIGFkZHJlc3Mgc3BhY2UgdGVhciBkb3duIGZ1bmN0aW9uIGNhbGwKQEAgLTUxNywxMiArNTEwLDEwIEBACiBNbG9ja2VkIHBhZ2VzOiAgdHJ5X3RvX211bmxvY2soKSBSZXZlcnNlIE1hcCBTY2FuCiAKIFRPRE8vRklYTUU6ICBhIGJldHRlciBuYW1lIG1pZ2h0IGJlIHBhZ2VfbWxvY2tlZCgpLS1hbmFsb2dvdXMgdG8gdGhlCi1wYWdlX3JlZmVyZW5jZWQoKSByZXZlcnNlIG1hcCB3YWxrZXItLWVzcGVjaWFsbHkgaWYgd2UgY29udGludWUgdG8gY2FsbCB0aGlzCi1mcm9tIHNocmlua19wYWdlX2xpc3QoKS4gIFNlZSByZWxhdGVkIFRPRE8vRklYTUUgYmVsb3cuCitwYWdlX3JlZmVyZW5jZWQoKSByZXZlcnNlIG1hcCB3YWxrZXIuCiAKLVdoZW4gbXVubG9ja192bWFfcGFnZSgpLS1zZWUgIk1sb2NrZWQgUGFnZXM6ICBtdW5sb2NrKCkvbXVubG9ja2FsbCgpIFN5c3RlbQotQ2FsbCBIYW5kbGluZyIgYWJvdmUtLXRyaWVzIHRvIG11bmxvY2sgYSBwYWdlLCBvciB3aGVuIHNocmlua19wYWdlX2xpc3QoKQotZW5jb3VudGVycyBhbiBhbm9ueW1vdXMgcGFnZSB0aGF0IGlzIG5vdCB5ZXQgaW4gdGhlIHN3YXAgY2FjaGUsIHRoZXkgbmVlZCB0bworV2hlbiBtdW5sb2NrX3ZtYV9wYWdlKCktLXNlZSAiTWxvY2tlZCBQYWdlczogIG11bmxvY2soKS9tdW5sb2NrYWxsKCkKK1N5c3RlbSBDYWxsIEhhbmRsaW5nIiBhYm92ZS0tdHJpZXMgdG8gbXVubG9jayBhIHBhZ2UsIGl0IG5lZWRzIHRvCiBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhlIHBhZ2UgaXMgbWFwcGVkIGJ5IGFueSBWTV9MT0NLRUQgdm1hLCB3aXRob3V0CiBhY3R1YWxseSBhdHRlbXB0aW5nIHRvIHVubWFwIGFsbCBwdGVzIGZyb20gdGhlIHBhZ2UuICBGb3IgdGhpcyBwdXJwb3NlLCB0aGUKIHVuZXZpY3RhYmxlL21sb2NrIGluZnJhc3RydWN0dXJlIGludHJvZHVjZWQgYSB2YXJpYW50IG9mIHRyeV90b191bm1hcCgpIGNhbGxlZApAQCAtNTM1LDEwICs1MjYsNyBAQAogcGFnZXMgbWFwcGVkIGluIGxpbmVhciBWTUFzLCBhcyBpbiB0aGUgdHJ5X3RvX3VubWFwKCkgY2FzZSwgdGhlIGZ1bmN0aW9ucwogYXR0ZW1wdCB0byBhY3F1aXJlIHRoZSBhc3NvY2lhdGVkIG1tYXAgc2VtcGhvcmUsIG1sb2NrIHRoZSBwYWdlIHZpYQogbWxvY2tfdm1hX3BhZ2UoKSBhbmQgcmV0dXJuIFNXQVBfTUxPQ0suICBUaGlzIGVmZmVjdGl2ZWx5IHVuZG9lcyB0aGUKLXByZS1jbGVhcmluZyBvZiB0aGUgcGFnZSdzIFBHX21sb2NrZWQgZG9uZSBieSBtdW5sb2NrX3ZtYV9wYWdlKCkgYW5kIGluZm9ybXMKLXNocmlua19wYWdlX2xpc3QoKSB0aGF0IHRoZSBhbm9ueW1vdXMgcGFnZSBzaG91bGQgYmUgY3VsbGVkIHJhdGhlciB0aGFuIGFkZGVkCi10byB0aGUgc3dhcCBjYWNoZSBpbiBwcmVwYXJhdGlvbiBmb3IgYSB0cnlfdG9fdW5tYXAoKSB0aGF0IHdpbGwgYWxtb3N0Ci1jZXJ0YWlubHkgZmFpbC4KK3ByZS1jbGVhcmluZyBvZiB0aGUgcGFnZSdzIFBHX21sb2NrZWQgZG9uZSBieSBtdW5sb2NrX3ZtYV9wYWdlLgogCiBJZiB0cnlfdG9fdW5tYXAoKSBpcyB1bmFibGUgdG8gYWNxdWlyZSBhIFZNX0xPQ0tFRCB2bWEncyBhc3NvY2lhdGVkIG1tYXAKIHNlbWFwaG9yZSwgaXQgd2lsbCByZXR1cm4gU1dBUF9BR0FJTi4gIFRoaXMgd2lsbCBhbGxvdyBzaHJpbmtfcGFnZV9saXN0KCkKQEAgLTU1NywxMCArNTQ1LDcgQEAKIHN1Y2Nlc3NmdWxseSBhY3F1aXJlIHRoZSB2bWEncyBtbWFwIHNlbXBob3JlIGZvciByZWFkIGFuZCBtbG9jayB0aGUgcGFnZS4KIEFsdGhvdWdoIHRyeV90b19tdW5sb2NrKCkgY2FuIGJlIGNhbGxlZCBtYW55IFt2ZXJ5IG1hbnkhXSB0aW1lcyB3aGVuCiBtdW5sb2NrKClpbmcgYSBsYXJnZSByZWdpb24gb3IgdGVhcmluZyBkb3duIGEgbGFyZ2UgYWRkcmVzcyBzcGFjZSB0aGF0IGhhcyBiZWVuCi1tbG9ja2VkIHZpYSBtbG9ja2FsbCgpLCBvdmVyYWxsIHRoaXMgaXMgYSBmYWlybHkgcmFyZSBldmVudC4gIEluIGFkZGl0aW9uLAotYWx0aG91Z2ggc2hyaW5rX3BhZ2VfbGlzdCgpIGNhbGxzIHRyeV90b19tdW5sb2NrKCkgZm9yIGV2ZXJ5IGFub255bW91cyBwYWdlIHRoYXQKLWl0IGhhbmRsZXMgdGhhdCBpcyBub3QgeWV0IGluIHRoZSBzd2FwIGNhY2hlLCBvbiBhdmVyYWdlIGFub255bW91cyBwYWdlcyB3aWxsCi1oYXZlIHZlcnkgc2hvcnQgcmV2ZXJzZSBtYXAgbGlzdHMuCittbG9ja2VkIHZpYSBtbG9ja2FsbCgpLCBvdmVyYWxsIHRoaXMgaXMgYSBmYWlybHkgcmFyZSBldmVudC4KIAogTWxvY2tlZCBQYWdlOiAgUGFnZSBSZWNsYWltIGluIHNocmlua18qX2xpc3QoKQogCkBAIC01ODgsOCArNTczLDggQEAKICAgIG11bmxvY2tfdm1hX3BhZ2UoKSB3YXMgZm9yY2VkIHRvIGxldCB0aGUgcGFnZSBiYWNrIG9uIHRvIHRoZSBub3JtYWwKICAgIExSVSBsaXN0IGZvciB2bXNjYW4gdG8gaGFuZGxlLgogCi1zaHJpbmtfaW5hY3RpdmVfbGlzdCgpIGFsc28gY3VsbHMgYW55IHVuZXZpY3RhYmxlIHBhZ2VzIHRoYXQgaXQgZmluZHMKLW9uIHRoZSBpbmFjdGl2ZSBsaXN0cywgYWdhaW4gZGl2ZXJ0aW5nIHRoZW0gdG8gdGhlIGFwcHJvcHJpYXRlIHpvbmUncyB1bmV2aWN0YWJsZQorc2hyaW5rX2luYWN0aXZlX2xpc3QoKSBhbHNvIGN1bGxzIGFueSB1bmV2aWN0YWJsZSBwYWdlcyB0aGF0IGl0IGZpbmRzIG9uCit0aGUgaW5hY3RpdmUgbGlzdHMsIGFnYWluIGRpdmVydGluZyB0aGVtIHRvIHRoZSBhcHByb3ByaWF0ZSB6b25lJ3MgdW5ldmljdGFibGUKIGxydSBsaXN0LiAgc2hyaW5rX2luYWN0aXZlX2xpc3QoKSBzaG91bGQgb25seSBzZWUgU0hNX0xPQ0tlZCBwYWdlcyB0aGF0IGJlY2FtZQogU0hNX0xPQ0tlZCBhZnRlciBzaHJpbmtfYWN0aXZlX2xpc3QoKSBoYWQgbW92ZWQgdGhlbSB0byB0aGUgaW5hY3RpdmUgbGlzdCwgb3IKIHBhZ2VzIG1hcHBlZCBpbnRvIFZNX0xPQ0tFRCB2bWFzIHRoYXQgbXVubG9ja192bWFfcGFnZSgpIGNvdWxkbid0IGlzb2xhdGUgZnJvbQpAQCAtNTk3LDE5ICs1ODIsNyBAQAogdGhlIGxhdHRlciwgYnV0IHdpbGwgcGFzcyBvbiB0byBzaHJpbmtfcGFnZV9saXN0KCkuCiAKIHNocmlua19wYWdlX2xpc3QoKSBhZ2FpbiBjdWxscyBvYnZpb3VzbHkgdW5ldmljdGFibGUgcGFnZXMgdGhhdCBpdCBjb3VsZAotZW5jb3VudGVyIGZvciBzaW1pbGFyIHJlYXNvbiB0byBzaHJpbmtfaW5hY3RpdmVfbGlzdCgpLiAgQXMgYWxyZWFkeSBkaXNjdXNzZWQsCi1zaHJpbmtfcGFnZV9saXN0KCkgcHJvYWN0aXZlbHkgbG9va3MgZm9yIGFub255bW91cyBwYWdlcyB0aGF0IHNob3VsZCBoYXZlCi1QR19tbG9ja2VkIHNldCBidXQgZG9uJ3QtLXRoZXNlIHdvdWxkIG5vdCBiZSBkZXRlY3RlZCBieSBwYWdlX2V2aWN0YWJsZSgpLS10bwotYXZvaWQgYWRkaW5nIHRoZW0gdG8gdGhlIHN3YXAgY2FjaGUgdW5uZWNlc3NhcmlseS4gIEZpbGUgcGFnZXMgbWFwcGVkIGludG8KK2VuY291bnRlciBmb3Igc2ltaWxhciByZWFzb24gdG8gc2hyaW5rX2luYWN0aXZlX2xpc3QoKS4gIFBhZ2VzIG1hcHBlZCBpbnRvCiBWTV9MT0NLRUQgdm1hcyBidXQgd2l0aG91dCBQR19tbG9ja2VkIHNldCB3aWxsIG1ha2UgaXQgYWxsIHRoZSB3YXkgdG8KLXRyeV90b191bm1hcCgpLiAgc2hyaW5rX3BhZ2VfbGlzdCgpIHdpbGwgZGl2ZXJ0IHRoZW0gdG8gdGhlIHVuZXZpY3RhYmxlIGxpc3Qgd2hlbgotdHJ5X3RvX3VubWFwKCkgcmV0dXJucyBTV0FQX01MT0NLLCBhcyBkaXNjdXNzZWQgYWJvdmUuCi0KLVRPRE8vRklYTUU6ICBJZiB3ZSBjYW4gZW5oYW5jZSB0aGUgc3dhcCBjYWNoZSB0byByZWxpYWJseSByZW1vdmUgZW50cmllcwotd2l0aCBwYWdlX2NvdW50KHBhZ2UpID4gMiwgYXMgbG9uZyBhcyBhbGwgcHRlcyBhcmUgbWFwcGVkIHRvIHRoZSBwYWdlIGFuZAotbm90IHRoZSBzd2FwIGVudHJ5LCB3ZSBjYW4gcHJvYmFibHkgcmVtb3ZlIHRoZSBjYWxsIHRvIHRyeV90b19tdW5sb2NrKCkgaW4KLXNocmlua19wYWdlX2xpc3QoKSBhbmQganVzdCByZW1vdmUgdGhlIHBhZ2UgZnJvbSB0aGUgc3dhcCBjYWNoZSB3aGVuCi10cnlfdG9fdW5tYXAoKSByZXR1cm5zIFNXQVBfTUxPQ0suICAgQ3VycmVudGx5LCByZW1vdmVfZXhjbHVzaXZlX3N3YXBfcGFnZSgpCi1kb2Vzbid0IHNlZW0gdG8gYWxsb3cgdGhhdC4KLQotCit0cnlfdG9fdW5tYXAoKS4gIHNocmlua19wYWdlX2xpc3QoKSB3aWxsIGRpdmVydCB0aGVtIHRvIHRoZSB1bmV2aWN0YWJsZSBsaXN0Cit3aGVuIHRyeV90b191bm1hcCgpIHJldHVybnMgU1dBUF9NTE9DSywgYXMgZGlzY3Vzc2VkIGFib3ZlLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi93MS9tYXN0ZXJzLzAwLUlOREVYIGIvRG9jdW1lbnRhdGlvbi93MS9tYXN0ZXJzLzAwLUlOREVYCmluZGV4IDdiMGNlYWEuLmQ2M2ZhMDIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdzEvbWFzdGVycy8wMC1JTkRFWAorKysgYi9Eb2N1bWVudGF0aW9uL3cxL21hc3RlcnMvMDAtSU5ERVgKQEAgLTQsNSArNCw3IEBACiAJLSBUaGUgTWF4aW0vRGFsbGFzIFNlbWljb25kdWN0b3IgRFMyNDgyIHByb3ZpZGVzIDEtd2lyZSBidXNzZXMuCiBkczI0OTAKIAktIFRoZSBNYXhpbS9EYWxsYXMgU2VtaWNvbmR1Y3RvciBEUzI0OTAgYnVpbGRzIFVTQiA8LT4gVzEgYnJpZGdlcy4KK214Y193MQorCS0gVzEgbWFzdGVyIGNvbnRyb2xsZXIgZHJpdmVyIGZvdW5kIG9uIEZyZWVzY2FsZSBNWDIvTVgzIFNvQ3MKIHcxLWdwaW8KIAktIEdQSU8gMS13aXJlIGJ1cyBtYXN0ZXIgZHJpdmVyLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi93MS9tYXN0ZXJzL214Yy13MSBiL0RvY3VtZW50YXRpb24vdzEvbWFzdGVycy9teGMtdzEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdmNjE5OQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdzEvbWFzdGVycy9teGMtdzEKQEAgLTAsMCArMSwxMSBAQAorS2VybmVsIGRyaXZlciBteGNfdzEKKz09PT09PT09PT09PT09PT09PT09CisKK1N1cHBvcnRlZCBjaGlwczoKKyAgKiBGcmVlc2NhbGUgTVgyNywgTVgzMSBhbmQgcHJvYmFibHkgb3RoZXIgaS5NWCBTb0NzCisgICAgRGF0YXNoZWV0czoKKyAgICAgICAgaHR0cDovL3d3dy5mcmVlc2NhbGUuY29tL2ZpbGVzLzMyYml0L2RvYy9kYXRhX3NoZWV0L01DSU1YMzEucGRmP2Zwc3A9MQorCWh0dHA6Ly93d3cuZnJlZXNjYWxlLmNvbS9maWxlcy9kc3AvTUNJTVgyNy5wZGY/ZnBzcD0xCisKK0F1dGhvcjogT3JpZ2luYWxseSBiYXNlZCBvbiBGcmVlc2NhbGUgY29kZSwgcHJlcGFyZWQgZm9yIG1haW5saW5lIGJ5CisJU2FzY2hhIEhhdWVyIDxzLmhhdWVyQHBlbmd1dHJvbml4LmRlPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi93MS93MS5uZXRsaW5rIGIvRG9jdW1lbnRhdGlvbi93MS93MS5uZXRsaW5rCmluZGV4IDM2NDBjN2MuLjgwNDQ0NWYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdzEvdzEubmV0bGluaworKysgYi9Eb2N1bWVudGF0aW9uL3cxL3cxLm5ldGxpbmsKQEAgLTUsNjkgKzUsMTU3IEBACiA9PT09PT09PT09PT09CiAKIFRoZXJlIGFyZSB0aHJlZSB0eXBlcyBvZiBtZXNzYWdlcyBiZXR3ZWVuIHcxIGNvcmUgYW5kIHVzZXJzcGFjZToKLTEuIEV2ZW50cy4gVGhleSBhcmUgZ2VuZXJhdGVkIGVhY2ggdGltZSBuZXcgbWFzdGVyIG9yIHNsYXZlIGRldmljZSBmb3VuZAotCWVpdGhlciBkdWUgdG8gYXV0b21hdGljIG9yIHJlcXVlc3RlZCBzZWFyY2guCi0yLiBVc2Vyc3BhY2UgY29tbWFuZHMuIEluY2x1ZGVzIHJlYWQvd3JpdGUgYW5kIHNlYXJjaC9hbGFybSBzZWFyY2ggY29tYW1uZHMuCisxLiBFdmVudHMuIFRoZXkgYXJlIGdlbmVyYXRlZCBlYWNoIHRpbWUgbmV3IG1hc3RlciBvciBzbGF2ZSBkZXZpY2UKKwlmb3VuZCBlaXRoZXIgZHVlIHRvIGF1dG9tYXRpYyBvciByZXF1ZXN0ZWQgc2VhcmNoLgorMi4gVXNlcnNwYWNlIGNvbW1hbmRzLgogMy4gUmVwbGllcyB0byB1c2Vyc3BhY2UgY29tbWFuZHMuCiAKIAogUHJvdG9jb2wuCiA9PT09PT09PQogCi1bc3RydWN0IGNuX21zZ10gLSBjb25uZWN0b3IgaGVhZGVyLiBJdCdzIGxlbmd0aCBmaWVsZCBpcyBlcXVhbCB0byBzaXplIG9mIHRoZSBhdHRhY2hlZCBkYXRhLgorW3N0cnVjdCBjbl9tc2ddIC0gY29ubmVjdG9yIGhlYWRlci4KKwlJdHMgbGVuZ3RoIGZpZWxkIGlzIGVxdWFsIHRvIHNpemUgb2YgdGhlIGF0dGFjaGVkIGRhdGEKIFtzdHJ1Y3QgdzFfbmV0bGlua19tc2ddIC0gdzEgbmV0bGluayBoZWFkZXIuCiAJX191OCB0eXBlIAktIG1lc3NhZ2UgdHlwZS4KLQkJCVcxX1NMQVZFX0FERC9XMV9TTEFWRV9SRU1PVkUgLSBzbGF2ZSBhZGQvcmVtb3ZlIGV2ZW50cy4KLQkJCVcxX01BU1RFUl9BREQvVzFfTUFTVEVSX1JFTU9WRSAtIG1hc3RlciBhZGQvcmVtb3ZlIGV2ZW50cy4KLQkJCVcxX01BU1RFUl9DTUQgLSB1c2Vyc3BhY2UgY29tbWFuZCBmb3IgYnVzIG1hc3RlciBkZXZpY2UgKHNlYXJjaC9hbGFybSBzZWFyY2gpLgotCQkJVzFfU0xBVkVfQ01EIC0gdXNlcnNwYWNlIGNvbW1hbmQgZm9yIHNsYXZlIGRldmljZSAocmVhZC93cml0ZS8gc2VhcmNoL2FsYXJtIHNlYXJjaAotCQkJCQlmb3IgYnVzIG1hc3RlciBkZXZpY2Ugd2hlcmUgZ2l2ZW4gc2xhdmUgZGV2aWNlIGZvdW5kKS4KKwkJCVcxX0xJU1RfTUFTVEVSUworCQkJCWxpc3QgY3VycmVudCBidXMgbWFzdGVycworCQkJVzFfU0xBVkVfQUREL1cxX1NMQVZFX1JFTU9WRQorCQkJCXNsYXZlIGFkZC9yZW1vdmUgZXZlbnRzCisJCQlXMV9NQVNURVJfQUREL1cxX01BU1RFUl9SRU1PVkUKKwkJCQltYXN0ZXIgYWRkL3JlbW92ZSBldmVudHMKKwkJCVcxX01BU1RFUl9DTUQKKwkJCQl1c2Vyc3BhY2UgY29tbWFuZCBmb3IgYnVzIG1hc3RlcgorCQkJCWRldmljZSAoc2VhcmNoL2FsYXJtIHNlYXJjaCkKKwkJCVcxX1NMQVZFX0NNRAorCQkJCXVzZXJzcGFjZSBjb21tYW5kIGZvciBzbGF2ZSBkZXZpY2UKKwkJCQkocmVhZC93cml0ZS90b3VjaCkKIAlfX3U4IHJlcwktIHJlc2VydmVkCi0JX191MTYgbGVuCS0gc2l6ZSBvZiBhdHRhY2hlZCB0byB0aGlzIGhlYWRlciBkYXRhLgorCV9fdTE2IGxlbgktIHNpemUgb2YgZGF0YSBhdHRhY2hlZCB0byB0aGlzIGhlYWRlciBkYXRhCiAJdW5pb24gewotCQlfX3U4IGlkOwkJCSAtIHNsYXZlIHVuaXF1ZSBkZXZpY2UgaWQKKwkJX191OCBpZFs4XTsJCQkgLSBzbGF2ZSB1bmlxdWUgZGV2aWNlIGlkCiAJCXN0cnVjdCB3MV9tc3QgewotCQkJX191MzIJCWlkOwkgLSBtYXN0ZXIncyBpZC4KKwkJCV9fdTMyCQlpZDsJIC0gbWFzdGVyJ3MgaWQKIAkJCV9fdTMyCQlyZXM7CSAtIHJlc2VydmVkCiAJCX0gbXN0OwogCX0gaWQ7CiAKLVtzdHJ1Y3J0IHcxX25ldGxpbmtfY21kXSAtIGNvbW1hbmQgZm9yIGdpdmVkIG1hc3RlciBvciBzbGF2ZSBkZXZpY2UuCitbc3RydWN0IHcxX25ldGxpbmtfY21kXSAtIGNvbW1hbmQgZm9yIGdpdmVuIG1hc3RlciBvciBzbGF2ZSBkZXZpY2UuCiAJX191OCBjbWQJLSBjb21tYW5kIG9wY29kZS4KLQkJCVcxX0NNRF9SRUFEIAktIHJlYWQgY29tbWFuZC4KLQkJCVcxX0NNRF9XUklURQktIHdyaXRlIGNvbW1hbmQuCi0JCQlXMV9DTURfU0VBUkNICS0gc2VhcmNoIGNvbW1hbmQuCi0JCQlXMV9DTURfQUxBUk1fU0VBUkNIIC0gYWxhcm0gc2VhcmNoIGNvbW1hbmQuCisJCQlXMV9DTURfUkVBRCAJLSByZWFkIGNvbW1hbmQKKwkJCVcxX0NNRF9XUklURQktIHdyaXRlIGNvbW1hbmQKKwkJCVcxX0NNRF9UT1VDSAktIHRvdWNoIGNvbW1hbmQKKwkJCQkod3JpdGUgYW5kIHNhbXBsZSBkYXRhIGJhY2sgdG8gdXNlcnNwYWNlKQorCQkJVzFfQ01EX1NFQVJDSAktIHNlYXJjaCBjb21tYW5kCisJCQlXMV9DTURfQUxBUk1fU0VBUkNIIC0gYWxhcm0gc2VhcmNoIGNvbW1hbmQKIAlfX3U4IHJlcwktIHJlc2VydmVkCi0JX191MTYgbGVuCS0gbGVuZ3RoIG9mIGRhdGEgZm9yIHRoaXMgY29tbWFuZC4KLQkJCUZvciByZWFkIGNvbW1hbmQgZGF0YSBtdXN0IGJlIGFsbG9jYXRlZCBsaWtlIGZvciB3cml0ZSBjb21tYW5kLgotCV9fdTggZGF0YVswXQktIGRhdGEgZm9yIHRoaXMgY29tbWFuZC4KKwlfX3UxNiBsZW4JLSBsZW5ndGggb2YgZGF0YSBmb3IgdGhpcyBjb21tYW5kCisJCUZvciByZWFkIGNvbW1hbmQgZGF0YSBtdXN0IGJlIGFsbG9jYXRlZCBsaWtlIGZvciB3cml0ZSBjb21tYW5kCisJX191OCBkYXRhWzBdCS0gZGF0YSBmb3IgdGhpcyBjb21tYW5kCiAKIAotRWFjaCBjb25uZWN0b3IgbWVzc2FnZSBjYW4gaW5jbHVkZSBvbmUgb3IgbW9yZSB3MV9uZXRsaW5rX21zZyB3aXRoIHplcm8gb2YgbW9yZSBhdHRhY2hlZCB3MV9uZXRsaW5rX2NtZCBtZXNzYWdlcy4KK0VhY2ggY29ubmVjdG9yIG1lc3NhZ2UgY2FuIGluY2x1ZGUgb25lIG9yIG1vcmUgdzFfbmV0bGlua19tc2cgd2l0aAoremVybyBvciBtb3JlIGF0dGFjaGVkIHcxX25ldGxpbmtfY21kIG1lc3NhZ2VzLgogCi1Gb3IgZXZlbnQgbWVzc2FnZXMgdGhlcmUgYXJlIG5vIHcxX25ldGxpbmtfY21kIGVtYmVkZGVkIHN0cnVjdHVyZXMsIG9ubHkgY29ubmVjdG9yIGhlYWRlcgotYW5kIHcxX25ldGxpbmtfbXNnIHN0cnVjdXRyZSB3aXRoICJsZW4iIGZpZWxkIGJlaW5nIHplcm8gYW5kIGZpbGxlZCB0eXBlIChvbmUgb2YgZXZlbnQgdHlwZXMpCi1hbmQgaWQgLSBlaXRoZXIgOCBieXRlcyBvZiBzbGF2ZSB1bmlxdWUgaWQgaW4gaG9zdCBvcmRlciwgb3IgbWFzdGVyJ3MgaWQsIHdoaWNoIGlzIGFzc2lnbmVkCi10byBidXMgbWFzdGVyIGRldmljZSB3aGVuIGl0IGlzIGFkZGVkIHRvIHcxIGNvcmUuCitGb3IgZXZlbnQgbWVzc2FnZXMgdGhlcmUgYXJlIG5vIHcxX25ldGxpbmtfY21kIGVtYmVkZGVkIHN0cnVjdHVyZXMsCitvbmx5IGNvbm5lY3RvciBoZWFkZXIgYW5kIHcxX25ldGxpbmtfbXNnIHN0cnVjdXRyZSB3aXRoICJsZW4iIGZpZWxkCitiZWluZyB6ZXJvIGFuZCBmaWxsZWQgdHlwZSAob25lIG9mIGV2ZW50IHR5cGVzKSBhbmQgaWQ6CitlaXRoZXIgOCBieXRlcyBvZiBzbGF2ZSB1bmlxdWUgaWQgaW4gaG9zdCBvcmRlciwKK29yIG1hc3RlcidzIGlkLCB3aGljaCBpcyBhc3NpZ25lZCB0byBidXMgbWFzdGVyIGRldmljZQord2hlbiBpdCBpcyBhZGRlZCB0byB3MSBjb3JlLgogCi1DdXJyZW50bHkgcmVwbGllcyB0byB1c2Vyc3BhY2UgY29tbWFuZHMgYXJlIG9ubHkgZ2VuZXJhdGVkIGZvciByZWFkIGNvbW1hbmQgcmVxdWVzdC4KLU9uZSByZXBseSBpcyBnZW5lcmF0ZWQgZXhhY3RseSBmb3Igb25lIHcxX25ldGxpbmtfY21kIHJlYWQgcmVxdWVzdC4KLVJlcGxpZXMgYXJlIG5vdCBjb21iaW5lZCB3aGVuIHNlbnQgLSBpLmUuIHR5cGljYWwgcmVwbHkgbWVzc2FnZXMgbG9va3MgbGlrZSB0aGUgZm9sbG93aW5nOgorQ3VycmVudGx5IHJlcGxpZXMgdG8gdXNlcnNwYWNlIGNvbW1hbmRzIGFyZSBvbmx5IGdlbmVyYXRlZCBmb3IgcmVhZAorY29tbWFuZCByZXF1ZXN0LiBPbmUgcmVwbHkgaXMgZ2VuZXJhdGVkIGV4YWN0bHkgZm9yIG9uZSB3MV9uZXRsaW5rX2NtZAorcmVhZCByZXF1ZXN0LiBSZXBsaWVzIGFyZSBub3QgY29tYmluZWQgd2hlbiBzZW50IC0gaS5lLiB0eXBpY2FsIHJlcGx5CittZXNzYWdlcyBsb29rcyBsaWtlIHRoZSBmb2xsb3dpbmc6CisKIFtjbl9tc2ddW3cxX25ldGxpbmtfbXNnXVt3MV9uZXRsaW5rX2NtZF0KLWNuX21zZy5sZW4gPSBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfbXNnKSArIHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19jbWQpICsgY21kLT5sZW47Citjbl9tc2cubGVuID0gc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX21zZykgKworCSAgICAgc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCkgKworCSAgICAgY21kLT5sZW47CiB3MV9uZXRsaW5rX21zZy5sZW4gPSBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKSArIGNtZC0+bGVuOwogdzFfbmV0bGlua19jbWQubGVuID0gY21kLT5sZW47CiAKK1JlcGxpZXMgdG8gVzFfTElTVF9NQVNURVJTIHNob3VsZCBzZW5kIGEgbWVzc2FnZSBiYWNrIHRvIHRoZSB1c2Vyc3BhY2UKK3doaWNoIHdpbGwgY29udGFpbiBsaXN0IG9mIGFsbCByZWdpc3RlcmVkIG1hc3RlciBpZHMgaW4gdGhlIGZvbGxvd2luZworZm9ybWF0OgorCisJY25fbXNnIChDTl9XMV9JRFguQ05fVzFfVkFMIGFzIGlkLCBsZW4gaXMgZXF1YWwgdG8gc2l6ZW9mKHN0cnVjdAorCXcxX25ldGxpbmtfbXNnKSBwbHVzIG51bWJlciBvZiBtYXN0ZXJzIG11bHRpcGxlZCBieSA0KQorCXcxX25ldGxpbmtfbXNnICh0eXBlOiBXMV9MSVNUX01BU1RFUlMsIGxlbiBpcyBlcXVhbCB0bworCQludW1iZXIgb2YgbWFzdGVycyBtdWx0aXBsaWVkIGJ5IDQgKHUzMiBzaXplKSkKKwlpZDAgLi4uIGlkTgorCisJRWFjaCBtZXNzYWdlIGlzIGF0IG1vc3QgNGsgaW4gc2l6ZSwgc28gaWYgbnVtYmVyIG9mIG1hc3RlciBkZXZpY2VzCisJZXhjZWVkcyB0aGlzLCBpdCB3aWxsIGJlIHNwbGl0IGludG8gc2V2ZXJhbCBtZXNzYWdlcywKKwljbi5zZXEgd2lsbCBiZSBpbmNyZWFzZWQgZm9yIGVhY2ggb25lLgorCitXMSBzZWFyY2ggYW5kIGFsYXJtIHNlYXJjaCBjb21tYW5kcy4KK3JlcXVlc3Q6CitbY25fbXNnXQorICBbdzFfbmV0bGlua19tc2cgdHlwZSA9IFcxX01BU1RFUl9DTUQKKyAgCWlkIGlzIGVxdWFsIHRvIHRoZSBidXMgbWFzdGVyIGlkIHRvIHVzZSBmb3Igc2VhcmNoaW5nXQorICBbdzFfbmV0bGlua19jbWQgY21kID0gVzFfQ01EX1NFQVJDSCBvciBXMV9DTURfQUxBUk1fU0VBUkNIXQorCityZXBseToKKyAgW2NuX21zZywgYWNrID0gMSBhbmQgaW5jcmVhc2luZywgMCBtZWFucyB0aGUgbGFzdCBtZXNzYWdlLAorICAJc2VxIGlzIGVxdWFsIHRvIHRoZSByZXF1ZXN0IHNlcV0KKyAgW3cxX25ldGxpbmtfbXNnIHR5cGUgPSBXMV9NQVNURVJfQ01EXQorICBbdzFfbmV0bGlua19jbWQgY21kID0gVzFfQ01EX1NFQVJDSCBvciBXMV9DTURfQUxBUk1fU0VBUkNICisJbGVuIGlzIGVxdWFsIHRvIG51bWJlciBvZiBJRHMgbXVsdGlwbGllZCBieSA4XQorICBbNjRiaXQtaWQwIC4uLiA2NGJpdC1pZE5dCitMZW5ndGggaW4gZWFjaCBoZWFkZXIgY29ycmVzcG9uZHMgdG8gdGhlIHNpemUgb2YgdGhlIGRhdGEgYmVoaW5kIGl0LCBzbwordzFfbmV0bGlua19jbWQtPmxlbiA9IE4gKiA4OyB3aGVyZSBOIGlzIG51bWJlciBvZiBJRHMgaW4gdGhpcyBtZXNzYWdlLgorCUNhbiBiZSB6ZXJvLgordzFfbmV0bGlua19tc2ctPmxlbiA9IHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19jbWQpICsgTiAqIDg7Citjbl9tc2ctPmxlbiA9IHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19tc2cpICsKKwkgICAgICBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKSArCisJICAgICAgTio4OworCitXMSByZXNldCBjb21tYW5kLgorW2NuX21zZ10KKyAgW3cxX25ldGxpbmtfbXNnIHR5cGUgPSBXMV9NQVNURVJfQ01ECisgIAlpZCBpcyBlcXVhbCB0byB0aGUgYnVzIG1hc3RlciBpZCB0byB1c2UgZm9yIHNlYXJjaGluZ10KKyAgW3cxX25ldGxpbmtfY21kIGNtZCA9IFcxX0NNRF9SRVNFVF0KKworCitDb21tYW5kIHN0YXR1cyByZXBsaWVzLgorPT09PT09PT09PT09PT09PT09PT09PQorCitFYWNoIGNvbW1hbmQgKGVpdGhlciByb290LCBtYXN0ZXIgb3Igc2xhdmUgd2l0aCBvciB3aXRob3V0IHcxX25ldGxpbmtfY21kCitzdHJ1Y3R1cmUpIHdpbGwgYmUgJ2Fja2VkJyBieSB0aGUgdzEgY29yZS4gRm9ybWF0IG9mIHRoZSByZXBseSBpcyB0aGUgc2FtZQorYXMgcmVxdWVzdCBtZXNzYWdlIGV4Y2VwdCB0aGF0IGxlbmd0aCBwYXJhbWV0ZXJzIGRvIG5vdCBhY2NvdW50IGZvciBkYXRhCityZXF1ZXN0ZWQgYnkgdGhlIHVzZXIsIGkuZS4gcmVhZC93cml0ZS90b3VjaCBJTyByZXF1ZXN0cyB3aWxsIG5vdCBjb250YWluCitkYXRhLCBzbyB3MV9uZXRsaW5rX2NtZC5sZW4gd2lsbCBiZSAwLCB3MV9uZXRsaW5rX21zZy5sZW4gd2lsbCBiZSBzaXplCitvZiB0aGUgdzFfbmV0bGlua19jbWQgc3RydWN0dXJlIGFuZCBjbl9tc2cubGVuIHdpbGwgYmUgZXF1YWwgdG8gdGhlIHN1bQorb2YgdGhlIHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19tc2cpIGFuZCBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKS4KK0lmIHJlcGx5IGlzIGdlbmVyYXRlZCBmb3IgbWFzdGVyIG9yIHJvb3QgY29tbWFuZCAod2hpY2ggZG8gbm90IGhhdmUKK3cxX25ldGxpbmtfY21kIGF0dGFjaGVkKSwgcmVwbHkgd2lsbCBjb250YWluIG9ubHkgY25fbXNnIGFuZCB3MV9uZXRsaW5rX21zZworc3RydWN0aXJlcy4KKwordzFfbmV0bGlua19tc2cuc3RhdHVzIGZpZWxkIHdpbGwgY2FycnkgcG9zaXRpdmUgZXJyb3IgdmFsdWUKKyhFSU5WQUwgZm9yIGV4YW1wbGUpIG9yIHplcm8gaW4gY2FzZSBvZiBzdWNjZXNzLgorCitBbGwgb3RoZXIgZmllbGRzIGluIGV2ZXJ5IHN0cnVjdHVyZSB3aWxsIG1pcnJvciB0aGUgc2FtZSBwYXJhbWV0ZXJzIGluIHRoZQorcmVxdWVzdCBtZXNzYWdlIChleGNlcHQgbGVuZ3RocyBhcyBkZXNjcmliZWQgYWJvdmUpLgorCitTdGF0dXMgcmVwbHkgaXMgZ2VuZXJhdGVkIGZvciBldmVyeSB3MV9uZXRsaW5rX2NtZCBlbWJlZGRlZCBpbiB0aGUKK3cxX25ldGxpbmtfbXNnLCBpZiB0aGVyZSBhcmUgbm8gdzFfbmV0bGlua19jbWQgc3RydWN0dXJlcywKK3JlcGx5IHdpbGwgYmUgZ2VuZXJhdGVkIGZvciB0aGUgdzFfbmV0bGlua19tc2cuCisKK0FsbCB3MV9uZXRsaW5rX2NtZCBjb21tYW5kIHN0cnVjdHVyZXMgYXJlIGhhbmRsZWQgaW4gZXZlcnkgdzFfbmV0bGlua19tc2csCitldmVuIGlmIHRoZXJlIHdlcmUgZXJyb3JzLCBvbmx5IGxlbmd0aCBtaXNtYXRjaCBpbnRlcnJ1cHRzIG1lc3NhZ2UgcHJvY2Vzc2luZy4KKwogCiBPcGVyYXRpb24gc3RlcHMgaW4gdzEgY29yZSB3aGVuIG5ldyBjb21tYW5kIGlzIHJlY2VpdmVkLgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1XaGVuIG5ldyBtZXNzYWdlICh3MV9uZXRsaW5rX21zZykgaXMgcmVjZWl2ZWQgdzEgY29yZSBkZXRlY3RzIGlmIGl0IGlzIG1hc3RlciBvZiBzbGF2ZSByZXF1ZXN0LAotYWNjb3JkaW5nIHRvIHcxX25ldGxpbmtfbXNnLnR5cGUgZmllbGQuCitXaGVuIG5ldyBtZXNzYWdlICh3MV9uZXRsaW5rX21zZykgaXMgcmVjZWl2ZWQgdzEgY29yZSBkZXRlY3RzIGlmIGl0IGlzCittYXN0ZXIgb3Igc2xhdmUgcmVxdWVzdCwgYWNjb3JkaW5nIHRvIHcxX25ldGxpbmtfbXNnLnR5cGUgZmllbGQuCiBUaGVuIG1hc3RlciBvciBzbGF2ZSBkZXZpY2UgaXMgc2VhcmNoZWQgZm9yLgotV2hlbiBmb3VuZCwgbWFzdGVyIGRldmljZSAocmVxdWVzdGVkIG9yIHRob3NlIG9uZSBvbiB3aGVyZSBzbGF2ZSBkZXZpY2UgaXMgZm91bmQpIGlzIGxvY2tlZC4KLUlmIHNsYXZlIGNvbW1hbmQgaXMgcmVxdWVzdGVkLCB0aGVuIHJlc2V0L3NlbGVjdCBwcm9jZWR1cmUgaXMgc3RhcnRlZCB0byBzZWxlY3QgZ2l2ZW4gZGV2aWNlLgorV2hlbiBmb3VuZCwgbWFzdGVyIGRldmljZSAocmVxdWVzdGVkIG9yIHRob3NlIG9uZSBvbiB3aGVyZSBzbGF2ZSBkZXZpY2UKK2lzIGZvdW5kKSBpcyBsb2NrZWQuIElmIHNsYXZlIGNvbW1hbmQgaXMgcmVxdWVzdGVkLCB0aGVuIHJlc2V0L3NlbGVjdAorcHJvY2VkdXJlIGlzIHN0YXJ0ZWQgdG8gc2VsZWN0IGdpdmVuIGRldmljZS4KIAogVGhlbiBhbGwgcmVxdWVzdGVkIGluIHcxX25ldGxpbmtfbXNnIG9wZXJhdGlvbnMgYXJlIHBlcmZvcm1lZCBvbmUgYnkgb25lLgogSWYgY29tbWFuZCByZXF1aXJlcyByZXBseSAobGlrZSByZWFkIGNvbW1hbmQpIGl0IGlzIHNlbnQgb24gY29tbWFuZCBjb21wbGV0aW9uLgpAQCAtODIsOCArMTcwLDggQEAKIEVhY2ggY29ubmVjdG9yIG1lc3NhZ2UgaW5jbHVkZXMgdHdvIHUzMiBmaWVsZHMgYXMgImFkZHJlc3MiLgogdzEgdXNlcyBDTl9XMV9JRFggYW5kIENOX1cxX1ZBTCBkZWZpbmVkIGluIGluY2x1ZGUvbGludXgvY29ubmVjdG9yLmggaGVhZGVyLgogRWFjaCBtZXNzYWdlIGFsc28gaW5jbHVkZXMgc2VxdWVuY2UgYW5kIGFja25vd2xlZGdlIG51bWJlcnMuCi1TZXF1ZW5jZSBudW1iZXIgZm9yIGV2ZW50IG1lc3NhZ2VzIGlzIGFwcHJvcHJpYXRlIGJ1cyBtYXN0ZXIgc2VxdWVuY2UgbnVtYmVyIGluY3JlYXNlZCB3aXRoCi1lYWNoIGV2ZW50IG1lc3NhZ2Ugc2VudCAidGhyb3VnaCIgdGhpcyBtYXN0ZXIuCitTZXF1ZW5jZSBudW1iZXIgZm9yIGV2ZW50IG1lc3NhZ2VzIGlzIGFwcHJvcHJpYXRlIGJ1cyBtYXN0ZXIgc2VxdWVuY2UgbnVtYmVyCitpbmNyZWFzZWQgd2l0aCBlYWNoIGV2ZW50IG1lc3NhZ2Ugc2VudCAidGhyb3VnaCIgdGhpcyBtYXN0ZXIuCiBTZXF1ZW5jZSBudW1iZXIgZm9yIHVzZXJzcGFjZSByZXF1ZXN0cyBpcyBzZXQgYnkgdXNlcnNwYWNlIGFwcGxpY2F0aW9uLgogU2VxdWVuY2UgbnVtYmVyIGZvciByZXBseSBpcyB0aGUgc2FtZSBhcyB3YXMgaW4gcmVxdWVzdCwgYW5kCiBhY2tub3dsZWRnZSBudW1iZXIgaXMgc2V0IHRvIHNlcSsxLgpAQCAtOTMsNiArMTgxLDYgQEAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIDEuIERvY3VtZW50YXRpb24vY29ubmVjdG9yCi0yLiBodHRwOi8vdHNlcnZpY2UubmV0LnJ1L35zMG1icmUvYXJjaGl2ZS93MQotVGhpcyBhcmNoaXZlIGluY2x1ZGVzIHVzZXJzcGFjZSBhcHBsaWNhdGlvbiB3MWQuYyB3aGljaAotdXNlcyByZWFkL3dyaXRlL3NlYXJjaCBjb21tYW5kcyBmb3IgYWxsIG1hc3Rlci9zbGF2ZSBkZXZpY2VzIGZvdW5kIG9uIHRoZSBidXMuCisyLiBodHRwOi8vd3d3LmlvcmVtYXAubmV0L2FyY2hpdmUvdzEKK1RoaXMgYXJjaGl2ZSBpbmNsdWRlcyB1c2Vyc3BhY2UgYXBwbGljYXRpb24gdzFkLmMgd2hpY2ggdXNlcworcmVhZC93cml0ZS9zZWFyY2ggY29tbWFuZHMgZm9yIGFsbCBtYXN0ZXIvc2xhdmUgZGV2aWNlcyBmb3VuZCBvbiB0aGUgYnVzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi93aW1heC9SRUFETUUuaTI0MDBtIGIvRG9jdW1lbnRhdGlvbi93aW1heC9SRUFETUUuaTI0MDBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZmZkODkKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3dpbWF4L1JFQURNRS5pMjQwMG0KQEAgLTAsMCArMSwyNjAgQEAKKworICAgRHJpdmVyIGZvciB0aGUgSW50ZWwgV2lyZWxlc3MgV2ltYXggQ29ubmVjdGlvbiAyNDAwbQorCisgICAoQykgMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbiA8IGxpbnV4LXdpbWF4QGludGVsLmNvbSA+CisKKyAgIFRoaXMgcHJvdmlkZXMgYSBkcml2ZXIgZm9yIHRoZSBJbnRlbCBXaXJlbGVzcyBXaU1BWCBDb25uZWN0aW9uIDI0MDBtCisgICBhbmQgYSBiYXNpYyBMaW51eCBrZXJuZWwgV2lNQVggc3RhY2suCisKKzEuIFJlcXVpcmVtZW50cworCisgICAgICogTGludXggaW5zdGFsbGF0aW9uIHdpdGggTGludXgga2VybmVsIDIuNi4yMiBvciBuZXdlciAoaWYgYnVpbGRpbmcKKyAgICAgICBmcm9tIGEgc2VwYXJhdGUgdHJlZSkKKyAgICAgKiBJbnRlbCBpMjQwMG0gRWNobyBQZWFrIG9yIEJheHRlciBQZWFrOyB0aGlzIGluY2x1ZGVzIHRoZSBJbnRlbAorICAgICAgIFdpcmVsZXNzIFdpTUFYL1dpRmkgTGluayA1eDUwIHNlcmllcy4KKyAgICAgKiBidWlsZCB0b29sczoKKyAgICAgICAgICArIExpbnV4IGtlcm5lbCBkZXZlbG9wbWVudCBwYWNrYWdlIGZvciB0aGUgdGFyZ2V0IGtlcm5lbDsgdG8KKyAgICAgICAgICAgIGJ1aWxkIGFnYWluc3QgeW91ciBjdXJyZW50bHkgcnVubmluZyBrZXJuZWwsIHlvdSBuZWVkIHRvIGhhdmUKKyAgICAgICAgICAgIHRoZSBrZXJuZWwgZGV2ZWxvcG1lbnQgcGFja2FnZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBydW5uaW5nCisgICAgICAgICAgICBpbWFnZSBpbnN0YWxsZWQgKHVzdWFsbHkgaWYgeW91ciBrZXJuZWwgaXMgbmFtZWQKKyAgICAgICAgICAgIGxpbnV4LVZFUlNJT04sIHRoZSBkZXZlbG9wbWVudCBwYWNrYWdlIGlzIGNhbGxlZAorICAgICAgICAgICAgbGludXgtZGV2LVZFUlNJT04gb3IgbGludXgtaGVhZGVycy1WRVJTSU9OKS4KKyAgICAgICAgICArIEdOVSBDIENvbXBpbGVyLCBtYWtlCisKKzIuIENvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24KKworMi4xLiBDb21waWxhdGlvbiBvZiB0aGUgZHJpdmVycyBpbmNsdWRlZCBpbiB0aGUga2VybmVsCisKKyAgIENvbmZpZ3VyZSB0aGUga2VybmVsOyB0byBlbmFibGUgdGhlIFdpTUFYIGRyaXZlcnMgc2VsZWN0IERyaXZlcnMgPgorICAgTmV0d29ya2luZyBEcml2ZXJzID4gV2lNQVggZGV2aWNlIHN1cHBvcnQuIEVuYWJsZSBhbGwgb2YgdGhlbSBhcworICAgbW9kdWxlcyAoZWFzaWVyKS4KKworICAgSWYgVVNCIG9yIFNESU8gYXJlIG5vdCBlbmFibGVkIGluIHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbiwgdGhlIG9wdGlvbnMKKyAgIHRvIGJ1aWxkIHRoZSBpMjQwMG0gVVNCIG9yIFNESU8gZHJpdmVycyB3aWxsIG5vdCBzaG93LiBFbmFibGUgc2FpZAorICAgc3Vic3lzdGVtcyBhbmQgZ28gYmFjayB0byB0aGUgV2lNQVggbWVudSB0byBlbmFibGUgdGhlIGRyaXZlcnMuCisKKyAgIENvbXBpbGUgYW5kIGluc3RhbGwgeW91ciBrZXJuZWwgYXMgdXN1YWwuCisKKzIuMi4gQ29tcGlsYXRpb24gb2YgdGhlIGRyaXZlcnMgZGlzdHJpYnV0ZWQgYXMgYW4gc3RhbmRhbG9uZSBtb2R1bGUKKworICAgVG8gY29tcGlsZQorCiskIGNkIHNvdXJjZS9kaXJlY3RvcnkKKyQgbWFrZQorCisgICBPbmNlIGJ1aWx0IHlvdSBjYW4gbG9hZCBhbmQgdW5sb2FkIHVzaW5nIHRoZSBwcm92aWRlZCBsb2FkLnNoIHNjcmlwdDsKKyAgIGxvYWQuc2ggd2lsbCBsb2FkIHRoZSBtb2R1bGVzLCBsb2FkLnNoIHUgd2lsbCB1bmxvYWQgdGhlbS4KKworICAgVG8gaW5zdGFsbCBpbiB0aGUgZGVmYXVsdCBrZXJuZWwgZGlyZWN0b3JpZXMgKGFuZCBlbmFibGUgYXV0byBsb2FkaW5nCisgICB3aGVuIHRoZSBkZXZpY2UgaXMgcGx1Z2dlZCk6CisKKyQgbWFrZSBpbnN0YWxsCiskIGRlcG1vZCAtYQorCisgICBJZiB5b3VyIGtlcm5lbCBkZXZlbG9wbWVudCBmaWxlcyBhcmUgbG9jYXRlZCBpbiBhIG5vbiBzdGFuZGFyZAorICAgZGlyZWN0b3J5IG9yIGlmIHlvdSB3YW50IHRvIGJ1aWxkIGZvciBhIGtlcm5lbCB0aGF0IGlzIG5vdCB0aGUKKyAgIGN1cnJlbnRseSBydW5uaW5nIG9uZSwgc2V0IEtESVIgdG8gdGhlIHJpZ2h0IGxvY2F0aW9uOgorCiskIG1ha2UgS0RJUj0vcGF0aC90by9rZXJuZWwvZGV2L3RyZWUKKworICAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBjb250YWN0IGxpbnV4LXdpbWF4QGludGVsLmNvbS4KKworMy4gSW5zdGFsbGluZyB0aGUgZmlybXdhcmUKKworICAgVGhlIGZpcm13YXJlIGNhbiBiZSBvYnRhaW5lZCBmcm9tIGh0dHA6Ly9saW51eHdpbWF4Lm9yZyBvciBtaWdodCBoYXZlCisgICBiZWVuIHN1cHBsaWVkIHdpdGggeW91ciBoYXJkd2FyZS4KKworICAgSXQgaGFzIHRvIGJlIGluc3RhbGxlZCBpbiB0aGUgdGFyZ2V0IHN5c3RlbToKKyAgICAgKgorJCBjcCBGSVJNV0FSRUZJTEUuc2JjZiAvbGliL2Zpcm13YXJlL2kyNDAwbS1mdy1CVVNUWVBFLTEuMy5zYmNmCisKKyAgICAgKiBOT1RFOiBpZiB5b3VyIGZpcm13YXJlIGNhbWUgaW4gYW4gLnJwbSBvciAuZGViIGZpbGUsIGp1c3QgaW5zdGFsbAorICAgICAgIGl0IGFzIG5vcm1hbCwgd2l0aCB0aGUgcnBtIChycG0gLWkgRklSTVdBUkUucnBtKSBvciBkcGtnCisgICAgICAgKGRwa2cgLWkgRklSTVdBUkUuZGViKSBjb21tYW5kcy4gTm8gZnVydGhlciBhY3Rpb24gaXMgbmVlZGVkLgorICAgICAqIEJVU1RZUEUgd2lsbCBiZSB1c2Igb3Igc2RpbywgZGVwZW5kaW5nIG9uIHRoZSBoYXJkd2FyZSB5b3UgaGF2ZS4KKyAgICAgICBFYWNoIGhhcmR3YXJlIHR5cGUgY29tZXMgd2l0aCBpdHMgb3duIGZpcm13YXJlIGFuZCB3aWxsIG5vdCB3b3JrCisgICAgICAgd2l0aCBvdGhlciB0eXBlcy4KKworNC4gRGVzaWduCisKKyAgIFRoaXMgcGFja2FnZSBjb250YWlucyB0d28gbWFqb3IgcGFydHM6IGEgV2lNQVgga2VybmVsIHN0YWNrIGFuZCBhCisgICBkcml2ZXIgZm9yIHRoZSBJbnRlbCBpMjQwMG0uCisKKyAgIFRoZSBXaU1BWCBzdGFjayBpcyBkZXNpZ25lZCB0byBwcm92aWRlIGZvciBjb21tb24gV2lNQVggY29udHJvbAorICAgc2VydmljZXMgdG8gY3VycmVudCBhbmQgZnV0dXJlIFdpTUFYIGRldmljZXMgZnJvbSBhbnkgdmVuZG9yOyBwbGVhc2UKKyAgIHNlZSBSRUFETUUud2ltYXggZm9yIGRldGFpbHMuCisKKyAgIFRoZSBpMjQwMG0ga2VybmVsIGRyaXZlciBpcyBicm9rZW4gdXAgaW4gdHdvIG1haW4gcGFydHM6IHRoZSBidXMKKyAgIGdlbmVyaWMgZHJpdmVyIGFuZCB0aGUgYnVzLXNwZWNpZmljIGRyaXZlcnMuIFRoZSBidXMgZ2VuZXJpYyBkcml2ZXIKKyAgIGZvcm1zIHRoZSBkcml2ZXJjb3JlIGFuZCBjb250YWluIG5vIGtub3dsZWRnZSBvZiB0aGUgYWN0dWFsIG1ldGhvZCB3ZQorICAgdXNlIHRvIGNvbm5lY3QgdG8gdGhlIGRldmljZS4gVGhlIGJ1cyBzcGVjaWZpYyBkcml2ZXJzIGFyZSBqdXN0IHRoZQorICAgZ2x1ZSB0byBjb25uZWN0IHRoZSBidXMtZ2VuZXJpYyBkcml2ZXIgYW5kIHRoZSBkZXZpY2UuIEN1cnJlbnRseSBvbmx5CisgICBVU0IgYW5kIFNESU8gYXJlIHN1cHBvcnRlZC4gU2VlIGRyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9pMjQwMG0uaCBmb3IKKyAgIG1vcmUgaW5mb3JtYXRpb24uCisKKyAgIFRoZSBidXMgZ2VuZXJpYyBkcml2ZXIgaXMgbG9naWNhbGx5IGJyb2tlbiB1cCBpbiB0d28gcGFydHM6IE9TLWdsdWUgYW5kCisgICBoYXJkd2FyZS1nbHVlLiBUaGUgT1MtZ2x1ZSBpbnRlcmZhY2VzIHdpdGggTGludXguIFRoZSBoYXJkd2FyZS1nbHVlCisgICBpbnRlcmZhY2VzIHdpdGggdGhlIGRldmljZSBvbiB1c2luZyBhbiBpbnRlcmZhY2UgcHJvdmlkZWQgYnkgdGhlCisgICBidXMtc3BlY2lmaWMgZHJpdmVyLiBUaGUgcmVhc29uIGZvciB0aGlzIGJyZWFrdXAgaXMgdG8gYmUgYWJsZSB0bworICAgZWFzaWx5IHJldXNlIHRoZSBoYXJkd2FyZS1nbHVlIHRvIHdyaXRlIGRyaXZlcnMgZm9yIG90aGVyIE9TZXM7IG5vdGUKKyAgIHRoZSBoYXJkd2FyZSBnbHVlIHBhcnQgaXMgd3JpdHRlbiBhcyBhIG5hdGl2ZSBMaW51eCBkcml2ZXI7IG5vCisgICBhYnN0cmFjdGlvbiBsYXllcnMgYXJlIHVzZWQsIHNvIHRvIHBvcnQgdG8gYW5vdGhlciBPUywgdGhlIExpbnV4IGtlcm5lbAorICAgQVBJIGNhbGxzIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIHRoZSB0YXJnZXQgT1Mncy4KKworNS4gVXNhZ2UKKworICAgVG8gbG9hZCB0aGUgZHJpdmVyLCBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyBpbiB0aGUgaW5zdGFsbCBzZWN0aW9uOworICAgb25jZSB0aGUgZHJpdmVyIGlzIGxvYWRlZCwgcGx1ZyBpbiB0aGUgZGV2aWNlICh1bmxlc3MgaXQgaXMgcGVybWFuZW50bHkKKyAgIHBsdWdnZWQgaW4pLiBUaGUgZHJpdmVyIHdpbGwgZW51bWVyYXRlIHRoZSBkZXZpY2UsIHVwbG9hZCB0aGUgZmlybXdhcmUKKyAgIGFuZCBvdXRwdXQgbWVzc2FnZXMgaW4gdGhlIGtlcm5lbCBsb2cgKGRtZXNnLCAvdmFyL2xvZy9tZXNzYWdlcyBvcgorICAgL3Zhci9sb2cva2Vybi5sb2cpIHN1Y2ggYXM6CisKKy4uLgoraTI0MDBtX3VzYiA1LTQ6MS4wOiBmaXJtd2FyZSBpbnRlcmZhY2UgdmVyc2lvbiA4LjAuMAoraTI0MDBtX3VzYiA1LTQ6MS4wOiBXaU1BWCBpbnRlcmZhY2Ugd214MCAoMDA6MWQ6ZTE6MDE6OTQ6MmMpIHJlYWR5CisKKyAgIEF0IHRoaXMgcG9pbnQgdGhlIGRldmljZSBpcyByZWFkeSB0byB3b3JrLgorCisgICBDdXJyZW50IHZlcnNpb25zIHJlcXVpcmUgdGhlIEludGVsIFdpTUFYIE5ldHdvcmsgU2VydmljZSBpbiB1c2Vyc3BhY2UKKyAgIHRvIG1ha2UgdGhpbmdzIHdvcmsuIFNlZSB0aGUgbmV0d29yayBzZXJ2aWNlJ3MgUkVBRE1FIGZvciBpbnN0cnVjdGlvbnMKKyAgIG9uIGhvdyB0byBzY2FuLCBjb25uZWN0IGFuZCBkaXNjb25uZWN0LgorCis1LjEuIE1vZHVsZSBwYXJhbWV0ZXJzCisKKyAgIE1vZHVsZSBwYXJhbWV0ZXJzIGNhbiBiZSBzZXQgYXQga2VybmVsIG9yIG1vZHVsZSBsb2FkIHRpbWUgb3IgYnkKKyAgIGVjaG9pbmcgdmFsdWVzOgorCiskIGVjaG8gVkFMVUUgPiAvc3lzL21vZHVsZS9NT0RVTEVOQU1FL3BhcmFtZXRlcnMvUEFSQU1FVEVSTkFNRQorCisgICBUbyBtYWtlIGNoYW5nZXMgcGVybWFuZW50LCBmb3IgZXhhbXBsZSwgZm9yIHRoZSBpMjQwMG0gbW9kdWxlLCB5b3UgY2FuCisgICBhbHNvIGNyZWF0ZSBhIGZpbGUgbmFtZWQgL2V0Yy9tb2Rwcm9iZS5kL2kyNDAwbSBjb250YWluaW5nOgorCitvcHRpb25zIGkyNDAwbSBpZGxlX21vZGVfZGlzYWJsZWQ9MQorCisgICBUbyBmaW5kIHdoaWNoIHBhcmFtZXRlcnMgYXJlIHN1cHBvcnRlZCBieSBhIG1vZHVsZSwgcnVuOgorCiskIG1vZGluZm8gcGF0aC90by9tb2R1bGUua28KKworICAgRHVyaW5nIGtlcm5lbCBib290dXAgKGlmIHRoZSBkcml2ZXIgaXMgbGlua2VkIGluIHRoZSBrZXJuZWwpLCBzcGVjaWZ5CisgICB0aGUgZm9sbG93aW5nIHRvIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lOgorCitpMjQwMG0uUEFSQU1FVEVSPVZBTFVFCisKKzUuMS4xLiBpMjQwMG06IGlkbGVfbW9kZV9kaXNhYmxlZAorCisgICBUaGUgaTI0MDBtIG1vZHVsZSBzdXBwb3J0cyBhIHBhcmFtZXRlciB0byBkaXNhYmxlIGlkbGUgbW9kZS4gVGhpcworICAgcGFyYW1ldGVyLCBvbmNlIHNldCwgd2lsbCB0YWtlIGVmZmVjdCBvbmx5IHdoZW4gdGhlIGRldmljZSBpcworICAgcmVpbml0aWFsaXplZCBieSB0aGUgZHJpdmVyIChlZzogZm9sbG93aW5nIGEgcmVzZXQgb3IgYSByZWNvbm5lY3QpLgorCis1LjIuIERlYnVnIG9wZXJhdGlvbnM6IGRlYnVnZnMgZW50cmllcworCisgICBUaGUgZHJpdmVyIHdpbGwgcmVnaXN0ZXIgZGVidWdmcyBlbnRyaWVzIHRoYXQgYWxsb3cgdGhlIHVzZXIgdG8gdHdlYWsKKyAgIGRlYnVnIHNldHRpbmdzLiBUaGVyZSBhcmUgdGhyZWUgbWFpbiBjb250YWluZXIgZGlyZWN0b3JpZXMgd2hlcmUKKyAgIGVudHJpZXMgYXJlIHBsYWNlZCwgd2hpY2ggY29ycmVzcG9uZCB0byB0aGUgdGhyZWUgYmxvY2tzIGEgaTI0MDBtIFdpTUFYCisgICBkcml2ZXIgaGFzOgorICAgICAqIC9zeXMva2VybmVsL2RlYnVnL3dpbWF4OkRFVk5BTUUvIGZvciB0aGUgZ2VuZXJpYyBXaU1BWCBzdGFjaworICAgICAgIGNvbnRyb2xzCisgICAgICogL3N5cy9rZXJuZWwvZGVidWcvd2ltYXg6REVWTkFNRS9pMjQwMG0gZm9yIHRoZSBpMjQwMG0gZ2VuZXJpYworICAgICAgIGRyaXZlciBjb250cm9scworICAgICAqIC9zeXMva2VybmVsL2RlYnVnL3dpbWF4OkRFVk5BTUUvaTI0MDBtLXVzYiAob3IgLXNkaW8pIGZvciB0aGUKKyAgICAgICBidXMtc3BlY2lmaWMgaTI0MDBtLXVzYiBvciBpMjQwMG0tc2RpbyBjb250cm9scykuCisKKyAgIE9mIGNvdXJzZSwgaWYgZGVidWdmcyBpcyBtb3VudGVkIGluIGEgZGlyZWN0b3J5IG90aGVyIHRoYW4KKyAgIC9zeXMva2VybmVsL2RlYnVnLCB0aG9zZSBwYXRocyB3aWxsIGNoYW5nZS4KKworNS4yLjEuIEluY3JlYXNpbmcgZGVidWcgb3V0cHV0CisKKyAgIFRoZSBmaWxlcyBuYW1lZCAqZGxfKiBpbmRpY2F0ZSBrbm9icyBmb3IgY29udHJvbGxpbmcgdGhlIGRlYnVnIG91dHB1dAorICAgb2YgZGlmZmVyZW50IHN1Ym1vZHVsZXM6CisgICAgICoKKyMgZmluZCAvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heFw6d214MCAtbmFtZSBcKmRsX1wqCisvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heDp3bXgwL2kyNDAwbS11c2IvZGxfdHgKKy9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvaTI0MDBtLXVzYi9kbF9yeAorL3N5cy9rZXJuZWwvZGVidWcvd2ltYXg6d214MC9pMjQwMG0tdXNiL2RsX25vdGlmCisvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heDp3bXgwL2kyNDAwbS11c2IvZGxfZncKKy9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvaTI0MDBtLXVzYi9kbF91c2IKKy9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvaTI0MDBtL2RsX3R4Cisvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heDp3bXgwL2kyNDAwbS9kbF9yeAorL3N5cy9rZXJuZWwvZGVidWcvd2ltYXg6d214MC9pMjQwMG0vZGxfcmZraWxsCisvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heDp3bXgwL2kyNDAwbS9kbF9uZXRkZXYKKy9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvaTI0MDBtL2RsX2Z3Cisvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heDp3bXgwL2kyNDAwbS9kbF9kZWJ1Z2ZzCisvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heDp3bXgwL2kyNDAwbS9kbF9kcml2ZXIKKy9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvaTI0MDBtL2RsX2NvbnRyb2wKKy9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvd2ltYXhfZGxfc3RhY2sKKy9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvd2ltYXhfZGxfb3BfcmZraWxsCisvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heDp3bXgwL3dpbWF4X2RsX29wX3Jlc2V0Cisvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heDp3bXgwL3dpbWF4X2RsX29wX21zZworL3N5cy9rZXJuZWwvZGVidWcvd2ltYXg6d214MC93aW1heF9kbF9pZF90YWJsZQorL3N5cy9rZXJuZWwvZGVidWcvd2ltYXg6d214MC93aW1heF9kbF9kZWJ1Z2ZzCisKKyAgIEJ5IHJlYWRpbmcgdGhlIGZpbGUgeW91IGNhbiBvYnRhaW4gdGhlIGN1cnJlbnQgdmFsdWUgb2Ygc2FpZCBkZWJ1ZworICAgbGV2ZWw7IGJ5IHdyaXRpbmcgdG8gaXQsIHlvdSBjYW4gc2V0IGl0LgorCisgICBUbyBpbmNyZWFzZSB0aGUgZGVidWcgbGV2ZWwgb2YsIGZvciBleGFtcGxlLCB0aGUgaTI0MDBtJ3MgZ2VuZXJpYyBUWAorICAgZW5naW5lLCBqdXN0IHdyaXRlOgorCiskIGVjaG8gMyA+IC9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvaTI0MDBtL2RsX3R4CisKKyAgIEluY3JlYXNpbmcgbnVtYmVycyB5aWVsZCBpbmNyZWFzaW5nIGRlYnVnIGluZm9ybWF0aW9uOyBmb3IgZGV0YWlscyBvZgorICAgd2hhdCBpcyBwcmludGVkIGFuZCB0aGUgYXZhaWxhYmxlIGxldmVscywgY2hlY2sgdGhlIHNvdXJjZS4gVGhlIGNvZGUKKyAgIHVzZXMgMCBmb3IgZGlzYWJsZWQgYW5kIGluY3JlYXNpbmcgdmFsdWVzIHVudGlsIDguCisKKzUuMi4yLiBSWCBhbmQgVFggc3RhdGlzdGljcworCisgICBUaGUgaTI0MDBtL3J4X3N0YXRzIGFuZCBpMjQwMG0vdHhfc3RhdHMgcHJvdmlkZSBzdGF0aXN0aWNzIGFib3V0IHRoZQorICAgZGF0YSByZWNlcHRpb24vZGVsaXZlcnkgZnJvbSB0aGUgZGV2aWNlOgorCiskIGNhdCAvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heDp3bXgwL2kyNDAwbS9yeF9zdGF0cworNDUgMSAzIDM0IDMxMDQgNDggNDgwCisKKyAgIFRoZSBudW1iZXJzIHJlcG9ydGVkIGFyZQorICAgICAqIHBhY2tldHMvUlgtYnVmZmVyOiB0b3RhbCwgbWluLCBtYXgKKyAgICAgKiBSWC1idWZmZXJzOiB0b3RhbCBSWCBidWZmZXJzIHJlY2VpdmVkLCBhY2N1bXVsYXRlZCBSWCBidWZmZXIgc2l6ZQorICAgICAgIGluIGJ5dGVzLCBtaW4gc2l6ZSByZWNlaXZlZCwgbWF4IHNpemUgcmVjZWl2ZWQKKworICAgVGh1cywgdG8gZmluZCB0aGUgYXZlcmFnZSBidWZmZXIgc2l6ZSByZWNlaXZlZCwgZGl2aWRlIGFjY3VtdWxhdGVkCisgICBSWC1idWZmZXIgLyB0b3RhbCBSWC1idWZmZXJzLgorCisgICBUbyBjbGVhciB0aGUgc3RhdGlzdGljcyBiYWNrIHRvIDAsIHdyaXRlIGFueXRoaW5nIHRvIHRoZSByeF9zdGF0cyBmaWxlOgorCiskIGVjaG8gMSA+IC9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvaTI0MDBtX3J4X3N0YXRzCisKKyAgIExpa2V3aXNlIGZvciBUWC4KKworICAgTm90ZSB0aGUgcGFja2V0cyB0aGlzIGRlYnVnIGZpbGUgcmVmZXJzIHRvIGFyZSBub3QgbmV0d29yayBwYWNrZXQsIGJ1dAorICAgcGFja2V0cyBpbiB0aGUgc2Vuc2Ugb2YgdGhlIGRldmljZS1zcGVjaWZpYyBwcm90b2NvbCBmb3IgY29tbXVuaWNhdGlvbgorICAgdG8gdGhlIGhvc3QuIFNlZSBkcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdHguYy4KKworNS4yLjMuIFRyYWNpbmcgbWVzc2FnZXMgcmVjZWl2ZWQgZnJvbSB1c2VyIHNwYWNlCisKKyAgIFRvIGVjaG8gbWVzc2FnZXMgcmVjZWl2ZWQgZnJvbSB1c2VyIHNwYWNlIGludG8gdGhlIHRyYWNlIHBpcGUgdGhhdCB0aGUKKyAgIGkyNDAwbSBkcml2ZXIgY3JlYXRlcywgc2V0IHRoZSBkZWJ1ZyBmaWxlIGkyNDAwbS90cmFjZV9tc2dfZnJvbV91c2VyIHRvCisgICAxOgorICAgICAqCiskIGVjaG8gMSA+IC9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvaTI0MDBtL3RyYWNlX21zZ19mcm9tX3VzZXIKKworNS4yLjQuIFBlcmZvcm1pbmcgYSBkZXZpY2UgcmVzZXQKKworICAgQnkgd3JpdGluZyBhIDAsIGEgMSBvciBhIDIgdG8gdGhlIGZpbGUKKyAgIC9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvcmVzZXQsIHRoZSBkcml2ZXIgcGVyZm9ybXMgYSB3YXJtICh3aXRob3V0CisgICBkaXNjb25uZWN0aW5nIGZyb20gdGhlIGJ1cyksIGNvbGQgKGRpc2Nvbm5lY3RpbmcgZnJvbSB0aGUgYnVzKSBvciBidXMKKyAgIChidXMgc3BlY2lmaWMpIHJlc2V0IG9uIHRoZSBkZXZpY2UuCisKKzUuMi41LiBBc2tpbmcgdGhlIGRldmljZSB0byBlbnRlciBwb3dlciBzYXZpbmcgbW9kZQorCisgICBCeSB3cml0aW5nIGFueSB2YWx1ZSB0byB0aGUgL3N5cy9rZXJuZWwvZGVidWcvd2ltYXg6d214MCBmaWxlLCB0aGUKKyAgIGRldmljZSB3aWxsIGF0dGVtcHQgdG8gZW50ZXIgcG93ZXIgc2F2aW5nIG1vZGUuCisKKzYuIFRyb3VibGVzaG9vdGluZworCis2LjEuIERyaXZlciBjb21wbGFpbnMgYWJvdXQgJ2kyNDAwbS1mdy11c2ItMS4yLnNiY2Y6IHJlcXVlc3QgZmFpbGVkJworCisgICBJZiB1cG9uIGNvbm5lY3RpbmcgdGhlIGRldmljZSwgdGhlIGZvbGxvd2luZyBpcyBvdXRwdXQgaW4gdGhlIGtlcm5lbAorICAgbG9nOgorCitpMjQwMG1fdXNiIDUtNDoxLjA6IGZ3IGkyNDAwbS1mdy11c2ItMS4zLnNiY2Y6IHJlcXVlc3QgZmFpbGVkOiAtMgorCisgICBUaGlzIG1lYW5zIHRoYXQgdGhlIGRyaXZlciBjYW5ub3QgbG9jYXRlIHRoZSBmaXJtd2FyZSBmaWxlIG5hbWVkCisgICAvbGliL2Zpcm13YXJlL2kyNDAwbS1mdy11c2ItMS4yLnNiY2YuIENoZWNrIHRoYXQgdGhlIGZpbGUgaXMgcHJlc2VudCBpbgorICAgdGhlIHJpZ2h0IGxvY2F0aW9uLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi93aW1heC9SRUFETUUud2ltYXggYi9Eb2N1bWVudGF0aW9uL3dpbWF4L1JFQURNRS53aW1heApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzhjNDM3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi93aW1heC9SRUFETUUud2ltYXgKQEAgLTAsMCArMSw4MSBAQAorCisgICBMaW51eCBrZXJuZWwgV2lNQVggc3RhY2sKKworICAgKEMpIDIwMDggSW50ZWwgQ29ycG9yYXRpb24gPCBsaW51eC13aW1heEBpbnRlbC5jb20gPgorCisgICBUaGlzIHByb3ZpZGVzIGEgYmFzaWMgTGludXgga2VybmVsIFdpTUFYIHN0YWNrIHRvIHByb3ZpZGUgYSBjb21tb24KKyAgIGNvbnRyb2wgQVBJIGZvciBXaU1BWCBkZXZpY2VzLCB1c2FibGUgZnJvbSBrZXJuZWwgYW5kIHVzZXIgc3BhY2UuCisKKzEuIERlc2lnbgorCisgICBUaGUgV2lNQVggc3RhY2sgaXMgZGVzaWduZWQgdG8gcHJvdmlkZSBmb3IgY29tbW9uIFdpTUFYIGNvbnRyb2wKKyAgIHNlcnZpY2VzIHRvIGN1cnJlbnQgYW5kIGZ1dHVyZSBXaU1BWCBkZXZpY2VzIGZyb20gYW55IHZlbmRvci4KKworICAgQmVjYXVzZSBjdXJyZW50bHkgdGhlcmUgaXMgb25seSBvbmUgYW5kIHdlIGRvbid0IGtub3cgd2hhdCB3b3VsZCBiZSB0aGUKKyAgIGNvbW1vbiBzZXJ2aWNlcywgdGhlIEFQSXMgaXQgY3VycmVudGx5IHByb3ZpZGVzIGFyZSB2ZXJ5IG1pbmltYWwuCisgICBIb3dldmVyLCBpdCBpcyBkb25lIGluIHN1Y2ggYSB3YXkgdGhhdCBpdCBpcyBlYXNpbHkgZXh0ZW5zaWJsZSB0bworICAgYWNjb21tb2RhdGUgZnV0dXJlIHJlcXVpcmVtZW50cy4KKworICAgVGhlIHN0YWNrIHdvcmtzIGJ5IGVtYmVkZGluZyBhIHN0cnVjdCB3aW1heF9kZXYgaW4geW91ciBkZXZpY2UncworICAgY29udHJvbCBzdHJ1Y3R1cmVzLiBUaGlzIHByb3ZpZGVzIGEgc2V0IG9mIGNhbGxiYWNrcyB0aGF0IHRoZSBXaU1BWAorICAgc3RhY2sgd2lsbCBjYWxsIGluIG9yZGVyIHRvIGltcGxlbWVudCBjb250cm9sIG9wZXJhdGlvbnMgcmVxdWVzdGVkIGJ5CisgICB0aGUgdXNlci4gQXMgd2VsbCwgdGhlIHN0YWNrIHByb3ZpZGVzIEFQSSBmdW5jdGlvbnMgdGhhdCB0aGUgZHJpdmVyCisgICBjYWxscyB0byBub3RpZnkgYWJvdXQgY2hhbmdlcyBvZiBzdGF0ZSBpbiB0aGUgZGV2aWNlLgorCisgICBUaGUgc3RhY2sgZXhwb3J0cyB0aGUgQVBJIGNhbGxzIG5lZWRlZCB0byBjb250cm9sIHRoZSBkZXZpY2UgdG8gdXNlcgorICAgc3BhY2UgdXNpbmcgZ2VuZXJpYyBuZXRsaW5rIGFzIGEgbWFyc2hhbGxpbmcgbWVjaGFuaXNtLiBZb3UgY2FuIGFjY2VzcworICAgdGhlbSB1c2luZyB5b3VyIG93biBjb2RlIG9yIHVzZSB0aGUgd3JhcHBlcnMgcHJvdmlkZWQgZm9yIHlvdXIKKyAgIGNvbnZlbmllbmNlIGluIGxpYndpbWF4IChpbiB0aGUgd2ltYXgtdG9vbHMgcGFja2FnZSkuCisKKyAgIEZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB0aGUgc3RhY2ssIHBsZWFzZSBzZWUKKyAgIGluY2x1ZGUvbGludXgvd2ltYXguaC4KKworMi4gVXNhZ2UKKworICAgRm9yIHVzYWdlIGluIGEgZHJpdmVyIChyZWdpc3RyYXRpb24sIEFQSSwgZXRjKSBwbGVhc2UgcmVmZXIgdG8gdGhlCisgICBpbnN0cnVjdGlvbnMgaW4gdGhlIGhlYWRlciBmaWxlIGluY2x1ZGUvbGludXgvd2ltYXguaC4KKworICAgV2hlbiBhIGRldmljZSBpcyByZWdpc3RlcmVkIHdpdGggdGhlIFdpTUFYIHN0YWNrLCBhIHNldCBvZiBkZWJ1Z2ZzCisgICBmaWxlcyB3aWxsIGFwcGVhciBpbiAvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heDp3bXhYIGNhbiB0d2VhayBmb3IKKyAgIGNvbnRyb2wuCisKKzIuMS4gT2J0YWluaW5nIGRlYnVnIGluZm9ybWF0aW9uOiBkZWJ1Z2ZzIGVudHJpZXMKKworICAgVGhlIFdpTUFYIHN0YWNrIGlzIGNvbXBpbGVkLCBieSBkZWZhdWx0LCB3aXRoIGRlYnVnIG1lc3NhZ2VzIHRoYXQgY2FuCisgICBiZSB1c2VkIHRvIGRpYWdub3NlIGlzc3Vlcy4gQnkgZGVmYXVsdCwgc2FpZCBtZXNzYWdlcyBhcmUgZGlzYWJsZWQuCisKKyAgIFRoZSBkcml2ZXJzIHdpbGwgcmVnaXN0ZXIgZGVidWdmcyBlbnRyaWVzIHRoYXQgYWxsb3cgdGhlIHVzZXIgdG8gdHdlYWsKKyAgIGRlYnVnIHNldHRpbmdzLgorCisgICBFYWNoIGRyaXZlciwgd2hlbiByZWdpc3RlcmluZyB3aXRoIHRoZSBzdGFjaywgd2lsbCBjYXVzZSBhIGRlYnVnZnMKKyAgIGRpcmVjdG9yeSBuYW1lZCB3aW1heDpERVZJQ0VOQU1FIHRvIGJlIGNyZWF0ZWQ7IG9wdGlvbmFsbHksIGl0IG1pZ2h0CisgICBjcmVhdGUgbW9yZSBzdWJlbnRyaWVzIGJlbG93IGl0LgorCisyLjEuMS4gSW5jcmVhc2luZyBkZWJ1ZyBvdXRwdXQKKworICAgVGhlIGZpbGVzIG5hbWVkICpkbF8qIGluZGljYXRlIGtub2JzIGZvciBjb250cm9sbGluZyB0aGUgZGVidWcgb3V0cHV0CisgICBvZiBkaWZmZXJlbnQgc3VibW9kdWxlcyBvZiB0aGUgV2lNQVggc3RhY2s6CisgICAgICoKKyMgZmluZCAvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heFw6d214MCAtbmFtZSBcKmRsX1wqCisvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heDp3bXgwL3dpbWF4X2RsX3N0YWNrCisvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heDp3bXgwL3dpbWF4X2RsX29wX3Jma2lsbAorL3N5cy9rZXJuZWwvZGVidWcvd2ltYXg6d214MC93aW1heF9kbF9vcF9yZXNldAorL3N5cy9rZXJuZWwvZGVidWcvd2ltYXg6d214MC93aW1heF9kbF9vcF9tc2cKKy9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvd2ltYXhfZGxfaWRfdGFibGUKKy9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvd2ltYXhfZGxfZGVidWdmcworL3N5cy9rZXJuZWwvZGVidWcvd2ltYXg6d214MC8uLi4uICMgb3RoZXIgZHJpdmVyIHNwZWNpZmljIGZpbGVzCisKKyAgICAgICBOT1RFOiBPZiBjb3Vyc2UsIGlmIGRlYnVnZnMgaXMgbW91bnRlZCBpbiBhIGRpcmVjdG9yeSBvdGhlciB0aGFuCisgICAgICAgL3N5cy9rZXJuZWwvZGVidWcsIHRob3NlIHBhdGhzIHdpbGwgY2hhbmdlLgorCisgICBCeSByZWFkaW5nIHRoZSBmaWxlIHlvdSBjYW4gb2J0YWluIHRoZSBjdXJyZW50IHZhbHVlIG9mIHNhaWQgZGVidWcKKyAgIGxldmVsOyBieSB3cml0aW5nIHRvIGl0LCB5b3UgY2FuIHNldCBpdC4KKworICAgVG8gaW5jcmVhc2UgdGhlIGRlYnVnIGxldmVsIG9mLCBmb3IgZXhhbXBsZSwgdGhlIGlkLXRhYmxlIHN1Ym1vZHVsZSwKKyAgIGp1c3Qgd3JpdGU6CisKKyQgZWNobyAzID4gL3N5cy9rZXJuZWwvZGVidWcvd2ltYXg6d214MC93aW1heF9kbF9pZF90YWJsZQorCisgICBJbmNyZWFzaW5nIG51bWJlcnMgeWllbGQgaW5jcmVhc2luZyBkZWJ1ZyBpbmZvcm1hdGlvbjsgZm9yIGRldGFpbHMgb2YKKyAgIHdoYXQgaXMgcHJpbnRlZCBhbmQgdGhlIGF2YWlsYWJsZSBsZXZlbHMsIGNoZWNrIHRoZSBzb3VyY2UuIFRoZSBjb2RlCisgICB1c2VzIDAgZm9yIGRpc2FibGVkIGFuZCBpbmNyZWFzaW5nIHZhbHVlcyB1bnRpbCA4LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi94ODYvemVyby1wYWdlLnR4dCBiL0RvY3VtZW50YXRpb24veDg2L3plcm8tcGFnZS50eHQKaW5kZXggMTY5YWQ0Mi4uNGY5MTM4NSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi94ODYvemVyby1wYWdlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3g4Ni96ZXJvLXBhZ2UudHh0CkBAIC0zLDcgKzMsNyBAQAogcmVhbC1tb2RlIHNldHVwIGNvZGUgb2YgdGhlIGtlcm5lbC4gUmVmZXJlbmNlcy9zZXR0aW5ncyB0byBpdCBtYWlubHkKIGFyZSBpbjoKIAotICBpbmNsdWRlL2FzbS14ODYvYm9vdHBhcmFtLmgKKyAgYXJjaC94ODYvaW5jbHVkZS9hc20vYm9vdHBhcmFtLmgKIAogCiBPZmZzZXQJUHJvdG8JTmFtZQkJTWVhbmluZwpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwppbmRleCBiZWZhY2YwLi41N2UwMzA5IDEwMDY0NAotLS0gYS9NQUlOVEFJTkVSUworKysgYi9NQUlOVEFJTkVSUwpAQCAtNjE2LDcgKzYxNiw3IEBACiBTOglNYWludGFpbmVkCiAKIEFSTS9UT1NBIE1BQ0hJTkUgU1VQUE9SVAotUDoJRG1pdHJ5IEJhcnlzaGtvdgorUDoJRG1pdHJ5IEVyZW1pbi1Tb2xlbmlrb3YKIE06CWRiYXJ5c2hrb3ZAZ21haWwuY29tCiBQOglEaXJrIE9wZmVyCiBNOglkaXJrQG9wZmVyLW9ubGluZS5kZQpAQCAtMTAyNCwxNiArMTAyNCwxNyBAQAogQlRUViBWSURFTzRMSU5VWCBEUklWRVIKIFA6CU1hdXJvIENhcnZhbGhvIENoZWhhYgogTToJbWNoZWhhYkBpbmZyYWRlYWQub3JnCi1NOgl2NGwtZHZiLW1haW50YWluZXJAbGludXh0di5vcmcKK0w6CWxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZwogTDoJdmlkZW80bGludXgtbGlzdEByZWRoYXQuY29tCiBXOglodHRwOi8vbGludXh0di5vcmcKLVQ6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvbWNoZWhhYi92NGwtZHZiLmdpdAorVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9tY2hlaGFiL2xpbnV4LTIuNi5naXQKIFM6CU1haW50YWluZWQKIAogQ0FGRSBDTU9TIElOVEVHUkFURUQgQ0FNRVJBIENPTlRST0xMRVIgRFJJVkVSCiBQOglKb25hdGhhbiBDb3JiZXQKIE06CWNvcmJldEBsd24ubmV0Ci1MOgl2aWRlbzRsaW51eC1saXN0QHJlZGhhdC5jb20KK0w6CWxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZworVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9tY2hlaGFiL2xpbnV4LTIuNi5naXQKIFM6CU1haW50YWluZWQKIAogQ0FMR0FSWSB4ODYtNjQgSU9NTVUKQEAgLTEwOTIsMTEgKzEwOTMsOCBAQAogCiBDSEVDS1BBVENICiBQOglBbmR5IFdoaXRjcm9mdAotTToJYXB3QHNoYWRvd2VuLm9yZwotUDoJUmFuZHkgRHVubGFwCi1NOglyZHVubGFwQHhlbm90aW1lLm5ldAotUDoJSm9lbCBTY2hvcHAKLU06CWpzY2hvcHBAYXVzdGluLmlibS5jb20KK006CWFwd0BjYW5vbmljYWwuY29tCitMOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCiBTOglTdXBwb3J0ZWQKIAogQ0lTQ08gMTBHIEVUSEVSTkVUIERSSVZFUgpAQCAtMTI2NCw3ICsxMjYyLDggQEAKIE06CWh2ZXJrdWlsQHhzNGFsbC5ubCwgYXdhbGxzQHJhZGl4Lm5ldAogTDoJaXZ0di1kZXZlbEBpdnR2ZHJpdmVyLm9yZwogTDoJaXZ0di11c2Vyc0BpdnR2ZHJpdmVyLm9yZwotTDoJdmlkZW80bGludXgtbGlzdEByZWRoYXQuY29tCitMOglsaW51eC1tZWRpYUB2Z2VyLmtlcm5lbC5vcmcKK1Q6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvbWNoZWhhYi9saW51eC0yLjYuZ2l0CiBXOglodHRwOi8vbGludXh0di5vcmcKIFM6CU1haW50YWluZWQKIApAQCAtMTM2MSw2ICsxMzYwLDExIEBACiBNOgltYWNyb0BsaW51eC1taXBzLm9yZwogUzoJTWFpbnRhaW5lZAogCitERUxMIExBUFRPUCBEUklWRVIKK1A6CU1hdHRoZXcgR2FycmV0dAorTToJbWpnNTlAc3JjZi51Y2FtLm9yZworUzoJTWFpbnRhaW5lZAorCiBERUxMIExBUFRPUCBTTU0gRFJJVkVSCiBQOglNYXNzaW1vIERhbCBab3R0bwogTToJZHpAZGViaWFuLm9yZwpAQCAtMTQ5MCwxMCArMTQ5NCwxMCBAQAogCiBEVkIgU1VCU1lTVEVNIEFORCBEUklWRVJTCiBQOglMaW51eFRWLm9yZyBQcm9qZWN0Ci1NOgl2NGwtZHZiLW1haW50YWluZXJAbGludXh0di5vcmcKK006CWxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZwogTDoJbGludXgtZHZiQGxpbnV4dHYub3JnIChzdWJzY3JpcHRpb24gcmVxdWlyZWQpCiBXOglodHRwOi8vbGludXh0di5vcmcvCi1UOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L21jaGVoYWIvdjRsLWR2Yi5naXQKK1Q6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvbWNoZWhhYi9saW51eC0yLjYuZ2l0CiBTOglNYWludGFpbmVkCiAKIERaIERFQ1NUQVRJT04gRFoxMSBTRVJJQUwgRFJJVkVSCkBAIC0xODg1LDMyICsxODg5LDM3IEBACiBHU1BDQSBGSU5FUElYIFNVQkRSSVZFUgogUDoJRnJhbmsgWmFnbwogTToJZnJhbmtAemFnby5uZXQKLUw6CXZpZGVvNGxpbnV4LWxpc3RAcmVkaGF0LmNvbQorTDoJbGludXgtbWVkaWFAdmdlci5rZXJuZWwub3JnCitUOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L21jaGVoYWIvbGludXgtMi42LmdpdAogUzoJTWFpbnRhaW5lZAogCiBHU1BDQSBNNTYwMiBTVUJEUklWRVIKIFA6CUVyaWsgQW5kcmVuCiBNOgllcmlrLmFuZHJlbkBnbWFpbC5jb20KLUw6CXZpZGVvNGxpbnV4LWxpc3RAcmVkaGF0LmNvbQorTDoJbGludXgtbWVkaWFAdmdlci5rZXJuZWwub3JnCitUOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L21jaGVoYWIvbGludXgtMi42LmdpdAogUzoJTWFpbnRhaW5lZAogCiBHU1BDQSBQQUMyMDcgU09OSVhCIFNVQkRSSVZFUgogUDoJSGFucyBkZSBHb2VkZQogTToJaGRlZ29lZGVAcmVkaGF0LmNvbQotTDoJdmlkZW80bGludXgtbGlzdEByZWRoYXQuY29tCitMOglsaW51eC1tZWRpYUB2Z2VyLmtlcm5lbC5vcmcKK1Q6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvbWNoZWhhYi9saW51eC0yLjYuZ2l0CiBTOglNYWludGFpbmVkCiAKIEdTUENBIFQ2MTMgU1VCRFJJVkVSCiBQOglMZWFuZHJvIENvc3RhbnRpbm8KIE06CWxjb3N0YW50aW5vQGdtYWlsLmNvbQotTDoJdmlkZW80bGludXgtbGlzdEByZWRoYXQuY29tCitMOglsaW51eC1tZWRpYUB2Z2VyLmtlcm5lbC5vcmcKK1Q6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvbWNoZWhhYi9saW51eC0yLjYuZ2l0CiBTOglNYWludGFpbmVkCiAKIEdTUENBIFVTQiBXRUJDQU0gRFJJVkVSCiBQOglKZWFuLUZyYW5jb2lzIE1vaW5lCiBNOgltb2luZWpmQGZyZWUuZnIKIFc6CWh0dHA6Ly9tb2luZWpmLmZyZWUuZnIKLUw6CXZpZGVvNGxpbnV4LWxpc3RAcmVkaGF0LmNvbQorTDoJbGludXgtbWVkaWFAdmdlci5rZXJuZWwub3JnCitUOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L21jaGVoYWIvbGludXgtMi42LmdpdAogUzoJTWFpbnRhaW5lZAogCiBIQVJEV0FSRSBNT05JVE9SSU5HCkBAIC0yMzA4LDYgKzIzMTcsMTQgQEAKIFc6CWh0dHA6Ly9pcHcyMjAwLnNvdXJjZWZvcmdlLm5ldAogUzoJU3VwcG9ydGVkCiAKK0lOVEVMIFdJUkVMRVNTIFdJTUFYIENPTk5FQ1RJT04gMjQwMAorUDoJSW5ha3kgUGVyZXotR29uemFsZXoKK006CWluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbQorTToJbGludXgtd2ltYXhAaW50ZWwuY29tCitMOgl3aW1heEBsaW51eHdpbWF4Lm9yZworUzoJU3VwcG9ydGVkCitXOglodHRwOi8vbGludXh3aW1heC5vcmcKKwogSU5URUwgV0lSRUxFU1MgV0lGSSBMSU5LIChpd2x3aWZpKQogUDoJWmh1IFlpCiBNOgl5aS56aHVAaW50ZWwuY29tCkBAIC0yNDMyLDcgKzI0NDksOCBAQAogTToJaHZlcmt1aWxAeHM0YWxsLm5sCiBMOglpdnR2LWRldmVsQGl2dHZkcml2ZXIub3JnCiBMOglpdnR2LXVzZXJzQGl2dHZkcml2ZXIub3JnCi1MOgl2aWRlbzRsaW51eC1saXN0QHJlZGhhdC5jb20KK0w6CWxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZworVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9tY2hlaGFiL2xpbnV4LTIuNi5naXQKIFc6CWh0dHA6Ly93d3cuaXZ0dmRyaXZlci5vcmcKIFM6CU1haW50YWluZWQKIApAQCAtMjk4NSw2ICszMDAzLDcgQEAKIFA6CUZlbGlwZSBCYWxiaQogTToJZmVsaXBlLmJhbGJpQG5va2lhLmNvbQogTDoJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZworVDoJZ2l0IGdpdG9yaW91cy5vcmc6L211c2IvbWFpbmxpbmUuZ2l0CiBTOglNYWludGFpbmVkCiAKIE1ZUklDT00gTVlSSS0xMEcgMTBHYkUgRFJJVkVSIChNWVJJMTBHRSkKQEAgLTMxOTEsNyArMzIxMCw4IEBACiBPTU5JVklTSU9OIE9WNzY3MCBTRU5TT1IgRFJJVkVSCiBQOglKb25hdGhhbiBDb3JiZXQKIE06CWNvcmJldEBsd24ubmV0Ci1MOgl2aWRlbzRsaW51eC1saXN0QHJlZGhhdC5jb20KK0w6CWxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZworVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9tY2hlaGFiL2xpbnV4LTIuNi5naXQKIFM6CU1haW50YWluZWQKIAogT05FTkFORCBGTEFTSCBEUklWRVIKQEAgLTM0NjksMTIgKzM0ODksMTkgQEAKIEw6CWNiZS1vc3MtZGV2QG96bGFicy5vcmcKIFM6CVN1cHBvcnRlZAogCitQUzNWUkFNIERSSVZFUgorUDoJSmltIFBhcmlzCitNOglqaW1AanRhbi5jb20KK0w6CWNiZS1vc3MtZGV2QG96bGFicy5vcmcKK1M6CU1haW50YWluZWQKKwogUFZSVVNCMiBWSURFTzRMSU5VWCBEUklWRVIKIFA6CU1pa2UgSXNlbHkKIE06CWlzZWx5QHBvYm94LmNvbQogTDoJcHZydXNiMkBpc2VseS5uZXQJKHN1YnNjcmliZXJzLW9ubHkpCi1MOgl2aWRlbzRsaW51eC1saXN0QHJlZGhhdC5jb20KK0w6CWxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZwogVzoJaHR0cDovL3d3dy5pc2VseS5uZXQvcHZydXNiMi8KK1Q6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvbWNoZWhhYi9saW51eC0yLjYuZ2l0CiBTOglNYWludGFpbmVkCiAKIFBYQTJ4eC9QWEEzeHggU1VQUE9SVApAQCAtMzY5NCw2ICszNzIxLDggQEAKIFNBQTcxNDYgVklERU80TElOVVgtMiBEUklWRVIKIFA6CU1pY2hhZWwgSHVub2xkCiBNOgltaWNoYWVsQG1paHUuZGUKK0w6CWxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZworVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9tY2hlaGFiL2xpbnV4LTIuNi5naXQKIFc6CWh0dHA6Ly93d3cubWlodS5kZS9saW51eC9zYWE3MTQ2CiBTOglNYWludGFpbmVkCiAKQEAgLTM5NTcsNyArMzk4Niw4IEBACiBTT0MtQ0FNRVJBIFY0TDIgU1VCU1lTVEVNCiBQOglHdWVubmFkaSBMaWFraG92ZXRza2kKIE06CWcubGlha2hvdmV0c2tpQGdteC5kZQotTDoJdmlkZW80bGludXgtbGlzdEByZWRoYXQuY29tCitMOglsaW51eC1tZWRpYUB2Z2VyLmtlcm5lbC5vcmcKK1Q6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvbWNoZWhhYi9saW51eC0yLjYuZ2l0CiBTOglNYWludGFpbmVkCiAKIFNPRUtSSVMgTkVUNDhYWCBMRUQgU1VQUE9SVApAQCAtNDAxNSwxMCArNDA0NSwxMiBAQAogVzoJaHR0cDovL2Fsc2EtcHJvamVjdC5vcmcvbWFpbi9pbmRleC5waHAvQVNvQwogUzoJU3VwcG9ydGVkCiAKLVNQQVJDIChzcGFyYzMyKQotUDoJV2lsbGlhbSBMLiBJcndpbgotTToJd2xpQGhvbG9tb3JwaHkuY29tCitTUEFSQyArIFVsdHJhU1BBUkMgKHNwYXJjL3NwYXJjNjQpCitQOglEYXZpZCBTLiBNaWxsZXIKK006CWRhdmVtQGRhdmVtbG9mdC5uZXQKIEw6CXNwYXJjbGludXhAdmdlci5rZXJuZWwub3JnCitUOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2RhdmVtL3NwYXJjLTIuNi5naXQKK1Q6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvZGF2ZW0vc3BhcmMtbmV4dC0yLjYuZ2l0CiBTOglNYWludGFpbmVkCiAKIFNQRUNJQUxJWCBJTzgrIE1VTFRJUE9SVCBTRVJJQUwgQ0FSRCBEUklWRVIKQEAgLTQyMzAsOSArNDI2MiwxMCBAQAogUzoJTWFpbnRhaW5lZAogCiBUUklWSUFMIFBBVENIRVMKLVA6CUplc3BlciBKdWhsCitQOglKaXJpIEtvc2luYQogTToJdHJpdmlhbEBrZXJuZWwub3JnCiBMOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCitUOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2ppa29zL3RyaXZpYWwuZ2l0CiBTOglNYWludGFpbmVkCiAKIFRUWSBMQVlFUgpAQCAtNDMwMiwxMyArNDMzNSw2IEBACiBMOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiAKLVVsdHJhU1BBUkMgKHNwYXJjNjQpCi1QOglEYXZpZCBTLiBNaWxsZXIKLU06CWRhdmVtQGRhdmVtbG9mdC5uZXQKLUw6CXNwYXJjbGludXhAdmdlci5rZXJuZWwub3JnCi1UOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2RhdmVtL3NwYXJjLTIuNi5naXQKLVM6CU1haW50YWluZWQKLQogVUxUUkEtV0lERUJBTkQgKFVXQikgU1VCU1lTVEVNOgogUDoJRGF2aWQgVnJhYmVsCiBNOglkYXZpZC52cmFiZWxAY3NyLmNvbQpAQCAtNDM4MCw3ICs0NDA2LDggQEAKIFA6CUx1Y2EgUmlzb2xpYQogTToJbHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdAogTDoJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZwotTDoJdmlkZW80bGludXgtbGlzdEByZWRoYXQuY29tCitMOglsaW51eC1tZWRpYUB2Z2VyLmtlcm5lbC5vcmcKK1Q6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvbWNoZWhhYi9saW51eC0yLjYuZ2l0CiBXOglodHRwOi8vd3d3LmxpbnV4LXByb2plY3RzLm9yZwogUzoJTWFpbnRhaW5lZAogCkBAIC00NTI5LDcgKzQ1NTYsOCBAQAogUDoJTHVjYSBSaXNvbGlhCiBNOglsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0CiBMOglsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCi1MOgl2aWRlbzRsaW51eC1saXN0QHJlZGhhdC5jb20KK0w6CWxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZworVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9tY2hlaGFiL2xpbnV4LTIuNi5naXQKIFc6CWh0dHA6Ly93d3cubGludXgtcHJvamVjdHMub3JnCiBTOglNYWludGFpbmVkCiAKQEAgLTQ1NTgsNyArNDU4Niw4IEBACiBQOglMYXVyZW50IFBpbmNoYXJ0CiBNOglsYXVyZW50LnBpbmNoYXJ0QHNreW5ldC5iZQogTDoJbGludXgtdXZjLWRldmVsQGxpc3RzLmJlcmxpb3MuZGUgKHN1YnNjcmliZXJzLW9ubHkpCi1MOgl2aWRlbzRsaW51eC1saXN0QHJlZGhhdC5jb20KK0w6CWxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZworVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9tY2hlaGFiL2xpbnV4LTIuNi5naXQKIFc6CWh0dHA6Ly9saW51eC11dmMuYmVybGlvcy5kZQogUzoJTWFpbnRhaW5lZAogCkBAIC00NTY2LDcgKzQ1OTUsOCBAQAogUDoJTHVjYSBSaXNvbGlhCiBNOglsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0CiBMOglsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCi1MOgl2aWRlbzRsaW51eC1saXN0QHJlZGhhdC5jb20KK0w6CWxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZworVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9tY2hlaGFiL2xpbnV4LTIuNi5naXQKIFc6CWh0dHA6Ly93d3cubGludXgtcHJvamVjdHMub3JnCiBTOglNYWludGFpbmVkCiAKQEAgLTQ1ODAsNyArNDYxMCw4IEBACiBQOglMdWNhIFJpc29saWEKIE06CWx1Y2Eucmlzb2xpYUBzdHVkaW8udW5pYm8uaXQKIEw6CWxpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmcKLUw6CXZpZGVvNGxpbnV4LWxpc3RAcmVkaGF0LmNvbQorTDoJbGludXgtbWVkaWFAdmdlci5rZXJuZWwub3JnCitUOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L21jaGVoYWIvbGludXgtMi42LmdpdAogVzoJaHR0cDovL3d3dy5saW51eC1wcm9qZWN0cy5vcmcKIFM6CU1haW50YWluZWQKIApAQCAtNDU5NSw3ICs0NjI2LDggQEAKIFA6CUFudG9pbmUgSmFjcXVldAogTToJcm95YWxlQHplcmV6by5jb20KIEw6CWxpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmcKLUw6CXZpZGVvNGxpbnV4LWxpc3RAcmVkaGF0LmNvbQorTDoJbGludXgtbWVkaWFAdmdlci5rZXJuZWwub3JnCitUOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L21jaGVoYWIvbGludXgtMi42LmdpdAogVzoJaHR0cDovL3JveWFsZS56ZXJlem8uY29tL3pyMzY0eHgvCiBTOglNYWludGFpbmVkCiAKQEAgLTQ2NjQsMTAgKzQ2OTYsMTAgQEAKIFZJREVPIEZPUiBMSU5VWCAoVjRMKQogUDoJTWF1cm8gQ2FydmFsaG8gQ2hlaGFiCiBNOgltY2hlaGFiQGluZnJhZGVhZC5vcmcKLU06CXY0bC1kdmItbWFpbnRhaW5lckBsaW51eHR2Lm9yZworTDoJbGludXgtbWVkaWFAdmdlci5rZXJuZWwub3JnCiBMOgl2aWRlbzRsaW51eC1saXN0QHJlZGhhdC5jb20KIFc6CWh0dHA6Ly9saW51eHR2Lm9yZwotVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9tY2hlaGFiL3Y0bC1kdmIuZ2l0CitUOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L21jaGVoYWIvbGludXgtMi42LmdpdAogUzoJTWFpbnRhaW5lZAogCiBWTEFOICg4MDIuMVEpCkBAIC00NzQwLDYgKzQ3NzIsMTQgQEAKIEw6CWxpbnV4LXNjc2lAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiAKK1dJTUFYIFNUQUNLCitQOglJbmFreSBQZXJlei1Hb256YWxlegorTToJaW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tCitNOglsaW51eC13aW1heEBpbnRlbC5jb20KK0w6CXdpbWF4QGxpbnV4d2ltYXgub3JnCitTOglTdXBwb3J0ZWQKK1c6CWh0dHA6Ly9saW51eHdpbWF4Lm9yZworCiBXSU1FRElBIExMQyBQUk9UT0NPTCAoV0xQKSBTVUJTWVNURU0KIFA6CURhdmlkIFZyYWJlbAogTToJZGF2aWQudnJhYmVsQGNzci5jb20KZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKaW5kZXggZjkwMDY2Ni4uMjgzMzEyOCAxMDA2NDQKLS0tIGEvTWFrZWZpbGUKKysrIGIvTWFrZWZpbGUKQEAgLTk2NSw2ICs5NjUsNyBAQAogCSAgICBta2RpciAtcCBpbmNsdWRlMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJICAgIGxuIC1mc24gJChzcmN0cmVlKS9pbmNsdWRlL2FzbS0kKFNSQ0FSQ0gpIGluY2x1ZGUyL2FzbTsgICAgIFwKIAlmaQorCWxuIC1mc24gJChzcmN0cmVlKSBzb3VyY2UKIGVuZGlmCiAKICMgcHJlcGFyZTIgY3JlYXRlcyBhIG1ha2VmaWxlIGlmIHVzaW5nIGEgc2VwYXJhdGUgb3V0cHV0IGRpcmVjdG9yeQpAQCAtMTAwOCw3ICsxMDA5LDcgQEAKIGVuZGVmCiAKICMgV2UgY3JlYXRlIHRoZSB0YXJnZXQgZGlyZWN0b3J5IG9mIHRoZSBzeW1saW5rIGlmIGl0IGRvZXMKLSMgbm90IGV4aXN0IHNvIHRoZSB0ZXN0IGluIGNoYWNrLXN5bWxpbmsgd29ya3MgYW5kIHdlIGhhdmUgYQorIyBub3QgZXhpc3Qgc28gdGhlIHRlc3QgaW4gY2hlY2stc3ltbGluayB3b3JrcyBhbmQgd2UgaGF2ZSBhCiAjIGRpcmVjdG9yeSBmb3IgZ2VuZXJhdGVkIGZpbGVzYXMgdXNlZCBieSBzb21lIGFyY2hpdGVjdHVyZXMuCiBkZWZpbmUgY3JlYXRlLXN5bWxpbmsKIAlpZiBbICEgLUwgaW5jbHVkZS9hc20gXTsgdGhlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL0tidWlsZAppbmRleCBiN2M4ZjE4Li40ZGFkMjczIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtOSwzICs5LDQgQEAKIHVuaWZkZWYteSArPSBmcHUuaAogdW5pZmRlZi15ICs9IHN5c2luZm8uaAogdW5pZmRlZi15ICs9IGNvbXBpbGVyLmgKK3VuaWZkZWYteSArPSBzd2FiLmgKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vYXRvbWljLmggYi9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL2F0b21pYy5oCmluZGV4IGNhODhlNTQuLjYyYjM2MzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vYXRvbWljLmgKKysrIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9hdG9taWMuaApAQCAtMSw2ICsxLDcgQEAKICNpZm5kZWYgX0FMUEhBX0FUT01JQ19ICiAjZGVmaW5lIF9BTFBIQV9BVE9NSUNfSAogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vYmFycmllci5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIApAQCAtMTMsMTQgKzE0LDYgQEAKICAqLwogCiAKLS8qCi0gKiBDb3VudGVyIGlzIHZvbGF0aWxlIHRvIG1ha2Ugc3VyZSBnY2MgZG9lc24ndCB0cnkgdG8gYmUgY2xldmVyCi0gKiBhbmQgbW92ZSB0aGluZ3MgYXJvdW5kIG9uIHVzLiBXZSBuZWVkIHRvIHVzZSBfZXhhY3RseV8gdGhlIGFkZHJlc3MKLSAqIHRoZSB1c2VyIGdhdmUgdXMsIG5vdCBzb21lIGFsaWFzIHRoYXQgY29udGFpbnMgdGhlIHNhbWUgaW5mb3JtYXRpb24uCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsgdm9sYXRpbGUgaW50IGNvdW50ZXI7IH0gYXRvbWljX3Q7Ci10eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIGxvbmcgY291bnRlcjsgfSBhdG9taWM2NF90OwotCiAjZGVmaW5lIEFUT01JQ19JTklUKGkpCQkoIChhdG9taWNfdCkgeyAoaSkgfSApCiAjZGVmaW5lIEFUT01JQzY0X0lOSVQoaSkJKCAoYXRvbWljNjRfdCkgeyAoaSkgfSApCiAKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmggYi9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCmluZGV4IDU4ZTk1OGYuLjY3NzJmMzEgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKKysrIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaApAQCAtMSw0NyArMSw3IEBACiAjaWZuZGVmIF9BTFBIQV9CWVRFT1JERVJfSAogI2RlZmluZSBfQUxQSEFfQllURU9SREVSX0gKIAotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+Ci0jaW5jbHVkZSA8YXNtL2NvbXBpbGVyLmg+Ci0KLSNpZmRlZiBfX0dOVUNfXwotCi1zdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19hcmNoX19zd2FiMzIoX191MzIgeCkKLXsKLQkvKgotCSAqIFVuZm9ydHVuYXRlbHksIHdlIGNhbid0IHVzZSB0aGUgNiBpbnN0cnVjdGlvbiBzZXF1ZW5jZQotCSAqIG9uIGV2NiBzaW5jZSB0aGUgbGF0ZW5jeSBvZiB0aGUgVU5QS0JXIGlzIDMsIHdoaWNoIGlzCi0JICogcHJldHR5IGhhcmQgdG8gaGlkZS4gIEp1c3QgaW4gY2FzZSBhIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbgotCSAqIGhhcyBhIGxvd2VyIGxhdGVuY3ksIGhlcmUncyB0aGUgc2VxdWVuY2UgKGFsc28gYnkgTWlrZSBCdXJyb3dzKQotCSAqCi0JICogVU5QS0JXIGEwLCB2MCAgICAgICB2MDogMDBBQTAwQkIwMENDMDBERAotCSAqIFNMTCB2MCwgMjQsIGEwICAgICAgYTA6IEJCMDBDQzAwREQwMDAwMDAKLQkgKiBCSVMgdjAsIGEwLCBhMCAgICAgIGEwOiBCQkFBQ0NCQkREQ0MwMERECi0JICogRVhUV0wgYTAsIDYsIHYwICAgICB2MDogMDAwMDAwMDAwMDAwQkJBQQotCSAqIFpBUCBhMCwgMHhmMywgYTAgICAgYTA6IDAwMDAwMDAwRERDQzAwMDAKLQkgKiBBRERMIGEwLCB2MCwgdjAgICAgIHYwOiBzc3Nzc3Nzc0REQ0NCQkFBCi0JICovCi0KLQlfX3U2NCB0MCwgdDEsIHQyLCB0MzsKLQotCXQwID0gX19rZXJuZWxfaW5zbGgoeCwgNyk7CS8qIHQwIDogMDAwMDAwMDAwMEFBQkJDQyAqLwotCXQxID0gX19rZXJuZWxfaW5zd2woeCwgMyk7CS8qIHQxIDogMDAwMDAwQ0NERDAwMDAwMCAqLwotCXQxIHw9IHQwOwkJCS8qIHQxIDogMDAwMDAwQ0NEREFBQkJDQyAqLwotCXQyID0gdDEgPj4gMTY7CQkJLyogdDIgOiAwMDAwMDAwMDAwQ0NEREFBICovCi0JdDAgPSB0MSAmIDB4RkYwMEZGMDA7CQkvKiB0MCA6IDAwMDAwMDAwREQwMEJCMDAgKi8KLQl0MyA9IHQyICYgMHgwMEZGMDBGRjsJCS8qIHQzIDogMDAwMDAwMDAwMENDMDBBQSAqLwotCXQxID0gdDAgKyB0MzsJCQkvKiB0MSA6IHNzc3Nzc3NzRERDQ0JCQUEgKi8KLQotCXJldHVybiB0MTsKLX0KLQotI2RlZmluZSBfX2FyY2hfX3N3YWIzMiBfX2FyY2hfX3N3YWIzMgotCi0jZW5kaWYgLyogX19HTlVDX18gKi8KLQotI2RlZmluZSBfX0JZVEVPUkRFUl9IQVNfVTY0X18KLQorI2luY2x1ZGUgPGFzbS9zd2FiLmg+CiAjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2xpdHRsZV9lbmRpYW4uaD4KIAogI2VuZGlmIC8qIF9BTFBIQV9CWVRFT1JERVJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9zd2FiLmggYi9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL3N3YWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGU3MDg5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9zd2FiLmgKQEAgLTAsMCArMSw0MiBAQAorI2lmbmRlZiBfQUxQSEFfU1dBQl9ICisjZGVmaW5lIF9BTFBIQV9TV0FCX0gKKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8YXNtL2NvbXBpbGVyLmg+CisKKyNpZmRlZiBfX0dOVUNfXworCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19hcmNoX3N3YWIzMihfX3UzMiB4KQoreworCS8qCisJICogVW5mb3J0dW5hdGVseSwgd2UgY2FuJ3QgdXNlIHRoZSA2IGluc3RydWN0aW9uIHNlcXVlbmNlCisJICogb24gZXY2IHNpbmNlIHRoZSBsYXRlbmN5IG9mIHRoZSBVTlBLQlcgaXMgMywgd2hpY2ggaXMKKwkgKiBwcmV0dHkgaGFyZCB0byBoaWRlLiAgSnVzdCBpbiBjYXNlIGEgZnV0dXJlIGltcGxlbWVudGF0aW9uCisJICogaGFzIGEgbG93ZXIgbGF0ZW5jeSwgaGVyZSdzIHRoZSBzZXF1ZW5jZSAoYWxzbyBieSBNaWtlIEJ1cnJvd3MpCisJICoKKwkgKiBVTlBLQlcgYTAsIHYwICAgICAgIHYwOiAwMEFBMDBCQjAwQ0MwMERECisJICogU0xMIHYwLCAyNCwgYTAgICAgICBhMDogQkIwMENDMDBERDAwMDAwMAorCSAqIEJJUyB2MCwgYTAsIGEwICAgICAgYTA6IEJCQUFDQ0JCRERDQzAwREQKKwkgKiBFWFRXTCBhMCwgNiwgdjAgICAgIHYwOiAwMDAwMDAwMDAwMDBCQkFBCisJICogWkFQIGEwLCAweGYzLCBhMCAgICBhMDogMDAwMDAwMDBERENDMDAwMAorCSAqIEFEREwgYTAsIHYwLCB2MCAgICAgdjA6IHNzc3Nzc3NzRERDQ0JCQUEKKwkgKi8KKworCV9fdTY0IHQwLCB0MSwgdDIsIHQzOworCisJdDAgPSBfX2tlcm5lbF9pbnNsaCh4LCA3KTsJLyogdDAgOiAwMDAwMDAwMDAwQUFCQkNDICovCisJdDEgPSBfX2tlcm5lbF9pbnN3bCh4LCAzKTsJLyogdDEgOiAwMDAwMDBDQ0REMDAwMDAwICovCisJdDEgfD0gdDA7CQkJLyogdDEgOiAwMDAwMDBDQ0REQUFCQkNDICovCisJdDIgPSB0MSA+PiAxNjsJCQkvKiB0MiA6IDAwMDAwMDAwMDBDQ0REQUEgKi8KKwl0MCA9IHQxICYgMHhGRjAwRkYwMDsJCS8qIHQwIDogMDAwMDAwMDBERDAwQkIwMCAqLworCXQzID0gdDIgJiAweDAwRkYwMEZGOwkJLyogdDMgOiAwMDAwMDAwMDAwQ0MwMEFBICovCisJdDEgPSB0MCArIHQzOwkJCS8qIHQxIDogc3Nzc3Nzc3NERENDQkJBQSAqLworCisJcmV0dXJuIHQxOworfQorI2RlZmluZSBfX2FyY2hfc3dhYjMyIF9fYXJjaF9zd2FiMzIKKworI2VuZGlmIC8qIF9fR05VQ19fICovCisKKyNlbmRpZiAvKiBfQUxQSEFfU1dBQl9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9wY2kuYyBiL2FyY2gvYWxwaGEva2VybmVsL3BjaS5jCmluZGV4IGZmOGNiNjMuLmEzYjkzODggMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3BjaS5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3BjaS5jCkBAIC0zMjAsMjQgKzMyMCw2IEBACiAJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBpcnEpOwogfQogCi0vKiBNb3N0IEFscGhhcyBoYXZlIHN0cmFpZ2h0LWZvcndhcmQgc3dpenpsaW5nIG5lZWRzLiAgKi8KLQotdTggX19pbml0Ci1jb21tb25fc3dpenpsZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCAqcGlucCkKLXsKLQl1OCBwaW4gPSAqcGlucDsKLQotCXdoaWxlIChkZXYtPmJ1cy0+cGFyZW50KSB7Ci0JCXBpbiA9IGJyaWRnZV9zd2l6emxlKHBpbiwgUENJX1NMT1QoZGV2LT5kZXZmbikpOwotCQkvKiBNb3ZlIHVwIHRoZSBjaGFpbiBvZiBicmlkZ2VzLiAqLwotCQlkZXYgPSBkZXYtPmJ1cy0+c2VsZjsKLSAgICAgICAgfQotCSpwaW5wID0gcGluOwotCi0JLyogVGhlIHNsb3QgaXMgdGhlIHNsb3Qgb2YgdGhlIGxhc3QgYnJpZGdlLiAqLwotCXJldHVybiBQQ0lfU0xPVChkZXYtPmRldmZuKTsKLX0KLQogdm9pZAogcGNpYmlvc19yZXNvdXJjZV90b19idXMoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHBjaV9idXNfcmVnaW9uICpyZWdpb24sCiAJCQkgc3RydWN0IHJlc291cmNlICpyZXMpCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9wY2lfaW1wbC5oIGIvYXJjaC9hbHBoYS9rZXJuZWwvcGNpX2ltcGwuaAppbmRleCBmOGI3NDk5Li4wMGVkZDA0IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9wY2lfaW1wbC5oCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3BjaV9pbXBsLmgKQEAgLTEwNiwxNiArMTA2LDExIEBACiAgKiAgIFdoZXJlIEEgPSBwaW4gMSwgQiA9IHBpbiAyIGFuZCBzbyBvbiBhbmQgcGluPTAgPSBkZWZhdWx0ID0gQS4KICAqICAgVGh1cywgZWFjaCBzd2l6emxlIGlzICgocGluLTEpICsgKGRldmljZSMtNCkpICUgNAogICoKLSAqICAgVGhlIGZvbGxvd2luZyBjb2RlIHN3aXp6bGVzIGZvciBleGFjdGx5IG9uZSBicmlkZ2UuICBUaGUgcm91dGluZQotICogICBjb21tb25fc3dpenpsZSBiZWxvdyBoYW5kbGVzIG11bHRpcGxlIGJyaWRnZXMuICBCdXQgdGhlcmUgYXJlIGEKLSAqICAgY291cGxlIGJvYXJkcyB0aGF0IGRvIHN0cmFuZ2UgdGhpbmdzLCBzbyB3ZSBkZWZpbmUgdGhpcyBoZXJlLgorICogICBwY2lfc3dpenpsZV9pbnRlcnJ1cHRfcGluKCkgc3dpenpsZXMgZm9yIGV4YWN0bHkgb25lIGJyaWRnZS4gIFRoZSByb3V0aW5lCisgKiAgIHBjaV9jb21tb25fc3dpenpsZSgpIGhhbmRsZXMgbXVsdGlwbGUgYnJpZGdlcy4gIEJ1dCB0aGVyZSBhcmUgYQorICogICBjb3VwbGUgYm9hcmRzIHRoYXQgZG8gc3RyYW5nZSB0aGluZ3MuCiAgKi8KIAotc3RhdGljIGlubGluZSB1OCBicmlkZ2Vfc3dpenpsZSh1OCBwaW4sIHU4IHNsb3QpIAotewotCXJldHVybiAoKChwaW4tMSkgKyBzbG90KSAlIDQpICsgMTsKLX0KLQogCiAvKiBUaGUgZm9sbG93aW5nIG1hY3JvIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSB0YWJsZS1iYXNlZCBpcnEgbWFwcGluZwogICAgZnVuY3Rpb24gZm9yIGFsbCBzaW5nbGUtYnVzIEFscGhhcy4gICovCkBAIC0xODQsNyArMTc5LDcgQEAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGFscGhhX2FncGdhcnRfc2l6ZTsKIAogZXh0ZXJuIHZvaWQgY29tbW9uX2luaXRfcGNpKHZvaWQpOwotZXh0ZXJuIHU4IGNvbW1vbl9zd2l6emxlKHN0cnVjdCBwY2lfZGV2ICosIHU4ICopOworI2RlZmluZSBjb21tb25fc3dpenpsZSBwY2lfY29tbW9uX3N3aXp6bGUKIGV4dGVybiBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmFsbG9jX3BjaV9jb250cm9sbGVyKHZvaWQpOwogZXh0ZXJuIHN0cnVjdCByZXNvdXJjZSAqYWxsb2NfcmVzb3VyY2Uodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19kcDI2NC5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX2RwMjY0LmMKaW5kZXggYWI0NGMxNi4uOWM5ZDFmZCAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX2RwMjY0LmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX2RwMjY0LmMKQEAgLTQ4MSw3ICs0ODEsNyBAQAogCQkJCXNsb3QgPSBQQ0lfU0xPVChkZXYtPmRldmZuKTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCXBpbiA9IGJyaWRnZV9zd2l6emxlKHBpbiwgUENJX1NMT1QoZGV2LT5kZXZmbikpIDsKKwkJCXBpbiA9IHBjaV9zd2l6emxlX2ludGVycnVwdF9waW4oZGV2LCBwaW4pOwogCiAJCQkvKiBNb3ZlIHVwIHRoZSBjaGFpbiBvZiBicmlkZ2VzLiAgKi8KIAkJCWRldiA9IGRldi0+YnVzLT5zZWxmOwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX2VpZ2VyLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfZWlnZXIuYwppbmRleCA3ZWYzYjZmLi5iYWY2MGYzIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfZWlnZXIuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfZWlnZXIuYwpAQCAtMjA0LDcgKzIwNCw3IEBACiAJCQlicmVhazsKIAkJfQogCQkvKiBNdXN0IGJlIGEgY2FyZC1iYXNlZCBicmlkZ2UuICAqLwotCQlwaW4gPSBicmlkZ2Vfc3dpenpsZShwaW4sIFBDSV9TTE9UKGRldi0+ZGV2Zm4pKTsKKwkJcGluID0gcGNpX3N3aXp6bGVfaW50ZXJydXB0X3BpbihkZXYsIHBpbik7CiAKIAkJLyogTW92ZSB1cCB0aGUgY2hhaW4gb2YgYnJpZGdlcy4gICovCiAJCWRldiA9IGRldi0+YnVzLT5zZWxmOwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX21pYXRhLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbWlhdGEuYwppbmRleCA5MTBiNDNjLi42MWNjZDk1IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbWlhdGEuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbWlhdGEuYwpAQCAtMjE5LDcgKzIxOSw3IEBACiAJCQkJc2xvdCA9IFBDSV9TTE9UKGRldi0+ZGV2Zm4pICsgOTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCXBpbiA9IGJyaWRnZV9zd2l6emxlKHBpbiwgUENJX1NMT1QoZGV2LT5kZXZmbikpOworCQkJcGluID0gcGNpX3N3aXp6bGVfaW50ZXJydXB0X3BpbihkZXYsIHBpbik7CiAKIAkJCS8qIE1vdmUgdXAgdGhlIGNoYWluIG9mIGJyaWRnZXMuICAqLwogCQkJZGV2ID0gZGV2LT5idXMtPnNlbGY7CmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbm9yaXRha2UuYyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19ub3JpdGFrZS5jCmluZGV4IGViMmExZDYuLjUzODg3NmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19ub3JpdGFrZS5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19ub3JpdGFrZS5jCkBAIC0yNTcsNyArMjU3LDcgQEAKIAkJCQlzbG90ID0gUENJX1NMT1QoZGV2LT5kZXZmbikgKyAxNTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCXBpbiA9IGJyaWRnZV9zd2l6emxlKHBpbiwgUENJX1NMT1QoZGV2LT5kZXZmbikpIDsKKwkJCXBpbiA9IHBjaV9zd2l6emxlX2ludGVycnVwdF9waW4oZGV2LCBwaW4pOwogCiAJCQkvKiBNb3ZlIHVwIHRoZSBjaGFpbiBvZiBicmlkZ2VzLiAgKi8KIAkJCWRldiA9IGRldi0+YnVzLT5zZWxmOwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3J1ZmZpYW4uYyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19ydWZmaWFuLmMKaW5kZXggNWI5OWNmMy4uZjE1YTMyOSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3J1ZmZpYW4uYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfcnVmZmlhbi5jCkBAIC0xNjAsNyArMTYwLDcgQEAKIAkJCQlzbG90ID0gUENJX1NMT1QoZGV2LT5kZXZmbikgKyAxMDsKIAkJCQlicmVhazsKIAkJCX0KLQkJCXBpbiA9IGJyaWRnZV9zd2l6emxlKHBpbiwgUENJX1NMT1QoZGV2LT5kZXZmbikpOworCQkJcGluID0gcGNpX3N3aXp6bGVfaW50ZXJydXB0X3BpbihkZXYsIHBpbik7CiAKIAkJCS8qIE1vdmUgdXAgdGhlIGNoYWluIG9mIGJyaWRnZXMuICAqLwogCQkJZGV2ID0gZGV2LT5idXMtPnNlbGY7CmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfc2FibGUuYyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19zYWJsZS5jCmluZGV4IGE0NTU1ZjQuLmQyMzJlNDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19zYWJsZS5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19zYWJsZS5jCkBAIC00MjUsNyArNDI1LDcgQEAKIAkJCQlzbG90ID0gUENJX1NMT1QoZGV2LT5kZXZmbikgKyAxMTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCXBpbiA9IGJyaWRnZV9zd2l6emxlKHBpbiwgUENJX1NMT1QoZGV2LT5kZXZmbikpIDsKKwkJCXBpbiA9IHBjaV9zd2l6emxlX2ludGVycnVwdF9waW4oZGV2LCBwaW4pOwogCiAJCQkvKiBNb3ZlIHVwIHRoZSBjaGFpbiBvZiBicmlkZ2VzLiAgKi8KIAkJCWRldiA9IGRldi0+YnVzLT5zZWxmOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vS2NvbmZpZyBiL2FyY2gvYXJtL0tjb25maWcKaW5kZXggZDZlYmUzOS4uZGJmZGY4NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vS2NvbmZpZworKysgYi9hcmNoL2FybS9LY29uZmlnCkBAIC0xMzI1LDYgKzEzMjUsOCBAQAogCiBzb3VyY2UgImRyaXZlcnMvdWlvL0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL0tjb25maWciCisKIGVuZG1lbnUKIAogc291cmNlICJmcy9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9jbHBzNzUwMF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2NscHM3NTAwX2RlZmNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDllOWY5ZC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9jb25maWdzL2NscHM3NTAwX2RlZmNvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDgwMSArMCwwIEBACi0jCi0jIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTItcmMxLWJrMgotIyBTdW4gTWFyIDI3IDE3OjIwOjQ4IDIwMDUKLSMKLUNPTkZJR19BUk09eQotQ09ORklHX01NVT15Ci1DT05GSUdfVUlEMTY9eQotQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQotQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKLUNPTkZJR19HRU5FUklDX0lPTUFQPXkKLQotIwotIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKLSMKLUNPTkZJR19FWFBFUklNRU5UQUw9eQotQ09ORklHX0NMRUFOX0NPTVBJTEU9eQotQ09ORklHX0JST0tFTl9PTl9TTVA9eQotCi0jCi0jIEdlbmVyYWwgc2V0dXAKLSMKLUNPTkZJR19MT0NBTFZFUlNJT049IiIKLUNPTkZJR19TV0FQPXkKLUNPTkZJR19TWVNWSVBDPXkKLSMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZU0NUTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVURJVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKLUNPTkZJR19LT0JKRUNUX1VFVkVOVD15Ci0jIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0Ci1DT05GSUdfRU1CRURERUQ9eQotQ09ORklHX0tBTExTWU1TPXkKLSMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAotQ09ORklHX0JBU0VfRlVMTD15Ci1DT05GSUdfRlVURVg9eQotQ09ORklHX0VQT0xMPXkKLUNPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15Ci1DT05GSUdfU0hNRU09eQotQ09ORklHX0NDX0FMSUdOX0ZVTkNUSU9OUz0wCi1DT05GSUdfQ0NfQUxJR05fTEFCRUxTPTAKLUNPTkZJR19DQ19BTElHTl9MT09QUz0wCi1DT05GSUdfQ0NfQUxJR05fSlVNUFM9MAotIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0Ci1DT05GSUdfQkFTRV9TTUFMTD0wCi0KLSMKLSMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKLSMKLSMgQ09ORklHX01PRFVMRVMgaXMgbm90IHNldAotCi0jCi0jIFN5c3RlbSBUeXBlCi0jCi1DT05GSUdfQVJDSF9DTFBTNzUwMD15Ci0jIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9JT1AzWFggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9JWFA0WFggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9JWFAyMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfTDcyMDAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9QWEEgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9SUEMgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9TQTExMDAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9TM0MyNDEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfU0hBUksgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9MSDdBNDBYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfT01BUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKLQotIwotIyBQcm9jZXNzb3IgVHlwZQotIwotQ09ORklHX0NQVV8zMj15Ci1DT05GSUdfQ1BVX0FSTTcxMD15Ci1DT05GSUdfQ1BVXzMydjM9eQotQ09ORklHX0NQVV9DQUNIRV9WMz15Ci1DT05GSUdfQ1BVX0NBQ0hFX1ZJVlQ9eQotQ09ORklHX0NQVV9DT1BZX1YzPXkKLUNPTkZJR19DUFVfVExCX1YzPXkKLQotIwotIyBQcm9jZXNzb3IgRmVhdHVyZXMKLSMKLUNPTkZJR19USU1FUl9BQ09STj15Ci0KLSMKLSMgQnVzIHN1cHBvcnQKLSMKLUNPTkZJR19JU0E9eQotCi0jCi0jIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKLSMKLSMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0Ci0KLSMKLSMgS2VybmVsIEZlYXR1cmVzCi0jCi0jIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKLUNPTkZJR19BTElHTk1FTlRfVFJBUD15Ci0KLSMKLSMgQm9vdCBvcHRpb25zCi0jCi1DT05GSUdfWkJPT1RfUk9NX1RFWFQ9MHgwCi1DT05GSUdfWkJPT1RfUk9NX0JTUz0weDAKLUNPTkZJR19DTURMSU5FPSJtZW09MTZNIHJvb3Q9bmZzIgotIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0Ci0KLSMKLSMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCi0jCi0KLSMKLSMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCi0jCi0jIENPTkZJR19GUEVfTldGUEUgaXMgbm90IHNldAotCi0jCi0jIFVzZXJzcGFjZSBiaW5hcnkgZm9ybWF0cwotIwotQ09ORklHX0JJTkZNVF9FTEY9eQotIyBDT05GSUdfQklORk1UX0FPVVQgaXMgbm90IHNldAotIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAotIyBDT05GSUdfQVJUSFVSIGlzIG5vdCBzZXQKLQotIwotIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKLSMKLSMgQ09ORklHX1BNIGlzIG5vdCBzZXQKLQotIwotIyBEZXZpY2UgRHJpdmVycwotIwotCi0jCi0jIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKLSMKLUNPTkZJR19TVEFOREFMT05FPXkKLUNPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKLSMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQotIwotQ09ORklHX01URD15Ci0jIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAotIyBDT05GSUdfTVREX0NPTkNBVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfUEFSVElUSU9OUyBpcyBub3Qgc2V0Ci0KLSMKLSMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKLSMKLSMgQ09ORklHX01URF9DSEFSIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9CTE9DSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQkxPQ0tfUk8gaXMgbm90IHNldAotIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GVEwgaXMgbm90IHNldAotIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAotCi0jCi0jIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCi0jCi0jIENPTkZJR19NVERfQ0ZJIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9KRURFQ1BST0JFIGlzIG5vdCBzZXQKLUNPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15Ci1DT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQotQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKLSMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAotQ09ORklHX01URF9DRklfSTE9eQotQ09ORklHX01URF9DRklfSTI9eQotIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAotIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKLQotIwotIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCi0jCi0jIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0Ci0KLSMKLSMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCi0jCi0jIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAotIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAotIyBDT05GSUdfTVREX0JMS01URCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKLQotIwotIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKLSMKLSMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0Ci0KLSMKLSMgTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycwotIwotIyBDT05GSUdfTVREX05BTkQgaXMgbm90IHNldAotCi0jCi0jIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAotIwotQ09ORklHX1BBUlBPUlQ9eQotQ09ORklHX1BBUlBPUlRfUEM9eQotQ09ORklHX1BBUlBPUlRfUENfRklGTz15Ci0jIENPTkZJR19QQVJQT1JUX1BDX1NVUEVSSU8gaXMgbm90IHNldAotIyBDT05GSUdfUEFSUE9SVF9BUkMgaXMgbm90IHNldAotIyBDT05GSUdfUEFSUE9SVF9HU0MgaXMgbm90IHNldAotQ09ORklHX1BBUlBPUlRfMTI4ND15Ci0KLSMKLSMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0Ci0jCi0jIENPTkZJR19QTlAgaXMgbm90IHNldAotCi0jCi0jIEJsb2NrIGRldmljZXMKLSMKLSMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9YRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVJJREUgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfTE9PUCBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9OQkQ9eQotQ09ORklHX0JMS19ERVZfUkFNPXkKLUNPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgotQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgotIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldAotQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKLSMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAotCi0jCi0jIElPIFNjaGVkdWxlcnMKLSMKLUNPTkZJR19JT1NDSEVEX05PT1A9eQotQ09ORklHX0lPU0NIRURfQVM9eQotQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQotQ09ORklHX0lPU0NIRURfQ0ZRPXkKLSMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0Ci0KLSMKLSMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAotIwotIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKLQotIwotIyBTQ1NJIGRldmljZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQotIwotIyBDT05GSUdfTUQgaXMgbm90IHNldAotCi0jCi0jIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKLSMKLQotIwotIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0Ci0jCi0KLSMKLSMgSTJPIGRldmljZSBzdXBwb3J0Ci0jCi0KLSMKLSMgTmV0d29ya2luZyBzdXBwb3J0Ci0jCi1DT05GSUdfTkVUPXkKLQotIwotIyBOZXR3b3JraW5nIG9wdGlvbnMKLSMKLSMgQ09ORklHX1BBQ0tFVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRMSU5LX0RFViBpcyBub3Qgc2V0Ci1DT05GSUdfVU5JWD15Ci0jIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUPXkKLSMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAotQ09ORklHX0lQX1BOUD15Ci0jIENPTkZJR19JUF9QTlBfREhDUCBpcyBub3Qgc2V0Ci1DT05GSUdfSVBfUE5QX0JPT1RQPXkKLSMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAotQ09ORklHX0lQX1RDUERJQUc9eQotIyBDT05GSUdfSVBfVENQRElBR19JUFY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQVjYgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKLQotIwotIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKLSMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAotIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19YMjUgaXMgbm90IHNldAotIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKLQotIwotIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKLSMKLSMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfQ0xTX1JPVVRFIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIHRlc3RpbmcKLSMKLSMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAotIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lSREEgaXMgbm90IHNldAotIyBDT05GSUdfQlQgaXMgbm90IHNldAotQ09ORklHX05FVERFVklDRVM9eQotQ09ORklHX0RVTU1ZPXkKLSMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAotIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RVTiBpcyBub3Qgc2V0Ci0KLSMKLSMgQVJDbmV0IGRldmljZXMKLSMKLSMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0Ci0KLSMKLSMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCi0jCi1DT05GSUdfTkVUX0VUSEVSTkVUPXkKLSMgQ09ORklHX01JSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAotIyBDT05GSUdfTEFOQ0UgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1ZFTkRPUl9TTUMgaXMgbm90IHNldAotIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9WRU5ET1JfUkFDQUwgaXMgbm90IHNldAotIyBDT05GSUdfQVQxNzAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFUENBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JU0EgaXMgbm90IHNldAotQ09ORklHX05FVF9QQ0k9eQotIyBDT05GSUdfQUMzMjAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FQUklDT1QgaXMgbm90IHNldAotQ09ORklHX0NTODl4MD15Ci0jIENPTkZJR19ORVRfUE9DS0VUIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAwMCBNYml0KQotIwotCi0jCi0jIEV0aGVybmV0ICgxMDAwMCBNYml0KQotIwotCi0jCi0jIFRva2VuIFJpbmcgZGV2aWNlcwotIwotIyBDT05GSUdfVFIgaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQotIwotIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKLQotIwotIyBXYW4gaW50ZXJmYWNlcwotIwotIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BMSVAgaXMgbm90IHNldAotQ09ORklHX1BQUD15Ci0jIENPTkZJR19QUFBfTVVMVElMSU5LIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQUF9GSUxURVIgaXMgbm90IHNldAotIyBDT05GSUdfUFBQX0FTWU5DIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQUF9TWU5DX1RUWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUFBfREVGTEFURSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUFBfQlNEQ09NUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUFBPRSBpcyBub3Qgc2V0Ci1DT05GSUdfU0xJUD15Ci1DT05GSUdfU0xJUF9DT01QUkVTU0VEPXkKLSMgQ09ORklHX1NMSVBfU01BUlQgaXMgbm90IHNldAotIyBDT05GSUdfU0xJUF9NT0RFX1NMSVA2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKLQotIwotIyBJU0ROIHN1YnN5c3RlbQotIwotIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0Ci0KLSMKLSMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKLSMKLUNPTkZJR19JTlBVVD15Ci0KLSMKLSMgVXNlcmxhbmQgaW50ZXJmYWNlcwotIwotQ09ORklHX0lOUFVUX01PVVNFREVWPXkKLUNPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWD15Ci1DT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAotQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAotIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKLQotIwotIyBJbnB1dCBEZXZpY2UgRHJpdmVycwotIwotQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKLUNPTkZJR19LRVlCT0FSRF9BVEtCRD15Ci0jIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAotIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKLUNPTkZJR19JTlBVVF9NT1VTRT15Ci1DT05GSUdfTU9VU0VfUFMyPXkKLSMgQ09ORklHX01PVVNFX1NFUklBTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT1VTRV9JTlBPUlQgaXMgbm90IHNldAotIyBDT05GSUdfTU9VU0VfTE9HSUJNIGlzIG5vdCBzZXQKLSMgQ09ORklHX01PVVNFX1BDMTEwUEFEIGlzIG5vdCBzZXQKLSMgQ09ORklHX01PVVNFX1ZTWFhYQUEgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0Ci0KLSMKLSMgSGFyZHdhcmUgSS9PIHBvcnRzCi0jCi1DT05GSUdfU0VSSU89eQotIyBDT05GSUdfU0VSSU9fU0VSUE9SVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJT19QQVJLQkQgaXMgbm90IHNldAotQ09ORklHX1NFUklPX1JQQ0tCRD15Ci1DT05GSUdfU0VSSU9fTElCUFMyPXkKLSMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0Ci1DT05GSUdfU09VTkRfR0FNRVBPUlQ9eQotCi0jCi0jIENoYXJhY3RlciBkZXZpY2VzCi0jCi1DT05GSUdfVlQ9eQotQ09ORklHX1ZUX0NPTlNPTEU9eQotQ09ORklHX0hXX0NPTlNPTEU9eQotIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKLQotIwotIyBTZXJpYWwgZHJpdmVycwotIwotQ09ORklHX1NFUklBTF84MjUwPXkKLUNPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKLUNPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz00Ci0jIENPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRCBpcyBub3Qgc2V0Ci0KLSMKLSMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAotIwotQ09ORklHX1NFUklBTF9DT1JFPXkKLUNPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKLUNPTkZJR19VTklYOThfUFRZUz15Ci1DT05GSUdfTEVHQUNZX1BUWVM9eQotQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2Ci1DT05GSUdfUFJJTlRFUj15Ci0jIENPTkZJR19MUF9DT05TT0xFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RJUEFSIGlzIG5vdCBzZXQKLQotIwotIyBJUE1JCi0jCi0jIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAotCi0jCi0jIFdhdGNoZG9nIENhcmRzCi0jCi0jIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVEMgaXMgbm90IHNldAotIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0Ci0KLSMKLSMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCi0jCi0jIENPTkZJR19EUk0gaXMgbm90IHNldAotIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgVFBNIGRldmljZXMKLSMKLSMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAotCi0jCi0jIEkyQyBzdXBwb3J0Ci0jCi1DT05GSUdfSTJDPXkKLSMgQ09ORklHX0kyQ19DSEFSREVWIGlzIG5vdCBzZXQKLQotIwotIyBJMkMgQWxnb3JpdGhtcwotIwotQ09ORklHX0kyQ19BTEdPQklUPXkKLSMgQ09ORklHX0kyQ19BTEdPUENGIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTEdPUENBIGlzIG5vdCBzZXQKLQotIwotIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKLSMKLSMgQ09ORklHX0kyQ19FTEVLVE9SIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19QQVJQT1JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19QQ0FfSVNBIGlzIG5vdCBzZXQKLQotIwotIyBIYXJkd2FyZSBTZW5zb3JzIENoaXAgc3VwcG9ydAotIwotIyBDT05GSUdfSTJDX1NFTlNPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FETTEwMjEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BRE0xMDI1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfQURNMTAyNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FETTEwMzEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BU0IxMDAgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19EUzE2MjEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19GU0NIRVIgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19GU0NQT1MgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19HTDUxOFNNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfR0w1MjBTTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0lUODcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTYzIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE03NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNNzcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTc4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE04MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNODMgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTg1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE04NyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNOTAgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUEM4NzM2MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19XODNMNzg1VFMgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0Ci0KLSMKLSMgT3RoZXIgSTJDIENoaXAgc3VwcG9ydAotIwotIyBDT05GSUdfU0VOU09SU19FRVBST00gaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1JUQzg1NjQgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0Ci0KLSMKLSMgTWlzYyBkZXZpY2VzCi0jCi0KLSMKLSMgTXVsdGltZWRpYSBkZXZpY2VzCi0jCi0jIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAotCi0jCi0jIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKLSMKLSMgQ09ORklHX0RWQiBpcyBub3Qgc2V0Ci0KLSMKLSMgR3JhcGhpY3Mgc3VwcG9ydAotIwotQ09ORklHX0ZCPXkKLUNPTkZJR19GQl9DRkJfRklMTFJFQ1Q9eQotQ09ORklHX0ZCX0NGQl9DT1BZQVJFQT15Ci1DT05GSUdfRkJfQ0ZCX0lNQUdFQkxJVD15Ci1DT05GSUdfRkJfU09GVF9DVVJTT1I9eQotIyBDT05GSUdfRkJfTU9ERV9IRUxQRVJTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1RJTEVCTElUVElORyBpcyBub3Qgc2V0Ci1DT05GSUdfRkJfQUNPUk49eQotIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0Ci0KLSMKLSMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0Ci0jCi0jIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NREFfQ09OU09MRSBpcyBub3Qgc2V0Ci1DT05GSUdfRFVNTVlfQ09OU09MRT15Ci1DT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRT15Ci1DT05GSUdfRk9OVFM9eQotQ09ORklHX0ZPTlRfOHg4PXkKLUNPTkZJR19GT05UXzh4MTY9eQotIyBDT05GSUdfRk9OVF82eDExIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZPTlRfUEVBUkxfOHg4IGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZPTlRfQUNPUk5fOHg4IGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZPTlRfTUlOSV80eDYgaXMgbm90IHNldAotIyBDT05GSUdfRk9OVF9TVU44eDE2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZPTlRfU1VOMTJ4MjIgaXMgbm90IHNldAotCi0jCi0jIExvZ28gY29uZmlndXJhdGlvbgotIwotQ09ORklHX0xPR089eQotQ09ORklHX0xPR09fTElOVVhfTU9OTz15Ci1DT05GSUdfTE9HT19MSU5VWF9WR0ExNj15Ci1DT05GSUdfTE9HT19MSU5VWF9DTFVUMjI0PXkKLSMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgU291bmQKLSMKLSMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKLQotIwotIyBVU0Igc3VwcG9ydAotIwotQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQotIyBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0kgaXMgbm90IHNldAotIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgR2FkZ2V0IFN1cHBvcnQKLSMKLSMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAotCi0jCi0jIE1NQy9TRCBDYXJkIHN1cHBvcnQKLSMKLSMgQ09ORklHX01NQyBpcyBub3Qgc2V0Ci0KLSMKLSMgRmlsZSBzeXN0ZW1zCi0jCi1DT05GSUdfRVhUMl9GUz15Ci0jIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgWEZTIHN1cHBvcnQKLSMKLSMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0Ci1DT05GSUdfTUlOSVhfRlM9eQotIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAotQ09ORklHX0ROT1RJRlk9eQotIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAotCi0jCi0jIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKLSMKLSMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAotIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19WRkFUX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAotCi0jCi0jIFBzZXVkbyBmaWxlc3lzdGVtcwotIwotQ09ORklHX1BST0NfRlM9eQotQ09ORklHX1NZU0ZTPXkKLSMgQ09ORklHX0RFVkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFVlBUU19GU19YQVRUUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAotQ09ORklHX1JBTUZTPXkKLQotIwotIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkZGUzJfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCi0jCi1DT05GSUdfTkZTX0ZTPXkKLSMgQ09ORklHX05GU19WMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAotIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU0QgaXMgbm90IHNldAotQ09ORklHX1JPT1RfTkZTPXkKLUNPTkZJR19MT0NLRD15Ci1DT05GSUdfU1VOUlBDPXkKLSMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgUGFydGl0aW9uIFR5cGVzCi0jCi1DT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKLSMgQ09ORklHX0FDT1JOX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19PU0ZfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FNSUdBX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFSSV9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfTUFDX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NU0RPU19QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfTERNX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TR0lfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VMVFJJWF9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfU1VOX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19FRklfUEFSVElUSU9OIGlzIG5vdCBzZXQKLQotIwotIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAotIwotIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKLQotIwotIyBQcm9maWxpbmcgc3VwcG9ydAotIwotIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKLQotIwotIyBLZXJuZWwgaGFja2luZwotIwotIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKLUNPTkZJR19MT0dfQlVGX1NISUZUPTE0Ci0jIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKLUNPTkZJR19GUkFNRV9QT0lOVEVSPXkKLSMgQ09ORklHX0RFQlVHX1VTRVIgaXMgbm90IHNldAotCi0jCi0jIFNlY3VyaXR5IG9wdGlvbnMKLSMKLSMgQ09ORklHX0tFWVMgaXMgbm90IHNldAotIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAotCi0jCi0jIENyeXB0b2dyYXBoaWMgb3B0aW9ucwotIwotIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKLQotIwotIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcwotIwotCi0jCi0jIExpYnJhcnkgcm91dGluZXMKLSMKLSMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JDMzI9eQotIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL0tidWlsZAppbmRleCA3MzIzN2JkLi40M2IwYjJiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0xLDMgKzEsNCBAQAogaW5jbHVkZSBpbmNsdWRlL2FzbS1nZW5lcmljL0tidWlsZC5hc20KIAogdW5pZmRlZi15ICs9IGh3Y2FwLmgKK3VuaWZkZWYteSArPSBzd2FiLmgKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2F0b21pYy5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vYXRvbWljLmgKaW5kZXggMzI1Zjg4MS4uZWU5OTcyMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vYXRvbWljLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vYXRvbWljLmgKQEAgLTEyLDEwICsxMiw5IEBACiAjZGVmaW5lIF9fQVNNX0FSTV9BVE9NSUNfSAogCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAotdHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBpbnQgY291bnRlcjsgfSBhdG9taWNfdDsKLQogI2RlZmluZSBBVE9NSUNfSU5JVChpKQl7IChpKSB9CiAKICNpZmRlZiBfX0tFUk5FTF9fCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCmluZGV4IDRmYmZiMjIuLmMwMmI2ZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCkBAIC0xNSwzOCArMTUsNyBAQAogI2lmbmRlZiBfX0FTTV9BUk1fQllURU9SREVSX0gKICNkZWZpbmUgX19BU01fQVJNX0JZVEVPUkRFUl9ICiAKLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgotCi1zdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19fYXJjaF9fc3dhYjMyKF9fdTMyIHgpCi17Ci0JX191MzIgdDsKLQotI2lmbmRlZiBfX3RodW1iX18KLQlpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wKHgpKSB7Ci0JCS8qCi0JCSAqIFRoZSBjb21waWxlciBuZWVkcyBhIGJpdCBvZiBhIGhpbnQgaGVyZSB0byBhbHdheXMgZG8gdGhlCi0JCSAqIHJpZ2h0IHRoaW5nIGFuZCBub3Qgc2NyZXcgaXQgdXAgdG8gZGlmZmVyZW50IGRlZ3JlZXMKLQkJICogZGVwZW5kaW5nIG9uIHRoZSBnY2MgdmVyc2lvbi4KLQkJICovCi0JCWFzbSAoImVvclx0JTAsICUxLCAlMSwgcm9yICMxNiIgOiAiPXIiICh0KSA6ICJyIiAoeCkpOwotCX0gZWxzZQotI2VuZGlmCi0JCXQgPSB4IF4gKCh4IDw8IDE2KSB8ICh4ID4+IDE2KSk7IC8qIGVvciByMSxyMCxyMCxyb3IgIzE2ICovCi0KLQl4ID0gKHggPDwgMjQpIHwgKHggPj4gOCk7CQkvKiBtb3YgcjAscjAscm9yICM4ICAgICAgKi8KLQl0ICY9IH4weDAwRkYwMDAwOwkJCS8qIGJpYyByMSxyMSwjMHgwMEZGMDAwMCAqLwotCXggXj0gKHQgPj4gOCk7CQkJCS8qIGVvciByMCxyMCxyMSxsc3IgIzggICAqLwotCi0JcmV0dXJuIHg7Ci19Ci0KLSNkZWZpbmUgX19hcmNoX19zd2FiMzIoeCkgX19fYXJjaF9fc3dhYjMyKHgpCi0KLSNpZiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pIHx8IGRlZmluZWQoX19LRVJORUxfXykKLSMgIGRlZmluZSBfX0JZVEVPUkRFUl9IQVNfVTY0X18KLSMgIGRlZmluZSBfX1NXQUJfNjRfVEhSVV8zMl9fCi0jZW5kaWYKKyNpbmNsdWRlIDxhc20vc3dhYi5oPgogCiAjaWZkZWYgX19BUk1FQl9fCiAjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2JpZ19lbmRpYW4uaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21hY2gvcGNpLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9tYWNoL3BjaS5oCmluZGV4IDMyZGExYWUuLmEzOGJkYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21hY2gvcGNpLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWFjaC9wY2kuaApAQCAtNDIsNyArNDIsNyBAQAogLyoKICAqIFRoaXMgaXMgdGhlIHN0YW5kYXJkIFBDSS1QQ0kgYnJpZGdlIHN3aXp6bGluZyBhbGdvcml0aG0uCiAgKi8KLXU4IHBjaV9zdGRfc3dpenpsZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCAqcGlucCk7CisjZGVmaW5lIHBjaV9zdGRfc3dpenpsZSBwY2lfY29tbW9uX3N3aXp6bGUKIAogLyoKICAqIENhbGwgdGhpcyB3aXRoIHlvdXIgaHdfcGNpIHN0cnVjdCB0byBpbml0aWFsaXNlIHRoZSBQQ0kgc3lzdGVtLgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vc3dhYi5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vc3dhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YTY4OWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9zd2FiLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqICBhcmNoL2FybS9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaAorICoKKyAqIEFSTSBFbmRpYW4tbmVzcy4gIEluIGxpdHRsZSBlbmRpYW4gbW9kZSwgdGhlIGRhdGEgYnVzIGlzIGNvbm5lY3RlZCBzdWNoCisgKiB0aGF0IGJ5dGUgYWNjZXNzZXMgYXBwZWFyIGFzOgorICogIDAgPSBkMC4uLmQ3LCAxID0gZDguLi5kMTUsIDIgPSBkMTYuLi5kMjMsIDMgPSBkMjQuLi5kMzEKKyAqIGFuZCB3b3JkIGFjY2Vzc2VzIChkYXRhIG9yIGluc3RydWN0aW9uKSBhcHBlYXIgYXM6CisgKiAgZDAuLi5kMzEKKyAqCisgKiBXaGVuIGluIGJpZyBlbmRpYW4gbW9kZSwgYnl0ZSBhY2Nlc3NlcyBhcHBlYXIgYXM6CisgKiAgMCA9IGQyNC4uLmQzMSwgMSA9IGQxNi4uLmQyMywgMiA9IGQ4Li4uZDE1LCAzID0gZDAuLi5kNworICogYW5kIHdvcmQgYWNjZXNzZXMgKGRhdGEgb3IgaW5zdHJ1Y3Rpb24pIGFwcGVhciBhczoKKyAqICBkMC4uLmQzMQorICovCisjaWZuZGVmIF9fQVNNX0FSTV9TV0FCX0gKKyNkZWZpbmUgX19BU01fQVJNX1NXQUJfSAorCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKworI2lmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgfHwgZGVmaW5lZChfX0tFUk5FTF9fKQorIyAgZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19hcmNoX3N3YWIzMihfX3UzMiB4KQoreworCV9fdTMyIHQ7CisKKyNpZm5kZWYgX190aHVtYl9fCisJaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCh4KSkgeworCQkvKgorCQkgKiBUaGUgY29tcGlsZXIgbmVlZHMgYSBiaXQgb2YgYSBoaW50IGhlcmUgdG8gYWx3YXlzIGRvIHRoZQorCQkgKiByaWdodCB0aGluZyBhbmQgbm90IHNjcmV3IGl0IHVwIHRvIGRpZmZlcmVudCBkZWdyZWVzCisJCSAqIGRlcGVuZGluZyBvbiB0aGUgZ2NjIHZlcnNpb24uCisJCSAqLworCQlhc20gKCJlb3JcdCUwLCAlMSwgJTEsIHJvciAjMTYiIDogIj1yIiAodCkgOiAiciIgKHgpKTsKKwl9IGVsc2UKKyNlbmRpZgorCQl0ID0geCBeICgoeCA8PCAxNikgfCAoeCA+PiAxNikpOyAvKiBlb3IgcjEscjAscjAscm9yICMxNiAqLworCisJeCA9ICh4IDw8IDI0KSB8ICh4ID4+IDgpOwkJLyogbW92IHIwLHIwLHJvciAjOCAgICAgICovCisJdCAmPSB+MHgwMEZGMDAwMDsJCQkvKiBiaWMgcjEscjEsIzB4MDBGRjAwMDAgKi8KKwl4IF49ICh0ID4+IDgpOwkJCQkvKiBlb3IgcjAscjAscjEsbHNyICM4ICAgKi8KKworCXJldHVybiB4OworfQorI2RlZmluZSBfX2FyY2hfc3dhYjMyIF9fYXJjaF9zd2FiMzIKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9iaW9zMzIuYyBiL2FyY2gvYXJtL2tlcm5lbC9iaW9zMzIuYwppbmRleCAxN2E1OWI2Li44MDk2ODE5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvYmlvczMyLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2Jpb3MzMi5jCkBAIC00ODAsMzMgKzQ4MCw2IEBACiAjZW5kaWYKIAogLyoKLSAqIFRoaXMgaXMgdGhlIHN0YW5kYXJkIFBDSS1QQ0kgYnJpZGdlIHN3aXp6bGluZyBhbGdvcml0aG06Ci0gKgotICogICBEZXY6IDAgIDEgIDIgIDMKLSAqICAgIEEgICBBICBCICBDICBECi0gKiAgICBCICAgQiAgQyAgRCAgQQotICogICAgQyAgIEMgIEQgIEEgIEIKLSAqICAgIEQgICBEICBBICBCICBDCi0gKiAgICAgICAgXl5eXl5eXl5eXiBpcnEgcGluIG9uIGJyaWRnZQotICovCi11OCBfX2RldmluaXQgcGNpX3N0ZF9zd2l6emxlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4ICpwaW5wKQotewotCWludCBwaW4gPSAqcGlucCAtIDE7Ci0KLQl3aGlsZSAoZGV2LT5idXMtPnNlbGYpIHsKLQkJcGluID0gKHBpbiArIFBDSV9TTE9UKGRldi0+ZGV2Zm4pKSAmIDM7Ci0JCS8qCi0JCSAqIG1vdmUgdXAgdGhlIGNoYWluIG9mIGJyaWRnZXMsCi0JCSAqIHN3aXp6bGluZyBhcyB3ZSBnby4KLQkJICovCi0JCWRldiA9IGRldi0+YnVzLT5zZWxmOwotCX0KLQkqcGlucCA9IHBpbiArIDE7Ci0KLQlyZXR1cm4gUENJX1NMT1QoZGV2LT5kZXZmbik7Ci19Ci0KLS8qCiAgKiBTd2l6emxlIHRoZSBkZXZpY2UgcGluIGVhY2ggdGltZSB3ZSBjcm9zcyBhIGJyaWRnZS4KICAqIFRoaXMgbWlnaHQgdXBkYXRlIHBpbiBhbmQgcmV0dXJucyB0aGUgc2xvdCBudW1iZXIuCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9lY2FyZC5jIGIvYXJjaC9hcm0va2VybmVsL2VjYXJkLmMKaW5kZXggNjBjMDc5ZC4uZWVkMmY3OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2VjYXJkLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2VjYXJkLmMKQEAgLTgxNyw3ICs4MTcsNyBAQAogCWVjLT5kbWEgPSBOT19ETUE7CiAJZWMtPm9wcyA9ICZlY2FyZF9kZWZhdWx0X29wczsKIAotCXNucHJpbnRmKGVjLT5kZXYuYnVzX2lkLCBzaXplb2YoZWMtPmRldi5idXNfaWQpLCAiZWNhcmQlZCIsIHNsb3QpOworCWRldl9zZXRfbmFtZSgmZWMtPmRldiwgImVjYXJkJWQiLCBzbG90KTsKIAllYy0+ZGV2LnBhcmVudCA9IE5VTEw7CiAJZWMtPmRldi5idXMgPSAmZWNhcmRfYnVzX3R5cGU7CiAJZWMtPmRldi5kbWFfbWFzayA9ICZlYy0+ZG1hX21hc2s7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvaXNhLmMgYi9hcmNoL2FybS9rZXJuZWwvaXNhLmMKaW5kZXggNTBhMzBiYy4uOGFjOWI4NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2lzYS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9pc2EuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaXNhX21lbWJhc2UsIGlzYV9wb3J0YmFzZSwgaXNhX3BvcnRzaGlmdDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2twcm9iZXMuYyBiL2FyY2gvYXJtL2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggM2Y5YWJlMC4uZjY5MmVmZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2twcm9iZXMuYworKysgYi9hcmNoL2FybS9rZXJuZWwva3Byb2Jlcy5jCkBAIC05Miw5ICs5Miw3IEBACiB2b2lkIF9fa3Byb2JlcyBhcmNoX3JlbW92ZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKIAlpZiAocC0+YWluc24uaW5zbikgewotCQltdXRleF9sb2NrKCZrcHJvYmVfbXV0ZXgpOwogCQlmcmVlX2luc25fc2xvdChwLT5haW5zbi5pbnNuLCAwKTsKLQkJbXV0ZXhfdW5sb2NrKCZrcHJvYmVfbXV0ZXgpOwogCQlwLT5haW5zbi5pbnNuID0gTlVMTDsKIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtYWFlYzIwMDAvY29yZS5jCmluZGV4IDUwZTEzOTYuLmI1YzVmYzZiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL2NvcmUuYworKysgYi9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL2NvcmUuYwpAQCAtMjEyLDcgKzIxMiw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgYW1iYV9kZXZpY2UgY2xjZF9kZXZpY2UgPSB7CiAJLmRldgkJPSB7Ci0JCS5idXNfaWQJCQk9ICJtYjoxNiIsCisJCS5pbml0X25hbWUJCT0gIm1iOjE2IiwKIAkJLmNvaGVyZW50X2RtYV9tYXNrCT0gfjAsCiAJCS5wbGF0Zm9ybV9kYXRhCQk9ICZjbGNkX3BsYXRfZGF0YSwKIAl9LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFjYXA5LmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MWNhcDkuYwppbmRleCAwYTM4YzY5Li43MzM3NjE3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MWNhcDkuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MWNhcDkuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAKKyNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXJtOTIwMC5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFybTkyMDAuYwppbmRleCAyODU5NGZjLi4yZTllY2FkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXJtOTIwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxcm05MjAwLmMKQEAgLTEyLDYgKzEyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCisjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFybTkyMDAuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MC5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYwLmMKaW5kZXggYWNjYjY5ZS4uMDg5NGYxMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYwLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgogCisjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KICNpbmNsdWRlIDxtYWNoL2NwdS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYxLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjEuYwppbmRleCA3YjUxYTU5Li4zYWNkN2Q3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjEuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjEuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAKKyNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MXNhbTkyNjEuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2My5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYzLmMKaW5kZXggYWRhNGI2Ny4uOTQyNzkyZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYzLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgogCisjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFzYW05MjYzLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlybC5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05cmwuYwppbmRleCAyNTJlOTU0Li4yMTFjNWMxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlybC5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOXJsLmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgogCisjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KICNpbmNsdWRlIDxtYWNoL2NwdS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTlybGVrLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOXJsZWsuYwppbmRleCA5YjkzN2VlLi4zNWUxMmE0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOXJsZWsuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOXJsZWsuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+CiAjaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8bWFjaC9hdDkxc2FtOV9zbWMuaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFfc2hkd2MuaD4KIAogI2luY2x1ZGUgInNhbTlfc21jLmgiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2VkYjcyMTEtbW0uYyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvZWRiNzIxMS1tbS5jCmluZGV4IGM1OGUzMmUuLjBiZWExNDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvZWRiNzIxMS1tbS5jCisrKyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvZWRiNzIxMS1tbS5jCkBAIC0yNCw3ICsyNCw2IEBACiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLSNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9zaXplcy5oPgogIAogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9mb3J0dW5ldC5jIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9mb3J0dW5ldC5jCmluZGV4IDcxMjJiM2QuLjc0MzBlNDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvZm9ydHVuZXQuYworKysgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2ZvcnR1bmV0LmMKQEAgLTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kZXZpY2VzLmMKaW5kZXggM2Q0YjFkZS4uODA4NjMzZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RldmljZXMuYworKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvZGV2aWNlcy5jCkBAIC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9pMmMuaD4KKyNpbmNsdWRlIDxtYWNoL2lycXMuaD4KIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpMmNfcmVzb3VyY2VzW10gPSB7CiAJewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2dwaW8uaAppbmRleCBiM2EyOTYxLi5iNDU2ZjA3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL2lycXMuaD4KIAogLyoKICAqIGJhc2ljIGdwaW8gcm91dGluZXMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2NvcmUuYwppbmRleCA0NzgxZjMyLi42ZDkxNTJkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvY29yZS5jCkBAIC00MDksNyArNDA5LDcgQEAKIAogc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSB1YXJ0MV9kZXZpY2UgPSB7CiAJLmRldgkJPSB7Ci0JCS5idXNfaWQJCT0gImFwYjp1YXJ0MSIsCisJCS5pbml0X25hbWUJPSAiYXBiOnVhcnQxIiwKIAkJLnBsYXRmb3JtX2RhdGEJPSAmZXA5M3h4X3VhcnRfZGF0YSwKIAl9LAogCS5yZXMJCT0gewpAQCAtNDIzLDcgKzQyMyw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgYW1iYV9kZXZpY2UgdWFydDJfZGV2aWNlID0gewogCS5kZXYJCT0gewotCQkuYnVzX2lkCQk9ICJhcGI6dWFydDIiLAorCQkuaW5pdF9uYW1lCT0gImFwYjp1YXJ0MiIsCiAJCS5wbGF0Zm9ybV9kYXRhCT0gJmVwOTN4eF91YXJ0X2RhdGEsCiAJfSwKIAkucmVzCQk9IHsKQEAgLTQzNyw3ICs0MzcsNyBAQAogCiBzdGF0aWMgc3RydWN0IGFtYmFfZGV2aWNlIHVhcnQzX2RldmljZSA9IHsKIAkuZGV2CQk9IHsKLQkJLmJ1c19pZAkJPSAiYXBiOnVhcnQzIiwKKwkJLmluaXRfbmFtZQk9ICJhcGI6dWFydDMiLAogCQkucGxhdGZvcm1fZGF0YQk9ICZlcDkzeHhfdWFydF9kYXRhLAogCX0sCiAJLnJlcwkJPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvY29tbW9uLmMgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvY29tbW9uLmMKaW5kZXggMzZmZjA2ZC4uYjk3ZjUyOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NvbW1vbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9jb21tb24uYwpAQCAtMjgsMTIgKzI4LDE3IEBACiAKICNpbmNsdWRlICJjb21tb24uaCIKIAotZXh0ZXJuIHZvaWQgX19pbml0IGlzYV9pbml0X2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKLQogdW5zaWduZWQgaW50IG1lbV9mY2xrXzIxMjg1ID0gNTAwMDAwMDA7CiAKIEVYUE9SVF9TWU1CT0wobWVtX2ZjbGtfMjEyODUpOwogCitzdGF0aWMgdm9pZCBfX2luaXQgZWFybHlfZmNsayhjaGFyICoqYXJnKQoreworCW1lbV9mY2xrXzIxMjg1ID0gc2ltcGxlX3N0cnRvdWwoKmFyZywgYXJnLCAwKTsKK30KKworX19lYXJseV9wYXJhbSgibWVtX2ZjbGtfMjEyODU9IiwgZWFybHlfZmNsayk7CisKIHN0YXRpYyBpbnQgX19pbml0IHBhcnNlX3RhZ19tZW1jbGsoY29uc3Qgc3RydWN0IHRhZyAqdGFnKQogewogCW1lbV9mY2xrXzIxMjg1ID0gdGFnLT51Lm1lbWNsay5mbWVtY2xrOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NvbW1vbi5oIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NvbW1vbi5oCmluZGV4IDU4MGUzMWIuLmIwNWU2NjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9jb21tb24uaAorKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvY29tbW9uLmgKQEAgLTcsMyArNyw0IEBACiBleHRlcm4gdm9pZCBmb290YnJpZGdlX21hcF9pbyh2b2lkKTsKIGV4dGVybiB2b2lkIGZvb3RicmlkZ2VfaW5pdF9pcnEodm9pZCk7CiAKK2V4dGVybiB2b2lkIGlzYV9pbml0X2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9kYzIxMjg1LmMgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZGMyMTI4NS5jCmluZGV4IDEzMzA4NjAuLjNmZmE1NDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9kYzIxMjg1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2RjMjEyODUuYwpAQCAtMjg3LDYgKzI4Nyw5IEBACiAJcmV0dXJuIHBjaV9zY2FuX2J1cygwLCAmZGMyMTI4NV9vcHMsIHN5cyk7CiB9CiAKKyNkZWZpbmUgZGMyMTI4NV9yZXF1ZXN0X2lycShfYSwgX2IsIF9jLCBfZCwgX2UpIFwKKwlXQVJOX09OKHJlcXVlc3RfaXJxKF9hLCBfYiwgX2MsIF9kLCBfZSkgPCAwKQorCiB2b2lkIF9faW5pdCBkYzIxMjg1X3ByZWluaXQodm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgbWVtX3NpemUsIG1lbV9tYXNrOwpAQCAtMzM1LDE2ICszMzgsMTYgQEAKIAkvKgogCSAqIFdlIGRvbid0IGNhcmUgaWYgdGhlc2UgZmFpbC4KIAkgKi8KLQlyZXF1ZXN0X2lycShJUlFfUENJX1NFUlIsIGRjMjEyODVfc2Vycl9pcnEsIElSUUZfRElTQUJMRUQsCi0JCSAgICAiUENJIHN5c3RlbSBlcnJvciIsICZzZXJyX3RpbWVyKTsKLQlyZXF1ZXN0X2lycShJUlFfUENJX1BFUlIsIGRjMjEyODVfcGFyaXR5X2lycSwgSVJRRl9ESVNBQkxFRCwKLQkJICAgICJQQ0kgcGFyaXR5IGVycm9yIiwgJnBlcnJfdGltZXIpOwotCXJlcXVlc3RfaXJxKElSUV9QQ0lfQUJPUlQsIGRjMjEyODVfYWJvcnRfaXJxLCBJUlFGX0RJU0FCTEVELAotCQkgICAgIlBDSSBhYm9ydCIsIE5VTEwpOwotCXJlcXVlc3RfaXJxKElSUV9ESVNDQVJEX1RJTUVSLCBkYzIxMjg1X2Rpc2NhcmRfaXJxLCBJUlFGX0RJU0FCTEVELAotCQkgICAgIkRpc2NhcmQgdGltZXIiLCBOVUxMKTsKLQlyZXF1ZXN0X2lycShJUlFfUENJX0RQRVJSLCBkYzIxMjg1X2RwYXJpdHlfaXJxLCBJUlFGX0RJU0FCTEVELAotCQkgICAgIlBDSSBkYXRhIHBhcml0eSIsIE5VTEwpOworCWRjMjEyODVfcmVxdWVzdF9pcnEoSVJRX1BDSV9TRVJSLCBkYzIxMjg1X3NlcnJfaXJxLCBJUlFGX0RJU0FCTEVELAorCQkJICAgICJQQ0kgc3lzdGVtIGVycm9yIiwgJnNlcnJfdGltZXIpOworCWRjMjEyODVfcmVxdWVzdF9pcnEoSVJRX1BDSV9QRVJSLCBkYzIxMjg1X3Bhcml0eV9pcnEsIElSUUZfRElTQUJMRUQsCisJCQkgICAgIlBDSSBwYXJpdHkgZXJyb3IiLCAmcGVycl90aW1lcik7CisJZGMyMTI4NV9yZXF1ZXN0X2lycShJUlFfUENJX0FCT1JULCBkYzIxMjg1X2Fib3J0X2lycSwgSVJRRl9ESVNBQkxFRCwKKwkJCSAgICAiUENJIGFib3J0IiwgTlVMTCk7CisJZGMyMTI4NV9yZXF1ZXN0X2lycShJUlFfRElTQ0FSRF9USU1FUiwgZGMyMTI4NV9kaXNjYXJkX2lycSwgSVJRRl9ESVNBQkxFRCwKKwkJCSAgICAiRGlzY2FyZCB0aW1lciIsIE5VTEwpOworCWRjMjEyODVfcmVxdWVzdF9pcnEoSVJRX1BDSV9EUEVSUiwgZGMyMTI4NV9kcGFyaXR5X2lycSwgSVJRRl9ESVNBQkxFRCwKKwkJCSAgICAiUENJIGRhdGEgcGFyaXR5IiwgTlVMTCk7CiAKIAlpZiAoY2ZuX21vZGUpIHsKIAkJc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjc3JpbzsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pc2EtaXJxLmMgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaXNhLWlycS5jCmluZGV4IDllZTgwYTIuLjhiZmQwNmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pc2EtaXJxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2lzYS1pcnEuYwpAQCAtMjgsNiArMjgsOCBAQAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCisjaW5jbHVkZSAiY29tbW9uLmgiCisKIHN0YXRpYyB2b2lkIGlzYV9tYXNrX3BpY19sb19pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAl1bnNpZ25lZCBpbnQgbWFzayA9IDEgPDwgKGlycSAmIDcpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1oNzIweC9oNzIwMi1ldmFsLmMgYi9hcmNoL2FybS9tYWNoLWg3MjB4L2g3MjAyLWV2YWwuYwppbmRleCA1NjE2MWQ1Li44YzBiYTk5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWg3MjB4L2g3MjAyLWV2YWwuYworKysgYi9hcmNoL2FybS9tYWNoLWg3MjB4L2g3MjAyLWV2YWwuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgImNvbW1vbi5oIgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvY29yZS5jIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2NvcmUuYwppbmRleCBjODljOTQ5Li42Zjg4NzI5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvY29yZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9jb3JlLmMKQEAgLTM3LDcgKzM3LDcgQEAKIAogc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSBydGNfZGV2aWNlID0gewogCS5kZXYJCT0gewotCQkuYnVzX2lkCT0gIm1iOjE1IiwKKwkJLmluaXRfbmFtZSA9ICJtYjoxNSIsCiAJfSwKIAkucmVzCQk9IHsKIAkJLnN0YXJ0CT0gSU5URUdSQVRPUl9SVENfQkFTRSwKQEAgLTUwLDcgKzUwLDcgQEAKIAogc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSB1YXJ0MF9kZXZpY2UgPSB7CiAJLmRldgkJPSB7Ci0JCS5idXNfaWQJPSAibWI6MTYiLAorCQkuaW5pdF9uYW1lID0gIm1iOjE2IiwKIAkJLnBsYXRmb3JtX2RhdGEgPSAmaW50ZWdyYXRvcl91YXJ0X2RhdGEsCiAJfSwKIAkucmVzCQk9IHsKQEAgLTY0LDcgKzY0LDcgQEAKIAogc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSB1YXJ0MV9kZXZpY2UgPSB7CiAJLmRldgkJPSB7Ci0JCS5idXNfaWQJPSAibWI6MTciLAorCQkuaW5pdF9uYW1lID0gIm1iOjE3IiwKIAkJLnBsYXRmb3JtX2RhdGEgPSAmaW50ZWdyYXRvcl91YXJ0X2RhdGEsCiAJfSwKIAkucmVzCQk9IHsKQEAgLTc4LDcgKzc4LDcgQEAKIAogc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSBrbWkwX2RldmljZSA9IHsKIAkuZGV2CQk9IHsKLQkJLmJ1c19pZAk9ICJtYjoxOCIsCisJCS5pbml0X25hbWUgPSAibWI6MTgiLAogCX0sCiAJLnJlcwkJPSB7CiAJCS5zdGFydAk9IEtNSTBfQkFTRSwKQEAgLTkxLDcgKzkxLDcgQEAKIAogc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSBrbWkxX2RldmljZSA9IHsKIAkuZGV2CQk9IHsKLQkJLmJ1c19pZAk9ICJtYjoxOSIsCisJCS5pbml0X25hbWUgPSAibWI6MTkiLAogCX0sCiAJLnJlcwkJPSB7CiAJCS5zdGFydAk9IEtNSTFfQkFTRSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2NwLmMgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW50ZWdyYXRvcl9jcC5jCmluZGV4IDQyN2MyZDguLjRhYzA0MDU1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW50ZWdyYXRvcl9jcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2NwLmMKQEAgLTQwNyw3ICs0MDcsNyBAQAogCiBzdGF0aWMgc3RydWN0IGFtYmFfZGV2aWNlIG1tY19kZXZpY2UgPSB7CiAJLmRldgkJPSB7Ci0JCS5idXNfaWQJPSAibWI6MWMiLAorCQkuaW5pdF9uYW1lID0gIm1iOjFjIiwKIAkJLnBsYXRmb3JtX2RhdGEgPSAmbW1jX2RhdGEsCiAJfSwKIAkucmVzCQk9IHsKQEAgLTQyMSw3ICs0MjEsNyBAQAogCiBzdGF0aWMgc3RydWN0IGFtYmFfZGV2aWNlIGFhY2lfZGV2aWNlID0gewogCS5kZXYJCT0gewotCQkuYnVzX2lkCT0gIm1iOjFkIiwKKwkJLmluaXRfbmFtZSA9ICJtYjoxZCIsCiAJfSwKIAkucmVzCQk9IHsKIAkJLnN0YXJ0CT0gSU5UQ1BfUEFfQUFDSV9CQVNFLApAQCAtNTMyLDcgKzUzMiw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgYW1iYV9kZXZpY2UgY2xjZF9kZXZpY2UgPSB7CiAJLmRldgkJPSB7Ci0JCS5idXNfaWQJPSAibWI6YzAiLAorCQkuaW5pdF9uYW1lID0gIm1iOmMwIiwKIAkJLmNvaGVyZW50X2RtYV9tYXNrID0gfjAsCiAJCS5wbGF0Zm9ybV9kYXRhID0gJmNsY2RfZGF0YSwKIAl9LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL3BjaS5jIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL3BjaS5jCmluZGV4IGFmN2QzZmYuLjJmZGI5NTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9wY2kuYworKysgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvcGNpLmMKQEAgLTYzLDEzICs2Myw3IEBACiAgKgogICogV2hlcmUgQSA9IHBpbiAxLCBCID0gcGluIDIgYW5kIHNvIG9uIGFuZCBwaW49MCA9IGRlZmF1bHQgPSBBLgogICogVGh1cywgZWFjaCBzd2l6emxlIGlzICgocGluLTEpICsgKGRldmljZSMtNCkpICUgNAotICoKLSAqIFRoZSBmb2xsb3dpbmcgY29kZSBzd2l6emxlcyBmb3IgZXhhY3RseSBvbmUgYnJpZGdlLiAgCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGJyaWRnZV9zd2l6emxlKGludCBwaW4sIHVuc2lnbmVkIGludCBzbG90KSAKLXsKLQlyZXR1cm4gKHBpbiArIHNsb3QpICYgMzsKLX0KIAogLyoKICAqIFRoaXMgcm91dGluZSBoYW5kbGVzIG11bHRpcGxlIGJyaWRnZXMuCkBAIC04MSwxNSArNzUsMTQgQEAKIAlpZiAocGluID09IDApCiAJCXBpbiA9IDE7CiAKLQlwaW4gLT0gMTsKIAl3aGlsZSAoZGV2LT5idXMtPnNlbGYpIHsKLQkJcGluID0gYnJpZGdlX3N3aXp6bGUocGluLCBQQ0lfU0xPVChkZXYtPmRldmZuKSk7CisJCXBpbiA9IHBjaV9zd2l6emxlX2ludGVycnVwdF9waW4oZGV2LCBwaW4pOwogCQkvKgogCQkgKiBtb3ZlIHVwIHRoZSBjaGFpbiBvZiBicmlkZ2VzLCBzd2l6emxpbmcgYXMgd2UgZ28uCiAJCSAqLwogCQlkZXYgPSBkZXYtPmJ1cy0+c2VsZjsKIAl9Ci0JKnBpbnAgPSBwaW4gKyAxOworCSpwaW5wID0gcGluOwogCiAJcmV0dXJuIFBDSV9TTE9UKGRldi0+ZGV2Zm4pOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9jb21tb24uYyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvY29tbW9uLmMKaW5kZXggN2I4ZWY5Ny4uYjM0MDRiNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9jb21tb24uYworKysgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2NvbW1vbi5jCkBAIC02OTgsNiArNjk4LDcgQEAKIAlwcmludGsoS0VSTl9JTkZPICJLaXJrd29vZDogJXMsIFRDTEs9JWQuXG4iLAogCQlraXJrd29vZF9pZCgpLCBraXJrd29vZF90Y2xrKTsKIAlraXJrd29vZF9nZTAwX3NoYXJlZF9kYXRhLnRfY2xrID0ga2lya3dvb2RfdGNsazsKKwlraXJrd29vZF9nZTAxX3NoYXJlZF9kYXRhLnRfY2xrID0ga2lya3dvb2RfdGNsazsKIAlraXJrd29vZF9zcGlfcGxhdF9kYXRhLnRjbGsgPSBraXJrd29vZF90Y2xrOwogCWtpcmt3b29kX3VhcnQwX2RhdGFbMF0udWFydGNsayA9IGtpcmt3b29kX3RjbGs7CiAJa2lya3dvb2RfdWFydDFfZGF0YVswXS51YXJ0Y2xrID0ga2lya3dvb2RfdGNsazsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvcGNpZS5jIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9wY2llLmMKaW5kZXggZjZiMDhmMi4uNzNmY2NhYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9wY2llLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9wY2llLmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9tYnVzLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgogI2luY2x1ZGUgPHBsYXQvcGNpZS5oPgogI2luY2x1ZGUgImNvbW1vbi5oIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1rczg2OTUvZGV2aWNlcy5jIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvZGV2aWNlcy5jCmluZGV4IDM2YWIwZmQuLmI4OWZiNmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta3M4Njk1L2RldmljZXMuYworKysgYi9hcmNoL2FybS9tYWNoLWtzODY5NS9kZXZpY2VzLmMKQEAgLTIyLDYgKzIyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLXdhbi5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1sYW4uaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtaHBuYS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2NsY2QuYyBiL2FyY2gvYXJtL21hY2gtbGg3YTQweC9jbGNkLmMKaW5kZXggYTJhNTQzMi4uYzQ3MmI5ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2NsY2QuYworKysgYi9hcmNoL2FybS9tYWNoLWxoN2E0MHgvY2xjZC5jCkBAIC0yMDcsNyArMjA3LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgYW1iYV9kZXZpY2UgbmFtZSMjX2RldmljZSA9IHsJCQlcCiAJLmRldiA9IHsJCQkJCQlcCiAJCS5jb2hlcmVudF9kbWFfbWFzayA9IH4wLAkJCVwKLQkJLmJ1c19pZAk9IGJ1c2lkLAkJCQlcCisJCS5pbml0X25hbWUgPSBidXNpZCwJCQkJXAogCQkucGxhdGZvcm1fZGF0YSA9IHBsYXQsCQkJCVwKIAkJfSwJCQkJCQlcCiAJLnJlcyA9IHsJCQkJCQlcCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9kZXZpY2VzLmMKaW5kZXggZjJhNzRiOS4uMzFiNmIzMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL2RldmljZXMuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAjaW5jbHVkZSA8bWFjaC9tc21faW9tYXAuaD4KICNpbmNsdWRlICJkZXZpY2VzLmgiCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9wY2llLmMgYi9hcmNoL2FybS9tYWNoLW12Nzh4eDAvcGNpZS5jCmluZGV4IDQzMGVhODQuLmFhZDNhN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9wY2llLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL3BjaWUuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L21idXMuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvcGNpLmg+CiAjaW5jbHVkZSA8cGxhdC9wY2llLmg+CiAjaW5jbHVkZSAiY29tbW9uLmgiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14Mi9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLW14Mi9kZXZpY2VzLmMKaW5kZXggYWYxMjFmNS4uMmY5MjQwYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDIvZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXgyL2RldmljZXMuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KIAorI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgzL2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtbXgzL2RldmljZXMuYwppbmRleCAxZDQ2Y2I0Li5mODQyODgwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14My9kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDMvZGV2aWNlcy5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL2lycXMuaD4KICNpbmNsdWRlIDxtYWNoL2lteC11YXJ0Lmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdWFydDBbXSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbmV0eC9mYi5jIGIvYXJjaC9hcm0vbWFjaC1uZXR4L2ZiLmMKaW5kZXggOGYxZjk5Mi4uMWQ4NDRlMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1uZXR4L2ZiLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1uZXR4L2ZiLmMKQEAgLTI0LDYgKzI0LDggQEAKICNpbmNsdWRlIDxsaW51eC9hbWJhL2NsY2QuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KIAorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKwogI2luY2x1ZGUgPG1hY2gvbmV0eC1yZWdzLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogCkBAIC05MSw3ICs5Myw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgYW1iYV9kZXZpY2UgZmJfZGV2aWNlID0gewogCS5kZXYJCT0gewotCQkuYnVzX2lkCT0gImZiIiwKKwkJLmluaXRfbmFtZSA9ICJmYiIsCiAJCS5jb2hlcmVudF9kbWFfbWFzayA9IH4wLAogCX0sCiAJLnJlcwkJPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW5ldHgvdGltZS5jIGIvYXJjaC9hcm0vbWFjaC1uZXR4L3RpbWUuYwppbmRleCBkNTFkNjI3Li5mMjAxZmRkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW5ldHgvdGltZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtbmV0eC90aW1lLmMKQEAgLTE2Myw3ICsxNjMsNyBAQAogCSAqIEFkZGluZyBzb21lIHNhZmV0eSAuLi4gKi8KIAluZXR4X2Nsb2NrZXZlbnQubWluX2RlbHRhX25zID0KIAkJY2xvY2tldmVudF9kZWx0YTJucygweGEwMCwgJm5ldHhfY2xvY2tldmVudCk7Ci0JbmV0eF9jbG9ja2V2ZW50LmNwdW1hc2sgPSBjcHVtYXNrX29mX2NwdSgwKTsKKwluZXR4X2Nsb2NrZXZlbnQuY3B1bWFzayA9IGNwdW1hc2tfb2YoMCk7CiAJY2xvY2tldmVudHNfcmVnaXN0ZXJfZGV2aWNlKCZuZXR4X2Nsb2NrZXZlbnQpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW5ldHgveGMuYyBiL2FyY2gvYXJtL21hY2gtbmV0eC94Yy5jCmluZGV4IDhmYzYyMDUuLjE4MWE3OGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbmV0eC94Yy5jCisrKyBiL2FyY2gvYXJtL21hY2gtbmV0eC94Yy5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL2lycXMuaD4KICNpbmNsdWRlIDxtYWNoL25ldHgtcmVncy5oPgogCiAjaW5jbHVkZSA8bWFjaC94Yy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9tY2JzcC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9tY2JzcC5jCmluZGV4IDdkZTdjNjkuLjQ0NzRkYTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvbWNic3AuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL21jYnNwLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPG1hY2gvZG1hLmg+CisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAjaW5jbHVkZSA8bWFjaC9tdXguaD4KICNpbmNsdWRlIDxtYWNoL2NwdS5oPgogI2luY2x1ZGUgPG1hY2gvbWNic3AuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2syNHh4LmggYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrMjR4eC5oCmluZGV4IGZmNmNkMTQuLmFkNmQ5OGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2syNHh4LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazI0eHguaApAQCAtMjMyMSw3ICsyMzIxLDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGkyY2hzMl9mY2sgPSB7Ci0JLm5hbWUJCT0gImkyY2hzX2ZjayIsCisJLm5hbWUJCT0gImkyY19mY2siLAogCS5pZAkJPSAyLAogCS5wYXJlbnQJCT0gJmZ1bmNfOTZtX2NrLAogCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMjQzWCwKQEAgLTIzNTQsNyArMjM1NCw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGNsayBpMmNoczFfZmNrID0gewotCS5uYW1lCQk9ICJpMmNoc19mY2siLAorCS5uYW1lCQk9ICJpMmNfZmNrIiwKIAkuaWQJCT0gMSwKIAkucGFyZW50CQk9ICZmdW5jXzk2bV9jaywKIAkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDI0M1gsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL21jYnNwLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL21jYnNwLmMKaW5kZXggY2FlM2ViZS4uYWNkYzcwOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9tY2JzcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvbWNic3AuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCiAjaW5jbHVkZSA8bWFjaC9kbWEuaD4KKyNpbmNsdWRlIDxtYWNoL2lycXMuaD4KICNpbmNsdWRlIDxtYWNoL211eC5oPgogI2luY2x1ZGUgPG1hY2gvY3B1Lmg+CiAjaW5jbHVkZSA8bWFjaC9tY2JzcC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3BjaS5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3BjaS5jCmluZGV4IGE3YjdkNzcuLmQwYTc4NWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9wY2kuYworKysgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcGNpLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9tYnVzLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgogI2luY2x1ZGUgPHBsYXQvcGNpZS5oPgogI2luY2x1ZGUgImNvbW1vbi5oIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2dwaW8uYyBiL2FyY2gvYXJtL21hY2gtcG54NDAwOC9ncGlvLmMKaW5kZXggMDE1Y2MyMS4uZjIxOTkxNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2dwaW8uYworKysgYi9hcmNoL2FybS9tYWNoLXBueDQwMDgvZ3Bpby5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXBueDQwMDgvaTJjLmMgYi9hcmNoL2FybS9tYWNoLXBueDQwMDgvaTJjLmMKaW5kZXggODdjMDkzMi4uZjNmZWEyOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2kyYy5jCisrKyBiL2FyY2gvYXJtL21hY2gtcG54NDAwOC9pMmMuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPG1hY2gvcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxtYWNoL2lycXMuaD4KICNpbmNsdWRlIDxtYWNoL2kyYy5oPgogCiBzdGF0aWMgaW50IHNldF9jbG9ja19ydW4oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2UzNTAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2UzNTAuYwppbmRleCAyNTExMjkzLi5lZGNkOWQ1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9lMzUwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvZTM1MC5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKKyNpbmNsdWRlIDxtYWNoL2lycXMuaD4KICNpbmNsdWRlIDxtYWNoL21mcC1weGEyNXguaD4KICNpbmNsdWRlIDxtYWNoL3B4YS1yZWdzLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvZTQwMC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvZTQwMC5jCmluZGV4IGJlZDAzMzYuLjc3YmI4ZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2U0MDAuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9lNDAwLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxtYWNoL2VzZXJpZXMtZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvcHhhZmIuaD4KICNpbmNsdWRlIDxtYWNoL3VkYy5oPgorI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogI2luY2x1ZGUgImVzZXJpZXMuaCIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2U3NDAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2U3NDAuYwppbmRleCBiMDBkNjcwLi42ZDQ4ZTAwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9lNzQwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvZTc0MC5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bWFjaC9lc2VyaWVzLWdwaW8uaD4KICNpbmNsdWRlIDxtYWNoL3VkYy5oPgogI2luY2x1ZGUgPG1hY2gvaXJkYS5oPgorI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogI2luY2x1ZGUgImVzZXJpZXMuaCIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2U3NTAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2U3NTAuYwppbmRleCA4NGQ3YzFhLi5iZTFhYjhlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9lNzUwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvZTc1MC5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bWFjaC9lc2VyaWVzLWdwaW8uaD4KICNpbmNsdWRlIDxtYWNoL3VkYy5oPgogI2luY2x1ZGUgPG1hY2gvaXJkYS5oPgorI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogI2luY2x1ZGUgImVzZXJpZXMuaCIKQEAgLTEwNSw2ICsxMDYsNTcgQEAKIAkucmVzb3VyY2UgICAgICAgPSBlNzUwX2ZiX3Jlc291cmNlcywKIH07CiAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tIGU3NTAgTUZQIHBhcmFtZXRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZTc1MF9waW5fY29uZmlnW10gX19pbml0ZGF0YSA9IHsKKwkvKiBDaGlwIHNlbGVjdHMgKi8KKwlHUElPMTVfbkNTXzEsICAgLyogQ1MxIC0gRmxhc2ggKi8KKwlHUElPNzlfbkNTXzMsICAgLyogQ1MzIC0gSU1BR0VPTiAqLworCUdQSU84MF9uQ1NfNCwgICAvKiBDUzQgLSBUTUlPICovCisKKwkvKiBDbG9ja3MgKi8KKwlHUElPMTFfM182TUh6LAorCisJLyogQlRVQVJUICovCisJR1BJTzQyX0JUVUFSVF9SWEQsCisJR1BJTzQzX0JUVUFSVF9UWEQsCisJR1BJTzQ0X0JUVUFSVF9DVFMsCisKKwkvKiBUTUlPIGNvbnRyb2xsZXIgKi8KKwlHUElPMTlfR1BJTywgLyogdDdsNjZ4YiAjUENMUiAqLworCUdQSU80NV9HUElPLCAvKiB0N2w2NnhiICNTVVNQRU5EIChOT1QgQlRVQVJUISkgKi8KKworCS8qIFVEQyAqLworCUdQSU8xM19HUElPLAorCUdQSU8zX0dQSU8sCisKKwkvKiBJckRBICovCisJR1BJTzM4X0dQSU8gfCBNRlBfTFBNX0RSSVZFX0hJR0gsCisKKwkvKiBQQyBDYXJkICovCisJR1BJTzhfR1BJTywgICAvKiBDRDAgKi8KKwlHUElPNDRfR1BJTywgIC8qIENEMSAqLworCUdQSU8xMV9HUElPLCAgLyogSVJRMCAqLworCUdQSU82X0dQSU8sICAgLyogSVJRMSAqLworCUdQSU8yN19HUElPLCAgLyogUlNUMCAqLworCUdQSU8yNF9HUElPLCAgLyogUlNUMSAqLworCUdQSU8yMF9HUElPLCAgLyogUFdSMCAqLworCUdQSU8yM19HUElPLCAgLyogUFdSMSAqLworCUdQSU80OF9uUE9FLAorCUdQSU80OV9uUFdFLAorCUdQSU81MF9uUElPUiwKKwlHUElPNTFfblBJT1csCisJR1BJTzUyX25QQ0VfMSwKKwlHUElPNTNfblBDRV8yLAorCUdQSU81NF9uUFNLVFNFTCwKKwlHUElPNTVfblBSRUcsCisJR1BJTzU2X25QV0FJVCwKKwlHUElPNTdfbklPSVMxNiwKKworCS8qIHdha2V1cCAqLworCUdQSU8wX0dQSU8gfCBXQUtFVVBfT05fRURHRV9SSVNFLAorfTsKKwogLyogLS0tLS0tLS0tLS0tLS0tLS0gZTc1MCB0YzYzOTN4YiBwYXJhbWV0ZXJzIC0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBzdGF0aWMgc3RydWN0IHRjNjM5M3hiX3BsYXRmb3JtX2RhdGEgZTc1MF90YzYzOTN4Yl9pbmZvID0gewpAQCAtMTM3LDYgKzE4OSw3IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBlNzUwX2luaXQodm9pZCkKIHsKKwlweGEyeHhfbWZwX2NvbmZpZyhBUlJBWV9BTkRfU0laRShlNzUwX3Bpbl9jb25maWcpKTsKIAljbGtfYWRkX2FsaWFzKCJDTEtfQ0szUDZNSSIsICZlNzUwX3RjNjM5M3hiX2RldmljZS5kZXYsCiAJCQkiR1BJTzExX0NMSyIsIE5VTEwpLAogCWVzZXJpZXNfZ2V0X3RtaW9fZ3Bpb3MoKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2U4MDAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2U4MDAuYwppbmRleCA5YTg2YTQyLi5jYzliMTI5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9lODAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvZTgwMC5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvZXNlcmllcy1ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC91ZGMuaD4KKyNpbmNsdWRlIDxtYWNoL2lycXMuaD4KIAogI2luY2x1ZGUgImdlbmVyaWMuaCIKICNpbmNsdWRlICJlc2VyaWVzLmgiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcHhhM3h4LXJlZ3MuaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGEzeHgtcmVncy5oCmluZGV4IGIxZmNkMTAuLmJjZjNmYjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGEzeHgtcmVncy5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGEzeHgtcmVncy5oCkBAIC0xOTMsMTAgKzE5Myw4IEBACiAjZGVmaW5lIENLRU5fTUlOSV9JTQk0OAkvKiA8IE1pbmktSU0gKi8KICNkZWZpbmUgQ0tFTl9NSU5JX0xDRAk0OQkvKiA8IE1pbmkgTENEICovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfUFhBMzEwKQogI2RlZmluZSBDS0VOX01NQzMJNQkvKiA8IE1NQzMgQ2xvY2sgRW5hYmxlICovCiAjZGVmaW5lIENLRU5fTVZFRAk0MwkvKiA8IE1WRUQgY2xvY2sgZW5hYmxlICovCi0jZW5kaWYKIAogLyogTm90ZTogR0NVIGNsb2NrIGVuYWJsZSBiaXQgZGlmZmVycyBvbiBQWEEzMDAvUFhBMzEwIGFuZCBQWEEzMjAgKi8KICNkZWZpbmUgUFhBMzAwX0NLRU5fR1JBUEhJQ1MJNDIJLyogR3JhcGhpY3MgY29udHJvbGxlciBjbG9jayBlbmFibGUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGE5MzBfcm90YXJ5LmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcHhhOTMwX3JvdGFyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MzU4N2MKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcHhhOTMwX3JvdGFyeS5oCkBAIC0wLDAgKzEsMjAgQEAKKyNpZm5kZWYgX19BU01fQVJDSF9QWEE5MzBfUk9UQVJZX0gKKyNkZWZpbmUgX19BU01fQVJDSF9QWEE5MzBfUk9UQVJZX0gKKworLyogTk9URToKKyAqCisgKiByb3RhcnkgY2FuIGJlIGVpdGhlciBpbnRlcnByZXRlZCBhcyBhIHJhbGF0aXZlIGlucHV0IGV2ZW50IChlLmcuCisgKiBSRUxfV0hFRUwgb3IgUkVMX0hXSEVFTCkgb3IgYSBzcGVjaWZpYyBrZXkgZXZlbnQgKGUuZy4gVVAvRE9XTgorICogb3IgTEVGVC9SSUdIVCksIGRlcGVuZGluZyBvbiBpZiB1cF9rZXkgJiBkb3duX2tleSBhcmUgYXNzaWduZWQKKyAqIG9yIHJlbF9jb2RlIGlzIGFzc2lnbmVkIGEgbm9uLXplcm8gdmFsdWUuIFdoZW4gYWxsIGFyZSBub24temVybywKKyAqIHVwX2tleSBhbmQgZG93bl9rZXkgd2lsbCBiZSBwcmVmZXJyZWQuCisgKi8KK3N0cnVjdCBweGE5MzBfcm90YXJ5X3BsYXRmb3JtX2RhdGEgeworCWludAl1cF9rZXk7CisJaW50CWRvd25fa2V5OworCWludAlyZWxfY29kZTsKK307CisKK3ZvaWQgX19pbml0IHB4YTkzMF9zZXRfcm90YXJ5a2V5X2luZm8oc3RydWN0IHB4YTkzMF9yb3RhcnlfcGxhdGZvcm1fZGF0YSAqaW5mbyk7CisKKyNlbmRpZiAvKiBfX0FTTV9BUkNIX1BYQTkzMF9ST1RBUllfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3B4YTkzMF90cmtiYWxsLmggYi9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcHhhOTMwX3Rya2JhbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTA3ODliCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvaW5jbHVkZS9tYWNoL3B4YTkzMF90cmtiYWxsLmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBfX0FTTV9BUkNIX1BYQTkzMF9UUktCQUxMX0gKKyNkZWZpbmUgX19BU01fQVJDSF9QWEE5MzBfVFJLQkFMTF9ICisKK3N0cnVjdCBweGE5MzBfdHJrYmFsbF9wbGF0Zm9ybV9kYXRhIHsKKwlpbnQgeF9maWx0ZXI7CisJaW50IHlfZmlsdGVyOworfTsKKworI2VuZGlmIC8qIF9fQVNNX0FSQ0hfUFhBOTMwX1RSS0JBTExfSCAqLworCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2NvcmUuaCBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvY29yZS5oCmluZGV4IDYzYmUyYWIuLjQ0MjY5YjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvY29yZS5oCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvY29yZS5oCkBAIC0zMSw3ICszMSw3IEBACiBzdGF0aWMgc3RydWN0IGFtYmFfZGV2aWNlIG5hbWUjI19kZXZpY2UgPSB7CQkJXAogCS5kZXYJCT0gewkJCQkJXAogCQkuY29oZXJlbnRfZG1hX21hc2sgPSB+MCwJCQlcCi0JCS5idXNfaWQJPSBidXNpZCwJCQkJXAorCQkuaW5pdF9uYW1lID0gYnVzaWQsCQkJCVwKIAkJLnBsYXRmb3JtX2RhdGEgPSBwbGF0LAkJCQlcCiAJfSwJCQkJCQkJXAogCS5yZXMJCT0gewkJCQkJXApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9wbGF0c21wLmMgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3BsYXRzbXAuYwppbmRleCA4ZmNlODVmLi5lYTNjNzU1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3BsYXRzbXAuYworKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3BsYXRzbXAuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2dwaW8uaAppbmRleCBlMDM0OWFmLi4wMDQ3NmE1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMTQsNiArMTQsNyBAQAogI2RlZmluZSBncGlvX2dldF92YWx1ZQlfX2dwaW9fZ2V0X3ZhbHVlCiAjZGVmaW5lIGdwaW9fc2V0X3ZhbHVlCV9fZ3Bpb19zZXRfdmFsdWUKICNkZWZpbmUgZ3Bpb19jYW5zbGVlcAlfX2dwaW9fY2Fuc2xlZXAKKyNkZWZpbmUgZ3Bpb190b19pcnEJX19ncGlvX3RvX2lycQogCiAvKiBzb21lIGJvYXJkcyByZXF1aXJlIGV4dHJhIGdwaW8gY2FwYWNpdHkgdG8gc3VwcG9ydCBleHRlcm5hbAogICogZGV2aWNlcyB0aGF0IG5lZWQgR1BJTy4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvaXJxcy5oIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9pcnFzLmgKaW5kZXggOTU2NTkwMy4uNDllZmNlOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9pcnFzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9pcnFzLmgKQEAgLTEyLDEwICsxMiw2IEBACiAjaWZuZGVmIF9fQVNNX0FSQ0hfSVJRU19ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfSVJRU19IIF9fRklMRV9fCiAKLSNpZm5kZWYgX19BU01fQVJNX0lSUV9ICi0jZXJyb3IgIkRvIG5vdCBpbmNsdWRlIHRoaXMgZGlyZWN0bHksIGluc3RlYWQgI2luY2x1ZGUgPGFzbS9pcnEuaD4iCi0jZW5kaWYKLQogLyogd2Uga2VlcCB0aGUgZmlyc3Qgc2V0IG9mIENQVSBJUlFzIG91dCBvZiB0aGUgcmFuZ2Ugb2YKICAqIHRoZSBJU0Egc3BhY2UsIHNvIHRoYXQgdGhlIFBDMTA0IGhhcyB0aGVtIHRvIGl0c2VsZgogICogYW5kIHdlIGRvbid0IGVuZCB1cCBoYXZpbmcgdG8gZG8gaG9ycmlibGUgdGhpbmdzIHRvIHRoZQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9zcGkuaCBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvc3BpLmgKaW5kZXggNzc0ZjNhZC4uMWQzMDBmYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9zcGkuaAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL3NwaS5oCkBAIC0xNCw3ICsxNCw3IEBACiAjZGVmaW5lIF9fQVNNX0FSQ0hfU1BJX0ggX19GSUxFX18KIAogc3RydWN0IHMzYzI0MTBfc3BpX2luZm8gewotCXVuc2lnbmVkIGxvbmcJCSBwaW5fY3M7CS8qIHNpbXBsZSBncGlvIGNzICovCisJaW50CQkJIHBpbl9jczsJLyogc2ltcGxlIGdwaW8gY3MgKi8KIAl1bnNpZ25lZCBpbnQJCSBudW1fY3M7CS8qIHRvdGFsIGNoaXBzZWxlY3RzICovCiAJaW50CQkJIGJ1c19udW07ICAgICAgIC8qIGJ1cyBudW1iZXIgdG8gdXNlLiAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1hdDI0NDBldmIuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLWF0MjQ0MGV2Yi5jCmluZGV4IDBhNmQwYTUuLjMxNWM0MmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLWF0MjQ0MGV2Yi5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQ0MC9tYWNoLWF0MjQ0MGV2Yi5jCkBAIC00Nyw3ICs0Nyw3IEBACiAjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgogI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgogI2luY2x1ZGUgPHBsYXQvY3B1Lmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXQtczNjMjR4eC9tY2kuaD4KKyNpbmNsdWRlIDxwbGF0L21jaS5oPgogCiBzdGF0aWMgc3RydWN0IG1hcF9kZXNjIGF0MjQ0MGV2Yl9pb2Rlc2NbXSBfX2luaXRkYXRhID0gewogCS8qIE5vdGhpbmcgaGVyZSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NDAwL2luY2x1ZGUvbWFjaC9pcnFzLmggYi9hcmNoL2FybS9tYWNoLXMzYzY0MDAvaW5jbHVkZS9tYWNoL2lycXMuaAppbmRleCBiMzhjNDdjLi40Yzk3ZjlhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0MDAvaW5jbHVkZS9tYWNoL2lycXMuaAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0MDAvaW5jbHVkZS9tYWNoL2lycXMuaApAQCAtMTEsMTAgKzExLDYgQEAKICNpZm5kZWYgX19BU01fQVJDSF9JUlFTX0gKICNkZWZpbmUgX19BU01fQVJDSF9JUlFTX0ggX19GSUxFX18KIAotI2lmbmRlZiBfX0FTTV9BUk1fSVJRX0gKLSNlcnJvciAiRG8gbm90IGluY2x1ZGUgdGhpcyBkaXJlY3RseSwgaW5zdGVhZCAjaW5jbHVkZSA8YXNtL2lycS5oPiIKLSNlbmRpZgotCiAjaW5jbHVkZSA8cGxhdC9pcnFzLmg+CiAKICNlbmRpZiAvKiBfX0FTTV9BUkNIX0lSUV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9jb3JlLmggYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9jb3JlLmgKaW5kZXggYWZjYWE4NS4uOWQzOTg4NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvY29yZS5oCisrKyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuaApAQCAtMzQsNyArMzQsNyBAQAogc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSBuYW1lIyNfZGV2aWNlID0gewkJCVwKIAkuZGV2CQk9IHsJCQkJCVwKIAkJLmNvaGVyZW50X2RtYV9tYXNrID0gfjAsCQkJXAotCQkuYnVzX2lkCT0gYnVzaWQsCQkJCVwKKwkJLmluaXRfbmFtZSA9IGJ1c2lkLAkJCQlcCiAJCS5wbGF0Zm9ybV9kYXRhID0gcGxhdCwJCQkJXAogCX0sCQkJCQkJCVwKIAkucmVzCQk9IHsJCQkJCVwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC91c2IuaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC91c2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGFjYjMwOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC91c2IuaApAQCAtMCwwICsxLDIzIEBACisvKgorICoJQ29weXJpZ2h0IChDKSAyMDA4IERhcml1cyBBdWd1bGlzIDxhdWd1bGlzLmRhcml1c0BnbWFpbC5jb20+CisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKglHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19BU01fQVJDSF9NWENfVVNCCisjZGVmaW5lIF9fQVNNX0FSQ0hfTVhDX1VTQgorCitzdHJ1Y3QgaW14dXNiX3BsYXRmb3JtX2RhdGEgeworCWludCAoKmluaXQpKHN0cnVjdCBkZXZpY2UgKik7CisJaW50ICgqZXhpdCkoc3RydWN0IGRldmljZSAqKTsKK307CisKKyNlbmRpZiAvKiBfX0FTTV9BUkNIX01YQ19VU0IgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pMmMuYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pMmMuYwppbmRleCA4OWE2YWIwLi40Njc1MzFlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaTJjLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2kyYy5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAjaW5jbHVkZSA8bWFjaC9tdXguaD4KIAogI2RlZmluZSBPTUFQX0kyQ19TSVpFCQkweDNmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvbWFjaC9tZW1vcnkuaAppbmRleCAyMTFjOWY2Li5kNmI1Y2E2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9tYWNoL21lbW9yeS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL21hY2gvbWVtb3J5LmgKQEAgLTU5LDcgKzU5LDcgQEAKIAogI2RlZmluZSB2aXJ0X3RvX2xidXMoeCkJCSgoeCkgLSBQQUdFX09GRlNFVCArIE9NQVAxNTEwX0xCX09GRlNFVCkKICNkZWZpbmUgbGJ1c190b192aXJ0KHgpCQkoKHgpIC0gT01BUDE1MTBfTEJfT0ZGU0VUICsgUEFHRV9PRkZTRVQpCi0jZGVmaW5lIGlzX2xidXNfZGV2aWNlKGRldikJKGNwdV9pc19vbWFwMTV4eCgpICYmIGRldiAmJiAoc3RybmNtcChkZXYtPmJ1c19pZCwgIm9oY2kiLCA0KSA9PSAwKSkKKyNkZWZpbmUgaXNfbGJ1c19kZXZpY2UoZGV2KQkoY3B1X2lzX29tYXAxNXh4KCkgJiYgZGV2ICYmIChzdHJuY21wKGRldl9uYW1lKGRldiksICJvaGNpIiwgNCkgPT0gMCkpCiAKICNkZWZpbmUgX19hcmNoX3BhZ2VfdG9fZG1hKGRldiwgcGFnZSkJKHtpc19sYnVzX2RldmljZShkZXYpID8gXAogCQkJCQkoZG1hX2FkZHJfdCl2aXJ0X3RvX2xidXMocGFnZV9hZGRyZXNzKHBhZ2UpKSA6IFwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC91c2IuYyBiL2FyY2gvYXJtL3BsYXQtb21hcC91c2IuYwppbmRleCA2N2NhMWUyLi5hZGQwNDg1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvdXNiLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL3VzYi5jCkBAIC03NywzOCArNzcsNiBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0jaWYJZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQX09URykgfHwgZGVmaW5lZChDT05GSUdfVVNCX01VU0JfT1RHKQotCi1zdGF0aWMgc3RydWN0IG90Z190cmFuc2NlaXZlciAqeGNlaXY7Ci0KLS8qKgotICogb3RnX2dldF90cmFuc2NlaXZlciAtIGZpbmQgdGhlIChzaW5nbGUpIE9URyB0cmFuc2NlaXZlciBkcml2ZXIKLSAqCi0gKiBSZXR1cm5zIHRoZSB0cmFuc2NlaXZlciBkcml2ZXIsIGFmdGVyIGdldHRpbmcgYSByZWZjb3VudCB0byBpdDsgb3IKLSAqIG51bGwgaWYgdGhlcmUgaXMgbm8gc3VjaCB0cmFuc2NlaXZlci4gIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yCi0gKiByZWxlYXNpbmcgdGhhdCBjb3VudC4KLSAqLwotc3RydWN0IG90Z190cmFuc2NlaXZlciAqb3RnX2dldF90cmFuc2NlaXZlcih2b2lkKQotewotCWlmICh4Y2VpdikKLQkJZ2V0X2RldmljZSh4Y2Vpdi0+ZGV2KTsKLQlyZXR1cm4geGNlaXY7Ci19Ci1FWFBPUlRfU1lNQk9MKG90Z19nZXRfdHJhbnNjZWl2ZXIpOwotCi1pbnQgb3RnX3NldF90cmFuc2NlaXZlcihzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyICp4KQotewotCWlmICh4Y2VpdiAmJiB4KQotCQlyZXR1cm4gLUVCVVNZOwotCXhjZWl2ID0geDsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0wob3RnX3NldF90cmFuc2NlaXZlcik7Ci0KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCiAjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQX09URykgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTVYWCkKIAogc3RhdGljIHZvaWQgb21hcDJfdXNiX2RldmNvbmZfY2xlYXIodTggcG9ydCwgdTMyIG1hc2spCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYy9kZXYtZmIuYyBiL2FyY2gvYXJtL3BsYXQtczNjL2Rldi1mYi5jCmluZGV4IDA0NTRiOGUuLmE5MDE5OGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjL2Rldi1mYi5jCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjL2Rldi1mYi5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZmIuaD4KIAorI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogI2luY2x1ZGUgPG1hY2gvbWFwLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWZiLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjL2Rldi1pMmMwLmMgYi9hcmNoL2FybS9wbGF0LXMzYy9kZXYtaTJjMC5jCmluZGV4IDJjMDEyOGMuLmZlMzI3MDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjL2Rldi1pMmMwLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MvZGV2LWkyYzAuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAjaW5jbHVkZSA8bWFjaC9tYXAuaD4KIAogI2luY2x1ZGUgPHBsYXQvcmVncy1paWMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjL2Rldi1pMmMxLmMgYi9hcmNoL2FybS9wbGF0LXMzYy9kZXYtaTJjMS5jCmluZGV4IDk2NThmYjAuLjIzODdmYmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjL2Rldi1pMmMxLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MvZGV2LWkyYzEuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAjaW5jbHVkZSA8bWFjaC9tYXAuaD4KIAogI2luY2x1ZGUgPHBsYXQvcmVncy1paWMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9ncGlvbGliLmMgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvZ3Bpb2xpYi5jCmluZGV4IGY5NWM2YzkuLjk0YTM0MWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9ncGlvbGliLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2dwaW9saWIuYwpAQCAtNTksNiArNTksMjIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBzM2MyNHh4X2dwaW9saWJfYmFua2ZfdG9pcnEoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCWlmIChvZmZzZXQgPCA0KQorCQlyZXR1cm4gSVJRX0VJTlQwICsgb2Zmc2V0OworCQorCWlmIChvZmZzZXQgPCA4KQorCQlyZXR1cm4gSVJRX0VJTlQ0ICsgb2Zmc2V0IC0gNDsKKwkKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBzM2MyNHh4X2dwaW9saWJfYmFua2dfdG9pcnEoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXJldHVybiBJUlFfRUlOVDggKyBvZmZzZXQ7Cit9CisKIHN0cnVjdCBzM2NfZ3Bpb19jaGlwIHMzYzI0eHhfZ3Bpb3NbXSA9IHsKIAlbMF0gPSB7CiAJCS5iYXNlCT0gUzNDMjRYWF9HUElPX0JBU0UoUzNDMjQxMF9HUEEwKSwKQEAgLTExNCw2ICsxMzAsNyBAQAogCQkJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIAkJCS5sYWJlbAkJCT0gIkdQSU9GIiwKIAkJCS5uZ3BpbwkJCT0gOCwKKwkJCS50b19pcnEJCQk9IHMzYzI0eHhfZ3Bpb2xpYl9iYW5rZl90b2lycSwKIAkJfSwKIAl9LAogCVs2XSA9IHsKQEAgLTEyMyw2ICsxNDAsNyBAQAogCQkJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIAkJCS5sYWJlbAkJCT0gIkdQSU9HIiwKIAkJCS5uZ3BpbwkJCT0gMTAsCisJCQkudG9faXJxCQkJPSBzM2MyNHh4X2dwaW9saWJfYmFua2dfdG9pcnEsCiAJCX0sCiAJfSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvcHdtLmMgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvcHdtLmMKaW5kZXggZWM1NmI4OC4uMDEyMGI3NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3B3bS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9wd20uYwpAQCAtMTksNiArMTksOCBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvcHdtLmg+CiAKKyNpbmNsdWRlIDxtYWNoL2lycXMuaD4KKwogI2luY2x1ZGUgPHBsYXQvZGV2cy5oPgogI2luY2x1ZGUgPHBsYXQvcmVncy10aW1lci5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzY0eHgvaW5jbHVkZS9wbGF0L2lycXMuaCBiL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvaXJxcy5oCmluZGV4IDAyZThkZDQuLjI4NDZmNTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvaXJxcy5oCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjNjR4eC9pbmNsdWRlL3BsYXQvaXJxcy5oCkBAIC0xOTEsNyArMTkxLDcgQEAKICNkZWZpbmUgSVJRX0VJTlRfR1JPVVA4X0JBU0UJKElSUV9FSU5UX0dST1VQN19CQVNFICsgSVJRX0VJTlRfR1JPVVA3X05SKQogI2RlZmluZSBJUlFfRUlOVF9HUk9VUDlfQkFTRQkoSVJRX0VJTlRfR1JPVVA4X0JBU0UgKyBJUlFfRUlOVF9HUk9VUDhfTlIpCiAKLSNkZWZpbmUgSVJRX0VJTlRfR1JPVVAoZ3JvdXAsIG5vKQkoSVJRX0VJTlRfR1JPVVAjI2dyb3VwIyNfX0JBU0UgKyAoeCkpCisjZGVmaW5lIElSUV9FSU5UX0dST1VQKGdyb3VwLCBubykJKElSUV9FSU5UX0dST1VQIyNncm91cCMjX0JBU0UgKyAobm8pKQogCiAvKiBTZXQgdGhlIGRlZmF1bHQgTlJfSVJRUyAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL0tjb25maWcgYi9hcmNoL2F2cjMyL0tjb25maWcKaW5kZXggMjZlY2E4N2YuLmIxODk2ODAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvS2NvbmZpZworKysgYi9hcmNoL2F2cjMyL0tjb25maWcKQEAgLTEyMiw2ICsxMjIsMjQgQEAKIAlib29sICJBVE5HVzEwMCBOZXR3b3JrIEdhdGV3YXkiCiAJc2VsZWN0IENQVV9BVDMyQVA3MDAwCiAKK2NvbmZpZyBCT0FSRF9IQU1NRVJIRUFECisJYm9vbCAiSGFtbWVyaGVhZCBib2FyZCIKKwlzZWxlY3QgQ1BVX0FUMzJBUDcwMDAKKwlzZWxlY3QgVVNCX0FSQ0hfSEFTX0hDRAorCWhlbHAKKwkgIFRoZSBIYW1tZXJoZWFkIHBsYXRmb3JtIGlzIGJ1aWx0IGFyb3VuZCBhIEFWUjMyIDMyLWJpdCBtaWNyb2NvbnRyb2xsZXIgZnJvbSBBdG1lbC4KKwkgIEl0IG9mZmVycyB2ZXJzYXRpbGUgcGVyaXBoZXJhbHMsIHN1Y2ggYXMgZXRoZXJuZXQsIHVzYiBkZXZpY2UsIHVzYiBob3N0IGV0Yy4KKworCSAgVGhlIGJvYXJkIGFsc28gaW5jb29wZXJhdGVzIGEgcG93ZXIgc3VwcGx5IGFuZCBpcyBhIFBvd2VyIG92ZXIgRXRoZXJuZXQgKFBvRSkgUG93ZXJlZAorCSAgRGV2aWNlIChQRCkuCisKKwkgIEFkZGl0b25hbGx5LCBhIEN5Y2xvbmUgSUlJIEZQR0EgZnJvbSBBbHRlcmEgaXMgaW50ZWdyYXRlZCBvbiB0aGUgYm9hcmQuIFRoZSBGUEdBIGlzCisJICBtYXBwZWQgaW50byB0aGUgMzItYml0IEFWUiBtZW1vcnkgYnVzLiBUaGUgRlBHQSBvZmZlcnMgdHdvIEREUjIgU0RSQU0gaW50ZXJmYWNlcywgd2hpY2gKKwkgIHdpbGwgY292ZXIgZXZlbiB0aGUgbW9zdCBleGNlcHRpb25hbCBuZWVkIG9mIG1lbW9yeSBiYW5kd2lkdGguIFRvZ2V0aGVyIHdpdGggdGhlIG9uYm9hcmQKKwkgIHZpZGVvIGRlY29kZXIgdGhlIGJvYXJkIGlzIHJlYWR5IGZvciB2aWRlbyBwcm9jZXNzaW5nLgorCisJICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWU6IGh0dHA6Ly93d3cubWlyb21pY28uY29tL2hhbW1lcmhlYWQKKwogY29uZmlnIEJPQVJEX0ZBVlJfMzIKIAlib29sICJGYXZyLTMyIExDRC1ib2FyZCIKIAlzZWxlY3QgQ1BVX0FUMzJBUDcwMDAKQEAgLTEzMyw2ICsxNTEsNyBAQAogCiBzb3VyY2UgImFyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9LY29uZmlnIgogc291cmNlICJhcmNoL2F2cjMyL2JvYXJkcy9hdG5ndzEwMC9LY29uZmlnIgorc291cmNlICJhcmNoL2F2cjMyL2JvYXJkcy9oYW1tZXJoZWFkL0tjb25maWciCiBzb3VyY2UgImFyY2gvYXZyMzIvYm9hcmRzL2ZhdnItMzIvS2NvbmZpZyIKIAogY2hvaWNlCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL01ha2VmaWxlIGIvYXJjaC9hdnIzMi9NYWtlZmlsZQppbmRleCBiMDg4ZTEwLi5mM2VmM2JiIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL01ha2VmaWxlCisrKyBiL2FyY2gvYXZyMzIvTWFrZWZpbGUKQEAgLTMzLDYgKzMzLDcgQEAKIGNvcmUteQkJCQkJKz0gJChtYWNoZGlycykKIGNvcmUtJChDT05GSUdfQk9BUkRfQVRTVEsxMDAwKQkJKz0gYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwLwogY29yZS0kKENPTkZJR19CT0FSRF9BVE5HVzEwMCkJCSs9IGFyY2gvYXZyMzIvYm9hcmRzL2F0bmd3MTAwLworY29yZS0kKENPTkZJR19CT0FSRF9IQU1NRVJIRUFEKQkJKz0gYXJjaC9hdnIzMi9ib2FyZHMvaGFtbWVyaGVhZC8KIGNvcmUtJChDT05GSUdfQk9BUkRfRkFWUl8zMikJCSs9IGFyY2gvYXZyMzIvYm9hcmRzL2ZhdnItMzIvCiBjb3JlLSQoQ09ORklHX0JPQVJEX01JTUMyMDApCQkrPSBhcmNoL2F2cjMyL2JvYXJkcy9taW1jMjAwLwogY29yZS0kKENPTkZJR19MT0FERVJfVV9CT09UKQkJKz0gYXJjaC9hdnIzMi9ib290L3UtYm9vdC8KZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvYm9hcmRzL2F0bmd3MTAwL3NldHVwLmMgYi9hcmNoL2F2cjMyL2JvYXJkcy9hdG5ndzEwMC9zZXR1cC5jCmluZGV4IDMyZmI5YmEuLjA1ZDM3MjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvYm9hcmRzL2F0bmd3MTAwL3NldHVwLmMKKysrIGIvYXJjaC9hdnIzMi9ib2FyZHMvYXRuZ3cxMDAvc2V0dXAuYwpAQCAtMTksOCArMTksOCBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbGVkcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1lbC1tY2kuaD4KIAotI2luY2x1ZGUgPGFzbS9hdG1lbC1tY2kuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL2F0c3RrMTAwMi5jIGIvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL2F0c3RrMTAwMi5jCmluZGV4IDVjNWNkZjMuLjFmMzNhMTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9hdHN0azEwMDIuYworKysgYi9hcmNoL2F2cjMyL2JvYXJkcy9hdHN0azEwMDAvYXRzdGsxMDAyLmMKQEAgLTE2LDEyICsxNiwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9hdDczYzIxMy5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bWVsLW1jaS5oPgogCiAjaW5jbHVkZSA8dmlkZW8vYXRtZWxfbGNkYy5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+Ci0jaW5jbHVkZSA8YXNtL2F0bWVsLW1jaS5oPgogCiAjaW5jbHVkZSA8bWFjaC9hdDMyYXA3MDB4Lmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgpAQCAtMjg3LDIzICsyODcsNyBAQAogCSAqIEFUU1RLMTAwMCB1c2VzIDMyLWJpdCBTRFJBTSBpbnRlcmZhY2UuIFJlc2VydmUgdGhlCiAJICogU0RSQU0tc3BlY2lmaWMgcGlucyBzbyB0aGF0IG5vYm9keSBtZXNzZXMgd2l0aCB0aGVtLgogCSAqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMCkpOwkvKiBEQVRBWzE2XQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMSkpOwkvKiBEQVRBWzE3XQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMikpOwkvKiBEQVRBWzE4XQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMykpOwkvKiBEQVRBWzE5XQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoNCkpOwkvKiBEQVRBWzIwXQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoNSkpOwkvKiBEQVRBWzIxXQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoNikpOwkvKiBEQVRBWzIyXQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoNykpOwkvKiBEQVRBWzIzXQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoOCkpOwkvKiBEQVRBWzI0XQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoOSkpOwkvKiBEQVRBWzI1XQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMTApKTsJLyogREFUQVsyNl0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDExKSk7CS8qIERBVEFbMjddCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSgxMikpOwkvKiBEQVRBWzI4XQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMTMpKTsJLyogREFUQVsyOV0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDE0KSk7CS8qIERBVEFbMzBdCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSgxNSkpOwkvKiBEQVRBWzMxXQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMjYpKTsJLyogU0RDUwkJKi8KKwlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElPRV9CQVNFLCBBVE1FTF9FQklfUEVfREFUQV9BTEwpOwogCiAjaWZkZWYgQ09ORklHX0JPQVJEX0FUU1RLMTAwNgogCXNtY19zZXRfdGltaW5nKCZuYW5kX2NvbmZpZywgJm5hbmRfdGltaW5nKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9hdHN0azEwMDMuYyBiL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9hdHN0azEwMDMuYwppbmRleCAxMzRiNTY2Li5iM2EyM2M4IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2JvYXJkcy9hdHN0azEwMDAvYXRzdGsxMDAzLmMKKysrIGIvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL2F0c3RrMTAwMy5jCkBAIC0xNyw5ICsxNyw5IEBACiAKICNpbmNsdWRlIDxsaW51eC9zcGkvYXQ3M2MyMTMuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvYXRtZWwtbWNpLmg+CiAKICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KLSNpbmNsdWRlIDxhc20vYXRtZWwtbWNpLmg+CiAKICNpbmNsdWRlIDxtYWNoL2F0MzJhcDcwMHguaD4KICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+CkBAIC0xMzEsMjMgKzEzMSw3IEBACiAJICogQVRTVEsxMDAwIHVzZXMgMzItYml0IFNEUkFNIGludGVyZmFjZS4gUmVzZXJ2ZSB0aGUKIAkgKiBTRFJBTS1zcGVjaWZpYyBwaW5zIHNvIHRoYXQgbm9ib2R5IG1lc3NlcyB3aXRoIHRoZW0uCiAJICovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSgwKSk7CS8qIERBVEFbMTZdCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSgxKSk7CS8qIERBVEFbMTddCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSgyKSk7CS8qIERBVEFbMThdCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSgzKSk7CS8qIERBVEFbMTldCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSg0KSk7CS8qIERBVEFbMjBdCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSg1KSk7CS8qIERBVEFbMjFdCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSg2KSk7CS8qIERBVEFbMjJdCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSg3KSk7CS8qIERBVEFbMjNdCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSg4KSk7CS8qIERBVEFbMjRdCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSg5KSk7CS8qIERBVEFbMjVdCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSgxMCkpOwkvKiBEQVRBWzI2XQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMTEpKTsJLyogREFUQVsyN10JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDEyKSk7CS8qIERBVEFbMjhdCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSgxMykpOwkvKiBEQVRBWzI5XQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMTQpKTsJLyogREFUQVszMF0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDE1KSk7CS8qIERBVEFbMzFdCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSgyNikpOwkvKiBTRENTCQkqLworCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU9FX0JBU0UsIEFUTUVMX0VCSV9QRV9EQVRBX0FMTCk7CiAKICNpZmRlZglDT05GSUdfQk9BUkRfQVRTVEsxMDBYX1NXMl9DVVNUT00KIAlhdDMyX2FkZF9kZXZpY2VfdXNhcnQoMSk7CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2JvYXJkcy9hdHN0azEwMDAvYXRzdGsxMDA0LmMgYi9hcmNoL2F2cjMyL2JvYXJkcy9hdHN0azEwMDAvYXRzdGsxMDA0LmMKaW5kZXggY2IzMmViOC4uMjliMzVhYyAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL2F0c3RrMTAwNC5jCisrKyBiL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9hdHN0azEwMDQuYwpAQCAtMTcsMTEgKzE3LDExIEBACiAKICNpbmNsdWRlIDxsaW51eC9zcGkvYXQ3M2MyMTMuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvYXRtZWwtbWNpLmg+CiAKICNpbmNsdWRlIDx2aWRlby9hdG1lbF9sY2RjLmg+CiAKICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KLSNpbmNsdWRlIDxhc20vYXRtZWwtbWNpLmg+CiAKICNpbmNsdWRlIDxtYWNoL2F0MzJhcDcwMHguaD4KICNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2JvYXJkcy9mYXZyLTMyL3NldHVwLmMgYi9hcmNoL2F2cjMyL2JvYXJkcy9mYXZyLTMyL3NldHVwLmMKaW5kZXggMWVlNGZhZi4uNzQ1YzQwOCAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9ib2FyZHMvZmF2ci0zMi9zZXR1cC5jCisrKyBiL2FyY2gvYXZyMzIvYm9hcmRzL2ZhdnItMzIvc2V0dXAuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvbGVkcy5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bWVsLW1jaS5oPgogI2luY2x1ZGUgPGxpbnV4L2F0bWVsLXB3bS1ibC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvYWRzNzg0Ni5oPgpAQCAtNzksNiArODAsMTQgQEAKIAl9LAogfTsKIAorc3RhdGljIHN0cnVjdCBtY2lfcGxhdGZvcm1fZGF0YSBfX2luaXRkYXRhIG1jaTBfZGF0YSA9IHsKKwkuc2xvdFswXSA9IHsKKwkJLmJ1c193aWR0aAk9IDQsCisJCS5kZXRlY3RfcGluCT0gLUVOT0RFViwKKwkJLndwX3BpbgkJPSAtRU5PREVWLAorCX0sCit9OworCiBzdGF0aWMgc3RydWN0IGZiX3ZpZGVvbW9kZSBfX2luaXRkYXRhIGxiMTA0djAzX21vZGVzW10gPSB7CiAJewogCQkubmFtZQkJPSAiNjQweDQ4MCBAIDUwIiwKQEAgLTMwNywyOCArMzE2LDEwIEBACiAJICogRmF2ci0zMiB1c2VzIDMyLWJpdCBTRFJBTSBpbnRlcmZhY2UuIFJlc2VydmUgdGhlIFNEUkFNLXNwZWNpZmljCiAJICogcGlucyBzbyB0aGF0IG5vYm9keSBtZXNzZXMgd2l0aCB0aGVtLgogCSAqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMCkpOwkvKiBEQVRBWzE2XQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMSkpOwkvKiBEQVRBWzE3XQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMikpOwkvKiBEQVRBWzE4XQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMykpOwkvKiBEQVRBWzE5XQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoNCkpOwkvKiBEQVRBWzIwXQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoNSkpOwkvKiBEQVRBWzIxXQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoNikpOwkvKiBEQVRBWzIyXQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoNykpOwkvKiBEQVRBWzIzXQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoOCkpOwkvKiBEQVRBWzI0XQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoOSkpOwkvKiBEQVRBWzI1XQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMTApKTsJLyogREFUQVsyNl0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDExKSk7CS8qIERBVEFbMjddCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSgxMikpOwkvKiBEQVRBWzI4XQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMTMpKTsJLyogREFUQVsyOV0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDE0KSk7CS8qIERBVEFbMzBdCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSgxNSkpOwkvKiBEQVRBWzMxXQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMjYpKTsJLyogU0RDUwkJKi8KKwlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElPRV9CQVNFLCBBVE1FTF9FQklfUEVfREFUQV9BTEwpOwogCiAJYXQzMl9zZWxlY3RfZ3BpbyhHUElPX1BJTl9QQigzKSwgMCk7CS8qIElSUSBmcm9tIEFEUzc4NDMgKi8KIAotCWF0MzJfYWRkX3N5c3RlbV9kZXZpY2VzKCk7Ci0KIAlhdDMyX2FkZF9kZXZpY2VfdXNhcnQoMCk7CiAKIAlzZXRfaHdfYWRkcihhdDMyX2FkZF9kZXZpY2VfZXRoKDAsICZldGhfZGF0YVswXSkpOwpAQCAtMzM5LDcgKzMzMCw3IEBACiAKIAlhdDMyX2FkZF9kZXZpY2VfcHdtKDEgPDwgYXRtZWxfcHdtX2JsX3BkYXRhLnB3bV9jaGFubmVsKTsKIAlhdDMyX2FkZF9kZXZpY2Vfc3BpKDEsIHNwaTFfYm9hcmRfaW5mbywgQVJSQVlfU0laRShzcGkxX2JvYXJkX2luZm8pKTsKLQlhdDMyX2FkZF9kZXZpY2VfbWNpKDAsIE5VTEwpOworCWF0MzJfYWRkX2RldmljZV9tY2koMCwgJm1jaTBfZGF0YSk7CiAJYXQzMl9hZGRfZGV2aWNlX3VzYmEoMCwgTlVMTCk7CiAJYXQzMl9hZGRfZGV2aWNlX2xjZGMoMCwgJmZhdnIzMl9sY2RjX2RhdGEsIGZibWVtX3N0YXJ0LCBmYm1lbV9zaXplLCAwKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9ib2FyZHMvaGFtbWVyaGVhZC9LY29uZmlnIGIvYXJjaC9hdnIzMi9ib2FyZHMvaGFtbWVyaGVhZC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYTIzMzEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2F2cjMyL2JvYXJkcy9oYW1tZXJoZWFkL0tjb25maWcKQEAgLTAsMCArMSw0MyBAQAorIyBIYW1tZXJoZWFkIGN1c3RvbWl6YXRpb24KKworaWYgQk9BUkRfSEFNTUVSSEVBRAorCitjb25maWcgQk9BUkRfSEFNTUVSSEVBRF9VU0IKKwlib29sICJQaGlsaXBzIElTUDExNngtaGNkIFVTQiBzdXBwb3J0IgorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBVU0Igc3VwcG9ydCBmb3IgSGFtbWVyaGVhZHMgaW50ZXJuYWwgSVNQMTE2eAorCSAgY29udHJvbGxlciBmcm9tIFBoaWxpcHMuCisKKwkgIENob29zZSAnWScgaGVyZSBpZiB5b3Ugd2FudCB0byBoYXZlIHlvdXIgYm9hcmQgVVNCIGRyaXZlbi4KKworY29uZmlnIEJPQVJEX0hBTU1FUkhFQURfTENECisJYm9vbCAiQXRtZWwgQVQ5MS9BVDMyIExDRCBzdXBwb3J0IgorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBMQ0Qgc3VwcG9ydCBmb3IgdGhlIEhhbW1lcmhlYWQgYm9hcmQuIFlvdSBtYXkKKwkgIGFsc28gYWRkIHN1cHBvcnQgZm9yIGZyYW1lYnVmZmVyIGRldmljZXMgKEFUOTEvQVQzMiBMQ0QgQ29udHJvbGxlcikKKwkgIGFuZCBmcmFtZWJ1ZmZlciBjb25zb2xlIHN1cHBvcnQgdG8gZ2V0IHRoZSBtb3N0IG91dCBvZiB5b3VyIExDRC4KKworCSAgQ2hvb3NlICdZJyBoZXJlIGlmIHlvdSBoYXZlIG9yZGVyZWQgYSBDb3JvbmEgZGF1Z3RoZXIgYm9hcmQgYW5kCisJICB3YW50IHRvIGhhdmUgc3VwcG9ydCBmb3IgeW91ciBIYW50cm9uaXggSERBLTM1MVQtTFYgTENELgorCitjb25maWcgQk9BUkRfSEFNTUVSSEVBRF9TTkQKKwlib29sICJBdG1lbCBBQzk3IFNvdW5kIHN1cHBvcnQiCisJaGVscAorCSAgVGhpcyBlbmFibGVzIFNvdW5kIHN1cHBvcnQgZm9yIHRoZSBIYW1tZXJoZWFkIGJvYXJkLiBZb3UgbWF5CisJICBhbHNvIGdvIHRyb3VnaCB0aGUgQUxTQSBzZXR0aW5ncyB0byBnZXQgaXQgd29ya2luZy4KKworCSAgQ2hvb3NlICdZJyBoZXJlIGlmIHlvdSBoYXZlIG9yZGVyZWQgYSBDb3JvbmEgZGF1Z3RoZXIgYm9hcmQgYW5kCisJICB3YW50IHRvIG1ha2UgeW91ciBib2FyZCBmdW5reS4KKworY29uZmlnIEJPQVJEX0hBTU1FUkhFQURfRlBHQQorCWJvb2wgIkhhbW1lcmhlYWQgRlBHQSBTdXBwb3J0IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoaXMgYWRkcyBzdXBwb3J0IGZvciB0aGUgQ3ljbG9uZSBJSUkgRlBHQSBmcm9tIEFsdGVyYQorCSAgZm91bmQgb24gTWlyb21pY28ncyBIYW1tZXJoZWFkIGJvYXJkLgorCisJICBDaG9vc2UgJ1knIGhlcmUgaWYgeW91IHdhbnQgdG8gaGF2ZSBGUEdBIHN1cHBvcnQgZW5hYmxlZC4KKwkgIFlvdSB3aWxsIGhhdmUgdG8gY2hvb3NlIHRoZSAiSGFtbWVyaGVhZCBGUEdBIERldmljZSBTdXBwb3J0IiBpbgorCSAgRGV2aWNlIERyaXZlcnMtPk1pc2MgdG8gYmUgYWJsZSB0byB1c2UgRlBHQSBmdW5jdGlvbmFsaXR5LgorCitlbmRpZgkjIEJPQVJEX0FUTkdXMTAwCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2JvYXJkcy9oYW1tZXJoZWFkL01ha2VmaWxlIGIvYXJjaC9hdnIzMi9ib2FyZHMvaGFtbWVyaGVhZC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzQwYWExCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hdnIzMi9ib2FyZHMvaGFtbWVyaGVhZC9NYWtlZmlsZQpAQCAtMCwwICsxIEBACitvYmoteQkJCQkrPSBzZXR1cC5vIGZsYXNoLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvYm9hcmRzL2hhbW1lcmhlYWQvZmxhc2guYyBiL2FyY2gvYXZyMzIvYm9hcmRzL2hhbW1lcmhlYWQvZmxhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOThjNmRkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hdnIzMi9ib2FyZHMvaGFtbWVyaGVhZC9mbGFzaC5jCkBAIC0wLDAgKzEsMzc3IEBACisvKgorICogSGFtbWVyaGVhZCBib2FyZC1zcGVjaWZpYyBmbGFzaCBpbml0aWFsaXphdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBNaXJvbWljbyBBRworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9pc3AxMTZ4Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8bWFjaC9wb3J0bXV4Lmg+CisjaW5jbHVkZSA8bWFjaC9hdDMyYXA3MDB4Lmg+CisjaW5jbHVkZSA8bWFjaC9zbWMuaD4KKworI2luY2x1ZGUgIi4uLy4uL21hY2gtYXQzMmFwL2Nsb2NrLmgiCisjaW5jbHVkZSAiZmxhc2guaCIKKworCisjZGVmaW5lIEhBTU1FUkhFQURfVVNCX1BFUklQSF9HQ0xLMAkweDQwMDAwMDAwCisjZGVmaW5lIEhBTU1FUkhFQURfVVNCX1BFUklQSF9DUzIJMHgwMjAwMDAwMAorI2RlZmluZSBIQU1NRVJIRUFEX1VTQl9QRVJJUEhfRVhUSU5UMAkweDAyMDAwMDAwCisKKyNkZWZpbmUgSEFNTUVSSEVBRF9GUEdBX1BFUklQSF9NT1NJCTB4MDAwMDAwMDIKKyNkZWZpbmUgSEFNTUVSSEVBRF9GUEdBX1BFUklQSF9TQ0sJMHgwMDAwMDAyMAorI2RlZmluZSBIQU1NRVJIRUFEX0ZQR0FfUEVSSVBIX0VYVElOVDMJMHgxMDAwMDAwMAorCitzdGF0aWMgc3RydWN0IHNtY190aW1pbmcgZmxhc2hfdGltaW5nIF9faW5pdGRhdGEgPSB7CisJLm5jc19yZWFkX3NldHVwCQk9IDAsCisJLm5yZF9zZXR1cAkJPSA0MCwKKwkubmNzX3dyaXRlX3NldHVwCT0gMCwKKwkubndlX3NldHVwCQk9IDEwLAorCisJLm5jc19yZWFkX3B1bHNlCQk9IDgwLAorCS5ucmRfcHVsc2UJCT0gNDAsCisJLm5jc193cml0ZV9wdWxzZQk9IDY1LAorCS5ud2VfcHVsc2UJCT0gNTUsCisKKwkucmVhZF9jeWNsZQkJPSAxMjAsCisJLndyaXRlX2N5Y2xlCQk9IDEyMCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc21jX2NvbmZpZyBmbGFzaF9jb25maWcgX19pbml0ZGF0YSA9IHsKKwkuYnVzX3dpZHRoCQk9IDIsCisJLm5yZF9jb250cm9sbGVkCQk9IDEsCisJLm53ZV9jb250cm9sbGVkCQk9IDEsCisJLmJ5dGVfd3JpdGUJCT0gMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBmbGFzaF9wYXJ0c1tdID0geworCXsKKwkJLm5hbWUJCT0gInUtYm9vdCIsCisJCS5vZmZzZXQJCT0gMHgwMDAwMDAwMCwKKwkJLnNpemUJCT0gMHgwMDAyMDAwMCwgICAgICAgICAgIC8qIDEyOCBLaUIgKi8KKwkJLm1hc2tfZmxhZ3MJPSBNVERfV1JJVEVBQkxFLAorCX0sCisJeworCQkubmFtZQkJPSAicm9vdCIsCisJCS5vZmZzZXQJCT0gMHgwMDAyMDAwMCwKKwkJLnNpemUJCT0gMHgwMDdkMDAwMCwKKwl9LAorCXsKKwkJLm5hbWUJCT0gImVudiIsCisJCS5vZmZzZXQJCT0gMHgwMDdmMDAwMCwKKwkJLnNpemUJCT0gMHgwMDAxMDAwMCwKKwkJLm1hc2tfZmxhZ3MJPSBNVERfV1JJVEVBQkxFLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSBmbGFzaF9kYXRhID0geworCS53aWR0aAkJPSAyLAorCS5ucl9wYXJ0cwk9IEFSUkFZX1NJWkUoZmxhc2hfcGFydHMpLAorCS5wYXJ0cwkJPSBmbGFzaF9wYXJ0cywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZmxhc2hfcmVzb3VyY2UgPSB7CisJLnN0YXJ0CQk9IDB4MDAwMDAwMDAsCisJLmVuZAkJPSAweDAwN2ZmZmZmLAorCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGZsYXNoX2RldmljZSA9IHsKKwkubmFtZQkJPSAicGh5c21hcC1mbGFzaCIsCisJLmlkCQk9IDAsCisJLnJlc291cmNlCT0gJmZsYXNoX3Jlc291cmNlLAorCS5udW1fcmVzb3VyY2VzCT0gMSwKKwkuZGV2CQk9IHsgLnBsYXRmb3JtX2RhdGEgPSAmZmxhc2hfZGF0YSwgfSwKK307CisKKyNpZmRlZiBDT05GSUdfQk9BUkRfSEFNTUVSSEVBRF9VU0IKKworc3RhdGljIHN0cnVjdCBzbWNfdGltaW5nIGlzcDExNjBfdGltaW5nIF9faW5pdGRhdGEgPSB7CisJLm5jc19yZWFkX3NldHVwCQk9IDc1LAorCS5ucmRfc2V0dXAJCT0gNzUsCisJLm5jc193cml0ZV9zZXR1cAk9IDc1LAorCS5ud2Vfc2V0dXAJCT0gNzUsCisKKworCS8qIFdlIHVzZSBjb25zZXJ2YXRpdmUgdGltaW5nIHNldHRpbmdzLCBhcyB0aGUgbWluaW1hbCBzZXR0aW5ncyBhcmVuJ3QKKwkgICBzdGFibGUuIFRoZXJlIG1heSBiZSByb29tIGZvciB0d2Vha2luZy4gKi8KKwkubmNzX3JlYWRfcHVsc2UJCT0gNzUsICAvKiBtaW4uIDMzbnMgKi8KKwkubnJkX3B1bHNlCQk9IDc1LCAgLyogbWluLiAzM25zICovCisJLm5jc193cml0ZV9wdWxzZQk9IDc1LCAgLyogbWluLiAyNm5zICovCisJLm53ZV9wdWxzZQkJPSA3NSwgIC8qIG1pbi4gMjZucyAqLworCisJLnJlYWRfY3ljbGUJCT0gMjI1LCAvKiBtaW4uIDE0M25zICovCisJLndyaXRlX2N5Y2xlCQk9IDIyNSwgLyogbWluLiAxMzZucyAqLworfTsKKworc3RhdGljIHN0cnVjdCBzbWNfY29uZmlnIGlzcDExNjBfY29uZmlnIF9faW5pdGRhdGEgPSB7CisJLmJ1c193aWR0aAkJPSAyLAorCS5ucmRfY29udHJvbGxlZAkJPSAxLAorCS5ud2VfY29udHJvbGxlZAkJPSAxLAorCS5ieXRlX3dyaXRlCQk9IDAsCit9OworCisvKgorICogVGhlIHBsYXRmb3JtIGRlbGF5IGZ1bmN0aW9uIGlzIG9ubHkgdXNlZCB0byBlbmZvcmNlIHRoZSBzdHJhbmdlCisgKiByZWFkIHRvIHdyaXRlIGRlbGF5LiBUaGlzIGNhbiBub3QgYmUgY29uZmlndXJlZCBpbiB0aGUgU01DLiBBbGwgb3RoZXIKKyAqIHRpbWluZ3MgYXJlIGNvbnRyb2xsZWQgYnkgdGhlIFNNQyAoc2VlIHRpbWluZ3Mgb2JvdmUpCisgKiBTbyBpbiBpc3AxMTZ4LWhjZC5jIHdlIHNob3VsZCBjb21tZW50IG91dCBVU0VfUExBVEZPUk1fREVMQVkKKyAqLwordm9pZCBpc3AxMTZ4X2RlbGF5KHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGRlbGF5KQoreworCWlmIChkZWxheSA+IDE1MCkKKwkJbmRlbGF5KGRlbGF5IC0gMTUwKTsKK30KKworc3RhdGljIHN0cnVjdCAgaXNwMTE2eF9wbGF0Zm9ybV9kYXRhIGlzcDExNjBfZGF0YSA9IHsKKwkuc2VsMTVLcmVzCQk9IDEsCS8qIHVzZSBpbnRlcm5hbCBkb3duc3RyZWFtIHJlc2lzdG9ycyAqLworCS5vY19lbmFibGUJCT0gMCwJLyogZXh0ZXJuYWwgb3ZlcmN1cnJlbnQgZGV0ZWN0aW9uICovCisJLmludF9lZGdlX3RyaWdnZXJlZAk9IDAsCS8qIGludGVycnVwdCBpcyBsZXZlbCB0cmlnZ2VyZWQgKi8KKwkuaW50X2FjdF9oaWdoCQk9IDAsCS8qIGludGVycnVwdCBpcyBhY3RpdmUgbG93ICovCisJLmRlbGF5ID0gaXNwMTE2eF9kZWxheSwJCS8qIHBsYXRmb3JtIGRlbGF5IGZ1bmN0aW9uICovCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGlzcDExNjBfcmVzb3VyY2VbXSA9IHsKKwl7CisJCS5zdGFydAkJPSAweDA4MDAwMDAwLAorCQkuZW5kCQk9IDB4MDgwMDAwMDEsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0CQk9IDB4MDgwMDAwMDIsCisJCS5lbmQJCT0gMHgwODAwMDAwMywKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkuc3RhcnQJCT0gNjQsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaXNwMTE2MF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gImlzcDExNngtaGNkIiwKKwkuaWQJCT0gMCwKKwkucmVzb3VyY2UJPSBpc3AxMTYwX3Jlc291cmNlLAorCS5udW1fcmVzb3VyY2VzCT0gMywKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmaXNwMTE2MF9kYXRhLAorCX0sCit9OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQk9BUkRfSEFNTUVSSEVBRF9VU0IKK3N0YXRpYyBpbnQgX19pbml0IGhhbW1lcmhlYWRfdXNiaF9pbml0KHZvaWQpCit7CisJc3RydWN0IGNsayAqZ2NsazsKKwlzdHJ1Y3QgY2xrICpvc2M7CisKKwlpbnQgcmV0OworCisJLyogc2V0dXAgc21jIGZvciB1c2JoICovCisJc21jX3NldF90aW1pbmcoJmlzcDExNjBfY29uZmlnLCAmaXNwMTE2MF90aW1pbmcpOworCXJldCA9IHNtY19zZXRfY29uZmlndXJhdGlvbigyLCAmaXNwMTE2MF9jb25maWcpOworCisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiaGFtbWVyaGVhZDogZmFpbGVkIHRvIHNldCBJU1AxMTYwIFVTQkggdGltaW5nXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBzZXR1cCBnY2xrMCB0byBydW4gZnJvbSBvc2MxICovCisJZ2NsayA9IGNsa19nZXQoTlVMTCwgImdjbGswIik7CisJaWYgKElTX0VSUihnY2xrKSkKKwkJZ290byBlcnJfZ2NsazsKKworCW9zYyA9IGNsa19nZXQoTlVMTCwgIm9zYzEiKTsKKwlpZiAoSVNfRVJSKG9zYykpCisJCWdvdG8gZXJyX29zYzsKKworCWlmIChjbGtfc2V0X3BhcmVudChnY2xrLCBvc2MpKSB7CisJCXByX2RlYnVnKCJoYW1tZXJoZWFkOiBmYWlsZWQgdG8gc2V0IG9zYzEgZm9yIFVTQkggY2xvY2tcbiIpOworCQlnb3RvIGVycl9zZXRfY2xrOworCX0KKworCS8qIHNldCBjbG9jayB0byA2TUh6ICovCisJY2xrX3NldF9yYXRlKGdjbGssIDYwMDAwMDApOworCisJLyogYW5kIGVuYWJsZSAqLworCWNsa19lbmFibGUoZ2Nsayk7CisKKwkvKiBzZWxlY3QgR0NMSzAgcGVyaXBoZXJhbCBmdW5jdGlvbiAqLworCWF0MzJfc2VsZWN0X3BlcmlwaChHUElPX1BJT0FfQkFTRSwgSEFNTUVSSEVBRF9VU0JfUEVSSVBIX0dDTEswLAorCQkJICAgR1BJT19QRVJJUEhfQSwgMCk7CisKKwkvKiBlbmFibGUgQ1MyIHBlcmlwaGVyYWwgZnVuY3Rpb24gKi8KKwlhdDMyX3NlbGVjdF9wZXJpcGgoR1BJT19QSU9FX0JBU0UsIEhBTU1FUkhFQURfVVNCX1BFUklQSF9DUzIsCisJCQkgICBHUElPX1BFUklQSF9BLCAwKTsKKworCS8qIEhfV0FLRVVQIG11c3QgYmUgZHJpdmVuIGxvdyAqLworCWF0MzJfc2VsZWN0X2dwaW8oR1BJT19QSU5fUEEoOCksIEFUMzJfR1BJT0ZfT1VUUFVUKTsKKworCS8qIFNlbGVjdCBFWFRJTlQwIGZvciBQQjI1ICovCisJYXQzMl9zZWxlY3RfcGVyaXBoKEdQSU9fUElPQl9CQVNFLCBIQU1NRVJIRUFEX1VTQl9QRVJJUEhfRVhUSU5UMCwKKwkJCSAgIEdQSU9fUEVSSVBIX0EsIDApOworCisJLyogcmVnaXN0ZXIgdXNiaCBkZXZpY2UgZHJpdmVyICovCisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZpc3AxMTYwX2RldmljZSk7CisKKyBlcnJfc2V0X2NsazoKKwljbGtfcHV0KG9zYyk7CisgZXJyX29zYzoKKwljbGtfcHV0KGdjbGspOworIGVycl9nY2xrOgorCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19CT0FSRF9IQU1NRVJIRUFEX0ZQR0EKK3N0YXRpYyBzdHJ1Y3Qgc21jX3RpbWluZyBmcGdhX3RpbWluZyBfX2luaXRkYXRhID0geworCS5uY3NfcmVhZF9zZXR1cAkJPSAxNiwKKwkubnJkX3NldHVwCQk9IDMyLAorCS5uY3NfcmVhZF9wdWxzZQkJPSA0OCwKKwkubnJkX3B1bHNlCQk9IDMyLAorCS5yZWFkX2N5Y2xlCQk9IDY0LAorCisJLm5jc193cml0ZV9zZXR1cAk9IDE2LAorCS5ud2Vfc2V0dXAJCT0gMTYsCisJLm5jc193cml0ZV9wdWxzZQk9IDMyLAorCS5ud2VfcHVsc2UJCT0gMzIsCisJLndyaXRlX2N5Y2xlCQk9IDY0LAorfTsKKworc3RhdGljIHN0cnVjdCBzbWNfY29uZmlnIGZwZ2FfY29uZmlnIF9faW5pdGRhdGEgPSB7CisJLmJ1c193aWR0aAkJPSA0LAorCS5ucmRfY29udHJvbGxlZAkJPSAxLAorCS5ud2VfY29udHJvbGxlZAkJPSAxLAorCS5ieXRlX3dyaXRlCQk9IDAsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGhoX2ZwZ2EwX3Jlc291cmNlW10gPSB7CisJeworCQkuc3RhcnQJCT0gMHhmZmUwMDQwMCwKKwkJLmVuZAkJPSAweGZmZTAwNDAwICsgMHgzZmYsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0CQk9IDQsCisJCS5lbmQJCT0gNCwKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQJCT0gMHgwYzAwMDAwMCwKKwkJLmVuZAkJPSAweDBjMDAwMTAwLAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydAkJPSA2NywKKwkJLmVuZAkJPSA2NywKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgdTY0IGhoX2ZwZ2EwX2RtYV9tYXNrID0gRE1BXzMyQklUX01BU0s7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBoaF9mcGdhMF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gImhoX2ZwZ2EiLAorCS5pZAkJPSAwLAorCS5kZXYJCT0geworCQkuZG1hX21hc2sgPSAmaGhfZnBnYTBfZG1hX21hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzayA9IERNQV8zMkJJVF9NQVNLLAorCX0sCisJLnJlc291cmNlCT0gaGhfZnBnYTBfcmVzb3VyY2UsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGhoX2ZwZ2EwX3Jlc291cmNlKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGhoX2ZwZ2EwX3NwaV9jbGsgPSB7CisJLm5hbWUJCT0gInNwaV9jbGsiLAorCS5kZXYJCT0gJmhoX2ZwZ2EwX2RldmljZS5kZXYsCisJLm1vZGUJCT0gcGJhX2Nsa19tb2RlLAorCS5nZXRfcmF0ZQk9IHBiYV9jbGtfZ2V0X3JhdGUsCisJLmluZGV4CQk9IDEsCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpfX2luaXQgYXQzMl9hZGRfZGV2aWNlX2hoX2ZwZ2Eodm9pZCkKK3sKKwkvKiBTZWxlY3QgcGVyaXBoZXJhbCBmdW5jdGlvbmFsbGl0eSBmb3IgU1BJIFNDSyBhbmQgTU9TSSAqLworCWF0MzJfc2VsZWN0X3BlcmlwaChHUElPX1BJT0JfQkFTRSwgSEFNTUVSSEVBRF9GUEdBX1BFUklQSF9TQ0ssCisJCQkgICBHUElPX1BFUklQSF9CLCAwKTsKKwlhdDMyX3NlbGVjdF9wZXJpcGgoR1BJT19QSU9CX0JBU0UsIEhBTU1FUkhFQURfRlBHQV9QRVJJUEhfTU9TSSwKKwkJCSAgIEdQSU9fUEVSSVBIX0IsIDApOworCisJLyogcmVzZXJ2ZSBhbGwgb3RoZXIgbmVlZGVkIGdwaW8KKwkgKiBXZSBoYXZlIG9uIGJvYXJkIHB1bGwgdXBzLCBzbyB0aGVyZSBpcyBubyBuZWVkCisJICogdG8gZW5hYmxlIGdwaW8gcHVsbCB1cHMgKi8KKwkvKiBJTklUX0RPTkUgKGlucHV0KSAqLworCWF0MzJfc2VsZWN0X2dwaW8oR1BJT19QSU5fUEIoMCksIDApOworCisJLyogblNUQVRVUyAoaW5wdXQpICovCisJYXQzMl9zZWxlY3RfZ3BpbyhHUElPX1BJTl9QQigyKSwgMCk7CisKKwkvKiBuQ09ORklHIChvdXRwdXQsIGxvdykgKi8KKwlhdDMyX3NlbGVjdF9ncGlvKEdQSU9fUElOX1BCKDMpLCBBVDMyX0dQSU9GX09VVFBVVCk7CisKKwkvKiBDT05GX0RPTkUgKGlucHV0KSAqLworCWF0MzJfc2VsZWN0X2dwaW8oR1BJT19QSU5fUEIoNCksIDApOworCisJLyogU2VsZWN0IEVYVElOVDMgZm9yIFBCMjggKEludGVycnVwdCBmcm9tIEZQR0EpICovCisJYXQzMl9zZWxlY3RfcGVyaXBoKEdQSU9fUElPQl9CQVNFLCBIQU1NRVJIRUFEX0ZQR0FfUEVSSVBIX0VYVElOVDMsCisJCQkgICBHUElPX1BFUklQSF9BLCAwKTsKKworCS8qIEdldCBvdXIgcGFyZW50IGNsb2NrICovCisJaGhfZnBnYTBfc3BpX2Nsay5wYXJlbnQgPSBjbGtfZ2V0KE5VTEwsICJwYmEiKTsKKwljbGtfcHV0KGhoX2ZwZ2EwX3NwaV9jbGsucGFyZW50KTsKKworCS8qIFJlZ2lzdGVyIGNsb2NrIGluIGF0MzIgY2xvY2sgdHJlZSAqLworCWF0MzJfY2xrX3JlZ2lzdGVyKCZoaF9mcGdhMF9zcGlfY2xrKTsKKworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmaGhfZnBnYTBfZGV2aWNlKTsKKwlyZXR1cm4gJmhoX2ZwZ2EwX2RldmljZTsKK30KKyNlbmRpZgorCisvKiBUaGlzIG5lZWRzIHRvIGJlIGNhbGxlZCBhZnRlciB0aGUgU01DIGhhcyBiZWVuIGluaXRpYWxpemVkICovCitzdGF0aWMgaW50IF9faW5pdCBoYW1tZXJoZWFkX2ZsYXNoX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJc21jX3NldF90aW1pbmcoJmZsYXNoX2NvbmZpZywgJmZsYXNoX3RpbWluZyk7CisJcmV0ID0gc21jX3NldF9jb25maWd1cmF0aW9uKDAsICZmbGFzaF9jb25maWcpOworCisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJoYW1tZXJoZWFkOiBmYWlsZWQgdG8gc2V0IE5PUiBmbGFzaCB0aW1pbmdcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmZmxhc2hfZGV2aWNlKTsKKworI2lmZGVmIENPTkZJR19CT0FSRF9IQU1NRVJIRUFEX1VTQgorCWhhbW1lcmhlYWRfdXNiaF9pbml0KCk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19CT0FSRF9IQU1NRVJIRUFEX0ZQR0EKKwkvKiBTZXR1cCBTTUMgZm9yIEZQR0EgaW50ZXJmYWNlICovCisJc21jX3NldF90aW1pbmcoJmZwZ2FfY29uZmlnLCAmZnBnYV90aW1pbmcpOworCXJldCA9IHNtY19zZXRfY29uZmlndXJhdGlvbigzLCAmZnBnYV9jb25maWcpOworI2VuZGlmCisKKworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaGFtbWVyaGVhZDogZmFpbGVkIHRvIHNldCBGUEdBIHRpbWluZ1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2RldmljZV9pbml0Y2FsbChoYW1tZXJoZWFkX2ZsYXNoX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9ib2FyZHMvaGFtbWVyaGVhZC9mbGFzaC5oIGIvYXJjaC9hdnIzMi9ib2FyZHMvaGFtbWVyaGVhZC9mbGFzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNzBjNjIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2F2cjMyL2JvYXJkcy9oYW1tZXJoZWFkL2ZsYXNoLmgKQEAgLTAsMCArMSw2IEBACisjaWZuZGVmIF9fQk9BUkRTX0hBTU1FUkhFQURfRkxBU0hfSAorI2RlZmluZSBfX0JPQVJEU19IQU1NRVJIRUFEX0ZMQVNIX0gKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSAqYXQzMl9hZGRfZGV2aWNlX2hoX2ZwZ2Eodm9pZCk7CisKKyNlbmRpZiAvKiBfX0JPQVJEU19IQU1NRVJIRUFEX0ZMQVNIX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvYm9hcmRzL2hhbW1lcmhlYWQvc2V0dXAuYyBiL2FyY2gvYXZyMzIvYm9hcmRzL2hhbW1lcmhlYWQvc2V0dXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDJmZTgyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hdnIzMi9ib2FyZHMvaGFtbWVyaGVhZC9zZXR1cC5jCkBAIC0wLDAgKzEsMjQ1IEBACisvKgorICogQm9hcmQtc3BlY2lmaWMgc2V0dXAgY29kZSBmb3IgdGhlIE1pcm9taWNvIEhhbW1lcmhlYWQgYm9hcmQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWlyb21pY28gQUcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvYXRtZWwtbWNpLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKworI2luY2x1ZGUgPHZpZGVvL2F0bWVsX2xjZGMuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisKKyNpbmNsdWRlIDxtYWNoL2F0MzJhcDcwMHguaD4KKyNpbmNsdWRlIDxtYWNoL2JvYXJkLmg+CisjaW5jbHVkZSA8bWFjaC9pbml0Lmg+CisjaW5jbHVkZSA8bWFjaC9wb3J0bXV4Lmg+CisKKyNpbmNsdWRlICIuLi8uLi9tYWNoLWF0MzJhcC9jbG9jay5oIgorI2luY2x1ZGUgImZsYXNoLmgiCisKKy8qIE9zY2lsbGF0b3IgZnJlcXVlbmNpZXMuIFRoZXNlIGFyZSBib2FyZC1zcGVjaWZpYyAqLwordW5zaWduZWQgbG9uZyBhdDMyX2JvYXJkX29zY19yYXRlc1szXSA9IHsKKwlbMF0gPSAzMjc2OCwJLyogMzIuNzY4IGtIeiBvbiBSVEMgb3NjICovCisJWzFdID0gMjUwMDAwMDAsIC8qIDI1TUh6IG9uIG9zYzAgKi8KKwlbMl0gPSAxMjAwMDAwMCwJLyogMTIgTUh6IG9uIG9zYzEgKi8KK307CisKKy8qIEluaXRpYWxpemVkIGJ5IGJvb3Rsb2FkZXItc3BlY2lmaWMgc3RhcnR1cCBjb2RlLiAqLworc3RydWN0IHRhZyAqYm9vdGxvYWRlcl90YWdzIF9faW5pdGRhdGE7CisKKyNpZmRlZiBDT05GSUdfQk9BUkRfSEFNTUVSSEVBRF9MQ0QKK3N0YXRpYyBzdHJ1Y3QgZmJfdmlkZW9tb2RlIF9faW5pdGRhdGEgaGRhMzUwdGx2X21vZGVzW10gPSB7CisJeworCQkubmFtZQkJPSAiMzIweDI0MCBAIDc1IiwKKwkJLnJlZnJlc2gJPSA3NSwKKwkJLnhyZXMJCT0gMzIwLAorCQkueXJlcwkJPSAyNDAsCisJCS5waXhjbG9jawk9IEtIWjJQSUNPUyg2ODkxKSwKKworCQkubGVmdF9tYXJnaW4JPSA0OCwKKwkJLnJpZ2h0X21hcmdpbgk9IDE4LAorCQkudXBwZXJfbWFyZ2luCT0gMTgsCisJCS5sb3dlcl9tYXJnaW4JPSA0LAorCQkuaHN5bmNfbGVuCT0gMjAsCisJCS52c3luY19sZW4JPSAyLAorCisJCS5zeW5jCQk9IDAsCisJCS52bW9kZQkJPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VELAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGZiX21vbnNwZWNzIF9faW5pdGRhdGEgaGFtbWVyaGVhZF9oZGEzNTB0X21vbnNwZWNzID0geworCS5tYW51ZmFjdHVyZXIJCT0gIkhBTiIsCisJLm1vbml0b3IJCT0gIkhEQTM1MFQtTFYiLAorCS5tb2RlZGIJCQk9IGhkYTM1MHRsdl9tb2RlcywKKwkubW9kZWRiX2xlbgkJPSBBUlJBWV9TSVpFKGhkYTM1MHRsdl9tb2RlcyksCisJLmhmbWluCQkJPSAxNDkwMCwKKwkuaGZtYXgJCQk9IDIyMzUwLAorCS52Zm1pbgkJCT0gNjAsCisJLnZmbWF4CQkJPSA5MCwKKwkuZGNsa21heAkJPSAxMDAwMDAwMCwKK307CisKK3N0cnVjdCBhdG1lbF9sY2RmYl9pbmZvIF9faW5pdGRhdGEgaGFtbWVyaGVhZF9sY2RjX2RhdGEgPSB7CisJLmRlZmF1bHRfYnBwCQk9IDI0LAorCS5kZWZhdWx0X2RtYWNvbgkJPSBBVE1FTF9MQ0RDX0RNQUVOIHwgQVRNRUxfTENEQ19ETUEyREVOLAorCS5kZWZhdWx0X2xjZGNvbjIJPSAoQVRNRUxfTENEQ19ESVNUWVBFX1RGVAorCQkJCSAgIHwgQVRNRUxfTENEQ19JTlZDTEsKKwkJCQkgICB8IEFUTUVMX0xDRENfQ0xLTU9EX0FMV0FZU0FDVElWRQorCQkJCSAgIHwgQVRNRUxfTENEQ19NRU1PUl9CSUcpLAorCS5kZWZhdWx0X21vbnNwZWNzCT0gJmhhbW1lcmhlYWRfaGRhMzUwdF9tb25zcGVjcywKKwkuZ3VhcmRfdGltZQkJPSAyLAorfTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IG1jaV9wbGF0Zm9ybV9kYXRhIF9faW5pdGRhdGEgbWNpMF9kYXRhID0geworCS5zbG90WzBdID0geworCQkuYnVzX3dpZHRoCT0gNCwKKwkJLmRldGVjdF9waW4JPSAtRU5PREVWLAorCQkud3BfcGluCQk9IC1FTk9ERVYsCisJfSwKK307CisKK3N0cnVjdCBldGhfYWRkciB7CisJdTggYWRkcls2XTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZXRoX2FkZHIgX19pbml0ZGF0YSBod19hZGRyWzFdOworc3RhdGljIHN0cnVjdCBldGhfcGxhdGZvcm1fZGF0YSBfX2luaXRkYXRhIGV0aF9kYXRhWzFdOworCisvKgorICogVGhlIG5leHQgdHdvIGZ1bmN0aW9ucyBzaG91bGQgZ28gYXdheSBhcyB0aGUgYm9vdCBsb2FkZXIgaXMKKyAqIHN1cHBvc2VkIHRvIGluaXRpYWxpemUgdGhlIG1hY2IgYWRkcmVzcyByZWdpc3RlcnMgd2l0aCBhIHZhbGlkCisgKiBldGhlcm5ldCBhZGRyZXNzLiBCdXQgd2UgbmVlZCB0byBrZWVwIGl0IGFyb3VuZCBmb3IgYSB3aGlsZSB1bnRpbAorICogd2UgY2FuIGJlIHJlYXNvbmFibHkgc3VyZSB0aGUgYm9vdCBsb2FkZXIgZG9lcyB0aGlzLgorICoKKyAqIFRoZSBwaHlfaWQgaXMgaWdub3JlZCBhcyB0aGUgZHJpdmVyIHdpbGwgcHJvYmUgZm9yIGl0LgorICovCitzdGF0aWMgaW50IF9faW5pdCBwYXJzZV90YWdfZXRoZXJuZXQoc3RydWN0IHRhZyAqdGFnKQoreworCWludCBpID0gdGFnLT51LmV0aGVybmV0Lm1hY19pbmRleDsKKworCWlmIChpIDwgQVJSQVlfU0laRShod19hZGRyKSkKKwkJbWVtY3B5KGh3X2FkZHJbaV0uYWRkciwgdGFnLT51LmV0aGVybmV0Lmh3X2FkZHJlc3MsCisJCSAgICAgICBzaXplb2YoaHdfYWRkcltpXS5hZGRyKSk7CisKKwlyZXR1cm4gMDsKK30KK19fdGFndGFibGUoQVRBR19FVEhFUk5FVCwgcGFyc2VfdGFnX2V0aGVybmV0KTsKKworc3RhdGljIHZvaWQgX19pbml0IHNldF9od19hZGRyKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICpyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWNvbnN0IHU4ICphZGRyOworCXZvaWQgX19pb21lbSAqcmVnczsKKwlzdHJ1Y3QgY2xrICpwY2xrOworCisJaWYgKCFyZXMpCisJCXJldHVybjsKKworCWlmIChwZGV2LT5pZCA+PSBBUlJBWV9TSVpFKGh3X2FkZHIpKQorCQlyZXR1cm47CisKKwlhZGRyID0gaHdfYWRkcltwZGV2LT5pZF0uYWRkcjsKKworCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihhZGRyKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBTaW5jZSB0aGlzIGlzIGJvYXJkLXNwZWNpZmljIGNvZGUsIHdlJ2xsIGNoZWF0IGFuZCB1c2UgdGhlCisJICogcGh5c2ljYWwgYWRkcmVzcyBkaXJlY3RseSBhcyB3ZSBoYXBwZW4gdG8ga25vdyB0aGF0IGl0J3MKKwkgKiB0aGUgc2FtZSBhcyB0aGUgdmlydHVhbCBhZGRyZXNzLgorCSAqLworCXJlZ3MgPSAodm9pZCBfX2lvbWVtIF9fZm9yY2UgKilyZXMtPnN0YXJ0OworCXBjbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJwY2xrIik7CisKKwlpZiAoIXBjbGspCisJCXJldHVybjsKKworCWNsa19lbmFibGUocGNsayk7CisKKwlfX3Jhd193cml0ZWwoKGFkZHJbM10gPDwgMjQpIHwgKGFkZHJbMl0gPDwgMTYpIHwgKGFkZHJbMV0gPDwgOCkgfAorCQkgICAgIGFkZHJbMF0sIHJlZ3MgKyAweDk4KTsKKwlfX3Jhd193cml0ZWwoKGFkZHJbNV0gPDwgOCkgfCBhZGRyWzRdLCByZWdzICsgMHg5Yyk7CisKKwljbGtfZGlzYWJsZShwY2xrKTsKKwljbGtfcHV0KHBjbGspOworfQorCit2b2lkIF9faW5pdCBzZXR1cF9ib2FyZCh2b2lkKQoreworCWF0MzJfbWFwX3VzYXJ0KDEsIDApOwkvKiBVU0FSVCAxOiAvZGV2L3R0eVMwLCBEQjkgKi8KKwlhdDMyX3NldHVwX3NlcmlhbF9jb25zb2xlKDApOworfQorCitzdGF0aWMgc3RydWN0IGkyY19ncGlvX3BsYXRmb3JtX2RhdGEgaTJjX2dwaW9fZGF0YSA9IHsKKwkuc2RhX3BpbgkJPSBHUElPX1BJTl9QQSg2KSwKKwkuc2NsX3BpbgkJPSBHUElPX1BJTl9QQSg3KSwKKwkuc2RhX2lzX29wZW5fZHJhaW4JPSAxLAorCS5zY2xfaXNfb3Blbl9kcmFpbgk9IDEsCisJLnVkZWxheQkJCT0gMiwJLyogY2xvc2UgdG8gMTAwIGtIeiAqLworfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaTJjX2dwaW9fZGV2aWNlID0geworCS5uYW1lCQk9ICJpMmMtZ3BpbyIsCisJLmlkCQk9IDAsCisJLmRldgkJPSB7IC5wbGF0Zm9ybV9kYXRhID0gJmkyY19ncGlvX2RhdGEsIH0sCit9OworCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIF9faW5pdGRhdGEgaTJjX2luZm9bXSA9IHt9OworCisjaWZkZWYgQ09ORklHX0JPQVJEX0hBTU1FUkhFQURfU05ECitzdGF0aWMgc3RydWN0IGFjOTdjX3BsYXRmb3JtX2RhdGEgYWM5N2NfZGF0YSA9IHsKKwkucmVzZXRfcGluID0gR1BJT19QSU5fUEEoMTYpLAorfTsKKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdCBoYW1tZXJoZWFkX2luaXQodm9pZCkKK3sKKwkvKgorCSAqIEhhbW1lcmhlYWQgdXNlcyAzMi1iaXQgU0RSQU0gaW50ZXJmYWNlLiBSZXNlcnZlIHRoZQorCSAqIFNEUkFNLXNwZWNpZmljIHBpbnMgc28gdGhhdCBub2JvZHkgbWVzc2VzIHdpdGggdGhlbS4KKwkgKi8KKwlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElPRV9CQVNFLCBBVE1FTF9FQklfUEVfREFUQV9BTEwpOworCisJYXQzMl9hZGRfZGV2aWNlX3VzYXJ0KDApOworCisJLyogUmVzZXJ2ZSBQQjI5IChHQ0xLMykuIFRoaXMgcGluIGlzIHVzZWQgYXMgY2xvY2sgc291cmNlCisJICogZm9yIEVUSCBQSFkgKDI1TUh6KS4gR0NMSzMgc2V0dXAgaXMgZG9uZSBieSBVLUJvb3QuCisJICovCisJYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJT0JfQkFTRSwgKDE8PDI5KSk7CisKKwkvKgorCSAqIEhhbW1lcmhlYWQgdXNlcyBvbmx5IG9uZSBldGhlcm5ldCBwb3J0LCBzbyB3ZSBkb24ndCBzZXQKKwkgKiBhZGRyZXNzIG9mIHNlY29uZCBwb3J0CisJICovCisJc2V0X2h3X2FkZHIoYXQzMl9hZGRfZGV2aWNlX2V0aCgwLCAmZXRoX2RhdGFbMF0pKTsKKworI2lmZGVmIENPTkZJR19CT0FSRF9IQU1NRVJIRUFEX0ZQR0EKKwlhdDMyX2FkZF9kZXZpY2VfaGhfZnBnYSgpOworI2VuZGlmCisJYXQzMl9hZGRfZGV2aWNlX21jaSgwLCAmbWNpMF9kYXRhKTsKKworI2lmZGVmIENPTkZJR19CT0FSRF9IQU1NRVJIRUFEX1VTQgorCWF0MzJfYWRkX2RldmljZV91c2JhKDAsIE5VTEwpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0JPQVJEX0hBTU1FUkhFQURfTENECisJYXQzMl9hZGRfZGV2aWNlX2xjZGMoMCwgJmhhbW1lcmhlYWRfbGNkY19kYXRhLCBmYm1lbV9zdGFydCwKKwkJCSAgICAgZmJtZW1fc2l6ZSwgQVRNRUxfTENEQ19QUklfMjRCSVQpOworI2VuZGlmCisKKwlhdDMyX3NlbGVjdF9ncGlvKGkyY19ncGlvX2RhdGEuc2RhX3BpbiwKKwkJCSBBVDMyX0dQSU9GX01VTFRJRFJWIHwgQVQzMl9HUElPRl9PVVRQVVQgfAorCQkJIEFUMzJfR1BJT0ZfSElHSCk7CisJYXQzMl9zZWxlY3RfZ3BpbyhpMmNfZ3Bpb19kYXRhLnNjbF9waW4sCisJCQkgQVQzMl9HUElPRl9NVUxUSURSViB8IEFUMzJfR1BJT0ZfT1VUUFVUIHwKKwkJCSBBVDMyX0dQSU9GX0hJR0gpOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmaTJjX2dwaW9fZGV2aWNlKTsKKwlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygwLCBpMmNfaW5mbywgQVJSQVlfU0laRShpMmNfaW5mbykpOworCisjaWZkZWYgQ09ORklHX0JPQVJEX0hBTU1FUkhFQURfU05ECisJYXQzMl9hZGRfZGV2aWNlX2FjOTdjKDAsICZhYzk3Y19kYXRhKTsKKyNlbmRpZgorCisJLyogU2VsZWN0IHRoZSBUb3VjaHNjcmVlbiBpbnRlcnJ1cHQgcGluIG1vZGUgKi8KKwlhdDMyX3NlbGVjdF9wZXJpcGgoR1BJT19QSU9CX0JBU0UsIDB4MDgwMDAwMDAsIEdQSU9fUEVSSVBIX0EsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3Bvc3Rjb3JlX2luaXRjYWxsKGhhbW1lcmhlYWRfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2JvYXJkcy9taW1jMjAwL3NldHVwLmMgYi9hcmNoL2F2cjMyL2JvYXJkcy9taW1jMjAwL3NldHVwLmMKaW5kZXggMzk3Y2JiOC4uMmI1OGQ2MSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9ib2FyZHMvbWltYzIwMC9zZXR1cC5jCisrKyBiL2FyY2gvYXZyMzIvYm9hcmRzL21pbWMyMDAvc2V0dXAuYwpAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1ZGUgPHZpZGVvL2F0bWVsX2xjZGMuaD4KICNpbmNsdWRlIDxsaW51eC9mYi5oPgogCi0jaW5jbHVkZSA8YXNtL2F0bWVsLW1jaS5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bWVsLW1jaS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAKQEAgLTIwNyw4ICsyMDcsNiBAQAogCSAqIHJlc2VydmUgYW55IHBpbnMgZm9yIGl0LgogCSAqLwogCi0JYXQzMl9hZGRfc3lzdGVtX2RldmljZXMoKTsKLQogCWF0MzJfYWRkX2RldmljZV91c2FydCgwKTsKIAlhdDMyX2FkZF9kZXZpY2VfdXNhcnQoMSk7CiAJYXQzMl9hZGRfZGV2aWNlX3VzYXJ0KDIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9jb25maWdzL2F0bmd3MTAwX2RlZmNvbmZpZyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdG5ndzEwMF9kZWZjb25maWcKaW5kZXggNTQxNTIwOS4uMTY0ZTI4MSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9jb25maWdzL2F0bmd3MTAwX2RlZmNvbmZpZworKysgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBfZGVmY29uZmlnCkBAIC04OTIsNyArODkyLDcgQEAKICMgRE1BIENsaWVudHMKICMKICMgQ09ORklHX05FVF9ETUEgaXMgbm90IHNldAotQ09ORklHX0RNQVRFU1Q9bQorIyBDT05GSUdfRE1BVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19VSU8gaXMgbm90IHNldAogCiAjCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRzdGsxMDAyX2RlZmNvbmZpZyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDJfZGVmY29uZmlnCmluZGV4IDY5ZmNlNmIuLmM5ZGM2NDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDJfZGVmY29uZmlnCisrKyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDJfZGVmY29uZmlnCkBAIC05NjQsNyArOTY0LDcgQEAKICMgRE1BIENsaWVudHMKICMKICMgQ09ORklHX05FVF9ETUEgaXMgbm90IHNldAotQ09ORklHX0RNQVRFU1Q9bQorIyBDT05GSUdfRE1BVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19VSU8gaXMgbm90IHNldAogCiAjCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRzdGsxMDAzX2RlZmNvbmZpZyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDNfZGVmY29uZmlnCmluZGV4IDU0NzdlZDMuLjI5ZWExMzIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDNfZGVmY29uZmlnCisrKyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDNfZGVmY29uZmlnCkBAIC04ODIsNyArODgyLDcgQEAKICMgRE1BIENsaWVudHMKICMKICMgQ09ORklHX05FVF9ETUEgaXMgbm90IHNldAotQ09ORklHX0RNQVRFU1Q9bQorIyBDT05GSUdfRE1BVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19VSU8gaXMgbm90IHNldAogCiAjCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRzdGsxMDA2X2RlZmNvbmZpZyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDZfZGVmY29uZmlnCmluZGV4IDZjNDVhM2IuLjM2MWMzMWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDZfZGVmY29uZmlnCisrKyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDZfZGVmY29uZmlnCkBAIC0xMDE0LDcgKzEwMTQsNyBAQAogIyBETUEgQ2xpZW50cwogIwogIyBDT05GSUdfTkVUX0RNQSBpcyBub3Qgc2V0Ci1DT05GSUdfRE1BVEVTVD1tCisjIENPTkZJR19ETUFURVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19TVEFHSU5HIGlzIG5vdCBzZXQKIENPTkZJR19TVEFHSU5HX0VYQ0xVREVfQlVJTEQ9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9jb25maWdzL2hhbW1lcmhlYWRfZGVmY29uZmlnIGIvYXJjaC9hdnIzMi9jb25maWdzL2hhbW1lcmhlYWRfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkM2QyOTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvaGFtbWVyaGVhZF9kZWZjb25maWcKQEAgLTAsMCArMSwxNDY3IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjcKKyMgVHVlIERlYyAgOSAxNTozNzozMCAyMDA4CisjCitDT05GSUdfQVZSMzI9eQorQ09ORklHX0dFTkVSSUNfR1BJTz15CitDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CitDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKK0NPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQorQ09ORklHX1RSQUNFX0lSUUZMQUdTX1NVUFBPUlQ9eQorQ09ORklHX0hBUkRJUlFTX1NXX1JFU0VORD15CitDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfVElNRT15CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15CisjIENPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19HRU5FUklDX0JVRz15CitDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorIyBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE8gaXMgbm90IHNldAorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKK0NPTkZJR19QT1NJWF9NUVVFVUU9eQorQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1Q9eQorQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1RfVjM9eQorIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CisjIENPTkZJR19DR1JPVVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyPXkKKyMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BTUVTUEFDRVMgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1NZU0NUTD15CitDT05GSUdfRU1CRURERUQ9eQorIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CitDT05GSUdfRUxGX0NPUkU9eQorIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CisjIENPTkZJR19CQVNFX0ZVTEwgaXMgbm90IHNldAorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19BTk9OX0lOT0RFUz15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKK0NPTkZJR19FVkVOVEZEPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQUlPPXkKK0NPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CitDT05GSUdfUENJX1FVSVJLUz15CitDT05GSUdfU0xVQl9ERUJVRz15CisjIENPTkZJR19TTEFCIGlzIG5vdCBzZXQKK0NPTkZJR19TTFVCPXkKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorQ09ORklHX1BST0ZJTElORz15CisjIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKK0NPTkZJR19PUFJPRklMRT1tCitDT05GSUdfSEFWRV9PUFJPRklMRT15CitDT05GSUdfS1BST0JFUz15CitDT05GSUdfSEFWRV9LUFJPQkVTPXkKK0NPTkZJR19IQVZFX0NMSz15CisjIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UIGlzIG5vdCBzZXQKK0NPTkZJR19TTEFCSU5GTz15CitDT05GSUdfUlRfTVVURVhFUz15CisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTEKK0NPTkZJR19NT0RVTEVTPXkKKyMgQ09ORklHX01PRFVMRV9GT1JDRV9MT0FEIGlzIG5vdCBzZXQKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKK0NPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEPXkKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS01PRD15CitDT05GSUdfQkxPQ0s9eQorIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKKyMgQ09ORklHX0lPU0NIRURfQVMgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9ERUFETElORSBpcyBub3Qgc2V0CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorIyBDT05GSUdfREVGQVVMVF9BUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0NGUT15CisjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iY2ZxIgorQ09ORklHX0NMQVNTSUNfUkNVPXkKKyMgQ09ORklHX0ZSRUVaRVIgaXMgbm90IHNldAorCisjCisjIFN5c3RlbSBUeXBlIGFuZCBmZWF0dXJlcworIworQ09ORklHX1RJQ0tfT05FU0hPVD15CitDT05GSUdfTk9fSFo9eQorQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CVUlMRD15CitDT05GSUdfU1VCQVJDSF9BVlIzMkI9eQorQ09ORklHX01NVT15CitDT05GSUdfUEVSRk9STUFOQ0VfQ09VTlRFUlM9eQorQ09ORklHX1BMQVRGT1JNX0FUMzJBUD15CitDT05GSUdfQ1BVX0FUMzJBUDcwMFg9eQorQ09ORklHX0NQVV9BVDMyQVA3MDAwPXkKKyMgQ09ORklHX0JPQVJEX0FUU1RLMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19CT0FSRF9BVE5HVzEwMCBpcyBub3Qgc2V0CitDT05GSUdfQk9BUkRfSEFNTUVSSEVBRD15CisjIENPTkZJR19CT0FSRF9GQVZSXzMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPQVJEX01JTUMyMDAgaXMgbm90IHNldAorQ09ORklHX0JPQVJEX0hBTU1FUkhFQURfVVNCPXkKK0NPTkZJR19CT0FSRF9IQU1NRVJIRUFEX0xDRD15CitDT05GSUdfQk9BUkRfSEFNTUVSSEVBRF9TTkQ9eQorIyBDT05GSUdfQk9BUkRfSEFNTUVSSEVBRF9GUEdBIGlzIG5vdCBzZXQKK0NPTkZJR19MT0FERVJfVV9CT09UPXkKKworIworIyBBdG1lbCBBVlIzMiBBUCBvcHRpb25zCisjCisjIENPTkZJR19BUDcwMFhfMzJfQklUX1NNQyBpcyBub3Qgc2V0CitDT05GSUdfQVA3MDBYXzE2X0JJVF9TTUM9eQorIyBDT05GSUdfQVA3MDBYXzhfQklUX1NNQyBpcyBub3Qgc2V0CitDT05GSUdfTE9BRF9BRERSRVNTPTB4MTAwMDAwMDAKK0NPTkZJR19FTlRSWV9BRERSRVNTPTB4OTAwMDAwMDAKK0NPTkZJR19QSFlTX09GRlNFVD0weDEwMDAwMDAwCitDT05GSUdfUFJFRU1QVF9OT05FPXkKKyMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX1FVSUNLTElTVD15CisjIENPTkZJR19IQVZFX0FSQ0hfQk9PVE1FTV9OT0RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSEFWRV9NRU1PUllfUFJFU0VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19ORUVEX05PREVfTUVNTUFQX1NJWkUgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQorIyBDT05GSUdfQVJDSF9ESVNDT05USUdNRU1fRU5BQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU1BBUlNFTUVNX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CitDT05GSUdfUEFHRUZMQUdTX0VYVEVOREVEPXkKK0NPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CisjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAorIyBDT05GSUdfUEhZU19BRERSX1RfNjRCSVQgaXMgbm90IHNldAorQ09ORklHX1pPTkVfRE1BX0ZMQUc9MAorQ09ORklHX05SX1FVSUNLPTIKK0NPTkZJR19WSVJUX1RPX0JVUz15CitDT05GSUdfVU5FVklDVEFCTEVfTFJVPXkKKyMgQ09ORklHX09XTkVSU0hJUF9UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19OTUlfREVCVUdHSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzEwMCBpcyBub3Qgc2V0CitDT05GSUdfSFpfMjUwPXkKKyMgQ09ORklHX0haXzMwMCBpcyBub3Qgc2V0CisjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWj0yNTAKK0NPTkZJR19TQ0hFRF9IUlRJQ0s9eQorQ09ORklHX0NNRExJTkU9IiIKKworIworIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKKyMKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1NVU1BFTkRfUE9TU0lCTEU9eQorCisjCisjIENQVSBGcmVxdWVuY3kgc2NhbGluZworIworQ09ORklHX0NQVV9GUkVRPXkKK0NPTkZJR19DUFVfRlJFUV9UQUJMRT15CisjIENPTkZJR19DUFVfRlJFUV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRlJFUV9TVEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9GUkVRX0RFRkFVTFRfR09WX1BFUkZPUk1BTkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9GUkVRX0RFRkFVTFRfR09WX1BPV0VSU0FWRSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRlJFUV9ERUZBVUxUX0dPVl9VU0VSU1BBQ0UgaXMgbm90IHNldAorQ09ORklHX0NQVV9GUkVRX0RFRkFVTFRfR09WX09OREVNQU5EPXkKKyMgQ09ORklHX0NQVV9GUkVRX0RFRkFVTFRfR09WX0NPTlNFUlZBVElWRSBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0ZSRVFfR09WX1BFUkZPUk1BTkNFPXkKKyMgQ09ORklHX0NQVV9GUkVRX0dPVl9QT1dFUlNBVkUgaXMgbm90IHNldAorQ09ORklHX0NQVV9GUkVRX0dPVl9VU0VSU1BBQ0U9eQorQ09ORklHX0NQVV9GUkVRX0dPVl9PTkRFTUFORD15CisjIENPTkZJR19DUFVfRlJFUV9HT1ZfQ09OU0VSVkFUSVZFIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfRlJFUV9BVDMyQVA9eQorCisjCisjIEJ1cyBvcHRpb25zCisjCisjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorCisjCisjIEV4ZWN1dGFibGUgZmlsZSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19DT1JFX0RVTVBfREVGQVVMVF9FTEZfSEVBREVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0FPVVQgaXMgbm90IHNldAorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKK0NPTkZJR19QQUNLRVRfTU1BUD15CitDT05GSUdfVU5JWD15CitDT05GSUdfWEZSTT15CitDT05GSUdfWEZSTV9VU0VSPXkKKyMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX01JR1JBVEUgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9TVEFUSVNUSUNTIGlzIG5vdCBzZXQKK0NPTkZJR19YRlJNX0lQQ09NUD15CitDT05GSUdfTkVUX0tFWT15CisjIENPTkZJR19ORVRfS0VZX01JR1JBVEUgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorQ09ORklHX0lQX01VTFRJQ0FTVD15CitDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSPXkKK0NPTkZJR19BU0tfSVBfRklCX0hBU0g9eQorIyBDT05GSUdfSVBfRklCX1RSSUUgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKKyMgQ09ORklHX0lQX01VTFRJUExFX1RBQkxFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ST1VURV9NVUxUSVBBVEggaXMgbm90IHNldAorIyBDT05GSUdfSVBfUk9VVEVfVkVSQk9TRSBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CisjIENPTkZJR19JUF9QTlBfQk9PVFAgaXMgbm90IHNldAorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9NUk9VVEU9eQorQ09ORklHX0lQX1BJTVNNX1YxPXkKKyMgQ09ORklHX0lQX1BJTVNNX1YyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorQ09ORklHX1NZTl9DT09LSUVTPXkKK0NPTkZJR19JTkVUX0FIPXkKK0NPTkZJR19JTkVUX0VTUD15CitDT05GSUdfSU5FVF9JUENPTVA9eQorQ09ORklHX0lORVRfWEZSTV9UVU5ORUw9eQorQ09ORklHX0lORVRfVFVOTkVMPXkKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15CisjIENPTkZJR19JTkVUX0xSTyBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9ESUFHPXkKK0NPTkZJR19JTkVUX1RDUF9ESUFHPXkKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19DVUJJQz15CitDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCisjIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRGSUxURVI9eQorIyBDT05GSUdfTkVURklMVEVSX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUl9BRFZBTkNFRCBpcyBub3Qgc2V0CisKKyMKKyMgQ29yZSBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgorIworQ09ORklHX05FVEZJTFRFUl9ORVRMSU5LPW0KK0NPTkZJR19ORVRGSUxURVJfTkVUTElOS19MT0c9bQorQ09ORklHX05GX0NPTk5UUkFDSz1tCitDT05GSUdfTkZfQ09OTlRSQUNLX0ZUUD1tCitDT05GSUdfTkZfQ09OTlRSQUNLX0lSQz1tCitDT05GSUdfTkZfQ09OTlRSQUNLX1NJUD1tCitDT05GSUdfTkZfQ1RfTkVUTElOSz1tCitDT05GSUdfTkVURklMVEVSX1hUQUJMRVM9eQorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTUFSSz1tCitDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9ORkxPRz1tCitDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9UQ1BNU1M9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT05OVFJBQ0s9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9NQVJLPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUE9MSUNZPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RBVEU9bQorIyBDT05GSUdfSVBfVlMgaXMgbm90IHNldAorCisjCisjIElQOiBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgorIworQ09ORklHX05GX0RFRlJBR19JUFY0PW0KK0NPTkZJR19ORl9DT05OVFJBQ0tfSVBWND1tCitDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUPXkKK0NPTkZJR19JUF9ORl9JUFRBQkxFUz1tCitDT05GSUdfSVBfTkZfRklMVEVSPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfUkVKRUNUPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfTE9HPW0KKyMgQ09ORklHX0lQX05GX1RBUkdFVF9VTE9HIGlzIG5vdCBzZXQKK0NPTkZJR19ORl9OQVQ9bQorQ09ORklHX05GX05BVF9ORUVERUQ9eQorQ09ORklHX0lQX05GX1RBUkdFVF9NQVNRVUVSQURFPW0KK0NPTkZJR19ORl9OQVRfRlRQPW0KK0NPTkZJR19ORl9OQVRfSVJDPW0KKyMgQ09ORklHX05GX05BVF9URlRQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GX05BVF9BTUFOREEgaXMgbm90IHNldAorIyBDT05GSUdfTkZfTkFUX1BQVFAgaXMgbm90IHNldAorIyBDT05GSUdfTkZfTkFUX0gzMjMgaXMgbm90IHNldAorQ09ORklHX05GX05BVF9TSVA9bQorQ09ORklHX0lQX05GX01BTkdMRT1tCisjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9EU0EgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1RDUFBST0JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBTiBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIT05FVCBpcyBub3Qgc2V0CitDT05GSUdfV0lSRUxFU1M9eQorIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0lSRUxFU1NfT0xEX1JFR1VMQVRPUlkgaXMgbm90IHNldAorIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUXzlQIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCitDT05GSUdfU1RBTkRBTE9ORT15CisjIENPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfREVWUkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CitDT05GSUdfTVREPXkKKyMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ09OQ0FUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEFSVElUSU9OUz15CisjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQorIyBDT05GSUdfTVREX0FSN19QQVJUUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMS0RFVlM9eQorQ09ORklHX01URF9CTE9DSz15CisjIENPTkZJR19GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19SRkRfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NTRkRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PT1BTIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworQ09ORklHX01URF9DRkk9eQorIyBDT05GSUdfTVREX0pFREVDUFJPQkUgaXMgbm90IHNldAorQ09ORklHX01URF9HRU5fUFJPQkU9eQorIyBDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKK0NPTkZJR19NVERfQ0ZJX0kyPXkKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0lOVEVMRVhUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0FNRFNURD15CisjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfVVRJTD15CisjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisKKyMKKyMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcworIworIyBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1MgaXMgbm90IHNldAorQ09ORklHX01URF9QSFlTTUFQPXkKK0NPTkZJR19NVERfUEhZU01BUF9TVEFSVD0weDgwMDAwMDAwCitDT05GSUdfTVREX1BIWVNNQVBfTEVOPTB4MAorQ09ORklHX01URF9QSFlTTUFQX0JBTktXSURUSD0yCisjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCitDT05GSUdfTVREX0RBVEFGTEFTSD15CisjIENPTkZJR19NVERfREFUQUZMQVNIX1dSSVRFX1ZFUklGWSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfREFUQUZMQVNIX09UUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTTI1UDgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKKworIworIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT05FTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgVUJJIC0gVW5zb3J0ZWQgYmxvY2sgaW1hZ2VzCisjCisjIENPTkZJR19NVERfVUJJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVY9eQorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VCIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTT1tCitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKKyMgQ09ORklHX0JMS19ERVZfWElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKK0NPTkZJR19NSVNDX0RFVklDRVM9eQorIyBDT05GSUdfQVRNRUxfUFdNIGlzIG5vdCBzZXQKK0NPTkZJR19BVE1FTF9UQ0xJQj15CitDT05GSUdfQVRNRUxfVENCX0NMS1NSQz15CitDT05GSUdfQVRNRUxfVENCX0NMS1NSQ19CTE9DSz0wCisjIENPTkZJR19FRVBST01fOTNDWDYgaXMgbm90IHNldAorIyBDT05GSUdfQVRNRUxfU1NDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQ0xPU1VSRV9TRVJWSUNFUyBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CitDT05GSUdfU0NTST1tCitDT05GSUdfU0NTSV9ETUE9eQorIyBDT05GSUdfU0NTSV9UR1QgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1BST0NfRlM9eQorCisjCisjIFNDU0kgc3VwcG9ydCB0eXBlIChkaXNrLCB0YXBlLCBDRC1ST00pCisjCitDT05GSUdfQkxLX0RFVl9TRD1tCisjIENPTkZJR19DSFJfREVWX1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfT1NTVCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfU0cgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9TQ0ggaXMgbm90IHNldAorCisjCisjIFNvbWUgU0NTSSBkZXZpY2VzIChlLmcuIENEIGp1a2Vib3gpIHN1cHBvcnQgbXVsdGlwbGUgTFVOcworIworIyBDT05GSUdfU0NTSV9NVUxUSV9MVU4gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9DT05TVEFOVFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MT0dHSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0NBTl9BU1lOQyBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9XQUlUX1NDQU49bQorCisjCisjIFNDU0kgVHJhbnNwb3J0cworIworIyBDT05GSUdfU0NTSV9TUElfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9GQ19BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lTQ1NJX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FTX0xJQlNBUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NSUF9BVFRSUyBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9MT1dMRVZFTD15CisjIENPTkZJR19JU0NTSV9UQ1AgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQSBpcyBub3Qgc2V0CisjIENPTkZJR19NRCBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ1ZMQU4gaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisjIENPTkZJR19WRVRIIGlzIG5vdCBzZXQKK0NPTkZJR19QSFlMSUI9eQorCisjCisjIE1JSSBQSFkgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01BUlZFTExfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RBVklDT01fUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FTRU1JX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19MWFRfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJQ0FEQV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfVklURVNTRV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfU01TQ19QSFkgaXMgbm90IHNldAorIyBDT05GSUdfQlJPQURDT01fUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lDUExVU19QSFkgaXMgbm90IHNldAorIyBDT05GSUdfUkVBTFRFS19QSFkgaXMgbm90IHNldAorIyBDT05GSUdfRklYRURfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX01ESU9fQklUQkFORyBpcyBub3Qgc2V0CitDT05GSUdfTkVUX0VUSEVSTkVUPXkKKyMgQ09ORklHX01JSSBpcyBub3Qgc2V0CitDT05GSUdfTUFDQj15CisjIENPTkZJR19FTkMyOEo2MCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfWk1JSSBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfUkdNSUkgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1RBSCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfRU1BQzQgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX05PX0ZMT1dfQ1RSTCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NMUl9JQ0lOVFNUQVQgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DT01NT05fRVJSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTgorIworIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lXTFdJRklfTEVEUyBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIE5ldHdvcmsgQWRhcHRlcnMKKyMKKyMgQ09ORklHX1VTQl9DQVRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9LQVdFVEggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BFR0FTVVMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1JUTDgxNTAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1VTQk5FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisjIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CitDT05GSUdfSU5QVVRfRkZfTUVNTEVTUz1tCisjIENPTkZJR19JTlBVVF9QT0xMREVWIGlzIG5vdCBzZXQKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCitDT05GSUdfSU5QVVRfTU9VU0VERVY9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX0VWREVWPW0KKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKK0NPTkZJR19LRVlCT0FSRF9BVEtCRD15CisjIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1NUT1dBV0FZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX0dQSU8gaXMgbm90IHNldAorQ09ORklHX0lOUFVUX01PVVNFPXkKK0NPTkZJR19NT1VTRV9QUzI9eQorQ09ORklHX01PVVNFX1BTMl9BTFBTPXkKK0NPTkZJR19NT1VTRV9QUzJfTE9HSVBTMlBQPXkKK0NPTkZJR19NT1VTRV9QUzJfU1lOQVBUSUNTPXkKK0NPTkZJR19NT1VTRV9QUzJfTElGRUJPT0s9eQorQ09ORklHX01PVVNFX1BTMl9UUkFDS1BPSU5UPXkKKyMgQ09ORklHX01PVVNFX1BTMl9UT1VDSEtJVCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9TRVJJQUwgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfQVBQTEVUT1VDSCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9CQ001OTc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1ZTWFhYQUEgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfR1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOPXkKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0FEUzc4NDYgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fRlVKSVRTVSBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9HVU5aRSBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9FTE8gaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fTVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0lORVhJTyBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9NSzcxMiBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9QRU5NT1VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSFJJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX1RPVUNIV0lOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX1VTQl9DT01QT1NJVEUgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVE9VQ0hJVDIxMyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKK0NPTkZJR19TRVJJTz15CitDT05GSUdfU0VSSU9fSTgwNDI9eQorQ09ORklHX1NFUklPX1NFUlBPUlQ9eQorIyBDT05GSUdfU0VSSU9fQVQzMlBTSUYgaXMgbm90IHNldAorQ09ORklHX1NFUklPX0xJQlBTMj15CisjIENPTkZJR19TRVJJT19SQVcgaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCitDT05GSUdfVlQ9eQorQ09ORklHX0NPTlNPTEVfVFJBTlNMQVRJT05TPXkKK0NPTkZJR19WVF9DT05TT0xFPXkKK0NPTkZJR19IV19DT05TT0xFPXkKKyMgQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORyBpcyBub3Qgc2V0CitDT05GSUdfREVWS01FTT15CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCisjIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9BVE1FTD15CitDT05GSUdfU0VSSUFMX0FUTUVMX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF9BVE1FTF9QREM9eQorIyBDT05GSUdfU0VSSUFMX0FUTUVMX1RUWUFUIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CitDT05GSUdfVU5JWDk4X1BUWVM9eQorIyBDT05GSUdfTEVHQUNZX1BUWVMgaXMgbm90IHNldAorIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorQ09ORklHX0kyQz1tCitDT05GSUdfSTJDX0JPQVJESU5GTz15CitDT05GSUdfSTJDX0NIQVJERVY9bQorQ09ORklHX0kyQ19IRUxQRVJfQVVUTz15CitDT05GSUdfSTJDX0FMR09CSVQ9bQorCisjCisjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAorIworCisjCisjIEkyQyBzeXN0ZW0gYnVzIGRyaXZlcnMgKG1vc3RseSBlbWJlZGRlZCAvIHN5c3RlbS1vbi1jaGlwKQorIworQ09ORklHX0kyQ19HUElPPW0KKyMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJTVRFQyBpcyBub3Qgc2V0CisKKyMKKyMgRXh0ZXJuYWwgSTJDL1NNQnVzIGFkYXB0ZXIgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1RBT1NfRVZNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19USU5ZX1VTQiBpcyBub3Qgc2V0CisKKyMKKyMgT3RoZXIgSTJDL1NNQnVzIGJ1cyBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfUENBX1BMQVRGT1JNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RTMTY4MiBpcyBub3Qgc2V0CisjIENPTkZJR19BVDI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRUVQUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0Y4NTc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAorIyBDT05GSUdfVFBTNjUwMTAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVFNMMjU1MCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKK0NPTkZJR19TUEk9eQorIyBDT05GSUdfU1BJX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19TUElfTUFTVEVSPXkKKworIworIyBTUEkgTWFzdGVyIENvbnRyb2xsZXIgRHJpdmVycworIworQ09ORklHX1NQSV9BVE1FTD15CisjIENPTkZJR19TUElfQklUQkFORyBpcyBub3Qgc2V0CisKKyMKKyMgU1BJIFByb3RvY29sIE1hc3RlcnMKKyMKKyMgQ09ORklHX1NQSV9BVDI1IGlzIG5vdCBzZXQKK0NPTkZJR19TUElfU1BJREVWPW0KKyMgQ09ORklHX1NQSV9UTEU2MlgwIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1JFUVVJUkVfR1BJT0xJQj15CitDT05GSUdfR1BJT0xJQj15CisjIENPTkZJR19ERUJVR19HUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dQSU9fU1lTRlMgaXMgbm90IHNldAorCisjCisjIEkyQyBHUElPIGV4cGFuZGVyczoKKyMKKyMgQ09ORklHX0dQSU9fTUFYNzMyWCBpcyBub3Qgc2V0CisjIENPTkZJR19HUElPX1BDQTk1M1ggaXMgbm90IHNldAorIyBDT05GSUdfR1BJT19QQ0Y4NTdYIGlzIG5vdCBzZXQKKworIworIyBQQ0kgR1BJTyBleHBhbmRlcnM6CisjCisKKyMKKyMgU1BJIEdQSU8gZXhwYW5kZXJzOgorIworIyBDT05GSUdfR1BJT19NQVg3MzAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dQSU9fTUNQMjNTMDggaXMgbm90IHNldAorIyBDT05GSUdfVzEgaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTF9IV01PTiBpcyBub3Qgc2V0CitDT05GSUdfV0FUQ0hET0c9eQorIyBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19TT0ZUX1dBVENIRE9HIGlzIG5vdCBzZXQKK0NPTkZJR19BVDMyQVA3MDBYX1dEVD15CisKKyMKKyMgVVNCLWJhc2VkIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19VU0JQQ1dBVENIRE9HIGlzIG5vdCBzZXQKKworIworIyBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUKKyMKK0NPTkZJR19TU0JfUE9TU0lCTEU9eQorIyBDT05GSUdfU1NCIGlzIG5vdCBzZXQKKworIworIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAorIyBDT05GSUdfSFRDX1BBU0lDMyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004NDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTgzNTBfSTJDIGlzIG5vdCBzZXQKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKworIworIyBNdWx0aW1lZGlhIGNvcmUgc3VwcG9ydAorIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX01FRElBIGlzIG5vdCBzZXQKKworIworIyBNdWx0aW1lZGlhIGRyaXZlcnMKKyMKKyMgQ09ORklHX0RBQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworIyBDT05GSUdfVkdBU1RBVEUgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fT1VUUFVUX0NPTlRST0wgaXMgbm90IHNldAorQ09ORklHX0ZCPXkKKyMgQ09ORklHX0ZJUk1XQVJFX0VESUQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfRERDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0JPT1RfVkVTQV9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19GQl9DRkJfRklMTFJFQ1Q9eQorQ09ORklHX0ZCX0NGQl9DT1BZQVJFQT15CitDT05GSUdfRkJfQ0ZCX0lNQUdFQkxJVD15CisjIENPTkZJR19GQl9DRkJfUkVWX1BJWEVMU19JTl9CWVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19GSUxMUkVDVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfQ09QWUFSRUEgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU1lTX0lNQUdFQkxJVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9GT1JFSUdOX0VORElBTiBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfRk9QUyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TVkdBTElCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01BQ01PREVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0JBQ0tMSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9NT0RFX0hFTFBFUlMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfVElMRUJMSVRUSU5HIGlzIG5vdCBzZXQKKworIworIyBGcmFtZSBidWZmZXIgaGFyZHdhcmUgZHJpdmVycworIworIyBDT05GSUdfRkJfUzFEMTNYWFggaXMgbm90IHNldAorQ09ORklHX0ZCX0FUTUVMPXkKKyMgQ09ORklHX0ZCX1ZJUlRVQUwgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTUVUUk9OT01FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKK0NPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFPXkKKyMgQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEVfREVURUNUX1BSSU1BUlkgaXMgbm90IHNldAorIyBDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRV9ST1RBVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GT05UUyBpcyBub3Qgc2V0CitDT05GSUdfRk9OVF84eDg9eQorQ09ORklHX0ZPTlRfOHgxNj15CisjIENPTkZJR19MT0dPIGlzIG5vdCBzZXQKK0NPTkZJR19TT1VORD1tCitDT05GSUdfU09VTkRfT1NTX0NPUkU9eQorQ09ORklHX1NORD1tCitDT05GSUdfU05EX1RJTUVSPW0KK0NPTkZJR19TTkRfUENNPW0KK0NPTkZJR19TTkRfU0VRVUVOQ0VSPW0KKyMgQ09ORklHX1NORF9TRVFfRFVNTVkgaXMgbm90IHNldAorQ09ORklHX1NORF9PU1NFTVVMPXkKK0NPTkZJR19TTkRfTUlYRVJfT1NTPW0KK0NPTkZJR19TTkRfUENNX09TUz1tCitDT05GSUdfU05EX1BDTV9PU1NfUExVR0lOUz15CitDT05GSUdfU05EX1NFUVVFTkNFUl9PU1M9eQorIyBDT05GSUdfU05EX0RZTkFNSUNfTUlOT1JTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9TVVBQT1JUX09MRF9BUEkgaXMgbm90IHNldAorQ09ORklHX1NORF9WRVJCT1NFX1BST0NGUz15CisjIENPTkZJR19TTkRfVkVSQk9TRV9QUklOVEsgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfRFJJVkVSUz15CisjIENPTkZJR19TTkRfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1ZJUk1JREkgaXMgbm90IHNldAorIyBDT05GSUdfU05EX01UUEFWIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9TRVJJQUxfVTE2NTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NUFU0MDEgaXMgbm90IHNldAorQ09ORklHX1NORF9TUEk9eQorQ09ORklHX1NORF9VU0I9eQorIyBDT05GSUdfU05EX1VTQl9BVURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfVVNCX0NBSUFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9TT0MgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfUFJJTUUgaXMgbm90IHNldAorQ09ORklHX0hJRF9TVVBQT1JUPXkKK0NPTkZJR19ISUQ9eQorIyBDT05GSUdfSElEX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRFJBVyBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIElucHV0IERldmljZXMKKyMKK0NPTkZJR19VU0JfSElEPW0KKyMgQ09ORklHX0hJRF9QSUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0hJRERFViBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEhJRCBCb290IFByb3RvY29sIGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9LQkQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01PVVNFIGlzIG5vdCBzZXQKKworIworIyBTcGVjaWFsIEhJRCBkcml2ZXJzCisjCitDT05GSUdfSElEX0NPTVBBVD15CitDT05GSUdfSElEX0E0VEVDSD1tCitDT05GSUdfSElEX0FQUExFPW0KK0NPTkZJR19ISURfQkVMS0lOPW0KK0NPTkZJR19ISURfQlJJR0hUPW0KK0NPTkZJR19ISURfQ0hFUlJZPW0KK0NPTkZJR19ISURfQ0hJQ09OWT1tCitDT05GSUdfSElEX0NZUFJFU1M9bQorQ09ORklHX0hJRF9ERUxMPW0KK0NPTkZJR19ISURfRVpLRVk9bQorQ09ORklHX0hJRF9HWVJBVElPTj1tCitDT05GSUdfSElEX0xPR0lURUNIPW0KKyMgQ09ORklHX0xPR0lURUNIX0ZGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPR0lSVU1CTEVQQUQyX0ZGIGlzIG5vdCBzZXQKK0NPTkZJR19ISURfTUlDUk9TT0ZUPW0KK0NPTkZJR19ISURfTU9OVEVSRVk9bQorQ09ORklHX0hJRF9QQU5USEVSTE9SRD1tCisjIENPTkZJR19QQU5USEVSTE9SRF9GRiBpcyBub3Qgc2V0CitDT05GSUdfSElEX1BFVEFMWU5YPW0KK0NPTkZJR19ISURfU0FNU1VORz1tCitDT05GSUdfSElEX1NPTlk9bQorQ09ORklHX0hJRF9TVU5QTFVTPW0KK0NPTkZJR19USFJVU1RNQVNURVJfRkY9bQorQ09ORklHX1pFUk9QTFVTX0ZGPW0KK0NPTkZJR19VU0JfU1VQUE9SVD15CitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CisjIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDSSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVJDSF9IQVNfRUhDSSBpcyBub3Qgc2V0CitDT05GSUdfVVNCPW0KKyMgQ09ORklHX1VTQl9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQU5OT1VOQ0VfTkVXX0RFVklDRVMgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgVVNCIG9wdGlvbnMKKyMKK0NPTkZJR19VU0JfREVWSUNFRlM9eQorIyBDT05GSUdfVVNCX0RFVklDRV9DTEFTUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRFlOQU1JQ19NSU5PUlMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX09URyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT1RHX1dISVRFTElTVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT1RHX0JMQUNLTElTVF9IVUIgaXMgbm90IHNldAorQ09ORklHX1VTQl9NT049eQorCisjCisjIFVTQiBIb3N0IENvbnRyb2xsZXIgRHJpdmVycworIworIyBDT05GSUdfVVNCX0M2N1gwMF9IQ0QgaXMgbm90IHNldAorQ09ORklHX1VTQl9JU1AxMTZYX0hDRD1tCisjIENPTkZJR19VU0JfSVNQMTc2MF9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NMODExX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUjhBNjY1OTdfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9NVVNCX0hEUkMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9NVVNCX0hEUkMgaXMgbm90IHNldAorCisjCisjIFVTQiBEZXZpY2UgQ2xhc3MgZHJpdmVycworIworIyBDT05GSUdfVVNCX0FDTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUFJJTlRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfV0RNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9UTUMgaXMgbm90IHNldAorCisjCisjIE5PVEU6IFVTQl9TVE9SQUdFIGVuYWJsZXMgU0NTSSwgYW5kICdTQ1NJIGRpc2sgc3VwcG9ydCcKKyMKKworIworIyBtYXkgYWxzbyBiZSBuZWVkZWQ7IHNlZSBVU0JfU1RPUkFHRSBIZWxwIGZvciBtb3JlIGluZm9ybWF0aW9uCisjCitDT05GSUdfVVNCX1NUT1JBR0U9bQorIyBDT05GSUdfVVNCX1NUT1JBR0VfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfREFUQUZBQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9GUkVFQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0lTRDIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9EUENNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1VTQkFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1NERFIwOSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9TRERSNTUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfSlVNUFNIT1QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfQUxBVURBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX09ORVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0tBUk1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0NZUFJFU1NfQVRBQ0IgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xJQlVTVUFMIGlzIG5vdCBzZXQKKworIworIyBVU0IgSW1hZ2luZyBkZXZpY2VzCisjCisjIENPTkZJR19VU0JfTURDODAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9NSUNST1RFSyBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHBvcnQgZHJpdmVycworIworIyBDT05GSUdfVVNCX1NFUklBTCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIE1pc2NlbGxhbmVvdXMgZHJpdmVycworIworIyBDT05GSUdfVVNCX0VNSTYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9FTUkyNiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQURVVFVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVZTRUcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1JJTzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEVHT1RPV0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0JFUlJZX0NIQVJHRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9DWVBSRVNTX0NZN0M2MyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQ1lUSEVSTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEhJREdFVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSURNT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRlRESV9FTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BUFBMRURJU1BMQVkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9UUkFOQ0VWSUJSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSU9XQVJSSU9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JU0lHSFRGVyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVlNUIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfR0FER0VUPXkKKyMgQ09ORklHX1VTQl9HQURHRVRfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9ERUJVR19GSUxFUyBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0dBREdFVF9WQlVTX0RSQVc9MgorQ09ORklHX1VTQl9HQURHRVRfU0VMRUNURUQ9eQorIyBDT05GSUdfVVNCX0dBREdFVF9BVDkxIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfR0FER0VUX0FUTUVMX1VTQkE9eQorQ09ORklHX1VTQl9BVE1FTF9VU0JBPXkKKyMgQ09ORklHX1VTQl9HQURHRVRfRlNMX1VTQjIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9MSDdBNDBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfT01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX1BYQTI1WCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX1BYQTI3WCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX1MzQzI0MTAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9NNjY1OTIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9BTUQ1NTM2VURDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfRlNMX1FFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfTkVUMjI4MCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0dPS1UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9EVU1NWV9IQ0QgaXMgbm90IHNldAorQ09ORklHX1VTQl9HQURHRVRfRFVBTFNQRUVEPXkKK0NPTkZJR19VU0JfWkVSTz1tCitDT05GSUdfVVNCX0VUSD1tCitDT05GSUdfVVNCX0VUSF9STkRJUz15CitDT05GSUdfVVNCX0dBREdFVEZTPW0KK0NPTkZJR19VU0JfRklMRV9TVE9SQUdFPW0KKyMgQ09ORklHX1VTQl9GSUxFX1NUT1JBR0VfVEVTVCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0dfU0VSSUFMPW0KKyMgQ09ORklHX1VTQl9NSURJX0dBREdFVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR19QUklOVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9DRENfQ09NUE9TSVRFIGlzIG5vdCBzZXQKK0NPTkZJR19NTUM9bQorIyBDT05GSUdfTU1DX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQ19VTlNBRkVfUkVTVU1FIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QvU0RJTyBDYXJkIERyaXZlcnMKKyMKK0NPTkZJR19NTUNfQkxPQ0s9bQorQ09ORklHX01NQ19CTE9DS19CT1VOQ0U9eQorIyBDT05GSUdfU0RJT19VQVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQ19URVNUIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QvU0RJTyBIb3N0IENvbnRyb2xsZXIgRHJpdmVycworIworIyBDT05GSUdfTU1DX1NESENJIGlzIG5vdCBzZXQKK0NPTkZJR19NTUNfQVRNRUxNQ0k9bQorIyBDT05GSUdfTU1DX1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19NRU1TVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CisjIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKK0NPTkZJR19SVENfTElCPXkKK0NPTkZJR19SVENfQ0xBU1M9eQorQ09ORklHX1JUQ19IQ1RPU1lTPXkKK0NPTkZJR19SVENfSENUT1NZU19ERVZJQ0U9InJ0YzAiCisjIENPTkZJR19SVENfREVCVUcgaXMgbm90IHNldAorCisjCisjIFJUQyBpbnRlcmZhY2VzCisjCitDT05GSUdfUlRDX0lOVEZfU1lTRlM9eQorQ09ORklHX1JUQ19JTlRGX1BST0M9eQorQ09ORklHX1JUQ19JTlRGX0RFVj15CisjIENPTkZJR19SVENfSU5URl9ERVZfVUlFX0VNVUwgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9URVNUIGlzIG5vdCBzZXQKKworIworIyBJMkMgUlRDIGRyaXZlcnMKKyMKKyMgQ09ORklHX1JUQ19EUlZfRFMxMzA3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxMzc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNjcyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTUFYNjkwMCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JTNUMzNzIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9JU0wxMjA4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfWDEyMDUgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9QQ0Y4NTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUENGODU4MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000MVQ4MCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1MzNTM5MEEgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9GTTMxMzAgaXMgbm90IHNldAorCisjCisjIFNQSSBSVEMgZHJpdmVycworIworIyBDT05GSUdfUlRDX0RSVl9NNDFUOTQgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzEzMDUgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NQVg2OTAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUjk3MDEgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SUzVDMzQ4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMzMjM0IGlzIG5vdCBzZXQKKworIworIyBQbGF0Zm9ybSBSVEMgZHJpdmVycworIworIyBDT05GSUdfUlRDX0RSVl9EUzEyODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE1MTEgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE1NTMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE3NDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9TVEsxN1RBOCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQ4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQzNSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQ1OSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0JRNDgwMiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1YzMDIwIGlzIG5vdCBzZXQKKworIworIyBvbi1DUFUgUlRDIGRyaXZlcnMKKyMKK0NPTkZJR19SVENfRFJWX0FUMzJBUDcwMFg9eQorIyBDT05GSUdfRE1BREVWSUNFUyBpcyBub3Qgc2V0CisjIENPTkZJR19VSU8gaXMgbm90IHNldAorIyBDT05GSUdfU1RBR0lORyBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz1tCisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKK0NPTkZJR19GSUxFX0xPQ0tJTkc9eQorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQorQ09ORklHX0lOT1RJRllfVVNFUj15CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworQ09ORklHX0ZBVF9GUz15CitDT05GSUdfTVNET1NfRlM9eQorQ09ORklHX1ZGQVRfRlM9bQorQ09ORklHX0ZBVF9ERUZBVUxUX0NPREVQQUdFPTg1MAorQ09ORklHX0ZBVF9ERUZBVUxUX0lPQ0hBUlNFVD0iaXNvODg1OS0xIgorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CisjIENPTkZJR19QUk9DX0tDT1JFIGlzIG5vdCBzZXQKK0NPTkZJR19QUk9DX1NZU0NUTD15CitDT05GSUdfUFJPQ19QQUdFX01PTklUT1I9eQorQ09ORklHX1NZU0ZTPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19DT05GSUdGU19GUz15CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfRlM9eQorQ09ORklHX0pGRlMyX0ZTX0RFQlVHPTAKK0NPTkZJR19KRkZTMl9GU19XUklURUJVRkZFUj15CisjIENPTkZJR19KRkZTMl9GU19XQlVGX1ZFUklGWSBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9TVU1NQVJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0NPTVBSRVNTSU9OX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX1pMSUI9eQorIyBDT05GSUdfSkZGUzJfTFpPIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9SVElNRT15CisjIENPTkZJR19KRkZTMl9SVUJJTiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKK0NPTkZJR19ORlNfRlM9eQorQ09ORklHX05GU19WMz15CisjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CitDT05GSUdfUk9PVF9ORlM9eQorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19ORlNfQ09NTU9OPXkKK0NPTkZJR19TVU5SUEM9eQorIyBDT05GSUdfU1VOUlBDX1JFR0lTVEVSX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCisjIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CitDT05GSUdfTkxTPXkKK0NPTkZJR19OTFNfREVGQVVMVD0iaXNvODg1OS0xIgorQ09ORklHX05MU19DT0RFUEFHRV80Mzc9bQorIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKK0NPTkZJR19OTFNfQ09ERVBBR0VfODUwPW0KKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTM2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTQ5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQVNDSUkgaXMgbm90IHNldAorQ09ORklHX05MU19JU084ODU5XzE9bQorIyBDT05GSUdfTkxTX0lTTzg4NTlfMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8zIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV82IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAorQ09ORklHX05MU19VVEY4PW0KKyMgQ09ORklHX0RMTSBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19FTkFCTEVfV0FSTl9ERVBSRUNBVEVEPXkKK0NPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CitDT05GSUdfRlJBTUVfV0FSTj0xMDI0CitDT05GSUdfTUFHSUNfU1lTUlE9eQorIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKKyMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKK0NPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CisjIENPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQyBpcyBub3Qgc2V0CitDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUNfVkFMVUU9MAorQ09ORklHX1NDSEVEX0RFQlVHPXkKKyMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfVElNRVJfU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfT0JKRUNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19TTFVCX0RFQlVHX09OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMVUJfU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUlRfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19SVF9NVVRFWF9URVNURVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MT0NLX0FMTE9DIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BST1ZFX0xPQ0tJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTE9DS19TVEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKKyMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfV1JJVEVDT1VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NRU1PUllfSU5JVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKK0NPTkZJR19GUkFNRV9QT0lOVEVSPXkKKyMgQ09ORklHX0JPT1RfUFJJTlRLX0RFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CisjIENPTkZJR19LUFJPQkVTX1NBTklUWV9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQkxPQ0tfRVhUX0RFVlQgaXMgbm90IHNldAorIyBDT05GSUdfTEtEVE0gaXMgbm90IHNldAorIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RZTkFNSUNfUFJJTlRLX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlGUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWV9GSUxFX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPPXkKKworIworIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKKyMKKyMgQ09ORklHX0NSWVBUT19GSVBTIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fQUxHQVBJPXkKK0NPTkZJR19DUllQVE9fQUVBRD15CitDT05GSUdfQ1JZUFRPX0JMS0NJUEhFUj15CitDT05GSUdfQ1JZUFRPX0hBU0g9eQorQ09ORklHX0NSWVBUT19STkc9eQorQ09ORklHX0NSWVBUT19NQU5BR0VSPXkKKyMgQ09ORklHX0NSWVBUT19HRjEyOE1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1JZUFREIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fQVVUSEVOQz15CisjIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgQXV0aGVudGljYXRlZCBFbmNyeXB0aW9uIHdpdGggQXNzb2NpYXRlZCBEYXRhCisjCisjIENPTkZJR19DUllQVE9fQ0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUUlWIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBtb2RlcworIworQ09ORklHX0NSWVBUT19DQkM9eQorIyBDT05GSUdfQ1JZUFRPX0NUUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1RTIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fRUNCPW0KKyMgQ09ORklHX0NSWVBUT19MUlcgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19QQ0JDPW0KKyMgQ09ORklHX0NSWVBUT19YVFMgaXMgbm90IHNldAorCisjCisjIEhhc2ggbW9kZXMKKyMKK0NPTkZJR19DUllQVE9fSE1BQz15CisjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisKKyMKKyMgRGlnZXN0CisjCisjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19NRDU9eQorIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxMjggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDE2MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQzMjAgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19TSEExPXkKKyMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19XUDUxMiBpcyBub3Qgc2V0CisKKyMKKyMgQ2lwaGVycworIworIyBDT05GSUdfQ1JZUFRPX0FFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQU5VQklTIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fQVJDND1tCisjIENPTkZJR19DUllQVE9fQkxPV0ZJU0ggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBTUVMTElBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDYgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19ERVM9eQorIyBDT05GSUdfQ1JZUFRPX0ZDUllQVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TQUxTQTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRUVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVJQRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldAorCisjCisjIENvbXByZXNzaW9uCisjCitDT05GSUdfQ1JZUFRPX0RFRkxBVEU9eQorIyBDT05GSUdfQ1JZUFRPX0xaTyBpcyBub3Qgc2V0CisKKyMKKyMgUmFuZG9tIE51bWJlciBHZW5lcmF0aW9uCisjCisjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0hXPXkKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCitDT05GSUdfQklUUkVWRVJTRT15CitDT05GSUdfQ1JDX0NDSVRUPW0KKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19UMTBESUYgaXMgbm90IHNldAorQ09ORklHX0NSQ19JVFVfVD1tCitDT05GSUdfQ1JDMzI9eQorQ09ORklHX0NSQzc9bQorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19aTElCX0lORkxBVEU9eQorQ09ORklHX1pMSUJfREVGTEFURT15CitDT05GSUdfR0VORVJJQ19BTExPQ0FUT1I9eQorQ09ORklHX1BMSVNUPXkKK0NPTkZJR19IQVNfSU9NRU09eQorQ09ORklHX0hBU19JT1BPUlQ9eQorQ09ORklHX0hBU19ETUE9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL0tidWlsZAppbmRleCAzMTM2NjI4Li4yMTk4MjJjIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMSwzICsxLDQgQEAKIGluY2x1ZGUgaW5jbHVkZS9hc20tZ2VuZXJpYy9LYnVpbGQuYXNtCiAKK2hlYWRlci15CSs9IHN3YWIuaAogaGVhZGVyLXkJKz0gY2FjaGVjdGwuaApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9hdG1lbC1tY2kuaCBiL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vYXRtZWwtbWNpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZjNmYWQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9hdG1lbC1tY2kuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLSNpZm5kZWYgX19BU01fQVZSMzJfQVRNRUxfTUNJX0gKLSNkZWZpbmUgX19BU01fQVZSMzJfQVRNRUxfTUNJX0gKLQotI2RlZmluZSBBVE1FTF9NQ0lfTUFYX05SX1NMT1RTCTIKLQotc3RydWN0IGRtYV9zbGF2ZTsKLQotLyoqCi0gKiBzdHJ1Y3QgbWNpX3Nsb3RfcGRhdGEgLSBib2FyZC1zcGVjaWZpYyBwZXItc2xvdCBjb25maWd1cmF0aW9uCi0gKiBAYnVzX3dpZHRoOiBOdW1iZXIgb2YgZGF0YSBsaW5lcyB3aXJlZCB1cCB0aGUgc2xvdAotICogQGRldGVjdF9waW46IEdQSU8gcGluIHdpcmVkIHRvIHRoZSBjYXJkIGRldGVjdCBzd2l0Y2gKLSAqIEB3cF9waW46IEdQSU8gcGluIHdpcmVkIHRvIHRoZSB3cml0ZSBwcm90ZWN0IHNlbnNvcgotICoKLSAqIElmIGEgZ2l2ZW4gc2xvdCBpcyBub3QgcHJlc2VudCBvbiB0aGUgYm9hcmQsIEBidXNfd2lkdGggc2hvdWxkIGJlCi0gKiBzZXQgdG8gMC4gVGhlIG90aGVyIGZpZWxkcyBhcmUgaWdub3JlZCBpbiB0aGlzIGNhc2UuCi0gKgotICogQW55IHBpbnMgdGhhdCBhcmVuJ3QgYXZhaWxhYmxlIHNob3VsZCBiZSBzZXQgdG8gYSBuZWdhdGl2ZSB2YWx1ZS4KLSAqCi0gKiBOb3RlIHRoYXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc2xvdHMgaXMgZXhwZXJpbWVudGFsIC0tIHNvbWUgY2FyZHMKLSAqIG1pZ2h0IGdldCB1cHNldCBpZiB3ZSBkb24ndCBnZXQgdGhlIGNsb2NrIG1hbmFnZW1lbnQgZXhhY3RseSByaWdodC4KLSAqIEJ1dCBpbiBtb3N0IGNhc2VzLCBpdCBzaG91bGQgd29yayBqdXN0IGZpbmUuCi0gKi8KLXN0cnVjdCBtY2lfc2xvdF9wZGF0YSB7Ci0JdW5zaWduZWQgaW50CQlidXNfd2lkdGg7Ci0JaW50CQkJZGV0ZWN0X3BpbjsKLQlpbnQJCQl3cF9waW47Ci19OwotCi0vKioKLSAqIHN0cnVjdCBtY2lfcGxhdGZvcm1fZGF0YSAtIGJvYXJkLXNwZWNpZmljIE1NQy9TRGNhcmQgY29uZmlndXJhdGlvbgotICogQGRtYV9zbGF2ZTogRE1BIHNsYXZlIGludGVyZmFjZSB0byB1c2UgaW4gZGF0YSB0cmFuc2ZlcnMsIG9yIE5VTEwuCi0gKiBAc2xvdDogUGVyLXNsb3QgY29uZmlndXJhdGlvbiBkYXRhLgotICovCi1zdHJ1Y3QgbWNpX3BsYXRmb3JtX2RhdGEgewotCXN0cnVjdCBkbWFfc2xhdmUJKmRtYV9zbGF2ZTsKLQlzdHJ1Y3QgbWNpX3Nsb3RfcGRhdGEJc2xvdFtBVE1FTF9NQ0lfTUFYX05SX1NMT1RTXTsKLX07Ci0KLSNlbmRpZiAvKiBfX0FTTV9BVlIzMl9BVE1FTF9NQ0lfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9hdG9taWMuaCBiL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vYXRvbWljLmgKaW5kZXggN2VmMzg2Mi4uMzE4ODE1MSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9hdG9taWMuaAorKysgYi9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL2F0b21pYy5oCkBAIC0xNCw5ICsxNCw5IEBACiAjaWZuZGVmIF9fQVNNX0FWUjMyX0FUT01JQ19ICiAjZGVmaW5lIF9fQVNNX0FWUjMyX0FUT01JQ19ICiAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAotdHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBpbnQgY291bnRlcjsgfSBhdG9taWNfdDsKICNkZWZpbmUgQVRPTUlDX0lOSVQoaSkgIHsgKGkpIH0KIAogI2RlZmluZSBhdG9taWNfcmVhZCh2KQkJKCh2KS0+Y291bnRlcikKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmggYi9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCmluZGV4IDhlM2FmMDIuLjJhYmE2NGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKKysrIGIvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaApAQCAtNCwzNCArNCw3IEBACiAjaWZuZGVmIF9fQVNNX0FWUjMyX0JZVEVPUkRFUl9ICiAjZGVmaW5lIF9fQVNNX0FWUjMyX0JZVEVPUkRFUl9ICiAKLSNpbmNsdWRlIDxhc20vdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGFzbS9zd2FiLmg+CisjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2JpZ19lbmRpYW4uaD4KIAotI2RlZmluZSBfX0JJR19FTkRJQU4KLSNkZWZpbmUgX19TV0FCXzY0X1RIUlVfMzJfXwotCi0jaWZkZWYgX19DSEVDS0VSX18KLWV4dGVybiB1bnNpZ25lZCBsb25nIF9fYnVpbHRpbl9ic3dhcF8zMih1bnNpZ25lZCBsb25nIHgpOwotZXh0ZXJuIHVuc2lnbmVkIHNob3J0IF9fYnVpbHRpbl9ic3dhcF8xNih1bnNpZ25lZCBzaG9ydCB4KTsKLSNlbmRpZgotCi0vKgotICogYXZyMzItbGludXgtZ2NjIHZlcnNpb25zIGVhcmxpZXIgdGhhbiA0LjIgaW1wcm9wZXJseSBzaWduLWV4dGVuZHMKLSAqIHRoZSByZXN1bHQuCi0gKi8KLSNpZiAhKF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPCAyKQotc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTE2IF9fYXJjaF9zd2FiMTYoX191MTYgdmFsKQotewotCXJldHVybiBfX2J1aWx0aW5fYnN3YXBfMTYodmFsKTsKLX0KLSNkZWZpbmUgX19hcmNoX3N3YWIxNiBfX2FyY2hfc3dhYjE2Ci0KLXN0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UzMiBfX2FyY2hfc3dhYjMyKF9fdTMyIHZhbCkKLXsKLQlyZXR1cm4gX19idWlsdGluX2Jzd2FwXzMyKHZhbCk7Ci19Ci0jZGVmaW5lIF9fYXJjaF9zd2FiMzIgX19hcmNoX3N3YWIzMgotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIuaD4KICNlbmRpZiAvKiBfX0FTTV9BVlIzMl9CWVRFT1JERVJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9rZGVidWcuaCBiL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20va2RlYnVnLmgKaW5kZXggY2E0Zjk1NC4uZjkzMGNlMiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9rZGVidWcuaAorKysgYi9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL2tkZWJ1Zy5oCkBAIC02LDYgKzYsNyBAQAogCURJRV9CUkVBS1BPSU5ULAogCURJRV9TU1RFUCwKIAlESUVfTk1JLAorCURJRV9PT1BTLAogfTsKIAogI2VuZGlmIC8qIF9fQVNNX0FWUjMyX0tERUJVR19IICovCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL3N3YWIuaCBiL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vc3dhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNGFhNWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL3N3YWIuaApAQCAtMCwwICsxLDM1IEBACisvKgorICogQVZSMzIgYnl0ZXN3YXBwaW5nIGZ1bmN0aW9ucy4KKyAqLworI2lmbmRlZiBfX0FTTV9BVlIzMl9TV0FCX0gKKyNkZWZpbmUgX19BU01fQVZSMzJfU1dBQl9ICisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorCisjZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KKworI2lmZGVmIF9fQ0hFQ0tFUl9fCitleHRlcm4gdW5zaWduZWQgbG9uZyBfX2J1aWx0aW5fYnN3YXBfMzIodW5zaWduZWQgbG9uZyB4KTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCBfX2J1aWx0aW5fYnN3YXBfMTYodW5zaWduZWQgc2hvcnQgeCk7CisjZW5kaWYKKworLyoKKyAqIGF2cjMyLWxpbnV4LWdjYyB2ZXJzaW9ucyBlYXJsaWVyIHRoYW4gNC4yIGltcHJvcGVybHkgc2lnbi1leHRlbmRzCisgKiB0aGUgcmVzdWx0LgorICovCisjaWYgIShfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fIDwgMikKK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UxNiBfX2FyY2hfc3dhYjE2KF9fdTE2IHZhbCkKK3sKKwlyZXR1cm4gX19idWlsdGluX2Jzd2FwXzE2KHZhbCk7Cit9CisjZGVmaW5lIF9fYXJjaF9zd2FiMTYgX19hcmNoX3N3YWIxNgorCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19hcmNoX3N3YWIzMihfX3UzMiB2YWwpCit7CisJcmV0dXJuIF9fYnVpbHRpbl9ic3dhcF8zMih2YWwpOworfQorI2RlZmluZSBfX2FyY2hfc3dhYjMyIF9fYXJjaF9zd2FiMzIKKyNlbmRpZgorCisjZW5kaWYgLyogX19BU01fQVZSMzJfU1dBQl9IICovCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL3N5c2NhbGxzLmggYi9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL3N5c2NhbGxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgzZDY2NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vc3lzY2FsbHMuaApAQCAtMCwwICsxLDM5IEBACisvKgorICogc3lzY2FsbHMuaCAtIExpbnV4IHN5c2NhbGwgaW50ZXJmYWNlcyAoYXJjaC1zcGVjaWZpYykKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSmFzd2luZGVyIFNpbmdoCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2Mi4KKyAqIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfQVNNX0FWUjMyX1NZU0NBTExTX0gKKyNkZWZpbmUgX0FTTV9BVlIzMl9TWVNDQUxMU19ICisKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorCisvKiBrZXJuZWwvcHJvY2Vzcy5jICovCithc21saW5rYWdlIGludCBzeXNfZm9yayhzdHJ1Y3QgcHRfcmVncyAqKTsKK2FzbWxpbmthZ2UgaW50IHN5c19jbG9uZSh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLAorCQkJIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsCisJCQkgc3RydWN0IHB0X3JlZ3MgKik7Cithc21saW5rYWdlIGludCBzeXNfdmZvcmsoc3RydWN0IHB0X3JlZ3MgKik7Cithc21saW5rYWdlIGludCBzeXNfZXhlY3ZlKGNoYXIgX191c2VyICosIGNoYXIgX191c2VyICpfX3VzZXIgKiwKKwkJCSAgY2hhciBfX3VzZXIgKl9fdXNlciAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKKworLyoga2VybmVsL3NpZ25hbC5jICovCithc21saW5rYWdlIGludCBzeXNfc2lnYWx0c3RhY2soY29uc3Qgc3RhY2tfdCBfX3VzZXIgKiwgc3RhY2tfdCBfX3VzZXIgKiwKKwkJCSAgICAgICBzdHJ1Y3QgcHRfcmVncyAqKTsKK2FzbWxpbmthZ2UgaW50IHN5c19ydF9zaWdyZXR1cm4oc3RydWN0IHB0X3JlZ3MgKik7CisKKy8qIGtlcm5lbC9zeXNfYXZyMzIuYyAqLworYXNtbGlua2FnZSBsb25nIHN5c19tbWFwMih1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLAorCQkJICB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBvZmZfdCk7CisKKy8qIG1tL2NhY2hlLmMgKi8KK2FzbWxpbmthZ2UgaW50IHN5c19jYWNoZWZsdXNoKGludCwgdm9pZCBfX3VzZXIgKiwgc2l6ZV90KTsKKworI2VuZGlmIC8qIF9BU01fQVZSMzJfU1lTQ0FMTFNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9hdnIzMi9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDEzNGQ1MzAuLjQzYWU1NTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL2F2cjMyL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTE4LDYgKzE4LDcgQEAKIAogI2luY2x1ZGUgPGFzbS9zeXNyZWcuaD4KICNpbmNsdWRlIDxhc20vb2NkLmg+CisjaW5jbHVkZSA8YXNtL3N5c2NhbGxzLmg+CiAKICNpbmNsdWRlIDxtYWNoL3BtLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9hdnIzMi9rZXJuZWwvc2lnbmFsLmMKaW5kZXggYzViMTFmOS4uODAzZDdiZSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC9hdnIzMi9rZXJuZWwvc2lnbmFsLmMKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3Vjb250ZXh0Lmg+CisjaW5jbHVkZSA8YXNtL3N5c2NhbGxzLmg+CiAKICNkZWZpbmUgX0JMT0NLQUJMRSAofihzaWdtYXNrKFNJR0tJTEwpIHwgc2lnbWFzayhTSUdTVE9QKSkpCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIva2VybmVsL3N5c19hdnIzMi5jIGIvYXJjaC9hdnIzMi9rZXJuZWwvc3lzX2F2cjMyLmMKaW5kZXggOGU4OTExZS4uNWQyZGFlYSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9rZXJuZWwvc3lzX2F2cjMyLmMKKysrIGIvYXJjaC9hdnIzMi9rZXJuZWwvc3lzX2F2cjMyLmMKQEAgLTEzLDYgKzEzLDcgQEAKIAogI2luY2x1ZGUgPGFzbS9tbWFuLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzY2FsbHMuaD4KIAogYXNtbGlua2FnZSBsb25nIHN5c19tbWFwMih1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAogCQkJICB1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9hdnIzMi9rZXJuZWwvdHJhcHMuYwppbmRleCAwZDk4NzM3Li5kNTQ3YzhkIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvYXZyMzIva2VybmVsL3RyYXBzLmMKQEAgLTcsNiArNyw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgorI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxsaW51eC9rZGVidWcuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvYXQzMmFwNzAweC5jIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9hdDMyYXA3MDB4LmMKaW5kZXggMDY2MjUyZS4uM2ZiZmQxZSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9hdDMyYXA3MDB4LmMKKysrIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9hdDMyYXA3MDB4LmMKQEAgLTE1LDggKzE1LDggQEAKICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9hdG1lbF91c2JhX3VkYy5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bWVsLW1jaS5oPgogCi0jaW5jbHVkZSA8YXNtL2F0bWVsLW1jaS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KIApAQCAtNDIxLDcgKzQyMSw3IEBACiAJcmV0dXJuIGJ1c19jbGtfZ2V0X3JhdGUoY2xrLCBzaGlmdCk7CiB9CiAKLXN0YXRpYyB2b2lkIHBiYV9jbGtfbW9kZShzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGVkKQordm9pZCBwYmFfY2xrX21vZGUoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlZCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUzMiBtYXNrOwpAQCAtNDM2LDcgKzQzNiw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG1fbG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBwYmFfY2xrX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKK3Vuc2lnbmVkIGxvbmcgcGJhX2Nsa19nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCiB7CiAJdW5zaWduZWQgbG9uZyBja3NlbCwgc2hpZnQgPSAwOwogCkBAIC0xMzA1LDcgKzEzMDUsNyBAQAogYXQzMl9hZGRfZGV2aWNlX21jaSh1bnNpZ25lZCBpbnQgaWQsIHN0cnVjdCBtY2lfcGxhdGZvcm1fZGF0YSAqZGF0YSkKIHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCQkqcGRldjsKLQlzdHJ1Y3QgZHdfZG1hX3NsYXZlCQkqZHdzOworCXN0cnVjdCBkd19kbWFfc2xhdmUJCSpkd3MgPSAmZGF0YS0+ZG1hX3NsYXZlOwogCXUzMgkJCQlwaW9hX21hc2s7CiAJdTMyCQkJCXBpb2JfbWFzazsKIApAQCAtMTMyNCwyMiArMTMyNCwxMyBAQAogCQkJCUFSUkFZX1NJWkUoYXRtZWxfbWNpMF9yZXNvdXJjZSkpKQogCQlnb3RvIGZhaWw7CiAKLQlpZiAoZGF0YS0+ZG1hX3NsYXZlKQotCQlkd3MgPSBrbWVtZHVwKHRvX2R3X2RtYV9zbGF2ZShkYXRhLT5kbWFfc2xhdmUpLAotCQkJCXNpemVvZihzdHJ1Y3QgZHdfZG1hX3NsYXZlKSwgR0ZQX0tFUk5FTCk7Ci0JZWxzZQotCQlkd3MgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHdfZG1hX3NsYXZlKSwgR0ZQX0tFUk5FTCk7Ci0KLQlkd3MtPnNsYXZlLmRldiA9ICZwZGV2LT5kZXY7Ci0JZHdzLT5zbGF2ZS5kbWFfZGV2ID0gJmR3X2RtYWMwX2RldmljZS5kZXY7Ci0JZHdzLT5zbGF2ZS5yZWdfd2lkdGggPSBETUFfU0xBVkVfV0lEVEhfMzJCSVQ7CisJZHdzLT5kbWFfZGV2ID0gJmR3X2RtYWMwX2RldmljZS5kZXY7CisJZHdzLT5yZWdfd2lkdGggPSBEV19ETUFfU0xBVkVfV0lEVEhfMzJCSVQ7CiAJZHdzLT5jZmdfaGkgPSAoRFdDX0NGR0hfU1JDX1BFUigwKQogCQkJCXwgRFdDX0NGR0hfRFNUX1BFUigxKSk7CiAJZHdzLT5jZmdfbG8gJj0gfihEV0NfQ0ZHTF9IU19EU1RfUE9MCiAJCQkJfCBEV0NfQ0ZHTF9IU19TUkNfUE9MKTsKIAotCWRhdGEtPmRtYV9zbGF2ZSA9ICZkd3MtPnNsYXZlOwotCiAJaWYgKHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShwZGV2LCBkYXRhLAogCQkJCXNpemVvZihzdHJ1Y3QgbWNpX3BsYXRmb3JtX2RhdGEpKSkKIAkJZ290byBmYWlsOwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9jbG9jay5jIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9jbG9jay5jCmluZGV4IDEzOGEwMGEuLjQ0MmYwOGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvY2xvY2suYworKysgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2Nsb2NrLmMKQEAgLTE5OCw3ICsxOTgsNyBAQAogCXVuc2lnbmVkCWk7CiAKIAkvKiBza2lwIGNsb2NrcyBjb3VwbGVkIHRvIGRldmljZXMgdGhhdCBhcmVuJ3QgcmVnaXN0ZXJlZCAqLwotCWlmIChwYXJlbnQtPmRldiAmJiAhcGFyZW50LT5kZXYtPmJ1c19pZFswXSAmJiAhcGFyZW50LT51c2VycykKKwlpZiAocGFyZW50LT5kZXYgJiYgIWRldl9uYW1lKHBhcmVudC0+ZGV2KSAmJiAhcGFyZW50LT51c2VycykKIAkJcmV0dXJuOwogCiAJLyogPG5lc3Qgc3BhY2VzPiBuYW1lIDxwYWQgdG8gZW5kPiAqLwpAQCAtMjE0LDcgKzIxNCw3IEBACiAJCXBhcmVudC0+dXNlcnMgPyAib24iIDogIm9mZiIsCS8qIE5PVEU6IG5vdC1wYXJhbm9pZCEhICovCiAJCWNsa19nZXRfcmF0ZShwYXJlbnQpKTsKIAlpZiAocGFyZW50LT5kZXYpCi0JCXNlcV9wcmludGYoci0+cywgIiwgZm9yICVzIiwgcGFyZW50LT5kZXYtPmJ1c19pZCk7CisJCXNlcV9wcmludGYoci0+cywgIiwgZm9yICVzIiwgZGV2X25hbWUocGFyZW50LT5kZXYpKTsKIAlzZXFfcHJpbnRmKHItPnMsICJcbiIpOwogCiAJLyogY29zdCBvZiB0aGlzIHNjYW4gaXMgc21hbGwsIGJ1dCBub3QgbGluZWFyLi4uICovCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2Nsb2NrLmggYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2Nsb2NrLmgKaW5kZXggNjIzYmYwZS4uNGM3ZWJiZCAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9jbG9jay5oCisrKyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvY2xvY2suaApAQCAtMzAsMyArMzAsNiBAQAogCXUxNgkJdXNlcnM7CQkvKiBFbmFibGVkIGlmIG5vbi16ZXJvICovCiAJdTE2CQlpbmRleDsJCS8qIFNpYmxpbmcgaW5kZXggKi8KIH07CisKK3Vuc2lnbmVkIGxvbmcgcGJhX2Nsa19nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspOwordm9pZCBwYmFfY2xrX21vZGUoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlZCk7CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2luY2x1ZGUvbWFjaC9hdDMyYXA3MDB4LmggYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2luY2x1ZGUvbWFjaC9hdDMyYXA3MDB4LmgKaW5kZXggYTc3ZDM3Mi4uNWM0Yzk3MSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9pbmNsdWRlL21hY2gvYXQzMmFwNzAweC5oCisrKyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvaW5jbHVkZS9tYWNoL2F0MzJhcDcwMHguaApAQCAtMjExLDQgKzIxMSw3IEBACiAKICNkZWZpbmUgQVRNRUxfTENEQ19BTFRfMTVCSVQJKEFUTUVMX0xDRENfQ09OVFJPTCB8IEFUTUVMX0xDRENfQUxUXzE1Ql9EQVRBKQogCisvKiBCaXRtYXNrIGZvciBhbGwgRUJJIGRhdGEgKEQxNi4uRDMxKSBwaW5zIG9uIHBvcnQgRSAqLworI2RlZmluZSBBVE1FTF9FQklfUEVfREFUQV9BTEwgICgweDAwMDBGRkZGKQorCiAjZW5kaWYgLyogX19BU01fQVJDSF9BVDMyQVA3MDBYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9pbmNsdWRlL21hY2gvcG9ydG11eC5oIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9pbmNsdWRlL21hY2gvcG9ydG11eC5oCmluZGV4IDIxYzc5MzcuLjQ4NzMwMjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvaW5jbHVkZS9tYWNoL3BvcnRtdXguaAorKysgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2luY2x1ZGUvbWFjaC9wb3J0bXV4LmgKQEAgLTI1LDYgKzI1LDYgQEAKIAkJCXVuc2lnbmVkIGludCBwZXJpcGgsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwogdm9pZCBhdDMyX3NlbGVjdF9ncGlvKHVuc2lnbmVkIGludCBwaW4sIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwogdm9pZCBhdDMyX2Rlc2VsZWN0X3Bpbih1bnNpZ25lZCBpbnQgcGluKTsKLXZvaWQgYXQzMl9yZXNlcnZlX3Bpbih1bnNpZ25lZCBpbnQgcGluKTsKK3ZvaWQgYXQzMl9yZXNlcnZlX3Bpbih1bnNpZ25lZCBpbnQgcG9ydCwgdTMyIHBpbl9tYXNrKTsKIAogI2VuZGlmIC8qIF9fQVNNX0FSQ0hfUE9SVE1VWF9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvcGlvLmMgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL3Bpby5jCmluZGV4IGVkODFhOGIuLjA5YTI3NGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvcGlvLmMKKysrIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9waW8uYwpAQCAtMTY3LDIyICsxNjcsMjkgQEAKIH0KIAogLyogUmVzZXJ2ZSBhIHBpbiwgcHJldmVudGluZyBhbnlvbmUgZWxzZSBmcm9tIGNoYW5naW5nIGl0cyBjb25maWd1cmF0aW9uLiAqLwotdm9pZCBfX2luaXQgYXQzMl9yZXNlcnZlX3Bpbih1bnNpZ25lZCBpbnQgcGluKQordm9pZCBfX2luaXQgYXQzMl9yZXNlcnZlX3Bpbih1bnNpZ25lZCBpbnQgcG9ydCwgdTMyIHBpbl9tYXNrKQogewogCXN0cnVjdCBwaW9fZGV2aWNlICpwaW87Ci0JdW5zaWduZWQgaW50IHBpbl9pbmRleCA9IHBpbiAmIDB4MWY7CiAKLQlwaW8gPSBncGlvX3RvX3BpbyhwaW4pOworCS8qIGFzc2lnbiBhbmQgdmVyaWZ5IHBpbyAqLworCXBpbyA9IGdwaW9fdG9fcGlvKHBvcnQpOwogCWlmICh1bmxpa2VseSghcGlvKSkgewotCQlwcmludGsoInBpbzogaW52YWxpZCBwaW4gJXVcbiIsIHBpbik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInBpbzogaW52YWxpZCBwb3J0ICV1XG4iLCBwb3J0KTsKIAkJZ290byBmYWlsOwogCX0KIAotCWlmICh1bmxpa2VseSh0ZXN0X2FuZF9zZXRfYml0KHBpbl9pbmRleCwgJnBpby0+cGlubXV4X21hc2spKSkgewotCQlwcmludGsoIiVzOiBwaW4gJXUgaXMgYnVzeVxuIiwgcGlvLT5uYW1lLCBwaW5faW5kZXgpOworCS8qIFRlc3QgaWYgYW55IG9mIHRoZSByZXF1ZXN0ZWQgcGlucyBpcyBhbHJlYWR5IG11eGVkICovCisJc3Bpbl9sb2NrKCZwaW9fbG9jayk7CisJaWYgKHVubGlrZWx5KHBpby0+cGlubXV4X21hc2sgJiBwaW5fbWFzaykpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHBpbihzKSBidXN5IChyZXEuIDB4JXgsIGJ1c3kgMHgleClcbiIsCisJCSAgICAgICBwaW8tPm5hbWUsIHBpbl9tYXNrLCBwaW8tPnBpbm11eF9tYXNrICYgcGluX21hc2spOworCQlzcGluX3VubG9jaygmcGlvX2xvY2spOwogCQlnb3RvIGZhaWw7CiAJfQogCisJLyogUmVzZXJ2ZSBwaW5zICovCisJcGlvLT5waW5tdXhfbWFzayB8PSBwaW5fbWFzazsKKwlzcGluX3VubG9jaygmcGlvX2xvY2spOwogCXJldHVybjsKIAogZmFpbDoKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbW0vY2FjaGUuYyBiL2FyY2gvYXZyMzIvbW0vY2FjaGUuYwppbmRleCAxNWE0ZTVlLi4yNGE3NGQxIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL21tL2NhY2hlLmMKKysrIGIvYXJjaC9hdnIzMi9tbS9jYWNoZS5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8YXNtL2NhY2hlY3RsLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c2NhbGxzLmg+CiAKIC8qCiAgKiBJZiB5b3UgYXR0ZW1wdCB0byBmbHVzaCBhbnl0aGluZyBtb3JlIHRoYW4gdGhpcywgeW91IG5lZWQgc3VwZXJ1c2VyCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21tL2luaXQuYyBiL2FyY2gvYXZyMzIvbW0vaW5pdC5jCmluZGV4IGZhOTJmZjYuLmU4MTlmYTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvbW0vaW5pdC5jCisrKyBiL2FyY2gvYXZyMzIvbW0vaW5pdC5jCkBAIC05Nyw3ICs5Nyw2IEBACiAKIAltZW1fbWFwID0gTk9ERV9EQVRBKDApLT5ub2RlX21lbV9tYXA7CiAKLQltZW1zZXQoemVyb19wYWdlLCAwLCBQQUdFX1NJWkUpOwogCWVtcHR5X3plcm9fcGFnZSA9IHZpcnRfdG9fcGFnZSh6ZXJvX3BhZ2UpOwogCWZsdXNoX2RjYWNoZV9wYWdlKGVtcHR5X3plcm9fcGFnZSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL0tjb25maWcgYi9hcmNoL2JsYWNrZmluL0tjb25maWcKaW5kZXggMjllNzFlZC4uYTk0OWM0ZiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9LY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vS2NvbmZpZwpAQCAtMjYsNiArMjYsNyBAQAogCWRlZmF1bHQgeQogCXNlbGVjdCBIQVZFX0lERQogCXNlbGVjdCBIQVZFX09QUk9GSUxFCisJc2VsZWN0IEFSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCCiAKIGNvbmZpZyBaT05FX0RNQQogCWJvb2wKQEAgLTU5LDEwICs2MCw2IEBACiAJYm9vbAogCWRlZmF1bHQgeQogCi1jb25maWcgSEFSRFdBUkVfUE0KLQlkZWZfYm9vbCB5Ci0JZGVwZW5kcyBvbiBPUFJPRklMRQotCiBzb3VyY2UgImluaXQvS2NvbmZpZyIKIAogc291cmNlICJrZXJuZWwvS2NvbmZpZy5wcmVlbXB0IgpAQCAtNzcsNiArNzQsMjYgQEAKIAlwcm9tcHQgIkNQVSIKIAlkZWZhdWx0IEJGNTMzCiAKK2NvbmZpZyBCRjUxMgorCWJvb2wgIkJGNTEyIgorCWhlbHAKKwkgIEJGNTEyIFByb2Nlc3NvciBTdXBwb3J0LgorCitjb25maWcgQkY1MTQKKwlib29sICJCRjUxNCIKKwloZWxwCisJICBCRjUxNCBQcm9jZXNzb3IgU3VwcG9ydC4KKworY29uZmlnIEJGNTE2CisJYm9vbCAiQkY1MTYiCisJaGVscAorCSAgQkY1MTYgUHJvY2Vzc29yIFN1cHBvcnQuCisKK2NvbmZpZyBCRjUxOAorCWJvb2wgIkJGNTE4IgorCWhlbHAKKwkgIEJGNTE4IFByb2Nlc3NvciBTdXBwb3J0LgorCiBjb25maWcgQkY1MjIKIAlib29sICJCRjUyMiIKIAloZWxwCkBAIC0xMzcsNiArMTU0LDE2IEBACiAJaGVscAogCSAgQkY1MzcgUHJvY2Vzc29yIFN1cHBvcnQuCiAKK2NvbmZpZyBCRjUzOAorCWJvb2wgIkJGNTM4IgorCWhlbHAKKwkgIEJGNTM4IFByb2Nlc3NvciBTdXBwb3J0LgorCitjb25maWcgQkY1MzkKKwlib29sICJCRjUzOSIKKwloZWxwCisJICBCRjUzOSBQcm9jZXNzb3IgU3VwcG9ydC4KKwogY29uZmlnIEJGNTQyCiAJYm9vbCAiQkY1NDIiCiAJaGVscApAQCAtMTY5LDI4ICsxOTYsNTUgQEAKIAogZW5kY2hvaWNlCiAKK2NvbmZpZyBTTVAKKwlkZXBlbmRzIG9uIEJGNTYxCisJYm9vbCAiU3ltbWV0cmljIG11bHRpLXByb2Nlc3Npbmcgc3VwcG9ydCIKKwktLS1oZWxwLS0tCisJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3Igc3lzdGVtcyB3aXRoIG1vcmUgdGhhbiBvbmUgQ1BVLAorCSAgbGlrZSB0aGUgZHVhbCBjb3JlIEJGNTYxLiBJZiB5b3UgaGF2ZSBhIHN5c3RlbSB3aXRoIG9ubHkgb25lCisJICBDUFUsIHNheSBOLiBJZiB5b3UgaGF2ZSBhIHN5c3RlbSB3aXRoIG1vcmUgdGhhbiBvbmUgQ1BVLCBzYXkgWS4KKworCSAgSWYgeW91IGRvbid0IGtub3cgd2hhdCB0byBkbyBoZXJlLCBzYXkgTi4KKworY29uZmlnIE5SX0NQVVMKKwlpbnQKKwlkZXBlbmRzIG9uIFNNUAorCWRlZmF1bHQgMiBpZiBCRjU2MQorCitjb25maWcgSVJRX1BFUl9DUFUKKwlib29sCisJZGVwZW5kcyBvbiBTTVAKKwlkZWZhdWx0IHkKKworY29uZmlnIFRJQ0tfU09VUkNFX1NZU1RNUjAKKwlib29sCisJc2VsZWN0IEJGSU5fR1BUSU1FUlMKKwlkZXBlbmRzIG9uIFNNUAorCWRlZmF1bHQgeQorCiBjb25maWcgQkZfUkVWX01JTgogCWludAotCWRlZmF1bHQgMCBpZiAoQkY1MnggfHwgQkY1NHgpCisJZGVmYXVsdCAwIGlmIChCRjUxeCB8fCBCRjUyeCB8fCBCRjU0eCkKIAlkZWZhdWx0IDIgaWYgKEJGNTM3IHx8IEJGNTM2IHx8IEJGNTM0KQogCWRlZmF1bHQgMyBpZiAoQkY1NjEgfHxCRjUzMyB8fCBCRjUzMiB8fCBCRjUzMSkKKwlkZWZhdWx0IDQgaWYgKEJGNTM4IHx8IEJGNTM5KQogCiBjb25maWcgQkZfUkVWX01BWAogCWludAotCWRlZmF1bHQgMiBpZiAoQkY1MnggfHwgQkY1NHgpCisJZGVmYXVsdCAyIGlmIChCRjUxeCB8fCBCRjUyeCB8fCBCRjU0eCkKIAlkZWZhdWx0IDMgaWYgKEJGNTM3IHx8IEJGNTM2IHx8IEJGNTM0KQotCWRlZmF1bHQgNSBpZiAoQkY1NjEpCisJZGVmYXVsdCA1IGlmIChCRjU2MSB8fCBCRjUzOCB8fCBCRjUzOSkKIAlkZWZhdWx0IDYgaWYgKEJGNTMzIHx8IEJGNTMyIHx8IEJGNTMxKQogCiBjaG9pY2UKIAlwcm9tcHQgIlNpbGljb24gUmV2IgotCWRlZmF1bHQgQkZfUkVWXzBfMSBpZiAoQkY1MnggfHwgQkY1NHgpCisJZGVmYXVsdCBCRl9SRVZfMF8xIGlmIChCRjUxeCB8fCBCRjUyeCB8fCBCRjU0eCkKIAlkZWZhdWx0IEJGX1JFVl8wXzIgaWYgKEJGNTM0IHx8IEJGNTM2IHx8IEJGNTM3KQogCWRlZmF1bHQgQkZfUkVWXzBfMyBpZiAoQkY1MzEgfHwgQkY1MzIgfHwgQkY1MzMgfHwgQkY1NjEpCiAKIGNvbmZpZyBCRl9SRVZfMF8wCiAJYm9vbCAiMC4wIgotCWRlcGVuZHMgb24gKEJGNTJ4IHx8IEJGNTR4KQorCWRlcGVuZHMgb24gKEJGNTF4IHx8IEJGNTJ4IHx8IEJGNTR4KQogCiBjb25maWcgQkZfUkVWXzBfMQogCWJvb2wgIjAuMSIKQEAgLTIwNiwxMSArMjYwLDExIEBACiAKIGNvbmZpZyBCRl9SRVZfMF80CiAJYm9vbCAiMC40IgotCWRlcGVuZHMgb24gKEJGNTYxIHx8IEJGNTMzIHx8IEJGNTMyIHx8IEJGNTMxKQorCWRlcGVuZHMgb24gKEJGNTYxIHx8IEJGNTMzIHx8IEJGNTMyIHx8IEJGNTMxIHx8IEJGNTM4IHx8IEJGNTM5KQogCiBjb25maWcgQkZfUkVWXzBfNQogCWJvb2wgIjAuNSIKLQlkZXBlbmRzIG9uIChCRjU2MSB8fCBCRjUzMyB8fCBCRjUzMiB8fCBCRjUzMSkKKwlkZXBlbmRzIG9uIChCRjU2MSB8fCBCRjUzMyB8fCBCRjUzMiB8fCBCRjUzMSB8fCBCRjUzOCB8fCBCRjUzOSkKIAogY29uZmlnIEJGX1JFVl8wXzYKIAlib29sICIwLjYiCkBAIC0yMjQsNiArMjc4LDExIEBACiAKIGVuZGNob2ljZQogCitjb25maWcgQkY1MXgKKwlib29sCisJZGVwZW5kcyBvbiAoQkY1MTIgfHwgQkY1MTQgfHwgQkY1MTYgfHwgQkY1MTgpCisJZGVmYXVsdCB5CisKIGNvbmZpZyBCRjUyeAogCWJvb2wKIAlkZXBlbmRzIG9uIChCRjUyMiB8fCBCRjUyMyB8fCBCRjUyNCB8fCBCRjUyNSB8fCBCRjUyNiB8fCBCRjUyNykKQEAgLTI1OCw3ICszMTcsNyBAQAogCiBjb25maWcgTUVNX01UNDhMQzMyTThBMl83NQogCWJvb2wKLQlkZXBlbmRzIG9uIChCRklONTM3X1NUQU1QIHx8IFBOQVYxMCkKKwlkZXBlbmRzIG9uIChCRklONTM3X1NUQU1QIHx8IFBOQVYxMCB8fCBCRklONTM4X0VaS0lUKQogCWRlZmF1bHQgeQogCiBjb25maWcgTUVNX01UNDhMQzhNMzJCMkI1XzcKQEAgLTI3MSwxMCArMzMwLDE3IEBACiAJZGVwZW5kcyBvbiAoQkZJTjUyN19FWktJVCB8fCBCRklONTMyX0lQMFggfHwgQkxBQ0tTVEFNUCB8fCBCRklONTI2X0VaQlJEKQogCWRlZmF1bHQgeQogCitjb25maWcgTUVNX01UNDhMQzMyTThBMl83NQorCWJvb2wKKwlkZXBlbmRzIG9uIChCRklONTE4Rl9FWkJSRCkKKwlkZWZhdWx0IHkKKworc291cmNlICJhcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvS2NvbmZpZyIKIHNvdXJjZSAiYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L0tjb25maWciCiBzb3VyY2UgImFyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9LY29uZmlnIgogc291cmNlICJhcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvS2NvbmZpZyIKIHNvdXJjZSAiYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L0tjb25maWciCitzb3VyY2UgImFyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9LY29uZmlnIgogc291cmNlICJhcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvS2NvbmZpZyIKIAogbWVudSAiQm9hcmQgY3VzdG9taXphdGlvbnMiCkBAIC0zMDcsNiArMzczLDcgQEAKIAogY29uZmlnIFJPTV9CQVNFCiAJaGV4ICJLZXJuZWwgUk9NIEJhc2UiCisJZGVwZW5kcyBvbiBST01LRVJORUwKIAlkZWZhdWx0ICIweDIwMDQwMDAwIgogCXJhbmdlIDB4MjAwMDAwMDAgMHgyMDQwMDAwMCBpZiAhKEJGNTR4IHx8IEJGNTYxKQogCXJhbmdlIDB4MjAwMDAwMDAgMHgzMDAwMDAwMCBpZiAoQkY1NHggfHwgQkY1NjEpCkBAIC0zMTgsNyArMzg1LDcgQEAKIAlpbnQgIkZyZXF1ZW5jeSBvZiB0aGUgY3J5c3RhbCBvbiB0aGUgYm9hcmQgaW4gSHoiCiAJZGVmYXVsdCAiMTEwNTkyMDAiIGlmIEJGSU41MzNfU1RBTVAKIAlkZWZhdWx0ICIyNzAwMDAwMCIgaWYgQkZJTjUzM19FWktJVAotCWRlZmF1bHQgIjI1MDAwMDAwIiBpZiAoQkZJTjUzN19TVEFNUCB8fCBCRklONTI3X0VaS0lUIHx8IEg4NjA2X0hWU0lTVEVNQVMgfHwgQkxBQ0tTVEFNUCB8fCBCRklONTI2X0VaQlJEKQorCWRlZmF1bHQgIjI1MDAwMDAwIiBpZiAoQkZJTjUzN19TVEFNUCB8fCBCRklONTI3X0VaS0lUIHx8IEg4NjA2X0hWU0lTVEVNQVMgfHwgQkxBQ0tTVEFNUCB8fCBCRklONTI2X0VaQlJEIHx8IEJGSU41MzhfRVpLSVQgfHwgQkZJTjUxOEYtRVpCUkQpCiAJZGVmYXVsdCAiMzAwMDAwMDAiIGlmIEJGSU41NjFfRVpLSVQKIAlkZWZhdWx0ICIyNDU3NjAwMCIgaWYgUE5BVjEwCiAJZGVmYXVsdCAiMTAwMDAwMDAiIGlmIEJGSU41MzJfSVAwWApAQCAtMzU0LDExICs0MjEsMTEgQEAKIAlyYW5nZSAxIDY0CiAJZGVmYXVsdCAiMjIiIGlmIEJGSU41MzNfRVpLSVQKIAlkZWZhdWx0ICI0NSIgaWYgQkZJTjUzM19TVEFNUAotCWRlZmF1bHQgIjIwIiBpZiAoQkZJTjUzN19TVEFNUCB8fCBCRklONTI3X0VaS0lUIHx8IEJGSU41NDhfRVpLSVQgfHwgQkZJTjU0OF9CTFVFVEVDSE5JWF9DTSkKKwlkZWZhdWx0ICIyMCIgaWYgKEJGSU41MzdfU1RBTVAgfHwgQkZJTjUyN19FWktJVCB8fCBCRklONTQ4X0VaS0lUIHx8IEJGSU41NDhfQkxVRVRFQ0hOSVhfQ00gfHwgQkZJTjUzOF9FWktJVCkKIAlkZWZhdWx0ICIyMiIgaWYgQkZJTjUzM19CTFVFVEVDSE5JWF9DTQogCWRlZmF1bHQgIjIwIiBpZiAoQkZJTjUzN19CTFVFVEVDSE5JWF9DTSB8fCBCRklONTI3X0JMVUVURUNITklYX0NNIHx8IEJGSU41NjFfQkxVRVRFQ0hOSVhfQ00pCiAJZGVmYXVsdCAiMjAiIGlmIEJGSU41NjFfRVpLSVQKLQlkZWZhdWx0ICIxNiIgaWYgKEg4NjA2X0hWU0lTVEVNQVMgfHwgQkxBQ0tTVEFNUCB8fCBCRklONTI2X0VaQlJEKQorCWRlZmF1bHQgIjE2IiBpZiAoSDg2MDZfSFZTSVNURU1BUyB8fCBCTEFDS1NUQU1QIHx8IEJGSU41MjZfRVpCUkQgfHwgQkZJTjUxOEZfRVpCUkQpCiAJaGVscAogCSAgVGhpcyBjb250cm9scyB0aGUgZnJlcXVlbmN5IG9mIHRoZSBvbi1jaGlwIFBMTC4gVGhpcyBjYW4gYmUgYmV0d2VlbiAxIGFuZCA2NC4KIAkgIFBMTCBGcmVxdWVuY3kgPSAoQ3J5c3RhbCBGcmVxdWVuY3kpICogKHRoaXMgc2V0dGluZykKQEAgLTQwNywxOSArNDc0LDcwIEBACiAJYm9vbCAiTVQ0NlYzMk0xNl81QiIKIGVuZGNob2ljZQogCi1jb25maWcgTUFYX01FTV9TSVpFCi0JaW50ICJNYXggU0RSQU0gTWVtb3J5IFNpemUgaW4gTUJ5dGVzIgotCWRlcGVuZHMgb24gIU1QVQotCWRlZmF1bHQgNTEyCitjaG9pY2UKKwlwcm9tcHQgIkREUi9TRFJBTSBUaW1pbmciCisJZGVwZW5kcyBvbiBCRklOX0tFUk5FTF9DTE9DSworCWRlZmF1bHQgQkZJTl9LRVJORUxfQ0xPQ0tfTUVNSU5JVF9DQUxDCiAJaGVscAotCSAgVGhpcyBpcyB0aGUgbWF4IG1lbW9yeSBzaXplIHRoYXQgdGhlIGtlcm5lbCB3aWxsIGNyZWF0ZSBDUExCCi0JICB0YWJsZXMgZm9yLiAgWW91ciBzeXN0ZW0gd2lsbCBub3QgYmUgYWJsZSB0byBoYW5kbGUgYW55IG1vcmUuCisJICBUaGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIHNwZWNpZnkgQmxhY2tmaW4gU0RSQU0vRERSIFRpbWluZyBwYXJhbWV0ZXJzCisJICBUaGUgY2FsY3VsYXRlZCBTRFJBTSB0aW1pbmcgcGFyYW1ldGVycyBtYXkgbm90IGJlIDEwMCUKKwkgIGFjY3VyYXRlIC0gVGhpcyBvcHRpb24gaXMgdGhlcmVmb3JlIG1hcmtlZCBleHBlcmltZW50YWwuCisKK2NvbmZpZyBCRklOX0tFUk5FTF9DTE9DS19NRU1JTklUX0NBTEMKKwlib29sICJDYWxjdWxhdGUgVGltaW5ncyAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCitjb25maWcgQkZJTl9LRVJORUxfQ0xPQ0tfTUVNSU5JVF9TUEVDCisJYm9vbCAiUHJvdmlkZSBhY2N1cmF0ZSBUaW1pbmdzIGJhc2VkIG9uIHRhcmdldCBTQ0xLIgorCWhlbHAKKwkgIFBsZWFzZSBjb25zdWx0IHRoZSBCbGFja2ZpbiBIYXJkd2FyZSBSZWZlcmVuY2UgTWFudWFscyBhcyB3ZWxsCisJICBhcyB0aGUgbWVtb3J5IGRldmljZSBkYXRhc2hlZXQuCisJICBodHRwOi8vZG9jcy5ibGFja2Zpbi51Y2xpbnV4Lm9yZy9kb2t1LnBocD9pZD1iZmluOnNkcmFtCitlbmRjaG9pY2UKKworbWVudSAiTWVtb3J5IEluaXQgQ29udHJvbCIKKwlkZXBlbmRzIG9uIEJGSU5fS0VSTkVMX0NMT0NLX01FTUlOSVRfU1BFQworCitjb25maWcgTUVNX0REUkNUTDAKKwlkZXBlbmRzIG9uIEJGNTR4CisJaGV4ICJERFJDVEwwIgorCWRlZmF1bHQgMHgwCisKK2NvbmZpZyBNRU1fRERSQ1RMMQorCWRlcGVuZHMgb24gQkY1NHgKKwloZXggIkREUkNUTDEiCisJZGVmYXVsdCAweDAKKworY29uZmlnIE1FTV9ERFJDVEwyCisJZGVwZW5kcyBvbiBCRjU0eAorCWhleCAiRERSQ1RMMiIKKwlkZWZhdWx0IDB4MAorCitjb25maWcgTUVNX0VCSVVfRERSUVVFCisJZGVwZW5kcyBvbiBCRjU0eAorCWhleCAiRERSUVVFIgorCWRlZmF1bHQgMHgwCisKK2NvbmZpZyBNRU1fU0RSUkMKKwlkZXBlbmRzIG9uICFCRjU0eAorCWhleCAiU0RSUkMiCisJZGVmYXVsdCAweDAKKworY29uZmlnIE1FTV9TREdDVEwKKwlkZXBlbmRzIG9uICFCRjU0eAorCWhleCAiU0RHQ1RMIgorCWRlZmF1bHQgMHgwCitlbmRtZW51CiAKICMKICMgTWF4ICYgTWluIFNwZWVkcyBmb3IgdmFyaW91cyBDaGlwcwogIwogY29uZmlnIE1BWF9WQ09fSFoKIAlpbnQKKwlkZWZhdWx0IDQwMDAwMDAwMCBpZiBCRjUxMgorCWRlZmF1bHQgNDAwMDAwMDAwIGlmIEJGNTE0CisJZGVmYXVsdCA0MDAwMDAwMDAgaWYgQkY1MTYKKwlkZWZhdWx0IDQwMDAwMDAwMCBpZiBCRjUxOAogCWRlZmF1bHQgNjAwMDAwMDAwIGlmIEJGNTIyCiAJZGVmYXVsdCA0MDAwMDAwMDAgaWYgQkY1MjMKIAlkZWZhdWx0IDQwMDAwMDAwMCBpZiBCRjUyNApAQCAtNDU5LDYgKzU3Nyw3IEBACiAKIGNvbmZpZyBHRU5FUklDX1RJTUUKIAlib29sICJHZW5lcmljIHRpbWUiCisJZGVwZW5kcyBvbiAhU01QCiAJZGVmYXVsdCB5CiAKIGNvbmZpZyBHRU5FUklDX0NMT0NLRVZFTlRTCkBAIC01MzMsNiArNjUyLDcgQEAKIAogCiBtZW51ICJCbGFja2ZpbiBLZXJuZWwgT3B0aW1pemF0aW9ucyIKKwlkZXBlbmRzIG9uICFTTVAKIAogY29tbWVudCAiTWVtb3J5IE9wdGltaXphdGlvbnMiCiAKQEAgLTY1NSw2ICs3NzUsMTcgQEAKIAogCSAgQ3VycmVudGx5IG9ubHkgd29ya3Mgd2l0aCBGTEFUIGJpbmFyaWVzLgogCitjb25maWcgRVhDRVBUSU9OX0wxX1NDUkFUQ0gKKwlib29sICJMb2NhdGUgZXhjZXB0aW9uIHN0YWNrIGluIEwxIFNjcmF0Y2ggTWVtb3J5IgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gIUFQUF9TVEFDS19MMSAmJiAhU1lTQ0FMTF9UQUJfTDEKKwloZWxwCisJICBXaGVuZXZlciBhbiBleGNlcHRpb24gb2NjdXJzLCB1c2UgdGhlIEwxIFNjcmF0Y2ggbWVtb3J5IGZvcgorCSAgc3RhY2sgc3RvcmFnZS4gIFlvdSBjYW5ub3QgcGxhY2UgdGhlIHN0YWNrcyBvZiBGTEFUIGJpbmFyaWVzCisJICBpbiBMMSB3aGVuIHVzaW5nIHRoaXMgb3B0aW9uLgorCisJICBJZiB5b3UgZG9uJ3QgdXNlIEwxIFNjcmF0Y2gsIHRoZW4geW91IHNob3VsZCBzYXkgWSBoZXJlLgorCiBjb21tZW50ICJTcGVlZCBPcHRpbWl6YXRpb25zIgogY29uZmlnIEJGSU5fSU5TX0xPV09WRVJIRUFECiAJYm9vbCAiaW5zW2J3bF0gbG93IG92ZXJoZWFkLCBoaWdoZXIgaW50ZXJydXB0IGxhdGVuY3kiCkBAIC02ODQsNyArODE1LDYgQEAKIAogZW5kbWVudQogCi0KIGNob2ljZQogCXByb21wdCAiS2VybmVsIGV4ZWN1dGVzIGZyb20iCiAJaGVscApAQCAtNzE0LDE3ICs4NDQsOSBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgZ3B0aW1lcnMua28uCiAKLWNvbmZpZyBCRklOX0RNQV81WFgKLQlib29sICJFbmFibGUgRE1BIFN1cHBvcnQiCi0JZGVwZW5kcyBvbiAoQkY1MnggfHwgQkY1M3ggfHwgQkY1NjEgfHwgQkY1NHgpCi0JZGVmYXVsdCB5Ci0JaGVscAotCSAgRE1BIGRyaXZlciBmb3IgQkY1eHguCi0KIGNob2ljZQotCXByb21wdCAiVW5jYWNoZWQgU0RSQU0gcmVnaW9uIgorCXByb21wdCAiVW5jYWNoZWQgRE1BIHJlZ2lvbiIKIAlkZWZhdWx0IERNQV9VTkNBQ0hFRF8xTQotCWRlcGVuZHMgb24gQkZJTl9ETUFfNVhYCiBjb25maWcgRE1BX1VOQ0FDSEVEXzRNCiAJYm9vbCAiRW5hYmxlIDRNIERNQSByZWdpb24iCiBjb25maWcgRE1BX1VOQ0FDSEVEXzJNCkBAIC03NTEsOSArODczLDExIEBACiBjaG9pY2UKIAlwcm9tcHQgIlBvbGljeSIKIAlkZXBlbmRzIG9uIEJGSU5fRENBQ0hFCi0JZGVmYXVsdCBCRklOX1dCCisJZGVmYXVsdCBCRklOX1dCIGlmICFTTVAKKwlkZWZhdWx0IEJGSU5fV1QgaWYgU01QCiBjb25maWcgQkZJTl9XQgogCWJvb2wgIldyaXRlIGJhY2siCisJZGVwZW5kcyBvbiAhU01QCiAJaGVscAogCSAgV3JpdGUgQmFjayBQb2xpY3k6CiAJICAgIENhY2hlZCBkYXRhIHdpbGwgYmUgd3JpdHRlbiBiYWNrIHRvIFNEUkFNIG9ubHkgd2hlbiBuZWVkZWQuCkBAIC03OTAsNyArOTE0LDcgQEAKIAogY29uZmlnIEJGSU5fTDJfQ0FDSEVBQkxFCiAJYm9vbCAiQ2FjaGUgTDIgU1JBTSIKLQlkZXBlbmRzIG9uIChCRklOX0RDQUNIRSB8fCBCRklOX0lDQUNIRSkgJiYgKEJGNTR4IHx8IEJGNTYxKQorCWRlcGVuZHMgb24gKEJGSU5fRENBQ0hFIHx8IEJGSU5fSUNBQ0hFKSAmJiAoQkY1NHggfHwgKEJGNTYxICYmICFTTVApKQogCWRlZmF1bHQgbgogCWhlbHAKIAkgIFNlbGVjdCB0byBtYWtlIEwyIFNSQU0gY2FjaGVhYmxlIGluIEwxIGRhdGEgYW5kIGluc3RydWN0aW9uIGNhY2hlLgpAQCAtOTgwLDcgKzExMDQsNyBAQAogCWludCAiR1BJTyBudW1iZXIiCiAJcmFuZ2UgMCA0NwogCWRlcGVuZHMgb24gUE1fV0FLRVVQX0JZX0dQSU8KLQlkZWZhdWx0IDIgaWYgQkZJTjUzN19TVEFNUAorCWRlZmF1bHQgMgogCiBjaG9pY2UKIAlwcm9tcHQgIkdQSU8gUG9sYXJpdHkiCkBAIC0xMDAzLDcgKzExMjcsNyBAQAogCiBjb25maWcgUE1fQkZJTl9XQUtFX1BINgogCWJvb2wgIkFsbG93IFdha2UtVXAgZnJvbSBvbi1jaGlwIFBIWSBvciBQSDYgR1AiCi0JZGVwZW5kcyBvbiBQTSAmJiAoQkY1MnggfHwgQkY1MzQgfHwgQkY1MzYgfHwgQkY1MzcpCisJZGVwZW5kcyBvbiBQTSAmJiAoQkY1MXggfHwgQkY1MnggfHwgQkY1MzQgfHwgQkY1MzYgfHwgQkY1MzcpCiAJZGVmYXVsdCBuCiAJaGVscAogCSAgRW5hYmxlIFBIWSBhbmQgUEg2IEdQIFdha2UtVXAgKFZvbHRhZ2UgUmVndWxhdG9yIFBvd2VyLVVwKQpAQCAtMTAyMCwxNSArMTE0NCwyMSBAQAogCiBzb3VyY2UgImRyaXZlcnMvY3B1ZnJlcS9LY29uZmlnIgogCitjb25maWcgQkZJTl9DUFVfRlJFUQorCWJvb2wKKwlkZXBlbmRzIG9uIENQVV9GUkVRCisJc2VsZWN0IENQVV9GUkVRX1RBQkxFCisJZGVmYXVsdCB5CisKIGNvbmZpZyBDUFVfVk9MVEFHRQogCWJvb2wgIkNQVSBWb2x0YWdlIHNjYWxpbmciCi0JZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwJCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKIAlkZXBlbmRzIG9uIENQVV9GUkVRCiAJZGVmYXVsdCBuCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBDUFUgdm9sdGFnZSBzY2FsaW5nIGFjY29yZGluZyB0byB0aGUgQ1BVIGZyZXF1ZW5jeS4KIAkgIFRoaXMgb3B0aW9uIHZpb2xhdGVzIHRoZSBQTEwgQllQQVNTIHJlY29tbWVuZGF0aW9uIGluIHRoZSBCbGFja2ZpbiBQcm9jZXNzb3IKLQkgIG1hbnVhbHMuIFRoZXJlIGlzIGEgdGhlb3JldGljYWwgcmlzayB0aGF0IGR1cmluZyBWRERJTlQgdHJhbnNpdGlvbnMgCisJICBtYW51YWxzLiBUaGVyZSBpcyBhIHRoZW9yZXRpY2FsIHJpc2sgdGhhdCBkdXJpbmcgVkRESU5UIHRyYW5zaXRpb25zCiAJICB0aGUgUExMIG1heSB1bmxvY2suCiAKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vS2NvbmZpZy5kZWJ1ZyBiL2FyY2gvYmxhY2tmaW4vS2NvbmZpZy5kZWJ1ZwppbmRleCAzYWQyNTk4Li41Zjk4MWQ5IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL0tjb25maWcuZGVidWcKKysrIGIvYXJjaC9ibGFja2Zpbi9LY29uZmlnLmRlYnVnCkBAIC0yLDggKzIsMzAgQEAKIAogc291cmNlICJsaWIvS2NvbmZpZy5kZWJ1ZyIKIAorY29uZmlnIERFQlVHX1NUQUNLT1ZFUkZMT1cKKwlib29sICJDaGVjayBmb3Igc3RhY2sgb3ZlcmZsb3dzIgorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMCisJaGVscAorCSAgVGhpcyBvcHRpb24gd2lsbCBjYXVzZSBtZXNzYWdlcyB0byBiZSBwcmludGVkIGlmIGZyZWUgc3RhY2sgc3BhY2UKKwkgIGRyb3BzIGJlbG93IGEgY2VydGFpbiBsaW1pdC4KKworY29uZmlnIERFQlVHX1NUQUNLX1VTQUdFCisJYm9vbCAiRW5hYmxlIHN0YWNrIHV0aWxpemF0aW9uIGluc3RydW1lbnRhdGlvbiIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTAorCWhlbHAKKwkgIEVuYWJsZXMgdGhlIGRpc3BsYXkgb2YgdGhlIG1pbmltdW0gYW1vdW50IG9mIGZyZWUgc3RhY2sgd2hpY2ggZWFjaAorCSAgdGFzayBoYXMgZXZlciBoYWQgYXZhaWxhYmxlIGluIHRoZSBzeXNycS1UIG91dHB1dC4KKworCSAgVGhpcyBvcHRpb24gd2lsbCBzbG93IGRvd24gcHJvY2VzcyBjcmVhdGlvbiBzb21ld2hhdC4KKwogY29uZmlnIEhBVkVfQVJDSF9LR0RCCi0gICAgICAgZGVmX2Jvb2wgeQorCWRlZl9ib29sIHkKKworY29uZmlnIEtHREJfVEVTVENBU0UKKwl0cmlzdGF0ZSAiS0dEQjogZm9yIHRlc3QgY2FzZSBpbiBleHBlY3QiCisJZGVmYXVsdCBuCisJaGVscAorCSAgVGhpcyBpcyBhIGtnZGIgdGVzdCBjYXNlIGZvciBhdXRvbWF0ZWQgdGVzdGluZy4KIAogY29uZmlnIERFQlVHX1ZFUkJPU0UKIAlib29sICJWZXJib3NlIGZhdWx0IG1lc3NhZ2VzIgpAQCAtMTgyLDExICsyMDQsMTEgQEAKIAkgIDQgZm9yICgyXjQpIDE2aywgb3IgNDA5NiBlbnRyaWVzCiAKIGNvbmZpZyBERUJVR19CRklOX05PX0tFUk5fSFdUUkFDRQotCWJvb2wgIlRyYWNlIHVzZXIgYXBwcyAodHVybiBvZmYgaHd0cmFjZSBpbiBrZXJuZWwpIgorCWJvb2wgIlR1cm4gb2ZmIGh3dHJhY2UgaW4gQ1BMQiBoYW5kbGVycyIKIAlkZXBlbmRzIG9uIERFQlVHX0JGSU5fSFdUUkFDRV9PTgotCWRlZmF1bHQgbgorCWRlZmF1bHQgeQogCWhlbHAKLQkgIFNvbWUgcGllY2VzIG9mIHRoZSBrZXJuZWwgY29udGFpbiBhIGxvdCBvZiBmbG93IGNoYW5nZXMgd2hpY2ggY2FuCisJICBUaGUgQ1BMQiBlcnJvciBoYW5kbGVyIGNvbnRhaW5zIGEgbG90IG9mIGZsb3cgY2hhbmdlcyB3aGljaCBjYW4KIAkgIHF1aWNrbHkgZmlsbCB1cCB0aGUgaGFyZHdhcmUgdHJhY2UgYnVmZmVyLiAgV2hlbiBkZWJ1Z2dpbmcgY3Jhc2hlcywKIAkgIHRoZSBoYXJkd2FyZSB0cmFjZSBtYXkgaW5kaWNhdGUgdGhhdCB0aGUgcHJvYmxlbSBsaWVzIGluIGtlcm5lbAogCSAgc3BhY2Ugd2hlbiBpbiByZWFsaXR5IGFuIGFwcGxpY2F0aW9uIGlzIGJ1Z2d5LgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9NYWtlZmlsZSBiL2FyY2gvYmxhY2tmaW4vTWFrZWZpbGUKaW5kZXggNmJmNTA5Ny4uZTU1MGM4ZCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9NYWtlZmlsZQorKysgYi9hcmNoL2JsYWNrZmluL01ha2VmaWxlCkBAIC0yMSw2ICsyMSwxMCBAQAogS0JVSUxEX0RFRkNPTkZJRyA6PSBCRjUzNy1TVEFNUF9kZWZjb25maWcKIAogIyBzZXR1cCB0aGUgbWFjaGluZSBuYW1lIGFuZCB0aGUgbWFjaGluZSBkZXBlbmRlbnQgc2V0dGluZ3MKK21hY2hpbmUtJChDT05GSUdfQkY1MTIpIDo9IGJmNTE4CittYWNoaW5lLSQoQ09ORklHX0JGNTE0KSA6PSBiZjUxOAorbWFjaGluZS0kKENPTkZJR19CRjUxNikgOj0gYmY1MTgKK21hY2hpbmUtJChDT05GSUdfQkY1MTgpIDo9IGJmNTE4CiBtYWNoaW5lLSQoQ09ORklHX0JGNTIyKSA6PSBiZjUyNwogbWFjaGluZS0kKENPTkZJR19CRjUyMykgOj0gYmY1MjcKIG1hY2hpbmUtJChDT05GSUdfQkY1MjQpIDo9IGJmNTI3CkBAIC0zMyw2ICszNyw4IEBACiBtYWNoaW5lLSQoQ09ORklHX0JGNTM0KSA6PSBiZjUzNwogbWFjaGluZS0kKENPTkZJR19CRjUzNikgOj0gYmY1MzcKIG1hY2hpbmUtJChDT05GSUdfQkY1MzcpIDo9IGJmNTM3CittYWNoaW5lLSQoQ09ORklHX0JGNTM4KSA6PSBiZjUzOAorbWFjaGluZS0kKENPTkZJR19CRjUzOSkgOj0gYmY1MzgKIG1hY2hpbmUtJChDT05GSUdfQkY1NDIpIDo9IGJmNTQ4CiBtYWNoaW5lLSQoQ09ORklHX0JGNTQ0KSA6PSBiZjU0OAogbWFjaGluZS0kKENPTkZJR19CRjU0NykgOj0gYmY1NDgKQEAgLTQyLDYgKzQ4LDEwIEBACiBNQUNISU5FIDo9ICQobWFjaGluZS15KQogZXhwb3J0IE1BQ0hJTkUKIAorY3B1LSQoQ09ORklHX0JGNTEyKSA6PSBiZjUxMgorY3B1LSQoQ09ORklHX0JGNTE0KSA6PSBiZjUxNAorY3B1LSQoQ09ORklHX0JGNTE2KSA6PSBiZjUxNgorY3B1LSQoQ09ORklHX0JGNTE4KSA6PSBiZjUxOAogY3B1LSQoQ09ORklHX0JGNTIyKSA6PSBiZjUyMgogY3B1LSQoQ09ORklHX0JGNTIzKSA6PSBiZjUyMwogY3B1LSQoQ09ORklHX0JGNTI0KSA6PSBiZjUyNApAQCAtNTQsNiArNjQsOCBAQAogY3B1LSQoQ09ORklHX0JGNTM0KSA6PSBiZjUzNAogY3B1LSQoQ09ORklHX0JGNTM2KSA6PSBiZjUzNgogY3B1LSQoQ09ORklHX0JGNTM3KSA6PSBiZjUzNworY3B1LSQoQ09ORklHX0JGNTM4KSA6PSBiZjUzOAorY3B1LSQoQ09ORklHX0JGNTM5KSA6PSBiZjUzOQogY3B1LSQoQ09ORklHX0JGNTQyKSA6PSBiZjU0MgogY3B1LSQoQ09ORklHX0JGNTQ0KSA6PSBiZjU0NAogY3B1LSQoQ09ORklHX0JGNTQ3KSA6PSBiZjU0NwpAQCAtNzksNyArOTEsNyBAQAogQ0hFQ0tGTEFHU19TSUxJQ09OID0gJChzaGVsbCBlY2hvICIiIHwgJChDUFApICQoS0JVSUxEX0NGTEFHUykgLWREIC0gMj4vZGV2L251bGwgfCBhd2sgJyQkMiA9PSAiX19TSUxJQ09OX1JFVklTSU9OX18iIHsgcHJpbnQgJCQzIH0nKQogQ0hFQ0tGTEFHUyArPSAtRF9fU0lMSUNPTl9SRVZJU0lPTl9fPSQoQ0hFQ0tGTEFHU19TSUxJQ09OKSAtRGwxX3RleHQ9X191c2VkX18KIAotaGVhZC15ICAgOj0gYXJjaC8kKEFSQ0gpL21hY2gtJChNQUNISU5FKS9oZWFkLm8gYXJjaC8kKEFSQ0gpL2tlcm5lbC9pbml0X3Rhc2subworaGVhZC15ICAgOj0gYXJjaC8kKEFSQ0gpL2tlcm5lbC9pbml0X3Rhc2subwogCiBjb3JlLXkgICArPSBhcmNoLyQoQVJDSCkva2VybmVsLyBhcmNoLyQoQVJDSCkvbW0vIGFyY2gvJChBUkNIKS9tYWNoLWNvbW1vbi8KIApAQCAtOTUsMTAgKzEwNywxMCBAQAogY29yZS15CSs9IGFyY2gvJChBUkNIKS9rZXJuZWwvY3BsYi1ub21wdS8KIGVuZGlmCiAKLWxpYnMteSAgICs9IGFyY2gvJChBUkNIKS9saWIvCi0KIGRyaXZlcnMtJChDT05GSUdfT1BST0ZJTEUpICs9IGFyY2gvJChBUkNIKS9vcHJvZmlsZS8KIAorbGlicy15ICAgKz0gYXJjaC8kKEFSQ0gpL2xpYi8KKwogbWFjaGRpcnMJOj0gJChwYXRzdWJzdCAlLGFyY2gvYmxhY2tmaW4vbWFjaC0lLywgJChtYWNoaW5lLXkpKQogCiBLQlVJTERfQ0ZMQUdTICs9IC1JYXJjaC8kKEFSQ0gpL2luY2x1ZGUvCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MThGLUVaQlJEX2RlZmNvbmZpZyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUxOEYtRVpCUkRfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYjNmMjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MThGLUVaQlJEX2RlZmNvbmZpZwpAQCAtMCwwICsxLDExOTEgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yOC1yYzIKKyMKKyMgQ09ORklHX01NVSBpcyBub3Qgc2V0CisjIENPTkZJR19GUFUgaXMgbm90IHNldAorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorIyBDT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE0gaXMgbm90IHNldAorQ09ORklHX0JMQUNLRklOPXkKK0NPTkZJR19aT05FX0RNQT15CitDT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUPXkKK0NPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQorQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKK0NPTkZJR19HRU5FUklDX0dQSU89eQorQ09ORklHX0ZPUkNFX01BWF9aT05FT1JERVI9MTQKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKK0NPTkZJR19TWVNWSVBDPXkKK0NPTkZJR19TWVNWSVBDX1NZU0NUTD15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CisjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorQ09ORklHX0lLQ09ORklHPXkKK0NPTkZJR19JS0NPTkZJR19QUk9DPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CisjIENPTkZJR19DR1JPVVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjIgaXMgbm90IHNldAorIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfTkFNRVNQQUNFUyBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKKyMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorQ09ORklHX0VNQkVEREVEPXkKK0NPTkZJR19VSUQxNj15CitDT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CisjIENPTkZJR19FTEZfQ09SRSBpcyBub3Qgc2V0CitDT05GSUdfQ09NUEFUX0JSSz15CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfQU5PTl9JTk9ERVM9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CitDT05GSUdfRVZFTlRGRD15CitDT05GSUdfQUlPPXkKK0NPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CitDT05GSUdfU0xBQj15CisjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfT1BST0ZJTEU9eQorIyBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVCBpcyBub3Qgc2V0CitDT05GSUdfU0xBQklORk89eQorQ09ORklHX1JUX01VVEVYRVM9eQorQ09ORklHX1RJTllfU0hNRU09eQorQ09ORklHX0JBU0VfU01BTEw9MAorQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQgaXMgbm90IHNldAorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorQ09ORklHX0tNT0Q9eQorQ09ORklHX0JMT0NLPXkKKyMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTRiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CisjIENPTkZJR19JT1NDSEVEX0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9DRlEgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9BUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX05PT1A9eQorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0ibm9vcCIKK0NPTkZJR19DTEFTU0lDX1JDVT15CisjIENPTkZJR19QUkVFTVBUX05PTkUgaXMgbm90IHNldAorQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZPXkKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorIyBDT05GSUdfRlJFRVpFUiBpcyBub3Qgc2V0CisKKyMKKyMgQmxhY2tmaW4gUHJvY2Vzc29yIE9wdGlvbnMKKyMKKworIworIyBQcm9jZXNzb3IgYW5kIEJvYXJkIFNldHRpbmdzCisjCisjIENPTkZJR19CRjUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUxNCBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUxNiBpcyBub3Qgc2V0CitDT05GSUdfQkY1MTg9eQorIyBDT05GSUdfQkY1MjIgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MjMgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MjQgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MjUgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MjYgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MjcgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MzEgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MzIgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MzMgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MzQgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MzYgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MzcgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MzggaXMgbm90IHNldAorIyBDT05GSUdfQkY1MzkgaXMgbm90IHNldAorIyBDT05GSUdfQkY1NDIgaXMgbm90IHNldAorIyBDT05GSUdfQkY1NDQgaXMgbm90IHNldAorIyBDT05GSUdfQkY1NDcgaXMgbm90IHNldAorIyBDT05GSUdfQkY1NDggaXMgbm90IHNldAorIyBDT05GSUdfQkY1NDkgaXMgbm90IHNldAorIyBDT05GSUdfQkY1NjEgaXMgbm90IHNldAorQ09ORklHX0JGX1JFVl9NSU49MAorQ09ORklHX0JGX1JFVl9NQVg9MgorQ09ORklHX0JGX1JFVl8wXzA9eQorIyBDT05GSUdfQkZfUkVWXzBfMSBpcyBub3Qgc2V0CisjIENPTkZJR19CRl9SRVZfMF8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGX1JFVl8wXzMgaXMgbm90IHNldAorIyBDT05GSUdfQkZfUkVWXzBfNCBpcyBub3Qgc2V0CisjIENPTkZJR19CRl9SRVZfMF81IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGX1JFVl8wXzYgaXMgbm90IHNldAorIyBDT05GSUdfQkZfUkVWX0FOWSBpcyBub3Qgc2V0CisjIENPTkZJR19CRl9SRVZfTk9ORSBpcyBub3Qgc2V0CitDT05GSUdfQkY1MXg9eQorQ09ORklHX0JGSU41MThGX0VaQlJEPXkKKworIworIyBCRjUxOCBTcGVjaWZpYyBDb25maWd1cmF0aW9uCisjCisKKyMKKyMgQWx0ZXJuYXRpdmUgTXVsdGlwbGV4aW5nIFNjaGVtZQorIworIyBDT05GSUdfQkY1MThfU1BPUlQwX1BPUlRGIGlzIG5vdCBzZXQKK0NPTkZJR19CRjUxOF9TUE9SVDBfUE9SVEc9eQorQ09ORklHX0JGNTE4X1NQT1JUMF9UU0NMS19QRzEwPXkKKyMgQ09ORklHX0JGNTE4X1NQT1JUMF9UU0NMS19QRzE0IGlzIG5vdCBzZXQKK0NPTkZJR19CRjUxOF9VQVJUMV9QT1JURj15CisjIENPTkZJR19CRjUxOF9VQVJUMV9QT1JURyBpcyBub3Qgc2V0CisKKyMKKyMgSW50ZXJydXB0IFByaW9yaXR5IEFzc2lnbm1lbnQKKyMKKworIworIyBQcmlvcml0eQorIworQ09ORklHX0lSUV9QTExfV0FLRVVQPTcKK0NPTkZJR19JUlFfRE1BMF9FUlJPUj03CitDT05GSUdfSVJRX0RNQVIwX0JMSz03CitDT05GSUdfSVJRX0RNQVIxX0JMSz03CitDT05GSUdfSVJRX0RNQVIwX09WUj03CitDT05GSUdfSVJRX0RNQVIxX09WUj03CitDT05GSUdfSVJRX1BQSV9FUlJPUj03CitDT05GSUdfSVJRX01BQ19FUlJPUj03CitDT05GSUdfSVJRX1NQT1JUMF9FUlJPUj03CitDT05GSUdfSVJRX1NQT1JUMV9FUlJPUj03CitDT05GSUdfSVJRX1BUUF9FUlJPUj03CitDT05GSUdfSVJRX1VBUlQwX0VSUk9SPTcKK0NPTkZJR19JUlFfVUFSVDFfRVJST1I9NworQ09ORklHX0lSUV9SVEM9OAorQ09ORklHX0lSUV9QUEk9OAorQ09ORklHX0lSUV9TUE9SVDBfUlg9OQorQ09ORklHX0lSUV9TUE9SVDBfVFg9OQorQ09ORklHX0lSUV9TUE9SVDFfUlg9OQorQ09ORklHX0lSUV9TUE9SVDFfVFg9OQorQ09ORklHX0lSUV9UV0k9MTAKK0NPTkZJR19JUlFfU1BJMD0xMAorQ09ORklHX0lSUV9VQVJUMF9SWD0xMAorQ09ORklHX0lSUV9VQVJUMF9UWD0xMAorQ09ORklHX0lSUV9VQVJUMV9SWD0xMAorQ09ORklHX0lSUV9VQVJUMV9UWD0xMAorQ09ORklHX0lSUV9PUFRTRUM9MTEKK0NPTkZJR19JUlFfQ05UPTExCitDT05GSUdfSVJRX01BQ19SWD0xMQorQ09ORklHX0lSUV9QT1JUSF9JTlRBPTExCitDT05GSUdfSVJRX01BQ19UWD0xMQorQ09ORklHX0lSUV9QT1JUSF9JTlRCPTExCitDT05GSUdfSVJRX1RJTUVSMD0xMgorQ09ORklHX0lSUV9USU1FUjE9MTIKK0NPTkZJR19JUlFfVElNRVIyPTEyCitDT05GSUdfSVJRX1RJTUVSMz0xMgorQ09ORklHX0lSUV9USU1FUjQ9MTIKK0NPTkZJR19JUlFfVElNRVI1PTEyCitDT05GSUdfSVJRX1RJTUVSNj0xMgorQ09ORklHX0lSUV9USU1FUjc9MTIKK0NPTkZJR19JUlFfUE9SVEdfSU5UQT0xMgorQ09ORklHX0lSUV9QT1JUR19JTlRCPTEyCitDT05GSUdfSVJRX01FTV9ETUEwPTEzCitDT05GSUdfSVJRX01FTV9ETUExPTEzCitDT05GSUdfSVJRX1dBVENIPTEzCitDT05GSUdfSVJRX1BPUlRGX0lOVEE9MTMKK0NPTkZJR19JUlFfUE9SVEZfSU5UQj0xMworQ09ORklHX0lSUV9TUEkwX0VSUk9SPTcKK0NPTkZJR19JUlFfU1BJMV9FUlJPUj03CitDT05GSUdfSVJRX1JTSV9JTlQwPTcKK0NPTkZJR19JUlFfUlNJX0lOVDE9NworQ09ORklHX0lSUV9QV01fVFJJUD0xMAorQ09ORklHX0lSUV9QV01fU1lOQz0xMAorQ09ORklHX0lSUV9QVFBfU1RBVD0xMAorCisjCisjIEJvYXJkIGN1c3RvbWl6YXRpb25zCisjCisjIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAorQ09ORklHX0JPT1RfTE9BRD0weDEwMDAKKworIworIyBDbG9jay9QTEwgU2V0dXAKKyMKK0NPTkZJR19DTEtJTl9IWj0yNTAwMDAwMAorIyBDT05GSUdfQkZJTl9LRVJORUxfQ0xPQ0sgaXMgbm90IHNldAorQ09ORklHX01BWF9WQ09fSFo9NDAwMDAwMDAwCitDT05GSUdfTUlOX1ZDT19IWj01MDAwMDAwMAorQ09ORklHX01BWF9TQ0xLX0haPTEzMzMzMzMzMworQ09ORklHX01JTl9TQ0xLX0haPTI3MDAwMDAwCisKKyMKKyMgS2VybmVsIFRpbWVyL1NjaGVkdWxlcgorIworIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWl8yNTA9eQorIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAorQ09ORklHX0haPTI1MAorIyBDT05GSUdfU0NIRURfSFJUSUNLIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX1RJTUU9eQorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQorIyBDT05GSUdfQ1lDTEVTX0NMT0NLU09VUkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05PX0haIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJR0hfUkVTX1RJTUVSUyBpcyBub3Qgc2V0CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CVUlMRD15CisKKyMKKyMgTWlzYworIworQ09ORklHX0JGSU5fU0NSQVRDSF9SRUdfUkVUTj15CisjIENPTkZJR19CRklOX1NDUkFUQ0hfUkVHX1JFVEUgaXMgbm90IHNldAorIyBDT05GSUdfQkZJTl9TQ1JBVENIX1JFR19DWUNMRVMgaXMgbm90IHNldAorCisjCisjIEJsYWNrZmluIEtlcm5lbCBPcHRpbWl6YXRpb25zCisjCisKKyMKKyMgTWVtb3J5IE9wdGltaXphdGlvbnMKKyMKK0NPTkZJR19JX0VOVFJZX0wxPXkKK0NPTkZJR19FWENQVF9JUlFfU1lTQ19MMT15CitDT05GSUdfRE9fSVJRX0wxPXkKK0NPTkZJR19DT1JFX1RJTUVSX0lSUV9MMT15CitDT05GSUdfSURMRV9MMT15CisjIENPTkZJR19TQ0hFRFVMRV9MMSBpcyBub3Qgc2V0CitDT05GSUdfQVJJVEhNRVRJQ19PUFNfTDE9eQorQ09ORklHX0FDQ0VTU19PS19MMT15CisjIENPTkZJR19NRU1TRVRfTDEgaXMgbm90IHNldAorIyBDT05GSUdfTUVNQ1BZX0wxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU19CRklOX1NQSU5MT0NLX0wxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0NIRUNLU1VNX0wxIGlzIG5vdCBzZXQKK0NPTkZJR19DQUNIRUxJTkVfQUxJR05FRF9MMT15CisjIENPTkZJR19TWVNDQUxMX1RBQl9MMSBpcyBub3Qgc2V0CisjIENPTkZJR19DUExCX1NXSVRDSF9UQUJfTDEgaXMgbm90IHNldAorQ09ORklHX0FQUF9TVEFDS19MMT15CisKKyMKKyMgU3BlZWQgT3B0aW1pemF0aW9ucworIworQ09ORklHX0JGSU5fSU5TX0xPV09WRVJIRUFEPXkKK0NPTkZJR19SQU1LRVJORUw9eQorIyBDT05GSUdfUk9NS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19GTEFUTUVNX01BTlVBTD15CisjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAorQ09ORklHX0ZMQVRNRU09eQorQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKK0NPTkZJR19QQUdFRkxBR1NfRVhURU5ERUQ9eQorQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKKyMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0CisjIENPTkZJR19QSFlTX0FERFJfVF82NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfWk9ORV9ETUFfRkxBRz0xCitDT05GSUdfVklSVF9UT19CVVM9eQorQ09ORklHX0JGSU5fR1BUSU1FUlM9eQorIyBDT05GSUdfRE1BX1VOQ0FDSEVEXzRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQV9VTkNBQ0hFRF8yTSBpcyBub3Qgc2V0CitDT05GSUdfRE1BX1VOQ0FDSEVEXzFNPXkKKyMgQ09ORklHX0RNQV9VTkNBQ0hFRF9OT05FIGlzIG5vdCBzZXQKKworIworIyBDYWNoZSBTdXBwb3J0CisjCitDT05GSUdfQkZJTl9JQ0FDSEU9eQorQ09ORklHX0JGSU5fRENBQ0hFPXkKKyMgQ09ORklHX0JGSU5fRENBQ0hFX0JBTktBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGSU5fSUNBQ0hFX0xPQ0sgaXMgbm90IHNldAorQ09ORklHX0JGSU5fV0I9eQorIyBDT05GSUdfQkZJTl9XVCBpcyBub3Qgc2V0CisjIENPTkZJR19NUFUgaXMgbm90IHNldAorCisjCisjIEFzeW5jaG9ub3VzIE1lbW9yeSBDb25maWd1cmF0aW9uCisjCisKKyMKKyMgRUJJVV9BTUdDVEwgR2xvYmFsIENvbnRyb2wKKyMKK0NPTkZJR19DX0FNQ0tFTj15CitDT05GSUdfQ19DRFBSSU89eQorIyBDT05GSUdfQ19BTUJFTiBpcyBub3Qgc2V0CisjIENPTkZJR19DX0FNQkVOX0IwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NfQU1CRU5fQjBfQjEgaXMgbm90IHNldAorIyBDT05GSUdfQ19BTUJFTl9CMF9CMV9CMiBpcyBub3Qgc2V0CitDT05GSUdfQ19BTUJFTl9BTEw9eQorCisjCisjIEVCSVVfQU1CQ1RMIENvbnRyb2wKKyMKK0NPTkZJR19CQU5LXzA9MHg3QkIwCitDT05GSUdfQkFOS18xPTB4NTU1NAorQ09ORklHX0JBTktfMj0weDdCQjAKK0NPTkZJR19CQU5LXzM9MHhGRkMwCisKKyMKKyMgQnVzIG9wdGlvbnMgKFBDSSwgUENNQ0lBLCBFSVNBLCBNQ0EsIElTQSkKKyMKKyMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgRXhlY3V0YWJsZSBmaWxlIGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGX0ZEUElDPXkKK0NPTkZJR19CSU5GTVRfRkxBVD15CitDT05GSUdfQklORk1UX1pGTEFUPXkKKyMgQ09ORklHX0JJTkZNVF9TSEFSRURfRkxBVCBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0FPVVQgaXMgbm90IHNldAorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorCisjCisjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucworIworIyBDT05GSUdfUE0gaXMgbm90IHNldAorQ09ORklHX0FSQ0hfU1VTUEVORF9QT1NTSUJMRT15CisjIENPTkZJR19QTV9XQUtFVVBfQllfR1BJTyBpcyBub3Qgc2V0CisKKyMKKyMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCisjCisjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0CitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKK0NPTkZJR19QQUNLRVQ9eQorIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAorQ09ORklHX1VOSVg9eQorQ09ORklHX1hGUk09eQorIyBDT05GSUdfWEZSTV9VU0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX01JR1JBVEUgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9TVEFUSVNUSUNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorQ09ORklHX0lQX1BOUD15CisjIENPTkZJR19JUF9QTlBfREhDUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9QTlBfQk9PVFAgaXMgbm90IHNldAorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorQ09ORklHX1NZTl9DT09LSUVTPXkKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUPXkKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUw9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQ9eQorIyBDT05GSUdfSU5FVF9MUk8gaXMgbm90IHNldAorQ09ORklHX0lORVRfRElBRz15CitDT05GSUdfSU5FVF9UQ1BfRElBRz15CisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQ1VCSUM9eQorQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgorIyBDT05GSUdfVENQX01ENVNJRyBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVExBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAorIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRFNBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBTiBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIT05FVCBpcyBub3Qgc2V0CitDT05GSUdfV0lSRUxFU1M9eQorIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorQ09ORklHX1dJUkVMRVNTX09MRF9SRUdVTEFUT1JZPXkKKyMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF85UCBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ERVZSRVMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAorIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAorQ09ORklHX01URF9QQVJUSVRJT05TPXkKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DTURMSU5FX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BUjdfUEFSVFMgaXMgbm90IHNldAorCisjCisjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCisjCitDT05GSUdfTVREX0NIQVI9eQorQ09ORklHX01URF9CTEtERVZTPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GVEwgaXMgbm90IHNldAorIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAorIyBDT05GSUdfUkZEX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19TU0ZEQyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT09QUyBpcyBub3Qgc2V0CisKKyMKKyMgUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9DRkkgaXMgbm90IHNldAorQ09ORklHX01URF9KRURFQ1BST0JFPW0KK0NPTkZJR19NVERfR0VOX1BST0JFPW0KKyMgQ09ORklHX01URF9DRklfQURWX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMj15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzQ9eQorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzggaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8zMiBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JMT15CitDT05GSUdfTVREX0NGSV9JMj15CisjIENPTkZJR19NVERfQ0ZJX0k0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSTggaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JTlRFTEVYVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0FNRFNURCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAorQ09ORklHX01URF9SQU09eQorQ09ORklHX01URF9ST009bQorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisKKyMKKyMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcworIworQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTPXkKKyMgQ09ORklHX01URF9QSFlTTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9HUElPX0FERFIgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1VDTElOVVggaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BMQVRSQU0gaXMgbm90IHNldAorCisjCisjIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKKworIworIyBVQkkgLSBVbnNvcnRlZCBibG9jayBpbWFnZXMKKyMKKyMgQ09ORklHX01URF9VQkkgaXMgbm90IHNldAorIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVj15CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKKyMgQ09ORklHX0JMS19ERVZfWElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAorQ09ORklHX01JU0NfREVWSUNFUz15CisjIENPTkZJR19FRVBST01fOTNDWDYgaXMgbm90IHNldAorIyBDT05GSUdfRU5DTE9TVVJFX1NFUlZJQ0VTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0lERT15CisjIENPTkZJR19JREUgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RNQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAorIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFDVkxBTiBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZFVEggaXMgbm90IHNldAorQ09ORklHX1BIWUxJQj15CisKKyMKKyMgTUlJIFBIWSBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUFSVkVMTF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfREFWSUNPTV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfUVNFTUlfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xYVF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfQ0lDQURBX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19WSVRFU1NFX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19TTVNDX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19CUk9BRENPTV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfSUNQTFVTX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19SRUFMVEVLX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19GSVhFRF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfTURJT19CSVRCQU5HIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX01JST15CisjIENPTkZJR19CRklOX01BQyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUM5MVggaXMgbm90IHNldAorIyBDT05GSUdfU01TQzkxMVggaXMgbm90IHNldAorIyBDT05GSUdfRE05MDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19aTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19SR01JSSBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfVEFIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19FTUFDNCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTk9fRkxPV19DVFJMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19NQUxfQ0xSX0lDSU5UU1RBVCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NPTU1PTl9FUlIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUREVWXzEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUREVWXzEwMDAwIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcyBMQU4KKyMKKyMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19JV0xXSUZJX0xFRFMgaXMgbm90IHNldAorIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorIyBDT05GSUdfUEhPTkUgaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorIyBDT05GSUdfSU5QVVRfRkZfTUVNTEVTUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9QT0xMREVWIGlzIG5vdCBzZXQKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCisjIENPTkZJR19JTlBVVF9NT1VTRURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorQ09ORklHX0lOUFVUX01JU0M9eQorIyBDT05GSUdfSU5QVVRfVUlOUFVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTkZJR19JTlBVVF9QQ0Y4NTc0IGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworIyBDT05GSUdfQUQ5OTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQSV9BRENfQkY1MzMgaXMgbm90IHNldAorIyBDT05GSUdfQkY1eHhfUFBJRkNEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGSU5fU0lNUExFX1RJTUVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNXh4X1BQSSBpcyBub3Qgc2V0CisjIENPTkZJR19CRklOX1NQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGSU5fVElNRVJfTEFURU5DWSBpcyBub3Qgc2V0CisjIENPTkZJR19UV0lfTENEIGlzIG5vdCBzZXQKK0NPTkZJR19CRklOX0RNQV9JTlRFUkZBQ0U9bQorQ09ORklHX1NJTVBMRV9HUElPPW0KK0NPTkZJR19WVD15CitDT05GSUdfQ09OU09MRV9UUkFOU0xBVElPTlM9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVktNRU0gaXMgbm90IHNldAorIyBDT05GSUdfQkZJTl9KVEFHX0NPTU0gaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfQkZJTj15CitDT05GSUdfU0VSSUFMX0JGSU5fQ09OU09MRT15CitDT05GSUdfU0VSSUFMX0JGSU5fRE1BPXkKKyMgQ09ORklHX1NFUklBTF9CRklOX1BJTyBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMX0JGSU5fVUFSVDA9eQorIyBDT05GSUdfQkZJTl9VQVJUMF9DVFNSVFMgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX0JGSU5fVUFSVDEgaXMgbm90IHNldAorQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9CRklOX1NQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYOThfUFRZUz15CisjIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0FOLCB0aGUgY2FyIGJ1cyBhbmQgaW5kdXN0cmlhbCBmaWVsZGJ1cworIworIyBDT05GSUdfQ0FONExJTlVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKK0NPTkZJR19JMkM9eQorQ09ORklHX0kyQ19CT0FSRElORk89eQorQ09ORklHX0kyQ19DSEFSREVWPXkKK0NPTkZJR19JMkNfSEVMUEVSX0FVVE89eQorCisjCisjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAorIworCisjCisjIEkyQyBzeXN0ZW0gYnVzIGRyaXZlcnMgKG1vc3RseSBlbWJlZGRlZCAvIHN5c3RlbS1vbi1jaGlwKQorIworQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0k9eQorQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfQ0xLX0tIWj0xMDAKKyMgQ09ORklHX0kyQ19HUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJTVRFQyBpcyBub3Qgc2V0CisKKyMKKyMgRXh0ZXJuYWwgSTJDL1NNQnVzIGFkYXB0ZXIgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1RBT1NfRVZNIGlzIG5vdCBzZXQKKworIworIyBPdGhlciBJMkMvU01CdXMgYnVzIGRyaXZlcnMKKyMKKyMgQ09ORklHX0kyQ19QQ0FfUExBVEZPUk0gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NUVUIgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAorIworIyBDT05GSUdfRFMxNjgyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUMjQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRDUyNTIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19FRVBST00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDRjg1NzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDY4NzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19UU0wyNTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAorIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQj15CisjIENPTkZJR19HUElPTElCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAorQ09ORklHX1dBVENIRE9HPXkKKyMgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUIGlzIG5vdCBzZXQKKworIworIyBXYXRjaGRvZyBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfU09GVF9XQVRDSERPRyBpcyBub3Qgc2V0CitDT05GSUdfQkZJTl9XRFQ9eQorCisjCisjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01GRF9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTg0MDAgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODM1MF9JMkMgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgY29yZSBzdXBwb3J0CisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorIyBDT05GSUdfRFZCX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fTUVESUEgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZHJpdmVycworIworIyBDT05GSUdfREFCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTCBpcyBub3Qgc2V0CisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CisjCitDT05GSUdfRFVNTVlfQ09OU09MRT15CisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19NTUMgaXMgbm90IHNldAorIyBDT05GSUdfTUVNU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAorIyBDT05GSUdfQUNDRVNTSUJJTElUWSBpcyBub3Qgc2V0CitDT05GSUdfUlRDX0xJQj15CitDT05GSUdfUlRDX0NMQVNTPXkKK0NPTkZJR19SVENfSENUT1NZUz15CitDT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFPSJydGMwIgorIyBDT05GSUdfUlRDX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBSVEMgaW50ZXJmYWNlcworIworQ09ORklHX1JUQ19JTlRGX1NZU0ZTPXkKK0NPTkZJR19SVENfSU5URl9QUk9DPXkKK0NPTkZJR19SVENfSU5URl9ERVY9eQorIyBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX0RTMTMwNyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTM3NCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTY3MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX01BWDY5MDAgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SUzVDMzcyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfSVNMMTIwOCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1gxMjA1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUENGODU2MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1BDRjg1ODMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDFUODAgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9TMzUzOTBBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRk0zMTMwIGlzIG5vdCBzZXQKKworIworIyBTUEkgUlRDIGRyaXZlcnMKKyMKKworIworIyBQbGF0Zm9ybSBSVEMgZHJpdmVycworIworIyBDT05GSUdfUlRDX0RSVl9EUzEyODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE1MTEgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE1NTMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE3NDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9TVEsxN1RBOCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQ4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQzNSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQ1OSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0JRNDgwMiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1YzMDIwIGlzIG5vdCBzZXQKKworIworIyBvbi1DUFUgUlRDIGRyaXZlcnMKKyMKK0NPTkZJR19SVENfRFJWX0JGSU49eQorIyBDT05GSUdfRE1BREVWSUNFUyBpcyBub3Qgc2V0CisjIENPTkZJR19VSU8gaXMgbm90IHNldAorIyBDT05GSUdfU1RBR0lORyBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCisjIENPTkZJR19FWFQyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKK0NPTkZJR19GSUxFX0xPQ0tJTkc9eQorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQorQ09ORklHX0lOT1RJRllfVVNFUj15CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19QUk9DX1NZU0NUTD15CitDT05GSUdfU1lTRlM9eQorIyBDT05GSUdfVE1QRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1lBRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQorQ09ORklHX05GU19GUz1tCitDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0QgaXMgbm90IHNldAorQ09ORklHX0xPQ0tEPW0KK0NPTkZJR19MT0NLRF9WND15CitDT05GSUdfTkZTX0NPTU1PTj15CitDT05GSUdfU1VOUlBDPW0KKyMgQ09ORklHX1NVTlJQQ19SRUdJU1RFUl9WNCBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CitDT05GSUdfU01CX0ZTPW0KKyMgQ09ORklHX1NNQl9OTFNfREVGQVVMVCBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCisjIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CitDT05GSUdfTkxTPXkKK0NPTkZJR19OTFNfREVGQVVMVD0iaXNvODg1OS0xIgorQ09ORklHX05MU19DT0RFUEFHRV80Mzc9eQorIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX0lTTzg4NTlfMT15CisjIENPTkZJR19OTFNfSVNPODg1OV8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV81IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV85IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1IgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfVVRGOCBpcyBub3Qgc2V0CisjIENPTkZJR19ETE0gaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfRU5BQkxFX1dBUk5fREVQUkVDQVRFRD15CitDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQorQ09ORklHX0ZSQU1FX1dBUk49MTAyNAorIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0ZTPXkKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CisjIENPTkZJR19ERUJVR19TSElSUSBpcyBub3Qgc2V0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUMgaXMgbm90IHNldAorQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDX1ZBTFVFPTAKK0NPTkZJR19TQ0hFRF9ERUJVRz15CisjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJTUVSX1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX09CSkVDVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0lORk89eQorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfV1JJVEVDT1VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NRU1PUllfSU5JVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZSQU1FX1BPSU5URVIgaXMgbm90IHNldAorIyBDT05GSUdfQk9PVF9QUklOVEtfREVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQkxPQ0tfRVhUX0RFVlQgaXMgbm90IHNldAorIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSz15CisjIENPTkZJR19EWU5BTUlDX1BSSU5US19ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0FSQ0hfS0dEQj15CisjIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NUQUNLT1ZFUkZMT1cgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX1ZFUkJPU0U9eQorQ09ORklHX0RFQlVHX01NUlM9eQorIyBDT05GSUdfREVCVUdfSFdFUlIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRE9VQkxFRkFVTFQgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0hVTlRfRk9SX1pFUk89eQorQ09ORklHX0RFQlVHX0JGSU5fSFdUUkFDRV9PTj15CitDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX0NPTVBSRVNTSU9OX09GRj15CisjIENPTkZJR19ERUJVR19CRklOX0hXVFJBQ0VfQ09NUFJFU1NJT05fT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0JGSU5fSFdUUkFDRV9DT01QUkVTU0lPTl9UV08gaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0JGSU5fSFdUUkFDRV9DT01QUkVTU0lPTj0wCisjIENPTkZJR19ERUJVR19CRklOX0hXVFJBQ0VfRVhQQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0JGSU5fTk9fS0VSTl9IV1RSQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19FQVJMWV9QUklOVEs9eQorQ09ORklHX0NQTEJfSU5GTz15CitDT05GSUdfQUNDRVNTX0NIRUNLPXkKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKK0NPTkZJR19TRUNVUklUWT15CisjIENPTkZJR19TRUNVUklUWUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZX05FVFdPUksgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlfRklMRV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAorQ09ORklHX1NFQ1VSSVRZX0RFRkFVTFRfTU1BUF9NSU5fQUREUj0wCitDT05GSUdfQ1JZUFRPPXkKKworIworIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKKyMKKyMgQ09ORklHX0NSWVBUT19GSVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NQU5BR0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HRjEyOE1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1JZUFREIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BVVRIRU5DIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKKworIworIyBBdXRoZW50aWNhdGVkIEVuY3J5cHRpb24gd2l0aCBBc3NvY2lhdGVkIERhdGEKKyMKKyMgQ09ORklHX0NSWVBUT19DQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dDTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VRSVYgaXMgbm90IHNldAorCisjCisjIEJsb2NrIG1vZGVzCisjCisjIENPTkZJR19DUllQVE9fQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DVFIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NUUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fRUNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19MUlcgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1BDQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1hUUyBpcyBub3Qgc2V0CisKKyMKKyMgSGFzaCBtb2RlcworIworIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAorCisjCisjIERpZ2VzdAorIworIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxMjggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDE2MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQzMjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKKworIworIyBDaXBoZXJzCisjCisjIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FSQzQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19ERVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0ZDUllQVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TQUxTQTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRUVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVJQRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldAorCisjCisjIENvbXByZXNzaW9uCisjCisjIENPTkZJR19DUllQVE9fREVGTEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTFpPIGlzIG5vdCBzZXQKKworIworIyBSYW5kb20gTnVtYmVyIEdlbmVyYXRpb24KKyMKKyMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fSFc9eQorCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKK0NPTkZJR19CSVRSRVZFUlNFPXkKK0NPTkZJR19DUkNfQ0NJVFQ9bQorIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX1QxMERJRiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0NSQzcgaXMgbm90IHNldAorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19aTElCX0lORkxBVEU9eQorQ09ORklHX1BMSVNUPXkKK0NPTkZJR19IQVNfSU9NRU09eQorQ09ORklHX0hBU19JT1BPUlQ9eQorQ09ORklHX0hBU19ETUE9eQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTI2LUVaQlJEX2RlZmNvbmZpZyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUyNi1FWkJSRF9kZWZjb25maWcKaW5kZXggNDQ0M2E0Ny4uNjlmNjZjMyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTI2LUVaQlJEX2RlZmNvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MjYtRVpCUkRfZGVmY29uZmlnCkBAIC0xLDcgKzEsNiBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI2LjMKLSMgVGh1IEF1ZyAyOCAxNjo0OTo1MyAyMDA4CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjgtcmMyCiAjCiAjIENPTkZJR19NTVUgaXMgbm90IHNldAogIyBDT05GSUdfRlBVIGlzIG5vdCBzZXQKQEAgLTM3LDggKzM2LDcgQEAKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiAjIENPTkZJR19DR1JPVVBTIGlzIG5vdCBzZXQKICMgQ09ORklHX0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKLUNPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyPXkKKyMgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjIgaXMgbm90IHNldAogIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAogIyBDT05GSUdfTkFNRVNQQUNFUyBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQpAQCAtNDgsMTMgKzQ2LDEzIEBACiBDT05GSUdfRU1CRURERUQ9eQogQ09ORklHX1VJRDE2PXkKIENPTkZJR19TWVNDVExfU1lTQ0FMTD15Ci1DT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQogQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKIENPTkZJR19IT1RQTFVHPXkKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15Ci1DT05GSUdfRUxGX0NPUkU9eQorIyBDT05GSUdfRUxGX0NPUkUgaXMgbm90IHNldAogQ09ORklHX0NPTVBBVF9CUks9eQogQ09ORklHX0JBU0VfRlVMTD15CiBDT05GSUdfRlVURVg9eQpAQCAtNjMsNiArNjEsNyBAQAogQ09ORklHX1NJR05BTEZEPXkKIENPTkZJR19USU1FUkZEPXkKIENPTkZJR19FVkVOVEZEPXkKK0NPTkZJR19BSU89eQogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKIENPTkZJR19TTEFCPXkKICMgQ09ORklHX1NMVUIgaXMgbm90IHNldApAQCAtNzAsOSArNjksNyBAQAogIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfT1BST0ZJTEU9eQotIyBDT05GSUdfSEFWRV9LUFJPQkVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBVkVfS1JFVFBST0JFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQVZFX0RNQV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UIGlzIG5vdCBzZXQKIENPTkZJR19TTEFCSU5GTz15CiBDT05GSUdfUlRfTVVURVhFUz15CiBDT05GSUdfVElOWV9TSE1FTT15CkBAIC04OSw2ICs4Niw3IEBACiAjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0xTRiBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CiAKICMKICMgSU8gU2NoZWR1bGVycwpAQCAtMTA2LDYgKzEwNCw3IEBACiAjIENPTkZJR19QUkVFTVBUX05PTkUgaXMgbm90IHNldAogQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZPXkKICMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorIyBDT05GSUdfRlJFRVpFUiBpcyBub3Qgc2V0CiAKICMKICMgQmxhY2tmaW4gUHJvY2Vzc29yIE9wdGlvbnMKQEAgLTExNCw2ICsxMTMsMTAgQEAKICMKICMgUHJvY2Vzc29yIGFuZCBCb2FyZCBTZXR0aW5ncwogIworIyBDT05GSUdfQkY1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MTQgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MTYgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MTggaXMgbm90IHNldAogIyBDT05GSUdfQkY1MjIgaXMgbm90IHNldAogIyBDT05GSUdfQkY1MjMgaXMgbm90IHNldAogIyBDT05GSUdfQkY1MjQgaXMgbm90IHNldApAQCAtMTI2LDIyICsxMjksNzEgQEAKICMgQ09ORklHX0JGNTM0IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTM2IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTM4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTM5IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTQyIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTQ0IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTQ3IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTQ4IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTQ5IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTYxIGlzIG5vdCBzZXQKK0NPTkZJR19CRl9SRVZfTUlOPTAKK0NPTkZJR19CRl9SRVZfTUFYPTIKIENPTkZJR19CRl9SRVZfMF8wPXkKICMgQ09ORklHX0JGX1JFVl8wXzEgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWXzBfMiBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfMF8zIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl8wXzQgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWXzBfNSBpcyBub3Qgc2V0CisjIENPTkZJR19CRl9SRVZfMF82IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl9BTlkgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWX05PTkUgaXMgbm90IHNldAogQ09ORklHX0JGNTJ4PXkKIENPTkZJR19NRU1fTVQ0OExDMzJNMTZBMlRHXzc1PXkKK0NPTkZJR19JUlFfUExMX1dBS0VVUD03CitDT05GSUdfSVJRX0RNQTBfRVJST1I9NworQ09ORklHX0lSUV9ETUFSMF9CTEs9NworQ09ORklHX0lSUV9ETUFSMV9CTEs9NworQ09ORklHX0lSUV9ETUFSMF9PVlI9NworQ09ORklHX0lSUV9ETUFSMV9PVlI9NworQ09ORklHX0lSUV9QUElfRVJST1I9NworQ09ORklHX0lSUV9NQUNfRVJST1I9NworQ09ORklHX0lSUV9TUE9SVDBfRVJST1I9NworQ09ORklHX0lSUV9TUE9SVDFfRVJST1I9NworQ09ORklHX0lSUV9VQVJUMF9FUlJPUj03CitDT05GSUdfSVJRX1VBUlQxX0VSUk9SPTcKK0NPTkZJR19JUlFfUlRDPTgKK0NPTkZJR19JUlFfUFBJPTgKK0NPTkZJR19JUlFfU1BPUlQwX1JYPTkKK0NPTkZJR19JUlFfU1BPUlQwX1RYPTkKK0NPTkZJR19JUlFfU1BPUlQxX1JYPTkKK0NPTkZJR19JUlFfU1BPUlQxX1RYPTkKK0NPTkZJR19JUlFfVFdJPTEwCitDT05GSUdfSVJRX1VBUlQwX1JYPTEwCitDT05GSUdfSVJRX1VBUlQwX1RYPTEwCitDT05GSUdfSVJRX1VBUlQxX1JYPTEwCitDT05GSUdfSVJRX1VBUlQxX1RYPTEwCitDT05GSUdfSVJRX09QVFNFQz0xMQorQ09ORklHX0lSUV9DTlQ9MTEKK0NPTkZJR19JUlFfTUFDX1JYPTExCitDT05GSUdfSVJRX1BPUlRIX0lOVEE9MTEKK0NPTkZJR19JUlFfTUFDX1RYPTExCitDT05GSUdfSVJRX1BPUlRIX0lOVEI9MTEKK0NPTkZJR19JUlFfVElNRVIwPTEyCitDT05GSUdfSVJRX1RJTUVSMT0xMgorQ09ORklHX0lSUV9USU1FUjI9MTIKK0NPTkZJR19JUlFfVElNRVIzPTEyCitDT05GSUdfSVJRX1RJTUVSND0xMgorQ09ORklHX0lSUV9USU1FUjU9MTIKK0NPTkZJR19JUlFfVElNRVI2PTEyCitDT05GSUdfSVJRX1RJTUVSNz0xMgorQ09ORklHX0lSUV9QT1JUR19JTlRBPTEyCitDT05GSUdfSVJRX1BPUlRHX0lOVEI9MTIKK0NPTkZJR19JUlFfTUVNX0RNQTA9MTMKK0NPTkZJR19JUlFfTUVNX0RNQTE9MTMKK0NPTkZJR19JUlFfV0FUQ0g9MTMKK0NPTkZJR19JUlFfUE9SVEZfSU5UQT0xMworQ09ORklHX0lSUV9QT1JURl9JTlRCPTEzCiAjIENPTkZJR19CRklONTI3X0VaS0lUIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGSU41MjdfQkxVRVRFQ0hOSVhfQ00gaXMgbm90IHNldAogQ09ORklHX0JGSU41MjZfRVpCUkQ9eQpAQCAtMTY5LDUxICsyMjEsNyBAQAogIwogIyBQcmlvcml0eQogIwotQ09ORklHX0lSUV9QTExfV0FLRVVQPTcKLUNPTkZJR19JUlFfRE1BMF9FUlJPUj03Ci1DT05GSUdfSVJRX0RNQVIwX0JMSz03Ci1DT05GSUdfSVJRX0RNQVIxX0JMSz03Ci1DT05GSUdfSVJRX0RNQVIwX09WUj03Ci1DT05GSUdfSVJRX0RNQVIxX09WUj03Ci1DT05GSUdfSVJRX1BQSV9FUlJPUj03Ci1DT05GSUdfSVJRX01BQ19FUlJPUj03Ci1DT05GSUdfSVJRX1NQT1JUMF9FUlJPUj03Ci1DT05GSUdfSVJRX1NQT1JUMV9FUlJPUj03Ci1DT05GSUdfSVJRX1VBUlQwX0VSUk9SPTcKLUNPTkZJR19JUlFfVUFSVDFfRVJST1I9NwotQ09ORklHX0lSUV9SVEM9OAotQ09ORklHX0lSUV9QUEk9OAotQ09ORklHX0lSUV9TUE9SVDBfUlg9OQotQ09ORklHX0lSUV9TUE9SVDBfVFg9OQotQ09ORklHX0lSUV9TUE9SVDFfUlg9OQotQ09ORklHX0lSUV9TUE9SVDFfVFg9OQotQ09ORklHX0lSUV9UV0k9MTAKIENPTkZJR19JUlFfU1BJPTEwCi1DT05GSUdfSVJRX1VBUlQwX1JYPTEwCi1DT05GSUdfSVJRX1VBUlQwX1RYPTEwCi1DT05GSUdfSVJRX1VBUlQxX1JYPTEwCi1DT05GSUdfSVJRX1VBUlQxX1RYPTEwCi1DT05GSUdfSVJRX09QVFNFQz0xMQotQ09ORklHX0lSUV9DTlQ9MTEKLUNPTkZJR19JUlFfTUFDX1JYPTExCi1DT05GSUdfSVJRX1BPUlRIX0lOVEE9MTEKLUNPTkZJR19JUlFfTUFDX1RYPTExCi1DT05GSUdfSVJRX1BPUlRIX0lOVEI9MTEKLUNPTkZJR19JUlFfVE1SMD0xMgotQ09ORklHX0lSUV9UTVIxPTEyCi1DT05GSUdfSVJRX1RNUjI9MTIKLUNPTkZJR19JUlFfVE1SMz0xMgotQ09ORklHX0lSUV9UTVI0PTEyCi1DT05GSUdfSVJRX1RNUjU9MTIKLUNPTkZJR19JUlFfVE1SNj0xMgotQ09ORklHX0lSUV9UTVI3PTEyCi1DT05GSUdfSVJRX1BPUlRHX0lOVEE9MTIKLUNPTkZJR19JUlFfUE9SVEdfSU5UQj0xMgotQ09ORklHX0lSUV9NRU1fRE1BMD0xMwotQ09ORklHX0lSUV9NRU1fRE1BMT0xMwotQ09ORklHX0lSUV9XQVRDSD0xMwotQ09ORklHX0lSUV9QT1JURl9JTlRBPTEzCi1DT05GSUdfSVJRX1BPUlRGX0lOVEI9MTMKIENPTkZJR19JUlFfU1BJX0VSUk9SPTcKIENPTkZJR19JUlFfTkZDX0VSUk9SPTcKIENPTkZJR19JUlFfSERNQV9FUlJPUj03CkBAIC0yMzUsNyArMjQzLDYgQEAKICMKIENPTkZJR19DTEtJTl9IWj0yNTAwMDAwMAogIyBDT05GSUdfQkZJTl9LRVJORUxfQ0xPQ0sgaXMgbm90IHNldAotQ09ORklHX01BWF9NRU1fU0laRT01MTIKIENPTkZJR19NQVhfVkNPX0haPTQwMDAwMDAwMAogQ09ORklHX01JTl9WQ09fSFo9NTAwMDAwMDAKIENPTkZJR19NQVhfU0NMS19IWj0xMzMzMzMzMzMKQEAgLTI1MywxNiArMjYwLDExIEBACiBDT05GSUdfR0VORVJJQ19USU1FPXkKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKICMgQ09ORklHX0NZQ0xFU19DTE9DS1NPVVJDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19USUNLX09ORVNIT1QgaXMgbm90IHNldAogIyBDT05GSUdfTk9fSFogaXMgbm90IHNldAogIyBDT05GSUdfSElHSF9SRVNfVElNRVJTIGlzIG5vdCBzZXQKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JVSUxEPXkKIAogIwotIyBNZW1vcnkgU2V0dXAKLSMKLQotIwogIyBNaXNjCiAjCiBDT05GSUdfQkZJTl9TQ1JBVENIX1JFR19SRVROPXkKQEAgLTI5MSw2ICsyOTMsNyBAQAogQ09ORklHX0NBQ0hFTElORV9BTElHTkVEX0wxPXkKICMgQ09ORklHX1NZU0NBTExfVEFCX0wxIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQTEJfU1dJVENIX1RBQl9MMSBpcyBub3Qgc2V0CitDT05GSUdfQVBQX1NUQUNLX0wxPXkKIAogIwogIyBTcGVlZCBPcHRpbWl6YXRpb25zCkBAIC0zMDQsMTUgKzMwNywxMyBAQAogIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CiBDT05GSUdfRkxBVE1FTT15CiBDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQotIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TUEFSU0VNRU1fVk1FTU1BUF9FTkFCTEUgaXMgbm90IHNldAogQ09ORklHX1BBR0VGTEFHU19FWFRFTkRFRD15CiBDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAogIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIWVNfQUREUl9UXzY0QklUIGlzIG5vdCBzZXQKIENPTkZJR19aT05FX0RNQV9GTEFHPTEKIENPTkZJR19WSVJUX1RPX0JVUz15CiBDT05GSUdfQkZJTl9HUFRJTUVSUz15Ci1DT05GSUdfQkZJTl9ETUFfNVhYPXkKICMgQ09ORklHX0RNQV9VTkNBQ0hFRF80TSBpcyBub3Qgc2V0CiAjIENPTkZJR19ETUFfVU5DQUNIRURfMk0gaXMgbm90IHNldAogQ09ORklHX0RNQV9VTkNBQ0hFRF8xTT15CkBAIC0zNjUsNiArMzY2LDcgQEAKIENPTkZJR19CSU5GTVRfRkxBVD15CiBDT05GSUdfQklORk1UX1pGTEFUPXkKICMgQ09ORklHX0JJTkZNVF9TSEFSRURfRkxBVCBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0FPVVQgaXMgbm90IHNldAogIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAogCiAjCkBAIC0zNzgsMTAgKzM4MCw2IEBACiAjIENQVSBGcmVxdWVuY3kgc2NhbGluZwogIwogIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmtpbmcKLSMKIENPTkZJR19ORVQ9eQogCiAjCkBAIC00MzIsNiArNDMwLDcgQEAKICMgQ09ORklHX1RJUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRFNBIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAogIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKICMgQ09ORklHX0xMQzIgaXMgbm90IHNldApAQCAtNDUyLDExICs0NTEsMTAgQEAKICMgQ09ORklHX0lSREEgaXMgbm90IHNldAogIyBDT05GSUdfQlQgaXMgbm90IHNldAogIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzCi0jCisjIENPTkZJR19QSE9ORVQgaXMgbm90IHNldAorQ09ORklHX1dJUkVMRVNTPXkKICMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKK0NPTkZJR19XSVJFTEVTU19PTERfUkVHVUxBVE9SWT15CiAjIENPTkZJR19XSVJFTEVTU19FWFQgaXMgbm90IHNldAogIyBDT05GSUdfTUFDODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKQEAgLTQ3NCw2ICs0NzIsOCBAQAogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQogIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ERVZSRVMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAogIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQpAQCAtNTM0LDcgKzUzNCw4IEBACiAjIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycwogIwogIyBDT05GSUdfTVREX0RBVEFGTEFTSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfTTI1UDgwIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTTI1UDgwPXkKK0NPTkZJR19NMjVQWFhfVVNFX0ZBU1RfUkVBRD15CiAjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAogIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldApAQCAtNTc5LDYgKzU4MCw3IEBACiAjIENPTkZJR19CTEtfREVWX1hJUCBpcyBub3Qgc2V0CiAjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKIENPTkZJR19NSVNDX0RFVklDRVM9eQogIyBDT05GSUdfRUVQUk9NXzkzQ1g2IGlzIG5vdCBzZXQKICMgQ09ORklHX0VOQ0xPU1VSRV9TRVJWSUNFUyBpcyBub3Qgc2V0CkBAIC01OTUsNyArNTk3LDYgQEAKICMgQ09ORklHX0FUQSBpcyBub3Qgc2V0CiAjIENPTkZJR19NRCBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWSUNFUz15Ci0jIENPTkZJR19ORVRERVZJQ0VTX01VTFRJUVVFVUUgaXMgbm90IHNldAogIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNWTEFOIGlzIG5vdCBzZXQKQEAgLTYzMyw5ICs2MzQsMTAgQEAKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19SR01JSSBpcyBub3Qgc2V0CiAjIENPTkZJR19JQk1fTkVXX0VNQUNfVEFIIGlzIG5vdCBzZXQKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19FTUFDNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CNDQgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX05PX0ZMT1dfQ1RSTCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NMUl9JQ0lOVFNUQVQgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DT01NT05fRVJSIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZfMTAwMD15Ci0jIENPTkZJR19FMTAwMEVfRU5BQkxFRCBpcyBub3Qgc2V0CiAjIENPTkZJR19BWDg4MTgwIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZfMTAwMDA9eQogCkBAIC02NjcsNyArNjY5LDcgQEAKICMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKICMKIENPTkZJR19JTlBVVD15Ci0jIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9GRl9NRU1MRVNTPW0KICMgQ09ORklHX0lOUFVUX1BPTExERVYgaXMgbm90IHNldAogCiAjCkBAIC02OTIsOCArNjk0LDkgQEAKICMgQ09ORklHX0lOUFVUX0tFWVNQQU5fUkVNT1RFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX1BPV0VSTUFURSBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9ZRUFMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0NNMTA5IGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX1VJTlBVVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19UV0lfS0VZUEFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTkZJR19JTlBVVF9QQ0Y4NTc0IGlzIG5vdCBzZXQKIAogIwogIyBIYXJkd2FyZSBJL08gcG9ydHMKQEAgLTcxMiwxMiArNzE1LDE1IEBACiAjIENPTkZJR19CRklOX1NQT1JUIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGSU5fVElNRVJfTEFURU5DWSBpcyBub3Qgc2V0CiAjIENPTkZJR19UV0lfTENEIGlzIG5vdCBzZXQKK0NPTkZJR19CRklOX0RNQV9JTlRFUkZBQ0U9bQogQ09ORklHX1NJTVBMRV9HUElPPW0KIENPTkZJR19WVD15CitDT05GSUdfQ09OU09MRV9UUkFOU0xBVElPTlM9eQogQ09ORklHX1ZUX0NPTlNPTEU9eQogQ09ORklHX0hXX0NPTlNPTEU9eQogIyBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HIGlzIG5vdCBzZXQKLUNPTkZJR19ERVZLTUVNPXkKKyMgQ09ORklHX0RFVktNRU0gaXMgbm90IHNldAorIyBDT05GSUdfQkZJTl9KVEFHX0NPTU0gaXMgbm90IHNldAogIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKIAogIwpAQCAtNzYwLDI1ICs3NjYsMzkgQEAKICMKICMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CiAjCisKKyMKKyMgSTJDIHN5c3RlbSBidXMgZHJpdmVycyAobW9zdGx5IGVtYmVkZGVkIC8gc3lzdGVtLW9uLWNoaXApCisjCiBDT05GSUdfSTJDX0JMQUNLRklOX1RXST15Ci1DT05GSUdfSTJDX0JMQUNLRklOX1RXSV9DTEtfS0haPTUwCitDT05GSUdfSTJDX0JMQUNLRklOX1RXSV9DTEtfS0haPTEwMAogIyBDT05GSUdfSTJDX0dQSU8gaXMgbm90IHNldAogIyBDT05GSUdfSTJDX09DT1JFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfU0lNVEVDIGlzIG5vdCBzZXQKKworIworIyBFeHRlcm5hbCBJMkMvU01CdXMgYWRhcHRlciBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfVEFPU19FVk0gaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1NUVUIgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1RJTllfVVNCIGlzIG5vdCBzZXQKKworIworIyBPdGhlciBJMkMvU01CdXMgYnVzIGRyaXZlcnMKKyMKICMgQ09ORklHX0kyQ19QQ0FfUExBVEZPUk0gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NUVUIgaXMgbm90IHNldAogCiAjCiAjIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAogIwogIyBDT05GSUdfRFMxNjgyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUMjQgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRDUyNTIgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19FRVBST00gaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKICMgQ09ORklHX1BDRjg1NzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX01BWDY4NzUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19UU0wyNTUwIGlzIG5vdCBzZXQKQEAgLTc4NywxMiArODA3LDE0IEBACiAjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKIENPTkZJR19TUEk9eQorIyBDT05GSUdfU1BJX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19TUElfTUFTVEVSPXkKIAogIwogIyBTUEkgTWFzdGVyIENvbnRyb2xsZXIgRHJpdmVycwogIwogQ09ORklHX1NQSV9CRklOPXkKKyMgQ09ORklHX1NQSV9CRklOX0xPQ0sgaXMgbm90IHNldAogIyBDT05GSUdfU1BJX0JJVEJBTkcgaXMgbm90IHNldAogCiAjCkBAIC04MDEsMTEgKzgyMywxNSBAQAogIyBDT05GSUdfU1BJX0FUMjUgaXMgbm90IHNldAogIyBDT05GSUdfU1BJX1NQSURFViBpcyBub3Qgc2V0CiAjIENPTkZJR19TUElfVExFNjJYMCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUI9eQorIyBDT05GSUdfR1BJT0xJQiBpcyBub3Qgc2V0CiAjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAogQ09ORklHX0hXTU9OPXkKICMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FENzQxNCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FENzQxOCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FEQ1hYIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKQEAgLTgzNCw2ICs4NjAsNyBAQAogIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTE05MiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0xNOTMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVgxMTExIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTUFYMTYxOSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX01BWDY2NTAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKQEAgLTg3MSwxNiArODk4LDE0IEBACiAjIENPTkZJR19VU0JQQ1dBVENIRE9HIGlzIG5vdCBzZXQKIAogIwotIyBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUKLSMKLUNPTkZJR19TU0JfUE9TU0lCTEU9eQotIyBDT05GSUdfU1NCIGlzIG5vdCBzZXQKLQotIwogIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCiAjCisjIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAogIyBDT05GSUdfSFRDX1BBU0lDMyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004NDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTgzNTBfSTJDIGlzIG5vdCBzZXQKIAogIwogIyBNdWx0aW1lZGlhIGRldmljZXMKQEAgLTkxNSwxNSArOTQwLDggQEAKICMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CiAjCiBDT05GSUdfRFVNTVlfQ09OU09MRT15Ci0KLSMKLSMgU291bmQKLSMKIENPTkZJR19TT1VORD1tCi0KLSMKLSMgQWR2YW5jZWQgTGludXggU291bmQgQXJjaGl0ZWN0dXJlCi0jCitDT05GSUdfU09VTkRfT1NTX0NPUkU9eQogQ09ORklHX1NORD1tCiBDT05GSUdfU05EX1RJTUVSPW0KIENPTkZJR19TTkRfUENNPW0KQEAgLTkzNyw1NiArOTU1LDQwIEBACiBDT05GSUdfU05EX1ZFUkJPU0VfUFJPQ0ZTPXkKICMgQ09ORklHX1NORF9WRVJCT1NFX1BSSU5USyBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfREVCVUcgaXMgbm90IHNldAotCi0jCi0jIEdlbmVyaWMgZGV2aWNlcwotIworQ09ORklHX1NORF9EUklWRVJTPXkKICMgQ09ORklHX1NORF9EVU1NWSBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfTVRQQVYgaXMgbm90IHNldAogIyBDT05GSUdfU05EX1NFUklBTF9VMTY1NTAgaXMgbm90IHNldAogIyBDT05GSUdfU05EX01QVTQwMSBpcyBub3Qgc2V0Ci0KLSMKLSMgU1BJIGRldmljZXMKLSMKK0NPTkZJR19TTkRfU1BJPXkKIAogIwogIyBBTFNBIEJsYWNrZmluIGRldmljZXMKICMKICMgQ09ORklHX1NORF9CTEFDS0ZJTl9BRDE4MzYgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0JGSU5fQUQ3MzMxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfQkZJTl9BRDczMzIyIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgZGV2aWNlcwotIworQ09ORklHX1NORF9VU0I9eQogIyBDT05GSUdfU05EX1VTQl9BVURJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfVVNCX0NBSUFRIGlzIG5vdCBzZXQKLQotIwotIyBTeXN0ZW0gb24gQ2hpcCBhdWRpbyBzdXBwb3J0Ci0jCiBDT05GSUdfU05EX1NPQz1tCitDT05GSUdfU05EX1NPQ19BQzk3X0JVUz15CiBDT05GSUdfU05EX0JGNVhYX0kyUz1tCiBDT05GSUdfU05EX0JGNVhYX1NPQ19TU00yNjAyPW0KLSMgQ09ORklHX1NORF9CRjVYWF9BQzk3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9CRjVYWF9TT0NfQUQ3MzMxMSBpcyBub3Qgc2V0CitDT05GSUdfU05EX0JGNVhYX0FDOTc9bQorQ09ORklHX1NORF9CRjVYWF9NTUFQX1NVUFBPUlQ9eQorIyBDT05GSUdfU05EX0JGNVhYX01VTFRJQ0hBTl9TVVBQT1JUIGlzIG5vdCBzZXQKIENPTkZJR19TTkRfQkY1WFhfU09DX1NQT1JUPW0KIENPTkZJR19TTkRfQkY1WFhfU09DX0kyUz1tCitDT05GSUdfU05EX0JGNVhYX1NPQ19BQzk3PW0KK0NPTkZJR19TTkRfQkY1WFhfU09DX0FEMTk4MD1tCiBDT05GSUdfU05EX0JGNVhYX1NQT1JUX05VTT0wCi0KLSMKLSMgQUxTQSBTb0MgYXVkaW8gZm9yIEZyZWVzY2FsZSBTT0NzCi0jCi0KLSMKLSMgU29DIEF1ZGlvIGZvciB0aGUgVGV4YXMgSW5zdHJ1bWVudHMgT01BUAotIworIyBDT05GSUdfU05EX0JGNVhYX0hBVkVfQ09MRF9SRVNFVCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU09DX0FMTF9DT0RFQ1MgaXMgbm90IHNldAorQ09ORklHX1NORF9TT0NfQUQxOTgwPW0KIENPTkZJR19TTkRfU09DX1NTTTI2MDI9bQotCi0jCi0jIE9wZW4gU291bmQgU3lzdGVtCi0jCiAjIENPTkZJR19TT1VORF9QUklNRSBpcyBub3Qgc2V0CitDT05GSUdfQUM5N19CVVM9bQogQ09ORklHX0hJRF9TVVBQT1JUPXkKIENPTkZJR19ISUQ9eQogIyBDT05GSUdfSElEX0RFQlVHIGlzIG5vdCBzZXQKQEAgLTk5Niw5ICs5OTgsMzYgQEAKICMgVVNCIElucHV0IERldmljZXMKICMKIENPTkZJR19VU0JfSElEPXkKLSMgQ09ORklHX1VTQl9ISURJTlBVVF9QT1dFUkJPT0sgaXMgbm90IHNldAotIyBDT05GSUdfSElEX0ZGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9QSUQgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0hJRERFViBpcyBub3Qgc2V0CisKKyMKKyMgU3BlY2lhbCBISUQgZHJpdmVycworIworQ09ORklHX0hJRF9DT01QQVQ9eQorQ09ORklHX0hJRF9BNFRFQ0g9eQorQ09ORklHX0hJRF9BUFBMRT15CitDT05GSUdfSElEX0JFTEtJTj15CitDT05GSUdfSElEX0JSSUdIVD15CitDT05GSUdfSElEX0NIRVJSWT15CitDT05GSUdfSElEX0NISUNPTlk9eQorQ09ORklHX0hJRF9DWVBSRVNTPXkKK0NPTkZJR19ISURfREVMTD15CitDT05GSUdfSElEX0VaS0VZPXkKK0NPTkZJR19ISURfR1lSQVRJT049eQorQ09ORklHX0hJRF9MT0dJVEVDSD15CisjIENPTkZJR19MT0dJVEVDSF9GRiBpcyBub3Qgc2V0CisjIENPTkZJR19MT0dJUlVNQkxFUEFEMl9GRiBpcyBub3Qgc2V0CitDT05GSUdfSElEX01JQ1JPU09GVD15CitDT05GSUdfSElEX01PTlRFUkVZPXkKK0NPTkZJR19ISURfUEFOVEhFUkxPUkQ9eQorIyBDT05GSUdfUEFOVEhFUkxPUkRfRkYgaXMgbm90IHNldAorQ09ORklHX0hJRF9QRVRBTFlOWD15CitDT05GSUdfSElEX1NBTVNVTkc9eQorQ09ORklHX0hJRF9TT05ZPXkKK0NPTkZJR19ISURfU1VOUExVUz15CitDT05GSUdfVEhSVVNUTUFTVEVSX0ZGPW0KK0NPTkZJR19aRVJPUExVU19GRj1tCiBDT05GSUdfVVNCX1NVUFBPUlQ9eQogQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQogIyBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0kgaXMgbm90IHNldApAQCAtMTAxNiw2ICsxMDQ1LDkgQEAKICMgQ09ORklHX1VTQl9PVEcgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX09UR19XSElURUxJU1QgaXMgbm90IHNldAogQ09ORklHX1VTQl9PVEdfQkxBQ0tMSVNUX0hVQj15CitDT05GSUdfVVNCX01PTj15CisjIENPTkZJR19VU0JfV1VTQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfV1VTQl9DQkFGIGlzIG5vdCBzZXQKIAogIwogIyBVU0IgSG9zdCBDb250cm9sbGVyIERyaXZlcnMKQEAgLTEwMjYsNiArMTA1OCw3IEBACiAjIENPTkZJR19VU0JfSVNQMTM2Ml9IQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1NMODExX0hDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfUjhBNjY1OTdfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9IV0FfSENEIGlzIG5vdCBzZXQKIENPTkZJR19VU0JfTVVTQl9IRFJDPXkKIENPTkZJR19VU0JfTVVTQl9TT0M9eQogCkBAIC0xMDM3LDcgKzEwNzAsNyBAQAogIyBDT05GSUdfVVNCX01VU0JfT1RHIGlzIG5vdCBzZXQKIENPTkZJR19VU0JfTVVTQl9IRFJDX0hDRD15CiBDT05GSUdfTVVTQl9QSU9fT05MWT15Ci1DT05GSUdfVVNCX01VU0JfTE9HTEVWRUw9MAorIyBDT05GSUdfVVNCX01VU0JfREVCVUcgaXMgbm90IHNldAogCiAjCiAjIFVTQiBEZXZpY2UgQ2xhc3MgZHJpdmVycwpAQCAtMTA0NSw2ICsxMDc4LDcgQEAKICMgQ09ORklHX1VTQl9BQ00gaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1BSSU5URVIgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1dETSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVE1DIGlzIG5vdCBzZXQKIAogIwogIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCkBAIC0xMDU5LDcgKzEwOTMsNiBAQAogIyBVU0IgSW1hZ2luZyBkZXZpY2VzCiAjCiAjIENPTkZJR19VU0JfTURDODAwIGlzIG5vdCBzZXQKLUNPTkZJR19VU0JfTU9OPXkKIAogIwogIyBVU0IgcG9ydCBkcml2ZXJzCkBAIC0xMDcyLDcgKzExMDUsNyBAQAogIyBDT05GSUdfVVNCX0VNSTYyIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9FTUkyNiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfQURVVFVYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9BVUVSU1dBTEQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFVlNFRyBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfUklPNTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9MRUdPVE9XRVIgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0xDRCBpcyBub3Qgc2V0CkBAIC0xMDg5LDYgKzExMjIsNyBAQAogIyBDT05GSUdfVVNCX1RSQU5DRVZJQlJBVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9JT1dBUlJJT1IgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lTSUdIVEZXIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9WU1QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NTUMgaXMgbm90IHNldAogIyBDT05GSUdfTUVNU1RJQ0sgaXMgbm90IHNldApAQCAtMTEyOCwzNiArMTE2Miw0NSBAQAogIwogIyBTUEkgUlRDIGRyaXZlcnMKICMKKyMgQ09ORklHX1JUQ19EUlZfTTQxVDk0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxMzA1IGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfTUFYNjkwMiBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX1I5NzAxIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfUlM1QzM0OCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMzIzNCBpcyBub3Qgc2V0CiAKICMKICMgUGxhdGZvcm0gUlRDIGRyaXZlcnMKICMKKyMgQ09ORklHX1JUQ19EUlZfRFMxMjg2IGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfRFMxNTExIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfRFMxNTUzIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfRFMxNzQyIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfU1RLMTdUQTggaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9NNDhUODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUMzUgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9NNDhUNTkgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9CUTQ4MDIgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9WMzAyMCBpcyBub3Qgc2V0CiAKICMKICMgb24tQ1BVIFJUQyBkcml2ZXJzCiAjCiBDT05GSUdfUlRDX0RSVl9CRklOPXkKKyMgQ09ORklHX0RNQURFVklDRVMgaXMgbm90IHNldAogIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUQUdJTkcgaXMgbm90IHNldAogCiAjCiAjIEZpbGUgc3lzdGVtcwogIwogIyBDT05GSUdfRVhUMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKK0NPTkZJR19GSUxFX0xPQ0tJTkc9eQogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldApAQCAtMTIyNSw2ICsxMjY4LDcgQEAKICMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldApAQCAtMTI0MCw3ICsxMjg0LDcgQEAKIENPTkZJR19MT0NLRF9WND15CiBDT05GSUdfTkZTX0NPTU1PTj15CiBDT05GSUdfU1VOUlBDPW0KLSMgQ09ORklHX1NVTlJQQ19CSU5EMzQgaXMgbm90IHNldAorIyBDT05GSUdfU1VOUlBDX1JFR0lTVEVSX1Y0IGlzIG5vdCBzZXQKICMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CiAjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKIENPTkZJR19TTUJfRlM9bQpAQCAtMTMwOCwxMCArMTM1Miw0OCBAQAogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0ZTPXkKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19LRVJORUw9eQorIyBDT05GSUdfREVCVUdfU0hJUlEgaXMgbm90IHNldAorQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQPXkKKyMgQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDIGlzIG5vdCBzZXQKK0NPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQ19WQUxVRT0wCitDT05GSUdfU0NIRURfREVCVUc9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19PQkpFQ1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUlRfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19SVF9NVVRFWF9URVNURVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19JTkZPPXkKKyMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1dSSVRFQ09VTlQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTUVNT1JZX0lOSVQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TRyBpcyBub3Qgc2V0CisjIENPTkZJR19GUkFNRV9QT0lOVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPT1RfUFJJTlRLX0RFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLVFJBQ0VfU0VMRl9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0JMT0NLX0VYVF9ERVZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQorIyBDT05GSUdfRFlOQU1JQ19QUklOVEtfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9BUkNIX0tHREI9eQorIyBDT05GSUdfS0dEQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19WRVJCT1NFPXkKIENPTkZJR19ERUJVR19NTVJTPXkKKyMgQ09ORklHX0RFQlVHX0hXRVJSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RPVUJMRUZBVUxUIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19IVU5UX0ZPUl9aRVJPPXkKIENPTkZJR19ERUJVR19CRklOX0hXVFJBQ0VfT049eQogQ09ORklHX0RFQlVHX0JGSU5fSFdUUkFDRV9DT01QUkVTU0lPTl9PRkY9eQpAQCAtMTMyOSw4ICsxNDExLDkgQEAKICMKICMgQ09ORklHX0tFWVMgaXMgbm90IHNldAogQ09ORklHX1NFQ1VSSVRZPXkKKyMgQ09ORklHX1NFQ1VSSVRZRlMgaXMgbm90IHNldAogIyBDT05GSUdfU0VDVVJJVFlfTkVUV09SSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRUNVUklUWV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlfRklMRV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAogIyBDT05GSUdfU0VDVVJJVFlfUk9PVFBMVUcgaXMgbm90IHNldAogQ09ORklHX1NFQ1VSSVRZX0RFRkFVTFRfTU1BUF9NSU5fQUREUj0wCiBDT05GSUdfQ1JZUFRPPXkKQEAgLTEzMzgsNiArMTQyMSw3IEBACiAjCiAjIENyeXB0byBjb3JlIG9yIGhlbHBlcgogIworIyBDT05GSUdfQ1JZUFRPX0ZJUFMgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01BTkFHRVIgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKQEAgLTEzNzYsNiArMTQ2MCwxMCBAQAogIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUQ1IGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxNjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMzIwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19TSEExIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0CkBAIC0xNDA2LDE1ICsxNDk0LDIwIEBACiAjCiAjIENPTkZJR19DUllQVE9fREVGTEFURSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTFpPIGlzIG5vdCBzZXQKKworIworIyBSYW5kb20gTnVtYmVyIEdlbmVyYXRpb24KKyMKKyMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKIENPTkZJR19DUllQVE9fSFc9eQogCiAjCiAjIExpYnJhcnkgcm91dGluZXMKICMKIENPTkZJR19CSVRSRVZFUlNFPXkKLSMgQ09ORklHX0dFTkVSSUNfRklORF9GSVJTVF9CSVQgaXMgbm90IHNldAogQ09ORklHX0NSQ19DQ0lUVD1tCiAjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfVDEwRElGIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDMzI9eQogIyBDT05GSUdfQ1JDNyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MjctRVpLSVRfZGVmY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTI3LUVaS0lUX2RlZmNvbmZpZwppbmRleCA0YTJhNjYwLi5mOTI2NjhhIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MjctRVpLSVRfZGVmY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUyNy1FWktJVF9kZWZjb25maWcKQEAgLTEsNiArMSw2IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjQuNworIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI4LXJjMgogIwogIyBDT05GSUdfTU1VIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZQVSBpcyBub3Qgc2V0CkBAIC04LDcgKzgsNiBAQAogIyBDT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE0gaXMgbm90IHNldAogQ09ORklHX0JMQUNLRklOPXkKIENPTkZJR19aT05FX0RNQT15Ci1DT05GSUdfU0VNQVBIT1JFX1NMRUVQRVJTPXkKIENPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQogQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CkBAIC0zMSwxOCArMzAsMTYgQEAKICMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CiAjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0VSX05TIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BJRF9OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CiBDT05GSUdfSUtDT05GSUc9eQogQ09ORklHX0lLQ09ORklHX1BST0M9eQogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKICMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAotQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQ9eQotQ09ORklHX0ZBSVJfVVNFUl9TQ0hFRD15Ci0jIENPTkZJR19GQUlSX0NHUk9VUF9TQ0hFRCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CisjIENPTkZJR19HUk9VUF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNGU19ERVBSRUNBVEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjIgaXMgbm90IHNldAogIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfTkFNRVNQQUNFUyBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQogQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKICMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKQEAgLTUxLDI2ICs0OCwzNSBAQAogQ09ORklHX1VJRDE2PXkKIENPTkZJR19TWVNDVExfU1lTQ0FMTD15CiBDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAogQ09ORklHX0hPVFBMVUc9eQogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKLUNPTkZJR19FTEZfQ09SRT15CisjIENPTkZJR19FTEZfQ09SRSBpcyBub3Qgc2V0CitDT05GSUdfQ09NUEFUX0JSSz15CiBDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15CiBDT05GSUdfQU5PTl9JTk9ERVM9eQogQ09ORklHX0VQT0xMPXkKIENPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CiBDT05GSUdfRVZFTlRGRD15CitDT05GSUdfQUlPPXkKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CiBDT05GSUdfU0xBQj15CiAjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfT1BST0ZJTEU9eQorIyBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVCBpcyBub3Qgc2V0CiBDT05GSUdfU0xBQklORk89eQogQ09ORklHX1JUX01VVEVYRVM9eQogQ09ORklHX1RJTllfU0hNRU09eQogQ09ORklHX0JBU0VfU01BTEw9MAogQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQgaXMgbm90IHNldAogQ09ORklHX01PRFVMRV9VTkxPQUQ9eQogIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CiAjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CkBAIC04MSw2ICs4Nyw3IEBACiAjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0xTRiBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CiAKICMKICMgSU8gU2NoZWR1bGVycwpAQCAtOTQsOSArMTAxLDExIEBACiAjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAogQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iYW50aWNpcGF0b3J5IgorQ09ORklHX0NMQVNTSUNfUkNVPXkKICMgQ09ORklHX1BSRUVNUFRfTk9ORSBpcyBub3Qgc2V0CiBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlk9eQogIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CisjIENPTkZJR19GUkVFWkVSIGlzIG5vdCBzZXQKIAogIwogIyBCbGFja2ZpbiBQcm9jZXNzb3IgT3B0aW9ucwpAQCAtMTA1LDYgKzExNCwxMCBAQAogIwogIyBQcm9jZXNzb3IgYW5kIEJvYXJkIFNldHRpbmdzCiAjCisjIENPTkZJR19CRjUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUxNCBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUxNiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUxOCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUyMiBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUyMyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUyNCBpcyBub3Qgc2V0CkBAIC0xMTcsMjMgKzEzMCw3NCBAQAogIyBDT05GSUdfQkY1MzQgaXMgbm90IHNldAogIyBDT05GSUdfQkY1MzYgaXMgbm90IHNldAogIyBDT05GSUdfQkY1MzcgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MzggaXMgbm90IHNldAorIyBDT05GSUdfQkY1MzkgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDIgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDQgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDcgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDggaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDkgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NjEgaXMgbm90IHNldAorQ09ORklHX0JGX1JFVl9NSU49MAorQ09ORklHX0JGX1JFVl9NQVg9MgogQ09ORklHX0JGX1JFVl8wXzA9eQogIyBDT05GSUdfQkZfUkVWXzBfMSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfMF8yIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl8wXzMgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWXzBfNCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfMF81IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGX1JFVl8wXzYgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWX0FOWSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfTk9ORSBpcyBub3Qgc2V0CiBDT05GSUdfQkY1Mng9eQogQ09ORklHX01FTV9NVDQ4TEMzMk0xNkEyVEdfNzU9eQorQ09ORklHX0lSUV9QTExfV0FLRVVQPTcKK0NPTkZJR19JUlFfRE1BMF9FUlJPUj03CitDT05GSUdfSVJRX0RNQVIwX0JMSz03CitDT05GSUdfSVJRX0RNQVIxX0JMSz03CitDT05GSUdfSVJRX0RNQVIwX09WUj03CitDT05GSUdfSVJRX0RNQVIxX09WUj03CitDT05GSUdfSVJRX1BQSV9FUlJPUj03CitDT05GSUdfSVJRX01BQ19FUlJPUj03CitDT05GSUdfSVJRX1NQT1JUMF9FUlJPUj03CitDT05GSUdfSVJRX1NQT1JUMV9FUlJPUj03CitDT05GSUdfSVJRX1VBUlQwX0VSUk9SPTcKK0NPTkZJR19JUlFfVUFSVDFfRVJST1I9NworQ09ORklHX0lSUV9SVEM9OAorQ09ORklHX0lSUV9QUEk9OAorQ09ORklHX0lSUV9TUE9SVDBfUlg9OQorQ09ORklHX0lSUV9TUE9SVDBfVFg9OQorQ09ORklHX0lSUV9TUE9SVDFfUlg9OQorQ09ORklHX0lSUV9TUE9SVDFfVFg9OQorQ09ORklHX0lSUV9UV0k9MTAKK0NPTkZJR19JUlFfVUFSVDBfUlg9MTAKK0NPTkZJR19JUlFfVUFSVDBfVFg9MTAKK0NPTkZJR19JUlFfVUFSVDFfUlg9MTAKK0NPTkZJR19JUlFfVUFSVDFfVFg9MTAKK0NPTkZJR19JUlFfT1BUU0VDPTExCitDT05GSUdfSVJRX0NOVD0xMQorQ09ORklHX0lSUV9NQUNfUlg9MTEKK0NPTkZJR19JUlFfUE9SVEhfSU5UQT0xMQorQ09ORklHX0lSUV9NQUNfVFg9MTEKK0NPTkZJR19JUlFfUE9SVEhfSU5UQj0xMQorQ09ORklHX0lSUV9USU1FUjA9OAorQ09ORklHX0lSUV9USU1FUjE9MTIKK0NPTkZJR19JUlFfVElNRVIyPTEyCitDT05GSUdfSVJRX1RJTUVSMz0xMgorQ09ORklHX0lSUV9USU1FUjQ9MTIKK0NPTkZJR19JUlFfVElNRVI1PTEyCitDT05GSUdfSVJRX1RJTUVSNj0xMgorQ09ORklHX0lSUV9USU1FUjc9MTIKK0NPTkZJR19JUlFfUE9SVEdfSU5UQT0xMgorQ09ORklHX0lSUV9QT1JUR19JTlRCPTEyCitDT05GSUdfSVJRX01FTV9ETUEwPTEzCitDT05GSUdfSVJRX01FTV9ETUExPTEzCitDT05GSUdfSVJRX1dBVENIPTEzCitDT05GSUdfSVJRX1BPUlRGX0lOVEE9MTMKK0NPTkZJR19JUlFfUE9SVEZfSU5UQj0xMwogQ09ORklHX0JGSU41MjdfRVpLSVQ9eQorIyBDT05GSUdfQkZJTjUyN19CTFVFVEVDSE5JWF9DTSBpcyBub3Qgc2V0CisjIENPTkZJR19CRklONTI2X0VaQlJEIGlzIG5vdCBzZXQKIAogIwogIyBCRjUyNyBTcGVjaWZpYyBDb25maWd1cmF0aW9uCkBAIC0xNTgsNTEgKzIyMiw3IEBACiAjCiAjIFByaW9yaXR5CiAjCi1DT05GSUdfSVJRX1BMTF9XQUtFVVA9NwotQ09ORklHX0lSUV9ETUEwX0VSUk9SPTcKLUNPTkZJR19JUlFfRE1BUjBfQkxLPTcKLUNPTkZJR19JUlFfRE1BUjFfQkxLPTcKLUNPTkZJR19JUlFfRE1BUjBfT1ZSPTcKLUNPTkZJR19JUlFfRE1BUjFfT1ZSPTcKLUNPTkZJR19JUlFfUFBJX0VSUk9SPTcKLUNPTkZJR19JUlFfTUFDX0VSUk9SPTcKLUNPTkZJR19JUlFfU1BPUlQwX0VSUk9SPTcKLUNPTkZJR19JUlFfU1BPUlQxX0VSUk9SPTcKLUNPTkZJR19JUlFfVUFSVDBfRVJST1I9NwotQ09ORklHX0lSUV9VQVJUMV9FUlJPUj03Ci1DT05GSUdfSVJRX1JUQz04Ci1DT05GSUdfSVJRX1BQST04Ci1DT05GSUdfSVJRX1NQT1JUMF9SWD05Ci1DT05GSUdfSVJRX1NQT1JUMF9UWD05Ci1DT05GSUdfSVJRX1NQT1JUMV9SWD05Ci1DT05GSUdfSVJRX1NQT1JUMV9UWD05Ci1DT05GSUdfSVJRX1RXST0xMAogQ09ORklHX0lSUV9TUEk9MTAKLUNPTkZJR19JUlFfVUFSVDBfUlg9MTAKLUNPTkZJR19JUlFfVUFSVDBfVFg9MTAKLUNPTkZJR19JUlFfVUFSVDFfUlg9MTAKLUNPTkZJR19JUlFfVUFSVDFfVFg9MTAKLUNPTkZJR19JUlFfT1BUU0VDPTExCi1DT05GSUdfSVJRX0NOVD0xMQotQ09ORklHX0lSUV9NQUNfUlg9MTEKLUNPTkZJR19JUlFfUE9SVEhfSU5UQT0xMQotQ09ORklHX0lSUV9NQUNfVFg9MTEKLUNPTkZJR19JUlFfUE9SVEhfSU5UQj0xMQotQ09ORklHX0lSUV9UTVIwPTEyCi1DT05GSUdfSVJRX1RNUjE9MTIKLUNPTkZJR19JUlFfVE1SMj0xMgotQ09ORklHX0lSUV9UTVIzPTEyCi1DT05GSUdfSVJRX1RNUjQ9MTIKLUNPTkZJR19JUlFfVE1SNT0xMgotQ09ORklHX0lSUV9UTVI2PTEyCi1DT05GSUdfSVJRX1RNUjc9MTIKLUNPTkZJR19JUlFfUE9SVEdfSU5UQT0xMgotQ09ORklHX0lSUV9QT1JUR19JTlRCPTEyCi1DT05GSUdfSVJRX01FTV9ETUEwPTEzCi1DT05GSUdfSVJRX01FTV9ETUExPTEzCi1DT05GSUdfSVJRX1dBVENIPTEzCi1DT05GSUdfSVJRX1BPUlRGX0lOVEE9MTMKLUNPTkZJR19JUlFfUE9SVEZfSU5UQj0xMwogQ09ORklHX0lSUV9TUElfRVJST1I9NwogQ09ORklHX0lSUV9ORkNfRVJST1I9NwogQ09ORklHX0lSUV9IRE1BX0VSUk9SPTcKQEAgLTIyNCw3ICsyNDQsNiBAQAogIwogQ09ORklHX0NMS0lOX0haPTI1MDAwMDAwCiAjIENPTkZJR19CRklOX0tFUk5FTF9DTE9DSyBpcyBub3Qgc2V0Ci1DT05GSUdfTUFYX01FTV9TSVpFPTUxMgogQ09ORklHX01BWF9WQ09fSFo9NjAwMDAwMDAwCiBDT05GSUdfTUlOX1ZDT19IWj01MDAwMDAwMAogQ09ORklHX01BWF9TQ0xLX0haPTEzMzMzMzMzMwpAQCAtMjM4LDEwICsyNTcsMTAgQEAKICMgQ09ORklHX0haXzMwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKIENPTkZJR19IWj0yNTAKKyMgQ09ORklHX1NDSEVEX0hSVElDSyBpcyBub3Qgc2V0CiBDT05GSUdfR0VORVJJQ19USU1FPXkKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKICMgQ09ORklHX0NZQ0xFU19DTE9DS1NPVVJDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19USUNLX09ORVNIT1QgaXMgbm90IHNldAogIyBDT05GSUdfTk9fSFogaXMgbm90IHNldAogIyBDT05GSUdfSElHSF9SRVNfVElNRVJTIGlzIG5vdCBzZXQKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JVSUxEPXkKQEAgLTI3NSw2ICsyOTQsMTIgQEAKIENPTkZJR19DQUNIRUxJTkVfQUxJR05FRF9MMT15CiAjIENPTkZJR19TWVNDQUxMX1RBQl9MMSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUExCX1NXSVRDSF9UQUJfTDEgaXMgbm90IHNldAorQ09ORklHX0FQUF9TVEFDS19MMT15CisKKyMKKyMgU3BlZWQgT3B0aW1pemF0aW9ucworIworQ09ORklHX0JGSU5fSU5TX0xPV09WRVJIRUFEPXkKIENPTkZJR19SQU1LRVJORUw9eQogIyBDT05GSUdfUk9NS0VSTkVMIGlzIG5vdCBzZXQKIENPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKQEAgLTI4MywxNCArMzA4LDEzIEBACiAjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKIENPTkZJR19GTEFUTUVNPXkKIENPTkZJR19GTEFUX05PREVfTUVNX01BUD15Ci0jIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQQVJTRU1FTV9WTUVNTUFQX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfUEFHRUZMQUdTX0VYVEVOREVEPXkKIENPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CiAjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAorIyBDT05GSUdfUEhZU19BRERSX1RfNjRCSVQgaXMgbm90IHNldAogQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQogQ09ORklHX1ZJUlRfVE9fQlVTPXkKIENPTkZJR19CRklOX0dQVElNRVJTPXkKLUNPTkZJR19CRklOX0RNQV81WFg9eQogIyBDT05GSUdfRE1BX1VOQ0FDSEVEXzRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0RNQV9VTkNBQ0hFRF8yTSBpcyBub3Qgc2V0CiBDT05GSUdfRE1BX1VOQ0FDSEVEXzFNPXkKQEAgLTMwNSw3ICszMjksNiBAQAogIyBDT05GSUdfQkZJTl9JQ0FDSEVfTE9DSyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRklOX1dCIGlzIG5vdCBzZXQKIENPTkZJR19CRklOX1dUPXkKLUNPTkZJR19MMV9NQVhfUElFQ0U9MTYKICMgQ09ORklHX01QVSBpcyBub3Qgc2V0CiAKICMKQEAgLTMzNCw3ICszNTcsNiBAQAogIwogIyBCdXMgb3B0aW9ucyAoUENJLCBQQ01DSUEsIEVJU0EsIE1DQSwgSVNBKQogIwotIyBDT05GSUdfUENJIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKICMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CiAKQEAgLTM0NSwyMyArMzY3LDIwIEBACiBDT05GSUdfQklORk1UX0ZMQVQ9eQogQ09ORklHX0JJTkZNVF9aRkxBVD15CiAjIENPTkZJR19CSU5GTVRfU0hBUkVEX0ZMQVQgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9BT1VUIGlzIG5vdCBzZXQKICMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKIAogIwogIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKICMKICMgQ09ORklHX1BNIGlzIG5vdCBzZXQKLUNPTkZJR19TVVNQRU5EX1VQX1BPU1NJQkxFPXkKK0NPTkZJR19BUkNIX1NVU1BFTkRfUE9TU0lCTEU9eQogIyBDT05GSUdfUE1fV0FLRVVQX0JZX0dQSU8gaXMgbm90IHNldAogCiAjCiAjIENQVSBGcmVxdWVuY3kgc2NhbGluZwogIwogIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmtpbmcKLSMKIENPTkZJR19ORVQ9eQogCiAjCkBAIC0zNzQsNiArMzkzLDcgQEAKICMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAogIyBDT05GSUdfWEZSTV9NSUdSQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fU1RBVElTVElDUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKIENPTkZJR19JTkVUPXkKICMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CkBAIC00MDMsOCArNDIzLDYgQEAKIENPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKICMgQ09ORklHX1RDUF9NRDVTSUcgaXMgbm90IHNldAogIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUTEFCRUwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CkBAIC00MTMsNiArNDMxLDcgQEAKICMgQ09ORklHX1RJUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRFNBIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAogIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKICMgQ09ORklHX0xMQzIgaXMgbm90IHNldApAQCAtNDI5LDYgKzQ0OCw3IEBACiAjCiAjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBTiBpcyBub3Qgc2V0CiBDT05GSUdfSVJEQT1tCiAKICMKQEAgLTQ2NywxNSArNDg3LDYgQEAKICMgQ09ORklHX0tTOTU5X0RPTkdMRSBpcyBub3Qgc2V0CiAKICMKLSMgT2xkIFNJUiBkZXZpY2UgZHJpdmVycwotIwotIyBDT05GSUdfSVJQT1JUX1NJUiBpcyBub3Qgc2V0Ci0KLSMKLSMgT2xkIFNlcmlhbCBkb25nbGUgc3VwcG9ydAotIwotCi0jCiAjIEZJUiBkZXZpY2UgZHJpdmVycwogIwogIyBDT05GSUdfVVNCX0lSREEgaXMgbm90IHNldApAQCAtNDgzLDExICs0OTQsMTAgQEAKICMgQ09ORklHX01DU19GSVIgaXMgbm90IHNldAogIyBDT05GSUdfQlQgaXMgbm90IHNldAogIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzCi0jCisjIENPTkZJR19QSE9ORVQgaXMgbm90IHNldAorQ09ORklHX1dJUkVMRVNTPXkKICMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKK0NPTkZJR19XSVJFTEVTU19PTERfUkVHVUxBVE9SWT15CiAjIENPTkZJR19XSVJFTEVTU19FWFQgaXMgbm90IHNldAogIyBDT05GSUdfTUFDODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKQEAgLTUwNSw2ICs1MTUsOCBAQAogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQogIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ERVZSRVMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAogIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQpAQCAtNTEzLDYgKzUyNSw3IEBACiBDT05GSUdfTVREX1BBUlRJVElPTlM9eQogIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAogIyBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FSN19QQVJUUyBpcyBub3Qgc2V0CiAKICMKICMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKQEAgLTU1Niw2ICs1NjksNyBAQAogIwogQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTPXkKICMgQ09ORklHX01URF9QSFlTTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9HUElPX0FERFIgaXMgbm90IHNldAogIyBDT05GSUdfTVREX1VDTElOVVggaXMgbm90IHNldAogIyBDT05GSUdfTVREX1BMQVRSQU0gaXMgbm90IHNldAogCkBAIC01NjMsNyArNTc3LDggQEAKICMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCiAjCiAjIENPTkZJR19NVERfREFUQUZMQVNIIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9NMjVQODAgaXMgbm90IHNldAorQ09ORklHX01URF9NMjVQODA9eQorQ09ORklHX00yNVBYWF9VU0VfRkFTVF9SRUFEPXkKICMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAogIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CkBAIC02MDUsMTEgKzYyMCwxNCBAQAogQ09ORklHX0JMS19ERVZfUkFNPXkKIENPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgogQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgotQ09ORklHX0JMS19ERVZfUkFNX0JMT0NLU0laRT0xMDI0CisjIENPTkZJR19CTEtfREVWX1hJUCBpcyBub3Qgc2V0CiAjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKIENPTkZJR19NSVNDX0RFVklDRVM9eQogIyBDT05GSUdfRUVQUk9NXzkzQ1g2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQ0xPU1VSRV9TRVJWSUNFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9JREU9eQogIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKIAogIwpAQCAtNjIyLDcgKzY0MCw2IEBACiAjIENPTkZJR19BVEEgaXMgbm90IHNldAogIyBDT05GSUdfTUQgaXMgbm90IHNldAogQ09ORklHX05FVERFVklDRVM9eQotIyBDT05GSUdfTkVUREVWSUNFU19NVUxUSVFVRVVFIGlzIG5vdCBzZXQKICMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKICMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAogIyBDT05GSUdfTUFDVkxBTiBpcyBub3Qgc2V0CkBAIC02NDMsNiArNjYwLDcgQEAKICMgQ09ORklHX1NNU0NfUEhZIGlzIG5vdCBzZXQKICMgQ09ORklHX0JST0FEQ09NX1BIWSBpcyBub3Qgc2V0CiAjIENPTkZJR19JQ1BMVVNfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFQUxURUtfUEhZIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZJWEVEX1BIWSBpcyBub3Qgc2V0CiAjIENPTkZJR19NRElPX0JJVEJBTkcgaXMgbm90IHNldAogQ09ORklHX05FVF9FVEhFUk5FVD15CkBAIC02NTUsMTEgKzY3MywxNCBAQAogIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKICMgQ09ORklHX1NNU0M5MTFYIGlzIG5vdCBzZXQKICMgQ09ORklHX0RNOTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FTkMyOEo2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19JQk1fTkVXX0VNQUNfWk1JSSBpcyBub3Qgc2V0CiAjIENPTkZJR19JQk1fTkVXX0VNQUNfUkdNSUkgaXMgbm90IHNldAogIyBDT05GSUdfSUJNX05FV19FTUFDX1RBSCBpcyBub3Qgc2V0CiAjIENPTkZJR19JQk1fTkVXX0VNQUNfRU1BQzQgaXMgbm90IHNldAotIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19OT19GTE9XX0NUUkwgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DTFJfSUNJTlRTVEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19NQUxfQ09NTU9OX0VSUiBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWXzEwMDA9eQogIyBDT05GSUdfQVg4ODE4MCBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWXzEwMDAwPXkKQEAgLTY2OSw2ICs2OTAsNyBAQAogIwogIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lXTFdJRklfTEVEUyBpcyBub3Qgc2V0CiAKICMKICMgVVNCIE5ldHdvcmsgQWRhcHRlcnMKQEAgLTY4MSw3ICs3MDMsNiBAQAogIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CkBAIC02OTIsNyArNzEzLDcgQEAKICMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKICMKIENPTkZJR19JTlBVVD15Ci0jIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9GRl9NRU1MRVNTPW0KICMgQ09ORklHX0lOUFVUX1BPTExERVYgaXMgbm90IHNldAogCiAjCkBAIC03MTcsOCArNzM4LDkgQEAKICMgQ09ORklHX0lOUFVUX0tFWVNQQU5fUkVNT1RFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX1BPV0VSTUFURSBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9ZRUFMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0NNMTA5IGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX1VJTlBVVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19UV0lfS0VZUEFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTkZJR19JTlBVVF9QQ0Y4NTc0IGlzIG5vdCBzZXQKIAogIwogIyBIYXJkd2FyZSBJL08gcG9ydHMKQEAgLTczNCwxNiArNzU2LDE4IEBACiAjIENPTkZJR19CRjV4eF9QUElGQ0QgaXMgbm90IHNldAogIyBDT05GSUdfQkZJTl9TSU1QTEVfVElNRVIgaXMgbm90IHNldAogIyBDT05GSUdfQkY1eHhfUFBJIGlzIG5vdCBzZXQKLUNPTkZJR19CRklOX09UUD15Ci0jIENPTkZJR19CRklOX09UUF9XUklURV9FTkFCTEUgaXMgbm90IHNldAogIyBDT05GSUdfQkZJTl9TUE9SVCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRklOX1RJTUVSX0xBVEVOQ1kgaXMgbm90IHNldAogIyBDT05GSUdfVFdJX0xDRCBpcyBub3Qgc2V0CitDT05GSUdfQkZJTl9ETUFfSU5URVJGQUNFPW0KIENPTkZJR19TSU1QTEVfR1BJTz1tCiBDT05GSUdfVlQ9eQorQ09ORklHX0NPTlNPTEVfVFJBTlNMQVRJT05TPXkKIENPTkZJR19WVF9DT05TT0xFPXkKIENPTkZJR19IV19DT05TT0xFPXkKICMgQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZLTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGSU5fSlRBR19DT01NIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CiAKICMKQEAgLTc2Niw2ICs3OTAsOCBAQAogIyBDT05GSUdfU0VSSUFMX0JGSU5fU1BPUlQgaXMgbm90IHNldAogQ09ORklHX1VOSVg5OF9QVFlTPXkKICMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKK0NPTkZJR19CRklOX09UUD15CisjIENPTkZJR19CRklOX09UUF9XUklURV9FTkFCTEUgaXMgbm90IHNldAogCiAjCiAjIENBTiwgdGhlIGNhciBidXMgYW5kIGluZHVzdHJpYWwgZmllbGRidXMKQEAgLTc3Myw0NCArNzk5LDQ5IEBACiAjIENPTkZJR19DQU40TElOVVggaXMgbm90IHNldAogIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKICMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKICMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CiBDT05GSUdfSTJDPXkKIENPTkZJR19JMkNfQk9BUkRJTkZPPXkKIENPTkZJR19JMkNfQ0hBUkRFVj1tCi0KLSMKLSMgSTJDIEFsZ29yaXRobXMKLSMKLSMgQ09ORklHX0kyQ19BTEdPQklUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTEdPUENGIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTEdPUENBIGlzIG5vdCBzZXQKK0NPTkZJR19JMkNfSEVMUEVSX0FVVE89eQogCiAjCiAjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAogIworCisjCisjIEkyQyBzeXN0ZW0gYnVzIGRyaXZlcnMgKG1vc3RseSBlbWJlZGRlZCAvIHN5c3RlbS1vbi1jaGlwKQorIwogQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0k9bQotQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfQ0xLX0tIWj01MAorQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfQ0xLX0tIWj0xMDAKICMgQ09ORklHX0kyQ19HUElPIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1NJTVRFQyBpcyBub3Qgc2V0CisKKyMKKyMgRXh0ZXJuYWwgSTJDL1NNQnVzIGFkYXB0ZXIgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1RBT1NfRVZNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19USU5ZX1VTQiBpcyBub3Qgc2V0CiAKICMKKyMgT3RoZXIgSTJDL1NNQnVzIGJ1cyBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfUENBX1BMQVRGT1JNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKKworIwogIyBNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQKICMKLSMgQ09ORklHX1NFTlNPUlNfRFMxMzM3IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfRFMxMzc0IGlzIG5vdCBzZXQKICMgQ09ORklHX0RTMTY4MiBpcyBub3Qgc2V0CisjIENPTkZJR19BVDI0IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQUQ1MjUyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRUVQUk9NIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDRjg1NzUgaXMgbm90IHNldAorIyBDT05GSUdfUENGODU3NSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTUFYNjg3NSBpcyBub3Qgc2V0CkBAIC04MTksMTcgKzg1MCwxNSBAQAogIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0Ci0KLSMKLSMgU1BJIHN1cHBvcnQKLSMKIENPTkZJR19TUEk9eQorIyBDT05GSUdfU1BJX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19TUElfTUFTVEVSPXkKIAogIwogIyBTUEkgTWFzdGVyIENvbnRyb2xsZXIgRHJpdmVycwogIwogQ09ORklHX1NQSV9CRklOPXkKKyMgQ09ORklHX1NQSV9CRklOX0xPQ0sgaXMgbm90IHNldAogIyBDT05GSUdfU1BJX0JJVEJBTkcgaXMgbm90IHNldAogCiAjCkBAIC04MzgsMTEgKzg2NywxNSBAQAogIyBDT05GSUdfU1BJX0FUMjUgaXMgbm90IHNldAogIyBDT05GSUdfU1BJX1NQSURFViBpcyBub3Qgc2V0CiAjIENPTkZJR19TUElfVExFNjJYMCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUI9eQorIyBDT05GSUdfR1BJT0xJQiBpcyBub3Qgc2V0CiAjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAogQ09ORklHX0hXTU9OPXkKICMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FENzQxNCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FENzQxOCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FEQ1hYIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKQEAgLTg1MCw2ICs4ODMsNyBAQAogIyBDT05GSUdfU0VOU09SU19BRE0xMDMxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNOTI0MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FEVDc0NzAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRFQ3NDczIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQVRYUDEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19EUzE2MjEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GNzE4MDVGIGlzIG5vdCBzZXQKQEAgLTg3MCw2ICs5MDQsNyBAQAogIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTE05MiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0xNOTMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVgxMTExIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTUFYMTYxOSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX01BWDY2NTAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKQEAgLTg3OCw2ICs5MTMsNyBAQAogIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xOTIgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURTNzgyOCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1RITUM1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1ZUMTIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldApAQCAtODg1LDkgKzkyMSwxMiBAQAogIyBDT05GSUdfU0VOU09SU19XODM3OTJEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNzkzIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzTDc4Nk5HIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM2MjdFSEYgaXMgbm90IHNldAogIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAogQ09ORklHX1dBVENIRE9HPXkKICMgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUIGlzIG5vdCBzZXQKIApAQCAtOTAzLDIxICs5NDIsMjkgQEAKICMgQ09ORklHX1VTQlBDV0FUQ0hET0cgaXMgbm90IHNldAogCiAjCi0jIFNvbmljcyBTaWxpY29uIEJhY2twbGFuZQotIwotQ09ORklHX1NTQl9QT1NTSUJMRT15Ci0jIENPTkZJR19TU0IgaXMgbm90IHNldAotCi0jCiAjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKICMKKyMgQ09ORklHX01GRF9DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTg0MDAgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODM1MF9JMkMgaXMgbm90IHNldAogCiAjCiAjIE11bHRpbWVkaWEgZGV2aWNlcwogIworCisjCisjIE11bHRpbWVkaWEgY29yZSBzdXBwb3J0CisjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAogIyBDT05GSUdfRFZCX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fTUVESUEgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZHJpdmVycworIwogIyBDT05GSUdfREFCIGlzIG5vdCBzZXQKIAogIwpAQCAtOTI4LDYgKzk3NSw3IEBACiBDT05GSUdfRkI9eQogIyBDT05GSUdfRklSTVdBUkVfRURJRCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9EREMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQk9PVF9WRVNBX1NVUFBPUlQgaXMgbm90IHNldAogQ09ORklHX0ZCX0NGQl9GSUxMUkVDVD15CiBDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBPXkKIENPTkZJR19GQl9DRkJfSU1BR0VCTElUPXkKQEAgLTkzNSw4ICs5ODMsOCBAQAogIyBDT05GSUdfRkJfU1lTX0ZJTExSRUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1NZU19DT1BZQVJFQSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9TWVNfSU1BR0VCTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0ZPUkVJR05fRU5ESUFOIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1NZU19GT1BTIGlzIG5vdCBzZXQKLUNPTkZJR19GQl9ERUZFUlJFRF9JTz15CiAjIENPTkZJR19GQl9TVkdBTElCIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX01BQ01PREVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0JBQ0tMSUdIVCBpcyBub3Qgc2V0CkBAIC05NDcsMTIgKzk5NSwxOCBAQAogIyBGcmFtZSBidWZmZXIgaGFyZHdhcmUgZHJpdmVycwogIwogQ09ORklHX0ZCX0JGSU5fVDM1ME1DUUI9eQorIyBDT05GSUdfRkJfQkZJTl9MUTAzNVExIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0JGSU5fNzM5MyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9TMUQxM1hYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01FVFJPTk9NRSBpcyBub3Qgc2V0CiBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUPXkKIENPTkZJR19MQ0RfQ0xBU1NfREVWSUNFPW0KIENPTkZJR19MQ0RfTFRWMzUwUVY9bQorIyBDT05GSUdfTENEX0lMSTkzMjAgaXMgbm90IHNldAorIyBDT05GSUdfTENEX1RETzI0TSBpcyBub3Qgc2V0CisjIENPTkZJR19MQ0RfVkdHMjQzMkE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xDRF9QTEFURk9STSBpcyBub3Qgc2V0CiBDT05GSUdfQkFDS0xJR0hUX0NMQVNTX0RFVklDRT1tCiAjIENPTkZJR19CQUNLTElHSFRfQ09SR0kgaXMgbm90IHNldAogCkBAIC05NzcsMTUgKzEwMzEsOCBAQAogIyBDT05GSUdfTE9HT19MSU5VWF9DTFVUMjI0IGlzIG5vdCBzZXQKICMgQ09ORklHX0xPR09fQkxBQ0tGSU5fVkdBMTYgaXMgbm90IHNldAogQ09ORklHX0xPR09fQkxBQ0tGSU5fQ0xVVDIyND15Ci0KLSMKLSMgU291bmQKLSMKIENPTkZJR19TT1VORD1tCi0KLSMKLSMgQWR2YW5jZWQgTGludXggU291bmQgQXJjaGl0ZWN0dXJlCi0jCisjIENPTkZJR19TT1VORF9PU1NfQ09SRSBpcyBub3Qgc2V0CiBDT05GSUdfU05EPW0KIENPTkZJR19TTkRfVElNRVI9bQogQ09ORklHX1NORF9QQ009bQpAQCAtOTk3LDYyICsxMDQ0LDM4IEBACiBDT05GSUdfU05EX1ZFUkJPU0VfUFJPQ0ZTPXkKICMgQ09ORklHX1NORF9WRVJCT1NFX1BSSU5USyBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfREVCVUcgaXMgbm90IHNldAotCi0jCi0jIEdlbmVyaWMgZGV2aWNlcwotIworQ09ORklHX1NORF9EUklWRVJTPXkKICMgQ09ORklHX1NORF9EVU1NWSBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfTVRQQVYgaXMgbm90IHNldAogIyBDT05GSUdfU05EX1NFUklBTF9VMTY1NTAgaXMgbm90IHNldAogIyBDT05GSUdfU05EX01QVTQwMSBpcyBub3Qgc2V0Ci0KLSMKLSMgU1BJIGRldmljZXMKLSMKK0NPTkZJR19TTkRfU1BJPXkKIAogIwogIyBBTFNBIEJsYWNrZmluIGRldmljZXMKICMKICMgQ09ORklHX1NORF9CTEFDS0ZJTl9BRDE4MzYgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0JMQUNLRklOX0FEMTgzNl9URE0gaXMgbm90IHNldAotIyBDT05GSUdfU05EX0JMQUNLRklOX0FEMTgzNl9JMlMgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0JMQUNLRklOX0FEMTgzNl9NVUxTVUIgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0JMQUNLRklOX0FEMTgzNl81UDEgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0JGSU5fQUQ3MzMxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfQkZJTl9BRDczMzIyIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgZGV2aWNlcwotIworQ09ORklHX1NORF9VU0I9eQogIyBDT05GSUdfU05EX1VTQl9BVURJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfVVNCX0NBSUFRIGlzIG5vdCBzZXQKLQotIwotIyBTeXN0ZW0gb24gQ2hpcCBhdWRpbyBzdXBwb3J0Ci0jCi1DT05GSUdfU05EX1NPQ19BQzk3X0JVUz15CiBDT05GSUdfU05EX1NPQz1tCi1DT05GSUdfU05EX0JGNVhYX1NPQz1tCi1DT05GSUdfU05EX01NQVBfU1VQUE9SVD15CitDT05GSUdfU05EX1NPQ19BQzk3X0JVUz15CitDT05GSUdfU05EX0JGNVhYX0kyUz1tCitDT05GSUdfU05EX0JGNVhYX1NPQ19TU00yNjAyPW0KKyMgQ09ORklHX1NORF9CRjVYWF9TT0NfQUQ3MzMxMSBpcyBub3Qgc2V0CitDT05GSUdfU05EX0JGNVhYX0FDOTc9bQorQ09ORklHX1NORF9CRjVYWF9NTUFQX1NVUFBPUlQ9eQorIyBDT05GSUdfU05EX0JGNVhYX01VTFRJQ0hBTl9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfQkY1WFhfU09DX1NQT1JUPW0KIENPTkZJR19TTkRfQkY1WFhfU09DX0kyUz1tCiBDT05GSUdfU05EX0JGNVhYX1NPQ19BQzk3PW0KLSMgQ09ORklHX1NORF9CRjVYWF9TT0NfV004NzUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9CRjVYWF9TT0NfV004NzMxIGlzIG5vdCBzZXQKLUNPTkZJR19TTkRfQkY1WFhfU09DX1NTTTI2MDI9bQotQ09ORklHX1NORF9CRjVYWF9TT0NfQkY1eHg9bQorQ09ORklHX1NORF9CRjVYWF9TT0NfQUQxOTgwPW0KIENPTkZJR19TTkRfQkY1WFhfU1BPUlRfTlVNPTAKICMgQ09ORklHX1NORF9CRjVYWF9IQVZFX0NPTERfUkVTRVQgaXMgbm90IHNldAotCi0jCi0jIFNvQyBBdWRpbyBzdXBwb3J0IGZvciBTdXBlckgKLSMKLUNPTkZJR19TTkRfU09DX1NTTTI2MDI9bQotIyBDT05GSUdfU05EX1NPQ19TU00yNjAyX1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU09DX0FMTF9DT0RFQ1MgaXMgbm90IHNldAogQ09ORklHX1NORF9TT0NfQUQxOTgwPW0KLQotIwotIyBPcGVuIFNvdW5kIFN5c3RlbQotIworQ09ORklHX1NORF9TT0NfU1NNMjYwMj1tCiAjIENPTkZJR19TT1VORF9QUklNRSBpcyBub3Qgc2V0CiBDT05GSUdfQUM5N19CVVM9bQogQ09ORklHX0hJRF9TVVBQT1JUPXkKQEAgLTEwNjQsMTUgKzEwODcsNDMgQEAKICMgVVNCIElucHV0IERldmljZXMKICMKIENPTkZJR19VU0JfSElEPXkKLSMgQ09ORklHX1VTQl9ISURJTlBVVF9QT1dFUkJPT0sgaXMgbm90IHNldAotIyBDT05GSUdfSElEX0ZGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9QSUQgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0hJRERFViBpcyBub3Qgc2V0CisKKyMKKyMgU3BlY2lhbCBISUQgZHJpdmVycworIworQ09ORklHX0hJRF9DT01QQVQ9eQorQ09ORklHX0hJRF9BNFRFQ0g9eQorQ09ORklHX0hJRF9BUFBMRT15CitDT05GSUdfSElEX0JFTEtJTj15CitDT05GSUdfSElEX0JSSUdIVD15CitDT05GSUdfSElEX0NIRVJSWT15CitDT05GSUdfSElEX0NISUNPTlk9eQorQ09ORklHX0hJRF9DWVBSRVNTPXkKK0NPTkZJR19ISURfREVMTD15CitDT05GSUdfSElEX0VaS0VZPXkKK0NPTkZJR19ISURfR1lSQVRJT049eQorQ09ORklHX0hJRF9MT0dJVEVDSD15CisjIENPTkZJR19MT0dJVEVDSF9GRiBpcyBub3Qgc2V0CisjIENPTkZJR19MT0dJUlVNQkxFUEFEMl9GRiBpcyBub3Qgc2V0CitDT05GSUdfSElEX01JQ1JPU09GVD15CitDT05GSUdfSElEX01PTlRFUkVZPXkKK0NPTkZJR19ISURfUEFOVEhFUkxPUkQ9eQorIyBDT05GSUdfUEFOVEhFUkxPUkRfRkYgaXMgbm90IHNldAorQ09ORklHX0hJRF9QRVRBTFlOWD15CitDT05GSUdfSElEX1NBTVNVTkc9eQorQ09ORklHX0hJRF9TT05ZPXkKK0NPTkZJR19ISURfU1VOUExVUz15CitDT05GSUdfVEhSVVNUTUFTVEVSX0ZGPW0KK0NPTkZJR19aRVJPUExVU19GRj1tCiBDT05GSUdfVVNCX1NVUFBPUlQ9eQogQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQogIyBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0kgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0FSQ0hfSEFTX0VIQ0kgaXMgbm90IHNldAogQ09ORklHX1VTQj15CiAjIENPTkZJR19VU0JfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FOTk9VTkNFX05FV19ERVZJQ0VTIGlzIG5vdCBzZXQKIAogIwogIyBNaXNjZWxsYW5lb3VzIFVTQiBvcHRpb25zCkBAIC0xMDgzLDE1ICsxMTM0LDIwIEBACiAjIENPTkZJR19VU0JfT1RHIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9PVEdfV0hJVEVMSVNUIGlzIG5vdCBzZXQKIENPTkZJR19VU0JfT1RHX0JMQUNLTElTVF9IVUI9eQorQ09ORklHX1VTQl9NT049eQorIyBDT05GSUdfVVNCX1dVU0IgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1dVU0JfQ0JBRiBpcyBub3Qgc2V0CiAKICMKICMgVVNCIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCiAjCisjIENPTkZJR19VU0JfQzY3WDAwX0hDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSVNQMTE2WF9IQ0QgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0lTUDEzNjJfSENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9JU1AxNzYwX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVNQMTM2Ml9IQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1NMODExX0hDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfUjhBNjY1OTdfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9IV0FfSENEIGlzIG5vdCBzZXQKIENPTkZJR19VU0JfTVVTQl9IRFJDPXkKIENPTkZJR19VU0JfTVVTQl9TT0M9eQogCkBAIC0xMTAzLDEzICsxMTU5LDE1IEBACiAjIENPTkZJR19VU0JfTVVTQl9PVEcgaXMgbm90IHNldAogQ09ORklHX1VTQl9NVVNCX0hEUkNfSENEPXkKIENPTkZJR19NVVNCX1BJT19PTkxZPXkKLUNPTkZJR19VU0JfTVVTQl9MT0dMRVZFTD0wCisjIENPTkZJR19VU0JfTVVTQl9ERUJVRyBpcyBub3Qgc2V0CiAKICMKICMgVVNCIERldmljZSBDbGFzcyBkcml2ZXJzCiAjCiAjIENPTkZJR19VU0JfQUNNIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9QUklOVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9XRE0gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RNQyBpcyBub3Qgc2V0CiAKICMKICMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JwpAQCAtMTEyNCwxNSArMTE4MiwxMCBAQAogIyBVU0IgSW1hZ2luZyBkZXZpY2VzCiAjCiAjIENPTkZJR19VU0JfTURDODAwIGlzIG5vdCBzZXQKLUNPTkZJR19VU0JfTU9OPXkKIAogIwogIyBVU0IgcG9ydCBkcml2ZXJzCiAjCi0KLSMKLSMgVVNCIFNlcmlhbCBDb252ZXJ0ZXIgc3VwcG9ydAotIwogIyBDT05GSUdfVVNCX1NFUklBTCBpcyBub3Qgc2V0CiAKICMKQEAgLTExNDEsNyArMTE5NCw3IEBACiAjIENPTkZJR19VU0JfRU1JNjIgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0VNSTI2IGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9BRFVUVVggaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0FVRVJTV0FMRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VWU0VHIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9SSU81MDAgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0xFR09UT1dFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfTENEIGlzIG5vdCBzZXQKQEAgLTExNTcsMTcgKzEyMTAsMTMgQEAKICMgQ09ORklHX1VTQl9MRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfVFJBTkNFVklCUkFUT1IgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lPV0FSUklPUiBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIERTTCBtb2RlbSBzdXBwb3J0Ci0jCi0KLSMKLSMgVVNCIEdhZGdldCBTdXBwb3J0Ci0jCisjIENPTkZJR19VU0JfSVNJR0hURlcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1ZTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKICMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisjIENPTkZJR19NRU1TVElDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CisjIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKIENPTkZJR19SVENfTElCPXkKIENPTkZJR19SVENfQ0xBU1M9eQogQ09ORklHX1JUQ19IQ1RPU1lTPXkKQEAgLTExOTYsNTEgKzEyNDUsNTcgQEAKICMgQ09ORklHX1JUQ19EUlZfUENGODU2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX1BDRjg1ODMgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9NNDFUODAgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9TMzUzOTBBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRk0zMTMwIGlzIG5vdCBzZXQKIAogIwogIyBTUEkgUlRDIGRyaXZlcnMKICMKLSMgQ09ORklHX1JUQ19EUlZfUlM1QzM0OCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000MVQ5NCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTMwNSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX01BWDY5MDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SOTcwMSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JTNUMzNDggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzMyMzQgaXMgbm90IHNldAogCiAjCiAjIFBsYXRmb3JtIFJUQyBkcml2ZXJzCiAjCisjIENPTkZJR19SVENfRFJWX0RTMTI4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTUxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVENfRFJWX1NUSzE3VEE4IGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfRFMxNzQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfU1RLMTdUQTggaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9NNDhUODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUMzUgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9NNDhUNTkgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9CUTQ4MDIgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9WMzAyMCBpcyBub3Qgc2V0CiAKICMKICMgb24tQ1BVIFJUQyBkcml2ZXJzCiAjCiBDT05GSUdfUlRDX0RSVl9CRklOPXkKLQotIwotIyBVc2Vyc3BhY2UgSS9PCi0jCisjIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFHSU5HIGlzIG5vdCBzZXQKIAogIwogIyBGaWxlIHN5c3RlbXMKICMKICMgQ09ORklHX0VYVDJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CitDT05GSUdfRklMRV9MT0NLSU5HPXkKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAogQ09ORklHX0lOT1RJRlk9eQogQ09ORklHX0lOT1RJRllfVVNFUj15CiAjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldApAQCAtMTI4MCwxMSArMTMzNSwxMSBAQAogIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ZQUZGU19GUz1tCiBDT05GSUdfWUFGRlNfWUFGRlMxPXkKKyMgQ09ORklHX1lBRkZTXzlCWVRFX1RBR1MgaXMgbm90IHNldAogIyBDT05GSUdfWUFGRlNfRE9FU19FQ0MgaXMgbm90IHNldAogQ09ORklHX1lBRkZTX1lBRkZTMj15CiBDT05GSUdfWUFGRlNfQVVUT19ZQUZGUzI9eQogIyBDT05GSUdfWUFGRlNfRElTQUJMRV9MQVpZX0xPQUQgaXMgbm90IHNldAotQ09ORklHX1lBRkZTX0NIRUNLUE9JTlRfUkVTRVJWRURfQkxPQ0tTPTEwCiAjIENPTkZJR19ZQUZGU19ESVNBQkxFX1dJREVfVE5PREVTIGlzIG5vdCBzZXQKICMgQ09ORklHX1lBRkZTX0FMV0FZU19DSEVDS19DSFVOS19FUkFTRUQgaXMgbm90IHNldAogQ09ORklHX1lBRkZTX1NIT1JUX05BTUVTX0lOX1JBTT15CkBAIC0xMzAxLDggKzEzNTYsMTEgQEAKICMgQ09ORklHX0pGRlMyX1JVQklOIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAogQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQpAQCAtMTMxMCwxMyArMTM2OCwxMiBAQAogQ09ORklHX05GU19WMz15CiAjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAogIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CiBDT05GSUdfTE9DS0Q9bQogQ09ORklHX0xPQ0tEX1Y0PXkKIENPTkZJR19ORlNfQ09NTU9OPXkKIENPTkZJR19TVU5SUEM9bQotIyBDT05GSUdfU1VOUlBDX0JJTkQzNCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5SUENfUkVHSVNURVJfVjQgaXMgbm90IHNldAogIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKICMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAogQ09ORklHX1NNQl9GUz1tCkBAIC0xMzcyLDkgKzE0MjksNiBAQAogIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0CiAjIENPTkZJR19OTFNfVVRGOCBpcyBub3Qgc2V0CiAjIENPTkZJR19ETE0gaXMgbm90IHNldAotQ09ORklHX0lOU1RSVU1FTlRBVElPTj15Ci0jIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAotIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiAKICMKICMgS2VybmVsIGhhY2tpbmcKQEAgLTEzODIsMTQgKzE0MzYsNTMgQEAKICMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKIENPTkZJR19FTkFCTEVfV0FSTl9ERVBSRUNBVEVEPXkKIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CitDT05GSUdfRlJBTUVfV0FSTj0xMDI0CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfRlM9eQogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CisjIENPTkZJR19ERUJVR19TSElSUSBpcyBub3Qgc2V0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUMgaXMgbm90IHNldAorQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDX1ZBTFVFPTAKK0NPTkZJR19TQ0hFRF9ERUJVRz15CisjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJTUVSX1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX09CSkVDVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0lORk89eQorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfV1JJVEVDT1VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NRU1PUllfSU5JVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZSQU1FX1BPSU5URVIgaXMgbm90IHNldAorIyBDT05GSUdfQk9PVF9QUklOVEtfREVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQkxPQ0tfRVhUX0RFVlQgaXMgbm90IHNldAorIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RZTkFNSUNfUFJJTlRLX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKKyMgQ09ORklHX0tHREIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfVkVSQk9TRT15CiBDT05GSUdfREVCVUdfTU1SUz15CisjIENPTkZJR19ERUJVR19IV0VSUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ET1VCTEVGQVVMVCBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfSFVOVF9GT1JfWkVSTz15CiBDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX09OPXkKIENPTkZJR19ERUJVR19CRklOX0hXVFJBQ0VfQ09NUFJFU1NJT05fT0ZGPXkKQEAgLTE0MDcsMTAgKzE1MDAsOTUgQEAKICMKICMgQ09ORklHX0tFWVMgaXMgbm90IHNldAogQ09ORklHX1NFQ1VSSVRZPXkKKyMgQ09ORklHX1NFQ1VSSVRZRlMgaXMgbm90IHNldAogIyBDT05GSUdfU0VDVVJJVFlfTkVUV09SSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRUNVUklUWV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlfRklMRV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAogIyBDT05GSUdfU0VDVVJJVFlfUk9PVFBMVUcgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKK0NPTkZJR19TRUNVUklUWV9ERUZBVUxUX01NQVBfTUlOX0FERFI9MAorQ09ORklHX0NSWVBUTz15CisKKyMKKyMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCisjCisjIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUFOQUdFUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NSWVBURCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVVUSEVOQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgQXV0aGVudGljYXRlZCBFbmNyeXB0aW9uIHdpdGggQXNzb2NpYXRlZCBEYXRhCisjCisjIENPTkZJR19DUllQVE9fQ0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUUlWIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBtb2RlcworIworIyBDT05GSUdfQ1JZUFRPX0NCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1RSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DVFMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0VDQiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTFJXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19QQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19YVFMgaXMgbm90IHNldAorCisjCisjIEhhc2ggbW9kZXMKKyMKKyMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKKworIworIyBEaWdlc3QKKyMKKyMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxNjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMzIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19XUDUxMiBpcyBub3Qgc2V0CisKKyMKKyMgQ2lwaGVycworIworIyBDT05GSUdfQ1JZUFRPX0FFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQU5VQklTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BUkM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FNRUxMSUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fREVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19GQ1JZUFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0tIQVpBRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0FMU0EyMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VFRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UV09GSVNIIGlzIG5vdCBzZXQKKworIworIyBDb21wcmVzc2lvbgorIworIyBDT05GSUdfQ1JZUFRPX0RFRkxBVEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0xaTyBpcyBub3Qgc2V0CisKKyMKKyMgUmFuZG9tIE51bWJlciBHZW5lcmF0aW9uCisjCisjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0hXPXkKIAogIwogIyBMaWJyYXJ5IHJvdXRpbmVzCkBAIC0xNDE4LDYgKzE1OTYsNyBAQAogQ09ORklHX0JJVFJFVkVSU0U9eQogQ09ORklHX0NSQ19DQ0lUVD1tCiAjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfVDEwRElGIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDMzI9eQogIyBDT05GSUdfQ1JDNyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MzMtRVpLSVRfZGVmY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTMzLUVaS0lUX2RlZmNvbmZpZwppbmRleCBkZWViNWU0Li45MmFmZDk4IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MzMtRVpLSVRfZGVmY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUzMy1FWktJVF9kZWZjb25maWcKQEAgLTEsNiArMSw2IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjQuNworIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI4LXJjMgogIwogIyBDT05GSUdfTU1VIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZQVSBpcyBub3Qgc2V0CkBAIC04LDcgKzgsNiBAQAogIyBDT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE0gaXMgbm90IHNldAogQ09ORklHX0JMQUNLRklOPXkKIENPTkZJR19aT05FX0RNQT15Ci1DT05GSUdfU0VNQVBIT1JFX1NMRUVQRVJTPXkKIENPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQogQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CkBAIC0zMSwxOCArMzAsMTYgQEAKICMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CiAjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0VSX05TIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BJRF9OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CiBDT05GSUdfSUtDT05GSUc9eQogQ09ORklHX0lLQ09ORklHX1BST0M9eQogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKICMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAotQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQ9eQotQ09ORklHX0ZBSVJfVVNFUl9TQ0hFRD15Ci0jIENPTkZJR19GQUlSX0NHUk9VUF9TQ0hFRCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CisjIENPTkZJR19HUk9VUF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNGU19ERVBSRUNBVEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjIgaXMgbm90IHNldAogIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfTkFNRVNQQUNFUyBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQogQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKICMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKQEAgLTUxLDI2ICs0OCwzNSBAQAogQ09ORklHX1VJRDE2PXkKIENPTkZJR19TWVNDVExfU1lTQ0FMTD15CiBDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAogQ09ORklHX0hPVFBMVUc9eQogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKLUNPTkZJR19FTEZfQ09SRT15CisjIENPTkZJR19FTEZfQ09SRSBpcyBub3Qgc2V0CitDT05GSUdfQ09NUEFUX0JSSz15CiBDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15CiBDT05GSUdfQU5PTl9JTk9ERVM9eQogQ09ORklHX0VQT0xMPXkKIENPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CiBDT05GSUdfRVZFTlRGRD15CitDT05GSUdfQUlPPXkKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CiBDT05GSUdfU0xBQj15CiAjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfT1BST0ZJTEU9eQorIyBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVCBpcyBub3Qgc2V0CiBDT05GSUdfU0xBQklORk89eQogQ09ORklHX1JUX01VVEVYRVM9eQogQ09ORklHX1RJTllfU0hNRU09eQogQ09ORklHX0JBU0VfU01BTEw9MAogQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQgaXMgbm90IHNldAogQ09ORklHX01PRFVMRV9VTkxPQUQ9eQogIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CiAjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CkBAIC04MSw2ICs4Nyw3IEBACiAjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0xTRiBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CiAKICMKICMgSU8gU2NoZWR1bGVycwpAQCAtOTQsOSArMTAxLDExIEBACiAjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAogQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iYW50aWNpcGF0b3J5IgorQ09ORklHX0NMQVNTSUNfUkNVPXkKICMgQ09ORklHX1BSRUVNUFRfTk9ORSBpcyBub3Qgc2V0CiBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlk9eQogIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CitDT05GSUdfRlJFRVpFUj15CiAKICMKICMgQmxhY2tmaW4gUHJvY2Vzc29yIE9wdGlvbnMKQEAgLTEwNSw2ICsxMTQsMTAgQEAKICMKICMgUHJvY2Vzc29yIGFuZCBCb2FyZCBTZXR0aW5ncwogIworIyBDT05GSUdfQkY1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MTQgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MTYgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MTggaXMgbm90IHNldAogIyBDT05GSUdfQkY1MjIgaXMgbm90IHNldAogIyBDT05GSUdfQkY1MjMgaXMgbm90IHNldAogIyBDT05GSUdfQkY1MjQgaXMgbm90IHNldApAQCAtMTE3LDI0ICsxMzAsMzAgQEAKICMgQ09ORklHX0JGNTM0IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTM2IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTM4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTM5IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTQyIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTQ0IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTQ3IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTQ4IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTQ5IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTYxIGlzIG5vdCBzZXQKK0NPTkZJR19CRl9SRVZfTUlOPTMKK0NPTkZJR19CRl9SRVZfTUFYPTYKICMgQ09ORklHX0JGX1JFVl8wXzAgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWXzBfMSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfMF8yIGlzIG5vdCBzZXQKIENPTkZJR19CRl9SRVZfMF8zPXkKICMgQ09ORklHX0JGX1JFVl8wXzQgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWXzBfNSBpcyBub3Qgc2V0CisjIENPTkZJR19CRl9SRVZfMF82IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl9BTlkgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWX05PTkUgaXMgbm90IHNldAogQ09ORklHX0JGNTN4PXkKIENPTkZJR19NRU1fTVQ0OExDMTZNMTZBMlRHXzc1PXkKIENPTkZJR19CRklONTMzX0VaS0lUPXkKICMgQ09ORklHX0JGSU41MzNfU1RBTVAgaXMgbm90IHNldAorIyBDT05GSUdfQkxBQ0tTVEFNUCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRklONTMzX0JMVUVURUNITklYX0NNIGlzIG5vdCBzZXQKICMgQ09ORklHX0g4NjA2X0hWU0lTVEVNQVMgaXMgbm90IHNldAogIyBDT05GSUdfQkZJTjUzMl9JUDBYIGlzIG5vdCBzZXQKQEAgLTE4Nyw3ICsyMDYsNiBAQAogIwogQ09ORklHX0NMS0lOX0haPTI3MDAwMDAwCiAjIENPTkZJR19CRklOX0tFUk5FTF9DTE9DSyBpcyBub3Qgc2V0Ci1DT05GSUdfTUFYX01FTV9TSVpFPTUxMgogQ09ORklHX01BWF9WQ09fSFo9NzUwMDAwMDAwCiBDT05GSUdfTUlOX1ZDT19IWj01MDAwMDAwMAogQ09ORklHX01BWF9TQ0xLX0haPTEzMzMzMzMzMwpAQCAtMjAxLDYgKzIxOSw3IEBACiAjIENPTkZJR19IWl8zMDAgaXMgbm90IHNldAogIyBDT05GSUdfSFpfMTAwMCBpcyBub3Qgc2V0CiBDT05GSUdfSFo9MjUwCitDT05GSUdfU0NIRURfSFJUSUNLPXkKIENPTkZJR19HRU5FUklDX1RJTUU9eQogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQogIyBDT05GSUdfQ1lDTEVTX0NMT0NLU09VUkNFIGlzIG5vdCBzZXQKQEAgLTIzOCw2ICsyNTcsMTIgQEAKIENPTkZJR19DQUNIRUxJTkVfQUxJR05FRF9MMT15CiAjIENPTkZJR19TWVNDQUxMX1RBQl9MMSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUExCX1NXSVRDSF9UQUJfTDEgaXMgbm90IHNldAorQ09ORklHX0FQUF9TVEFDS19MMT15CisKKyMKKyMgU3BlZWQgT3B0aW1pemF0aW9ucworIworQ09ORklHX0JGSU5fSU5TX0xPV09WRVJIRUFEPXkKIENPTkZJR19SQU1LRVJORUw9eQogIyBDT05GSUdfUk9NS0VSTkVMIGlzIG5vdCBzZXQKIENPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKQEAgLTI0NiwxNCArMjcxLDEzIEBACiAjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKIENPTkZJR19GTEFUTUVNPXkKIENPTkZJR19GTEFUX05PREVfTUVNX01BUD15Ci0jIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQQVJTRU1FTV9WTUVNTUFQX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfUEFHRUZMQUdTX0VYVEVOREVEPXkKIENPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CiAjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAorIyBDT05GSUdfUEhZU19BRERSX1RfNjRCSVQgaXMgbm90IHNldAogQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQogQ09ORklHX1ZJUlRfVE9fQlVTPXkKICMgQ09ORklHX0JGSU5fR1BUSU1FUlMgaXMgbm90IHNldAotQ09ORklHX0JGSU5fRE1BXzVYWD15CiAjIENPTkZJR19ETUFfVU5DQUNIRURfNE0gaXMgbm90IHNldAogIyBDT05GSUdfRE1BX1VOQ0FDSEVEXzJNIGlzIG5vdCBzZXQKIENPTkZJR19ETUFfVU5DQUNIRURfMU09eQpAQCAtMjY4LDcgKzI5Miw2IEBACiAjIENPTkZJR19CRklOX0lDQUNIRV9MT0NLIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGSU5fV0IgaXMgbm90IHNldAogQ09ORklHX0JGSU5fV1Q9eQotQ09ORklHX0wxX01BWF9QSUVDRT0xNgogIyBDT05GSUdfTVBVIGlzIG5vdCBzZXQKIAogIwpAQCAtMjk3LDcgKzMyMCw2IEBACiAjCiAjIEJ1cyBvcHRpb25zIChQQ0ksIFBDTUNJQSwgRUlTQSwgTUNBLCBJU0EpCiAjCi0jIENPTkZJR19QQ0kgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAogIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKIApAQCAtMzA4LDI5ICszMzAsMzAgQEAKIENPTkZJR19CSU5GTVRfRkxBVD15CiBDT05GSUdfQklORk1UX1pGTEFUPXkKICMgQ09ORklHX0JJTkZNVF9TSEFSRURfRkxBVCBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0FPVVQgaXMgbm90IHNldAogIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAogCiAjCiAjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucwogIwogQ09ORklHX1BNPXkKLSMgQ09ORklHX1BNX0xFR0FDWSBpcyBub3Qgc2V0CiAjIENPTkZJR19QTV9ERUJVRyBpcyBub3Qgc2V0CiBDT05GSUdfUE1fU0xFRVA9eQotQ09ORklHX1NVU1BFTkRfVVBfUE9TU0lCTEU9eQogQ09ORklHX1NVU1BFTkQ9eQorQ09ORklHX1NVU1BFTkRfRlJFRVpFUj15CitDT05GSUdfQVJDSF9TVVNQRU5EX1BPU1NJQkxFPXkKIENPTkZJR19QTV9CRklOX1NMRUVQX0RFRVBFUj15CiAjIENPTkZJR19QTV9CRklOX1NMRUVQIGlzIG5vdCBzZXQKICMgQ09ORklHX1BNX1dBS0VVUF9CWV9HUElPIGlzIG5vdCBzZXQKIAogIworIyBQb3NzaWJsZSBTdXNwZW5kIE1lbSAvIEhpYmVybmF0ZSBXYWtlLVVwIFNvdXJjZXMKKyMKKworIwogIyBDUFUgRnJlcXVlbmN5IHNjYWxpbmcKICMKICMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JraW5nCi0jCiBDT05GSUdfTkVUPXkKIAogIwpAQCAtMzQzLDYgKzM2Niw3IEBACiAjIENPTkZJR19YRlJNX1VTRVIgaXMgbm90IHNldAogIyBDT05GSUdfWEZSTV9TVUJfUE9MSUNZIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGUk1fTUlHUkFURSBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NUQVRJU1RJQ1MgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVD15CiAjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldApAQCAtMzcyLDggKzM5Niw2IEBACiBDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCiAjIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVDZfWEZSTV9UVU5ORUwgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVDZfVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVExBQkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldApAQCAtMzgyLDYgKzQwNCw3IEBACiAjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CiAjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RTQSBpcyBub3Qgc2V0CiAjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CiAjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKQEAgLTM5OCw2ICs0MjEsNyBAQAogIwogIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CiAjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19DQU4gaXMgbm90IHNldAogQ09ORklHX0lSREE9bQogCiAjCkBAIC00MzAsMjQgKzQ1NCwxNCBAQAogIyBDT05GSUdfRE9OR0xFIGlzIG5vdCBzZXQKIAogIwotIyBPbGQgU0lSIGRldmljZSBkcml2ZXJzCi0jCi0jIENPTkZJR19JUlBPUlRfU0lSIGlzIG5vdCBzZXQKLQotIwotIyBPbGQgU2VyaWFsIGRvbmdsZSBzdXBwb3J0Ci0jCi0KLSMKICMgRklSIGRldmljZSBkcml2ZXJzCiAjCiAjIENPTkZJR19CVCBpcyBub3Qgc2V0CiAjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MKLSMKKyMgQ09ORklHX1BIT05FVCBpcyBub3Qgc2V0CitDT05GSUdfV0lSRUxFU1M9eQogIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorQ09ORklHX1dJUkVMRVNTX09MRF9SRUdVTEFUT1JZPXkKICMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldApAQCAtNDY1LDYgKzQ3OSw4IEBACiBDT05GSUdfU1RBTkRBTE9ORT15CiBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CiAjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RFVlJFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAogQ09ORklHX01URD15CkBAIC00NzMsNiArNDg5LDcgQEAKIENPTkZJR19NVERfUEFSVElUSU9OUz15CiAjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfQ01ETElORV9QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQVI3X1BBUlRTIGlzIG5vdCBzZXQKIAogIwogIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycwpAQCAtNTE2LDYgKzUzMyw3IEBACiAjCiBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1M9eQogIyBDT05GSUdfTVREX1BIWVNNQVAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0dQSU9fQUREUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfVUNMSU5VWCBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CiAKQEAgLTU1MCwxMSArNTY4LDE0IEBACiBDT05GSUdfQkxLX0RFVl9SQU09eQogQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CiBDT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2Ci1DT05GSUdfQkxLX0RFVl9SQU1fQkxPQ0tTSVpFPTEwMjQKKyMgQ09ORklHX0JMS19ERVZfWElQIGlzIG5vdCBzZXQKICMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAogIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAogQ09ORklHX01JU0NfREVWSUNFUz15CiAjIENPTkZJR19FRVBST01fOTNDWDYgaXMgbm90IHNldAorIyBDT05GSUdfRU5DTE9TVVJFX1NFUlZJQ0VTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0lERT15CiAjIENPTkZJR19JREUgaXMgbm90IHNldAogCiAjCkBAIC01NjcsNyArNTg4LDYgQEAKICMgQ09ORklHX0FUQSBpcyBub3Qgc2V0CiAjIENPTkZJR19NRCBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWSUNFUz15Ci0jIENPTkZJR19ORVRERVZJQ0VTX01VTFRJUVVFVUUgaXMgbm90IHNldAogIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNWTEFOIGlzIG5vdCBzZXQKQEAgLTU4MCwxMSArNjAwLDE0IEBACiBDT05GSUdfU01DOTFYPXkKICMgQ09ORklHX1NNU0M5MTFYIGlzIG5vdCBzZXQKICMgQ09ORklHX0RNOTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FTkMyOEo2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19JQk1fTkVXX0VNQUNfWk1JSSBpcyBub3Qgc2V0CiAjIENPTkZJR19JQk1fTkVXX0VNQUNfUkdNSUkgaXMgbm90IHNldAogIyBDT05GSUdfSUJNX05FV19FTUFDX1RBSCBpcyBub3Qgc2V0CiAjIENPTkZJR19JQk1fTkVXX0VNQUNfRU1BQzQgaXMgbm90IHNldAotIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19OT19GTE9XX0NUUkwgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DTFJfSUNJTlRTVEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19NQUxfQ09NTU9OX0VSUiBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWXzEwMDA9eQogIyBDT05GSUdfQVg4ODE4MCBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWXzEwMDAwPXkKQEAgLTU5NCwxMCArNjE3LDEwIEBACiAjCiAjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfSVdMV0lGSV9MRURTIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUFAgaXMgbm90IHNldAogIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAogIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldApAQCAtNjQ1LDggKzY2OCwxMSBAQAogIyBDT05GSUdfQkY1eHhfUFBJIGlzIG5vdCBzZXQKIENPTkZJR19CRklOX1NQT1JUPXkKICMgQ09ORklHX0JGSU5fVElNRVJfTEFURU5DWSBpcyBub3Qgc2V0CitDT05GSUdfQkZJTl9ETUFfSU5URVJGQUNFPW0KIENPTkZJR19TSU1QTEVfR1BJTz1tCiAjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZLTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGSU5fSlRBR19DT01NIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CiAKICMKQEAgLTY3NSwyMiArNzAxLDE5IEBACiAjIENPTkZJR19DQU40TElOVVggaXMgbm90IHNldAogIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKICMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKICMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkMgaXMgbm90IHNldAotCi0jCi0jIFNQSSBzdXBwb3J0Ci0jCiBDT05GSUdfU1BJPXkKKyMgQ09ORklHX1NQSV9ERUJVRyBpcyBub3Qgc2V0CiBDT05GSUdfU1BJX01BU1RFUj15CiAKICMKICMgU1BJIE1hc3RlciBDb250cm9sbGVyIERyaXZlcnMKICMKIENPTkZJR19TUElfQkZJTj15CisjIENPTkZJR19TUElfQkZJTl9MT0NLIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQSV9CSVRCQU5HIGlzIG5vdCBzZXQKIAogIwpAQCAtNjk5LDE0ICs3MjIsMTggQEAKICMgQ09ORklHX1NQSV9BVDI1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NQSV9TUElERVYgaXMgbm90IHNldAogIyBDT05GSUdfU1BJX1RMRTYyWDAgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCPXkKKyMgQ09ORklHX0dQSU9MSUIgaXMgbm90IHNldAogIyBDT05GSUdfVzEgaXMgbm90IHNldAogIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKIENPTkZJR19IV01PTj15CiAjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRENYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0Y3MTgwNUYgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GNzE4ODJGRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0lUODcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19MTTcwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYMTExMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQzg3NDI3IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldApAQCAtNzE1LDYgKzc0Miw4IEBACiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKIENPTkZJR19XQVRDSERPRz15CiAjIENPTkZJR19XQVRDSERPR19OT1dBWU9VVCBpcyBub3Qgc2V0CiAKQEAgLTcyNSwyMSArNzU0LDI4IEBACiBDT05GSUdfQkZJTl9XRFQ9eQogCiAjCi0jIFNvbmljcyBTaWxpY29uIEJhY2twbGFuZQotIwotQ09ORklHX1NTQl9QT1NTSUJMRT15Ci0jIENPTkZJR19TU0IgaXMgbm90IHNldAotCi0jCiAjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKICMKKyMgQ09ORklHX01GRF9DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTg0MDAgaXMgbm90IHNldAogCiAjCiAjIE11bHRpbWVkaWEgZGV2aWNlcwogIworCisjCisjIE11bHRpbWVkaWEgY29yZSBzdXBwb3J0CisjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAogIyBDT05GSUdfRFZCX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fTUVESUEgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZHJpdmVycworIwogIyBDT05GSUdfREFCIGlzIG5vdCBzZXQKIAogIwpAQCAtNzU0LDE4ICs3OTAsMjIgQEAKICMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAogIwogIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBTb3VuZAotIwogIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAogQ09ORklHX0hJRF9TVVBQT1JUPXkKIENPTkZJR19ISUQ9bQogIyBDT05GSUdfSElEX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJRFJBVyBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfUElEIGlzIG5vdCBzZXQKKworIworIyBTcGVjaWFsIEhJRCBkcml2ZXJzCisjCitDT05GSUdfSElEX0NPTVBBVD15CiAjIENPTkZJR19VU0JfU1VQUE9SVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NTUMgaXMgbm90IHNldAorIyBDT05GSUdfTUVNU1RJQ0sgaXMgbm90IHNldAogIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAorIyBDT05GSUdfQUNDRVNTSUJJTElUWSBpcyBub3Qgc2V0CiBDT05GSUdfUlRDX0xJQj15CiBDT05GSUdfUlRDX0NMQVNTPXkKIENPTkZJR19SVENfSENUT1NZUz15CkBAIC03ODQsNDcgKzgyNCw1MSBAQAogIwogIyBTUEkgUlRDIGRyaXZlcnMKICMKLSMgQ09ORklHX1JUQ19EUlZfUlM1QzM0OCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000MVQ5NCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTMwNSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX01BWDY5MDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SOTcwMSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JTNUMzNDggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzMyMzQgaXMgbm90IHNldAogCiAjCiAjIFBsYXRmb3JtIFJUQyBkcml2ZXJzCiAjCisjIENPTkZJR19SVENfRFJWX0RTMTI4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTUxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVENfRFJWX1NUSzE3VEE4IGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfRFMxNzQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfU1RLMTdUQTggaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9NNDhUODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUMzUgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9NNDhUNTkgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9CUTQ4MDIgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9WMzAyMCBpcyBub3Qgc2V0CiAKICMKICMgb24tQ1BVIFJUQyBkcml2ZXJzCiAjCiBDT05GSUdfUlRDX0RSVl9CRklOPXkKLQotIwotIyBVc2Vyc3BhY2UgSS9PCi0jCisjIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFHSU5HIGlzIG5vdCBzZXQKIAogIwogIyBGaWxlIHN5c3RlbXMKICMKICMgQ09ORklHX0VYVDJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CitDT05GSUdfRklMRV9MT0NLSU5HPXkKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAogQ09ORklHX0lOT1RJRlk9eQogQ09ORklHX0lOT1RJRllfVVNFUj15CiAjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldApAQCAtODY0LDExICs5MDgsMTEgQEAKICMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CiBDT05GSUdfWUFGRlNfRlM9bQogQ09ORklHX1lBRkZTX1lBRkZTMT15CisjIENPTkZJR19ZQUZGU185QllURV9UQUdTIGlzIG5vdCBzZXQKICMgQ09ORklHX1lBRkZTX0RPRVNfRUNDIGlzIG5vdCBzZXQKIENPTkZJR19ZQUZGU19ZQUZGUzI9eQogQ09ORklHX1lBRkZTX0FVVE9fWUFGRlMyPXkKICMgQ09ORklHX1lBRkZTX0RJU0FCTEVfTEFaWV9MT0FEIGlzIG5vdCBzZXQKLUNPTkZJR19ZQUZGU19DSEVDS1BPSU5UX1JFU0VSVkVEX0JMT0NLUz0xMAogIyBDT05GSUdfWUFGRlNfRElTQUJMRV9XSURFX1ROT0RFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ZQUZGU19BTFdBWVNfQ0hFQ0tfQ0hVTktfRVJBU0VEIGlzIG5vdCBzZXQKIENPTkZJR19ZQUZGU19TSE9SVF9OQU1FU19JTl9SQU09eQpAQCAtODg1LDggKzkyOSwxMSBAQAogIyBDT05GSUdfSkZGUzJfUlVCSU4gaXMgbm90IHNldAogIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CkBAIC04OTQsMTMgKzk0MSwxMiBAQAogQ09ORklHX05GU19WMz15CiAjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAogIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CiBDT05GSUdfTE9DS0Q9bQogQ09ORklHX0xPQ0tEX1Y0PXkKIENPTkZJR19ORlNfQ09NTU9OPXkKIENPTkZJR19TVU5SUEM9bQotIyBDT05GSUdfU1VOUlBDX0JJTkQzNCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5SUENfUkVHSVNURVJfVjQgaXMgbm90IHNldAogIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKICMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAogQ09ORklHX1NNQl9GUz1tCkBAIC05NTYsOSArMTAwMiw2IEBACiAjIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKICMgQ09ORklHX05MU19VVEY4IGlzIG5vdCBzZXQKICMgQ09ORklHX0RMTSBpcyBub3Qgc2V0Ci1DT05GSUdfSU5TVFJVTUVOVEFUSU9OPXkKLSMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKIAogIwogIyBLZXJuZWwgaGFja2luZwpAQCAtOTY2LDE0ICsxMDA5LDUzIEBACiAjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CiBDT05GSUdfRU5BQkxFX1dBUk5fREVQUkVDQVRFRD15CiBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQorQ09ORklHX0ZSQU1FX1dBUk49MTAyNAogIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0ZTPXkKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19LRVJORUw9eQorIyBDT05GSUdfREVCVUdfU0hJUlEgaXMgbm90IHNldAorQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQPXkKKyMgQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDIGlzIG5vdCBzZXQKK0NPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQ19WQUxVRT0wCitDT05GSUdfU0NIRURfREVCVUc9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19PQkpFQ1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUlRfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19SVF9NVVRFWF9URVNURVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19JTkZPPXkKKyMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1dSSVRFQ09VTlQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTUVNT1JZX0lOSVQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TRyBpcyBub3Qgc2V0CisjIENPTkZJR19GUkFNRV9QT0lOVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPT1RfUFJJTlRLX0RFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLVFJBQ0VfU0VMRl9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0JMT0NLX0VYVF9ERVZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSyBpcyBub3Qgc2V0CisjIENPTkZJR19EWU5BTUlDX1BSSU5US19ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0FSQ0hfS0dEQj15CisjIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NUQUNLT1ZFUkZMT1cgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX1ZFUkJPU0U9eQogQ09ORklHX0RFQlVHX01NUlM9eQorIyBDT05GSUdfREVCVUdfSFdFUlIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRE9VQkxFRkFVTFQgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0hVTlRfRk9SX1pFUk89eQogQ09ORklHX0RFQlVHX0JGSU5fSFdUUkFDRV9PTj15CiBDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX0NPTVBSRVNTSU9OX09GRj15CkBAIC05OTEsOSArMTA3Myw5NCBAQAogIwogIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CiBDT05GSUdfU0VDVVJJVFk9eQorIyBDT05GSUdfU0VDVVJJVFlGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRUNVUklUWV9ORVRXT1JLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFQ1VSSVRZX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE8gaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlfRklMRV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAorQ09ORklHX1NFQ1VSSVRZX0RFRkFVTFRfTU1BUF9NSU5fQUREUj0wCitDT05GSUdfQ1JZUFRPPXkKKworIworIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKKyMKKyMgQ09ORklHX0NSWVBUT19GSVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NQU5BR0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HRjEyOE1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1JZUFREIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BVVRIRU5DIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKKworIworIyBBdXRoZW50aWNhdGVkIEVuY3J5cHRpb24gd2l0aCBBc3NvY2lhdGVkIERhdGEKKyMKKyMgQ09ORklHX0NSWVBUT19DQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dDTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VRSVYgaXMgbm90IHNldAorCisjCisjIEJsb2NrIG1vZGVzCisjCisjIENPTkZJR19DUllQVE9fQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DVFIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NUUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fRUNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19MUlcgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1BDQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1hUUyBpcyBub3Qgc2V0CisKKyMKKyMgSGFzaCBtb2RlcworIworIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAorCisjCisjIERpZ2VzdAorIworIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxMjggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDE2MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQzMjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKKworIworIyBDaXBoZXJzCisjCisjIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FSQzQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19ERVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0ZDUllQVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TQUxTQTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRUVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVJQRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldAorCisjCisjIENvbXByZXNzaW9uCisjCisjIENPTkZJR19DUllQVE9fREVGTEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTFpPIGlzIG5vdCBzZXQKKworIworIyBSYW5kb20gTnVtYmVyIEdlbmVyYXRpb24KKyMKKyMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fSFc9eQogCiAjCiAjIExpYnJhcnkgcm91dGluZXMKQEAgLTEwMDEsNiArMTE2OCw3IEBACiBDT05GSUdfQklUUkVWRVJTRT15CiBDT05GSUdfQ1JDX0NDSVRUPW0KICMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19UMTBESUYgaXMgbm90IHNldAogIyBDT05GSUdfQ1JDX0lUVV9UIGlzIG5vdCBzZXQKIENPTkZJR19DUkMzMj15CiAjIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUzMy1TVEFNUF9kZWZjb25maWcgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MzMtU1RBTVBfZGVmY29uZmlnCmluZGV4IGMyMzI2N2UuLjQ5ZWFiYjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUzMy1TVEFNUF9kZWZjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTMzLVNUQU1QX2RlZmNvbmZpZwpAQCAtMSw2ICsxLDYgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yNC43CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjgtcmMyCiAjCiAjIENPTkZJR19NTVUgaXMgbm90IHNldAogIyBDT05GSUdfRlBVIGlzIG5vdCBzZXQKQEAgLTgsNyArOCw2IEBACiAjIENPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITSBpcyBub3Qgc2V0CiBDT05GSUdfQkxBQ0tGSU49eQogQ09ORklHX1pPTkVfRE1BPXkKLUNPTkZJR19TRU1BUEhPUkVfU0xFRVBFUlM9eQogQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CiBDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKQEAgLTMxLDE4ICszMCwxNiBAQAogIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAogIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTRVJfTlMgaXMgbm90IHNldAotIyBDT05GSUdfUElEX05TIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKIENPTkZJR19JS0NPTkZJRz15CiBDT05GSUdfSUtDT05GSUdfUFJPQz15CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogIyBDT05GSUdfQ0dST1VQUyBpcyBub3Qgc2V0Ci1DT05GSUdfRkFJUl9HUk9VUF9TQ0hFRD15Ci1DT05GSUdfRkFJUl9VU0VSX1NDSEVEPXkKLSMgQ09ORklHX0ZBSVJfQ0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKKyMgQ09ORklHX0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQgaXMgbm90IHNldAorIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMiBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19OQU1FU1BBQ0VTIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CiBDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgogIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldApAQCAtNTEsMjYgKzQ4LDM1IEBACiBDT05GSUdfVUlEMTY9eQogQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKIENPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAogIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CiBDT05GSUdfSE9UUExVRz15CiBDT05GSUdfUFJJTlRLPXkKIENPTkZJR19CVUc9eQotQ09ORklHX0VMRl9DT1JFPXkKKyMgQ09ORklHX0VMRl9DT1JFIGlzIG5vdCBzZXQKK0NPTkZJR19DT01QQVRfQlJLPXkKIENPTkZJR19CQVNFX0ZVTEw9eQogQ09ORklHX0ZVVEVYPXkKIENPTkZJR19BTk9OX0lOT0RFUz15CiBDT05GSUdfRVBPTEw9eQogQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKIENPTkZJR19FVkVOVEZEPXkKK0NPTkZJR19BSU89eQogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKIENPTkZJR19TTEFCPXkKICMgQ09ORklHX1NMVUIgaXMgbm90IHNldAogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9PUFJPRklMRT15CisjIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UIGlzIG5vdCBzZXQKIENPTkZJR19TTEFCSU5GTz15CiBDT05GSUdfUlRfTVVURVhFUz15CiBDT05GSUdfVElOWV9TSE1FTT15CiBDT05GSUdfQkFTRV9TTUFMTD0wCiBDT05GSUdfTU9EVUxFUz15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfTE9BRCBpcyBub3Qgc2V0CiBDT05GSUdfTU9EVUxFX1VOTE9BRD15CiAjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKICMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKQEAgLTgxLDYgKzg3LDcgQEAKICMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIAogIwogIyBJTyBTY2hlZHVsZXJzCkBAIC05NCw5ICsxMDEsMTEgQEAKICMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0CiBDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJhbnRpY2lwYXRvcnkiCitDT05GSUdfQ0xBU1NJQ19SQ1U9eQogIyBDT05GSUdfUFJFRU1QVF9OT05FIGlzIG5vdCBzZXQKIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT15CiAjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKK0NPTkZJR19GUkVFWkVSPXkKIAogIwogIyBCbGFja2ZpbiBQcm9jZXNzb3IgT3B0aW9ucwpAQCAtMTA1LDYgKzExNCwxMCBAQAogIwogIyBQcm9jZXNzb3IgYW5kIEJvYXJkIFNldHRpbmdzCiAjCisjIENPTkZJR19CRjUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUxNCBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUxNiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUxOCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUyMiBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUyMyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUyNCBpcyBub3Qgc2V0CkBAIC0xMTcsMjQgKzEzMCwzMCBAQAogIyBDT05GSUdfQkY1MzQgaXMgbm90IHNldAogIyBDT05GSUdfQkY1MzYgaXMgbm90IHNldAogIyBDT05GSUdfQkY1MzcgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MzggaXMgbm90IHNldAorIyBDT05GSUdfQkY1MzkgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDIgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDQgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDcgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDggaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDkgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NjEgaXMgbm90IHNldAorQ09ORklHX0JGX1JFVl9NSU49MworQ09ORklHX0JGX1JFVl9NQVg9NgogIyBDT05GSUdfQkZfUkVWXzBfMCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfMF8xIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl8wXzIgaXMgbm90IHNldAogQ09ORklHX0JGX1JFVl8wXzM9eQogIyBDT05GSUdfQkZfUkVWXzBfNCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfMF81IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGX1JFVl8wXzYgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWX0FOWSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfTk9ORSBpcyBub3Qgc2V0CiBDT05GSUdfQkY1M3g9eQogQ09ORklHX01FTV9NVDQ4TEM2NE00QTJGQl83RT15CiAjIENPTkZJR19CRklONTMzX0VaS0lUIGlzIG5vdCBzZXQKIENPTkZJR19CRklONTMzX1NUQU1QPXkKKyMgQ09ORklHX0JMQUNLU1RBTVAgaXMgbm90IHNldAogIyBDT05GSUdfQkZJTjUzM19CTFVFVEVDSE5JWF9DTSBpcyBub3Qgc2V0CiAjIENPTkZJR19IODYwNl9IVlNJU1RFTUFTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGSU41MzJfSVAwWCBpcyBub3Qgc2V0CkBAIC0xODcsNyArMjA2LDYgQEAKICMKIENPTkZJR19DTEtJTl9IWj0xMTA1OTIwMAogIyBDT05GSUdfQkZJTl9LRVJORUxfQ0xPQ0sgaXMgbm90IHNldAotQ09ORklHX01BWF9NRU1fU0laRT01MTIKIENPTkZJR19NQVhfVkNPX0haPTc1MDAwMDAwMAogQ09ORklHX01JTl9WQ09fSFo9NTAwMDAwMDAKIENPTkZJR19NQVhfU0NMS19IWj0xMzMzMzMzMzMKQEAgLTIwMSw2ICsyMTksNyBAQAogIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAogQ09ORklHX0haPTI1MAorQ09ORklHX1NDSEVEX0hSVElDSz15CiBDT05GSUdfR0VORVJJQ19USU1FPXkKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKICMgQ09ORklHX0NZQ0xFU19DTE9DS1NPVVJDRSBpcyBub3Qgc2V0CkBAIC0yMzgsNiArMjU3LDEyIEBACiBDT05GSUdfQ0FDSEVMSU5FX0FMSUdORURfTDE9eQogIyBDT05GSUdfU1lTQ0FMTF9UQUJfTDEgaXMgbm90IHNldAogIyBDT05GSUdfQ1BMQl9TV0lUQ0hfVEFCX0wxIGlzIG5vdCBzZXQKK0NPTkZJR19BUFBfU1RBQ0tfTDE9eQorCisjCisjIFNwZWVkIE9wdGltaXphdGlvbnMKKyMKK0NPTkZJR19CRklOX0lOU19MT1dPVkVSSEVBRD15CiBDT05GSUdfUkFNS0VSTkVMPXkKICMgQ09ORklHX1JPTUtFUk5FTCBpcyBub3Qgc2V0CiBDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CkBAIC0yNDYsMTQgKzI3MSwxMyBAQAogIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CiBDT05GSUdfRkxBVE1FTT15CiBDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQotIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TUEFSU0VNRU1fVk1FTU1BUF9FTkFCTEUgaXMgbm90IHNldAorQ09ORklHX1BBR0VGTEFHU19FWFRFTkRFRD15CiBDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAogIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIWVNfQUREUl9UXzY0QklUIGlzIG5vdCBzZXQKIENPTkZJR19aT05FX0RNQV9GTEFHPTEKIENPTkZJR19WSVJUX1RPX0JVUz15CiAjIENPTkZJR19CRklOX0dQVElNRVJTIGlzIG5vdCBzZXQKLUNPTkZJR19CRklOX0RNQV81WFg9eQogIyBDT05GSUdfRE1BX1VOQ0FDSEVEXzRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0RNQV9VTkNBQ0hFRF8yTSBpcyBub3Qgc2V0CiBDT05GSUdfRE1BX1VOQ0FDSEVEXzFNPXkKQEAgLTI2OCw3ICsyOTIsNiBAQAogIyBDT05GSUdfQkZJTl9JQ0FDSEVfTE9DSyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRklOX1dCIGlzIG5vdCBzZXQKIENPTkZJR19CRklOX1dUPXkKLUNPTkZJR19MMV9NQVhfUElFQ0U9MTYKICMgQ09ORklHX01QVSBpcyBub3Qgc2V0CiAKICMKQEAgLTI5Nyw3ICszMjAsNiBAQAogIwogIyBCdXMgb3B0aW9ucyAoUENJLCBQQ01DSUEsIEVJU0EsIE1DQSwgSVNBKQogIwotIyBDT05GSUdfUENJIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKICMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CiAKQEAgLTMwOCwyOSArMzMwLDMwIEBACiBDT05GSUdfQklORk1UX0ZMQVQ9eQogQ09ORklHX0JJTkZNVF9aRkxBVD15CiAjIENPTkZJR19CSU5GTVRfU0hBUkVEX0ZMQVQgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9BT1VUIGlzIG5vdCBzZXQKICMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKIAogIwogIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKICMKIENPTkZJR19QTT15Ci0jIENPTkZJR19QTV9MRUdBQ1kgaXMgbm90IHNldAogIyBDT05GSUdfUE1fREVCVUcgaXMgbm90IHNldAogQ09ORklHX1BNX1NMRUVQPXkKLUNPTkZJR19TVVNQRU5EX1VQX1BPU1NJQkxFPXkKIENPTkZJR19TVVNQRU5EPXkKK0NPTkZJR19TVVNQRU5EX0ZSRUVaRVI9eQorQ09ORklHX0FSQ0hfU1VTUEVORF9QT1NTSUJMRT15CiBDT05GSUdfUE1fQkZJTl9TTEVFUF9ERUVQRVI9eQogIyBDT05GSUdfUE1fQkZJTl9TTEVFUCBpcyBub3Qgc2V0CiAjIENPTkZJR19QTV9XQUtFVVBfQllfR1BJTyBpcyBub3Qgc2V0CiAKICMKKyMgUG9zc2libGUgU3VzcGVuZCBNZW0gLyBIaWJlcm5hdGUgV2FrZS1VcCBTb3VyY2VzCisjCisKKyMKICMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCiAjCiAjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29ya2luZwotIwogQ09ORklHX05FVD15CiAKICMKQEAgLTM0Myw2ICszNjYsNyBAQAogIyBDT05GSUdfWEZSTV9VU0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0CiAjIENPTkZJR19YRlJNX01JR1JBVEUgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9TVEFUSVNUSUNTIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAogQ09ORklHX0lORVQ9eQogIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKQEAgLTM3Miw4ICszOTYsNiBAQAogQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgogIyBDT05GSUdfVENQX01ENVNJRyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRMQUJFTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKQEAgLTM4Miw2ICs0MDQsNyBAQAogIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9EU0EgaXMgbm90IHNldAogIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAogIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CkBAIC0zOTgsNiArNDIxLDcgQEAKICMKICMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAogIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfQ0FOIGlzIG5vdCBzZXQKIENPTkZJR19JUkRBPW0KIAogIwpAQCAtNDMyLDI0ICs0NTYsMTQgQEAKICMgQ09ORklHX0RPTkdMRSBpcyBub3Qgc2V0CiAKICMKLSMgT2xkIFNJUiBkZXZpY2UgZHJpdmVycwotIwotIyBDT05GSUdfSVJQT1JUX1NJUiBpcyBub3Qgc2V0Ci0KLSMKLSMgT2xkIFNlcmlhbCBkb25nbGUgc3VwcG9ydAotIwotCi0jCiAjIEZJUiBkZXZpY2UgZHJpdmVycwogIwogIyBDT05GSUdfQlQgaXMgbm90IHNldAogIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzCi0jCisjIENPTkZJR19QSE9ORVQgaXMgbm90IHNldAorQ09ORklHX1dJUkVMRVNTPXkKICMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKK0NPTkZJR19XSVJFTEVTU19PTERfUkVHVUxBVE9SWT15CiAjIENPTkZJR19XSVJFTEVTU19FWFQgaXMgbm90IHNldAogIyBDT05GSUdfTUFDODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKQEAgLTQ2Nyw2ICs0ODEsOCBAQAogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQogIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ERVZSRVMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAogIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQpAQCAtNDc1LDYgKzQ5MSw3IEBACiBDT05GSUdfTVREX1BBUlRJVElPTlM9eQogIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKKyMgQ09ORklHX01URF9BUjdfUEFSVFMgaXMgbm90IHNldAogCiAjCiAjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCkBAIC01MjAsNiArNTM3LDcgQEAKIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUz15CiAjIENPTkZJR19NVERfUEhZU01BUCBpcyBub3Qgc2V0CiBDT05GSUdfTVREX0JGSU5fQVNZTkM9bQorIyBDT05GSUdfTVREX0dQSU9fQUREUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfVUNMSU5VWCBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CiAKQEAgLTU1NCwxMSArNTcyLDE0IEBACiBDT05GSUdfQkxLX0RFVl9SQU09eQogQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CiBDT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2Ci1DT05GSUdfQkxLX0RFVl9SQU1fQkxPQ0tTSVpFPTEwMjQKKyMgQ09ORklHX0JMS19ERVZfWElQIGlzIG5vdCBzZXQKICMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAogIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAogQ09ORklHX01JU0NfREVWSUNFUz15CiAjIENPTkZJR19FRVBST01fOTNDWDYgaXMgbm90IHNldAorIyBDT05GSUdfRU5DTE9TVVJFX1NFUlZJQ0VTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0lERT15CiAjIENPTkZJR19JREUgaXMgbm90IHNldAogCiAjCkBAIC01NzEsNyArNTkyLDYgQEAKICMgQ09ORklHX0FUQSBpcyBub3Qgc2V0CiAjIENPTkZJR19NRCBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWSUNFUz15Ci0jIENPTkZJR19ORVRERVZJQ0VTX01VTFRJUVVFVUUgaXMgbm90IHNldAogIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNWTEFOIGlzIG5vdCBzZXQKQEAgLTU4NCwxMSArNjA0LDE0IEBACiBDT05GSUdfU01DOTFYPXkKICMgQ09ORklHX1NNU0M5MTFYIGlzIG5vdCBzZXQKICMgQ09ORklHX0RNOTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FTkMyOEo2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19JQk1fTkVXX0VNQUNfWk1JSSBpcyBub3Qgc2V0CiAjIENPTkZJR19JQk1fTkVXX0VNQUNfUkdNSUkgaXMgbm90IHNldAogIyBDT05GSUdfSUJNX05FV19FTUFDX1RBSCBpcyBub3Qgc2V0CiAjIENPTkZJR19JQk1fTkVXX0VNQUNfRU1BQzQgaXMgbm90IHNldAotIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19OT19GTE9XX0NUUkwgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DTFJfSUNJTlRTVEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19NQUxfQ09NTU9OX0VSUiBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWXzEwMDA9eQogIyBDT05GSUdfQVg4ODE4MCBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWXzEwMDAwPXkKQEAgLTU5OCwxMCArNjIxLDEwIEBACiAjCiAjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfSVdMV0lGSV9MRURTIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUFAgaXMgbm90IHNldAogIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAogIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldApAQCAtNjMzLDcgKzY1Niw3IEBACiAjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CiBDT05GSUdfSU5QVVRfTUlTQz15CiAjIENPTkZJR19JTlBVVF9VSU5QVVQgaXMgbm90IHNldAotQ09ORklHX1RXSV9LRVlQQUQ9bQorQ09ORklHX0NPTkZJR19JTlBVVF9QQ0Y4NTc0PW0KIAogIwogIyBIYXJkd2FyZSBJL08gcG9ydHMKQEAgLTY1Miw4ICs2NzUsMTEgQEAKIENPTkZJR19CRklOX1NQT1JUPXkKICMgQ09ORklHX0JGSU5fVElNRVJfTEFURU5DWSBpcyBub3Qgc2V0CiBDT05GSUdfVFdJX0xDRD1tCitDT05GSUdfQkZJTl9ETUFfSU5URVJGQUNFPW0KIENPTkZJR19TSU1QTEVfR1BJTz1tCiAjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZLTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGSU5fSlRBR19DT01NIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CiAKICMKQEAgLTY4Miw0MSArNzA4LDQ2IEBACiAjIENPTkZJR19DQU40TElOVVggaXMgbm90IHNldAogIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKICMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKICMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CiBDT05GSUdfSTJDPW0KIENPTkZJR19JMkNfQk9BUkRJTkZPPXkKIENPTkZJR19JMkNfQ0hBUkRFVj1tCi0KLSMKLSMgSTJDIEFsZ29yaXRobXMKLSMKLUNPTkZJR19JMkNfQUxHT0JJVD1tCi0jIENPTkZJR19JMkNfQUxHT1BDRiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfQUxHT1BDQSBpcyBub3Qgc2V0CitDT05GSUdfSTJDX0hFTFBFUl9BVVRPPXkKIAogIwogIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKICMKKworIworIyBJMkMgc3lzdGVtIGJ1cyBkcml2ZXJzIChtb3N0bHkgZW1iZWRkZWQgLyBzeXN0ZW0tb24tY2hpcCkKKyMKICMgQ09ORklHX0kyQ19HUElPIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1NJTVRFQyBpcyBub3Qgc2V0CisKKyMKKyMgRXh0ZXJuYWwgSTJDL1NNQnVzIGFkYXB0ZXIgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1RBT1NfRVZNIGlzIG5vdCBzZXQKKworIworIyBPdGhlciBJMkMvU01CdXMgYnVzIGRyaXZlcnMKKyMKKyMgQ09ORklHX0kyQ19QQ0FfUExBVEZPUk0gaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1NUVUIgaXMgbm90IHNldAogCiAjCiAjIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAogIwotIyBDT05GSUdfU0VOU09SU19EUzEzMzcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19EUzEzNzQgaXMgbm90IHNldAogIyBDT05GSUdfRFMxNjgyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUMjQgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRDUyNTIgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19FRVBST00gaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUENGODU3NSBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0Y4NTc1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKQEAgLTcyNSwxNyArNzU2LDE1IEBACiAjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKLQotIwotIyBTUEkgc3VwcG9ydAotIwogQ09ORklHX1NQST15CisjIENPTkZJR19TUElfREVCVUcgaXMgbm90IHNldAogQ09ORklHX1NQSV9NQVNURVI9eQogCiAjCiAjIFNQSSBNYXN0ZXIgQ29udHJvbGxlciBEcml2ZXJzCiAjCiBDT05GSUdfU1BJX0JGSU49eQorIyBDT05GSUdfU1BJX0JGSU5fTE9DSyBpcyBub3Qgc2V0CiAjIENPTkZJR19TUElfQklUQkFORyBpcyBub3Qgc2V0CiAKICMKQEAgLTc0NCwxMSArNzczLDE1IEBACiAjIENPTkZJR19TUElfQVQyNSBpcyBub3Qgc2V0CiAjIENPTkZJR19TUElfU1BJREVWIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQSV9UTEU2MlgwIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQj15CisjIENPTkZJR19HUElPTElCIGlzIG5vdCBzZXQKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKICMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CiBDT05GSUdfSFdNT049eQogIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQUQ3NDE0IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQUQ3NDE4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURDWFggaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE0xMDIxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FETTEwMjYgaXMgbm90IHNldApAQCAtNzU2LDYgKzc4OSw3IEBACiAjIENPTkZJR19TRU5TT1JTX0FETTEwMzEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE05MjQwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURUNzQ3MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FEVDc0NzMgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BVFhQMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0RTMTYyMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0Y3MTgwNUYgaXMgbm90IHNldApAQCAtNzc2LDYgKzgxMCw3IEBACiAjIENPTkZJR19TRU5TT1JTX0xNOTAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19MTTkyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTE05MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDExMTEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTUFYNjY1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMgbm90IHNldApAQCAtNzg0LDYgKzgxOSw3IEBACiAjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTE5MiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRFM3ODI4IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVEhNQzUwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVlQxMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNzgxRCBpcyBub3Qgc2V0CkBAIC03OTEsOSArODI3LDEyIEBACiAjIENPTkZJR19TRU5TT1JTX1c4Mzc5MkQgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM3OTMgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODNMNzg1VFMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODNMNzg2TkcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0VIRiBpcyBub3Qgc2V0CiAjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTF9IV01PTiBpcyBub3Qgc2V0CiBDT05GSUdfV0FUQ0hET0c9eQogIyBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgaXMgbm90IHNldAogCkBAIC04MDQsMjEgKzg0MywyOSBAQAogQ09ORklHX0JGSU5fV0RUPXkKIAogIwotIyBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUKLSMKLUNPTkZJR19TU0JfUE9TU0lCTEU9eQotIyBDT05GSUdfU1NCIGlzIG5vdCBzZXQKLQotIwogIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCiAjCisjIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAorIyBDT05GSUdfSFRDX1BBU0lDMyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004NDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTgzNTBfSTJDIGlzIG5vdCBzZXQKIAogIwogIyBNdWx0aW1lZGlhIGRldmljZXMKICMKKworIworIyBNdWx0aW1lZGlhIGNvcmUgc3VwcG9ydAorIwogIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKICMgQ09ORklHX0RWQl9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX01FRElBIGlzIG5vdCBzZXQKKworIworIyBNdWx0aW1lZGlhIGRyaXZlcnMKKyMKICMgQ09ORklHX0RBQiBpcyBub3Qgc2V0CiAKICMKQEAgLTgyOSw2ICs4NzYsNyBAQAogQ09ORklHX0ZCPW0KIENPTkZJR19GSVJNV0FSRV9FRElEPXkKICMgQ09ORklHX0ZCX0REQyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9CT09UX1ZFU0FfU1VQUE9SVCBpcyBub3Qgc2V0CiBDT05GSUdfRkJfQ0ZCX0ZJTExSRUNUPW0KIENPTkZJR19GQl9DRkJfQ09QWUFSRUE9bQogQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQ9bQpAQCAtODM2LDggKzg4NCw4IEBACiAjIENPTkZJR19GQl9TWVNfRklMTFJFQ1QgaXMgbm90IHNldAogIyBDT05GSUdfRkJfU1lTX0NPUFlBUkVBIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1NZU19JTUFHRUJMSVQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfRk9SRUlHTl9FTkRJQU4gaXMgbm90IHNldAogIyBDT05GSUdfRkJfU1lTX0ZPUFMgaXMgbm90IHNldAotQ09ORklHX0ZCX0RFRkVSUkVEX0lPPXkKICMgQ09ORklHX0ZCX1NWR0FMSUIgaXMgbm90IHNldAogIyBDT05GSUdfRkJfTUFDTU9ERVMgaXMgbm90IHNldAogIyBDT05GSUdfRkJfQkFDS0xJR0hUIGlzIG5vdCBzZXQKQEAgLTg0OCw2ICs4OTYsNyBAQAogIyBGcmFtZSBidWZmZXIgaGFyZHdhcmUgZHJpdmVycwogIwogIyBDT05GSUdfRkJfQkZJTl9UMzUwTUNRQiBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9CRklOX0xRMDM1UTEgaXMgbm90IHNldAogQ09ORklHX0ZCX0JGSU5fNzM5Mz1tCiBDT05GSUdfTlRTQz15CiAjIENPTkZJR19QQUwgaXMgbm90IHNldApAQCAtODU5LDYgKzkwOCw3IEBACiAjIENPTkZJR19BRFY3MzkzXzJYTUVNIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1MxRDEzWFhYIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1ZJUlRVQUwgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTUVUUk9OT01FIGlzIG5vdCBzZXQKICMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CiAKICMKQEAgLTg2NiwxNSArOTE2LDggQEAKICMKICMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0CiAjIENPTkZJR19MT0dPIGlzIG5vdCBzZXQKLQotIwotIyBTb3VuZAotIwogQ09ORklHX1NPVU5EPW0KLQotIwotIyBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUKLSMKK0NPTkZJR19TT1VORF9PU1NfQ09SRT15CiBDT05GSUdfU05EPW0KIENPTkZJR19TTkRfVElNRVI9bQogQ09ORklHX1NORF9QQ009bQpAQCAtODg4LDE4ICs5MzEsMTIgQEAKIENPTkZJR19TTkRfVkVSQk9TRV9QUk9DRlM9eQogIyBDT05GSUdfU05EX1ZFUkJPU0VfUFJJTlRLIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9ERUJVRyBpcyBub3Qgc2V0Ci0KLSMKLSMgR2VuZXJpYyBkZXZpY2VzCi0jCitDT05GSUdfU05EX0RSSVZFUlM9eQogIyBDT05GSUdfU05EX0RVTU1ZIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9NVFBBViBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfU0VSSUFMX1UxNjU1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfTVBVNDAxIGlzIG5vdCBzZXQKLQotIwotIyBTUEkgZGV2aWNlcwotIworQ09ORklHX1NORF9TUEk9eQogCiAjCiAjIEFMU0EgQmxhY2tmaW4gZGV2aWNlcwpAQCAtOTExLDQ2ICs5NDgsNDYgQEAKICMgQ09ORklHX1NORF9CTEFDS0ZJTl9BRDE4MzZfNVAxIGlzIG5vdCBzZXQKIENPTkZJR19TTkRfQkxBQ0tGSU5fU1BPUlQ9MAogQ09ORklHX1NORF9CTEFDS0ZJTl9TUElfUEZCSVQ9NAotQ09ORklHX1NORF9CRklOX0FENzMzMTE9bQogQ09ORklHX1NORF9CRklOX1NQT1JUPTAKLUNPTkZJR19TTkRfQkZJTl9BRDczMzExX1NFPTQKIENPTkZJR19TTkRfQkZJTl9BRDczMzIyPW0KIENPTkZJR19TTkRfQkZJTl9BRDczMzIyX1NQT1JUMF9TRT0xMAogQ09ORklHX1NORF9CRklOX0FENzMzMjJfU1BPUlQxX1NFPTE0CiBDT05GSUdfU05EX0JGSU5fQUQ3MzMyMl9SRVNFVD0xMgotCi0jCi0jIFN5c3RlbSBvbiBDaGlwIGF1ZGlvIHN1cHBvcnQKLSMKLUNPTkZJR19TTkRfU09DX0FDOTdfQlVTPXkKIENPTkZJR19TTkRfU09DPW0KLUNPTkZJR19TTkRfQkY1WFhfU09DPW0KLUNPTkZJR19TTkRfTU1BUF9TVVBQT1JUPXkKLUNPTkZJR19TTkRfQkY1WFhfU09DX0FDOTc9bQotIyBDT05GSUdfU05EX0JGNVhYX1NPQ19XTTg3NTAgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0JGNVhYX1NPQ19XTTg3MzEgaXMgbm90IHNldAorQ09ORklHX1NORF9TT0NfQUM5N19CVVM9eQorQ09ORklHX1NORF9CRjVYWF9JMlM9bQogIyBDT05GSUdfU05EX0JGNVhYX1NPQ19TU00yNjAyIGlzIG5vdCBzZXQKLUNPTkZJR19TTkRfQkY1WFhfU09DX0JGNXh4PW0KK0NPTkZJR19TTkRfQkY1WFhfU09DX0FENzMzMTE9bQorQ09ORklHX1NORF9CRklOX0FENzMzMTFfU0U9NAorQ09ORklHX1NORF9CRjVYWF9BQzk3PW0KK0NPTkZJR19TTkRfQkY1WFhfTU1BUF9TVVBQT1JUPXkKKyMgQ09ORklHX1NORF9CRjVYWF9NVUxUSUNIQU5fU1VQUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfU05EX0JGNVhYX1NPQ19TUE9SVD1tCitDT05GSUdfU05EX0JGNVhYX1NPQ19JMlM9bQorQ09ORklHX1NORF9CRjVYWF9TT0NfQUM5Nz1tCitDT05GSUdfU05EX0JGNVhYX1NPQ19BRDE5ODA9bQogQ09ORklHX1NORF9CRjVYWF9TUE9SVF9OVU09MAogIyBDT05GSUdfU05EX0JGNVhYX0hBVkVfQ09MRF9SRVNFVCBpcyBub3Qgc2V0Ci0KLSMKLSMgU29DIEF1ZGlvIHN1cHBvcnQgZm9yIFN1cGVySAotIworIyBDT05GSUdfU05EX1NPQ19BTExfQ09ERUNTIGlzIG5vdCBzZXQKIENPTkZJR19TTkRfU09DX0FEMTk4MD1tCi0KLSMKLSMgT3BlbiBTb3VuZCBTeXN0ZW0KLSMKK0NPTkZJR19TTkRfU09DX0FENzMzMTE9bQogIyBDT05GSUdfU09VTkRfUFJJTUUgaXMgbm90IHNldAogQ09ORklHX0FDOTdfQlVTPW0KIENPTkZJR19ISURfU1VQUE9SVD15CiBDT05GSUdfSElEPXkKICMgQ09ORklHX0hJRF9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURSQVcgaXMgbm90IHNldAorIyBDT05GSUdfSElEX1BJRCBpcyBub3Qgc2V0CisKKyMKKyMgU3BlY2lhbCBISUQgZHJpdmVycworIworQ09ORklHX0hJRF9DT01QQVQ9eQogIyBDT05GSUdfVVNCX1NVUFBPUlQgaXMgbm90IHNldAogIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FTVNUSUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FDQ0VTU0lCSUxJVFkgaXMgbm90IHNldAogQ09ORklHX1JUQ19MSUI9eQogQ09ORklHX1JUQ19DTEFTUz15CiBDT05GSUdfUlRDX0hDVE9TWVM9eQpAQCAtOTc5LDUxICsxMDE2LDU3IEBACiAjIENPTkZJR19SVENfRFJWX1BDRjg1NjMgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9QQ0Y4NTgzIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfTTQxVDgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUzM1MzkwQSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0ZNMzEzMCBpcyBub3Qgc2V0CiAKICMKICMgU1BJIFJUQyBkcml2ZXJzCiAjCi0jIENPTkZJR19SVENfRFJWX1JTNUMzNDggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDFUOTQgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzEzMDUgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9NQVg2OTAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUjk3MDEgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SUzVDMzQ4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMzMjM0IGlzIG5vdCBzZXQKIAogIwogIyBQbGF0Zm9ybSBSVEMgZHJpdmVycwogIworIyBDT05GSUdfUlRDX0RSVl9EUzEyODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE1MTEgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9EUzE1NTMgaXMgbm90IHNldAotIyBDT05GSUdfUlRDX0RSVl9TVEsxN1RBOCBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX0RTMTc0MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1NUSzE3VEE4IGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfTTQ4VDg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDM1IGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfTTQ4VDU5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfQlE0ODAyIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfVjMwMjAgaXMgbm90IHNldAogCiAjCiAjIG9uLUNQVSBSVEMgZHJpdmVycwogIwogQ09ORklHX1JUQ19EUlZfQkZJTj15Ci0KLSMKLSMgVXNlcnNwYWNlIEkvTwotIworIyBDT05GSUdfRE1BREVWSUNFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VSU8gaXMgbm90IHNldAorIyBDT05GSUdfU1RBR0lORyBpcyBub3Qgc2V0CiAKICMKICMgRmlsZSBzeXN0ZW1zCiAjCiAjIENPTkZJR19FWFQyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0X0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorQ09ORklHX0ZJTEVfTE9DS0lORz15CiAjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKIENPTkZJR19JTk9USUZZPXkKIENPTkZJR19JTk9USUZZX1VTRVI9eQogIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAotIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CiAjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKQEAgLTEwNjMsMTEgKzExMDYsMTEgQEAKICMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CiBDT05GSUdfWUFGRlNfRlM9bQogQ09ORklHX1lBRkZTX1lBRkZTMT15CisjIENPTkZJR19ZQUZGU185QllURV9UQUdTIGlzIG5vdCBzZXQKICMgQ09ORklHX1lBRkZTX0RPRVNfRUNDIGlzIG5vdCBzZXQKIENPTkZJR19ZQUZGU19ZQUZGUzI9eQogQ09ORklHX1lBRkZTX0FVVE9fWUFGRlMyPXkKICMgQ09ORklHX1lBRkZTX0RJU0FCTEVfTEFaWV9MT0FEIGlzIG5vdCBzZXQKLUNPTkZJR19ZQUZGU19DSEVDS1BPSU5UX1JFU0VSVkVEX0JMT0NLUz0xMAogIyBDT05GSUdfWUFGRlNfRElTQUJMRV9XSURFX1ROT0RFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ZQUZGU19BTFdBWVNfQ0hFQ0tfQ0hVTktfRVJBU0VEIGlzIG5vdCBzZXQKIENPTkZJR19ZQUZGU19TSE9SVF9OQU1FU19JTl9SQU09eQpAQCAtMTA4NCw4ICsxMTI3LDExIEBACiAjIENPTkZJR19KRkZTMl9SVUJJTiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAogIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PTUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKQEAgLTEwOTMsMTMgKzExMzksMTIgQEAKIENPTkZJR19ORlNfVjM9eQogIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAotIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKICMgQ09ORklHX05GU0QgaXMgbm90IHNldAogQ09ORklHX0xPQ0tEPW0KIENPTkZJR19MT0NLRF9WND15CiBDT05GSUdfTkZTX0NPTU1PTj15CiBDT05GSUdfU1VOUlBDPW0KLSMgQ09ORklHX1NVTlJQQ19CSU5EMzQgaXMgbm90IHNldAorIyBDT05GSUdfU1VOUlBDX1JFR0lTVEVSX1Y0IGlzIG5vdCBzZXQKICMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CiAjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKIENPTkZJR19TTUJfRlM9bQpAQCAtMTE1NSw5ICsxMjAwLDYgQEAKICMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAogIyBDT05GSUdfTkxTX1VURjggaXMgbm90IHNldAogIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKLUNPTkZJR19JTlNUUlVNRU5UQVRJT049eQotIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogCiAjCiAjIEtlcm5lbCBoYWNraW5nCkBAIC0xMTY1LDE0ICsxMjA3LDUzIEBACiAjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CiBDT05GSUdfRU5BQkxFX1dBUk5fREVQUkVDQVRFRD15CiBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQorQ09ORklHX0ZSQU1FX1dBUk49MTAyNAogIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0ZTPXkKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19LRVJORUw9eQorIyBDT05GSUdfREVCVUdfU0hJUlEgaXMgbm90IHNldAorQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQPXkKKyMgQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDIGlzIG5vdCBzZXQKK0NPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQ19WQUxVRT0wCitDT05GSUdfU0NIRURfREVCVUc9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19PQkpFQ1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUlRfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19SVF9NVVRFWF9URVNURVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19JTkZPPXkKKyMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1dSSVRFQ09VTlQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTUVNT1JZX0lOSVQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TRyBpcyBub3Qgc2V0CisjIENPTkZJR19GUkFNRV9QT0lOVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPT1RfUFJJTlRLX0RFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLVFJBQ0VfU0VMRl9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0JMT0NLX0VYVF9ERVZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSyBpcyBub3Qgc2V0CisjIENPTkZJR19EWU5BTUlDX1BSSU5US19ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0FSQ0hfS0dEQj15CisjIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NUQUNLT1ZFUkZMT1cgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX1ZFUkJPU0U9eQogQ09ORklHX0RFQlVHX01NUlM9eQorIyBDT05GSUdfREVCVUdfSFdFUlIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRE9VQkxFRkFVTFQgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0hVTlRfRk9SX1pFUk89eQogQ09ORklHX0RFQlVHX0JGSU5fSFdUUkFDRV9PTj15CiBDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX0NPTVBSRVNTSU9OX09GRj15CkBAIC0xMTkwLDkgKzEyNzEsOTQgQEAKICMKICMgQ09ORklHX0tFWVMgaXMgbm90IHNldAogQ09ORklHX1NFQ1VSSVRZPXkKKyMgQ09ORklHX1NFQ1VSSVRZRlMgaXMgbm90IHNldAogIyBDT05GSUdfU0VDVVJJVFlfTkVUV09SSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRUNVUklUWV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZX0ZJTEVfQ0FQQUJJTElUSUVTIGlzIG5vdCBzZXQKK0NPTkZJR19TRUNVUklUWV9ERUZBVUxUX01NQVBfTUlOX0FERFI9MAorQ09ORklHX0NSWVBUTz15CisKKyMKKyMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCisjCisjIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUFOQUdFUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NSWVBURCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVVUSEVOQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgQXV0aGVudGljYXRlZCBFbmNyeXB0aW9uIHdpdGggQXNzb2NpYXRlZCBEYXRhCisjCisjIENPTkZJR19DUllQVE9fQ0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUUlWIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBtb2RlcworIworIyBDT05GSUdfQ1JZUFRPX0NCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1RSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DVFMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0VDQiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTFJXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19QQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19YVFMgaXMgbm90IHNldAorCisjCisjIEhhc2ggbW9kZXMKKyMKKyMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKKworIworIyBEaWdlc3QKKyMKKyMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxNjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMzIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19XUDUxMiBpcyBub3Qgc2V0CisKKyMKKyMgQ2lwaGVycworIworIyBDT05GSUdfQ1JZUFRPX0FFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQU5VQklTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BUkM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FNRUxMSUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fREVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19GQ1JZUFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0tIQVpBRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0FMU0EyMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VFRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UV09GSVNIIGlzIG5vdCBzZXQKKworIworIyBDb21wcmVzc2lvbgorIworIyBDT05GSUdfQ1JZUFRPX0RFRkxBVEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0xaTyBpcyBub3Qgc2V0CisKKyMKKyMgUmFuZG9tIE51bWJlciBHZW5lcmF0aW9uCisjCisjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0hXPXkKIAogIwogIyBMaWJyYXJ5IHJvdXRpbmVzCkBAIC0xMjAwLDYgKzEzNjYsNyBAQAogQ09ORklHX0JJVFJFVkVSU0U9eQogQ09ORklHX0NSQ19DQ0lUVD1tCiAjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfVDEwRElGIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDMzI9eQogIyBDT05GSUdfQ1JDNyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MzctU1RBTVBfZGVmY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTM3LVNUQU1QX2RlZmNvbmZpZwppbmRleCA2M2EwZjg1Li4zMzIxNDJmIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MzctU1RBTVBfZGVmY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUzNy1TVEFNUF9kZWZjb25maWcKQEAgLTEsNiArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjQuNworIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI4LXJjMgorIyBUdWUgRGVjIDMwIDE3OjI0OjM3IDIwMDgKICMKICMgQ09ORklHX01NVSBpcyBub3Qgc2V0CiAjIENPTkZJR19GUFUgaXMgbm90IHNldApAQCAtOCw3ICs5LDYgQEAKICMgQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNIGlzIG5vdCBzZXQKIENPTkZJR19CTEFDS0ZJTj15CiBDT05GSUdfWk9ORV9ETUE9eQotQ09ORklHX1NFTUFQSE9SRV9TTEVFUEVSUz15CiBDT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUPXkKIENPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQpAQCAtMzEsMTggKzMxLDE2IEBACiAjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAogIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAotIyBDT05GSUdfVVNFUl9OUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QSURfTlMgaXMgbm90IHNldAogIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAogQ09ORklHX0lLQ09ORklHPXkKIENPTkZJR19JS0NPTkZJR19QUk9DPXkKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiAjIENPTkZJR19DR1JPVVBTIGlzIG5vdCBzZXQKLUNPTkZJR19GQUlSX0dST1VQX1NDSEVEPXkKLUNPTkZJR19GQUlSX1VTRVJfU0NIRUQ9eQotIyBDT05GSUdfRkFJUl9DR1JPVVBfU0NIRUQgaXMgbm90IHNldAotQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQorIyBDT05GSUdfR1JPVVBfU0NIRUQgaXMgbm90IHNldAorIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BTUVTUEFDRVMgaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKIENPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCiAjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CkBAIC01MSwyNiArNDksMzUgQEAKIENPTkZJR19VSUQxNj15CiBDT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQogQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKIENPTkZJR19IT1RQTFVHPXkKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15Ci1DT05GSUdfRUxGX0NPUkU9eQorIyBDT05GSUdfRUxGX0NPUkUgaXMgbm90IHNldAorQ09ORklHX0NPTVBBVF9CUks9eQogQ09ORklHX0JBU0VfRlVMTD15CiBDT05GSUdfRlVURVg9eQogQ09ORklHX0FOT05fSU5PREVTPXkKIENPTkZJR19FUE9MTD15CiBDT05GSUdfU0lHTkFMRkQ9eQorQ09ORklHX1RJTUVSRkQ9eQogQ09ORklHX0VWRU5URkQ9eQorQ09ORklHX0FJTz15CiBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQogQ09ORklHX1NMQUI9eQogIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisjIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX09QUk9GSUxFPXkKKyMgQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQgaXMgbm90IHNldAogQ09ORklHX1NMQUJJTkZPPXkKIENPTkZJR19SVF9NVVRFWEVTPXkKIENPTkZJR19USU5ZX1NITUVNPXkKIENPTkZJR19CQVNFX1NNQUxMPTAKIENPTkZJR19NT0RVTEVTPXkKKyMgQ09ORklHX01PRFVMRV9GT1JDRV9MT0FEIGlzIG5vdCBzZXQKIENPTkZJR19NT0RVTEVfVU5MT0FEPXkKICMgQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQgaXMgbm90IHNldAogIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldApAQCAtODEsNiArODgsNyBAQAogIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19MU0YgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCiAjCiAjIElPIFNjaGVkdWxlcnMKQEAgLTk0LDkgKzEwMiwxMSBAQAogIyBDT05GSUdfREVGQVVMVF9DRlEgaXMgbm90IHNldAogIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKIENPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImFudGljaXBhdG9yeSIKK0NPTkZJR19DTEFTU0lDX1JDVT15CiAjIENPTkZJR19QUkVFTVBUX05PTkUgaXMgbm90IHNldAogQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZPXkKICMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX0ZSRUVaRVI9eQogCiAjCiAjIEJsYWNrZmluIFByb2Nlc3NvciBPcHRpb25zCkBAIC0xMDUsNiArMTE1LDEwIEBACiAjCiAjIFByb2Nlc3NvciBhbmQgQm9hcmQgU2V0dGluZ3MKICMKKyMgQ09ORklHX0JGNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTE4IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTIyIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTIzIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTI0IGlzIG5vdCBzZXQKQEAgLTExNywxOCArMTMxLDIzIEBACiAjIENPTkZJR19CRjUzNCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUzNiBpcyBub3Qgc2V0CiBDT05GSUdfQkY1Mzc9eQorIyBDT05GSUdfQkY1MzggaXMgbm90IHNldAorIyBDT05GSUdfQkY1MzkgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDIgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDQgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDcgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDggaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDkgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NjEgaXMgbm90IHNldAorQ09ORklHX0JGX1JFVl9NSU49MgorQ09ORklHX0JGX1JFVl9NQVg9MwogIyBDT05GSUdfQkZfUkVWXzBfMCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfMF8xIGlzIG5vdCBzZXQKIENPTkZJR19CRl9SRVZfMF8yPXkKICMgQ09ORklHX0JGX1JFVl8wXzMgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWXzBfNCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfMF81IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGX1JFVl8wXzYgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWX0FOWSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfTk9ORSBpcyBub3Qgc2V0CiBDT05GSUdfQkY1M3g9eQpAQCAtMTQxLDI3ICsxNjAsMjggQEAKIENPTkZJR19JUlFfU1BPUlQxX1JYPTkKIENPTkZJR19JUlFfU1BPUlQxX1RYPTkKIENPTkZJR19JUlFfVFdJPTEwCi1DT05GSUdfSVJRX1NQST0xMAogQ09ORklHX0lSUV9VQVJUMF9SWD0xMAogQ09ORklHX0lSUV9VQVJUMF9UWD0xMAogQ09ORklHX0lSUV9VQVJUMV9SWD0xMAogQ09ORklHX0lSUV9VQVJUMV9UWD0xMAogQ09ORklHX0lSUV9NQUNfUlg9MTEKIENPTkZJR19JUlFfTUFDX1RYPTExCi1DT05GSUdfSVJRX1RNUjA9MTIKLUNPTkZJR19JUlFfVE1SMT0xMgotQ09ORklHX0lSUV9UTVIyPTEyCi1DT05GSUdfSVJRX1RNUjM9MTIKLUNPTkZJR19JUlFfVE1SND0xMgotQ09ORklHX0lSUV9UTVI1PTEyCi1DT05GSUdfSVJRX1RNUjY9MTIKLUNPTkZJR19JUlFfVE1SNz0xMgorQ09ORklHX0lSUV9USU1FUjA9OAorQ09ORklHX0lSUV9USU1FUjE9MTIKK0NPTkZJR19JUlFfVElNRVIyPTEyCitDT05GSUdfSVJRX1RJTUVSMz0xMgorQ09ORklHX0lSUV9USU1FUjQ9MTIKK0NPTkZJR19JUlFfVElNRVI1PTEyCitDT05GSUdfSVJRX1RJTUVSNj0xMgorQ09ORklHX0lSUV9USU1FUjc9MTIKIENPTkZJR19JUlFfUE9SVEdfSU5UQj0xMgogQ09ORklHX0lSUV9NRU1fRE1BMD0xMwogQ09ORklHX0lSUV9NRU1fRE1BMT0xMwogQ09ORklHX0lSUV9XQVRDSD0xMworQ09ORklHX0lSUV9TUEk9MTAKIENPTkZJR19CRklONTM3X1NUQU1QPXkKICMgQ09ORklHX0JGSU41MzdfQkxVRVRFQ0hOSVhfQ00gaXMgbm90IHNldAorIyBDT05GSUdfQkZJTjUzN19CTFVFVEVDSE5JWF9UQ00gaXMgbm90IHNldAogIyBDT05GSUdfUE5BVjEwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NBTVNJR19NSU5PVEFVUiBpcyBub3Qgc2V0CiAjIENPTkZJR19HRU5FUklDX0JGNTM3X0JPQVJEIGlzIG5vdCBzZXQKQEAgLTE5NCw3ICsyMTQsNiBAQAogIwogQ09ORklHX0NMS0lOX0haPTI1MDAwMDAwCiAjIENPTkZJR19CRklOX0tFUk5FTF9DTE9DSyBpcyBub3Qgc2V0Ci1DT05GSUdfTUFYX01FTV9TSVpFPTUxMgogQ09ORklHX01BWF9WQ09fSFo9NjAwMDAwMDAwCiBDT05GSUdfTUlOX1ZDT19IWj01MDAwMDAwMAogQ09ORklHX01BWF9TQ0xLX0haPTEzMzMzMzMzMwpAQCAtMjA4LDYgKzIyNyw3IEBACiAjIENPTkZJR19IWl8zMDAgaXMgbm90IHNldAogIyBDT05GSUdfSFpfMTAwMCBpcyBub3Qgc2V0CiBDT05GSUdfSFo9MjUwCitDT05GSUdfU0NIRURfSFJUSUNLPXkKIENPTkZJR19HRU5FUklDX1RJTUU9eQogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQogIyBDT05GSUdfQ1lDTEVTX0NMT0NLU09VUkNFIGlzIG5vdCBzZXQKQEAgLTI0NSw2ICsyNjUsMTIgQEAKIENPTkZJR19DQUNIRUxJTkVfQUxJR05FRF9MMT15CiAjIENPTkZJR19TWVNDQUxMX1RBQl9MMSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUExCX1NXSVRDSF9UQUJfTDEgaXMgbm90IHNldAorQ09ORklHX0FQUF9TVEFDS19MMT15CisKKyMKKyMgU3BlZWQgT3B0aW1pemF0aW9ucworIworQ09ORklHX0JGSU5fSU5TX0xPV09WRVJIRUFEPXkKIENPTkZJR19SQU1LRVJORUw9eQogIyBDT05GSUdfUk9NS0VSTkVMIGlzIG5vdCBzZXQKIENPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKQEAgLTI1MywxNCArMjc5LDEzIEBACiAjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKIENPTkZJR19GTEFUTUVNPXkKIENPTkZJR19GTEFUX05PREVfTUVNX01BUD15Ci0jIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQQVJTRU1FTV9WTUVNTUFQX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfUEFHRUZMQUdTX0VYVEVOREVEPXkKIENPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CiAjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAorIyBDT05GSUdfUEhZU19BRERSX1RfNjRCSVQgaXMgbm90IHNldAogQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQogQ09ORklHX1ZJUlRfVE9fQlVTPXkKLSMgQ09ORklHX0JGSU5fR1BUSU1FUlMgaXMgbm90IHNldAotQ09ORklHX0JGSU5fRE1BXzVYWD15CitDT05GSUdfQkZJTl9HUFRJTUVSUz1tCiAjIENPTkZJR19ETUFfVU5DQUNIRURfNE0gaXMgbm90IHNldAogIyBDT05GSUdfRE1BX1VOQ0FDSEVEXzJNIGlzIG5vdCBzZXQKIENPTkZJR19ETUFfVU5DQUNIRURfMU09eQpAQCAtMjc1LDcgKzMwMCw2IEBACiAjIENPTkZJR19CRklOX0lDQUNIRV9MT0NLIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGSU5fV0IgaXMgbm90IHNldAogQ09ORklHX0JGSU5fV1Q9eQotQ09ORklHX0wxX01BWF9QSUVDRT0xNgogIyBDT05GSUdfTVBVIGlzIG5vdCBzZXQKIAogIwpAQCAtMzA0LDcgKzMyOCw2IEBACiAjCiAjIEJ1cyBvcHRpb25zIChQQ0ksIFBDTUNJQSwgRUlTQSwgTUNBLCBJU0EpCiAjCi0jIENPTkZJR19QQ0kgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAogIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKIApAQCAtMzE1LDI5ICszMzgsMzEgQEAKIENPTkZJR19CSU5GTVRfRkxBVD15CiBDT05GSUdfQklORk1UX1pGTEFUPXkKICMgQ09ORklHX0JJTkZNVF9TSEFSRURfRkxBVCBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0FPVVQgaXMgbm90IHNldAogIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAogCiAjCiAjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucwogIwogQ09ORklHX1BNPXkKLSMgQ09ORklHX1BNX0xFR0FDWSBpcyBub3Qgc2V0CiAjIENPTkZJR19QTV9ERUJVRyBpcyBub3Qgc2V0CiBDT05GSUdfUE1fU0xFRVA9eQotQ09ORklHX1NVU1BFTkRfVVBfUE9TU0lCTEU9eQogQ09ORklHX1NVU1BFTkQ9eQorQ09ORklHX1NVU1BFTkRfRlJFRVpFUj15CitDT05GSUdfQVJDSF9TVVNQRU5EX1BPU1NJQkxFPXkKIENPTkZJR19QTV9CRklOX1NMRUVQX0RFRVBFUj15CiAjIENPTkZJR19QTV9CRklOX1NMRUVQIGlzIG5vdCBzZXQKICMgQ09ORklHX1BNX1dBS0VVUF9CWV9HUElPIGlzIG5vdCBzZXQKIAogIworIyBQb3NzaWJsZSBTdXNwZW5kIE1lbSAvIEhpYmVybmF0ZSBXYWtlLVVwIFNvdXJjZXMKKyMKKyMgQ09ORklHX1BNX0JGSU5fV0FLRV9QSDYgaXMgbm90IHNldAorCisjCiAjIENQVSBGcmVxdWVuY3kgc2NhbGluZwogIwogIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmtpbmcKLSMKIENPTkZJR19ORVQ9eQogCiAjCkBAIC0zNTAsNiArMzc1LDcgQEAKICMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAogIyBDT05GSUdfWEZSTV9NSUdSQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fU1RBVElTVElDUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKIENPTkZJR19JTkVUPXkKICMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CkBAIC0zNzksOCArNDA1LDYgQEAKIENPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKICMgQ09ORklHX1RDUF9NRDVTSUcgaXMgbm90IHNldAogIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUTEFCRUwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CkBAIC0zODksNiArNDEzLDcgQEAKICMgQ09ORklHX1RJUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRFNBIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAogIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKICMgQ09ORklHX0xMQzIgaXMgbm90IHNldApAQCAtNDA1LDYgKzQzMCw3IEBACiAjCiAjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBTiBpcyBub3Qgc2V0CiBDT05GSUdfSVJEQT1tCiAKICMKQEAgLTQ0MCwyNCArNDY2LDE0IEBACiAjIENPTkZJR19ET05HTEUgaXMgbm90IHNldAogCiAjCi0jIE9sZCBTSVIgZGV2aWNlIGRyaXZlcnMKLSMKLSMgQ09ORklHX0lSUE9SVF9TSVIgaXMgbm90IHNldAotCi0jCi0jIE9sZCBTZXJpYWwgZG9uZ2xlIHN1cHBvcnQKLSMKLQotIwogIyBGSVIgZGV2aWNlIGRyaXZlcnMKICMKICMgQ09ORklHX0JUIGlzIG5vdCBzZXQKICMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcwotIworIyBDT05GSUdfUEhPTkVUIGlzIG5vdCBzZXQKK0NPTkZJR19XSVJFTEVTUz15CiAjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CitDT05GSUdfV0lSRUxFU1NfT0xEX1JFR1VMQVRPUlk9eQogIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CkBAIC00NzUsNiArNDkxLDggQEAKIENPTkZJR19TVEFOREFMT05FPXkKIENPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKICMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfREVWUkVTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CiBDT05GSUdfTVREPXkKQEAgLTQ4Myw2ICs1MDEsNyBAQAogQ09ORklHX01URF9QQVJUSVRJT05TPXkKICMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CisjIENPTkZJR19NVERfQVI3X1BBUlRTIGlzIG5vdCBzZXQKIAogIwogIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycwpAQCAtNTUzLDE1ICs1NzIsMTEgQEAKICMgQ09ORklHX01URF9OQU5EX1ZFUklGWV9XUklURSBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfTkFORF9FQ0NfU01DIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9OQU5EX01VU0VVTV9JRFMgaXMgbm90IHNldAotQ09ORklHX01URF9OQU5EX0JGSU49bQotQ09ORklHX0JGSU5fTkFORF9CQVNFPTB4MjAyMTIwMDAKLUNPTkZJR19CRklOX05BTkRfQ0xFPTIKLUNPTkZJR19CRklOX05BTkRfQUxFPTEKLUNPTkZJR19CRklOX05BTkRfUkVBRFk9MworIyBDT05GSUdfTVREX05BTkRfQkZJTiBpcyBub3Qgc2V0CiBDT05GSUdfTVREX05BTkRfSURTPW0KICMgQ09ORklHX01URF9OQU5EX0RJU0tPTkNISVAgaXMgbm90IHNldAogIyBDT05GSUdfTVREX05BTkRfTkFORFNJTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfTkFORF9QTEFURk9STSBpcyBub3Qgc2V0CitDT05GSUdfTVREX05BTkRfUExBVEZPUk09bQogIyBDT05GSUdfTVREX09ORU5BTkQgaXMgbm90IHNldAogCiAjCkBAIC01NzYsMTEgKzU5MSwxNCBAQAogQ09ORklHX0JMS19ERVZfUkFNPXkKIENPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgogQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgotQ09ORklHX0JMS19ERVZfUkFNX0JMT0NLU0laRT0xMDI0CisjIENPTkZJR19CTEtfREVWX1hJUCBpcyBub3Qgc2V0CiAjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKIENPTkZJR19NSVNDX0RFVklDRVM9eQogIyBDT05GSUdfRUVQUk9NXzkzQ1g2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQ0xPU1VSRV9TRVJWSUNFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9JREU9eQogIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKIAogIwpAQCAtNTkzLDcgKzYxMSw2IEBACiAjIENPTkZJR19BVEEgaXMgbm90IHNldAogIyBDT05GSUdfTUQgaXMgbm90IHNldAogQ09ORklHX05FVERFVklDRVM9eQotIyBDT05GSUdfTkVUREVWSUNFU19NVUxUSVFVRVVFIGlzIG5vdCBzZXQKICMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKICMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAogIyBDT05GSUdfTUFDVkxBTiBpcyBub3Qgc2V0CkBAIC02MTQsNiArNjMxLDcgQEAKIENPTkZJR19TTVNDX1BIWT15CiAjIENPTkZJR19CUk9BRENPTV9QSFkgaXMgbm90IHNldAogIyBDT05GSUdfSUNQTFVTX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19SRUFMVEVLX1BIWSBpcyBub3Qgc2V0CiAjIENPTkZJR19GSVhFRF9QSFkgaXMgbm90IHNldAogIyBDT05GSUdfTURJT19CSVRCQU5HIGlzIG5vdCBzZXQKIENPTkZJR19ORVRfRVRIRVJORVQ9eQpAQCAtNjI2LDExICs2NDQsMTQgQEAKICMgQ09ORklHX1NNQzkxWCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTVNDOTExWCBpcyBub3Qgc2V0CiAjIENPTkZJR19ETTkwMDAgaXMgbm90IHNldAorIyBDT05GSUdfRU5DMjhKNjAgaXMgbm90IHNldAogIyBDT05GSUdfSUJNX05FV19FTUFDX1pNSUkgaXMgbm90IHNldAogIyBDT05GSUdfSUJNX05FV19FTUFDX1JHTUlJIGlzIG5vdCBzZXQKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19UQUggaXMgbm90IHNldAogIyBDT05GSUdfSUJNX05FV19FTUFDX0VNQUM0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTk9fRkxPV19DVFJMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19NQUxfQ0xSX0lDSU5UU1RBVCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NPTU1PTl9FUlIgaXMgbm90IHNldAogQ09ORklHX05FVERFVl8xMDAwPXkKICMgQ09ORklHX0FYODgxODAgaXMgbm90IHNldAogQ09ORklHX05FVERFVl8xMDAwMD15CkBAIC02NDAsMTAgKzY2MSwxMCBAQAogIwogIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lXTFdJRklfTEVEUyBpcyBub3Qgc2V0CiAjIENPTkZJR19XQU4gaXMgbm90IHNldAogIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMSVAgaXMgbm90IHNldAotIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAogIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKQEAgLTY3NSwxMiArNjk2LDE1IEBACiAjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CiBDT05GSUdfSU5QVVRfTUlTQz15CiAjIENPTkZJR19JTlBVVF9VSU5QVVQgaXMgbm90IHNldAotQ09ORklHX1RXSV9LRVlQQUQ9bQorQ09ORklHX0NPTkZJR19JTlBVVF9QQ0Y4NTc0PW0KIAogIwogIyBIYXJkd2FyZSBJL08gcG9ydHMKICMKLSMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJTz15CitDT05GSUdfU0VSSU9fU0VSUE9SVD15CitDT05GSUdfU0VSSU9fTElCUFMyPXkKKyMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CiAjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CiAKICMKQEAgLTY5MSwxMSArNzE1LDE0IEBACiAjIENPTkZJR19CRjV4eF9QUElGQ0QgaXMgbm90IHNldAogIyBDT05GSUdfQkZJTl9TSU1QTEVfVElNRVIgaXMgbm90IHNldAogIyBDT05GSUdfQkY1eHhfUFBJIGlzIG5vdCBzZXQKLUNPTkZJR19CRklOX1NQT1JUPXkKK0NPTkZJR19CRklOX1NQT1JUPW0KICMgQ09ORklHX0JGSU5fVElNRVJfTEFURU5DWSBpcyBub3Qgc2V0CiBDT05GSUdfVFdJX0xDRD1tCitDT05GSUdfQkZJTl9ETUFfSU5URVJGQUNFPW0KIENPTkZJR19TSU1QTEVfR1BJTz1tCiAjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZLTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGSU5fSlRBR19DT01NIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CiAKICMKQEAgLTcyNyw0OCArNzU0LDUxIEBACiAjCiAjIGxpbnV4IGVtYmVkZGVkIGRyaXZlcnMKICMKLSMgQ09ORklHX0NBTl9NQ0Y1MjgyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NBTl9VTkNUV0lOQ0FOIGlzIG5vdCBzZXQKIENPTkZJR19DQU5fQkxBQ0tGSU49bQogIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKICMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKICMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CiBDT05GSUdfSTJDPW0KIENPTkZJR19JMkNfQk9BUkRJTkZPPXkKIENPTkZJR19JMkNfQ0hBUkRFVj1tCi0KLSMKLSMgSTJDIEFsZ29yaXRobXMKLSMKLSMgQ09ORklHX0kyQ19BTEdPQklUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTEdPUENGIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTEdPUENBIGlzIG5vdCBzZXQKK0NPTkZJR19JMkNfSEVMUEVSX0FVVE89eQogCiAjCiAjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAogIworCisjCisjIEkyQyBzeXN0ZW0gYnVzIGRyaXZlcnMgKG1vc3RseSBlbWJlZGRlZCAvIHN5c3RlbS1vbi1jaGlwKQorIwogQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0k9bQotQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfQ0xLX0tIWj01MAorQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfQ0xLX0tIWj0xMDAKICMgQ09ORklHX0kyQ19HUElPIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1NJTVRFQyBpcyBub3Qgc2V0CisKKyMKKyMgRXh0ZXJuYWwgSTJDL1NNQnVzIGFkYXB0ZXIgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1RBT1NfRVZNIGlzIG5vdCBzZXQKKworIworIyBPdGhlciBJMkMvU01CdXMgYnVzIGRyaXZlcnMKKyMKKyMgQ09ORklHX0kyQ19QQ0FfUExBVEZPUk0gaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1NUVUIgaXMgbm90IHNldAogCiAjCiAjIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAogIwotIyBDT05GSUdfU0VOU09SU19EUzEzMzcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19EUzEzNzQgaXMgbm90IHNldAogIyBDT05GSUdfRFMxNjgyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUMjQgaXMgbm90IHNldAogQ09ORklHX1NFTlNPUlNfQUQ1MjUyPW0KICMgQ09ORklHX1NFTlNPUlNfRUVQUk9NIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDRjg1NzUgaXMgbm90IHNldAorIyBDT05GSUdfUENGODU3NSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTUFYNjg3NSBpcyBub3Qgc2V0CkBAIC03NzcsMTcgKzgwNywxNSBAQAogIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0Ci0KLSMKLSMgU1BJIHN1cHBvcnQKLSMKIENPTkZJR19TUEk9eQorIyBDT05GSUdfU1BJX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19TUElfTUFTVEVSPXkKIAogIwogIyBTUEkgTWFzdGVyIENvbnRyb2xsZXIgRHJpdmVycwogIwogQ09ORklHX1NQSV9CRklOPXkKKyMgQ09ORklHX1NQSV9CRklOX0xPQ0sgaXMgbm90IHNldAogIyBDT05GSUdfU1BJX0JJVEJBTkcgaXMgbm90IHNldAogCiAjCkBAIC03OTYsMTEgKzgyNCwxNSBAQAogIyBDT05GSUdfU1BJX0FUMjUgaXMgbm90IHNldAogIyBDT05GSUdfU1BJX1NQSURFViBpcyBub3Qgc2V0CiAjIENPTkZJR19TUElfVExFNjJYMCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUI9eQorIyBDT05GSUdfR1BJT0xJQiBpcyBub3Qgc2V0CiAjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAogQ09ORklHX0hXTU9OPXkKICMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FENzQxNCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FENzQxOCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FEQ1hYIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKQEAgLTgwOCw2ICs4NDAsNyBAQAogIyBDT05GSUdfU0VOU09SU19BRE0xMDMxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNOTI0MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FEVDc0NzAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRFQ3NDczIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQVRYUDEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19EUzE2MjEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GNzE4MDVGIGlzIG5vdCBzZXQKQEAgLTgyOCw2ICs4NjEsNyBAQAogIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTE05MiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0xNOTMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVgxMTExIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTUFYMTYxOSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX01BWDY2NTAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKQEAgLTgzNiw2ICs4NzAsNyBAQAogIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xOTIgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURTNzgyOCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1RITUM1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1ZUMTIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldApAQCAtODQzLDkgKzg3OCwxMiBAQAogIyBDT05GSUdfU0VOU09SU19XODM3OTJEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNzkzIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzTDc4Nk5HIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM2MjdFSEYgaXMgbm90IHNldAogIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAogQ09ORklHX1dBVENIRE9HPXkKICMgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUIGlzIG5vdCBzZXQKIApAQCAtODU2LDIxICs4OTQsMjkgQEAKIENPTkZJR19CRklOX1dEVD15CiAKICMKLSMgU29uaWNzIFNpbGljb24gQmFja3BsYW5lCi0jCi1DT05GSUdfU1NCX1BPU1NJQkxFPXkKLSMgQ09ORklHX1NTQiBpcyBub3Qgc2V0Ci0KLSMKICMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycwogIworIyBDT05GSUdfTUZEX0NPUkUgaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hUQ19QQVNJQzMgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RNSU8gaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODQwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004MzUwX0kyQyBpcyBub3Qgc2V0CiAKICMKICMgTXVsdGltZWRpYSBkZXZpY2VzCiAjCisKKyMKKyMgTXVsdGltZWRpYSBjb3JlIHN1cHBvcnQKKyMKICMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CiAjIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19NRURJQSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkcml2ZXJzCisjCiAjIENPTkZJR19EQUIgaXMgbm90IHNldAogCiAjCkBAIC04ODEsNiArOTI3LDcgQEAKIENPTkZJR19GQj1tCiBDT05GSUdfRklSTVdBUkVfRURJRD15CiAjIENPTkZJR19GQl9EREMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQk9PVF9WRVNBX1NVUFBPUlQgaXMgbm90IHNldAogQ09ORklHX0ZCX0NGQl9GSUxMUkVDVD1tCiBDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBPW0KIENPTkZJR19GQl9DRkJfSU1BR0VCTElUPW0KQEAgLTg4OCw4ICs5MzUsOCBAQAogIyBDT05GSUdfRkJfU1lTX0ZJTExSRUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1NZU19DT1BZQVJFQSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9TWVNfSU1BR0VCTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0ZPUkVJR05fRU5ESUFOIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1NZU19GT1BTIGlzIG5vdCBzZXQKLUNPTkZJR19GQl9ERUZFUlJFRF9JTz15CiAjIENPTkZJR19GQl9TVkdBTElCIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX01BQ01PREVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0JBQ0tMSUdIVCBpcyBub3Qgc2V0CkBAIC04OTksOCArOTQ2LDEyIEBACiAjCiAjIEZyYW1lIGJ1ZmZlciBoYXJkd2FyZSBkcml2ZXJzCiAjCi0jIENPTkZJR19GQl9ISVRBQ0hJX1RYMDkgaXMgbm90IHNldAogIyBDT05GSUdfRkJfQkZJTl9UMzUwTUNRQiBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9CRklOX0xRMDM1UTEgaXMgbm90IHNldAorQ09ORklHX0ZCX0JGNTM3X0xRMDM1PW0KK0NPTkZJR19MUTAzNV9TTEFWRV9BRERSPTB4NTgKKyMgQ09ORklHX0ZCX0JGSU5fTEFORFNDQVBFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0JGSU5fQkdSIGlzIG5vdCBzZXQKIENPTkZJR19GQl9CRklOXzczOTM9bQogQ09ORklHX05UU0M9eQogIyBDT05GSUdfUEFMIGlzIG5vdCBzZXQKQEAgLTkxMCwxNSArOTYxLDE3IEBACiAjIENPTkZJR19QQUxfWUNCQ1IgaXMgbm90IHNldAogQ09ORklHX0FEVjczOTNfMVhNRU09eQogIyBDT05GSUdfQURWNzM5M18yWE1FTSBpcyBub3Qgc2V0Ci1DT05GSUdfRkJfQkY1MzdfTFEwMzU9bQotQ09ORklHX0xRMDM1X1NMQVZFX0FERFI9MHg1OAotIyBDT05GSUdfRkJfQkZJTl9MQU5EU0NBUEUgaXMgbm90IHNldAotIyBDT05GSUdfRkJfQkZJTl9CR1IgaXMgbm90IHNldAorIyBDT05GSUdfRkJfSElUQUNISV9UWDA5IGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1MxRDEzWFhYIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1ZJUlRVQUwgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTUVUUk9OT01FIGlzIG5vdCBzZXQKIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQ9eQogQ09ORklHX0xDRF9DTEFTU19ERVZJQ0U9bQogIyBDT05GSUdfTENEX0xUVjM1MFFWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xDRF9JTEk5MzIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xDRF9URE8yNE0gaXMgbm90IHNldAorIyBDT05GSUdfTENEX1ZHRzI0MzJBNCBpcyBub3Qgc2V0CisjIENPTkZJR19MQ0RfUExBVEZPUk0gaXMgbm90IHNldAogQ09ORklHX0JBQ0tMSUdIVF9DTEFTU19ERVZJQ0U9bQogQ09ORklHX0JBQ0tMSUdIVF9DT1JHST1tCiAKQEAgLTkyNywxNSArOTgwLDggQEAKICMKICMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0CiAjIENPTkZJR19MT0dPIGlzIG5vdCBzZXQKLQotIwotIyBTb3VuZAotIwogQ09ORklHX1NPVU5EPW0KLQotIwotIyBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUKLSMKK0NPTkZJR19TT1VORF9PU1NfQ09SRT15CiBDT05GSUdfU05EPW0KIENPTkZJR19TTkRfVElNRVI9bQogQ09ORklHX1NORF9QQ009bQpAQCAtOTQ5LDE4ICs5OTUsMTIgQEAKIENPTkZJR19TTkRfVkVSQk9TRV9QUk9DRlM9eQogIyBDT05GSUdfU05EX1ZFUkJPU0VfUFJJTlRLIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9ERUJVRyBpcyBub3Qgc2V0Ci0KLSMKLSMgR2VuZXJpYyBkZXZpY2VzCi0jCitDT05GSUdfU05EX0RSSVZFUlM9eQogIyBDT05GSUdfU05EX0RVTU1ZIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9NVFBBViBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfU0VSSUFMX1UxNjU1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfTVBVNDAxIGlzIG5vdCBzZXQKLQotIwotIyBTUEkgZGV2aWNlcwotIworQ09ORklHX1NORF9TUEk9eQogCiAjCiAjIEFMU0EgQmxhY2tmaW4gZGV2aWNlcwpAQCAtOTcyLDUxICsxMDEyLDQ2IEBACiAjIENPTkZJR19TTkRfQkxBQ0tGSU5fQUQxODM2XzVQMSBpcyBub3Qgc2V0CiBDT05GSUdfU05EX0JMQUNLRklOX1NQT1JUPTAKIENPTkZJR19TTkRfQkxBQ0tGSU5fU1BJX1BGQklUPTQKLUNPTkZJR19TTkRfQkZJTl9BRDczMzExPW0KIENPTkZJR19TTkRfQkZJTl9TUE9SVD0wCi1DT05GSUdfU05EX0JGSU5fQUQ3MzMxMV9TRT00CiBDT05GSUdfU05EX0JGSU5fQUQ3MzMyMj1tCiBDT05GSUdfU05EX0JGSU5fQUQ3MzMyMl9TUE9SVDBfU0U9MTAKIENPTkZJR19TTkRfQkZJTl9BRDczMzIyX1NQT1JUMV9TRT0xNAogQ09ORklHX1NORF9CRklOX0FENzMzMjJfUkVTRVQ9MTIKLQotIwotIyBTeXN0ZW0gb24gQ2hpcCBhdWRpbyBzdXBwb3J0Ci0jCi1DT05GSUdfU05EX1NPQ19BQzk3X0JVUz15CiBDT05GSUdfU05EX1NPQz1tCi1DT05GSUdfU05EX0JGNVhYX1NPQz1tCi1DT05GSUdfU05EX01NQVBfU1VQUE9SVD15Ci1DT05GSUdfU05EX0JGNVhYX1NPQ19BQzk3PW0KLSMgQ09ORklHX1NORF9CRjVYWF9TT0NfV004NzUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9CRjVYWF9TT0NfV004NzMxIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfU09DX0FDOTdfQlVTPXkKK0NPTkZJR19TTkRfQkY1WFhfSTJTPW0KICMgQ09ORklHX1NORF9CRjVYWF9TT0NfU1NNMjYwMiBpcyBub3Qgc2V0Ci1DT05GSUdfU05EX0JGNVhYX1NPQ19CRjV4eD1tCitDT05GSUdfU05EX0JGNVhYX1NPQ19BRDczMzExPW0KK0NPTkZJR19TTkRfQkZJTl9BRDczMzExX1NFPTQKK0NPTkZJR19TTkRfQkY1WFhfQUM5Nz1tCitDT05GSUdfU05EX0JGNVhYX01NQVBfU1VQUE9SVD15CisjIENPTkZJR19TTkRfQkY1WFhfTVVMVElDSEFOX1NVUFBPUlQgaXMgbm90IHNldAorQ09ORklHX1NORF9CRjVYWF9TT0NfU1BPUlQ9bQorQ09ORklHX1NORF9CRjVYWF9TT0NfSTJTPW0KK0NPTkZJR19TTkRfQkY1WFhfU09DX0FDOTc9bQorQ09ORklHX1NORF9CRjVYWF9TT0NfQUQxOTgwPW0KIENPTkZJR19TTkRfQkY1WFhfU1BPUlRfTlVNPTAKICMgQ09ORklHX1NORF9CRjVYWF9IQVZFX0NPTERfUkVTRVQgaXMgbm90IHNldAotCi0jCi0jIFNvQyBBdWRpbyBzdXBwb3J0IGZvciBTdXBlckgKLSMKKyMgQ09ORklHX1NORF9TT0NfQUxMX0NPREVDUyBpcyBub3Qgc2V0CiBDT05GSUdfU05EX1NPQ19BRDE5ODA9bQotCi0jCi0jIE9wZW4gU291bmQgU3lzdGVtCi0jCitDT05GSUdfU05EX1NPQ19BRDczMzExPW0KICMgQ09ORklHX1NPVU5EX1BSSU1FIGlzIG5vdCBzZXQKIENPTkZJR19BQzk3X0JVUz1tCiBDT05GSUdfSElEX1NVUFBPUlQ9eQogQ09ORklHX0hJRD15CiAjIENPTkZJR19ISURfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfSElEUkFXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9QSUQgaXMgbm90IHNldAorCisjCisjIFNwZWNpYWwgSElEIGRyaXZlcnMKKyMKK0NPTkZJR19ISURfQ09NUEFUPXkKICMgQ09ORklHX1VTQl9TVVBQT1JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX05PX0RVTU1ZX0RFTEFZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RVTU1ZX0RFTEFZX0JBTkswIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RVTU1ZX0RFTEFZX0JBTksxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RVTU1ZX0RFTEFZX0JBTksyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RVTU1ZX0RFTEFZX0JBTkszIGlzIG5vdCBzZXQKICMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisjIENPTkZJR19NRU1TVElDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CisjIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKIENPTkZJR19SVENfTElCPXkKIENPTkZJR19SVENfQ0xBU1M9eQogQ09ORklHX1JUQ19IQ1RPU1lTPXkKQEAgLTEwNDUsNTEgKzEwODAsNTcgQEAKICMgQ09ORklHX1JUQ19EUlZfUENGODU2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX1BDRjg1ODMgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9NNDFUODAgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9TMzUzOTBBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRk0zMTMwIGlzIG5vdCBzZXQKIAogIwogIyBTUEkgUlRDIGRyaXZlcnMKICMKLSMgQ09ORklHX1JUQ19EUlZfUlM1QzM0OCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000MVQ5NCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTMwNSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX01BWDY5MDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SOTcwMSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JTNUMzNDggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzMyMzQgaXMgbm90IHNldAogCiAjCiAjIFBsYXRmb3JtIFJUQyBkcml2ZXJzCiAjCisjIENPTkZJR19SVENfRFJWX0RTMTI4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTUxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVENfRFJWX1NUSzE3VEE4IGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfRFMxNzQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfU1RLMTdUQTggaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9NNDhUODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUMzUgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9NNDhUNTkgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9CUTQ4MDIgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9WMzAyMCBpcyBub3Qgc2V0CiAKICMKICMgb24tQ1BVIFJUQyBkcml2ZXJzCiAjCiBDT05GSUdfUlRDX0RSVl9CRklOPXkKLQotIwotIyBVc2Vyc3BhY2UgSS9PCi0jCisjIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFHSU5HIGlzIG5vdCBzZXQKIAogIwogIyBGaWxlIHN5c3RlbXMKICMKICMgQ09ORklHX0VYVDJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CitDT05GSUdfRklMRV9MT0NLSU5HPXkKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAogQ09ORklHX0lOT1RJRlk9eQogQ09ORklHX0lOT1RJRllfVVNFUj15CiAjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldApAQCAtMTEyOSwxMSArMTE3MCwxMSBAQAogIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ZQUZGU19GUz1tCiBDT05GSUdfWUFGRlNfWUFGRlMxPXkKKyMgQ09ORklHX1lBRkZTXzlCWVRFX1RBR1MgaXMgbm90IHNldAogIyBDT05GSUdfWUFGRlNfRE9FU19FQ0MgaXMgbm90IHNldAogQ09ORklHX1lBRkZTX1lBRkZTMj15CiBDT05GSUdfWUFGRlNfQVVUT19ZQUZGUzI9eQogIyBDT05GSUdfWUFGRlNfRElTQUJMRV9MQVpZX0xPQUQgaXMgbm90IHNldAotQ09ORklHX1lBRkZTX0NIRUNLUE9JTlRfUkVTRVJWRURfQkxPQ0tTPTEwCiAjIENPTkZJR19ZQUZGU19ESVNBQkxFX1dJREVfVE5PREVTIGlzIG5vdCBzZXQKICMgQ09ORklHX1lBRkZTX0FMV0FZU19DSEVDS19DSFVOS19FUkFTRUQgaXMgbm90IHNldAogQ09ORklHX1lBRkZTX1NIT1JUX05BTUVTX0lOX1JBTT15CkBAIC0xMTUwLDggKzExOTEsMTEgQEAKICMgQ09ORklHX0pGRlMyX1JVQklOIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAogQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQpAQCAtMTE1OSwxMyArMTIwMywxMiBAQAogQ09ORklHX05GU19WMz15CiAjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAogIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CiBDT05GSUdfTE9DS0Q9bQogQ09ORklHX0xPQ0tEX1Y0PXkKIENPTkZJR19ORlNfQ09NTU9OPXkKIENPTkZJR19TVU5SUEM9bQotIyBDT05GSUdfU1VOUlBDX0JJTkQzNCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5SUENfUkVHSVNURVJfVjQgaXMgbm90IHNldAogIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKICMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAogQ09ORklHX1NNQl9GUz1tCkBAIC0xMjIxLDkgKzEyNjQsNiBAQAogIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0CiAjIENPTkZJR19OTFNfVVRGOCBpcyBub3Qgc2V0CiAjIENPTkZJR19ETE0gaXMgbm90IHNldAotQ09ORklHX0lOU1RSVU1FTlRBVElPTj15Ci0jIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAotIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiAKICMKICMgS2VybmVsIGhhY2tpbmcKQEAgLTEyMzEsMTQgKzEyNzEsNTMgQEAKICMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKIENPTkZJR19FTkFCTEVfV0FSTl9ERVBSRUNBVEVEPXkKIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CitDT05GSUdfRlJBTUVfV0FSTj0xMDI0CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfRlM9eQogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CisjIENPTkZJR19ERUJVR19TSElSUSBpcyBub3Qgc2V0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUMgaXMgbm90IHNldAorQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDX1ZBTFVFPTAKK0NPTkZJR19TQ0hFRF9ERUJVRz15CisjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJTUVSX1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX09CSkVDVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0lORk89eQorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfV1JJVEVDT1VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NRU1PUllfSU5JVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZSQU1FX1BPSU5URVIgaXMgbm90IHNldAorIyBDT05GSUdfQk9PVF9QUklOVEtfREVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQkxPQ0tfRVhUX0RFVlQgaXMgbm90IHNldAorIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RZTkFNSUNfUFJJTlRLX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKKyMgQ09ORklHX0tHREIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfVkVSQk9TRT15CiBDT05GSUdfREVCVUdfTU1SUz15CisjIENPTkZJR19ERUJVR19IV0VSUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ET1VCTEVGQVVMVCBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfSFVOVF9GT1JfWkVSTz15CiBDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX09OPXkKIENPTkZJR19ERUJVR19CRklOX0hXVFJBQ0VfQ09NUFJFU1NJT05fT0ZGPXkKQEAgLTEyNTYsOSArMTMzNSw5NCBAQAogIwogIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CiBDT05GSUdfU0VDVVJJVFk9eQorIyBDT05GSUdfU0VDVVJJVFlGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRUNVUklUWV9ORVRXT1JLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFQ1VSSVRZX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE8gaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlfRklMRV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAorQ09ORklHX1NFQ1VSSVRZX0RFRkFVTFRfTU1BUF9NSU5fQUREUj0wCitDT05GSUdfQ1JZUFRPPXkKKworIworIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKKyMKKyMgQ09ORklHX0NSWVBUT19GSVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NQU5BR0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HRjEyOE1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1JZUFREIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BVVRIRU5DIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKKworIworIyBBdXRoZW50aWNhdGVkIEVuY3J5cHRpb24gd2l0aCBBc3NvY2lhdGVkIERhdGEKKyMKKyMgQ09ORklHX0NSWVBUT19DQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dDTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VRSVYgaXMgbm90IHNldAorCisjCisjIEJsb2NrIG1vZGVzCisjCisjIENPTkZJR19DUllQVE9fQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DVFIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NUUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fRUNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19MUlcgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1BDQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1hUUyBpcyBub3Qgc2V0CisKKyMKKyMgSGFzaCBtb2RlcworIworIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAorCisjCisjIERpZ2VzdAorIworIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxMjggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDE2MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQzMjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKKworIworIyBDaXBoZXJzCisjCisjIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FSQzQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19ERVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0ZDUllQVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TQUxTQTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRUVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVJQRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldAorCisjCisjIENvbXByZXNzaW9uCisjCisjIENPTkZJR19DUllQVE9fREVGTEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTFpPIGlzIG5vdCBzZXQKKworIworIyBSYW5kb20gTnVtYmVyIEdlbmVyYXRpb24KKyMKKyMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fSFc9eQogCiAjCiAjIExpYnJhcnkgcm91dGluZXMKQEAgLTEyNjYsNiArMTQzMCw3IEBACiBDT05GSUdfQklUUkVWRVJTRT15CiBDT05GSUdfQ1JDX0NDSVRUPW0KICMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19UMTBESUYgaXMgbm90IHNldAogIyBDT05GSUdfQ1JDX0lUVV9UIGlzIG5vdCBzZXQKIENPTkZJR19DUkMzMj15CiAjIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUzOC1FWktJVF9kZWZjb25maWcgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MzgtRVpLSVRfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMTU5MzQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MzgtRVpLSVRfZGVmY29uZmlnCkBAIC0wLDAgKzEsMTM2OCBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI4LXJjMgorIworIyBDT05GSUdfTU1VIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZQVSBpcyBub3Qgc2V0CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CisjIENPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITSBpcyBub3Qgc2V0CitDT05GSUdfQkxBQ0tGSU49eQorQ09ORklHX1pPTkVfRE1BPXkKK0NPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQorQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CitDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CitDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQorQ09ORklHX0dFTkVSSUNfR1BJTz15CitDT05GSUdfRk9SQ0VfTUFYX1pPTkVPUkRFUj0xNAorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CitDT05GSUdfSUtDT05GSUc9eQorQ09ORklHX0lLQ09ORklHX1BST0M9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKyMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAorIyBDT05GSUdfR1JPVVBfU0NIRUQgaXMgbm90IHNldAorIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMiBpcyBub3Qgc2V0CisjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19OQU1FU1BBQ0VTIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CitDT05GSUdfRU1CRURERUQ9eQorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19TWVNDVExfU1lTQ0FMTD15CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKKyMgQ09ORklHX0VMRl9DT1JFIGlzIG5vdCBzZXQKK0NPTkZJR19DT01QQVRfQlJLPXkKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19BTk9OX0lOT0RFUz15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKK0NPTkZJR19FVkVOVEZEPXkKK0NPTkZJR19BSU89eQorQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19TTEFCPXkKKyMgQ09ORklHX1NMVUIgaXMgbm90IHNldAorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9PUFJPRklMRT15CisjIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UIGlzIG5vdCBzZXQKK0NPTkZJR19TTEFCSU5GTz15CitDT05GSUdfUlRfTVVURVhFUz15CitDT05GSUdfVElOWV9TSE1FTT15CitDT05GSUdfQkFTRV9TTUFMTD0wCitDT05GSUdfTU9EVUxFUz15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfTE9BRCBpcyBub3Qgc2V0CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS01PRD15CitDT05GSUdfQkxPQ0s9eQorIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKKyMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldAorQ09ORklHX0lPU0NIRURfQ0ZRPXkKK0NPTkZJR19ERUZBVUxUX0FTPXkKKyMgQ09ORklHX0RFRkFVTFRfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9DRlEgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImFudGljaXBhdG9yeSIKK0NPTkZJR19DTEFTU0lDX1JDVT15CisjIENPTkZJR19QUkVFTVBUX05PTkUgaXMgbm90IHNldAorQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZPXkKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorIyBDT05GSUdfRlJFRVpFUiBpcyBub3Qgc2V0CisKKyMKKyMgQmxhY2tmaW4gUHJvY2Vzc29yIE9wdGlvbnMKKyMKKworIworIyBQcm9jZXNzb3IgYW5kIEJvYXJkIFNldHRpbmdzCisjCisjIENPTkZJR19CRjUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUxNCBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUxNiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUxOCBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUyMiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUyMyBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUyNCBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUyNSBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUyNiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUyNyBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzMSBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzMiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzMyBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzNCBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzNiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzNyBpcyBub3Qgc2V0CitDT05GSUdfQkY1Mzg9eQorIyBDT05GSUdfQkY1MzkgaXMgbm90IHNldAorIyBDT05GSUdfQkY1NDIgaXMgbm90IHNldAorIyBDT05GSUdfQkY1NDQgaXMgbm90IHNldAorIyBDT05GSUdfQkY1NDcgaXMgbm90IHNldAorIyBDT05GSUdfQkY1NDggaXMgbm90IHNldAorIyBDT05GSUdfQkY1NDkgaXMgbm90IHNldAorIyBDT05GSUdfQkY1NjEgaXMgbm90IHNldAorQ09ORklHX0JGX1JFVl9NSU49NAorQ09ORklHX0JGX1JFVl9NQVg9NQorIyBDT05GSUdfQkZfUkVWXzBfMCBpcyBub3Qgc2V0CisjIENPTkZJR19CRl9SRVZfMF8xIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGX1JFVl8wXzIgaXMgbm90IHNldAorIyBDT05GSUdfQkZfUkVWXzBfMyBpcyBub3Qgc2V0CitDT05GSUdfQkZfUkVWXzBfND15CisjIENPTkZJR19CRl9SRVZfMF81IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGX1JFVl8wXzYgaXMgbm90IHNldAorIyBDT05GSUdfQkZfUkVWX0FOWSBpcyBub3Qgc2V0CisjIENPTkZJR19CRl9SRVZfTk9ORSBpcyBub3Qgc2V0CitDT05GSUdfTUVNX01UNDhMQzMyTThBMl83NT15CitDT05GSUdfSVJRX1BMTF9XQUtFVVA9NworQ09ORklHX0lSUV9ETUEwX0VSUk9SPTcKK0NPTkZJR19JUlFfUFBJX0VSUk9SPTcKK0NPTkZJR19JUlFfU1BPUlQwX0VSUk9SPTcKK0NPTkZJR19JUlFfU1BPUlQxX0VSUk9SPTcKK0NPTkZJR19JUlFfVUFSVDBfRVJST1I9NworQ09ORklHX0lSUV9VQVJUMV9FUlJPUj03CitDT05GSUdfSVJRX1JUQz04CitDT05GSUdfSVJRX1BQST04CitDT05GSUdfSVJRX1NQT1JUMF9SWD05CitDT05GSUdfSVJRX1NQT1JUMF9UWD05CitDT05GSUdfSVJRX1NQT1JUMV9SWD05CitDT05GSUdfSVJRX1NQT1JUMV9UWD05CitDT05GSUdfSVJRX1NQSTA9MTAKK0NPTkZJR19JUlFfVUFSVDBfUlg9MTAKK0NPTkZJR19JUlFfVUFSVDBfVFg9MTAKK0NPTkZJR19JUlFfVUFSVDFfUlg9MTAKK0NPTkZJR19JUlFfVUFSVDFfVFg9MTAKK0NPTkZJR19JUlFfVElNRVIwPTEyCitDT05GSUdfSVJRX1RJTUVSMT0xMgorQ09ORklHX0lSUV9USU1FUjI9MTIKK0NPTkZJR19JUlFfV0FUQ0g9MTMKK0NPTkZJR19JUlFfUE9SVEZfSU5UQT0xMgorQ09ORklHX0lSUV9QT1JURl9JTlRCPTEyCitDT05GSUdfSVJRX1NQSTBfRVJST1I9NworQ09ORklHX0lSUV9TUEkxX0VSUk9SPTcKK0NPTkZJR19JUlFfRE1BMV9FUlJPUj03CitDT05GSUdfSVJRX0NBTl9SWD0xMQorQ09ORklHX0lSUV9DQU5fVFg9MTEKK0NPTkZJR19CRklONTM4X0VaS0lUPXkKKworIworIyBCRjUzOCBTcGVjaWZpYyBDb25maWd1cmF0aW9uCisjCisKKyMKKyMgSW50ZXJydXB0IFByaW9yaXR5IEFzc2lnbm1lbnQKKyMKKworIworIyBQcmlvcml0eQorIworQ09ORklHX0lSUV9NRU0wX0RNQTA9MTMKK0NPTkZJR19JUlFfTUVNMF9ETUExPTEzCitDT05GSUdfSVJRX1NQT1JUMl9FUlJPUj03CitDT05GSUdfSVJRX1NQT1JUM19FUlJPUj03CitDT05GSUdfSVJRX1NQSTJfRVJST1I9NworQ09ORklHX0lSUV9VQVJUMl9FUlJPUj03CitDT05GSUdfSVJRX0NBTl9FUlJPUj03CitDT05GSUdfSVJRX1NQT1JUMl9SWD05CitDT05GSUdfSVJRX1NQT1JUMl9UWD05CitDT05GSUdfSVJRX1NQT1JUM19SWD05CitDT05GSUdfSVJRX1NQT1JUM19UWD05CitDT05GSUdfSVJRX1NQSTE9MTAKK0NPTkZJR19JUlFfU1BJMj0xMAorQ09ORklHX0lSUV9VQVJUMl9SWD0xMAorQ09ORklHX0lSUV9VQVJUMl9UWD0xMAorQ09ORklHX0lSUV9UV0kwPTExCitDT05GSUdfSVJRX1RXSTE9MTEKK0NPTkZJR19JUlFfTUVNMV9ETUEwPTEzCitDT05GSUdfSVJRX01FTTFfRE1BMT0xMworCisjCisjIEJvYXJkIGN1c3RvbWl6YXRpb25zCisjCisjIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAorQ09ORklHX0JPT1RfTE9BRD0weDEwMDAKKworIworIyBDbG9jay9QTEwgU2V0dXAKKyMKK0NPTkZJR19DTEtJTl9IWj0yNTAwMDAwMAorIyBDT05GSUdfQkZJTl9LRVJORUxfQ0xPQ0sgaXMgbm90IHNldAorQ09ORklHX01BWF9WQ09fSFo9NTMzMzMzMzMzCitDT05GSUdfTUlOX1ZDT19IWj01MDAwMDAwMAorQ09ORklHX01BWF9TQ0xLX0haPTEzMzMzMzMzMworQ09ORklHX01JTl9TQ0xLX0haPTI3MDAwMDAwCisKKyMKKyMgS2VybmVsIFRpbWVyL1NjaGVkdWxlcgorIworIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWl8yNTA9eQorIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAorQ09ORklHX0haPTI1MAorQ09ORklHX1NDSEVEX0hSVElDSz15CitDT05GSUdfR0VORVJJQ19USU1FPXkKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKKyMgQ09ORklHX0NZQ0xFU19DTE9DS1NPVVJDRSBpcyBub3Qgc2V0CitDT05GSUdfVElDS19PTkVTSE9UPXkKKyMgQ09ORklHX05PX0haIGlzIG5vdCBzZXQKK0NPTkZJR19ISUdIX1JFU19USU1FUlM9eQorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlVJTEQ9eQorCisjCisjIE1pc2MKKyMKK0NPTkZJR19CRklOX1NDUkFUQ0hfUkVHX1JFVE49eQorIyBDT05GSUdfQkZJTl9TQ1JBVENIX1JFR19SRVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGSU5fU0NSQVRDSF9SRUdfQ1lDTEVTIGlzIG5vdCBzZXQKKworIworIyBCbGFja2ZpbiBLZXJuZWwgT3B0aW1pemF0aW9ucworIworCisjCisjIE1lbW9yeSBPcHRpbWl6YXRpb25zCisjCitDT05GSUdfSV9FTlRSWV9MMT15CitDT05GSUdfRVhDUFRfSVJRX1NZU0NfTDE9eQorQ09ORklHX0RPX0lSUV9MMT15CitDT05GSUdfQ09SRV9USU1FUl9JUlFfTDE9eQorQ09ORklHX0lETEVfTDE9eQorQ09ORklHX1NDSEVEVUxFX0wxPXkKK0NPTkZJR19BUklUSE1FVElDX09QU19MMT15CitDT05GSUdfQUNDRVNTX09LX0wxPXkKK0NPTkZJR19NRU1TRVRfTDE9eQorQ09ORklHX01FTUNQWV9MMT15CitDT05GSUdfU1lTX0JGSU5fU1BJTkxPQ0tfTDE9eQorIyBDT05GSUdfSVBfQ0hFQ0tTVU1fTDEgaXMgbm90IHNldAorQ09ORklHX0NBQ0hFTElORV9BTElHTkVEX0wxPXkKKyMgQ09ORklHX1NZU0NBTExfVEFCX0wxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQTEJfU1dJVENIX1RBQl9MMSBpcyBub3Qgc2V0CitDT05GSUdfQVBQX1NUQUNLX0wxPXkKKworIworIyBTcGVlZCBPcHRpbWl6YXRpb25zCisjCitDT05GSUdfQkZJTl9JTlNfTE9XT1ZFUkhFQUQ9eQorQ09ORklHX1JBTUtFUk5FTD15CisjIENPTkZJR19ST01LRVJORUwgaXMgbm90IHNldAorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorQ09ORklHX1BBR0VGTEFHU19FWFRFTkRFRD15CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIWVNfQUREUl9UXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTEKK0NPTkZJR19WSVJUX1RPX0JVUz15CitDT05GSUdfQkZJTl9HUFRJTUVSUz15CisjIENPTkZJR19ETUFfVU5DQUNIRURfNE0gaXMgbm90IHNldAorIyBDT05GSUdfRE1BX1VOQ0FDSEVEXzJNIGlzIG5vdCBzZXQKK0NPTkZJR19ETUFfVU5DQUNIRURfMU09eQorIyBDT05GSUdfRE1BX1VOQ0FDSEVEX05PTkUgaXMgbm90IHNldAorCisjCisjIENhY2hlIFN1cHBvcnQKKyMKK0NPTkZJR19CRklOX0lDQUNIRT15CitDT05GSUdfQkZJTl9EQ0FDSEU9eQorIyBDT05GSUdfQkZJTl9EQ0FDSEVfQkFOS0EgaXMgbm90IHNldAorIyBDT05GSUdfQkZJTl9JQ0FDSEVfTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19CRklOX1dCIGlzIG5vdCBzZXQKK0NPTkZJR19CRklOX1dUPXkKKyMgQ09ORklHX01QVSBpcyBub3Qgc2V0CisKKyMKKyMgQXN5bmNob25vdXMgTWVtb3J5IENvbmZpZ3VyYXRpb24KKyMKKworIworIyBFQklVX0FNR0NUTCBHbG9iYWwgQ29udHJvbAorIworQ09ORklHX0NfQU1DS0VOPXkKK0NPTkZJR19DX0NEUFJJTz15CisjIENPTkZJR19DX0FNQkVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NfQU1CRU5fQjAgaXMgbm90IHNldAorIyBDT05GSUdfQ19BTUJFTl9CMF9CMSBpcyBub3Qgc2V0CisjIENPTkZJR19DX0FNQkVOX0IwX0IxX0IyIGlzIG5vdCBzZXQKK0NPTkZJR19DX0FNQkVOX0FMTD15CisKKyMKKyMgRUJJVV9BTUJDVEwgQ29udHJvbAorIworQ09ORklHX0JBTktfMD0weDdCQjAKK0NPTkZJR19CQU5LXzE9MHg3QkIwCitDT05GSUdfQkFOS18yPTB4N0JCMAorQ09ORklHX0JBTktfMz0weDk5QjIKKworIworIyBCdXMgb3B0aW9ucyAoUENJLCBQQ01DSUEsIEVJU0EsIE1DQSwgSVNBKQorIworIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAorIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBFeGVjdXRhYmxlIGZpbGUgZm9ybWF0cworIworQ09ORklHX0JJTkZNVF9FTEZfRkRQSUM9eQorQ09ORklHX0JJTkZNVF9GTEFUPXkKK0NPTkZJR19CSU5GTVRfWkZMQVQ9eQorIyBDT05GSUdfQklORk1UX1NIQVJFRF9GTEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfQU9VVCBpcyBub3Qgc2V0CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCisjIENPTkZJR19QTSBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9TVVNQRU5EX1BPU1NJQkxFPXkKKyMgQ09ORklHX1BNX1dBS0VVUF9CWV9HUElPIGlzIG5vdCBzZXQKKworIworIyBDUFUgRnJlcXVlbmN5IHNjYWxpbmcKKyMKKyMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CisjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CitDT05GSUdfWEZSTT15CisjIENPTkZJR19YRlJNX1VTRVIgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9TVUJfUE9MSUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fTUlHUkFURSBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NUQVRJU1RJQ1MgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CisjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAorIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CitDT05GSUdfSVBfUE5QPXkKKyMgQ09ORklHX0lQX1BOUF9ESENQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1BOUF9CT09UUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CitDT05GSUdfU1lOX0NPT0tJRVM9eQorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15CisjIENPTkZJR19JTkVUX0xSTyBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9ESUFHPXkKK0NPTkZJR19JTkVUX1RDUF9ESUFHPXkKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19DVUJJQz15CitDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCisjIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVUTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9EU0EgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfQ0FOIGlzIG5vdCBzZXQKK0NPTkZJR19JUkRBPW0KKworIworIyBJckRBIHByb3RvY29scworIworQ09ORklHX0lSTEFOPW0KK0NPTkZJR19JUkNPTU09bQorIyBDT05GSUdfSVJEQV9VTFRSQSBpcyBub3Qgc2V0CisKKyMKKyMgSXJEQSBvcHRpb25zCisjCitDT05GSUdfSVJEQV9DQUNIRV9MQVNUX0xTQVA9eQorIyBDT05GSUdfSVJEQV9GQVNUX1JSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREFfREVCVUcgaXMgbm90IHNldAorCisjCisjIEluZnJhcmVkLXBvcnQgZGV2aWNlIGRyaXZlcnMKKyMKKworIworIyBTSVIgZGV2aWNlIGRyaXZlcnMKKyMKK0NPTkZJR19JUlRUWV9TSVI9bQorQ09ORklHX0JGSU5fU0lSPW0KK0NPTkZJR19TSVJfQkZJTl9ETUE9eQorIyBDT05GSUdfU0lSX0JGSU5fUElPIGlzIG5vdCBzZXQKKworIworIyBEb25nbGUgc3VwcG9ydAorIworIyBDT05GSUdfRE9OR0xFIGlzIG5vdCBzZXQKKworIworIyBGSVIgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIT05FVCBpcyBub3Qgc2V0CitDT05GSUdfV0lSRUxFU1M9eQorIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorQ09ORklHX1dJUkVMRVNTX09MRF9SRUdVTEFUT1JZPXkKKyMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF85UCBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ERVZSRVMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAorIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAorQ09ORklHX01URF9QQVJUSVRJT05TPXkKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ01ETElORV9QQVJUUz15CisjIENPTkZJR19NVERfQVI3X1BBUlRTIGlzIG5vdCBzZXQKKworIworIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycworIworQ09ORklHX01URF9DSEFSPW0KK0NPTkZJR19NVERfQkxLREVWUz15CitDT05GSUdfTVREX0JMT0NLPXkKKyMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGRF9GVEwgaXMgbm90IHNldAorIyBDT05GSUdfU1NGREMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09PUFMgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCitDT05GSUdfTVREX0NGST1tCisjIENPTkZJR19NVERfSkVERUNQUk9CRSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0dFTl9QUk9CRT1tCisjIENPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSU5URUxFWFQgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfQU1EU1REPW0KKyMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9VVElMPW0KK0NPTkZJR19NVERfUkFNPXkKK0NPTkZJR19NVERfUk9NPW0KKyMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKKyMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEhZU01BUD1tCitDT05GSUdfTVREX1BIWVNNQVBfU1RBUlQ9MHgyMDAwMDAwMAorQ09ORklHX01URF9QSFlTTUFQX0xFTj0weDAKK0NPTkZJR19NVERfUEhZU01BUF9CQU5LV0lEVEg9MgorIyBDT05GSUdfTVREX1VDTElOVVggaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BMQVRSQU0gaXMgbm90IHNldAorCisjCisjIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTVREX0RBVEFGTEFTSCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTTI1UDgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKKworIworIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX05BTkQ9bQorIyBDT05GSUdfTVREX05BTkRfVkVSSUZZX1dSSVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9OQU5EX0VDQ19TTUMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX05BTkRfTVVTRVVNX0lEUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX05BTkRfQkZJTj1tCitDT05GSUdfQkZJTl9OQU5EX0JBU0U9MHgyMDIxMjAwMAorQ09ORklHX0JGSU5fTkFORF9DTEU9MgorQ09ORklHX0JGSU5fTkFORF9BTEU9MQorQ09ORklHX0JGSU5fTkFORF9SRUFEWT0zCitDT05GSUdfTVREX05BTkRfSURTPW0KKyMgQ09ORklHX01URF9OQU5EX0RJU0tPTkNISVAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX05BTkRfTkFORFNJTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTkFORF9QTEFURk9STSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT05FTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgVUJJIC0gVW5zb3J0ZWQgYmxvY2sgaW1hZ2VzCisjCisjIENPTkZJR19NVERfVUJJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVY9eQorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2CisjIENPTkZJR19CTEtfREVWX1hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JU0NfREVWSUNFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9JREU9eQorIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ETUEgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQSBpcyBub3Qgc2V0CisjIENPTkZJR19NRCBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ1ZMQU4gaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisjIENPTkZJR19WRVRIIGlzIG5vdCBzZXQKK0NPTkZJR19QSFlMSUI9eQorCisjCisjIE1JSSBQSFkgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01BUlZFTExfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RBVklDT01fUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FTRU1JX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19MWFRfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJQ0FEQV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfVklURVNTRV9QSFkgaXMgbm90IHNldAorQ09ORklHX1NNU0NfUEhZPXkKKyMgQ09ORklHX0JST0FEQ09NX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19JQ1BMVVNfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFQUxURUtfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZJWEVEX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19NRElPX0JJVEJBTkcgaXMgbm90IHNldAorQ09ORklHX05FVF9FVEhFUk5FVD15CitDT05GSUdfTUlJPXkKK0NPTkZJR19TTUM5MVg9eQorIyBDT05GSUdfU01TQzkxMVggaXMgbm90IHNldAorIyBDT05GSUdfRE05MDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQzI4SjYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19aTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19SR01JSSBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfVEFIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19FTUFDNCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTk9fRkxPV19DVFJMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19NQUxfQ0xSX0lDSU5UU1RBVCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NPTU1PTl9FUlIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUREVWXzEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUREVWXzEwMDAwIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcyBMQU4KKyMKKyMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19JV0xXSUZJX0xFRFMgaXMgbm90IHNldAorIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorIyBDT05GSUdfUEhPTkUgaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorIyBDT05GSUdfSU5QVVRfRkZfTUVNTEVTUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9QT0xMREVWIGlzIG5vdCBzZXQKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCisjIENPTkZJR19JTlBVVF9NT1VTRURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX0VWREVWPW0KKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVEFCTEVUIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9UT1VDSFNDUkVFTj15CisjIENPTkZJR19UT1VDSFNDUkVFTl9BRFM3ODQ2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3NyBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfSTJDIGlzIG5vdCBzZXQKK0NPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfU1BJPXkKK0NPTkZJR19UT1VDSFNDUkVFTl9BRDc4Nzk9bQorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fRlVKSVRTVSBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9HVU5aRSBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9FTE8gaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fTVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0lORVhJTyBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9NSzcxMiBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9QRU5NT1VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSFJJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX1RPVUNIV0lOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX1RPVUNISVQyMTMgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX01JU0M9eQorIyBDT05GSUdfSU5QVVRfVUlOUFVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTkZJR19JTlBVVF9QQ0Y4NTc0IGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworIyBDT05GSUdfQUQ5OTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQSV9BRENfQkY1MzMgaXMgbm90IHNldAorIyBDT05GSUdfQkY1eHhfUFBJRkNEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGSU5fU0lNUExFX1RJTUVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNXh4X1BQSSBpcyBub3Qgc2V0CitDT05GSUdfQkZJTl9TUE9SVD15CisjIENPTkZJR19CRklOX1RJTUVSX0xBVEVOQ1kgaXMgbm90IHNldAorIyBDT05GSUdfVFdJX0xDRCBpcyBub3Qgc2V0CitDT05GSUdfQkZJTl9ETUFfSU5URVJGQUNFPW0KK0NPTkZJR19TSU1QTEVfR1BJTz1tCisjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZLTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGSU5fSlRBR19DT01NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX0JGSU49eQorQ09ORklHX1NFUklBTF9CRklOX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF9CRklOX0RNQT15CisjIENPTkZJR19TRVJJQUxfQkZJTl9QSU8gaXMgbm90IHNldAorQ09ORklHX1NFUklBTF9CRklOX1VBUlQwPXkKKyMgQ09ORklHX0JGSU5fVUFSVDBfQ1RTUlRTIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfQkZJTl9VQVJUMT15CisjIENPTkZJR19CRklOX1VBUlQxX0NUU1JUUyBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMX0JGSU5fVUFSVDI9eQorIyBDT05GSUdfQkZJTl9VQVJUMl9DVFNSVFMgaXMgbm90IHNldAorQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9CRklOX1NQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYOThfUFRZUz15CisjIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0FOLCB0aGUgY2FyIGJ1cyBhbmQgaW5kdXN0cmlhbCBmaWVsZGJ1cworIworIyBDT05GSUdfQ0FONExJTlVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKK0NPTkZJR19JMkM9eQorQ09ORklHX0kyQ19CT0FSRElORk89eQorIyBDT05GSUdfSTJDX0NIQVJERVYgaXMgbm90IHNldAorQ09ORklHX0kyQ19IRUxQRVJfQVVUTz15CisKKyMKKyMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CisjCisKKyMKKyMgSTJDIHN5c3RlbSBidXMgZHJpdmVycyAobW9zdGx5IGVtYmVkZGVkIC8gc3lzdGVtLW9uLWNoaXApCisjCitDT05GSUdfSTJDX0JMQUNLRklOX1RXST15CitDT05GSUdfSTJDX0JMQUNLRklOX1RXSV9DTEtfS0haPTEwMAorIyBDT05GSUdfSTJDX0dQSU8gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX09DT1JFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lNVEVDIGlzIG5vdCBzZXQKKworIworIyBFeHRlcm5hbCBJMkMvU01CdXMgYWRhcHRlciBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVEFPU19FVk0gaXMgbm90IHNldAorCisjCisjIE90aGVyIEkyQy9TTUJ1cyBidXMgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BDQV9QTEFURk9STSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CisjCisjIENPTkZJR19EUzE2ODIgaXMgbm90IHNldAorIyBDT05GSUdfQVQyNCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FENTI1MiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfUENGODU3NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYNjg3NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1RTTDI1NTAgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CitDT05GSUdfU1BJPXkKKyMgQ09ORklHX1NQSV9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfU1BJX01BU1RFUj15CisKKyMKKyMgU1BJIE1hc3RlciBDb250cm9sbGVyIERyaXZlcnMKKyMKK0NPTkZJR19TUElfQkZJTj15CisjIENPTkZJR19TUElfQkZJTl9MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQSV9CSVRCQU5HIGlzIG5vdCBzZXQKKworIworIyBTUEkgUHJvdG9jb2wgTWFzdGVycworIworIyBDT05GSUdfU1BJX0FUMjUgaXMgbm90IHNldAorIyBDT05GSUdfU1BJX1NQSURFViBpcyBub3Qgc2V0CisjIENPTkZJR19TUElfVExFNjJYMCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUI9eQorIyBDT05GSUdfR1BJT0xJQiBpcyBub3Qgc2V0CisjIENPTkZJR19XMSBpcyBub3Qgc2V0CisjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAorQ09ORklHX0hXTU9OPXkKKyMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FENzQxNCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FENzQxOCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FEQ1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMzEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE05MjQwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURUNzQ3MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FEVDc0NzMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BVFhQMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTYyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0Y3MTgwNUYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GNzE4ODJGRyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0Y3NTM3NVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUxOFNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MjBTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0lUODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03OCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVgxMTExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYMTYxOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDY2NTAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUEM4NzQyNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RNRTE3MzcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xOTIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURTNzgyOCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1RITUM1MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1ZUMTIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3OTFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzkyRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc5MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4M0w3ODVUUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4M0w3ODZORyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19XQVRDSERPRz15CisjIENPTkZJR19XQVRDSERPR19OT1dBWU9VVCBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX1NPRlRfV0FUQ0hET0cgaXMgbm90IHNldAorQ09ORklHX0JGSU5fV0RUPXkKKworIworIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAorIyBDT05GSUdfSFRDX1BBU0lDMyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004NDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTgzNTBfSTJDIGlzIG5vdCBzZXQKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKworIworIyBNdWx0aW1lZGlhIGNvcmUgc3VwcG9ydAorIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX01FRElBIGlzIG5vdCBzZXQKKworIworIyBNdWx0aW1lZGlhIGRyaXZlcnMKKyMKKyMgQ09ORklHX0RBQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworIyBDT05GSUdfVkdBU1RBVEUgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fT1VUUFVUX0NPTlRST0wgaXMgbm90IHNldAorQ09ORklHX0ZCPW0KKyMgQ09ORklHX0ZJUk1XQVJFX0VESUQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfRERDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0JPT1RfVkVTQV9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19GQl9DRkJfRklMTFJFQ1Q9bQorQ09ORklHX0ZCX0NGQl9DT1BZQVJFQT1tCitDT05GSUdfRkJfQ0ZCX0lNQUdFQkxJVD1tCisjIENPTkZJR19GQl9DRkJfUkVWX1BJWEVMU19JTl9CWVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19GSUxMUkVDVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfQ09QWUFSRUEgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU1lTX0lNQUdFQkxJVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9GT1JFSUdOX0VORElBTiBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfRk9QUyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TVkdBTElCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01BQ01PREVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0JBQ0tMSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9NT0RFX0hFTFBFUlMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfVElMRUJMSVRUSU5HIGlzIG5vdCBzZXQKKworIworIyBGcmFtZSBidWZmZXIgaGFyZHdhcmUgZHJpdmVycworIworIyBDT05GSUdfRkJfQkZJTl9UMzUwTUNRQiBpcyBub3Qgc2V0CitDT05GSUdfRkJfQkZJTl9MUTAzNVExPW0KKyMgQ09ORklHX0ZCX0JGSU5fNzM5MyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TMUQxM1hYWCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01FVFJPTk9NRSBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19MT0dPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKK0NPTkZJR19ISURfU1VQUE9SVD15CitDT05GSUdfSElEPXkKKyMgQ09ORklHX0hJRF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19ISURSQVcgaXMgbm90IHNldAorIyBDT05GSUdfSElEX1BJRCBpcyBub3Qgc2V0CisKKyMKKyMgU3BlY2lhbCBISUQgZHJpdmVycworIworQ09ORklHX0hJRF9DT01QQVQ9eQorIyBDT05GSUdfVVNCX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FTVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FDQ0VTU0lCSUxJVFkgaXMgbm90IHNldAorQ09ORklHX1JUQ19MSUI9eQorQ09ORklHX1JUQ19DTEFTUz15CitDT05GSUdfUlRDX0hDVE9TWVM9eQorQ09ORklHX1JUQ19IQ1RPU1lTX0RFVklDRT0icnRjMCIKKyMgQ09ORklHX1JUQ19ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgUlRDIGludGVyZmFjZXMKKyMKK0NPTkZJR19SVENfSU5URl9TWVNGUz15CitDT05GSUdfUlRDX0lOVEZfUFJPQz15CitDT05GSUdfUlRDX0lOVEZfREVWPXkKKyMgQ09ORklHX1JUQ19JTlRGX0RFVl9VSUVfRU1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1RFU1QgaXMgbm90IHNldAorCisjCisjIEkyQyBSVEMgZHJpdmVycworIworIyBDT05GSUdfUlRDX0RSVl9EUzEzMDcgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzEzNzQgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE2NzIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NQVg2OTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUlM1QzM3MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0lTTDEyMDggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9YMTIwNSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1BDRjg1NjMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9QQ0Y4NTgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQxVDgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUzM1MzkwQSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0ZNMzEzMCBpcyBub3Qgc2V0CisKKyMKKyMgU1BJIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX000MVQ5NCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTMwNSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX01BWDY5MDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SOTcwMSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JTNUMzNDggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzMyMzQgaXMgbm90IHNldAorCisjCisjIFBsYXRmb3JtIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX0RTMTI4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTUxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTc0MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1NUSzE3VEE4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDM1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDU5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfQlE0ODAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVjMwMjAgaXMgbm90IHNldAorCisjCisjIG9uLUNQVSBSVEMgZHJpdmVycworIworQ09ORklHX1JUQ19EUlZfQkZJTj15CisjIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFHSU5HIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKKyMgQ09ORklHX0VYVDJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0X0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorQ09ORklHX0ZJTEVfTE9DS0lORz15CisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CitDT05GSUdfSU5PVElGWT15CitDT05GSUdfSU5PVElGWV9VU0VSPXkKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WRkFUX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1BST0NfU1lTQ1RMPXkKK0NPTkZJR19TWVNGUz15CisjIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorQ09ORklHX1lBRkZTX0ZTPW0KK0NPTkZJR19ZQUZGU19ZQUZGUzE9eQorIyBDT05GSUdfWUFGRlNfOUJZVEVfVEFHUyBpcyBub3Qgc2V0CisjIENPTkZJR19ZQUZGU19ET0VTX0VDQyBpcyBub3Qgc2V0CitDT05GSUdfWUFGRlNfWUFGRlMyPXkKK0NPTkZJR19ZQUZGU19BVVRPX1lBRkZTMj15CisjIENPTkZJR19ZQUZGU19ESVNBQkxFX0xBWllfTE9BRCBpcyBub3Qgc2V0CisjIENPTkZJR19ZQUZGU19ESVNBQkxFX1dJREVfVE5PREVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1lBRkZTX0FMV0FZU19DSEVDS19DSFVOS19FUkFTRUQgaXMgbm90IHNldAorQ09ORklHX1lBRkZTX1NIT1JUX05BTUVTX0lOX1JBTT15CitDT05GSUdfSkZGUzJfRlM9bQorQ09ORklHX0pGRlMyX0ZTX0RFQlVHPTAKK0NPTkZJR19KRkZTMl9GU19XUklURUJVRkZFUj15CisjIENPTkZJR19KRkZTMl9GU19XQlVGX1ZFUklGWSBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9TVU1NQVJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0NPTVBSRVNTSU9OX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX1pMSUI9eQorIyBDT05GSUdfSkZGUzJfTFpPIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9SVElNRT15CisjIENPTkZJR19KRkZTMl9SVUJJTiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKK0NPTkZJR19ORlNfRlM9bQorQ09ORklHX05GU19WMz15CisjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKK0NPTkZJR19MT0NLRD1tCitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX05GU19DT01NT049eQorQ09ORklHX1NVTlJQQz1tCisjIENPTkZJR19TVU5SUENfUkVHSVNURVJfVjQgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorQ09ORklHX1NNQl9GUz1tCisjIENPTkZJR19TTUJfTkxTX0RFRkFVTFQgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorQ09ORklHX05MUz1tCitDT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKKyMgQ09ORklHX05MU19DT0RFUEFHRV80MzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV80IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV83IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfUiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19VVEY4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0RMTSBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19FTkFCTEVfV0FSTl9ERVBSRUNBVEVEPXkKK0NPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CitDT05GSUdfRlJBTUVfV0FSTj0xMDI0CisjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CisjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfRlM9eQorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKKyMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKK0NPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CisjIENPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQyBpcyBub3Qgc2V0CitDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUNfVkFMVUU9MAorQ09ORklHX1NDSEVEX0RFQlVHPXkKKyMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfVElNRVJfU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfT0JKRUNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfUlRfTVVURVhfVEVTVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfSU5GTz15CisjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19XUklURUNPVU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01FTU9SWV9JTklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0cgaXMgbm90IHNldAorIyBDT05GSUdfRlJBTUVfUE9JTlRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CT09UX1BSSU5US19ERUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CTE9DS19FWFRfREVWVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQVVMVF9JTkpFQ1RJT04gaXMgbm90IHNldAorQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKKyMgQ09ORklHX0RZTkFNSUNfUFJJTlRLX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKKyMgQ09ORklHX0tHREIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfVkVSQk9TRT15CitDT05GSUdfREVCVUdfTU1SUz15CisjIENPTkZJR19ERUJVR19IV0VSUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ET1VCTEVGQVVMVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfSFVOVF9GT1JfWkVSTz15CitDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX09OPXkKK0NPTkZJR19ERUJVR19CRklOX0hXVFJBQ0VfQ09NUFJFU1NJT05fT0ZGPXkKKyMgQ09ORklHX0RFQlVHX0JGSU5fSFdUUkFDRV9DT01QUkVTU0lPTl9PTkUgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX0NPTVBSRVNTSU9OX1RXTyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX0NPTVBSRVNTSU9OPTAKKyMgQ09ORklHX0RFQlVHX0JGSU5fSFdUUkFDRV9FWFBBTkQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQkZJTl9OT19LRVJOX0hXVFJBQ0UgaXMgbm90IHNldAorQ09ORklHX0VBUkxZX1BSSU5USz15CitDT05GSUdfQ1BMQl9JTkZPPXkKK0NPTkZJR19BQ0NFU1NfQ0hFQ0s9eQorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorQ09ORklHX1NFQ1VSSVRZPXkKKyMgQ09ORklHX1NFQ1VSSVRZRlMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlfTkVUV09SSyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWV9GSUxFX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0CitDT05GSUdfU0VDVVJJVFlfREVGQVVMVF9NTUFQX01JTl9BRERSPTAKK0NPTkZJR19DUllQVE89eQorCisjCisjIENyeXB0byBjb3JlIG9yIGhlbHBlcgorIworIyBDT05GSUdfQ1JZUFRPX0ZJUFMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01BTkFHRVIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DUllQVEQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FVVEhFTkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFU1QgaXMgbm90IHNldAorCisjCisjIEF1dGhlbnRpY2F0ZWQgRW5jcnlwdGlvbiB3aXRoIEFzc29jaWF0ZWQgRGF0YQorIworIyBDT05GSUdfQ1JZUFRPX0NDTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVFJViBpcyBub3Qgc2V0CisKKyMKKyMgQmxvY2sgbW9kZXMKKyMKKyMgQ09ORklHX0NSWVBUT19DQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NUUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19FQ0IgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0xSVyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUENCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fWFRTIGlzIG5vdCBzZXQKKworIworIyBIYXNoIG1vZGVzCisjCisjIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisKKyMKKyMgRGlnZXN0CisjCisjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDEyOCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDMyMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBMSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEE1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RHUjE5MiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fV1A1MTIgaXMgbm90IHNldAorCisjCisjIENpcGhlcnMKKyMKKyMgQ09ORklHX0NSWVBUT19BRVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FOVUJJUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVJDNCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQkxPV0ZJU0ggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBTUVMTElBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0RFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fRkNSWVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19LSEFaQUQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NBTFNBMjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFRUQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUlBFTlQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0CisKKyMKKyMgQ29tcHJlc3Npb24KKyMKKyMgQ09ORklHX0NSWVBUT19ERUZMQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19MWk8gaXMgbm90IHNldAorCisjCisjIFJhbmRvbSBOdW1iZXIgR2VuZXJhdGlvbgorIworIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19IVz15CisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworQ09ORklHX0JJVFJFVkVSU0U9eQorQ09ORklHX0NSQ19DQ0lUVD1tCisjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfVDEwRElGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfQ1JDNyBpcyBub3Qgc2V0CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAorQ09ORklHX1pMSUJfSU5GTEFURT15CitDT05GSUdfWkxJQl9ERUZMQVRFPW0KK0NPTkZJR19QTElTVD15CitDT05GSUdfSEFTX0lPTUVNPXkKK0NPTkZJR19IQVNfSU9QT1JUPXkKK0NPTkZJR19IQVNfRE1BPXkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjU0OC1FWktJVF9kZWZjb25maWcgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1NDgtRVpLSVRfZGVmY29uZmlnCmluZGV4IGJmNjM2NjAuLmQ0ZWQ5Y2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjU0OC1FWktJVF9kZWZjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTQ4LUVaS0lUX2RlZmNvbmZpZwpAQCAtMSw2ICsxLDYgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yNC43CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjgtcmMyCiAjCiAjIENPTkZJR19NTVUgaXMgbm90IHNldAogIyBDT05GSUdfRlBVIGlzIG5vdCBzZXQKQEAgLTgsNyArOCw2IEBACiAjIENPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITSBpcyBub3Qgc2V0CiBDT05GSUdfQkxBQ0tGSU49eQogQ09ORklHX1pPTkVfRE1BPXkKLUNPTkZJR19TRU1BUEhPUkVfU0xFRVBFUlM9eQogQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CiBDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKQEAgLTMxLDE4ICszMCwxNiBAQAogIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAogIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTRVJfTlMgaXMgbm90IHNldAotIyBDT05GSUdfUElEX05TIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKIENPTkZJR19JS0NPTkZJRz15CiBDT05GSUdfSUtDT05GSUdfUFJPQz15CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogIyBDT05GSUdfQ0dST1VQUyBpcyBub3Qgc2V0Ci1DT05GSUdfRkFJUl9HUk9VUF9TQ0hFRD15Ci1DT05GSUdfRkFJUl9VU0VSX1NDSEVEPXkKLSMgQ09ORklHX0ZBSVJfQ0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKKyMgQ09ORklHX0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQgaXMgbm90IHNldAorIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMiBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19OQU1FU1BBQ0VTIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CiBDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgogIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldApAQCAtNTEsMjYgKzQ4LDM1IEBACiBDT05GSUdfVUlEMTY9eQogQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKIENPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAogIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CiBDT05GSUdfSE9UUExVRz15CiBDT05GSUdfUFJJTlRLPXkKIENPTkZJR19CVUc9eQotQ09ORklHX0VMRl9DT1JFPXkKKyMgQ09ORklHX0VMRl9DT1JFIGlzIG5vdCBzZXQKK0NPTkZJR19DT01QQVRfQlJLPXkKIENPTkZJR19CQVNFX0ZVTEw9eQogQ09ORklHX0ZVVEVYPXkKIENPTkZJR19BTk9OX0lOT0RFUz15CiBDT05GSUdfRVBPTEw9eQogQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKIENPTkZJR19FVkVOVEZEPXkKK0NPTkZJR19BSU89eQogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKIENPTkZJR19TTEFCPXkKICMgQ09ORklHX1NMVUIgaXMgbm90IHNldAogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9PUFJPRklMRT15CisjIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UIGlzIG5vdCBzZXQKIENPTkZJR19TTEFCSU5GTz15CiBDT05GSUdfUlRfTVVURVhFUz15CiBDT05GSUdfVElOWV9TSE1FTT15CiBDT05GSUdfQkFTRV9TTUFMTD0wCiBDT05GSUdfTU9EVUxFUz15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfTE9BRCBpcyBub3Qgc2V0CiBDT05GSUdfTU9EVUxFX1VOTE9BRD15CiAjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKICMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKQEAgLTgxLDYgKzg3LDcgQEAKICMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIAogIwogIyBJTyBTY2hlZHVsZXJzCkBAIC05NCw5ICsxMDEsMTEgQEAKICMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0CiBDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJhbnRpY2lwYXRvcnkiCitDT05GSUdfQ0xBU1NJQ19SQ1U9eQogIyBDT05GSUdfUFJFRU1QVF9OT05FIGlzIG5vdCBzZXQKIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT15CiAjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZSRUVaRVIgaXMgbm90IHNldAogCiAjCiAjIEJsYWNrZmluIFByb2Nlc3NvciBPcHRpb25zCkBAIC0xMDUsNiArMTE0LDEwIEBACiAjCiAjIFByb2Nlc3NvciBhbmQgQm9hcmQgU2V0dGluZ3MKICMKKyMgQ09ORklHX0JGNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTE4IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTIyIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTIzIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTI0IGlzIG5vdCBzZXQKQEAgLTExNywxOCArMTMwLDIzIEBACiAjIENPTkZJR19CRjUzNCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUzNiBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUzNyBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzOCBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzOSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU0MiBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU0NCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU0NyBpcyBub3Qgc2V0CiBDT05GSUdfQkY1NDg9eQogIyBDT05GSUdfQkY1NDkgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NjEgaXMgbm90IHNldAorQ09ORklHX0JGX1JFVl9NSU49MAorQ09ORklHX0JGX1JFVl9NQVg9MgogQ09ORklHX0JGX1JFVl8wXzA9eQogIyBDT05GSUdfQkZfUkVWXzBfMSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfMF8yIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl8wXzMgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWXzBfNCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfMF81IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGX1JFVl8wXzYgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWX0FOWSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfTk9ORSBpcyBub3Qgc2V0CiBDT05GSUdfQkY1NHg9eQpAQCAtMTM4LDE1ICsxNTYsMTIgQEAKIENPTkZJR19JUlFfU1BPUlQwX1RYPTkKIENPTkZJR19JUlFfU1BPUlQxX1JYPTkKIENPTkZJR19JUlFfU1BPUlQxX1RYPTkKK0NPTkZJR19JUlFfU1BJMD0xMAogQ09ORklHX0lSUV9VQVJUMF9SWD0xMAogQ09ORklHX0lSUV9VQVJUMF9UWD0xMAogQ09ORklHX0lSUV9VQVJUMV9SWD0xMAogQ09ORklHX0lSUV9VQVJUMV9UWD0xMAogQ09ORklHX0lSUV9DTlQ9OAotQ09ORklHX0lSUV9VU0JfSU5UMD0xMQotQ09ORklHX0lSUV9VU0JfSU5UMT0xMQotQ09ORklHX0lSUV9VU0JfSU5UMj0xMQotQ09ORklHX0lSUV9VU0JfRE1BPTExCiBDT05GSUdfSVJRX1RJTUVSMD0xMQogQ09ORklHX0lSUV9USU1FUjE9MTEKIENPTkZJR19JUlFfVElNRVIyPTExCkBAIC0xNTUsOSArMTcwLDIxIEBACiBDT05GSUdfSVJRX1RJTUVSNT0xMQogQ09ORklHX0lSUV9USU1FUjY9MTEKIENPTkZJR19JUlFfVElNRVI3PTExCitDT05GSUdfSVJRX1VTQl9JTlQwPTExCitDT05GSUdfSVJRX1VTQl9JTlQxPTExCitDT05GSUdfSVJRX1VTQl9JTlQyPTExCitDT05GSUdfSVJRX1VTQl9ETUE9MTEKIENPTkZJR19JUlFfVElNRVI4PTExCiBDT05GSUdfSVJRX1RJTUVSOT0xMQogQ09ORklHX0lSUV9USU1FUjEwPTExCitDT05GSUdfSVJRX1NQT1JUMl9SWD05CitDT05GSUdfSVJRX1NQT1JUMl9UWD05CitDT05GSUdfSVJRX1NQT1JUM19SWD05CitDT05GSUdfSVJRX1NQT1JUM19UWD05CitDT05GSUdfSVJRX1NQSTE9MTAKK0NPTkZJR19JUlFfU1BJMj0xMAorQ09ORklHX0lSUV9UV0kwPTExCitDT05GSUdfSVJRX1RXSTE9MTEKIENPTkZJR19CRklONTQ4X0VaS0lUPXkKICMgQ09ORklHX0JGSU41NDhfQkxVRVRFQ0hOSVhfQ00gaXMgbm90IHNldAogCkBAIC0xODAsNyArMjA3LDYgQEAKIENPTkZJR19JUlFfU1BJMF9FUlI9NwogQ09ORklHX0lSUV9VQVJUMF9FUlI9NwogQ09ORklHX0lSUV9FUFBJMD04Ci1DT05GSUdfSVJRX1NQSTA9MTAKIENPTkZJR19JUlFfUElOVDA9MTIKIENPTkZJR19JUlFfUElOVDE9MTIKIENPTkZJR19JUlFfTURNQVMwPTEzCkBAIC0xOTUsMTggKzIyMSwxMCBAQAogQ09ORklHX0lSUV9VQVJUMV9FUlI9NwogQ09ORklHX0lSUV9VQVJUMl9FUlI9NwogQ09ORklHX0lSUV9DQU4wX0VSUj03Ci1DT05GSUdfSVJRX1NQT1JUMl9SWD05Ci1DT05GSUdfSVJRX1NQT1JUMl9UWD05Ci1DT05GSUdfSVJRX1NQT1JUM19SWD05Ci1DT05GSUdfSVJRX1NQT1JUM19UWD05CiBDT05GSUdfSVJRX0VQUEkxPTkKIENPTkZJR19JUlFfRVBQSTI9OQotQ09ORklHX0lSUV9TUEkxPTEwCi1DT05GSUdfSVJRX1NQSTI9MTAKIENPTkZJR19JUlFfQVRBUElfUlg9MTAKIENPTkZJR19JUlFfQVRBUElfVFg9MTAKLUNPTkZJR19JUlFfVFdJMD0xMQotQ09ORklHX0lSUV9UV0kxPTExCiBDT05GSUdfSVJRX0NBTjBfUlg9MTEKIENPTkZJR19JUlFfQ0FOMF9UWD0xMQogQ09ORklHX0lSUV9NRE1BUzI9MTMKQEAgLTI2MCw3ICsyNzgsNiBAQAogIwogQ09ORklHX0NMS0lOX0haPTI1MDAwMDAwCiAjIENPTkZJR19CRklOX0tFUk5FTF9DTE9DSyBpcyBub3Qgc2V0Ci1DT05GSUdfTUFYX01FTV9TSVpFPTUxMgogQ09ORklHX01BWF9WQ09fSFo9NjAwMDAwMDAwCiBDT05GSUdfTUlOX1ZDT19IWj01MDAwMDAwMAogQ09ORklHX01BWF9TQ0xLX0haPTEzMzMzMzMzMwpAQCAtMjc0LDEwICsyOTEsMTAgQEAKICMgQ09ORklHX0haXzMwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKIENPTkZJR19IWj0yNTAKKyMgQ09ORklHX1NDSEVEX0hSVElDSyBpcyBub3Qgc2V0CiBDT05GSUdfR0VORVJJQ19USU1FPXkKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKICMgQ09ORklHX0NZQ0xFU19DTE9DS1NPVVJDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19USUNLX09ORVNIT1QgaXMgbm90IHNldAogIyBDT05GSUdfTk9fSFogaXMgbm90IHNldAogIyBDT05GSUdfSElHSF9SRVNfVElNRVJTIGlzIG5vdCBzZXQKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JVSUxEPXkKQEAgLTMxMSw2ICszMjgsMTIgQEAKIENPTkZJR19DQUNIRUxJTkVfQUxJR05FRF9MMT15CiAjIENPTkZJR19TWVNDQUxMX1RBQl9MMSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUExCX1NXSVRDSF9UQUJfTDEgaXMgbm90IHNldAorQ09ORklHX0FQUF9TVEFDS19MMT15CisKKyMKKyMgU3BlZWQgT3B0aW1pemF0aW9ucworIworQ09ORklHX0JGSU5fSU5TX0xPV09WRVJIRUFEPXkKIENPTkZJR19SQU1LRVJORUw9eQogIyBDT05GSUdfUk9NS0VSTkVMIGlzIG5vdCBzZXQKIENPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKQEAgLTMxOSwxNCArMzQyLDEzIEBACiAjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKIENPTkZJR19GTEFUTUVNPXkKIENPTkZJR19GTEFUX05PREVfTUVNX01BUD15Ci0jIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQQVJTRU1FTV9WTUVNTUFQX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfUEFHRUZMQUdTX0VYVEVOREVEPXkKIENPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CiAjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAorIyBDT05GSUdfUEhZU19BRERSX1RfNjRCSVQgaXMgbm90IHNldAogQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQogQ09ORklHX1ZJUlRfVE9fQlVTPXkKICMgQ09ORklHX0JGSU5fR1BUSU1FUlMgaXMgbm90IHNldAotQ09ORklHX0JGSU5fRE1BXzVYWD15CiAjIENPTkZJR19ETUFfVU5DQUNIRURfNE0gaXMgbm90IHNldAogQ09ORklHX0RNQV9VTkNBQ0hFRF8yTT15CiAjIENPTkZJR19ETUFfVU5DQUNIRURfMU0gaXMgbm90IHNldApAQCAtMzQxLDcgKzM2Myw3IEBACiAjIENPTkZJR19CRklOX0lDQUNIRV9MT0NLIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGSU5fV0IgaXMgbm90IHNldAogQ09ORklHX0JGSU5fV1Q9eQotQ09ORklHX0wxX01BWF9QSUVDRT0xNgorIyBDT05GSUdfQkZJTl9MMl9DQUNIRUFCTEUgaXMgbm90IHNldAogIyBDT05GSUdfTVBVIGlzIG5vdCBzZXQKIAogIwpAQCAtMzczLDcgKzM5NSw2IEBACiAjCiAjIEJ1cyBvcHRpb25zIChQQ0ksIFBDTUNJQSwgRUlTQSwgTUNBLCBJU0EpCiAjCi0jIENPTkZJR19QQ0kgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAogIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKIApAQCAtMzg0LDIzICs0MDUsMjAgQEAKIENPTkZJR19CSU5GTVRfRkxBVD15CiBDT05GSUdfQklORk1UX1pGTEFUPXkKICMgQ09ORklHX0JJTkZNVF9TSEFSRURfRkxBVCBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0FPVVQgaXMgbm90IHNldAogIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAogCiAjCiAjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucwogIwogIyBDT05GSUdfUE0gaXMgbm90IHNldAotQ09ORklHX1NVU1BFTkRfVVBfUE9TU0lCTEU9eQorQ09ORklHX0FSQ0hfU1VTUEVORF9QT1NTSUJMRT15CiAjIENPTkZJR19QTV9XQUtFVVBfQllfR1BJTyBpcyBub3Qgc2V0CiAKICMKICMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCiAjCiAjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29ya2luZwotIwogQ09ORklHX05FVD15CiAKICMKQEAgLTQxMyw2ICs0MzEsNyBAQAogIyBDT05GSUdfWEZSTV9VU0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0CiAjIENPTkZJR19YRlJNX01JR1JBVEUgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9TVEFUSVNUSUNTIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAogQ09ORklHX0lORVQ9eQogIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKQEAgLTQ0Miw4ICs0NjEsNiBAQAogQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgogIyBDT05GSUdfVENQX01ENVNJRyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRMQUJFTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKQEAgLTQ1Miw2ICs0NjksNyBAQAogIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9EU0EgaXMgbm90IHNldAogIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAogIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CkBAIC00NjgsNiArNDg2LDcgQEAKICMKICMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAogIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfQ0FOIGlzIG5vdCBzZXQKIENPTkZJR19JUkRBPW0KIAogIwpAQCAtNDkzLDkgKzUxMiw5IEBACiAjCiBDT05GSUdfSVJUVFlfU0lSPW0KIENPTkZJR19CRklOX1NJUj1tCitDT05GSUdfQkZJTl9TSVIzPXkKICMgQ09ORklHX0JGSU5fU0lSMCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRklOX1NJUjIgaXMgbm90IHNldAotQ09ORklHX0JGSU5fU0lSMz15CiBDT05GSUdfU0lSX0JGSU5fRE1BPXkKICMgQ09ORklHX1NJUl9CRklOX1BJTyBpcyBub3Qgc2V0CiAKQEAgLTUwOCwxNSArNTI3LDYgQEAKICMgQ09ORklHX0tTOTU5X0RPTkdMRSBpcyBub3Qgc2V0CiAKICMKLSMgT2xkIFNJUiBkZXZpY2UgZHJpdmVycwotIwotIyBDT05GSUdfSVJQT1JUX1NJUiBpcyBub3Qgc2V0Ci0KLSMKLSMgT2xkIFNlcmlhbCBkb25nbGUgc3VwcG9ydAotIwotCi0jCiAjIEZJUiBkZXZpY2UgZHJpdmVycwogIwogIyBDT05GSUdfVVNCX0lSREEgaXMgbm90IHNldApAQCAtNTI0LDExICs1MzQsMTAgQEAKICMgQ09ORklHX01DU19GSVIgaXMgbm90IHNldAogIyBDT05GSUdfQlQgaXMgbm90IHNldAogIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzCi0jCisjIENPTkZJR19QSE9ORVQgaXMgbm90IHNldAorQ09ORklHX1dJUkVMRVNTPXkKICMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKK0NPTkZJR19XSVJFTEVTU19PTERfUkVHVUxBVE9SWT15CiAjIENPTkZJR19XSVJFTEVTU19FWFQgaXMgbm90IHNldAogIyBDT05GSUdfTUFDODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKQEAgLTU0Niw2ICs1NTUsOCBAQAogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQogIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ERVZSRVMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAogIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQpAQCAtNTU0LDYgKzU2NSw3IEBACiBDT05GSUdfTVREX1BBUlRJVElPTlM9eQogIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKKyMgQ09ORklHX01URF9BUjdfUEFSVFMgaXMgbm90IHNldAogCiAjCiAjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCkBAIC02MDEsNiArNjEzLDcgQEAKIENPTkZJR19NVERfUEhZU01BUF9TVEFSVD0weDIwMDAwMDAwCiBDT05GSUdfTVREX1BIWVNNQVBfTEVOPTAKIENPTkZJR19NVERfUEhZU01BUF9CQU5LV0lEVEg9MgorIyBDT05GSUdfTVREX0dQSU9fQUREUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfVUNMSU5VWCBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CiAKQEAgLTYwOCw3ICs2MjEsOCBAQAogIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKICMKICMgQ09ORklHX01URF9EQVRBRkxBU0ggaXMgbm90IHNldAotIyBDT05GSUdfTVREX00yNVA4MCBpcyBub3Qgc2V0CitDT05GSUdfTVREX00yNVA4MD15CitDT05GSUdfTTI1UFhYX1VTRV9GQVNUX1JFQUQ9eQogIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKQEAgLTY0OCwxMSArNjYyLDE0IEBACiBDT05GSUdfQkxLX0RFVl9SQU09eQogQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CiBDT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2Ci1DT05GSUdfQkxLX0RFVl9SQU1fQkxPQ0tTSVpFPTEwMjQKKyMgQ09ORklHX0JMS19ERVZfWElQIGlzIG5vdCBzZXQKICMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAogIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAogQ09ORklHX01JU0NfREVWSUNFUz15CiAjIENPTkZJR19FRVBST01fOTNDWDYgaXMgbm90IHNldAorIyBDT05GSUdfRU5DTE9TVVJFX1NFUlZJQ0VTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0lERT15CiAjIENPTkZJR19JREUgaXMgbm90IHNldAogCiAjCkBAIC02OTYsMTMgKzcxMywxNiBAQAogQ09ORklHX1NDU0lfTE9XTEVWRUw9eQogIyBDT05GSUdfSVNDU0lfVENQIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ESCBpcyBub3Qgc2V0CiBDT05GSUdfQVRBPXkKICMgQ09ORklHX0FUQV9OT05TVEFOREFSRCBpcyBub3Qgc2V0CitDT05GSUdfU0FUQV9QTVA9eQorQ09ORklHX0FUQV9TRkY9eQorIyBDT05GSUdfU0FUQV9NViBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX1BMQVRGT1JNIGlzIG5vdCBzZXQKIENPTkZJR19QQVRBX0JGNTRYPXkKICMgQ09ORklHX01EIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZJQ0VTPXkKLSMgQ09ORklHX05FVERFVklDRVNfTVVMVElRVUVVRSBpcyBub3Qgc2V0CiAjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CiAjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ1ZMQU4gaXMgbm90IHNldApAQCAtNzE1LDExICs3MzUsMTQgQEAKICMgQ09ORklHX1NNQzkxWCBpcyBub3Qgc2V0CiBDT05GSUdfU01TQzkxMVg9eQogIyBDT05GSUdfRE05MDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQzI4SjYwIGlzIG5vdCBzZXQKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19aTUlJIGlzIG5vdCBzZXQKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19SR01JSSBpcyBub3Qgc2V0CiAjIENPTkZJR19JQk1fTkVXX0VNQUNfVEFIIGlzIG5vdCBzZXQKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19FTUFDNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CNDQgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX05PX0ZMT1dfQ1RSTCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NMUl9JQ0lOVFNUQVQgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DT01NT05fRVJSIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZfMTAwMD15CiAjIENPTkZJR19BWDg4MTgwIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZfMTAwMDA9eQpAQCAtNzI5LDYgKzc1Miw3IEBACiAjCiAjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfSVdMV0lGSV9MRURTIGlzIG5vdCBzZXQKIAogIwogIyBVU0IgTmV0d29yayBBZGFwdGVycwpAQCAtNzQxLDcgKzc2NSw2IEBACiAjIENPTkZJR19XQU4gaXMgbm90IHNldAogIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMSVAgaXMgbm90IHNldAotIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAogIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKQEAgLTc1Miw3ICs3NzUsNyBAQAogIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAogIwogQ09ORklHX0lOUFVUPXkKLSMgQ09ORklHX0lOUFVUX0ZGX01FTUxFU1MgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX0ZGX01FTUxFU1M9bQogIyBDT05GSUdfSU5QVVRfUE9MTERFViBpcyBub3Qgc2V0CiAKICMKQEAgLTc3NiwzMCArNzk5LDM3IEBACiAjIENPTkZJR19LRVlCT0FSRF9HUElPIGlzIG5vdCBzZXQKIENPTkZJR19LRVlCT0FSRF9CRklOPXkKICMgQ09ORklHX0tFWUJPQVJEX09QRU5DT1JFUyBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9BRFA1NTg4IGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CiBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU49eQogIyBDT05GSUdfVE9VQ0hTQ1JFRU5fQURTNzg0NiBpcyBub3Qgc2V0CiBDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc3PW0KKyMgQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OV9JMkMgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5X1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzkgaXMgbm90IHNldAogIyBDT05GSUdfVE9VQ0hTQ1JFRU5fRlVKSVRTVSBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9HVU5aRSBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9FTE8gaXMgbm90IHNldAogIyBDT05GSUdfVE9VQ0hTQ1JFRU5fTVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0lORVhJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9NSzcxMiBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9QRU5NT1VOVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSFJJR0hUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPVUNIU0NSRUVOX1RPVUNIV0lOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RPVUNIU0NSRUVOX1VDQjE0MDAgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fV005N1hYIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPVUNIU0NSRUVOX1VTQl9DT01QT1NJVEUgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVE9VQ0hJVDIxMyBpcyBub3Qgc2V0CiBDT05GSUdfSU5QVVRfTUlTQz15CiAjIENPTkZJR19JTlBVVF9BVElfUkVNT1RFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX0FUSV9SRU1PVEUyIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX0tFWVNQQU5fUkVNT1RFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX1BPV0VSTUFURSBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9ZRUFMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0NNMTA5IGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX1VJTlBVVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19UV0lfS0VZUEFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTkZJR19JTlBVVF9QQ0Y4NTc0IGlzIG5vdCBzZXQKIAogIwogIyBIYXJkd2FyZSBJL08gcG9ydHMKQEAgLTgxNSwxNiArODQ1LDE4IEBACiAjIENPTkZJR19CRjV4eF9QUElGQ0QgaXMgbm90IHNldAogIyBDT05GSUdfQkZJTl9TSU1QTEVfVElNRVIgaXMgbm90IHNldAogIyBDT05GSUdfQkY1eHhfUFBJIGlzIG5vdCBzZXQKLUNPTkZJR19CRklOX09UUD15Ci0jIENPTkZJR19CRklOX09UUF9XUklURV9FTkFCTEUgaXMgbm90IHNldAogIyBDT05GSUdfQkZJTl9TUE9SVCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRklOX1RJTUVSX0xBVEVOQ1kgaXMgbm90IHNldAogIyBDT05GSUdfVFdJX0xDRCBpcyBub3Qgc2V0CitDT05GSUdfQkZJTl9ETUFfSU5URVJGQUNFPW0KIENPTkZJR19TSU1QTEVfR1BJTz1tCiBDT05GSUdfVlQ9eQorQ09ORklHX0NPTlNPTEVfVFJBTlNMQVRJT05TPXkKIENPTkZJR19WVF9DT05TT0xFPXkKIENPTkZJR19IV19DT05TT0xFPXkKICMgQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZLTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGSU5fSlRBR19DT01NIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CiAKICMKQEAgLTg0OSw2ICs4ODEsOCBAQAogIyBDT05GSUdfU0VSSUFMX0JGSU5fU1BPUlQgaXMgbm90IHNldAogQ09ORklHX1VOSVg5OF9QVFlTPXkKICMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKK0NPTkZJR19CRklOX09UUD15CisjIENPTkZJR19CRklOX09UUF9XUklURV9FTkFCTEUgaXMgbm90IHNldAogCiAjCiAjIENBTiwgdGhlIGNhciBidXMgYW5kIGluZHVzdHJpYWwgZmllbGRidXMKQEAgLTg1Niw0NCArODkwLDQ5IEBACiAjIENPTkZJR19DQU40TElOVVggaXMgbm90IHNldAogIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKICMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKICMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CiBDT05GSUdfSTJDPXkKIENPTkZJR19JMkNfQk9BUkRJTkZPPXkKIENPTkZJR19JMkNfQ0hBUkRFVj15Ci0KLSMKLSMgSTJDIEFsZ29yaXRobXMKLSMKLSMgQ09ORklHX0kyQ19BTEdPQklUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTEdPUENGIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTEdPUENBIGlzIG5vdCBzZXQKK0NPTkZJR19JMkNfSEVMUEVSX0FVVE89eQogCiAjCiAjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAogIworCisjCisjIEkyQyBzeXN0ZW0gYnVzIGRyaXZlcnMgKG1vc3RseSBlbWJlZGRlZCAvIHN5c3RlbS1vbi1jaGlwKQorIwogQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0k9eQotQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfQ0xLX0tIWj01MAorQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfQ0xLX0tIWj0xMDAKICMgQ09ORklHX0kyQ19HUElPIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1NJTVRFQyBpcyBub3Qgc2V0CisKKyMKKyMgRXh0ZXJuYWwgSTJDL1NNQnVzIGFkYXB0ZXIgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1RBT1NfRVZNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19USU5ZX1VTQiBpcyBub3Qgc2V0CiAKICMKKyMgT3RoZXIgSTJDL1NNQnVzIGJ1cyBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfUENBX1BMQVRGT1JNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKKworIwogIyBNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQKICMKLSMgQ09ORklHX1NFTlNPUlNfRFMxMzM3IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfRFMxMzc0IGlzIG5vdCBzZXQKICMgQ09ORklHX0RTMTY4MiBpcyBub3Qgc2V0CisjIENPTkZJR19BVDI0IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQUQ1MjUyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRUVQUk9NIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDRjg1NzUgaXMgbm90IHNldAorIyBDT05GSUdfUENGODU3NSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTUFYNjg3NSBpcyBub3Qgc2V0CkBAIC05MDIsMTcgKzk0MSwxNSBAQAogIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0Ci0KLSMKLSMgU1BJIHN1cHBvcnQKLSMKIENPTkZJR19TUEk9eQorIyBDT05GSUdfU1BJX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19TUElfTUFTVEVSPXkKIAogIwogIyBTUEkgTWFzdGVyIENvbnRyb2xsZXIgRHJpdmVycwogIwogQ09ORklHX1NQSV9CRklOPXkKKyMgQ09ORklHX1NQSV9CRklOX0xPQ0sgaXMgbm90IHNldAogIyBDT05GSUdfU1BJX0JJVEJBTkcgaXMgbm90IHNldAogCiAjCkBAIC05MjEsMTEgKzk1OCwxNSBAQAogIyBDT05GSUdfU1BJX0FUMjUgaXMgbm90IHNldAogIyBDT05GSUdfU1BJX1NQSURFViBpcyBub3Qgc2V0CiAjIENPTkZJR19TUElfVExFNjJYMCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUI9eQorIyBDT05GSUdfR1BJT0xJQiBpcyBub3Qgc2V0CiAjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAogQ09ORklHX0hXTU9OPXkKICMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FENzQxNCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FENzQxOCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FEQ1hYIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKQEAgLTkzMyw2ICs5NzQsNyBAQAogIyBDT05GSUdfU0VOU09SU19BRE0xMDMxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNOTI0MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FEVDc0NzAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRFQ3NDczIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQVRYUDEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19EUzE2MjEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GNzE4MDVGIGlzIG5vdCBzZXQKQEAgLTk1Myw2ICs5OTUsNyBAQAogIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTE05MiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0xNOTMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVgxMTExIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTUFYMTYxOSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX01BWDY2NTAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKQEAgLTk2MSw2ICsxMDA0LDcgQEAKICMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMTkyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FEUzc4MjggaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19USE1DNTAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19WVDEyMTEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKQEAgLTk2OCw5ICsxMDEyLDEyIEBACiAjIENPTkZJR19TRU5TT1JTX1c4Mzc5MkQgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM3OTMgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODNMNzg1VFMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODNMNzg2TkcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0VIRiBpcyBub3Qgc2V0CiAjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTF9IV01PTiBpcyBub3Qgc2V0CiBDT05GSUdfV0FUQ0hET0c9eQogIyBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgaXMgbm90IHNldAogCkBAIC05ODYsMjMgKzEwMzMsMzAgQEAKICMgQ09ORklHX1VTQlBDV0FUQ0hET0cgaXMgbm90IHNldAogCiAjCi0jIFNvbmljcyBTaWxpY29uIEJhY2twbGFuZQotIwotQ09ORklHX1NTQl9QT1NTSUJMRT15Ci0jIENPTkZJR19TU0IgaXMgbm90IHNldAotCi0jCiAjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKICMKKyMgQ09ORklHX01GRF9DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTg0MDAgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODM1MF9JMkMgaXMgbm90IHNldAogCiAjCiAjIE11bHRpbWVkaWEgZGV2aWNlcwogIworCisjCisjIE11bHRpbWVkaWEgY29yZSBzdXBwb3J0CisjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAogIyBDT05GSUdfRFZCX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fTUVESUEgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZHJpdmVycworIwogIyBDT05GSUdfREFCIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9EQUJVU0IgaXMgbm90IHNldAogCiAjCiAjIEdyYXBoaWNzIHN1cHBvcnQKQEAgLTEwMTIsNiArMTA2Niw3IEBACiBDT05GSUdfRkI9eQogQ09ORklHX0ZJUk1XQVJFX0VESUQ9eQogIyBDT05GSUdfRkJfRERDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0JPT1RfVkVTQV9TVVBQT1JUIGlzIG5vdCBzZXQKIENPTkZJR19GQl9DRkJfRklMTFJFQ1Q9eQogQ09ORklHX0ZCX0NGQl9DT1BZQVJFQT15CiBDT05GSUdfRkJfQ0ZCX0lNQUdFQkxJVD15CkBAIC0xMDE5LDggKzEwNzQsOCBAQAogIyBDT05GSUdfRkJfU1lTX0ZJTExSRUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1NZU19DT1BZQVJFQSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9TWVNfSU1BR0VCTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0ZPUkVJR05fRU5ESUFOIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1NZU19GT1BTIGlzIG5vdCBzZXQKLUNPTkZJR19GQl9ERUZFUlJFRF9JTz15CiAjIENPTkZJR19GQl9TVkdBTElCIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX01BQ01PREVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0JBQ0tMSUdIVCBpcyBub3Qgc2V0CkBAIC0xMDMyLDkgKzEwODcsMTEgQEAKICMKIENPTkZJR19GQl9CRjU0WF9MUTA0Mz15CiAjIENPTkZJR19GQl9CRklOX1QzNTBNQ1FCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0JGSU5fTFEwMzVRMSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9CRklOXzczOTMgaXMgbm90IHNldAogIyBDT05GSUdfRkJfUzFEMTNYWFggaXMgbm90IHNldAogIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9NRVRST05PTUUgaXMgbm90IHNldAogIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKIAogIwpAQCAtMTA2NiwxNSArMTEyMyw4IEBACiAjIENPTkZJR19MT0dPX0xJTlVYX0NMVVQyMjQgaXMgbm90IHNldAogIyBDT05GSUdfTE9HT19CTEFDS0ZJTl9WR0ExNiBpcyBub3Qgc2V0CiBDT05GSUdfTE9HT19CTEFDS0ZJTl9DTFVUMjI0PXkKLQotIwotIyBTb3VuZAotIwogQ09ORklHX1NPVU5EPXkKLQotIwotIyBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUKLSMKK0NPTkZJR19TT1VORF9PU1NfQ09SRT15CiBDT05GSUdfU05EPXkKIENPTkZJR19TTkRfVElNRVI9eQogQ09ORklHX1NORF9QQ009eQpAQCAtMTA4OCw1NiArMTEzOCwzNSBAQAogQ09ORklHX1NORF9WRVJCT1NFX1BST0NGUz15CiAjIENPTkZJR19TTkRfVkVSQk9TRV9QUklOVEsgaXMgbm90IHNldAogIyBDT05GSUdfU05EX0RFQlVHIGlzIG5vdCBzZXQKLQotIwotIyBHZW5lcmljIGRldmljZXMKLSMKK0NPTkZJR19TTkRfRFJJVkVSUz15CiAjIENPTkZJR19TTkRfRFVNTVkgaXMgbm90IHNldAogIyBDT05GSUdfU05EX01UUEFWIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9TRVJJQUxfVTE2NTUwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9NUFU0MDEgaXMgbm90IHNldAotCi0jCi0jIFNQSSBkZXZpY2VzCi0jCitDT05GSUdfU05EX1NQST15CiAKICMKICMgQUxTQSBCbGFja2ZpbiBkZXZpY2VzCiAjCiAjIENPTkZJR19TTkRfQkxBQ0tGSU5fQUQxODM2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9CRklOX0FENzMzMTEgaXMgbm90IHNldAogIyBDT05GSUdfU05EX0JGSU5fQUQ3MzMyMiBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIGRldmljZXMKLSMKK0NPTkZJR19TTkRfVVNCPXkKICMgQ09ORklHX1NORF9VU0JfQVVESU8gaXMgbm90IHNldAogIyBDT05GSUdfU05EX1VTQl9DQUlBUSBpcyBub3Qgc2V0Ci0KLSMKLSMgU3lzdGVtIG9uIENoaXAgYXVkaW8gc3VwcG9ydAotIwotQ09ORklHX1NORF9TT0NfQUM5N19CVVM9eQogQ09ORklHX1NORF9TT0M9eQotQ09ORklHX1NORF9CRjVYWF9TT0M9eQotQ09ORklHX1NORF9NTUFQX1NVUFBPUlQ9eQorQ09ORklHX1NORF9TT0NfQUM5N19CVVM9eQorIyBDT05GSUdfU05EX0JGNVhYX0kyUyBpcyBub3Qgc2V0CitDT05GSUdfU05EX0JGNVhYX0FDOTc9eQorQ09ORklHX1NORF9CRjVYWF9NTUFQX1NVUFBPUlQ9eQorIyBDT05GSUdfU05EX0JGNVhYX01VTFRJQ0hBTl9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfQkY1WFhfU09DX1NQT1JUPXkKIENPTkZJR19TTkRfQkY1WFhfU09DX0FDOTc9eQotQ09ORklHX1NORF9CRjVYWF9TT0NfQkY1NDhfRVpLSVQ9eQotIyBDT05GSUdfU05EX0JGNVhYX1NPQ19XTTg3NTAgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0JGNVhYX1NPQ19XTTg3MzEgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0JGNVhYX1NPQ19TU00yNjAyIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfQkY1WFhfU09DX0FEMTk4MD15CiBDT05GSUdfU05EX0JGNVhYX1NQT1JUX05VTT0wCiBDT05GSUdfU05EX0JGNVhYX0hBVkVfQ09MRF9SRVNFVD15CiBDT05GSUdfU05EX0JGNVhYX1JFU0VUX0dQSU9fTlVNPTE5Ci0KLSMKLSMgU29DIEF1ZGlvIHN1cHBvcnQgZm9yIFN1cGVySAotIworIyBDT05GSUdfU05EX1NPQ19BTExfQ09ERUNTIGlzIG5vdCBzZXQKIENPTkZJR19TTkRfU09DX0FEMTk4MD15Ci0KLSMKLSMgT3BlbiBTb3VuZCBTeXN0ZW0KLSMKICMgQ09ORklHX1NPVU5EX1BSSU1FIGlzIG5vdCBzZXQKIENPTkZJR19BQzk3X0JVUz15CiBDT05GSUdfSElEX1NVUFBPUlQ9eQpAQCAtMTE0OSwxNSArMTE3OCw0MyBAQAogIyBVU0IgSW5wdXQgRGV2aWNlcwogIwogQ09ORklHX1VTQl9ISUQ9eQotIyBDT05GSUdfVVNCX0hJRElOUFVUX1BPV0VSQk9PSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ISURfRkYgaXMgbm90IHNldAorIyBDT05GSUdfSElEX1BJRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSElEREVWIGlzIG5vdCBzZXQKKworIworIyBTcGVjaWFsIEhJRCBkcml2ZXJzCisjCitDT05GSUdfSElEX0NPTVBBVD15CitDT05GSUdfSElEX0E0VEVDSD15CitDT05GSUdfSElEX0FQUExFPXkKK0NPTkZJR19ISURfQkVMS0lOPXkKK0NPTkZJR19ISURfQlJJR0hUPXkKK0NPTkZJR19ISURfQ0hFUlJZPXkKK0NPTkZJR19ISURfQ0hJQ09OWT15CitDT05GSUdfSElEX0NZUFJFU1M9eQorQ09ORklHX0hJRF9ERUxMPXkKK0NPTkZJR19ISURfRVpLRVk9eQorQ09ORklHX0hJRF9HWVJBVElPTj15CitDT05GSUdfSElEX0xPR0lURUNIPXkKKyMgQ09ORklHX0xPR0lURUNIX0ZGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPR0lSVU1CTEVQQUQyX0ZGIGlzIG5vdCBzZXQKK0NPTkZJR19ISURfTUlDUk9TT0ZUPXkKK0NPTkZJR19ISURfTU9OVEVSRVk9eQorQ09ORklHX0hJRF9QQU5USEVSTE9SRD15CisjIENPTkZJR19QQU5USEVSTE9SRF9GRiBpcyBub3Qgc2V0CitDT05GSUdfSElEX1BFVEFMWU5YPXkKK0NPTkZJR19ISURfU0FNU1VORz15CitDT05GSUdfSElEX1NPTlk9eQorQ09ORklHX0hJRF9TVU5QTFVTPXkKK0NPTkZJR19USFJVU1RNQVNURVJfRkY9bQorQ09ORklHX1pFUk9QTFVTX0ZGPW0KIENPTkZJR19VU0JfU1VQUE9SVD15CiBDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CiAjIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDSSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfQVJDSF9IQVNfRUhDSSBpcyBub3Qgc2V0CiBDT05GSUdfVVNCPXkKICMgQ09ORklHX1VTQl9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQU5OT1VOQ0VfTkVXX0RFVklDRVMgaXMgbm90IHNldAogCiAjCiAjIE1pc2NlbGxhbmVvdXMgVVNCIG9wdGlvbnMKQEAgLTExNjgsMTUgKzEyMjUsMjAgQEAKICMgQ09ORklHX1VTQl9PVEcgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX09UR19XSElURUxJU1QgaXMgbm90IHNldAogQ09ORklHX1VTQl9PVEdfQkxBQ0tMSVNUX0hVQj15CitDT05GSUdfVVNCX01PTj15CisjIENPTkZJR19VU0JfV1VTQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfV1VTQl9DQkFGIGlzIG5vdCBzZXQKIAogIwogIyBVU0IgSG9zdCBDb250cm9sbGVyIERyaXZlcnMKICMKKyMgQ09ORklHX1VTQl9DNjdYMDBfSENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9JU1AxMTZYX0hDRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfSVNQMTM2Ml9IQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lTUDE3NjBfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JU1AxMzYyX0hDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU0w4MTFfSENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9SOEE2NjU5N19IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0hXQV9IQ0QgaXMgbm90IHNldAogQ09ORklHX1VTQl9NVVNCX0hEUkM9eQogQ09ORklHX1VTQl9NVVNCX1NPQz15CiAKQEAgLTExOTAsMTMgKzEyNTIsMTUgQEAKICMgQ09ORklHX01VU0JfUElPX09OTFkgaXMgbm90IHNldAogQ09ORklHX1VTQl9JTlZFTlRSQV9ETUE9eQogIyBDT05GSUdfVVNCX1RJX0NQUElfRE1BIGlzIG5vdCBzZXQKLUNPTkZJR19VU0JfTVVTQl9MT0dMRVZFTD0wCisjIENPTkZJR19VU0JfTVVTQl9ERUJVRyBpcyBub3Qgc2V0CiAKICMKICMgVVNCIERldmljZSBDbGFzcyBkcml2ZXJzCiAjCiAjIENPTkZJR19VU0JfQUNNIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9QUklOVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9XRE0gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RNQyBpcyBub3Qgc2V0CiAKICMKICMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JwpAQCAtMTIxOCw2ICsxMjgyLDcgQEAKICMgQ09ORklHX1VTQl9TVE9SQUdFX0FMQVVEQSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU1RPUkFHRV9PTkVUT1VDSCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU1RPUkFHRV9LQVJNQSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9DWVBSRVNTX0FUQUNCIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9MSUJVU1VBTCBpcyBub3Qgc2V0CiAKICMKQEAgLTEyMjUsMTUgKzEyOTAsMTAgQEAKICMKICMgQ09ORklHX1VTQl9NREM4MDAgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX01JQ1JPVEVLIGlzIG5vdCBzZXQKLUNPTkZJR19VU0JfTU9OPXkKIAogIwogIyBVU0IgcG9ydCBkcml2ZXJzCiAjCi0KLSMKLSMgVVNCIFNlcmlhbCBDb252ZXJ0ZXIgc3VwcG9ydAotIwogIyBDT05GSUdfVVNCX1NFUklBTCBpcyBub3Qgc2V0CiAKICMKQEAgLTEyNDIsNyArMTMwMiw3IEBACiAjIENPTkZJR19VU0JfRU1JNjIgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0VNSTI2IGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9BRFVUVVggaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0FVRVJTV0FMRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VWU0VHIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9SSU81MDAgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0xFR09UT1dFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfTENEIGlzIG5vdCBzZXQKQEAgLTEyNTgsMzQgKzEzMTgsMzEgQEAKICMgQ09ORklHX1VTQl9MRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfVFJBTkNFVklCUkFUT1IgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lPV0FSUklPUiBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIERTTCBtb2RlbSBzdXBwb3J0Ci0jCi0KLSMKLSMgVVNCIEdhZGdldCBTdXBwb3J0Ci0jCisjIENPTkZJR19VU0JfSVNJR0hURlcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1ZTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKIENPTkZJR19NTUM9bQogIyBDT05GSUdfTU1DX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX01NQ19VTlNBRkVfUkVTVU1FIGlzIG5vdCBzZXQKIAogIwotIyBNTUMvU0QgQ2FyZCBEcml2ZXJzCisjIE1NQy9TRC9TRElPIENhcmQgRHJpdmVycwogIwogQ09ORklHX01NQ19CTE9DSz1tCiBDT05GSUdfTU1DX0JMT0NLX0JPVU5DRT15CiAjIENPTkZJR19TRElPX1VBUlQgaXMgbm90IHNldAorIyBDT05GSUdfTU1DX1RFU1QgaXMgbm90IHNldAogCiAjCi0jIE1NQy9TRCBIb3N0IENvbnRyb2xsZXIgRHJpdmVycworIyBNTUMvU0QvU0RJTyBIb3N0IENvbnRyb2xsZXIgRHJpdmVycwogIworIyBDT05GSUdfTU1DX1NESENJIGlzIG5vdCBzZXQKIENPTkZJR19TREhfQkZJTj1tCiAjIENPTkZJR19TREhfQkZJTl9NSVNTSU5HX0NNRF9QVUxMVVBfV09SS0FST1VORCBpcyBub3Qgc2V0CiAjIENPTkZJR19NTUNfU1BJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQSV9NTUMgaXMgbm90IHNldAorIyBDT05GSUdfTUVNU1RJQ0sgaXMgbm90IHNldAogIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAorIyBDT05GSUdfQUNDRVNTSUJJTElUWSBpcyBub3Qgc2V0CiBDT05GSUdfUlRDX0xJQj15CiBDT05GSUdfUlRDX0NMQVNTPXkKIENPTkZJR19SVENfSENUT1NZUz15CkBAIC0xMzE0LDMyICsxMzcxLDQwIEBACiAjIENPTkZJR19SVENfRFJWX1BDRjg1NjMgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9QQ0Y4NTgzIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfTTQxVDgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUzM1MzkwQSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0ZNMzEzMCBpcyBub3Qgc2V0CiAKICMKICMgU1BJIFJUQyBkcml2ZXJzCiAjCi0jIENPTkZJR19SVENfRFJWX1JTNUMzNDggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDFUOTQgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzEzMDUgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9NQVg2OTAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUjk3MDEgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SUzVDMzQ4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMzMjM0IGlzIG5vdCBzZXQKIAogIwogIyBQbGF0Zm9ybSBSVEMgZHJpdmVycwogIworIyBDT05GSUdfUlRDX0RSVl9EUzEyODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE1MTEgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9EUzE1NTMgaXMgbm90IHNldAotIyBDT05GSUdfUlRDX0RSVl9TVEsxN1RBOCBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX0RTMTc0MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1NUSzE3VEE4IGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfTTQ4VDg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDM1IGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfTTQ4VDU5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfQlE0ODAyIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfVjMwMjAgaXMgbm90IHNldAogCiAjCiAjIG9uLUNQVSBSVEMgZHJpdmVycwogIwogQ09ORklHX1JUQ19EUlZfQkZJTj15Ci0KLSMKLSMgVXNlcnNwYWNlIEkvTwotIworIyBDT05GSUdfRE1BREVWSUNFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VSU8gaXMgbm90IHNldAorIyBDT05GSUdfU1RBR0lORyBpcyBub3Qgc2V0CiAKICMKICMgRmlsZSBzeXN0ZW1zCkBAIC0xMzUyLDIyICsxNDE3LDIwIEBACiBDT05GSUdfRVhUM19GU19YQVRUUj15CiAjIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNF9GUyBpcyBub3Qgc2V0CiBDT05GSUdfSkJEPXkKICMgQ09ORklHX0pCRF9ERUJVRyBpcyBub3Qgc2V0CiBDT05GSUdfRlNfTUJDQUNIRT15CiAjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKK0NPTkZJR19GSUxFX0xPQ0tJTkc9eQogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5PVElGWT15CiBDT05GSUdfSU5PVElGWV9VU0VSPXkKICMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAogIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CkBAIC0xNDE0LDExICsxNDc3LDExIEBACiAjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAogQ09ORklHX1lBRkZTX0ZTPW0KIENPTkZJR19ZQUZGU19ZQUZGUzE9eQorIyBDT05GSUdfWUFGRlNfOUJZVEVfVEFHUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ZQUZGU19ET0VTX0VDQyBpcyBub3Qgc2V0CiBDT05GSUdfWUFGRlNfWUFGRlMyPXkKIENPTkZJR19ZQUZGU19BVVRPX1lBRkZTMj15CiAjIENPTkZJR19ZQUZGU19ESVNBQkxFX0xBWllfTE9BRCBpcyBub3Qgc2V0Ci1DT05GSUdfWUFGRlNfQ0hFQ0tQT0lOVF9SRVNFUlZFRF9CTE9DS1M9MTAKICMgQ09ORklHX1lBRkZTX0RJU0FCTEVfV0lERV9UTk9ERVMgaXMgbm90IHNldAogIyBDT05GSUdfWUFGRlNfQUxXQVlTX0NIRUNLX0NIVU5LX0VSQVNFRCBpcyBub3Qgc2V0CiBDT05GSUdfWUFGRlNfU0hPUlRfTkFNRVNfSU5fUkFNPXkKQEAgLTE0MzUsOCArMTQ5OCwxMSBAQAogIyBDT05GSUdfSkZGUzJfUlVCSU4gaXMgbm90IHNldAogIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CkBAIC0xNDQ0LDE4ICsxNTEwLDE2IEBACiBDT05GSUdfTkZTX1YzPXkKICMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CiBDT05GSUdfTkZTRD1tCiBDT05GSUdfTkZTRF9WMz15CiAjIENPTkZJR19ORlNEX1YzX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNEX1Y0IGlzIG5vdCBzZXQKLUNPTkZJR19ORlNEX1RDUD15CiBDT05GSUdfTE9DS0Q9bQogQ09ORklHX0xPQ0tEX1Y0PXkKIENPTkZJR19FWFBPUlRGUz1tCiBDT05GSUdfTkZTX0NPTU1PTj15CiBDT05GSUdfU1VOUlBDPW0KLSMgQ09ORklHX1NVTlJQQ19CSU5EMzQgaXMgbm90IHNldAorIyBDT05GSUdfU1VOUlBDX1JFR0lTVEVSX1Y0IGlzIG5vdCBzZXQKICMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CiAjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKIENPTkZJR19TTUJfRlM9bQpAQCAtMTUzMyw5ICsxNTk3LDYgQEAKIENPTkZJR19OTFNfS09JOF9VPW0KIENPTkZJR19OTFNfVVRGOD1tCiAjIENPTkZJR19ETE0gaXMgbm90IHNldAotQ09ORklHX0lOU1RSVU1FTlRBVElPTj15Ci0jIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAotIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiAKICMKICMgS2VybmVsIGhhY2tpbmcKQEAgLTE1NDMsMTQgKzE2MDQsNTMgQEAKICMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKIENPTkZJR19FTkFCTEVfV0FSTl9ERVBSRUNBVEVEPXkKIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CitDT05GSUdfRlJBTUVfV0FSTj0xMDI0CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfRlM9eQogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CisjIENPTkZJR19ERUJVR19TSElSUSBpcyBub3Qgc2V0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUMgaXMgbm90IHNldAorQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDX1ZBTFVFPTAKK0NPTkZJR19TQ0hFRF9ERUJVRz15CisjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJTUVSX1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX09CSkVDVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0lORk89eQorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfV1JJVEVDT1VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NRU1PUllfSU5JVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZSQU1FX1BPSU5URVIgaXMgbm90IHNldAorIyBDT05GSUdfQk9PVF9QUklOVEtfREVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQkxPQ0tfRVhUX0RFVlQgaXMgbm90IHNldAorIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RZTkFNSUNfUFJJTlRLX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKKyMgQ09ORklHX0tHREIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfVkVSQk9TRT15CiBDT05GSUdfREVCVUdfTU1SUz15CisjIENPTkZJR19ERUJVR19IV0VSUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ET1VCTEVGQVVMVCBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfSFVOVF9GT1JfWkVSTz15CiBDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX09OPXkKIENPTkZJR19ERUJVR19CRklOX0hXVFJBQ0VfQ09NUFJFU1NJT05fT0ZGPXkKQEAgLTE1NjgsMTAgKzE2NjgsOTUgQEAKICMKICMgQ09ORklHX0tFWVMgaXMgbm90IHNldAogQ09ORklHX1NFQ1VSSVRZPXkKKyMgQ09ORklHX1NFQ1VSSVRZRlMgaXMgbm90IHNldAogIyBDT05GSUdfU0VDVVJJVFlfTkVUV09SSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRUNVUklUWV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlfRklMRV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAogIyBDT05GSUdfU0VDVVJJVFlfUk9PVFBMVUcgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKK0NPTkZJR19TRUNVUklUWV9ERUZBVUxUX01NQVBfTUlOX0FERFI9MAorQ09ORklHX0NSWVBUTz15CisKKyMKKyMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCisjCisjIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUFOQUdFUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NSWVBURCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVVUSEVOQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgQXV0aGVudGljYXRlZCBFbmNyeXB0aW9uIHdpdGggQXNzb2NpYXRlZCBEYXRhCisjCisjIENPTkZJR19DUllQVE9fQ0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUUlWIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBtb2RlcworIworIyBDT05GSUdfQ1JZUFRPX0NCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1RSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DVFMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0VDQiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTFJXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19QQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19YVFMgaXMgbm90IHNldAorCisjCisjIEhhc2ggbW9kZXMKKyMKKyMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKKworIworIyBEaWdlc3QKKyMKKyMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxNjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMzIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19XUDUxMiBpcyBub3Qgc2V0CisKKyMKKyMgQ2lwaGVycworIworIyBDT05GSUdfQ1JZUFRPX0FFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQU5VQklTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BUkM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FNRUxMSUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fREVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19GQ1JZUFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0tIQVpBRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0FMU0EyMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VFRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UV09GSVNIIGlzIG5vdCBzZXQKKworIworIyBDb21wcmVzc2lvbgorIworIyBDT05GSUdfQ1JZUFRPX0RFRkxBVEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0xaTyBpcyBub3Qgc2V0CisKKyMKKyMgUmFuZG9tIE51bWJlciBHZW5lcmF0aW9uCisjCisjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0hXPXkKIAogIwogIyBMaWJyYXJ5IHJvdXRpbmVzCkBAIC0xNTc5LDYgKzE3NjQsNyBAQAogQ09ORklHX0JJVFJFVkVSU0U9eQogQ09ORklHX0NSQ19DQ0lUVD1tCiAjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfVDEwRElGIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDMzI9eQogIyBDT05GSUdfQ1JDNyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1NjEtRVpLSVRfZGVmY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTYxLUVaS0lUX2RlZmNvbmZpZwppbmRleCAzYzcwZDYyLi4xZWNiN2EzIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1NjEtRVpLSVRfZGVmY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjU2MS1FWktJVF9kZWZjb25maWcKQEAgLTEsNiArMSw2IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjQuNworIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI4LXJjMgogIwogIyBDT05GSUdfTU1VIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZQVSBpcyBub3Qgc2V0CkBAIC04LDcgKzgsNiBAQAogIyBDT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE0gaXMgbm90IHNldAogQ09ORklHX0JMQUNLRklOPXkKIENPTkZJR19aT05FX0RNQT15Ci1DT05GSUdfU0VNQVBIT1JFX1NMRUVQRVJTPXkKIENPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQogQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CkBAIC0zMSwxOCArMzAsMTYgQEAKICMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CiAjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0VSX05TIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BJRF9OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CiBDT05GSUdfSUtDT05GSUc9eQogQ09ORklHX0lLQ09ORklHX1BST0M9eQogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKICMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAotQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQ9eQotQ09ORklHX0ZBSVJfVVNFUl9TQ0hFRD15Ci0jIENPTkZJR19GQUlSX0NHUk9VUF9TQ0hFRCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CisjIENPTkZJR19HUk9VUF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNGU19ERVBSRUNBVEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjIgaXMgbm90IHNldAogIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfTkFNRVNQQUNFUyBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQogQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKICMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKQEAgLTUxLDI2ICs0OCwzNSBAQAogQ09ORklHX1VJRDE2PXkKIENPTkZJR19TWVNDVExfU1lTQ0FMTD15CiBDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAogQ09ORklHX0hPVFBMVUc9eQogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKLUNPTkZJR19FTEZfQ09SRT15CisjIENPTkZJR19FTEZfQ09SRSBpcyBub3Qgc2V0CitDT05GSUdfQ09NUEFUX0JSSz15CiBDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15CiBDT05GSUdfQU5PTl9JTk9ERVM9eQogQ09ORklHX0VQT0xMPXkKIENPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CiBDT05GSUdfRVZFTlRGRD15CitDT05GSUdfQUlPPXkKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CiBDT05GSUdfU0xBQj15CiAjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfT1BST0ZJTEU9eQorIyBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVCBpcyBub3Qgc2V0CiBDT05GSUdfU0xBQklORk89eQogQ09ORklHX1JUX01VVEVYRVM9eQogQ09ORklHX1RJTllfU0hNRU09eQogQ09ORklHX0JBU0VfU01BTEw9MAogQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQgaXMgbm90IHNldAogQ09ORklHX01PRFVMRV9VTkxPQUQ9eQogIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CiAjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CkBAIC04MSw2ICs4Nyw3IEBACiAjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0xTRiBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CiAKICMKICMgSU8gU2NoZWR1bGVycwpAQCAtOTQsOSArMTAxLDExIEBACiAjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAogQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iYW50aWNpcGF0b3J5IgorQ09ORklHX0NMQVNTSUNfUkNVPXkKICMgQ09ORklHX1BSRUVNUFRfTk9ORSBpcyBub3Qgc2V0CiBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlk9eQogIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CisjIENPTkZJR19GUkVFWkVSIGlzIG5vdCBzZXQKIAogIwogIyBCbGFja2ZpbiBQcm9jZXNzb3IgT3B0aW9ucwpAQCAtMTA1LDYgKzExNCwxMCBAQAogIwogIyBQcm9jZXNzb3IgYW5kIEJvYXJkIFNldHRpbmdzCiAjCisjIENPTkZJR19CRjUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUxNCBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUxNiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUxOCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUyMiBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUyMyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUyNCBpcyBub3Qgc2V0CkBAIC0xMTcsMjQgKzEzMCwzOCBAQAogIyBDT05GSUdfQkY1MzQgaXMgbm90IHNldAogIyBDT05GSUdfQkY1MzYgaXMgbm90IHNldAogIyBDT05GSUdfQkY1MzcgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MzggaXMgbm90IHNldAorIyBDT05GSUdfQkY1MzkgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDIgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDQgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDcgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDggaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDkgaXMgbm90IHNldAogQ09ORklHX0JGNTYxPXkKKyMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CitDT05GSUdfQkZfUkVWX01JTj0zCitDT05GSUdfQkZfUkVWX01BWD01CiAjIENPTkZJR19CRl9SRVZfMF8wIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl8wXzEgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWXzBfMiBpcyBub3Qgc2V0CiBDT05GSUdfQkZfUkVWXzBfMz15CiAjIENPTkZJR19CRl9SRVZfMF80IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl8wXzUgaXMgbm90IHNldAorIyBDT05GSUdfQkZfUkVWXzBfNiBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfQU5ZIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl9OT05FIGlzIG5vdCBzZXQKIENPTkZJR19NRU1fTVQ0OExDMTZNMTZBMlRHXzc1PXkKIENPTkZJR19JUlFfUExMX1dBS0VVUD03CiBDT05GSUdfSVJRX1NQT1JUMF9FUlJPUj03CiBDT05GSUdfSVJRX1NQT1JUMV9FUlJPUj03CitDT05GSUdfSVJRX1RJTUVSMD0xMAorQ09ORklHX0lSUV9USU1FUjE9MTAKK0NPTkZJR19JUlFfVElNRVIyPTEwCitDT05GSUdfSVJRX1RJTUVSMz0xMAorQ09ORklHX0lSUV9USU1FUjQ9MTAKK0NPTkZJR19JUlFfVElNRVI1PTEwCitDT05GSUdfSVJRX1RJTUVSNj0xMAorQ09ORklHX0lSUV9USU1FUjc9MTAKIENPTkZJR19JUlFfU1BJX0VSUk9SPTcKIENPTkZJR19CRklONTYxX0VaS0lUPXkKICMgQ09ORklHX0JGSU41NjFfVEVQTEEgaXMgbm90IHNldApAQCAtMTQ4LDEwICsxNzUsNiBAQAogIwogIyBDb3JlIEIgU3VwcG9ydAogIwotCi0jCi0jIENvcmUgQiBTdXBwb3J0Ci0jCiBDT05GSUdfQkY1NjFfQ09SRUI9eQogQ09ORklHX0JGNTYxX0NPUkVCX1JFU0VUPXkKIApAQCAtMTkzLDE0ICsyMTYsNiBAQAogQ09ORklHX0lSUV9ETUEyXzk9OQogQ09ORklHX0lSUV9ETUEyXzEwPTkKIENPTkZJR19JUlFfRE1BMl8xMT05Ci1DT05GSUdfSVJRX1RJTUVSMD0xMAotQ09ORklHX0lSUV9USU1FUjE9MTAKLUNPTkZJR19JUlFfVElNRVIyPTEwCi1DT05GSUdfSVJRX1RJTUVSMz0xMAotQ09ORklHX0lSUV9USU1FUjQ9MTAKLUNPTkZJR19JUlFfVElNRVI1PTEwCi1DT05GSUdfSVJRX1RJTUVSNj0xMAotQ09ORklHX0lSUV9USU1FUjc9MTAKIENPTkZJR19JUlFfVElNRVI4PTEwCiBDT05GSUdfSVJRX1RJTUVSOT0xMAogQ09ORklHX0lSUV9USU1FUjEwPTEwCkBAIC0yMzAsNyArMjQ1LDYgQEAKICMKIENPTkZJR19DTEtJTl9IWj0zMDAwMDAwMAogIyBDT05GSUdfQkZJTl9LRVJORUxfQ0xPQ0sgaXMgbm90IHNldAotQ09ORklHX01BWF9NRU1fU0laRT01MTIKIENPTkZJR19NQVhfVkNPX0haPTYwMDAwMDAwMAogQ09ORklHX01JTl9WQ09fSFo9NTAwMDAwMDAKIENPTkZJR19NQVhfU0NMS19IWj0xMzMzMzMzMzMKQEAgLTI0NCw2ICsyNTgsNyBAQAogIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAogQ09ORklHX0haPTI1MAorQ09ORklHX1NDSEVEX0hSVElDSz15CiBDT05GSUdfR0VORVJJQ19USU1FPXkKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKICMgQ09ORklHX0NZQ0xFU19DTE9DS1NPVVJDRSBpcyBub3Qgc2V0CkBAIC0yODEsNiArMjk2LDEyIEBACiBDT05GSUdfQ0FDSEVMSU5FX0FMSUdORURfTDE9eQogIyBDT05GSUdfU1lTQ0FMTF9UQUJfTDEgaXMgbm90IHNldAogIyBDT05GSUdfQ1BMQl9TV0lUQ0hfVEFCX0wxIGlzIG5vdCBzZXQKK0NPTkZJR19BUFBfU1RBQ0tfTDE9eQorCisjCisjIFNwZWVkIE9wdGltaXphdGlvbnMKKyMKK0NPTkZJR19CRklOX0lOU19MT1dPVkVSSEVBRD15CiBDT05GSUdfUkFNS0VSTkVMPXkKICMgQ09ORklHX1JPTUtFUk5FTCBpcyBub3Qgc2V0CiBDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CkBAIC0yODksMTQgKzMxMCwxMyBAQAogIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CiBDT05GSUdfRkxBVE1FTT15CiBDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQotIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TUEFSU0VNRU1fVk1FTU1BUF9FTkFCTEUgaXMgbm90IHNldAorQ09ORklHX1BBR0VGTEFHU19FWFRFTkRFRD15CiBDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAogIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIWVNfQUREUl9UXzY0QklUIGlzIG5vdCBzZXQKIENPTkZJR19aT05FX0RNQV9GTEFHPTEKIENPTkZJR19WSVJUX1RPX0JVUz15CiAjIENPTkZJR19CRklOX0dQVElNRVJTIGlzIG5vdCBzZXQKLUNPTkZJR19CRklOX0RNQV81WFg9eQogIyBDT05GSUdfRE1BX1VOQ0FDSEVEXzRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0RNQV9VTkNBQ0hFRF8yTSBpcyBub3Qgc2V0CiBDT05GSUdfRE1BX1VOQ0FDSEVEXzFNPXkKQEAgLTMxMSw3ICszMzEsNyBAQAogIyBDT05GSUdfQkZJTl9JQ0FDSEVfTE9DSyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRklOX1dCIGlzIG5vdCBzZXQKIENPTkZJR19CRklOX1dUPXkKLUNPTkZJR19MMV9NQVhfUElFQ0U9MTYKKyMgQ09ORklHX0JGSU5fTDJfQ0FDSEVBQkxFIGlzIG5vdCBzZXQKICMgQ09ORklHX01QVSBpcyBub3Qgc2V0CiAKICMKQEAgLTM0NCw3ICszNjQsNiBAQAogIwogIyBCdXMgb3B0aW9ucyAoUENJLCBQQ01DSUEsIEVJU0EsIE1DQSwgSVNBKQogIwotIyBDT05GSUdfUENJIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKICMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CiAKQEAgLTM1NSwyMyArMzc0LDIwIEBACiBDT05GSUdfQklORk1UX0ZMQVQ9eQogQ09ORklHX0JJTkZNVF9aRkxBVD15CiAjIENPTkZJR19CSU5GTVRfU0hBUkVEX0ZMQVQgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9BT1VUIGlzIG5vdCBzZXQKICMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKIAogIwogIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKICMKICMgQ09ORklHX1BNIGlzIG5vdCBzZXQKLUNPTkZJR19TVVNQRU5EX1VQX1BPU1NJQkxFPXkKK0NPTkZJR19BUkNIX1NVU1BFTkRfUE9TU0lCTEU9eQogIyBDT05GSUdfUE1fV0FLRVVQX0JZX0dQSU8gaXMgbm90IHNldAogCiAjCiAjIENQVSBGcmVxdWVuY3kgc2NhbGluZwogIwogIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmtpbmcKLSMKIENPTkZJR19ORVQ9eQogCiAjCkBAIC0zODQsNiArNDAwLDcgQEAKICMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAogIyBDT05GSUdfWEZSTV9NSUdSQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fU1RBVElTVElDUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKIENPTkZJR19JTkVUPXkKICMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CkBAIC00MTMsOCArNDMwLDYgQEAKIENPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKICMgQ09ORklHX1RDUF9NRDVTSUcgaXMgbm90IHNldAogIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUTEFCRUwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CkBAIC00MjMsNiArNDM4LDcgQEAKICMgQ09ORklHX1RJUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRFNBIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAogIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKICMgQ09ORklHX0xMQzIgaXMgbm90IHNldApAQCAtNDM5LDYgKzQ1NSw3IEBACiAjCiAjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBTiBpcyBub3Qgc2V0CiBDT05GSUdfSVJEQT1tCiAKICMKQEAgLTQ3MSwyNCArNDg4LDE0IEBACiAjIENPTkZJR19ET05HTEUgaXMgbm90IHNldAogCiAjCi0jIE9sZCBTSVIgZGV2aWNlIGRyaXZlcnMKLSMKLSMgQ09ORklHX0lSUE9SVF9TSVIgaXMgbm90IHNldAotCi0jCi0jIE9sZCBTZXJpYWwgZG9uZ2xlIHN1cHBvcnQKLSMKLQotIwogIyBGSVIgZGV2aWNlIGRyaXZlcnMKICMKICMgQ09ORklHX0JUIGlzIG5vdCBzZXQKICMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcwotIworIyBDT05GSUdfUEhPTkVUIGlzIG5vdCBzZXQKK0NPTkZJR19XSVJFTEVTUz15CiAjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CitDT05GSUdfV0lSRUxFU1NfT0xEX1JFR1VMQVRPUlk9eQogIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CkBAIC01MDYsNiArNTEzLDggQEAKIENPTkZJR19TVEFOREFMT05FPXkKIENPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKICMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfREVWUkVTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CiBDT05GSUdfTVREPXkKQEAgLTUxNCw2ICs1MjMsNyBAQAogQ09ORklHX01URF9QQVJUSVRJT05TPXkKICMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKIENPTkZJR19NVERfQ01ETElORV9QQVJUUz15CisjIENPTkZJR19NVERfQVI3X1BBUlRTIGlzIG5vdCBzZXQKIAogIwogIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycwpAQCAtNTk1LDExICs2MDUsMTQgQEAKIENPTkZJR19CTEtfREVWX1JBTT15CiBDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKIENPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKLUNPTkZJR19CTEtfREVWX1JBTV9CTE9DS1NJWkU9MTAyNAorIyBDT05GSUdfQkxLX0RFVl9YSVAgaXMgbm90IHNldAogIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0CiBDT05GSUdfTUlTQ19ERVZJQ0VTPXkKICMgQ09ORklHX0VFUFJPTV85M0NYNiBpcyBub3Qgc2V0CisjIENPTkZJR19FTkNMT1NVUkVfU0VSVklDRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfSURFPXkKICMgQ09ORklHX0lERSBpcyBub3Qgc2V0CiAKICMKQEAgLTYxMiw3ICs2MjUsNiBAQAogIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKICMgQ09ORklHX01EIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZJQ0VTPXkKLSMgQ09ORklHX05FVERFVklDRVNfTVVMVElRVUVVRSBpcyBub3Qgc2V0CiAjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CiAjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ1ZMQU4gaXMgbm90IHNldApAQCAtNjI1LDExICs2MzcsMTQgQEAKIENPTkZJR19TTUM5MVg9eQogIyBDT05GSUdfU01TQzkxMVggaXMgbm90IHNldAogIyBDT05GSUdfRE05MDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQzI4SjYwIGlzIG5vdCBzZXQKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19aTUlJIGlzIG5vdCBzZXQKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19SR01JSSBpcyBub3Qgc2V0CiAjIENPTkZJR19JQk1fTkVXX0VNQUNfVEFIIGlzIG5vdCBzZXQKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19FTUFDNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CNDQgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX05PX0ZMT1dfQ1RSTCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NMUl9JQ0lOVFNUQVQgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DT01NT05fRVJSIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZfMTAwMD15CiAjIENPTkZJR19BWDg4MTgwIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZfMTAwMDA9eQpAQCAtNjM5LDEwICs2NTQsMTAgQEAKICMKICMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19JV0xXSUZJX0xFRFMgaXMgbm90IHNldAogIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CkBAIC02OTAsOCArNzA1LDExIEBACiAjIENPTkZJR19CRjV4eF9QUEkgaXMgbm90IHNldAogIyBDT05GSUdfQkZJTl9TUE9SVCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRklOX1RJTUVSX0xBVEVOQ1kgaXMgbm90IHNldAorQ09ORklHX0JGSU5fRE1BX0lOVEVSRkFDRT1tCiBDT05GSUdfU0lNUExFX0dQSU89bQogIyBDT05GSUdfVlQgaXMgbm90IHNldAorIyBDT05GSUdfREVWS01FTSBpcyBub3Qgc2V0CisjIENPTkZJR19CRklOX0pUQUdfQ09NTSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAogCiAjCkBAIC03MjAsMjIgKzczOCwxOSBAQAogIyBDT05GSUdfQ0FONExJTlVYIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAotIyBDT05GSUdfR0VOX1JUQyBpcyBub3Qgc2V0CiAjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CiAjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKICMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAogIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKLQotIwotIyBTUEkgc3VwcG9ydAotIwogQ09ORklHX1NQST15CisjIENPTkZJR19TUElfREVCVUcgaXMgbm90IHNldAogQ09ORklHX1NQSV9NQVNURVI9eQogCiAjCiAjIFNQSSBNYXN0ZXIgQ29udHJvbGxlciBEcml2ZXJzCiAjCiBDT05GSUdfU1BJX0JGSU49eQorIyBDT05GSUdfU1BJX0JGSU5fTE9DSyBpcyBub3Qgc2V0CiAjIENPTkZJR19TUElfQklUQkFORyBpcyBub3Qgc2V0CiAKICMKQEAgLTc0NCwxNCArNzU5LDE4IEBACiAjIENPTkZJR19TUElfQVQyNSBpcyBub3Qgc2V0CiAjIENPTkZJR19TUElfU1BJREVWIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQSV9UTEU2MlgwIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQj15CisjIENPTkZJR19HUElPTElCIGlzIG5vdCBzZXQKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKICMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CiBDT05GSUdfSFdNT049eQogIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURDWFggaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GNzE4MDVGIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRjcxODgyRkcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTE03MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDExMTEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUEM4NzQyNyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKQEAgLTc2MCw2ICs3NzksOCBAQAogIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0VIRiBpcyBub3Qgc2V0CiAjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTF9IV01PTiBpcyBub3Qgc2V0CiBDT05GSUdfV0FUQ0hET0c9eQogIyBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgaXMgbm90IHNldAogCkBAIC03NzAsMjEgKzc5MSwyOCBAQAogQ09ORklHX0JGSU5fV0RUPXkKIAogIwotIyBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUKLSMKLUNPTkZJR19TU0JfUE9TU0lCTEU9eQotIyBDT05GSUdfU1NCIGlzIG5vdCBzZXQKLQotIwogIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCiAjCisjIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAorIyBDT05GSUdfSFRDX1BBU0lDMyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004NDAwIGlzIG5vdCBzZXQKIAogIwogIyBNdWx0aW1lZGlhIGRldmljZXMKICMKKworIworIyBNdWx0aW1lZGlhIGNvcmUgc3VwcG9ydAorIwogIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKICMgQ09ORklHX0RWQl9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX01FRElBIGlzIG5vdCBzZXQKKworIworIyBNdWx0aW1lZGlhIGRyaXZlcnMKKyMKICMgQ09ORklHX0RBQiBpcyBub3Qgc2V0CiAKICMKQEAgLTc5OSw0MyArODI3LDQzIEBACiAjIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKICMKICMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgU291bmQKLSMKICMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKIENPTkZJR19ISURfU1VQUE9SVD15CiBDT05GSUdfSElEPW0KICMgQ09ORklHX0hJRF9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURSQVcgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NVUFBPUlQgaXMgbm90IHNldAotIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JUQ19DTEFTUyBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfUElEIGlzIG5vdCBzZXQKIAogIwotIyBVc2Vyc3BhY2UgSS9PCisjIFNwZWNpYWwgSElEIGRyaXZlcnMKICMKK0NPTkZJR19ISURfQ09NUEFUPXkKKyMgQ09ORklHX1VTQl9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisjIENPTkZJR19NRU1TVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CisjIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19DTEFTUyBpcyBub3Qgc2V0CisjIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFHSU5HIGlzIG5vdCBzZXQKIAogIwogIyBGaWxlIHN5c3RlbXMKICMKICMgQ09ORklHX0VYVDJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CitDT05GSUdfRklMRV9MT0NLSU5HPXkKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAogQ09ORklHX0lOT1RJRlk9eQogQ09ORklHX0lOT1RJRllfVVNFUj15CiAjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldApAQCAtODc1LDExICs5MDMsMTEgQEAKICMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CiBDT05GSUdfWUFGRlNfRlM9bQogQ09ORklHX1lBRkZTX1lBRkZTMT15CisjIENPTkZJR19ZQUZGU185QllURV9UQUdTIGlzIG5vdCBzZXQKICMgQ09ORklHX1lBRkZTX0RPRVNfRUNDIGlzIG5vdCBzZXQKIENPTkZJR19ZQUZGU19ZQUZGUzI9eQogQ09ORklHX1lBRkZTX0FVVE9fWUFGRlMyPXkKICMgQ09ORklHX1lBRkZTX0RJU0FCTEVfTEFaWV9MT0FEIGlzIG5vdCBzZXQKLUNPTkZJR19ZQUZGU19DSEVDS1BPSU5UX1JFU0VSVkVEX0JMT0NLUz0xMAogIyBDT05GSUdfWUFGRlNfRElTQUJMRV9XSURFX1ROT0RFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ZQUZGU19BTFdBWVNfQ0hFQ0tfQ0hVTktfRVJBU0VEIGlzIG5vdCBzZXQKIENPTkZJR19ZQUZGU19TSE9SVF9OQU1FU19JTl9SQU09eQpAQCAtODk2LDggKzkyNCwxMSBAQAogIyBDT05GSUdfSkZGUzJfUlVCSU4gaXMgbm90IHNldAogIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CkBAIC05MDUsMTMgKzkzNiwxMiBAQAogQ09ORklHX05GU19WMz15CiAjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAogIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CiBDT05GSUdfTE9DS0Q9bQogQ09ORklHX0xPQ0tEX1Y0PXkKIENPTkZJR19ORlNfQ09NTU9OPXkKIENPTkZJR19TVU5SUEM9bQotIyBDT05GSUdfU1VOUlBDX0JJTkQzNCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5SUENfUkVHSVNURVJfVjQgaXMgbm90IHNldAogIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKICMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAogQ09ORklHX1NNQl9GUz1tCkBAIC05NjcsOSArOTk3LDYgQEAKICMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAogIyBDT05GSUdfTkxTX1VURjggaXMgbm90IHNldAogIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKLUNPTkZJR19JTlNUUlVNRU5UQVRJT049eQotIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogCiAjCiAjIEtlcm5lbCBoYWNraW5nCkBAIC05NzcsMTQgKzEwMDQsNTMgQEAKICMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKIENPTkZJR19FTkFCTEVfV0FSTl9ERVBSRUNBVEVEPXkKIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CitDT05GSUdfRlJBTUVfV0FSTj0xMDI0CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfRlM9eQogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CisjIENPTkZJR19ERUJVR19TSElSUSBpcyBub3Qgc2V0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUMgaXMgbm90IHNldAorQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDX1ZBTFVFPTAKK0NPTkZJR19TQ0hFRF9ERUJVRz15CisjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJTUVSX1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX09CSkVDVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0lORk89eQorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfV1JJVEVDT1VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NRU1PUllfSU5JVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZSQU1FX1BPSU5URVIgaXMgbm90IHNldAorIyBDT05GSUdfQk9PVF9QUklOVEtfREVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQkxPQ0tfRVhUX0RFVlQgaXMgbm90IHNldAorIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RZTkFNSUNfUFJJTlRLX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKKyMgQ09ORklHX0tHREIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfVkVSQk9TRT15CiBDT05GSUdfREVCVUdfTU1SUz15CisjIENPTkZJR19ERUJVR19IV0VSUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ET1VCTEVGQVVMVCBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfSFVOVF9GT1JfWkVSTz15CiBDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX09OPXkKIENPTkZJR19ERUJVR19CRklOX0hXVFJBQ0VfQ09NUFJFU1NJT05fT0ZGPXkKQEAgLTk5NCw3ICsxMDYwLDYgQEAKICMgQ09ORklHX0RFQlVHX0JGSU5fSFdUUkFDRV9FWFBBTkQgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfQkZJTl9OT19LRVJOX0hXVFJBQ0UgaXMgbm90IHNldAogQ09ORklHX0VBUkxZX1BSSU5USz15Ci0jIENPTkZJR19EVUFMX0NPUkVfVEVTVF9NT0RVTEUgaXMgbm90IHNldAogQ09ORklHX0NQTEJfSU5GTz15CiBDT05GSUdfQUNDRVNTX0NIRUNLPXkKIApAQCAtMTAwMyw5ICsxMDY4LDk0IEBACiAjCiAjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKIENPTkZJR19TRUNVUklUWT15CisjIENPTkZJR19TRUNVUklUWUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFQ1VSSVRZX05FVFdPUksgaXMgbm90IHNldAotIyBDT05GSUdfU0VDVVJJVFlfQ0FQQUJJTElUSUVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWV9GSUxFX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0CitDT05GSUdfU0VDVVJJVFlfREVGQVVMVF9NTUFQX01JTl9BRERSPTAKK0NPTkZJR19DUllQVE89eQorCisjCisjIENyeXB0byBjb3JlIG9yIGhlbHBlcgorIworIyBDT05GSUdfQ1JZUFRPX0ZJUFMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01BTkFHRVIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DUllQVEQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FVVEhFTkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFU1QgaXMgbm90IHNldAorCisjCisjIEF1dGhlbnRpY2F0ZWQgRW5jcnlwdGlvbiB3aXRoIEFzc29jaWF0ZWQgRGF0YQorIworIyBDT05GSUdfQ1JZUFRPX0NDTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVFJViBpcyBub3Qgc2V0CisKKyMKKyMgQmxvY2sgbW9kZXMKKyMKKyMgQ09ORklHX0NSWVBUT19DQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NUUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19FQ0IgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0xSVyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUENCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fWFRTIGlzIG5vdCBzZXQKKworIworIyBIYXNoIG1vZGVzCisjCisjIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisKKyMKKyMgRGlnZXN0CisjCisjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDEyOCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDMyMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBMSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEE1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RHUjE5MiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fV1A1MTIgaXMgbm90IHNldAorCisjCisjIENpcGhlcnMKKyMKKyMgQ09ORklHX0NSWVBUT19BRVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FOVUJJUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVJDNCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQkxPV0ZJU0ggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBTUVMTElBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0RFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fRkNSWVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19LSEFaQUQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NBTFNBMjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFRUQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUlBFTlQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0CisKKyMKKyMgQ29tcHJlc3Npb24KKyMKKyMgQ09ORklHX0NSWVBUT19ERUZMQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19MWk8gaXMgbm90IHNldAorCisjCisjIFJhbmRvbSBOdW1iZXIgR2VuZXJhdGlvbgorIworIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19IVz15CiAKICMKICMgTGlicmFyeSByb3V0aW5lcwpAQCAtMTAxMyw2ICsxMTYzLDcgQEAKIENPTkZJR19CSVRSRVZFUlNFPXkKIENPTkZJR19DUkNfQ0NJVFQ9bQogIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX1QxMERJRiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAogQ09ORklHX0NSQzMyPXkKICMgQ09ORklHX0NSQzcgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JsYWNrU3RhbXBfZGVmY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JsYWNrU3RhbXBfZGVmY29uZmlnCmluZGV4IDI5MjFmOTkuLjk2ODNiMmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CbGFja1N0YW1wX2RlZmNvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQmxhY2tTdGFtcF9kZWZjb25maWcKQEAgLTUzLDcgKzUzLDcgQEAKIENPTkZJR19IT1RQTFVHPXkKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15Ci1DT05GSUdfRUxGX0NPUkU9eQorIyBDT05GSUdfRUxGX0NPUkUgaXMgbm90IHNldAogQ09ORklHX0NPTVBBVF9CUks9eQogQ09ORklHX0JBU0VfRlVMTD15CiBDT05GSUdfRlVURVg9eQpAQCAtMjc2LDcgKzI3Niw2IEBACiBDT05GSUdfWk9ORV9ETUFfRkxBRz0xCiBDT05GSUdfVklSVF9UT19CVVM9eQogQ09ORklHX0JGSU5fR1BUSU1FUlM9eQotQ09ORklHX0JGSU5fRE1BXzVYWD15CiAjIENPTkZJR19ETUFfVU5DQUNIRURfNE0gaXMgbm90IHNldAogIyBDT05GSUdfRE1BX1VOQ0FDSEVEXzJNIGlzIG5vdCBzZXQKIENPTkZJR19ETUFfVU5DQUNIRURfMU09eQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTI3X2RlZmNvbmZpZyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9DTS1CRjUyN19kZWZjb25maWcKaW5kZXggYjZhMTQ2My4uYTA0MWU3ZSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTI3X2RlZmNvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQ00tQkY1MjdfZGVmY29uZmlnCkBAIC00Miw3ICs0Miw3IEBACiBDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRD15CiBDT05GSUdfRkFJUl9VU0VSX1NDSEVEPXkKICMgQ09ORklHX0ZBSVJfQ0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKKyMgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQgaXMgbm90IHNldAogIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKIENPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCkBAIC01Niw3ICs1Niw3IEBACiBDT05GSUdfSE9UUExVRz15CiBDT05GSUdfUFJJTlRLPXkKIENPTkZJR19CVUc9eQotQ09ORklHX0VMRl9DT1JFPXkKKyMgQ09ORklHX0VMRl9DT1JFIGlzIG5vdCBzZXQKIENPTkZJR19CQVNFX0ZVTEw9eQogQ09ORklHX0ZVVEVYPXkKIENPTkZJR19BTk9OX0lOT0RFUz15CkBAIC0xOTAsMTQgKzE5MCwxNCBAQAogQ09ORklHX0lSUV9QT1JUSF9JTlRBPTExCiBDT05GSUdfSVJRX01BQ19UWD0xMQogQ09ORklHX0lSUV9QT1JUSF9JTlRCPTExCi1DT05GSUdfSVJRX1RNUjA9MTIKLUNPTkZJR19JUlFfVE1SMT0xMgotQ09ORklHX0lSUV9UTVIyPTEyCi1DT05GSUdfSVJRX1RNUjM9MTIKLUNPTkZJR19JUlFfVE1SND0xMgotQ09ORklHX0lSUV9UTVI1PTEyCi1DT05GSUdfSVJRX1RNUjY9MTIKLUNPTkZJR19JUlFfVE1SNz0xMgorQ09ORklHX0lSUV9USU1FUjA9MTIKK0NPTkZJR19JUlFfVElNRVIxPTEyCitDT05GSUdfSVJRX1RJTUVSMj0xMgorQ09ORklHX0lSUV9USU1FUjM9MTIKK0NPTkZJR19JUlFfVElNRVI0PTEyCitDT05GSUdfSVJRX1RJTUVSNT0xMgorQ09ORklHX0lSUV9USU1FUjY9MTIKK0NPTkZJR19JUlFfVElNRVI3PTEyCiBDT05GSUdfSVJRX1BPUlRHX0lOVEE9MTIKIENPTkZJR19JUlFfUE9SVEdfSU5UQj0xMgogQ09ORklHX0lSUV9NRU1fRE1BMD0xMwpAQCAtMjkyLDcgKzI5Miw2IEBACiBDT05GSUdfWk9ORV9ETUFfRkxBRz0xCiBDT05GSUdfVklSVF9UT19CVVM9eQogQ09ORklHX0JGSU5fR1BUSU1FUlM9eQotQ09ORklHX0JGSU5fRE1BXzVYWD15CiAjIENPTkZJR19ETUFfVU5DQUNIRURfNE0gaXMgbm90IHNldAogIyBDT05GSUdfRE1BX1VOQ0FDSEVEXzJNIGlzIG5vdCBzZXQKIENPTkZJR19ETUFfVU5DQUNIRURfMU09eQpAQCAtNjUwLDYgKzY0OSw3IEBACiAjIENPTkZJR19UV0lfTENEIGlzIG5vdCBzZXQKIENPTkZJR19TSU1QTEVfR1BJTz1tCiAjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZLTUVNIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CiAKICMKQEAgLTY5OSw3ICs2OTksNyBAQAogIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKICMKIENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJPW0KLUNPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX0NMS19LSFo9NTAKK0NPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX0NMS19LSFo9MTAwCiAjIENPTkZJR19JMkNfR1BJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9DTS1CRjUzM19kZWZjb25maWcgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQ00tQkY1MzNfZGVmY29uZmlnCmluZGV4IGMzYmE5MDYuLjA4NTIxMWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9DTS1CRjUzM19kZWZjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTMzX2RlZmNvbmZpZwpAQCAtNDIsNyArNDIsNyBAQAogQ09ORklHX0lLQ09ORklHPXkKIENPTkZJR19JS0NPTkZJR19QUk9DPXkKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0Ci1DT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CisjIENPTkZJR19TWVNGU19ERVBSRUNBVEVEIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKQEAgLTU1LDcgKzU1LDcgQEAKICMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKLUNPTkZJR19FTEZfQ09SRT15CisjIENPTkZJR19FTEZfQ09SRSBpcyBub3Qgc2V0CiBDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15CiBDT05GSUdfQU5PTl9JTk9ERVM9eQpAQCAtMjU0LDcgKzI1NCw2IEBACiBDT05GSUdfWk9ORV9ETUFfRkxBRz0xCiBDT05GSUdfTEFSR0VfQUxMT0NTPXkKICMgQ09ORklHX0JGSU5fR1BUSU1FUlMgaXMgbm90IHNldAotQ09ORklHX0JGSU5fRE1BXzVYWD15CiAjIENPTkZJR19ETUFfVU5DQUNIRURfMk0gaXMgbm90IHNldAogQ09ORklHX0RNQV9VTkNBQ0hFRF8xTT15CiAjIENPTkZJR19ETUFfVU5DQUNIRURfTk9ORSBpcyBub3Qgc2V0CkBAIC01OTgsNiArNTk3LDcgQEAKIENPTkZJR19CRklOX1NQT1JUPXkKICMgQ09ORklHX0JGSU5fVElNRVJfTEFURU5DWSBpcyBub3Qgc2V0CiAjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZLTUVNIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CiAKICMKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9DTS1CRjUzN0VfZGVmY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTM3RV9kZWZjb25maWcKaW5kZXggY2RjNmI3Zi4uNzUwMjAzZSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTM3RV9kZWZjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTM3RV9kZWZjb25maWcKQEAgLTQyLDcgKzQyLDcgQEAKIENPTkZJR19JS0NPTkZJRz15CiBDT05GSUdfSUtDT05GSUdfUFJPQz15CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAotQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQorIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRCBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CiAjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CkBAIC01NSw3ICs1NSw3IEBACiAjIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15Ci1DT05GSUdfRUxGX0NPUkU9eQorIyBDT05GSUdfRUxGX0NPUkUgaXMgbm90IHNldAogQ09ORklHX0JBU0VfRlVMTD15CiBDT05GSUdfRlVURVg9eQogQ09ORklHX0FOT05fSU5PREVTPXkKQEAgLTE1NywxNCArMTU3LDE0IEBACiBDT05GSUdfSVJRX1VBUlQxX1RYPTEwCiBDT05GSUdfSVJRX01BQ19SWD0xMQogQ09ORklHX0lSUV9NQUNfVFg9MTEKLUNPTkZJR19JUlFfVE1SMD0xMgotQ09ORklHX0lSUV9UTVIxPTEyCi1DT05GSUdfSVJRX1RNUjI9MTIKLUNPTkZJR19JUlFfVE1SMz0xMgotQ09ORklHX0lSUV9UTVI0PTEyCi1DT05GSUdfSVJRX1RNUjU9MTIKLUNPTkZJR19JUlFfVE1SNj0xMgotQ09ORklHX0lSUV9UTVI3PTEyCitDT05GSUdfSVJRX1RJTUVSMD0xMgorQ09ORklHX0lSUV9USU1FUjE9MTIKK0NPTkZJR19JUlFfVElNRVIyPTEyCitDT05GSUdfSVJRX1RJTUVSMz0xMgorQ09ORklHX0lSUV9USU1FUjQ9MTIKK0NPTkZJR19JUlFfVElNRVI1PTEyCitDT05GSUdfSVJRX1RJTUVSNj0xMgorQ09ORklHX0lSUV9USU1FUjc9MTIKIENPTkZJR19JUlFfUE9SVEdfSU5UQj0xMgogQ09ORklHX0lSUV9NRU1fRE1BMD0xMwogQ09ORklHX0lSUV9NRU1fRE1BMT0xMwpAQCAtMjYyLDcgKzI2Miw2IEBACiBDT05GSUdfWk9ORV9ETUFfRkxBRz0xCiBDT05GSUdfTEFSR0VfQUxMT0NTPXkKICMgQ09ORklHX0JGSU5fR1BUSU1FUlMgaXMgbm90IHNldAotQ09ORklHX0JGSU5fRE1BXzVYWD15CiAjIENPTkZJR19ETUFfVU5DQUNIRURfMk0gaXMgbm90IHNldAogQ09ORklHX0RNQV9VTkNBQ0hFRF8xTT15CiAjIENPTkZJR19ETUFfVU5DQUNIRURfTk9ORSBpcyBub3Qgc2V0CkBAIC02MjcsNiArNjI2LDcgQEAKIENPTkZJR19CRklOX1NQT1JUPXkKICMgQ09ORklHX0JGSU5fVElNRVJfTEFURU5DWSBpcyBub3Qgc2V0CiAjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZLTUVNIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CiAKICMKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9DTS1CRjUzN1VfZGVmY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTM3VV9kZWZjb25maWcKaW5kZXggZjA3NGJkYy4uZGVjOGE3ZCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTM3VV9kZWZjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTM3VV9kZWZjb25maWcKQEAgLTQyLDcgKzQyLDcgQEAKIENPTkZJR19JS0NPTkZJRz15CiBDT05GSUdfSUtDT05GSUdfUFJPQz15CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAotQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQorIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRCBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CiAjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CkBAIC01NSw3ICs1NSw3IEBACiAjIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15Ci1DT05GSUdfRUxGX0NPUkU9eQorIyBDT05GSUdfRUxGX0NPUkUgaXMgbm90IHNldAogQ09ORklHX0JBU0VfRlVMTD15CiBDT05GSUdfRlVURVg9eQogQ09ORklHX0FOT05fSU5PREVTPXkKQEAgLTE1NywxNCArMTU3LDE0IEBACiBDT05GSUdfSVJRX1VBUlQxX1RYPTEwCiBDT05GSUdfSVJRX01BQ19SWD0xMQogQ09ORklHX0lSUV9NQUNfVFg9MTEKLUNPTkZJR19JUlFfVE1SMD0xMgotQ09ORklHX0lSUV9UTVIxPTEyCi1DT05GSUdfSVJRX1RNUjI9MTIKLUNPTkZJR19JUlFfVE1SMz0xMgotQ09ORklHX0lSUV9UTVI0PTEyCi1DT05GSUdfSVJRX1RNUjU9MTIKLUNPTkZJR19JUlFfVE1SNj0xMgotQ09ORklHX0lSUV9UTVI3PTEyCitDT05GSUdfSVJRX1RJTUVSMD0xMgorQ09ORklHX0lSUV9USU1FUjE9MTIKK0NPTkZJR19JUlFfVElNRVIyPTEyCitDT05GSUdfSVJRX1RJTUVSMz0xMgorQ09ORklHX0lSUV9USU1FUjQ9MTIKK0NPTkZJR19JUlFfVElNRVI1PTEyCitDT05GSUdfSVJRX1RJTUVSNj0xMgorQ09ORklHX0lSUV9USU1FUjc9MTIKIENPTkZJR19JUlFfUE9SVEdfSU5UQj0xMgogQ09ORklHX0lSUV9NRU1fRE1BMD0xMwogQ09ORklHX0lSUV9NRU1fRE1BMT0xMwpAQCAtMjYyLDcgKzI2Miw2IEBACiBDT05GSUdfWk9ORV9ETUFfRkxBRz0xCiBDT05GSUdfTEFSR0VfQUxMT0NTPXkKICMgQ09ORklHX0JGSU5fR1BUSU1FUlMgaXMgbm90IHNldAotQ09ORklHX0JGSU5fRE1BXzVYWD15CiAjIENPTkZJR19ETUFfVU5DQUNIRURfMk0gaXMgbm90IHNldAogQ09ORklHX0RNQV9VTkNBQ0hFRF8xTT15CiAjIENPTkZJR19ETUFfVU5DQUNIRURfTk9ORSBpcyBub3Qgc2V0CkBAIC02MDcsNiArNjA2LDcgQEAKIENPTkZJR19CRklOX1NQT1JUPXkKICMgQ09ORklHX0JGSU5fVElNRVJfTEFURU5DWSBpcyBub3Qgc2V0CiAjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZLTUVNIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CiAKICMKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9DTS1CRjU0OF9kZWZjb25maWcgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQ00tQkY1NDhfZGVmY29uZmlnCmluZGV4IDVjNDRmZGIuLmVmZDY4YmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9DTS1CRjU0OF9kZWZjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTQ4X2RlZmNvbmZpZwpAQCAtNDEsNyArNDEsNyBAQAogQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQ9eQogQ09ORklHX0ZBSVJfVVNFUl9TQ0hFRD15CiAjIENPTkZJR19GQUlSX0NHUk9VUF9TQ0hFRCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CisjIENPTkZJR19TWVNGU19ERVBSRUNBVEVEIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CiBDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgpAQCAtNTUsNyArNTUsNyBAQAogQ09ORklHX0hPVFBMVUc9eQogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKLUNPTkZJR19FTEZfQ09SRT15CisjIENPTkZJR19FTEZfQ09SRSBpcyBub3Qgc2V0CiBDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15CiBDT05GSUdfQU5PTl9JTk9ERVM9eQpAQCAtMzI1LDcgKzMyNSw2IEBACiBDT05GSUdfWk9ORV9ETUFfRkxBRz0xCiBDT05GSUdfVklSVF9UT19CVVM9eQogIyBDT05GSUdfQkZJTl9HUFRJTUVSUyBpcyBub3Qgc2V0Ci1DT05GSUdfQkZJTl9ETUFfNVhYPXkKICMgQ09ORklHX0RNQV9VTkNBQ0hFRF8yTSBpcyBub3Qgc2V0CiBDT05GSUdfRE1BX1VOQ0FDSEVEXzFNPXkKICMgQ09ORklHX0RNQV9VTkNBQ0hFRF9OT05FIGlzIG5vdCBzZXQKQEAgLTU0NCw3ICs1NDMsNyBAQAogQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTPXkKIENPTkZJR19NVERfUEhZU01BUD15CiBDT05GSUdfTVREX1BIWVNNQVBfU1RBUlQ9MHgyMDAwMDAwMAotQ09ORklHX01URF9QSFlTTUFQX0xFTj0weDgwMDAwMAorQ09ORklHX01URF9QSFlTTUFQX0xFTj0wCiBDT05GSUdfTVREX1BIWVNNQVBfQkFOS1dJRFRIPTIKICMgQ09ORklHX01URF9VQ0xJTlVYIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKQEAgLTczMiw2ICs3MzEsNyBAQAogIyBDT05GSUdfVFdJX0xDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TSU1QTEVfR1BJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZLTUVNIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CiAKICMKQEAgLTc4Miw3ICs3ODIsNyBAQAogIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKICMKIENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJPXkKLUNPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX0NMS19LSFo9NTAKK0NPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX0NMS19LSFo9MTAwCiAjIENPTkZJR19JMkNfR1BJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9DTS1CRjU2MV9kZWZjb25maWcgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQ00tQkY1NjFfZGVmY29uZmlnCmluZGV4IDA4NmZlNWQuLjM0NmJjN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9DTS1CRjU2MV9kZWZjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTYxX2RlZmNvbmZpZwpAQCAtNDIsNyArNDIsNyBAQAogQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQ9eQogQ09ORklHX0ZBSVJfVVNFUl9TQ0hFRD15CiAjIENPTkZJR19GQUlSX0NHUk9VUF9TQ0hFRCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CisjIENPTkZJR19TWVNGU19ERVBSRUNBVEVEIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKQEAgLTU1LDcgKzU1LDcgQEAKICMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKLUNPTkZJR19FTEZfQ09SRT15CisjIENPTkZJR19FTEZfQ09SRSBpcyBub3Qgc2V0CiBDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15CiBDT05GSUdfQU5PTl9JTk9ERVM9eQpAQCAtMzAwLDcgKzMwMCw2IEBACiBDT05GSUdfVklSVF9UT19CVVM9eQogQ09ORklHX0xBUkdFX0FMTE9DUz15CiAjIENPTkZJR19CRklOX0dQVElNRVJTIGlzIG5vdCBzZXQKLUNPTkZJR19CRklOX0RNQV81WFg9eQogIyBDT05GSUdfRE1BX1VOQ0FDSEVEXzJNIGlzIG5vdCBzZXQKIENPTkZJR19ETUFfVU5DQUNIRURfMU09eQogIyBDT05GSUdfRE1BX1VOQ0FDSEVEX05PTkUgaXMgbm90IHNldApAQCAtNjEyLDYgKzYxMSw3IEBACiAjIENPTkZJR19CRklOX1RJTUVSX0xBVEVOQ1kgaXMgbm90IHNldAogIyBDT05GSUdfU0lNUExFX0dQSU8gaXMgbm90IHNldAogIyBDT05GSUdfVlQgaXMgbm90IHNldAorIyBDT05GSUdfREVWS01FTSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAogCiAjCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvSDg2MDZfZGVmY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0g4NjA2X2RlZmNvbmZpZwppbmRleCAxZmMzMWYxLi41ZDM5MDFkIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvSDg2MDZfZGVmY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9IODYwNl9kZWZjb25maWcKQEAgLTU0LDcgKzU0LDcgQEAKIENPTkZJR19IT1RQTFVHPXkKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15Ci1DT05GSUdfRUxGX0NPUkU9eQorIyBDT05GSUdfRUxGX0NPUkUgaXMgbm90IHNldAogQ09ORklHX0JBU0VfRlVMTD15CiBDT05GSUdfRlVURVg9eQogQ09ORklHX0FOT05fSU5PREVTPXkKQEAgLTI1MCw3ICsyNTAsNiBAQAogQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQogQ09ORklHX0xBUkdFX0FMTE9DUz15CiBDT05GSUdfQkZJTl9HUFRJTUVSUz15Ci1DT05GSUdfQkZJTl9ETUFfNVhYPXkKICMgQ09ORklHX0RNQV9VTkNBQ0hFRF8yTSBpcyBub3Qgc2V0CiBDT05GSUdfRE1BX1VOQ0FDSEVEXzFNPXkKICMgQ09ORklHX0RNQV9VTkNBQ0hFRF9OT05FIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9JUDBYX2RlZmNvbmZpZyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9JUDBYX2RlZmNvbmZpZwppbmRleCAyODVkMjI0Li5lNjZmNWRhIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvSVAwWF9kZWZjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0lQMFhfZGVmY29uZmlnCkBAIC01NSw3ICs1NSw3IEBACiAjIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15Ci1DT05GSUdfRUxGX0NPUkU9eQorIyBDT05GSUdfRUxGX0NPUkUgaXMgbm90IHNldAogQ09ORklHX0JBU0VfRlVMTD15CiBDT05GSUdfRlVURVg9eQogQ09ORklHX0FOT05fSU5PREVTPXkKQEAgLTI2Miw3ICsyNjIsNiBAQAogQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQogQ09ORklHX0xBUkdFX0FMTE9DUz15CiAjIENPTkZJR19CRklOX0dQVElNRVJTIGlzIG5vdCBzZXQKLUNPTkZJR19CRklOX0RNQV81WFg9eQogIyBDT05GSUdfRE1BX1VOQ0FDSEVEXzJNIGlzIG5vdCBzZXQKIENPTkZJR19ETUFfVU5DQUNIRURfMU09eQogIyBDT05GSUdfRE1BX1VOQ0FDSEVEX05PTkUgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL1BOQVYtMTBfZGVmY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL1BOQVYtMTBfZGVmY29uZmlnCmluZGV4IGJmZmNhN2QuLmNlNWRkZTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9QTkFWLTEwX2RlZmNvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvUE5BVi0xMF9kZWZjb25maWcKQEAgLTEsNiArMSw2IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjIuMTIKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yOC1yYzIKICMKICMgQ09ORklHX01NVSBpcyBub3Qgc2V0CiAjIENPTkZJR19GUFUgaXMgbm90IHNldApAQCAtOCw0MSArOCwzNyBAQAogIyBDT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE0gaXMgbm90IHNldAogQ09ORklHX0JMQUNLRklOPXkKIENPTkZJR19aT05FX0RNQT15Ci1DT05GSUdfU0VNQVBIT1JFX1NMRUVQRVJTPXkKIENPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQogQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQotQ09ORklHX0dFTkVSSUNfVElNRT15CiBDT05GSUdfR0VORVJJQ19HUElPPXkKIENPTkZJR19GT1JDRV9NQVhfWk9ORU9SREVSPTE0CiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQogQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKIAogIwotIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKKyMgR2VuZXJhbCBzZXR1cAogIwogQ09ORklHX0VYUEVSSU1FTlRBTD15CiBDT05GSUdfQlJPS0VOX09OX1NNUD15CiBDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCi0KLSMKLSMgR2VuZXJhbCBzZXR1cAotIwogQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgogQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKIENPTkZJR19TWVNWSVBDPXkKLSMgQ09ORklHX0lQQ19OUyBpcyBub3Qgc2V0CiBDT05GSUdfU1lTVklQQ19TWVNDVEw9eQogIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAogIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VUU19OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAotQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQorIyBDT05GSUdfQ0dST1VQUyBpcyBub3Qgc2V0CisjIENPTkZJR19HUk9VUF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNGU19ERVBSRUNBVEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjIgaXMgbm90IHNldAogIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfTkFNRVNQQUNFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CiAjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CiBDT05GSUdfU1lTQ1RMPXkKQEAgLTU0LDQwICs1MCw0MSBAQAogQ09ORklHX0hPVFBMVUc9eQogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKLUNPTkZJR19FTEZfQ09SRT15CisjIENPTkZJR19FTEZfQ09SRSBpcyBub3Qgc2V0CitDT05GSUdfQ09NUEFUX0JSSz15CiBDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15CiBDT05GSUdfQU5PTl9JTk9ERVM9eQogQ09ORklHX0VQT0xMPXkKIENPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CiBDT05GSUdfRVZFTlRGRD15CitDT05GSUdfQUlPPXkKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15Ci1DT05GSUdfQklHX09SREVSX0FMTE9DX05PRkFJTF9NQUdJQz05Ci0jIENPTkZJR19OUDIgaXMgbm90IHNldAogQ09ORklHX1NMQUI9eQogIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisjIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX09QUk9GSUxFPXkKKyMgQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQgaXMgbm90IHNldAorQ09ORklHX1NMQUJJTkZPPXkKIENPTkZJR19SVF9NVVRFWEVTPXkKIENPTkZJR19USU5ZX1NITUVNPXkKIENPTkZJR19CQVNFX1NNQUxMPTAKLQotIwotIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAotIwogQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQgaXMgbm90IHNldAogQ09ORklHX01PRFVMRV9VTkxPQUQ9eQogIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CiAjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAogQ09ORklHX0tNT0Q9eQotCi0jCi0jIEJsb2NrIGxheWVyCi0jCiBDT05GSUdfQkxPQ0s9eQogIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIAogIwogIyBJTyBTY2hlZHVsZXJzCkBAIC0xMDEsOSArOTgsMTEgQEAKICMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0CiBDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJhbnRpY2lwYXRvcnkiCitDT05GSUdfQ0xBU1NJQ19SQ1U9eQogIyBDT05GSUdfUFJFRU1QVF9OT05FIGlzIG5vdCBzZXQKIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT15CiAjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZSRUVaRVIgaXMgbm90IHNldAogCiAjCiAjIEJsYWNrZmluIFByb2Nlc3NvciBPcHRpb25zCkBAIC0xMTIsOCArMTExLDE1IEBACiAjCiAjIFByb2Nlc3NvciBhbmQgQm9hcmQgU2V0dGluZ3MKICMKKyMgQ09ORklHX0JGNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTE4IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTIyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTIzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTI0IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTI2IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTI3IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTMxIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTMyIGlzIG5vdCBzZXQKQEAgLTEyMSwyMiArMTI3LDI2IEBACiAjIENPTkZJR19CRjUzNCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUzNiBpcyBub3Qgc2V0CiBDT05GSUdfQkY1Mzc9eQorIyBDT05GSUdfQkY1MzggaXMgbm90IHNldAorIyBDT05GSUdfQkY1MzkgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDIgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDQgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDcgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDggaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDkgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NjEgaXMgbm90IHNldAorQ09ORklHX0JGX1JFVl9NSU49MgorQ09ORklHX0JGX1JFVl9NQVg9MwogIyBDT05GSUdfQkZfUkVWXzBfMCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfMF8xIGlzIG5vdCBzZXQKIENPTkZJR19CRl9SRVZfMF8yPXkKICMgQ09ORklHX0JGX1JFVl8wXzMgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWXzBfNCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfMF81IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGX1JFVl8wXzYgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWX0FOWSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfTk9ORSBpcyBub3Qgc2V0CiBDT05GSUdfQkY1M3g9eQotQ09ORklHX0JGSU5fU0lOR0xFX0NPUkU9eQogQ09ORklHX01FTV9NVDQ4TEMzMk04QTJfNzU9eQogQ09ORklHX0lSUV9QTExfV0FLRVVQPTcKIENPTkZJR19JUlFfUlRDPTgKQEAgLTE0NiwyOCArMTU2LDMwIEBACiBDT05GSUdfSVJRX1NQT1JUMV9SWD05CiBDT05GSUdfSVJRX1NQT1JUMV9UWD05CiBDT05GSUdfSVJRX1RXST0xMAotQ09ORklHX0lSUV9TUEk9MTAKIENPTkZJR19JUlFfVUFSVDBfUlg9MTAKIENPTkZJR19JUlFfVUFSVDBfVFg9MTAKIENPTkZJR19JUlFfVUFSVDFfUlg9MTAKIENPTkZJR19JUlFfVUFSVDFfVFg9MTAKIENPTkZJR19JUlFfTUFDX1JYPTExCiBDT05GSUdfSVJRX01BQ19UWD0xMQotQ09ORklHX0lSUV9UTVIwPTEyCi1DT05GSUdfSVJRX1RNUjE9MTIKLUNPTkZJR19JUlFfVE1SMj0xMgotQ09ORklHX0lSUV9UTVIzPTEyCi1DT05GSUdfSVJRX1RNUjQ9MTIKLUNPTkZJR19JUlFfVE1SNT0xMgotQ09ORklHX0lSUV9UTVI2PTEyCi1DT05GSUdfSVJRX1RNUjc9MTIKK0NPTkZJR19JUlFfVElNRVIwPTEyCitDT05GSUdfSVJRX1RJTUVSMT0xMgorQ09ORklHX0lSUV9USU1FUjI9MTIKK0NPTkZJR19JUlFfVElNRVIzPTEyCitDT05GSUdfSVJRX1RJTUVSND0xMgorQ09ORklHX0lSUV9USU1FUjU9MTIKK0NPTkZJR19JUlFfVElNRVI2PTEyCitDT05GSUdfSVJRX1RJTUVSNz0xMgogQ09ORklHX0lSUV9QT1JUR19JTlRCPTEyCiBDT05GSUdfSVJRX01FTV9ETUEwPTEzCiBDT05GSUdfSVJRX01FTV9ETUExPTEzCiBDT05GSUdfSVJRX1dBVENIPTEzCitDT05GSUdfSVJRX1NQST0xMAogIyBDT05GSUdfQkZJTjUzN19TVEFNUCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRklONTM3X0JMVUVURUNITklYX0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGSU41MzdfQkxVRVRFQ0hOSVhfVENNIGlzIG5vdCBzZXQKIENPTkZJR19QTkFWMTA9eQorIyBDT05GSUdfQ0FNU0lHX01JTk9UQVVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0dFTkVSSUNfQkY1MzdfQk9BUkQgaXMgbm90IHNldAogCiAjCkBAIC0xOTEsNiArMjAzLDcgQEAKICMgQm9hcmQgY3VzdG9taXphdGlvbnMKICMKICMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0CitDT05GSUdfQk9PVF9MT0FEPTB4MTAwMAogCiAjCiAjIENsb2NrL1BMTCBTZXR1cApAQCAtMTk5LDcgKzIxMiw3IEBACiAjIENPTkZJR19CRklOX0tFUk5FTF9DTE9DSyBpcyBub3Qgc2V0CiBDT05GSUdfTUFYX1ZDT19IWj02MDAwMDAwMDAKIENPTkZJR19NSU5fVkNPX0haPTUwMDAwMDAwCi1DT05GSUdfTUFYX1NDTEtfSFo9MTMzMDAwMDAwCitDT05GSUdfTUFYX1NDTEtfSFo9MTMzMzMzMzMzCiBDT05GSUdfTUlOX1NDTEtfSFo9MjcwMDAwMDAKIAogIwpAQCAtMjEwLDEzICsyMjMsMTcgQEAKICMgQ09ORklHX0haXzMwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKIENPTkZJR19IWj0yNTAKKyMgQ09ORklHX1NDSEVEX0hSVElDSyBpcyBub3Qgc2V0CitDT05GSUdfR0VORVJJQ19USU1FPXkKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKKyMgQ09ORklHX0NZQ0xFU19DTE9DS1NPVVJDRSBpcyBub3Qgc2V0CisjIENPTkZJR19OT19IWiBpcyBub3Qgc2V0CisjIENPTkZJR19ISUdIX1JFU19USU1FUlMgaXMgbm90IHNldAorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlVJTEQ9eQogCiAjCi0jIE1lbW9yeSBTZXR1cAorIyBNaXNjCiAjCi1DT05GSUdfTUFYX01FTV9TSVpFPTY0Ci1DT05GSUdfTUVNX0FERF9XSURUSD0xMAotQ09ORklHX0JPT1RfTE9BRD0weDEwMDAKIENPTkZJR19CRklOX1NDUkFUQ0hfUkVHX1JFVE49eQogIyBDT05GSUdfQkZJTl9TQ1JBVENIX1JFR19SRVRFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGSU5fU0NSQVRDSF9SRUdfQ1lDTEVTIGlzIG5vdCBzZXQKQEAgLTI0Myw2ICsyNjAsMTIgQEAKIENPTkZJR19DQUNIRUxJTkVfQUxJR05FRF9MMT15CiBDT05GSUdfU1lTQ0FMTF9UQUJfTDE9eQogQ09ORklHX0NQTEJfU1dJVENIX1RBQl9MMT15CitDT05GSUdfQVBQX1NUQUNLX0wxPXkKKworIworIyBTcGVlZCBPcHRpbWl6YXRpb25zCisjCitDT05GSUdfQkZJTl9JTlNfTE9XT1ZFUkhFQUQ9eQogQ09ORklHX1JBTUtFUk5FTD15CiAjIENPTkZJR19ST01LRVJORUwgaXMgbm90IHNldAogQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQpAQCAtMjUxLDEzICsyNzQsMTQgQEAKICMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAogQ09ORklHX0ZMQVRNRU09eQogQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKLSMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAorQ09ORklHX1BBR0VGTEFHU19FWFRFTkRFRD15CiBDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAogIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIWVNfQUREUl9UXzY0QklUIGlzIG5vdCBzZXQKIENPTkZJR19aT05FX0RNQV9GTEFHPTEKLUNPTkZJR19MQVJHRV9BTExPQ1M9eQotIyBDT05GSUdfQkZJTl9HUFRJTUVSUyBpcyBub3Qgc2V0Ci1DT05GSUdfQkZJTl9ETUFfNVhYPXkKK0NPTkZJR19WSVJUX1RPX0JVUz15CitDT05GSUdfQkZJTl9HUFRJTUVSUz15CisjIENPTkZJR19ETUFfVU5DQUNIRURfNE0gaXMgbm90IHNldAogIyBDT05GSUdfRE1BX1VOQ0FDSEVEXzJNIGlzIG5vdCBzZXQKIENPTkZJR19ETUFfVU5DQUNIRURfMU09eQogIyBDT05GSUdfRE1BX1VOQ0FDSEVEX05PTkUgaXMgbm90IHNldApAQCAtMjcxLDcgKzI5NSw3IEBACiAjIENPTkZJR19CRklOX0lDQUNIRV9MT0NLIGlzIG5vdCBzZXQKIENPTkZJR19CRklOX1dCPXkKICMgQ09ORklHX0JGSU5fV1QgaXMgbm90IHNldAotQ09ORklHX0wxX01BWF9QSUVDRT0xNgorIyBDT05GSUdfTVBVIGlzIG5vdCBzZXQKIAogIwogIyBBc3luY2hvbm91cyBNZW1vcnkgQ29uZmlndXJhdGlvbgpAQCAtMjk5LDEyICszMjMsNyBAQAogIwogIyBCdXMgb3B0aW9ucyAoUENJLCBQQ01DSUEsIEVJU0EsIE1DQSwgSVNBKQogIwotIyBDT05GSUdfUENJIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKLQotIwotIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0Ci0jCiAjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAogCiAjCkBAIC0zMTQsMjEgKzMzMywyMCBAQAogQ09ORklHX0JJTkZNVF9GTEFUPXkKIENPTkZJR19CSU5GTVRfWkZMQVQ9eQogIyBDT05GSUdfQklORk1UX1NIQVJFRF9GTEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfQU9VVCBpcyBub3Qgc2V0CiAjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CiAKICMKICMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCiAjCiAjIENPTkZJR19QTSBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9TVVNQRU5EX1BPU1NJQkxFPXkKKyMgQ09ORklHX1BNX1dBS0VVUF9CWV9HUElPIGlzIG5vdCBzZXQKIAogIwogIyBDUFUgRnJlcXVlbmN5IHNjYWxpbmcKICMKICMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JraW5nCi0jCiBDT05GSUdfTkVUPXkKIAogIwpAQCAtMzQxLDYgKzM1OSw3IEBACiAjIENPTkZJR19YRlJNX1VTRVIgaXMgbm90IHNldAogIyBDT05GSUdfWEZSTV9TVUJfUE9MSUNZIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGUk1fTUlHUkFURSBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NUQVRJU1RJQ1MgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVD15CiAjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldApAQCAtMzYyLDYgKzM4MSw3IEBACiBDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUPXkKIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUw9eQogQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQ9eQorIyBDT05GSUdfSU5FVF9MUk8gaXMgbm90IHNldAogQ09ORklHX0lORVRfRElBRz15CiBDT05GSUdfSU5FVF9UQ1BfRElBRz15CiAjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CkBAIC0zNjksOCArMzg5LDYgQEAKIENPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKICMgQ09ORklHX1RDUF9NRDVTSUcgaXMgbm90IHNldAogIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUTEFCRUwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CkBAIC0zNzksNiArMzk3LDcgQEAKICMgQ09ORklHX1RJUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRFNBIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAogIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKICMgQ09ORklHX0xMQzIgaXMgbm90IHNldApAQCAtMzg4LDEwICs0MDcsNiBAQAogIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CiAjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAogIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCi0jCiAjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAogCiAjCkBAIC0zOTksMTggKzQxNCwxOSBAQAogIwogIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CiAjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19DQU4gaXMgbm90IHNldAogIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CiAjIENPTkZJR19CVCBpcyBub3Qgc2V0CiAjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MKLSMKKyMgQ09ORklHX1BIT05FVCBpcyBub3Qgc2V0CitDT05GSUdfV0lSRUxFU1M9eQogIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorQ09ORklHX1dJUkVMRVNTX09MRF9SRUdVTEFUT1JZPXkKICMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF85UCBpcyBub3Qgc2V0CiAKICMKICMgRGV2aWNlIERyaXZlcnMKQEAgLTQxOSwxNCArNDM1LDExIEBACiAjCiAjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKICMKK0NPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCiBDT05GSUdfU1RBTkRBTE9ORT15CiBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CiAjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAogIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAotCi0jCi0jIENvbm5lY3RvciAtIHVuaWZpZWQgdXNlcnNwYWNlIDwtPiBrZXJuZWxzcGFjZSBsaW5rZXIKLSMKICMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CiBDT05GSUdfTVREPXkKICMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CkBAIC00MzQsNiArNDQ3LDcgQEAKIENPTkZJR19NVERfUEFSVElUSU9OUz15CiAjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfQ01ETElORV9QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQVI3X1BBUlRTIGlzIG5vdCBzZXQKIAogIwogIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycwpAQCAtNDQ2LDYgKzQ2MCw3IEBACiAjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CiAjIENPTkZJR19SRkRfRlRMIGlzIG5vdCBzZXQKICMgQ09ORklHX1NTRkRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PT1BTIGlzIG5vdCBzZXQKIAogIwogIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycwpAQCAtNDcwLDcgKzQ4NSw3IEBACiAjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKICMKIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUz15Ci0jIENPTkZJR19NVERfQkY1eHggaXMgbm90IHNldAorIyBDT05GSUdfTVREX0dQSU9fQUREUiBpcyBub3Qgc2V0CiBDT05GSUdfTVREX1VDTElOVVg9eQogIyBDT05GSUdfTVREX1BMQVRSQU0gaXMgbm90IHNldAogCkBAIC01MDksMzMgKzUyNCwyMiBAQAogIyBVQkkgLSBVbnNvcnRlZCBibG9jayBpbWFnZXMKICMKICMgQ09ORklHX01URF9VQkkgaXMgbm90IHNldAotCi0jCi0jIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAotIwogIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0Ci0jCi0jIENPTkZJR19QTlBBQ1BJIGlzIG5vdCBzZXQKLQotIwotIyBCbG9jayBkZXZpY2VzCi0jCitDT05GSUdfQkxLX0RFVj15CiAjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX1JBTT15CiBDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKIENPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKLUNPTkZJR19CTEtfREVWX1JBTV9CTE9DS1NJWkU9MTAyNAorIyBDT05GSUdfQkxLX0RFVl9YSVAgaXMgbm90IHNldAogIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAotCi0jCi0jIE1pc2MgZGV2aWNlcwotIworIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0CitDT05GSUdfTUlTQ19ERVZJQ0VTPXkKKyMgQ09ORklHX0VFUFJPTV85M0NYNiBpcyBub3Qgc2V0CisjIENPTkZJR19FTkNMT1NVUkVfU0VSVklDRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfSURFPXkKICMgQ09ORklHX0lERSBpcyBub3Qgc2V0CiAKICMKQEAgLTU0MywyMiArNTQ3LDE3IEBACiAjCiAjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ETUEgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUQSBpcyBub3Qgc2V0Ci0KLSMKLSMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKLSMKICMgQ09ORklHX01EIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIGRldmljZSBzdXBwb3J0Ci0jCiBDT05GSUdfTkVUREVWSUNFUz15CiAjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CiAjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ1ZMQU4gaXMgbm90IHNldAogIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKICMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisjIENPTkZJR19WRVRIIGlzIG5vdCBzZXQKIENPTkZJR19QSFlMSUI9eQogCiAjCkBAIC01NzIsNDYgKzU3MSw0NSBAQAogIyBDT05GSUdfVklURVNTRV9QSFkgaXMgbm90IHNldAogIyBDT05GSUdfU01TQ19QSFkgaXMgbm90IHNldAogIyBDT05GSUdfQlJPQURDT01fUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lDUExVU19QSFkgaXMgbm90IHNldAorIyBDT05GSUdfUkVBTFRFS19QSFkgaXMgbm90IHNldAogIyBDT05GSUdfRklYRURfUEhZIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKLSMKKyMgQ09ORklHX01ESU9fQklUQkFORyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUX0VUSEVSTkVUPXkKIENPTkZJR19NSUk9eQotIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKIENPTkZJR19CRklOX01BQz15CiAjIENPTkZJR19CRklOX01BQ19VU0VfTDEgaXMgbm90IHNldAogQ09ORklHX0JGSU5fVFhfREVTQ19OVU09MTAwCiBDT05GSUdfQkZJTl9SWF9ERVNDX05VTT0xMDAKIENPTkZJR19CRklOX01BQ19STUlJPXkKKyMgQ09ORklHX1NNQzkxWCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTVNDOTExWCBpcyBub3Qgc2V0CiAjIENPTkZJR19ETTkwMDAgaXMgbm90IHNldAorIyBDT05GSUdfRU5DMjhKNjAgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1pNSUkgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1JHTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19UQUggaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX0VNQUM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19OT19GTE9XX0NUUkwgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DTFJfSUNJTlRTVEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19NQUxfQ09NTU9OX0VSUiBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWXzEwMDA9eQotQ09ORklHX05FVERFVl8xMDAwMD15CiAjIENPTkZJR19BWDg4MTgwIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZfMTAwMDA9eQogCiAjCiAjIFdpcmVsZXNzIExBTgogIwogIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lXTFdJRklfTEVEUyBpcyBub3Qgc2V0CiAjIENPTkZJR19XQU4gaXMgbm90IHNldAogIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMSVAgaXMgbm90IHNldAotIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAogIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKLQotIwotIyBJU0ROIHN1YnN5c3RlbQotIwogIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0Ci0KLSMKLSMgVGVsZXBob255IFN1cHBvcnQKLSMKICMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKIAogIwpAQCAtNjI2LDkgKzYyNCw2IEBACiAjCiAjIENPTkZJR19JTlBVVF9NT1VTRURFViBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAotQ09ORklHX0lOUFVUX1RTREVWPXkKLUNPTkZJR19JTlBVVF9UU0RFVl9TQ1JFRU5fWD0yNDAKLUNPTkZJR19JTlBVVF9UU0RFVl9TQ1JFRU5fWT0zMjAKIENPTkZJR19JTlBVVF9FVkRFVj15CiAjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CiAKQEAgLTY0MiwyNCArNjM3LDI5IEBACiBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU49eQogIyBDT05GSUdfVE9VQ0hTQ1JFRU5fQURTNzg0NiBpcyBub3Qgc2V0CiBDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc3PXkKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OV9JMkMgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5X1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzkgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fRlVKSVRTVSBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9HVU5aRSBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9FTE8gaXMgbm90IHNldAogIyBDT05GSUdfVE9VQ0hTQ1JFRU5fTVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0lORVhJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9NSzcxMiBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9QRU5NT1VOVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSFJJR0hUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPVUNIU0NSRUVOX1RPVUNIV0lOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RPVUNIU0NSRUVOX1VDQjE0MDAgaXMgbm90IHNldAogIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVVNCX0NPTVBPU0lURSBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSElUMjEzIGlzIG5vdCBzZXQKIENPTkZJR19JTlBVVF9NSVNDPXkKICMgQ09ORklHX0lOUFVUX0FUSV9SRU1PVEUgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfQVRJX1JFTU9URTIgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfS0VZU1BBTl9SRU1PVEUgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfUE9XRVJNQVRFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX1lFQUxJTksgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfQ00xMDkgaXMgbm90IHNldAogQ09ORklHX0lOUFVUX1VJTlBVVD15Ci0jIENPTkZJR19CRjUzWF9QRkJVVFRPTlMgaXMgbm90IHNldAotIyBDT05GSUdfVFdJX0tFWVBBRCBpcyBub3Qgc2V0CisjIENPTkZJR19DT05GSUdfSU5QVVRfUENGODU3NCBpcyBub3Qgc2V0CiAKICMKICMgSGFyZHdhcmUgSS9PIHBvcnRzCkBAIC02NzIsMTggKzY3MiwxNyBAQAogIwogIyBDT05GSUdfQUQ5OTYwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQSV9BRENfQkY1MzMgaXMgbm90IHNldAotIyBDT05GSUdfQkY1eHhfUEZMQUdTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNXh4X1BQSUZDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRklOX1NJTVBMRV9USU1FUiBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjV4eF9QUEkgaXMgbm90IHNldAogQ09ORklHX0JGSU5fU1BPUlQ9eQogIyBDT05GSUdfQkZJTl9USU1FUl9MQVRFTkNZIGlzIG5vdCBzZXQKIENPTkZJR19UV0lfTENEPW0KLUNPTkZJR19UV0lfTENEX1NMQVZFX0FERFI9MzQKLSMgQ09ORklHX0FENTMwNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CRjV4eF9URUE1NzY0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0JGNXh4X0ZCRE1BIGlzIG5vdCBzZXQKK0NPTkZJR19CRklOX0RNQV9JTlRFUkZBQ0U9bQorIyBDT05GSUdfU0lNUExFX0dQSU8gaXMgbm90IHNldAogIyBDT05GSUdfVlQgaXMgbm90IHNldAorQ09ORklHX0RFVktNRU09eQorIyBDT05GSUdfQkZJTl9KVEFHX0NPTU0gaXMgbm90IHNldAogIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKIAogIwpAQCAtNzE2LDY4ICs3MTUsNTkgQEAKICMKICMgbGludXggZW1iZWRkZWQgZHJpdmVycwogIwotIyBDT05GSUdfQ0FOX01DRjUyODIgaXMgbm90IHNldAotIyBDT05GSUdfQ0FOX1VOQ1RXSU5DQU4gaXMgbm90IHNldAogQ09ORklHX0NBTl9CTEFDS0ZJTj1tCi0KLSMKLSMgSVBNSQotIwogIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKIENPTkZJR19IV19SQU5ET009eQotIyBDT05GSUdfR0VOX1JUQyBpcyBub3Qgc2V0CiAjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CiAjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKLQotIwotIyBUUE0gZGV2aWNlcwotIwogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CiBDT05GSUdfSTJDPXkKIENPTkZJR19JMkNfQk9BUkRJTkZPPXkKIENPTkZJR19JMkNfQ0hBUkRFVj15Ci0KLSMKLSMgSTJDIEFsZ29yaXRobXMKLSMKLSMgQ09ORklHX0kyQ19BTEdPQklUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTEdPUENGIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTEdPUENBIGlzIG5vdCBzZXQKK0NPTkZJR19JMkNfSEVMUEVSX0FVVE89eQogCiAjCiAjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAogIwotIyBDT05GSUdfSTJDX0JMQUNLRklOX0dQSU8gaXMgbm90IHNldAorCisjCisjIEkyQyBzeXN0ZW0gYnVzIGRyaXZlcnMgKG1vc3RseSBlbWJlZGRlZCAvIHN5c3RlbS1vbi1jaGlwKQorIwogQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0k9eQotQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfQ0xLX0tIWj01MAorQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfQ0xLX0tIWj0xMDAKICMgQ09ORklHX0kyQ19HUElPIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1NJTVRFQyBpcyBub3Qgc2V0CisKKyMKKyMgRXh0ZXJuYWwgSTJDL1NNQnVzIGFkYXB0ZXIgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1RBT1NfRVZNIGlzIG5vdCBzZXQKKworIworIyBPdGhlciBJMkMvU01CdXMgYnVzIGRyaXZlcnMKKyMKKyMgQ09ORklHX0kyQ19QQ0FfUExBVEZPUk0gaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1NUVUIgaXMgbm90IHNldAogCiAjCiAjIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAogIwotIyBDT05GSUdfU0VOU09SU19EUzEzMzcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19EUzEzNzQgaXMgbm90IHNldAorIyBDT05GSUdfRFMxNjgyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUMjQgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRDUyNTIgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19FRVBST00gaXMgbm90IHNldAogQ09ORklHX1NFTlNPUlNfUENGODU3ND1tCi1DT05GSUdfU0VOU09SU19QQ0Y4NTc1PXkKLSMgQ09ORklHX1NFTlNPUlNfUENBOTU0MyBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0Y4NTc1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVFNMMjU1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKLQotIwotIyBTUEkgc3VwcG9ydAotIwogQ09ORklHX1NQST15CiBDT05GSUdfU1BJX01BU1RFUj15CiAKQEAgLTc4NSw2ICs3NzUsNyBAQAogIyBTUEkgTWFzdGVyIENvbnRyb2xsZXIgRHJpdmVycwogIwogQ09ORklHX1NQSV9CRklOPXkKKyMgQ09ORklHX1NQSV9CRklOX0xPQ0sgaXMgbm90IHNldAogIyBDT05GSUdfU1BJX0JJVEJBTkcgaXMgbm90IHNldAogCiAjCkBAIC03OTIsMjcgKzc4MywyOSBAQAogIwogIyBDT05GSUdfU1BJX0FUMjUgaXMgbm90IHNldAogIyBDT05GSUdfU1BJX1NQSURFViBpcyBub3Qgc2V0Ci0KLSMKLSMgRGFsbGFzJ3MgMS13aXJlIGJ1cwotIworIyBDT05GSUdfU1BJX1RMRTYyWDAgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCPXkKKyMgQ09ORklHX0dQSU9MSUIgaXMgbm90IHNldAogIyBDT05GSUdfVzEgaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKIENPTkZJR19IV01PTj15CiAjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BQklUVUdVUlUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRDc0MTQgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRDc0MTggaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRENYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FETTEwMjEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE0xMDI1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAyNiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FETTEwMjkgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE0xMDMxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNOTI0MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FTQjEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FEVDc0NzAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRFQ3NDczIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQVRYUDEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19EUzE2MjEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GNzE4MDVGIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfRlNDSEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfRlNDUE9TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRjcxODgyRkcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GNzUzNzVTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfR0w1MThTTSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0dMNTIwU00gaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKQEAgLTgyNyw1OCArODIwLDc2IEBACiAjIENPTkZJR19TRU5TT1JTX0xNODcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTE05MiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVgxMTExIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTUFYMTYxOSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX01BWDY2NTAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUEM4NzQyNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RNRTE3MzcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xOTIgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURTNzgyOCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1RITUM1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1ZUMTIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM3OTFEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNzkyRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4Mzc5MyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4M0w3ODVUUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4M0w3ODZORyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKIAogIwogIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCiAjCisjIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAorIyBDT05GSUdfSFRDX1BBU0lDMyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004NDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTgzNTBfSTJDIGlzIG5vdCBzZXQKIAogIwogIyBNdWx0aW1lZGlhIGRldmljZXMKICMKKworIworIyBNdWx0aW1lZGlhIGNvcmUgc3VwcG9ydAorIwogIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKICMgQ09ORklHX0RWQl9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX01FRElBIGlzIG5vdCBzZXQKKworIworIyBNdWx0aW1lZGlhIGRyaXZlcnMKKyMKIENPTkZJR19EQUI9eQogCiAjCiAjIEdyYXBoaWNzIHN1cHBvcnQKICMKLUNPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQ9eQotQ09ORklHX0JBQ0tMSUdIVF9DTEFTU19ERVZJQ0U9eQotQ09ORklHX0xDRF9DTEFTU19ERVZJQ0U9eQotCi0jCi0jIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0CiAjIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTCBpcyBub3Qgc2V0CiBDT05GSUdfRkI9eQogQ09ORklHX0ZJUk1XQVJFX0VESUQ9eQogIyBDT05GSUdfRkJfRERDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0JPT1RfVkVTQV9TVVBQT1JUIGlzIG5vdCBzZXQKIENPTkZJR19GQl9DRkJfRklMTFJFQ1Q9eQogQ09ORklHX0ZCX0NGQl9DT1BZQVJFQT15CiBDT05GSUdfRkJfQ0ZCX0lNQUdFQkxJVD15CisjIENPTkZJR19GQl9DRkJfUkVWX1BJWEVMU19JTl9CWVRFIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1NZU19GSUxMUkVDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9TWVNfQ09QWUFSRUEgaXMgbm90IHNldAogIyBDT05GSUdfRkJfU1lTX0lNQUdFQkxJVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9GT1JFSUdOX0VORElBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9TWVNfRk9QUyBpcyBub3Qgc2V0Ci1DT05GSUdfRkJfREVGRVJSRURfSU89eQogIyBDT05GSUdfRkJfU1ZHQUxJQiBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9NQUNNT0RFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9CQUNLTElHSFQgaXMgbm90IHNldApAQCAtODg4LDI1ICs4OTksMzQgQEAKICMKICMgRnJhbWUgYnVmZmVyIGhhcmR3YXJlIGRyaXZlcnMKICMKLSMgQ09ORklHX0ZCX0JGSU5fNzE3MSBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9CRklOXzczOTMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQkZJTl9UMzUwTUNRQiBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9CRklOX0xRMDM1UTEgaXMgbm90IHNldAogQ09ORklHX0ZCX0JGNTM3X0xRMDM1PXkKIENPTkZJR19MUTAzNV9TTEFWRV9BRERSPTB4NTgKIENPTkZJR19GQl9CRklOX0xBTkRTQ0FQRT15CiAjIENPTkZJR19GQl9CRklOX0JHUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9CRklOX1QzNTBNQ1FCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0JGSU5fNzM5MyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9ISVRBQ0hJX1RYMDkgaXMgbm90IHNldAogIyBDT05GSUdfRkJfUzFEMTNYWFggaXMgbm90IHNldAogIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9NRVRST05PTUUgaXMgbm90IHNldAorQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVD15CitDT05GSUdfTENEX0NMQVNTX0RFVklDRT15CisjIENPTkZJR19MQ0RfTFRWMzUwUVYgaXMgbm90IHNldAorIyBDT05GSUdfTENEX0lMSTkzMjAgaXMgbm90IHNldAorIyBDT05GSUdfTENEX1RETzI0TSBpcyBub3Qgc2V0CisjIENPTkZJR19MQ0RfVkdHMjQzMkE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xDRF9QTEFURk9STSBpcyBub3Qgc2V0CitDT05GSUdfQkFDS0xJR0hUX0NMQVNTX0RFVklDRT15CisjIENPTkZJR19CQUNLTElHSFRfQ09SR0kgaXMgbm90IHNldAorCisjCisjIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0CiAjIENPTkZJR19MT0dPIGlzIG5vdCBzZXQKLQotIwotIyBTb3VuZAotIwogQ09ORklHX1NPVU5EPXkKLQotIwotIyBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUKLSMKK0NPTkZJR19TT1VORF9PU1NfQ09SRT15CiBDT05GSUdfU05EPW0KICMgQ09ORklHX1NORF9TRVFVRU5DRVIgaXMgbm90IHNldAogIyBDT05GSUdfU05EX01JWEVSX09TUyBpcyBub3Qgc2V0CkBAIC05MTYsNDYgKzkzNiwzMCBAQAogIyBDT05GSUdfU05EX1ZFUkJPU0VfUFJPQ0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9WRVJCT1NFX1BSSU5USyBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfREVCVUcgaXMgbm90IHNldAotCi0jCi0jIEdlbmVyaWMgZGV2aWNlcwotIworQ09ORklHX1NORF9EUklWRVJTPXkKICMgQ09ORklHX1NORF9EVU1NWSBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfTVRQQVYgaXMgbm90IHNldAogIyBDT05GSUdfU05EX1NFUklBTF9VMTY1NTAgaXMgbm90IHNldAogIyBDT05GSUdfU05EX01QVTQwMSBpcyBub3Qgc2V0CitDT05GSUdfU05EX1NQST15CiAKICMKICMgQUxTQSBCbGFja2ZpbiBkZXZpY2VzCiAjCiAjIENPTkZJR19TTkRfQkxBQ0tGSU5fQUQxODM2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9CRklOX0FENzMzMTEgaXMgbm90IHNldAotCi0jCi0jIFN5c3RlbSBvbiBDaGlwIGF1ZGlvIHN1cHBvcnQKLSMKKyMgQ09ORklHX1NORF9CRklOX0FENzMzMjIgaXMgbm90IHNldAogIyBDT05GSUdfU05EX1NPQyBpcyBub3Qgc2V0Ci0KLSMKLSMgT3BlbiBTb3VuZCBTeXN0ZW0KLSMKIENPTkZJR19TT1VORF9QUklNRT15Ci0jIENPTkZJR19PU1NfT0JTT0xFVEUgaXMgbm90IHNldAotIyBDT05GSUdfU09VTkRfTVNORENMQVMgaXMgbm90IHNldAotIyBDT05GSUdfU09VTkRfTVNORFBJTiBpcyBub3Qgc2V0Ci0KLSMKLSMgSElEIERldmljZXMKLSMKK0NPTkZJR19ISURfU1VQUE9SVD15CiAjIENPTkZJR19ISUQgaXMgbm90IHNldAotCi0jCi0jIFVTQiBzdXBwb3J0Ci0jCisjIENPTkZJR19ISURfUElEIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfU1VQUE9SVD15CiBDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CiAjIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDSSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfQVJDSF9IQVNfRUhDSSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0IgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX09UR19XSElURUxJU1QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX09UR19CTEFDS0xJU1RfSFVCIGlzIG5vdCBzZXQKIAogIwogIyBFbmFibGUgSG9zdCBvciBHYWRnZXQgc3VwcG9ydCB0byBzZWUgSW52ZW50cmEgb3B0aW9ucwpAQCAtOTY0LDM3ICs5NjgsMTEgQEAKICMKICMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JwogIwotCi0jCi0jIFVTQiBHYWRnZXQgU3VwcG9ydAotIwogIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NTUMgaXMgbm90IHNldAotCi0jCi0jIExFRCBkZXZpY2VzCi0jCisjIENPTkZJR19NRU1TVElDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0Ci0KLSMKLSMgTEVEIGRyaXZlcnMKLSMKLQotIwotIyBMRUQgVHJpZ2dlcnMKLSMKLQotIwotIyBJbmZpbmlCYW5kIHN1cHBvcnQKLSMKLQotIwotIyBFREFDIC0gZXJyb3IgZGV0ZWN0aW9uIGFuZCByZXBvcnRpbmcgKFJBUykgKEVYUEVSSU1FTlRBTCkKLSMKLQotIwotIyBSZWFsIFRpbWUgQ2xvY2sKLSMKKyMgQ09ORklHX0FDQ0VTU0lCSUxJVFkgaXMgbm90IHNldAogQ09ORklHX1JUQ19MSUI9eQogQ09ORklHX1JUQ19DTEFTUz15CiBDT05GSUdfUlRDX0hDVE9TWVM9eQpAQCAtMTAxNCw2ICs5OTIsNyBAQAogIyBJMkMgUlRDIGRyaXZlcnMKICMKICMgQ09ORklHX1JUQ19EUlZfRFMxMzA3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxMzc0IGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfRFMxNjcyIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfTUFYNjkwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX1JTNUMzNzIgaXMgbm90IHNldApAQCAtMTAyMSw0MyArMTAwMCw0MSBAQAogIyBDT05GSUdfUlRDX0RSVl9YMTIwNSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX1BDRjg1NjMgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9QQ0Y4NTgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQxVDgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUzM1MzkwQSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0ZNMzEzMCBpcyBub3Qgc2V0CiAKICMKICMgU1BJIFJUQyBkcml2ZXJzCiAjCi0jIENPTkZJR19SVENfRFJWX1JTNUMzNDggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDFUOTQgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzEzMDUgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9NQVg2OTAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUjk3MDEgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SUzVDMzQ4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMzMjM0IGlzIG5vdCBzZXQKIAogIwogIyBQbGF0Zm9ybSBSVEMgZHJpdmVycwogIworIyBDT05GSUdfUlRDX0RSVl9EUzEyODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE1MTEgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9EUzE1NTMgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9EUzE3NDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9TVEsxN1RBOCBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX000OFQ4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQzNSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQ1OSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0JRNDgwMiBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX1YzMDIwIGlzIG5vdCBzZXQKIAogIwogIyBvbi1DUFUgUlRDIGRyaXZlcnMKICMKIENPTkZJR19SVENfRFJWX0JGSU49eQotCi0jCi0jIERNQSBFbmdpbmUgc3VwcG9ydAotIwotIyBDT05GSUdfRE1BX0VOR0lORSBpcyBub3Qgc2V0Ci0KLSMKLSMgRE1BIENsaWVudHMKLSMKLQotIwotIyBETUEgRGV2aWNlcwotIwotCi0jCi0jIFBCWCBzdXBwb3J0Ci0jCi0jIENPTkZJR19QQlggaXMgbm90IHNldAorIyBDT05GSUdfRE1BREVWSUNFUyBpcyBub3Qgc2V0CisjIENPTkZJR19VSU8gaXMgbm90IHNldAorIyBDT05GSUdfU1RBR0lORyBpcyBub3Qgc2V0CiAKICMKICMgRmlsZSBzeXN0ZW1zCkBAIC0xMDY3LDIwICsxMDQ0LDE4IEBACiAjIENPTkZJR19FWFQyX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQyX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0X0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GU19NQkNBQ0hFPXkKICMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorQ09ORklHX0ZJTEVfTE9DS0lORz15CiAjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKIENPTkZJR19JTk9USUZZPXkKIENPTkZJR19JTk9USUZZX1VTRVI9eQogIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAotIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CiAjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKQEAgLTExMDYsNyArMTA4MSw2IEBACiBDT05GSUdfU1lTRlM9eQogIyBDT05GSUdfVE1QRlMgaXMgbm90IHNldAogIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKLUNPTkZJR19SQU1GUz15CiAjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CiAKICMKQEAgLTExMjEsMzYgKzEwOTUsMzUgQEAKICMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CiBDT05GSUdfWUFGRlNfRlM9eQogQ09ORklHX1lBRkZTX1lBRkZTMT15CisjIENPTkZJR19ZQUZGU185QllURV9UQUdTIGlzIG5vdCBzZXQKICMgQ09ORklHX1lBRkZTX0RPRVNfRUNDIGlzIG5vdCBzZXQKIENPTkZJR19ZQUZGU19ZQUZGUzI9eQogQ09ORklHX1lBRkZTX0FVVE9fWUFGRlMyPXkKICMgQ09ORklHX1lBRkZTX0RJU0FCTEVfTEFaWV9MT0FEIGlzIG5vdCBzZXQKLUNPTkZJR19ZQUZGU19DSEVDS1BPSU5UX1JFU0VSVkVEX0JMT0NLUz0xMAogIyBDT05GSUdfWUFGRlNfRElTQUJMRV9XSURFX1ROT0RFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ZQUZGU19BTFdBWVNfQ0hFQ0tfQ0hVTktfRVJBU0VEIGlzIG5vdCBzZXQKIENPTkZJR19ZQUZGU19TSE9SVF9OQU1FU19JTl9SQU09eQogIyBDT05GSUdfSkZGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29yayBGaWxlIFN5c3RlbXMKLSMKK0NPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKIENPTkZJR19ORlNfRlM9bQogQ09ORklHX05GU19WMz15CiAjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAogIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CiBDT05GSUdfTE9DS0Q9bQogQ09ORklHX0xPQ0tEX1Y0PXkKIENPTkZJR19ORlNfQ09NTU9OPXkKIENPTkZJR19TVU5SUEM9bQotIyBDT05GSUdfU1VOUlBDX0JJTkQzNCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5SUENfUkVHSVNURVJfVjQgaXMgbm90IHNldAogIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKICMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAogQ09ORklHX1NNQl9GUz1tCkBAIC0xMTU5LDE3ICsxMTMyLDEyIEBACiAjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfOVBfRlMgaXMgbm90IHNldAogCiAjCiAjIFBhcnRpdGlvbiBUeXBlcwogIwogIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKIENPTkZJR19NU0RPU19QQVJUSVRJT049eQotCi0jCi0jIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0Ci0jCiBDT05GSUdfTkxTPW0KIENPTkZJR19OTFNfREVGQVVMVD0iaXNvODg1OS0xIgogIyBDT05GSUdfTkxTX0NPREVQQUdFXzQzNyBpcyBub3Qgc2V0CkBAIC0xMjEwLDI5ICsxMTc4LDMwIEBACiAjIENPTkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKICMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAogIyBDT05GSUdfTkxTX1VURjggaXMgbm90IHNldAotCi0jCi0jIERpc3RyaWJ1dGVkIExvY2sgTWFuYWdlcgotIwogIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKIAogIwotIyBQcm9maWxpbmcgc3VwcG9ydAotIwotIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKLQotIwogIyBLZXJuZWwgaGFja2luZwogIwogIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQ9eQogQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKK0NPTkZJR19GUkFNRV9XQVJOPTEwMjQKICMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTUVNT1JZX0lOSVQgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSyBpcyBub3Qgc2V0CisjIENPTkZJR19EWU5BTUlDX1BSSU5US19ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0FSQ0hfS0dEQj15CitDT05GSUdfREVCVUdfVkVSQk9TRT15CiAjIENPTkZJR19ERUJVR19NTVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RPVUJMRUZBVUxUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0hVTlRfRk9SX1pFUk8gaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0JGSU5fSFdUUkFDRV9PTj15CiBDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX0NPTVBSRVNTSU9OX09GRj15CkBAIC0xMjUwLDEzICsxMjE5LDk0IEBACiAjCiAjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKIENPTkZJR19TRUNVUklUWT15CisjIENPTkZJR19TRUNVUklUWUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFQ1VSSVRZX05FVFdPUksgaXMgbm90IHNldAotQ09ORklHX1NFQ1VSSVRZX0NBUEFCSUxJVElFUz15CisjIENPTkZJR19TRUNVUklUWV9GSUxFX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0CitDT05GSUdfU0VDVVJJVFlfREVGQVVMVF9NTUFQX01JTl9BRERSPTAKK0NPTkZJR19DUllQVE89eQogCiAjCi0jIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKICMKLSMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUFOQUdFUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NSWVBURCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVVUSEVOQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgQXV0aGVudGljYXRlZCBFbmNyeXB0aW9uIHdpdGggQXNzb2NpYXRlZCBEYXRhCisjCisjIENPTkZJR19DUllQVE9fQ0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUUlWIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBtb2RlcworIworIyBDT05GSUdfQ1JZUFRPX0NCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1RSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DVFMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0VDQiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTFJXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19QQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19YVFMgaXMgbm90IHNldAorCisjCisjIEhhc2ggbW9kZXMKKyMKKyMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKKworIworIyBEaWdlc3QKKyMKKyMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxNjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMzIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19XUDUxMiBpcyBub3Qgc2V0CisKKyMKKyMgQ2lwaGVycworIworIyBDT05GSUdfQ1JZUFRPX0FFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQU5VQklTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BUkM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FNRUxMSUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fREVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19GQ1JZUFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0tIQVpBRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0FMU0EyMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VFRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UV09GSVNIIGlzIG5vdCBzZXQKKworIworIyBDb21wcmVzc2lvbgorIworIyBDT05GSUdfQ1JZUFRPX0RFRkxBVEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0xaTyBpcyBub3Qgc2V0CisKKyMKKyMgUmFuZG9tIE51bWJlciBHZW5lcmF0aW9uCisjCisjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0hXPXkKIAogIwogIyBMaWJyYXJ5IHJvdXRpbmVzCkBAIC0xMjY0LDggKzEzMTQsMTAgQEAKIENPTkZJR19CSVRSRVZFUlNFPXkKIENPTkZJR19DUkNfQ0NJVFQ9bQogIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX1QxMERJRiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAogQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0NSQzcgaXMgbm90IHNldAogIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKIENPTkZJR19aTElCX0lORkxBVEU9eQogQ09ORklHX1BMSVNUPXkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9TUlYxX2RlZmNvbmZpZyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9TUlYxX2RlZmNvbmZpZwppbmRleCBiMTMwOWY4Li43YzgyNTBkIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvU1JWMV9kZWZjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL1NSVjFfZGVmY29uZmlnCkBAIC01OSw3ICs1OSw3IEBACiBDT05GSUdfSE9UUExVRz15CiBDT05GSUdfUFJJTlRLPXkKIENPTkZJR19CVUc9eQotQ09ORklHX0VMRl9DT1JFPXkKKyMgQ09ORklHX0VMRl9DT1JFIGlzIG5vdCBzZXQKIENPTkZJR19CQVNFX0ZVTEw9eQogQ09ORklHX0ZVVEVYPXkKIENPTkZJR19BTk9OX0lOT0RFUz15CkBAIC0xNzIsMTQgKzE3MiwxNCBAQAogQ09ORklHX0lSUV9VQVJUMV9UWD0xMAogQ09ORklHX0lSUV9NQUNfUlg9MTEKIENPTkZJR19JUlFfTUFDX1RYPTExCi1DT05GSUdfSVJRX1RNUjA9MTIKLUNPTkZJR19JUlFfVE1SMT0xMgotQ09ORklHX0lSUV9UTVIyPTEyCi1DT05GSUdfSVJRX1RNUjM9MTIKLUNPTkZJR19JUlFfVE1SND0xMgotQ09ORklHX0lSUV9UTVI1PTEyCi1DT05GSUdfSVJRX1RNUjY9MTIKLUNPTkZJR19JUlFfVE1SNz0xMgorQ09ORklHX0lSUV9USU1FUjA9MTIKK0NPTkZJR19JUlFfVElNRVIxPTEyCitDT05GSUdfSVJRX1RJTUVSMj0xMgorQ09ORklHX0lSUV9USU1FUjM9MTIKK0NPTkZJR19JUlFfVElNRVI0PTEyCitDT05GSUdfSVJRX1RJTUVSNT0xMgorQ09ORklHX0lSUV9USU1FUjY9MTIKK0NPTkZJR19JUlFfVElNRVI3PTEyCiBDT05GSUdfSVJRX1BPUlRHX0lOVEI9MTIKIENPTkZJR19JUlFfTUVNX0RNQTA9MTMKIENPTkZJR19JUlFfTUVNX0RNQTE9MTMKQEAgLTI3MSw3ICsyNzEsNiBAQAogIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKIENPTkZJR19aT05FX0RNQV9GTEFHPTEKIENPTkZJR19MQVJHRV9BTExPQ1M9eQotQ09ORklHX0JGSU5fRE1BXzVYWD15CiBDT05GSUdfRE1BX1VOQ0FDSEVEXzJNPXkKICMgQ09ORklHX0RNQV9VTkNBQ0hFRF8xTSBpcyBub3Qgc2V0CiAjIENPTkZJR19ETUFfVU5DQUNIRURfTk9ORSBpcyBub3Qgc2V0CkBAIC03ODYsNyArNzg1LDcgQEAKICMKICMgQ09ORklHX0kyQ19CTEFDS0ZJTl9HUElPIGlzIG5vdCBzZXQKIENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJPXkKLUNPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX0NMS19LSFo9NTAKK0NPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX0NMS19LSFo9MTAwCiAjIENPTkZJR19JMkNfR1BJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9UQ00tQkY1MzdfZGVmY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL1RDTS1CRjUzN19kZWZjb25maWcKaW5kZXggYzQ4MmVlMS4uOWFmNTIyYyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL1RDTS1CRjUzN19kZWZjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL1RDTS1CRjUzN19kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjQuNwotIyBUaHUgSnVsIDMxIDAwOjUzOjE1IDIwMDgKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yOC1yYzIKKyMgVHVlIEphbiAgNiAwOToyMjoxNyAyMDA5CiAjCiAjIENPTkZJR19NTVUgaXMgbm90IHNldAogIyBDT05GSUdfRlBVIGlzIG5vdCBzZXQKQEAgLTksNyArOSw2IEBACiAjIENPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITSBpcyBub3Qgc2V0CiBDT05GSUdfQkxBQ0tGSU49eQogQ09ORklHX1pPTkVfRE1BPXkKLUNPTkZJR19TRU1BUEhPUkVfU0xFRVBFUlM9eQogQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CiBDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKQEAgLTMwLDE3ICsyOSwxNCBAQAogQ09ORklHX1NZU1ZJUEM9eQogQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKICMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAotIyBDT05GSUdfVVNFUl9OUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QSURfTlMgaXMgbm90IHNldAogQ09ORklHX0lLQ09ORklHPXkKIENPTkZJR19JS0NPTkZJR19QUk9DPXkKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiAjIENPTkZJR19DR1JPVVBTIGlzIG5vdCBzZXQKLUNPTkZJR19GQUlSX0dST1VQX1NDSEVEPXkKLUNPTkZJR19GQUlSX1VTRVJfU0NIRUQ9eQotIyBDT05GSUdfRkFJUl9DR1JPVVBfU0NIRUQgaXMgbm90IHNldAotQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQorIyBDT05GSUdfR1JPVVBfU0NIRUQgaXMgbm90IHNldAorIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMiBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19OQU1FU1BBQ0VTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKIENPTkZJR19TWVNDVEw9eQpAQCAtNTIsMjIgKzQ4LDMwIEBACiAjIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15Ci1DT05GSUdfRUxGX0NPUkU9eQorIyBDT05GSUdfRUxGX0NPUkUgaXMgbm90IHNldAorQ09ORklHX0NPTVBBVF9CUks9eQogQ09ORklHX0JBU0VfRlVMTD15CiBDT05GSUdfRlVURVg9eQogQ09ORklHX0FOT05fSU5PREVTPXkKIENPTkZJR19FUE9MTD15CiBDT05GSUdfU0lHTkFMRkQ9eQorQ09ORklHX1RJTUVSRkQ9eQogQ09ORklHX0VWRU5URkQ9eQorQ09ORklHX0FJTz15CiBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQogQ09ORklHX1NMQUI9eQogIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisjIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX09QUk9GSUxFPXkKKyMgQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQgaXMgbm90IHNldAogQ09ORklHX1NMQUJJTkZPPXkKIENPTkZJR19SVF9NVVRFWEVTPXkKIENPTkZJR19USU5ZX1NITUVNPXkKIENPTkZJR19CQVNFX1NNQUxMPTAKIENPTkZJR19NT0RVTEVTPXkKKyMgQ09ORklHX01PRFVMRV9GT1JDRV9MT0FEIGlzIG5vdCBzZXQKIENPTkZJR19NT0RVTEVfVU5MT0FEPXkKICMgQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQgaXMgbm90IHNldAogIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldApAQCAtNzgsNiArODIsNyBAQAogIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19MU0YgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCiAjCiAjIElPIFNjaGVkdWxlcnMKQEAgLTkxLDkgKzk2LDExIEBACiAjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CiBDT05GSUdfREVGQVVMVF9OT09QPXkKIENPTkZJR19ERUZBVUxUX0lPU0NIRUQ9Im5vb3AiCitDT05GSUdfQ0xBU1NJQ19SQ1U9eQogQ09ORklHX1BSRUVNUFRfTk9ORT15CiAjIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0CiAjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZSRUVaRVIgaXMgbm90IHNldAogCiAjCiAjIEJsYWNrZmluIFByb2Nlc3NvciBPcHRpb25zCkBAIC0xMDIsNiArMTA5LDEwIEBACiAjCiAjIFByb2Nlc3NvciBhbmQgQm9hcmQgU2V0dGluZ3MKICMKKyMgQ09ORklHX0JGNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTE4IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTIyIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTIzIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTI0IGlzIG5vdCBzZXQKQEAgLTExNCwxOCArMTI1LDIzIEBACiAjIENPTkZJR19CRjUzNCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUzNiBpcyBub3Qgc2V0CiBDT05GSUdfQkY1Mzc9eQorIyBDT05GSUdfQkY1MzggaXMgbm90IHNldAorIyBDT05GSUdfQkY1MzkgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDIgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDQgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDcgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDggaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDkgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NjEgaXMgbm90IHNldAorQ09ORklHX0JGX1JFVl9NSU49MgorQ09ORklHX0JGX1JFVl9NQVg9MwogIyBDT05GSUdfQkZfUkVWXzBfMCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfMF8xIGlzIG5vdCBzZXQKIENPTkZJR19CRl9SRVZfMF8yPXkKICMgQ09ORklHX0JGX1JFVl8wXzMgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWXzBfNCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfMF81IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGX1JFVl8wXzYgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWX0FOWSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfTk9ORSBpcyBub3Qgc2V0CiBDT05GSUdfQkY1M3g9eQpAQCAtMTM3LDI1ICsxNTMsMjUgQEAKIENPTkZJR19JUlFfU1BPUlQxX1JYPTkKIENPTkZJR19JUlFfU1BPUlQxX1RYPTkKIENPTkZJR19JUlFfVFdJPTEwCi1DT05GSUdfSVJRX1NQST0xMAogQ09ORklHX0lSUV9VQVJUMF9SWD0xMAogQ09ORklHX0lSUV9VQVJUMF9UWD0xMAogQ09ORklHX0lSUV9VQVJUMV9SWD0xMAogQ09ORklHX0lSUV9VQVJUMV9UWD0xMAogQ09ORklHX0lSUV9NQUNfUlg9MTEKIENPTkZJR19JUlFfTUFDX1RYPTExCi1DT05GSUdfSVJRX1RNUjA9MTIKLUNPTkZJR19JUlFfVE1SMT0xMgotQ09ORklHX0lSUV9UTVIyPTEyCi1DT05GSUdfSVJRX1RNUjM9MTIKLUNPTkZJR19JUlFfVE1SND0xMgotQ09ORklHX0lSUV9UTVI1PTEyCi1DT05GSUdfSVJRX1RNUjY9MTIKLUNPTkZJR19JUlFfVE1SNz0xMgorQ09ORklHX0lSUV9USU1FUjA9MTIKK0NPTkZJR19JUlFfVElNRVIxPTEyCitDT05GSUdfSVJRX1RJTUVSMj0xMgorQ09ORklHX0lSUV9USU1FUjM9MTIKK0NPTkZJR19JUlFfVElNRVI0PTEyCitDT05GSUdfSVJRX1RJTUVSNT0xMgorQ09ORklHX0lSUV9USU1FUjY9MTIKK0NPTkZJR19JUlFfVElNRVI3PTEyCiBDT05GSUdfSVJRX1BPUlRHX0lOVEI9MTIKIENPTkZJR19JUlFfTUVNX0RNQTA9MTMKIENPTkZJR19JUlFfTUVNX0RNQTE9MTMKIENPTkZJR19JUlFfV0FUQ0g9MTMKK0NPTkZJR19JUlFfU1BJPTEwCiAjIENPTkZJR19CRklONTM3X1NUQU1QIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGSU41MzdfQkxVRVRFQ0hOSVhfQ00gaXMgbm90IHNldAogQ09ORklHX0JGSU41MzdfQkxVRVRFQ0hOSVhfVENNPXkKQEAgLTE5MSw3ICsyMDcsNiBAQAogIwogQ09ORklHX0NMS0lOX0haPTI1MDAwMDAwCiAjIENPTkZJR19CRklOX0tFUk5FTF9DTE9DSyBpcyBub3Qgc2V0Ci1DT05GSUdfTUFYX01FTV9TSVpFPTMyCiBDT05GSUdfTUFYX1ZDT19IWj02MDAwMDAwMDAKIENPTkZJR19NSU5fVkNPX0haPTUwMDAwMDAwCiBDT05GSUdfTUFYX1NDTEtfSFo9MTMzMzMzMzMzCkBAIC0yMDUsMTAgKzIyMCwxMCBAQAogIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAogQ09ORklHX0haPTI1MAorIyBDT05GSUdfU0NIRURfSFJUSUNLIGlzIG5vdCBzZXQKIENPTkZJR19HRU5FUklDX1RJTUU9eQogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQogIyBDT05GSUdfQ1lDTEVTX0NMT0NLU09VUkNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RJQ0tfT05FU0hPVCBpcyBub3Qgc2V0CiAjIENPTkZJR19OT19IWiBpcyBub3Qgc2V0CiAjIENPTkZJR19ISUdIX1JFU19USU1FUlMgaXMgbm90IHNldAogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlVJTEQ9eQpAQCAtMjQyLDYgKzI1NywxMiBAQAogQ09ORklHX0NBQ0hFTElORV9BTElHTkVEX0wxPXkKIENPTkZJR19TWVNDQUxMX1RBQl9MMT15CiBDT05GSUdfQ1BMQl9TV0lUQ0hfVEFCX0wxPXkKK0NPTkZJR19BUFBfU1RBQ0tfTDE9eQorCisjCisjIFNwZWVkIE9wdGltaXphdGlvbnMKKyMKK0NPTkZJR19CRklOX0lOU19MT1dPVkVSSEVBRD15CiBDT05GSUdfUkFNS0VSTkVMPXkKICMgQ09ORklHX1JPTUtFUk5FTCBpcyBub3Qgc2V0CiBDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CkBAIC0yNTAsMTQgKzI3MSwxMyBAQAogIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CiBDT05GSUdfRkxBVE1FTT15CiBDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQotIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TUEFSU0VNRU1fVk1FTU1BUF9FTkFCTEUgaXMgbm90IHNldAorQ09ORklHX1BBR0VGTEFHU19FWFRFTkRFRD15CiBDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAogIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIWVNfQUREUl9UXzY0QklUIGlzIG5vdCBzZXQKIENPTkZJR19aT05FX0RNQV9GTEFHPTEKIENPTkZJR19WSVJUX1RPX0JVUz15CiAjIENPTkZJR19CRklOX0dQVElNRVJTIGlzIG5vdCBzZXQKLUNPTkZJR19CRklOX0RNQV81WFg9eQogIyBDT05GSUdfRE1BX1VOQ0FDSEVEXzRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0RNQV9VTkNBQ0hFRF8yTSBpcyBub3Qgc2V0CiBDT05GSUdfRE1BX1VOQ0FDSEVEXzFNPXkKQEAgLTMwMCw3ICszMjAsNiBAQAogIwogIyBCdXMgb3B0aW9ucyAoUENJLCBQQ01DSUEsIEVJU0EsIE1DQSwgSVNBKQogIwotIyBDT05GSUdfUENJIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKIAogIwpAQCAtMzEwLDIzICszMjksMjAgQEAKIENPTkZJR19CSU5GTVRfRkxBVD15CiBDT05GSUdfQklORk1UX1pGTEFUPXkKIENPTkZJR19CSU5GTVRfU0hBUkVEX0ZMQVQ9eQorIyBDT05GSUdfSEFWRV9BT1VUIGlzIG5vdCBzZXQKICMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKIAogIwogIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKICMKICMgQ09ORklHX1BNIGlzIG5vdCBzZXQKLUNPTkZJR19TVVNQRU5EX1VQX1BPU1NJQkxFPXkKK0NPTkZJR19BUkNIX1NVU1BFTkRfUE9TU0lCTEU9eQogIyBDT05GSUdfUE1fV0FLRVVQX0JZX0dQSU8gaXMgbm90IHNldAogCiAjCiAjIENQVSBGcmVxdWVuY3kgc2NhbGluZwogIwogIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmtpbmcKLSMKICMgQ09ORklHX05FVCBpcyBub3Qgc2V0CiAKICMKQEAgLTM0NSw2ICszNjEsNyBAQAogQ09ORklHX01URF9QQVJUSVRJT05TPXkKICMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9DTURMSU5FX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BUjdfUEFSVFMgaXMgbm90IHNldAogCiAjCiAjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCkBAIC0zNjIsOCArMzc5LDEwIEBACiAjCiAjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCiAjCi0jIENPTkZJR19NVERfQ0ZJIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJPXkKICMgQ09ORklHX01URF9KRURFQ1BST0JFIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfR0VOX1BST0JFPXkKKyMgQ09ORklHX01URF9DRklfQURWX09QVElPTlMgaXMgbm90IHNldAogQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xPXkKIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMj15CiBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzQ9eQpAQCAtMzc0LDYgKzM5MywxMCBAQAogQ09ORklHX01URF9DRklfSTI9eQogIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0lOVEVMRVhUPXkKKyMgQ09ORklHX01URF9DRklfQU1EU1REIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9VVElMPXkKIENPTkZJR19NVERfUkFNPXkKICMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAogIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CkBAIC0zODEsOCArNDA0LDkgQEAKICMKICMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcwogIwotIyBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1MgaXMgbm90IHNldAotIyBDT05GSUdfTVREX0dQSU9fQUREUiBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1M9eQorIyBDT05GSUdfTVREX1BIWVNNQVAgaXMgbm90IHNldAorQ09ORklHX01URF9HUElPX0FERFI9eQogQ09ORklHX01URF9VQ0xJTlVYPXkKICMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKIApAQCAtNDE2LDEwICs0NDAsMTMgQEAKIENPTkZJR19CTEtfREVWX1JBTT15CiBDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKIENPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKLUNPTkZJR19CTEtfREVWX1JBTV9CTE9DS1NJWkU9MTAyNAorIyBDT05GSUdfQkxLX0RFVl9YSVAgaXMgbm90IHNldAogIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKIENPTkZJR19NSVNDX0RFVklDRVM9eQogIyBDT05GSUdfRUVQUk9NXzkzQ1g2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQ0xPU1VSRV9TRVJWSUNFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9JREU9eQogIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKIAogIwpAQCAtNDU0LDggKzQ4MSwxMSBAQAogIyBDT05GSUdfQkY1eHhfUFBJIGlzIG5vdCBzZXQKIENPTkZJR19CRklOX1NQT1JUPXkKICMgQ09ORklHX0JGSU5fVElNRVJfTEFURU5DWSBpcyBub3Qgc2V0CitDT05GSUdfQkZJTl9ETUFfSU5URVJGQUNFPW0KICMgQ09ORklHX1NJTVBMRV9HUElPIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVktNRU0gaXMgbm90IHNldAorIyBDT05GSUdfQkZJTl9KVEFHX0NPTU0gaXMgbm90IHNldAogIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKIAogIwpAQCAtNDg2LDE1ICs1MTYsMTAgQEAKICMgQ09ORklHX0NBTjRMSU5VWCBpcyBub3Qgc2V0CiAjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAogIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAogIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAogIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQyBpcyBub3Qgc2V0Ci0KLSMKLSMgU1BJIHN1cHBvcnQKLSMKIENPTkZJR19TUEk9eQogQ09ORklHX1NQSV9NQVNURVI9eQogCkBAIC01MDIsNiArNTI3LDcgQEAKICMgU1BJIE1hc3RlciBDb250cm9sbGVyIERyaXZlcnMKICMKIENPTkZJR19TUElfQkZJTj15CisjIENPTkZJR19TUElfQkZJTl9MT0NLIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQSV9CSVRCQU5HIGlzIG5vdCBzZXQKIAogIwpAQCAtNTEwLDkgKzUzNiwxMyBAQAogIyBDT05GSUdfU1BJX0FUMjUgaXMgbm90IHNldAogIyBDT05GSUdfU1BJX1NQSURFViBpcyBub3Qgc2V0CiAjIENPTkZJR19TUElfVExFNjJYMCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUI9eQorIyBDT05GSUdfR1BJT0xJQiBpcyBub3Qgc2V0CiAjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAogIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKIENPTkZJR19XQVRDSERPRz15CiAjIENPTkZJR19XQVRDSERPR19OT1dBWU9VVCBpcyBub3Qgc2V0CiAKQEAgLTUyMywyMCArNTUzLDI3IEBACiBDT05GSUdfQkZJTl9XRFQ9eQogCiAjCi0jIFNvbmljcyBTaWxpY29uIEJhY2twbGFuZQotIwotQ09ORklHX1NTQl9QT1NTSUJMRT15Ci0jIENPTkZJR19TU0IgaXMgbm90IHNldAotCi0jCiAjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKICMKKyMgQ09ORklHX01GRF9DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTg0MDAgaXMgbm90IHNldAogCiAjCiAjIE11bHRpbWVkaWEgZGV2aWNlcwogIworCisjCisjIE11bHRpbWVkaWEgY29yZSBzdXBwb3J0CisjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fTUVESUEgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZHJpdmVycworIwogIyBDT05GSUdfREFCIGlzIG5vdCBzZXQKIAogIwpAQCAtNTUxLDIwICs1ODgsMTYgQEAKICMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAogIwogIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBTb3VuZAotIwogIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1NVUFBPUlQgaXMgbm90IHNldAogIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FTVNUSUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FDQ0VTU0lCSUxJVFkgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0NMQVNTIGlzIG5vdCBzZXQKLQotIwotIyBVc2Vyc3BhY2UgSS9PCi0jCisjIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFHSU5HIGlzIG5vdCBzZXQKIAogIwogIyBGaWxlIHN5c3RlbXMKQEAgLTU3NCwxOSArNjA3LDE3IEBACiAjIENPTkZJR19FWFQyX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQyX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0X0ZTIGlzIG5vdCBzZXQKIENPTkZJR19GU19NQkNBQ0hFPXkKICMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorQ09ORklHX0ZJTEVfTE9DS0lORz15CiAjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKIENPTkZJR19JTk9USUZZPXkKIENPTkZJR19JTk9USUZZX1VTRVI9eQogIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAotIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CiAjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKQEAgLTYyOCw4ICs2NTksMTEgQEAKICMgQ09ORklHX0pGRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAogCkBAIC02MzksNyArNjczLDYgQEAKICMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CiBDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKICMgQ09ORklHX05MUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlNUUlVNRU5UQVRJT04gaXMgbm90IHNldAogCiAjCiAjIEtlcm5lbCBoYWNraW5nCkBAIC02NDcsMTQgKzY4MCwyMiBAQAogIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAogQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQ9eQogQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKK0NPTkZJR19GUkFNRV9XQVJOPTEwMjQKICMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19GUz15CiAjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01FTU9SWV9JTklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0sgaXMgbm90IHNldAorIyBDT05GSUdfRFlOQU1JQ19QUklOVEtfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9BUkNIX0tHREI9eQorQ09ORklHX0RFQlVHX1ZFUkJPU0U9eQogQ09ORklHX0RFQlVHX01NUlM9eQorIyBDT05GSUdfREVCVUdfRE9VQkxFRkFVTFQgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0hVTlRfRk9SX1pFUk89eQogQ09ORklHX0RFQlVHX0JGSU5fSFdUUkFDRV9PTj15CiBDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX0NPTVBSRVNTSU9OX09GRj15CkBAIC02NzEsOSArNzEyLDggQEAKICMgU2VjdXJpdHkgb3B0aW9ucwogIwogIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0Ci1DT05GSUdfU0VDVVJJVFk9eQotIyBDT05GSUdfU0VDVVJJVFlfTkVUV09SSyBpcyBub3Qgc2V0Ci1DT05GSUdfU0VDVVJJVFlfQ0FQQUJJTElUSUVTPXkKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZRlMgaXMgbm90IHNldAogIyBDT05GSUdfU0VDVVJJVFlfRklMRV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKIApAQCAtNjgyLDYgKzcyMiw3IEBACiAjCiAjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAogIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX1QxMERJRiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAogIyBDT05GSUdfQ1JDMzIgaXMgbm90IHNldAogIyBDT05GSUdfQ1JDNyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IDYwNmVjZmQuLmQwZDFhYzQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0xLDMgKzEsNCBAQAogaW5jbHVkZSBpbmNsdWRlL2FzbS1nZW5lcmljL0tidWlsZC5hc20KIAogdW5pZmRlZi15ICs9IGZpeGVkX2NvZGUuaAordW5pZmRlZi15ICs9IHN3YWIuaApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9hdG9taWMuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYXRvbWljLmgKaW5kZXggN2NmNTA4Ny4uOTRiMmE5YiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9hdG9taWMuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2F0b21pYy5oCkBAIC0xLDYgKzEsNyBAQAogI2lmbmRlZiBfX0FSQ0hfQkxBQ0tGSU5fQVRPTUlDX18KICNkZWZpbmUgX19BUkNIX0JMQUNLRklOX0FUT01JQ19fCiAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4JLyogbG9jYWxfaXJxX1hYWCgpICovCiAKIC8qCkBAIC0xMyw2OSArMTQsMTczIEBACiAgKiBUb255IEtvdSAodG9ueWtvQGxpbmVvLmNhKSAgIExpbmVvIEluYy4gICAyMDAxCiAgKi8KIAotdHlwZWRlZiBzdHJ1Y3QgewotCWludCBjb3VudGVyOwotfSBhdG9taWNfdDsKICNkZWZpbmUgQVRPTUlDX0lOSVQoaSkJeyAoaSkgfQotCi0jZGVmaW5lIGF0b21pY19yZWFkKHYpCQkoKHYpLT5jb3VudGVyKQogI2RlZmluZSBhdG9taWNfc2V0KHYsIGkpCSgoKHYpLT5jb3VudGVyKSA9IGkpCiAKLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgYXRvbWljX2FkZChpbnQgaSwgYXRvbWljX3QgKiB2KQorI2lmZGVmIENPTkZJR19TTVAKKworI2RlZmluZSBhdG9taWNfcmVhZCh2KQlfX3Jhd191bmNhY2hlZF9mZXRjaF9hc20oJih2KS0+Y291bnRlcikKKworYXNtbGlua2FnZSBpbnQgX19yYXdfdW5jYWNoZWRfZmV0Y2hfYXNtKGNvbnN0IHZvbGF0aWxlIGludCAqcHRyKTsKKworYXNtbGlua2FnZSBpbnQgX19yYXdfYXRvbWljX3VwZGF0ZV9hc20odm9sYXRpbGUgaW50ICpwdHIsIGludCB2YWx1ZSk7CisKK2FzbWxpbmthZ2UgaW50IF9fcmF3X2F0b21pY19jbGVhcl9hc20odm9sYXRpbGUgaW50ICpwdHIsIGludCB2YWx1ZSk7CisKK2FzbWxpbmthZ2UgaW50IF9fcmF3X2F0b21pY19zZXRfYXNtKHZvbGF0aWxlIGludCAqcHRyLCBpbnQgdmFsdWUpOworCithc21saW5rYWdlIGludCBfX3Jhd19hdG9taWNfeG9yX2FzbSh2b2xhdGlsZSBpbnQgKnB0ciwgaW50IHZhbHVlKTsKKworYXNtbGlua2FnZSBpbnQgX19yYXdfYXRvbWljX3Rlc3RfYXNtKGNvbnN0IHZvbGF0aWxlIGludCAqcHRyLCBpbnQgdmFsdWUpOworCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX2FkZChpbnQgaSwgYXRvbWljX3QgKnYpCit7CisJX19yYXdfYXRvbWljX3VwZGF0ZV9hc20oJnYtPmNvdW50ZXIsIGkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX3N1YihpbnQgaSwgYXRvbWljX3QgKnYpCit7CisJX19yYXdfYXRvbWljX3VwZGF0ZV9hc20oJnYtPmNvdW50ZXIsIC1pKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXRvbWljX2FkZF9yZXR1cm4oaW50IGksIGF0b21pY190ICp2KQoreworCXJldHVybiBfX3Jhd19hdG9taWNfdXBkYXRlX2FzbSgmdi0+Y291bnRlciwgaSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF0b21pY19zdWJfcmV0dXJuKGludCBpLCBhdG9taWNfdCAqdikKK3sKKwlyZXR1cm4gX19yYXdfYXRvbWljX3VwZGF0ZV9hc20oJnYtPmNvdW50ZXIsIC1pKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF0b21pY19pbmModm9sYXRpbGUgYXRvbWljX3QgKnYpCit7CisJX19yYXdfYXRvbWljX3VwZGF0ZV9hc20oJnYtPmNvdW50ZXIsIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX2RlYyh2b2xhdGlsZSBhdG9taWNfdCAqdikKK3sKKwlfX3Jhd19hdG9taWNfdXBkYXRlX2FzbSgmdi0+Y291bnRlciwgLTEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX2NsZWFyX21hc2soaW50IG1hc2ssIGF0b21pY190ICp2KQoreworCV9fcmF3X2F0b21pY19jbGVhcl9hc20oJnYtPmNvdW50ZXIsIG1hc2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX3NldF9tYXNrKGludCBtYXNrLCBhdG9taWNfdCAqdikKK3sKKwlfX3Jhd19hdG9taWNfc2V0X2FzbSgmdi0+Y291bnRlciwgbWFzayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF0b21pY190ZXN0X21hc2soaW50IG1hc2ssIGF0b21pY190ICp2KQoreworCXJldHVybiBfX3Jhd19hdG9taWNfdGVzdF9hc20oJnYtPmNvdW50ZXIsIG1hc2spOworfQorCisvKiBBdG9taWMgb3BlcmF0aW9ucyBhcmUgYWxyZWFkeSBzZXJpYWxpemluZyAqLworI2RlZmluZSBzbXBfbWJfX2JlZm9yZV9hdG9taWNfZGVjKCkgICAgYmFycmllcigpCisjZGVmaW5lIHNtcF9tYl9fYWZ0ZXJfYXRvbWljX2RlYygpIGJhcnJpZXIoKQorI2RlZmluZSBzbXBfbWJfX2JlZm9yZV9hdG9taWNfaW5jKCkgICAgYmFycmllcigpCisjZGVmaW5lIHNtcF9tYl9fYWZ0ZXJfYXRvbWljX2luYygpIGJhcnJpZXIoKQorCisjZWxzZSAvKiAhQ09ORklHX1NNUCAqLworCisjZGVmaW5lIGF0b21pY19yZWFkKHYpCSgodiktPmNvdW50ZXIpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdG9taWNfYWRkKGludCBpLCBhdG9taWNfdCAqdikKIHsKIAlsb25nIGZsYWdzOwogCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKIAl2LT5jb3VudGVyICs9IGk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBhdG9taWNfc3ViKGludCBpLCBhdG9taWNfdCAqIHYpCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX3N1YihpbnQgaSwgYXRvbWljX3QgKnYpCiB7CiAJbG9uZyBmbGFnczsKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CiAJdi0+Y291bnRlciAtPSBpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CiAKIH0KIAotc3RhdGljIGlubGluZSBpbnQgYXRvbWljX2FkZF9yZXR1cm4oaW50IGksIGF0b21pY190ICogdikKK3N0YXRpYyBpbmxpbmUgaW50IGF0b21pY19hZGRfcmV0dXJuKGludCBpLCBhdG9taWNfdCAqdikKIHsKIAlpbnQgX190ZW1wID0gMDsKIAlsb25nIGZsYWdzOwogCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKIAl2LT5jb3VudGVyICs9IGk7CiAJX190ZW1wID0gdi0+Y291bnRlcjsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogCiAKIAlyZXR1cm4gX190ZW1wOwogfQogCitzdGF0aWMgaW5saW5lIGludCBhdG9taWNfc3ViX3JldHVybihpbnQgaSwgYXRvbWljX3QgKnYpCit7CisJaW50IF9fdGVtcCA9IDA7CisJbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKKwl2LT5jb3VudGVyIC09IGk7CisJX190ZW1wID0gdi0+Y291bnRlcjsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CisKKwlyZXR1cm4gX190ZW1wOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX2luYyh2b2xhdGlsZSBhdG9taWNfdCAqdikKK3sKKwlsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOworCXYtPmNvdW50ZXIrKzsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdG9taWNfZGVjKHZvbGF0aWxlIGF0b21pY190ICp2KQoreworCWxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CisJdi0+Y291bnRlci0tOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF0b21pY19jbGVhcl9tYXNrKHVuc2lnbmVkIGludCBtYXNrLCBhdG9taWNfdCAqdikKK3sKKwlsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOworCXYtPmNvdW50ZXIgJj0gfm1hc2s7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX3NldF9tYXNrKHVuc2lnbmVkIGludCBtYXNrLCBhdG9taWNfdCAqdikKK3sKKwlsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOworCXYtPmNvdW50ZXIgfD0gbWFzazsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7Cit9CisKKy8qIEF0b21pYyBvcGVyYXRpb25zIGFyZSBhbHJlYWR5IHNlcmlhbGl6aW5nICovCisjZGVmaW5lIHNtcF9tYl9fYmVmb3JlX2F0b21pY19kZWMoKSAgICBiYXJyaWVyKCkKKyNkZWZpbmUgc21wX21iX19hZnRlcl9hdG9taWNfZGVjKCkgYmFycmllcigpCisjZGVmaW5lIHNtcF9tYl9fYmVmb3JlX2F0b21pY19pbmMoKSAgICBiYXJyaWVyKCkKKyNkZWZpbmUgc21wX21iX19hZnRlcl9hdG9taWNfaW5jKCkgYmFycmllcigpCisKKyNlbmRpZiAvKiAhQ09ORklHX1NNUCAqLworCiAjZGVmaW5lIGF0b21pY19hZGRfbmVnYXRpdmUoYSwgdikJKGF0b21pY19hZGRfcmV0dXJuKChhKSwgKHYpKSA8IDApCi1zdGF0aWMgaW5saW5lIGludCBhdG9taWNfc3ViX3JldHVybihpbnQgaSwgYXRvbWljX3QgKiB2KQotewotCWludCBfX3RlbXAgPSAwOwotCWxvbmcgZmxhZ3M7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0Jdi0+Y291bnRlciAtPSBpOwotCV9fdGVtcCA9IHYtPmNvdW50ZXI7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0JcmV0dXJuIF9fdGVtcDsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZCBhdG9taWNfaW5jKHZvbGF0aWxlIGF0b21pY190ICogdikKLXsKLQlsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXYtPmNvdW50ZXIrKzsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19CisjZGVmaW5lIGF0b21pY19kZWNfcmV0dXJuKHYpIGF0b21pY19zdWJfcmV0dXJuKDEsKHYpKQorI2RlZmluZSBhdG9taWNfaW5jX3JldHVybih2KSBhdG9taWNfYWRkX3JldHVybigxLCh2KSkKIAogI2RlZmluZSBhdG9taWNfY21weGNoZyh2LCBvLCBuKSAoKGludCljbXB4Y2hnKCYoKHYpLT5jb3VudGVyKSwgKG8pLCAobikpKQogI2RlZmluZSBhdG9taWNfeGNoZyh2LCBuZXcpICh4Y2hnKCYoKHYpLT5jb3VudGVyKSwgbmV3KSkKQEAgLTkwLDQyICsxOTUsNiBAQAogfSkKICNkZWZpbmUgYXRvbWljX2luY19ub3RfemVybyh2KSBhdG9taWNfYWRkX3VubGVzcygodiksIDEsIDApCiAKLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgYXRvbWljX2RlYyh2b2xhdGlsZSBhdG9taWNfdCAqIHYpCi17Ci0JbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQl2LT5jb3VudGVyLS07Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGF0b21pY19jbGVhcl9tYXNrKHVuc2lnbmVkIGludCBtYXNrLCBhdG9taWNfdCAqIHYpCi17Ci0JbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQl2LT5jb3VudGVyICY9IH5tYXNrOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZCBhdG9taWNfc2V0X21hc2sodW5zaWduZWQgaW50IG1hc2ssIGF0b21pY190ICogdikKLXsKLQlsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXYtPmNvdW50ZXIgfD0gbWFzazsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLS8qIEF0b21pYyBvcGVyYXRpb25zIGFyZSBhbHJlYWR5IHNlcmlhbGl6aW5nICovCi0jZGVmaW5lIHNtcF9tYl9fYmVmb3JlX2F0b21pY19kZWMoKSAgICBiYXJyaWVyKCkKLSNkZWZpbmUgc21wX21iX19hZnRlcl9hdG9taWNfZGVjKCkgYmFycmllcigpCi0jZGVmaW5lIHNtcF9tYl9fYmVmb3JlX2F0b21pY19pbmMoKSAgICBiYXJyaWVyKCkKLSNkZWZpbmUgc21wX21iX19hZnRlcl9hdG9taWNfaW5jKCkgYmFycmllcigpCi0KLSNkZWZpbmUgYXRvbWljX2RlY19yZXR1cm4odikgYXRvbWljX3N1Yl9yZXR1cm4oMSwodikpCi0jZGVmaW5lIGF0b21pY19pbmNfcmV0dXJuKHYpIGF0b21pY19hZGRfcmV0dXJuKDEsKHYpKQotCiAvKgogICogYXRvbWljX2luY19hbmRfdGVzdCAtIGluY3JlbWVudCBhbmQgdGVzdAogICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iZmluLWdsb2JhbC5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iZmluLWdsb2JhbC5oCmluZGV4IDc3Mjk1NjYuLmRhZmZjMDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmZpbi1nbG9iYWwuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JmaW4tZ2xvYmFsLmgKQEAgLTQ3LDYgKzQ3LDkgQEAKICMgZGVmaW5lIERNQV9VTkNBQ0hFRF9SRUdJT04gKDApCiAjZW5kaWYKIAorZXh0ZXJuIHZvaWQgYmZpbl9zZXR1cF9jYWNoZXModW5zaWduZWQgaW50IGNwdSk7CitleHRlcm4gdm9pZCBiZmluX3NldHVwX2NwdWRhdGEodW5zaWduZWQgaW50IGNwdSk7CisKIGV4dGVybiB1bnNpZ25lZCBsb25nIGdldF9jY2xrKHZvaWQpOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZ2V0X3NjbGsodm9pZCk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBzY2xrX3RvX3VzZWNzKHVuc2lnbmVkIGxvbmcgc2Nsayk7CkBAIC01OCw4ICs2MSw2IEBACiAKIC8qIGluaXQgZnVuY3Rpb25zIG9ubHkgKi8KIGV4dGVybiBpbnQgaW5pdF9hcmNoX2lycSh2b2lkKTsKLWV4dGVybiB2b2lkIGJmaW5faWNhY2hlX2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCBiZmluX2RjYWNoZV9pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgaW5pdF9leGNlcHRpb25fdmVjdG9ycyh2b2lkKTsKIGV4dGVybiB2b2lkIHByb2dyYW1fSUFSKHZvaWQpOwogCkBAIC0xMTAsNyArMTExLDcgQEAKIAogI2lmZGVmIENPTkZJR19CRklOX0lDQUNIRV9MT0NLCiBleHRlcm4gdm9pZCBjYWNoZV9ncmFiX2xvY2soaW50IHdheSk7Ci1leHRlcm4gdm9pZCBjYWNoZV9sb2NrKGludCB3YXkpOworZXh0ZXJuIHZvaWQgYmZpbl9jYWNoZV9sb2NrKGludCB3YXkpOwogI2VuZGlmCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iZmluNXh4X3NwaS5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iZmluNXh4X3NwaS5oCmluZGV4IDlmYTE5MTUuLjEzMDZlNmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmZpbjV4eF9zcGkuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JmaW41eHhfc3BpLmgKQEAgLTEsMjIgKzEsMTIgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCwgQW5hbG9nIERldmljZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKLSoKLSogRklMRSBiZmluNXh4X3NwaS5oCi0qIFBST0dSQU1NRVIoUyk6IEx1a2UgWWFuZyAoQW5hbG9nIERldmljZXMgSW5jLikKLSoKLSoKLSogREFURSBPRiBDUkVBVElPTjogTWFyY2guIDEwdGggMjAwNgotKgotKiBTWU5PUFNJUzoKLSoKLSogREVTQ1JJUFRJT046IGhlYWRlciBmaWxlIGZvciBTUEkgY29udHJvbGxlciBkcml2ZXIgZm9yIEJsYWNrZmluNXh4LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotKiBNT0RJRklDQVRJT04gSElTVE9SWToKLSogTWFyY2ggMTAsIDIwMDYgIGJmaW41eHhfc3BpLmggQ3JlYXRlZC4gKEx1a2UgWWFuZykKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEJsYWNrZmluIE9uLUNoaXAgU1BJIERyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLwogCiAjaWZuZGVmIF9TUElfQ0hBTk5FTF9IXwogI2RlZmluZSBfU1BJX0NIQU5ORUxfSF8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmZpbl9zZGguaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmZpbl9zZGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjFkNTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iZmluX3NkaC5oCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBiZmluX3NkaC5oIC0gQmxhY2tmaW4gU0RIIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IDIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaWZuZGVmIF9fQkZJTl9TREhfSF9fCisjZGVmaW5lIF9fQkZJTl9TREhfSF9fCisKK3N0cnVjdCBiZmluX3NkX2hvc3QgeworCWludCBkbWFfY2hhbjsKKwlpbnQgaXJxX2ludDA7CisJaW50IGlycV9pbnQxOworCXUxNiBwaW5fcmVxWzddOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JmaW5fc3BvcnQuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmZpbl9zcG9ydC5oCmluZGV4IGM3NmVkOGQuLmZlODhhMmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmZpbl9zcG9ydC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmZpbl9zcG9ydC5oCkBAIC0xMjAsOSArMTIwLDYgQEAKICNkZWZpbmUgU1BPUlRfSU9DX01BR0lDCQknUCcKICNkZWZpbmUgU1BPUlRfSU9DX0NPTkZJRwlfSU9XUignUCcsIDB4MDEsIHN0cnVjdCBzcG9ydF9jb25maWcpCiAKLS8qIFRlc3QgcHVycG9zZSAqLwotI2RlZmluZSBFTkFCTEVfQUQ3MzMxMQkJX0lPV1IoJ1AnLCAweDAyLCBpbnQpCi0KIHN0cnVjdCBzcG9ydF9kZXYgewogCXN0cnVjdCBjZGV2IGNkZXY7CS8qIENoYXIgZGV2aWNlIHN0cnVjdHVyZSAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2Jmcm9tLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2Jmcm9tLmgKaW5kZXggY2ZlODAyNC4uOWU0YmU1ZSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iZnJvbS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmZyb20uaApAQCAtNDMsNiArNDMsMTEgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBiZnJvbV9Tb2Z0UmVzZXQodm9pZCAqbmV3X3N0YWNrKQogewogCXdoaWxlICgxKQorCQkvKgorCQkgKiBXZSBkb24ndCBkZWNsYXJlIHRoZSBTUCBhcyBjbG9iYmVyZWQgb24gcHVycG9zZSwgc2luY2UKKwkJICogaXQgY29uZnVzZXMgdGhlIGhlY2sgb3V0IG9mIHRoZSBjb21waWxlciwgYW5kIHRoaXMgZnVuY3Rpb24KKwkJICogbmV2ZXIgcmV0dXJucworCQkgKi8KIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oCiAJCQkic3AgPSAlW3N0YWNrXTsiCiAJCQkianVtcCAoJVtiZnJvbV9zeXNjb250cm9sXSk7IgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iaXRvcHMuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYml0b3BzLmgKaW5kZXggYzQyOGU0MS4uMjFiMDM2ZSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iaXRvcHMuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JpdG9wcy5oCkBAIC03LDcgKzcsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CS8qIHN3YWIzMiAqLwotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4JCS8qIHNhdmVfZmxhZ3MgKi8KIAogI2lmZGVmIF9fS0VSTkVMX18KIApAQCAtMjAsOTYgKzE5LDE5MiBAQAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2JpdG9wcy9zY2hlZC5oPgogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2JpdG9wcy9mZnouaD4KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBzZXRfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKKyNpZmRlZiBDT05GSUdfU01QCisKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisKK2FzbWxpbmthZ2UgaW50IF9fcmF3X2JpdF9zZXRfYXNtKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIsIGludCBucik7CisKK2FzbWxpbmthZ2UgaW50IF9fcmF3X2JpdF9jbGVhcl9hc20odm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkciwgaW50IG5yKTsKKworYXNtbGlua2FnZSBpbnQgX19yYXdfYml0X3RvZ2dsZV9hc20odm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkciwgaW50IG5yKTsKKworYXNtbGlua2FnZSBpbnQgX19yYXdfYml0X3Rlc3Rfc2V0X2FzbSh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyLCBpbnQgbnIpOworCithc21saW5rYWdlIGludCBfX3Jhd19iaXRfdGVzdF9jbGVhcl9hc20odm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkciwgaW50IG5yKTsKKworYXNtbGlua2FnZSBpbnQgX19yYXdfYml0X3Rlc3RfdG9nZ2xlX2FzbSh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyLCBpbnQgbnIpOworCithc21saW5rYWdlIGludCBfX3Jhd19iaXRfdGVzdF9hc20oY29uc3Qgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkciwgaW50IG5yKTsKKworc3RhdGljIGlubGluZSB2b2lkIHNldF9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmEgPSBhZGRyICsgKG5yID4+IDUpOworCV9fcmF3X2JpdF9zZXRfYXNtKGEsIG5yICYgMHgxZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmEgPSBhZGRyICsgKG5yID4+IDUpOworCV9fcmF3X2JpdF9jbGVhcl9hc20oYSwgbnIgJiAweDFmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNoYW5nZV9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmEgPSBhZGRyICsgKG5yID4+IDUpOworCV9fcmF3X2JpdF90b2dnbGVfYXNtKGEsIG5yICYgMHgxZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHRlc3RfYml0KGludCBuciwgY29uc3Qgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKK3sKKwl2b2xhdGlsZSBjb25zdCB1bnNpZ25lZCBsb25nICphID0gYWRkciArIChuciA+PiA1KTsKKwlyZXR1cm4gX19yYXdfYml0X3Rlc3RfYXNtKGEsIG5yICYgMHgxZikgIT0gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgdGVzdF9hbmRfc2V0X2JpdChpbnQgbnIsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCit7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYSA9IGFkZHIgKyAobnIgPj4gNSk7CisJcmV0dXJuIF9fcmF3X2JpdF90ZXN0X3NldF9hc20oYSwgbnIgJiAweDFmKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgdGVzdF9hbmRfY2xlYXJfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphID0gYWRkciArIChuciA+PiA1KTsKKwlyZXR1cm4gX19yYXdfYml0X3Rlc3RfY2xlYXJfYXNtKGEsIG5yICYgMHgxZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHRlc3RfYW5kX2NoYW5nZV9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmEgPSBhZGRyICsgKG5yID4+IDUpOworCXJldHVybiBfX3Jhd19iaXRfdGVzdF90b2dnbGVfYXNtKGEsIG5yICYgMHgxZik7Cit9CisKKyNlbHNlIC8qICFDT05GSUdfU01QICovCisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CQkvKiBzYXZlX2ZsYWdzICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKIHsKIAlpbnQgKmEgPSAoaW50ICopYWRkcjsKIAlpbnQgbWFzazsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCiAJYSArPSBuciA+PiA1OwogCW1hc2sgPSAxIDw8IChuciAmIDB4MWYpOwotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CiAJKmEgfD0gbWFzazsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fc2V0X2JpdChpbnQgbnIsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCitzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKIHsKIAlpbnQgKmEgPSAoaW50ICopYWRkcjsKIAlpbnQgbWFzazsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWEgKz0gbnIgPj4gNTsKKwltYXNrID0gMSA8PCAobnIgJiAweDFmKTsKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CisJKmEgJj0gfm1hc2s7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2hhbmdlX2JpdChpbnQgbnIsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCit7CisJaW50IG1hc2ssIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgKkFERFIgPSAodW5zaWduZWQgbG9uZyAqKWFkZHI7CisKKwlBRERSICs9IG5yID4+IDU7CisJbWFzayA9IDEgPDwgKG5yICYgMzEpOworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKKwkqQUREUiBePSBtYXNrOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgdGVzdF9hbmRfc2V0X2JpdChpbnQgbnIsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCit7CisJaW50IG1hc2ssIHJldHZhbDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKmEgPSAodm9sYXRpbGUgdW5zaWduZWQgaW50ICopYWRkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJYSArPSBuciA+PiA1OwogCW1hc2sgPSAxIDw8IChuciAmIDB4MWYpOworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKKwlyZXR2YWwgPSAobWFzayAmICphKSAhPSAwOwogCSphIHw9IG1hc2s7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOworCisJcmV0dXJuIHJldHZhbDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgdGVzdF9hbmRfY2xlYXJfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKK3sKKwlpbnQgbWFzaywgcmV0dmFsOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCAqYSA9ICh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKilhZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlhICs9IG5yID4+IDU7CisJbWFzayA9IDEgPDwgKG5yICYgMHgxZik7CisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOworCXJldHZhbCA9IChtYXNrICYgKmEpICE9IDA7CisJKmEgJj0gfm1hc2s7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGlubGluZSBpbnQgdGVzdF9hbmRfY2hhbmdlX2JpdChpbnQgbnIsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCit7CisJaW50IG1hc2ssIHJldHZhbDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKmEgPSAodm9sYXRpbGUgdW5zaWduZWQgaW50ICopYWRkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJYSArPSBuciA+PiA1OworCW1hc2sgPSAxIDw8IChuciAmIDB4MWYpOworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKKwlyZXR2YWwgPSAobWFzayAmICphKSAhPSAwOworCSphIF49IG1hc2s7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOworCXJldHVybiByZXR2YWw7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfU01QICovCisKIC8qCiAgKiBjbGVhcl9iaXQoKSBkb2Vzbid0IHByb3ZpZGUgYW55IGJhcnJpZXIgZm9yIHRoZSBjb21waWxlci4KICAqLwogI2RlZmluZSBzbXBfbWJfX2JlZm9yZV9jbGVhcl9iaXQoKQliYXJyaWVyKCkKICNkZWZpbmUgc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKQliYXJyaWVyKCkKIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBjbGVhcl9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQotewotCWludCAqYSA9IChpbnQgKilhZGRyOwotCWludCBtYXNrOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JYSArPSBuciA+PiA1OwotCW1hc2sgPSAxIDw8IChuciAmIDB4MWYpOwotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkqYSAmPSB+bWFzazsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgX19jbGVhcl9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQorc3RhdGljIGlubGluZSB2b2lkIF9fc2V0X2JpdChpbnQgbnIsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCiB7CiAJaW50ICphID0gKGludCAqKWFkZHI7CiAJaW50IG1hc2s7CiAKIAlhICs9IG5yID4+IDU7CiAJbWFzayA9IDEgPDwgKG5yICYgMHgxZik7Ci0JKmEgJj0gfm1hc2s7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgY2hhbmdlX2JpdChpbnQgbnIsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCi17Ci0JaW50IG1hc2ssIGZsYWdzOwotCXVuc2lnbmVkIGxvbmcgKkFERFIgPSAodW5zaWduZWQgbG9uZyAqKWFkZHI7Ci0KLQlBRERSICs9IG5yID4+IDU7Ci0JbWFzayA9IDEgPDwgKG5yICYgMzEpOwotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkqQUREUiBePSBtYXNrOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZCBfX2NoYW5nZV9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQotewotCWludCBtYXNrOwotCXVuc2lnbmVkIGxvbmcgKkFERFIgPSAodW5zaWduZWQgbG9uZyAqKWFkZHI7Ci0KLQlBRERSICs9IG5yID4+IDU7Ci0JbWFzayA9IDEgPDwgKG5yICYgMzEpOwotCSpBRERSIF49IG1hc2s7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIGludCB0ZXN0X2FuZF9zZXRfYml0KGludCBuciwgdm9pZCAqYWRkcikKLXsKLQlpbnQgbWFzaywgcmV0dmFsOwotCXZvbGF0aWxlIHVuc2lnbmVkIGludCAqYSA9ICh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKilhZGRyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlhICs9IG5yID4+IDU7Ci0JbWFzayA9IDEgPDwgKG5yICYgMHgxZik7Ci0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXJldHZhbCA9IChtYXNrICYgKmEpICE9IDA7CiAJKmEgfD0gbWFzazsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLQlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgX190ZXN0X2FuZF9zZXRfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2NsZWFyX2JpdChpbnQgbnIsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCit7CisJaW50ICphID0gKGludCAqKWFkZHI7CisJaW50IG1hc2s7CisKKwlhICs9IG5yID4+IDU7CisJbWFzayA9IDEgPDwgKG5yICYgMHgxZik7CisJKmEgJj0gfm1hc2s7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2NoYW5nZV9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQoreworCWludCBtYXNrOworCXVuc2lnbmVkIGxvbmcgKkFERFIgPSAodW5zaWduZWQgbG9uZyAqKWFkZHI7CisKKwlBRERSICs9IG5yID4+IDU7CisJbWFzayA9IDEgPDwgKG5yICYgMzEpOworCSpBRERSIF49IG1hc2s7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fdGVzdF9hbmRfc2V0X2JpdChpbnQgbnIsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCiB7CiAJaW50IG1hc2ssIHJldHZhbDsKIAl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKmEgPSAodm9sYXRpbGUgdW5zaWduZWQgaW50ICopYWRkcjsKQEAgLTEyMSwyMyArMjE2LDcgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgdGVzdF9hbmRfY2xlYXJfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKLXsKLQlpbnQgbWFzaywgcmV0dmFsOwotCXZvbGF0aWxlIHVuc2lnbmVkIGludCAqYSA9ICh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKilhZGRyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlhICs9IG5yID4+IDU7Ci0JbWFzayA9IDEgPDwgKG5yICYgMHgxZik7Ci0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXJldHZhbCA9IChtYXNrICYgKmEpICE9IDA7Ci0JKmEgJj0gfm1hc2s7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0JcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIF9faW5saW5lX18gaW50IF9fdGVzdF9hbmRfY2xlYXJfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKK3N0YXRpYyBpbmxpbmUgaW50IF9fdGVzdF9hbmRfY2xlYXJfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKIHsKIAlpbnQgbWFzaywgcmV0dmFsOwogCXZvbGF0aWxlIHVuc2lnbmVkIGludCAqYSA9ICh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKilhZGRyOwpAQCAtMTQ5LDIyICsyMjgsNyBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIGludCB0ZXN0X2FuZF9jaGFuZ2VfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKLXsKLQlpbnQgbWFzaywgcmV0dmFsOwotCXZvbGF0aWxlIHVuc2lnbmVkIGludCAqYSA9ICh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKilhZGRyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlhICs9IG5yID4+IDU7Ci0JbWFzayA9IDEgPDwgKG5yICYgMHgxZik7Ci0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXJldHZhbCA9IChtYXNrICYgKmEpICE9IDA7Ci0JKmEgXj0gbWFzazsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIF9faW5saW5lX18gaW50IF9fdGVzdF9hbmRfY2hhbmdlX2JpdChpbnQgbnIsCitzdGF0aWMgaW5saW5lIGludCBfX3Rlc3RfYW5kX2NoYW5nZV9iaXQoaW50IG5yLAogCQkJCQkgICAgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKIHsKIAlpbnQgbWFzaywgcmV0dmFsOwpAQCAtMTc3LDE2ICsyNDEsNyBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLS8qCi0gKiBUaGlzIHJvdXRpbmUgZG9lc24ndCBuZWVkIHRvIGJlIGF0b21pYy4KLSAqLwotc3RhdGljIF9faW5saW5lX18gaW50IF9fY29uc3RhbnRfdGVzdF9iaXQoaW50IG5yLCBjb25zdCB2b2lkICphZGRyKQotewotCXJldHVybiAoKDFVTCA8PCAobnIgJiAzMSkpICYKLQkJKCgoY29uc3Qgdm9sYXRpbGUgdW5zaWduZWQgaW50ICopYWRkcilbbnIgPj4gNV0pKSAhPSAwOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgX190ZXN0X2JpdChpbnQgbnIsIGNvbnN0IHZvaWQgKmFkZHIpCitzdGF0aWMgaW5saW5lIGludCBfX3Rlc3RfYml0KGludCBuciwgY29uc3Qgdm9pZCAqYWRkcikKIHsKIAlpbnQgKmEgPSAoaW50ICopYWRkcjsKIAlpbnQgbWFzazsKQEAgLTE5NiwxMCArMjUxLDE2IEBACiAJcmV0dXJuICgobWFzayAmICphKSAhPSAwKTsKIH0KIAotI2RlZmluZSB0ZXN0X2JpdChucixhZGRyKSBcCi0oX19idWlsdGluX2NvbnN0YW50X3AobnIpID8gXAotIF9fY29uc3RhbnRfdGVzdF9iaXQoKG5yKSwoYWRkcikpIDogXAotIF9fdGVzdF9iaXQoKG5yKSwoYWRkcikpKQorI2lmbmRlZiBDT05GSUdfU01QCisvKgorICogVGhpcyByb3V0aW5lIGRvZXNuJ3QgbmVlZCBpcnEgc2F2ZSBhbmQgcmVzdG9yZSBvcHMgaW4gVVAKKyAqIGNvbnRleHQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHRlc3RfYml0KGludCBuciwgY29uc3Qgdm9pZCAqYWRkcikKK3sKKwlyZXR1cm4gX190ZXN0X2JpdChuciwgYWRkcik7Cit9CisjZW5kaWYKIAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2JpdG9wcy9maW5kLmg+CiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL2h3ZWlnaHQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmxhY2tmaW4uaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmxhY2tmaW4uaAppbmRleCA4NzQ5YjBlLi44YmIyY2IxIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JsYWNrZmluLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9ibGFja2Zpbi5oCkBAIC02LDExICs2LDYgQEAKICNpZm5kZWYgX0JMQUNLRklOX0hfCiAjZGVmaW5lIF9CTEFDS0ZJTl9IXwogCi0jZGVmaW5lIExPKGNvbjMyKSAoKGNvbjMyKSAmIDB4RkZGRikKLSNkZWZpbmUgbG8oY29uMzIpICgoY29uMzIpICYgMHhGRkZGKQotI2RlZmluZSBISShjb24zMikgKCgoY29uMzIpID4+IDE2KSAmIDB4RkZGRikKLSNkZWZpbmUgaGkoY29uMzIpICgoKGNvbjMyKSA+PiAxNikgJiAweEZGRkYpCi0KICNpbmNsdWRlIDxtYWNoL2Fub21hbHkuaD4KIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KQEAgLTY1LDYgKzYwLDExIEBACiAKICNlbHNlICAvKiBfX0FTU0VNQkxZX18gKi8KIAorI2RlZmluZSBMTyhjb24zMikgKChjb24zMikgJiAweEZGRkYpCisjZGVmaW5lIGxvKGNvbjMyKSAoKGNvbjMyKSAmIDB4RkZGRikKKyNkZWZpbmUgSEkoY29uMzIpICgoKGNvbjMyKSA+PiAxNikgJiAweEZGRkYpCisjZGVmaW5lIGhpKGNvbjMyKSAoKChjb24zMikgPj4gMTYpICYgMHhGRkZGKQorCiAvKiBTU1lOQyAmIENTWU5DIGltcGxlbWVudGF0aW9ucyBmb3IgYXNzZW1ibHkgZmlsZXMgKi8KIAogI2RlZmluZSBzc3luYyh4KSBTU1lOQyh4KQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKaW5kZXggNmE2NzNkNC4uYjllNzk3YSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCkBAIC0xLDQ4ICsxLDcgQEAKICNpZm5kZWYgX0JMQUNLRklOX0JZVEVPUkRFUl9ICiAjZGVmaW5lIF9CTEFDS0ZJTl9CWVRFT1JERVJfSAogCi0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KLQotI2lmZGVmIF9fR05VQ19fCi0KLXN0YXRpYyBfX2lubGluZV9fIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19fYXJjaF9fc3dhaGIzMihfX3UzMiB4eCkKLXsKLQlfX3UzMiB0bXA7Ci0JX19hc21fXygiJTEgPSAlMCA+PiA4IChWKTtcblx0IgotCQkiJTAgPSAlMCA8PCA4IChWKTtcblx0IgotCQkiJTAgPSAlMCB8ICUxO1xuXHQiCi0JCTogIitkIih4eCksICI9JmQiKHRtcCkpOwotCXJldHVybiB4eDsKLX0KLQotc3RhdGljIF9faW5saW5lX18gX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UzMiBfX19hcmNoX19zd2FodzMyKF9fdTMyIHh4KQotewotCV9fdTMyIHJ2OwotCV9fYXNtX18oIiUwID0gUEFDSyglMS5MLCAlMS5IKTtcblx0IjogIj1kIihydik6ICJkIih4eCkpOwotCXJldHVybiBydjsKLX0KLQotI2RlZmluZSBfX2FyY2hfX3N3YWhiMzIoeCkgX19fYXJjaF9fc3dhaGIzMih4KQotI2RlZmluZSBfX2FyY2hfX3N3YWh3MzIoeCkgX19fYXJjaF9fc3dhaHczMih4KQotI2RlZmluZSBfX2FyY2hfX3N3YWIzMih4KSBfX19hcmNoX19zd2FoYjMyKF9fX2FyY2hfX3N3YWh3MzIoeCkpCi0KLXN0YXRpYyBfX2lubGluZV9fIF9fYXR0cmlidXRlX2NvbnN0X18gX191MTYgX19fYXJjaF9fc3dhYjE2KF9fdTE2IHh4KQotewotCV9fdTMyIHh3ID0geHg7Ci0JX19hc21fXygiJTAgPDw9IDg7XG4JJTAuTCA9ICUwLkwgKyAlMC5IIChOUyk7XG4iOiAiK2QiKHh3KSk7Ci0JcmV0dXJuIChfX3UxNil4dzsKLX0KLQotI2RlZmluZSBfX2FyY2hfX3N3YWIxNih4KSBfX19hcmNoX19zd2FiMTYoeCkKLQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pIHx8IGRlZmluZWQoX19LRVJORUxfXykKLSMgIGRlZmluZSBfX0JZVEVPUkRFUl9IQVNfVTY0X18KLSMgIGRlZmluZSBfX1NXQUJfNjRfVEhSVV8zMl9fCi0jZW5kaWYKLQorI2luY2x1ZGUgPGFzbS9zd2FiLmg+CiAjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2xpdHRsZV9lbmRpYW4uaD4KIAogI2VuZGlmCQkJCS8qIF9CTEFDS0ZJTl9CWVRFT1JERVJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jYWNoZS5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jYWNoZS5oCmluZGV4IDAyM2Q3MjEuLjg2NjM3ODEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY2FjaGUuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NhY2hlLmgKQEAgLTEyLDYgKzEyLDExIEBACiAjZGVmaW5lIEwxX0NBQ0hFX0JZVEVTCSgxIDw8IEwxX0NBQ0hFX1NISUZUKQogI2RlZmluZSBTTVBfQ0FDSEVfQllURVMJTDFfQ0FDSEVfQllURVMKIAorI2lmZGVmIENPTkZJR19TTVAKKyNkZWZpbmUgX19jYWNoZWxpbmVfYWxpZ25lZAorI2Vsc2UKKyNkZWZpbmUgX19fX2NhY2hlbGluZV9hbGlnbmVkCisKIC8qCiAgKiBQdXQgY2FjaGVsaW5lX2FsaWdlZCBkYXRhIHRvIEwxIGRhdGEgbWVtb3J5CiAgKi8KQEAgLTIxLDkgKzI2LDMzIEBACiAJCV9fc2VjdGlvbl9fKCIuZGF0YV9sMS5jYWNoZWxpbmVfYWxpZ25lZCIpKSkKICNlbmRpZgogCisjZW5kaWYKKwogLyoKICAqIGxhcmdlc3QgTDEgd2hpY2ggdGhpcyBhcmNoIHN1cHBvcnRzCiAgKi8KICNkZWZpbmUgTDFfQ0FDSEVfU0hJRlRfTUFYCTUKIAorI2lmIGRlZmluZWQoQ09ORklHX1NNUCkgJiYgXAorICAgICFkZWZpbmVkKENPTkZJR19CRklOX0NBQ0hFX0NPSEVSRU5UKSAmJiBcCisgICAgZGVmaW5lZChDT05GSUdfQkZJTl9EQ0FDSEUpCisjZGVmaW5lIF9fQVJDSF9TWU5DX0NPUkVfRENBQ0hFCisjaWZuZGVmIF9fQVNTRU1CTFlfXworYXNtbGlua2FnZSB2b2lkIF9fcmF3X3NtcF9tYXJrX2JhcnJpZXJfYXNtKHZvaWQpOworYXNtbGlua2FnZSB2b2lkIF9fcmF3X3NtcF9jaGVja19iYXJyaWVyX2FzbSh2b2lkKTsKKworc3RhdGljIGlubGluZSB2b2lkIHNtcF9tYXJrX2JhcnJpZXIodm9pZCkKK3sKKwlfX3Jhd19zbXBfbWFya19iYXJyaWVyX2FzbSgpOworfQorc3RhdGljIGlubGluZSB2b2lkIHNtcF9jaGVja19iYXJyaWVyKHZvaWQpCit7CisJX19yYXdfc21wX2NoZWNrX2JhcnJpZXJfYXNtKCk7Cit9CisKK3ZvaWQgcmVzeW5jX2NvcmVfZGNhY2hlKHZvaWQpOworI2VuZGlmCisjZW5kaWYKKworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKaW5kZXggNDQwMzQxNS4uMWIwNDBmNSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKQEAgLTM1LDYgKzM1LDcgQEAKIGV4dGVybiB2b2lkIGJsYWNrZmluX2RjYWNoZV9mbHVzaF9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kX2FkZHJlc3MpOwogZXh0ZXJuIHZvaWQgYmxhY2tmaW5fZGNhY2hlX2ludmFsaWRhdGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydF9hZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZF9hZGRyZXNzKTsKIGV4dGVybiB2b2lkIGJsYWNrZmluX2RmbHVzaF9wYWdlKHZvaWQgKnBhZ2UpOworZXh0ZXJuIHZvaWQgYmxhY2tmaW5faW52YWxpZGF0ZV9lbnRpcmVfZGNhY2hlKHZvaWQpOwogCiAjZGVmaW5lIGZsdXNoX2RjYWNoZV9tbWFwX2xvY2sobWFwcGluZykJCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgZmx1c2hfZGNhY2hlX21tYXBfdW5sb2NrKG1hcHBpbmcpCWRvIHsgfSB3aGlsZSAoMCkKQEAgLTQ0LDEyICs0NSwyMCBAQAogI2RlZmluZSBmbHVzaF9jYWNoZV92bWFwKHN0YXJ0LCBlbmQpCQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIGZsdXNoX2NhY2hlX3Z1bm1hcChzdGFydCwgZW5kKQkJZG8geyB9IHdoaWxlICgwKQogCisjaWZkZWYgQ09ORklHX1NNUAorI2RlZmluZSBmbHVzaF9pY2FjaGVfcmFuZ2Vfb3RoZXJzKHN0YXJ0LCBlbmQpCVwKKwlzbXBfaWNhY2hlX2ZsdXNoX3JhbmdlX290aGVycygoc3RhcnQpLCAoZW5kKSkKKyNlbHNlCisjZGVmaW5lIGZsdXNoX2ljYWNoZV9yYW5nZV9vdGhlcnMoc3RhcnQsIGVuZCkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKIHN0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF9pY2FjaGVfcmFuZ2UodW5zaWduZWQgc3RhcnQsIHVuc2lnbmVkIGVuZCkKIHsKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX0RDQUNIRSkgJiYgZGVmaW5lZChDT05GSUdfQkZJTl9JQ0FDSEUpCiAKICMgaWYgZGVmaW5lZChDT05GSUdfQkZJTl9XVCkKIAlibGFja2Zpbl9pY2FjaGVfZmx1c2hfcmFuZ2UoKHN0YXJ0KSwgKGVuZCkpOworCWZsdXNoX2ljYWNoZV9yYW5nZV9vdGhlcnMoc3RhcnQsIGVuZCk7CiAjIGVsc2UKIAlibGFja2Zpbl9pY2FjaGVfZGNhY2hlX2ZsdXNoX3JhbmdlKChzdGFydCksIChlbmQpKTsKICMgZW5kaWYKQEAgLTU4LDYgKzY3LDcgQEAKIAogIyBpZiBkZWZpbmVkKENPTkZJR19CRklOX0lDQUNIRSkKIAlibGFja2Zpbl9pY2FjaGVfZmx1c2hfcmFuZ2UoKHN0YXJ0KSwgKGVuZCkpOworCWZsdXNoX2ljYWNoZV9yYW5nZV9vdGhlcnMoc3RhcnQsIGVuZCk7CiAjIGVuZGlmCiAjIGlmIGRlZmluZWQoQ09ORklHX0JGSU5fRENBQ0hFKQogCWJsYWNrZmluX2RjYWNoZV9mbHVzaF9yYW5nZSgoc3RhcnQpLCAoZW5kKSk7CkBAIC02NiwxMCArNzYsMTIgQEAKICNlbmRpZgogfQogCi0jZGVmaW5lIGNvcHlfdG9fdXNlcl9wYWdlKHZtYSwgcGFnZSwgdmFkZHIsIGRzdCwgc3JjLCBsZW4pIFwKLWRvIHsgbWVtY3B5KGRzdCwgc3JjLCBsZW4pOyBcCi0gICAgIGZsdXNoX2ljYWNoZV9yYW5nZSAoKHVuc2lnbmVkKSAoZHN0KSwgKHVuc2lnbmVkKSAoZHN0KSArIChsZW4pKTsgXAorI2RlZmluZSBjb3B5X3RvX3VzZXJfcGFnZSh2bWEsIHBhZ2UsIHZhZGRyLCBkc3QsIHNyYywgbGVuKQkJXAorZG8geyBtZW1jcHkoZHN0LCBzcmMsIGxlbik7CQkJCQkJXAorICAgICBmbHVzaF9pY2FjaGVfcmFuZ2UoKHVuc2lnbmVkKSAoZHN0KSwgKHVuc2lnbmVkKSAoZHN0KSArIChsZW4pKTsJXAorICAgICBmbHVzaF9pY2FjaGVfcmFuZ2Vfb3RoZXJzKCh1bnNpZ25lZCBsb25nKSAoZHN0KSwgKHVuc2lnbmVkIGxvbmcpIChkc3QpICsgKGxlbikpO1wKIH0gd2hpbGUgKDApCisKICNkZWZpbmUgY29weV9mcm9tX3VzZXJfcGFnZSh2bWEsIHBhZ2UsIHZhZGRyLCBkc3QsIHNyYywgbGVuKQltZW1jcHkoZHN0LCBzcmMsIGxlbikKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fRENBQ0hFKQpAQCAtODIsNyArOTQsNyBAQAogIyBkZWZpbmUgZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSkJCQlibGFja2Zpbl9kZmx1c2hfcGFnZShwYWdlX2FkZHJlc3MocGFnZSkpCiAjZWxzZQogIyBkZWZpbmUgZmx1c2hfZGNhY2hlX3JhbmdlKHN0YXJ0LGVuZCkJCWRvIHsgfSB3aGlsZSAoMCkKLSMgZGVmaW5lIGZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpCQkJZG8geyB9IHdoaWxlICgwKQorIyBkZWZpbmUgZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSkJCWRvIHsgfSB3aGlsZSAoMCkKICNlbmRpZgogCiBleHRlcm4gdW5zaWduZWQgbG9uZyByZXNlcnZlZF9tZW1fZGNhY2hlX29uOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jaGVja3N1bS5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jaGVja3N1bS5oCmluZGV4IDZmNmFmMmIuLmY2NzI4OWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY2hlY2tzdW0uaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NoZWNrc3VtLmgKQEAgLTc4LDcgKzc4LDggQEAKICAgICAgICAgICAgICAgICAgIiUwID0gJTAgKyAlNDtcblx0IgogICAgICAgICAgICAgICAgICAiTk9QO1xuXHQiCiAgCQkgOiAiPWQiIChzdW0pCi0JCSA6ICJkIiAoZGFkZHIpLCAiZCIgKHNhZGRyKSwgImQiICgobnRvaHMobGVuKTw8MTYpK3Byb3RvKjI1NiksICJkIiAoMSksICIwIihzdW0pKTsKKwkJIDogImQiIChkYWRkciksICJkIiAoc2FkZHIpLCAiZCIgKChudG9ocyhsZW4pPDwxNikrcHJvdG8qMjU2KSwgImQiICgxKSwgIjAiKHN1bSkKKwkJIDogIkNDIik7CiAKIAlyZXR1cm4gKHN1bSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NvbnRleHQuUyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY29udGV4dC5TCmluZGV4IGMwZTYzMGUuLjE2NTYxYWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY29udGV4dC5TCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY29udGV4dC5TCkBAIC0zMDMsOSArMzAzLDE0IEBACiAJUkVUSSA9IFtzcCsrXTsKIAlSRVRTID0gW3NwKytdOwogCi0JcDAuaCA9IF9pcnFfZmxhZ3M7Ci0JcDAubCA9IF9pcnFfZmxhZ3M7CisjaWZkZWYgQ09ORklHX1NNUAorCUdFVF9QREEocDAsIHIwKTsKKwlyMCA9IFtwMCArIFBEQV9JUlFGTEFHU107CisjZWxzZQorCXAwLmggPSBfYmZpbl9pcnFfZmxhZ3M7CisJcDAubCA9IF9iZmluX2lycV9mbGFnczsKIAlyMCA9IFtwMF07CisjZW5kaWYKIAlzdGkgcjA7CiAKIAlzcCArPSA0OwkvKiBTa2lwIFJlc2VydmVkICovCkBAIC0zNTMsMyArMzU4LDQxIEBACiAJY3N5bmM7CiAuZW5kbQogCisubWFjcm8gc2F2ZV9jb250ZXh0X2NwbGIKKwlbLS1zcF0gPSAoUjc6MCwgUDU6MCk7CisJWy0tc3BdID0gZnA7CisKKwlbLS1zcF0gPSBhMC54OworCVstLXNwXSA9IGEwLnc7CisJWy0tc3BdID0gYTEueDsKKwlbLS1zcF0gPSBhMS53OworCisJWy0tc3BdID0gTEMwOworCVstLXNwXSA9IExDMTsKKwlbLS1zcF0gPSBMVDA7CisJWy0tc3BdID0gTFQxOworCVstLXNwXSA9IExCMDsKKwlbLS1zcF0gPSBMQjE7CisKKwlbLS1zcF0gPSBSRVRTOworLmVuZG0KKworLm1hY3JvIHJlc3RvcmVfY29udGV4dF9jcGxiCisJUkVUUyA9IFtzcCsrXTsKKworCUxCMSA9IFtzcCsrXTsKKwlMQjAgPSBbc3ArK107CisJTFQxID0gW3NwKytdOworCUxUMCA9IFtzcCsrXTsKKwlMQzEgPSBbc3ArK107CisJTEMwID0gW3NwKytdOworCisJYTEudyA9IFtzcCsrXTsKKwlhMS54ID0gW3NwKytdOworCWEwLncgPSBbc3ArK107CisJYTAueCA9IFtzcCsrXTsKKworCWZwID0gW3NwKytdOworCisJKFI3OjAsIFA1OjApID0gW1NQKytdOworLmVuZG0KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY3BsYi1tcHUuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY3BsYi1tcHUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVjNjdiOS4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NwbGItbXB1LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9jcGxiaW5pdC5oCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKLSAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246Ci0gKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotICovCi0jaWZuZGVmIF9fQVNNX0JGSU5fQ1BMQl9NUFVfSAotI2RlZmluZSBfX0FTTV9CRklOX0NQTEJfTVBVX0gKLQotc3RydWN0IGNwbGJfZW50cnkgewotCXVuc2lnbmVkIGxvbmcgZGF0YSwgYWRkcjsKLX07Ci0KLXN0cnVjdCBtZW1fcmVnaW9uIHsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQ7Ci0JdW5zaWduZWQgbG9uZyBkY3BsYl9kYXRhOwotCXVuc2lnbmVkIGxvbmcgaWNwbGJfZGF0YTsKLX07Ci0KLWV4dGVybiBzdHJ1Y3QgY3BsYl9lbnRyeSBkY3BsYl90YmxbTUFYX0NQTEJTXTsKLWV4dGVybiBzdHJ1Y3QgY3BsYl9lbnRyeSBpY3BsYl90YmxbTUFYX0NQTEJTXTsKLWV4dGVybiBpbnQgZmlyc3Rfc3dpdGNoZWRfaWNwbGI7Ci1leHRlcm4gaW50IGZpcnN0X21hc2tfZGNwbGI7Ci1leHRlcm4gaW50IGZpcnN0X3N3aXRjaGVkX2RjcGxiOwotCi1leHRlcm4gaW50IG5yX2RjcGxiX21pc3MsIG5yX2ljcGxiX21pc3MsIG5yX2ljcGxiX3N1cHZfbWlzcywgbnJfZGNwbGJfcHJvdDsKLWV4dGVybiBpbnQgbnJfY3BsYl9mbHVzaDsKLQotZXh0ZXJuIGludCBwYWdlX21hc2tfb3JkZXI7Ci1leHRlcm4gaW50IHBhZ2VfbWFza19uZWx0czsKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgKmN1cnJlbnRfcnd4X21hc2s7Ci0KLWV4dGVybiB2b2lkIGZsdXNoX3N3aXRjaGVkX2NwbGJzKHZvaWQpOwotZXh0ZXJuIHZvaWQgc2V0X21hc2tfZGNwbGJzKHVuc2lnbmVkIGxvbmcgKik7Ci0KLWV4dGVybiB2b2lkIF9fbm9yZXR1cm4gcGFuaWNfY3BsYl9lcnJvcihpbnQgc2Vxc3RhdCwgc3RydWN0IHB0X3JlZ3MgKik7Ci0KLSNlbmRpZiAvKiBfX0FTTV9CRklOX0NQTEJfTVBVX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY3BsYi5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jcGxiLmgKaW5kZXggOWU4YjQwMy4uYWQ1NjZmZiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jcGxiLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jcGxiLmgKQEAgLTMwLDcgKzMwLDYgQEAKICNpZm5kZWYgX0NQTEJfSAogI2RlZmluZSBfQ1BMQl9ICiAKLSNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KICNpbmNsdWRlIDxtYWNoL2Fub21hbHkuaD4KIAogI2RlZmluZSBTRFJBTV9JR0VORVJJQyAgICAoQ1BMQl9MMV9DSEJMIHwgQ1BMQl9VU0VSX1JEIHwgQ1BMQl9WQUxJRCB8IENQTEJfUE9SVFBSSU8pCkBAIC01NSwxMyArNTQsMjQgQEAKICNlbmRpZgogCiAjZGVmaW5lIEwxX0RNRU1PUlkgICAgICAgKENQTEJfTE9DSyB8IENQTEJfQ09NTU9OKQorCisjaWZkZWYgQ09ORklHX1NNUAorI2RlZmluZSBMMl9BVFRSICAgICAgICAgICAoSU5JVElBTF9UIHwgSV9DUExCIHwgRF9DUExCKQorI2RlZmluZSBMMl9JTUVNT1JZICAgICAgICAgKENQTEJfQ09NTU9OIHwgQ1BMQl9MT0NLKQorI2RlZmluZSBMMl9ETUVNT1JZICAgICAgICAgKENQTEJfQ09NTU9OIHwgQ1BMQl9MT0NLKQorCisjZWxzZQogI2lmZGVmIENPTkZJR19CRklOX0wyX0NBQ0hFQUJMRQogI2RlZmluZSBMMl9JTUVNT1JZICAgICAgICAoU0RSQU1fSUdFTkVSSUMpCiAjZGVmaW5lIEwyX0RNRU1PUlkgICAgICAgIChTRFJBTV9ER0VORVJJQykKICNlbHNlCiAjZGVmaW5lIEwyX0lNRU1PUlkgICAgICAgIChDUExCX0NPTU1PTikKICNkZWZpbmUgTDJfRE1FTU9SWSAgICAgICAgKENQTEJfQ09NTU9OKQotI2VuZGlmCisjZW5kaWYgLyogQ09ORklHX0JGSU5fTDJfQ0FDSEVBQkxFICovCisKKyNkZWZpbmUgTDJfQVRUUiAgICAgICAgICAgKElOSVRJQUxfVCB8IFNXSVRDSF9UIHwgSV9DUExCIHwgRF9DUExCKQorI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KKwogI2RlZmluZSBTRFJBTV9ETk9OX0NIQkwgIChDUExCX0NPTU1PTikKICNkZWZpbmUgU0RSQU1fRUJJVSAgICAgICAoQ1BMQl9DT01NT04pCiAjZGVmaW5lIFNEUkFNX09PUFMgICAgICAgKENQTEJfVkFMSUQgfCBBTk9NQUxZXzA1MDAwMTU4X1dPUktBUk9VTkQgfCBDUExCX0xPQ0sgfCBDUExCX0RJUlRZKQpAQCAtNzEsMTQgKzgxLDcgQEAKICNkZWZpbmUgU0laRV8xTSAweDAwMTAwMDAwICAgICAgLyogMU0gKi8KICNkZWZpbmUgU0laRV80TSAweDAwNDAwMDAwICAgICAgLyogNE0gKi8KIAotI2lmZGVmIENPTkZJR19NUFUKICNkZWZpbmUgTUFYX0NQTEJTIDE2Ci0jZWxzZQotI2RlZmluZSBNQVhfQ1BMQlMgKDE2ICogMikKLSNlbmRpZgotCi0jZGVmaW5lIEFTWU5DX01FTU9SWV9DUExCX0NPVkVSQUdFCSgoQVNZTkNfQkFOSzBfU0laRSArIEFTWU5DX0JBTksxX1NJWkUgKyBcCi0JCQkJIEFTWU5DX0JBTksyX1NJWkUgKyBBU1lOQ19CQU5LM19TSVpFKSAvIFNJWkVfNE0pCiAKICNkZWZpbmUgQ1BMQl9FTkFCTEVfSUNBQ0hFX1AJMAogI2RlZmluZSBDUExCX0VOQUJMRV9EQ0FDSEVfUAkxCkBAIC0xMTMsNCArMTE2LDggQEAKICNkZWZpbmUgQ1BMQl9JTk9DQUNIRSAgIAlDUExCX1VTRVJfUkQgfCBDUExCX1ZBTElECiAjZGVmaW5lIENQTEJfSURPQ0FDSEUgICAJQ1BMQl9JTk9DQUNIRSB8IENQTEJfTDFfQ0hCTAogCisjZGVmaW5lIEZBVUxUX1JXICAgICAgICAoMSA8PCAxNikKKyNkZWZpbmUgRkFVTFRfVVNFUlNVUFYgICgxIDw8IDE3KQorI2RlZmluZSBGQVVMVF9DUExCQklUUyAgMHgwMDAwZmZmZgorCiAjZW5kaWYJCQkJLyogX0NQTEJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jcGxiaW5pdC5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jcGxiaW5pdC5oCmluZGV4IGY4NDViNDEuLjA1YjE0YTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY3BsYmluaXQuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NwbGJpbml0LmgKQEAgLTMyLDYxICszMiw1NiBAQAogCiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CiAjaW5jbHVkZSA8YXNtL2NwbGIuaD4KKyNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CisKKyNpZmRlZiBDT05GSUdfQ1BMQl9TV0lUQ0hfVEFCX0wxCisjIGRlZmluZSBQRFRfQVRUUiBfX2F0dHJpYnV0ZV9fKChsMV9kYXRhKSkKKyNlbHNlCisjIGRlZmluZSBQRFRfQVRUUgorI2VuZGlmCisKK3N0cnVjdCBjcGxiX2VudHJ5IHsKKwl1bnNpZ25lZCBsb25nIGRhdGEsIGFkZHI7Cit9OworCitzdHJ1Y3QgY3BsYl9ib3VuZGFyeSB7CisJdW5zaWduZWQgbG9uZyBlYWRkcjsgLyogRW5kIG9mIHRoaXMgcmVnaW9uLiAgKi8KKwl1bnNpZ25lZCBsb25nIGRhdGE7IC8qIENQTEIgZGF0YSB2YWx1ZS4gICovCit9OworCitleHRlcm4gc3RydWN0IGNwbGJfYm91bmRhcnkgZGNwbGJfYm91bmRzW107CitleHRlcm4gc3RydWN0IGNwbGJfYm91bmRhcnkgaWNwbGJfYm91bmRzW107CitleHRlcm4gaW50IGRjcGxiX25yX2JvdW5kcywgaWNwbGJfbnJfYm91bmRzOworCitleHRlcm4gc3RydWN0IGNwbGJfZW50cnkgZGNwbGJfdGJsW05SX0NQVVNdW01BWF9DUExCU107CitleHRlcm4gc3RydWN0IGNwbGJfZW50cnkgaWNwbGJfdGJsW05SX0NQVVNdW01BWF9DUExCU107CitleHRlcm4gaW50IGZpcnN0X3N3aXRjaGVkX2ljcGxiOworZXh0ZXJuIGludCBmaXJzdF9zd2l0Y2hlZF9kY3BsYjsKKworZXh0ZXJuIGludCBucl9kY3BsYl9taXNzW10sIG5yX2ljcGxiX21pc3NbXSwgbnJfaWNwbGJfc3Vwdl9taXNzW107CitleHRlcm4gaW50IG5yX2RjcGxiX3Byb3RbXSwgbnJfY3BsYl9mbHVzaFtdOwogCiAjaWZkZWYgQ09ORklHX01QVQogCi0jaW5jbHVkZSA8YXNtL2NwbGItbXB1Lmg+CitleHRlcm4gaW50IGZpcnN0X21hc2tfZGNwbGI7CiAKLSNlbHNlCitleHRlcm4gaW50IHBhZ2VfbWFza19vcmRlcjsKK2V4dGVybiBpbnQgcGFnZV9tYXNrX25lbHRzOwogCi0jZGVmaW5lIElOSVRJQUxfVCAweDEKLSNkZWZpbmUgU1dJVENIX1QgIDB4MgotI2RlZmluZSBJX0NQTEIgICAgMHg0Ci0jZGVmaW5lIERfQ1BMQiAgICAweDgKK2V4dGVybiB1bnNpZ25lZCBsb25nICpjdXJyZW50X3J3eF9tYXNrW05SX0NQVVNdOwogCi0jZGVmaW5lIElOX0tFUk5FTCAxCitleHRlcm4gdm9pZCBmbHVzaF9zd2l0Y2hlZF9jcGxicyh1bnNpZ25lZCBpbnQpOworZXh0ZXJuIHZvaWQgc2V0X21hc2tfZGNwbGJzKHVuc2lnbmVkIGxvbmcgKiwgdW5zaWduZWQgaW50KTsKIAotZW51bQote1pFUk9fUCwgTDFJX01FTSwgTDFEX01FTSwgU0RSQU1fS0VSTiAsIFNEUkFNX1JBTV9NVEQsIFNEUkFNX0RNQVosIFJFU19NRU0sIEFTWU5DX01FTSwgTDJfTUVNfTsKLQotc3RydWN0IGNwbGJfZGVzYyB7Ci0JdTMyIHN0YXJ0OyAvKiBzdGFydCBhZGRyZXNzICovCi0JdTMyIGVuZDsgLyogZW5kIGFkZHJlc3MgKi8KLQl1MzIgcHNpemU7IC8qIHByZWZlcmVkIHNpemUgaWYgYW55IG90aGVyd2lzZSAxTUIgb3IgNE1CKi8KLQl1MTYgYXR0cjsvKiBhdHRyaWJ1dGVzICovCi0JdTE2IGlfY29uZjsvKiBJLUNQTEIgREFUQSAqLwotCXUxNiBkX2NvbmY7LyogRC1DUExCIERBVEEgKi8KLQl1MTYgdmFsaWQ7LyogdmFsaWQgKi8KLQljb25zdCBzOCBuYW1lWzMwXTsvKiBuYW1lICovCi19OwotCi1zdHJ1Y3QgY3BsYl90YWIgewotICB1X2xvbmcgKnRhYjsKLQl1MTYgcG9zOwotCXUxNiBzaXplOwotfTsKLQotZXh0ZXJuIHVfbG9uZyBpY3BsYl90YWJsZVtdOwotZXh0ZXJuIHVfbG9uZyBkY3BsYl90YWJsZVtdOwotCi0vKiBUaWxsIGhlcmUgd2UgYXJlIGRpc2N1c3NpbmcgYWJvdXQgdGhlIHN0YXRpYyBtZW1vcnkgbWFuYWdlbWVudCBtb2RlbC4KLSAqIEhvd2V2ZXIsIHRoZSBvcGVyYXRpbmcgZW52b3Jvbm1lbnRzIGNvbW1vbmx5IGRlZmluZSBtb3JlIENQTEIKLSAqIGRlc2NyaXB0b3JzIHRvIGNvdmVyIHRoZSBlbnRpcmUgYWRkcmVzc2FibGUgbWVtb3J5IHRoYW4gd2lsbCBmaXQgaW50bwotICogdGhlIGF2YWlsYWJsZSBvbi1jaGlwIDE2IENQTEIgTU1Scy4gV2hlbiB0aGlzIGhhcHBlbnMsIHRoZSBiZWxvdyB0YWJsZQotICogd2lsbCBiZSB1c2VkIHdoaWNoIHdpbGwgaG9sZCBhbGwgdGhlIHBvdGVudGlhbGx5IHJlcXVpcmVkIENQTEIgZGVzY3JpcHRvcnMKLSAqCi0gKiBUaGlzIGlzIGhvdyBQYWdlIGRlc2NyaXB0b3IgVGFibGUgaXMgaW1wbGVtZW50ZWQgaW4gdUNsaW51eC9CbGFja2Zpbi4KLSAqLwotCi1leHRlcm4gdV9sb25nIGlwZHRfdGFibGVbXTsKLWV4dGVybiB1X2xvbmcgZHBkdF90YWJsZVtdOwotI2lmZGVmIENPTkZJR19DUExCX0lORk8KLWV4dGVybiB1X2xvbmcgaXBkdF9zd2FwY291bnRfdGFibGVbXTsKLWV4dGVybiB1X2xvbmcgZHBkdF9zd2FwY291bnRfdGFibGVbXTsKLSNlbmRpZgorZXh0ZXJuIHZvaWQgX19ub3JldHVybiBwYW5pY19jcGxiX2Vycm9yKGludCBzZXFzdGF0LCBzdHJ1Y3QgcHRfcmVncyAqKTsKIAogI2VuZGlmIC8qIENPTkZJR19NUFUgKi8KIAotZXh0ZXJuIHZvaWQgZ2VuZXJhdGVfY3BsYl90YWJsZXModm9pZCk7CitleHRlcm4gdm9pZCBiZmluX2ljYWNoZV9pbml0KHN0cnVjdCBjcGxiX2VudHJ5ICppY3BsYl90YmwpOworZXh0ZXJuIHZvaWQgYmZpbl9kY2FjaGVfaW5pdChzdHJ1Y3QgY3BsYl9lbnRyeSAqaWNwbGJfdGJsKTsKIAorI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fRENBQ0hFKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX0lDQUNIRSkKK2V4dGVybiB2b2lkIGdlbmVyYXRlX2NwbGJfdGFibGVzX2FsbCh2b2lkKTsKK2V4dGVybiB2b2lkIGdlbmVyYXRlX2NwbGJfdGFibGVzX2NwdSh1bnNpZ25lZCBpbnQgY3B1KTsKKyNlbmRpZgogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NwdS5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jcHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjU5NGVmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jcHUuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NwdS5oLgorICogQXV0aG9yOiAgICAgICBQaGlsaXBwZSBHZXJ1bSA8cnBtQHhlbm9tYWkub3JnPgorICoKKyAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDcgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCisgKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaWZuZGVmIF9fQVNNX0JMQUNLRklOX0NQVV9ICisjZGVmaW5lIF9fQVNNX0JMQUNLRklOX0NQVV9ICisKKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KKworc3RydWN0IHRhc2tfc3RydWN0OworCitzdHJ1Y3QgYmxhY2tmaW5fY3B1ZGF0YSB7CisJc3RydWN0IGNwdSBjcHU7CisJc3RydWN0IHRhc2tfc3RydWN0ICppZGxlOworCXVuc2lnbmVkIGludCBpbWVtY3RsOworCXVuc2lnbmVkIGludCBkbWVtY3RsOworCXVuc2lnbmVkIGxvbmcgbG9vcHNfcGVyX2ppZmZ5OworCXVuc2lnbmVkIGxvbmcgZGNhY2hlX2ludmxkX2NvdW50OworfTsKKworREVDTEFSRV9QRVJfQ1BVKHN0cnVjdCBibGFja2Zpbl9jcHVkYXRhLCBjcHVfZGF0YSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9kbWEuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZG1hLmgKaW5kZXggNjUwOTczMy4uZTRmN2I4MCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9kbWEuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2RtYS5oCkBAIC0xLDQ0ICsxLDE3IEBACiAvKgotICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9zaW1wbGVfYmY1MzNfZG1hLmgKLSAqIEJhc2VkIG9uOiAgICAgbm9uZSAtIG9yaWdpbmFsIHdvcmsKLSAqIEF1dGhvcjogICAgICAgTEcgU29mdCBJbmRpYQotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKiBDcmVhdGVkOiAgICAgIFR1ZSBTZXAgMjEgMjAwNAotICogRGVzY3JpcHRpb246ICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIG1ham9yIERhdGEgc3RydWN0dXJlcyBhbmQgY29uc3RhbnRzCi0gKiAJCSB1c2VkIGZvciBETUEgSW1wbGVtZW50YXRpb24gaW4gQkY1MzMKLSAqIE1vZGlmaWVkOgorICogZG1hLmggLSBCbGFja2ZpbiBETUEgZGVmaW5lcy9zdHJ1Y3R1cmVzL2V0Yy4uLgogICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCi0gKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2lmbmRlZiBfQkxBQ0tGSU5fRE1BX0hfCiAjZGVmaW5lIF9CTEFDS0ZJTl9ETUFfSF8KIAotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL3NpZ25hbC5oPgotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bWFjaC9kbWEuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPG1hY2gvZG1hLmg+CiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KIAogI2RlZmluZSBNQVhfRE1BX0FERFJFU1MgUEFHRV9PRkZTRVQKIApAQCAtNzksNyArNTIsNyBAQAogI2RlZmluZSBETUFfU1lOQ19SRVNUQVJUCTEKIAogc3RydWN0IGRtYXNnIHsKLQl1bnNpZ25lZCBsb25nIG5leHRfZGVzY19hZGRyOworCXZvaWQgKm5leHRfZGVzY19hZGRyOwogCXVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkcjsKIAl1bnNpZ25lZCBzaG9ydCBjZmc7CiAJdW5zaWduZWQgc2hvcnQgeF9jb3VudDsKQEAgLTg5LDcgKzYyLDcgQEAKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHN0cnVjdCBkbWFfcmVnaXN0ZXIgewotCXVuc2lnbmVkIGxvbmcgbmV4dF9kZXNjX3B0cjsJLyogRE1BIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIHJlZ2lzdGVyICovCisJdm9pZCAqbmV4dF9kZXNjX3B0cjsJLyogRE1BIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIHJlZ2lzdGVyICovCiAJdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyOwkvKiBETUEgU3RhcnQgYWRkcmVzcyAgcmVnaXN0ZXIgKi8KIAogCXVuc2lnbmVkIHNob3J0IGNmZzsJLyogRE1BIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KQEAgLTEwOSw3ICs4Miw3IEBACiAJc2hvcnQgeV9tb2RpZnk7CS8qIERNQSB5X21vZGlmeSByZWdpc3RlciAqLwogCXVuc2lnbmVkIHNob3J0IGR1bW15NTsKIAotCXVuc2lnbmVkIGxvbmcgY3Vycl9kZXNjX3B0cjsJLyogRE1BIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyCisJdm9pZCAqY3Vycl9kZXNjX3B0cjsJLyogRE1BIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyCiAJCQkJCSAgIHJlZ2lzdGVyICovCiAJdW5zaWduZWQgbG9uZyBjdXJyX2FkZHJfcHRyOwkvKiBETUEgQ3VycmVudCBBZGRyZXNzIFBvaW50ZXIKIAkJCQkJCSAgIHJlZ2lzdGVyICovCkBAIC0xMzEsMTkgKzEwNCwxNSBAQAogCiB9OwogCi10eXBlZGVmIGlycXJldHVybl90KCpkbWFfaW50ZXJydXB0X3QpIChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwotCitzdHJ1Y3QgbXV0ZXg7CiBzdHJ1Y3QgZG1hX2NoYW5uZWwgewogCXN0cnVjdCBtdXRleCBkbWFsb2NrOwotCWNoYXIgKmRldmljZV9pZDsKKwljb25zdCBjaGFyICpkZXZpY2VfaWQ7CiAJZW51bSBkbWFfY2hhbl9zdGF0dXMgY2hhbl9zdGF0dXM7Ci0Jc3RydWN0IGRtYV9yZWdpc3RlciAqcmVnczsKKwl2b2xhdGlsZSBzdHJ1Y3QgZG1hX3JlZ2lzdGVyICpyZWdzOwogCXN0cnVjdCBkbWFzZyAqc2c7CQkvKiBsYXJnZSBtb2RlIGRlc2NyaXB0b3IgKi8KLQl1bnNpZ25lZCBpbnQgY3RybF9udW07CS8qIGNvbnRyb2xsZXIgbnVtYmVyICovCi0JZG1hX2ludGVycnVwdF90IGlycV9jYWxsYmFjazsKKwl1bnNpZ25lZCBpbnQgaXJxOwogCXZvaWQgKmRhdGE7Ci0JdW5zaWduZWQgaW50IGRtYV9lbmFibGVfZmxhZzsKLQl1bnNpZ25lZCBpbnQgbG9vcGJhY2tfZmxhZzsKICNpZmRlZiBDT05GSUdfUE0KIAl1bnNpZ25lZCBzaG9ydCBzYXZlZF9wZXJpcGhlcmFsX21hcDsKICNlbmRpZgpAQCAtMTU3LDQ5ICsxMjYsMTMyIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglETUEgQVBJJ3MKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBmdW5jdGlvbnMgdG8gc2V0IHJlZ2lzdGVyIG1vZGUgKi8KLXZvaWQgc2V0X2RtYV9zdGFydF9hZGRyKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBsb25nIGFkZHIpOwotdm9pZCBzZXRfZG1hX25leHRfZGVzY19hZGRyKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBsb25nIGFkZHIpOwotdm9pZCBzZXRfZG1hX2N1cnJfZGVzY19hZGRyKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBsb25nIGFkZHIpOwotdm9pZCBzZXRfZG1hX3hfY291bnQodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIHNob3J0IHhfY291bnQpOwotdm9pZCBzZXRfZG1hX3hfbW9kaWZ5KHVuc2lnbmVkIGludCBjaGFubmVsLCBzaG9ydCB4X21vZGlmeSk7Ci12b2lkIHNldF9kbWFfeV9jb3VudCh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgc2hvcnQgeV9jb3VudCk7Ci12b2lkIHNldF9kbWFfeV9tb2RpZnkodW5zaWduZWQgaW50IGNoYW5uZWwsIHNob3J0IHlfbW9kaWZ5KTsKLXZvaWQgc2V0X2RtYV9jb25maWcodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIHNob3J0IGNvbmZpZyk7Ci11bnNpZ25lZCBzaG9ydCBzZXRfYmZpbl9kbWFfY29uZmlnKGNoYXIgZGlyZWN0aW9uLCBjaGFyIGZsb3dfbW9kZSwKLQkJCQkgICBjaGFyIGludHJfbW9kZSwgY2hhciBkbWFfbW9kZSwgY2hhciB3aWR0aCwKLQkJCQkgICBjaGFyIHN5bmNtb2RlKTsKLXZvaWQgc2V0X2RtYV9jdXJyX2FkZHIodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGxvbmcgYWRkcik7CitleHRlcm4gc3RydWN0IGRtYV9jaGFubmVsIGRtYV9jaFtNQVhfRE1BX0NIQU5ORUxTXTsKK2V4dGVybiBzdHJ1Y3QgZG1hX3JlZ2lzdGVyICpkbWFfaW9fYmFzZV9hZGRyW01BWF9ETUFfQ0hBTk5FTFNdOworZXh0ZXJuIGludCBjaGFubmVsMmlycSh1bnNpZ25lZCBpbnQgY2hhbm5lbCk7CiAKLS8qIGdldCBjdXJyIHN0YXR1cyBmb3IgcG9sbGluZyAqLwotdW5zaWduZWQgc2hvcnQgZ2V0X2RtYV9jdXJyX2lycXN0YXQodW5zaWduZWQgaW50IGNoYW5uZWwpOwotdW5zaWduZWQgc2hvcnQgZ2V0X2RtYV9jdXJyX3hjb3VudCh1bnNpZ25lZCBpbnQgY2hhbm5lbCk7Ci11bnNpZ25lZCBzaG9ydCBnZXRfZG1hX2N1cnJfeWNvdW50KHVuc2lnbmVkIGludCBjaGFubmVsKTsKLXVuc2lnbmVkIGxvbmcgZ2V0X2RtYV9uZXh0X2Rlc2NfcHRyKHVuc2lnbmVkIGludCBjaGFubmVsKTsKLXVuc2lnbmVkIGxvbmcgZ2V0X2RtYV9jdXJyX2Rlc2NfcHRyKHVuc2lnbmVkIGludCBjaGFubmVsKTsKLXVuc2lnbmVkIGxvbmcgZ2V0X2RtYV9jdXJyX2FkZHIodW5zaWduZWQgaW50IGNoYW5uZWwpOworc3RhdGljIGlubGluZSB2b2lkIHNldF9kbWFfc3RhcnRfYWRkcih1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgbG9uZyBhZGRyKQoreworCWRtYV9jaFtjaGFubmVsXS5yZWdzLT5zdGFydF9hZGRyID0gYWRkcjsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZG1hX25leHRfZGVzY19hZGRyKHVuc2lnbmVkIGludCBjaGFubmVsLCB2b2lkICphZGRyKQoreworCWRtYV9jaFtjaGFubmVsXS5yZWdzLT5uZXh0X2Rlc2NfcHRyID0gYWRkcjsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZG1hX2N1cnJfZGVzY19hZGRyKHVuc2lnbmVkIGludCBjaGFubmVsLCB2b2lkICphZGRyKQoreworCWRtYV9jaFtjaGFubmVsXS5yZWdzLT5jdXJyX2Rlc2NfcHRyID0gYWRkcjsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZG1hX3hfY291bnQodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIHNob3J0IHhfY291bnQpCit7CisJZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPnhfY291bnQgPSB4X2NvdW50OworfQorc3RhdGljIGlubGluZSB2b2lkIHNldF9kbWFfeV9jb3VudCh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgc2hvcnQgeV9jb3VudCkKK3sKKwlkbWFfY2hbY2hhbm5lbF0ucmVncy0+eV9jb3VudCA9IHlfY291bnQ7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2RtYV94X21vZGlmeSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgc2hvcnQgeF9tb2RpZnkpCit7CisJZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPnhfbW9kaWZ5ID0geF9tb2RpZnk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2RtYV95X21vZGlmeSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgc2hvcnQgeV9tb2RpZnkpCit7CisJZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPnlfbW9kaWZ5ID0geV9tb2RpZnk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2RtYV9jb25maWcodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIHNob3J0IGNvbmZpZykKK3sKKwlkbWFfY2hbY2hhbm5lbF0ucmVncy0+Y2ZnID0gY29uZmlnOworfQorc3RhdGljIGlubGluZSB2b2lkIHNldF9kbWFfY3Vycl9hZGRyKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmN1cnJfYWRkcl9wdHIgPSBhZGRyOworfQogCi0vKiBzZXQgbGFyZ2UgRE1BIG1vZGUgZGVzY3JpcHRvciAqLwotdm9pZCBzZXRfZG1hX3NnKHVuc2lnbmVkIGludCBjaGFubmVsLCBzdHJ1Y3QgZG1hc2cgKnNnLCBpbnQgbnJfc2cpOworc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydAorc2V0X2JmaW5fZG1hX2NvbmZpZyhjaGFyIGRpcmVjdGlvbiwgY2hhciBmbG93X21vZGUsCisJCSAgICBjaGFyIGludHJfbW9kZSwgY2hhciBkbWFfbW9kZSwgY2hhciB3aWR0aCwgY2hhciBzeW5jbW9kZSkKK3sKKwlyZXR1cm4gKGRpcmVjdGlvbiA8PCAxKSB8ICh3aWR0aCA8PCAyKSB8IChkbWFfbW9kZSA8PCA0KSB8CisJCShpbnRyX21vZGUgPDwgNikgfCAoZmxvd19tb2RlIDw8IDEyKSB8IChzeW5jbW9kZSA8PCA1KTsKK30KIAotLyogY2hlY2sgaWYgY3VycmVudCBjaGFubmVsIGlzIGluIHVzZSAqLwotaW50IGRtYV9jaGFubmVsX2FjdGl2ZSh1bnNpZ25lZCBpbnQgY2hhbm5lbCk7CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGdldF9kbWFfY3Vycl9pcnFzdGF0KHVuc2lnbmVkIGludCBjaGFubmVsKQoreworCXJldHVybiBkbWFfY2hbY2hhbm5lbF0ucmVncy0+aXJxX3N0YXR1czsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgZ2V0X2RtYV9jdXJyX3hjb3VudCh1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwlyZXR1cm4gZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmN1cnJfeF9jb3VudDsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgZ2V0X2RtYV9jdXJyX3ljb3VudCh1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwlyZXR1cm4gZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmN1cnJfeV9jb3VudDsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCAqZ2V0X2RtYV9uZXh0X2Rlc2NfcHRyKHVuc2lnbmVkIGludCBjaGFubmVsKQoreworCXJldHVybiBkbWFfY2hbY2hhbm5lbF0ucmVncy0+bmV4dF9kZXNjX3B0cjsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCAqZ2V0X2RtYV9jdXJyX2Rlc2NfcHRyKHVuc2lnbmVkIGludCBjaGFubmVsKQoreworCXJldHVybiBkbWFfY2hbY2hhbm5lbF0ucmVncy0+Y3Vycl9kZXNjX3B0cjsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgZ2V0X2RtYV9jb25maWcodW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJcmV0dXJuIGRtYV9jaFtjaGFubmVsXS5yZWdzLT5jZmc7Cit9CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X2RtYV9jdXJyX2FkZHIodW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJcmV0dXJuIGRtYV9jaFtjaGFubmVsXS5yZWdzLT5jdXJyX2FkZHJfcHRyOworfQogCi0vKiBjb21tb24gZnVuY3Rpb25zIG11c3QgYmUgY2FsbGVkIGluIGFueSBtb2RlICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2RtYV9zZyh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgc3RydWN0IGRtYXNnICpzZywgaW50IG5kc2l6ZSkKK3sKKwlkbWFfY2hbY2hhbm5lbF0ucmVncy0+Y2ZnID0KKwkJKGRtYV9jaFtjaGFubmVsXS5yZWdzLT5jZmcgJiB+KDB4ZiA8PCA4KSkgfAorCQkoKG5kc2l6ZSAmIDB4ZikgPDwgOCk7CisJZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPm5leHRfZGVzY19wdHIgPSBzZzsKK30KKworc3RhdGljIGlubGluZSBpbnQgZG1hX2NoYW5uZWxfYWN0aXZlKHVuc2lnbmVkIGludCBjaGFubmVsKQoreworCWlmIChkbWFfY2hbY2hhbm5lbF0uY2hhbl9zdGF0dXMgPT0gRE1BX0NIQU5ORUxfRlJFRSkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfZG1hKHVuc2lnbmVkIGludCBjaGFubmVsKQoreworCWRtYV9jaFtjaGFubmVsXS5yZWdzLT5jZmcgJj0gfkRNQUVOOworCVNTWU5DKCk7CisJZG1hX2NoW2NoYW5uZWxdLmNoYW5fc3RhdHVzID0gRE1BX0NIQU5ORUxfUkVRVUVTVEVEOworfQorc3RhdGljIGlubGluZSB2b2lkIGVuYWJsZV9kbWEodW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmN1cnJfeF9jb3VudCA9IDA7CisJZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmN1cnJfeV9jb3VudCA9IDA7CisJZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmNmZyB8PSBETUFFTjsKKwlkbWFfY2hbY2hhbm5lbF0uY2hhbl9zdGF0dXMgPSBETUFfQ0hBTk5FTF9FTkFCTEVEOworfQogdm9pZCBmcmVlX2RtYSh1bnNpZ25lZCBpbnQgY2hhbm5lbCk7Ci1pbnQgZG1hX2NoYW5uZWxfYWN0aXZlKHVuc2lnbmVkIGludCBjaGFubmVsKTsgLyogY2hlY2sgaWYgYSBjaGFubmVsIGlzIGluIHVzZSAqLwotdm9pZCBkaXNhYmxlX2RtYSh1bnNpZ25lZCBpbnQgY2hhbm5lbCk7Ci12b2lkIGVuYWJsZV9kbWEodW5zaWduZWQgaW50IGNoYW5uZWwpOwotaW50IHJlcXVlc3RfZG1hKHVuc2lnbmVkIGludCBjaGFubmVsLCBjaGFyICpkZXZpY2VfaWQpOwotaW50IHNldF9kbWFfY2FsbGJhY2sodW5zaWduZWQgaW50IGNoYW5uZWwsIGRtYV9pbnRlcnJ1cHRfdCBjYWxsYmFjaywKLQkJICAgICB2b2lkICpkYXRhKTsKLXZvaWQgZG1hX2Rpc2FibGVfaXJxKHVuc2lnbmVkIGludCBjaGFubmVsKTsKLXZvaWQgZG1hX2VuYWJsZV9pcnEodW5zaWduZWQgaW50IGNoYW5uZWwpOwotdm9pZCBjbGVhcl9kbWFfaXJxc3RhdCh1bnNpZ25lZCBpbnQgY2hhbm5lbCk7CitpbnQgcmVxdWVzdF9kbWEodW5zaWduZWQgaW50IGNoYW5uZWwsIGNvbnN0IGNoYXIgKmRldmljZV9pZCk7CitpbnQgc2V0X2RtYV9jYWxsYmFjayh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgaXJxX2hhbmRsZXJfdCBjYWxsYmFjaywgdm9pZCAqZGF0YSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkbWFfZGlzYWJsZV9pcnEodW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJZGlzYWJsZV9pcnEoZG1hX2NoW2NoYW5uZWxdLmlycSk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgZG1hX2VuYWJsZV9pcnEodW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJZW5hYmxlX2lycShkbWFfY2hbY2hhbm5lbF0uaXJxKTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9kbWFfaXJxc3RhdCh1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwlkbWFfY2hbY2hhbm5lbF0ucmVncy0+aXJxX3N0YXR1cyA9IERNQV9ET05FIHwgRE1BX0VSUjsKK30KKwogdm9pZCAqZG1hX21lbWNweSh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBjb3VudCk7CiB2b2lkICpzYWZlX2RtYV9tZW1jcHkodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgY291bnQpOwotCi1leHRlcm4gaW50IGNoYW5uZWwyaXJxKHVuc2lnbmVkIGludCBjaGFubmVsKTsKLWV4dGVybiBzdHJ1Y3QgZG1hX3JlZ2lzdGVyICpkbWFfaW9fYmFzZV9hZGRyW01BWF9CTEFDS0ZJTl9ETUFfQ0hBTk5FTF07Cit2b2lkIGJsYWNrZmluX2RtYV9lYXJseV9pbml0KHZvaWQpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZW50cnkuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZW50cnkuaAppbmRleCBjNGY3MjFlLi5iMzBhMjk2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2VudHJ5LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9lbnRyeS5oCkBAIC0yNyw2ICsyNywxNCBAQAogI2RlZmluZSBTQVZFX0FMTF9TWVMJCXNhdmVfY29udGV4dF9ub19pbnRlcnJ1cHRzCiAvKiBUaGlzIGlzIHVzZWQgZm9yIGFsbCBub3JtYWwgaW50ZXJydXB0cy4gIEl0IHNhdmVzIGEgbWluaW11bSBvZiByZWdpc3RlcnMKICAgIHRvIHRoZSBzdGFjaywgbG9hZHMgdGhlIElSUSBudW1iZXIsIGFuZCBqdW1wcyB0byBjb21tb24gY29kZS4gICovCisjaWZkZWYgQ09ORklHX0lQSVBFCisjIGRlZmluZSBMT0FEX0lQSVBFX0lQRU5EIFwKKwlQMC5sID0gbG8oSVBFTkQpOyBcCisJUDAuaCA9IGhpKElQRU5EKTsgXAorCVIxID0gW1AwXTsKKyNlbHNlCisjIGRlZmluZSBMT0FEX0lQSVBFX0lQRU5ECisjZW5kaWYKICNkZWZpbmUgSU5URVJSVVBUX0VOVFJZKE4pCQkJCQkJXAogICAgIFstLXNwXSA9IFNZU0NGRzsJCQkJCQkJXAogCQkJCQkJCQkJXApAQCAtMzQsNiArNDIsNyBAQAogICAgIFstLXNwXSA9IFIwOwkvKm9yaWdfcjAqLwkJCQkJXAogICAgIFstLXNwXSA9IChSNzowLFA1OjApOwkJCQkJCVwKICAgICBSMCA9IChOKTsJCQkJCQkJCVwKKyAgICBMT0FEX0lQSVBFX0lQRU5ECQkJCQkJCVwKICAgICBqdW1wIF9fY29tbW9uX2ludF9lbnRyeTsKIAogLyogRm9yIHRpbWVyIGludGVycnVwdHMsIHdlIG5lZWQgdG8gc2F2ZSBJUEVORCwgc2luY2UgdGhlIHVzZXJfbW9kZQpAQCAtNTMsOSArNjIsMTEgQEAKIC8qIFRoaXMgb25lIHB1c2hlcyBSRVRJIHdpdGhvdXQgdXNpbmcgQ0xJLiAgSW50ZXJydXB0cyBhcmUgZW5hYmxlZC4gICovCiAjZGVmaW5lIFNBVkVfQ09OVEVYVF9TWVNDQUxMCXNhdmVfY29udGV4dF9zeXNjYWxsCiAjZGVmaW5lIFNBVkVfQ09OVEVYVAkJc2F2ZV9jb250ZXh0X3dpdGhfaW50ZXJydXB0cworI2RlZmluZSBTQVZFX0NPTlRFWFRfQ1BMQglzYXZlX2NvbnRleHRfY3BsYgogCiAjZGVmaW5lIFJFU1RPUkVfQUxMX1NZUwkJcmVzdG9yZV9jb250ZXh0X25vX2ludGVycnVwdHMKICNkZWZpbmUgUkVTVE9SRV9DT05URVhUCQlyZXN0b3JlX2NvbnRleHRfd2l0aF9pbnRlcnJ1cHRzCisjZGVmaW5lIFJFU1RPUkVfQ09OVEVYVF9DUExCCXJlc3RvcmVfY29udGV4dF9jcGxiCiAKICNlbmRpZgkJCQkvKiBfX0FTU0VNQkxZX18gKi8KICNlbmRpZgkJCQkvKiBfX0JGSU5fRU5UUllfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9ncGlvLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2dwaW8uaAppbmRleCBhZDMzYWMyLi45NDc3ZDgyIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2dwaW8uaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2dwaW8uaApAQCAtODQsMTEgKzg0LDE0IEBACiAjaWZuZGVmIF9fQVJDSF9CTEFDS0ZJTl9HUElPX0hfXwogI2RlZmluZSBfX0FSQ0hfQkxBQ0tGSU5fR1BJT19IX18KIAotI2RlZmluZSBncGlvX2JhbmsoeCkgKCh4KSA+PiA0KQotI2RlZmluZSBncGlvX2JpdCh4KSAgKDE8PCgoeCkgJiAweEYpKQotI2RlZmluZSBncGlvX3N1Yl9uKHgpICgoeCkgJiAweEYpCisjZGVmaW5lIGdwaW9fYmFuayh4KSAJKCh4KSA+PiA0KQorI2RlZmluZSBncGlvX2JpdCh4KSAgCSgxPDwoKHgpICYgMHhGKSkKKyNkZWZpbmUgZ3Bpb19zdWJfbih4KSAJKCh4KSAmIDB4RikKIAotI2RlZmluZSBHUElPX0JBTktTSVpFIDE2CisjZGVmaW5lIEdQSU9fQkFOS1NJWkUgCTE2CisjZGVmaW5lIEdQSU9fQkFOS19OVU0gCURJVl9ST1VORF9VUChNQVhfQkxBQ0tGSU5fR1BJT1MsIEdQSU9fQkFOS1NJWkUpCisKKyNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KIAogI2RlZmluZQlHUElPXzAJMAogI2RlZmluZQlHUElPXzEJMQpAQCAtMTM5LDE1MSArMTQyLDkgQEAKICNkZWZpbmUJR1BJT180Ngk0NgogI2RlZmluZQlHUElPXzQ3CTQ3CiAKLQogI2RlZmluZSBQRVJJUEhFUkFMX1VTQUdFIDEKICNkZWZpbmUgR1BJT19VU0FHRSAwCiAKLSNpZmRlZiBCRjUzM19GQU1JTFkKLSNkZWZpbmUgTUFYX0JMQUNLRklOX0dQSU9TIDE2Ci0KLSNkZWZpbmUJR1BJT19QRjAJMAotI2RlZmluZQlHUElPX1BGMQkxCi0jZGVmaW5lCUdQSU9fUEYyCTIKLSNkZWZpbmUJR1BJT19QRjMJMwotI2RlZmluZQlHUElPX1BGNAk0Ci0jZGVmaW5lCUdQSU9fUEY1CTUKLSNkZWZpbmUJR1BJT19QRjYJNgotI2RlZmluZQlHUElPX1BGNwk3Ci0jZGVmaW5lCUdQSU9fUEY4CTgKLSNkZWZpbmUJR1BJT19QRjkJOQotI2RlZmluZQlHUElPX1BGMTAJMTAKLSNkZWZpbmUJR1BJT19QRjExCTExCi0jZGVmaW5lCUdQSU9fUEYxMgkxMgotI2RlZmluZQlHUElPX1BGMTMJMTMKLSNkZWZpbmUJR1BJT19QRjE0CTE0Ci0jZGVmaW5lCUdQSU9fUEYxNQkxNQotCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQkY1MjdfRkFNSUxZKSB8fCBkZWZpbmVkKEJGNTM3X0ZBTUlMWSkKLSNkZWZpbmUgTUFYX0JMQUNLRklOX0dQSU9TIDQ4Ci0KLSNkZWZpbmUJR1BJT19QRjAJMAotI2RlZmluZQlHUElPX1BGMQkxCi0jZGVmaW5lCUdQSU9fUEYyCTIKLSNkZWZpbmUJR1BJT19QRjMJMwotI2RlZmluZQlHUElPX1BGNAk0Ci0jZGVmaW5lCUdQSU9fUEY1CTUKLSNkZWZpbmUJR1BJT19QRjYJNgotI2RlZmluZQlHUElPX1BGNwk3Ci0jZGVmaW5lCUdQSU9fUEY4CTgKLSNkZWZpbmUJR1BJT19QRjkJOQotI2RlZmluZQlHUElPX1BGMTAJMTAKLSNkZWZpbmUJR1BJT19QRjExCTExCi0jZGVmaW5lCUdQSU9fUEYxMgkxMgotI2RlZmluZQlHUElPX1BGMTMJMTMKLSNkZWZpbmUJR1BJT19QRjE0CTE0Ci0jZGVmaW5lCUdQSU9fUEYxNQkxNQotI2RlZmluZQlHUElPX1BHMAkxNgotI2RlZmluZQlHUElPX1BHMQkxNwotI2RlZmluZQlHUElPX1BHMgkxOAotI2RlZmluZQlHUElPX1BHMwkxOQotI2RlZmluZQlHUElPX1BHNAkyMAotI2RlZmluZQlHUElPX1BHNQkyMQotI2RlZmluZQlHUElPX1BHNgkyMgotI2RlZmluZQlHUElPX1BHNwkyMwotI2RlZmluZQlHUElPX1BHOAkyNAotI2RlZmluZQlHUElPX1BHOQkyNQotI2RlZmluZQlHUElPX1BHMTAgICAgICAJMjYKLSNkZWZpbmUJR1BJT19QRzExICAgICAgCTI3Ci0jZGVmaW5lCUdQSU9fUEcxMiAgICAgIAkyOAotI2RlZmluZQlHUElPX1BHMTMgICAgICAJMjkKLSNkZWZpbmUJR1BJT19QRzE0ICAgICAgCTMwCi0jZGVmaW5lCUdQSU9fUEcxNSAgICAgIAkzMQotI2RlZmluZQlHUElPX1BIMAkzMgotI2RlZmluZQlHUElPX1BIMQkzMwotI2RlZmluZQlHUElPX1BIMgkzNAotI2RlZmluZQlHUElPX1BIMwkzNQotI2RlZmluZQlHUElPX1BINAkzNgotI2RlZmluZQlHUElPX1BINQkzNwotI2RlZmluZQlHUElPX1BINgkzOAotI2RlZmluZQlHUElPX1BINwkzOQotI2RlZmluZQlHUElPX1BIOAk0MAotI2RlZmluZQlHUElPX1BIOQk0MQotI2RlZmluZQlHUElPX1BIMTAgICAgICAJNDIKLSNkZWZpbmUJR1BJT19QSDExICAgICAgCTQzCi0jZGVmaW5lCUdQSU9fUEgxMiAgICAgIAk0NAotI2RlZmluZQlHUElPX1BIMTMgICAgICAJNDUKLSNkZWZpbmUJR1BJT19QSDE0ICAgICAgCTQ2Ci0jZGVmaW5lCUdQSU9fUEgxNSAgICAgIAk0NwotCi0jZGVmaW5lIFBPUlRfRiBHUElPX1BGMAotI2RlZmluZSBQT1JUX0cgR1BJT19QRzAKLSNkZWZpbmUgUE9SVF9IIEdQSU9fUEgwCi0KLSNlbmRpZgotCi0jaWZkZWYgQkY1NDhfRkFNSUxZCi0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEJGNTYxX0ZBTUlMWQotI2RlZmluZSBNQVhfQkxBQ0tGSU5fR1BJT1MgNDgKLQotI2RlZmluZQlHUElPX1BGMAkwCi0jZGVmaW5lCUdQSU9fUEYxCTEKLSNkZWZpbmUJR1BJT19QRjIJMgotI2RlZmluZQlHUElPX1BGMwkzCi0jZGVmaW5lCUdQSU9fUEY0CTQKLSNkZWZpbmUJR1BJT19QRjUJNQotI2RlZmluZQlHUElPX1BGNgk2Ci0jZGVmaW5lCUdQSU9fUEY3CTcKLSNkZWZpbmUJR1BJT19QRjgJOAotI2RlZmluZQlHUElPX1BGOQk5Ci0jZGVmaW5lCUdQSU9fUEYxMAkxMAotI2RlZmluZQlHUElPX1BGMTEJMTEKLSNkZWZpbmUJR1BJT19QRjEyCTEyCi0jZGVmaW5lCUdQSU9fUEYxMwkxMwotI2RlZmluZQlHUElPX1BGMTQJMTQKLSNkZWZpbmUJR1BJT19QRjE1CTE1Ci0jZGVmaW5lCUdQSU9fUEYxNgkxNgotI2RlZmluZQlHUElPX1BGMTcJMTcKLSNkZWZpbmUJR1BJT19QRjE4CTE4Ci0jZGVmaW5lCUdQSU9fUEYxOQkxOQotI2RlZmluZQlHUElPX1BGMjAJMjAKLSNkZWZpbmUJR1BJT19QRjIxCTIxCi0jZGVmaW5lCUdQSU9fUEYyMgkyMgotI2RlZmluZQlHUElPX1BGMjMJMjMKLSNkZWZpbmUJR1BJT19QRjI0CTI0Ci0jZGVmaW5lCUdQSU9fUEYyNQkyNQotI2RlZmluZQlHUElPX1BGMjYJMjYKLSNkZWZpbmUJR1BJT19QRjI3CTI3Ci0jZGVmaW5lCUdQSU9fUEYyOAkyOAotI2RlZmluZQlHUElPX1BGMjkJMjkKLSNkZWZpbmUJR1BJT19QRjMwCTMwCi0jZGVmaW5lCUdQSU9fUEYzMQkzMQotI2RlZmluZQlHUElPX1BGMzIJMzIKLSNkZWZpbmUJR1BJT19QRjMzCTMzCi0jZGVmaW5lCUdQSU9fUEYzNAkzNAotI2RlZmluZQlHUElPX1BGMzUJMzUKLSNkZWZpbmUJR1BJT19QRjM2CTM2Ci0jZGVmaW5lCUdQSU9fUEYzNwkzNwotI2RlZmluZQlHUElPX1BGMzgJMzgKLSNkZWZpbmUJR1BJT19QRjM5CTM5Ci0jZGVmaW5lCUdQSU9fUEY0MAk0MAotI2RlZmluZQlHUElPX1BGNDEJNDEKLSNkZWZpbmUJR1BJT19QRjQyCTQyCi0jZGVmaW5lCUdQSU9fUEY0Mwk0MwotI2RlZmluZQlHUElPX1BGNDQJNDQKLSNkZWZpbmUJR1BJT19QRjQ1CTQ1Ci0jZGVmaW5lCUdQSU9fUEY0Ngk0NgotI2RlZmluZQlHUElPX1BGNDcJNDcKLQotI2RlZmluZSBQT1JUX0ZJTzAgR1BJT18wCi0jZGVmaW5lIFBPUlRfRklPMSBHUElPXzE2Ci0jZGVmaW5lIFBPUlRfRklPMiBHUElPXzMyCi0jZW5kaWYKLQogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00MjUsMjAgKzI4Niw3NyBAQAogKiBNT0RJRklDQVRJT04gSElTVE9SWSA6CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotaW50IGdwaW9fcmVxdWVzdCh1bnNpZ25lZCwgY29uc3QgY2hhciAqKTsKLXZvaWQgZ3Bpb19mcmVlKHVuc2lnbmVkKTsKLQotdm9pZCBncGlvX3NldF92YWx1ZSh1bnNpZ25lZCBncGlvLCBpbnQgYXJnKTsKLWludCBncGlvX2dldF92YWx1ZSh1bnNpZ25lZCBncGlvKTsKK2ludCBiZmluX2dwaW9fcmVxdWVzdCh1bnNpZ25lZCBncGlvLCBjb25zdCBjaGFyICpsYWJlbCk7Cit2b2lkIGJmaW5fZ3Bpb19mcmVlKHVuc2lnbmVkIGdwaW8pOworaW50IGJmaW5fZ3Bpb19pcnFfcmVxdWVzdCh1bnNpZ25lZCBncGlvLCBjb25zdCBjaGFyICpsYWJlbCk7Cit2b2lkIGJmaW5fZ3Bpb19pcnFfZnJlZSh1bnNpZ25lZCBncGlvKTsKK2ludCBiZmluX2dwaW9fZGlyZWN0aW9uX2lucHV0KHVuc2lnbmVkIGdwaW8pOworaW50IGJmaW5fZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSk7CitpbnQgYmZpbl9ncGlvX2dldF92YWx1ZSh1bnNpZ25lZCBncGlvKTsKK3ZvaWQgYmZpbl9ncGlvX3NldF92YWx1ZSh1bnNpZ25lZCBncGlvLCBpbnQgdmFsdWUpOwogCiAjaWZuZGVmIEJGNTQ4X0ZBTUlMWQotI2RlZmluZSBncGlvX3NldF92YWx1ZShncGlvLCB2YWx1ZSkJc2V0X2dwaW9fZGF0YShncGlvLCB2YWx1ZSkKKyNkZWZpbmUgYmZpbl9ncGlvX3NldF92YWx1ZShncGlvLCB2YWx1ZSkgICAgc2V0X2dwaW9fZGF0YShncGlvLCB2YWx1ZSkKICNlbmRpZgogCi1pbnQgZ3Bpb19kaXJlY3Rpb25faW5wdXQodW5zaWduZWQgZ3Bpbyk7Ci1pbnQgZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSk7CisjaWZkZWYgQ09ORklHX0dQSU9MSUIKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ncGlvLmg+CQkvKiBjYW5zbGVlcCB3cmFwcGVycyAqLworCitzdGF0aWMgaW5saW5lIGludCBncGlvX2dldF92YWx1ZSh1bnNpZ25lZCBpbnQgZ3BpbykKK3sKKwlpZiAoZ3BpbyA8IE1BWF9CTEFDS0ZJTl9HUElPUykKKwkJcmV0dXJuIGJmaW5fZ3Bpb19nZXRfdmFsdWUoZ3Bpbyk7CisJZWxzZQorCQlyZXR1cm4gX19ncGlvX2dldF92YWx1ZShncGlvKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdwaW9fc2V0X3ZhbHVlKHVuc2lnbmVkIGludCBncGlvLCBpbnQgdmFsdWUpCit7CisJaWYgKGdwaW8gPCBNQVhfQkxBQ0tGSU5fR1BJT1MpCisJCWJmaW5fZ3Bpb19zZXRfdmFsdWUoZ3BpbywgdmFsdWUpOworCWVsc2UKKwkJX19ncGlvX3NldF92YWx1ZShncGlvLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdwaW9fY2Fuc2xlZXAodW5zaWduZWQgaW50IGdwaW8pCit7CisJcmV0dXJuIF9fZ3Bpb19jYW5zbGVlcChncGlvKTsKK30KKworI2Vsc2UgLyogIUNPTkZJR19HUElPTElCICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGdwaW9fcmVxdWVzdCh1bnNpZ25lZCBncGlvLCBjb25zdCBjaGFyICpsYWJlbCkKK3sKKwlyZXR1cm4gYmZpbl9ncGlvX3JlcXVlc3QoZ3BpbywgbGFiZWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ3Bpb19mcmVlKHVuc2lnbmVkIGdwaW8pCit7CisJcmV0dXJuIGJmaW5fZ3Bpb19mcmVlKGdwaW8pOworfQorCitzdGF0aWMgaW5saW5lIGludCBncGlvX2RpcmVjdGlvbl9pbnB1dCh1bnNpZ25lZCBncGlvKQoreworCXJldHVybiBiZmluX2dwaW9fZGlyZWN0aW9uX2lucHV0KGdwaW8pOworfQorCitzdGF0aWMgaW5saW5lIGludCBncGlvX2RpcmVjdGlvbl9vdXRwdXQodW5zaWduZWQgZ3BpbywgaW50IHZhbHVlKQoreworCXJldHVybiBiZmluX2dwaW9fZGlyZWN0aW9uX291dHB1dChncGlvLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdwaW9fZ2V0X3ZhbHVlKHVuc2lnbmVkIGdwaW8pCit7CisJcmV0dXJuIGJmaW5fZ3Bpb19nZXRfdmFsdWUoZ3Bpbyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBncGlvX3NldF92YWx1ZSh1bnNpZ25lZCBncGlvLCBpbnQgdmFsdWUpCit7CisJcmV0dXJuIGJmaW5fZ3Bpb19zZXRfdmFsdWUoZ3BpbywgdmFsdWUpOworfQogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZ3Bpby5oPgkJLyogY2Fuc2xlZXAgd3JhcHBlcnMgKi8KKyNlbmRpZgkvKiAhQ09ORklHX0dQSU9MSUIgKi8KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAKIHN0YXRpYyBpbmxpbmUgaW50IGdwaW9fdG9faXJxKHVuc2lnbmVkIGdwaW8pCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2hhcmRpcnEuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaGFyZGlycS5oCmluZGV4IGI2YjE5ZjEuLjcxNzE4MWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaGFyZGlycS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaGFyZGlycS5oCkBAIC00Miw0ICs0Miw2IEBACiAKICNkZWZpbmUgX19BUkNIX0lSUV9FWElUX0lSUVNfRElTQUJMRUQJMQogCitleHRlcm4gdm9pZCBhY2tfYmFkX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2lvLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2lvLmgKaW5kZXggN2RjNzdhMi4uNjNiMmQ4YyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9pby5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaW8uaApAQCAtOTQsMTIgKzk0LDEyIEBACiAjZGVmaW5lIG91dHdfcCh4LGFkZHIpIG91dHcoeCxhZGRyKQogI2RlZmluZSBvdXRsX3AoeCxhZGRyKSBvdXRsKHgsYWRkcikKIAotI2RlZmluZSBpb3JlYWQ4X3JlcChhLGQsYykJaW5zYihhLGQsYykKLSNkZWZpbmUgaW9yZWFkMTZfcmVwKGEsZCxjKQlpbnN3KGEsZCxjKQotI2RlZmluZSBpb3JlYWQzMl9yZXAoYSxkLGMpCWluc2woYSxkLGMpCi0jZGVmaW5lIGlvd3JpdGU4X3JlcChhLHMsYykJb3V0c2IoYSxzLGMpCi0jZGVmaW5lIGlvd3JpdGUxNl9yZXAoYSxzLGMpCW91dHN3KGEscyxjKQotI2RlZmluZSBpb3dyaXRlMzJfcmVwKGEscyxjKQlvdXRzbChhLHMsYykKKyNkZWZpbmUgaW9yZWFkOF9yZXAoYSxkLGMpCXJlYWRzYihhLGQsYykKKyNkZWZpbmUgaW9yZWFkMTZfcmVwKGEsZCxjKQlyZWFkc3coYSxkLGMpCisjZGVmaW5lIGlvcmVhZDMyX3JlcChhLGQsYykJcmVhZHNsKGEsZCxjKQorI2RlZmluZSBpb3dyaXRlOF9yZXAoYSxzLGMpCXdyaXRlc2IoYSxzLGMpCisjZGVmaW5lIGlvd3JpdGUxNl9yZXAoYSxzLGMpCXdyaXRlc3coYSxzLGMpCisjZGVmaW5lIGlvd3JpdGUzMl9yZXAoYSxzLGMpCXdyaXRlc2woYSxzLGMpCiAKICNkZWZpbmUgaW9yZWFkOChYKQkJCXJlYWRiKFgpCiAjZGVmaW5lIGlvcmVhZDE2KFgpCQkJcmVhZHcoWCkKQEAgLTEwOCw2ICsxMDgsOCBAQAogI2RlZmluZSBpb3dyaXRlMTYodmFsLFgpCQl3cml0ZXcodmFsLFgpCiAjZGVmaW5lIGlvd3JpdGUzMih2YWwsWCkJCXdyaXRlbCh2YWwsWCkKIAorI2RlZmluZSBtbWlvd2IoKSB3bWIoKQorCiAjZGVmaW5lIElPX1NQQUNFX0xJTUlUIDB4ZmZmZmZmZmYKIAogLyogVmFsdWVzIGZvciBub2NhY2hlZmxhZyBhbmQgY21vZGUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaXBpcGUuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaXBpcGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmY1M2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9pcGlwZS5oCkBAIC0wLDAgKzEsMjc4IEBACisvKiAgIC0qLSBsaW51eC1jIC0qLQorICogICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9pcGlwZS5oCisgKgorICogICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNyBQaGlsaXBwZSBHZXJ1bS4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlIE1BIDAyMTM5LAorICogICBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisgKiAgIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fQVNNX0JMQUNLRklOX0lQSVBFX0gKKyNkZWZpbmUgX19BU01fQkxBQ0tGSU5fSVBJUEVfSAorCisjaWZkZWYgQ09ORklHX0lQSVBFCisKKyNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pcGlwZV9wZXJjcHUuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CisKKyNkZWZpbmUgSVBJUEVfQVJDSF9TVFJJTkcgICAgICIxLjgtMDAiCisjZGVmaW5lIElQSVBFX01BSk9SX05VTUJFUiAgICAxCisjZGVmaW5lIElQSVBFX01JTk9SX05VTUJFUiAgICA4CisjZGVmaW5lIElQSVBFX1BBVENIX05VTUJFUiAgICAwCisKKyNpZmRlZiBDT05GSUdfU01QCisjZXJyb3IgIkktcGlwZS9ibGFja2ZpbjogU01QIG5vdCBpbXBsZW1lbnRlZCIKKyNlbHNlIC8qICFDT05GSUdfU01QICovCisjZGVmaW5lIGlwaXBlX3Byb2Nlc3Nvcl9pZCgpCTAKKyNlbmRpZgkvKiBDT05GSUdfU01QICovCisKKyNkZWZpbmUgcHJlcGFyZV9hcmNoX3N3aXRjaChuZXh0KQkJXAorZG8gewkJCQkJCVwKKwlpcGlwZV9zY2hlZHVsZV9ub3RpZnkoY3VycmVudCwgbmV4dCk7CVwKKwlsb2NhbF9pcnFfZGlzYWJsZV9odygpOwkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgdGFza19oaWphY2tlZChwKQkJCQkJCVwKKwkoewkJCQkJCQkJXAorCQlpbnQgX194X18gPSBpcGlwZV9jdXJyZW50X2RvbWFpbiAhPSBpcGlwZV9yb290X2RvbWFpbjsJXAorCQkvKiBXZSB3b3VsZCBuZWVkIHRvIGNsZWFyIHRoZSBTWU5DIGZsYWcgZm9yIHRoZSByb290IGRvbWFpbiAqLyBcCisJCS8qIG92ZXIgdGhlIGN1cnJlbnQgcHJvY2Vzc29yIGluIFNNUCBtb2RlLiAqLwkJXAorCQlsb2NhbF9pcnFfZW5hYmxlX2h3KCk7IF9feF9fOwkJCQlcCisJfSkKKworc3RydWN0IGlwaXBlX2RvbWFpbjsKKworc3RydWN0IGlwaXBlX3N5c2luZm8geworCisJaW50IG5jcHVzOwkJLyogTnVtYmVyIG9mIENQVXMgb24gYm9hcmQgKi8KKwl1NjQgY3B1ZnJlcTsJCS8qIENQVSBmcmVxdWVuY3kgKGluIEh6KSAqLworCisJLyogQXJjaC1kZXBlbmRlbnQgYmxvY2sgKi8KKworCXN0cnVjdCB7CisJCXVuc2lnbmVkIHRtaXJxOwkvKiBUaW1lciB0aWNrIElSUSAqLworCQl1NjQgdG1mcmVxOwkvKiBUaW1lciBmcmVxdWVuY3kgKi8KKwl9IGFyY2hkZXA7Cit9OworCisjZGVmaW5lIGlwaXBlX3JlYWRfdHNjKHQpCQkJCQlcCisJKHsJCQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgX19jeTI7CQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCIxOiAlMCA9IENZQ0xFUzJcbiIJCVwKKwkJCQkiJTEgPSBDWUNMRVNcbiIJCQlcCisJCQkJIiUyID0gQ1lDTEVTMlxuIgkJXAorCQkJCSJDQyA9ICUyID09ICUwXG4iCQlcCisJCQkJImlmICEgQ0MganVtcCAxYlxuIgkJXAorCQkJCTogIj1yIiAoKCh1bnNpZ25lZCBsb25nICopJnQpWzFdKSwJXAorCQkJCSAgIj1yIiAoKCh1bnNpZ25lZCBsb25nICopJnQpWzBdKSwJXAorCQkJCSAgIj1yIiAoX19jeTIpCQkJCVwKKwkJCQk6IC8qbm8gaW5wdXQqLyA6ICJDQyIpOwkJCVwKKwl0OwkJCQkJCQkJXAorCX0pCisKKyNkZWZpbmUgaXBpcGVfY3B1X2ZyZXEoKQlfX2lwaXBlX2NvcmVfY2xvY2sKKyNkZWZpbmUgaXBpcGVfdHNjMm5zKF90KQkoKCh1bnNpZ25lZCBsb25nKShfdCkpICogX19pcGlwZV9mcmVxX3NjYWxlKQorI2RlZmluZSBpcGlwZV90c2MydXMoX3QpCShpcGlwZV90c2MybnMoX3QpIC8gMTAwMCArIDEpCisKKy8qIFByaXZhdGUgaW50ZXJmYWNlIC0tIEludGVybmFsIHVzZSBvbmx5ICovCisKKyNkZWZpbmUgX19pcGlwZV9jaGVja19wbGF0Zm9ybSgpCWRvIHsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBfX2lwaXBlX2luaXRfcGxhdGZvcm0oKQkJZG8geyB9IHdoaWxlICgwKQorCitleHRlcm4gYXRvbWljX3QgX19pcGlwZV9pcnFfbHZkZXB0aFtJVkcxNSArIDFdOworCitleHRlcm4gdW5zaWduZWQgbG9uZyBfX2lwaXBlX2lycV9sdm1hc2s7CisKK2V4dGVybiBzdHJ1Y3QgaXBpcGVfZG9tYWluIGlwaXBlX3Jvb3Q7CisKKy8qIGVuYWJsZS9kaXNhYmxlX2lycWRlc2MgX211c3RfIGJlIHVzZWQgaW4gcGFpcnMuICovCisKK3ZvaWQgX19pcGlwZV9lbmFibGVfaXJxZGVzYyhzdHJ1Y3QgaXBpcGVfZG9tYWluICppcGQsCisJCQkgICAgdW5zaWduZWQgaXJxKTsKKwordm9pZCBfX2lwaXBlX2Rpc2FibGVfaXJxZGVzYyhzdHJ1Y3QgaXBpcGVfZG9tYWluICppcGQsCisJCQkgICAgIHVuc2lnbmVkIGlycSk7CisKKyNkZWZpbmUgX19pcGlwZV9lbmFibGVfaXJxKGlycSkJCShpcnFfZGVzY1tpcnFdLmNoaXAtPnVubWFzayhpcnEpKQorCisjZGVmaW5lIF9faXBpcGVfZGlzYWJsZV9pcnEoaXJxKQkoaXJxX2Rlc2NbaXJxXS5jaGlwLT5tYXNrKGlycSkpCisKKyNkZWZpbmUgX19pcGlwZV9sb2NrX3Jvb3QoKQkJCQkJXAorCXNldF9iaXQoSVBJUEVfUk9PVExPQ0tfRkxBRywgJmlwaXBlX3Jvb3RfZG9tYWluLT5mbGFncykKKworI2RlZmluZSBfX2lwaXBlX3VubG9ja19yb290KCkJCQkJCVwKKwljbGVhcl9iaXQoSVBJUEVfUk9PVExPQ0tfRkxBRywgJmlwaXBlX3Jvb3RfZG9tYWluLT5mbGFncykKKwordm9pZCBfX2lwaXBlX2VuYWJsZV9waXBlbGluZSh2b2lkKTsKKworI2RlZmluZSBfX2lwaXBlX2hvb2tfY3JpdGljYWxfaXBpKGlwZCkgZG8geyB9IHdoaWxlICgwKQorCisjZGVmaW5lIF9faXBpcGVfc3luY19waXBlbGluZShzeW5jbWFzaykJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCXN0cnVjdCBpcGlwZV9kb21haW4gKmlwZCA9IGlwaXBlX2N1cnJlbnRfZG9tYWluOwlcCisJCWlmIChsaWtlbHkoaXBkICE9IGlwaXBlX3Jvb3RfZG9tYWluIHx8ICF0ZXN0X2JpdChJUElQRV9ST09UTE9DS19GTEFHLCAmaXBkLT5mbGFncykpKSBcCisJCQlfX2lwaXBlX3N5bmNfc3RhZ2Uoc3luY21hc2spOwkJCVwKKwl9IHdoaWxlICgwKQorCit2b2lkIF9faXBpcGVfaGFuZGxlX2lycSh1bnNpZ25lZCBpcnEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKworaW50IF9faXBpcGVfZ2V0X2lycV9wcmlvcml0eSh1bnNpZ25lZCBpcnEpOworCitpbnQgX19pcGlwZV9nZXRfaXJxdGhyZWFkX3ByaW9yaXR5KHVuc2lnbmVkIGlycSk7CisKK3ZvaWQgX19pcGlwZV9zdGFsbF9yb290X3Jhdyh2b2lkKTsKKwordm9pZCBfX2lwaXBlX3Vuc3RhbGxfcm9vdF9yYXcodm9pZCk7CisKK3ZvaWQgX19pcGlwZV9zZXJpYWxfZGVidWcoY29uc3QgY2hhciAqZm10LCAuLi4pOworCitERUNMQVJFX1BFUl9DUFUoc3RydWN0IHB0X3JlZ3MsIF9faXBpcGVfdGlja19yZWdzKTsKKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19pcGlwZV9jb3JlX2Nsb2NrOworCitleHRlcm4gdW5zaWduZWQgbG9uZyBfX2lwaXBlX2ZyZXFfc2NhbGU7CisKK2V4dGVybiB1bnNpZ25lZCBsb25nIF9faXBpcGVfaXJxX3RhaWxfaG9vazsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9faXBpcGVfZmZueih1bnNpZ25lZCBsb25nIHVsKQoreworCXJldHVybiBmZnModWwpIC0gMTsKK30KKworI2RlZmluZSBfX2lwaXBlX3J1bl9pcnF0YWlsKCkgIC8qIE11c3QgYmUgYSBtYWNybyAqLwkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWFzbWxpbmthZ2Ugdm9pZCBfX2lwaXBlX2NhbGxfaXJxdGFpbCh2b2lkKTsJCVwKKwkJdW5zaWduZWQgbG9uZyBfX3BlbmRpbmc7CQkJCVwKKwkJQ1NZTkMoKTsJCQkJCVwKKwkJX19wZW5kaW5nID0gYmZpbl9yZWFkX0lQRU5EKCk7CQkJCVwKKwkJaWYgKF9fcGVuZGluZyAmIDB4ODAwMCkgewkJCQlcCisJCQlfX3BlbmRpbmcgJj0gfjB4ODAxMDsJCQkJXAorCQkJaWYgKF9fcGVuZGluZyAmJiAoX19wZW5kaW5nICYgKF9fcGVuZGluZyAtIDEpKSA9PSAwKSBcCisJCQkJX19pcGlwZV9jYWxsX2lycXRhaWwoKTsJCQlcCisJCX0JCQkJCQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgX19pcGlwZV9ydW5faXNyKGlwZCwgaXJxKQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJaWYgKGlwZCA9PSBpcGlwZV9yb290X2RvbWFpbikgewkJCQlcCisJCQkvKgkJCQkJCVwKKwkJCSAqIE5vdGU6IHRoZSBJLXBpcGUgaW1wbGVtZW50cyBhIHRocmVhZGVkIGludGVycnVwdCBtb2RlbCBvbiBcCisJCQkgKiB0aGlzIGFyY2ggZm9yIExpbnV4IGV4dGVybmFsIElSUXMuIFRoZSBpbnRlcnJ1cHQgaGFuZGxlciB3ZSBcCisJCQkgKiBjYWxsIGhlcmUgb25seSB3YWtlcyB1cCB0aGUgYXNzb2NpYXRlZCBJUlEgdGhyZWFkLiBcCisJCQkgKi8JCQkJCQlcCisJCQlpZiAoaXBpcGVfdmlydHVhbF9pcnFfcChpcnEpKSB7CQkJXAorCQkJCS8qIE5vIGlycXRhaWwgaGVyZTsgdmlydHVhbCBpbnRlcnJ1cHRzIGhhdmUgbm8gZWZmZWN0IFwKKwkJCQkgICBvbiBJUEVORCBzbyB0aGVyZSBpcyBubyBuZWVkIGZvciBwcm9jZXNzaW5nIFwKKwkJCQkgICBkZWZlcnJhbC4gKi8JCQkJXAorCQkJCWxvY2FsX2lycV9lbmFibGVfbm9oZWFkKGlwZCk7CQlcCisJCQkJaXBkLT5pcnFzW2lycV0uaGFuZGxlcihpcnEsIGlwZC0+aXJxc1tpcnFdLmNvb2tpZSk7IFwKKwkJCQlsb2NhbF9pcnFfZGlzYWJsZV9ub2hlYWQoaXBkKTsJCVwKKwkJCX0gZWxzZQkJCQkJCVwKKwkJCQkvKgkJCQkJXAorCQkJCSAqIE5vIG5lZWQgdG8gcnVuIHRoZSBpcnF0YWlsIGhlcmUgZWl0aGVyOyBcCisJCQkJICogd2UgY2FuJ3QgYmUgcHJlZW1wdGVkIGJ5IGh3IElSUXMsIHNvCVwKKwkJCQkgKiBub24tTGludXggSVJRcyBjYW5ub3Qgc3RhY2sgb3ZlciB0aGUgc2hvcnQgXAorCQkJCSAqIHRocmVhZCB3YWtldXAgY29kZS4gV2hpY2ggaW4gdHVybiBtZWFucyBcCisJCQkJICogdGhhdCBubyBpcnF0YWlsIGNvbmRpdGlvbiBjb3VsZCBiZSBwZW5kaW5nIFwKKwkJCQkgKiBmb3IgZG9tYWlucyBhYm92ZSBMaW51eCBpbiB0aGUgcGlwZWxpbmUuIFwKKwkJCQkgKi8JCQkJCVwKKwkJCQlpcGQtPmlycXNbaXJxXS5oYW5kbGVyKGlycSwgJl9fcmF3X2dldF9jcHVfdmFyKF9faXBpcGVfdGlja19yZWdzKSk7IFwKKwkJfSBlbHNlIHsJCQkJCQlcCisJCQlfX2NsZWFyX2JpdChJUElQRV9TWU5DX0ZMQUcsICZpcGlwZV9jcHVkb21fdmFyKGlwZCwgc3RhdHVzKSk7IFwKKwkJCWxvY2FsX2lycV9lbmFibGVfbm9oZWFkKGlwZCk7CQkJXAorCQkJaXBkLT5pcnFzW2lycV0uaGFuZGxlcihpcnEsIGlwZC0+aXJxc1tpcnFdLmNvb2tpZSk7IFwKKwkJCS8qIEF0dGVtcHQgdG8gZXhpdCB0aGUgb3V0ZXIgaW50ZXJydXB0IGxldmVsIGJlZm9yZSBcCisJCQkgKiBzdGFydGluZyB0aGUgZGVmZXJyZWQgSVJRIHByb2Nlc3NpbmcuICovCVwKKwkJCWxvY2FsX2lycV9kaXNhYmxlX25vaGVhZChpcGQpOwkJCVwKKwkJCV9faXBpcGVfcnVuX2lycXRhaWwoKTsJCQkJXAorCQkJX19zZXRfYml0KElQSVBFX1NZTkNfRkxBRywgJmlwaXBlX2NwdWRvbV92YXIoaXBkLCBzdGF0dXMpKTsgXAorCQl9CQkJCQkJCVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIF9faXBpcGVfc3lzY2FsbF93YXRjaGVkX3AocCwgc2MpCVwKKwkoKChwKS0+ZmxhZ3MgJiBQRl9FVk5PVElGWSkgfHwgKHVuc2lnbmVkIGxvbmcpc2MgPj0gTlJfc3lzY2FsbHMpCisKK3ZvaWQgaXBpcGVfaW5pdF9pcnFfdGhyZWFkcyh2b2lkKTsKKworaW50IGlwaXBlX3N0YXJ0X2lycV90aHJlYWQodW5zaWduZWQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpOworCisjZGVmaW5lIElTX1NZU0lSUShpcnEpCQkoKGlycSkgPiBJUlFfQ09SRVRNUiAmJiAoaXJxKSA8PSBTWVNfSVJRUykKKyNkZWZpbmUgSVNfR1BJT0lSUShpcnEpCQkoKGlycSkgPj0gR1BJT19JUlFfQkFTRSAmJiAoaXJxKSA8IE5SX0lSUVMpCisKKyNkZWZpbmUgSVJRX1NZU1RNUgkJSVJRX1RJTUVSMAorI2RlZmluZSBJUlFfUFJJT1RNUgkJQ09ORklHX0lSUV9USU1FUjAKKworI2lmIGRlZmluZWQoQ09ORklHX0JGNTMxKSB8fCBkZWZpbmVkKENPTkZJR19CRjUzMikgfHwgZGVmaW5lZChDT05GSUdfQkY1MzMpCisjZGVmaW5lIFBSSU9fR1BJT0RFTVVYKGlycSkJQ09ORklHX1BGQQorI2VsaWYgZGVmaW5lZChDT05GSUdfQkY1MzQpIHx8IGRlZmluZWQoQ09ORklHX0JGNTM2KSB8fCBkZWZpbmVkKENPTkZJR19CRjUzNykKKyNkZWZpbmUgUFJJT19HUElPREVNVVgoaXJxKQlDT05GSUdfSVJRX1BST0dfSU5UQQorI2VsaWYgZGVmaW5lZChDT05GSUdfQkY1MngpCisjZGVmaW5lIFBSSU9fR1BJT0RFTVVYKGlycSkJKChpcnEpID09IElSUV9QT1JURl9JTlRBID8gQ09ORklHX0lSUV9QT1JURl9JTlRBIDogXAorCQkJCSAoaXJxKSA9PSBJUlFfUE9SVEdfSU5UQSA/IENPTkZJR19JUlFfUE9SVEdfSU5UQSA6IFwKKwkJCQkgKGlycSkgPT0gSVJRX1BPUlRIX0lOVEEgPyBDT05GSUdfSVJRX1BPUlRIX0lOVEEgOiBcCisJCQkJIC0xKQorI2VsaWYgZGVmaW5lZChDT05GSUdfQkY1NjEpCisjZGVmaW5lIFBSSU9fR1BJT0RFTVVYKGlycSkJKChpcnEpID09IElSUV9QUk9HMF9JTlRBID8gQ09ORklHX0lSUV9QUk9HMF9JTlRBIDogXAorCQkJCSAoaXJxKSA9PSBJUlFfUFJPRzFfSU5UQSA/IENPTkZJR19JUlFfUFJPRzFfSU5UQSA6IFwKKwkJCQkgKGlycSkgPT0gSVJRX1BST0cyX0lOVEEgPyBDT05GSUdfSVJRX1BST0cyX0lOVEEgOiBcCisJCQkJIC0xKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSX0RJU0FCTEUodmFsKQliZmluX3dyaXRlX1RNUlM4X0RJU0FCTEUodmFsKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSX0VOQUJMRSh2YWwpCWJmaW5fd3JpdGVfVE1SUzhfRU5BQkxFKHZhbCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUl9TVEFUVVModmFsKQliZmluX3dyaXRlX1RNUlM4X1NUQVRVUyh2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUl9TVEFUVVMoKQliZmluX3JlYWRfVE1SUzhfU1RBVFVTKCkKKyNlbGlmIGRlZmluZWQoQ09ORklHX0JGNTR4KQorI2RlZmluZSBQUklPX0dQSU9ERU1VWChpcnEpCSgoaXJxKSA9PSBJUlFfUElOVDAgPyBDT05GSUdfSVJRX1BJTlQwIDogXAorCQkJCSAoaXJxKSA9PSBJUlFfUElOVDEgPyBDT05GSUdfSVJRX1BJTlQxIDogXAorCQkJCSAoaXJxKSA9PSBJUlFfUElOVDIgPyBDT05GSUdfSVJRX1BJTlQyIDogXAorCQkJCSAoaXJxKSA9PSBJUlFfUElOVDMgPyBDT05GSUdfSVJRX1BJTlQzIDogXAorCQkJCSAtMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUl9ESVNBQkxFKHZhbCkJYmZpbl93cml0ZV9USU1FUl9ESVNBQkxFMCh2YWwpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVJfRU5BQkxFKHZhbCkJYmZpbl93cml0ZV9USU1FUl9FTkFCTEUwKHZhbCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUl9TVEFUVVModmFsKQliZmluX3dyaXRlX1RJTUVSX1NUQVRVUzAodmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVJfU1RBVFVTKHZhbCkJYmZpbl9yZWFkX1RJTUVSX1NUQVRVUzAodmFsKQorI2Vsc2UKKyMgZXJyb3IgIm5vIFBSSU9fR1BJT0RFTVVYKCkgZm9yIHRoaXMgcGFydCIKKyNlbmRpZgorCisjZGVmaW5lIF9faXBpcGVfcm9vdF90aWNrX3AocmVncykJKChyZWdzLT5pcGVuZCAmIDB4MTApICE9IDApCisKKyNlbHNlIC8qICFDT05GSUdfSVBJUEUgKi8KKworI2RlZmluZSB0YXNrX2hpamFja2VkKHApCQkwCisjZGVmaW5lIGlwaXBlX3RyYXBfbm90aWZ5KHQsIHIpICAJMAorCisjZGVmaW5lIF9faXBpcGVfc3RhbGxfcm9vdF9yYXcoKQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIF9faXBpcGVfdW5zdGFsbF9yb290X3JhdygpCWRvIHsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBpcGlwZV9pbml0X2lycV90aHJlYWRzKCkJCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaXBpcGVfc3RhcnRfaXJxX3RocmVhZChpcnEsIGRlc2MpCTAKKworI2RlZmluZSBJUlFfU1lTVE1SCQlJUlFfQ09SRVRNUgorI2RlZmluZSBJUlFfUFJJT1RNUgkJSVJRX0NPUkVUTVIKKworI2RlZmluZSBfX2lwaXBlX3Jvb3RfdGlja19wKHJlZ3MpCTEKKworI2VuZGlmIC8qICFDT05GSUdfSVBJUEUgKi8KKworI2VuZGlmCS8qICFfX0FTTV9CTEFDS0ZJTl9JUElQRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2lwaXBlX2Jhc2UuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaXBpcGVfYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMTAyNWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2lwaXBlX2Jhc2UuaApAQCAtMCwwICsxLDgwIEBACisvKiAgIC0qLSBsaW51eC1jIC0qLQorICogICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9fYmFzZWlwaXBlLmgKKyAqCisgKiAgIENvcHlyaWdodCAoQykgMjAwNyBQaGlsaXBwZSBHZXJ1bS4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlIE1BIDAyMTM5LAorICogICBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisgKiAgIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fQVNNX0JMQUNLRklOX0lQSVBFX0JBU0VfSAorI2RlZmluZSBfX0FTTV9CTEFDS0ZJTl9JUElQRV9CQVNFX0gKKworI2lmZGVmIENPTkZJR19JUElQRQorCisjZGVmaW5lIElQSVBFX05SX1hJUlFTCQlOUl9JUlFTCisjZGVmaW5lIElQSVBFX0lSUV9JU0hJRlQJNQkvKiAyXjUgZm9yIDMyYml0cyBhcmNoLiAqLworCisvKiBCbGFja2Zpbi1zcGVjaWZpYywgZ2xvYmFsIGRvbWFpbiBmbGFncyAqLworI2RlZmluZSBJUElQRV9ST09UTE9DS19GTEFHCTEJLyogTG9jayBwaXBlbGluZSBmb3Igcm9vdCAqLworCisgLyogQmxhY2tmaW4gdHJhcHMgLS0gaS5lLiBleGNlcHRpb24gdmVjdG9yIG51bWJlcnMgKi8KKyNkZWZpbmUgSVBJUEVfTlJfRkFVTFRTCQk1MiAvKiBXZSBsZWF2ZSBhIGdhcCBhZnRlciBWRUNfSUxMX1JFUy4gKi8KKy8qIFBzZXVkby12ZWN0b3JzIHVzZWQgZm9yIGtlcm5lbCBldmVudHMgKi8KKyNkZWZpbmUgSVBJUEVfRklSU1RfRVZFTlQJSVBJUEVfTlJfRkFVTFRTCisjZGVmaW5lIElQSVBFX0VWRU5UX1NZU0NBTEwJKElQSVBFX0ZJUlNUX0VWRU5UKQorI2RlZmluZSBJUElQRV9FVkVOVF9TQ0hFRFVMRQkoSVBJUEVfRklSU1RfRVZFTlQgKyAxKQorI2RlZmluZSBJUElQRV9FVkVOVF9TSUdXQUtFCShJUElQRV9GSVJTVF9FVkVOVCArIDIpCisjZGVmaW5lIElQSVBFX0VWRU5UX1NFVFNDSEVECShJUElQRV9GSVJTVF9FVkVOVCArIDMpCisjZGVmaW5lIElQSVBFX0VWRU5UX0lOSVQJKElQSVBFX0ZJUlNUX0VWRU5UICsgNCkKKyNkZWZpbmUgSVBJUEVfRVZFTlRfRVhJVAkoSVBJUEVfRklSU1RfRVZFTlQgKyA1KQorI2RlZmluZSBJUElQRV9FVkVOVF9DTEVBTlVQCShJUElQRV9GSVJTVF9FVkVOVCArIDYpCisjZGVmaW5lIElQSVBFX0xBU1RfRVZFTlQJSVBJUEVfRVZFTlRfQ0xFQU5VUAorI2RlZmluZSBJUElQRV9OUl9FVkVOVFMJCShJUElQRV9MQVNUX0VWRU5UICsgMSkKKworI2RlZmluZSBJUElQRV9USU1FUl9JUlEJCUlSUV9DT1JFVE1SCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworZXh0ZXJuIGludCB0ZXN0X2JpdChpbnQgbnIsIGNvbnN0IHZvaWQgKmFkZHIpOworCisKK2V4dGVybiB1bnNpZ25lZCBsb25nIF9faXBpcGVfcm9vdF9zdGF0dXM7IC8qIEFsaWFzIHRvIGlwaXBlX3Jvb3RfY3B1ZG9tX3ZhcihzdGF0dXMpICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lwaXBlX3N0YWxsX3Jvb3Qodm9pZCkKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nICpwID0gJl9faXBpcGVfcm9vdF9zdGF0dXM7CisJc2V0X2JpdCgwLCBwKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9faXBpcGVfdGVzdF9hbmRfc3RhbGxfcm9vdCh2b2lkKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKnAgPSAmX19pcGlwZV9yb290X3N0YXR1czsKKwlyZXR1cm4gdGVzdF9hbmRfc2V0X2JpdCgwLCBwKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9faXBpcGVfdGVzdF9yb290KHZvaWQpCit7CisJY29uc3QgdW5zaWduZWQgbG9uZyAqcCA9ICZfX2lwaXBlX3Jvb3Rfc3RhdHVzOworCXJldHVybiB0ZXN0X2JpdCgwLCBwKTsKK30KKworI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KKworI2VuZGlmIC8qIENPTkZJR19JUElQRSAqLworCisjZW5kaWYgLyogIV9fQVNNX0JMQUNLRklOX0lQSVBFX0JBU0VfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9pcnEuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaXJxLmgKaW5kZXggODlmNTllMS4uM2Q5Nzc5MCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9pcnEuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2lycS5oCkBAIC0xNyw1NiArMTcsMjcyIEBACiAjaWZuZGVmIF9CRklOX0lSUV9IXwogI2RlZmluZSBfQkZJTl9JUlFfSF8KIAotI2luY2x1ZGUgPG1hY2gvaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqICAgSU5UUk9EVUNUSU9OICoqKioqKioqKioqCi0gKiAgIE9uIHRoZSBCbGFja2ZpbiwgdGhlIGludGVycnVwdCBzdHJ1Y3R1cmUgYWxsb3dzIHJlbW1hcHBpbmcgb2YgdGhlIGhhcmR3YXJlCi0gKiAgIGxldmVscy4KLSAqIC0gSSdtIGdvaW5nIHRvIGFzc3VtZSB0aGF0IHRoZSBIL1cgbGV2ZWwgaXMgZ29pbmcgdG8gc3RheSBhdCB0aGUgZGVmYXVsdAotICogICBzZXR0aW5ncy4gSWYgc29tZW9uZSB3YW50cyB0byBnbyB0aHJvdWdoIGFuZCBhYnN0YXJ0IHRoaXMgb3V0LCBmZWVsIGZyZWUKLSAqICAgdG8gbW9kIHRoZSBpbnRlcnJ1cHQgbnVtYmVyaW5nIHNjaGVtZS4KLSAqIC0gSSdtIGFic3RyYWN0aW5nIHRoZSBpbnRlcnJ1cHRzIHNvIHRoYXQgdUNsaW51eCBkb2VzIG5vdCBrbm93IGFueXRoaW5nCi0gKiAgIGFib3V0IHRoZSBIL1cgbGV2ZWxzLiBJZiB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlIEgvVyBBTkQga2VlcCB0aGUgYWJzdHJhY3RlZAotICogICBsZXZlbHMgdGhhdCB1Q2xpbnV4IHNlZXMsIHlvdSBzaG91bGQgYmUgYWJsZSB0byBkbyBtb3N0IG9mIGl0IGhlcmUuCi0gKiAtIEkndmUgbGVmdCB0aGUgImFic3RyYWN0IiBudW1iZXJpbmcgc3BhcmNlIGluIGNhc2Ugc29tZW9uZSB3YW50cyB0byBwdWxsIHRoZQotICogICBpbnRlcnJ1cHRzIGFwYXJ0IChqdXN0IHRoZSBUWC9SWCBmb3IgdGhlIHZhcmlvdXMgZGV2aWNlcykKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiAvKiBTWVNfSVJRUyBhbmQgTlJfSVJRUyBhcmUgZGVmaW5lZCBpbiA8bWFjaC1iZjV4eC9pcnEuaD4qLworI2luY2x1ZGUgPG1hY2gvaXJxLmg+CisjaW5jbHVkZSA8YXNtL3BkYS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworI2lmZGVmIENPTkZJR19TTVAKKy8qIEZvcndhcmQgZGVjbCBuZWVkZWQgZHVlIHRvIGNkZWYgaW50ZXIgZGVwZW5kZW5jaWVzICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IF9fcHVyZSBiZmluX2RzcGlkKHZvaWQpOworIyBkZWZpbmUgYmxhY2tmaW5fY29yZV9pZCgpIChiZmluX2RzcGlkKCkgJiAweGZmKQorIyBkZWZpbmUgYmZpbl9pcnFfZmxhZ3MgY3B1X3BkYVtibGFja2Zpbl9jb3JlX2lkKCldLmltYXNrCisjZWxzZQorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYmZpbl9pcnFfZmxhZ3M7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19JUElQRQorCisjaW5jbHVkZSA8bGludXgvaXBpcGVfdHJhY2UuaD4KKwordm9pZCBfX2lwaXBlX3Vuc3RhbGxfcm9vdCh2b2lkKTsKKwordm9pZCBfX2lwaXBlX3Jlc3RvcmVfcm9vdCh1bnNpZ25lZCBsb25nIGZsYWdzKTsKKworI2lmZGVmIENPTkZJR19ERUJVR19IV0VSUgorIyBkZWZpbmUgX19hbGxfbWFza2VkX2lycV9mbGFncyAweDNmCisjIGRlZmluZSBfX3NhdmVfYW5kX2NsaV9odyh4KSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIFwKKwkJImNsaSAlMDsiIFwKKwkJInN0aSAlMTsiIFwKKwkJOiAiPSZkIih4KSBcCisJCTogImQiICgweDNGKSBcCisJKQorI2Vsc2UKKyMgZGVmaW5lIF9fYWxsX21hc2tlZF9pcnFfZmxhZ3MgMHgxZgorIyBkZWZpbmUgX19zYXZlX2FuZF9jbGlfaHcoeCkgXAorCV9fYXNtX18gX192b2xhdGlsZV9fKCBcCisJCSJjbGkgJTA7IiBcCisJCTogIj0mZCIoeCkgXAorCSkKKyNlbmRpZgorCisjZGVmaW5lIGlycXNfZW5hYmxlZF9mcm9tX2ZsYWdzX2h3KHgpCSgoeCkgIT0gX19hbGxfbWFza2VkX2lycV9mbGFncykKKyNkZWZpbmUgcmF3X2lycXNfZGlzYWJsZWRfZmxhZ3MoZmxhZ3MpCSghaXJxc19lbmFibGVkX2Zyb21fZmxhZ3NfaHcoZmxhZ3MpKQorI2RlZmluZSBsb2NhbF90ZXN0X2lmbGFnX2h3KHgpCQlpcnFzX2VuYWJsZWRfZnJvbV9mbGFnc19odyh4KQorCisjZGVmaW5lIGxvY2FsX3NhdmVfZmxhZ3MoeCkJCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQkoeCkgPSBfX2lwaXBlX3Rlc3Rfcm9vdCgpID8gXAorCQkJX19hbGxfbWFza2VkX2lycV9mbGFncyA6IGJmaW5faXJxX2ZsYWdzOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBsb2NhbF9pcnFfc2F2ZSh4KQkJCQlcCisJZG8gewkJCQkJCVwKKwkJKHgpID0gX19pcGlwZV90ZXN0X2FuZF9zdGFsbF9yb290KCk7CVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIGxvY2FsX2lycV9yZXN0b3JlKHgpCV9faXBpcGVfcmVzdG9yZV9yb290KHgpCisjZGVmaW5lIGxvY2FsX2lycV9kaXNhYmxlKCkJX19pcGlwZV9zdGFsbF9yb290KCkKKyNkZWZpbmUgbG9jYWxfaXJxX2VuYWJsZSgpCV9faXBpcGVfdW5zdGFsbF9yb290KCkKKyNkZWZpbmUgaXJxc19kaXNhYmxlZCgpCQlfX2lwaXBlX3Rlc3Rfcm9vdCgpCisKKyNkZWZpbmUgbG9jYWxfc2F2ZV9mbGFnc19odyh4KSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIFwKKwkJImNsaSAlMDsiIFwKKwkJInN0aSAlMDsiIFwKKwkJOiAiPWQiKHgpIFwKKwkpCisKKyNkZWZpbmUJaXJxc19kaXNhYmxlZF9odygpCQkJCVwKKwkoewkJCQkJCVwKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsJCQlcCisJCWxvY2FsX3NhdmVfZmxhZ3NfaHcoZmxhZ3MpOwkJXAorCQkhaXJxc19lbmFibGVkX2Zyb21fZmxhZ3NfaHcoZmxhZ3MpOwlcCisJfSkKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHJhd19tYW5nbGVfaXJxX2JpdHMoaW50IHZpcnQsIHVuc2lnbmVkIGxvbmcgcmVhbCkKK3sKKwkvKiBNZXJnZSB2aXJ0dWFsIGFuZCByZWFsIGludGVycnVwdCBtYXNrIGJpdHMgaW50byBhIHNpbmdsZQorCSAgIDMyYml0IHdvcmQuICovCisJcmV0dXJuIChyZWFsICYgfigxIDw8IDMxKSkgfCAoKHZpcnQgIT0gMCkgPDwgMzEpOworfQorCitzdGF0aWMgaW5saW5lIGludCByYXdfZGVtYW5nbGVfaXJxX2JpdHModW5zaWduZWQgbG9uZyAqeCkKK3sKKwlpbnQgdmlydCA9ICgqeCAmICgxIDw8IDMxKSkgIT0gMDsKKwkqeCAmPSB+KDFMIDw8IDMxKTsKKwlyZXR1cm4gdmlydDsKK30KKworI2lmZGVmIENPTkZJR19JUElQRV9UUkFDRV9JUlFTT0ZGCisKKyNkZWZpbmUgbG9jYWxfaXJxX2Rpc2FibGVfaHcoKQkJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWludCBfdG1wX2R1bW15OwkJCQkJCVwKKwkJaWYgKCFpcnFzX2Rpc2FibGVkX2h3KCkpCQkJCVwKKwkJCWlwaXBlX3RyYWNlX2JlZ2luKDB4ODAwMDAwMDApOwkJCVwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjbGkgJTA7IiA6ICI9ZCIgKF90bXBfZHVtbXkpIDogKTsJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgbG9jYWxfaXJxX2VuYWJsZV9odygpCQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJaWYgKGlycXNfZGlzYWJsZWRfaHcoKSkJCQkJCVwKKwkJCWlwaXBlX3RyYWNlX2VuZCgweDgwMDAwMDAwKTsJCQlcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgic3RpICUwOyIgOiA6ICJkIihiZmluX2lycV9mbGFncykpOwlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBsb2NhbF9pcnFfc2F2ZV9odyh4KQkJCQlcCisJZG8gewkJCQkJCVwKKwkJX19zYXZlX2FuZF9jbGlfaHcoeCk7CQkJXAorCQlpZiAobG9jYWxfdGVzdF9pZmxhZ19odyh4KSkJCVwKKwkJCWlwaXBlX3RyYWNlX2JlZ2luKDB4ODAwMDAwMDEpOwlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBsb2NhbF9pcnFfcmVzdG9yZV9odyh4KQkJCQlcCisJZG8gewkJCQkJCVwKKwkJaWYgKGxvY2FsX3Rlc3RfaWZsYWdfaHcoeCkpIHsJCVwKKwkJCWlwaXBlX3RyYWNlX2VuZCgweDgwMDAwMDAxKTsJXAorCQkJbG9jYWxfaXJxX2VuYWJsZV9od19ub3RyYWNlKCk7CVwKKwkJfQkJCQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgbG9jYWxfaXJxX2Rpc2FibGVfaHdfbm90cmFjZSgpCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlpbnQgX3RtcF9kdW1teTsJCQkJCQlcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgiY2xpICUwOyIgOiAiPWQiIChfdG1wX2R1bW15KSA6ICk7CVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIGxvY2FsX2lycV9lbmFibGVfaHdfbm90cmFjZSgpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyggXAorCQkic3RpICUwOyIgXAorCQk6IFwKKwkJOiAiZCIoYmZpbl9pcnFfZmxhZ3MpIFwKKwkpCisKKyNkZWZpbmUgbG9jYWxfaXJxX3NhdmVfaHdfbm90cmFjZSh4KSBfX3NhdmVfYW5kX2NsaV9odyh4KQorCisjZGVmaW5lIGxvY2FsX2lycV9yZXN0b3JlX2h3X25vdHJhY2UoeCkJCQlcCisJZG8gewkJCQkJCVwKKwkJaWYgKGxvY2FsX3Rlc3RfaWZsYWdfaHcoeCkpCQlcCisJCQlsb2NhbF9pcnFfZW5hYmxlX2h3X25vdHJhY2UoKTsJXAorCX0gd2hpbGUgKDApCisKKyNlbHNlIC8qIENPTkZJR19JUElQRV9UUkFDRV9JUlFTT0ZGICovCisKKyNkZWZpbmUgbG9jYWxfaXJxX2VuYWJsZV9odygpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyggXAorCQkic3RpICUwOyIgXAorCQk6IFwKKwkJOiAiZCIoYmZpbl9pcnFfZmxhZ3MpIFwKKwkpCisKKyNkZWZpbmUgbG9jYWxfaXJxX2Rpc2FibGVfaHcoKQkJCVwKKwlkbyB7CQkJCQlcCisJCWludCBfdG1wX2R1bW15OwkJCVwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKAkJXAorCQkJImNsaSAlMDsiCQlcCisJCQk6ICI9ZCIgKF90bXBfZHVtbXkpKTsJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgbG9jYWxfaXJxX3Jlc3RvcmVfaHcoeCkgXAorCWRvIHsgXAorCQlpZiAoaXJxc19lbmFibGVkX2Zyb21fZmxhZ3NfaHcoeCkpIFwKKwkJCWxvY2FsX2lycV9lbmFibGVfaHcoKTsgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgbG9jYWxfaXJxX3NhdmVfaHcoeCkJCV9fc2F2ZV9hbmRfY2xpX2h3KHgpCisKKyNkZWZpbmUgbG9jYWxfaXJxX2Rpc2FibGVfaHdfbm90cmFjZSgpCWxvY2FsX2lycV9kaXNhYmxlX2h3KCkKKyNkZWZpbmUgbG9jYWxfaXJxX2VuYWJsZV9od19ub3RyYWNlKCkJbG9jYWxfaXJxX2VuYWJsZV9odygpCisjZGVmaW5lIGxvY2FsX2lycV9zYXZlX2h3X25vdHJhY2UoeCkJbG9jYWxfaXJxX3NhdmVfaHcoeCkKKyNkZWZpbmUgbG9jYWxfaXJxX3Jlc3RvcmVfaHdfbm90cmFjZSh4KQlsb2NhbF9pcnFfcmVzdG9yZV9odyh4KQorCisjZW5kaWYgIC8qIENPTkZJR19JUElQRV9UUkFDRV9JUlFTT0ZGICovCisKKyNlbHNlIC8qICFDT05GSUdfSVBJUEUgKi8KIAogLyoKLSAqIE1hY2hpbmUgc3BlY2lmaWMgaW50ZXJydXB0IHNvdXJjZXMuCi0gKgotICogQWRkaW5nIGFuIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgZm9yIGEgc291cmNlIHdpdGggdGhpcyBiaXQKLSAqIHNldCBpbmRpY2F0ZXMgYSBzcGVjaWFsIG1hY2hpbmUgc3BlY2lmaWMgaW50ZXJydXB0IHNvdXJjZS4KLSAqIFRoZSBtYWNoaW5lIHNwZWNpZmljIGZpbGVzIGRlZmluZSB0aGVzZSBzb3VyY2VzLgotICoKLSAqIFRoZSBJUlFfTUFDSFNQRUMgYml0IGlzIG5vdyBnb25lIC0gdGhlIG9ubHkgdGhpbmcgaXQgZGlkIHdhcyB0bwotICogaW50cm9kdWNlIHVubmVjZXNzYXJ5IG92ZXJoZWFkLgotICoKLSAqIEFsbCBpbnRlcnJ1cHQgaGFuZGxpbmcgaXMgYWN0dWFsbHkgbWFjaGluZSBzcGVjaWZpYyBzbyBpdCBpcyBiZXR0ZXIKLSAqIHRvIHVzZSBmdW5jdGlvbiBwb2ludGVycywgYXMgdXNlZCBieSB0aGUgU3BhcmMgcG9ydCwgYW5kIHNlbGVjdCB0aGUKLSAqIGludGVycnVwdCBoYW5kbGluZyBmdW5jdGlvbnMgd2hlbiBpbml0aWFsaXppbmcgdGhlIGtlcm5lbC4gVGhpcyB3YXkKLSAqIHdlIHNhdmUgc29tZSB1bm5lY2Vzc2FyeSBvdmVyaGVhZCBhdCBydW4tdGltZS4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDEvMTEvOTcgLSBKZXMKKyAqIEludGVycnVwdCBjb25maWd1cmluZyBtYWNyb3MuCiAgKi8KKyNkZWZpbmUgbG9jYWxfaXJxX2Rpc2FibGUoKSBcCisJZG8geyBcCisJCWludCBfX3RtcF9kdW1teTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyggXAorCQkJImNsaSAlMDsiIFwKKwkJCTogIj1kIiAoX190bXBfZHVtbXkpIFwKKwkJKTsgXAorCX0gd2hpbGUgKDApCiAKLWV4dGVybiB2b2lkIGFja19iYWRfaXJxKHVuc2lnbmVkIGludCBpcnEpOworI2RlZmluZSBsb2NhbF9pcnFfZW5hYmxlKCkgXAorCV9fYXNtX18gX192b2xhdGlsZV9fKCBcCisJCSJzdGkgJTA7IiBcCisJCTogXAorCQk6ICJkIiAoYmZpbl9pcnFfZmxhZ3MpIFwKKwkpCiAKLXN0YXRpYyBfX2lubGluZV9fIGludCBpcnFfY2Fub25pY2FsaXplKGludCBpcnEpCisjaWZkZWYgQ09ORklHX0RFQlVHX0hXRVJSCisjIGRlZmluZSBfX3NhdmVfYW5kX2NsaSh4KSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIFwKKwkJImNsaSAlMDsiIFwKKwkJInN0aSAlMTsiIFwKKwkJOiAiPSZkIiAoeCkgXAorCQk6ICJkIiAoMHgzRikgXAorCSkKKyNlbHNlCisjIGRlZmluZSBfX3NhdmVfYW5kX2NsaSh4KSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIFwKKwkJImNsaSAlMDsiIFwKKwkJOiAiPSZkIiAoeCkgXAorCSkKKyNlbmRpZgorCisjZGVmaW5lIGxvY2FsX3NhdmVfZmxhZ3MoeCkgXAorCV9fYXNtX18gX192b2xhdGlsZV9fKCBcCisJCSJjbGkgJTA7IiBcCisJCSJzdGkgJTA7IiBcCisJCTogIj1kIiAoeCkgXAorCSkKKworI2lmZGVmIENPTkZJR19ERUJVR19IV0VSUgorI2RlZmluZSBpcnFzX2VuYWJsZWRfZnJvbV9mbGFncyh4KSAoKCh4KSAmIH4weDNmKSAhPSAwKQorI2Vsc2UKKyNkZWZpbmUgaXJxc19lbmFibGVkX2Zyb21fZmxhZ3MoeCkgKCh4KSAhPSAweDFmKQorI2VuZGlmCisKKyNkZWZpbmUgbG9jYWxfaXJxX3Jlc3RvcmUoeCkgXAorCWRvIHsgXAorCQlpZiAoaXJxc19lbmFibGVkX2Zyb21fZmxhZ3MoeCkpIFwKKwkJCWxvY2FsX2lycV9lbmFibGUoKTsgXAorCX0gd2hpbGUgKDApCisKKy8qIEZvciBzcGlubG9ja3MgZXRjICovCisjZGVmaW5lIGxvY2FsX2lycV9zYXZlKHgpIF9fc2F2ZV9hbmRfY2xpKHgpCisKKyNkZWZpbmUgaXJxc19kaXNhYmxlZCgpCQkJCVwKKyh7CQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CQkJXAorCWxvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpOwkJXAorCSFpcnFzX2VuYWJsZWRfZnJvbV9mbGFncyhmbGFncyk7CVwKK30pCisKKyNkZWZpbmUgbG9jYWxfaXJxX3NhdmVfaHcoeCkJCWxvY2FsX2lycV9zYXZlKHgpCisjZGVmaW5lIGxvY2FsX2lycV9yZXN0b3JlX2h3KHgpCQlsb2NhbF9pcnFfcmVzdG9yZSh4KQorI2RlZmluZSBsb2NhbF9pcnFfZW5hYmxlX2h3KCkJCWxvY2FsX2lycV9lbmFibGUoKQorI2RlZmluZSBsb2NhbF9pcnFfZGlzYWJsZV9odygpCQlsb2NhbF9pcnFfZGlzYWJsZSgpCisjZGVmaW5lIGlycXNfZGlzYWJsZWRfaHcoKQkJaXJxc19kaXNhYmxlZCgpCisKKyNlbmRpZiAvKiAhQ09ORklHX0lQSVBFICovCisKKyNpZiBBTk9NQUxZXzA1MDAwMjQ0ICYmIGRlZmluZWQoQ09ORklHX0JGSU5fSUNBQ0hFKQorIyBkZWZpbmUgTk9QX1BBRF9BTk9NQUxZXzA1MDAwMjQ0ICJub3A7IG5vcDsiCisjZWxzZQorIyBkZWZpbmUgTk9QX1BBRF9BTk9NQUxZXzA1MDAwMjQ0CisjZW5kaWYKKworI2RlZmluZSBpZGxlX3dpdGhfaXJxX2Rpc2FibGVkKCkgXAorCV9fYXNtX18gX192b2xhdGlsZV9fKCBcCisJCU5PUF9QQURfQU5PTUFMWV8wNTAwMDI0NCBcCisJCSIuYWxpZ24gODsiIFwKKwkJInN0aSAlMDsiIFwKKwkJImlkbGU7IiBcCisJCTogXAorCQk6ICJkIiAoYmZpbl9pcnFfZmxhZ3MpIFwKKwkpCisKK3N0YXRpYyBpbmxpbmUgaW50IGlycV9jYW5vbmljYWxpemUoaW50IGlycSkKIHsKIAlyZXR1cm4gaXJxOwogfQogCi0vKiBjb3VudCBvZiBzcHVyaW91cyBpbnRlcnJ1cHRzICovCi0vKiBleHRlcm4gdm9sYXRpbGUgdW5zaWduZWQgaW50IG51bV9zcHVyaW91czsgKi8KLQotI2lmbmRlZiBOT19JUlEKLSNkZWZpbmUgTk9fSVJRICgodW5zaWduZWQgaW50KSgtMSkpCi0jZW5kaWYKLQotI2RlZmluZSBTSUNfU1lTSVJRKGlycSkJKGlycSAtIChJUlFfQ09SRVRNUiArIDEpKQotCiAjZW5kaWYJCQkJLyogX0JGSU5fSVJRX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2wxbGF5b3V0LmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2wxbGF5b3V0LmgKaW5kZXggYzEzZGVkNy4uNzlkYmVmYWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbDFsYXlvdXQuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2wxbGF5b3V0LmgKQEAgLTgsNiArOCw3IEBACiAKICNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KIAorI2lmbmRlZiBDT05GSUdfU01QCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCiAvKiBEYXRhIHRoYXQgaXMgIm1hcHBlZCIgaW50byB0aGUgcHJvY2VzcyBWTSBhdCB0aGUgc3RhcnQgb2YgdGhlIEwxIHNjcmF0Y2gKQEAgLTI0LDggKzI1LDEwIEBACiB9OwogCiAvKiBBIHBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSBpbiBtZW1vcnkuICAqLwotI2RlZmluZSBMMV9TQ1JBVENIX1RBU0tfSU5GTyAoKHN0cnVjdCBsMV9zY3JhdGNoX3Rhc2tfaW5mbyAqKUwxX1NDUkFUQ0hfU1RBUlQpCisjZGVmaW5lIEwxX1NDUkFUQ0hfVEFTS19JTkZPICgoc3RydWN0IGwxX3NjcmF0Y2hfdGFza19pbmZvICopXAorCQkJCQkJZ2V0X2wxX3NjcmF0Y2hfc3RhcnQoKSkKIAogI2VuZGlmCisjZW5kaWYKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL21lbV9pbml0LmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL21lbV9pbml0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU1YTkzMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbWVtX2luaXQuaApAQCAtMCwwICsxLDM2NCBAQAorLyoKKyAqIGFyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbWVtX2luaXQuaCAtIHJlcHJvZ3JhbSBjbG9ja3MgLyBtZW1vcnkKKyAqCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2lmIGRlZmluZWQoRUJJVV9TREdDVEwpCisjaWYgZGVmaW5lZChDT05GSUdfTUVNX01UNDhMQzE2TTE2QTJUR183NSkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX01FTV9NVDQ4TEM2NE00QTJGQl83RSkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX01FTV9NVDQ4TEMxNk04QTJUR183NSkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX01FTV9HRU5FUklDX0JPQVJEKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfTUVNX01UNDhMQzMyTThBMl83NSkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX01FTV9NVDQ4TEM4TTMyQjJCNV83KSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfTUVNX01UNDhMQzMyTTE2QTJUR183NSkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX01FTV9NVDQ4TEMzMk04QTJfNzUpCisjaWYgKENPTkZJR19TQ0xLX0haID4gMTE5NDAyOTg1KQorI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzIKKyNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDIKKyNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfNworI2RlZmluZSBTRFJBTV90UkFTX251bSAgNworI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8yCisjZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgorI2VuZGlmCisjaWYgKENPTkZJR19TQ0xLX0haID4gMTA0NDc3NjEyKSAmJiAoQ09ORklHX1NDTEtfSFogPD0gMTE5NDAyOTg1KQorI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzIKKyNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDIKKyNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfNgorI2RlZmluZSBTRFJBTV90UkFTX251bSAgNgorI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8yCisjZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgorI2VuZGlmCisjaWYgKENPTkZJR19TQ0xLX0haID4gODk1NTIyMzkpICYmIChDT05GSUdfU0NMS19IWiA8PSAxMDQ0Nzc2MTIpCisjZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMgorI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMgorI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU181CisjZGVmaW5lIFNEUkFNX3RSQVNfbnVtICA1CisjZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzIKKyNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCisjZW5kaWYKKyNpZiAoQ09ORklHX1NDTEtfSFogPiA3NDYyNjg2NikgJiYgKENPTkZJR19TQ0xLX0haIDw9IDg5NTUyMjM5KQorI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzIKKyNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDIKKyNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfNAorI2RlZmluZSBTRFJBTV90UkFTX251bSAgNAorI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8yCisjZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgorI2VuZGlmCisjaWYgKENPTkZJR19TQ0xLX0haID4gNjY2NjY2NjcpICYmIChDT05GSUdfU0NMS19IWiA8PSA3NDYyNjg2NikKKyNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8yCisjZGVmaW5lIFNEUkFNX3RSUF9udW0gICAyCisjZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzMKKyNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDMKKyNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMgorI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKKyNlbmRpZgorI2lmIChDT05GSUdfU0NMS19IWiA+IDU5NzAxNDkzKSAmJiAoQ09ORklHX1NDTEtfSFogPD0gNjY2NjY2NjcpCisjZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMQorI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMQorI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU180CisjZGVmaW5lIFNEUkFNX3RSQVNfbnVtICAzCisjZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzEKKyNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCisjZW5kaWYKKyNpZiAoQ09ORklHX1NDTEtfSFogPiA0NDc3NjExOSkgJiYgKENPTkZJR19TQ0xLX0haIDw9IDU5NzAxNDkzKQorI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzEKKyNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDEKKyNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfMworI2RlZmluZSBTRFJBTV90UkFTX251bSAgMworI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8xCisjZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgorI2VuZGlmCisjaWYgKENPTkZJR19TQ0xLX0haID4gMjk4NTA3NDYpICYmIChDT05GSUdfU0NMS19IWiA8PSA0NDc3NjExOSkKKyNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8xCisjZGVmaW5lIFNEUkFNX3RSUF9udW0gICAxCisjZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzIKKyNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDIKKyNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMQorI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKKyNlbmRpZgorI2lmIChDT05GSUdfU0NMS19IWiA8PSAyOTg1MDc0NikKKyNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8xCisjZGVmaW5lIFNEUkFNX3RSUF9udW0gICAxCisjZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzEKKyNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDEKKyNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMQorI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19NRU1fTVQ0OExDMTZNOEEyVEdfNzUpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19NRU1fTVQ0OExDOE0zMkIyQjVfNykKKyAgLypTRFJBTSBJTkZPUk1BVElPTjogKi8KKyNkZWZpbmUgU0RSQU1fVHJlZiAgNjQJCS8qIFJlZnJlc2ggcGVyaW9kIGluIG1pbGxpc2Vjb25kcyAgICovCisjZGVmaW5lIFNEUkFNX05SQSAgIDQwOTYJLyogTnVtYmVyIG9mIHJvdyBhZGRyZXNzZXMgaW4gU0RSQU0gKi8KKyNkZWZpbmUgU0RSQU1fQ0wgICAgQ0xfMworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19NRU1fTVQ0OExDMzJNOEEyXzc1KSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfTUVNX01UNDhMQzY0TTRBMkZCXzdFKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfTUVNX0dFTkVSSUNfQk9BUkQpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19NRU1fTVQ0OExDMzJNMTZBMlRHXzc1KSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfTUVNX01UNDhMQzE2TTE2QTJUR183NSkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX01FTV9NVDQ4TEMzMk04QTJfNzUpCisgIC8qU0RSQU0gSU5GT1JNQVRJT046ICovCisjZGVmaW5lIFNEUkFNX1RyZWYgIDY0CQkvKiBSZWZyZXNoIHBlcmlvZCBpbiBtaWxsaXNlY29uZHMgICAqLworI2RlZmluZSBTRFJBTV9OUkEgICA4MTkyCS8qIE51bWJlciBvZiByb3cgYWRkcmVzc2VzIGluIFNEUkFNICovCisjZGVmaW5lIFNEUkFNX0NMICAgIENMXzMKKyNlbmRpZgorCisKKyNpZmRlZiBDT05GSUdfQkZJTl9LRVJORUxfQ0xPQ0tfTUVNSU5JVF9DQUxDCisvKiBFcXVhdGlvbiBmcm9tIHNlY3Rpb24gMTcgKHAxNy00Nikgb2YgQkY1MzMgSFJNICovCisjZGVmaW5lIG1lbV9TRFJSQyAgICAgICAoKChDT05GSUdfU0NMS19IWiAvIDEwMDApICogU0RSQU1fVHJlZikgLyBTRFJBTV9OUkEpIC0gKFNEUkFNX3RSQVNfbnVtICsgU0RSQU1fdFJQX251bSkKKworLyogRW5hYmxlIFNDTEsgT3V0ICovCisjZGVmaW5lIG1lbV9TREdDVEwgICAgICAgICgweDgwMDAwMDAwIHwgU0NUTEUgfCBTRFJBTV9DTCB8IFNEUkFNX3RSQVMgfCBTRFJBTV90UlAgfCBTRFJBTV90UkNEIHwgU0RSQU1fdFdSIHwgUFNTKQorI2Vsc2UKKyNkZWZpbmUgbWVtX1NEUlJDIAlDT05GSUdfTUVNX1NEUlJDCisjZGVmaW5lIG1lbV9TREdDVEwJQ09ORklHX01FTV9TREdDVEwKKyNlbmRpZgorI2VuZGlmCisKKworI2lmIGRlZmluZWQoRUJJVV9ERFJDVEwwKQorI2RlZmluZSBNSU5fRERSX1NDTEsoeCkJKHgqKENPTkZJR19TQ0xLX0haLzEwMDAvMTAwMCkvMTAwMCArIDEpCisjZGVmaW5lIE1BWF9ERFJfU0NMSyh4KQkoeCooQ09ORklHX1NDTEtfSFovMTAwMC8xMDAwKS8xMDAwKQorI2RlZmluZSBERFJfQ0xLX0haKHgpCSgxMDAwKjEwMDAqMTAwMC94KQorCisjaWYgZGVmaW5lZChDT05GSUdfTUVNX01UNDZWMzJNMTZfNlQpCisjZGVmaW5lIEREUl9TSVpFCURFVlNaXzUxMgorI2RlZmluZSBERFJfV0lEVEgJREVWV0RfMTYKKyNkZWZpbmUgRERSX01BWF90Q0sJMTMKKworI2RlZmluZSBERFJfdFJDCQlERFJfVFJDKE1JTl9ERFJfU0NMSyg2MCkpCisjZGVmaW5lIEREUl90UkFTCUREUl9UUkFTKE1JTl9ERFJfU0NMSyg0MikpCisjZGVmaW5lIEREUl90UlAJCUREUl9UUlAoTUlOX0REUl9TQ0xLKDE1KSkKKyNkZWZpbmUgRERSX3RSRkMJRERSX1RSRkMoTUlOX0REUl9TQ0xLKDcyKSkKKyNkZWZpbmUgRERSX3RSRUZJCUREUl9UUkVGSShNQVhfRERSX1NDTEsoNzgwMCkpCisKKyNkZWZpbmUgRERSX3RSQ0QJRERSX1RSQ0QoTUlOX0REUl9TQ0xLKDE1KSkKKyNkZWZpbmUgRERSX3RXVFIJRERSX1RXVFIoMSkKKyNkZWZpbmUgRERSX3RNUkQJRERSX1RNUkQoTUlOX0REUl9TQ0xLKDEyKSkKKyNkZWZpbmUgRERSX3RXUgkJRERSX1RXUihNSU5fRERSX1NDTEsoMTUpKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19NRU1fTVQ0NlYzMk0xNl81QikKKyNkZWZpbmUgRERSX1NJWkUJREVWU1pfNTEyCisjZGVmaW5lIEREUl9XSURUSAlERVZXRF8xNgorI2RlZmluZSBERFJfTUFYX3RDSwkxMworCisjZGVmaW5lIEREUl90UkMJCUREUl9UUkMoTUlOX0REUl9TQ0xLKDU1KSkKKyNkZWZpbmUgRERSX3RSQVMJRERSX1RSQVMoTUlOX0REUl9TQ0xLKDQwKSkKKyNkZWZpbmUgRERSX3RSUAkJRERSX1RSUChNSU5fRERSX1NDTEsoMTUpKQorI2RlZmluZSBERFJfdFJGQwlERFJfVFJGQyhNSU5fRERSX1NDTEsoNzApKQorI2RlZmluZSBERFJfdFJFRkkJRERSX1RSRUZJKE1BWF9ERFJfU0NMSyg3ODAwKSkKKworI2RlZmluZSBERFJfdFJDRAlERFJfVFJDRChNSU5fRERSX1NDTEsoMTUpKQorI2RlZmluZSBERFJfdFdUUglERFJfVFdUUigyKQorI2RlZmluZSBERFJfdE1SRAlERFJfVE1SRChNSU5fRERSX1NDTEsoMTApKQorI2RlZmluZSBERFJfdFdSCQlERFJfVFdSKE1JTl9ERFJfU0NMSygxNSkpCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX01FTV9HRU5FUklDX0JPQVJEKQorI2RlZmluZSBERFJfU0laRQlERVZTWl81MTIKKyNkZWZpbmUgRERSX1dJRFRICURFVldEXzE2CisjZGVmaW5lIEREUl9NQVhfdENLCTEzCisKKyNkZWZpbmUgRERSX3RSQ0QJRERSX1RSQ0QoMykKKyNkZWZpbmUgRERSX3RXVFIJRERSX1RXVFIoMikKKyNkZWZpbmUgRERSX3RXUgkJRERSX1RXUigyKQorI2RlZmluZSBERFJfdE1SRAlERFJfVE1SRCgyKQorI2RlZmluZSBERFJfdFJQCQlERFJfVFJQKDMpCisjZGVmaW5lIEREUl90UkFTCUREUl9UUkFTKDcpCisjZGVmaW5lIEREUl90UkMJCUREUl9UUkMoMTApCisjZGVmaW5lIEREUl90UkZDCUREUl9UUkZDKDEyKQorI2RlZmluZSBERFJfdFJFRkkJRERSX1RSRUZJKDEyODgpCisjZW5kaWYKKworI2lmIChDT05GSUdfU0NMS19IWiA8IEREUl9DTEtfSFooRERSX01BWF90Q0spKQorIyBlcnJvciAiQ09ORklHX1NDTEtfSFogaXMgdG9vIHNtYWxsICg8RERSX0NMS19IWihERFJfTUFYX3RDSykgSHopLiIKKyNlbGlmKENPTkZJR19TQ0xLX0haIDw9IDEzMzMzMzMzMykKKyMgZGVmaW5lCUREUl9DTAkJQ0xfMgorI2Vsc2UKKyMgZXJyb3IgIkNPTkZJR19TQ0xLX0haIGlzIHRvbyBsYXJnZSAoPjEzMzMzMzMzMyBIeikuIgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQkZJTl9LRVJORUxfQ0xPQ0tfTUVNSU5JVF9DQUxDCisjZGVmaW5lIG1lbV9ERFJDVEwwCShERFJfdFJQIHwgRERSX3RSQVMgfCBERFJfdFJDIHwgRERSX3RSRkMgfCBERFJfdFJFRkkpCisjZGVmaW5lIG1lbV9ERFJDVEwxCShERFJfREFUV0lEVEggfCBFWFRCQU5LXzEgfCBERFJfU0laRSB8IEREUl9XSURUSCB8IEREUl90V1RSIFwKKwkJCXwgRERSX3RNUkQgfCBERFJfdFdSIHwgRERSX3RSQ0QpCisjZGVmaW5lIG1lbV9ERFJDVEwyCUREUl9DTAorI2Vsc2UKKyNkZWZpbmUgbWVtX0REUkNUTDAJQ09ORklHX01FTV9ERFJDVEwwCisjZGVmaW5lIG1lbV9ERFJDVEwxCUNPTkZJR19NRU1fRERSQ1RMMQorI2RlZmluZSBtZW1fRERSQ1RMMglDT05GSUdfTUVNX0REUkNUTDIKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIENPTkZJR19DTEtJTl9IQUxGCisjZGVmaW5lIENMS0lOX0hBTEYgICAgICAgMQorI2Vsc2UKKyNkZWZpbmUgQ0xLSU5fSEFMRiAgICAgICAwCisjZW5kaWYKKworI2lmIGRlZmluZWQgQ09ORklHX1BMTF9CWVBBU1MKKyNkZWZpbmUgUExMX0JZUEFTUyAgICAgIDEKKyNlbHNlCisjZGVmaW5lIFBMTF9CWVBBU1MgICAgICAgMAorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipDdXJyZW50bHkgTm90IEJlaW5nIFVzZWQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgZGVmaW5lZChDT05GSUdfRkxBU0hfU1BFRURfQldBVCkgJiYgXAorZGVmaW5lZChDT05GSUdfRkxBU0hfU1BFRURfQlJBVCkgJiYgXAorZGVmaW5lZChDT05GSUdfRkxBU0hfU1BFRURfQkhUKSAmJiBcCitkZWZpbmVkKENPTkZJR19GTEFTSF9TUEVFRF9CU1QpICYmIFwKK2RlZmluZWQoQ09ORklHX0ZMQVNIX1NQRUVEX0JUVCkKKworI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTF9XQVQgICgoQ09ORklHX0ZMQVNIX1NQRUVEX0JXQVQgKiA0KSAvICg0MDAwMDAwMDAwIC8gQ09ORklHX1NDTEtfSFopKSArIDEKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVExfUkFUICAoKENPTkZJR19GTEFTSF9TUEVFRF9CUkFUICogNCkgLyAoNDAwMDAwMDAwMCAvIENPTkZJR19TQ0xLX0haKSkgKyAxCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMX0hUICAgKChDT05GSUdfRkxBU0hfU1BFRURfQkhUICAqIDQpIC8gKDQwMDAwMDAwMDAgLyBDT05GSUdfU0NMS19IWikpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMX1NUICAgKChDT05GSUdfRkxBU0hfU1BFRURfQlNUICAqIDQpIC8gKDQwMDAwMDAwMDAgLyBDT05GSUdfU0NMS19IWikpICsgMQorI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTF9UVCAgICgoQ09ORklHX0ZMQVNIX1NQRUVEX0JUVCAgKiA0KSAvICg0MDAwMDAwMDAwIC8gQ09ORklHX1NDTEtfSFopKSArIDEKKworI2lmIChmbGFzaF9FQklVX0FNQkNUTF9UVCA+IDMpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9UVCAgIEIwVFRfNAorI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1RUID09IDMpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9UVCAgIEIwVFRfMworI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1RUID09IDIpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9UVCAgIEIwVFRfMgorI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1RUIDwgMikKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1RUICAgQjBUVF8xCisjZW5kaWYKKworI2lmIChmbGFzaF9FQklVX0FNQkNUTF9TVCA+IDMpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9TVCAgIEIwU1RfNAorI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1NUID09IDMpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9TVCAgIEIwU1RfMworI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1NUID09IDIpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9TVCAgIEIwU1RfMgorI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1NUIDwgMikKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1NUICAgQjBTVF8xCisjZW5kaWYKKworI2lmIChmbGFzaF9FQklVX0FNQkNUTF9IVCA+IDIpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9IVCAgIEIwSFRfMworI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX0hUID09IDIpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9IVCAgIEIwSFRfMgorI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX0hUID09IDEpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9IVCAgIEIwSFRfMQorI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX0hUID09IDAgJiYgQ09ORklHX0ZMQVNIX1NQRUVEX0JIVCA9PSAwKQorI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfSFQgICBCMEhUXzAKKyNlbmRpZgorI2lmIChmbGFzaF9FQklVX0FNQkNUTF9IVCA9PSAwICYmIENPTkZJR19GTEFTSF9TUEVFRF9CSFQgIT0gMCkKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX0hUICAgQjBIVF8xCisjZW5kaWYKKworI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPiAxNCkKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMTUKKyNlbmRpZgorI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMTQpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzE0CisjZW5kaWYKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDEzKQorI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xMworI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAxMikKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMTIKKyNlbmRpZgorI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMTEpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzExCisjZW5kaWYKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDEwKQorI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xMAorI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSA5KQorI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF85CisjZW5kaWYKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDgpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzgKKyNlbmRpZgorI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gNykKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfNworI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSA2KQorI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF82CisjZW5kaWYKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDUpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzUKKyNlbmRpZgorI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gNCkKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfNAorI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAzKQorI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8zCisjZW5kaWYKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDIpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzIKKyNlbmRpZgorI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMSkKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMQorI2VuZGlmCisKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID4gMTQpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzE1CisjZW5kaWYKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDE0KQorI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xNAorI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAxMykKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMTMKKyNlbmRpZgorI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMTIpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzEyCisjZW5kaWYKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDExKQorI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xMQorI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAxMCkKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMTAKKyNlbmRpZgorI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gOSkKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfOQorI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSA4KQorI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF84CisjZW5kaWYKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDcpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzcKKyNlbmRpZgorI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gNikKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfNgorI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSA1KQorI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF81CisjZW5kaWYKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDQpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzQKKyNlbmRpZgorI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMykKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMworI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAyKQorI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8yCisjZW5kaWYKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDEpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzEKKyNlbmRpZgorCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMCAgXAorCShmbGFzaF9FQklVX0FNQkNUTDBfV0FUIHwgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCB8IGZsYXNoX0VCSVVfQU1CQ1RMMF9IVCB8IFwKKwkgZmxhc2hfRUJJVV9BTUJDVEwwX1NUIHwgZmxhc2hfRUJJVV9BTUJDVEwwX1RUIHwgQ09ORklHX0ZMQVNIX1NQRUVEX1JEWUVOKQorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL21lbV9tYXAuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbWVtX21hcC5oCmluZGV4IDg4ZDA0YTcuLmU5MmIzMTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbWVtX21hcC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbWVtX21hcC5oCkBAIC05LDQgKzksNzkgQEAKIAogI2luY2x1ZGUgPG1hY2gvbWVtX21hcC5oPgogCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisjaWZkZWYgQ09ORklHX1NNUAorc3RhdGljIGlubGluZSB1bG9uZyBnZXRfbDFfc2NyYXRjaF9zdGFydF9jcHUoaW50IGNwdSkKK3sKKwlyZXR1cm4gKGNwdSkgPyBDT1JFQl9MMV9TQ1JBVENIX1NUQVJUIDogQ09SRUFfTDFfU0NSQVRDSF9TVEFSVDsKK30KK3N0YXRpYyBpbmxpbmUgdWxvbmcgZ2V0X2wxX2NvZGVfc3RhcnRfY3B1KGludCBjcHUpCit7CisJcmV0dXJuIChjcHUpID8gQ09SRUJfTDFfQ09ERV9TVEFSVCA6IENPUkVBX0wxX0NPREVfU1RBUlQ7Cit9CitzdGF0aWMgaW5saW5lIHVsb25nIGdldF9sMV9kYXRhX2Ffc3RhcnRfY3B1KGludCBjcHUpCit7CisJcmV0dXJuIChjcHUpID8gQ09SRUJfTDFfREFUQV9BX1NUQVJUIDogQ09SRUFfTDFfREFUQV9BX1NUQVJUOworfQorc3RhdGljIGlubGluZSB1bG9uZyBnZXRfbDFfZGF0YV9iX3N0YXJ0X2NwdShpbnQgY3B1KQoreworCXJldHVybiAoY3B1KSA/IENPUkVCX0wxX0RBVEFfQl9TVEFSVCA6IENPUkVBX0wxX0RBVEFfQl9TVEFSVDsKK30KKworc3RhdGljIGlubGluZSB1bG9uZyBnZXRfbDFfc2NyYXRjaF9zdGFydCh2b2lkKQoreworCXJldHVybiBnZXRfbDFfc2NyYXRjaF9zdGFydF9jcHUoYmxhY2tmaW5fY29yZV9pZCgpKTsKK30KK3N0YXRpYyBpbmxpbmUgdWxvbmcgZ2V0X2wxX2NvZGVfc3RhcnQodm9pZCkKK3sKKwlyZXR1cm4gZ2V0X2wxX2NvZGVfc3RhcnRfY3B1KGJsYWNrZmluX2NvcmVfaWQoKSk7Cit9CitzdGF0aWMgaW5saW5lIHVsb25nIGdldF9sMV9kYXRhX2Ffc3RhcnQodm9pZCkKK3sKKwlyZXR1cm4gZ2V0X2wxX2RhdGFfYV9zdGFydF9jcHUoYmxhY2tmaW5fY29yZV9pZCgpKTsKK30KK3N0YXRpYyBpbmxpbmUgdWxvbmcgZ2V0X2wxX2RhdGFfYl9zdGFydCh2b2lkKQoreworCXJldHVybiBnZXRfbDFfZGF0YV9iX3N0YXJ0X2NwdShibGFja2Zpbl9jb3JlX2lkKCkpOworfQorCisjZWxzZSAvKiAhQ09ORklHX1NNUCAqLworCitzdGF0aWMgaW5saW5lIHVsb25nIGdldF9sMV9zY3JhdGNoX3N0YXJ0X2NwdShpbnQgY3B1KQoreworCXJldHVybiBMMV9TQ1JBVENIX1NUQVJUOworfQorc3RhdGljIGlubGluZSB1bG9uZyBnZXRfbDFfY29kZV9zdGFydF9jcHUoaW50IGNwdSkKK3sKKwlyZXR1cm4gTDFfQ09ERV9TVEFSVDsKK30KK3N0YXRpYyBpbmxpbmUgdWxvbmcgZ2V0X2wxX2RhdGFfYV9zdGFydF9jcHUoaW50IGNwdSkKK3sKKwlyZXR1cm4gTDFfREFUQV9BX1NUQVJUOworfQorc3RhdGljIGlubGluZSB1bG9uZyBnZXRfbDFfZGF0YV9iX3N0YXJ0X2NwdShpbnQgY3B1KQoreworCXJldHVybiBMMV9EQVRBX0JfU1RBUlQ7Cit9CitzdGF0aWMgaW5saW5lIHVsb25nIGdldF9sMV9zY3JhdGNoX3N0YXJ0KHZvaWQpCit7CisJcmV0dXJuIGdldF9sMV9zY3JhdGNoX3N0YXJ0X2NwdSgwKTsKK30KK3N0YXRpYyBpbmxpbmUgdWxvbmcgZ2V0X2wxX2NvZGVfc3RhcnQodm9pZCkKK3sKKwlyZXR1cm4gIGdldF9sMV9jb2RlX3N0YXJ0X2NwdSgwKTsKK30KK3N0YXRpYyBpbmxpbmUgdWxvbmcgZ2V0X2wxX2RhdGFfYV9zdGFydCh2b2lkKQoreworCXJldHVybiBnZXRfbDFfZGF0YV9hX3N0YXJ0X2NwdSgwKTsKK30KK3N0YXRpYyBpbmxpbmUgdWxvbmcgZ2V0X2wxX2RhdGFfYl9zdGFydCh2b2lkKQoreworCXJldHVybiBnZXRfbDFfZGF0YV9iX3N0YXJ0X2NwdSgwKTsKK30KKworI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KKyNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKwogI2VuZGlmCQkJCS8qIF9NRU1fTUFQX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKaW5kZXggMzU1OTNkZC4uOTQ0ZTI5ZiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaApAQCAtMzcsNiArMzcsMTAgQEAKICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgogI2luY2x1ZGUgPGFzbS9jcGxiaW5pdC5oPgogCisvKiBOb3RlOiBMMSBzdGFja3MgYXJlIENQVS1wcml2YXRlIHRoaW5ncywgc28gd2UgYmx1bnRseSBkaXNhYmxlIHRoaXMKKyAgIGZlYXR1cmUgaW4gU01QIG1vZGUsIGFuZCB1c2UgdGhlIHBlci1DUFUgc2NyYXRjaCBTUkFNIGJhbmsgb25seSB0bworICAgc3RvcmUgdGhlIFBEQSBpbnN0ZWFkLiAqLworCiBleHRlcm4gdm9pZCAqY3VycmVudF9sMV9zdGFja19zYXZlOwogZXh0ZXJuIGludCBucl9sMXN0YWNrX3Rhc2tzOwogZXh0ZXJuIHZvaWQgKmwxX3N0YWNrX2Jhc2U7CkBAIC04OCwxMiArOTIsMTUgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzd2l0Y2hfbW0oc3RydWN0IG1tX3N0cnVjdCAqcHJldl9tbSwgc3RydWN0IG1tX3N0cnVjdCAqbmV4dF9tbSwKIAkJCSAgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7CisjaWZkZWYgQ09ORklHX01QVQorCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisjZW5kaWYKIAlpZiAocHJldl9tbSA9PSBuZXh0X21tKQogCQlyZXR1cm47CiAjaWZkZWYgQ09ORklHX01QVQotCWlmIChwcmV2X21tLT5jb250ZXh0LnBhZ2Vfcnd4X21hc2sgPT0gY3VycmVudF9yd3hfbWFzaykgewotCQlmbHVzaF9zd2l0Y2hlZF9jcGxicygpOwotCQlzZXRfbWFza19kY3BsYnMobmV4dF9tbS0+Y29udGV4dC5wYWdlX3J3eF9tYXNrKTsKKwlpZiAocHJldl9tbS0+Y29udGV4dC5wYWdlX3J3eF9tYXNrID09IGN1cnJlbnRfcnd4X21hc2tbY3B1XSkgeworCQlmbHVzaF9zd2l0Y2hlZF9jcGxicyhjcHUpOworCQlzZXRfbWFza19kY3BsYnMobmV4dF9tbS0+Y29udGV4dC5wYWdlX3J3eF9tYXNrLCBjcHUpOwogCX0KICNlbmRpZgogCkBAIC0xMzgsOSArMTQ1LDEwIEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfcHJvdGVjdGlvbnMoc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7Ci0JaWYgKG1tLT5jb250ZXh0LnBhZ2Vfcnd4X21hc2sgPT0gY3VycmVudF9yd3hfbWFzaykgewotCQlmbHVzaF9zd2l0Y2hlZF9jcGxicygpOwotCQlzZXRfbWFza19kY3BsYnMobW0tPmNvbnRleHQucGFnZV9yd3hfbWFzayk7CisJdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlpZiAobW0tPmNvbnRleHQucGFnZV9yd3hfbWFzayA9PSBjdXJyZW50X3J3eF9tYXNrW2NwdV0pIHsKKwkJZmx1c2hfc3dpdGNoZWRfY3BsYnMoY3B1KTsKKwkJc2V0X21hc2tfZGNwbGJzKG1tLT5jb250ZXh0LnBhZ2Vfcnd4X21hc2ssIGNwdSk7CiAJfQogfQogI2VuZGlmCkBAIC0xNjUsNiArMTczLDkgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkZXN0cm95X2NvbnRleHQoc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7CiAJc3RydWN0IHNyYW1fbGlzdF9zdHJ1Y3QgKnRtcDsKKyNpZmRlZiBDT05GSUdfTVBVCisJdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0FQUF9TVEFDS19MMQogCWlmIChjdXJyZW50X2wxX3N0YWNrX3NhdmUgPT0gbW0tPmNvbnRleHQubDFfc3RhY2tfc2F2ZSkKQEAgLTE3OSw4ICsxOTAsOCBAQAogCQlrZnJlZSh0bXApOwogCX0KICNpZmRlZiBDT05GSUdfTVBVCi0JaWYgKGN1cnJlbnRfcnd4X21hc2sgPT0gbW0tPmNvbnRleHQucGFnZV9yd3hfbWFzaykKLQkJY3VycmVudF9yd3hfbWFzayA9IE5VTEw7CisJaWYgKGN1cnJlbnRfcnd4X21hc2tbY3B1XSA9PSBtbS0+Y29udGV4dC5wYWdlX3J3eF9tYXNrKQorCQljdXJyZW50X3J3eF9tYXNrW2NwdV0gPSBOVUxMOwogCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpbW0tPmNvbnRleHQucGFnZV9yd3hfbWFzaywgcGFnZV9tYXNrX29yZGVyKTsKICNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9tdXRleC1kZWMuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbXV0ZXgtZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEzNDE1MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbXV0ZXgtZGVjLmgKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS1nZW5lcmljL211dGV4LWRlYy5oCisgKgorICogR2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbXV0ZXggZmFzdHBhdGgsIGJhc2VkIG9uIGF0b21pYworICogZGVjcmVtZW50L2luY3JlbWVudC4KKyAqLworI2lmbmRlZiBfQVNNX0dFTkVSSUNfTVVURVhfREVDX0gKKyNkZWZpbmUgX0FTTV9HRU5FUklDX01VVEVYX0RFQ19ICisKKy8qKgorICogIF9fbXV0ZXhfZmFzdHBhdGhfbG9jayAtIHRyeSB0byB0YWtlIHRoZSBsb2NrIGJ5IG1vdmluZyB0aGUgY291bnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIDEgdG8gYSAwIHZhbHVlCisgKiAgQGNvdW50OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqICBAZmFpbF9mbjogZnVuY3Rpb24gdG8gY2FsbCBpZiB0aGUgb3JpZ2luYWwgdmFsdWUgd2FzIG5vdCAxCisgKgorICogQ2hhbmdlIHRoZSBjb3VudCBmcm9tIDEgdG8gYSB2YWx1ZSBsb3dlciB0aGFuIDEsIGFuZCBjYWxsIDxmYWlsX2ZuPiBpZgorICogaXQgd2Fzbid0IDEgb3JpZ2luYWxseS4gVGhpcyBmdW5jdGlvbiBNVVNUIGxlYXZlIHRoZSB2YWx1ZSBsb3dlciB0aGFuCisgKiAxIGV2ZW4gd2hlbiB0aGUgIjEiIGFzc2VydGlvbiB3YXNuJ3QgdHJ1ZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCitfX211dGV4X2Zhc3RwYXRoX2xvY2soYXRvbWljX3QgKmNvdW50LCBmYXN0Y2FsbCB2b2lkICgqZmFpbF9mbikoYXRvbWljX3QgKikpCit7CisJaWYgKHVubGlrZWx5KGF0b21pY19kZWNfcmV0dXJuKGNvdW50KSA8IDApKQorCQlmYWlsX2ZuKGNvdW50KTsKKwllbHNlCisJCXNtcF9tYigpOworfQorCisvKioKKyAqICBfX211dGV4X2Zhc3RwYXRoX2xvY2tfcmV0dmFsIC0gdHJ5IHRvIHRha2UgdGhlIGxvY2sgYnkgbW92aW5nIHRoZSBjb3VudAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIDEgdG8gYSAwIHZhbHVlCisgKiAgQGNvdW50OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqICBAZmFpbF9mbjogZnVuY3Rpb24gdG8gY2FsbCBpZiB0aGUgb3JpZ2luYWwgdmFsdWUgd2FzIG5vdCAxCisgKgorICogQ2hhbmdlIHRoZSBjb3VudCBmcm9tIDEgdG8gYSB2YWx1ZSBsb3dlciB0aGFuIDEsIGFuZCBjYWxsIDxmYWlsX2ZuPiBpZgorICogaXQgd2Fzbid0IDEgb3JpZ2luYWxseS4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIDAgaWYgdGhlIGZhc3RwYXRoIHN1Y2NlZWRzLAorICogb3IgYW55dGhpbmcgdGhlIHNsb3cgcGF0aCBmdW5jdGlvbiByZXR1cm5zLgorICovCitzdGF0aWMgaW5saW5lIGludAorX19tdXRleF9mYXN0cGF0aF9sb2NrX3JldHZhbChhdG9taWNfdCAqY291bnQsIGZhc3RjYWxsIGludCAoKmZhaWxfZm4pKGF0b21pY190ICopKQoreworCWlmICh1bmxpa2VseShhdG9taWNfZGVjX3JldHVybihjb3VudCkgPCAwKSkKKwkJcmV0dXJuIGZhaWxfZm4oY291bnQpOworCWVsc2UgeworCQlzbXBfbWIoKTsKKwkJcmV0dXJuIDA7CisJfQorfQorCisvKioKKyAqICBfX211dGV4X2Zhc3RwYXRoX3VubG9jayAtIHRyeSB0byBwcm9tb3RlIHRoZSBjb3VudCBmcm9tIDAgdG8gMQorICogIEBjb3VudDogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKiAgQGZhaWxfZm46IGZ1bmN0aW9uIHRvIGNhbGwgaWYgdGhlIG9yaWdpbmFsIHZhbHVlIHdhcyBub3QgMAorICoKKyAqIFRyeSB0byBwcm9tb3RlIHRoZSBjb3VudCBmcm9tIDAgdG8gMS4gSWYgaXQgd2Fzbid0IDAsIGNhbGwgPGZhaWxfZm4+LgorICogSW4gdGhlIGZhaWx1cmUgY2FzZSwgdGhpcyBmdW5jdGlvbiBpcyBhbGxvd2VkIHRvIGVpdGhlciBzZXQgdGhlIHZhbHVlIHRvCisgKiAxLCBvciB0byBzZXQgaXQgdG8gYSB2YWx1ZSBsb3dlciB0aGFuIDEuCisgKgorICogSWYgdGhlIGltcGxlbWVudGF0aW9uIHNldHMgaXQgdG8gYSB2YWx1ZSBvZiBsb3dlciB0aGFuIDEsIHRoZW4gdGhlCisgKiBfX211dGV4X3Nsb3dwYXRoX25lZWRzX3RvX3VubG9jaygpIG1hY3JvIG5lZWRzIHRvIHJldHVybiAxLCBpdCBuZWVkcworICogdG8gcmV0dXJuIDAgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK19fbXV0ZXhfZmFzdHBhdGhfdW5sb2NrKGF0b21pY190ICpjb3VudCwgZmFzdGNhbGwgdm9pZCAoKmZhaWxfZm4pKGF0b21pY190ICopKQoreworCXNtcF9tYigpOworCWlmICh1bmxpa2VseShhdG9taWNfaW5jX3JldHVybihjb3VudCkgPD0gMCkpCisJCWZhaWxfZm4oY291bnQpOworfQorCisjZGVmaW5lIF9fbXV0ZXhfc2xvd3BhdGhfbmVlZHNfdG9fdW5sb2NrKCkJCTEKKworLyoqCisgKiBfX211dGV4X2Zhc3RwYXRoX3RyeWxvY2sgLSB0cnkgdG8gYWNxdWlyZSB0aGUgbXV0ZXgsIHdpdGhvdXQgd2FpdGluZworICoKKyAqICBAY291bnQ6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICogIEBmYWlsX2ZuOiBmYWxsYmFjayBmdW5jdGlvbgorICoKKyAqIENoYW5nZSB0aGUgY291bnQgZnJvbSAxIHRvIGEgdmFsdWUgbG93ZXIgdGhhbiAxLCBhbmQgcmV0dXJuIDAgKGZhaWx1cmUpCisgKiBpZiBpdCB3YXNuJ3QgMSBvcmlnaW5hbGx5LCBvciByZXR1cm4gMSAoc3VjY2Vzcykgb3RoZXJ3aXNlLiBUaGlzIGZ1bmN0aW9uCisgKiBNVVNUIGxlYXZlIHRoZSB2YWx1ZSBsb3dlciB0aGFuIDEgZXZlbiB3aGVuIHRoZSAiMSIgYXNzZXJ0aW9uIHdhc24ndCB0cnVlLgorICogQWRkaXRpb25hbGx5LCBpZiB0aGUgdmFsdWUgd2FzIDwgMCBvcmlnaW5hbGx5LCB0aGlzIGZ1bmN0aW9uIG11c3Qgbm90IGxlYXZlCisgKiBpdCB0byAwIG9uIGZhaWx1cmUuCisgKgorICogSWYgdGhlIGFyY2hpdGVjdHVyZSBoYXMgbm8gZWZmZWN0aXZlIHRyeWxvY2sgdmFyaWFudCwgaXQgc2hvdWxkIGNhbGwgdGhlCisgKiA8ZmFpbF9mbj4gc3BpbmxvY2stYmFzZWQgdHJ5bG9jayB2YXJpYW50IHVuY29uZGl0aW9uYWxseS4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK19fbXV0ZXhfZmFzdHBhdGhfdHJ5bG9jayhhdG9taWNfdCAqY291bnQsIGludCAoKmZhaWxfZm4pKGF0b21pY190ICopKQoreworCS8qCisJICogV2UgaGF2ZSB0d28gdmFyaWFudHMgaGVyZS4gVGhlIGNtcHhjaGcgYmFzZWQgb25lIGlzIHRoZSBiZXN0IG9uZQorCSAqIGJlY2F1c2UgaXQgbmV2ZXIgaW5kdWNlIGEgZmFsc2UgY29udGVudGlvbiBzdGF0ZS4gIEl0IGlzIGluY2x1ZGVkCisJICogaGVyZSBiZWNhdXNlIGFyY2hpdGVjdHVyZXMgdXNpbmcgdGhlIGluYy9kZWMgYWxnb3JpdGhtcyBvdmVyIHRoZQorCSAqIHhjaGcgb25lcyBhcmUgbXVjaCBtb3JlIGxpa2VseSB0byBzdXBwb3J0IGNtcHhjaGcgbmF0aXZlbHkuCisJICoKKwkgKiBJZiBub3Qgd2UgZmFsbCBiYWNrIHRvIHRoZSBzcGlubG9jayBiYXNlZCB2YXJpYW50IC0gdGhhdCBpcworCSAqIGp1c3QgYXMgZWZmaWNpZW50IChhbmQgc2ltcGxlcikgYXMgYSAnZGVzdHJ1Y3RpdmUnIHByb2Jpbmcgb2YKKwkgKiB0aGUgbXV0ZXggc3RhdGUgd291bGQgYmUuCisJICovCisjaWZkZWYgX19IQVZFX0FSQ0hfQ01QWENIRworCWlmIChsaWtlbHkoYXRvbWljX2NtcHhjaGcoY291bnQsIDEsIDApID09IDEpKSB7CisJCXNtcF9tYigpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7CisjZWxzZQorCXJldHVybiBmYWlsX2ZuKGNvdW50KTsKKyNlbmRpZgorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbXV0ZXguaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbXV0ZXguaAppbmRleCA0NThjMWY3Li41ZDM5OTI1IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL211dGV4LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9tdXRleC5oCkBAIC02LDQgKzYsNjcgQEAKICAqIGltcGxlbWVudGF0aW9uLiAoc2VlIGFzbS1nZW5lcmljL211dGV4LXhjaGcuaCBmb3IgZGV0YWlscykKICAqLwogCisjaWZuZGVmIF9BU01fTVVURVhfSAorI2RlZmluZSBfQVNNX01VVEVYX0gKKworI2lmbmRlZiBDT05GSUdfU01QCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvbXV0ZXgtZGVjLmg+CisjZWxzZQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fbXV0ZXhfZmFzdHBhdGhfbG9jayhhdG9taWNfdCAqY291bnQsIHZvaWQgKCpmYWlsX2ZuKShhdG9taWNfdCAqKSkKK3sKKwlpZiAodW5saWtlbHkoYXRvbWljX2RlY19yZXR1cm4oY291bnQpIDwgMCkpCisJCWZhaWxfZm4oY291bnQpOworCWVsc2UKKwkJc21wX21iKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX211dGV4X2Zhc3RwYXRoX2xvY2tfcmV0dmFsKGF0b21pY190ICpjb3VudCwgaW50ICgqZmFpbF9mbikoYXRvbWljX3QgKikpCit7CisJaWYgKHVubGlrZWx5KGF0b21pY19kZWNfcmV0dXJuKGNvdW50KSA8IDApKQorCQlyZXR1cm4gZmFpbF9mbihjb3VudCk7CisJZWxzZSB7CisJCXNtcF9tYigpOworCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19tdXRleF9mYXN0cGF0aF91bmxvY2soYXRvbWljX3QgKmNvdW50LCB2b2lkICgqZmFpbF9mbikoYXRvbWljX3QgKikpCit7CisJc21wX21iKCk7CisJaWYgKHVubGlrZWx5KGF0b21pY19pbmNfcmV0dXJuKGNvdW50KSA8PSAwKSkKKwkJZmFpbF9mbihjb3VudCk7Cit9CisKKyNkZWZpbmUgX19tdXRleF9zbG93cGF0aF9uZWVkc190b191bmxvY2soKQkJMQorCitzdGF0aWMgaW5saW5lIGludAorX19tdXRleF9mYXN0cGF0aF90cnlsb2NrKGF0b21pY190ICpjb3VudCwgaW50ICgqZmFpbF9mbikoYXRvbWljX3QgKikpCit7CisJLyoKKwkgKiBXZSBoYXZlIHR3byB2YXJpYW50cyBoZXJlLiBUaGUgY21weGNoZyBiYXNlZCBvbmUgaXMgdGhlIGJlc3Qgb25lCisJICogYmVjYXVzZSBpdCBuZXZlciBpbmR1Y2UgYSBmYWxzZSBjb250ZW50aW9uIHN0YXRlLiAgSXQgaXMgaW5jbHVkZWQKKwkgKiBoZXJlIGJlY2F1c2UgYXJjaGl0ZWN0dXJlcyB1c2luZyB0aGUgaW5jL2RlYyBhbGdvcml0aG1zIG92ZXIgdGhlCisJICogeGNoZyBvbmVzIGFyZSBtdWNoIG1vcmUgbGlrZWx5IHRvIHN1cHBvcnQgY21weGNoZyBuYXRpdmVseS4KKwkgKgorCSAqIElmIG5vdCB3ZSBmYWxsIGJhY2sgdG8gdGhlIHNwaW5sb2NrIGJhc2VkIHZhcmlhbnQgLSB0aGF0IGlzCisJICoganVzdCBhcyBlZmZpY2llbnQgKGFuZCBzaW1wbGVyKSBhcyBhICdkZXN0cnVjdGl2ZScgcHJvYmluZyBvZgorCSAqIHRoZSBtdXRleCBzdGF0ZSB3b3VsZCBiZS4KKwkgKi8KKyNpZmRlZiBfX0hBVkVfQVJDSF9DTVBYQ0hHCisJaWYgKGxpa2VseShhdG9taWNfY21weGNoZyhjb3VudCwgMSwgMCkgPT0gMSkpIHsKKwkJc21wX21iKCk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKKyNlbHNlCisJcmV0dXJuIGZhaWxfZm4oY291bnQpOworI2VuZGlmCit9CisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcGRhLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3BkYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkOGQ0YTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3BkYS5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcGRhLmgKKyAqIEF1dGhvcjogICAgICAgUGhpbGlwcGUgR2VydW0gPHJwbUB4ZW5vbWFpLm9yZz4KKyAqCisgKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA3IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQorICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2lmbmRlZiBfQVNNX0JMQUNLRklOX1BEQV9ICisjZGVmaW5lIF9BU01fQkxBQ0tGSU5fUERBX0gKKworI2luY2x1ZGUgPG1hY2gvYW5vbWFseS5oPgorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCitzdHJ1Y3QgYmxhY2tmaW5fcGRhIHsJCQkvKiBQZXItcHJvY2Vzc29yIERhdGEgQXJlYSAqLworCXN0cnVjdCBibGFja2Zpbl9wZGEgKm5leHQ7CisKKwl1bnNpZ25lZCBsb25nIHN5c2NmZzsKKyNpZmRlZiBDT05GSUdfU01QCisJdW5zaWduZWQgbG9uZyBpbWFzazsJCS8qIEN1cnJlbnQgSU1BU0sgdmFsdWUgKi8KKyNlbmRpZgorCisJdW5zaWduZWQgbG9uZyAqaXBkdDsJCS8qIFN0YXJ0IG9mIHN3aXRjaGFibGUgSS1DUExCIHRhYmxlICovCisJdW5zaWduZWQgbG9uZyAqaXBkdF9zd2FwY291bnQ7CS8qIE51bWJlciBvZiBzd2FwcyBpbiBpcGR0ICovCisJdW5zaWduZWQgbG9uZyAqZHBkdDsJCS8qIFN0YXJ0IG9mIHN3aXRjaGFibGUgRC1DUExCIHRhYmxlICovCisJdW5zaWduZWQgbG9uZyAqZHBkdF9zd2FwY291bnQ7CS8qIE51bWJlciBvZiBzd2FwcyBpbiBkcGR0ICovCisKKwkvKgorCSAqIFNpbmdsZSBpbnN0cnVjdGlvbnMgY2FuIGhhdmUgbXVsdGlwbGUgZmF1bHRzLCB3aGljaAorCSAqIG5lZWQgdG8gYmUgaGFuZGxlZCBieSB0cmFwcy5jLCBpbiBpcnE1LiBXZSBzdG9yZQorCSAqIHRoZSBleGNlcHRpb24gY2F1c2UgdG8gZW5zdXJlIHdlIGRvbid0IG1pc3MgYQorCSAqIGRvdWJsZSBmYXVsdCBjb25kaXRpb24KKwkgKi8KKwl1bnNpZ25lZCBsb25nIGV4X2lwdHI7CisJdW5zaWduZWQgbG9uZyBleF9vcHRyOworCXVuc2lnbmVkIGxvbmcgZXhfYnVmWzRdOworCXVuc2lnbmVkIGxvbmcgZXhfaW1hc2s7CQkvKiBTYXZlZCBpbWFzayBmcm9tIGV4Y2VwdGlvbiAqLworCXVuc2lnbmVkIGxvbmcgKmV4X3N0YWNrOwkvKiBFeGNlcHRpb24gc3RhY2sgc3BhY2UgKi8KKworI2lmZGVmIEFOT01BTFlfMDUwMDAyNjEKKwl1bnNpZ25lZCBsb25nIGxhc3RfY3BsYl9mYXVsdF9yZXR4OworI2VuZGlmCisJdW5zaWduZWQgbG9uZyBkY3BsYl9mYXVsdF9hZGRyOworCXVuc2lnbmVkIGxvbmcgaWNwbGJfZmF1bHRfYWRkcjsKKwl1bnNpZ25lZCBsb25nIHJldHg7CisJdW5zaWduZWQgbG9uZyBzZXFzdGF0OworfTsKKworZXh0ZXJuIHN0cnVjdCBibGFja2Zpbl9wZGEgY3B1X3BkYVtdOworCit2b2lkIHJlc2VydmVfcGRhKHZvaWQpOworCisjZW5kaWYJLyogX19BU1NFTUJMWV9fICovCisKKyNlbmRpZiAvKiBfQVNNX0JMQUNLRklOX1BEQV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3BlcmNwdS5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wZXJjcHUuaAppbmRleCA3OGRkNjFmLi43OTdjMGMxIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3BlcmNwdS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcGVyY3B1LmgKQEAgLTMsNCArMywxNCBAQAogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGVyY3B1Lmg+CiAKLSNlbmRpZgkJCQkvKiBfX0FSQ0hfQkxBQ0tGSU5fUEVSQ1BVX18gKi8KKyNpZmRlZiBDT05GSUdfTU9EVUxFUworI2RlZmluZSBQRVJDUFVfTU9EVUxFX1JFU0VSVkUgODE5MgorI2Vsc2UKKyNkZWZpbmUgUEVSQ1BVX01PRFVMRV9SRVNFUlZFIDAKKyNlbmRpZgorCisjZGVmaW5lIFBFUkNQVV9FTk9VR0hfUk9PTSBcCisJKEFMSUdOKF9fcGVyX2NwdV9lbmQgLSBfX3Blcl9jcHVfc3RhcnQsIFNNUF9DQUNIRV9CWVRFUykgKyBcCisJIFBFUkNQVV9NT0RVTEVfUkVTRVJWRSkKKworI2VuZGlmCS8qIF9fQVJDSF9CTEFDS0ZJTl9QRVJDUFVfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wZ3RhYmxlLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3BndGFibGUuaAppbmRleCBmMTE2ODRlLi43ODNjOGY3IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3BndGFibGUuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3BndGFibGUuaApAQCAtMjksNiArMjksNyBAQAogI2RlZmluZSBQQUdFX0NPUFkJCV9fcGdwcm90KDApCS8qIHRoZXNlIG1lYW4gbm90aGluZyB0byBOT19NTSAqLwogI2RlZmluZSBQQUdFX1JFQURPTkxZCQlfX3BncHJvdCgwKQkvKiB0aGVzZSBtZWFuIG5vdGhpbmcgdG8gTk9fTU0gKi8KICNkZWZpbmUgUEFHRV9LRVJORUwJCV9fcGdwcm90KDApCS8qIHRoZXNlIG1lYW4gbm90aGluZyB0byBOT19NTSAqLworI2RlZmluZSBwZ3Byb3Rfbm9uY2FjaGVkKHByb3QpCShwcm90KQogCiBleHRlcm4gdm9pZCBwYWdpbmdfaW5pdCh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKaW5kZXggZTNlOWI0MS4uMGVlY2UyMyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCkBAIC0yNCw2ICsyNCwxNCBAQAogCV9fYXNtX18gX192b2xhdGlsZV9fKCJ1c3AgPSAlMDtcblx0Ijo6ImRhIih1c3ApKTsKIH0KIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fZ2V0X1NQKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBzcDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKCIlMCA9IHNwO1xuXHQiIDogIj1kYSIoc3ApKTsKKwlyZXR1cm4gc3A7Cit9CisKIC8qCiAgKiBVc2VyIHNwYWNlIHByb2Nlc3Mgc2l6ZTogMXN0IGJ5dGUgYmV5b25kIHVzZXIgYWRkcmVzcyBzcGFjZS4KICAqIEZhaXJseSBtZWFuaW5nbGVzcyBvbiBub21tdS4gIFBhcnRzIG9mIHVzZXIgcHJvZ3JhbXMgY2FuIGJlIHNjYXR0ZXJlZApAQCAtNTcsNiArNjUsNyBAQAogICogcGFzcyB0aGUgZGF0YSBzZWdtZW50IGludG8gdXNlciBwcm9ncmFtcyBpZiBpdCBleGlzdHMsCiAgKiBpdCBjYW4ndCBodXJ0IGFueXRoaW5nIGFzIGZhciBhcyBJIGNhbiB0ZWxsCiAgKi8KKyNpZm5kZWYgQ09ORklHX1NNUAogI2RlZmluZSBzdGFydF90aHJlYWQoX3JlZ3MsIF9wYywgX3VzcCkJCQkJCVwKIGRvIHsJCQkJCQkJCQlcCiAJc2V0X2ZzKFVTRVJfRFMpOwkJCQkJCVwKQEAgLTcwLDYgKzc5LDE2IEBACiAJCXNpemVvZigqTDFfU0NSQVRDSF9UQVNLX0lORk8pKTsJCQkJXAogCXdydXNwKF91c3ApOwkJCQkJCQlcCiB9IHdoaWxlKDApCisjZWxzZQorI2RlZmluZSBzdGFydF90aHJlYWQoX3JlZ3MsIF9wYywgX3VzcCkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJc2V0X2ZzKFVTRVJfRFMpOwkJCQkJCVwKKwkoX3JlZ3MpLT5wYyA9IChfcGMpOwkJCQkJCVwKKwlpZiAoY3VycmVudC0+bW0pCQkJCQkJXAorCQkoX3JlZ3MpLT5wNSA9IGN1cnJlbnQtPm1tLT5zdGFydF9kYXRhOwkJCVwKKwl3cnVzcChfdXNwKTsJCQkJCQkJXAorfSB3aGlsZSAoMCkKKyNlbmRpZgogCiAvKiBGb3J3YXJkIGRlY2xhcmF0aW9uLCBhIHN0cmFuZ2UgQyB0aGluZyAqLwogc3RydWN0IHRhc2tfc3RydWN0OwpAQCAtMTA2LDcgKzEyNSw4IEBACiAJZWlwOyB9KQogI2RlZmluZQlLU1RLX0VTUCh0c2spCSgodHNrKSA9PSBjdXJyZW50ID8gcmR1c3AoKSA6ICh0c2spLT50aHJlYWQudXNwKQogCi0jZGVmaW5lIGNwdV9yZWxheCgpICAgIAliYXJyaWVyKCkKKyNkZWZpbmUgY3B1X3JlbGF4KCkgICAgCXNtcF9tYigpCisKIAogLyogR2V0IHRoZSBTaWxpY29uIFJldmlzaW9uIG9mIHRoZSBjaGlwICovCiBzdGF0aWMgaW5saW5lIHVpbnQzMl90IF9fcHVyZSBiZmluX3JldmlkKHZvaWQpCkBAIC0xMzcsNyArMTU3LDExIEBACiBzdGF0aWMgaW5saW5lIHVpbnQxNl90IF9fcHVyZSBiZmluX2NwdWlkKHZvaWQpCiB7CiAJcmV0dXJuIChiZmluX3JlYWRfQ0hJUElEKCkgJiBDSElQSURfRkFNSUxZKSA+PiAxMjsKK30KIAorc3RhdGljIGlubGluZSB1aW50MzJfdCBfX3B1cmUgYmZpbl9kc3BpZCh2b2lkKQoreworCXJldHVybiBiZmluX3JlYWRfRFNQSUQoKTsKIH0KIAogc3RhdGljIGlubGluZSB1aW50MzJfdCBfX3B1cmUgYmZpbl9jb21waWxlZF9yZXZpZCh2b2lkKQpAQCAtMTU0LDYgKzE3OCw4IEBACiAJcmV0dXJuIDQ7CiAjZWxpZiBkZWZpbmVkKENPTkZJR19CRl9SRVZfMF81KQogCXJldHVybiA1OworI2VsaWYgZGVmaW5lZChDT05GSUdfQkZfUkVWXzBfNikKKwlyZXR1cm4gNjsKICNlbGlmIGRlZmluZWQoQ09ORklHX0JGX1JFVl9BTlkpCiAJcmV0dXJuIDB4ZmZmZjsKICNlbHNlCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3JlYm9vdC5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9yZWJvb3QuaAppbmRleCA2ZDQ0OGI1Li40ODU2ZDYyIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3JlYm9vdC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcmVib290LmgKQEAgLTEsNyArMSw3IEBACiAvKgotICogaW5jbHVkZS9hc20tYmxhY2tmaW4vcmVib290LmggLSBzaHV0ZG93bi9yZWJvb3QgaGVhZGVyCisgKiByZWJvb3QuaCAtIHNodXRkb3duL3JlYm9vdCBoZWFkZXIKICAqCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA3IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9yd2xvY2suaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcndsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE3MjRiMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcndsb2NrLmgKQEAgLTAsMCArMSw2IEBACisjaWZuZGVmIF9BU01fQkxBQ0tGSU5fUldMT0NLX0gKKyNkZWZpbmUgX0FTTV9CTEFDS0ZJTl9SV0xPQ0tfSAorCisjZGVmaW5lIFJXX0xPQ0tfQklBUwkweDAxMDAwMDAwCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zZXJpYWwuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc2VyaWFsLmgKaW5kZXggOTk0ZGQ4Ni4uM2E0NzYwNiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zZXJpYWwuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NlcmlhbC5oCkBAIC0zLDMgKzMsNCBAQAogICovCiAKICNkZWZpbmUgU0VSSUFMX0VYVFJBX0lSUV9GTEFHUyBJUlFGX1RSSUdHRVJfSElHSAorI2RlZmluZSBCQVNFX0JBVUQgKDE4NDMyMDAgLyAxNikKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc21wLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExOGRlZWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NtcC5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc21wLmgKKyAqIEF1dGhvcjogICAgICAgUGhpbGlwcGUgR2VydW0gPHJwbUB4ZW5vbWFpLm9yZz4KKyAqCisgKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA3IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQorICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2lmbmRlZiBfX0FTTV9CTEFDS0ZJTl9TTVBfSAorI2RlZmluZSBfX0FTTV9CTEFDS0ZJTl9TTVBfSAorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KKyNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgorI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgorI2luY2x1ZGUgPG1hY2gvc21wLmg+CisKKyNkZWZpbmUgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSAgYmxhY2tmaW5fY29yZV9pZCgpCisKK2V4dGVybiBjaGFyIGNvcmViX3RyYW1wb2xpbmVfc3RhcnQsIGNvcmViX3RyYW1wb2xpbmVfZW5kOworCitzdHJ1Y3QgY29yZWxvY2tfc2xvdCB7CisJaW50IGxvY2s7Cit9OworCit2b2lkIHNtcF9pY2FjaGVfZmx1c2hfcmFuZ2Vfb3RoZXJzKHVuc2lnbmVkIGxvbmcgc3RhcnQsCisJCQkJICAgdW5zaWduZWQgbG9uZyBlbmQpOworCisjZW5kaWYgLyogIV9fQVNNX0JMQUNLRklOX1NNUF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NwaW5sb2NrLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NwaW5sb2NrLmgKaW5kZXggNjRlOTA4YS4uMDI0OWFjMyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zcGlubG9jay5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc3BpbmxvY2suaApAQCAtMSw2ICsxLDg5IEBACiAjaWZuZGVmIF9fQkZJTl9TUElOTE9DS19ICiAjZGVmaW5lIF9fQkZJTl9TUElOTE9DS19ICiAKLSNlcnJvciBibGFja2ZpbiBhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCBTTVAgc3BpbiBsb2NrIHlldAorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KIAotI2VuZGlmCithc21saW5rYWdlIGludCBfX3Jhd19zcGluX2lzX2xvY2tlZF9hc20odm9sYXRpbGUgaW50ICpwdHIpOworYXNtbGlua2FnZSB2b2lkIF9fcmF3X3NwaW5fbG9ja19hc20odm9sYXRpbGUgaW50ICpwdHIpOworYXNtbGlua2FnZSBpbnQgX19yYXdfc3Bpbl90cnlsb2NrX2FzbSh2b2xhdGlsZSBpbnQgKnB0cik7Cithc21saW5rYWdlIHZvaWQgX19yYXdfc3Bpbl91bmxvY2tfYXNtKHZvbGF0aWxlIGludCAqcHRyKTsKK2FzbWxpbmthZ2Ugdm9pZCBfX3Jhd19yZWFkX2xvY2tfYXNtKHZvbGF0aWxlIGludCAqcHRyKTsKK2FzbWxpbmthZ2UgaW50IF9fcmF3X3JlYWRfdHJ5bG9ja19hc20odm9sYXRpbGUgaW50ICpwdHIpOworYXNtbGlua2FnZSB2b2lkIF9fcmF3X3JlYWRfdW5sb2NrX2FzbSh2b2xhdGlsZSBpbnQgKnB0cik7Cithc21saW5rYWdlIHZvaWQgX19yYXdfd3JpdGVfbG9ja19hc20odm9sYXRpbGUgaW50ICpwdHIpOworYXNtbGlua2FnZSBpbnQgX19yYXdfd3JpdGVfdHJ5bG9ja19hc20odm9sYXRpbGUgaW50ICpwdHIpOworYXNtbGlua2FnZSB2b2lkIF9fcmF3X3dyaXRlX3VubG9ja19hc20odm9sYXRpbGUgaW50ICpwdHIpOworCitzdGF0aWMgaW5saW5lIGludCBfX3Jhd19zcGluX2lzX2xvY2tlZChyYXdfc3BpbmxvY2tfdCAqbG9jaykKK3sKKwlyZXR1cm4gX19yYXdfc3Bpbl9pc19sb2NrZWRfYXNtKCZsb2NrLT5sb2NrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3NwaW5fbG9jayhyYXdfc3BpbmxvY2tfdCAqbG9jaykKK3sKKwlfX3Jhd19zcGluX2xvY2tfYXNtKCZsb2NrLT5sb2NrKTsKK30KKworI2RlZmluZSBfX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIF9fcmF3X3NwaW5fbG9jayhsb2NrKQorCitzdGF0aWMgaW5saW5lIGludCBfX3Jhd19zcGluX3RyeWxvY2socmF3X3NwaW5sb2NrX3QgKmxvY2spCit7CisJcmV0dXJuIF9fcmF3X3NwaW5fdHJ5bG9ja19hc20oJmxvY2stPmxvY2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfc3Bpbl91bmxvY2socmF3X3NwaW5sb2NrX3QgKmxvY2spCit7CisJX19yYXdfc3Bpbl91bmxvY2tfYXNtKCZsb2NrLT5sb2NrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3NwaW5fdW5sb2NrX3dhaXQocmF3X3NwaW5sb2NrX3QgKmxvY2spCit7CisJd2hpbGUgKF9fcmF3X3NwaW5faXNfbG9ja2VkKGxvY2spKQorCQljcHVfcmVsYXgoKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgX19yYXdfcmVhZF9jYW5fbG9jayhyYXdfcndsb2NrX3QgKnJ3KQoreworCXJldHVybiBfX3Jhd191bmNhY2hlZF9mZXRjaF9hc20oJnJ3LT5sb2NrKSA+IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fcmF3X3dyaXRlX2Nhbl9sb2NrKHJhd19yd2xvY2tfdCAqcncpCit7CisJcmV0dXJuIF9fcmF3X3VuY2FjaGVkX2ZldGNoX2FzbSgmcnctPmxvY2spID09IFJXX0xPQ0tfQklBUzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3JlYWRfbG9jayhyYXdfcndsb2NrX3QgKnJ3KQoreworCV9fcmF3X3JlYWRfbG9ja19hc20oJnJ3LT5sb2NrKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgX19yYXdfcmVhZF90cnlsb2NrKHJhd19yd2xvY2tfdCAqcncpCit7CisJcmV0dXJuIF9fcmF3X3JlYWRfdHJ5bG9ja19hc20oJnJ3LT5sb2NrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3JlYWRfdW5sb2NrKHJhd19yd2xvY2tfdCAqcncpCit7CisJX19yYXdfcmVhZF91bmxvY2tfYXNtKCZydy0+bG9jayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd193cml0ZV9sb2NrKHJhd19yd2xvY2tfdCAqcncpCit7CisJX19yYXdfd3JpdGVfbG9ja19hc20oJnJ3LT5sb2NrKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgX19yYXdfd3JpdGVfdHJ5bG9jayhyYXdfcndsb2NrX3QgKnJ3KQoreworCXJldHVybiBfX3Jhd193cml0ZV90cnlsb2NrX2FzbSgmcnctPmxvY2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfd3JpdGVfdW5sb2NrKHJhd19yd2xvY2tfdCAqcncpCit7CisJX19yYXdfd3JpdGVfdW5sb2NrX2FzbSgmcnctPmxvY2spOworfQorCisjZGVmaW5lIF9yYXdfc3Bpbl9yZWxheChsb2NrKSAgCWNwdV9yZWxheCgpCisjZGVmaW5lIF9yYXdfcmVhZF9yZWxheChsb2NrKQljcHVfcmVsYXgoKQorI2RlZmluZSBfcmF3X3dyaXRlX3JlbGF4KGxvY2spCWNwdV9yZWxheCgpCisKKyNlbmRpZiAvKiAgIV9fQkZJTl9TUElOTE9DS19IICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NwaW5sb2NrX3R5cGVzLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NwaW5sb2NrX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFlM2M0YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc3BpbmxvY2tfdHlwZXMuaApAQCAtMCwwICsxLDIyIEBACisjaWZuZGVmIF9fQVNNX1NQSU5MT0NLX1RZUEVTX0gKKyNkZWZpbmUgX19BU01fU1BJTkxPQ0tfVFlQRVNfSAorCisjaWZuZGVmIF9fTElOVVhfU1BJTkxPQ0tfVFlQRVNfSAorIyBlcnJvciAicGxlYXNlIGRvbid0IGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5IgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc20vcndsb2NrLmg+CisKK3R5cGVkZWYgc3RydWN0IHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbG9jazsKK30gcmF3X3NwaW5sb2NrX3Q7CisKKyNkZWZpbmUgX19SQVdfU1BJTl9MT0NLX1VOTE9DS0VECXsgMCB9CisKK3R5cGVkZWYgc3RydWN0IHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbG9jazsKK30gcmF3X3J3bG9ja190OworCisjZGVmaW5lIF9fUkFXX1JXX0xPQ0tfVU5MT0NLRUQJCXsgUldfTE9DS19CSUFTIH0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3N3YWIuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc3dhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YTA1MWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3N3YWIuaApAQCAtMCwwICsxLDQ4IEBACisjaWZuZGVmIF9CTEFDS0ZJTl9TV0FCX0gKKyNkZWZpbmUgX0JMQUNLRklOX1NXQUJfSAorCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKworI2lmIGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgfHwgZGVmaW5lZChfX0tFUk5FTF9fKQorIyAgZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KKyNlbmRpZgorCisjaWZkZWYgX19HTlVDX18KKworc3RhdGljIF9faW5saW5lX18gX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UzMiBfX2FyY2hfc3dhaGIzMihfX3UzMiB4eCkKK3sKKwlfX3UzMiB0bXA7CisJX19hc21fXygiJTEgPSAlMCA+PiA4IChWKTtcblx0IgorCQkiJTAgPSAlMCA8PCA4IChWKTtcblx0IgorCQkiJTAgPSAlMCB8ICUxO1xuXHQiCisJCTogIitkIih4eCksICI9JmQiKHRtcCkpOworCXJldHVybiB4eDsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWhiMzIgX19hcmNoX3N3YWhiMzIKKworc3RhdGljIF9faW5saW5lX18gX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UzMiBfX2FyY2hfc3dhaHczMihfX3UzMiB4eCkKK3sKKwlfX3UzMiBydjsKKwlfX2FzbV9fKCIlMCA9IFBBQ0soJTEuTCwgJTEuSCk7XG5cdCI6ICI9ZCIocnYpOiAiZCIoeHgpKTsKKwlyZXR1cm4gcnY7Cit9CisjZGVmaW5lIF9fYXJjaF9zd2FodzMyIF9fYXJjaF9zd2FodzMyCisKK3N0YXRpYyBfX2lubGluZV9fIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19hcmNoX3N3YWIzMihfX3UzMiB4eCkKK3sKKwlyZXR1cm4gX19hcmNoX3N3YWhiMzIoX19hcmNoX3N3YWh3MzIoeHgpKTsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWIzMiBfX2FyY2hfc3dhYjMyCisKK3N0YXRpYyBfX2lubGluZV9fIF9fYXR0cmlidXRlX2NvbnN0X18gX191MTYgX19hcmNoX3N3YWIxNihfX3UxNiB4eCkKK3sKKwlfX3UzMiB4dyA9IHh4OworCV9fYXNtX18oIiUwIDw8PSA4O1xuCSUwLkwgPSAlMC5MICsgJTAuSCAoTlMpO1xuIjogIitkIih4dykpOworCXJldHVybiAoX191MTYpeHc7Cit9CisjZGVmaW5lIF9fYXJjaF9zd2FiMTYgX19hcmNoX3N3YWIxNgorCisjZW5kaWYgLyogX19HTlVDX18gKi8KKworI2VuZGlmCQkJCS8qIF9CTEFDS0ZJTl9TV0FCX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc3lzdGVtLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3N5c3RlbS5oCmluZGV4IDhmMTYyN2QuLmE0YzgyNTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc3lzdGVtLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zeXN0ZW0uaApAQCAtMzcsMTE0ICszNyw5OCBAQAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPG1hY2gvYW5vbWFseS5oPgotCi0vKgotICogSW50ZXJydXB0IGNvbmZpZ3VyaW5nIG1hY3Jvcy4KLSAqLwotCi1leHRlcm4gdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7Ci0KLSNkZWZpbmUgbG9jYWxfaXJxX2VuYWJsZSgpIFwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyggXAotCQkic3RpICUwOyIgXAotCQk6IFwKLQkJOiAiZCIgKGlycV9mbGFncykgXAotCSkKLQotI2RlZmluZSBsb2NhbF9pcnFfZGlzYWJsZSgpIFwKLQlkbyB7IFwKLQkJaW50IF9fdG1wX2R1bW15OyBcCi0JCV9fYXNtX18gX192b2xhdGlsZV9fKCBcCi0JCQkiY2xpICUwOyIgXAotCQkJOiAiPWQiIChfX3RtcF9kdW1teSkgXAotCQkpOyBcCi0JfSB3aGlsZSAoMCkKLQotI2lmIEFOT01BTFlfMDUwMDAyNDQgJiYgZGVmaW5lZChDT05GSUdfQkZJTl9JQ0FDSEUpCi0jIGRlZmluZSBOT1BfUEFEX0FOT01BTFlfMDUwMDAyNDQgIm5vcDsgbm9wOyIKLSNlbHNlCi0jIGRlZmluZSBOT1BfUEFEX0FOT01BTFlfMDUwMDAyNDQKLSNlbmRpZgotCi0jZGVmaW5lIGlkbGVfd2l0aF9pcnFfZGlzYWJsZWQoKSBcCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oIFwKLQkJTk9QX1BBRF9BTk9NQUxZXzA1MDAwMjQ0IFwKLQkJIi5hbGlnbiA4OyIgXAotCQkic3RpICUwOyIgXAotCQkiaWRsZTsiIFwKLQkJOiBcCi0JCTogImQiIChpcnFfZmxhZ3MpIFwKLQkpCi0KLSNpZmRlZiBDT05GSUdfREVCVUdfSFdFUlIKLSMgZGVmaW5lIF9fc2F2ZV9hbmRfY2xpKHgpIFwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyggXAotCQkiY2xpICUwOyIgXAotCQkic3RpICUxOyIgXAotCQk6ICI9JmQiICh4KSBcCi0JCTogImQiICgweDNGKSBcCi0JKQotI2Vsc2UKLSMgZGVmaW5lIF9fc2F2ZV9hbmRfY2xpKHgpIFwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyggXAotCQkiY2xpICUwOyIgXAotCQk6ICI9JmQiICh4KSBcCi0JKQotI2VuZGlmCi0KLSNkZWZpbmUgbG9jYWxfc2F2ZV9mbGFncyh4KSBcCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oIFwKLQkJImNsaSAlMDsiIFwKLQkJInN0aSAlMDsiIFwKLQkJOiAiPWQiICh4KSBcCi0JKQotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0hXRVJSCi0jZGVmaW5lIGlycXNfZW5hYmxlZF9mcm9tX2ZsYWdzKHgpICgoKHgpICYgfjB4M2YpICE9IDApCi0jZWxzZQotI2RlZmluZSBpcnFzX2VuYWJsZWRfZnJvbV9mbGFncyh4KSAoKHgpICE9IDB4MWYpCi0jZW5kaWYKLQotI2RlZmluZSBsb2NhbF9pcnFfcmVzdG9yZSh4KSBcCi0JZG8geyBcCi0JCWlmIChpcnFzX2VuYWJsZWRfZnJvbV9mbGFncyh4KSkgXAotCQkJbG9jYWxfaXJxX2VuYWJsZSgpOyBcCi0JfSB3aGlsZSAoMCkKLQotLyogRm9yIHNwaW5sb2NrcyBldGMgKi8KLSNkZWZpbmUgbG9jYWxfaXJxX3NhdmUoeCkgX19zYXZlX2FuZF9jbGkoeCkKLQotI2RlZmluZQlpcnFzX2Rpc2FibGVkKCkJCQkJXAotKHsJCQkJCQlcCi0JdW5zaWduZWQgbG9uZyBmbGFnczsJCQlcCi0JbG9jYWxfc2F2ZV9mbGFncyhmbGFncyk7CQlcCi0JIWlycXNfZW5hYmxlZF9mcm9tX2ZsYWdzKGZsYWdzKTsJXAotfSkKKyNpbmNsdWRlIDxhc20vcGRhLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KIAogLyoKICAqIEZvcmNlIHN0cmljdCBDUFUgb3JkZXJpbmcuCiAgKi8KLSNkZWZpbmUgbm9wKCkgIGFzbSB2b2xhdGlsZSAoIm5vcDtcblx0Ijo6KQotI2RlZmluZSBtYigpICAgYXNtIHZvbGF0aWxlICgiIiAgIDogOiA6Im1lbW9yeSIpCi0jZGVmaW5lIHJtYigpICBhc20gdm9sYXRpbGUgKCIiICAgOiA6IDoibWVtb3J5IikKLSNkZWZpbmUgd21iKCkgIGFzbSB2b2xhdGlsZSAoIiIgICA6IDogOiJtZW1vcnkiKQorI2RlZmluZSBub3AoKSAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJub3A7XG5cdCIgOiA6ICkKKyNkZWZpbmUgbWIoKSAgIF9fYXNtX18gX192b2xhdGlsZV9fICgiIiAgIDogOiA6ICJtZW1vcnkiKQorI2RlZmluZSBybWIoKSAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCIiICAgOiA6IDogIm1lbW9yeSIpCisjZGVmaW5lIHdtYigpICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIiIgICA6IDogOiAibWVtb3J5IikKICNkZWZpbmUgc2V0X21iKHZhciwgdmFsdWUpIGRvIHsgKHZvaWQpIHhjaGcoJnZhciwgdmFsdWUpOyB9IHdoaWxlICgwKQotCiAjZGVmaW5lIHJlYWRfYmFycmllcl9kZXBlbmRzKCkgCQlkbyB7IH0gd2hpbGUoMCkKIAogI2lmZGVmIENPTkZJR19TTVAKLSNkZWZpbmUgc21wX21iKCkJbWIoKQotI2RlZmluZSBzbXBfcm1iKCkJcm1iKCkKLSNkZWZpbmUgc21wX3dtYigpCXdtYigpCi0jZGVmaW5lIHNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpCXJlYWRfYmFycmllcl9kZXBlbmRzKCkKK2FzbWxpbmthZ2UgdW5zaWduZWQgbG9uZyBfX3Jhd194Y2hnXzFfYXNtKHZvbGF0aWxlIHZvaWQgKnB0ciwgdW5zaWduZWQgbG9uZyB2YWx1ZSk7Cithc21saW5rYWdlIHVuc2lnbmVkIGxvbmcgX19yYXdfeGNoZ18yX2FzbSh2b2xhdGlsZSB2b2lkICpwdHIsIHVuc2lnbmVkIGxvbmcgdmFsdWUpOworYXNtbGlua2FnZSB1bnNpZ25lZCBsb25nIF9fcmF3X3hjaGdfNF9hc20odm9sYXRpbGUgdm9pZCAqcHRyLCB1bnNpZ25lZCBsb25nIHZhbHVlKTsKK2FzbWxpbmthZ2UgdW5zaWduZWQgbG9uZyBfX3Jhd19jbXB4Y2hnXzFfYXNtKHZvbGF0aWxlIHZvaWQgKnB0ciwKKwkJCQkJdW5zaWduZWQgbG9uZyBuZXcsIHVuc2lnbmVkIGxvbmcgb2xkKTsKK2FzbWxpbmthZ2UgdW5zaWduZWQgbG9uZyBfX3Jhd19jbXB4Y2hnXzJfYXNtKHZvbGF0aWxlIHZvaWQgKnB0ciwKKwkJCQkJdW5zaWduZWQgbG9uZyBuZXcsIHVuc2lnbmVkIGxvbmcgb2xkKTsKK2FzbWxpbmthZ2UgdW5zaWduZWQgbG9uZyBfX3Jhd19jbXB4Y2hnXzRfYXNtKHZvbGF0aWxlIHZvaWQgKnB0ciwKKwkJCQkJdW5zaWduZWQgbG9uZyBuZXcsIHVuc2lnbmVkIGxvbmcgb2xkKTsKKworI2lmZGVmIF9fQVJDSF9TWU5DX0NPUkVfRENBQ0hFCisjIGRlZmluZSBzbXBfbWIoKQlkbyB7IGJhcnJpZXIoKTsgc21wX2NoZWNrX2JhcnJpZXIoKTsgc21wX21hcmtfYmFycmllcigpOyB9IHdoaWxlICgwKQorIyBkZWZpbmUgc21wX3JtYigpCWRvIHsgYmFycmllcigpOyBzbXBfY2hlY2tfYmFycmllcigpOyB9IHdoaWxlICgwKQorIyBkZWZpbmUgc21wX3dtYigpCWRvIHsgYmFycmllcigpOyBzbXBfbWFya19iYXJyaWVyKCk7IH0gd2hpbGUgKDApCisjZGVmaW5lIHNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpCWRvIHsgYmFycmllcigpOyBzbXBfY2hlY2tfYmFycmllcigpOyB9IHdoaWxlICgwKQorCiAjZWxzZQorIyBkZWZpbmUgc21wX21iKCkJYmFycmllcigpCisjIGRlZmluZSBzbXBfcm1iKCkJYmFycmllcigpCisjIGRlZmluZSBzbXBfd21iKCkJYmFycmllcigpCisjZGVmaW5lIHNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpCWJhcnJpZXIoKQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX3hjaGcodW5zaWduZWQgbG9uZyB4LCB2b2xhdGlsZSB2b2lkICpwdHIsCisJCQkJICAgaW50IHNpemUpCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisKKwlzd2l0Y2ggKHNpemUpIHsKKwljYXNlIDE6CisJCXRtcCA9IF9fcmF3X3hjaGdfMV9hc20ocHRyLCB4KTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQl0bXAgPSBfX3Jhd194Y2hnXzJfYXNtKHB0ciwgeCk7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJdG1wID0gX19yYXdfeGNoZ180X2FzbShwdHIsIHgpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gdG1wOworfQorCisvKgorICogQXRvbWljIGNvbXBhcmUgYW5kIGV4Y2hhbmdlLiAgQ29tcGFyZSBPTEQgd2l0aCBNRU0sIGlmIGlkZW50aWNhbCwKKyAqIHN0b3JlIE5FVyBpbiBNRU0uICBSZXR1cm4gdGhlIGluaXRpYWwgdmFsdWUgaW4gTUVNLiAgU3VjY2VzcyBpcworICogaW5kaWNhdGVkIGJ5IGNvbXBhcmluZyBSRVRVUk4gd2l0aCBPTEQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX2NtcHhjaGcodm9sYXRpbGUgdm9pZCAqcHRyLCB1bnNpZ25lZCBsb25nIG9sZCwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIG5ldywgaW50IHNpemUpCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisKKwlzd2l0Y2ggKHNpemUpIHsKKwljYXNlIDE6CisJCXRtcCA9IF9fcmF3X2NtcHhjaGdfMV9hc20ocHRyLCBuZXcsIG9sZCk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJdG1wID0gX19yYXdfY21weGNoZ18yX2FzbShwdHIsIG5ldywgb2xkKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQl0bXAgPSBfX3Jhd19jbXB4Y2hnXzRfYXNtKHB0ciwgbmV3LCBvbGQpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gdG1wOworfQorI2RlZmluZSBjbXB4Y2hnKHB0ciwgbywgbikgXAorCSgoX190eXBlb2ZfXygqKHB0cikpKV9fY21weGNoZygocHRyKSwgKHVuc2lnbmVkIGxvbmcpKG8pLCBcCisJCSh1bnNpZ25lZCBsb25nKShuKSwgc2l6ZW9mKCoocHRyKSkpKQorCisjZWxzZSAvKiAhQ09ORklHX1NNUCAqLworCiAjZGVmaW5lIHNtcF9tYigpCWJhcnJpZXIoKQogI2RlZmluZSBzbXBfcm1iKCkJYmFycmllcigpCiAjZGVmaW5lIHNtcF93bWIoKQliYXJyaWVyKCkKICNkZWZpbmUgc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCkJZG8geyB9IHdoaWxlKDApCi0jZW5kaWYKLQotI2RlZmluZSB4Y2hnKHB0cix4KSAoKF9fdHlwZW9mX18oKihwdHIpKSlfX3hjaGcoKHVuc2lnbmVkIGxvbmcpKHgpLChwdHIpLHNpemVvZigqKHB0cikpKSkKIAogc3RydWN0IF9feGNoZ19kdW1teSB7CiAJdW5zaWduZWQgbG9uZyBhWzEwMF07CkBAIC0xNTcsNyArMTQxLDcgQEAKIAl1bnNpZ25lZCBsb25nIHRtcCA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOwogCiAJc3dpdGNoIChzaXplKSB7CiAJY2FzZSAxOgpAQCAtMTc5LDcgKzE2Myw3IEBACiAJCQkgOiAiPSZkIiAodG1wKSA6ICJkIiAoeCksICJtIiAoKl9feGcocHRyKSkgOiAibWVtb3J5Iik7CiAJCWJyZWFrOwogCX0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogCXJldHVybiB0bXA7CiB9CiAKQEAgLTE5NCw5ICsxNzgsMTIgQEAKIAkJCSh1bnNpZ25lZCBsb25nKShuKSwgc2l6ZW9mKCoocHRyKSkpKQogI2RlZmluZSBjbXB4Y2hnNjRfbG9jYWwocHRyLCBvLCBuKSBfX2NtcHhjaGc2NF9sb2NhbF9nZW5lcmljKChwdHIpLCAobyksIChuKSkKIAotI2lmbmRlZiBDT05GSUdfU01QCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvY21weGNoZy5oPgotI2VuZGlmCisKKyNlbmRpZiAvKiAhQ09ORklHX1NNUCAqLworCisjZGVmaW5lIHhjaGcocHRyLCB4KSAoKF9fdHlwZW9mX18oKihwdHIpKSlfX3hjaGcoKHVuc2lnbmVkIGxvbmcpKHgpLCAocHRyKSwgc2l6ZW9mKCoocHRyKSkpKQorI2RlZmluZSB0YXMocHRyKSAoKHZvaWQpeGNoZygocHRyKSwgMSkpCiAKICNkZWZpbmUgcHJlcGFyZV90b19zd2l0Y2goKSAgICAgZG8geyB9IHdoaWxlKDApCiAKQEAgLTIwNSwxMCArMTkyLDEyIEBACiAgKiBwdHIgaXNuJ3QgdGhlIGN1cnJlbnQgdGFzaywgaW4gd2hpY2ggY2FzZSBpdCBkb2VzIG5vdGhpbmcuCiAgKi8KIAotI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgorI2luY2x1ZGUgPGFzbS9sMWxheW91dC5oPgorI2luY2x1ZGUgPGFzbS9tZW1fbWFwLmg+CiAKIGFzbWxpbmthZ2Ugc3RydWN0IHRhc2tfc3RydWN0ICpyZXN1bWUoc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHQpOwogCisjaWZuZGVmIENPTkZJR19TTVAKICNkZWZpbmUgc3dpdGNoX3RvKHByZXYsbmV4dCxsYXN0KSBcCiBkbyB7ICAgIFwKIAltZW1jcHkgKCZ0YXNrX3RocmVhZF9pbmZvKHByZXYpLT5sMV90YXNrX2luZm8sIEwxX1NDUkFUQ0hfVEFTS19JTkZPLCBcCkBAIC0yMTcsNSArMjA2LDExIEBACiAJCXNpemVvZiAqTDFfU0NSQVRDSF9UQVNLX0lORk8pOyBcCiAJKGxhc3QpID0gcmVzdW1lIChwcmV2LCBuZXh0KTsgICBcCiB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgc3dpdGNoX3RvKHByZXYsIG5leHQsIGxhc3QpIFwKK2RvIHsgICAgXAorCShsYXN0KSA9IHJlc3VtZShwcmV2LCBuZXh0KTsgICBcCit9IHdoaWxlICgwKQorI2VuZGlmCiAKLSNlbmRpZgkJCQkvKiBfQkxBQ0tGSU5fU1lTVEVNX0ggKi8KKyNlbmRpZgkvKiBfQkxBQ0tGSU5fU1lTVEVNX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAppbmRleCA2NDI3NjkzLi5lNzIxY2U1IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCkBAIC00NCw2ICs0NCw3IEBACiAgKi8KICNkZWZpbmUgVEhSRUFEX1NJWkVfT1JERVIJMQogI2RlZmluZSBUSFJFQURfU0laRQkJODE5MgkvKiAyIHBhZ2VzICovCisjZGVmaW5lIFNUQUNLX1dBUk4JCShUSFJFQURfU0laRS84KQogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCkBAIC02Miw3ICs2Myw5IEBACiAJaW50IHByZWVtcHRfY291bnQ7CS8qIDAgPT4gcHJlZW1wdGFibGUsIDwwID0+IEJVRyAqLwogCW1tX3NlZ21lbnRfdCBhZGRyX2xpbWl0OwkvKiBhZGRyZXNzIGxpbWl0ICovCiAJc3RydWN0IHJlc3RhcnRfYmxvY2sgcmVzdGFydF9ibG9jazsKKyNpZm5kZWYgQ09ORklHX1NNUAogCXN0cnVjdCBsMV9zY3JhdGNoX3Rhc2tfaW5mbyBsMV90YXNrX2luZm87CisjZW5kaWYKIH07CiAKIC8qCkBAIC05MCw3ICs5Myw3IEBACiBzdGF0aWMgaW5saW5lIHN0cnVjdCB0aHJlYWRfaW5mbyAqY3VycmVudF90aHJlYWRfaW5mbyh2b2lkKQogewogCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGk7Ci0gICAgICBfX2FzbV9fKCIlMCA9IHNwOyI6ICI9JmQiKHRpKToKKyAgICAgIF9fYXNtX18oIiUwID0gc3A7IiA6ICI9ZGEiKHRpKSA6CiAJKTsKIAlyZXR1cm4gKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSgobG9uZyl0aSAmIH4oKGxvbmcpVEhSRUFEX1NJWkUtMSkpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS91YWNjZXNzLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAppbmRleCBkOTI4YjgwLi4zMjQ4MDMzIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaApAQCAtMTQ5LDU0ICsxNDksNDIgQEAKIAkJIDogLyogbm8gb3V0cHV0cyAqLwkJCVwKIAkJIDoiZCIgKHgpLCJhIiAoX19wdHIocCkpIDogIm1lbW9yeSIpCiAKLSNkZWZpbmUgZ2V0X3VzZXIoeCxwKQkJCQkJCQlcCi0JKHsJCQkJCQkJCVwKLQkJaW50IF9lcnIgPSAwOwkJCQkJCVwKLQkJdHlwZW9mKCoocCkpICpfcCA9IChwKTsJCQkJCVwKLQkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIF9wLCBzaXplb2YoKihfcCkpKSkgewlcCi0JCQlfZXJyID0gLUVGQVVMVDsJCQkJCVwKLQkJfQkJCQkJCQlcCi0JCWVsc2UgewkJCQkJCQlcCi0JCXN3aXRjaCAoc2l6ZW9mKCooX3ApKSkgewkJCQlcCi0JCWNhc2UgMToJCQkJCQkJXAotCQkJX19nZXRfdXNlcl9hc20oeCwgX3AsIEIsKFopKTsJCQlcCi0JCQlicmVhazsJCQkJCQlcCi0JCWNhc2UgMjoJCQkJCQkJXAotCQkJX19nZXRfdXNlcl9hc20oeCwgX3AsIFcsKFopKTsJCQlcCi0JCQlicmVhazsJCQkJCQlcCi0JCWNhc2UgNDoJCQkJCQkJXAotCQkJX19nZXRfdXNlcl9hc20oeCwgX3AsICAsICk7CQkJXAotCQkJYnJlYWs7CQkJCQkJXAotCQljYXNlIDg6IHsJCQkJCQlcCi0JCQl1bnNpZ25lZCBsb25nIF94bCwgX3hoOwkJCQlcCi0JCQlfX2dldF91c2VyX2FzbShfeGwsICgodW5zaWduZWQgbG9uZyAqKV9wKSswLCAgLCApOyBcCi0JCQlfX2dldF91c2VyX2FzbShfeGgsICgodW5zaWduZWQgbG9uZyAqKV9wKSsxLCAgLCApOyBcCi0JCQkoKHVuc2lnbmVkIGxvbmcgKikmeClbMF0gPSBfeGw7CQkJXAotCQkJKCh1bnNpZ25lZCBsb25nICopJngpWzFdID0gX3hoOwkJCVwKLQkJfSBicmVhazsJCQkJCQlcCi0JCWRlZmF1bHQ6CQkJCQkJXAotCQkJeCA9IDA7CQkJCQkJXAotCQkJcHJpbnRrKEtFUk5fSU5GTyAiZ2V0X3VzZXJfYmFkOiAlczolZCAlc1xuIiwgICAgXAotCQkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOwlcCi0JCQlfZXJyID0gX19nZXRfdXNlcl9iYWQoKTsJCQlcCi0JCQlicmVhazsJCQkJCQlcCi0JCX0JCQkJCQkJXAotCQl9CQkJCQkJCVwKLQkJX2VycjsJCQkJCQkJXAotCX0pCisjZGVmaW5lIGdldF91c2VyKHgsIHB0cikJCQkJCVwKKyh7CQkJCQkJCQlcCisJaW50IF9lcnIgPSAwOwkJCQkJCVwKKwl1bnNpZ25lZCBsb25nIF92YWwgPSAwOwkJCQkJXAorCWNvbnN0IHR5cGVvZigqKHB0cikpIF9fdXNlciAqX3AgPSAocHRyKTsJCVwKKwljb25zdCBzaXplX3QgcHRyX3NpemUgPSBzaXplb2YoKihfcCkpOwkJCVwKKwlpZiAobGlrZWx5KGFjY2Vzc19vayhWRVJJRllfUkVBRCwgX3AsIHB0cl9zaXplKSkpIHsJXAorCQlCVUlMRF9CVUdfT04ocHRyX3NpemUgPj0gOCk7CQkJXAorCQlzd2l0Y2ggKHB0cl9zaXplKSB7CQkJCVwKKwkJY2FzZSAxOgkJCQkJCVwKKwkJCV9fZ2V0X3VzZXJfYXNtKF92YWwsIF9wLCBCLChaKSk7CVwKKwkJCWJyZWFrOwkJCQkJXAorCQljYXNlIDI6CQkJCQkJXAorCQkJX19nZXRfdXNlcl9hc20oX3ZhbCwgX3AsIFcsKFopKTsJXAorCQkJYnJlYWs7CQkJCQlcCisJCWNhc2UgNDoJCQkJCQlcCisJCQlfX2dldF91c2VyX2FzbShfdmFsLCBfcCwgICwgKTsJCVwKKwkJCWJyZWFrOwkJCQkJXAorCQl9CQkJCQkJXAorCX0gZWxzZQkJCQkJCQlcCisJCV9lcnIgPSAtRUZBVUxUOwkJCQkJXAorCXggPSAodHlwZW9mKCoocHRyKSkpX3ZhbDsJCQkJXAorCV9lcnI7CQkJCQkJCVwKK30pCiAKICNkZWZpbmUgX19nZXRfdXNlcih4LHApIGdldF91c2VyKHgscCkKIAogI2RlZmluZSBfX2dldF91c2VyX2JhZCgpIChiYWRfdXNlcl9hY2Nlc3NfbGVuZ3RoKCksICgtRUZBVUxUKSkKIAotI2RlZmluZSBfX2dldF91c2VyX2FzbSh4LHAsYmh3LG9wdGlvbikJCQkJXAotCXsJCQkJCQkJXAotCQl1bnNpZ25lZCBsb25nIF90bXA7CQkJCVwKLQkJX19hc21fXyAoIiUwID0iICNiaHcgIlslMV0iI29wdGlvbiI7XG5cdCIJXAotCQkJIDogIj1kIiAoX3RtcCkJCQkJXAotCQkJIDogImEiIChfX3B0cihwKSkpOwkJCVwKLQkJKHgpID0gKF9fdHlwZW9mX18oKihwKSkpIF90bXA7CQkJXAotCX0KKyNkZWZpbmUgX19nZXRfdXNlcl9hc20oeCwgcHRyLCBiaHcsIG9wdGlvbikJXAorKHsJCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAkJCVwKKwkJIiUwID0iICNiaHcgIlslMV0iICNvcHRpb24gIjsiCVwKKwkJOiAiPWQiICh4KQkJCVwKKwkJOiAiYSIgKF9fcHRyKHB0cikpKTsJCVwKK30pCiAKICNkZWZpbmUgX19jb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbikgY29weV9mcm9tX3VzZXIodG8sIGZyb20sIG4pCiAjZGVmaW5lIF9fY29weV90b191c2VyKHRvLCBmcm9tLCBuKSBjb3B5X3RvX3VzZXIodG8sIGZyb20sIG4pCkBAIC0yMDksOCArMTk3LDggQEAKICNkZWZpbmUgY29weV9mcm9tX3VzZXJfcmV0KHRvLGZyb20sbixyZXR2YWwpICh7IGlmIChjb3B5X2Zyb21fdXNlcih0byxmcm9tLG4pKVwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7IH0pCiAKLXN0YXRpYyBpbmxpbmUgbG9uZyBjb3B5X2Zyb21fdXNlcih2b2lkICp0bywKLQkJCQkgIGNvbnN0IHZvaWQgX191c2VyICogZnJvbSwgdW5zaWduZWQgbG9uZyBuKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjaworY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCiB7CiAJaWYgKGFjY2Vzc19vayhWRVJJRllfUkVBRCwgZnJvbSwgbikpCiAJCW1lbWNweSh0bywgZnJvbSwgbik7CkBAIC0yMTksOCArMjA3LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBsb25nIGNvcHlfdG9fdXNlcih2b2lkICp0bywKLQkJCQljb25zdCB2b2lkIF9fdXNlciAqIGZyb20sIHVuc2lnbmVkIGxvbmcgbikKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sKK2NvcHlfdG9fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKIHsKIAlpZiAoYWNjZXNzX29rKFZFUklGWV9XUklURSwgdG8sIG4pKQogCQltZW1jcHkodG8sIGZyb20sIG4pOwpAQCAtMjMzLDggKzIyMSw4IEBACiAgKiBDb3B5IGEgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZyBmcm9tIHVzZXJzcGFjZS4KICAqLwogCi1zdGF0aWMgaW5saW5lIGxvbmcgc3RybmNweV9mcm9tX3VzZXIoY2hhciAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnNyYywgbG9uZyBjb3VudCkKK3N0YXRpYyBpbmxpbmUgbG9uZyBfX211c3RfY2hlY2sKK3N0cm5jcHlfZnJvbV91c2VyKGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBsb25nIGNvdW50KQogewogCWNoYXIgKnRtcDsKIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgc3JjLCAxKSkKQEAgLTI2MCw3ICsyNDgsOCBAQAogICogWmVybyBVc2Vyc3BhY2UKICAqLwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19jbGVhcl91c2VyKHZvaWQgKnRvLCB1bnNpZ25lZCBsb25nIG4pCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrCitfX2NsZWFyX3VzZXIodm9pZCAqdG8sIHVuc2lnbmVkIGxvbmcgbikKIHsKIAltZW1zZXQodG8sIDAsIG4pOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS94b3IuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20veG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgyZWIxMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20veG9yLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL3hvci5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9NYWtlZmlsZQppbmRleCA2MDZhZGM3Li4zOGEyMzMzIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9NYWtlZmlsZQpAQCAtNyw3ICs3LDcgQEAKIG9iai15IDo9IFwKIAllbnRyeS5vIHByb2Nlc3MubyBiZmluX2tzeW1zLm8gcHRyYWNlLm8gc2V0dXAubyBzaWduYWwubyBcCiAJc3lzX2JmaW4ubyB0cmFwcy5vIGlycWNoaXAubyBkbWEtbWFwcGluZy5vIGZsYXQubyBcCi0JZml4ZWRfY29kZS5vIHJlYm9vdC5vIGJmaW5fZ3Bpby5vCisJZml4ZWRfY29kZS5vIHJlYm9vdC5vIGJmaW5fZ3Bpby5vIGJmaW5fZG1hXzV4eC5vCiAKIGlmZXEgKCQoQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFMpLHkpCiAgICAgb2JqLXkgKz0gdGltZS10cy5vCkBAIC0xNSw4ICsxNSwxMSBAQAogICAgIG9iai15ICs9IHRpbWUubwogZW5kaWYKIAorb2JqLSQoQ09ORklHX0lQSVBFKSAgICAgICAgICAgICAgICAgICs9IGlwaXBlLm8KK29iai0kKENPTkZJR19JUElQRV9UUkFDRV9NQ09VTlQpICAgICArPSBtY291bnQubwogb2JqLSQoQ09ORklHX0JGSU5fR1BUSU1FUlMpICAgICAgICAgICs9IGdwdGltZXJzLm8KK29iai0kKENPTkZJR19DUExCX0lORk8pICAgICAgICAgICAgICArPSBjcGxiaW5mby5vCiBvYmotJChDT05GSUdfTU9EVUxFUykgICAgICAgICAgICAgICAgKz0gbW9kdWxlLm8KLW9iai0kKENPTkZJR19CRklOX0RNQV81WFgpICAgICAgICAgICArPSBiZmluX2RtYV81eHgubwogb2JqLSQoQ09ORklHX0tHREIpICAgICAgICAgICAgICAgICAgICs9IGtnZGIubworb2JqLSQoQ09ORklHX0tHREJfVEVTVENBU0UpICAgICAgICAgICs9IGtnZGJfdGVzdC5vCiBvYmotJChDT05GSUdfRUFSTFlfUFJJTlRLKSAgICAgICAgICAgKz0gZWFybHlfcHJpbnRrLm8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9hc20tb2Zmc2V0cy5jCmluZGV4IDliYjg1ZGQuLmI1ZGY5NDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2FzbS1vZmZzZXRzLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtNTYsNiArNTYsOSBAQAogCS8qIG9mZnNldHMgaW50byB0aGUgdGhyZWFkIHN0cnVjdCAqLwogCURFRklORShUSFJFQURfS1NQLCBvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX3N0cnVjdCwga3NwKSk7CiAJREVGSU5FKFRIUkVBRF9VU1AsIG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfc3RydWN0LCB1c3ApKTsKKwlERUZJTkUoVEhSRUFEX1NSLCBvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX3N0cnVjdCwgc2Vxc3RhdCkpOworCURFRklORShQVF9TUiwgb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9zdHJ1Y3QsIHNlcXN0YXQpKTsKKwlERUZJTkUoVEhSRUFEX0VTUDAsIG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfc3RydWN0LCBlc3AwKSk7CiAJREVGSU5FKFRIUkVBRF9QQywgb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9zdHJ1Y3QsIHBjKSk7CiAJREVGSU5FKEtFUk5FTF9TVEFDS19TSVpFLCBUSFJFQURfU0laRSk7CiAKQEAgLTEyOCw1ICsxMzEsMzEgQEAKIAlERUZJTkUoU0lHU0VHViwgU0lHU0VHVik7CiAJREVGSU5FKFNJR1RSQVAsIFNJR1RSQVApOwogCisJLyogUERBIG1hbmFnZW1lbnQgKGluIEwxIHNjcmF0Y2hwYWQpICovCisJREVGSU5FKFBEQV9TWVNDRkcsIG9mZnNldG9mKHN0cnVjdCBibGFja2Zpbl9wZGEsIHN5c2NmZykpOworI2lmZGVmIENPTkZJR19TTVAKKwlERUZJTkUoUERBX0lSUUZMQUdTLCBvZmZzZXRvZihzdHJ1Y3QgYmxhY2tmaW5fcGRhLCBpbWFzaykpOworI2VuZGlmCisJREVGSU5FKFBEQV9JUERULCBvZmZzZXRvZihzdHJ1Y3QgYmxhY2tmaW5fcGRhLCBpcGR0KSk7CisJREVGSU5FKFBEQV9JUERUX1NXQVBDT1VOVCwgb2Zmc2V0b2Yoc3RydWN0IGJsYWNrZmluX3BkYSwgaXBkdF9zd2FwY291bnQpKTsKKwlERUZJTkUoUERBX0RQRFQsIG9mZnNldG9mKHN0cnVjdCBibGFja2Zpbl9wZGEsIGRwZHQpKTsKKwlERUZJTkUoUERBX0RQRFRfU1dBUENPVU5ULCBvZmZzZXRvZihzdHJ1Y3QgYmxhY2tmaW5fcGRhLCBkcGR0X3N3YXBjb3VudCkpOworCURFRklORShQREFfRVhJUFRSLCBvZmZzZXRvZihzdHJ1Y3QgYmxhY2tmaW5fcGRhLCBleF9pcHRyKSk7CisJREVGSU5FKFBEQV9FWE9QVFIsIG9mZnNldG9mKHN0cnVjdCBibGFja2Zpbl9wZGEsIGV4X29wdHIpKTsKKwlERUZJTkUoUERBX0VYQlVGLCBvZmZzZXRvZihzdHJ1Y3QgYmxhY2tmaW5fcGRhLCBleF9idWYpKTsKKwlERUZJTkUoUERBX0VYSU1BU0ssIG9mZnNldG9mKHN0cnVjdCBibGFja2Zpbl9wZGEsIGV4X2ltYXNrKSk7CisJREVGSU5FKFBEQV9FWFNUQUNLLCBvZmZzZXRvZihzdHJ1Y3QgYmxhY2tmaW5fcGRhLCBleF9zdGFjaykpOworI2lmZGVmIEFOT01BTFlfMDUwMDAyNjEKKwlERUZJTkUoUERBX0xGUkVUWCwgb2Zmc2V0b2Yoc3RydWN0IGJsYWNrZmluX3BkYSwgbGFzdF9jcGxiX2ZhdWx0X3JldHgpKTsKKyNlbmRpZgorCURFRklORShQREFfRENQTEIsIG9mZnNldG9mKHN0cnVjdCBibGFja2Zpbl9wZGEsIGRjcGxiX2ZhdWx0X2FkZHIpKTsKKwlERUZJTkUoUERBX0lDUExCLCBvZmZzZXRvZihzdHJ1Y3QgYmxhY2tmaW5fcGRhLCBpY3BsYl9mYXVsdF9hZGRyKSk7CisJREVGSU5FKFBEQV9SRVRYLCBvZmZzZXRvZihzdHJ1Y3QgYmxhY2tmaW5fcGRhLCByZXR4KSk7CisJREVGSU5FKFBEQV9TRVFTVEFULCBvZmZzZXRvZihzdHJ1Y3QgYmxhY2tmaW5fcGRhLCBzZXFzdGF0KSk7CisjaWZkZWYgQ09ORklHX1NNUAorCS8qIEludGVyLWNvcmUgbG9jayAoaW4gTDIgU1JBTSkgKi8KKwlERUZJTkUoU0laRU9GX0NPUkVMT0NLLCBzaXplb2Yoc3RydWN0IGNvcmVsb2NrX3Nsb3QpKTsKKyNlbmRpZgorCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9iZmluX2RtYV81eHguYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2JmaW5fZG1hXzV4eC5jCmluZGV4IDMzOTI5M2QuLjA3ZTAyYzAgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2JmaW5fZG1hXzV4eC5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2JmaW5fZG1hXzV4eC5jCkBAIC0xLDYzICsxLDI3IEBACiAvKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL2tlcm5lbC9iZmluX2RtYV81eHguYwotICogQmFzZWQgb246Ci0gKiBBdXRob3I6CisgKiBiZmluX2RtYV81eHguYyAtIEJsYWNrZmluIERNQSBpbXBsZW1lbnRhdGlvbgogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgc2ltcGxlIERNQSBJbXBsZW1lbnRhdGlvbiBmb3IgQmxhY2tmaW4KLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+Ci0jaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKLS8qIFJlbW92ZSB1bnVzZWQgY29kZSBub3QgZXhwb3J0ZWQgYnkgc3ltYm9sIG9yIGludGVybmFsbHkgY2FsbGVkICovCi0jZGVmaW5lIFJFTU9WRV9ERUFEX0NPREUKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBHbG9iYWwgVmFyaWFibGVzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBzdHJ1Y3QgZG1hX2NoYW5uZWwgZG1hX2NoW01BWF9CTEFDS0ZJTl9ETUFfQ0hBTk5FTF07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgICAgICBTZXQgdGhlIEJ1ZmZlciBDbGVhciBiaXQgaW4gdGhlIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgb2Ygc3BlY2lmaWMgRE1BCi0gKiAgICAgICBjaGFubmVsLiBUaGlzIHdpbGwgc3RvcCB0aGUgZGVzY3JpcHRvciBiYXNlZCBETUEgb3BlcmF0aW9uLgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdm9pZCBjbGVhcl9kbWFfYnVmZmVyKHVuc2lnbmVkIGludCBjaGFubmVsKQotewotCWRtYV9jaFtjaGFubmVsXS5yZWdzLT5jZmcgfD0gUkVTVEFSVDsKLQlTU1lOQygpOwotCWRtYV9jaFtjaGFubmVsXS5yZWdzLT5jZmcgJj0gflJFU1RBUlQ7Ci0JU1NZTkMoKTsKLX0KK3N0cnVjdCBkbWFfY2hhbm5lbCBkbWFfY2hbTUFYX0RNQV9DSEFOTkVMU107CitFWFBPUlRfU1lNQk9MKGRtYV9jaCk7CiAKIHN0YXRpYyBpbnQgX19pbml0IGJsYWNrZmluX2RtYV9pbml0KHZvaWQpCiB7CkBAIC02NSwzMiArMjksNjcgQEAKIAogCXByaW50ayhLRVJOX0lORk8gIkJsYWNrZmluIERNQSBDb250cm9sbGVyXG4iKTsKIAotCWZvciAoaSA9IDA7IGkgPCBNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUw7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBNQVhfRE1BX0NIQU5ORUxTOyBpKyspIHsKIAkJZG1hX2NoW2ldLmNoYW5fc3RhdHVzID0gRE1BX0NIQU5ORUxfRlJFRTsKIAkJZG1hX2NoW2ldLnJlZ3MgPSBkbWFfaW9fYmFzZV9hZGRyW2ldOwogCQltdXRleF9pbml0KCYoZG1hX2NoW2ldLmRtYWxvY2spKTsKIAl9CiAJLyogTWFyayBNRU1ETUEgQ2hhbm5lbCAwIGFzIHJlcXVlc3RlZCBzaW5jZSB3ZSdyZSB1c2luZyBpdCBpbnRlcm5hbGx5ICovCi0JZG1hX2NoW0NIX01FTV9TVFJFQU0wX0RFU1RdLmNoYW5fc3RhdHVzID0gRE1BX0NIQU5ORUxfUkVRVUVTVEVEOwotCWRtYV9jaFtDSF9NRU1fU1RSRUFNMF9TUkNdLmNoYW5fc3RhdHVzID0gRE1BX0NIQU5ORUxfUkVRVUVTVEVEOworCXJlcXVlc3RfZG1hKENIX01FTV9TVFJFQU0wX0RFU1QsICJCbGFja2ZpbiBkbWFfbWVtY3B5Iik7CisJcmVxdWVzdF9kbWEoQ0hfTUVNX1NUUkVBTTBfU1JDLCAiQmxhY2tmaW4gZG1hX21lbWNweSIpOwogCiAjaWYgZGVmaW5lZChDT05GSUdfREVCX0RNQV9VUkdFTlQpCiAJYmZpbl93cml0ZV9FQklVX0REUlFVRShiZmluX3JlYWRfRUJJVV9ERFJRVUUoKQogCQkJIHwgREVCMV9VUkdFTlQgfCBERUIyX1VSR0VOVCB8IERFQjNfVVJHRU5UKTsKICNlbmRpZgorCisJcmV0dXJuIDA7Cit9CithcmNoX2luaXRjYWxsKGJsYWNrZmluX2RtYV9pbml0KTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgaW50IHByb2NfZG1hX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9ETUFfQ0hBTk5FTFM7ICsraSkKKwkJaWYgKGRtYV9jaFtpXS5jaGFuX3N0YXR1cyAhPSBETUFfQ0hBTk5FTF9GUkVFKQorCQkJc2VxX3ByaW50ZihtLCAiJTJkOiAlc1xuIiwgaSwgZG1hX2NoW2ldLmRldmljZV9pZCk7CisKIAlyZXR1cm4gMDsKIH0KIAotYXJjaF9pbml0Y2FsbChibGFja2Zpbl9kbWFfaW5pdCk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKglSZXF1ZXN0IHRoZSBzcGVjaWZpYyBETUEgY2hhbm5lbCBmcm9tIHRoZSBzeXN0ZW0uCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCByZXF1ZXN0X2RtYSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgY2hhciAqZGV2aWNlX2lkKQorc3RhdGljIGludCBwcm9jX2RtYV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogeworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBwcm9jX2RtYV9zaG93LCBOVUxMKTsKK30KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19kbWFfb3BlcmF0aW9ucyA9IHsKKwkub3BlbgkJPSBwcm9jX2RtYV9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwcm9jX2RtYV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHByb2NfY3JlYXRlKCJkbWEiLCAwLCBOVUxMLCAmcHJvY19kbWFfb3BlcmF0aW9ucykgIT0gTlVMTDsKK30KK2xhdGVfaW5pdGNhbGwocHJvY19kbWFfaW5pdCk7CisjZW5kaWYKKworLyoqCisgKglyZXF1ZXN0X2RtYSAtIHJlcXVlc3QgYSBETUEgY2hhbm5lbAorICoKKyAqIFJlcXVlc3QgdGhlIHNwZWNpZmljIERNQSBjaGFubmVsIGZyb20gdGhlIHN5c3RlbSBpZiBpdCdzIGF2YWlsYWJsZS4KKyAqLworaW50IHJlcXVlc3RfZG1hKHVuc2lnbmVkIGludCBjaGFubmVsLCBjb25zdCBjaGFyICpkZXZpY2VfaWQpCit7CiAJcHJfZGVidWcoInJlcXVlc3RfZG1hKCkgOiBCRUdJTiBcbiIpOwogCisJaWYgKGRldmljZV9pZCA9PSBOVUxMKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJyZXF1ZXN0X2RtYSgldSk6IG5vIGRldmljZV9pZCBnaXZlblxuIiwgY2hhbm5lbCk7CisKICNpZiBkZWZpbmVkKENPTkZJR19CRjU2MSkgJiYgQU5PTUFMWV8wNTAwMDE4MgogCWlmIChjaGFubmVsID49IENIX0lNRU1fU1RSRUFNMF9ERVNUICYmIGNoYW5uZWwgPD0gQ0hfSU1FTV9TVFJFQU0xX0RFU1QpIHsKIAkJaWYgKGdldF9jY2xrKCkgPiA1MDAwMDAwMDApIHsKQEAgLTEyOSw2MCArMTI4LDYzIEBACiAjZW5kaWYKIAogCWRtYV9jaFtjaGFubmVsXS5kZXZpY2VfaWQgPSBkZXZpY2VfaWQ7Ci0JZG1hX2NoW2NoYW5uZWxdLmlycV9jYWxsYmFjayA9IE5VTEw7CisJZG1hX2NoW2NoYW5uZWxdLmlycSA9IDA7CiAKIAkvKiBUaGlzIGlzIHRvIGJlIGVuYWJsZWQgYnkgcHV0dGluZyBhIHJlc3RyaWN0aW9uIC0KIAkgKiB5b3UgaGF2ZSB0byByZXF1ZXN0IERNQSwgYmVmb3JlIGRvaW5nIGFueSBvcGVyYXRpb25zIG9uCiAJICogZGVzY3JpcHRvci9jaGFubmVsCiAJICovCiAJcHJfZGVidWcoInJlcXVlc3RfZG1hKCkgOiBFTkQgIFxuIik7Ci0JcmV0dXJuIGNoYW5uZWw7CisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKHJlcXVlc3RfZG1hKTsKIAotaW50IHNldF9kbWFfY2FsbGJhY2sodW5zaWduZWQgaW50IGNoYW5uZWwsIGRtYV9pbnRlcnJ1cHRfdCBjYWxsYmFjaywgdm9pZCAqZGF0YSkKK2ludCBzZXRfZG1hX2NhbGxiYWNrKHVuc2lnbmVkIGludCBjaGFubmVsLCBpcnFfaGFuZGxlcl90IGNhbGxiYWNrLCB2b2lkICpkYXRhKQogewotCWludCByZXRfaXJxID0gMDsKLQogCUJVR19PTighKGRtYV9jaFtjaGFubmVsXS5jaGFuX3N0YXR1cyAhPSBETUFfQ0hBTk5FTF9GUkVFCi0JICAgICAgICYmIGNoYW5uZWwgPCBNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUwpKTsKKwkgICAgICAgJiYgY2hhbm5lbCA8IE1BWF9ETUFfQ0hBTk5FTFMpKTsKIAogCWlmIChjYWxsYmFjayAhPSBOVUxMKSB7Ci0JCWludCByZXRfdmFsOwotCQlyZXRfaXJxID0gY2hhbm5lbDJpcnEoY2hhbm5lbCk7CisJCWludCByZXQ7CisJCXVuc2lnbmVkIGludCBpcnEgPSBjaGFubmVsMmlycShjaGFubmVsKTsKIAorCQlyZXQgPSByZXF1ZXN0X2lycShpcnEsIGNhbGxiYWNrLCBJUlFGX0RJU0FCTEVELAorCQkJZG1hX2NoW2NoYW5uZWxdLmRldmljZV9pZCwgZGF0YSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCWRtYV9jaFtjaGFubmVsXS5pcnEgPSBpcnE7CiAJCWRtYV9jaFtjaGFubmVsXS5kYXRhID0gZGF0YTsKLQotCQlyZXRfdmFsID0KLQkJICAgIHJlcXVlc3RfaXJxKHJldF9pcnEsICh2b2lkICopY2FsbGJhY2ssIElSUUZfRElTQUJMRUQsCi0JCQkJZG1hX2NoW2NoYW5uZWxdLmRldmljZV9pZCwgZGF0YSk7Ci0JCWlmIChyZXRfdmFsKSB7Ci0JCQlwcmludGsoS0VSTl9OT1RJQ0UKLQkJCSAgICAgICAiUmVxdWVzdCBpcnEgaW4gRE1BIGVuZ2luZSBmYWlsZWQuXG4iKTsKLQkJCXJldHVybiAtRVBFUk07Ci0JCX0KLQkJZG1hX2NoW2NoYW5uZWxdLmlycV9jYWxsYmFjayA9IGNhbGxiYWNrOwogCX0KIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0woc2V0X2RtYV9jYWxsYmFjayk7CiAKKy8qKgorICoJY2xlYXJfZG1hX2J1ZmZlciAtIGNsZWFyIERNQSBmaWZvcyBmb3Igc3BlY2lmaWVkIGNoYW5uZWwKKyAqCisgKiBTZXQgdGhlIEJ1ZmZlciBDbGVhciBiaXQgaW4gdGhlIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgb2Ygc3BlY2lmaWMgRE1BCisgKiBjaGFubmVsLiBUaGlzIHdpbGwgc3RvcCB0aGUgZGVzY3JpcHRvciBiYXNlZCBETUEgb3BlcmF0aW9uLgorICovCitzdGF0aWMgdm9pZCBjbGVhcl9kbWFfYnVmZmVyKHVuc2lnbmVkIGludCBjaGFubmVsKQoreworCWRtYV9jaFtjaGFubmVsXS5yZWdzLT5jZmcgfD0gUkVTVEFSVDsKKwlTU1lOQygpOworCWRtYV9jaFtjaGFubmVsXS5yZWdzLT5jZmcgJj0gflJFU1RBUlQ7Cit9CisKIHZvaWQgZnJlZV9kbWEodW5zaWduZWQgaW50IGNoYW5uZWwpCiB7Ci0JaW50IHJldF9pcnE7Ci0KIAlwcl9kZWJ1ZygiZnJlZWRtYSgpIDogQkVHSU4gXG4iKTsKIAlCVUdfT04oIShkbWFfY2hbY2hhbm5lbF0uY2hhbl9zdGF0dXMgIT0gRE1BX0NIQU5ORUxfRlJFRQotCSAgICAgICAmJiBjaGFubmVsIDwgTUFYX0JMQUNLRklOX0RNQV9DSEFOTkVMKSk7CisJICAgICAgICYmIGNoYW5uZWwgPCBNQVhfRE1BX0NIQU5ORUxTKSk7CiAKIAkvKiBIYWx0IHRoZSBETUEgKi8KIAlkaXNhYmxlX2RtYShjaGFubmVsKTsKIAljbGVhcl9kbWFfYnVmZmVyKGNoYW5uZWwpOwogCi0JaWYgKGRtYV9jaFtjaGFubmVsXS5pcnFfY2FsbGJhY2sgIT0gTlVMTCkgewotCQlyZXRfaXJxID0gY2hhbm5lbDJpcnEoY2hhbm5lbCk7Ci0JCWZyZWVfaXJxKHJldF9pcnEsIGRtYV9jaFtjaGFubmVsXS5kYXRhKTsKLQl9CisJaWYgKGRtYV9jaFtjaGFubmVsXS5pcnEpCisJCWZyZWVfaXJxKGRtYV9jaFtjaGFubmVsXS5pcnEsIGRtYV9jaFtjaGFubmVsXS5kYXRhKTsKIAogCS8qIENsZWFyIHRoZSBETUEgVmFyaWFibGUgaW4gdGhlIENoYW5uZWwgKi8KIAltdXRleF9sb2NrKCYoZG1hX2NoW2NoYW5uZWxdLmRtYWxvY2spKTsKQEAgLTE5MywyOTQgKzE5NSwxNSBAQAogfQogRVhQT1JUX1NZTUJPTChmcmVlX2RtYSk7CiAKLXZvaWQgZG1hX2VuYWJsZV9pcnEodW5zaWduZWQgaW50IGNoYW5uZWwpCi17Ci0JaW50IHJldF9pcnE7Ci0KLQlwcl9kZWJ1ZygiZG1hX2VuYWJsZV9pcnEoKSA6IEJFR0lOIFxuIik7Ci0JQlVHX09OKCEoZG1hX2NoW2NoYW5uZWxdLmNoYW5fc3RhdHVzICE9IERNQV9DSEFOTkVMX0ZSRUUKLQkgICAgICAgJiYgY2hhbm5lbCA8IE1BWF9CTEFDS0ZJTl9ETUFfQ0hBTk5FTCkpOwotCi0JcmV0X2lycSA9IGNoYW5uZWwyaXJxKGNoYW5uZWwpOwotCWVuYWJsZV9pcnEocmV0X2lycSk7Ci19Ci1FWFBPUlRfU1lNQk9MKGRtYV9lbmFibGVfaXJxKTsKLQotdm9pZCBkbWFfZGlzYWJsZV9pcnEodW5zaWduZWQgaW50IGNoYW5uZWwpCi17Ci0JaW50IHJldF9pcnE7Ci0KLQlwcl9kZWJ1ZygiZG1hX2Rpc2FibGVfaXJxKCkgOiBCRUdJTiBcbiIpOwotCUJVR19PTighKGRtYV9jaFtjaGFubmVsXS5jaGFuX3N0YXR1cyAhPSBETUFfQ0hBTk5FTF9GUkVFCi0JICAgICAgICYmIGNoYW5uZWwgPCBNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUwpKTsKLQotCXJldF9pcnEgPSBjaGFubmVsMmlycShjaGFubmVsKTsKLQlkaXNhYmxlX2lycShyZXRfaXJxKTsKLX0KLUVYUE9SVF9TWU1CT0woZG1hX2Rpc2FibGVfaXJxKTsKLQotaW50IGRtYV9jaGFubmVsX2FjdGl2ZSh1bnNpZ25lZCBpbnQgY2hhbm5lbCkKLXsKLQlpZiAoZG1hX2NoW2NoYW5uZWxdLmNoYW5fc3RhdHVzID09IERNQV9DSEFOTkVMX0ZSRUUpIHsKLQkJcmV0dXJuIDA7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIDE7Ci0JfQotfQotRVhQT1JUX1NZTUJPTChkbWFfY2hhbm5lbF9hY3RpdmUpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKglzdG9wIHRoZSBzcGVjaWZpYyBETUEgY2hhbm5lbC4KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIGRpc2FibGVfZG1hKHVuc2lnbmVkIGludCBjaGFubmVsKQotewotCXByX2RlYnVnKCJzdG9wX2RtYSgpIDogQkVHSU4gXG4iKTsKLQotCUJVR19PTighKGRtYV9jaFtjaGFubmVsXS5jaGFuX3N0YXR1cyAhPSBETUFfQ0hBTk5FTF9GUkVFCi0JICAgICAgICYmIGNoYW5uZWwgPCBNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUwpKTsKLQotCWRtYV9jaFtjaGFubmVsXS5yZWdzLT5jZmcgJj0gfkRNQUVOOwkvKiBDbGVhbiB0aGUgZW5hYmxlIGJpdCAqLwotCVNTWU5DKCk7Ci0JZG1hX2NoW2NoYW5uZWxdLmNoYW5fc3RhdHVzID0gRE1BX0NIQU5ORUxfUkVRVUVTVEVEOwotCS8qIE5lZWRzIHRvIGJlIGVuYWJsZWQgTGF0ZXIgKi8KLQlwcl9kZWJ1Zygic3RvcF9kbWEoKSA6IEVORCBcbiIpOwotCXJldHVybjsKLX0KLUVYUE9SVF9TWU1CT0woZGlzYWJsZV9kbWEpOwotCi12b2lkIGVuYWJsZV9kbWEodW5zaWduZWQgaW50IGNoYW5uZWwpCi17Ci0JcHJfZGVidWcoImVuYWJsZV9kbWEoKSA6IEJFR0lOIFxuIik7Ci0KLQlCVUdfT04oIShkbWFfY2hbY2hhbm5lbF0uY2hhbl9zdGF0dXMgIT0gRE1BX0NIQU5ORUxfRlJFRQotCSAgICAgICAmJiBjaGFubmVsIDwgTUFYX0JMQUNLRklOX0RNQV9DSEFOTkVMKSk7Ci0KLQlkbWFfY2hbY2hhbm5lbF0uY2hhbl9zdGF0dXMgPSBETUFfQ0hBTk5FTF9FTkFCTEVEOwotCWRtYV9jaFtjaGFubmVsXS5yZWdzLT5jdXJyX3hfY291bnQgPSAwOwotCWRtYV9jaFtjaGFubmVsXS5yZWdzLT5jdXJyX3lfY291bnQgPSAwOwotCi0JZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmNmZyB8PSBETUFFTjsJLyogU2V0IHRoZSBlbmFibGUgYml0ICovCi0JU1NZTkMoKTsKLQlwcl9kZWJ1ZygiZW5hYmxlX2RtYSgpIDogRU5EIFxuIik7Ci0JcmV0dXJuOwotfQotRVhQT1JUX1NZTUJPTChlbmFibGVfZG1hKTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoJCVNldCB0aGUgU3RhcnQgQWRkcmVzcyByZWdpc3RlciBmb3IgdGhlIHNwZWNpZmljIERNQSBjaGFubmVsCi0qIAkJVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBmb3IgcmVnaXN0ZXIgYmFzZWQgRE1BLAotKgkJdG8gc2V0dXAgdGhlIHN0YXJ0IGFkZHJlc3MKLSoJCWFkZHI6CQlTdGFydGluZyBhZGRyZXNzIG9mIHRoZSBETUEgRGF0YSB0byBiZSB0cmFuc2ZlcnJlZC4KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIHNldF9kbWFfc3RhcnRfYWRkcih1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgbG9uZyBhZGRyKQotewotCXByX2RlYnVnKCJzZXRfZG1hX3N0YXJ0X2FkZHIoKSA6IEJFR0lOIFxuIik7Ci0KLQlCVUdfT04oIShkbWFfY2hbY2hhbm5lbF0uY2hhbl9zdGF0dXMgIT0gRE1BX0NIQU5ORUxfRlJFRQotCSAgICAgICAmJiBjaGFubmVsIDwgTUFYX0JMQUNLRklOX0RNQV9DSEFOTkVMKSk7Ci0KLQlkbWFfY2hbY2hhbm5lbF0ucmVncy0+c3RhcnRfYWRkciA9IGFkZHI7Ci0JU1NZTkMoKTsKLQlwcl9kZWJ1Zygic2V0X2RtYV9zdGFydF9hZGRyKCkgOiBFTkRcbiIpOwotfQotRVhQT1JUX1NZTUJPTChzZXRfZG1hX3N0YXJ0X2FkZHIpOwotCi12b2lkIHNldF9kbWFfbmV4dF9kZXNjX2FkZHIodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGxvbmcgYWRkcikKLXsKLQlwcl9kZWJ1Zygic2V0X2RtYV9uZXh0X2Rlc2NfYWRkcigpIDogQkVHSU4gXG4iKTsKLQotCUJVR19PTighKGRtYV9jaFtjaGFubmVsXS5jaGFuX3N0YXR1cyAhPSBETUFfQ0hBTk5FTF9GUkVFCi0JICAgICAgICYmIGNoYW5uZWwgPCBNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUwpKTsKLQotCWRtYV9jaFtjaGFubmVsXS5yZWdzLT5uZXh0X2Rlc2NfcHRyID0gYWRkcjsKLQlTU1lOQygpOwotCXByX2RlYnVnKCJzZXRfZG1hX25leHRfZGVzY19hZGRyKCkgOiBFTkRcbiIpOwotfQotRVhQT1JUX1NZTUJPTChzZXRfZG1hX25leHRfZGVzY19hZGRyKTsKLQotdm9pZCBzZXRfZG1hX2N1cnJfZGVzY19hZGRyKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBsb25nIGFkZHIpCi17Ci0JcHJfZGVidWcoInNldF9kbWFfY3Vycl9kZXNjX2FkZHIoKSA6IEJFR0lOIFxuIik7Ci0KLQlCVUdfT04oIShkbWFfY2hbY2hhbm5lbF0uY2hhbl9zdGF0dXMgIT0gRE1BX0NIQU5ORUxfRlJFRQotCSAgICAgICAmJiBjaGFubmVsIDwgTUFYX0JMQUNLRklOX0RNQV9DSEFOTkVMKSk7Ci0KLQlkbWFfY2hbY2hhbm5lbF0ucmVncy0+Y3Vycl9kZXNjX3B0ciA9IGFkZHI7Ci0JU1NZTkMoKTsKLQlwcl9kZWJ1Zygic2V0X2RtYV9jdXJyX2Rlc2NfYWRkcigpIDogRU5EXG4iKTsKLX0KLUVYUE9SVF9TWU1CT0woc2V0X2RtYV9jdXJyX2Rlc2NfYWRkcik7Ci0KLXZvaWQgc2V0X2RtYV94X2NvdW50KHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBzaG9ydCB4X2NvdW50KQotewotCUJVR19PTighKGRtYV9jaFtjaGFubmVsXS5jaGFuX3N0YXR1cyAhPSBETUFfQ0hBTk5FTF9GUkVFCi0JICAgICAgICYmIGNoYW5uZWwgPCBNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUwpKTsKLQotCWRtYV9jaFtjaGFubmVsXS5yZWdzLT54X2NvdW50ID0geF9jb3VudDsKLQlTU1lOQygpOwotfQotRVhQT1JUX1NZTUJPTChzZXRfZG1hX3hfY291bnQpOwotCi12b2lkIHNldF9kbWFfeV9jb3VudCh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgc2hvcnQgeV9jb3VudCkKLXsKLQlCVUdfT04oIShkbWFfY2hbY2hhbm5lbF0uY2hhbl9zdGF0dXMgIT0gRE1BX0NIQU5ORUxfRlJFRQotCSAgICAgICAmJiBjaGFubmVsIDwgTUFYX0JMQUNLRklOX0RNQV9DSEFOTkVMKSk7Ci0KLQlkbWFfY2hbY2hhbm5lbF0ucmVncy0+eV9jb3VudCA9IHlfY291bnQ7Ci0JU1NZTkMoKTsKLX0KLUVYUE9SVF9TWU1CT0woc2V0X2RtYV95X2NvdW50KTsKLQotdm9pZCBzZXRfZG1hX3hfbW9kaWZ5KHVuc2lnbmVkIGludCBjaGFubmVsLCBzaG9ydCB4X21vZGlmeSkKLXsKLQlCVUdfT04oIShkbWFfY2hbY2hhbm5lbF0uY2hhbl9zdGF0dXMgIT0gRE1BX0NIQU5ORUxfRlJFRQotCSAgICAgICAmJiBjaGFubmVsIDwgTUFYX0JMQUNLRklOX0RNQV9DSEFOTkVMKSk7Ci0KLQlkbWFfY2hbY2hhbm5lbF0ucmVncy0+eF9tb2RpZnkgPSB4X21vZGlmeTsKLQlTU1lOQygpOwotfQotRVhQT1JUX1NZTUJPTChzZXRfZG1hX3hfbW9kaWZ5KTsKLQotdm9pZCBzZXRfZG1hX3lfbW9kaWZ5KHVuc2lnbmVkIGludCBjaGFubmVsLCBzaG9ydCB5X21vZGlmeSkKLXsKLQlCVUdfT04oIShkbWFfY2hbY2hhbm5lbF0uY2hhbl9zdGF0dXMgIT0gRE1BX0NIQU5ORUxfRlJFRQotCSAgICAgICAmJiBjaGFubmVsIDwgTUFYX0JMQUNLRklOX0RNQV9DSEFOTkVMKSk7Ci0KLQlkbWFfY2hbY2hhbm5lbF0ucmVncy0+eV9tb2RpZnkgPSB5X21vZGlmeTsKLQlTU1lOQygpOwotfQotRVhQT1JUX1NZTUJPTChzZXRfZG1hX3lfbW9kaWZ5KTsKLQotdm9pZCBzZXRfZG1hX2NvbmZpZyh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgc2hvcnQgY29uZmlnKQotewotCUJVR19PTighKGRtYV9jaFtjaGFubmVsXS5jaGFuX3N0YXR1cyAhPSBETUFfQ0hBTk5FTF9GUkVFCi0JICAgICAgICYmIGNoYW5uZWwgPCBNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUwpKTsKLQotCWRtYV9jaFtjaGFubmVsXS5yZWdzLT5jZmcgPSBjb25maWc7Ci0JU1NZTkMoKTsKLX0KLUVYUE9SVF9TWU1CT0woc2V0X2RtYV9jb25maWcpOwotCi11bnNpZ25lZCBzaG9ydAotc2V0X2JmaW5fZG1hX2NvbmZpZyhjaGFyIGRpcmVjdGlvbiwgY2hhciBmbG93X21vZGUsCi0JCSAgICBjaGFyIGludHJfbW9kZSwgY2hhciBkbWFfbW9kZSwgY2hhciB3aWR0aCwgY2hhciBzeW5jbW9kZSkKLXsKLQl1bnNpZ25lZCBzaG9ydCBjb25maWc7Ci0KLQljb25maWcgPQotCSAgICAoKGRpcmVjdGlvbiA8PCAxKSB8ICh3aWR0aCA8PCAyKSB8IChkbWFfbW9kZSA8PCA0KSB8Ci0JICAgICAoaW50cl9tb2RlIDw8IDYpIHwgKGZsb3dfbW9kZSA8PCAxMikgfCAoc3luY21vZGUgPDwgNSkpOwotCXJldHVybiBjb25maWc7Ci19Ci1FWFBPUlRfU1lNQk9MKHNldF9iZmluX2RtYV9jb25maWcpOwotCi12b2lkIHNldF9kbWFfc2codW5zaWduZWQgaW50IGNoYW5uZWwsIHN0cnVjdCBkbWFzZyAqc2csIGludCBucl9zZykKLXsKLQlCVUdfT04oIShkbWFfY2hbY2hhbm5lbF0uY2hhbl9zdGF0dXMgIT0gRE1BX0NIQU5ORUxfRlJFRQotCSAgICAgICAmJiBjaGFubmVsIDwgTUFYX0JMQUNLRklOX0RNQV9DSEFOTkVMKSk7Ci0KLQlkbWFfY2hbY2hhbm5lbF0ucmVncy0+Y2ZnIHw9ICgobnJfc2cgJiAweDBGKSA8PCA4KTsKLQotCWRtYV9jaFtjaGFubmVsXS5yZWdzLT5uZXh0X2Rlc2NfcHRyID0gKHVuc2lnbmVkIGludClzZzsKLQotCVNTWU5DKCk7Ci19Ci1FWFBPUlRfU1lNQk9MKHNldF9kbWFfc2cpOwotCi12b2lkIHNldF9kbWFfY3Vycl9hZGRyKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBsb25nIGFkZHIpCi17Ci0JQlVHX09OKCEoZG1hX2NoW2NoYW5uZWxdLmNoYW5fc3RhdHVzICE9IERNQV9DSEFOTkVMX0ZSRUUKLQkgICAgICAgJiYgY2hhbm5lbCA8IE1BWF9CTEFDS0ZJTl9ETUFfQ0hBTk5FTCkpOwotCi0JZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmN1cnJfYWRkcl9wdHIgPSBhZGRyOwotCVNTWU5DKCk7Ci19Ci1FWFBPUlRfU1lNQk9MKHNldF9kbWFfY3Vycl9hZGRyKTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCUdldCB0aGUgRE1BIHN0YXR1cyBvZiBhIHNwZWNpZmljIERNQSBjaGFubmVsIGZyb20gdGhlIHN5c3RlbS4KLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdW5zaWduZWQgc2hvcnQgZ2V0X2RtYV9jdXJyX2lycXN0YXQodW5zaWduZWQgaW50IGNoYW5uZWwpCi17Ci0JQlVHX09OKCEoZG1hX2NoW2NoYW5uZWxdLmNoYW5fc3RhdHVzICE9IERNQV9DSEFOTkVMX0ZSRUUKLQkgICAgICAgJiYgY2hhbm5lbCA8IE1BWF9CTEFDS0ZJTl9ETUFfQ0hBTk5FTCkpOwotCi0JcmV0dXJuIGRtYV9jaFtjaGFubmVsXS5yZWdzLT5pcnFfc3RhdHVzOwotfQotRVhQT1JUX1NZTUJPTChnZXRfZG1hX2N1cnJfaXJxc3RhdCk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKglDbGVhciB0aGUgRE1BX0RPTkUgYml0IGluIERNQSBzdGF0dXMuIFN0b3AgdGhlIERNQSBjb21wbGV0aW9uIGludGVycnVwdC4KLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBjbGVhcl9kbWFfaXJxc3RhdCh1bnNpZ25lZCBpbnQgY2hhbm5lbCkKLXsKLQlCVUdfT04oIShkbWFfY2hbY2hhbm5lbF0uY2hhbl9zdGF0dXMgIT0gRE1BX0NIQU5ORUxfRlJFRQotCSAgICAgICAmJiBjaGFubmVsIDwgTUFYX0JMQUNLRklOX0RNQV9DSEFOTkVMKSk7Ci0JZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmlycV9zdGF0dXMgfD0gMzsKLX0KLUVYUE9SVF9TWU1CT0woY2xlYXJfZG1hX2lycXN0YXQpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoJR2V0IGN1cnJlbnQgRE1BIHhjb3VudCBvZiBhIHNwZWNpZmljIERNQSBjaGFubmVsIGZyb20gdGhlIHN5c3RlbS4KLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdW5zaWduZWQgc2hvcnQgZ2V0X2RtYV9jdXJyX3hjb3VudCh1bnNpZ25lZCBpbnQgY2hhbm5lbCkKLXsKLQlCVUdfT04oIShkbWFfY2hbY2hhbm5lbF0uY2hhbl9zdGF0dXMgIT0gRE1BX0NIQU5ORUxfRlJFRQotCSAgICAgICAmJiBjaGFubmVsIDwgTUFYX0JMQUNLRklOX0RNQV9DSEFOTkVMKSk7Ci0KLQlyZXR1cm4gZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmN1cnJfeF9jb3VudDsKLX0KLUVYUE9SVF9TWU1CT0woZ2V0X2RtYV9jdXJyX3hjb3VudCk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKglHZXQgY3VycmVudCBETUEgeWNvdW50IG9mIGEgc3BlY2lmaWMgRE1BIGNoYW5uZWwgZnJvbSB0aGUgc3lzdGVtLgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11bnNpZ25lZCBzaG9ydCBnZXRfZG1hX2N1cnJfeWNvdW50KHVuc2lnbmVkIGludCBjaGFubmVsKQotewotCUJVR19PTighKGRtYV9jaFtjaGFubmVsXS5jaGFuX3N0YXR1cyAhPSBETUFfQ0hBTk5FTF9GUkVFCi0JICAgICAgICYmIGNoYW5uZWwgPCBNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUwpKTsKLQotCXJldHVybiBkbWFfY2hbY2hhbm5lbF0ucmVncy0+Y3Vycl95X2NvdW50OwotfQotRVhQT1JUX1NZTUJPTChnZXRfZG1hX2N1cnJfeWNvdW50KTsKLQotdW5zaWduZWQgbG9uZyBnZXRfZG1hX25leHRfZGVzY19wdHIodW5zaWduZWQgaW50IGNoYW5uZWwpCi17Ci0JQlVHX09OKCEoZG1hX2NoW2NoYW5uZWxdLmNoYW5fc3RhdHVzICE9IERNQV9DSEFOTkVMX0ZSRUUKLQkgICAgICAmJiBjaGFubmVsIDwgTUFYX0JMQUNLRklOX0RNQV9DSEFOTkVMKSk7Ci0KLQlyZXR1cm4gZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPm5leHRfZGVzY19wdHI7Ci19Ci1FWFBPUlRfU1lNQk9MKGdldF9kbWFfbmV4dF9kZXNjX3B0cik7Ci0KLXVuc2lnbmVkIGxvbmcgZ2V0X2RtYV9jdXJyX2Rlc2NfcHRyKHVuc2lnbmVkIGludCBjaGFubmVsKQotewotCUJVR19PTighKGRtYV9jaFtjaGFubmVsXS5jaGFuX3N0YXR1cyAhPSBETUFfQ0hBTk5FTF9GUkVFCi0JICAgICAgJiYgY2hhbm5lbCA8IE1BWF9CTEFDS0ZJTl9ETUFfQ0hBTk5FTCkpOwotCi0JcmV0dXJuIGRtYV9jaFtjaGFubmVsXS5yZWdzLT5jdXJyX2Rlc2NfcHRyOwotfQotRVhQT1JUX1NZTUJPTChnZXRfZG1hX2N1cnJfZGVzY19wdHIpOwotCi11bnNpZ25lZCBsb25nIGdldF9kbWFfY3Vycl9hZGRyKHVuc2lnbmVkIGludCBjaGFubmVsKQotewotCUJVR19PTighKGRtYV9jaFtjaGFubmVsXS5jaGFuX3N0YXR1cyAhPSBETUFfQ0hBTk5FTF9GUkVFCi0JICAgICAgJiYgY2hhbm5lbCA8IE1BWF9CTEFDS0ZJTl9ETUFfQ0hBTk5FTCkpOwotCi0JcmV0dXJuIGRtYV9jaFtjaGFubmVsXS5yZWdzLT5jdXJyX2FkZHJfcHRyOwotfQotRVhQT1JUX1NZTUJPTChnZXRfZG1hX2N1cnJfYWRkcik7Ci0KICNpZmRlZiBDT05GSUdfUE0KKyMgaWZuZGVmIE1BWF9ETUFfU1VTUEVORF9DSEFOTkVMUworIyAgZGVmaW5lIE1BWF9ETUFfU1VTUEVORF9DSEFOTkVMUyBNQVhfRE1BX0NIQU5ORUxTCisjIGVuZGlmCiBpbnQgYmxhY2tmaW5fZG1hX3N1c3BlbmQodm9pZCkKIHsKIAlpbnQgaTsKIAotI2lmZGVmIENPTkZJR19CRjU2MQkvKiBJTURNQSBjaGFubmVscyBkb2Vzbid0IGhhdmUgYSBQRVJJUEhFUkFMX01BUCAqLwotCWZvciAoaSA9IDA7IGkgPD0gQ0hfTUVNX1NUUkVBTTNfU1JDOyBpKyspIHsKLSNlbHNlCi0JZm9yIChpID0gMDsgaSA8IE1BWF9CTEFDS0ZJTl9ETUFfQ0hBTk5FTDsgaSsrKSB7Ci0jZW5kaWYKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0RNQV9TVVNQRU5EX0NIQU5ORUxTOyArK2kpIHsKIAkJaWYgKGRtYV9jaFtpXS5jaGFuX3N0YXR1cyA9PSBETUFfQ0hBTk5FTF9FTkFCTEVEKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIkRNQSBDaGFubmVsICVkIGZhaWxlZCB0byBzdXNwZW5kXG4iLCBpKTsKIAkJCXJldHVybiAtRUJVU1k7CkBAIC00OTUsMzg4ICsyMTgsMjAxIEBACiB2b2lkIGJsYWNrZmluX2RtYV9yZXN1bWUodm9pZCkKIHsKIAlpbnQgaTsKLQotI2lmZGVmIENPTkZJR19CRjU2MQkvKiBJTURNQSBjaGFubmVscyBkb2Vzbid0IGhhdmUgYSBQRVJJUEhFUkFMX01BUCAqLwotCWZvciAoaSA9IDA7IGkgPD0gQ0hfTUVNX1NUUkVBTTNfU1JDOyBpKyspCi0jZWxzZQotCWZvciAoaSA9IDA7IGkgPCBNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUw7IGkrKykKLSNlbmRpZgorCWZvciAoaSA9IDA7IGkgPCBNQVhfRE1BX1NVU1BFTkRfQ0hBTk5FTFM7ICsraSkKIAkJZG1hX2NoW2ldLnJlZ3MtPnBlcmlwaGVyYWxfbWFwID0gZG1hX2NoW2ldLnNhdmVkX3BlcmlwaGVyYWxfbWFwOwogfQogI2VuZGlmCiAKLXN0YXRpYyB2b2lkICpfX2RtYV9tZW1jcHkodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc2l6ZSkKKy8qKgorICoJYmxhY2tmaW5fZG1hX2Vhcmx5X2luaXQgLSBtaW5pbWFsIERNQSBpbml0CisgKgorICogU2V0dXAgYSBmZXcgRE1BIHJlZ2lzdGVycyBzbyB3ZSBjYW4gc2FmZWx5IGRvIERNQSB0cmFuc2ZlcnMgZWFybHkgb24gaW4KKyAqIHRoZSBrZXJuZWwgYm9vdGluZyBwcm9jZXNzLiAgUmVhbGx5IHRoaXMganVzdCBtZWFucyB1c2luZyBkbWFfbWVtY3B5KCkuCisgKi8KK3ZvaWQgX19pbml0IGJsYWNrZmluX2RtYV9lYXJseV9pbml0KHZvaWQpCiB7Ci0JaW50IGRpcmVjdGlvbjsJLyogMSAtIGFkZHJlc3MgZGVjcmVhc2UsIDAgLSBhZGRyZXNzIGluY3JlYXNlICovCi0JaW50IGZsYWdfYWxpZ247CS8qIDEgLSBhZGRyZXNzIGFsaWduZWQsICAwIC0gYWRkcmVzcyB1bmFsaWduZWQgKi8KLQlpbnQgZmxhZ18yRDsJLyogMSAtIDJEIERNQSBuZWVkZWQsCSAwIC0gMUQgRE1BIG5lZWRlZCAqLworCWJmaW5fd3JpdGVfTURNQV9TMF9DT05GSUcoMCk7Cit9CisKKy8qKgorICoJX19kbWFfbWVtY3B5IC0gcHJvZ3JhbSB0aGUgTURNQSByZWdpc3RlcnMKKyAqCisgKiBBY3R1YWxseSBwcm9ncmFtIE1ETUEwIGFuZCB3YWl0IGZvciB0aGUgdHJhbnNmZXIgdG8gZmluaXNoLiAgRGlzYWJsZSBJUlFzCisgKiB3aGlsZSBwcm9ncmFtbWluZyByZWdpc3RlcnMgc28gdGhhdCBldmVyeXRoaW5nIGlzIGZ1bGx5IGNvbmZpZ3VyZWQuICBXYWl0CisgKiBmb3IgRE1BIHRvIGZpbmlzaCB3aXRoIElSUXMgZW5hYmxlZC4gIElmIGludGVycnVwdGVkLCB0aGUgaW5pdGlhbCBETUFfRE9ORQorICogY2hlY2sgd2lsbCBtYWtlIHN1cmUgd2UgZG9uJ3QgY2xvYmJlciBhbnkgZXhpc3RpbmcgdHJhbnNmZXIuCisgKi8KK3N0YXRpYyB2b2lkIF9fZG1hX21lbWNweSh1MzIgZGFkZHIsIHMxNiBkbW9kLCB1MzIgc2FkZHIsIHMxNiBzbW9kLCBzaXplX3QgY250LCB1MzIgY29uZikKK3sKKwlzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG1kbWFfbG9jayk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmIChzaXplIDw9IDApCi0JCXJldHVybiBOVUxMOworCXNwaW5fbG9ja19pcnFzYXZlKCZtZG1hX2xvY2ssIGZsYWdzKTsKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlpZiAoYmZpbl9yZWFkX01ETUFfUzBfQ09ORklHKCkpCisJCXdoaWxlICghKGJmaW5fcmVhZF9NRE1BX0QwX0lSUV9TVEFUVVMoKSAmIERNQV9ET05FKSkKKwkJCWNvbnRpbnVlOwogCi0JaWYgKCh1bnNpZ25lZCBsb25nKXNyYyA8IG1lbW9yeV9lbmQpCi0JCWJsYWNrZmluX2RjYWNoZV9mbHVzaF9yYW5nZSgodW5zaWduZWQgaW50KXNyYywKLQkJCQkJICAgICh1bnNpZ25lZCBpbnQpKHNyYyArIHNpemUpKTsKKwlpZiAoY29uZiAmIERNQTJEKSB7CisJCS8qIEZvciBsYXJnZXIgYml0IHNpemVzLCB3ZSd2ZSBhbHJlYWR5IGRpdmlkZWQgZG93biBjbnQgc28gaXQKKwkJICogaXMgbm8gbG9uZ2VyIGEgbXVsdGlwbGUgb2YgNjRrLiAgU28gd2UgaGF2ZSB0byBicmVhayBkb3duCisJCSAqIHRoZSBsaW1pdCBoZXJlIHNvIGl0IGlzIGEgbXVsdGlwbGUgb2YgdGhlIGluY29taW5nIHNpemUuCisJCSAqIFRoZXJlIGlzIG5vIGxpbWl0YXRpb24gaGVyZSBpbiB0ZXJtcyBvZiB0b3RhbCBzaXplIG90aGVyCisJCSAqIHRoYW4gdGhlIGhhcmR3YXJlIHRob3VnaCBhcyB0aGUgYml0cyBsb3N0IGluIHRoZSBzaGlmdCBhcmUKKwkJICogbWFkZSB1cCBieSBNT0RJRlkgKD09IHdlIGNhbiBoaXQgdGhlIHdob2xlIGFkZHJlc3Mgc3BhY2UpLgorCQkgKiBYOiAoMl4oMTYgLSAwKSkgKiAxID09ICgyXigxNiAtIDEpKSAqIDIgPT0gKDJeKDE2IC0gMikpICogNAorCQkgKi8KKwkJdTMyIHNoaWZ0ID0gYWJzKGRtb2QpID4+IDE7CisJCXNpemVfdCB5Y250ID0gY250ID4+ICgxNiAtIHNoaWZ0KTsKKwkJY250ID0gMSA8PCAoMTYgLSBzaGlmdCk7CisJCWJmaW5fd3JpdGVfTURNQV9EMF9ZX0NPVU5UKHljbnQpOworCQliZmluX3dyaXRlX01ETUFfUzBfWV9DT1VOVCh5Y250KTsKKwkJYmZpbl93cml0ZV9NRE1BX0QwX1lfTU9ESUZZKGRtb2QpOworCQliZmluX3dyaXRlX01ETUFfUzBfWV9NT0RJRlkoc21vZCk7CisJfQogCi0JaWYgKCh1bnNpZ25lZCBsb25nKWRlc3QgPCBtZW1vcnlfZW5kKQotCQlibGFja2Zpbl9kY2FjaGVfaW52YWxpZGF0ZV9yYW5nZSgodW5zaWduZWQgaW50KWRlc3QsCi0JCQkJCQkgKHVuc2lnbmVkIGludCkoZGVzdCArIHNpemUpKTsKLQorCWJmaW5fd3JpdGVfTURNQV9EMF9TVEFSVF9BRERSKGRhZGRyKTsKKwliZmluX3dyaXRlX01ETUFfRDBfWF9DT1VOVChjbnQpOworCWJmaW5fd3JpdGVfTURNQV9EMF9YX01PRElGWShkbW9kKTsKIAliZmluX3dyaXRlX01ETUFfRDBfSVJRX1NUQVRVUyhETUFfRE9ORSB8IERNQV9FUlIpOwogCi0JaWYgKCh1bnNpZ25lZCBsb25nKXNyYyA8ICh1bnNpZ25lZCBsb25nKWRlc3QpCi0JCWRpcmVjdGlvbiA9IDE7Ci0JZWxzZQotCQlkaXJlY3Rpb24gPSAwOworCWJmaW5fd3JpdGVfTURNQV9TMF9TVEFSVF9BRERSKHNhZGRyKTsKKwliZmluX3dyaXRlX01ETUFfUzBfWF9DT1VOVChjbnQpOworCWJmaW5fd3JpdGVfTURNQV9TMF9YX01PRElGWShzbW9kKTsKKwliZmluX3dyaXRlX01ETUFfUzBfSVJRX1NUQVRVUyhETUFfRE9ORSB8IERNQV9FUlIpOwogCi0JaWYgKCgoKHVuc2lnbmVkIGxvbmcpZGVzdCAlIDIpID09IDApICYmICgoKHVuc2lnbmVkIGxvbmcpc3JjICUgMikgPT0gMCkKLQkgICAgJiYgKChzaXplICUgMikgPT0gMCkpCi0JCWZsYWdfYWxpZ24gPSAxOwotCWVsc2UKLQkJZmxhZ19hbGlnbiA9IDA7CisJYmZpbl93cml0ZV9NRE1BX1MwX0NPTkZJRyhETUFFTiB8IGNvbmYpOworCWJmaW5fd3JpdGVfTURNQV9EMF9DT05GSUcoV05SIHwgRElfRU4gfCBETUFFTiB8IGNvbmYpOwogCi0JaWYgKHNpemUgPiAweDEwMDAwKQkvKiBzaXplID4gNjRLICovCi0JCWZsYWdfMkQgPSAxOwotCWVsc2UKLQkJZmxhZ18yRCA9IDA7Ci0KLQkvKiBTZXR1cCBkZXN0aW5hdGlvbiBhbmQgc291cmNlIHN0YXJ0IGFkZHJlc3MgKi8KLQlpZiAoZGlyZWN0aW9uKSB7Ci0JCWlmIChmbGFnX2FsaWduKSB7Ci0JCQliZmluX3dyaXRlX01ETUFfRDBfU1RBUlRfQUREUihkZXN0ICsgc2l6ZSAtIDIpOwotCQkJYmZpbl93cml0ZV9NRE1BX1MwX1NUQVJUX0FERFIoc3JjICsgc2l6ZSAtIDIpOwotCQl9IGVsc2UgewotCQkJYmZpbl93cml0ZV9NRE1BX0QwX1NUQVJUX0FERFIoZGVzdCArIHNpemUgLSAxKTsKLQkJCWJmaW5fd3JpdGVfTURNQV9TMF9TVEFSVF9BRERSKHNyYyArIHNpemUgLSAxKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWJmaW5fd3JpdGVfTURNQV9EMF9TVEFSVF9BRERSKGRlc3QpOwotCQliZmluX3dyaXRlX01ETUFfUzBfU1RBUlRfQUREUihzcmMpOwotCX0KLQotCS8qIFNldHVwIGRlc3RpbmF0aW9uIGFuZCBzb3VyY2UgeGNvdW50ICovCi0JaWYgKGZsYWdfMkQpIHsKLQkJaWYgKGZsYWdfYWxpZ24pIHsKLQkJCWJmaW5fd3JpdGVfTURNQV9EMF9YX0NPVU5UKDEwMjQgLyAyKTsKLQkJCWJmaW5fd3JpdGVfTURNQV9TMF9YX0NPVU5UKDEwMjQgLyAyKTsKLQkJfSBlbHNlIHsKLQkJCWJmaW5fd3JpdGVfTURNQV9EMF9YX0NPVU5UKDEwMjQpOwotCQkJYmZpbl93cml0ZV9NRE1BX1MwX1hfQ09VTlQoMTAyNCk7Ci0JCX0KLQkJYmZpbl93cml0ZV9NRE1BX0QwX1lfQ09VTlQoc2l6ZSA+PiAxMCk7Ci0JCWJmaW5fd3JpdGVfTURNQV9TMF9ZX0NPVU5UKHNpemUgPj4gMTApOwotCX0gZWxzZSB7Ci0JCWlmIChmbGFnX2FsaWduKSB7Ci0JCQliZmluX3dyaXRlX01ETUFfRDBfWF9DT1VOVChzaXplIC8gMik7Ci0JCQliZmluX3dyaXRlX01ETUFfUzBfWF9DT1VOVChzaXplIC8gMik7Ci0JCX0gZWxzZSB7Ci0JCQliZmluX3dyaXRlX01ETUFfRDBfWF9DT1VOVChzaXplKTsKLQkJCWJmaW5fd3JpdGVfTURNQV9TMF9YX0NPVU5UKHNpemUpOwotCQl9Ci0JfQotCi0JLyogU2V0dXAgZGVzdGluYXRpb24gYW5kIHNvdXJjZSB4bW9kaWZ5IGFuZCB5bW9kaWZ5ICovCi0JaWYgKGRpcmVjdGlvbikgewotCQlpZiAoZmxhZ19hbGlnbikgewotCQkJYmZpbl93cml0ZV9NRE1BX0QwX1hfTU9ESUZZKC0yKTsKLQkJCWJmaW5fd3JpdGVfTURNQV9TMF9YX01PRElGWSgtMik7Ci0JCQlpZiAoZmxhZ18yRCkgewotCQkJCWJmaW5fd3JpdGVfTURNQV9EMF9ZX01PRElGWSgtMik7Ci0JCQkJYmZpbl93cml0ZV9NRE1BX1MwX1lfTU9ESUZZKC0yKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWJmaW5fd3JpdGVfTURNQV9EMF9YX01PRElGWSgtMSk7Ci0JCQliZmluX3dyaXRlX01ETUFfUzBfWF9NT0RJRlkoLTEpOwotCQkJaWYgKGZsYWdfMkQpIHsKLQkJCQliZmluX3dyaXRlX01ETUFfRDBfWV9NT0RJRlkoLTEpOwotCQkJCWJmaW5fd3JpdGVfTURNQV9TMF9ZX01PRElGWSgtMSk7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoZmxhZ19hbGlnbikgewotCQkJYmZpbl93cml0ZV9NRE1BX0QwX1hfTU9ESUZZKDIpOwotCQkJYmZpbl93cml0ZV9NRE1BX1MwX1hfTU9ESUZZKDIpOwotCQkJaWYgKGZsYWdfMkQpIHsKLQkJCQliZmluX3dyaXRlX01ETUFfRDBfWV9NT0RJRlkoMik7Ci0JCQkJYmZpbl93cml0ZV9NRE1BX1MwX1lfTU9ESUZZKDIpOwotCQkJfQotCQl9IGVsc2UgewotCQkJYmZpbl93cml0ZV9NRE1BX0QwX1hfTU9ESUZZKDEpOwotCQkJYmZpbl93cml0ZV9NRE1BX1MwX1hfTU9ESUZZKDEpOwotCQkJaWYgKGZsYWdfMkQpIHsKLQkJCQliZmluX3dyaXRlX01ETUFfRDBfWV9NT0RJRlkoMSk7Ci0JCQkJYmZpbl93cml0ZV9NRE1BX1MwX1lfTU9ESUZZKDEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyogRW5hYmxlIHNvdXJjZSBETUEgKi8KLQlpZiAoZmxhZ18yRCkgewotCQlpZiAoZmxhZ19hbGlnbikgewotCQkJYmZpbl93cml0ZV9NRE1BX1MwX0NPTkZJRyhETUFFTiB8IERNQTJEIHwgV0RTSVpFXzE2KTsKLQkJCWJmaW5fd3JpdGVfTURNQV9EMF9DT05GSUcoV05SIHwgRElfRU4gfCBETUFFTiB8IERNQTJEIHwgV0RTSVpFXzE2KTsKLQkJfSBlbHNlIHsKLQkJCWJmaW5fd3JpdGVfTURNQV9TMF9DT05GSUcoRE1BRU4gfCBETUEyRCk7Ci0JCQliZmluX3dyaXRlX01ETUFfRDBfQ09ORklHKFdOUiB8IERJX0VOIHwgRE1BRU4gfCBETUEyRCk7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoZmxhZ19hbGlnbikgewotCQkJYmZpbl93cml0ZV9NRE1BX1MwX0NPTkZJRyhETUFFTiB8IFdEU0laRV8xNik7Ci0JCQliZmluX3dyaXRlX01ETUFfRDBfQ09ORklHKFdOUiB8IERJX0VOIHwgRE1BRU4gfCBXRFNJWkVfMTYpOwotCQl9IGVsc2UgewotCQkJYmZpbl93cml0ZV9NRE1BX1MwX0NPTkZJRyhETUFFTik7Ci0JCQliZmluX3dyaXRlX01ETUFfRDBfQ09ORklHKFdOUiB8IERJX0VOIHwgRE1BRU4pOwotCQl9Ci0JfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kbWFfbG9jaywgZmxhZ3MpOwogCiAJU1NZTkMoKTsKIAogCXdoaWxlICghKGJmaW5fcmVhZF9NRE1BX0QwX0lSUV9TVEFUVVMoKSAmIERNQV9ET05FKSkKLQkJOworCQlpZiAoYmZpbl9yZWFkX01ETUFfUzBfQ09ORklHKCkpCisJCQljb250aW51ZTsKKwkJZWxzZQorCQkJcmV0dXJuOwogCi0JYmZpbl93cml0ZV9NRE1BX0QwX0lSUV9TVEFUVVMoYmZpbl9yZWFkX01ETUFfRDBfSVJRX1NUQVRVUygpIHwKLQkJCQkgICAgICAoRE1BX0RPTkUgfCBETUFfRVJSKSk7CisJYmZpbl93cml0ZV9NRE1BX0QwX0lSUV9TVEFUVVMoRE1BX0RPTkUgfCBETUFfRVJSKTsKIAogCWJmaW5fd3JpdGVfTURNQV9TMF9DT05GSUcoMCk7CiAJYmZpbl93cml0ZV9NRE1BX0QwX0NPTkZJRygwKTsKLQotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotCXJldHVybiBkZXN0OwogfQogCi12b2lkICpkbWFfbWVtY3B5KHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNpemUpCisvKioKKyAqCV9kbWFfbWVtY3B5IC0gdHJhbnNsYXRlIEMgbWVtY3B5IHNldHRpbmdzIGludG8gTURNQSBzZXR0aW5ncworICoKKyAqIEhhbmRsZSBhbGwgdGhlIGhpZ2ggbGV2ZWwgc3RlcHMgYmVmb3JlIHdlIHRvdWNoIHRoZSBNRE1BIHJlZ2lzdGVycy4gIFNvCisgKiBoYW5kbGUgZGlyZWN0aW9uLCB0d2Vha2luZyBvZiBzaXplcywgYW5kIGZvcm1hdHRpbmcgb2YgYWRkcmVzc2VzLgorICovCitzdGF0aWMgdm9pZCAqX2RtYV9tZW1jcHkodm9pZCAqcGRzdCwgY29uc3Qgdm9pZCAqcHNyYywgc2l6ZV90IHNpemUpCiB7Ci0Jc2l6ZV90IGJ1bGs7Ci0Jc2l6ZV90IHJlc3Q7Ci0Jdm9pZCAqIGFkZHI7CisJdTMyIGNvbmYsIHNoaWZ0OworCXMxNiBtb2Q7CisJdW5zaWduZWQgbG9uZyBkc3QgPSAodW5zaWduZWQgbG9uZylwZHN0OworCXVuc2lnbmVkIGxvbmcgc3JjID0gKHVuc2lnbmVkIGxvbmcpcHNyYzsKIAotCWJ1bGsgPSAoc2l6ZSA+PiAxNikgPDwgMTY7CisJaWYgKHNpemUgPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoZHN0ICUgNCA9PSAwICYmIHNyYyAlIDQgPT0gMCAmJiBzaXplICUgNCA9PSAwKSB7CisJCWNvbmYgPSBXRFNJWkVfMzI7CisJCXNoaWZ0ID0gMjsKKwl9IGVsc2UgaWYgKGRzdCAlIDIgPT0gMCAmJiBzcmMgJSAyID09IDAgJiYgc2l6ZSAlIDIgPT0gMCkgeworCQljb25mID0gV0RTSVpFXzE2OworCQlzaGlmdCA9IDE7CisJfSBlbHNlIHsKKwkJY29uZiA9IFdEU0laRV84OworCQlzaGlmdCA9IDA7CisJfQorCisJLyogSWYgdGhlIHR3byBtZW1vcnkgcmVnaW9ucyBoYXZlIGEgY2hhbmNlIG9mIG92ZXJsYXBwaW5nLCBtYWtlCisJICogc3VyZSB0aGUgbWVtY3B5IHN0aWxsIHdvcmtzIGFzIGV4cGVjdGVkLiAgRG8gdGhpcyBieSBoYXZpbmcgdGhlCisJICogY29weSBydW4gYmFja3dhcmRzIGluc3RlYWQuCisJICovCisJbW9kID0gMSA8PCBzaGlmdDsKKwlpZiAoc3JjIDwgZHN0KSB7CisJCW1vZCAqPSAtMTsKKwkJZHN0ICs9IHNpemUgKyBtb2Q7CisJCXNyYyArPSBzaXplICsgbW9kOworCX0KKwlzaXplID4+PSBzaGlmdDsKKworCWlmIChzaXplID4gMHgxMDAwMCkKKwkJY29uZiB8PSBETUEyRDsKKworCV9fZG1hX21lbWNweShkc3QsIG1vZCwgc3JjLCBtb2QsIHNpemUsIGNvbmYpOworCisJcmV0dXJuIHBkc3Q7Cit9CisKKy8qKgorICoJZG1hX21lbWNweSAtIERNQSBtZW1jcHkgdW5kZXIgbXV0ZXggbG9jaworICoKKyAqIERvIG5vdCBjaGVjayBhcmd1bWVudHMgYmVmb3JlIHN0YXJ0aW5nIHRoZSBETUEgbWVtY3B5LiAgQnJlYWsgdGhlIHRyYW5zZmVyCisgKiB1cCBpbnRvIHR3byBwaWVjZXMuICBUaGUgZmlyc3QgdHJhbnNmZXIgaXMgaW4gbXVsdGlwbGVzIG9mIDY0ayBhbmQgdGhlCisgKiBzZWNvbmQgdHJhbnNmZXIgaXMgdGhlIHBpZWNlIHNtYWxsZXIgdGhhbiA2NGsuCisgKi8KK3ZvaWQgKmRtYV9tZW1jcHkodm9pZCAqcGRzdCwgY29uc3Qgdm9pZCAqcHNyYywgc2l6ZV90IHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBkc3QgPSAodW5zaWduZWQgbG9uZylwZHN0OworCXVuc2lnbmVkIGxvbmcgc3JjID0gKHVuc2lnbmVkIGxvbmcpcHNyYzsKKwlzaXplX3QgYnVsaywgcmVzdDsKKworCWlmIChiZmluX2FkZHJfZGNhY2hhYmxlKHNyYykpCisJCWJsYWNrZmluX2RjYWNoZV9mbHVzaF9yYW5nZShzcmMsIHNyYyArIHNpemUpOworCisJaWYgKGJmaW5fYWRkcl9kY2FjaGFibGUoZHN0KSkKKwkJYmxhY2tmaW5fZGNhY2hlX2ludmFsaWRhdGVfcmFuZ2UoZHN0LCBkc3QgKyBzaXplKTsKKworCWJ1bGsgPSBzaXplICYgfjB4ZmZmZjsKIAlyZXN0ID0gc2l6ZSAtIGJ1bGs7CiAJaWYgKGJ1bGspCi0JCV9fZG1hX21lbWNweShkZXN0LCBzcmMsIGJ1bGspOwotCWFkZHIgPSBfX2RtYV9tZW1jcHkoZGVzdCtidWxrLCBzcmMrYnVsaywgcmVzdCk7Ci0JcmV0dXJuIGFkZHI7CisJCV9kbWFfbWVtY3B5KHBkc3QsIHBzcmMsIGJ1bGspOworCV9kbWFfbWVtY3B5KHBkc3QgKyBidWxrLCBwc3JjICsgYnVsaywgcmVzdCk7CisJcmV0dXJuIHBkc3Q7CiB9CiBFWFBPUlRfU1lNQk9MKGRtYV9tZW1jcHkpOwogCi12b2lkICpzYWZlX2RtYV9tZW1jcHkodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc2l6ZSkKKy8qKgorICoJc2FmZV9kbWFfbWVtY3B5IC0gRE1BIG1lbWNweSB3L2FyZ3VtZW50IGNoZWNraW5nCisgKgorICogVmVyaWZ5IGFyZ3VtZW50cyBhcmUgc2FmZSBiZWZvcmUgaGVhZGluZyB0byBkbWFfbWVtY3B5KCkuCisgKi8KK3ZvaWQgKnNhZmVfZG1hX21lbWNweSh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNpemUpCiB7Ci0Jdm9pZCAqYWRkcjsKLQlhZGRyID0gZG1hX21lbWNweShkZXN0LCBzcmMsIHNpemUpOwotCXJldHVybiBhZGRyOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZHN0LCBzaXplKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHNyYywgc2l6ZSkpCisJCXJldHVybiBOVUxMOworCXJldHVybiBkbWFfbWVtY3B5KGRzdCwgc3JjLCBzaXplKTsKIH0KIEVYUE9SVF9TWU1CT0woc2FmZV9kbWFfbWVtY3B5KTsKIAotdm9pZCBkbWFfb3V0c2IodW5zaWduZWQgbG9uZyBhZGRyLCBjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIHNob3J0IGxlbikKK3N0YXRpYyB2b2lkIF9kbWFfb3V0KHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBidWYsIHVuc2lnbmVkIHNob3J0IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgIHUxNiBzaXplLCB1MTYgZG1hX3NpemUpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCWJsYWNrZmluX2RjYWNoZV9mbHVzaF9yYW5nZSgodW5zaWduZWQgaW50KWJ1ZiwKLQkJCSAodW5zaWduZWQgaW50KShidWYpICsgbGVuKTsKLQotCWJmaW5fd3JpdGVfTURNQV9EMF9TVEFSVF9BRERSKGFkZHIpOwotCWJmaW5fd3JpdGVfTURNQV9EMF9YX0NPVU5UKGxlbik7Ci0JYmZpbl93cml0ZV9NRE1BX0QwX1hfTU9ESUZZKDApOwotCWJmaW5fd3JpdGVfTURNQV9EMF9JUlFfU1RBVFVTKERNQV9ET05FIHwgRE1BX0VSUik7Ci0KLQliZmluX3dyaXRlX01ETUFfUzBfU1RBUlRfQUREUihidWYpOwotCWJmaW5fd3JpdGVfTURNQV9TMF9YX0NPVU5UKGxlbik7Ci0JYmZpbl93cml0ZV9NRE1BX1MwX1hfTU9ESUZZKDEpOwotCWJmaW5fd3JpdGVfTURNQV9TMF9JUlFfU1RBVFVTKERNQV9ET05FIHwgRE1BX0VSUik7Ci0KLQliZmluX3dyaXRlX01ETUFfUzBfQ09ORklHKERNQUVOIHwgV0RTSVpFXzgpOwotCWJmaW5fd3JpdGVfTURNQV9EMF9DT05GSUcoV05SIHwgRElfRU4gfCBETUFFTiB8IFdEU0laRV84KTsKLQotCVNTWU5DKCk7Ci0KLQl3aGlsZSAoIShiZmluX3JlYWRfTURNQV9EMF9JUlFfU1RBVFVTKCkgJiBETUFfRE9ORSkpOwotCi0JYmZpbl93cml0ZV9NRE1BX0QwX0lSUV9TVEFUVVMoRE1BX0RPTkUgfCBETUFfRVJSKTsKLQotCWJmaW5fd3JpdGVfTURNQV9TMF9DT05GSUcoMCk7Ci0JYmZpbl93cml0ZV9NRE1BX0QwX0NPTkZJRygwKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KKwlibGFja2Zpbl9kY2FjaGVfZmx1c2hfcmFuZ2UoYnVmLCBidWYgKyBsZW4gKiBzaXplKTsKKwlfX2RtYV9tZW1jcHkoYWRkciwgMCwgYnVmLCBzaXplLCBsZW4sIGRtYV9zaXplKTsKIH0KLUVYUE9SVF9TWU1CT0woZG1hX291dHNiKTsKIAotCi12b2lkIGRtYV9pbnNiKHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqYnVmLCB1bnNpZ25lZCBzaG9ydCBsZW4pCitzdGF0aWMgdm9pZCBfZG1hX2luKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBidWYsIHVuc2lnbmVkIHNob3J0IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgdTE2IHNpemUsIHUxNiBkbWFfc2l6ZSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JYmxhY2tmaW5fZGNhY2hlX2ludmFsaWRhdGVfcmFuZ2UoKHVuc2lnbmVkIGludClidWYsCi0JCQkgKHVuc2lnbmVkIGludCkoYnVmKSArIGxlbik7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JYmZpbl93cml0ZV9NRE1BX0QwX1NUQVJUX0FERFIoYnVmKTsKLQliZmluX3dyaXRlX01ETUFfRDBfWF9DT1VOVChsZW4pOwotCWJmaW5fd3JpdGVfTURNQV9EMF9YX01PRElGWSgxKTsKLQliZmluX3dyaXRlX01ETUFfRDBfSVJRX1NUQVRVUyhETUFfRE9ORSB8IERNQV9FUlIpOwotCi0JYmZpbl93cml0ZV9NRE1BX1MwX1NUQVJUX0FERFIoYWRkcik7Ci0JYmZpbl93cml0ZV9NRE1BX1MwX1hfQ09VTlQobGVuKTsKLQliZmluX3dyaXRlX01ETUFfUzBfWF9NT0RJRlkoMCk7Ci0JYmZpbl93cml0ZV9NRE1BX1MwX0lSUV9TVEFUVVMoRE1BX0RPTkUgfCBETUFfRVJSKTsKLQotCWJmaW5fd3JpdGVfTURNQV9TMF9DT05GSUcoRE1BRU4gfCBXRFNJWkVfOCk7Ci0JYmZpbl93cml0ZV9NRE1BX0QwX0NPTkZJRyhXTlIgfCBESV9FTiB8IERNQUVOIHwgV0RTSVpFXzgpOwotCi0JU1NZTkMoKTsKLQotCXdoaWxlICghKGJmaW5fcmVhZF9NRE1BX0QwX0lSUV9TVEFUVVMoKSAmIERNQV9ET05FKSk7Ci0KLQliZmluX3dyaXRlX01ETUFfRDBfSVJRX1NUQVRVUyhETUFfRE9ORSB8IERNQV9FUlIpOwotCi0JYmZpbl93cml0ZV9NRE1BX1MwX0NPTkZJRygwKTsKLQliZmluX3dyaXRlX01ETUFfRDBfQ09ORklHKDApOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQorCWJsYWNrZmluX2RjYWNoZV9pbnZhbGlkYXRlX3JhbmdlKGJ1ZiwgYnVmICsgbGVuICogc2l6ZSk7CisJX19kbWFfbWVtY3B5KGJ1Ziwgc2l6ZSwgYWRkciwgMCwgbGVuLCBkbWFfc2l6ZSk7CiB9Ci1FWFBPUlRfU1lNQk9MKGRtYV9pbnNiKTsKIAotdm9pZCBkbWFfb3V0c3codW5zaWduZWQgbG9uZyBhZGRyLCBjb25zdCB2b2lkICAqYnVmLCB1bnNpZ25lZCBzaG9ydCBsZW4pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCWJsYWNrZmluX2RjYWNoZV9mbHVzaF9yYW5nZSgodW5zaWduZWQgaW50KWJ1ZiwKLQkJCSAodW5zaWduZWQgaW50KShidWYpICsgbGVuICogc2l6ZW9mKHNob3J0KSk7Ci0KLQliZmluX3dyaXRlX01ETUFfRDBfU1RBUlRfQUREUihhZGRyKTsKLQliZmluX3dyaXRlX01ETUFfRDBfWF9DT1VOVChsZW4pOwotCWJmaW5fd3JpdGVfTURNQV9EMF9YX01PRElGWSgwKTsKLQliZmluX3dyaXRlX01ETUFfRDBfSVJRX1NUQVRVUyhETUFfRE9ORSB8IERNQV9FUlIpOwotCi0JYmZpbl93cml0ZV9NRE1BX1MwX1NUQVJUX0FERFIoYnVmKTsKLQliZmluX3dyaXRlX01ETUFfUzBfWF9DT1VOVChsZW4pOwotCWJmaW5fd3JpdGVfTURNQV9TMF9YX01PRElGWSgyKTsKLQliZmluX3dyaXRlX01ETUFfUzBfSVJRX1NUQVRVUyhETUFfRE9ORSB8IERNQV9FUlIpOwotCi0JYmZpbl93cml0ZV9NRE1BX1MwX0NPTkZJRyhETUFFTiB8IFdEU0laRV8xNik7Ci0JYmZpbl93cml0ZV9NRE1BX0QwX0NPTkZJRyhXTlIgfCBESV9FTiB8IERNQUVOIHwgV0RTSVpFXzE2KTsKLQotCVNTWU5DKCk7Ci0KLQl3aGlsZSAoIShiZmluX3JlYWRfTURNQV9EMF9JUlFfU1RBVFVTKCkgJiBETUFfRE9ORSkpOwotCi0JYmZpbl93cml0ZV9NRE1BX0QwX0lSUV9TVEFUVVMoRE1BX0RPTkUgfCBETUFfRVJSKTsKLQotCWJmaW5fd3JpdGVfTURNQV9TMF9DT05GSUcoMCk7Ci0JYmZpbl93cml0ZV9NRE1BX0QwX0NPTkZJRygwKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLX0KLUVYUE9SVF9TWU1CT0woZG1hX291dHN3KTsKLQotdm9pZCBkbWFfaW5zdyh1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgc2hvcnQgbGVuKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlibGFja2Zpbl9kY2FjaGVfaW52YWxpZGF0ZV9yYW5nZSgodW5zaWduZWQgaW50KWJ1ZiwKLQkJCSAodW5zaWduZWQgaW50KShidWYpICsgbGVuICogc2l6ZW9mKHNob3J0KSk7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQliZmluX3dyaXRlX01ETUFfRDBfU1RBUlRfQUREUihidWYpOwotCWJmaW5fd3JpdGVfTURNQV9EMF9YX0NPVU5UKGxlbik7Ci0JYmZpbl93cml0ZV9NRE1BX0QwX1hfTU9ESUZZKDIpOwotCWJmaW5fd3JpdGVfTURNQV9EMF9JUlFfU1RBVFVTKERNQV9ET05FIHwgRE1BX0VSUik7Ci0KLQliZmluX3dyaXRlX01ETUFfUzBfU1RBUlRfQUREUihhZGRyKTsKLQliZmluX3dyaXRlX01ETUFfUzBfWF9DT1VOVChsZW4pOwotCWJmaW5fd3JpdGVfTURNQV9TMF9YX01PRElGWSgwKTsKLQliZmluX3dyaXRlX01ETUFfUzBfSVJRX1NUQVRVUyhETUFfRE9ORSB8IERNQV9FUlIpOwotCi0JYmZpbl93cml0ZV9NRE1BX1MwX0NPTkZJRyhETUFFTiB8IFdEU0laRV8xNik7Ci0JYmZpbl93cml0ZV9NRE1BX0QwX0NPTkZJRyhXTlIgfCBESV9FTiB8IERNQUVOIHwgV0RTSVpFXzE2KTsKLQotCVNTWU5DKCk7Ci0KLQl3aGlsZSAoIShiZmluX3JlYWRfTURNQV9EMF9JUlFfU1RBVFVTKCkgJiBETUFfRE9ORSkpOwotCi0JYmZpbl93cml0ZV9NRE1BX0QwX0lSUV9TVEFUVVMoRE1BX0RPTkUgfCBETUFfRVJSKTsKLQotCWJmaW5fd3JpdGVfTURNQV9TMF9DT05GSUcoMCk7Ci0JYmZpbl93cml0ZV9NRE1BX0QwX0NPTkZJRygwKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLX0KLUVYUE9SVF9TWU1CT0woZG1hX2luc3cpOwotCi12b2lkIGRtYV9vdXRzbCh1bnNpZ25lZCBsb25nIGFkZHIsIGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgc2hvcnQgbGVuKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQlibGFja2Zpbl9kY2FjaGVfZmx1c2hfcmFuZ2UoKHVuc2lnbmVkIGludClidWYsCi0JCQkgKHVuc2lnbmVkIGludCkoYnVmKSArIGxlbiAqIHNpemVvZihsb25nKSk7Ci0KLQliZmluX3dyaXRlX01ETUFfRDBfU1RBUlRfQUREUihhZGRyKTsKLQliZmluX3dyaXRlX01ETUFfRDBfWF9DT1VOVChsZW4pOwotCWJmaW5fd3JpdGVfTURNQV9EMF9YX01PRElGWSgwKTsKLQliZmluX3dyaXRlX01ETUFfRDBfSVJRX1NUQVRVUyhETUFfRE9ORSB8IERNQV9FUlIpOwotCi0JYmZpbl93cml0ZV9NRE1BX1MwX1NUQVJUX0FERFIoYnVmKTsKLQliZmluX3dyaXRlX01ETUFfUzBfWF9DT1VOVChsZW4pOwotCWJmaW5fd3JpdGVfTURNQV9TMF9YX01PRElGWSg0KTsKLQliZmluX3dyaXRlX01ETUFfUzBfSVJRX1NUQVRVUyhETUFfRE9ORSB8IERNQV9FUlIpOwotCi0JYmZpbl93cml0ZV9NRE1BX1MwX0NPTkZJRyhETUFFTiB8IFdEU0laRV8zMik7Ci0JYmZpbl93cml0ZV9NRE1BX0QwX0NPTkZJRyhXTlIgfCBESV9FTiB8IERNQUVOIHwgV0RTSVpFXzMyKTsKLQotCVNTWU5DKCk7Ci0KLQl3aGlsZSAoIShiZmluX3JlYWRfTURNQV9EMF9JUlFfU1RBVFVTKCkgJiBETUFfRE9ORSkpOwotCi0JYmZpbl93cml0ZV9NRE1BX0QwX0lSUV9TVEFUVVMoRE1BX0RPTkUgfCBETUFfRVJSKTsKLQotCWJmaW5fd3JpdGVfTURNQV9TMF9DT05GSUcoMCk7Ci0JYmZpbl93cml0ZV9NRE1BX0QwX0NPTkZJRygwKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLX0KLUVYUE9SVF9TWU1CT0woZG1hX291dHNsKTsKLQotdm9pZCBkbWFfaW5zbCh1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgc2hvcnQgbGVuKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlibGFja2Zpbl9kY2FjaGVfaW52YWxpZGF0ZV9yYW5nZSgodW5zaWduZWQgaW50KWJ1ZiwKLQkJCSAodW5zaWduZWQgaW50KShidWYpICsgbGVuICogc2l6ZW9mKGxvbmcpKTsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCWJmaW5fd3JpdGVfTURNQV9EMF9TVEFSVF9BRERSKGJ1Zik7Ci0JYmZpbl93cml0ZV9NRE1BX0QwX1hfQ09VTlQobGVuKTsKLQliZmluX3dyaXRlX01ETUFfRDBfWF9NT0RJRlkoNCk7Ci0JYmZpbl93cml0ZV9NRE1BX0QwX0lSUV9TVEFUVVMoRE1BX0RPTkUgfCBETUFfRVJSKTsKLQotCWJmaW5fd3JpdGVfTURNQV9TMF9TVEFSVF9BRERSKGFkZHIpOwotCWJmaW5fd3JpdGVfTURNQV9TMF9YX0NPVU5UKGxlbik7Ci0JYmZpbl93cml0ZV9NRE1BX1MwX1hfTU9ESUZZKDApOwotCWJmaW5fd3JpdGVfTURNQV9TMF9JUlFfU1RBVFVTKERNQV9ET05FIHwgRE1BX0VSUik7Ci0KLQliZmluX3dyaXRlX01ETUFfUzBfQ09ORklHKERNQUVOIHwgV0RTSVpFXzMyKTsKLQliZmluX3dyaXRlX01ETUFfRDBfQ09ORklHKFdOUiB8IERJX0VOIHwgRE1BRU4gfCBXRFNJWkVfMzIpOwotCi0JU1NZTkMoKTsKLQotCXdoaWxlICghKGJmaW5fcmVhZF9NRE1BX0QwX0lSUV9TVEFUVVMoKSAmIERNQV9ET05FKSk7Ci0KLQliZmluX3dyaXRlX01ETUFfRDBfSVJRX1NUQVRVUyhETUFfRE9ORSB8IERNQV9FUlIpOwotCi0JYmZpbl93cml0ZV9NRE1BX1MwX0NPTkZJRygwKTsKLQliZmluX3dyaXRlX01ETUFfRDBfQ09ORklHKDApOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotfQotRVhQT1JUX1NZTUJPTChkbWFfaW5zbCk7CisjZGVmaW5lIE1BS0VfRE1BX0lPKGlvLCBid2wsIGlzaXplLCBkbWFzaXplLCBjbnN0KSBcCit2b2lkIGRtYV8jI2lvIyNzIyNid2wodW5zaWduZWQgbG9uZyBhZGRyLCBjbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgc2hvcnQgbGVuKSBcCit7IFwKKwlfZG1hXyMjaW8oYWRkciwgKHVuc2lnbmVkIGxvbmcpYnVmLCBsZW4sIGlzaXplLCBXRFNJWkVfIyNkbWFzaXplKTsgXAorfSBcCitFWFBPUlRfU1lNQk9MKGRtYV8jI2lvIyNzIyNid2wpCitNQUtFX0RNQV9JTyhvdXQsIGIsIDEsICA4LCBjb25zdCk7CitNQUtFX0RNQV9JTyhpbiwgIGIsIDEsICA4LCApOworTUFLRV9ETUFfSU8ob3V0LCB3LCAyLCAxNiwgY29uc3QpOworTUFLRV9ETUFfSU8oaW4sICB3LCAyLCAxNiwgKTsKK01BS0VfRE1BX0lPKG91dCwgbCwgNCwgMzIsIGNvbnN0KTsKK01BS0VfRE1BX0lPKGluLCAgbCwgNCwgMzIsICk7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9iZmluX2dwaW8uYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2JmaW5fZ3Bpby5jCmluZGV4IDVjMDgwMGEuLjRjMTQzMzEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2JmaW5fZ3Bpby5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2JmaW5fZ3Bpby5jCkBAIC0xMTksMjggKzExOSwyOCBAQAogI2RlZmluZSBBV0FfRFVNTVlfUkVBRCguLi4pICBkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAotI2lmZGVmIEJGNTMzX0ZBTUlMWQotc3RhdGljIHN0cnVjdCBncGlvX3BvcnRfdCAqZ3Bpb19iYW5rYltncGlvX2JhbmsoTUFYX0JMQUNLRklOX0dQSU9TKV0gPSB7CisjaWYgZGVmaW5lZChCRjUzM19GQU1JTFkpIHx8IGRlZmluZWQoQkY1MzhfRkFNSUxZKQorc3RhdGljIHN0cnVjdCBncGlvX3BvcnRfdCAqZ3Bpb19iYW5rYltdID0gewogCShzdHJ1Y3QgZ3Bpb19wb3J0X3QgKikgRklPX0ZMQUdfRCwKIH07CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQkY1MjdfRkFNSUxZKSB8fCBkZWZpbmVkKEJGNTM3X0ZBTUlMWSkKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19wb3J0X3QgKmdwaW9fYmFua2JbZ3Bpb19iYW5rKE1BWF9CTEFDS0ZJTl9HUElPUyldID0geworI2lmIGRlZmluZWQoQkY1MjdfRkFNSUxZKSB8fCBkZWZpbmVkKEJGNTM3X0ZBTUlMWSkgfHwgZGVmaW5lZChCRjUxOF9GQU1JTFkpCitzdGF0aWMgc3RydWN0IGdwaW9fcG9ydF90ICpncGlvX2JhbmtiW10gPSB7CiAJKHN0cnVjdCBncGlvX3BvcnRfdCAqKSBQT1JURklPLAogCShzdHJ1Y3QgZ3Bpb19wb3J0X3QgKikgUE9SVEdJTywKIAkoc3RydWN0IGdwaW9fcG9ydF90ICopIFBPUlRISU8sCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgKnBvcnRfZmVyW2dwaW9fYmFuayhNQVhfQkxBQ0tGSU5fR1BJT1MpXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCAqcG9ydF9mZXJbXSA9IHsKIAkodW5zaWduZWQgc2hvcnQgKikgUE9SVEZfRkVSLAogCSh1bnNpZ25lZCBzaG9ydCAqKSBQT1JUR19GRVIsCiAJKHVuc2lnbmVkIHNob3J0ICopIFBPUlRIX0ZFUiwKIH07CiAjZW5kaWYKIAotI2lmZGVmIEJGNTI3X0ZBTUlMWQotc3RhdGljIHVuc2lnbmVkIHNob3J0ICpwb3J0X211eFtncGlvX2JhbmsoTUFYX0JMQUNLRklOX0dQSU9TKV0gPSB7CisjaWYgZGVmaW5lZChCRjUyN19GQU1JTFkpIHx8IGRlZmluZWQoQkY1MThfRkFNSUxZKQorc3RhdGljIHVuc2lnbmVkIHNob3J0ICpwb3J0X211eFtdID0gewogCSh1bnNpZ25lZCBzaG9ydCAqKSBQT1JURl9NVVgsCiAJKHVuc2lnbmVkIHNob3J0ICopIFBPUlRHX01VWCwKIAkodW5zaWduZWQgc2hvcnQgKikgUE9SVEhfTVVYLApAQCAtMTU1LDcgKzE1NSw3IEBACiAjZW5kaWYKIAogI2lmZGVmIEJGNTYxX0ZBTUlMWQotc3RhdGljIHN0cnVjdCBncGlvX3BvcnRfdCAqZ3Bpb19iYW5rYltncGlvX2JhbmsoTUFYX0JMQUNLRklOX0dQSU9TKV0gPSB7CitzdGF0aWMgc3RydWN0IGdwaW9fcG9ydF90ICpncGlvX2JhbmtiW10gPSB7CiAJKHN0cnVjdCBncGlvX3BvcnRfdCAqKSBGSU8wX0ZMQUdfRCwKIAkoc3RydWN0IGdwaW9fcG9ydF90ICopIEZJTzFfRkxBR19ELAogCShzdHJ1Y3QgZ3Bpb19wb3J0X3QgKikgRklPMl9GTEFHX0QsCkBAIC0xNjMsNyArMTYzLDcgQEAKICNlbmRpZgogCiAjaWZkZWYgQkY1NDhfRkFNSUxZCi1zdGF0aWMgc3RydWN0IGdwaW9fcG9ydF90ICpncGlvX2FycmF5W2dwaW9fYmFuayhNQVhfQkxBQ0tGSU5fR1BJT1MpXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19wb3J0X3QgKmdwaW9fYXJyYXlbXSA9IHsKIAkoc3RydWN0IGdwaW9fcG9ydF90ICopUE9SVEFfRkVSLAogCShzdHJ1Y3QgZ3Bpb19wb3J0X3QgKilQT1JUQl9GRVIsCiAJKHN0cnVjdCBncGlvX3BvcnRfdCAqKVBPUlRDX0ZFUiwKQEAgLTE3Nyw4ICsxNzcsOSBAQAogfTsKICNlbmRpZgogCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgcmVzZXJ2ZWRfZ3Bpb19tYXBbZ3Bpb19iYW5rKE1BWF9CTEFDS0ZJTl9HUElPUyldOworc3RhdGljIHVuc2lnbmVkIHNob3J0IHJlc2VydmVkX2dwaW9fbWFwW0dQSU9fQkFOS19OVU1dOwogc3RhdGljIHVuc2lnbmVkIHNob3J0IHJlc2VydmVkX3BlcmlfbWFwW2dwaW9fYmFuayhNQVhfUkVTT1VSQ0VTKV07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcmVzZXJ2ZWRfZ3Bpb19pcnFfbWFwW0dQSU9fQkFOS19OVU1dOwogCiAjZGVmaW5lIFJFU09VUkNFX0xBQkVMX1NJWkUgCTE2CiAKQEAgLTE4OCw0OCArMTg5LDQ2IEBACiAKICNpZiBkZWZpbmVkKENPTkZJR19QTSkKICNpZiBkZWZpbmVkKENPTkZJR19CRjU0eCkKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19wb3J0X3MgZ3Bpb19iYW5rX3NhdmVkW2dwaW9fYmFuayhNQVhfQkxBQ0tGSU5fR1BJT1MpXTsKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19wb3J0X3MgZ3Bpb19iYW5rX3NhdmVkW0dQSU9fQkFOS19OVU1dOwogI2Vsc2UKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCB3YWtldXBfbWFwW2dwaW9fYmFuayhNQVhfQkxBQ0tGSU5fR1BJT1MpXTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCB3YWtldXBfbWFwW0dQSU9fQkFOS19OVU1dOwogc3RhdGljIHVuc2lnbmVkIGNoYXIgd2FrZXVwX2ZsYWdzX21hcFtNQVhfQkxBQ0tGSU5fR1BJT1NdOwotc3RhdGljIHN0cnVjdCBncGlvX3BvcnRfcyBncGlvX2Jhbmtfc2F2ZWRbZ3Bpb19iYW5rKE1BWF9CTEFDS0ZJTl9HUElPUyldOworc3RhdGljIHN0cnVjdCBncGlvX3BvcnRfcyBncGlvX2Jhbmtfc2F2ZWRbR1BJT19CQU5LX05VTV07CiAKICNpZmRlZiBCRjUzM19GQU1JTFkKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc2ljX2l3cl9pcnFzW2dwaW9fYmFuayhNQVhfQkxBQ0tGSU5fR1BJT1MpXSA9IHtJUlFfUFJPR19JTlRCfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2ljX2l3cl9pcnFzW10gPSB7SVJRX1BST0dfSU5UQn07CiAjZW5kaWYKIAogI2lmZGVmIEJGNTM3X0ZBTUlMWQotc3RhdGljIHVuc2lnbmVkIGludCBzaWNfaXdyX2lycXNbZ3Bpb19iYW5rKE1BWF9CTEFDS0ZJTl9HUElPUyldID0ge0lSUV9QUk9HX0lOVEIsIElSUV9QT1JUR19JTlRCLCBJUlFfTUFDX1RYfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2ljX2l3cl9pcnFzW10gPSB7SVJRX1BST0dfSU5UQiwgSVJRX1BPUlRHX0lOVEIsIElSUV9NQUNfVFh9OwogI2VuZGlmCiAKLSNpZmRlZiBCRjUyN19GQU1JTFkKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc2ljX2l3cl9pcnFzW2dwaW9fYmFuayhNQVhfQkxBQ0tGSU5fR1BJT1MpXSA9IHtJUlFfUE9SVEZfSU5UQiwgSVJRX1BPUlRHX0lOVEIsIElSUV9QT1JUSF9JTlRCfTsKKyNpZmRlZiBCRjUzOF9GQU1JTFkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2ljX2l3cl9pcnFzW10gPSB7SVJRX1BPUlRGX0lOVEJ9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJGNTI3X0ZBTUlMWSkgfHwgZGVmaW5lZChCRjUxOF9GQU1JTFkpCitzdGF0aWMgdW5zaWduZWQgaW50IHNpY19pd3JfaXJxc1tdID0ge0lSUV9QT1JURl9JTlRCLCBJUlFfUE9SVEdfSU5UQiwgSVJRX1BPUlRIX0lOVEJ9OwogI2VuZGlmCiAKICNpZmRlZiBCRjU2MV9GQU1JTFkKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc2ljX2l3cl9pcnFzW2dwaW9fYmFuayhNQVhfQkxBQ0tGSU5fR1BJT1MpXSA9IHtJUlFfUFJPRzBfSU5UQiwgSVJRX1BST0cxX0lOVEIsIElSUV9QUk9HMl9JTlRCfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2ljX2l3cl9pcnFzW10gPSB7SVJRX1BST0cwX0lOVEIsIElSUV9QUk9HMV9JTlRCLCBJUlFfUFJPRzJfSU5UQn07CiAjZW5kaWYKICNlbmRpZgogI2VuZGlmIC8qIENPTkZJR19QTSAqLwogCi0jaWYgZGVmaW5lZChCRjU0OF9GQU1JTFkpCiBpbmxpbmUgaW50IGNoZWNrX2dwaW8odW5zaWduZWQgZ3BpbykKIHsKKyNpZiBkZWZpbmVkKEJGNTQ4X0ZBTUlMWSkKIAlpZiAoZ3BpbyA9PSBHUElPX1BCMTUgfHwgZ3BpbyA9PSBHUElPX1BDMTQgfHwgZ3BpbyA9PSBHUElPX1BDMTUKIAkgICAgfHwgZ3BpbyA9PSBHUElPX1BIMTQgfHwgZ3BpbyA9PSBHUElPX1BIMTUKLQkgICAgfHwgZ3BpbyA9PSBHUElPX1BKMTQgfHwgZ3BpbyA9PSBHUElPX1BKMTUKLQkgICAgfHwgZ3BpbyA+PSBNQVhfQkxBQ0tGSU5fR1BJT1MpCisJICAgIHx8IGdwaW8gPT0gR1BJT19QSjE0IHx8IGdwaW8gPT0gR1BJT19QSjE1KQogCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXR1cm4gMDsKLX0KLSNlbHNlCi1pbmxpbmUgaW50IGNoZWNrX2dwaW8odW5zaWduZWQgZ3BpbykKLXsKKyNlbmRpZgogCWlmIChncGlvID49IE1BWF9CTEFDS0ZJTl9HUElPUykKIAkJcmV0dXJuIC1FSU5WQUw7CiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYKIAogc3RhdGljIHZvaWQgZ3Bpb19lcnJvcih1bnNpZ25lZCBncGlvKQogewpAQCAtMjU4LDM1ICsyNTcsMzAgQEAKIAl9CiAKIAlpZiAobGFiZWwpCi0JCXJldHVybiBzdHJuY21wKHN0cl9pZGVudFtpZGVudF0ubmFtZSwKLQkJCQkgbGFiZWwsIHN0cmxlbihsYWJlbCkpOworCQlyZXR1cm4gc3RyY21wKHN0cl9pZGVudFtpZGVudF0ubmFtZSwgbGFiZWwpOwogCWVsc2UKIAkJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLSNpZiBkZWZpbmVkKEJGNTI3X0ZBTUlMWSkgfHwgZGVmaW5lZChCRjUzN19GQU1JTFkpCiBzdGF0aWMgdm9pZCBwb3J0X3NldHVwKHVuc2lnbmVkIGdwaW8sIHVuc2lnbmVkIHNob3J0IHVzYWdlKQogewotCWlmICghY2hlY2tfZ3BpbyhncGlvKSkgewotCQlpZiAodXNhZ2UgPT0gR1BJT19VU0FHRSkKLQkJCSpwb3J0X2ZlcltncGlvX2JhbmsoZ3BpbyldICY9IH5ncGlvX2JpdChncGlvKTsKLQkJZWxzZQotCQkJKnBvcnRfZmVyW2dwaW9fYmFuayhncGlvKV0gfD0gZ3Bpb19iaXQoZ3Bpbyk7Ci0JCVNTWU5DKCk7Ci0JfQotfQorCWlmIChjaGVja19ncGlvKGdwaW8pKQorCQlyZXR1cm47CisKKyNpZiBkZWZpbmVkKEJGNTI3X0ZBTUlMWSkgfHwgZGVmaW5lZChCRjUzN19GQU1JTFkpIHx8IGRlZmluZWQoQkY1MThfRkFNSUxZKQorCWlmICh1c2FnZSA9PSBHUElPX1VTQUdFKQorCQkqcG9ydF9mZXJbZ3Bpb19iYW5rKGdwaW8pXSAmPSB+Z3Bpb19iaXQoZ3Bpbyk7CisJZWxzZQorCQkqcG9ydF9mZXJbZ3Bpb19iYW5rKGdwaW8pXSB8PSBncGlvX2JpdChncGlvKTsKKwlTU1lOQygpOwogI2VsaWYgZGVmaW5lZChCRjU0OF9GQU1JTFkpCi1zdGF0aWMgdm9pZCBwb3J0X3NldHVwKHVuc2lnbmVkIGdwaW8sIHVuc2lnbmVkIHNob3J0IHVzYWdlKQotewogCWlmICh1c2FnZSA9PSBHUElPX1VTQUdFKQogCQlncGlvX2FycmF5W2dwaW9fYmFuayhncGlvKV0tPnBvcnRfZmVyICY9IH5ncGlvX2JpdChncGlvKTsKIAllbHNlCiAJCWdwaW9fYXJyYXlbZ3Bpb19iYW5rKGdwaW8pXS0+cG9ydF9mZXIgfD0gZ3Bpb19iaXQoZ3Bpbyk7CiAJU1NZTkMoKTsKLX0KLSNlbHNlCi0jIGRlZmluZSBwb3J0X3NldHVwKC4uLikgIGRvIHsgfSB3aGlsZSAoMCkKICNlbmRpZgorfQogCiAjaWZkZWYgQkY1MzdfRkFNSUxZCiBzdGF0aWMgc3RydWN0IHsKQEAgLTM3OSw3ICszNzMsNyBAQAogCiAJcmV0dXJuIChwbXV4ID4+ICgyICogZ3Bpb19zdWJfbihwb3J0bm8pKSAmIDB4Myk7CiB9Ci0jZWxpZiBkZWZpbmVkKEJGNTI3X0ZBTUlMWSkKKyNlbGlmIGRlZmluZWQoQkY1MjdfRkFNSUxZKSB8fCBkZWZpbmVkKEJGNTE4X0ZBTUlMWSkKIGlubGluZSB2b2lkIHBvcnRtdXhfc2V0dXAodW5zaWduZWQgc2hvcnQgcG9ydG5vLCB1bnNpZ25lZCBzaG9ydCBmdW5jdGlvbikKIHsKIAl1MTYgcG11eCwgaWRlbnQgPSBQX0lERU5UKHBvcnRubyk7CkBAIC00MjgsMTMgKzQyMiwxMyBAQAogdm9pZCBzZXRfZ3Bpb18gIyMgbmFtZSh1bnNpZ25lZCBncGlvLCB1bnNpZ25lZCBzaG9ydCBhcmcpIFwKIHsgXAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7IFwKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7IFwKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7IFwKIAlpZiAoYXJnKSBcCiAJCWdwaW9fYmFua2JbZ3Bpb19iYW5rKGdwaW8pXS0+bmFtZSB8PSBncGlvX2JpdChncGlvKTsgXAogCWVsc2UgXAogCQlncGlvX2JhbmtiW2dwaW9fYmFuayhncGlvKV0tPm5hbWUgJj0gfmdwaW9fYml0KGdwaW8pOyBcCiAJQVdBX0RVTU1ZX1JFQUQobmFtZSk7IFwKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7IFwKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7IFwKIH0gXAogRVhQT1JUX1NZTUJPTChzZXRfZ3Bpb18gIyMgbmFtZSk7CiAKQEAgLTQ1MCwxMyArNDQ0LDEzIEBACiB2b2lkIHNldF9ncGlvXyAjIyBuYW1lKHVuc2lnbmVkIGdwaW8sIHVuc2lnbmVkIHNob3J0IGFyZykgXAogeyBcCiAJdW5zaWduZWQgbG9uZyBmbGFnczsgXAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsgXAorCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsgXAogCWlmIChhcmcpIFwKIAkJZ3Bpb19iYW5rYltncGlvX2JhbmsoZ3BpbyldLT5uYW1lICMjIF9zZXQgPSBncGlvX2JpdChncGlvKTsgXAogCWVsc2UgXAogCQlncGlvX2JhbmtiW2dwaW9fYmFuayhncGlvKV0tPm5hbWUgIyMgX2NsZWFyID0gZ3Bpb19iaXQoZ3Bpbyk7IFwKIAlBV0FfRFVNTVlfUkVBRChuYW1lKTsgXAotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsgXAorCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsgXAogfSBcCiBFWFBPUlRfU1lNQk9MKHNldF9ncGlvXyAjIyBuYW1lKTsKICNlbHNlCkBAIC00NzksMTAgKzQ3MywxMCBAQAogdm9pZCBzZXRfZ3Bpb190b2dnbGUodW5zaWduZWQgZ3BpbykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CiAJZ3Bpb19iYW5rYltncGlvX2JhbmsoZ3BpbyldLT50b2dnbGUgPSBncGlvX2JpdChncGlvKTsKIAlBV0FfRFVNTVlfUkVBRCh0b2dnbGUpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CiB9CiAjZWxzZQogdm9pZCBzZXRfZ3Bpb190b2dnbGUodW5zaWduZWQgZ3BpbykKQEAgLTUwMCwxMCArNDk0LDEwIEBACiB2b2lkIHNldF9ncGlvcF8gIyMgbmFtZSh1bnNpZ25lZCBncGlvLCB1bnNpZ25lZCBzaG9ydCBhcmcpIFwKIHsgXAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7IFwKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7IFwKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7IFwKIAlncGlvX2JhbmtiW2dwaW9fYmFuayhncGlvKV0tPm5hbWUgPSBhcmc7IFwKIAlBV0FfRFVNTVlfUkVBRChuYW1lKTsgXAotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsgXAorCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsgXAogfSBcCiBFWFBPUlRfU1lNQk9MKHNldF9ncGlvcF8gIyMgbmFtZSk7CiAjZWxzZQpAQCAtNTMxLDEwICs1MjUsMTAgQEAKIHsgXAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7IFwKIAl1bnNpZ25lZCBzaG9ydCByZXQ7IFwKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7IFwKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7IFwKIAlyZXQgPSAweDAxICYgKGdwaW9fYmFua2JbZ3Bpb19iYW5rKGdwaW8pXS0+bmFtZSA+PiBncGlvX3N1Yl9uKGdwaW8pKTsgXAogCUFXQV9EVU1NWV9SRUFEKG5hbWUpOyBcCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOyBcCisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOyBcCiAJcmV0dXJuIHJldDsgXAogfSBcCiBFWFBPUlRfU1lNQk9MKGdldF9ncGlvXyAjIyBuYW1lKTsKQEAgLTU2NCwxMCArNTU4LDEwIEBACiB7IFwKIAl1bnNpZ25lZCBsb25nIGZsYWdzOyBcCiAJdW5zaWduZWQgc2hvcnQgcmV0OyBcCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOyBcCisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOyBcCiAJcmV0ID0gKGdwaW9fYmFua2JbZ3Bpb19iYW5rKGdwaW8pXS0+bmFtZSk7IFwKIAlBV0FfRFVNTVlfUkVBRChuYW1lKTsgXAotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsgXAorCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsgXAogCXJldHVybiByZXQ7IFwKIH0gXAogRVhQT1JUX1NZTUJPTChnZXRfZ3Bpb3BfICMjIG5hbWUpOwpAQCAtNjE3LDEwICs2MTEsMTAgQEAKIAlpZiAoKGNoZWNrX2dwaW8oZ3BpbykgPCAwKSB8fCAhdHlwZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOwogCXdha2V1cF9tYXBbZ3Bpb19iYW5rKGdwaW8pXSB8PSBncGlvX2JpdChncGlvKTsKIAl3YWtldXBfZmxhZ3NfbWFwW2dwaW9dID0gdHlwZTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02MzMsMTEgKzYyNywxMSBAQAogCWlmIChjaGVja19ncGlvKGdwaW8pIDwgMCkKIAkJcmV0dXJuOwogCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKIAogCXdha2V1cF9tYXBbZ3Bpb19iYW5rKGdwaW8pXSAmPSB+Z3Bpb19iaXQoZ3Bpbyk7CiAKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogfQogRVhQT1JUX1NZTUJPTChncGlvX3BtX3dha2V1cF9mcmVlKTsKIApAQCAtNjc5LDcgKzY3Myw3IEBACiAJCWdwaW9fYmFua2JbYmFua10tPm1hc2tiID0gMDsKIAogCQlpZiAobWFzaykgewotI2lmIGRlZmluZWQoQkY1MjdfRkFNSUxZKSB8fCBkZWZpbmVkKEJGNTM3X0ZBTUlMWSkKKyNpZiBkZWZpbmVkKEJGNTI3X0ZBTUlMWSkgfHwgZGVmaW5lZChCRjUzN19GQU1JTFkpIHx8IGRlZmluZWQoQkY1MThfRkFNSUxZKQogCQkJZ3Bpb19iYW5rX3NhdmVkW2JhbmtdLmZlciAgID0gKnBvcnRfZmVyW2JhbmtdOwogI2VuZGlmCiAJCQlncGlvX2Jhbmtfc2F2ZWRbYmFua10uaW5lbiAgPSBncGlvX2JhbmtiW2JhbmtdLT5pbmVuOwpAQCAtNzI0LDcgKzcxOCw3IEBACiAJCWJhbmsgPSBncGlvX2JhbmsoaSk7CiAKIAkJaWYgKG1hc2spIHsKLSNpZiBkZWZpbmVkKEJGNTI3X0ZBTUlMWSkgfHwgZGVmaW5lZChCRjUzN19GQU1JTFkpCisjaWYgZGVmaW5lZChCRjUyN19GQU1JTFkpIHx8IGRlZmluZWQoQkY1MzdfRkFNSUxZKSB8fCBkZWZpbmVkKEJGNTE4X0ZBTUlMWSkKIAkJCSpwb3J0X2ZlcltiYW5rXSAgIAk9IGdwaW9fYmFua19zYXZlZFtiYW5rXS5mZXI7CiAjZW5kaWYKIAkJCWdwaW9fYmFua2JbYmFua10tPmluZW4gID0gZ3Bpb19iYW5rX3NhdmVkW2JhbmtdLmluZW47CkBAIC03NTAsOSArNzQ0LDkgQEAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0JMQUNLRklOX0dQSU9TOyBpICs9IEdQSU9fQkFOS1NJWkUpIHsKIAkJYmFuayA9IGdwaW9fYmFuayhpKTsKIAotI2lmIGRlZmluZWQoQkY1MjdfRkFNSUxZKSB8fCBkZWZpbmVkKEJGNTM3X0ZBTUlMWSkKKyNpZiBkZWZpbmVkKEJGNTI3X0ZBTUlMWSkgfHwgZGVmaW5lZChCRjUzN19GQU1JTFkpIHx8IGRlZmluZWQoQkY1MThfRkFNSUxZKQogCQkJZ3Bpb19iYW5rX3NhdmVkW2JhbmtdLmZlciAgID0gKnBvcnRfZmVyW2JhbmtdOwotI2lmZGVmIEJGNTI3X0ZBTUlMWQorI2lmIGRlZmluZWQoQkY1MjdfRkFNSUxZKSB8fCBkZWZpbmVkKEJGNTE4X0ZBTUlMWSkKIAkJCWdwaW9fYmFua19zYXZlZFtiYW5rXS5tdXggICA9ICpwb3J0X211eFtiYW5rXTsKICNlbHNlCiAJCQlpZiAoYmFuayA9PSAwKQpAQCAtNzc4LDggKzc3Miw4IEBACiAJZm9yIChpID0gMDsgaSA8IE1BWF9CTEFDS0ZJTl9HUElPUzsgaSArPSBHUElPX0JBTktTSVpFKSB7CiAJCQliYW5rID0gZ3Bpb19iYW5rKGkpOwogCi0jaWYgZGVmaW5lZChCRjUyN19GQU1JTFkpIHx8IGRlZmluZWQoQkY1MzdfRkFNSUxZKQotI2lmZGVmIEJGNTI3X0ZBTUlMWQorI2lmIGRlZmluZWQoQkY1MjdfRkFNSUxZKSB8fCBkZWZpbmVkKEJGNTM3X0ZBTUlMWSkgfHwgZGVmaW5lZChCRjUxOF9GQU1JTFkpCisjaWYgZGVmaW5lZChCRjUyN19GQU1JTFkpIHx8IGRlZmluZWQoQkY1MThfRkFNSUxZKQogCQkJKnBvcnRfbXV4W2JhbmtdID0gZ3Bpb19iYW5rX3NhdmVkW2JhbmtdLm11eDsKICNlbHNlCiAJCQlpZiAoYmFuayA9PSAwKQpAQCAtODczLDcgKzg2Nyw2IEBACiAqIE1PRElGSUNBVElPTiBISVNUT1JZIDoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWZkZWYgQkY1NDhfRkFNSUxZCiBpbnQgcGVyaXBoZXJhbF9yZXF1ZXN0KHVuc2lnbmVkIHNob3J0IHBlciwgY29uc3QgY2hhciAqbGFiZWwpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTg4OSwzMSArODgyLDM1IEBACiAJaWYgKCEocGVyICYgUF9ERUZJTkVEKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpZiAoY2hlY2tfZ3BpbyhpZGVudCkgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQlpZiAodW5saWtlbHkocmVzZXJ2ZWRfZ3Bpb19tYXBbZ3Bpb19iYW5rKGlkZW50KV0gJiBncGlvX2JpdChpZGVudCkpKSB7CisJLyogSWYgYSBwaW4gY2FuIGJlIG11eGVkIGFzIGVpdGhlciBHUElPIG9yIHBlcmlwaGVyYWwsIG1ha2UKKwkgKiBzdXJlIGl0IGlzIG5vdCBhbHJlYWR5IGEgR1BJTyBwaW4gd2hlbiB3ZSByZXF1ZXN0IGl0LgorCSAqLworCWlmICh1bmxpa2VseSghY2hlY2tfZ3BpbyhpZGVudCkgJiYKKwkgICAgcmVzZXJ2ZWRfZ3Bpb19tYXBbZ3Bpb19iYW5rKGlkZW50KV0gJiBncGlvX2JpdChpZGVudCkpKSB7CiAJCWR1bXBfc3RhY2soKTsKIAkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAiJXM6IFBlcmlwaGVyYWwgJWQgaXMgYWxyZWFkeSByZXNlcnZlZCBhcyBHUElPIGJ5ICVzICFcbiIsCisJCSAgICAgICAiJXM6IFBlcmlwaGVyYWwgJWQgaXMgYWxyZWFkeSByZXNlcnZlZCBhcyBHUElPIGJ5ICVzICFcbiIsCiAJCSAgICAgICBfX2Z1bmNfXywgaWRlbnQsIGdldF9sYWJlbChpZGVudCkpOwotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKIAlpZiAodW5saWtlbHkocmVzZXJ2ZWRfcGVyaV9tYXBbZ3Bpb19iYW5rKGlkZW50KV0gJiBncGlvX2JpdChpZGVudCkpKSB7CiAKLQkJdTE2IGZ1bmN0ID0gZ2V0X3BvcnRtdXgoaWRlbnQpOwotCiAJCS8qCiAJCSAqIFBpbiBmdW5jdGlvbnMgbGlrZSBBTUMgYWRkcmVzcyBzdHJvYmVzIG15CiAJCSAqIGJlIHJlcXVlc3RlZCBhbmQgdXNlZCBieSBzZXZlcmFsIGRyaXZlcnMKIAkJICovCiAKLQkJaWYgKCEoKHBlciAmIFBfTUFZU0hBUkUpICYmIChmdW5jdCA9PSBQX0ZVTkNUMk1VWChwZXIpKSkpIHsKKyNpZmRlZiBCRjU0OF9GQU1JTFkKKwkJdTE2IGZ1bmN0ID0gZ2V0X3BvcnRtdXgoaWRlbnQpOwogCisJCWlmICghKChwZXIgJiBQX01BWVNIQVJFKSAmJiAoZnVuY3QgPT0gUF9GVU5DVDJNVVgocGVyKSkpKSB7CisjZWxzZQorCQlpZiAoIShwZXIgJiBQX01BWVNIQVJFKSkgeworI2VuZGlmCiAJCQkvKgogCQkJICogQWxsb3cgdGhhdCB0aGUgaWRlbnRpY2FsIHBpbiBmdW5jdGlvbiBjYW4KIAkJCSAqIGJlIHJlcXVlc3RlZCBmcm9tIHRoZSBzYW1lIGRyaXZlciB0d2ljZQpAQCAtOTI2LDcgKzkyMyw3IEBACiAJCQlwcmludGsoS0VSTl9FUlIKIAkJCSAgICAgICAiJXM6IFBlcmlwaGVyYWwgJWQgZnVuY3Rpb24gJWQgaXMgYWxyZWFkeSByZXNlcnZlZCBieSAlcyAhXG4iLAogCQkJICAgICAgIF9fZnVuY19fLCBpZGVudCwgUF9GVU5DVDJNVVgocGVyKSwgZ2V0X2xhYmVsKGlkZW50KSk7Ci0JCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCQlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CiAJCQlyZXR1cm4gLUVCVVNZOwogCQl9CiAJfQpAQCAtOTM0LDg5ICs5MzEsMTkgQEAKICBhbnl3YXk6CiAJcmVzZXJ2ZWRfcGVyaV9tYXBbZ3Bpb19iYW5rKGlkZW50KV0gfD0gZ3Bpb19iaXQoaWRlbnQpOwogCisjaWZkZWYgQkY1NDhfRkFNSUxZCiAJcG9ydG11eF9zZXR1cChpZGVudCwgUF9GVU5DVDJNVVgocGVyKSk7Ci0JcG9ydF9zZXR1cChpZGVudCwgUEVSSVBIRVJBTF9VU0FHRSk7Ci0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0Jc2V0X2xhYmVsKGlkZW50LCBsYWJlbCk7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0wocGVyaXBoZXJhbF9yZXF1ZXN0KTsKICNlbHNlCi0KLWludCBwZXJpcGhlcmFsX3JlcXVlc3QodW5zaWduZWQgc2hvcnQgcGVyLCBjb25zdCBjaGFyICpsYWJlbCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIHNob3J0IGlkZW50ID0gUF9JREVOVChwZXIpOwotCi0JLyoKLQkgKiBEb24ndCBjYXJlcyBhcmUgcGlucyB3aXRoIG9ubHkgb25lIGRlZGljYXRlZCBmdW5jdGlvbgotCSAqLwotCi0JaWYgKHBlciAmIFBfRE9OVENBUkUpCi0JCXJldHVybiAwOwotCi0JaWYgKCEocGVyICYgUF9ERUZJTkVEKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQlpZiAoIWNoZWNrX2dwaW8oaWRlbnQpKSB7Ci0KLQkJaWYgKHVubGlrZWx5KHJlc2VydmVkX2dwaW9fbWFwW2dwaW9fYmFuayhpZGVudCldICYgZ3Bpb19iaXQoaWRlbnQpKSkgewotCQkJZHVtcF9zdGFjaygpOwotCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgIiVzOiBQZXJpcGhlcmFsICVkIGlzIGFscmVhZHkgcmVzZXJ2ZWQgYXMgR1BJTyBieSAlcyAhXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCBpZGVudCwgZ2V0X2xhYmVsKGlkZW50KSk7Ci0JCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JCQlyZXR1cm4gLUVCVVNZOwotCQl9Ci0KLQl9Ci0KLQlpZiAodW5saWtlbHkocmVzZXJ2ZWRfcGVyaV9tYXBbZ3Bpb19iYW5rKGlkZW50KV0gJiBncGlvX2JpdChpZGVudCkpKSB7Ci0KLQkJLyoKLQkJICogUGluIGZ1bmN0aW9ucyBsaWtlIEFNQyBhZGRyZXNzIHN0cm9iZXMgbXkKLQkJICogYmUgcmVxdWVzdGVkIGFuZCB1c2VkIGJ5IHNldmVyYWwgZHJpdmVycwotCQkgKi8KLQotCQlpZiAoIShwZXIgJiBQX01BWVNIQVJFKSkgewotCi0JCQkvKgotCQkJICogQWxsb3cgdGhhdCB0aGUgaWRlbnRpY2FsIHBpbiBmdW5jdGlvbiBjYW4KLQkJCSAqIGJlIHJlcXVlc3RlZCBmcm9tIHRoZSBzYW1lIGRyaXZlciB0d2ljZQotCQkJICovCi0KLQkJCWlmIChjbXBfbGFiZWwoaWRlbnQsIGxhYmVsKSA9PSAwKQotCQkJCWdvdG8gYW55d2F5OwotCi0JCQlkdW1wX3N0YWNrKCk7Ci0JCQlwcmludGsoS0VSTl9FUlIKLQkJCSAgICAgICAiJXM6IFBlcmlwaGVyYWwgJWQgZnVuY3Rpb24gJWQgaXMgYWxyZWFkeSIKLQkJCSAgICAgICAiIHJlc2VydmVkIGJ5ICVzICFcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIGlkZW50LCBQX0ZVTkNUMk1VWChwZXIpLAotCQkJCWdldF9sYWJlbChpZGVudCkpOwotCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCQkJcmV0dXJuIC1FQlVTWTsKLQkJfQotCi0JfQotCi0gYW55d2F5OgogCXBvcnRtdXhfc2V0dXAocGVyLCBQX0ZVTkNUMk1VWChwZXIpKTsKLQorI2VuZGlmCiAJcG9ydF9zZXR1cChpZGVudCwgUEVSSVBIRVJBTF9VU0FHRSk7CiAKLQlyZXNlcnZlZF9wZXJpX21hcFtncGlvX2JhbmsoaWRlbnQpXSB8PSBncGlvX2JpdChpZGVudCk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKIAlzZXRfbGFiZWwoaWRlbnQsIGxhYmVsKTsKIAogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChwZXJpcGhlcmFsX3JlcXVlc3QpOwotI2VuZGlmCiAKIGludCBwZXJpcGhlcmFsX3JlcXVlc3RfbGlzdChjb25zdCB1bnNpZ25lZCBzaG9ydCBwZXJbXSwgY29uc3QgY2hhciAqbGFiZWwpCiB7CkBAIC0xMDUzLDEwICs5ODAsMTAgQEAKIAlpZiAoY2hlY2tfZ3BpbyhpZGVudCkgPCAwKQogCQlyZXR1cm47CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOwogCiAJaWYgKHVubGlrZWx5KCEocmVzZXJ2ZWRfcGVyaV9tYXBbZ3Bpb19iYW5rKGlkZW50KV0gJiBncGlvX2JpdChpZGVudCkpKSkgewotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTA2Nyw3ICs5OTQsNyBAQAogCiAJc2V0X2xhYmVsKGlkZW50LCAiZnJlZSIpOwogCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKIH0KIEVYUE9SVF9TWU1CT0wocGVyaXBoZXJhbF9mcmVlKTsKIApAQCAtMTA5NCwxNCArMTAyMSwxNCBAQAogKiBNT0RJRklDQVRJT04gSElTVE9SWSA6CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotaW50IGdwaW9fcmVxdWVzdCh1bnNpZ25lZCBncGlvLCBjb25zdCBjaGFyICpsYWJlbCkKK2ludCBiZmluX2dwaW9fcmVxdWVzdCh1bnNpZ25lZCBncGlvLCBjb25zdCBjaGFyICpsYWJlbCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKGNoZWNrX2dwaW8oZ3BpbykgPCAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CiAKIAkvKgogCSAqIEFsbG93IHRoYXQgdGhlIGlkZW50aWNhbCBHUElPIGNhbgpAQCAtMTExMCwxNSArMTAzNywxNSBAQAogCSAqLwogCiAJaWYgKGNtcF9sYWJlbChncGlvLCBsYWJlbCkgPT0gMCkgewotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJaWYgKHVubGlrZWx5KHJlc2VydmVkX2dwaW9fbWFwW2dwaW9fYmFuayhncGlvKV0gJiBncGlvX2JpdChncGlvKSkpIHsKIAkJZHVtcF9zdGFjaygpOwogCQlwcmludGsoS0VSTl9FUlIgImJmaW4tZ3BpbzogR1BJTyAlZCBpcyBhbHJlYWR5IHJlc2VydmVkIGJ5ICVzICFcbiIsCi0JCQkgZ3BpbywgZ2V0X2xhYmVsKGdwaW8pKTsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQkgICAgICAgZ3BpbywgZ2V0X2xhYmVsKGdwaW8pKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAlpZiAodW5saWtlbHkocmVzZXJ2ZWRfcGVyaV9tYXBbZ3Bpb19iYW5rKGdwaW8pXSAmIGdwaW9fYml0KGdwaW8pKSkgewpAQCAtMTEyNiwzNCArMTA1MywzNyBAQAogCQlwcmludGsoS0VSTl9FUlIKIAkJICAgICAgICJiZmluLWdwaW86IEdQSU8gJWQgaXMgYWxyZWFkeSByZXNlcnZlZCBhcyBQZXJpcGhlcmFsIGJ5ICVzICFcbiIsCiAJCSAgICAgICBncGlvLCBnZXRfbGFiZWwoZ3BpbykpOwotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CisJaWYgKHVubGlrZWx5KHJlc2VydmVkX2dwaW9faXJxX21hcFtncGlvX2JhbmsoZ3BpbyldICYgZ3Bpb19iaXQoZ3BpbykpKQorCQlwcmludGsoS0VSTl9OT1RJQ0UgImJmaW4tZ3BpbzogR1BJTyAlZCBpcyBhbHJlYWR5IHJlc2VydmVkIGFzIGdwaW8taXJxISIKKwkJICAgICAgICIgKERvY3VtZW50YXRpb24vYmxhY2tmaW4vYmZpbi1ncGlvLW5vdGVzLnR4dClcbiIsIGdwaW8pOwogCiAJcmVzZXJ2ZWRfZ3Bpb19tYXBbZ3Bpb19iYW5rKGdwaW8pXSB8PSBncGlvX2JpdChncGlvKTsKKwlzZXRfbGFiZWwoZ3BpbywgbGFiZWwpOwogCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKIAogCXBvcnRfc2V0dXAoZ3BpbywgR1BJT19VU0FHRSk7Ci0Jc2V0X2xhYmVsKGdwaW8sIGxhYmVsKTsKIAogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTChncGlvX3JlcXVlc3QpOworRVhQT1JUX1NZTUJPTChiZmluX2dwaW9fcmVxdWVzdCk7CiAKLXZvaWQgZ3Bpb19mcmVlKHVuc2lnbmVkIGdwaW8pCit2b2lkIGJmaW5fZ3Bpb19mcmVlKHVuc2lnbmVkIGdwaW8pCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmIChjaGVja19ncGlvKGdwaW8pIDwgMCkKIAkJcmV0dXJuOwogCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKIAogCWlmICh1bmxpa2VseSghKHJlc2VydmVkX2dwaW9fbWFwW2dwaW9fYmFuayhncGlvKV0gJiBncGlvX2JpdChncGlvKSkpKSB7CiAJCWR1bXBfc3RhY2soKTsKIAkJZ3Bpb19lcnJvcihncGlvKTsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTExNjEsMTMgKzEwOTEsNzYgQEAKIAogCXNldF9sYWJlbChncGlvLCAiZnJlZSIpOwogCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKIH0KLUVYUE9SVF9TWU1CT0woZ3Bpb19mcmVlKTsKK0VYUE9SVF9TWU1CT0woYmZpbl9ncGlvX2ZyZWUpOworCitpbnQgYmZpbl9ncGlvX2lycV9yZXF1ZXN0KHVuc2lnbmVkIGdwaW8sIGNvbnN0IGNoYXIgKmxhYmVsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoY2hlY2tfZ3BpbyhncGlvKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOworCisJaWYgKHVubGlrZWx5KHJlc2VydmVkX2dwaW9faXJxX21hcFtncGlvX2JhbmsoZ3BpbyldICYgZ3Bpb19iaXQoZ3BpbykpKSB7CisJCWR1bXBfc3RhY2soKTsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiYmZpbi1ncGlvOiBHUElPICVkIGlzIGFscmVhZHkgcmVzZXJ2ZWQgYXMgZ3Bpby1pcnEgIVxuIiwKKwkJICAgICAgIGdwaW8pOworCQlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWlmICh1bmxpa2VseShyZXNlcnZlZF9wZXJpX21hcFtncGlvX2JhbmsoZ3BpbyldICYgZ3Bpb19iaXQoZ3BpbykpKSB7CisJCWR1bXBfc3RhY2soKTsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiYmZpbi1ncGlvOiBHUElPICVkIGlzIGFscmVhZHkgcmVzZXJ2ZWQgYXMgUGVyaXBoZXJhbCBieSAlcyAhXG4iLAorCQkgICAgICAgZ3BpbywgZ2V0X2xhYmVsKGdwaW8pKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlpZiAodW5saWtlbHkocmVzZXJ2ZWRfZ3Bpb19tYXBbZ3Bpb19iYW5rKGdwaW8pXSAmIGdwaW9fYml0KGdwaW8pKSkKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJiZmluLWdwaW86IEdQSU8gJWQgaXMgYWxyZWFkeSByZXNlcnZlZCBieSAlcyEgIgorCQkgICAgICAgIihEb2N1bWVudGF0aW9uL2JsYWNrZmluL2JmaW4tZ3Bpby1ub3Rlcy50eHQpXG4iLAorCQkgICAgICAgZ3BpbywgZ2V0X2xhYmVsKGdwaW8pKTsKKworCXJlc2VydmVkX2dwaW9faXJxX21hcFtncGlvX2JhbmsoZ3BpbyldIHw9IGdwaW9fYml0KGdwaW8pOworCXNldF9sYWJlbChncGlvLCBsYWJlbCk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CisKKwlwb3J0X3NldHVwKGdwaW8sIEdQSU9fVVNBR0UpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgYmZpbl9ncGlvX2lycV9mcmVlKHVuc2lnbmVkIGdwaW8pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChjaGVja19ncGlvKGdwaW8pIDwgMCkKKwkJcmV0dXJuOworCisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOworCisJaWYgKHVubGlrZWx5KCEocmVzZXJ2ZWRfZ3Bpb19pcnFfbWFwW2dwaW9fYmFuayhncGlvKV0gJiBncGlvX2JpdChncGlvKSkpKSB7CisJCWR1bXBfc3RhY2soKTsKKwkJZ3Bpb19lcnJvcihncGlvKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJcmVzZXJ2ZWRfZ3Bpb19pcnFfbWFwW2dwaW9fYmFuayhncGlvKV0gJj0gfmdwaW9fYml0KGdwaW8pOworCisJc2V0X2xhYmVsKGdwaW8sICJmcmVlIik7CisKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7Cit9CiAKIAogI2lmZGVmIEJGNTQ4X0ZBTUlMWQotaW50IGdwaW9fZGlyZWN0aW9uX2lucHV0KHVuc2lnbmVkIGdwaW8pCitpbnQgYmZpbl9ncGlvX2RpcmVjdGlvbl9pbnB1dCh1bnNpZ25lZCBncGlvKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTExNzYsMTYgKzExNjksMTYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKIAlncGlvX2FycmF5W2dwaW9fYmFuayhncGlvKV0tPnBvcnRfZGlyX2NsZWFyID0gZ3Bpb19iaXQoZ3Bpbyk7CiAJZ3Bpb19hcnJheVtncGlvX2JhbmsoZ3BpbyldLT5wb3J0X2luZW4gfD0gZ3Bpb19iaXQoZ3Bpbyk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKIAogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTChncGlvX2RpcmVjdGlvbl9pbnB1dCk7CitFWFBPUlRfU1lNQk9MKGJmaW5fZ3Bpb19kaXJlY3Rpb25faW5wdXQpOwogCi1pbnQgZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSkKK2ludCBiZmluX2dwaW9fZGlyZWN0aW9uX291dHB1dCh1bnNpZ25lZCBncGlvLCBpbnQgdmFsdWUpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtMTE5NCwzMCArMTE4NywzMCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOwogCWdwaW9fYXJyYXlbZ3Bpb19iYW5rKGdwaW8pXS0+cG9ydF9pbmVuICY9IH5ncGlvX2JpdChncGlvKTsKIAlncGlvX3NldF92YWx1ZShncGlvLCB2YWx1ZSk7CiAJZ3Bpb19hcnJheVtncGlvX2JhbmsoZ3BpbyldLT5wb3J0X2Rpcl9zZXQgPSBncGlvX2JpdChncGlvKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogCiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKGdwaW9fZGlyZWN0aW9uX291dHB1dCk7CitFWFBPUlRfU1lNQk9MKGJmaW5fZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KTsKIAotdm9pZCBncGlvX3NldF92YWx1ZSh1bnNpZ25lZCBncGlvLCBpbnQgYXJnKQordm9pZCBiZmluX2dwaW9fc2V0X3ZhbHVlKHVuc2lnbmVkIGdwaW8sIGludCBhcmcpCiB7CiAJaWYgKGFyZykKIAkJZ3Bpb19hcnJheVtncGlvX2JhbmsoZ3BpbyldLT5wb3J0X3NldCA9IGdwaW9fYml0KGdwaW8pOwogCWVsc2UKIAkJZ3Bpb19hcnJheVtncGlvX2JhbmsoZ3BpbyldLT5wb3J0X2NsZWFyID0gZ3Bpb19iaXQoZ3Bpbyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGdwaW9fc2V0X3ZhbHVlKTsKK0VYUE9SVF9TWU1CT0woYmZpbl9ncGlvX3NldF92YWx1ZSk7CiAKLWludCBncGlvX2dldF92YWx1ZSh1bnNpZ25lZCBncGlvKQoraW50IGJmaW5fZ3Bpb19nZXRfdmFsdWUodW5zaWduZWQgZ3BpbykKIHsKIAlyZXR1cm4gKDEgJiAoZ3Bpb19hcnJheVtncGlvX2JhbmsoZ3BpbyldLT5wb3J0X2RhdGEgPj4gZ3Bpb19zdWJfbihncGlvKSkpOwogfQotRVhQT1JUX1NZTUJPTChncGlvX2dldF92YWx1ZSk7CitFWFBPUlRfU1lNQk9MKGJmaW5fZ3Bpb19nZXRfdmFsdWUpOwogCiB2b2lkIGJmaW5fZ3Bpb19pcnFfcHJlcGFyZSh1bnNpZ25lZCBncGlvKQogewpAQCAtMTIyNSwzNCArMTIxOCwzNCBAQAogCiAJcG9ydF9zZXR1cChncGlvLCBHUElPX1VTQUdFKTsKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CiAJZ3Bpb19hcnJheVtncGlvX2JhbmsoZ3BpbyldLT5wb3J0X2Rpcl9jbGVhciA9IGdwaW9fYml0KGdwaW8pOwogCWdwaW9fYXJyYXlbZ3Bpb19iYW5rKGdwaW8pXS0+cG9ydF9pbmVuIHw9IGdwaW9fYml0KGdwaW8pOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CiB9CiAKICNlbHNlCiAKLWludCBncGlvX2dldF92YWx1ZSh1bnNpZ25lZCBncGlvKQoraW50IGJmaW5fZ3Bpb19nZXRfdmFsdWUodW5zaWduZWQgZ3BpbykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQ7CiAKIAlpZiAodW5saWtlbHkoZ2V0X2dwaW9fZWRnZShncGlvKSkpIHsKLQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CiAJCXNldF9ncGlvX2VkZ2UoZ3BpbywgMCk7CiAJCXJldCA9IGdldF9ncGlvX2RhdGEoZ3Bpbyk7CiAJCXNldF9ncGlvX2VkZ2UoZ3BpbywgMSk7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogCiAJCXJldHVybiByZXQ7CiAJfSBlbHNlCiAJCXJldHVybiBnZXRfZ3Bpb19kYXRhKGdwaW8pOwogfQotRVhQT1JUX1NZTUJPTChncGlvX2dldF92YWx1ZSk7CitFWFBPUlRfU1lNQk9MKGJmaW5fZ3Bpb19nZXRfdmFsdWUpOwogCiAKLWludCBncGlvX2RpcmVjdGlvbl9pbnB1dCh1bnNpZ25lZCBncGlvKQoraW50IGJmaW5fZ3Bpb19kaXJlY3Rpb25faW5wdXQodW5zaWduZWQgZ3BpbykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0xMjYxLDE3ICsxMjU0LDE3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CiAJZ3Bpb19iYW5rYltncGlvX2JhbmsoZ3BpbyldLT5kaXIgJj0gfmdwaW9fYml0KGdwaW8pOwogCWdwaW9fYmFua2JbZ3Bpb19iYW5rKGdwaW8pXS0+aW5lbiB8PSBncGlvX2JpdChncGlvKTsKIAlBV0FfRFVNTVlfUkVBRChpbmVuKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogCiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKGdwaW9fZGlyZWN0aW9uX2lucHV0KTsKK0VYUE9SVF9TWU1CT0woYmZpbl9ncGlvX2RpcmVjdGlvbl9pbnB1dCk7CiAKLWludCBncGlvX2RpcmVjdGlvbl9vdXRwdXQodW5zaWduZWQgZ3BpbywgaW50IHZhbHVlKQoraW50IGJmaW5fZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0xMjgwLDcgKzEyNzMsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOwogCWdwaW9fYmFua2JbZ3Bpb19iYW5rKGdwaW8pXS0+aW5lbiAmPSB+Z3Bpb19iaXQoZ3Bpbyk7CiAKIAlpZiAodmFsdWUpCkBAIC0xMjkwLDExICsxMjgzLDExIEBACiAKIAlncGlvX2JhbmtiW2dwaW9fYmFuayhncGlvKV0tPmRpciB8PSBncGlvX2JpdChncGlvKTsKIAlBV0FfRFVNTVlfUkVBRChkaXIpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0woZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KTsKK0VYUE9SVF9TWU1CT0woYmZpbl9ncGlvX2RpcmVjdGlvbl9vdXRwdXQpOwogCiAvKiBJZiB3ZSBhcmUgYm9vdGluZyBmcm9tIFNQSSBhbmQgb3VyIGJvYXJkIGxhY2tzIGEgc3Ryb25nIGVub3VnaCBwdWxsIHVwLAogICogdGhlIGNvcmUgY2FuIHJlc2V0IGFuZCBleGVjdXRlIHRoZSBib290cm9tIGZhc3RlciB0aGFuIHRoZSByZXNpc3RvciBjYW4KQEAgLTEzMjcsMTQgKzEzMjAsMTcgQEAKIHN0YXRpYyBpbnQgZ3Bpb19wcm9jX3JlYWQoY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKIAkJCSAgaW50IGxlbiwgaW50ICp1bnVzZWRfaSwgdm9pZCAqdW51c2VkX3YpCiB7Ci0JaW50IGMsIG91dGxlbiA9IDA7CisJaW50IGMsIGlycSwgZ3Bpbywgb3V0bGVuID0gMDsKIAogCWZvciAoYyA9IDA7IGMgPCBNQVhfUkVTT1VSQ0VTOyBjKyspIHsKLQkJaWYgKCFjaGVja19ncGlvKGMpICYmIChyZXNlcnZlZF9ncGlvX21hcFtncGlvX2JhbmsoYyldICYgZ3Bpb19iaXQoYykpKQotCQkJbGVuID0gc3ByaW50ZihidWYsICJHUElPXyVkOiAlcyBcdFx0R1BJTyAlc1xuIiwgYywKLQkJCQkgZ2V0X2xhYmVsKGMpLCBnZXRfZ3Bpb19kaXIoYykgPyAiT1VUUFVUIiA6ICJJTlBVVCIpOworCQlpcnEgPSByZXNlcnZlZF9ncGlvX2lycV9tYXBbZ3Bpb19iYW5rKGMpXSAmIGdwaW9fYml0KGMpOworCQlncGlvID0gcmVzZXJ2ZWRfZ3Bpb19tYXBbZ3Bpb19iYW5rKGMpXSAmIGdwaW9fYml0KGMpOworCQlpZiAoIWNoZWNrX2dwaW8oYykgJiYgKGdwaW8gfHwgaXJxKSkKKwkJCWxlbiA9IHNwcmludGYoYnVmLCAiR1BJT18lZDogXHQlcyVzIFx0XHRHUElPICVzXG4iLCBjLAorCQkJCSBnZXRfbGFiZWwoYyksIChncGlvICYmIGlycSkgPyAiICoiIDogIiIsCisJCQkJIGdldF9ncGlvX2RpcihjKSA/ICJPVVRQVVQiIDogIklOUFVUIik7CiAJCWVsc2UgaWYgKHJlc2VydmVkX3BlcmlfbWFwW2dwaW9fYmFuayhjKV0gJiBncGlvX2JpdChjKSkKLQkJCWxlbiA9IHNwcmludGYoYnVmLCAiR1BJT18lZDogJXMgXHRcdFBlcmlwaGVyYWxcbiIsIGMsIGdldF9sYWJlbChjKSk7CisJCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIkdQSU9fJWQ6IFx0JXMgXHRcdFBlcmlwaGVyYWxcbiIsIGMsIGdldF9sYWJlbChjKSk7CiAJCWVsc2UKIAkJCWNvbnRpbnVlOwogCQlidWYgKz0gbGVuOwpAQCAtMTM1NCwzICsxMzUwLDU3IEBACiB9CiBfX2luaXRjYWxsKGdwaW9fcmVnaXN0ZXJfcHJvYyk7CiAjZW5kaWYKKworI2lmZGVmIENPTkZJR19HUElPTElCCitpbnQgYmZpbl9ncGlvbGliX2RpcmVjdGlvbl9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBncGlvKQoreworCXJldHVybiBiZmluX2dwaW9fZGlyZWN0aW9uX2lucHV0KGdwaW8pOworfQorCitpbnQgYmZpbl9ncGlvbGliX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgZ3BpbywgaW50IGxldmVsKQoreworCXJldHVybiBiZmluX2dwaW9fZGlyZWN0aW9uX291dHB1dChncGlvLCBsZXZlbCk7Cit9CisKK2ludCBiZmluX2dwaW9saWJfZ2V0X3ZhbHVlKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGdwaW8pCit7CisJcmV0dXJuIGJmaW5fZ3Bpb19nZXRfdmFsdWUoZ3Bpbyk7Cit9CisKK3ZvaWQgYmZpbl9ncGlvbGliX3NldF92YWx1ZShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBncGlvLCBpbnQgdmFsdWUpCit7CisjaWZkZWYgQkY1NDhfRkFNSUxZCisJcmV0dXJuIGJmaW5fZ3Bpb19zZXRfdmFsdWUoZ3BpbywgdmFsdWUpOworI2Vsc2UKKwlyZXR1cm4gc2V0X2dwaW9fZGF0YShncGlvLCB2YWx1ZSk7CisjZW5kaWYKK30KKworaW50IGJmaW5fZ3Bpb2xpYl9ncGlvX3JlcXVlc3Qoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgZ3BpbykKK3sKKwlyZXR1cm4gYmZpbl9ncGlvX3JlcXVlc3QoZ3BpbywgY2hpcC0+bGFiZWwpOworfQorCit2b2lkIGJmaW5fZ3Bpb2xpYl9ncGlvX2ZyZWUoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgZ3BpbykKK3sKKwlyZXR1cm4gYmZpbl9ncGlvX2ZyZWUoZ3Bpbyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIGJmaW5fY2hpcCA9IHsKKwkubGFiZWwJCQk9ICJCbGFja2Zpbi1HUElPbGliIiwKKwkuZGlyZWN0aW9uX2lucHV0CT0gYmZpbl9ncGlvbGliX2RpcmVjdGlvbl9pbnB1dCwKKwkuZ2V0CQkJPSBiZmluX2dwaW9saWJfZ2V0X3ZhbHVlLAorCS5kaXJlY3Rpb25fb3V0cHV0CT0gYmZpbl9ncGlvbGliX2RpcmVjdGlvbl9vdXRwdXQsCisJLnNldAkJCT0gYmZpbl9ncGlvbGliX3NldF92YWx1ZSwKKwkucmVxdWVzdAkJPSBiZmluX2dwaW9saWJfZ3Bpb19yZXF1ZXN0LAorCS5mcmVlCQkJPSBiZmluX2dwaW9saWJfZ3Bpb19mcmVlLAorCS5iYXNlCQkJPSAwLAorCS5uZ3BpbwkJCT0gTUFYX0JMQUNLRklOX0dQSU9TLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYmZpbl9ncGlvbGliX3NldHVwKHZvaWQpCit7CisJcmV0dXJuIGdwaW9jaGlwX2FkZCgmYmZpbl9jaGlwKTsKK30KK2FyY2hfaW5pdGNhbGwoYmZpbl9ncGlvbGliX3NldHVwKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvYmZpbl9rc3ltcy5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvYmZpbl9rc3ltcy5jCmluZGV4IDQzNjczMzAuLjAxZjkxN2QgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2JmaW5fa3N5bXMuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9iZmluX2tzeW1zLmMKQEAgLTEsNTIgKzEsMjUgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4va2VybmVsL2JmaW5fa3N5bXMuYwotICogQmFzZWQgb246ICAgICBub25lIC0gb3JpZ2luYWwgd29yawotICogQXV0aG9yOgorICogYXJjaC9ibGFja2Zpbi9rZXJuZWwvYmZpbl9rc3ltcy5jIC0gZXhwb3J0cyBmb3IgcmFuZG9tIHN5bWJvbHMKICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246CisgKiBDb3B5cmlnaHQgMjAwNC0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KIAotI2luY2x1ZGUgPGFzbS9jaGVja3N1bS5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAKLS8qIHBsYXRmb3JtIGRlcGVuZGVudCBzdXBwb3J0ICovCi0KLUVYUE9SVF9TWU1CT0woX19pb3JlbWFwKTsKLQotRVhQT1JUX1NZTUJPTChpcF9mYXN0X2NzdW0pOwotCi1FWFBPUlRfU1lNQk9MKGtlcm5lbF90aHJlYWQpOwotCi1FWFBPUlRfU1lNQk9MKGlzX2luX3JvbSk7CisvKiBBbGxvdyBwZW9wbGUgdG8gaGF2ZSB0aGVpciBvd24gQmxhY2tmaW4gZXhjZXB0aW9uIGhhbmRsZXIgaW4gYSBtb2R1bGUgKi8KIEVYUE9SVF9TWU1CT0woYmZpbl9yZXR1cm5fZnJvbV9leGNlcHRpb24pOwogCi0vKiBOZXR3b3JraW5nIGhlbHBlciByb3V0aW5lcy4gKi8KLUVYUE9SVF9TWU1CT0woY3N1bV9wYXJ0aWFsX2NvcHkpOworLyogQWxsIHRoZSBCbGFja2ZpbiBjYWNoZSBmdW5jdGlvbnM6IG1hY2gtY29tbW9uL2NhY2hlLlMgKi8KK0VYUE9SVF9TWU1CT0woYmxhY2tmaW5fZGNhY2hlX2ludmFsaWRhdGVfcmFuZ2UpOworRVhQT1JUX1NZTUJPTChibGFja2Zpbl9pY2FjaGVfZGNhY2hlX2ZsdXNoX3JhbmdlKTsKK0VYUE9SVF9TWU1CT0woYmxhY2tmaW5faWNhY2hlX2ZsdXNoX3JhbmdlKTsKK0VYUE9SVF9TWU1CT0woYmxhY2tmaW5fZGNhY2hlX2ZsdXNoX3JhbmdlKTsKK0VYUE9SVF9TWU1CT0woYmxhY2tmaW5fZGZsdXNoX3BhZ2UpOwogCiAvKiBUaGUgZm9sbG93aW5nIGFyZSBzcGVjaWFsIGJlY2F1c2UgdGhleSdyZSBub3QgY2FsbGVkCiAgKiBleHBsaWNpdGx5ICh0aGUgQyBjb21waWxlciBnZW5lcmF0ZXMgdGhlbSkuICBGb3J0dW5hdGVseSwKQEAgLTc0LDggKzQ3LDYgQEAKIGV4dGVybiB2b2lkIF9fbXVsZGkzKHZvaWQpOwogZXh0ZXJuIHZvaWQgX191ZGl2c2kzKHZvaWQpOwogZXh0ZXJuIHZvaWQgX191bW9kc2kzKHZvaWQpOwotCi0vKiBnY2MgbGliIGZ1bmN0aW9ucyAqLwogRVhQT1JUX1NZTUJPTChfX2FzaGxkaTMpOwogRVhQT1JUX1NZTUJPTChfX2FzaHJkaTMpOwogRVhQT1JUX1NZTUJPTChfX3VtdWxzaTNfaGlnaHBhcnQpOwpAQCAtODcsNiArNTgsNyBAQAogRVhQT1JUX1NZTUJPTChfX3VkaXZzaTMpOwogRVhQT1JUX1NZTUJPTChfX3Vtb2RzaTMpOwogCisvKiBJbnB1dC9vdXRwdXQgc3ltYm9sczogbGliL3tpbixvdXR9cy5TICovCiBFWFBPUlRfU1lNQk9MKG91dHNiKTsKIEVYUE9SVF9TWU1CT0woaW5zYik7CiBFWFBPUlRfU1lNQk9MKG91dHN3KTsKQEAgLTk2LDIwICs2OCwzOSBAQAogRVhQT1JUX1NZTUJPTChvdXRzbCk7CiBFWFBPUlRfU1lNQk9MKGluc2wpOwogRVhQT1JUX1NZTUJPTChpbnNsXzE2KTsKLUVYUE9SVF9TWU1CT0woaXJxX2ZsYWdzKTsKLUVYUE9SVF9TWU1CT0woaW91bm1hcCk7Ci1FWFBPUlRfU1lNQk9MKGJsYWNrZmluX2RjYWNoZV9pbnZhbGlkYXRlX3JhbmdlKTsKLUVYUE9SVF9TWU1CT0woYmxhY2tmaW5faWNhY2hlX2RjYWNoZV9mbHVzaF9yYW5nZSk7Ci1FWFBPUlRfU1lNQk9MKGJsYWNrZmluX2ljYWNoZV9mbHVzaF9yYW5nZSk7Ci1FWFBPUlRfU1lNQk9MKGJsYWNrZmluX2RjYWNoZV9mbHVzaF9yYW5nZSk7Ci1FWFBPUlRfU1lNQk9MKGJsYWNrZmluX2RmbHVzaF9wYWdlKTsKIAotRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWwpOwotRVhQT1JUX1NZTUJPTChfX2luaXRfYmVnaW4pOwotRVhQT1JUX1NZTUJPTChfX2luaXRfZW5kKTsKLUVYUE9SVF9TWU1CT0woX2Vic3NfbDEpOwotRVhQT1JUX1NZTUJPTChfc3RleHRfbDEpOwotRVhQT1JUX1NZTUJPTChfZXRleHRfbDEpOwotRVhQT1JUX1NZTUJPTChfc2RhdGFfbDEpOwotRVhQT1JUX1NZTUJPTChfZWJzc19iX2wxKTsKLUVYUE9SVF9TWU1CT0woX3NkYXRhX2JfbDEpOworI2lmZGVmIENPTkZJR19TTVAKK0VYUE9SVF9TWU1CT0woX19yYXdfYXRvbWljX3VwZGF0ZV9hc20pOworRVhQT1JUX1NZTUJPTChfX3Jhd19hdG9taWNfY2xlYXJfYXNtKTsKK0VYUE9SVF9TWU1CT0woX19yYXdfYXRvbWljX3NldF9hc20pOworRVhQT1JUX1NZTUJPTChfX3Jhd19hdG9taWNfeG9yX2FzbSk7CitFWFBPUlRfU1lNQk9MKF9fcmF3X2F0b21pY190ZXN0X2FzbSk7CitFWFBPUlRfU1lNQk9MKF9fcmF3X3hjaGdfMV9hc20pOworRVhQT1JUX1NZTUJPTChfX3Jhd194Y2hnXzJfYXNtKTsKK0VYUE9SVF9TWU1CT0woX19yYXdfeGNoZ180X2FzbSk7CitFWFBPUlRfU1lNQk9MKF9fcmF3X2NtcHhjaGdfMV9hc20pOworRVhQT1JUX1NZTUJPTChfX3Jhd19jbXB4Y2hnXzJfYXNtKTsKK0VYUE9SVF9TWU1CT0woX19yYXdfY21weGNoZ180X2FzbSk7CitFWFBPUlRfU1lNQk9MKF9fcmF3X3NwaW5faXNfbG9ja2VkX2FzbSk7CitFWFBPUlRfU1lNQk9MKF9fcmF3X3NwaW5fbG9ja19hc20pOworRVhQT1JUX1NZTUJPTChfX3Jhd19zcGluX3RyeWxvY2tfYXNtKTsKK0VYUE9SVF9TWU1CT0woX19yYXdfc3Bpbl91bmxvY2tfYXNtKTsKK0VYUE9SVF9TWU1CT0woX19yYXdfcmVhZF9sb2NrX2FzbSk7CitFWFBPUlRfU1lNQk9MKF9fcmF3X3JlYWRfdHJ5bG9ja19hc20pOworRVhQT1JUX1NZTUJPTChfX3Jhd19yZWFkX3VubG9ja19hc20pOworRVhQT1JUX1NZTUJPTChfX3Jhd193cml0ZV9sb2NrX2FzbSk7CitFWFBPUlRfU1lNQk9MKF9fcmF3X3dyaXRlX3RyeWxvY2tfYXNtKTsKK0VYUE9SVF9TWU1CT0woX19yYXdfd3JpdGVfdW5sb2NrX2FzbSk7CitFWFBPUlRfU1lNQk9MKF9fcmF3X2JpdF9zZXRfYXNtKTsKK0VYUE9SVF9TWU1CT0woX19yYXdfYml0X2NsZWFyX2FzbSk7CitFWFBPUlRfU1lNQk9MKF9fcmF3X2JpdF90b2dnbGVfYXNtKTsKK0VYUE9SVF9TWU1CT0woX19yYXdfYml0X3Rlc3RfYXNtKTsKK0VYUE9SVF9TWU1CT0woX19yYXdfYml0X3Rlc3Rfc2V0X2FzbSk7CitFWFBPUlRfU1lNQk9MKF9fcmF3X2JpdF90ZXN0X2NsZWFyX2FzbSk7CitFWFBPUlRfU1lNQk9MKF9fcmF3X2JpdF90ZXN0X3RvZ2dsZV9hc20pOworRVhQT1JUX1NZTUJPTChfX3Jhd191bmNhY2hlZF9mZXRjaF9hc20pOworI2lmZGVmIF9fQVJDSF9TWU5DX0NPUkVfRENBQ0hFCitFWFBPUlRfU1lNQk9MKF9fcmF3X3NtcF9tYXJrX2JhcnJpZXJfYXNtKTsKK0VYUE9SVF9TWU1CT0woX19yYXdfc21wX2NoZWNrX2JhcnJpZXJfYXNtKTsKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW1wdS9NYWtlZmlsZSBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbXB1L01ha2VmaWxlCmluZGV4IDI4NmI2OTMuLjdkNzBkM2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbXB1L01ha2VmaWxlCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbXB1L01ha2VmaWxlCkBAIC00LDUgKzQsNyBAQAogCiBvYmoteSA6PSBjcGxiaW5pdC5vIGNhY2hlaW5pdC5vIGNwbGJtZ3IubwogCi1vYmotJChDT05GSUdfQ1BMQl9JTkZPKSArPSBjcGxiaW5mby5vCi0KK0NGTEFHU19jcGxibWdyLm8gOj0gLWZmaXhlZC1JMCAtZmZpeGVkLUkxIC1mZml4ZWQtSTIgLWZmaXhlZC1JMyBcCisJCSAgICAtZmZpeGVkLUwwIC1mZml4ZWQtTDEgLWZmaXhlZC1MMiAtZmZpeGVkLUwzIFwKKwkJICAgIC1mZml4ZWQtTTAgLWZmaXhlZC1NMSAtZmZpeGVkLU0yIC1mZml4ZWQtTTMgXAorCQkgICAgLWZmaXhlZC1CMCAtZmZpeGVkLUIxIC1mZml4ZWQtQjIgLWZmaXhlZC1CMwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1tcHUvY2FjaGVpbml0LmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW1wdS9jYWNoZWluaXQuYwppbmRleCBhOGI3MTJhLi5jNmZmOTQ3IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW1wdS9jYWNoZWluaXQuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW1wdS9jYWNoZWluaXQuYwpAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPGFzbS9jcGxiaW5pdC5oPgogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9JQ0FDSEUpCi12b2lkIF9faW5pdCBiZmluX2ljYWNoZV9pbml0KHZvaWQpCit2b2lkIF9fY3B1aW5pdCBiZmluX2ljYWNoZV9pbml0KHN0cnVjdCBjcGxiX2VudHJ5ICppY3BsYl90YmwpCiB7CiAJdW5zaWduZWQgbG9uZyBjdHJsOwogCWludCBpOwpAQCAtNDMsNyArNDMsNyBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX0RDQUNIRSkKLXZvaWQgX19pbml0IGJmaW5fZGNhY2hlX2luaXQodm9pZCkKK3ZvaWQgX19jcHVpbml0IGJmaW5fZGNhY2hlX2luaXQoc3RydWN0IGNwbGJfZW50cnkgKmRjcGxiX3RibCkKIHsKIAl1bnNpZ25lZCBsb25nIGN0cmw7CiAJaW50IGk7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW1wdS9jcGxiaW5mby5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1tcHUvY3BsYmluZm8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIyYmVlZi4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW1wdS9jcGxiaW5mby5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vY3BsYmluZm8uYwotICogQmFzZWQgb246Ci0gKiBBdXRob3I6ICAgICAgIFNvbmljIFpoYW5nIDxzb25pYy56aGFuZ0BhbmFsb2cuY29tPgotICoKLSAqIENyZWF0ZWQ6ICAgICAgSmFuLiAyMDA1Ci0gKiBEZXNjcmlwdGlvbjogIERpc3BsYXkgQ1BMQiBzdGF0dXMKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotCi0jaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL2NwbGIuaD4KLSNpbmNsdWRlIDxhc20vY3BsYmluaXQuaD4KLSNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KLQotc3RhdGljIGNoYXIgcGFnZV9zaXplX3N0cmluZ190YWJsZVtdWzRdID0geyAiMUsiLCAiNEsiLCAiMU0iLCAiNE0iIH07Ci0KLXN0YXRpYyBjaGFyICpjcGxiX3ByaW50X2VudHJ5KGNoYXIgKmJ1Ziwgc3RydWN0IGNwbGJfZW50cnkgKnRibCwgaW50IHN3aXRjaGVkKQotewotCWludCBpOwotCWJ1ZiArPSBzcHJpbnRmKGJ1ZiwgIkluZGV4XHRBZGRyZXNzXHRcdERhdGFcdFNpemVcdFUvUkRcdFUvV1JcdFMvV1JcdFN3aXRjaFxuIik7Ci0JZm9yIChpID0gMDsgaSA8IE1BWF9DUExCUzsgaSsrKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZGF0YSA9IHRibFtpXS5kYXRhOwotCQl1bnNpZ25lZCBsb25nIGFkZHIgPSB0YmxbaV0uYWRkcjsKLQkJaWYgKCEoZGF0YSAmIENQTEJfVkFMSUQpKQotCQkJY29udGludWU7Ci0KLQkJYnVmICs9Ci0JCSAgICBzcHJpbnRmKGJ1ZiwKLQkJCSAgICAiJWRcdDB4JTA4bHhcdCUwNmx4XHQlc1x0JWNcdCVjXHQlY1x0JWNcbiIsCi0JCQkgICAgaSwgYWRkciwgZGF0YSwKLQkJCSAgICBwYWdlX3NpemVfc3RyaW5nX3RhYmxlWyhkYXRhICYgMHgzMDAwMCkgPj4gMTZdLAotCQkJICAgIChkYXRhICYgQ1BMQl9VU0VSX1JEKSA/ICdZJyA6ICdOJywKLQkJCSAgICAoZGF0YSAmIENQTEJfVVNFUl9XUikgPyAnWScgOiAnTicsCi0JCQkgICAgKGRhdGEgJiBDUExCX1NVUFZfV1IpID8gJ1knIDogJ04nLAotCQkJICAgIGkgPCBzd2l0Y2hlZCA/ICdOJyA6ICdZJyk7Ci0JfQotCWJ1ZiArPSBzcHJpbnRmKGJ1ZiwgIlxuIik7Ci0KLQlyZXR1cm4gYnVmOwotfQotCi1pbnQgY3BsYmluZm9fcHJvY19vdXRwdXQoY2hhciAqYnVmKQotewotCWNoYXIgKnA7Ci0KLQlwID0gYnVmOwotCi0JcCArPSBzcHJpbnRmKHAsICItLS0tLS0tLS0tLS0tLS0tLS0gQ1BMQiBJbmZvcm1hdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS1cblxuIik7Ci0KLQlpZiAoYmZpbl9yZWFkX0lNRU1fQ09OVFJPTCgpICYgRU5JQ1BMQikgewotCQlwICs9IHNwcmludGYocCwgIkluc3RydWN0aW9uIENQTEIgZW50cnk6XG4iKTsKLQkJcCA9IGNwbGJfcHJpbnRfZW50cnkocCwgaWNwbGJfdGJsLCBmaXJzdF9zd2l0Y2hlZF9pY3BsYik7Ci0JfSBlbHNlCi0JCXAgKz0gc3ByaW50ZihwLCAiSW5zdHJ1Y3Rpb24gQ1BMQiBpcyBkaXNhYmxlZC5cblxuIik7Ci0KLQlpZiAoMSB8fCBiZmluX3JlYWRfRE1FTV9DT05UUk9MKCkgJiBFTkRDUExCKSB7Ci0JCXAgKz0gc3ByaW50ZihwLCAiRGF0YSBDUExCIGVudHJ5OlxuIik7Ci0JCXAgPSBjcGxiX3ByaW50X2VudHJ5KHAsIGRjcGxiX3RibCwgZmlyc3Rfc3dpdGNoZWRfZGNwbGIpOwotCX0gZWxzZQotCQlwICs9IHNwcmludGYocCwgIkRhdGEgQ1BMQiBpcyBkaXNhYmxlZC5cbiIpOwotCi0JcCArPSBzcHJpbnRmKHAsICJJQ1BMQiBtaXNzOiAlZFxuSUNQTEIgc3VwZXJ2aXNvciBtaXNzOiAlZFxuIiwKLQkJICAgICBucl9pY3BsYl9taXNzLCBucl9pY3BsYl9zdXB2X21pc3MpOwotCXAgKz0gc3ByaW50ZihwLCAiRENQTEIgbWlzczogJWRcbkRDUExCIHByb3RlY3Rpb24gZmF1bHQ6JWRcbiIsCi0JCSAgICAgbnJfZGNwbGJfbWlzcywgbnJfZGNwbGJfcHJvdCk7Ci0JcCArPSBzcHJpbnRmKHAsICJDUExCIGZsdXNoZXM6ICVkXG4iLAotCQkgICAgIG5yX2NwbGJfZmx1c2gpOwotCi0JcmV0dXJuIHAgLSBidWY7Ci19Ci0KLXN0YXRpYyBpbnQgY3BsYmluZm9fcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAotCQkJICAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQlpbnQgbGVuOwotCi0JbGVuID0gY3BsYmluZm9fcHJvY19vdXRwdXQocGFnZSk7Ci0JaWYgKGxlbiA8PSBvZmYgKyBjb3VudCkKLQkJKmVvZiA9IDE7Ci0JKnN0YXJ0ID0gcGFnZSArIG9mZjsKLQlsZW4gLT0gb2ZmOwotCWlmIChsZW4gPiBjb3VudCkKLQkJbGVuID0gY291bnQ7Ci0JaWYgKGxlbiA8IDApCi0JCWxlbiA9IDA7Ci0JcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIGludCBfX2luaXQgY3BsYmluZm9faW5pdCh2b2lkKQotewotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50cnk7Ci0KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJjcGxiaW5mbyIsIDAsIE5VTEwpOwotCWlmICghZW50cnkpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZW50cnktPnJlYWRfcHJvYyA9IGNwbGJpbmZvX3JlYWRfcHJvYzsKLQllbnRyeS0+ZGF0YSA9IE5VTEw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGNwbGJpbmZvX2V4aXQodm9pZCkKLXsKLQlyZW1vdmVfcHJvY19lbnRyeSgiY3BsYmluZm8iLCBOVUxMKTsKLX0KLQotbW9kdWxlX2luaXQoY3BsYmluZm9faW5pdCk7Ci1tb2R1bGVfZXhpdChjcGxiaW5mb19leGl0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbXB1L2NwbGJpbml0LmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW1wdS9jcGxiaW5pdC5jCmluZGV4IDU1YWY3MjkuLmJkYjk1ODQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbXB1L2NwbGJpbml0LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1tcHUvY3BsYmluaXQuYwpAQCAtMjUsMTggKzI1LDE5IEBACiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CiAjaW5jbHVkZSA8YXNtL2NwbGIuaD4KICNpbmNsdWRlIDxhc20vY3BsYmluaXQuaD4KKyNpbmNsdWRlIDxhc20vbWVtX21hcC5oPgogCiAjaWYgQU5PTUFMWV8wNTAwMDI2MwogIyBlcnJvciB0aGUgTVBVIHdpbGwgbm90IGZ1bmN0aW9uIHNhZmVseSB3aGlsZSBBbm9tYWx5IDA1MDAwMjYzIGFwcGxpZXMKICNlbmRpZgogCi1zdHJ1Y3QgY3BsYl9lbnRyeSBpY3BsYl90YmxbTUFYX0NQTEJTXTsKLXN0cnVjdCBjcGxiX2VudHJ5IGRjcGxiX3RibFtNQVhfQ1BMQlNdOworc3RydWN0IGNwbGJfZW50cnkgaWNwbGJfdGJsW05SX0NQVVNdW01BWF9DUExCU107CitzdHJ1Y3QgY3BsYl9lbnRyeSBkY3BsYl90YmxbTlJfQ1BVU11bTUFYX0NQTEJTXTsKIAogaW50IGZpcnN0X3N3aXRjaGVkX2ljcGxiLCBmaXJzdF9zd2l0Y2hlZF9kY3BsYjsKIGludCBmaXJzdF9tYXNrX2RjcGxiOwogCi12b2lkIF9faW5pdCBnZW5lcmF0ZV9jcGxiX3RhYmxlcyh2b2lkKQordm9pZCBfX2luaXQgZ2VuZXJhdGVfY3BsYl90YWJsZXNfY3B1KHVuc2lnbmVkIGludCBjcHUpCiB7CiAJaW50IGlfZCwgaV9pOwogCXVuc2lnbmVkIGxvbmcgYWRkcjsKQEAgLTU1LDE1ICs1NiwxNiBAQAogCWRfY2FjaGUgfD0gQ1BMQl9MMV9BT1cgfCBDUExCX1dUOwogI2VuZGlmCiAjZW5kaWYKKwogCWlfZCA9IGlfaSA9IDA7CiAKIAkvKiBTZXQgdXAgdGhlIHplcm8gcGFnZS4gICovCi0JZGNwbGJfdGJsW2lfZF0uYWRkciA9IDA7Ci0JZGNwbGJfdGJsW2lfZCsrXS5kYXRhID0gU0RSQU1fT09QUyB8IFBBR0VfU0laRV8xS0I7CisJZGNwbGJfdGJsW2NwdV1baV9kXS5hZGRyID0gMDsKKwlkY3BsYl90YmxbY3B1XVtpX2QrK10uZGF0YSA9IFNEUkFNX09PUFMgfCBQQUdFX1NJWkVfMUtCOwogCiAjaWYgMAotCWljcGxiX3RibFtpX2ldLmFkZHIgPSAwOwotCWljcGxiX3RibFtpX2krK10uZGF0YSA9IGlfY2FjaGUgfCBDUExCX1VTRVJfUkQgfCBQQUdFX1NJWkVfNEtCOworCWljcGxiX3RibFtjcHVdW2lfaV0uYWRkciA9IDA7CisJaWNwbGJfdGJsW2NwdV1baV9pKytdLmRhdGEgPSBpX2NhY2hlIHwgQ1BMQl9VU0VSX1JEIHwgUEFHRV9TSVpFXzRLQjsKICNlbmRpZgogCiAJLyogQ292ZXIga2VybmVsIG1lbW9yeSB3aXRoIDRNIHBhZ2VzLiAgKi8KQEAgLTcyLDI4ICs3NCwyOCBAQAogCWlfZGF0YSA9IGlfY2FjaGUgfCBDUExCX1ZBTElEIHwgQ1BMQl9QT1JUUFJJTyB8IFBBR0VfU0laRV80TUI7CiAKIAlmb3IgKDsgYWRkciA8IG1lbW9yeV9zdGFydDsgYWRkciArPSA0ICogMTAyNCAqIDEwMjQpIHsKLQkJZGNwbGJfdGJsW2lfZF0uYWRkciA9IGFkZHI7Ci0JCWRjcGxiX3RibFtpX2QrK10uZGF0YSA9IGRfZGF0YTsKLQkJaWNwbGJfdGJsW2lfaV0uYWRkciA9IGFkZHI7Ci0JCWljcGxiX3RibFtpX2krK10uZGF0YSA9IGlfZGF0YSB8IChhZGRyID09IDAgPyBDUExCX1VTRVJfUkQgOiAwKTsKKwkJZGNwbGJfdGJsW2NwdV1baV9kXS5hZGRyID0gYWRkcjsKKwkJZGNwbGJfdGJsW2NwdV1baV9kKytdLmRhdGEgPSBkX2RhdGE7CisJCWljcGxiX3RibFtjcHVdW2lfaV0uYWRkciA9IGFkZHI7CisJCWljcGxiX3RibFtjcHVdW2lfaSsrXS5kYXRhID0gaV9kYXRhIHwgKGFkZHIgPT0gMCA/IENQTEJfVVNFUl9SRCA6IDApOwogCX0KIAogCS8qIENvdmVyIEwxIG1lbW9yeS4gIE9uZSA0TSBhcmVhIGZvciBjb2RlIGFuZCBkYXRhIGVhY2ggaXMgZW5vdWdoLiAgKi8KICNpZiBMMV9EQVRBX0FfTEVOR1RIID4gMCB8fCBMMV9EQVRBX0JfTEVOR1RIID4gMAotCWRjcGxiX3RibFtpX2RdLmFkZHIgPSBMMV9EQVRBX0FfU1RBUlQ7Ci0JZGNwbGJfdGJsW2lfZCsrXS5kYXRhID0gTDFfRE1FTU9SWSB8IFBBR0VfU0laRV80TUI7CisJZGNwbGJfdGJsW2NwdV1baV9kXS5hZGRyID0gZ2V0X2wxX2RhdGFfYV9zdGFydF9jcHUoY3B1KTsKKwlkY3BsYl90YmxbY3B1XVtpX2QrK10uZGF0YSA9IEwxX0RNRU1PUlkgfCBQQUdFX1NJWkVfNE1COwogI2VuZGlmCiAjaWYgTDFfQ09ERV9MRU5HVEggPiAwCi0JaWNwbGJfdGJsW2lfaV0uYWRkciA9IEwxX0NPREVfU1RBUlQ7Ci0JaWNwbGJfdGJsW2lfaSsrXS5kYXRhID0gTDFfSU1FTU9SWSB8IFBBR0VfU0laRV80TUI7CisJaWNwbGJfdGJsW2NwdV1baV9pXS5hZGRyID0gZ2V0X2wxX2NvZGVfc3RhcnRfY3B1KGNwdSk7CisJaWNwbGJfdGJsW2NwdV1baV9pKytdLmRhdGEgPSBMMV9JTUVNT1JZIHwgUEFHRV9TSVpFXzRNQjsKICNlbmRpZgogCiAJLyogQ292ZXIgTDIgbWVtb3J5ICovCiAjaWYgTDJfTEVOR1RIID4gMAotCWRjcGxiX3RibFtpX2RdLmFkZHIgPSBMMl9TVEFSVDsKLQlkY3BsYl90YmxbaV9kKytdLmRhdGEgPSBMMl9ETUVNT1JZIHwgUEFHRV9TSVpFXzFNQjsKLQlpY3BsYl90YmxbaV9pXS5hZGRyID0gTDJfU1RBUlQ7Ci0JaWNwbGJfdGJsW2lfaSsrXS5kYXRhID0gTDJfSU1FTU9SWSB8IFBBR0VfU0laRV8xTUI7CisJZGNwbGJfdGJsW2NwdV1baV9kXS5hZGRyID0gTDJfU1RBUlQ7CisJZGNwbGJfdGJsW2NwdV1baV9kKytdLmRhdGEgPSBMMl9ETUVNT1JZIHwgUEFHRV9TSVpFXzFNQjsKKwlpY3BsYl90YmxbY3B1XVtpX2ldLmFkZHIgPSBMMl9TVEFSVDsKKwlpY3BsYl90YmxbY3B1XVtpX2krK10uZGF0YSA9IEwyX0lNRU1PUlkgfCBQQUdFX1NJWkVfMU1COwogI2VuZGlmCiAKIAlmaXJzdF9tYXNrX2RjcGxiID0gaV9kOwpAQCAtMTAxLDcgKzEwMywxMSBAQAogCWZpcnN0X3N3aXRjaGVkX2ljcGxiID0gaV9pOwogCiAJd2hpbGUgKGlfZCA8IE1BWF9DUExCUykKLQkJZGNwbGJfdGJsW2lfZCsrXS5kYXRhID0gMDsKKwkJZGNwbGJfdGJsW2NwdV1baV9kKytdLmRhdGEgPSAwOwogCXdoaWxlIChpX2kgPCBNQVhfQ1BMQlMpCi0JCWljcGxiX3RibFtpX2krK10uZGF0YSA9IDA7CisJCWljcGxiX3RibFtjcHVdW2lfaSsrXS5kYXRhID0gMDsKK30KKwordm9pZCBnZW5lcmF0ZV9jcGxiX3RhYmxlc19hbGwodm9pZCkKK3sKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbXB1L2NwbGJtZ3IuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbXB1L2NwbGJtZ3IuYwppbmRleCBiYWE1MmUyLi44NzQ2M2NlIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW1wdS9jcGxibWdyLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1tcHUvY3BsYm1nci5jCkBAIC0yNSwxNSArMjUsMjEgQEAKICNpbmNsdWRlIDxhc20vY3BsYmluaXQuaD4KICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KIAotI2RlZmluZSBGQVVMVF9SVwkoMSA8PCAxNikKLSNkZWZpbmUgRkFVTFRfVVNFUlNVUFYJKDEgPDwgMTcpCisvKgorICogV0FSTklORworICoKKyAqIFRoaXMgZmlsZSBpcyBjb21waWxlZCB3aXRoIGNlcnRhaW4gLWZmaXhlZC1yZWcgb3B0aW9ucy4gIFdlIGhhdmUgdG8KKyAqIG1ha2Ugc3VyZSBub3QgdG8gY2FsbCBhbnkgZnVuY3Rpb25zIGhlcmUgdGhhdCBjb3VsZCBjbG9iYmVyIHRoZXNlCisgKiByZWdpc3RlcnMuCisgKi8KIAogaW50IHBhZ2VfbWFza19uZWx0czsKIGludCBwYWdlX21hc2tfb3JkZXI7Ci11bnNpZ25lZCBsb25nICpjdXJyZW50X3J3eF9tYXNrOwordW5zaWduZWQgbG9uZyAqY3VycmVudF9yd3hfbWFza1tOUl9DUFVTXTsKIAotaW50IG5yX2RjcGxiX21pc3MsIG5yX2ljcGxiX21pc3MsIG5yX2ljcGxiX3N1cHZfbWlzcywgbnJfZGNwbGJfcHJvdDsKLWludCBucl9jcGxiX2ZsdXNoOworaW50IG5yX2RjcGxiX21pc3NbTlJfQ1BVU10sIG5yX2ljcGxiX21pc3NbTlJfQ1BVU107CitpbnQgbnJfaWNwbGJfc3Vwdl9taXNzW05SX0NQVVNdLCBucl9kY3BsYl9wcm90W05SX0NQVVNdOworaW50IG5yX2NwbGJfZmx1c2hbTlJfQ1BVU107CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkaXNhYmxlX2RjcGxiKHZvaWQpCiB7CkBAIC05OCw0MiArMTA0LDQyIEBACiB9CiAKIC8qIENvdW50ZXJzIHRvIGltcGxlbWVudCByb3VuZC1yb2JpbiByZXBsYWNlbWVudC4gICovCi1zdGF0aWMgaW50IGljcGxiX3JyX2luZGV4LCBkY3BsYl9ycl9pbmRleDsKK3N0YXRpYyBpbnQgaWNwbGJfcnJfaW5kZXhbTlJfQ1BVU10sIGRjcGxiX3JyX2luZGV4W05SX0NQVVNdOwogCiAvKgogICogRmluZCBhbiBJQ1BMQiBlbnRyeSB0byBiZSBldmljdGVkIGFuZCByZXR1cm4gaXRzIGluZGV4LgogICovCi1zdGF0aWMgaW50IGV2aWN0X29uZV9pY3BsYih2b2lkKQorc3RhdGljIGludCBldmljdF9vbmVfaWNwbGIodW5zaWduZWQgaW50IGNwdSkKIHsKIAlpbnQgaTsKIAlmb3IgKGkgPSBmaXJzdF9zd2l0Y2hlZF9pY3BsYjsgaSA8IE1BWF9DUExCUzsgaSsrKQotCQlpZiAoKGljcGxiX3RibFtpXS5kYXRhICYgQ1BMQl9WQUxJRCkgPT0gMCkKKwkJaWYgKChpY3BsYl90YmxbY3B1XVtpXS5kYXRhICYgQ1BMQl9WQUxJRCkgPT0gMCkKIAkJCXJldHVybiBpOwotCWkgPSBmaXJzdF9zd2l0Y2hlZF9pY3BsYiArIGljcGxiX3JyX2luZGV4OworCWkgPSBmaXJzdF9zd2l0Y2hlZF9pY3BsYiArIGljcGxiX3JyX2luZGV4W2NwdV07CiAJaWYgKGkgPj0gTUFYX0NQTEJTKSB7CiAJCWkgLT0gTUFYX0NQTEJTIC0gZmlyc3Rfc3dpdGNoZWRfaWNwbGI7Ci0JCWljcGxiX3JyX2luZGV4IC09IE1BWF9DUExCUyAtIGZpcnN0X3N3aXRjaGVkX2ljcGxiOworCQlpY3BsYl9ycl9pbmRleFtjcHVdIC09IE1BWF9DUExCUyAtIGZpcnN0X3N3aXRjaGVkX2ljcGxiOwogCX0KLQlpY3BsYl9ycl9pbmRleCsrOworCWljcGxiX3JyX2luZGV4W2NwdV0rKzsKIAlyZXR1cm4gaTsKIH0KIAotc3RhdGljIGludCBldmljdF9vbmVfZGNwbGIodm9pZCkKK3N0YXRpYyBpbnQgZXZpY3Rfb25lX2RjcGxiKHVuc2lnbmVkIGludCBjcHUpCiB7CiAJaW50IGk7CiAJZm9yIChpID0gZmlyc3Rfc3dpdGNoZWRfZGNwbGI7IGkgPCBNQVhfQ1BMQlM7IGkrKykKLQkJaWYgKChkY3BsYl90YmxbaV0uZGF0YSAmIENQTEJfVkFMSUQpID09IDApCisJCWlmICgoZGNwbGJfdGJsW2NwdV1baV0uZGF0YSAmIENQTEJfVkFMSUQpID09IDApCiAJCQlyZXR1cm4gaTsKLQlpID0gZmlyc3Rfc3dpdGNoZWRfZGNwbGIgKyBkY3BsYl9ycl9pbmRleDsKKwlpID0gZmlyc3Rfc3dpdGNoZWRfZGNwbGIgKyBkY3BsYl9ycl9pbmRleFtjcHVdOwogCWlmIChpID49IE1BWF9DUExCUykgewogCQlpIC09IE1BWF9DUExCUyAtIGZpcnN0X3N3aXRjaGVkX2RjcGxiOwotCQlkY3BsYl9ycl9pbmRleCAtPSBNQVhfQ1BMQlMgLSBmaXJzdF9zd2l0Y2hlZF9kY3BsYjsKKwkJZGNwbGJfcnJfaW5kZXhbY3B1XSAtPSBNQVhfQ1BMQlMgLSBmaXJzdF9zd2l0Y2hlZF9kY3BsYjsKIAl9Ci0JZGNwbGJfcnJfaW5kZXgrKzsKKwlkY3BsYl9ycl9pbmRleFtjcHVdKys7CiAJcmV0dXJuIGk7CiB9CiAKLXN0YXRpYyBub2lubGluZSBpbnQgZGNwbGJfbWlzcyh2b2lkKQorc3RhdGljIG5vaW5saW5lIGludCBkY3BsYl9taXNzKHVuc2lnbmVkIGludCBjcHUpCiB7CiAJdW5zaWduZWQgbG9uZyBhZGRyID0gYmZpbl9yZWFkX0RDUExCX0ZBVUxUX0FERFIoKTsKIAlpbnQgc3RhdHVzID0gYmZpbl9yZWFkX0RDUExCX1NUQVRVUygpOwpAQCAtMTQxLDcgKzE0Nyw3IEBACiAJaW50IGlkeDsKIAl1bnNpZ25lZCBsb25nIGRfZGF0YTsKIAotCW5yX2RjcGxiX21pc3MrKzsKKwlucl9kY3BsYl9taXNzW2NwdV0rKzsKIAogCWRfZGF0YSA9IENQTEJfU1VQVl9XUiB8IENQTEJfVkFMSUQgfCBDUExCX0RJUlRZIHwgUEFHRV9TSVpFXzRLQjsKICNpZmRlZiBDT05GSUdfQkZJTl9EQ0FDSEUKQEAgLTE2OCwyNSArMTc0LDI1IEBACiAJfSBlbHNlIGlmIChhZGRyID49IF9yYW1lbmQpIHsKIAkgICAgZF9kYXRhIHw9IENQTEJfVVNFUl9SRCB8IENQTEJfVVNFUl9XUjsKIAl9IGVsc2UgewotCQltYXNrID0gY3VycmVudF9yd3hfbWFzazsKKwkJbWFzayA9IGN1cnJlbnRfcnd4X21hc2tbY3B1XTsKIAkJaWYgKG1hc2spIHsKIAkJCWludCBwYWdlID0gYWRkciA+PiBQQUdFX1NISUZUOwotCQkJaW50IG9mZnMgPSBwYWdlID4+IDU7CisJCQlpbnQgaWR4ID0gcGFnZSA+PiA1OwogCQkJaW50IGJpdCA9IDEgPDwgKHBhZ2UgJiAzMSk7CiAKLQkJCWlmIChtYXNrW29mZnNdICYgYml0KQorCQkJaWYgKG1hc2tbaWR4XSAmIGJpdCkKIAkJCQlkX2RhdGEgfD0gQ1BMQl9VU0VSX1JEOwogCiAJCQltYXNrICs9IHBhZ2VfbWFza19uZWx0czsKLQkJCWlmIChtYXNrW29mZnNdICYgYml0KQorCQkJaWYgKG1hc2tbaWR4XSAmIGJpdCkKIAkJCQlkX2RhdGEgfD0gQ1BMQl9VU0VSX1dSOwogCQl9CiAJfQotCWlkeCA9IGV2aWN0X29uZV9kY3BsYigpOworCWlkeCA9IGV2aWN0X29uZV9kY3BsYihjcHUpOwogCiAJYWRkciAmPSBQQUdFX01BU0s7Ci0JZGNwbGJfdGJsW2lkeF0uYWRkciA9IGFkZHI7Ci0JZGNwbGJfdGJsW2lkeF0uZGF0YSA9IGRfZGF0YTsKKwlkY3BsYl90YmxbY3B1XVtpZHhdLmFkZHIgPSBhZGRyOworCWRjcGxiX3RibFtjcHVdW2lkeF0uZGF0YSA9IGRfZGF0YTsKIAogCWRpc2FibGVfZGNwbGIoKTsKIAliZmluX3dyaXRlMzIoRENQTEJfREFUQTAgKyBpZHggKiA0LCBkX2RhdGEpOwpAQCAtMTk2LDIxICsyMDIsMjEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIG5vaW5saW5lIGludCBpY3BsYl9taXNzKHZvaWQpCitzdGF0aWMgbm9pbmxpbmUgaW50IGljcGxiX21pc3ModW5zaWduZWQgaW50IGNwdSkKIHsKIAl1bnNpZ25lZCBsb25nIGFkZHIgPSBiZmluX3JlYWRfSUNQTEJfRkFVTFRfQUREUigpOwogCWludCBzdGF0dXMgPSBiZmluX3JlYWRfSUNQTEJfU1RBVFVTKCk7CiAJaW50IGlkeDsKIAl1bnNpZ25lZCBsb25nIGlfZGF0YTsKIAotCW5yX2ljcGxiX21pc3MrKzsKKwlucl9pY3BsYl9taXNzW2NwdV0rKzsKIAogCS8qIElmIGluc2lkZSB0aGUgdW5jYWNoZWQgRE1BIHJlZ2lvbiwgZmF1bHQuICAqLwogCWlmIChhZGRyID49IF9yYW1lbmQgLSBETUFfVU5DQUNIRURfUkVHSU9OICYmIGFkZHIgPCBfcmFtZW5kKQogCQlyZXR1cm4gQ1BMQl9QUk9UX1ZJT0w7CiAKIAlpZiAoc3RhdHVzICYgRkFVTFRfVVNFUlNVUFYpCi0JCW5yX2ljcGxiX3N1cHZfbWlzcysrOworCQlucl9pY3BsYl9zdXB2X21pc3NbY3B1XSsrOwogCiAJLyoKIAkgKiBGaXJzdCwgdHJ5IHRvIGZpbmQgYSBDUExCIHRoYXQgbWF0Y2hlcyB0aGlzIGFkZHJlc3MuICBJZiB3ZQpAQCAtMjE4LDggKzIyNCw4IEBACiAJICogdGhhdCB0aGUgaW5zdHJ1Y3Rpb24gY3Jvc3NlcyBhIHBhZ2UgYm91bmRhcnkuCiAJICovCiAJZm9yIChpZHggPSBmaXJzdF9zd2l0Y2hlZF9pY3BsYjsgaWR4IDwgTUFYX0NQTEJTOyBpZHgrKykgewotCQlpZiAoaWNwbGJfdGJsW2lkeF0uZGF0YSAmIENQTEJfVkFMSUQpIHsKLQkJCXVuc2lnbmVkIGxvbmcgdGhpc19hZGRyID0gaWNwbGJfdGJsW2lkeF0uYWRkcjsKKwkJaWYgKGljcGxiX3RibFtjcHVdW2lkeF0uZGF0YSAmIENQTEJfVkFMSUQpIHsKKwkJCXVuc2lnbmVkIGxvbmcgdGhpc19hZGRyID0gaWNwbGJfdGJsW2NwdV1baWR4XS5hZGRyOwogCQkJaWYgKHRoaXNfYWRkciA8PSBhZGRyICYmIHRoaXNfYWRkciArIFBBR0VfU0laRSA+IGFkZHIpIHsKIAkJCQlhZGRyICs9IFBBR0VfU0laRTsKIAkJCQlicmVhazsKQEAgLTI1NywyMyArMjYzLDIzIEBACiAJCSAqIE90aGVyd2lzZSwgY2hlY2sgdGhlIHggYml0bWFwIG9mIHRoZSBjdXJyZW50IHByb2Nlc3MuCiAJCSAqLwogCQlpZiAoIShzdGF0dXMgJiBGQVVMVF9VU0VSU1VQVikpIHsKLQkJCXVuc2lnbmVkIGxvbmcgKm1hc2sgPSBjdXJyZW50X3J3eF9tYXNrOworCQkJdW5zaWduZWQgbG9uZyAqbWFzayA9IGN1cnJlbnRfcnd4X21hc2tbY3B1XTsKIAogCQkJaWYgKG1hc2spIHsKIAkJCQlpbnQgcGFnZSA9IGFkZHIgPj4gUEFHRV9TSElGVDsKLQkJCQlpbnQgb2ZmcyA9IHBhZ2UgPj4gNTsKKwkJCQlpbnQgaWR4ID0gcGFnZSA+PiA1OwogCQkJCWludCBiaXQgPSAxIDw8IChwYWdlICYgMzEpOwogCiAJCQkJbWFzayArPSAyICogcGFnZV9tYXNrX25lbHRzOwotCQkJCWlmIChtYXNrW29mZnNdICYgYml0KQorCQkJCWlmIChtYXNrW2lkeF0gJiBiaXQpCiAJCQkJCWlfZGF0YSB8PSBDUExCX1VTRVJfUkQ7CiAJCQl9CiAJCX0KIAl9Ci0JaWR4ID0gZXZpY3Rfb25lX2ljcGxiKCk7CisJaWR4ID0gZXZpY3Rfb25lX2ljcGxiKGNwdSk7CiAJYWRkciAmPSBQQUdFX01BU0s7Ci0JaWNwbGJfdGJsW2lkeF0uYWRkciA9IGFkZHI7Ci0JaWNwbGJfdGJsW2lkeF0uZGF0YSA9IGlfZGF0YTsKKwlpY3BsYl90YmxbY3B1XVtpZHhdLmFkZHIgPSBhZGRyOworCWljcGxiX3RibFtjcHVdW2lkeF0uZGF0YSA9IGlfZGF0YTsKIAogCWRpc2FibGVfaWNwbGIoKTsKIAliZmluX3dyaXRlMzIoSUNQTEJfREFUQTAgKyBpZHggKiA0LCBpX2RhdGEpOwpAQCAtMjgzLDE5ICsyODksMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIG5vaW5saW5lIGludCBkY3BsYl9wcm90ZWN0aW9uX2ZhdWx0KHZvaWQpCitzdGF0aWMgbm9pbmxpbmUgaW50IGRjcGxiX3Byb3RlY3Rpb25fZmF1bHQodW5zaWduZWQgaW50IGNwdSkKIHsKIAlpbnQgc3RhdHVzID0gYmZpbl9yZWFkX0RDUExCX1NUQVRVUygpOwogCi0JbnJfZGNwbGJfcHJvdCsrOworCW5yX2RjcGxiX3Byb3RbY3B1XSsrOwogCiAJaWYgKHN0YXR1cyAmIEZBVUxUX1JXKSB7CiAJCWludCBpZHggPSBmYXVsdGluZ19jcGxiX2luZGV4KHN0YXR1cyk7Ci0JCXVuc2lnbmVkIGxvbmcgZGF0YSA9IGRjcGxiX3RibFtpZHhdLmRhdGE7CisJCXVuc2lnbmVkIGxvbmcgZGF0YSA9IGRjcGxiX3RibFtjcHVdW2lkeF0uZGF0YTsKIAkJaWYgKCEoZGF0YSAmIENQTEJfV1QpICYmICEoZGF0YSAmIENQTEJfRElSVFkpICYmCiAJCSAgICB3cml0ZV9wZXJtaXR0ZWQoc3RhdHVzLCBkYXRhKSkgewogCQkJZGF0YSB8PSBDUExCX0RJUlRZOwotCQkJZGNwbGJfdGJsW2lkeF0uZGF0YSA9IGRhdGE7CisJCQlkY3BsYl90YmxbY3B1XVtpZHhdLmRhdGEgPSBkYXRhOwogCQkJYmZpbl93cml0ZTMyKERDUExCX0RBVEEwICsgaWR4ICogNCwgZGF0YSk7CiAJCQlyZXR1cm4gMDsKIAkJfQpAQCAtMzA2LDQ0ICszMTIsNDUgQEAKIGludCBjcGxiX2hkcihpbnQgc2Vxc3RhdCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJaW50IGNhdXNlID0gc2Vxc3RhdCAmIDB4M2Y7CisJdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAlzd2l0Y2ggKGNhdXNlKSB7CiAJY2FzZSAweDIzOgotCQlyZXR1cm4gZGNwbGJfcHJvdGVjdGlvbl9mYXVsdCgpOworCQlyZXR1cm4gZGNwbGJfcHJvdGVjdGlvbl9mYXVsdChjcHUpOwogCWNhc2UgMHgyQzoKLQkJcmV0dXJuIGljcGxiX21pc3MoKTsKKwkJcmV0dXJuIGljcGxiX21pc3MoY3B1KTsKIAljYXNlIDB4MjY6Ci0JCXJldHVybiBkY3BsYl9taXNzKCk7CisJCXJldHVybiBkY3BsYl9taXNzKGNwdSk7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIDE7CiAJfQogfQogCi12b2lkIGZsdXNoX3N3aXRjaGVkX2NwbGJzKHZvaWQpCit2b2lkIGZsdXNoX3N3aXRjaGVkX2NwbGJzKHVuc2lnbmVkIGludCBjcHUpCiB7CiAJaW50IGk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCW5yX2NwbGJfZmx1c2grKzsKKwlucl9jcGxiX2ZsdXNoW2NwdV0rKzsKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CiAJZGlzYWJsZV9pY3BsYigpOwogCWZvciAoaSA9IGZpcnN0X3N3aXRjaGVkX2ljcGxiOyBpIDwgTUFYX0NQTEJTOyBpKyspIHsKLQkJaWNwbGJfdGJsW2ldLmRhdGEgPSAwOworCQlpY3BsYl90YmxbY3B1XVtpXS5kYXRhID0gMDsKIAkJYmZpbl93cml0ZTMyKElDUExCX0RBVEEwICsgaSAqIDQsIDApOwogCX0KIAllbmFibGVfaWNwbGIoKTsKIAogCWRpc2FibGVfZGNwbGIoKTsKIAlmb3IgKGkgPSBmaXJzdF9zd2l0Y2hlZF9kY3BsYjsgaSA8IE1BWF9DUExCUzsgaSsrKSB7Ci0JCWRjcGxiX3RibFtpXS5kYXRhID0gMDsKKwkJZGNwbGJfdGJsW2NwdV1baV0uZGF0YSA9IDA7CiAJCWJmaW5fd3JpdGUzMihEQ1BMQl9EQVRBMCArIGkgKiA0LCAwKTsKIAl9CiAJZW5hYmxlX2RjcGxiKCk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKIAogfQogCi12b2lkIHNldF9tYXNrX2RjcGxicyh1bnNpZ25lZCBsb25nICptYXNrcykKK3ZvaWQgc2V0X21hc2tfZGNwbGJzKHVuc2lnbmVkIGxvbmcgKm1hc2tzLCB1bnNpZ25lZCBpbnQgY3B1KQogewogCWludCBpOwogCXVuc2lnbmVkIGxvbmcgYWRkciA9ICh1bnNpZ25lZCBsb25nKW1hc2tzOwpAQCAtMzUxLDEyICszNTgsMTIgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKCFtYXNrcykgewotCQljdXJyZW50X3J3eF9tYXNrID0gbWFza3M7CisJCWN1cnJlbnRfcnd4X21hc2tbY3B1XSA9IG1hc2tzOwogCQlyZXR1cm47CiAJfQogCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCWN1cnJlbnRfcnd4X21hc2sgPSBtYXNrczsKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CisJY3VycmVudF9yd3hfbWFza1tjcHVdID0gbWFza3M7CiAKIAlkX2RhdGEgPSBDUExCX1NVUFZfV1IgfCBDUExCX1ZBTElEIHwgQ1BMQl9ESVJUWSB8IFBBR0VfU0laRV80S0I7CiAjaWZkZWYgQ09ORklHX0JGSU5fRENBQ0hFCkBAIC0zNjgsMTIgKzM3NSwxMiBAQAogCiAJZGlzYWJsZV9kY3BsYigpOwogCWZvciAoaSA9IGZpcnN0X21hc2tfZGNwbGI7IGkgPCBmaXJzdF9zd2l0Y2hlZF9kY3BsYjsgaSsrKSB7Ci0JCWRjcGxiX3RibFtpXS5hZGRyID0gYWRkcjsKLQkJZGNwbGJfdGJsW2ldLmRhdGEgPSBkX2RhdGE7CisJCWRjcGxiX3RibFtjcHVdW2ldLmFkZHIgPSBhZGRyOworCQlkY3BsYl90YmxbY3B1XVtpXS5kYXRhID0gZF9kYXRhOwogCQliZmluX3dyaXRlMzIoRENQTEJfREFUQTAgKyBpICogNCwgZF9kYXRhKTsKIAkJYmZpbl93cml0ZTMyKERDUExCX0FERFIwICsgaSAqIDQsIGFkZHIpOwogCQlhZGRyICs9IFBBR0VfU0laRTsKIAl9CiAJZW5hYmxlX2RjcGxiKCk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbm9tcHUvTWFrZWZpbGUgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW5vbXB1L01ha2VmaWxlCmluZGV4IGQzNmVhOWIuLjdkNzBkM2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbm9tcHUvTWFrZWZpbGUKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1ub21wdS9NYWtlZmlsZQpAQCAtMiw3ICsyLDkgQEAKICMgYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1ub21wdS9NYWtlZmlsZQogIwogCi1vYmoteSA6PSBjcGxiaW5pdC5vIGNhY2hlaW5pdC5vIGNwbGJoZGxyLm8gY3BsYm1nci5vCitvYmoteSA6PSBjcGxiaW5pdC5vIGNhY2hlaW5pdC5vIGNwbGJtZ3IubwogCi1vYmotJChDT05GSUdfQ1BMQl9JTkZPKSArPSBjcGxiaW5mby5vCi0KK0NGTEFHU19jcGxibWdyLm8gOj0gLWZmaXhlZC1JMCAtZmZpeGVkLUkxIC1mZml4ZWQtSTIgLWZmaXhlZC1JMyBcCisJCSAgICAtZmZpeGVkLUwwIC1mZml4ZWQtTDEgLWZmaXhlZC1MMiAtZmZpeGVkLUwzIFwKKwkJICAgIC1mZml4ZWQtTTAgLWZmaXhlZC1NMSAtZmZpeGVkLU0yIC1mZml4ZWQtTTMgXAorCQkgICAgLWZmaXhlZC1CMCAtZmZpeGVkLUIxIC1mZml4ZWQtQjIgLWZmaXhlZC1CMwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1ub21wdS9jYWNoZWluaXQuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbm9tcHUvY2FjaGVpbml0LmMKaW5kZXggYmQwODMxNS4uYzZmZjk0NyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1ub21wdS9jYWNoZWluaXQuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW5vbXB1L2NhY2hlaW5pdC5jCkBAIC0yNSwxOSArMjUsMTUgQEAKICNpbmNsdWRlIDxhc20vY3BsYmluaXQuaD4KIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fSUNBQ0hFKQotdm9pZCBfX2luaXQgYmZpbl9pY2FjaGVfaW5pdCh2b2lkKQordm9pZCBfX2NwdWluaXQgYmZpbl9pY2FjaGVfaW5pdChzdHJ1Y3QgY3BsYl9lbnRyeSAqaWNwbGJfdGJsKQogewotCXVuc2lnbmVkIGxvbmcgKnRhYmxlID0gaWNwbGJfdGFibGU7CiAJdW5zaWduZWQgbG9uZyBjdHJsOwogCWludCBpOwogCisJU1NZTkMoKTsKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0NQTEJTOyBpKyspIHsKLQkJdW5zaWduZWQgbG9uZyBhZGRyID0gKnRhYmxlKys7Ci0JCXVuc2lnbmVkIGxvbmcgZGF0YSA9ICp0YWJsZSsrOwotCQlpZiAoYWRkciA9PSAodW5zaWduZWQgbG9uZyktMSkKLQkJCWJyZWFrOwotCQliZmluX3dyaXRlMzIoSUNQTEJfQUREUjAgKyBpICogNCwgYWRkcik7Ci0JCWJmaW5fd3JpdGUzMihJQ1BMQl9EQVRBMCArIGkgKiA0LCBkYXRhKTsKKwkJYmZpbl93cml0ZTMyKElDUExCX0FERFIwICsgaSAqIDQsIGljcGxiX3RibFtpXS5hZGRyKTsKKwkJYmZpbl93cml0ZTMyKElDUExCX0RBVEEwICsgaSAqIDQsIGljcGxiX3RibFtpXS5kYXRhKTsKIAl9CiAJY3RybCA9IGJmaW5fcmVhZF9JTUVNX0NPTlRST0woKTsKIAljdHJsIHw9IElNQyB8IEVOSUNQTEI7CkBAIC00NywyMCArNDMsMTcgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9EQ0FDSEUpCi12b2lkIF9faW5pdCBiZmluX2RjYWNoZV9pbml0KHZvaWQpCit2b2lkIF9fY3B1aW5pdCBiZmluX2RjYWNoZV9pbml0KHN0cnVjdCBjcGxiX2VudHJ5ICpkY3BsYl90YmwpCiB7Ci0JdW5zaWduZWQgbG9uZyAqdGFibGUgPSBkY3BsYl90YWJsZTsKIAl1bnNpZ25lZCBsb25nIGN0cmw7CiAJaW50IGk7CiAKKwlTU1lOQygpOwogCWZvciAoaSA9IDA7IGkgPCBNQVhfQ1BMQlM7IGkrKykgewotCQl1bnNpZ25lZCBsb25nIGFkZHIgPSAqdGFibGUrKzsKLQkJdW5zaWduZWQgbG9uZyBkYXRhID0gKnRhYmxlKys7Ci0JCWlmIChhZGRyID09ICh1bnNpZ25lZCBsb25nKS0xKQotCQkJYnJlYWs7Ci0JCWJmaW5fd3JpdGUzMihEQ1BMQl9BRERSMCArIGkgKiA0LCBhZGRyKTsKLQkJYmZpbl93cml0ZTMyKERDUExCX0RBVEEwICsgaSAqIDQsIGRhdGEpOworCQliZmluX3dyaXRlMzIoRENQTEJfQUREUjAgKyBpICogNCwgZGNwbGJfdGJsW2ldLmFkZHIpOworCQliZmluX3dyaXRlMzIoRENQTEJfREFUQTAgKyBpICogNCwgZGNwbGJfdGJsW2ldLmRhdGEpOwogCX0KKwogCWN0cmwgPSBiZmluX3JlYWRfRE1FTV9DT05UUk9MKCk7CiAJY3RybCB8PSBETUVNX0NOVFI7CiAJYmZpbl93cml0ZV9ETUVNX0NPTlRST0woY3RybCk7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW5vbXB1L2NwbGJoZGxyLlMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW5vbXB1L2NwbGJoZGxyLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYmFiYzAuLjAwMDAwMDAKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1ub21wdS9jcGxiaGRsci5TCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vY3BsYmhkbHIuUwotICogQmFzZWQgb246Ci0gKiBBdXRob3I6ICAgICAgIExHIFNvZnQgSW5kaWEKLSAqCi0gKiBDcmVhdGVkOiAgICAgID8KLSAqIERlc2NyaXB0aW9uOiAgQ1BMQiBleGNlcHRpb24gaGFuZGxlcgotICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA2IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgotI2luY2x1ZGUgPGFzbS9jcGxiLmg+Ci0jaW5jbHVkZSA8YXNtL2VudHJ5Lmg+Ci0KLSNpZmRlZiBDT05GSUdfRVhDUFRfSVJRX1NZU0NfTDEKLS5zZWN0aW9uIC5sMS50ZXh0Ci0jZWxzZQotLnRleHQKLSNlbmRpZgotCi0udHlwZSBfY3BsYl9tZ3IsIFNUVF9GVU5DOwotLnR5cGUgX3BhbmljX2NwbGJfZXJyb3IsIFNUVF9GVU5DOwotCi0uYWxpZ24gMgotCi1FTlRSWShfX2NwbGJfaGRyKQotCVIyID0gU0VRU1RBVDsKLQotCS8qIE1hc2sgdGhlIGNvbnRlbnRzIG9mIFNFUVNUQVQgYW5kIGxlYXZlIG9ubHkgRVhDQVVTRSBpbiBSMiAqLwotCVIyIDw8PSAyNjsKLQlSMiA+Pj0gMjY7Ci0KLQlSMSA9IDB4MjM7IC8qIERhdGEgYWNjZXNzIENQTEIgcHJvdGVjdGlvbiB2aW9sYXRpb24gKi8KLQlDQyA9IFIyID09IFIxOwotCUlGICFDQyBKVU1QIC5Mbm90X2RhdGFfd3JpdGU7Ci0JUjAgPSAyOwkJLyogaXMgYSB3cml0ZSB0byBkYXRhIHNwYWNlKi8KLQlKVU1QIC5MaXNfaWNwbGJfbWlzczsKLQotLkxub3RfZGF0YV93cml0ZToKLQlSMSA9IDB4MkM7IC8qIENQTEIgbWlzcyBvbiBhbiBpbnN0cnVjdGlvbiBmZXRjaCAqLwotCUNDID0gUjIgPT0gUjE7Ci0JUjAgPSAwOwkJLyogaXNfZGF0YV9taXNzID09IEZhbHNlKi8KLQlJRiBDQyBKVU1QIC5MaXNfaWNwbGJfbWlzczsKLQotCVIxID0gMHgyNjsKLQlDQyA9IFIyID09IFIxOwotCUlGICFDQyBKVU1QIC5MdW5rbm93bjsKLQotCVIwID0gMTsJCS8qIGlzX2RhdGFfbWlzcyA9PSBUcnVlKi8KLQotLkxpc19pY3BsYl9taXNzOgotCi0jaWYgZGVmaW5lZChDT05GSUdfQkZJTl9JQ0FDSEUpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fRENBQ0hFKQotIyBpZiBkZWZpbmVkKENPTkZJR19CRklOX0lDQUNIRSkgJiYgIWRlZmluZWQoQ09ORklHX0JGSU5fRENBQ0hFKQotCVIxID0gQ1BMQl9FTkFCTEVfSUNBQ0hFOwotIyBlbmRpZgotIyBpZiAhZGVmaW5lZChDT05GSUdfQkZJTl9JQ0FDSEUpICYmIGRlZmluZWQoQ09ORklHX0JGSU5fRENBQ0hFKQotCVIxID0gQ1BMQl9FTkFCTEVfRENBQ0hFOwotIyBlbmRpZgotIyBpZiBkZWZpbmVkKENPTkZJR19CRklOX0lDQUNIRSkgJiYgZGVmaW5lZChDT05GSUdfQkZJTl9EQ0FDSEUpCi0JUjEgPSBDUExCX0VOQUJMRV9EQ0FDSEUgfCBDUExCX0VOQUJMRV9JQ0FDSEU7Ci0jIGVuZGlmCi0jZWxzZQotCVIxID0gMDsKLSNlbmRpZgotCi0JWy0tU1BdID0gUkVUUzsKLQlDQUxMIF9jcGxiX21ncjsKLQlSRVRTID0gW1NQKytdOwotCUNDID0gUjAgPT0gMDsKLQlJRiAhQ0MgSlVNUCAuTG5vdF9yZXBsYWNlZDsKLQlSVFM7Ci0KLS8qCi0gKiBEaWFnbm9zdGljIGV4Y2VwdGlvbiBoYW5kbGVycwotICovCi0uTHVua25vd246Ci0JUjAgPSBDUExCX1VOS05PV05fRVJSOwotCUpVTVAgLkxjcGxiX2Vycm9yOwotCi0uTG5vdF9yZXBsYWNlZDoKLQlDQyA9IFIwID09IENQTEJfTk9fVU5MT0NLRUQ7Ci0JSUYgIUNDIEpVTVAgLkxuZXh0X2NoZWNrOwotCVIwID0gQ1BMQl9OT19VTkxPQ0tFRDsKLQlKVU1QIC5MY3BsYl9lcnJvcjsKLQotLkxuZXh0X2NoZWNrOgotCUNDID0gUjAgPT0gQ1BMQl9OT19BRERSX01BVENIOwotCUlGICFDQyBKVU1QIC5MbmV4dF9jaGVjazI7Ci0JUjAgPSBDUExCX05PX0FERFJfTUFUQ0g7Ci0JSlVNUCAuTGNwbGJfZXJyb3I7Ci0KLS5MbmV4dF9jaGVjazI6Ci0JQ0MgPSBSMCA9PSBDUExCX1BST1RfVklPTDsKLQlJRiAhQ0MgSlVNUCAuTHN0cmFuZ2VfcmV0dXJuX2Zyb21fY3BsYl9tZ3I7Ci0JUjAgPSBDUExCX1BST1RfVklPTDsKLQlKVU1QIC5MY3BsYl9lcnJvcjsKLQotLkxzdHJhbmdlX3JldHVybl9mcm9tX2NwbGJfbWdyOgotCUlETEU7Ci0JQ1NZTkM7Ci0JSlVNUCAuTHN0cmFuZ2VfcmV0dXJuX2Zyb21fY3BsYl9tZ3I7Ci0KLS5MY3BsYl9lcnJvcjoKLQlSMSA9IHNwOwotCVNQICs9IC0xMjsKLQljYWxsIF9wYW5pY19jcGxiX2Vycm9yOwotCVNQICs9IDEyOwotCUpVTVAuTCBfaGFuZGxlX2JhZF9jcGxiOwotCi1FTkRQUk9DKF9fY3BsYl9oZHIpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW5vbXB1L2NwbGJpbmZvLmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW5vbXB1L2NwbGJpbmZvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNzRmMGIuLjAwMDAwMDAKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1ub21wdS9jcGxiaW5mby5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vY3BsYmluZm8uYwotICogQmFzZWQgb246Ci0gKiBBdXRob3I6ICAgICAgIFNvbmljIFpoYW5nIDxzb25pYy56aGFuZ0BhbmFsb2cuY29tPgotICoKLSAqIENyZWF0ZWQ6ICAgICAgSmFuLiAyMDA1Ci0gKiBEZXNjcmlwdGlvbjogIERpc3BsYXkgQ1BMQiBzdGF0dXMKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotCi0jaW5jbHVkZSA8YXNtL2NwbGJpbml0Lmg+Ci0jaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+Ci0KLSNkZWZpbmUgQ1BMQl9JIDEKLSNkZWZpbmUgQ1BMQl9EIDIKLQotI2RlZmluZSBTWU5DX1NZUyAgICBTU1lOQygpCi0jZGVmaW5lIFNZTkNfQ09SRSAgIENTWU5DKCkKLQotI2RlZmluZSBDUExCX0JJVF9QQUdFU0laRSAweDMwMDAwCi0KLXN0YXRpYyBpbnQgcGFnZV9zaXplX3RhYmxlWzRdID0gewotCTB4MDAwMDA0MDAsCQkvKiAxSyAqLwotCTB4MDAwMDEwMDAsCQkvKiA0SyAqLwotCTB4MDAxMDAwMDAsCQkvKiAxTSAqLwotCTB4MDA0MDAwMDAJCS8qIDRNICovCi19OwotCi1zdGF0aWMgY2hhciBwYWdlX3NpemVfc3RyaW5nX3RhYmxlW11bNF0gPSB7ICIxSyIsICI0SyIsICIxTSIsICI0TSIgfTsKLQotc3RhdGljIGludCBjcGxiX2ZpbmRfZW50cnkodW5zaWduZWQgbG9uZyAqY3BsYl9hZGRyLAotCQkJICAgdW5zaWduZWQgbG9uZyAqY3BsYl9kYXRhLCB1bnNpZ25lZCBsb25nIGFkZHIsCi0JCQkgICB1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JaW50IGlpOwotCi0JZm9yIChpaSA9IDA7IGlpIDwgMTY7IGlpKyspCi0JCWlmIChhZGRyID49IGNwbGJfYWRkcltpaV0gJiYgYWRkciA8IGNwbGJfYWRkcltpaV0gKwotCQkgICAgcGFnZV9zaXplX3RhYmxlWyhjcGxiX2RhdGFbaWldICYgQ1BMQl9CSVRfUEFHRVNJWkUpID4+IDE2XQotCQkJJiYgKGNwbGJfZGF0YVtpaV0gPT0gZGF0YSkpCi0JCQlyZXR1cm4gaWk7Ci0KLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBjaGFyICpjcGxiX3ByaW50X2VudHJ5KGNoYXIgKmJ1ZiwgaW50IHR5cGUpCi17Ci0JdW5zaWduZWQgbG9uZyAqcF9hZGRyID0gZHBkdF90YWJsZTsKLQl1bnNpZ25lZCBsb25nICpwX2RhdGEgPSBkcGR0X3RhYmxlICsgMTsKLQl1bnNpZ25lZCBsb25nICpwX2ljb3VudCA9IGRwZHRfc3dhcGNvdW50X3RhYmxlOwotCXVuc2lnbmVkIGxvbmcgKnBfb2NvdW50ID0gZHBkdF9zd2FwY291bnRfdGFibGUgKyAxOwotCXVuc2lnbmVkIGxvbmcgKmNwbGJfYWRkciA9ICh1bnNpZ25lZCBsb25nICopRENQTEJfQUREUjA7Ci0JdW5zaWduZWQgbG9uZyAqY3BsYl9kYXRhID0gKHVuc2lnbmVkIGxvbmcgKilEQ1BMQl9EQVRBMDsKLQlpbnQgZW50cnkgPSAwLCB1c2VkX2NwbGIgPSAwOwotCi0JaWYgKHR5cGUgPT0gQ1BMQl9JKSB7Ci0JCWJ1ZiArPSBzcHJpbnRmKGJ1ZiwgIkluc3RydWN0aW9uIENQTEIgZW50cnk6XG4iKTsKLQkJcF9hZGRyID0gaXBkdF90YWJsZTsKLQkJcF9kYXRhID0gaXBkdF90YWJsZSArIDE7Ci0JCXBfaWNvdW50ID0gaXBkdF9zd2FwY291bnRfdGFibGU7Ci0JCXBfb2NvdW50ID0gaXBkdF9zd2FwY291bnRfdGFibGUgKyAxOwotCQljcGxiX2FkZHIgPSAodW5zaWduZWQgbG9uZyAqKUlDUExCX0FERFIwOwotCQljcGxiX2RhdGEgPSAodW5zaWduZWQgbG9uZyAqKUlDUExCX0RBVEEwOwotCX0gZWxzZQotCQlidWYgKz0gc3ByaW50ZihidWYsICJEYXRhIENQTEIgZW50cnk6XG4iKTsKLQotCWJ1ZiArPSBzcHJpbnRmKGJ1ZiwgIkFkZHJlc3NcdFx0RGF0YVx0U2l6ZVx0VmFsaWRcdExvY2tlZFx0U3dhcGluXHRpQ291bnRcdG9Db3VudFxuIik7Ci0KLQl3aGlsZSAoKnBfYWRkciAhPSAweGZmZmZmZmZmKSB7Ci0JCWVudHJ5ID0gY3BsYl9maW5kX2VudHJ5KGNwbGJfYWRkciwgY3BsYl9kYXRhLCAqcF9hZGRyLCAqcF9kYXRhKTsKLQkJaWYgKGVudHJ5ID49IDApCi0JCQl1c2VkX2NwbGIgfD0gMSA8PCBlbnRyeTsKLQotCQlidWYgKz0KLQkJICAgIHNwcmludGYoYnVmLAotCQkJICAgICIweCUwOGx4XHQweCUwNWx4XHQlc1x0JWNcdCVjXHQlMmRcdCVsZFx0JWxkXG4iLAotCQkJICAgICpwX2FkZHIsICpwX2RhdGEsCi0JCQkgICAgcGFnZV9zaXplX3N0cmluZ190YWJsZVsoKnBfZGF0YSAmIDB4MzAwMDApID4+IDE2XSwKLQkJCSAgICAoKnBfZGF0YSAmIENQTEJfVkFMSUQpID8gJ1knIDogJ04nLAotCQkJICAgICgqcF9kYXRhICYgQ1BMQl9MT0NLKSA/ICdZJyA6ICdOJywgZW50cnksICpwX2ljb3VudCwKLQkJCSAgICAqcF9vY291bnQpOwotCi0JCXBfYWRkciArPSAyOwotCQlwX2RhdGEgKz0gMjsKLQkJcF9pY291bnQgKz0gMjsKLQkJcF9vY291bnQgKz0gMjsKLQl9Ci0KLQlpZiAodXNlZF9jcGxiICE9IDB4ZmZmZikgewotCQlidWYgKz0gc3ByaW50ZihidWYsICJVbnVzZWQvbWlzbWF0Y2hlZCBDUExCczpcbiIpOwotCi0JCWZvciAoZW50cnkgPSAwOyBlbnRyeSA8IDE2OyBlbnRyeSsrKQotCQkJaWYgKDAgPT0gKCgxIDw8IGVudHJ5KSAmIHVzZWRfY3BsYikpIHsKLQkJCQlpbnQgZmxhZ3MgPSBjcGxiX2RhdGFbZW50cnldOwotCQkJCWJ1ZiArPQotCQkJCSAgICBzcHJpbnRmKGJ1ZiwKLQkJCQkJICAgICIlMmQ6IDB4JTA4bHhcdDB4JTA1eFx0JXNcdCVjXHQlY1xuIiwKLQkJCQkJICAgIGVudHJ5LCBjcGxiX2FkZHJbZW50cnldLCBmbGFncywKLQkJCQkJICAgIHBhZ2Vfc2l6ZV9zdHJpbmdfdGFibGVbKGZsYWdzICYKLQkJCQkJCQkJICAgIDB4MzAwMDApID4+Ci0JCQkJCQkJCSAgIDE2XSwKLQkJCQkJICAgIChmbGFncyAmIENQTEJfVkFMSUQpID8gJ1knIDogJ04nLAotCQkJCQkgICAgKGZsYWdzICYgQ1BMQl9MT0NLKSA/ICdZJyA6ICdOJyk7Ci0JCQl9Ci0JfQotCi0JYnVmICs9IHNwcmludGYoYnVmLCAiXG4iKTsKLQotCXJldHVybiBidWY7Ci19Ci0KLXN0YXRpYyBpbnQgY3BsYmluZm9fcHJvY19vdXRwdXQoY2hhciAqYnVmKQotewotCWNoYXIgKnA7Ci0KLQlwID0gYnVmOwotCi0JcCArPSBzcHJpbnRmKHAsICItLS0tLS0tLS0tLS0tLS0tLS0gQ1BMQiBJbmZvcm1hdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS1cblxuIik7Ci0KLQlpZiAoYmZpbl9yZWFkX0lNRU1fQ09OVFJPTCgpICYgRU5JQ1BMQikKLQkJcCA9IGNwbGJfcHJpbnRfZW50cnkocCwgQ1BMQl9JKTsKLQllbHNlCi0JCXAgKz0gc3ByaW50ZihwLCAiSW5zdHJ1Y3Rpb24gQ1BMQiBpcyBkaXNhYmxlZC5cblxuIik7Ci0KLQlpZiAoYmZpbl9yZWFkX0RNRU1fQ09OVFJPTCgpICYgRU5EQ1BMQikKLQkJcCA9IGNwbGJfcHJpbnRfZW50cnkocCwgQ1BMQl9EKTsKLQllbHNlCi0JCXAgKz0gc3ByaW50ZihwLCAiRGF0YSBDUExCIGlzIGRpc2FibGVkLlxuIik7Ci0KLQlyZXR1cm4gcCAtIGJ1ZjsKLX0KLQotc3RhdGljIGludCBjcGxiaW5mb19yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCi0JCQkgICAgICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCWludCBsZW47Ci0KLQlsZW4gPSBjcGxiaW5mb19wcm9jX291dHB1dChwYWdlKTsKLQlpZiAobGVuIDw9IG9mZiArIGNvdW50KQotCQkqZW9mID0gMTsKLQkqc3RhcnQgPSBwYWdlICsgb2ZmOwotCWxlbiAtPSBvZmY7Ci0JaWYgKGxlbiA+IGNvdW50KQotCQlsZW4gPSBjb3VudDsKLQlpZiAobGVuIDwgMCkKLQkJbGVuID0gMDsKLQlyZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBjcGxiaW5mb19pbml0KHZvaWQpCi17Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeTsKLQotCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoImNwbGJpbmZvIiwgMCwgTlVMTCk7Ci0JaWYgKCFlbnRyeSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQllbnRyeS0+cmVhZF9wcm9jID0gY3BsYmluZm9fcmVhZF9wcm9jOwotCWVudHJ5LT5kYXRhID0gTlVMTDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgY3BsYmluZm9fZXhpdCh2b2lkKQotewotCXJlbW92ZV9wcm9jX2VudHJ5KCJjcGxiaW5mbyIsIE5VTEwpOwotfQotCi1tb2R1bGVfaW5pdChjcGxiaW5mb19pbml0KTsKLW1vZHVsZV9leGl0KGNwbGJpbmZvX2V4aXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1ub21wdS9jcGxiaW5pdC5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1ub21wdS9jcGxiaW5pdC5jCmluZGV4IDJkZWJjOTAuLjBlMjhmNzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbm9tcHUvY3BsYmluaXQuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW5vbXB1L2NwbGJpbml0LmMKQEAgLTIwLDQ0NSArMjAsMTUyIEBACiAgKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAogICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLworCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9jcGxiLmg+CiAjaW5jbHVkZSA8YXNtL2NwbGJpbml0Lmg+CisjaW5jbHVkZSA8YXNtL21lbV9tYXAuaD4KIAotI2RlZmluZSBDUExCX01FTSBDT05GSUdfTUFYX01FTV9TSVpFCitzdHJ1Y3QgY3BsYl9lbnRyeSBpY3BsYl90YmxbTlJfQ1BVU11bTUFYX0NQTEJTXSBQRFRfQVRUUjsKK3N0cnVjdCBjcGxiX2VudHJ5IGRjcGxiX3RibFtOUl9DUFVTXVtNQVhfQ1BMQlNdIFBEVF9BVFRSOwogCi0vKgotKiBOdW1iZXIgb2YgcmVxdWlyZWQgZGF0YSBDUExCIHN3aXRjaHRhYmxlIGVudHJpZXMKLSogTUVNU0laRSAvIDQgKHdlIG1vc3RseSBpbnN0YWxsIDRNIHBhZ2Ugc2l6ZSBDUExCcwotKiBhcHByb3ggMTYgZm9yIHNtYWxsZXIgMU1CIHBhZ2Ugc2l6ZSBDUExCcyBmb3IgYWxsaWdubWVudCBwdXJwb3NlcwotKiAxIGZvciBMMSBEYXRhIE1lbW9yeQotKiBwb3NzaWJseSAxIGZvciBMMiBEYXRhIE1lbW9yeQotKiAxIGZvciBDT05GSUdfREVCVUdfSFVOVF9GT1JfWkVSTwotKiAxIGZvciBBU1lOQyBNZW1vcnkKLSovCi0jZGVmaW5lIE1BWF9TV0lUQ0hfRF9DUExCUyAoKChDUExCX01FTSAvIDQpICsgMTYgKyAxICsgMSArIDEgXAotCQkJCSArIEFTWU5DX01FTU9SWV9DUExCX0NPVkVSQUdFKSAqIDIpCitpbnQgZmlyc3Rfc3dpdGNoZWRfaWNwbGIgUERUX0FUVFI7CitpbnQgZmlyc3Rfc3dpdGNoZWRfZGNwbGIgUERUX0FUVFI7CiAKLS8qCi0qIE51bWJlciBvZiByZXF1aXJlZCBpbnN0cnVjdGlvbiBDUExCIHN3aXRjaHRhYmxlIGVudHJpZXMKLSogTUVNU0laRSAvIDQgKHdlIG1vc3RseSBpbnN0YWxsIDRNIHBhZ2Ugc2l6ZSBDUExCcwotKiBhcHByb3ggMTIgZm9yIHNtYWxsZXIgMU1CIHBhZ2Ugc2l6ZSBDUExCcyBmb3IgYWxsaWdubWVudCBwdXJwb3NlcwotKiAxIGZvciBMMSBJbnN0cnVjdGlvbiBNZW1vcnkKLSogcG9zc2libHkgMSBmb3IgTDIgSW5zdHJ1Y3Rpb24gTWVtb3J5Ci0qIDEgZm9yIENPTkZJR19ERUJVR19IVU5UX0ZPUl9aRVJPCi0qLwotI2RlZmluZSBNQVhfU1dJVENIX0lfQ1BMQlMgKCgoQ1BMQl9NRU0gLyA0KSArIDEyICsgMSArIDEgKyAxKSAqIDIpCitzdHJ1Y3QgY3BsYl9ib3VuZGFyeSBkY3BsYl9ib3VuZHNbOV0gUERUX0FUVFI7CitzdHJ1Y3QgY3BsYl9ib3VuZGFyeSBpY3BsYl9ib3VuZHNbN10gUERUX0FUVFI7CiAKK2ludCBpY3BsYl9ucl9ib3VuZHMgUERUX0FUVFI7CitpbnQgZGNwbGJfbnJfYm91bmRzIFBEVF9BVFRSOwogCi11X2xvbmcgaWNwbGJfdGFibGVbTUFYX0NQTEJTICsgMV07Ci11X2xvbmcgZGNwbGJfdGFibGVbTUFYX0NQTEJTICsgMV07Ci0KLSNpZmRlZiBDT05GSUdfQ1BMQl9TV0lUQ0hfVEFCX0wxCi0jIGRlZmluZSBQRFRfQVRUUiBfX2F0dHJpYnV0ZV9fKChsMV9kYXRhKSkKLSNlbHNlCi0jIGRlZmluZSBQRFRfQVRUUgotI2VuZGlmCi0KLXVfbG9uZyBpcGR0X3RhYmxlW01BWF9TV0lUQ0hfSV9DUExCUyArIDFdIFBEVF9BVFRSOwotdV9sb25nIGRwZHRfdGFibGVbTUFYX1NXSVRDSF9EX0NQTEJTICsgMV0gUERUX0FUVFI7Ci0KLSNpZmRlZiBDT05GSUdfQ1BMQl9JTkZPCi11X2xvbmcgaXBkdF9zd2FwY291bnRfdGFibGVbTUFYX1NXSVRDSF9JX0NQTEJTXSBQRFRfQVRUUjsKLXVfbG9uZyBkcGR0X3N3YXBjb3VudF90YWJsZVtNQVhfU1dJVENIX0RfQ1BMQlNdIFBEVF9BVFRSOwotI2VuZGlmCi0KLXN0cnVjdCBzX2NwbGIgewotCXN0cnVjdCBjcGxiX3RhYiBpbml0X2k7Ci0Jc3RydWN0IGNwbGJfdGFiIGluaXRfZDsKLQlzdHJ1Y3QgY3BsYl90YWIgc3dpdGNoX2k7Ci0Jc3RydWN0IGNwbGJfdGFiIHN3aXRjaF9kOwotfTsKLQotI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fRENBQ0hFKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX0lDQUNIRSkKLXN0YXRpYyBzdHJ1Y3QgY3BsYl9kZXNjIGNwbGJfZGF0YVtdID0gewotCXsKLQkJLnN0YXJ0ID0gMCwKLQkJLmVuZCA9IFNJWkVfMUssCi0JCS5wc2l6ZSA9IFNJWkVfMUssCi0JCS5hdHRyID0gSU5JVElBTF9UIHwgU1dJVENIX1QgfCBJX0NQTEIgfCBEX0NQTEIsCi0JCS5pX2NvbmYgPSBTRFJBTV9PT1BTLAotCQkuZF9jb25mID0gU0RSQU1fT09QUywKLSNpZiBkZWZpbmVkKENPTkZJR19ERUJVR19IVU5UX0ZPUl9aRVJPKQotCQkudmFsaWQgPSAxLAotI2Vsc2UKLQkJLnZhbGlkID0gMCwKLSNlbmRpZgotCQkubmFtZSA9ICJaZXJvIFBvaW50ZXIgR3VhcmQgUGFnZSIsCi0JfSwKLQl7Ci0JCS5zdGFydCA9IEwxX0NPREVfU1RBUlQsCi0JCS5lbmQgPSBMMV9DT0RFX1NUQVJUICsgTDFfQ09ERV9MRU5HVEgsCi0JCS5wc2l6ZSA9IFNJWkVfNE0sCi0JCS5hdHRyID0gSU5JVElBTF9UIHwgU1dJVENIX1QgfCBJX0NQTEIsCi0JCS5pX2NvbmYgPSBMMV9JTUVNT1JZLAotCQkuZF9jb25mID0gMCwKLQkJLnZhbGlkID0gMSwKLQkJLm5hbWUgPSAiTDEgSS1NZW1vcnkiLAotCX0sCi0JewotCQkuc3RhcnQgPSBMMV9EQVRBX0FfU1RBUlQsCi0JCS5lbmQgPSBMMV9EQVRBX0JfU1RBUlQgKyBMMV9EQVRBX0JfTEVOR1RILAotCQkucHNpemUgPSBTSVpFXzRNLAotCQkuYXR0ciA9IElOSVRJQUxfVCB8IFNXSVRDSF9UIHwgRF9DUExCLAotCQkuaV9jb25mID0gMCwKLQkJLmRfY29uZiA9IEwxX0RNRU1PUlksCi0jaWYgKChMMV9EQVRBX0FfTEVOR1RIID4gMCkgfHwgKEwxX0RBVEFfQl9MRU5HVEggPiAwKSkKLQkJLnZhbGlkID0gMSwKLSNlbHNlCi0JCS52YWxpZCA9IDAsCi0jZW5kaWYKLQkJLm5hbWUgPSAiTDEgRC1NZW1vcnkiLAotCX0sCi0JewotCQkuc3RhcnQgPSAwLAotCQkuZW5kID0gMCwgIC8qIGR5bmFtaWMgKi8KLQkJLnBzaXplID0gMCwKLQkJLmF0dHIgPSBJTklUSUFMX1QgfCBTV0lUQ0hfVCB8IElfQ1BMQiB8IERfQ1BMQiwKLQkJLmlfY29uZiA9IFNEUkFNX0lHRU5FUklDLAotCQkuZF9jb25mID0gU0RSQU1fREdFTkVSSUMsCi0JCS52YWxpZCA9IDEsCi0JCS5uYW1lID0gIktlcm5lbCBNZW1vcnkiLAotCX0sCi0JewotCQkuc3RhcnQgPSAwLCAvKiBkeW5hbWljICovCi0JCS5lbmQgPSAwLCAvKiBkeW5hbWljICovCi0JCS5wc2l6ZSA9IDAsCi0JCS5hdHRyID0gSU5JVElBTF9UIHwgU1dJVENIX1QgfCBEX0NQTEIsCi0JCS5pX2NvbmYgPSBTRFJBTV9JR0VORVJJQywKLQkJLmRfY29uZiA9IFNEUkFNX0ROT05fQ0hCTCwKLQkJLnZhbGlkID0gMSwKLQkJLm5hbWUgPSAidUNsaW51eCBNVEQgTWVtb3J5IiwKLQl9LAotCXsKLQkJLnN0YXJ0ID0gMCwgLyogZHluYW1pYyAqLwotCQkuZW5kID0gMCwgICAvKiBkeW5hbWljICovCi0JCS5wc2l6ZSA9IFNJWkVfMU0sCi0JCS5hdHRyID0gSU5JVElBTF9UIHwgU1dJVENIX1QgfCBEX0NQTEIsCi0JCS5kX2NvbmYgPSBTRFJBTV9ETk9OX0NIQkwsCi0JCS52YWxpZCA9IDEsCi0JCS5uYW1lID0gIlVuY2FjaGVkIERNQSBab25lIiwKLQl9LAotCXsKLQkJLnN0YXJ0ID0gMCwgLyogZHluYW1pYyAqLwotCQkuZW5kID0gMCwgLyogZHluYW1pYyAqLwotCQkucHNpemUgPSAwLAotCQkuYXR0ciA9IFNXSVRDSF9UIHwgRF9DUExCLAotCQkuaV9jb25mID0gMCwgLyogZHluYW1pYyAqLwotCQkuZF9jb25mID0gMCwgLyogZHluYW1pYyAqLwotCQkudmFsaWQgPSAxLAotCQkubmFtZSA9ICJSZXNlcnZlZCBNZW1vcnkiLAotCX0sCi0JewotCQkuc3RhcnQgPSBBU1lOQ19CQU5LMF9CQVNFLAotCQkuZW5kID0gQVNZTkNfQkFOSzNfQkFTRSArIEFTWU5DX0JBTkszX1NJWkUsCi0JCS5wc2l6ZSA9IDAsCi0JCS5hdHRyID0gU1dJVENIX1QgfCBEX0NQTEIsCi0JCS5kX2NvbmYgPSBTRFJBTV9FQklVLAotCQkudmFsaWQgPSAxLAotCQkubmFtZSA9ICJBc3luY2hyb25vdXMgTWVtb3J5IEJhbmtzIiwKLQl9LAotCXsKLQkJLnN0YXJ0ID0gTDJfU1RBUlQsCi0JCS5lbmQgPSBMMl9TVEFSVCArIEwyX0xFTkdUSCwKLQkJLnBzaXplID0gU0laRV8xTSwKLQkJLmF0dHIgPSBTV0lUQ0hfVCB8IElfQ1BMQiB8IERfQ1BMQiwKLQkJLmlfY29uZiA9IEwyX0lNRU1PUlksCi0JCS5kX2NvbmYgPSBMMl9ETUVNT1JZLAotCQkudmFsaWQgPSAoTDJfTEVOR1RIID4gMCksCi0JCS5uYW1lID0gIkwyIE1lbW9yeSIsCi0JfSwKLQl7Ci0JCS5zdGFydCA9IEJPT1RfUk9NX1NUQVJULAotCQkuZW5kID0gQk9PVF9ST01fU1RBUlQgKyBCT09UX1JPTV9MRU5HVEgsCi0JCS5wc2l6ZSA9IFNJWkVfMU0sCi0JCS5hdHRyID0gU1dJVENIX1QgfCBJX0NQTEIgfCBEX0NQTEIsCi0JCS5pX2NvbmYgPSBTRFJBTV9JR0VORVJJQywKLQkJLmRfY29uZiA9IFNEUkFNX0RHRU5FUklDLAotCQkudmFsaWQgPSAxLAotCQkubmFtZSA9ICJPbi1DaGlwIEJvb3RST00iLAotCX0sCi19OwotCi1zdGF0aWMgdTE2IF9faW5pdCBsb2NrX2tlcm5lbF9jaGVjayh1MzIgc3RhcnQsIHUzMiBlbmQpCit2b2lkIF9faW5pdCBnZW5lcmF0ZV9jcGxiX3RhYmxlc19jcHUodW5zaWduZWQgaW50IGNwdSkKIHsKLQlpZiAoc3RhcnQgPj0gKHUzMilfZW5kIHx8IGVuZCA8PSAodTMyKV9zdGV4dCkKLQkJcmV0dXJuIDA7CisJaW50IGlfZCwgaV9pOworCXVuc2lnbmVkIGxvbmcgYWRkcjsKIAotCS8qIFRoaXMgY3BsYiBibG9jayBvdmVybGFwcGVkIHdpdGgga2VybmVsIGFyZWEuICovCi0JcmV0dXJuIElOX0tFUk5FTDsKLX0KKwlzdHJ1Y3QgY3BsYl9lbnRyeSAqZF90YmwgPSBkY3BsYl90YmxbY3B1XTsKKwlzdHJ1Y3QgY3BsYl9lbnRyeSAqaV90YmwgPSBpY3BsYl90YmxbY3B1XTsKIAotc3RhdGljIHVuc2lnbmVkIHNob3J0IF9faW5pdAotZmlsbF9jcGxidGFiKHN0cnVjdCBjcGxiX3RhYiAqdGFibGUsCi0JICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwKLQkgICAgIHVuc2lnbmVkIGxvbmcgYmxvY2tfc2l6ZSwgdW5zaWduZWQgbG9uZyBjcGxiX2RhdGEpCi17Ci0JaW50IGk7CisJcHJpbnRrKEtFUk5fSU5GTyAiTk9NUFU6IHNldHRpbmcgdXAgY3BsYiB0YWJsZXNcbiIpOwogCi0Jc3dpdGNoIChibG9ja19zaXplKSB7Ci0JY2FzZSBTSVpFXzRNOgotCQlpID0gMzsKLQkJYnJlYWs7Ci0JY2FzZSBTSVpFXzFNOgotCQlpID0gMjsKLQkJYnJlYWs7Ci0JY2FzZSBTSVpFXzRLOgotCQlpID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBTSVpFXzFLOgotCWRlZmF1bHQ6Ci0JCWkgPSAwOwotCQlicmVhazsKKwlpX2QgPSBpX2kgPSAwOworCisJLyogU2V0IHVwIHRoZSB6ZXJvIHBhZ2UuICAqLworCWRfdGJsW2lfZF0uYWRkciA9IDA7CisJZF90YmxbaV9kKytdLmRhdGEgPSBTRFJBTV9PT1BTIHwgUEFHRV9TSVpFXzFLQjsKKworCS8qIENvdmVyIGtlcm5lbCBtZW1vcnkgd2l0aCA0TSBwYWdlcy4gICovCisJYWRkciA9IDA7CisKKwlmb3IgKDsgYWRkciA8IG1lbW9yeV9zdGFydDsgYWRkciArPSA0ICogMTAyNCAqIDEwMjQpIHsKKwkJZF90YmxbaV9kXS5hZGRyID0gYWRkcjsKKwkJZF90YmxbaV9kKytdLmRhdGEgPSBTRFJBTV9ER0VORVJJQyB8IFBBR0VfU0laRV80TUI7CisJCWlfdGJsW2lfaV0uYWRkciA9IGFkZHI7CisJCWlfdGJsW2lfaSsrXS5kYXRhID0gU0RSQU1fSUdFTkVSSUMgfCBQQUdFX1NJWkVfNE1COwogCX0KIAotCWNwbGJfZGF0YSA9IChjcGxiX2RhdGEgJiB+KDMgPDwgMTYpKSB8IChpIDw8IDE2KTsKLQotCXdoaWxlICgoc3RhcnQgPCBlbmQpICYmICh0YWJsZS0+cG9zIDwgdGFibGUtPnNpemUpKSB7Ci0KLQkJdGFibGUtPnRhYlt0YWJsZS0+cG9zKytdID0gc3RhcnQ7Ci0KLQkJaWYgKGxvY2tfa2VybmVsX2NoZWNrKHN0YXJ0LCBzdGFydCArIGJsb2NrX3NpemUpID09IElOX0tFUk5FTCkKLQkJCXRhYmxlLT50YWJbdGFibGUtPnBvcysrXSA9Ci0JCQkgICAgY3BsYl9kYXRhIHwgQ1BMQl9MT0NLIHwgQ1BMQl9ESVJUWTsKLQkJZWxzZQotCQkJdGFibGUtPnRhYlt0YWJsZS0+cG9zKytdID0gY3BsYl9kYXRhOwotCi0JCXN0YXJ0ICs9IGJsb2NrX3NpemU7CisJLyogQ292ZXIgTDEgbWVtb3J5LiAgT25lIDRNIGFyZWEgZm9yIGNvZGUgYW5kIGRhdGEgZWFjaCBpcyBlbm91Z2guICAqLworCWlmIChMMV9EQVRBX0FfTEVOR1RIIHx8IEwxX0RBVEFfQl9MRU5HVEgpIHsKKwkJZF90YmxbaV9kXS5hZGRyID0gTDFfREFUQV9BX1NUQVJUOworCQlkX3RibFtpX2QrK10uZGF0YSA9IEwxX0RNRU1PUlkgfCBQQUdFX1NJWkVfNE1COwogCX0KLQlyZXR1cm4gMDsKKwlpX3RibFtpX2ldLmFkZHIgPSBMMV9DT0RFX1NUQVJUOworCWlfdGJsW2lfaSsrXS5kYXRhID0gTDFfSU1FTU9SWSB8IFBBR0VfU0laRV80TUI7CisKKwlmaXJzdF9zd2l0Y2hlZF9kY3BsYiA9IGlfZDsKKwlmaXJzdF9zd2l0Y2hlZF9pY3BsYiA9IGlfaTsKKworCUJVR19PTihmaXJzdF9zd2l0Y2hlZF9kY3BsYiA+IE1BWF9DUExCUyk7CisJQlVHX09OKGZpcnN0X3N3aXRjaGVkX2ljcGxiID4gTUFYX0NQTEJTKTsKKworCXdoaWxlIChpX2QgPCBNQVhfQ1BMQlMpCisJCWRfdGJsW2lfZCsrXS5kYXRhID0gMDsKKwl3aGlsZSAoaV9pIDwgTUFYX0NQTEJTKQorCQlpX3RibFtpX2krK10uZGF0YSA9IDA7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBfX2luaXQKLWNsb3NlX2NwbGJ0YWIoc3RydWN0IGNwbGJfdGFiICp0YWJsZSkKK3ZvaWQgX19pbml0IGdlbmVyYXRlX2NwbGJfdGFibGVzX2FsbCh2b2lkKQogeworCWludCBpX2QsIGlfaTsKIAotCXdoaWxlICh0YWJsZS0+cG9zIDwgdGFibGUtPnNpemUpIHsKLQotCQl0YWJsZS0+dGFiW3RhYmxlLT5wb3MrK10gPSAwOwotCQl0YWJsZS0+dGFiW3RhYmxlLT5wb3MrK10gPSAwOyAvKiAhQ1BMQl9WQUxJRCAqLwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyogaGVscGVyIGZ1bmN0aW9uICovCi1zdGF0aWMgdm9pZCBfX2luaXQKLV9fZmlsbF9jb2RlX2NwbGJ0YWIoc3RydWN0IGNwbGJfdGFiICp0LCBpbnQgaSwgdTMyIGFfc3RhcnQsIHUzMiBhX2VuZCkKLXsKLQlpZiAoY3BsYl9kYXRhW2ldLnBzaXplKSB7Ci0JCWZpbGxfY3BsYnRhYih0LAotCQkJCWNwbGJfZGF0YVtpXS5zdGFydCwKLQkJCQljcGxiX2RhdGFbaV0uZW5kLAotCQkJCWNwbGJfZGF0YVtpXS5wc2l6ZSwKLQkJCQljcGxiX2RhdGFbaV0uaV9jb25mKTsKLQl9IGVsc2UgewotI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fSUNBQ0hFKQotCQlpZiAoQU5PTUFMWV8wNTAwMDI2MyAmJiBpID09IFNEUkFNX0tFUk4pIHsKLQkJCWZpbGxfY3BsYnRhYih0LAotCQkJCQljcGxiX2RhdGFbaV0uc3RhcnQsCi0JCQkJCWNwbGJfZGF0YVtpXS5lbmQsCi0JCQkJCVNJWkVfNE0sCi0JCQkJCWNwbGJfZGF0YVtpXS5pX2NvbmYpOwotCQl9IGVsc2UKLSNlbmRpZgotCQl7Ci0JCQlmaWxsX2NwbGJ0YWIodCwKLQkJCQkJY3BsYl9kYXRhW2ldLnN0YXJ0LAotCQkJCQlhX3N0YXJ0LAotCQkJCQlTSVpFXzFNLAotCQkJCQljcGxiX2RhdGFbaV0uaV9jb25mKTsKLQkJCWZpbGxfY3BsYnRhYih0LAotCQkJCQlhX3N0YXJ0LAotCQkJCQlhX2VuZCwKLQkJCQkJU0laRV80TSwKLQkJCQkJY3BsYl9kYXRhW2ldLmlfY29uZik7Ci0JCQlmaWxsX2NwbGJ0YWIodCwgYV9lbmQsCi0JCQkJCWNwbGJfZGF0YVtpXS5lbmQsCi0JCQkJCVNJWkVfMU0sCi0JCQkJCWNwbGJfZGF0YVtpXS5pX2NvbmYpOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQKLV9fZmlsbF9kYXRhX2NwbGJ0YWIoc3RydWN0IGNwbGJfdGFiICp0LCBpbnQgaSwgdTMyIGFfc3RhcnQsIHUzMiBhX2VuZCkKLXsKLQlpZiAoY3BsYl9kYXRhW2ldLnBzaXplKSB7Ci0JCWZpbGxfY3BsYnRhYih0LAotCQkJCWNwbGJfZGF0YVtpXS5zdGFydCwKLQkJCQljcGxiX2RhdGFbaV0uZW5kLAotCQkJCWNwbGJfZGF0YVtpXS5wc2l6ZSwKLQkJCQljcGxiX2RhdGFbaV0uZF9jb25mKTsKLQl9IGVsc2UgewotCQlmaWxsX2NwbGJ0YWIodCwKLQkJCQljcGxiX2RhdGFbaV0uc3RhcnQsCi0JCQkJYV9zdGFydCwgU0laRV8xTSwKLQkJCQljcGxiX2RhdGFbaV0uZF9jb25mKTsKLQkJZmlsbF9jcGxidGFiKHQsIGFfc3RhcnQsCi0JCQkJYV9lbmQsIFNJWkVfNE0sCi0JCQkJY3BsYl9kYXRhW2ldLmRfY29uZik7Ci0JCWZpbGxfY3BsYnRhYih0LCBhX2VuZCwKLQkJCQljcGxiX2RhdGFbaV0uZW5kLAotCQkJCVNJWkVfMU0sCi0JCQkJY3BsYl9kYXRhW2ldLmRfY29uZik7Ci0JfQotfQotCi12b2lkIF9faW5pdCBnZW5lcmF0ZV9jcGxiX3RhYmxlcyh2b2lkKQotewotCi0JdTE2IGksIGosIHByb2Nlc3M7Ci0JdTMyIGFfc3RhcnQsIGFfZW5kLCBhcywgYWUsIGFzXzFtOwotCi0Jc3RydWN0IGNwbGJfdGFiICp0X2kgPSBOVUxMOwotCXN0cnVjdCBjcGxiX3RhYiAqdF9kID0gTlVMTDsKLQlzdHJ1Y3Qgc19jcGxiIGNwbGI7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJOT01QVTogc2V0dGluZyB1cCBjcGxiIHRhYmxlcyBmb3IgZ2xvYmFsIGFjY2Vzc1xuIik7Ci0KLQljcGxiLmluaXRfaS5zaXplID0gTUFYX0NQTEJTOwotCWNwbGIuaW5pdF9kLnNpemUgPSBNQVhfQ1BMQlM7Ci0JY3BsYi5zd2l0Y2hfaS5zaXplID0gTUFYX1NXSVRDSF9JX0NQTEJTOwotCWNwbGIuc3dpdGNoX2Quc2l6ZSA9IE1BWF9TV0lUQ0hfRF9DUExCUzsKLQotCWNwbGIuaW5pdF9pLnBvcyA9IDA7Ci0JY3BsYi5pbml0X2QucG9zID0gMDsKLQljcGxiLnN3aXRjaF9pLnBvcyA9IDA7Ci0JY3BsYi5zd2l0Y2hfZC5wb3MgPSAwOwotCi0JY3BsYi5pbml0X2kudGFiID0gaWNwbGJfdGFibGU7Ci0JY3BsYi5pbml0X2QudGFiID0gZGNwbGJfdGFibGU7Ci0JY3BsYi5zd2l0Y2hfaS50YWIgPSBpcGR0X3RhYmxlOwotCWNwbGIuc3dpdGNoX2QudGFiID0gZHBkdF90YWJsZTsKLQotCWNwbGJfZGF0YVtTRFJBTV9LRVJOXS5lbmQgPSBtZW1vcnlfZW5kOwotCisJaV9kID0gMDsKKwkvKiBOb3JtYWwgUkFNLCBpbmNsdWRpbmcgTVREIEZTLiAgKi8KICNpZmRlZiBDT05GSUdfTVREX1VDTElOVVgKLQljcGxiX2RhdGFbU0RSQU1fUkFNX01URF0uc3RhcnQgPSBtZW1vcnlfbXRkX3N0YXJ0OwotCWNwbGJfZGF0YVtTRFJBTV9SQU1fTVREXS5lbmQgPSBtZW1vcnlfbXRkX3N0YXJ0ICsgbXRkX3NpemU7Ci0JY3BsYl9kYXRhW1NEUkFNX1JBTV9NVERdLnZhbGlkID0gbXRkX3NpemUgPiAwOwotIyBpZiBkZWZpbmVkKENPTkZJR19ST01GU19GUykKLQljcGxiX2RhdGFbU0RSQU1fUkFNX01URF0uYXR0ciB8PSBJX0NQTEI7Ci0KLQkvKgotCSAqIFRoZSBST01GU19GUyBzaXplIGlzIG9mdGVuIG5vdCBtdWx0aXBsZSBvZiAxTUIuCi0JICogVGhpcyBjYW4gY2F1c2UgbXVsdGlwbGUgQ1BMQiBzZXRzIGNvdmVyaW5nIHRoZSBzYW1lIG1lbW9yeSBhcmVhLgotCSAqIFRoaXMgd2lsbCB0aGVuIGNhdXNlIG11bHRpcGxlIENQTEIgaGl0IGV4Y2VwdGlvbnMuCi0JICogV29ya2Fyb3VuZDogV2UgZW5zdXJlIGEgY29udGlndW91cyBtZW1vcnkgYXJlYSBieSBleHRlbmRpbmcgdGhlIGtlcm5lbAotCSAqIG1lbW9yeSBzZWN0aW9uIG92ZXIgdGhlIG10ZCBzZWN0aW9uLgotCSAqIEZvciBST01GU19GUyBtZW1vcnkgbXVzdCBiZSBjb3ZlcmVkIHdpdGggSUNQTEJzIGFueXdheXMuCi0JICogU28gdGhlcmUgaXMgbm8gZGlmZmVyZW5jZSBiZXR3ZWVuIGtlcm5lbCBhbmQgbXRkIG1lbW9yeSBzZXR1cC4KLQkgKi8KLQotCWNwbGJfZGF0YVtTRFJBTV9LRVJOXS5lbmQgPSBtZW1vcnlfbXRkX3N0YXJ0ICsgbXRkX3NpemU7OwotCWNwbGJfZGF0YVtTRFJBTV9SQU1fTVREXS52YWxpZCA9IDA7Ci0KLSMgZW5kaWYKKwlkY3BsYl9ib3VuZHNbaV9kXS5lYWRkciA9IG1lbW9yeV9tdGRfc3RhcnQgKyBtdGRfc2l6ZTsKICNlbHNlCi0JY3BsYl9kYXRhW1NEUkFNX1JBTV9NVERdLnZhbGlkID0gMDsKKwlkY3BsYl9ib3VuZHNbaV9kXS5lYWRkciA9IG1lbW9yeV9lbmQ7CiAjZW5kaWYKLQotCWNwbGJfZGF0YVtTRFJBTV9ETUFaXS5zdGFydCA9IF9yYW1lbmQgLSBETUFfVU5DQUNIRURfUkVHSU9OOwotCWNwbGJfZGF0YVtTRFJBTV9ETUFaXS5lbmQgPSBfcmFtZW5kOwotCi0JY3BsYl9kYXRhW1JFU19NRU1dLnN0YXJ0ID0gX3JhbWVuZDsKLQljcGxiX2RhdGFbUkVTX01FTV0uZW5kID0gcGh5c2ljYWxfbWVtX2VuZDsKLQotCWlmIChyZXNlcnZlZF9tZW1fZGNhY2hlX29uKQotCQljcGxiX2RhdGFbUkVTX01FTV0uZF9jb25mID0gU0RSQU1fREdFTkVSSUM7Ci0JZWxzZQotCQljcGxiX2RhdGFbUkVTX01FTV0uZF9jb25mID0gU0RSQU1fRE5PTl9DSEJMOwotCi0JaWYgKHJlc2VydmVkX21lbV9pY2FjaGVfb24pCi0JCWNwbGJfZGF0YVtSRVNfTUVNXS5pX2NvbmYgPSBTRFJBTV9JR0VORVJJQzsKLQllbHNlCi0JCWNwbGJfZGF0YVtSRVNfTUVNXS5pX2NvbmYgPSBTRFJBTV9JTk9OX0NIQkw7Ci0KLQlmb3IgKGkgPSBaRVJPX1A7IGkgPCBBUlJBWV9TSVpFKGNwbGJfZGF0YSk7ICsraSkgewotCQlpZiAoIWNwbGJfZGF0YVtpXS52YWxpZCkKLQkJCWNvbnRpbnVlOwotCi0JCWFzXzFtID0gY3BsYl9kYXRhW2ldLnN0YXJ0ICUgU0laRV8xTTsKLQotCQkvKiBXZSBuZWVkIHRvIG1ha2Ugc3VyZSBhbGwgc2VjdGlvbnMgYXJlIHByb3Blcmx5IDFNIGFsaWduZWQKLQkJICogSG93ZXZlciBiZXR3ZWVuIEtlcm5lbCBNZW1vcnkgYW5kIHRoZSBLZXJuZWwgbXRkIHNlY3Rpb24sIGRlcGVuZGluZyBvbiB0aGUKLQkJICogcm9vdGZzIHNpemUsIHRoZXJlIGNhbiBiZSBvdmVybGFwcGluZyBtZW1vcnkgYXJlYXMuCi0JCSAqLwotCi0JCWlmIChhc18xbSAmJiBpICE9IEwxSV9NRU0gJiYgaSAhPSBMMURfTUVNKSB7Ci0jaWZkZWYgQ09ORklHX01URF9VQ0xJTlVYCi0JCQlpZiAoaSA9PSBTRFJBTV9SQU1fTVREKSB7Ci0JCQkJaWYgKChjcGxiX2RhdGFbU0RSQU1fS0VSTl0uZW5kICsgMSkgPiBjcGxiX2RhdGFbU0RSQU1fUkFNX01URF0uc3RhcnQpCi0JCQkJCWNwbGJfZGF0YVtTRFJBTV9SQU1fTVREXS5zdGFydCA9IChjcGxiX2RhdGFbaV0uc3RhcnQgJiAoLTIqU0laRV8xTSkpICsgU0laRV8xTTsKLQkJCQllbHNlCi0JCQkJCWNwbGJfZGF0YVtTRFJBTV9SQU1fTVREXS5zdGFydCA9IChjcGxiX2RhdGFbaV0uc3RhcnQgJiAoLTIqU0laRV8xTSkpOwotCQkJfSBlbHNlCi0jZW5kaWYKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJVbmFsaWduZWQgU3RhcnQgb2YgJXMgYXQgMHglWFxuIiwKLQkJCQkgICAgICAgY3BsYl9kYXRhW2ldLm5hbWUsIGNwbGJfZGF0YVtpXS5zdGFydCk7Ci0JCX0KLQotCQlhcyA9IGNwbGJfZGF0YVtpXS5zdGFydCAlIFNJWkVfNE07Ci0JCWFlID0gY3BsYl9kYXRhW2ldLmVuZCAlIFNJWkVfNE07Ci0KLQkJaWYgKGFzKQotCQkJYV9zdGFydCA9IGNwbGJfZGF0YVtpXS5zdGFydCArIChTSVpFXzRNIC0gKGFzKSk7Ci0JCWVsc2UKLQkJCWFfc3RhcnQgPSBjcGxiX2RhdGFbaV0uc3RhcnQ7Ci0KLQkJYV9lbmQgPSBjcGxiX2RhdGFbaV0uZW5kIC0gYWU7Ci0KLQkJZm9yIChqID0gSU5JVElBTF9UOyBqIDw9IFNXSVRDSF9UOyBqKyspIHsKLQotCQkJc3dpdGNoIChqKSB7Ci0JCQljYXNlIElOSVRJQUxfVDoKLQkJCQlpZiAoY3BsYl9kYXRhW2ldLmF0dHIgJiBJTklUSUFMX1QpIHsKLQkJCQkJdF9pID0gJmNwbGIuaW5pdF9pOwotCQkJCQl0X2QgPSAmY3BsYi5pbml0X2Q7Ci0JCQkJCXByb2Nlc3MgPSAxOwotCQkJCX0gZWxzZQotCQkJCQlwcm9jZXNzID0gMDsKLQkJCQlicmVhazsKLQkJCWNhc2UgU1dJVENIX1Q6Ci0JCQkJaWYgKGNwbGJfZGF0YVtpXS5hdHRyICYgU1dJVENIX1QpIHsKLQkJCQkJdF9pID0gJmNwbGIuc3dpdGNoX2k7Ci0JCQkJCXRfZCA9ICZjcGxiLnN3aXRjaF9kOwotCQkJCQlwcm9jZXNzID0gMTsKLQkJCQl9IGVsc2UKLQkJCQkJcHJvY2VzcyA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCQlwcm9jZXNzID0gMDsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKCFwcm9jZXNzKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGNwbGJfZGF0YVtpXS5hdHRyICYgSV9DUExCKQotCQkJCV9fZmlsbF9jb2RlX2NwbGJ0YWIodF9pLCBpLCBhX3N0YXJ0LCBhX2VuZCk7Ci0KLQkJCWlmIChjcGxiX2RhdGFbaV0uYXR0ciAmIERfQ1BMQikKLQkJCQlfX2ZpbGxfZGF0YV9jcGxidGFiKHRfZCwgaSwgYV9zdGFydCwgYV9lbmQpOwotCQl9CisJZGNwbGJfYm91bmRzW2lfZCsrXS5kYXRhID0gU0RSQU1fREdFTkVSSUM7CisJLyogRE1BIHVuY2FjaGVkIHJlZ2lvbi4gICovCisJaWYgKERNQV9VTkNBQ0hFRF9SRUdJT04pIHsKKwkJZGNwbGJfYm91bmRzW2lfZF0uZWFkZHIgPSBfcmFtZW5kOworCQlkY3BsYl9ib3VuZHNbaV9kKytdLmRhdGEgPSBTRFJBTV9ETk9OX0NIQkw7CiAJfQorCWlmIChfcmFtZW5kICE9IHBoeXNpY2FsX21lbV9lbmQpIHsKKwkJLyogUmVzZXJ2ZWQgbWVtb3J5LiAgKi8KKwkJZGNwbGJfYm91bmRzW2lfZF0uZWFkZHIgPSBwaHlzaWNhbF9tZW1fZW5kOworCQlkY3BsYl9ib3VuZHNbaV9kKytdLmRhdGEgPSAocmVzZXJ2ZWRfbWVtX2RjYWNoZV9vbiA/CisJCQkJCSAgICBTRFJBTV9ER0VORVJJQyA6IFNEUkFNX0ROT05fQ0hCTCk7CisJfQorCS8qIEFkZHJlc3NpbmcgaG9sZSB1cCB0byB0aGUgYXN5bmMgYmFuay4gICovCisJZGNwbGJfYm91bmRzW2lfZF0uZWFkZHIgPSBBU1lOQ19CQU5LMF9CQVNFOworCWRjcGxiX2JvdW5kc1tpX2QrK10uZGF0YSA9IDA7CisJLyogQVNZTkMgYmFua3MuICAqLworCWRjcGxiX2JvdW5kc1tpX2RdLmVhZGRyID0gQVNZTkNfQkFOSzNfQkFTRSArIEFTWU5DX0JBTkszX1NJWkU7CisJZGNwbGJfYm91bmRzW2lfZCsrXS5kYXRhID0gU0RSQU1fRUJJVTsKKwkvKiBBZGRyZXNzaW5nIGhvbGUgdXAgdG8gQm9vdFJPTS4gICovCisJZGNwbGJfYm91bmRzW2lfZF0uZWFkZHIgPSBCT09UX1JPTV9TVEFSVDsKKwlkY3BsYl9ib3VuZHNbaV9kKytdLmRhdGEgPSAwOworCS8qIEJvb3RST00gLS0gbGFyZ2VzdCBvbmUgc2hvdWxkIGJlIGxlc3MgdGhhbiAxIG1lZy4gICovCisJZGNwbGJfYm91bmRzW2lfZF0uZWFkZHIgPSBCT09UX1JPTV9TVEFSVCArICgxICogMTAyNCAqIDEwMjQpOworCWRjcGxiX2JvdW5kc1tpX2QrK10uZGF0YSA9IFNEUkFNX0RHRU5FUklDOworCWlmIChMMl9MRU5HVEgpIHsKKwkJLyogQWRkcmVzc2luZyBob2xlIHVwIHRvIEwyIFNSQU0uICAqLworCQlkY3BsYl9ib3VuZHNbaV9kXS5lYWRkciA9IEwyX1NUQVJUOworCQlkY3BsYl9ib3VuZHNbaV9kKytdLmRhdGEgPSAwOworCQkvKiBMMiBTUkFNLiAgKi8KKwkJZGNwbGJfYm91bmRzW2lfZF0uZWFkZHIgPSBMMl9TVEFSVCArIEwyX0xFTkdUSDsKKwkJZGNwbGJfYm91bmRzW2lfZCsrXS5kYXRhID0gTDJfRE1FTU9SWTsKKwl9CisJZGNwbGJfbnJfYm91bmRzID0gaV9kOworCUJVR19PTihkY3BsYl9ucl9ib3VuZHMgPiBBUlJBWV9TSVpFKGRjcGxiX2JvdW5kcykpOwogCi0vKiBjbG9zZSB0YWJsZXMgKi8KLQotCWNsb3NlX2NwbGJ0YWIoJmNwbGIuaW5pdF9pKTsKLQljbG9zZV9jcGxidGFiKCZjcGxiLmluaXRfZCk7Ci0KLQljcGxiLmluaXRfaS50YWJbY3BsYi5pbml0X2kucG9zXSA9IC0xOwotCWNwbGIuaW5pdF9kLnRhYltjcGxiLmluaXRfZC5wb3NdID0gLTE7Ci0JY3BsYi5zd2l0Y2hfaS50YWJbY3BsYi5zd2l0Y2hfaS5wb3NdID0gLTE7Ci0JY3BsYi5zd2l0Y2hfZC50YWJbY3BsYi5zd2l0Y2hfZC5wb3NdID0gLTE7Ci0KLX0KLQorCWlfaSA9IDA7CisJLyogTm9ybWFsIFJBTSwgaW5jbHVkaW5nIE1URCBGUy4gICovCisjaWZkZWYgQ09ORklHX01URF9VQ0xJTlVYCisJaWNwbGJfYm91bmRzW2lfaV0uZWFkZHIgPSBtZW1vcnlfbXRkX3N0YXJ0ICsgbXRkX3NpemU7CisjZWxzZQorCWljcGxiX2JvdW5kc1tpX2ldLmVhZGRyID0gbWVtb3J5X2VuZDsKICNlbmRpZgotCisJaWNwbGJfYm91bmRzW2lfaSsrXS5kYXRhID0gU0RSQU1fSUdFTkVSSUM7CisJLyogRE1BIHVuY2FjaGVkIHJlZ2lvbi4gICovCisJaWYgKERNQV9VTkNBQ0hFRF9SRUdJT04pIHsKKwkJaWNwbGJfYm91bmRzW2lfaV0uZWFkZHIgPSBfcmFtZW5kOworCQlpY3BsYl9ib3VuZHNbaV9pKytdLmRhdGEgPSAwOworCX0KKwlpZiAoX3JhbWVuZCAhPSBwaHlzaWNhbF9tZW1fZW5kKSB7CisJCS8qIFJlc2VydmVkIG1lbW9yeS4gICovCisJCWljcGxiX2JvdW5kc1tpX2ldLmVhZGRyID0gcGh5c2ljYWxfbWVtX2VuZDsKKwkJaWNwbGJfYm91bmRzW2lfaSsrXS5kYXRhID0gKHJlc2VydmVkX21lbV9pY2FjaGVfb24gPworCQkJCQkgICAgU0RSQU1fSUdFTkVSSUMgOiBTRFJBTV9JTk9OX0NIQkwpOworCX0KKwkvKiBBZGRyZXNzaW5nIGhvbGUgdXAgdG8gQm9vdFJPTS4gICovCisJaWNwbGJfYm91bmRzW2lfaV0uZWFkZHIgPSBCT09UX1JPTV9TVEFSVDsKKwlpY3BsYl9ib3VuZHNbaV9pKytdLmRhdGEgPSAwOworCS8qIEJvb3RST00gLS0gbGFyZ2VzdCBvbmUgc2hvdWxkIGJlIGxlc3MgdGhhbiAxIG1lZy4gICovCisJaWNwbGJfYm91bmRzW2lfaV0uZWFkZHIgPSBCT09UX1JPTV9TVEFSVCArICgxICogMTAyNCAqIDEwMjQpOworCWljcGxiX2JvdW5kc1tpX2krK10uZGF0YSA9IFNEUkFNX0lHRU5FUklDOworCWlmIChMMl9MRU5HVEgpIHsKKwkJLyogQWRkcmVzc2luZyBob2xlIHVwIHRvIEwyIFNSQU0sIGluY2x1ZGluZyB0aGUgYXN5bmMgYmFuay4gICovCisJCWljcGxiX2JvdW5kc1tpX2ldLmVhZGRyID0gTDJfU1RBUlQ7CisJCWljcGxiX2JvdW5kc1tpX2krK10uZGF0YSA9IDA7CisJCS8qIEwyIFNSQU0uICAqLworCQlpY3BsYl9ib3VuZHNbaV9pXS5lYWRkciA9IEwyX1NUQVJUICsgTDJfTEVOR1RIOworCQlpY3BsYl9ib3VuZHNbaV9pKytdLmRhdGEgPSBMMl9JTUVNT1JZOworCX0KKwlpY3BsYl9ucl9ib3VuZHMgPSBpX2k7CisJQlVHX09OKGljcGxiX25yX2JvdW5kcyA+IEFSUkFZX1NJWkUoaWNwbGJfYm91bmRzKSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW5vbXB1L2NwbGJtZ3IuUyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbm9tcHUvY3BsYm1nci5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWNmM2FjLi4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbm9tcHUvY3BsYm1nci5TCisrKyAvZGV2L251bGwKQEAgLTEsNjQ2ICswLDAgQEAKLS8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vY3BsYm1ndHIuUwotICogQmFzZWQgb246Ci0gKiBBdXRob3I6ICAgICAgIExHIFNvZnQgSW5kaWEKLSAqCi0gKiBDcmVhdGVkOiAgICAgID8KLSAqIERlc2NyaXB0aW9uOiAgQ1BMQiByZXBsYWNlbWVudCByb3V0aW5lIGZvciBDUExCIG1pc21hdGNoCi0gKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotICovCi0KLS8qIFVzYWdlOiBpbnQgX2NwbGJfbWdyKGlzX2RhdGFfbWlzcyxpbnQgZW5hYmxlX2NhY2hlKQotICogaXNfZGF0YV9taXNzPT0yID0+IE1hcmsgYXMgRGlydHksIHdyaXRlIHRvIHRoZSBjbGVhbiBkYXRhIHBhZ2UKLSAqIGlzX2RhdGFfbWlzcz09MSA9PiBSZXBsYWNlIGEgZGF0YSBDUExCLgotICogaXNfZGF0YV9taXNzPT0wID0+IFJlcGxhY2UgYW4gaW5zdHJ1Y3Rpb24gQ1BMQi4KLSAqCi0gKiBSZXR1cm5zOgotICogQ1BMQl9SRUxPQURFRAk9PiBTdWNjZXNzZnVsbHkgdXBkYXRlZCBDUExCIHRhYmxlLgotICogQ1BMQl9OT19VTkxPQ0tFRAk9PiBBbGwgQ1BMQnMgYXJlIGxvY2tlZCwgc28gY2Fubm90IGJlIGV2aWN0ZWQuCi0gKgkJCSAgIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIENQTEJzIGluIHRoZSBjb25maWd1cmF0aW9uCi0gKgkJCSAgIHRhYmxlaSBhcmUgYmFkbHkgY29uZmlndXJlZCwgYXMgdGhpcyBzaG91bGQgbmV2ZXIKLSAqCQkJICAgb2NjdXIuCi0gKiBDUExCX05PX0FERFJfTUFUQ0gJPT4gVGhlIGFkZHJlc3MgYmVpbmcgYWNjZXNzZWQsIHRoYXQgdHJpZ2dlcmVkIHRoZQotICoJCQkgICBleGNlcHRpb24sIGlzIG5vdCBjb3ZlcmVkIGJ5IGFueSBvZiB0aGUgQ1BMQnMgaW4KLSAqCQkJICAgdGhlIGNvbmZpZ3VyYXRpb24gdGFibGUuIFRoZSBhcHBsaWNhdGlvbiBpcwotICoJCQkgICBwcmVzdW1hYmx5IG1pc2JlaGF2aW5nLgotICogQ1BMQl9QUk9UX1ZJT0wJPT4gVGhlIGFkZHJlc3MgYmVpbmcgYWNjZXNzZWQsIHRoYXQgdHJpZ2dlcmVkIHRoZQotICoJCQkgICBleGNlcHRpb24sIHdhcyBub3QgYSBmaXJzdC13cml0ZSB0byBhIGNsZWFuIFdyaXRlCi0gKgkJCSAgIEJhY2sgRGF0YSBwYWdlLCBhbmQgc28gcHJlc3VtYWJseSBpcyBhIGdlbnVpbmUKLSAqCQkJICAgdmlvbGF0aW9uIG9mIHRoZSBwYWdlJ3MgcHJvdGVjdGlvbiBhdHRyaWJ1dGVzLgotICoJCQkgICBUaGUgYXBwbGljYXRpb24gaXMgbWlzYmVoYXZpbmcuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KLSNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KLSNpbmNsdWRlIDxhc20vY3BsYi5oPgotCi0jaWZkZWYgQ09ORklHX0VYQ1BUX0lSUV9TWVNDX0wxCi0uc2VjdGlvbiAubDEudGV4dAotI2Vsc2UKLS50ZXh0Ci0jZW5kaWYKLQotLmFsaWduIDI7Ci1FTlRSWShfY3BsYl9tZ3IpCi0KLQlbLS1TUF09KCBSNzo0LFA1OjMgKTsKLQotCUNDID0gUjAgPT0gMjsKLQlJRiBDQyBKVU1QIC5MZGNwbGJfd3JpdGU7Ci0KLQlDQyA9IFIwID09IDA7Ci0JSUYgIUNDIEpVTVAgLkxkY3BsYl9taXNzX2NvbXBhcmU7Ci0KLQkvKiBJQ1BMQiBNaXNzIEV4Y2VwdGlvbi4gV2UgbmVlZCB0byBjaG9vc2Ugb25lIG9mIHRoZQotCSogY3VycmVudGx5LWluc3RhbGxlZCBDUExCcywgYW5kIHJlcGxhY2UgaXQgd2l0aCBvbmUKLQkqIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gdGFibGUuCi0JKi8KLQotCS8qIEEgbXVsdGktd29yZCBpbnN0cnVjdGlvbiBjYW4gY3Jvc3MgYSBwYWdlIGJvdW5kYXJ5LiBUaGlzIG1lYW5zIHRoZQotCSAqIGZpcnN0IHBhcnQgb2YgdGhlIGluc3RydWN0aW9uIGNhbiBiZSBpbiBhIHZhbGlkIHBhZ2UsIGJ1dCB0aGUKLQkgKiBzZWNvbmQgcGFydCBpcyBub3QsIGFuZCBoZW5jZSBnZW5lcmF0ZXMgdGhlIGluc3RydWN0aW9uIG1pc3MuCi0JICogSG93ZXZlciwgdGhlIGZhdWx0IGFkZHJlc3MgaXMgZm9yIHRoZSBzdGFydCBvZiB0aGUgaW5zdHJ1Y3Rpb24sCi0JICogbm90IHRoZSBwYXJ0IHRoYXQncyBpbiB0aGUgYmFkIHBhZ2UuIFRoZXJlZm9yZSwgd2UgaGF2ZSB0byBjaGVjawotCSAqIHdoZXRoZXIgdGhlIGZhdWx0IGFkZHJlc3MgYXBwbGllcyB0byBhIHBhZ2UgdGhhdCBpcyBhbHJlYWR5IHByZXNlbnQKLQkgKiBpbiB0aGUgdGFibGUuCi0JICovCi0KLQlQNC5MID0gTE8oSUNQTEJfRkFVTFRfQUREUik7Ci0JUDQuSCA9IEhJKElDUExCX0ZBVUxUX0FERFIpOwotCi0JUDEgPSAxNjsKLQlQNS5MID0gX3BhZ2Vfc2l6ZV90YWJsZTsKLQlQNS5IID0gX3BhZ2Vfc2l6ZV90YWJsZTsKLQotCVAwLkwgPSBMTyhJQ1BMQl9EQVRBMCk7Ci0JUDAuSCA9IEhJKElDUExCX0RBVEEwKTsKLQlSNCA9IFtQNF07CQkvKiBHZXQgZmF1bHRpbmcgYWRkcmVzcyovCi0JUjYgPSA2NDsJCS8qIEFkdmFuY2UgcGFzdCB0aGUgZmF1bHQgYWRkcmVzcywgd2hpY2gqLwotCVI2ID0gUjYgKyBSNDsJCS8qIHdlJ2xsIHVzZSBpZiB3ZSBmaW5kIGEgbWF0Y2gqLwotCVIzID0gKCgxNiA8PCA4KSB8IDIpOwkvKiBFeHRyYWN0IG1hc2ssIHR3byBiaXRzIGF0IHBvc24gMTYgKi8KLQotCVI1ID0gMDsKLS5MaXNlYXJjaDoKLQotCVIxID0gW1AwLTB4MTAwXTsJLyogQWRkcmVzcyBmb3IgdGhpcyBDUExCICovCi0KLQlSMCA9IFtQMCsrXTsJCS8qIEluZm8gZm9yIHRoaXMgQ1BMQiovCi0JQ0MgPSBCSVRUU1QoUjAsMCk7CS8qIElzIHRoZSBDUExCIHZhbGlkPyovCi0JSUYgIUNDIEpVTVAgLkxub21hdGNoOwkvKiBTa2lwIGl0LCBpZiBub3QuKi8KLQlDQyA9IFI0IDwgUjEoSVUpOwkvKiBJZiBmYXVsdCBhZGRyZXNzIGxlc3MgdGhhbiBwYWdlIHN0YXJ0Ki8KLQlJRiBDQyBKVU1QIC5Mbm9tYXRjaDsJLyogdGhlbiBza2lwIHRoaXMgb25lLiovCi0JUjIgPSBFWFRSQUNUKFIwLFIzLkwpIChaKTsJLyogR2V0IHBhZ2Ugc2l6ZSovCi0JUDEgPSBSMjsKLQlQMSA9IFA1ICsgKFAxPDwyKTsJLyogaW5kZXggaW50byBwYWdlLXNpemUgdGFibGUqLwotCVIyID0gW1AxXTsJCS8qIEdldCB0aGUgcGFnZSBzaXplKi8KLQlSMSA9IFIxICsgUjI7CQkvKiBhbmQgYWRkIHRvIHBhZ2Ugc3RhcnQsIHRvIGdldCBwYWdlIGVuZCovCi0JQ0MgPSBSNCA8IFIxKElVKTsJLyogYW5kIHNlZSB3aGV0aGVyIGZhdWx0IGFkZHIgaXMgaW4gcGFnZS4qLwotCUlGICFDQyBSNCA9IFI2OwkJLyogSWYgc28sIGFkdmFuY2UgdGhlIGFkZHJlc3MgYW5kIGZpbmlzaCBsb29wLiovCi0JSUYgIUNDIEpVTVAgLkxpc2VhcmNoX2RvbmU7Ci0uTG5vbWF0Y2g6Ci0JLyogR28gYXJvdW5kIGFnYWluKi8KLQlSNSArPSAxOwotCUNDID0gQklUVFNUKFI1LCA0KTsJLyogaS5lIENDID0gUjUgPj0gMTYqLwotCUlGICFDQyBKVU1QIC5MaXNlYXJjaDsKLQotLkxpc2VhcmNoX2RvbmU6Ci0JSTAgPSBSNDsJCS8qIEZhdWx0IGFkZHJlc3Mgd2UnbGwgc2VhcmNoIGZvciovCi0KLQkvKiBzZXQgdXAgcG9pbnRlcnMgKi8KLQlQMC5MID0gTE8oSUNQTEJfREFUQTApOwotCVAwLkggPSBISShJQ1BMQl9EQVRBMCk7Ci0KLQkvKiBUaGUgcmVwbGFjZW1lbnQgcHJvY2VkdXJlIGZvciBJQ1BMQnMgKi8KLQotCVA0LkwgPSBMTyhJTUVNX0NPTlRST0wpOwotCVA0LkggPSBISShJTUVNX0NPTlRST0wpOwotCi0JLyogVHVybiBvZmYgQ1BMQnMgd2hpbGUgd2Ugd29yaywgbmVjZXNzYXJ5IGFjY29yZGluZyB0byBIUk0gYmVmb3JlCi0JICogbW9kaWZ5aW5nIENQTEIgZGVzY3JpcHRvcnMKLQkgKi8KLQlSNSA9IFtQNF07CQkvKiBDb250cm9sIFJlZ2lzdGVyKi8KLQlCSVRDTFIoUjUsRU5JQ1BMQl9QKTsKLQlDTEkgUjE7Ci0JU1NZTkM7CQkvKiBTU1lOQyByZXF1aXJlZCBiZWZvcmUgd3JpdGluZyB0byBJTUVNX0NPTlRST0wuICovCi0JLmFsaWduIDg7Ci0JW1A0XSA9IFI1OwotCVNTWU5DOwotCVNUSSBSMTsKLQotCVIxID0gLTE7CQkvKiBlbmQgcG9pbnQgY29tcGFyaXNvbiAqLwotCVIzID0gMTY7CQkvKiBjb3VudGVyICovCi0KLQkvKiBTZWFyY2ggdGhyb3VnaCBDUExCcyBmb3IgZmlyc3Qgbm9uLWxvY2tlZCBlbnRyeSAqLwotCS8qIE92ZXJ3cml0ZSBpdCBieSBtb3ZpbmcgZXZlcnlvbmUgZWxzZSB1cCBieSAxICovCi0uTGljaGVja19sb2NrOgotCVIwID0gW1AwKytdOwotCVIzID0gUjMgKyBSMTsKLQlDQyA9IFIzID09IFIxOwotCUlGIENDIEpVTVAgLkxhbGxfbG9ja2VkOwotCUNDID0gQklUVFNUKFIwLCAwKTsJCS8qIGFuIGludmFsaWQgZW50cnkgaXMgZ29vZCAqLwotCUlGICFDQyBKVU1QIC5MaWZvdW5kX3ZpY3RpbTsKLQlDQyA9IEJJVFRTVChSMCwxKTsJCS8qIGJ1dCBhIGxvY2tlZCBlbnRyeSBpc24ndCAqLwotCUlGIENDIEpVTVAgLkxpY2hlY2tfbG9jazsKLQotLkxpZm91bmRfdmljdGltOgotI2lmZGVmIENPTkZJR19DUExCX0lORk8KLQlSNyA9IFtQMCAtIDB4MTA0XTsKLQlQMi5MID0gX2lwZHRfdGFibGU7Ci0JUDIuSCA9IF9pcGR0X3RhYmxlOwotCVAzLkwgPSBfaXBkdF9zd2FwY291bnRfdGFibGU7Ci0JUDMuSCA9IF9pcGR0X3N3YXBjb3VudF90YWJsZTsKLQlQMyArPSAtNDsKLS5MaWNvdW50OgotCVIyID0gW1AyXTsJLyogYWRkcmVzcyBmcm9tIGNvbmZpZyB0YWJsZSAqLwotCVAyICs9IDg7Ci0JUDMgKz0gODsKLQlDQyA9IFIyPT0tMTsKLQlJRiBDQyBKVU1QIC5MaWNvdW50X2RvbmU7Ci0JQ0MgPSBSNz09UjI7Ci0JSUYgIUNDIEpVTVAgLkxpY291bnQ7Ci0JUjcgPSBbUDNdOwotCVI3ICs9IDE7Ci0JW1AzXSA9IFI3OwotCUNTWU5DOwotLkxpY291bnRfZG9uZToKLSNlbmRpZgotCUxDMD1SMzsKLQlMU0VUVVAoLkxpc19tb3ZlLC5MaWVfbW92ZSkgTEMwOwotLkxpc19tb3ZlOgotCVIwID0gW1AwXTsKLQlbUDAgLSA0XSA9IFIwOwotCVIwID0gW1AwIC0gMHgxMDBdOwotCVtQMC0weDEwNF0gPSBSMDsKLS5MaWVfbW92ZToKLQlQMCs9NDsKLQotCS8qIENsZWFyIElDUExCX0RBVEExNSwgaW4gY2FzZSB3ZSBkb24ndCBmaW5kIGEgcmVwbGFjZW1lbnQKLQkgKiBvdGhlcndpc2UsIHdlIHdvdWxkIGhhdmUgYSBkdXBsaWNhdGUgZW50cnksIGFuZCB3aWxsIGNyYXNoCi0JICovCi0JUjAgPSAwOwotCVtQMCAtIDRdID0gUjA7Ci0KLQkvKiBXZSd2ZSBtYWRlIHNwYWNlIGluIHRoZSBJQ1BMQiB0YWJsZSwgc28gdGhhdCBJQ1BMQjE1Ci0JICogaXMgbm93IGZyZWUgdG8gYmUgb3ZlcndyaXR0ZW4uIE5leHQsIHdlIGhhdmUgdG8gZGV0ZXJtaW5lCi0JICogd2hpY2ggQ1BMQiB3ZSBuZWVkIHRvIGluc3RhbGwsIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiB0YWJsZS4gVGhpcyBpcyBhIG1hdHRlciBvZiBnZXR0aW5nIHRoZSBzdGFydC1vZi1wYWdlCi0JICogYWRkcmVzc2VzIGFuZCBwYWdlLWxlbmd0aHMgZnJvbSB0aGUgY29uZmlnIHRhYmxlLCBhbmQKLQkgKiBkZXRlcm1pbmluZyB3aGV0aGVyIHRoZSBmYXVsdCBhZGRyZXNzIGZhbGxzIHdpdGhpbiB0aGF0Ci0JICogcmFuZ2UuCi0gCSAqLwotCi0JUDIuTCA9IF9pcGR0X3RhYmxlOwotCVAyLkggPSBfaXBkdF90YWJsZTsKLSNpZmRlZglDT05GSUdfQ1BMQl9JTkZPCi0JUDMuTCA9IF9pcGR0X3N3YXBjb3VudF90YWJsZTsKLQlQMy5IID0gX2lwZHRfc3dhcGNvdW50X3RhYmxlOwotCVAzICs9IC04OwotI2VuZGlmCi0JUDAuTCA9IF9wYWdlX3NpemVfdGFibGU7Ci0JUDAuSCA9IF9wYWdlX3NpemVfdGFibGU7Ci0KLQkvKiBSZXRyaWV2ZSBvdXIgZmF1bHQgYWRkcmVzcyAod2hpY2ggbWF5IGhhdmUgYmVlbiBhZHZhbmNlZAotCSAqIGJlY2F1c2UgdGhlIGZhdWx0aW5nIGluc3RydWN0aW9uIGNyb3NzZWQgYSBwYWdlIGJvdW5kYXJ5KS4KLQkgKi8KLQotCVIwID0gSTA7Ci0KLQkvKiBBbiBleHRyYWN0aW9uIHBhdHRlcm4sIHRvIGdldCB0aGUgcGFnZS1zaXplIGJpdHMgZnJvbQotCSAqIHRoZSBDUExCIGRhdGEgZW50cnkuIEJpdHMgMTYtMTcsIHNvIHR3byBiaXRzIGF0IHBvc24gMTYuCi0JICovCi0KLQlSMSA9ICgoMTY8PDgpfDIpOwotLkxpbmV4dDoJUjQgPSBbUDIrK107CS8qIGFkZHJlc3MgZnJvbSBjb25maWcgdGFibGUgKi8KLQlSMiA9IFtQMisrXTsJLyogZGF0YSBmcm9tIGNvbmZpZyB0YWJsZSAqLwotI2lmZGVmCUNPTkZJR19DUExCX0lORk8KLQlQMyArPSA4OwotI2VuZGlmCi0KLQlDQyA9IFI0ID09IC0xOwkvKiBFbmQgb2YgY29uZmlnIHRhYmxlKi8KLQlJRiBDQyBKVU1QIC5Mbm9fcGFnZV9pbl90YWJsZTsKLQotCS8qIFNlZSBpZiBmYWlsZWQgYWRkcmVzcyA+IHN0YXJ0IGFkZHJlc3MgKi8KLQlDQyA9IFI0IDw9IFIwKElVKTsKLQlJRiAhQ0MgSlVNUCAuTGluZXh0OwotCi0JLyogZXh0cmFjdCBwYWdlIHNpemUgKDE3OjE2KSovCi0JUjMgPSBFWFRSQUNUKFIyLCBSMS5MKSAoWik7Ci0KLQkvKiBhZGQgcGFnZSBzaXplIHRvIGFkZHIgdG8gZ2V0IHJhbmdlICovCi0KLQlQNSA9IFIzOwotCVA1ID0gUDAgKyAoUDUgPDwgMik7CS8qIHNjYWxlZCwgZm9yIGludCBhY2Nlc3MqLwotCVIzID0gW1A1XTsKLQlSMyA9IFIzICsgUjQ7Ci0KLQkvKiBTZWUgaWYgZmFpbGVkIGFkZHJlc3MgPCAoc3RhcnQgYWRkcmVzcyArIHBhZ2Ugc2l6ZSkgKi8KLQlDQyA9IFIwIDwgUjMoSVUpOwotCUlGICFDQyBKVU1QIC5MaW5leHQ7Ci0KLQkvKiBXZSd2ZSBmb3VuZCBhIENQTEIgaW4gdGhlIGNvbmZpZyB0YWJsZSB0aGF0IGNvdmVycwotCSAqIHRoZSBmYXVsdGluZyBhZGRyZXNzLCBzbyBpbnN0YWxsIHRoaXMgQ1BMQiBpbnRvIHRoZQotCSAqIGxhc3QgZW50cnkgb2YgdGhlIHRhYmxlLgotCSAqLwotCi0JUDEuTCA9IExPKElDUExCX0RBVEExNSk7CQkvKiBJQ1BMQl9EQVRBMTUgKi8KLQlQMS5IID0gSEkoSUNQTEJfREFUQTE1KTsKLQlbUDFdID0gUjI7Ci0JW1AxLTB4MTAwXSA9IFI0OwotI2lmZGVmCUNPTkZJR19DUExCX0lORk8KLQlSMyA9IFtQM107Ci0JUjMgKz0gMTsKLQlbUDNdID0gUjM7Ci0jZW5kaWYKLQotCS8qIFA0IHBvaW50cyB0byBJTUVNX0NPTlRST0wsIGFuZCBSNSBjb250YWlucyBpdHMgb2xkCi0JICogdmFsdWUsIGFmdGVyIHdlIGRpc2FibGVkIElDUExCUy4gUmUtZW5hYmxlIHRoZW0uCi0JICovCi0KLQlCSVRTRVQoUjUsRU5JQ1BMQl9QKTsKLQlDTEkgUjI7Ci0JU1NZTkM7CQkvKiBTU1lOQyByZXF1aXJlZCBiZWZvcmUgd3JpdGluZyB0byBJTUVNX0NPTlRST0wuICovCi0JLmFsaWduIDg7Ci0JW1A0XSA9IFI1OwotCVNTWU5DOwotCVNUSSBSMjsKLQotCSggUjc6NCxQNTozICkgPSBbU1ArK107Ci0JUjAgPSBDUExCX1JFTE9BREVEOwotCVJUUzsKLQotLyogRkFJTEVEIENBU0VTKi8KLS5Mbm9fcGFnZV9pbl90YWJsZToKLQlSMCA9IENQTEJfTk9fQUREUl9NQVRDSDsKLQlKVU1QIC5MZmFpbF9yZXQ7Ci0KLS5MYWxsX2xvY2tlZDoKLQlSMCA9IENQTEJfTk9fVU5MT0NLRUQ7Ci0JSlVNUCAuTGZhaWxfcmV0OwotCi0uTHByb3RfdmlvbGF0aW9uOgotCVIwID0gQ1BMQl9QUk9UX1ZJT0w7Ci0KLS5MZmFpbF9yZXQ6Ci0JLyogTWFrZSBzdXJlIHdlIHR1cm4gcHJvdGVjdGlvbi9jYWNoZSBiYWNrIG9uLCBldmVuIGluIHRoZSBmYWlsaW5nIGNhc2UgKi8KLQlCSVRTRVQoUjUsRU5JQ1BMQl9QKTsKLQlDTEkgUjI7Ci0JU1NZTkM7ICAgICAgICAgIC8qIFNTWU5DIHJlcXVpcmVkIGJlZm9yZSB3cml0aW5nIHRvIElNRU1fQ09OVFJPTC4gKi8KLQkuYWxpZ24gODsKLQlbUDRdID0gUjU7Ci0JU1NZTkM7Ci0JU1RJIFIyOwotCi0JKCBSNzo0LFA1OjMgKSA9IFtTUCsrXTsKLQlSVFM7Ci0KLS5MZGNwbGJfd3JpdGU6Ci0KLQkvKiBpZiBhIERDUExCIGlzIG1hcmtlZCBhcyB3cml0ZS1iYWNrIChDUExCX1dUPT0wKSwgYW5kCi0JICogaXQgaXMgY2xlYW4gKENQTEJfRElSVFk9PTApLCB0aGVuIGEgd3JpdGUgdG8gdGhlCi0JICogQ1BMQidzIHBhZ2UgdHJpZ2dlcnMgYSBwcm90ZWN0aW9uIHZpb2xhdGlvbi4gV2UgaGF2ZSB0bwotCSAqIG1hcmsgdGhlIENQTEIgYXMgZGlydHksIHRvIGluZGljYXRlIHRoYXQgdGhlcmUgYXJlCi0JICogcGVuZGluZyB3cml0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBDUExCLgotCSAqLwotCi0JUDQuTCA9IExPKERDUExCX1NUQVRVUyk7Ci0JUDQuSCA9IEhJKERDUExCX1NUQVRVUyk7Ci0JUDMuTCA9IExPKERDUExCX0RBVEEwKTsKLQlQMy5IID0gSEkoRENQTEJfREFUQTApOwotCVI1ID0gW1A0XTsKLQotCS8qIEEgcHJvdGVjdGlvbiB2aW9sYXRpb24gY2FuIGJlIGNhdXNlZCBieSBtb3JlIHRoYW4ganVzdCB3cml0ZXMKLQkgKiB0byBhIGNsZWFuIFdCIHBhZ2UsIHNvIHdlIGhhdmUgdG8gZW5zdXJlIHRoYXQ6Ci0JICogLSBJdCdzIGEgd3JpdGUKLQkgKiAtIHRvIGEgY2xlYW4gV0IgcGFnZQotCSAqIC0gYW5kIGlzIGFsbG93ZWQgaW4gdGhlIG1vZGUgdGhlIGFjY2VzcyBvY2N1cnJlZC4KLQkgKi8KLQotCUNDID0gQklUVFNUKFI1LCAxNik7CS8qIGVuc3VyZSBpdCB3YXMgYSB3cml0ZSovCi0JSUYgIUNDIEpVTVAgLkxwcm90X3Zpb2xhdGlvbjsKLQotCS8qIHRvIGNoZWNrIHRoZSByZXN0LCB3ZSBoYXZlIHRvIHJldHJpZXZlIHRoZSBEQ1BMQi4qLwotCi0JLyogVGhlIGxvdyBoYWxmIG9mIERDUExCX1NUQVRVUyBpcyBhIGJpdCBtYXNrKi8KLQotCVIyID0gUjUuTCAoWik7CS8qIGluZGljYXRpbmcgd2hpY2ggQ1BMQiB0cmlnZ2VyZWQgdGhlIGV2ZW50LiovCi0JUjMgPSAzMDsJLyogc28gd2UgY2FuIHVzZSB0aGlzIHRvIGRldGVybWluZSB0aGUgb2Zmc2V0Ki8KLQlSMi5MID0gU0lHTkJJVFMgUjI7Ci0JUjIgPSBSMi5MIChaKTsJLyogaW50byB0aGUgRENQTEIgdGFibGUuKi8KLQlSMyA9IFIzIC0gUjI7Ci0JUDQgPSBSMzsKLQlQMyA9IFAzICsgKFA0PDwyKTsKLQlSMyA9IFtQM107CS8qIFJldHJpZXZlIHRoZSBDUExCKi8KLQotCS8qIE5vdyB3ZSBjYW4gY2hlY2sgd2hldGhlciBpdCdzIGEgY2xlYW4gV0IgcGFnZSovCi0KLQlDQyA9IEJJVFRTVChSMywgMTQpOwkvKiAwPT1XQiwgMT09V1QqLwotCUlGIENDIEpVTVAgLkxwcm90X3Zpb2xhdGlvbjsKLQlDQyA9IEJJVFRTVChSMywgNyk7CS8qIDAgPT0gY2xlYW4sIDEgPT0gZGlydHkqLwotCUlGIENDIEpVTVAgLkxwcm90X3Zpb2xhdGlvbjsKLQotCS8qIENoZWNrIHdoZXRoZXIgdGhlIHdyaXRlIGlzIGFsbG93ZWQgaW4gdGhlIG1vZGUgdGhhdCB3YXMgYWN0aXZlLiovCi0KLQlSMiA9IDE8PDM7CQkvKiBjaGVja2luZyB3cml0ZSBpbiB1c2VyIG1vZGUqLwotCUNDID0gQklUVFNUKFI1LCAxNyk7CS8qIDA9PXdhcyB1c2VyLCAxPT13YXMgc3VwZXIqLwotCVI1ID0gQ0M7Ci0JUjIgPDw9IFI1OwkJLyogaWYgd2FzIHN1cGVyLCBjaGVjayB3cml0ZSBpbiBzdXBlciBtb2RlKi8KLQlSMiA9IFIzICYgUjI7Ci0JQ0MgPSBSMiA9PSAwOwotCUlGIENDIEpVTVAgLkxwcm90X3Zpb2xhdGlvbjsKLQotCS8qIEl0J3MgYSBnZW51aW5lIHdyaXRlLXRvLWNsZWFuLXBhZ2UuKi8KLQotCUJJVFNFVChSMywgNyk7CQkvKiBtYXJrIGFzIGRpcnR5Ki8KLQlbUDNdID0gUjM7CQkvKiBhbmQgd3JpdGUgYmFjay4qLwotCU5PUDsKLQlDU1lOQzsKLQkoIFI3OjQsUDU6MyApID0gW1NQKytdOwotCVIwID0gQ1BMQl9SRUxPQURFRDsKLQlSVFM7Ci0KLS5MZGNwbGJfbWlzc19jb21wYXJlOgotCi0JLyogRGF0YSBDUExCIE1pc3MgZXZlbnQuIFdlIG5lZWQgdG8gY2hvb3NlIGEgQ1BMQiB0bwotCSAqIGV2aWN0LCBhbmQgdGhlbiBsb2NhdGUgYSBuZXcgQ1BMQiB0byBpbnN0YWxsIGZyb20gdGhlCi0JICogY29uZmlnIHRhYmxlLCB0aGF0IGNvdmVycyB0aGUgZmF1bHRpbmcgYWRkcmVzcy4KLQkgKi8KLQotCVAxLkwgPSBMTyhEQ1BMQl9EQVRBMTUpOwotCVAxLkggPSBISShEQ1BMQl9EQVRBMTUpOwotCi0JUDQuTCA9IExPKERDUExCX0ZBVUxUX0FERFIpOwotCVA0LkggPSBISShEQ1BMQl9GQVVMVF9BRERSKTsKLQlSNCA9IFtQNF07Ci0JSTAgPSBSNDsKLQotCS8qIFRoZSByZXBsYWNlbWVudCBwcm9jZWR1cmUgZm9yIERDUExCcyovCi0KLQlSNiA9IFIxOwkvKiBTYXZlIGZvciBsYXRlciovCi0KLQkvKiBUdXJuIG9mZiBDUExCcyB3aGlsZSB3ZSB3b3JrLiovCi0JUDQuTCA9IExPKERNRU1fQ09OVFJPTCk7Ci0JUDQuSCA9IEhJKERNRU1fQ09OVFJPTCk7Ci0JUjUgPSBbUDRdOwotCUJJVENMUihSNSxFTkRDUExCX1ApOwotCUNMSSBSMDsKLQlTU1lOQzsJCS8qIFNTWU5DIHJlcXVpcmVkIGJlZm9yZSB3cml0aW5nIHRvIERNRU1fQ09OVFJPTC4gKi8KLQkuYWxpZ24gODsKLQlbUDRdID0gUjU7Ci0JU1NZTkM7Ci0JU1RJIFIwOwotCi0JLyogU3RhcnQgbG9va2luZyBmb3IgYSBDUExCIHRvIGV2aWN0LiBPdXIgb3JkZXIgb2YgcHJlZmVyZW5jZQotCSAqIGlzOiBpbnZhbGlkIENQTEJzLCBjbGVhbiBDUExCcywgZGlydHkgQ1BMQnMuIExvY2tlZCBDUExCcwotCSAqIGFyZSBubyBnb29kLgotCSAqLwotCi0JSTEuTCA9IExPKERDUExCX0RBVEEwKTsKLQlJMS5IID0gSEkoRENQTEJfREFUQTApOwotCVAxID0gMjsKLQlQMiA9IDE2OwotCUkyLkwgPSBfZGNwbGJfcHJlZmVyZW5jZTsKLQlJMi5IID0gX2RjcGxiX3ByZWZlcmVuY2U7Ci0JTFNFVFVQKC5Mc2RzZWFyY2gxLCAuTGVkc2VhcmNoMSkgTEMwID0gUDE7Ci0uTHNkc2VhcmNoMToKLQlSMCA9IFtJMisrXTsJCS8qIEdldCB0aGUgYml0cyB3ZSdyZSBpbnRlcmVzdGVkIGluKi8KLQlQMCA9IEkxOwkJLyogR28gYmFjayB0byBzdGFydCBvZiB0YWJsZSovCi0JTFNFVFVQICguTHNkc2VhcmNoMiwgLkxlZHNlYXJjaDIpIExDMSA9IFAyOwotLkxzZHNlYXJjaDI6Ci0JUjEgPSBbUDArK107CQkvKiBGZXRjaCBlYWNoIGluc3RhbGxlZCBDUExCIGluIHR1cm4qLwotCVIyID0gUjEgJiBSMDsJCS8qIGFuZCB0ZXN0IGZvciBpbnRlcmVzdGluZyBiaXRzLiovCi0JQ0MgPSBSMiA9PSAwOwkJLyogSWYgbm9uZSBhcmUgc2V0LCBpdCdsbCBkby4qLwotCUlGICFDQyBKVU1QIC5Mc2tpcF9zdGFja19jaGVjazsKLQotCVIyID0gW1AwIC0gMHgxMDRdOyAJLyogUjIgLSBQYWdlU3RhcnQgKi8KLQlQMy5MID0gX3BhZ2Vfc2l6ZV90YWJsZTsgLyogcmV0cmlldmUgZW5kIGFkZHJlc3MgKi8KLQlQMy5IID0gX3BhZ2Vfc2l6ZV90YWJsZTsgLyogcmV0cmlldmUgZW5kIGFkZHJlc3MgKi8KLQlSMyA9IDB4MTAwMjsJCS8qIDE2dGggLSBwb3NpdGlvbiwgMiBiaXRzIC1sZW5ndGggKi8KLSNpZiBBTk9NQUxZXzA1MDAwMjA5Ci0Jbm9wOwkJCS8qIEFub21hbHkgMDUwMDAyMDkgKi8KLSNlbmRpZgotCVI3ID0gRVhUUkFDVChSMSxSMy5sKTsKLQlSNyA9IFI3IDw8IDI7CQkvKiBQYWdlIHNpemUgaW5kZXggb2Zmc2V0ICovCi0JUDUgPSBSNzsKLQlQMyA9IFAzICsgUDU7Ci0JUjcgPSBbUDNdOwkJLyogcGFnZSBzaXplIGluIGJ5dGVzICovCi0KLQlSNyA9IFIyICsgUjc7CQkvKiBSNyAtIFBhZ2VFbmQgKi8KLQlSNCA9IFNQOyAJCS8qIFRlc3QgU1AgaXMgaW4gcmFuZ2UgKi8KLQotCUNDID0gUjcgPCBSNDsJCS8qIGlmIFBhZ2VFbmQgPCBTUCAqLwotCUlGIENDIEpVTVAgLkxkZm91bmRfdmljdGltOwotCVIzID0gMHgyODQ7CQkvKiBzdGFjayBsZW5ndGggZnJvbSBzdGFydCBvZiB0cmFwIHRpbGwKLQkJCQkgKiB0aGUgcG9pbnQuCi0JCQkJICogMjAgc3RhY2sgbG9jYXRpb25zIGZvciBmdXR1cmUgbW9kaWZpY2F0aW9ucwotCQkJCSAqLwotCVI0ID0gUjQgKyBSMzsKLQlDQyA9IFI0IDwgUjI7CQkvKiBpZiBTUCArIHN0YWNrbGVuIDwgUGFnZVN0YXJ0ICovCi0JSUYgQ0MgSlVNUCAuTGRmb3VuZF92aWN0aW07Ci0uTHNraXBfc3RhY2tfY2hlY2s6Ci0KLS5MZWRzZWFyY2gyOiBOT1A7Ci0uTGVkc2VhcmNoMTogTk9QOwotCi0JLyogSWYgd2UgZ290IGhlcmUsIHdlIGRpZG4ndCBmaW5kIGEgRENQTEIgd2UgY29uc2lkZXJlZAotCSAqIHJlcGxhY2FibGUsIHdoaWNoIG1lYW5zIGFsbCBvZiB0aGVtIHdlcmUgbG9ja2VkLgotCSAqLwotCi0JSlVNUCAuTGFsbF9sb2NrZWQ7Ci0uTGRmb3VuZF92aWN0aW06Ci0KLSNpZmRlZiBDT05GSUdfQ1BMQl9JTkZPCi0JUjcgPSBbUDAgLSAweDEwNF07Ci0JUDIuTCA9IF9kcGR0X3RhYmxlOwotCVAyLkggPSBfZHBkdF90YWJsZTsKLQlQMy5MID0gX2RwZHRfc3dhcGNvdW50X3RhYmxlOwotCVAzLkggPSBfZHBkdF9zd2FwY291bnRfdGFibGU7Ci0JUDMgKz0gLTQ7Ci0uTGRpY291bnQ6Ci0JUjIgPSBbUDJdOwotCVAyICs9IDg7Ci0JUDMgKz0gODsKLQlDQyA9IFIyPT0tMTsKLQlJRiBDQyBKVU1QIC5MZGljb3VudF9kb25lOwotCUNDID0gUjc9PVIyOwotCUlGICFDQyBKVU1QIC5MZGljb3VudDsKLQlSNyA9IFtQM107Ci0JUjcgKz0gMTsKLQlbUDNdID0gUjc7Ci0uTGRpY291bnRfZG9uZToKLSNlbmRpZgotCi0JLyogQ2xlYW4gZG93biB0aGUgaGFyZHdhcmUgbG9vcHMqLwotCVIyID0gMDsKLQlMQzEgPSBSMjsKLQlMQzAgPSBSMjsKLQotCS8qIFRoZXJlJ3MgYSBzdWl0YWJsZSB2aWN0aW0gaW4gW1AwLTRdIChiZWNhdXNlIHdlJ3ZlCi0JICogYWR2YW5jZWQgYWxyZWFkeSkuCi0JICovCi0KLS5MRGRvdmVyd3JpdGU6Ci0KLQkvKiBbUDAtNF0gaXMgYSBzdWl0YWJsZSB2aWN0aW0gQ1BMQiwgc28gd2Ugd2FudCB0bwotCSAqIG92ZXJ3cml0ZSBpdCBieSBtb3ZpbmcgYWxsIHRoZSBmb2xsb3dpbmcgQ1BMQnMKLQkgKiBvbmUgc3BhY2UgY2xvc2VyIHRvIHRoZSBzdGFydC4KLQkgKi8KLQotCVIxLkwgPSBMTyhEQ1BMQl9EQVRBMTYpOwkJLyogRENQTEJfREFUQTE1ICsgNCAqLwotCVIxLkggPSBISShEQ1BMQl9EQVRBMTYpOwotCVIwID0gUDA7Ci0KLQkvKiBJZiB0aGUgdmljdGltIGhhcHBlbnMgdG8gYmUgaW4gRENQTEIxNSwKLQkgKiB3ZSBkb24ndCBuZWVkIHRvIG1vdmUgYW55dGhpbmcuCi0JICovCi0KLQlDQyA9IFIxID09IFIwOwotCUlGIENDIEpVTVAgLkxkZV9tb3ZlZDsKLQlSMSA9IFIxIC0gUjA7Ci0JUjEgPj49IDI7Ci0JUDEgPSBSMTsKLQlMU0VUVVAoLkxkc19tb3ZlLCAuTGRlX21vdmUpIExDMD1QMTsKLS5MZHNfbW92ZToKLQlSMCA9IFtQMCsrXTsJLyogbW92ZSBkYXRhICovCi0JW1AwIC0gOF0gPSBSMDsKLQlSMCA9IFtQMC0weDEwNF0JLyogbW92ZSBhZGRyZXNzICovCi0uTGRlX21vdmU6Ci0JIFtQMC0weDEwOF0gPSBSMDsKLQotLkxkZV9tb3ZlZDoKLQlOT1A7Ci0KLQkvKiBDbGVhciBEQ1BMQl9EQVRBMTUsIGluIGNhc2Ugd2UgZG9uJ3QgZmluZCBhIHJlcGxhY2VtZW50Ci0JICogb3RoZXJ3aXNlLCB3ZSB3b3VsZCBoYXZlIGEgZHVwbGljYXRlIGVudHJ5LCBhbmQgd2lsbCBjcmFzaAotCSAqLwotCVIwID0gMDsKLQlbUDAgLSAweDRdID0gUjA7Ci0KLQkvKiBXZSd2ZSBub3cgbWFkZSBzcGFjZSBpbiBEQ1BMQjE1IGZvciB0aGUgbmV3IENQTEIgdG8gYmUKLQkgKiBpbnN0YWxsZWQuIFRoZSBuZXh0IHN0YWdlIGlzIHRvIGxvY2F0ZSBhIENQTEIgaW4gdGhlCi0JICogY29uZmlnIHRhYmxlIHRoYXQgY292ZXJzIHRoZSBmYXVsdGluZyBhZGRyZXNzLgotCSAqLwotCi0JUjAgPSBJMDsJCS8qIE91ciBmYXVsdGluZyBhZGRyZXNzICovCi0KLQlQMi5MID0gX2RwZHRfdGFibGU7Ci0JUDIuSCA9IF9kcGR0X3RhYmxlOwotI2lmZGVmCUNPTkZJR19DUExCX0lORk8KLQlQMy5MID0gX2RwZHRfc3dhcGNvdW50X3RhYmxlOwotCVAzLkggPSBfZHBkdF9zd2FwY291bnRfdGFibGU7Ci0JUDMgKz0gLTg7Ci0jZW5kaWYKLQotCVAxLkwgPSBfcGFnZV9zaXplX3RhYmxlOwotCVAxLkggPSBfcGFnZV9zaXplX3RhYmxlOwotCi0JLyogQW4gZXh0cmFjdGlvbiBwYXR0ZXJuLCB0byByZXRyaWV2ZSBiaXRzIDE3OjE2LiovCi0KLQlSMSA9ICgxNjw8OCl8MjsKLS5MZG5leHQ6CVI0ID0gW1AyKytdOwkvKiBhZGRyZXNzICovCi0JUjIgPSBbUDIrK107CS8qIGRhdGEgKi8KLSNpZmRlZglDT05GSUdfQ1BMQl9JTkZPCi0JUDMgKz0gODsKLSNlbmRpZgotCi0JQ0MgPSBSNCA9PSAtMTsKLQlJRiBDQyBKVU1QIC5Mbm9fcGFnZV9pbl90YWJsZTsKLQotCS8qIFNlZSBpZiBmYWlsZWQgYWRkcmVzcyA+IHN0YXJ0IGFkZHJlc3MgKi8KLQlDQyA9IFI0IDw9IFIwKElVKTsKLQlJRiAhQ0MgSlVNUCAuTGRuZXh0OwotCi0JLyogZXh0cmFjdCBwYWdlIHNpemUgKDE3OjE2KSovCi0JUjMgPSBFWFRSQUNUKFIyLCBSMS5MKSAoWik7Ci0KLQkvKiBhZGQgcGFnZSBzaXplIHRvIGFkZHIgdG8gZ2V0IHJhbmdlICovCi0KLQlQNSA9IFIzOwotCVA1ID0gUDEgKyAoUDUgPDwgMik7Ci0JUjMgPSBbUDVdOwotCVIzID0gUjMgKyBSNDsKLQotCS8qIFNlZSBpZiBmYWlsZWQgYWRkcmVzcyA8IChzdGFydCBhZGRyZXNzICsgcGFnZSBzaXplKSAqLwotCUNDID0gUjAgPCBSMyhJVSk7Ci0JSUYgIUNDIEpVTVAgLkxkbmV4dDsKLQotCS8qIFdlJ3ZlIGZvdW5kIHRoZSBDUExCIHRoYXQgc2hvdWxkIGJlIGluc3RhbGxlZCwgc28KLQkgKiB3cml0ZSBpdCBpbnRvIENQTEIxNSwgbWFza2luZyBvZmYgYW55IGNhY2hpbmcgYml0cwotCSAqIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQotCVAxLkwgPSBMTyhEQ1BMQl9EQVRBMTUpOwotCVAxLkggPSBISShEQ1BMQl9EQVRBMTUpOwotCi0JLyogSWYgdGhlIERDUExCIGhhcyBjYWNoZSBiaXRzIHNldCwgYnV0IGNhY2hpbmcgaGFzbid0Ci0JICogYmVlbiBlbmFibGVkLCB0aGVuIHdlIHdhbnQgdG8gbWFzayBvZmYgdGhlIGNhY2hlLWluLUwxCi0JICogYml0IGJlZm9yZSBpbnN0YWxsaW5nLiBNb3Jlb3ZlciwgaWYgY2FjaGluZyBpcyBvZmYsIHdlCi0JICogYWxzbyB3YW50IHRvIGVuc3VyZSB0aGF0IHRoZSBEQ1BMQiBoYXMgV1QgbW9kZSBzZXQsIHJhdGhlcgotCSAqIHRoYW4gV0IsIHNpbmNlIFdCIHBhZ2VzIHN0aWxsIHRyaWdnZXIgZmlyc3Qtd3JpdGUgZXhjZXB0aW9ucwotCSAqIGV2ZW4gd2hlbiBub3QgY2FjaGluZyBpcyBvZmYsIGFuZCB0aGUgcGFnZSBpc24ndCBtYXJrZWQgYXMKLQkgKiBjYWNoYWJsZS4gRmluYWxseSwgd2UgY291bGQgbWFyayB0aGUgcGFnZSBhcyBjbGVhbiwgbm90IGRpcnR5LAotCSAqIGJ1dCB3ZSBjaG9vc2UgdG8gbGVhdmUgdGhhdCBkZWNpc2lvbiB0byB0aGUgdXNlcjsgaWYgdGhlIHVzZXIKLQkgKiBjaG9vc2VzIHRvIGhhdmUgYSBDUExCIHByZS1kZWZpbmVkIGFzIGRpcnR5LCB0aGVuIHRoZXkgYWx3YXlzCi0JICogcGF5IHRoZSBjb3N0IG9mIGZsdXNoaW5nIGR1cmluZyBldmljdGlvbiwgYnV0IGRvbid0IHBheSB0aGUKLQkgKiBjb3N0IG9mIGZpcnN0LXdyaXRlIGV4Y2VwdGlvbnMgdG8gbWFyayB0aGUgcGFnZSBhcyBkaXJ0eS4KLQkgKi8KLQotI2lmZGVmIENPTkZJR19CRklOX1dUCi0JQklUU0VUKFI2LCAxNCk7CQkvKiBTZXQgV1QqLwotI2VuZGlmCi0KLQlbUDFdID0gUjI7Ci0JW1AxLTB4MTAwXSA9IFI0OwotI2lmZGVmCUNPTkZJR19DUExCX0lORk8KLQlSMyA9IFtQM107Ci0JUjMgKz0gMTsKLQlbUDNdID0gUjM7Ci0jZW5kaWYKLQotCS8qIFdlJ3ZlIGluc3RhbGxlZCB0aGUgQ1BMQiwgc28gcmUtZW5hYmxlIENQTEJzLiBQNAotCSAqIHBvaW50cyB0byBETUVNX0NPTlRST0wsIGFuZCBSNSBpcyB0aGUgdmFsdWUgd2UKLQkgKiBsYXN0IHdyb3RlIHRvIGl0LCB3aGVuIHdlIHdlcmUgZGlzYWJsaW5nIENQTEJzLgotCSAqLwotCi0JQklUU0VUKFI1LEVORENQTEJfUCk7Ci0JQ0xJIFIyOwotCS5hbGlnbiA4OwotCVtQNF0gPSBSNTsKLQlTU1lOQzsKLQlTVEkgUjI7Ci0KLQkoIFI3OjQsUDU6MyApID0gW1NQKytdOwotCVIwID0gQ1BMQl9SRUxPQURFRDsKLQlSVFM7Ci1FTkRQUk9DKF9jcGxiX21ncikKLQotLmRhdGEKLS5hbGlnbiA0OwotX3BhZ2Vfc2l6ZV90YWJsZToKLS5ieXRlNAkweDAwMDAwNDAwOwkvKiAxSyAqLwotLmJ5dGU0CTB4MDAwMDEwMDA7CS8qIDRLICovCi0uYnl0ZTQJMHgwMDEwMDAwMDsJLyogMU0gKi8KLS5ieXRlNAkweDAwNDAwMDAwOwkvKiA0TSAqLwotCi0uYWxpZ24gNDsKLV9kY3BsYl9wcmVmZXJlbmNlOgotLmJ5dGU0CTB4MDAwMDAwMDE7CS8qIHZhbGlkIGJpdCAqLwotLmJ5dGU0CTB4MDAwMDAwMDI7CS8qIGxvY2sgYml0ICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW5vbXB1L2NwbGJtZ3IuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbm9tcHUvY3BsYm1nci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NjI0OWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW5vbXB1L2NwbGJtZ3IuYwpAQCAtMCwwICsxLDI4MyBAQAorLyoKKyAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1ub21wdS1jL2NwbGJtZ3IuYworICogQmFzZWQgb246ICAgICBhcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW1wdS9jcGxibWdyLmMKKyAqIEF1dGhvcjogICAgICAgTWljaGFlbCBNY1Rlcm5hbiA8bW1jdGVybmFuQGFpcnZhbmEuY29tPgorICoKKyAqIENyZWF0ZWQ6ICAgICAgMDFOb3YyMDA4CisgKiBEZXNjcmlwdGlvbjogIENQTEIgbWlzcyBoYW5kbGVyLgorICoKKyAqIE1vZGlmaWVkOgorICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwOCBBaXJ2YW5hIEluYy4KKyAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNyBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgorI2luY2x1ZGUgPGFzbS9jcGxiaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9jcGxiLmg+CisjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CisKKy8qCisgKiBXQVJOSU5HCisgKgorICogVGhpcyBmaWxlIGlzIGNvbXBpbGVkIHdpdGggY2VydGFpbiAtZmZpeGVkLXJlZyBvcHRpb25zLiAgV2UgaGF2ZSB0bworICogbWFrZSBzdXJlIG5vdCB0byBjYWxsIGFueSBmdW5jdGlvbnMgaGVyZSB0aGF0IGNvdWxkIGNsb2JiZXIgdGhlc2UKKyAqIHJlZ2lzdGVycy4KKyAqLworCitpbnQgbnJfZGNwbGJfbWlzc1tOUl9DUFVTXSwgbnJfaWNwbGJfbWlzc1tOUl9DUFVTXTsKK2ludCBucl9kY3BsYl9zdXB2X21pc3NbTlJfQ1BVU10sIG5yX2ljcGxiX3N1cHZfbWlzc1tOUl9DUFVTXTsKK2ludCBucl9jcGxiX2ZsdXNoW05SX0NQVVNdLCBucl9kY3BsYl9wcm90W05SX0NQVVNdOworCisjaWZkZWYgQ09ORklHX0VYQ1BUX0lSUV9TWVNDX0wxCisjZGVmaW5lIE1HUl9BVFRSIF9fYXR0cmlidXRlX18oKGwxX3RleHQpKQorI2Vsc2UKKyNkZWZpbmUgTUdSX0FUVFIKKyNlbmRpZgorCisvKgorICogV2UncmUgaW4gYW4gZXhjZXB0aW9uIGhhbmRsZXIuICBUaGUgbm9ybWFsIGNsaSBub3Agbm9wIHdvcmthcm91bmQKKyAqIGlzbid0IGdvaW5nIHRvIGRvIHZlcnkgbXVjaCwgYXMgdGhlIG9ubHkgdGhpbmcgdGhhdCBjYW4gaW50ZXJydXB0CisgKiB1cyBpcyBhbiBOTUksIGFuZCB0aGUgY2xpIGlzbid0IGdvaW5nIHRvIHN0b3AgdGhhdC4KKyAqLworI2RlZmluZSBOT1dBX1NTWU5DIF9fYXNtX18gX192b2xhdGlsZV9fICgic3N5bmM7IikKKworLyogQW5vbWFseSBoYW5kbGVycyBwcm92aWRlIFNTWU5Dcywgc28gYXZvaWQgZXh0cmEgaWYgYW5vbWFseSBpcyBwcmVzZW50ICovCisjaWYgQU5PTUFMWV8wNTAwMDEyNQorCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1FTV9DT05UUk9MX1NTWU5DKHYpICAgIGJmaW5fd3JpdGVfRE1FTV9DT05UUk9MKHYpCisjZGVmaW5lIGJmaW5fd3JpdGVfSU1FTV9DT05UUk9MX1NTWU5DKHYpICAgIGJmaW5fd3JpdGVfSU1FTV9DT05UUk9MKHYpCisKKyNlbHNlCisKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUVNX0NPTlRST0xfU1NZTkModikgXAorICAgIGRvIHsgTk9XQV9TU1lOQzsgYmZpbl93cml0ZV9ETUVNX0NPTlRST0wodik7IE5PV0FfU1NZTkM7IH0gd2hpbGUgKDApCisjZGVmaW5lIGJmaW5fd3JpdGVfSU1FTV9DT05UUk9MX1NTWU5DKHYpIFwKKyAgICBkbyB7IE5PV0FfU1NZTkM7IGJmaW5fd3JpdGVfSU1FTV9DT05UUk9MKHYpOyBOT1dBX1NTWU5DOyB9IHdoaWxlICgwKQorCisjZW5kaWYKKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX2RjcGxiX2RhdGEoaW50IGNwdSwgaW50IGlkeCwgdW5zaWduZWQgbG9uZyBkYXRhLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJdW5zaWduZWQgbG9uZyBjdHJsID0gYmZpbl9yZWFkX0RNRU1fQ09OVFJPTCgpOworCWJmaW5fd3JpdGVfRE1FTV9DT05UUk9MX1NTWU5DKGN0cmwgJiB+RU5EQ1BMQik7CisJYmZpbl93cml0ZTMyKERDUExCX0RBVEEwICsgaWR4ICogNCwgZGF0YSk7CisJYmZpbl93cml0ZTMyKERDUExCX0FERFIwICsgaWR4ICogNCwgYWRkcik7CisJYmZpbl93cml0ZV9ETUVNX0NPTlRST0xfU1NZTkMoY3RybCk7CisKKyNpZmRlZiBDT05GSUdfQ1BMQl9JTkZPCisJZGNwbGJfdGJsW2NwdV1baWR4XS5hZGRyID0gYWRkcjsKKwlkY3BsYl90YmxbY3B1XVtpZHhdLmRhdGEgPSBkYXRhOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9pY3BsYl9kYXRhKGludCBjcHUsIGludCBpZHgsIHVuc2lnbmVkIGxvbmcgZGF0YSwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyKQoreworCXVuc2lnbmVkIGxvbmcgY3RybCA9IGJmaW5fcmVhZF9JTUVNX0NPTlRST0woKTsKKworCWJmaW5fd3JpdGVfSU1FTV9DT05UUk9MX1NTWU5DKGN0cmwgJiB+RU5JQ1BMQik7CisJYmZpbl93cml0ZTMyKElDUExCX0RBVEEwICsgaWR4ICogNCwgZGF0YSk7CisJYmZpbl93cml0ZTMyKElDUExCX0FERFIwICsgaWR4ICogNCwgYWRkcik7CisJYmZpbl93cml0ZV9JTUVNX0NPTlRST0xfU1NZTkMoY3RybCk7CisKKyNpZmRlZiBDT05GSUdfQ1BMQl9JTkZPCisJaWNwbGJfdGJsW2NwdV1baWR4XS5hZGRyID0gYWRkcjsKKwlpY3BsYl90YmxbY3B1XVtpZHhdLmRhdGEgPSBkYXRhOworI2VuZGlmCit9CisKKy8qCisgKiBHaXZlbiB0aGUgY29udGVudHMgb2YgdGhlIHN0YXR1cyByZWdpc3RlciwgcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUKKyAqIENQTEIgdGhhdCBjYXVzZWQgdGhlIGZhdWx0LgorICovCitzdGF0aWMgaW5saW5lIGludCBmYXVsdGluZ19jcGxiX2luZGV4KGludCBzdGF0dXMpCit7CisJaW50IHNpZ25iaXRzID0gX19idWlsdGluX2JmaW5fbm9ybV9mcjF4MzIoc3RhdHVzICYgMHhGRkZGKTsKKwlyZXR1cm4gMzAgLSBzaWduYml0czsKK30KKworLyoKKyAqIEdpdmVuIHRoZSBjb250ZW50cyBvZiB0aGUgc3RhdHVzIHJlZ2lzdGVyIGFuZCB0aGUgRENQTEJfREFUQSBjb250ZW50cywKKyAqIHJldHVybiB0cnVlIGlmIGEgd3JpdGUgYWNjZXNzIHNob3VsZCBiZSBwZXJtaXR0ZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHdyaXRlX3Blcm1pdHRlZChpbnQgc3RhdHVzLCB1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJaWYgKHN0YXR1cyAmIEZBVUxUX1VTRVJTVVBWKQorCQlyZXR1cm4gISEoZGF0YSAmIENQTEJfU1VQVl9XUik7CisJZWxzZQorCQlyZXR1cm4gISEoZGF0YSAmIENQTEJfVVNFUl9XUik7Cit9CisKKy8qIENvdW50ZXJzIHRvIGltcGxlbWVudCByb3VuZC1yb2JpbiByZXBsYWNlbWVudC4gICovCitzdGF0aWMgaW50IGljcGxiX3JyX2luZGV4W05SX0NQVVNdIFBEVF9BVFRSOworc3RhdGljIGludCBkY3BsYl9ycl9pbmRleFtOUl9DUFVTXSBQRFRfQVRUUjsKKworLyoKKyAqIEZpbmQgYW4gSUNQTEIgZW50cnkgdG8gYmUgZXZpY3RlZCBhbmQgcmV0dXJuIGl0cyBpbmRleC4KKyAqLworc3RhdGljIGludCBldmljdF9vbmVfaWNwbGIoaW50IGNwdSkKK3sKKwlpbnQgaSA9IGZpcnN0X3N3aXRjaGVkX2ljcGxiICsgaWNwbGJfcnJfaW5kZXhbY3B1XTsKKwlpZiAoaSA+PSBNQVhfQ1BMQlMpIHsKKwkJaSAtPSBNQVhfQ1BMQlMgLSBmaXJzdF9zd2l0Y2hlZF9pY3BsYjsKKwkJaWNwbGJfcnJfaW5kZXhbY3B1XSAtPSBNQVhfQ1BMQlMgLSBmaXJzdF9zd2l0Y2hlZF9pY3BsYjsKKwl9CisJaWNwbGJfcnJfaW5kZXhbY3B1XSsrOworCXJldHVybiBpOworfQorCitzdGF0aWMgaW50IGV2aWN0X29uZV9kY3BsYihpbnQgY3B1KQoreworCWludCBpID0gZmlyc3Rfc3dpdGNoZWRfZGNwbGIgKyBkY3BsYl9ycl9pbmRleFtjcHVdOworCWlmIChpID49IE1BWF9DUExCUykgeworCQlpIC09IE1BWF9DUExCUyAtIGZpcnN0X3N3aXRjaGVkX2RjcGxiOworCQlkY3BsYl9ycl9pbmRleFtjcHVdIC09IE1BWF9DUExCUyAtIGZpcnN0X3N3aXRjaGVkX2RjcGxiOworCX0KKwlkY3BsYl9ycl9pbmRleFtjcHVdKys7CisJcmV0dXJuIGk7Cit9CisKK01HUl9BVFRSIHN0YXRpYyBpbnQgaWNwbGJfbWlzcyhpbnQgY3B1KQoreworCXVuc2lnbmVkIGxvbmcgYWRkciA9IGJmaW5fcmVhZF9JQ1BMQl9GQVVMVF9BRERSKCk7CisJaW50IHN0YXR1cyA9IGJmaW5fcmVhZF9JQ1BMQl9TVEFUVVMoKTsKKwlpbnQgaWR4OworCXVuc2lnbmVkIGxvbmcgaV9kYXRhLCBiYXNlLCBhZGRyMSwgZWFkZHI7CisKKwlucl9pY3BsYl9taXNzW2NwdV0rKzsKKwlpZiAodW5saWtlbHkoc3RhdHVzICYgRkFVTFRfVVNFUlNVUFYpKQorCQlucl9pY3BsYl9zdXB2X21pc3NbY3B1XSsrOworCisJYmFzZSA9IDA7CisJZm9yIChpZHggPSAwOyBpZHggPCBpY3BsYl9ucl9ib3VuZHM7IGlkeCsrKSB7CisJCWVhZGRyID0gaWNwbGJfYm91bmRzW2lkeF0uZWFkZHI7CisJCWlmIChhZGRyIDwgZWFkZHIpCisJCQlicmVhazsKKwkJYmFzZSA9IGVhZGRyOworCX0KKwlpZiAodW5saWtlbHkoaWR4ID09IGljcGxiX25yX2JvdW5kcykpCisJCXJldHVybiBDUExCX05PX0FERFJfTUFUQ0g7CisKKwlpX2RhdGEgPSBpY3BsYl9ib3VuZHNbaWR4XS5kYXRhOworCWlmICh1bmxpa2VseShpX2RhdGEgPT0gMCkpCisJCXJldHVybiBDUExCX05PX0FERFJfTUFUQ0g7CisKKwlhZGRyMSA9IGFkZHIgJiB+KFNJWkVfNE0gLSAxKTsKKwlhZGRyICY9IH4oU0laRV8xTSAtIDEpOworCWlfZGF0YSB8PSBQQUdFX1NJWkVfMU1COworCWlmIChhZGRyMSA+PSBiYXNlICYmIChhZGRyMSArIFNJWkVfNE0pIDw9IGVhZGRyKSB7CisJCS8qCisJCSAqIFRoaXMgd29ya3MgYmVjYXVzZQorCQkgKiAoUEFHRV9TSVpFXzRNQiAmIFBBR0VfU0laRV8xTUIpID09IFBBR0VfU0laRV8xTUIuCisJCSAqLworCQlpX2RhdGEgfD0gUEFHRV9TSVpFXzRNQjsKKwkJYWRkciA9IGFkZHIxOworCX0KKworCS8qIFBpY2sgZW50cnkgdG8gZXZpY3QgKi8KKwlpZHggPSBldmljdF9vbmVfaWNwbGIoY3B1KTsKKworCXdyaXRlX2ljcGxiX2RhdGEoY3B1LCBpZHgsIGlfZGF0YSwgYWRkcik7CisKKwlyZXR1cm4gQ1BMQl9SRUxPQURFRDsKK30KKworTUdSX0FUVFIgc3RhdGljIGludCBkY3BsYl9taXNzKGludCBjcHUpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gYmZpbl9yZWFkX0RDUExCX0ZBVUxUX0FERFIoKTsKKwlpbnQgc3RhdHVzID0gYmZpbl9yZWFkX0RDUExCX1NUQVRVUygpOworCWludCBpZHg7CisJdW5zaWduZWQgbG9uZyBkX2RhdGEsIGJhc2UsIGFkZHIxLCBlYWRkcjsKKworCW5yX2RjcGxiX21pc3NbY3B1XSsrOworCWlmICh1bmxpa2VseShzdGF0dXMgJiBGQVVMVF9VU0VSU1VQVikpCisJCW5yX2RjcGxiX3N1cHZfbWlzc1tjcHVdKys7CisKKwliYXNlID0gMDsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IGRjcGxiX25yX2JvdW5kczsgaWR4KyspIHsKKwkJZWFkZHIgPSBkY3BsYl9ib3VuZHNbaWR4XS5lYWRkcjsKKwkJaWYgKGFkZHIgPCBlYWRkcikKKwkJCWJyZWFrOworCQliYXNlID0gZWFkZHI7CisJfQorCWlmICh1bmxpa2VseShpZHggPT0gZGNwbGJfbnJfYm91bmRzKSkKKwkJcmV0dXJuIENQTEJfTk9fQUREUl9NQVRDSDsKKworCWRfZGF0YSA9IGRjcGxiX2JvdW5kc1tpZHhdLmRhdGE7CisJaWYgKHVubGlrZWx5KGRfZGF0YSA9PSAwKSkKKwkJcmV0dXJuIENQTEJfTk9fQUREUl9NQVRDSDsKKworCWFkZHIxID0gYWRkciAmIH4oU0laRV80TSAtIDEpOworCWFkZHIgJj0gfihTSVpFXzFNIC0gMSk7CisJZF9kYXRhIHw9IFBBR0VfU0laRV8xTUI7CisJaWYgKGFkZHIxID49IGJhc2UgJiYgKGFkZHIxICsgU0laRV80TSkgPD0gZWFkZHIpIHsKKwkJLyoKKwkJICogVGhpcyB3b3JrcyBiZWNhdXNlCisJCSAqIChQQUdFX1NJWkVfNE1CICYgUEFHRV9TSVpFXzFNQikgPT0gUEFHRV9TSVpFXzFNQi4KKwkJICovCisJCWRfZGF0YSB8PSBQQUdFX1NJWkVfNE1COworCQlhZGRyID0gYWRkcjE7CisJfQorCisJLyogUGljayBlbnRyeSB0byBldmljdCAqLworCWlkeCA9IGV2aWN0X29uZV9kY3BsYihjcHUpOworCisJd3JpdGVfZGNwbGJfZGF0YShjcHUsIGlkeCwgZF9kYXRhLCBhZGRyKTsKKworCXJldHVybiBDUExCX1JFTE9BREVEOworfQorCitNR1JfQVRUUiBzdGF0aWMgbm9pbmxpbmUgaW50IGRjcGxiX3Byb3RlY3Rpb25fZmF1bHQoaW50IGNwdSkKK3sKKwlpbnQgc3RhdHVzID0gYmZpbl9yZWFkX0RDUExCX1NUQVRVUygpOworCisJbnJfZGNwbGJfcHJvdFtjcHVdKys7CisKKwlpZiAobGlrZWx5KHN0YXR1cyAmIEZBVUxUX1JXKSkgeworCQlpbnQgaWR4ID0gZmF1bHRpbmdfY3BsYl9pbmRleChzdGF0dXMpOworCQl1bnNpZ25lZCBsb25nIHJlZ2FkZHIgPSBEQ1BMQl9EQVRBMCArIGlkeCAqIDQ7CisJCXVuc2lnbmVkIGxvbmcgZGF0YSA9IGJmaW5fcmVhZDMyKHJlZ2FkZHIpOworCisJCS8qIENoZWNrIGlmIGZhdWx0IGlzIHRvIGRpcnR5IGEgY2xlYW4gcGFnZSAqLworCQlpZiAoIShkYXRhICYgQ1BMQl9XVCkgJiYgIShkYXRhICYgQ1BMQl9ESVJUWSkgJiYKKwkJICAgIHdyaXRlX3Blcm1pdHRlZChzdGF0dXMsIGRhdGEpKSB7CisKKwkJCWRjcGxiX3RibFtjcHVdW2lkeF0uZGF0YSA9IGRhdGE7CisJCQliZmluX3dyaXRlMzIocmVnYWRkciwgZGF0YSk7CisJCQlyZXR1cm4gQ1BMQl9SRUxPQURFRDsKKwkJfQorCX0KKworCXJldHVybiBDUExCX1BST1RfVklPTDsKK30KKworTUdSX0FUVFIgaW50IGNwbGJfaGRyKGludCBzZXFzdGF0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgY2F1c2UgPSBzZXFzdGF0ICYgMHgzZjsKKwl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXN3aXRjaCAoY2F1c2UpIHsKKwljYXNlIDB4MkM6CisJCXJldHVybiBpY3BsYl9taXNzKGNwdSk7CisJY2FzZSAweDI2OgorCQlyZXR1cm4gZGNwbGJfbWlzcyhjcHUpOworCWRlZmF1bHQ6CisJCWlmICh1bmxpa2VseShjYXVzZSA9PSAweDIzKSkKKwkJCXJldHVybiBkY3BsYl9wcm90ZWN0aW9uX2ZhdWx0KGNwdSk7CisKKwkJcmV0dXJuIENQTEJfVU5LTk9XTl9FUlI7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYmluZm8uYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGJpbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRkNzgzMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGJpbmZvLmMKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBhcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiaW5mby5jIC0gZGlzcGxheSBDUExCIHN0YXR1cworICoKKyAqIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxhc20vY3BsYmluaXQuaD4KKyNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KKworc3RhdGljIGNoYXIgY29uc3QgcGFnZV9zdHJ0YmxbXVszXSA9IHsgIjFLIiwgIjRLIiwgIjFNIiwgIjRNIiB9OworI2RlZmluZSBwYWdlKGZsYWdzKSAgICAoKChmbGFncykgJiAweDMwMDAwKSA+PiAxNikKKyNkZWZpbmUgc3RycGFnZShmbGFncykgcGFnZV9zdHJ0YmxbcGFnZShmbGFncyldCisKK3N0cnVjdCBjcGxiaW5mb19kYXRhIHsKKwlsb2ZmX3QgcG9zOworCWNoYXIgY3BsYl90eXBlOworCXUzMiBtZW1fY29udHJvbDsKKwlzdHJ1Y3QgY3BsYl9lbnRyeSAqdGJsOworCWludCBzd2l0Y2hlZDsKK307CisKK3N0YXRpYyB2b2lkIGNwbGJpbmZvX3ByaW50X2hlYWRlcihzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCit7CisJc2VxX3ByaW50ZihtLCAiSW5kZXhcdEFkZHJlc3NcdFx0RGF0YVx0U2l6ZVx0VS9SRFx0VS9XUlx0Uy9XUlx0U3dpdGNoXG4iKTsKK30KKworc3RhdGljIGludCBjcGxiaW5mb19ub21vcmUoc3RydWN0IGNwbGJpbmZvX2RhdGEgKmNkYXRhKQoreworCXJldHVybiBjZGF0YS0+cG9zID49IE1BWF9DUExCUzsKK30KKworc3RhdGljIGludCBjcGxiaW5mb19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgY3BsYmluZm9fZGF0YSAqY2RhdGE7CisJdW5zaWduZWQgbG9uZyBkYXRhLCBhZGRyOworCWxvZmZfdCBwb3M7CisKKwljZGF0YSA9IHA7CisJcG9zID0gY2RhdGEtPnBvczsKKwlhZGRyID0gY2RhdGEtPnRibFtwb3NdLmFkZHI7CisJZGF0YSA9IGNkYXRhLT50YmxbcG9zXS5kYXRhOworCisJc2VxX3ByaW50ZihtLAorCQkiJWRcdDB4JTA4bHhcdCUwNWx4XHQlc1x0JWNcdCVjXHQlY1x0JWNcbiIsCisJCShpbnQpcG9zLCBhZGRyLCBkYXRhLCBzdHJwYWdlKGRhdGEpLAorCQkoZGF0YSAmIENQTEJfVVNFUl9SRCkgPyAnWScgOiAnTicsCisJCShkYXRhICYgQ1BMQl9VU0VSX1dSKSA/ICdZJyA6ICdOJywKKwkJKGRhdGEgJiBDUExCX1NVUFZfV1IpID8gJ1knIDogJ04nLAorCQlwb3MgPCBjZGF0YS0+c3dpdGNoZWQgPyAnTicgOiAnWScpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNwbGJpbmZvX3NlcV9pbml0KHN0cnVjdCBjcGxiaW5mb19kYXRhICpjZGF0YSwgdW5zaWduZWQgaW50IGNwdSkKK3sKKwlpZiAoY2RhdGEtPmNwbGJfdHlwZSA9PSAnSScpIHsKKwkJY2RhdGEtPm1lbV9jb250cm9sID0gYmZpbl9yZWFkX0lNRU1fQ09OVFJPTCgpOworCQljZGF0YS0+dGJsID0gaWNwbGJfdGJsW2NwdV07CisJCWNkYXRhLT5zd2l0Y2hlZCA9IGZpcnN0X3N3aXRjaGVkX2ljcGxiOworCX0gZWxzZSB7CisJCWNkYXRhLT5tZW1fY29udHJvbCA9IGJmaW5fcmVhZF9ETUVNX0NPTlRST0woKTsKKwkJY2RhdGEtPnRibCA9IGRjcGxiX3RibFtjcHVdOworCQljZGF0YS0+c3dpdGNoZWQgPSBmaXJzdF9zd2l0Y2hlZF9kY3BsYjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkICpjcGxiaW5mb19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBjcGxiaW5mb19kYXRhICpjZGF0YSA9IG0tPnByaXZhdGU7CisKKwlpZiAoISpwb3MpIHsKKwkJc2VxX3ByaW50ZihtLCAiJWNDUExCcyBhcmUgJXNhYmxlZDogMHgleFxuIiwgY2RhdGEtPmNwbGJfdHlwZSwKKwkJCShjZGF0YS0+bWVtX2NvbnRyb2wgJiBFTkRDUExCID8gImVuIiA6ICJkaXMiKSwKKwkJCWNkYXRhLT5tZW1fY29udHJvbCk7CisJCWNwbGJpbmZvX3ByaW50X2hlYWRlcihtKTsKKwl9IGVsc2UgaWYgKGNwbGJpbmZvX25vbW9yZShjZGF0YSkpCisJCXJldHVybiBOVUxMOworCisJZ2V0X2NwdSgpOworCXJldHVybiBjZGF0YTsKK30KKworc3RhdGljIHZvaWQgKmNwbGJpbmZvX25leHQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpwLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgY3BsYmluZm9fZGF0YSAqY2RhdGEgPSBwOworCWNkYXRhLT5wb3MgPSArKygqcG9zKTsKKwlpZiAoY3BsYmluZm9fbm9tb3JlKGNkYXRhKSkKKwkJcmV0dXJuIE5VTEw7CisJZWxzZQorCQlyZXR1cm4gY2RhdGE7Cit9CisKK3N0YXRpYyB2b2lkIGNwbGJpbmZvX3N0b3Aoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpwKQoreworCXB1dF9jcHUoKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBjcGxiaW5mb19zb3BzID0geworCS5zdGFydCA9IGNwbGJpbmZvX3N0YXJ0LAorCS5uZXh0ICA9IGNwbGJpbmZvX25leHQsCisJLnN0b3AgID0gY3BsYmluZm9fc3RvcCwKKwkuc2hvdyAgPSBjcGxiaW5mb19zaG93LAorfTsKKworc3RhdGljIGludCBjcGxiaW5mb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWNoYXIgYnVmWzI1Nl0sICpwYXRoLCAqcDsKKwl1bnNpZ25lZCBpbnQgY3B1OworCWNoYXIgKnNfY3B1LCAqc19jcGxiOworCWludCByZXQ7CisJc3RydWN0IHNlcV9maWxlICptOworCXN0cnVjdCBjcGxiaW5mb19kYXRhICpjZGF0YTsKKworCXBhdGggPSBkX3BhdGgoJmZpbGUtPmZfcGF0aCwgYnVmLCBzaXplb2YoYnVmKSk7CisJaWYgKElTX0VSUihwYXRoKSkKKwkJcmV0dXJuIFBUUl9FUlIocGF0aCk7CisJc19jcHUgPSBzdHJzdHIocGF0aCwgIi9jcHUiKTsKKwlzX2NwbGIgPSBzdHJyY2hyKHBhdGgsICcvJyk7CisJaWYgKCFzX2NwdSB8fCAhc19jcGxiKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNwdSA9IHNpbXBsZV9zdHJ0b3VsKHNfY3B1ICsgNCwgJnAsIDEwKTsKKwlpZiAoIWNwdV9vbmxpbmUoY3B1KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXQgPSBzZXFfb3Blbl9wcml2YXRlKGZpbGUsICZjcGxiaW5mb19zb3BzLCBzaXplb2YoKmNkYXRhKSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwltID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNkYXRhID0gbS0+cHJpdmF0ZTsKKworCWNkYXRhLT5wb3MgPSAwOworCWNkYXRhLT5jcGxiX3R5cGUgPSB0b3VwcGVyKHNfY3BsYlsxXSk7CisJY3BsYmluZm9fc2VxX2luaXQoY2RhdGEsIGNwdSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY3BsYmluZm9fZm9wcyA9IHsKKwkub3BlbiAgICA9IGNwbGJpbmZvX29wZW4sCisJLnJlYWQgICAgPSBzZXFfcmVhZCwKKwkubGxzZWVrICA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlX3ByaXZhdGUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBjcGxiaW5mb19pbml0KHZvaWQpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpjcGxiX2RpciwgKmNwdV9kaXI7CisJY2hhciBidWZbMTBdOworCXVuc2lnbmVkIGludCBjcHU7CisKKwljcGxiX2RpciA9IHByb2NfbWtkaXIoImNwbGJpbmZvIiwgTlVMTCk7CisJaWYgKCFjcGxiX2RpcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CisJCXNwcmludGYoYnVmLCAiY3B1JWkiLCBjcHUpOworCQljcHVfZGlyID0gcHJvY19ta2RpcihidWYsIGNwbGJfZGlyKTsKKwkJaWYgKCFjcHVfZGlyKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJcHJvY19jcmVhdGUoImljcGxiIiwgU19JUlVHTywgY3B1X2RpciwgJmNwbGJpbmZvX2ZvcHMpOworCQlwcm9jX2NyZWF0ZSgiZGNwbGIiLCBTX0lSVUdPLCBjcHVfZGlyLCAmY3BsYmluZm9fZm9wcyk7CisJfQorCisJcmV0dXJuIDA7Cit9CitsYXRlX2luaXRjYWxsKGNwbGJpbmZvX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvZWFybHlfcHJpbnRrLmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9lYXJseV9wcmludGsuYwppbmRleCAxZjRlM2QyLi5jOGFkMDUxIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9lYXJseV9wcmludGsuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9lYXJseV9wcmludGsuYwpAQCAtMTA1LDEwICsxMDUsMTAgQEAKIAkJY2ZsYWcgfD0gQ1M1OwogCQlicmVhazsKIAljYXNlIDY6Ci0JCWNmbGFnIHw9IENTNTsKKwkJY2ZsYWcgfD0gQ1M2OwogCQlicmVhazsKIAljYXNlIDc6Ci0JCWNmbGFnIHw9IENTNTsKKwkJY2ZsYWcgfD0gQ1M3OwogCQlicmVhazsKIAlkZWZhdWx0OgogCQljZmxhZyB8PSBDUzg7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvZW50cnkuUwppbmRleCBmYWVhODhlLi5hOWNmYmE5IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2VudHJ5LlMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKICNpbmNsdWRlIDxhc20vY29udGV4dC5TPgpAQCAtNDEsNiArNDIsMTAgQEAKICNlbmRpZgogCiBFTlRSWShfcmV0X2Zyb21fZm9yaykKKyNpZmRlZiBDT05GSUdfSVBJUEUKKwlbLS1zcF0gPSByZXRpOyAJCS8qIElSUXMgb24uICovCisJU1AgKz0gNDsKKyNlbmRpZiAvKiBDT05GSUdfSVBJUEUgKi8KIAlTUCArPSAtMTI7CiAJY2FsbCBfc2NoZWR1bGVfdGFpbDsKIAlTUCArPSAxMjsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2ZpeGVkX2NvZGUuUyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2ZpeGVkX2NvZGUuUwppbmRleCA0YjAzYmEwLi4wZDJkOWUwIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9maXhlZF9jb2RlLlMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvZml4ZWRfY29kZS5TCkBAIC04LDEwICs4LDEyIEBACiAgKiBCRjU2MSBTTVApLgogICovCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KICNpbmNsdWRlIDxhc20vZW50cnkuaD4KIAotLnRleHQKK19fSU5JVAorCiBFTlRSWShfZml4ZWRfY29kZV9zdGFydCkKIAogLmFsaWduIDE2CkBAIC0xNDQsMyArMTQ2LDUgQEAKIEVORFBST0MoX3NhZmVfdXNlcl9pbnN0cnVjdGlvbikKIAogRU5UUlkoX2ZpeGVkX2NvZGVfZW5kKQorCitfX0ZJTklUCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9pcGlwZS5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvaXBpcGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzliZTVhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvaXBpcGUuYwpAQCAtMCwwICsxLDQyOCBAQAorLyogLSotIGxpbnV4LWMgLSotCisgKiBsaW51eC9hcmNoL2JsYWNrZmluL2tlcm5lbC9pcGlwZS5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDcgUGhpbGlwcGUgR2VydW0uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSBNQSAwMjEzOSwKKyAqIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKyAqIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBBcmNoaXRlY3R1cmUtZGVwZW5kZW50IEktcGlwZSBzdXBwb3J0IGZvciB0aGUgQmxhY2tmaW4uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCitzdGF0aWMgaW50IGNyZWF0ZV9pcnFfdGhyZWFkczsKKworREVGSU5FX1BFUl9DUFUoc3RydWN0IHB0X3JlZ3MsIF9faXBpcGVfdGlja19yZWdzKTsKKworc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIHBlbmRpbmdfaXJxdGhyZWFkX21hc2spOworCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50IFtJVkcxMyArIDFdLCBwZW5kaW5nX2lycV9jb3VudCk7CisKK2FzbWxpbmthZ2Ugdm9pZCBhc21fZG9fSVJRKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKworc3RhdGljIHZvaWQgX19pcGlwZV9ub19pcnF0YWlsKHZvaWQpOworCit1bnNpZ25lZCBsb25nIF9faXBpcGVfaXJxX3RhaWxfaG9vayA9ICh1bnNpZ25lZCBsb25nKSZfX2lwaXBlX25vX2lycXRhaWw7CitFWFBPUlRfU1lNQk9MKF9faXBpcGVfaXJxX3RhaWxfaG9vayk7CisKK3Vuc2lnbmVkIGxvbmcgX19pcGlwZV9jb3JlX2Nsb2NrOworRVhQT1JUX1NZTUJPTChfX2lwaXBlX2NvcmVfY2xvY2spOworCit1bnNpZ25lZCBsb25nIF9faXBpcGVfZnJlcV9zY2FsZTsKK0VYUE9SVF9TWU1CT0woX19pcGlwZV9mcmVxX3NjYWxlKTsKKworYXRvbWljX3QgX19pcGlwZV9pcnFfbHZkZXB0aFtJVkcxNSArIDFdOworCit1bnNpZ25lZCBsb25nIF9faXBpcGVfaXJxX2x2bWFzayA9IF9fYWxsX21hc2tlZF9pcnFfZmxhZ3M7CitFWFBPUlRfU1lNQk9MKF9faXBpcGVfaXJxX2x2bWFzayk7CisKK3N0YXRpYyB2b2lkIF9faXBpcGVfYWNrX2lycSh1bnNpZ25lZCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlkZXNjLT5pcGlwZV9hY2soaXJxLCBkZXNjKTsKK30KKworLyoKKyAqIF9faXBpcGVfZW5hYmxlX3BpcGVsaW5lKCkgLS0gV2UgYXJlIHJ1bm5pbmcgb24gdGhlIGJvb3QgQ1BVLCBodworICogaW50ZXJydXB0cyBhcmUgb2ZmLCBhbmQgc2Vjb25kYXJ5IENQVXMgYXJlIHN0aWxsIGxvc3QgaW4gc3BhY2UuCisgKi8KK3ZvaWQgX19pcGlwZV9lbmFibGVfcGlwZWxpbmUodm9pZCkKK3sKKwl1bnNpZ25lZCBpcnE7CisKKwlfX2lwaXBlX2NvcmVfY2xvY2sgPSBnZXRfY2NsaygpOyAvKiBGZXRjaCB0aGlzIG9uY2UuICovCisJX19pcGlwZV9mcmVxX3NjYWxlID0gMTAwMDAwMDAwMFVMIC8gX19pcGlwZV9jb3JlX2Nsb2NrOworCisJZm9yIChpcnEgPSAwOyBpcnEgPCBOUl9JUlFTOyArK2lycSkKKwkJaXBpcGVfdmlydHVhbGl6ZV9pcnEoaXBpcGVfcm9vdF9kb21haW4sCisJCQkJICAgICBpcnEsCisJCQkJICAgICAoaXBpcGVfaXJxX2hhbmRsZXJfdCkmYXNtX2RvX0lSUSwKKwkJCQkgICAgIE5VTEwsCisJCQkJICAgICAmX19pcGlwZV9hY2tfaXJxLAorCQkJCSAgICAgSVBJUEVfSEFORExFX01BU0sgfCBJUElQRV9QQVNTX01BU0spOworfQorCisvKgorICogX19pcGlwZV9oYW5kbGVfaXJxKCkgLS0gSVBJUEUncyBnZW5lcmljIElSUSBoYW5kbGVyLiBBbiBvcHRpbWlzdGljCisgKiBpbnRlcnJ1cHQgcHJvdGVjdGlvbiBsb2cgaXMgbWFpbnRhaW5lZCBoZXJlIGZvciBlYWNoIGRvbWFpbi4gSHcKKyAqIGludGVycnVwdHMgYXJlIG1hc2tlZCBvbiBlbnRyeS4KKyAqLwordm9pZCBfX2lwaXBlX2hhbmRsZV9pcnEodW5zaWduZWQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgaXBpcGVfZG9tYWluICp0aGlzX2RvbWFpbiwgKm5leHRfZG9tYWluOworCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsICpwb3M7CisJaW50IG1fYWNrLCBzID0gLTE7CisKKwkvKgorCSAqIFNvZnR3YXJlLXRyaWdnZXJlZCBJUlFzIGRvIG5vdCBuZWVkIGFueSBhY2suICBUaGUgY29udGVudHMKKwkgKiBvZiB0aGUgcmVnaXN0ZXIgZnJhbWUgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIHByb2Nlc3NpbmcKKwkgKiB0aGUgdGltZXIgaW50ZXJydXB0LCBidXQgbm90IGZvciBoYW5kbGluZyBhbnkgb3RoZXIKKwkgKiBpbnRlcnJ1cHQuCisJICovCisJbV9hY2sgPSAocmVncyA9PSBOVUxMIHx8IGlycSA9PSBJUlFfU1lTVE1SIHx8IGlycSA9PSBJUlFfQ09SRVRNUik7CisKKwl0aGlzX2RvbWFpbiA9IGlwaXBlX2N1cnJlbnRfZG9tYWluOworCisJaWYgKHVubGlrZWx5KHRlc3RfYml0KElQSVBFX1NUSUNLWV9GTEFHLCAmdGhpc19kb21haW4tPmlycXNbaXJxXS5jb250cm9sKSkpCisJCWhlYWQgPSAmdGhpc19kb21haW4tPnBfbGluazsKKwllbHNlIHsKKwkJaGVhZCA9IF9faXBpcGVfcGlwZWxpbmUubmV4dDsKKwkJbmV4dF9kb21haW4gPSBsaXN0X2VudHJ5KGhlYWQsIHN0cnVjdCBpcGlwZV9kb21haW4sIHBfbGluayk7CisJCWlmIChsaWtlbHkodGVzdF9iaXQoSVBJUEVfV0lSRURfRkxBRywgJm5leHRfZG9tYWluLT5pcnFzW2lycV0uY29udHJvbCkpKSB7CisJCQlpZiAoIW1fYWNrICYmIG5leHRfZG9tYWluLT5pcnFzW2lycV0uYWNrbm93bGVkZ2UgIT0gTlVMTCkKKwkJCQluZXh0X2RvbWFpbi0+aXJxc1tpcnFdLmFja25vd2xlZGdlKGlycSwgaXJxX2Rlc2MgKyBpcnEpOworCQkJaWYgKHRlc3RfYml0KElQSVBFX1JPT1RMT0NLX0ZMQUcsICZpcGlwZV9yb290X2RvbWFpbi0+ZmxhZ3MpKQorCQkJCXMgPSBfX3Rlc3RfYW5kX3NldF9iaXQoSVBJUEVfU1RBTExfRkxBRywKKwkJCQkJCSAgICAgICAmaXBpcGVfcm9vdF9jcHVkb21fdmFyKHN0YXR1cykpOworCQkJX19pcGlwZV9kaXNwYXRjaF93aXJlZChuZXh0X2RvbWFpbiwgaXJxKTsKKwkJCQlnb3RvIGZpbmFsaXplOworCQkJcmV0dXJuOworCQl9CisJfQorCisJLyogQWNrIHRoZSBpbnRlcnJ1cHQuICovCisKKwlwb3MgPSBoZWFkOworCisJd2hpbGUgKHBvcyAhPSAmX19pcGlwZV9waXBlbGluZSkgeworCQluZXh0X2RvbWFpbiA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgaXBpcGVfZG9tYWluLCBwX2xpbmspOworCQkvKgorCQkgKiBGb3IgZWFjaCBkb21haW4gaGFuZGxpbmcgdGhlIGluY29taW5nIElSUSwgbWFyayBpdAorCQkgKiBhcyBwZW5kaW5nIGluIGl0cyBsb2cuCisJCSAqLworCQlpZiAodGVzdF9iaXQoSVBJUEVfSEFORExFX0ZMQUcsICZuZXh0X2RvbWFpbi0+aXJxc1tpcnFdLmNvbnRyb2wpKSB7CisJCQkvKgorCQkJICogRG9tYWlucyB0aGF0IGhhbmRsZSB0aGlzIElSUSBhcmUgcG9sbGVkIGZvcgorCQkJICogYWNrbm93bGVkZ2luZyBpdCBieSBkZWNyZWFzaW5nIHByaW9yaXR5CisJCQkgKiBvcmRlci4gVGhlIGludGVycnVwdCBtdXN0IGJlIG1hZGUgcGVuZGluZworCQkJICogX2ZpcnN0XyBpbiB0aGUgZG9tYWluJ3Mgc3RhdHVzIGZsYWdzIGJlZm9yZQorCQkJICogdGhlIFBJQyBpcyB1bmxvY2tlZC4KKwkJCSAqLworCQkJX19pcGlwZV9zZXRfaXJxX3BlbmRpbmcobmV4dF9kb21haW4sIGlycSk7CisKKwkJCWlmICghbV9hY2sgJiYgbmV4dF9kb21haW4tPmlycXNbaXJxXS5hY2tub3dsZWRnZSAhPSBOVUxMKSB7CisJCQkJbmV4dF9kb21haW4tPmlycXNbaXJxXS5hY2tub3dsZWRnZShpcnEsIGlycV9kZXNjICsgaXJxKTsKKwkJCQltX2FjayA9IDE7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBJZiB0aGUgZG9tYWluIGRvZXMgbm90IHdhbnQgdGhlIElSUSB0byBiZSBwYXNzZWQKKwkJICogZG93biB0aGUgaW50ZXJydXB0IHBpcGUsIGV4aXQgdGhlIGxvb3Agbm93LgorCQkgKi8KKwkJaWYgKCF0ZXN0X2JpdChJUElQRV9QQVNTX0ZMQUcsICZuZXh0X2RvbWFpbi0+aXJxc1tpcnFdLmNvbnRyb2wpKQorCQkJYnJlYWs7CisKKwkJcG9zID0gbmV4dF9kb21haW4tPnBfbGluay5uZXh0OworCX0KKworCS8qCisJICogTm93IHdhbGsgdGhlIHBpcGVsaW5lLCB5aWVsZGluZyBjb250cm9sIHRvIHRoZSBoaWdoZXN0CisJICogcHJpb3JpdHkgZG9tYWluIHRoYXQgaGFzIHBlbmRpbmcgaW50ZXJydXB0KHMpIG9yCisJICogaW1tZWRpYXRlbHkgdG8gdGhlIGN1cnJlbnQgZG9tYWluIGlmIHRoZSBpbnRlcnJ1cHQgaGFzIGJlZW4KKwkgKiBtYXJrZWQgYXMgJ3N0aWNreScuIFRoaXMgc2VhcmNoIGRvZXMgbm90IGdvIGJleW9uZCB0aGUKKwkgKiBjdXJyZW50IGRvbWFpbiBpbiB0aGUgcGlwZWxpbmUuIFdlIGFsc28gZW5mb3JjZSB0aGUKKwkgKiBhZGRpdGlvbmFsIHJvb3Qgc3RhZ2UgbG9jayAoYmxhY2tmaW4tc3BlY2lmaWMpLiAqLworCisJaWYgKHRlc3RfYml0KElQSVBFX1JPT1RMT0NLX0ZMQUcsICZpcGlwZV9yb290X2RvbWFpbi0+ZmxhZ3MpKQorCQlzID0gX190ZXN0X2FuZF9zZXRfYml0KElQSVBFX1NUQUxMX0ZMQUcsCisJCQkJICAgICAgICZpcGlwZV9yb290X2NwdWRvbV92YXIoc3RhdHVzKSk7CitmaW5hbGl6ZToKKworCV9faXBpcGVfd2Fsa19waXBlbGluZShoZWFkKTsKKworCWlmICghcykKKwkJX19jbGVhcl9iaXQoSVBJUEVfU1RBTExfRkxBRywKKwkJCSAgICAmaXBpcGVfcm9vdF9jcHVkb21fdmFyKHN0YXR1cykpOworfQorCitpbnQgX19pcGlwZV9jaGVja19yb290KHZvaWQpCit7CisJcmV0dXJuIGlwaXBlX3Jvb3RfZG9tYWluX3A7Cit9CisKK3ZvaWQgX19pcGlwZV9lbmFibGVfaXJxZGVzYyhzdHJ1Y3QgaXBpcGVfZG9tYWluICppcGQsIHVuc2lnbmVkIGlycSkKK3sKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfZGVzYyArIGlycTsKKwlpbnQgcHJpbyA9IGRlc2MtPmljX3ByaW87CisKKwlkZXNjLT5kZXB0aCA9IDA7CisJaWYgKGlwZCAhPSAmaXBpcGVfcm9vdCAmJgorCSAgICBhdG9taWNfaW5jX3JldHVybigmX19pcGlwZV9pcnFfbHZkZXB0aFtwcmlvXSkgPT0gMSkKKwkJX19zZXRfYml0KHByaW8sICZfX2lwaXBlX2lycV9sdm1hc2spOworfQorRVhQT1JUX1NZTUJPTChfX2lwaXBlX2VuYWJsZV9pcnFkZXNjKTsKKwordm9pZCBfX2lwaXBlX2Rpc2FibGVfaXJxZGVzYyhzdHJ1Y3QgaXBpcGVfZG9tYWluICppcGQsIHVuc2lnbmVkIGlycSkKK3sKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfZGVzYyArIGlycTsKKwlpbnQgcHJpbyA9IGRlc2MtPmljX3ByaW87CisKKwlpZiAoaXBkICE9ICZpcGlwZV9yb290ICYmCisJICAgIGF0b21pY19kZWNfYW5kX3Rlc3QoJl9faXBpcGVfaXJxX2x2ZGVwdGhbcHJpb10pKQorCQlfX2NsZWFyX2JpdChwcmlvLCAmX19pcGlwZV9pcnFfbHZtYXNrKTsKK30KK0VYUE9SVF9TWU1CT0woX19pcGlwZV9kaXNhYmxlX2lycWRlc2MpOworCit2b2lkIF9faXBpcGVfc3RhbGxfcm9vdF9yYXcodm9pZCkKK3sKKwkvKgorCSAqIFRoaXMgY29kZSBpcyBjYWxsZWQgYnkgdGhlIGluc3tid2x9IHJvdXRpbmVzIChzZWUKKwkgKiBhcmNoL2JsYWNrZmluL2xpYi9pbnMuUyksIHdoaWNoIGFyZSBoZWF2aWx5IHVzZWQgYnkgdGhlCisJICogbmV0d29yayBzdGFjay4gSXQgbWFza3MgYWxsIGludGVycnVwdHMgYnV0IHRob3NlIGhhbmRsZWQgYnkKKwkgKiBub24tcm9vdCBkb21haW5zLCBzbyB0aGF0IHdlIGtlZXAgZGVjZW50IG5ldHdvcmsgdHJhbnNmZXIKKwkgKiByYXRlcyBmb3IgTGludXggd2l0aG91dCBpbmR1Y2luZyBwYXRob2xvZ2ljYWwgaml0dGVyIGZvcgorCSAqIHRoZSByZWFsLXRpbWUgZG9tYWluLgorCSAqLworCV9fYXNtX18gX192b2xhdGlsZV9fICgic3RpICUwOyIgOiA6ICJkIihfX2lwaXBlX2lycV9sdm1hc2spKTsKKworCV9fc2V0X2JpdChJUElQRV9TVEFMTF9GTEFHLAorCQkgICZpcGlwZV9yb290X2NwdWRvbV92YXIoc3RhdHVzKSk7Cit9CisKK3ZvaWQgX19pcGlwZV91bnN0YWxsX3Jvb3RfcmF3KHZvaWQpCit7CisJX19jbGVhcl9iaXQoSVBJUEVfU1RBTExfRkxBRywKKwkJICAgICZpcGlwZV9yb290X2NwdWRvbV92YXIoc3RhdHVzKSk7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN0aSAlMDsiIDogOiAiZCIoYmZpbl9pcnFfZmxhZ3MpKTsKK30KKworaW50IF9faXBpcGVfc3lzY2FsbF9yb290KHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBXZSBuZWVkIHRvIHJ1biB0aGUgSVJRIHRhaWwgaG9vayB3aGVuZXZlciB3ZSBkb24ndAorCSAqIHByb3BhZ2F0ZSBhIHN5c2NhbGwgdG8gaGlnaGVyIGRvbWFpbnMsIGJlY2F1c2Ugd2Uga25vdyB0aGF0CisJICogaW1wb3J0YW50IG9wZXJhdGlvbnMgbWlnaHQgYmUgcGVuZGluZyB0aGVyZSAoZS5nLiBYZW5vbWFpCisJICogZGVmZXJyZWQgcmVzY2hlZHVsaW5nKS4gKi8KKworCWlmICghX19pcGlwZV9zeXNjYWxsX3dhdGNoZWRfcChjdXJyZW50LCByZWdzLT5vcmlnX3AwKSkgeworCQl2b2lkICgqaG9vaykodm9pZCkgPSAodm9pZCAoKikodm9pZCkpX19pcGlwZV9pcnFfdGFpbF9ob29rOworCQlob29rKCk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogVGhpcyByb3V0aW5lIGVpdGhlciByZXR1cm5zOgorCSAqIDAgLS0gaWYgdGhlIHN5c2NhbGwgaXMgdG8gYmUgcGFzc2VkIHRvIExpbnV4OworCSAqIDEgLS0gaWYgdGhlIHN5c2NhbGwgc2hvdWxkIG5vdCBiZSBwYXNzZWQgdG8gTGludXgsIGFuZCBubworCSAqIHRhaWwgd29yayBzaG91bGQgYmUgcGVyZm9ybWVkOworCSAqIC0xIC0tIGlmIHRoZSBzeXNjYWxsIHNob3VsZCBub3QgYmUgcGFzc2VkIHRvIExpbnV4IGJ1dCB0aGUKKwkgKiB0YWlsIHdvcmsgaGFzIHRvIGJlIHBlcmZvcm1lZCAoZm9yIGhhbmRsaW5nIHNpZ25hbHMgZXRjKS4KKwkgKi8KKworCWlmIChfX2lwaXBlX2V2ZW50X21vbml0b3JlZF9wKElQSVBFX0VWRU5UX1NZU0NBTEwpICYmCisJICAgIF9faXBpcGVfZGlzcGF0Y2hfZXZlbnQoSVBJUEVfRVZFTlRfU1lTQ0FMTCwgcmVncykgPiAwKSB7CisJCWlmIChpcGlwZV9yb290X2RvbWFpbl9wICYmICFpbl9hdG9taWMoKSkgeworCQkJLyoKKwkJCSAqIFN5bmMgcGVuZGluZyBWSVJRcyBiZWZvcmUgX1RJRl9ORUVEX1JFU0NIRUQKKwkJCSAqIGlzIHRlc3RlZC4KKwkJCSAqLworCQkJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOworCQkJaWYgKChpcGlwZV9yb290X2NwdWRvbV92YXIoaXJxcGVuZF9oaW1hc2spICYgSVBJUEVfSVJRTUFTS19WSVJUKSAhPSAwKQorCQkJCV9faXBpcGVfc3luY19waXBlbGluZShJUElQRV9JUlFNQVNLX1ZJUlQpOworCQkJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCit1bnNpZ25lZCBsb25nIGlwaXBlX2NyaXRpY2FsX2VudGVyKHZvaWQgKCpzeW5jZm4pICh2b2lkKSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOworCisJcmV0dXJuIGZsYWdzOworfQorCit2b2lkIGlwaXBlX2NyaXRpY2FsX2V4aXQodW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIF9faXBpcGVfbm9faXJxdGFpbCh2b2lkKQoreworfQorCitpbnQgaXBpcGVfZ2V0X3N5c2luZm8oc3RydWN0IGlwaXBlX3N5c2luZm8gKmluZm8pCit7CisJaW5mby0+bmNwdXMgPSBudW1fb25saW5lX2NwdXMoKTsKKwlpbmZvLT5jcHVmcmVxID0gaXBpcGVfY3B1X2ZyZXEoKTsKKwlpbmZvLT5hcmNoZGVwLnRtaXJxID0gSVBJUEVfVElNRVJfSVJROworCWluZm8tPmFyY2hkZXAudG1mcmVxID0gaW5mby0+Y3B1ZnJlcTsKKworCXJldHVybiAwOworfQorCisvKgorICogaXBpcGVfdHJpZ2dlcl9pcnEoKSAtLSBQdXNoIHRoZSBpbnRlcnJ1cHQgYXQgZnJvbnQgb2YgdGhlIHBpcGVsaW5lCisgKiBqdXN0IGxpa2UgaWYgaXQgaGFzIGJlZW4gYWN0dWFsbHkgcmVjZWl2ZWQgZnJvbSBhIGh3IHNvdXJjZS4gQWxzbworICogd29ya3MgZm9yIHZpcnR1YWwgaW50ZXJydXB0cy4KKyAqLworaW50IGlwaXBlX3RyaWdnZXJfaXJxKHVuc2lnbmVkIGlycSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGlycSA+PSBJUElQRV9OUl9JUlFTIHx8CisJICAgIChpcGlwZV92aXJ0dWFsX2lycV9wKGlycSkKKwkgICAgICYmICF0ZXN0X2JpdChpcnEgLSBJUElQRV9WSVJRX0JBU0UsICZfX2lwaXBlX3ZpcnR1YWxfaXJxX21hcCkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKKworCV9faXBpcGVfaGFuZGxlX2lycShpcnEsIE5VTEwpOworCisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOworCisJcmV0dXJuIDE7Cit9CisKKy8qIE1vdmUgTGludXggSVJRIHRvIHRocmVhZHMuICovCisKK3N0YXRpYyBpbnQgZG9faXJxZCh2b2lkICpfX2Rlc2MpCit7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gX19kZXNjOworCXVuc2lnbmVkIGlycSA9IGRlc2MgLSBpcnFfZGVzYzsKKwlpbnQgdGhycHJpbyA9IGRlc2MtPnRocl9wcmlvOworCWludCB0aHJtYXNrID0gMSA8PCB0aHJwcmlvOworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJY3B1bWFza190IGNwdW1hc2s7CisKKwlzaWdmaWxsc2V0KCZjdXJyZW50LT5ibG9ja2VkKTsKKwljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKKwljcHVtYXNrID0gY3B1bWFza19vZl9jcHUoY3B1KTsKKwlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIGNwdW1hc2spOworCWlwaXBlX3NldHNjaGVkdWxlcl9yb290KGN1cnJlbnQsIFNDSEVEX0ZJRk8sIDUwICsgdGhycHJpbyk7CisKKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQlpZiAoIShkZXNjLT5zdGF0dXMgJiBJUlFfU0NIRURVTEVEKSkgeworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKK3Jlc2NoZWQ6CisJCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJCQlzY2hlZHVsZSgpOworCQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwkJfQorCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCS8qCisJCSAqIElmIGhpZ2hlciBwcmlvcml0eSBpbnRlcnJ1cHQgc2VydmVycyBhcmUgcmVhZHkgdG8KKwkJICogcnVuLCByZXNjaGVkdWxlIGltbWVkaWF0ZWx5LiBXZSBuZWVkIHRoaXMgZm9yIHRoZQorCQkgKiBHUElPIGRlbXV4IElSUSBoYW5kbGVyIHRvIHVubWFzayB0aGUgaW50ZXJydXB0IGxpbmUKKwkJICogX2xhc3RfLCBhZnRlciBhbGwgR1BJTyBJUlFzIGhhdmUgcnVuLgorCQkgKi8KKwkJaWYgKHBlcl9jcHUocGVuZGluZ19pcnF0aHJlYWRfbWFzaywgY3B1KSAmIH4odGhybWFza3wodGhybWFzay0xKSkpCisJCQlnb3RvIHJlc2NoZWQ7CisJCWlmICgtLXBlcl9jcHUocGVuZGluZ19pcnFfY291bnRbdGhycHJpb10sIGNwdSkgPT0gMCkKKwkJCXBlcl9jcHUocGVuZGluZ19pcnF0aHJlYWRfbWFzaywgY3B1KSAmPSB+dGhybWFzazsKKwkJZGVzYy0+c3RhdHVzICY9IH5JUlFfU0NIRURVTEVEOworCQlkZXNjLT50aHJfaGFuZGxlcihpcnEsICZfX3Jhd19nZXRfY3B1X3ZhcihfX2lwaXBlX3RpY2tfcmVncykpOworCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJfQorCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQga2lja19pcnFkKHVuc2lnbmVkIGlycSwgdm9pZCAqY29va2llKQoreworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV9kZXNjICsgaXJxOworCWludCB0aHJwcmlvID0gZGVzYy0+dGhyX3ByaW87CisJaW50IHRocm1hc2sgPSAxIDw8IHRocnByaW87CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCWlmICghKGRlc2MtPnN0YXR1cyAmIElSUV9TQ0hFRFVMRUQpKSB7CisJCWRlc2MtPnN0YXR1cyB8PSBJUlFfU0NIRURVTEVEOworCQlwZXJfY3B1KHBlbmRpbmdfaXJxdGhyZWFkX21hc2ssIGNwdSkgfD0gdGhybWFzazsKKwkJKytwZXJfY3B1KHBlbmRpbmdfaXJxX2NvdW50W3RocnByaW9dLCBjcHUpOworCQl3YWtlX3VwX3Byb2Nlc3MoZGVzYy0+dGhyZWFkKTsKKwl9Cit9CisKK2ludCBpcGlwZV9zdGFydF9pcnFfdGhyZWFkKHVuc2lnbmVkIGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCWlmIChkZXNjLT50aHJlYWQgfHwgIWNyZWF0ZV9pcnFfdGhyZWFkcykKKwkJcmV0dXJuIDA7CisKKwlkZXNjLT50aHJlYWQgPSBrdGhyZWFkX2NyZWF0ZShkb19pcnFkLCBkZXNjLCAiSVJRICVkIiwgaXJxKTsKKwlpZiAoZGVzYy0+dGhyZWFkID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpcnFkOiBjb3VsZCBub3QgY3JlYXRlIElSUSB0aHJlYWQgJWQhXG4iLCBpcnEpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl3YWtlX3VwX3Byb2Nlc3MoZGVzYy0+dGhyZWFkKTsKKworCWRlc2MtPnRocl9oYW5kbGVyID0gaXBpcGVfcm9vdF9kb21haW4tPmlycXNbaXJxXS5oYW5kbGVyOworCWlwaXBlX3Jvb3RfZG9tYWluLT5pcnFzW2lycV0uaGFuZGxlciA9ICZraWNrX2lycWQ7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBfX2luaXQgaXBpcGVfaW5pdF9pcnFfdGhyZWFkcyh2b2lkKQoreworCXVuc2lnbmVkIGlycTsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2M7CisKKwljcmVhdGVfaXJxX3RocmVhZHMgPSAxOworCisJZm9yIChpcnEgPSAwOyBpcnEgPCBOUl9JUlFTOyBpcnErKykgeworCQlkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CisJCWlmIChkZXNjLT5hY3Rpb24gIT0gTlVMTCB8fAorCQkJKGRlc2MtPnN0YXR1cyAmIElSUV9OT1JFUVVFU1QpICE9IDApCisJCQlpcGlwZV9zdGFydF9pcnFfdGhyZWFkKGlycSwgZGVzYyk7CisJfQorfQorCitFWFBPUlRfU1lNQk9MKHNob3dfc3RhY2spOworCisjaWZkZWYgQ09ORklHX0lQSVBFX1RSQUNFX01DT1VOVAordm9pZCBub3RyYWNlIF9tY291bnQodm9pZCk7CitFWFBPUlRfU1lNQk9MKF9tY291bnQpOworI2VuZGlmIC8qIENPTkZJR19JUElQRV9UUkFDRV9NQ09VTlQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2lycWNoaXAuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2lycWNoaXAuYwppbmRleCAwNzQwMmY1Li5hYjgyMDljIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9pcnFjaGlwLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvaXJxY2hpcC5jCkBAIC0zNiw3ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3RyYWNlLmg+CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGlycV9lcnJfY291bnQ7CitzdGF0aWMgYXRvbWljX3QgaXJxX2Vycl9jb3VudDsKIHN0YXRpYyBzcGlubG9ja190IGlycV9jb250cm9sbGVyX2xvY2s7CiAKIC8qCkBAIC00OCwxMCArNDgsOSBAQAogCiB2b2lkIGFja19iYWRfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JaXJxX2Vycl9jb3VudCArPSAxOworCWF0b21pY19pbmMoJmlycV9lcnJfY291bnQpOwogCXByaW50ayhLRVJOX0VSUiAiSVJROiBzcHVyaW91cyBpbnRlcnJ1cHQgJWRcbiIsIGlycSk7CiB9Ci1FWFBPUlRfU1lNQk9MKGFja19iYWRfaXJxKTsKIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBiYWRfY2hpcCA9IHsKIAkuYWNrID0gZHVtbXlfbWFza191bm1hc2tfaXJxLApAQCAtNzIsNyArNzEsNyBAQAogCiBpbnQgc2hvd19pbnRlcnJ1cHRzKHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdikKIHsKLQlpbnQgaSA9ICoobG9mZl90ICopIHY7CisJaW50IGkgPSAqKGxvZmZfdCAqKSB2LCBqOwogCXN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC04MCwxOSArNzksMjAgQEAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmlycV9kZXNjW2ldLmxvY2ssIGZsYWdzKTsKIAkJYWN0aW9uID0gaXJxX2Rlc2NbaV0uYWN0aW9uOwogCQlpZiAoIWFjdGlvbikKLQkJCWdvdG8gdW5sb2NrOwotCi0JCXNlcV9wcmludGYocCwgIiUzZDogJTEwdSAiLCBpLCBrc3RhdF9pcnFzKGkpKTsKKwkJCWdvdG8gc2tpcDsKKwkJc2VxX3ByaW50ZihwLCAiJTNkOiAiLCBpKTsKKwkJZm9yX2VhY2hfb25saW5lX2NwdShqKQorCQkJc2VxX3ByaW50ZihwLCAiJTEwdSAiLCBrc3RhdF9jcHUoaikuaXJxc1tpXSk7CisJCXNlcV9wcmludGYocCwgIiAlOHMiLCBpcnFfZGVzY1tpXS5jaGlwLT5uYW1lKTsKIAkJc2VxX3ByaW50ZihwLCAiICAlcyIsIGFjdGlvbi0+bmFtZSk7CiAJCWZvciAoYWN0aW9uID0gYWN0aW9uLT5uZXh0OyBhY3Rpb247IGFjdGlvbiA9IGFjdGlvbi0+bmV4dCkKLQkJCXNlcV9wcmludGYocCwgIiwgJXMiLCBhY3Rpb24tPm5hbWUpOworCQkJc2VxX3ByaW50ZihwLCAiICAlcyIsIGFjdGlvbi0+bmFtZSk7CiAKIAkJc2VxX3B1dGMocCwgJ1xuJyk7Ci0gdW5sb2NrOgorIHNraXA6CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9kZXNjW2ldLmxvY2ssIGZsYWdzKTsKLQl9IGVsc2UgaWYgKGkgPT0gTlJfSVJRUykgewotCQlzZXFfcHJpbnRmKHAsICJFcnI6ICUxMGx1XG4iLCBpcnFfZXJyX2NvdW50KTsKLQl9CisJfSBlbHNlIGlmIChpID09IE5SX0lSUVMpCisJCXNlcV9wcmludGYocCwgIkVycjogJTEwdVxuIiwgIGF0b21pY19yZWFkKCZpcnFfZXJyX2NvdW50KSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwMSw3ICsxMDEsNiBAQAogICogY29tZSB2aWEgdGhpcyBmdW5jdGlvbi4gIEluc3RlYWQsIHRoZXkgc2hvdWxkIHByb3ZpZGUgdGhlaXIKICAqIG93biAnaGFuZGxlcicKICAqLwotCiAjaWZkZWYgQ09ORklHX0RPX0lSUV9MMQogX19hdHRyaWJ1dGVfXygobDFfdGV4dCkpCiAjZW5kaWYKQEAgLTEwOSw4ICsxMDgsOSBAQAogewogCXN0cnVjdCBwdF9yZWdzICpvbGRfcmVnczsKIAlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfZGVzYyArIGlycTsKKyNpZm5kZWYgQ09ORklHX0lQSVBFCiAJdW5zaWduZWQgc2hvcnQgcGVuZGluZywgb3RoZXJfaW50czsKLQorI2VuZGlmCiAJb2xkX3JlZ3MgPSBzZXRfaXJxX3JlZ3MocmVncyk7CiAKIAkvKgpAQCAtMTIxLDkgKzEyMSwyNCBAQAogCQlkZXNjID0gJmJhZF9pcnFfZGVzYzsKIAogCWlycV9lbnRlcigpOworI2lmZGVmIENPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XCisJLyogRGVidWdnaW5nIGNoZWNrIGZvciBzdGFjayBvdmVyZmxvdzogaXMgdGhlcmUgbGVzcyB0aGFuIFNUQUNLX1dBUk4gZnJlZT8gKi8KKwl7CisJCWxvbmcgc3A7CiAKKwkJc3AgPSBfX2dldF9TUCgpICYgKFRIUkVBRF9TSVpFLTEpOworCisJCWlmICh1bmxpa2VseShzcCA8IChzaXplb2Yoc3RydWN0IHRocmVhZF9pbmZvKSArIFNUQUNLX1dBUk4pKSkgeworCQkJZHVtcF9zdGFjaygpOworCQkJcHJpbnRrKEtFUk5fRU1FUkcgIiVzOiBwb3NzaWJsZSBzdGFjayBvdmVyZmxvdyB3aGlsZSBoYW5kbGluZyBpcnEgJWkgIgorCQkJCQkiIG9ubHkgJWxkIGJ5dGVzIGZyZWVcbiIsCisJCQkJX19mdW5jX18sIGlycSwgc3AgLSBzaXplb2Yoc3RydWN0IHRocmVhZF9pbmZvKSk7CisJCX0KKwl9CisjZW5kaWYKIAlnZW5lcmljX2hhbmRsZV9pcnEoaXJxKTsKIAorI2lmbmRlZiBDT05GSUdfSVBJUEUJLyogVXNlbGVzcyBhbmQgYnVnb3VzIG92ZXIgdGhlIEktcGlwZTogSVJRcyBhcmUgdGhyZWFkZWQuICovCiAJLyogSWYgd2UncmUgdGhlIG9ubHkgaW50ZXJydXB0IHJ1bm5pbmcgKGlnbm9yaW5nIElSUTE1IHdoaWNoIGlzIGZvcgogCSAgIHN5c2NhbGxzKSwgbG93ZXIgb3VyIHByaW9yaXR5IHRvIElSUTE0IHNvIHRoYXQgc29mdGlycXMgcnVuIGF0CiAJICAgdGhhdCBsZXZlbC4gIElmIHRoZXJlJ3MgYW5vdGhlciwgbG93ZXItbGV2ZWwgaW50ZXJydXB0LCBpcnFfZXhpdApAQCAtMTMzLDYgKzE0OCw3IEBACiAJb3RoZXJfaW50cyA9IHBlbmRpbmcgJiAocGVuZGluZyAtIDEpOwogCWlmIChvdGhlcl9pbnRzID09IDApCiAJCWxvd2VyX3RvX2lycTE0KCk7CisjZW5kaWYgLyogIUNPTkZJR19JUElQRSAqLwogCWlycV9leGl0KCk7CiAKIAlzZXRfaXJxX3JlZ3Mob2xkX3JlZ3MpOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwva2dkYi5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwva2dkYi5jCmluZGV4IGI3OTVhMjAuLmIxNjNmNmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2tnZGIuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9rZ2RiLmMKQEAgLTM0LDkgKzM0LDE0IEBACiAjZXJyb3IgY2hhbmdlIHRoZSBkZWZpbml0aW9uIG9mIHNsYXZlY3B1bG9ja3MKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX0JGSU5fV0RUCi0jIGVycm9yICJQbGVhc2UgdW5zZWxlY3QgYmxhY2tmaW4gd2F0Y2hkb2cgZHJpdmVyIGJlZm9yZSBidWlsZCBLR0RCLiIKLSNlbmRpZgorI2RlZmluZSBJTl9NRU0oYWRkciwgc2l6ZSwgbDFfYWRkciwgbDFfc2l6ZSkgXAorKHsgXAorCXVuc2lnbmVkIGxvbmcgX19hZGRyID0gKHVuc2lnbmVkIGxvbmcpKGFkZHIpOyBcCisJKGwxX3NpemUgJiYgX19hZGRyID49IGwxX2FkZHIgJiYgX19hZGRyICsgKHNpemUpIDw9IGwxX2FkZHIgKyBsMV9zaXplKTsgXAorfSkKKyNkZWZpbmUgQVNZTkNfQkFOS19TSVpFIFwKKwkoQVNZTkNfQkFOSzBfU0laRSArIEFTWU5DX0JBTksxX1NJWkUgKyBcCisJIEFTWU5DX0JBTksyX1NJWkUgKyBBU1lOQ19CQU5LM19TSVpFKQogCiB2b2lkIHB0X3JlZ3NfdG9fZ2RiX3JlZ3ModW5zaWduZWQgbG9uZyAqZ2RiX3JlZ3MsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewpAQCAtMTA1LDcgKzExMCw3IEBACiAgKiBFeHRyYWN0cyBlYnAsIGVzcCBhbmQgZWlwIHZhbHVlcyB1bmRlcnN0YW5kYWJsZSBieSBnZGIgZnJvbSB0aGUgdmFsdWVzCiAgKiBzYXZlZCBieSBzd2l0Y2hfdG8uCiAgKiB0aHJlYWQuZXNwIHBvaW50cyB0byBlYnAuIGZsYWdzIGFuZCBlYnAgYXJlIHB1c2hlZCBpbiBzd2l0Y2hfdG8gaGVuY2UgZXNwCi0gKiBwcmlvciB0byBlbnRlcmluZyBzd2l0Y2hfdG8gaXMgOCBncmVhdGVyIHRoZW4gdGhlIHZhbHVlIHRoYXQgaXMgc2F2ZWQuCisgKiBwcmlvciB0byBlbnRlcmluZyBzd2l0Y2hfdG8gaXMgOCBncmVhdGVyIHRoYW4gdGhlIHZhbHVlIHRoYXQgaXMgc2F2ZWQuCiAgKiBJZiBzd2l0Y2hfdG8gY2hhbmdlcywgY2hhbmdlIGZvbGxvd2luZyBjb2RlIGFwcHJvcHJpYXRlbHkuCiAgKi8KIHZvaWQgc2xlZXBpbmdfdGhyZWFkX3RvX2dkYl9yZWdzKHVuc2lnbmVkIGxvbmcgKmdkYl9yZWdzLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCkBAIC0yMTksNiArMjI0LDcgQEAKIAkJaWYgKGJmaW5fdHlwZSA9PSBicmVha2luZm9bYnJlYWtub10udHlwZQogCQkJJiYgIWJyZWFraW5mb1ticmVha25vXS5vY2N1cGllZCkgewogCQkJYnJlYWtpbmZvW2JyZWFrbm9dLm9jY3VwaWVkID0gMTsKKwkJCWJyZWFraW5mb1ticmVha25vXS5za2lwID0gMDsKIAkJCWJyZWFraW5mb1ticmVha25vXS5lbmFibGVkID0gMTsKIAkJCWJyZWFraW5mb1ticmVha25vXS5hZGRyID0gYWRkcjsKIAkJCWJyZWFraW5mb1ticmVha25vXS5kYXRhYWNjID0gZGF0YWFjYzsKQEAgLTM2MywxMiArMzY5LDEyIEBACiAKIHZvaWQga2dkYl9yb3VuZHVwX2NwdXModW5zaWduZWQgbG9uZyBmbGFncykKIHsKLQlzbXBfY2FsbF9mdW5jdGlvbihrZ2RiX3Bhc3NpdmVfY3B1X2NhbGxiYWNrLCBOVUxMLCAwLCAwKTsKKwlzbXBfY2FsbF9mdW5jdGlvbihrZ2RiX3Bhc3NpdmVfY3B1X2NhbGxiYWNrLCBOVUxMLCAwKTsKIH0KIAogdm9pZCBrZ2RiX3JvdW5kdXBfY3B1KGludCBjcHUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7Ci0Jc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNwdSwga2dkYl9wYXNzaXZlX2NwdV9jYWxsYmFjaywgTlVMTCwgMCwgMCk7CisJc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNwdSwga2dkYl9wYXNzaXZlX2NwdV9jYWxsYmFjaywgTlVMTCwgMCk7CiB9CiAjZW5kaWYKIApAQCAtMzg1LDEwICszOTEsOCBAQAogCQkJICAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCWxvbmcgYWRkcjsKLQlsb25nIGJyZWFrbm87CiAJY2hhciAqcHRyOwogCWludCBuZXdQQzsKLQlpbnQgd3Bfc3RhdHVzOwogCWludCBpOwogCiAJc3dpdGNoIChyZW1jb21faW5fYnVmZmVyWzBdKSB7CkBAIC00MjYsMTcgKzQzMCw2IEBACiAJCQlrZ2RiX3NpbmdsZV9zdGVwID0gaSArIDE7CiAJCX0KIAotCQlpZiAodmVjdG9yID09IFZFQ19XQVRDSCkgewotCQkJd3Bfc3RhdHVzID0gYmZpbl9yZWFkX1dQU1RBVCgpOwotCQkJZm9yIChicmVha25vID0gMDsgYnJlYWtubyA8IEhXX1dBVENIUE9JTlRfTlVNOyBicmVha25vKyspIHsKLQkJCQlpZiAod3Bfc3RhdHVzICYgKDEgPDwgYnJlYWtubykpIHsKLQkJCQkJYnJlYWtpbmZvLT5za2lwID0gMTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJYmZpbl93cml0ZV9XUFNUQVQoMCk7Ci0JCX0KLQogCQliZmluX2NvcnJlY3RfaHdfYnJlYWsoKTsKIAogCQlyZXR1cm4gMDsKQEAgLTQ3OCw1NyArNDcxLDMyIEBACiAJCXJldHVybiAwOwogCWlmIChhZGRyID49IFNZU01NUl9CQVNFKQogCQlyZXR1cm4gMDsKLQlpZiAoYWRkciA+PSBBU1lOQ19CQU5LMF9CQVNFCi0JICAgJiYgYWRkciArIHNpemUgPD0gQVNZTkNfQkFOSzNfQkFTRSArIEFTWU5DX0JBTkszX1NJWkUpCisJaWYgKElOX01FTShhZGRyLCBzaXplLCBBU1lOQ19CQU5LMF9CQVNFLCBBU1lOQ19CQU5LX1NJWkUpKQogCQlyZXR1cm4gMDsKIAlpZiAoY3B1ID09IDApIHsKLQkJaWYgKGFkZHIgPj0gTDFfU0NSQVRDSF9TVEFSVAotCQkgICAmJiAoYWRkciArIHNpemUgPD0gTDFfU0NSQVRDSF9TVEFSVCArIEwxX1NDUkFUQ0hfTEVOR1RIKSkKKwkJaWYgKElOX01FTShhZGRyLCBzaXplLCBMMV9TQ1JBVENIX1NUQVJULCBMMV9TQ1JBVENIX0xFTkdUSCkpCiAJCQlyZXR1cm4gMDsKLSNpZiBMMV9DT0RFX0xFTkdUSCAhPSAwCi0JCWlmIChhZGRyID49IEwxX0NPREVfU1RBUlQKLQkJICAgJiYgKGFkZHIgKyBzaXplIDw9IEwxX0NPREVfU1RBUlQgKyBMMV9DT0RFX0xFTkdUSCkpCisJCWlmIChJTl9NRU0oYWRkciwgc2l6ZSwgTDFfQ09ERV9TVEFSVCwgTDFfQ09ERV9MRU5HVEgpKQogCQkJcmV0dXJuIDA7Ci0jZW5kaWYKLSNpZiBMMV9EQVRBX0FfTEVOR1RIICE9IDAKLQkJaWYgKGFkZHIgPj0gTDFfREFUQV9BX1NUQVJUCi0JCSAgICYmIChhZGRyICsgc2l6ZSA8PSBMMV9EQVRBX0FfU1RBUlQgKyBMMV9EQVRBX0FfTEVOR1RIKSkKKwkJaWYgKElOX01FTShhZGRyLCBzaXplLCBMMV9EQVRBX0FfU1RBUlQsIEwxX0RBVEFfQV9MRU5HVEgpKQogCQkJcmV0dXJuIDA7Ci0jZW5kaWYKLSNpZiBMMV9EQVRBX0JfTEVOR1RIICE9IDAKLQkJaWYgKGFkZHIgPj0gTDFfREFUQV9CX1NUQVJUCi0JCSAgICYmIChhZGRyICsgc2l6ZSA8PSBMMV9EQVRBX0JfU1RBUlQgKyBMMV9EQVRBX0JfTEVOR1RIKSkKKwkJaWYgKElOX01FTShhZGRyLCBzaXplLCBMMV9EQVRBX0JfU1RBUlQsIEwxX0RBVEFfQl9MRU5HVEgpKQogCQkJcmV0dXJuIDA7Ci0jZW5kaWYKICNpZmRlZiBDT05GSUdfU01QCiAJfSBlbHNlIGlmIChjcHUgPT0gMSkgewotCQlpZiAoYWRkciA+PSBDT1JFQl9MMV9TQ1JBVENIX1NUQVJUCi0JCSAgICYmIChhZGRyICsgc2l6ZSA8PSBDT1JFQl9MMV9TQ1JBVENIX1NUQVJUCi0JCSAgICsgTDFfU0NSQVRDSF9MRU5HVEgpKQorCQlpZiAoSU5fTUVNKGFkZHIsIHNpemUsIENPUkVCX0wxX1NDUkFUQ0hfU1RBUlQsIEwxX1NDUkFUQ0hfTEVOR1RIKSkKIAkJCXJldHVybiAwOwotIyBpZiBMMV9DT0RFX0xFTkdUSCAhPSAwCi0JCWlmIChhZGRyID49IENPUkVCX0wxX0NPREVfU1RBUlQKLQkJICAgJiYgKGFkZHIgKyBzaXplIDw9IENPUkVCX0wxX0NPREVfU1RBUlQgKyBMMV9DT0RFX0xFTkdUSCkpCisJCWlmIChJTl9NRU0oYWRkciwgc2l6ZSwgQ09SRUJfTDFfQ09ERV9TVEFSVCwgTDFfQ09ERV9MRU5HVEgpKQogCQkJcmV0dXJuIDA7Ci0jIGVuZGlmCi0jIGlmIEwxX0RBVEFfQV9MRU5HVEggIT0gMAotCQlpZiAoYWRkciA+PSBDT1JFQl9MMV9EQVRBX0FfU1RBUlQKLQkJICAgJiYgKGFkZHIgKyBzaXplIDw9IENPUkVCX0wxX0RBVEFfQV9TVEFSVCArIEwxX0RBVEFfQV9MRU5HVEgpKQorCQlpZiAoSU5fTUVNKGFkZHIsIHNpemUsIENPUkVCX0wxX0RBVEFfQV9TVEFSVCwgTDFfREFUQV9BX0xFTkdUSCkpCiAJCQlyZXR1cm4gMDsKLSMgZW5kaWYKLSMgaWYgTDFfREFUQV9CX0xFTkdUSCAhPSAwCi0JCWlmIChhZGRyID49IENPUkVCX0wxX0RBVEFfQl9TVEFSVAotCQkgICAmJiAoYWRkciArIHNpemUgPD0gQ09SRUJfTDFfREFUQV9CX1NUQVJUICsgTDFfREFUQV9CX0xFTkdUSCkpCisJCWlmIChJTl9NRU0oYWRkciwgc2l6ZSwgQ09SRUJfTDFfREFUQV9CX1NUQVJULCBMMV9EQVRBX0JfTEVOR1RIKSkKIAkJCXJldHVybiAwOwotIyBlbmRpZgogI2VuZGlmCiAJfQogCi0jaWYgTDJfTEVOR1RIICE9IDAKLQlpZiAoYWRkciA+PSBMMl9TVEFSVAotCSAgICYmIGFkZHIgKyBzaXplIDw9IEwyX1NUQVJUICsgTDJfTEVOR1RIKQorCWlmIChJTl9NRU0oYWRkciwgc2l6ZSwgTDJfU1RBUlQsIEwyX0xFTkdUSCkpCiAJCXJldHVybiAwOwotI2VuZGlmCiAKIAlyZXR1cm4gRUZBVUxUOwogfQpAQCAtNTgyLDEyICs1NTAsOSBAQAogCQlkZWZhdWx0OgogCQkJZXJyID0gRUZBVUxUOwogCQl9Ci0JfSBlbHNlIGlmIChjcHUgPT0gMCAmJiAodW5zaWduZWQgaW50KW1lbSA+PSBMMV9DT0RFX1NUQVJUICYmCi0JCSh1bnNpZ25lZCBpbnQpKG1lbSArIGNvdW50KSA8PSBMMV9DT0RFX1NUQVJUICsgTDFfQ09ERV9MRU5HVEgKKwl9IGVsc2UgaWYgKChjcHUgPT0gMCAmJiBJTl9NRU0obWVtLCBjb3VudCwgTDFfQ09ERV9TVEFSVCwgTDFfQ09ERV9MRU5HVEgpKQogI2lmZGVmIENPTkZJR19TTVAKLQkJfHwgY3B1ID09IDEgJiYgKHVuc2lnbmVkIGludCltZW0gPj0gQ09SRUJfTDFfQ09ERV9TVEFSVCAmJgotCQkodW5zaWduZWQgaW50KShtZW0gKyBjb3VudCkgPD0KLQkJQ09SRUJfTDFfQ09ERV9TVEFSVCArIEwxX0NPREVfTEVOR1RICisJCXx8IChjcHUgPT0gMSAmJiBJTl9NRU0obWVtLCBjb3VudCwgQ09SRUJfTDFfQ09ERV9TVEFSVCwgTDFfQ09ERV9MRU5HVEgpKQogI2VuZGlmCiAJCSkgewogCQkvKiBhY2Nlc3MgTDEgaW5zdHJ1Y3Rpb24gU1JBTSovCkBAIC02NTgsMTIgKzYyMyw5IEBACiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gRUZBVUxUOwogCQl9Ci0JfSBlbHNlIGlmIChjcHUgPT0gMCAmJiAodW5zaWduZWQgaW50KW1lbSA+PSBMMV9DT0RFX1NUQVJUICYmCi0JCSh1bnNpZ25lZCBpbnQpKG1lbSArIGNvdW50KSA8IEwxX0NPREVfU1RBUlQgKyBMMV9DT0RFX0xFTkdUSAorCX0gZWxzZSBpZiAoKGNwdSA9PSAwICYmIElOX01FTShtZW0sIGNvdW50LCBMMV9DT0RFX1NUQVJULCBMMV9DT0RFX0xFTkdUSCkpCiAjaWZkZWYgQ09ORklHX1NNUAotCQl8fCBjcHUgPT0gMSAmJiAodW5zaWduZWQgaW50KW1lbSA+PSBDT1JFQl9MMV9DT0RFX1NUQVJUICYmCi0JCSh1bnNpZ25lZCBpbnQpKG1lbSArIGNvdW50KSA8PQotCQlDT1JFQl9MMV9DT0RFX1NUQVJUICsgTDFfQ09ERV9MRU5HVEgKKwkJfHwgKGNwdSA9PSAxICYmIElOX01FTShtZW0sIGNvdW50LCBDT1JFQl9MMV9DT0RFX1NUQVJULCBMMV9DT0RFX0xFTkdUSCkpCiAjZW5kaWYKIAkJKSB7CiAJCS8qIGFjY2VzcyBMMSBpbnN0cnVjdGlvbiBTUkFNICovCkBAIC03MjMsMTIgKzY4NSw5IEBACiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gRUZBVUxUOwogCQl9Ci0JfSBlbHNlIGlmIChjcHUgPT0gMCAmJiAodW5zaWduZWQgaW50KW1lbSA+PSBMMV9DT0RFX1NUQVJUICYmCi0JCSh1bnNpZ25lZCBpbnQpKG1lbSArIGNvdW50KSA8PSBMMV9DT0RFX1NUQVJUICsgTDFfQ09ERV9MRU5HVEgKKwl9IGVsc2UgaWYgKChjcHUgPT0gMCAmJiBJTl9NRU0obWVtLCBjb3VudCwgTDFfQ09ERV9TVEFSVCwgTDFfQ09ERV9MRU5HVEgpKQogI2lmZGVmIENPTkZJR19TTVAKLQkJfHwgY3B1ID09IDEgJiYgKHVuc2lnbmVkIGludCltZW0gPj0gQ09SRUJfTDFfQ09ERV9TVEFSVCAmJgotCQkodW5zaWduZWQgaW50KShtZW0gKyBjb3VudCkgPD0KLQkJQ09SRUJfTDFfQ09ERV9TVEFSVCArIEwxX0NPREVfTEVOR1RICisJCXx8IChjcHUgPT0gMSAmJiBJTl9NRU0obWVtLCBjb3VudCwgQ09SRUJfTDFfQ09ERV9TVEFSVCwgTDFfQ09ERV9MRU5HVEgpKQogI2VuZGlmCiAJCSkgewogCQkvKiBhY2Nlc3MgTDEgaW5zdHJ1Y3Rpb24gU1JBTSAqLwpAQCAtNzQ1LDI0ICs3MDQsMTYgQEAKIAogCWlmIChhZGRyID49IDB4MTAwMCAmJiAoYWRkciArIEJSRUFLX0lOU1RSX1NJWkUpIDw9IHBoeXNpY2FsX21lbV9lbmQpCiAJCXJldHVybiAwOwotCWlmIChhZGRyID49IEFTWU5DX0JBTkswX0JBU0UKLQkgICAmJiBhZGRyICsgQlJFQUtfSU5TVFJfU0laRSA8PSBBU1lOQ19CQU5LM19CQVNFICsgQVNZTkNfQkFOSzNfQkFTRSkKKwlpZiAoSU5fTUVNKGFkZHIsIEJSRUFLX0lOU1RSX1NJWkUsIEFTWU5DX0JBTkswX0JBU0UsIEFTWU5DX0JBTktfU0laRSkpCiAJCXJldHVybiAwOwotI2lmIEwxX0NPREVfTEVOR1RIICE9IDAKLQlpZiAoY3B1ID09IDAgJiYgYWRkciA+PSBMMV9DT0RFX1NUQVJUCi0JICAgJiYgYWRkciArIEJSRUFLX0lOU1RSX1NJWkUgPD0gTDFfQ09ERV9TVEFSVCArIEwxX0NPREVfTEVOR1RIKQorCWlmIChjcHUgPT0gMCAmJiBJTl9NRU0oYWRkciwgQlJFQUtfSU5TVFJfU0laRSwgTDFfQ09ERV9TVEFSVCwgTDFfQ09ERV9MRU5HVEgpKQogCQlyZXR1cm4gMDsKLSMgaWZkZWYgQ09ORklHX1NNUAotCWVsc2UgaWYgKGNwdSA9PSAxICYmIGFkZHIgPj0gQ09SRUJfTDFfQ09ERV9TVEFSVAotCSAgICYmIGFkZHIgKyBCUkVBS19JTlNUUl9TSVpFIDw9IENPUkVCX0wxX0NPREVfU1RBUlQgKyBMMV9DT0RFX0xFTkdUSCkKLQkJcmV0dXJuIDA7Ci0jIGVuZGlmCi0jZW5kaWYKLSNpZiBMMl9MRU5HVEggIT0gMAotCWlmIChhZGRyID49IEwyX1NUQVJUCi0JICAgJiYgYWRkciArIEJSRUFLX0lOU1RSX1NJWkUgPD0gTDJfU1RBUlQgKyBMMl9MRU5HVEgpCisjaWZkZWYgQ09ORklHX1NNUAorCWVsc2UgaWYgKGNwdSA9PSAxICYmIElOX01FTShhZGRyLCBCUkVBS19JTlNUUl9TSVpFLCBDT1JFQl9MMV9DT0RFX1NUQVJULCBMMV9DT0RFX0xFTkdUSCkpCiAJCXJldHVybiAwOwogI2VuZGlmCisJaWYgKElOX01FTShhZGRyLCBCUkVBS19JTlNUUl9TSVpFLCBMMl9TVEFSVCwgTDJfTEVOR1RIKSkKKwkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gRUZBVUxUOwogfQpAQCAtNzcyLDEzICs3MjMsOSBAQAogCWludCBlcnI7CiAJaW50IGNwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CiAKLQlpZiAoKGNwdSA9PSAwICYmICh1bnNpZ25lZCBpbnQpYWRkciA+PSBMMV9DT0RFX1NUQVJUCi0JCSYmICh1bnNpZ25lZCBpbnQpKGFkZHIgKyBCUkVBS19JTlNUUl9TSVpFKQotCQk8IEwxX0NPREVfU1RBUlQgKyBMMV9DT0RFX0xFTkdUSCkKKwlpZiAoKGNwdSA9PSAwICYmIElOX01FTShhZGRyLCBCUkVBS19JTlNUUl9TSVpFLCBMMV9DT0RFX1NUQVJULCBMMV9DT0RFX0xFTkdUSCkpCiAjaWZkZWYgQ09ORklHX1NNUAotCQl8fCAoY3B1ID09IDEgJiYgKHVuc2lnbmVkIGludClhZGRyID49IENPUkVCX0wxX0NPREVfU1RBUlQKLQkJJiYgKHVuc2lnbmVkIGludCkoYWRkciArIEJSRUFLX0lOU1RSX1NJWkUpCi0JCTwgQ09SRUJfTDFfQ09ERV9TVEFSVCArIEwxX0NPREVfTEVOR1RIKQorCQl8fCAoY3B1ID09IDEgJiYgSU5fTUVNKGFkZHIsIEJSRUFLX0lOU1RSX1NJWkUsIENPUkVCX0wxX0NPREVfU1RBUlQsIEwxX0NPREVfTEVOR1RIKSkKICNlbmRpZgogCQkpIHsKIAkJLyogYWNjZXNzIEwxIGluc3RydWN0aW9uIFNSQU0gKi8KQEAgLTgwNCw5ICs3NTEsNyBAQAogCiBpbnQga2dkYl9hcmNoX3JlbW92ZV9icmVha3BvaW50KHVuc2lnbmVkIGxvbmcgYWRkciwgY2hhciAqYnVuZGxlKQogewotCWlmICgodW5zaWduZWQgaW50KWFkZHIgPj0gTDFfQ09ERV9TVEFSVCAmJgotCQkodW5zaWduZWQgaW50KShhZGRyICsgQlJFQUtfSU5TVFJfU0laRSkgPAotCQkJTDFfQ09ERV9TVEFSVCArIEwxX0NPREVfTEVOR1RIKSB7CisJaWYgKElOX01FTShhZGRyLCBCUkVBS19JTlNUUl9TSVpFLCBMMV9DT0RFX1NUQVJULCBMMV9DT0RFX0xFTkdUSCkpIHsKIAkJLyogYWNjZXNzIEwxIGluc3RydWN0aW9uIFNSQU0gKi8KIAkJaWYgKGRtYV9tZW1jcHkoKHZvaWQgKilhZGRyLCBidW5kbGUsIEJSRUFLX0lOU1RSX1NJWkUpID09IE5VTEwpCiAJCQlyZXR1cm4gLUVGQVVMVDsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2tnZGJfdGVzdC5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwva2dkYl90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RiYTljMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2tnZGJfdGVzdC5jCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogYXJjaC9ibGFja2Zpbi9rZXJuZWwva2dkYl90ZXN0LmMgLSBCbGFja2ZpbiBrZ2RiIHRlc3RzCisgKgorICogQ29weXJpZ2h0IDIwMDUtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorCisjaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgorCitzdGF0aWMgY2hhciBjbWRsaW5lWzI1Nl07CitzdGF0aWMgdW5zaWduZWQgbG9uZyBsZW47CisKK3N0YXRpYyBpbnQgbnVtMSBfX2F0dHJpYnV0ZV9fKChsMV9kYXRhKSk7CisKK3ZvaWQga2dkYl9sMV90ZXN0KHZvaWQpIF9fYXR0cmlidXRlX18oKGwxX3RleHQpKTsKKwordm9pZCBrZ2RiX2wxX3Rlc3Qodm9pZCkKK3sKKwlwcmludGsoS0VSTl9BTEVSVCAiTDEoYmVmb3JlIGNoYW5nZSkgOiBkYXRhIHZhcmlhYmxlIGFkZHIgPSAweCVwLCBkYXRhIHZhbHVlIGlzICVkXG4iLCAmbnVtMSwgbnVtMSk7CisJcHJpbnRrKEtFUk5fQUxFUlQgIkwxIDogY29kZSBmdW5jdGlvbiBhZGRyID0gMHglcFxuIiwga2dkYl9sMV90ZXN0KTsKKwludW0xID0gbnVtMSArIDEwIDsKKwlwcmludGsoS0VSTl9BTEVSVCAiTDEoYWZ0ZXIgY2hhbmdlKSA6IGRhdGEgdmFyaWFibGUgYWRkciA9IDB4JXAsIGRhdGEgdmFsdWUgaXMgJWRcbiIsICZudW0xLCBudW0xKTsKKwlyZXR1cm4gOworfQorI2lmIEwyX0xFTkdUSAorCitzdGF0aWMgaW50IG51bTIgX19hdHRyaWJ1dGVfXygobDIpKTsKK3ZvaWQga2dkYl9sMl90ZXN0KHZvaWQpIF9fYXR0cmlidXRlX18oKGwyKSk7CisKK3ZvaWQga2dkYl9sMl90ZXN0KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fQUxFUlQgIkwyKGJlZm9yZSBjaGFuZ2UpIDogZGF0YSB2YXJpYWJsZSBhZGRyID0gMHglcCwgZGF0YSB2YWx1ZSBpcyAlZFxuIiwgJm51bTIsIG51bTIpOworCXByaW50ayhLRVJOX0FMRVJUICJMMiA6IGNvZGUgZnVuY3Rpb24gYWRkciA9IDB4JXBcbiIsIGtnZGJfbDJfdGVzdCk7CisJbnVtMiA9IG51bTIgKyAyMCA7CisJcHJpbnRrKEtFUk5fQUxFUlQgIkwyKGFmdGVyIGNoYW5nZSkgOiBkYXRhIHZhcmlhYmxlIGFkZHIgPSAweCVwLCBkYXRhIHZhbHVlIGlzICVkXG4iLCAmbnVtMiwgbnVtMik7CisJcmV0dXJuIDsKK30KKworI2VuZGlmCisKKworaW50IGtnZGJfdGVzdChjaGFyICpuYW1lLCBpbnQgbGVuLCBpbnQgY291bnQsIGludCB6KQoreworCXByaW50ayhLRVJOX0RFQlVHICJrZ2RiIG5hbWUoJWQpOiAlcywgJWQsICVkXG4iLCBsZW4sIG5hbWUsIGNvdW50LCB6KTsKKwljb3VudCA9IHo7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IHRlc3RfcHJvY19vdXRwdXQoY2hhciAqYnVmKQoreworCWtnZGJfdGVzdCgiaGVsbG8gd29ybGQhIiwgMTIsIDB4NTUsIDB4MTApOworCWtnZGJfbDFfdGVzdCgpOworCSNpZiBMMl9MRU5HVEgKKwlrZ2RiX2wyX3Rlc3QoKTsKKwkjZW5kaWYKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRlc3RfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkJCSBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWludCBsZW47CisKKwlsZW4gPSB0ZXN0X3Byb2Nfb3V0cHV0KHBhZ2UpOworCWlmIChsZW4gPD0gb2ZmK2NvdW50KQorCQkqZW9mID0gMTsKKwkqc3RhcnQgPSBwYWdlICsgb2ZmOworCWxlbiAtPSBvZmY7CisJaWYgKGxlbiA+IGNvdW50KQorCQlsZW4gPSBjb3VudDsKKwlpZiAobGVuIDwgMCkKKwkJbGVuID0gMDsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IHRlc3Rfd3JpdGVfcHJvYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmZmVyLAorCQkJCSB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQoreworCWlmIChjb3VudCA+PSAyNTYpCisJCWxlbiA9IDI1NTsKKwllbHNlCisJCWxlbiA9IGNvdW50OworCisJbWVtY3B5KGNtZGxpbmUsIGJ1ZmZlciwgY291bnQpOworCWNtZGxpbmVbbGVuXSA9IDA7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IF9faW5pdCBrZ2RidGVzdF9pbml0KHZvaWQpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeTsKKworCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoImtnZGJ0ZXN0IiwgMCwgTlVMTCk7CisJaWYgKGVudHJ5ID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJZW50cnktPnJlYWRfcHJvYyA9IHRlc3RfcmVhZF9wcm9jOworCWVudHJ5LT53cml0ZV9wcm9jID0gdGVzdF93cml0ZV9wcm9jOworCWVudHJ5LT5kYXRhID0gTlVMTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQga2dkYnRlc3RfZXhpdCh2b2lkKQoreworCXJlbW92ZV9wcm9jX2VudHJ5KCJrZ2RidGVzdCIsIE5VTEwpOworfQorCittb2R1bGVfaW5pdChrZ2RidGVzdF9pbml0KTsKK21vZHVsZV9leGl0KGtnZGJ0ZXN0X2V4aXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvbWNvdW50LlMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9tY291bnQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGNmYjM4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvbWNvdW50LlMKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYmxhY2tmaW4vbWNvdW50LlMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIDIwMDcvMDQvMTIgU2F2ZSBpbmRleCwgbGVuZ3RoLCBtb2RpZnkgYW5kIGJhc2UgcmVnaXN0ZXJzLiAtLXJwbQorICovCisKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CisKKy50ZXh0CisKKy5hbGlnbiA0IAkvKiBqdXN0IGluIGNhc2UgKi8KKworRU5UUlkoX19tY291bnQpCisJWy0tc3BdID0gaTA7CisJWy0tc3BdID0gaTE7CisJWy0tc3BdID0gaTI7CisJWy0tc3BdID0gaTM7CisJWy0tc3BdID0gbDA7CisJWy0tc3BdID0gbDE7CisJWy0tc3BdID0gbDI7CisJWy0tc3BdID0gbDM7CisJWy0tc3BdID0gbTA7CisJWy0tc3BdID0gbTE7CisJWy0tc3BdID0gbTI7CisJWy0tc3BdID0gbTM7CisJWy0tc3BdID0gYjA7CisJWy0tc3BdID0gYjE7CisJWy0tc3BdID0gYjI7CisJWy0tc3BdID0gYjM7CisJWy0tc3BdID0gKCByNzowLCBwNTowICk7CisJWy0tc3BdID0gQVNUQVQ7CisKKwlwMS5MID0gX2lwaXBlX3RyYWNlX2VuYWJsZTsKKwlwMS5IID0gX2lwaXBlX3RyYWNlX2VuYWJsZTsKKwlyNyA9IFtwMV07CisJQ0MgPSByNyA9PSAwOworCWlmIENDIGp1bXAgb3V0OworCWxpbmsgMHgxMDsKKwlyMCA9IDB4MDsKKwlbc3AgKyAweGNdID0gcjA7IC8qIHYgKi8KKwlyMCA9IDB4MDsJLyogdHlwZTogSVBJUEVfVFJBQ0VfRk4gKi8KKwlyMSA9IHJldHM7CisJcDAgPSBbZnBdOwkvKiBwMDogUHJpb3IgRlAgKi8KKwlyMiA9IFtwMCArIDRdOwkvKiByMjogUHJpb3IgUkVUUyAqLworCWNhbGwgX19faXBpcGVfdHJhY2U7CisJdW5saW5rOworb3V0OgorCUFTVEFUID0gW3NwKytdOworCSggcjc6MCwgcDU6MCApID0gW3NwKytdOworCWIzID0gW3NwKytdOworCWIyID0gW3NwKytdOworCWIxID0gW3NwKytdOworCWIwID0gW3NwKytdOworCW0zID0gW3NwKytdOworCW0yID0gW3NwKytdOworCW0xID0gW3NwKytdOworCW0wID0gW3NwKytdOworCWwzID0gW3NwKytdOworCWwyID0gW3NwKytdOworCWwxID0gW3NwKytdOworCWwwID0gW3NwKytdOworCWkzID0gW3NwKytdOworCWkyID0gW3NwKytdOworCWkxID0gW3NwKytdOworCWkwID0gW3NwKytdOworCXJ0czsKK0VORFBST0MoX19tY291bnQpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9tb2R1bGUuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL21vZHVsZS5jCmluZGV4IGUxYmViYzguLjFiZDdmMmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL21vZHVsZS5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL21vZHVsZS5jCkBAIC0zNywxMTEgKzM3LDYgQEAKICNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KIAotLyoKLSAqIGhhbmRsZSBhcml0aG1ldGljIHJlbG9jYXRpb25zLgotICogU2VlIGJpbnV0aWxzL2JmZC9lbGYzMi1iZmluLmMgZm9yIG1vcmUgZGV0YWlscwotICovCi0jZGVmaW5lIFJFTE9DX1NUQUNLX1NJWkUgMTAwCi1zdGF0aWMgdWludDMyX3QgcmVsb2Nfc3RhY2tbUkVMT0NfU1RBQ0tfU0laRV07Ci1zdGF0aWMgdW5zaWduZWQgaW50IHJlbG9jX3N0YWNrX3RvczsKLQotI2RlZmluZSBpc19yZWxvY19zdGFja19lbXB0eSgpICgocmVsb2Nfc3RhY2tfdG9zID4gMCk/MDoxKQotCi1zdGF0aWMgdm9pZCByZWxvY19zdGFja19wdXNoKHVpbnQzMl90IHZhbHVlKQotewotCXJlbG9jX3N0YWNrW3JlbG9jX3N0YWNrX3RvcysrXSA9IHZhbHVlOwotfQotCi1zdGF0aWMgdWludDMyX3QgcmVsb2Nfc3RhY2tfcG9wKHZvaWQpCi17Ci0JcmV0dXJuIHJlbG9jX3N0YWNrWy0tcmVsb2Nfc3RhY2tfdG9zXTsKLX0KLQotc3RhdGljIHVpbnQzMl90IHJlbG9jX3N0YWNrX29wZXJhdGUodW5zaWduZWQgaW50IG9wZXIsIHN0cnVjdCBtb2R1bGUgKm1vZCkKLXsKLQl1aW50MzJfdCB2YWx1ZTsKLQotCXN3aXRjaCAob3BlcikgewotCWNhc2UgUl9hZGQ6Ci0JCXZhbHVlID0gcmVsb2Nfc3RhY2tbcmVsb2Nfc3RhY2tfdG9zIC0gMl0gKwotCQkJcmVsb2Nfc3RhY2tbcmVsb2Nfc3RhY2tfdG9zIC0gMV07Ci0JCXJlbG9jX3N0YWNrX3RvcyAtPSAyOwotCQlicmVhazsKLQljYXNlIFJfc3ViOgotCQl2YWx1ZSA9IHJlbG9jX3N0YWNrW3JlbG9jX3N0YWNrX3RvcyAtIDJdIC0KLQkJCXJlbG9jX3N0YWNrW3JlbG9jX3N0YWNrX3RvcyAtIDFdOwotCQlyZWxvY19zdGFja190b3MgLT0gMjsKLQkJYnJlYWs7Ci0JY2FzZSBSX211bHQ6Ci0JCXZhbHVlID0gcmVsb2Nfc3RhY2tbcmVsb2Nfc3RhY2tfdG9zIC0gMl0gKgotCQkJcmVsb2Nfc3RhY2tbcmVsb2Nfc3RhY2tfdG9zIC0gMV07Ci0JCXJlbG9jX3N0YWNrX3RvcyAtPSAyOwotCQlicmVhazsKLQljYXNlIFJfZGl2OgotCQl2YWx1ZSA9IHJlbG9jX3N0YWNrW3JlbG9jX3N0YWNrX3RvcyAtIDJdIC8KLQkJCXJlbG9jX3N0YWNrW3JlbG9jX3N0YWNrX3RvcyAtIDFdOwotCQlyZWxvY19zdGFja190b3MgLT0gMjsKLQkJYnJlYWs7Ci0JY2FzZSBSX21vZDoKLQkJdmFsdWUgPSByZWxvY19zdGFja1tyZWxvY19zdGFja190b3MgLSAyXSAlCi0JCQlyZWxvY19zdGFja1tyZWxvY19zdGFja190b3MgLSAxXTsKLQkJcmVsb2Nfc3RhY2tfdG9zIC09IDI7Ci0JCWJyZWFrOwotCWNhc2UgUl9sc2hpZnQ6Ci0JCXZhbHVlID0gcmVsb2Nfc3RhY2tbcmVsb2Nfc3RhY2tfdG9zIC0gMl0gPDwKLQkJCXJlbG9jX3N0YWNrW3JlbG9jX3N0YWNrX3RvcyAtIDFdOwotCQlyZWxvY19zdGFja190b3MgLT0gMjsKLQkJYnJlYWs7Ci0JY2FzZSBSX3JzaGlmdDoKLQkJdmFsdWUgPSByZWxvY19zdGFja1tyZWxvY19zdGFja190b3MgLSAyXSA+PgotCQkJcmVsb2Nfc3RhY2tbcmVsb2Nfc3RhY2tfdG9zIC0gMV07Ci0JCXJlbG9jX3N0YWNrX3RvcyAtPSAyOwotCQlicmVhazsKLQljYXNlIFJfYW5kOgotCQl2YWx1ZSA9IHJlbG9jX3N0YWNrW3JlbG9jX3N0YWNrX3RvcyAtIDJdICYKLQkJCXJlbG9jX3N0YWNrW3JlbG9jX3N0YWNrX3RvcyAtIDFdOwotCQlyZWxvY19zdGFja190b3MgLT0gMjsKLQkJYnJlYWs7Ci0JY2FzZSBSX29yOgotCQl2YWx1ZSA9IHJlbG9jX3N0YWNrW3JlbG9jX3N0YWNrX3RvcyAtIDJdIHwKLQkJCXJlbG9jX3N0YWNrW3JlbG9jX3N0YWNrX3RvcyAtIDFdOwotCQlyZWxvY19zdGFja190b3MgLT0gMjsKLQkJYnJlYWs7Ci0JY2FzZSBSX3hvcjoKLQkJdmFsdWUgPSByZWxvY19zdGFja1tyZWxvY19zdGFja190b3MgLSAyXSBeCi0JCQlyZWxvY19zdGFja1tyZWxvY19zdGFja190b3MgLSAxXTsKLQkJcmVsb2Nfc3RhY2tfdG9zIC09IDI7Ci0JCWJyZWFrOwotCWNhc2UgUl9sYW5kOgotCQl2YWx1ZSA9IHJlbG9jX3N0YWNrW3JlbG9jX3N0YWNrX3RvcyAtIDJdICYmCi0JCQlyZWxvY19zdGFja1tyZWxvY19zdGFja190b3MgLSAxXTsKLQkJcmVsb2Nfc3RhY2tfdG9zIC09IDI7Ci0JCWJyZWFrOwotCWNhc2UgUl9sb3I6Ci0JCXZhbHVlID0gcmVsb2Nfc3RhY2tbcmVsb2Nfc3RhY2tfdG9zIC0gMl0gfHwKLQkJCXJlbG9jX3N0YWNrW3JlbG9jX3N0YWNrX3RvcyAtIDFdOwotCQlyZWxvY19zdGFja190b3MgLT0gMjsKLQkJYnJlYWs7Ci0JY2FzZSBSX25lZzoKLQkJdmFsdWUgPSAtcmVsb2Nfc3RhY2tbcmVsb2Nfc3RhY2tfdG9zIC0gMV07Ci0JCXJlbG9jX3N0YWNrX3Rvcy0tOwotCQlicmVhazsKLQljYXNlIFJfY29tcDoKLQkJdmFsdWUgPSB+cmVsb2Nfc3RhY2tbcmVsb2Nfc3RhY2tfdG9zIC0gMV07Ci0JCXJlbG9jX3N0YWNrX3RvcyAtPSAxOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9XQVJOSU5HICJtb2R1bGUgJXM6IHVuaGFuZGxlZCByZWxvY3Rpb25cbiIsCi0JCQkJbW9kLT5uYW1lKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogbm93IHB1c2ggdGhlIG5ldyB2YWx1ZSBiYWNrIG9uIHN0YWNrICovCi0JcmVsb2Nfc3RhY2tfcHVzaCh2YWx1ZSk7Ci0KLQlyZXR1cm4gdmFsdWU7Ci19Ci0KIHZvaWQgKm1vZHVsZV9hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJaWYgKHNpemUgPT0gMCkKQEAgLTMzNCwxNiArMjI5LDE4IEBACiAJCSAgIHVuZGVmaW5lZCBzeW1ib2xzIGhhdmUgYmVlbiByZXNvbHZlZC4gKi8KIAkJc3ltID0gKEVsZjMyX1N5bSAqKSBzZWNoZHJzW3N5bWluZGV4XS5zaF9hZGRyCiAJCSAgICArIEVMRjMyX1JfU1lNKHJlbFtpXS5yX2luZm8pOwotCQlpZiAoaXNfcmVsb2Nfc3RhY2tfZW1wdHkoKSkgewotCQkJdmFsdWUgPSBzeW0tPnN0X3ZhbHVlOwotCQl9IGVsc2UgewotCQkJdmFsdWUgPSByZWxvY19zdGFja19wb3AoKTsKLQkJfQorCQl2YWx1ZSA9IHN5bS0+c3RfdmFsdWU7CiAJCXZhbHVlICs9IHJlbFtpXS5yX2FkZGVuZDsKIAkJcHJfZGVidWcoImxvY2F0aW9uIGlzICV4LCB2YWx1ZSBpcyAleCB0eXBlIGlzICVkIFxuIiwKIAkJCSAodW5zaWduZWQgaW50KSBsb2NhdGlvbjMyLCB2YWx1ZSwKIAkJCSBFTEYzMl9SX1RZUEUocmVsW2ldLnJfaW5mbykpOwotCisjaWZkZWYgQ09ORklHX1NNUAorCQlpZiAoKHVuc2lnbmVkIGxvbmcpbG9jYXRpb24xNiA+PSBDT1JFQl9MMV9EQVRBX0FfU1RBUlQpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAibW9kdWxlICVzOiBjYW5ub3QgcmVsb2NhdGUgaW4gTDE6ICV1IChTTVAga2VybmVsKSIsCisJCQkJICAgICAgIG1vZC0+bmFtZSwgRUxGMzJfUl9UWVBFKHJlbFtpXS5yX2luZm8pKTsKKwkJCXJldHVybiAtRU5PRVhFQzsKKwkJfQorI2VuZGlmCiAJCXN3aXRjaCAoRUxGMzJfUl9UWVBFKHJlbFtpXS5yX2luZm8pKSB7CiAKIAkJY2FzZSBSX3BjcmVsMjQ6CkBAIC0zNTUsNiArMjUyLDEyIEBACiAJCQlsb2NhdGlvbjMyID0gKHVpbnQzMl90ICopIGxvY2F0aW9uMTY7CiAJCQl2YWx1ZSAtPSAodWludDMyX3QpIGxvY2F0aW9uMzI7CiAJCQl2YWx1ZSA+Pj0gMTsKKwkJCWlmICgodmFsdWUgJiAweEZGMDAwMDAwKSAhPSAwICYmCisJCQkgICAgKHZhbHVlICYgMHhGRjAwMDAwMCkgIT0gMHhGRjAwMDAwMCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAibW9kdWxlICVzOiByZWxvY2F0aW9uIG92ZXJmbG93XG4iLAorCQkJCSAgICAgICBtb2QtPm5hbWUpOworCQkJCXJldHVybiAtRU5PRVhFQzsKKwkJCX0KIAkJCXByX2RlYnVnKCJ2YWx1ZSBpcyAleCwgYmVmb3JlICV4LSV4IGFmdGVyICV4LSV4XG4iLCB2YWx1ZSwKIAkJCSAgICAgICAqbG9jYXRpb24xNiwgKihsb2NhdGlvbjE2ICsgMSksCiAJCQkgICAgICAgKCpsb2NhdGlvbjE2ICYgMHhmZjAwKSB8ICh2YWx1ZSA+PiAxNiAmIDB4MDBmZiksCkBAIC0zOTksMjggKzMwMiw2IEBACiAJCQlwcl9kZWJ1ZygiYmVmb3JlICV4IGFmdGVyICV4XG4iLCAqbG9jYXRpb24zMiwgdmFsdWUpOwogCQkJKmxvY2F0aW9uMzIgPSB2YWx1ZTsKIAkJCWJyZWFrOwotCQljYXNlIFJfcHVzaDoKLQkJCXJlbG9jX3N0YWNrX3B1c2godmFsdWUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUl9jb25zdDoKLQkJCXJlbG9jX3N0YWNrX3B1c2gocmVsW2ldLnJfYWRkZW5kKTsKLQkJCWJyZWFrOwotCQljYXNlIFJfYWRkOgotCQljYXNlIFJfc3ViOgotCQljYXNlIFJfbXVsdDoKLQkJY2FzZSBSX2RpdjoKLQkJY2FzZSBSX21vZDoKLQkJY2FzZSBSX2xzaGlmdDoKLQkJY2FzZSBSX3JzaGlmdDoKLQkJY2FzZSBSX2FuZDoKLQkJY2FzZSBSX29yOgotCQljYXNlIFJfeG9yOgotCQljYXNlIFJfbGFuZDoKLQkJY2FzZSBSX2xvcjoKLQkJY2FzZSBSX25lZzoKLQkJY2FzZSBSX2NvbXA6Ci0JCQlyZWxvY19zdGFja19vcGVyYXRlKEVMRjMyX1JfVFlQRShyZWxbaV0ucl9pbmZvKSwgbW9kKTsKLQkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcHJpbnRrKEtFUk5fRVJSICJtb2R1bGUgJXM6IFVua25vd24gcmVsb2NhdGlvbjogJXVcbiIsCiAJCQkgICAgICAgbW9kLT5uYW1lLCBFTEYzMl9SX1RZUEUocmVsW2ldLnJfaW5mbykpOwpAQCAtNDM2LDYgKzMxNyw3IEBACiB7CiAJdW5zaWduZWQgaW50IGksIHN0cmluZGV4ID0gMCwgc3ltaW5kZXggPSAwOwogCWNoYXIgKnNlY3N0cmluZ3M7CisJbG9uZyBlcnIgPSAwOwogCiAJc2Vjc3RyaW5ncyA9ICh2b2lkICopaGRyICsgc2VjaGRyc1toZHItPmVfc2hzdHJuZHhdLnNoX29mZnNldDsKIApAQCAtNDYwLDggKzM0MiwxMCBAQAogCQkgICAgKHN0cmNtcCgiLnJlbGEubDEudGV4dCIsIHNlY3N0cmluZ3MgKyBzZWNoZHJzW2ldLnNoX25hbWUpID09IDApIHx8CiAJCSAgICAoKHN0cmNtcCgiLnJlbGEudGV4dCIsIHNlY3N0cmluZ3MgKyBzZWNoZHJzW2ldLnNoX25hbWUpID09IDApICYmCiAJCQkoaGRyLT5lX2ZsYWdzICYgKEVGX0JGSU5fQ09ERV9JTl9MMXxFRl9CRklOX0NPREVfSU5fTDIpKSkpKSB7Ci0JCQlhcHBseV9yZWxvY2F0ZV9hZGQoKEVsZl9TaGRyICopIHNlY2hkcnMsIHN0cnRhYiwKKwkJCWVyciA9IGFwcGx5X3JlbG9jYXRlX2FkZCgoRWxmX1NoZHIgKikgc2VjaGRycywgc3RydGFiLAogCQkJCQkgICBzeW1pbmRleCwgaSwgbW9kKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiAtRU5PRVhFQzsKIAkJfQogCX0KIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL3Byb2Nlc3MuYwppbmRleCAwYzNlYTExLi4zM2UyZTg5IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0zOSw2ICszOSw3IEBACiAKICNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KICNpbmNsdWRlIDxhc20vZml4ZWRfY29kZS5oPgorI2luY2x1ZGUgPGFzbS9tZW1fbWFwLmg+CiAKIGFzbWxpbmthZ2Ugdm9pZCByZXRfZnJvbV9mb3JrKHZvaWQpOwogCkBAIC04MSwxMSArODIsMTQgQEAKICAqLwogc3RhdGljIHZvaWQgZGVmYXVsdF9pZGxlKHZvaWQpCiB7Ci0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKKyNpZmRlZiBDT05GSUdfSVBJUEUKKwlpcGlwZV9zdXNwZW5kX2RvbWFpbigpOworI2VuZGlmCisJbG9jYWxfaXJxX2Rpc2FibGVfaHcoKTsKIAlpZiAoIW5lZWRfcmVzY2hlZCgpKQogCQlpZGxlX3dpdGhfaXJxX2Rpc2FibGVkKCk7CiAKLQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJbG9jYWxfaXJxX2VuYWJsZV9odygpOwogfQogCiAvKgpAQCAtMTU0LDYgKzE1OCw3IEBACiAJcmV0dXJuIGRvX2ZvcmsoZmxhZ3MgfCBDTE9ORV9WTSB8IENMT05FX1VOVFJBQ0VELCAwLCAmcmVncywgMCwgTlVMTCwKIAkJICAgICAgIE5VTEwpOwogfQorRVhQT1JUX1NZTUJPTChrZXJuZWxfdGhyZWFkKTsKIAogdm9pZCBmbHVzaF90aHJlYWQodm9pZCkKIHsKQEAgLTE3MCw2ICsxNzUsMTMgQEAKIAl1bnNpZ25lZCBsb25nIGNsb25lX2ZsYWdzOwogCXVuc2lnbmVkIGxvbmcgbmV3c3A7CiAKKyNpZmRlZiBfX0FSQ0hfU1lOQ19DT1JFX0RDQUNIRQorCWlmIChjdXJyZW50LT5ydC5ucl9jcHVzX2FsbG93ZWQgPT0gbnVtX3Bvc3NpYmxlX2NwdXMoKSkgeworCQljdXJyZW50LT5jcHVzX2FsbG93ZWQgPSBjcHVtYXNrX29mX2NwdShzbXBfcHJvY2Vzc29yX2lkKCkpOworCQljdXJyZW50LT5ydC5ucl9jcHVzX2FsbG93ZWQgPSAxOworCX0KKyNlbmRpZgorCiAJLyogc3lzY2FsbDIgcHV0cyBjbG9uZV9mbGFncyBpbiByMCBhbmQgdXNwIGluIHIxICovCiAJY2xvbmVfZmxhZ3MgPSByZWdzLT5yMDsKIAluZXdzcCA9IHJlZ3MtPnIxOwpAQCAtMzM3LDIyICszNDksMjIgQEAKIAlpZiAoYWRkciA+PSAodW5zaWduZWQgbG9uZylfX2luaXRfYmVnaW4gJiYKIAkgICAgYWRkciArIHNpemUgPD0gKHVuc2lnbmVkIGxvbmcpX19pbml0X2VuZCkKIAkJcmV0dXJuIDE7Ci0JaWYgKGFkZHIgPj0gTDFfU0NSQVRDSF9TVEFSVAotCSAgICAmJiBhZGRyICsgc2l6ZSA8PSBMMV9TQ1JBVENIX1NUQVJUICsgTDFfU0NSQVRDSF9MRU5HVEgpCisJaWYgKGFkZHIgPj0gZ2V0X2wxX3NjcmF0Y2hfc3RhcnQoKQorCSAgICAmJiBhZGRyICsgc2l6ZSA8PSBnZXRfbDFfc2NyYXRjaF9zdGFydCgpICsgTDFfU0NSQVRDSF9MRU5HVEgpCiAJCXJldHVybiAxOwogI2lmIEwxX0NPREVfTEVOR1RIICE9IDAKLQlpZiAoYWRkciA+PSBMMV9DT0RFX1NUQVJUICsgKF9ldGV4dF9sMSAtIF9zdGV4dF9sMSkKLQkgICAgJiYgYWRkciArIHNpemUgPD0gTDFfQ09ERV9TVEFSVCArIEwxX0NPREVfTEVOR1RIKQorCWlmIChhZGRyID49IGdldF9sMV9jb2RlX3N0YXJ0KCkgKyAoX2V0ZXh0X2wxIC0gX3N0ZXh0X2wxKQorCSAgICAmJiBhZGRyICsgc2l6ZSA8PSBnZXRfbDFfY29kZV9zdGFydCgpICsgTDFfQ09ERV9MRU5HVEgpCiAJCXJldHVybiAxOwogI2VuZGlmCiAjaWYgTDFfREFUQV9BX0xFTkdUSCAhPSAwCi0JaWYgKGFkZHIgPj0gTDFfREFUQV9BX1NUQVJUICsgKF9lYnNzX2wxIC0gX3NkYXRhX2wxKQotCSAgICAmJiBhZGRyICsgc2l6ZSA8PSBMMV9EQVRBX0FfU1RBUlQgKyBMMV9EQVRBX0FfTEVOR1RIKQorCWlmIChhZGRyID49IGdldF9sMV9kYXRhX2Ffc3RhcnQoKSArIChfZWJzc19sMSAtIF9zZGF0YV9sMSkKKwkgICAgJiYgYWRkciArIHNpemUgPD0gZ2V0X2wxX2RhdGFfYV9zdGFydCgpICsgTDFfREFUQV9BX0xFTkdUSCkKIAkJcmV0dXJuIDE7CiAjZW5kaWYKICNpZiBMMV9EQVRBX0JfTEVOR1RIICE9IDAKLQlpZiAoYWRkciA+PSBMMV9EQVRBX0JfU1RBUlQgKyAoX2Vic3NfYl9sMSAtIF9zZGF0YV9iX2wxKQotCSAgICAmJiBhZGRyICsgc2l6ZSA8PSBMMV9EQVRBX0JfU1RBUlQgKyBMMV9EQVRBX0JfTEVOR1RIKQorCWlmIChhZGRyID49IGdldF9sMV9kYXRhX2Jfc3RhcnQoKSArIChfZWJzc19iX2wxIC0gX3NkYXRhX2JfbDEpCisJICAgICYmIGFkZHIgKyBzaXplIDw9IGdldF9sMV9kYXRhX2Jfc3RhcnQoKSArIEwxX0RBVEFfQl9MRU5HVEgpCiAJCXJldHVybiAxOwogI2VuZGlmCiAjaWYgTDJfTEVOR1RIICE9IDAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL3B0cmFjZS5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvcHRyYWNlLmMKaW5kZXggMTQwYmYwMC4uZDJkMzg4NSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvcHRyYWNlLmMKQEAgLTQ1LDYgKzQ1LDcgQEAKICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8YXNtL2ZpeGVkX2NvZGUuaD4KKyNpbmNsdWRlIDxhc20vbWVtX21hcC5oPgogCiAjZGVmaW5lIFRFWFRfT0ZGU0VUIDAKIC8qCkBAIC04MCwxMCArODEsMTIgQEAKIC8qCiAgKiBHZXQgYWxsIHVzZXIgaW50ZWdlciByZWdpc3RlcnMuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB0cmFjZV9nZXRyZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB2b2lkIF9fdXNlciAqIHVyZWdzKQorc3RhdGljIGlubGluZSBpbnQgcHRyYWNlX2dldHJlZ3Moc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHZvaWQgX191c2VyICp1cmVncykKIHsKLQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGdldF91c2VyX3JlZ3ModHNrKTsKLQlyZXR1cm4gY29weV90b191c2VyKHVyZWdzLCByZWdzLCBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpKSA/IC1FRkFVTFQgOiAwOworCXN0cnVjdCBwdF9yZWdzIHJlZ3M7CisJbWVtY3B5KCZyZWdzLCBnZXRfdXNlcl9yZWdzKHRzayksIHNpemVvZihyZWdzKSk7CisJcmVncy51c3AgPSB0c2stPnRocmVhZC51c3A7CisJcmV0dXJuIGNvcHlfdG9fdXNlcih1cmVncywgJnJlZ3MsIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpID8gLUVGQVVMVCA6IDA7CiB9CiAKIC8qIE1hcHBpbmcgZnJvbSBQVF94eHggdG8gdGhlIHN0YWNrIG9mZnNldCBhdCB3aGljaCB0aGUgcmVnaXN0ZXIgaXMKQEAgLTIyMCw4ICsyMjMsOCBAQAogCQkJCWJyZWFrOwogCQkJcHJfZGVidWcoInB0cmFjZTogdXNlciBhZGRyZXNzIGlzIHZhbGlkXG4iKTsKIAotCQkJaWYgKEwxX0NPREVfTEVOR1RIICE9IDAgJiYgYWRkciA+PSBMMV9DT0RFX1NUQVJUCi0JCQkgICAgJiYgYWRkciArIHNpemVvZih0bXApIDw9IEwxX0NPREVfU1RBUlQgKyBMMV9DT0RFX0xFTkdUSCkgeworCQkJaWYgKEwxX0NPREVfTEVOR1RIICE9IDAgJiYgYWRkciA+PSBnZXRfbDFfY29kZV9zdGFydCgpCisJCQkgICAgJiYgYWRkciArIHNpemVvZih0bXApIDw9IGdldF9sMV9jb2RlX3N0YXJ0KCkgKyBMMV9DT0RFX0xFTkdUSCkgewogCQkJCXNhZmVfZG1hX21lbWNweSAoJnRtcCwgKGNvbnN0IHZvaWQgKikoYWRkciksIHNpemVvZih0bXApKTsKIAkJCQljb3BpZWQgPSBzaXplb2YodG1wKTsKIApAQCAtMzAwLDggKzMwMyw4IEBACiAJCQkJYnJlYWs7CiAJCQlwcl9kZWJ1ZygicHRyYWNlOiB1c2VyIGFkZHJlc3MgaXMgdmFsaWRcbiIpOwogCi0JCQlpZiAoTDFfQ09ERV9MRU5HVEggIT0gMCAmJiBhZGRyID49IEwxX0NPREVfU1RBUlQKLQkJCSAgICAmJiBhZGRyICsgc2l6ZW9mKGRhdGEpIDw9IEwxX0NPREVfU1RBUlQgKyBMMV9DT0RFX0xFTkdUSCkgeworCQkJaWYgKEwxX0NPREVfTEVOR1RIICE9IDAgJiYgYWRkciA+PSBnZXRfbDFfY29kZV9zdGFydCgpCisJCQkgICAgJiYgYWRkciArIHNpemVvZihkYXRhKSA8PSBnZXRfbDFfY29kZV9zdGFydCgpICsgTDFfQ09ERV9MRU5HVEgpIHsKIAkJCQlzYWZlX2RtYV9tZW1jcHkgKCh2b2lkICopKGFkZHIpLCAmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKIAkJCQljb3BpZWQgPSBzaXplb2YoZGF0YSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL3JlYm9vdC5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvcmVib290LmMKaW5kZXggYWU5N2NhNC4uZWVlZThjYiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvcmVib290LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvcmVib290LmMKQEAgLTIxLDcgKzIxLDcgQEAKICAqIHRoZSBjb3JlIHJlc2V0LgogICovCiBfX2F0dHJpYnV0ZV9fKChsMV90ZXh0KSkKLXN0YXRpYyB2b2lkIGJmaW5fcmVzZXQodm9pZCkKK3N0YXRpYyB2b2lkIF9iZmluX3Jlc2V0KHZvaWQpCiB7CiAJLyogV2FpdCBmb3IgY29tcGxldGlvbiBvZiAic3lzdGVtIiBldmVudHMgc3VjaCBhcyBjYWNoZSBsaW5lCiAJICogbGluZSBmaWxscyBzbyB0aGF0IHdlIGF2b2lkIGluZmluaXRlIHN0YWxscyBsYXRlciBvbiBhcwpAQCAtNjYsNiArNjYsMTggQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIGJmaW5fcmVzZXQodm9pZCkKK3sKKwlpZiAoQU5PTUFMWV8wNTAwMDM1MyB8fCBBTk9NQUxZXzA1MDAwMzg2KQorCQlfYmZpbl9yZXNldCgpOworCWVsc2UKKwkJLyogdGhlIGJvb3Ryb20gY2hlY2tzIHRvIHNlZSBob3cgaXQgd2FzIHJlc2V0IGFuZCB3aWxsCisJCSAqIGF1dG9tYXRpY2FsbHkgcGVyZm9ybSBhIHNvZnR3YXJlIHJlc2V0IGZvciB1cyB3aGVuCisJCSAqIGl0IHN0YXJ0cyBleGVjdXRpbmcgYm9vdAorCQkgKi8KKwkJYXNtKCJyYWlzZSAxOyIpOworfQorCiBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkKIHZvaWQgbmF0aXZlX21hY2hpbmVfcmVzdGFydChjaGFyICpjbWQpCiB7CkBAIC03NSwxNCArODcsMTAgQEAKIHsKIAluYXRpdmVfbWFjaGluZV9yZXN0YXJ0KGNtZCk7CiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQlpZiAoQU5PTUFMWV8wNTAwMDM1MyB8fCBBTk9NQUxZXzA1MDAwMzg2KQotCQliZmluX3Jlc2V0KCk7CisJaWYgKHNtcF9wcm9jZXNzb3JfaWQoKSkKKwkJc21wX2NhbGxfZnVuY3Rpb24oKHZvaWQgKiliZmluX3Jlc2V0LCAwLCAxKTsKIAllbHNlCi0JCS8qIHRoZSBib290cm9tIGNoZWNrcyB0byBzZWUgaG93IGl0IHdhcyByZXNldCBhbmQgd2lsbAotCQkgKiBhdXRvbWF0aWNhbGx5IHBlcmZvcm0gYSBzb2Z0d2FyZSByZXNldCBmb3IgdXMgd2hlbgotCQkgKiBpdCBzdGFydHMgZXhlY3V0aW5nIGJvb3QKLQkJICovCi0JCWFzbSgicmFpc2UgMTsiKTsKKwkJYmZpbl9yZXNldCgpOwogfQogCiBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL3NldHVwLmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9zZXR1cC5jCmluZGV4IDcxYTlhOGMuLmIyYTgxMTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvc2V0dXAuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bGludXgvcGZuLmg+CkBAIC0yNiwxMSArMjcsMTAgQEAKICNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KICNpbmNsdWRlIDxhc20vY3BsYmluaXQuaD4KICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKyNpbmNsdWRlIDxhc20vY3B1Lmg+CiAjaW5jbHVkZSA8YXNtL2ZpeGVkX2NvZGUuaD4KICNpbmNsdWRlIDxhc20vZWFybHlfcHJpbnRrLmg+CiAKLXN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgY3B1LCBjcHVfZGV2aWNlcyk7Ci0KIHUxNiBfYmZpbl9zd3JzdDsKIEVYUE9SVF9TWU1CT0woX2JmaW5fc3dyc3QpOwogCkBAIC03OSwyOSArNzksNzAgQEAKIHN0YXRpYyBzdHJ1Y3QgYmZpbl9tZW1tYXBfZW50cnkgKm92ZXJsYXBfbGlzdFtCRklOX01FTU1BUF9NQVhdIF9faW5pdGRhdGE7CiBzdGF0aWMgc3RydWN0IGJmaW5fbWVtbWFwX2VudHJ5IG5ld19tYXBbQkZJTl9NRU1NQVBfTUFYXSBfX2luaXRkYXRhOwogCi12b2lkIF9faW5pdCBiZmluX2NhY2hlX2luaXQodm9pZCkKLXsKK0RFRklORV9QRVJfQ1BVKHN0cnVjdCBibGFja2Zpbl9jcHVkYXRhLCBjcHVfZGF0YSk7CisKK3N0YXRpYyBpbnQgZWFybHlfaW5pdF9jbGtpbl9oeihjaGFyICpidWYpOworCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9EQ0FDSEUpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fSUNBQ0hFKQotCWdlbmVyYXRlX2NwbGJfdGFibGVzKCk7Cit2b2lkIF9faW5pdCBnZW5lcmF0ZV9jcGxiX3RhYmxlcyh2b2lkKQoreworCXVuc2lnbmVkIGludCBjcHU7CisKKwlnZW5lcmF0ZV9jcGxiX3RhYmxlc19hbGwoKTsKKwkvKiBHZW5lcmF0ZSBwZXItQ1BVIEkmRCBDUExCIHRhYmxlcyAqLworCWZvciAoY3B1ID0gMDsgY3B1IDwgbnVtX3Bvc3NpYmxlX2NwdXMoKTsgKytjcHUpCisJCWdlbmVyYXRlX2NwbGJfdGFibGVzX2NwdShjcHUpOworfQogI2VuZGlmCiAKK3ZvaWQgX19jcHVpbml0IGJmaW5fc2V0dXBfY2FjaGVzKHVuc2lnbmVkIGludCBjcHUpCit7CiAjaWZkZWYgQ09ORklHX0JGSU5fSUNBQ0hFCi0JYmZpbl9pY2FjaGVfaW5pdCgpOwotCXByaW50ayhLRVJOX0lORk8gIkluc3RydWN0aW9uIENhY2hlIEVuYWJsZWRcbiIpOworCWJmaW5faWNhY2hlX2luaXQoaWNwbGJfdGJsW2NwdV0pOwogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfQkZJTl9EQ0FDSEUKLQliZmluX2RjYWNoZV9pbml0KCk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiRGF0YSBDYWNoZSBFbmFibGVkIgorCWJmaW5fZGNhY2hlX2luaXQoZGNwbGJfdGJsW2NwdV0pOworI2VuZGlmCisKKwkvKgorCSAqIEluIGNhY2hlIGNvaGVyZW5jZSBlbXVsYXRpb24gbW9kZSwgd2UgbmVlZCB0byBoYXZlIHRoZQorCSAqIEQtY2FjaGUgZW5hYmxlZCBiZWZvcmUgcnVubmluZyBhbnkgYXRvbWljIG9wZXJhdGlvbiB3aGljaAorCSAqIG1pZ2h0IGludm92ZSBjYWNoZSBpbnZhbGlkYXRpb24gKGkuZS4gc3BpbmxvY2ssIHJ3bG9jaykuCisJICogU28gcHJpbnRrJ3MgYXJlIGRlZmVycmVkIHVudGlsIHRoZW4uCisJICovCisjaWZkZWYgQ09ORklHX0JGSU5fSUNBQ0hFCisJcHJpbnRrKEtFUk5fSU5GTyAiSW5zdHJ1Y3Rpb24gQ2FjaGUgRW5hYmxlZCBmb3IgQ1BVJXVcbiIsIGNwdSk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkZJTl9EQ0FDSEUKKwlwcmludGsoS0VSTl9JTkZPICJEYXRhIENhY2hlIEVuYWJsZWQgZm9yIENQVSV1IgogIyBpZiBkZWZpbmVkIENPTkZJR19CRklOX1dCCiAJCSIgKHdyaXRlLWJhY2spIgogIyBlbGlmIGRlZmluZWQgQ09ORklHX0JGSU5fV1QKIAkJIiAod3JpdGUtdGhyb3VnaCkiCiAjIGVuZGlmCi0JCSJcbiIpOworCQkiXG4iLCBjcHUpOwogI2VuZGlmCiB9CiAKK3ZvaWQgX19jcHVpbml0IGJmaW5fc2V0dXBfY3B1ZGF0YSh1bnNpZ25lZCBpbnQgY3B1KQoreworCXN0cnVjdCBibGFja2Zpbl9jcHVkYXRhICpjcHVkYXRhID0gJnBlcl9jcHUoY3B1X2RhdGEsIGNwdSk7CisKKwljcHVkYXRhLT5pZGxlID0gY3VycmVudDsKKwljcHVkYXRhLT5sb29wc19wZXJfamlmZnkgPSBsb29wc19wZXJfamlmZnk7CisJY3B1ZGF0YS0+aW1lbWN0bCA9IGJmaW5fcmVhZF9JTUVNX0NPTlRST0woKTsKKwljcHVkYXRhLT5kbWVtY3RsID0gYmZpbl9yZWFkX0RNRU1fQ09OVFJPTCgpOworfQorCit2b2lkIF9faW5pdCBiZmluX2NhY2hlX2luaXQodm9pZCkKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19CRklOX0RDQUNIRSkgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9JQ0FDSEUpCisJZ2VuZXJhdGVfY3BsYl90YWJsZXMoKTsKKyNlbmRpZgorCWJmaW5fc2V0dXBfY2FjaGVzKDApOworfQorCiB2b2lkIF9faW5pdCBiZmluX3JlbG9jYXRlX2wxX21lbSh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgbDFfY29kZV9sZW5ndGg7CkBAIC0xMDksNiArMTUwLDggQEAKIAl1bnNpZ25lZCBsb25nIGwxX2RhdGFfYl9sZW5ndGg7CiAJdW5zaWduZWQgbG9uZyBsMl9sZW5ndGg7CiAKKwlibGFja2Zpbl9kbWFfZWFybHlfaW5pdCgpOworCiAJbDFfY29kZV9sZW5ndGggPSBfZXRleHRfbDEgLSBfc3RleHRfbDE7CiAJaWYgKGwxX2NvZGVfbGVuZ3RoID4gTDFfQ09ERV9MRU5HVEgpCiAJCXBhbmljKCJMMSBJbnN0cnVjdGlvbiBTUkFNIE92ZXJmbG93XG4iKTsKQEAgLTIzMCw3ICsyNzMsNyBAQAogCS8qIHJlY29yZCBhbGwga25vd24gY2hhbmdlLXBvaW50cyAoc3RhcnRpbmcgYW5kIGVuZGluZyBhZGRyZXNzZXMpLAogCSAgIG9taXR0aW5nIHRob3NlIHRoYXQgYXJlIGZvciBlbXB0eSBtZW1vcnkgcmVnaW9ucyAqLwogCWNoZ2lkeCA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IG9sZF9ucjsgaSsrKQl7CisJZm9yIChpID0gMDsgaSA8IG9sZF9ucjsgaSsrKSB7CiAJCWlmIChtYXBbaV0uc2l6ZSAhPSAwKSB7CiAJCQljaGFuZ2VfcG9pbnRbY2hnaWR4XS0+YWRkciA9IG1hcFtpXS5hZGRyOwogCQkJY2hhbmdlX3BvaW50W2NoZ2lkeCsrXS0+cGVudHJ5ID0gJm1hcFtpXTsKQEAgLTIzOCwxMyArMjgxLDEzIEBACiAJCQljaGFuZ2VfcG9pbnRbY2hnaWR4KytdLT5wZW50cnkgPSAmbWFwW2ldOwogCQl9CiAJfQotCWNoZ19uciA9IGNoZ2lkeDsgICAgCS8qIHRydWUgbnVtYmVyIG9mIGNoYW5nZS1wb2ludHMgKi8KKwljaGdfbnIgPSBjaGdpZHg7CS8qIHRydWUgbnVtYmVyIG9mIGNoYW5nZS1wb2ludHMgKi8KIAogCS8qIHNvcnQgY2hhbmdlLXBvaW50IGxpc3QgYnkgbWVtb3J5IGFkZHJlc3NlcyAobG93IC0+IGhpZ2gpICovCiAJc3RpbGxfY2hhbmdpbmcgPSAxOwotCXdoaWxlIChzdGlsbF9jaGFuZ2luZykJeworCXdoaWxlIChzdGlsbF9jaGFuZ2luZykgewogCQlzdGlsbF9jaGFuZ2luZyA9IDA7Ci0JCWZvciAoaSA9IDE7IGkgPCBjaGdfbnI7IGkrKykgIHsKKwkJZm9yIChpID0gMTsgaSA8IGNoZ19ucjsgaSsrKSB7CiAJCQkvKiBpZiA8Y3VycmVudF9hZGRyPiA+IDxsYXN0X2FkZHI+LCBzd2FwICovCiAJCQkvKiBvciwgaWYgY3VycmVudD08c3RhcnRfYWRkcj4gJiBsYXN0PTxlbmRfYWRkcj4sIHN3YXAgKi8KIAkJCWlmICgoY2hhbmdlX3BvaW50W2ldLT5hZGRyIDwgY2hhbmdlX3BvaW50W2ktMV0tPmFkZHIpIHx8CkBAIC0yNjEsMTAgKzMwNCwxMCBAQAogCX0KIAogCS8qIGNyZWF0ZSBhIG5ldyBtZW1tYXAsIHJlbW92aW5nIG92ZXJsYXBzICovCi0Jb3ZlcmxhcF9lbnRyaWVzID0gMDsJIC8qIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBvdmVybGFwIHRhYmxlICovCi0JbmV3X2VudHJ5ID0gMDsJIC8qIGluZGV4IGZvciBjcmVhdGluZyBuZXcgbWVtbWFwIGVudHJpZXMgKi8KLQlsYXN0X3R5cGUgPSAwOwkJIC8qIHN0YXJ0IHdpdGggdW5kZWZpbmVkIG1lbW9yeSB0eXBlICovCi0JbGFzdF9hZGRyID0gMDsJCSAvKiBzdGFydCB3aXRoIDAgYXMgbGFzdCBzdGFydGluZyBhZGRyZXNzICovCisJb3ZlcmxhcF9lbnRyaWVzID0gMDsJLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIG92ZXJsYXAgdGFibGUgKi8KKwluZXdfZW50cnkgPSAwOwkJLyogaW5kZXggZm9yIGNyZWF0aW5nIG5ldyBtZW1tYXAgZW50cmllcyAqLworCWxhc3RfdHlwZSA9IDA7CQkvKiBzdGFydCB3aXRoIHVuZGVmaW5lZCBtZW1vcnkgdHlwZSAqLworCWxhc3RfYWRkciA9IDA7CQkvKiBzdGFydCB3aXRoIDAgYXMgbGFzdCBzdGFydGluZyBhZGRyZXNzICovCiAJLyogbG9vcCB0aHJvdWdoIGNoYW5nZS1wb2ludHMsIGRldGVybWluaW5nIGFmZmVjdCBvbiB0aGUgbmV3IG1lbW1hcCAqLwogCWZvciAoY2hnaWR4ID0gMDsgY2hnaWR4IDwgY2hnX25yOyBjaGdpZHgrKykgewogCQkvKiBrZWVwIHRyYWNrIG9mIGFsbCBvdmVybGFwcGluZyBtZW1tYXAgZW50cmllcyAqLwpAQCAtMjg2LDE0ICszMjksMTQgQEAKIAkJCWlmIChvdmVybGFwX2xpc3RbaV0tPnR5cGUgPiBjdXJyZW50X3R5cGUpCiAJCQkJY3VycmVudF90eXBlID0gb3ZlcmxhcF9saXN0W2ldLT50eXBlOwogCQkvKiBjb250aW51ZSBidWlsZGluZyB1cCBuZXcgbWVtbWFwIGJhc2VkIG9uIHRoaXMgaW5mb3JtYXRpb24gKi8KLQkJaWYgKGN1cnJlbnRfdHlwZSAhPSBsYXN0X3R5cGUpCXsKKwkJaWYgKGN1cnJlbnRfdHlwZSAhPSBsYXN0X3R5cGUpIHsKIAkJCWlmIChsYXN0X3R5cGUgIT0gMCkgewogCQkJCW5ld19tYXBbbmV3X2VudHJ5XS5zaXplID0KIAkJCQkJY2hhbmdlX3BvaW50W2NoZ2lkeF0tPmFkZHIgLSBsYXN0X2FkZHI7CiAJCQkJLyogbW92ZSBmb3J3YXJkIG9ubHkgaWYgdGhlIG5ldyBzaXplIHdhcyBub24temVybyAqLwogCQkJCWlmIChuZXdfbWFwW25ld19lbnRyeV0uc2l6ZSAhPSAwKQogCQkJCQlpZiAoKytuZXdfZW50cnkgPj0gQkZJTl9NRU1NQVBfTUFYKQotCQkJCQkJYnJlYWs7IAkvKiBubyBtb3JlIHNwYWNlIGxlZnQgZm9yIG5ldyBlbnRyaWVzICovCisJCQkJCQlicmVhazsJLyogbm8gbW9yZSBzcGFjZSBsZWZ0IGZvciBuZXcgZW50cmllcyAqLwogCQkJfQogCQkJaWYgKGN1cnJlbnRfdHlwZSAhPSAwKSB7CiAJCQkJbmV3X21hcFtuZXdfZW50cnldLmFkZHIgPSBjaGFuZ2VfcG9pbnRbY2hnaWR4XS0+YWRkcjsKQEAgLTMwMyw5ICszNDYsOSBAQAogCQkJbGFzdF90eXBlID0gY3VycmVudF90eXBlOwogCQl9CiAJfQotCW5ld19uciA9IG5ld19lbnRyeTsgICAvKiByZXRhaW4gY291bnQgZm9yIG5ldyBlbnRyaWVzICovCisJbmV3X25yID0gbmV3X2VudHJ5OwkvKiByZXRhaW4gY291bnQgZm9yIG5ldyBlbnRyaWVzICovCiAKLQkvKiBjb3B5IG5ldyAgbWFwcGluZyBpbnRvIG9yaWdpbmFsIGxvY2F0aW9uICovCisJLyogY29weSBuZXcgbWFwcGluZyBpbnRvIG9yaWdpbmFsIGxvY2F0aW9uICovCiAJbWVtY3B5KG1hcCwgbmV3X21hcCwgbmV3X25yKnNpemVvZihzdHJ1Y3QgYmZpbl9tZW1tYXBfZW50cnkpKTsKIAkqcG5yX21hcCA9IG5ld19ucjsKIApAQCAtMzYxLDcgKzQwNCw2IEBACiAgKiAgLSAibWVtbWFwPVhYWFtLa21NXVtAXVskXVhYWFtLa21NXSIgZGVmaW5lcyBhIG1lbW9yeSByZWdpb24KICAqICAgICAgIEAgZnJvbSA8c3RhcnQ+IHRvIDxzdGFydD4rPG1lbT4sIHR5cGUgUkFNCiAgKiAgICAgICAkIGZyb20gPHN0YXJ0PiB0byA8c3RhcnQ+KzxtZW0+LCB0eXBlIFJFU0VSVkVECi0gKgogICovCiBzdGF0aWMgX19pbml0IHZvaWQgcGFyc2VfY21kbGluZV9lYXJseShjaGFyICpjbWRsaW5lX3ApCiB7CkBAIC0zODMsMTQgKzQyNSwxNSBAQAogCQkJCQlpZiAoKnRvICE9ICcgJykgewogCQkJCQkJaWYgKCp0byA9PSAnJCcKIAkJCQkJCSAgICB8fCAqKHRvICsgMSkgPT0gJyQnKQotCQkJCQkJCXJlc2VydmVkX21lbV9kY2FjaGVfb24gPQotCQkJCQkJCSAgICAxOworCQkJCQkJCXJlc2VydmVkX21lbV9kY2FjaGVfb24gPSAxOwogCQkJCQkJaWYgKCp0byA9PSAnIycKIAkJCQkJCSAgICB8fCAqKHRvICsgMSkgPT0gJyMnKQotCQkJCQkJCXJlc2VydmVkX21lbV9pY2FjaGVfb24gPQotCQkJCQkJCSAgICAxOworCQkJCQkJCXJlc2VydmVkX21lbV9pY2FjaGVfb24gPSAxOwogCQkJCQl9CiAJCQkJfQorCQkJfSBlbHNlIGlmICghbWVtY21wKHRvLCAiY2xraW5faHo9IiwgOSkpIHsKKwkJCQl0byArPSA5OworCQkJCWVhcmx5X2luaXRfY2xraW5faHoodG8pOwogCQkJfSBlbHNlIGlmICghbWVtY21wKHRvLCAiZWFybHlwcmludGs9IiwgMTIpKSB7CiAJCQkJdG8gKz0gMTI7CiAJCQkJc2V0dXBfZWFybHlfcHJpbnRrKHRvKTsKQEAgLTQxNyw5ICs0NjAsOCBAQAogICoJW19yYW1lbmQgLSBETUFfVU5DQUNIRURfUkVHSU9OLAogICoJCV9yYW1lbmRdOgkJCXVuY2FjaGVkIERNQSByZWdpb24KICAqICBbX3JhbWVuZCwgcGh5c2ljYWxfbWVtX2VuZF06CW1lbW9yeSBub3QgbWFuYWdlZCBieSBrZXJuZWwKLSAqCiAgKi8KLXN0YXRpYyBfX2luaXQgdm9pZCAgbWVtb3J5X3NldHVwKHZvaWQpCitzdGF0aWMgX19pbml0IHZvaWQgbWVtb3J5X3NldHVwKHZvaWQpCiB7CiAjaWZkZWYgQ09ORklHX01URF9VQ0xJTlVYCiAJdW5zaWduZWQgbG9uZyBtdGRfcGh5cyA9IDA7CkBAIC00MzYsNyArNDc4LDcgQEAKIAltZW1vcnlfZW5kID0gX3JhbWVuZCAtIERNQV9VTkNBQ0hFRF9SRUdJT047CiAKICNpZmRlZiBDT05GSUdfTVBVCi0JLyogUm91bmQgdXAgdG8gbXVsdGlwbGUgb2YgNE1CLiAgKi8KKwkvKiBSb3VuZCB1cCB0byBtdWx0aXBsZSBvZiA0TUIgKi8KIAltZW1vcnlfc3RhcnQgPSAoX3JhbXN0YXJ0ICsgMHgzZmZmZmYpICYgfjB4M2ZmZmZmOwogI2Vsc2UKIAltZW1vcnlfc3RhcnQgPSBQQUdFX0FMSUdOKF9yYW1zdGFydCk7CkBAIC02MTYsNyArNjU4LDcgQEAKIAllbmRfcGZuID0gbWVtb3J5X2VuZCA+PiBQQUdFX1NISUZUOwogCiAJLyoKLQkgKiBnaXZlIGFsbCB0aGUgbWVtb3J5IHRvIHRoZSBib290bWFwIGFsbG9jYXRvciwgIHRlbGwgaXQgdG8gcHV0IHRoZQorCSAqIGdpdmUgYWxsIHRoZSBtZW1vcnkgdG8gdGhlIGJvb3RtYXAgYWxsb2NhdG9yLCB0ZWxsIGl0IHRvIHB1dCB0aGUKIAkgKiBib290IG1lbV9tYXAgYXQgdGhlIHN0YXJ0IG9mIG1lbW9yeS4KIAkgKi8KIAlib290bWFwX3NpemUgPSBpbml0X2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEoMCksCkBAIC03OTEsNyArODMzLDExIEBACiAJYmZpbl93cml0ZV9TV1JTVChfYmZpbl9zd3JzdCB8IERPVUJMRV9GQVVMVCk7CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19TTVAKKwlpZiAoX2JmaW5fc3dyc3QgJiBTV1JTVF9EQkxfRkFVTFRfQSkgeworI2Vsc2UKIAlpZiAoX2JmaW5fc3dyc3QgJiBSRVNFVF9ET1VCTEUpIHsKKyNlbmRpZgogCQlwcmludGsoS0VSTl9FTUVSRyAiUmVjb3ZlcmluZyBmcm9tIERPVUJMRSBGQVVMVCBldmVudFxuIik7CiAjaWZkZWYgQ09ORklHX0RFQlVHX0RPVUJMRUZBVUxUCiAJCS8qIFdlIGFzc3VtZSB0aGUgY3Jhc2hpbmcga2VybmVsLCBhbmQgdGhlIGN1cnJlbnQgc3ltYm9sIHRhYmxlIG1hdGNoICovCkBAIC04MjMsOSArODY5LDEyIEBACiAJCQlpZiAoYmZpbl9jb21waWxlZF9yZXZpZCgpID09IC0xKQogCQkJCXByaW50ayhLRVJOX0VSUiAiV2FybmluZzogQ29tcGlsZWQgZm9yIFJldiBub25lLCBidXQgcnVubmluZyBvbiBSZXYgJWRcbiIsCiAJCQkJICAgICAgIGJmaW5fcmV2aWQoKSk7Ci0JCQllbHNlIGlmIChiZmluX2NvbXBpbGVkX3JldmlkKCkgIT0gMHhmZmZmKQorCQkJZWxzZSBpZiAoYmZpbl9jb21waWxlZF9yZXZpZCgpICE9IDB4ZmZmZikgewogCQkJCXByaW50ayhLRVJOX0VSUiAiV2FybmluZzogQ29tcGlsZWQgZm9yIFJldiAlZCwgYnV0IHJ1bm5pbmcgb24gUmV2ICVkXG4iLAogCQkJCSAgICAgICBiZmluX2NvbXBpbGVkX3JldmlkKCksIGJmaW5fcmV2aWQoKSk7CisJCQkJaWYgKGJmaW5fY29tcGlsZWRfcmV2aWQoKSA+IGJmaW5fcmV2aWQoKSkKKwkJCQkJcGFuaWMoIkVycm9yOiB5b3UgYXJlIG1pc3NpbmcgYW5vbWFseSB3b3JrYXJvdW5kcyBmb3IgdGhpcyByZXZcbiIpOworCQkJfQogCQl9CiAJCWlmIChiZmluX3JldmlkKCkgPCBDT05GSUdfQkZfUkVWX01JTiB8fCBiZmluX3JldmlkKCkgPiBDT05GSUdfQkZfUkVWX01BWCkKIAkJCXByaW50ayhLRVJOX0VSUiAiV2FybmluZzogVW5zdXBwb3J0ZWQgQ2hpcCBSZXZpc2lvbiBBRFNQLSVzIFJldiAwLiVkIGRldGVjdGVkXG4iLApAQCAtODM1LDcgKzg4NCw3IEBACiAJcHJpbnRrKEtFUk5fSU5GTyAiQmxhY2tmaW4gTGludXggc3VwcG9ydCBieSBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvXG4iKTsKIAogCXByaW50ayhLRVJOX0lORk8gIlByb2Nlc3NvciBTcGVlZDogJWx1IE1IeiBjb3JlIGNsb2NrIGFuZCAlbHUgTUh6IFN5c3RlbSBDbG9ja1xuIiwKLQkgICAgICAgY2NsayAvIDEwMDAwMDAsICBzY2xrIC8gMTAwMDAwMCk7CisJICAgICAgIGNjbGsgLyAxMDAwMDAwLCBzY2xrIC8gMTAwMDAwMCk7CiAKIAlpZiAoQU5PTUFMWV8wNTAwMDI3MyAmJiAoY2NsayA+PiAxKSA8PSBzY2xrKQogCQlwcmludGsoIlxuXG5cbkFOT01BTFlfMDUwMDAyNzM6IENDTEsgbXVzdCBiZSA+PSAyKlNDTEsgISEhXG5cblxuIik7CkBAIC04NjcsMTggKzkxNiwyMSBAQAogCUJVR19PTigoY2hhciAqKSZzYWZlX3VzZXJfaW5zdHJ1Y3Rpb24gLSAoY2hhciAqKSZmaXhlZF9jb2RlX3N0YXJ0CiAJCSE9IFNBRkVfVVNFUl9JTlNUUlVDVElPTiAtIEZJWEVEX0NPREVfU1RBUlQpOwogCisjaWZkZWYgQ09ORklHX1NNUAorCXBsYXRmb3JtX2luaXRfY3B1cygpOworI2VuZGlmCiAJaW5pdF9leGNlcHRpb25fdmVjdG9ycygpOwotCWJmaW5fY2FjaGVfaW5pdCgpOworCWJmaW5fY2FjaGVfaW5pdCgpOwkvKiBJbml0aWFsaXplIGNhY2hlcyBmb3IgdGhlIGJvb3QgQ1BVICovCiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IHRvcG9sb2d5X2luaXQodm9pZCkKIHsKLQlpbnQgY3B1OworCXVuc2lnbmVkIGludCBjcHU7CisJLyogUmVjb3JkIENQVS1wcml2YXRlIGluZm9ybWF0aW9uIGZvciB0aGUgYm9vdCBwcm9jZXNzb3IuICovCisJYmZpbl9zZXR1cF9jcHVkYXRhKDApOwogCiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewotCQlzdHJ1Y3QgY3B1ICpjID0gJnBlcl9jcHUoY3B1X2RldmljZXMsIGNwdSk7Ci0KLQkJcmVnaXN0ZXJfY3B1KGMsIGNwdSk7CisJCXJlZ2lzdGVyX2NwdSgmcGVyX2NwdShjcHVfZGF0YSwgY3B1KS5jcHUsIGNwdSk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC04ODYsMzYgKzkzOCw1NCBAQAogCiBzdWJzeXNfaW5pdGNhbGwodG9wb2xvZ3lfaW5pdCk7CiAKKy8qIEdldCB0aGUgaW5wdXQgY2xvY2sgZnJlcXVlbmN5ICovCitzdGF0aWMgdV9sb25nIGNhY2hlZF9jbGtpbl9oeiA9IENPTkZJR19DTEtJTl9IWjsKK3N0YXRpYyB1X2xvbmcgZ2V0X2Nsa2luX2h6KHZvaWQpCit7CisJcmV0dXJuIGNhY2hlZF9jbGtpbl9oejsKK30KK3N0YXRpYyBpbnQgX19pbml0IGVhcmx5X2luaXRfY2xraW5faHooY2hhciAqYnVmKQoreworCWNhY2hlZF9jbGtpbl9oeiA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMCk7CisjaWZkZWYgQkZJTl9LRVJORUxfQ0xPQ0sKKwlpZiAoY2FjaGVkX2Nsa2luX2h6ICE9IENPTkZJR19DTEtJTl9IWikKKwkJcGFuaWMoImNhbm5vdCBjaGFuZ2UgY2xraW5faHogd2hlbiByZXByb2dyYW1taW5nIGNsb2NrcyIpOworI2VuZGlmCisJcmV0dXJuIDE7Cit9CitlYXJseV9wYXJhbSgiY2xraW5faHo9IiwgZWFybHlfaW5pdF9jbGtpbl9oeik7CisKIC8qIEdldCB0aGUgdm9sdGFnZSBpbnB1dCBtdWx0aXBsaWVyICovCi1zdGF0aWMgdV9sb25nIGNhY2hlZF92Y29fcGxsX2N0bCwgY2FjaGVkX3ZjbzsKIHN0YXRpYyB1X2xvbmcgZ2V0X3Zjbyh2b2lkKQogewotCXVfbG9uZyBtc2VsOworCXN0YXRpYyB1X2xvbmcgY2FjaGVkX3ZjbzsKKwl1X2xvbmcgbXNlbCwgcGxsX2N0bDsKIAotCXVfbG9uZyBwbGxfY3RsID0gYmZpbl9yZWFkX1BMTF9DVEwoKTsKLQlpZiAocGxsX2N0bCA9PSBjYWNoZWRfdmNvX3BsbF9jdGwpCisJLyogVGhlIGFzc3VtcHRpb24gaGVyZSBpcyB0aGF0IFZDTyBuZXZlciBjaGFuZ2VzIGF0IHJ1bnRpbWUuCisJICogSWYsIHNvbWVkYXksIHdlIHN1cHBvcnQgdGhhdCwgdGhlbiB3ZSdsbCBoYXZlIHRvIGNoYW5nZSB0aGlzLgorCSAqLworCWlmIChjYWNoZWRfdmNvKQogCQlyZXR1cm4gY2FjaGVkX3ZjbzsKLQllbHNlCi0JCWNhY2hlZF92Y29fcGxsX2N0bCA9IHBsbF9jdGw7CiAKKwlwbGxfY3RsID0gYmZpbl9yZWFkX1BMTF9DVEwoKTsKIAltc2VsID0gKHBsbF9jdGwgPj4gOSkgJiAweDNGOwogCWlmICgwID09IG1zZWwpCiAJCW1zZWwgPSA2NDsKIAotCWNhY2hlZF92Y28gPSBDT05GSUdfQ0xLSU5fSFo7CisJY2FjaGVkX3ZjbyA9IGdldF9jbGtpbl9oeigpOwogCWNhY2hlZF92Y28gPj49ICgxICYgcGxsX2N0bCk7CS8qIERGIGJpdCAqLwogCWNhY2hlZF92Y28gKj0gbXNlbDsKIAlyZXR1cm4gY2FjaGVkX3ZjbzsKIH0KIAogLyogR2V0IHRoZSBDb3JlIGNsb2NrICovCi1zdGF0aWMgdV9sb25nIGNhY2hlZF9jY2xrX3BsbF9kaXYsIGNhY2hlZF9jY2xrOwogdV9sb25nIGdldF9jY2xrKHZvaWQpCiB7CisJc3RhdGljIHVfbG9uZyBjYWNoZWRfY2Nsa19wbGxfZGl2LCBjYWNoZWRfY2NsazsKIAl1X2xvbmcgY3NlbCwgc3NlbDsKIAogCWlmIChiZmluX3JlYWRfUExMX1NUQVQoKSAmIDB4MSkKLQkJcmV0dXJuIENPTkZJR19DTEtJTl9IWjsKKwkJcmV0dXJuIGdldF9jbGtpbl9oeigpOwogCiAJc3NlbCA9IGJmaW5fcmVhZF9QTExfRElWKCk7CiAJaWYgKHNzZWwgPT0gY2FjaGVkX2NjbGtfcGxsX2RpdikKQEAgLTkzNCwyMSArMTAwNCwyMSBAQAogRVhQT1JUX1NZTUJPTChnZXRfY2Nsayk7CiAKIC8qIEdldCB0aGUgU3lzdGVtIGNsb2NrICovCi1zdGF0aWMgdV9sb25nIGNhY2hlZF9zY2xrX3BsbF9kaXYsIGNhY2hlZF9zY2xrOwogdV9sb25nIGdldF9zY2xrKHZvaWQpCiB7CisJc3RhdGljIHVfbG9uZyBjYWNoZWRfc2NsazsKIAl1X2xvbmcgc3NlbDsKIAotCWlmIChiZmluX3JlYWRfUExMX1NUQVQoKSAmIDB4MSkKLQkJcmV0dXJuIENPTkZJR19DTEtJTl9IWjsKLQotCXNzZWwgPSBiZmluX3JlYWRfUExMX0RJVigpOwotCWlmIChzc2VsID09IGNhY2hlZF9zY2xrX3BsbF9kaXYpCisJLyogVGhlIGFzc3VtcHRpb24gaGVyZSBpcyB0aGF0IFNDTEsgbmV2ZXIgY2hhbmdlcyBhdCBydW50aW1lLgorCSAqIElmLCBzb21lZGF5LCB3ZSBzdXBwb3J0IHRoYXQsIHRoZW4gd2UnbGwgaGF2ZSB0byBjaGFuZ2UgdGhpcy4KKwkgKi8KKwlpZiAoY2FjaGVkX3NjbGspCiAJCXJldHVybiBjYWNoZWRfc2NsazsKLQllbHNlCi0JCWNhY2hlZF9zY2xrX3BsbF9kaXYgPSBzc2VsOwogCi0Jc3NlbCAmPSAweGY7CisJaWYgKGJmaW5fcmVhZF9QTExfU1RBVCgpICYgMHgxKQorCQlyZXR1cm4gZ2V0X2Nsa2luX2h6KCk7CisKKwlzc2VsID0gYmZpbl9yZWFkX1BMTF9ESVYoKSAmIDB4ZjsKIAlpZiAoMCA9PSBzc2VsKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkludmFsaWQgU3lzdGVtIENsb2NrXG4iKTsKIAkJc3NlbCA9IDE7CkBAIC05ODIsMTcgKzEwNTIsMTggQEAKIHsKIAljaGFyICpjcHUsICptbXUsICpmcHUsICp2ZW5kb3IsICpjYWNoZTsKIAl1aW50MzJfdCByZXZpZDsKLQotCXVfbG9uZyBjY2xrID0gMCwgc2NsayA9IDA7CisJaW50IGNwdV9udW0gPSAqKHVuc2lnbmVkIGludCAqKXY7CisJdV9sb25nIHNjbGssIGNjbGs7CiAJdV9pbnQgaWNhY2hlX3NpemUgPSBCRklOX0lDQUNIRVNJWkUgLyAxMDI0LCBkY2FjaGVfc2l6ZSA9IDAsIGRzdXBfYmFua3MgPSAwOworCXN0cnVjdCBibGFja2Zpbl9jcHVkYXRhICpjcHVkYXRhID0gJnBlcl9jcHUoY3B1X2RhdGEsIGNwdV9udW0pOwogCiAJY3B1ID0gQ1BVOwogCW1tdSA9ICJub25lIjsKIAlmcHUgPSAibm9uZSI7CiAJcmV2aWQgPSBiZmluX3JldmlkKCk7CiAKLQljY2xrID0gZ2V0X2NjbGsoKTsKIAlzY2xrID0gZ2V0X3NjbGsoKTsKKwljY2xrID0gZ2V0X2NjbGsoKTsKIAogCXN3aXRjaCAoYmZpbl9yZWFkX0NISVBJRCgpICYgQ0hJUElEX01BTlVGQUNUVVJFKSB7CiAJY2FzZSAweGNhOgpAQCAtMTAwMywxMCArMTA3NCw3IEBACiAJCWJyZWFrOwogCX0KIAotCXNlcV9wcmludGYobSwgInByb2Nlc3Nvclx0OiAlZFxuIgotCQkidmVuZG9yX2lkXHQ6ICVzXG4iLAotCQkqKHVuc2lnbmVkIGludCAqKXYsCi0JCXZlbmRvcik7CisJc2VxX3ByaW50ZihtLCAicHJvY2Vzc29yXHQ6ICVkXG4iICJ2ZW5kb3JfaWRcdDogJXNcbiIsIGNwdV9udW0sIHZlbmRvcik7CiAKIAlpZiAoQ1BVSUQgPT0gYmZpbl9jcHVpZCgpKQogCQlzZXFfcHJpbnRmKG0sICJjcHUgZmFtaWx5XHQ6IDB4JTA0eFxuIiwgQ1BVSUQpOwpAQCAtMTAyOSwxMiArMTA5NywxMiBAQAogCQlzY2xrLzEwMDAwMDAsIHNjbGslMTAwMDAwMCk7CiAJc2VxX3ByaW50ZihtLCAiYm9nb21pcHNcdDogJWx1LiUwMmx1XG4iCiAJCSJDYWxpYnJhdGlvblx0OiAlbHUgbG9vcHNcbiIsCi0JCShsb29wc19wZXJfamlmZnkgKiBIWikgLyA1MDAwMDAsCi0JCSgobG9vcHNfcGVyX2ppZmZ5ICogSFopIC8gNTAwMCkgJSAxMDAsCi0JCShsb29wc19wZXJfamlmZnkgKiBIWikpOworCQkoY3B1ZGF0YS0+bG9vcHNfcGVyX2ppZmZ5ICogSFopIC8gNTAwMDAwLAorCQkoKGNwdWRhdGEtPmxvb3BzX3Blcl9qaWZmeSAqIEhaKSAvIDUwMDApICUgMTAwLAorCQkoY3B1ZGF0YS0+bG9vcHNfcGVyX2ppZmZ5ICogSFopKTsKIAogCS8qIENoZWNrIENhY2hlIGNvbmZpZ3V0YXRpb24gKi8KLQlzd2l0Y2ggKGJmaW5fcmVhZF9ETUVNX0NPTlRST0woKSAmICgxIDw8IERNQzBfUCB8IDEgPDwgRE1DMV9QKSkgeworCXN3aXRjaCAoY3B1ZGF0YS0+ZG1lbWN0bCAmICgxIDw8IERNQzBfUCB8IDEgPDwgRE1DMV9QKSkgewogCWNhc2UgQUNBQ0hFX0JTUkFNOgogCQljYWNoZSA9ICJkYmFuay1BL0JcdDogY2FjaGUvc3JhbSI7CiAJCWRjYWNoZV9zaXplID0gMTY7CkBAIC0xMDU4LDEwICsxMTI2LDEwIEBACiAJfQogCiAJLyogSXMgaXQgdHVybmVkIG9uPyAqLwotCWlmICgoYmZpbl9yZWFkX0RNRU1fQ09OVFJPTCgpICYgKEVORENQTEIgfCBETUNfRU5BQkxFKSkgIT0gKEVORENQTEIgfCBETUNfRU5BQkxFKSkKKwlpZiAoKGNwdWRhdGEtPmRtZW1jdGwgJiAoRU5EQ1BMQiB8IERNQ19FTkFCTEUpKSAhPSAoRU5EQ1BMQiB8IERNQ19FTkFCTEUpKQogCQlkY2FjaGVfc2l6ZSA9IDA7CiAKLQlpZiAoKGJmaW5fcmVhZF9JTUVNX0NPTlRST0woKSAmIChJTUMgfCBFTklDUExCKSkgIT0gKElNQyB8IEVOSUNQTEIpKQorCWlmICgoY3B1ZGF0YS0+aW1lbWN0bCAmIChJTUMgfCBFTklDUExCKSkgIT0gKElNQyB8IEVOSUNQTEIpKQogCQlpY2FjaGVfc2l6ZSA9IDA7CiAKIAlzZXFfcHJpbnRmKG0sICJjYWNoZSBzaXplXHQ6ICVkIEtCKEwxIGljYWNoZSkgIgpAQCAtMTA4Niw4ICsxMTU0LDExIEBACiAJCSAgICJkY2FjaGUgc2V0dXBcdDogJWQgU3VwZXItYmFua3MvJWQgU3ViLWJhbmtzLyVkIFdheXMsICVkIExpbmVzL1dheVxuIiwKIAkJICAgZHN1cF9iYW5rcywgQkZJTl9EU1VCQkFOS1MsIEJGSU5fRFdBWVMsCiAJCSAgIEJGSU5fRExJTkVTKTsKKyNpZmRlZiBfX0FSQ0hfU1lOQ19DT1JFX0RDQUNIRQorCXNlcV9wcmludGYobSwgIlNNUCBEY2FjaGUgRmx1c2hlc1x0OiAlbHVcblxuIiwgY3B1ZGF0YS0+ZGNhY2hlX2ludmxkX2NvdW50KTsKKyNlbmRpZgogI2lmZGVmIENPTkZJR19CRklOX0lDQUNIRV9MT0NLCi0Jc3dpdGNoICgoYmZpbl9yZWFkX0lNRU1fQ09OVFJPTCgpID4+IDMpICYgV0FZQUxMX0wpIHsKKwlzd2l0Y2ggKChjcHVkYXRhLT5pbWVtY3RsID4+IDMpICYgV0FZQUxMX0wpIHsKIAljYXNlIFdBWTBfTDoKIAkJc2VxX3ByaW50ZihtLCAiV2F5MCBMb2NrZWQtRG93blxuIik7CiAJCWJyZWFrOwpAQCAtMTEzNyw2ICsxMjA4LDEyIEBACiAJCXNlcV9wcmludGYobSwgIk5vIFdheXMgYXJlIGxvY2tlZFxuIik7CiAJfQogI2VuZGlmCisKKwlpZiAoY3B1X251bSAhPSBudW1fcG9zc2libGVfY3B1cygpIC0gMSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoTDJfTEVOR1RIKQorCQlzZXFfcHJpbnRmKG0sICJMMiBTUkFNXHRcdDogJWRLQlxuIiwgTDJfTEVOR1RILzB4NDAwKTsKIAlzZXFfcHJpbnRmKG0sICJib2FyZCBuYW1lXHQ6ICVzXG4iLCBiZmluX2JvYXJkX25hbWUpOwogCXNlcV9wcmludGYobSwgImJvYXJkIG1lbW9yeVx0OiAlbGQga0IgKDB4JXAgLT4gMHglcClcbiIsCiAJCSBwaHlzaWNhbF9tZW1fZW5kID4+IDEwLCAodm9pZCAqKTAsICh2b2lkICopcGh5c2ljYWxfbWVtX2VuZCk7CkBAIC0xMTQ0LDYgKzEyMjEsNyBAQAogCQkoKGludCltZW1vcnlfZW5kIC0gKGludClfc3RleHQpID4+IDEwLAogCQlfc3RleHQsCiAJCSh2b2lkICopbWVtb3J5X2VuZCk7CisJc2VxX3ByaW50ZihtLCAiXG4iKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvdGltZS5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvdGltZS5jCmluZGV4IGViMjM1MjMuLjE3MmI0YzU4IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvdGltZS5jCkBAIC0xLDMyICsxLDExIEBACiAvKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL2tlcm5lbC90aW1lLmMKLSAqIEJhc2VkIG9uOiAgICAgbm9uZSAtIG9yaWdpbmFsIHdvcmsKLSAqIEF1dGhvcjoKKyAqIGFyY2gvYmxhY2tmaW4va2VybmVsL3RpbWUuYwogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgYmZpbi1zcGVjaWZpYyB0aW1lIGhhbmRsaW5nIGRldGFpbHMuCi0gKiAgICAgICAgICAgICAgIE1vc3Qgb2YgdGhlIHN0dWZmIGlzIGxvY2F0ZWQgaW4gdGhlIG1hY2hpbmUgc3BlY2lmaWMgZmlsZXMuCi0gKgkJIEZJWE1FOiAoVGhpcyBmaWxlIGlzIHN1YmplY3QgZm9yIHJlbW92YWwpCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIEJsYWNrZmluLXNwZWNpZmljIHRpbWUgaGFuZGxpbmcgZGV0YWlscy4KKyAqIE1vc3Qgb2YgdGhlIHN0dWZmIGlzIGxvY2F0ZWQgaW4gdGhlIG1hY2hpbmUgc3BlY2lmaWMgZmlsZXMuCiAgKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMzQsMjMgKzEzLDQzIEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKICNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KICNpbmNsdWRlIDxhc20vdGltZS5oPgorI2luY2x1ZGUgPGFzbS9ncHRpbWVycy5oPgogCiAvKiBUaGlzIGlzIGFuIE5UUCBzZXR0aW5nICovCiAjZGVmaW5lCVRJQ0tfU0laRSAodGlja19uc2VjIC8gMTAwMCkKIAotc3RhdGljIHZvaWQgdGltZV9zY2hlZF9pbml0KGlycV9oYW5kbGVyX3QgdGltZXJfcm91dGluZSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBnZXR0aW1lb2Zmc2V0KHZvaWQpOwotCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBiZmluX3RpbWVyX2lycSA9IHsKLQkubmFtZSA9ICJCRklOIFRpbWVyIFRpY2siLAorCS5uYW1lID0gIkJsYWNrZmluIFRpbWVyIFRpY2siLAorI2lmZGVmIENPTkZJR19JUlFfUEVSX0NQVQorCS5mbGFncyA9IElSUUZfRElTQUJMRUQgfCBJUlFGX1BFUkNQVSwKKyNlbHNlCiAJLmZsYWdzID0gSVJRRl9ESVNBQkxFRAorI2VuZGlmCiB9OwogCi1zdGF0aWMgdm9pZAotdGltZV9zY2hlZF9pbml0KGlycV9oYW5kbGVyX3QgdGltZXJfcm91dGluZSkKKyNpZiBkZWZpbmVkKENPTkZJR19USUNLX1NPVVJDRV9TWVNUTVIwKSB8fCBkZWZpbmVkKENPTkZJR19JUElQRSkKK3ZvaWQgX19pbml0IHNldHVwX3N5c3RlbV90aW1lcjAodm9pZCkKK3sKKwkvKiBQb3dlciBkb3duIHRoZSBjb3JlIHRpbWVyLCBqdXN0IHRvIHBsYXkgc2FmZS4gKi8KKwliZmluX3dyaXRlX1RDTlRMKDApOworCisJZGlzYWJsZV9ncHRpbWVycyhUSU1FUjBiaXQpOworCXNldF9ncHRpbWVyX3N0YXR1cygwLCBUSU1FUl9TVEFUVVNfVFJVTjApOworCXdoaWxlIChnZXRfZ3B0aW1lcl9zdGF0dXMoMCkgJiBUSU1FUl9TVEFUVVNfVFJVTjApCisJCXVkZWxheSgxMCk7CisKKwlzZXRfZ3B0aW1lcl9jb25maWcoMCwgMHg1OSk7IC8qIElSUSBlbmFibGUsIHBlcmlvZGljLCBQV01fT1VULCBTQ0xLZWQsIE9VVCBQQUQgZGlzYWJsZWQgKi8KKwlzZXRfZ3B0aW1lcl9wZXJpb2QoVElNRVIwX2lkLCBnZXRfc2NsaygpIC8gSFopOworCXNldF9ncHRpbWVyX3B3aWR0aChUSU1FUjBfaWQsIDEpOworCVNTWU5DKCk7CisJZW5hYmxlX2dwdGltZXJzKFRJTUVSMGJpdCk7Cit9CisjZWxzZQordm9pZCBfX2luaXQgc2V0dXBfY29yZV90aW1lcih2b2lkKQogewogCXUzMiB0Y291bnQ7CiAKQEAgLTU4LDEwICs1Nyw4IEBACiAJYmZpbl93cml0ZV9UQ05UTCgxKTsKIAlDU1lOQygpOwogCi0JLyoKLQkgKiB0aGUgVFNDQUxFIHByZXNjYWxlciBjb3VudGVyLgotCSAqLwotCWJmaW5fd3JpdGVfVFNDQUxFKChUSU1FX1NDQUxFIC0gMSkpOworCS8qIHRoZSBUU0NBTEUgcHJlc2NhbGVyIGNvdW50ZXIgKi8KKwliZmluX3dyaXRlX1RTQ0FMRShUSU1FX1NDQUxFIC0gMSk7CiAKIAl0Y291bnQgPSAoKGdldF9jY2xrKCkgLyAoSFogKiBUSU1FX1NDQUxFKSkgLSAxKTsKIAliZmluX3dyaXRlX1RQRVJJT0QodGNvdW50KTsKQEAgLTcxLDM1ICs2OCw1MiBAQAogCUNTWU5DKCk7CiAKIAliZmluX3dyaXRlX1RDTlRMKDcpOworfQorI2VuZGlmCiAKLQliZmluX3RpbWVyX2lycS5oYW5kbGVyID0gKGlycV9oYW5kbGVyX3QpdGltZXJfcm91dGluZTsKLQkvKiBjYWxsIHNldHVwX2lycSBpbnN0ZWFkIG9mIHJlcXVlc3RfaXJxIGJlY2F1c2UgcmVxdWVzdF9pcnEgY2FsbHMKLQkgKiBrbWFsbG9jIHdoaWNoIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXQKLQkgKi8KK3N0YXRpYyB2b2lkIF9faW5pdAordGltZV9zY2hlZF9pbml0KGlycXJldHVybl90KCp0aW1lcl9yb3V0aW5lKSAoaW50LCB2b2lkICopKQoreworI2lmIGRlZmluZWQoQ09ORklHX1RJQ0tfU09VUkNFX1NZU1RNUjApIHx8IGRlZmluZWQoQ09ORklHX0lQSVBFKQorCXNldHVwX3N5c3RlbV90aW1lcjAoKTsKKwliZmluX3RpbWVyX2lycS5oYW5kbGVyID0gdGltZXJfcm91dGluZTsKKwlzZXR1cF9pcnEoSVJRX1RJTUVSMCwgJmJmaW5fdGltZXJfaXJxKTsKKyNlbHNlCisJc2V0dXBfY29yZV90aW1lcigpOworCWJmaW5fdGltZXJfaXJxLmhhbmRsZXIgPSB0aW1lcl9yb3V0aW5lOwogCXNldHVwX2lycShJUlFfQ09SRVRNUiwgJmJmaW5fdGltZXJfaXJxKTsKKyNlbmRpZgogfQogCiAvKgogICogU2hvdWxkIHJldHVybiB1c2Vjb25kcyBzaW5jZSBsYXN0IHRpbWVyIHRpY2sKICAqLworI2lmbmRlZiBDT05GSUdfR0VORVJJQ19USU1FCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXR0aW1lb2Zmc2V0KHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CiAJdW5zaWduZWQgbG9uZyBjbG9ja3NfcGVyX2ppZmZ5OwogCisjaWYgZGVmaW5lZChDT05GSUdfVElDS19TT1VSQ0VfU1lTVE1SMCkgfHwgZGVmaW5lZChDT05GSUdfSVBJUEUpCisJY2xvY2tzX3Blcl9qaWZmeSA9IGJmaW5fcmVhZF9USU1FUjBfUEVSSU9EKCk7CisJb2Zmc2V0ID0gYmZpbl9yZWFkX1RJTUVSMF9DT1VOVEVSKCkgLyBcCisJCSgoKGNsb2Nrc19wZXJfamlmZnkgKyAxKSAqIEhaKSAvIFVTRUNfUEVSX1NFQyk7CisKKwlpZiAoKGdldF9ncHRpbWVyX3N0YXR1cygwKSAmIFRJTUVSX1NUQVRVU19USU1JTDApICYmIG9mZnNldCA8ICgxMDAwMDAgLyBIWiAvIDIpKQorCQlvZmZzZXQgKz0gKFVTRUNfUEVSX1NFQyAvIEhaKTsKKyNlbHNlCiAJY2xvY2tzX3Blcl9qaWZmeSA9IGJmaW5fcmVhZF9UUEVSSU9EKCk7Ci0Jb2Zmc2V0ID0KLQkgICAgKGNsb2Nrc19wZXJfamlmZnkgLQotCSAgICAgYmZpbl9yZWFkX1RDT1VOVCgpKSAvICgoKGNsb2Nrc19wZXJfamlmZnkgKyAxKSAqIEhaKSAvCi0JCQkJICAgIFVTRUNfUEVSX1NFQyk7CisJb2Zmc2V0ID0gKGNsb2Nrc19wZXJfamlmZnkgLSBiZmluX3JlYWRfVENPVU5UKCkpIC8gXAorCQkoKChjbG9ja3NfcGVyX2ppZmZ5ICsgMSkgKiBIWikgLyBVU0VDX1BFUl9TRUMpOwogCiAJLyogQ2hlY2sgaWYgd2UganVzdCB3cmFwcGVkIHRoZSBjb3VudGVycyBhbmQgbWF5YmUgbWlzc2VkIGEgdGljayAqLwogCWlmICgoYmZpbl9yZWFkX0lMQVQoKSAmICgxIDw8IElSUV9DT1JFVE1SKSkKLQkgICAgJiYgKG9mZnNldCA8ICgxMDAwMDAgLyBIWiAvIDIpKSkKKwkJJiYgKG9mZnNldCA8ICgxMDAwMDAgLyBIWiAvIDIpKSkKIAkJb2Zmc2V0ICs9IChVU0VDX1BFUl9TRUMgLyBIWik7Ci0KKyNlbmRpZgogCXJldHVybiBvZmZzZXQ7CiB9CisjZW5kaWYKIAogc3RhdGljIGlubGluZSBpbnQgc2V0X3J0Y19tbXNzKHVuc2lnbmVkIGxvbmcgbm93dGltZSkKIHsKQEAgLTExMSw0MyArMTI1LDQ5IEBACiAgKiBhcyB3ZWxsIGFzIGNhbGwgdGhlICJkb190aW1lcigpIiByb3V0aW5lIGV2ZXJ5IGNsb2NrdGljawogICovCiAjaWZkZWYgQ09ORklHX0NPUkVfVElNRVJfSVJRX0wxCi1pcnFyZXR1cm5fdCB0aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZHVtbXkpX19hdHRyaWJ1dGVfXygobDFfdGV4dCkpOworX19hdHRyaWJ1dGVfXygobDFfdGV4dCkpCiAjZW5kaWYKLQogaXJxcmV0dXJuX3QgdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmR1bW15KQogewogCS8qIGxhc3QgdGltZSB0aGUgY21vcyBjbG9jayBnb3QgdXBkYXRlZCAqLwogCXN0YXRpYyBsb25nIGxhc3RfcnRjX3VwZGF0ZTsKIAogCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOworI2lmIGRlZmluZWQoQ09ORklHX1RJQ0tfU09VUkNFX1NZU1RNUjApICYmICFkZWZpbmVkKENPTkZJR19JUElQRSkKKy8qIEZJWE1FOiBIZXJlIFRJTUlMMCBpcyBub3Qgc2V0IHdoZW4gSVBJUEUgZW5hYmxlZCwgd2h5PyAqLworCWlmIChnZXRfZ3B0aW1lcl9zdGF0dXMoMCkgJiBUSU1FUl9TVEFUVVNfVElNSUwwKSB7CisjZW5kaWYKKwkJZG9fdGltZXIoMSk7CiAKLQlkb190aW1lcigxKTsKLQotCXByb2ZpbGVfdGljayhDUFVfUFJPRklMSU5HKTsKLQotCS8qCi0JICogSWYgd2UgaGF2ZSBhbiBleHRlcm5hbGx5IHN5bmNocm9uaXplZCBMaW51eCBjbG9jaywgdGhlbiB1cGRhdGUKLQkgKiBDTU9TIGNsb2NrIGFjY29yZGluZ2x5IGV2ZXJ5IH4xMSBtaW51dGVzLiBTZXRfcnRjX21tc3MoKSBoYXMgdG8gYmUKLQkgKiBjYWxsZWQgYXMgY2xvc2UgYXMgcG9zc2libGUgdG8gNTAwIG1zIGJlZm9yZSB0aGUgbmV3IHNlY29uZCBzdGFydHMuCi0JICovCi0KLQlpZiAobnRwX3N5bmNlZCgpICYmCi0JICAgIHh0aW1lLnR2X3NlYyA+IGxhc3RfcnRjX3VwZGF0ZSArIDY2MCAmJgotCSAgICAoeHRpbWUudHZfbnNlYyAvIE5TRUNfUEVSX1VTRUMpID49Ci0JICAgIDUwMDAwMCAtICgodW5zaWduZWQpVElDS19TSVpFKSAvIDIKLQkgICAgJiYgKHh0aW1lLnR2X25zZWMgLyBOU0VDX1BFUl9VU0VDKSA8PQotCSAgICA1MDAwMDAgKyAoKHVuc2lnbmVkKVRJQ0tfU0laRSkgLyAyKSB7Ci0JCWlmIChzZXRfcnRjX21tc3MoeHRpbWUudHZfc2VjKSA9PSAwKQotCQkJbGFzdF9ydGNfdXBkYXRlID0geHRpbWUudHZfc2VjOwotCQllbHNlCi0JCQkvKiBEbyBpdCBhZ2FpbiBpbiA2MHMuICovCi0JCQlsYXN0X3J0Y191cGRhdGUgPSB4dGltZS50dl9zZWMgLSA2MDA7CisJCS8qCisJCSAqIElmIHdlIGhhdmUgYW4gZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQgTGludXggY2xvY2ssIHRoZW4gdXBkYXRlCisJCSAqIENNT1MgY2xvY2sgYWNjb3JkaW5nbHkgZXZlcnkgfjExIG1pbnV0ZXMuIFNldF9ydGNfbW1zcygpIGhhcyB0byBiZQorCQkgKiBjYWxsZWQgYXMgY2xvc2UgYXMgcG9zc2libGUgdG8gNTAwIG1zIGJlZm9yZSB0aGUgbmV3IHNlY29uZCBzdGFydHMuCisJCSAqLworCQlpZiAobnRwX3N5bmNlZCgpICYmCisJCSAgICB4dGltZS50dl9zZWMgPiBsYXN0X3J0Y191cGRhdGUgKyA2NjAgJiYKKwkJICAgICh4dGltZS50dl9uc2VjIC8gTlNFQ19QRVJfVVNFQykgPj0KKwkJICAgIDUwMDAwMCAtICgodW5zaWduZWQpVElDS19TSVpFKSAvIDIKKwkJICAgICYmICh4dGltZS50dl9uc2VjIC8gTlNFQ19QRVJfVVNFQykgPD0KKwkJICAgIDUwMDAwMCArICgodW5zaWduZWQpVElDS19TSVpFKSAvIDIpIHsKKwkJCWlmIChzZXRfcnRjX21tc3MoeHRpbWUudHZfc2VjKSA9PSAwKQorCQkJCWxhc3RfcnRjX3VwZGF0ZSA9IHh0aW1lLnR2X3NlYzsKKwkJCWVsc2UKKwkJCQkvKiBEbyBpdCBhZ2FpbiBpbiA2MHMuICovCisJCQkJbGFzdF9ydGNfdXBkYXRlID0geHRpbWUudHZfc2VjIC0gNjAwOworCQl9CisjaWYgZGVmaW5lZChDT05GSUdfVElDS19TT1VSQ0VfU1lTVE1SMCkgJiYgIWRlZmluZWQoQ09ORklHX0lQSVBFKQorCQlzZXRfZ3B0aW1lcl9zdGF0dXMoMCwgVElNRVJfU1RBVFVTX1RJTUlMMCk7CiAJfQorI2VuZGlmCiAJd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKIAotI2lmbmRlZiBDT05GSUdfU01QCisjaWZkZWYgQ09ORklHX0lQSVBFCisJdXBkYXRlX3Jvb3RfcHJvY2Vzc190aW1lcyhnZXRfaXJxX3JlZ3MoKSk7CisjZWxzZQogCXVwZGF0ZV9wcm9jZXNzX3RpbWVzKHVzZXJfbW9kZShnZXRfaXJxX3JlZ3MoKSkpOwogI2VuZGlmCisJcHJvZmlsZV90aWNrKENQVV9QUk9GSUxJTkcpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL3RyYXBzLmMKaW5kZXggYmVmMDI1Yi4uMTdkOGU0MSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC90cmFwcy5jCkBAIC03NSwxNiArNzUsNiBAQAogCUNTWU5DKCk7CiB9CiAKLS8qCi0gKiBVc2VkIHRvIHNhdmUgdGhlIFJFVFgsIFNFUVNUQVQsIEkvRCBDUExCIEZBVUxUIEFERFIKLSAqIHZhbHVlcyBhY3Jvc3MgdGhlIHRyYW5zaXRpb24gZnJvbSBleGNlcHRpb24gdG8gSVJRNS4KLSAqIFdlIHB1dCB0aGVzZSBpbiBMMSwgc28gdGhleSBhcmUgZ29pbmcgdG8gYmUgaW4gYSB2YWxpZAotICogbG9jYXRpb24gZHVyaW5nIGV4Y2VwdGlvbiBjb250ZXh0Ci0gKi8KLV9fYXR0cmlidXRlX18oKGwxX2RhdGEpKQotdW5zaWduZWQgbG9uZyBzYXZlZF9yZXR4LCBzYXZlZF9zZXFzdGF0LAotCXNhdmVkX2ljcGxiX2ZhdWx0X2FkZHIsIHNhdmVkX2RjcGxiX2ZhdWx0X2FkZHI7Ci0KIHN0YXRpYyB2b2lkIGRlY29kZV9hZGRyZXNzKGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewogI2lmZGVmIENPTkZJR19ERUJVR19WRVJCT1NFCkBAIC0yMTEsMTggKzIwMSwxOCBAQAogCXByaW50ayhLRVJOX0VNRVJHICJcbiIgS0VSTl9FTUVSRyAiRG91YmxlIEZhdWx0XG4iKTsKICNpZmRlZiBDT05GSUdfREVCVUdfRE9VQkxFRkFVTFRfUFJJTlQKIAlpZiAoKChsb25nKWZwLT5zZXFzdGF0ICYgIFNFUVNUQVRfRVhDQVVTRSkgPT0gVkVDX1VOQ09WKSB7CisJCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJCWNoYXIgYnVmWzE1MF07Ci0JCWRlY29kZV9hZGRyZXNzKGJ1Ziwgc2F2ZWRfcmV0eCk7CisJCWRlY29kZV9hZGRyZXNzKGJ1ZiwgY3B1X3BkYVtjcHVdLnJldHgpOwogCQlwcmludGsoS0VSTl9FTUVSRyAiV2hpbGUgaGFuZGxpbmcgZXhjZXB0aW9uIChFWENBVVNFID0gMHgleCkgYXQgJXM6XG4iLAotCQkJKGludClzYXZlZF9zZXFzdGF0ICYgU0VRU1RBVF9FWENBVVNFLCBidWYpOwotCQlkZWNvZGVfYWRkcmVzcyhidWYsIHNhdmVkX2RjcGxiX2ZhdWx0X2FkZHIpOworCQkJKHVuc2lnbmVkIGludCljcHVfcGRhW2NwdV0uc2Vxc3RhdCAmIFNFUVNUQVRfRVhDQVVTRSwgYnVmKTsKKwkJZGVjb2RlX2FkZHJlc3MoYnVmLCBjcHVfcGRhW2NwdV0uZGNwbGJfZmF1bHRfYWRkcik7CiAJCXByaW50ayhLRVJOX05PVElDRSAiICAgRENQTEJfRkFVTFRfQUREUjogJXNcbiIsIGJ1Zik7Ci0JCWRlY29kZV9hZGRyZXNzKGJ1Ziwgc2F2ZWRfaWNwbGJfZmF1bHRfYWRkcik7CisJCWRlY29kZV9hZGRyZXNzKGJ1ZiwgY3B1X3BkYVtjcHVdLmljcGxiX2ZhdWx0X2FkZHIpOwogCQlwcmludGsoS0VSTl9OT1RJQ0UgIiAgIElDUExCX0ZBVUxUX0FERFI6ICVzXG4iLCBidWYpOwogCiAJCWRlY29kZV9hZGRyZXNzKGJ1ZiwgZnAtPnJldHgpOwotCQlwcmludGsoS0VSTl9OT1RJQ0UgIlRoZSBpbnN0cnVjdGlvbiBhdCAlcyBjYXVzZWQgYSBkb3VibGUgZXhjZXB0aW9uXG4iLAotCQkJYnVmKTsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJUaGUgaW5zdHJ1Y3Rpb24gYXQgJXMgY2F1c2VkIGEgZG91YmxlIGV4Y2VwdGlvblxuIiwgYnVmKTsKIAl9IGVsc2UKICNlbmRpZgogCXsKQEAgLTI0MCw2ICsyMzAsOSBAQAogI2lmZGVmIENPTkZJR19ERUJVR19CRklOX0hXVFJBQ0VfT04KIAlpbnQgajsKICNlbmRpZgorI2lmZGVmIENPTkZJR19ERUJVR19IVU5UX0ZPUl9aRVJPCisJdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKyNlbmRpZgogCWludCBzaWcgPSAwOwogCXNpZ2luZm9fdCBpbmZvOwogCXVuc2lnbmVkIGxvbmcgdHJhcG5yID0gZnAtPnNlcXN0YXQgJiBTRVFTVEFUX0VYQ0FVU0U7CkBAIC00MTcsNyArNDEwLDcgQEAKIAkJaW5mby5zaV9jb2RlID0gSUxMX0NQTEJfTVVMSElUOwogCQlzaWcgPSBTSUdTRUdWOwogI2lmZGVmIENPTkZJR19ERUJVR19IVU5UX0ZPUl9aRVJPCi0JCWlmIChzYXZlZF9kY3BsYl9mYXVsdF9hZGRyIDwgRklYRURfQ09ERV9TVEFSVCkKKwkJaWYgKGNwdV9wZGFbY3B1XS5kY3BsYl9mYXVsdF9hZGRyIDwgRklYRURfQ09ERV9TVEFSVCkKIAkJCXZlcmJvc2VfcHJpbnRrKEtFUk5fTk9USUNFICJOVUxMIHBvaW50ZXIgYWNjZXNzXG4iKTsKIAkJZWxzZQogI2VuZGlmCkBAIC00NzEsNyArNDY0LDcgQEAKIAkJaW5mby5zaV9jb2RlID0gSUxMX0NQTEJfTVVMSElUOwogCQlzaWcgPSBTSUdTRUdWOwogI2lmZGVmIENPTkZJR19ERUJVR19IVU5UX0ZPUl9aRVJPCi0JCWlmIChzYXZlZF9pY3BsYl9mYXVsdF9hZGRyIDwgRklYRURfQ09ERV9TVEFSVCkKKwkJaWYgKGNwdV9wZGFbY3B1XS5pY3BsYl9mYXVsdF9hZGRyIDwgRklYRURfQ09ERV9TVEFSVCkKIAkJCXZlcmJvc2VfcHJpbnRrKEtFUk5fTk9USUNFICJKdW1wIHRvIE5VTEwgYWRkcmVzc1xuIik7CiAJCWVsc2UKICNlbmRpZgpAQCAtNTg0LDEwICs1NzcsMTUgQEAKIAkJfQogCX0KIAotCWluZm8uc2lfc2lnbm8gPSBzaWc7Ci0JaW5mby5zaV9lcnJubyA9IDA7Ci0JaW5mby5zaV9hZGRyID0gKHZvaWQgX191c2VyICopZnAtPnBjOwotCWZvcmNlX3NpZ19pbmZvKHNpZywgJmluZm8sIGN1cnJlbnQpOworI2lmZGVmIENPTkZJR19JUElQRQorCWlmICghaXBpcGVfdHJhcF9ub3RpZnkoZnAtPnNlcXN0YXQgJiAweDNmLCBmcCkpCisjZW5kaWYKKwl7CisJCWluZm8uc2lfc2lnbm8gPSBzaWc7CisJCWluZm8uc2lfZXJybm8gPSAwOworCQlpbmZvLnNpX2FkZHIgPSAodm9pZCBfX3VzZXIgKilmcC0+cGM7CisJCWZvcmNlX3NpZ19pbmZvKHNpZywgJmluZm8sIGN1cnJlbnQpOworCX0KIAogCXRyYWNlX2J1ZmZlcl9yZXN0b3JlKGopOwogCXJldHVybjsKQEAgLTY1NiwxMyArNjU0LDEzIEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi0vKiAKKy8qCiAgKiBkZWNvZGUgdGhlIGluc3RydWN0aW9uIGlmIHdlIGFyZSBwcmludGluZyBvdXQgdGhlIHRyYWNlLCBhcyBpdAogICogbWFrZXMgdGhpbmdzIGVhc2llciB0byBmb2xsb3csIHdpdGhvdXQgcnVubmluZyBpdCB0aHJvdWdoIG9iamR1bXAKICAqIFRoZXNlIGFyZSB0aGUgbm9ybWFsIGluc3RydWN0aW9ucyB3aGljaCBjYXVzZSBjaGFuZ2Ugb2YgZmxvdywgd2hpY2gKICAqIHdvdWxkIGJlIGF0IHRoZSBzb3VyY2Ugb2YgdGhlIHRyYWNlIGJ1ZmZlcgogICovCi0jaWZkZWYgQ09ORklHX0RFQlVHX1ZFUkJPU0UKKyNpZiBkZWZpbmVkKENPTkZJR19ERUJVR19WRVJCT1NFKSAmJiBkZWZpbmVkKENPTkZJR19ERUJVR19CRklOX0hXVFJBQ0VfT04pCiBzdGF0aWMgdm9pZCBkZWNvZGVfaW5zdHJ1Y3Rpb24odW5zaWduZWQgc2hvcnQgKmFkZHJlc3MpCiB7CiAJdW5zaWduZWQgc2hvcnQgb3Bjb2RlOwpAQCAtODQ2LDcgKzg0NCw3IEBACiAJfQogCWlmIChmcCkgewogCQlmcmFtZSA9IGZwOwotCQlwcmludGsoIiBGUDogKDB4JXApXG4iLCBmcCk7CisJCXByaW50ayhLRVJOX05PVElDRSAiIEZQOiAoMHglcClcbiIsIGZwKTsKIAl9IGVsc2UKIAkJZnJhbWUgPSAwOwogCkBAIC05NjAsNiArOTU4LDcgQEAKIAkJZWxzZQogCQkJdmVyYm9zZV9wcmludGsoS0VSTl9OT1RJQ0UgIkNPTU09IGludmFsaWRcbiIpOwogCisJCXByaW50ayhLRVJOX05PVElDRSAiQ1BVID0gJWRcbiIsIGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+Y3B1KTsKIAkJaWYgKCEoKHVuc2lnbmVkIGxvbmcpY3VycmVudC0+bW0gJiAweDMpICYmICh1bnNpZ25lZCBsb25nKWN1cnJlbnQtPm1tID49IEZJWEVEX0NPREVfU1RBUlQpCiAJCQl2ZXJib3NlX3ByaW50ayhLRVJOX05PVElDRSAgIlRFWFQgPSAweCVwLTB4JXAgICAgICAgIERBVEEgPSAweCVwLTB4JXBcbiIKIAkJCQlLRVJOX05PVElDRSAiIEJTUyA9IDB4JXAtMHglcCAgVVNFUi1TVEFDSyA9IDB4JXBcbiIKQEAgLTEwNTMsNiArMTA1Miw3IEBACiAJc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uOwogCXVuc2lnbmVkIGludCBpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAogCXZlcmJvc2VfcHJpbnRrKEtFUk5fTk9USUNFICJcbiIgS0VSTl9OT1RJQ0UgIlNFUVVFTkNFUiBTVEFUVVM6XHRcdCVzXG4iLCBwcmludF90YWludGVkKCkpOwogCXZlcmJvc2VfcHJpbnRrKEtFUk5fTk9USUNFICIgU0VRU1RBVDogJTA4bHggIElQRU5EOiAlMDRseCAgU1lTQ0ZHOiAlMDRseFxuIiwKQEAgLTExMTIsOSArMTExMiw5IEBACiAKIAlpZiAoKChsb25nKWZwLT5zZXFzdGF0ICYgIFNFUVNUQVRfRVhDQVVTRSkgJiYKIAkgICAgKCgobG9uZylmcC0+c2Vxc3RhdCAmIFNFUVNUQVRfRVhDQVVTRSkgIT0gVkVDX0hXRVJSKSkgewotCQlkZWNvZGVfYWRkcmVzcyhidWYsIHNhdmVkX2RjcGxiX2ZhdWx0X2FkZHIpOworCQlkZWNvZGVfYWRkcmVzcyhidWYsIGNwdV9wZGFbY3B1XS5kY3BsYl9mYXVsdF9hZGRyKTsKIAkJdmVyYm9zZV9wcmludGsoS0VSTl9OT1RJQ0UgIkRDUExCX0ZBVUxUX0FERFI6ICVzXG4iLCBidWYpOwotCQlkZWNvZGVfYWRkcmVzcyhidWYsIHNhdmVkX2ljcGxiX2ZhdWx0X2FkZHIpOworCQlkZWNvZGVfYWRkcmVzcyhidWYsIGNwdV9wZGFbY3B1XS5pY3BsYl9mYXVsdF9hZGRyKTsKIAkJdmVyYm9zZV9wcmludGsoS0VSTl9OT1RJQ0UgIklDUExCX0ZBVUxUX0FERFI6ICVzXG4iLCBidWYpOwogCX0KIApAQCAtMTE1MywyMCArMTE1MywyMSBAQAogYXNtbGlua2FnZSBpbnQgc3lzX2JmaW5fc3BpbmxvY2soaW50ICpzcGlubG9jaylfX2F0dHJpYnV0ZV9fKChsMV90ZXh0KSk7CiAjZW5kaWYKIAotYXNtbGlua2FnZSBpbnQgc3lzX2JmaW5fc3BpbmxvY2soaW50ICpzcGlubG9jaykKLXsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgdG1wID0gMDsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soYmZpbl9zcGlubG9ja19sb2NrKTsKIAotCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JcmV0ID0gZ2V0X3VzZXIodG1wLCBzcGlubG9jayk7Ci0JaWYgKHJldCA9PSAwKSB7Ci0JCWlmICh0bXApCithc21saW5rYWdlIGludCBzeXNfYmZpbl9zcGlubG9jayhpbnQgKnApCit7CisJaW50IHJldCwgdG1wID0gMDsKKworCXNwaW5fbG9jaygmYmZpbl9zcGlubG9ja19sb2NrKTsJLyogVGhpcyB3b3VsZCBhbHNvIGhvbGQga2VybmVsIHByZWVtcHRpb24uICovCisJcmV0ID0gZ2V0X3VzZXIodG1wLCBwKTsKKwlpZiAobGlrZWx5KHJldCA9PSAwKSkgeworCQlpZiAodW5saWtlbHkodG1wKSkKIAkJCXJldCA9IDE7Ci0JCXRtcCA9IDE7Ci0JCXB1dF91c2VyKHRtcCwgc3BpbmxvY2spOworCQllbHNlCisJCQlwdXRfdXNlcigxLCBwKTsKIAl9Ci0JbG9jYWxfaXJxX2VuYWJsZSgpOworCXNwaW5fdW5sb2NrKCZiZmluX3NwaW5sb2NrX2xvY2spOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IDdkMTJjNjYuLjRiNDM0MWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtNjgsNiArNjgsOCBAQAogCQlfX2V0ZXh0ID0gLjsKIAl9CiAKKwlOT1RFUworCiAJLyogSnVzdCBpbiBjYXNlIHRoZSBmaXJzdCByZWFkIG9ubHkgaXMgYSAzMi1iaXQgYWNjZXNzICovCiAJUk9fREFUQSg0KQogCkBAIC0xMDksNyArMTExLDYgQEAKICNlbmRpZgogCiAJCURBVEFfREFUQQotCQkqKC5kYXRhLiopCiAJCUNPTlNUUlVDVE9SUwogCiAJCS8qIG1ha2Ugc3VyZSB0aGUgaW5pdF90YXNrIGlzIGFsaWduZWQgdG8gdGhlCkBAIC0xNjEsMTIgKzE2MiwxNCBAQAogCQkqKC5jb25faW5pdGNhbGwuaW5pdCkKIAkJX19fY29uX2luaXRjYWxsX2VuZCA9IC47CiAJfQorCVBFUkNQVSg0KQogCVNFQ1VSSVRZX0lOSVQKIAkuaW5pdC5yYW1mcyA6CiAJewogCQkuID0gQUxJR04oNCk7CiAJCV9fX2luaXRyYW1mc19zdGFydCA9IC47CiAJCSooLmluaXQucmFtZnMpCisJCS4gPSBBTElHTig0KTsKIAkJX19faW5pdHJhbWZzX2VuZCA9IC47CiAJfQogCkBAIC0yMTIsNyArMjE1LDcgQEAKIAkJX19lYnNzX2JfbDEgPSAuOwogCX0KIAotCV9fbDJfbG1hX3N0YXJ0ID0gLjsKKwlfX2wyX2xtYV9zdGFydCA9IExPQURBRERSKC5kYXRhX2JfbDEpICsgU0laRU9GKC5kYXRhX2JfbDEpOwogCiAJLnRleHRfZGF0YV9sMiBMMl9TVEFSVCA6IEFUKExPQURBRERSKC5kYXRhX2JfbDEpICsgU0laRU9GKC5kYXRhX2JfbDEpKQogCXsKQEAgLTI0MCw3ICsyNDMsNyBAQAogCS8qIEZvcmNlIHRyYWlsaW5nIGFsaWdubWVudCBvZiBvdXIgaW5pdCBzZWN0aW9uIHNvIHRoYXQgd2hlbiB3ZQogCSAqIGZyZWUgb3VyIGluaXQgbWVtb3J5LCB3ZSBkb24ndCBsZWF2ZSBiZWhpbmQgYSBwYXJ0aWFsIHBhZ2UuCiAJICovCi0JLiA9IExPQURBRERSKC5kYXRhX2JfbDEpICsgU0laRU9GKC5kYXRhX2JfbDEpOworCS4gPSBMT0FEQUREUigudGV4dF9kYXRhX2wyKSArIFNJWkVPRigudGV4dF9kYXRhX2wyKTsKIAkuID0gQUxJR04oUEFHRV9TSVpFKTsKIAlfX19pbml0X2VuZCA9IC47CiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbGliL2NoZWNrc3VtLmMgYi9hcmNoL2JsYWNrZmluL2xpYi9jaGVja3N1bS5jCmluZGV4IDVjODc1MDUuLjc2MmE3ZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbGliL2NoZWNrc3VtLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9saWIvY2hlY2tzdW0uYwpAQCAtMjksNiArMjksNyBAQAogICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CiAjaW5jbHVkZSA8YXNtL2NoZWNrc3VtLmg+CiAKQEAgLTc2LDYgKzc3LDcgQEAKIHsKIAlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNil+ZG9fY3N1bShpcGgsIGlobCAqIDQpOwogfQorRVhQT1JUX1NZTUJPTChpcF9mYXN0X2NzdW0pOwogCiAvKgogICogY29tcHV0ZXMgdGhlIGNoZWNrc3VtIG9mIGEgbWVtb3J5IGJsb2NrIGF0IGJ1ZmYsIGxlbmd0aCBsZW4sCkBAIC0xMDQsNiArMTA2LDcgQEAKIAogCXJldHVybiBzdW07CiB9CitFWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbCk7CiAKIC8qCiAgKiB0aGlzIHJvdXRpbmUgaXMgdXNlZCBmb3IgbWlzY2VsbGFuZW91cyBJUC1saWtlIGNoZWNrc3VtcywgbWFpbmx5CkBAIC0xMzcsMyArMTQwLDQgQEAKIAltZW1jcHkoZHN0LCBzcmMsIGxlbik7CiAJcmV0dXJuIGNzdW1fcGFydGlhbChkc3QsIGxlbiwgc3VtKTsKIH0KK0VYUE9SVF9TWU1CT0woY3N1bV9wYXJ0aWFsX2NvcHkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9saWIvaW5zLlMgYi9hcmNoL2JsYWNrZmluL2xpYi9pbnMuUwppbmRleCBkNjA1NTRkLi4xODYzYTZiIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2xpYi9pbnMuUworKysgYi9hcmNoL2JsYWNrZmluL2xpYi9pbnMuUwpAQCAtMSwzMSArMSw5IEBACiAvKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL2xpYi9pbnMuUwotICogQmFzZWQgb246Ci0gKiBBdXRob3I6ICAgICAgIEJhcyBWZXJtZXVsZW4gPGJhc0BidXl3YXlzLm5sPgorICogYXJjaC9ibGFja2Zpbi9saWIvaW5zLlMgLSBpbnN7YndsfSB1c2luZyBoYXJkd2FyZSBsb29wcwogICoKLSAqIENyZWF0ZWQ6ICAgICAgVHVlIE1hciAyMiAxNToyNzoyNCBDRVNUIDIwMDUKLSAqIERlc2NyaXB0aW9uOiAgSW1wbGVtZW50YXRpb24gb2YgaW5ze2J3bH0gZm9yIEJsYWNrRmluIHByb2Nlc3NvcnMgdXNpbmcgemVybyBvdmVyaGVhZCBsb29wcy4KLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMjAwNSBCYXMgVmVybWV1bGVuLCBCdXlXYXlzIEJWIDxiYXNAYnV5d2F5cy5ubD4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA1IEJhcyBWZXJtZXVsZW4sIEJ1eVdheXMgQlYgPGJhc0BidXl3YXlzLm5sPgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CkBAIC0zMyw2ICsxMSw0NiBAQAogCiAuYWxpZ24gMgogCisjaWZkZWYgQ09ORklHX0lQSVBFCisjIGRlZmluZSBET19DTEkgXAorCVstLXNwXSA9IHJldHM7IFwKKwlbLS1zcF0gPSAoUDU6MCk7IFwKKwlzcCArPSAtMTI7IFwKKwljYWxsIF9fX2lwaXBlX3N0YWxsX3Jvb3RfcmF3OyBcCisJc3AgKz0gMTI7IFwKKwkoUDU6MCkgPSBbc3ArK107CisjIGRlZmluZSBDTElfSU5ORVJfTk9QCisjZWxzZQorIyBkZWZpbmUgRE9fQ0xJIGNsaSBSMzsKKyMgZGVmaW5lIENMSV9JTk5FUl9OT1Agbm9wOyBub3A7IG5vcDsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0lQSVBFCisjIGRlZmluZSBET19TVEkgXAorCXNwICs9IC0xMjsgXAorCWNhbGwgX19faXBpcGVfdW5zdGFsbF9yb290X3JhdzsgXAorCXNwICs9IDEyOyBcCisyOglyZXRzID0gW3NwKytdOworI2Vsc2UKKyMgZGVmaW5lIERPX1NUSSAyOiBzdGkgUjM7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19CRklOX0lOU19MT1dPVkVSSEVBRAorIyBkZWZpbmUgQ0xJX09VVEVSIERPX0NMSTsKKyMgZGVmaW5lIFNUSV9PVVRFUiBET19TVEk7CisjIGRlZmluZSBDTElfSU5ORVIgMToKKyMgaWYgQU5PTUFMWV8wNTAwMDQxNgorIyAgZGVmaW5lIFNUSV9JTk5FUiBub3A7IDI6IG5vcDsKKyMgZWxzZQorIyAgZGVmaW5lIFNUSV9JTk5FUiAyOgorIyBlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIENMSV9PVVRFUgorIyBkZWZpbmUgU1RJX09VVEVSCisjIGRlZmluZSBDTElfSU5ORVIgMTogRE9fQ0xJOyBDTElfSU5ORVJfTk9QOworIyBkZWZpbmUgU1RJX0lOTkVSIERPX1NUSTsKKyNlbmRpZgorCiAvKgogICogUmVhZHMgb24gdGhlIEJsYWNrZmluIGFyZSBzcGVjdWxhdGl2ZS4gSW4gQmxhY2tmaW4gdGVybXMsIHRoaXMgbWVhbnMgdGhleQogICogY2FuIGJlIGludGVycnVwdGVkIGF0IGFueSB0aW1lIChldmVuIGFmdGVyIHRoZXkgaGF2ZSBiZWVuIGlzc3VlZCBvbiB0byB0aGUKQEAgLTUzLDE3MCArNzEsNDggQEAKICAqIGJ1ZmZlcnMgaW4vb3V0IG9mIEZJRk9zLgogICovCiAKLUVOVFJZKF9pbnNsKQotI2lmZGVmIENPTkZJR19CRklOX0lOU19MT1dPVkVSSEVBRAotCVAwID0gUjA7CS8qIFAwID0gcG9ydCAqLwotCWNsaSBSMzsKLQlQMSA9IFIxOwkvKiBQMSA9IGFkZHJlc3MgKi8KLQlQMiA9IFIyOwkvKiBQMiA9IGNvdW50ICovCi0JU1NZTkM7Ci0JTFNFVFVQKCAuTGxvbmdfbG9vcF9zLCAuTGxvbmdfbG9vcF9lKSBMQzAgPSBQMjsKLS5MbG9uZ19sb29wX3M6ICBSMCA9IFtQMF07Ci0JCVtQMSsrXSA9IFIwOwotCQlOT1A7Ci0uTGxvbmdfbG9vcF9lOiAJTk9QOwotCXN0aSBSMzsKLQlSVFM7Ci0jZWxzZQotCVAwID0gUjA7CS8qIFAwID0gcG9ydCAqLwotCVAxID0gUjE7CS8qIFAxID0gYWRkcmVzcyAqLwotCVAyID0gUjI7CS8qIFAyID0gY291bnQgKi8KLQlTU1lOQzsKLQlMU0VUVVAoIC5MbG9uZ19sb29wX3MsIC5MbG9uZ19sb29wX2UpIExDMCA9IFAyOwotLkxsb25nX2xvb3BfczoKLQlDTEkgUjM7Ci0JTk9QOyBOT1A7IE5PUDsKLQlSMCA9IFtQMF07Ci0JW1AxKytdID0gUjA7Ci0uTGxvbmdfbG9vcF9lOgotCVNUSSBSMzsKKyNkZWZpbmUgQ09NTU9OX0lOUyhmdW5jLCBvcHMpIFwKK0VOVFJZKF9pbnMjI2Z1bmMpIFwKKwlQMCA9IFIwOwkvKiBQMCA9IHBvcnQgKi8gXAorCUNMSV9PVVRFUjsJLyogMyBpbnN0cnVjdGlvbnMgYmVmb3JlIGZpcnN0IHJlYWQgYWNjZXNzICovIFwKKwlQMSA9IFIxOwkvKiBQMSA9IGFkZHJlc3MgKi8gXAorCVAyID0gUjI7CS8qIFAyID0gY291bnQgKi8gXAorCVNTWU5DOyBcCisgXAorCUxTRVRVUCgxZiwgMmYpIExDMCA9IFAyOyBcCisJQ0xJX0lOTkVSOyBcCisJb3BzOyBcCisJU1RJX0lOTkVSOyBcCisgXAorCVNUSV9PVVRFUjsgXAorCVJUUzsgXAorRU5EUFJPQyhfaW5zIyNmdW5jKQogCi0JUlRTOwotI2VuZGlmCi1FTkRQUk9DKF9pbnNsKQorQ09NTU9OX0lOUyhsLCBcCisJUjAgPSBbUDBdOyBcCisJW1AxKytdID0gUjA7IFwKKykKIAotRU5UUlkoX2luc3cpCi0jaWZkZWYgQ09ORklHX0JGSU5fSU5TX0xPV09WRVJIRUFECi0JUDAgPSBSMDsJLyogUDAgPSBwb3J0ICovCi0JY2xpIFIzOwotCVAxID0gUjE7CS8qIFAxID0gYWRkcmVzcyAqLwotCVAyID0gUjI7CS8qIFAyID0gY291bnQgKi8KLQlTU1lOQzsKLQlMU0VUVVAoIC5Md29yZF9sb29wX3MsIC5Md29yZF9sb29wX2UpIExDMCA9IFAyOwotLkx3b3JkX2xvb3BfczogIFIwID0gV1tQMF07Ci0JCVdbUDErK10gPSBSMDsKLQkJTk9QOwotLkx3b3JkX2xvb3BfZTogCU5PUDsKLQlzdGkgUjM7Ci0JUlRTOwotI2Vsc2UKLQlQMCA9IFIwOwkvKiBQMCA9IHBvcnQgKi8KLQlQMSA9IFIxOwkvKiBQMSA9IGFkZHJlc3MgKi8KLQlQMiA9IFIyOwkvKiBQMiA9IGNvdW50ICovCi0JU1NZTkM7Ci0JTFNFVFVQKCAuTHdvcmRfbG9vcF9zLCAuTHdvcmRfbG9vcF9lKSBMQzAgPSBQMjsKLS5Md29yZF9sb29wX3M6Ci0JQ0xJIFIzOwotCU5PUDsgTk9QOyBOT1A7Ci0JUjAgPSBXW1AwXTsKLQlXW1AxKytdID0gUjA7Ci0uTHdvcmRfbG9vcF9lOgotCVNUSSBSMzsKLQlSVFM7CitDT01NT05fSU5TKHcsIFwKKwlSMCA9IFdbUDBdOyBcCisJV1tQMSsrXSA9IFIwOyBcCispCiAKLSNlbmRpZgotRU5EUFJPQyhfaW5zdykKK0NPTU1PTl9JTlMod184LCBcCisJUjAgPSBXW1AwXTsgXAorCUJbUDErK10gPSBSMDsgXAorCVIwID0gUjAgPj4gODsgXAorCUJbUDErK10gPSBSMDsgXAorKQogCi1FTlRSWShfaW5zd184KQotI2lmZGVmIENPTkZJR19CRklOX0lOU19MT1dPVkVSSEVBRAotCVAwID0gUjA7CS8qIFAwID0gcG9ydCAqLwotCWNsaSBSMzsKLQlQMSA9IFIxOwkvKiBQMSA9IGFkZHJlc3MgKi8KLQlQMiA9IFIyOwkvKiBQMiA9IGNvdW50ICovCi0JU1NZTkM7Ci0JTFNFVFVQKCAuTHdvcmQ4X2xvb3BfcywgLkx3b3JkOF9sb29wX2UpIExDMCA9IFAyOwotLkx3b3JkOF9sb29wX3M6ICBSMCA9IFdbUDBdOwotCQlCW1AxKytdID0gUjA7Ci0JCVIwID0gUjAgPj4gODsKLQkJQltQMSsrXSA9IFIwOwotCQlOT1A7Ci0uTHdvcmQ4X2xvb3BfZTogTk9QOwotCXN0aSBSMzsKLQlSVFM7Ci0jZWxzZQotCVAwID0gUjA7CS8qIFAwID0gcG9ydCAqLwotCVAxID0gUjE7CS8qIFAxID0gYWRkcmVzcyAqLwotCVAyID0gUjI7CS8qIFAyID0gY291bnQgKi8KLQlTU1lOQzsKLQlMU0VUVVAoIC5Md29yZDhfbG9vcF9zLCAuTHdvcmQ4X2xvb3BfZSkgTEMwID0gUDI7Ci0uTHdvcmQ4X2xvb3BfczoKLQlDTEkgUjM7Ci0JTk9QOyBOT1A7IE5PUDsKLQlSMCA9IFdbUDBdOwotCUJbUDErK10gPSBSMDsKLQlSMCA9IFIwID4+IDg7Ci0JQltQMSsrXSA9IFIwOwotCU5PUDsKLS5Md29yZDhfbG9vcF9lOgotCVNUSSBSMzsKK0NPTU1PTl9JTlMoYiwgXAorCVIwID0gQltQMF07IFwKKwlCW1AxKytdID0gUjA7IFwKKykKIAotCVJUUzsKLSNlbmRpZgotRU5EUFJPQyhfaW5zd184KQotCi1FTlRSWShfaW5zYikKLSNpZmRlZiBDT05GSUdfQkZJTl9JTlNfTE9XT1ZFUkhFQUQKLQlQMCA9IFIwOwkvKiBQMCA9IHBvcnQgKi8KLQljbGkgUjM7Ci0JUDEgPSBSMTsJLyogUDEgPSBhZGRyZXNzICovCi0JUDIgPSBSMjsJLyogUDIgPSBjb3VudCAqLwotCVNTWU5DOwotCUxTRVRVUCggLkxieXRlX2xvb3BfcywgLkxieXRlX2xvb3BfZSkgTEMwID0gUDI7Ci0uTGJ5dGVfbG9vcF9zOiAgUjAgPSBCW1AwXTsKLQkJQltQMSsrXSA9IFIwOwotCQlOT1A7Ci0uTGJ5dGVfbG9vcF9lOiAgTk9QOwotCXN0aSBSMzsKLQlSVFM7Ci0jZWxzZQotCVAwID0gUjA7ICAgICAgICAvKiBQMCA9IHBvcnQgKi8KLQlQMSA9IFIxOyAgICAgICAgLyogUDEgPSBhZGRyZXNzICovCi0JUDIgPSBSMjsgICAgICAgIC8qIFAyID0gY291bnQgKi8KLQlTU1lOQzsKLQlMU0VUVVAoIC5MYnl0ZV9sb29wX3MsIC5MYnl0ZV9sb29wX2UpIExDMCA9IFAyOwotLkxieXRlX2xvb3BfczoKLQlDTEkgUjM7Ci0JTk9QOyBOT1A7IE5PUDsKLQlSMCA9IEJbUDBdOwotCUJbUDErK10gPSBSMDsKLS5MYnl0ZV9sb29wX2U6Ci0JU1RJIFIzOwotCi0JUlRTOwotI2VuZGlmCi1FTkRQUk9DKF9pbnNiKQotCi1FTlRSWShfaW5zbF8xNikKLSNpZmRlZiBDT05GSUdfQkZJTl9JTlNfTE9XT1ZFUkhFQUQKLQlQMCA9IFIwOwkvKiBQMCA9IHBvcnQgKi8KLQljbGkgUjM7Ci0JUDEgPSBSMTsJLyogUDEgPSBhZGRyZXNzICovCi0JUDIgPSBSMjsJLyogUDIgPSBjb3VudCAqLwotCVNTWU5DOwotCUxTRVRVUCggLkxsb25nMTZfbG9vcF9zLCAuTGxvbmcxNl9sb29wX2UpIExDMCA9IFAyOwotLkxsb25nMTZfbG9vcF9zOiAgUjAgPSBbUDBdOwotCQkgIFdbUDErK10gPSBSMDsKLQkJICBSMCA9IFIwID4+IDE2OwotCQkgIFdbUDErK10gPSBSMDsKLQkJICBOT1A7Ci0uTGxvbmcxNl9sb29wX2U6ICBOT1A7Ci0Jc3RpIFIzOwotCVJUUzsKLSNlbHNlCi0JUDAgPSBSMDsJLyogUDAgPSBwb3J0ICovCi0JUDEgPSBSMTsJLyogUDEgPSBhZGRyZXNzICovCi0JUDIgPSBSMjsJLyogUDIgPSBjb3VudCAqLwotCVNTWU5DOwotCUxTRVRVUCggLkxsb25nMTZfbG9vcF9zLCAuTGxvbmcxNl9sb29wX2UpIExDMCA9IFAyOwotLkxsb25nMTZfbG9vcF9zOgotCUNMSSBSMzsKLQlOT1A7IE5PUDsgTk9QOwotCVIwID0gW1AwXTsKLQlXW1AxKytdID0gUjA7Ci0JUjAgPSBSMCA+PiAxNjsKLQlXW1AxKytdID0gUjA7Ci0uTGxvbmcxNl9sb29wX2U6Ci0JU1RJIFIzOwotCVJUUzsKLSNlbmRpZgotRU5EUFJPQyhfaW5zbF8xNikKK0NPTU1PTl9JTlMobF8xNiwgXAorCVIwID0gW1AwXTsgXAorCVdbUDErK10gPSBSMDsgXAorCVIwID0gUjAgPj4gMTY7IFwKKwlXW1AxKytdID0gUjA7IFwKKykKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbGliL211bGRpMy5TIGIvYXJjaC9ibGFja2Zpbi9saWIvbXVsZGkzLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJkZTEyMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbGliL211bGRpMy5TCkBAIC0wLDAgKzEsNjggQEAKKy5hbGlnbiAyCisuZ2xvYmFsIF9fX211bGRpMzsKKy50eXBlIF9fX211bGRpMywgU1RUX0ZVTkM7CisKKyNpZmRlZiBDT05GSUdfQVJJVEhNRVRJQ19PUFNfTDEKKy5zZWN0aW9uIC5sMS50ZXh0CisjZWxzZQorLnRleHQKKyNlbmRpZgorCisvKgorCSAgIFIxOlIwICogUjM6UjIKKwkgPSBSMS5oOlIxLmw6UjAuaDpSMC5sICogUjMuaDpSMy5sOlIyLmg6UjIubAorW1hdCSA9IChSMS5oICogUjMuaCkgKiAyXjk2CitbWF0JICAgKyAoUjEuaCAqIFIzLmwgKyBSMS5sICogUjMuaCkgKiAyXjgwCitbWF0JICAgKyAoUjEuaCAqIFIyLmggKyBSMS5sICogUjMubCArIFIzLmggKiBSMC5oKSAqIDJeNjQKK1tUMV0JICAgKyAoUjEuaCAqIFIyLmwgKyBSMy5oICogUjAubCArIFIxLmwgKiBSMi5oICsgUjMubCAqIFIwLmgpICogMl40OAorW1QyXQkgICArIChSMS5sICogUjIubCArIFIzLmwgKiBSMC5sICsgUjAuaCAqIFIyLmgpICogMl4zMgorW1QzXQkgICArIChSMC5sICogUjIuaCArIFIyLmwgKiBSMC5oKSAqIDJeMTYKK1tUNF0JICAgKyAoUjAubCAqIFIyLmwpCisKKwlXZSBjYW4gZGlzY2FyZCB0aGUgZmlyc3QgdGhyZWUgbGluZXMgbWFya2VkICJYIiBzaW5jZSB3ZSBwcm9kdWNlCisJb25seSBhIDY0IGJpdCByZXN1bHQuICBTbywgd2UgbmVlZCB0ZW4gMTYtYml0IG11bHRpcGxpZXMuCisKKwlJbmRpdmlkdWFsIG11bC1hY2MgcmVzdWx0czoKK1tFMV0JID0gIFIxLmggKiBSMi5sICsgUjMuaCAqIFIwLmwgKyBSMS5sICogUjIuaCArIFIzLmwgKiBSMC5oCitbRTJdCSA9ICBSMS5sICogUjIubCArIFIzLmwgKiBSMC5sICsgUjAuaCAqIFIyLmgKK1tFM10JID0gIFIwLmwgKiBSMi5oICsgUjIubCAqIFIwLmgKK1tFNF0JID0gIFIwLmwgKiBSMi5sCisKKwlXZSBhbHNvIG5lZWQgdG8gYWRkIGhpZ2ggcGFydHMgZnJvbSBsb3dlci1sZXZlbCByZXN1bHRzIHRvIGhpZ2hlciBvbmVzOgorCUVbbl1jID0gRVtuXSArIChFW24rMV1jID4+IDE2KSwgd2hlcmUgRTRjIDo9IEU0CisKKwlPbmUgaW50ZXJlc3RpbmcgcHJvcGVydHkgaXMgdGhhdCBhbGwgcGFydHMgb2YgdGhlIHJlc3VsdCB0aGF0IGRlcGVuZAorCW9uIHRoZSBzaWduIG9mIHRoZSBtdWx0aXBsaWNhdGlvbiBhcmUgZGlzY2FyZGVkLiAgVGhvc2Ugd291bGQgYmUgdGhlCisJbXVsdGlwbGljYXRpb25zIGludm9sdmluZyBSMS5oIGFuZCBSMy5oLCBidXQgb25seSB0aGUgdG9wIDE2IGJpdCBvZgorCXRoZSAzMiBiaXQgcmVzdWx0IGRlcGVuZCBvbiB0aGUgc2lnbiwgYW5kIHNpbmNlIFIxLmggYW5kIFIzLmggb25seQorCW9jY3VyIGluIEUxLCB0aGUgdG9wIGhhbGYgb2YgdGhlc2UgcmVzdWx0cyBpcyBjdXQgb2ZmLgorCVNvLCB3ZSBjYW4ganVzdCB1c2UgRlUgbW9kZSBmb3IgYWxsIG9mIHRoZSAxNi1iaXQgbXVsdGlwbGllcywgYW5kCisJaWdub3JlIHF1ZXN0aW9ucyBvZiB3aGVuIHRvIHVzZSBtaXhlZCBtb2RlLiAgKi8KKworX19fbXVsZGkzOgorCS8qIFtTUF0gdGVjaG5pY2FsbHkgaXMgcGFydCBvZiB0aGUgY2FsbGVyJ3MgZnJhbWUsIGJ1dCB3ZSBjYW4KKwkgICB1c2UgaXQgYXMgc2NyYXRjaCBzcGFjZS4gICovCisJQTAgPSBSMi5IICogUjEuTCwgQTEgPSBSMi5MICogUjEuSCAoRlUpIHx8IFIzID0gW1NQICsgMTJdOwkvKiBFMSAqLworCUEwICs9IFIzLkggKiBSMC5MLCBBMSArPSBSMy5MICogUjAuSCAoRlUpIHx8IFtTUF0gPSBSNDsJCS8qIEUxICovCisJQTAgKz0gQTE7CQkJCQkJCS8qIEUxICovCisJUjQgPSBBMC53OworCUEwID0gUjAubCAqIFIzLmwgKEZVKTsJCQkJCQkvKiBFMiAqLworCUEwICs9IFIyLmwgKiBSMS5sIChGVSk7CQkJCQkJLyogRTIgKi8KKworCUExID0gUjIuTCAqIFIwLkwgKEZVKTsJCQkJCQkvKiBFNCAqLworCVIzID0gQTEudzsKKwlBMSA9IEExID4+IDE2OwkJCQkJCQkvKiBFM2MgKi8KKwlBMCArPSBSMi5IICogUjAuSCwgQTEgKz0gUjIuTCAqIFIwLkggKEZVKTsJCQkvKiBFMiwgRTNjICovCisJQTEgKz0gUjAuTCAqIFIyLkggKEZVKTsJCQkJCQkvKiBFM2MgKi8KKwlSMCA9IEExLnc7CisJQTEgPSBBMSA+PiAxNjsJCQkJCQkJLyogRTJjICovCisJQTAgKz0gQTE7CQkJCQkJCS8qIEUyYyAqLworCVIxID0gQTAudzsKKworCS8qIGxvdyhyZXN1bHQpID0gbG93KEUzYyk6bG93KEU0KSAqLworCVIwID0gUEFDSyAoUjAubCwgUjMubCk7CisJLyogaGlnaChyZXN1bHQpID0gRTJjICsgKEUxIDw8IDE2KSAqLworCVIxLmggPSBSMS5oICsgUjQubCAoTlMpIHx8IFI0ID0gW1NQXTsKKwlSVFM7CisKKy5zaXplIF9fX211bGRpMywgLi1fX19tdWxkaTMKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbGliL211bGRpMy5jIGIvYXJjaC9ibGFja2Zpbi9saWIvbXVsZGkzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwM2QwYzYuLjAwMDAwMDAKLS0tIGEvYXJjaC9ibGFja2Zpbi9saWIvbXVsZGkzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL2xpYi9tdWxkaTMuYwotICogQmFzZWQgb246Ci0gKiBBdXRob3I6Ci0gKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOgotICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA2IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLSAqLwotCi0jaWZuZGVmIFNJX1RZUEVfU0laRQotI2RlZmluZSBTSV9UWVBFX1NJWkUgMzIKLSNlbmRpZgotI2RlZmluZSBfX2xsX2IgKDFMIDw8IChTSV9UWVBFX1NJWkUgLyAyKSkKLSNkZWZpbmUgX19sbF9sb3dwYXJ0KHQpICgodXNpdHlwZSkgKHQpICUgX19sbF9iKQotI2RlZmluZSBfX2xsX2hpZ2hwYXJ0KHQpICgodXNpdHlwZSkgKHQpIC8gX19sbF9iKQotI2RlZmluZSBCSVRTX1BFUl9VTklUIDgKLQotI2lmICFkZWZpbmVkKHVtdWxfcHBtbSkKLSNkZWZpbmUgdW11bF9wcG1tKHcxLCB3MCwgdSwgdikJCQkJCQlcCi0gIGRvIHsJCQkJCQkJCQlcCi0gICAgdXNpdHlwZSBfX3gwLCBfX3gxLCBfX3gyLCBfX3gzOwkJCQkJXAotICAgIHVzaXR5cGUgX191bCwgX192bCwgX191aCwgX192aDsJCQkJCVwKLQkJCQkJCQkJCVwKLSAgICBfX3VsID0gX19sbF9sb3dwYXJ0ICh1KTsJCQkJCQlcCi0gICAgX191aCA9IF9fbGxfaGlnaHBhcnQgKHUpOwkJCQkJCVwKLSAgICBfX3ZsID0gX19sbF9sb3dwYXJ0ICh2KTsJCQkJCQlcCi0gICAgX192aCA9IF9fbGxfaGlnaHBhcnQgKHYpOwkJCQkJCVwKLQkJCQkJCQkJCVwKLSAgICBfX3gwID0gKHVzaXR5cGUpIF9fdWwgKiBfX3ZsOwkJCQkJXAotICAgIF9feDEgPSAodXNpdHlwZSkgX191bCAqIF9fdmg7CQkJCQlcCi0gICAgX194MiA9ICh1c2l0eXBlKSBfX3VoICogX192bDsJCQkJCVwKLSAgICBfX3gzID0gKHVzaXR5cGUpIF9fdWggKiBfX3ZoOwkJCQkJXAotCQkJCQkJCQkJXAotICAgIF9feDEgKz0gX19sbF9oaWdocGFydCAoX194MCk7LyogdGhpcyBjYW4ndCBnaXZlIGNhcnJ5ICovCQlcCi0gICAgX194MSArPSBfX3gyOwkJLyogYnV0IHRoaXMgaW5kZWVkIGNhbiAqLwkJXAotICAgIGlmIChfX3gxIDwgX194MikJCS8qIGRpZCB3ZSBnZXQgaXQ/ICovCQkJXAotICAgICAgX194MyArPSBfX2xsX2I7CQkvKiB5ZXMsIGFkZCBpdCBpbiB0aGUgcHJvcGVyIHBvcy4gKi8JXAotCQkJCQkJCQkJXAotICAgICh3MSkgPSBfX3gzICsgX19sbF9oaWdocGFydCAoX194MSk7CQkJCQlcCi0gICAgKHcwKSA9IF9fbGxfbG93cGFydCAoX194MSkgKiBfX2xsX2IgKyBfX2xsX2xvd3BhcnQgKF9feDApOwkJXAotICB9IHdoaWxlICgwKQotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChfX3VtdWxzaWRpMykKLSNkZWZpbmUgX191bXVsc2lkaTModSwgdikgCQkJCQkJXAotICAoe2RpdW5pb24gX193OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIHVtdWxfcHBtbSAoX193LnMuaGlnaCwgX193LnMubG93LCB1LCB2KTsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICBfX3cubGw7IH0pCi0jZW5kaWYKLQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgdXNpdHlwZSBfX2F0dHJpYnV0ZV9fICgobW9kZShTSSkpKTsKLXR5cGVkZWYgaW50IHNpdHlwZSBfX2F0dHJpYnV0ZV9fICgobW9kZShTSSkpKTsKLXR5cGVkZWYgaW50IGRpdHlwZSBfX2F0dHJpYnV0ZV9fICgobW9kZShESSkpKTsKLXR5cGVkZWYgaW50IHdvcmRfdHlwZSBfX2F0dHJpYnV0ZV9fICgobW9kZShfX3dvcmRfXykpKTsKLQotc3RydWN0IGRpc3RydWN0IHsKLQlzaXR5cGUgbG93LCBoaWdoOwotfTsKLXR5cGVkZWYgdW5pb24gewotCXN0cnVjdCBkaXN0cnVjdCBzOwotCWRpdHlwZSBsbDsKLX0gZGl1bmlvbjsKLQotI2lmZGVmIENPTkZJR19BUklUSE1FVElDX09QU19MMQotZGl0eXBlIF9fbXVsZGkzKGRpdHlwZSB1LCBkaXR5cGUgdilfX2F0dHJpYnV0ZV9fKChsMV90ZXh0KSk7Ci0jZW5kaWYKLQotZGl0eXBlIF9fbXVsZGkzKGRpdHlwZSB1LCBkaXR5cGUgdikKLXsKLQlkaXVuaW9uIHc7Ci0JZGl1bmlvbiB1dSwgdnY7Ci0KLQl1dS5sbCA9IHUsIHZ2LmxsID0gdjsKLQl3LmxsID0gX191bXVsc2lkaTModXUucy5sb3csIHZ2LnMubG93KTsKLQl3LnMuaGlnaCArPSAoKHVzaXR5cGUpIHV1LnMubG93ICogKHVzaXR5cGUpIHZ2LnMuaGlnaAotCQkgICAgICsgKHVzaXR5cGUpIHV1LnMuaGlnaCAqICh1c2l0eXBlKSB2di5zLmxvdyk7Ci0KLQlyZXR1cm4gdy5sbDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9LY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM5N2VkZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9LY29uZmlnCkBAIC0wLDAgKzEsMjMzIEBACitpZiAoQkY1MXgpCisKK3NvdXJjZSAiYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2JvYXJkcy9LY29uZmlnIgorCittZW51ICJCRjUxOCBTcGVjaWZpYyBDb25maWd1cmF0aW9uIgorCitjb21tZW50ICJBbHRlcm5hdGl2ZSBNdWx0aXBsZXhpbmcgU2NoZW1lIgorCitjaG9pY2UKKwlwcm9tcHQgIlNQT1JUMCIKKwlkZWZhdWx0IEJGNTE4X1NQT1JUMF9QT1JURworCWhlbHAKKwkgIFNlbGVjdCBQT1JUIHVzZWQgZm9yIFNQT1JUMC4gU2VlIEhhcmR3YXJlIFJlZmVyZW5jZSBNYW51YWwKKworY29uZmlnIEJGNTE4X1NQT1JUMF9QT1JURgorCWJvb2wgIlBPUlQgRiIKKwloZWxwCisJICBQT1JUIEYKKworY29uZmlnIEJGNTE4X1NQT1JUMF9QT1JURworCWJvb2wgIlBPUlQgRyIKKwloZWxwCisJICBQT1JUIEcKK2VuZGNob2ljZQorCitjaG9pY2UKKwlwcm9tcHQgIlNQT1JUMCBUU0NMSyBMb2NhdGlvbiIKKwlkZXBlbmRzIG9uIEJGNTE4X1NQT1JUMF9QT1JURworCWRlZmF1bHQgQkY1MThfU1BPUlQwX1RTQ0xLX1BHMTAKKwloZWxwCisJICBTZWxlY3QgUElOIHVzZWQgZm9yIFNQT1JUMF9UU0NMSy4gU2VlIEhhcmR3YXJlIFJlZmVyZW5jZSBNYW51YWwKKworY29uZmlnIEJGNTE4X1NQT1JUMF9UU0NMS19QRzEwCisJYm9vbCAiUE9SVCBQRzEwIgorCWhlbHAKKwkgIFBPUlQgUEcxMAorCitjb25maWcgQkY1MThfU1BPUlQwX1RTQ0xLX1BHMTQKKwlib29sICJQT1JUIFBHMTQiCisJaGVscAorCSAgUE9SVCBQRzE0CitlbmRjaG9pY2UKKworY2hvaWNlCisJcHJvbXB0ICJVQVJUMSIKKwlkZWZhdWx0IEJGNTE4X1VBUlQxX1BPUlRGCisJaGVscAorCSAgU2VsZWN0IFBPUlQgdXNlZCBmb3IgVUFSVDEuIFNlZSBIYXJkd2FyZSBSZWZlcmVuY2UgTWFudWFsCisKK2NvbmZpZyBCRjUxOF9VQVJUMV9QT1JURgorCWJvb2wgIlBPUlQgRiIKKwloZWxwCisJICBQT1JUIEYKKworY29uZmlnIEJGNTE4X1VBUlQxX1BPUlRHCisJYm9vbCAiUE9SVCBHIgorCWhlbHAKKwkgIFBPUlQgRworZW5kY2hvaWNlCisKK2NvbW1lbnQgIkludGVycnVwdCBQcmlvcml0eSBBc3NpZ25tZW50IgorbWVudSAiUHJpb3JpdHkiCisKK2NvbmZpZyBJUlFfUExMX1dBS0VVUAorCWludCAiSVJRX1BMTF9XQUtFVVAiCisJZGVmYXVsdCA3Citjb25maWcgSVJRX0RNQTBfRVJST1IKKwlpbnQgIklSUV9ETUEwX0VSUk9SIgorCWRlZmF1bHQgNworY29uZmlnIElSUV9ETUFSMF9CTEsKKwlpbnQgIklSUV9ETUFSMF9CTEsiCisJZGVmYXVsdCA3Citjb25maWcgSVJRX0RNQVIxX0JMSworCWludCAiSVJRX0RNQVIxX0JMSyIKKwlkZWZhdWx0IDcKK2NvbmZpZyBJUlFfRE1BUjBfT1ZSCisJaW50ICJJUlFfRE1BUjBfT1ZSIgorCWRlZmF1bHQgNworY29uZmlnIElSUV9ETUFSMV9PVlIKKwlpbnQgIklSUV9ETUFSMV9PVlIiCisJZGVmYXVsdCA3Citjb25maWcgSVJRX1BQSV9FUlJPUgorCWludCAiSVJRX1BQSV9FUlJPUiIKKwlkZWZhdWx0IDcKK2NvbmZpZyBJUlFfTUFDX0VSUk9SCisJaW50ICJJUlFfTUFDX0VSUk9SIgorCWRlZmF1bHQgNworY29uZmlnIElSUV9TUE9SVDBfRVJST1IKKwlpbnQgIklSUV9TUE9SVDBfRVJST1IiCisJZGVmYXVsdCA3Citjb25maWcgSVJRX1NQT1JUMV9FUlJPUgorCWludCAiSVJRX1NQT1JUMV9FUlJPUiIKKwlkZWZhdWx0IDcKK2NvbmZpZyBJUlFfUFRQX0VSUk9SCisJaW50ICJJUlFfUFRQX0VSUk9SIgorCWRlZmF1bHQgNworY29uZmlnIElSUV9VQVJUMF9FUlJPUgorCWludCAiSVJRX1VBUlQwX0VSUk9SIgorCWRlZmF1bHQgNworY29uZmlnIElSUV9VQVJUMV9FUlJPUgorCWludCAiSVJRX1VBUlQxX0VSUk9SIgorCWRlZmF1bHQgNworY29uZmlnIElSUV9SVEMKKwlpbnQgIklSUV9SVEMiCisJZGVmYXVsdCA4Citjb25maWcgSVJRX1BQSQorCWludCAiSVJRX1BQSSIKKwlkZWZhdWx0IDgKK2NvbmZpZyBJUlFfU1BPUlQwX1JYCisJaW50ICJJUlFfU1BPUlQwX1JYIgorCWRlZmF1bHQgOQorY29uZmlnIElSUV9TUE9SVDBfVFgKKwlpbnQgIklSUV9TUE9SVDBfVFgiCisJZGVmYXVsdCA5Citjb25maWcgSVJRX1NQT1JUMV9SWAorCWludCAiSVJRX1NQT1JUMV9SWCIKKwlkZWZhdWx0IDkKK2NvbmZpZyBJUlFfU1BPUlQxX1RYCisJaW50ICJJUlFfU1BPUlQxX1RYIgorCWRlZmF1bHQgOQorY29uZmlnIElSUV9UV0kKKwlpbnQgIklSUV9UV0kiCisJZGVmYXVsdCAxMAorY29uZmlnIElSUV9TUEkwCisJaW50ICJJUlFfU1BJIgorCWRlZmF1bHQgMTAKK2NvbmZpZyBJUlFfVUFSVDBfUlgKKwlpbnQgIklSUV9VQVJUMF9SWCIKKwlkZWZhdWx0IDEwCitjb25maWcgSVJRX1VBUlQwX1RYCisJaW50ICJJUlFfVUFSVDBfVFgiCisJZGVmYXVsdCAxMAorY29uZmlnIElSUV9VQVJUMV9SWAorCWludCAiSVJRX1VBUlQxX1JYIgorCWRlZmF1bHQgMTAKK2NvbmZpZyBJUlFfVUFSVDFfVFgKKwlpbnQgIklSUV9VQVJUMV9UWCIKKwlkZWZhdWx0IDEwCitjb25maWcgSVJRX09QVFNFQworCWludCAiSVJRX09QVFNFQyIKKwlkZWZhdWx0IDExCitjb25maWcgSVJRX0NOVAorCWludCAiSVJRX0NOVCIKKwlkZWZhdWx0IDExCitjb25maWcgSVJRX01BQ19SWAorCWludCAiSVJRX01BQ19SWCIKKwlkZWZhdWx0IDExCitjb25maWcgSVJRX1BPUlRIX0lOVEEKKwlpbnQgIklSUV9QT1JUSF9JTlRBIgorCWRlZmF1bHQgMTEKK2NvbmZpZyBJUlFfTUFDX1RYCisJaW50ICJJUlFfTUFDX1RYL05GQyIKKwlkZWZhdWx0IDExCitjb25maWcgSVJRX1BPUlRIX0lOVEIKKwlpbnQgIklSUV9QT1JUSF9JTlRCIgorCWRlZmF1bHQgMTEKK2NvbmZpZyBJUlFfVElNRVIwCisJaW50ICJJUlFfVElNRVIwIgorCWRlZmF1bHQgOAorY29uZmlnIElSUV9USU1FUjEKKwlpbnQgIklSUV9USU1FUjEiCisJZGVmYXVsdCAxMgorY29uZmlnIElSUV9USU1FUjIKKwlpbnQgIklSUV9USU1FUjIiCisJZGVmYXVsdCAxMgorY29uZmlnIElSUV9USU1FUjMKKwlpbnQgIklSUV9USU1FUjMiCisJZGVmYXVsdCAxMgorY29uZmlnIElSUV9USU1FUjQKKwlpbnQgIklSUV9USU1FUjQiCisJZGVmYXVsdCAxMgorY29uZmlnIElSUV9USU1FUjUKKwlpbnQgIklSUV9USU1FUjUiCisJZGVmYXVsdCAxMgorY29uZmlnIElSUV9USU1FUjYKKwlpbnQgIklSUV9USU1FUjYiCisJZGVmYXVsdCAxMgorY29uZmlnIElSUV9USU1FUjcKKwlpbnQgIklSUV9USU1FUjciCisJZGVmYXVsdCAxMgorY29uZmlnIElSUV9QT1JUR19JTlRBCisJaW50ICJJUlFfUE9SVEdfSU5UQSIKKwlkZWZhdWx0IDEyCitjb25maWcgSVJRX1BPUlRHX0lOVEIKKwlpbnQgIklSUV9QT1JUR19JTlRCIgorCWRlZmF1bHQgMTIKK2NvbmZpZyBJUlFfTUVNX0RNQTAKKwlpbnQgIklSUV9NRU1fRE1BMCIKKwlkZWZhdWx0IDEzCitjb25maWcgSVJRX01FTV9ETUExCisJaW50ICJJUlFfTUVNX0RNQTEiCisJZGVmYXVsdCAxMworY29uZmlnIElSUV9XQVRDSAorCWludCAiSVJRX1dBVENIIgorCWRlZmF1bHQgMTMKK2NvbmZpZyBJUlFfUE9SVEZfSU5UQQorCWludCAiSVJRX1BPUlRGX0lOVEEiCisJZGVmYXVsdCAxMworY29uZmlnIElSUV9QT1JURl9JTlRCCisJaW50ICJJUlFfUE9SVEZfSU5UQiIKKwlkZWZhdWx0IDEzCitjb25maWcgSVJRX1NQSTBfRVJST1IKKwlpbnQgIklSUV9TUEkwX0VSUk9SIgorCWRlZmF1bHQgNworY29uZmlnIElSUV9TUEkxX0VSUk9SCisJaW50ICJJUlFfU1BJMV9FUlJPUiIKKwlkZWZhdWx0IDcKK2NvbmZpZyBJUlFfUlNJX0lOVDAKKwlpbnQgIklSUV9SU0lfSU5UMCIKKwlkZWZhdWx0IDcKK2NvbmZpZyBJUlFfUlNJX0lOVDEKKwlpbnQgIklSUV9SU0lfSU5UMSIKKwlkZWZhdWx0IDcKK2NvbmZpZyBJUlFfUFdNX1RSSVAKKwlpbnQgIklSUV9QV01fVFJJUCIKKwlkZWZhdWx0IDEwCitjb25maWcgSVJRX1BXTV9TWU5DCisJaW50ICJJUlFfUFdNX1NZTkMiCisJZGVmYXVsdCAxMAorY29uZmlnIElSUV9QVFBfU1RBVAorCWludCAiSVJRX1BUUF9TVEFUIgorCWRlZmF1bHQgMTAKKworCWhlbHAKKwkgIEVudGVyIHRoZSBwcmlvcml0eSBudW1iZXJzIGJldHdlZW4gNy0xMyBPTkxZLiAgT3RoZXJzIGFyZSBSZXNlcnZlZC4KKwkgIFRoaXMgYXBwbGllcyB0byBhbGwgdGhlIGFib3ZlLiAgSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGFzc2lnbiB0aGUKKwkgIGhpZ2hlc3QgcHJpb3JpdHkgbnVtYmVyIDcgdG8gVUFSVCBvciBhbnkgb3RoZXIgZGV2aWNlLgorCitlbmRtZW51CisKK2VuZG1lbnUKKworZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9NYWtlZmlsZSBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjhhMTkzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L01ha2VmaWxlCkBAIC0wLDAgKzEsNSBAQAorIworIyBhcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvTWFrZWZpbGUKKyMKKworb2JqLXkgOj0gaW50cy1wcmlvcml0eS5vIGRtYS5vCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvYm9hcmRzL0tjb25maWcgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvYm9hcmRzL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYxNjM1MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9ib2FyZHMvS2NvbmZpZwpAQCAtMCwwICsxLDEyIEBACitjaG9pY2UKKwlwcm9tcHQgIlN5c3RlbSB0eXBlIgorCWRlZmF1bHQgQkZJTjUxOEZfRVpCUkQKKwloZWxwCisJICBTZWxlY3QgeW91ciBib2FyZCEKKworY29uZmlnIEJGSU41MThGX0VaQlJECisJYm9vbCAiQkY1MThGLUVaQlJEIgorCWhlbHAKKwkgIEJGNTE4LUVaQlJEIGJvYXJkIHN1cHBvcnQuCisKK2VuZGNob2ljZQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2JvYXJkcy9NYWtlZmlsZSBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9ib2FyZHMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcyZTg1OQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9ib2FyZHMvTWFrZWZpbGUKQEAgLTAsMCArMSw1IEBACisjCisjIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9ib2FyZHMvTWFrZWZpbGUKKyMKKworb2JqLSQoQ09ORklHX0JGSU41MThGX0VaQlJEKSAgICAgICAgICAgICs9IGV6YnJkLm8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9ib2FyZHMvZXpicmQuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9ib2FyZHMvZXpicmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWYxMzUxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2JvYXJkcy9lemJyZC5jCkBAIC0wLDAgKzEsNjY5IEBACisvKgorICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvYm9hcmRzL2V6YnJkLmMKKyAqIEJhc2VkIG9uOiAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9lemJyZC5jCisgKiBBdXRob3I6ICAgICAgIEJyeWFuIFd1IDxjb29sb25leUBrZXJuZWwub3JnPgorICoKKyAqIENyZWF0ZWQ6CisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBNb2RpZmllZDoKKyAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDUgTmF0aW9uYWwgSUNUIEF1c3RyYWxpYSAoTklDVEEpCisgKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKKyAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvZmxhc2guaD4KKworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vYmZpbjV4eF9zcGkuaD4KKyNpbmNsdWRlIDxhc20vcmVib290Lmg+CisjaW5jbHVkZSA8YXNtL3BvcnRtdXguaD4KKyNpbmNsdWRlIDxhc20vZHBtYy5oPgorI2luY2x1ZGUgPGFzbS9iZmluX3NkaC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9hZDc4NzcuaD4KKworLyoKKyAqIE5hbWUgdGhlIEJvYXJkIGZvciB0aGUgL3Byb2MvY3B1aW5mbworICovCitjb25zdCBjaGFyIGJmaW5fYm9hcmRfbmFtZVtdID0gIkFESSBCRjUxOEYtRVpCUkQiOworCisvKgorICogIERyaXZlciBuZWVkcyB0byBrbm93IGFkZHJlc3MsIGlycSBhbmQgZmxhZyBwaW4uCisgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX01URF9QSFlTTUFQKSB8fCBkZWZpbmVkKENPTkZJR19NVERfUEhZU01BUF9NT0RVTEUpCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gZXpicmRfcGFydGl0aW9uc1tdID0geworCXsKKwkJLm5hbWUgICAgICAgPSAiYm9vdGxvYWRlcihub3IpIiwKKwkJLnNpemUgICAgICAgPSAweDQwMDAwLAorCQkub2Zmc2V0ICAgICA9IDAsCisJfSwgeworCQkubmFtZSAgICAgICA9ICJsaW51eCBrZXJuZWwobm9yKSIsCisJCS5zaXplICAgICAgID0gMHgxQzAwMDAsCisJCS5vZmZzZXQgICAgID0gTVREUEFSVF9PRlNfQVBQRU5ELAorCX0sIHsKKwkJLm5hbWUgICAgICAgPSAiZmlsZSBzeXN0ZW0obm9yKSIsCisJCS5zaXplICAgICAgID0gTVREUEFSVF9TSVpfRlVMTCwKKwkJLm9mZnNldCAgICAgPSBNVERQQVJUX09GU19BUFBFTkQsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwaHlzbWFwX2ZsYXNoX2RhdGEgZXpicmRfZmxhc2hfZGF0YSA9IHsKKwkud2lkdGggICAgICA9IDIsCisJLnBhcnRzICAgICAgPSBlemJyZF9wYXJ0aXRpb25zLAorCS5ucl9wYXJ0cyAgID0gQVJSQVlfU0laRShlemJyZF9wYXJ0aXRpb25zKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZXpicmRfZmxhc2hfcmVzb3VyY2UgPSB7CisJLnN0YXJ0ID0gMHgyMDAwMDAwMCwKKwkuZW5kICAgPSAweDIwM2ZmZmZmLAorCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZXpicmRfZmxhc2hfZGV2aWNlID0geworCS5uYW1lICAgICAgICAgID0gInBoeXNtYXAtZmxhc2giLAorCS5pZCAgICAgICAgICAgID0gMCwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZlemJyZF9mbGFzaF9kYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMgPSAxLAorCS5yZXNvdXJjZSAgICAgID0gJmV6YnJkX2ZsYXNoX3Jlc291cmNlLAorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX0RSVl9CRklOKSB8fCBkZWZpbmVkKENPTkZJR19SVENfRFJWX0JGSU5fTU9EVUxFKQorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcnRjX2RldmljZSA9IHsKKwkubmFtZSA9ICJydGMtYmZpbiIsCisJLmlkICAgPSAtMSwKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fTUFDKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX01BQ19NT0RVTEUpCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX21hY19kZXZpY2UgPSB7CisJLm5hbWUgPSAiYmZpbl9tYWMiLAorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfTVREX00yNVA4MCkgXAorCXx8IGRlZmluZWQoQ09ORklHX01URF9NMjVQODBfTU9EVUxFKQorc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIGJmaW5fc3BpX2ZsYXNoX3BhcnRpdGlvbnNbXSA9IHsKKwl7CisJCS5uYW1lID0gImJvb3Rsb2FkZXIoc3BpKSIsCisJCS5zaXplID0gMHgwMDA0MDAwMCwKKwkJLm9mZnNldCA9IDAsCisJCS5tYXNrX2ZsYWdzID0gTVREX0NBUF9ST00KKwl9LCB7CisJCS5uYW1lID0gImxpbnV4IGtlcm5lbChzcGkpIiwKKwkJLnNpemUgPSBNVERQQVJUX1NJWl9GVUxMLAorCQkub2Zmc2V0ID0gTVREUEFSVF9PRlNfQVBQRU5ELAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgZmxhc2hfcGxhdGZvcm1fZGF0YSBiZmluX3NwaV9mbGFzaF9kYXRhID0geworCS5uYW1lID0gIm0yNXA4MCIsCisJLnBhcnRzID0gYmZpbl9zcGlfZmxhc2hfcGFydGl0aW9ucywKKwkubnJfcGFydHMgPSBBUlJBWV9TSVpFKGJmaW5fc3BpX2ZsYXNoX3BhcnRpdGlvbnMpLAorCS50eXBlID0gIm0yNXAxNiIsCit9OworCisvKiBTUEkgZmxhc2ggY2hpcCAobTI1cDY0KSAqLworc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV9mbGFzaF9jaGlwX2luZm8gPSB7CisJLmVuYWJsZV9kbWEgPSAwLCAgICAgICAgIC8qIHVzZSBkbWEgdHJhbnNmZXIgd2l0aCB0aGlzIGNoaXAqLworCS5iaXRzX3Blcl93b3JkID0gOCwKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NQSV9BRENfQkY1MzMpIFwKKwl8fCBkZWZpbmVkKENPTkZJR19TUElfQURDX0JGNTMzX01PRFVMRSkKKy8qIFNQSSBBREMgY2hpcCAqLworc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV9hZGNfY2hpcF9pbmZvID0geworCS5lbmFibGVfZG1hID0gMSwgICAgICAgICAvKiB1c2UgZG1hIHRyYW5zZmVyIHdpdGggdGhpcyBjaGlwKi8KKwkuYml0c19wZXJfd29yZCA9IDE2LAorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX01NQykgfHwgZGVmaW5lZChDT05GSUdfU1BJX01NQ19NT0RVTEUpCitzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX21tY19jaGlwX2luZm8gPSB7CisJLmVuYWJsZV9kbWEgPSAxLAorCS5iaXRzX3Blcl93b3JkID0gOCwKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1BCWCkKK3N0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfc2kzeHh4X2NoaXBfaW5mbyA9IHsKKwkuY3RsX3JlZwk9IDB4NCwgLyogc2VuZCB6ZXJvICovCisJLmVuYWJsZV9kbWEJPSAwLAorCS5iaXRzX3Blcl93b3JkCT0gOCwKKwkuY3NfY2hhbmdlX3Blcl93b3JkID0gMSwKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3NykgfHwgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc3X01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfYWQ3ODc3X2NoaXBfaW5mbyA9IHsKKwkuZW5hYmxlX2RtYSA9IDAsCisJLmJpdHNfcGVyX3dvcmQgPSAxNiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWQ3ODc3X3BsYXRmb3JtX2RhdGEgYmZpbl9hZDc4NzdfdHNfaW5mbyA9IHsKKwkubW9kZWwJCQk9IDc4NzcsCisJLnZyZWZfZGVsYXlfdXNlY3MJPSA1MCwJLyogaW50ZXJuYWwsIG5vIGNhcGFjaXRvciAqLworCS54X3BsYXRlX29obXMJCT0gNDE5LAorCS55X3BsYXRlX29obXMJCT0gNDg2LAorCS5wcmVzc3VyZV9tYXgJCT0gMTAwMCwKKwkucHJlc3N1cmVfbWluCQk9IDAsCisJLnN0b3BhY3FfcG9sYXJpdHkgCT0gMSwKKwkuZmlyc3RfY29udmVyc2lvbl9kZWxheSA9IDMsCisJLmFjcXVpc2l0aW9uX3RpbWUgCT0gMSwKKwkuYXZlcmFnaW5nIAkJPSAxLAorCS5wZW5fZG93bl9hY2NfaW50ZXJ2YWwgCT0gMSwKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NORF9TT0NfV004NzMxKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfU09DX1dNODczMV9NT0RVTEUpIFwKKwkgJiYgZGVmaW5lZChDT05GSUdfU05EX1NPQ19XTTg3MzFfU1BJKQorc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV93bTg3MzFfY2hpcF9pbmZvID0geworCS5lbmFibGVfZG1hID0gMCwKKwkuYml0c19wZXJfd29yZCA9IDE2LAorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX1NQSURFVikgfHwgZGVmaW5lZChDT05GSUdfU1BJX1NQSURFVl9NT0RVTEUpCitzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpZGV2X2NoaXBfaW5mbyA9IHsKKwkuZW5hYmxlX2RtYSA9IDAsCisJLmJpdHNfcGVyX3dvcmQgPSA4LAorfTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHNwaV9ib2FyZF9pbmZvIGJmaW5fc3BpX2JvYXJkX2luZm9bXSBfX2luaXRkYXRhID0geworI2lmIGRlZmluZWQoQ09ORklHX01URF9NMjVQODApIFwKKwl8fCBkZWZpbmVkKENPTkZJR19NVERfTTI1UDgwX01PRFVMRSkKKwl7CisJCS8qIHRoZSBtb2RhbGlhcyBtdXN0IGJlIHRoZSBzYW1lIGFzIHNwaSBkZXZpY2UgZHJpdmVyIG5hbWUgKi8KKwkJLm1vZGFsaWFzID0gIm0yNXA4MCIsIC8qIE5hbWUgb2Ygc3BpX2RyaXZlciBmb3IgdGhpcyBkZXZpY2UgKi8KKwkJLm1heF9zcGVlZF9oeiA9IDI1MDAwMDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLworCQkuYnVzX251bSA9IDAsIC8qIEZyYW1ld29yayBidXMgbnVtYmVyICovCisJCS5jaGlwX3NlbGVjdCA9IDEsIC8qIEZyYW1ld29yayBjaGlwIHNlbGVjdC4gT24gU1RBTVA1MzcgaXQgaXMgU1BJU1NFTDEqLworCQkucGxhdGZvcm1fZGF0YSA9ICZiZmluX3NwaV9mbGFzaF9kYXRhLAorCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaV9mbGFzaF9jaGlwX2luZm8sCisJCS5tb2RlID0gU1BJX01PREVfMywKKwl9LAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfQURDX0JGNTMzKSBcCisJfHwgZGVmaW5lZChDT05GSUdfU1BJX0FEQ19CRjUzM19NT0RVTEUpCisJeworCQkubW9kYWxpYXMgPSAiYmZpbl9zcGlfYWRjIiwgLyogTmFtZSBvZiBzcGlfZHJpdmVyIGZvciB0aGlzIGRldmljZSAqLworCQkubWF4X3NwZWVkX2h6ID0gNjI1MDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KKwkJLmJ1c19udW0gPSAwLCAvKiBGcmFtZXdvcmsgYnVzIG51bWJlciAqLworCQkuY2hpcF9zZWxlY3QgPSAxLCAvKiBGcmFtZXdvcmsgY2hpcCBzZWxlY3QuICovCisJCS5wbGF0Zm9ybV9kYXRhID0gTlVMTCwgLyogTm8gc3BpX2RyaXZlciBzcGVjaWZpYyBjb25maWcgKi8KKwkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfYWRjX2NoaXBfaW5mbywKKwl9LAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfTU1DKSB8fCBkZWZpbmVkKENPTkZJR19TUElfTU1DX01PRFVMRSkKKwl7CisJCS5tb2RhbGlhcyA9ICJzcGlfbW1jX2R1bW15IiwKKwkJLm1heF9zcGVlZF9oeiA9IDI1MDAwMDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLworCQkuYnVzX251bSA9IDAsCisJCS5jaGlwX3NlbGVjdCA9IDAsCisJCS5wbGF0Zm9ybV9kYXRhID0gTlVMTCwKKwkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfbW1jX2NoaXBfaW5mbywKKwkJLm1vZGUgPSBTUElfTU9ERV8zLAorCX0sCisJeworCQkubW9kYWxpYXMgPSAic3BpX21tYyIsCisJCS5tYXhfc3BlZWRfaHogPSAyNTAwMDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KKwkJLmJ1c19udW0gPSAwLAorCQkuY2hpcF9zZWxlY3QgPSBDT05GSUdfU1BJX01NQ19DU19DSEFOLAorCQkucGxhdGZvcm1fZGF0YSA9IE5VTEwsCisJCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpX21tY19jaGlwX2luZm8sCisJCS5tb2RlID0gU1BJX01PREVfMywKKwl9LAorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfUEJYKQorCXsKKwkJLm1vZGFsaWFzID0gImZ4cy1zcGkiLAorCQkubWF4X3NwZWVkX2h6ID0gMTI1MDAwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCisJCS5idXNfbnVtID0gMCwKKwkJLmNoaXBfc2VsZWN0ID0gOCAtIENPTkZJR19KMTFfSlVNUEVSLAorCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaV9zaTN4eHhfY2hpcF9pbmZvLAorCQkubW9kZSA9IFNQSV9NT0RFXzMsCisJfSwKKwl7CisJCS5tb2RhbGlhcyA9ICJmeG8tc3BpIiwKKwkJLm1heF9zcGVlZF9oeiA9IDEyNTAwMDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLworCQkuYnVzX251bSA9IDAsCisJCS5jaGlwX3NlbGVjdCA9IDggLSBDT05GSUdfSjE5X0pVTVBFUiwKKwkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfc2kzeHh4X2NoaXBfaW5mbywKKwkJLm1vZGUgPSBTUElfTU9ERV8zLAorCX0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzcpIHx8IGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3N19NT0RVTEUpCisJeworCQkubW9kYWxpYXMJCT0gImFkNzg3NyIsCisJCS5wbGF0Zm9ybV9kYXRhCQk9ICZiZmluX2FkNzg3N190c19pbmZvLAorCQkuaXJxCQkJPSBJUlFfUEY4LAorCQkubWF4X3NwZWVkX2h6CT0gMTI1MDAwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCisJCS5idXNfbnVtCT0gMCwKKwkJLmNoaXBfc2VsZWN0ICA9IDIsCisJCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpX2FkNzg3N19jaGlwX2luZm8sCisJfSwKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1NORF9TT0NfV004NzMxKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfU09DX1dNODczMV9NT0RVTEUpIFwKKwkgJiYgZGVmaW5lZChDT05GSUdfU05EX1NPQ19XTTg3MzFfU1BJKQorCXsKKwkJLm1vZGFsaWFzCT0gIndtODczMSIsCisJCS5tYXhfc3BlZWRfaHoJPSAzMTI1MDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLworCQkuYnVzX251bQk9IDAsCisJCS5jaGlwX3NlbGVjdCAgICA9IDUsCisJCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpX3dtODczMV9jaGlwX2luZm8sCisJCS5tb2RlID0gU1BJX01PREVfMCwKKwl9LAorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX1NQSURFVikgfHwgZGVmaW5lZChDT05GSUdfU1BJX1NQSURFVl9NT0RVTEUpCisJeworCQkubW9kYWxpYXMgPSAic3BpZGV2IiwKKwkJLm1heF9zcGVlZF9oeiA9IDMxMjUwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCisJCS5idXNfbnVtID0gMCwKKwkJLmNoaXBfc2VsZWN0ID0gMSwKKwkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlkZXZfY2hpcF9pbmZvLAorCX0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19GQl9CRklOX0xRMDM1UTEpIHx8IGRlZmluZWQoQ09ORklHX0ZCX0JGSU5fTFEwMzVRMV9NT0RVTEUpCisJeworCQkubW9kYWxpYXMgPSAiYmZpbi1scTAzNXExLXNwaSIsCisJCS5tYXhfc3BlZWRfaHogPSAyMDAwMDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KKwkJLmJ1c19udW0gPSAwLAorCQkuY2hpcF9zZWxlY3QgPSAxLAorCQkuY29udHJvbGxlcl9kYXRhID0gJmxxMDM1cTFfc3BpX2NoaXBfaW5mbywKKwkJLm1vZGUgPSBTUElfQ1BIQSB8IFNQSV9DUE9MLAorCX0sCisjZW5kaWYKK307CisKKy8qIFNQSSBjb250cm9sbGVyIGRhdGEgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19TUElfQkZJTikgfHwgZGVmaW5lZChDT05GSUdfU1BJX0JGSU5fTU9EVUxFKQorLyogU1BJICgwKSAqLworc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9tYXN0ZXIgYmZpbl9zcGkwX2luZm8gPSB7CisJLm51bV9jaGlwc2VsZWN0ID0gNSwKKwkuZW5hYmxlX2RtYSA9IDEsICAvKiBtYXN0ZXIgaGFzIHRoZSBhYmlsaXR5IHRvIGRvIGRtYSB0cmFuc2ZlciAqLworCS5waW5fcmVxID0ge1BfU1BJMF9TQ0ssIFBfU1BJMF9NSVNPLCBQX1NQSTBfTU9TSSwgMH0sCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc3BpMF9yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ID0gU1BJMF9SRUdCQVNFLAorCQkuZW5kICAgPSBTUEkwX1JFR0JBU0UgKyAweEZGLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwkJfSwKKwlbMV0gPSB7CisJCS5zdGFydCA9IENIX1NQSTAsCisJCS5lbmQgICA9IENIX1NQSTAsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NwaTBfZGV2aWNlID0geworCS5uYW1lID0gImJmaW4tc3BpIiwKKwkuaWQgPSAwLCAvKiBCdXMgbnVtYmVyICovCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc3BpMF9yZXNvdXJjZSksCisJLnJlc291cmNlID0gYmZpbl9zcGkwX3Jlc291cmNlLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmJmaW5fc3BpMF9pbmZvLCAvKiBQYXNzZWQgdG8gZHJpdmVyICovCisJfSwKK307CisKKy8qIFNQSSAoMSkgKi8KK3N0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfbWFzdGVyIGJmaW5fc3BpMV9pbmZvID0geworCS5udW1fY2hpcHNlbGVjdCA9IDUsCisJLmVuYWJsZV9kbWEgPSAxLCAgLyogbWFzdGVyIGhhcyB0aGUgYWJpbGl0eSB0byBkbyBkbWEgdHJhbnNmZXIgKi8KKwkucGluX3JlcSA9IHtQX1NQSTFfU0NLLCBQX1NQSTFfTUlTTywgUF9TUEkxX01PU0ksIDB9LAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NwaTFfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCA9IFNQSTFfUkVHQkFTRSwKKwkJLmVuZCAgID0gU1BJMV9SRUdCQVNFICsgMHhGRiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJCX0sCisJWzFdID0geworCQkuc3RhcnQgPSBDSF9TUEkxLAorCQkuZW5kICAgPSBDSF9TUEkxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zcGkxX2RldmljZSA9IHsKKwkubmFtZSA9ICJiZmluLXNwaSIsCisJLmlkID0gMSwgLyogQnVzIG51bWJlciAqLworCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NwaTFfcmVzb3VyY2UpLAorCS5yZXNvdXJjZSA9IGJmaW5fc3BpMV9yZXNvdXJjZSwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZiZmluX3NwaTFfaW5mbywgLyogUGFzc2VkIHRvIGRyaXZlciAqLworCX0sCit9OworI2VuZGlmICAvKiBzcGkgbWFzdGVyIGFuZCBkZXZpY2VzICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTikgfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fTU9EVUxFKQorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3VhcnRfcmVzb3VyY2VzW10gPSB7CisjaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX1VBUlQwCisJeworCQkuc3RhcnQgPSAweEZGQzAwNDAwLAorCQkuZW5kID0gMHhGRkMwMDRGRiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9VQVJUMQorCXsKKwkJLnN0YXJ0ID0gMHhGRkMwMjAwMCwKKwkJLmVuZCA9IDB4RkZDMDIwRkYsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisjZW5kaWYKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fdWFydF9kZXZpY2UgPSB7CisJLm5hbWUgPSAiYmZpbi11YXJ0IiwKKwkuaWQgPSAxLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3VhcnRfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3VhcnRfcmVzb3VyY2VzLAorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyMF9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydCA9IDB4RkZDMDA0MDAsCisJCS5lbmQgPSAweEZGQzAwNEZGLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQwX1JYLAorCQkuZW5kID0gSVJRX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMF9SWCwKKwkJLmVuZCA9IENIX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjBfZGV2aWNlID0geworCS5uYW1lID0gImJmaW5fc2lyIiwKKwkuaWQgPSAwLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjBfcmVzb3VyY2VzLAorfTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CRklOX1NJUjEKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIxX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0ID0gMHhGRkMwMjAwMCwKKwkJLmVuZCA9IDB4RkZDMDIwRkYsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDFfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDFfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQxX1JYLAorCQkuZW5kID0gQ0hfVUFSVDFfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyMV9kZXZpY2UgPSB7CisJLm5hbWUgPSAiYmZpbl9zaXIiLAorCS5pZCA9IDEsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMV9yZXNvdXJjZXMsCit9OworI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0kpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfTU9EVUxFKQorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3R3aTBfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCA9IFRXSTBfUkVHQkFTRSwKKwkJLmVuZCAgID0gVFdJMF9SRUdCQVNFLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ID0gSVJRX1RXSSwKKwkJLmVuZCAgID0gSVJRX1RXSSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGkyY19iZmluX3R3aV9kZXZpY2UgPSB7CisJLm5hbWUgPSAiaTJjLWJmaW4tdHdpIiwKKwkuaWQgPSAwLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3R3aTBfcmVzb3VyY2UpLAorCS5yZXNvdXJjZSA9IGJmaW5fdHdpMF9yZXNvdXJjZSwKK307CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19JMkNfQk9BUkRJTkZPCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIF9faW5pdGRhdGEgYmZpbl9pMmNfYm9hcmRfaW5mb1tdID0geworI2lmIGRlZmluZWQoQ09ORklHX1RXSV9MQ0QpIHx8IGRlZmluZWQoQ09ORklHX1RXSV9MQ0RfTU9EVUxFKQorCXsKKwkJSTJDX0JPQVJEX0lORk8oInBjZjg1NzRfbGNkIiwgMHgyMiksCisJfSwKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1RXSV9LRVlQQUQpIHx8IGRlZmluZWQoQ09ORklHX1RXSV9LRVlQQURfTU9EVUxFKQorCXsKKwkJSTJDX0JPQVJEX0lORk8oInBjZjg1NzRfa2V5cGFkIiwgMHgyNyksCisJCS5pcnEgPSBJUlFfUEY4LAorCX0sCisjZW5kaWYKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOX1NQT1JUKSB8fCBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTl9TUE9SVF9NT0RVTEUpCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Nwb3J0MF91YXJ0X2RldmljZSA9IHsKKwkubmFtZSA9ICJiZmluLXNwb3J0LXVhcnQiLAorCS5pZCA9IDAsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Nwb3J0MV91YXJ0X2RldmljZSA9IHsKKwkubmFtZSA9ICJiZmluLXNwb3J0LXVhcnQiLAorCS5pZCA9IDEsCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9HUElPKSB8fCBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9HUElPX01PRFVMRSkKKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW9fa2V5cy5oPgorCitzdGF0aWMgc3RydWN0IGdwaW9fa2V5c19idXR0b24gYmZpbl9ncGlvX2tleXNfdGFibGVbXSA9IHsKKwl7QlROXzAsIEdQSU9fUEcwLCAxLCAiZ3Bpby1rZXlzOiBCVE4wIn0sCisJe0JUTl8xLCBHUElPX1BHMTMsIDEsICJncGlvLWtleXM6IEJUTjEifSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19rZXlzX3BsYXRmb3JtX2RhdGEgYmZpbl9ncGlvX2tleXNfZGF0YSA9IHsKKwkuYnV0dG9ucyAgICAgICAgPSBiZmluX2dwaW9fa2V5c190YWJsZSwKKwkubmJ1dHRvbnMgICAgICAgPSBBUlJBWV9TSVpFKGJmaW5fZ3Bpb19rZXlzX3RhYmxlKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fZGV2aWNlX2dwaW9rZXlzID0geworCS5uYW1lICAgICAgPSAiZ3Bpby1rZXlzIiwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZiZmluX2dwaW9fa2V5c19kYXRhLAorCX0sCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TREhfQkZJTikgfHwgZGVmaW5lZChDT05GSUdfU0RIX0JGSU5fTU9EVUxFKQorCitzdGF0aWMgc3RydWN0IGJmaW5fc2RfaG9zdCBiZmluX3NkaF9kYXRhID0geworCS5kbWFfY2hhbiA9IENIX1JTSSwKKwkuaXJxX2ludDAgPSBJUlFfUlNJX0lOVDAsCisJLnBpbl9yZXEgPSB7UF9SU0lfREFUQTAsIFBfUlNJX0RBVEExLCBQX1JTSV9EQVRBMiwgUF9SU0lfREFUQTMsIFBfUlNJX0NNRCwgUF9SU0lfQ0xLLCAwfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmNTF4X3NkaF9kZXZpY2UgPSB7CisJLm5hbWUgPSAiYmZpbi1zZGgiLAorCS5pZCA9IDAsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmYmZpbl9zZGhfZGF0YSwKKwl9LAorfTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fZ3Bpb3NfcmVzb3VyY2VzID0geworCS5zdGFydCA9IDAsCisJLmVuZCAgID0gTUFYX0JMQUNLRklOX0dQSU9TIC0gMSwKKwkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fZ3Bpb3NfZGV2aWNlID0geworCS5uYW1lID0gInNpbXBsZS1ncGlvIiwKKwkuaWQgPSAtMSwKKwkubnVtX3Jlc291cmNlcyA9IDEsCisJLnJlc291cmNlID0gJmJmaW5fZ3Bpb3NfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBjY2xrX3ZsZXZfZGF0YXNoZWV0W10gPQoreworCVZSUEFJUihWTEVWXzEwMCwgNDAwMDAwMDAwKSwKKwlWUlBBSVIoVkxFVl8xMDUsIDQyNjAwMDAwMCksCisJVlJQQUlSKFZMRVZfMTEwLCA1MDAwMDAwMDApLAorCVZSUEFJUihWTEVWXzExNSwgNTMzMDAwMDAwKSwKKwlWUlBBSVIoVkxFVl8xMjAsIDYwMDAwMDAwMCksCit9OworCitzdGF0aWMgc3RydWN0IGJmaW5fZHBtY19wbGF0Zm9ybV9kYXRhIGJmaW5fZG1wY192cmVnX2RhdGEgPSB7CisJLnR1cGxlX3RhYiA9IGNjbGtfdmxldl9kYXRhc2hlZXQsCisJLnRhYnNpemUgPSBBUlJBWV9TSVpFKGNjbGtfdmxldl9kYXRhc2hlZXQpLAorCS52cl9zZXR0bGluZ190aW1lID0gMjUgLyogdXMgKi8sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2RwbWMgPSB7CisJLm5hbWUgPSAiYmZpbiBkcG1jIiwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZiZmluX2RtcGNfdnJlZ19kYXRhLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc3RhbXBfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisKKwkmYmZpbl9kcG1jLAorCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX0RSVl9CRklOKSB8fCBkZWZpbmVkKENPTkZJR19SVENfRFJWX0JGSU5fTU9EVUxFKQorCSZydGNfZGV2aWNlLAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19CRklOX01BQykgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9NQUNfTU9EVUxFKQorCSZiZmluX21hY19kZXZpY2UsCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NQSV9CRklOKSB8fCBkZWZpbmVkKENPTkZJR19TUElfQkZJTl9NT0RVTEUpCisJJmJmaW5fc3BpMF9kZXZpY2UsCisJJmJmaW5fc3BpMV9kZXZpY2UsCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOKSB8fCBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTl9NT0RVTEUpCisJJmJmaW5fdWFydF9kZXZpY2UsCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorCSZiZmluX3NpcjBfZGV2aWNlLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMQorCSZiZmluX3NpcjFfZGV2aWNlLAorI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0kpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfTU9EVUxFKQorCSZpMmNfYmZpbl90d2lfZGV2aWNlLAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTl9TUE9SVCkgfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fU1BPUlRfTU9EVUxFKQorCSZiZmluX3Nwb3J0MF91YXJ0X2RldmljZSwKKwkmYmZpbl9zcG9ydDFfdWFydF9kZXZpY2UsCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX0dQSU8pIHx8IGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX0dQSU9fTU9EVUxFKQorCSZiZmluX2RldmljZV9ncGlva2V5cywKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU0RIX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1NESF9CRklOX01PRFVMRSkKKwkmYmY1MXhfc2RoX2RldmljZSwKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfTVREX1BIWVNNQVApIHx8IGRlZmluZWQoQ09ORklHX01URF9QSFlTTUFQX01PRFVMRSkKKwkmZXpicmRfZmxhc2hfZGV2aWNlLAorI2VuZGlmCisKKwkmYmZpbl9ncGlvc19kZXZpY2UsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBlemJyZF9pbml0KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXMoKTogcmVnaXN0ZXJpbmcgZGV2aWNlIHJlc291cmNlc1xuIiwgX19mdW5jX18pOworCisjaWZkZWYgQ09ORklHX0kyQ19CT0FSRElORk8KKwlpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygwLCBiZmluX2kyY19ib2FyZF9pbmZvLAorCQkJCUFSUkFZX1NJWkUoYmZpbl9pMmNfYm9hcmRfaW5mbykpOworI2VuZGlmCisKKwlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzdGFtcF9kZXZpY2VzLCBBUlJBWV9TSVpFKHN0YW1wX2RldmljZXMpKTsKKwlzcGlfcmVnaXN0ZXJfYm9hcmRfaW5mbyhiZmluX3NwaV9ib2FyZF9pbmZvLCBBUlJBWV9TSVpFKGJmaW5fc3BpX2JvYXJkX2luZm8pKTsKKwlyZXR1cm4gMDsKK30KKworYXJjaF9pbml0Y2FsbChlemJyZF9pbml0KTsKKwordm9pZCBuYXRpdmVfbWFjaGluZV9yZXN0YXJ0KGNoYXIgKmNtZCkKK3sKKwkvKiB3b3JrYXJvdW5kIHJlYm9vdCBoYW5nIHdoZW4gYm9vdGluZyBmcm9tIFNQSSAqLworCWlmICgoYmZpbl9yZWFkX1NZU0NSKCkgJiAweDcpID09IDB4MykKKwkJYmZpbl9ncGlvX3Jlc2V0X3NwaTBfc3NlbDEoKTsKK30KKwordm9pZCBiZmluX2dldF9ldGhlcl9hZGRyKGNoYXIgKmFkZHIpCit7CisJLyogdGhlIE1BQyBpcyBzdG9yZWQgaW4gT1RQIG1lbW9yeSBwYWdlIDB4REYgKi8KKwl1MzIgcmV0OworCXU2NCBvdHBfbWFjOworCXUzMiAoKm90cF9yZWFkKSh1MzIgcGFnZSwgdTMyIGZsYWdzLCB1NjQgKnBhZ2VfY29udGVudCkgPSAodm9pZCAqKTB4RUYwMDAwMUE7CisKKwlyZXQgPSBvdHBfcmVhZCgweERGLCAweDAwLCAmb3RwX21hYyk7CisJaWYgKCEocmV0ICYgMHgxKSkgeworCQljaGFyICpvdHBfbWFjX3AgPSAoY2hhciAqKSZvdHBfbWFjOworCQlmb3IgKHJldCA9IDA7IHJldCA8IDY7ICsrcmV0KQorCQkJYWRkcltyZXRdID0gb3RwX21hY19wWzUgLSByZXRdOworCX0KK30KK0VYUE9SVF9TWU1CT0woYmZpbl9nZXRfZXRoZXJfYWRkcik7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvZG1hLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk4ZTg4YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9kbWEuYwpAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2RtYS5jCisgKiBCYXNlZCBvbjoKKyAqIEF1dGhvcjogICAgICAgQnJ5YW4gV3UgPGNvb2xvbmV5QGtlcm5lbC5vcmc+CisgKgorICogQ3JlYXRlZDoKKyAqIERlc2NyaXB0aW9uOiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzaW1wbGUgRE1BIEltcGxlbWVudGF0aW9uIGZvciBCbGFja2ZpbgorICoKKyAqIE1vZGlmaWVkOgorICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCisgKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorCitzdHJ1Y3QgZG1hX3JlZ2lzdGVyICpkbWFfaW9fYmFzZV9hZGRyW01BWF9ETUFfQ0hBTk5FTFNdID0geworCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTBfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUExX05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMl9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTNfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUE0X05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BNV9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTZfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUE3X05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BOF9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTlfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUExMF9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTExX05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgTURNQV9TMF9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIE1ETUFfRDBfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBNRE1BX1MxX05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgTURNQV9EMV9ORVhUX0RFU0NfUFRSLAorfTsKK0VYUE9SVF9TWU1CT0woZG1hX2lvX2Jhc2VfYWRkcik7CisKK2ludCBjaGFubmVsMmlycSh1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwlpbnQgcmV0X2lycSA9IC0xOworCisJc3dpdGNoIChjaGFubmVsKSB7CisJY2FzZSBDSF9QUEk6CisJCXJldF9pcnEgPSBJUlFfUFBJOworCQlicmVhazsKKworCWNhc2UgQ0hfRU1BQ19SWDoKKwkJcmV0X2lycSA9IElSUV9NQUNfUlg7CisJCWJyZWFrOworCisJY2FzZSBDSF9FTUFDX1RYOgorCQlyZXRfaXJxID0gSVJRX01BQ19UWDsKKwkJYnJlYWs7CisKKwljYXNlIENIX1VBUlQxX1JYOgorCQlyZXRfaXJxID0gSVJRX1VBUlQxX1JYOworCQlicmVhazsKKworCWNhc2UgQ0hfVUFSVDFfVFg6CisJCXJldF9pcnEgPSBJUlFfVUFSVDFfVFg7CisJCWJyZWFrOworCisJY2FzZSBDSF9TUE9SVDBfUlg6CisJCXJldF9pcnEgPSBJUlFfU1BPUlQwX1JYOworCQlicmVhazsKKworCWNhc2UgQ0hfU1BPUlQwX1RYOgorCQlyZXRfaXJxID0gSVJRX1NQT1JUMF9UWDsKKwkJYnJlYWs7CisKKwljYXNlIENIX1NQT1JUMV9SWDoKKwkJcmV0X2lycSA9IElSUV9TUE9SVDFfUlg7CisJCWJyZWFrOworCisJY2FzZSBDSF9TUE9SVDFfVFg6CisJCXJldF9pcnEgPSBJUlFfU1BPUlQxX1RYOworCQlicmVhazsKKworCWNhc2UgQ0hfU1BJMDoKKwkJcmV0X2lycSA9IElSUV9TUEkwOworCQlicmVhazsKKworCWNhc2UgQ0hfVUFSVDBfUlg6CisJCXJldF9pcnEgPSBJUlFfVUFSVDBfUlg7CisJCWJyZWFrOworCisJY2FzZSBDSF9VQVJUMF9UWDoKKwkJcmV0X2lycSA9IElSUV9VQVJUMF9UWDsKKwkJYnJlYWs7CisKKwljYXNlIENIX01FTV9TVFJFQU0wX1NSQzoKKwljYXNlIENIX01FTV9TVFJFQU0wX0RFU1Q6CisJCXJldF9pcnEgPSBJUlFfTUVNX0RNQTA7CisJCWJyZWFrOworCisJY2FzZSBDSF9NRU1fU1RSRUFNMV9TUkM6CisJY2FzZSBDSF9NRU1fU1RSRUFNMV9ERVNUOgorCQlyZXRfaXJxID0gSVJRX01FTV9ETUExOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldF9pcnE7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2Fub21hbHkuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvYW5vbWFseS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YjRiZWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2Fub21hbHkuaApAQCAtMCwwICsxLDc5IEBACisvKgorICogRmlsZTogaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUxOC9hbm9tYWx5LmgKKyAqIEJ1Z3M6IEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisvKiBUaGlzIGZpbGUgc2hvdWxlIGJlIHVwIHRvIGRhdGUgd2l0aDoKKyAqICAtID8/Pz8KKyAqLworCisjaWZuZGVmIF9NQUNIX0FOT01BTFlfSF8KKyNkZWZpbmUgX01BQ0hfQU5PTUFMWV9IXworCisvKiBNdWx0aS1Jc3N1ZSBJbnN0cnVjdGlvbiB3aXRoIGRzcDMyc2hpZnRpbW0gaW4gc2xvdDEgYW5kIFAtcmVnIFN0b3JlIGluIHNsb3QyIE5vdCBTdXBwb3J0ZWQgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDA3NCAoMSkKKy8qIFJ4LkggQ2Fubm90IEJlIFVzZWQgdG8gQWNjZXNzIDE2LWJpdCBTeXN0ZW0gTU1SIFJlZ2lzdGVycyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMTIyICgxKQorLyogRmFsc2UgSGFyZHdhcmUgRXJyb3IgZnJvbSBhbiBBY2Nlc3MgaW4gdGhlIFNoYWRvdyBvZiBhIENvbmRpdGlvbmFsIEJyYW5jaCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMjQ1ICgxKQorLyogU2Vuc2l0aXZpdHkgVG8gTm9pc2Ugd2l0aCBTbG93IElucHV0IEVkZ2UgUmF0ZXMgb24gRXh0ZXJuYWwgU1BPUlQgVFggYW5kIFJYIENsb2NrcyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMjY1ICgxKQorLyogRmFsc2UgSGFyZHdhcmUgRXJyb3JzIENhdXNlZCBieSBGZXRjaGVzIGF0IHRoZSBCb3VuZGFyeSBvZiBSZXNlcnZlZCBNZW1vcnkgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDMxMCAoMSkKKy8qIFBQSSBVbmRlcmZsb3cgRXJyb3IgR29lcyBVbmRldGVjdGVkIGluIElUVS1SIDY1NiBNb2RlICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzNjYgKDEpCisvKiBMb2NrYm94IFNFU1IgRmlybXdhcmUgRG9lcyBOb3QgU2F2ZS9SZXN0b3JlIEZ1bGwgQ29udGV4dCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDA1ICgxKQorLyogTG9ja2JveCBGaXJtd2FyZSBNZW1vcnkgQ2xlYW51cCBSb3V0aW5lIERvZXMgbm90IENsZWFyIFJlZ2lzdGVycyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDA4ICgxKQorLyogU3BlY3VsYXRpdmUgRmV0Y2hlcyBDYW4gQ2F1c2UgVW5kZXNpcmVkIEV4dGVybmFsIEZJRk8gT3BlcmF0aW9ucyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDE2ICgxKQorLyogVFdJIEZhbGwgVGltZSAoVG9mKSBNYXkgVmlvbGF0ZSB0aGUgTWluaW11bSBJMkMgU3BlY2lmaWNhdGlvbiAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDIxICgxKQorLyogVFdJIElucHV0IENhcGFjaXRhbmNlIChDaSkgTWF5IFZpb2xhdGUgdGhlIE1heGltdW0gSTJDIFNwZWNpZmljYXRpb24gKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQyMiAoMSkKKy8qIFNwZWN1bGF0aXZlIEZldGNoZXMgb2YgSW5kaXJlY3QtUG9pbnRlciBJbnN0cnVjdGlvbnMgQ2FuIENhdXNlIEZhbHNlIEhhcmR3YXJlIEVycm9ycyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDI2ICgxKQorLyogU29mdHdhcmUgU3lzdGVtIFJlc2V0IENvcnJ1cHRzIFBMTF9MT0NLQ05UIFJlZ2lzdGVyICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MzAgKDEpCisvKiBJbmNvcnJlY3QgVXNlIG9mIFN0YWNrIGluIExvY2tib3ggRmlybXdhcmUgRHVyaW5nIEF1dGhlbnRpY2F0aW9uICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MzEgKDEpCisvKiBDZXJ0YWluIFNJQyBSZWdpc3RlcnMgYXJlIG5vdCBSZXNldCBBZnRlciBTb2Z0IG9yIENvcmUgRG91YmxlIEZhdWx0IFJlc2V0ICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MzUgKDEpCisvKiBQT1JUeF9EUklWRSBhbmQgUE9SVHhfSFlTVEVSRVNJUyBSZWdpc3RlcnMgUmVhZCBCYWNrIEluY29ycmVjdCBWYWx1ZXMgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQzOCAoMSkKKy8qIFByZWJvb3QgQ2Fubm90IGJlIFVzZWQgdG8gUHJvZ3JhbSB0aGUgUExMX0RJViBSZWdpc3RlciAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDM5ICgxKQorLyogYmZyb21fU3lzQ29udHJvbCgpIENhbm5vdCBiZSBVc2VkIHRvIFdyaXRlIHRoZSBQTExfRElWIFJlZ2lzdGVyICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0NDAgKDEpCisvKiBJRkxVU0ggSW5zdHJ1Y3Rpb24gYXQgRW5kIG9mIEhhcmR3YXJlIExvb3AgQ2F1c2VzIEluZmluaXRlIFN0YWxsICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0NDMgKDEpCisvKiBJbmNvcnJlY3QgTDEgSW5zdHJ1Y3Rpb24gQmFuayBCIE1lbW9yeSBNYXAgTG9jYXRpb24gKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ0NCAoMSkKKworLyogQW5vbWFsaWVzIHRoYXQgZG9uJ3QgZXhpc3Qgb24gdGhpcyBwcm9jICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAxMjUgKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDAxNTggKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDAxODMgKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDAxOTggKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDAyMzAgKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDAyNDQgKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDAyNjEgKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDAyNjMgKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDAyNjYgKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDAyNzMgKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDAyODUgKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzMDcgKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzMTEgKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzMTIgKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzMjMgKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzNTMgKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzNjMgKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzODYgKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MTIgKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MzIgKDApCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9iZjUxOC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9iZjUxOC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZGExYTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2JmNTE4LmgKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MTgvYmY1MTguaAorICogQmFzZWQgb246CWluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MjcvYmY1MjcuaAorICogQXV0aG9yOglNaWNoYWVsIEhlbm5lcmljaCAobWljaGFlbC5oZW5uZXJpY2hAYW5hbG9nLmNvbSkKKyAqCisgKiBDcmVhdGVkOgorICogRGVzY3JpcHRpb246ICBTWVNURU0gTU1SIFJFR0lTVEVSIEFORCBNRU1PUlkgTUFQIEZPUiBBRFNQLUJGNTE4CisgKgorICogTW9kaWZpZWQ6CisgKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDcgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKKyAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgX19NQUNIX0JGNTE4X0hfXworI2RlZmluZSBfX01BQ0hfQkY1MThfSF9fCisKKyNkZWZpbmUgT0ZGU0VUXyh4KSAoKHgpICYgMHgwMDAwRkZGRikKKworLypzb21lIG1pc2MgZGVmaW5lcyovCisjZGVmaW5lIElNQVNLX0lWRzE1CQkweDgwMDAKKyNkZWZpbmUgSU1BU0tfSVZHMTQJCTB4NDAwMAorI2RlZmluZSBJTUFTS19JVkcxMwkJMHgyMDAwCisjZGVmaW5lIElNQVNLX0lWRzEyCQkweDEwMDAKKworI2RlZmluZSBJTUFTS19JVkcxMQkJMHgwODAwCisjZGVmaW5lIElNQVNLX0lWRzEwCQkweDA0MDAKKyNkZWZpbmUgSU1BU0tfSVZHOQkJMHgwMjAwCisjZGVmaW5lIElNQVNLX0lWRzgJCTB4MDEwMAorCisjZGVmaW5lIElNQVNLX0lWRzcJCTB4MDA4MAorI2RlZmluZSBJTUFTS19JVkdUTVIJCTB4MDA0MAorI2RlZmluZSBJTUFTS19JVkdIVwkJMHgwMDIwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQkZJTl9EU1VCQkFOS1MJNAorI2RlZmluZSBCRklOX0RXQVlTCQkyCisjZGVmaW5lIEJGSU5fRExJTkVTCQk2NAorI2RlZmluZSBCRklOX0lTVUJCQU5LUwk0CisjZGVmaW5lIEJGSU5fSVdBWVMJCTQKKyNkZWZpbmUgQkZJTl9JTElORVMJCTMyCisKKyNkZWZpbmUgV0FZMF9MCQkJMHgxCisjZGVmaW5lIFdBWTFfTAkJCTB4MgorI2RlZmluZSBXQVkwMV9MCQkJMHgzCisjZGVmaW5lIFdBWTJfTAkJCTB4NAorI2RlZmluZSBXQVkwMl9MCQkJMHg1CisjZGVmaW5lCVdBWTEyX0wJCQkweDYKKyNkZWZpbmUJV0FZMDEyX0wJCTB4NworCisjZGVmaW5lCVdBWTNfTAkJCTB4OAorI2RlZmluZQlXQVkwM19MCQkJMHg5CisjZGVmaW5lCVdBWTEzX0wJCQkweEEKKyNkZWZpbmUJV0FZMDEzX0wJCTB4QgorCisjZGVmaW5lCVdBWTMyX0wJCQkweEMKKyNkZWZpbmUJV0FZMzIwX0wJCTB4RAorI2RlZmluZQlXQVkzMjFfTAkJMHhFCisjZGVmaW5lCVdBWUFMTF9MCQkweEYKKworI2RlZmluZSBETUNfRU5BQkxFICgyPDwyKQkvKnllcywgMiwgbm90IDEgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBFQklVIFNldHRpbmdzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQU1CQ1RMMFZBTAkoKENPTkZJR19CQU5LXzEgPDwgMTYpIHwgQ09ORklHX0JBTktfMCkKKyNkZWZpbmUgQU1CQ1RMMVZBTAkoKENPTkZJR19CQU5LXzMgPDwgMTYpIHwgQ09ORklHX0JBTktfMikKKworI2lmZGVmIENPTkZJR19DX0FNQkVOX0FMTAorI2RlZmluZSBWX0FNQkVOIEFNQkVOX0FMTAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0NfQU1CRU4KKyNkZWZpbmUgVl9BTUJFTiAweDAKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DX0FNQkVOX0IwCisjZGVmaW5lIFZfQU1CRU4gQU1CRU5fQjAKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DX0FNQkVOX0IwX0IxCisjZGVmaW5lIFZfQU1CRU4gQU1CRU5fQjBfQjEKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DX0FNQkVOX0IwX0IxX0IyCisjZGVmaW5lIFZfQU1CRU4gQU1CRU5fQjBfQjFfQjIKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DX0FNQ0tFTgorI2RlZmluZSBWX0FNQ0tFTiBBTUNLRU4KKyNlbHNlCisjZGVmaW5lIFZfQU1DS0VOIDB4MAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0NfQ0RQUklPCisjZGVmaW5lIFZfQ0RQUklPIDB4MTAwCisjZWxzZQorI2RlZmluZSBWX0NEUFJJTyAweDAKKyNlbmRpZgorCisjZGVmaW5lIEFNR0NUTFZBTAkoVl9BTUJFTiB8IFZfQU1DS0VOIHwgVl9DRFBSSU8pCisKKyNpZmRlZiBDT05GSUdfQkY1MTgKKyNkZWZpbmUgQ1BVICJCRjUxOCIKKyNkZWZpbmUgQ1BVSUQgMHgyN2U4CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkY1MTYKKyNkZWZpbmUgQ1BVICJCRjUxNiIKKyNkZWZpbmUgQ1BVSUQgMHgyN2U4CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkY1MTQKKyNkZWZpbmUgQ1BVICJCRjUxNCIKKyNkZWZpbmUgQ1BVSUQgMHgyN2U4CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkY1MTIKKyNkZWZpbmUgQ1BVICJCRjUxMiIKKyNkZWZpbmUgQ1BVSUQgMHgyN2U4CisjZW5kaWYKKworI2lmbmRlZiBDUFUKKyNlcnJvciAiVW5rbm93biBDUFUgdHlwZSAtIFRoaXMga2VybmVsIGRvZXNuJ3Qgc2VlbSB0byBiZSBjb25maWd1cmVkIHByb3Blcmx5IgorI2VuZGlmCisKKyNlbmRpZgkJCQkvKiBfX01BQ0hfQkY1MThfSF9fICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWxfNXh4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUwYTYzYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWxfNXh4LmgKQEAgLTAsMCArMSwxNjkgQEAKKy8qCisgKiBmaWxlOiAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUxOC9iZmluX3NlcmlhbF81eHguaAorICogYmFzZWQgb246CisgKiBhdXRob3I6CisgKgorICogY3JlYXRlZDoKKyAqIGRlc2NyaXB0aW9uOgorICoJYmxhY2tmaW4gc2VyaWFsIGRyaXZlciBoZWFkIGZpbGUKKyAqIHJldjoKKyAqCisgKiBtb2RpZmllZDoKKyAqCisgKgorICogYnVnczogICAgICAgICBlbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiB0aGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBnbnUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBmcmVlIHNvZnR3YXJlIGZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIHRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IHdpdGhvdXQgYW55IHdhcnJhbnR5OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIG1lcmNoYW50YWJpbGl0eSBvciBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gIHNlZSB0aGUKKyAqIGdudSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgZ251IGdlbmVyYWwgcHVibGljIGxpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgY29weWluZy4KKyAqIGlmIG5vdCwgd3JpdGUgdG8gdGhlIGZyZWUgc29mdHdhcmUgZm91bmRhdGlvbiwKKyAqIDU5IHRlbXBsZSBwbGFjZSAtIHN1aXRlIDMzMCwgYm9zdG9uLCBtYSAwMjExMS0xMzA3LCB1c2EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vcG9ydG11eC5oPgorCisjZGVmaW5lIFVBUlRfR0VUX0NIQVIodWFydCkgICAgIGJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9SQlIpKQorI2RlZmluZSBVQVJUX0dFVF9ETEwodWFydCkJYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0RMTCkpCisjZGVmaW5lIFVBUlRfR0VUX0lFUih1YXJ0KSAgICAgIGJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9JRVIpKQorI2RlZmluZSBVQVJUX0dFVF9ETEgodWFydCkJYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0RMSCkpCisjZGVmaW5lIFVBUlRfR0VUX0lJUih1YXJ0KSAgICAgIGJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9JSVIpKQorI2RlZmluZSBVQVJUX0dFVF9MQ1IodWFydCkgICAgICBiZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfTENSKSkKKyNkZWZpbmUgVUFSVF9HRVRfR0NUTCh1YXJ0KSAgICAgYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0dDVEwpKQorCisjZGVmaW5lIFVBUlRfUFVUX0NIQVIodWFydCwgdikgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX1RIUiksIHYpCisjZGVmaW5lIFVBUlRfUFVUX0RMTCh1YXJ0LCB2KSAgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0RMTCksIHYpCisjZGVmaW5lIFVBUlRfUFVUX0lFUih1YXJ0LCB2KSAgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0lFUiksIHYpCisjZGVmaW5lIFVBUlRfU0VUX0lFUih1YXJ0LCB2KSAgICBVQVJUX1BVVF9JRVIodWFydCwgVUFSVF9HRVRfSUVSKHVhcnQpIHwgKHYpKQorI2RlZmluZSBVQVJUX0NMRUFSX0lFUih1YXJ0LCB2KSAgVUFSVF9QVVRfSUVSKHVhcnQsIFVBUlRfR0VUX0lFUih1YXJ0KSAmIH4odikpCisjZGVmaW5lIFVBUlRfUFVUX0RMSCh1YXJ0LCB2KSAgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0RMSCksIHYpCisjZGVmaW5lIFVBUlRfUFVUX0xDUih1YXJ0LCB2KSAgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0xDUiksIHYpCisjZGVmaW5lIFVBUlRfUFVUX0dDVEwodWFydCwgdikgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0dDVEwpLCB2KQorCisjZGVmaW5lIFVBUlRfU0VUX0RMQUIodWFydCkgICAgIGRvIHsgVUFSVF9QVVRfTENSKHVhcnQsIFVBUlRfR0VUX0xDUih1YXJ0KSB8IERMQUIpOyBTU1lOQygpOyB9IHdoaWxlICgwKQorI2RlZmluZSBVQVJUX0NMRUFSX0RMQUIodWFydCkgICBkbyB7IFVBUlRfUFVUX0xDUih1YXJ0LCBVQVJUX0dFVF9MQ1IodWFydCkgJiB+RExBQik7IFNTWU5DKCk7IH0gd2hpbGUgKDApCisKKyNkZWZpbmUgVUFSVF9HRVRfQ1RTKHgpIGdwaW9fZ2V0X3ZhbHVlKHgtPmN0c19waW4pCisjZGVmaW5lIFVBUlRfU0VUX1JUUyh4KSBncGlvX3NldF92YWx1ZSh4LT5ydHNfcGluLCAxKQorI2RlZmluZSBVQVJUX0NMRUFSX1JUUyh4KSBncGlvX3NldF92YWx1ZSh4LT5ydHNfcGluLCAwKQorI2RlZmluZSBVQVJUX0VOQUJMRV9JTlRTKHgsIHYpIFVBUlRfUFVUX0lFUih4LCB2KQorI2RlZmluZSBVQVJUX0RJU0FCTEVfSU5UUyh4KSBVQVJUX1BVVF9JRVIoeCwgMCkKKworI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fVUFSVDBfQ1RTUlRTKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1VBUlQxX0NUU1JUUykKKyMgZGVmaW5lIENPTkZJR19TRVJJQUxfQkZJTl9DVFNSVFMKKworIyBpZm5kZWYgQ09ORklHX1VBUlQwX0NUU19QSU4KKyMgIGRlZmluZSBDT05GSUdfVUFSVDBfQ1RTX1BJTiAtMQorIyBlbmRpZgorCisjIGlmbmRlZiBDT05GSUdfVUFSVDBfUlRTX1BJTgorIyAgZGVmaW5lIENPTkZJR19VQVJUMF9SVFNfUElOIC0xCisjIGVuZGlmCisKKyMgaWZuZGVmIENPTkZJR19VQVJUMV9DVFNfUElOCisjICBkZWZpbmUgQ09ORklHX1VBUlQxX0NUU19QSU4gLTEKKyMgZW5kaWYKKworIyBpZm5kZWYgQ09ORklHX1VBUlQxX1JUU19QSU4KKyMgIGRlZmluZSBDT05GSUdfVUFSVDFfUlRTX1BJTiAtMQorIyBlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgQkZJTl9VQVJUX1RYX0ZJRk9fU0laRQkyCisKKy8qCisgKiBUaGUgcGluIGNvbmZpZ3VyYXRpb24gaXMgZGlmZmVyZW50IGZyb20gc2NoZW1hdGljCisgKi8KK3N0cnVjdCBiZmluX3NlcmlhbF9wb3J0IHsKKwlzdHJ1Y3QgdWFydF9wb3J0IHBvcnQ7CisJdW5zaWduZWQgaW50IG9sZF9zdGF0dXM7CisJdW5zaWduZWQgaW50IGxzcjsKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fRE1BCisJaW50IHR4X2RvbmU7CisJaW50IHR4X2NvdW50OworCXN0cnVjdCBjaXJjX2J1ZiByeF9kbWFfYnVmOworCXN0cnVjdCB0aW1lcl9saXN0IHJ4X2RtYV90aW1lcjsKKwlpbnQgcnhfZG1hX25yb3dzOworCXVuc2lnbmVkIGludCB0eF9kbWFfY2hhbm5lbDsKKwl1bnNpZ25lZCBpbnQgcnhfZG1hX2NoYW5uZWw7CisJc3RydWN0IHdvcmtfc3RydWN0IHR4X2RtYV93b3JrcXVldWU7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fQ1RTUlRTCisJc3RydWN0IHRpbWVyX2xpc3QgY3RzX3RpbWVyOworCWludCBjdHNfcGluOworCWludCBydHNfcGluOworI2VuZGlmCit9OworCisvKiBUaGUgaGFyZHdhcmUgY2xlYXJzIHRoZSBMU1IgYml0cyB1cG9uIHJlYWQsIHNvIHdlIG5lZWQgdG8gY2FjaGUKKyAqIHNvbWUgb2YgdGhlIG1vcmUgZnVuIGJpdHMgaW4gc29mdHdhcmUgc28gdGhleSBkb24ndCBnZXQgbG9zdAorICogd2hlbiBjaGVja2luZyB0aGUgTFNSIGluIG90aGVyIGNvZGUgcGF0aHMgKFRYKS4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgVUFSVF9HRVRfTFNSKHN0cnVjdCBiZmluX3NlcmlhbF9wb3J0ICp1YXJ0KQoreworCXVuc2lnbmVkIGludCBsc3IgPSBiZmluX3JlYWQxNih1YXJ0LT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfTFNSKTsKKwl1YXJ0LT5sc3IgfD0gKGxzciAmIChCSXxGRXxQRXxPRSkpOworCXJldHVybiBsc3IgfCB1YXJ0LT5sc3I7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBVQVJUX0NMRUFSX0xTUihzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCAqdWFydCkKK3sKKwl1YXJ0LT5sc3IgPSAwOworCWJmaW5fd3JpdGUxNih1YXJ0LT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfTFNSLCAtMSk7Cit9CisKK3N0cnVjdCBiZmluX3NlcmlhbF9yZXMgeworCXVuc2lnbmVkIGxvbmcgdWFydF9iYXNlX2FkZHI7CisJaW50IHVhcnRfaXJxOworI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9ETUEKKwl1bnNpZ25lZCBpbnQgdWFydF90eF9kbWFfY2hhbm5lbDsKKwl1bnNpZ25lZCBpbnQgdWFydF9yeF9kbWFfY2hhbm5lbDsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9DVFNSVFMKKwlpbnQgdWFydF9jdHNfcGluOworCWludCB1YXJ0X3J0c19waW47CisjZW5kaWYKK307CisKK3N0cnVjdCBiZmluX3NlcmlhbF9yZXMgYmZpbl9zZXJpYWxfcmVzb3VyY2VbXSA9IHsKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fVUFSVDAKKwl7CisJIDB4RkZDMDA0MDAsCisJIElSUV9VQVJUMF9SWCwKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fRE1BCisJIENIX1VBUlQwX1RYLAorCSBDSF9VQVJUMF9SWCwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CRklOX1VBUlQwX0NUU1JUUworCSBDT05GSUdfVUFSVDBfQ1RTX1BJTiwKKwkgQ09ORklHX1VBUlQwX1JUU19QSU4sCisjZW5kaWYKKwkgfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9VQVJUMQorCXsKKwkgMHhGRkMwMjAwMCwKKwkgSVJRX1VBUlQxX1JYLAorI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9ETUEKKwkgQ0hfVUFSVDFfVFgsCisJIENIX1VBUlQxX1JYLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGSU5fVUFSVDFfQ1RTUlRTCisJIENPTkZJR19VQVJUMV9DVFNfUElOLAorCSBDT05GSUdfVUFSVDFfUlRTX1BJTiwKKyNlbmRpZgorCSB9LAorI2VuZGlmCit9OworCisjZGVmaW5lIERSSVZFUl9OQU1FICJiZmluLXVhcnQiCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFhMmI5YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaApAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUxOC9ibGFja2Zpbi5oCisgKiBCYXNlZCBvbjoKKyAqIEF1dGhvcjoKKyAqCisgKiBDcmVhdGVkOgorICogRGVzY3JpcHRpb246CisgKgorICogUmV2OgorICoKKyAqIE1vZGlmaWVkOgorICoKKyAqCisgKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9NQUNIX0JMQUNLRklOX0hfCisjZGVmaW5lIF9NQUNIX0JMQUNLRklOX0hfCisKKyNkZWZpbmUgQkY1MThfRkFNSUxZCisKKyNpbmNsdWRlICJiZjUxOC5oIgorI2luY2x1ZGUgIm1lbV9tYXAuaCIKKyNpbmNsdWRlICJkZWZCRjUxMi5oIgorI2luY2x1ZGUgImFub21hbHkuaCIKKworI2lmIGRlZmluZWQoQ09ORklHX0JGNTE4KQorI2luY2x1ZGUgImRlZkJGNTE4LmgiCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0JGNTE2KQorI2luY2x1ZGUgImRlZkJGNTE2LmgiCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0JGNTE0KQorI2luY2x1ZGUgImRlZkJGNTE0LmgiCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0JGNTEyKQorI2luY2x1ZGUgImRlZkJGNTEyLmgiCisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9fQVNTRU1CTFlfXykKKyNpbmNsdWRlICJjZGVmQkY1MTIuaCIKKworI2lmIGRlZmluZWQoQ09ORklHX0JGNTE4KQorI2luY2x1ZGUgImNkZWZCRjUxOC5oIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19CRjUxNikKKyNpbmNsdWRlICJjZGVmQkY1MTYuaCIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQkY1MTQpCisjaW5jbHVkZSAiY2RlZkJGNTE0LmgiCisjZW5kaWYKKyNlbmRpZgorCisvKiBVQVJUX0lJUiBSZWdpc3RlciAqLworI2RlZmluZSBTVEFUVVMoeCkJKCh4IDw8IDEpICYgMHgwNikKKyNkZWZpbmUgU1RBVFVTX1AxCTB4MDIKKyNkZWZpbmUgU1RBVFVTX1AwCTB4MDEKKworI2RlZmluZSBCRklOX1VBUlRfTlJfUE9SVFMJMgorCisjZGVmaW5lIE9GRlNFVF9USFIgICAgICAgICAgICAgIDB4MDAJLyogVHJhbnNtaXQgSG9sZGluZyByZWdpc3RlciAgICAgICAgICAgICovCisjZGVmaW5lIE9GRlNFVF9SQlIgICAgICAgICAgICAgIDB4MDAJLyogUmVjZWl2ZSBCdWZmZXIgcmVnaXN0ZXIgICAgICAgICAgICAgICovCisjZGVmaW5lIE9GRlNFVF9ETEwgICAgICAgICAgICAgIDB4MDAJLyogRGl2aXNvciBMYXRjaCAoTG93LUJ5dGUpICAgICAgICAgICAgICovCisjZGVmaW5lIE9GRlNFVF9JRVIgICAgICAgICAgICAgIDB4MDQJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAgICAgICAgICAgICovCisjZGVmaW5lIE9GRlNFVF9ETEggICAgICAgICAgICAgIDB4MDQJLyogRGl2aXNvciBMYXRjaCAoSGlnaC1CeXRlKSAgICAgICAgICAgICovCisjZGVmaW5lIE9GRlNFVF9JSVIgICAgICAgICAgICAgIDB4MDgJLyogSW50ZXJydXB0IElkZW50aWZpY2F0aW9uIFJlZ2lzdGVyICAgICovCisjZGVmaW5lIE9GRlNFVF9MQ1IgICAgICAgICAgICAgIDB4MEMJLyogTGluZSBDb250cm9sIFJlZ2lzdGVyICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE9GRlNFVF9NQ1IgICAgICAgICAgICAgIDB4MTAJLyogTW9kZW0gQ29udHJvbCBSZWdpc3RlciAgICAgICAgICAgICAgICovCisjZGVmaW5lIE9GRlNFVF9MU1IgICAgICAgICAgICAgIDB4MTQJLyogTGluZSBTdGF0dXMgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE9GRlNFVF9NU1IgICAgICAgICAgICAgIDB4MTgJLyogTW9kZW0gU3RhdHVzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE9GRlNFVF9TQ1IgICAgICAgICAgICAgIDB4MUMJLyogU0NSIFNjcmF0Y2ggUmVnaXN0ZXIgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE9GRlNFVF9HQ1RMICAgICAgICAgICAgIDB4MjQJLyogR2xvYmFsIENvbnRyb2wgUmVnaXN0ZXIgICAgICAgICAgICAgICovCisKKy8qIERQTUMqLworI2RlZmluZSBiZmluX3JlYWRfU1RPUENLX09GRigpIGJmaW5fcmVhZF9TVE9QQ0soKQorI2RlZmluZSBiZmluX3dyaXRlX1NUT1BDS19PRkYodmFsKSBiZmluX3dyaXRlX1NUT1BDSyh2YWwpCisjZGVmaW5lIFNUT1BDS19PRkYgU1RPUENLCisKKy8qIFBMTF9ESVYgTWFza3MJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgQ0NMS19ESVYxIENTRUxfRElWMQkvKiAgICAgICAgICBDQ0xLID0gVkNPIC8gMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDQ0xLX0RJVjIgQ1NFTF9ESVYyCS8qICAgICAgICAgIENDTEsgPSBWQ08gLyAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENDTEtfRElWNCBDU0VMX0RJVjQJLyogICAgICAgICAgQ0NMSyA9IFZDTyAvIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0NMS19ESVY4IENTRUxfRElWOAkvKiAgICAgICAgICBDQ0xLID0gVkNPIC8gOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvY2RlZkJGNTEyLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2NkZWZCRjUxMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMGMxM2MKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2NkZWZCRjUxMi5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MTgvY2RlZmJmNTEyLmgKKyAqIEJhc2VkIG9uOgorICogQXV0aG9yOgorICoKKyAqIENyZWF0ZWQ6CisgKiBEZXNjcmlwdGlvbjogIHN5c3RlbSBtbXIgcmVnaXN0ZXIgbWFwCisgKgorICogUmV2OgorICoKKyAqIE1vZGlmaWVkOgorICoKKyAqCisgKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9DREVGX0JGNTEyX0gKKyNkZWZpbmUgX0NERUZfQkY1MTJfSAorCisvKiBpbmNsdWRlIGFsbCBDb3JlIHJlZ2lzdGVycyBhbmQgYml0IGRlZmluaXRpb25zICovCisjaW5jbHVkZSAiZGVmQkY1MTIuaCIKKworLyogaW5jbHVkZSBjb3JlIHNwZWNpZmljIHJlZ2lzdGVyIHBvaW50ZXIgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxhc20vY2RlZl9MUEJsYWNrZmluLmg+CisKKy8qIFNZU1RFTSAmIE1NUiBBRERSRVNTIERFRklOSVRJT05TIEZPUiBBRFNQLUJGNTEyICovCisKKy8qIGluY2x1ZGUgY2RlZkJGNTF4X2Jhc2UuaCBmb3IgdGhlIHNldCBvZiAjZGVmaW5lcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIEFEU1AtQkY1MXggcHJvY2Vzc29ycyAqLworI2luY2x1ZGUgImNkZWZCRjUxeF9iYXNlLmgiCisKKyNlbmRpZiAvKiBfQ0RFRl9CRjUxMl9IICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2NkZWZCRjUxNC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MTQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTIxZTE3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MTQuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTE4L2NkZWZiZjUxNC5oCisgKiBCYXNlZCBvbjoKKyAqIEF1dGhvcjoKKyAqCisgKiBDcmVhdGVkOgorICogRGVzY3JpcHRpb246ICBzeXN0ZW0gbW1yIHJlZ2lzdGVyIG1hcAorICoKKyAqIFJldjoKKyAqCisgKiBNb2RpZmllZDoKKyAqCisgKgorICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAqIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfQ0RFRl9CRjUxNF9ICisjZGVmaW5lIF9DREVGX0JGNTE0X0gKKworLyogaW5jbHVkZSBhbGwgQ29yZSByZWdpc3RlcnMgYW5kIGJpdCBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgImRlZkJGNTE0LmgiCisKKy8qIGluY2x1ZGUgY29yZSBzcGVjaWZpYyByZWdpc3RlciBwb2ludGVyIGRlZmluaXRpb25zICovCisjaW5jbHVkZSA8YXNtL2NkZWZfTFBCbGFja2Zpbi5oPgorCisvKiBTWVNURU0gJiBNTVIgQUREUkVTUyBERUZJTklUSU9OUyBGT1IgQURTUC1CRjUxNCAqLworCisvKiBpbmNsdWRlIGNkZWZCRjUxeF9iYXNlLmggZm9yIHRoZSBzZXQgb2YgI2RlZmluZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBBRFNQLUJGNTF4IHByb2Nlc3NvcnMgKi8KKyNpbmNsdWRlICJjZGVmQkY1MXhfYmFzZS5oIgorCisvKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgI2RlZmluZXMgbmVlZGVkIGJ5IEFEU1AtQkY1MTQgdGhhdCBhcmUgbm90IGluIHRoZSBjb21tb24gaGVhZGVyICovCisKKyNlbmRpZiAvKiBfQ0RFRl9CRjUxNF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2NkZWZCRjUxNi5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MTYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTI2Y2NmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MTYuaApAQCAtMCwwICsxLDIxMyBAQAorLyoKKyAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUxOC9jZGVmYmY1MTYuaAorICogQmFzZWQgb246CisgKiBBdXRob3I6CisgKgorICogQ3JlYXRlZDoKKyAqIERlc2NyaXB0aW9uOiAgc3lzdGVtIG1tciByZWdpc3RlciBtYXAKKyAqCisgKiBSZXY6CisgKgorICogTW9kaWZpZWQ6CisgKgorICoKKyAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX0NERUZfQkY1MTZfSAorI2RlZmluZSBfQ0RFRl9CRjUxNl9ICisKKy8qIGluY2x1ZGUgYWxsIENvcmUgcmVnaXN0ZXJzIGFuZCBiaXQgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlICJkZWZCRjUxNi5oIgorCisvKiBpbmNsdWRlIGNvcmUgc3BlY2lmaWMgcmVnaXN0ZXIgcG9pbnRlciBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPGFzbS9jZGVmX0xQQmxhY2tmaW4uaD4KKworLyogU1lTVEVNICYgTU1SIEFERFJFU1MgREVGSU5JVElPTlMgRk9SIEFEU1AtQkY1MTYgKi8KKworLyogaW5jbHVkZSBjZGVmQkY1MXhfYmFzZS5oIGZvciB0aGUgc2V0IG9mICNkZWZpbmVzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgQURTUC1CRjUxeCBwcm9jZXNzb3JzICovCisjaW5jbHVkZSAiY2RlZkJGNTF4X2Jhc2UuaCIKKworLyogVGhlIGZvbGxvd2luZyBhcmUgdGhlICNkZWZpbmVzIG5lZWRlZCBieSBBRFNQLUJGNTE2IHRoYXQgYXJlIG5vdCBpbiB0aGUgY29tbW9uIGhlYWRlciAqLworCisvKiAxMC8xMDAgRXRoZXJuZXQgQ29udHJvbGxlcgkoMHhGRkMwMzAwMCAtIDB4RkZDMDMxRkYpICovCisKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfT1BNT0RFKCkJCQliZmluX3JlYWQzMihFTUFDX09QTU9ERSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX09QTU9ERSh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19PUE1PREUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfQUREUkxPKCkJCQliZmluX3JlYWQzMihFTUFDX0FERFJMTykKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX0FERFJMTyh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19BRERSTE8sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfQUREUkhJKCkJCQliZmluX3JlYWQzMihFTUFDX0FERFJISSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX0FERFJISSh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19BRERSSEksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfSEFTSExPKCkJCQliZmluX3JlYWQzMihFTUFDX0hBU0hMTykKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX0hBU0hMTyh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19IQVNITE8sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfSEFTSEhJKCkJCQliZmluX3JlYWQzMihFTUFDX0hBU0hISSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX0hBU0hISSh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19IQVNISEksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfU1RBQUREKCkJCQliZmluX3JlYWQzMihFTUFDX1NUQUFERCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1NUQUFERCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19TVEFBREQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfU1RBREFUKCkJCQliZmluX3JlYWQzMihFTUFDX1NUQURBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1NUQURBVCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19TVEFEQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfRkxDKCkJCQliZmluX3JlYWQzMihFTUFDX0ZMQykKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX0ZMQyh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19GTEMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVkxBTjEoKQkJCWJmaW5fcmVhZDMyKEVNQUNfVkxBTjEpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19WTEFOMSh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19WTEFOMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19WTEFOMigpCQkJYmZpbl9yZWFkMzIoRU1BQ19WTEFOMikKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1ZMQU4yKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1ZMQU4yLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1dLVVBfQ1RMKCkJCWJmaW5fcmVhZDMyKEVNQUNfV0tVUF9DVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19XS1VQX0NUTCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19XS1VQX0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19XS1VQX0ZGTVNLMCgpCQliZmluX3JlYWQzMihFTUFDX1dLVVBfRkZNU0swKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfV0tVUF9GRk1TSzAodmFsKQliZmluX3dyaXRlMzIoRU1BQ19XS1VQX0ZGTVNLMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19XS1VQX0ZGTVNLMSgpCQliZmluX3JlYWQzMihFTUFDX1dLVVBfRkZNU0sxKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfV0tVUF9GRk1TSzEodmFsKQliZmluX3dyaXRlMzIoRU1BQ19XS1VQX0ZGTVNLMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19XS1VQX0ZGTVNLMigpCQliZmluX3JlYWQzMihFTUFDX1dLVVBfRkZNU0syKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfV0tVUF9GRk1TSzIodmFsKQliZmluX3dyaXRlMzIoRU1BQ19XS1VQX0ZGTVNLMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19XS1VQX0ZGTVNLMygpCQliZmluX3JlYWQzMihFTUFDX1dLVVBfRkZNU0szKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfV0tVUF9GRk1TSzModmFsKQliZmluX3dyaXRlMzIoRU1BQ19XS1VQX0ZGTVNLMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19XS1VQX0ZGQ01EKCkJCWJmaW5fcmVhZDMyKEVNQUNfV0tVUF9GRkNNRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1dLVVBfRkZDTUQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfV0tVUF9GRkNNRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19XS1VQX0ZGT0ZGKCkJCWJmaW5fcmVhZDMyKEVNQUNfV0tVUF9GRk9GRikKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1dLVVBfRkZPRkYodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfV0tVUF9GRk9GRiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19XS1VQX0ZGQ1JDMCgpCQliZmluX3JlYWQzMihFTUFDX1dLVVBfRkZDUkMwKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfV0tVUF9GRkNSQzAodmFsKQliZmluX3dyaXRlMzIoRU1BQ19XS1VQX0ZGQ1JDMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19XS1VQX0ZGQ1JDMSgpCQliZmluX3JlYWQzMihFTUFDX1dLVVBfRkZDUkMxKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfV0tVUF9GRkNSQzEodmFsKQliZmluX3dyaXRlMzIoRU1BQ19XS1VQX0ZGQ1JDMSwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1NZU0NUTCgpCQkJYmZpbl9yZWFkMzIoRU1BQ19TWVNDVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19TWVNDVEwodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfU1lTQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1NZU1RBVCgpCQkJYmZpbl9yZWFkMzIoRU1BQ19TWVNUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19TWVNUQVQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfU1lTVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYX1NUQVQoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWF9TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhfU1RBVCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWF9TVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYX1NUS1koKQkJYmZpbl9yZWFkMzIoRU1BQ19SWF9TVEtZKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhfU1RLWSh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWF9TVEtZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYX0lSUUUoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWF9JUlFFKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhfSVJRRSh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWF9JUlFFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYX1NUQVQoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWF9TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhfU1RBVCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWF9TVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYX1NUS1koKQkJYmZpbl9yZWFkMzIoRU1BQ19UWF9TVEtZKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhfU1RLWSh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWF9TVEtZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYX0lSUUUoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWF9JUlFFKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhfSVJRRSh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWF9JUlFFLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfTU1DX0NUTCgpCQliZmluX3JlYWQzMihFTUFDX01NQ19DVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19NTUNfQ1RMKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX01NQ19DVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfTU1DX1JJUlFTKCkJCWJmaW5fcmVhZDMyKEVNQUNfTU1DX1JJUlFTKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfTU1DX1JJUlFTKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX01NQ19SSVJRUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19NTUNfUklSUUUoKQkJYmZpbl9yZWFkMzIoRU1BQ19NTUNfUklSUUUpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19NTUNfUklSUUUodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfTU1DX1JJUlFFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX01NQ19USVJRUygpCQliZmluX3JlYWQzMihFTUFDX01NQ19USVJRUykKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX01NQ19USVJRUyh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19NTUNfVElSUVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfTU1DX1RJUlFFKCkJCWJmaW5fcmVhZDMyKEVNQUNfTU1DX1RJUlFFKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfTU1DX1RJUlFFKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX01NQ19USVJRRSwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19PSygpCQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfT0spCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfT0sodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX09LLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19GQ1MoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfRkNTKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX0ZDUyh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfRkNTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19BTElHTigpCQliZmluX3JlYWQzMihFTUFDX1JYQ19BTElHTikKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19BTElHTih2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfQUxJR04sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX09DVEVUKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX09DVEVUKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX09DVEVUKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19PQ1RFVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfRE1BT1ZGKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX0RNQU9WRikKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19ETUFPVkYodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX0RNQU9WRiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfVU5JQ1NUKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX1VOSUNTVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19VTklDU1QodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX1VOSUNTVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfTVVMVEkoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfTVVMVEkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfTVVMVEkodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX01VTFRJLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19CUk9BRCgpCQliZmluX3JlYWQzMihFTUFDX1JYQ19CUk9BRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19CUk9BRCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfQlJPQUQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX0xORVJSSSgpCQliZmluX3JlYWQzMihFTUFDX1JYQ19MTkVSUkkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfTE5FUlJJKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19MTkVSUkksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX0xORVJSTygpCQliZmluX3JlYWQzMihFTUFDX1JYQ19MTkVSUk8pCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfTE5FUlJPKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19MTkVSUk8sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX0xPTkcoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfTE9ORykKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19MT05HKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19MT05HLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19NQUNDVEwoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfTUFDQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX01BQ0NUTCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfTUFDQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19PUENPREUoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfT1BDT0RFKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX09QQ09ERSh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfT1BDT0RFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19QQVVTRSgpCQliZmluX3JlYWQzMihFTUFDX1JYQ19QQVVTRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19QQVVTRSh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfUEFVU0UsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX0FMTEZSTSgpCQliZmluX3JlYWQzMihFTUFDX1JYQ19BTExGUk0pCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfQUxMRlJNKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19BTExGUk0sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX0FMTE9DVCgpCQliZmluX3JlYWQzMihFTUFDX1JYQ19BTExPQ1QpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfQUxMT0NUKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19BTExPQ1QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX1RZUEVEKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX1RZUEVEKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX1RZUEVEKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19UWVBFRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfU0hPUlQoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfU0hPUlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfU0hPUlQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX1NIT1JULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19FUTY0KCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX0VRNjQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfRVE2NCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfRVE2NCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfTFQxMjgoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfTFQxMjgpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfTFQxMjgodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX0xUMTI4LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19MVDI1NigpCQliZmluX3JlYWQzMihFTUFDX1JYQ19MVDI1NikKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19MVDI1Nih2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfTFQyNTYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX0xUNTEyKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX0xUNTEyKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX0xUNTEyKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19MVDUxMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfTFQxMDI0KCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX0xUMTAyNCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19MVDEwMjQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX0xUMTAyNCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfR0UxMDI0KCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX0dFMTAyNCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19HRTEwMjQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX0dFMTAyNCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19PSygpCQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfT0spCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfT0sodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX09LLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ18xQ09MKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDXzFDT0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfMUNPTCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfMUNPTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfR1QxQ09MKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX0dUMUNPTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19HVDFDT0wodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX0dUMUNPTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfT0NURVQoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfT0NURVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfT0NURVQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX09DVEVULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19ERUZFUigpCQliZmluX3JlYWQzMihFTUFDX1RYQ19ERUZFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19ERUZFUih2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfREVGRVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX0xBVEVDTCgpCQliZmluX3JlYWQzMihFTUFDX1RYQ19MQVRFQ0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfTEFURUNMKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19MQVRFQ0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX1hTX0NPTCgpCQliZmluX3JlYWQzMihFTUFDX1RYQ19YU19DT0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfWFNfQ09MKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19YU19DT0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX0RNQVVORCgpCQliZmluX3JlYWQzMihFTUFDX1RYQ19ETUFVTkQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfRE1BVU5EKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19ETUFVTkQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX0NSU0VSUigpCQliZmluX3JlYWQzMihFTUFDX1RYQ19DUlNFUlIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfQ1JTRVJSKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19DUlNFUlIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX1VOSUNTVCgpCQliZmluX3JlYWQzMihFTUFDX1RYQ19VTklDU1QpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfVU5JQ1NUKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19VTklDU1QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX01VTFRJKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX01VTFRJKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX01VTFRJKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19NVUxUSSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfQlJPQUQoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfQlJPQUQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfQlJPQUQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX0JST0FELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19YU19ERlIoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfWFNfREZSKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX1hTX0RGUih2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfWFNfREZSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19NQUNDVEwoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfTUFDQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX01BQ0NUTCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfTUFDQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19BTExGUk0oKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfQUxMRlJNKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX0FMTEZSTSh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfQUxMRlJNLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19BTExPQ1QoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfQUxMT0NUKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX0FMTE9DVCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfQUxMT0NULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19FUTY0KCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX0VRNjQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfRVE2NCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfRVE2NCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfTFQxMjgoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfTFQxMjgpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfTFQxMjgodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX0xUMTI4LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19MVDI1NigpCQliZmluX3JlYWQzMihFTUFDX1RYQ19MVDI1NikKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19MVDI1Nih2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfTFQyNTYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX0xUNTEyKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX0xUNTEyKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX0xUNTEyKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19MVDUxMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfTFQxMDI0KCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX0xUMTAyNCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19MVDEwMjQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX0xUMTAyNCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfR0UxMDI0KCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX0dFMTAyNCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19HRTEwMjQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX0dFMTAyNCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfQUJPUlQoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfQUJPUlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfQUJPUlQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX0FCT1JULCB2YWwpCisKKyNlbmRpZiAvKiBfQ0RFRl9CRjUxNl9IICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2NkZWZCRjUxOC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MTguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWZiMzcwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MTguaApAQCAtMCwwICsxLDI4MiBAQAorLyoKKyAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUxOC9jZGVmYmY1MTguaAorICogQmFzZWQgb246CisgKiBBdXRob3I6CisgKgorICogQ3JlYXRlZDoKKyAqIERlc2NyaXB0aW9uOiAgc3lzdGVtIG1tciByZWdpc3RlciBtYXAKKyAqCisgKiBSZXY6CisgKgorICogTW9kaWZpZWQ6CisgKgorICoKKyAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX0NERUZfQkY1MThfSAorI2RlZmluZSBfQ0RFRl9CRjUxOF9ICisKKy8qIGluY2x1ZGUgYWxsIENvcmUgcmVnaXN0ZXJzIGFuZCBiaXQgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlICJkZWZCRjUxOC5oIgorCisvKiBpbmNsdWRlIGNvcmUgc3BlY2lmaWMgcmVnaXN0ZXIgcG9pbnRlciBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPGFzbS9jZGVmX0xQQmxhY2tmaW4uaD4KKworLyogU1lTVEVNICYgTU1SIEFERFJFU1MgREVGSU5JVElPTlMgRk9SIEFEU1AtQkY1MTggKi8KKworLyogaW5jbHVkZSBjZGVmQkY1MXhfYmFzZS5oIGZvciB0aGUgc2V0IG9mICNkZWZpbmVzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgQURTUC1CRjUxeCBwcm9jZXNzb3JzICovCisjaW5jbHVkZSAiY2RlZkJGNTF4X2Jhc2UuaCIKKworLyogVGhlIGZvbGxvd2luZyBhcmUgdGhlICNkZWZpbmVzIG5lZWRlZCBieSBBRFNQLUJGNTE4IHRoYXQgYXJlIG5vdCBpbiB0aGUgY29tbW9uIGhlYWRlciAqLworCisKKy8qIDEwLzEwMCBFdGhlcm5ldCBDb250cm9sbGVyCSgweEZGQzAzMDAwIC0gMHhGRkMwMzFGRikgKi8KKworI2RlZmluZSBiZmluX3JlYWRfRU1BQ19PUE1PREUoKQkJCWJmaW5fcmVhZDMyKEVNQUNfT1BNT0RFKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfT1BNT0RFKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX09QTU9ERSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19BRERSTE8oKQkJCWJmaW5fcmVhZDMyKEVNQUNfQUREUkxPKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfQUREUkxPKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX0FERFJMTywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19BRERSSEkoKQkJCWJmaW5fcmVhZDMyKEVNQUNfQUREUkhJKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfQUREUkhJKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX0FERFJISSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19IQVNITE8oKQkJCWJmaW5fcmVhZDMyKEVNQUNfSEFTSExPKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfSEFTSExPKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX0hBU0hMTywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19IQVNISEkoKQkJCWJmaW5fcmVhZDMyKEVNQUNfSEFTSEhJKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfSEFTSEhJKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX0hBU0hISSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19TVEFBREQoKQkJCWJmaW5fcmVhZDMyKEVNQUNfU1RBQUREKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfU1RBQUREKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1NUQUFERCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19TVEFEQVQoKQkJCWJmaW5fcmVhZDMyKEVNQUNfU1RBREFUKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfU1RBREFUKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1NUQURBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19GTEMoKQkJCWJmaW5fcmVhZDMyKEVNQUNfRkxDKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfRkxDKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX0ZMQywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19WTEFOMSgpCQkJYmZpbl9yZWFkMzIoRU1BQ19WTEFOMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1ZMQU4xKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1ZMQU4xLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1ZMQU4yKCkJCQliZmluX3JlYWQzMihFTUFDX1ZMQU4yKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVkxBTjIodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVkxBTjIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfV0tVUF9DVEwoKQkJYmZpbl9yZWFkMzIoRU1BQ19XS1VQX0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1dLVVBfQ1RMKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1dLVVBfQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1dLVVBfRkZNU0swKCkJCWJmaW5fcmVhZDMyKEVNQUNfV0tVUF9GRk1TSzApCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19XS1VQX0ZGTVNLMCh2YWwpCWJmaW5fd3JpdGUzMihFTUFDX1dLVVBfRkZNU0swLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1dLVVBfRkZNU0sxKCkJCWJmaW5fcmVhZDMyKEVNQUNfV0tVUF9GRk1TSzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19XS1VQX0ZGTVNLMSh2YWwpCWJmaW5fd3JpdGUzMihFTUFDX1dLVVBfRkZNU0sxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1dLVVBfRkZNU0syKCkJCWJmaW5fcmVhZDMyKEVNQUNfV0tVUF9GRk1TSzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19XS1VQX0ZGTVNLMih2YWwpCWJmaW5fd3JpdGUzMihFTUFDX1dLVVBfRkZNU0syLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1dLVVBfRkZNU0szKCkJCWJmaW5fcmVhZDMyKEVNQUNfV0tVUF9GRk1TSzMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19XS1VQX0ZGTVNLMyh2YWwpCWJmaW5fd3JpdGUzMihFTUFDX1dLVVBfRkZNU0szLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1dLVVBfRkZDTUQoKQkJYmZpbl9yZWFkMzIoRU1BQ19XS1VQX0ZGQ01EKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfV0tVUF9GRkNNRCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19XS1VQX0ZGQ01ELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1dLVVBfRkZPRkYoKQkJYmZpbl9yZWFkMzIoRU1BQ19XS1VQX0ZGT0ZGKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfV0tVUF9GRk9GRih2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19XS1VQX0ZGT0ZGLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1dLVVBfRkZDUkMwKCkJCWJmaW5fcmVhZDMyKEVNQUNfV0tVUF9GRkNSQzApCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19XS1VQX0ZGQ1JDMCh2YWwpCWJmaW5fd3JpdGUzMihFTUFDX1dLVVBfRkZDUkMwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1dLVVBfRkZDUkMxKCkJCWJmaW5fcmVhZDMyKEVNQUNfV0tVUF9GRkNSQzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19XS1VQX0ZGQ1JDMSh2YWwpCWJmaW5fd3JpdGUzMihFTUFDX1dLVVBfRkZDUkMxLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfU1lTQ1RMKCkJCQliZmluX3JlYWQzMihFTUFDX1NZU0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1NZU0NUTCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19TWVNDVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfU1lTVEFUKCkJCQliZmluX3JlYWQzMihFTUFDX1NZU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1NZU1RBVCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19TWVNUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhfU1RBVCgpCQliZmluX3JlYWQzMihFTUFDX1JYX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWF9TVEFUKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhfU1RLWSgpCQliZmluX3JlYWQzMihFTUFDX1JYX1NUS1kpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWF9TVEtZKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYX1NUS1ksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhfSVJRRSgpCQliZmluX3JlYWQzMihFTUFDX1JYX0lSUUUpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWF9JUlFFKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYX0lSUUUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhfU1RBVCgpCQliZmluX3JlYWQzMihFTUFDX1RYX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWF9TVEFUKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhfU1RLWSgpCQliZmluX3JlYWQzMihFTUFDX1RYX1NUS1kpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWF9TVEtZKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYX1NUS1ksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhfSVJRRSgpCQliZmluX3JlYWQzMihFTUFDX1RYX0lSUUUpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWF9JUlFFKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYX0lSUUUsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfRU1BQ19NTUNfQ1RMKCkJCWJmaW5fcmVhZDMyKEVNQUNfTU1DX0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX01NQ19DVEwodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfTU1DX0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19NTUNfUklSUVMoKQkJYmZpbl9yZWFkMzIoRU1BQ19NTUNfUklSUVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19NTUNfUklSUVModmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfTU1DX1JJUlFTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX01NQ19SSVJRRSgpCQliZmluX3JlYWQzMihFTUFDX01NQ19SSVJRRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX01NQ19SSVJRRSh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19NTUNfUklSUUUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfTU1DX1RJUlFTKCkJCWJmaW5fcmVhZDMyKEVNQUNfTU1DX1RJUlFTKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfTU1DX1RJUlFTKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX01NQ19USVJRUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19NTUNfVElSUUUoKQkJYmZpbl9yZWFkMzIoRU1BQ19NTUNfVElSUUUpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19NTUNfVElSUUUodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfTU1DX1RJUlFFLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX09LKCkJCQliZmluX3JlYWQzMihFTUFDX1JYQ19PSykKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19PSyh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfT0ssIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX0ZDUygpCQliZmluX3JlYWQzMihFTUFDX1JYQ19GQ1MpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfRkNTKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19GQ1MsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX0FMSUdOKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX0FMSUdOKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX0FMSUdOKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19BTElHTiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfT0NURVQoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfT0NURVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfT0NURVQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX09DVEVULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19ETUFPVkYoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfRE1BT1ZGKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX0RNQU9WRih2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfRE1BT1ZGLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19VTklDU1QoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfVU5JQ1NUKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX1VOSUNTVCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfVU5JQ1NULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19NVUxUSSgpCQliZmluX3JlYWQzMihFTUFDX1JYQ19NVUxUSSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19NVUxUSSh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfTVVMVEksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX0JST0FEKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX0JST0FEKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX0JST0FEKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19CUk9BRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfTE5FUlJJKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX0xORVJSSSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19MTkVSUkkodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX0xORVJSSSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfTE5FUlJPKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX0xORVJSTykKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19MTkVSUk8odmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX0xORVJSTywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfTE9ORygpCQliZmluX3JlYWQzMihFTUFDX1JYQ19MT05HKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX0xPTkcodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX0xPTkcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX01BQ0NUTCgpCQliZmluX3JlYWQzMihFTUFDX1JYQ19NQUNDVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfTUFDQ1RMKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19NQUNDVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX09QQ09ERSgpCQliZmluX3JlYWQzMihFTUFDX1JYQ19PUENPREUpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfT1BDT0RFKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19PUENPREUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX1BBVVNFKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX1BBVVNFKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX1BBVVNFKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19QQVVTRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfQUxMRlJNKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX0FMTEZSTSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19BTExGUk0odmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX0FMTEZSTSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfQUxMT0NUKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX0FMTE9DVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19BTExPQ1QodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX0FMTE9DVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfVFlQRUQoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfVFlQRUQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfVFlQRUQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX1RZUEVELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19TSE9SVCgpCQliZmluX3JlYWQzMihFTUFDX1JYQ19TSE9SVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19TSE9SVCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfU0hPUlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX0VRNjQoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfRVE2NCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19FUTY0KHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19FUTY0LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19MVDEyOCgpCQliZmluX3JlYWQzMihFTUFDX1JYQ19MVDEyOCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19MVDEyOCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfTFQxMjgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX0xUMjU2KCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX0xUMjU2KQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX0xUMjU2KHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19MVDI1NiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfTFQ1MTIoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfTFQ1MTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfTFQ1MTIodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX0xUNTEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19MVDEwMjQoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfTFQxMDI0KQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX0xUMTAyNCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfTFQxMDI0LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19HRTEwMjQoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfR0UxMDI0KQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX0dFMTAyNCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfR0UxMDI0LCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX09LKCkJCQliZmluX3JlYWQzMihFTUFDX1RYQ19PSykKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19PSyh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfT0ssIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDXzFDT0woKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfMUNPTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ18xQ09MKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ18xQ09MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19HVDFDT0woKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfR1QxQ09MKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX0dUMUNPTCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfR1QxQ09MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19PQ1RFVCgpCQliZmluX3JlYWQzMihFTUFDX1RYQ19PQ1RFVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19PQ1RFVCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfT0NURVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX0RFRkVSKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX0RFRkVSKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX0RFRkVSKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19ERUZFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfTEFURUNMKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX0xBVEVDTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19MQVRFQ0wodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX0xBVEVDTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfWFNfQ09MKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX1hTX0NPTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19YU19DT0wodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX1hTX0NPTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfRE1BVU5EKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX0RNQVVORCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19ETUFVTkQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX0RNQVVORCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfQ1JTRVJSKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX0NSU0VSUikKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19DUlNFUlIodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX0NSU0VSUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfVU5JQ1NUKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX1VOSUNTVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19VTklDU1QodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX1VOSUNTVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfTVVMVEkoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfTVVMVEkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfTVVMVEkodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX01VTFRJLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19CUk9BRCgpCQliZmluX3JlYWQzMihFTUFDX1RYQ19CUk9BRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19CUk9BRCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfQlJPQUQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX1hTX0RGUigpCQliZmluX3JlYWQzMihFTUFDX1RYQ19YU19ERlIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfWFNfREZSKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19YU19ERlIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX01BQ0NUTCgpCQliZmluX3JlYWQzMihFTUFDX1RYQ19NQUNDVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfTUFDQ1RMKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19NQUNDVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX0FMTEZSTSgpCQliZmluX3JlYWQzMihFTUFDX1RYQ19BTExGUk0pCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfQUxMRlJNKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19BTExGUk0sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX0FMTE9DVCgpCQliZmluX3JlYWQzMihFTUFDX1RYQ19BTExPQ1QpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfQUxMT0NUKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19BTExPQ1QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX0VRNjQoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfRVE2NCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19FUTY0KHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19FUTY0LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19MVDEyOCgpCQliZmluX3JlYWQzMihFTUFDX1RYQ19MVDEyOCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19MVDEyOCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfTFQxMjgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX0xUMjU2KCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX0xUMjU2KQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX0xUMjU2KHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19MVDI1NiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfTFQ1MTIoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfTFQ1MTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfTFQ1MTIodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX0xUNTEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19MVDEwMjQoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfTFQxMDI0KQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX0xUMTAyNCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfTFQxMDI0LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19HRTEwMjQoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfR0UxMDI0KQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX0dFMTAyNCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfR0UxMDI0LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19BQk9SVCgpCQliZmluX3JlYWQzMihFTUFDX1RYQ19BQk9SVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19BQk9SVCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfQUJPUlQsIHZhbCkKKworLyogUmVtb3ZhYmxlIFN0b3JhZ2UgSW50ZXJmYWNlIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIGJmaW5fcmVhZF9SU0lfUFdSX0NUTCgpICAgICAgICBiZmluX3JlYWQxNihSU0lfUFdSX0NPTlRST0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlNJX1BXUl9DVEwodmFsKSAgICBiZmluX3dyaXRlMTYoUlNJX1BXUl9DT05UUk9MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SU0lfQ0xLX0NUTCgpCSAgICAgICBiZmluX3JlYWQxNihSU0lfQ0xLX0NPTlRST0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlNJX0NMS19DVEwodmFsKSAgICBiZmluX3dyaXRlMTYoUlNJX0NMS19DT05UUk9MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SU0lfQVJHVU1FTlQoKSAgICAgICBiZmluX3JlYWQzMihSU0lfQVJHVU1FTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlNJX0FSR1VNRU5UKHZhbCkgICBiZmluX3dyaXRlMzIoUlNJX0FSR1VNRU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SU0lfQ09NTUFORCgpICAgICAgICBiZmluX3JlYWQxNihSU0lfQ09NTUFORCkKKyNkZWZpbmUgYmZpbl93cml0ZV9SU0lfQ09NTUFORCh2YWwpICAgIGJmaW5fd3JpdGUxNihSU0lfQ09NTUFORCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlNJX1JFU1BfQ01EKCkgICAgICAgYmZpbl9yZWFkMTYoUlNJX1JFU1BfQ01EKQorI2RlZmluZSBiZmluX3dyaXRlX1JTSV9SRVNQX0NNRCh2YWwpICAgYmZpbl93cml0ZTE2KFJTSV9SRVNQX0NNRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlNJX1JFU1BPTlNFMCgpICAgICAgYmZpbl9yZWFkMzIoUlNJX1JFU1BPTlNFMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9SU0lfUkVTUE9OU0UwKHZhbCkgIGJmaW5fd3JpdGUzMihSU0lfUkVTUE9OU0UwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SU0lfUkVTUE9OU0UxKCkgICAgICBiZmluX3JlYWQzMihSU0lfUkVTUE9OU0UxKQorI2RlZmluZSBiZmluX3dyaXRlX1JTSV9SRVNQT05TRTEodmFsKSAgYmZpbl93cml0ZTMyKFJTSV9SRVNQT05TRTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JTSV9SRVNQT05TRTIoKSAgICAgIGJmaW5fcmVhZDMyKFJTSV9SRVNQT05TRTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlNJX1JFU1BPTlNFMih2YWwpICBiZmluX3dyaXRlMzIoUlNJX1JFU1BPTlNFMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlNJX1JFU1BPTlNFMygpICAgICAgYmZpbl9yZWFkMzIoUlNJX1JFU1BPTlNFMykKKyNkZWZpbmUgYmZpbl93cml0ZV9SU0lfUkVTUE9OU0UzKHZhbCkgIGJmaW5fd3JpdGUzMihSU0lfUkVTUE9OU0UzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SU0lfREFUQV9USU1FUigpICAgICBiZmluX3JlYWQzMihSU0lfREFUQV9USU1FUikKKyNkZWZpbmUgYmZpbl93cml0ZV9SU0lfREFUQV9USU1FUih2YWwpIGJmaW5fd3JpdGUzMihSU0lfREFUQV9USU1FUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlNJX0RBVEFfTEdUSCgpICAgICAgYmZpbl9yZWFkMTYoUlNJX0RBVEFfTEdUSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9SU0lfREFUQV9MR1RIKHZhbCkgIGJmaW5fd3JpdGUxNihSU0lfREFUQV9MR1RILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SU0lfREFUQV9DVEwoKSAgICAgICBiZmluX3JlYWQxNihSU0lfREFUQV9DT05UUk9MKQorI2RlZmluZSBiZmluX3dyaXRlX1JTSV9EQVRBX0NUTCh2YWwpICAgYmZpbl93cml0ZTE2KFJTSV9EQVRBX0NPTlRST0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JTSV9EQVRBX0NOVCgpICAgICAgIGJmaW5fcmVhZDE2KFJTSV9EQVRBX0NOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9SU0lfREFUQV9DTlQodmFsKSAgIGJmaW5fd3JpdGUxNihSU0lfREFUQV9DTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JTSV9TVEFUVVMoKSAgICAgICAgIGJmaW5fcmVhZDMyKFJTSV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlNJX1NUQVRVUyh2YWwpICAgICBiZmluX3dyaXRlMzIoUlNJX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlNJX1NUQVRVU19DTFIoKSAgICAgYmZpbl9yZWFkMTYoUlNJX1NUQVRVU0NMKQorI2RlZmluZSBiZmluX3dyaXRlX1JTSV9TVEFUVVNfQ0xSKHZhbCkgYmZpbl93cml0ZTE2KFJTSV9TVEFUVVNDTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlNJX01BU0swKCkgICAgICAgICAgYmZpbl9yZWFkMzIoUlNJX01BU0swKQorI2RlZmluZSBiZmluX3dyaXRlX1JTSV9NQVNLMCh2YWwpICAgICAgYmZpbl93cml0ZTMyKFJTSV9NQVNLMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlNJX01BU0sxKCkgICAgICAgICAgYmZpbl9yZWFkMzIoUlNJX01BU0sxKQorI2RlZmluZSBiZmluX3dyaXRlX1JTSV9NQVNLMSh2YWwpICAgICAgYmZpbl93cml0ZTMyKFJTSV9NQVNLMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlNJX0ZJRk9fQ05UKCkgICAgICAgYmZpbl9yZWFkMTYoUlNJX0ZJRk9fQ05UKQorI2RlZmluZSBiZmluX3dyaXRlX1JTSV9GSUZPX0NOVCh2YWwpICAgYmZpbl93cml0ZTE2KFJTSV9GSUZPX0NOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlNJX0NFQVRBX0NUTCgpICAgICAgYmZpbl9yZWFkMTYoUlNJX0NFQVRBX0NPTlRST0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlNJX0NFQVRBX0NUTCh2YWwpICBiZmluX3dyaXRlMTYoUlNJX0NFQVRBX0NPTlRST0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JTSV9GSUZPKCkgICAgICAgICAgIGJmaW5fcmVhZDMyKFJTSV9GSUZPKQorI2RlZmluZSBiZmluX3dyaXRlX1JTSV9GSUZPKHZhbCkgICAgICAgYmZpbl93cml0ZTMyKFJTSV9GSUZPLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SU0lfRV9TVEFUVVMoKSAgICAgICBiZmluX3JlYWQxNihSU0lfRVNUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlNJX0VfU1RBVFVTKHZhbCkgICBiZmluX3dyaXRlMTYoUlNJX0VTVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SU0lfRV9NQVNLKCkgICAgICAgICBiZmluX3JlYWQxNihSU0lfRU1BU0spCisjZGVmaW5lIGJmaW5fd3JpdGVfUlNJX0VfTUFTSyh2YWwpICAgICBiZmluX3dyaXRlMTYoUlNJX0VNQVNLLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SU0lfQ0ZHKCkgICAgICAgICAgICBiZmluX3JlYWQxNihSU0lfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX1JTSV9DRkcodmFsKSAgICAgICAgYmZpbl93cml0ZTE2KFJTSV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JTSV9SRF9XQUlUX0VOKCkgICAgIGJmaW5fcmVhZDE2KFJTSV9SRF9XQUlUX0VOKQorI2RlZmluZSBiZmluX3dyaXRlX1JTSV9SRF9XQUlUX0VOKHZhbCkgYmZpbl93cml0ZTE2KFJTSV9SRF9XQUlUX0VOLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SU0lfUElEMCgpICAgICAgICAgICBiZmluX3JlYWQxNihSU0lfUElEMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9SU0lfUElEMCh2YWwpICAgICAgIGJmaW5fd3JpdGUxNihSU0lfUElEMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlNJX1BJRDEoKSAgICAgICAgICAgYmZpbl9yZWFkMTYoUlNJX1BJRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlNJX1BJRDEodmFsKSAgICAgICBiZmluX3dyaXRlMTYoUlNJX1BJRDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JTSV9QSUQyKCkgICAgICAgICAgIGJmaW5fcmVhZDE2KFJTSV9QSUQyKQorI2RlZmluZSBiZmluX3dyaXRlX1JTSV9QSUQyKHZhbCkgICAgICAgYmZpbl93cml0ZTE2KFJTSV9QSUQyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SU0lfUElEMygpICAgICAgICAgICBiZmluX3JlYWQxNihSU0lfUElEMykKKyNkZWZpbmUgYmZpbl93cml0ZV9SU0lfUElEMyh2YWwpICAgICAgIGJmaW5fd3JpdGUxNihSU0lfUElEMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlNJX1BJRDQoKSAgICAgICAgICAgYmZpbl9yZWFkMTYoUlNJX1BJRDQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlNJX1BJRDQodmFsKSAgICAgICBiZmluX3dyaXRlMTYoUlNJX1BJRDQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JTSV9QSUQ1KCkgICAgICAgICAgIGJmaW5fcmVhZDE2KFJTSV9QSUQ1KQorI2RlZmluZSBiZmluX3dyaXRlX1JTSV9QSUQ1KHZhbCkgICAgICAgYmZpbl93cml0ZTE2KFJTSV9QSUQ1LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SU0lfUElENigpICAgICAgICAgICBiZmluX3JlYWQxNihSU0lfUElENikKKyNkZWZpbmUgYmZpbl93cml0ZV9SU0lfUElENih2YWwpICAgICAgIGJmaW5fd3JpdGUxNihSU0lfUElENiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlNJX1BJRDcoKSAgICAgICAgICAgYmZpbl9yZWFkMTYoUlNJX1BJRDcpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlNJX1BJRDcodmFsKSAgICAgICBiZmluX3dyaXRlMTYoUlNJX1BJRDcsIHZhbCkKKworCisjZW5kaWYgLyogX0NERUZfQkY1MThfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MXhfYmFzZS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MXhfYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlM2Q0NzMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2NkZWZCRjUxeF9iYXNlLmgKQEAgLTAsMCArMSwxMjA4IEBACisvKgorICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTE4L2NkZWZCRjUxeF9iYXNlLmgKKyAqIEJhc2VkIG9uOgorICogQXV0aG9yOgorICoKKyAqIENyZWF0ZWQ6CisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBSZXY6CisgKgorICogTW9kaWZpZWQ6CisgKgorICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAqIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfQ0RFRl9CRjUyWF9ICisjZGVmaW5lIF9DREVGX0JGNTJYX0gKKworI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgorCisjaW5jbHVkZSAiZGVmQkY1MXhfYmFzZS5oIgorCisvKiBJbmNsdWRlIGNvcmUgc3BlY2lmaWMgcmVnaXN0ZXIgcG9pbnRlciBkZWZpbml0aW9ucyAJCQkJCQkJCSovCisjaW5jbHVkZSA8YXNtL2NkZWZfTFBCbGFja2Zpbi5oPgorCisvKiA9PT09IGJlZ2luIGZyb20gY2RlZkJGNTM0LmggPT09PSAqLworCisvKiBDbG9jayBhbmQgU3lzdGVtIENvbnRyb2wJKDB4RkZDMDAwMDAgLSAweEZGQzAwMEZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX1BMTF9DVEwoKQkJCWJmaW5fcmVhZDE2KFBMTF9DVEwpCisjZGVmaW5lIGJmaW5fcmVhZF9QTExfRElWKCkJCQliZmluX3JlYWQxNihQTExfRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1BMTF9ESVYodmFsKQkJCWJmaW5fd3JpdGUxNihQTExfRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9WUl9DVEwoKQkJCWJmaW5fcmVhZDE2KFZSX0NUTCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BMTF9TVEFUKCkJCQliZmluX3JlYWQxNihQTExfU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QTExfU1RBVCh2YWwpCQliZmluX3dyaXRlMTYoUExMX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BMTF9MT0NLQ05UKCkJCQliZmluX3JlYWQxNihQTExfTE9DS0NOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QTExfTE9DS0NOVCh2YWwpCQliZmluX3dyaXRlMTYoUExMX0xPQ0tDTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NISVBJRCgpCQkJYmZpbl9yZWFkMzIoQ0hJUElEKQorI2RlZmluZSBiZmluX3dyaXRlX0NISVBJRCh2YWwpCQkJYmZpbl93cml0ZTMyKENISVBJRCwgdmFsKQorCisKKy8qIFN5c3RlbSBJbnRlcnJ1cHQgQ29udHJvbGxlciAoMHhGRkMwMDEwMCAtIDB4RkZDMDAxRkYpCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9TV1JTVCgpCQkJYmZpbl9yZWFkMTYoU1dSU1QpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1dSU1QodmFsKQkJCWJmaW5fd3JpdGUxNihTV1JTVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1lTQ1IoKQkJCWJmaW5fcmVhZDE2KFNZU0NSKQorI2RlZmluZSBiZmluX3dyaXRlX1NZU0NSKHZhbCkJCQliZmluX3dyaXRlMTYoU1lTQ1IsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfU0lDX1JWRUNUKCkJCQliZmluX3JlYWQzMihTSUNfUlZFQ1QpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX1JWRUNUKHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfUlZFQ1QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JTUFTSzAoKQkJCWJmaW5fcmVhZDMyKFNJQ19JTUFTSzApCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lNQVNLMCh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lNQVNLMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lNQVNLKHgpCQkJYmZpbl9yZWFkMzIoU0lDX0lNQVNLMCArICh4IDw8IDYpKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JTUFTSyh4LCB2YWwpCQliZmluX3dyaXRlMzIoKFNJQ19JTUFTSzAgKyAoeCA8PCA2KSksIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfU0lDX0lBUjAoKQkJCWJmaW5fcmVhZDMyKFNJQ19JQVIwKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JQVIwKHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSUFSMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lBUjEoKQkJCWJmaW5fcmVhZDMyKFNJQ19JQVIxKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JQVIxKHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSUFSMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lBUjIoKQkJCWJmaW5fcmVhZDMyKFNJQ19JQVIyKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JQVIyKHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSUFSMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lBUjMoKQkJCWJmaW5fcmVhZDMyKFNJQ19JQVIzKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JQVIzKHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSUFSMywgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSVNSMCgpCQkJYmZpbl9yZWFkMzIoU0lDX0lTUjApCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lTUjAodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JU1IwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSVNSKHgpCQkJYmZpbl9yZWFkMzIoU0lDX0lTUjAgKyAoeCA8PCA2KSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSVNSKHgsIHZhbCkJCWJmaW5fd3JpdGUzMigoU0lDX0lTUjAgKyAoeCA8PCA2KSksIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfU0lDX0lXUjAoKQkJCWJmaW5fcmVhZDMyKFNJQ19JV1IwKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JV1IwKHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSVdSMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lXUih4KQkJCWJmaW5fcmVhZDMyKFNJQ19JV1IwICsgKHggPDwgNikpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lXUih4LCB2YWwpCQliZmluX3dyaXRlMzIoKFNJQ19JV1IwICsgKHggPDwgNikpLCB2YWwpCisKKy8qIFNJQyBBZGRpdGlvbnMgdG8gQURTUC1CRjUxeCAoMHhGRkMwMDE0QyAtIDB4RkZDMDAxNjIpICovCisKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JTUFTSzEoKQkJCWJmaW5fcmVhZDMyKFNJQ19JTUFTSzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lNQVNLMSh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lNQVNLMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lBUjQoKQkJCWJmaW5fcmVhZDMyKFNJQ19JQVI0KQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JQVI0KHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSUFSNCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lBUjUoKQkJCWJmaW5fcmVhZDMyKFNJQ19JQVI1KQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JQVI1KHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSUFSNSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lBUjYoKQkJCWJmaW5fcmVhZDMyKFNJQ19JQVI2KQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JQVI2KHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSUFSNiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lBUjcoKQkJCWJmaW5fcmVhZDMyKFNJQ19JQVI3KQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JQVI3KHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSUFSNywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lTUjEoKQkJCWJmaW5fcmVhZDMyKFNJQ19JU1IxKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JU1IxKHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSVNSMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lXUjEoKQkJCWJmaW5fcmVhZDMyKFNJQ19JV1IxKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JV1IxKHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSVdSMSwgdmFsKQorCisvKiBXYXRjaGRvZyBUaW1lcgkJKDB4RkZDMDAyMDAgLSAweEZGQzAwMkZGKQkJCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9XRE9HX0NUTCgpCQkJYmZpbl9yZWFkMTYoV0RPR19DVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfV0RPR19DVEwodmFsKQkJYmZpbl93cml0ZTE2KFdET0dfQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9XRE9HX0NOVCgpCQkJYmZpbl9yZWFkMzIoV0RPR19DTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfV0RPR19DTlQodmFsKQkJYmZpbl93cml0ZTMyKFdET0dfQ05ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9XRE9HX1NUQVQoKQkJCWJmaW5fcmVhZDMyKFdET0dfU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9XRE9HX1NUQVQodmFsKQkJYmZpbl93cml0ZTMyKFdET0dfU1RBVCwgdmFsKQorCisKKy8qIFJlYWwgVGltZSBDbG9jawkJKDB4RkZDMDAzMDAgLSAweEZGQzAwM0ZGKQkJCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9SVENfU1RBVCgpCQkJYmZpbl9yZWFkMzIoUlRDX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlRDX1NUQVQodmFsKQkJYmZpbl93cml0ZTMyKFJUQ19TVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SVENfSUNUTCgpCQkJYmZpbl9yZWFkMTYoUlRDX0lDVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlRDX0lDVEwodmFsKQkJYmZpbl93cml0ZTE2KFJUQ19JQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SVENfSVNUQVQoKQkJCWJmaW5fcmVhZDE2KFJUQ19JU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9SVENfSVNUQVQodmFsKQkJYmZpbl93cml0ZTE2KFJUQ19JU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlRDX1NXQ05UKCkJCQliZmluX3JlYWQxNihSVENfU1dDTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlRDX1NXQ05UKHZhbCkJCWJmaW5fd3JpdGUxNihSVENfU1dDTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JUQ19BTEFSTSgpCQkJYmZpbl9yZWFkMzIoUlRDX0FMQVJNKQorI2RlZmluZSBiZmluX3dyaXRlX1JUQ19BTEFSTSh2YWwpCQliZmluX3dyaXRlMzIoUlRDX0FMQVJNLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SVENfRkFTVCgpCQkJYmZpbl9yZWFkMTYoUlRDX0ZBU1QpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlRDX0ZBU1QodmFsKQkJYmZpbl93cml0ZTE2KFJUQ19GQVNULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SVENfUFJFTigpCQkJYmZpbl9yZWFkMTYoUlRDX1BSRU4pCisjZGVmaW5lIGJmaW5fd3JpdGVfUlRDX1BSRU4odmFsKQkJYmZpbl93cml0ZTE2KFJUQ19QUkVOLCB2YWwpCisKKworLyogVUFSVDAgQ29udHJvbGxlcgkJKDB4RkZDMDA0MDAgLSAweEZGQzAwNEZGKQkJCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9USFIoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX1RIUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9USFIodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX1RIUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfUkJSKCkJCQliZmluX3JlYWQxNihVQVJUMF9SQlIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfUkJSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9SQlIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX0RMTCgpCQkJYmZpbl9yZWFkMTYoVUFSVDBfRExMKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX0RMTCh2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfRExMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9JRVIoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX0lFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9JRVIodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX0lFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfRExIKCkJCQliZmluX3JlYWQxNihVQVJUMF9ETEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfRExIKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9ETEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX0lJUigpCQkJYmZpbl9yZWFkMTYoVUFSVDBfSUlSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX0lJUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfSUlSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9MQ1IoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX0xDUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9MQ1IodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX0xDUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfTUNSKCkJCQliZmluX3JlYWQxNihVQVJUMF9NQ1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfTUNSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9NQ1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX0xTUigpCQkJYmZpbl9yZWFkMTYoVUFSVDBfTFNSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX0xTUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfTFNSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9NU1IoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX01TUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9NU1IodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX01TUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfU0NSKCkJCQliZmluX3JlYWQxNihVQVJUMF9TQ1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfU0NSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9TQ1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX0dDVEwoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX0dDVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfR0NUTCh2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfR0NUTCwgdmFsKQorCisKKy8qIFNQSSBDb250cm9sbGVyCQkoMHhGRkMwMDUwMCAtIDB4RkZDMDA1RkYpCQkJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX1NQSV9DVEwoKQkJCWJmaW5fcmVhZDE2KFNQSV9DVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJX0NUTCh2YWwpCQkJYmZpbl93cml0ZTE2KFNQSV9DVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQSV9GTEcoKQkJCWJmaW5fcmVhZDE2KFNQSV9GTEcpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJX0ZMRyh2YWwpCQkJYmZpbl93cml0ZTE2KFNQSV9GTEcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQSV9TVEFUKCkJCQliZmluX3JlYWQxNihTUElfU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUElfU1RBVCh2YWwpCQliZmluX3dyaXRlMTYoU1BJX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQSV9UREJSKCkJCQliZmluX3JlYWQxNihTUElfVERCUikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUElfVERCUih2YWwpCQliZmluX3dyaXRlMTYoU1BJX1REQlIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQSV9SREJSKCkJCQliZmluX3JlYWQxNihTUElfUkRCUikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUElfUkRCUih2YWwpCQliZmluX3dyaXRlMTYoU1BJX1JEQlIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQSV9CQVVEKCkJCQliZmluX3JlYWQxNihTUElfQkFVRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUElfQkFVRCh2YWwpCQliZmluX3dyaXRlMTYoU1BJX0JBVUQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQSV9TSEFET1coKQkJCWJmaW5fcmVhZDE2KFNQSV9TSEFET1cpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJX1NIQURPVyh2YWwpCQliZmluX3dyaXRlMTYoU1BJX1NIQURPVywgdmFsKQorCisKKy8qIFRJTUVSMC03IFJlZ2lzdGVycwkJKDB4RkZDMDA2MDAgLSAweEZGQzAwNkZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMF9DT05GSUcoKQkJYmZpbl9yZWFkMTYoVElNRVIwX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjBfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihUSU1FUjBfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjBfQ09VTlRFUigpCQliZmluX3JlYWQzMihUSU1FUjBfQ09VTlRFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjBfQ09VTlRFUih2YWwpCQliZmluX3dyaXRlMzIoVElNRVIwX0NPVU5URVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMF9QRVJJT0QoKQkJYmZpbl9yZWFkMzIoVElNRVIwX1BFUklPRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjBfUEVSSU9EKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjBfUEVSSU9ELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjBfV0lEVEgoKQkJYmZpbl9yZWFkMzIoVElNRVIwX1dJRFRIKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMF9XSURUSCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVIwX1dJRFRILCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMV9DT05GSUcoKQkJYmZpbl9yZWFkMTYoVElNRVIxX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjFfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihUSU1FUjFfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjFfQ09VTlRFUigpCQliZmluX3JlYWQzMihUSU1FUjFfQ09VTlRFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjFfQ09VTlRFUih2YWwpCQliZmluX3dyaXRlMzIoVElNRVIxX0NPVU5URVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMV9QRVJJT0QoKQkJYmZpbl9yZWFkMzIoVElNRVIxX1BFUklPRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjFfUEVSSU9EKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjFfUEVSSU9ELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjFfV0lEVEgoKQkJYmZpbl9yZWFkMzIoVElNRVIxX1dJRFRIKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMV9XSURUSCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVIxX1dJRFRILCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMl9DT05GSUcoKQkJYmZpbl9yZWFkMTYoVElNRVIyX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjJfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihUSU1FUjJfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjJfQ09VTlRFUigpCQliZmluX3JlYWQzMihUSU1FUjJfQ09VTlRFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjJfQ09VTlRFUih2YWwpCQliZmluX3dyaXRlMzIoVElNRVIyX0NPVU5URVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMl9QRVJJT0QoKQkJYmZpbl9yZWFkMzIoVElNRVIyX1BFUklPRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjJfUEVSSU9EKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjJfUEVSSU9ELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjJfV0lEVEgoKQkJYmZpbl9yZWFkMzIoVElNRVIyX1dJRFRIKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMl9XSURUSCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVIyX1dJRFRILCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSM19DT05GSUcoKQkJYmZpbl9yZWFkMTYoVElNRVIzX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjNfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihUSU1FUjNfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjNfQ09VTlRFUigpCQliZmluX3JlYWQzMihUSU1FUjNfQ09VTlRFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjNfQ09VTlRFUih2YWwpCQliZmluX3dyaXRlMzIoVElNRVIzX0NPVU5URVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSM19QRVJJT0QoKQkJYmZpbl9yZWFkMzIoVElNRVIzX1BFUklPRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjNfUEVSSU9EKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjNfUEVSSU9ELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjNfV0lEVEgoKQkJYmZpbl9yZWFkMzIoVElNRVIzX1dJRFRIKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSM19XSURUSCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVIzX1dJRFRILCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNF9DT05GSUcoKQkJYmZpbl9yZWFkMTYoVElNRVI0X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjRfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihUSU1FUjRfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjRfQ09VTlRFUigpCQliZmluX3JlYWQzMihUSU1FUjRfQ09VTlRFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjRfQ09VTlRFUih2YWwpCQliZmluX3dyaXRlMzIoVElNRVI0X0NPVU5URVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNF9QRVJJT0QoKQkJYmZpbl9yZWFkMzIoVElNRVI0X1BFUklPRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjRfUEVSSU9EKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjRfUEVSSU9ELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjRfV0lEVEgoKQkJYmZpbl9yZWFkMzIoVElNRVI0X1dJRFRIKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNF9XSURUSCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVI0X1dJRFRILCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNV9DT05GSUcoKQkJYmZpbl9yZWFkMTYoVElNRVI1X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjVfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihUSU1FUjVfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjVfQ09VTlRFUigpCQliZmluX3JlYWQzMihUSU1FUjVfQ09VTlRFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjVfQ09VTlRFUih2YWwpCQliZmluX3dyaXRlMzIoVElNRVI1X0NPVU5URVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNV9QRVJJT0QoKQkJYmZpbl9yZWFkMzIoVElNRVI1X1BFUklPRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjVfUEVSSU9EKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjVfUEVSSU9ELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjVfV0lEVEgoKQkJYmZpbl9yZWFkMzIoVElNRVI1X1dJRFRIKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNV9XSURUSCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVI1X1dJRFRILCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNl9DT05GSUcoKQkJYmZpbl9yZWFkMTYoVElNRVI2X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjZfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihUSU1FUjZfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjZfQ09VTlRFUigpCQliZmluX3JlYWQzMihUSU1FUjZfQ09VTlRFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjZfQ09VTlRFUih2YWwpCQliZmluX3dyaXRlMzIoVElNRVI2X0NPVU5URVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNl9QRVJJT0QoKQkJYmZpbl9yZWFkMzIoVElNRVI2X1BFUklPRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjZfUEVSSU9EKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjZfUEVSSU9ELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjZfV0lEVEgoKQkJYmZpbl9yZWFkMzIoVElNRVI2X1dJRFRIKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNl9XSURUSCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVI2X1dJRFRILCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSN19DT05GSUcoKQkJYmZpbl9yZWFkMTYoVElNRVI3X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjdfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihUSU1FUjdfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjdfQ09VTlRFUigpCQliZmluX3JlYWQzMihUSU1FUjdfQ09VTlRFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjdfQ09VTlRFUih2YWwpCQliZmluX3dyaXRlMzIoVElNRVI3X0NPVU5URVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSN19QRVJJT0QoKQkJYmZpbl9yZWFkMzIoVElNRVI3X1BFUklPRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjdfUEVSSU9EKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjdfUEVSSU9ELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjdfV0lEVEgoKQkJYmZpbl9yZWFkMzIoVElNRVI3X1dJRFRIKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSN19XSURUSCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVI3X1dJRFRILCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSX0VOQUJMRSgpCQliZmluX3JlYWQxNihUSU1FUl9FTkFCTEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVJfRU5BQkxFKHZhbCkJCWJmaW5fd3JpdGUxNihUSU1FUl9FTkFCTEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSX0RJU0FCTEUoKQkJYmZpbl9yZWFkMTYoVElNRVJfRElTQUJMRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUl9ESVNBQkxFKHZhbCkJCWJmaW5fd3JpdGUxNihUSU1FUl9ESVNBQkxFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUl9TVEFUVVMoKQkJYmZpbl9yZWFkMzIoVElNRVJfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMzIoVElNRVJfU1RBVFVTLCB2YWwpCisKKworLyogR2VuZXJhbCBQdXJwb3NlIEkvTyBQb3J0IEYgKDB4RkZDMDA3MDAgLSAweEZGQzAwN0ZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU8oKQkJCWJmaW5fcmVhZDE2KFBPUlRGSU8pCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJTyh2YWwpCQkJYmZpbl93cml0ZTE2KFBPUlRGSU8sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fQ0xFQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19DTEVBUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX0NMRUFSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURklPX0NMRUFSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX1NFVCgpCQkJYmZpbl9yZWFkMTYoUE9SVEZJT19TRVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19TRVQodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGSU9fU0VULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX1RPR0dMRSgpCQliZmluX3JlYWQxNihQT1JURklPX1RPR0dMRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX1RPR0dMRSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZJT19UT0dHTEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fTUFTS0EoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19NQVNLQSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX01BU0tBKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURklPX01BU0tBLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX01BU0tBX0NMRUFSKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fTUFTS0FfQ0xFQVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQV9DTEVBUih2YWwpCWJmaW5fd3JpdGUxNihQT1JURklPX01BU0tBX0NMRUFSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX01BU0tBX1NFVCgpCQliZmluX3JlYWQxNihQT1JURklPX01BU0tBX1NFVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX01BU0tBX1NFVCh2YWwpCWJmaW5fd3JpdGUxNihQT1JURklPX01BU0tBX1NFVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQV9UT0dHTEUoKQliZmluX3JlYWQxNihQT1JURklPX01BU0tBX1RPR0dMRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX01BU0tBX1RPR0dMRSh2YWwpCWJmaW5fd3JpdGUxNihQT1JURklPX01BU0tBX1RPR0dMRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQigpCQliZmluX3JlYWQxNihQT1JURklPX01BU0tCKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fTUFTS0IodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGSU9fTUFTS0IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fTUFTS0JfQ0xFQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19NQVNLQl9DTEVBUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX01BU0tCX0NMRUFSKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRGSU9fTUFTS0JfQ0xFQVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fTUFTS0JfU0VUKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fTUFTS0JfU0VUKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fTUFTS0JfU0VUKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRGSU9fTUFTS0JfU0VULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX01BU0tCX1RPR0dMRSgpCWJmaW5fcmVhZDE2KFBPUlRGSU9fTUFTS0JfVE9HR0xFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fTUFTS0JfVE9HR0xFKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRGSU9fTUFTS0JfVE9HR0xFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX0RJUigpCQkJYmZpbl9yZWFkMTYoUE9SVEZJT19ESVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19ESVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGSU9fRElSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX1BPTEFSKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fUE9MQVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19QT0xBUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZJT19QT0xBUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19FREdFKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fRURHRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX0VER0UodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGSU9fRURHRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19CT1RIKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fQk9USCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX0JPVEgodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGSU9fQk9USCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19JTkVOKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fSU5FTikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX0lORU4odmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGSU9fSU5FTiwgdmFsKQorCisKKy8qIFNQT1JUMCBDb250cm9sbGVyCQkoMHhGRkMwMDgwMCAtIDB4RkZDMDA4RkYpCQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1RDUjEoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMF9UQ1IxKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9UQ1IxKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfVENSMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1RDUjIoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMF9UQ1IyKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9UQ1IyKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfVENSMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1RDTEtESVYoKQkJYmZpbl9yZWFkMTYoU1BPUlQwX1RDTEtESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1RDTEtESVYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9UQ0xLRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfVEZTRElWKCkJCWJmaW5fcmVhZDE2KFNQT1JUMF9URlNESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1RGU0RJVih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1RGU0RJViwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1RYKCkJCQliZmluX3JlYWQzMihTUE9SVDBfVFgpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1RYKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDBfVFgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9SWCgpCQkJYmZpbl9yZWFkMzIoU1BPUlQwX1JYKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9SWCh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX1JYLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfVFgzMigpCQkJYmZpbl9yZWFkMzIoU1BPUlQwX1RYMzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1RYMzIodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9UWDMyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfUlgzMigpCQkJYmZpbl9yZWFkMzIoU1BPUlQwX1JYMzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1JYMzIodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9SWDMyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfVFgxNigpCQkJYmZpbl9yZWFkMTYoU1BPUlQwX1RYMTYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1RYMTYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9UWDE2LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfUlgxNigpCQkJYmZpbl9yZWFkMTYoU1BPUlQwX1JYMTYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1JYMTYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9SWDE2LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfUkNSMSgpCQkJYmZpbl9yZWFkMTYoU1BPUlQwX1JDUjEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1JDUjEodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9SQ1IxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfUkNSMigpCQkJYmZpbl9yZWFkMTYoU1BPUlQwX1JDUjIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1JDUjIodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9SQ1IyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfUkNMS0RJVigpCQliZmluX3JlYWQxNihTUE9SVDBfUkNMS0RJVikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfUkNMS0RJVih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1JDTEtESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9SRlNESVYoKQkJYmZpbl9yZWFkMTYoU1BPUlQwX1JGU0RJVikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfUkZTRElWKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfUkZTRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfU1RBVCgpCQkJYmZpbl9yZWFkMTYoU1BPUlQwX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1NUQVQodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9TVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfQ0hOTCgpCQkJYmZpbl9yZWFkMTYoU1BPUlQwX0NITkwpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX0NITkwodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9DSE5MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTUNNQzEoKQkJYmZpbl9yZWFkMTYoU1BPUlQwX01DTUMxKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NQ01DMSh2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX01DTUMxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTUNNQzIoKQkJYmZpbl9yZWFkMTYoU1BPUlQwX01DTUMyKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NQ01DMih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX01DTUMyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVRDUzAoKQkJYmZpbl9yZWFkMzIoU1BPUlQwX01UQ1MwKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NVENTMCh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX01UQ1MwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVRDUzEoKQkJYmZpbl9yZWFkMzIoU1BPUlQwX01UQ1MxKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NVENTMSh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX01UQ1MxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVRDUzIoKQkJYmZpbl9yZWFkMzIoU1BPUlQwX01UQ1MyKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NVENTMih2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX01UQ1MyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVRDUzMoKQkJYmZpbl9yZWFkMzIoU1BPUlQwX01UQ1MzKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NVENTMyh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX01UQ1MzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVJDUzAoKQkJYmZpbl9yZWFkMzIoU1BPUlQwX01SQ1MwKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NUkNTMCh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX01SQ1MwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVJDUzEoKQkJYmZpbl9yZWFkMzIoU1BPUlQwX01SQ1MxKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NUkNTMSh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX01SQ1MxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVJDUzIoKQkJYmZpbl9yZWFkMzIoU1BPUlQwX01SQ1MyKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NUkNTMih2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX01SQ1MyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVJDUzMoKQkJYmZpbl9yZWFkMzIoU1BPUlQwX01SQ1MzKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NUkNTMyh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX01SQ1MzLCB2YWwpCisKKworLyogU1BPUlQxIENvbnRyb2xsZXIJCSgweEZGQzAwOTAwIC0gMHhGRkMwMDlGRikJCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfVENSMSgpCQkJYmZpbl9yZWFkMTYoU1BPUlQxX1RDUjEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1RDUjEodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9UQ1IxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfVENSMigpCQkJYmZpbl9yZWFkMTYoU1BPUlQxX1RDUjIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1RDUjIodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9UQ1IyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfVENMS0RJVigpCQliZmluX3JlYWQxNihTUE9SVDFfVENMS0RJVikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfVENMS0RJVih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1RDTEtESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9URlNESVYoKQkJYmZpbl9yZWFkMTYoU1BPUlQxX1RGU0RJVikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfVEZTRElWKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfVEZTRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfVFgoKQkJCWJmaW5fcmVhZDMyKFNQT1JUMV9UWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfVFgodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9UWCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1JYKCkJCQliZmluX3JlYWQzMihTUE9SVDFfUlgpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1JYKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfUlgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9UWDMyKCkJCQliZmluX3JlYWQzMihTUE9SVDFfVFgzMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfVFgzMih2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQxX1RYMzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9SWDMyKCkJCQliZmluX3JlYWQzMihTUE9SVDFfUlgzMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfUlgzMih2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQxX1JYMzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9UWDE2KCkJCQliZmluX3JlYWQxNihTUE9SVDFfVFgxNikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfVFgxNih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1RYMTYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9SWDE2KCkJCQliZmluX3JlYWQxNihTUE9SVDFfUlgxNikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfUlgxNih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1JYMTYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9SQ1IxKCkJCQliZmluX3JlYWQxNihTUE9SVDFfUkNSMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfUkNSMSh2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1JDUjEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9SQ1IyKCkJCQliZmluX3JlYWQxNihTUE9SVDFfUkNSMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfUkNSMih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1JDUjIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9SQ0xLRElWKCkJCWJmaW5fcmVhZDE2KFNQT1JUMV9SQ0xLRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9SQ0xLRElWKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfUkNMS0RJViwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1JGU0RJVigpCQliZmluX3JlYWQxNihTUE9SVDFfUkZTRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9SRlNESVYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9SRlNESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9TVEFUKCkJCQliZmluX3JlYWQxNihTUE9SVDFfU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfU1RBVCh2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9DSE5MKCkJCQliZmluX3JlYWQxNihTUE9SVDFfQ0hOTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfQ0hOTCh2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX0NITkwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NQ01DMSgpCQliZmluX3JlYWQxNihTUE9SVDFfTUNNQzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01DTUMxKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfTUNNQzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NQ01DMigpCQliZmluX3JlYWQxNihTUE9SVDFfTUNNQzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01DTUMyKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfTUNNQzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NVENTMCgpCQliZmluX3JlYWQzMihTUE9SVDFfTVRDUzApCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01UQ1MwKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfTVRDUzAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NVENTMSgpCQliZmluX3JlYWQzMihTUE9SVDFfTVRDUzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01UQ1MxKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfTVRDUzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NVENTMigpCQliZmluX3JlYWQzMihTUE9SVDFfTVRDUzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01UQ1MyKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfTVRDUzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NVENTMygpCQliZmluX3JlYWQzMihTUE9SVDFfTVRDUzMpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01UQ1MzKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfTVRDUzMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NUkNTMCgpCQliZmluX3JlYWQzMihTUE9SVDFfTVJDUzApCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01SQ1MwKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfTVJDUzAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NUkNTMSgpCQliZmluX3JlYWQzMihTUE9SVDFfTVJDUzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01SQ1MxKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfTVJDUzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NUkNTMigpCQliZmluX3JlYWQzMihTUE9SVDFfTVJDUzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01SQ1MyKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfTVJDUzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NUkNTMygpCQliZmluX3JlYWQzMihTUE9SVDFfTVJDUzMpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01SQ1MzKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfTVJDUzMsIHZhbCkKKworCisvKiBFeHRlcm5hbCBCdXMgSW50ZXJmYWNlIFVuaXQgKDB4RkZDMDBBMDAgLSAweEZGQzAwQUZGKQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfRUJJVV9BTUdDVEwoKQkJCWJmaW5fcmVhZDE2KEVCSVVfQU1HQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX0VCSVVfQU1HQ1RMKHZhbCkJCWJmaW5fd3JpdGUxNihFQklVX0FNR0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRUJJVV9BTUJDVEwwKCkJCWJmaW5fcmVhZDMyKEVCSVVfQU1CQ1RMMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FQklVX0FNQkNUTDAodmFsKQkJYmZpbl93cml0ZTMyKEVCSVVfQU1CQ1RMMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRUJJVV9BTUJDVEwxKCkJCWJmaW5fcmVhZDMyKEVCSVVfQU1CQ1RMMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FQklVX0FNQkNUTDEodmFsKQkJYmZpbl93cml0ZTMyKEVCSVVfQU1CQ1RMMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRUJJVV9TREdDVEwoKQkJCWJmaW5fcmVhZDMyKEVCSVVfU0RHQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX0VCSVVfU0RHQ1RMKHZhbCkJCWJmaW5fd3JpdGUzMihFQklVX1NER0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRUJJVV9TREJDVEwoKQkJCWJmaW5fcmVhZDE2KEVCSVVfU0RCQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX0VCSVVfU0RCQ1RMKHZhbCkJCWJmaW5fd3JpdGUxNihFQklVX1NEQkNUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRUJJVV9TRFJSQygpCQkJYmZpbl9yZWFkMTYoRUJJVV9TRFJSQykKKyNkZWZpbmUgYmZpbl93cml0ZV9FQklVX1NEUlJDKHZhbCkJCWJmaW5fd3JpdGUxNihFQklVX1NEUlJDLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FQklVX1NEU1RBVCgpCQkJYmZpbl9yZWFkMTYoRUJJVV9TRFNUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRUJJVV9TRFNUQVQodmFsKQkJYmZpbl93cml0ZTE2KEVCSVVfU0RTVEFULCB2YWwpCisKKworLyogRE1BIFRyYWZmaWMgQ29udHJvbCBSZWdpc3RlcnMJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX0RNQV9UQ19QRVIoKQkJCWJmaW5fcmVhZDE2KERNQV9UQ19QRVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BX1RDX1BFUih2YWwpCQliZmluX3dyaXRlMTYoRE1BX1RDX1BFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BX1RDX0NOVCgpCQkJYmZpbl9yZWFkMTYoRE1BX1RDX0NOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUFfVENfQ05UKHZhbCkJCWJmaW5fd3JpdGUxNihETUFfVENfQ05ULCB2YWwpCisKKy8qIEFsdGVybmF0ZSBkZXByZWNhdGVkIHJlZ2lzdGVyIG5hbWVzIChiZWxvdykgcHJvdmlkZWQgZm9yIGJhY2t3YXJkcyBjb2RlIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgYmZpbl9yZWFkX0RNQV9UQ1BFUigpCQkJYmZpbl9yZWFkMTYoRE1BX1RDUEVSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQV9UQ1BFUih2YWwpCQliZmluX3dyaXRlMTYoRE1BX1RDUEVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUFfVENDTlQoKQkJCWJmaW5fcmVhZDE2KERNQV9UQ0NOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUFfVENDTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQV9UQ0NOVCwgdmFsKQorCisvKiBETUEgQ29udHJvbGxlcgkJCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUEwX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BMF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUEwX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTBfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTBfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTBfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTBfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTBfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTBfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTBfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUEwX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTBfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMF9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUEwX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMF9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUEwX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTBfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUEwX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMF9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMF9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTBfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTBfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BMF9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BMF9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTBfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUEwX1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUExX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BMV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUExX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTFfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTFfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTFfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTFfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTFfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTFfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTFfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUExX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTFfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMV9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUExX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMV9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUExX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTFfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUExX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMV9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMV9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTFfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTFfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BMV9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BMV9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTFfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUExX1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUEyX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BMl9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUEyX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTJfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTJfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTJfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUEyX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTJfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMl9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUEyX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEyX0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMl9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUEyX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTJfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUEyX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMl9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMl9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTJfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTJfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEyX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BMl9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BMl9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEyX1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTJfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUEyX1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUEzX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BM19DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUEzX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTNfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BM19TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTNfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTNfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BM19YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTNfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTNfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BM19ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTNfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTNfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BM19YX01PRElGWSgpCQliZmluX3JlYWQxNihETUEzX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTNfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BM19ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUEzX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BM19DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUEzX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTNfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUEzX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BM19DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BM19DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BM19DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTNfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTNfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BM19JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BM19JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTNfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUEzX1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUE0X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BNF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE0X05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTRfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTRfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTRfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTRfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTRfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTRfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTRfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUE0X1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTRfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BNF9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE0X1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BNF9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE0X0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTRfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE0X0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNF9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BNF9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTRfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTRfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BNF9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BNF9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTRfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUE0X1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUE1X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BNV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE1X05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTVfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTVfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTVfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTVfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTVfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTVfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTVfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUE1X1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTVfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BNV9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE1X1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE1X0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BNV9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE1X0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTVfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE1X0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNV9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BNV9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTVfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTVfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE1X0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BNV9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BNV9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE1X1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTVfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUE1X1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUE2X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BNl9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE2X05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTZfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNl9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTZfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTZfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTZfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTZfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTZfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTZfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNl9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUE2X1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTZfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BNl9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE2X1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BNl9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE2X0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTZfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE2X0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNl9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNl9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BNl9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTZfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTZfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BNl9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BNl9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTZfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUE2X1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUE3X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BN19DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE3X05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTdfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTdfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTdfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTdfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTdfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTdfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTdfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19YX01PRElGWSgpCQliZmluX3JlYWQxNihETUE3X1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTdfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BN19ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE3X1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BN19DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE3X0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTdfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE3X0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BN19DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BN19DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTdfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTdfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BN19JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BN19JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTdfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUE3X1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUE4X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BOF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE4X05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQThfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQThfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQThfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQThfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQThfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQThfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQThfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUE4X1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQThfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BOF9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE4X1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BOF9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE4X0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQThfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE4X0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BOF9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BOF9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQThfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQThfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BOF9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BOF9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQThfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUE4X1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUE5X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BOV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE5X05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTlfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTlfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTlfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTlfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTlfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTlfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTlfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUE5X1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTlfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BOV9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE5X1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE5X0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BOV9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE5X0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTlfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE5X0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BOV9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BOV9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTlfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTlfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE5X0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BOV9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BOV9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE5X1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTlfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUE5X1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX0NPTkZJRygpCQliZmluX3JlYWQxNihETUExMF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUExMF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMTBfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTEwX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BMTBfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9TVEFSVF9BRERSKHZhbCkJYmZpbl93cml0ZTMyKERNQTEwX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMTBfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUExMF9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTEwX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BMTBfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMTBfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTEwX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUExMF9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BMTBfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMTBfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTEwX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUExMF9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUExMF9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUExMF9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTEwX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTEwX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMTBfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQTEwX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfSVJRX1NUQVRVUyh2YWwpCWJmaW5fd3JpdGUxNihETUExMF9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9QRVJJUEhFUkFMX01BUCgpCWJmaW5fcmVhZDE2KERNQTEwX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQTEwX1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX0NPTkZJRygpCQliZmluX3JlYWQxNihETUExMV9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUExMV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMTFfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTExX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BMTFfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9TVEFSVF9BRERSKHZhbCkJYmZpbl93cml0ZTMyKERNQTExX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMTFfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUExMV9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTExX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BMTFfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMTFfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTExX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUExMV9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BMTFfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMTFfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTExX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUExMV9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUExMV9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUExMV9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTExX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTExX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMTFfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQTExX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfSVJRX1NUQVRVUyh2YWwpCWJmaW5fd3JpdGUxNihETUExMV9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9QRVJJUEhFUkFMX01BUCgpCWJmaW5fcmVhZDE2KERNQTExX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQTExX1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfQ09ORklHKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDBfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX0QwX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9ORVhUX0RFU0NfUFRSKCkJYmZpbl9yZWFkMzIoTURNQV9EMF9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX0QwX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihNRE1BX0QwX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9TVEFSVF9BRERSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfRDBfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDBfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfRDBfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDBfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfRDBfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9YX01PRElGWSgpCQliZmluX3JlYWQxNihNRE1BX0QwX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfWF9NT0RJRlkodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMF9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9ZX01PRElGWSgpCQliZmluX3JlYWQxNihNRE1BX0QwX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfWV9NT0RJRlkodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMF9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9DVVJSX0RFU0NfUFRSKCkJYmZpbl9yZWFkMzIoTURNQV9EMF9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX0QwX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKE1ETUFfRDBfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfQ1VSUl9BRERSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfRDBfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX0NVUlJfWF9DT1VOVCgpCWJmaW5fcmVhZDE2KE1ETUFfRDBfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDBfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX0NVUlJfWV9DT1VOVCgpCWJmaW5fcmVhZDE2KE1ETUFfRDBfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDBfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoTURNQV9EMF9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfSVJRX1NUQVRVUyh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QwX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfUEVSSVBIRVJBTF9NQVAoKQliZmluX3JlYWQxNihNRE1BX0QwX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMF9QRVJJUEhFUkFMX01BUCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX0NPTkZJRygpCQliZmluX3JlYWQxNihNRE1BX1MwX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9TMF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfTkVYVF9ERVNDX1BUUigpCWJmaW5fcmVhZDMyKE1ETUFfUzBfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9TMF9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoTURNQV9TMF9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfU1RBUlRfQUREUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX1MwX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfWF9DT1VOVCgpCQliZmluX3JlYWQxNihNRE1BX1MwX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX1MwX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfWV9DT1VOVCgpCQliZmluX3JlYWQxNihNRE1BX1MwX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX1MwX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoTURNQV9TMF9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1hfTU9ESUZZKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzBfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoTURNQV9TMF9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1lfTU9ESUZZKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzBfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfQ1VSUl9ERVNDX1BUUigpCWJmaW5fcmVhZDMyKE1ETUFfUzBfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9TMF9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX0NVUlJfQUREUigpCQliZmluX3JlYWQzMihNRE1BX1MwX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0NVUlJfQUREUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX1MwX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9DVVJSX1hfQ09VTlQoKQliZmluX3JlYWQxNihNRE1BX1MwX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MwX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9DVVJSX1lfQ09VTlQoKQliZmluX3JlYWQxNihNRE1BX1MwX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MwX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzBfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0lSUV9TVEFUVVModmFsKQliZmluX3dyaXRlMTYoTURNQV9TMF9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1BFUklQSEVSQUxfTUFQKCkJYmZpbl9yZWFkMTYoTURNQV9TMF9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzBfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9DT05GSUcoKQkJYmZpbl9yZWFkMTYoTURNQV9EMV9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfRDFfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX05FWFRfREVTQ19QVFIoKQliZmluX3JlYWQzMihNRE1BX0QxX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfRDFfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKE1ETUFfRDFfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX1NUQVJUX0FERFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9EMV9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoTURNQV9EMV9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9EMV9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoTURNQV9EMV9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9EMV9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDFfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9YX01PRElGWSh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QxX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDFfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9ZX01PRElGWSh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QxX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX0NVUlJfREVTQ19QVFIoKQliZmluX3JlYWQzMihNRE1BX0QxX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfRDFfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoTURNQV9EMV9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9DVVJSX0FERFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9EMV9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfQ1VSUl9YX0NPVU5UKCkJYmZpbl9yZWFkMTYoTURNQV9EMV9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMV9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfQ1VSUl9ZX0NPVU5UKCkJYmZpbl9yZWFkMTYoTURNQV9EMV9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMV9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihNRE1BX0QxX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9JUlFfU1RBVFVTKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDFfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9QRVJJUEhFUkFMX01BUCgpCWJmaW5fcmVhZDE2KE1ETUFfRDFfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QxX1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfQ09ORklHKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzFfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX1MxX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9ORVhUX0RFU0NfUFRSKCkJYmZpbl9yZWFkMzIoTURNQV9TMV9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX1MxX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihNRE1BX1MxX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9TVEFSVF9BRERSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfUzFfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzFfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfUzFfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzFfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfUzFfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9YX01PRElGWSgpCQliZmluX3JlYWQxNihNRE1BX1MxX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfWF9NT0RJRlkodmFsKQliZmluX3dyaXRlMTYoTURNQV9TMV9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9ZX01PRElGWSgpCQliZmluX3JlYWQxNihNRE1BX1MxX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfWV9NT0RJRlkodmFsKQliZmluX3dyaXRlMTYoTURNQV9TMV9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9DVVJSX0RFU0NfUFRSKCkJYmZpbl9yZWFkMzIoTURNQV9TMV9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX1MxX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKE1ETUFfUzFfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfQ1VSUl9BRERSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfUzFfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX0NVUlJfWF9DT1VOVCgpCWJmaW5fcmVhZDE2KE1ETUFfUzFfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzFfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX0NVUlJfWV9DT1VOVCgpCWJmaW5fcmVhZDE2KE1ETUFfUzFfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzFfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoTURNQV9TMV9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfSVJRX1NUQVRVUyh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MxX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfUEVSSVBIRVJBTF9NQVAoKQliZmluX3JlYWQxNihNRE1BX1MxX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoTURNQV9TMV9QRVJJUEhFUkFMX01BUCwgdmFsKQorCisKKy8qIFBhcmFsbGVsIFBlcmlwaGVyYWwgSW50ZXJmYWNlICgweEZGQzAxMDAwIC0gMHhGRkMwMTBGRikJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX1BQSV9DT05UUk9MKCkJCQliZmluX3JlYWQxNihQUElfQ09OVFJPTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QUElfQ09OVFJPTCh2YWwpCQliZmluX3dyaXRlMTYoUFBJX0NPTlRST0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BQSV9TVEFUVVMoKQkJCWJmaW5fcmVhZDE2KFBQSV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfUFBJX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoUFBJX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUFBJX0RFTEFZKCkJCQliZmluX3JlYWQxNihQUElfREVMQVkpCisjZGVmaW5lIGJmaW5fd3JpdGVfUFBJX0RFTEFZKHZhbCkJCWJmaW5fd3JpdGUxNihQUElfREVMQVksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BQSV9DT1VOVCgpCQkJYmZpbl9yZWFkMTYoUFBJX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX1BQSV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoUFBJX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QUElfRlJBTUUoKQkJCWJmaW5fcmVhZDE2KFBQSV9GUkFNRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QUElfRlJBTUUodmFsKQkJYmZpbl93cml0ZTE2KFBQSV9GUkFNRSwgdmFsKQorCisKKy8qIFR3by1XaXJlIEludGVyZmFjZQkJKDB4RkZDMDE0MDAgLSAweEZGQzAxNEZGKQkJCQkJCQkJKi8KKworLyogR2VuZXJhbCBQdXJwb3NlIEkvTyBQb3J0IEcgKDB4RkZDMDE1MDAgLSAweEZGQzAxNUZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU8oKQkJCWJmaW5fcmVhZDE2KFBPUlRHSU8pCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJTyh2YWwpCQkJYmZpbl93cml0ZTE2KFBPUlRHSU8sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fQ0xFQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19DTEVBUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX0NMRUFSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR0lPX0NMRUFSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX1NFVCgpCQkJYmZpbl9yZWFkMTYoUE9SVEdJT19TRVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19TRVQodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHSU9fU0VULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX1RPR0dMRSgpCQliZmluX3JlYWQxNihQT1JUR0lPX1RPR0dMRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX1RPR0dMRSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19UT0dHTEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fTUFTS0EoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19NQVNLQSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX01BU0tBKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR0lPX01BU0tBLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX01BU0tBX0NMRUFSKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fTUFTS0FfQ0xFQVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19NQVNLQV9DTEVBUih2YWwpCWJmaW5fd3JpdGUxNihQT1JUR0lPX01BU0tBX0NMRUFSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX01BU0tBX1NFVCgpCQliZmluX3JlYWQxNihQT1JUR0lPX01BU0tBX1NFVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX01BU0tBX1NFVCh2YWwpCWJmaW5fd3JpdGUxNihQT1JUR0lPX01BU0tBX1NFVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19NQVNLQV9UT0dHTEUoKQliZmluX3JlYWQxNihQT1JUR0lPX01BU0tBX1RPR0dMRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX01BU0tBX1RPR0dMRSh2YWwpCWJmaW5fd3JpdGUxNihQT1JUR0lPX01BU0tBX1RPR0dMRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19NQVNLQigpCQliZmluX3JlYWQxNihQT1JUR0lPX01BU0tCKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fTUFTS0IodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHSU9fTUFTS0IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fTUFTS0JfQ0xFQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19NQVNLQl9DTEVBUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX01BU0tCX0NMRUFSKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRHSU9fTUFTS0JfQ0xFQVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fTUFTS0JfU0VUKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fTUFTS0JfU0VUKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fTUFTS0JfU0VUKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRHSU9fTUFTS0JfU0VULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX01BU0tCX1RPR0dMRSgpCWJmaW5fcmVhZDE2KFBPUlRHSU9fTUFTS0JfVE9HR0xFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fTUFTS0JfVE9HR0xFKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRHSU9fTUFTS0JfVE9HR0xFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX0RJUigpCQkJYmZpbl9yZWFkMTYoUE9SVEdJT19ESVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19ESVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHSU9fRElSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX1BPTEFSKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fUE9MQVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19QT0xBUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19QT0xBUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19FREdFKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fRURHRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX0VER0UodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHSU9fRURHRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19CT1RIKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fQk9USCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX0JPVEgodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHSU9fQk9USCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19JTkVOKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fSU5FTikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX0lORU4odmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHSU9fSU5FTiwgdmFsKQorCisKKy8qIEdlbmVyYWwgUHVycG9zZSBJL08gUG9ydCBIICgweEZGQzAxNzAwIC0gMHhGRkMwMTdGRikJCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPKCkJCQliZmluX3JlYWQxNihQT1JUSElPKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU8odmFsKQkJCWJmaW5fd3JpdGUxNihQT1JUSElPLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX0NMRUFSKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fQ0xFQVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19DTEVBUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhJT19DTEVBUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19TRVQoKQkJCWJmaW5fcmVhZDE2KFBPUlRISU9fU0VUKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fU0VUKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSElPX1NFVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19UT0dHTEUoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19UT0dHTEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19UT0dHTEUodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fVE9HR0xFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX01BU0tBKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fTUFTS0EpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19NQVNLQSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhJT19NQVNLQSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19NQVNLQV9DTEVBUigpCQliZmluX3JlYWQxNihQT1JUSElPX01BU0tBX0NMRUFSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fTUFTS0FfQ0xFQVIodmFsKQliZmluX3dyaXRlMTYoUE9SVEhJT19NQVNLQV9DTEVBUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19NQVNLQV9TRVQoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19NQVNLQV9TRVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19NQVNLQV9TRVQodmFsKQliZmluX3dyaXRlMTYoUE9SVEhJT19NQVNLQV9TRVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fTUFTS0FfVE9HR0xFKCkJYmZpbl9yZWFkMTYoUE9SVEhJT19NQVNLQV9UT0dHTEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19NQVNLQV9UT0dHTEUodmFsKQliZmluX3dyaXRlMTYoUE9SVEhJT19NQVNLQV9UT0dHTEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fTUFTS0IoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19NQVNLQikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX01BU0tCKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSElPX01BU0tCLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX01BU0tCX0NMRUFSKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fTUFTS0JfQ0xFQVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19NQVNLQl9DTEVBUih2YWwpCWJmaW5fd3JpdGUxNihQT1JUSElPX01BU0tCX0NMRUFSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX01BU0tCX1NFVCgpCQliZmluX3JlYWQxNihQT1JUSElPX01BU0tCX1NFVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX01BU0tCX1NFVCh2YWwpCWJmaW5fd3JpdGUxNihQT1JUSElPX01BU0tCX1NFVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19NQVNLQl9UT0dHTEUoKQliZmluX3JlYWQxNihQT1JUSElPX01BU0tCX1RPR0dMRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX01BU0tCX1RPR0dMRSh2YWwpCWJmaW5fd3JpdGUxNihQT1JUSElPX01BU0tCX1RPR0dMRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19ESVIoKQkJCWJmaW5fcmVhZDE2KFBPUlRISU9fRElSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fRElSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSElPX0RJUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19QT0xBUigpCQliZmluX3JlYWQxNihQT1JUSElPX1BPTEFSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fUE9MQVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fUE9MQVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fRURHRSgpCQliZmluX3JlYWQxNihQT1JUSElPX0VER0UpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19FREdFKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSElPX0VER0UsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fQk9USCgpCQliZmluX3JlYWQxNihQT1JUSElPX0JPVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19CT1RIKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSElPX0JPVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fSU5FTigpCQliZmluX3JlYWQxNihQT1JUSElPX0lORU4pCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19JTkVOKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSElPX0lORU4sIHZhbCkKKworCisvKiBVQVJUMSBDb250cm9sbGVyCQkoMHhGRkMwMjAwMCAtIDB4RkZDMDIwRkYpCQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfVEhSKCkJCQliZmluX3JlYWQxNihVQVJUMV9USFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfVEhSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9USFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX1JCUigpCQkJYmZpbl9yZWFkMTYoVUFSVDFfUkJSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX1JCUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfUkJSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9ETEwoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX0RMTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9ETEwodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX0RMTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfSUVSKCkJCQliZmluX3JlYWQxNihVQVJUMV9JRVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfSUVSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9JRVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX0RMSCgpCQkJYmZpbl9yZWFkMTYoVUFSVDFfRExIKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX0RMSCh2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfRExILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9JSVIoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX0lJUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9JSVIodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX0lJUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfTENSKCkJCQliZmluX3JlYWQxNihVQVJUMV9MQ1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfTENSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9MQ1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX01DUigpCQkJYmZpbl9yZWFkMTYoVUFSVDFfTUNSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX01DUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfTUNSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9MU1IoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX0xTUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9MU1IodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX0xTUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfTVNSKCkJCQliZmluX3JlYWQxNihVQVJUMV9NU1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfTVNSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9NU1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX1NDUigpCQkJYmZpbl9yZWFkMTYoVUFSVDFfU0NSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX1NDUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfU0NSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9HQ1RMKCkJCQliZmluX3JlYWQxNihVQVJUMV9HQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX0dDVEwodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX0dDVEwsIHZhbCkKKworLyogT21pdCBDQU4gcmVnaXN0ZXIgc2V0cyBmcm9tIHRoZSBjZGVmQkY1MzQuaCAoQ0FOIGlzIG5vdCBpbiB0aGUgQURTUC1CRjUxeCBwcm9jZXNzb3IpICovCisKKy8qIFBpbiBDb250cm9sIFJlZ2lzdGVycwkoMHhGRkMwMzIwMCAtIDB4RkZDMDMyRkYpCQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfUE9SVEZfRkVSKCkJCQliZmluX3JlYWQxNihQT1JURl9GRVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZfRkVSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURl9GRVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHX0ZFUigpCQkJYmZpbl9yZWFkMTYoUE9SVEdfRkVSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHX0ZFUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdfRkVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSF9GRVIoKQkJCWJmaW5fcmVhZDE2KFBPUlRIX0ZFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSF9GRVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRIX0ZFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVF9NVVgoKQkJCWJmaW5fcmVhZDE2KFBPUlRfTVVYKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRfTVVYKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUX01VWCwgdmFsKQorCisKKy8qIEhhbmRzaGFrZSBNRE1BIFJlZ2lzdGVycwkoMHhGRkMwMzMwMCAtIDB4RkZDMDMzRkYpCQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfSE1ETUEwX0NPTlRST0woKQkJYmZpbl9yZWFkMTYoSE1ETUEwX0NPTlRST0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUEwX0NPTlRST0wodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMF9DT05UUk9MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTBfRUNJTklUKCkJCWJmaW5fcmVhZDE2KEhNRE1BMF9FQ0lOSVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUEwX0VDSU5JVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUEwX0VDSU5JVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE1ETUEwX0JDSU5JVCgpCQliZmluX3JlYWQxNihITURNQTBfQkNJTklUKQorI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMF9CQ0lOSVQodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMF9CQ0lOSVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMF9FQ1VSR0VOVCgpCQliZmluX3JlYWQxNihITURNQTBfRUNVUkdFTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUEwX0VDVVJHRU5UKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTBfRUNVUkdFTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMF9FQ09WRVJGTE9XKCkJCWJmaW5fcmVhZDE2KEhNRE1BMF9FQ09WRVJGTE9XKQorI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMF9FQ09WRVJGTE9XKHZhbCkJYmZpbl93cml0ZTE2KEhNRE1BMF9FQ09WRVJGTE9XLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTBfRUNPVU5UKCkJCWJmaW5fcmVhZDE2KEhNRE1BMF9FQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUEwX0VDT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUEwX0VDT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE1ETUEwX0JDT1VOVCgpCQliZmluX3JlYWQxNihITURNQTBfQkNPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMF9CQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMF9CQ09VTlQsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfSE1ETUExX0NPTlRST0woKQkJYmZpbl9yZWFkMTYoSE1ETUExX0NPTlRST0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUExX0NPTlRST0wodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMV9DT05UUk9MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTFfRUNJTklUKCkJCWJmaW5fcmVhZDE2KEhNRE1BMV9FQ0lOSVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUExX0VDSU5JVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUExX0VDSU5JVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE1ETUExX0JDSU5JVCgpCQliZmluX3JlYWQxNihITURNQTFfQkNJTklUKQorI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMV9CQ0lOSVQodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMV9CQ0lOSVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMV9FQ1VSR0VOVCgpCQliZmluX3JlYWQxNihITURNQTFfRUNVUkdFTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUExX0VDVVJHRU5UKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTFfRUNVUkdFTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMV9FQ09WRVJGTE9XKCkJCWJmaW5fcmVhZDE2KEhNRE1BMV9FQ09WRVJGTE9XKQorI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMV9FQ09WRVJGTE9XKHZhbCkJYmZpbl93cml0ZTE2KEhNRE1BMV9FQ09WRVJGTE9XLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTFfRUNPVU5UKCkJCWJmaW5fcmVhZDE2KEhNRE1BMV9FQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUExX0VDT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUExX0VDT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE1ETUExX0JDT1VOVCgpCQliZmluX3JlYWQxNihITURNQTFfQkNPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMV9CQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMV9CQ09VTlQsIHZhbCkKKworLyogPT09PSBlbmQgZnJvbSBjZGVmQkY1MzQuaCA9PT09ICovCisKKy8qIEdQSU8gUElOIG11eCAoMHhGRkMwMzIxMCAtIE94RkZDMDMyODgpICovCisKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGX01VWCgpCQkJYmZpbl9yZWFkMTYoUE9SVEZfTVVYKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGX01VWCh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZfTVVYLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR19NVVgoKQkJCWJmaW5fcmVhZDE2KFBPUlRHX01VWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR19NVVgodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHX01VWCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhfTVVYKCkJCQliZmluX3JlYWQxNihQT1JUSF9NVVgpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhfTVVYKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSF9NVVgsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfUE9SVEZfRFJJVkUoKQkJCWJmaW5fcmVhZDE2KFBPUlRGX0RSSVZFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGX0RSSVZFKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURl9EUklWRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdfRFJJVkUoKQkJCWJmaW5fcmVhZDE2KFBPUlRHX0RSSVZFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHX0RSSVZFKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR19EUklWRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhfRFJJVkUoKQkJCWJmaW5fcmVhZDE2KFBPUlRIX0RSSVZFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRIX0RSSVZFKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSF9EUklWRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZfU0xFVygpCQkJYmZpbl9yZWFkMTYoUE9SVEZfU0xFVykKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURl9TTEVXKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURl9TTEVXLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR19TTEVXKCkJCQliZmluX3JlYWQxNihQT1JUR19TTEVXKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHX1NMRVcodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHX1NMRVcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRIX1NMRVcoKQkJCWJmaW5fcmVhZDE2KFBPUlRIX1NMRVcpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhfU0xFVyh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhfU0xFVywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZfSFlTVEVSSVNJUygpCQliZmluX3JlYWQxNihQT1JURl9IWVNURVJJU0lTKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGX0hZU1RFUklTSVModmFsKQliZmluX3dyaXRlMTYoUE9SVEZfSFlTVEVSSVNJUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdfSFlTVEVSSVNJUygpCQliZmluX3JlYWQxNihQT1JUR19IWVNURVJJU0lTKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHX0hZU1RFUklTSVModmFsKQliZmluX3dyaXRlMTYoUE9SVEdfSFlTVEVSSVNJUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhfSFlTVEVSSVNJUygpCQliZmluX3JlYWQxNihQT1JUSF9IWVNURVJJU0lTKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRIX0hZU1RFUklTSVModmFsKQliZmluX3dyaXRlMTYoUE9SVEhfSFlTVEVSSVNJUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTUlTQ1BPUlRfRFJJVkUoKQkJYmZpbl9yZWFkMTYoTUlTQ1BPUlRfRFJJVkUpCisjZGVmaW5lIGJmaW5fd3JpdGVfTUlTQ1BPUlRfRFJJVkUodmFsKQkJYmZpbl93cml0ZTE2KE1JU0NQT1JUX0RSSVZFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NSVNDUE9SVF9TTEVXKCkJCWJmaW5fcmVhZDE2KE1JU0NQT1JUX1NMRVcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTUlTQ1BPUlRfU0xFVyh2YWwpCQliZmluX3dyaXRlMTYoTUlTQ1BPUlRfU0xFVywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTUlTQ1BPUlRfSFlTVEVSSVNJUygpCQliZmluX3JlYWQxNihNSVNDUE9SVF9IWVNURVJJU0lTKQorI2RlZmluZSBiZmluX3dyaXRlX01JU0NQT1JUX0hZU1RFUklTSVModmFsKQliZmluX3dyaXRlMTYoTUlTQ1BPUlRfSFlTVEVSSVNJUywgdmFsKQorCisvKiBIT1NUIFBvcnQgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgYmZpbl9yZWFkX0hPU1RfQ09OVFJPTCgpCQliZmluX3JlYWQxNihIT1NUX0NPTlRST0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE9TVF9DT05UUk9MKHZhbCkJCWJmaW5fd3JpdGUxNihIT1NUX0NPTlRST0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0hPU1RfU1RBVFVTKCkJCQliZmluX3JlYWQxNihIT1NUX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9IT1NUX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoSE9TVF9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0hPU1RfVElNRU9VVCgpCQliZmluX3JlYWQxNihIT1NUX1RJTUVPVVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE9TVF9USU1FT1VUKHZhbCkJCWJmaW5fd3JpdGUxNihIT1NUX1RJTUVPVVQsIHZhbCkKKworLyogQ291bnRlciBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBiZmluX3JlYWRfQ05UX0NPTkZJRygpCQkJYmZpbl9yZWFkMTYoQ05UX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9DTlRfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihDTlRfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DTlRfSU1BU0soKQkJCWJmaW5fcmVhZDE2KENOVF9JTUFTSykKKyNkZWZpbmUgYmZpbl93cml0ZV9DTlRfSU1BU0sodmFsKQkJYmZpbl93cml0ZTE2KENOVF9JTUFTSywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ05UX1NUQVRVUygpCQkJYmZpbl9yZWFkMTYoQ05UX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9DTlRfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihDTlRfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DTlRfQ09NTUFORCgpCQkJYmZpbl9yZWFkMTYoQ05UX0NPTU1BTkQpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ05UX0NPTU1BTkQodmFsKQkJYmZpbl93cml0ZTE2KENOVF9DT01NQU5ELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DTlRfREVCT1VOQ0UoKQkJYmZpbl9yZWFkMTYoQ05UX0RFQk9VTkNFKQorI2RlZmluZSBiZmluX3dyaXRlX0NOVF9ERUJPVU5DRSh2YWwpCQliZmluX3dyaXRlMTYoQ05UX0RFQk9VTkNFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DTlRfQ09VTlRFUigpCQkJYmZpbl9yZWFkMzIoQ05UX0NPVU5URVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ05UX0NPVU5URVIodmFsKQkJYmZpbl93cml0ZTMyKENOVF9DT1VOVEVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DTlRfTUFYKCkJCQliZmluX3JlYWQzMihDTlRfTUFYKQorI2RlZmluZSBiZmluX3dyaXRlX0NOVF9NQVgodmFsKQkJCWJmaW5fd3JpdGUzMihDTlRfTUFYLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DTlRfTUlOKCkJCQliZmluX3JlYWQzMihDTlRfTUlOKQorI2RlZmluZSBiZmluX3dyaXRlX0NOVF9NSU4odmFsKQkJCWJmaW5fd3JpdGUzMihDTlRfTUlOLCB2YWwpCisKKy8qIE9UUC9GVVNFIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIGJmaW5fcmVhZF9PVFBfQ09OVFJPTCgpCQkJYmZpbl9yZWFkMTYoT1RQX0NPTlRST0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfT1RQX0NPTlRST0wodmFsKQkJYmZpbl93cml0ZTE2KE9UUF9DT05UUk9MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9PVFBfQkVOKCkJCQliZmluX3JlYWQxNihPVFBfQkVOKQorI2RlZmluZSBiZmluX3dyaXRlX09UUF9CRU4odmFsKQkJCWJmaW5fd3JpdGUxNihPVFBfQkVOLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9PVFBfU1RBVFVTKCkJCQliZmluX3JlYWQxNihPVFBfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX09UUF9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KE9UUF9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX09UUF9USU1JTkcoKQkJCWJmaW5fcmVhZDMyKE9UUF9USU1JTkcpCisjZGVmaW5lIGJmaW5fd3JpdGVfT1RQX1RJTUlORyh2YWwpCQliZmluX3dyaXRlMzIoT1RQX1RJTUlORywgdmFsKQorCisvKiBTZWN1cml0eSBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBiZmluX3JlYWRfU0VDVVJFX1NZU1NXVCgpCQliZmluX3JlYWQzMihTRUNVUkVfU1lTU1dUKQorI2RlZmluZSBiZmluX3dyaXRlX1NFQ1VSRV9TWVNTV1QodmFsKQkJYmZpbl93cml0ZTMyKFNFQ1VSRV9TWVNTV1QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NFQ1VSRV9DT05UUk9MKCkJCWJmaW5fcmVhZDE2KFNFQ1VSRV9DT05UUk9MKQorI2RlZmluZSBiZmluX3dyaXRlX1NFQ1VSRV9DT05UUk9MKHZhbCkJCWJmaW5fd3JpdGUxNihTRUNVUkVfQ09OVFJPTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0VDVVJFX1NUQVRVUygpCQliZmluX3JlYWQxNihTRUNVUkVfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX1NFQ1VSRV9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KFNFQ1VSRV9TVEFUVVMsIHZhbCkKKworLyogT1RQIFJlYWQvV3JpdGUgRGF0YSBCdWZmZXIgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgYmZpbl9yZWFkX09UUF9EQVRBMCgpCQkJYmZpbl9yZWFkMzIoT1RQX0RBVEEwKQorI2RlZmluZSBiZmluX3dyaXRlX09UUF9EQVRBMCh2YWwpCQliZmluX3dyaXRlMzIoT1RQX0RBVEEwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9PVFBfREFUQTEoKQkJCWJmaW5fcmVhZDMyKE9UUF9EQVRBMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9PVFBfREFUQTEodmFsKQkJYmZpbl93cml0ZTMyKE9UUF9EQVRBMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfT1RQX0RBVEEyKCkJCQliZmluX3JlYWQzMihPVFBfREFUQTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfT1RQX0RBVEEyKHZhbCkJCWJmaW5fd3JpdGUzMihPVFBfREFUQTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX09UUF9EQVRBMygpCQkJYmZpbl9yZWFkMzIoT1RQX0RBVEEzKQorI2RlZmluZSBiZmluX3dyaXRlX09UUF9EQVRBMyh2YWwpCQliZmluX3dyaXRlMzIoT1RQX0RBVEEzLCB2YWwpCisKKy8qIE5GQyBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBiZmluX3JlYWRfTkZDX0NUTCgpCQkJYmZpbl9yZWFkMTYoTkZDX0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ORkNfQ1RMKHZhbCkJCQliZmluX3dyaXRlMTYoTkZDX0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTkZDX1NUQVQoKQkJCWJmaW5fcmVhZDE2KE5GQ19TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX05GQ19TVEFUKHZhbCkJCWJmaW5fd3JpdGUxNihORkNfU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTkZDX0lSUVNUQVQoKQkJCWJmaW5fcmVhZDE2KE5GQ19JUlFTVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX05GQ19JUlFTVEFUKHZhbCkJCWJmaW5fd3JpdGUxNihORkNfSVJRU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTkZDX0lSUU1BU0soKQkJCWJmaW5fcmVhZDE2KE5GQ19JUlFNQVNLKQorI2RlZmluZSBiZmluX3dyaXRlX05GQ19JUlFNQVNLKHZhbCkJCWJmaW5fd3JpdGUxNihORkNfSVJRTUFTSywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTkZDX0VDQzAoKQkJCWJmaW5fcmVhZDE2KE5GQ19FQ0MwKQorI2RlZmluZSBiZmluX3dyaXRlX05GQ19FQ0MwKHZhbCkJCWJmaW5fd3JpdGUxNihORkNfRUNDMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTkZDX0VDQzEoKQkJCWJmaW5fcmVhZDE2KE5GQ19FQ0MxKQorI2RlZmluZSBiZmluX3dyaXRlX05GQ19FQ0MxKHZhbCkJCWJmaW5fd3JpdGUxNihORkNfRUNDMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTkZDX0VDQzIoKQkJCWJmaW5fcmVhZDE2KE5GQ19FQ0MyKQorI2RlZmluZSBiZmluX3dyaXRlX05GQ19FQ0MyKHZhbCkJCWJmaW5fd3JpdGUxNihORkNfRUNDMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTkZDX0VDQzMoKQkJCWJmaW5fcmVhZDE2KE5GQ19FQ0MzKQorI2RlZmluZSBiZmluX3dyaXRlX05GQ19FQ0MzKHZhbCkJCWJmaW5fd3JpdGUxNihORkNfRUNDMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTkZDX0NPVU5UKCkJCQliZmluX3JlYWQxNihORkNfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTkZDX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihORkNfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX05GQ19SU1QoKQkJCWJmaW5fcmVhZDE2KE5GQ19SU1QpCisjZGVmaW5lIGJmaW5fd3JpdGVfTkZDX1JTVCh2YWwpCQkJYmZpbl93cml0ZTE2KE5GQ19SU1QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX05GQ19QR0NUTCgpCQkJYmZpbl9yZWFkMTYoTkZDX1BHQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX05GQ19QR0NUTCh2YWwpCQliZmluX3dyaXRlMTYoTkZDX1BHQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ORkNfUkVBRCgpCQkJYmZpbl9yZWFkMTYoTkZDX1JFQUQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTkZDX1JFQUQodmFsKQkJYmZpbl93cml0ZTE2KE5GQ19SRUFELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ORkNfQUREUigpCQkJYmZpbl9yZWFkMTYoTkZDX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTkZDX0FERFIodmFsKQkJYmZpbl93cml0ZTE2KE5GQ19BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ORkNfQ01EKCkJCQliZmluX3JlYWQxNihORkNfQ01EKQorI2RlZmluZSBiZmluX3dyaXRlX05GQ19DTUQodmFsKQkJCWJmaW5fd3JpdGUxNihORkNfQ01ELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ORkNfREFUQV9XUigpCQkJYmZpbl9yZWFkMTYoTkZDX0RBVEFfV1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfTkZDX0RBVEFfV1IodmFsKQkJYmZpbl93cml0ZTE2KE5GQ19EQVRBX1dSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ORkNfREFUQV9SRCgpCQkJYmZpbl9yZWFkMTYoTkZDX0RBVEFfUkQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTkZDX0RBVEFfUkQodmFsKQkJYmZpbl93cml0ZTE2KE5GQ19EQVRBX1JELCB2YWwpCisKKy8qIFRoZXNlIG5lZWQgdG8gYmUgbGFzdCBkdWUgdG8gdGhlIGNkZWYvbGludXggaW50ZXItZGVwZW5kZW5jaWVzICovCisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisvKiBXcml0aW5nIHRvIFBMTF9DVEwgaW5pdGlhdGVzIGEgUExMIHJlbG9jayBzZXF1ZW5jZS4gKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgYmZpbl93cml0ZV9QTExfQ1RMKHVuc2lnbmVkIGludCB2YWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncywgaXdyMCwgaXdyMTsKKworCWlmICh2YWwgPT0gYmZpbl9yZWFkX1BMTF9DVEwoKSkKKwkJcmV0dXJuOworCisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOworCS8qIEVuYWJsZSB0aGUgUExMIFdha2V1cCBiaXQgaW4gU0lDIElXUiAqLworCWl3cjAgPSBiZmluX3JlYWQzMihTSUNfSVdSMCk7CisJaXdyMSA9IGJmaW5fcmVhZDMyKFNJQ19JV1IxKTsKKwkvKiBPbmx5IGFsbG93IFBQTCBXYWtldXApICovCisJYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBJV1JfRU5BQkxFKDApKTsKKwliZmluX3dyaXRlMzIoU0lDX0lXUjEsIDApOworCisJYmZpbl93cml0ZTE2KFBMTF9DVEwsIHZhbCk7CisJU1NZTkMoKTsKKwlhc20oIklETEU7Iik7CisKKwliZmluX3dyaXRlMzIoU0lDX0lXUjAsIGl3cjApOworCWJmaW5fd3JpdGUzMihTSUNfSVdSMSwgaXdyMSk7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOworfQorCisvKiBXcml0aW5nIHRvIFZSX0NUTCBpbml0aWF0ZXMgYSBQTEwgcmVsb2NrIHNlcXVlbmNlLiAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCBiZmluX3dyaXRlX1ZSX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGl3cjAsIGl3cjE7CisKKwlpZiAodmFsID09IGJmaW5fcmVhZF9WUl9DVEwoKSkKKwkJcmV0dXJuOworCisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOworCS8qIEVuYWJsZSB0aGUgUExMIFdha2V1cCBiaXQgaW4gU0lDIElXUiAqLworCWl3cjAgPSBiZmluX3JlYWQzMihTSUNfSVdSMCk7CisJaXdyMSA9IGJmaW5fcmVhZDMyKFNJQ19JV1IxKTsKKwkvKiBPbmx5IGFsbG93IFBQTCBXYWtldXApICovCisJYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBJV1JfRU5BQkxFKDApKTsKKwliZmluX3dyaXRlMzIoU0lDX0lXUjEsIDApOworCisJYmZpbl93cml0ZTE2KFZSX0NUTCwgdmFsKTsKKwlTU1lOQygpOworCWFzbSgiSURMRTsiKTsKKworCWJmaW5fd3JpdGUzMihTSUNfSVdSMCwgaXdyMCk7CisJYmZpbl93cml0ZTMyKFNJQ19JV1IxLCBpd3IxKTsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7Cit9CisKKyNlbmRpZiAvKiBfQ0RFRl9CRjUyWF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2RlZkJGNTEyLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2RlZkJGNTEyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk2Y2E5MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZGVmQkY1MTIuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTE4L2RlZkJGNTEyLmgKKyAqIEJhc2VkIG9uOgorICogQXV0aG9yOgorICoKKyAqIENyZWF0ZWQ6CisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBSZXY6CisgKgorICogTW9kaWZpZWQ6CisgKgorICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAqIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfREVGX0JGNTEyX0gKKyNkZWZpbmUgX0RFRl9CRjUxMl9ICisKKy8qIEluY2x1ZGUgYWxsIENvcmUgcmVnaXN0ZXJzIGFuZCBiaXQgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxhc20vZGVmX0xQQmxhY2tmaW4uaD4KKworLyogU1lTVEVNICYgTU1SIEFERFJFU1MgREVGSU5JVElPTlMgRk9SIEFEU1AtQkY1MTIgKi8KKworLyogSW5jbHVkZSBkZWZCRjUxeF9iYXNlLmggZm9yIHRoZSBzZXQgb2YgI2RlZmluZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBBRFNQLUJGNTF4IHByb2Nlc3NvcnMgKi8KKyNpbmNsdWRlICJkZWZCRjUxeF9iYXNlLmgiCisKKyNlbmRpZiAvKiBfREVGX0JGNTEyX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZGVmQkY1MTQuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZGVmQkY1MTQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDNmMjkxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9kZWZCRjUxNC5oCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTE4L2RlZkJGNTE0LmgKKyAqIEJhc2VkIG9uOgorICogQXV0aG9yOgorICoKKyAqIENyZWF0ZWQ6CisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBSZXY6CisgKgorICogTW9kaWZpZWQ6CisgKgorICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAqIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfREVGX0JGNTE0X0gKKyNkZWZpbmUgX0RFRl9CRjUxNF9ICisKKy8qIEluY2x1ZGUgYWxsIENvcmUgcmVnaXN0ZXJzIGFuZCBiaXQgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxhc20vZGVmX0xQQmxhY2tmaW4uaD4KKworLyogU1lTVEVNICYgTU1SIEFERFJFU1MgREVGSU5JVElPTlMgRk9SIEFEU1AtQkY1MTQgKi8KKworLyogSW5jbHVkZSBkZWZCRjUxeF9iYXNlLmggZm9yIHRoZSBzZXQgb2YgI2RlZmluZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBBRFNQLUJGNTF4IHByb2Nlc3NvcnMgKi8KKyNpbmNsdWRlICJkZWZCRjUxeF9iYXNlLmgiCisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSAjZGVmaW5lcyBuZWVkZWQgYnkgQURTUC1CRjUxNCB0aGF0IGFyZSBub3QgaW4gdGhlIGNvbW1vbiBoZWFkZXIgKi8KKworLyogU0RIIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIFNESF9QV1JfQ1RMICAgICAgICAgICAgICAgICAgICAweEZGQzAzOTAwIC8qIFNESCBQb3dlciBDb250cm9sICovCisjZGVmaW5lIFNESF9DTEtfQ1RMICAgICAgICAgICAgICAgICAgICAweEZGQzAzOTA0IC8qIFNESCBDbG9jayBDb250cm9sICovCisjZGVmaW5lIFNESF9BUkdVTUVOVCAgICAgICAgICAgICAgICAgICAweEZGQzAzOTA4IC8qIFNESCBBcmd1bWVudCAqLworI2RlZmluZSBTREhfQ09NTUFORCAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzkwQyAvKiBTREggQ29tbWFuZCAqLworI2RlZmluZSBTREhfUkVTUF9DTUQgICAgICAgICAgICAgICAgICAgMHhGRkMwMzkxMCAvKiBTREggUmVzcG9uc2UgQ29tbWFuZCAqLworI2RlZmluZSBTREhfUkVTUE9OU0UwICAgICAgICAgICAgICAgICAgMHhGRkMwMzkxNCAvKiBTREggUmVzcG9uc2UwICovCisjZGVmaW5lIFNESF9SRVNQT05TRTEgICAgICAgICAgICAgICAgICAweEZGQzAzOTE4IC8qIFNESCBSZXNwb25zZTEgKi8KKyNkZWZpbmUgU0RIX1JFU1BPTlNFMiAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MUMgLyogU0RIIFJlc3BvbnNlMiAqLworI2RlZmluZSBTREhfUkVTUE9OU0UzICAgICAgICAgICAgICAgICAgMHhGRkMwMzkyMCAvKiBTREggUmVzcG9uc2UzICovCisjZGVmaW5lIFNESF9EQVRBX1RJTUVSICAgICAgICAgICAgICAgICAweEZGQzAzOTI0IC8qIFNESCBEYXRhIFRpbWVyICovCisjZGVmaW5lIFNESF9EQVRBX0xHVEggICAgICAgICAgICAgICAgICAweEZGQzAzOTI4IC8qIFNESCBEYXRhIExlbmd0aCAqLworI2RlZmluZSBTREhfREFUQV9DVEwgICAgICAgICAgICAgICAgICAgMHhGRkMwMzkyQyAvKiBTREggRGF0YSBDb250cm9sICovCisjZGVmaW5lIFNESF9EQVRBX0NOVCAgICAgICAgICAgICAgICAgICAweEZGQzAzOTMwIC8qIFNESCBEYXRhIENvdW50ZXIgKi8KKyNkZWZpbmUgU0RIX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MzQgLyogU0RIIFN0YXR1cyAqLworI2RlZmluZSBTREhfU1RBVFVTX0NMUiAgICAgICAgICAgICAgICAgMHhGRkMwMzkzOCAvKiBTREggU3RhdHVzIENsZWFyICovCisjZGVmaW5lIFNESF9NQVNLMCAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOTNDIC8qIFNESCBJbnRlcnJ1cHQwIE1hc2sgKi8KKyNkZWZpbmUgU0RIX01BU0sxICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5NDAgLyogU0RIIEludGVycnVwdDEgTWFzayAqLworI2RlZmluZSBTREhfRklGT19DTlQgICAgICAgICAgICAgICAgICAgMHhGRkMwMzk0OCAvKiBTREggRklGTyBDb3VudGVyICovCisjZGVmaW5lIFNESF9GSUZPICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOTgwIC8qIFNESCBEYXRhIEZJRk8gKi8KKyNkZWZpbmUgU0RIX0VfU1RBVFVTICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5QzAgLyogU0RIIEV4Y2VwdGlvbiBTdGF0dXMgKi8KKyNkZWZpbmUgU0RIX0VfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5QzQgLyogU0RIIEV4Y2VwdGlvbiBNYXNrICovCisjZGVmaW5lIFNESF9DRkcgICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOUM4IC8qIFNESCBDb25maWd1cmF0aW9uICovCisjZGVmaW5lIFNESF9SRF9XQUlUX0VOICAgICAgICAgICAgICAgICAweEZGQzAzOUNDIC8qIFNESCBSZWFkIFdhaXQgRW5hYmxlICovCisjZGVmaW5lIFNESF9QSUQwICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOUQwIC8qIFNESCBQZXJpcGhlcmFsIElkZW50aWZpY2F0aW9uMCAqLworI2RlZmluZSBTREhfUElEMSAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzlENCAvKiBTREggUGVyaXBoZXJhbCBJZGVudGlmaWNhdGlvbjEgKi8KKyNkZWZpbmUgU0RIX1BJRDIgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5RDggLyogU0RIIFBlcmlwaGVyYWwgSWRlbnRpZmljYXRpb24yICovCisjZGVmaW5lIFNESF9QSUQzICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOURDIC8qIFNESCBQZXJpcGhlcmFsIElkZW50aWZpY2F0aW9uMyAqLworI2RlZmluZSBTREhfUElENCAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzlFMCAvKiBTREggUGVyaXBoZXJhbCBJZGVudGlmaWNhdGlvbjQgKi8KKyNkZWZpbmUgU0RIX1BJRDUgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5RTQgLyogU0RIIFBlcmlwaGVyYWwgSWRlbnRpZmljYXRpb241ICovCisjZGVmaW5lIFNESF9QSUQ2ICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOUU4IC8qIFNESCBQZXJpcGhlcmFsIElkZW50aWZpY2F0aW9uNiAqLworI2RlZmluZSBTREhfUElENyAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzlFQyAvKiBTREggUGVyaXBoZXJhbCBJZGVudGlmaWNhdGlvbjcgKi8KKworLyogUmVtb3ZhYmxlIFN0b3JhZ2UgSW50ZXJmYWNlIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIFJTSV9QV1JfQ09OVFJPTCAgICAgICAgICAgICAgICAweEZGQzAzODAwIC8qIFJTSSBQb3dlciBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9DTEtfQ09OVFJPTCAgICAgICAgICAgICAgICAweEZGQzAzODA0IC8qIFJTSSBDbG9jayBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9BUkdVTUVOVCAgICAgICAgICAgICAgICAgICAweEZGQzAzODA4IC8qIFJTSSBBcmd1bWVudCBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfQ09NTUFORCAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzgwQyAvKiBSU0kgQ29tbWFuZCBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfUkVTUF9DTUQgICAgICAgICAgICAgICAgICAgMHhGRkMwMzgxMCAvKiBSU0kgUmVzcG9uc2UgQ29tbWFuZCBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfUkVTUE9OU0UwICAgICAgICAgICAgICAgICAgMHhGRkMwMzgxNCAvKiBSU0kgUmVzcG9uc2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX1JFU1BPTlNFMSAgICAgICAgICAgICAgICAgIDB4RkZDMDM4MTggLyogUlNJIFJlc3BvbnNlIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9SRVNQT05TRTIgICAgICAgICAgICAgICAgICAweEZGQzAzODFDIC8qIFJTSSBSZXNwb25zZSBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfUkVTUE9OU0UzICAgICAgICAgICAgICAgICAgMHhGRkMwMzgyMCAvKiBSU0kgUmVzcG9uc2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0RBVEFfVElNRVIgICAgICAgICAgICAgICAgIDB4RkZDMDM4MjQgLyogUlNJIERhdGEgVGltZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0RBVEFfTEdUSCAgICAgICAgICAgICAgICAgIDB4RkZDMDM4MjggLyogUlNJIERhdGEgTGVuZ3RoIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9EQVRBX0NPTlRST0wgICAgICAgICAgICAgICAweEZGQzAzODJDIC8qIFJTSSBEYXRhIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0RBVEFfQ05UICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4MzAgLyogUlNJIERhdGEgQ291bnRlciBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzgzNCAvKiBSU0kgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9TVEFUVVNDTCAgICAgICAgICAgICAgICAgICAweEZGQzAzODM4IC8qIFJTSSBTdGF0dXMgQ2xlYXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX01BU0swICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4M0MgLyogUlNJIEludGVycnVwdCAwIE1hc2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX01BU0sxICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4NDAgLyogUlNJIEludGVycnVwdCAxIE1hc2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0ZJRk9fQ05UICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4NDggLyogUlNJIEZJRk8gQ291bnRlciBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfQ0VBVEFfQ09OVFJPTCAgICAgICAgICAgICAgMHhGRkMwMzg0QyAvKiBSU0kgQ0VBVEEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0ZJRk8gICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4ODAgLyogUlNJIERhdGEgRklGTyBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfRVNUQVQgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzhDMCAvKiBSU0kgRXhjZXB0aW9uIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfRU1BU0sgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzhDNCAvKiBSU0kgRXhjZXB0aW9uIE1hc2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4QzggLyogUlNJIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX1JEX1dBSVRfRU4gICAgICAgICAgICAgICAgIDB4RkZDMDM4Q0MgLyogUlNJIFJlYWQgV2FpdCBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX1BJRDAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDNGRTAgLyogUlNJIFBlcmlwaGVyYWwgSUQgUmVnaXN0ZXIgMCAqLworI2RlZmluZSBSU0lfUElEMSAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwM0ZFNCAvKiBSU0kgUGVyaXBoZXJhbCBJRCBSZWdpc3RlciAxICovCisjZGVmaW5lIFJTSV9QSUQyICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzRkU4IC8qIFJTSSBQZXJpcGhlcmFsIElEIFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgUlNJX1BJRDMgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDNGRUMgLyogUlNJIFBlcmlwaGVyYWwgSUQgUmVnaXN0ZXIgMyAqLworI2RlZmluZSBSU0lfUElENCAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwM0ZGMCAvKiBSU0kgUGVyaXBoZXJhbCBJRCBSZWdpc3RlciA0ICovCisjZGVmaW5lIFJTSV9QSUQ1ICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzRkY0IC8qIFJTSSBQZXJpcGhlcmFsIElEIFJlZ2lzdGVyIDUgKi8KKyNkZWZpbmUgUlNJX1BJRDYgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDNGRjggLyogUlNJIFBlcmlwaGVyYWwgSUQgUmVnaXN0ZXIgNiAqLworI2RlZmluZSBSU0lfUElENyAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwM0ZGQyAvKiBSU0kgUGVyaXBoZXJhbCBJRCBSZWdpc3RlciA3ICovCisKKyNlbmRpZiAvKiBfREVGX0JGNTE0X0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZGVmQkY1MTYuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZGVmQkY1MTYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDlhMjY5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9kZWZCRjUxNi5oCkBAIC0wLDAgKzEsNDkwIEBACisvKgorICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTE4L2RlZkJGNTE2LmgKKyAqIEJhc2VkIG9uOgorICogQXV0aG9yOgorICoKKyAqIENyZWF0ZWQ6CisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBSZXY6CisgKgorICogTW9kaWZpZWQ6CisgKgorICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAqIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfREVGX0JGNTE2X0gKKyNkZWZpbmUgX0RFRl9CRjUxNl9ICisKKy8qIEluY2x1ZGUgYWxsIENvcmUgcmVnaXN0ZXJzIGFuZCBiaXQgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxhc20vZGVmX0xQQmxhY2tmaW4uaD4KKworLyogU1lTVEVNICYgTU1SIEFERFJFU1MgREVGSU5JVElPTlMgRk9SIEFEU1AtQkY1MTYgKi8KKworLyogSW5jbHVkZSBkZWZCRjUxeF9iYXNlLmggZm9yIHRoZSBzZXQgb2YgI2RlZmluZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBBRFNQLUJGNTF4IHByb2Nlc3NvcnMgKi8KKyNpbmNsdWRlICJkZWZCRjUxeF9iYXNlLmgiCisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSAjZGVmaW5lcyBuZWVkZWQgYnkgQURTUC1CRjUxNiB0aGF0IGFyZSBub3QgaW4gdGhlIGNvbW1vbiBoZWFkZXIgKi8KKy8qIDEwLzEwMCBFdGhlcm5ldCBDb250cm9sbGVyCSgweEZGQzAzMDAwIC0gMHhGRkMwMzFGRikgKi8KKworI2RlZmluZSBFTUFDX09QTU9ERSAgICAgICAgICAgICAweEZGQzAzMDAwICAgICAgIC8qIE9wZXJhdGluZyBNb2RlIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19BRERSTE8gICAgICAgICAgICAgMHhGRkMwMzAwNCAgICAgICAvKiBBZGRyZXNzIExvdyAoMzIgTFNCcykgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfQUREUkhJICAgICAgICAgICAgIDB4RkZDMDMwMDggICAgICAgLyogQWRkcmVzcyBIaWdoICgxNiBNU0JzKSBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX0hBU0hMTyAgICAgICAgICAgICAweEZGQzAzMDBDICAgICAgIC8qIE11bHRpY2FzdCBIYXNoIFRhYmxlIExvdyAoQmlucyAzMS0wKSBSZWdpc3RlciAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19IQVNISEkgICAgICAgICAgICAgMHhGRkMwMzAxMCAgICAgICAvKiBNdWx0aWNhc3QgSGFzaCBUYWJsZSBIaWdoIChCaW5zIDYzLTMyKSBSZWdpc3RlciAgICAgICovCisjZGVmaW5lIEVNQUNfU1RBQUREICAgICAgICAgICAgIDB4RkZDMDMwMTQgICAgICAgLyogU3RhdGlvbiBNYW5hZ2VtZW50IEFkZHJlc3MgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1NUQURBVCAgICAgICAgICAgICAweEZGQzAzMDE4ICAgICAgIC8qIFN0YXRpb24gTWFuYWdlbWVudCBEYXRhIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19GTEMgICAgICAgICAgICAgICAgMHhGRkMwMzAxQyAgICAgICAvKiBGbG93IENvbnRyb2wgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfVkxBTjEgICAgICAgICAgICAgIDB4RkZDMDMwMjAgICAgICAgLyogVkxBTjEgVGFnIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1ZMQU4yICAgICAgICAgICAgICAweEZGQzAzMDI0ICAgICAgIC8qIFZMQU4yIFRhZyBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19XS1VQX0NUTCAgICAgICAgICAgMHhGRkMwMzAyQyAgICAgICAvKiBXYWtlLVVwIENvbnRyb2wvU3RhdHVzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfV0tVUF9GRk1TSzAgICAgICAgIDB4RkZDMDMwMzAgICAgICAgLyogV2FrZS1VcCBGcmFtZSBGaWx0ZXIgMCBCeXRlIE1hc2sgUmVnaXN0ZXIgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1dLVVBfRkZNU0sxICAgICAgICAweEZGQzAzMDM0ICAgICAgIC8qIFdha2UtVXAgRnJhbWUgRmlsdGVyIDEgQnl0ZSBNYXNrIFJlZ2lzdGVyICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19XS1VQX0ZGTVNLMiAgICAgICAgMHhGRkMwMzAzOCAgICAgICAvKiBXYWtlLVVwIEZyYW1lIEZpbHRlciAyIEJ5dGUgTWFzayBSZWdpc3RlciAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfV0tVUF9GRk1TSzMgICAgICAgIDB4RkZDMDMwM0MgICAgICAgLyogV2FrZS1VcCBGcmFtZSBGaWx0ZXIgMyBCeXRlIE1hc2sgUmVnaXN0ZXIgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1dLVVBfRkZDTUQgICAgICAgICAweEZGQzAzMDQwICAgICAgIC8qIFdha2UtVXAgRnJhbWUgRmlsdGVyIENvbW1hbmRzIFJlZ2lzdGVyICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19XS1VQX0ZGT0ZGICAgICAgICAgMHhGRkMwMzA0NCAgICAgICAvKiBXYWtlLVVwIEZyYW1lIEZpbHRlciBPZmZzZXRzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfV0tVUF9GRkNSQzAgICAgICAgIDB4RkZDMDMwNDggICAgICAgLyogV2FrZS1VcCBGcmFtZSBGaWx0ZXIgMCwxIENSQy0xNiBSZWdpc3RlciAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1dLVVBfRkZDUkMxICAgICAgICAweEZGQzAzMDRDICAgICAgIC8qIFdha2UtVXAgRnJhbWUgRmlsdGVyIDIsMyBDUkMtMTYgUmVnaXN0ZXIgICAgICAgICAgICAgKi8KKworI2RlZmluZSBFTUFDX1NZU0NUTCAgICAgICAgICAgICAweEZGQzAzMDYwICAgICAgIC8qIEVNQUMgU3lzdGVtIENvbnRyb2wgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19TWVNUQVQgICAgICAgICAgICAgMHhGRkMwMzA2NCAgICAgICAvKiBFTUFDIFN5c3RlbSBTdGF0dXMgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhfU1RBVCAgICAgICAgICAgIDB4RkZDMDMwNjggICAgICAgLyogUlggQ3VycmVudCBGcmFtZSBTdGF0dXMgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYX1NUS1kgICAgICAgICAgICAweEZGQzAzMDZDICAgICAgIC8qIFJYIFN0aWNreSBGcmFtZSBTdGF0dXMgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWF9JUlFFICAgICAgICAgICAgMHhGRkMwMzA3MCAgICAgICAvKiBSWCBGcmFtZSBTdGF0dXMgSW50ZXJydXB0IEVuYWJsZXMgUmVnaXN0ZXIgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhfU1RBVCAgICAgICAgICAgIDB4RkZDMDMwNzQgICAgICAgLyogVFggQ3VycmVudCBGcmFtZSBTdGF0dXMgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1RYX1NUS1kgICAgICAgICAgICAweEZGQzAzMDc4ICAgICAgIC8qIFRYIFN0aWNreSBGcmFtZSBTdGF0dXMgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWF9JUlFFICAgICAgICAgICAgMHhGRkMwMzA3QyAgICAgICAvKiBUWCBGcmFtZSBTdGF0dXMgSW50ZXJydXB0IEVuYWJsZXMgUmVnaXN0ZXIgICAgICAgICAgICovCisKKyNkZWZpbmUgRU1BQ19NTUNfQ1RMICAgICAgICAgICAgMHhGRkMwMzA4MCAgICAgICAvKiBNTUMgQ291bnRlciBDb250cm9sIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfTU1DX1JJUlFTICAgICAgICAgIDB4RkZDMDMwODQgICAgICAgLyogTU1DIFJYIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX01NQ19SSVJRRSAgICAgICAgICAweEZGQzAzMDg4ICAgICAgIC8qIE1NQyBSWCBJbnRlcnJ1cHQgRW5hYmxlcyBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19NTUNfVElSUVMgICAgICAgICAgMHhGRkMwMzA4QyAgICAgICAvKiBNTUMgVFggSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfTU1DX1RJUlFFICAgICAgICAgIDB4RkZDMDMwOTAgICAgICAgLyogTU1DIFRYIEludGVycnVwdCBFbmFibGVzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIEVNQUNfUlhDX09LICAgICAgICAgICAgIDB4RkZDMDMxMDAgICAgICAgLyogUlggRnJhbWUgU3VjY2Vzc2Z1bCBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19GQ1MgICAgICAgICAgICAweEZGQzAzMTA0ICAgICAgIC8qIFJYIEZyYW1lIEZDUyBGYWlsdXJlIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfQUxJR04gICAgICAgICAgMHhGRkMwMzEwOCAgICAgICAvKiBSWCBBbGlnbm1lbnQgRXJyb3IgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX09DVEVUICAgICAgICAgIDB4RkZDMDMxMEMgICAgICAgLyogUlggT2N0ZXRzIFN1Y2Nlc3NmdWxseSBSZWNlaXZlZCBDb3VudCAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19ETUFPVkYgICAgICAgICAweEZGQzAzMTEwICAgICAgIC8qIEludGVybmFsIE1BQyBTdWJsYXllciBFcnJvciBSWCBGcmFtZSBDb3VudCAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfVU5JQ1NUICAgICAgICAgMHhGRkMwMzExNCAgICAgICAvKiBVbmljYXN0IFJYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX01VTFRJICAgICAgICAgIDB4RkZDMDMxMTggICAgICAgLyogTXVsdGljYXN0IFJYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19CUk9BRCAgICAgICAgICAweEZGQzAzMTFDICAgICAgIC8qIEJyb2FkY2FzdCBSWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfTE5FUlJJICAgICAgICAgMHhGRkMwMzEyMCAgICAgICAvKiBSWCBGcmFtZSBJbiBSYW5nZSBFcnJvciBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX0xORVJSTyAgICAgICAgIDB4RkZDMDMxMjQgICAgICAgLyogUlggRnJhbWUgT3V0IE9mIFJhbmdlIEVycm9yIENvdW50ICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19MT05HICAgICAgICAgICAweEZGQzAzMTI4ICAgICAgIC8qIFJYIEZyYW1lIFRvbyBMb25nIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfTUFDQ1RMICAgICAgICAgMHhGRkMwMzEyQyAgICAgICAvKiBNQUMgQ29udHJvbCBSWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX09QQ09ERSAgICAgICAgIDB4RkZDMDMxMzAgICAgICAgLyogVW5zdXBwb3J0ZWQgT3AtQ29kZSBSWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19QQVVTRSAgICAgICAgICAweEZGQzAzMTM0ICAgICAgIC8qIE1BQyBDb250cm9sIFBhdXNlIFJYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfQUxMRlJNICAgICAgICAgMHhGRkMwMzEzOCAgICAgICAvKiBPdmVyYWxsIFJYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX0FMTE9DVCAgICAgICAgIDB4RkZDMDMxM0MgICAgICAgLyogT3ZlcmFsbCBSWCBPY3RldCBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19UWVBFRCAgICAgICAgICAweEZGQzAzMTQwICAgICAgIC8qIFR5cGUvTGVuZ3RoIENvbnNpc3RlbnQgUlggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfU0hPUlQgICAgICAgICAgMHhGRkMwMzE0NCAgICAgICAvKiBSWCBGcmFtZSBGcmFnbWVudCBDb3VudCAtIEJ5dGUgQ291bnQgeCA8IDY0ICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX0VRNjQgICAgICAgICAgIDB4RkZDMDMxNDggICAgICAgLyogR29vZCBSWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgeCA9IDY0ICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19MVDEyOCAgICAgICAgICAweEZGQzAzMTRDICAgICAgIC8qIEdvb2QgUlggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50ICA2NCA8IHggPCAxMjggICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfTFQyNTYgICAgICAgICAgMHhGRkMwMzE1MCAgICAgICAvKiBHb29kIFJYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCAxMjggPD0geCA8IDI1NiAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX0xUNTEyICAgICAgICAgIDB4RkZDMDMxNTQgICAgICAgLyogR29vZCBSWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgMjU2IDw9IHggPCA1MTIgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19MVDEwMjQgICAgICAgICAweEZGQzAzMTU4ICAgICAgIC8qIEdvb2QgUlggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IDUxMiA8PSB4IDwgMTAyNCAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfR0UxMDI0ICAgICAgICAgMHhGRkMwMzE1QyAgICAgICAvKiBHb29kIFJYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCB4ID49IDEwMjQgICAgICAgICAgICovCisKKyNkZWZpbmUgRU1BQ19UWENfT0sgICAgICAgICAgICAgMHhGRkMwMzE4MCAgICAgICAvKiBUWCBGcmFtZSBTdWNjZXNzZnVsIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1RYQ18xQ09MICAgICAgICAgICAweEZGQzAzMTg0ICAgICAgIC8qIFRYIEZyYW1lcyBTdWNjZXNzZnVsIEFmdGVyIFNpbmdsZSBDb2xsaXNpb24gQ291bnQgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX0dUMUNPTCAgICAgICAgIDB4RkZDMDMxODggICAgICAgLyogVFggRnJhbWVzIFN1Y2Nlc3NmdWwgQWZ0ZXIgTXVsdGlwbGUgQ29sbGlzaW9ucyBDb3VudCAgKi8KKyNkZWZpbmUgRU1BQ19UWENfT0NURVQgICAgICAgICAgMHhGRkMwMzE4QyAgICAgICAvKiBUWCBPY3RldHMgU3VjY2Vzc2Z1bGx5IFJlY2VpdmVkIENvdW50ICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19ERUZFUiAgICAgICAgICAweEZGQzAzMTkwICAgICAgIC8qIFRYIEZyYW1lIERlbGF5ZWQgRHVlIFRvIEJ1c3kgQ291bnQgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX0xBVEVDTCAgICAgICAgIDB4RkZDMDMxOTQgICAgICAgLyogTGF0ZSBUWCBDb2xsaXNpb25zIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfWFNfQ09MICAgICAgICAgMHhGRkMwMzE5OCAgICAgICAvKiBUWCBGcmFtZSBGYWlsZWQgRHVlIFRvIEV4Y2Vzc2l2ZSBDb2xsaXNpb25zIENvdW50ICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19ETUFVTkQgICAgICAgICAweEZGQzAzMTlDICAgICAgIC8qIEludGVybmFsIE1BQyBTdWJsYXllciBFcnJvciBUWCBGcmFtZSBDb3VudCAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX0NSU0VSUiAgICAgICAgIDB4RkZDMDMxQTAgICAgICAgLyogQ2FycmllciBTZW5zZSBEZWFzc2VydGVkIER1cmluZyBUWCBGcmFtZSBDb3VudCAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfVU5JQ1NUICAgICAgICAgMHhGRkMwMzFBNCAgICAgICAvKiBVbmljYXN0IFRYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19NVUxUSSAgICAgICAgICAweEZGQzAzMUE4ICAgICAgIC8qIE11bHRpY2FzdCBUWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX0JST0FEICAgICAgICAgIDB4RkZDMDMxQUMgICAgICAgLyogQnJvYWRjYXN0IFRYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfWFNfREZSICAgICAgICAgMHhGRkMwMzFCMCAgICAgICAvKiBUWCBGcmFtZXMgV2l0aCBFeGNlc3NpdmUgRGVmZXJyYWwgQ291bnQgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19NQUNDVEwgICAgICAgICAweEZGQzAzMUI0ICAgICAgIC8qIE1BQyBDb250cm9sIFRYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX0FMTEZSTSAgICAgICAgIDB4RkZDMDMxQjggICAgICAgLyogT3ZlcmFsbCBUWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfQUxMT0NUICAgICAgICAgMHhGRkMwMzFCQyAgICAgICAvKiBPdmVyYWxsIFRYIE9jdGV0IENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19FUTY0ICAgICAgICAgICAweEZGQzAzMUMwICAgICAgIC8qIEdvb2QgVFggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IHggPSA2NCAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX0xUMTI4ICAgICAgICAgIDB4RkZDMDMxQzQgICAgICAgLyogR29vZCBUWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgIDY0IDwgeCA8IDEyOCAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfTFQyNTYgICAgICAgICAgMHhGRkMwMzFDOCAgICAgICAvKiBHb29kIFRYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCAxMjggPD0geCA8IDI1NiAgICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19MVDUxMiAgICAgICAgICAweEZGQzAzMUNDICAgICAgIC8qIEdvb2QgVFggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IDI1NiA8PSB4IDwgNTEyICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX0xUMTAyNCAgICAgICAgIDB4RkZDMDMxRDAgICAgICAgLyogR29vZCBUWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgNTEyIDw9IHggPCAxMDI0ICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfR0UxMDI0ICAgICAgICAgMHhGRkMwMzFENCAgICAgICAvKiBHb29kIFRYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCB4ID49IDEwMjQgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19BQk9SVCAgICAgICAgICAweEZGQzAzMUQ4ICAgICAgIC8qIFRvdGFsIFRYIEZyYW1lcyBBYm9ydGVkIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIExpc3RpbmcgZm9yIElFRUUtU3VwcG9ydGVkIENvdW50IFJlZ2lzdGVycyAqLworCisjZGVmaW5lIEZyYW1lc1JlY2VpdmVkT0sgICAgICAgICAgICAgICAgRU1BQ19SWENfT0sgICAgICAgIC8qIFJYIEZyYW1lIFN1Y2Nlc3NmdWwgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRnJhbWVDaGVja1NlcXVlbmNlRXJyb3JzICAgICAgICBFTUFDX1JYQ19GQ1MgICAgICAgLyogUlggRnJhbWUgRkNTIEZhaWx1cmUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBbGlnbm1lbnRFcnJvcnMgICAgICAgICAgICAgICAgIEVNQUNfUlhDX0FMSUdOICAgICAvKiBSWCBBbGlnbm1lbnQgRXJyb3IgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE9jdGV0c1JlY2VpdmVkT0sgICAgICAgICAgICAgICAgRU1BQ19SWENfT0NURVQgICAgIC8qIFJYIE9jdGV0cyBTdWNjZXNzZnVsbHkgUmVjZWl2ZWQgQ291bnQgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRnJhbWVzTG9zdER1ZVRvSW50TUFDUmN2RXJyb3IgICBFTUFDX1JYQ19ETUFPVkYgICAgLyogSW50ZXJuYWwgTUFDIFN1YmxheWVyIEVycm9yIFJYIEZyYW1lIENvdW50ICAgICAgICAgICAqLworI2RlZmluZSBVbmljYXN0RnJhbWVzUmVjZWl2ZWRPSyAgICAgICAgIEVNQUNfUlhDX1VOSUNTVCAgICAvKiBVbmljYXN0IFJYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE11bHRpY2FzdEZyYW1lc1JlY2VpdmVkT0sgICAgICAgRU1BQ19SWENfTVVMVEkgICAgIC8qIE11bHRpY2FzdCBSWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQnJvYWRjYXN0RnJhbWVzUmVjZWl2ZWRPSyAgICAgICBFTUFDX1JYQ19CUk9BRCAgICAgLyogQnJvYWRjYXN0IFJYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBJblJhbmdlTGVuZ3RoRXJyb3JzICAgICAgICAgICAgIEVNQUNfUlhDX0xORVJSSSAgICAvKiBSWCBGcmFtZSBJbiBSYW5nZSBFcnJvciBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE91dE9mUmFuZ2VMZW5ndGhGaWVsZCAgICAgICAgICAgRU1BQ19SWENfTE5FUlJPICAgIC8qIFJYIEZyYW1lIE91dCBPZiBSYW5nZSBFcnJvciBDb3VudCAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRnJhbWVUb29Mb25nRXJyb3JzICAgICAgICAgICAgICBFTUFDX1JYQ19MT05HICAgICAgLyogUlggRnJhbWUgVG9vIExvbmcgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNQUNDb250cm9sRnJhbWVzUmVjZWl2ZWQgICAgICAgIEVNQUNfUlhDX01BQ0NUTCAgICAvKiBNQUMgQ29udHJvbCBSWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVuc3VwcG9ydGVkT3Bjb2Rlc1JlY2VpdmVkICAgICAgRU1BQ19SWENfT1BDT0RFICAgIC8qIFVuc3VwcG9ydGVkIE9wLUNvZGUgUlggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUEFVU0VNQUNDdHJsRnJhbWVzUmVjZWl2ZWQgICAgICBFTUFDX1JYQ19QQVVTRSAgICAgLyogTUFDIENvbnRyb2wgUGF1c2UgUlggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGcmFtZXNSZWNlaXZlZEFsbCAgICAgICAgICAgICAgIEVNQUNfUlhDX0FMTEZSTSAgICAvKiBPdmVyYWxsIFJYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE9jdGV0c1JlY2VpdmVkQWxsICAgICAgICAgICAgICAgRU1BQ19SWENfQUxMT0NUICAgIC8qIE92ZXJhbGwgUlggT2N0ZXQgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVHlwZWRGcmFtZXNSZWNlaXZlZCAgICAgICAgICAgICBFTUFDX1JYQ19UWVBFRCAgICAgLyogVHlwZS9MZW5ndGggQ29uc2lzdGVudCBSWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGcmFtZXNMZW5MdDY0UmVjZWl2ZWQgICAgICAgICAgIEVNQUNfUlhDX1NIT1JUICAgICAvKiBSWCBGcmFtZSBGcmFnbWVudCBDb3VudCAtIEJ5dGUgQ291bnQgeCA8IDY0ICAgICAgICAgICovCisjZGVmaW5lIEZyYW1lc0xlbkVxNjRSZWNlaXZlZCAgICAgICAgICAgRU1BQ19SWENfRVE2NCAgICAgIC8qIEdvb2QgUlggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IHggPSA2NCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRnJhbWVzTGVuNjVfMTI3UmVjZWl2ZWQgICAgICAgICBFTUFDX1JYQ19MVDEyOCAgICAgLyogR29vZCBSWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgIDY0IDwgeCA8IDEyOCAgICAgICAqLworI2RlZmluZSBGcmFtZXNMZW4xMjhfMjU1UmVjZWl2ZWQgICAgICAgIEVNQUNfUlhDX0xUMjU2ICAgICAvKiBHb29kIFJYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCAxMjggPD0geCA8IDI1NiAgICAgICovCisjZGVmaW5lIEZyYW1lc0xlbjI1Nl81MTFSZWNlaXZlZCAgICAgICAgRU1BQ19SWENfTFQ1MTIgICAgIC8qIEdvb2QgUlggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IDI1NiA8PSB4IDwgNTEyICAgICAgKi8KKyNkZWZpbmUgRnJhbWVzTGVuNTEyXzEwMjNSZWNlaXZlZCAgICAgICBFTUFDX1JYQ19MVDEwMjQgICAgLyogR29vZCBSWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgNTEyIDw9IHggPCAxMDI0ICAgICAqLworI2RlZmluZSBGcmFtZXNMZW4xMDI0X01heFJlY2VpdmVkICAgICAgIEVNQUNfUlhDX0dFMTAyNCAgICAvKiBHb29kIFJYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCB4ID49IDEwMjQgICAgICAgICAgICovCisKKyNkZWZpbmUgRnJhbWVzVHJhbnNtaXR0ZWRPSyAgICAgICAgICAgICBFTUFDX1RYQ19PSyAgICAgICAgLyogVFggRnJhbWUgU3VjY2Vzc2Z1bCBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTaW5nbGVDb2xsaXNpb25GcmFtZXMgICAgICAgICAgIEVNQUNfVFhDXzFDT0wgICAgICAvKiBUWCBGcmFtZXMgU3VjY2Vzc2Z1bCBBZnRlciBTaW5nbGUgQ29sbGlzaW9uIENvdW50ICAgICovCisjZGVmaW5lIE11bHRpcGxlQ29sbGlzaW9uRnJhbWVzICAgICAgICAgRU1BQ19UWENfR1QxQ09MICAgIC8qIFRYIEZyYW1lcyBTdWNjZXNzZnVsIEFmdGVyIE11bHRpcGxlIENvbGxpc2lvbnMgQ291bnQgKi8KKyNkZWZpbmUgT2N0ZXRzVHJhbnNtaXR0ZWRPSyAgICAgICAgICAgICBFTUFDX1RYQ19PQ1RFVCAgICAgLyogVFggT2N0ZXRzIFN1Y2Nlc3NmdWxseSBSZWNlaXZlZCBDb3VudCAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGcmFtZXNXaXRoRGVmZXJyZWRYbWlzc2lvbnMgICAgIEVNQUNfVFhDX0RFRkVSICAgICAvKiBUWCBGcmFtZSBEZWxheWVkIER1ZSBUbyBCdXN5IENvdW50ICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExhdGVDb2xsaXNpb25zICAgICAgICAgICAgICAgICAgRU1BQ19UWENfTEFURUNMICAgIC8qIExhdGUgVFggQ29sbGlzaW9ucyBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRnJhbWVzQWJvcnRlZER1ZVRvWFNDb2xscyAgICAgICBFTUFDX1RYQ19YU19DT0wgICAgLyogVFggRnJhbWUgRmFpbGVkIER1ZSBUbyBFeGNlc3NpdmUgQ29sbGlzaW9ucyBDb3VudCAgICAqLworI2RlZmluZSBGcmFtZXNMb3N0RHVlVG9JbnRNYWNYbWl0RXJyb3IgIEVNQUNfVFhDX0RNQVVORCAgICAvKiBJbnRlcm5hbCBNQUMgU3VibGF5ZXIgRXJyb3IgVFggRnJhbWUgQ291bnQgICAgICAgICAgICovCisjZGVmaW5lIENhcnJpZXJTZW5zZUVycm9ycyAgICAgICAgICAgICAgRU1BQ19UWENfQ1JTRVJSICAgIC8qIENhcnJpZXIgU2Vuc2UgRGVhc3NlcnRlZCBEdXJpbmcgVFggRnJhbWUgQ291bnQgICAgICAgKi8KKyNkZWZpbmUgVW5pY2FzdEZyYW1lc1htaXR0ZWRPSyAgICAgICAgICBFTUFDX1RYQ19VTklDU1QgICAgLyogVW5pY2FzdCBUWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNdWx0aWNhc3RGcmFtZXNYbWl0dGVkT0sgICAgICAgIEVNQUNfVFhDX01VTFRJICAgICAvKiBNdWx0aWNhc3QgVFggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJyb2FkY2FzdEZyYW1lc1htaXR0ZWRPSyAgICAgICAgRU1BQ19UWENfQlJPQUQgICAgIC8qIEJyb2FkY2FzdCBUWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRnJhbWVzV2l0aEV4Y2Vzc2l2ZURlZmVycmFsICAgICBFTUFDX1RYQ19YU19ERlIgICAgLyogVFggRnJhbWVzIFdpdGggRXhjZXNzaXZlIERlZmVycmFsIENvdW50ICAgICAgICAgICAgICAqLworI2RlZmluZSBNQUNDb250cm9sRnJhbWVzVHJhbnNtaXR0ZWQgICAgIEVNQUNfVFhDX01BQ0NUTCAgICAvKiBNQUMgQ29udHJvbCBUWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZyYW1lc1RyYW5zbWl0dGVkQWxsICAgICAgICAgICAgRU1BQ19UWENfQUxMRlJNICAgIC8qIE92ZXJhbGwgVFggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgT2N0ZXRzVHJhbnNtaXR0ZWRBbGwgICAgICAgICAgICBFTUFDX1RYQ19BTExPQ1QgICAgLyogT3ZlcmFsbCBUWCBPY3RldCBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGcmFtZXNMZW5FcTY0VHJhbnNtaXR0ZWQgICAgICAgIEVNQUNfVFhDX0VRNjQgICAgICAvKiBHb29kIFRYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCB4ID0gNjQgICAgICAgICAgICAgICovCisjZGVmaW5lIEZyYW1lc0xlbjY1XzEyN1RyYW5zbWl0dGVkICAgICAgRU1BQ19UWENfTFQxMjggICAgIC8qIEdvb2QgVFggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50ICA2NCA8IHggPCAxMjggICAgICAgKi8KKyNkZWZpbmUgRnJhbWVzTGVuMTI4XzI1NVRyYW5zbWl0dGVkICAgICBFTUFDX1RYQ19MVDI1NiAgICAgLyogR29vZCBUWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgMTI4IDw9IHggPCAyNTYgICAgICAqLworI2RlZmluZSBGcmFtZXNMZW4yNTZfNTExVHJhbnNtaXR0ZWQgICAgIEVNQUNfVFhDX0xUNTEyICAgICAvKiBHb29kIFRYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCAyNTYgPD0geCA8IDUxMiAgICAgICovCisjZGVmaW5lIEZyYW1lc0xlbjUxMl8xMDIzVHJhbnNtaXR0ZWQgICAgRU1BQ19UWENfTFQxMDI0ICAgIC8qIEdvb2QgVFggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IDUxMiA8PSB4IDwgMTAyNCAgICAgKi8KKyNkZWZpbmUgRnJhbWVzTGVuMTAyNF9NYXhUcmFuc21pdHRlZCAgICBFTUFDX1RYQ19HRTEwMjQgICAgLyogR29vZCBUWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgeCA+PSAxMDI0ICAgICAgICAgICAqLworI2RlZmluZSBUeEFib3J0ZWRGcmFtZXMgICAgICAgICAgICAgICAgIEVNQUNfVFhDX0FCT1JUICAgICAvKiBUb3RhbCBUWCBGcmFtZXMgQWJvcnRlZCBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogU3lzdGVtIE1NUiBSZWdpc3RlciBCaXRzIEFuZCBNYWNyb3MKKyoqCisqKiBEaXNjbGFpbWVyOglBbGwgbWFjcm9zIGFyZSBpbnRlbmRlZCB0byBtYWtlIEMgYW5kIEFzc2VtYmx5IGNvZGUgbW9yZSByZWFkYWJsZS4KKyoqCQkJCVVzZSB0aGVzZSBtYWNyb3MgY2FyZWZ1bGx5LCBhcyBhbnkgdGhhdCBkbyBsZWZ0IHNoaWZ0cyBmb3IgZmllbGQKKyoqCQkJCWRlcG9zaXRpbmcgd2lsbCByZXN1bHQgaW4gdGhlIGxvd2VyIG9yZGVyIGJpdHMgYmVpbmcgZGVzdHJveWVkLiAgQW55CisqKgkJCQltYWNybyB0aGF0IHNoaWZ0cyBsZWZ0IHRvIHByb3Blcmx5IHBvc2l0aW9uIHRoZSBiaXQtZmllbGQgc2hvdWxkIGJlCisqKgkJCQl1c2VkIGFzIHBhcnQgb2YgYW4gT1IgdG8gaW5pdGlhbGl6ZSBhIHJlZ2lzdGVyIGFuZCBOT1QgYXMgYSBkeW5hbWljCisqKgkJCQltb2RpZmllciBVTkxFU1MgdGhlIGxvd2VyIG9yZGVyIGJpdHMgYXJlIHNhdmVkIGFuZCBPUmVkIGJhY2sgaW4gd2hlbgorKioJCQkJdGhlIG1hY3JvIGlzIHVzZWQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqICBFVEhFUk5FVCAxMC8xMDAgQ09OVFJPTExFUiBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBFTUFDX09QTU9ERSBNYXNrcyAqLworCisjZGVmaW5lCVJFICAgICAgICAgICAgICAgICAweDAwMDAwMDAxICAgICAvKiBSZWNlaXZlciBFbmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlBU1RQICAgICAgICAgICAgICAgMHgwMDAwMDAwMiAgICAgLyogRW5hYmxlIEF1dG9tYXRpYyBQYWQgU3RyaXBwaW5nIE9uIFJYIEZyYW1lcyAgICAgICAgKi8KKyNkZWZpbmUJSFUgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAgICAgIC8qIEhhc2ggRmlsdGVyIFVuaWNhc3QgQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCUhNICAgICAgICAgICAgICAgICAweDAwMDAwMDIwICAgICAvKiBIYXNoIEZpbHRlciBNdWx0aWNhc3QgQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlQQU0gICAgICAgICAgICAgICAgMHgwMDAwMDA0MCAgICAgLyogUGFzcy1BbGwtTXVsdGljYXN0IE1vZGUgRW5hYmxlICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUFIgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAgICAgIC8qIFByb21pc2N1b3VzIE1vZGUgRW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCUlGRSAgICAgICAgICAgICAgICAweDAwMDAwMTAwICAgICAvKiBJbnZlcnNlIEZpbHRlcmluZyBFbmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlEQkYgICAgICAgICAgICAgICAgMHgwMDAwMDIwMCAgICAgLyogRGlzYWJsZSBCcm9hZGNhc3QgRnJhbWUgUmVjZXB0aW9uICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUEJGICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAgICAgIC8qIFBhc3MgQmFkIEZyYW1lcyBFbmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVBTRiAgICAgICAgICAgICAgICAweDAwMDAwODAwICAgICAvKiBQYXNzIFNob3J0IEZyYW1lcyBFbmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSQUYgICAgICAgICAgICAgICAgMHgwMDAwMTAwMCAgICAgLyogUmVjZWl2ZS1BbGwgTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVEUgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAgICAgIC8qIFRyYW5zbWl0dGVyIEVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCURUWFBBRCAgICAgICAgICAgICAweDAwMDIwMDAwICAgICAvKiBEaXNhYmxlIEF1dG9tYXRpYyBUWCBQYWRkaW5nICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlEVFhDUkMgICAgICAgICAgICAgMHgwMDA0MDAwMCAgICAgLyogRGlzYWJsZSBBdXRvbWF0aWMgVFggQ1JDIEdlbmVyYXRpb24gICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJREMgICAgICAgICAgICAgICAgIDB4MDAwODAwMDAgICAgIC8qIERlZmVycmFsIENoZWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCUJPTE1UICAgICAgICAgICAgICAweDAwMzAwMDAwICAgICAvKiBCYWNrLU9mZiBMaW1pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlCT0xNVF8xMCAgICAgICAgICAgMHgwMDAwMDAwMCAgICAgLyoJCTEwLWJpdCByYW5nZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlCT0xNVF84ICAgICAgICAgICAgMHgwMDEwMDAwMCAgICAgLyoJCTgtYml0IHJhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlCT0xNVF80ICAgICAgICAgICAgMHgwMDIwMDAwMCAgICAgLyoJCTQtYml0IHJhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlCT0xNVF8xICAgICAgICAgICAgMHgwMDMwMDAwMCAgICAgLyoJCTEtYml0IHJhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlEUlRZICAgICAgICAgICAgICAgMHgwMDQwMDAwMCAgICAgLyogRGlzYWJsZSBUWCBSZXRyeSBPbiBDb2xsaXNpb24gICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJTENUUkUgICAgICAgICAgICAgIDB4MDA4MDAwMDAgICAgIC8qIEVuYWJsZSBUWCBSZXRyeSBPbiBMYXRlIENvbGxpc2lvbiAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJNSUkgICAgICAgICAgICAgICAweDAxMDAwMDAwICAgICAvKiBSTUlJL01JSSogTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSTUlJXzEwICAgICAgICAgICAgMHgwMjAwMDAwMCAgICAgLyogU3BlZWQgU2VsZWN0IGZvciBSTUlJIFBvcnQgKDEwTUJpdC8xMDBNQml0KikgICAgICAgKi8KKyNkZWZpbmUJRkRNT0RFICAgICAgICAgICAgIDB4MDQwMDAwMDAgICAgIC8qIER1cGxleCBNb2RlIEVuYWJsZSAoRnVsbC9IYWxmKikgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCUxCICAgICAgICAgICAgICAgICAweDA4MDAwMDAwICAgICAvKiBJbnRlcm5hbCBMb29wYmFjayBFbmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlEUk8gICAgICAgICAgICAgICAgMHgxMDAwMDAwMCAgICAgLyogRGlzYWJsZSBSZWNlaXZlIE93biBGcmFtZXMgKEhhbGYtRHVwbGV4IE1vZGUpICAgICAgKi8KKworLyogRU1BQ19TVEFBREQgTWFza3MgKi8KKworI2RlZmluZQlTVEFCVVNZICAgICAgICAgICAgMHgwMDAwMDAwMSAgICAgLyogSW5pdGlhdGUgU3RhdGlvbiBNZ3QgUmVnIEFjY2VzcyAvIFNUQSBCdXN5IFN0YXQgICAgKi8KKyNkZWZpbmUJU1RBT1AgICAgICAgICAgICAgIDB4MDAwMDAwMDIgICAgIC8qIFN0YXRpb24gTWFuYWdlbWVudCBPcGVyYXRpb24gQ29kZSAoV3JpdGUvUmVhZCopICAgICovCisjZGVmaW5lCVNUQURJU1BSRSAgICAgICAgICAweDAwMDAwMDA0ICAgICAvKiBEaXNhYmxlIFByZWFtYmxlIEdlbmVyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlTVEFJRSAgICAgICAgICAgICAgMHgwMDAwMDAwOCAgICAgLyogU3RhdGlvbiBNZ3QuIFRyYW5zZmVyIERvbmUgSW50ZXJydXB0IEVuYWJsZSAgICAgICAgKi8KKyNkZWZpbmUJUkVHQUQgICAgICAgICAgICAgIDB4MDAwMDA3QzAgICAgIC8qIFNUQSBSZWdpc3RlciBBZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVBIWUFEICAgICAgICAgICAgICAweDAwMDBGODAwICAgICAvKiBQSFkgRGV2aWNlIEFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lCVNFVF9SRUdBRCh4KSAoKCh4KSYweDFGKTw8ICA2ICkgICAvKiBTZXQgU1RBIFJlZ2lzdGVyIEFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlTRVRfUEhZQUQoeCkgKCgoeCkmMHgxRik8PCAxMSApICAgLyogU2V0IFBIWSBEZXZpY2UgQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogRU1BQ19TVEFEQVQgTWFzayAqLworCisjZGVmaW5lCVNUQURBVEEgICAgICAgICAgICAweDAwMDBGRkZGICAgICAvKiBTdGF0aW9uIE1hbmFnZW1lbnQgRGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBFTUFDX0ZMQyBNYXNrcyAqLworCisjZGVmaW5lCUZMQ0JVU1kgICAgICAgICAgICAweDAwMDAwMDAxICAgICAvKiBTZW5kIEZsb3cgQ3RybCBGcmFtZSAvIEZsb3cgQ3RybCBCdXN5IFN0YXR1cyAgICAgICAqLworI2RlZmluZQlGTENFICAgICAgICAgICAgICAgMHgwMDAwMDAwMiAgICAgLyogRmxvdyBDb250cm9sIEVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUENGICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQgICAgIC8qIFBhc3MgQ29udHJvbCBGcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCUJLUFJTRU4gICAgICAgICAgICAweDAwMDAwMDA4ICAgICAvKiBFbmFibGUgQmFja3ByZXNzdXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlGTENQQVVTRSAgICAgICAgICAgMHhGRkZGMDAwMCAgICAgLyogUGF1c2UgVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZQlTRVRfRkxDUEFVU0UoeCkgKCgoeCkmMHhGRkZGKTw8IDE2KSAvKiBTZXQgUGF1c2UgVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogRU1BQ19XS1VQX0NUTCBNYXNrcyAqLworCisjZGVmaW5lCUNBUFdLRlJNICAgICAgICAgICAweDAwMDAwMDAxICAgIC8qIENhcHR1cmUgV2FrZS1VcCBGcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlNUEtFICAgICAgICAgICAgICAgMHgwMDAwMDAwMiAgICAvKiBNYWdpYyBQYWNrZXQgRW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUldLRSAgICAgICAgICAgICAgIDB4MDAwMDAwMDQgICAgLyogUmVtb3RlIFdha2UtVXAgRnJhbWUgRW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCUdVV0tFICAgICAgICAgICAgICAweDAwMDAwMDA4ICAgIC8qIEdsb2JhbCBVbmljYXN0IFdha2UgRW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlNUEtTICAgICAgICAgICAgICAgMHgwMDAwMDAyMCAgICAvKiBNYWdpYyBQYWNrZXQgUmVjZWl2ZWQgU3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUldLUyAgICAgICAgICAgICAgIDB4MDAwMDBGMDAgICAgLyogV2FrZS1VcCBGcmFtZSBSZWNlaXZlZCBTdGF0dXMsIEZpbHRlcnMgMzowICAgICAgICAgICovCisKKy8qIEVNQUNfV0tVUF9GRkNNRCBNYXNrcyAqLworCisjZGVmaW5lCVdGMF9FICAgICAgICAgICAgICAweDAwMDAwMDAxICAgIC8qIEVuYWJsZSBXYWtlLVVwIEZpbHRlciAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJV0YwX1QgICAgICAgICAgICAgIDB4MDAwMDAwMDggICAgLyogV2FrZS1VcCBGaWx0ZXIgMCBBZGRyIFR5cGUgKE11bHRpY2FzdC9VbmljYXN0KikgICAgICAqLworI2RlZmluZQlXRjFfRSAgICAgICAgICAgICAgMHgwMDAwMDEwMCAgICAvKiBFbmFibGUgV2FrZS1VcCBGaWx0ZXIgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVdGMV9UICAgICAgICAgICAgICAweDAwMDAwODAwICAgIC8qIFdha2UtVXAgRmlsdGVyIDEgQWRkciBUeXBlIChNdWx0aWNhc3QvVW5pY2FzdCopICAgICAgKi8KKyNkZWZpbmUJV0YyX0UgICAgICAgICAgICAgIDB4MDAwMTAwMDAgICAgLyogRW5hYmxlIFdha2UtVXAgRmlsdGVyIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlXRjJfVCAgICAgICAgICAgICAgMHgwMDA4MDAwMCAgICAvKiBXYWtlLVVwIEZpbHRlciAyIEFkZHIgVHlwZSAoTXVsdGljYXN0L1VuaWNhc3QqKSAgICAgICovCisjZGVmaW5lCVdGM19FICAgICAgICAgICAgICAweDAxMDAwMDAwICAgIC8qIEVuYWJsZSBXYWtlLVVwIEZpbHRlciAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJV0YzX1QgICAgICAgICAgICAgIDB4MDgwMDAwMDAgICAgLyogV2FrZS1VcCBGaWx0ZXIgMyBBZGRyIFR5cGUgKE11bHRpY2FzdC9VbmljYXN0KikgICAgICAqLworCisvKiBFTUFDX1dLVVBfRkZPRkYgTWFza3MgKi8KKworI2RlZmluZQlXRjBfT0ZGICAgICAgICAgICAgMHgwMDAwMDBGRiAgICAvKiBXYWtlLVVwIEZpbHRlciAwIFBhdHRlcm4gT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVdGMV9PRkYgICAgICAgICAgICAweDAwMDBGRjAwICAgIC8qIFdha2UtVXAgRmlsdGVyIDEgUGF0dGVybiBPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJV0YyX09GRiAgICAgICAgICAgIDB4MDBGRjAwMDAgICAgLyogV2FrZS1VcCBGaWx0ZXIgMiBQYXR0ZXJuIE9mZnNldCAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlXRjNfT0ZGICAgICAgICAgICAgMHhGRjAwMDAwMCAgICAvKiBXYWtlLVVwIEZpbHRlciAzIFBhdHRlcm4gT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUJU0VUX1dGMF9PRkYoeCkgKCgoeCkmMHhGRik8PCAgMCApIC8qIFNldCBXYWtlLVVwIEZpbHRlciAwIEJ5dGUgT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlTRVRfV0YxX09GRih4KSAoKCh4KSYweEZGKTw8ICA4ICkgLyogU2V0IFdha2UtVXAgRmlsdGVyIDEgQnl0ZSBPZmZzZXQgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVNFVF9XRjJfT0ZGKHgpICgoKHgpJjB4RkYpPDwgMTYgKSAvKiBTZXQgV2FrZS1VcCBGaWx0ZXIgMiBCeXRlIE9mZnNldCAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJU0VUX1dGM19PRkYoeCkgKCgoeCkmMHhGRik8PCAyNCApIC8qIFNldCBXYWtlLVVwIEZpbHRlciAzIEJ5dGUgT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAqLworLyogU2V0IEFMTCBPZmZzZXRzICovCisjZGVmaW5lCVNFVF9XRl9PRkZTKHgwLHgxLHgyLHgzKSAoU0VUX1dGMF9PRkYoKHgwKSl8U0VUX1dGMV9PRkYoKHgxKSl8U0VUX1dGMl9PRkYoKHgyKSl8U0VUX1dGM19PRkYoKHgzKSkpCisKKy8qIEVNQUNfV0tVUF9GRkNSQzAgTWFza3MgKi8KKworI2RlZmluZQlXRjBfQ1JDICAgICAgICAgICAweDAwMDBGRkZGICAgIC8qIFdha2UtVXAgRmlsdGVyIDAgUGF0dGVybiBDUkMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlXRjFfQ1JDICAgICAgICAgICAweEZGRkYwMDAwICAgIC8qIFdha2UtVXAgRmlsdGVyIDEgUGF0dGVybiBDUkMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lCVNFVF9XRjBfQ1JDKHgpICgoKHgpJjB4RkZGRik8PCAgIDAgKSAvKiBTZXQgV2FrZS1VcCBGaWx0ZXIgMCBUYXJnZXQgQ1JDICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVNFVF9XRjFfQ1JDKHgpICgoKHgpJjB4RkZGRik8PCAgMTYgKSAvKiBTZXQgV2FrZS1VcCBGaWx0ZXIgMSBUYXJnZXQgQ1JDICAgICAgICAgICAgICAgICAgICovCisKKy8qIEVNQUNfV0tVUF9GRkNSQzEgTWFza3MgKi8KKworI2RlZmluZQlXRjJfQ1JDICAgICAgICAgICAweDAwMDBGRkZGICAgIC8qIFdha2UtVXAgRmlsdGVyIDIgUGF0dGVybiBDUkMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlXRjNfQ1JDICAgICAgICAgICAweEZGRkYwMDAwICAgIC8qIFdha2UtVXAgRmlsdGVyIDMgUGF0dGVybiBDUkMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lCVNFVF9XRjJfQ1JDKHgpICgoKHgpJjB4RkZGRik8PCAgIDAgKSAvKiBTZXQgV2FrZS1VcCBGaWx0ZXIgMiBUYXJnZXQgQ1JDICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVNFVF9XRjNfQ1JDKHgpICgoKHgpJjB4RkZGRik8PCAgMTYgKSAvKiBTZXQgV2FrZS1VcCBGaWx0ZXIgMyBUYXJnZXQgQ1JDICAgICAgICAgICAgICAgICAgICovCisKKy8qIEVNQUNfU1lTQ1RMIE1hc2tzICovCisKKyNkZWZpbmUJUEhZSUUgICAgICAgICAgICAgMHgwMDAwMDAwMSAgICAvKiBQSFlfSU5UIEludGVycnVwdCBFbmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhEV0EgICAgICAgICAgICAgMHgwMDAwMDAwMiAgICAvKiBSZWNlaXZlIEZyYW1lIERNQSBXb3JkIEFsaWdubWVudCAoT2RkL0V2ZW4qKSAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhDS1MgICAgICAgICAgICAgMHgwMDAwMDAwNCAgICAvKiBFbmFibGUgUlggRnJhbWUgVENQL1VEUCBDaGVja3N1bSBDb21wdXRhdGlvbiAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhEV0EgICAgICAgICAgICAgMHgwMDAwMDAxMCAgICAvKiBUcmFuc21pdCBGcmFtZSBETUEgV29yZCBBbGlnbm1lbnQgKE9kZC9FdmVuKikgICAgICAgICAgKi8KKyNkZWZpbmUJTURDRElWICAgICAgICAgICAgMHgwMDAwM0YwMCAgICAvKiBTQ0xLOk1EQyBDbG9jayBEaXZpc29yIFtNREM9U0NMSy8oMiooTisxKSldICAgICAgICAgICAgKi8KKworI2RlZmluZQlTRVRfTURDRElWKHgpICgoKHgpJjB4M0YpPDwgOCkgICAvKiBTZXQgTURDIENsb2NrIERpdmlzb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBFTUFDX1NZU1RBVCBNYXNrcyAqLworCisjZGVmaW5lCVBIWUlOVCAgICAgICAgICAgIDB4MDAwMDAwMDEgICAgLyogUEhZX0lOVCBJbnRlcnJ1cHQgU3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCU1NQ0lOVCAgICAgICAgICAgIDB4MDAwMDAwMDIgICAgLyogTU1DIENvdW50ZXIgSW50ZXJydXB0IFN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYRlNJTlQgICAgICAgICAgIDB4MDAwMDAwMDQgICAgLyogUlggRnJhbWUtU3RhdHVzIEludGVycnVwdCBTdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYRlNJTlQgICAgICAgICAgIDB4MDAwMDAwMDggICAgLyogVFggRnJhbWUtU3RhdHVzIEludGVycnVwdCBTdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVdBS0VERVQgICAgICAgICAgIDB4MDAwMDAwMTAgICAgLyogV2FrZS1VcCBEZXRlY3RlZCBTdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYRE1BRVJSICAgICAgICAgIDB4MDAwMDAwMjAgICAgLyogUlggRE1BIERpcmVjdGlvbiBFcnJvciBTdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYRE1BRVJSICAgICAgICAgIDB4MDAwMDAwNDAgICAgLyogVFggRE1BIERpcmVjdGlvbiBFcnJvciBTdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVNUTURPTkUgICAgICAgICAgIDB4MDAwMDAwODAgICAgLyogU3RhdGlvbiBNZ3QuIFRyYW5zZmVyIERvbmUgSW50ZXJydXB0IFN0YXR1cyAgICAgICAgICAgICovCisKKy8qIEVNQUNfUlhfU1RBVCwgRU1BQ19SWF9TVEtZLCBhbmQgRU1BQ19SWF9JUlFFIE1hc2tzICovCisKKyNkZWZpbmUJUlhfRlJMRU4gICAgICAgICAgMHgwMDAwMDdGRiAgICAvKiBGcmFtZSBMZW5ndGggSW4gQnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfQ09NUCAgICAgICAgICAgMHgwMDAwMTAwMCAgICAvKiBSWCBGcmFtZSBDb21wbGV0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfT0sgICAgICAgICAgICAgMHgwMDAwMjAwMCAgICAvKiBSWCBGcmFtZSBSZWNlaXZlZCBXaXRoIE5vIEVycm9ycyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfTE9ORyAgICAgICAgICAgMHgwMDAwNDAwMCAgICAvKiBSWCBGcmFtZSBUb28gTG9uZyBFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfQUxJR04gICAgICAgICAgMHgwMDAwODAwMCAgICAvKiBSWCBGcmFtZSBBbGlnbm1lbnQgRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfQ1JDICAgICAgICAgICAgMHgwMDAxMDAwMCAgICAvKiBSWCBGcmFtZSBDUkMgRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfTEVOICAgICAgICAgICAgMHgwMDAyMDAwMCAgICAvKiBSWCBGcmFtZSBMZW5ndGggRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfRlJBRyAgICAgICAgICAgMHgwMDA0MDAwMCAgICAvKiBSWCBGcmFtZSBGcmFnbWVudCBFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfQUREUiAgICAgICAgICAgMHgwMDA4MDAwMCAgICAvKiBSWCBGcmFtZSBBZGRyZXNzIEZpbHRlciBGYWlsZWQgRXJyb3IgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfRE1BTyAgICAgICAgICAgMHgwMDEwMDAwMCAgICAvKiBSWCBGcmFtZSBETUEgT3ZlcnJ1biBFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfUEhZICAgICAgICAgICAgMHgwMDIwMDAwMCAgICAvKiBSWCBGcmFtZSBQSFkgRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfTEFURSAgICAgICAgICAgMHgwMDQwMDAwMCAgICAvKiBSWCBGcmFtZSBMYXRlIENvbGxpc2lvbiBFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfUkFOR0UgICAgICAgICAgMHgwMDgwMDAwMCAgICAvKiBSWCBGcmFtZSBMZW5ndGggRmllbGQgT3V0IG9mIFJhbmdlIEVycm9yICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfTVVMVEkgICAgICAgICAgMHgwMTAwMDAwMCAgICAvKiBSWCBNdWx0aWNhc3QgRnJhbWUgSW5kaWNhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfQlJPQUQgICAgICAgICAgMHgwMjAwMDAwMCAgICAvKiBSWCBCcm9hZGNhc3QgRnJhbWUgSW5kaWNhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfQ1RMICAgICAgICAgICAgMHgwNDAwMDAwMCAgICAvKiBSWCBDb250cm9sIEZyYW1lIEluZGljYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfVUNUTCAgICAgICAgICAgMHgwODAwMDAwMCAgICAvKiBVbnN1cHBvcnRlZCBSWCBDb250cm9sIEZyYW1lIEluZGljYXRvciAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfVFlQRSAgICAgICAgICAgMHgxMDAwMDAwMCAgICAvKiBSWCBUeXBlZCBGcmFtZSBJbmRpY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfVkxBTjEgICAgICAgICAgMHgyMDAwMDAwMCAgICAvKiBSWCBWTEFOMSBGcmFtZSBJbmRpY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfVkxBTjIgICAgICAgICAgMHg0MDAwMDAwMCAgICAvKiBSWCBWTEFOMiBGcmFtZSBJbmRpY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfQUNDRVBUICAgICAgICAgMHg4MDAwMDAwMCAgICAvKiBSWCBGcmFtZSBBY2NlcHRlZCBJbmRpY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogIEVNQUNfVFhfU1RBVCwgRU1BQ19UWF9TVEtZLCBhbmQgRU1BQ19UWF9JUlFFIE1hc2tzICAqLworCisjZGVmaW5lCVRYX0NPTVAgICAgICAgICAgIDB4MDAwMDAwMDEgICAgLyogVFggRnJhbWUgQ29tcGxldGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX09LICAgICAgICAgICAgIDB4MDAwMDAwMDIgICAgLyogVFggRnJhbWUgU2VudCBXaXRoIE5vIEVycm9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0VDT0xMICAgICAgICAgIDB4MDAwMDAwMDQgICAgLyogVFggRnJhbWUgRXhjZXNzaXZlIENvbGxpc2lvbiBFcnJvciAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0xBVEUgICAgICAgICAgIDB4MDAwMDAwMDggICAgLyogVFggRnJhbWUgTGF0ZSBDb2xsaXNpb24gRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0RNQVUgICAgICAgICAgIDB4MDAwMDAwMTAgICAgLyogVFggRnJhbWUgRE1BIFVuZGVycnVuIEVycm9yIChTVEFUKSAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX01BQ0UgICAgICAgICAgIDB4MDAwMDAwMTAgICAgLyogSW50ZXJuYWwgTUFDIEVycm9yIERldGVjdGVkIChTVEtZIGFuZCBJUlFFKSAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0VERUZFUiAgICAgICAgIDB4MDAwMDAwMjAgICAgLyogVFggRnJhbWUgRXhjZXNzaXZlIERlZmVycmFsIEVycm9yICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0JST0FEICAgICAgICAgIDB4MDAwMDAwNDAgICAgLyogVFggQnJvYWRjYXN0IEZyYW1lIEluZGljYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX01VTFRJICAgICAgICAgIDB4MDAwMDAwODAgICAgLyogVFggTXVsdGljYXN0IEZyYW1lIEluZGljYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0NDTlQgICAgICAgICAgIDB4MDAwMDBGMDAgICAgLyogVFggRnJhbWUgQ29sbGlzaW9uIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0RFRkVSICAgICAgICAgIDB4MDAwMDEwMDAgICAgLyogVFggRnJhbWUgRGVmZXJyZWQgSW5kaWNhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0NSUyAgICAgICAgICAgIDB4MDAwMDIwMDAgICAgLyogVFggRnJhbWUgQ2FycmllciBTZW5zZSBOb3QgQXNzZXJ0ZWQgRXJyb3IgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0xPU1MgICAgICAgICAgIDB4MDAwMDQwMDAgICAgLyogVFggRnJhbWUgQ2FycmllciBMb3N0IER1cmluZyBUWCBFcnJvciAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX1JFVFJZICAgICAgICAgIDB4MDAwMDgwMDAgICAgLyogVFggRnJhbWUgU3VjY2Vzc2Z1bCBBZnRlciBSZXRyeSAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0ZSTEVOICAgICAgICAgIDB4MDdGRjAwMDAgICAgLyogVFggRnJhbWUgTGVuZ3RoIChCeXRlcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIEVNQUNfTU1DX0NUTCBNYXNrcyAqLworI2RlZmluZQlSU1RDICAgICAgICAgICAgICAweDAwMDAwMDAxICAgIC8qIFJlc2V0IEFsbCBDb3VudGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlDUk9MTCAgICAgICAgICAgICAweDAwMDAwMDAyICAgIC8qIENvdW50ZXIgUm9sbC1PdmVyIEVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlDQ09SICAgICAgICAgICAgICAweDAwMDAwMDA0ICAgIC8qIENvdW50ZXIgQ2xlYXItT24tUmVhZCBNb2RlIEVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlNTUNFICAgICAgICAgICAgICAweDAwMDAwMDA4ICAgIC8qIEVuYWJsZSBNTUMgQ291bnRlciBPcGVyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBFTUFDX01NQ19SSVJRUyBhbmQgRU1BQ19NTUNfUklSUUUgTWFza3MgKi8KKyNkZWZpbmUJUlhfT0tfQ05UICAgICAgICAgMHgwMDAwMDAwMSAgICAvKiBSWCBGcmFtZXMgUmVjZWl2ZWQgV2l0aCBObyBFcnJvcnMgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfRkNTX0NOVCAgICAgICAgMHgwMDAwMDAwMiAgICAvKiBSWCBGcmFtZXMgVy9GcmFtZSBDaGVjayBTZXF1ZW5jZSBFcnJvcnMgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfQUxJR05fQ05UICAgICAgMHgwMDAwMDAwNCAgICAvKiBSWCBGcmFtZXMgV2l0aCBBbGlnbm1lbnQgRXJyb3JzICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfT0NURVRfQ05UICAgICAgMHgwMDAwMDAwOCAgICAvKiBSWCBPY3RldHMgUmVjZWl2ZWQgT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfTE9TVF9DTlQgICAgICAgMHgwMDAwMDAxMCAgICAvKiBSWCBGcmFtZXMgTG9zdCBEdWUgVG8gSW50ZXJuYWwgTUFDIFJYIEVycm9yICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfVU5JX0NOVCAgICAgICAgMHgwMDAwMDAyMCAgICAvKiBVbmljYXN0IFJYIEZyYW1lcyBSZWNlaXZlZCBPSyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfTVVMVElfQ05UICAgICAgMHgwMDAwMDA0MCAgICAvKiBNdWx0aWNhc3QgUlggRnJhbWVzIFJlY2VpdmVkIE9LICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfQlJPQURfQ05UICAgICAgMHgwMDAwMDA4MCAgICAvKiBCcm9hZGNhc3QgUlggRnJhbWVzIFJlY2VpdmVkIE9LICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfSVJMX0NOVCAgICAgICAgMHgwMDAwMDEwMCAgICAvKiBSWCBGcmFtZXMgV2l0aCBJbi1SYW5nZSBMZW5ndGggRXJyb3JzICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfT1JMX0NOVCAgICAgICAgMHgwMDAwMDIwMCAgICAvKiBSWCBGcmFtZXMgV2l0aCBPdXQtT2YtUmFuZ2UgTGVuZ3RoIEVycm9ycyAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfTE9OR19DTlQgICAgICAgMHgwMDAwMDQwMCAgICAvKiBSWCBGcmFtZXMgV2l0aCBGcmFtZSBUb28gTG9uZyBFcnJvcnMgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfTUFDQ1RMX0NOVCAgICAgMHgwMDAwMDgwMCAgICAvKiBNQUMgQ29udHJvbCBSWCBGcmFtZXMgUmVjZWl2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfT1BDT0RFX0NUTCAgICAgMHgwMDAwMTAwMCAgICAvKiBVbnN1cHBvcnRlZCBPcC1Db2RlIFJYIEZyYW1lcyBSZWNlaXZlZCAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfUEFVU0VfQ05UICAgICAgMHgwMDAwMjAwMCAgICAvKiBQQVVTRU1BQyBDb250cm9sIFJYIEZyYW1lcyBSZWNlaXZlZCAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfQUxMRl9DTlQgICAgICAgMHgwMDAwNDAwMCAgICAvKiBBbGwgUlggRnJhbWVzIFJlY2VpdmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfQUxMT19DTlQgICAgICAgMHgwMDAwODAwMCAgICAvKiBBbGwgUlggT2N0ZXRzIFJlY2VpdmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfVFlQRURfQ05UICAgICAgMHgwMDAxMDAwMCAgICAvKiBUeXBlZCBSWCBGcmFtZXMgUmVjZWl2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfU0hPUlRfQ05UICAgICAgMHgwMDAyMDAwMCAgICAvKiBSWCBGcmFtZSBGcmFnbWVudHMgKDwgNjQgQnl0ZXMpIFJlY2VpdmVkICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfRVE2NF9DTlQgICAgICAgMHgwMDA0MDAwMCAgICAvKiA2NC1CeXRlIFJYIEZyYW1lcyBSZWNlaXZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfTFQxMjhfQ05UICAgICAgMHgwMDA4MDAwMCAgICAvKiA2NS0xMjctQnl0ZSBSWCBGcmFtZXMgUmVjZWl2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfTFQyNTZfQ05UICAgICAgMHgwMDEwMDAwMCAgICAvKiAxMjgtMjU1LUJ5dGUgUlggRnJhbWVzIFJlY2VpdmVkICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfTFQ1MTJfQ05UICAgICAgMHgwMDIwMDAwMCAgICAvKiAyNTYtNTExLUJ5dGUgUlggRnJhbWVzIFJlY2VpdmVkICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfTFQxMDI0X0NOVCAgICAgMHgwMDQwMDAwMCAgICAvKiA1MTItMTAyMy1CeXRlIFJYIEZyYW1lcyBSZWNlaXZlZCAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfR0UxMDI0X0NOVCAgICAgMHgwMDgwMDAwMCAgICAvKiAxMDI0LU1heC1CeXRlIFJYIEZyYW1lcyBSZWNlaXZlZCAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogRU1BQ19NTUNfVElSUVMgYW5kIEVNQUNfTU1DX1RJUlFFIE1hc2tzICAqLworCisjZGVmaW5lCVRYX09LX0NOVCAgICAgICAgIDB4MDAwMDAwMDEgICAgLyogVFggRnJhbWVzIFNlbnQgT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX1NDT0xMX0NOVCAgICAgIDB4MDAwMDAwMDIgICAgLyogVFggRnJhbWVzIFdpdGggU2luZ2xlIENvbGxpc2lvbnMgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX01DT0xMX0NOVCAgICAgIDB4MDAwMDAwMDQgICAgLyogVFggRnJhbWVzIFdpdGggTXVsdGlwbGUgQ29sbGlzaW9ucyAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX09DVEVUX0NOVCAgICAgIDB4MDAwMDAwMDggICAgLyogVFggT2N0ZXRzIFNlbnQgT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0RFRkVSX0NOVCAgICAgIDB4MDAwMDAwMTAgICAgLyogVFggRnJhbWVzIFdpdGggRGVmZXJyZWQgVHJhbnNtaXNzaW9uICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0xBVEVfQ05UICAgICAgIDB4MDAwMDAwMjAgICAgLyogVFggRnJhbWVzIFdpdGggTGF0ZSBDb2xsaXNpb25zICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0FCT1JUQ19DTlQgICAgIDB4MDAwMDAwNDAgICAgLyogVFggRnJhbWVzIEFib3J0ZWQgRHVlIFRvIEV4Y2VzcyBDb2xsaXNpb25zICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0xPU1RfQ05UICAgICAgIDB4MDAwMDAwODAgICAgLyogVFggRnJhbWVzIExvc3QgRHVlIFRvIEludGVybmFsIE1BQyBUWCBFcnJvciAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0NSU19DTlQgICAgICAgIDB4MDAwMDAxMDAgICAgLyogVFggRnJhbWVzIFdpdGggQ2FycmllciBTZW5zZSBFcnJvcnMgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX1VOSV9DTlQgICAgICAgIDB4MDAwMDAyMDAgICAgLyogVW5pY2FzdCBUWCBGcmFtZXMgU2VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX01VTFRJX0NOVCAgICAgIDB4MDAwMDA0MDAgICAgLyogTXVsdGljYXN0IFRYIEZyYW1lcyBTZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0JST0FEX0NOVCAgICAgIDB4MDAwMDA4MDAgICAgLyogQnJvYWRjYXN0IFRYIEZyYW1lcyBTZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0VYREVGX0NUTCAgICAgIDB4MDAwMDEwMDAgICAgLyogVFggRnJhbWVzIFdpdGggRXhjZXNzaXZlIERlZmVycmFsICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX01BQ0NUTF9DTlQgICAgIDB4MDAwMDIwMDAgICAgLyogTUFDIENvbnRyb2wgVFggRnJhbWVzIFNlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0FMTEZfQ05UICAgICAgIDB4MDAwMDQwMDAgICAgLyogQWxsIFRYIEZyYW1lcyBTZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0FMTE9fQ05UICAgICAgIDB4MDAwMDgwMDAgICAgLyogQWxsIFRYIE9jdGV0cyBTZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0VRNjRfQ05UICAgICAgIDB4MDAwMTAwMDAgICAgLyogNjQtQnl0ZSBUWCBGcmFtZXMgU2VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0xUMTI4X0NOVCAgICAgIDB4MDAwMjAwMDAgICAgLyogNjUtMTI3LUJ5dGUgVFggRnJhbWVzIFNlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0xUMjU2X0NOVCAgICAgIDB4MDAwNDAwMDAgICAgLyogMTI4LTI1NS1CeXRlIFRYIEZyYW1lcyBTZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0xUNTEyX0NOVCAgICAgIDB4MDAwODAwMDAgICAgLyogMjU2LTUxMS1CeXRlIFRYIEZyYW1lcyBTZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0xUMTAyNF9DTlQgICAgIDB4MDAxMDAwMDAgICAgLyogNTEyLTEwMjMtQnl0ZSBUWCBGcmFtZXMgU2VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0dFMTAyNF9DTlQgICAgIDB4MDAyMDAwMDAgICAgLyogMTAyNC1NYXgtQnl0ZSBUWCBGcmFtZXMgU2VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0FCT1JUX0NOVCAgICAgIDB4MDA0MDAwMDAgICAgLyogVFggRnJhbWVzIEFib3J0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIFNESCBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBTREhfUFdSX0NUTCAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzkwMCAvKiBTREggUG93ZXIgQ29udHJvbCAqLworI2RlZmluZSBTREhfQ0xLX0NUTCAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzkwNCAvKiBTREggQ2xvY2sgQ29udHJvbCAqLworI2RlZmluZSBTREhfQVJHVU1FTlQgICAgICAgICAgICAgICAgICAgMHhGRkMwMzkwOCAvKiBTREggQXJndW1lbnQgKi8KKyNkZWZpbmUgU0RIX0NPTU1BTkQgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MEMgLyogU0RIIENvbW1hbmQgKi8KKyNkZWZpbmUgU0RIX1JFU1BfQ01EICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MTAgLyogU0RIIFJlc3BvbnNlIENvbW1hbmQgKi8KKyNkZWZpbmUgU0RIX1JFU1BPTlNFMCAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MTQgLyogU0RIIFJlc3BvbnNlMCAqLworI2RlZmluZSBTREhfUkVTUE9OU0UxICAgICAgICAgICAgICAgICAgMHhGRkMwMzkxOCAvKiBTREggUmVzcG9uc2UxICovCisjZGVmaW5lIFNESF9SRVNQT05TRTIgICAgICAgICAgICAgICAgICAweEZGQzAzOTFDIC8qIFNESCBSZXNwb25zZTIgKi8KKyNkZWZpbmUgU0RIX1JFU1BPTlNFMyAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MjAgLyogU0RIIFJlc3BvbnNlMyAqLworI2RlZmluZSBTREhfREFUQV9USU1FUiAgICAgICAgICAgICAgICAgMHhGRkMwMzkyNCAvKiBTREggRGF0YSBUaW1lciAqLworI2RlZmluZSBTREhfREFUQV9MR1RIICAgICAgICAgICAgICAgICAgMHhGRkMwMzkyOCAvKiBTREggRGF0YSBMZW5ndGggKi8KKyNkZWZpbmUgU0RIX0RBVEFfQ1RMICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MkMgLyogU0RIIERhdGEgQ29udHJvbCAqLworI2RlZmluZSBTREhfREFUQV9DTlQgICAgICAgICAgICAgICAgICAgMHhGRkMwMzkzMCAvKiBTREggRGF0YSBDb3VudGVyICovCisjZGVmaW5lIFNESF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOTM0IC8qIFNESCBTdGF0dXMgKi8KKyNkZWZpbmUgU0RIX1NUQVRVU19DTFIgICAgICAgICAgICAgICAgIDB4RkZDMDM5MzggLyogU0RIIFN0YXR1cyBDbGVhciAqLworI2RlZmluZSBTREhfTUFTSzAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzkzQyAvKiBTREggSW50ZXJydXB0MCBNYXNrICovCisjZGVmaW5lIFNESF9NQVNLMSAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOTQwIC8qIFNESCBJbnRlcnJ1cHQxIE1hc2sgKi8KKyNkZWZpbmUgU0RIX0ZJRk9fQ05UICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5NDggLyogU0RIIEZJRk8gQ291bnRlciAqLworI2RlZmluZSBTREhfRklGTyAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzk4MCAvKiBTREggRGF0YSBGSUZPICovCisjZGVmaW5lIFNESF9FX1NUQVRVUyAgICAgICAgICAgICAgICAgICAweEZGQzAzOUMwIC8qIFNESCBFeGNlcHRpb24gU3RhdHVzICovCisjZGVmaW5lIFNESF9FX01BU0sgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOUM0IC8qIFNESCBFeGNlcHRpb24gTWFzayAqLworI2RlZmluZSBTREhfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzlDOCAvKiBTREggQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSBTREhfUkRfV0FJVF9FTiAgICAgICAgICAgICAgICAgMHhGRkMwMzlDQyAvKiBTREggUmVhZCBXYWl0IEVuYWJsZSAqLworI2RlZmluZSBTREhfUElEMCAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzlEMCAvKiBTREggUGVyaXBoZXJhbCBJZGVudGlmaWNhdGlvbjAgKi8KKyNkZWZpbmUgU0RIX1BJRDEgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5RDQgLyogU0RIIFBlcmlwaGVyYWwgSWRlbnRpZmljYXRpb24xICovCisjZGVmaW5lIFNESF9QSUQyICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOUQ4IC8qIFNESCBQZXJpcGhlcmFsIElkZW50aWZpY2F0aW9uMiAqLworI2RlZmluZSBTREhfUElEMyAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzlEQyAvKiBTREggUGVyaXBoZXJhbCBJZGVudGlmaWNhdGlvbjMgKi8KKyNkZWZpbmUgU0RIX1BJRDQgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5RTAgLyogU0RIIFBlcmlwaGVyYWwgSWRlbnRpZmljYXRpb240ICovCisjZGVmaW5lIFNESF9QSUQ1ICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOUU0IC8qIFNESCBQZXJpcGhlcmFsIElkZW50aWZpY2F0aW9uNSAqLworI2RlZmluZSBTREhfUElENiAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzlFOCAvKiBTREggUGVyaXBoZXJhbCBJZGVudGlmaWNhdGlvbjYgKi8KKyNkZWZpbmUgU0RIX1BJRDcgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5RUMgLyogU0RIIFBlcmlwaGVyYWwgSWRlbnRpZmljYXRpb243ICovCisKKy8qIFJlbW92YWJsZSBTdG9yYWdlIEludGVyZmFjZSBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBSU0lfUFdSX0NPTlRST0wgICAgICAgICAgICAgICAgMHhGRkMwMzgwMCAvKiBSU0kgUG93ZXIgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfQ0xLX0NPTlRST0wgICAgICAgICAgICAgICAgMHhGRkMwMzgwNCAvKiBSU0kgQ2xvY2sgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfQVJHVU1FTlQgICAgICAgICAgICAgICAgICAgMHhGRkMwMzgwOCAvKiBSU0kgQXJndW1lbnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0NPTU1BTkQgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4MEMgLyogUlNJIENvbW1hbmQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX1JFU1BfQ01EICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4MTAgLyogUlNJIFJlc3BvbnNlIENvbW1hbmQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX1JFU1BPTlNFMCAgICAgICAgICAgICAgICAgIDB4RkZDMDM4MTQgLyogUlNJIFJlc3BvbnNlIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9SRVNQT05TRTEgICAgICAgICAgICAgICAgICAweEZGQzAzODE4IC8qIFJTSSBSZXNwb25zZSBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfUkVTUE9OU0UyICAgICAgICAgICAgICAgICAgMHhGRkMwMzgxQyAvKiBSU0kgUmVzcG9uc2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX1JFU1BPTlNFMyAgICAgICAgICAgICAgICAgIDB4RkZDMDM4MjAgLyogUlNJIFJlc3BvbnNlIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9EQVRBX1RJTUVSICAgICAgICAgICAgICAgICAweEZGQzAzODI0IC8qIFJTSSBEYXRhIFRpbWVyIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9EQVRBX0xHVEggICAgICAgICAgICAgICAgICAweEZGQzAzODI4IC8qIFJTSSBEYXRhIExlbmd0aCBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfREFUQV9DT05UUk9MICAgICAgICAgICAgICAgMHhGRkMwMzgyQyAvKiBSU0kgRGF0YSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9EQVRBX0NOVCAgICAgICAgICAgICAgICAgICAweEZGQzAzODMwIC8qIFJTSSBEYXRhIENvdW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4MzQgLyogUlNJIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfU1RBVFVTQ0wgICAgICAgICAgICAgICAgICAgMHhGRkMwMzgzOCAvKiBSU0kgU3RhdHVzIENsZWFyIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9NQVNLMCAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzODNDIC8qIFJTSSBJbnRlcnJ1cHQgMCBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9NQVNLMSAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzODQwIC8qIFJTSSBJbnRlcnJ1cHQgMSBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9GSUZPX0NOVCAgICAgICAgICAgICAgICAgICAweEZGQzAzODQ4IC8qIFJTSSBGSUZPIENvdW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0NFQVRBX0NPTlRST0wgICAgICAgICAgICAgIDB4RkZDMDM4NEMgLyogUlNJIENFQVRBIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9GSUZPICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzODgwIC8qIFJTSSBEYXRhIEZJRk8gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0VTVEFUICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4QzAgLyogUlNJIEV4Y2VwdGlvbiBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0VNQVNLICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4QzQgLyogUlNJIEV4Y2VwdGlvbiBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9DT05GSUcgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOEM4IC8qIFJTSSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9SRF9XQUlUX0VOICAgICAgICAgICAgICAgICAweEZGQzAzOENDIC8qIFJTSSBSZWFkIFdhaXQgRW5hYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9QSUQwICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzRkUwIC8qIFJTSSBQZXJpcGhlcmFsIElEIFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUgUlNJX1BJRDEgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDNGRTQgLyogUlNJIFBlcmlwaGVyYWwgSUQgUmVnaXN0ZXIgMSAqLworI2RlZmluZSBSU0lfUElEMiAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwM0ZFOCAvKiBSU0kgUGVyaXBoZXJhbCBJRCBSZWdpc3RlciAyICovCisjZGVmaW5lIFJTSV9QSUQzICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzRkVDIC8qIFJTSSBQZXJpcGhlcmFsIElEIFJlZ2lzdGVyIDMgKi8KKyNkZWZpbmUgUlNJX1BJRDQgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDNGRjAgLyogUlNJIFBlcmlwaGVyYWwgSUQgUmVnaXN0ZXIgNCAqLworI2RlZmluZSBSU0lfUElENSAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwM0ZGNCAvKiBSU0kgUGVyaXBoZXJhbCBJRCBSZWdpc3RlciA1ICovCisjZGVmaW5lIFJTSV9QSUQ2ICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzRkY4IC8qIFJTSSBQZXJpcGhlcmFsIElEIFJlZ2lzdGVyIDYgKi8KKyNkZWZpbmUgUlNJX1BJRDcgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDNGRkMgLyogUlNJIFBlcmlwaGVyYWwgSUQgUmVnaXN0ZXIgNyAqLworCisjZW5kaWYgLyogX0RFRl9CRjUxNl9IICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2RlZkJGNTE4LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2RlZkJGNTE4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU5ODJhYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZGVmQkY1MTguaApAQCAtMCwwICsxLDY1MSBAQAorLyoKKyAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUxOC9kZWZCRjUxOC5oCisgKiBCYXNlZCBvbjoKKyAqIEF1dGhvcjoKKyAqCisgKiBDcmVhdGVkOgorICogRGVzY3JpcHRpb246CisgKgorICogUmV2OgorICoKKyAqIE1vZGlmaWVkOgorICoKKyAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX0RFRl9CRjUxOF9ICisjZGVmaW5lIF9ERUZfQkY1MThfSAorCisvKiBJbmNsdWRlIGFsbCBDb3JlIHJlZ2lzdGVycyBhbmQgYml0IGRlZmluaXRpb25zICovCisjaW5jbHVkZSA8YXNtL2RlZl9MUEJsYWNrZmluLmg+CisKKy8qIFNZU1RFTSAmIE1NUiBBRERSRVNTIERFRklOSVRJT05TIEZPUiBBRFNQLUJGNTE4ICovCisKKy8qIEluY2x1ZGUgZGVmQkY1MXhfYmFzZS5oIGZvciB0aGUgc2V0IG9mICNkZWZpbmVzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgQURTUC1CRjUxeCBwcm9jZXNzb3JzICovCisjaW5jbHVkZSAiZGVmQkY1MXhfYmFzZS5oIgorCisvKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgI2RlZmluZXMgbmVlZGVkIGJ5IEFEU1AtQkY1MTggdGhhdCBhcmUgbm90IGluIHRoZSBjb21tb24gaGVhZGVyICovCisvKiAxMC8xMDAgRXRoZXJuZXQgQ29udHJvbGxlcgkoMHhGRkMwMzAwMCAtIDB4RkZDMDMxRkYpICovCisKKyNkZWZpbmUgRU1BQ19PUE1PREUgICAgICAgICAgICAgMHhGRkMwMzAwMCAgICAgICAvKiBPcGVyYXRpbmcgTW9kZSBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfQUREUkxPICAgICAgICAgICAgIDB4RkZDMDMwMDQgICAgICAgLyogQWRkcmVzcyBMb3cgKDMyIExTQnMpIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX0FERFJISSAgICAgICAgICAgICAweEZGQzAzMDA4ICAgICAgIC8qIEFkZHJlc3MgSGlnaCAoMTYgTVNCcykgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19IQVNITE8gICAgICAgICAgICAgMHhGRkMwMzAwQyAgICAgICAvKiBNdWx0aWNhc3QgSGFzaCBUYWJsZSBMb3cgKEJpbnMgMzEtMCkgUmVnaXN0ZXIgICAgICAgICovCisjZGVmaW5lIEVNQUNfSEFTSEhJICAgICAgICAgICAgIDB4RkZDMDMwMTAgICAgICAgLyogTXVsdGljYXN0IEhhc2ggVGFibGUgSGlnaCAoQmlucyA2My0zMikgUmVnaXN0ZXIgICAgICAqLworI2RlZmluZSBFTUFDX1NUQUFERCAgICAgICAgICAgICAweEZGQzAzMDE0ICAgICAgIC8qIFN0YXRpb24gTWFuYWdlbWVudCBBZGRyZXNzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19TVEFEQVQgICAgICAgICAgICAgMHhGRkMwMzAxOCAgICAgICAvKiBTdGF0aW9uIE1hbmFnZW1lbnQgRGF0YSBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfRkxDICAgICAgICAgICAgICAgIDB4RkZDMDMwMUMgICAgICAgLyogRmxvdyBDb250cm9sIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1ZMQU4xICAgICAgICAgICAgICAweEZGQzAzMDIwICAgICAgIC8qIFZMQU4xIFRhZyBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19WTEFOMiAgICAgICAgICAgICAgMHhGRkMwMzAyNCAgICAgICAvKiBWTEFOMiBUYWcgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfV0tVUF9DVEwgICAgICAgICAgIDB4RkZDMDMwMkMgICAgICAgLyogV2FrZS1VcCBDb250cm9sL1N0YXR1cyBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1dLVVBfRkZNU0swICAgICAgICAweEZGQzAzMDMwICAgICAgIC8qIFdha2UtVXAgRnJhbWUgRmlsdGVyIDAgQnl0ZSBNYXNrIFJlZ2lzdGVyICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19XS1VQX0ZGTVNLMSAgICAgICAgMHhGRkMwMzAzNCAgICAgICAvKiBXYWtlLVVwIEZyYW1lIEZpbHRlciAxIEJ5dGUgTWFzayBSZWdpc3RlciAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfV0tVUF9GRk1TSzIgICAgICAgIDB4RkZDMDMwMzggICAgICAgLyogV2FrZS1VcCBGcmFtZSBGaWx0ZXIgMiBCeXRlIE1hc2sgUmVnaXN0ZXIgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1dLVVBfRkZNU0szICAgICAgICAweEZGQzAzMDNDICAgICAgIC8qIFdha2UtVXAgRnJhbWUgRmlsdGVyIDMgQnl0ZSBNYXNrIFJlZ2lzdGVyICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19XS1VQX0ZGQ01EICAgICAgICAgMHhGRkMwMzA0MCAgICAgICAvKiBXYWtlLVVwIEZyYW1lIEZpbHRlciBDb21tYW5kcyBSZWdpc3RlciAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfV0tVUF9GRk9GRiAgICAgICAgIDB4RkZDMDMwNDQgICAgICAgLyogV2FrZS1VcCBGcmFtZSBGaWx0ZXIgT2Zmc2V0cyBSZWdpc3RlciAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1dLVVBfRkZDUkMwICAgICAgICAweEZGQzAzMDQ4ICAgICAgIC8qIFdha2UtVXAgRnJhbWUgRmlsdGVyIDAsMSBDUkMtMTYgUmVnaXN0ZXIgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19XS1VQX0ZGQ1JDMSAgICAgICAgMHhGRkMwMzA0QyAgICAgICAvKiBXYWtlLVVwIEZyYW1lIEZpbHRlciAyLDMgQ1JDLTE2IFJlZ2lzdGVyICAgICAgICAgICAgICovCisKKyNkZWZpbmUgRU1BQ19TWVNDVEwgICAgICAgICAgICAgMHhGRkMwMzA2MCAgICAgICAvKiBFTUFDIFN5c3RlbSBDb250cm9sIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfU1lTVEFUICAgICAgICAgICAgIDB4RkZDMDMwNjQgICAgICAgLyogRU1BQyBTeXN0ZW0gU3RhdHVzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYX1NUQVQgICAgICAgICAgICAweEZGQzAzMDY4ICAgICAgIC8qIFJYIEN1cnJlbnQgRnJhbWUgU3RhdHVzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWF9TVEtZICAgICAgICAgICAgMHhGRkMwMzA2QyAgICAgICAvKiBSWCBTdGlja3kgRnJhbWUgU3RhdHVzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhfSVJRRSAgICAgICAgICAgIDB4RkZDMDMwNzAgICAgICAgLyogUlggRnJhbWUgU3RhdHVzIEludGVycnVwdCBFbmFibGVzIFJlZ2lzdGVyICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1RYX1NUQVQgICAgICAgICAgICAweEZGQzAzMDc0ICAgICAgIC8qIFRYIEN1cnJlbnQgRnJhbWUgU3RhdHVzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWF9TVEtZICAgICAgICAgICAgMHhGRkMwMzA3OCAgICAgICAvKiBUWCBTdGlja3kgRnJhbWUgU3RhdHVzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhfSVJRRSAgICAgICAgICAgIDB4RkZDMDMwN0MgICAgICAgLyogVFggRnJhbWUgU3RhdHVzIEludGVycnVwdCBFbmFibGVzIFJlZ2lzdGVyICAgICAgICAgICAqLworCisjZGVmaW5lIEVNQUNfTU1DX0NUTCAgICAgICAgICAgIDB4RkZDMDMwODAgICAgICAgLyogTU1DIENvdW50ZXIgQ29udHJvbCBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX01NQ19SSVJRUyAgICAgICAgICAweEZGQzAzMDg0ICAgICAgIC8qIE1NQyBSWCBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19NTUNfUklSUUUgICAgICAgICAgMHhGRkMwMzA4OCAgICAgICAvKiBNTUMgUlggSW50ZXJydXB0IEVuYWJsZXMgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfTU1DX1RJUlFTICAgICAgICAgIDB4RkZDMDMwOEMgICAgICAgLyogTU1DIFRYIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX01NQ19USVJRRSAgICAgICAgICAweEZGQzAzMDkwICAgICAgIC8qIE1NQyBUWCBJbnRlcnJ1cHQgRW5hYmxlcyBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBFTUFDX1JYQ19PSyAgICAgICAgICAgICAweEZGQzAzMTAwICAgICAgIC8qIFJYIEZyYW1lIFN1Y2Nlc3NmdWwgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfRkNTICAgICAgICAgICAgMHhGRkMwMzEwNCAgICAgICAvKiBSWCBGcmFtZSBGQ1MgRmFpbHVyZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX0FMSUdOICAgICAgICAgIDB4RkZDMDMxMDggICAgICAgLyogUlggQWxpZ25tZW50IEVycm9yIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19PQ1RFVCAgICAgICAgICAweEZGQzAzMTBDICAgICAgIC8qIFJYIE9jdGV0cyBTdWNjZXNzZnVsbHkgUmVjZWl2ZWQgQ291bnQgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfRE1BT1ZGICAgICAgICAgMHhGRkMwMzExMCAgICAgICAvKiBJbnRlcm5hbCBNQUMgU3VibGF5ZXIgRXJyb3IgUlggRnJhbWUgQ291bnQgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX1VOSUNTVCAgICAgICAgIDB4RkZDMDMxMTQgICAgICAgLyogVW5pY2FzdCBSWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19NVUxUSSAgICAgICAgICAweEZGQzAzMTE4ICAgICAgIC8qIE11bHRpY2FzdCBSWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfQlJPQUQgICAgICAgICAgMHhGRkMwMzExQyAgICAgICAvKiBCcm9hZGNhc3QgUlggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX0xORVJSSSAgICAgICAgIDB4RkZDMDMxMjAgICAgICAgLyogUlggRnJhbWUgSW4gUmFuZ2UgRXJyb3IgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19MTkVSUk8gICAgICAgICAweEZGQzAzMTI0ICAgICAgIC8qIFJYIEZyYW1lIE91dCBPZiBSYW5nZSBFcnJvciBDb3VudCAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfTE9ORyAgICAgICAgICAgMHhGRkMwMzEyOCAgICAgICAvKiBSWCBGcmFtZSBUb28gTG9uZyBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX01BQ0NUTCAgICAgICAgIDB4RkZDMDMxMkMgICAgICAgLyogTUFDIENvbnRyb2wgUlggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19PUENPREUgICAgICAgICAweEZGQzAzMTMwICAgICAgIC8qIFVuc3VwcG9ydGVkIE9wLUNvZGUgUlggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfUEFVU0UgICAgICAgICAgMHhGRkMwMzEzNCAgICAgICAvKiBNQUMgQ29udHJvbCBQYXVzZSBSWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX0FMTEZSTSAgICAgICAgIDB4RkZDMDMxMzggICAgICAgLyogT3ZlcmFsbCBSWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19BTExPQ1QgICAgICAgICAweEZGQzAzMTNDICAgICAgIC8qIE92ZXJhbGwgUlggT2N0ZXQgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfVFlQRUQgICAgICAgICAgMHhGRkMwMzE0MCAgICAgICAvKiBUeXBlL0xlbmd0aCBDb25zaXN0ZW50IFJYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX1NIT1JUICAgICAgICAgIDB4RkZDMDMxNDQgICAgICAgLyogUlggRnJhbWUgRnJhZ21lbnQgQ291bnQgLSBCeXRlIENvdW50IHggPCA2NCAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19FUTY0ICAgICAgICAgICAweEZGQzAzMTQ4ICAgICAgIC8qIEdvb2QgUlggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IHggPSA2NCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfTFQxMjggICAgICAgICAgMHhGRkMwMzE0QyAgICAgICAvKiBHb29kIFJYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCAgNjQgPCB4IDwgMTI4ICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX0xUMjU2ICAgICAgICAgIDB4RkZDMDMxNTAgICAgICAgLyogR29vZCBSWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgMTI4IDw9IHggPCAyNTYgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19MVDUxMiAgICAgICAgICAweEZGQzAzMTU0ICAgICAgIC8qIEdvb2QgUlggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IDI1NiA8PSB4IDwgNTEyICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfTFQxMDI0ICAgICAgICAgMHhGRkMwMzE1OCAgICAgICAvKiBHb29kIFJYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCA1MTIgPD0geCA8IDEwMjQgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX0dFMTAyNCAgICAgICAgIDB4RkZDMDMxNUMgICAgICAgLyogR29vZCBSWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgeCA+PSAxMDI0ICAgICAgICAgICAqLworCisjZGVmaW5lIEVNQUNfVFhDX09LICAgICAgICAgICAgIDB4RkZDMDMxODAgICAgICAgLyogVFggRnJhbWUgU3VjY2Vzc2Z1bCBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfMUNPTCAgICAgICAgICAgMHhGRkMwMzE4NCAgICAgICAvKiBUWCBGcmFtZXMgU3VjY2Vzc2Z1bCBBZnRlciBTaW5nbGUgQ29sbGlzaW9uIENvdW50ICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19HVDFDT0wgICAgICAgICAweEZGQzAzMTg4ICAgICAgIC8qIFRYIEZyYW1lcyBTdWNjZXNzZnVsIEFmdGVyIE11bHRpcGxlIENvbGxpc2lvbnMgQ291bnQgICovCisjZGVmaW5lIEVNQUNfVFhDX09DVEVUICAgICAgICAgIDB4RkZDMDMxOEMgICAgICAgLyogVFggT2N0ZXRzIFN1Y2Nlc3NmdWxseSBSZWNlaXZlZCBDb3VudCAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfREVGRVIgICAgICAgICAgMHhGRkMwMzE5MCAgICAgICAvKiBUWCBGcmFtZSBEZWxheWVkIER1ZSBUbyBCdXN5IENvdW50ICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19MQVRFQ0wgICAgICAgICAweEZGQzAzMTk0ICAgICAgIC8qIExhdGUgVFggQ29sbGlzaW9ucyBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX1hTX0NPTCAgICAgICAgIDB4RkZDMDMxOTggICAgICAgLyogVFggRnJhbWUgRmFpbGVkIER1ZSBUbyBFeGNlc3NpdmUgQ29sbGlzaW9ucyBDb3VudCAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfRE1BVU5EICAgICAgICAgMHhGRkMwMzE5QyAgICAgICAvKiBJbnRlcm5hbCBNQUMgU3VibGF5ZXIgRXJyb3IgVFggRnJhbWUgQ291bnQgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19DUlNFUlIgICAgICAgICAweEZGQzAzMUEwICAgICAgIC8qIENhcnJpZXIgU2Vuc2UgRGVhc3NlcnRlZCBEdXJpbmcgVFggRnJhbWUgQ291bnQgICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX1VOSUNTVCAgICAgICAgIDB4RkZDMDMxQTQgICAgICAgLyogVW5pY2FzdCBUWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfTVVMVEkgICAgICAgICAgMHhGRkMwMzFBOCAgICAgICAvKiBNdWx0aWNhc3QgVFggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19CUk9BRCAgICAgICAgICAweEZGQzAzMUFDICAgICAgIC8qIEJyb2FkY2FzdCBUWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX1hTX0RGUiAgICAgICAgIDB4RkZDMDMxQjAgICAgICAgLyogVFggRnJhbWVzIFdpdGggRXhjZXNzaXZlIERlZmVycmFsIENvdW50ICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfTUFDQ1RMICAgICAgICAgMHhGRkMwMzFCNCAgICAgICAvKiBNQUMgQ29udHJvbCBUWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19BTExGUk0gICAgICAgICAweEZGQzAzMUI4ICAgICAgIC8qIE92ZXJhbGwgVFggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX0FMTE9DVCAgICAgICAgIDB4RkZDMDMxQkMgICAgICAgLyogT3ZlcmFsbCBUWCBPY3RldCBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfRVE2NCAgICAgICAgICAgMHhGRkMwMzFDMCAgICAgICAvKiBHb29kIFRYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCB4ID0gNjQgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19MVDEyOCAgICAgICAgICAweEZGQzAzMUM0ICAgICAgIC8qIEdvb2QgVFggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50ICA2NCA8IHggPCAxMjggICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX0xUMjU2ICAgICAgICAgIDB4RkZDMDMxQzggICAgICAgLyogR29vZCBUWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgMTI4IDw9IHggPCAyNTYgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfTFQ1MTIgICAgICAgICAgMHhGRkMwMzFDQyAgICAgICAvKiBHb29kIFRYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCAyNTYgPD0geCA8IDUxMiAgICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19MVDEwMjQgICAgICAgICAweEZGQzAzMUQwICAgICAgIC8qIEdvb2QgVFggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IDUxMiA8PSB4IDwgMTAyNCAgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX0dFMTAyNCAgICAgICAgIDB4RkZDMDMxRDQgICAgICAgLyogR29vZCBUWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgeCA+PSAxMDI0ICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfQUJPUlQgICAgICAgICAgMHhGRkMwMzFEOCAgICAgICAvKiBUb3RhbCBUWCBGcmFtZXMgQWJvcnRlZCBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBMaXN0aW5nIGZvciBJRUVFLVN1cHBvcnRlZCBDb3VudCBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBGcmFtZXNSZWNlaXZlZE9LICAgICAgICAgICAgICAgIEVNQUNfUlhDX09LICAgICAgICAvKiBSWCBGcmFtZSBTdWNjZXNzZnVsIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZyYW1lQ2hlY2tTZXF1ZW5jZUVycm9ycyAgICAgICAgRU1BQ19SWENfRkNTICAgICAgIC8qIFJYIEZyYW1lIEZDUyBGYWlsdXJlIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQWxpZ25tZW50RXJyb3JzICAgICAgICAgICAgICAgICBFTUFDX1JYQ19BTElHTiAgICAgLyogUlggQWxpZ25tZW50IEVycm9yIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBPY3RldHNSZWNlaXZlZE9LICAgICAgICAgICAgICAgIEVNQUNfUlhDX09DVEVUICAgICAvKiBSWCBPY3RldHMgU3VjY2Vzc2Z1bGx5IFJlY2VpdmVkIENvdW50ICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZyYW1lc0xvc3REdWVUb0ludE1BQ1JjdkVycm9yICAgRU1BQ19SWENfRE1BT1ZGICAgIC8qIEludGVybmFsIE1BQyBTdWJsYXllciBFcnJvciBSWCBGcmFtZSBDb3VudCAgICAgICAgICAgKi8KKyNkZWZpbmUgVW5pY2FzdEZyYW1lc1JlY2VpdmVkT0sgICAgICAgICBFTUFDX1JYQ19VTklDU1QgICAgLyogVW5pY2FzdCBSWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNdWx0aWNhc3RGcmFtZXNSZWNlaXZlZE9LICAgICAgIEVNQUNfUlhDX01VTFRJICAgICAvKiBNdWx0aWNhc3QgUlggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJyb2FkY2FzdEZyYW1lc1JlY2VpdmVkT0sgICAgICAgRU1BQ19SWENfQlJPQUQgICAgIC8qIEJyb2FkY2FzdCBSWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSW5SYW5nZUxlbmd0aEVycm9ycyAgICAgICAgICAgICBFTUFDX1JYQ19MTkVSUkkgICAgLyogUlggRnJhbWUgSW4gUmFuZ2UgRXJyb3IgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBPdXRPZlJhbmdlTGVuZ3RoRmllbGQgICAgICAgICAgIEVNQUNfUlhDX0xORVJSTyAgICAvKiBSWCBGcmFtZSBPdXQgT2YgUmFuZ2UgRXJyb3IgQ291bnQgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZyYW1lVG9vTG9uZ0Vycm9ycyAgICAgICAgICAgICAgRU1BQ19SWENfTE9ORyAgICAgIC8qIFJYIEZyYW1lIFRvbyBMb25nIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUFDQ29udHJvbEZyYW1lc1JlY2VpdmVkICAgICAgICBFTUFDX1JYQ19NQUNDVEwgICAgLyogTUFDIENvbnRyb2wgUlggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVbnN1cHBvcnRlZE9wY29kZXNSZWNlaXZlZCAgICAgIEVNQUNfUlhDX09QQ09ERSAgICAvKiBVbnN1cHBvcnRlZCBPcC1Db2RlIFJYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFBBVVNFTUFDQ3RybEZyYW1lc1JlY2VpdmVkICAgICAgRU1BQ19SWENfUEFVU0UgICAgIC8qIE1BQyBDb250cm9sIFBhdXNlIFJYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRnJhbWVzUmVjZWl2ZWRBbGwgICAgICAgICAgICAgICBFTUFDX1JYQ19BTExGUk0gICAgLyogT3ZlcmFsbCBSWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBPY3RldHNSZWNlaXZlZEFsbCAgICAgICAgICAgICAgIEVNQUNfUlhDX0FMTE9DVCAgICAvKiBPdmVyYWxsIFJYIE9jdGV0IENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFR5cGVkRnJhbWVzUmVjZWl2ZWQgICAgICAgICAgICAgRU1BQ19SWENfVFlQRUQgICAgIC8qIFR5cGUvTGVuZ3RoIENvbnNpc3RlbnQgUlggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRnJhbWVzTGVuTHQ2NFJlY2VpdmVkICAgICAgICAgICBFTUFDX1JYQ19TSE9SVCAgICAgLyogUlggRnJhbWUgRnJhZ21lbnQgQ291bnQgLSBCeXRlIENvdW50IHggPCA2NCAgICAgICAgICAqLworI2RlZmluZSBGcmFtZXNMZW5FcTY0UmVjZWl2ZWQgICAgICAgICAgIEVNQUNfUlhDX0VRNjQgICAgICAvKiBHb29kIFJYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCB4ID0gNjQgICAgICAgICAgICAgICovCisjZGVmaW5lIEZyYW1lc0xlbjY1XzEyN1JlY2VpdmVkICAgICAgICAgRU1BQ19SWENfTFQxMjggICAgIC8qIEdvb2QgUlggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50ICA2NCA8IHggPCAxMjggICAgICAgKi8KKyNkZWZpbmUgRnJhbWVzTGVuMTI4XzI1NVJlY2VpdmVkICAgICAgICBFTUFDX1JYQ19MVDI1NiAgICAgLyogR29vZCBSWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgMTI4IDw9IHggPCAyNTYgICAgICAqLworI2RlZmluZSBGcmFtZXNMZW4yNTZfNTExUmVjZWl2ZWQgICAgICAgIEVNQUNfUlhDX0xUNTEyICAgICAvKiBHb29kIFJYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCAyNTYgPD0geCA8IDUxMiAgICAgICovCisjZGVmaW5lIEZyYW1lc0xlbjUxMl8xMDIzUmVjZWl2ZWQgICAgICAgRU1BQ19SWENfTFQxMDI0ICAgIC8qIEdvb2QgUlggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IDUxMiA8PSB4IDwgMTAyNCAgICAgKi8KKyNkZWZpbmUgRnJhbWVzTGVuMTAyNF9NYXhSZWNlaXZlZCAgICAgICBFTUFDX1JYQ19HRTEwMjQgICAgLyogR29vZCBSWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgeCA+PSAxMDI0ICAgICAgICAgICAqLworCisjZGVmaW5lIEZyYW1lc1RyYW5zbWl0dGVkT0sgICAgICAgICAgICAgRU1BQ19UWENfT0sgICAgICAgIC8qIFRYIEZyYW1lIFN1Y2Nlc3NmdWwgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU2luZ2xlQ29sbGlzaW9uRnJhbWVzICAgICAgICAgICBFTUFDX1RYQ18xQ09MICAgICAgLyogVFggRnJhbWVzIFN1Y2Nlc3NmdWwgQWZ0ZXIgU2luZ2xlIENvbGxpc2lvbiBDb3VudCAgICAqLworI2RlZmluZSBNdWx0aXBsZUNvbGxpc2lvbkZyYW1lcyAgICAgICAgIEVNQUNfVFhDX0dUMUNPTCAgICAvKiBUWCBGcmFtZXMgU3VjY2Vzc2Z1bCBBZnRlciBNdWx0aXBsZSBDb2xsaXNpb25zIENvdW50ICovCisjZGVmaW5lIE9jdGV0c1RyYW5zbWl0dGVkT0sgICAgICAgICAgICAgRU1BQ19UWENfT0NURVQgICAgIC8qIFRYIE9jdGV0cyBTdWNjZXNzZnVsbHkgUmVjZWl2ZWQgQ291bnQgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRnJhbWVzV2l0aERlZmVycmVkWG1pc3Npb25zICAgICBFTUFDX1RYQ19ERUZFUiAgICAgLyogVFggRnJhbWUgRGVsYXllZCBEdWUgVG8gQnVzeSBDb3VudCAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMYXRlQ29sbGlzaW9ucyAgICAgICAgICAgICAgICAgIEVNQUNfVFhDX0xBVEVDTCAgICAvKiBMYXRlIFRYIENvbGxpc2lvbnMgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZyYW1lc0Fib3J0ZWREdWVUb1hTQ29sbHMgICAgICAgRU1BQ19UWENfWFNfQ09MICAgIC8qIFRYIEZyYW1lIEZhaWxlZCBEdWUgVG8gRXhjZXNzaXZlIENvbGxpc2lvbnMgQ291bnQgICAgKi8KKyNkZWZpbmUgRnJhbWVzTG9zdER1ZVRvSW50TWFjWG1pdEVycm9yICBFTUFDX1RYQ19ETUFVTkQgICAgLyogSW50ZXJuYWwgTUFDIFN1YmxheWVyIEVycm9yIFRYIEZyYW1lIENvdW50ICAgICAgICAgICAqLworI2RlZmluZSBDYXJyaWVyU2Vuc2VFcnJvcnMgICAgICAgICAgICAgIEVNQUNfVFhDX0NSU0VSUiAgICAvKiBDYXJyaWVyIFNlbnNlIERlYXNzZXJ0ZWQgRHVyaW5nIFRYIEZyYW1lIENvdW50ICAgICAgICovCisjZGVmaW5lIFVuaWNhc3RGcmFtZXNYbWl0dGVkT0sgICAgICAgICAgRU1BQ19UWENfVU5JQ1NUICAgIC8qIFVuaWNhc3QgVFggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTXVsdGljYXN0RnJhbWVzWG1pdHRlZE9LICAgICAgICBFTUFDX1RYQ19NVUxUSSAgICAgLyogTXVsdGljYXN0IFRYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCcm9hZGNhc3RGcmFtZXNYbWl0dGVkT0sgICAgICAgIEVNQUNfVFhDX0JST0FEICAgICAvKiBCcm9hZGNhc3QgVFggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZyYW1lc1dpdGhFeGNlc3NpdmVEZWZlcnJhbCAgICAgRU1BQ19UWENfWFNfREZSICAgIC8qIFRYIEZyYW1lcyBXaXRoIEV4Y2Vzc2l2ZSBEZWZlcnJhbCBDb3VudCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUFDQ29udHJvbEZyYW1lc1RyYW5zbWl0dGVkICAgICBFTUFDX1RYQ19NQUNDVEwgICAgLyogTUFDIENvbnRyb2wgVFggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGcmFtZXNUcmFuc21pdHRlZEFsbCAgICAgICAgICAgIEVNQUNfVFhDX0FMTEZSTSAgICAvKiBPdmVyYWxsIFRYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE9jdGV0c1RyYW5zbWl0dGVkQWxsICAgICAgICAgICAgRU1BQ19UWENfQUxMT0NUICAgIC8qIE92ZXJhbGwgVFggT2N0ZXQgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRnJhbWVzTGVuRXE2NFRyYW5zbWl0dGVkICAgICAgICBFTUFDX1RYQ19FUTY0ICAgICAgLyogR29vZCBUWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgeCA9IDY0ICAgICAgICAgICAgICAqLworI2RlZmluZSBGcmFtZXNMZW42NV8xMjdUcmFuc21pdHRlZCAgICAgIEVNQUNfVFhDX0xUMTI4ICAgICAvKiBHb29kIFRYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCAgNjQgPCB4IDwgMTI4ICAgICAgICovCisjZGVmaW5lIEZyYW1lc0xlbjEyOF8yNTVUcmFuc21pdHRlZCAgICAgRU1BQ19UWENfTFQyNTYgICAgIC8qIEdvb2QgVFggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IDEyOCA8PSB4IDwgMjU2ICAgICAgKi8KKyNkZWZpbmUgRnJhbWVzTGVuMjU2XzUxMVRyYW5zbWl0dGVkICAgICBFTUFDX1RYQ19MVDUxMiAgICAgLyogR29vZCBUWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgMjU2IDw9IHggPCA1MTIgICAgICAqLworI2RlZmluZSBGcmFtZXNMZW41MTJfMTAyM1RyYW5zbWl0dGVkICAgIEVNQUNfVFhDX0xUMTAyNCAgICAvKiBHb29kIFRYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCA1MTIgPD0geCA8IDEwMjQgICAgICovCisjZGVmaW5lIEZyYW1lc0xlbjEwMjRfTWF4VHJhbnNtaXR0ZWQgICAgRU1BQ19UWENfR0UxMDI0ICAgIC8qIEdvb2QgVFggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IHggPj0gMTAyNCAgICAgICAgICAgKi8KKyNkZWZpbmUgVHhBYm9ydGVkRnJhbWVzICAgICAgICAgICAgICAgICBFTUFDX1RYQ19BQk9SVCAgICAgLyogVG90YWwgVFggRnJhbWVzIEFib3J0ZWQgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIFN5c3RlbSBNTVIgUmVnaXN0ZXIgQml0cyBBbmQgTWFjcm9zCisqKgorKiogRGlzY2xhaW1lcjoJQWxsIG1hY3JvcyBhcmUgaW50ZW5kZWQgdG8gbWFrZSBDIGFuZCBBc3NlbWJseSBjb2RlIG1vcmUgcmVhZGFibGUuCisqKgkJCQlVc2UgdGhlc2UgbWFjcm9zIGNhcmVmdWxseSwgYXMgYW55IHRoYXQgZG8gbGVmdCBzaGlmdHMgZm9yIGZpZWxkCisqKgkJCQlkZXBvc2l0aW5nIHdpbGwgcmVzdWx0IGluIHRoZSBsb3dlciBvcmRlciBiaXRzIGJlaW5nIGRlc3Ryb3llZC4gIEFueQorKioJCQkJbWFjcm8gdGhhdCBzaGlmdHMgbGVmdCB0byBwcm9wZXJseSBwb3NpdGlvbiB0aGUgYml0LWZpZWxkIHNob3VsZCBiZQorKioJCQkJdXNlZCBhcyBwYXJ0IG9mIGFuIE9SIHRvIGluaXRpYWxpemUgYSByZWdpc3RlciBhbmQgTk9UIGFzIGEgZHluYW1pYworKioJCQkJbW9kaWZpZXIgVU5MRVNTIHRoZSBsb3dlciBvcmRlciBiaXRzIGFyZSBzYXZlZCBhbmQgT1JlZCBiYWNrIGluIHdoZW4KKyoqCQkJCXRoZSBtYWNybyBpcyB1c2VkLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiAgRVRIRVJORVQgMTAvMTAwIENPTlRST0xMRVIgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRU1BQ19PUE1PREUgTWFza3MgKi8KKworI2RlZmluZQlSRSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMSAgICAgLyogUmVjZWl2ZXIgRW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJQVNUUCAgICAgICAgICAgICAgIDB4MDAwMDAwMDIgICAgIC8qIEVuYWJsZSBBdXRvbWF0aWMgUGFkIFN0cmlwcGluZyBPbiBSWCBGcmFtZXMgICAgICAgICovCisjZGVmaW5lCUhVICAgICAgICAgICAgICAgICAweDAwMDAwMDEwICAgICAvKiBIYXNoIEZpbHRlciBVbmljYXN0IEFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlITSAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMCAgICAgLyogSGFzaCBGaWx0ZXIgTXVsdGljYXN0IEFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUEFNICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAgICAgIC8qIFBhc3MtQWxsLU11bHRpY2FzdCBNb2RlIEVuYWJsZSAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVBSICAgICAgICAgICAgICAgICAweDAwMDAwMDgwICAgICAvKiBQcm9taXNjdW91cyBNb2RlIEVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlJRkUgICAgICAgICAgICAgICAgMHgwMDAwMDEwMCAgICAgLyogSW52ZXJzZSBGaWx0ZXJpbmcgRW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJREJGICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAgICAgIC8qIERpc2FibGUgQnJvYWRjYXN0IEZyYW1lIFJlY2VwdGlvbiAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVBCRiAgICAgICAgICAgICAgICAweDAwMDAwNDAwICAgICAvKiBQYXNzIEJhZCBGcmFtZXMgRW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlQU0YgICAgICAgICAgICAgICAgMHgwMDAwMDgwMCAgICAgLyogUGFzcyBTaG9ydCBGcmFtZXMgRW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUkFGICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAgICAgIC8qIFJlY2VpdmUtQWxsIE1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRFICAgICAgICAgICAgICAgICAweDAwMDEwMDAwICAgICAvKiBUcmFuc21pdHRlciBFbmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlEVFhQQUQgICAgICAgICAgICAgMHgwMDAyMDAwMCAgICAgLyogRGlzYWJsZSBBdXRvbWF0aWMgVFggUGFkZGluZyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJRFRYQ1JDICAgICAgICAgICAgIDB4MDAwNDAwMDAgICAgIC8qIERpc2FibGUgQXV0b21hdGljIFRYIENSQyBHZW5lcmF0aW9uICAgICAgICAgICAgICAgICovCisjZGVmaW5lCURDICAgICAgICAgICAgICAgICAweDAwMDgwMDAwICAgICAvKiBEZWZlcnJhbCBDaGVjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlCT0xNVCAgICAgICAgICAgICAgMHgwMDMwMDAwMCAgICAgLyogQmFjay1PZmYgTGltaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJQk9MTVRfMTAgICAgICAgICAgIDB4MDAwMDAwMDAgICAgIC8qCQkxMC1iaXQgcmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJQk9MTVRfOCAgICAgICAgICAgIDB4MDAxMDAwMDAgICAgIC8qCQk4LWJpdCByYW5nZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJQk9MTVRfNCAgICAgICAgICAgIDB4MDAyMDAwMDAgICAgIC8qCQk0LWJpdCByYW5nZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJQk9MTVRfMSAgICAgICAgICAgIDB4MDAzMDAwMDAgICAgIC8qCQkxLWJpdCByYW5nZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJRFJUWSAgICAgICAgICAgICAgIDB4MDA0MDAwMDAgICAgIC8qIERpc2FibGUgVFggUmV0cnkgT24gQ29sbGlzaW9uICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCUxDVFJFICAgICAgICAgICAgICAweDAwODAwMDAwICAgICAvKiBFbmFibGUgVFggUmV0cnkgT24gTGF0ZSBDb2xsaXNpb24gICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSTUlJICAgICAgICAgICAgICAgMHgwMTAwMDAwMCAgICAgLyogUk1JSS9NSUkqIE1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUk1JSV8xMCAgICAgICAgICAgIDB4MDIwMDAwMDAgICAgIC8qIFNwZWVkIFNlbGVjdCBmb3IgUk1JSSBQb3J0ICgxME1CaXQvMTAwTUJpdCopICAgICAgICovCisjZGVmaW5lCUZETU9ERSAgICAgICAgICAgICAweDA0MDAwMDAwICAgICAvKiBEdXBsZXggTW9kZSBFbmFibGUgKEZ1bGwvSGFsZiopICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlMQiAgICAgICAgICAgICAgICAgMHgwODAwMDAwMCAgICAgLyogSW50ZXJuYWwgTG9vcGJhY2sgRW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJRFJPICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAgICAgIC8qIERpc2FibGUgUmVjZWl2ZSBPd24gRnJhbWVzIChIYWxmLUR1cGxleCBNb2RlKSAgICAgICovCisKKy8qIEVNQUNfU1RBQUREIE1hc2tzICovCisKKyNkZWZpbmUJU1RBQlVTWSAgICAgICAgICAgIDB4MDAwMDAwMDEgICAgIC8qIEluaXRpYXRlIFN0YXRpb24gTWd0IFJlZyBBY2Nlc3MgLyBTVEEgQnVzeSBTdGF0ICAgICovCisjZGVmaW5lCVNUQU9QICAgICAgICAgICAgICAweDAwMDAwMDAyICAgICAvKiBTdGF0aW9uIE1hbmFnZW1lbnQgT3BlcmF0aW9uIENvZGUgKFdyaXRlL1JlYWQqKSAgICAqLworI2RlZmluZQlTVEFESVNQUkUgICAgICAgICAgMHgwMDAwMDAwNCAgICAgLyogRGlzYWJsZSBQcmVhbWJsZSBHZW5lcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJU1RBSUUgICAgICAgICAgICAgIDB4MDAwMDAwMDggICAgIC8qIFN0YXRpb24gTWd0LiBUcmFuc2ZlciBEb25lIEludGVycnVwdCBFbmFibGUgICAgICAgICovCisjZGVmaW5lCVJFR0FEICAgICAgICAgICAgICAweDAwMDAwN0MwICAgICAvKiBTVEEgUmVnaXN0ZXIgQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlQSFlBRCAgICAgICAgICAgICAgMHgwMDAwRjgwMCAgICAgLyogUEhZIERldmljZSBBZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZQlTRVRfUkVHQUQoeCkgKCgoeCkmMHgxRik8PCAgNiApICAgLyogU2V0IFNUQSBSZWdpc3RlciBBZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJU0VUX1BIWUFEKHgpICgoKHgpJjB4MUYpPDwgMTEgKSAgIC8qIFNldCBQSFkgRGV2aWNlIEFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIEVNQUNfU1RBREFUIE1hc2sgKi8KKworI2RlZmluZQlTVEFEQVRBICAgICAgICAgICAgMHgwMDAwRkZGRiAgICAgLyogU3RhdGlvbiBNYW5hZ2VtZW50IERhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogRU1BQ19GTEMgTWFza3MgKi8KKworI2RlZmluZQlGTENCVVNZICAgICAgICAgICAgMHgwMDAwMDAwMSAgICAgLyogU2VuZCBGbG93IEN0cmwgRnJhbWUgLyBGbG93IEN0cmwgQnVzeSBTdGF0dXMgICAgICAgKi8KKyNkZWZpbmUJRkxDRSAgICAgICAgICAgICAgIDB4MDAwMDAwMDIgICAgIC8qIEZsb3cgQ29udHJvbCBFbmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVBDRiAgICAgICAgICAgICAgICAweDAwMDAwMDA0ICAgICAvKiBQYXNzIENvbnRyb2wgRnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlCS1BSU0VOICAgICAgICAgICAgMHgwMDAwMDAwOCAgICAgLyogRW5hYmxlIEJhY2twcmVzc3VyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJRkxDUEFVU0UgICAgICAgICAgIDB4RkZGRjAwMDAgICAgIC8qIFBhdXNlIFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUJU0VUX0ZMQ1BBVVNFKHgpICgoKHgpJjB4RkZGRik8PCAxNikgLyogU2V0IFBhdXNlIFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIEVNQUNfV0tVUF9DVEwgTWFza3MgKi8KKworI2RlZmluZQlDQVBXS0ZSTSAgICAgICAgICAgMHgwMDAwMDAwMSAgICAvKiBDYXB0dXJlIFdha2UtVXAgRnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJTVBLRSAgICAgICAgICAgICAgIDB4MDAwMDAwMDIgICAgLyogTWFnaWMgUGFja2V0IEVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJXS0UgICAgICAgICAgICAgICAweDAwMDAwMDA0ICAgIC8qIFJlbW90ZSBXYWtlLVVwIEZyYW1lIEVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlHVVdLRSAgICAgICAgICAgICAgMHgwMDAwMDAwOCAgICAvKiBHbG9iYWwgVW5pY2FzdCBXYWtlIEVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJTVBLUyAgICAgICAgICAgICAgIDB4MDAwMDAwMjAgICAgLyogTWFnaWMgUGFja2V0IFJlY2VpdmVkIFN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJXS1MgICAgICAgICAgICAgICAweDAwMDAwRjAwICAgIC8qIFdha2UtVXAgRnJhbWUgUmVjZWl2ZWQgU3RhdHVzLCBGaWx0ZXJzIDM6MCAgICAgICAgICAqLworCisvKiBFTUFDX1dLVVBfRkZDTUQgTWFza3MgKi8KKworI2RlZmluZQlXRjBfRSAgICAgICAgICAgICAgMHgwMDAwMDAwMSAgICAvKiBFbmFibGUgV2FrZS1VcCBGaWx0ZXIgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVdGMF9UICAgICAgICAgICAgICAweDAwMDAwMDA4ICAgIC8qIFdha2UtVXAgRmlsdGVyIDAgQWRkciBUeXBlIChNdWx0aWNhc3QvVW5pY2FzdCopICAgICAgKi8KKyNkZWZpbmUJV0YxX0UgICAgICAgICAgICAgIDB4MDAwMDAxMDAgICAgLyogRW5hYmxlIFdha2UtVXAgRmlsdGVyIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlXRjFfVCAgICAgICAgICAgICAgMHgwMDAwMDgwMCAgICAvKiBXYWtlLVVwIEZpbHRlciAxIEFkZHIgVHlwZSAoTXVsdGljYXN0L1VuaWNhc3QqKSAgICAgICovCisjZGVmaW5lCVdGMl9FICAgICAgICAgICAgICAweDAwMDEwMDAwICAgIC8qIEVuYWJsZSBXYWtlLVVwIEZpbHRlciAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJV0YyX1QgICAgICAgICAgICAgIDB4MDAwODAwMDAgICAgLyogV2FrZS1VcCBGaWx0ZXIgMiBBZGRyIFR5cGUgKE11bHRpY2FzdC9VbmljYXN0KikgICAgICAqLworI2RlZmluZQlXRjNfRSAgICAgICAgICAgICAgMHgwMTAwMDAwMCAgICAvKiBFbmFibGUgV2FrZS1VcCBGaWx0ZXIgMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVdGM19UICAgICAgICAgICAgICAweDA4MDAwMDAwICAgIC8qIFdha2UtVXAgRmlsdGVyIDMgQWRkciBUeXBlIChNdWx0aWNhc3QvVW5pY2FzdCopICAgICAgKi8KKworLyogRU1BQ19XS1VQX0ZGT0ZGIE1hc2tzICovCisKKyNkZWZpbmUJV0YwX09GRiAgICAgICAgICAgIDB4MDAwMDAwRkYgICAgLyogV2FrZS1VcCBGaWx0ZXIgMCBQYXR0ZXJuIE9mZnNldCAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlXRjFfT0ZGICAgICAgICAgICAgMHgwMDAwRkYwMCAgICAvKiBXYWtlLVVwIEZpbHRlciAxIFBhdHRlcm4gT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVdGMl9PRkYgICAgICAgICAgICAweDAwRkYwMDAwICAgIC8qIFdha2UtVXAgRmlsdGVyIDIgUGF0dGVybiBPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJV0YzX09GRiAgICAgICAgICAgIDB4RkYwMDAwMDAgICAgLyogV2FrZS1VcCBGaWx0ZXIgMyBQYXR0ZXJuIE9mZnNldCAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lCVNFVF9XRjBfT0ZGKHgpICgoKHgpJjB4RkYpPDwgIDAgKSAvKiBTZXQgV2FrZS1VcCBGaWx0ZXIgMCBCeXRlIE9mZnNldCAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJU0VUX1dGMV9PRkYoeCkgKCgoeCkmMHhGRik8PCAgOCApIC8qIFNldCBXYWtlLVVwIEZpbHRlciAxIEJ5dGUgT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlTRVRfV0YyX09GRih4KSAoKCh4KSYweEZGKTw8IDE2ICkgLyogU2V0IFdha2UtVXAgRmlsdGVyIDIgQnl0ZSBPZmZzZXQgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVNFVF9XRjNfT0ZGKHgpICgoKHgpJjB4RkYpPDwgMjQgKSAvKiBTZXQgV2FrZS1VcCBGaWx0ZXIgMyBCeXRlIE9mZnNldCAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFNldCBBTEwgT2Zmc2V0cyAqLworI2RlZmluZQlTRVRfV0ZfT0ZGUyh4MCx4MSx4Mix4MykgKFNFVF9XRjBfT0ZGKCh4MCkpfFNFVF9XRjFfT0ZGKCh4MSkpfFNFVF9XRjJfT0ZGKCh4MikpfFNFVF9XRjNfT0ZGKCh4MykpKQorCisvKiBFTUFDX1dLVVBfRkZDUkMwIE1hc2tzICovCisKKyNkZWZpbmUJV0YwX0NSQyAgICAgICAgICAgMHgwMDAwRkZGRiAgICAvKiBXYWtlLVVwIEZpbHRlciAwIFBhdHRlcm4gQ1JDICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJV0YxX0NSQyAgICAgICAgICAgMHhGRkZGMDAwMCAgICAvKiBXYWtlLVVwIEZpbHRlciAxIFBhdHRlcm4gQ1JDICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZQlTRVRfV0YwX0NSQyh4KSAoKCh4KSYweEZGRkYpPDwgICAwICkgLyogU2V0IFdha2UtVXAgRmlsdGVyIDAgVGFyZ2V0IENSQyAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlTRVRfV0YxX0NSQyh4KSAoKCh4KSYweEZGRkYpPDwgIDE2ICkgLyogU2V0IFdha2UtVXAgRmlsdGVyIDEgVGFyZ2V0IENSQyAgICAgICAgICAgICAgICAgICAqLworCisvKiBFTUFDX1dLVVBfRkZDUkMxIE1hc2tzICovCisKKyNkZWZpbmUJV0YyX0NSQyAgICAgICAgICAgMHgwMDAwRkZGRiAgICAvKiBXYWtlLVVwIEZpbHRlciAyIFBhdHRlcm4gQ1JDICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJV0YzX0NSQyAgICAgICAgICAgMHhGRkZGMDAwMCAgICAvKiBXYWtlLVVwIEZpbHRlciAzIFBhdHRlcm4gQ1JDICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZQlTRVRfV0YyX0NSQyh4KSAoKCh4KSYweEZGRkYpPDwgICAwICkgLyogU2V0IFdha2UtVXAgRmlsdGVyIDIgVGFyZ2V0IENSQyAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlTRVRfV0YzX0NSQyh4KSAoKCh4KSYweEZGRkYpPDwgIDE2ICkgLyogU2V0IFdha2UtVXAgRmlsdGVyIDMgVGFyZ2V0IENSQyAgICAgICAgICAgICAgICAgICAqLworCisvKiBFTUFDX1NZU0NUTCBNYXNrcyAqLworCisjZGVmaW5lCVBIWUlFICAgICAgICAgICAgIDB4MDAwMDAwMDEgICAgLyogUEhZX0lOVCBJbnRlcnJ1cHQgRW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYRFdBICAgICAgICAgICAgIDB4MDAwMDAwMDIgICAgLyogUmVjZWl2ZSBGcmFtZSBETUEgV29yZCBBbGlnbm1lbnQgKE9kZC9FdmVuKikgICAgICAgICAgICovCisjZGVmaW5lCVJYQ0tTICAgICAgICAgICAgIDB4MDAwMDAwMDQgICAgLyogRW5hYmxlIFJYIEZyYW1lIFRDUC9VRFAgQ2hlY2tzdW0gQ29tcHV0YXRpb24gICAgICAgICAgICovCisjZGVmaW5lCVRYRFdBICAgICAgICAgICAgIDB4MDAwMDAwMTAgICAgLyogVHJhbnNtaXQgRnJhbWUgRE1BIFdvcmQgQWxpZ25tZW50IChPZGQvRXZlbiopICAgICAgICAgICovCisjZGVmaW5lCU1EQ0RJViAgICAgICAgICAgIDB4MDAwMDNGMDAgICAgLyogU0NMSzpNREMgQ2xvY2sgRGl2aXNvciBbTURDPVNDTEsvKDIqKE4rMSkpXSAgICAgICAgICAgICovCisKKyNkZWZpbmUJU0VUX01EQ0RJVih4KSAoKCh4KSYweDNGKTw8IDgpICAgLyogU2V0IE1EQyBDbG9jayBEaXZpc29yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogRU1BQ19TWVNUQVQgTWFza3MgKi8KKworI2RlZmluZQlQSFlJTlQgICAgICAgICAgICAweDAwMDAwMDAxICAgIC8qIFBIWV9JTlQgSW50ZXJydXB0IFN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlNTUNJTlQgICAgICAgICAgICAweDAwMDAwMDAyICAgIC8qIE1NQyBDb3VudGVyIEludGVycnVwdCBTdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWEZTSU5UICAgICAgICAgICAweDAwMDAwMDA0ICAgIC8qIFJYIEZyYW1lLVN0YXR1cyBJbnRlcnJ1cHQgU3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWEZTSU5UICAgICAgICAgICAweDAwMDAwMDA4ICAgIC8qIFRYIEZyYW1lLVN0YXR1cyBJbnRlcnJ1cHQgU3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlXQUtFREVUICAgICAgICAgICAweDAwMDAwMDEwICAgIC8qIFdha2UtVXAgRGV0ZWN0ZWQgU3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWERNQUVSUiAgICAgICAgICAweDAwMDAwMDIwICAgIC8qIFJYIERNQSBEaXJlY3Rpb24gRXJyb3IgU3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWERNQUVSUiAgICAgICAgICAweDAwMDAwMDQwICAgIC8qIFRYIERNQSBEaXJlY3Rpb24gRXJyb3IgU3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlTVE1ET05FICAgICAgICAgICAweDAwMDAwMDgwICAgIC8qIFN0YXRpb24gTWd0LiBUcmFuc2ZlciBEb25lIEludGVycnVwdCBTdGF0dXMgICAgICAgICAgICAqLworCisvKiBFTUFDX1JYX1NUQVQsIEVNQUNfUlhfU1RLWSwgYW5kIEVNQUNfUlhfSVJRRSBNYXNrcyAqLworCisjZGVmaW5lCVJYX0ZSTEVOICAgICAgICAgIDB4MDAwMDA3RkYgICAgLyogRnJhbWUgTGVuZ3RoIEluIEJ5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0NPTVAgICAgICAgICAgIDB4MDAwMDEwMDAgICAgLyogUlggRnJhbWUgQ29tcGxldGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX09LICAgICAgICAgICAgIDB4MDAwMDIwMDAgICAgLyogUlggRnJhbWUgUmVjZWl2ZWQgV2l0aCBObyBFcnJvcnMgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0xPTkcgICAgICAgICAgIDB4MDAwMDQwMDAgICAgLyogUlggRnJhbWUgVG9vIExvbmcgRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0FMSUdOICAgICAgICAgIDB4MDAwMDgwMDAgICAgLyogUlggRnJhbWUgQWxpZ25tZW50IEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0NSQyAgICAgICAgICAgIDB4MDAwMTAwMDAgICAgLyogUlggRnJhbWUgQ1JDIEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0xFTiAgICAgICAgICAgIDB4MDAwMjAwMDAgICAgLyogUlggRnJhbWUgTGVuZ3RoIEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0ZSQUcgICAgICAgICAgIDB4MDAwNDAwMDAgICAgLyogUlggRnJhbWUgRnJhZ21lbnQgRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0FERFIgICAgICAgICAgIDB4MDAwODAwMDAgICAgLyogUlggRnJhbWUgQWRkcmVzcyBGaWx0ZXIgRmFpbGVkIEVycm9yICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0RNQU8gICAgICAgICAgIDB4MDAxMDAwMDAgICAgLyogUlggRnJhbWUgRE1BIE92ZXJydW4gRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX1BIWSAgICAgICAgICAgIDB4MDAyMDAwMDAgICAgLyogUlggRnJhbWUgUEhZIEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0xBVEUgICAgICAgICAgIDB4MDA0MDAwMDAgICAgLyogUlggRnJhbWUgTGF0ZSBDb2xsaXNpb24gRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX1JBTkdFICAgICAgICAgIDB4MDA4MDAwMDAgICAgLyogUlggRnJhbWUgTGVuZ3RoIEZpZWxkIE91dCBvZiBSYW5nZSBFcnJvciAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX01VTFRJICAgICAgICAgIDB4MDEwMDAwMDAgICAgLyogUlggTXVsdGljYXN0IEZyYW1lIEluZGljYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0JST0FEICAgICAgICAgIDB4MDIwMDAwMDAgICAgLyogUlggQnJvYWRjYXN0IEZyYW1lIEluZGljYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0NUTCAgICAgICAgICAgIDB4MDQwMDAwMDAgICAgLyogUlggQ29udHJvbCBGcmFtZSBJbmRpY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX1VDVEwgICAgICAgICAgIDB4MDgwMDAwMDAgICAgLyogVW5zdXBwb3J0ZWQgUlggQ29udHJvbCBGcmFtZSBJbmRpY2F0b3IgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX1RZUEUgICAgICAgICAgIDB4MTAwMDAwMDAgICAgLyogUlggVHlwZWQgRnJhbWUgSW5kaWNhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX1ZMQU4xICAgICAgICAgIDB4MjAwMDAwMDAgICAgLyogUlggVkxBTjEgRnJhbWUgSW5kaWNhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX1ZMQU4yICAgICAgICAgIDB4NDAwMDAwMDAgICAgLyogUlggVkxBTjIgRnJhbWUgSW5kaWNhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0FDQ0VQVCAgICAgICAgIDB4ODAwMDAwMDAgICAgLyogUlggRnJhbWUgQWNjZXB0ZWQgSW5kaWNhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qICBFTUFDX1RYX1NUQVQsIEVNQUNfVFhfU1RLWSwgYW5kIEVNQUNfVFhfSVJRRSBNYXNrcyAgKi8KKworI2RlZmluZQlUWF9DT01QICAgICAgICAgICAweDAwMDAwMDAxICAgIC8qIFRYIEZyYW1lIENvbXBsZXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9PSyAgICAgICAgICAgICAweDAwMDAwMDAyICAgIC8qIFRYIEZyYW1lIFNlbnQgV2l0aCBObyBFcnJvcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9FQ09MTCAgICAgICAgICAweDAwMDAwMDA0ICAgIC8qIFRYIEZyYW1lIEV4Y2Vzc2l2ZSBDb2xsaXNpb24gRXJyb3IgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9MQVRFICAgICAgICAgICAweDAwMDAwMDA4ICAgIC8qIFRYIEZyYW1lIExhdGUgQ29sbGlzaW9uIEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9ETUFVICAgICAgICAgICAweDAwMDAwMDEwICAgIC8qIFRYIEZyYW1lIERNQSBVbmRlcnJ1biBFcnJvciAoU1RBVCkgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9NQUNFICAgICAgICAgICAweDAwMDAwMDEwICAgIC8qIEludGVybmFsIE1BQyBFcnJvciBEZXRlY3RlZCAoU1RLWSBhbmQgSVJRRSkgICAgICAgICAgICAqLworI2RlZmluZQlUWF9FREVGRVIgICAgICAgICAweDAwMDAwMDIwICAgIC8qIFRYIEZyYW1lIEV4Y2Vzc2l2ZSBEZWZlcnJhbCBFcnJvciAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9CUk9BRCAgICAgICAgICAweDAwMDAwMDQwICAgIC8qIFRYIEJyb2FkY2FzdCBGcmFtZSBJbmRpY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9NVUxUSSAgICAgICAgICAweDAwMDAwMDgwICAgIC8qIFRYIE11bHRpY2FzdCBGcmFtZSBJbmRpY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9DQ05UICAgICAgICAgICAweDAwMDAwRjAwICAgIC8qIFRYIEZyYW1lIENvbGxpc2lvbiBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9ERUZFUiAgICAgICAgICAweDAwMDAxMDAwICAgIC8qIFRYIEZyYW1lIERlZmVycmVkIEluZGljYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9DUlMgICAgICAgICAgICAweDAwMDAyMDAwICAgIC8qIFRYIEZyYW1lIENhcnJpZXIgU2Vuc2UgTm90IEFzc2VydGVkIEVycm9yICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9MT1NTICAgICAgICAgICAweDAwMDA0MDAwICAgIC8qIFRYIEZyYW1lIENhcnJpZXIgTG9zdCBEdXJpbmcgVFggRXJyb3IgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9SRVRSWSAgICAgICAgICAweDAwMDA4MDAwICAgIC8qIFRYIEZyYW1lIFN1Y2Nlc3NmdWwgQWZ0ZXIgUmV0cnkgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9GUkxFTiAgICAgICAgICAweDA3RkYwMDAwICAgIC8qIFRYIEZyYW1lIExlbmd0aCAoQnl0ZXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBFTUFDX01NQ19DVEwgTWFza3MgKi8KKyNkZWZpbmUJUlNUQyAgICAgICAgICAgICAgMHgwMDAwMDAwMSAgICAvKiBSZXNldCBBbGwgQ291bnRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJQ1JPTEwgICAgICAgICAgICAgMHgwMDAwMDAwMiAgICAvKiBDb3VudGVyIFJvbGwtT3ZlciBFbmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJQ0NPUiAgICAgICAgICAgICAgMHgwMDAwMDAwNCAgICAvKiBDb3VudGVyIENsZWFyLU9uLVJlYWQgTW9kZSBFbmFibGUgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJTU1DRSAgICAgICAgICAgICAgMHgwMDAwMDAwOCAgICAvKiBFbmFibGUgTU1DIENvdW50ZXIgT3BlcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogRU1BQ19NTUNfUklSUVMgYW5kIEVNQUNfTU1DX1JJUlFFIE1hc2tzICovCisjZGVmaW5lCVJYX09LX0NOVCAgICAgICAgIDB4MDAwMDAwMDEgICAgLyogUlggRnJhbWVzIFJlY2VpdmVkIFdpdGggTm8gRXJyb3JzICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0ZDU19DTlQgICAgICAgIDB4MDAwMDAwMDIgICAgLyogUlggRnJhbWVzIFcvRnJhbWUgQ2hlY2sgU2VxdWVuY2UgRXJyb3JzICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0FMSUdOX0NOVCAgICAgIDB4MDAwMDAwMDQgICAgLyogUlggRnJhbWVzIFdpdGggQWxpZ25tZW50IEVycm9ycyAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX09DVEVUX0NOVCAgICAgIDB4MDAwMDAwMDggICAgLyogUlggT2N0ZXRzIFJlY2VpdmVkIE9LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0xPU1RfQ05UICAgICAgIDB4MDAwMDAwMTAgICAgLyogUlggRnJhbWVzIExvc3QgRHVlIFRvIEludGVybmFsIE1BQyBSWCBFcnJvciAgICAgICAgICAgICovCisjZGVmaW5lCVJYX1VOSV9DTlQgICAgICAgIDB4MDAwMDAwMjAgICAgLyogVW5pY2FzdCBSWCBGcmFtZXMgUmVjZWl2ZWQgT0sgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX01VTFRJX0NOVCAgICAgIDB4MDAwMDAwNDAgICAgLyogTXVsdGljYXN0IFJYIEZyYW1lcyBSZWNlaXZlZCBPSyAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0JST0FEX0NOVCAgICAgIDB4MDAwMDAwODAgICAgLyogQnJvYWRjYXN0IFJYIEZyYW1lcyBSZWNlaXZlZCBPSyAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0lSTF9DTlQgICAgICAgIDB4MDAwMDAxMDAgICAgLyogUlggRnJhbWVzIFdpdGggSW4tUmFuZ2UgTGVuZ3RoIEVycm9ycyAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX09STF9DTlQgICAgICAgIDB4MDAwMDAyMDAgICAgLyogUlggRnJhbWVzIFdpdGggT3V0LU9mLVJhbmdlIExlbmd0aCBFcnJvcnMgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0xPTkdfQ05UICAgICAgIDB4MDAwMDA0MDAgICAgLyogUlggRnJhbWVzIFdpdGggRnJhbWUgVG9vIExvbmcgRXJyb3JzICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX01BQ0NUTF9DTlQgICAgIDB4MDAwMDA4MDAgICAgLyogTUFDIENvbnRyb2wgUlggRnJhbWVzIFJlY2VpdmVkICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX09QQ09ERV9DVEwgICAgIDB4MDAwMDEwMDAgICAgLyogVW5zdXBwb3J0ZWQgT3AtQ29kZSBSWCBGcmFtZXMgUmVjZWl2ZWQgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX1BBVVNFX0NOVCAgICAgIDB4MDAwMDIwMDAgICAgLyogUEFVU0VNQUMgQ29udHJvbCBSWCBGcmFtZXMgUmVjZWl2ZWQgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0FMTEZfQ05UICAgICAgIDB4MDAwMDQwMDAgICAgLyogQWxsIFJYIEZyYW1lcyBSZWNlaXZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0FMTE9fQ05UICAgICAgIDB4MDAwMDgwMDAgICAgLyogQWxsIFJYIE9jdGV0cyBSZWNlaXZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX1RZUEVEX0NOVCAgICAgIDB4MDAwMTAwMDAgICAgLyogVHlwZWQgUlggRnJhbWVzIFJlY2VpdmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX1NIT1JUX0NOVCAgICAgIDB4MDAwMjAwMDAgICAgLyogUlggRnJhbWUgRnJhZ21lbnRzICg8IDY0IEJ5dGVzKSBSZWNlaXZlZCAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0VRNjRfQ05UICAgICAgIDB4MDAwNDAwMDAgICAgLyogNjQtQnl0ZSBSWCBGcmFtZXMgUmVjZWl2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0xUMTI4X0NOVCAgICAgIDB4MDAwODAwMDAgICAgLyogNjUtMTI3LUJ5dGUgUlggRnJhbWVzIFJlY2VpdmVkICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0xUMjU2X0NOVCAgICAgIDB4MDAxMDAwMDAgICAgLyogMTI4LTI1NS1CeXRlIFJYIEZyYW1lcyBSZWNlaXZlZCAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0xUNTEyX0NOVCAgICAgIDB4MDAyMDAwMDAgICAgLyogMjU2LTUxMS1CeXRlIFJYIEZyYW1lcyBSZWNlaXZlZCAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0xUMTAyNF9DTlQgICAgIDB4MDA0MDAwMDAgICAgLyogNTEyLTEwMjMtQnl0ZSBSWCBGcmFtZXMgUmVjZWl2ZWQgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYX0dFMTAyNF9DTlQgICAgIDB4MDA4MDAwMDAgICAgLyogMTAyNC1NYXgtQnl0ZSBSWCBGcmFtZXMgUmVjZWl2ZWQgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIEVNQUNfTU1DX1RJUlFTIGFuZCBFTUFDX01NQ19USVJRRSBNYXNrcyAgKi8KKworI2RlZmluZQlUWF9PS19DTlQgICAgICAgICAweDAwMDAwMDAxICAgIC8qIFRYIEZyYW1lcyBTZW50IE9LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9TQ09MTF9DTlQgICAgICAweDAwMDAwMDAyICAgIC8qIFRYIEZyYW1lcyBXaXRoIFNpbmdsZSBDb2xsaXNpb25zICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9NQ09MTF9DTlQgICAgICAweDAwMDAwMDA0ICAgIC8qIFRYIEZyYW1lcyBXaXRoIE11bHRpcGxlIENvbGxpc2lvbnMgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9PQ1RFVF9DTlQgICAgICAweDAwMDAwMDA4ICAgIC8qIFRYIE9jdGV0cyBTZW50IE9LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9ERUZFUl9DTlQgICAgICAweDAwMDAwMDEwICAgIC8qIFRYIEZyYW1lcyBXaXRoIERlZmVycmVkIFRyYW5zbWlzc2lvbiAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9MQVRFX0NOVCAgICAgICAweDAwMDAwMDIwICAgIC8qIFRYIEZyYW1lcyBXaXRoIExhdGUgQ29sbGlzaW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9BQk9SVENfQ05UICAgICAweDAwMDAwMDQwICAgIC8qIFRYIEZyYW1lcyBBYm9ydGVkIER1ZSBUbyBFeGNlc3MgQ29sbGlzaW9ucyAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9MT1NUX0NOVCAgICAgICAweDAwMDAwMDgwICAgIC8qIFRYIEZyYW1lcyBMb3N0IER1ZSBUbyBJbnRlcm5hbCBNQUMgVFggRXJyb3IgICAgICAgICAgICAqLworI2RlZmluZQlUWF9DUlNfQ05UICAgICAgICAweDAwMDAwMTAwICAgIC8qIFRYIEZyYW1lcyBXaXRoIENhcnJpZXIgU2Vuc2UgRXJyb3JzICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9VTklfQ05UICAgICAgICAweDAwMDAwMjAwICAgIC8qIFVuaWNhc3QgVFggRnJhbWVzIFNlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9NVUxUSV9DTlQgICAgICAweDAwMDAwNDAwICAgIC8qIE11bHRpY2FzdCBUWCBGcmFtZXMgU2VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9CUk9BRF9DTlQgICAgICAweDAwMDAwODAwICAgIC8qIEJyb2FkY2FzdCBUWCBGcmFtZXMgU2VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9FWERFRl9DVEwgICAgICAweDAwMDAxMDAwICAgIC8qIFRYIEZyYW1lcyBXaXRoIEV4Y2Vzc2l2ZSBEZWZlcnJhbCAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9NQUNDVExfQ05UICAgICAweDAwMDAyMDAwICAgIC8qIE1BQyBDb250cm9sIFRYIEZyYW1lcyBTZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9BTExGX0NOVCAgICAgICAweDAwMDA0MDAwICAgIC8qIEFsbCBUWCBGcmFtZXMgU2VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9BTExPX0NOVCAgICAgICAweDAwMDA4MDAwICAgIC8qIEFsbCBUWCBPY3RldHMgU2VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9FUTY0X0NOVCAgICAgICAweDAwMDEwMDAwICAgIC8qIDY0LUJ5dGUgVFggRnJhbWVzIFNlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9MVDEyOF9DTlQgICAgICAweDAwMDIwMDAwICAgIC8qIDY1LTEyNy1CeXRlIFRYIEZyYW1lcyBTZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9MVDI1Nl9DTlQgICAgICAweDAwMDQwMDAwICAgIC8qIDEyOC0yNTUtQnl0ZSBUWCBGcmFtZXMgU2VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9MVDUxMl9DTlQgICAgICAweDAwMDgwMDAwICAgIC8qIDI1Ni01MTEtQnl0ZSBUWCBGcmFtZXMgU2VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9MVDEwMjRfQ05UICAgICAweDAwMTAwMDAwICAgIC8qIDUxMi0xMDIzLUJ5dGUgVFggRnJhbWVzIFNlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9HRTEwMjRfQ05UICAgICAweDAwMjAwMDAwICAgIC8qIDEwMjQtTWF4LUJ5dGUgVFggRnJhbWVzIFNlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlUWF9BQk9SVF9DTlQgICAgICAweDAwNDAwMDAwICAgIC8qIFRYIEZyYW1lcyBBYm9ydGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBTREggUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgU0RIX1BXUl9DVEwgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MDAgLyogU0RIIFBvd2VyIENvbnRyb2wgKi8KKyNkZWZpbmUgU0RIX0NMS19DVEwgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MDQgLyogU0RIIENsb2NrIENvbnRyb2wgKi8KKyNkZWZpbmUgU0RIX0FSR1VNRU5UICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MDggLyogU0RIIEFyZ3VtZW50ICovCisjZGVmaW5lIFNESF9DT01NQU5EICAgICAgICAgICAgICAgICAgICAweEZGQzAzOTBDIC8qIFNESCBDb21tYW5kICovCisjZGVmaW5lIFNESF9SRVNQX0NNRCAgICAgICAgICAgICAgICAgICAweEZGQzAzOTEwIC8qIFNESCBSZXNwb25zZSBDb21tYW5kICovCisjZGVmaW5lIFNESF9SRVNQT05TRTAgICAgICAgICAgICAgICAgICAweEZGQzAzOTE0IC8qIFNESCBSZXNwb25zZTAgKi8KKyNkZWZpbmUgU0RIX1JFU1BPTlNFMSAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MTggLyogU0RIIFJlc3BvbnNlMSAqLworI2RlZmluZSBTREhfUkVTUE9OU0UyICAgICAgICAgICAgICAgICAgMHhGRkMwMzkxQyAvKiBTREggUmVzcG9uc2UyICovCisjZGVmaW5lIFNESF9SRVNQT05TRTMgICAgICAgICAgICAgICAgICAweEZGQzAzOTIwIC8qIFNESCBSZXNwb25zZTMgKi8KKyNkZWZpbmUgU0RIX0RBVEFfVElNRVIgICAgICAgICAgICAgICAgIDB4RkZDMDM5MjQgLyogU0RIIERhdGEgVGltZXIgKi8KKyNkZWZpbmUgU0RIX0RBVEFfTEdUSCAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MjggLyogU0RIIERhdGEgTGVuZ3RoICovCisjZGVmaW5lIFNESF9EQVRBX0NUTCAgICAgICAgICAgICAgICAgICAweEZGQzAzOTJDIC8qIFNESCBEYXRhIENvbnRyb2wgKi8KKyNkZWZpbmUgU0RIX0RBVEFfQ05UICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MzAgLyogU0RIIERhdGEgQ291bnRlciAqLworI2RlZmluZSBTREhfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzkzNCAvKiBTREggU3RhdHVzICovCisjZGVmaW5lIFNESF9TVEFUVVNfQ0xSICAgICAgICAgICAgICAgICAweEZGQzAzOTM4IC8qIFNESCBTdGF0dXMgQ2xlYXIgKi8KKyNkZWZpbmUgU0RIX01BU0swICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5M0MgLyogU0RIIEludGVycnVwdDAgTWFzayAqLworI2RlZmluZSBTREhfTUFTSzEgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzk0MCAvKiBTREggSW50ZXJydXB0MSBNYXNrICovCisjZGVmaW5lIFNESF9GSUZPX0NOVCAgICAgICAgICAgICAgICAgICAweEZGQzAzOTQ4IC8qIFNESCBGSUZPIENvdW50ZXIgKi8KKyNkZWZpbmUgU0RIX0ZJRk8gICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5ODAgLyogU0RIIERhdGEgRklGTyAqLworI2RlZmluZSBTREhfRV9TVEFUVVMgICAgICAgICAgICAgICAgICAgMHhGRkMwMzlDMCAvKiBTREggRXhjZXB0aW9uIFN0YXR1cyAqLworI2RlZmluZSBTREhfRV9NQVNLICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzlDNCAvKiBTREggRXhjZXB0aW9uIE1hc2sgKi8KKyNkZWZpbmUgU0RIX0NGRyAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5QzggLyogU0RIIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgU0RIX1JEX1dBSVRfRU4gICAgICAgICAgICAgICAgIDB4RkZDMDM5Q0MgLyogU0RIIFJlYWQgV2FpdCBFbmFibGUgKi8KKyNkZWZpbmUgU0RIX1BJRDAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5RDAgLyogU0RIIFBlcmlwaGVyYWwgSWRlbnRpZmljYXRpb24wICovCisjZGVmaW5lIFNESF9QSUQxICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOUQ0IC8qIFNESCBQZXJpcGhlcmFsIElkZW50aWZpY2F0aW9uMSAqLworI2RlZmluZSBTREhfUElEMiAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzlEOCAvKiBTREggUGVyaXBoZXJhbCBJZGVudGlmaWNhdGlvbjIgKi8KKyNkZWZpbmUgU0RIX1BJRDMgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5REMgLyogU0RIIFBlcmlwaGVyYWwgSWRlbnRpZmljYXRpb24zICovCisjZGVmaW5lIFNESF9QSUQ0ICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOUUwIC8qIFNESCBQZXJpcGhlcmFsIElkZW50aWZpY2F0aW9uNCAqLworI2RlZmluZSBTREhfUElENSAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzlFNCAvKiBTREggUGVyaXBoZXJhbCBJZGVudGlmaWNhdGlvbjUgKi8KKyNkZWZpbmUgU0RIX1BJRDYgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5RTggLyogU0RIIFBlcmlwaGVyYWwgSWRlbnRpZmljYXRpb242ICovCisjZGVmaW5lIFNESF9QSUQ3ICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOUVDIC8qIFNESCBQZXJpcGhlcmFsIElkZW50aWZpY2F0aW9uNyAqLworCisvKiBSZW1vdmFibGUgU3RvcmFnZSBJbnRlcmZhY2UgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgUlNJX1BXUl9DT05UUk9MICAgICAgICAgICAgICAgIDB4RkZDMDM4MDAgLyogUlNJIFBvd2VyIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0NMS19DT05UUk9MICAgICAgICAgICAgICAgIDB4RkZDMDM4MDQgLyogUlNJIENsb2NrIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0FSR1VNRU5UICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4MDggLyogUlNJIEFyZ3VtZW50IFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9DT01NQU5EICAgICAgICAgICAgICAgICAgICAweEZGQzAzODBDIC8qIFJTSSBDb21tYW5kIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9SRVNQX0NNRCAgICAgICAgICAgICAgICAgICAweEZGQzAzODEwIC8qIFJTSSBSZXNwb25zZSBDb21tYW5kIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9SRVNQT05TRTAgICAgICAgICAgICAgICAgICAweEZGQzAzODE0IC8qIFJTSSBSZXNwb25zZSBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfUkVTUE9OU0UxICAgICAgICAgICAgICAgICAgMHhGRkMwMzgxOCAvKiBSU0kgUmVzcG9uc2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX1JFU1BPTlNFMiAgICAgICAgICAgICAgICAgIDB4RkZDMDM4MUMgLyogUlNJIFJlc3BvbnNlIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9SRVNQT05TRTMgICAgICAgICAgICAgICAgICAweEZGQzAzODIwIC8qIFJTSSBSZXNwb25zZSBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfREFUQV9USU1FUiAgICAgICAgICAgICAgICAgMHhGRkMwMzgyNCAvKiBSU0kgRGF0YSBUaW1lciBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfREFUQV9MR1RIICAgICAgICAgICAgICAgICAgMHhGRkMwMzgyOCAvKiBSU0kgRGF0YSBMZW5ndGggUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0RBVEFfQ09OVFJPTCAgICAgICAgICAgICAgIDB4RkZDMDM4MkMgLyogUlNJIERhdGEgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfREFUQV9DTlQgICAgICAgICAgICAgICAgICAgMHhGRkMwMzgzMCAvKiBSU0kgRGF0YSBDb3VudGVyIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAweEZGQzAzODM0IC8qIFJTSSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX1NUQVRVU0NMICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4MzggLyogUlNJIFN0YXR1cyBDbGVhciBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfTUFTSzAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzgzQyAvKiBSU0kgSW50ZXJydXB0IDAgTWFzayBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfTUFTSzEgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzg0MCAvKiBSU0kgSW50ZXJydXB0IDEgTWFzayBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfRklGT19DTlQgICAgICAgICAgICAgICAgICAgMHhGRkMwMzg0OCAvKiBSU0kgRklGTyBDb3VudGVyIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9DRUFUQV9DT05UUk9MICAgICAgICAgICAgICAweEZGQzAzODRDIC8qIFJTSSBDRUFUQSBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfRklGTyAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzg4MCAvKiBSU0kgRGF0YSBGSUZPIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9FU1RBVCAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOEMwIC8qIFJTSSBFeGNlcHRpb24gU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9FTUFTSyAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOEM0IC8qIFJTSSBFeGNlcHRpb24gTWFzayBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfQ09ORklHICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzhDOCAvKiBSU0kgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfUkRfV0FJVF9FTiAgICAgICAgICAgICAgICAgMHhGRkMwMzhDQyAvKiBSU0kgUmVhZCBXYWl0IEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfUElEMCAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwM0ZFMCAvKiBSU0kgUGVyaXBoZXJhbCBJRCBSZWdpc3RlciAwICovCisjZGVmaW5lIFJTSV9QSUQxICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzRkU0IC8qIFJTSSBQZXJpcGhlcmFsIElEIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgUlNJX1BJRDIgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDNGRTggLyogUlNJIFBlcmlwaGVyYWwgSUQgUmVnaXN0ZXIgMiAqLworI2RlZmluZSBSU0lfUElEMyAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwM0ZFQyAvKiBSU0kgUGVyaXBoZXJhbCBJRCBSZWdpc3RlciAzICovCisjZGVmaW5lIFJTSV9QSUQ0ICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzRkYwIC8qIFJTSSBQZXJpcGhlcmFsIElEIFJlZ2lzdGVyIDQgKi8KKyNkZWZpbmUgUlNJX1BJRDUgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDNGRjQgLyogUlNJIFBlcmlwaGVyYWwgSUQgUmVnaXN0ZXIgNSAqLworI2RlZmluZSBSU0lfUElENiAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwM0ZGOCAvKiBSU0kgUGVyaXBoZXJhbCBJRCBSZWdpc3RlciA2ICovCisjZGVmaW5lIFJTSV9QSUQ3ICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzRkZDIC8qIFJTSSBQZXJpcGhlcmFsIElEIFJlZ2lzdGVyIDcgKi8KKworLyogUFRQIFRTWU5DIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIEVNQUNfUFRQX0NUTCAgICAgICAgICAgICAgICAgICAweEZGQzAzMEEwIC8qIFBUUCBCbG9jayBDb250cm9sICovCisjZGVmaW5lIEVNQUNfUFRQX0lFICAgICAgICAgICAgICAgICAgICAweEZGQzAzMEE0IC8qIFBUUCBCbG9jayBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIEVNQUNfUFRQX0lTVEFUICAgICAgICAgICAgICAgICAweEZGQzAzMEE4IC8qIFBUUCBCbG9jayBJbnRlcnJ1cHQgU3RhdHVzICovCisjZGVmaW5lIEVNQUNfUFRQX0ZPRkYgICAgICAgICAgICAgICAgICAweEZGQzAzMEFDIC8qIFBUUCBGaWx0ZXIgb2Zmc2V0IFJlZ2lzdGVyICovCisjZGVmaW5lIEVNQUNfUFRQX0ZWMSAgICAgICAgICAgICAgICAgICAweEZGQzAzMEIwIC8qIFBUUCBGaWx0ZXIgVmFsdWUgUmVnaXN0ZXIgMSAqLworI2RlZmluZSBFTUFDX1BUUF9GVjIgICAgICAgICAgICAgICAgICAgMHhGRkMwMzBCNCAvKiBQVFAgRmlsdGVyIFZhbHVlIFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgRU1BQ19QVFBfRlYzICAgICAgICAgICAgICAgICAgIDB4RkZDMDMwQjggLyogUFRQIEZpbHRlciBWYWx1ZSBSZWdpc3RlciAzICovCisjZGVmaW5lIEVNQUNfUFRQX0FEREVORCAgICAgICAgICAgICAgICAweEZGQzAzMEJDIC8qIFBUUCBBZGRlbmQgZm9yIEZyZXF1ZW5jeSBDb21wZW5zYXRpb24gKi8KKyNkZWZpbmUgRU1BQ19QVFBfQUNDUiAgICAgICAgICAgICAgICAgIDB4RkZDMDMwQzAgLyogUFRQIEFjY3VtdWxhdG9yIGZvciBGcmVxdWVuY3kgQ29tcGVuc2F0aW9uICovCisjZGVmaW5lIEVNQUNfUFRQX09GRlNFVCAgICAgICAgICAgICAgICAweEZGQzAzMEM0IC8qIFBUUCBUaW1lIE9mZnNldCBSZWdpc3RlciAqLworI2RlZmluZSBFTUFDX1BUUF9USU1FTE8gICAgICAgICAgICAgICAgMHhGRkMwMzBDOCAvKiBQVFAgUHJlY2lzaW9uIENsb2NrIFRpbWUgTG93ICovCisjZGVmaW5lIEVNQUNfUFRQX1RJTUVISSAgICAgICAgICAgICAgICAweEZGQzAzMENDIC8qIFBUUCBQcmVjaXNpb24gQ2xvY2sgVGltZSBIaWdoICovCisjZGVmaW5lIEVNQUNfUFRQX1JYU05BUExPICAgICAgICAgICAgICAweEZGQzAzMEQwIC8qIFBUUCBSZWNlaXZlIFNuYXBzaG90IFJlZ2lzdGVyIExvdyAqLworI2RlZmluZSBFTUFDX1BUUF9SWFNOQVBISSAgICAgICAgICAgICAgMHhGRkMwMzBENCAvKiBQVFAgUmVjZWl2ZSBTbmFwc2hvdCBSZWdpc3RlciBIaWdoICovCisjZGVmaW5lIEVNQUNfUFRQX1RYU05BUExPICAgICAgICAgICAgICAweEZGQzAzMEQ4IC8qIFBUUCBUcmFuc21pdCBTbmFwc2hvdCBSZWdpc3RlciBMb3cgKi8KKyNkZWZpbmUgRU1BQ19QVFBfVFhTTkFQSEkgICAgICAgICAgICAgIDB4RkZDMDMwREMgLyogUFRQIFRyYW5zbWl0IFNuYXBzaG90IFJlZ2lzdGVyIEhpZ2ggKi8KKyNkZWZpbmUgRU1BQ19QVFBfQUxBUk1MTyAgICAgICAgICAgICAgIDB4RkZDMDMwRTAgLyogUFRQIEFsYXJtIHRpbWUgTG93ICovCisjZGVmaW5lIEVNQUNfUFRQX0FMQVJNSEkgICAgICAgICAgICAgICAweEZGQzAzMEU0IC8qIFBUUCBBbGFybSB0aW1lIEhpZ2ggKi8KKyNkZWZpbmUgRU1BQ19QVFBfSURfT0ZGICAgICAgICAgICAgICAgIDB4RkZDMDMwRTggLyogUFRQIENhcHR1cmUgSUQgb2Zmc2V0IHJlZ2lzdGVyICovCisjZGVmaW5lIEVNQUNfUFRQX0lEX1NOQVAgICAgICAgICAgICAgICAweEZGQzAzMEVDIC8qIFBUUCBDYXB0dXJlIElEIHJlZ2lzdGVyICovCisjZGVmaW5lIEVNQUNfUFRQX1BQU19TVEFSVExPICAgICAgICAgICAweEZGQzAzMEYwIC8qIFBQUyBTdGFydCBUaW1lIExvdyAqLworI2RlZmluZSBFTUFDX1BUUF9QUFNfU1RBUlRISSAgICAgICAgICAgMHhGRkMwMzBGNCAvKiBQUFMgU3RhcnQgVGltZSBIaWdoICovCisjZGVmaW5lIEVNQUNfUFRQX1BQU19QRVJJT0QgICAgICAgICAgICAweEZGQzAzMEY4IC8qIFBQUyBDb3VudCBSZWdpc3RlciAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAgICAgU0lOR0xFIEJJVCBNQUNSTyBQQUlSUyAoYml0IG1hc2sgYW5kIG5lZ2F0ZWQgb25lKSAgICAgICovCisvKiAgICAgYW5kIE1VTFRJIEJJVCBSRUFEIE1BQ1JPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKy8qIEJpdCBtYXNrcyBmb3IgU0RIX0NPTU1BTkQgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICBDTURfSURYICAweDNmICAgICAgIC8qIENvbW1hbmQgSW5kZXggKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgQ01EX1JTUCAgMHg0MCAgICAgICAvKiBSZXNwb25zZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgQ01EX0xfUlNQICAweDgwICAgICAgIC8qIExvbmcgUmVzcG9uc2UgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIENNRF9JTlRfRSAgMHgxMDAgICAgICAvKiBDb21tYW5kIEludGVycnVwdCAqLworI2RlZmluZSAgICAgICAgICAgICAgICBDTURfUEVORF9FICAweDIwMCAgICAgIC8qIENvbW1hbmQgUGVuZGluZyAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIENNRF9FICAweDQwMCAgICAgIC8qIENvbW1hbmQgRW5hYmxlICovCisKKy8qIEJpdCBtYXNrcyBmb3IgU0RIX1BXUl9DVEwgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgUFdSX09OICAweDMgICAgICAgIC8qIFBvd2VyIE9uICovCisjaWYgMAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgVEJEICAweDNjICAgICAgIC8qIFRCRCAqLworI2VuZGlmCisjZGVmaW5lICAgICAgICAgICAgICAgICBTRF9DTURfT0QgIDB4NDAgICAgICAgLyogT3BlbiBEcmFpbiBPdXRwdXQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgUk9EX0NUTCAgMHg4MCAgICAgICAvKiBSb2QgQ29udHJvbCAqLworCisvKiBCaXQgbWFza3MgZm9yIFNESF9DTEtfQ1RMICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIENMS0RJViAgMHhmZiAgICAgICAvKiBNQ19DTEsgRGl2aXNvciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIENMS19FICAweDEwMCAgICAgIC8qIE1DX0NMSyBCdXMgQ2xvY2sgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgUFdSX1NWX0UgIDB4MjAwICAgICAgLyogUG93ZXIgU2F2ZSBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgQ0xLRElWX0JZUEFTUyAgMHg0MDAgICAgICAvKiBCeXBhc3MgRGl2aXNvciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIFdJREVfQlVTICAweDgwMCAgICAgIC8qIFdpZGUgQnVzIE1vZGUgRW5hYmxlICovCisKKy8qIEJpdCBtYXNrcyBmb3IgU0RIX1JFU1BfQ01EICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICBSRVNQX0NNRCAgMHgzZiAgICAgICAvKiBSZXNwb25zZSBDb21tYW5kICovCisKKy8qIEJpdCBtYXNrcyBmb3IgU0RIX0RBVEFfQ1RMICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBEVFhfRSAgMHgxICAgICAgICAvKiBEYXRhIFRyYW5zZmVyIEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBEVFhfRElSICAweDIgICAgICAgIC8qIERhdGEgVHJhbnNmZXIgRGlyZWN0aW9uICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgRFRYX01PREUgIDB4NCAgICAgICAgLyogRGF0YSBUcmFuc2ZlciBNb2RlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBEVFhfRE1BX0UgIDB4OCAgICAgICAgLyogRGF0YSBUcmFuc2ZlciBETUEgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICBEVFhfQkxLX0xHVEggIDB4ZjAgICAgICAgLyogRGF0YSBUcmFuc2ZlciBCbG9jayBMZW5ndGggKi8KKworLyogQml0IG1hc2tzIGZvciBTREhfU1RBVFVTICovCisKKyNkZWZpbmUgICAgICAgICAgICAgIENNRF9DUkNfRkFJTCAgMHgxICAgICAgICAvKiBDTUQgQ1JDIEZhaWwgKi8KKyNkZWZpbmUgICAgICAgICAgICAgIERBVF9DUkNfRkFJTCAgMHgyICAgICAgICAvKiBEYXRhIENSQyBGYWlsICovCisjZGVmaW5lICAgICAgICAgICAgICAgQ01EX1RJTUVfT1VUICAweDQgICAgICAgIC8qIENNRCBUaW1lIE91dCAqLworI2RlZmluZSAgICAgICAgICAgICAgIERBVF9USU1FX09VVCAgMHg4ICAgICAgICAvKiBEYXRhIFRpbWUgT3V0ICovCisjZGVmaW5lICAgICAgICAgICAgICAgVFhfVU5ERVJSVU4gIDB4MTAgICAgICAgLyogVHJhbnNtaXQgVW5kZXJydW4gKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgUlhfT1ZFUlJVTiAgMHgyMCAgICAgICAvKiBSZWNlaXZlIE92ZXJydW4gKi8KKyNkZWZpbmUgICAgICAgICAgICAgIENNRF9SRVNQX0VORCAgMHg0MCAgICAgICAvKiBDTUQgUmVzcG9uc2UgRW5kICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgQ01EX1NFTlQgIDB4ODAgICAgICAgLyogQ01EIFNlbnQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgREFUX0VORCAgMHgxMDAgICAgICAvKiBEYXRhIEVuZCAqLworI2RlZmluZSAgICAgICAgICAgICBTVEFSVF9CSVRfRVJSICAweDIwMCAgICAgIC8qIFN0YXJ0IEJpdCBFcnJvciAqLworI2RlZmluZSAgICAgICAgICAgICAgIERBVF9CTEtfRU5EICAweDQwMCAgICAgIC8qIERhdGEgQmxvY2sgRW5kICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIENNRF9BQ1QgIDB4ODAwICAgICAgLyogQ01EIEFjdGl2ZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgVFhfQUNUICAweDEwMDAgICAgIC8qIFRyYW5zbWl0IEFjdGl2ZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgUlhfQUNUICAweDIwMDAgICAgIC8qIFJlY2VpdmUgQWN0aXZlICovCisjZGVmaW5lICAgICAgICAgICAgICBUWF9GSUZPX1NUQVQgIDB4NDAwMCAgICAgLyogVHJhbnNtaXQgRklGTyBTdGF0dXMgKi8KKyNkZWZpbmUgICAgICAgICAgICAgIFJYX0ZJRk9fU1RBVCAgMHg4MDAwICAgICAvKiBSZWNlaXZlIEZJRk8gU3RhdHVzICovCisjZGVmaW5lICAgICAgICAgICAgICBUWF9GSUZPX0ZVTEwgIDB4MTAwMDAgICAgLyogVHJhbnNtaXQgRklGTyBGdWxsICovCisjZGVmaW5lICAgICAgICAgICAgICBSWF9GSUZPX0ZVTEwgIDB4MjAwMDAgICAgLyogUmVjZWl2ZSBGSUZPIEZ1bGwgKi8KKyNkZWZpbmUgICAgICAgICAgICAgIFRYX0ZJRk9fWkVSTyAgMHg0MDAwMCAgICAvKiBUcmFuc21pdCBGSUZPIEVtcHR5ICovCisjZGVmaW5lICAgICAgICAgICAgICAgUlhfREFUX1pFUk8gIDB4ODAwMDAgICAgLyogUmVjZWl2ZSBGSUZPIEVtcHR5ICovCisjZGVmaW5lICAgICAgICAgICAgICAgIFRYX0RBVF9SRFkgIDB4MTAwMDAwICAgLyogVHJhbnNtaXQgRGF0YSBBdmFpbGFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICBSWF9GSUZPX1JEWSAgMHgyMDAwMDAgICAvKiBSZWNlaXZlIERhdGEgQXZhaWxhYmxlICovCisKKy8qIEJpdCBtYXNrcyBmb3IgU0RIX1NUQVRVU19DTFIgKi8KKworI2RlZmluZSAgICAgICAgIENNRF9DUkNfRkFJTF9TVEFUICAweDEgICAgICAgIC8qIENNRCBDUkMgRmFpbCBTdGF0dXMgKi8KKyNkZWZpbmUgICAgICAgICBEQVRfQ1JDX0ZBSUxfU1RBVCAgMHgyICAgICAgICAvKiBEYXRhIENSQyBGYWlsIFN0YXR1cyAqLworI2RlZmluZSAgICAgICAgICBDTURfVElNRU9VVF9TVEFUICAweDQgICAgICAgIC8qIENNRCBUaW1lIE91dCBTdGF0dXMgKi8KKyNkZWZpbmUgICAgICAgICAgREFUX1RJTUVPVVRfU1RBVCAgMHg4ICAgICAgICAvKiBEYXRhIFRpbWUgT3V0IHN0YXR1cyAqLworI2RlZmluZSAgICAgICAgICBUWF9VTkRFUlJVTl9TVEFUICAweDEwICAgICAgIC8qIFRyYW5zbWl0IFVuZGVycnVuIFN0YXR1cyAqLworI2RlZmluZSAgICAgICAgICAgUlhfT1ZFUlJVTl9TVEFUICAweDIwICAgICAgIC8qIFJlY2VpdmUgT3ZlcnJ1biBTdGF0dXMgKi8KKyNkZWZpbmUgICAgICAgICBDTURfUkVTUF9FTkRfU1RBVCAgMHg0MCAgICAgICAvKiBDTUQgUmVzcG9uc2UgRW5kIFN0YXR1cyAqLworI2RlZmluZSAgICAgICAgICAgICBDTURfU0VOVF9TVEFUICAweDgwICAgICAgIC8qIENNRCBTZW50IFN0YXR1cyAqLworI2RlZmluZSAgICAgICAgICAgICAgREFUX0VORF9TVEFUICAweDEwMCAgICAgIC8qIERhdGEgRW5kIFN0YXR1cyAqLworI2RlZmluZSAgICAgICAgU1RBUlRfQklUX0VSUl9TVEFUICAweDIwMCAgICAgIC8qIFN0YXJ0IEJpdCBFcnJvciBTdGF0dXMgKi8KKyNkZWZpbmUgICAgICAgICAgREFUX0JMS19FTkRfU1RBVCAgMHg0MDAgICAgICAvKiBEYXRhIEJsb2NrIEVuZCBTdGF0dXMgKi8KKworLyogQml0IG1hc2tzIGZvciBTREhfTUFTSzAgKi8KKworI2RlZmluZSAgICAgICAgIENNRF9DUkNfRkFJTF9NQVNLICAweDEgICAgICAgIC8qIENNRCBDUkMgRmFpbCBNYXNrICovCisjZGVmaW5lICAgICAgICAgREFUX0NSQ19GQUlMX01BU0sgIDB4MiAgICAgICAgLyogRGF0YSBDUkMgRmFpbCBNYXNrICovCisjZGVmaW5lICAgICAgICAgIENNRF9USU1FT1VUX01BU0sgIDB4NCAgICAgICAgLyogQ01EIFRpbWUgT3V0IE1hc2sgKi8KKyNkZWZpbmUgICAgICAgICAgREFUX1RJTUVPVVRfTUFTSyAgMHg4ICAgICAgICAvKiBEYXRhIFRpbWUgT3V0IE1hc2sgKi8KKyNkZWZpbmUgICAgICAgICAgVFhfVU5ERVJSVU5fTUFTSyAgMHgxMCAgICAgICAvKiBUcmFuc21pdCBVbmRlcnJ1biBNYXNrICovCisjZGVmaW5lICAgICAgICAgICBSWF9PVkVSUlVOX01BU0sgIDB4MjAgICAgICAgLyogUmVjZWl2ZSBPdmVycnVuIE1hc2sgKi8KKyNkZWZpbmUgICAgICAgICBDTURfUkVTUF9FTkRfTUFTSyAgMHg0MCAgICAgICAvKiBDTUQgUmVzcG9uc2UgRW5kIE1hc2sgKi8KKyNkZWZpbmUgICAgICAgICAgICAgQ01EX1NFTlRfTUFTSyAgMHg4MCAgICAgICAvKiBDTUQgU2VudCBNYXNrICovCisjZGVmaW5lICAgICAgICAgICAgICBEQVRfRU5EX01BU0sgIDB4MTAwICAgICAgLyogRGF0YSBFbmQgTWFzayAqLworI2RlZmluZSAgICAgICAgU1RBUlRfQklUX0VSUl9NQVNLICAweDIwMCAgICAgIC8qIFN0YXJ0IEJpdCBFcnJvciBNYXNrICovCisjZGVmaW5lICAgICAgICAgIERBVF9CTEtfRU5EX01BU0sgIDB4NDAwICAgICAgLyogRGF0YSBCbG9jayBFbmQgTWFzayAqLworI2RlZmluZSAgICAgICAgICAgICAgQ01EX0FDVF9NQVNLICAweDgwMCAgICAgIC8qIENNRCBBY3RpdmUgTWFzayAqLworI2RlZmluZSAgICAgICAgICAgICAgIFRYX0FDVF9NQVNLICAweDEwMDAgICAgIC8qIFRyYW5zbWl0IEFjdGl2ZSBNYXNrICovCisjZGVmaW5lICAgICAgICAgICAgICAgUlhfQUNUX01BU0sgIDB4MjAwMCAgICAgLyogUmVjZWl2ZSBBY3RpdmUgTWFzayAqLworI2RlZmluZSAgICAgICAgIFRYX0ZJRk9fU1RBVF9NQVNLICAweDQwMDAgICAgIC8qIFRyYW5zbWl0IEZJRk8gU3RhdHVzIE1hc2sgKi8KKyNkZWZpbmUgICAgICAgICBSWF9GSUZPX1NUQVRfTUFTSyAgMHg4MDAwICAgICAvKiBSZWNlaXZlIEZJRk8gU3RhdHVzIE1hc2sgKi8KKyNkZWZpbmUgICAgICAgICBUWF9GSUZPX0ZVTExfTUFTSyAgMHgxMDAwMCAgICAvKiBUcmFuc21pdCBGSUZPIEZ1bGwgTWFzayAqLworI2RlZmluZSAgICAgICAgIFJYX0ZJRk9fRlVMTF9NQVNLICAweDIwMDAwICAgIC8qIFJlY2VpdmUgRklGTyBGdWxsIE1hc2sgKi8KKyNkZWZpbmUgICAgICAgICBUWF9GSUZPX1pFUk9fTUFTSyAgMHg0MDAwMCAgICAvKiBUcmFuc21pdCBGSUZPIEVtcHR5IE1hc2sgKi8KKyNkZWZpbmUgICAgICAgICAgUlhfREFUX1pFUk9fTUFTSyAgMHg4MDAwMCAgICAvKiBSZWNlaXZlIEZJRk8gRW1wdHkgTWFzayAqLworI2RlZmluZSAgICAgICAgICAgVFhfREFUX1JEWV9NQVNLICAweDEwMDAwMCAgIC8qIFRyYW5zbWl0IERhdGEgQXZhaWxhYmxlIE1hc2sgKi8KKyNkZWZpbmUgICAgICAgICAgUlhfRklGT19SRFlfTUFTSyAgMHgyMDAwMDAgICAvKiBSZWNlaXZlIERhdGEgQXZhaWxhYmxlIE1hc2sgKi8KKworLyogQml0IG1hc2tzIGZvciBTREhfRklGT19DTlQgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICBGSUZPX0NPVU5UICAweDdmZmYgICAgIC8qIEZJRk8gQ291bnQgKi8KKworLyogQml0IG1hc2tzIGZvciBTREhfRV9TVEFUVVMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgU0RJT19JTlRfREVUICAweDIgICAgICAgIC8qIFNESU8gSW50IERldGVjdGVkICovCisjZGVmaW5lICAgICAgICAgICAgICAgU0RfQ0FSRF9ERVQgIDB4MTAgICAgICAgLyogU0QgQ2FyZCBEZXRlY3QgKi8KKworLyogQml0IG1hc2tzIGZvciBTREhfRV9NQVNLICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICBTRElPX01TSyAgMHgyICAgICAgICAvKiBNYXNrIFNESU8gSW50IERldGVjdGVkICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIFNDRF9NU0sgIDB4NDAgICAgICAgLyogTWFzayBDYXJkIERldGVjdCAqLworCisvKiBCaXQgbWFza3MgZm9yIFNESF9DRkcgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICBDTEtTX0VOICAweDEgICAgICAgIC8qIENsb2NrcyBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgU0Q0RSAgMHg0ICAgICAgICAvKiBTRElPIDQtQml0IEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgTVdFICAweDggICAgICAgIC8qIE1vdmluZyBXaW5kb3cgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBTRF9SU1QgIDB4MTAgICAgICAgLyogU0RNTUMgUmVzZXQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIFBVUF9TRERBVCAgMHgyMCAgICAgICAvKiBQdWxsLXVwIFNEX0RBVCAqLworI2RlZmluZSAgICAgICAgICAgICAgICBQVVBfU0REQVQzICAweDQwICAgICAgIC8qIFB1bGwtdXAgU0RfREFUMyAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgUERfU0REQVQzICAweDgwICAgICAgIC8qIFB1bGwtZG93biBTRF9EQVQzICovCisKKy8qIEJpdCBtYXNrcyBmb3IgU0RIX1JEX1dBSVRfRU4gKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgUldSICAweDEgICAgICAgIC8qIFJlYWQgV2FpdCBSZXF1ZXN0ICovCisKKyNlbmRpZiAvKiBfREVGX0JGNTE4X0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZGVmQkY1MXhfYmFzZS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9kZWZCRjUxeF9iYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJlYzhkMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZGVmQkY1MXhfYmFzZS5oCkBAIC0wLDAgKzEsMTk0MCBAQAorLyoKKyAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUxOC9kZWZCRjUxeF9iYXNlLmgKKyAqIEJhc2VkIG9uOgorICogQXV0aG9yOgorICoKKyAqIENyZWF0ZWQ6CisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBSZXY6CisgKgorICogTW9kaWZpZWQ6CisgKgorICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAqIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfREVGX0JGNTFYX0gKKyNkZWZpbmUgX0RFRl9CRjUxWF9ICisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICAgU1lTVEVNICYgTU1SIEFERFJFU1MgREVGSU5JVElPTlMgQ09NTU9OIFRPIEFMTCBBRFNQLUJGNTF4ICAgICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKiBDbG9jayBhbmQgU3lzdGVtIENvbnRyb2wJKDB4RkZDMDAwMDAgLSAweEZGQzAwMEZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgUExMX0NUTAkJCQkweEZGQzAwMDAwCS8qIFBMTCBDb250cm9sIFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgUExMX0RJVgkJCQkweEZGQzAwMDA0CS8qIFBMTCBEaXZpZGUgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBWUl9DVEwJCQkJMHhGRkMwMDAwOAkvKiBWb2x0YWdlIFJlZ3VsYXRvciBDb250cm9sIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFBMTF9TVEFUCQkJMHhGRkMwMDAwQwkvKiBQTEwgU3RhdHVzIFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgUExMX0xPQ0tDTlQJCQkweEZGQzAwMDEwCS8qIFBMTCBMb2NrIENvdW50IFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBDSElQSUQJCQkJMHhGRkMwMDAxNAkvKiBEZXZpY2UgSUQgUmVnaXN0ZXIgKi8KKworLyogU3lzdGVtIEludGVycnVwdCBDb250cm9sbGVyICgweEZGQzAwMTAwIC0gMHhGRkMwMDFGRikJCQkJCQkJCSovCisjZGVmaW5lIFNXUlNUCQkJCTB4RkZDMDAxMDAJLyogU29mdHdhcmUgUmVzZXQgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFNZU0NSCQkJCTB4RkZDMDAxMDQJLyogU3lzdGVtIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgU0lDX1JWRUNUCQkJMHhGRkMwMDEwOAkvKiBJbnRlcnJ1cHQgUmVzZXQgVmVjdG9yIEFkZHJlc3MgUmVnaXN0ZXIJCQkqLworCisjZGVmaW5lIFNJQ19JTUFTSzAJCQkweEZGQzAwMTBDCS8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBTSUNfSUFSMAkJCTB4RkZDMDAxMTAJLyogSW50ZXJydXB0IEFzc2lnbm1lbnQgUmVnaXN0ZXIgMAkJCQkqLworI2RlZmluZSBTSUNfSUFSMQkJCTB4RkZDMDAxMTQJLyogSW50ZXJydXB0IEFzc2lnbm1lbnQgUmVnaXN0ZXIgMQkJCQkqLworI2RlZmluZSBTSUNfSUFSMgkJCTB4RkZDMDAxMTgJLyogSW50ZXJydXB0IEFzc2lnbm1lbnQgUmVnaXN0ZXIgMgkJCQkqLworI2RlZmluZSBTSUNfSUFSMwkJCTB4RkZDMDAxMUMJLyogSW50ZXJydXB0IEFzc2lnbm1lbnQgUmVnaXN0ZXIgMwkJCQkqLworI2RlZmluZSBTSUNfSVNSMAkJCTB4RkZDMDAxMjAJLyogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgU0lDX0lXUjAJCQkweEZGQzAwMTI0CS8qIEludGVycnVwdCBXYWtldXAgUmVnaXN0ZXIJCQkJCSovCisKKy8qIFNJQyBBZGRpdGlvbnMgdG8gQURTUC1CRjUxeCAoMHhGRkMwMDE0QyAtIDB4RkZDMDAxNjIpICovCisjZGVmaW5lIFNJQ19JTUFTSzEgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMDE0QyAgICAgLyogSW50ZXJydXB0IE1hc2sgcmVnaXN0ZXIgb2YgU0lDMiAqLworI2RlZmluZSBTSUNfSUFSNCAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDAxNTAgICAgIC8qIEludGVycnVwdCBBc3NpZ25tZW50IHJlZ2lzdGVyNCAqLworI2RlZmluZSBTSUNfSUFSNSAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDAxNTQgICAgIC8qIEludGVycnVwdCBBc3NpZ25tZW50IHJlZ2lzdGVyNSAqLworI2RlZmluZSBTSUNfSUFSNiAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDAxNTggICAgIC8qIEludGVycnVwdCBBc3NpZ25tZW50IHJlZ2lzdGVyNiAqLworI2RlZmluZSBTSUNfSUFSNyAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDAxNUMgICAgIC8qIEludGVycnVwdCBBc3NpZ25tZW50IHJlZ2lzdGVyNyAqLworI2RlZmluZSBTSUNfSVNSMSAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDAxNjAgICAgIC8qIEludGVycnVwdCBTdGF0dXIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0lDX0lXUjEgICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAwMTY0ICAgICAvKiBJbnRlcnJ1cHQgV2FrZXVwIHJlZ2lzdGVyICovCisKKworLyogV2F0Y2hkb2cgVGltZXIJCQkoMHhGRkMwMDIwMCAtIDB4RkZDMDAyRkYpCQkJCQkJCQkqLworI2RlZmluZSBXRE9HX0NUTAkJCTB4RkZDMDAyMDAJLyogV2F0Y2hkb2cgQ29udHJvbCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBXRE9HX0NOVAkJCTB4RkZDMDAyMDQJLyogV2F0Y2hkb2cgQ291bnQgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFdET0dfU1RBVAkJCTB4RkZDMDAyMDgJLyogV2F0Y2hkb2cgU3RhdHVzIFJlZ2lzdGVyCQkJCQkqLworCisKKy8qIFJlYWwgVGltZSBDbG9jawkJKDB4RkZDMDAzMDAgLSAweEZGQzAwM0ZGKQkJCQkJCQkJCSovCisjZGVmaW5lIFJUQ19TVEFUCQkJMHhGRkMwMDMwMAkvKiBSVEMgU3RhdHVzIFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgUlRDX0lDVEwJCQkweEZGQzAwMzA0CS8qIFJUQyBJbnRlcnJ1cHQgQ29udHJvbCBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFJUQ19JU1RBVAkJCTB4RkZDMDAzMDgJLyogUlRDIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBSVENfU1dDTlQJCQkweEZGQzAwMzBDCS8qIFJUQyBTdG9wd2F0Y2ggQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgUlRDX0FMQVJNCQkJMHhGRkMwMDMxMAkvKiBSVEMgQWxhcm0gVGltZSBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgUlRDX0ZBU1QJCQkweEZGQzAwMzE0CS8qIFJUQyBQcmVzY2FsZXIgRW5hYmxlIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUlRDX1BSRU4JCQkweEZGQzAwMzE0CS8qIFJUQyBQcmVzY2FsZXIgRW5hYmxlIEFsdGVybmF0ZSBNYWNybwkJKi8KKworCisvKiBVQVJUMCBDb250cm9sbGVyCQkoMHhGRkMwMDQwMCAtIDB4RkZDMDA0RkYpCQkJCQkJCQkJKi8KKyNkZWZpbmUgVUFSVDBfVEhSCQkJMHhGRkMwMDQwMAkvKiBUcmFuc21pdCBIb2xkaW5nIHJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFVBUlQwX1JCUgkJCTB4RkZDMDA0MDAJLyogUmVjZWl2ZSBCdWZmZXIgcmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFVBUlQwX0RMTAkJCTB4RkZDMDA0MDAJLyogRGl2aXNvciBMYXRjaCAoTG93LUJ5dGUpCQkJCQkqLworI2RlZmluZSBVQVJUMF9JRVIJCQkweEZGQzAwNDA0CS8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgVUFSVDBfRExICQkJMHhGRkMwMDQwNAkvKiBEaXZpc29yIExhdGNoIChIaWdoLUJ5dGUpCQkJCSovCisjZGVmaW5lIFVBUlQwX0lJUgkJCTB4RkZDMDA0MDgJLyogSW50ZXJydXB0IElkZW50aWZpY2F0aW9uIFJlZ2lzdGVyCQkqLworI2RlZmluZSBVQVJUMF9MQ1IJCQkweEZGQzAwNDBDCS8qIExpbmUgQ29udHJvbCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgVUFSVDBfTUNSCQkJMHhGRkMwMDQxMAkvKiBNb2RlbSBDb250cm9sIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBVQVJUMF9MU1IJCQkweEZGQzAwNDE0CS8qIExpbmUgU3RhdHVzIFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgVUFSVDBfTVNSCQkJMHhGRkMwMDQxOAkvKiBNb2RlbSBTdGF0dXMgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFVBUlQwX1NDUgkJCTB4RkZDMDA0MUMJLyogU0NSIFNjcmF0Y2ggUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBVQVJUMF9HQ1RMCQkJMHhGRkMwMDQyNAkvKiBHbG9iYWwgQ29udHJvbCBSZWdpc3RlcgkJCQkJKi8KKworLyogU1BJMCBDb250cm9sbGVyCQkJKDB4RkZDMDA1MDAgLSAweEZGQzAwNUZGKQkJCQkJCQkqLworI2RlZmluZSBTUEkwX1JFR0JBU0UJCQkweEZGQzAwNTAwCisjZGVmaW5lIFNQSTBfQ1RMCQkJMHhGRkMwMDUwMAkvKiBTUEkgQ29udHJvbCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFNQSTBfRkxHCQkJMHhGRkMwMDUwNAkvKiBTUEkgRmxhZyByZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFNQSTBfU1RBVAkJCTB4RkZDMDA1MDgJLyogU1BJIFN0YXR1cyByZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFNQSTBfVERCUgkJCTB4RkZDMDA1MEMJLyogU1BJIFRyYW5zbWl0IERhdGEgQnVmZmVyIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFNQSTBfUkRCUgkJCTB4RkZDMDA1MTAJLyogU1BJIFJlY2VpdmUgRGF0YSBCdWZmZXIgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgU1BJMF9CQVVECQkJMHhGRkMwMDUxNAkvKiBTUEkgQmF1ZCByYXRlIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBTUEkwX1NIQURPVwkJCTB4RkZDMDA1MTgJLyogU1BJX1JEQlIgU2hhZG93IFJlZ2lzdGVyCQkJCQkqLworCisvKiBTUEkxIENvbnRyb2xsZXIJCQkoMHhGRkMwMzQwMCAtIDB4RkZDMDM0RkYpCQkJCQkJCSovCisjZGVmaW5lIFNQSTFfUkVHQkFTRQkJCTB4RkZDMDM0MDAKKyNkZWZpbmUgU1BJMV9DVEwJCQkweEZGQzAzNDAwCS8qIFNQSSBDb250cm9sIFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgU1BJMV9GTEcJCQkweEZGQzAzNDA0CS8qIFNQSSBGbGFnIHJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgU1BJMV9TVEFUCQkJMHhGRkMwMzQwOAkvKiBTUEkgU3RhdHVzIHJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgU1BJMV9UREJSCQkJMHhGRkMwMzQwQwkvKiBTUEkgVHJhbnNtaXQgRGF0YSBCdWZmZXIgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgU1BJMV9SREJSCQkJMHhGRkMwMzQxMAkvKiBTUEkgUmVjZWl2ZSBEYXRhIEJ1ZmZlciBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBTUEkxX0JBVUQJCQkweEZGQzAzNDE0CS8qIFNQSSBCYXVkIHJhdGUgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFNQSTFfU0hBRE9XCQkJMHhGRkMwMzQxOAkvKiBTUElfUkRCUiBTaGFkb3cgUmVnaXN0ZXIJCQkJCSovCisKKy8qIFRJTUVSMC03IFJlZ2lzdGVycwkJKDB4RkZDMDA2MDAgLSAweEZGQzAwNkZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgVElNRVIwX0NPTkZJRwkJMHhGRkMwMDYwMAkvKiBUaW1lciAwIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkqLworI2RlZmluZSBUSU1FUjBfQ09VTlRFUgkJMHhGRkMwMDYwNAkvKiBUaW1lciAwIENvdW50ZXIgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFRJTUVSMF9QRVJJT0QJCTB4RkZDMDA2MDgJLyogVGltZXIgMCBQZXJpb2QgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFRJTUVSMF9XSURUSAkJMHhGRkMwMDYwQwkvKiBUaW1lciAwIFdpZHRoIFJlZ2lzdGVyCQkJCQkqLworCisjZGVmaW5lIFRJTUVSMV9DT05GSUcJCTB4RkZDMDA2MTAJLyogVGltZXIgMSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICAJCQkqLworI2RlZmluZSBUSU1FUjFfQ09VTlRFUgkJMHhGRkMwMDYxNAkvKiBUaW1lciAxIENvdW50ZXIgUmVnaXN0ZXIgICAgICAgIAkJCSovCisjZGVmaW5lIFRJTUVSMV9QRVJJT0QJCTB4RkZDMDA2MTgJLyogVGltZXIgMSBQZXJpb2QgUmVnaXN0ZXIgICAgICAgICAJCQkqLworI2RlZmluZSBUSU1FUjFfV0lEVEgJCTB4RkZDMDA2MUMJLyogVGltZXIgMSBXaWR0aCBSZWdpc3RlciAgICAgICAgICAJCQkqLworCisjZGVmaW5lIFRJTUVSMl9DT05GSUcJCTB4RkZDMDA2MjAJLyogVGltZXIgMiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICAJCQkqLworI2RlZmluZSBUSU1FUjJfQ09VTlRFUgkJMHhGRkMwMDYyNAkvKiBUaW1lciAyIENvdW50ZXIgUmVnaXN0ZXIgICAgICAgIAkJCSovCisjZGVmaW5lIFRJTUVSMl9QRVJJT0QJCTB4RkZDMDA2MjgJLyogVGltZXIgMiBQZXJpb2QgUmVnaXN0ZXIgICAgICAgICAJCQkqLworI2RlZmluZSBUSU1FUjJfV0lEVEgJCTB4RkZDMDA2MkMJLyogVGltZXIgMiBXaWR0aCBSZWdpc3RlciAgICAgICAgICAJCQkqLworCisjZGVmaW5lIFRJTUVSM19DT05GSUcJCTB4RkZDMDA2MzAJLyogVGltZXIgMyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgVElNRVIzX0NPVU5URVIJCTB4RkZDMDA2MzQJLyogVGltZXIgMyBDb3VudGVyIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBUSU1FUjNfUEVSSU9ECQkweEZGQzAwNjM4CS8qIFRpbWVyIDMgUGVyaW9kIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBUSU1FUjNfV0lEVEgJCTB4RkZDMDA2M0MJLyogVGltZXIgMyBXaWR0aCBSZWdpc3RlcgkJCQkJKi8KKworI2RlZmluZSBUSU1FUjRfQ09ORklHCQkweEZGQzAwNjQwCS8qIFRpbWVyIDQgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAgCQkJKi8KKyNkZWZpbmUgVElNRVI0X0NPVU5URVIJCTB4RkZDMDA2NDQJLyogVGltZXIgNCBDb3VudGVyIFJlZ2lzdGVyICAgICAgICAJCQkqLworI2RlZmluZSBUSU1FUjRfUEVSSU9ECQkweEZGQzAwNjQ4CS8qIFRpbWVyIDQgUGVyaW9kIFJlZ2lzdGVyICAgICAgICAgCQkJKi8KKyNkZWZpbmUgVElNRVI0X1dJRFRICQkweEZGQzAwNjRDCS8qIFRpbWVyIDQgV2lkdGggUmVnaXN0ZXIgICAgICAgICAgCQkJKi8KKworI2RlZmluZSBUSU1FUjVfQ09ORklHCQkweEZGQzAwNjUwCS8qIFRpbWVyIDUgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAgCQkJKi8KKyNkZWZpbmUgVElNRVI1X0NPVU5URVIJCTB4RkZDMDA2NTQJLyogVGltZXIgNSBDb3VudGVyIFJlZ2lzdGVyICAgICAgICAJCQkqLworI2RlZmluZSBUSU1FUjVfUEVSSU9ECQkweEZGQzAwNjU4CS8qIFRpbWVyIDUgUGVyaW9kIFJlZ2lzdGVyICAgICAgICAgCQkJKi8KKyNkZWZpbmUgVElNRVI1X1dJRFRICQkweEZGQzAwNjVDCS8qIFRpbWVyIDUgV2lkdGggUmVnaXN0ZXIgICAgICAgICAgCQkJKi8KKworI2RlZmluZSBUSU1FUjZfQ09ORklHCQkweEZGQzAwNjYwCS8qIFRpbWVyIDYgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAgCQkJKi8KKyNkZWZpbmUgVElNRVI2X0NPVU5URVIJCTB4RkZDMDA2NjQJLyogVGltZXIgNiBDb3VudGVyIFJlZ2lzdGVyICAgICAgICAJCQkqLworI2RlZmluZSBUSU1FUjZfUEVSSU9ECQkweEZGQzAwNjY4CS8qIFRpbWVyIDYgUGVyaW9kIFJlZ2lzdGVyICAgICAgICAgCQkJKi8KKyNkZWZpbmUgVElNRVI2X1dJRFRICQkweEZGQzAwNjZDCS8qIFRpbWVyIDYgV2lkdGggUmVnaXN0ZXIgICAgICAgICAgCQkJKi8KKworI2RlZmluZSBUSU1FUjdfQ09ORklHCQkweEZGQzAwNjcwCS8qIFRpbWVyIDcgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAgCQkJKi8KKyNkZWZpbmUgVElNRVI3X0NPVU5URVIJCTB4RkZDMDA2NzQJLyogVGltZXIgNyBDb3VudGVyIFJlZ2lzdGVyICAgICAgICAJCQkqLworI2RlZmluZSBUSU1FUjdfUEVSSU9ECQkweEZGQzAwNjc4CS8qIFRpbWVyIDcgUGVyaW9kIFJlZ2lzdGVyICAgICAgICAgCQkJKi8KKyNkZWZpbmUgVElNRVI3X1dJRFRICQkweEZGQzAwNjdDCS8qIFRpbWVyIDcgV2lkdGggUmVnaXN0ZXIgICAgICAgCQkJKi8KKworI2RlZmluZSBUSU1FUl9FTkFCTEUJCTB4RkZDMDA2ODAJLyogVGltZXIgRW5hYmxlIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBUSU1FUl9ESVNBQkxFCQkweEZGQzAwNjg0CS8qIFRpbWVyIERpc2FibGUgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFRJTUVSX1NUQVRVUwkJMHhGRkMwMDY4OAkvKiBUaW1lciBTdGF0dXMgUmVnaXN0ZXIJCQkJCSovCisKKy8qIEdlbmVyYWwgUHVycG9zZSBJL08gUG9ydCBGICgweEZGQzAwNzAwIC0gMHhGRkMwMDdGRikJCQkJCQkJCQkJCQkqLworI2RlZmluZSBQT1JURklPCQkJCQkweEZGQzAwNzAwCS8qIFBvcnQgRiBJL08gUGluIFN0YXRlIFNwZWNpZnkgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgUE9SVEZJT19DTEVBUgkJCTB4RkZDMDA3MDQJLyogUG9ydCBGIEkvTyBQZXJpcGhlcmFsIEludGVycnVwdCBDbGVhciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgUE9SVEZJT19TRVQJCQkJMHhGRkMwMDcwOAkvKiBQb3J0IEYgSS9PIFBlcmlwaGVyYWwgSW50ZXJydXB0IFNldCBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBPUlRGSU9fVE9HR0xFCQkJMHhGRkMwMDcwQwkvKiBQb3J0IEYgSS9PIFBpbiBTdGF0ZSBUb2dnbGUgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFBPUlRGSU9fTUFTS0EJCQkweEZGQzAwNzEwCS8qIFBvcnQgRiBJL08gTWFzayBTdGF0ZSBTcGVjaWZ5IEludGVycnVwdCBBIFJlZ2lzdGVyCSovCisjZGVmaW5lIFBPUlRGSU9fTUFTS0FfQ0xFQVIJCTB4RkZDMDA3MTQJLyogUG9ydCBGIEkvTyBNYXNrIERpc2FibGUgSW50ZXJydXB0IEEgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBQT1JURklPX01BU0tBX1NFVAkJMHhGRkMwMDcxOAkvKiBQb3J0IEYgSS9PIE1hc2sgRW5hYmxlIEludGVycnVwdCBBIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUE9SVEZJT19NQVNLQV9UT0dHTEUJMHhGRkMwMDcxQwkvKiBQb3J0IEYgSS9PIE1hc2sgVG9nZ2xlIEVuYWJsZSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkqLworI2RlZmluZSBQT1JURklPX01BU0tCCQkJMHhGRkMwMDcyMAkvKiBQb3J0IEYgSS9PIE1hc2sgU3RhdGUgU3BlY2lmeSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkqLworI2RlZmluZSBQT1JURklPX01BU0tCX0NMRUFSCQkweEZGQzAwNzI0CS8qIFBvcnQgRiBJL08gTWFzayBEaXNhYmxlIEludGVycnVwdCBCIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUE9SVEZJT19NQVNLQl9TRVQJCTB4RkZDMDA3MjgJLyogUG9ydCBGIEkvTyBNYXNrIEVuYWJsZSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBPUlRGSU9fTUFTS0JfVE9HR0xFCTB4RkZDMDA3MkMJLyogUG9ydCBGIEkvTyBNYXNrIFRvZ2dsZSBFbmFibGUgSW50ZXJydXB0IEIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgUE9SVEZJT19ESVIJCQkJMHhGRkMwMDczMAkvKiBQb3J0IEYgSS9PIERpcmVjdGlvbiBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFBPUlRGSU9fUE9MQVIJCQkweEZGQzAwNzM0CS8qIFBvcnQgRiBJL08gU291cmNlIFBvbGFyaXR5IFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBQT1JURklPX0VER0UJCQkweEZGQzAwNzM4CS8qIFBvcnQgRiBJL08gU291cmNlIFNlbnNpdGl2aXR5IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFBPUlRGSU9fQk9USAkJCTB4RkZDMDA3M0MJLyogUG9ydCBGIEkvTyBTZXQgb24gQk9USCBFZGdlcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBQT1JURklPX0lORU4JCQkweEZGQzAwNzQwCS8qIFBvcnQgRiBJL08gSW5wdXQgRW5hYmxlIFJlZ2lzdGVyIAkJCQkJKi8KKworLyogU1BPUlQwIENvbnRyb2xsZXIJCSgweEZGQzAwODAwIC0gMHhGRkMwMDhGRikJCQkJCQkJCQkJKi8KKyNkZWZpbmUgU1BPUlQwX1RDUjEJCQkweEZGQzAwODAwCS8qIFNQT1JUMCBUcmFuc21pdCBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBTUE9SVDBfVENSMgkJCTB4RkZDMDA4MDQJLyogU1BPUlQwIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMiBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFNQT1JUMF9UQ0xLRElWCQkweEZGQzAwODA4CS8qIFNQT1JUMCBUcmFuc21pdCBDbG9jayBEaXZpZGVyCQkJCQkqLworI2RlZmluZSBTUE9SVDBfVEZTRElWCQkweEZGQzAwODBDCS8qIFNQT1JUMCBUcmFuc21pdCBGcmFtZSBTeW5jIERpdmlkZXIJCQkJKi8KKyNkZWZpbmUgU1BPUlQwX1RYCQkJMHhGRkMwMDgxMAkvKiBTUE9SVDAgVFggRGF0YSBSZWdpc3RlcgkJCQkJCQkqLworI2RlZmluZSBTUE9SVDBfUlgJCQkweEZGQzAwODE4CS8qIFNQT1JUMCBSWCBEYXRhIFJlZ2lzdGVyCQkJCQkJCSovCisjZGVmaW5lIFNQT1JUMF9SQ1IxCQkJMHhGRkMwMDgyMAkvKiBTUE9SVDAgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgU1BPUlQwX1JDUjIJCQkweEZGQzAwODI0CS8qIFNQT1JUMCBUcmFuc21pdCBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBTUE9SVDBfUkNMS0RJVgkJMHhGRkMwMDgyOAkvKiBTUE9SVDAgUmVjZWl2ZSBDbG9jayBEaXZpZGVyCQkJCQkJKi8KKyNkZWZpbmUgU1BPUlQwX1JGU0RJVgkJMHhGRkMwMDgyQwkvKiBTUE9SVDAgUmVjZWl2ZSBGcmFtZSBTeW5jIERpdmlkZXIJCQkJKi8KKyNkZWZpbmUgU1BPUlQwX1NUQVQJCQkweEZGQzAwODMwCS8qIFNQT1JUMCBTdGF0dXMgUmVnaXN0ZXIJCQkJCQkJKi8KKyNkZWZpbmUgU1BPUlQwX0NITkwJCQkweEZGQzAwODM0CS8qIFNQT1JUMCBDdXJyZW50IENoYW5uZWwgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFNQT1JUMF9NQ01DMQkJMHhGRkMwMDgzOAkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDEJKi8KKyNkZWZpbmUgU1BPUlQwX01DTUMyCQkweEZGQzAwODNDCS8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMgkqLworI2RlZmluZSBTUE9SVDBfTVRDUzAJCTB4RkZDMDA4NDAJLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDAJKi8KKyNkZWZpbmUgU1BPUlQwX01UQ1MxCQkweEZGQzAwODQ0CS8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAxCSovCisjZGVmaW5lIFNQT1JUMF9NVENTMgkJMHhGRkMwMDg0OAkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMgkqLworI2RlZmluZSBTUE9SVDBfTVRDUzMJCTB4RkZDMDA4NEMJLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDMJKi8KKyNkZWZpbmUgU1BPUlQwX01SQ1MwCQkweEZGQzAwODUwCS8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDAJKi8KKyNkZWZpbmUgU1BPUlQwX01SQ1MxCQkweEZGQzAwODU0CS8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDEJKi8KKyNkZWZpbmUgU1BPUlQwX01SQ1MyCQkweEZGQzAwODU4CS8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDIJKi8KKyNkZWZpbmUgU1BPUlQwX01SQ1MzCQkweEZGQzAwODVDCS8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDMJKi8KKworLyogU1BPUlQxIENvbnRyb2xsZXIJCSgweEZGQzAwOTAwIC0gMHhGRkMwMDlGRikJCQkJCQkJCQkJKi8KKyNkZWZpbmUgU1BPUlQxX1RDUjEJCQkweEZGQzAwOTAwCS8qIFNQT1JUMSBUcmFuc21pdCBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBTUE9SVDFfVENSMgkJCTB4RkZDMDA5MDQJLyogU1BPUlQxIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMiBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFNQT1JUMV9UQ0xLRElWCQkweEZGQzAwOTA4CS8qIFNQT1JUMSBUcmFuc21pdCBDbG9jayBEaXZpZGVyCQkJCQkqLworI2RlZmluZSBTUE9SVDFfVEZTRElWCQkweEZGQzAwOTBDCS8qIFNQT1JUMSBUcmFuc21pdCBGcmFtZSBTeW5jIERpdmlkZXIJCQkJKi8KKyNkZWZpbmUgU1BPUlQxX1RYCQkJMHhGRkMwMDkxMAkvKiBTUE9SVDEgVFggRGF0YSBSZWdpc3RlcgkJCQkJCQkqLworI2RlZmluZSBTUE9SVDFfUlgJCQkweEZGQzAwOTE4CS8qIFNQT1JUMSBSWCBEYXRhIFJlZ2lzdGVyCQkJCQkJCSovCisjZGVmaW5lIFNQT1JUMV9SQ1IxCQkJMHhGRkMwMDkyMAkvKiBTUE9SVDEgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgU1BPUlQxX1JDUjIJCQkweEZGQzAwOTI0CS8qIFNQT1JUMSBUcmFuc21pdCBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBTUE9SVDFfUkNMS0RJVgkJMHhGRkMwMDkyOAkvKiBTUE9SVDEgUmVjZWl2ZSBDbG9jayBEaXZpZGVyCQkJCQkJKi8KKyNkZWZpbmUgU1BPUlQxX1JGU0RJVgkJMHhGRkMwMDkyQwkvKiBTUE9SVDEgUmVjZWl2ZSBGcmFtZSBTeW5jIERpdmlkZXIJCQkJKi8KKyNkZWZpbmUgU1BPUlQxX1NUQVQJCQkweEZGQzAwOTMwCS8qIFNQT1JUMSBTdGF0dXMgUmVnaXN0ZXIJCQkJCQkJKi8KKyNkZWZpbmUgU1BPUlQxX0NITkwJCQkweEZGQzAwOTM0CS8qIFNQT1JUMSBDdXJyZW50IENoYW5uZWwgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFNQT1JUMV9NQ01DMQkJMHhGRkMwMDkzOAkvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDEJKi8KKyNkZWZpbmUgU1BPUlQxX01DTUMyCQkweEZGQzAwOTNDCS8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMgkqLworI2RlZmluZSBTUE9SVDFfTVRDUzAJCTB4RkZDMDA5NDAJLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDAJKi8KKyNkZWZpbmUgU1BPUlQxX01UQ1MxCQkweEZGQzAwOTQ0CS8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAxCSovCisjZGVmaW5lIFNQT1JUMV9NVENTMgkJMHhGRkMwMDk0OAkvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMgkqLworI2RlZmluZSBTUE9SVDFfTVRDUzMJCTB4RkZDMDA5NEMJLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDMJKi8KKyNkZWZpbmUgU1BPUlQxX01SQ1MwCQkweEZGQzAwOTUwCS8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDAJKi8KKyNkZWZpbmUgU1BPUlQxX01SQ1MxCQkweEZGQzAwOTU0CS8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDEJKi8KKyNkZWZpbmUgU1BPUlQxX01SQ1MyCQkweEZGQzAwOTU4CS8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDIJKi8KKyNkZWZpbmUgU1BPUlQxX01SQ1MzCQkweEZGQzAwOTVDCS8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDMJKi8KKworLyogRXh0ZXJuYWwgQnVzIEludGVyZmFjZSBVbml0ICgweEZGQzAwQTAwIC0gMHhGRkMwMEFGRikJCQkJCQkJCSovCisjZGVmaW5lIEVCSVVfQU1HQ1RMCQkJMHhGRkMwMEEwMAkvKiBBc3luY2hyb25vdXMgTWVtb3J5IEdsb2JhbCBDb250cm9sIFJlZ2lzdGVyCSovCisjZGVmaW5lIEVCSVVfQU1CQ1RMMAkJMHhGRkMwMEEwNAkvKiBBc3luY2hyb25vdXMgTWVtb3J5IEJhbmsgQ29udHJvbCBSZWdpc3RlciAwCSovCisjZGVmaW5lIEVCSVVfQU1CQ1RMMQkJMHhGRkMwMEEwOAkvKiBBc3luY2hyb25vdXMgTWVtb3J5IEJhbmsgQ29udHJvbCBSZWdpc3RlciAxCSovCisjZGVmaW5lIEVCSVVfU0RHQ1RMCQkJMHhGRkMwMEExMAkvKiBTRFJBTSBHbG9iYWwgQ29udHJvbCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBFQklVX1NEQkNUTAkJCTB4RkZDMDBBMTQJLyogU0RSQU0gQmFuayBDb250cm9sIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBFQklVX1NEUlJDCQkJMHhGRkMwMEExOAkvKiBTRFJBTSBSZWZyZXNoIFJhdGUgQ29udHJvbCBSZWdpc3RlcgkJCSovCisjZGVmaW5lIEVCSVVfU0RTVEFUCQkJMHhGRkMwMEExQwkvKiBTRFJBTSBTdGF0dXMgUmVnaXN0ZXIJCQkJCQkqLworCisvKiBETUEgVHJhZmZpYyBDb250cm9sIFJlZ2lzdGVycwkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBETUFfVENfUEVSCQkJMHhGRkMwMEIwQwkvKiBUcmFmZmljIENvbnRyb2wgUGVyaW9kcyBSZWdpc3RlcgkJCSovCisjZGVmaW5lIERNQV9UQ19DTlQJCQkweEZGQzAwQjEwCS8qIFRyYWZmaWMgQ29udHJvbCBDdXJyZW50IENvdW50cyBSZWdpc3RlcgkqLworCisvKiBBbHRlcm5hdGUgZGVwcmVjYXRlZCByZWdpc3RlciBuYW1lcyAoYmVsb3cpIHByb3ZpZGVkIGZvciBiYWNrd2FyZHMgY29kZSBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIERNQV9UQ1BFUgkJCTB4RkZDMDBCMEMJLyogVHJhZmZpYyBDb250cm9sIFBlcmlvZHMgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBETUFfVENDTlQJCQkweEZGQzAwQjEwCS8qIFRyYWZmaWMgQ29udHJvbCBDdXJyZW50IENvdW50cyBSZWdpc3RlcgkqLworCisvKiBETUEgQ29udHJvbGxlciAoMHhGRkMwMEMwMCAtIDB4RkZDMDBGRkYpCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgRE1BMF9ORVhUX0RFU0NfUFRSCQkweEZGQzAwQzAwCS8qIERNQSBDaGFubmVsIDAgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIERNQTBfU1RBUlRfQUREUgkJCTB4RkZDMDBDMDQJLyogRE1BIENoYW5uZWwgMCBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUEwX0NPTkZJRwkJCQkweEZGQzAwQzA4CS8qIERNQSBDaGFubmVsIDAgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BMF9YX0NPVU5UCQkJMHhGRkMwMEMxMAkvKiBETUEgQ2hhbm5lbCAwIFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUEwX1hfTU9ESUZZCQkJMHhGRkMwMEMxNAkvKiBETUEgQ2hhbm5lbCAwIFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMF9ZX0NPVU5UCQkJMHhGRkMwMEMxOAkvKiBETUEgQ2hhbm5lbCAwIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUEwX1lfTU9ESUZZCQkJMHhGRkMwMEMxQwkvKiBETUEgQ2hhbm5lbCAwIFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMF9DVVJSX0RFU0NfUFRSCQkweEZGQzAwQzIwCS8qIERNQSBDaGFubmVsIDAgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgRE1BMF9DVVJSX0FERFIJCQkweEZGQzAwQzI0CS8qIERNQSBDaGFubmVsIDAgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTBfSVJRX1NUQVRVUwkJCTB4RkZDMDBDMjgJLyogRE1BIENoYW5uZWwgMCBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTBfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBDMkMJLyogRE1BIENoYW5uZWwgMCBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUEwX0NVUlJfWF9DT1VOVAkJMHhGRkMwMEMzMAkvKiBETUEgQ2hhbm5lbCAwIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUEwX0NVUlJfWV9DT1VOVAkJMHhGRkMwMEMzOAkvKiBETUEgQ2hhbm5lbCAwIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIERNQTFfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEM0MAkvKiBETUEgQ2hhbm5lbCAxIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBETUExX1NUQVJUX0FERFIJCQkweEZGQzAwQzQ0CS8qIERNQSBDaGFubmVsIDEgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BMV9DT05GSUcJCQkJMHhGRkMwMEM0OAkvKiBETUEgQ2hhbm5lbCAxIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTFfWF9DT1VOVAkJCTB4RkZDMDBDNTAJLyogRE1BIENoYW5uZWwgMSBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMV9YX01PRElGWQkJCTB4RkZDMDBDNTQJLyogRE1BIENoYW5uZWwgMSBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTFfWV9DT1VOVAkJCTB4RkZDMDBDNTgJLyogRE1BIENoYW5uZWwgMSBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMV9ZX01PRElGWQkJCTB4RkZDMDBDNUMJLyogRE1BIENoYW5uZWwgMSBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTFfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEM2MAkvKiBETUEgQ2hhbm5lbCAxIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCisjZGVmaW5lIERNQTFfQ1VSUl9BRERSCQkJMHhGRkMwMEM2NAkvKiBETUEgQ2hhbm5lbCAxIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUExX0lSUV9TVEFUVVMJCQkweEZGQzAwQzY4CS8qIERNQSBDaGFubmVsIDEgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUExX1BFUklQSEVSQUxfTUFQCQkweEZGQzAwQzZDCS8qIERNQSBDaGFubmVsIDEgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMV9DVVJSX1hfQ09VTlQJCTB4RkZDMDBDNzAJLyogRE1BIENoYW5uZWwgMSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMV9DVVJSX1lfQ09VTlQJCTB4RkZDMDBDNzgJLyogRE1BIENoYW5uZWwgMSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKworI2RlZmluZSBETUEyX05FWFRfREVTQ19QVFIJCTB4RkZDMDBDODAJLyogRE1BIENoYW5uZWwgMiBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgRE1BMl9TVEFSVF9BRERSCQkJMHhGRkMwMEM4NAkvKiBETUEgQ2hhbm5lbCAyIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTJfQ09ORklHCQkJCTB4RkZDMDBDODgJLyogRE1BIENoYW5uZWwgMiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUEyX1hfQ09VTlQJCQkweEZGQzAwQzkwCS8qIERNQSBDaGFubmVsIDIgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTJfWF9NT0RJRlkJCQkweEZGQzAwQzk0CS8qIERNQSBDaGFubmVsIDIgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUEyX1lfQ09VTlQJCQkweEZGQzAwQzk4CS8qIERNQSBDaGFubmVsIDIgWSBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTJfWV9NT0RJRlkJCQkweEZGQzAwQzlDCS8qIERNQSBDaGFubmVsIDIgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUEyX0NVUlJfREVTQ19QVFIJCTB4RkZDMDBDQTAJLyogRE1BIENoYW5uZWwgMiBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLworI2RlZmluZSBETUEyX0NVUlJfQUREUgkJCTB4RkZDMDBDQTQJLyogRE1BIENoYW5uZWwgMiBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMl9JUlFfU1RBVFVTCQkJMHhGRkMwMENBOAkvKiBETUEgQ2hhbm5lbCAyIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMl9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMENBQwkvKiBETUEgQ2hhbm5lbCAyIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTJfQ1VSUl9YX0NPVU5UCQkweEZGQzAwQ0IwCS8qIERNQSBDaGFubmVsIDIgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTJfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwQ0I4CS8qIERNQSBDaGFubmVsIDIgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCisKKyNkZWZpbmUgRE1BM19ORVhUX0RFU0NfUFRSCQkweEZGQzAwQ0MwCS8qIERNQSBDaGFubmVsIDMgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIERNQTNfU1RBUlRfQUREUgkJCTB4RkZDMDBDQzQJLyogRE1BIENoYW5uZWwgMyBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUEzX0NPTkZJRwkJCQkweEZGQzAwQ0M4CS8qIERNQSBDaGFubmVsIDMgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BM19YX0NPVU5UCQkJMHhGRkMwMENEMAkvKiBETUEgQ2hhbm5lbCAzIFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUEzX1hfTU9ESUZZCQkJMHhGRkMwMENENAkvKiBETUEgQ2hhbm5lbCAzIFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BM19ZX0NPVU5UCQkJMHhGRkMwMENEOAkvKiBETUEgQ2hhbm5lbCAzIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUEzX1lfTU9ESUZZCQkJMHhGRkMwMENEQwkvKiBETUEgQ2hhbm5lbCAzIFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BM19DVVJSX0RFU0NfUFRSCQkweEZGQzAwQ0UwCS8qIERNQSBDaGFubmVsIDMgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgRE1BM19DVVJSX0FERFIJCQkweEZGQzAwQ0U0CS8qIERNQSBDaGFubmVsIDMgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTNfSVJRX1NUQVRVUwkJCTB4RkZDMDBDRTgJLyogRE1BIENoYW5uZWwgMyBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTNfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBDRUMJLyogRE1BIENoYW5uZWwgMyBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUEzX0NVUlJfWF9DT1VOVAkJMHhGRkMwMENGMAkvKiBETUEgQ2hhbm5lbCAzIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUEzX0NVUlJfWV9DT1VOVAkJMHhGRkMwMENGOAkvKiBETUEgQ2hhbm5lbCAzIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIERNQTRfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEQwMAkvKiBETUEgQ2hhbm5lbCA0IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBETUE0X1NUQVJUX0FERFIJCQkweEZGQzAwRDA0CS8qIERNQSBDaGFubmVsIDQgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BNF9DT05GSUcJCQkJMHhGRkMwMEQwOAkvKiBETUEgQ2hhbm5lbCA0IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTRfWF9DT1VOVAkJCTB4RkZDMDBEMTAJLyogRE1BIENoYW5uZWwgNCBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BNF9YX01PRElGWQkJCTB4RkZDMDBEMTQJLyogRE1BIENoYW5uZWwgNCBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTRfWV9DT1VOVAkJCTB4RkZDMDBEMTgJLyogRE1BIENoYW5uZWwgNCBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BNF9ZX01PRElGWQkJCTB4RkZDMDBEMUMJLyogRE1BIENoYW5uZWwgNCBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTRfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEQyMAkvKiBETUEgQ2hhbm5lbCA0IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCisjZGVmaW5lIERNQTRfQ1VSUl9BRERSCQkJMHhGRkMwMEQyNAkvKiBETUEgQ2hhbm5lbCA0IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE0X0lSUV9TVEFUVVMJCQkweEZGQzAwRDI4CS8qIERNQSBDaGFubmVsIDQgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE0X1BFUklQSEVSQUxfTUFQCQkweEZGQzAwRDJDCS8qIERNQSBDaGFubmVsIDQgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BNF9DVVJSX1hfQ09VTlQJCTB4RkZDMDBEMzAJLyogRE1BIENoYW5uZWwgNCBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BNF9DVVJSX1lfQ09VTlQJCTB4RkZDMDBEMzgJLyogRE1BIENoYW5uZWwgNCBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKworI2RlZmluZSBETUE1X05FWFRfREVTQ19QVFIJCTB4RkZDMDBENDAJLyogRE1BIENoYW5uZWwgNSBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgRE1BNV9TVEFSVF9BRERSCQkJMHhGRkMwMEQ0NAkvKiBETUEgQ2hhbm5lbCA1IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTVfQ09ORklHCQkJCTB4RkZDMDBENDgJLyogRE1BIENoYW5uZWwgNSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUE1X1hfQ09VTlQJCQkweEZGQzAwRDUwCS8qIERNQSBDaGFubmVsIDUgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTVfWF9NT0RJRlkJCQkweEZGQzAwRDU0CS8qIERNQSBDaGFubmVsIDUgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE1X1lfQ09VTlQJCQkweEZGQzAwRDU4CS8qIERNQSBDaGFubmVsIDUgWSBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTVfWV9NT0RJRlkJCQkweEZGQzAwRDVDCS8qIERNQSBDaGFubmVsIDUgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE1X0NVUlJfREVTQ19QVFIJCTB4RkZDMDBENjAJLyogRE1BIENoYW5uZWwgNSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLworI2RlZmluZSBETUE1X0NVUlJfQUREUgkJCTB4RkZDMDBENjQJLyogRE1BIENoYW5uZWwgNSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BNV9JUlFfU1RBVFVTCQkJMHhGRkMwMEQ2OAkvKiBETUEgQ2hhbm5lbCA1IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BNV9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMEQ2QwkvKiBETUEgQ2hhbm5lbCA1IFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTVfQ1VSUl9YX0NPVU5UCQkweEZGQzAwRDcwCS8qIERNQSBDaGFubmVsIDUgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTVfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwRDc4CS8qIERNQSBDaGFubmVsIDUgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCisKKyNkZWZpbmUgRE1BNl9ORVhUX0RFU0NfUFRSCQkweEZGQzAwRDgwCS8qIERNQSBDaGFubmVsIDYgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIERNQTZfU1RBUlRfQUREUgkJCTB4RkZDMDBEODQJLyogRE1BIENoYW5uZWwgNiBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUE2X0NPTkZJRwkJCQkweEZGQzAwRDg4CS8qIERNQSBDaGFubmVsIDYgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BNl9YX0NPVU5UCQkJMHhGRkMwMEQ5MAkvKiBETUEgQ2hhbm5lbCA2IFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE2X1hfTU9ESUZZCQkJMHhGRkMwMEQ5NAkvKiBETUEgQ2hhbm5lbCA2IFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BNl9ZX0NPVU5UCQkJMHhGRkMwMEQ5OAkvKiBETUEgQ2hhbm5lbCA2IFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE2X1lfTU9ESUZZCQkJMHhGRkMwMEQ5QwkvKiBETUEgQ2hhbm5lbCA2IFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BNl9DVVJSX0RFU0NfUFRSCQkweEZGQzAwREEwCS8qIERNQSBDaGFubmVsIDYgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgRE1BNl9DVVJSX0FERFIJCQkweEZGQzAwREE0CS8qIERNQSBDaGFubmVsIDYgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTZfSVJRX1NUQVRVUwkJCTB4RkZDMDBEQTgJLyogRE1BIENoYW5uZWwgNiBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTZfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBEQUMJLyogRE1BIENoYW5uZWwgNiBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE2X0NVUlJfWF9DT1VOVAkJMHhGRkMwMERCMAkvKiBETUEgQ2hhbm5lbCA2IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE2X0NVUlJfWV9DT1VOVAkJMHhGRkMwMERCOAkvKiBETUEgQ2hhbm5lbCA2IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIERNQTdfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMERDMAkvKiBETUEgQ2hhbm5lbCA3IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBETUE3X1NUQVJUX0FERFIJCQkweEZGQzAwREM0CS8qIERNQSBDaGFubmVsIDcgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BN19DT05GSUcJCQkJMHhGRkMwMERDOAkvKiBETUEgQ2hhbm5lbCA3IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTdfWF9DT1VOVAkJCTB4RkZDMDBERDAJLyogRE1BIENoYW5uZWwgNyBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BN19YX01PRElGWQkJCTB4RkZDMDBERDQJLyogRE1BIENoYW5uZWwgNyBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTdfWV9DT1VOVAkJCTB4RkZDMDBERDgJLyogRE1BIENoYW5uZWwgNyBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BN19ZX01PRElGWQkJCTB4RkZDMDBEREMJLyogRE1BIENoYW5uZWwgNyBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTdfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMERFMAkvKiBETUEgQ2hhbm5lbCA3IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCisjZGVmaW5lIERNQTdfQ1VSUl9BRERSCQkJMHhGRkMwMERFNAkvKiBETUEgQ2hhbm5lbCA3IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE3X0lSUV9TVEFUVVMJCQkweEZGQzAwREU4CS8qIERNQSBDaGFubmVsIDcgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE3X1BFUklQSEVSQUxfTUFQCQkweEZGQzAwREVDCS8qIERNQSBDaGFubmVsIDcgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BN19DVVJSX1hfQ09VTlQJCTB4RkZDMDBERjAJLyogRE1BIENoYW5uZWwgNyBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BN19DVVJSX1lfQ09VTlQJCTB4RkZDMDBERjgJLyogRE1BIENoYW5uZWwgNyBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKworI2RlZmluZSBETUE4X05FWFRfREVTQ19QVFIJCTB4RkZDMDBFMDAJLyogRE1BIENoYW5uZWwgOCBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgRE1BOF9TVEFSVF9BRERSCQkJMHhGRkMwMEUwNAkvKiBETUEgQ2hhbm5lbCA4IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQThfQ09ORklHCQkJCTB4RkZDMDBFMDgJLyogRE1BIENoYW5uZWwgOCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUE4X1hfQ09VTlQJCQkweEZGQzAwRTEwCS8qIERNQSBDaGFubmVsIDggWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQThfWF9NT0RJRlkJCQkweEZGQzAwRTE0CS8qIERNQSBDaGFubmVsIDggWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE4X1lfQ09VTlQJCQkweEZGQzAwRTE4CS8qIERNQSBDaGFubmVsIDggWSBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQThfWV9NT0RJRlkJCQkweEZGQzAwRTFDCS8qIERNQSBDaGFubmVsIDggWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE4X0NVUlJfREVTQ19QVFIJCTB4RkZDMDBFMjAJLyogRE1BIENoYW5uZWwgOCBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLworI2RlZmluZSBETUE4X0NVUlJfQUREUgkJCTB4RkZDMDBFMjQJLyogRE1BIENoYW5uZWwgOCBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BOF9JUlFfU1RBVFVTCQkJMHhGRkMwMEUyOAkvKiBETUEgQ2hhbm5lbCA4IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BOF9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMEUyQwkvKiBETUEgQ2hhbm5lbCA4IFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQThfQ1VSUl9YX0NPVU5UCQkweEZGQzAwRTMwCS8qIERNQSBDaGFubmVsIDggQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQThfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwRTM4CS8qIERNQSBDaGFubmVsIDggQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCisKKyNkZWZpbmUgRE1BOV9ORVhUX0RFU0NfUFRSCQkweEZGQzAwRTQwCS8qIERNQSBDaGFubmVsIDkgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIERNQTlfU1RBUlRfQUREUgkJCTB4RkZDMDBFNDQJLyogRE1BIENoYW5uZWwgOSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUE5X0NPTkZJRwkJCQkweEZGQzAwRTQ4CS8qIERNQSBDaGFubmVsIDkgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BOV9YX0NPVU5UCQkJMHhGRkMwMEU1MAkvKiBETUEgQ2hhbm5lbCA5IFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE5X1hfTU9ESUZZCQkJMHhGRkMwMEU1NAkvKiBETUEgQ2hhbm5lbCA5IFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BOV9ZX0NPVU5UCQkJMHhGRkMwMEU1OAkvKiBETUEgQ2hhbm5lbCA5IFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE5X1lfTU9ESUZZCQkJMHhGRkMwMEU1QwkvKiBETUEgQ2hhbm5lbCA5IFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BOV9DVVJSX0RFU0NfUFRSCQkweEZGQzAwRTYwCS8qIERNQSBDaGFubmVsIDkgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgRE1BOV9DVVJSX0FERFIJCQkweEZGQzAwRTY0CS8qIERNQSBDaGFubmVsIDkgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTlfSVJRX1NUQVRVUwkJCTB4RkZDMDBFNjgJLyogRE1BIENoYW5uZWwgOSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTlfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBFNkMJLyogRE1BIENoYW5uZWwgOSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE5X0NVUlJfWF9DT1VOVAkJMHhGRkMwMEU3MAkvKiBETUEgQ2hhbm5lbCA5IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE5X0NVUlJfWV9DT1VOVAkJMHhGRkMwMEU3OAkvKiBETUEgQ2hhbm5lbCA5IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIERNQTEwX05FWFRfREVTQ19QVFIJCTB4RkZDMDBFODAJLyogRE1BIENoYW5uZWwgMTAgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIERNQTEwX1NUQVJUX0FERFIJCTB4RkZDMDBFODQJLyogRE1BIENoYW5uZWwgMTAgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUExMF9DT05GSUcJCQkweEZGQzAwRTg4CS8qIERNQSBDaGFubmVsIDEwIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMTBfWF9DT1VOVAkJCTB4RkZDMDBFOTAJLyogRE1BIENoYW5uZWwgMTAgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTEwX1hfTU9ESUZZCQkJMHhGRkMwMEU5NAkvKiBETUEgQ2hhbm5lbCAxMCBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTEwX1lfQ09VTlQJCQkweEZGQzAwRTk4CS8qIERNQSBDaGFubmVsIDEwIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUExMF9ZX01PRElGWQkJCTB4RkZDMDBFOUMJLyogRE1BIENoYW5uZWwgMTAgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUExMF9DVVJSX0RFU0NfUFRSCQkweEZGQzAwRUEwCS8qIERNQSBDaGFubmVsIDEwIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCisjZGVmaW5lIERNQTEwX0NVUlJfQUREUgkJCTB4RkZDMDBFQTQJLyogRE1BIENoYW5uZWwgMTAgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTEwX0lSUV9TVEFUVVMJCTB4RkZDMDBFQTgJLyogRE1BIENoYW5uZWwgMTAgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUExMF9QRVJJUEhFUkFMX01BUAkweEZGQzAwRUFDCS8qIERNQSBDaGFubmVsIDEwIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTEwX0NVUlJfWF9DT1VOVAkJMHhGRkMwMEVCMAkvKiBETUEgQ2hhbm5lbCAxMCBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMTBfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwRUI4CS8qIERNQSBDaGFubmVsIDEwIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIERNQTExX05FWFRfREVTQ19QVFIJCTB4RkZDMDBFQzAJLyogRE1BIENoYW5uZWwgMTEgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIERNQTExX1NUQVJUX0FERFIJCTB4RkZDMDBFQzQJLyogRE1BIENoYW5uZWwgMTEgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUExMV9DT05GSUcJCQkweEZGQzAwRUM4CS8qIERNQSBDaGFubmVsIDExIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMTFfWF9DT1VOVAkJCTB4RkZDMDBFRDAJLyogRE1BIENoYW5uZWwgMTEgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTExX1hfTU9ESUZZCQkJMHhGRkMwMEVENAkvKiBETUEgQ2hhbm5lbCAxMSBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTExX1lfQ09VTlQJCQkweEZGQzAwRUQ4CS8qIERNQSBDaGFubmVsIDExIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUExMV9ZX01PRElGWQkJCTB4RkZDMDBFREMJLyogRE1BIENoYW5uZWwgMTEgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUExMV9DVVJSX0RFU0NfUFRSCQkweEZGQzAwRUUwCS8qIERNQSBDaGFubmVsIDExIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCisjZGVmaW5lIERNQTExX0NVUlJfQUREUgkJCTB4RkZDMDBFRTQJLyogRE1BIENoYW5uZWwgMTEgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTExX0lSUV9TVEFUVVMJCTB4RkZDMDBFRTgJLyogRE1BIENoYW5uZWwgMTEgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUExMV9QRVJJUEhFUkFMX01BUAkweEZGQzAwRUVDCS8qIERNQSBDaGFubmVsIDExIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTExX0NVUlJfWF9DT1VOVAkJMHhGRkMwMEVGMAkvKiBETUEgQ2hhbm5lbCAxMSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMTFfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwRUY4CS8qIERNQSBDaGFubmVsIDExIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIE1ETUFfRDBfTkVYVF9ERVNDX1BUUgkweEZGQzAwRjAwCS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgTURNQV9EMF9TVEFSVF9BRERSCQkweEZGQzAwRjA0CS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIE1ETUFfRDBfQ09ORklHCQkJMHhGRkMwMEYwOAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBNRE1BX0QwX1hfQ09VTlQJCQkweEZGQzAwRjEwCS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgTURNQV9EMF9YX01PRElGWQkJMHhGRkMwMEYxNAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfRDBfWV9DT1VOVAkJCTB4RkZDMDBGMTgJLyogTWVtRE1BIFN0cmVhbSAwIERlc3RpbmF0aW9uIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBNRE1BX0QwX1lfTU9ESUZZCQkweEZGQzAwRjFDCS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgTURNQV9EMF9DVVJSX0RFU0NfUFRSCTB4RkZDMDBGMjAJLyogTWVtRE1BIFN0cmVhbSAwIERlc3RpbmF0aW9uIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCisjZGVmaW5lIE1ETUFfRDBfQ1VSUl9BRERSCQkweEZGQzAwRjI0CS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgTURNQV9EMF9JUlFfU1RBVFVTCQkweEZGQzAwRjI4CS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgTURNQV9EMF9QRVJJUEhFUkFMX01BUAkweEZGQzAwRjJDCS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBNRE1BX0QwX0NVUlJfWF9DT1VOVAkweEZGQzAwRjMwCS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgTURNQV9EMF9DVVJSX1lfQ09VTlQJMHhGRkMwMEYzOAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCisKKyNkZWZpbmUgTURNQV9TMF9ORVhUX0RFU0NfUFRSCTB4RkZDMDBGNDAJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJCSovCisjZGVmaW5lIE1ETUFfUzBfU1RBUlRfQUREUgkJMHhGRkMwMEY0NAkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfUzBfQ09ORklHCQkJMHhGRkMwMEY0OAkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfUzBfWF9DT1VOVAkJCTB4RkZDMDBGNTAJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBYIENvdW50IFJlZ2lzdGVyCQkJCQkJCSovCisjZGVmaW5lIE1ETUFfUzBfWF9NT0RJRlkJCTB4RkZDMDBGNTQJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCQkqLworI2RlZmluZSBNRE1BX1MwX1lfQ09VTlQJCQkweEZGQzAwRjU4CS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgWSBDb3VudCBSZWdpc3RlcgkJCQkJCQkqLworI2RlZmluZSBNRE1BX1MwX1lfTU9ESUZZCQkweEZGQzAwRjVDCS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMF9DVVJSX0RFU0NfUFRSCTB4RkZDMDBGNjAJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgTURNQV9TMF9DVVJSX0FERFIJCTB4RkZDMDBGNjQJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfUzBfSVJRX1NUQVRVUwkJMHhGRkMwMEY2OAkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfUzBfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEY2QwkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX1MwX0NVUlJfWF9DT1VOVAkweEZGQzAwRjcwCS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX1MwX0NVUlJfWV9DT1VOVAkweEZGQzAwRjc4CS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCQkqLworCisjZGVmaW5lIE1ETUFfRDFfTkVYVF9ERVNDX1BUUgkweEZGQzAwRjgwCS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgTURNQV9EMV9TVEFSVF9BRERSCQkweEZGQzAwRjg0CS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIE1ETUFfRDFfQ09ORklHCQkJMHhGRkMwMEY4OAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBNRE1BX0QxX1hfQ09VTlQJCQkweEZGQzAwRjkwCS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgTURNQV9EMV9YX01PRElGWQkJMHhGRkMwMEY5NAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfRDFfWV9DT1VOVAkJCTB4RkZDMDBGOTgJLyogTWVtRE1BIFN0cmVhbSAxIERlc3RpbmF0aW9uIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBNRE1BX0QxX1lfTU9ESUZZCQkweEZGQzAwRjlDCS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgTURNQV9EMV9DVVJSX0RFU0NfUFRSCTB4RkZDMDBGQTAJLyogTWVtRE1BIFN0cmVhbSAxIERlc3RpbmF0aW9uIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCisjZGVmaW5lIE1ETUFfRDFfQ1VSUl9BRERSCQkweEZGQzAwRkE0CS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgTURNQV9EMV9JUlFfU1RBVFVTCQkweEZGQzAwRkE4CS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgTURNQV9EMV9QRVJJUEhFUkFMX01BUAkweEZGQzAwRkFDCS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBNRE1BX0QxX0NVUlJfWF9DT1VOVAkweEZGQzAwRkIwCS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgTURNQV9EMV9DVVJSX1lfQ09VTlQJMHhGRkMwMEZCOAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCisKKyNkZWZpbmUgTURNQV9TMV9ORVhUX0RFU0NfUFRSCTB4RkZDMDBGQzAJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJCSovCisjZGVmaW5lIE1ETUFfUzFfU1RBUlRfQUREUgkJMHhGRkMwMEZDNAkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfUzFfQ09ORklHCQkJMHhGRkMwMEZDOAkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfUzFfWF9DT1VOVAkJCTB4RkZDMDBGRDAJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBYIENvdW50IFJlZ2lzdGVyCQkJCQkJCSovCisjZGVmaW5lIE1ETUFfUzFfWF9NT0RJRlkJCTB4RkZDMDBGRDQJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCQkqLworI2RlZmluZSBNRE1BX1MxX1lfQ09VTlQJCQkweEZGQzAwRkQ4CS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgWSBDb3VudCBSZWdpc3RlcgkJCQkJCQkqLworI2RlZmluZSBNRE1BX1MxX1lfTU9ESUZZCQkweEZGQzAwRkRDCS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMV9DVVJSX0RFU0NfUFRSCTB4RkZDMDBGRTAJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgTURNQV9TMV9DVVJSX0FERFIJCTB4RkZDMDBGRTQJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfUzFfSVJRX1NUQVRVUwkJMHhGRkMwMEZFOAkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfUzFfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEZFQwkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX1MxX0NVUlJfWF9DT1VOVAkweEZGQzAwRkYwCS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX1MxX0NVUlJfWV9DT1VOVAkweEZGQzAwRkY4CS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCQkqLworCisKKy8qIFBhcmFsbGVsIFBlcmlwaGVyYWwgSW50ZXJmYWNlICgweEZGQzAxMDAwIC0gMHhGRkMwMTBGRikJCQkJKi8KKyNkZWZpbmUgUFBJX0NPTlRST0wJCQkweEZGQzAxMDAwCS8qIFBQSSBDb250cm9sIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUFBJX1NUQVRVUwkJCTB4RkZDMDEwMDQJLyogUFBJIFN0YXR1cyBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBQSV9DT1VOVAkJCTB4RkZDMDEwMDgJLyogUFBJIFRyYW5zZmVyIENvdW50IFJlZ2lzdGVyCSovCisjZGVmaW5lIFBQSV9ERUxBWQkJCTB4RkZDMDEwMEMJLyogUFBJIERlbGF5IENvdW50IFJlZ2lzdGVyCQkqLworI2RlZmluZSBQUElfRlJBTUUJCQkweEZGQzAxMDEwCS8qIFBQSSBGcmFtZSBMZW5ndGggUmVnaXN0ZXIJKi8KKworCisvKiBUd28tV2lyZSBJbnRlcmZhY2UJCSgweEZGQzAxNDAwIC0gMHhGRkMwMTRGRikJCQkJCQkJCSovCisjZGVmaW5lIFRXSTBfUkVHQkFTRQkJCTB4RkZDMDE0MDAKKyNkZWZpbmUgVFdJX0NMS0RJVgkJCTB4RkZDMDE0MDAJLyogU2VyaWFsIENsb2NrIERpdmlkZXIgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBUV0lfQ09OVFJPTAkJCTB4RkZDMDE0MDQJLyogVFdJIENvbnRyb2wgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBUV0lfU0xBVkVfQ1RMCQkweEZGQzAxNDA4CS8qIFNsYXZlIE1vZGUgQ29udHJvbCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBUV0lfU0xBVkVfU1RBVAkJMHhGRkMwMTQwQwkvKiBTbGF2ZSBNb2RlIFN0YXR1cyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBUV0lfU0xBVkVfQUREUgkJMHhGRkMwMTQxMAkvKiBTbGF2ZSBNb2RlIEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgVFdJX01BU1RFUl9DVEwJCTB4RkZDMDE0MTQJLyogTWFzdGVyIE1vZGUgQ29udHJvbCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBUV0lfTUFTVEVSX1NUQVQJCTB4RkZDMDE0MTgJLyogTWFzdGVyIE1vZGUgU3RhdHVzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFRXSV9NQVNURVJfQUREUgkJMHhGRkMwMTQxQwkvKiBNYXN0ZXIgTW9kZSBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFRXSV9JTlRfU1RBVAkJMHhGRkMwMTQyMAkvKiBUV0kgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFRXSV9JTlRfTUFTSwkJMHhGRkMwMTQyNAkvKiBUV0kgTWFzdGVyIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyCQkqLworI2RlZmluZSBUV0lfRklGT19DVEwJCTB4RkZDMDE0MjgJLyogRklGTyBDb250cm9sIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBUV0lfRklGT19TVEFUCQkweEZGQzAxNDJDCS8qIEZJRk8gU3RhdHVzIFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgVFdJX1hNVF9EQVRBOAkJMHhGRkMwMTQ4MAkvKiBGSUZPIFRyYW5zbWl0IERhdGEgU2luZ2xlIEJ5dGUgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgVFdJX1hNVF9EQVRBMTYJCTB4RkZDMDE0ODQJLyogRklGTyBUcmFuc21pdCBEYXRhIERvdWJsZSBCeXRlIFJlZ2lzdGVyCSovCisjZGVmaW5lIFRXSV9SQ1ZfREFUQTgJCTB4RkZDMDE0ODgJLyogRklGTyBSZWNlaXZlIERhdGEgU2luZ2xlIEJ5dGUgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgVFdJX1JDVl9EQVRBMTYJCTB4RkZDMDE0OEMJLyogRklGTyBSZWNlaXZlIERhdGEgRG91YmxlIEJ5dGUgUmVnaXN0ZXIJKi8KKworCisvKiBHZW5lcmFsIFB1cnBvc2UgSS9PIFBvcnQgRyAoMHhGRkMwMTUwMCAtIDB4RkZDMDE1RkYpCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgUE9SVEdJTwkJCQkJMHhGRkMwMTUwMAkvKiBQb3J0IEcgSS9PIFBpbiBTdGF0ZSBTcGVjaWZ5IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFBPUlRHSU9fQ0xFQVIJCQkweEZGQzAxNTA0CS8qIFBvcnQgRyBJL08gUGVyaXBoZXJhbCBJbnRlcnJ1cHQgQ2xlYXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIFBPUlRHSU9fU0VUCQkJCTB4RkZDMDE1MDgJLyogUG9ydCBHIEkvTyBQZXJpcGhlcmFsIEludGVycnVwdCBTZXQgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBQT1JUR0lPX1RPR0dMRQkJCTB4RkZDMDE1MEMJLyogUG9ydCBHIEkvTyBQaW4gU3RhdGUgVG9nZ2xlIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBQT1JUR0lPX01BU0tBCQkJMHhGRkMwMTUxMAkvKiBQb3J0IEcgSS9PIE1hc2sgU3RhdGUgU3BlY2lmeSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkqLworI2RlZmluZSBQT1JUR0lPX01BU0tBX0NMRUFSCQkweEZGQzAxNTE0CS8qIFBvcnQgRyBJL08gTWFzayBEaXNhYmxlIEludGVycnVwdCBBIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUE9SVEdJT19NQVNLQV9TRVQJCTB4RkZDMDE1MTgJLyogUG9ydCBHIEkvTyBNYXNrIEVuYWJsZSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBPUlRHSU9fTUFTS0FfVE9HR0xFCTB4RkZDMDE1MUMJLyogUG9ydCBHIEkvTyBNYXNrIFRvZ2dsZSBFbmFibGUgSW50ZXJydXB0IEEgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgUE9SVEdJT19NQVNLQgkJCTB4RkZDMDE1MjAJLyogUG9ydCBHIEkvTyBNYXNrIFN0YXRlIFNwZWNpZnkgSW50ZXJydXB0IEIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgUE9SVEdJT19NQVNLQl9DTEVBUgkJMHhGRkMwMTUyNAkvKiBQb3J0IEcgSS9PIE1hc2sgRGlzYWJsZSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBPUlRHSU9fTUFTS0JfU0VUCQkweEZGQzAxNTI4CS8qIFBvcnQgRyBJL08gTWFzayBFbmFibGUgSW50ZXJydXB0IEIgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBQT1JUR0lPX01BU0tCX1RPR0dMRQkweEZGQzAxNTJDCS8qIFBvcnQgRyBJL08gTWFzayBUb2dnbGUgRW5hYmxlIEludGVycnVwdCBCIFJlZ2lzdGVyCSovCisjZGVmaW5lIFBPUlRHSU9fRElSCQkJCTB4RkZDMDE1MzAJLyogUG9ydCBHIEkvTyBEaXJlY3Rpb24gUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBQT1JUR0lPX1BPTEFSCQkJMHhGRkMwMTUzNAkvKiBQb3J0IEcgSS9PIFNvdXJjZSBQb2xhcml0eSBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgUE9SVEdJT19FREdFCQkJMHhGRkMwMTUzOAkvKiBQb3J0IEcgSS9PIFNvdXJjZSBTZW5zaXRpdml0eSBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBQT1JUR0lPX0JPVEgJCQkweEZGQzAxNTNDCS8qIFBvcnQgRyBJL08gU2V0IG9uIEJPVEggRWRnZXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgUE9SVEdJT19JTkVOCQkJMHhGRkMwMTU0MAkvKiBQb3J0IEcgSS9PIElucHV0IEVuYWJsZSBSZWdpc3RlcgkJCQkJCSovCisKKworLyogR2VuZXJhbCBQdXJwb3NlIEkvTyBQb3J0IEggKDB4RkZDMDE3MDAgLSAweEZGQzAxN0ZGKQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFBPUlRISU8JCQkJCTB4RkZDMDE3MDAJLyogUG9ydCBIIEkvTyBQaW4gU3RhdGUgU3BlY2lmeSBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBQT1JUSElPX0NMRUFSCQkJMHhGRkMwMTcwNAkvKiBQb3J0IEggSS9PIFBlcmlwaGVyYWwgSW50ZXJydXB0IENsZWFyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBQT1JUSElPX1NFVAkJCQkweEZGQzAxNzA4CS8qIFBvcnQgSCBJL08gUGVyaXBoZXJhbCBJbnRlcnJ1cHQgU2V0IFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUE9SVEhJT19UT0dHTEUJCQkweEZGQzAxNzBDCS8qIFBvcnQgSCBJL08gUGluIFN0YXRlIFRvZ2dsZSBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgUE9SVEhJT19NQVNLQQkJCTB4RkZDMDE3MTAJLyogUG9ydCBIIEkvTyBNYXNrIFN0YXRlIFNwZWNpZnkgSW50ZXJydXB0IEEgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgUE9SVEhJT19NQVNLQV9DTEVBUgkJMHhGRkMwMTcxNAkvKiBQb3J0IEggSS9PIE1hc2sgRGlzYWJsZSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBPUlRISU9fTUFTS0FfU0VUCQkweEZGQzAxNzE4CS8qIFBvcnQgSCBJL08gTWFzayBFbmFibGUgSW50ZXJydXB0IEEgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBQT1JUSElPX01BU0tBX1RPR0dMRQkweEZGQzAxNzFDCS8qIFBvcnQgSCBJL08gTWFzayBUb2dnbGUgRW5hYmxlIEludGVycnVwdCBBIFJlZ2lzdGVyCSovCisjZGVmaW5lIFBPUlRISU9fTUFTS0IJCQkweEZGQzAxNzIwCS8qIFBvcnQgSCBJL08gTWFzayBTdGF0ZSBTcGVjaWZ5IEludGVycnVwdCBCIFJlZ2lzdGVyCSovCisjZGVmaW5lIFBPUlRISU9fTUFTS0JfQ0xFQVIJCTB4RkZDMDE3MjQJLyogUG9ydCBIIEkvTyBNYXNrIERpc2FibGUgSW50ZXJydXB0IEIgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBQT1JUSElPX01BU0tCX1NFVAkJMHhGRkMwMTcyOAkvKiBQb3J0IEggSS9PIE1hc2sgRW5hYmxlIEludGVycnVwdCBCIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUE9SVEhJT19NQVNLQl9UT0dHTEUJMHhGRkMwMTcyQwkvKiBQb3J0IEggSS9PIE1hc2sgVG9nZ2xlIEVuYWJsZSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkqLworI2RlZmluZSBQT1JUSElPX0RJUgkJCQkweEZGQzAxNzMwCS8qIFBvcnQgSCBJL08gRGlyZWN0aW9uIFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgUE9SVEhJT19QT0xBUgkJCTB4RkZDMDE3MzQJLyogUG9ydCBIIEkvTyBTb3VyY2UgUG9sYXJpdHkgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFBPUlRISU9fRURHRQkJCTB4RkZDMDE3MzgJLyogUG9ydCBIIEkvTyBTb3VyY2UgU2Vuc2l0aXZpdHkgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgUE9SVEhJT19CT1RICQkJMHhGRkMwMTczQwkvKiBQb3J0IEggSS9PIFNldCBvbiBCT1RIIEVkZ2VzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFBPUlRISU9fSU5FTgkJCTB4RkZDMDE3NDAJLyogUG9ydCBIIEkvTyBJbnB1dCBFbmFibGUgUmVnaXN0ZXIJCQkJCQkqLworCisKKy8qIFVBUlQxIENvbnRyb2xsZXIJCSgweEZGQzAyMDAwIC0gMHhGRkMwMjBGRikJCQkJCQkJCSovCisjZGVmaW5lIFVBUlQxX1RIUgkJCTB4RkZDMDIwMDAJLyogVHJhbnNtaXQgSG9sZGluZyByZWdpc3RlcgkJCSovCisjZGVmaW5lIFVBUlQxX1JCUgkJCTB4RkZDMDIwMDAJLyogUmVjZWl2ZSBCdWZmZXIgcmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgVUFSVDFfRExMCQkJMHhGRkMwMjAwMAkvKiBEaXZpc29yIExhdGNoIChMb3ctQnl0ZSkJCQkJKi8KKyNkZWZpbmUgVUFSVDFfSUVSCQkJMHhGRkMwMjAwNAkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgVUFSVDFfRExICQkJMHhGRkMwMjAwNAkvKiBEaXZpc29yIExhdGNoIChIaWdoLUJ5dGUpCQkJKi8KKyNkZWZpbmUgVUFSVDFfSUlSCQkJMHhGRkMwMjAwOAkvKiBJbnRlcnJ1cHQgSWRlbnRpZmljYXRpb24gUmVnaXN0ZXIJKi8KKyNkZWZpbmUgVUFSVDFfTENSCQkJMHhGRkMwMjAwQwkvKiBMaW5lIENvbnRyb2wgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgVUFSVDFfTUNSCQkJMHhGRkMwMjAxMAkvKiBNb2RlbSBDb250cm9sIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFVBUlQxX0xTUgkJCTB4RkZDMDIwMTQJLyogTGluZSBTdGF0dXMgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFVBUlQxX01TUgkJCTB4RkZDMDIwMTgJLyogTW9kZW0gU3RhdHVzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFVBUlQxX1NDUgkJCTB4RkZDMDIwMUMJLyogU0NSIFNjcmF0Y2ggUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFVBUlQxX0dDVEwJCQkweEZGQzAyMDI0CS8qIEdsb2JhbCBDb250cm9sIFJlZ2lzdGVyCQkJCSovCisKKworLyogUGluIENvbnRyb2wgUmVnaXN0ZXJzCSgweEZGQzAzMjAwIC0gMHhGRkMwMzJGRikJCQkJCQkJCQkJCSovCisjZGVmaW5lIFBPUlRGX0ZFUgkJCTB4RkZDMDMyMDAJLyogUG9ydCBGIEZ1bmN0aW9uIEVuYWJsZSBSZWdpc3RlciAoQWx0ZXJuYXRlL0ZsYWcqKQkqLworI2RlZmluZSBQT1JUR19GRVIJCQkweEZGQzAzMjA0CS8qIFBvcnQgRyBGdW5jdGlvbiBFbmFibGUgUmVnaXN0ZXIgKEFsdGVybmF0ZS9GbGFnKikJKi8KKyNkZWZpbmUgUE9SVEhfRkVSCQkJMHhGRkMwMzIwOAkvKiBQb3J0IEggRnVuY3Rpb24gRW5hYmxlIFJlZ2lzdGVyIChBbHRlcm5hdGUvRmxhZyopCSovCisjZGVmaW5lIEJGSU5fUE9SVF9NVVgJCQkweEZGQzAzMjBDCS8qIFBvcnQgTXVsdGlwbGV4ZXIgQ29udHJvbCBSZWdpc3RlcgkJCQkJKi8KKworCisvKiBIYW5kc2hha2UgTURNQSBSZWdpc3RlcnMJKDB4RkZDMDMzMDAgLSAweEZGQzAzM0ZGKQkJCQkJCQkJCQkqLworI2RlZmluZSBITURNQTBfQ09OVFJPTAkJMHhGRkMwMzMwMAkvKiBIYW5kc2hha2UgTURNQTAgQ29udHJvbCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgSE1ETUEwX0VDSU5JVAkJMHhGRkMwMzMwNAkvKiBITURNQTAgSW5pdGlhbCBFZGdlIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIEhNRE1BMF9CQ0lOSVQJCTB4RkZDMDMzMDgJLyogSE1ETUEwIEluaXRpYWwgQmxvY2sgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgSE1ETUEwX0VDVVJHRU5UCQkweEZGQzAzMzBDCS8qIEhNRE1BMCBVcmdlbnQgRWRnZSBDb3VudCBUaHJlc2hob2xkIFJlZ2lzdGVyCQkqLworI2RlZmluZSBITURNQTBfRUNPVkVSRkxPVwkweEZGQzAzMzEwCS8qIEhNRE1BMCBFZGdlIENvdW50IE92ZXJmbG93IEludGVycnVwdCBSZWdpc3RlcgkqLworI2RlZmluZSBITURNQTBfRUNPVU5UCQkweEZGQzAzMzE0CS8qIEhNRE1BMCBDdXJyZW50IEVkZ2UgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgSE1ETUEwX0JDT1VOVAkJMHhGRkMwMzMxOAkvKiBITURNQTAgQ3VycmVudCBCbG9jayBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIEhNRE1BMV9DT05UUk9MCQkweEZGQzAzMzQwCS8qIEhhbmRzaGFrZSBNRE1BMSBDb250cm9sIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBITURNQTFfRUNJTklUCQkweEZGQzAzMzQ0CS8qIEhNRE1BMSBJbml0aWFsIEVkZ2UgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgSE1ETUExX0JDSU5JVAkJMHhGRkMwMzM0OAkvKiBITURNQTEgSW5pdGlhbCBCbG9jayBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBITURNQTFfRUNVUkdFTlQJCTB4RkZDMDMzNEMJLyogSE1ETUExIFVyZ2VudCBFZGdlIENvdW50IFRocmVzaGhvbGQgUmVnaXN0ZXIJCSovCisjZGVmaW5lIEhNRE1BMV9FQ09WRVJGTE9XCTB4RkZDMDMzNTAJLyogSE1ETUExIEVkZ2UgQ291bnQgT3ZlcmZsb3cgSW50ZXJydXB0IFJlZ2lzdGVyCSovCisjZGVmaW5lIEhNRE1BMV9FQ09VTlQJCTB4RkZDMDMzNTQJLyogSE1ETUExIEN1cnJlbnQgRWRnZSBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBITURNQTFfQkNPVU5UCQkweEZGQzAzMzU4CS8qIEhNRE1BMSBDdXJyZW50IEJsb2NrIENvdW50IFJlZ2lzdGVyCQkJCSovCisKKworLyogR1BJTyBQSU4gbXV4ICgweEZGQzAzMjEwIC0gT3hGRkMwMzI4OCkgKi8KKyNkZWZpbmUgUE9SVEZfTVVYICAgICAgICAgICAgICAgMHhGRkMwMzIxMCAgICAgIC8qIFBvcnQgRiBtdXggY29udHJvbCAqLworI2RlZmluZSBQT1JUR19NVVggICAgICAgICAgICAgICAweEZGQzAzMjE0ICAgICAgLyogUG9ydCBHIG11eCBjb250cm9sICovCisjZGVmaW5lIFBPUlRIX01VWCAgICAgICAgICAgICAgIDB4RkZDMDMyMTggICAgICAvKiBQb3J0IEggbXV4IGNvbnRyb2wgKi8KKyNkZWZpbmUgUE9SVEZfRFJJVkUgICAgICAgICAgICAgMHhGRkMwMzIyMCAgICAgIC8qIFBvcnQgRiBkcml2ZSBzdHJlbmd0aCBjb250cm9sICovCisjZGVmaW5lIFBPUlRHX0RSSVZFICAgICAgICAgICAgIDB4RkZDMDMyMjQgICAgICAvKiBQb3J0IEcgZHJpdmUgc3RyZW5ndGggY29udHJvbCAqLworI2RlZmluZSBQT1JUSF9EUklWRSAgICAgICAgICAgICAweEZGQzAzMjI4ICAgICAgLyogUG9ydCBIIGRyaXZlIHN0cmVuZ3RoIGNvbnRyb2wgKi8KKyNkZWZpbmUgUE9SVEZfU0xFVyAgICAgICAgICAgICAgMHhGRkMwMzIzMCAgICAgIC8qIFBvcnQgRiBzbGV3IGNvbnRyb2wgKi8KKyNkZWZpbmUgUE9SVEdfU0xFVyAgICAgICAgICAgICAgMHhGRkMwMzIzNCAgICAgIC8qIFBvcnQgRyBzbGV3IGNvbnRyb2wgKi8KKyNkZWZpbmUgUE9SVEhfU0xFVyAgICAgICAgICAgICAgMHhGRkMwMzIzOCAgICAgIC8qIFBvcnQgSCBzbGV3IGNvbnRyb2wgKi8KKyNkZWZpbmUgUE9SVEZfSFlTVEVSSVNJUyAgICAgICAgMHhGRkMwMzI0MCAgICAgIC8qIFBvcnQgRiBTY2htaXR0IHRyaWdnZXIgY29udHJvbCAqLworI2RlZmluZSBQT1JUR19IWVNURVJJU0lTICAgICAgICAweEZGQzAzMjQ0ICAgICAgLyogUG9ydCBHIFNjaG1pdHQgdHJpZ2dlciBjb250cm9sICovCisjZGVmaW5lIFBPUlRIX0hZU1RFUklTSVMgICAgICAgIDB4RkZDMDMyNDggICAgICAvKiBQb3J0IEggU2NobWl0dCB0cmlnZ2VyIGNvbnRyb2wgKi8KKyNkZWZpbmUgTUlTQ1BPUlRfRFJJVkUgICAgICAgICAgMHhGRkMwMzI4MCAgICAgIC8qIE1pc2MgUG9ydCBkcml2ZSBzdHJlbmd0aCBjb250cm9sICovCisjZGVmaW5lIE1JU0NQT1JUX1NMRVcgICAgICAgICAgIDB4RkZDMDMyODQgICAgICAvKiBNaXNjIFBvcnQgc2xldyBjb250cm9sICovCisjZGVmaW5lIE1JU0NQT1JUX0hZU1RFUklTSVMgICAgIDB4RkZDMDMyODggICAgICAvKiBNaXNjIFBvcnQgU2NobWl0dCB0cmlnZ2VyIGNvbnRyb2wgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIFN5c3RlbSBNTVIgUmVnaXN0ZXIgQml0cyBBbmQgTWFjcm9zCisqKgorKiogRGlzY2xhaW1lcjoJQWxsIG1hY3JvcyBhcmUgaW50ZW5kZWQgdG8gbWFrZSBDIGFuZCBBc3NlbWJseSBjb2RlIG1vcmUgcmVhZGFibGUuCisqKgkJCQlVc2UgdGhlc2UgbWFjcm9zIGNhcmVmdWxseSwgYXMgYW55IHRoYXQgZG8gbGVmdCBzaGlmdHMgZm9yIGZpZWxkCisqKgkJCQlkZXBvc2l0aW5nIHdpbGwgcmVzdWx0IGluIHRoZSBsb3dlciBvcmRlciBiaXRzIGJlaW5nIGRlc3Ryb3llZC4gIEFueQorKioJCQkJbWFjcm8gdGhhdCBzaGlmdHMgbGVmdCB0byBwcm9wZXJseSBwb3NpdGlvbiB0aGUgYml0LWZpZWxkIHNob3VsZCBiZQorKioJCQkJdXNlZCBhcyBwYXJ0IG9mIGFuIE9SIHRvIGluaXRpYWxpemUgYSByZWdpc3RlciBhbmQgTk9UIGFzIGEgZHluYW1pYworKioJCQkJbW9kaWZpZXIgVU5MRVNTIHRoZSBsb3dlciBvcmRlciBiaXRzIGFyZSBzYXZlZCBhbmQgT1JlZCBiYWNrIGluIHdoZW4KKyoqCQkJCXRoZSBtYWNybyBpcyB1c2VkLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisqKiAqKioqKioqKioqKioqKioqKioqKiogUExMIEFORCBSRVNFVCBNQVNLUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUExMX0NUTCBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgREYJCQkJMHgwMDAxCS8qIDA6IFBMTCA9IENMS0lOLCAxOiBQTEwgPSBDTEtJTi8yCQkJCQkqLworI2RlZmluZSBQTExfT0ZGCQkJMHgwMDAyCS8qIFBMTCBOb3QgUG93ZXJlZAkJCQkJCQkJCSovCisjZGVmaW5lIFNUT1BDSwkJCTB4MDAwOAkvKiBDb3JlIENsb2NrIE9mZgkJCQkJCQkJCSovCisjZGVmaW5lIFBEV04JCQkweDAwMjAJLyogRW50ZXIgRGVlcCBTbGVlcCBNb2RlCQkJCQkJCSovCisjZGVmaW5lCUlOX0RFTEFZCQkweDAwNDAJLyogQWRkIDIwMHBzIERlbGF5IFRvIEVCSVUgSW5wdXQgTGF0Y2hlcwkJCSovCisjZGVmaW5lCU9VVF9ERUxBWQkJMHgwMDgwCS8qIEFkZCAyMDBwcyBEZWxheSBUbyBFQklVIE91dHB1dCBTaWduYWxzCQkJKi8KKyNkZWZpbmUgQllQQVNTCQkJMHgwMTAwCS8qIEJ5cGFzcyB0aGUgUExMCQkJCQkJCQkJKi8KKyNkZWZpbmUJTVNFTAkJCTB4N0UwMAkvKiBNdWx0aXBsaWVyIFNlbGVjdCBGb3IgQ0NMSy9WQ08gRmFjdG9ycwkJCSovCisvKiBQTExfQ1RMIE1hY3JvcyAoT25seSBVc2UgV2l0aCBMb2dpYyBPUiBXaGlsZSBTZXR0aW5nIExvd2VyIE9yZGVyIEJpdHMpCQkJKi8KKyNkZWZpbmUJU0VUX01TRUwoeCkJCSgoKHgpJjB4M0YpIDw8IDB4OSkJLyogU2V0IE1TRUwgPSAwLTYzIC0tPiBWQ08gPSBDTEtJTipNU0VMCQkqLworCisvKiBQTExfRElWIE1hc2tzCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBTU0VMCQkJMHgwMDBGCS8qIFN5c3RlbSBTZWxlY3QJCQkJCQkqLworI2RlZmluZQlDU0VMCQkJMHgwMDMwCS8qIENvcmUgU2VsZWN0CQkJCQkJCSovCisjZGVmaW5lIENTRUxfRElWMQkJMHgwMDAwCS8qIAkJQ0NMSyA9IFZDTyAvIDEJCQkJCSovCisjZGVmaW5lIENTRUxfRElWMgkJMHgwMDEwCS8qIAkJQ0NMSyA9IFZDTyAvIDIJCQkJCSovCisjZGVmaW5lCUNTRUxfRElWNAkJMHgwMDIwCS8qIAkJQ0NMSyA9IFZDTyAvIDQJCQkJCSovCisjZGVmaW5lCUNTRUxfRElWOAkJMHgwMDMwCS8qIAkJQ0NMSyA9IFZDTyAvIDgJCQkJCSovCisvKiBQTExfRElWIE1hY3JvcwkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgU0VUX1NTRUwoeCkJCSgoeCkmMHhGKQkJLyogU2V0IFNTRUwgPSAwLTE1IC0tPiBTQ0xLID0gVkNPL1NTRUwJKi8KKworLyogVlJfQ1RMIE1hc2tzCSovCisjZGVmaW5lCUZSRVEJCQkweDMwMDAJLyogU3dpdGNoaW5nIE9zY2lsbGF0b3IgRnJlcXVlbmN5IEZvciBSZWd1bGF0b3IJKi8KKyNkZWZpbmUJSElCRVJOQVRFCQkweDAwMDAJLyogCQlQb3dlcmRvd24vQnlwYXNzIE9uLUJvYXJkIFJlZ3VsYXRpb24JKi8KKworI2RlZmluZQlWTEVWCQkJMHgwMEYwCS8qIEludGVybmFsIFZvbHRhZ2UgTGV2ZWwJCQkJCSovCisjZGVmaW5lCVZMRVZfMDg1IAkJMHgwMDYwCS8qIAkJVkxFViA9IDAuODUgViAoLTUlIC0gKzEwJSBBY2N1cmFjeSkJKi8KKyNkZWZpbmUJVkxFVl8wOTAJCTB4MDA3MAkvKiAJCVZMRVYgPSAwLjkwIFYgKC01JSAtICsxMCUgQWNjdXJhY3kpCSovCisjZGVmaW5lCVZMRVZfMDk1CQkweDAwODAJLyogCQlWTEVWID0gMC45NSBWICgtNSUgLSArMTAlIEFjY3VyYWN5KQkqLworI2RlZmluZQlWTEVWXzEwMAkJMHgwMDkwCS8qIAkJVkxFViA9IDEuMDAgViAoLTUlIC0gKzEwJSBBY2N1cmFjeSkJKi8KKyNkZWZpbmUJVkxFVl8xMDUJCTB4MDBBMAkvKiAJCVZMRVYgPSAxLjA1IFYgKC01JSAtICsxMCUgQWNjdXJhY3kpCSovCisjZGVmaW5lCVZMRVZfMTEwCQkweDAwQjAJLyogCQlWTEVWID0gMS4xMCBWICgtNSUgLSArMTAlIEFjY3VyYWN5KQkqLworI2RlZmluZQlWTEVWXzExNQkJMHgwMEMwCS8qIAkJVkxFViA9IDEuMTUgViAoLTUlIC0gKzEwJSBBY2N1cmFjeSkJKi8KKyNkZWZpbmUJVkxFVl8xMjAJCTB4MDBEMAkvKiAJCVZMRVYgPSAxLjIwIFYgKC01JSAtICsxMCUgQWNjdXJhY3kpCSovCisjZGVmaW5lCVZMRVZfMTI1CQkweDAwRTAJLyogCQlWTEVWID0gMS4yNSBWICgtNSUgLSArMTAlIEFjY3VyYWN5KQkqLworI2RlZmluZQlWTEVWXzEzMAkJMHgwMEYwCS8qIAkJVkxFViA9IDEuMzAgViAoLTUlIC0gKzEwJSBBY2N1cmFjeSkJKi8KKworI2RlZmluZQlXQUtFCQkJMHgwMTAwCS8qIEVuYWJsZSBSVEMvUmVzZXQgV2FrZXVwIEZyb20gSGliZXJuYXRlCSovCisjZGVmaW5lCVVTQldFCQkJMHgwMjAwCS8qIEVuYWJsZSBVU0IgV2FrZXVwIEZyb20gSGliZXJuYXRlCQkJKi8KKyNkZWZpbmUJUEhZV0UJCQkweDA0MDAJLyogRW5hYmxlIFBIWSBXYWtldXAgRnJvbSBIaWJlcm5hdGUJCQkqLworI2RlZmluZQlDTEtCVUZPRQkJMHg0MDAwCS8qIENMS0lOIEJ1ZmZlciBPdXRwdXQgRW5hYmxlICovCisjZGVmaW5lCVBIWUNMS09FCQlDTEtCVUZPRQkvKiBBbHRlcm5hdGl2ZSBsZWdhY3kgbmFtZSBmb3IgdGhlIGFib3ZlICovCisjZGVmaW5lCVNDS0VMT1cJCTB4ODAwMAkvKiBFbmFibGUgRHJpdmUgQ0tFIExvdyBEdXJpbmcgUmVzZXQJCSovCisKKy8qIFBMTF9TVEFUIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBBQ1RJVkVfUExMRU5BQkxFRAkweDAwMDEJLyogUHJvY2Vzc29yIEluIEFjdGl2ZSBNb2RlIFdpdGggUExMIEVuYWJsZWQJKi8KKyNkZWZpbmUJRlVMTF9PTgkJCQkweDAwMDIJLyogUHJvY2Vzc29yIEluIEZ1bGwgT24gTW9kZQkJCQkJKi8KKyNkZWZpbmUgQUNUSVZFX1BMTERJU0FCTEVECTB4MDAwNAkvKiBQcm9jZXNzb3IgSW4gQWN0aXZlIE1vZGUgV2l0aCBQTEwgRGlzYWJsZWQJKi8KKyNkZWZpbmUJUExMX0xPQ0tFRAkJCTB4MDAyMAkvKiBQTExfTE9DS0NOVCBIYXMgQmVlbiBSZWFjaGVkCQkJCQkqLworCisvKiBDSElQSUQgTWFza3MgKi8KKyNkZWZpbmUgQ0hJUElEX1ZFUlNJT04gICAgICAgICAweEYwMDAwMDAwCisjZGVmaW5lIENISVBJRF9GQU1JTFkgICAgICAgICAgMHgwRkZGRjAwMAorI2RlZmluZSBDSElQSURfTUFOVUZBQ1RVUkUgICAgIDB4MDAwMDBGRkUKKworLyogU1dSU1QgTWFza3MJCQkJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBTWVNURU1fUkVTRVQJCTB4MDAwNwkvKiBJbml0aWF0ZXMgQSBTeXN0ZW0gU29mdHdhcmUgUmVzZXQJCQkqLworI2RlZmluZQlET1VCTEVfRkFVTFQJCTB4MDAwOAkvKiBDb3JlIERvdWJsZSBGYXVsdCBDYXVzZXMgUmVzZXQJCQkJKi8KKyNkZWZpbmUgUkVTRVRfRE9VQkxFCQkweDIwMDAJLyogU1cgUmVzZXQgR2VuZXJhdGVkIEJ5IENvcmUgRG91YmxlLUZhdWx0CQkqLworI2RlZmluZSBSRVNFVF9XRE9HCQkJMHg0MDAwCS8qIFNXIFJlc2V0IEdlbmVyYXRlZCBCeSBXYXRjaGRvZyBUaW1lcgkJCSovCisjZGVmaW5lIFJFU0VUX1NPRlRXQVJFCQkweDgwMDAJLyogU1cgUmVzZXQgT2NjdXJyZWQgU2luY2UgTGFzdCBSZWFkIE9mIFNXUlNUCSovCisKKy8qIFNZU0NSIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBCTU9ERQkJCQkweDAwMDcJLyogQm9vdCBNb2RlIC0gTGF0Y2hlZCBEdXJpbmcgSFcgUmVzZXQgRnJvbSBNb2RlIFBpbnMJKi8KKyNkZWZpbmUJTk9CT09UCQkJCTB4MDAxMAkvKiBFeGVjdXRlIEZyb20gTDEgb3IgQVNZTkMgQmFuayAwIFdoZW4gQk1PREUgPSAwCQkqLworCisKKy8qICoqKioqKioqKioqKiogIFNZU1RFTSBJTlRFUlJVUFQgQ09OVFJPTExFUiBNQVNLUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUGVyaXBoZXJhbCBNYXNrcyBGb3IgU0lDX0lTUiwgU0lDX0lXUiwgU0lDX0lNQVNLCQkJCQkJCQkJCSovCisKKyNpZiAwCisjZGVmaW5lIElSUV9QTExfV0FLRVVQCTB4MDAwMDAwMDEJLyogUExMIFdha2V1cCBJbnRlcnJ1cHQJCQkgCQkJCQkqLworCisjZGVmaW5lIElSUV9FUlJPUjEgICAgICAweDAwMDAwMDAyICAvKiBFcnJvciBJbnRlcnJ1cHQgKERNQSwgRE1BUnggQmxvY2ssIERNQVJ4IE92ZXJmbG93KSAqLworI2RlZmluZSBJUlFfRVJST1IyICAgICAgMHgwMDAwMDAwNCAgLyogRXJyb3IgSW50ZXJydXB0IChDQU4sIEV0aGVybmV0LCBTUE9SVHgsIFBQSSwgU1BJLCBVQVJUeCkgKi8KKyNkZWZpbmUgSVJRX1JUQwkJCTB4MDAwMDAwMDgJLyogUmVhbCBUaW1lIENsb2NrIEludGVycnVwdCAJCQkJCQkqLworI2RlZmluZSBJUlFfRE1BMAkJMHgwMDAwMDAxMAkvKiBETUEgQ2hhbm5lbCAwIChQUEkpIEludGVycnVwdCAJCQkJCSovCisjZGVmaW5lIElSUV9ETUEzCQkweDAwMDAwMDIwCS8qIERNQSBDaGFubmVsIDMgKFNQT1JUMCBSWCkgSW50ZXJydXB0IAkJCQkqLworI2RlZmluZSBJUlFfRE1BNAkJMHgwMDAwMDA0MAkvKiBETUEgQ2hhbm5lbCA0IChTUE9SVDAgVFgpIEludGVycnVwdCAJCQkJKi8KKyNkZWZpbmUgSVJRX0RNQTUJCTB4MDAwMDAwODAJLyogRE1BIENoYW5uZWwgNSAoU1BPUlQxIFJYKSBJbnRlcnJ1cHQgCQkJCSovCisKKyNkZWZpbmUgSVJRX0RNQTYJCTB4MDAwMDAxMDAJLyogRE1BIENoYW5uZWwgNiAoU1BPUlQxIFRYKSBJbnRlcnJ1cHQgCQkgCQkqLworI2RlZmluZSBJUlFfVFdJCQkJMHgwMDAwMDIwMAkvKiBUV0kgSW50ZXJydXB0CQkJCQkJCQkJKi8KKyNkZWZpbmUgSVJRX0RNQTcJCTB4MDAwMDA0MDAJLyogRE1BIENoYW5uZWwgNyAoU1BJKSBJbnRlcnJ1cHQgCQkJCQkqLworI2RlZmluZSBJUlFfRE1BOAkJMHgwMDAwMDgwMAkvKiBETUEgQ2hhbm5lbCA4IChVQVJUMCBSWCkgSW50ZXJydXB0IAkJCQkqLworI2RlZmluZSBJUlFfRE1BOQkJMHgwMDAwMTAwMAkvKiBETUEgQ2hhbm5lbCA5IChVQVJUMCBUWCkgSW50ZXJydXB0IAkJCQkqLworI2RlZmluZSBJUlFfRE1BMTAJCTB4MDAwMDIwMDAJLyogRE1BIENoYW5uZWwgMTAgKFVBUlQxIFJYKSBJbnRlcnJ1cHQgCQkJCSovCisjZGVmaW5lIElSUV9ETUExMQkJMHgwMDAwNDAwMAkvKiBETUEgQ2hhbm5lbCAxMSAoVUFSVDEgVFgpIEludGVycnVwdCAJCQkJKi8KKyNkZWZpbmUgSVJRX0NBTl9SWAkJMHgwMDAwODAwMAkvKiBDQU4gUmVjZWl2ZSBJbnRlcnJ1cHQgCQkJCQkJCSovCisKKyNkZWZpbmUgSVJRX0NBTl9UWAkJMHgwMDAxMDAwMAkvKiBDQU4gVHJhbnNtaXQgSW50ZXJydXB0ICAJCQkJCQkJKi8KKyNkZWZpbmUgSVJRX0RNQTEJCTB4MDAwMjAwMDAJLyogRE1BIENoYW5uZWwgMSAoRXRoZXJuZXQgUlgpIEludGVycnVwdCAJCQkqLworI2RlZmluZSBJUlFfUEZBX1BPUlRICTB4MDAwMjAwMDAJLyogUEYgUG9ydCBIIChQRjQ3OjMyKSBJbnRlcnJ1cHQgQSAJCQkJCSovCisjZGVmaW5lIElSUV9ETUEyCQkweDAwMDQwMDAwCS8qIERNQSBDaGFubmVsIDIgKEV0aGVybmV0IFRYKSBJbnRlcnJ1cHQgCQkJKi8KKyNkZWZpbmUgSVJRX1BGQl9QT1JUSAkweDAwMDQwMDAwCS8qIFBGIFBvcnQgSCAoUEY0NzozMikgSW50ZXJydXB0IEIgCQkJCQkqLworI2RlZmluZSBJUlFfVElNRVIwCQkweDAwMDgwMDAwCS8qIFRpbWVyIDAgSW50ZXJydXB0CQkJCQkJCQkqLworI2RlZmluZSBJUlFfVElNRVIxCQkweDAwMTAwMDAwCS8qIFRpbWVyIDEgSW50ZXJydXB0IAkJCQkJCQkJKi8KKyNkZWZpbmUgSVJRX1RJTUVSMgkJMHgwMDIwMDAwMAkvKiBUaW1lciAyIEludGVycnVwdCAJCQkJCQkJCSovCisjZGVmaW5lIElSUV9USU1FUjMJCTB4MDA0MDAwMDAJLyogVGltZXIgMyBJbnRlcnJ1cHQgCQkJCQkJCQkqLworI2RlZmluZSBJUlFfVElNRVI0CQkweDAwODAwMDAwCS8qIFRpbWVyIDQgSW50ZXJydXB0IAkJCQkJCQkJKi8KKworI2RlZmluZSBJUlFfVElNRVI1CQkweDAxMDAwMDAwCS8qIFRpbWVyIDUgSW50ZXJydXB0IAkJCQkJCQkJKi8KKyNkZWZpbmUgSVJRX1RJTUVSNgkJMHgwMjAwMDAwMAkvKiBUaW1lciA2IEludGVycnVwdCAJCQkJCQkJCSovCisjZGVmaW5lIElSUV9USU1FUjcJCTB4MDQwMDAwMDAJLyogVGltZXIgNyBJbnRlcnJ1cHQgCQkJCQkJCQkqLworI2RlZmluZSBJUlFfUEZBX1BPUlRGRwkweDA4MDAwMDAwCS8qIFBGIFBvcnRzIEYmRyAoUEYzMTowKSBJbnRlcnJ1cHQgQSAJCQkJKi8KKyNkZWZpbmUgSVJRX1BGQl9QT1JURgkweDgwMDAwMDAwCS8qIFBGIFBvcnQgRiAoUEYxNTowKSBJbnRlcnJ1cHQgQiAJCQkJCSovCisjZGVmaW5lIElSUV9ETUExMgkJMHgyMDAwMDAwMAkvKiBETUEgQ2hhbm5lbHMgMTIgKE1ETUExIFNvdXJjZSkgUlggSW50ZXJydXB0IAkJKi8KKyNkZWZpbmUgSVJRX0RNQTEzCQkweDIwMDAwMDAwCS8qIERNQSBDaGFubmVscyAxMyAoTURNQTEgRGVzdGluYXRpb24pIFRYIEludGVycnVwdCAqLworI2RlZmluZSBJUlFfRE1BMTQJCTB4NDAwMDAwMDAJLyogRE1BIENoYW5uZWxzIDE0IChNRE1BMCBTb3VyY2UpIFJYIEludGVycnVwdCAJCSovCisjZGVmaW5lIElSUV9ETUExNQkJMHg0MDAwMDAwMAkvKiBETUEgQ2hhbm5lbHMgMTUgKE1ETUEwIERlc3RpbmF0aW9uKSBUWCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSVJRX1dET0cJCTB4ODAwMDAwMDAJLyogU29mdHdhcmUgV2F0Y2hkb2cgVGltZXIgSW50ZXJydXB0IAkJCQkqLworI2RlZmluZSBJUlFfUEZCX1BPUlRHCTB4MTAwMDAwMDAJLyogUEYgUG9ydCBHIChQRjMxOjE2KSBJbnRlcnJ1cHQgQiAJCQkJCSovCisjZW5kaWYKKworLyogU0lDX0lBUjAgTWFjcm9zCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgUDBfSVZHKHgpCQkoKCh4KSYweEYpLTcpCQkJLyogUGVyaXBoZXJhbCAjMCBhc3NpZ25lZCBJVkcgI3ggCSovCisjZGVmaW5lIFAxX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDQJLyogUGVyaXBoZXJhbCAjMSBhc3NpZ25lZCBJVkcgI3ggCSovCisjZGVmaW5lIFAyX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDgJLyogUGVyaXBoZXJhbCAjMiBhc3NpZ25lZCBJVkcgI3ggCSovCisjZGVmaW5lIFAzX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweEMJLyogUGVyaXBoZXJhbCAjMyBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDRfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTAJLyogUGVyaXBoZXJhbCAjNCBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDVfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTQJLyogUGVyaXBoZXJhbCAjNSBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDZfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTgJLyogUGVyaXBoZXJhbCAjNiBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDdfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MUMJLyogUGVyaXBoZXJhbCAjNyBhc3NpZ25lZCBJVkcgI3gJKi8KKworLyogU0lDX0lBUjEgTWFjcm9zCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgUDhfSVZHKHgpCQkoKCh4KSYweEYpLTcpCQkJLyogUGVyaXBoZXJhbCAjOCBhc3NpZ25lZCBJVkcgI3ggCSovCisjZGVmaW5lIFA5X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDQJLyogUGVyaXBoZXJhbCAjOSBhc3NpZ25lZCBJVkcgI3ggCSovCisjZGVmaW5lIFAxMF9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHg4CS8qIFBlcmlwaGVyYWwgIzEwIGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMTFfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4QwkvKiBQZXJpcGhlcmFsICMxMSBhc3NpZ25lZCBJVkcgI3ggCSovCisjZGVmaW5lIFAxMl9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxMAkvKiBQZXJpcGhlcmFsICMxMiBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDEzX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDE0CS8qIFBlcmlwaGVyYWwgIzEzIGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMTRfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTgJLyogUGVyaXBoZXJhbCAjMTQgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAxNV9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxQwkvKiBQZXJpcGhlcmFsICMxNSBhc3NpZ25lZCBJVkcgI3gJKi8KKworLyogU0lDX0lBUjIgTWFjcm9zCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgUDE2X0lWRyh4KQkJKCgoeCkmMHhGKS03KQkJCS8qIFBlcmlwaGVyYWwgIzE2IGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMTdfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4NAkvKiBQZXJpcGhlcmFsICMxNyBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDE4X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDgJLyogUGVyaXBoZXJhbCAjMTggYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAxOV9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHhDCS8qIFBlcmlwaGVyYWwgIzE5IGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMjBfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTAJLyogUGVyaXBoZXJhbCAjMjAgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAyMV9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxNAkvKiBQZXJpcGhlcmFsICMyMSBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDIyX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDE4CS8qIFBlcmlwaGVyYWwgIzIyIGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMjNfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MUMJLyogUGVyaXBoZXJhbCAjMjMgYXNzaWduZWQgSVZHICN4CSovCisKKy8qIFNJQ19JQVIzIE1hY3JvcwkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFAyNF9JVkcoeCkJCSgoKHgpJjB4RiktNykJCQkvKiBQZXJpcGhlcmFsICMyNCBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDI1X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDQJLyogUGVyaXBoZXJhbCAjMjUgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAyNl9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHg4CS8qIFBlcmlwaGVyYWwgIzI2IGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMjdfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4QwkvKiBQZXJpcGhlcmFsICMyNyBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDI4X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDEwCS8qIFBlcmlwaGVyYWwgIzI4IGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMjlfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTQJLyogUGVyaXBoZXJhbCAjMjkgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAzMF9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxOAkvKiBQZXJpcGhlcmFsICMzMCBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDMxX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDFDCS8qIFBlcmlwaGVyYWwgIzMxIGFzc2lnbmVkIElWRyAjeAkqLworCisKKy8qIFNJQ19JTUFTSyBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFNJQ19VTk1BU0tfQUxMCTB4MDAwMDAwMDAJCQkJCS8qIFVubWFzayBhbGwgcGVyaXBoZXJhbCBpbnRlcnJ1cHRzCSovCisjZGVmaW5lIFNJQ19NQVNLX0FMTAkweEZGRkZGRkZGCQkJCQkvKiBNYXNrIGFsbCBwZXJpcGhlcmFsIGludGVycnVwdHMJKi8KKyNkZWZpbmUgU0lDX01BU0soeCkJCSgxIDw8ICgoeCkmMHgxRikpCQkJCQkvKiBNYXNrIFBlcmlwaGVyYWwgI3ggaW50ZXJydXB0CQkqLworI2RlZmluZSBTSUNfVU5NQVNLKHgpCSgweEZGRkZGRkZGIF4gKDEgPDwgKCh4KSYweDFGKSkpCS8qIFVubWFzayBQZXJpcGhlcmFsICN4IGludGVycnVwdAkqLworCisvKiBTSUNfSVdSIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgSVdSX0RJU0FCTEVfQUxMCTB4MDAwMDAwMDAJCQkJCS8qIFdha2V1cCBEaXNhYmxlIGFsbCBwZXJpcGhlcmFscwkqLworI2RlZmluZSBJV1JfRU5BQkxFX0FMTAkweEZGRkZGRkZGCQkJCQkvKiBXYWtldXAgRW5hYmxlIGFsbCBwZXJpcGhlcmFscwkqLworI2RlZmluZSBJV1JfRU5BQkxFKHgpCSgxIDw8ICgoeCkmMHgxRikpCQkJCQkvKiBXYWtldXAgRW5hYmxlIFBlcmlwaGVyYWwgI3gJCSovCisjZGVmaW5lIElXUl9ESVNBQkxFKHgpCSgweEZGRkZGRkZGIF4gKDEgPDwgKCh4KSYweDFGKSkpIAkvKiBXYWtldXAgRGlzYWJsZSBQZXJpcGhlcmFsICN4CQkqLworCisKKy8qICoqKioqKioqKiBXQVRDSERPRyBUSU1FUiBNQVNLUyAqKioqKioqKioqKioqKioqKioqKiAqLworCisvKiBXYXRjaGRvZyBUaW1lciBXRE9HX0NUTCBSZWdpc3RlciBNYXNrcyAqLworCisjZGVmaW5lIFdERVYoeCkgKCgoeCk8PDEpICYgMHgwMDA2KSAvKiBldmVudCBnZW5lcmF0ZWQgb24gcm9sbCBvdmVyICovCisjZGVmaW5lIFdERVZfUkVTRVQgMHgwMDAwIC8qIGdlbmVyYXRlIHJlc2V0IGV2ZW50IG9uIHJvbGwgb3ZlciAqLworI2RlZmluZSBXREVWX05NSSAweDAwMDIgLyogZ2VuZXJhdGUgTk1JIGV2ZW50IG9uIHJvbGwgb3ZlciAqLworI2RlZmluZSBXREVWX0dQSSAweDAwMDQgLyogZ2VuZXJhdGUgR1AgSVJRIG9uIHJvbGwgb3ZlciAqLworI2RlZmluZSBXREVWX05PTkUgMHgwMDA2IC8qIG5vIGV2ZW50IG9uIHJvbGwgb3ZlciAqLworI2RlZmluZSBXREVOIDB4MEZGMCAvKiBlbmFibGUgd2F0Y2hkb2cgKi8KKyNkZWZpbmUgV0RESVMgMHgwQUQwIC8qIGRpc2FibGUgd2F0Y2hkb2cgKi8KKyNkZWZpbmUgV0RSTyAweDgwMDAgLyogd2F0Y2hkb2cgcm9sbGVkIG92ZXIgbGF0Y2ggKi8KKworLyogZGVwcmVjaWF0ZWQgV0RPR19DVEwgUmVnaXN0ZXIgTWFza3MgZm9yIGxlZ2FjeSBjb2RlICovCisKKworI2RlZmluZSBJQ1RMIFdERVYKKyNkZWZpbmUgRU5BQkxFX1JFU0VUIFdERVZfUkVTRVQKKyNkZWZpbmUgV0RPR19SRVNFVCBXREVWX1JFU0VUCisjZGVmaW5lIEVOQUJMRV9OTUkgV0RFVl9OTUkKKyNkZWZpbmUgV0RPR19OTUkgV0RFVl9OTUkKKyNkZWZpbmUgRU5BQkxFX0dQSSBXREVWX0dQSQorI2RlZmluZSBXRE9HX0dQSSBXREVWX0dQSQorI2RlZmluZSBESVNBQkxFX0VWVCBXREVWX05PTkUKKyNkZWZpbmUgV0RPR19OT05FIFdERVZfTk9ORQorCisjZGVmaW5lIFRNUl9FTiBXREVOCisjZGVmaW5lIFRNUl9ESVMgV0RESVMKKyNkZWZpbmUgVFJPIFdEUk8KKyNkZWZpbmUgSUNUTF9QMCAweDAxCisgI2RlZmluZSBJQ1RMX1AxIDB4MDIKKyNkZWZpbmUgVFJPX1AgMHgwRgorCisKKworLyogKioqKioqKioqKioqKioqICBSRUFMIFRJTUUgQ0xPQ0sgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUlRDX1NUQVQgYW5kIFJUQ19BTEFSTSBNYXNrcwkJCQkJCQkJCQkqLworI2RlZmluZQlSVENfU0VDCQkJCTB4MDAwMDAwM0YJLyogUmVhbC1UaW1lIENsb2NrIFNlY29uZHMJKi8KKyNkZWZpbmUJUlRDX01JTgkJCQkweDAwMDAwRkMwCS8qIFJlYWwtVGltZSBDbG9jayBNaW51dGVzCSovCisjZGVmaW5lCVJUQ19IUgkJCQkweDAwMDFGMDAwCS8qIFJlYWwtVGltZSBDbG9jayBIb3VycwkqLworI2RlZmluZQlSVENfREFZCQkJCTB4RkZGRTAwMDAJLyogUmVhbC1UaW1lIENsb2NrIERheXMJCSovCisKKy8qIFJUQ19BTEFSTSBNYWNybwkJCXo9ZGF5CQl5PWhyCXg9bWluCXc9c2VjCQkqLworI2RlZmluZSBTRVRfQUxBUk0oeix5LHgsdykJKCgoKHopJjB4N0ZGRik8PDB4MTEpfCgoKHkpJjB4MUYpPDwweEMpfCgoKHgpJjB4M0YpPDwweDYpfCgodykmMHgzRikpCisKKy8qIFJUQ19JQ1RMIGFuZCBSVENfSVNUQVQgTWFza3MJCQkJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZQlTVE9QV0FUQ0gJCQkweDAwMDEJCS8qIFN0b3B3YXRjaCBJbnRlcnJ1cHQgRW5hYmxlCQkJCQkJCQkqLworI2RlZmluZQlBTEFSTQkJCQkweDAwMDIJCS8qIEFsYXJtIEludGVycnVwdCBFbmFibGUJCQkJCQkJCQkqLworI2RlZmluZQlTRUNPTkQJCQkJMHgwMDA0CQkvKiBTZWNvbmRzICgxIEh6KSBJbnRlcnJ1cHQgRW5hYmxlCQkJCQkJCSovCisjZGVmaW5lCU1JTlVURQkJCQkweDAwMDgJCS8qIE1pbnV0ZXMgSW50ZXJydXB0IEVuYWJsZQkJCQkJCQkJCSovCisjZGVmaW5lCUhPVVIJCQkJMHgwMDEwCQkvKiBIb3VycyBJbnRlcnJ1cHQgRW5hYmxlCQkJCQkJCQkJKi8KKyNkZWZpbmUJREFZCQkJCQkweDAwMjAJCS8qIDI0IEhvdXJzIChEYXlzKSBJbnRlcnJ1cHQgRW5hYmxlCQkJCQkJCSovCisjZGVmaW5lCURBWV9BTEFSTQkJCTB4MDA0MAkJLyogRGF5IEFsYXJtIChEYXksIEhvdXIsIE1pbnV0ZSwgU2Vjb25kKSBJbnRlcnJ1cHQgRW5hYmxlCSovCisjZGVmaW5lCVdSSVRFX1BFTkRJTkcJCTB4NDAwMAkJLyogV3JpdGUgUGVuZGluZyBTdGF0dXMJCQkJCQkJCQkJKi8KKyNkZWZpbmUJV1JJVEVfQ09NUExFVEUJCTB4ODAwMAkJLyogV3JpdGUgQ29tcGxldGUgSW50ZXJydXB0IEVuYWJsZQkJCQkJCQkqLworCisvKiBSVENfRkFTVCAvIFJUQ19QUkVOIE1hc2sJCQkJCQkJCQkJCQkqLworI2RlZmluZSBQUkVOCQkJCTB4MDAwMQkvKiBFbmFibGUgUHJlc2NhbGVyLCBSVEMgUnVucyBAMSBIegkqLworCisKKy8qICoqKioqKioqKioqKioqIFVBUlQgQ09OVFJPTExFUiBNQVNLUyAqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVUFSVHhfTENSIE1hc2tzCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgV0xTKHgpCQkoKCh4KS01KSAmIDB4MDMpCS8qIFdvcmQgTGVuZ3RoIFNlbGVjdCAqLworI2RlZmluZSBTVEIJCQkweDA0CQkJCS8qIFN0b3AgQml0cwkJCSovCisjZGVmaW5lIFBFTgkJCTB4MDgJCQkJLyogUGFyaXR5IEVuYWJsZQkJKi8KKyNkZWZpbmUgRVBTCQkJMHgxMAkJCQkvKiBFdmVuIFBhcml0eSBTZWxlY3QJKi8KKyNkZWZpbmUgU1RQCQkJMHgyMAkJCQkvKiBTdGljayBQYXJpdHkJCQkqLworI2RlZmluZSBTQgkJCTB4NDAJCQkJLyogU2V0IEJyZWFrCQkJKi8KKyNkZWZpbmUgRExBQgkJMHg4MAkJCQkvKiBEaXZpc29yIExhdGNoIEFjY2VzcwkqLworCisvKiBVQVJUeF9NQ1IgTWFzawkJCQkJCQkJCQkqLworI2RlZmluZSBMT09QX0VOQQkweDEwCS8qIExvb3BiYWNrIE1vZGUgRW5hYmxlICovCisjZGVmaW5lIExPT1BfRU5BX1AJMHgwNAorCisvKiBVQVJUeF9MU1IgTWFza3MJCQkJCQkJCQkJKi8KKyNkZWZpbmUgRFIJCQkweDAxCS8qIERhdGEgUmVhZHkJCQkJKi8KKyNkZWZpbmUgT0UJCQkweDAyCS8qIE92ZXJydW4gRXJyb3IJCQkqLworI2RlZmluZSBQRQkJCTB4MDQJLyogUGFyaXR5IEVycm9yCQkJCSovCisjZGVmaW5lIEZFCQkJMHgwOAkvKiBGcmFtaW5nIEVycm9yCQkJKi8KKyNkZWZpbmUgQkkJCQkweDEwCS8qIEJyZWFrIEludGVycnVwdAkJCSovCisjZGVmaW5lIFRIUkUJCTB4MjAJLyogVEhSIEVtcHR5CQkJCSovCisjZGVmaW5lIFRFTVQJCTB4NDAJLyogVFNSIGFuZCBVQVJUX1RIUiBFbXB0eQkqLworCisvKiBVQVJUeF9JRVIgTWFza3MJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBFUkJGSQkJMHgwMQkJLyogRW5hYmxlIFJlY2VpdmUgQnVmZmVyIEZ1bGwgSW50ZXJydXB0CQkqLworI2RlZmluZSBFVEJFSQkJMHgwMgkJLyogRW5hYmxlIFRyYW5zbWl0IEJ1ZmZlciBFbXB0eSBJbnRlcnJ1cHQJKi8KKyNkZWZpbmUgRUxTSQkJMHgwNAkJLyogRW5hYmxlIFJYIFN0YXR1cyBJbnRlcnJ1cHQJCQkJKi8KKworLyogVUFSVHhfSUlSIE1hc2tzCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBOSU5UCQkweDAxCQkvKiBQZW5kaW5nIEludGVycnVwdAkJCQkJKi8KKyNkZWZpbmUgSUlSX1RYX1JFQURZICAgIDB4MDIJCS8qIFVBUlRfVEhSIGVtcHR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElJUl9SWF9SRUFEWSAgICAweDA0CQkvKiBSZWNlaXZlIGRhdGEgcmVhZHkgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBJSVJfTElORV9DSEFOR0UgMHgwNgkJLyogUmVjZWl2ZSBsaW5lIHN0YXR1cyAgICAJCQkqLworI2RlZmluZSBJSVJfU1RBVFVTCTB4MDYJCS8qIEhpZ2hlc3QgUHJpb3JpdHkgUGVuZGluZyBJbnRlcnJ1cHQJKi8KKworLyogVUFSVHhfR0NUTCBNYXNrcwkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBVQ0VOCQkweDAxCQkvKiBFbmFibGUgVUFSVHggQ2xvY2tzCQkJCSovCisjZGVmaW5lIElSRU4JCTB4MDIJCS8qIEVuYWJsZSBJckRBIE1vZGUJCQkJCSovCisjZGVmaW5lIFRQT0xDCQkweDA0CQkvKiBJckRBIFRYIFBvbGFyaXR5IENoYW5nZQkJCSovCisjZGVmaW5lIFJQT0xDCQkweDA4CQkvKiBJckRBIFJYIFBvbGFyaXR5IENoYW5nZQkJCSovCisjZGVmaW5lIEZQRQkJCTB4MTAJCS8qIEZvcmNlIFBhcml0eSBFcnJvciBPbiBUcmFuc21pdAkqLworI2RlZmluZSBGRkUJCQkweDIwCQkvKiBGb3JjZSBGcmFtaW5nIEVycm9yIE9uIFRyYW5zbWl0CSovCisKKworLyogKioqKioqKioqKiogIFNFUklBTCBQRVJJUEhFUkFMIElOVEVSRkFDRSAoU1BJKSBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFNQSV9DVEwgTWFza3MJCQkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lCVRJTU9ECQkweDAwMDMJCS8qIFRyYW5zZmVyIEluaXRpYXRlIE1vZGUJCQkJCQkJKi8KKyNkZWZpbmUgUkRCUl9DT1JFCTB4MDAwMAkJLyogCQlSREJSIFJlYWQgSW5pdGlhdGVzLCBJUlEgV2hlbiBSREJSIEZ1bGwJCSovCisjZGVmaW5lCVREQlJfQ09SRQkweDAwMDEJCS8qIAkJVERCUiBXcml0ZSBJbml0aWF0ZXMsIElSUSBXaGVuIFREQlIgRW1wdHkJKi8KKyNkZWZpbmUgUkRCUl9ETUEJMHgwMDAyCQkvKiAJCURNQSBSZWFkLCBETUEgVW50aWwgRklGTyBFbXB0eQkJCQkqLworI2RlZmluZSBUREJSX0RNQQkweDAwMDMJCS8qIAkJRE1BIFdyaXRlLCBETUEgVW50aWwgRklGTyBGdWxsCQkJCSovCisjZGVmaW5lIFNaCQkJMHgwMDA0CQkvKiBTZW5kIFplcm8gKFdoZW4gVERCUiBFbXB0eSwgU2VuZCBaZXJvL0xhc3QqKQkJKi8KKyNkZWZpbmUgR00JCQkweDAwMDgJCS8qIEdldCBNb3JlIChXaGVuIFJEQlIgRnVsbCwgT3ZlcndyaXRlL0Rpc2NhcmQqKQkqLworI2RlZmluZSBQU1NFCQkweDAwMTAJCS8qIFNsYXZlLVNlbGVjdCBJbnB1dCBFbmFibGUJCQkJCQkqLworI2RlZmluZSBFTUlTTwkJMHgwMDIwCQkvKiBFbmFibGUgTUlTTyBBcyBPdXRwdXQJCQkJCQkJKi8KKyNkZWZpbmUgU0laRQkJMHgwMTAwCQkvKiBTaXplIG9mIFdvcmRzICgxNi84KiBCaXRzKQkJCQkJCSovCisjZGVmaW5lIExTQkYJCTB4MDIwMAkJLyogTFNCIEZpcnN0CQkJCQkJCQkJCSovCisjZGVmaW5lIENQSEEJCTB4MDQwMAkJLyogQ2xvY2sgUGhhc2UJCQkJCQkJCQkJKi8KKyNkZWZpbmUgQ1BPTAkJMHgwODAwCQkvKiBDbG9jayBQb2xhcml0eQkJCQkJCQkJCSovCisjZGVmaW5lIE1TVFIJCTB4MTAwMAkJLyogTWFzdGVyL1NsYXZlKgkJCQkJCQkJCSovCisjZGVmaW5lIFdPTQkJCTB4MjAwMAkJLyogV3JpdGUgT3BlbiBEcmFpbiBNYXN0ZXIJCQkJCQkJKi8KKyNkZWZpbmUgU1BFCQkJMHg0MDAwCQkvKiBTUEkgRW5hYmxlCQkJCQkJCQkJCSovCisKKy8qIFNQSV9GTEcgTWFza3MJCQkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIEZMUzEJCTB4MDAwMgkJLyogRW5hYmxlcyBTUElfRkxPVVQxIGFzIFNQSSBTbGF2ZS1TZWxlY3QgT3V0cHV0CSovCisjZGVmaW5lIEZMUzIJCTB4MDAwNAkJLyogRW5hYmxlcyBTUElfRkxPVVQyIGFzIFNQSSBTbGF2ZS1TZWxlY3QgT3V0cHV0CSovCisjZGVmaW5lIEZMUzMJCTB4MDAwOAkJLyogRW5hYmxlcyBTUElfRkxPVVQzIGFzIFNQSSBTbGF2ZS1TZWxlY3QgT3V0cHV0CSovCisjZGVmaW5lIEZMUzQJCTB4MDAxMAkJLyogRW5hYmxlcyBTUElfRkxPVVQ0IGFzIFNQSSBTbGF2ZS1TZWxlY3QgT3V0cHV0CSovCisjZGVmaW5lIEZMUzUJCTB4MDAyMAkJLyogRW5hYmxlcyBTUElfRkxPVVQ1IGFzIFNQSSBTbGF2ZS1TZWxlY3QgT3V0cHV0CSovCisjZGVmaW5lIEZMUzYJCTB4MDA0MAkJLyogRW5hYmxlcyBTUElfRkxPVVQ2IGFzIFNQSSBTbGF2ZS1TZWxlY3QgT3V0cHV0CSovCisjZGVmaW5lIEZMUzcJCTB4MDA4MAkJLyogRW5hYmxlcyBTUElfRkxPVVQ3IGFzIFNQSSBTbGF2ZS1TZWxlY3QgT3V0cHV0CSovCisjZGVmaW5lIEZMRzEJCTB4RkRGRgkJLyogQWN0aXZhdGVzIFNQSV9GTE9VVDEgCQkJCQkJCSovCisjZGVmaW5lIEZMRzIJCTB4RkJGRgkJLyogQWN0aXZhdGVzIFNQSV9GTE9VVDIJCQkJCQkJCSovCisjZGVmaW5lIEZMRzMJCTB4RjdGRgkJLyogQWN0aXZhdGVzIFNQSV9GTE9VVDMJCQkJCQkJCSovCisjZGVmaW5lIEZMRzQJCTB4RUZGRgkJLyogQWN0aXZhdGVzIFNQSV9GTE9VVDQJCQkJCQkJCSovCisjZGVmaW5lIEZMRzUJCTB4REZGRgkJLyogQWN0aXZhdGVzIFNQSV9GTE9VVDUJCQkJCQkJCSovCisjZGVmaW5lIEZMRzYJCTB4QkZGRgkJLyogQWN0aXZhdGVzIFNQSV9GTE9VVDYJCQkJCQkJCSovCisjZGVmaW5lIEZMRzcJCTB4N0ZGRgkJLyogQWN0aXZhdGVzIFNQSV9GTE9VVDcJCQkJCQkJCSovCisKKy8qIFNQSV9TVEFUIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBTUElGCQkweDAwMDEJCS8qIFNQSSBGaW5pc2hlZCAoU2luZ2xlLVdvcmQgVHJhbnNmZXIgQ29tcGxldGUpCQkJCQkqLworI2RlZmluZSBNT0RGCQkweDAwMDIJCS8qIE1vZGUgRmF1bHQgRXJyb3IgKEFub3RoZXIgRGV2aWNlIFRyaWVkIFRvIEJlY29tZSBNYXN0ZXIpCQkqLworI2RlZmluZSBUWEUJCQkweDAwMDQJCS8qIFRyYW5zbWlzc2lvbiBFcnJvciAoRGF0YSBTZW50IFdpdGggTm8gTmV3IERhdGEgSW4gVERCUikJCSovCisjZGVmaW5lIFRYUwkJCTB4MDAwOAkJLyogU1BJX1REQlIgRGF0YSBCdWZmZXIgU3RhdHVzIChGdWxsL0VtcHR5KikJCQkJCSovCisjZGVmaW5lIFJCU1kJCTB4MDAxMAkJLyogUmVjZWl2ZSBFcnJvciAoRGF0YSBSZWNlaXZlZCBXaXRoIFJEQlIgRnVsbCkJCQkJCSovCisjZGVmaW5lIFJYUwkJCTB4MDAyMAkJLyogU1BJX1JEQlIgRGF0YSBCdWZmZXIgU3RhdHVzIChGdWxsL0VtcHR5KikJCQkJCSovCisjZGVmaW5lIFRYQ09MCQkweDAwNDAJCS8qIFRyYW5zbWl0IENvbGxpc2lvbiBFcnJvciAoQ29ycnVwdCBEYXRhIE1heSBIYXZlIEJlZW4gU2VudCkJKi8KKworCisvKiAgKioqKioqKioqKioqKioqKiAgR0VORVJBTCBQVVJQT1NFIFRJTUVSIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqLworLyogVElNRVJfRU5BQkxFIE1hc2tzCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFRJTUVOMAkJCTB4MDAwMQkJLyogRW5hYmxlIFRpbWVyIDAJCQkJCSovCisjZGVmaW5lIFRJTUVOMQkJCTB4MDAwMgkJLyogRW5hYmxlIFRpbWVyIDEJCQkJCSovCisjZGVmaW5lIFRJTUVOMgkJCTB4MDAwNAkJLyogRW5hYmxlIFRpbWVyIDIJCQkJCSovCisjZGVmaW5lIFRJTUVOMwkJCTB4MDAwOAkJLyogRW5hYmxlIFRpbWVyIDMJCQkJCSovCisjZGVmaW5lIFRJTUVONAkJCTB4MDAxMAkJLyogRW5hYmxlIFRpbWVyIDQJCQkJCSovCisjZGVmaW5lIFRJTUVONQkJCTB4MDAyMAkJLyogRW5hYmxlIFRpbWVyIDUJCQkJCSovCisjZGVmaW5lIFRJTUVONgkJCTB4MDA0MAkJLyogRW5hYmxlIFRpbWVyIDYJCQkJCSovCisjZGVmaW5lIFRJTUVONwkJCTB4MDA4MAkJLyogRW5hYmxlIFRpbWVyIDcJCQkJCSovCisKKy8qIFRJTUVSX0RJU0FCTEUgTWFza3MJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgVElNRElTMAkJCVRJTUVOMAkJLyogRGlzYWJsZSBUaW1lciAwCQkJCQkqLworI2RlZmluZSBUSU1ESVMxCQkJVElNRU4xCQkvKiBEaXNhYmxlIFRpbWVyIDEJCQkJCSovCisjZGVmaW5lIFRJTURJUzIJCQlUSU1FTjIJCS8qIERpc2FibGUgVGltZXIgMgkJCQkJKi8KKyNkZWZpbmUgVElNRElTMwkJCVRJTUVOMwkJLyogRGlzYWJsZSBUaW1lciAzCQkJCQkqLworI2RlZmluZSBUSU1ESVM0CQkJVElNRU40CQkvKiBEaXNhYmxlIFRpbWVyIDQJCQkJCSovCisjZGVmaW5lIFRJTURJUzUJCQlUSU1FTjUJCS8qIERpc2FibGUgVGltZXIgNQkJCQkJKi8KKyNkZWZpbmUgVElNRElTNgkJCVRJTUVONgkJLyogRGlzYWJsZSBUaW1lciA2CQkJCQkqLworI2RlZmluZSBUSU1ESVM3CQkJVElNRU43CQkvKiBEaXNhYmxlIFRpbWVyIDcJCQkJCSovCisKKy8qIFRJTUVSX1NUQVRVUyBNYXNrcwkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBUSU1JTDAJCQkweDAwMDAwMDAxCS8qIFRpbWVyIDAgSW50ZXJydXB0CQkJCSovCisjZGVmaW5lIFRJTUlMMQkJCTB4MDAwMDAwMDIJLyogVGltZXIgMSBJbnRlcnJ1cHQJCQkJKi8KKyNkZWZpbmUgVElNSUwyCQkJMHgwMDAwMDAwNAkvKiBUaW1lciAyIEludGVycnVwdAkJCQkqLworI2RlZmluZSBUSU1JTDMJCQkweDAwMDAwMDA4CS8qIFRpbWVyIDMgSW50ZXJydXB0CQkJCSovCisjZGVmaW5lIFRPVkZfRVJSMAkJMHgwMDAwMDAxMAkvKiBUaW1lciAwIENvdW50ZXIgT3ZlcmZsb3cJCQkqLworI2RlZmluZSBUT1ZGX0VSUjEJCTB4MDAwMDAwMjAJLyogVGltZXIgMSBDb3VudGVyIE92ZXJmbG93CQkJKi8KKyNkZWZpbmUgVE9WRl9FUlIyCQkweDAwMDAwMDQwCS8qIFRpbWVyIDIgQ291bnRlciBPdmVyZmxvdwkJCSovCisjZGVmaW5lIFRPVkZfRVJSMwkJMHgwMDAwMDA4MAkvKiBUaW1lciAzIENvdW50ZXIgT3ZlcmZsb3cJCQkqLworI2RlZmluZSBUUlVOMAkJCTB4MDAwMDEwMDAJLyogVGltZXIgMCBTbGF2ZSBFbmFibGUgU3RhdHVzCQkqLworI2RlZmluZSBUUlVOMQkJCTB4MDAwMDIwMDAJLyogVGltZXIgMSBTbGF2ZSBFbmFibGUgU3RhdHVzCQkqLworI2RlZmluZSBUUlVOMgkJCTB4MDAwMDQwMDAJLyogVGltZXIgMiBTbGF2ZSBFbmFibGUgU3RhdHVzCQkqLworI2RlZmluZSBUUlVOMwkJCTB4MDAwMDgwMDAJLyogVGltZXIgMyBTbGF2ZSBFbmFibGUgU3RhdHVzCQkqLworI2RlZmluZSBUSU1JTDQJCQkweDAwMDEwMDAwCS8qIFRpbWVyIDQgSW50ZXJydXB0CQkJCSovCisjZGVmaW5lIFRJTUlMNQkJCTB4MDAwMjAwMDAJLyogVGltZXIgNSBJbnRlcnJ1cHQJCQkJKi8KKyNkZWZpbmUgVElNSUw2CQkJMHgwMDA0MDAwMAkvKiBUaW1lciA2IEludGVycnVwdAkJCQkqLworI2RlZmluZSBUSU1JTDcJCQkweDAwMDgwMDAwCS8qIFRpbWVyIDcgSW50ZXJydXB0CQkJCSovCisjZGVmaW5lIFRPVkZfRVJSNAkJMHgwMDEwMDAwMAkvKiBUaW1lciA0IENvdW50ZXIgT3ZlcmZsb3cJCQkqLworI2RlZmluZSBUT1ZGX0VSUjUJCTB4MDAyMDAwMDAJLyogVGltZXIgNSBDb3VudGVyIE92ZXJmbG93CQkJKi8KKyNkZWZpbmUgVE9WRl9FUlI2CQkweDAwNDAwMDAwCS8qIFRpbWVyIDYgQ291bnRlciBPdmVyZmxvdwkJCSovCisjZGVmaW5lIFRPVkZfRVJSNwkJMHgwMDgwMDAwMAkvKiBUaW1lciA3IENvdW50ZXIgT3ZlcmZsb3cJCQkqLworI2RlZmluZSBUUlVONAkJCTB4MTAwMDAwMDAJLyogVGltZXIgNCBTbGF2ZSBFbmFibGUgU3RhdHVzCQkqLworI2RlZmluZSBUUlVONQkJCTB4MjAwMDAwMDAJLyogVGltZXIgNSBTbGF2ZSBFbmFibGUgU3RhdHVzCQkqLworI2RlZmluZSBUUlVONgkJCTB4NDAwMDAwMDAJLyogVGltZXIgNiBTbGF2ZSBFbmFibGUgU3RhdHVzCQkqLworI2RlZmluZSBUUlVONwkJCTB4ODAwMDAwMDAJLyogVGltZXIgNyBTbGF2ZSBFbmFibGUgU3RhdHVzCQkqLworCisvKiBBbHRlcm5hdGUgRGVwcmVjYXRlZCBNYWNyb3MgUHJvdmlkZWQgRm9yIEJhY2t3YXJkcyBDb2RlIENvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgVE9WTF9FUlIwIFRPVkZfRVJSMAorI2RlZmluZSBUT1ZMX0VSUjEgVE9WRl9FUlIxCisjZGVmaW5lIFRPVkxfRVJSMiBUT1ZGX0VSUjIKKyNkZWZpbmUgVE9WTF9FUlIzIFRPVkZfRVJSMworI2RlZmluZSBUT1ZMX0VSUjQgVE9WRl9FUlI0CisjZGVmaW5lIFRPVkxfRVJSNSBUT1ZGX0VSUjUKKyNkZWZpbmUgVE9WTF9FUlI2IFRPVkZfRVJSNgorI2RlZmluZSBUT1ZMX0VSUjcgVE9WRl9FUlI3CisKKy8qIFRJTUVSeF9DT05GSUcgTWFza3MJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgUFdNX09VVAkJCTB4MDAwMQkvKiBQdWxzZS1XaWR0aCBNb2R1bGF0aW9uIE91dHB1dCBNb2RlCSovCisjZGVmaW5lIFdEVEhfQ0FQCQkweDAwMDIJLyogV2lkdGggQ2FwdHVyZSBJbnB1dCBNb2RlCQkJCSovCisjZGVmaW5lIEVYVF9DTEsJCQkweDAwMDMJLyogRXh0ZXJuYWwgQ2xvY2sgTW9kZQkJCQkJKi8KKyNkZWZpbmUgUFVMU0VfSEkJCTB4MDAwNAkvKiBBY3Rpb24gUHVsc2UgKFBvc2l0aXZlL05lZ2F0aXZlKikJKi8KKyNkZWZpbmUgUEVSSU9EX0NOVAkJMHgwMDA4CS8qIFBlcmlvZCBDb3VudAkJCQkJCQkqLworI2RlZmluZSBJUlFfRU5BCQkJMHgwMDEwCS8qIEludGVycnVwdCBSZXF1ZXN0IEVuYWJsZQkJCQkqLworI2RlZmluZSBUSU5fU0VMCQkJMHgwMDIwCS8qIFRpbWVyIElucHV0IFNlbGVjdAkJCQkJKi8KKyNkZWZpbmUgT1VUX0RJUwkJCTB4MDA0MAkvKiBPdXRwdXQgUGFkIERpc2FibGUJCQkJCSovCisjZGVmaW5lIENMS19TRUwJCQkweDAwODAJLyogVGltZXIgQ2xvY2sgU2VsZWN0CQkJCQkqLworI2RlZmluZSBUT0dHTEVfSEkJCTB4MDEwMAkvKiBQV01fT1VUIFBVTFNFX0hJIFRvZ2dsZSBNb2RlCQkJKi8KKyNkZWZpbmUgRU1VX1JVTgkJCTB4MDIwMAkvKiBFbXVsYXRpb24gQmVoYXZpb3IgU2VsZWN0CQkJKi8KKyNkZWZpbmUgRVJSX1RZUAkJCTB4QzAwMAkvKiBFcnJvciBUeXBlCQkJCQkJCSovCisKKworLyogKioqKioqKioqKioqKioqKioqICAgR1BJTyBQT1JUUyBGLCBHLCBIIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBHZW5lcmFsIFB1cnBvc2UgSU8gKDB4RkZDMDA3MDAgLSAweEZGQzAwN0ZGKSAgTWFza3MgCQkJCSovCisvKiBQb3J0IEYgTWFza3MgCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBQRjAJCTB4MDAwMQorI2RlZmluZSBQRjEJCTB4MDAwMgorI2RlZmluZSBQRjIJCTB4MDAwNAorI2RlZmluZSBQRjMJCTB4MDAwOAorI2RlZmluZSBQRjQJCTB4MDAxMAorI2RlZmluZSBQRjUJCTB4MDAyMAorI2RlZmluZSBQRjYJCTB4MDA0MAorI2RlZmluZSBQRjcJCTB4MDA4MAorI2RlZmluZSBQRjgJCTB4MDEwMAorI2RlZmluZSBQRjkJCTB4MDIwMAorI2RlZmluZSBQRjEwCTB4MDQwMAorI2RlZmluZSBQRjExCTB4MDgwMAorI2RlZmluZSBQRjEyCTB4MTAwMAorI2RlZmluZSBQRjEzCTB4MjAwMAorI2RlZmluZSBQRjE0CTB4NDAwMAorI2RlZmluZSBQRjE1CTB4ODAwMAorCisvKiBQb3J0IEcgTWFza3MJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBQRzAJCTB4MDAwMQorI2RlZmluZSBQRzEJCTB4MDAwMgorI2RlZmluZSBQRzIJCTB4MDAwNAorI2RlZmluZSBQRzMJCTB4MDAwOAorI2RlZmluZSBQRzQJCTB4MDAxMAorI2RlZmluZSBQRzUJCTB4MDAyMAorI2RlZmluZSBQRzYJCTB4MDA0MAorI2RlZmluZSBQRzcJCTB4MDA4MAorI2RlZmluZSBQRzgJCTB4MDEwMAorI2RlZmluZSBQRzkJCTB4MDIwMAorI2RlZmluZSBQRzEwCTB4MDQwMAorI2RlZmluZSBQRzExCTB4MDgwMAorI2RlZmluZSBQRzEyCTB4MTAwMAorI2RlZmluZSBQRzEzCTB4MjAwMAorI2RlZmluZSBQRzE0CTB4NDAwMAorI2RlZmluZSBQRzE1CTB4ODAwMAorCisvKiBQb3J0IEggTWFza3MJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBQSDAJCTB4MDAwMQorI2RlZmluZSBQSDEJCTB4MDAwMgorI2RlZmluZSBQSDIJCTB4MDAwNAorI2RlZmluZSBQSDMJCTB4MDAwOAorI2RlZmluZSBQSDQJCTB4MDAxMAorI2RlZmluZSBQSDUJCTB4MDAyMAorI2RlZmluZSBQSDYJCTB4MDA0MAorI2RlZmluZSBQSDcJCTB4MDA4MAorCisKKy8qICoqKioqKioqKioqKioqKioqKiogIFNFUklBTCBQT1JUIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFNQT1JUeF9UQ1IxIE1hc2tzCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFNQRU4JCTB4MDAwMQkJLyogVHJhbnNtaXQgRW5hYmxlCQkJCQkJCQkqLworI2RlZmluZSBJVENMSwkJMHgwMDAyCQkvKiBJbnRlcm5hbCBUcmFuc21pdCBDbG9jayBTZWxlY3QJCQkJKi8KKyNkZWZpbmUgRFRZUEVfTk9STQkweDAwMDQJCS8qIERhdGEgRm9ybWF0IE5vcm1hbAkJCQkJCQkqLworI2RlZmluZSBEVFlQRV9VTEFXCTB4MDAwOAkJLyogQ29tcGFuZCBVc2luZyB1LUxhdwkJCQkJCQkqLworI2RlZmluZSBEVFlQRV9BTEFXCTB4MDAwQwkJLyogQ29tcGFuZCBVc2luZyBBLUxhdwkJCQkJCQkqLworI2RlZmluZSBUTFNCSVQJCTB4MDAxMAkJLyogVHJhbnNtaXQgQml0IE9yZGVyCQkJCQkJCSovCisjZGVmaW5lIElURlMJCTB4MDIwMAkJLyogSW50ZXJuYWwgVHJhbnNtaXQgRnJhbWUgU3luYyBTZWxlY3QJCQkqLworI2RlZmluZSBURlNSCQkweDA0MDAJCS8qIFRyYW5zbWl0IEZyYW1lIFN5bmMgUmVxdWlyZWQgU2VsZWN0CQkJKi8KKyNkZWZpbmUgRElURlMJCTB4MDgwMAkJLyogRGF0YS1JbmRlcGVuZGVudCBUcmFuc21pdCBGcmFtZSBTeW5jIFNlbGVjdAkqLworI2RlZmluZSBMVEZTCQkweDEwMDAJCS8qIExvdyBUcmFuc21pdCBGcmFtZSBTeW5jIFNlbGVjdAkJCQkqLworI2RlZmluZSBMQVRGUwkJMHgyMDAwCQkvKiBMYXRlIFRyYW5zbWl0IEZyYW1lIFN5bmMgU2VsZWN0CQkJCSovCisjZGVmaW5lIFRDS0ZFCQkweDQwMDAJCS8qIENsb2NrIEZhbGxpbmcgRWRnZSBTZWxlY3QJCQkJCSovCisKKy8qIFNQT1JUeF9UQ1IyIE1hc2tzIGFuZCBNYWNybwkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBTTEVOKHgpCQkoKHgpJjB4MUYpCS8qIFNQT1JUIFRYIFdvcmQgTGVuZ3RoICgyIC0gMzEpCQkJCSovCisjZGVmaW5lIFRYU0UJCTB4MDEwMAkJLyogVFggU2Vjb25kYXJ5IEVuYWJsZQkJCQkJCQkqLworI2RlZmluZSBUU0ZTRQkJMHgwMjAwCQkvKiBUcmFuc21pdCBTdGVyZW8gRnJhbWUgU3luYyBFbmFibGUJCQkqLworI2RlZmluZSBUUkZTVAkJMHgwNDAwCQkvKiBMZWZ0L1JpZ2h0IE9yZGVyICgxID0gUmlnaHQgQ2hhbm5lbCAxc3QpCQkqLworCisvKiBTUE9SVHhfUkNSMSBNYXNrcwkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFJTUEVOCQkweDAwMDEJCS8qIFJlY2VpdmUgRW5hYmxlIAkJCQkJCQkJKi8KKyNkZWZpbmUgSVJDTEsJCTB4MDAwMgkJLyogSW50ZXJuYWwgUmVjZWl2ZSBDbG9jayBTZWxlY3QgCQkJCSovCisjZGVmaW5lIERUWVBFX05PUk0JMHgwMDA0CQkvKiBEYXRhIEZvcm1hdCBOb3JtYWwJCQkJCQkJKi8KKyNkZWZpbmUgRFRZUEVfVUxBVwkweDAwMDgJCS8qIENvbXBhbmQgVXNpbmcgdS1MYXcJCQkJCQkJKi8KKyNkZWZpbmUgRFRZUEVfQUxBVwkweDAwMEMJCS8qIENvbXBhbmQgVXNpbmcgQS1MYXcJCQkJCQkJKi8KKyNkZWZpbmUgUkxTQklUCQkweDAwMTAJCS8qIFJlY2VpdmUgQml0IE9yZGVyCQkJCQkJCSovCisjZGVmaW5lIElSRlMJCTB4MDIwMAkJLyogSW50ZXJuYWwgUmVjZWl2ZSBGcmFtZSBTeW5jIFNlbGVjdCAJCQkqLworI2RlZmluZSBSRlNSCQkweDA0MDAJCS8qIFJlY2VpdmUgRnJhbWUgU3luYyBSZXF1aXJlZCBTZWxlY3QgCQkJKi8KKyNkZWZpbmUgTFJGUwkJMHgxMDAwCQkvKiBMb3cgUmVjZWl2ZSBGcmFtZSBTeW5jIFNlbGVjdCAJCQkJKi8KKyNkZWZpbmUgTEFSRlMJCTB4MjAwMAkJLyogTGF0ZSBSZWNlaXZlIEZyYW1lIFN5bmMgU2VsZWN0IAkJCQkqLworI2RlZmluZSBSQ0tGRQkJMHg0MDAwCQkvKiBDbG9jayBGYWxsaW5nIEVkZ2UgU2VsZWN0IAkJCQkJKi8KKworLyogU1BPUlR4X1JDUjIgTWFza3MJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBTTEVOKHgpCQkoKHgpJjB4MUYpCS8qIFNQT1JUIFJYIFdvcmQgTGVuZ3RoICgyIC0gMzEpCQkJCSovCisjZGVmaW5lIFJYU0UJCTB4MDEwMAkJLyogUlggU2Vjb25kYXJ5IEVuYWJsZQkJCQkJCQkqLworI2RlZmluZSBSU0ZTRQkJMHgwMjAwCQkvKiBSWCBTdGVyZW8gRnJhbWUgU3luYyBFbmFibGUJCQkJCSovCisjZGVmaW5lIFJSRlNUCQkweDA0MDAJCS8qIFJpZ2h0LUZpcnN0IERhdGEgT3JkZXIgCQkJCQkJKi8KKworLyogU1BPUlR4X1NUQVQgTWFza3MJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBSWE5FCQkweDAwMDEJCS8qIFJlY2VpdmUgRklGTyBOb3QgRW1wdHkgU3RhdHVzCQkJCSovCisjZGVmaW5lIFJVVkYJCTB4MDAwMgkJLyogU3RpY2t5IFJlY2VpdmUgVW5kZXJmbG93IFN0YXR1cwkJCQkqLworI2RlZmluZSBST1ZGCQkweDAwMDQJCS8qIFN0aWNreSBSZWNlaXZlIE92ZXJmbG93IFN0YXR1cwkJCQkqLworI2RlZmluZSBUWEYJCQkweDAwMDgJCS8qIFRyYW5zbWl0IEZJRk8gRnVsbCBTdGF0dXMJCQkJCSovCisjZGVmaW5lIFRVVkYJCTB4MDAxMAkJLyogU3RpY2t5IFRyYW5zbWl0IFVuZGVyZmxvdyBTdGF0dXMJCQkJKi8KKyNkZWZpbmUgVE9WRgkJMHgwMDIwCQkvKiBTdGlja3kgVHJhbnNtaXQgT3ZlcmZsb3cgU3RhdHVzCQkJCSovCisjZGVmaW5lIFRYSFJFCQkweDAwNDAJCS8qIFRyYW5zbWl0IEhvbGQgUmVnaXN0ZXIgRW1wdHkJCQkJCSovCisKKy8qIFNQT1JUeF9NQ01DMSBNYWNyb3MJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBTUF9XT0ZGKHgpCSgoeCkgJiAweDNGRikgCS8qIE11bHRpY2hhbm5lbCBXaW5kb3cgT2Zmc2V0IEZpZWxkCQkJKi8KKworLyogT25seSB1c2UgV1NJWkUgTWFjcm8gV2l0aCBMb2dpYyBPUiBXaGlsZSBTZXR0aW5nIExvd2VyIE9yZGVyIEJpdHMJCQkJCQkqLworI2RlZmluZSBTUF9XU0laRSh4KQkoKCgoKHgpPj4weDMpLTEpJjB4RikgPDwgMHhDKQkvKiBNdWx0aWNoYW5uZWwgV2luZG93IFNpemUgPSAoeC84KS0xCSovCisKKy8qIFNQT1JUeF9NQ01DMiBNYXNrcwkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFJFQ19CWVBBU1MJMHgwMDAwCQkvKiBCeXBhc3MgTW9kZSAoTm8gQ2xvY2sgUmVjb3ZlcnkpCQkJCSovCisjZGVmaW5lIFJFQ18yRlJPTTQJMHgwMDAyCQkvKiBSZWNvdmVyIDIgTUh6IENsb2NrIGZyb20gNCBNSHogQ2xvY2sJCQkqLworI2RlZmluZSBSRUNfOEZST00xNgkweDAwMDMJCS8qIFJlY292ZXIgOCBNSHogQ2xvY2sgZnJvbSAxNiBNSHogQ2xvY2sJCSovCisjZGVmaW5lIE1DRFRYUEUJCTB4MDAwNCAJCS8qIE11bHRpY2hhbm5lbCBETUEgVHJhbnNtaXQgUGFja2luZwkJCSovCisjZGVmaW5lIE1DRFJYUEUJCTB4MDAwOCAJCS8qIE11bHRpY2hhbm5lbCBETUEgUmVjZWl2ZSBQYWNraW5nCQkJCSovCisjZGVmaW5lIE1DTUVOCQkweDAwMTAgCQkvKiBNdWx0aWNoYW5uZWwgRnJhbWUgTW9kZSBFbmFibGUJCQkJKi8KKyNkZWZpbmUgRlNEUgkJMHgwMDgwIAkJLyogTXVsdGljaGFubmVsIEZyYW1lIFN5bmMgdG8gRGF0YSBSZWxhdGlvbnNoaXAJKi8KKyNkZWZpbmUgTUZEXzAJCTB4MDAwMAkJLyogTXVsdGljaGFubmVsIEZyYW1lIERlbGF5ID0gMAkJCQkJKi8KKyNkZWZpbmUgTUZEXzEJCTB4MTAwMAkJLyogTXVsdGljaGFubmVsIEZyYW1lIERlbGF5ID0gMQkJCQkJKi8KKyNkZWZpbmUgTUZEXzIJCTB4MjAwMAkJLyogTXVsdGljaGFubmVsIEZyYW1lIERlbGF5ID0gMgkJCQkJKi8KKyNkZWZpbmUgTUZEXzMJCTB4MzAwMAkJLyogTXVsdGljaGFubmVsIEZyYW1lIERlbGF5ID0gMwkJCQkJKi8KKyNkZWZpbmUgTUZEXzQJCTB4NDAwMAkJLyogTXVsdGljaGFubmVsIEZyYW1lIERlbGF5ID0gNAkJCQkJKi8KKyNkZWZpbmUgTUZEXzUJCTB4NTAwMAkJLyogTXVsdGljaGFubmVsIEZyYW1lIERlbGF5ID0gNQkJCQkJKi8KKyNkZWZpbmUgTUZEXzYJCTB4NjAwMAkJLyogTXVsdGljaGFubmVsIEZyYW1lIERlbGF5ID0gNgkJCQkJKi8KKyNkZWZpbmUgTUZEXzcJCTB4NzAwMAkJLyogTXVsdGljaGFubmVsIEZyYW1lIERlbGF5ID0gNwkJCQkJKi8KKyNkZWZpbmUgTUZEXzgJCTB4ODAwMAkJLyogTXVsdGljaGFubmVsIEZyYW1lIERlbGF5ID0gOAkJCQkJKi8KKyNkZWZpbmUgTUZEXzkJCTB4OTAwMAkJLyogTXVsdGljaGFubmVsIEZyYW1lIERlbGF5ID0gOQkJCQkJKi8KKyNkZWZpbmUgTUZEXzEwCQkweEEwMDAJCS8qIE11bHRpY2hhbm5lbCBGcmFtZSBEZWxheSA9IDEwCQkJCSovCisjZGVmaW5lIE1GRF8xMQkJMHhCMDAwCQkvKiBNdWx0aWNoYW5uZWwgRnJhbWUgRGVsYXkgPSAxMQkJCQkqLworI2RlZmluZSBNRkRfMTIJCTB4QzAwMAkJLyogTXVsdGljaGFubmVsIEZyYW1lIERlbGF5ID0gMTIJCQkJKi8KKyNkZWZpbmUgTUZEXzEzCQkweEQwMDAJCS8qIE11bHRpY2hhbm5lbCBGcmFtZSBEZWxheSA9IDEzCQkJCSovCisjZGVmaW5lIE1GRF8xNAkJMHhFMDAwCQkvKiBNdWx0aWNoYW5uZWwgRnJhbWUgRGVsYXkgPSAxNAkJCQkqLworI2RlZmluZSBNRkRfMTUJCTB4RjAwMAkJLyogTXVsdGljaGFubmVsIEZyYW1lIERlbGF5ID0gMTUJCQkJKi8KKworCisvKiAqKioqKioqKioqKioqKioqKioqKiogIEFTWU5DSFJPTk9VUyBNRU1PUlkgQ09OVFJPTExFUiBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEVCSVVfQU1HQ1RMIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBBTUNLRU4JCQkweDAwMDEJCS8qIEVuYWJsZSBDTEtPVVQJCQkJCQkJCQkqLworI2RlZmluZQlBTUJFTl9OT05FCQkweDAwMDAJCS8qIEFsbCBCYW5rcyBEaXNhYmxlZAkJCQkJCQkJKi8KKyNkZWZpbmUgQU1CRU5fQjAJCTB4MDAwMgkJLyogRW5hYmxlIEFzeW5jIE1lbW9yeSBCYW5rIDAgb25seQkJCQkJKi8KKyNkZWZpbmUgQU1CRU5fQjBfQjEJCTB4MDAwNAkJLyogRW5hYmxlIEFzeW5jIE1lbW9yeSBCYW5rcyAwICYgMSBvbmx5CQkJCSovCisjZGVmaW5lIEFNQkVOX0IwX0IxX0IyCTB4MDAwNgkJLyogRW5hYmxlIEFzeW5jIE1lbW9yeSBCYW5rcyAwLCAxLCBhbmQgMgkJCSovCisjZGVmaW5lIEFNQkVOX0FMTAkJMHgwMDA4CQkvKiBFbmFibGUgQXN5bmMgTWVtb3J5IEJhbmtzIChhbGwpIDAsIDEsIDIsIGFuZCAzCSovCisKKy8qIEVCSVVfQU1CQ1RMMCBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgQjBSRFlFTgkJCTB4MDAwMDAwMDEgIC8qIEJhbmsgMCAoQjApIFJEWSBFbmFibGUJCQkJCQkJKi8KKyNkZWZpbmUgQjBSRFlQT0wJCTB4MDAwMDAwMDIgIC8qIEIwIFJEWSBBY3RpdmUgSGlnaAkJCQkJCQkJKi8KKyNkZWZpbmUgQjBUVF8xCQkJMHgwMDAwMDAwNCAgLyogQjAgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDEgY3ljbGUJCSovCisjZGVmaW5lIEIwVFRfMgkJCTB4MDAwMDAwMDggIC8qIEIwIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAyIGN5Y2xlcwkqLworI2RlZmluZSBCMFRUXzMJCQkweDAwMDAwMDBDICAvKiBCMCBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMyBjeWNsZXMJKi8KKyNkZWZpbmUgQjBUVF80CQkJMHgwMDAwMDAwMCAgLyogQjAgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDQgY3ljbGVzCSovCisjZGVmaW5lIEIwU1RfMQkJCTB4MDAwMDAwMTAgIC8qIEIwIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDEgY3ljbGUJCSovCisjZGVmaW5lIEIwU1RfMgkJCTB4MDAwMDAwMjAgIC8qIEIwIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDIgY3ljbGVzCQkqLworI2RlZmluZSBCMFNUXzMJCQkweDAwMDAwMDMwICAvKiBCMCBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAzIGN5Y2xlcwkJKi8KKyNkZWZpbmUgQjBTVF80CQkJMHgwMDAwMDAwMCAgLyogQjAgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gNCBjeWNsZXMJCSovCisjZGVmaW5lIEIwSFRfMQkJCTB4MDAwMDAwNDAgIC8qIEIwIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAxIGN5Y2xlCQkqLworI2RlZmluZSBCMEhUXzIJCQkweDAwMDAwMDgwICAvKiBCMCBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMiBjeWNsZXMJKi8KKyNkZWZpbmUgQjBIVF8zCQkJMHgwMDAwMDBDMCAgLyogQjAgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDMgY3ljbGVzCSovCisjZGVmaW5lIEIwSFRfMAkJCTB4MDAwMDAwMDAgIC8qIEIwIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAwIGN5Y2xlcwkqLworI2RlZmluZSBCMFJBVF8xCQkJMHgwMDAwMDEwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDEgY3ljbGUJCQkJCSovCisjZGVmaW5lIEIwUkFUXzIJCQkweDAwMDAwMjAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwUkFUXzMJCQkweDAwMDAwMzAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwUkFUXzQJCQkweDAwMDAwNDAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwUkFUXzUJCQkweDAwMDAwNTAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwUkFUXzYJCQkweDAwMDAwNjAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwUkFUXzcJCQkweDAwMDAwNzAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwUkFUXzgJCQkweDAwMDAwODAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwUkFUXzkJCQkweDAwMDAwOTAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwUkFUXzEwCQkweDAwMDAwQTAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFJBVF8xMQkJMHgwMDAwMEIwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBSQVRfMTIJCTB4MDAwMDBDMDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwUkFUXzEzCQkweDAwMDAwRDAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFJBVF8xNAkJMHgwMDAwMEUwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBSQVRfMTUJCTB4MDAwMDBGMDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwV0FUXzEJCQkweDAwMDAxMDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDEgY3ljbGUJCQkJCSovCisjZGVmaW5lIEIwV0FUXzIJCQkweDAwMDAyMDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDIgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFdBVF8zCQkJMHgwMDAwMzAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBXQVRfNAkJCTB4MDAwMDQwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwV0FUXzUJCQkweDAwMDA1MDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDUgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFdBVF82CQkJMHgwMDAwNjAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBXQVRfNwkJCTB4MDAwMDcwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwV0FUXzgJCQkweDAwMDA4MDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDggY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFdBVF85CQkJMHgwMDAwOTAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBXQVRfMTAJCTB4MDAwMEEwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFdBVF8xMQkJMHgwMDAwQjAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwV0FUXzEyCQkweDAwMDBDMDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBXQVRfMTMJCTB4MDAwMEQwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFdBVF8xNAkJMHgwMDAwRTAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSAxNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwV0FUXzE1CQkweDAwMDBGMDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcwkJCQkJKi8KKworI2RlZmluZSBCMVJEWUVOCQkJMHgwMDAxMDAwMCAgLyogQmFuayAxIChCMSkgUkRZIEVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgCSovCisjZGVmaW5lIEIxUkRZUE9MCQkweDAwMDIwMDAwICAvKiBCMSBSRFkgQWN0aXZlIEhpZ2ggICAgICAgICAgICAgICAgICAgICAgICAgICAJKi8KKyNkZWZpbmUgQjFUVF8xCQkJMHgwMDA0MDAwMCAgLyogQjEgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDEgY3ljbGUgCSovCisjZGVmaW5lIEIxVFRfMgkJCTB4MDAwODAwMDAgIC8qIEIxIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAyIGN5Y2xlcwkqLworI2RlZmluZSBCMVRUXzMJCQkweDAwMEMwMDAwICAvKiBCMSBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMyBjeWNsZXMJKi8KKyNkZWZpbmUgQjFUVF80CQkJMHgwMDAwMDAwMCAgLyogQjEgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDQgY3ljbGVzCSovCisjZGVmaW5lIEIxU1RfMQkJCTB4MDAxMDAwMDAgIC8qIEIxIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDEgY3ljbGUgIAkqLworI2RlZmluZSBCMVNUXzIJCQkweDAwMjAwMDAwICAvKiBCMSBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAyIGN5Y2xlcyAJKi8KKyNkZWZpbmUgQjFTVF8zCQkJMHgwMDMwMDAwMCAgLyogQjEgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMyBjeWNsZXMgCSovCisjZGVmaW5lIEIxU1RfNAkJCTB4MDAwMDAwMDAgIC8qIEIxIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDQgY3ljbGVzIAkqLworI2RlZmluZSBCMUhUXzEJCQkweDAwNDAwMDAwICAvKiBCMSBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMSBjeWNsZSAJKi8KKyNkZWZpbmUgQjFIVF8yCQkJMHgwMDgwMDAwMCAgLyogQjEgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDIgY3ljbGVzCSovCisjZGVmaW5lIEIxSFRfMwkJCTB4MDBDMDAwMDAgIC8qIEIxIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAzIGN5Y2xlcwkqLworI2RlZmluZSBCMUhUXzAJCQkweDAwMDAwMDAwICAvKiBCMSBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMCBjeWNsZXMJKi8KKyNkZWZpbmUgQjFSQVRfMQkJCTB4MDEwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlCQkJCQkqLworI2RlZmluZSBCMVJBVF8yCQkJMHgwMjAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDIgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVJBVF8zCQkJMHgwMzAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDMgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVJBVF80CQkJMHgwNDAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDQgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVJBVF81CQkJMHgwNTAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDUgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVJBVF82CQkJMHgwNjAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDYgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVJBVF83CQkJMHgwNzAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDcgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVJBVF84CQkJMHgwODAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDggY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVJBVF85CQkJMHgwOTAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDkgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVJBVF8xMAkJMHgwQTAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDEwIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFSQVRfMTEJCTB4MEIwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSAxMSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxUkFUXzEyCQkweDBDMDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gMTIgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVJBVF8xMwkJMHgwRDAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDEzIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFSQVRfMTQJCTB4MEUwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSAxNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxUkFUXzE1CQkweDBGMDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gMTUgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVdBVF8xCQkJMHgxMDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlCQkJCQkqLworI2RlZmluZSBCMVdBVF8yCQkJMHgyMDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSAyIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFXQVRfMwkJCTB4MzAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxV0FUXzQJCQkweDQwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDQgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVdBVF81CQkJMHg1MDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSA1IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFXQVRfNgkJCTB4NjAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxV0FUXzcJCQkweDcwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDcgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVdBVF84CQkJMHg4MDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSA4IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFXQVRfOQkJCTB4OTAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxV0FUXzEwCQkweEEwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDEwIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFXQVRfMTEJCTB4QjAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gMTEgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVdBVF8xMgkJMHhDMDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxV0FUXzEzCQkweEQwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDEzIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFXQVRfMTQJCTB4RTAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gMTQgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVdBVF8xNQkJMHhGMDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMJCQkJCSovCisKKy8qIEVCSVVfQU1CQ1RMMSBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgQjJSRFlFTgkJCTB4MDAwMDAwMDEgIC8qIEJhbmsgMiAoQjIpIFJEWSBFbmFibGUJCQkJCQkJKi8KKyNkZWZpbmUgQjJSRFlQT0wJCTB4MDAwMDAwMDIgIC8qIEIyIFJEWSBBY3RpdmUgSGlnaAkJCQkJCQkJKi8KKyNkZWZpbmUgQjJUVF8xCQkJMHgwMDAwMDAwNCAgLyogQjIgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDEgY3ljbGUJCSovCisjZGVmaW5lIEIyVFRfMgkJCTB4MDAwMDAwMDggIC8qIEIyIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAyIGN5Y2xlcwkqLworI2RlZmluZSBCMlRUXzMJCQkweDAwMDAwMDBDICAvKiBCMiBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMyBjeWNsZXMJKi8KKyNkZWZpbmUgQjJUVF80CQkJMHgwMDAwMDAwMCAgLyogQjIgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDQgY3ljbGVzCSovCisjZGVmaW5lIEIyU1RfMQkJCTB4MDAwMDAwMTAgIC8qIEIyIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDEgY3ljbGUJCSovCisjZGVmaW5lIEIyU1RfMgkJCTB4MDAwMDAwMjAgIC8qIEIyIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDIgY3ljbGVzCQkqLworI2RlZmluZSBCMlNUXzMJCQkweDAwMDAwMDMwICAvKiBCMiBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAzIGN5Y2xlcwkJKi8KKyNkZWZpbmUgQjJTVF80CQkJMHgwMDAwMDAwMCAgLyogQjIgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gNCBjeWNsZXMJCSovCisjZGVmaW5lIEIySFRfMQkJCTB4MDAwMDAwNDAgIC8qIEIyIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAxIGN5Y2xlCQkqLworI2RlZmluZSBCMkhUXzIJCQkweDAwMDAwMDgwICAvKiBCMiBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMiBjeWNsZXMJKi8KKyNkZWZpbmUgQjJIVF8zCQkJMHgwMDAwMDBDMCAgLyogQjIgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDMgY3ljbGVzCSovCisjZGVmaW5lIEIySFRfMAkJCTB4MDAwMDAwMDAgIC8qIEIyIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAwIGN5Y2xlcwkqLworI2RlZmluZSBCMlJBVF8xCQkJMHgwMDAwMDEwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDEgY3ljbGUJCQkJCSovCisjZGVmaW5lIEIyUkFUXzIJCQkweDAwMDAwMjAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyUkFUXzMJCQkweDAwMDAwMzAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyUkFUXzQJCQkweDAwMDAwNDAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyUkFUXzUJCQkweDAwMDAwNTAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyUkFUXzYJCQkweDAwMDAwNjAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyUkFUXzcJCQkweDAwMDAwNzAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyUkFUXzgJCQkweDAwMDAwODAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyUkFUXzkJCQkweDAwMDAwOTAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyUkFUXzEwCQkweDAwMDAwQTAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMlJBVF8xMQkJMHgwMDAwMEIwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJSQVRfMTIJCTB4MDAwMDBDMDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyUkFUXzEzCQkweDAwMDAwRDAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMlJBVF8xNAkJMHgwMDAwMEUwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJSQVRfMTUJCTB4MDAwMDBGMDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyV0FUXzEJCQkweDAwMDAxMDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDEgY3ljbGUJCQkJCSovCisjZGVmaW5lIEIyV0FUXzIJCQkweDAwMDAyMDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDIgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMldBVF8zCQkJMHgwMDAwMzAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJXQVRfNAkJCTB4MDAwMDQwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyV0FUXzUJCQkweDAwMDA1MDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDUgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMldBVF82CQkJMHgwMDAwNjAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJXQVRfNwkJCTB4MDAwMDcwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyV0FUXzgJCQkweDAwMDA4MDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDggY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMldBVF85CQkJMHgwMDAwOTAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJXQVRfMTAJCTB4MDAwMEEwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMldBVF8xMQkJMHgwMDAwQjAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyV0FUXzEyCQkweDAwMDBDMDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJXQVRfMTMJCTB4MDAwMEQwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMldBVF8xNAkJMHgwMDAwRTAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSAxNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyV0FUXzE1CQkweDAwMDBGMDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcwkJCQkJKi8KKworI2RlZmluZSBCM1JEWUVOCQkJMHgwMDAxMDAwMCAgLyogQmFuayAzIChCMykgUkRZIEVuYWJsZQkJCQkJCQkqLworI2RlZmluZSBCM1JEWVBPTAkJMHgwMDAyMDAwMCAgLyogQjMgUkRZIEFjdGl2ZSBIaWdoCQkJCQkJCQkqLworI2RlZmluZSBCM1RUXzEJCQkweDAwMDQwMDAwICAvKiBCMyBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMSBjeWNsZQkJKi8KKyNkZWZpbmUgQjNUVF8yCQkJMHgwMDA4MDAwMCAgLyogQjMgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDIgY3ljbGVzCSovCisjZGVmaW5lIEIzVFRfMwkJCTB4MDAwQzAwMDAgIC8qIEIzIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAzIGN5Y2xlcwkqLworI2RlZmluZSBCM1RUXzQJCQkweDAwMDAwMDAwICAvKiBCMyBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gNCBjeWNsZXMJKi8KKyNkZWZpbmUgQjNTVF8xCQkJMHgwMDEwMDAwMCAgLyogQjMgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMSBjeWNsZQkJKi8KKyNkZWZpbmUgQjNTVF8yCQkJMHgwMDIwMDAwMCAgLyogQjMgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMiBjeWNsZXMJCSovCisjZGVmaW5lIEIzU1RfMwkJCTB4MDAzMDAwMDAgIC8qIEIzIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDMgY3ljbGVzCQkqLworI2RlZmluZSBCM1NUXzQJCQkweDAwMDAwMDAwICAvKiBCMyBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSA0IGN5Y2xlcwkJKi8KKyNkZWZpbmUgQjNIVF8xCQkJMHgwMDQwMDAwMCAgLyogQjMgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDEgY3ljbGUJCSovCisjZGVmaW5lIEIzSFRfMgkJCTB4MDA4MDAwMDAgIC8qIEIzIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAyIGN5Y2xlcwkqLworI2RlZmluZSBCM0hUXzMJCQkweDAwQzAwMDAwICAvKiBCMyBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMyBjeWNsZXMJKi8KKyNkZWZpbmUgQjNIVF8wCQkJMHgwMDAwMDAwMCAgLyogQjMgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDAgY3ljbGVzCSovCisjZGVmaW5lIEIzUkFUXzEJCQkweDAxMDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gMSBjeWNsZQkJCQkJKi8KKyNkZWZpbmUgQjNSQVRfMgkJCTB4MDIwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSAyIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNSQVRfMwkJCTB4MDMwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNSQVRfNAkJCTB4MDQwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNSQVRfNQkJCTB4MDUwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSA1IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNSQVRfNgkJCTB4MDYwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNSQVRfNwkJCTB4MDcwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNSQVRfOAkJCTB4MDgwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSA4IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNSQVRfOQkJCTB4MDkwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNSQVRfMTAJCTB4MEEwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzUkFUXzExCQkweDBCMDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gMTEgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1JBVF8xMgkJMHgwQzAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNSQVRfMTMJCTB4MEQwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzUkFUXzE0CQkweDBFMDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gMTQgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1JBVF8xNQkJMHgwRjAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNXQVRfMQkJCTB4MTAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gMSBjeWNsZQkJCQkJKi8KKyNkZWZpbmUgQjNXQVRfMgkJCTB4MjAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzV0FUXzMJCQkweDMwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDMgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1dBVF80CQkJMHg0MDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNXQVRfNQkJCTB4NTAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzV0FUXzYJCQkweDYwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDYgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1dBVF83CQkJMHg3MDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNXQVRfOAkJCTB4ODAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzV0FUXzkJCQkweDkwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDkgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1dBVF8xMAkJMHhBMDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzV0FUXzExCQkweEIwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNXQVRfMTIJCTB4QzAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gMTIgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1dBVF8xMwkJMHhEMDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzV0FUXzE0CQkweEUwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNXQVRfMTUJCTB4RjAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gMTUgY3ljbGVzCQkJCQkqLworCisKKy8qICoqKioqKioqKioqKioqKioqKioqKiogIFNEUkFNIENPTlRST0xMRVIgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBFQklVX1NER0NUTCBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBTQ1RMRQkJCTB4MDAwMDAwMDEJLyogRW5hYmxlIFNEUkFNIFNpZ25hbHMJCQkJCQkJCQkJKi8KKyNkZWZpbmUgQ0xfMgkJCTB4MDAwMDAwMDgJLyogU0RSQU0gQ0FTIExhdGVuY3kgPSAyIGN5Y2xlcwkJCQkJCQkJKi8KKyNkZWZpbmUgQ0xfMwkJCTB4MDAwMDAwMEMJLyogU0RSQU0gQ0FTIExhdGVuY3kgPSAzIGN5Y2xlcwkJCQkJCQkJKi8KKyNkZWZpbmUgUEFTUl9BTEwJCTB4MDAwMDAwMDAJLyogQWxsIDQgU0RSQU0gQmFua3MgUmVmcmVzaGVkIEluIFNlbGYtUmVmcmVzaAkJCQkqLworI2RlZmluZSBQQVNSX0IwX0IxCQkweDAwMDAwMDEwCS8qIFNEUkFNIEJhbmtzIDAgYW5kIDEgQXJlIFJlZnJlc2hlZCBJbiBTZWxmLVJlZnJlc2gJCSovCisjZGVmaW5lIFBBU1JfQjAJCQkweDAwMDAwMDIwCS8qIE9ubHkgU0RSQU0gQmFuayAwIElzIFJlZnJlc2hlZCBJbiBTZWxmLVJlZnJlc2gJCQkqLworI2RlZmluZSBUUkFTXzEJCQkweDAwMDAwMDQwCS8qIFNEUkFNIHRSQVMgPSAxIGN5Y2xlCQkJCQkJCQkJCSovCisjZGVmaW5lIFRSQVNfMgkJCTB4MDAwMDAwODAJLyogU0RSQU0gdFJBUyA9IDIgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJBU18zCQkJMHgwMDAwMDBDMAkvKiBTRFJBTSB0UkFTID0gMyBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkFTXzQJCQkweDAwMDAwMTAwCS8qIFNEUkFNIHRSQVMgPSA0IGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQVNfNQkJCTB4MDAwMDAxNDAJLyogU0RSQU0gdFJBUyA9IDUgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJBU182CQkJMHgwMDAwMDE4MAkvKiBTRFJBTSB0UkFTID0gNiBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkFTXzcJCQkweDAwMDAwMUMwCS8qIFNEUkFNIHRSQVMgPSA3IGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQVNfOAkJCTB4MDAwMDAyMDAJLyogU0RSQU0gdFJBUyA9IDggY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJBU185CQkJMHgwMDAwMDI0MAkvKiBTRFJBTSB0UkFTID0gOSBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkFTXzEwCQkJMHgwMDAwMDI4MAkvKiBTRFJBTSB0UkFTID0gMTAgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJBU18xMQkJCTB4MDAwMDAyQzAJLyogU0RSQU0gdFJBUyA9IDExIGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQVNfMTIJCQkweDAwMDAwMzAwCS8qIFNEUkFNIHRSQVMgPSAxMiBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkFTXzEzCQkJMHgwMDAwMDM0MAkvKiBTRFJBTSB0UkFTID0gMTMgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJBU18xNAkJCTB4MDAwMDAzODAJLyogU0RSQU0gdFJBUyA9IDE0IGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQVNfMTUJCQkweDAwMDAwM0MwCS8qIFNEUkFNIHRSQVMgPSAxNSBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUlBfMQkJCTB4MDAwMDA4MDAJLyogU0RSQU0gdFJQID0gMSBjeWNsZQkJCQkJCQkJCQkqLworI2RlZmluZSBUUlBfMgkJCTB4MDAwMDEwMDAJLyogU0RSQU0gdFJQID0gMiBjeWNsZXMJCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJQXzMJCQkweDAwMDAxODAwCS8qIFNEUkFNIHRSUCA9IDMgY3ljbGVzCQkJCQkJCQkJCSovCisjZGVmaW5lIFRSUF80CQkJMHgwMDAwMjAwMAkvKiBTRFJBTSB0UlAgPSA0IGN5Y2xlcwkJCQkJCQkJCQkqLworI2RlZmluZSBUUlBfNQkJCTB4MDAwMDI4MDAJLyogU0RSQU0gdFJQID0gNSBjeWNsZXMJCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJQXzYJCQkweDAwMDAzMDAwCS8qIFNEUkFNIHRSUCA9IDYgY3ljbGVzCQkJCQkJCQkJCSovCisjZGVmaW5lIFRSUF83CQkJMHgwMDAwMzgwMAkvKiBTRFJBTSB0UlAgPSA3IGN5Y2xlcwkJCQkJCQkJCQkqLworI2RlZmluZSBUUkNEXzEJCQkweDAwMDA4MDAwCS8qIFNEUkFNIHRSQ0QgPSAxIGN5Y2xlCQkJCQkJCQkJCSovCisjZGVmaW5lIFRSQ0RfMgkJCTB4MDAwMTAwMDAJLyogU0RSQU0gdFJDRCA9IDIgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJDRF8zCQkJMHgwMDAxODAwMAkvKiBTRFJBTSB0UkNEID0gMyBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkNEXzQJCQkweDAwMDIwMDAwCS8qIFNEUkFNIHRSQ0QgPSA0IGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQ0RfNQkJCTB4MDAwMjgwMDAJLyogU0RSQU0gdFJDRCA9IDUgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJDRF82CQkJMHgwMDAzMDAwMAkvKiBTRFJBTSB0UkNEID0gNiBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkNEXzcJCQkweDAwMDM4MDAwCS8qIFNEUkFNIHRSQ0QgPSA3IGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRXUl8xCQkJMHgwMDA4MDAwMAkvKiBTRFJBTSB0V1IgPSAxIGN5Y2xlCQkJCQkJCQkJCSovCisjZGVmaW5lIFRXUl8yCQkJMHgwMDEwMDAwMAkvKiBTRFJBTSB0V1IgPSAyIGN5Y2xlcwkJCQkJCQkJCQkqLworI2RlZmluZSBUV1JfMwkJCTB4MDAxODAwMDAJLyogU0RSQU0gdFdSID0gMyBjeWNsZXMJCQkJCQkJCQkJKi8KKyNkZWZpbmUgUFVQU0QJCQkweDAwMjAwMDAwCS8qIFBvd2VyLVVwIFN0YXJ0IERlbGF5ICgxNSBTQ0xLIEN5Y2xlcyBEZWxheSkJCQkJKi8KKyNkZWZpbmUgUFNNCQkJCTB4MDA0MDAwMDAJLyogUG93ZXItVXAgU2VxdWVuY2UgKE1vZGUgUmVnaXN0ZXIgQmVmb3JlL0FmdGVyKiBSZWZyZXNoKQkqLworI2RlZmluZSBQU1MJCQkJMHgwMDgwMDAwMAkvKiBFbmFibGUgUG93ZXItVXAgU2VxdWVuY2Ugb24gTmV4dCBTRFJBTSBBY2Nlc3MJCQkqLworI2RlZmluZSBTUkZTCQkJMHgwMTAwMDAwMAkvKiBFbmFibGUgU0RSQU0gU2VsZi1SZWZyZXNoIE1vZGUJCQkJCQkJKi8KKyNkZWZpbmUgRUJVRkUJCQkweDAyMDAwMDAwCS8qIEVuYWJsZSBFeHRlcm5hbCBCdWZmZXJpbmcgVGltaW5nCQkJCQkJCSovCisjZGVmaW5lIEZCQlJXCQkJMHgwNDAwMDAwMAkvKiBFbmFibGUgRmFzdCBCYWNrLVRvLUJhY2sgUmVhZCBUbyBXcml0ZQkJCQkJKi8KKyNkZWZpbmUgRU1SRU4JCQkweDEwMDAwMDAwCS8qIEV4dGVuZGVkIE1vZGUgUmVnaXN0ZXIgRW5hYmxlCQkJCQkJCSovCisjZGVmaW5lIFRDU1IJCQkweDIwMDAwMDAwCS8qIFRlbXAtQ29tcGVuc2F0ZWQgU2VsZi1SZWZyZXNoIFZhbHVlICg4NS80NSogRGVnIEMpCQkqLworI2RlZmluZSBDRERCRwkJCTB4NDAwMDAwMDAJLyogVHJpc3RhdGUgU0RSQU0gQ29udHJvbHMgRHVyaW5nIEJ1cyBHcmFudAkJCQkJKi8KKworLyogRUJJVV9TREJDVEwgTWFza3MJCQkJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBFQkUJCQkJMHgwMDAxCQkvKiBFbmFibGUgU0RSQU0gRXh0ZXJuYWwgQmFuawkJCQkJCQkqLworI2RlZmluZSBFQlNaXzE2CQkJMHgwMDAwCQkvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIFNpemUgPSAxNk1CCSovCisjZGVmaW5lIEVCU1pfMzIJCQkweDAwMDIJCS8qIFNEUkFNIEV4dGVybmFsIEJhbmsgU2l6ZSA9IDMyTUIJKi8KKyNkZWZpbmUgRUJTWl82NAkJCTB4MDAwNAkJLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBTaXplID0gNjRNQgkqLworI2RlZmluZSBFQlNaXzEyOAkJMHgwMDA2CQkvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIFNpemUgPSAxMjhNQgkJKi8KKyNkZWZpbmUgRUJTWl8yNTYJCTB4MDAwOAkJLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBTaXplID0gMjU2TUIgCSovCisjZGVmaW5lIEVCU1pfNTEyCQkweDAwMEEJCS8qIFNEUkFNIEV4dGVybmFsIEJhbmsgU2l6ZSA9IDUxMk1CCQkqLworI2RlZmluZSBFQkNBV184CQkJMHgwMDAwCQkvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIENvbHVtbiBBZGRyZXNzIFdpZHRoID0gOCBCaXRzCSovCisjZGVmaW5lIEVCQ0FXXzkJCQkweDAwMTAJCS8qIFNEUkFNIEV4dGVybmFsIEJhbmsgQ29sdW1uIEFkZHJlc3MgV2lkdGggPSA5IEJpdHMJKi8KKyNkZWZpbmUgRUJDQVdfMTAJCTB4MDAyMAkJLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBDb2x1bW4gQWRkcmVzcyBXaWR0aCA9IDEwIEJpdHMJKi8KKyNkZWZpbmUgRUJDQVdfMTEJCTB4MDAzMAkJLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBDb2x1bW4gQWRkcmVzcyBXaWR0aCA9IDExIEJpdHMJKi8KKworLyogRUJJVV9TRFNUQVQgTWFza3MJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFNEQ0kJCQkweDAwMDEJCS8qIFNEUkFNIENvbnRyb2xsZXIgSWRsZSAJCQkJKi8KKyNkZWZpbmUgU0RTUkEJCQkweDAwMDIJCS8qIFNEUkFNIFNlbGYtUmVmcmVzaCBBY3RpdmUJCQkqLworI2RlZmluZSBTRFBVQQkJCTB4MDAwNAkJLyogU0RSQU0gUG93ZXItVXAgQWN0aXZlIAkJCQkqLworI2RlZmluZSBTRFJTCQkJMHgwMDA4CQkvKiBTRFJBTSBXaWxsIFBvd2VyLVVwIE9uIE5leHQgQWNjZXNzCSovCisjZGVmaW5lIFNERUFTRQkJCTB4MDAxMAkJLyogU0RSQU0gRUFCIFN0aWNreSBFcnJvciBTdGF0dXMJCSovCisjZGVmaW5lIEJHU1RBVAkJCTB4MDAyMAkJLyogQnVzIEdyYW50IFN0YXR1cwkJCQkJCSovCisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKiogIERNQSBDT05UUk9MTEVSIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERNQXhfQ09ORklHLCBNRE1BX3l5X0NPTkZJRyBNYXNrcwkJCQkJCQkJCQkJCSovCisjZGVmaW5lIERNQUVOCQkJMHgwMDAxCQkvKiBETUEgQ2hhbm5lbCBFbmFibGUJCQkJCQkJKi8KKyNkZWZpbmUgV05SCQkJCTB4MDAwMgkJLyogQ2hhbm5lbCBEaXJlY3Rpb24gKFcvUiopCQkJCQkJKi8KKyNkZWZpbmUgV0RTSVpFXzgJCTB4MDAwMAkJLyogVHJhbnNmZXIgV29yZCBTaXplID0gOAkJCQkJCSovCisjZGVmaW5lIFdEU0laRV8xNgkJMHgwMDA0CQkvKiBUcmFuc2ZlciBXb3JkIFNpemUgPSAxNgkJCQkJCSovCisjZGVmaW5lIFdEU0laRV8zMgkJMHgwMDA4CQkvKiBUcmFuc2ZlciBXb3JkIFNpemUgPSAzMgkJCQkJCSovCisjZGVmaW5lIERNQTJECQkJMHgwMDEwCQkvKiBETUEgTW9kZSAoMkQvMUQqKQkJCQkJCQkqLworI2RlZmluZSBSRVNUQVJUCQkJMHgwMDIwCQkvKiBETUEgQnVmZmVyIENsZWFyCQkJCQkJCQkqLworI2RlZmluZSBESV9TRUwJCQkweDAwNDAJCS8qIERhdGEgSW50ZXJydXB0IFRpbWluZyBTZWxlY3QJCQkJCSovCisjZGVmaW5lIERJX0VOCQkJMHgwMDgwCQkvKiBEYXRhIEludGVycnVwdCBFbmFibGUJCQkJCQkqLworI2RlZmluZSBORFNJWkVfMAkJMHgwMDAwCQkvKiBOZXh0IERlc2NyaXB0b3IgU2l6ZSA9IDAgKFN0b3AvQXV0b2J1ZmZlcikJKi8KKyNkZWZpbmUgTkRTSVpFXzEJCTB4MDEwMAkJLyogTmV4dCBEZXNjcmlwdG9yIFNpemUgPSAxCQkJCQkJKi8KKyNkZWZpbmUgTkRTSVpFXzIJCTB4MDIwMAkJLyogTmV4dCBEZXNjcmlwdG9yIFNpemUgPSAyCQkJCQkJKi8KKyNkZWZpbmUgTkRTSVpFXzMJCTB4MDMwMAkJLyogTmV4dCBEZXNjcmlwdG9yIFNpemUgPSAzCQkJCQkJKi8KKyNkZWZpbmUgTkRTSVpFXzQJCTB4MDQwMAkJLyogTmV4dCBEZXNjcmlwdG9yIFNpemUgPSA0CQkJCQkJKi8KKyNkZWZpbmUgTkRTSVpFXzUJCTB4MDUwMAkJLyogTmV4dCBEZXNjcmlwdG9yIFNpemUgPSA1CQkJCQkJKi8KKyNkZWZpbmUgTkRTSVpFXzYJCTB4MDYwMAkJLyogTmV4dCBEZXNjcmlwdG9yIFNpemUgPSA2CQkJCQkJKi8KKyNkZWZpbmUgTkRTSVpFXzcJCTB4MDcwMAkJLyogTmV4dCBEZXNjcmlwdG9yIFNpemUgPSA3CQkJCQkJKi8KKyNkZWZpbmUgTkRTSVpFXzgJCTB4MDgwMAkJLyogTmV4dCBEZXNjcmlwdG9yIFNpemUgPSA4CQkJCQkJKi8KKyNkZWZpbmUgTkRTSVpFXzkJCTB4MDkwMAkJLyogTmV4dCBEZXNjcmlwdG9yIFNpemUgPSA5CQkJCQkJKi8KKyNkZWZpbmUgTkRTSVpFCSAgICAgICAgCTB4MDkwMAkvKiBOZXh0IERlc2NyaXB0b3IgU2l6ZSAqLworI2RlZmluZSBETUFGTE9XCSAgICAgICAgCTB4NzAwMAkvKiBGbG93IENvbnRyb2wgKi8KKyNkZWZpbmUgRE1BRkxPV19TVE9QCQkweDAwMDAJCS8qIFN0b3AgTW9kZQkJCQkJCQkJCSovCisjZGVmaW5lIERNQUZMT1dfQVVUTwkJMHgxMDAwCQkvKiBBdXRvYnVmZmVyIE1vZGUJCQkJCQkJCSovCisjZGVmaW5lIERNQUZMT1dfQVJSQVkJCTB4NDAwMAkJLyogRGVzY3JpcHRvciBBcnJheSBNb2RlCQkJCQkJKi8KKyNkZWZpbmUgRE1BRkxPV19TTUFMTAkJMHg2MDAwCQkvKiBTbWFsbCBNb2RlbCBEZXNjcmlwdG9yIExpc3QgTW9kZQkJCQkqLworI2RlZmluZSBETUFGTE9XX0xBUkdFCQkweDcwMDAJCS8qIExhcmdlIE1vZGVsIERlc2NyaXB0b3IgTGlzdCBNb2RlCQkJCSovCisKKy8qIERNQXhfUEVSSVBIRVJBTF9NQVAsIE1ETUFfeXlfUEVSSVBIRVJBTF9NQVAgTWFza3MJCQkJCQkJCSovCisjZGVmaW5lIENUWVBFCQkJMHgwMDQwCS8qIERNQSBDaGFubmVsIFR5cGUgSW5kaWNhdG9yIChNZW1vcnkvUGVyaXBoZXJhbCopCSovCisjZGVmaW5lIFBNQVAJCQkweEYwMDAJLyogUGVyaXBoZXJhbCBNYXBwZWQgVG8gVGhpcyBDaGFubmVsCQkJCSovCisjZGVmaW5lIFBNQVBfUFBJCQkweDAwMDAJLyogCQlQUEkgUG9ydCBETUEJCQkJCQkJCSovCisjZGVmaW5lCVBNQVBfRU1BQ1JYCQkweDEwMDAJLyogCQlFdGhlcm5ldCBSZWNlaXZlIERNQQkJCQkJCSovCisjZGVmaW5lIFBNQVBfRU1BQ1RYCQkweDIwMDAJLyogCQlFdGhlcm5ldCBUcmFuc21pdCBETUEJCQkJCQkqLworI2RlZmluZSBQTUFQX1NQT1JUMFJYCTB4MzAwMAkvKiAJCVNQT1JUMCBSZWNlaXZlIERNQQkJCQkJCQkqLworI2RlZmluZSBQTUFQX1NQT1JUMFRYCTB4NDAwMAkvKiAJCVNQT1JUMCBUcmFuc21pdCBETUEJCQkJCQkJKi8KKyNkZWZpbmUgUE1BUF9TUE9SVDFSWAkweDUwMDAJLyogCQlTUE9SVDEgUmVjZWl2ZSBETUEJCQkJCQkJKi8KKyNkZWZpbmUgUE1BUF9TUE9SVDFUWAkweDYwMDAJLyogCQlTUE9SVDEgVHJhbnNtaXQgRE1BCQkJCQkJCSovCisjZGVmaW5lIFBNQVBfU1BJCQkweDcwMDAJLyogCQlTUEkgUG9ydCBETUEJCQkJCQkJCSovCisjZGVmaW5lIFBNQVBfVUFSVDBSWAkweDgwMDAJLyogCQlVQVJUMCBQb3J0IFJlY2VpdmUgRE1BCQkJCQkJKi8KKyNkZWZpbmUgUE1BUF9VQVJUMFRYCTB4OTAwMAkvKiAJCVVBUlQwIFBvcnQgVHJhbnNtaXQgRE1BCQkJCQkJKi8KKyNkZWZpbmUJUE1BUF9VQVJUMVJYCTB4QTAwMAkvKiAJCVVBUlQxIFBvcnQgUmVjZWl2ZSBETUEJCQkJCQkqLworI2RlZmluZQlQTUFQX1VBUlQxVFgJMHhCMDAwCS8qIAkJVUFSVDEgUG9ydCBUcmFuc21pdCBETUEJCQkJCQkqLworCisvKiBETUF4X0lSUV9TVEFUVVMsIE1ETUFfeXlfSVJRX1NUQVRVUyBNYXNrcwkJCQkJCSovCisjZGVmaW5lIERNQV9ET05FCQkweDAwMDEJLyogRE1BIENvbXBsZXRpb24gSW50ZXJydXB0IFN0YXR1cwkqLworI2RlZmluZSBETUFfRVJSCQkJMHgwMDAyCS8qIERNQSBFcnJvciBJbnRlcnJ1cHQgU3RhdHVzCQkqLworI2RlZmluZSBERkVUQ0gJCQkweDAwMDQJLyogRE1BIERlc2NyaXB0b3IgRmV0Y2ggSW5kaWNhdG9yCSovCisjZGVmaW5lIERNQV9SVU4JCQkweDAwMDgJLyogRE1BIENoYW5uZWwgUnVubmluZyBJbmRpY2F0b3IJKi8KKworCisvKiAgKioqKioqKioqKioqICBQQVJBTExFTCBQRVJJUEhFUkFMIElOVEVSRkFDRSAoUFBJKSBNQVNLUyAqKioqKioqKioqKioqLworLyogIFBQSV9DT05UUk9MIE1hc2tzCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFBPUlRfRU4JCQkweDAwMDEJCS8qIFBQSSBQb3J0IEVuYWJsZQkJCQkJKi8KKyNkZWZpbmUgUE9SVF9ESVIJCTB4MDAwMgkJLyogUFBJIFBvcnQgRGlyZWN0aW9uCQkJCSovCisjZGVmaW5lIFhGUl9UWVBFCQkweDAwMEMJCS8qIFBQSSBUcmFuc2ZlciBUeXBlCQkJCSovCisjZGVmaW5lIFBPUlRfQ0ZHCQkweDAwMzAJCS8qIFBQSSBQb3J0IENvbmZpZ3VyYXRpb24JCQkqLworI2RlZmluZSBGTERfU0VMCQkJMHgwMDQwCQkvKiBQUEkgQWN0aXZlIEZpZWxkIFNlbGVjdAkJCSovCisjZGVmaW5lIFBBQ0tfRU4JCQkweDAwODAJCS8qIFBQSSBQYWNraW5nIE1vZGUJCQkJCSovCisjZGVmaW5lIERNQTMyCQkJMHgwMTAwCQkvKiBQUEkgMzItYml0IERNQSBFbmFibGUJCQkqLworI2RlZmluZSBTS0lQX0VOCQkJMHgwMjAwCQkvKiBQUEkgU2tpcCBFbGVtZW50IEVuYWJsZQkJCSovCisjZGVmaW5lIFNLSVBfRU8JCQkweDA0MDAJCS8qIFBQSSBTa2lwIEV2ZW4vT2RkIEVsZW1lbnRzCQkqLworI2RlZmluZSBETEVOXzgJCQkweDAwMDAJCS8qIERhdGEgTGVuZ3RoID0gOCBCaXRzCQkJCSovCisjZGVmaW5lIERMRU5fMTAJCQkweDA4MDAJCS8qIERhdGEgTGVuZ3RoID0gMTAgQml0cwkJCSovCisjZGVmaW5lIERMRU5fMTEJCQkweDEwMDAJCS8qIERhdGEgTGVuZ3RoID0gMTEgQml0cwkJCSovCisjZGVmaW5lIERMRU5fMTIJCQkweDE4MDAJCS8qIERhdGEgTGVuZ3RoID0gMTIgQml0cwkJCSovCisjZGVmaW5lIERMRU5fMTMJCQkweDIwMDAJCS8qIERhdGEgTGVuZ3RoID0gMTMgQml0cwkJCSovCisjZGVmaW5lIERMRU5fMTQJCQkweDI4MDAJCS8qIERhdGEgTGVuZ3RoID0gMTQgQml0cwkJCSovCisjZGVmaW5lIERMRU5fMTUJCQkweDMwMDAJCS8qIERhdGEgTGVuZ3RoID0gMTUgQml0cwkJCSovCisjZGVmaW5lIERMRU5fMTYJCQkweDM4MDAJCS8qIERhdGEgTGVuZ3RoID0gMTYgQml0cwkJCSovCisjZGVmaW5lIERMRU5HVEgJCQkweDM4MDAJCS8qIFBQSSBEYXRhIExlbmd0aCAgKi8KKyNkZWZpbmUgUE9MQwkJCTB4NDAwMAkJLyogUFBJIENsb2NrIFBvbGFyaXR5CQkJCSovCisjZGVmaW5lIFBPTFMJCQkweDgwMDAJCS8qIFBQSSBGcmFtZSBTeW5jIFBvbGFyaXR5CQkJKi8KKworLyogUFBJX1NUQVRVUyBNYXNrcwkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgRkxECQkJCTB4MDQwMAkJLyogRmllbGQgSW5kaWNhdG9yCQkJCQkqLworI2RlZmluZSBGVF9FUlIJCQkweDA4MDAJCS8qIEZyYW1lIFRyYWNrIEVycm9yCQkJCSovCisjZGVmaW5lIE9WUgkJCQkweDEwMDAJCS8qIEZJRk8gT3ZlcmZsb3cgRXJyb3IJCQkJKi8KKyNkZWZpbmUgVU5EUgkJCTB4MjAwMAkJLyogRklGTyBVbmRlcnJ1biBFcnJvcgkJCQkqLworI2RlZmluZSBFUlJfREVUCQkJMHg0MDAwCQkvKiBFcnJvciBEZXRlY3RlZCBJbmRpY2F0b3IJCQkqLworI2RlZmluZSBFUlJfTkNPUgkJMHg4MDAwCQkvKiBFcnJvciBOb3QgQ29ycmVjdGVkIEluZGljYXRvcgkqLworCisKKy8qICAqKioqKioqKioqKioqKioqKioqKiAgVFdPLVdJUkUgSU5URVJGQUNFIChUV0kpIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRXSV9DTEtESVYgTWFjcm9zIChVc2U6ICpwVFdJX0NMS0RJViA9IENMS0xPVyh4KXxDTEtISSh5KTsgICkJCQkJKi8KKyNkZWZpbmUJQ0xLTE9XKHgpCSgoeCkgJiAweEZGKQkJLyogUGVyaW9kcyBDbG9jayBJcyBIZWxkIExvdwkJCSovCisjZGVmaW5lIENMS0hJKHkpCSgoKHkpJjB4RkYpPDwweDgpCS8qIFBlcmlvZHMgQmVmb3JlIE5ldyBDbG9jayBMb3cJCQkqLworCisvKiBUV0lfUFJFU0NBTEUgTWFza3MJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZQlQUkVTQ0FMRQkweDAwN0YJCS8qIFNDTEtzIFBlciBJbnRlcm5hbCBUaW1lIFJlZmVyZW5jZSAoMTBNSHopCSovCisjZGVmaW5lCVRXSV9FTkEJCTB4MDA4MAkJLyogVFdJIEVuYWJsZQkJCQkJCQkJCSovCisjZGVmaW5lCVNDQ0IJCTB4MDIwMAkJLyogU0NDQiBDb21wYXRpYmlsaXR5IEVuYWJsZQkJCQkJKi8KKworLyogVFdJX1NMQVZFX0NUUkwgTWFza3MJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZQlTRU4JCQkweDAwMDEJCS8qIFNsYXZlIEVuYWJsZQkJCQkJCQkJCSovCisjZGVmaW5lCVNBRERfTEVOCTB4MDAwMgkJLyogU2xhdmUgQWRkcmVzcyBMZW5ndGgJCQkJCQkJKi8KKyNkZWZpbmUJU1REVkFMCQkweDAwMDQJCS8qIFNsYXZlIFRyYW5zbWl0IERhdGEgVmFsaWQJCQkJCSovCisjZGVmaW5lCU5BSwkJCTB4MDAwOAkJLyogTkFLL0FDSyogR2VuZXJhdGVkIEF0IENvbmNsdXNpb24gT2YgVHJhbnNmZXIgKi8KKyNkZWZpbmUJR0VOCQkJMHgwMDEwCQkvKiBHZW5lcmFsIENhbGwgQWRycmVzcyBNYXRjaGluZyBFbmFibGVkCQkqLworCisvKiBUV0lfU0xBVkVfU1RBVCBNYXNrcwkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lCVNESVIJCTB4MDAwMQkJLyogU2xhdmUgVHJhbnNmZXIgRGlyZWN0aW9uIChUcmFuc21pdC9SZWNlaXZlKikJKi8KKyNkZWZpbmUgR0NBTEwJCTB4MDAwMgkJLyogR2VuZXJhbCBDYWxsIEluZGljYXRvcgkJCQkJCSovCisKKy8qIFRXSV9NQVNURVJfQ1RSTCBNYXNrcwkJCQkJCQkJCQkJCQkqLworI2RlZmluZQlNRU4JCQkweDAwMDEJCS8qIE1hc3RlciBNb2RlIEVuYWJsZQkJCQkJCSovCisjZGVmaW5lCU1BRERfTEVOCTB4MDAwMgkJLyogTWFzdGVyIEFkZHJlc3MgTGVuZ3RoCQkJCQkqLworI2RlZmluZQlNRElSCQkweDAwMDQJCS8qIE1hc3RlciBUcmFuc21pdCBEaXJlY3Rpb24gKFJYL1RYKikJCSovCisjZGVmaW5lCUZBU1QJCTB4MDAwOAkJLyogVXNlIEZhc3QgTW9kZSBUaW1pbmcgU3BlY3MJCQkJKi8KKyNkZWZpbmUJU1RPUAkJMHgwMDEwCQkvKiBJc3N1ZSBTdG9wIENvbmRpdGlvbgkJCQkJCSovCisjZGVmaW5lCVJTVEFSVAkJMHgwMDIwCQkvKiBSZXBlYXQgU3RhcnQgb3IgU3RvcCogQXQgRW5kIE9mIFRyYW5zZmVyCSovCisjZGVmaW5lCURDTlQJCTB4M0ZDMAkJLyogRGF0YSBCeXRlcyBUbyBUcmFuc2ZlcgkJCQkJKi8KKyNkZWZpbmUJU0RBT1ZSCQkweDQwMDAJCS8qIFNlcmlhbCBEYXRhIE92ZXJyaWRlCQkJCQkJKi8KKyNkZWZpbmUJU0NMT1ZSCQkweDgwMDAJCS8qIFNlcmlhbCBDbG9jayBPdmVycmlkZQkJCQkJKi8KKworLyogVFdJX01BU1RFUl9TVEFUIE1hc2tzCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZQlNUFJPRwkJMHgwMDAxCQkvKiBNYXN0ZXIgVHJhbnNmZXIgSW4gUHJvZ3Jlc3MJCQkJCSovCisjZGVmaW5lCUxPU1RBUkIJCTB4MDAwMgkJLyogTG9zdCBBcmJpdHJhdGlvbiBJbmRpY2F0b3IgKFhmZXIgQWJvcnRlZCkJKi8KKyNkZWZpbmUJQU5BSwkJMHgwMDA0CQkvKiBBZGRyZXNzIE5vdCBBY2tub3dsZWRnZWQJCQkJCQkqLworI2RlZmluZQlETkFLCQkweDAwMDgJCS8qIERhdGEgTm90IEFja25vd2xlZGdlZAkJCQkJCSovCisjZGVmaW5lCUJVRlJERVJSCTB4MDAxMAkJLyogQnVmZmVyIFJlYWQgRXJyb3IJCQkJCQkJKi8KKyNkZWZpbmUJQlVGV1JFUlIJMHgwMDIwCQkvKiBCdWZmZXIgV3JpdGUgRXJyb3IJCQkJCQkJKi8KKyNkZWZpbmUJU0RBU0VOCQkweDAwNDAJCS8qIFNlcmlhbCBEYXRhIFNlbnNlCQkJCQkJCSovCisjZGVmaW5lCVNDTFNFTgkJMHgwMDgwCQkvKiBTZXJpYWwgQ2xvY2sgU2Vuc2UJCQkJCQkJKi8KKyNkZWZpbmUJQlVTQlVTWQkJMHgwMTAwCQkvKiBCdXMgQnVzeSBJbmRpY2F0b3IJCQkJCQkJKi8KKworLyogVFdJX0lOVF9TUkMgYW5kIFRXSV9JTlRfRU5BQkxFIE1hc2tzCQkJCQkJKi8KKyNkZWZpbmUJU0lOSVQJCTB4MDAwMQkJLyogU2xhdmUgVHJhbnNmZXIgSW5pdGlhdGVkCSovCisjZGVmaW5lCVNDT01QCQkweDAwMDIJCS8qIFNsYXZlIFRyYW5zZmVyIENvbXBsZXRlCSovCisjZGVmaW5lCVNFUlIJCTB4MDAwNAkJLyogU2xhdmUgVHJhbnNmZXIgRXJyb3IJCSovCisjZGVmaW5lCVNPVkYJCTB4MDAwOAkJLyogU2xhdmUgT3ZlcmZsb3cJCQkqLworI2RlZmluZQlNQ09NUAkJMHgwMDEwCQkvKiBNYXN0ZXIgVHJhbnNmZXIgQ29tcGxldGUJKi8KKyNkZWZpbmUJTUVSUgkJMHgwMDIwCQkvKiBNYXN0ZXIgVHJhbnNmZXIgRXJyb3IJKi8KKyNkZWZpbmUJWE1UU0VSVgkJMHgwMDQwCQkvKiBUcmFuc21pdCBGSUZPIFNlcnZpY2UJKi8KKyNkZWZpbmUJUkNWU0VSVgkJMHgwMDgwCQkvKiBSZWNlaXZlIEZJRk8gU2VydmljZQkJKi8KKworLyogVFdJX0ZJRk9fQ1RSTCBNYXNrcwkJCQkJCQkJCQkJCSovCisjZGVmaW5lCVhNVEZMVVNICTB4MDAwMQkJLyogVHJhbnNtaXQgQnVmZmVyIEZsdXNoCQkJKi8KKyNkZWZpbmUJUkNWRkxVU0gJMHgwMDAyCQkvKiBSZWNlaXZlIEJ1ZmZlciBGbHVzaAkJCQkqLworI2RlZmluZQlYTVRJTlRMRU4JMHgwMDA0CQkvKiBUcmFuc21pdCBCdWZmZXIgSW50ZXJydXB0IExlbmd0aAkqLworI2RlZmluZQlSQ1ZJTlRMRU4JMHgwMDA4CQkvKiBSZWNlaXZlIEJ1ZmZlciBJbnRlcnJ1cHQgTGVuZ3RoCSovCisKKy8qIFRXSV9GSUZPX1NUQVQgTWFza3MJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZQlYTVRTVEFUCQkweDAwMDMJCS8qIFRyYW5zbWl0IEZJRk8gU3RhdHVzCQkJCQkJCSovCisjZGVmaW5lCVhNVF9FTVBUWQkweDAwMDAJCS8qIAkJVHJhbnNtaXQgRklGTyBFbXB0eQkJCQkJCSovCisjZGVmaW5lCVhNVF9IQUxGCTB4MDAwMQkJLyogCQlUcmFuc21pdCBGSUZPIEhhcyAxIEJ5dGUgVG8gV3JpdGUJCSovCisjZGVmaW5lCVhNVF9GVUxMCTB4MDAwMwkJLyogCQlUcmFuc21pdCBGSUZPIEZ1bGwgKDIgQnl0ZXMgVG8gV3JpdGUpCSovCisKKyNkZWZpbmUJUkNWU1RBVAkJMHgwMDBDCQkvKiBSZWNlaXZlIEZJRk8gU3RhdHVzCQkJCQkJCSovCisjZGVmaW5lCVJDVl9FTVBUWQkweDAwMDAJCS8qIAkJUmVjZWl2ZSBGSUZPIEVtcHR5CQkJCQkJKi8KKyNkZWZpbmUJUkNWX0hBTEYJMHgwMDA0CQkvKiAJCVJlY2VpdmUgRklGTyBIYXMgMSBCeXRlIFRvIFJlYWQJCQkqLworI2RlZmluZQlSQ1ZfRlVMTAkweDAwMEMJCS8qIAkJUmVjZWl2ZSBGSUZPIEZ1bGwgKDIgQnl0ZXMgVG8gUmVhZCkJCSovCisKKworLyogICoqKioqKioqKioqKioqKioqKiogIFBJTiBDT05UUk9MIFJFR0lTVEVSIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBQT1JUX01VWCBNYXNrcwkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lCVBKU0UJCQkweDAwMDEJCQkvKiBQb3J0IEogU1BJL1NQT1JUIEVuYWJsZQkJCSovCisjZGVmaW5lCVBKU0VfU1BPUlQJCTB4MDAwMAkJCS8qIAkJRW5hYmxlIFRGUzAvRFQwUFJJCQkJKi8KKyNkZWZpbmUJUEpTRV9TUEkJCTB4MDAwMQkJCS8qIAkJRW5hYmxlIFNQSV9TU0VMMzoyCQkJKi8KKworI2RlZmluZQlQSkNFKHgpCQkJKCgoeCkmMHgzKTw8MSkJLyogUG9ydCBKIENBTi9TUEkvU1BPUlQgRW5hYmxlCQkqLworI2RlZmluZQlQSkNFX1NQT1JUCQkweDAwMDAJCQkvKiAJCUVuYWJsZSBEUjBTRUMvRFQwU0VDCQkqLworI2RlZmluZQlQSkNFX0NBTgkJMHgwMDAyCQkJLyogCQlFbmFibGUgQ0FOIFJYL1RYCQkJKi8KKyNkZWZpbmUJUEpDRV9TUEkJCTB4MDAwNAkJCS8qIAkJRW5hYmxlIFNQSV9TU0VMNwkJCSovCisKKyNkZWZpbmUJUEZERQkJCTB4MDAwOAkJCS8qIFBvcnQgRiBETUEgUmVxdWVzdCBFbmFibGUJCSovCisjZGVmaW5lCVBGREVfVUFSVAkJMHgwMDAwCQkJLyogCQlFbmFibGUgVUFSVDAgUlgvVFgJCQkqLworI2RlZmluZQlQRkRFX0RNQQkJMHgwMDA4CQkJLyogCQlFbmFibGUgRE1BUjE6MAkJCQkqLworCisjZGVmaW5lCVBGVEUJCQkweDAwMTAJCQkvKiBQb3J0IEYgVGltZXIgRW5hYmxlCQkJCSovCisjZGVmaW5lCVBGVEVfVUFSVAkJMHgwMDAwCQkJLyoJCUVuYWJsZSBVQVJUMSBSWC9UWAkJCSovCisjZGVmaW5lCVBGVEVfVElNRVIJCTB4MDAxMAkJCS8qIAkJRW5hYmxlIFRNUjc6NgkJCQkqLworCisjZGVmaW5lCVBGUzZFCQkJMHgwMDIwCQkJLyogUG9ydCBGIFNQSSBTU0VMIDYgRW5hYmxlCQkJKi8KKyNkZWZpbmUJUEZTNkVfVElNRVIJCTB4MDAwMAkJCS8qCQlFbmFibGUgVE1SNQkJCQkJKi8KKyNkZWZpbmUJUEZTNkVfU1BJCQkweDAwMjAJCQkvKiAJCUVuYWJsZSBTUElfU1NFTDYJCQkqLworCisjZGVmaW5lCVBGUzVFCQkJMHgwMDQwCQkJLyogUG9ydCBGIFNQSSBTU0VMIDUgRW5hYmxlCQkJKi8KKyNkZWZpbmUJUEZTNUVfVElNRVIJCTB4MDAwMAkJCS8qCQlFbmFibGUgVE1SNAkJCQkJKi8KKyNkZWZpbmUJUEZTNUVfU1BJCQkweDAwNDAJCQkvKiAJCUVuYWJsZSBTUElfU1NFTDUJCQkqLworCisjZGVmaW5lCVBGUzRFCQkJMHgwMDgwCQkJLyogUG9ydCBGIFNQSSBTU0VMIDQgRW5hYmxlCQkJKi8KKyNkZWZpbmUJUEZTNEVfVElNRVIJCTB4MDAwMAkJCS8qCQlFbmFibGUgVE1SMwkJCQkJKi8KKyNkZWZpbmUJUEZTNEVfU1BJCQkweDAwODAJCQkvKiAJCUVuYWJsZSBTUElfU1NFTDQJCQkqLworCisjZGVmaW5lCVBGRkUJCQkweDAxMDAJCQkvKiBQb3J0IEYgUFBJIEZyYW1lIFN5bmMgRW5hYmxlCQkqLworI2RlZmluZQlQRkZFX1RJTUVSCQkweDAwMDAJCQkvKiAJCUVuYWJsZSBUTVIyCQkJCQkqLworI2RlZmluZQlQRkZFX1BQSQkJMHgwMTAwCQkJLyogCQlFbmFibGUgUFBJIEZTMwkJCQkqLworCisjZGVmaW5lCVBHU0UJCQkweDAyMDAJCQkvKiBQb3J0IEcgU1BPUlQxIFNlY29uZGFyeSBFbmFibGUJKi8KKyNkZWZpbmUJUEdTRV9QUEkJCTB4MDAwMAkJCS8qIAkJRW5hYmxlIFBQSSBEOTo4CQkJCSovCisjZGVmaW5lCVBHU0VfU1BPUlQJCTB4MDIwMAkJCS8qIAkJRW5hYmxlIERSMVNFQy9EVDFTRUMJCSovCisKKyNkZWZpbmUJUEdSRQkJCTB4MDQwMAkJCS8qIFBvcnQgRyBTUE9SVDEgUmVjZWl2ZSBFbmFibGUJCSovCisjZGVmaW5lCVBHUkVfUFBJCQkweDAwMDAJCQkvKiAJCUVuYWJsZSBQUEkgRDEyOjEwCQkJKi8KKyNkZWZpbmUJUEdSRV9TUE9SVAkJMHgwNDAwCQkJLyogCQlFbmFibGUgRFIxUFJJL1JGUzEvUlNDTEsxCSovCisKKyNkZWZpbmUJUEdURQkJCTB4MDgwMAkJCS8qIFBvcnQgRyBTUE9SVDEgVHJhbnNtaXQgRW5hYmxlCSovCisjZGVmaW5lCVBHVEVfUFBJCQkweDAwMDAJCQkvKiAJCUVuYWJsZSBQUEkgRDE1OjEzCQkJKi8KKyNkZWZpbmUJUEdURV9TUE9SVAkJMHgwODAwCQkJLyogCQlFbmFibGUgRFQxUFJJL1RGUzEvVFNDTEsxCSovCisKKworLyogICoqKioqKioqKioqKioqKioqKiAgSEFORFNIQUtFIERNQSAoSERNQSkgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKi8KKy8qIEhETUF4X0NUTCBNYXNrcwkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUJSE1ETUFFTgkJMHgwMDAxCS8qIEVuYWJsZSBIYW5kc2hha2UgRE1BIDAvMQkJCQkJKi8KKyNkZWZpbmUJUkVQCQkJMHgwMDAyCS8qIEhETUEgUmVxdWVzdCBQb2xhcml0eQkJCQkJKi8KKyNkZWZpbmUJVVRFCQkJMHgwMDA0CS8qIFVyZ2VuY3kgVGhyZXNob2xkIEVuYWJsZQkJCQkJKi8KKyNkZWZpbmUJT0lFCQkJMHgwMDEwCS8qIE92ZXJmbG93IEludGVycnVwdCBFbmFibGUJCQkJKi8KKyNkZWZpbmUJQkRJRQkJMHgwMDIwCS8qIEJsb2NrIERvbmUgSW50ZXJydXB0IEVuYWJsZQkJCQkqLworI2RlZmluZQlNQkRJCQkweDAwNDAJLyogTWFzayBCbG9jayBEb25lIElSUSBJZiBQZW5kaW5nIEVDTlQJCSovCisjZGVmaW5lCURSUQkJCTB4MDMwMAkvKiBIRE1BIFJlcXVlc3QgVHlwZQkJCQkJCSovCisjZGVmaW5lCURSUV9OT05FCTB4MDAwMAkvKiAJCU5vIFJlcXVlc3QJCQkJCQkJKi8KKyNkZWZpbmUJRFJRX1NJTkdMRQkweDAxMDAJLyogCQlDaGFubmVscyBSZXF1ZXN0IFNpbmdsZQkJCQkqLworI2RlZmluZQlEUlFfTVVMVEkJMHgwMjAwCS8qIAkJQ2hhbm5lbHMgUmVxdWVzdCBNdWx0aSAoRGVmYXVsdCkJKi8KKyNkZWZpbmUJRFJRX1VSR0VOVAkweDAzMDAJLyogCQlDaGFubmVscyBSZXF1ZXN0IE11bHRpIFVyZ2VudAkJKi8KKyNkZWZpbmUJUkJDCQkJMHgxMDAwCS8qIFJlbG9hZCBCQ05UIFdpdGggSUJDTlQJCQkJCSovCisjZGVmaW5lCVBTCQkJMHgyMDAwCS8qIEhETUEgUGluIFN0YXR1cwkJCQkJCQkqLworI2RlZmluZQlPSQkJCTB4NDAwMAkvKiBPdmVyZmxvdyBJbnRlcnJ1cHQgR2VuZXJhdGVkCQkJCSovCisjZGVmaW5lCUJESQkJCTB4ODAwMAkvKiBCbG9jayBEb25lIEludGVycnVwdCBHZW5lcmF0ZWQJCQkqLworCisvKiBlbnRyeSBhZGRyZXNzZXMgb2YgdGhlIHVzZXItY2FsbGFibGUgQm9vdCBST00gZnVuY3Rpb25zICovCisKKyNkZWZpbmUgX0JPT1RST01fUkVTRVQgMHhFRjAwMDAwMAorI2RlZmluZSBfQk9PVFJPTV9GSU5BTF9JTklUIDB4RUYwMDAwMDIKKyNkZWZpbmUgX0JPT1RST01fRE9fTUVNT1JZX0RNQSAweEVGMDAwMDA2CisjZGVmaW5lIF9CT09UUk9NX0JPT1RfRFhFX0ZMQVNIIDB4RUYwMDAwMDgKKyNkZWZpbmUgX0JPT1RST01fQk9PVF9EWEVfU1BJIDB4RUYwMDAwMEEKKyNkZWZpbmUgX0JPT1RST01fQk9PVF9EWEVfVFdJIDB4RUYwMDAwMEMKKyNkZWZpbmUgX0JPT1RST01fR0VUX0RYRV9BRERSRVNTX0ZMQVNIIDB4RUYwMDAwMTAKKyNkZWZpbmUgX0JPT1RST01fR0VUX0RYRV9BRERSRVNTX1NQSSAweEVGMDAwMDEyCisjZGVmaW5lIF9CT09UUk9NX0dFVF9EWEVfQUREUkVTU19UV0kgMHhFRjAwMDAxNAorCisvKiBBbHRlcm5hdGUgRGVwcmVjYXRlZCBNYWNyb3MgUHJvdmlkZWQgRm9yIEJhY2t3YXJkcyBDb2RlIENvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUJUEdERV9VQVJUICAgUEZERV9VQVJUCisjZGVmaW5lCVBHREVfRE1BICAgIFBGREVfRE1BCisjZGVmaW5lCUNLRUxPVwkJU0NLRUxPVworCisvKiBIT1NUIFBvcnQgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBIT1NUX0NPTlRST0wgIDB4ZmZjMDM0MDAgICAvKiBIT1NUIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUVVMgIDB4ZmZjMDM0MDQgICAvKiBIT1NUIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIEhPU1RfVElNRU9VVCAgMHhmZmMwMzQwOCAgIC8qIEhPU1QgQWNrbm93bGVkZ2UgTW9kZSBUaW1lb3V0IFJlZ2lzdGVyICovCisKKy8qIENvdW50ZXIgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIENOVF9DT05GSUcgIDB4ZmZjMDM1MDAgICAvKiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgQ05UX0lNQVNLICAweGZmYzAzNTA0ICAgLyogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIENOVF9TVEFUVVMgIDB4ZmZjMDM1MDggICAvKiBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgQ05UX0NPTU1BTkQgIDB4ZmZjMDM1MGMgICAvKiBDb21tYW5kIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgQ05UX0RFQk9VTkNFICAweGZmYzAzNTEwICAgLyogRGVib3VuY2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgQ05UX0NPVU5URVIgIDB4ZmZjMDM1MTQgICAvKiBDb3VudGVyIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgICBDTlRfTUFYICAweGZmYzAzNTE4ICAgLyogTWF4aW1hbCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICAgQ05UX01JTiAgMHhmZmMwMzUxYyAgIC8qIE1pbmltYWwgQ291bnQgUmVnaXN0ZXIgKi8KKworLyogT1RQL0ZVU0UgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgT1RQX0NPTlRST0wgIDB4ZmZjMDM2MDAgICAvKiBPVFAvRnVzZSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgICBPVFBfQkVOICAweGZmYzAzNjA0ICAgLyogT1RQL0Z1c2UgQnl0ZSBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIE9UUF9TVEFUVVMgIDB4ZmZjMDM2MDggICAvKiBPVFAvRnVzZSBTdGF0dXMgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIE9UUF9USU1JTkcgIDB4ZmZjMDM2MGMgICAvKiBPVFAvRnVzZSBBY2Nlc3MgVGltaW5nICovCisKKy8qIFNlY3VyaXR5IFJlZ2lzdGVycyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBTRUNVUkVfU1lTU1dUICAweGZmYzAzNjIwICAgLyogU2VjdXJlIFN5c3RlbSBTd2l0Y2hlcyAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBTRUNVUkVfQ09OVFJPTCAgMHhmZmMwMzYyNCAgIC8qIFNlY3VyZSBDb250cm9sICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBTRUNVUkVfU1RBVFVTICAweGZmYzAzNjI4ICAgLyogU2VjdXJlIFN0YXR1cyAqLworCisvKiBPVFAgUmVhZC9Xcml0ZSBEYXRhIEJ1ZmZlciBSZWdpc3RlcnMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgIE9UUF9EQVRBMCAgMHhmZmMwMzY4MCAgIC8qIE9UUC9GdXNlIERhdGEgKE9UUF9EQVRBMC0zKSBhY2Nlc3NlcyB0aGUgZnVzZSByZWFkIHdyaXRlIGJ1ZmZlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgIE9UUF9EQVRBMSAgMHhmZmMwMzY4NCAgIC8qIE9UUC9GdXNlIERhdGEgKE9UUF9EQVRBMC0zKSBhY2Nlc3NlcyB0aGUgZnVzZSByZWFkIHdyaXRlIGJ1ZmZlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgIE9UUF9EQVRBMiAgMHhmZmMwMzY4OCAgIC8qIE9UUC9GdXNlIERhdGEgKE9UUF9EQVRBMC0zKSBhY2Nlc3NlcyB0aGUgZnVzZSByZWFkIHdyaXRlIGJ1ZmZlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgIE9UUF9EQVRBMyAgMHhmZmMwMzY4YyAgIC8qIE9UUC9GdXNlIERhdGEgKE9UUF9EQVRBMC0zKSBhY2Nlc3NlcyB0aGUgZnVzZSByZWFkIHdyaXRlIGJ1ZmZlciAqLworCisvKiBNb3RvciBDb250cm9sIFBXTSBSZWdpc3RlcnMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICBQV01fQ1RSTCAgMHhmZmMwMzcwMCAgIC8qIFBXTSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgIFBXTV9TVEFUICAweGZmYzAzNzA0ICAgLyogUFdNIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTV9UTSAgMHhmZmMwMzcwOCAgIC8qIFBXTSBQZXJpb2QgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICBQV01fRFQgIDB4ZmZjMDM3MGMgICAvKiBQV00gRGVhZCBUaW1lIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgIFBXTV9HQVRFICAweGZmYzAzNzEwICAgLyogUFdNIENob3BwaW5nIENvbnRyb2wgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTV9DSEEgIDB4ZmZjMDM3MTQgICAvKiBQV00gQ2hhbm5lbCBBIER1dHkgQ29udHJvbCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICAgUFdNX0NIQiAgMHhmZmMwMzcxOCAgIC8qIFBXTSBDaGFubmVsIEIgRHV0eSBDb250cm9sICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgICBQV01fQ0hDICAweGZmYzAzNzFjICAgLyogUFdNIENoYW5uZWwgQyBEdXR5IENvbnRyb2wgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTV9TRUcgIDB4ZmZjMDM3MjAgICAvKiBQV00gQ3Jvc3NvdmVyIGFuZCBPdXRwdXQgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBQV01fU1lOQ1dUICAweGZmYzAzNzI0ICAgLyogUFdNIFN5bmMgUGx1c2UgV2lkdGggQ29udHJvbCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICBQV01fQ0hBTCAgMHhmZmMwMzcyOCAgIC8qIFBXTSBDaGFubmVsIEFMIER1dHkgQ29udHJvbCAoU1IgbW9kZSBvbmx5KSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICBQV01fQ0hCTCAgMHhmZmMwMzcyYyAgIC8qIFBXTSBDaGFubmVsIEJMIER1dHkgQ29udHJvbCAoU1IgbW9kZSBvbmx5KSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICBQV01fQ0hDTCAgMHhmZmMwMzczMCAgIC8qIFBXTSBDaGFubmVsIENMIER1dHkgQ29udHJvbCAoU1IgbW9kZSBvbmx5KSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICAgUFdNX0xTSSAgMHhmZmMwMzczNCAgIC8qIFBXTSBMb3cgU2lkZSBJbnZlcnQgKFNSIG1vZGUgb25seSkgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICBQV01fU1RBVDIgIDB4ZmZjMDM3MzggICAvKiBQV00gU3RhdHVzIFJlZ2lzdGVyIDIgKi8KKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAgICAgU0lOR0xFIEJJVCBNQUNSTyBQQUlSUyAoYml0IG1hc2sgYW5kIG5lZ2F0ZWQgb25lKSAgICAgICovCisvKiAgICAgYW5kIE1VTFRJIEJJVCBSRUFEIE1BQ1JPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKy8qIEJpdCBtYXNrcyBmb3IgSE9TVF9DT05UUk9MICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX0hPU1RfRU4gIDB4MSAgICAgICAgLyogSG9zdCBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfbkhPU1RfRU4gIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9IT1NUX0VORCAgMHgyICAgICAgICAvKiBIb3N0IEVuZGlhbmVzcyAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX25IT1NUX0VORCAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfREFUQV9TSVpFICAweDQgICAgICAgIC8qIERhdGEgU2l6ZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICBIT1NUX0NOVFJfbkRBVEFfU0laRSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX0hPU1RfUlNUICAweDggICAgICAgIC8qIEhvc3QgUmVzZXQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9uSE9TVF9SU1QgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9IUkRZX09WUiAgMHgyMCAgICAgICAvKiBIb3N0IFJlYWR5IE92ZXJyaWRlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfbkhSRFlfT1ZSICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfSU5UX01PREUgIDB4NDAgICAgICAgLyogSW50ZXJydXB0IE1vZGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9uSU5UX01PREUgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9CVF9FTiAgMHg4MCAgICAgICAvKiBCdXMgVGltZW91dCBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSXyBuQlRfRU4gIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX0VIVyAgMHgxMDAgICAgICAvKiBFbmFibGUgSG9zdCBXcml0ZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfbkVIVyAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfRUhSICAweDIwMCAgICAgIC8qIEVuYWJsZSBIb3N0IFJlYWQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX25FSFIgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX0JEUiAgMHg0MDAgICAgICAvKiBCdXJzdCBETUEgUmVxdWVzdHMgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX25CRFIgIDB4MAorCisvKiBCaXQgbWFza3MgZm9yIEhPU1RfU1RBVFVTICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfUkVBRFkgIDB4MSAgICAgICAgLyogRE1BIFJlYWR5ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfblJFQURZICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfRklGT0ZVTEwgIDB4MiAgICAgICAgLyogRklGTyBGdWxsICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfbkZJRk9GVUxMICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9GSUZPRU1QVFkgIDB4NCAgICAgICAgLyogRklGTyBFbXB0eSAqLworI2RlZmluZSAgICAgICAgICAgICAgICBIT1NUX1NUQVRfbkZJRk9FTVBUWSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX0NPTVBMRVRFICAweDggICAgICAgIC8qIERNQSBDb21wbGV0ZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX25DT01QTEVURSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9IU0hLICAweDEwICAgICAgIC8qIEhvc3QgSGFuZHNoYWtlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX25IU0hLICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX1RJTUVPVVQgIDB4MjAgICAgICAgLyogSG9zdCBUaW1lb3V0ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX25USU1FT1VUICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX0hJUlEgIDB4NDAgICAgICAgLyogSG9zdCBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9uSElSUSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9BTExPV19DTkZHICAweDgwICAgICAgIC8qIEFsbG93IE5ldyBDb25maWd1cmF0aW9uICovCisjZGVmaW5lICAgICAgICAgICAgICAgSE9TVF9TVEFUX25BTExPV19DTkZHICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX0RNQV9ESVIgIDB4MTAwICAgICAgLyogRE1BIERpcmVjdGlvbiAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9uRE1BX0RJUiAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfQlRFICAweDIwMCAgICAgIC8qIEJ1cyBUaW1lb3V0IEVuYWJsZWQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX25CVEUgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgIEhPU1RfU1RBVF9IT1NUUkRfRE9ORSAgMHg4MDAwICAgICAvKiBIb3N0IFJlYWQgQ29tcGxldGlvbiBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgIEhPU1RfU1RBVF9uSE9TVFJEX0RPTkUgIDB4MAorCisvKiBCaXQgbWFza3MgZm9yIEhPU1RfVElNRU9VVCAqLworCisjZGVmaW5lICAgICAgICAgICAgIEhPU1RfQ09VTlRfVElNRU9VVCAgMHg3ZmYgICAgICAvKiBIb3N0IFRpbWVvdXQgY291bnQgKi8KKworLyogQml0IG1hc2tzIGZvciBDTlRfQ09ORklHICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgQ05URSAgMHgxICAgICAgICAvKiBDb3VudGVyIEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIG5DTlRFICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgREVCRSAgMHgyICAgICAgICAvKiBEZWJvdW5jZSBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBuREVCRSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBDREdJTlYgIDB4MTAgICAgICAgLyogQ0RHIFBpbiBQb2xhcml0eSBJbnZlcnQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgbkNER0lOViAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBDVURJTlYgIDB4MjAgICAgICAgLyogQ1VEIFBpbiBQb2xhcml0eSBJbnZlcnQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgbkNVRElOViAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBDWk1JTlYgIDB4NDAgICAgICAgLyogQ1pNIFBpbiBQb2xhcml0eSBJbnZlcnQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgbkNaTUlOViAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIENOVE1PREUgIDB4NzAwICAgICAgLyogQ291bnRlciBPcGVyYXRpbmcgTW9kZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBaTVpDICAweDgwMCAgICAgIC8qIENaTSBaZXJvZXMgQ291bnRlciBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBuWk1aQyAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIEJORE1PREUgIDB4MzAwMCAgICAgLyogQm91bmRhcnkgcmVnaXN0ZXIgTW9kZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgSU5QRElTICAweDgwMDAgICAgIC8qIENVRyBhbmQgQ0RHIElucHV0IERpc2FibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgbklOUERJUyAgMHgwCisKKy8qIEJpdCBtYXNrcyBmb3IgQ05UX0lNQVNLICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgSUNJRSAgMHgxICAgICAgICAvKiBJbGxlZ2FsIEdyYXkvQmluYXJ5IENvZGUgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIG5JQ0lFICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgVUNJRSAgMHgyICAgICAgICAvKiBVcCBjb3VudCBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgblVDSUUgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBEQ0lFICAweDQgICAgICAgIC8qIERvd24gY291bnQgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIG5EQ0lFICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIE1JTkNJRSAgMHg4ICAgICAgICAvKiBNaW4gQ291bnQgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBuTUlOQ0lFICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIE1BWENJRSAgMHgxMCAgICAgICAvKiBNYXggQ291bnQgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBuTUFYQ0lFICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgQ09WMzFJRSAgMHgyMCAgICAgICAvKiBCaXQgMzEgT3ZlcmZsb3cgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIG5DT1YzMUlFICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgQ09WMTVJRSAgMHg0MCAgICAgICAvKiBCaXQgMTUgT3ZlcmZsb3cgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIG5DT1YxNUlFICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgQ1pFUk9JRSAgMHg4MCAgICAgICAvKiBDb3VudCB0byBaZXJvIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBuQ1pFUk9JRSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgQ1pNSUUgIDB4MTAwICAgICAgLyogQ1pNIFBpbiBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBuQ1pNSUUgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgQ1pNRUlFICAweDIwMCAgICAgIC8qIENaTSBFcnJvciBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIG5DWk1FSUUgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgQ1pNWklFICAweDQwMCAgICAgIC8qIENaTSBaZXJvZXMgQ291bnRlciBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIG5DWk1aSUUgIDB4MAorCisvKiBCaXQgbWFza3MgZm9yIENOVF9TVEFUVVMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBJQ0lJICAweDEgICAgICAgIC8qIElsbGVnYWwgR3JheS9CaW5hcnkgQ29kZSBJbnRlcnJ1cHQgSWRlbnRpZmllciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIG5JQ0lJICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgVUNJSSAgMHgyICAgICAgICAvKiBVcCBjb3VudCBJbnRlcnJ1cHQgSWRlbnRpZmllciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIG5VQ0lJICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgRENJSSAgMHg0ICAgICAgICAvKiBEb3duIGNvdW50IEludGVycnVwdCBJZGVudGlmaWVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgbkRDSUkgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgTUlOQ0lJICAweDggICAgICAgIC8qIE1pbiBDb3VudCBJbnRlcnJ1cHQgSWRlbnRpZmllciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBuTUlOQ0lJICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIE1BWENJSSAgMHgxMCAgICAgICAvKiBNYXggQ291bnQgSW50ZXJydXB0IElkZW50aWZpZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgbk1BWENJSSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIENPVjMxSUkgIDB4MjAgICAgICAgLyogQml0IDMxIE92ZXJmbG93IEludGVycnVwdCBJZGVudGlmaWVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgbkNPVjMxSUkgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICBDT1YxNUlJICAweDQwICAgICAgIC8qIEJpdCAxNSBPdmVyZmxvdyBJbnRlcnJ1cHQgSWRlbnRpZmllciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIG5DT1YxNUlJICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgQ1pFUk9JSSAgMHg4MCAgICAgICAvKiBDb3VudCB0byBaZXJvIEludGVycnVwdCBJZGVudGlmaWVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgbkNaRVJPSUkgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIENaTUlJICAweDEwMCAgICAgIC8qIENaTSBQaW4gSW50ZXJydXB0IElkZW50aWZpZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIG5DWk1JSSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBDWk1FSUkgIDB4MjAwICAgICAgLyogQ1pNIEVycm9yIEludGVycnVwdCBJZGVudGlmaWVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIG5DWk1FSUkgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgQ1pNWklJICAweDQwMCAgICAgIC8qIENaTSBaZXJvZXMgQ291bnRlciBJbnRlcnJ1cHQgSWRlbnRpZmllciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBuQ1pNWklJICAweDAKKworLyogQml0IG1hc2tzIGZvciBDTlRfQ09NTUFORCAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBXMUxDTlQgIDB4ZiAgICAgICAgLyogTG9hZCBDb3VudGVyIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBXMUxNSU4gIDB4ZjAgICAgICAgLyogTG9hZCBNaW4gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIFcxTE1BWCAgMHhmMDAgICAgICAvKiBMb2FkIE1heCBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIFcxWk1PTkNFICAweDEwMDAgICAgIC8qIEVuYWJsZSBDWk0gQ2xlYXIgQ291bnRlciBPbmNlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBuVzFaTU9OQ0UgIDB4MAorCisvKiBCaXQgbWFza3MgZm9yIENOVF9ERUJPVU5DRSAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICBEUFJFU0NBTEUgIDB4ZiAgICAgICAgLyogTG9hZCBDb3VudGVyIFJlZ2lzdGVyICovCisKKy8qIENOVF9DT01NQU5EIGJpdCBmaWVsZCBvcHRpb25zICovCisKKyNkZWZpbmUgVzFMQ05UX1pFUk8gICAweDAwMDEgICAvKiB3cml0ZSAxIHRvIGxvYWQgQ05UX0NPVU5URVIgd2l0aCB6ZXJvICovCisjZGVmaW5lIFcxTENOVF9NSU4gICAgMHgwMDA0ICAgLyogd3JpdGUgMSB0byBsb2FkIENOVF9DT1VOVEVSIGZyb20gQ05UX01JTiAqLworI2RlZmluZSBXMUxDTlRfTUFYICAgIDB4MDAwOCAgIC8qIHdyaXRlIDEgdG8gbG9hZCBDTlRfQ09VTlRFUiBmcm9tIENOVF9NQVggKi8KKworI2RlZmluZSBXMUxNSU5fWkVSTyAgIDB4MDAxMCAgIC8qIHdyaXRlIDEgdG8gbG9hZCBDTlRfTUlOIHdpdGggemVybyAqLworI2RlZmluZSBXMUxNSU5fQ05UICAgIDB4MDAyMCAgIC8qIHdyaXRlIDEgdG8gbG9hZCBDTlRfTUlOIGZyb20gQ05UX0NPVU5URVIgKi8KKyNkZWZpbmUgVzFMTUlOX01BWCAgICAweDAwODAgICAvKiB3cml0ZSAxIHRvIGxvYWQgQ05UX01JTiBmcm9tIENOVF9NQVggKi8KKworI2RlZmluZSBXMUxNQVhfWkVSTyAgIDB4MDEwMCAgIC8qIHdyaXRlIDEgdG8gbG9hZCBDTlRfTUFYIHdpdGggemVybyAqLworI2RlZmluZSBXMUxNQVhfQ05UICAgIDB4MDIwMCAgIC8qIHdyaXRlIDEgdG8gbG9hZCBDTlRfTUFYIGZyb20gQ05UX0NPVU5URVIgKi8KKyNkZWZpbmUgVzFMTUFYX01JTiAgICAweDA0MDAgICAvKiB3cml0ZSAxIHRvIGxvYWQgQ05UX01BWCBmcm9tIENOVF9NSU4gKi8KKworLyogQ05UX0NPTkZJRyBiaXQgZmllbGQgb3B0aW9ucyAqLworCisjZGVmaW5lIENOVE1PREVfUVVBREVOQyAgMHgwMDAwICAvKiBxdWFkcmF0dXJlIGVuY29kZXIgbW9kZSAqLworI2RlZmluZSBDTlRNT0RFX0JJTkVOQyAgIDB4MDEwMCAgLyogYmluYXJ5IGVuY29kZXIgbW9kZSAqLworI2RlZmluZSBDTlRNT0RFX1VEQ05UICAgIDB4MDIwMCAgLyogdXAvZG93biBjb3VudGVyIG1vZGUgKi8KKyNkZWZpbmUgQ05UTU9ERV9ESVJDTlQgICAweDA0MDAgIC8qIGRpcmVjdGlvbiBjb3VudGVyIG1vZGUgKi8KKyNkZWZpbmUgQ05UTU9ERV9ESVJUTVIgICAweDA1MDAgIC8qIGRpcmVjdGlvbiB0aW1lciBtb2RlICovCisKKyNkZWZpbmUgQk5ETU9ERV9DT01QICAgICAweDAwMDAgIC8qIGJvdW5kYXJ5IGNvbXBhcmUgbW9kZSAqLworI2RlZmluZSBCTkRNT0RFX1pFUk8gICAgIDB4MTAwMCAgLyogYm91bmRhcnkgY29tcGFyZSBhbmQgemVybyBtb2RlICovCisjZGVmaW5lIEJORE1PREVfQ0FQVCAgICAgMHgyMDAwICAvKiBib3VuZGFyeSBjYXB0dXJlIG1vZGUgKi8KKyNkZWZpbmUgQk5ETU9ERV9BRVhUICAgICAweDMwMDAgIC8qIGJvdW5kYXJ5IGF1dG8tZXh0ZW5kIG1vZGUgKi8KKworLyogQml0IG1hc2tzIGZvciBPVFBfQ09OVFJPTCAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgIEZVU0VfRkFERFIgIDB4MWZmICAgICAgLyogT1RQL0Z1c2UgQWRkcmVzcyAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBGSUVOICAweDgwMCAgICAgIC8qIE9UUC9GdXNlIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBuRklFTiAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgRlRFU1RERUMgIDB4MTAwMCAgICAgLyogT1RQL0Z1c2UgVGVzdCBEZWNvZGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBuRlRFU1RERUMgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICBGV1JURVNUICAweDIwMDAgICAgIC8qIE9UUC9GdXNlIFdyaXRlIFRlc3QgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBuRldSVEVTVCAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgRlJERU4gIDB4NDAwMCAgICAgLyogT1RQL0Z1c2UgUmVhZCBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIG5GUkRFTiAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgRldSRU4gIDB4ODAwMCAgICAgLyogT1RQL0Z1c2UgV3JpdGUgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBuRldSRU4gIDB4MAorCisvKiBCaXQgbWFza3MgZm9yIE9UUF9CRU4gKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBGQkVOICAweGZmZmYgICAgIC8qIE9UUC9GdXNlIEJ5dGUgRW5hYmxlICovCisKKy8qIEJpdCBtYXNrcyBmb3IgT1RQX1NUQVRVUyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgRkNPTVAgIDB4MSAgICAgICAgLyogT1RQL0Z1c2UgQWNjZXNzIENvbXBsZXRlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBuRkNPTVAgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgRkVSUk9SICAweDIgICAgICAgIC8qIE9UUC9GdXNlIEFjY2VzcyBFcnJvciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBuRkVSUk9SICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICBNTVJHTE9BRCAgMHgxMCAgICAgICAvKiBNZW1vcnkgTWFwcGVkIFJlZ2lzdGVyIEdhc2tldCBMb2FkICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBuTU1SR0xPQUQgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgIE1NUkdMT0NLICAweDIwICAgICAgIC8qIE1lbW9yeSBNYXBwZWQgUmVnaXN0ZXIgR2Fza2V0IExvY2sgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIG5NTVJHTE9DSyAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBGUEdNRU4gIDB4NDAgICAgICAgLyogT1RQL0Z1c2UgUHJvZ3JhbSBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgbkZQR01FTiAgMHgwCisKKy8qIEJpdCBtYXNrcyBmb3IgT1RQX1RJTUlORyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIFVTRUNESVYgIDB4ZmYgICAgICAgLyogTWljcm8gU2Vjb25kIERpdmlkZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgUkVBREFDQyAgMHg3ZjAwICAgICAvKiBSZWFkIEFjY2VzcyBUaW1lICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIENQVU1QUkwgIDB4MzgwMDAgICAgLyogQ2hhcmdlIFB1bXAgUmVsZWFzZSBUaW1lICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIENQVU1QU1UgIDB4YzAwMDAgICAgLyogQ2hhcmdlIFB1bXAgU2V0dXAgVGltZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBDUFVNUEhEICAweGYwMDAwMCAgIC8qIENoYXJnZSBQdW1wIEhvbGQgVGltZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBQR01USU1FICAweGZmMDAwMDAwIC8qIFByb2dyYW0gVGltZSAqLworCisvKiBCaXQgbWFza3MgZm9yIFNFQ1VSRV9TWVNTV1QgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICBFTVVEQUJMICAweDEgICAgICAgIC8qIEVtdWxhdGlvbiBEaXNhYmxlLiAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIG5FTVVEQUJMICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgUlNUREFCTCAgMHgyICAgICAgICAvKiBSZXNldCBEaXNhYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgblJTVERBQkwgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICBMMUlEQUJMICAweDFjICAgICAgIC8qIEwxIEluc3RydWN0aW9uIE1lbW9yeSBEaXNhYmxlLiAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIEwxREFEQUJMICAweGUwICAgICAgIC8qIEwxIERhdGEgQmFuayBBIE1lbW9yeSBEaXNhYmxlLiAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIEwxREJEQUJMICAweDcwMCAgICAgIC8qIEwxIERhdGEgQmFuayBCIE1lbW9yeSBEaXNhYmxlLiAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBETUEwT1ZSICAweDgwMCAgICAgIC8qIERNQTAgTWVtb3J5IEFjY2VzcyBPdmVycmlkZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIG5ETUEwT1ZSICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgRE1BMU9WUiAgMHgxMDAwICAgICAvKiBETUExIE1lbW9yeSBBY2Nlc3MgT3ZlcnJpZGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBuRE1BMU9WUiAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBFTVVPVlIgIDB4NDAwMCAgICAgLyogRW11bGF0aW9uIE92ZXJyaWRlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIG5FTVVPVlIgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgT1RQU0VOICAweDgwMDAgICAgIC8qIE9UUCBTZWNyZXRzIEVuYWJsZS4gKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgbk9UUFNFTiAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBMMkRBQkwgIDB4NzAwMDAgICAgLyogTDIgTWVtb3J5IERpc2FibGUuICovCisKKy8qIEJpdCBtYXNrcyBmb3IgU0VDVVJFX0NPTlRST0wgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICBTRUNVUkUwICAweDEgICAgICAgIC8qIFNFQ1VSRSAwICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgblNFQ1VSRTAgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICBTRUNVUkUxICAweDIgICAgICAgIC8qIFNFQ1VSRSAxICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgblNFQ1VSRTEgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICBTRUNVUkUyICAweDQgICAgICAgIC8qIFNFQ1VSRSAyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgblNFQ1VSRTIgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICBTRUNVUkUzICAweDggICAgICAgIC8qIFNFQ1VSRSAzICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgblNFQ1VSRTMgIDB4MAorCisvKiBCaXQgbWFza3MgZm9yIFNFQ1VSRV9TVEFUVVMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICBTRUNNT0RFICAweDMgICAgICAgIC8qIFNlY3VyZWQgTW9kZSBDb250cm9sIFN0YXRlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBOTUkgIDB4NCAgICAgICAgLyogTm9uIE1hc2thYmxlIEludGVycnVwdCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBuTk1JICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgQUZWQUxJRCAgMHg4ICAgICAgICAvKiBBdXRoZW50aWNhdGlvbiBGaXJtd2FyZSBWYWxpZCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIG5BRlZBTElEICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEFGRVhJVCAgMHgxMCAgICAgICAvKiBBdXRoZW50aWNhdGlvbiBGaXJtd2FyZSBFeGl0ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIG5BRkVYSVQgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICBTRUNTVEFUICAweGUwICAgICAgIC8qIFNlY3VyZSBTdGF0dXMgKi8KKworCisKKyNlbmRpZiAvKiBfREVGX0JGNTFYX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZG1hLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2RtYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZDMzYzEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2RtYS5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qIG1hY2gvZG1hLmggLSBhcmNoLXNwZWNpZmljIERNQSBkZWZpbmVzCisgKgorICogQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpZm5kZWYgX01BQ0hfRE1BX0hfCisjZGVmaW5lIF9NQUNIX0RNQV9IXworCisjZGVmaW5lIE1BWF9ETUFfQ0hBTk5FTFMgMTYKKworI2RlZmluZSBDSF9QUEkgCQkJMAkvKiBQUEkgcmVjZWl2ZS90cmFuc21pdCAqLworI2RlZmluZSBDSF9FTUFDX1JYIAkJMQkvKiBFdGhlcm5ldCBNQUMgcmVjZWl2ZSAqLworI2RlZmluZSBDSF9FTUFDX1RYIAkJMgkvKiBFdGhlcm5ldCBNQUMgdHJhbnNtaXQgKi8KKyNkZWZpbmUgQ0hfU1BPUlQwX1JYIAkJMwkvKiBTUE9SVDAgcmVjZWl2ZSAqLworI2RlZmluZSBDSF9TUE9SVDBfVFggCQk0CS8qIFNQT1JUMCB0cmFuc21pdCAqLworI2RlZmluZSBDSF9SU0kgCQkJNAkvKiBSU0kgKi8KKyNkZWZpbmUgQ0hfU1BPUlQxX1JYIAkJNQkvKiBTUE9SVDEgcmVjZWl2ZSAqLworI2RlZmluZSBDSF9TUEkxIAkJNQkvKiBTUEkxIHRyYW5zbWl0L3JlY2VpdmUgKi8KKyNkZWZpbmUgQ0hfU1BPUlQxX1RYIAkJNgkvKiBTUE9SVDEgdHJhbnNtaXQgKi8KKyNkZWZpbmUgQ0hfU1BJMCAJCTcJLyogU1BJMCB0cmFuc21pdC9yZWNlaXZlICovCisjZGVmaW5lIENIX1VBUlQwX1JYIAkJOAkvKiBVQVJUMCByZWNlaXZlICovCisjZGVmaW5lIENIX1VBUlQwX1RYIAkJOQkvKiBVQVJUMCB0cmFuc21pdCAqLworI2RlZmluZSBDSF9VQVJUMV9SWCAJCTEwCS8qIFVBUlQxIHJlY2VpdmUgKi8KKyNkZWZpbmUgQ0hfVUFSVDFfVFggCQkxMQkvKiBVQVJUMSB0cmFuc21pdCAqLworCisjZGVmaW5lIENIX01FTV9TVFJFQU0wX1NSQyAJMTIJLyogUlggKi8KKyNkZWZpbmUgQ0hfTUVNX1NUUkVBTTBfREVTVAkxMwkvKiBUWCAqLworI2RlZmluZSBDSF9NRU1fU1RSRUFNMV9TUkMgCTE0CS8qIFJYICovCisjZGVmaW5lIENIX01FTV9TVFJFQU0xX0RFU1QJMTUJLyogVFggKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZ3Bpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NTc2ODMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMCwwICsxLDYwIEBACisvKgorICogRmlsZTogYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9ncGlvLmgKKyAqIEJ1Z3M6IEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworCisjaWZuZGVmIF9NQUNIX0dQSU9fSF8KKyNkZWZpbmUgX01BQ0hfR1BJT19IXworCisjZGVmaW5lIE1BWF9CTEFDS0ZJTl9HUElPUyA0MAorCisjZGVmaW5lCUdQSU9fUEYwCTAKKyNkZWZpbmUJR1BJT19QRjEJMQorI2RlZmluZQlHUElPX1BGMgkyCisjZGVmaW5lCUdQSU9fUEYzCTMKKyNkZWZpbmUJR1BJT19QRjQJNAorI2RlZmluZQlHUElPX1BGNQk1CisjZGVmaW5lCUdQSU9fUEY2CTYKKyNkZWZpbmUJR1BJT19QRjcJNworI2RlZmluZQlHUElPX1BGOAk4CisjZGVmaW5lCUdQSU9fUEY5CTkKKyNkZWZpbmUJR1BJT19QRjEwCTEwCisjZGVmaW5lCUdQSU9fUEYxMQkxMQorI2RlZmluZQlHUElPX1BGMTIJMTIKKyNkZWZpbmUJR1BJT19QRjEzCTEzCisjZGVmaW5lCUdQSU9fUEYxNAkxNAorI2RlZmluZQlHUElPX1BGMTUJMTUKKyNkZWZpbmUJR1BJT19QRzAJMTYKKyNkZWZpbmUJR1BJT19QRzEJMTcKKyNkZWZpbmUJR1BJT19QRzIJMTgKKyNkZWZpbmUJR1BJT19QRzMJMTkKKyNkZWZpbmUJR1BJT19QRzQJMjAKKyNkZWZpbmUJR1BJT19QRzUJMjEKKyNkZWZpbmUJR1BJT19QRzYJMjIKKyNkZWZpbmUJR1BJT19QRzcJMjMKKyNkZWZpbmUJR1BJT19QRzgJMjQKKyNkZWZpbmUJR1BJT19QRzkJMjUKKyNkZWZpbmUJR1BJT19QRzEwICAgICAgCTI2CisjZGVmaW5lCUdQSU9fUEcxMSAgICAgIAkyNworI2RlZmluZQlHUElPX1BHMTIgICAgICAJMjgKKyNkZWZpbmUJR1BJT19QRzEzICAgICAgCTI5CisjZGVmaW5lCUdQSU9fUEcxNCAgICAgIAkzMAorI2RlZmluZQlHUElPX1BHMTUgICAgICAJMzEKKyNkZWZpbmUJR1BJT19QSDAJMzIKKyNkZWZpbmUJR1BJT19QSDEJMzMKKyNkZWZpbmUJR1BJT19QSDIJMzQKKyNkZWZpbmUJR1BJT19QSDMJMzUKKyNkZWZpbmUJR1BJT19QSDQJMzYKKyNkZWZpbmUJR1BJT19QSDUJMzcKKyNkZWZpbmUJR1BJT19QSDYJMzgKKyNkZWZpbmUJR1BJT19QSDcJMzkKKworI2RlZmluZSBQT1JUX0YgR1BJT19QRjAKKyNkZWZpbmUgUE9SVF9HIEdQSU9fUEcwCisjZGVmaW5lIFBPUlRfSCBHUElPX1BIMAorCisjZW5kaWYgLyogX01BQ0hfR1BJT19IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9pcnEuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvaXJxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZmMGYwOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvaXJxLmgKQEAgLTAsMCArMSwyNjAgQEAKKy8qCisgKiBmaWxlOglpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTE4L2lycS5oCisgKiBiYXNlZCBvbjoJaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUyNy9pcnEuaAorICogYXV0aG9yOglNaWNoYWVsIEhlbm5lcmljaCAobWljaGFlbC5oZW5uZXJpY2hAYW5hbG9nLmNvbSkKKyAqCisgKiBjcmVhdGVkOgorICogZGVzY3JpcHRpb246CisgKglzeXN0ZW0gbW1yIHJlZ2lzdGVyIG1hcAorICogcmV2OgorICoKKyAqIG1vZGlmaWVkOgorICoKKyAqCisgKiBidWdzOiAgICAgICAgIGVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIHRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIGdudSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIGZyZWUgc29mdHdhcmUgZm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogdGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgd2l0aG91dCBhbnkgd2FycmFudHk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogbWVyY2hhbnRhYmlsaXR5IG9yIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiAgc2VlIHRoZQorICogZ251IGdlbmVyYWwgcHVibGljIGxpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBnbnUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBjb3B5aW5nLgorICogaWYgbm90LCB3cml0ZSB0byB0aGUgZnJlZSBzb2Z0d2FyZSBmb3VuZGF0aW9uLAorICogNTkgdGVtcGxlIHBsYWNlIC0gc3VpdGUgMzMwLCBib3N0b24sIG1hIDAyMTExLTEzMDcsIHVzYS4KKyAqLworCisjaWZuZGVmIF9CRjUxOF9JUlFfSF8KKyNkZWZpbmUgX0JGNTE4X0lSUV9IXworCisvKgorICogSW50ZXJydXB0IHNvdXJjZSBkZWZpbml0aW9ucworCUV2ZW50IFNvdXJjZSAgICBDb3JlIEV2ZW50IE5hbWUKKwlDb3JlICAgICAgICBFbXVsYXRpb24gICAgICAgICAgICAgICAqKgorCUV2ZW50cyAgICAgICAgIChoaWdoZXN0IHByaW9yaXR5KSAgRU1VICAgICAgICAgMAorCVJlc2V0ICAgICAgICAgICAgICAgICAgIFJTVCAgICAgICAgIDEKKwlOTUkgICAgICAgICAgICAgICAgICAgICBOTUkgICAgICAgICAyCisJRXhjZXB0aW9uICAgICAgICAgICAgICAgRVZYICAgICAgICAgMworCVJlc2VydmVkICAgICAgICAgICAgICAgIC0tICAgICAgICAgIDQKKwlIYXJkd2FyZSBFcnJvciAgICAgICAgICBJVkhXICAgICAgICA1CisJQ29yZSBUaW1lciAgICAgICAgICAgICAgSVZUTVIgICAgICAgNiAqCisKKwkuLi4uLgorCisJIFNvZnR3YXJlIEludGVycnVwdCAxICAgIElWRzE0ICAgICAgIDMxCisJIFNvZnR3YXJlIEludGVycnVwdCAyICAgIC0tCisJIChsb3dlc3QgcHJpb3JpdHkpICBJVkcxNSAgICAgICAzMiAqCisqLworCisjZGVmaW5lIE5SX1BFUklfSU5UUyAgICAoMiAqIDMyKQorCisvKiBUaGUgQUJTVFJBQ1QgSVJRIGRlZmluaXRpb25zICovCisvKiogdGhlIGZpcnN0IHNldmVuIG9mIHRoZSBmb2xsb3dpbmcgYXJlIGZpeGVkLCB0aGUgcmVzdCB5b3UgY2hhbmdlIGlmIHlvdSBuZWVkIHRvICoqLworI2RlZmluZSBJUlFfRU1VCQkJMAkvKiBFbXVsYXRpb24gKi8KKyNkZWZpbmUgSVJRX1JTVAkJCTEJLyogcmVzZXQgKi8KKyNkZWZpbmUgSVJRX05NSQkJCTIJLyogTm9uIE1hc2thYmxlICovCisjZGVmaW5lIElSUV9FVlgJCQkzCS8qIEV4Y2VwdGlvbiAqLworI2RlZmluZSBJUlFfVU5VU0VECQk0CS8qIC0gdW51c2VkIGludGVycnVwdCAqLworI2RlZmluZSBJUlFfSFdFUlIJCTUJLyogSGFyZHdhcmUgRXJyb3IgKi8KKyNkZWZpbmUgSVJRX0NPUkVUTVIJCTYJLyogQ29yZSB0aW1lciAqLworCisjZGVmaW5lIEJGSU5fSVJRKHgpCQkoKHgpICsgNykKKworI2RlZmluZSBJUlFfUExMX1dBS0VVUAkJQkZJTl9JUlEoMCkJLyogUExMIFdha2V1cCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSVJRX0RNQTBfRVJST1IJCUJGSU5fSVJRKDEpCS8qIERNQSBFcnJvciAwIChnZW5lcmljKSAqLworI2RlZmluZSBJUlFfRE1BUjBfQkxLCQlCRklOX0lSUSgyKQkvKiBETUFSMCBCbG9jayBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSVJRX0RNQVIxX0JMSwkJQkZJTl9JUlEoMykJLyogRE1BUjEgQmxvY2sgSW50ZXJydXB0ICovCisjZGVmaW5lIElSUV9ETUFSMF9PVlIJCUJGSU5fSVJRKDQpCS8qIERNQVIwIE92ZXJmbG93IEVycm9yICovCisjZGVmaW5lIElSUV9ETUFSMV9PVlIJCUJGSU5fSVJRKDUpCS8qIERNQVIxIE92ZXJmbG93IEVycm9yICovCisjZGVmaW5lIElSUV9QUElfRVJST1IJCUJGSU5fSVJRKDYpCS8qIFBQSSBFcnJvciAqLworI2RlZmluZSBJUlFfTUFDX0VSUk9SCQlCRklOX0lSUSg3KQkvKiBNQUMgU3RhdHVzICovCisjZGVmaW5lIElSUV9TUE9SVDBfRVJST1IJQkZJTl9JUlEoOCkJLyogU1BPUlQwIFN0YXR1cyAqLworI2RlZmluZSBJUlFfU1BPUlQxX0VSUk9SCUJGSU5fSVJRKDkpCS8qIFNQT1JUMSBTdGF0dXMgKi8KKyNkZWZpbmUgSVJRX1BUUF9FUlJPUgkJQkZJTl9JUlEoMTApCS8qIFBUUCBFcnJvciBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSVJRX1VBUlQwX0VSUk9SCQlCRklOX0lSUSgxMikJLyogVUFSVDAgU3RhdHVzICovCisjZGVmaW5lIElSUV9VQVJUMV9FUlJPUgkJQkZJTl9JUlEoMTMpCS8qIFVBUlQxIFN0YXR1cyAqLworI2RlZmluZSBJUlFfUlRDCQkJQkZJTl9JUlEoMTQpCS8qIFJUQyAqLworI2RlZmluZSBJUlFfUFBJICAgICAgCQlCRklOX0lSUSgxNSkJLyogRE1BIENoYW5uZWwgMCAoUFBJKSAqLworI2RlZmluZSBJUlFfU1BPUlQwX1JYCQlCRklOX0lSUSgxNikJLyogRE1BIDMgQ2hhbm5lbCAoU1BPUlQwIFJYKSAqLworI2RlZmluZSBJUlFfU1BPUlQwX1RYCQlCRklOX0lSUSgxNykJLyogRE1BIDQgQ2hhbm5lbCAoU1BPUlQwIFRYKSAqLworI2RlZmluZSBJUlFfUlNJCQkJQkZJTl9JUlEoMTcpCS8qIERNQSA0IENoYW5uZWwgKFJTSSkgKi8KKyNkZWZpbmUgSVJRX1NQT1JUMV9SWAkJQkZJTl9JUlEoMTgpCS8qIERNQSA1IENoYW5uZWwgKFNQT1JUMSBSWC9TUEkpICovCisjZGVmaW5lIElSUV9TUEkxCQlCRklOX0lSUSgxOCkJLyogRE1BIDUgQ2hhbm5lbCAoU1BJMSkgKi8KKyNkZWZpbmUgSVJRX1NQT1JUMV9UWAkJQkZJTl9JUlEoMTkpCS8qIERNQSA2IENoYW5uZWwgKFNQT1JUMSBUWCkgKi8KKyNkZWZpbmUgSVJRX1RXSSAgICAgIAkJQkZJTl9JUlEoMjApCS8qIFRXSSAqLworI2RlZmluZSBJUlFfU1BJMCAgICAgCQlCRklOX0lSUSgyMSkJLyogRE1BIDcgQ2hhbm5lbCAoU1BJMCkgKi8KKyNkZWZpbmUgSVJRX1VBUlQwX1JYIAkJQkZJTl9JUlEoMjIpCS8qIERNQTggQ2hhbm5lbCAoVUFSVDAgUlgpICovCisjZGVmaW5lIElSUV9VQVJUMF9UWCAJCUJGSU5fSVJRKDIzKQkvKiBETUE5IENoYW5uZWwgKFVBUlQwIFRYKSAqLworI2RlZmluZSBJUlFfVUFSVDFfUlggCQlCRklOX0lSUSgyNCkJLyogRE1BMTAgQ2hhbm5lbCAoVUFSVDEgUlgpICovCisjZGVmaW5lIElSUV9VQVJUMV9UWCAJCUJGSU5fSVJRKDI1KQkvKiBETUExMSBDaGFubmVsIChVQVJUMSBUWCkgKi8KKyNkZWZpbmUgSVJRX09QVFNFQyAgIAkJQkZJTl9JUlEoMjYpCS8qIE9UUFNFQyBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSVJRX0NOVCAgIAkJQkZJTl9JUlEoMjcpCS8qIEdQIENvdW50ZXIgKi8KKyNkZWZpbmUgSVJRX01BQ19SWCAgIAkJQkZJTl9JUlEoMjgpCS8qIERNQTEgQ2hhbm5lbCAoTUFDIFJYKSAqLworI2RlZmluZSBJUlFfUE9SVEhfSU5UQSAgIAlCRklOX0lSUSgyOSkJLyogUG9ydCBIIEludGVycnVwdCBBICovCisjZGVmaW5lIElSUV9NQUNfVFgJCUJGSU5fSVJRKDMwKQkvKiBETUEyIENoYW5uZWwgKE1BQyBUWCkgKi8KKyNkZWZpbmUgSVJRX1BPUlRIX0lOVEIJCUJGSU5fSVJRKDMxKQkvKiBQb3J0IEggSW50ZXJydXB0IEIgKi8KKyNkZWZpbmUgSVJRX1RJTUVSMAkJQkZJTl9JUlEoMzIpCS8qIFRpbWVyIDAgKi8KKyNkZWZpbmUgSVJRX1RJTUVSMQkJQkZJTl9JUlEoMzMpCS8qIFRpbWVyIDEgKi8KKyNkZWZpbmUgSVJRX1RJTUVSMgkJQkZJTl9JUlEoMzQpCS8qIFRpbWVyIDIgKi8KKyNkZWZpbmUgSVJRX1RJTUVSMwkJQkZJTl9JUlEoMzUpCS8qIFRpbWVyIDMgKi8KKyNkZWZpbmUgSVJRX1RJTUVSNAkJQkZJTl9JUlEoMzYpCS8qIFRpbWVyIDQgKi8KKyNkZWZpbmUgSVJRX1RJTUVSNQkJQkZJTl9JUlEoMzcpCS8qIFRpbWVyIDUgKi8KKyNkZWZpbmUgSVJRX1RJTUVSNgkJQkZJTl9JUlEoMzgpCS8qIFRpbWVyIDYgKi8KKyNkZWZpbmUgSVJRX1RJTUVSNwkJQkZJTl9JUlEoMzkpCS8qIFRpbWVyIDcgKi8KKyNkZWZpbmUgSVJRX1BPUlRHX0lOVEEJCUJGSU5fSVJRKDQwKQkvKiBQb3J0IEcgSW50ZXJydXB0IEEgKi8KKyNkZWZpbmUgSVJRX1BPUlRHX0lOVEIJCUJGSU5fSVJRKDQxKQkvKiBQb3J0IEcgSW50ZXJydXB0IEIgKi8KKyNkZWZpbmUgSVJRX01FTV9ETUEwCQlCRklOX0lSUSg0MikJLyogTURNQSBTdHJlYW0gMCAqLworI2RlZmluZSBJUlFfTUVNX0RNQTEJCUJGSU5fSVJRKDQzKQkvKiBNRE1BIFN0cmVhbSAxICovCisjZGVmaW5lIElSUV9XQVRDSAkJQkZJTl9JUlEoNDQpCS8qIFNvZnR3YXJlIFdhdGNoZG9nIFRpbWVyICovCisjZGVmaW5lIElSUV9QT1JURl9JTlRBCQlCRklOX0lSUSg0NSkJLyogUG9ydCBGIEludGVycnVwdCBBICovCisjZGVmaW5lIElSUV9QT1JURl9JTlRCCQlCRklOX0lSUSg0NikJLyogUG9ydCBGIEludGVycnVwdCBCICovCisjZGVmaW5lIElSUV9TUEkwX0VSUk9SCQlCRklOX0lSUSg0NykJLyogU1BJMCBTdGF0dXMgKi8KKyNkZWZpbmUgSVJRX1NQSTFfRVJST1IJCUJGSU5fSVJRKDQ4KQkvKiBTUEkxIEVycm9yICovCisjZGVmaW5lIElSUV9SU0lfSU5UMAkJQkZJTl9JUlEoNTEpCS8qIFJTSSBJbnRlcnJ1cHQwICovCisjZGVmaW5lIElSUV9SU0lfSU5UMQkJQkZJTl9JUlEoNTIpCS8qIFJTSSBJbnRlcnJ1cHQxICovCisjZGVmaW5lIElSUV9QV01fVFJJUAkJQkZJTl9JUlEoNTMpCS8qIFBXTSBUcmlwIEludGVycnVwdCAqLworI2RlZmluZSBJUlFfUFdNX1NZTkMJCUJGSU5fSVJRKDU0KQkvKiBQV00gU3luYyBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSVJRX1BUUF9TVEFUCQlCRklOX0lSUSg1NSkJLyogUFRQIFN0YXQgSW50ZXJydXB0ICovCisKKyNkZWZpbmUgU1lTX0lSUVMgICAgICAgIAlCRklOX0lSUSg2MykJLyogNzAgKi8KKworI2RlZmluZSBJUlFfUEYwICAgICAgICAgNzEKKyNkZWZpbmUgSVJRX1BGMSAgICAgICAgIDcyCisjZGVmaW5lIElSUV9QRjIgICAgICAgICA3MworI2RlZmluZSBJUlFfUEYzICAgICAgICAgNzQKKyNkZWZpbmUgSVJRX1BGNCAgICAgICAgIDc1CisjZGVmaW5lIElSUV9QRjUgICAgICAgICA3NgorI2RlZmluZSBJUlFfUEY2ICAgICAgICAgNzcKKyNkZWZpbmUgSVJRX1BGNyAgICAgICAgIDc4CisjZGVmaW5lIElSUV9QRjggICAgICAgICA3OQorI2RlZmluZSBJUlFfUEY5ICAgICAgICAgODAKKyNkZWZpbmUgSVJRX1BGMTAgICAgICAgIDgxCisjZGVmaW5lIElSUV9QRjExICAgICAgICA4MgorI2RlZmluZSBJUlFfUEYxMiAgICAgICAgODMKKyNkZWZpbmUgSVJRX1BGMTMgICAgICAgIDg0CisjZGVmaW5lIElSUV9QRjE0ICAgICAgICA4NQorI2RlZmluZSBJUlFfUEYxNSAgICAgICAgODYKKworI2RlZmluZSBJUlFfUEcwICAgICAgICAgODcKKyNkZWZpbmUgSVJRX1BHMSAgICAgICAgIDg4CisjZGVmaW5lIElSUV9QRzIgICAgICAgICA4OQorI2RlZmluZSBJUlFfUEczICAgICAgICAgOTAKKyNkZWZpbmUgSVJRX1BHNCAgICAgICAgIDkxCisjZGVmaW5lIElSUV9QRzUgICAgICAgICA5MgorI2RlZmluZSBJUlFfUEc2ICAgICAgICAgOTMKKyNkZWZpbmUgSVJRX1BHNyAgICAgICAgIDk0CisjZGVmaW5lIElSUV9QRzggICAgICAgICA5NQorI2RlZmluZSBJUlFfUEc5ICAgICAgICAgOTYKKyNkZWZpbmUgSVJRX1BHMTAgICAgICAgIDk3CisjZGVmaW5lIElSUV9QRzExICAgICAgICA5OAorI2RlZmluZSBJUlFfUEcxMiAgICAgICAgOTkKKyNkZWZpbmUgSVJRX1BHMTMgICAgICAgIDEwMAorI2RlZmluZSBJUlFfUEcxNCAgICAgICAgMTAxCisjZGVmaW5lIElSUV9QRzE1ICAgICAgICAxMDIKKworI2RlZmluZSBJUlFfUEgwICAgICAgICAgMTAzCisjZGVmaW5lIElSUV9QSDEgICAgICAgICAxMDQKKyNkZWZpbmUgSVJRX1BIMiAgICAgICAgIDEwNQorI2RlZmluZSBJUlFfUEgzICAgICAgICAgMTA2CisjZGVmaW5lIElSUV9QSDQgICAgICAgICAxMDcKKyNkZWZpbmUgSVJRX1BINSAgICAgICAgIDEwOAorI2RlZmluZSBJUlFfUEg2ICAgICAgICAgMTA5CisjZGVmaW5lIElSUV9QSDcgICAgICAgICAxMTAKKyNkZWZpbmUgSVJRX1BIOCAgICAgICAgIDExMQorI2RlZmluZSBJUlFfUEg5ICAgICAgICAgMTEyCisjZGVmaW5lIElSUV9QSDEwICAgICAgICAxMTMKKyNkZWZpbmUgSVJRX1BIMTEgICAgICAgIDExNAorI2RlZmluZSBJUlFfUEgxMiAgICAgICAgMTE1CisjZGVmaW5lIElSUV9QSDEzICAgICAgICAxMTYKKyNkZWZpbmUgSVJRX1BIMTQgICAgICAgIDExNworI2RlZmluZSBJUlFfUEgxNSAgICAgICAgMTE4CisKKyNkZWZpbmUgR1BJT19JUlFfQkFTRQlJUlFfUEYwCisKKyNkZWZpbmUgTlJfSVJRUyAgICAgKElSUV9QSDE1ICsgMSkKKworI2RlZmluZSBJVkc3ICAgICAgICAgICAgNworI2RlZmluZSBJVkc4ICAgICAgICAgICAgOAorI2RlZmluZSBJVkc5ICAgICAgICAgICAgOQorI2RlZmluZSBJVkcxMCAgICAgICAgICAgMTAKKyNkZWZpbmUgSVZHMTEgICAgICAgICAgIDExCisjZGVmaW5lIElWRzEyICAgICAgICAgICAxMgorI2RlZmluZSBJVkcxMyAgICAgICAgICAgMTMKKyNkZWZpbmUgSVZHMTQgICAgICAgICAgIDE0CisjZGVmaW5lIElWRzE1ICAgICAgICAgICAxNQorCisvKiBJQVIwIEJJVCBGSUVMRFMgKi8KKyNkZWZpbmUgSVJRX1BMTF9XQUtFVVBfUE9TCTAKKyNkZWZpbmUgSVJRX0RNQTBfRVJST1JfUE9TCTQKKyNkZWZpbmUgSVJRX0RNQVIwX0JMS19QT1MgCTgKKyNkZWZpbmUgSVJRX0RNQVIxX0JMS19QT1MgCTEyCisjZGVmaW5lIElSUV9ETUFSMF9PVlJfUE9TIAkxNgorI2RlZmluZSBJUlFfRE1BUjFfT1ZSX1BPUyAJMjAKKyNkZWZpbmUgSVJRX1BQSV9FUlJPUl9QT1MgCTI0CisjZGVmaW5lIElSUV9NQUNfRVJST1JfUE9TIAkyOAorCisvKiBJQVIxIEJJVCBGSUVMRFMgKi8KKyNkZWZpbmUgSVJRX1NQT1JUMF9FUlJPUl9QT1MJMAorI2RlZmluZSBJUlFfU1BPUlQxX0VSUk9SX1BPUwk0CisjZGVmaW5lIElSUV9QVFBfRVJST1JfUE9TCTgKKyNkZWZpbmUgSVJRX1VBUlQwX0VSUk9SX1BPUyAJMTYKKyNkZWZpbmUgSVJRX1VBUlQxX0VSUk9SX1BPUyAJMjAKKyNkZWZpbmUgSVJRX1JUQ19QT1MgICAgICAgICAJMjQKKyNkZWZpbmUgSVJRX1BQSV9QT1MgICAgICAgICAJMjgKKworLyogSUFSMiBCSVQgRklFTERTICovCisjZGVmaW5lIElSUV9TUE9SVDBfUlhfUE9TCTAKKyNkZWZpbmUgSVJRX1NQT1JUMF9UWF9QT1MJNAorI2RlZmluZSBJUlFfUlNJX1BPUwkJNAorI2RlZmluZSBJUlFfU1BPUlQxX1JYX1BPUwk4CisjZGVmaW5lIElSUV9TUEkxX1BPUwkJOAorI2RlZmluZSBJUlFfU1BPUlQxX1RYX1BPUwkxMgorI2RlZmluZSBJUlFfVFdJX1BPUyAgICAgIAkxNgorI2RlZmluZSBJUlFfU1BJMF9QT1MgICAgICAJMjAKKyNkZWZpbmUgSVJRX1VBUlQwX1JYX1BPUyAJMjQKKyNkZWZpbmUgSVJRX1VBUlQwX1RYX1BPUyAJMjgKKworLyogSUFSMyBCSVQgRklFTERTICovCisjZGVmaW5lIElSUV9VQVJUMV9SWF9QT1MgIAkwCisjZGVmaW5lIElSUV9VQVJUMV9UWF9QT1MgIAk0CisjZGVmaW5lIElSUV9PUFRTRUNfUE9TICAgIAk4CisjZGVmaW5lIElSUV9DTlRfUE9TICAgICAgIAkxMgorI2RlZmluZSBJUlFfTUFDX1JYX1BPUyAgICAJMTYKKyNkZWZpbmUgSVJRX1BPUlRIX0lOVEFfUE9TCTIwCisjZGVmaW5lIElSUV9NQUNfVFhfUE9TICAgIAkyNAorI2RlZmluZSBJUlFfUE9SVEhfSU5UQl9QT1MJMjgKKworLyogSUFSNCBCSVQgRklFTERTICovCisjZGVmaW5lIElSUV9USU1FUjBfUE9TCQkwCisjZGVmaW5lIElSUV9USU1FUjFfUE9TCQk0CisjZGVmaW5lIElSUV9USU1FUjJfUE9TCQk4CisjZGVmaW5lIElSUV9USU1FUjNfUE9TCQkxMgorI2RlZmluZSBJUlFfVElNRVI0X1BPUwkJMTYKKyNkZWZpbmUgSVJRX1RJTUVSNV9QT1MJCTIwCisjZGVmaW5lIElSUV9USU1FUjZfUE9TCQkyNAorI2RlZmluZSBJUlFfVElNRVI3X1BPUwkJMjgKKworLyogSUFSNSBCSVQgRklFTERTICovCisjZGVmaW5lIElSUV9QT1JUR19JTlRBX1BPUwkwCisjZGVmaW5lIElSUV9QT1JUR19JTlRCX1BPUwk0CisjZGVmaW5lIElSUV9NRU1fRE1BMF9QT1MgIAk4CisjZGVmaW5lIElSUV9NRU1fRE1BMV9QT1MgIAkxMgorI2RlZmluZSBJUlFfV0FUQ0hfUE9TICAgICAJMTYKKyNkZWZpbmUgSVJRX1BPUlRGX0lOVEFfUE9TCTIwCisjZGVmaW5lIElSUV9QT1JURl9JTlRCX1BPUwkyNAorI2RlZmluZSBJUlFfU1BJMF9FUlJPUl9QT1MgCTI4CisKKy8qIElBUjYgQklUIEZJRUxEUyAqLworI2RlZmluZSBJUlFfU1BJMV9FUlJPUl9QT1MgIAkwCisjZGVmaW5lIElSUV9SU0lfSU5UMF9QT1MgICAJMTIKKyNkZWZpbmUgSVJRX1JTSV9JTlQxX1BPUyAgIAkxNgorI2RlZmluZSBJUlFfUFdNX1RSSVBfUE9TICAgCTIwCisjZGVmaW5lIElSUV9QV01fU1lOQ19QT1MgICAJMjQKKyNkZWZpbmUgSVJRX1BUUF9TVEFUX1BPUyAgICAJMjgKKworI2VuZGlmCQkJCS8qIF9CRjUxOF9JUlFfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvbWVtX21hcC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9tZW1fbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJiY2M3OAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvbWVtX21hcC5oCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogZmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTE4L21lbV9tYXAuaAorICogYmFzZWQgb246CWluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MjcvbWVtX21hcC5oCisgKiBhdXRob3I6CUJyeWFuIFd1IDxjb29sb25leUBrZXJuZWwub3JnPgorICoKKyAqIGNyZWF0ZWQ6CisgKiBkZXNjcmlwdGlvbjoKKyAqCU1lbW9yeSBNQVAgQ29tbW9uIGhlYWRlciBmaWxlIGZvciBibGFja2ZpbiBCRjUxOC82LzQvMiBvZiBwcm9jZXNzb3JzLgorICogcmV2OgorICoKKyAqIG1vZGlmaWVkOgorICoKKyAqIGJ1Z3M6ICAgICAgICAgZW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogdGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgZ251IGdlbmVyYWwgcHVibGljIGxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgZnJlZSBzb2Z0d2FyZSBmb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiB0aGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCB3aXRob3V0IGFueSB3YXJyYW50eTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuICBzZWUgdGhlCisgKiBnbnUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIGdudSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIGNvcHlpbmcuCisgKiBpZiBub3QsIHdyaXRlIHRvIHRoZSBmcmVlIHNvZnR3YXJlIGZvdW5kYXRpb24sCisgKiA1OSB0ZW1wbGUgcGxhY2UgLSBzdWl0ZSAzMzAsIGJvc3RvbiwgbWEgMDIxMTEtMTMwNywgdXNhLgorICovCisKKyNpZm5kZWYgX01FTV9NQVBfNTE4X0hfCisjZGVmaW5lIF9NRU1fTUFQXzUxOF9IXworCisjZGVmaW5lIENPUkVNTVJfQkFTRSAgICAgICAgICAgMHhGRkUwMDAwMAkvKiBDb3JlIE1NUnMgKi8KKyNkZWZpbmUgU1lTTU1SX0JBU0UgICAgICAgICAgICAweEZGQzAwMDAwCS8qIFN5c3RlbSBNTVJzICovCisKKy8qIEFzeW5jIE1lbW9yeSBCYW5rcyAqLworI2RlZmluZSBBU1lOQ19CQU5LM19CQVNFCTB4MjAzMDAwMDAJLyogQXN5bmMgQmFuayAzICovCisjZGVmaW5lIEFTWU5DX0JBTkszX1NJWkUJMHgwMDEwMDAwMAkvKiAxTSAqLworI2RlZmluZSBBU1lOQ19CQU5LMl9CQVNFCTB4MjAyMDAwMDAJLyogQXN5bmMgQmFuayAyICovCisjZGVmaW5lIEFTWU5DX0JBTksyX1NJWkUJMHgwMDEwMDAwMAkvKiAxTSAqLworI2RlZmluZSBBU1lOQ19CQU5LMV9CQVNFCTB4MjAxMDAwMDAJLyogQXN5bmMgQmFuayAxICovCisjZGVmaW5lIEFTWU5DX0JBTksxX1NJWkUJMHgwMDEwMDAwMAkvKiAxTSAqLworI2RlZmluZSBBU1lOQ19CQU5LMF9CQVNFCTB4MjAwMDAwMDAJLyogQXN5bmMgQmFuayAwICovCisjZGVmaW5lIEFTWU5DX0JBTkswX1NJWkUJMHgwMDEwMDAwMAkvKiAxTSAqLworCisvKiBCb290IFJPTSBNZW1vcnkgKi8KKworI2RlZmluZSBCT09UX1JPTV9TVEFSVAkJMHhFRjAwMDAwMAorI2RlZmluZSBCT09UX1JPTV9MRU5HVEgJCTB4ODAwMAorCisvKiBMZXZlbCAxIE1lbW9yeSAqLworCisvKiBNZW1vcnkgTWFwIGZvciBBRFNQLUJGNTE4LzYvNC8yIHByb2Nlc3NvcnMgKi8KKworI2lmZGVmIENPTkZJR19CRklOX0lDQUNIRQorI2RlZmluZSBCRklOX0lDQUNIRVNJWkUJCSgxNiAqIDEwMjQpCisjZWxzZQorI2RlZmluZSBCRklOX0lDQUNIRVNJWkUJCSgwKQorI2VuZGlmCisKKyNkZWZpbmUgTDFfQ09ERV9TVEFSVAkJMHhGRkEwMDAwMAorI2RlZmluZSBMMV9EQVRBX0FfU1RBUlQJCTB4RkY4MDAwMDAKKyNkZWZpbmUgTDFfREFUQV9CX1NUQVJUCQkweEZGOTAwMDAwCisKKyNkZWZpbmUgTDFfQ09ERV9MRU5HVEgJCTB4QzAwMAorCisjaWZkZWYgQ09ORklHX0JGSU5fRENBQ0hFCisKKyNpZmRlZiBDT05GSUdfQkZJTl9EQ0FDSEVfQkFOS0EKKyNkZWZpbmUgRE1FTV9DTlRSIChBQ0FDSEVfQlNSQU0gfCBFTkRDUExCIHwgUE9SVF9QUkVGMCkKKyNkZWZpbmUgTDFfREFUQV9BX0xFTkdUSAkoMHg4MDAwIC0gMHg0MDAwKQorI2RlZmluZSBMMV9EQVRBX0JfTEVOR1RICTB4ODAwMAorI2RlZmluZSBCRklOX0RDQUNIRVNJWkUJCSgxNiAqIDEwMjQpCisjZGVmaW5lIEJGSU5fRFNVUEJBTktTCQkxCisjZWxzZQorI2RlZmluZSBETUVNX0NOVFIgKEFDQUNIRV9CQ0FDSEUgfCBFTkRDUExCIHwgUE9SVF9QUkVGMCkKKyNkZWZpbmUgTDFfREFUQV9BX0xFTkdUSAkoMHg4MDAwIC0gMHg0MDAwKQorI2RlZmluZSBMMV9EQVRBX0JfTEVOR1RICSgweDgwMDAgLSAweDQwMDApCisjZGVmaW5lIEJGSU5fRENBQ0hFU0laRQkJKDMyICogMTAyNCkKKyNkZWZpbmUgQkZJTl9EU1VQQkFOS1MJCTIKKyNlbmRpZgorCisjZWxzZQorI2RlZmluZSBETUVNX0NOVFIgKEFTUkFNX0JTUkFNIHwgRU5EQ1BMQiB8IFBPUlRfUFJFRjApCisjZGVmaW5lIEwxX0RBVEFfQV9MRU5HVEgJMHg4MDAwCisjZGVmaW5lIEwxX0RBVEFfQl9MRU5HVEgJMHg4MDAwCisjZGVmaW5lIEJGSU5fRENBQ0hFU0laRQkJMAorI2RlZmluZSBCRklOX0RTVVBCQU5LUwkJMAorI2VuZGlmCQkJCS8qQ09ORklHX0JGSU5fRENBQ0hFICovCisKKy8qIExldmVsIDIgTWVtb3J5IC0gbm9uZSAqLworCisjZGVmaW5lIEwyX1NUQVJUCTAKKyNkZWZpbmUgTDJfTEVOR1RICTAKKworLyogU2NyYXRjaCBQYWQgTWVtb3J5ICovCisKKyNkZWZpbmUgTDFfU0NSQVRDSF9TVEFSVAkweEZGQjAwMDAwCisjZGVmaW5lIEwxX1NDUkFUQ0hfTEVOR1RICTB4MTAwMAorCisjZGVmaW5lIEdFVF9QREFfU0FGRShwcmVnKQkJXAorCXByZWcubCA9IF9jcHVfcGRhOwkJXAorCXByZWcuaCA9IF9jcHVfcGRhOworCisjZGVmaW5lIEdFVF9QREEocHJlZywgZHJlZykJR0VUX1BEQV9TQUZFKHByZWcpCisKKyNlbmRpZgkJCQkvKiBfTUVNX01BUF81MThfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvcG9ydG11eC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9wb3J0bXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMxNmQ1NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvcG9ydG11eC5oCkBAIC0wLDAgKzEsMTg4IEBACisjaWZuZGVmIF9NQUNIX1BPUlRNVVhfSF8KKyNkZWZpbmUgX01BQ0hfUE9SVE1VWF9IXworCisjZGVmaW5lIE1BWF9SRVNPVVJDRVMgCU1BWF9CTEFDS0ZJTl9HUElPUworCisvKiBFTUFDIE1JSS9STUlJIFBvcnQgTXV4ICovCisjZGVmaW5lIFBfTUlJMF9FVHhEMgkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMCkgfCBQX0ZVTkNUKDApKQorI2RlZmluZSBQX01JSTBfRVJ4RDIJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjEpIHwgUF9GVU5DVCgwKSkKKyNkZWZpbmUgUF9NSUkwX0VUeEQzCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYyKSB8IFBfRlVOQ1QoMCkpCisjZGVmaW5lIFBfTUlJMF9FUnhEMwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMykgfCBQX0ZVTkNUKDApKQorI2RlZmluZSBQX01JSTBfRVJ4Q0xLCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEY0KSB8IFBfRlVOQ1QoMCkpCisjZGVmaW5lIFBfTUlJMF9FUnhEVgkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGNSkgfCBQX0ZVTkNUKDApKQorI2RlZmluZSBQX01JSTBfQ09MCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEY2KSB8IFBfRlVOQ1QoMCkpCisKKyNkZWZpbmUgUF9NSUkwX01EQwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGOCkgfCBQX0ZVTkNUKDApKQorI2RlZmluZSBQX01JSTBfTURJTwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGOSkgfCBQX0ZVTkNUKDApKQorI2RlZmluZSBQX01JSTBfRVR4RDAJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjEwKSB8IFBfRlVOQ1QoMCkpCisjZGVmaW5lIFBfTUlJMF9FUnhEMAkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMTEpIHwgUF9GVU5DVCgwKSkKKyNkZWZpbmUgUF9NSUkwX0VUeEQxCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYxMikgfCBQX0ZVTkNUKDApKQorI2RlZmluZSBQX01JSTBfRVJ4RDEJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjEzKSB8IFBfRlVOQ1QoMCkpCisjZGVmaW5lIFBfTUlJMF9FVHhFTgkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMTQpIHwgUF9GVU5DVCgwKSkKKyNkZWZpbmUgUF9NSUkwX1BIWUlOVAkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMTUpIHwgUF9GVU5DVCgwKSkKKyNkZWZpbmUgUF9NSUkwX0NSUwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHMCkgfCBQX0ZVTkNUKDApKQorI2RlZmluZSBQX01JSTBfRVJ4RVIJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzEpIHwgUF9GVU5DVCgwKSkKKyNkZWZpbmUgUF9NSUkwX1R4Q0xLCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEcyKSB8IFBfRlVOQ1QoMCkpCisKKyNkZWZpbmUgUF9NSUkwIHtcCisJUF9NSUkwX0VUeEQwLCBcCisJUF9NSUkwX0VUeEQxLCBcCisJUF9NSUkwX0VUeEQyLCBcCisJUF9NSUkwX0VUeEQzLCBcCisJUF9NSUkwX0VUeEVOLCBcCisJUF9NSUkwX1R4Q0xLLCBcCisJUF9NSUkwX1BIWUlOVCwgXAorCVBfTUlJMF9DT0wsIFwKKwlQX01JSTBfRVJ4RDAsIFwKKwlQX01JSTBfRVJ4RDEsIFwKKwlQX01JSTBfRVJ4RDIsIFwKKwlQX01JSTBfRVJ4RDMsIFwKKwlQX01JSTBfRVJ4RFYsIFwKKwlQX01JSTBfRVJ4Q0xLLCBcCisJUF9NSUkwX0VSeEVSLCBcCisJUF9NSUkwX0NSUywgXAorCVBfTUlJMF9NREMsIFwKKwlQX01JSTBfTURJTywgMH0KKworI2RlZmluZSBQX1JNSUkwIHtcCisJUF9NSUkwX0VUeEQwLCBcCisJUF9NSUkwX0VUeEQxLCBcCisJUF9NSUkwX0VUeEVOLCBcCisJUF9NSUkwX0VSeEQwLCBcCisJUF9NSUkwX0VSeEQxLCBcCisJUF9NSUkwX0VSeEVSLCBcCisJUF9NSUkwX1R4Q0xLLCBcCisJUF9NSUkwX1BIWUlOVCwgXAorCVBfTUlJMF9DUlMsIFwKKwlQX01JSTBfTURDLCBcCisJUF9NSUkwX01ESU8sIDB9CisKKy8qIFBQSSBQb3J0IE11eCAqLworI2RlZmluZSBQX1BQSTBfRDAJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjApIHwgUF9GVU5DVCgxKSkKKyNkZWZpbmUgUF9QUEkwX0QxCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYxKSB8IFBfRlVOQ1QoMSkpCisjZGVmaW5lIFBfUFBJMF9EMgkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMikgfCBQX0ZVTkNUKDEpKQorI2RlZmluZSBQX1BQSTBfRDMJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjMpIHwgUF9GVU5DVCgxKSkKKyNkZWZpbmUgUF9QUEkwX0Q0CShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEY0KSB8IFBfRlVOQ1QoMSkpCisjZGVmaW5lIFBfUFBJMF9ENQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGNSkgfCBQX0ZVTkNUKDEpKQorI2RlZmluZSBQX1BQSTBfRDYJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjYpIHwgUF9GVU5DVCgxKSkKKyNkZWZpbmUgUF9QUEkwX0Q3CShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEY3KSB8IFBfRlVOQ1QoMSkpCisjZGVmaW5lIFBfUFBJMF9EOAkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGOCkgfCBQX0ZVTkNUKDEpKQorI2RlZmluZSBQX1BQSTBfRDkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjkpIHwgUF9GVU5DVCgxKSkKKyNkZWZpbmUgUF9QUEkwX0QxMAkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMTApIHwgUF9GVU5DVCgxKSkKKyNkZWZpbmUgUF9QUEkwX0QxMQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMTEpIHwgUF9GVU5DVCgxKSkKKyNkZWZpbmUgUF9QUEkwX0QxMgkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMTIpIHwgUF9GVU5DVCgxKSkKKyNkZWZpbmUgUF9QUEkwX0QxMwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMTMpIHwgUF9GVU5DVCgxKSkKKyNkZWZpbmUgUF9QUEkwX0QxNAkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMTQpIHwgUF9GVU5DVCgxKSkKKyNkZWZpbmUgUF9QUEkwX0QxNQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMTUpIHwgUF9GVU5DVCgxKSkKKworI2RlZmluZSBQX1BQSTBfQ0xLCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEcxMikgfCBQX0ZVTkNUKDEpKQorI2RlZmluZSBQX1BQSTBfRlMxCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEcxMykgfCBQX0ZVTkNUKDEpKQorI2RlZmluZSBQX1BQSTBfRlMyCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEcxNCkgfCBQX0ZVTkNUKDEpKQorI2RlZmluZSBQX1BQSTBfRlMzCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEcxNSkgfCBQX0ZVTkNUKDEpKQorCisvKiBTUEkgUG9ydCBNdXggKi8KKyNkZWZpbmUgUF9TUEkwX1NTCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEcxMSkgfCBQX0ZVTkNUKDApKQorI2RlZmluZSBQX1NQSTBfU0NLCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEcxMikgfCBQX0ZVTkNUKDApKQorI2RlZmluZSBQX1NQSTBfTUlTTwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHMTMpIHwgUF9GVU5DVCgwKSkKKyNkZWZpbmUgUF9TUEkwX01PU0kJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzE0KSB8IFBfRlVOQ1QoMCkpCisKKyNkZWZpbmUgUF9TUEkwX1NTRUwxCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEY3KSB8IFBfRlVOQ1QoMCkpCisjZGVmaW5lIFBfU1BJMF9TU0VMMgkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHMTUpIHwgUF9GVU5DVCgwKSkKKyNkZWZpbmUgUF9TUEkwX1NTRUwzCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEg0KSB8IFBfRlVOQ1QoMikpCisjZGVmaW5lIFBfU1BJMF9TU0VMNAkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHMTApIHwgUF9GVU5DVCgyKSkKKyNkZWZpbmUgUF9TUEkwX1NTRUw1CShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEczKSB8IFBfRlVOQ1QoMikpCisKKyNkZWZpbmUgUF9TUEkxX1NTCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEgwKSB8IFBfRlVOQ1QoMSkpCisjZGVmaW5lIFBfU1BJMV9TQ0sJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QSDEpIHwgUF9GVU5DVCgxKSkKKyNkZWZpbmUgUF9TUEkxX01JU08JKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QSDIpIHwgUF9GVU5DVCgxKSkKKyNkZWZpbmUgUF9TUEkxX01PU0kJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QSDMpIHwgUF9GVU5DVCgxKSkKKworI2RlZmluZSBQX1NQSTFfU1NFTDEJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QSDYpIHwgUF9GVU5DVCgyKSkKKyNkZWZpbmUgUF9TUEkxX1NTRUwyCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYwKSB8IFBfRlVOQ1QoMikpCisjZGVmaW5lIFBfU1BJMV9TU0VMMwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHMCkgfCBQX0ZVTkNUKDIpKQorI2RlZmluZSBQX1NQSTFfU1NFTDQJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjgpIHwgUF9GVU5DVCgyKSkKKyNkZWZpbmUgUF9TUEkxX1NTRUw1CShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEcxMSkgfCBQX0ZVTkNUKDIpKQorCisvKiBTUE9SVCBQb3J0IE11eCAqLworI2RlZmluZSBQX1NQT1JUMF9EUlBSSQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHMykgfCBQX0ZVTkNUKDApKQorI2RlZmluZSBQX1NQT1JUMF9SU0NMSwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHNCkgfCBQX0ZVTkNUKDApKQorI2RlZmluZSBQX1NQT1JUMF9SRlMJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzUpIHwgUF9GVU5DVCgwKSkKKyNkZWZpbmUgUF9TUE9SVDBfVEZTCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEc2KSB8IFBfRlVOQ1QoMCkpCisjZGVmaW5lIFBfU1BPUlQwX0RUUFJJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEc3KSB8IFBfRlVOQ1QoMCkpCisjZGVmaW5lIFBfU1BPUlQwX1RTQ0xLCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEc4KSB8IFBfRlVOQ1QoMCkpCisjZGVmaW5lIFBfU1BPUlQwX0RUU0VDCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEc5KSB8IFBfRlVOQ1QoMCkpCisjZGVmaW5lIFBfU1BPUlQwX0RSU0VDCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEcxMCkgfCBQX0ZVTkNUKDApKQorCisjZGVmaW5lIFBfU1BPUlQxX0RSUFJJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEgwKSB8IFBfRlVOQ1QoMCkpCisjZGVmaW5lIFBfU1BPUlQxX1JGUwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BIMSkgfCBQX0ZVTkNUKDApKQorI2RlZmluZSBQX1NQT1JUMV9SU0NMSwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BIMikgfCBQX0ZVTkNUKDApKQorI2RlZmluZSBQX1NQT1JUMV9EVFBSSQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BIMykgfCBQX0ZVTkNUKDApKQorI2RlZmluZSBQX1NQT1JUMV9URlMJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QSDQpIHwgUF9GVU5DVCgwKSkKKyNkZWZpbmUgUF9TUE9SVDFfVFNDTEsJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QSDUpIHwgUF9GVU5DVCgwKSkKKyNkZWZpbmUgUF9TUE9SVDFfRFRTRUMJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QSDYpIHwgUF9GVU5DVCgwKSkKKyNkZWZpbmUgUF9TUE9SVDFfRFJTRUMJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QSDcpIHwgUF9GVU5DVCgwKSkKKworLyogVUFSVCBQb3J0IE11eCAqLworI2RlZmluZSBQX1VBUlQwX1RYCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEc5KSB8IFBfRlVOQ1QoMSkpCisjZGVmaW5lIFBfVUFSVDBfUlgJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzEwKSB8IFBfRlVOQ1QoMSkpCisKKyNkZWZpbmUgUF9VQVJUMV9UWAkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BINikgfCBQX0ZVTkNUKDEpKQorI2RlZmluZSBQX1VBUlQxX1JYCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEg3KSB8IFBfRlVOQ1QoMSkpCisKKy8qIFRpbWVyICovCisjZGVmaW5lIFBfVE1SQ0xLCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEc1KSB8IFBfRlVOQ1QoMikpCisjZGVmaW5lIFBfVE1SMAkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzYpIHwgUF9GVU5DVCgyKSkKKyNkZWZpbmUgUF9UTVIxCQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHNykgfCBQX0ZVTkNUKDIpKQorI2RlZmluZSBQX1RNUjIJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEY5KSB8IFBfRlVOQ1QoMikpCisjZGVmaW5lIFBfVE1SMwkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjEwKSB8IFBfRlVOQ1QoMikpCisjZGVmaW5lIFBfVE1SNAkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzkpIHwgUF9GVU5DVCgyKSkKKyNkZWZpbmUgUF9UTVI1CQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHNCkgfCBQX0ZVTkNUKDIpKQorI2RlZmluZSBQX1RNUjYJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEc4KSB8IFBfRlVOQ1QoMikpCisjZGVmaW5lIFBfVE1SNwkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QSDcpIHwgUF9GVU5DVCgyKSkKKworLyogRE1BICovCisjZGVmaW5lIFBfRE1BUjEJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEcxKSB8IFBfRlVOQ1QoMSkpCisjZGVmaW5lIFBfRE1BUjAJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEcyKSB8IFBfRlVOQ1QoMSkpCisKKy8qIFRXSSAqLworI2RlZmluZSBQX1RXSTBfU0NMCShQX0RPTlRDQVJFKQorI2RlZmluZSBQX1RXSTBfU0RBCShQX0RPTlRDQVJFKQorCisvKiBQV00gKi8KKyNkZWZpbmUgUF9QV00wX0FICQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMSkgfCBQX0ZVTkNUKDIpKQorI2RlZmluZSBQX1BXTTBfQUwJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYyKSB8IFBfRlVOQ1QoMikpCisjZGVmaW5lIFBfUFdNMF9CSAkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjMpIHwgUF9GVU5DVCgyKSkKKyNkZWZpbmUgUF9QV00wX0JMCQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGNCkgfCBQX0ZVTkNUKDIpKQorI2RlZmluZSBQX1BXTTBfQ0gJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEY1KSB8IFBfRlVOQ1QoMikpCisjZGVmaW5lIFBfUFdNMF9DTAkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjYpIHwgUF9GVU5DVCgyKSkKKyNkZWZpbmUgUF9QV00wX1NZTkMJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEY3KSB8IFBfRlVOQ1QoMikpCisKKyNkZWZpbmUgUF9QV00xX0FICQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMTEpIHwgUF9GVU5DVCgyKSkKKyNkZWZpbmUgUF9QV00xX0FMCQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMTIpIHwgUF9GVU5DVCgyKSkKKyNkZWZpbmUgUF9QV00xX0JICQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMTMpIHwgUF9GVU5DVCgyKSkKKyNkZWZpbmUgUF9QV00xX0JMCQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMTQpIHwgUF9GVU5DVCgyKSkKKyNkZWZpbmUgUF9QV00xX0NICQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHMSkgfCBQX0ZVTkNUKDIpKQorI2RlZmluZSBQX1BXTTFfQ0wJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEcyKSB8IFBfRlVOQ1QoMikpCisjZGVmaW5lIFBfUFdNMV9TWU5DCQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMTUpIHwgUF9GVU5DVCgyKSkKKworI2RlZmluZSBQX1BXTV9UUklQQgkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzE0KSB8IFBfRlVOQ1QoMikpCisKKy8qIFJTSSAqLworI2RlZmluZSBQX1JTSV9EQVRBMAkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzMpIHwgUF9GVU5DVCgxKSkKKyNkZWZpbmUgUF9SU0lfREFUQTEJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEc0KSB8IFBfRlVOQ1QoMSkpCisjZGVmaW5lIFBfUlNJX0RBVEEyCQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHNSkgfCBQX0ZVTkNUKDEpKQorI2RlZmluZSBQX1JTSV9EQVRBMwkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzYpIHwgUF9GVU5DVCgxKSkKKyNkZWZpbmUgUF9SU0lfREFUQTQJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEgwKSB8IFBfRlVOQ1QoMikpCisjZGVmaW5lIFBfUlNJX0RBVEE1CQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BIMSkgfCBQX0ZVTkNUKDIpKQorI2RlZmluZSBQX1JTSV9EQVRBNgkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QSDIpIHwgUF9GVU5DVCgyKSkKKyNkZWZpbmUgUF9SU0lfREFUQTcJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEgzKSB8IFBfRlVOQ1QoMikpCisjZGVmaW5lIFBfUlNJX0NNRAkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzcpIHwgUF9GVU5DVCgxKSkKKyNkZWZpbmUgUF9SU0lfQ0xLCQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHOCkgfCBQX0ZVTkNUKDEpKQorCisvKiBQVFAgKi8KKyNkZWZpbmUgUF9QVFBfUFBTCQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHMTIpIHwgUF9GVU5DVCgyKSkKKyNkZWZpbmUgUF9QVFBfQ0xLT1VUCQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHMTMpIHwgUF9GVU5DVCgyKSkKKworI2RlZmluZSBQX0hXQUlUCQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHMDAwMDAwMDAwKSB8IFBfRlVOQ1QoMSkpCisKKyNlbmRpZgkJCQkvKiBfTUFDSF9QT1JUTVVYX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW50cy1wcmlvcml0eS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2ludHMtcHJpb3JpdHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTUxZmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2ludHMtcHJpb3JpdHkuYwpAQCAtMCwwICsxLDk5IEBACisvKgorICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW50cy1wcmlvcml0eS5jCisgKiBCYXNlZCBvbjogICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbnRzLXByaW9yaXR5LmMKKyAqIEF1dGhvcjogICAgICAgQnJ5YW4gV3UgPGNvb2xvbmV5QGtlcm5lbC5vcmc+CisgKgorICogQ3JlYXRlZDoKKyAqIERlc2NyaXB0aW9uOiAgU2V0IHVwIHRoZSBpbnRlcnJ1cHQgcHJpb3JpdGllcworICoKKyAqIE1vZGlmaWVkOgorICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA3IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCisgKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CisKK3ZvaWQgX19pbml0IHByb2dyYW1fSUFSKHZvaWQpCit7CisJLyogUHJvZ3JhbSB0aGUgSUFSMCBSZWdpc3RlciB3aXRoIHRoZSBjb25maWd1cmVkIHByaW9yaXR5ICovCisJYmZpbl93cml0ZV9TSUNfSUFSMCgoKENPTkZJR19JUlFfUExMX1dBS0VVUCAtIDcpIDw8IElSUV9QTExfV0FLRVVQX1BPUykgfAorCQkJKChDT05GSUdfSVJRX0RNQTBfRVJST1IgLSA3KSA8PCBJUlFfRE1BMF9FUlJPUl9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9ETUFSMF9CTEsgLSA3KSA8PCBJUlFfRE1BUjBfQkxLX1BPUykgfAorCQkJKChDT05GSUdfSVJRX0RNQVIxX0JMSyAtIDcpIDw8IElSUV9ETUFSMV9CTEtfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfRE1BUjBfT1ZSIC0gNykgPDwgSVJRX0RNQVIwX09WUl9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9ETUFSMV9PVlIgLSA3KSA8PCBJUlFfRE1BUjFfT1ZSX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1BQSV9FUlJPUiAtIDcpIDw8IElSUV9QUElfRVJST1JfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfTUFDX0VSUk9SIC0gNykgPDwgSVJRX01BQ19FUlJPUl9QT1MpKTsKKworCisJYmZpbl93cml0ZV9TSUNfSUFSMSgoKENPTkZJR19JUlFfU1BPUlQwX0VSUk9SIC0gNykgPDwgSVJRX1NQT1JUMF9FUlJPUl9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9TUE9SVDFfRVJST1IgLSA3KSA8PCBJUlFfU1BPUlQxX0VSUk9SX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1BUUF9FUlJPUiAtIDcpIDw8IElSUV9QVFBfRVJST1JfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVUFSVDBfRVJST1IgLSA3KSA8PCBJUlFfVUFSVDBfRVJST1JfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVUFSVDFfRVJST1IgLSA3KSA8PCBJUlFfVUFSVDFfRVJST1JfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfUlRDIC0gNykgPDwgSVJRX1JUQ19QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9QUEkgLSA3KSA8PCBJUlFfUFBJX1BPUykpOworCisJYmZpbl93cml0ZV9TSUNfSUFSMigoKENPTkZJR19JUlFfU1BPUlQwX1JYIC0gNykgPDwgSVJRX1NQT1JUMF9SWF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9TUE9SVDBfVFggLSA3KSA8PCBJUlFfU1BPUlQwX1RYX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1NQT1JUMV9SWCAtIDcpIDw8IElSUV9TUE9SVDFfUlhfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfU1BPUlQxX1RYIC0gNykgPDwgSVJRX1NQT1JUMV9UWF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9UV0kgLSA3KSA8PCBJUlFfVFdJX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1NQSTAgLSA3KSA8PCBJUlFfU1BJMF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9VQVJUMF9SWCAtIDcpIDw8IElSUV9VQVJUMF9SWF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9VQVJUMF9UWCAtIDcpIDw8IElSUV9VQVJUMF9UWF9QT1MpKTsKKworCWJmaW5fd3JpdGVfU0lDX0lBUjMoKChDT05GSUdfSVJRX1VBUlQxX1JYIC0gNykgPDwgSVJRX1VBUlQxX1JYX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1VBUlQxX1RYIC0gNykgPDwgSVJRX1VBUlQxX1RYX1BPUykgfAorCQkJKChDT05GSUdfSVJRX09QVFNFQyAtIDcpIDw8IElSUV9PUFRTRUNfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfQ05UIC0gNykgPDwgSVJRX0NOVF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9NQUNfUlggLSA3KSA8PCBJUlFfTUFDX1JYX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1BPUlRIX0lOVEEgLSA3KSA8PCBJUlFfUE9SVEhfSU5UQV9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9NQUNfVFggLSA3KSA8PCBJUlFfTUFDX1RYX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1BPUlRIX0lOVEIgLSA3KSA8PCBJUlFfUE9SVEhfSU5UQl9QT1MpKTsKKworCWJmaW5fd3JpdGVfU0lDX0lBUjQoKChDT05GSUdfSVJRX1RJTUVSMCAtIDcpIDw8IElSUV9USU1FUjBfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVElNRVIxIC0gNykgPDwgSVJRX1RJTUVSMV9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9USU1FUjIgLSA3KSA8PCBJUlFfVElNRVIyX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1RJTUVSMyAtIDcpIDw8IElSUV9USU1FUjNfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVElNRVI0IC0gNykgPDwgSVJRX1RJTUVSNF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9USU1FUjUgLSA3KSA8PCBJUlFfVElNRVI1X1BPUykgfAorCQkJKChDT05GSUdfSVJRX1RJTUVSNiAtIDcpIDw8IElSUV9USU1FUjZfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVElNRVI3IC0gNykgPDwgSVJRX1RJTUVSN19QT1MpKTsKKworCWJmaW5fd3JpdGVfU0lDX0lBUjUoKChDT05GSUdfSVJRX1BPUlRHX0lOVEEgLSA3KSA8PCBJUlFfUE9SVEdfSU5UQV9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9QT1JUR19JTlRCIC0gNykgPDwgSVJRX1BPUlRHX0lOVEJfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfTUVNX0RNQTAgLSA3KSA8PCBJUlFfTUVNX0RNQTBfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfTUVNX0RNQTEgLSA3KSA8PCBJUlFfTUVNX0RNQTFfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfV0FUQ0ggLSA3KSA8PCBJUlFfV0FUQ0hfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfUE9SVEZfSU5UQSAtIDcpIDw8IElSUV9QT1JURl9JTlRBX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1BPUlRGX0lOVEIgLSA3KSA8PCBJUlFfUE9SVEZfSU5UQl9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9TUEkwX0VSUk9SIC0gNykgPDwgSVJRX1NQSTBfRVJST1JfUE9TKSk7CisKKwliZmluX3dyaXRlX1NJQ19JQVI2KCgoQ09ORklHX0lSUV9TUEkxX0VSUk9SIC0gNykgPDwgSVJRX1NQSTFfRVJST1JfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfUlNJX0lOVDAgLSA3KSA8PCBJUlFfUlNJX0lOVDBfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfUlNJX0lOVDEgLSA3KSA8PCBJUlFfUlNJX0lOVDFfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfUFdNX1RSSVAgLSA3KSA8PCBJUlFfUFdNX1RSSVBfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfUFdNX1NZTkMgLSA3KSA8PCBJUlFfUFdNX1NZTkNfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfUFRQX1NUQVQgLSA3KSA8PCBJUlFfUFRQX1NUQVRfUE9TKSk7CisKKwlTU1lOQygpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L0tjb25maWcgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvS2NvbmZpZwppbmRleCAzY2RlNGJlLi44NDM4ZWM2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvS2NvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvS2NvbmZpZwpAQCAtMTY4LDI5ICsxNjgsMjkgQEAKIGNvbmZpZyBJUlFfUE9SVEhfSU5UQgogCWludCAiSVJRX1BPUlRIX0lOVEIiCiAJZGVmYXVsdCAxMQotY29uZmlnIElSUV9UTVIwCi0JaW50ICJJUlFfVE1SMCIKK2NvbmZpZyBJUlFfVElNRVIwCisJaW50ICJJUlFfVElNRVIwIgorCWRlZmF1bHQgOAorY29uZmlnIElSUV9USU1FUjEKKwlpbnQgIklSUV9USU1FUjEiCiAJZGVmYXVsdCAxMgotY29uZmlnIElSUV9UTVIxCi0JaW50ICJJUlFfVE1SMSIKK2NvbmZpZyBJUlFfVElNRVIyCisJaW50ICJJUlFfVElNRVIyIgogCWRlZmF1bHQgMTIKLWNvbmZpZyBJUlFfVE1SMgotCWludCAiSVJRX1RNUjIiCitjb25maWcgSVJRX1RJTUVSMworCWludCAiSVJRX1RJTUVSMyIKIAlkZWZhdWx0IDEyCi1jb25maWcgSVJRX1RNUjMKLQlpbnQgIklSUV9UTVIzIgorY29uZmlnIElSUV9USU1FUjQKKwlpbnQgIklSUV9USU1FUjQiCiAJZGVmYXVsdCAxMgotY29uZmlnIElSUV9UTVI0Ci0JaW50ICJJUlFfVE1SNCIKK2NvbmZpZyBJUlFfVElNRVI1CisJaW50ICJJUlFfVElNRVI1IgogCWRlZmF1bHQgMTIKLWNvbmZpZyBJUlFfVE1SNQotCWludCAiSVJRX1RNUjUiCitjb25maWcgSVJRX1RJTUVSNgorCWludCAiSVJRX1RJTUVSNiIKIAlkZWZhdWx0IDEyCi1jb25maWcgSVJRX1RNUjYKLQlpbnQgIklSUV9UTVI2IgotCWRlZmF1bHQgMTIKLWNvbmZpZyBJUlFfVE1SNwotCWludCAiSVJRX1RNUjciCitjb25maWcgSVJRX1RJTUVSNworCWludCAiSVJRX1RJTUVSNyIKIAlkZWZhdWx0IDEyCiBjb25maWcgSVJRX1BPUlRHX0lOVEEKIAlpbnQgIklSUV9QT1JUR19JTlRBIgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L01ha2VmaWxlIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L01ha2VmaWxlCmluZGV4IDRlZGRiNTguLjRhNmNkYWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9NYWtlZmlsZQorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvTWFrZWZpbGUKQEAgLTIsNiArMiw0IEBACiAjIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9NYWtlZmlsZQogIwogCi1leHRyYS15IDo9IGhlYWQubwotCiBvYmoteSA6PSBpbnRzLXByaW9yaXR5Lm8gZG1hLm8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvY21fYmY1MjcuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvY21fYmY1MjcuYwppbmRleCA5ZWE0NDBiLi5hMmMzNTc4IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2NtX2JmNTI3LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9jbV9iZjUyNy5jCkBAIC02MSw1MSArNjEsNDAgQEAKICAqICBEcml2ZXIgbmVlZHMgdG8ga25vdyBhZGRyZXNzLCBpcnEgYW5kIGZsYWcgcGluLgogICovCiAKLSNkZWZpbmUgSVNQMTc2MV9CQVNFICAgICAgIDB4MjAzQzAwMDAKLSNkZWZpbmUgSVNQMTc2MV9JUlEgICAgICAgIElSUV9QRjcKLQogI2lmIGRlZmluZWQoQ09ORklHX1VTQl9JU1AxNzYwX0hDRCkgfHwgZGVmaW5lZChDT05GSUdfVVNCX0lTUDE3NjBfSENEX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9pc3AxNzYxX3Jlc291cmNlc1tdID0geworI2luY2x1ZGUgPGxpbnV4L3VzYi9pc3AxNzYwLmg+CitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5faXNwMTc2MF9yZXNvdXJjZXNbXSA9IHsKIAlbMF0gPSB7Ci0JCS5uYW1lCT0gImlzcDE3NjEtcmVncyIsCi0JCS5zdGFydCAgPSBJU1AxNzYxX0JBU0UgKyAweDAwMDAwMDAwLAotCQkuZW5kICAgID0gSVNQMTc2MV9CQVNFICsgMHgwMDBmZmZmZiwKKwkJLnN0YXJ0ICA9IDB4MjAzQzAwMDAsCisJCS5lbmQgICAgPSAweDIwM0MwMDAwICsgMHgwMDBmZmZmZiwKIAkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJWzFdID0gewotCQkuc3RhcnQgID0gSVNQMTc2MV9JUlEsCi0JCS5lbmQgICAgPSBJU1AxNzYxX0lSUSwKKwkJLnN0YXJ0ICA9IElSUV9QRjcsCisJCS5lbmQgICAgPSBJUlFfUEY3LAogCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5faXNwMTc2MV9kZXZpY2UgPSB7Ci0JLm5hbWUgICAgICAgICAgID0gImlzcDE3NjEiLAorc3RhdGljIHN0cnVjdCBpc3AxNzYwX3BsYXRmb3JtX2RhdGEgaXNwMTc2MF9wcml2ID0geworCS5pc19pc3AxNzYxID0gMCwKKwkucG9ydDFfZGlzYWJsZSA9IDAsCisJLmJ1c193aWR0aF8xNiA9IDEsCisJLnBvcnQxX290ZyA9IDAsCisJLmFuYWxvZ19vYyA9IDAsCisJLmRhY2tfcG9sYXJpdHlfaGlnaCA9IDAsCisJLmRyZXFfcG9sYXJpdHlfaGlnaCA9IDAsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2lzcDE3NjBfZGV2aWNlID0geworCS5uYW1lICAgICAgICAgICA9ICJpc3AxNzYwLWhjZCIsCiAJLmlkICAgICAgICAgICAgID0gMCwKLQkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKGJmaW5faXNwMTc2MV9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZSAgICAgICA9IGJmaW5faXNwMTc2MV9yZXNvdXJjZXMsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmaXNwMTc2MF9wcml2LAorCX0sCisJLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShiZmluX2lzcDE3NjBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgICAgICAgPSBiZmluX2lzcDE3NjBfcmVzb3VyY2VzLAogfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmJmaW5faXNwMTc2MV9kZXZpY2VzW10gPSB7Ci0JJmJmaW5faXNwMTc2MV9kZXZpY2UsCi19OwotCi1pbnQgX19pbml0IGJmaW5faXNwMTc2MV9pbml0KHZvaWQpCi17Ci0JdW5zaWduZWQgaW50IG51bV9kZXZpY2VzID0gQVJSQVlfU0laRShiZmluX2lzcDE3NjFfZGV2aWNlcyk7Ci0KLQlwcmludGsoS0VSTl9JTkZPICIlcygpOiByZWdpc3RlcmluZyBkZXZpY2UgcmVzb3VyY2VzXG4iLCBfX2Z1bmNfXyk7Ci0Jc2V0X2lycV90eXBlKElTUDE3NjFfSVJRLCBJUlFGX1RSSUdHRVJfRkFMTElORyk7Ci0KLQlyZXR1cm4gcGxhdGZvcm1fYWRkX2RldmljZXMoYmZpbl9pc3AxNzYxX2RldmljZXMsIG51bV9kZXZpY2VzKTsKLX0KLQotdm9pZCBfX2V4aXQgYmZpbl9pc3AxNzYxX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcigmYmZpbl9pc3AxNzYxX2RldmljZSk7Ci19Ci0KLWFyY2hfaW5pdGNhbGwoYmZpbl9pc3AxNzYxX2luaXQpOwogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19VU0JfTVVTQl9IRFJDKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfTVVTQl9IRFJDX01PRFVMRSkKQEAgLTEzMiw4ICsxMjEsOCBAQAogCS5keW5fZmlmbwk9IDAsCiAJLnNvZnRfY29uCT0gMSwKIAkuZG1hCQk9IDEsCi0JLm51bV9lcHMJPSA3LAotCS5kbWFfY2hhbm5lbHMJPSA3LAorCS5udW1fZXBzCT0gOCwKKwkuZG1hX2NoYW5uZWxzCT0gOCwKIAkuZ3Bpb192cnNlbAk9IEdQSU9fUEYxMSwKIH07CiAKQEAgLTcyOCwzMCArNzE3LDU5IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyX3Jlc291cmNlc1tdID0gewogI2lmZGVmIENPTkZJR19CRklOX1NJUjAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIwX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMDQwMCwKIAkJLmVuZCA9IDB4RkZDMDA0RkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQwX1JYLAorCQkuZW5kID0gQ0hfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyMF9kZXZpY2UgPSB7CisJLm5hbWUgPSAiYmZpbl9zaXIiLAorCS5pZCA9IDAsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMF9yZXNvdXJjZXMsCit9OwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0JGSU5fU0lSMQorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NpcjFfcmVzb3VyY2VzW10gPSB7CiAJewogCQkuc3RhcnQgPSAweEZGQzAyMDAwLAogCQkuZW5kID0gMHhGRkMwMjBGRiwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKLSNlbmRpZgorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQxX1JYLAorCQkuZW5kID0gSVJRX1VBUlQxX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMV9SWCwKKwkJLmVuZCA9IENIX1VBUlQxX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Npcl9kZXZpY2UgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjFfZGV2aWNlID0gewogCS5uYW1lID0gImJmaW5fc2lyIiwKLQkuaWQgPSAwLAotCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3Npcl9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZSA9IGJmaW5fc2lyX3Jlc291cmNlcywKKwkuaWQgPSAxLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjFfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjFfcmVzb3VyY2VzLAogfTsKICNlbmRpZgorI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl90d2kwX3Jlc291cmNlW10gPSB7CkBAIC04ODUsNiArOTAzLDEwIEBACiAJJmlzcDEzNjJfaGNkX2RldmljZSwKICNlbmRpZgogCisjaWYgZGVmaW5lZChDT05GSUdfVVNCX0lTUDE3NjBfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfSVNQMTc2MF9IQ0RfTU9EVUxFKQorCSZiZmluX2lzcDE3NjBfZGV2aWNlLAorI2VuZGlmCisKICNpZiBkZWZpbmVkKENPTkZJR19VU0JfTVVTQl9IRFJDKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfTVVTQl9IRFJDX01PRFVMRSkKIAkmbXVzYl9kZXZpY2UsCiAjZW5kaWYKQEAgLTkxOCw3ICs5NDAsMTIgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKLQkmYmZpbl9zaXJfZGV2aWNlLAorI2lmZGVmIENPTkZJR19CRklOX1NJUjAKKwkmYmZpbl9zaXIwX2RldmljZSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CRklOX1NJUjEKKwkmYmZpbl9zaXIxX2RldmljZSwKKyNlbmRpZgogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX01PRFVMRSkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvZXpicmQuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvZXpicmQuYwppbmRleCAzNmM4N2I2Li4wMzE0YmQzIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2V6YnJkLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9lemJyZC5jCkBAIC01MSw3ICs1MSw3IEBACiAvKgogICogTmFtZSB0aGUgQm9hcmQgZm9yIHRoZSAvcHJvYy9jcHVpbmZvCiAgKi8KLWNvbnN0IGNoYXIgYmZpbl9ib2FyZF9uYW1lW10gPSAiQkY1MjYtRVpCUkQiOworY29uc3QgY2hhciBiZmluX2JvYXJkX25hbWVbXSA9ICJBREkgQkY1MjYtRVpCUkQiOwogCiAvKgogICogIERyaXZlciBuZWVkcyB0byBrbm93IGFkZHJlc3MsIGlycSBhbmQgZmxhZyBwaW4uCkBAIC04MSw4ICs4MSw4IEBACiAJLmR5bl9maWZvCT0gMCwKIAkuc29mdF9jb24JPSAxLAogCS5kbWEJCT0gMSwKLQkubnVtX2Vwcwk9IDcsCi0JLmRtYV9jaGFubmVscwk9IDcsCisJLm51bV9lcHMJPSA4LAorCS5kbWFfY2hhbm5lbHMJPSA4LAogCS5ncGlvX3Zyc2VsCT0gR1BJT19QRzEzLAogfTsKIApAQCAtMjg4LDYgKzI4OCwzMCBAQAogfTsKICNlbmRpZgogCisjaWYgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5KSB8fCBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfTU9EVUxFKQorI2luY2x1ZGUgPGxpbnV4L3NwaS9hZDc4NzkuaD4KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWQ3ODc5X3BsYXRmb3JtX2RhdGEgYmZpbl9hZDc4NzlfdHNfaW5mbyA9IHsKKwkubW9kZWwJCQk9IDc4NzksCS8qIE1vZGVsID0gQUQ3ODc5ICovCisJLnhfcGxhdGVfb2htcwkJPSA2MjAsCS8qIDYyMCBPaG0gZnJvbSB0aGUgdG91Y2ggZGF0YXNoZWV0ICovCisJLnByZXNzdXJlX21heAkJPSAxMDAwMCwKKwkucHJlc3N1cmVfbWluCQk9IDAsCisJLmZpcnN0X2NvbnZlcnNpb25fZGVsYXkgPSAzLAkvKiB3YWl0IDUxMnVzIGJlZm9yZSBkbyBhIGZpcnN0IGNvbnZlcnNpb24gKi8KKwkuYWNxdWlzaXRpb25fdGltZSAJPSAxLAkvKiA0dXMgYWNxdWlzaXRpb24gdGltZSBwZXIgc2FtcGxlICovCisJLm1lZGlhbgkJCT0gMiwJLyogZG8gOCBtZWFzdXJlbWVudHMgKi8KKwkuYXZlcmFnaW5nIAkJPSAxLAkvKiB0YWtlIHRoZSBhdmVyYWdlIG9mIDQgbWlkZGxlIHNhbXBsZXMgKi8KKwkucGVuX2Rvd25fYWNjX2ludGVydmFsIAk9IDI1NSwJLyogOS40IG1zICovCisJLmdwaW9fb3V0cHV0CQk9IDEsCS8qIGNvbmZpZ3VyZSBBVVgvVkJBVC9HUElPIGFzIEdQSU8gb3V0cHV0ICovCisJLmdwaW9fZGVmYXVsdCAJCT0gMSwJLyogRHVyaW5nIGluaXRpYWxpemF0aW9uIHNldCBHUElPID0gSElHSCAqLworfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5X1NQSSkgfHwgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5X1NQSV9NT0RVTEUpCitzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX2FkNzg3OV9jaGlwX2luZm8gPSB7CisJLmVuYWJsZV9kbWEgPSAwLAorCS5iaXRzX3Blcl93b3JkID0gMTYsCit9OworI2VuZGlmCisKICNpZiBkZWZpbmVkKENPTkZJR19TTkRfU09DX1dNODczMSkgfHwgZGVmaW5lZChDT05GSUdfU05EX1NPQ19XTTg3MzFfTU9EVUxFKSBcCiAJICYmIGRlZmluZWQoQ09ORklHX1NORF9TT0NfV004NzMxX1NQSSkKIHN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfd204NzMxX2NoaXBfaW5mbyA9IHsKQEAgLTM4Niw2ICs0MTAsMTggQEAKIAkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfYWQ3ODc3X2NoaXBfaW5mbywKIAl9LAogI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5X1NQSSkgfHwgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5X1NQSV9NT0RVTEUpCisJeworCQkubW9kYWxpYXMgPSAiYWQ3ODc5IiwKKwkJLnBsYXRmb3JtX2RhdGEgPSAmYmZpbl9hZDc4NzlfdHNfaW5mbywKKwkJLmlycSA9IElSUV9QRzAsCisJCS5tYXhfc3BlZWRfaHogPSA1MDAwMDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLworCQkuYnVzX251bSA9IDAsCisJCS5jaGlwX3NlbGVjdCA9IDUsCisJCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpX2FkNzg3OV9jaGlwX2luZm8sCisJCS5tb2RlID0gU1BJX0NQSEEgfCBTUElfQ1BPTCwKKwl9LAorI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfU05EX1NPQ19XTTg3MzEpIHx8IGRlZmluZWQoQ09ORklHX1NORF9TT0NfV004NzMxX01PRFVMRSkgXAogCSAmJiBkZWZpbmVkKENPTkZJR19TTkRfU09DX1dNODczMV9TUEkpCiAJewpAQCAtNDc4LDMwICs1MTQsNTkgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXJfcmVzb3VyY2VzW10gPSB7CiAjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NpcjBfcmVzb3VyY2VzW10gPSB7CiAJewogCQkuc3RhcnQgPSAweEZGQzAwNDAwLAogCQkuZW5kID0gMHhGRkMwMDRGRiwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDBfUlgsCisJCS5lbmQgPSBDSF9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIwX2RldmljZSA9IHsKKwkubmFtZSA9ICJiZmluX3NpciIsCisJLmlkID0gMCwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIwX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIwX3Jlc291cmNlcywKK307CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQkZJTl9TSVIxCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyMV9yZXNvdXJjZXNbXSA9IHsKIAl7CiAJCS5zdGFydCA9IDB4RkZDMDIwMDAsCiAJCS5lbmQgPSAweEZGQzAyMEZGLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAotI2VuZGlmCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDFfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDFfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQxX1JYLAorCQkuZW5kID0gQ0hfVUFSVDFfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyX2RldmljZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyMV9kZXZpY2UgPSB7CiAJLm5hbWUgPSAiYmZpbl9zaXIiLAotCS5pZCA9IDAsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyX3Jlc291cmNlcyksCi0JLnJlc291cmNlID0gYmZpbl9zaXJfcmVzb3VyY2VzLAorCS5pZCA9IDEsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMV9yZXNvdXJjZXMsCiB9OwogI2VuZGlmCisjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0kpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfTU9EVUxFKQogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3R3aTBfcmVzb3VyY2VbXSA9IHsKQEAgLTY3MSw3ICs3MzYsMTIgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKLQkmYmZpbl9zaXJfZGV2aWNlLAorI2lmZGVmIENPTkZJR19CRklOX1NJUjAKKwkmYmZpbl9zaXIwX2RldmljZSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CRklOX1NJUjEKKwkmYmZpbl9zaXIxX2RldmljZSwKKyNlbmRpZgogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX01PRFVMRSkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvZXpraXQuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvZXpraXQuYwppbmRleCA4ZWUyYjc0Li45NDU0ZmI3IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2V6a2l0LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9lemtpdC5jCkBAIC01NCw1NyArNTQsNDYgQEAKIC8qCiAgKiBOYW1lIHRoZSBCb2FyZCBmb3IgdGhlIC9wcm9jL2NwdWluZm8KICAqLwotY29uc3QgY2hhciBiZmluX2JvYXJkX25hbWVbXSA9ICJBRERTLUJGNTI3LUVaS0lUIjsKK2NvbnN0IGNoYXIgYmZpbl9ib2FyZF9uYW1lW10gPSAiQURJIEJGNTI3LUVaS0lUIjsKIAogLyoKICAqICBEcml2ZXIgbmVlZHMgdG8ga25vdyBhZGRyZXNzLCBpcnEgYW5kIGZsYWcgcGluLgogICovCiAKLSNkZWZpbmUgSVNQMTc2MV9CQVNFICAgICAgIDB4MjAzQzAwMDAKLSNkZWZpbmUgSVNQMTc2MV9JUlEgICAgICAgIElSUV9QRjcKLQogI2lmIGRlZmluZWQoQ09ORklHX1VTQl9JU1AxNzYwX0hDRCkgfHwgZGVmaW5lZChDT05GSUdfVVNCX0lTUDE3NjBfSENEX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9pc3AxNzYxX3Jlc291cmNlc1tdID0geworI2luY2x1ZGUgPGxpbnV4L3VzYi9pc3AxNzYwLmg+CitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5faXNwMTc2MF9yZXNvdXJjZXNbXSA9IHsKIAlbMF0gPSB7Ci0JCS5uYW1lCT0gImlzcDE3NjEtcmVncyIsCi0JCS5zdGFydCAgPSBJU1AxNzYxX0JBU0UgKyAweDAwMDAwMDAwLAotCQkuZW5kICAgID0gSVNQMTc2MV9CQVNFICsgMHgwMDBmZmZmZiwKKwkJLnN0YXJ0ICA9IDB4MjAzQzAwMDAsCisJCS5lbmQgICAgPSAweDIwM0MwMDAwICsgMHgwMDBmZmZmZiwKIAkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJWzFdID0gewotCQkuc3RhcnQgID0gSVNQMTc2MV9JUlEsCi0JCS5lbmQgICAgPSBJU1AxNzYxX0lSUSwKKwkJLnN0YXJ0ICA9IElSUV9QRjcsCisJCS5lbmQgICAgPSBJUlFfUEY3LAogCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5faXNwMTc2MV9kZXZpY2UgPSB7Ci0JLm5hbWUgICAgICAgICAgID0gImlzcDE3NjEiLAorc3RhdGljIHN0cnVjdCBpc3AxNzYwX3BsYXRmb3JtX2RhdGEgaXNwMTc2MF9wcml2ID0geworCS5pc19pc3AxNzYxID0gMCwKKwkucG9ydDFfZGlzYWJsZSA9IDAsCisJLmJ1c193aWR0aF8xNiA9IDEsCisJLnBvcnQxX290ZyA9IDAsCisJLmFuYWxvZ19vYyA9IDAsCisJLmRhY2tfcG9sYXJpdHlfaGlnaCA9IDAsCisJLmRyZXFfcG9sYXJpdHlfaGlnaCA9IDAsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2lzcDE3NjBfZGV2aWNlID0geworCS5uYW1lICAgICAgICAgICA9ICJpc3AxNzYwLWhjZCIsCiAJLmlkICAgICAgICAgICAgID0gMCwKLQkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKGJmaW5faXNwMTc2MV9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZSAgICAgICA9IGJmaW5faXNwMTc2MV9yZXNvdXJjZXMsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmaXNwMTc2MF9wcml2LAorCX0sCisJLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShiZmluX2lzcDE3NjBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgICAgICAgPSBiZmluX2lzcDE3NjBfcmVzb3VyY2VzLAogfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmJmaW5faXNwMTc2MV9kZXZpY2VzW10gPSB7Ci0JJmJmaW5faXNwMTc2MV9kZXZpY2UsCi19OwotCi1pbnQgX19pbml0IGJmaW5faXNwMTc2MV9pbml0KHZvaWQpCi17Ci0JdW5zaWduZWQgaW50IG51bV9kZXZpY2VzID0gQVJSQVlfU0laRShiZmluX2lzcDE3NjFfZGV2aWNlcyk7Ci0KLQlwcmludGsoS0VSTl9JTkZPICIlcygpOiByZWdpc3RlcmluZyBkZXZpY2UgcmVzb3VyY2VzXG4iLCBfX2Z1bmNfXyk7Ci0Jc2V0X2lycV90eXBlKElTUDE3NjFfSVJRLCBJUlFGX1RSSUdHRVJfRkFMTElORyk7Ci0KLQlyZXR1cm4gcGxhdGZvcm1fYWRkX2RldmljZXMoYmZpbl9pc3AxNzYxX2RldmljZXMsIG51bV9kZXZpY2VzKTsKLX0KLQotdm9pZCBfX2V4aXQgYmZpbl9pc3AxNzYxX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcigmYmZpbl9pc3AxNzYxX2RldmljZSk7Ci19Ci0KLWFyY2hfaW5pdGNhbGwoYmZpbl9pc3AxNzYxX2luaXQpOwogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19VU0JfTVVTQl9IRFJDKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfTVVTQl9IRFJDX01PRFVMRSkKQEAgLTEzMSw4ICsxMjAsOCBAQAogCS5keW5fZmlmbwk9IDAsCiAJLnNvZnRfY29uCT0gMSwKIAkuZG1hCQk9IDEsCi0JLm51bV9lcHMJPSA3LAotCS5kbWFfY2hhbm5lbHMJPSA3LAorCS5udW1fZXBzCT0gOCwKKwkuZG1hX2NoYW5uZWxzCT0gOCwKIAkuZ3Bpb192cnNlbAk9IEdQSU9fUEcxMywKIH07CiAKQEAgLTUxNSwxMyArNTA0LDYgQEAKIH07CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NTUMpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9NTUNfTU9EVUxFKQotc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV9tbWNfY2hpcF9pbmZvID0gewotCS5lbmFibGVfZG1hID0gMSwKLQkuYml0c19wZXJfd29yZCA9IDgsCi19OwotI2VuZGlmCi0KICNpZiBkZWZpbmVkKENPTkZJR19QQlgpCiBzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX3NpM3h4eF9jaGlwX2luZm8gPSB7CiAJLmN0bF9yZWcJPSAweDQsIC8qIHNlbmQgemVybyAqLwpAQCAtNTUyLDYgKzUzNCwzMCBAQAogfTsKICNlbmRpZgogCisjaWYgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5KSB8fCBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfTU9EVUxFKQorI2luY2x1ZGUgPGxpbnV4L3NwaS9hZDc4NzkuaD4KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWQ3ODc5X3BsYXRmb3JtX2RhdGEgYmZpbl9hZDc4NzlfdHNfaW5mbyA9IHsKKwkubW9kZWwJCQk9IDc4NzksCS8qIE1vZGVsID0gQUQ3ODc5ICovCisJLnhfcGxhdGVfb2htcwkJPSA2MjAsCS8qIDYyMCBPaG0gZnJvbSB0aGUgdG91Y2ggZGF0YXNoZWV0ICovCisJLnByZXNzdXJlX21heAkJPSAxMDAwMCwKKwkucHJlc3N1cmVfbWluCQk9IDAsCisJLmZpcnN0X2NvbnZlcnNpb25fZGVsYXkgPSAzLAkvKiB3YWl0IDUxMnVzIGJlZm9yZSBkbyBhIGZpcnN0IGNvbnZlcnNpb24gKi8KKwkuYWNxdWlzaXRpb25fdGltZSAJPSAxLAkvKiA0dXMgYWNxdWlzaXRpb24gdGltZSBwZXIgc2FtcGxlICovCisJLm1lZGlhbgkJCT0gMiwJLyogZG8gOCBtZWFzdXJlbWVudHMgKi8KKwkuYXZlcmFnaW5nIAkJPSAxLAkvKiB0YWtlIHRoZSBhdmVyYWdlIG9mIDQgbWlkZGxlIHNhbXBsZXMgKi8KKwkucGVuX2Rvd25fYWNjX2ludGVydmFsIAk9IDI1NSwJLyogOS40IG1zICovCisJLmdwaW9fb3V0cHV0CQk9IDEsCS8qIGNvbmZpZ3VyZSBBVVgvVkJBVC9HUElPIGFzIEdQSU8gb3V0cHV0ICovCisJLmdwaW9fZGVmYXVsdCAJCT0gMSwJLyogRHVyaW5nIGluaXRpYWxpemF0aW9uIHNldCBHUElPID0gSElHSCAqLworfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5X1NQSSkgfHwgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5X1NQSV9NT0RVTEUpCitzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX2FkNzg3OV9jaGlwX2luZm8gPSB7CisJLmVuYWJsZV9kbWEgPSAwLAorCS5iaXRzX3Blcl93b3JkID0gMTYsCit9OworI2VuZGlmCisKICNpZiBkZWZpbmVkKENPTkZJR19TTkRfU09DX1dNODczMSkgfHwgZGVmaW5lZChDT05GSUdfU05EX1NPQ19XTTg3MzFfTU9EVUxFKSBcCiAJICYmIGRlZmluZWQoQ09ORklHX1NORF9TT0NfV004NzMxX1NQSSkKIHN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfd204NzMxX2NoaXBfaW5mbyA9IHsKQEAgLTYxMywyNiArNjE5LDYgQEAKIAkJLmNvbnRyb2xsZXJfZGF0YSA9ICZhZDk5NjBfc3BpX2NoaXBfaW5mbywKIAl9LAogI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfU1BJX01NQykgfHwgZGVmaW5lZChDT05GSUdfU1BJX01NQ19NT0RVTEUpCi0JewotCQkubW9kYWxpYXMgPSAic3BpX21tY19kdW1teSIsCi0JCS5tYXhfc3BlZWRfaHogPSAyNTAwMDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KLQkJLmJ1c19udW0gPSAwLAotCQkuY2hpcF9zZWxlY3QgPSAwLAotCQkucGxhdGZvcm1fZGF0YSA9IE5VTEwsCi0JCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpX21tY19jaGlwX2luZm8sCi0JCS5tb2RlID0gU1BJX01PREVfMywKLQl9LAotCXsKLQkJLm1vZGFsaWFzID0gInNwaV9tbWMiLAotCQkubWF4X3NwZWVkX2h6ID0gMjUwMDAwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCi0JCS5idXNfbnVtID0gMCwKLQkJLmNoaXBfc2VsZWN0ID0gQ09ORklHX1NQSV9NTUNfQ1NfQ0hBTiwKLQkJLnBsYXRmb3JtX2RhdGEgPSBOVUxMLAotCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaV9tbWNfY2hpcF9pbmZvLAotCQkubW9kZSA9IFNQSV9NT0RFXzMsCi0JfSwKLSNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX1BCWCkKIAl7CiAJCS5tb2RhbGlhcyA9ICJmeHMtc3BpIiwKQEAgLTY2Miw2ICs2NDgsMTggQEAKIAkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfYWQ3ODc3X2NoaXBfaW5mbywKIAl9LAogI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5X1NQSSkgfHwgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5X1NQSV9NT0RVTEUpCisJeworCQkubW9kYWxpYXMgPSAiYWQ3ODc5IiwKKwkJLnBsYXRmb3JtX2RhdGEgPSAmYmZpbl9hZDc4NzlfdHNfaW5mbywKKwkJLmlycSA9IElSUV9QRjgsCisJCS5tYXhfc3BlZWRfaHogPSA1MDAwMDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLworCQkuYnVzX251bSA9IDAsCisJCS5jaGlwX3NlbGVjdCA9IDMsCisJCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpX2FkNzg3OV9jaGlwX2luZm8sCisJCS5tb2RlID0gU1BJX0NQSEEgfCBTUElfQ1BPTCwKKwl9LAorI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfU05EX1NPQ19XTTg3MzEpIHx8IGRlZmluZWQoQ09ORklHX1NORF9TT0NfV004NzMxX01PRFVMRSkgXAogCSAmJiBkZWZpbmVkKENPTkZJR19TTkRfU09DX1dNODczMV9TUEkpCiAJewpAQCAtNzU2LDMwICs3NTQsNTkgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXJfcmVzb3VyY2VzW10gPSB7CiAjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NpcjBfcmVzb3VyY2VzW10gPSB7CiAJewogCQkuc3RhcnQgPSAweEZGQzAwNDAwLAogCQkuZW5kID0gMHhGRkMwMDRGRiwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDBfUlgsCisJCS5lbmQgPSBDSF9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIwX2RldmljZSA9IHsKKwkubmFtZSA9ICJiZmluX3NpciIsCisJLmlkID0gMCwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIwX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIwX3Jlc291cmNlcywKK307CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQkZJTl9TSVIxCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyMV9yZXNvdXJjZXNbXSA9IHsKIAl7CiAJCS5zdGFydCA9IDB4RkZDMDIwMDAsCiAJCS5lbmQgPSAweEZGQzAyMEZGLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAotI2VuZGlmCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDFfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDFfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQxX1JYLAorCQkuZW5kID0gQ0hfVUFSVDFfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyX2RldmljZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyMV9kZXZpY2UgPSB7CiAJLm5hbWUgPSAiYmZpbl9zaXIiLAotCS5pZCA9IDAsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyX3Jlc291cmNlcyksCi0JLnJlc291cmNlID0gYmZpbl9zaXJfcmVzb3VyY2VzLAorCS5pZCA9IDEsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMV9yZXNvdXJjZXMsCiB9OwogI2VuZGlmCisjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0kpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfTU9EVUxFKQogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3R3aTBfcmVzb3VyY2VbXSA9IHsKQEAgLTk0NCw2ICs5NzEsMTAgQEAKIAkmaXNwMTM2Ml9oY2RfZGV2aWNlLAogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19VU0JfSVNQMTc2MF9IQ0QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9JU1AxNzYwX0hDRF9NT0RVTEUpCisJJmJmaW5faXNwMTc2MF9kZXZpY2UsCisjZW5kaWYKKwogI2lmIGRlZmluZWQoQ09ORklHX1VTQl9NVVNCX0hEUkMpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9NVVNCX0hEUkNfTU9EVUxFKQogCSZtdXNiX2RldmljZSwKICNlbmRpZgpAQCAtOTg1LDcgKzEwMTYsMTIgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKLQkmYmZpbl9zaXJfZGV2aWNlLAorI2lmZGVmIENPTkZJR19CRklOX1NJUjAKKwkmYmZpbl9zaXIwX2RldmljZSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CRklOX1NJUjEKKwkmYmZpbl9zaXIxX2RldmljZSwKKyNlbmRpZgogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX01PRFVMRSkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9kbWEuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9kbWEuYwppbmRleCBkZmQwODBjLi4yMzE4Nzc1IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvZG1hLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2RtYS5jCkBAIC0zMSw3ICszMSw3IEBACiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogCi1zdHJ1Y3QgZG1hX3JlZ2lzdGVyICpkbWFfaW9fYmFzZV9hZGRyW01BWF9CTEFDS0ZJTl9ETUFfQ0hBTk5FTF0gPSB7CitzdHJ1Y3QgZG1hX3JlZ2lzdGVyICpkbWFfaW9fYmFzZV9hZGRyW01BWF9ETUFfQ0hBTk5FTFNdID0gewogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTBfTkVYVF9ERVNDX1BUUiwKIAkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUExX05FWFRfREVTQ19QVFIsCiAJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMl9ORVhUX0RFU0NfUFRSLApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2hlYWQuUyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9oZWFkLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYjFkYTguLjAwMDAwMDAKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2hlYWQuUworKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaGVhZC5TCi0gKiBCYXNlZCBvbjogICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9oZWFkLlMKLSAqIEF1dGhvcjogICAgICAgSmVmZiBEaW9ubmUgPGplZmZAdWNsaW51eC5vcmc+IENPUFlSSUdIVCAxOTk4IEQuIEplZmYgRGlvbm5lCi0gKgotICogQ3JlYXRlZDogICAgICAxOTk4Ci0gKiBEZXNjcmlwdGlvbjogIFN0YXJ0dXAgY29kZSBmb3IgQmxhY2tmaW4gQkY1MzcKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNyBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+Ci0jaWZkZWYgQ09ORklHX0JGSU5fS0VSTkVMX0NMT0NLCi0jaW5jbHVkZSA8YXNtL2Nsb2Nrcy5oPgotI2luY2x1ZGUgPG1hY2gvbWVtX2luaXQuaD4KLSNlbmRpZgotCi0uc2VjdGlvbiAubDEudGV4dAotI2lmZGVmIENPTkZJR19CRklOX0tFUk5FTF9DTE9DSwotRU5UUlkoX3N0YXJ0X2RtYV9jb2RlKQotCi0JLyogRW5hYmxlIFBIWSBDTEsgYnVmZmVyIG91dHB1dCAqLwotCXAwLmggPSBoaShWUl9DVEwpOwotCXAwLmwgPSBsbyhWUl9DVEwpOwotCXIwLmwgPSB3W3AwXTsKLQliaXRzZXQocjAsIDE0KTsKLQl3W3AwXSA9IHIwLmw7Ci0Jc3N5bmM7Ci0KLQlwMC5oID0gaGkoU0lDX0lXUjApOwotCXAwLmwgPSBsbyhTSUNfSVdSMCk7Ci0JcjAubCA9IDB4MTsKLQlyMC5oID0gMHgwOwotCVtwMF0gPSByMDsKLQlTU1lOQzsKLQotCS8qCi0JICogIFNldCBQTExfQ1RMCi0JICogICAtIFsxNDowOV0gPSBNU0VMWzU6MF0gOiBDTEtJTiAvIFZDTyBtdWx0aXBsaWNhdGlvbiBmYWN0b3JzCi0JICogICAtIFs4XSAgICAgPSBCWVBBU1MgICAgOiBCWVBBU1MgdGhlIFBMTCwgcnVuIENMS0lOIGludG8gQ0NMSy9TQ0xLCi0JICogICAtIFs3XSAgICAgPSBvdXRwdXQgZGVsYXkgKGFkZCAyMDBwcyBvZiBkZWxheSB0byBtZW0gc2lnbmFscykKLQkgKiAgIC0gWzZdICAgICA9IGlucHV0IGRlbGF5IChhZGQgMjAwcHMgb2YgaW5wdXQgZGVsYXkgdG8gbWVtIHNpZ25hbHMpCi0JICogICAtIFs1XSAgICAgPSBQRFdOICAgICAgOiAxPUFsbCBDbG9ja3Mgb2ZmCi0JICogICAtIFszXSAgICAgPSBTVE9QQ0sgICAgOiAxPUNvcmUgQ2xvY2sgb2ZmCi0JICogICAtIFsxXSAgICAgPSBQTExfT0ZGICAgOiAxPURpc2FibGUgUG93ZXIgdG8gUExMCi0JICogICAtIFswXSAgICAgPSBERiAgICAgICAgOiAxPVBhc3MgQ0xLSU4vMiB0byBQTEwgLyAwPVBhc3MgQ0xLSU4gdG8gUExMCi0JICogICBhbGwgb3RoZXIgYml0cyBzZXQgdG8gemVybwotCSAqLwotCi0JcDAuaCA9IGhpKFBMTF9MT0NLQ05UKTsKLQlwMC5sID0gbG8oUExMX0xPQ0tDTlQpOwotCXIwID0gMHgzMDAoWik7Ci0Jd1twMF0gPSByMC5sOwotCXNzeW5jOwotCi0JUDIuSCA9IGhpKEVCSVVfU0RHQ1RMKTsKLQlQMi5MID0gbG8oRUJJVV9TREdDVEwpOwotCVIwID0gW1AyXTsKLQlCSVRTRVQgKFIwLCAyNCk7Ci0JW1AyXSA9IFIwOwotCVNTWU5DOwotCi0JcjAgPSBDT05GSUdfVkNPX01VTFQgJiA2MzsgICAgICAgLyogTG9hZCB0aGUgVkNPIG11bHRpcGxpZXIgICAgICAgICAqLwotCXIwID0gcjAgPDwgOTsgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0IGl0IG92ZXIsICAgICAgICAgICAgICAgICAgKi8KLQlyMSA9IENMS0lOX0hBTEY7ICAgICAgICAgICAgICAgICAvKiBEbyB3ZSBuZWVkIHRvIGRpdmlkZSBDTEtJTiBieSAyPyovCi0JcjAgPSByMSB8IHIwOwotCXIxID0gUExMX0JZUEFTUzsgICAgICAgICAgICAgICAgIC8qIEJ5cGFzcyB0aGUgUExMPyAgICAgICAgICAgICAgICAgKi8KLQlyMSA9IHIxIDw8IDg7ICAgICAgICAgICAgICAgICAgICAvKiBTaGlmdCBpdCBvdmVyICAgICAgICAgICAgICAgICAgICovCi0JcjAgPSByMSB8IHIwOyAgICAgICAgICAgICAgICAgICAgLyogYWRkIHRoZW0gYWxsIHRvZ2V0aGVyICAgICAgICAgICAqLwotI2lmZGVmIEFOT01BTFlfMDUwMDAyNjUKLQlCSVRTRVQocjAsIDE1KTsgICAgICAgICAgICAgICAgICAvKiBBZGQgMjUwIG1WIG9mIGh5c3RlcmVzaXMgdG8gU1BPUlQgaW5wdXQgcGlucyAqLwotI2VuZGlmCi0KLQlwMC5oID0gaGkoUExMX0NUTCk7Ci0JcDAubCA9IGxvKFBMTF9DVEwpOyAgICAgICAgICAgICAgLyogTG9hZCB0aGUgYWRkcmVzcyAgICAgICAgICAgICAgICAqLwotCWNsaSByMjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERpc2FibGUgaW50ZXJydXB0cyAgICAgICAgICAgICAgKi8KLQlzc3luYzsKLQl3W3AwXSA9IHIwLmw7ICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIHZhbHVlICAgICAgICAgICAgICAgICAgICovCi0JaWRsZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2FpdCBmb3IgdGhlIFBMTCB0byBzdGFibGl6ZSAgICAqLwotCXN0aSByMjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVuYWJsZSBpbnRlcnJ1cHRzICAgICAgICAgICAgICAgKi8KLQotLkxjaGVja19hZ2FpbjoKLQlwMC5oID0gaGkoUExMX1NUQVQpOwotCXAwLmwgPSBsbyhQTExfU1RBVCk7Ci0JUjAgPSBXW1AwXShaKTsKLQlDQyA9IEJJVFRTVChSMCw1KTsKLQlpZiAhIENDIGp1bXAgLkxjaGVja19hZ2FpbjsKLQotCS8qIENvbmZpZ3VyZSBTQ0xLICYgQ0NMSyBEaXZpZGVycyAqLwotCXIwID0gKENPTkZJR19DQ0xLX0FDVF9ESVYgfCBDT05GSUdfU0NMS19ESVYpOwotCXAwLmggPSBoaShQTExfRElWKTsKLQlwMC5sID0gbG8oUExMX0RJVik7Ci0Jd1twMF0gPSByMC5sOwotCXNzeW5jOwotCi0JcDAubCA9IGxvKEVCSVVfU0RSUkMpOwotCXAwLmggPSBoaShFQklVX1NEUlJDKTsKLQlyMCA9IG1lbV9TRFJSQzsKLQl3W3AwXSA9IHIwLmw7Ci0Jc3N5bmM7Ci0KLQlQMi5IID0gaGkoRUJJVV9TREdDVEwpOwotCVAyLkwgPSBsbyhFQklVX1NER0NUTCk7Ci0JUjAgPSBbUDJdOwotCUJJVENMUiAoUjAsIDI0KTsKLQlwMC5oID0gaGkoRUJJVV9TRFNUQVQpOwotCXAwLmwgPSBsbyhFQklVX1NEU1RBVCk7Ci0JcjIubCA9IHdbcDBdOwotCWNjID0gYml0dHN0KHIyLDMpOwotCWlmICFjYyBqdW1wIC5Mc2tpcDsKLQlOT1A7Ci0JQklUU0VUIChSMCwgMjMpOwotLkxza2lwOgotCVtQMl0gPSBSMDsKLQlTU1lOQzsKLQotCVIwLkwgPSBsbyhtZW1fU0RHQ1RMKTsKLQlSMC5IID0gaGkobWVtX1NER0NUTCk7Ci0JUjEgPSBbcDJdOwotCVIxID0gUjEgfCBSMDsKLQlbUDJdID0gUjE7Ci0JU1NZTkM7Ci0KLQlSVFM7Ci1FTkRQUk9DKF9zdGFydF9kbWFfY29kZSkKLSNlbmRpZiAvKiBDT05GSUdfQkZJTl9LRVJORUxfQ0xPQ0sgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvYW5vbWFseS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9hbm9tYWx5LmgKaW5kZXggNjIzNzNlNi4uMDM1ZThkOCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9hbm9tYWx5LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9hbm9tYWx5LmgKQEAgLTI4LDcgKzI4LDcgQEAKIC8qIE11bHRpLUlzc3VlIEluc3RydWN0aW9uIHdpdGggZHNwMzJzaGlmdGltbSBpbiBzbG90MSBhbmQgUC1yZWcgU3RvcmUgaW4gc2xvdDIgTm90IFN1cHBvcnRlZCAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwMDc0ICgxKQogLyogRE1BX1JVTiBCaXQgSXMgTm90IFZhbGlkIGFmdGVyIGEgUGVyaXBoZXJhbCBSZWNlaXZlIENoYW5uZWwgRE1BIFN0b3BzICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDAxMTkgKDEpCisjZGVmaW5lIEFOT01BTFlfMDUwMDAxMTkgKDEpCS8qIG5vdGU6IGJyb2tlbm5lc3MgaXMgbm90ZWQgaW4gZG9jdW1lbnRhdGlvbiwgbm90IGFub21hbHkgc2hlZXQgKi8KIC8qIFJ4LkggQ2Fubm90IEJlIFVzZWQgdG8gQWNjZXNzIDE2LWJpdCBTeXN0ZW0gTU1SIFJlZ2lzdGVycyAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwMTIyICgxKQogLyogU3B1cmlvdXMgSGFyZHdhcmUgRXJyb3IgZnJvbSBhbiBBY2Nlc3MgaW4gdGhlIFNoYWRvdyBvZiBhIENvbmRpdGlvbmFsIEJyYW5jaCAqLwpAQCAtMzcsOCArMzcsNiBAQAogI2RlZmluZSBBTk9NQUxZXzA1MDAwMjY1ICgxKQogLyogRmFsc2UgSGFyZHdhcmUgRXJyb3JzIENhdXNlZCBieSBGZXRjaGVzIGF0IHRoZSBCb3VuZGFyeSBvZiBSZXNlcnZlZCBNZW1vcnkgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDMxMCAoMSkKLS8qIEVycm9ycyB3aGVuIFNTWU5DLCBDU1lOQywgb3IgTG9hZHMgdG8gTFQsIExCIGFuZCBMQyBSZWdpc3RlcnMgQXJlIEludGVycnVwdGVkICovCi0jZGVmaW5lIEFOT01BTFlfMDUwMDAzMTIgKEFOT01BTFlfQkY1MjcpCiAvKiBQUEkgSXMgTGV2ZWwtU2Vuc2l0aXZlIG9uIEZpcnN0IFRyYW5zZmVyIEluIFNpbmdsZSBGcmFtZSBTeW5jIE1vZGVzICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAzMTMgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMikKIC8qIEluY29ycmVjdCBBY2Nlc3Mgb2YgT1RQX1NUQVRVUyBEdXJpbmcgb3RwX3dyaXRlKCkgRnVuY3Rpb24gKi8KQEAgLTE1Myw2ICsxNTEsMTAgQEAKICNkZWZpbmUgQU5PTUFMWV8wNTAwMDQzMCAoQU5PTUFMWV9CRjUyNyAmJiBfX1NJTElDT05fUkVWSVNJT05fXyA+IDEpCiAvKiBiZnJvbV9TeXNDb250cm9sKCkgRG9lcyBOb3QgQ2xlYXIgU0lDX0lXUjEgQmVmb3JlIEV4ZWN1dGluZyBQTEwgUHJvZ3JhbW1pbmcgU2VxdWVuY2UgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDQzMiAoQU5PTUFMWV9CRjUyNikKKy8qIENlcnRhaW4gU0lDIFJlZ2lzdGVycyBhcmUgbm90IFJlc2V0IEFmdGVyIFNvZnQgb3IgQ29yZSBEb3VibGUgRmF1bHQgUmVzZXQgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQzNSAoKEFOT01BTFlfQkY1MjYgJiYgX19TSUxJQ09OX1JFVklTSU9OX18gPCAxKSB8fCBBTk9NQUxZX0JGNTI3KQorLyogSUZMVVNIIEluc3RydWN0aW9uIGF0IEVuZCBvZiBIYXJkd2FyZSBMb29wIENhdXNlcyBJbmZpbml0ZSBTdGFsbCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDQzICgxKQogCiAvKiBBbm9tYWxpZXMgdGhhdCBkb24ndCBleGlzdCBvbiB0aGlzIHByb2MgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDEyNSAoMCkKQEAgLTE2OCw3ICsxNzAsOSBAQAogI2RlZmluZSBBTk9NQUxZXzA1MDAwMjg1ICgwKQogI2RlZmluZSBBTk9NQUxZXzA1MDAwMzA3ICgwKQogI2RlZmluZSBBTk9NQUxZXzA1MDAwMzExICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMzEyICgwKQogI2RlZmluZSBBTk9NQUxZXzA1MDAwMzIzICgwKQogI2RlZmluZSBBTk9NQUxZXzA1MDAwMzYzICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwNDEyICgwKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvYmY1MjcuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvYmY1MjcuaAppbmRleCAxNDRmMDhkLi4zODMyYWFiIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2JmNTI3LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9iZjUyNy5oCkBAIC0xMTAsNyArMTEwLDcgQEAKIAogI2lmZGVmIENPTkZJR19CRjUyNwogI2RlZmluZSBDUFUgIkJGNTI3IgotI2RlZmluZSBDUFVJRCAweDI3ZTQKKyNkZWZpbmUgQ1BVSUQgMHgyN2UwCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQkY1MjYKICNkZWZpbmUgQ1BVICJCRjUyNiIKQEAgLTExOCw3ICsxMTgsNyBAQAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0JGNTI1CiAjZGVmaW5lIENQVSAiQkY1MjUiCi0jZGVmaW5lIENQVUlEIDB4MjdlNAorI2RlZmluZSBDUFVJRCAweDI3ZTAKICNlbmRpZgogI2lmZGVmIENPTkZJR19CRjUyNAogI2RlZmluZSBDUFUgIkJGNTI0IgpAQCAtMTI2LDcgKzEyNiw3IEBACiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQkY1MjMKICNkZWZpbmUgQ1BVICJCRjUyMyIKLSNkZWZpbmUgQ1BVSUQgMHgyN2U0CisjZGVmaW5lIENQVUlEIDB4MjdlMAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0JGNTIyCiAjZGVmaW5lIENQVSAiQkY1MjIiCkBAIC0xMzQsNyArMTM0LDcgQEAKICNlbmRpZgogCiAjaWZuZGVmIENQVQotI2Vycm9yIFVua25vd24gQ1BVIHR5cGUgLSBUaGlzIGtlcm5lbCBkb2Vzbid0IHNlZW0gdG8gYmUgY29uZmlndXJlZCBwcm9wZXJseQorI2Vycm9yICJVbmtub3duIENQVSB0eXBlIC0gVGhpcyBrZXJuZWwgZG9lc24ndCBzZWVtIHRvIGJlIGNvbmZpZ3VyZWQgcHJvcGVybHkiCiAjZW5kaWYKIAogI2VuZGlmCQkJCS8qIF9fTUFDSF9CRjUyN19IX18gICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2JmaW5fc2lyLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2JmaW5fc2lyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZDhhZDQuLjAwMDAwMDAKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9iZmluX3Npci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qCi0gKiBCbGFja2ZpbiBJbmZyYS1yZWQgRHJpdmVyCi0gKgotICogQ29weXJpZ2h0IDIwMDYtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+Ci0jaW5jbHVkZSA8YXNtL2RtYS5oPgotI2luY2x1ZGUgPGFzbS9wb3J0bXV4Lmg+Ci0KLSNkZWZpbmUgU0lSX1VBUlRfR0VUX0NIQVIocG9ydCkgICBiZmluX3JlYWQxNigocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfUkJSKQotI2RlZmluZSBTSVJfVUFSVF9HRVRfRExMKHBvcnQpICAgIGJmaW5fcmVhZDE2KChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9ETEwpCi0jZGVmaW5lIFNJUl9VQVJUX0dFVF9JRVIocG9ydCkgICAgYmZpbl9yZWFkMTYoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0lFUikKLSNkZWZpbmUgU0lSX1VBUlRfR0VUX0RMSChwb3J0KSAgICBiZmluX3JlYWQxNigocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfRExIKQotI2RlZmluZSBTSVJfVUFSVF9HRVRfSUlSKHBvcnQpICAgIGJmaW5fcmVhZDE2KChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9JSVIpCi0jZGVmaW5lIFNJUl9VQVJUX0dFVF9MQ1IocG9ydCkgICAgYmZpbl9yZWFkMTYoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0xDUikKLSNkZWZpbmUgU0lSX1VBUlRfR0VUX0dDVEwocG9ydCkgICBiZmluX3JlYWQxNigocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfR0NUTCkKLQotI2RlZmluZSBTSVJfVUFSVF9QVVRfQ0hBUihwb3J0LCB2KSBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9USFIpLCB2KQotI2RlZmluZSBTSVJfVUFSVF9QVVRfRExMKHBvcnQsIHYpICBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9ETEwpLCB2KQotI2RlZmluZSBTSVJfVUFSVF9QVVRfSUVSKHBvcnQsIHYpICBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9JRVIpLCB2KQotI2RlZmluZSBTSVJfVUFSVF9QVVRfRExIKHBvcnQsIHYpICBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9ETEgpLCB2KQotI2RlZmluZSBTSVJfVUFSVF9QVVRfTENSKHBvcnQsIHYpICBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9MQ1IpLCB2KQotI2RlZmluZSBTSVJfVUFSVF9QVVRfR0NUTChwb3J0LCB2KSBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9HQ1RMKSwgdikKLQotI2lmZGVmIENPTkZJR19TSVJfQkZJTl9ETUEKLXN0cnVjdCBkbWFfcnhfYnVmIHsKLQljaGFyICpidWY7Ci0JaW50IGhlYWQ7Ci0JaW50IHRhaWw7Ci0JfTsKLSNlbmRpZiAvKiBDT05GSUdfU0lSX0JGSU5fRE1BICovCi0KLXN0cnVjdCBiZmluX3Npcl9wb3J0IHsKLQl1bnNpZ25lZCBjaGFyIF9faW9tZW0gICAqbWVtYmFzZTsKLQl1bnNpZ25lZCBpbnQgICAgICAgICAgICBpcnE7Ci0JdW5zaWduZWQgaW50ICAgICAgICAgICAgbHNyOwotCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIGNsazsKLQlzdHJ1Y3QgbmV0X2RldmljZSAgICAgICAqZGV2OwotI2lmZGVmIENPTkZJR19TSVJfQkZJTl9ETUEKLQlpbnQgICAgICAgICAgICAgICAgICAgICB0eF9kb25lOwotCXN0cnVjdCBkbWFfcnhfYnVmICAgICAgIHJ4X2RtYV9idWY7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgICAgICAgcnhfZG1hX3RpbWVyOwotCWludCAgICAgICAgICAgICAgICAgICAgIHJ4X2RtYV9ucm93czsKLSNlbmRpZiAvKiBDT05GSUdfU0lSX0JGSU5fRE1BICovCi0JdW5zaWduZWQgaW50ICAgICAgICAgICAgdHhfZG1hX2NoYW5uZWw7Ci0JdW5zaWduZWQgaW50ICAgICAgICAgICAgcnhfZG1hX2NoYW5uZWw7Ci19OwotCi1zdHJ1Y3QgYmZpbl9zaXJfcG9ydCBzaXJfcG9ydHNbQkZJTl9VQVJUX05SX1BPUlRTXTsKLQotc3RydWN0IGJmaW5fc2lyX3BvcnRfcmVzIHsKLQl1bnNpZ25lZCBsb25nICAgYmFzZV9hZGRyOwotCWludCAgICAgICAgICAgICBpcnE7Ci0JdW5zaWduZWQgaW50ICAgIHJ4X2RtYV9jaGFubmVsOwotCXVuc2lnbmVkIGludCAgICB0eF9kbWFfY2hhbm5lbDsKLX07Ci0KLXN0cnVjdCBiZmluX3Npcl9wb3J0X3JlcyBiZmluX3Npcl9wb3J0X3Jlc291cmNlW10gPSB7Ci0jaWZkZWYgQ09ORklHX0JGSU5fU0lSMAotCXsKLQkweEZGQzAwNDAwLAotCUlSUV9VQVJUMF9SWCwKLQlDSF9VQVJUMF9SWCwKLQlDSF9VQVJUMF9UWCwKLQl9LAotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0JGSU5fU0lSMQotCXsKLQkweEZGQzAyMDAwLAotCUlSUV9VQVJUMV9SWCwKLQlDSF9VQVJUMV9SWCwKLQlDSF9VQVJUMV9UWCwKLQl9LAotI2VuZGlmCi19OwotCi1pbnQgbnJfc2lycyA9IEFSUkFZX1NJWkUoYmZpbl9zaXJfcG9ydF9yZXNvdXJjZSk7Ci0KLXN0cnVjdCBiZmluX3Npcl9zZWxmIHsKLQlzdHJ1Y3QgYmZpbl9zaXJfcG9ydCAgICAqc2lyX3BvcnQ7Ci0Jc3BpbmxvY2tfdCAgICAgICAgICAgICAgbG9jazsKLQl1bnNpZ25lZCBpbnQgICAgICAgICAgICBvcGVuOwotCWludCAgICAgICAgICAgICAgICAgICAgIHNwZWVkOwotCWludCAgICAgICAgICAgICAgICAgICAgIG5ld3NwZWVkOwotCi0Jc3RydWN0IHNrX2J1ZmYgICAgICAgICAgKnR4c2tiOwotCXN0cnVjdCBza19idWZmICAgICAgICAgICpyeHNrYjsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKLQlzdHJ1Y3QgZGV2aWNlICAgICAgICAgICAqZGV2OwotCXN0cnVjdCBpcmxhcF9jYiAgICAgICAgICppcmxhcDsKLQlzdHJ1Y3QgcW9zX2luZm8gICAgICAgICBxb3M7Ci0KLQlpb2J1ZmZfdCAgICAgICAgICAgICAgICB0eF9idWZmOwotCWlvYnVmZl90ICAgICAgICAgICAgICAgIHJ4X2J1ZmY7Ci0KLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgICAgICB3b3JrOwotCWludCAgICAgICAgICAgICAgICAgICAgIG10dDsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IFNJUl9VQVJUX0dFVF9MU1Ioc3RydWN0IGJmaW5fc2lyX3BvcnQgKnBvcnQpCi17Ci0JdW5zaWduZWQgaW50IGxzciA9IGJmaW5fcmVhZDE2KHBvcnQtPm1lbWJhc2UgKyBPRkZTRVRfTFNSKTsKLQlwb3J0LT5sc3IgfD0gKGxzciAmIChCSXxGRXxQRXxPRSkpOwotCXJldHVybiBsc3IgfCBwb3J0LT5sc3I7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBTSVJfVUFSVF9DTEVBUl9MU1Ioc3RydWN0IGJmaW5fc2lyX3BvcnQgKnBvcnQpCi17Ci0JcG9ydC0+bHNyID0gMDsKLQliZmluX3JlYWQxNihwb3J0LT5tZW1iYXNlICsgT0ZGU0VUX0xTUik7Ci19Ci0KLSNkZWZpbmUgRFJJVkVSX05BTUUgImJmaW5fc2lyIgotCi1zdGF0aWMgaW50IGJmaW5fc2lyX2h3X2luaXQodm9pZCkKLXsKLQlpbnQgcmV0ID0gLUVOT0RFVjsKLSNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCi0JcmV0ID0gcGVyaXBoZXJhbF9yZXF1ZXN0KFBfVUFSVDBfVFgsIERSSVZFUl9OQU1FKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCXJldCA9IHBlcmlwaGVyYWxfcmVxdWVzdChQX1VBUlQwX1JYLCBEUklWRVJfTkFNRSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0JGSU5fU0lSMQotCXJldCA9IHBlcmlwaGVyYWxfcmVxdWVzdChQX1VBUlQxX1RYLCBEUklWRVJfTkFNRSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQlyZXQgPSBwZXJpcGhlcmFsX3JlcXVlc3QoUF9VQVJUMV9SWCwgRFJJVkVSX05BTUUpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0jZW5kaWYKLQlyZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9jZGVmQkY1MnhfYmFzZS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9jZGVmQkY1MnhfYmFzZS5oCmluZGV4IDlhODE0YjkuLjFmZTc2ZDggMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvY2RlZkJGNTJ4X2Jhc2UuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2NkZWZCRjUyeF9iYXNlLmgKQEAgLTMxLDcgKzMxLDYgQEAKICNpZm5kZWYgX0NERUZfQkY1MlhfSAogI2RlZmluZSBfQ0RFRl9CRjUyWF9ICiAKLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CiAKICNpbmNsdWRlICJkZWZCRjUyeF9iYXNlLmgiCkBAIC00Myw1NyArNDIsOSBAQAogCiAvKiBDbG9jayBhbmQgU3lzdGVtIENvbnRyb2wJKDB4RkZDMDAwMDAgLSAweEZGQzAwMEZGKQkJCQkJCQkJKi8KICNkZWZpbmUgYmZpbl9yZWFkX1BMTF9DVEwoKQkJCWJmaW5fcmVhZDE2KFBMTF9DVEwpCi0vKiBXcml0aW5nIHRvIFBMTF9DVEwgaW5pdGlhdGVzIGEgUExMIHJlbG9jayBzZXF1ZW5jZS4gKi8KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgYmZpbl93cml0ZV9QTExfQ1RMKHVuc2lnbmVkIGludCB2YWwpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFncywgaXdyMCwgaXdyMTsKLQotCWlmICh2YWwgPT0gYmZpbl9yZWFkX1BMTF9DVEwoKSkKLQkJcmV0dXJuOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCS8qIEVuYWJsZSB0aGUgUExMIFdha2V1cCBiaXQgaW4gU0lDIElXUiAqLwotCWl3cjAgPSBiZmluX3JlYWQzMihTSUNfSVdSMCk7Ci0JaXdyMSA9IGJmaW5fcmVhZDMyKFNJQ19JV1IxKTsKLQkvKiBPbmx5IGFsbG93IFBQTCBXYWtldXApICovCi0JYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBJV1JfRU5BQkxFKDApKTsKLQliZmluX3dyaXRlMzIoU0lDX0lXUjEsIDApOwotCi0JYmZpbl93cml0ZTE2KFBMTF9DVEwsIHZhbCk7Ci0JU1NZTkMoKTsKLQlhc20oIklETEU7Iik7Ci0KLQliZmluX3dyaXRlMzIoU0lDX0lXUjAsIGl3cjApOwotCWJmaW5fd3JpdGUzMihTSUNfSVdSMSwgaXdyMSk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQogI2RlZmluZSBiZmluX3JlYWRfUExMX0RJVigpCQkJYmZpbl9yZWFkMTYoUExMX0RJVikKICNkZWZpbmUgYmZpbl93cml0ZV9QTExfRElWKHZhbCkJCQliZmluX3dyaXRlMTYoUExMX0RJViwgdmFsKQogI2RlZmluZSBiZmluX3JlYWRfVlJfQ1RMKCkJCQliZmluX3JlYWQxNihWUl9DVEwpCi0vKiBXcml0aW5nIHRvIFZSX0NUTCBpbml0aWF0ZXMgYSBQTEwgcmVsb2NrIHNlcXVlbmNlLiAqLwotc3RhdGljIF9faW5saW5lX18gdm9pZCBiZmluX3dyaXRlX1ZSX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGl3cjAsIGl3cjE7Ci0KLQlpZiAodmFsID09IGJmaW5fcmVhZF9WUl9DVEwoKSkKLQkJcmV0dXJuOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCS8qIEVuYWJsZSB0aGUgUExMIFdha2V1cCBiaXQgaW4gU0lDIElXUiAqLwotCWl3cjAgPSBiZmluX3JlYWQzMihTSUNfSVdSMCk7Ci0JaXdyMSA9IGJmaW5fcmVhZDMyKFNJQ19JV1IxKTsKLQkvKiBPbmx5IGFsbG93IFBQTCBXYWtldXApICovCi0JYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBJV1JfRU5BQkxFKDApKTsKLQliZmluX3dyaXRlMzIoU0lDX0lXUjEsIDApOwotCi0JYmZpbl93cml0ZTE2KFZSX0NUTCwgdmFsKTsKLQlTU1lOQygpOwotCWFzbSgiSURMRTsiKTsKLQotCWJmaW5fd3JpdGUzMihTSUNfSVdSMCwgaXdyMCk7Ci0JYmZpbl93cml0ZTMyKFNJQ19JV1IxLCBpd3IxKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19CiAjZGVmaW5lIGJmaW5fcmVhZF9QTExfU1RBVCgpCQkJYmZpbl9yZWFkMTYoUExMX1NUQVQpCiAjZGVmaW5lIGJmaW5fd3JpdGVfUExMX1NUQVQodmFsKQkJYmZpbl93cml0ZTE2KFBMTF9TVEFULCB2YWwpCiAjZGVmaW5lIGJmaW5fcmVhZF9QTExfTE9DS0NOVCgpCQkJYmZpbl9yZWFkMTYoUExMX0xPQ0tDTlQpCkBAIC0xMjAxLDQgKzExNTIsNTcgQEAKICNkZWZpbmUgYmZpbl9yZWFkX05GQ19EQVRBX1JEKCkJCQliZmluX3JlYWQxNihORkNfREFUQV9SRCkKICNkZWZpbmUgYmZpbl93cml0ZV9ORkNfREFUQV9SRCh2YWwpCQliZmluX3dyaXRlMTYoTkZDX0RBVEFfUkQsIHZhbCkKIAorLyogVGhlc2UgbmVlZCB0byBiZSBsYXN0IGR1ZSB0byB0aGUgY2RlZi9saW51eCBpbnRlci1kZXBlbmRlbmNpZXMgKi8KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKy8qIFdyaXRpbmcgdG8gUExMX0NUTCBpbml0aWF0ZXMgYSBQTEwgcmVsb2NrIHNlcXVlbmNlLiAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCBiZmluX3dyaXRlX1BMTF9DVEwodW5zaWduZWQgaW50IHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBpd3IwLCBpd3IxOworCisJaWYgKHZhbCA9PSBiZmluX3JlYWRfUExMX0NUTCgpKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CisJLyogRW5hYmxlIHRoZSBQTEwgV2FrZXVwIGJpdCBpbiBTSUMgSVdSICovCisJaXdyMCA9IGJmaW5fcmVhZDMyKFNJQ19JV1IwKTsKKwlpd3IxID0gYmZpbl9yZWFkMzIoU0lDX0lXUjEpOworCS8qIE9ubHkgYWxsb3cgUFBMIFdha2V1cCkgKi8KKwliZmluX3dyaXRlMzIoU0lDX0lXUjAsIElXUl9FTkFCTEUoMCkpOworCWJmaW5fd3JpdGUzMihTSUNfSVdSMSwgMCk7CisKKwliZmluX3dyaXRlMTYoUExMX0NUTCwgdmFsKTsKKwlTU1lOQygpOworCWFzbSgiSURMRTsiKTsKKworCWJmaW5fd3JpdGUzMihTSUNfSVdSMCwgaXdyMCk7CisJYmZpbl93cml0ZTMyKFNJQ19JV1IxLCBpd3IxKTsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7Cit9CisKKy8qIFdyaXRpbmcgdG8gVlJfQ1RMIGluaXRpYXRlcyBhIFBMTCByZWxvY2sgc2VxdWVuY2UuICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGJmaW5fd3JpdGVfVlJfQ1RMKHVuc2lnbmVkIGludCB2YWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncywgaXdyMCwgaXdyMTsKKworCWlmICh2YWwgPT0gYmZpbl9yZWFkX1ZSX0NUTCgpKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CisJLyogRW5hYmxlIHRoZSBQTEwgV2FrZXVwIGJpdCBpbiBTSUMgSVdSICovCisJaXdyMCA9IGJmaW5fcmVhZDMyKFNJQ19JV1IwKTsKKwlpd3IxID0gYmZpbl9yZWFkMzIoU0lDX0lXUjEpOworCS8qIE9ubHkgYWxsb3cgUFBMIFdha2V1cCkgKi8KKwliZmluX3dyaXRlMzIoU0lDX0lXUjAsIElXUl9FTkFCTEUoMCkpOworCWJmaW5fd3JpdGUzMihTSUNfSVdSMSwgMCk7CisKKwliZmluX3dyaXRlMTYoVlJfQ1RMLCB2YWwpOworCVNTWU5DKCk7CisJYXNtKCJJRExFOyIpOworCisJYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBpd3IwKTsKKwliZmluX3dyaXRlMzIoU0lDX0lXUjEsIGl3cjEpOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKK30KKwogI2VuZGlmIC8qIF9DREVGX0JGNTJYX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvZG1hLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2RtYS5oCmluZGV4IDQ5ZGQ2OTMuLmViMjg3ZGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvZG1hLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9kbWEuaApAQCAtMSwzOCArMSwxNCBAQAotLyoKLSAqIGZpbGU6ICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTI3L2RtYS5oCi0gKiBiYXNlZCBvbjoJaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUzNy9kbWEuaAotICogYXV0aG9yOglNaWNoYWVsIEhlbm5lcmljaCAobWljaGFlbC5oZW5uZXJpY2hAYW5hbG9nLmNvbSkKKy8qIG1hY2gvZG1hLmggLSBhcmNoLXNwZWNpZmljIERNQSBkZWZpbmVzCiAgKgotICogY3JlYXRlZDoKLSAqIGRlc2NyaXB0aW9uOgotICoJc3lzdGVtIERNQSBtYXAKLSAqIHJldjoKKyAqIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIG1vZGlmaWVkOgotICoKLSAqCi0gKiBidWdzOiAgICAgICAgIGVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIHRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIGdudSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIGZyZWUgc29mdHdhcmUgZm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogdGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgd2l0aG91dCBhbnkgd2FycmFudHk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogbWVyY2hhbnRhYmlsaXR5IG9yIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiAgc2VlIHRoZQotICogZ251IGdlbmVyYWwgcHVibGljIGxpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBnbnUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBjb3B5aW5nLgotICogaWYgbm90LCB3cml0ZSB0byB0aGUgZnJlZSBzb2Z0d2FyZSBmb3VuZGF0aW9uLAotICogNTkgdGVtcGxlIHBsYWNlIC0gc3VpdGUgMzMwLCBib3N0b24sIG1hIDAyMTExLTEzMDcsIHVzYS4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaWZuZGVmIF9NQUNIX0RNQV9IXwogI2RlZmluZSBfTUFDSF9ETUFfSF8KIAotI2RlZmluZSBNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUwgMTYKKyNkZWZpbmUgTUFYX0RNQV9DSEFOTkVMUyAxNgogCiAjZGVmaW5lIENIX1BQSSAJCQkwCS8qIFBQSSByZWNlaXZlL3RyYW5zbWl0IG9yIE5GQyAqLwogI2RlZmluZSBDSF9FTUFDX1JYIAkJMQkvKiBFdGhlcm5ldCBNQUMgcmVjZWl2ZSBvciBIT1NURFAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9ncGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZiNmVlYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvZ3Bpby5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBGaWxlOiBhcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2dwaW8uaAorICogQnVnczogRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisKKyNpZm5kZWYgX01BQ0hfR1BJT19IXworI2RlZmluZSBfTUFDSF9HUElPX0hfCisKKyNkZWZpbmUgTUFYX0JMQUNLRklOX0dQSU9TIDQ4CisKKyNkZWZpbmUJR1BJT19QRjAJMAorI2RlZmluZQlHUElPX1BGMQkxCisjZGVmaW5lCUdQSU9fUEYyCTIKKyNkZWZpbmUJR1BJT19QRjMJMworI2RlZmluZQlHUElPX1BGNAk0CisjZGVmaW5lCUdQSU9fUEY1CTUKKyNkZWZpbmUJR1BJT19QRjYJNgorI2RlZmluZQlHUElPX1BGNwk3CisjZGVmaW5lCUdQSU9fUEY4CTgKKyNkZWZpbmUJR1BJT19QRjkJOQorI2RlZmluZQlHUElPX1BGMTAJMTAKKyNkZWZpbmUJR1BJT19QRjExCTExCisjZGVmaW5lCUdQSU9fUEYxMgkxMgorI2RlZmluZQlHUElPX1BGMTMJMTMKKyNkZWZpbmUJR1BJT19QRjE0CTE0CisjZGVmaW5lCUdQSU9fUEYxNQkxNQorI2RlZmluZQlHUElPX1BHMAkxNgorI2RlZmluZQlHUElPX1BHMQkxNworI2RlZmluZQlHUElPX1BHMgkxOAorI2RlZmluZQlHUElPX1BHMwkxOQorI2RlZmluZQlHUElPX1BHNAkyMAorI2RlZmluZQlHUElPX1BHNQkyMQorI2RlZmluZQlHUElPX1BHNgkyMgorI2RlZmluZQlHUElPX1BHNwkyMworI2RlZmluZQlHUElPX1BHOAkyNAorI2RlZmluZQlHUElPX1BHOQkyNQorI2RlZmluZQlHUElPX1BHMTAgICAgICAJMjYKKyNkZWZpbmUJR1BJT19QRzExICAgICAgCTI3CisjZGVmaW5lCUdQSU9fUEcxMiAgICAgIAkyOAorI2RlZmluZQlHUElPX1BHMTMgICAgICAJMjkKKyNkZWZpbmUJR1BJT19QRzE0ICAgICAgCTMwCisjZGVmaW5lCUdQSU9fUEcxNSAgICAgIAkzMQorI2RlZmluZQlHUElPX1BIMAkzMgorI2RlZmluZQlHUElPX1BIMQkzMworI2RlZmluZQlHUElPX1BIMgkzNAorI2RlZmluZQlHUElPX1BIMwkzNQorI2RlZmluZQlHUElPX1BINAkzNgorI2RlZmluZQlHUElPX1BINQkzNworI2RlZmluZQlHUElPX1BINgkzOAorI2RlZmluZQlHUElPX1BINwkzOQorI2RlZmluZQlHUElPX1BIOAk0MAorI2RlZmluZQlHUElPX1BIOQk0MQorI2RlZmluZQlHUElPX1BIMTAgICAgICAJNDIKKyNkZWZpbmUJR1BJT19QSDExICAgICAgCTQzCisjZGVmaW5lCUdQSU9fUEgxMiAgICAgIAk0NAorI2RlZmluZQlHUElPX1BIMTMgICAgICAJNDUKKyNkZWZpbmUJR1BJT19QSDE0ICAgICAgCTQ2CisjZGVmaW5lCUdQSU9fUEgxNSAgICAgIAk0NworCisjZGVmaW5lIFBPUlRfRiBHUElPX1BGMAorI2RlZmluZSBQT1JUX0cgR1BJT19QRzAKKyNkZWZpbmUgUE9SVF9IIEdQSU9fUEgwCisKKyNlbmRpZiAvKiBfTUFDSF9HUElPX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2lycS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9pcnEuaAppbmRleCA0ZTJiM2YyLi44ZWE2NjBkIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2lycS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvaXJxLmgKQEAgLTk2LDE0ICs5NiwxNCBAQAogI2RlZmluZSBJUlFfTUFDX1RYCQlCRklOX0lSUSgzMCkJLyogRE1BMiBDaGFubmVsIChNQUMgVFgvTkFORCkgKi8KICNkZWZpbmUgSVJRX05GQwkJCUJGSU5fSVJRKDMwKQkvKiBETUEyIENoYW5uZWwgKE1BQyBUWC9OQU5EKSAqLwogI2RlZmluZSBJUlFfUE9SVEhfSU5UQgkJQkZJTl9JUlEoMzEpCS8qIFBvcnQgSCBJbnRlcnJ1cHQgQiAqLwotI2RlZmluZSBJUlFfVE1SMAkJQkZJTl9JUlEoMzIpCS8qIFRpbWVyIDAgKi8KLSNkZWZpbmUgSVJRX1RNUjEJCUJGSU5fSVJRKDMzKQkvKiBUaW1lciAxICovCi0jZGVmaW5lIElSUV9UTVIyCQlCRklOX0lSUSgzNCkJLyogVGltZXIgMiAqLwotI2RlZmluZSBJUlFfVE1SMwkJQkZJTl9JUlEoMzUpCS8qIFRpbWVyIDMgKi8KLSNkZWZpbmUgSVJRX1RNUjQJCUJGSU5fSVJRKDM2KQkvKiBUaW1lciA0ICovCi0jZGVmaW5lIElSUV9UTVI1CQlCRklOX0lSUSgzNykJLyogVGltZXIgNSAqLwotI2RlZmluZSBJUlFfVE1SNgkJQkZJTl9JUlEoMzgpCS8qIFRpbWVyIDYgKi8KLSNkZWZpbmUgSVJRX1RNUjcJCUJGSU5fSVJRKDM5KQkvKiBUaW1lciA3ICovCisjZGVmaW5lIElSUV9USU1FUjAJCUJGSU5fSVJRKDMyKQkvKiBUaW1lciAwICovCisjZGVmaW5lIElSUV9USU1FUjEJCUJGSU5fSVJRKDMzKQkvKiBUaW1lciAxICovCisjZGVmaW5lIElSUV9USU1FUjIJCUJGSU5fSVJRKDM0KQkvKiBUaW1lciAyICovCisjZGVmaW5lIElSUV9USU1FUjMJCUJGSU5fSVJRKDM1KQkvKiBUaW1lciAzICovCisjZGVmaW5lIElSUV9USU1FUjQJCUJGSU5fSVJRKDM2KQkvKiBUaW1lciA0ICovCisjZGVmaW5lIElSUV9USU1FUjUJCUJGSU5fSVJRKDM3KQkvKiBUaW1lciA1ICovCisjZGVmaW5lIElSUV9USU1FUjYJCUJGSU5fSVJRKDM4KQkvKiBUaW1lciA2ICovCisjZGVmaW5lIElSUV9USU1FUjcJCUJGSU5fSVJRKDM5KQkvKiBUaW1lciA3ICovCiAjZGVmaW5lIElSUV9QT1JUR19JTlRBCQlCRklOX0lSUSg0MCkJLyogUG9ydCBHIEludGVycnVwdCBBICovCiAjZGVmaW5lIElSUV9QT1JUR19JTlRCCQlCRklOX0lSUSg0MSkJLyogUG9ydCBHIEludGVycnVwdCBCICovCiAjZGVmaW5lIElSUV9NRU1fRE1BMAkJQkZJTl9JUlEoNDIpCS8qIE1ETUEgU3RyZWFtIDAgKi8KQEAgLTIyNywxNCArMjI3LDE0IEBACiAjZGVmaW5lIElSUV9QT1JUSF9JTlRCX1BPUwkyOAogCiAvKiBJQVI0IEJJVCBGSUVMRFMgKi8KLSNkZWZpbmUgSVJRX1RNUjBfUE9TCQkwCi0jZGVmaW5lIElSUV9UTVIxX1BPUwkJNAotI2RlZmluZSBJUlFfVE1SMl9QT1MJCTgKLSNkZWZpbmUgSVJRX1RNUjNfUE9TCQkxMgotI2RlZmluZSBJUlFfVE1SNF9QT1MJCTE2Ci0jZGVmaW5lIElSUV9UTVI1X1BPUwkJMjAKLSNkZWZpbmUgSVJRX1RNUjZfUE9TCQkyNAotI2RlZmluZSBJUlFfVE1SN19QT1MJCTI4CisjZGVmaW5lIElSUV9USU1FUjBfUE9TCQkwCisjZGVmaW5lIElSUV9USU1FUjFfUE9TCQk0CisjZGVmaW5lIElSUV9USU1FUjJfUE9TCQk4CisjZGVmaW5lIElSUV9USU1FUjNfUE9TCQkxMgorI2RlZmluZSBJUlFfVElNRVI0X1BPUwkJMTYKKyNkZWZpbmUgSVJRX1RJTUVSNV9QT1MJCTIwCisjZGVmaW5lIElSUV9USU1FUjZfUE9TCQkyNAorI2RlZmluZSBJUlFfVElNRVI3X1BPUwkJMjgKIAogLyogSUFSNSBCSVQgRklFTERTICovCiAjZGVmaW5lIElSUV9QT1JUR19JTlRBX1BPUwkwCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL21lbV9pbml0LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL21lbV9pbml0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZTAzZjQuLjAwMDAwMDAKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9tZW1faW5pdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzEwICswLDAgQEAKLS8qCi0gKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MjcvbWVtX2luaXQuaAotICogQmFzZWQgb246Ci0gKiBBdXRob3I6Ci0gKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOgotICoKLSAqIFJldjoKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNyBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KLSAqIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKi8KLQotI2lmIChDT05GSUdfTUVNX01UNDhMQzE2TTE2QTJUR183NSB8fCBDT05GSUdfTUVNX01UNDhMQzY0TTRBMkZCXzdFIHx8IENPTkZJR19NRU1fTVQ0OExDMTZNOEEyVEdfNzUgfHwgQ09ORklHX01FTV9HRU5FUklDX0JPQVJEIHx8IENPTkZJR19NRU1fTVQ0OExDMzJNOEEyXzc1IHx8IENPTkZJR19NRU1fTVQ0OExDMzJNMTZBMlRHXzc1KQotI2lmIChDT05GSUdfU0NMS19IWiA+IDExOTQwMjk4NSkKLSNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8yCi0jZGVmaW5lIFNEUkFNX3RSUF9udW0gICAyCi0jZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzcKLSNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDcKLSNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMgotI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKLSNlbmRpZgotI2lmIChDT05GSUdfU0NMS19IWiA+IDEwNDQ3NzYxMikgJiYgKENPTkZJR19TQ0xLX0haIDw9IDExOTQwMjk4NSkKLSNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8yCi0jZGVmaW5lIFNEUkFNX3RSUF9udW0gICAyCi0jZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzYKLSNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDYKLSNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMgotI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKLSNlbmRpZgotI2lmIChDT05GSUdfU0NMS19IWiA+IDg5NTUyMjM5KSAmJiAoQ09ORklHX1NDTEtfSFogPD0gMTA0NDc3NjEyKQotI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzIKLSNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDIKLSNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfNQotI2RlZmluZSBTRFJBTV90UkFTX251bSAgNQotI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8yCi0jZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgotI2VuZGlmCi0jaWYgKENPTkZJR19TQ0xLX0haID4gNzQ2MjY4NjYpICYmIChDT05GSUdfU0NMS19IWiA8PSA4OTU1MjIzOSkKLSNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8yCi0jZGVmaW5lIFNEUkFNX3RSUF9udW0gICAyCi0jZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzQKLSNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDQKLSNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMgotI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKLSNlbmRpZgotI2lmIChDT05GSUdfU0NMS19IWiA+IDY2NjY2NjY3KSAmJiAoQ09ORklHX1NDTEtfSFogPD0gNzQ2MjY4NjYpCi0jZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMgotI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMgotI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU18zCi0jZGVmaW5lIFNEUkFNX3RSQVNfbnVtICAzCi0jZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzIKLSNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCi0jZW5kaWYKLSNpZiAoQ09ORklHX1NDTEtfSFogPiA1OTcwMTQ5MykgJiYgKENPTkZJR19TQ0xLX0haIDw9IDY2NjY2NjY3KQotI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzEKLSNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDEKLSNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfNAotI2RlZmluZSBTRFJBTV90UkFTX251bSAgMwotI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8xCi0jZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgotI2VuZGlmCi0jaWYgKENPTkZJR19TQ0xLX0haID4gNDQ3NzYxMTkpICYmIChDT05GSUdfU0NMS19IWiA8PSA1OTcwMTQ5MykKLSNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8xCi0jZGVmaW5lIFNEUkFNX3RSUF9udW0gICAxCi0jZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzMKLSNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDMKLSNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMQotI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKLSNlbmRpZgotI2lmIChDT05GSUdfU0NMS19IWiA+IDI5ODUwNzQ2KSAmJiAoQ09ORklHX1NDTEtfSFogPD0gNDQ3NzYxMTkpCi0jZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMQotI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMQotI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU18yCi0jZGVmaW5lIFNEUkFNX3RSQVNfbnVtICAyCi0jZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzEKLSNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCi0jZW5kaWYKLSNpZiAoQ09ORklHX1NDTEtfSFogPD0gMjk4NTA3NDYpCi0jZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMQotI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMQotI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU18xCi0jZGVmaW5lIFNEUkFNX3RSQVNfbnVtICAxCi0jZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzEKLSNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCi0jZW5kaWYKLSNlbmRpZgotCi0jaWYgKENPTkZJR19NRU1fTVQ0OExDMTZNMTZBMlRHXzc1KQotICAvKlNEUkFNIElORk9STUFUSU9OOiAqLwotI2RlZmluZSBTRFJBTV9UcmVmICA2NAkJLyogUmVmcmVzaCBwZXJpb2QgaW4gbWlsbGlzZWNvbmRzICAgKi8KLSNkZWZpbmUgU0RSQU1fTlJBICAgODE5MgkvKiBOdW1iZXIgb2Ygcm93IGFkZHJlc3NlcyBpbiBTRFJBTSAqLwotI2RlZmluZSBTRFJBTV9DTCAgICBDTF8zCi0jZW5kaWYKLQotI2lmIChDT05GSUdfTUVNX01UNDhMQzE2TThBMlRHXzc1KQotICAvKlNEUkFNIElORk9STUFUSU9OOiAqLwotI2RlZmluZSBTRFJBTV9UcmVmICA2NAkJLyogUmVmcmVzaCBwZXJpb2QgaW4gbWlsbGlzZWNvbmRzICAgKi8KLSNkZWZpbmUgU0RSQU1fTlJBICAgNDA5NgkvKiBOdW1iZXIgb2Ygcm93IGFkZHJlc3NlcyBpbiBTRFJBTSAqLwotI2RlZmluZSBTRFJBTV9DTCAgICBDTF8zCi0jZW5kaWYKLQotI2lmIChDT05GSUdfTUVNX01UNDhMQzMyTThBMl83NSkKLSAgLypTRFJBTSBJTkZPUk1BVElPTjogKi8KLSNkZWZpbmUgU0RSQU1fVHJlZiAgNjQJCS8qIFJlZnJlc2ggcGVyaW9kIGluIG1pbGxpc2Vjb25kcyAgICovCi0jZGVmaW5lIFNEUkFNX05SQSAgIDgxOTIJLyogTnVtYmVyIG9mIHJvdyBhZGRyZXNzZXMgaW4gU0RSQU0gKi8KLSNkZWZpbmUgU0RSQU1fQ0wgICAgQ0xfMwotI2VuZGlmCi0KLSNpZiAoQ09ORklHX01FTV9NVDQ4TEM2NE00QTJGQl83RSkKLSAgLypTRFJBTSBJTkZPUk1BVElPTjogKi8KLSNkZWZpbmUgU0RSQU1fVHJlZiAgNjQJCS8qIFJlZnJlc2ggcGVyaW9kIGluIG1pbGxpc2Vjb25kcyAgICovCi0jZGVmaW5lIFNEUkFNX05SQSAgIDgxOTIJLyogTnVtYmVyIG9mIHJvdyBhZGRyZXNzZXMgaW4gU0RSQU0gKi8KLSNkZWZpbmUgU0RSQU1fQ0wgICAgQ0xfMwotI2VuZGlmCi0KLSNpZiAoQ09ORklHX01FTV9HRU5FUklDX0JPQVJEKQotICAvKlNEUkFNIElORk9STUFUSU9OOiBNb2RpZnkgdGhpcyBmb3IgeW91ciBib2FyZCAqLwotI2RlZmluZSBTRFJBTV9UcmVmICA2NAkJLyogUmVmcmVzaCBwZXJpb2QgaW4gbWlsbGlzZWNvbmRzICAgKi8KLSNkZWZpbmUgU0RSQU1fTlJBICAgODE5MgkvKiBOdW1iZXIgb2Ygcm93IGFkZHJlc3NlcyBpbiBTRFJBTSAqLwotI2RlZmluZSBTRFJBTV9DTCAgICBDTF8zCi0jZW5kaWYKLQotI2lmIChDT05GSUdfTUVNX01UNDhMQzMyTTE2QTJUR183NSkKLSAgLypTRFJBTSBJTkZPUk1BVElPTjogKi8KLSNkZWZpbmUgU0RSQU1fVHJlZiAgNjQJCS8qIFJlZnJlc2ggcGVyaW9kIGluIG1pbGxpc2Vjb25kcyAgICovCi0jZGVmaW5lIFNEUkFNX05SQSAgIDgxOTIJLyogTnVtYmVyIG9mIHJvdyBhZGRyZXNzZXMgaW4gU0RSQU0gKi8KLSNkZWZpbmUgU0RSQU1fQ0wgICAgQ0xfMwotI2VuZGlmCi0KLS8qIEVxdWF0aW9uIGZyb20gc2VjdGlvbiAxNyAocDE3LTQ2KSBvZiBCRjUzMyBIUk0gKi8KLSNkZWZpbmUgbWVtX1NEUlJDICAgICAgICgoKENPTkZJR19TQ0xLX0haIC8gMTAwMCkgKiBTRFJBTV9UcmVmKSAvIFNEUkFNX05SQSkgLSAoU0RSQU1fdFJBU19udW0gKyBTRFJBTV90UlBfbnVtKQotCi0vKiBFbmFibGUgU0NMSyBPdXQgKi8KLSNkZWZpbmUgbWVtX1NER0NUTCAgICAgICAgKFNDVExFIHwgU0RSQU1fQ0wgfCBTRFJBTV90UkFTIHwgU0RSQU1fdFJQIHwgU0RSQU1fdFJDRCB8IFNEUkFNX3RXUiB8IFBTUykKLQotI2lmIGRlZmluZWQgQ09ORklHX0NMS0lOX0hBTEYKLSNkZWZpbmUgQ0xLSU5fSEFMRiAgICAgICAxCi0jZWxzZQotI2RlZmluZSBDTEtJTl9IQUxGICAgICAgIDAKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBDT05GSUdfUExMX0JZUEFTUwotI2RlZmluZSBQTExfQllQQVNTICAgICAgMQotI2Vsc2UKLSNkZWZpbmUgUExMX0JZUEFTUyAgICAgICAwCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKkN1cnJlbnRseSBOb3QgQmVpbmcgVXNlZCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCAgKChDT05GSUdfRkxBU0hfU1BFRURfQldBVCAqIDQpIC8gKDQwMDAwMDAwMDAgLyBDT05GSUdfU0NMS19IWikpICsgMQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTF9SQVQgICgoQ09ORklHX0ZMQVNIX1NQRUVEX0JSQVQgKiA0KSAvICg0MDAwMDAwMDAwIC8gQ09ORklHX1NDTEtfSFopKSArIDEKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVExfSFQgICAoKENPTkZJR19GTEFTSF9TUEVFRF9CSFQgICogNCkgLyAoNDAwMDAwMDAwMCAvIENPTkZJR19TQ0xLX0haKSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVExfU1QgICAoKENPTkZJR19GTEFTSF9TUEVFRF9CU1QgICogNCkgLyAoNDAwMDAwMDAwMCAvIENPTkZJR19TQ0xLX0haKSkgKyAxCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMX1RUICAgKChDT05GSUdfRkxBU0hfU1BFRURfQlRUICAqIDQpIC8gKDQwMDAwMDAwMDAgLyBDT05GSUdfU0NMS19IWikpICsgMQotCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1RUID4gMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1RUICAgQjBUVF80Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfVFQgPT0gMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1RUICAgQjBUVF8zCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfVFQgPT0gMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1RUICAgQjBUVF8yCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfVFQgPCAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfVFQgICBCMFRUXzEKLSNlbmRpZgotCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1NUID4gMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1NUICAgQjBTVF80Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfU1QgPT0gMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1NUICAgQjBTVF8zCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfU1QgPT0gMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1NUICAgQjBTVF8yCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfU1QgPCAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfU1QgICBCMFNUXzEKLSNlbmRpZgotCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX0hUID4gMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX0hUICAgQjBIVF8zCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfSFQgPT0gMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX0hUICAgQjBIVF8yCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfSFQgPT0gMSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX0hUICAgQjBIVF8xCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfSFQgPT0gMCAmJiBDT05GSUdfRkxBU0hfU1BFRURfQkhUID09IDApCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9IVCAgIEIwSFRfMAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX0hUID09IDAgJiYgQ09ORklHX0ZMQVNIX1NQRUVEX0JIVCAhPSAwKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfSFQgICBCMEhUXzEKLSNlbmRpZgotCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA+IDE0KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xNQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAxNCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMTQKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMTMpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzEzCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDEyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xMgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAxMSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMTEKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMTApCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzEwCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDkpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzkKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gOCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfOAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSA3KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF83Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDYpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzYKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gNSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfNQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSA0KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF80Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDMpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAxKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xCi0jZW5kaWYKLQotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPiAxNCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMTUKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMTQpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzE0Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDEzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xMwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAxMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMTIKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMTEpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzExCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDEwKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xMAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSA5KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF85Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDgpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzgKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gNykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfNwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSA2KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF82Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDUpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzUKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gNCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfNAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8zCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzIKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMQotI2VuZGlmCi0KLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwICBcCi0JKGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgfCBmbGFzaF9FQklVX0FNQkNUTDBfUkFUIHwgZmxhc2hfRUJJVV9BTUJDVEwwX0hUIHwgXAotCSBmbGFzaF9FQklVX0FNQkNUTDBfU1QgfCBmbGFzaF9FQklVX0FNQkNUTDBfVFQgfCBDT05GSUdfRkxBU0hfU1BFRURfUkRZRU4pCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL21lbV9tYXAuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvbWVtX21hcC5oCmluZGV4IGVmNDZkYzkuLjAxOWUwMDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvbWVtX21hcC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvbWVtX21hcC5oCkBAIC05OSw0ICs5OSwxMCBAQAogI2RlZmluZSBMMV9TQ1JBVENIX1NUQVJUCTB4RkZCMDAwMDAKICNkZWZpbmUgTDFfU0NSQVRDSF9MRU5HVEgJMHgxMDAwCiAKKyNkZWZpbmUgR0VUX1BEQV9TQUZFKHByZWcpCQlcCisJcHJlZy5sID0gX2NwdV9wZGE7CQlcCisJcHJlZy5oID0gX2NwdV9wZGE7CisKKyNkZWZpbmUgR0VUX1BEQShwcmVnLCBkcmVnKQlHRVRfUERBX1NBRkUocHJlZykKKwogI2VuZGlmCQkJCS8qIF9NRU1fTUFQXzUyN19IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2ludHMtcHJpb3JpdHkuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbnRzLXByaW9yaXR5LmMKaW5kZXggOGEyMzY3NC4uZjhjOGFjZCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2ludHMtcHJpb3JpdHkuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW50cy1wcmlvcml0eS5jCkBAIC02OSwxNCArNjksMTQgQEAKIAkJCSgoQ09ORklHX0lSUV9NQUNfVFggLSA3KSA8PCBJUlFfTUFDX1RYX1BPUykgfAogCQkJKChDT05GSUdfSVJRX1BPUlRIX0lOVEIgLSA3KSA8PCBJUlFfUE9SVEhfSU5UQl9QT1MpKTsKIAotCWJmaW5fd3JpdGVfU0lDX0lBUjQoKChDT05GSUdfSVJRX1RNUjAgLSA3KSA8PCBJUlFfVE1SMF9QT1MpIHwKLQkJCSgoQ09ORklHX0lSUV9UTVIxIC0gNykgPDwgSVJRX1RNUjFfUE9TKSB8Ci0JCQkoKENPTkZJR19JUlFfVE1SMiAtIDcpIDw8IElSUV9UTVIyX1BPUykgfAotCQkJKChDT05GSUdfSVJRX1RNUjMgLSA3KSA8PCBJUlFfVE1SM19QT1MpIHwKLQkJCSgoQ09ORklHX0lSUV9UTVI0IC0gNykgPDwgSVJRX1RNUjRfUE9TKSB8Ci0JCQkoKENPTkZJR19JUlFfVE1SNSAtIDcpIDw8IElSUV9UTVI1X1BPUykgfAotCQkJKChDT05GSUdfSVJRX1RNUjYgLSA3KSA8PCBJUlFfVE1SNl9QT1MpIHwKLQkJCSgoQ09ORklHX0lSUV9UTVI3IC0gNykgPDwgSVJRX1RNUjdfUE9TKSk7CisJYmZpbl93cml0ZV9TSUNfSUFSNCgoKENPTkZJR19JUlFfVElNRVIwIC0gNykgPDwgSVJRX1RJTUVSMF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9USU1FUjEgLSA3KSA8PCBJUlFfVElNRVIxX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1RJTUVSMiAtIDcpIDw8IElSUV9USU1FUjJfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVElNRVIzIC0gNykgPDwgSVJRX1RJTUVSM19QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9USU1FUjQgLSA3KSA8PCBJUlFfVElNRVI0X1BPUykgfAorCQkJKChDT05GSUdfSVJRX1RJTUVSNSAtIDcpIDw8IElSUV9USU1FUjVfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVElNRVI2IC0gNykgPDwgSVJRX1RJTUVSNl9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9USU1FUjcgLSA3KSA8PCBJUlFfVElNRVI3X1BPUykpOwogCiAJYmZpbl93cml0ZV9TSUNfSUFSNSgoKENPTkZJR19JUlFfUE9SVEdfSU5UQSAtIDcpIDw8IElSUV9QT1JUR19JTlRBX1BPUykgfAogCQkJKChDT05GSUdfSVJRX1BPUlRHX0lOVEIgLSA3KSA8PCBJUlFfUE9SVEdfSU5UQl9QT1MpIHwKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9LY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL0tjb25maWcKaW5kZXggNzZiZWI3NS4uMTQ0MjdkZSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL0tjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL0tjb25maWcKQEAgLTU5LDcgKzU5LDcgQEAKIAlkZWZhdWx0IDEwCiBjb25maWcgVElNRVIwCiAJaW50ICJUSU1FUjAiCi0JZGVmYXVsdCAxMQorCWRlZmF1bHQgOAogY29uZmlnIFRJTUVSMQogCWludCAiVElNRVIxIgogCWRlZmF1bHQgMTEKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9NYWtlZmlsZSBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9NYWtlZmlsZQppbmRleCBhYTlmMjY0Li44NzQ4NDBmIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvTWFrZWZpbGUKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL01ha2VmaWxlCkBAIC0yLDYgKzIsNCBAQAogIyBhcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvTWFrZWZpbGUKICMKIAotZXh0cmEteSA6PSBoZWFkLm8KLQogb2JqLXkgOj0gaW50cy1wcmlvcml0eS5vIGRtYS5vCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL0g4NjA2LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL0g4NjA2LmMKaW5kZXggNzJhYzNhYy4uMGM2NmJmNCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9IODYwNi5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvSDg2MDYuYwpAQCAtMzEzLDIzICszMTMsMzMgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXJfcmVzb3VyY2VzW10gPSB7CiAjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NpcjBfcmVzb3VyY2VzW10gPSB7CiAJewogCQkuc3RhcnQgPSAweEZGQzAwNDAwLAogCQkuZW5kID0gMHhGRkMwMDRGRiwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKLSNlbmRpZgorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQwX1JYLAorCQkuZW5kID0gSVJRX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMF9SWCwKKwkJLmVuZCA9IENIX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Npcl9kZXZpY2UgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjBfZGV2aWNlID0gewogCS5uYW1lID0gImJmaW5fc2lyIiwKIAkuaWQgPSAwLAotCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3Npcl9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZSA9IGJmaW5fc2lyX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIwX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIwX3Jlc291cmNlcywKIH07CiAjZW5kaWYKKyNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMXzgyNTApIHx8IGRlZmluZWQoQ09ORklHX1NFUklBTF84MjUwX01PRFVMRSkKIApAQCAtNDMxLDcgKzQ0MSw5IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi0JJmJmaW5fc2lyX2RldmljZSwKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCisJJmJmaW5fc2lyMF9kZXZpY2UsCisjZW5kaWYKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfT1BFTkNPUkVTKSB8fCBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9PUEVOQ09SRVNfTU9EVUxFKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9ibGFja3N0YW1wLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2JsYWNrc3RhbXAuYwppbmRleCBkMDY0ZGVkLi42ZWU2MDdjIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2JsYWNrc3RhbXAuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2JsYWNrc3RhbXAuYwpAQCAtMjEyLDIzICsyMTIsMzMgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXJfcmVzb3VyY2VzW10gPSB7CiAjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NpcjBfcmVzb3VyY2VzW10gPSB7CiAJewogCQkuc3RhcnQgPSAweEZGQzAwNDAwLAogCQkuZW5kID0gMHhGRkMwMDRGRiwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKLSNlbmRpZgorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQwX1JYLAorCQkuZW5kID0gSVJRX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMF9SWCwKKwkJLmVuZCA9IENIX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Npcl9kZXZpY2UgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjBfZGV2aWNlID0gewogCS5uYW1lID0gImJmaW5fc2lyIiwKIAkuaWQgPSAwLAotCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3Npcl9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZSA9IGJmaW5fc2lyX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIwX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIwX3Jlc291cmNlcywKIH07CiAjZW5kaWYKKyNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fU1BPUlQpIHx8IGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOX1NQT1JUX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc3BvcnQwX3VhcnRfZGV2aWNlID0gewpAQCAtMzUzLDcgKzM2Myw5IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi0JJmJmaW5fc2lyX2RldmljZSwKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCisJJmJmaW5fc2lyMF9kZXZpY2UsCisjZW5kaWYKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fU1BPUlQpIHx8IGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOX1NQT1JUX01PRFVMRSkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvY21fYmY1MzMuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvY21fYmY1MzMuYwppbmRleCA1NzU4NDNmLi5lNzA2MWM3IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2NtX2JmNTMzLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9jbV9iZjUzMy5jCkBAIC0yMTksNiArMjE5LDE5IEBACiB9OwogI2VuZGlmCiAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9ncGlvc19yZXNvdXJjZXMgPSB7CisJLnN0YXJ0ID0gMCwKKwkuZW5kICAgPSBNQVhfQkxBQ0tGSU5fR1BJT1MgLSAxLAorCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9ncGlvc19kZXZpY2UgPSB7CisJLm5hbWUgPSAic2ltcGxlLWdwaW8iLAorCS5pZCA9IC0xLAorCS5udW1fcmVzb3VyY2VzID0gMSwKKwkucmVzb3VyY2UgPSAmYmZpbl9ncGlvc19yZXNvdXJjZXMsCit9OworCiAjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl91YXJ0X3Jlc291cmNlc1tdID0gewogCXsKQEAgLTIzNywyMyArMjUwLDMzIEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyX3Jlc291cmNlc1tdID0gewogI2lmZGVmIENPTkZJR19CRklOX1NJUjAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIwX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMDQwMCwKIAkJLmVuZCA9IDB4RkZDMDA0RkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCi0jZW5kaWYKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDBfUlgsCisJCS5lbmQgPSBDSF9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXJfZGV2aWNlID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIwX2RldmljZSA9IHsKIAkubmFtZSA9ICJiZmluX3NpciIsCiAJLmlkID0gMCwKLQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXJfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgPSBiZmluX3Npcl9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMF9yZXNvdXJjZXMsCiB9OwogI2VuZGlmCisjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOX1NQT1JUKSB8fCBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTl9TUE9SVF9NT0RVTEUpCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Nwb3J0MF91YXJ0X2RldmljZSA9IHsKQEAgLTM0Miw3ICszNjUsOSBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotCSZiZmluX3Npcl9kZXZpY2UsCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorCSZiZmluX3NpcjBfZGV2aWNlLAorI2VuZGlmCiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOX1NQT1JUKSB8fCBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTl9TUE9SVF9NT0RVTEUpCkBAIC0zNjUsNiArMzkwLDggQEAKICNpZiBkZWZpbmVkKENPTkZJR19TUElfQkZJTikgfHwgZGVmaW5lZChDT05GSUdfU1BJX0JGSU5fTU9EVUxFKQogCSZiZmluX3NwaTBfZGV2aWNlLAogI2VuZGlmCisKKwkmYmZpbl9ncGlvc19kZXZpY2UsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBjbV9iZjUzM19pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2V6a2l0LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2V6a2l0LmMKaW5kZXggY2MyZTdlZS4uMDhjZDA5NiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9lemtpdC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvZXpraXQuYwpAQCAtNDYsNyArNDYsNyBAQAogLyoKICAqIE5hbWUgdGhlIEJvYXJkIGZvciB0aGUgL3Byb2MvY3B1aW5mbwogICovCi1jb25zdCBjaGFyIGJmaW5fYm9hcmRfbmFtZVtdID0gIkFERFMtQkY1MzMtRVpLSVQiOworY29uc3QgY2hhciBiZmluX2JvYXJkX25hbWVbXSA9ICJBREkgQkY1MzMtRVpLSVQiOwogCiAjaWYgZGVmaW5lZChDT05GSUdfUlRDX0RSVl9CRklOKSB8fCBkZWZpbmVkKENPTkZJR19SVENfRFJWX0JGSU5fTU9EVUxFKQogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcnRjX2RldmljZSA9IHsKQEAgLTIzNiwyMyArMjM2LDMzIEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyX3Jlc291cmNlc1tdID0gewogI2lmZGVmIENPTkZJR19CRklOX1NJUjAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIwX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMDQwMCwKIAkJLmVuZCA9IDB4RkZDMDA0RkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCi0jZW5kaWYKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDBfUlgsCisJCS5lbmQgPSBDSF9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXJfZGV2aWNlID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIwX2RldmljZSA9IHsKIAkubmFtZSA9ICJiZmluX3NpciIsCiAJLmlkID0gMCwKLQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXJfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgPSBiZmluX3Npcl9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMF9yZXNvdXJjZXMsCiB9OwogI2VuZGlmCisjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX0dQSU8pIHx8IGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX0dQSU9fTU9EVUxFKQogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CkBAIC0zNjMsNyArMzczLDkgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKLQkmYmZpbl9zaXJfZGV2aWNlLAorI2lmZGVmIENPTkZJR19CRklOX1NJUjAKKwkmYmZpbl9zaXIwX2RldmljZSwKKyNlbmRpZgogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9HUElPKSB8fCBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9HUElPX01PRFVMRSkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvZ2VuZXJpY19ib2FyZC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9nZW5lcmljX2JvYXJkLmMKaW5kZXggODJiMWY2YS4uOTg2ZWVlYyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9nZW5lcmljX2JvYXJkLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9nZW5lcmljX2JvYXJkLmMKQEAgLTcyLDYgKzcyLDM1IEBACiB9OwogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQorI2lmZGVmIENPTkZJR19CRklOX1NJUjAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIwX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0ID0gMHhGRkMwMDQwMCwKKwkJLmVuZCA9IDB4RkZDMDA0RkYsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQwX1JYLAorCQkuZW5kID0gQ0hfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyMF9kZXZpY2UgPSB7CisJLm5hbWUgPSAiYmZpbl9zaXIiLAorCS5pZCA9IDAsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMF9yZXNvdXJjZXMsCit9OworI2VuZGlmCisjZW5kaWYKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmdlbmVyaWNfYm9hcmRfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAjaWYgZGVmaW5lZChDT05GSUdfUlRDX0RSVl9CRklOKSB8fCBkZWZpbmVkKENPTkZJR19SVENfRFJWX0JGSU5fTU9EVUxFKQogCSZydGNfZGV2aWNlLApAQCAtODAsNiArMTA5LDEyIEBACiAjaWYgZGVmaW5lZChDT05GSUdfU01DOTFYKSB8fCBkZWZpbmVkKENPTkZJR19TTUM5MVhfTU9EVUxFKQogCSZzbWM5MXhfZGV2aWNlLAogI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQorI2lmZGVmIENPTkZJR19CRklOX1NJUjAKKwkmYmZpbl9zaXIwX2RldmljZSwKKyNlbmRpZgorI2VuZGlmCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBnZW5lcmljX2JvYXJkX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvaXAweC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9pcDB4LmMKaW5kZXggNTg2NDg5Mi4uZTMwYjFiNyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9pcDB4LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9pcDB4LmMKQEAgLTE5NywyMyArMTk3LDMzIEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyX3Jlc291cmNlc1tdID0gewogI2lmZGVmIENPTkZJR19CRklOX1NJUjAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIwX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMDQwMCwKIAkJLmVuZCA9IDB4RkZDMDA0RkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCi0jZW5kaWYKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDBfUlgsCisJCS5lbmQgPSBDSF9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXJfZGV2aWNlID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIwX2RldmljZSA9IHsKIAkubmFtZSA9ICJiZmluX3NpciIsCiAJLmlkID0gMCwKLQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXJfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgPSBiZmluX3Npcl9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMF9yZXNvdXJjZXMsCiB9OwogI2VuZGlmCisjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX1VTQl9JU1AxMzYyX0hDRCkgfHwgZGVmaW5lZChDT05GSUdfVVNCX0lTUDEzNjJfSENEX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaXNwMTM2Ml9oY2RfcmVzb3VyY2VzW10gPSB7CkBAIC0yNzIsNyArMjgyLDkgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKLQkmYmZpbl9zaXJfZGV2aWNlLAorI2lmZGVmIENPTkZJR19CRklOX1NJUjAKKwkmYmZpbl9zaXIwX2RldmljZSwKKyNlbmRpZgogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19VU0JfSVNQMTM2Ml9IQ0QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9JU1AxMzYyX0hDRF9NT0RVTEUpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL3N0YW1wLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL3N0YW1wLmMKaW5kZXggMDUwZmZjYS4uMDdmOWFkMSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9zdGFtcC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvc3RhbXAuYwpAQCAtNDksNyArNDksNyBAQAogLyoKICAqIE5hbWUgdGhlIEJvYXJkIGZvciB0aGUgL3Byb2MvY3B1aW5mbwogICovCi1jb25zdCBjaGFyIGJmaW5fYm9hcmRfbmFtZVtdID0gIkFERFMtQkY1MzMtU1RBTVAiOworY29uc3QgY2hhciBiZmluX2JvYXJkX25hbWVbXSA9ICJBREkgQkY1MzMtU1RBTVAiOwogCiAjaWYgZGVmaW5lZChDT05GSUdfUlRDX0RSVl9CRklOKSB8fCBkZWZpbmVkKENPTkZJR19SVENfRFJWX0JGSU5fTU9EVUxFKQogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcnRjX2RldmljZSA9IHsKQEAgLTExOCw3ICsxMTgsNyBAQAogCQkub2Zmc2V0ID0gMCwKIAl9LCB7CiAJCS5uYW1lICAgPSAibGludXgga2VybmVsKG5vcikiLAotCQkuc2l6ZSAgID0gMHhFMDAwMCwKKwkJLnNpemUgICA9IDB4MTgwMDAwLAogCQkub2Zmc2V0ID0gTVREUEFSVF9PRlNfQVBQRU5ELAogCX0sIHsKIAkJLm5hbWUgICA9ICJmaWxlIHN5c3RlbShub3IpIiwKQEAgLTE2OSw3ICsxNjksNyBAQAogCQkubWFza19mbGFncyA9IE1URF9DQVBfUk9NCiAJfSwgewogCQkubmFtZSA9ICJsaW51eCBrZXJuZWwoc3BpKSIsCi0JCS5zaXplID0gMHhlMDAwMCwKKwkJLnNpemUgPSAweDE4MDAwMCwKIAkJLm9mZnNldCA9IE1URFBBUlRfT0ZTX0FQUEVORCwKIAl9LCB7CiAJCS5uYW1lID0gImZpbGUgc3lzdGVtKHNwaSkiLApAQCAtMjE2LDEzICsyMTYsNiBAQAogfTsKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfU1BJX01NQykgfHwgZGVmaW5lZChDT05GSUdfU1BJX01NQ19NT0RVTEUpCi1zdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX21tY19jaGlwX2luZm8gPSB7Ci0JLmVuYWJsZV9kbWEgPSAxLAotCS5iaXRzX3Blcl93b3JkID0gOCwKLX07Ci0jZW5kaWYKLQogI2lmIGRlZmluZWQoQ09ORklHX1NQSV9TUElERVYpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9TUElERVZfTU9EVUxFKQogc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaWRldl9jaGlwX2luZm8gPSB7CiAJLmVuYWJsZV9kbWEgPSAwLApAQCAtMjY1LDI3ICsyNTgsNiBAQAogCX0sCiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NTUMpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9NTUNfTU9EVUxFKQotCXsKLQkJLm1vZGFsaWFzID0gInNwaV9tbWNfZHVtbXkiLAotCQkubWF4X3NwZWVkX2h6ID0gMjAwMDAwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCi0JCS5idXNfbnVtID0gMCwKLQkJLmNoaXBfc2VsZWN0ID0gMCwKLQkJLnBsYXRmb3JtX2RhdGEgPSBOVUxMLAotCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaV9tbWNfY2hpcF9pbmZvLAotCQkubW9kZSA9IFNQSV9NT0RFXzMsCi0JfSwKLQl7Ci0JCS5tb2RhbGlhcyA9ICJzcGlfbW1jIiwKLQkJLm1heF9zcGVlZF9oeiA9IDIwMDAwMDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLwotCQkuYnVzX251bSA9IDAsCi0JCS5jaGlwX3NlbGVjdCA9IENPTkZJR19TUElfTU1DX0NTX0NIQU4sCi0JCS5wbGF0Zm9ybV9kYXRhID0gTlVMTCwKLQkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfbW1jX2NoaXBfaW5mbywKLQkJLm1vZGUgPSBTUElfTU9ERV8zLAotCX0sCi0jZW5kaWYKLQogI2lmIGRlZmluZWQoQ09ORklHX1BCWCkKIAl7CiAJCS5tb2RhbGlhcyA9ICJmeHMtc3BpIiwKQEAgLTM3MywyMyArMzQ1LDMzIEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyX3Jlc291cmNlc1tdID0gewogI2lmZGVmIENPTkZJR19CRklOX1NJUjAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIwX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMDQwMCwKIAkJLmVuZCA9IDB4RkZDMDA0RkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCi0jZW5kaWYKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDBfUlgsCisJCS5lbmQgPSBDSF9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXJfZGV2aWNlID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIwX2RldmljZSA9IHsKIAkubmFtZSA9ICJiZmluX3NpciIsCiAJLmlkID0gMCwKLQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXJfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgPSBiZmluX3Npcl9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMF9yZXNvdXJjZXMsCiB9OwogI2VuZGlmCisjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOX1NQT1JUKSB8fCBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTl9TUE9SVF9NT0RVTEUpCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Nwb3J0MF91YXJ0X2RldmljZSA9IHsKQEAgLTUzNyw3ICs1MTksOSBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotCSZiZmluX3Npcl9kZXZpY2UsCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorCSZiZmluX3NpcjBfZGV2aWNlLAorI2VuZGlmCiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOX1NQT1JUKSB8fCBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTl9TUE9SVF9NT0RVTEUpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvZG1hLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvZG1hLmMKaW5kZXggMjg2NTVjMS4uMGE2ZWI4ZiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2RtYS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9kbWEuYwpAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KIAotc3RydWN0IGRtYV9yZWdpc3RlciAqZG1hX2lvX2Jhc2VfYWRkcltNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUxdID0geworc3RydWN0IGRtYV9yZWdpc3RlciAqZG1hX2lvX2Jhc2VfYWRkcltNQVhfRE1BX0NIQU5ORUxTXSA9IHsKIAkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUEwX05FWFRfREVTQ19QVFIsCiAJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMV9ORVhUX0RFU0NfUFRSLAogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTJfTkVYVF9ERVNDX1BUUiwKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9oZWFkLlMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaGVhZC5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmM5NWFhLi4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9oZWFkLlMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2hlYWQuUwotICogQmFzZWQgb246Ci0gKiBBdXRob3I6ICAgICAgIEplZmYgRGlvbm5lIDxqZWZmQHVjbGludXgub3JnPiBDT1BZUklHSFQgMTk5OCBELiBKZWZmIERpb25uZQotICoKLSAqIENyZWF0ZWQ6ICAgICAgMTk5OAotICogRGVzY3JpcHRpb246ICBiZjUzMyBzdGFydHVwIGZpbGUKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+Ci0jaWZkZWYgQ09ORklHX0JGSU5fS0VSTkVMX0NMT0NLCi0jaW5jbHVkZSA8YXNtL2Nsb2Nrcy5oPgotI2luY2x1ZGUgPG1hY2gvbWVtX2luaXQuaD4KLSNlbmRpZgotCi0uc2VjdGlvbiAubDEudGV4dAotI2lmZGVmIENPTkZJR19CRklOX0tFUk5FTF9DTE9DSwotRU5UUlkoX3N0YXJ0X2RtYV9jb2RlKQotCXAwLmggPSBoaShTSUNfSVdSKTsKLQlwMC5sID0gbG8oU0lDX0lXUik7Ci0JcjAubCA9IDB4MTsKLQlyMC5oID0gMHgwOwotCVtwMF0gPSByMDsKLQlTU1lOQzsKLQotCS8qCi0JICogIFNldCBQTExfQ1RMCi0JICogICAtIFsxNDowOV0gPSBNU0VMWzU6MF0gOiBDTEtJTiAvIFZDTyBtdWx0aXBsaWNhdGlvbiBmYWN0b3JzCi0JICogICAtIFs4XSAgICAgPSBCWVBBU1MgICAgOiBCWVBBU1MgdGhlIFBMTCwgcnVuIENMS0lOIGludG8gQ0NMSy9TQ0xLCi0JICogICAtIFs3XSAgICAgPSBvdXRwdXQgZGVsYXkgKGFkZCAyMDBwcyBvZiBkZWxheSB0byBtZW0gc2lnbmFscykKLQkgKiAgIC0gWzZdICAgICA9IGlucHV0IGRlbGF5IChhZGQgMjAwcHMgb2YgaW5wdXQgZGVsYXkgdG8gbWVtIHNpZ25hbHMpCi0JICogICAtIFs1XSAgICAgPSBQRFdOICAgICAgOiAxPUFsbCBDbG9ja3Mgb2ZmCi0JICogICAtIFszXSAgICAgPSBTVE9QQ0sgICAgOiAxPUNvcmUgQ2xvY2sgb2ZmCi0JICogICAtIFsxXSAgICAgPSBQTExfT0ZGICAgOiAxPURpc2FibGUgUG93ZXIgdG8gUExMCi0JICogICAtIFswXSAgICAgPSBERiAgICAgICAgOiAxPVBhc3MgQ0xLSU4vMiB0byBQTEwgLyAwPVBhc3MgQ0xLSU4gdG8gUExMCi0JICogICBhbGwgb3RoZXIgYml0cyBzZXQgdG8gemVybwotCSAqLwotCi0JcDAuaCA9IGhpKFBMTF9MT0NLQ05UKTsKLQlwMC5sID0gbG8oUExMX0xPQ0tDTlQpOwotCXIwID0gMHgzMDAoWik7Ci0Jd1twMF0gPSByMC5sOwotCXNzeW5jOwotCi0JUDIuSCA9IGhpKEVCSVVfU0RHQ1RMKTsKLQlQMi5MID0gbG8oRUJJVV9TREdDVEwpOwotCVIwID0gW1AyXTsKLQlCSVRTRVQgKFIwLCAyNCk7Ci0JW1AyXSA9IFIwOwotCVNTWU5DOwotCi0JcjAgPSBDT05GSUdfVkNPX01VTFQgJiA2MzsgICAgICAgLyogTG9hZCB0aGUgVkNPIG11bHRpcGxpZXIgICAgICAgICAqLwotCXIwID0gcjAgPDwgOTsgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0IGl0IG92ZXIsICAgICAgICAgICAgICAgICAgKi8KLQlyMSA9IENMS0lOX0hBTEY7ICAgICAgICAgICAgICAgICAvKiBEbyB3ZSBuZWVkIHRvIGRpdmlkZSBDTEtJTiBieSAyPyovCi0JcjAgPSByMSB8IHIwOwotCXIxID0gUExMX0JZUEFTUzsgICAgICAgICAgICAgICAgIC8qIEJ5cGFzcyB0aGUgUExMPyAgICAgICAgICAgICAgICAgKi8KLQlyMSA9IHIxIDw8IDg7ICAgICAgICAgICAgICAgICAgICAvKiBTaGlmdCBpdCBvdmVyICAgICAgICAgICAgICAgICAgICovCi0JcjAgPSByMSB8IHIwOyAgICAgICAgICAgICAgICAgICAgLyogYWRkIHRoZW0gYWxsIHRvZ2V0aGVyICAgICAgICAgICAqLwotI2lmZGVmIEFOT01BTFlfMDUwMDAyNjUKLQlCSVRTRVQocjAsIDE1KTsgICAgICAgICAgICAgICAgICAvKiBBZGQgMjUwIG1WIG9mIGh5c3RlcmVzaXMgdG8gU1BPUlQgaW5wdXQgcGlucyAqLwotI2VuZGlmCi0KLQlwMC5oID0gaGkoUExMX0NUTCk7Ci0JcDAubCA9IGxvKFBMTF9DVEwpOyAgICAgICAgICAgICAgLyogTG9hZCB0aGUgYWRkcmVzcyAgICAgICAgICAgICAgICAqLwotCWNsaSByMjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERpc2FibGUgaW50ZXJydXB0cyAgICAgICAgICAgICAgKi8KLQlzc3luYzsKLQl3W3AwXSA9IHIwLmw7ICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIHZhbHVlICAgICAgICAgICAgICAgICAgICovCi0JaWRsZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2FpdCBmb3IgdGhlIFBMTCB0byBzdGFibGl6ZSAgICAqLwotCXN0aSByMjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVuYWJsZSBpbnRlcnJ1cHRzICAgICAgICAgICAgICAgKi8KLQotLkxjaGVja19hZ2FpbjoKLQlwMC5oID0gaGkoUExMX1NUQVQpOwotCXAwLmwgPSBsbyhQTExfU1RBVCk7Ci0JUjAgPSBXW1AwXShaKTsKLQlDQyA9IEJJVFRTVChSMCw1KTsKLQlpZiAhIENDIGp1bXAgLkxjaGVja19hZ2FpbjsKLQotCS8qIENvbmZpZ3VyZSBTQ0xLICYgQ0NMSyBEaXZpZGVycyAqLwotCXIwID0gKENPTkZJR19DQ0xLX0FDVF9ESVYgfCBDT05GSUdfU0NMS19ESVYpOwotCXAwLmggPSBoaShQTExfRElWKTsKLQlwMC5sID0gbG8oUExMX0RJVik7Ci0Jd1twMF0gPSByMC5sOwotCXNzeW5jOwotCi0JcDAubCA9IGxvKEVCSVVfU0RSUkMpOwotCXAwLmggPSBoaShFQklVX1NEUlJDKTsKLQlyMCA9IG1lbV9TRFJSQzsKLQl3W3AwXSA9IHIwLmw7Ci0Jc3N5bmM7Ci0KLQlQMi5IID0gaGkoRUJJVV9TREdDVEwpOwotCVAyLkwgPSBsbyhFQklVX1NER0NUTCk7Ci0JUjAgPSBbUDJdOwotCUJJVENMUiAoUjAsIDI0KTsKLQlwMC5oID0gaGkoRUJJVV9TRFNUQVQpOwotCXAwLmwgPSBsbyhFQklVX1NEU1RBVCk7Ci0JcjIubCA9IHdbcDBdOwotCWNjID0gYml0dHN0KHIyLDMpOwotCWlmICFjYyBqdW1wIC5Mc2tpcDsKLQlOT1A7Ci0JQklUU0VUIChSMCwgMjMpOwotLkxza2lwOgotCVtQMl0gPSBSMDsKLQlTU1lOQzsKLQotCVIwLkwgPSBsbyhtZW1fU0RHQ1RMKTsKLQlSMC5IID0gaGkobWVtX1NER0NUTCk7Ci0JUjEgPSBbcDJdOwotCVIxID0gUjEgfCBSMDsKLQlbUDJdID0gUjE7Ci0JU1NZTkM7Ci0KLQlSVFM7Ci1FTkRQUk9DKF9zdGFydF9kbWFfY29kZSkKLSNlbmRpZiAvKiBDT05GSUdfQkZJTl9LRVJORUxfQ0xPQ0sgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvYW5vbWFseS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9hbm9tYWx5LmgKaW5kZXggZjU0NGZjNS4uMGQzYTAzNCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9hbm9tYWx5LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9hbm9tYWx5LmgKQEAgLTcsNyArNyw3IEBACiAgKi8KIAogLyogVGhpcyBmaWxlIHNob3VsZSBiZSB1cCB0byBkYXRlIHdpdGg6Ci0gKiAgLSBSZXZpc2lvbiBELCAwNi8xOC8yMDA4OyBBRFNQLUJGNTMxL0JGNTMyL0JGNTMzIEJsYWNrZmluIFByb2Nlc3NvciBBbm9tYWx5IExpc3QKKyAqICAtIFJldmlzaW9uIEUsIDA5LzE4LzIwMDg7IEFEU1AtQkY1MzEvQkY1MzIvQkY1MzMgQmxhY2tmaW4gUHJvY2Vzc29yIEFub21hbHkgTGlzdAogICovCiAKICNpZm5kZWYgX01BQ0hfQU5PTUFMWV9IXwpAQCAtMTk0LDYgKzE5NCwxMiBAQAogI2RlZmluZSBBTk9NQUxZXzA1MDAwNDAzICgxKQogLyogU3BlY3VsYXRpdmUgRmV0Y2hlcyBDYW4gQ2F1c2UgVW5kZXNpcmVkIEV4dGVybmFsIEZJRk8gT3BlcmF0aW9ucyAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwNDE2ICgxKQorLyogTXVsdGljaGFubmVsIFNQT1JUIENoYW5uZWwgTWlzYWxpZ25tZW50IFVuZGVyIFNwZWNpZmljIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQyNSAoMSkKKy8qIFNwZWN1bGF0aXZlIEZldGNoZXMgb2YgSW5kaXJlY3QtUG9pbnRlciBJbnN0cnVjdGlvbnMgQ2FuIENhdXNlIEZhbHNlIEhhcmR3YXJlIEVycm9ycyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDI2ICgxKQorLyogSUZMVVNIIEluc3RydWN0aW9uIGF0IEVuZCBvZiBIYXJkd2FyZSBMb29wIENhdXNlcyBJbmZpbml0ZSBTdGFsbCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDQzICgxKQogCiAvKiBUaGVzZSBhbm9tYWxpZXMgaGF2ZSBiZWVuICJwaGFzZWQiIG91dCBvZiBhbmFsb2cuY29tIGFub21hbHkgc2hlZXRzIGFuZCBhcmUKICAqIGhlcmUgdG8gc2hvdyBydW5uaW5nIG9uIG9sZGVyIHNpbGljb24ganVzdCBpc24ndCBmZWFzaWJsZS4KQEAgLTI3Myw1ICsyNzksOCBAQAogI2RlZmluZSBBTk9NQUxZXzA1MDAwMzIzICgwKQogI2RlZmluZSBBTk9NQUxZXzA1MDAwMzUzICgxKQogI2RlZmluZSBBTk9NQUxZXzA1MDAwMzg2ICgxKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwNDEyICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwNDMyICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwNDM1ICgwKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvYmY1MzMuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvYmY1MzMuaAppbmRleCBkZmM4YzFhLi5jZjQ0MjdjIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2JmNTMzLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9iZjUzMy5oCkBAIC0xNDUsNyArMTQ1LDcgQEAKICNlbmRpZgogI2lmZGVmIENPTkZJR19CRjUzMgogI2RlZmluZSBDUFUgIkJGNTMyIgotI2RlZmluZSBDUFVJRCAweDI3NUEKKyNkZWZpbmUgQ1BVSUQgMHgyN2E1CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQkY1MzEKICNkZWZpbmUgQ1BVICJCRjUzMSIKQEAgLTE1Myw3ICsxNTMsNyBAQAogI2VuZGlmCiAKICNpZm5kZWYgQ1BVCi0jZXJyb3IgVW5rbm93biBDUFUgdHlwZSAtIFRoaXMga2VybmVsIGRvZXNuJ3Qgc2VlbSB0byBiZSBjb25maWd1cmVkIHByb3Blcmx5CisjZXJyb3IgIlVua25vd24gQ1BVIHR5cGUgLSBUaGlzIGtlcm5lbCBkb2Vzbid0IHNlZW0gdG8gYmUgY29uZmlndXJlZCBwcm9wZXJseSIKICNlbmRpZgogCiAjZW5kaWYJCQkJLyogX19NQUNIX0JGNTMzX0hfXyAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvYmZpbl9zaXIuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvYmZpbl9zaXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJiODdlOS4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2JmaW5fc2lyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIEJsYWNrZmluIEluZnJhLXJlZCBEcml2ZXIKLSAqCi0gKiBDb3B5cmlnaHQgMjAwNi0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KLSNpbmNsdWRlIDxhc20vZG1hLmg+Ci0jaW5jbHVkZSA8YXNtL3BvcnRtdXguaD4KLQotI2RlZmluZSBTSVJfVUFSVF9HRVRfQ0hBUihwb3J0KSAgIGJmaW5fcmVhZDE2KChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9SQlIpCi0jZGVmaW5lIFNJUl9VQVJUX0dFVF9ETEwocG9ydCkgICAgYmZpbl9yZWFkMTYoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0RMTCkKLSNkZWZpbmUgU0lSX1VBUlRfR0VUX0lFUihwb3J0KSAgICBiZmluX3JlYWQxNigocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfSUVSKQotI2RlZmluZSBTSVJfVUFSVF9HRVRfRExIKHBvcnQpICAgIGJmaW5fcmVhZDE2KChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9ETEgpCi0jZGVmaW5lIFNJUl9VQVJUX0dFVF9JSVIocG9ydCkgICAgYmZpbl9yZWFkMTYoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0lJUikKLSNkZWZpbmUgU0lSX1VBUlRfR0VUX0xDUihwb3J0KSAgICBiZmluX3JlYWQxNigocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfTENSKQotI2RlZmluZSBTSVJfVUFSVF9HRVRfR0NUTChwb3J0KSAgIGJmaW5fcmVhZDE2KChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9HQ1RMKQotCi0jZGVmaW5lIFNJUl9VQVJUX1BVVF9DSEFSKHBvcnQsIHYpIGJmaW5fd3JpdGUxNigoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX1RIUiksIHYpCi0jZGVmaW5lIFNJUl9VQVJUX1BVVF9ETEwocG9ydCwgdikgIGJmaW5fd3JpdGUxNigoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0RMTCksIHYpCi0jZGVmaW5lIFNJUl9VQVJUX1BVVF9JRVIocG9ydCwgdikgIGJmaW5fd3JpdGUxNigoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0lFUiksIHYpCi0jZGVmaW5lIFNJUl9VQVJUX1BVVF9ETEgocG9ydCwgdikgIGJmaW5fd3JpdGUxNigoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0RMSCksIHYpCi0jZGVmaW5lIFNJUl9VQVJUX1BVVF9MQ1IocG9ydCwgdikgIGJmaW5fd3JpdGUxNigoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0xDUiksIHYpCi0jZGVmaW5lIFNJUl9VQVJUX1BVVF9HQ1RMKHBvcnQsIHYpIGJmaW5fd3JpdGUxNigoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0dDVEwpLCB2KQotCi0jaWZkZWYgQ09ORklHX1NJUl9CRklOX0RNQQotc3RydWN0IGRtYV9yeF9idWYgewotCWNoYXIgKmJ1ZjsKLQlpbnQgaGVhZDsKLQlpbnQgdGFpbDsKLQl9OwotI2VuZGlmIC8qIENPTkZJR19TSVJfQkZJTl9ETUEgKi8KLQotc3RydWN0IGJmaW5fc2lyX3BvcnQgewotCXVuc2lnbmVkIGNoYXIgX19pb21lbSAgICptZW1iYXNlOwotCXVuc2lnbmVkIGludCAgICAgICAgICAgIGlycTsKLQl1bnNpZ25lZCBpbnQgICAgICAgICAgICBsc3I7Ci0JdW5zaWduZWQgbG9uZyAgICAgICAgICAgY2xrOwotCXN0cnVjdCBuZXRfZGV2aWNlICAgICAgICpkZXY7Ci0jaWZkZWYgQ09ORklHX1NJUl9CRklOX0RNQQotCWludCAgICAgICAgICAgICAgICAgICAgIHR4X2RvbmU7Ci0Jc3RydWN0IGRtYV9yeF9idWYgICAgICAgcnhfZG1hX2J1ZjsKLQlzdHJ1Y3QgdGltZXJfbGlzdCAgICAgICByeF9kbWFfdGltZXI7Ci0JaW50ICAgICAgICAgICAgICAgICAgICAgcnhfZG1hX25yb3dzOwotI2VuZGlmIC8qIENPTkZJR19TSVJfQkZJTl9ETUEgKi8KLQl1bnNpZ25lZCBpbnQgICAgICAgICAgICB0eF9kbWFfY2hhbm5lbDsKLQl1bnNpZ25lZCBpbnQgICAgICAgICAgICByeF9kbWFfY2hhbm5lbDsKLX07Ci0KLXN0cnVjdCBiZmluX3Npcl9wb3J0IHNpcl9wb3J0c1tCRklOX1VBUlRfTlJfUE9SVFNdOwotCi1zdHJ1Y3QgYmZpbl9zaXJfcG9ydF9yZXMgewotCXVuc2lnbmVkIGxvbmcgICBiYXNlX2FkZHI7Ci0JaW50ICAgICAgICAgICAgIGlycTsKLQl1bnNpZ25lZCBpbnQgICAgcnhfZG1hX2NoYW5uZWw7Ci0JdW5zaWduZWQgaW50ICAgIHR4X2RtYV9jaGFubmVsOwotfTsKLQotc3RydWN0IGJmaW5fc2lyX3BvcnRfcmVzIGJmaW5fc2lyX3BvcnRfcmVzb3VyY2VbXSA9IHsKLSNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCi0JewotCTB4RkZDMDA0MDAsCi0JSVJRX1VBUlRfUlgsCi0JQ0hfVUFSVF9SWCwKLQlDSF9VQVJUX1RYLAotCX0sCi0jZW5kaWYKLX07Ci0KLWludCBucl9zaXJzID0gQVJSQVlfU0laRShiZmluX3Npcl9wb3J0X3Jlc291cmNlKTsKLQotc3RydWN0IGJmaW5fc2lyX3NlbGYgewotCXN0cnVjdCBiZmluX3Npcl9wb3J0ICAgICpzaXJfcG9ydDsKLQlzcGlubG9ja190ICAgICAgICAgICAgICBsb2NrOwotCXVuc2lnbmVkIGludCAgICAgICAgICAgIG9wZW47Ci0JaW50ICAgICAgICAgICAgICAgICAgICAgc3BlZWQ7Ci0JaW50ICAgICAgICAgICAgICAgICAgICAgbmV3c3BlZWQ7Ci0KLQlzdHJ1Y3Qgc2tfYnVmZiAgICAgICAgICAqdHhza2I7Ci0Jc3RydWN0IHNrX2J1ZmYgICAgICAgICAgKnJ4c2tiOwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwotCXN0cnVjdCBkZXZpY2UgICAgICAgICAgICpkZXY7Ci0Jc3RydWN0IGlybGFwX2NiICAgICAgICAgKmlybGFwOwotCXN0cnVjdCBxb3NfaW5mbyAgICAgICAgIHFvczsKLQotCWlvYnVmZl90ICAgICAgICAgICAgICAgIHR4X2J1ZmY7Ci0JaW9idWZmX3QgICAgICAgICAgICAgICAgcnhfYnVmZjsKLQotCXN0cnVjdCB3b3JrX3N0cnVjdCAgICAgIHdvcms7Ci0JaW50ICAgICAgICAgICAgICAgICAgICAgbXR0OwotfTsKLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgU0lSX1VBUlRfR0VUX0xTUihzdHJ1Y3QgYmZpbl9zaXJfcG9ydCAqcG9ydCkKLXsKLQl1bnNpZ25lZCBpbnQgbHNyID0gYmZpbl9yZWFkMTYocG9ydC0+bWVtYmFzZSArIE9GRlNFVF9MU1IpOwotCXBvcnQtPmxzciB8PSAobHNyICYgKEJJfEZFfFBFfE9FKSk7Ci0JcmV0dXJuIGxzciB8IHBvcnQtPmxzcjsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIFNJUl9VQVJUX0NMRUFSX0xTUihzdHJ1Y3QgYmZpbl9zaXJfcG9ydCAqcG9ydCkKLXsKLQlwb3J0LT5sc3IgPSAwOwotCWJmaW5fcmVhZDE2KHBvcnQtPm1lbWJhc2UgKyBPRkZTRVRfTFNSKTsKLX0KLQotI2RlZmluZSBEUklWRVJfTkFNRSAiYmZpbl9zaXIiCi0KLXN0YXRpYyBpbnQgYmZpbl9zaXJfaHdfaW5pdCh2b2lkKQotewotCWludCByZXQgPSAtRU5PREVWOwotI2lmZGVmIENPTkZJR19CRklOX1NJUjAKLQlyZXQgPSBwZXJpcGhlcmFsX3JlcXVlc3QoUF9VQVJUMF9UWCwgRFJJVkVSX05BTUUpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0JcmV0ID0gcGVyaXBoZXJhbF9yZXF1ZXN0KFBfVUFSVDBfUlgsIERSSVZFUl9OQU1FKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotI2VuZGlmCi0JcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaAppbmRleCBkODA5NzFiLi4wNDUxODRmIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oCkBAIC00NCw2ICs0NCwxMyBAQAogCiAjZGVmaW5lIEJGSU5fVUFSVF9OUl9QT1JUUyAgICAgIDEKIAorI2RlZmluZSBDSF9VQVJUX1JYIENIX1VBUlQwX1JYCisjZGVmaW5lIENIX1VBUlRfVFggQ0hfVUFSVDBfVFgKKworI2RlZmluZSBJUlFfVUFSVF9FUlJPUiBJUlFfVUFSVDBfRVJST1IKKyNkZWZpbmUgSVJRX1VBUlRfUlggICAgSVJRX1VBUlQwX1JYCisjZGVmaW5lIElSUV9VQVJUX1RYICAgIElSUV9VQVJUMF9UWAorCiAjZGVmaW5lIE9GRlNFVF9USFIgICAgICAgICAgICAgIDB4MDAJLyogVHJhbnNtaXQgSG9sZGluZyByZWdpc3RlciAgICAgICAgICAgICovCiAjZGVmaW5lIE9GRlNFVF9SQlIgICAgICAgICAgICAgIDB4MDAJLyogUmVjZWl2ZSBCdWZmZXIgcmVnaXN0ZXIgICAgICAgICAgICAgICovCiAjZGVmaW5lIE9GRlNFVF9ETEwgICAgICAgICAgICAgIDB4MDAJLyogRGl2aXNvciBMYXRjaCAoTG93LUJ5dGUpICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2NkZWZCRjUzMi5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9jZGVmQkY1MzIuaAppbmRleCAzZDg5NzhhLi5iYmMzYzgzIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2NkZWZCRjUzMi5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvY2RlZkJGNTMyLmgKQEAgLTM5LDMxICszOSw4IEBACiAvKmluY2x1ZGUgY29yZSBzcGVjaWZpYyByZWdpc3RlciBwb2ludGVyIGRlZmluaXRpb25zKi8KICNpbmNsdWRlIDxhc20vY2RlZl9MUEJsYWNrZmluLmg+CiAKLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0KIC8qIENsb2NrIGFuZCBTeXN0ZW0gQ29udHJvbCAoMHhGRkMwIDA0MDAtMHhGRkMwIDA3RkYpICovCiAjZGVmaW5lIGJmaW5fcmVhZF9QTExfQ1RMKCkgICAgICAgICAgICAgICAgICBiZmluX3JlYWQxNihQTExfQ1RMKQotLyogV3JpdGluZyB0byBQTExfQ1RMIGluaXRpYXRlcyBhIFBMTCByZWxvY2sgc2VxdWVuY2UuICovCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGJmaW5fd3JpdGVfUExMX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGl3cjsKLQotCWlmICh2YWwgPT0gYmZpbl9yZWFkX1BMTF9DVEwoKSkKLQkJcmV0dXJuOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCS8qIEVuYWJsZSB0aGUgUExMIFdha2V1cCBiaXQgaW4gU0lDIElXUiAqLwotCWl3ciA9IGJmaW5fcmVhZDMyKFNJQ19JV1IpOwotCS8qIE9ubHkgYWxsb3cgUFBMIFdha2V1cCkgKi8KLQliZmluX3dyaXRlMzIoU0lDX0lXUiwgSVdSX0VOQUJMRSgwKSk7Ci0KLQliZmluX3dyaXRlMTYoUExMX0NUTCwgdmFsKTsKLQlTU1lOQygpOwotCWFzbSgiSURMRTsiKTsKLQotCWJmaW5fd3JpdGUzMihTSUNfSVdSLCBpd3IpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KICNkZWZpbmUgYmZpbl9yZWFkX1BMTF9TVEFUKCkgICAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KFBMTF9TVEFUKQogI2RlZmluZSBiZmluX3dyaXRlX1BMTF9TVEFUKHZhbCkgICAgICAgICAgICAgYmZpbl93cml0ZTE2KFBMTF9TVEFULHZhbCkKICNkZWZpbmUgYmZpbl9yZWFkX1BMTF9MT0NLQ05UKCkgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KFBMTF9MT0NLQ05UKQpAQCAtNzIsMjcgKzQ5LDYgQEAKICNkZWZpbmUgYmZpbl9yZWFkX1BMTF9ESVYoKSAgICAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KFBMTF9ESVYpCiAjZGVmaW5lIGJmaW5fd3JpdGVfUExMX0RJVih2YWwpICAgICAgICAgICAgICBiZmluX3dyaXRlMTYoUExMX0RJVix2YWwpCiAjZGVmaW5lIGJmaW5fcmVhZF9WUl9DVEwoKSAgICAgICAgICAgICAgICAgICBiZmluX3JlYWQxNihWUl9DVEwpCi0vKiBXcml0aW5nIHRvIFZSX0NUTCBpbml0aWF0ZXMgYSBQTEwgcmVsb2NrIHNlcXVlbmNlLiAqLwotc3RhdGljIF9faW5saW5lX18gdm9pZCBiZmluX3dyaXRlX1ZSX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGl3cjsKLQotCWlmICh2YWwgPT0gYmZpbl9yZWFkX1ZSX0NUTCgpKQotCQlyZXR1cm47Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JLyogRW5hYmxlIHRoZSBQTEwgV2FrZXVwIGJpdCBpbiBTSUMgSVdSICovCi0JaXdyID0gYmZpbl9yZWFkMzIoU0lDX0lXUik7Ci0JLyogT25seSBhbGxvdyBQUEwgV2FrZXVwKSAqLwotCWJmaW5fd3JpdGUzMihTSUNfSVdSLCBJV1JfRU5BQkxFKDApKTsKLQotCWJmaW5fd3JpdGUxNihWUl9DVEwsIHZhbCk7Ci0JU1NZTkMoKTsKLQlhc20oIklETEU7Iik7Ci0KLQliZmluX3dyaXRlMzIoU0lDX0lXUiwgaXdyKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19CiAKIC8qIFN5c3RlbSBJbnRlcnJ1cHQgQ29udHJvbGxlciAoMHhGRkMwIDBDMDAtMHhGRkMwIDBGRkYpICovCiAjZGVmaW5lIGJmaW5fcmVhZF9TV1JTVCgpICAgICAgICAgICAgICAgICAgICBiZmluX3JlYWQxNihTV1JTVCkKQEAgLTE3OCw1MCArMTM0LDYgQEAKICNkZWZpbmUgYmZpbl9yZWFkX0ZJT19NQVNLQl9UKCkgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KEZJT19NQVNLQl9UKQogI2RlZmluZSBiZmluX3dyaXRlX0ZJT19NQVNLQl9UKHZhbCkgICAgICAgICAgYmZpbl93cml0ZTE2KEZJT19NQVNLQl9ULHZhbCkKIAotCi0jaWYgQU5PTUFMWV8wNTAwMDMxMQotI2RlZmluZSBCRklOX1dSSVRFX0ZJT19GTEFHKG5hbWUpIFwKLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgYmZpbl93cml0ZV9GSU9fRkxBR18gIyMgbmFtZSAodW5zaWduZWQgc2hvcnQgdmFsKVwKLXtcCi0JdW5zaWduZWQgbG9uZyBmbGFncztcCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpO1wKLQliZmluX3dyaXRlMTYoRklPX0ZMQUdfICMjIG5hbWUsdmFsKTtcCi0JYmZpbl9yZWFkX0NISVBJRCgpO1wKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7XAotfQotQkZJTl9XUklURV9GSU9fRkxBRyhEKQotQkZJTl9XUklURV9GSU9fRkxBRyhDKQotQkZJTl9XUklURV9GSU9fRkxBRyhTKQotQkZJTl9XUklURV9GSU9fRkxBRyhUKQotCi0jZGVmaW5lIEJGSU5fUkVBRF9GSU9fRkxBRyhuYW1lKSBcCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBzaG9ydCBiZmluX3JlYWRfRklPX0ZMQUdfICMjIG5hbWUgKHZvaWQpXAote1wKLQl1bnNpZ25lZCBsb25nIGZsYWdzO1wKLQl1bnNpZ25lZCBzaG9ydCByZXQ7XAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTtcCi0JcmV0ID0gYmZpbl9yZWFkMTYoRklPX0ZMQUdfICMjIG5hbWUpO1wKLQliZmluX3JlYWRfQ0hJUElEKCk7XAotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTtcCi0JcmV0dXJuIHJldDtcCi19Ci1CRklOX1JFQURfRklPX0ZMQUcoRCkKLUJGSU5fUkVBRF9GSU9fRkxBRyhDKQotQkZJTl9SRUFEX0ZJT19GTEFHKFMpCi1CRklOX1JFQURfRklPX0ZMQUcoVCkKLQotI2Vsc2UKLSNkZWZpbmUgYmZpbl93cml0ZV9GSU9fRkxBR19EKHZhbCkgICAgICAgICAgIGJmaW5fd3JpdGUxNihGSU9fRkxBR19ELHZhbCkKLSNkZWZpbmUgYmZpbl93cml0ZV9GSU9fRkxBR19DKHZhbCkgICAgICAgICAgIGJmaW5fd3JpdGUxNihGSU9fRkxBR19DLHZhbCkKLSNkZWZpbmUgYmZpbl93cml0ZV9GSU9fRkxBR19TKHZhbCkgICAgICAgICAgIGJmaW5fd3JpdGUxNihGSU9fRkxBR19TLHZhbCkKLSNkZWZpbmUgYmZpbl93cml0ZV9GSU9fRkxBR19UKHZhbCkgICAgICAgICAgIGJmaW5fd3JpdGUxNihGSU9fRkxBR19ULHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0ZJT19GTEFHX1QoKSAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KEZJT19GTEFHX1QpCi0jZGVmaW5lIGJmaW5fcmVhZF9GSU9fRkxBR19DKCkgICAgICAgICAgICAgICBiZmluX3JlYWQxNihGSU9fRkxBR19DKQotI2RlZmluZSBiZmluX3JlYWRfRklPX0ZMQUdfUygpICAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoRklPX0ZMQUdfUykKLSNkZWZpbmUgYmZpbl9yZWFkX0ZJT19GTEFHX0QoKSAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KEZJT19GTEFHX0QpCi0jZW5kaWYKLQotCiAvKiBETUEgQ29udHJvbGxlciAqLwogI2RlZmluZSBiZmluX3JlYWRfRE1BMF9DT05GSUcoKSAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoRE1BMF9DT05GSUcpCiAjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9DT05GSUcodmFsKSAgICAgICAgICBiZmluX3dyaXRlMTYoRE1BMF9DT05GSUcsdmFsKQpAQCAtNzY0LDQgKzY3Niw5MyBAQAogI2RlZmluZSBiZmluX3JlYWRfUFBJX0ZSQU1FKCkgICAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoUFBJX0ZSQU1FKQogI2RlZmluZSBiZmluX3dyaXRlX1BQSV9GUkFNRSh2YWwpICAgICAgICAgICAgYmZpbl93cml0ZTE2KFBQSV9GUkFNRSx2YWwpCiAKKy8qIFRoZXNlIG5lZWQgdG8gYmUgbGFzdCBkdWUgdG8gdGhlIGNkZWYvbGludXggaW50ZXItZGVwZW5kZW5jaWVzICovCisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaWYgQU5PTUFMWV8wNTAwMDMxMQorI2RlZmluZSBCRklOX1dSSVRFX0ZJT19GTEFHKG5hbWUpIFwKK3N0YXRpYyBpbmxpbmUgdm9pZCBiZmluX3dyaXRlX0ZJT19GTEFHXyMjbmFtZSh1bnNpZ25lZCBzaG9ydCB2YWwpIFwKK3sgXAorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7IFwKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7IFwKKwliZmluX3dyaXRlMTYoRklPX0ZMQUdfIyNuYW1lLCB2YWwpOyBcCisJYmZpbl9yZWFkX0NISVBJRCgpOyBcCisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOyBcCit9CitCRklOX1dSSVRFX0ZJT19GTEFHKEQpCitCRklOX1dSSVRFX0ZJT19GTEFHKEMpCitCRklOX1dSSVRFX0ZJT19GTEFHKFMpCitCRklOX1dSSVRFX0ZJT19GTEFHKFQpCisKKyNkZWZpbmUgQkZJTl9SRUFEX0ZJT19GTEFHKG5hbWUpIFwKK3N0YXRpYyBpbmxpbmUgdTE2IGJmaW5fcmVhZF9GSU9fRkxBR18jI25hbWUodm9pZCkgXAoreyBcCisJdW5zaWduZWQgbG9uZyBmbGFnczsgXAorCXUxNiByZXQ7IFwKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7IFwKKwlyZXQgPSBiZmluX3JlYWQxNihGSU9fRkxBR18jI25hbWUpOyBcCisJYmZpbl9yZWFkX0NISVBJRCgpOyBcCisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOyBcCisJcmV0dXJuIHJldDsgXAorfQorQkZJTl9SRUFEX0ZJT19GTEFHKEQpCitCRklOX1JFQURfRklPX0ZMQUcoQykKK0JGSU5fUkVBRF9GSU9fRkxBRyhTKQorQkZJTl9SRUFEX0ZJT19GTEFHKFQpCisKKyNlbHNlCisjZGVmaW5lIGJmaW5fd3JpdGVfRklPX0ZMQUdfRCh2YWwpICAgICAgICAgICBiZmluX3dyaXRlMTYoRklPX0ZMQUdfRCwgdmFsKQorI2RlZmluZSBiZmluX3dyaXRlX0ZJT19GTEFHX0ModmFsKSAgICAgICAgICAgYmZpbl93cml0ZTE2KEZJT19GTEFHX0MsIHZhbCkKKyNkZWZpbmUgYmZpbl93cml0ZV9GSU9fRkxBR19TKHZhbCkgICAgICAgICAgIGJmaW5fd3JpdGUxNihGSU9fRkxBR19TLCB2YWwpCisjZGVmaW5lIGJmaW5fd3JpdGVfRklPX0ZMQUdfVCh2YWwpICAgICAgICAgICBiZmluX3dyaXRlMTYoRklPX0ZMQUdfVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRklPX0ZMQUdfVCgpICAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoRklPX0ZMQUdfVCkKKyNkZWZpbmUgYmZpbl9yZWFkX0ZJT19GTEFHX0MoKSAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KEZJT19GTEFHX0MpCisjZGVmaW5lIGJmaW5fcmVhZF9GSU9fRkxBR19TKCkgICAgICAgICAgICAgICBiZmluX3JlYWQxNihGSU9fRkxBR19TKQorI2RlZmluZSBiZmluX3JlYWRfRklPX0ZMQUdfRCgpICAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoRklPX0ZMQUdfRCkKKyNlbmRpZgorCisvKiBXcml0aW5nIHRvIFBMTF9DVEwgaW5pdGlhdGVzIGEgUExMIHJlbG9jayBzZXF1ZW5jZS4gKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgYmZpbl93cml0ZV9QTExfQ1RMKHVuc2lnbmVkIGludCB2YWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncywgaXdyOworCisJaWYgKHZhbCA9PSBiZmluX3JlYWRfUExMX0NUTCgpKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CisJLyogRW5hYmxlIHRoZSBQTEwgV2FrZXVwIGJpdCBpbiBTSUMgSVdSICovCisJaXdyID0gYmZpbl9yZWFkMzIoU0lDX0lXUik7CisJLyogT25seSBhbGxvdyBQUEwgV2FrZXVwKSAqLworCWJmaW5fd3JpdGUzMihTSUNfSVdSLCBJV1JfRU5BQkxFKDApKTsKKworCWJmaW5fd3JpdGUxNihQTExfQ1RMLCB2YWwpOworCVNTWU5DKCk7CisJYXNtKCJJRExFOyIpOworCisJYmZpbl93cml0ZTMyKFNJQ19JV1IsIGl3cik7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOworfQorCisvKiBXcml0aW5nIHRvIFZSX0NUTCBpbml0aWF0ZXMgYSBQTEwgcmVsb2NrIHNlcXVlbmNlLiAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCBiZmluX3dyaXRlX1ZSX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGl3cjsKKworCWlmICh2YWwgPT0gYmZpbl9yZWFkX1ZSX0NUTCgpKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CisJLyogRW5hYmxlIHRoZSBQTEwgV2FrZXVwIGJpdCBpbiBTSUMgSVdSICovCisJaXdyID0gYmZpbl9yZWFkMzIoU0lDX0lXUik7CisJLyogT25seSBhbGxvdyBQUEwgV2FrZXVwKSAqLworCWJmaW5fd3JpdGUzMihTSUNfSVdSLCBJV1JfRU5BQkxFKDApKTsKKworCWJmaW5fd3JpdGUxNihWUl9DVEwsIHZhbCk7CisJU1NZTkMoKTsKKwlhc20oIklETEU7Iik7CisKKwliZmluX3dyaXRlMzIoU0lDX0lXUiwgaXdyKTsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7Cit9CisKICNlbmRpZgkJCQkvKiBfQ0RFRl9CRjUzMl9IICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2RtYS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9kbWEuaAppbmRleCBiZDlkNWU5Li5mYjM0OTM0IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2RtYS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvZG1hLmgKQEAgLTEsNDIgKzEsMTQgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgQkYtNTMzLzIvMSBTcGVjaWZpYyBEZWNsYXJhdGlvbnMKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTMzL2RtYS5oCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKy8qIG1hY2gvZG1hLmggLSBhcmNoLXNwZWNpZmljIERNQSBkZWZpbmVzCiAgKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOgorICogQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogUmV2OgotICoKLSAqIE1vZGlmaWVkOgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCi0gKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpZm5kZWYgX01BQ0hfRE1BX0hfCiAjZGVmaW5lIF9NQUNIX0RNQV9IXwogCi0jZGVmaW5lIE1BWF9CTEFDS0ZJTl9ETUFfQ0hBTk5FTCAxMgorI2RlZmluZSBNQVhfRE1BX0NIQU5ORUxTIDEyCiAKICNkZWZpbmUgQ0hfUFBJICAgICAgICAgIDAKICNkZWZpbmUgQ0hfU1BPUlQwX1JYICAgIDEKQEAgLTQ0LDggKzE2LDggQEAKICNkZWZpbmUgQ0hfU1BPUlQxX1JYICAgIDMKICNkZWZpbmUgQ0hfU1BPUlQxX1RYICAgIDQKICNkZWZpbmUgQ0hfU1BJICAgICAgICAgIDUKLSNkZWZpbmUgQ0hfVUFSVF9SWCAgICAgIDYKLSNkZWZpbmUgQ0hfVUFSVF9UWCAgICAgIDcKKyNkZWZpbmUgQ0hfVUFSVDBfUlggICAgIDYKKyNkZWZpbmUgQ0hfVUFSVDBfVFggICAgIDcKICNkZWZpbmUgQ0hfTUVNX1NUUkVBTTBfREVTVCAgICAgOAkgLyogVFggKi8KICNkZWZpbmUgQ0hfTUVNX1NUUkVBTTBfU1JDICAgICAgOQkgLyogUlggKi8KICNkZWZpbmUgQ0hfTUVNX1NUUkVBTTFfREVTVCAgICAgMTAJIC8qIFRYICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvZ3Bpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NWMxNzAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMCwwICsxLDM0IEBACisvKgorICogRmlsZTogYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9ncGlvLmgKKyAqIEJ1Z3M6IEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworCisjaWZuZGVmIF9NQUNIX0dQSU9fSF8KKyNkZWZpbmUgX01BQ0hfR1BJT19IXworCisjZGVmaW5lIE1BWF9CTEFDS0ZJTl9HUElPUyAxNgorCisjZGVmaW5lCUdQSU9fUEYwCTAKKyNkZWZpbmUJR1BJT19QRjEJMQorI2RlZmluZQlHUElPX1BGMgkyCisjZGVmaW5lCUdQSU9fUEYzCTMKKyNkZWZpbmUJR1BJT19QRjQJNAorI2RlZmluZQlHUElPX1BGNQk1CisjZGVmaW5lCUdQSU9fUEY2CTYKKyNkZWZpbmUJR1BJT19QRjcJNworI2RlZmluZQlHUElPX1BGOAk4CisjZGVmaW5lCUdQSU9fUEY5CTkKKyNkZWZpbmUJR1BJT19QRjEwCTEwCisjZGVmaW5lCUdQSU9fUEYxMQkxMQorI2RlZmluZQlHUElPX1BGMTIJMTIKKyNkZWZpbmUJR1BJT19QRjEzCTEzCisjZGVmaW5lCUdQSU9fUEYxNAkxNAorI2RlZmluZQlHUElPX1BGMTUJMTUKKworI2RlZmluZSBQT1JUX0YgR1BJT19QRjAKKworI2VuZGlmIC8qIF9NQUNIX0dQSU9fSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvaXJxLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2lycS5oCmluZGV4IDVhYTM4ZTUuLmRiMWUzNDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvaXJxLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9pcnEuaApAQCAtOTAsMTkgKzkwLDE5IEBACiAjZGVmaW5lCUlSUV9TUE9SVDBfRVJST1IJMTAJLypTUE9SVDAgRXJyb3IgSW50ZXJydXB0ICovCiAjZGVmaW5lCUlSUV9TUE9SVDFfRVJST1IJMTEJLypTUE9SVDEgRXJyb3IgSW50ZXJydXB0ICovCiAjZGVmaW5lCUlSUV9TUElfRVJST1IJCTEyCS8qU1BJIEVycm9yIEludGVycnVwdCAqLwotI2RlZmluZQlJUlFfVUFSVF9FUlJPUgkJMTMJLypVQVJUIEVycm9yIEludGVycnVwdCAqLworI2RlZmluZQlJUlFfVUFSVDBfRVJST1IJCTEzCS8qVUFSVCBFcnJvciBJbnRlcnJ1cHQgKi8KICNkZWZpbmUJSVJRX1JUQwkJCTE0CS8qUlRDIEludGVycnVwdCAqLwogI2RlZmluZQlJUlFfUFBJCQkJMTUJLypETUEwIEludGVycnVwdCAoUFBJKSAqLwogI2RlZmluZQlJUlFfU1BPUlQwX1JYCQkxNgkvKkRNQTEgSW50ZXJydXB0IChTUE9SVDAgUlgpICovCiAjZGVmaW5lCUlSUV9TUE9SVDBfVFgJCTE3CS8qRE1BMiBJbnRlcnJ1cHQgKFNQT1JUMCBUWCkgKi8KICNkZWZpbmUJSVJRX1NQT1JUMV9SWAkJMTgJLypETUEzIEludGVycnVwdCAoU1BPUlQxIFJYKSAqLwogI2RlZmluZQlJUlFfU1BPUlQxX1RYCQkxOQkvKkRNQTQgSW50ZXJydXB0IChTUE9SVDEgVFgpICovCi0jZGVmaW5lIAlJUlFfU1BJCQkJMjAJLypETUE1IEludGVycnVwdCAoU1BJKSAqLwotI2RlZmluZQlJUlFfVUFSVF9SWAkJMjEJLypETUE2IEludGVycnVwdCAoVUFSVCBSWCkgKi8KLSNkZWZpbmUJSVJRX1VBUlRfVFgJCTIyCS8qRE1BNyBJbnRlcnJ1cHQgKFVBUlQgVFgpICovCi0jZGVmaW5lCUlSUV9UTVIwCQkyMwkvKlRpbWVyIDAgKi8KLSNkZWZpbmUJSVJRX1RNUjEJCTI0CS8qVGltZXIgMSAqLwotI2RlZmluZQlJUlFfVE1SMgkJMjUJLypUaW1lciAyICovCisjZGVmaW5lCUlSUV9TUEkJCQkyMAkvKkRNQTUgSW50ZXJydXB0IChTUEkpICovCisjZGVmaW5lCUlSUV9VQVJUMF9SWAkJMjEJLypETUE2IEludGVycnVwdCAoVUFSVCBSWCkgKi8KKyNkZWZpbmUJSVJRX1VBUlQwX1RYCQkyMgkvKkRNQTcgSW50ZXJydXB0IChVQVJUIFRYKSAqLworI2RlZmluZQlJUlFfVElNRVIwCQkyMwkvKlRpbWVyIDAgKi8KKyNkZWZpbmUJSVJRX1RJTUVSMQkJMjQJLypUaW1lciAxICovCisjZGVmaW5lCUlSUV9USU1FUjIJCTI1CS8qVGltZXIgMiAqLwogI2RlZmluZQlJUlFfUFJPR19JTlRBCQkyNgkvKlByb2dyYW1tYWJsZSBGbGFncyBBICg4KSAqLwogI2RlZmluZQlJUlFfUFJPR19JTlRCCQkyNwkvKlByb2dyYW1tYWJsZSBGbGFncyBCICg4KSAqLwogI2RlZmluZQlJUlFfTUVNX0RNQTAJCTI4CS8qRE1BOC85IEludGVycnVwdCAoTWVtb3J5IERNQSBTdHJlYW0gMCkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvbWVtX2luaXQuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvbWVtX2luaXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQyMDM0Yi4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL21lbV9pbml0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOTcgKzAsMCBAQAotLyoKLSAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUzMy9tZW1faW5pdC5oCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKLSAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246Ci0gKgotICogUmV2OgotICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA2IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgotICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqLwotCi0jaWYgKENPTkZJR19NRU1fTVQ0OExDMTZNMTZBMlRHXzc1IHx8IENPTkZJR19NRU1fTVQ0OExDNjRNNEEyRkJfN0UgfHwgXAotICAgICBDT05GSUdfTUVNX01UNDhMQzMyTTE2QTJUR183NSB8fCBDT05GSUdfTUVNX0dFTkVSSUNfQk9BUkQpCi0jaWYgKENPTkZJR19TQ0xLX0haID4gMTE5NDAyOTg1KQotI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzIKLSNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDIKLSNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfNwotI2RlZmluZSBTRFJBTV90UkFTX251bSAgNwotI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8yCi0jZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgotI2VuZGlmCi0jaWYgKENPTkZJR19TQ0xLX0haID4gMTA0NDc3NjEyKSAmJiAoQ09ORklHX1NDTEtfSFogPD0gMTE5NDAyOTg1KQotI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzIKLSNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDIKLSNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfNgotI2RlZmluZSBTRFJBTV90UkFTX251bSAgNgotI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8yCi0jZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgotI2VuZGlmCi0jaWYgKENPTkZJR19TQ0xLX0haID4gODk1NTIyMzkpICYmIChDT05GSUdfU0NMS19IWiA8PSAxMDQ0Nzc2MTIpCi0jZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMgotI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMgotI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU181Ci0jZGVmaW5lIFNEUkFNX3RSQVNfbnVtICA1Ci0jZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzIKLSNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCi0jZW5kaWYKLSNpZiAoQ09ORklHX1NDTEtfSFogPiA3NDYyNjg2NikgJiYgKENPTkZJR19TQ0xLX0haIDw9IDg5NTUyMjM5KQotI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzIKLSNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDIKLSNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfNAotI2RlZmluZSBTRFJBTV90UkFTX251bSAgNAotI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8yCi0jZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgotI2VuZGlmCi0jaWYgKENPTkZJR19TQ0xLX0haID4gNjY2NjY2NjcpICYmIChDT05GSUdfU0NMS19IWiA8PSA3NDYyNjg2NikKLSNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8yCi0jZGVmaW5lIFNEUkFNX3RSUF9udW0gICAyCi0jZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzMKLSNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDMKLSNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMgotI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKLSNlbmRpZgotI2lmIChDT05GSUdfU0NMS19IWiA+IDU5NzAxNDkzKSAmJiAoQ09ORklHX1NDTEtfSFogPD0gNjY2NjY2NjcpCi0jZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMQotI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMQotI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU180Ci0jZGVmaW5lIFNEUkFNX3RSQVNfbnVtICAzCi0jZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzEKLSNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCi0jZW5kaWYKLSNpZiAoQ09ORklHX1NDTEtfSFogPiA0NDc3NjExOSkgJiYgKENPTkZJR19TQ0xLX0haIDw9IDU5NzAxNDkzKQotI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzEKLSNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDEKLSNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfMwotI2RlZmluZSBTRFJBTV90UkFTX251bSAgMwotI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8xCi0jZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgotI2VuZGlmCi0jaWYgKENPTkZJR19TQ0xLX0haID4gMjk4NTA3NDYpICYmIChDT05GSUdfU0NMS19IWiA8PSA0NDc3NjExOSkKLSNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8xCi0jZGVmaW5lIFNEUkFNX3RSUF9udW0gICAxCi0jZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzIKLSNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDIKLSNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMQotI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKLSNlbmRpZgotI2lmIChDT05GSUdfU0NMS19IWiA8PSAyOTg1MDc0NikKLSNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8xCi0jZGVmaW5lIFNEUkFNX3RSUF9udW0gICAxCi0jZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzEKLSNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDEKLSNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMQotI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiAoQ09ORklHX01FTV9NVDQ4TEMxNk0xNkEyVEdfNzUpCi0gIC8qU0RSQU0gSU5GT1JNQVRJT046ICovCi0jZGVmaW5lIFNEUkFNX1RyZWYgIDY0CQkvKiBSZWZyZXNoIHBlcmlvZCBpbiBtaWxsaXNlY29uZHMgICAqLwotI2RlZmluZSBTRFJBTV9OUkEgICA4MTkyCS8qIE51bWJlciBvZiByb3cgYWRkcmVzc2VzIGluIFNEUkFNICovCi0jZGVmaW5lIFNEUkFNX0NMICAgIENMXzMKLSNlbmRpZgotCi0jaWYgKENPTkZJR19NRU1fTVQ0OExDNjRNNEEyRkJfN0UpCi0gIC8qU0RSQU0gSU5GT1JNQVRJT046ICovCi0jZGVmaW5lIFNEUkFNX1RyZWYgIDY0CQkvKiBSZWZyZXNoIHBlcmlvZCBpbiBtaWxsaXNlY29uZHMgICAqLwotI2RlZmluZSBTRFJBTV9OUkEgICA4MTkyCS8qIE51bWJlciBvZiByb3cgYWRkcmVzc2VzIGluIFNEUkFNICovCi0jZGVmaW5lIFNEUkFNX0NMICAgIENMXzMKLSNlbmRpZgotCi0jaWYgKENPTkZJR19NRU1fTVQ0OExDMzJNMTZBMlRHXzc1KQotICAvKlNEUkFNIElORk9STUFUSU9OOiAqLwotI2RlZmluZSBTRFJBTV9UcmVmICA2NAkJLyogUmVmcmVzaCBwZXJpb2QgaW4gbWlsbGlzZWNvbmRzICAgKi8KLSNkZWZpbmUgU0RSQU1fTlJBICAgODE5MgkvKiBOdW1iZXIgb2Ygcm93IGFkZHJlc3NlcyBpbiBTRFJBTSAqLwotI2RlZmluZSBTRFJBTV9DTCAgICBDTF8zCi0jZW5kaWYKLQotI2lmIChDT05GSUdfTUVNX0dFTkVSSUNfQk9BUkQpCi0gIC8qU0RSQU0gSU5GT1JNQVRJT046IE1vZGlmeSB0aGlzIGZvciB5b3VyIGJvYXJkICovCi0jZGVmaW5lIFNEUkFNX1RyZWYgIDY0CQkvKiBSZWZyZXNoIHBlcmlvZCBpbiBtaWxsaXNlY29uZHMgICAqLwotI2RlZmluZSBTRFJBTV9OUkEgICA4MTkyCS8qIE51bWJlciBvZiByb3cgYWRkcmVzc2VzIGluIFNEUkFNICovCi0jZGVmaW5lIFNEUkFNX0NMICAgIENMXzMKLSNlbmRpZgotCi0vKiBFcXVhdGlvbiBmcm9tIHNlY3Rpb24gMTcgKHAxNy00Nikgb2YgQkY1MzMgSFJNICovCi0jZGVmaW5lIG1lbV9TRFJSQyAgICAgICAoKChDT05GSUdfU0NMS19IWiAvIDEwMDApICogU0RSQU1fVHJlZikgIC8gU0RSQU1fTlJBKSAtIChTRFJBTV90UkFTX251bSArIFNEUkFNX3RSUF9udW0pCi0KLS8qIEVuYWJsZSBTQ0xLIE91dCAqLwotI2RlZmluZSBtZW1fU0RHQ1RMICAgICAgICAoU0NUTEUgfCBTRFJBTV9DTCB8IFNEUkFNX3RSQVMgfCBTRFJBTV90UlAgfCBTRFJBTV90UkNEIHwgU0RSQU1fdFdSIHwgUFNTKQotCi0jaWYgZGVmaW5lZCBDT05GSUdfQ0xLSU5fSEFMRgotI2RlZmluZSBDTEtJTl9IQUxGICAgICAgIDEKLSNlbHNlCi0jZGVmaW5lIENMS0lOX0hBTEYgICAgICAgMAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIENPTkZJR19QTExfQllQQVNTCi0jZGVmaW5lIFBMTF9CWVBBU1MgICAgICAxCi0jZWxzZQotI2RlZmluZSBQTExfQllQQVNTICAgICAgIDAKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqQ3VycmVudGx5IE5vdCBCZWluZyBVc2VkICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVExfV0FUICAoKENPTkZJR19GTEFTSF9TUEVFRF9CV0FUICogNCkgLyAoNDAwMDAwMDAwMCAvIENPTkZJR19TQ0xLX0haKSkgKyAxCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCAgKChDT05GSUdfRkxBU0hfU1BFRURfQlJBVCAqIDQpIC8gKDQwMDAwMDAwMDAgLyBDT05GSUdfU0NMS19IWikpICsgMQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTF9IVCAgICgoQ09ORklHX0ZMQVNIX1NQRUVEX0JIVCAgKiA0KSAvICg0MDAwMDAwMDAwIC8gQ09ORklHX1NDTEtfSFopKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTF9TVCAgICgoQ09ORklHX0ZMQVNIX1NQRUVEX0JTVCAgKiA0KSAvICg0MDAwMDAwMDAwIC8gQ09ORklHX1NDTEtfSFopKSArIDEKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVExfVFQgICAoKENPTkZJR19GTEFTSF9TUEVFRF9CVFQgICogNCkgLyAoNDAwMDAwMDAwMCAvIENPTkZJR19TQ0xLX0haKSkgKyAxCi0KLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfVFQgPiAzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfVFQgICBCMFRUXzQKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9UVCA9PSAzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfVFQgICBCMFRUXzMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9UVCA9PSAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfVFQgICBCMFRUXzIKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9UVCA8IDIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9UVCAgIEIwVFRfMQotI2VuZGlmCi0KLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfU1QgPiAzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfU1QgICBCMFNUXzQKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9TVCA9PSAzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfU1QgICBCMFNUXzMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9TVCA9PSAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfU1QgICBCMFNUXzIKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9TVCA8IDIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9TVCAgIEIwU1RfMQotI2VuZGlmCi0KLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfSFQgPiAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfSFQgICBCMEhUXzMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9IVCA9PSAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfSFQgICBCMEhUXzIKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9IVCA9PSAxKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfSFQgICBCMEhUXzEKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9IVCA9PSAwICYmIENPTkZJR19GTEFTSF9TUEVFRF9CSFQgPT0gMCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX0hUICAgQjBIVF8wCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfSFQgPT0gMCAmJiBDT05GSUdfRkxBU0hfU1BFRURfQkhUICE9IDApCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9IVCAgIEIwSFRfMQotI2VuZGlmCi0KLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID4gMTQpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzE1Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDE0KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xNAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAxMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMTMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMTIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzEyCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDExKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xMQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAxMCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMTAKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gOSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfOQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSA4KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF84Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDcpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzcKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gNikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfNgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSA1KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF81Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDQpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzQKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8yCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDEpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzEKLSNlbmRpZgotCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA+IDE0KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xNQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAxNCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMTQKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMTMpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzEzCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDEyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xMgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAxMSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMTEKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMTApCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzEwCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDkpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzkKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gOCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfOAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSA3KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF83Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDYpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzYKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gNSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfNQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSA0KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF80Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDMpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAxKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xCi0jZW5kaWYKLQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDAgIFwKLQkoZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCB8IGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgfCBmbGFzaF9FQklVX0FNQkNUTDBfSFQgfCBcCi0JIGZsYXNoX0VCSVVfQU1CQ1RMMF9TVCB8IGZsYXNoX0VCSVVfQU1CQ1RMMF9UVCB8IENPTkZJR19GTEFTSF9TUEVFRF9SRFlFTikKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvbWVtX21hcC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9tZW1fbWFwLmgKaW5kZXggNTgxZmM2ZS4uZmMzM2I3YyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9tZW1fbWFwLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9tZW1fbWFwLmgKQEAgLTE2OCw0ICsxNjgsMTAgQEAKICNkZWZpbmUgTDFfU0NSQVRDSF9TVEFSVAkweEZGQjAwMDAwCiAjZGVmaW5lIEwxX1NDUkFUQ0hfTEVOR1RICTB4MTAwMAogCisjZGVmaW5lIEdFVF9QREFfU0FGRShwcmVnKQkJXAorCXByZWcubCA9IF9jcHVfcGRhOwkJXAorCXByZWcuaCA9IF9jcHVfcGRhOworCisjZGVmaW5lIEdFVF9QREEocHJlZywgZHJlZykJR0VUX1BEQV9TQUZFKHByZWcpCisKICNlbmRpZgkJCQkvKiBfTUVNX01BUF81MzNfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9LY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L0tjb25maWcKaW5kZXggODI1NTM3NC4uYmJjMDhmZCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L0tjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L0tjb25maWcKQEAgLTY0LDI5ICs2NCwyOSBAQAogY29uZmlnIElSUV9NQUNfVFgKIAlpbnQgIklSUV9NQUNfVFgiCiAJZGVmYXVsdCAxMQotY29uZmlnIElSUV9UTVIwCi0JaW50ICJJUlFfVE1SMCIKK2NvbmZpZyBJUlFfVElNRVIwCisJaW50ICJJUlFfVElNRVIwIgorCWRlZmF1bHQgOAorY29uZmlnIElSUV9USU1FUjEKKwlpbnQgIklSUV9USU1FUjEiCiAJZGVmYXVsdCAxMgotY29uZmlnIElSUV9UTVIxCi0JaW50ICJJUlFfVE1SMSIKK2NvbmZpZyBJUlFfVElNRVIyCisJaW50ICJJUlFfVElNRVIyIgogCWRlZmF1bHQgMTIKLWNvbmZpZyBJUlFfVE1SMgotCWludCAiSVJRX1RNUjIiCitjb25maWcgSVJRX1RJTUVSMworCWludCAiSVJRX1RJTUVSMyIKIAlkZWZhdWx0IDEyCi1jb25maWcgSVJRX1RNUjMKLQlpbnQgIklSUV9UTVIzIgorY29uZmlnIElSUV9USU1FUjQKKwlpbnQgIklSUV9USU1FUjQiCiAJZGVmYXVsdCAxMgotY29uZmlnIElSUV9UTVI0Ci0JaW50ICJJUlFfVE1SNCIKK2NvbmZpZyBJUlFfVElNRVI1CisJaW50ICJJUlFfVElNRVI1IgogCWRlZmF1bHQgMTIKLWNvbmZpZyBJUlFfVE1SNQotCWludCAiSVJRX1RNUjUiCitjb25maWcgSVJRX1RJTUVSNgorCWludCAiSVJRX1RJTUVSNiIKIAlkZWZhdWx0IDEyCi1jb25maWcgSVJRX1RNUjYKLQlpbnQgIklSUV9UTVI2IgotCWRlZmF1bHQgMTIKLWNvbmZpZyBJUlFfVE1SNwotCWludCAiSVJRX1RNUjciCitjb25maWcgSVJRX1RJTUVSNworCWludCAiSVJRX1RJTUVSNyIKIAlkZWZhdWx0IDEyCiBjb25maWcgSVJRX1BST0dfSU5UQQogCWludCAiSVJRX1BST0dfSU5UQSIKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9NYWtlZmlsZSBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9NYWtlZmlsZQppbmRleCA2OGU1NDc4Li41Njk5NGI2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvTWFrZWZpbGUKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L01ha2VmaWxlCkBAIC0yLDYgKzIsNCBAQAogIyBhcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvTWFrZWZpbGUKICMKIAotZXh0cmEteSA6PSBoZWFkLm8KLQogb2JqLXkgOj0gaW50cy1wcmlvcml0eS5vIGRtYS5vCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL2NtX2JmNTM3LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL2NtX2JmNTM3LmMKaW5kZXggZGRlMTQ3Mi4uNmFjOGU0ZCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9jbV9iZjUzNy5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvY21fYmY1MzcuYwpAQCAtMzA4LDYgKzMwOCwxOSBAQAogfTsKICNlbmRpZgogCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fZ3Bpb3NfcmVzb3VyY2VzID0geworCS5zdGFydCA9IDAsCisJLmVuZCAgID0gTUFYX0JMQUNLRklOX0dQSU9TIC0gMSwKKwkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fZ3Bpb3NfZGV2aWNlID0geworCS5uYW1lID0gInNpbXBsZS1ncGlvIiwKKwkuaWQgPSAtMSwKKwkubnVtX3Jlc291cmNlcyA9IDEsCisJLnJlc291cmNlID0gJmJmaW5fZ3Bpb3NfcmVzb3VyY2VzLAorfTsKKwogI2lmIGRlZmluZWQoQ09ORklHX01URF9HUElPX0FERFIpIHx8IGRlZmluZWQoQ09ORklHX01URF9HUElPX0FERFJfTU9EVUxFKQogc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIGNtX3BhcnRpdGlvbnNbXSA9IHsKIAl7CkBAIC0zNzksMzAgKzM5Miw1NyBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3Npcl9yZXNvdXJjZXNbXSA9IHsKICNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyMF9yZXNvdXJjZXNbXSA9IHsKIAl7CiAJCS5zdGFydCA9IDB4RkZDMDA0MDAsCiAJCS5lbmQgPSAweEZGQzAwNEZGLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQwX1JYLAorCQkuZW5kID0gSVJRX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMF9SWCwKKwkJLmVuZCA9IENIX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCit9Oworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIwX2RldmljZSA9IHsKKwkubmFtZSA9ICJiZmluX3NpciIsCisJLmlkID0gMCwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIwX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIwX3Jlc291cmNlcywKK307CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQkZJTl9TSVIxCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyMV9yZXNvdXJjZXNbXSA9IHsKIAl7CiAJCS5zdGFydCA9IDB4RkZDMDIwMDAsCiAJCS5lbmQgPSAweEZGQzAyMEZGLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAotI2VuZGlmCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDFfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDFfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQxX1JYLAorCQkuZW5kID0gQ0hfVUFSVDFfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKIH07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyX2RldmljZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyMV9kZXZpY2UgPSB7CiAJLm5hbWUgPSAiYmZpbl9zaXIiLAotCS5pZCA9IDAsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyX3Jlc291cmNlcyksCi0JLnJlc291cmNlID0gYmZpbl9zaXJfcmVzb3VyY2VzLAorCS5pZCA9IDEsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMV9yZXNvdXJjZXMsCiB9OwogI2VuZGlmCisjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0kpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfTU9EVUxFKQogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3R3aTBfcmVzb3VyY2VbXSA9IHsKQEAgLTUyNSw3ICs1NjUsMTIgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKLQkmYmZpbl9zaXJfZGV2aWNlLAorI2lmZGVmIENPTkZJR19CRklOX1NJUjAKKwkmYmZpbl9zaXIwX2RldmljZSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CRklOX1NJUjEKKwkmYmZpbl9zaXIxX2RldmljZSwKKyNlbmRpZgogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX01PRFVMRSkKQEAgLTU2NCw2ICs2MDksOCBAQAogI2lmIGRlZmluZWQoQ09ORklHX01URF9HUElPX0FERFIpIHx8IGRlZmluZWQoQ09ORklHX01URF9HUElPX0FERFJfTU9EVUxFKQogCSZjbV9mbGFzaF9kZXZpY2UsCiAjZW5kaWYKKworCSZiZmluX2dwaW9zX2RldmljZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGNtX2JmNTM3X2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvZ2VuZXJpY19ib2FyZC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9nZW5lcmljX2JvYXJkLmMKaW5kZXggNzhhMTNkNS4uZGQ2ZTZiZiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9nZW5lcmljX2JvYXJkLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9nZW5lcmljX2JvYXJkLmMKQEAgLTUwLDU3ICs1MCw0NiBAQAogLyoKICAqIE5hbWUgdGhlIEJvYXJkIGZvciB0aGUgL3Byb2MvY3B1aW5mbwogICovCi1jb25zdCBjaGFyIGJmaW5fYm9hcmRfbmFtZVtdID0gIkdFTkVSSUMgQm9hcmQiOworY29uc3QgY2hhciBiZmluX2JvYXJkX25hbWVbXSA9ICJVTktOT1dOIEJPQVJEIjsKIAogLyoKICAqICBEcml2ZXIgbmVlZHMgdG8ga25vdyBhZGRyZXNzLCBpcnEgYW5kIGZsYWcgcGluLgogICovCiAKLSNkZWZpbmUgSVNQMTc2MV9CQVNFICAgICAgIDB4MjAzQzAwMDAKLSNkZWZpbmUgSVNQMTc2MV9JUlEgICAgICAgIElSUV9QRjcKLQogI2lmIGRlZmluZWQoQ09ORklHX1VTQl9JU1AxNzYwX0hDRCkgfHwgZGVmaW5lZChDT05GSUdfVVNCX0lTUDE3NjBfSENEX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9pc3AxNzYxX3Jlc291cmNlc1tdID0geworI2luY2x1ZGUgPGxpbnV4L3VzYi9pc3AxNzYwLmg+CitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5faXNwMTc2MF9yZXNvdXJjZXNbXSA9IHsKIAlbMF0gPSB7Ci0JCS5uYW1lCT0gImlzcDE3NjEtcmVncyIsCi0JCS5zdGFydCAgPSBJU1AxNzYxX0JBU0UgKyAweDAwMDAwMDAwLAotCQkuZW5kICAgID0gSVNQMTc2MV9CQVNFICsgMHgwMDBmZmZmZiwKKwkJLnN0YXJ0ICA9IDB4MjAzQzAwMDAsCisJCS5lbmQgICAgPSAweDIwM0MwMDAwICsgMHgwMDBmZmZmZiwKIAkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCiAJWzFdID0gewotCQkuc3RhcnQgID0gSVNQMTc2MV9JUlEsCi0JCS5lbmQgICAgPSBJU1AxNzYxX0lSUSwKKwkJLnN0YXJ0ICA9IElSUV9QRjcsCisJCS5lbmQgICAgPSBJUlFfUEY3LAogCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5faXNwMTc2MV9kZXZpY2UgPSB7Ci0JLm5hbWUgICAgICAgICAgID0gImlzcDE3NjEiLAorc3RhdGljIHN0cnVjdCBpc3AxNzYwX3BsYXRmb3JtX2RhdGEgaXNwMTc2MF9wcml2ID0geworCS5pc19pc3AxNzYxID0gMCwKKwkucG9ydDFfZGlzYWJsZSA9IDAsCisJLmJ1c193aWR0aF8xNiA9IDEsCisJLnBvcnQxX290ZyA9IDAsCisJLmFuYWxvZ19vYyA9IDAsCisJLmRhY2tfcG9sYXJpdHlfaGlnaCA9IDAsCisJLmRyZXFfcG9sYXJpdHlfaGlnaCA9IDAsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2lzcDE3NjBfZGV2aWNlID0geworCS5uYW1lICAgICAgICAgICA9ICJpc3AxNzYwLWhjZCIsCiAJLmlkICAgICAgICAgICAgID0gMCwKLQkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKGJmaW5faXNwMTc2MV9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZSAgICAgICA9IGJmaW5faXNwMTc2MV9yZXNvdXJjZXMsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmaXNwMTc2MF9wcml2LAorCX0sCisJLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShiZmluX2lzcDE3NjBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgICAgICAgPSBiZmluX2lzcDE3NjBfcmVzb3VyY2VzLAogfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmJmaW5faXNwMTc2MV9kZXZpY2VzW10gPSB7Ci0JJmJmaW5faXNwMTc2MV9kZXZpY2UsCi19OwotCi1pbnQgX19pbml0IGJmaW5faXNwMTc2MV9pbml0KHZvaWQpCi17Ci0JdW5zaWduZWQgaW50IG51bV9kZXZpY2VzID0gQVJSQVlfU0laRShiZmluX2lzcDE3NjFfZGV2aWNlcyk7Ci0KLQlwcmludGsoS0VSTl9JTkZPICIlcygpOiByZWdpc3RlcmluZyBkZXZpY2UgcmVzb3VyY2VzXG4iLCBfX2Z1bmNfXyk7Ci0Jc2V0X2lycV90eXBlKElTUDE3NjFfSVJRLCBJUlFGX1RSSUdHRVJfRkFMTElORyk7Ci0KLQlyZXR1cm4gcGxhdGZvcm1fYWRkX2RldmljZXMoYmZpbl9pc3AxNzYxX2RldmljZXMsIG51bV9kZXZpY2VzKTsKLX0KLQotdm9pZCBfX2V4aXQgYmZpbl9pc3AxNzYxX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcigmYmZpbl9pc3AxNzYxX2RldmljZSk7Ci19Ci0KLWFyY2hfaW5pdGNhbGwoYmZpbl9pc3AxNzYxX2luaXQpOwogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX0NGUENNQ0lBKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX0NGUENNQ0lBX01PRFVMRSkKQEAgLTU1OSwzMCArNTQ4LDU5IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyX3Jlc291cmNlc1tdID0gewogI2lmZGVmIENPTkZJR19CRklOX1NJUjAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIwX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMDQwMCwKIAkJLmVuZCA9IDB4RkZDMDA0RkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQwX1JYLAorCQkuZW5kID0gQ0hfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyMF9kZXZpY2UgPSB7CisJLm5hbWUgPSAiYmZpbl9zaXIiLAorCS5pZCA9IDAsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMF9yZXNvdXJjZXMsCit9OwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0JGSU5fU0lSMQorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NpcjFfcmVzb3VyY2VzW10gPSB7CiAJewogCQkuc3RhcnQgPSAweEZGQzAyMDAwLAogCQkuZW5kID0gMHhGRkMwMjBGRiwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKLSNlbmRpZgorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQxX1JYLAorCQkuZW5kID0gSVJRX1VBUlQxX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMV9SWCwKKwkJLmVuZCA9IENIX1VBUlQxX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Npcl9kZXZpY2UgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjFfZGV2aWNlID0gewogCS5uYW1lID0gImJmaW5fc2lyIiwKLQkuaWQgPSAwLAotCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3Npcl9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZSA9IGJmaW5fc2lyX3Jlc291cmNlcywKKwkuaWQgPSAxLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjFfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjFfcmVzb3VyY2VzLAogfTsKICNlbmRpZgorI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl90d2kwX3Jlc291cmNlW10gPSB7CkBAIC02NTEsNiArNjY5LDEwIEBACiAJJm5ldDIyNzJfYmZpbl9kZXZpY2UsCiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX1VTQl9JU1AxNzYwX0hDRCkgfHwgZGVmaW5lZChDT05GSUdfVVNCX0lTUDE3NjBfSENEX01PRFVMRSkKKwkmYmZpbl9pc3AxNzYwX2RldmljZSwKKyNlbmRpZgorCiAjaWYgZGVmaW5lZChDT05GSUdfU1BJX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1NQSV9CRklOX01PRFVMRSkKIAkmYmZpbl9zcGkwX2RldmljZSwKICNlbmRpZgpAQCAtNjY4LDcgKzY5MCwxMiBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotCSZiZmluX3Npcl9kZXZpY2UsCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorCSZiZmluX3NpcjBfZGV2aWNlLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMQorCSZiZmluX3NpcjFfZGV2aWNlLAorI2VuZGlmCiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0kpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfTU9EVUxFKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9taW5vdGF1ci5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9taW5vdGF1ci5jCmluZGV4IDQ4YzRjZDIuLmJiNzk1MzQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvbWlub3RhdXIuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL21pbm90YXVyLmMKQEAgLTIyNiwzMCArMjI2LDU5IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyX3Jlc291cmNlc1tdID0gewogI2lmZGVmIENPTkZJR19CRklOX1NJUjAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIwX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMDQwMCwKIAkJLmVuZCA9IDB4RkZDMDA0RkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQwX1JYLAorCQkuZW5kID0gQ0hfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyMF9kZXZpY2UgPSB7CisJLm5hbWUgPSAiYmZpbl9zaXIiLAorCS5pZCA9IDAsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMF9yZXNvdXJjZXMsCit9OwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0JGSU5fU0lSMQorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NpcjFfcmVzb3VyY2VzW10gPSB7CiAJewogCQkuc3RhcnQgPSAweEZGQzAyMDAwLAogCQkuZW5kID0gMHhGRkMwMjBGRiwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKLSNlbmRpZgorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQxX1JYLAorCQkuZW5kID0gSVJRX1VBUlQxX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMV9SWCwKKwkJLmVuZCA9IENIX1VBUlQxX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Npcl9kZXZpY2UgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjFfZGV2aWNlID0gewogCS5uYW1lID0gImJmaW5fc2lyIiwKLQkuaWQgPSAwLAotCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3Npcl9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZSA9IGJmaW5fc2lyX3Jlc291cmNlcywKKwkuaWQgPSAxLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjFfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjFfcmVzb3VyY2VzLAogfTsKICNlbmRpZgorI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl90d2kwX3Jlc291cmNlW10gPSB7CkBAIC0zMTEsNyArMzQwLDEyIEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi0JJmJmaW5fc2lyX2RldmljZSwKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCisJJmJmaW5fc2lyMF9kZXZpY2UsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIxCisJJmJmaW5fc2lyMV9kZXZpY2UsCisjZW5kaWYKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSSkgfHwgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSV9NT0RVTEUpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3BuYXYxMC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9wbmF2MTAuYwppbmRleCBmOTE3NGMxLi44OWRlOTRmIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3BuYXYxMC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvcG5hdjEwLmMKQEAgLTQ5LDcgKzQ5LDcgQEAKIC8qCiAgKiBOYW1lIHRoZSBCb2FyZCBmb3IgdGhlIC9wcm9jL2NwdWluZm8KICAqLwotY29uc3QgY2hhciBiZmluX2JvYXJkX25hbWVbXSA9ICJQTkFWLTEuMCI7Citjb25zdCBjaGFyIGJmaW5fYm9hcmRfbmFtZVtdID0gIkFESSBQTkFWLTEuMCI7CiAKIC8qCiAgKiAgRHJpdmVyIG5lZWRzIHRvIGtub3cgYWRkcmVzcywgaXJxIGFuZCBmbGFnIHBpbi4KQEAgLTQ1MywzMCArNDUzLDU5IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyX3Jlc291cmNlc1tdID0gewogI2lmZGVmIENPTkZJR19CRklOX1NJUjAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIwX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMDQwMCwKIAkJLmVuZCA9IDB4RkZDMDA0RkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQwX1JYLAorCQkuZW5kID0gQ0hfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyMF9kZXZpY2UgPSB7CisJLm5hbWUgPSAiYmZpbl9zaXIiLAorCS5pZCA9IDAsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMF9yZXNvdXJjZXMsCit9OwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0JGSU5fU0lSMQorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NpcjFfcmVzb3VyY2VzW10gPSB7CiAJewogCQkuc3RhcnQgPSAweEZGQzAyMDAwLAogCQkuZW5kID0gMHhGRkMwMjBGRiwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKLSNlbmRpZgorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQxX1JYLAorCQkuZW5kID0gSVJRX1VBUlQxX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMV9SWCwKKwkJLmVuZCA9IENIX1VBUlQxX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Npcl9kZXZpY2UgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjFfZGV2aWNlID0gewogCS5uYW1lID0gImJmaW5fc2lyIiwKLQkuaWQgPSAwLAotCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3Npcl9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZSA9IGJmaW5fc2lyX3Jlc291cmNlcywKKwkuaWQgPSAxLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjFfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjFfcmVzb3VyY2VzLAogfTsKICNlbmRpZgorI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzdGFtcF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX0NGUENNQ0lBKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX0NGUENNQ0lBX01PRFVMRSkKQEAgLTUyMCw3ICs1NDksMTIgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKLQkmYmZpbl9zaXJfZGV2aWNlLAorI2lmZGVmIENPTkZJR19CRklOX1NJUjAKKwkmYmZpbl9zaXIwX2RldmljZSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CRklOX1NJUjEKKwkmYmZpbl9zaXIxX2RldmljZSwKKyNlbmRpZgogI2VuZGlmCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3N0YW1wLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3N0YW1wLmMKaW5kZXggOGQzOTQzOS4uZDgxMmUyNSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9zdGFtcC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvc3RhbXAuYwpAQCAtNDYsNiArNDYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9zbDgxMS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9tbWNfc3BpLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPGFzbS9iZmluNXh4X3NwaS5oPgogI2luY2x1ZGUgPGFzbS9yZWJvb3QuaD4KQEAgLTU1LDU3ICs1Niw0NiBAQAogLyoKICAqIE5hbWUgdGhlIEJvYXJkIGZvciB0aGUgL3Byb2MvY3B1aW5mbwogICovCi1jb25zdCBjaGFyIGJmaW5fYm9hcmRfbmFtZVtdID0gIkFERFMtQkY1MzctU1RBTVAiOworY29uc3QgY2hhciBiZmluX2JvYXJkX25hbWVbXSA9ICJBREkgQkY1MzctU1RBTVAiOwogCiAvKgogICogIERyaXZlciBuZWVkcyB0byBrbm93IGFkZHJlc3MsIGlycSBhbmQgZmxhZyBwaW4uCiAgKi8KIAotI2RlZmluZSBJU1AxNzYxX0JBU0UgICAgICAgMHgyMDNDMDAwMAotI2RlZmluZSBJU1AxNzYxX0lSUSAgICAgICAgSVJRX1BGNwotCiAjaWYgZGVmaW5lZChDT05GSUdfVVNCX0lTUDE3NjBfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfSVNQMTc2MF9IQ0RfTU9EVUxFKQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX2lzcDE3NjFfcmVzb3VyY2VzW10gPSB7CisjaW5jbHVkZSA8bGludXgvdXNiL2lzcDE3NjAuaD4KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9pc3AxNzYwX3Jlc291cmNlc1tdID0gewogCVswXSA9IHsKLQkJLm5hbWUJPSAiaXNwMTc2MS1yZWdzIiwKLQkJLnN0YXJ0ICA9IElTUDE3NjFfQkFTRSArIDB4MDAwMDAwMDAsCi0JCS5lbmQgICAgPSBJU1AxNzYxX0JBU0UgKyAweDAwMGZmZmZmLAorCQkuc3RhcnQgID0gMHgyMDNDMDAwMCwKKwkJLmVuZCAgICA9IDB4MjAzQzAwMDAgKyAweDAwMGZmZmZmLAogCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAlbMV0gPSB7Ci0JCS5zdGFydCAgPSBJU1AxNzYxX0lSUSwKLQkJLmVuZCAgICA9IElTUDE3NjFfSVJRLAotCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9JUlEsCisJCS5zdGFydCAgPSBJUlFfUEY3LAorCQkuZW5kICAgID0gSVJRX1BGNywKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSVJRIHwgSU9SRVNPVVJDRV9JUlFfTE9XTEVWRUwsCiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5faXNwMTc2MV9kZXZpY2UgPSB7Ci0JLm5hbWUgICAgICAgICAgID0gImlzcDE3NjEiLAorc3RhdGljIHN0cnVjdCBpc3AxNzYwX3BsYXRmb3JtX2RhdGEgaXNwMTc2MF9wcml2ID0geworCS5pc19pc3AxNzYxID0gMCwKKwkucG9ydDFfZGlzYWJsZSA9IDAsCisJLmJ1c193aWR0aF8xNiA9IDEsCisJLnBvcnQxX290ZyA9IDAsCisJLmFuYWxvZ19vYyA9IDAsCisJLmRhY2tfcG9sYXJpdHlfaGlnaCA9IDAsCisJLmRyZXFfcG9sYXJpdHlfaGlnaCA9IDAsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2lzcDE3NjBfZGV2aWNlID0geworCS5uYW1lICAgICAgICAgICA9ICJpc3AxNzYwLWhjZCIsCiAJLmlkICAgICAgICAgICAgID0gMCwKLQkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKGJmaW5faXNwMTc2MV9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZSAgICAgICA9IGJmaW5faXNwMTc2MV9yZXNvdXJjZXMsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmaXNwMTc2MF9wcml2LAorCX0sCisJLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShiZmluX2lzcDE3NjBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgICAgICAgPSBiZmluX2lzcDE3NjBfcmVzb3VyY2VzLAogfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmJmaW5faXNwMTc2MV9kZXZpY2VzW10gPSB7Ci0JJmJmaW5faXNwMTc2MV9kZXZpY2UsCi19OwotCi1pbnQgX19pbml0IGJmaW5faXNwMTc2MV9pbml0KHZvaWQpCi17Ci0JdW5zaWduZWQgaW50IG51bV9kZXZpY2VzID0gQVJSQVlfU0laRShiZmluX2lzcDE3NjFfZGV2aWNlcyk7Ci0KLQlwcmludGsoS0VSTl9JTkZPICIlcygpOiByZWdpc3RlcmluZyBkZXZpY2UgcmVzb3VyY2VzXG4iLCBfX2Z1bmNfXyk7Ci0Jc2V0X2lycV90eXBlKElTUDE3NjFfSVJRLCBJUlFGX1RSSUdHRVJfRkFMTElORyk7Ci0KLQlyZXR1cm4gcGxhdGZvcm1fYWRkX2RldmljZXMoYmZpbl9pc3AxNzYxX2RldmljZXMsIG51bV9kZXZpY2VzKTsKLX0KLQotdm9pZCBfX2V4aXQgYmZpbl9pc3AxNzYxX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcigmYmZpbl9pc3AxNzYxX2RldmljZSk7Ci19Ci0KLWFyY2hfaW5pdGNhbGwoYmZpbl9pc3AxNzYxX2luaXQpOwogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9HUElPKSB8fCBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9HUElPX01PRFVMRSkKQEAgLTQ0MywxMSArNDMzLDExIEBACiAJCS5vZmZzZXQgICAgID0gMCwKIAl9LCB7CiAJCS5uYW1lICAgICAgID0gImxpbnV4IGtlcm5lbChub3IpIiwKLQkJLnNpemUgICAgICAgPSAweEUwMDAwLAorCQkuc2l6ZSAgICAgICA9IDB4MTgwMDAwLAogCQkub2Zmc2V0ICAgICA9IE1URFBBUlRfT0ZTX0FQUEVORCwKIAl9LCB7CiAJCS5uYW1lICAgICAgID0gImZpbGUgc3lzdGVtKG5vcikiLAotCQkuc2l6ZSAgICAgICA9IDB4NDAwMDAwIC0gMHg0MDAwMCAtIDB4RTAwMDAgLSAweDEwMDAwLAorCQkuc2l6ZSAgICAgICA9IDB4NDAwMDAwIC0gMHg0MDAwMCAtIDB4MTgwMDAwIC0gMHgxMDAwMCwKIAkJLm9mZnNldCAgICAgPSBNVERQQVJUX09GU19BUFBFTkQsCiAJfSwgewogCQkubmFtZSAgICAgICA9ICJNQUMgQWRkcmVzcyhub3IpIiwKQEAgLTQ5MCw3ICs0ODAsNyBAQAogCQkubWFza19mbGFncyA9IE1URF9DQVBfUk9NCiAJfSwgewogCQkubmFtZSA9ICJsaW51eCBrZXJuZWwoc3BpKSIsCi0JCS5zaXplID0gMHhlMDAwMCwKKwkJLnNpemUgPSAweDE4MDAwMCwKIAkJLm9mZnNldCA9IE1URFBBUlRfT0ZTX0FQUEVORCwKIAl9LCB7CiAJCS5uYW1lID0gImZpbGUgc3lzdGVtKHNwaSkiLApAQCAtNTAzLDcgKzQ5Myw3IEBACiAJLm5hbWUgPSAibTI1cDgwIiwKIAkucGFydHMgPSBiZmluX3NwaV9mbGFzaF9wYXJ0aXRpb25zLAogCS5ucl9wYXJ0cyA9IEFSUkFZX1NJWkUoYmZpbl9zcGlfZmxhc2hfcGFydGl0aW9ucyksCi0JLnR5cGUgPSAibTI1cDY0IiwKKwkvKiAudHlwZSA9ICJtMjVwNjQiLCAqLwogfTsKIAogLyogU1BJIGZsYXNoIGNoaXAgKG0yNXA2NCkgKi8KQEAgLTUzNyw5ICs1MjcsMjkgQEAKIH07CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NTUMpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9NTUNfTU9EVUxFKQotc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV9tbWNfY2hpcF9pbmZvID0gewotCS5lbmFibGVfZG1hID0gMSwKKyNpZiBkZWZpbmVkKENPTkZJR19NTUNfU1BJKSB8fCBkZWZpbmVkKENPTkZJR19NTUNfU1BJX01PRFVMRSkKKyNkZWZpbmUgTU1DX1NQSV9DQVJEX0RFVEVDVF9JTlQgSVJRX1BGNQorCitzdGF0aWMgaW50IGJmaW5fbW1jX3NwaV9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwlpcnFyZXR1cm5fdCAoKmRldGVjdF9pbnQpKGludCwgdm9pZCAqKSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gcmVxdWVzdF9pcnEoTU1DX1NQSV9DQVJEX0RFVEVDVF9JTlQsIGRldGVjdF9pbnQsCisJCUlSUUZfVFJJR0dFUl9GQUxMSU5HLCAibW1jLXNwaS1kZXRlY3QiLCBkYXRhKTsKK30KKworc3RhdGljIHZvaWQgYmZpbl9tbWNfc3BpX2V4aXQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQoreworCWZyZWVfaXJxKE1NQ19TUElfQ0FSRF9ERVRFQ1RfSU5ULCBkYXRhKTsKK30KKworc3RhdGljIHN0cnVjdCBtbWNfc3BpX3BsYXRmb3JtX2RhdGEgYmZpbl9tbWNfc3BpX3BkYXRhID0geworCS5pbml0ID0gYmZpbl9tbWNfc3BpX2luaXQsCisJLmV4aXQgPSBiZmluX21tY19zcGlfZXhpdCwKKwkuZGV0ZWN0X2RlbGF5ID0gMTAwLCAvKiBtc2VjcyAqLworfTsKKworc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwICBtbWNfc3BpX2NoaXBfaW5mbyA9IHsKKwkuZW5hYmxlX2RtYSA9IDAsCiAJLmJpdHNfcGVyX3dvcmQgPSA4LAogfTsKICNlbmRpZgpAQCAtNjEzLDYgKzYyMywxNCBAQAogfTsKICNlbmRpZgogCisjaWYgZGVmaW5lZChDT05GSUdfRU5DMjhKNjApIHx8IGRlZmluZWQoQ09ORklHX0VOQzI4SjYwX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBlbmMyOGo2MF9zcGlfY2hpcF9pbmZvID0geworCS5lbmFibGVfZG1hCT0gMSwKKwkuYml0c19wZXJfd29yZAk9IDgsCisJLmNzX2dwaW8gPSBHUElPX1BGMTAsCit9OworI2VuZGlmCisKICNpZiBkZWZpbmVkKENPTkZJR19NVERfREFUQUZMQVNIKSBcCiAJfHwgZGVmaW5lZChDT05GSUdfTVREX0RBVEFGTEFTSF9NT0RVTEUpCiAKQEAgLTYyNCw3ICs2NDIsNyBAQAogCQkubWFza19mbGFncyA9IE1URF9DQVBfUk9NCiAJfSwgewogCQkubmFtZSA9ICJsaW51eCBrZXJuZWwoc3BpKSIsCi0JCS5zaXplID0gMHhlMDAwMCwKKwkJLnNpemUgPSAweDE4MDAwMCwKIAkJLm9mZnNldCA9IE1URFBBUlRfT0ZTX0FQUEVORCwKIAl9LCB7CiAJCS5uYW1lID0gImZpbGUgc3lzdGVtKHNwaSkiLApAQCAtNzAzLDIzICs3MjEsMTQgQEAKIAkJLmNvbnRyb2xsZXJfZGF0YSA9ICZhZDk5NjBfc3BpX2NoaXBfaW5mbywKIAl9LAogI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfU1BJX01NQykgfHwgZGVmaW5lZChDT05GSUdfU1BJX01NQ19NT0RVTEUpCisjaWYgZGVmaW5lZChDT05GSUdfTU1DX1NQSSkgfHwgZGVmaW5lZChDT05GSUdfTU1DX1NQSV9NT0RVTEUpCiAJewotCQkubW9kYWxpYXMgPSAic3BpX21tY19kdW1teSIsCisJCS5tb2RhbGlhcyA9ICJtbWNfc3BpIiwKIAkJLm1heF9zcGVlZF9oeiA9IDIwMDAwMDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLwogCQkuYnVzX251bSA9IDAsCi0JCS5jaGlwX3NlbGVjdCA9IDAsCi0JCS5wbGF0Zm9ybV9kYXRhID0gTlVMTCwKLQkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfbW1jX2NoaXBfaW5mbywKLQkJLm1vZGUgPSBTUElfTU9ERV8zLAotCX0sCi0JewotCQkubW9kYWxpYXMgPSAic3BpX21tYyIsCi0JCS5tYXhfc3BlZWRfaHogPSAyMDAwMDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KLQkJLmJ1c19udW0gPSAwLAotCQkuY2hpcF9zZWxlY3QgPSBDT05GSUdfU1BJX01NQ19DU19DSEFOLAotCQkucGxhdGZvcm1fZGF0YSA9IE5VTEwsCi0JCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpX21tY19jaGlwX2luZm8sCisJCS5jaGlwX3NlbGVjdCA9IDQsCisJCS5wbGF0Zm9ybV9kYXRhID0gJmJmaW5fbW1jX3NwaV9wZGF0YSwKKwkJLmNvbnRyb2xsZXJfZGF0YSA9ICZtbWNfc3BpX2NoaXBfaW5mbywKIAkJLm1vZGUgPSBTUElfTU9ERV8zLAogCX0sCiAjZW5kaWYKQEAgLTc4Myw2ICs3OTIsMTcgQEAKIAkJLm1vZGUgPSBTUElfQ1BIQSB8IFNQSV9DUE9MLAogCX0sCiAjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19FTkMyOEo2MCkgfHwgZGVmaW5lZChDT05GSUdfRU5DMjhKNjBfTU9EVUxFKQorCXsKKwkJLm1vZGFsaWFzID0gImVuYzI4ajYwIiwKKwkJLm1heF9zcGVlZF9oeiA9IDIwMDAwMDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLworCQkuaXJxID0gSVJRX1BGNiwKKwkJLmJ1c19udW0gPSAwLAorCQkuY2hpcF9zZWxlY3QgPSAwLAkvKiBHUElPIGNvbnRyb2xsZWQgU1NFTCAqLworCQkuY29udHJvbGxlcl9kYXRhID0gJmVuYzI4ajYwX3NwaV9jaGlwX2luZm8sCisJCS5tb2RlID0gU1BJX01PREVfMCwKKwl9LAorI2VuZGlmCiB9OwogCiAjaWYgZGVmaW5lZChDT05GSUdfU1BJX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1NQSV9CRklOX01PRFVMRSkKQEAgLTg4NSwzMCArOTA1LDU5IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyX3Jlc291cmNlc1tdID0gewogI2lmZGVmIENPTkZJR19CRklOX1NJUjAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIwX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMDQwMCwKIAkJLmVuZCA9IDB4RkZDMDA0RkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQwX1JYLAorCQkuZW5kID0gQ0hfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyMF9kZXZpY2UgPSB7CisJLm5hbWUgPSAiYmZpbl9zaXIiLAorCS5pZCA9IDAsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMF9yZXNvdXJjZXMsCit9OwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0JGSU5fU0lSMQorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NpcjFfcmVzb3VyY2VzW10gPSB7CiAJewogCQkuc3RhcnQgPSAweEZGQzAyMDAwLAogCQkuZW5kID0gMHhGRkMwMjBGRiwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKLSNlbmRpZgorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQxX1JYLAorCQkuZW5kID0gSVJRX1VBUlQxX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMV9SWCwKKwkJLmVuZCA9IENIX1VBUlQxX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Npcl9kZXZpY2UgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjFfZGV2aWNlID0gewogCS5uYW1lID0gImJmaW5fc2lyIiwKLQkuaWQgPSAwLAotCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3Npcl9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZSA9IGJmaW5fc2lyX3Jlc291cmNlcywKKwkuaWQgPSAxLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjFfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjFfcmVzb3VyY2VzLAogfTsKICNlbmRpZgorI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl90d2kwX3Jlc291cmNlW10gPSB7CkBAIC05MzIsNiArOTgxLDkzIEBACiB9OwogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9BRFA1NTg4KSB8fCBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9BRFA1NTg4X01PRFVMRSkKKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy9hZHA1NTg4X2tleXMuaD4KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBhZHA1NTg4X2tleW1hcFtBRFA1NTg4X0tFWU1BUFNJWkVdID0geworCVswXQkgPSBLRVlfR1JBVkUsCisJWzFdCSA9IEtFWV8xLAorCVsyXQkgPSBLRVlfMiwKKwlbM10JID0gS0VZXzMsCisJWzRdCSA9IEtFWV80LAorCVs1XQkgPSBLRVlfNSwKKwlbNl0JID0gS0VZXzYsCisJWzddCSA9IEtFWV83LAorCVs4XQkgPSBLRVlfOCwKKwlbOV0JID0gS0VZXzksCisJWzEwXQkgPSBLRVlfMCwKKwlbMTFdCSA9IEtFWV9NSU5VUywKKwlbMTJdCSA9IEtFWV9FUVVBTCwKKwlbMTNdCSA9IEtFWV9CQUNLU0xBU0gsCisJWzE1XQkgPSBLRVlfS1AwLAorCVsxNl0JID0gS0VZX1EsCisJWzE3XQkgPSBLRVlfVywKKwlbMThdCSA9IEtFWV9FLAorCVsxOV0JID0gS0VZX1IsCisJWzIwXQkgPSBLRVlfVCwKKwlbMjFdCSA9IEtFWV9ZLAorCVsyMl0JID0gS0VZX1UsCisJWzIzXQkgPSBLRVlfSSwKKwlbMjRdCSA9IEtFWV9PLAorCVsyNV0JID0gS0VZX1AsCisJWzI2XQkgPSBLRVlfTEVGVEJSQUNFLAorCVsyN10JID0gS0VZX1JJR0hUQlJBQ0UsCisJWzI5XQkgPSBLRVlfS1AxLAorCVszMF0JID0gS0VZX0tQMiwKKwlbMzFdCSA9IEtFWV9LUDMsCisJWzMyXQkgPSBLRVlfQSwKKwlbMzNdCSA9IEtFWV9TLAorCVszNF0JID0gS0VZX0QsCisJWzM1XQkgPSBLRVlfRiwKKwlbMzZdCSA9IEtFWV9HLAorCVszN10JID0gS0VZX0gsCisJWzM4XQkgPSBLRVlfSiwKKwlbMzldCSA9IEtFWV9LLAorCVs0MF0JID0gS0VZX0wsCisJWzQxXQkgPSBLRVlfU0VNSUNPTE9OLAorCVs0Ml0JID0gS0VZX0FQT1NUUk9QSEUsCisJWzQzXQkgPSBLRVlfQkFDS1NMQVNILAorCVs0NV0JID0gS0VZX0tQNCwKKwlbNDZdCSA9IEtFWV9LUDUsCisJWzQ3XQkgPSBLRVlfS1A2LAorCVs0OF0JID0gS0VZXzEwMk5ELAorCVs0OV0JID0gS0VZX1osCisJWzUwXQkgPSBLRVlfWCwKKwlbNTFdCSA9IEtFWV9DLAorCVs1Ml0JID0gS0VZX1YsCisJWzUzXQkgPSBLRVlfQiwKKwlbNTRdCSA9IEtFWV9OLAorCVs1NV0JID0gS0VZX00sCisJWzU2XQkgPSBLRVlfQ09NTUEsCisJWzU3XQkgPSBLRVlfRE9ULAorCVs1OF0JID0gS0VZX1NMQVNILAorCVs2MF0JID0gS0VZX0tQRE9ULAorCVs2MV0JID0gS0VZX0tQNywKKwlbNjJdCSA9IEtFWV9LUDgsCisJWzYzXQkgPSBLRVlfS1A5LAorCVs2NF0JID0gS0VZX1NQQUNFLAorCVs2NV0JID0gS0VZX0JBQ0tTUEFDRSwKKwlbNjZdCSA9IEtFWV9UQUIsCisJWzY3XQkgPSBLRVlfS1BFTlRFUiwKKwlbNjhdCSA9IEtFWV9FTlRFUiwKKwlbNjldCSA9IEtFWV9FU0MsCisJWzcwXQkgPSBLRVlfREVMRVRFLAorCVs3NF0JID0gS0VZX0tQTUlOVVMsCisJWzc2XQkgPSBLRVlfVVAsCisJWzc3XQkgPSBLRVlfRE9XTiwKKwlbNzhdCSA9IEtFWV9SSUdIVCwKKwlbNzldCSA9IEtFWV9MRUZULAorfTsKKworc3RhdGljIHN0cnVjdCBhZHA1NTg4X2twYWRfcGxhdGZvcm1fZGF0YSBhZHA1NTg4X2twYWRfZGF0YSA9IHsKKwkucm93cwkJPSA4LAorCS5jb2xzCQk9IDEwLAorCS5rZXltYXAJCT0gYWRwNTU4OF9rZXltYXAsCisJLmtleW1hcHNpemUJPSBBUlJBWV9TSVpFKGFkcDU1ODhfa2V5bWFwKSwKKwkucmVwZWF0CQk9IDAsCit9OworI2VuZGlmCisKICNpZmRlZiBDT05GSUdfSTJDX0JPQVJESU5GTwogc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBfX2luaXRkYXRhIGJmaW5faTJjX2JvYXJkX2luZm9bXSA9IHsKICNpZiBkZWZpbmVkKENPTkZJR19KT1lTVElDS19BRDcxNDIpIHx8IGRlZmluZWQoQ09ORklHX0pPWVNUSUNLX0FENzE0Ml9NT0RVTEUpCkBAIC05NTgsNiArMTA5NCwxMyBAQAogCQkucGxhdGZvcm1fZGF0YSA9ICh2b2lkICopJmJmaW5fYWQ3ODc5X3RzX2luZm8sCiAJfSwKICNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX0FEUDU1ODgpIHx8IGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX0FEUDU1ODhfTU9EVUxFKQorCXsKKwkJSTJDX0JPQVJEX0lORk8oImFkcDU1ODgta2V5cyIsIDB4MzQpLAorCQkuaXJxID0gSVJRX1BHMCwKKwkJLnBsYXRmb3JtX2RhdGEgPSAodm9pZCAqKSZhZHA1NTg4X2twYWRfZGF0YSwKKwl9LAorI2VuZGlmCiB9OwogI2VuZGlmCiAKQEAgLTEwNTcsNiArMTIwMCwxMCBAQAogCSZpc3AxMzYyX2hjZF9kZXZpY2UsCiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX1VTQl9JU1AxNzYwX0hDRCkgfHwgZGVmaW5lZChDT05GSUdfVVNCX0lTUDE3NjBfSENEX01PRFVMRSkKKwkmYmZpbl9pc3AxNzYwX2RldmljZSwKKyNlbmRpZgorCiAjaWYgZGVmaW5lZChDT05GSUdfU01DOTFYKSB8fCBkZWZpbmVkKENPTkZJR19TTUM5MVhfTU9EVUxFKQogCSZzbWM5MXhfZGV2aWNlLAogI2VuZGlmCkBAIC0xMDk4LDcgKzEyNDUsMTIgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKLQkmYmZpbl9zaXJfZGV2aWNlLAorI2lmZGVmIENPTkZJR19CRklOX1NJUjAKKwkmYmZpbl9zaXIwX2RldmljZSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CRklOX1NJUjEKKwkmYmZpbl9zaXIxX2RldmljZSwKKyNlbmRpZgogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX01PRFVMRSkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvdGNtX2JmNTM3LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3RjbV9iZjUzNy5jCmluZGV4IGQ1ZmY3MDUuLjJmNGIwNjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvdGNtX2JmNTM3LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy90Y21fYmY1MzcuYwpAQCAtMzA4LDYgKzMwOCwxOSBAQAogfTsKICNlbmRpZgogCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fZ3Bpb3NfcmVzb3VyY2VzID0geworCS5zdGFydCA9IDAsCisJLmVuZCAgID0gTUFYX0JMQUNLRklOX0dQSU9TIC0gMSwKKwkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fZ3Bpb3NfZGV2aWNlID0geworCS5uYW1lID0gInNpbXBsZS1ncGlvIiwKKwkuaWQgPSAtMSwKKwkubnVtX3Jlc291cmNlcyA9IDEsCisJLnJlc291cmNlID0gJmJmaW5fZ3Bpb3NfcmVzb3VyY2VzLAorfTsKKwogI2lmIGRlZmluZWQoQ09ORklHX01URF9HUElPX0FERFIpIHx8IGRlZmluZWQoQ09ORklHX01URF9HUElPX0FERFJfTU9EVUxFKQogc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIGNtX3BhcnRpdGlvbnNbXSA9IHsKIAl7CkBAIC0zNzksMzAgKzM5Miw1OSBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3Npcl9yZXNvdXJjZXNbXSA9IHsKICNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyMF9yZXNvdXJjZXNbXSA9IHsKIAl7CiAJCS5zdGFydCA9IDB4RkZDMDA0MDAsCiAJCS5lbmQgPSAweEZGQzAwNEZGLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQwX1JYLAorCQkuZW5kID0gSVJRX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMF9SWCwKKwkJLmVuZCA9IENIX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjBfZGV2aWNlID0geworCS5uYW1lID0gImJmaW5fc2lyIiwKKwkuaWQgPSAwLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjBfcmVzb3VyY2VzLAorfTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19CRklOX1NJUjEKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIxX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMjAwMCwKIAkJLmVuZCA9IDB4RkZDMDIwRkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCi0jZW5kaWYKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMV9SWCwKKwkJLmVuZCA9IElSUV9VQVJUMV9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDFfUlgsCisJCS5lbmQgPSBDSF9VQVJUMV9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXJfZGV2aWNlID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIxX2RldmljZSA9IHsKIAkubmFtZSA9ICJiZmluX3NpciIsCi0JLmlkID0gMCwKLQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXJfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgPSBiZmluX3Npcl9yZXNvdXJjZXMsCisJLmlkID0gMSwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIxX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIxX3Jlc291cmNlcywKIH07CiAjZW5kaWYKKyNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSSkgfHwgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSV9NT0RVTEUpCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fdHdpMF9yZXNvdXJjZVtdID0gewpAQCAtNTI1LDcgKzU2NywxMiBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotCSZiZmluX3Npcl9kZXZpY2UsCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorCSZiZmluX3NpcjBfZGV2aWNlLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMQorCSZiZmluX3NpcjFfZGV2aWNlLAorI2VuZGlmCiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0kpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfTU9EVUxFKQpAQCAtNTY0LDYgKzYxMSw4IEBACiAjaWYgZGVmaW5lZChDT05GSUdfTVREX0dQSU9fQUREUikgfHwgZGVmaW5lZChDT05GSUdfTVREX0dQSU9fQUREUl9NT0RVTEUpCiAJJmNtX2ZsYXNoX2RldmljZSwKICNlbmRpZgorCisJJmJmaW5fZ3Bpb3NfZGV2aWNlLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgY21fYmY1MzdfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2RtYS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2RtYS5jCmluZGV4IDRlZGIzNjMuLjgxMTg1MDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9kbWEuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvZG1hLmMKQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAKLXN0cnVjdCBkbWFfcmVnaXN0ZXIgKmRtYV9pb19iYXNlX2FkZHJbTUFYX0JMQUNLRklOX0RNQV9DSEFOTkVMXSA9IHsKK3N0cnVjdCBkbWFfcmVnaXN0ZXIgKmRtYV9pb19iYXNlX2FkZHJbTUFYX0RNQV9DSEFOTkVMU10gPSB7CiAJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMF9ORVhUX0RFU0NfUFRSLAogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTFfTkVYVF9ERVNDX1BUUiwKIAkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUEyX05FWFRfREVTQ19QVFIsCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaGVhZC5TIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2hlYWQuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVjOTRiZi4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaGVhZC5TCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9oZWFkLlMKLSAqIEJhc2VkIG9uOiAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2hlYWQuUwotICogQXV0aG9yOiAgICAgICBKZWZmIERpb25uZSA8amVmZkB1Y2xpbnV4Lm9yZz4gQ09QWVJJR0hUIDE5OTggRC4gSmVmZiBEaW9ubmUKLSAqCi0gKiBDcmVhdGVkOiAgICAgIDE5OTgKLSAqIERlc2NyaXB0aW9uOiAgU3RhcnR1cCBjb2RlIGZvciBCbGFja2ZpbiBCRjUzNwotICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA2IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KLSNpZmRlZiBDT05GSUdfQkZJTl9LRVJORUxfQ0xPQ0sKLSNpbmNsdWRlIDxhc20vY2xvY2tzLmg+Ci0jaW5jbHVkZSA8bWFjaC9tZW1faW5pdC5oPgotI2VuZGlmCi0KLS5zZWN0aW9uIC5sMS50ZXh0Ci0jaWZkZWYgQ09ORklHX0JGSU5fS0VSTkVMX0NMT0NLCi1FTlRSWShfc3RhcnRfZG1hX2NvZGUpCi0KLQkvKiBFbmFibGUgUEhZIENMSyBidWZmZXIgb3V0cHV0ICovCi0JcDAuaCA9IGhpKFZSX0NUTCk7Ci0JcDAubCA9IGxvKFZSX0NUTCk7Ci0JcjAubCA9IHdbcDBdOwotCWJpdHNldChyMCwgMTQpOwotCXdbcDBdID0gcjAubDsKLQlzc3luYzsKLQotCXAwLmggPSBoaShTSUNfSVdSKTsKLQlwMC5sID0gbG8oU0lDX0lXUik7Ci0JcjAubCA9IDB4MTsKLQlyMC5oID0gMHgwOwotCVtwMF0gPSByMDsKLQlTU1lOQzsKLQotCS8qCi0JICogIFNldCBQTExfQ1RMCi0JICogICAtIFsxNDowOV0gPSBNU0VMWzU6MF0gOiBDTEtJTiAvIFZDTyBtdWx0aXBsaWNhdGlvbiBmYWN0b3JzCi0JICogICAtIFs4XSAgICAgPSBCWVBBU1MgICAgOiBCWVBBU1MgdGhlIFBMTCwgcnVuIENMS0lOIGludG8gQ0NMSy9TQ0xLCi0JICogICAtIFs3XSAgICAgPSBvdXRwdXQgZGVsYXkgKGFkZCAyMDBwcyBvZiBkZWxheSB0byBtZW0gc2lnbmFscykKLQkgKiAgIC0gWzZdICAgICA9IGlucHV0IGRlbGF5IChhZGQgMjAwcHMgb2YgaW5wdXQgZGVsYXkgdG8gbWVtIHNpZ25hbHMpCi0JICogICAtIFs1XSAgICAgPSBQRFdOICAgICAgOiAxPUFsbCBDbG9ja3Mgb2ZmCi0JICogICAtIFszXSAgICAgPSBTVE9QQ0sgICAgOiAxPUNvcmUgQ2xvY2sgb2ZmCi0JICogICAtIFsxXSAgICAgPSBQTExfT0ZGICAgOiAxPURpc2FibGUgUG93ZXIgdG8gUExMCi0JICogICAtIFswXSAgICAgPSBERiAgICAgICAgOiAxPVBhc3MgQ0xLSU4vMiB0byBQTEwgLyAwPVBhc3MgQ0xLSU4gdG8gUExMCi0JICogICBhbGwgb3RoZXIgYml0cyBzZXQgdG8gemVybwotCSAqLwotCi0JcDAuaCA9IGhpKFBMTF9MT0NLQ05UKTsKLQlwMC5sID0gbG8oUExMX0xPQ0tDTlQpOwotCXIwID0gMHgzMDAoWik7Ci0Jd1twMF0gPSByMC5sOwotCXNzeW5jOwotCi0JUDIuSCA9IGhpKEVCSVVfU0RHQ1RMKTsKLQlQMi5MID0gbG8oRUJJVV9TREdDVEwpOwotCVIwID0gW1AyXTsKLQlCSVRTRVQgKFIwLCAyNCk7Ci0JW1AyXSA9IFIwOwotCVNTWU5DOwotCi0JcjAgPSBDT05GSUdfVkNPX01VTFQgJiA2MzsgICAgICAgLyogTG9hZCB0aGUgVkNPIG11bHRpcGxpZXIgICAgICAgICAqLwotCXIwID0gcjAgPDwgOTsgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0IGl0IG92ZXIsICAgICAgICAgICAgICAgICAgKi8KLQlyMSA9IENMS0lOX0hBTEY7ICAgICAgICAgICAgICAgICAvKiBEbyB3ZSBuZWVkIHRvIGRpdmlkZSBDTEtJTiBieSAyPyovCi0JcjAgPSByMSB8IHIwOwotCXIxID0gUExMX0JZUEFTUzsgICAgICAgICAgICAgICAgIC8qIEJ5cGFzcyB0aGUgUExMPyAgICAgICAgICAgICAgICAgKi8KLQlyMSA9IHIxIDw8IDg7ICAgICAgICAgICAgICAgICAgICAvKiBTaGlmdCBpdCBvdmVyICAgICAgICAgICAgICAgICAgICovCi0JcjAgPSByMSB8IHIwOyAgICAgICAgICAgICAgICAgICAgLyogYWRkIHRoZW0gYWxsIHRvZ2V0aGVyICAgICAgICAgICAqLwotI2lmZGVmIEFOT01BTFlfMDUwMDAyNjUKLQlCSVRTRVQocjAsIDE1KTsgICAgICAgICAgICAgICAgICAvKiBBZGQgMjUwIG1WIG9mIGh5c3RlcmVzaXMgdG8gU1BPUlQgaW5wdXQgcGlucyAqLwotI2VuZGlmCi0KLQlwMC5oID0gaGkoUExMX0NUTCk7Ci0JcDAubCA9IGxvKFBMTF9DVEwpOyAgICAgICAgICAgICAgLyogTG9hZCB0aGUgYWRkcmVzcyAgICAgICAgICAgICAgICAqLwotCWNsaSByMjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERpc2FibGUgaW50ZXJydXB0cyAgICAgICAgICAgICAgKi8KLQlzc3luYzsKLQl3W3AwXSA9IHIwLmw7ICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIHZhbHVlICAgICAgICAgICAgICAgICAgICovCi0JaWRsZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2FpdCBmb3IgdGhlIFBMTCB0byBzdGFibGl6ZSAgICAqLwotCXN0aSByMjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVuYWJsZSBpbnRlcnJ1cHRzICAgICAgICAgICAgICAgKi8KLQotLkxjaGVja19hZ2FpbjoKLQlwMC5oID0gaGkoUExMX1NUQVQpOwotCXAwLmwgPSBsbyhQTExfU1RBVCk7Ci0JUjAgPSBXW1AwXShaKTsKLQlDQyA9IEJJVFRTVChSMCw1KTsKLQlpZiAhIENDIGp1bXAgLkxjaGVja19hZ2FpbjsKLQotCS8qIENvbmZpZ3VyZSBTQ0xLICYgQ0NMSyBEaXZpZGVycyAqLwotCXIwID0gKENPTkZJR19DQ0xLX0FDVF9ESVYgfCBDT05GSUdfU0NMS19ESVYpOwotCXAwLmggPSBoaShQTExfRElWKTsKLQlwMC5sID0gbG8oUExMX0RJVik7Ci0Jd1twMF0gPSByMC5sOwotCXNzeW5jOwotCi0JcDAubCA9IGxvKEVCSVVfU0RSUkMpOwotCXAwLmggPSBoaShFQklVX1NEUlJDKTsKLQlyMCA9IG1lbV9TRFJSQzsKLQl3W3AwXSA9IHIwLmw7Ci0Jc3N5bmM7Ci0KLQlQMi5IID0gaGkoRUJJVV9TREdDVEwpOwotCVAyLkwgPSBsbyhFQklVX1NER0NUTCk7Ci0JUjAgPSBbUDJdOwotCUJJVENMUiAoUjAsIDI0KTsKLQlwMC5oID0gaGkoRUJJVV9TRFNUQVQpOwotCXAwLmwgPSBsbyhFQklVX1NEU1RBVCk7Ci0JcjIubCA9IHdbcDBdOwotCWNjID0gYml0dHN0KHIyLDMpOwotCWlmICFjYyBqdW1wIC5Mc2tpcDsKLQlOT1A7Ci0JQklUU0VUIChSMCwgMjMpOwotLkxza2lwOgotCVtQMl0gPSBSMDsKLQlTU1lOQzsKLQotCVIwLkwgPSBsbyhtZW1fU0RHQ1RMKTsKLQlSMC5IID0gaGkobWVtX1NER0NUTCk7Ci0JUjEgPSBbcDJdOwotCVIxID0gUjEgfCBSMDsKLQlbUDJdID0gUjE7Ci0JU1NZTkM7Ci0KLQlSVFM7Ci1FTkRQUk9DKF9zdGFydF9kbWFfY29kZSkKLSNlbmRpZiAvKiBDT05GSUdfQkZJTl9LRVJORUxfQ0xPQ0sgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvYW5vbWFseS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9hbm9tYWx5LmgKaW5kZXggYzY4OTkyNC4uOWNiMzkxMiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9hbm9tYWx5LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9hbm9tYWx5LmgKQEAgLTcsNyArNyw3IEBACiAgKi8KIAogLyogVGhpcyBmaWxlIHNob3VsZSBiZSB1cCB0byBkYXRlIHdpdGg6Ci0gKiAgLSBSZXZpc2lvbiBDLCAwMi8wOC8yMDA4OyBBRFNQLUJGNTM0L0FEU1AtQkY1MzYvQURTUC1CRjUzNyBCbGFja2ZpbiBQcm9jZXNzb3IgQW5vbWFseSBMaXN0CisgKiAgLSBSZXZpc2lvbiBELCAwOS8xOC8yMDA4OyBBRFNQLUJGNTM0L0FEU1AtQkY1MzYvQURTUC1CRjUzNyBCbGFja2ZpbiBQcm9jZXNzb3IgQW5vbWFseSBMaXN0CiAgKi8KIAogI2lmbmRlZiBfTUFDSF9BTk9NQUxZX0hfCkBAIC0xNDgsNiArMTQ4LDE0IEBACiAjZGVmaW5lIEFOT01BTFlfMDUwMDA0MDIgKF9fU0lMSUNPTl9SRVZJU0lPTl9fID49IDUpCiAvKiBMZXZlbC1TZW5zaXRpdmUgRXh0ZXJuYWwgR1BJTyBXYWtldXBzIE1heSBDYXVzZSBJbmRlZmluaXRlIFN0YWxsICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDA0MDMgKDEpCisvKiBTcGVjdWxhdGl2ZSBGZXRjaGVzIENhbiBDYXVzZSBVbmRlc2lyZWQgRXh0ZXJuYWwgRklGTyBPcGVyYXRpb25zICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MTYgKDEpCisvKiBNdWx0aWNoYW5uZWwgU1BPUlQgQ2hhbm5lbCBNaXNhbGlnbm1lbnQgVW5kZXIgU3BlY2lmaWMgQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDI1ICgxKQorLyogU3BlY3VsYXRpdmUgRmV0Y2hlcyBvZiBJbmRpcmVjdC1Qb2ludGVyIEluc3RydWN0aW9ucyBDYW4gQ2F1c2UgRmFsc2UgSGFyZHdhcmUgRXJyb3JzICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MjYgKDEpCisvKiBJRkxVU0ggSW5zdHJ1Y3Rpb24gYXQgRW5kIG9mIEhhcmR3YXJlIExvb3AgQ2F1c2VzIEluZmluaXRlIFN0YWxsICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0NDMgKDEpCiAKIC8qIEFub21hbGllcyB0aGF0IGRvbid0IGV4aXN0IG9uIHRoaXMgcHJvYyAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwMTI1ICgwKQpAQCAtMTYxLDUgKzE2OSw4IEBACiAjZGVmaW5lIEFOT01BTFlfMDUwMDAzNTMgKDEpCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAzNjMgKDApCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAzODYgKDEpCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MTIgKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MzIgKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MzUgKDApCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9iZjUzNy5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9iZjUzNy5oCmluZGV4IDI0ZDVjOWQuLmYxOTRhODQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvYmY1MzcuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2JmNTM3LmgKQEAgLTEzMyw3ICsxMzMsNyBAQAogI2VuZGlmCiAKICNpZm5kZWYgQ1BVCi0jZXJyb3IgVW5rbm93biBDUFUgdHlwZSAtIFRoaXMga2VybmVsIGRvZXNuJ3Qgc2VlbSB0byBiZSBjb25maWd1cmVkIHByb3Blcmx5CisjZXJyb3IgIlVua25vd24gQ1BVIHR5cGUgLSBUaGlzIGtlcm5lbCBkb2Vzbid0IHNlZW0gdG8gYmUgY29uZmlndXJlZCBwcm9wZXJseSIKICNlbmRpZgogCiAjZW5kaWYJCQkJLyogX19NQUNIX0JGNTM3X0hfXyAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvYmZpbl9zaXIuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvYmZpbl9zaXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZkOGFkNC4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2JmaW5fc2lyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoKLSAqIEJsYWNrZmluIEluZnJhLXJlZCBEcml2ZXIKLSAqCi0gKiBDb3B5cmlnaHQgMjAwNi0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KLSNpbmNsdWRlIDxhc20vZG1hLmg+Ci0jaW5jbHVkZSA8YXNtL3BvcnRtdXguaD4KLQotI2RlZmluZSBTSVJfVUFSVF9HRVRfQ0hBUihwb3J0KSAgIGJmaW5fcmVhZDE2KChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9SQlIpCi0jZGVmaW5lIFNJUl9VQVJUX0dFVF9ETEwocG9ydCkgICAgYmZpbl9yZWFkMTYoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0RMTCkKLSNkZWZpbmUgU0lSX1VBUlRfR0VUX0lFUihwb3J0KSAgICBiZmluX3JlYWQxNigocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfSUVSKQotI2RlZmluZSBTSVJfVUFSVF9HRVRfRExIKHBvcnQpICAgIGJmaW5fcmVhZDE2KChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9ETEgpCi0jZGVmaW5lIFNJUl9VQVJUX0dFVF9JSVIocG9ydCkgICAgYmZpbl9yZWFkMTYoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0lJUikKLSNkZWZpbmUgU0lSX1VBUlRfR0VUX0xDUihwb3J0KSAgICBiZmluX3JlYWQxNigocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfTENSKQotI2RlZmluZSBTSVJfVUFSVF9HRVRfR0NUTChwb3J0KSAgIGJmaW5fcmVhZDE2KChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9HQ1RMKQotCi0jZGVmaW5lIFNJUl9VQVJUX1BVVF9DSEFSKHBvcnQsIHYpIGJmaW5fd3JpdGUxNigoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX1RIUiksIHYpCi0jZGVmaW5lIFNJUl9VQVJUX1BVVF9ETEwocG9ydCwgdikgIGJmaW5fd3JpdGUxNigoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0RMTCksIHYpCi0jZGVmaW5lIFNJUl9VQVJUX1BVVF9JRVIocG9ydCwgdikgIGJmaW5fd3JpdGUxNigoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0lFUiksIHYpCi0jZGVmaW5lIFNJUl9VQVJUX1BVVF9ETEgocG9ydCwgdikgIGJmaW5fd3JpdGUxNigoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0RMSCksIHYpCi0jZGVmaW5lIFNJUl9VQVJUX1BVVF9MQ1IocG9ydCwgdikgIGJmaW5fd3JpdGUxNigoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0xDUiksIHYpCi0jZGVmaW5lIFNJUl9VQVJUX1BVVF9HQ1RMKHBvcnQsIHYpIGJmaW5fd3JpdGUxNigoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0dDVEwpLCB2KQotCi0jaWZkZWYgQ09ORklHX1NJUl9CRklOX0RNQQotc3RydWN0IGRtYV9yeF9idWYgewotCWNoYXIgKmJ1ZjsKLQlpbnQgaGVhZDsKLQlpbnQgdGFpbDsKLQl9OwotI2VuZGlmIC8qIENPTkZJR19TSVJfQkZJTl9ETUEgKi8KLQotc3RydWN0IGJmaW5fc2lyX3BvcnQgewotCXVuc2lnbmVkIGNoYXIgX19pb21lbSAgICptZW1iYXNlOwotCXVuc2lnbmVkIGludCAgICAgICAgICAgIGlycTsKLQl1bnNpZ25lZCBpbnQgICAgICAgICAgICBsc3I7Ci0JdW5zaWduZWQgbG9uZyAgICAgICAgICAgY2xrOwotCXN0cnVjdCBuZXRfZGV2aWNlICAgICAgICpkZXY7Ci0jaWZkZWYgQ09ORklHX1NJUl9CRklOX0RNQQotCWludCAgICAgICAgICAgICAgICAgICAgIHR4X2RvbmU7Ci0Jc3RydWN0IGRtYV9yeF9idWYgICAgICAgcnhfZG1hX2J1ZjsKLQlzdHJ1Y3QgdGltZXJfbGlzdCAgICAgICByeF9kbWFfdGltZXI7Ci0JaW50ICAgICAgICAgICAgICAgICAgICAgcnhfZG1hX25yb3dzOwotI2VuZGlmIC8qIENPTkZJR19TSVJfQkZJTl9ETUEgKi8KLQl1bnNpZ25lZCBpbnQgICAgICAgICAgICB0eF9kbWFfY2hhbm5lbDsKLQl1bnNpZ25lZCBpbnQgICAgICAgICAgICByeF9kbWFfY2hhbm5lbDsKLX07Ci0KLXN0cnVjdCBiZmluX3Npcl9wb3J0IHNpcl9wb3J0c1tCRklOX1VBUlRfTlJfUE9SVFNdOwotCi1zdHJ1Y3QgYmZpbl9zaXJfcG9ydF9yZXMgewotCXVuc2lnbmVkIGxvbmcgICBiYXNlX2FkZHI7Ci0JaW50ICAgICAgICAgICAgIGlycTsKLQl1bnNpZ25lZCBpbnQgICAgcnhfZG1hX2NoYW5uZWw7Ci0JdW5zaWduZWQgaW50ICAgIHR4X2RtYV9jaGFubmVsOwotfTsKLQotc3RydWN0IGJmaW5fc2lyX3BvcnRfcmVzIGJmaW5fc2lyX3BvcnRfcmVzb3VyY2VbXSA9IHsKLSNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCi0JewotCTB4RkZDMDA0MDAsCi0JSVJRX1VBUlQwX1JYLAotCUNIX1VBUlQwX1JYLAotCUNIX1VBUlQwX1RYLAotCX0sCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfQkZJTl9TSVIxCi0JewotCTB4RkZDMDIwMDAsCi0JSVJRX1VBUlQxX1JYLAotCUNIX1VBUlQxX1JYLAotCUNIX1VBUlQxX1RYLAotCX0sCi0jZW5kaWYKLX07Ci0KLWludCBucl9zaXJzID0gQVJSQVlfU0laRShiZmluX3Npcl9wb3J0X3Jlc291cmNlKTsKLQotc3RydWN0IGJmaW5fc2lyX3NlbGYgewotCXN0cnVjdCBiZmluX3Npcl9wb3J0ICAgICpzaXJfcG9ydDsKLQlzcGlubG9ja190ICAgICAgICAgICAgICBsb2NrOwotCXVuc2lnbmVkIGludCAgICAgICAgICAgIG9wZW47Ci0JaW50ICAgICAgICAgICAgICAgICAgICAgc3BlZWQ7Ci0JaW50ICAgICAgICAgICAgICAgICAgICAgbmV3c3BlZWQ7Ci0KLQlzdHJ1Y3Qgc2tfYnVmZiAgICAgICAgICAqdHhza2I7Ci0Jc3RydWN0IHNrX2J1ZmYgICAgICAgICAgKnJ4c2tiOwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwotCXN0cnVjdCBkZXZpY2UgICAgICAgICAgICpkZXY7Ci0Jc3RydWN0IGlybGFwX2NiICAgICAgICAgKmlybGFwOwotCXN0cnVjdCBxb3NfaW5mbyAgICAgICAgIHFvczsKLQotCWlvYnVmZl90ICAgICAgICAgICAgICAgIHR4X2J1ZmY7Ci0JaW9idWZmX3QgICAgICAgICAgICAgICAgcnhfYnVmZjsKLQotCXN0cnVjdCB3b3JrX3N0cnVjdCAgICAgIHdvcms7Ci0JaW50ICAgICAgICAgICAgICAgICAgICAgbXR0OwotfTsKLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgU0lSX1VBUlRfR0VUX0xTUihzdHJ1Y3QgYmZpbl9zaXJfcG9ydCAqcG9ydCkKLXsKLQl1bnNpZ25lZCBpbnQgbHNyID0gYmZpbl9yZWFkMTYocG9ydC0+bWVtYmFzZSArIE9GRlNFVF9MU1IpOwotCXBvcnQtPmxzciB8PSAobHNyICYgKEJJfEZFfFBFfE9FKSk7Ci0JcmV0dXJuIGxzciB8IHBvcnQtPmxzcjsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIFNJUl9VQVJUX0NMRUFSX0xTUihzdHJ1Y3QgYmZpbl9zaXJfcG9ydCAqcG9ydCkKLXsKLQlwb3J0LT5sc3IgPSAwOwotCWJmaW5fcmVhZDE2KHBvcnQtPm1lbWJhc2UgKyBPRkZTRVRfTFNSKTsKLX0KLQotI2RlZmluZSBEUklWRVJfTkFNRSAiYmZpbl9zaXIiCi0KLXN0YXRpYyBpbnQgYmZpbl9zaXJfaHdfaW5pdCh2b2lkKQotewotCWludCByZXQgPSAtRU5PREVWOwotI2lmZGVmIENPTkZJR19CRklOX1NJUjAKLQlyZXQgPSBwZXJpcGhlcmFsX3JlcXVlc3QoUF9VQVJUMF9UWCwgRFJJVkVSX05BTUUpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0JcmV0ID0gcGVyaXBoZXJhbF9yZXF1ZXN0KFBfVUFSVDBfUlgsIERSSVZFUl9OQU1FKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfQkZJTl9TSVIxCi0JcmV0ID0gcGVyaXBoZXJhbF9yZXF1ZXN0KFBfVUFSVDFfVFgsIERSSVZFUl9OQU1FKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCXJldCA9IHBlcmlwaGVyYWxfcmVxdWVzdChQX1VBUlQxX1JYLCBEUklWRVJfTkFNRSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLSNlbmRpZgotCXJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKaW5kZXggY2ZmYzc4Ni4uN2Q2MDY5YyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaApAQCAtODIsNyArODIsNyBAQAogI2RlZmluZSBTVEFUVVNfUDEJMHgwMgogI2RlZmluZSBTVEFUVVNfUDAJMHgwMQogCi0vKiBETUEgQ2hhbm5uZWwgKi8KKy8qIERNQSBDaGFubmVsICovCiAjZGVmaW5lIGJmaW5fcmVhZF9DSF9VQVJUX1JYKCkgYmZpbl9yZWFkX0NIX1VBUlQwX1JYKCkKICNkZWZpbmUgYmZpbl93cml0ZV9DSF9VQVJUX1JYKHZhbCkgYmZpbl93cml0ZV9DSF9VQVJUMF9SWCh2YWwpCiAjZGVmaW5lIENIX1VBUlRfUlggQ0hfVUFSVDBfUlgKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvY2RlZkJGNTM0LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2NkZWZCRjUzNC5oCmluZGV4IDg4ZDQ5MWMuLjVmOGI1ZjggMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvY2RlZkJGNTM0LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9jZGVmQkY1MzQuaApAQCAtNDAsNTUgKzQwLDExIEBACiAvKiBJbmNsdWRlIGNvcmUgc3BlY2lmaWMgcmVnaXN0ZXIgcG9pbnRlciBkZWZpbml0aW9ucyAJCQkJCQkJCSovCiAjaW5jbHVkZSA8YXNtL2NkZWZfTFBCbGFja2Zpbi5oPgogCi0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotCiAvKiBDbG9jayBhbmQgU3lzdGVtIENvbnRyb2wJKDB4RkZDMDAwMDAgLSAweEZGQzAwMEZGKQkJCQkJCQkJKi8KICNkZWZpbmUgYmZpbl9yZWFkX1BMTF9DVEwoKSAgICAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KFBMTF9DVEwpCi0vKiBXcml0aW5nIHRvIFBMTF9DVEwgaW5pdGlhdGVzIGEgUExMIHJlbG9jayBzZXF1ZW5jZS4gKi8KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgYmZpbl93cml0ZV9QTExfQ1RMKHVuc2lnbmVkIGludCB2YWwpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFncywgaXdyOwotCi0JaWYgKHZhbCA9PSBiZmluX3JlYWRfUExMX0NUTCgpKQotCQlyZXR1cm47Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JLyogRW5hYmxlIHRoZSBQTEwgV2FrZXVwIGJpdCBpbiBTSUMgSVdSICovCi0JaXdyID0gYmZpbl9yZWFkMzIoU0lDX0lXUik7Ci0JLyogT25seSBhbGxvdyBQUEwgV2FrZXVwKSAqLwotCWJmaW5fd3JpdGUzMihTSUNfSVdSLCBJV1JfRU5BQkxFKDApKTsKLQotCWJmaW5fd3JpdGUxNihQTExfQ1RMLCB2YWwpOwotCVNTWU5DKCk7Ci0JYXNtKCJJRExFOyIpOwotCi0JYmZpbl93cml0ZTMyKFNJQ19JV1IsIGl3cik7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQogI2RlZmluZSBiZmluX3JlYWRfUExMX0RJVigpICAgICAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoUExMX0RJVikKICNkZWZpbmUgYmZpbl93cml0ZV9QTExfRElWKHZhbCkgICAgICAgICAgICAgIGJmaW5fd3JpdGUxNihQTExfRElWLHZhbCkKICNkZWZpbmUgYmZpbl9yZWFkX1ZSX0NUTCgpICAgICAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KFZSX0NUTCkKLS8qIFdyaXRpbmcgdG8gVlJfQ1RMIGluaXRpYXRlcyBhIFBMTCByZWxvY2sgc2VxdWVuY2UuICovCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGJmaW5fd3JpdGVfVlJfQ1RMKHVuc2lnbmVkIGludCB2YWwpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFncywgaXdyOwotCi0JaWYgKHZhbCA9PSBiZmluX3JlYWRfVlJfQ1RMKCkpCi0JCXJldHVybjsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkvKiBFbmFibGUgdGhlIFBMTCBXYWtldXAgYml0IGluIFNJQyBJV1IgKi8KLQlpd3IgPSBiZmluX3JlYWQzMihTSUNfSVdSKTsKLQkvKiBPbmx5IGFsbG93IFBQTCBXYWtldXApICovCi0JYmZpbl93cml0ZTMyKFNJQ19JV1IsIElXUl9FTkFCTEUoMCkpOwotCi0JYmZpbl93cml0ZTE2KFZSX0NUTCwgdmFsKTsKLQlTU1lOQygpOwotCWFzbSgiSURMRTsiKTsKLQotCWJmaW5fd3JpdGUzMihTSUNfSVdSLCBpd3IpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KICNkZWZpbmUgYmZpbl9yZWFkX1BMTF9TVEFUKCkgICAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KFBMTF9TVEFUKQogI2RlZmluZSBiZmluX3dyaXRlX1BMTF9TVEFUKHZhbCkgICAgICAgICAgICAgYmZpbl93cml0ZTE2KFBMTF9TVEFULHZhbCkKICNkZWZpbmUgYmZpbl9yZWFkX1BMTF9MT0NLQ05UKCkgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KFBMTF9MT0NLQ05UKQpAQCAtMTgxNiw0ICsxNzcyLDUxIEBACiAjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTFfQkNPVU5UKCkgICAgICAgICAgICBiZmluX3JlYWQxNihITURNQTFfQkNPVU5UKQogI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMV9CQ09VTlQodmFsKSAgICAgICAgYmZpbl93cml0ZTE2KEhNRE1BMV9CQ09VTlQsdmFsKQogCisvKiBUaGVzZSBuZWVkIHRvIGJlIGxhc3QgZHVlIHRvIHRoZSBjZGVmL2xpbnV4IGludGVyLWRlcGVuZGVuY2llcyAqLworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworLyogV3JpdGluZyB0byBQTExfQ1RMIGluaXRpYXRlcyBhIFBMTCByZWxvY2sgc2VxdWVuY2UuICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGJmaW5fd3JpdGVfUExMX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGl3cjsKKworCWlmICh2YWwgPT0gYmZpbl9yZWFkX1BMTF9DVEwoKSkKKwkJcmV0dXJuOworCisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOworCS8qIEVuYWJsZSB0aGUgUExMIFdha2V1cCBiaXQgaW4gU0lDIElXUiAqLworCWl3ciA9IGJmaW5fcmVhZDMyKFNJQ19JV1IpOworCS8qIE9ubHkgYWxsb3cgUFBMIFdha2V1cCkgKi8KKwliZmluX3dyaXRlMzIoU0lDX0lXUiwgSVdSX0VOQUJMRSgwKSk7CisKKwliZmluX3dyaXRlMTYoUExMX0NUTCwgdmFsKTsKKwlTU1lOQygpOworCWFzbSgiSURMRTsiKTsKKworCWJmaW5fd3JpdGUzMihTSUNfSVdSLCBpd3IpOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKK30KKworLyogV3JpdGluZyB0byBWUl9DVEwgaW5pdGlhdGVzIGEgUExMIHJlbG9jayBzZXF1ZW5jZS4gKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgYmZpbl93cml0ZV9WUl9DVEwodW5zaWduZWQgaW50IHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBpd3I7CisKKwlpZiAodmFsID09IGJmaW5fcmVhZF9WUl9DVEwoKSkKKwkJcmV0dXJuOworCisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOworCS8qIEVuYWJsZSB0aGUgUExMIFdha2V1cCBiaXQgaW4gU0lDIElXUiAqLworCWl3ciA9IGJmaW5fcmVhZDMyKFNJQ19JV1IpOworCS8qIE9ubHkgYWxsb3cgUFBMIFdha2V1cCkgKi8KKwliZmluX3dyaXRlMzIoU0lDX0lXUiwgSVdSX0VOQUJMRSgwKSk7CisKKwliZmluX3dyaXRlMTYoVlJfQ1RMLCB2YWwpOworCVNTWU5DKCk7CisJYXNtKCJJRExFOyIpOworCisJYmZpbl93cml0ZTMyKFNJQ19JV1IsIGl3cik7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOworfQorCiAjZW5kaWYJCQkJLyogX0NERUZfQkY1MzRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9kbWEuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvZG1hLmgKaW5kZXggN2E5NjQwNC4uNWFlODNiMSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9kbWEuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2RtYS5oCkBAIC0xLDM4ICsxLDE0IEBACi0vKgotICogZmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTM3L2RtYS5oCi0gKiBiYXNlZCBvbjoKLSAqIGF1dGhvcjoKKy8qIG1hY2gvZG1hLmggLSBhcmNoLXNwZWNpZmljIERNQSBkZWZpbmVzCiAgKgotICogY3JlYXRlZDoKLSAqIGRlc2NyaXB0aW9uOgotICoJc3lzdGVtIG1tciByZWdpc3RlciBtYXAKLSAqIHJldjoKKyAqIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIG1vZGlmaWVkOgotICoKLSAqCi0gKiBidWdzOiAgICAgICAgIGVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIHRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIGdudSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIGZyZWUgc29mdHdhcmUgZm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogdGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgd2l0aG91dCBhbnkgd2FycmFudHk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogbWVyY2hhbnRhYmlsaXR5IG9yIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiAgc2VlIHRoZQotICogZ251IGdlbmVyYWwgcHVibGljIGxpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBnbnUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBjb3B5aW5nLgotICogaWYgbm90LCB3cml0ZSB0byB0aGUgZnJlZSBzb2Z0d2FyZSBmb3VuZGF0aW9uLAotICogNTkgdGVtcGxlIHBsYWNlIC0gc3VpdGUgMzMwLCBib3N0b24sIG1hIDAyMTExLTEzMDcsIHVzYS4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaWZuZGVmIF9NQUNIX0RNQV9IXwogI2RlZmluZSBfTUFDSF9ETUFfSF8KIAotI2RlZmluZSBNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUwgMTYKKyNkZWZpbmUgTUFYX0RNQV9DSEFOTkVMUyAxNgogCiAjZGVmaW5lIENIX1BQSSAJCQkgICAgMAogI2RlZmluZSBDSF9FTUFDX1JYIAkJICAgIDEKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9ncGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc3YTMxZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvZ3Bpby5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBGaWxlOiBhcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2dwaW8uaAorICogQnVnczogRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisKKyNpZm5kZWYgX01BQ0hfR1BJT19IXworI2RlZmluZSBfTUFDSF9HUElPX0hfCisKKyNkZWZpbmUgTUFYX0JMQUNLRklOX0dQSU9TIDQ4CisKKyNkZWZpbmUJR1BJT19QRjAJMAorI2RlZmluZQlHUElPX1BGMQkxCisjZGVmaW5lCUdQSU9fUEYyCTIKKyNkZWZpbmUJR1BJT19QRjMJMworI2RlZmluZQlHUElPX1BGNAk0CisjZGVmaW5lCUdQSU9fUEY1CTUKKyNkZWZpbmUJR1BJT19QRjYJNgorI2RlZmluZQlHUElPX1BGNwk3CisjZGVmaW5lCUdQSU9fUEY4CTgKKyNkZWZpbmUJR1BJT19QRjkJOQorI2RlZmluZQlHUElPX1BGMTAJMTAKKyNkZWZpbmUJR1BJT19QRjExCTExCisjZGVmaW5lCUdQSU9fUEYxMgkxMgorI2RlZmluZQlHUElPX1BGMTMJMTMKKyNkZWZpbmUJR1BJT19QRjE0CTE0CisjZGVmaW5lCUdQSU9fUEYxNQkxNQorI2RlZmluZQlHUElPX1BHMAkxNgorI2RlZmluZQlHUElPX1BHMQkxNworI2RlZmluZQlHUElPX1BHMgkxOAorI2RlZmluZQlHUElPX1BHMwkxOQorI2RlZmluZQlHUElPX1BHNAkyMAorI2RlZmluZQlHUElPX1BHNQkyMQorI2RlZmluZQlHUElPX1BHNgkyMgorI2RlZmluZQlHUElPX1BHNwkyMworI2RlZmluZQlHUElPX1BHOAkyNAorI2RlZmluZQlHUElPX1BHOQkyNQorI2RlZmluZQlHUElPX1BHMTAgICAgICAJMjYKKyNkZWZpbmUJR1BJT19QRzExICAgICAgCTI3CisjZGVmaW5lCUdQSU9fUEcxMiAgICAgIAkyOAorI2RlZmluZQlHUElPX1BHMTMgICAgICAJMjkKKyNkZWZpbmUJR1BJT19QRzE0ICAgICAgCTMwCisjZGVmaW5lCUdQSU9fUEcxNSAgICAgIAkzMQorI2RlZmluZQlHUElPX1BIMAkzMgorI2RlZmluZQlHUElPX1BIMQkzMworI2RlZmluZQlHUElPX1BIMgkzNAorI2RlZmluZQlHUElPX1BIMwkzNQorI2RlZmluZQlHUElPX1BINAkzNgorI2RlZmluZQlHUElPX1BINQkzNworI2RlZmluZQlHUElPX1BINgkzOAorI2RlZmluZQlHUElPX1BINwkzOQorI2RlZmluZQlHUElPX1BIOAk0MAorI2RlZmluZQlHUElPX1BIOQk0MQorI2RlZmluZQlHUElPX1BIMTAgICAgICAJNDIKKyNkZWZpbmUJR1BJT19QSDExICAgICAgCTQzCisjZGVmaW5lCUdQSU9fUEgxMiAgICAgIAk0NAorI2RlZmluZQlHUElPX1BIMTMgICAgICAJNDUKKyNkZWZpbmUJR1BJT19QSDE0ICAgICAgCTQ2CisjZGVmaW5lCUdQSU9fUEgxNSAgICAgIAk0NworCisjZGVmaW5lIFBPUlRfRiBHUElPX1BGMAorI2RlZmluZSBQT1JUX0cgR1BJT19QRzAKKyNkZWZpbmUgUE9SVF9IIEdQSU9fUEgwCisKKyNlbmRpZiAvKiBfTUFDSF9HUElPX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2lycS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9pcnEuaAppbmRleCAyZTY4YThhLi5iMmE3MWQ1IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2lycS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvaXJxLmgKQEAgLTgyLDE0ICs4MiwxNCBAQAogI2RlZmluZSBJUlFfQ0FOX1RYICAgICAgICAgIDIzCS8qQ0FOIFRyYW5zbWl0IEludGVycnVwdCAqLwogI2RlZmluZSBJUlFfTUFDX1JYICAgICAgICAgIDI0CS8qRE1BMSAoRXRoZXJuZXQgUlgpIEludGVycnVwdCAqLwogI2RlZmluZSBJUlFfTUFDX1RYICAgICAgICAgIDI1CS8qRE1BMiAoRXRoZXJuZXQgVFgpIEludGVycnVwdCAqLwotI2RlZmluZSBJUlFfVE1SMCAgICAgICAgICAgIDI2CS8qVGltZXIgMCAqLwotI2RlZmluZSBJUlFfVE1SMSAgICAgICAgICAgIDI3CS8qVGltZXIgMSAqLwotI2RlZmluZSBJUlFfVE1SMiAgICAgICAgICAgIDI4CS8qVGltZXIgMiAqLwotI2RlZmluZSBJUlFfVE1SMyAgICAgICAgICAgIDI5CS8qVGltZXIgMyAqLwotI2RlZmluZSBJUlFfVE1SNCAgICAgICAgICAgIDMwCS8qVGltZXIgNCAqLwotI2RlZmluZSBJUlFfVE1SNSAgICAgICAgICAgIDMxCS8qVGltZXIgNSAqLwotI2RlZmluZSBJUlFfVE1SNiAgICAgICAgICAgIDMyCS8qVGltZXIgNiAqLwotI2RlZmluZSBJUlFfVE1SNyAgICAgICAgICAgIDMzCS8qVGltZXIgNyAqLworI2RlZmluZSBJUlFfVElNRVIwICAgICAgICAgICAgMjYJLypUaW1lciAwICovCisjZGVmaW5lIElSUV9USU1FUjEgICAgICAgICAgICAyNwkvKlRpbWVyIDEgKi8KKyNkZWZpbmUgSVJRX1RJTUVSMiAgICAgICAgICAgIDI4CS8qVGltZXIgMiAqLworI2RlZmluZSBJUlFfVElNRVIzICAgICAgICAgICAgMjkJLypUaW1lciAzICovCisjZGVmaW5lIElSUV9USU1FUjQgICAgICAgICAgICAzMAkvKlRpbWVyIDQgKi8KKyNkZWZpbmUgSVJRX1RJTUVSNSAgICAgICAgICAgIDMxCS8qVGltZXIgNSAqLworI2RlZmluZSBJUlFfVElNRVI2ICAgICAgICAgICAgMzIJLypUaW1lciA2ICovCisjZGVmaW5lIElSUV9USU1FUjcgICAgICAgICAgICAzMwkvKlRpbWVyIDcgKi8KICNkZWZpbmUgSVJRX1BST0dfSU5UQSAgICAgICAzNAkvKiBQRiBQb3J0cyBGJkcgKFBGMTU6MCkgSW50ZXJydXB0IEEgKi8KICNkZWZpbmUgSVJRX1BPUlRHX0lOVEIgICAgICAzNQkvKiBQRiBQb3J0IEcgKFBGMTU6MCkgSW50ZXJydXB0IEIgKi8KICNkZWZpbmUgSVJRX01FTV9ETUEwICAgICAgICAzNgkvKihNZW1vcnkgRE1BIFN0cmVhbSAwKSAqLwpAQCAtMTk1LDE2ICsxOTUsMTYgQEAKICNkZWZpbmUgSVJRX0NBTl9UWF9QT1MgICAgICAwCiAjZGVmaW5lIElSUV9NQUNfUlhfUE9TICAgICAgNAogI2RlZmluZSBJUlFfTUFDX1RYX1BPUyAgICAgIDgKLSNkZWZpbmUgSVJRX1RNUjBfUE9TICAgICAgICAxMgotI2RlZmluZSBJUlFfVE1SMV9QT1MgICAgICAgIDE2Ci0jZGVmaW5lIElSUV9UTVIyX1BPUyAgICAgICAgMjAKLSNkZWZpbmUgSVJRX1RNUjNfUE9TICAgICAgICAyNAotI2RlZmluZSBJUlFfVE1SNF9QT1MgICAgICAgIDI4CisjZGVmaW5lIElSUV9USU1FUjBfUE9TICAgICAgICAxMgorI2RlZmluZSBJUlFfVElNRVIxX1BPUyAgICAgICAgMTYKKyNkZWZpbmUgSVJRX1RJTUVSMl9QT1MgICAgICAgIDIwCisjZGVmaW5lIElSUV9USU1FUjNfUE9TICAgICAgICAyNAorI2RlZmluZSBJUlFfVElNRVI0X1BPUyAgICAgICAgMjgKIAogLyogSUFSMyBCSVQgRklFTERTKi8KLSNkZWZpbmUgSVJRX1RNUjVfUE9TICAgICAgICAwCi0jZGVmaW5lIElSUV9UTVI2X1BPUyAgICAgICAgNAotI2RlZmluZSBJUlFfVE1SN19QT1MgICAgICAgIDgKKyNkZWZpbmUgSVJRX1RJTUVSNV9QT1MgICAgICAgIDAKKyNkZWZpbmUgSVJRX1RJTUVSNl9QT1MgICAgICAgIDQKKyNkZWZpbmUgSVJRX1RJTUVSN19QT1MgICAgICAgIDgKICNkZWZpbmUgSVJRX1BST0dfSU5UQV9QT1MgICAxMgogI2RlZmluZSBJUlFfUE9SVEdfSU5UQl9QT1MgICAxNgogI2RlZmluZSBJUlFfTUVNX0RNQTBfUE9TICAgIDIwCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL21lbV9pbml0LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL21lbV9pbml0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NzY5OGYuLjAwMDAwMDAKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9tZW1faW5pdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAzICswLDAgQEAKLS8qCi0gKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MzcvbWVtX2luaXQuaAotICogQmFzZWQgb246Ci0gKiBBdXRob3I6Ci0gKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOgotICoKLSAqIFJldjoKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KLSAqIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKi8KLQotI2lmIChDT05GSUdfTUVNX01UNDhMQzE2TTE2QTJUR183NSB8fCBDT05GSUdfTUVNX01UNDhMQzY0TTRBMkZCXzdFIHx8IENPTkZJR19NRU1fTVQ0OExDMTZNOEEyVEdfNzUgfHwgQ09ORklHX01FTV9HRU5FUklDX0JPQVJEIHx8IENPTkZJR19NRU1fTVQ0OExDMzJNOEEyXzc1KQotI2lmIChDT05GSUdfU0NMS19IWiA+IDExOTQwMjk4NSkKLSNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8yCi0jZGVmaW5lIFNEUkFNX3RSUF9udW0gICAyCi0jZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzcKLSNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDcKLSNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMgotI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKLSNlbmRpZgotI2lmIChDT05GSUdfU0NMS19IWiA+IDEwNDQ3NzYxMikgJiYgKENPTkZJR19TQ0xLX0haIDw9IDExOTQwMjk4NSkKLSNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8yCi0jZGVmaW5lIFNEUkFNX3RSUF9udW0gICAyCi0jZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzYKLSNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDYKLSNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMgotI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKLSNlbmRpZgotI2lmIChDT05GSUdfU0NMS19IWiA+IDg5NTUyMjM5KSAmJiAoQ09ORklHX1NDTEtfSFogPD0gMTA0NDc3NjEyKQotI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzIKLSNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDIKLSNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfNQotI2RlZmluZSBTRFJBTV90UkFTX251bSAgNQotI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8yCi0jZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgotI2VuZGlmCi0jaWYgKENPTkZJR19TQ0xLX0haID4gNzQ2MjY4NjYpICYmIChDT05GSUdfU0NMS19IWiA8PSA4OTU1MjIzOSkKLSNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8yCi0jZGVmaW5lIFNEUkFNX3RSUF9udW0gICAyCi0jZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzQKLSNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDQKLSNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMgotI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKLSNlbmRpZgotI2lmIChDT05GSUdfU0NMS19IWiA+IDY2NjY2NjY3KSAmJiAoQ09ORklHX1NDTEtfSFogPD0gNzQ2MjY4NjYpCi0jZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMgotI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMgotI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU18zCi0jZGVmaW5lIFNEUkFNX3RSQVNfbnVtICAzCi0jZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzIKLSNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCi0jZW5kaWYKLSNpZiAoQ09ORklHX1NDTEtfSFogPiA1OTcwMTQ5MykgJiYgKENPTkZJR19TQ0xLX0haIDw9IDY2NjY2NjY3KQotI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzEKLSNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDEKLSNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfNAotI2RlZmluZSBTRFJBTV90UkFTX251bSAgMwotI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8xCi0jZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgotI2VuZGlmCi0jaWYgKENPTkZJR19TQ0xLX0haID4gNDQ3NzYxMTkpICYmIChDT05GSUdfU0NMS19IWiA8PSA1OTcwMTQ5MykKLSNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8xCi0jZGVmaW5lIFNEUkFNX3RSUF9udW0gICAxCi0jZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzMKLSNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDMKLSNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMQotI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKLSNlbmRpZgotI2lmIChDT05GSUdfU0NMS19IWiA+IDI5ODUwNzQ2KSAmJiAoQ09ORklHX1NDTEtfSFogPD0gNDQ3NzYxMTkpCi0jZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMQotI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMQotI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU18yCi0jZGVmaW5lIFNEUkFNX3RSQVNfbnVtICAyCi0jZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzEKLSNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCi0jZW5kaWYKLSNpZiAoQ09ORklHX1NDTEtfSFogPD0gMjk4NTA3NDYpCi0jZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMQotI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMQotI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU18xCi0jZGVmaW5lIFNEUkFNX3RSQVNfbnVtICAxCi0jZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzEKLSNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCi0jZW5kaWYKLSNlbmRpZgotCi0jaWYgKENPTkZJR19NRU1fTVQ0OExDMTZNMTZBMlRHXzc1KQotICAvKlNEUkFNIElORk9STUFUSU9OOiAqLwotI2RlZmluZSBTRFJBTV9UcmVmICA2NAkJLyogUmVmcmVzaCBwZXJpb2QgaW4gbWlsbGlzZWNvbmRzICAgKi8KLSNkZWZpbmUgU0RSQU1fTlJBICAgODE5MgkvKiBOdW1iZXIgb2Ygcm93IGFkZHJlc3NlcyBpbiBTRFJBTSAqLwotI2RlZmluZSBTRFJBTV9DTCAgICBDTF8zCi0jZW5kaWYKLQotI2lmIChDT05GSUdfTUVNX01UNDhMQzE2TThBMlRHXzc1KQotICAvKlNEUkFNIElORk9STUFUSU9OOiAqLwotI2RlZmluZSBTRFJBTV9UcmVmICA2NAkJLyogUmVmcmVzaCBwZXJpb2QgaW4gbWlsbGlzZWNvbmRzICAgKi8KLSNkZWZpbmUgU0RSQU1fTlJBICAgNDA5NgkvKiBOdW1iZXIgb2Ygcm93IGFkZHJlc3NlcyBpbiBTRFJBTSAqLwotI2RlZmluZSBTRFJBTV9DTCAgICBDTF8zCi0jZW5kaWYKLQotI2lmIChDT05GSUdfTUVNX01UNDhMQzMyTThBMl83NSkKLSAgLypTRFJBTSBJTkZPUk1BVElPTjogKi8KLSNkZWZpbmUgU0RSQU1fVHJlZiAgNjQJCS8qIFJlZnJlc2ggcGVyaW9kIGluIG1pbGxpc2Vjb25kcyAgICovCi0jZGVmaW5lIFNEUkFNX05SQSAgIDgxOTIJLyogTnVtYmVyIG9mIHJvdyBhZGRyZXNzZXMgaW4gU0RSQU0gKi8KLSNkZWZpbmUgU0RSQU1fQ0wgICAgQ0xfMwotI2VuZGlmCi0KLSNpZiAoQ09ORklHX01FTV9NVDQ4TEM2NE00QTJGQl83RSkKLSAgLypTRFJBTSBJTkZPUk1BVElPTjogKi8KLSNkZWZpbmUgU0RSQU1fVHJlZiAgNjQJCS8qIFJlZnJlc2ggcGVyaW9kIGluIG1pbGxpc2Vjb25kcyAgICovCi0jZGVmaW5lIFNEUkFNX05SQSAgIDgxOTIJLyogTnVtYmVyIG9mIHJvdyBhZGRyZXNzZXMgaW4gU0RSQU0gKi8KLSNkZWZpbmUgU0RSQU1fQ0wgICAgQ0xfMwotI2VuZGlmCi0KLSNpZiAoQ09ORklHX01FTV9HRU5FUklDX0JPQVJEKQotICAvKlNEUkFNIElORk9STUFUSU9OOiBNb2RpZnkgdGhpcyBmb3IgeW91ciBib2FyZCAqLwotI2RlZmluZSBTRFJBTV9UcmVmICA2NAkJLyogUmVmcmVzaCBwZXJpb2QgaW4gbWlsbGlzZWNvbmRzICAgKi8KLSNkZWZpbmUgU0RSQU1fTlJBICAgODE5MgkvKiBOdW1iZXIgb2Ygcm93IGFkZHJlc3NlcyBpbiBTRFJBTSAqLwotI2RlZmluZSBTRFJBTV9DTCAgICBDTF8zCi0jZW5kaWYKLQotLyogRXF1YXRpb24gZnJvbSBzZWN0aW9uIDE3IChwMTctNDYpIG9mIEJGNTMzIEhSTSAqLwotI2RlZmluZSBtZW1fU0RSUkMgICAgICAgKCgoQ09ORklHX1NDTEtfSFogLyAxMDAwKSAqIFNEUkFNX1RyZWYpIC8gU0RSQU1fTlJBKSAtIChTRFJBTV90UkFTX251bSArIFNEUkFNX3RSUF9udW0pCi0KLS8qIEVuYWJsZSBTQ0xLIE91dCAqLwotI2RlZmluZSBtZW1fU0RHQ1RMICAgICAgICAoU0NUTEUgfCBTRFJBTV9DTCB8IFNEUkFNX3RSQVMgfCBTRFJBTV90UlAgfCBTRFJBTV90UkNEIHwgU0RSQU1fdFdSIHwgUFNTKQotCi0jaWYgZGVmaW5lZCBDT05GSUdfQ0xLSU5fSEFMRgotI2RlZmluZSBDTEtJTl9IQUxGICAgICAgIDEKLSNlbHNlCi0jZGVmaW5lIENMS0lOX0hBTEYgICAgICAgMAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIENPTkZJR19QTExfQllQQVNTCi0jZGVmaW5lIFBMTF9CWVBBU1MgICAgICAxCi0jZWxzZQotI2RlZmluZSBQTExfQllQQVNTICAgICAgIDAKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqQ3VycmVudGx5IE5vdCBCZWluZyBVc2VkICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVExfV0FUICAoKENPTkZJR19GTEFTSF9TUEVFRF9CV0FUICogNCkgLyAoNDAwMDAwMDAwMCAvIENPTkZJR19TQ0xLX0haKSkgKyAxCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCAgKChDT05GSUdfRkxBU0hfU1BFRURfQlJBVCAqIDQpIC8gKDQwMDAwMDAwMDAgLyBDT05GSUdfU0NMS19IWikpICsgMQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTF9IVCAgICgoQ09ORklHX0ZMQVNIX1NQRUVEX0JIVCAgKiA0KSAvICg0MDAwMDAwMDAwIC8gQ09ORklHX1NDTEtfSFopKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTF9TVCAgICgoQ09ORklHX0ZMQVNIX1NQRUVEX0JTVCAgKiA0KSAvICg0MDAwMDAwMDAwIC8gQ09ORklHX1NDTEtfSFopKSArIDEKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVExfVFQgICAoKENPTkZJR19GTEFTSF9TUEVFRF9CVFQgICogNCkgLyAoNDAwMDAwMDAwMCAvIENPTkZJR19TQ0xLX0haKSkgKyAxCi0KLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfVFQgPiAzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfVFQgICBCMFRUXzQKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9UVCA9PSAzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfVFQgICBCMFRUXzMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9UVCA9PSAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfVFQgICBCMFRUXzIKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9UVCA8IDIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9UVCAgIEIwVFRfMQotI2VuZGlmCi0KLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfU1QgPiAzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfU1QgICBCMFNUXzQKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9TVCA9PSAzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfU1QgICBCMFNUXzMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9TVCA9PSAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfU1QgICBCMFNUXzIKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9TVCA8IDIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9TVCAgIEIwU1RfMQotI2VuZGlmCi0KLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfSFQgPiAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfSFQgICBCMEhUXzMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9IVCA9PSAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfSFQgICBCMEhUXzIKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9IVCA9PSAxKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfSFQgICBCMEhUXzEKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9IVCA9PSAwICYmIENPTkZJR19GTEFTSF9TUEVFRF9CSFQgPT0gMCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX0hUICAgQjBIVF8wCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfSFQgPT0gMCAmJiBDT05GSUdfRkxBU0hfU1BFRURfQkhUICE9IDApCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9IVCAgIEIwSFRfMQotI2VuZGlmCi0KLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID4gMTQpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzE1Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDE0KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xNAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAxMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMTMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMTIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzEyCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDExKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xMQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAxMCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMTAKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gOSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfOQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSA4KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF84Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDcpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzcKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gNikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfNgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSA1KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF81Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDQpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzQKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8yCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDEpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzEKLSNlbmRpZgotCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA+IDE0KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xNQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAxNCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMTQKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMTMpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzEzCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDEyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xMgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAxMSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMTEKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMTApCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzEwCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDkpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzkKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gOCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfOAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSA3KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF83Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDYpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzYKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gNSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfNQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSA0KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF80Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDMpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAxKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xCi0jZW5kaWYKLQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDAgIFwKLQkoZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCB8IGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgfCBmbGFzaF9FQklVX0FNQkNUTDBfSFQgfCBcCi0JIGZsYXNoX0VCSVVfQU1CQ1RMMF9TVCB8IGZsYXNoX0VCSVVfQU1CQ1RMMF9UVCB8IENPTkZJR19GTEFTSF9TUEVFRF9SRFlFTikKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvbWVtX21hcC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9tZW1fbWFwLmgKaW5kZXggNTA3OGI2Ni4uZjkwMTBjNCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9tZW1fbWFwLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9tZW1fbWFwLmgKQEAgLTE3Niw0ICsxNzYsMTAgQEAKICNkZWZpbmUgTDFfU0NSQVRDSF9TVEFSVAkweEZGQjAwMDAwCiAjZGVmaW5lIEwxX1NDUkFUQ0hfTEVOR1RICTB4MTAwMAogCisjZGVmaW5lIEdFVF9QREFfU0FGRShwcmVnKQkJXAorCXByZWcubCA9IF9jcHVfcGRhOwkJXAorCXByZWcuaCA9IF9jcHVfcGRhOworCisjZGVmaW5lIEdFVF9QREEocHJlZywgZHJlZykJR0VUX1BEQV9TQUZFKHByZWcpCisKICNlbmRpZgkJCQkvKiBfTUVNX01BUF81MzdfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbnRzLXByaW9yaXR5LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW50cy1wcmlvcml0eS5jCmluZGV4IGIxMzAwYjMuLjUxYzQ4MDggMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbnRzLXByaW9yaXR5LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2ludHMtcHJpb3JpdHkuYwpAQCAtNTUsMTUgKzU1LDE1IEBACiAJYmZpbl93cml0ZV9TSUNfSUFSMigoKENPTkZJR19JUlFfQ0FOX1RYIC0gNykgPDwgSVJRX0NBTl9UWF9QT1MpIHwKIAkJCSAgICAoKENPTkZJR19JUlFfTUFDX1JYIC0gNykgPDwgSVJRX01BQ19SWF9QT1MpIHwKIAkJCSAgICAoKENPTkZJR19JUlFfTUFDX1RYIC0gNykgPDwgSVJRX01BQ19UWF9QT1MpIHwKLQkJCSAgICAoKENPTkZJR19JUlFfVE1SMCAtIDcpIDw8IElSUV9UTVIwX1BPUykgfAotCQkJICAgICgoQ09ORklHX0lSUV9UTVIxIC0gNykgPDwgSVJRX1RNUjFfUE9TKSB8Ci0JCQkgICAgKChDT05GSUdfSVJRX1RNUjIgLSA3KSA8PCBJUlFfVE1SMl9QT1MpIHwKLQkJCSAgICAoKENPTkZJR19JUlFfVE1SMyAtIDcpIDw8IElSUV9UTVIzX1BPUykgfAotCQkJICAgICgoQ09ORklHX0lSUV9UTVI0IC0gNykgPDwgSVJRX1RNUjRfUE9TKSk7CisJCQkgICAgKChDT05GSUdfSVJRX1RJTUVSMCAtIDcpIDw8IElSUV9USU1FUjBfUE9TKSB8CisJCQkgICAgKChDT05GSUdfSVJRX1RJTUVSMSAtIDcpIDw8IElSUV9USU1FUjFfUE9TKSB8CisJCQkgICAgKChDT05GSUdfSVJRX1RJTUVSMiAtIDcpIDw8IElSUV9USU1FUjJfUE9TKSB8CisJCQkgICAgKChDT05GSUdfSVJRX1RJTUVSMyAtIDcpIDw8IElSUV9USU1FUjNfUE9TKSB8CisJCQkgICAgKChDT05GSUdfSVJRX1RJTUVSNCAtIDcpIDw8IElSUV9USU1FUjRfUE9TKSk7CiAKLQliZmluX3dyaXRlX1NJQ19JQVIzKCgoQ09ORklHX0lSUV9UTVI1IC0gNykgPDwgSVJRX1RNUjVfUE9TKSB8Ci0JCQkgICAgKChDT05GSUdfSVJRX1RNUjYgLSA3KSA8PCBJUlFfVE1SNl9QT1MpIHwKLQkJCSAgICAoKENPTkZJR19JUlFfVE1SNyAtIDcpIDw8IElSUV9UTVI3X1BPUykgfAorCWJmaW5fd3JpdGVfU0lDX0lBUjMoKChDT05GSUdfSVJRX1RJTUVSNSAtIDcpIDw8IElSUV9USU1FUjVfUE9TKSB8CisJCQkgICAgKChDT05GSUdfSVJRX1RJTUVSNiAtIDcpIDw8IElSUV9USU1FUjZfUE9TKSB8CisJCQkgICAgKChDT05GSUdfSVJRX1RJTUVSNyAtIDcpIDw8IElSUV9USU1FUjdfUE9TKSB8CiAJCQkgICAgKChDT05GSUdfSVJRX1BST0dfSU5UQSAtIDcpIDw8IElSUV9QUk9HX0lOVEFfUE9TKSB8CiAJCQkgICAgKChDT05GSUdfSVJRX1BPUlRHX0lOVEIgLSA3KSA8PCBJUlFfUE9SVEdfSU5UQl9QT1MpIHwKIAkJCSAgICAoKENPTkZJR19JUlFfTUVNX0RNQTAgLSA3KSA8PCBJUlFfTUVNX0RNQTBfUE9TKSB8CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvS2NvbmZpZyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNjhjMzUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvS2NvbmZpZwpAQCAtMCwwICsxLDE2NCBAQAoraWYgKEJGNTM4IHx8IEJGNTM5KQorCitzb3VyY2UgImFyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9ib2FyZHMvS2NvbmZpZyIKKworbWVudSAiQkY1MzggU3BlY2lmaWMgQ29uZmlndXJhdGlvbiIKKworY29tbWVudCAiSW50ZXJydXB0IFByaW9yaXR5IEFzc2lnbm1lbnQiCittZW51ICJQcmlvcml0eSIKKworY29uZmlnIElSUV9QTExfV0FLRVVQCisJaW50ICJJUlFfUExMX1dBS0VVUCIKKwlkZWZhdWx0IDcKK2NvbmZpZyBJUlFfRE1BMF9FUlJPUgorCWludCAiSVJRX0RNQTBfRVJST1IiCisJZGVmYXVsdCA3Citjb25maWcgSVJRX1BQSV9FUlJPUgorCWludCAiSVJRX1BQSV9FUlJPUiIKKwlkZWZhdWx0IDcKK2NvbmZpZyBJUlFfU1BPUlQwX0VSUk9SCisJaW50ICJJUlFfU1BPUlQwX0VSUk9SIgorCWRlZmF1bHQgNworY29uZmlnIElSUV9TUE9SVDFfRVJST1IKKwlpbnQgIklSUV9TUE9SVDFfRVJST1IiCisJZGVmYXVsdCA3Citjb25maWcgSVJRX1NQSTBfRVJST1IKKwlpbnQgIklSUV9TUEkwX0VSUk9SIgorCWRlZmF1bHQgNworY29uZmlnIElSUV9VQVJUMF9FUlJPUgorCWludCAiSVJRX1VBUlQwX0VSUk9SIgorCWRlZmF1bHQgNworY29uZmlnIElSUV9SVEMKKwlpbnQgIklSUV9SVEMiCisJZGVmYXVsdCA4Citjb25maWcgSVJRX1BQSQorCWludCAiSVJRX1BQSSIKKwlkZWZhdWx0IDgKK2NvbmZpZyBJUlFfU1BPUlQwX1JYCisJaW50ICJJUlFfU1BPUlQwX1JYIgorCWRlZmF1bHQgOQorY29uZmlnIElSUV9TUE9SVDBfVFgKKwlpbnQgIklSUV9TUE9SVDBfVFgiCisJZGVmYXVsdCA5Citjb25maWcgSVJRX1NQT1JUMV9SWAorCWludCAiSVJRX1NQT1JUMV9SWCIKKwlkZWZhdWx0IDkKK2NvbmZpZyBJUlFfU1BPUlQxX1RYCisJaW50ICJJUlFfU1BPUlQxX1RYIgorCWRlZmF1bHQgOQorY29uZmlnIElSUV9TUEkwCisJaW50ICJJUlFfU1BJMCIKKwlkZWZhdWx0IDEwCitjb25maWcgSVJRX1VBUlQwX1JYCisJaW50ICJJUlFfVUFSVDBfUlgiCisJZGVmYXVsdCAxMAorY29uZmlnIElSUV9VQVJUMF9UWAorCWludCAiSVJRX1VBUlQwX1RYIgorCWRlZmF1bHQgMTAKK2NvbmZpZyBJUlFfVElNRVIwCisJaW50ICJJUlFfVElNRVIwIgorCWRlZmF1bHQgOAorY29uZmlnIElSUV9USU1FUjEKKwlpbnQgIklSUV9USU1FUjEiCisJZGVmYXVsdCAxMQorY29uZmlnIElSUV9USU1FUjIKKwlpbnQgIklSUV9USU1FUjIiCisJZGVmYXVsdCAxMQorY29uZmlnIElSUV9QT1JURl9JTlRBCisJaW50ICJJUlFfUE9SVEZfSU5UQSIKKwlkZWZhdWx0IDEyCitjb25maWcgSVJRX1BPUlRGX0lOVEIKKwlpbnQgIklSUV9QT1JURl9JTlRCIgorCWRlZmF1bHQgMTIKK2NvbmZpZyBJUlFfTUVNMF9ETUEwCisJaW50ICJJUlFfTUVNMF9ETUEwIgorCWRlZmF1bHQgMTMKK2NvbmZpZyBJUlFfTUVNMF9ETUExCisJaW50ICJJUlFfTUVNMF9ETUExIgorCWRlZmF1bHQgMTMKK2NvbmZpZyBJUlFfV0FUQ0gKKwlpbnQgIklSUV9XQVRDSCIKKwlkZWZhdWx0IDEzCitjb25maWcgSVJRX0RNQTFfRVJST1IKKwlpbnQgIklSUV9ETUExX0VSUk9SIgorCWRlZmF1bHQgNworY29uZmlnIElSUV9TUE9SVDJfRVJST1IKKwlpbnQgIklSUV9TUE9SVDJfRVJST1IiCisJZGVmYXVsdCA3Citjb25maWcgSVJRX1NQT1JUM19FUlJPUgorCWludCAiSVJRX1NQT1JUM19FUlJPUiIKKwlkZWZhdWx0IDcKK2NvbmZpZyBJUlFfU1BJMV9FUlJPUgorCWludCAiSVJRX1NQSTFfRVJST1IiCisJZGVmYXVsdCA3Citjb25maWcgSVJRX1NQSTJfRVJST1IKKwlpbnQgIklSUV9TUEkyX0VSUk9SIgorCWRlZmF1bHQgNworY29uZmlnIElSUV9VQVJUMV9FUlJPUgorCWludCAiSVJRX1VBUlQxX0VSUk9SIgorCWRlZmF1bHQgNworY29uZmlnIElSUV9VQVJUMl9FUlJPUgorCWludCAiSVJRX1VBUlQyX0VSUk9SIgorCWRlZmF1bHQgNworY29uZmlnIElSUV9DQU5fRVJST1IKKwlpbnQgIklSUV9DQU5fRVJST1IiCisJZGVmYXVsdCA3Citjb25maWcgSVJRX1NQT1JUMl9SWAorCWludCAiSVJRX1NQT1JUMl9SWCIKKwlkZWZhdWx0IDkKK2NvbmZpZyBJUlFfU1BPUlQyX1RYCisJaW50ICJJUlFfU1BPUlQyX1RYIgorCWRlZmF1bHQgOQorY29uZmlnIElSUV9TUE9SVDNfUlgKKwlpbnQgIklSUV9TUE9SVDNfUlgiCisJZGVmYXVsdCA5Citjb25maWcgSVJRX1NQT1JUM19UWAorCWludCAiSVJRX1NQT1JUM19UWCIKKwlkZWZhdWx0IDkKK2NvbmZpZyBJUlFfU1BJMQorCWludCAiSVJRX1NQSTEiCisJZGVmYXVsdCAxMAorY29uZmlnIElSUV9TUEkyCisJaW50ICJJUlFfU1BJMiIKKwlkZWZhdWx0IDEwCitjb25maWcgSVJRX1VBUlQxX1JYCisJaW50ICJJUlFfVUFSVDFfUlgiCisJZGVmYXVsdCAxMAorY29uZmlnIElSUV9VQVJUMV9UWAorCWludCAiSVJRX1VBUlQxX1RYIgorCWRlZmF1bHQgMTAKK2NvbmZpZyBJUlFfVUFSVDJfUlgKKwlpbnQgIklSUV9VQVJUMl9SWCIKKwlkZWZhdWx0IDEwCitjb25maWcgSVJRX1VBUlQyX1RYCisJaW50ICJJUlFfVUFSVDJfVFgiCisJZGVmYXVsdCAxMAorY29uZmlnIElSUV9UV0kwCisJaW50ICJJUlFfVFdJMCIKKwlkZWZhdWx0IDExCitjb25maWcgSVJRX1RXSTEKKwlpbnQgIklSUV9UV0kxIgorCWRlZmF1bHQgMTEKK2NvbmZpZyBJUlFfQ0FOX1JYCisJaW50ICJJUlFfQ0FOX1JYIgorCWRlZmF1bHQgMTEKK2NvbmZpZyBJUlFfQ0FOX1RYCisJaW50ICJJUlFfQ0FOX1RYIgorCWRlZmF1bHQgMTEKK2NvbmZpZyBJUlFfTUVNMV9ETUEwCisJaW50ICJJUlFfTUVNMV9ETUEwIgorCWRlZmF1bHQgMTMKK2NvbmZpZyBJUlFfTUVNMV9ETUExCisJaW50ICJJUlFfTUVNMV9ETUExIgorCWRlZmF1bHQgMTMKKworCWhlbHAKKwkgIEVudGVyIHRoZSBwcmlvcml0eSBudW1iZXJzIGJldHdlZW4gNy0xMyBPTkxZLiAgT3RoZXJzIGFyZSBSZXNlcnZlZC4KKwkgIFRoaXMgYXBwbGllcyB0byBhbGwgdGhlIGFib3ZlLiAgSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGFzc2lnbiB0aGUKKwkgIGhpZ2hlc3QgcHJpb3JpdHkgbnVtYmVyIDcgdG8gVUFSVCBvciBhbnkgb3RoZXIgZGV2aWNlLgorCitlbmRtZW51CisKK2VuZG1lbnUKKworZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9NYWtlZmlsZSBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2QyNzE5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L01ha2VmaWxlCkBAIC0wLDAgKzEsNSBAQAorIworIyBhcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvTWFrZWZpbGUKKyMKKworb2JqLXkgOj0gaW50cy1wcmlvcml0eS5vIGRtYS5vCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvYm9hcmRzL0tjb25maWcgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvYm9hcmRzL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE1MjQ5YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9ib2FyZHMvS2NvbmZpZwpAQCAtMCwwICsxLDEyIEBACitjaG9pY2UKKwlwcm9tcHQgIlN5c3RlbSB0eXBlIgorCWRlZmF1bHQgQkZJTjUzOF9FWktJVAorCWhlbHAKKwkgIFNlbGVjdCB5b3VyIGJvYXJkIQorCitjb25maWcgQkZJTjUzOF9FWktJVAorCWJvb2wgIkJGNTM4LUVaS0lUIgorCWhlbHAKKwkgIEJGNTM4LUVaS0lULUxJVEUgYm9hcmQgc3VwcG9ydC4KKworZW5kY2hvaWNlCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvYm9hcmRzL01ha2VmaWxlIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2JvYXJkcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTQzYjMyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2JvYXJkcy9NYWtlZmlsZQpAQCAtMCwwICsxLDUgQEAKKyMKKyMgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2JvYXJkcy9NYWtlZmlsZQorIworCitvYmotJChDT05GSUdfQkZJTjUzOF9FWktJVCkgICAgICAgICAgICArPSBlemtpdC5vCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvYm9hcmRzL2V6a2l0LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvYm9hcmRzL2V6a2l0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM3Y2I5MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9ib2FyZHMvZXpraXQuYwpAQCAtMCwwICsxLDYwNiBAQAorLyoKKyAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2JvYXJkcy9lemtpdC5jCisgKiBCYXNlZCBvbjogICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvZXpraXQuYworICogQXV0aG9yOiAgICAgICBBaWRhbiBXaWxsaWFtcyA8YWlkYW5AbmljdGEuY29tLmF1PgorICoKKyAqIENyZWF0ZWQ6CisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBNb2RpZmllZDoKKyAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDUgTmF0aW9uYWwgSUNUIEF1c3RyYWxpYSAoTklDVEEpCisgKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKKyAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL2ZsYXNoLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8YXNtL2JmaW41eHhfc3BpLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL25hbmQuaD4KKyNpbmNsdWRlIDxhc20vcG9ydG11eC5oPgorI2luY2x1ZGUgPGFzbS9kcG1jLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKworLyoKKyAqIE5hbWUgdGhlIEJvYXJkIGZvciB0aGUgL3Byb2MvY3B1aW5mbworICovCitjb25zdCBjaGFyIGJmaW5fYm9hcmRfbmFtZVtdID0gIkFESSBCRjUzOC1FWktJVCI7CisKKy8qCisgKiAgRHJpdmVyIG5lZWRzIHRvIGtub3cgYWRkcmVzcywgaXJxIGFuZCBmbGFnIHBpbi4KKyAqLworCisKKyNpZiBkZWZpbmVkKENPTkZJR19SVENfRFJWX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1JUQ19EUlZfQkZJTl9NT0RVTEUpCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBydGNfZGV2aWNlID0geworCS5uYW1lID0gInJ0Yy1iZmluIiwKKwkuaWQgICA9IC0xLAorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl91YXJ0X3Jlc291cmNlc1tdID0geworI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9VQVJUMAorCXsKKwkJLnN0YXJ0ID0gMHhGRkMwMDQwMCwKKwkJLmVuZCA9IDB4RkZDMDA0RkYsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fVUFSVDEKKwl7CisJCS5zdGFydCA9IDB4RkZDMDIwMDAsCisJCS5lbmQgPSAweEZGQzAyMEZGLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX1VBUlQyCisJeworCQkuc3RhcnQgPSAweEZGQzAyMTAwLAorCQkuZW5kID0gMHhGRkMwMjFGRiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl91YXJ0X2RldmljZSA9IHsKKwkubmFtZSA9ICJiZmluLXVhcnQiLAorCS5pZCA9IDEsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fdWFydF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fdWFydF9yZXNvdXJjZXMsCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQorI2lmZGVmIENPTkZJR19CRklOX1NJUjAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIwX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0ID0gMHhGRkMwMDQwMCwKKwkJLmVuZCA9IDB4RkZDMDA0RkYsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQwX1JYLAorCQkuZW5kID0gQ0hfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKK307CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjBfZGV2aWNlID0geworCS5uYW1lID0gImJmaW5fc2lyIiwKKwkuaWQgPSAwLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjBfcmVzb3VyY2VzLAorfTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CRklOX1NJUjEKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIxX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0ID0gMHhGRkMwMjAwMCwKKwkJLmVuZCA9IDB4RkZDMDIwRkYsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDFfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDFfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQxX1JYLAorCQkuZW5kID0gQ0hfVUFSVDFfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKK307CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjFfZGV2aWNlID0geworCS5uYW1lID0gImJmaW5fc2lyIiwKKwkuaWQgPSAxLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjFfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjFfcmVzb3VyY2VzLAorfTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CRklOX1NJUjIKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIyX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0ID0gMHhGRkMwMjEwMCwKKwkJLmVuZCA9IDB4RkZDMDIxRkYsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDJfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDJfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQyX1JYLAorCQkuZW5kID0gQ0hfVUFSVDJfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKK307CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjJfZGV2aWNlID0geworCS5uYW1lID0gImJmaW5fc2lyIiwKKwkuaWQgPSAyLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjJfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjJfcmVzb3VyY2VzLAorfTsKKyNlbmRpZgorI2VuZGlmCisKKy8qCisgKiAgVVNCLUxBTiBFekV4dGVuZGVyIGJvYXJkCisgKiAgRHJpdmVyIG5lZWRzIHRvIGtub3cgYWRkcmVzcywgaXJxIGFuZCBmbGFnIHBpbi4KKyAqLworI2lmIGRlZmluZWQoQ09ORklHX1NNQzkxWCkgfHwgZGVmaW5lZChDT05GSUdfU01DOTFYX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc21jOTF4X3Jlc291cmNlc1tdID0geworCXsKKwkJLm5hbWUgPSAic21jOTF4LXJlZ3MiLAorCQkuc3RhcnQgPSAweDIwMzEwMzAwLAorCQkuZW5kID0gMHgyMDMxMDMwMCArIDE2LAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LCB7CisJCS5zdGFydCA9IElSUV9QRjAsCisJCS5lbmQgPSBJUlFfUEYwLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSB8IElPUkVTT1VSQ0VfSVJRX0hJR0hMRVZFTCwKKwl9LAorfTsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNtYzkxeF9kZXZpY2UgPSB7CisJLm5hbWUgPSAic21jOTF4IiwKKwkuaWQgPSAwLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShzbWM5MXhfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBzbWM5MXhfcmVzb3VyY2VzLAorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1NQSV9CRklOX01PRFVMRSkKKy8qIGFsbCBTUEkgcGVyaXBoZXJhbHMgaW5mbyBnb2VzIGhlcmUgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19NVERfTTI1UDgwKSBcCisJfHwgZGVmaW5lZChDT05GSUdfTVREX00yNVA4MF9NT0RVTEUpCisvKiBTUEkgZmxhc2ggY2hpcCAobTI1cDE2KSAqLworc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIGJmaW5fc3BpX2ZsYXNoX3BhcnRpdGlvbnNbXSA9IHsKKwl7CisJCS5uYW1lID0gImJvb3Rsb2FkZXIoc3BpKSIsCisJCS5zaXplID0gMHgwMDA0MDAwMCwKKwkJLm9mZnNldCA9IDAsCisJCS5tYXNrX2ZsYWdzID0gTVREX0NBUF9ST00KKwl9LCB7CisJCS5uYW1lID0gImxpbnV4IGtlcm5lbChzcGkpIiwKKwkJLnNpemUgPSAweDFjMDAwMCwKKwkJLm9mZnNldCA9IDB4NDAwMDAKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGZsYXNoX3BsYXRmb3JtX2RhdGEgYmZpbl9zcGlfZmxhc2hfZGF0YSA9IHsKKwkubmFtZSA9ICJtMjVwODAiLAorCS5wYXJ0cyA9IGJmaW5fc3BpX2ZsYXNoX3BhcnRpdGlvbnMsCisJLm5yX3BhcnRzID0gQVJSQVlfU0laRShiZmluX3NwaV9mbGFzaF9wYXJ0aXRpb25zKSwKKwkudHlwZSA9ICJtMjVwMTYiLAorfTsKKworc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV9mbGFzaF9jaGlwX2luZm8gPSB7CisJLmVuYWJsZV9kbWEgPSAwLCAgICAgICAgIC8qIHVzZSBkbWEgdHJhbnNmZXIgd2l0aCB0aGlzIGNoaXAqLworCS5iaXRzX3Blcl93b3JkID0gOCwKKwkuY3NfY2hhbmdlX3Blcl93b3JkID0gMCwKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OSkgfHwgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5X01PRFVMRSkKKyNpbmNsdWRlIDxsaW51eC9zcGkvYWQ3ODc5Lmg+CitzdGF0aWMgY29uc3Qgc3RydWN0IGFkNzg3OV9wbGF0Zm9ybV9kYXRhIGJmaW5fYWQ3ODc5X3RzX2luZm8gPSB7CisJLm1vZGVsCQkJPSA3ODc5LAkvKiBNb2RlbCA9IEFENzg3OSAqLworCS54X3BsYXRlX29obXMJCT0gNjIwLAkvKiA2MjAgT2htIGZyb20gdGhlIHRvdWNoIGRhdGFzaGVldCAqLworCS5wcmVzc3VyZV9tYXgJCT0gMTAwMDAsCisJLnByZXNzdXJlX21pbgkJPSAwLAorCS5maXJzdF9jb252ZXJzaW9uX2RlbGF5ID0gMywJLyogd2FpdCA1MTJ1cyBiZWZvcmUgZG8gYSBmaXJzdCBjb252ZXJzaW9uICovCisJLmFjcXVpc2l0aW9uX3RpbWUgCT0gMSwJLyogNHVzIGFjcXVpc2l0aW9uIHRpbWUgcGVyIHNhbXBsZSAqLworCS5tZWRpYW4JCQk9IDIsCS8qIGRvIDggbWVhc3VyZW1lbnRzICovCisJLmF2ZXJhZ2luZyAJCT0gMSwJLyogdGFrZSB0aGUgYXZlcmFnZSBvZiA0IG1pZGRsZSBzYW1wbGVzICovCisJLnBlbl9kb3duX2FjY19pbnRlcnZhbCAJPSAyNTUsCS8qIDkuNCBtcyAqLworCS5ncGlvX291dHB1dAkJPSAxLAkvKiBjb25maWd1cmUgQVVYL1ZCQVQvR1BJTyBhcyBHUElPIG91dHB1dCAqLworCS5ncGlvX2RlZmF1bHQgCQk9IDEsCS8qIER1cmluZyBpbml0aWFsaXphdGlvbiBzZXQgR1BJTyA9IEhJR0ggKi8KK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OV9TUEkpIHx8IGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OV9TUElfTU9EVUxFKQorc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV9hZDc4NzlfY2hpcF9pbmZvID0geworCS5lbmFibGVfZG1hID0gMCwKKwkuYml0c19wZXJfd29yZCA9IDE2LAorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfRkJfQkZJTl9MUTAzNVExKSB8fCBkZWZpbmVkKENPTkZJR19GQl9CRklOX0xRMDM1UTFfTU9EVUxFKQorI2luY2x1ZGUgPGFzbS9iZmluLWxxMDM1cTEuaD4KKworc3RhdGljIHN0cnVjdCBiZmluX2xxMDM1cTFmYl9kaXNwX2luZm8gYmZpbl9scTAzNXExX2RhdGEgPSB7CisJLm1vZGUgPSAJTFEwMzVfTk9STSB8IExRMDM1X1JHQiB8IExRMDM1X1JMIHwgTFEwMzVfVEIsCisJLnVzZV9ibCA9IAkwLAkvKiBsZXQgc29tZXRoaW5nIGVsc2UgY29udHJvbCB0aGUgTENEIEJsYWNrbGlnaHQgKi8KKwkuZ3Bpb19ibCA9CUdQSU9fUEY3LAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX2xxMDM1cTFfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQgPSBJUlFfUFBJX0VSUk9SLAorCQkuZW5kID0gSVJRX1BQSV9FUlJPUiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fbHEwMzVxMV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gImJmaW4tbHEwMzVxMSIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzIAk9IEFSUkFZX1NJWkUoYmZpbl9scTAzNXExX3Jlc291cmNlcyksCisJLnJlc291cmNlIAk9IGJmaW5fbHEwMzVxMV9yZXNvdXJjZXMsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmJmaW5fbHEwMzVxMV9kYXRhLAorCX0sCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfU1BJREVWKSB8fCBkZWZpbmVkKENPTkZJR19TUElfU1BJREVWX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlkZXZfY2hpcF9pbmZvID0geworCS5lbmFibGVfZG1hID0gMCwKKwkuYml0c19wZXJfd29yZCA9IDgsCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19GQl9CRklOX0xRMDM1UTEpIHx8IGRlZmluZWQoQ09ORklHX0ZCX0JGSU5fTFEwMzVRMV9NT0RVTEUpCitzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgbHEwMzVxMV9zcGlfY2hpcF9pbmZvID0geworCS5lbmFibGVfZG1hCT0gMCwKKwkuYml0c19wZXJfd29yZAk9IDgsCit9OworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gYmY1Mzhfc3BpX2JvYXJkX2luZm9bXSBfX2luaXRkYXRhID0geworI2lmIGRlZmluZWQoQ09ORklHX01URF9NMjVQODApIFwKKwl8fCBkZWZpbmVkKENPTkZJR19NVERfTTI1UDgwX01PRFVMRSkKKwl7CisJCS8qIHRoZSBtb2RhbGlhcyBtdXN0IGJlIHRoZSBzYW1lIGFzIHNwaSBkZXZpY2UgZHJpdmVyIG5hbWUgKi8KKwkJLm1vZGFsaWFzID0gIm0yNXA4MCIsIC8qIE5hbWUgb2Ygc3BpX2RyaXZlciBmb3IgdGhpcyBkZXZpY2UgKi8KKwkJLm1heF9zcGVlZF9oeiA9IDI1MDAwMDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLworCQkuYnVzX251bSA9IDAsIC8qIEZyYW1ld29yayBidXMgbnVtYmVyICovCisJCS5jaGlwX3NlbGVjdCA9IDEsIC8qIFNQSV9TU0VMMSovCisJCS5wbGF0Zm9ybV9kYXRhID0gJmJmaW5fc3BpX2ZsYXNoX2RhdGEsCisJCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpX2ZsYXNoX2NoaXBfaW5mbywKKwkJLm1vZGUgPSBTUElfTU9ERV8zLAorCX0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfU1BJKSB8fCBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfU1BJX01PRFVMRSkKKwl7CisJCS5tb2RhbGlhcyA9ICJhZDc4NzkiLAorCQkucGxhdGZvcm1fZGF0YSA9ICZiZmluX2FkNzg3OV90c19pbmZvLAorCQkuaXJxID0gSVJRX1BGMywKKwkJLm1heF9zcGVlZF9oeiA9IDUwMDAwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCisJCS5idXNfbnVtID0gMCwKKwkJLmNoaXBfc2VsZWN0ID0gMSwKKwkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfYWQ3ODc5X2NoaXBfaW5mbywKKwkJLm1vZGUgPSBTUElfQ1BIQSB8IFNQSV9DUE9MLAorCX0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19GQl9CRklOX0xRMDM1UTEpIHx8IGRlZmluZWQoQ09ORklHX0ZCX0JGSU5fTFEwMzVRMV9NT0RVTEUpCisJeworCQkubW9kYWxpYXMgPSAiYmZpbi1scTAzNXExLXNwaSIsCisJCS5tYXhfc3BlZWRfaHogPSAyMDAwMDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KKwkJLmJ1c19udW0gPSAwLAorCQkuY2hpcF9zZWxlY3QgPSAyLAorCQkuY29udHJvbGxlcl9kYXRhID0gJmxxMDM1cTFfc3BpX2NoaXBfaW5mbywKKwkJLm1vZGUgPSBTUElfQ1BIQSB8IFNQSV9DUE9MLAorCX0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfU1BJREVWKSB8fCBkZWZpbmVkKENPTkZJR19TUElfU1BJREVWX01PRFVMRSkKKwl7CisJCS5tb2RhbGlhcyA9ICJzcGlkZXYiLAorCQkubWF4X3NwZWVkX2h6ID0gMzEyNTAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KKwkJLmJ1c19udW0gPSAwLAorCQkuY2hpcF9zZWxlY3QgPSAxLAorCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaWRldl9jaGlwX2luZm8sCisJfSwKKyNlbmRpZgorfTsKKworLyogU1BJICgwKSAqLworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NwaTBfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCA9IFNQSTBfUkVHQkFTRSwKKwkJLmVuZCAgID0gU1BJMF9SRUdCQVNFICsgMHhGRiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCA9IENIX1NQSTAsCisJCS5lbmQgICA9IENIX1NQSTAsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0KK307CisKKy8qIFNQSSAoMSkgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zcGkxX3Jlc291cmNlW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgPSBTUEkxX1JFR0JBU0UsCisJCS5lbmQgICA9IFNQSTFfUkVHQkFTRSArIDB4RkYsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQgPSBDSF9TUEkxLAorCQkuZW5kICAgPSBDSF9TUEkxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9Cit9OworCisvKiBTUEkgKDIpICovCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc3BpMl9yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ID0gU1BJMl9SRUdCQVNFLAorCQkuZW5kICAgPSBTUEkyX1JFR0JBU0UgKyAweEZGLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ID0gQ0hfU1BJMiwKKwkJLmVuZCAgID0gQ0hfU1BJMiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfQorfTsKKworLyogU1BJIGNvbnRyb2xsZXIgZGF0YSAqLworc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9tYXN0ZXIgYmY1Mzhfc3BpX21hc3Rlcl9pbmZvMCA9IHsKKwkubnVtX2NoaXBzZWxlY3QgPSA4LAorCS5lbmFibGVfZG1hID0gMSwgIC8qIG1hc3RlciBoYXMgdGhlIGFiaWxpdHkgdG8gZG8gZG1hIHRyYW5zZmVyICovCisJLnBpbl9yZXEgPSB7UF9TUEkwX1NDSywgUF9TUEkwX01JU08sIFBfU1BJMF9NT1NJLCAwfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmNTM4X3NwaV9tYXN0ZXIwID0geworCS5uYW1lID0gImJmaW4tc3BpIiwKKwkuaWQgPSAwLCAvKiBCdXMgbnVtYmVyICovCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc3BpMF9yZXNvdXJjZSksCisJLnJlc291cmNlID0gYmZpbl9zcGkwX3Jlc291cmNlLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmJmNTM4X3NwaV9tYXN0ZXJfaW5mbzAsIC8qIFBhc3NlZCB0byBkcml2ZXIgKi8KKwkJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfbWFzdGVyIGJmNTM4X3NwaV9tYXN0ZXJfaW5mbzEgPSB7CisJLm51bV9jaGlwc2VsZWN0ID0gOCwKKwkuZW5hYmxlX2RtYSA9IDEsICAvKiBtYXN0ZXIgaGFzIHRoZSBhYmlsaXR5IHRvIGRvIGRtYSB0cmFuc2ZlciAqLworCS5waW5fcmVxID0ge1BfU1BJMV9TQ0ssIFBfU1BJMV9NSVNPLCBQX1NQSTFfTU9TSSwgMH0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZjUzOF9zcGlfbWFzdGVyMSA9IHsKKwkubmFtZSA9ICJiZmluLXNwaSIsCisJLmlkID0gMSwgLyogQnVzIG51bWJlciAqLworCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NwaTFfcmVzb3VyY2UpLAorCS5yZXNvdXJjZSA9IGJmaW5fc3BpMV9yZXNvdXJjZSwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZiZjUzOF9zcGlfbWFzdGVyX2luZm8xLCAvKiBQYXNzZWQgdG8gZHJpdmVyICovCisJCX0sCit9OworCitzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX21hc3RlciBiZjUzOF9zcGlfbWFzdGVyX2luZm8yID0geworCS5udW1fY2hpcHNlbGVjdCA9IDgsCisJLmVuYWJsZV9kbWEgPSAxLCAgLyogbWFzdGVyIGhhcyB0aGUgYWJpbGl0eSB0byBkbyBkbWEgdHJhbnNmZXIgKi8KKwkucGluX3JlcSA9IHtQX1NQSTJfU0NLLCBQX1NQSTJfTUlTTywgUF9TUEkyX01PU0ksIDB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmY1Mzhfc3BpX21hc3RlcjIgPSB7CisJLm5hbWUgPSAiYmZpbi1zcGkiLAorCS5pZCA9IDIsIC8qIEJ1cyBudW1iZXIgKi8KKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zcGkyX3Jlc291cmNlKSwKKwkucmVzb3VyY2UgPSBiZmluX3NwaTJfcmVzb3VyY2UsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmYmY1Mzhfc3BpX21hc3Rlcl9pbmZvMiwgLyogUGFzc2VkIHRvIGRyaXZlciAqLworCQl9LAorfTsKKworI2VuZGlmICAvKiBzcGkgbWFzdGVyIGFuZCBkZXZpY2VzICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl90d2kwX3Jlc291cmNlW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgPSBUV0kwX1JFR0JBU0UsCisJCS5lbmQgICA9IFRXSTBfUkVHQkFTRSArIDB4RkYsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQgPSBJUlFfVFdJMCwKKwkJLmVuZCAgID0gSVJRX1RXSTAsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBpMmNfYmZpbl90d2kwX2RldmljZSA9IHsKKwkubmFtZSA9ICJpMmMtYmZpbi10d2kiLAorCS5pZCA9IDAsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fdHdpMF9yZXNvdXJjZSksCisJLnJlc291cmNlID0gYmZpbl90d2kwX3Jlc291cmNlLAorfTsKKworI2lmICFkZWZpbmVkKENPTkZJR19CRjU0MikJLyogVGhlIEJGNTQyIG9ubHkgaGFzIDEgVFdJICovCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fdHdpMV9yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ID0gVFdJMV9SRUdCQVNFLAorCQkuZW5kICAgPSBUV0kxX1JFR0JBU0UgKyAweEZGLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ID0gSVJRX1RXSTEsCisJCS5lbmQgICA9IElSUV9UV0kxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaTJjX2JmaW5fdHdpMV9kZXZpY2UgPSB7CisJLm5hbWUgPSAiaTJjLWJmaW4tdHdpIiwKKwkuaWQgPSAxLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3R3aTFfcmVzb3VyY2UpLAorCS5yZXNvdXJjZSA9IGJmaW5fdHdpMV9yZXNvdXJjZSwKK307CisjZW5kaWYKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fZ3Bpb3NfcmVzb3VyY2VzID0geworCS5zdGFydCA9IDAsCisJLmVuZCAgID0gTUFYX0JMQUNLRklOX0dQSU9TIC0gMSwKKwkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fZ3Bpb3NfZGV2aWNlID0geworCS5uYW1lID0gInNpbXBsZS1ncGlvIiwKKwkuaWQgPSAtMSwKKwkubnVtX3Jlc291cmNlcyA9IDEsCisJLnJlc291cmNlID0gJmJmaW5fZ3Bpb3NfcmVzb3VyY2VzLAorfTsKKworI2lmIGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX0dQSU8pIHx8IGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX0dQSU9fTU9EVUxFKQorI2luY2x1ZGUgPGxpbnV4L2dwaW9fa2V5cy5oPgorCitzdGF0aWMgc3RydWN0IGdwaW9fa2V5c19idXR0b24gYmZpbl9ncGlvX2tleXNfdGFibGVbXSA9IHsKKwl7QlROXzAsIEdQSU9fUEM3LCAxLCAiZ3Bpby1rZXlzOiBCVE4wIn0sCit9OworCitzdGF0aWMgc3RydWN0IGdwaW9fa2V5c19wbGF0Zm9ybV9kYXRhIGJmaW5fZ3Bpb19rZXlzX2RhdGEgPSB7CisJLmJ1dHRvbnMgICAgICAgID0gYmZpbl9ncGlvX2tleXNfdGFibGUsCisJLm5idXR0b25zICAgICAgID0gQVJSQVlfU0laRShiZmluX2dwaW9fa2V5c190YWJsZSksCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2RldmljZV9ncGlva2V5cyA9IHsKKwkubmFtZSAgICAgID0gImdwaW8ta2V5cyIsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmYmZpbl9ncGlvX2tleXNfZGF0YSwKKwl9LAorfTsKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGNjbGtfdmxldl9kYXRhc2hlZXRbXSA9Cit7CisvKgorICogSW50ZXJuYWwgVkxFViBCRjUzOFNCQkMxNTMzCisgKioqKnRlbXBvcmFyaWx5IHVzaW5nIHRoZXNlIHZhbHVlcyB1bnRpbCBkYXRhIHNoZWV0IGlzIHVwZGF0ZWQKKyAqLworCVZSUEFJUihWTEVWXzEwMCwgMTUwMDAwMDAwKSwKKwlWUlBBSVIoVkxFVl8xMDAsIDI1MDAwMDAwMCksCisJVlJQQUlSKFZMRVZfMTEwLCAyNzYwMDAwMDApLAorCVZSUEFJUihWTEVWXzExNSwgMzAxMDAwMDAwKSwKKwlWUlBBSVIoVkxFVl8xMjAsIDUyNTAwMDAwMCksCisJVlJQQUlSKFZMRVZfMTI1LCA1NTAwMDAwMDApLAorCVZSUEFJUihWTEVWXzEzMCwgNjAwMDAwMDAwKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmZpbl9kcG1jX3BsYXRmb3JtX2RhdGEgYmZpbl9kbXBjX3ZyZWdfZGF0YSA9IHsKKwkudHVwbGVfdGFiID0gY2Nsa192bGV2X2RhdGFzaGVldCwKKwkudGFic2l6ZSA9IEFSUkFZX1NJWkUoY2Nsa192bGV2X2RhdGFzaGVldCksCisJLnZyX3NldHRsaW5nX3RpbWUgPSAyNSAvKiB1cyAqLywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fZHBtYyA9IHsKKwkubmFtZSA9ICJiZmluIGRwbWMiLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmJmaW5fZG1wY192cmVnX2RhdGEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpjbV9iZjUzOF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKworCSZiZmluX2RwbWMsCisKKyNpZiBkZWZpbmVkKENPTkZJR19SVENfRFJWX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1JUQ19EUlZfQkZJTl9NT0RVTEUpCisJJnJ0Y19kZXZpY2UsCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOKSB8fCBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTl9NT0RVTEUpCisJJmJmaW5fdWFydF9kZXZpY2UsCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NQSV9CRklOKSB8fCBkZWZpbmVkKENPTkZJR19TUElfQkZJTl9NT0RVTEUpCisJJmJmNTM4X3NwaV9tYXN0ZXIwLAorCSZiZjUzOF9zcGlfbWFzdGVyMSwKKwkmYmY1Mzhfc3BpX21hc3RlcjIsCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0kpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfTU9EVUxFKQorCSZpMmNfYmZpbl90d2kwX2RldmljZSwKKwkmaTJjX2JmaW5fdHdpMV9kZXZpY2UsCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorCSZiZmluX3NpcjBfZGV2aWNlLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMQorCSZiZmluX3NpcjFfZGV2aWNlLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMgorCSZiZmluX3NpcjJfZGV2aWNlLAorI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NNQzkxWCkgfHwgZGVmaW5lZChDT05GSUdfU01DOTFYX01PRFVMRSkKKwkmc21jOTF4X2RldmljZSwKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfRkJfQkZJTl9MUTAzNVExKSB8fCBkZWZpbmVkKENPTkZJR19GQl9CRklOX0xRMDM1UTFfTU9EVUxFKQorCSZiZmluX2xxMDM1cTFfZGV2aWNlLAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9HUElPKSB8fCBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9HUElPX01PRFVMRSkKKwkmYmZpbl9kZXZpY2VfZ3Bpb2tleXMsCisjZW5kaWYKKworCSZiZmluX2dwaW9zX2RldmljZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGV6a2l0X2luaXQodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICIlcygpOiByZWdpc3RlcmluZyBkZXZpY2UgcmVzb3VyY2VzXG4iLCBfX2Z1bmNfXyk7CisJcGxhdGZvcm1fYWRkX2RldmljZXMoY21fYmY1MzhfZGV2aWNlcywgQVJSQVlfU0laRShjbV9iZjUzOF9kZXZpY2VzKSk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfQkZJTikgfHwgZGVmaW5lZChDT05GSUdfU1BJX0JGSU5fTU9EVUxFKQorCXNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKGJmNTM4X3NwaV9ib2FyZF9pbmZvLAorCQkJQVJSQVlfU0laRShiZjUzOF9zcGlfYm9hcmRfaW5mbykpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworYXJjaF9pbml0Y2FsbChlemtpdF9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9kbWEuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9kbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjgzN2ZiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2RtYS5jCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvZG1hLmMKKyAqIEJhc2VkIG9uOgorICogQXV0aG9yOgorICoKKyAqIENyZWF0ZWQ6CisgKiBEZXNjcmlwdGlvbjogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgc2ltcGxlIERNQSBJbXBsZW1lbnRhdGlvbiBmb3IgQmxhY2tmaW4KKyAqCisgKiBNb2RpZmllZDoKKyAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKKyAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKK3N0cnVjdCBkbWFfcmVnaXN0ZXIgKmRtYV9pb19iYXNlX2FkZHJbTUFYX0RNQV9DSEFOTkVMU10gPSB7CisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMF9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTFfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUEyX05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BM19ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTRfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUE1X05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BNl9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTdfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUE4X05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BOV9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTEwX05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMTFfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUExMl9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTEzX05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMTRfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUExNV9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTE2X05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMTdfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUExOF9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTE5X05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgTURNQTBfRDBfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBNRE1BMF9TMF9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIE1ETUEwX0QxX05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgTURNQTBfUzFfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBNRE1BMV9EMF9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIE1ETUExX1MwX05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgTURNQTFfRDFfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBNRE1BMV9TMV9ORVhUX0RFU0NfUFRSLAorfTsKK0VYUE9SVF9TWU1CT0woZG1hX2lvX2Jhc2VfYWRkcik7CisKK2ludCBjaGFubmVsMmlycSh1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwlpbnQgcmV0X2lycSA9IC0xOworCisJc3dpdGNoIChjaGFubmVsKSB7CisJY2FzZSBDSF9QUEk6CisJCXJldF9pcnEgPSBJUlFfUFBJOworCQlicmVhazsKKworCWNhc2UgQ0hfVUFSVDBfUlg6CisJCXJldF9pcnEgPSBJUlFfVUFSVDBfUlg7CisJCWJyZWFrOworCisJY2FzZSBDSF9VQVJUMF9UWDoKKwkJcmV0X2lycSA9IElSUV9VQVJUMF9UWDsKKwkJYnJlYWs7CisKKwljYXNlIENIX1VBUlQxX1JYOgorCQlyZXRfaXJxID0gSVJRX1VBUlQxX1JYOworCQlicmVhazsKKworCWNhc2UgQ0hfVUFSVDFfVFg6CisJCXJldF9pcnEgPSBJUlFfVUFSVDFfVFg7CisJCWJyZWFrOworCisJY2FzZSBDSF9VQVJUMl9SWDoKKwkJcmV0X2lycSA9IElSUV9VQVJUMl9SWDsKKwkJYnJlYWs7CisKKwljYXNlIENIX1VBUlQyX1RYOgorCQlyZXRfaXJxID0gSVJRX1VBUlQyX1RYOworCQlicmVhazsKKworCWNhc2UgQ0hfU1BPUlQwX1JYOgorCQlyZXRfaXJxID0gSVJRX1NQT1JUMF9SWDsKKwkJYnJlYWs7CisKKwljYXNlIENIX1NQT1JUMF9UWDoKKwkJcmV0X2lycSA9IElSUV9TUE9SVDBfVFg7CisJCWJyZWFrOworCisJY2FzZSBDSF9TUE9SVDFfUlg6CisJCXJldF9pcnEgPSBJUlFfU1BPUlQxX1JYOworCQlicmVhazsKKworCWNhc2UgQ0hfU1BPUlQxX1RYOgorCQlyZXRfaXJxID0gSVJRX1NQT1JUMV9UWDsKKwkJYnJlYWs7CisKKwljYXNlIENIX1NQT1JUMl9SWDoKKwkJcmV0X2lycSA9IElSUV9TUE9SVDJfUlg7CisJCWJyZWFrOworCisJY2FzZSBDSF9TUE9SVDJfVFg6CisJCXJldF9pcnEgPSBJUlFfU1BPUlQyX1RYOworCQlicmVhazsKKworCWNhc2UgQ0hfU1BPUlQzX1JYOgorCQlyZXRfaXJxID0gSVJRX1NQT1JUM19SWDsKKwkJYnJlYWs7CisKKwljYXNlIENIX1NQT1JUM19UWDoKKwkJcmV0X2lycSA9IElSUV9TUE9SVDNfVFg7CisJCWJyZWFrOworCisJY2FzZSBDSF9TUEkwOgorCQlyZXRfaXJxID0gSVJRX1NQSTA7CisJCWJyZWFrOworCisJY2FzZSBDSF9TUEkxOgorCQlyZXRfaXJxID0gSVJRX1NQSTE7CisJCWJyZWFrOworCisJY2FzZSBDSF9TUEkyOgorCQlyZXRfaXJxID0gSVJRX1NQSTI7CisJCWJyZWFrOworCisJY2FzZSBDSF9NRU1fU1RSRUFNMF9TUkM6CisJY2FzZSBDSF9NRU1fU1RSRUFNMF9ERVNUOgorCQlyZXRfaXJxID0gSVJRX01FTTBfRE1BMDsKKwkJYnJlYWs7CisJY2FzZSBDSF9NRU1fU1RSRUFNMV9TUkM6CisJY2FzZSBDSF9NRU1fU1RSRUFNMV9ERVNUOgorCQlyZXRfaXJxID0gSVJRX01FTTBfRE1BMTsKKwkJYnJlYWs7CisJY2FzZSBDSF9NRU1fU1RSRUFNMl9TUkM6CisJY2FzZSBDSF9NRU1fU1RSRUFNMl9ERVNUOgorCQlyZXRfaXJxID0gSVJRX01FTTFfRE1BMDsKKwkJYnJlYWs7CisJY2FzZSBDSF9NRU1fU1RSRUFNM19TUkM6CisJY2FzZSBDSF9NRU1fU1RSRUFNM19ERVNUOgorCQlyZXRfaXJxID0gSVJRX01FTTFfRE1BMTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXRfaXJxOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9hbm9tYWx5LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2Fub21hbHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTMwYjRmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9hbm9tYWx5LmgKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBGaWxlOiBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTM4L2Fub21hbHkuaAorICogQnVnczogRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKy8qIFRoaXMgZmlsZSBzaG91bGUgYmUgdXAgdG8gZGF0ZSB3aXRoOgorICogIC0gUmV2aXNpb24gRywgMDkvMTgvMjAwODsgQURTUC1CRjUzOC9CRjUzOEYgQmxhY2tmaW4gUHJvY2Vzc29yIEFub21hbHkgTGlzdAorICogIC0gUmV2aXNpb24gTCwgMDkvMTgvMjAwODsgQURTUC1CRjUzOS9CRjUzOUYgQmxhY2tmaW4gUHJvY2Vzc29yIEFub21hbHkgTGlzdAorICovCisKKyNpZm5kZWYgX01BQ0hfQU5PTUFMWV9IXworI2RlZmluZSBfTUFDSF9BTk9NQUxZX0hfCisKKyNpZiBfX1NJTElDT05fUkVWSVNJT05fXyA8IDQKKyMgZXJyb3Igd2lsbCBub3Qgd29yayBvbiBCRjUzOCBzaWxpY29uIHZlcnNpb24gMC4wLCAwLjEsIDAuMiwgb3IgMC4zCisjZW5kaWYKKworLyogTXVsdGktSXNzdWUgSW5zdHJ1Y3Rpb24gd2l0aCBkc3AzMnNoaWZ0aW1tIGluIHNsb3QxIGFuZCBQLXJlZyBTdG9yZSBpbiBzbG90MiBOb3QgU3VwcG9ydGVkICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAwNzQgKDEpCisvKiBETUFfUlVOIEJpdCBJcyBOb3QgVmFsaWQgYWZ0ZXIgYSBQZXJpcGhlcmFsIFJlY2VpdmUgQ2hhbm5lbCBETUEgU3RvcHMgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDExOSAoMSkKKy8qIFJ4LkggQ2Fubm90IEJlIFVzZWQgdG8gQWNjZXNzIDE2LWJpdCBTeXN0ZW0gTU1SIFJlZ2lzdGVycyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMTIyICgxKQorLyogUFBJIERhdGEgTGVuZ3RocyBiZXR3ZWVuIDggYW5kIDE2IERvIE5vdCBaZXJvIE91dCBVcHBlciBCaXRzICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAxNjYgKDEpCisvKiBQUElfQ09VTlQgQ2Fubm90IEJlIFByb2dyYW1tZWQgdG8gMCBpbiBHZW5lcmFsIFB1cnBvc2UgVFggb3IgUlggTW9kZXMgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDE3OSAoMSkKKy8qIFBQSV9ERUxBWSBOb3QgRnVuY3Rpb25hbCBpbiBQUEkgTW9kZXMgd2l0aCAwIEZyYW1lIFN5bmNzICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAxODAgKDEpCisvKiBGYWxzZSBJL08gUGluIEludGVycnVwdHMgb24gRWRnZS1TZW5zaXRpdmUgSW5wdXRzIFdoZW4gUG9sYXJpdHkgU2V0dGluZyBJcyBDaGFuZ2VkICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAxOTMgKDEpCisvKiBDdXJyZW50IERNQSBBZGRyZXNzIFNob3dzIFdyb25nIFZhbHVlIER1cmluZyBDYXJyeSBGaXggKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDE5OSAoX19TSUxJQ09OX1JFVklTSU9OX18gPCA0KQorLyogTk1JIEV2ZW50IGF0IEJvb3QgVGltZSBSZXN1bHRzIGluIFVucHJlZGljdGFibGUgU3RhdGUgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDIxOSAoMSkKKy8qIFNQSSBTbGF2ZSBCb290IE1vZGUgTW9kaWZpZXMgUmVnaXN0ZXJzIGZyb20gUmVzZXQgVmFsdWUgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDIyOSAoMSkKKy8qIFBQSV9GUzMgSXMgTm90IERyaXZlbiBpbiAyIG9yIDMgSW50ZXJuYWwgRnJhbWUgU3luYyBUcmFuc21pdCBNb2RlcyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMjMzICgxKQorLyogSWYgaS1jYWNoZSBpcyBvbiwgQ1NZTkMvU1NZTkMvSURMRSBhcm91bmQgQ2hhbmdlIG9mIENvbnRyb2wgY2F1c2VzIGZhaWx1cmVzICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAyNDQgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMykKKy8qIFNwdXJpb3VzIEhhcmR3YXJlIEVycm9yIGZyb20gYW4gQWNjZXNzIGluIHRoZSBTaGFkb3cgb2YgYSBDb25kaXRpb25hbCBCcmFuY2ggKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDI0NSAoMSkKKy8qIE1heGltdW0gRXh0ZXJuYWwgQ2xvY2sgU3BlZWQgZm9yIFRpbWVycyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMjUzICgxKQorLyogRENQTEJfRkFVTFRfQUREUiBNTVIgcmVnaXN0ZXIgbWF5IGJlIGNvcnJ1cHRlZCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMjYxIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDMpCisvKiBIaWdoIEkvTyBBY3Rpdml0eSBDYXVzZXMgT3V0cHV0IFZvbHRhZ2Ugb2YgSW50ZXJuYWwgVm9sdGFnZSBSZWd1bGF0b3IgKFZkZGludCkgdG8gRGVjcmVhc2UgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDI3MCAoX19TSUxJQ09OX1JFVklTSU9OX18gPCA0KQorLyogQ2VydGFpbiBEYXRhIENhY2hlIFdyaXRldGhyb3VnaCBNb2RlcyBGYWlsIGZvciBWZGRpbnQgPD0gMC45ViAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMjcyICgxKQorLyogV3JpdGVzIHRvIFN5bmNocm9ub3VzIFNEUkFNIE1lbW9yeSBNYXkgQmUgTG9zdCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMjczIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDQpCisvKiBXcml0ZXMgdG8gYW4gSS9PIERhdGEgUmVnaXN0ZXIgT25lIFNDTEsgQ3ljbGUgYWZ0ZXIgYW4gRWRnZSBJcyBEZXRlY3RlZCBNYXkgQ2xlYXIgSW50ZXJydXB0ICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAyNzcgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNCkKKy8qIERpc2FibGluZyBQZXJpcGhlcmFscyB3aXRoIERNQSBSdW5uaW5nIE1heSBDYXVzZSBETUEgU3lzdGVtIEluc3RhYmlsaXR5ICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAyNzggKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNCkKKy8qIEZhbHNlIEhhcmR3YXJlIEVycm9yIEV4Y2VwdGlvbiB3aGVuIElTUiBDb250ZXh0IElzIE5vdCBSZXN0b3JlZCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMjgxIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDQpCisvKiBNZW1vcnkgRE1BIENvcnJ1cHRpb24gd2l0aCAzMi1CaXQgRGF0YSBhbmQgVHJhZmZpYyBDb250cm9sICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAyODIgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNCkKKy8qIFN5c3RlbSBNTVIgV3JpdGUgSXMgU3RhbGxlZCBJbmRlZmluaXRlbHkgd2hlbiBLaWxsZWQgaW4gYSBQYXJ0aWN1bGFyIFN0YWdlICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAyODMgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNCkKKy8qIFNQT1JUcyBNYXkgUmVjZWl2ZSBCYWQgRGF0YSBJZiBGSUZPcyBGaWxsIFVwICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAyODggKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNCkKKy8qIFJlYWRzIGZyb20gQ0FOIE1haWxib3ggYW5kIEFjY2VwdGFuY2UgTWFzayBBcmVhIENhbiBGYWlsICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAyOTEgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNCkKKy8qIEhpYmVybmF0ZSBMZWFrYWdlIEN1cnJlbnQgSXMgSGlnaGVyIFRoYW4gU3BlY2lmaWVkICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAyOTMgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNCkKKy8qIFRpbWVyIFBpbiBMaW1pdGF0aW9ucyBmb3IgUFBJIFRYIE1vZGVzIHdpdGggRXh0ZXJuYWwgRnJhbWUgU3luY3MgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDI5NCAoMSkKKy8qIE1lbW9yeS1Uby1NZW1vcnkgRE1BIFNvdXJjZS9EZXN0aW5hdGlvbiBEZXNjcmlwdG9ycyBNdXN0IEJlIGluIFNhbWUgTWVtb3J5IFNwYWNlICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzMDEgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNCkKKy8qIFNTWU5DcyBBZnRlciBXcml0ZXMgVG8gQ0FOL0RNQSBNTVIgUmVnaXN0ZXJzIEFyZSBOb3QgQWx3YXlzIEhhbmRsZWQgQ29ycmVjdGx5ICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzMDQgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNCkKKy8qIFNDS0VMT1cgQml0IERvZXMgTm90IE1haW50YWluIFN0YXRlIFRocm91Z2ggSGliZXJuYXRlICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzMDcgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNCkKKy8qIEZhbHNlIEhhcmR3YXJlIEVycm9ycyBDYXVzZWQgYnkgRmV0Y2hlcyBhdCB0aGUgQm91bmRhcnkgb2YgUmVzZXJ2ZWQgTWVtb3J5ICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzMTAgKDEpCisvKiBFcnJvcnMgd2hlbiBTU1lOQywgQ1NZTkMsIG9yIExvYWRzIHRvIExULCBMQiBhbmQgTEMgUmVnaXN0ZXJzIEFyZSBJbnRlcnJ1cHRlZCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzEyIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDUpCisvKiBQUEkgSXMgTGV2ZWwtU2Vuc2l0aXZlIG9uIEZpcnN0IFRyYW5zZmVyICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzMTMgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNCkKKy8qIEtpbGxlZCBTeXN0ZW0gTU1SIFdyaXRlIENvbXBsZXRlcyBFcnJvbmVvdXNseSBvbiBOZXh0IFN5c3RlbSBNTVIgQWNjZXNzICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzMTUgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNCkKKy8qIFBGeCBHbGl0Y2ggb24gV3JpdGUgdG8gRklPX0ZMQUdfRCBvciBGSU9fRkxBR19UICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzMTggKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNCkKKy8qIFJlZ3VsYXRvciBQcm9ncmFtbWluZyBCbG9ja2VkIHdoZW4gSGliZXJuYXRlIFdha2V1cCBTb3VyY2UgUmVtYWlucyBBY3RpdmUgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDM1NSAoX19TSUxJQ09OX1JFVklTSU9OX18gPCA1KQorLyogU2VyaWFsIFBvcnQgKFNQT1JUKSBNdWx0aWNoYW5uZWwgVHJhbnNtaXQgRmFpbHVyZSB3aGVuIENoYW5uZWwgMCBJcyBEaXNhYmxlZCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzU3IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDUpCisvKiBQUEkgVW5kZXJmbG93IEVycm9yIEdvZXMgVW5kZXRlY3RlZCBpbiBJVFUtUiA2NTYgTW9kZSAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzY2ICgxKQorLyogUG9zc2libGUgUkVUUyBSZWdpc3RlciBDb3JydXB0aW9uIHdoZW4gU3Vicm91dGluZSBJcyB1bmRlciA1IEN5Y2xlcyBpbiBEdXJhdGlvbiAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzcxIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDUpCisvKiBFbnRlcmluZyBIaWJlcm5hdGUgU3RhdGUgd2l0aCBQZXJpcGhlcmFsIFdha2V1cHMgRW5hYmxlZCBEcmF3cyBFeGNlc3MgQ3VycmVudCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzc0IChfX1NJTElDT05fUkVWSVNJT05fXyA9PSA0KQorLyogTmV3IEZlYXR1cmU6IE9wZW4tRHJhaW4gR1BJTyBPdXRwdXRzIG9uIFBDMSBhbmQgUEM0IChOb3QgQXZhaWxhYmxlIG9uIE9sZGVyIFNpbGljb24pICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzNzUgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNCkKKy8qIFNTWU5DIFN0YWxscyBQcm9jZXNzb3Igd2hlbiBFeGVjdXRlZCBmcm9tIE5vbi1DYWNoZWFibGUgTWVtb3J5ICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MDIgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNCkKKy8qIExldmVsLVNlbnNpdGl2ZSBFeHRlcm5hbCBHUElPIFdha2V1cHMgTWF5IENhdXNlIEluZGVmaW5pdGUgU3RhbGwgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQwMyAoMSkKKy8qIFNwZWN1bGF0aXZlIEZldGNoZXMgQ2FuIENhdXNlIFVuZGVzaXJlZCBFeHRlcm5hbCBGSUZPIE9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQxNiAoMSkKKy8qIE11bHRpY2hhbm5lbCBTUE9SVCBDaGFubmVsIE1pc2FsaWdubWVudCBVbmRlciBTcGVjaWZpYyBDb25maWd1cmF0aW9uICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MjUgKDEpCisvKiBTcGVjdWxhdGl2ZSBGZXRjaGVzIG9mIEluZGlyZWN0LVBvaW50ZXIgSW5zdHJ1Y3Rpb25zIENhbiBDYXVzZSBGYWxzZSBIYXJkd2FyZSBFcnJvcnMgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQyNiAoMSkKKy8qIFNwZWNpZmljIEdQSU8gUGlucyBNYXkgQ2hhbmdlIFN0YXRlIHdoZW4gRW50ZXJpbmcgSGliZXJuYXRlICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MzYgKF9fU0lMSUNPTl9SRVZJU0lPTl9fID4gMykKKy8qIElGTFVTSCBJbnN0cnVjdGlvbiBhdCBFbmQgb2YgSGFyZHdhcmUgTG9vcCBDYXVzZXMgSW5maW5pdGUgU3RhbGwgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ0MyAoMSkKKworLyogQW5vbWFsaWVzIHRoYXQgZG9uJ3QgZXhpc3Qgb24gdGhpcyBwcm9jICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAxNTggKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDAxOTggKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDAyMzAgKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDAyNjMgKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzMTEgKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzMjMgKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzNTMgKDEpCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzNjMgKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzODYgKDEpCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MTIgKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MzIgKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MzUgKDApCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9iZjUzOC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9iZjUzOC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljOGFiYjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2JmNTM4LmgKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MzgvYmY1MzguaAorICogQmFzZWQgb246CWluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MzcvYmY1MzcuaAorICogQXV0aG9yOglNaWNoYWVsIEhlbm5lcmljaCAobWljaGFlbC5oZW5uZXJpY2hAYW5hbG9nLmNvbSkKKyAqCisgKiBDcmVhdGVkOgorICogRGVzY3JpcHRpb246ICBTWVNURU0gTU1SIFJFR0lTVEVSIEFORCBNRU1PUlkgTUFQIEZPUiBBRFNQLUJGNTI3CisgKgorICogTW9kaWZpZWQ6CisgKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDcgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKKyAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgX19NQUNIX0JGNTM4X0hfXworI2RlZmluZSBfX01BQ0hfQkY1MzhfSF9fCisKKyNkZWZpbmUgT0ZGU0VUXyh4KSAoKHgpICYgMHgwMDAwRkZGRikKKworLypzb21lIG1pc2MgZGVmaW5lcyovCisjZGVmaW5lIElNQVNLX0lWRzE1CQkweDgwMDAKKyNkZWZpbmUgSU1BU0tfSVZHMTQJCTB4NDAwMAorI2RlZmluZSBJTUFTS19JVkcxMwkJMHgyMDAwCisjZGVmaW5lIElNQVNLX0lWRzEyCQkweDEwMDAKKworI2RlZmluZSBJTUFTS19JVkcxMQkJMHgwODAwCisjZGVmaW5lIElNQVNLX0lWRzEwCQkweDA0MDAKKyNkZWZpbmUgSU1BU0tfSVZHOQkJMHgwMjAwCisjZGVmaW5lIElNQVNLX0lWRzgJCTB4MDEwMAorCisjZGVmaW5lIElNQVNLX0lWRzcJCTB4MDA4MAorI2RlZmluZSBJTUFTS19JVkdUTVIJMHgwMDQwCisjZGVmaW5lIElNQVNLX0lWR0hXCQkweDAwMjAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBCRklOX0RTVUJCQU5LUwk0CisjZGVmaW5lIEJGSU5fRFdBWVMJCTIKKyNkZWZpbmUgQkZJTl9ETElORVMJCTY0CisjZGVmaW5lIEJGSU5fSVNVQkJBTktTCTQKKyNkZWZpbmUgQkZJTl9JV0FZUwkJNAorI2RlZmluZSBCRklOX0lMSU5FUwkJMzIKKworI2RlZmluZSBXQVkwX0wJCQkweDEKKyNkZWZpbmUgV0FZMV9MCQkJMHgyCisjZGVmaW5lIFdBWTAxX0wJCQkweDMKKyNkZWZpbmUgV0FZMl9MCQkJMHg0CisjZGVmaW5lIFdBWTAyX0wJCQkweDUKKyNkZWZpbmUJV0FZMTJfTAkJCTB4NgorI2RlZmluZQlXQVkwMTJfTAkJMHg3CisKKyNkZWZpbmUJV0FZM19MCQkJMHg4CisjZGVmaW5lCVdBWTAzX0wJCQkweDkKKyNkZWZpbmUJV0FZMTNfTAkJCTB4QQorI2RlZmluZQlXQVkwMTNfTAkJMHhCCisKKyNkZWZpbmUJV0FZMzJfTAkJCTB4QworI2RlZmluZQlXQVkzMjBfTAkJMHhECisjZGVmaW5lCVdBWTMyMV9MCQkweEUKKyNkZWZpbmUJV0FZQUxMX0wJCTB4RgorCisjZGVmaW5lIERNQ19FTkFCTEUgKDI8PDIpCS8qeWVzLCAyLCBub3QgMSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEVCSVUgU2V0dGluZ3MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBBTUJDVEwwVkFMCSgoQ09ORklHX0JBTktfMSA8PCAxNikgfCBDT05GSUdfQkFOS18wKQorI2RlZmluZSBBTUJDVEwxVkFMCSgoQ09ORklHX0JBTktfMyA8PCAxNikgfCBDT05GSUdfQkFOS18yKQorCisjaWZkZWYgQ09ORklHX0NfQU1CRU5fQUxMCisjZGVmaW5lIFZfQU1CRU4gQU1CRU5fQUxMCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ19BTUJFTgorI2RlZmluZSBWX0FNQkVOIDB4MAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0NfQU1CRU5fQjAKKyNkZWZpbmUgVl9BTUJFTiBBTUJFTl9CMAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0NfQU1CRU5fQjBfQjEKKyNkZWZpbmUgVl9BTUJFTiBBTUJFTl9CMF9CMQorI2VuZGlmCisjaWZkZWYgQ09ORklHX0NfQU1CRU5fQjBfQjFfQjIKKyNkZWZpbmUgVl9BTUJFTiBBTUJFTl9CMF9CMV9CMgorI2VuZGlmCisjaWZkZWYgQ09ORklHX0NfQU1DS0VOCisjZGVmaW5lIFZfQU1DS0VOIEFNQ0tFTgorI2Vsc2UKKyNkZWZpbmUgVl9BTUNLRU4gMHgwCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ19DRFBSSU8KKyNkZWZpbmUgVl9DRFBSSU8gMHgxMDAKKyNlbHNlCisjZGVmaW5lIFZfQ0RQUklPIDB4MAorI2VuZGlmCisKKyNkZWZpbmUgQU1HQ1RMVkFMCShWX0FNQkVOIHwgVl9BTUNLRU4gfCBWX0NEUFJJTykKKworI2lmZGVmIENPTkZJR19CRjUzOAorI2RlZmluZSBDUFUgIkJGNTM4IgorI2RlZmluZSBDUFVJRCAweDI3QzQKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CRjUzOQorI2RlZmluZSBDUFUgIkJGNTM5IgorI2RlZmluZSBDUFVJRCAweDI3QzQJLyogRlhJTUU6PyAqLworI2VuZGlmCisKKyNpZm5kZWYgQ1BVCisjZXJyb3IgIlVua25vd24gQ1BVIHR5cGUgLSBUaGlzIGtlcm5lbCBkb2Vzbid0IHNlZW0gdG8gYmUgY29uZmlndXJlZCBwcm9wZXJseSIKKyNlbmRpZgorCisjZW5kaWYJCQkJLyogX19NQUNIX0JGNTM4X0hfXyAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWxfNXh4LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNTAzYjYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oCkBAIC0wLDAgKzEsMTgzIEBACisvKgorICogZmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTM4L2JmaW5fc2VyaWFsXzV4eC5oCisgKiBiYXNlZCBvbjoKKyAqIGF1dGhvcjoKKyAqCisgKiBjcmVhdGVkOgorICogZGVzY3JpcHRpb246CisgKglibGFja2ZpbiBzZXJpYWwgZHJpdmVyIGhlYWRlciBmaWxlcworICogcmV2OgorICoKKyAqIG1vZGlmaWVkOgorICoKKyAqCisgKiBidWdzOiAgICAgICAgIGVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIHRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIGdudSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIGZyZWUgc29mdHdhcmUgZm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogdGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgd2l0aG91dCBhbnkgd2FycmFudHk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogbWVyY2hhbnRhYmlsaXR5IG9yIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiAgc2VlIHRoZQorICogZ251IGdlbmVyYWwgcHVibGljIGxpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBnbnUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBjb3B5aW5nLgorICogaWYgbm90LCB3cml0ZSB0byB0aGUgZnJlZSBzb2Z0d2FyZSBmb3VuZGF0aW9uLAorICogNTkgdGVtcGxlIHBsYWNlIC0gc3VpdGUgMzMwLCBib3N0b24sIG1hIDAyMTExLTEzMDcsIHVzYS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9wb3J0bXV4Lmg+CisKKyNkZWZpbmUgVUFSVF9HRVRfQ0hBUih1YXJ0KSAgICAgYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX1JCUikpCisjZGVmaW5lIFVBUlRfR0VUX0RMTCh1YXJ0KQliZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfRExMKSkKKyNkZWZpbmUgVUFSVF9HRVRfSUVSKHVhcnQpICAgICAgYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0lFUikpCisjZGVmaW5lIFVBUlRfR0VUX0RMSCh1YXJ0KQliZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfRExIKSkKKyNkZWZpbmUgVUFSVF9HRVRfSUlSKHVhcnQpICAgICAgYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0lJUikpCisjZGVmaW5lIFVBUlRfR0VUX0xDUih1YXJ0KSAgICAgIGJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9MQ1IpKQorI2RlZmluZSBVQVJUX0dFVF9HQ1RMKHVhcnQpICAgICBiZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfR0NUTCkpCisKKyNkZWZpbmUgVUFSVF9QVVRfQ0hBUih1YXJ0LCB2KSAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfVEhSKSwgdikKKyNkZWZpbmUgVUFSVF9QVVRfRExMKHVhcnQsIHYpICAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfRExMKSwgdikKKyNkZWZpbmUgVUFSVF9QVVRfSUVSKHVhcnQsIHYpICAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfSUVSKSwgdikKKyNkZWZpbmUgVUFSVF9TRVRfSUVSKHVhcnQsIHYpICAgIFVBUlRfUFVUX0lFUih1YXJ0LCBVQVJUX0dFVF9JRVIodWFydCkgfCAodikpCisjZGVmaW5lIFVBUlRfQ0xFQVJfSUVSKHVhcnQsIHYpICBVQVJUX1BVVF9JRVIodWFydCwgVUFSVF9HRVRfSUVSKHVhcnQpICYgfih2KSkKKyNkZWZpbmUgVUFSVF9QVVRfRExIKHVhcnQsIHYpICAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfRExIKSwgdikKKyNkZWZpbmUgVUFSVF9QVVRfTENSKHVhcnQsIHYpICAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfTENSKSwgdikKKyNkZWZpbmUgVUFSVF9QVVRfR0NUTCh1YXJ0LCB2KSAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfR0NUTCksIHYpCisKKyNkZWZpbmUgVUFSVF9TRVRfRExBQih1YXJ0KSAgICAgZG8geyBVQVJUX1BVVF9MQ1IodWFydCwgVUFSVF9HRVRfTENSKHVhcnQpIHwgRExBQik7IFNTWU5DKCk7IH0gd2hpbGUgKDApCisjZGVmaW5lIFVBUlRfQ0xFQVJfRExBQih1YXJ0KSAgIGRvIHsgVUFSVF9QVVRfTENSKHVhcnQsIFVBUlRfR0VUX0xDUih1YXJ0KSAmIH5ETEFCKTsgU1NZTkMoKTsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBVQVJUX0dFVF9DVFMoeCkgZ3Bpb19nZXRfdmFsdWUoeC0+Y3RzX3BpbikKKyNkZWZpbmUgVUFSVF9TRVRfUlRTKHgpIGdwaW9fc2V0X3ZhbHVlKHgtPnJ0c19waW4sIDEpCisjZGVmaW5lIFVBUlRfQ0xFQVJfUlRTKHgpIGdwaW9fc2V0X3ZhbHVlKHgtPnJ0c19waW4sIDApCisjZGVmaW5lIFVBUlRfRU5BQkxFX0lOVFMoeCwgdikgVUFSVF9QVVRfSUVSKHgsIHYpCisjZGVmaW5lIFVBUlRfRElTQUJMRV9JTlRTKHgpIFVBUlRfUFVUX0lFUih4LCAwKQorCisjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9VQVJUMF9DVFNSVFMpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fVUFSVDFfQ1RTUlRTKQorIyBkZWZpbmUgQ09ORklHX1NFUklBTF9CRklOX0NUU1JUUworCisjIGlmbmRlZiBDT05GSUdfVUFSVDBfQ1RTX1BJTgorIyAgZGVmaW5lIENPTkZJR19VQVJUMF9DVFNfUElOIC0xCisjIGVuZGlmCisKKyMgaWZuZGVmIENPTkZJR19VQVJUMF9SVFNfUElOCisjICBkZWZpbmUgQ09ORklHX1VBUlQwX1JUU19QSU4gLTEKKyMgZW5kaWYKKworIyBpZm5kZWYgQ09ORklHX1VBUlQxX0NUU19QSU4KKyMgIGRlZmluZSBDT05GSUdfVUFSVDFfQ1RTX1BJTiAtMQorIyBlbmRpZgorCisjIGlmbmRlZiBDT05GSUdfVUFSVDFfUlRTX1BJTgorIyAgZGVmaW5lIENPTkZJR19VQVJUMV9SVFNfUElOIC0xCisjIGVuZGlmCisjZW5kaWYKKworI2RlZmluZSBCRklOX1VBUlRfVFhfRklGT19TSVpFCTIKKworLyoKKyAqIFRoZSBwaW4gY29uZmlndXJhdGlvbiBpcyBkaWZmZXJlbnQgZnJvbSBzY2hlbWF0aWMKKyAqLworc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgeworCXN0cnVjdCB1YXJ0X3BvcnQJcG9ydDsKKwl1bnNpZ25lZCBpbnQJCW9sZF9zdGF0dXM7CisJdW5zaWduZWQgaW50IGxzcjsKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fRE1BCisJaW50CQkJdHhfZG9uZTsKKwlpbnQJCQl0eF9jb3VudDsKKwlzdHJ1Y3QgY2lyY19idWYJCXJ4X2RtYV9idWY7CisJc3RydWN0IHRpbWVyX2xpc3QgICAgICAgcnhfZG1hX3RpbWVyOworCWludAkJCXJ4X2RtYV9ucm93czsKKwl1bnNpZ25lZCBpbnQJCXR4X2RtYV9jaGFubmVsOworCXVuc2lnbmVkIGludAkJcnhfZG1hX2NoYW5uZWw7CisJc3RydWN0IHdvcmtfc3RydWN0CXR4X2RtYV93b3JrcXVldWU7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fQ1RTUlRTCisJc3RydWN0IHRpbWVyX2xpc3QJY3RzX3RpbWVyOworCWludAkJY3RzX3BpbjsKKwlpbnQJCXJ0c19waW47CisjZW5kaWYKK307CisKKy8qIFRoZSBoYXJkd2FyZSBjbGVhcnMgdGhlIExTUiBiaXRzIHVwb24gcmVhZCwgc28gd2UgbmVlZCB0byBjYWNoZQorICogc29tZSBvZiB0aGUgbW9yZSBmdW4gYml0cyBpbiBzb2Z0d2FyZSBzbyB0aGV5IGRvbid0IGdldCBsb3N0CisgKiB3aGVuIGNoZWNraW5nIHRoZSBMU1IgaW4gb3RoZXIgY29kZSBwYXRocyAoVFgpLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBVQVJUX0dFVF9MU1Ioc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKnVhcnQpCit7CisJdW5zaWduZWQgaW50IGxzciA9IGJmaW5fcmVhZDE2KHVhcnQtPnBvcnQubWVtYmFzZSArIE9GRlNFVF9MU1IpOworCXVhcnQtPmxzciB8PSAobHNyICYgKEJJfEZFfFBFfE9FKSk7CisJcmV0dXJuIGxzciB8IHVhcnQtPmxzcjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIFVBUlRfQ0xFQVJfTFNSKHN0cnVjdCBiZmluX3NlcmlhbF9wb3J0ICp1YXJ0KQoreworCXVhcnQtPmxzciA9IDA7CisJYmZpbl93cml0ZTE2KHVhcnQtPnBvcnQubWVtYmFzZSArIE9GRlNFVF9MU1IsIC0xKTsKK30KKworc3RydWN0IGJmaW5fc2VyaWFsX3JlcyB7CisJdW5zaWduZWQgbG9uZwl1YXJ0X2Jhc2VfYWRkcjsKKwlpbnQJCXVhcnRfaXJxOworI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9ETUEKKwl1bnNpZ25lZCBpbnQJdWFydF90eF9kbWFfY2hhbm5lbDsKKwl1bnNpZ25lZCBpbnQJdWFydF9yeF9kbWFfY2hhbm5lbDsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9DVFNSVFMKKwlpbnQJdWFydF9jdHNfcGluOworCWludAl1YXJ0X3J0c19waW47CisjZW5kaWYKK307CisKK3N0cnVjdCBiZmluX3NlcmlhbF9yZXMgYmZpbl9zZXJpYWxfcmVzb3VyY2VbXSA9IHsKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fVUFSVDAKKwl7CisJMHhGRkMwMDQwMCwKKwlJUlFfVUFSVDBfUlgsCisjaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX0RNQQorCUNIX1VBUlQwX1RYLAorCUNIX1VBUlQwX1JYLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGSU5fVUFSVDBfQ1RTUlRTCisJQ09ORklHX1VBUlQwX0NUU19QSU4sCisJQ09ORklHX1VBUlQwX1JUU19QSU4sCisjZW5kaWYKKwl9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX1VBUlQxCisJeworCTB4RkZDMDIwMDAsCisJSVJRX1VBUlQxX1JYLAorI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9ETUEKKwlDSF9VQVJUMV9UWCwKKwlDSF9VQVJUMV9SWCwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CRklOX1VBUlQxX0NUU1JUUworCUNPTkZJR19VQVJUMV9DVFNfUElOLAorCUNPTkZJR19VQVJUMV9SVFNfUElOLAorI2VuZGlmCisJfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9VQVJUMgorCXsKKwkweEZGQzAyMTAwLAorCUlSUV9VQVJUMl9SWCwKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fRE1BCisJQ0hfVUFSVDJfVFgsCisJQ0hfVUFSVDJfUlgsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkZJTl9VQVJUMl9DVFNSVFMKKwlDT05GSUdfVUFSVDJfQ1RTX1BJTiwKKwlDT05GSUdfVUFSVDJfUlRTX1BJTiwKKyNlbmRpZgorCX0sCisjZW5kaWYKK307CisKKyNkZWZpbmUgRFJJVkVSX05BTUUgImJmaW4tdWFydCIKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTI1MzcxYTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MzgvYmxhY2tmaW4uaAorICogQmFzZWQgb246CisgKiBBdXRob3I6CisgKgorICogQ3JlYXRlZDoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqIFJldjoKKyAqCisgKiBNb2RpZmllZDoKKyAqCisgKgorICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAqIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUFDSF9CTEFDS0ZJTl9IXworI2RlZmluZSBfTUFDSF9CTEFDS0ZJTl9IXworCisjZGVmaW5lIEJGNTM4X0ZBTUlMWQorCisjaW5jbHVkZSAiYmY1MzguaCIKKyNpbmNsdWRlICJtZW1fbWFwLmgiCisjaW5jbHVkZSAiZGVmQkY1MzkuaCIKKyNpbmNsdWRlICJhbm9tYWx5LmgiCisKKworI2lmICFkZWZpbmVkKF9fQVNTRU1CTFlfXykKKyNpbmNsdWRlICJjZGVmQkY1MzguaCIKKworI2lmIGRlZmluZWQoQ09ORklHX0JGNTM5KQorI2luY2x1ZGUgImNkZWZCRjUzOS5oIgorI2VuZGlmCisjZW5kaWYKKworLyogVUFSVF9JSVIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU1RBVFVTKHgpCSgoeCA8PCAxKSAmIDB4MDYpCisjZGVmaW5lIFNUQVRVU19QMQkweDAyCisjZGVmaW5lIFNUQVRVU19QMAkweDAxCisKKyNkZWZpbmUgQkZJTl9VQVJUX05SX1BPUlRTCTMKKworI2RlZmluZSBPRkZTRVRfVEhSICAgICAgICAgICAgICAweDAwCS8qIFRyYW5zbWl0IEhvbGRpbmcgcmVnaXN0ZXIgICAgICAgICAgICAqLworI2RlZmluZSBPRkZTRVRfUkJSICAgICAgICAgICAgICAweDAwCS8qIFJlY2VpdmUgQnVmZmVyIHJlZ2lzdGVyICAgICAgICAgICAgICAqLworI2RlZmluZSBPRkZTRVRfRExMICAgICAgICAgICAgICAweDAwCS8qIERpdmlzb3IgTGF0Y2ggKExvdy1CeXRlKSAgICAgICAgICAgICAqLworI2RlZmluZSBPRkZTRVRfSUVSICAgICAgICAgICAgICAweDA0CS8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgICAgICAgICAgICAqLworI2RlZmluZSBPRkZTRVRfRExIICAgICAgICAgICAgICAweDA0CS8qIERpdmlzb3IgTGF0Y2ggKEhpZ2gtQnl0ZSkgICAgICAgICAgICAqLworI2RlZmluZSBPRkZTRVRfSUlSICAgICAgICAgICAgICAweDA4CS8qIEludGVycnVwdCBJZGVudGlmaWNhdGlvbiBSZWdpc3RlciAgICAqLworI2RlZmluZSBPRkZTRVRfTENSICAgICAgICAgICAgICAweDBDCS8qIExpbmUgQ29udHJvbCBSZWdpc3RlciAgICAgICAgICAgICAgICAqLworI2RlZmluZSBPRkZTRVRfTUNSICAgICAgICAgICAgICAweDEwCS8qIE1vZGVtIENvbnRyb2wgUmVnaXN0ZXIgICAgICAgICAgICAgICAqLworI2RlZmluZSBPRkZTRVRfTFNSICAgICAgICAgICAgICAweDE0CS8qIExpbmUgU3RhdHVzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBPRkZTRVRfTVNSICAgICAgICAgICAgICAweDE4CS8qIE1vZGVtIFN0YXR1cyBSZWdpc3RlciAgICAgICAgICAgICAgICAqLworI2RlZmluZSBPRkZTRVRfU0NSICAgICAgICAgICAgICAweDFDCS8qIFNDUiBTY3JhdGNoIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBPRkZTRVRfR0NUTCAgICAgICAgICAgICAweDI0CS8qIEdsb2JhbCBDb250cm9sIFJlZ2lzdGVyICAgICAgICAgICAgICAqLworCisKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX0lSUV9TVEFUVVMJYmZpbl93cml0ZV9NRE1BMF9EMF9JUlFfU1RBVFVTCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9TVEFSVF9BRERSICAgYmZpbl93cml0ZV9NRE1BMF9EMF9TVEFSVF9BRERSCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9TVEFSVF9BRERSICAgYmZpbl93cml0ZV9NRE1BMF9TMF9TVEFSVF9BRERSCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9YX0NPVU5UICAgICAgYmZpbl93cml0ZV9NRE1BMF9EMF9YX0NPVU5UCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9YX0NPVU5UICAgICAgYmZpbl93cml0ZV9NRE1BMF9TMF9YX0NPVU5UCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9ZX0NPVU5UICAgICAgYmZpbl93cml0ZV9NRE1BMF9EMF9ZX0NPVU5UCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9ZX0NPVU5UICAgICAgYmZpbl93cml0ZV9NRE1BMF9TMF9ZX0NPVU5UCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9YX01PRElGWSAgICAgYmZpbl93cml0ZV9NRE1BMF9EMF9YX01PRElGWQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfWF9NT0RJRlkgICAgIGJmaW5fd3JpdGVfTURNQTBfUzBfWF9NT0RJRlkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1lfTU9ESUZZICAgICBiZmluX3dyaXRlX01ETUEwX0QwX1lfTU9ESUZZCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9ZX01PRElGWSAgICAgYmZpbl93cml0ZV9NRE1BMF9TMF9ZX01PRElGWQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfQ09ORklHICAgICAgIGJmaW5fd3JpdGVfTURNQTBfUzBfQ09ORklHCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9DT05GSUcgICAgICAgYmZpbl93cml0ZV9NRE1BMF9EMF9DT05GSUcKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfQ09ORklHICAgICAgICBiZmluX3JlYWRfTURNQTBfUzBfQ09ORklHCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX0lSUV9TVEFUVVMgICAgYmZpbl9yZWFkX01ETUEwX0QwX0lSUV9TVEFUVVMKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0lSUV9TVEFUVVMgICBiZmluX3dyaXRlX01ETUEwX1MwX0lSUV9TVEFUVVMKKworCisvKiBEUE1DKi8KKyNkZWZpbmUgYmZpbl9yZWFkX1NUT1BDS19PRkYoKSBiZmluX3JlYWRfU1RPUENLKCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TVE9QQ0tfT0ZGKHZhbCkgYmZpbl93cml0ZV9TVE9QQ0sodmFsKQorI2RlZmluZSBTVE9QQ0tfT0ZGIFNUT1BDSworCisvKiBQTExfRElWIE1hc2tzCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIENDTEtfRElWMSBDU0VMX0RJVjEJLyogICAgICAgICAgQ0NMSyA9IFZDTyAvIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0NMS19ESVYyIENTRUxfRElWMgkvKiAgICAgICAgICBDQ0xLID0gVkNPIC8gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDQ0xLX0RJVjQgQ1NFTF9ESVY0CS8qICAgICAgICAgIENDTEsgPSBWQ08gLyA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENDTEtfRElWOCBDU0VMX0RJVjgJLyogICAgICAgICAgQ0NMSyA9IFZDTyAvIDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2NkZWZCRjUzOC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MzguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDE3MjViCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MzguaApAQCAtMCwwICsxLDIxMDggQEAKKy8qCisgKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MzgvY2RlZkJGNTM4LmgKKyAqIEJhc2VkIG9uOgorICogQXV0aG9yOgorICoKKyAqIENyZWF0ZWQ6CisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBSZXY6CisgKgorICogTW9kaWZpZWQ6CisgKgorICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAqIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfQ0RFRl9CRjUzOF9ICisjZGVmaW5lIF9DREVGX0JGNTM4X0gKKworI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgorCisvKmluY2x1ZGUgYWxsIENvcmUgcmVnaXN0ZXJzIGFuZCBiaXQgZGVmaW5pdGlvbnMqLworI2luY2x1ZGUgImRlZkJGNTM5LmgiCisKKy8qaW5jbHVkZSBjb3JlIHNwZWNpZmljIHJlZ2lzdGVyIHBvaW50ZXIgZGVmaW5pdGlvbnMqLworI2luY2x1ZGUgPGFzbS9jZGVmX0xQQmxhY2tmaW4uaD4KKworI2RlZmluZSBiZmluX3dyaXRlUFRSKGFkZHIsIHZhbCkgYmZpbl93cml0ZTMyKGFkZHIsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfUExMX0NUTCgpICAgICAgICAgICAgYmZpbl9yZWFkMTYoUExMX0NUTCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BMTF9ESVYoKSAgICAgICAgICAgIGJmaW5fcmVhZDE2KFBMTF9ESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfUExMX0RJVih2YWwpICAgICAgICBiZmluX3dyaXRlMTYoUExMX0RJViwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVlJfQ1RMKCkgICAgICAgICAgICAgYmZpbl9yZWFkMTYoVlJfQ1RMKQorI2RlZmluZSBiZmluX3JlYWRfUExMX1NUQVQoKSAgICAgICAgICAgYmZpbl9yZWFkMTYoUExMX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUExMX1NUQVQodmFsKSAgICAgICBiZmluX3dyaXRlMTYoUExMX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BMTF9MT0NLQ05UKCkgICAgICAgIGJmaW5fcmVhZDE2KFBMTF9MT0NLQ05UKQorI2RlZmluZSBiZmluX3dyaXRlX1BMTF9MT0NLQ05UKHZhbCkgICAgYmZpbl93cml0ZTE2KFBMTF9MT0NLQ05ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DSElQSUQoKSAgICAgICAgICAgICBiZmluX3JlYWQzMihDSElQSUQpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0hJUElEKHZhbCkgICAgICAgICBiZmluX3dyaXRlMzIoQ0hJUElELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TV1JTVCgpICAgICAgICAgICAgICBiZmluX3JlYWQxNihTV1JTVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TV1JTVCh2YWwpICAgICAgICAgIGJmaW5fd3JpdGUxNihTV1JTVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1lTQ1IoKSAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoU1lTQ1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1lTQ1IodmFsKSAgICAgICAgICBiZmluX3dyaXRlMTYoU1lTQ1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19SVkVDVCgpICAgICAgICAgIGJmaW5fcmVhZFBUUihTSUNfUlZFQ1QpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX1JWRUNUKHZhbCkgICAgICBiZmluX3dyaXRlUFRSKFNJQ19SVkVDVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lNQVNLMCgpICAgICAgICAgYmZpbl9yZWFkMzIoU0lDX0lNQVNLMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSU1BU0swKHZhbCkgICAgIGJmaW5fd3JpdGUzMihTSUNfSU1BU0swLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSU1BU0sxKCkgICAgICAgICBiZmluX3JlYWQzMihTSUNfSU1BU0sxKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JTUFTSzEodmFsKSAgICAgYmZpbl93cml0ZTMyKFNJQ19JTUFTSzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JTUFTSyh4KQkgICAgICAgYmZpbl9yZWFkMzIoU0lDX0lNQVNLMCArIHggKiAoU0lDX0lNQVNLMSAtIFNJQ19JTUFTSzApKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JTUFTSyh4LCB2YWwpICAgYmZpbl93cml0ZTMyKFNJQ19JTUFTSzAgKyB4ICogKFNJQ19JTUFTSzEgLSBTSUNfSU1BU0swKSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lTUjAoKSAgICAgICAgICAgYmZpbl9yZWFkMzIoU0lDX0lTUjApCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lTUjAodmFsKSAgICAgICBiZmluX3dyaXRlMzIoU0lDX0lTUjAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JU1IxKCkgICAgICAgICAgIGJmaW5fcmVhZDMyKFNJQ19JU1IxKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JU1IxKHZhbCkgICAgICAgYmZpbl93cml0ZTMyKFNJQ19JU1IxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSVNSKHgpCSAgICAgICBiZmluX3JlYWQzMihTSUNfSVNSMCArIHggKiAoU0lDX0lTUjEgLSBTSUNfSVNSMCkpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lTUih4LCB2YWwpICAgICBiZmluX3dyaXRlMzIoU0lDX0lTUjAgKyB4ICogKFNJQ19JU1IxIC0gU0lDX0lTUjApLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSVdSMCgpICAgICAgICAgICBiZmluX3JlYWQzMihTSUNfSVdSMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSVdSMCh2YWwpICAgICAgIGJmaW5fd3JpdGUzMihTSUNfSVdSMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lXUjEoKSAgICAgICAgICAgYmZpbl9yZWFkMzIoU0lDX0lXUjEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lXUjEodmFsKSAgICAgICBiZmluX3dyaXRlMzIoU0lDX0lXUjEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JV1IoeCkJICAgICAgIGJmaW5fcmVhZDMyKFNJQ19JV1IwICsgeCAqIChTSUNfSVdSMSAtIFNJQ19JV1IwKSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSVdSKHgsIHZhbCkgICAgIGJmaW5fd3JpdGUzMigoU0lDX0lXUjAgKyB4ICogKFNJQ19JV1IxIC0gU0lDX0lXUjApLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSMCgpICAgICAgICAgICBiZmluX3JlYWQzMihTSUNfSUFSMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSMCh2YWwpICAgICAgIGJmaW5fd3JpdGUzMihTSUNfSUFSMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lBUjEoKSAgICAgICAgICAgYmZpbl9yZWFkMzIoU0lDX0lBUjEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjEodmFsKSAgICAgICBiZmluX3dyaXRlMzIoU0lDX0lBUjEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JQVIyKCkgICAgICAgICAgIGJmaW5fcmVhZDMyKFNJQ19JQVIyKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JQVIyKHZhbCkgICAgICAgYmZpbl93cml0ZTMyKFNJQ19JQVIyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSMygpICAgICAgICAgICBiZmluX3JlYWQzMihTSUNfSUFSMykKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSMyh2YWwpICAgICAgIGJmaW5fd3JpdGUzMihTSUNfSUFSMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lBUjQoKSAgICAgICAgICAgYmZpbl9yZWFkMzIoU0lDX0lBUjQpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjQodmFsKSAgICAgICBiZmluX3dyaXRlMzIoU0lDX0lBUjQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JQVI1KCkgICAgICAgICAgIGJmaW5fcmVhZDMyKFNJQ19JQVI1KQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JQVI1KHZhbCkgICAgICAgYmZpbl93cml0ZTMyKFNJQ19JQVI1LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSNigpICAgICAgICAgICBiZmluX3JlYWQzMihTSUNfSUFSNikKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSNih2YWwpICAgICAgIGJmaW5fd3JpdGUzMihTSUNfSUFSNiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfV0RPR19DVEwoKSAgICAgICAgICAgYmZpbl9yZWFkMTYoV0RPR19DVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfV0RPR19DVEwodmFsKSAgICAgICBiZmluX3dyaXRlMTYoV0RPR19DVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1dET0dfQ05UKCkgICAgICAgICAgIGJmaW5fcmVhZDMyKFdET0dfQ05UKQorI2RlZmluZSBiZmluX3dyaXRlX1dET0dfQ05UKHZhbCkgICAgICAgYmZpbl93cml0ZTMyKFdET0dfQ05ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9XRE9HX1NUQVQoKSAgICAgICAgICBiZmluX3JlYWQzMihXRE9HX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfV0RPR19TVEFUKHZhbCkgICAgICBiZmluX3dyaXRlMzIoV0RPR19TVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SVENfU1RBVCgpICAgICAgICAgICBiZmluX3JlYWQzMihSVENfU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9SVENfU1RBVCh2YWwpICAgICAgIGJmaW5fd3JpdGUzMihSVENfU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlRDX0lDVEwoKSAgICAgICAgICAgYmZpbl9yZWFkMTYoUlRDX0lDVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlRDX0lDVEwodmFsKSAgICAgICBiZmluX3dyaXRlMTYoUlRDX0lDVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JUQ19JU1RBVCgpICAgICAgICAgIGJmaW5fcmVhZDE2KFJUQ19JU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9SVENfSVNUQVQodmFsKSAgICAgIGJmaW5fd3JpdGUxNihSVENfSVNUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JUQ19TV0NOVCgpICAgICAgICAgIGJmaW5fcmVhZDE2KFJUQ19TV0NOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9SVENfU1dDTlQodmFsKSAgICAgIGJmaW5fd3JpdGUxNihSVENfU1dDTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JUQ19BTEFSTSgpICAgICAgICAgIGJmaW5fcmVhZDMyKFJUQ19BTEFSTSkKKyNkZWZpbmUgYmZpbl93cml0ZV9SVENfQUxBUk0odmFsKSAgICAgIGJmaW5fd3JpdGUzMihSVENfQUxBUk0sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JUQ19QUkVOKCkgICAgICAgICAgIGJmaW5fcmVhZDE2KFJUQ19QUkVOKQorI2RlZmluZSBiZmluX3dyaXRlX1JUQ19QUkVOKHZhbCkgICAgICAgYmZpbl93cml0ZTE2KFJUQ19QUkVOLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9USFIoKSAgICAgICAgICBiZmluX3JlYWQxNihVQVJUMF9USFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfVEhSKHZhbCkgICAgICBiZmluX3dyaXRlMTYoVUFSVDBfVEhSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9SQlIoKSAgICAgICAgICBiZmluX3JlYWQxNihVQVJUMF9SQlIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfUkJSKHZhbCkgICAgICBiZmluX3dyaXRlMTYoVUFSVDBfUkJSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9ETEwoKSAgICAgICAgICBiZmluX3JlYWQxNihVQVJUMF9ETEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfRExMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoVUFSVDBfRExMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9ETEgoKSAgICAgICAgICBiZmluX3JlYWQxNihVQVJUMF9ETEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfRExIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoVUFSVDBfRExILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9JRVIoKSAgICAgICAgICBiZmluX3JlYWQxNihVQVJUMF9JRVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfSUVSKHZhbCkgICAgICBiZmluX3dyaXRlMTYoVUFSVDBfSUVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9JSVIoKSAgICAgICAgICBiZmluX3JlYWQxNihVQVJUMF9JSVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfSUlSKHZhbCkgICAgICBiZmluX3dyaXRlMTYoVUFSVDBfSUlSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9MQ1IoKSAgICAgICAgICBiZmluX3JlYWQxNihVQVJUMF9MQ1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfTENSKHZhbCkgICAgICBiZmluX3dyaXRlMTYoVUFSVDBfTENSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9NQ1IoKSAgICAgICAgICBiZmluX3JlYWQxNihVQVJUMF9NQ1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfTUNSKHZhbCkgICAgICBiZmluX3dyaXRlMTYoVUFSVDBfTUNSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9MU1IoKSAgICAgICAgICBiZmluX3JlYWQxNihVQVJUMF9MU1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfTFNSKHZhbCkgICAgICBiZmluX3dyaXRlMTYoVUFSVDBfTFNSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9TQ1IoKSAgICAgICAgICBiZmluX3JlYWQxNihVQVJUMF9TQ1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfU0NSKHZhbCkgICAgICBiZmluX3dyaXRlMTYoVUFSVDBfU0NSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9HQ1RMKCkgICAgICAgICBiZmluX3JlYWQxNihVQVJUMF9HQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX0dDVEwodmFsKSAgICAgYmZpbl93cml0ZTE2KFVBUlQwX0dDVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX1RIUigpICAgICAgICAgIGJmaW5fcmVhZDE2KFVBUlQxX1RIUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9USFIodmFsKSAgICAgIGJmaW5fd3JpdGUxNihVQVJUMV9USFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX1JCUigpICAgICAgICAgIGJmaW5fcmVhZDE2KFVBUlQxX1JCUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9SQlIodmFsKSAgICAgIGJmaW5fd3JpdGUxNihVQVJUMV9SQlIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX0RMTCgpICAgICAgICAgIGJmaW5fcmVhZDE2KFVBUlQxX0RMTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9ETEwodmFsKSAgICAgIGJmaW5fd3JpdGUxNihVQVJUMV9ETEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX0RMSCgpICAgICAgICAgIGJmaW5fcmVhZDE2KFVBUlQxX0RMSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9ETEgodmFsKSAgICAgIGJmaW5fd3JpdGUxNihVQVJUMV9ETEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX0lFUigpICAgICAgICAgIGJmaW5fcmVhZDE2KFVBUlQxX0lFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9JRVIodmFsKSAgICAgIGJmaW5fd3JpdGUxNihVQVJUMV9JRVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX0lJUigpICAgICAgICAgIGJmaW5fcmVhZDE2KFVBUlQxX0lJUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9JSVIodmFsKSAgICAgIGJmaW5fd3JpdGUxNihVQVJUMV9JSVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX0xDUigpICAgICAgICAgIGJmaW5fcmVhZDE2KFVBUlQxX0xDUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9MQ1IodmFsKSAgICAgIGJmaW5fd3JpdGUxNihVQVJUMV9MQ1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX01DUigpICAgICAgICAgIGJmaW5fcmVhZDE2KFVBUlQxX01DUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9NQ1IodmFsKSAgICAgIGJmaW5fd3JpdGUxNihVQVJUMV9NQ1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX0xTUigpICAgICAgICAgIGJmaW5fcmVhZDE2KFVBUlQxX0xTUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9MU1IodmFsKSAgICAgIGJmaW5fd3JpdGUxNihVQVJUMV9MU1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX1NDUigpICAgICAgICAgIGJmaW5fcmVhZDE2KFVBUlQxX1NDUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9TQ1IodmFsKSAgICAgIGJmaW5fd3JpdGUxNihVQVJUMV9TQ1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX0dDVEwoKSAgICAgICAgIGJmaW5fcmVhZDE2KFVBUlQxX0dDVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfR0NUTCh2YWwpICAgICBiZmluX3dyaXRlMTYoVUFSVDFfR0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDJfVEhSKCkgICAgICAgICAgYmZpbl9yZWFkMTYoVUFSVDJfVEhSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQyX1RIUih2YWwpICAgICAgYmZpbl93cml0ZTE2KFVBUlQyX1RIUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDJfUkJSKCkgICAgICAgICAgYmZpbl9yZWFkMTYoVUFSVDJfUkJSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQyX1JCUih2YWwpICAgICAgYmZpbl93cml0ZTE2KFVBUlQyX1JCUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDJfRExMKCkgICAgICAgICAgYmZpbl9yZWFkMTYoVUFSVDJfRExMKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQyX0RMTCh2YWwpICAgICAgYmZpbl93cml0ZTE2KFVBUlQyX0RMTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDJfRExIKCkgICAgICAgICAgYmZpbl9yZWFkMTYoVUFSVDJfRExIKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQyX0RMSCh2YWwpICAgICAgYmZpbl93cml0ZTE2KFVBUlQyX0RMSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDJfSUVSKCkgICAgICAgICAgYmZpbl9yZWFkMTYoVUFSVDJfSUVSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQyX0lFUih2YWwpICAgICAgYmZpbl93cml0ZTE2KFVBUlQyX0lFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDJfSUlSKCkgICAgICAgICAgYmZpbl9yZWFkMTYoVUFSVDJfSUlSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQyX0lJUih2YWwpICAgICAgYmZpbl93cml0ZTE2KFVBUlQyX0lJUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDJfTENSKCkgICAgICAgICAgYmZpbl9yZWFkMTYoVUFSVDJfTENSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQyX0xDUih2YWwpICAgICAgYmZpbl93cml0ZTE2KFVBUlQyX0xDUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDJfTUNSKCkgICAgICAgICAgYmZpbl9yZWFkMTYoVUFSVDJfTUNSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQyX01DUih2YWwpICAgICAgYmZpbl93cml0ZTE2KFVBUlQyX01DUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDJfTFNSKCkgICAgICAgICAgYmZpbl9yZWFkMTYoVUFSVDJfTFNSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQyX0xTUih2YWwpICAgICAgYmZpbl93cml0ZTE2KFVBUlQyX0xTUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDJfU0NSKCkgICAgICAgICAgYmZpbl9yZWFkMTYoVUFSVDJfU0NSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQyX1NDUih2YWwpICAgICAgYmZpbl93cml0ZTE2KFVBUlQyX1NDUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDJfR0NUTCgpICAgICAgICAgYmZpbl9yZWFkMTYoVUFSVDJfR0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMl9HQ1RMKHZhbCkgICAgIGJmaW5fd3JpdGUxNihVQVJUMl9HQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUEkwX0NUTCgpICAgICAgICAgICBiZmluX3JlYWQxNihTUEkwX0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUEkwX0NUTCh2YWwpICAgICAgIGJmaW5fd3JpdGUxNihTUEkwX0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BJMF9GTEcoKSAgICAgICAgICAgYmZpbl9yZWFkMTYoU1BJMF9GTEcpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJMF9GTEcodmFsKSAgICAgICBiZmluX3dyaXRlMTYoU1BJMF9GTEcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQSTBfU1RBVCgpICAgICAgICAgIGJmaW5fcmVhZDE2KFNQSTBfU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUEkwX1NUQVQodmFsKSAgICAgIGJmaW5fd3JpdGUxNihTUEkwX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQSTBfVERCUigpICAgICAgICAgIGJmaW5fcmVhZDE2KFNQSTBfVERCUikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUEkwX1REQlIodmFsKSAgICAgIGJmaW5fd3JpdGUxNihTUEkwX1REQlIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQSTBfUkRCUigpICAgICAgICAgIGJmaW5fcmVhZDE2KFNQSTBfUkRCUikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUEkwX1JEQlIodmFsKSAgICAgIGJmaW5fd3JpdGUxNihTUEkwX1JEQlIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQSTBfQkFVRCgpICAgICAgICAgIGJmaW5fcmVhZDE2KFNQSTBfQkFVRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUEkwX0JBVUQodmFsKSAgICAgIGJmaW5fd3JpdGUxNihTUEkwX0JBVUQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQSTBfU0hBRE9XKCkgICAgICAgIGJmaW5fcmVhZDE2KFNQSTBfU0hBRE9XKQorI2RlZmluZSBiZmluX3dyaXRlX1NQSTBfU0hBRE9XKHZhbCkgICAgYmZpbl93cml0ZTE2KFNQSTBfU0hBRE9XLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUEkxX0NUTCgpICAgICAgICAgICBiZmluX3JlYWQxNihTUEkxX0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUEkxX0NUTCh2YWwpICAgICAgIGJmaW5fd3JpdGUxNihTUEkxX0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BJMV9GTEcoKSAgICAgICAgICAgYmZpbl9yZWFkMTYoU1BJMV9GTEcpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJMV9GTEcodmFsKSAgICAgICBiZmluX3dyaXRlMTYoU1BJMV9GTEcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQSTFfU1RBVCgpICAgICAgICAgIGJmaW5fcmVhZDE2KFNQSTFfU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUEkxX1NUQVQodmFsKSAgICAgIGJmaW5fd3JpdGUxNihTUEkxX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQSTFfVERCUigpICAgICAgICAgIGJmaW5fcmVhZDE2KFNQSTFfVERCUikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUEkxX1REQlIodmFsKSAgICAgIGJmaW5fd3JpdGUxNihTUEkxX1REQlIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQSTFfUkRCUigpICAgICAgICAgIGJmaW5fcmVhZDE2KFNQSTFfUkRCUikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUEkxX1JEQlIodmFsKSAgICAgIGJmaW5fd3JpdGUxNihTUEkxX1JEQlIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQSTFfQkFVRCgpICAgICAgICAgIGJmaW5fcmVhZDE2KFNQSTFfQkFVRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUEkxX0JBVUQodmFsKSAgICAgIGJmaW5fd3JpdGUxNihTUEkxX0JBVUQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQSTFfU0hBRE9XKCkgICAgICAgIGJmaW5fcmVhZDE2KFNQSTFfU0hBRE9XKQorI2RlZmluZSBiZmluX3dyaXRlX1NQSTFfU0hBRE9XKHZhbCkgICAgYmZpbl93cml0ZTE2KFNQSTFfU0hBRE9XLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUEkyX0NUTCgpICAgICAgICAgICBiZmluX3JlYWQxNihTUEkyX0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUEkyX0NUTCh2YWwpICAgICAgIGJmaW5fd3JpdGUxNihTUEkyX0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BJMl9GTEcoKSAgICAgICAgICAgYmZpbl9yZWFkMTYoU1BJMl9GTEcpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJMl9GTEcodmFsKSAgICAgICBiZmluX3dyaXRlMTYoU1BJMl9GTEcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQSTJfU1RBVCgpICAgICAgICAgIGJmaW5fcmVhZDE2KFNQSTJfU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUEkyX1NUQVQodmFsKSAgICAgIGJmaW5fd3JpdGUxNihTUEkyX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQSTJfVERCUigpICAgICAgICAgIGJmaW5fcmVhZDE2KFNQSTJfVERCUikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUEkyX1REQlIodmFsKSAgICAgIGJmaW5fd3JpdGUxNihTUEkyX1REQlIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQSTJfUkRCUigpICAgICAgICAgIGJmaW5fcmVhZDE2KFNQSTJfUkRCUikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUEkyX1JEQlIodmFsKSAgICAgIGJmaW5fd3JpdGUxNihTUEkyX1JEQlIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQSTJfQkFVRCgpICAgICAgICAgIGJmaW5fcmVhZDE2KFNQSTJfQkFVRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUEkyX0JBVUQodmFsKSAgICAgIGJmaW5fd3JpdGUxNihTUEkyX0JBVUQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQSTJfU0hBRE9XKCkgICAgICAgIGJmaW5fcmVhZDE2KFNQSTJfU0hBRE9XKQorI2RlZmluZSBiZmluX3dyaXRlX1NQSTJfU0hBRE9XKHZhbCkgICAgYmZpbl93cml0ZTE2KFNQSTJfU0hBRE9XLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjBfQ09ORklHKCkgICAgICBiZmluX3JlYWQxNihUSU1FUjBfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMF9DT05GSUcodmFsKSAgYmZpbl93cml0ZTE2KFRJTUVSMF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMF9DT1VOVEVSKCkgICAgIGJmaW5fcmVhZDMyKFRJTUVSMF9DT1VOVEVSKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMF9DT1VOVEVSKHZhbCkgYmZpbl93cml0ZTMyKFRJTUVSMF9DT1VOVEVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjBfUEVSSU9EKCkgICAgICBiZmluX3JlYWQzMihUSU1FUjBfUEVSSU9EKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMF9QRVJJT0QodmFsKSAgYmZpbl93cml0ZTMyKFRJTUVSMF9QRVJJT0QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMF9XSURUSCgpICAgICAgIGJmaW5fcmVhZDMyKFRJTUVSMF9XSURUSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjBfV0lEVEgodmFsKSAgIGJmaW5fd3JpdGUzMihUSU1FUjBfV0lEVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMV9DT05GSUcoKSAgICAgIGJmaW5fcmVhZDE2KFRJTUVSMV9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIxX0NPTkZJRyh2YWwpICBiZmluX3dyaXRlMTYoVElNRVIxX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIxX0NPVU5URVIoKSAgICAgYmZpbl9yZWFkMzIoVElNRVIxX0NPVU5URVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIxX0NPVU5URVIodmFsKSBiZmluX3dyaXRlMzIoVElNRVIxX0NPVU5URVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMV9QRVJJT0QoKSAgICAgIGJmaW5fcmVhZDMyKFRJTUVSMV9QRVJJT0QpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIxX1BFUklPRCh2YWwpICBiZmluX3dyaXRlMzIoVElNRVIxX1BFUklPRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIxX1dJRFRIKCkgICAgICAgYmZpbl9yZWFkMzIoVElNRVIxX1dJRFRIKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMV9XSURUSCh2YWwpICAgYmZpbl93cml0ZTMyKFRJTUVSMV9XSURUSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIyX0NPTkZJRygpICAgICAgYmZpbl9yZWFkMTYoVElNRVIyX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjJfQ09ORklHKHZhbCkgIGJmaW5fd3JpdGUxNihUSU1FUjJfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjJfQ09VTlRFUigpICAgICBiZmluX3JlYWQzMihUSU1FUjJfQ09VTlRFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjJfQ09VTlRFUih2YWwpIGJmaW5fd3JpdGUzMihUSU1FUjJfQ09VTlRFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIyX1BFUklPRCgpICAgICAgYmZpbl9yZWFkMzIoVElNRVIyX1BFUklPRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjJfUEVSSU9EKHZhbCkgIGJmaW5fd3JpdGUzMihUSU1FUjJfUEVSSU9ELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjJfV0lEVEgoKSAgICAgICBiZmluX3JlYWQzMihUSU1FUjJfV0lEVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIyX1dJRFRIKHZhbCkgICBiZmluX3dyaXRlMzIoVElNRVIyX1dJRFRILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUl9FTkFCTEUoKSAgICAgICBiZmluX3JlYWQxNihUSU1FUl9FTkFCTEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVJfRU5BQkxFKHZhbCkgICBiZmluX3dyaXRlMTYoVElNRVJfRU5BQkxFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUl9ESVNBQkxFKCkgICAgICBiZmluX3JlYWQxNihUSU1FUl9ESVNBQkxFKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSX0RJU0FCTEUodmFsKSAgYmZpbl93cml0ZTE2KFRJTUVSX0RJU0FCTEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSX1NUQVRVUygpICAgICAgIGJmaW5fcmVhZDE2KFRJTUVSX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUl9TVEFUVVModmFsKSAgIGJmaW5fd3JpdGUxNihUSU1FUl9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9UQ1IxKCkgICAgICAgIGJmaW5fcmVhZDE2KFNQT1JUMF9UQ1IxKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9UQ1IxKHZhbCkgICAgYmZpbl93cml0ZTE2KFNQT1JUMF9UQ1IxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfVENSMigpICAgICAgICBiZmluX3JlYWQxNihTUE9SVDBfVENSMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfVENSMih2YWwpICAgIGJmaW5fd3JpdGUxNihTUE9SVDBfVENSMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1RDTEtESVYoKSAgICAgYmZpbl9yZWFkMTYoU1BPUlQwX1RDTEtESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1RDTEtESVYodmFsKSBiZmluX3dyaXRlMTYoU1BPUlQwX1RDTEtESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9URlNESVYoKSAgICAgIGJmaW5fcmVhZDE2KFNQT1JUMF9URlNESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1RGU0RJVih2YWwpICBiZmluX3dyaXRlMTYoU1BPUlQwX1RGU0RJViwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1RYKCkgICAgICAgICAgYmZpbl9yZWFkMzIoU1BPUlQwX1RYKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9UWCh2YWwpICAgICAgYmZpbl93cml0ZTMyKFNQT1JUMF9UWCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1JYKCkgICAgICAgICAgYmZpbl9yZWFkMzIoU1BPUlQwX1JYKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9SWCh2YWwpICAgICAgYmZpbl93cml0ZTMyKFNQT1JUMF9SWCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1JDUjEoKSAgICAgICAgYmZpbl9yZWFkMTYoU1BPUlQwX1JDUjEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1JDUjEodmFsKSAgICBiZmluX3dyaXRlMTYoU1BPUlQwX1JDUjEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9SQ1IyKCkgICAgICAgIGJmaW5fcmVhZDE2KFNQT1JUMF9SQ1IyKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9SQ1IyKHZhbCkgICAgYmZpbl93cml0ZTE2KFNQT1JUMF9SQ1IyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfUkNMS0RJVigpICAgICBiZmluX3JlYWQxNihTUE9SVDBfUkNMS0RJVikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfUkNMS0RJVih2YWwpIGJmaW5fd3JpdGUxNihTUE9SVDBfUkNMS0RJViwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1JGU0RJVigpICAgICAgYmZpbl9yZWFkMTYoU1BPUlQwX1JGU0RJVikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfUkZTRElWKHZhbCkgIGJmaW5fd3JpdGUxNihTUE9SVDBfUkZTRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfU1RBVCgpICAgICAgICBiZmluX3JlYWQxNihTUE9SVDBfU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfU1RBVCh2YWwpICAgIGJmaW5fd3JpdGUxNihTUE9SVDBfU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX0NITkwoKSAgICAgICAgYmZpbl9yZWFkMTYoU1BPUlQwX0NITkwpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX0NITkwodmFsKSAgICBiZmluX3dyaXRlMTYoU1BPUlQwX0NITkwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NQ01DMSgpICAgICAgIGJmaW5fcmVhZDE2KFNQT1JUMF9NQ01DMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTUNNQzEodmFsKSAgIGJmaW5fd3JpdGUxNihTUE9SVDBfTUNNQzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NQ01DMigpICAgICAgIGJmaW5fcmVhZDE2KFNQT1JUMF9NQ01DMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTUNNQzIodmFsKSAgIGJmaW5fd3JpdGUxNihTUE9SVDBfTUNNQzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NVENTMCgpICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUMF9NVENTMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVRDUzAodmFsKSAgIGJmaW5fd3JpdGUzMihTUE9SVDBfTVRDUzAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NVENTMSgpICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUMF9NVENTMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVRDUzEodmFsKSAgIGJmaW5fd3JpdGUzMihTUE9SVDBfTVRDUzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NVENTMigpICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUMF9NVENTMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVRDUzIodmFsKSAgIGJmaW5fd3JpdGUzMihTUE9SVDBfTVRDUzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NVENTMygpICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUMF9NVENTMykKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVRDUzModmFsKSAgIGJmaW5fd3JpdGUzMihTUE9SVDBfTVRDUzMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NUkNTMCgpICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUMF9NUkNTMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVJDUzAodmFsKSAgIGJmaW5fd3JpdGUzMihTUE9SVDBfTVJDUzAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NUkNTMSgpICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUMF9NUkNTMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVJDUzEodmFsKSAgIGJmaW5fd3JpdGUzMihTUE9SVDBfTVJDUzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NUkNTMigpICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUMF9NUkNTMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVJDUzIodmFsKSAgIGJmaW5fd3JpdGUzMihTUE9SVDBfTVJDUzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NUkNTMygpICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUMF9NUkNTMykKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVJDUzModmFsKSAgIGJmaW5fd3JpdGUzMihTUE9SVDBfTVJDUzMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9UQ1IxKCkgICAgICAgIGJmaW5fcmVhZDE2KFNQT1JUMV9UQ1IxKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9UQ1IxKHZhbCkgICAgYmZpbl93cml0ZTE2KFNQT1JUMV9UQ1IxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfVENSMigpICAgICAgICBiZmluX3JlYWQxNihTUE9SVDFfVENSMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfVENSMih2YWwpICAgIGJmaW5fd3JpdGUxNihTUE9SVDFfVENSMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1RDTEtESVYoKSAgICAgYmZpbl9yZWFkMTYoU1BPUlQxX1RDTEtESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1RDTEtESVYodmFsKSBiZmluX3dyaXRlMTYoU1BPUlQxX1RDTEtESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9URlNESVYoKSAgICAgIGJmaW5fcmVhZDE2KFNQT1JUMV9URlNESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1RGU0RJVih2YWwpICBiZmluX3dyaXRlMTYoU1BPUlQxX1RGU0RJViwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1RYKCkgICAgICAgICAgYmZpbl9yZWFkMzIoU1BPUlQxX1RYKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9UWCh2YWwpICAgICAgYmZpbl93cml0ZTMyKFNQT1JUMV9UWCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1JYKCkgICAgICAgICAgYmZpbl9yZWFkMzIoU1BPUlQxX1JYKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9SWCh2YWwpICAgICAgYmZpbl93cml0ZTMyKFNQT1JUMV9SWCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1JDUjEoKSAgICAgICAgYmZpbl9yZWFkMTYoU1BPUlQxX1JDUjEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1JDUjEodmFsKSAgICBiZmluX3dyaXRlMTYoU1BPUlQxX1JDUjEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9SQ1IyKCkgICAgICAgIGJmaW5fcmVhZDE2KFNQT1JUMV9SQ1IyKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9SQ1IyKHZhbCkgICAgYmZpbl93cml0ZTE2KFNQT1JUMV9SQ1IyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfUkNMS0RJVigpICAgICBiZmluX3JlYWQxNihTUE9SVDFfUkNMS0RJVikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfUkNMS0RJVih2YWwpIGJmaW5fd3JpdGUxNihTUE9SVDFfUkNMS0RJViwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1JGU0RJVigpICAgICAgYmZpbl9yZWFkMTYoU1BPUlQxX1JGU0RJVikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfUkZTRElWKHZhbCkgIGJmaW5fd3JpdGUxNihTUE9SVDFfUkZTRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfU1RBVCgpICAgICAgICBiZmluX3JlYWQxNihTUE9SVDFfU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfU1RBVCh2YWwpICAgIGJmaW5fd3JpdGUxNihTUE9SVDFfU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX0NITkwoKSAgICAgICAgYmZpbl9yZWFkMTYoU1BPUlQxX0NITkwpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX0NITkwodmFsKSAgICBiZmluX3dyaXRlMTYoU1BPUlQxX0NITkwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NQ01DMSgpICAgICAgIGJmaW5fcmVhZDE2KFNQT1JUMV9NQ01DMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTUNNQzEodmFsKSAgIGJmaW5fd3JpdGUxNihTUE9SVDFfTUNNQzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NQ01DMigpICAgICAgIGJmaW5fcmVhZDE2KFNQT1JUMV9NQ01DMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTUNNQzIodmFsKSAgIGJmaW5fd3JpdGUxNihTUE9SVDFfTUNNQzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NVENTMCgpICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUMV9NVENTMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVRDUzAodmFsKSAgIGJmaW5fd3JpdGUzMihTUE9SVDFfTVRDUzAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NVENTMSgpICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUMV9NVENTMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVRDUzEodmFsKSAgIGJmaW5fd3JpdGUzMihTUE9SVDFfTVRDUzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NVENTMigpICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUMV9NVENTMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVRDUzIodmFsKSAgIGJmaW5fd3JpdGUzMihTUE9SVDFfTVRDUzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NVENTMygpICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUMV9NVENTMykKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVRDUzModmFsKSAgIGJmaW5fd3JpdGUzMihTUE9SVDFfTVRDUzMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NUkNTMCgpICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUMV9NUkNTMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVJDUzAodmFsKSAgIGJmaW5fd3JpdGUzMihTUE9SVDFfTVJDUzAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NUkNTMSgpICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUMV9NUkNTMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVJDUzEodmFsKSAgIGJmaW5fd3JpdGUzMihTUE9SVDFfTVJDUzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NUkNTMigpICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUMV9NUkNTMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVJDUzIodmFsKSAgIGJmaW5fd3JpdGUzMihTUE9SVDFfTVJDUzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NUkNTMygpICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUMV9NUkNTMykKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVJDUzModmFsKSAgIGJmaW5fd3JpdGUzMihTUE9SVDFfTVJDUzMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMl9UQ1IxKCkgICAgICAgIGJmaW5fcmVhZDE2KFNQT1JUMl9UQ1IxKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMl9UQ1IxKHZhbCkgICAgYmZpbl93cml0ZTE2KFNQT1JUMl9UQ1IxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDJfVENSMigpICAgICAgICBiZmluX3JlYWQxNihTUE9SVDJfVENSMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDJfVENSMih2YWwpICAgIGJmaW5fd3JpdGUxNihTUE9SVDJfVENSMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQyX1RDTEtESVYoKSAgICAgYmZpbl9yZWFkMTYoU1BPUlQyX1RDTEtESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQyX1RDTEtESVYodmFsKSBiZmluX3dyaXRlMTYoU1BPUlQyX1RDTEtESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMl9URlNESVYoKSAgICAgIGJmaW5fcmVhZDE2KFNQT1JUMl9URlNESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQyX1RGU0RJVih2YWwpICBiZmluX3dyaXRlMTYoU1BPUlQyX1RGU0RJViwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQyX1RYKCkgICAgICAgICAgYmZpbl9yZWFkMzIoU1BPUlQyX1RYKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMl9UWCh2YWwpICAgICAgYmZpbl93cml0ZTMyKFNQT1JUMl9UWCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQyX1JYKCkgICAgICAgICAgYmZpbl9yZWFkMzIoU1BPUlQyX1JYKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMl9SWCh2YWwpICAgICAgYmZpbl93cml0ZTMyKFNQT1JUMl9SWCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQyX1JDUjEoKSAgICAgICAgYmZpbl9yZWFkMTYoU1BPUlQyX1JDUjEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQyX1JDUjEodmFsKSAgICBiZmluX3dyaXRlMTYoU1BPUlQyX1JDUjEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMl9SQ1IyKCkgICAgICAgIGJmaW5fcmVhZDE2KFNQT1JUMl9SQ1IyKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMl9SQ1IyKHZhbCkgICAgYmZpbl93cml0ZTE2KFNQT1JUMl9SQ1IyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDJfUkNMS0RJVigpICAgICBiZmluX3JlYWQxNihTUE9SVDJfUkNMS0RJVikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDJfUkNMS0RJVih2YWwpIGJmaW5fd3JpdGUxNihTUE9SVDJfUkNMS0RJViwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQyX1JGU0RJVigpICAgICAgYmZpbl9yZWFkMTYoU1BPUlQyX1JGU0RJVikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDJfUkZTRElWKHZhbCkgIGJmaW5fd3JpdGUxNihTUE9SVDJfUkZTRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDJfU1RBVCgpICAgICAgICBiZmluX3JlYWQxNihTUE9SVDJfU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDJfU1RBVCh2YWwpICAgIGJmaW5fd3JpdGUxNihTUE9SVDJfU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQyX0NITkwoKSAgICAgICAgYmZpbl9yZWFkMTYoU1BPUlQyX0NITkwpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQyX0NITkwodmFsKSAgICBiZmluX3dyaXRlMTYoU1BPUlQyX0NITkwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMl9NQ01DMSgpICAgICAgIGJmaW5fcmVhZDE2KFNQT1JUMl9NQ01DMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDJfTUNNQzEodmFsKSAgIGJmaW5fd3JpdGUxNihTUE9SVDJfTUNNQzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMl9NQ01DMigpICAgICAgIGJmaW5fcmVhZDE2KFNQT1JUMl9NQ01DMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDJfTUNNQzIodmFsKSAgIGJmaW5fd3JpdGUxNihTUE9SVDJfTUNNQzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMl9NVENTMCgpICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUMl9NVENTMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDJfTVRDUzAodmFsKSAgIGJmaW5fd3JpdGUzMihTUE9SVDJfTVRDUzAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMl9NVENTMSgpICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUMl9NVENTMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDJfTVRDUzEodmFsKSAgIGJmaW5fd3JpdGUzMihTUE9SVDJfTVRDUzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMl9NVENTMigpICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUMl9NVENTMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDJfTVRDUzIodmFsKSAgIGJmaW5fd3JpdGUzMihTUE9SVDJfTVRDUzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMl9NVENTMygpICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUMl9NVENTMykKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDJfTVRDUzModmFsKSAgIGJmaW5fd3JpdGUzMihTUE9SVDJfTVRDUzMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMl9NUkNTMCgpICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUMl9NUkNTMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDJfTVJDUzAodmFsKSAgIGJmaW5fd3JpdGUzMihTUE9SVDJfTVJDUzAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMl9NUkNTMSgpICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUMl9NUkNTMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDJfTVJDUzEodmFsKSAgIGJmaW5fd3JpdGUzMihTUE9SVDJfTVJDUzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMl9NUkNTMigpICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUMl9NUkNTMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDJfTVJDUzIodmFsKSAgIGJmaW5fd3JpdGUzMihTUE9SVDJfTVJDUzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMl9NUkNTMygpICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUMl9NUkNTMykKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDJfTVJDUzModmFsKSAgIGJmaW5fd3JpdGUzMihTUE9SVDJfTVJDUzMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUM19UQ1IxKCkgICAgICAgIGJmaW5fcmVhZDE2KFNQT1JUM19UQ1IxKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUM19UQ1IxKHZhbCkgICAgYmZpbl93cml0ZTE2KFNQT1JUM19UQ1IxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDNfVENSMigpICAgICAgICBiZmluX3JlYWQxNihTUE9SVDNfVENSMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDNfVENSMih2YWwpICAgIGJmaW5fd3JpdGUxNihTUE9SVDNfVENSMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQzX1RDTEtESVYoKSAgICAgYmZpbl9yZWFkMTYoU1BPUlQzX1RDTEtESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQzX1RDTEtESVYodmFsKSBiZmluX3dyaXRlMTYoU1BPUlQzX1RDTEtESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUM19URlNESVYoKSAgICAgIGJmaW5fcmVhZDE2KFNQT1JUM19URlNESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQzX1RGU0RJVih2YWwpICBiZmluX3dyaXRlMTYoU1BPUlQzX1RGU0RJViwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQzX1RYKCkgICAgICAgICAgYmZpbl9yZWFkMzIoU1BPUlQzX1RYKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUM19UWCh2YWwpICAgICAgYmZpbl93cml0ZTMyKFNQT1JUM19UWCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQzX1JYKCkgICAgICAgICAgYmZpbl9yZWFkMzIoU1BPUlQzX1JYKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUM19SWCh2YWwpICAgICAgYmZpbl93cml0ZTMyKFNQT1JUM19SWCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQzX1JDUjEoKSAgICAgICAgYmZpbl9yZWFkMTYoU1BPUlQzX1JDUjEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQzX1JDUjEodmFsKSAgICBiZmluX3dyaXRlMTYoU1BPUlQzX1JDUjEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUM19SQ1IyKCkgICAgICAgIGJmaW5fcmVhZDE2KFNQT1JUM19SQ1IyKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUM19SQ1IyKHZhbCkgICAgYmZpbl93cml0ZTE2KFNQT1JUM19SQ1IyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDNfUkNMS0RJVigpICAgICBiZmluX3JlYWQxNihTUE9SVDNfUkNMS0RJVikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDNfUkNMS0RJVih2YWwpIGJmaW5fd3JpdGUxNihTUE9SVDNfUkNMS0RJViwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQzX1JGU0RJVigpICAgICAgYmZpbl9yZWFkMTYoU1BPUlQzX1JGU0RJVikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDNfUkZTRElWKHZhbCkgIGJmaW5fd3JpdGUxNihTUE9SVDNfUkZTRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDNfU1RBVCgpICAgICAgICBiZmluX3JlYWQxNihTUE9SVDNfU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDNfU1RBVCh2YWwpICAgIGJmaW5fd3JpdGUxNihTUE9SVDNfU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQzX0NITkwoKSAgICAgICAgYmZpbl9yZWFkMTYoU1BPUlQzX0NITkwpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQzX0NITkwodmFsKSAgICBiZmluX3dyaXRlMTYoU1BPUlQzX0NITkwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUM19NQ01DMSgpICAgICAgIGJmaW5fcmVhZDE2KFNQT1JUM19NQ01DMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDNfTUNNQzEodmFsKSAgIGJmaW5fd3JpdGUxNihTUE9SVDNfTUNNQzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUM19NQ01DMigpICAgICAgIGJmaW5fcmVhZDE2KFNQT1JUM19NQ01DMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDNfTUNNQzIodmFsKSAgIGJmaW5fd3JpdGUxNihTUE9SVDNfTUNNQzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUM19NVENTMCgpICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUM19NVENTMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDNfTVRDUzAodmFsKSAgIGJmaW5fd3JpdGUzMihTUE9SVDNfTVRDUzAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUM19NVENTMSgpICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUM19NVENTMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDNfTVRDUzEodmFsKSAgIGJmaW5fd3JpdGUzMihTUE9SVDNfTVRDUzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUM19NVENTMigpICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUM19NVENTMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDNfTVRDUzIodmFsKSAgIGJmaW5fd3JpdGUzMihTUE9SVDNfTVRDUzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUM19NVENTMygpICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUM19NVENTMykKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDNfTVRDUzModmFsKSAgIGJmaW5fd3JpdGUzMihTUE9SVDNfTVRDUzMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUM19NUkNTMCgpICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUM19NUkNTMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDNfTVJDUzAodmFsKSAgIGJmaW5fd3JpdGUzMihTUE9SVDNfTVJDUzAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUM19NUkNTMSgpICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUM19NUkNTMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDNfTVJDUzEodmFsKSAgIGJmaW5fd3JpdGUzMihTUE9SVDNfTVJDUzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUM19NUkNTMigpICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUM19NUkNTMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDNfTVJDUzIodmFsKSAgIGJmaW5fd3JpdGUzMihTUE9SVDNfTVJDUzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUM19NUkNTMygpICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUM19NUkNTMykKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDNfTVJDUzModmFsKSAgIGJmaW5fd3JpdGUzMihTUE9SVDNfTVJDUzMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU8oKSAgICAgICAgICAgIGJmaW5fcmVhZDE2KFBPUlRGSU8pCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJTyh2YWwpICAgICAgICBiZmluX3dyaXRlMTYoUE9SVEZJTywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19DTEVBUigpICAgICAgYmZpbl9yZWFkMTYoUE9SVEZJT19DTEVBUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX0NMRUFSKHZhbCkgIGJmaW5fd3JpdGUxNihQT1JURklPX0NMRUFSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX1NFVCgpICAgICAgICBiZmluX3JlYWQxNihQT1JURklPX1NFVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX1NFVCh2YWwpICAgIGJmaW5fd3JpdGUxNihQT1JURklPX1NFVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19UT0dHTEUoKSAgICAgYmZpbl9yZWFkMTYoUE9SVEZJT19UT0dHTEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19UT0dHTEUodmFsKSBiZmluX3dyaXRlMTYoUE9SVEZJT19UT0dHTEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fTUFTS0EoKSAgICAgIGJmaW5fcmVhZDE2KFBPUlRGSU9fTUFTS0EpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQSh2YWwpICBiZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQV9DTEVBUigpIGJmaW5fcmVhZDE2KFBPUlRGSU9fTUFTS0FfQ0xFQVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQV9DTEVBUih2YWwpIGJmaW5fd3JpdGUxNihQT1JURklPX01BU0tBX0NMRUFSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX01BU0tBX1NFVCgpICBiZmluX3JlYWQxNihQT1JURklPX01BU0tBX1NFVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX01BU0tBX1NFVCh2YWwpIGJmaW5fd3JpdGUxNihQT1JURklPX01BU0tBX1NFVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQV9UT0dHTEUoKSBiZmluX3JlYWQxNihQT1JURklPX01BU0tBX1RPR0dMRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX01BU0tBX1RPR0dMRSh2YWwpIGJmaW5fd3JpdGUxNihQT1JURklPX01BU0tBX1RPR0dMRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQigpICAgICAgYmZpbl9yZWFkMTYoUE9SVEZJT19NQVNLQikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX01BU0tCKHZhbCkgIGJmaW5fd3JpdGUxNihQT1JURklPX01BU0tCLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX01BU0tCX0NMRUFSKCkgYmZpbl9yZWFkMTYoUE9SVEZJT19NQVNLQl9DTEVBUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX01BU0tCX0NMRUFSKHZhbCkgYmZpbl93cml0ZTE2KFBPUlRGSU9fTUFTS0JfQ0xFQVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fTUFTS0JfU0VUKCkgIGJmaW5fcmVhZDE2KFBPUlRGSU9fTUFTS0JfU0VUKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fTUFTS0JfU0VUKHZhbCkgYmZpbl93cml0ZTE2KFBPUlRGSU9fTUFTS0JfU0VULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX01BU0tCX1RPR0dMRSgpIGJmaW5fcmVhZDE2KFBPUlRGSU9fTUFTS0JfVE9HR0xFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fTUFTS0JfVE9HR0xFKHZhbCkgYmZpbl93cml0ZTE2KFBPUlRGSU9fTUFTS0JfVE9HR0xFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX0RJUigpICAgICAgICBiZmluX3JlYWQxNihQT1JURklPX0RJUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX0RJUih2YWwpICAgIGJmaW5fd3JpdGUxNihQT1JURklPX0RJUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19QT0xBUigpICAgICAgYmZpbl9yZWFkMTYoUE9SVEZJT19QT0xBUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX1BPTEFSKHZhbCkgIGJmaW5fd3JpdGUxNihQT1JURklPX1BPTEFSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX0VER0UoKSAgICAgICBiZmluX3JlYWQxNihQT1JURklPX0VER0UpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19FREdFKHZhbCkgICBiZmluX3dyaXRlMTYoUE9SVEZJT19FREdFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX0JPVEgoKSAgICAgICBiZmluX3JlYWQxNihQT1JURklPX0JPVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19CT1RIKHZhbCkgICBiZmluX3dyaXRlMTYoUE9SVEZJT19CT1RILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX0lORU4oKSAgICAgICBiZmluX3JlYWQxNihQT1JURklPX0lORU4pCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19JTkVOKHZhbCkgICBiZmluX3dyaXRlMTYoUE9SVEZJT19JTkVOLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUQ0lPX0ZFUigpICAgICAgICBiZmluX3JlYWQxNihQT1JUQ0lPX0ZFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUQ0lPX0ZFUih2YWwpICAgIGJmaW5fd3JpdGUxNihQT1JUQ0lPX0ZFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVENJTygpICAgICAgICAgICAgYmZpbl9yZWFkMTYoUE9SVENJTykKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUQ0lPKHZhbCkgICAgICAgIGJmaW5fd3JpdGUxNihQT1JUQ0lPLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUQ0lPX0NMRUFSKCkgICAgICBiZmluX3JlYWQxNihQT1JUQ0lPX0NMRUFSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRDSU9fQ0xFQVIodmFsKSAgYmZpbl93cml0ZTE2KFBPUlRDSU9fQ0xFQVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRDSU9fU0VUKCkgICAgICAgIGJmaW5fcmVhZDE2KFBPUlRDSU9fU0VUKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRDSU9fU0VUKHZhbCkgICAgYmZpbl93cml0ZTE2KFBPUlRDSU9fU0VULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUQ0lPX1RPR0dMRSgpICAgICBiZmluX3JlYWQxNihQT1JUQ0lPX1RPR0dMRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUQ0lPX1RPR0dMRSh2YWwpIGJmaW5fd3JpdGUxNihQT1JUQ0lPX1RPR0dMRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVENJT19ESVIoKSAgICAgICAgYmZpbl9yZWFkMTYoUE9SVENJT19ESVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVENJT19ESVIodmFsKSAgICBiZmluX3dyaXRlMTYoUE9SVENJT19ESVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRDSU9fSU5FTigpICAgICAgIGJmaW5fcmVhZDE2KFBPUlRDSU9fSU5FTikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUQ0lPX0lORU4odmFsKSAgIGJmaW5fd3JpdGUxNihQT1JUQ0lPX0lORU4sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRESU9fRkVSKCkgICAgICAgIGJmaW5fcmVhZDE2KFBPUlRESU9fRkVSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRESU9fRkVSKHZhbCkgICAgYmZpbl93cml0ZTE2KFBPUlRESU9fRkVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURElPKCkgICAgICAgICAgICBiZmluX3JlYWQxNihQT1JURElPKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRESU8odmFsKSAgICAgICAgYmZpbl93cml0ZTE2KFBPUlRESU8sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRESU9fQ0xFQVIoKSAgICAgIGJmaW5fcmVhZDE2KFBPUlRESU9fQ0xFQVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVERJT19DTEVBUih2YWwpICBiZmluX3dyaXRlMTYoUE9SVERJT19DTEVBUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVERJT19TRVQoKSAgICAgICAgYmZpbl9yZWFkMTYoUE9SVERJT19TRVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVERJT19TRVQodmFsKSAgICBiZmluX3dyaXRlMTYoUE9SVERJT19TRVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRESU9fVE9HR0xFKCkgICAgIGJmaW5fcmVhZDE2KFBPUlRESU9fVE9HR0xFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRESU9fVE9HR0xFKHZhbCkgYmZpbl93cml0ZTE2KFBPUlRESU9fVE9HR0xFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURElPX0RJUigpICAgICAgICBiZmluX3JlYWQxNihQT1JURElPX0RJUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURElPX0RJUih2YWwpICAgIGJmaW5fd3JpdGUxNihQT1JURElPX0RJUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVERJT19JTkVOKCkgICAgICAgYmZpbl9yZWFkMTYoUE9SVERJT19JTkVOKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRESU9fSU5FTih2YWwpICAgYmZpbl93cml0ZTE2KFBPUlRESU9fSU5FTiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEVJT19GRVIoKSAgICAgICAgYmZpbl9yZWFkMTYoUE9SVEVJT19GRVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEVJT19GRVIodmFsKSAgICBiZmluX3dyaXRlMTYoUE9SVEVJT19GRVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRFSU8oKSAgICAgICAgICAgIGJmaW5fcmVhZDE2KFBPUlRFSU8pCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEVJTyh2YWwpICAgICAgICBiZmluX3dyaXRlMTYoUE9SVEVJTywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEVJT19DTEVBUigpICAgICAgYmZpbl9yZWFkMTYoUE9SVEVJT19DTEVBUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURUlPX0NMRUFSKHZhbCkgIGJmaW5fd3JpdGUxNihQT1JURUlPX0NMRUFSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURUlPX1NFVCgpICAgICAgICBiZmluX3JlYWQxNihQT1JURUlPX1NFVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURUlPX1NFVCh2YWwpICAgIGJmaW5fd3JpdGUxNihQT1JURUlPX1NFVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEVJT19UT0dHTEUoKSAgICAgYmZpbl9yZWFkMTYoUE9SVEVJT19UT0dHTEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEVJT19UT0dHTEUodmFsKSBiZmluX3dyaXRlMTYoUE9SVEVJT19UT0dHTEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRFSU9fRElSKCkgICAgICAgIGJmaW5fcmVhZDE2KFBPUlRFSU9fRElSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRFSU9fRElSKHZhbCkgICAgYmZpbl93cml0ZTE2KFBPUlRFSU9fRElSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURUlPX0lORU4oKSAgICAgICBiZmluX3JlYWQxNihQT1JURUlPX0lORU4pCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEVJT19JTkVOKHZhbCkgICBiZmluX3dyaXRlMTYoUE9SVEVJT19JTkVOLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FQklVX0FNR0NUTCgpICAgICAgICBiZmluX3JlYWQxNihFQklVX0FNR0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FQklVX0FNR0NUTCh2YWwpICAgIGJmaW5fd3JpdGUxNihFQklVX0FNR0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRUJJVV9BTUJDVEwwKCkgICAgICAgYmZpbl9yZWFkMzIoRUJJVV9BTUJDVEwwKQorI2RlZmluZSBiZmluX3dyaXRlX0VCSVVfQU1CQ1RMMCh2YWwpICAgYmZpbl93cml0ZTMyKEVCSVVfQU1CQ1RMMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRUJJVV9BTUJDVEwxKCkgICAgICAgYmZpbl9yZWFkMzIoRUJJVV9BTUJDVEwxKQorI2RlZmluZSBiZmluX3dyaXRlX0VCSVVfQU1CQ1RMMSh2YWwpICAgYmZpbl93cml0ZTMyKEVCSVVfQU1CQ1RMMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRUJJVV9TREdDVEwoKSAgICAgICAgYmZpbl9yZWFkMzIoRUJJVV9TREdDVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfRUJJVV9TREdDVEwodmFsKSAgICBiZmluX3dyaXRlMzIoRUJJVV9TREdDVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VCSVVfU0RCQ1RMKCkgICAgICAgIGJmaW5fcmVhZDE2KEVCSVVfU0RCQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX0VCSVVfU0RCQ1RMKHZhbCkgICAgYmZpbl93cml0ZTE2KEVCSVVfU0RCQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FQklVX1NEUlJDKCkgICAgICAgICBiZmluX3JlYWQxNihFQklVX1NEUlJDKQorI2RlZmluZSBiZmluX3dyaXRlX0VCSVVfU0RSUkModmFsKSAgICAgYmZpbl93cml0ZTE2KEVCSVVfU0RSUkMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VCSVVfU0RTVEFUKCkgICAgICAgIGJmaW5fcmVhZDE2KEVCSVVfU0RTVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX0VCSVVfU0RTVEFUKHZhbCkgICAgYmZpbl93cml0ZTE2KEVCSVVfU0RTVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX1RDX1BFUigpICAgICAgICBiZmluX3JlYWQxNihETUEwX1RDX1BFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX1RDX1BFUih2YWwpICAgIGJmaW5fd3JpdGUxNihETUEwX1RDX1BFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9UQ19DTlQoKSAgICAgICAgYmZpbl9yZWFkMTYoRE1BMF9UQ19DTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9UQ19DTlQodmFsKSAgICBiZmluX3dyaXRlMTYoRE1BMF9UQ19DTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfTkVYVF9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUEwX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUEwX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfU1RBUlRfQUREUigpICAgIGJmaW5fcmVhZFBUUihETUEwX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUEwX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfQ09ORklHKCkgICAgICAgIGJmaW5fcmVhZDE2KERNQTBfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfQ09ORklHKHZhbCkgICAgYmZpbl93cml0ZTE2KERNQTBfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX1hfQ09VTlQoKSAgICAgICBiZmluX3JlYWQxNihETUEwX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9YX0NPVU5UKHZhbCkgICBiZmluX3dyaXRlMTYoRE1BMF9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX1hfTU9ESUZZKCkgICAgICBiZmluX3JlYWQxNihETUEwX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfWF9NT0RJRlkodmFsKSAgYmZpbl93cml0ZTE2KERNQTBfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfWV9DT1VOVCgpICAgICAgIGJmaW5fcmVhZDE2KERNQTBfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX1lfQ09VTlQodmFsKSAgIGJmaW5fd3JpdGUxNihETUEwX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfWV9NT0RJRlkoKSAgICAgIGJmaW5fcmVhZDE2KERNQTBfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9ZX01PRElGWSh2YWwpICBiZmluX3dyaXRlMTYoRE1BMF9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTBfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTBfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9DVVJSX0FERFIoKSAgICAgYmZpbl9yZWFkUFRSKERNQTBfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUEwX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9JUlFfU1RBVFVTKCkgICAgYmZpbl9yZWFkMTYoRE1BMF9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihETUEwX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfUEVSSVBIRVJBTF9NQVAoKSBiZmluX3JlYWQxNihETUEwX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoRE1BMF9QRVJJUEhFUkFMX01BUCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9DVVJSX1hfQ09VTlQoKSAgYmZpbl9yZWFkMTYoRE1BMF9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BMF9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfQ1VSUl9ZX0NPVU5UKCkgIGJmaW5fcmVhZDE2KERNQTBfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTBfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BMV9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMV9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX1NUQVJUX0FERFIoKSAgICBiZmluX3JlYWRQVFIoRE1BMV9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMV9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX0NPTkZJRygpICAgICAgICBiZmluX3JlYWQxNihETUExX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX0NPTkZJRyh2YWwpICAgIGJmaW5fd3JpdGUxNihETUExX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9YX0NPVU5UKCkgICAgICAgYmZpbl9yZWFkMTYoRE1BMV9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfWF9DT1VOVCh2YWwpICAgYmZpbl93cml0ZTE2KERNQTFfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9YX01PRElGWSgpICAgICAgYmZpbl9yZWFkMTYoRE1BMV9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1hfTU9ESUZZKHZhbCkgIGJmaW5fd3JpdGUxNihETUExX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX1lfQ09VTlQoKSAgICAgICBiZmluX3JlYWQxNihETUExX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9ZX0NPVU5UKHZhbCkgICBiZmluX3dyaXRlMTYoRE1BMV9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX1lfTU9ESUZZKCkgICAgICBiZmluX3JlYWQxNihETUExX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfWV9NT0RJRlkodmFsKSAgYmZpbl93cml0ZTE2KERNQTFfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfQ1VSUl9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUExX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUExX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfQ1VSUl9BRERSKCkgICAgIGJmaW5fcmVhZFBUUihETUExX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMV9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfSVJRX1NUQVRVUygpICAgIGJmaW5fcmVhZDE2KERNQTFfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlMTYoRE1BMV9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX1BFUklQSEVSQUxfTUFQKCkgYmZpbl9yZWFkMTYoRE1BMV9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KERNQTFfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfQ1VSUl9YX0NPVU5UKCkgIGJmaW5fcmVhZDE2KERNQTFfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTFfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX0NVUlJfWV9DT1VOVCgpICBiZmluX3JlYWQxNihETUExX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUExX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9ORVhUX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTJfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTJfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9TVEFSVF9BRERSKCkgICAgYmZpbl9yZWFkUFRSKERNQTJfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTJfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9DT05GSUcoKSAgICAgICAgYmZpbl9yZWFkMTYoRE1BMl9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9DT05GSUcodmFsKSAgICBiZmluX3dyaXRlMTYoRE1BMl9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfWF9DT1VOVCgpICAgICAgIGJmaW5fcmVhZDE2KERNQTJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX1hfQ09VTlQodmFsKSAgIGJmaW5fd3JpdGUxNihETUEyX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfWF9NT0RJRlkoKSAgICAgIGJmaW5fcmVhZDE2KERNQTJfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9YX01PRElGWSh2YWwpICBiZmluX3dyaXRlMTYoRE1BMl9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9ZX0NPVU5UKCkgICAgICAgYmZpbl9yZWFkMTYoRE1BMl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfWV9DT1VOVCh2YWwpICAgYmZpbl93cml0ZTE2KERNQTJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9ZX01PRElGWSgpICAgICAgYmZpbl9yZWFkMTYoRE1BMl9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX1lfTU9ESUZZKHZhbCkgIGJmaW5fd3JpdGUxNihETUEyX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEyX0NVUlJfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BMl9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMl9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEyX0NVUlJfQUREUigpICAgICBiZmluX3JlYWRQVFIoRE1BMl9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTJfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEyX0lSUV9TVEFUVVMoKSAgICBiZmluX3JlYWQxNihETUEyX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZTE2KERNQTJfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KERNQTJfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihETUEyX1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEyX0NVUlJfWF9DT1VOVCgpICBiZmluX3JlYWQxNihETUEyX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUEyX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9DVVJSX1lfQ09VTlQoKSAgYmZpbl9yZWFkMTYoRE1BMl9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BMl9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfTkVYVF9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUEzX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUEzX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfU1RBUlRfQUREUigpICAgIGJmaW5fcmVhZFBUUihETUEzX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUEzX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfQ09ORklHKCkgICAgICAgIGJmaW5fcmVhZDE2KERNQTNfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfQ09ORklHKHZhbCkgICAgYmZpbl93cml0ZTE2KERNQTNfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX1hfQ09VTlQoKSAgICAgICBiZmluX3JlYWQxNihETUEzX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19YX0NPVU5UKHZhbCkgICBiZmluX3dyaXRlMTYoRE1BM19YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX1hfTU9ESUZZKCkgICAgICBiZmluX3JlYWQxNihETUEzX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfWF9NT0RJRlkodmFsKSAgYmZpbl93cml0ZTE2KERNQTNfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfWV9DT1VOVCgpICAgICAgIGJmaW5fcmVhZDE2KERNQTNfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX1lfQ09VTlQodmFsKSAgIGJmaW5fd3JpdGUxNihETUEzX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfWV9NT0RJRlkoKSAgICAgIGJmaW5fcmVhZDE2KERNQTNfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19ZX01PRElGWSh2YWwpICBiZmluX3dyaXRlMTYoRE1BM19ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BM19DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTNfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTNfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BM19DVVJSX0FERFIoKSAgICAgYmZpbl9yZWFkUFRSKERNQTNfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUEzX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BM19JUlFfU1RBVFVTKCkgICAgYmZpbl9yZWFkMTYoRE1BM19JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihETUEzX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfUEVSSVBIRVJBTF9NQVAoKSBiZmluX3JlYWQxNihETUEzX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoRE1BM19QRVJJUEhFUkFMX01BUCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BM19DVVJSX1hfQ09VTlQoKSAgYmZpbl9yZWFkMTYoRE1BM19DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BM19DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfQ1VSUl9ZX0NPVU5UKCkgIGJmaW5fcmVhZDE2KERNQTNfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTNfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BNF9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BNF9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X1NUQVJUX0FERFIoKSAgICBiZmluX3JlYWRQVFIoRE1BNF9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BNF9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X0NPTkZJRygpICAgICAgICBiZmluX3JlYWQxNihETUE0X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X0NPTkZJRyh2YWwpICAgIGJmaW5fd3JpdGUxNihETUE0X0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9YX0NPVU5UKCkgICAgICAgYmZpbl9yZWFkMTYoRE1BNF9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfWF9DT1VOVCh2YWwpICAgYmZpbl93cml0ZTE2KERNQTRfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9YX01PRElGWSgpICAgICAgYmZpbl9yZWFkMTYoRE1BNF9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X1hfTU9ESUZZKHZhbCkgIGJmaW5fd3JpdGUxNihETUE0X1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X1lfQ09VTlQoKSAgICAgICBiZmluX3JlYWQxNihETUE0X1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9ZX0NPVU5UKHZhbCkgICBiZmluX3dyaXRlMTYoRE1BNF9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X1lfTU9ESUZZKCkgICAgICBiZmluX3JlYWQxNihETUE0X1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfWV9NT0RJRlkodmFsKSAgYmZpbl93cml0ZTE2KERNQTRfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfQ1VSUl9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUE0X0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUE0X0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfQ1VSUl9BRERSKCkgICAgIGJmaW5fcmVhZFBUUihETUE0X0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BNF9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfSVJRX1NUQVRVUygpICAgIGJmaW5fcmVhZDE2KERNQTRfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlMTYoRE1BNF9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X1BFUklQSEVSQUxfTUFQKCkgYmZpbl9yZWFkMTYoRE1BNF9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KERNQTRfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfQ1VSUl9YX0NPVU5UKCkgIGJmaW5fcmVhZDE2KERNQTRfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTRfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X0NVUlJfWV9DT1VOVCgpICBiZmluX3JlYWQxNihETUE0X0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUE0X0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9ORVhUX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTVfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTVfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9TVEFSVF9BRERSKCkgICAgYmZpbl9yZWFkUFRSKERNQTVfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTVfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9DT05GSUcoKSAgICAgICAgYmZpbl9yZWFkMTYoRE1BNV9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9DT05GSUcodmFsKSAgICBiZmluX3dyaXRlMTYoRE1BNV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfWF9DT1VOVCgpICAgICAgIGJmaW5fcmVhZDE2KERNQTVfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X1hfQ09VTlQodmFsKSAgIGJmaW5fd3JpdGUxNihETUE1X1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfWF9NT0RJRlkoKSAgICAgIGJmaW5fcmVhZDE2KERNQTVfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9YX01PRElGWSh2YWwpICBiZmluX3dyaXRlMTYoRE1BNV9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9ZX0NPVU5UKCkgICAgICAgYmZpbl9yZWFkMTYoRE1BNV9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfWV9DT1VOVCh2YWwpICAgYmZpbl93cml0ZTE2KERNQTVfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9ZX01PRElGWSgpICAgICAgYmZpbl9yZWFkMTYoRE1BNV9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X1lfTU9ESUZZKHZhbCkgIGJmaW5fd3JpdGUxNihETUE1X1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE1X0NVUlJfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BNV9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BNV9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE1X0NVUlJfQUREUigpICAgICBiZmluX3JlYWRQVFIoRE1BNV9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTVfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE1X0lSUV9TVEFUVVMoKSAgICBiZmluX3JlYWQxNihETUE1X0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZTE2KERNQTVfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KERNQTVfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihETUE1X1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE1X0NVUlJfWF9DT1VOVCgpICBiZmluX3JlYWQxNihETUE1X0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUE1X0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9DVVJSX1lfQ09VTlQoKSAgYmZpbl9yZWFkMTYoRE1BNV9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BNV9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfTkVYVF9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUE2X05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUE2X05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfU1RBUlRfQUREUigpICAgIGJmaW5fcmVhZFBUUihETUE2X1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUE2X1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfQ09ORklHKCkgICAgICAgIGJmaW5fcmVhZDE2KERNQTZfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfQ09ORklHKHZhbCkgICAgYmZpbl93cml0ZTE2KERNQTZfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X1hfQ09VTlQoKSAgICAgICBiZmluX3JlYWQxNihETUE2X1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9YX0NPVU5UKHZhbCkgICBiZmluX3dyaXRlMTYoRE1BNl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X1hfTU9ESUZZKCkgICAgICBiZmluX3JlYWQxNihETUE2X1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfWF9NT0RJRlkodmFsKSAgYmZpbl93cml0ZTE2KERNQTZfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfWV9DT1VOVCgpICAgICAgIGJmaW5fcmVhZDE2KERNQTZfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X1lfQ09VTlQodmFsKSAgIGJmaW5fd3JpdGUxNihETUE2X1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfWV9NT0RJRlkoKSAgICAgIGJmaW5fcmVhZDE2KERNQTZfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9ZX01PRElGWSh2YWwpICBiZmluX3dyaXRlMTYoRE1BNl9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNl9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTZfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTZfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNl9DVVJSX0FERFIoKSAgICAgYmZpbl9yZWFkUFRSKERNQTZfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUE2X0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNl9JUlFfU1RBVFVTKCkgICAgYmZpbl9yZWFkMTYoRE1BNl9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihETUE2X0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfUEVSSVBIRVJBTF9NQVAoKSBiZmluX3JlYWQxNihETUE2X1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoRE1BNl9QRVJJUEhFUkFMX01BUCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNl9DVVJSX1hfQ09VTlQoKSAgYmZpbl9yZWFkMTYoRE1BNl9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BNl9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfQ1VSUl9ZX0NPVU5UKCkgIGJmaW5fcmVhZDE2KERNQTZfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTZfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BN19ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BN19ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X1NUQVJUX0FERFIoKSAgICBiZmluX3JlYWRQVFIoRE1BN19TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BN19TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X0NPTkZJRygpICAgICAgICBiZmluX3JlYWQxNihETUE3X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X0NPTkZJRyh2YWwpICAgIGJmaW5fd3JpdGUxNihETUE3X0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19YX0NPVU5UKCkgICAgICAgYmZpbl9yZWFkMTYoRE1BN19YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfWF9DT1VOVCh2YWwpICAgYmZpbl93cml0ZTE2KERNQTdfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19YX01PRElGWSgpICAgICAgYmZpbl9yZWFkMTYoRE1BN19YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X1hfTU9ESUZZKHZhbCkgIGJmaW5fd3JpdGUxNihETUE3X1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X1lfQ09VTlQoKSAgICAgICBiZmluX3JlYWQxNihETUE3X1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19ZX0NPVU5UKHZhbCkgICBiZmluX3dyaXRlMTYoRE1BN19ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X1lfTU9ESUZZKCkgICAgICBiZmluX3JlYWQxNihETUE3X1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfWV9NT0RJRlkodmFsKSAgYmZpbl93cml0ZTE2KERNQTdfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfQ1VSUl9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUE3X0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUE3X0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfQ1VSUl9BRERSKCkgICAgIGJmaW5fcmVhZFBUUihETUE3X0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BN19DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfSVJRX1NUQVRVUygpICAgIGJmaW5fcmVhZDE2KERNQTdfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlMTYoRE1BN19JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X1BFUklQSEVSQUxfTUFQKCkgYmZpbl9yZWFkMTYoRE1BN19QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KERNQTdfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfQ1VSUl9YX0NPVU5UKCkgIGJmaW5fcmVhZDE2KERNQTdfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTdfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X0NVUlJfWV9DT1VOVCgpICBiZmluX3JlYWQxNihETUE3X0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUE3X0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9UQ19QRVIoKSAgICAgICAgYmZpbl9yZWFkMTYoRE1BMV9UQ19QRVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9UQ19QRVIodmFsKSAgICBiZmluX3dyaXRlMTYoRE1BMV9UQ19QRVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfVENfQ05UKCkgICAgICAgIGJmaW5fcmVhZDE2KERNQTFfVENfQ05UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfVENfQ05UKHZhbCkgICAgYmZpbl93cml0ZTE2KERNQTFfVENfQ05ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BOF9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BOF9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X1NUQVJUX0FERFIoKSAgICBiZmluX3JlYWRQVFIoRE1BOF9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BOF9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X0NPTkZJRygpICAgICAgICBiZmluX3JlYWQxNihETUE4X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X0NPTkZJRyh2YWwpICAgIGJmaW5fd3JpdGUxNihETUE4X0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9YX0NPVU5UKCkgICAgICAgYmZpbl9yZWFkMTYoRE1BOF9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfWF9DT1VOVCh2YWwpICAgYmZpbl93cml0ZTE2KERNQThfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9YX01PRElGWSgpICAgICAgYmZpbl9yZWFkMTYoRE1BOF9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X1hfTU9ESUZZKHZhbCkgIGJmaW5fd3JpdGUxNihETUE4X1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X1lfQ09VTlQoKSAgICAgICBiZmluX3JlYWQxNihETUE4X1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9ZX0NPVU5UKHZhbCkgICBiZmluX3dyaXRlMTYoRE1BOF9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X1lfTU9ESUZZKCkgICAgICBiZmluX3JlYWQxNihETUE4X1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfWV9NT0RJRlkodmFsKSAgYmZpbl93cml0ZTE2KERNQThfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfQ1VSUl9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUE4X0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUE4X0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfQ1VSUl9BRERSKCkgICAgIGJmaW5fcmVhZFBUUihETUE4X0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BOF9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfSVJRX1NUQVRVUygpICAgIGJmaW5fcmVhZDE2KERNQThfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlMTYoRE1BOF9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X1BFUklQSEVSQUxfTUFQKCkgYmZpbl9yZWFkMTYoRE1BOF9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KERNQThfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfQ1VSUl9YX0NPVU5UKCkgIGJmaW5fcmVhZDE2KERNQThfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQThfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X0NVUlJfWV9DT1VOVCgpICBiZmluX3JlYWQxNihETUE4X0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUE4X0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9ORVhUX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTlfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTlfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9TVEFSVF9BRERSKCkgICAgYmZpbl9yZWFkUFRSKERNQTlfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTlfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9DT05GSUcoKSAgICAgICAgYmZpbl9yZWFkMTYoRE1BOV9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9DT05GSUcodmFsKSAgICBiZmluX3dyaXRlMTYoRE1BOV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfWF9DT1VOVCgpICAgICAgIGJmaW5fcmVhZDE2KERNQTlfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X1hfQ09VTlQodmFsKSAgIGJmaW5fd3JpdGUxNihETUE5X1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfWF9NT0RJRlkoKSAgICAgIGJmaW5fcmVhZDE2KERNQTlfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9YX01PRElGWSh2YWwpICBiZmluX3dyaXRlMTYoRE1BOV9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9ZX0NPVU5UKCkgICAgICAgYmZpbl9yZWFkMTYoRE1BOV9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfWV9DT1VOVCh2YWwpICAgYmZpbl93cml0ZTE2KERNQTlfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9ZX01PRElGWSgpICAgICAgYmZpbl9yZWFkMTYoRE1BOV9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X1lfTU9ESUZZKHZhbCkgIGJmaW5fd3JpdGUxNihETUE5X1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE5X0NVUlJfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BOV9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BOV9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE5X0NVUlJfQUREUigpICAgICBiZmluX3JlYWRQVFIoRE1BOV9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTlfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE5X0lSUV9TVEFUVVMoKSAgICBiZmluX3JlYWQxNihETUE5X0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZTE2KERNQTlfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KERNQTlfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihETUE5X1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE5X0NVUlJfWF9DT1VOVCgpICBiZmluX3JlYWQxNihETUE5X0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUE5X0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9DVVJSX1lfQ09VTlQoKSAgYmZpbl9yZWFkMTYoRE1BOV9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BOV9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BMTBfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUExMF9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9TVEFSVF9BRERSKCkgICBiZmluX3JlYWRQVFIoRE1BMTBfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUExMF9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9DT05GSUcoKSAgICAgICBiZmluX3JlYWQxNihETUExMF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfQ09ORklHKHZhbCkgICBiZmluX3dyaXRlMTYoRE1BMTBfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9YX0NPVU5UKCkgICAgICBiZmluX3JlYWQxNihETUExMF9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX1hfQ09VTlQodmFsKSAgYmZpbl93cml0ZTE2KERNQTEwX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX1hfTU9ESUZZKCkgICAgIGJmaW5fcmVhZDE2KERNQTEwX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX1hfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KERNQTEwX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9ZX0NPVU5UKCkgICAgICBiZmluX3JlYWQxNihETUExMF9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX1lfQ09VTlQodmFsKSAgYmZpbl93cml0ZTE2KERNQTEwX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX1lfTU9ESUZZKCkgICAgIGJmaW5fcmVhZDE2KERNQTEwX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KERNQTEwX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTEwX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMTBfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfQ1VSUl9BRERSKCkgICAgYmZpbl9yZWFkUFRSKERNQTEwX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTEwX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfSVJRX1NUQVRVUygpICAgYmZpbl9yZWFkMTYoRE1BMTBfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZTE2KERNQTEwX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX1BFUklQSEVSQUxfTUFQKCkgYmZpbl9yZWFkMTYoRE1BMTBfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoRE1BMTBfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX0NVUlJfWF9DT1VOVCgpIGJmaW5fcmVhZDE2KERNQTEwX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BMTBfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9DVVJSX1lfQ09VTlQoKSBiZmluX3JlYWQxNihETUExMF9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTEwX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfTkVYVF9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUExMV9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTExX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX1NUQVJUX0FERFIoKSAgIGJmaW5fcmVhZFBUUihETUExMV9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTExX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX0NPTkZJRygpICAgICAgIGJmaW5fcmVhZDE2KERNQTExX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9DT05GSUcodmFsKSAgIGJmaW5fd3JpdGUxNihETUExMV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX1hfQ09VTlQoKSAgICAgIGJmaW5fcmVhZDE2KERNQTExX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfWF9DT1VOVCh2YWwpICBiZmluX3dyaXRlMTYoRE1BMTFfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfWF9NT0RJRlkoKSAgICAgYmZpbl9yZWFkMTYoRE1BMTFfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfWF9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoRE1BMTFfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX1lfQ09VTlQoKSAgICAgIGJmaW5fcmVhZDE2KERNQTExX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfWV9DT1VOVCh2YWwpICBiZmluX3dyaXRlMTYoRE1BMTFfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfWV9NT0RJRlkoKSAgICAgYmZpbl9yZWFkMTYoRE1BMTFfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfWV9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoRE1BMTFfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX0NVUlJfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BMTFfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUExMV9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9DVVJSX0FERFIoKSAgICBiZmluX3JlYWRQVFIoRE1BMTFfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMTFfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9JUlFfU1RBVFVTKCkgICBiZmluX3JlYWQxNihETUExMV9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlMTYoRE1BMTFfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfUEVSSVBIRVJBTF9NQVAoKSBiZmluX3JlYWQxNihETUExMV9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihETUExMV9QRVJJUEhFUkFMX01BUCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfQ1VSUl9YX0NPVU5UKCkgYmZpbl9yZWFkMTYoRE1BMTFfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUExMV9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX0NVUlJfWV9DT1VOVCgpIGJmaW5fcmVhZDE2KERNQTExX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BMTFfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMl9ORVhUX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTEyX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTJfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMTJfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTJfU1RBUlRfQUREUigpICAgYmZpbl9yZWFkUFRSKERNQTEyX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTJfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMTJfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTJfQ09ORklHKCkgICAgICAgYmZpbl9yZWFkMTYoRE1BMTJfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEyX0NPTkZJRyh2YWwpICAgYmZpbl93cml0ZTE2KERNQTEyX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTJfWF9DT1VOVCgpICAgICAgYmZpbl9yZWFkMTYoRE1BMTJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMl9YX0NPVU5UKHZhbCkgIGJmaW5fd3JpdGUxNihETUExMl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMl9YX01PRElGWSgpICAgICBiZmluX3JlYWQxNihETUExMl9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMl9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihETUExMl9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTJfWV9DT1VOVCgpICAgICAgYmZpbl9yZWFkMTYoRE1BMTJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMl9ZX0NPVU5UKHZhbCkgIGJmaW5fd3JpdGUxNihETUExMl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMl9ZX01PRElGWSgpICAgICBiZmluX3JlYWQxNihETUExMl9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMl9ZX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihETUExMl9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTJfQ1VSUl9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUExMl9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEyX0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTEyX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEyX0NVUlJfQUREUigpICAgIGJmaW5fcmVhZFBUUihETUExMl9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTJfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUExMl9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEyX0lSUV9TVEFUVVMoKSAgIGJmaW5fcmVhZDE2KERNQTEyX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTJfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihETUExMl9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMl9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KERNQTEyX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEyX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KERNQTEyX1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMl9DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihETUExMl9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTJfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTEyX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTJfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoRE1BMTJfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEyX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUExMl9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEzX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BMTNfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExM19ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUExM19ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExM19TVEFSVF9BRERSKCkgICBiZmluX3JlYWRQVFIoRE1BMTNfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExM19TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUExM19TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExM19DT05GSUcoKSAgICAgICBiZmluX3JlYWQxNihETUExM19DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTNfQ09ORklHKHZhbCkgICBiZmluX3dyaXRlMTYoRE1BMTNfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExM19YX0NPVU5UKCkgICAgICBiZmluX3JlYWQxNihETUExM19YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEzX1hfQ09VTlQodmFsKSAgYmZpbl93cml0ZTE2KERNQTEzX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEzX1hfTU9ESUZZKCkgICAgIGJmaW5fcmVhZDE2KERNQTEzX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEzX1hfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KERNQTEzX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExM19ZX0NPVU5UKCkgICAgICBiZmluX3JlYWQxNihETUExM19ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEzX1lfQ09VTlQodmFsKSAgYmZpbl93cml0ZTE2KERNQTEzX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEzX1lfTU9ESUZZKCkgICAgIGJmaW5fcmVhZDE2KERNQTEzX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEzX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KERNQTEzX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExM19DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTEzX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTNfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMTNfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTNfQ1VSUl9BRERSKCkgICAgYmZpbl9yZWFkUFRSKERNQTEzX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExM19DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTEzX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTNfSVJRX1NUQVRVUygpICAgYmZpbl9yZWFkMTYoRE1BMTNfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExM19JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZTE2KERNQTEzX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEzX1BFUklQSEVSQUxfTUFQKCkgYmZpbl9yZWFkMTYoRE1BMTNfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTNfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoRE1BMTNfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEzX0NVUlJfWF9DT1VOVCgpIGJmaW5fcmVhZDE2KERNQTEzX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExM19DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BMTNfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExM19DVVJSX1lfQ09VTlQoKSBiZmluX3JlYWQxNihETUExM19DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTNfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTEzX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTRfTkVYVF9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUExNF9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE0X05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTE0X05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE0X1NUQVJUX0FERFIoKSAgIGJmaW5fcmVhZFBUUihETUExNF9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE0X1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTE0X1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE0X0NPTkZJRygpICAgICAgIGJmaW5fcmVhZDE2KERNQTE0X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNF9DT05GSUcodmFsKSAgIGJmaW5fd3JpdGUxNihETUExNF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE0X1hfQ09VTlQoKSAgICAgIGJmaW5fcmVhZDE2KERNQTE0X1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTRfWF9DT1VOVCh2YWwpICBiZmluX3dyaXRlMTYoRE1BMTRfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTRfWF9NT0RJRlkoKSAgICAgYmZpbl9yZWFkMTYoRE1BMTRfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTRfWF9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoRE1BMTRfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE0X1lfQ09VTlQoKSAgICAgIGJmaW5fcmVhZDE2KERNQTE0X1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTRfWV9DT1VOVCh2YWwpICBiZmluX3dyaXRlMTYoRE1BMTRfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTRfWV9NT0RJRlkoKSAgICAgYmZpbl9yZWFkMTYoRE1BMTRfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTRfWV9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoRE1BMTRfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE0X0NVUlJfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BMTRfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNF9DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUExNF9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNF9DVVJSX0FERFIoKSAgICBiZmluX3JlYWRQVFIoRE1BMTRfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE0X0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMTRfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNF9JUlFfU1RBVFVTKCkgICBiZmluX3JlYWQxNihETUExNF9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE0X0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlMTYoRE1BMTRfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTRfUEVSSVBIRVJBTF9NQVAoKSBiZmluX3JlYWQxNihETUExNF9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNF9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihETUExNF9QRVJJUEhFUkFMX01BUCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTRfQ1VSUl9YX0NPVU5UKCkgYmZpbl9yZWFkMTYoRE1BMTRfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE0X0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUExNF9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE0X0NVUlJfWV9DT1VOVCgpIGJmaW5fcmVhZDE2KERNQTE0X0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNF9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BMTRfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNV9ORVhUX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTE1X05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTVfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMTVfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTVfU1RBUlRfQUREUigpICAgYmZpbl9yZWFkUFRSKERNQTE1X1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTVfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMTVfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTVfQ09ORklHKCkgICAgICAgYmZpbl9yZWFkMTYoRE1BMTVfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE1X0NPTkZJRyh2YWwpICAgYmZpbl93cml0ZTE2KERNQTE1X0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTVfWF9DT1VOVCgpICAgICAgYmZpbl9yZWFkMTYoRE1BMTVfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNV9YX0NPVU5UKHZhbCkgIGJmaW5fd3JpdGUxNihETUExNV9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNV9YX01PRElGWSgpICAgICBiZmluX3JlYWQxNihETUExNV9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNV9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihETUExNV9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTVfWV9DT1VOVCgpICAgICAgYmZpbl9yZWFkMTYoRE1BMTVfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNV9ZX0NPVU5UKHZhbCkgIGJmaW5fd3JpdGUxNihETUExNV9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNV9ZX01PRElGWSgpICAgICBiZmluX3JlYWQxNihETUExNV9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNV9ZX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihETUExNV9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTVfQ1VSUl9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUExNV9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE1X0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTE1X0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE1X0NVUlJfQUREUigpICAgIGJmaW5fcmVhZFBUUihETUExNV9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTVfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUExNV9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE1X0lSUV9TVEFUVVMoKSAgIGJmaW5fcmVhZDE2KERNQTE1X0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTVfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihETUExNV9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNV9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KERNQTE1X1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE1X1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KERNQTE1X1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNV9DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihETUExNV9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTVfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTE1X0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTVfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoRE1BMTVfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE1X0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUExNV9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE2X05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BMTZfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNl9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUExNl9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNl9TVEFSVF9BRERSKCkgICBiZmluX3JlYWRQVFIoRE1BMTZfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNl9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUExNl9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNl9DT05GSUcoKSAgICAgICBiZmluX3JlYWQxNihETUExNl9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTZfQ09ORklHKHZhbCkgICBiZmluX3dyaXRlMTYoRE1BMTZfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNl9YX0NPVU5UKCkgICAgICBiZmluX3JlYWQxNihETUExNl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE2X1hfQ09VTlQodmFsKSAgYmZpbl93cml0ZTE2KERNQTE2X1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE2X1hfTU9ESUZZKCkgICAgIGJmaW5fcmVhZDE2KERNQTE2X1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE2X1hfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KERNQTE2X1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNl9ZX0NPVU5UKCkgICAgICBiZmluX3JlYWQxNihETUExNl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE2X1lfQ09VTlQodmFsKSAgYmZpbl93cml0ZTE2KERNQTE2X1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE2X1lfTU9ESUZZKCkgICAgIGJmaW5fcmVhZDE2KERNQTE2X1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE2X1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KERNQTE2X1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNl9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTE2X0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTZfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMTZfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTZfQ1VSUl9BRERSKCkgICAgYmZpbl9yZWFkUFRSKERNQTE2X0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNl9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTE2X0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTZfSVJRX1NUQVRVUygpICAgYmZpbl9yZWFkMTYoRE1BMTZfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNl9JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZTE2KERNQTE2X0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE2X1BFUklQSEVSQUxfTUFQKCkgYmZpbl9yZWFkMTYoRE1BMTZfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTZfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoRE1BMTZfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE2X0NVUlJfWF9DT1VOVCgpIGJmaW5fcmVhZDE2KERNQTE2X0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNl9DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BMTZfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNl9DVVJSX1lfQ09VTlQoKSBiZmluX3JlYWQxNihETUExNl9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTZfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTE2X0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTdfTkVYVF9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUExN19ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE3X05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTE3X05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE3X1NUQVJUX0FERFIoKSAgIGJmaW5fcmVhZFBUUihETUExN19TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE3X1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTE3X1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE3X0NPTkZJRygpICAgICAgIGJmaW5fcmVhZDE2KERNQTE3X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExN19DT05GSUcodmFsKSAgIGJmaW5fd3JpdGUxNihETUExN19DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE3X1hfQ09VTlQoKSAgICAgIGJmaW5fcmVhZDE2KERNQTE3X1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTdfWF9DT1VOVCh2YWwpICBiZmluX3dyaXRlMTYoRE1BMTdfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTdfWF9NT0RJRlkoKSAgICAgYmZpbl9yZWFkMTYoRE1BMTdfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTdfWF9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoRE1BMTdfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE3X1lfQ09VTlQoKSAgICAgIGJmaW5fcmVhZDE2KERNQTE3X1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTdfWV9DT1VOVCh2YWwpICBiZmluX3dyaXRlMTYoRE1BMTdfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTdfWV9NT0RJRlkoKSAgICAgYmZpbl9yZWFkMTYoRE1BMTdfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTdfWV9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoRE1BMTdfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE3X0NVUlJfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BMTdfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExN19DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUExN19DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExN19DVVJSX0FERFIoKSAgICBiZmluX3JlYWRQVFIoRE1BMTdfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE3X0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMTdfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExN19JUlFfU1RBVFVTKCkgICBiZmluX3JlYWQxNihETUExN19JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE3X0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlMTYoRE1BMTdfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTdfUEVSSVBIRVJBTF9NQVAoKSBiZmluX3JlYWQxNihETUExN19QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExN19QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihETUExN19QRVJJUEhFUkFMX01BUCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTdfQ1VSUl9YX0NPVU5UKCkgYmZpbl9yZWFkMTYoRE1BMTdfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE3X0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUExN19DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE3X0NVUlJfWV9DT1VOVCgpIGJmaW5fcmVhZDE2KERNQTE3X0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExN19DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BMTdfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExOF9ORVhUX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTE4X05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMThfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMThfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMThfU1RBUlRfQUREUigpICAgYmZpbl9yZWFkUFRSKERNQTE4X1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMThfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMThfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMThfQ09ORklHKCkgICAgICAgYmZpbl9yZWFkMTYoRE1BMThfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE4X0NPTkZJRyh2YWwpICAgYmZpbl93cml0ZTE2KERNQTE4X0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMThfWF9DT1VOVCgpICAgICAgYmZpbl9yZWFkMTYoRE1BMThfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExOF9YX0NPVU5UKHZhbCkgIGJmaW5fd3JpdGUxNihETUExOF9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExOF9YX01PRElGWSgpICAgICBiZmluX3JlYWQxNihETUExOF9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExOF9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihETUExOF9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMThfWV9DT1VOVCgpICAgICAgYmZpbl9yZWFkMTYoRE1BMThfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExOF9ZX0NPVU5UKHZhbCkgIGJmaW5fd3JpdGUxNihETUExOF9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExOF9ZX01PRElGWSgpICAgICBiZmluX3JlYWQxNihETUExOF9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExOF9ZX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihETUExOF9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMThfQ1VSUl9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUExOF9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE4X0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTE4X0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE4X0NVUlJfQUREUigpICAgIGJmaW5fcmVhZFBUUihETUExOF9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMThfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUExOF9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE4X0lSUV9TVEFUVVMoKSAgIGJmaW5fcmVhZDE2KERNQTE4X0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMThfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihETUExOF9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExOF9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KERNQTE4X1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE4X1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KERNQTE4X1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExOF9DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihETUExOF9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMThfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTE4X0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMThfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoRE1BMThfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE4X0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUExOF9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE5X05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BMTlfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExOV9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUExOV9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExOV9TVEFSVF9BRERSKCkgICBiZmluX3JlYWRQVFIoRE1BMTlfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExOV9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUExOV9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExOV9DT05GSUcoKSAgICAgICBiZmluX3JlYWQxNihETUExOV9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTlfQ09ORklHKHZhbCkgICBiZmluX3dyaXRlMTYoRE1BMTlfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExOV9YX0NPVU5UKCkgICAgICBiZmluX3JlYWQxNihETUExOV9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE5X1hfQ09VTlQodmFsKSAgYmZpbl93cml0ZTE2KERNQTE5X1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE5X1hfTU9ESUZZKCkgICAgIGJmaW5fcmVhZDE2KERNQTE5X1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE5X1hfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KERNQTE5X1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExOV9ZX0NPVU5UKCkgICAgICBiZmluX3JlYWQxNihETUExOV9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE5X1lfQ09VTlQodmFsKSAgYmZpbl93cml0ZTE2KERNQTE5X1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE5X1lfTU9ESUZZKCkgICAgIGJmaW5fcmVhZDE2KERNQTE5X1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE5X1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KERNQTE5X1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExOV9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTE5X0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTlfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMTlfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTlfQ1VSUl9BRERSKCkgICAgYmZpbl9yZWFkUFRSKERNQTE5X0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExOV9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTE5X0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTlfSVJRX1NUQVRVUygpICAgYmZpbl9yZWFkMTYoRE1BMTlfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExOV9JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZTE2KERNQTE5X0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE5X1BFUklQSEVSQUxfTUFQKCkgYmZpbl9yZWFkMTYoRE1BMTlfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTlfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoRE1BMTlfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE5X0NVUlJfWF9DT1VOVCgpIGJmaW5fcmVhZDE2KERNQTE5X0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExOV9DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BMTlfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExOV9DVVJSX1lfQ09VTlQoKSBiZmluX3JlYWQxNihETUExOV9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTlfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTE5X0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDBfTkVYVF9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihNRE1BMF9EMF9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QwX05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUEwX0QwX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX0QwX1NUQVJUX0FERFIoKSBiZmluX3JlYWRQVFIoTURNQTBfRDBfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMF9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMF9EMF9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMF9DT05GSUcoKSAgICBiZmluX3JlYWQxNihNRE1BMF9EMF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDBfQ09ORklHKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX0QwX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDBfWF9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQTBfRDBfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMF9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX0QwX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX0QwX1hfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUEwX0QwX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QwX1hfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX0QwX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMF9ZX0NPVU5UKCkgICBiZmluX3JlYWQxNihNRE1BMF9EMF9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QwX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTBfRDBfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDBfWV9NT0RJRlkoKSAgYmZpbl9yZWFkMTYoTURNQTBfRDBfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDBfWV9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoTURNQTBfRDBfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX0QwX0NVUlJfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQTBfRDBfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMF9DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMF9EMF9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMF9DVVJSX0FERFIoKSBiZmluX3JlYWRQVFIoTURNQTBfRDBfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QwX0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTBfRDBfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMF9JUlFfU1RBVFVTKCkgYmZpbl9yZWFkMTYoTURNQTBfRDBfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMF9JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX0QwX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX0QwX1BFUklQSEVSQUxfTUFQKCkgYmZpbl9yZWFkMTYoTURNQTBfRDBfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDBfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoTURNQTBfRDBfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX0QwX0NVUlJfWF9DT1VOVCgpIGJmaW5fcmVhZDE2KE1ETUEwX0QwX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMF9DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTBfRDBfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMF9DVVJSX1lfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BMF9EMF9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDBfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX0QwX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzBfTkVYVF9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihNRE1BMF9TMF9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MwX05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUEwX1MwX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX1MwX1NUQVJUX0FERFIoKSBiZmluX3JlYWRQVFIoTURNQTBfUzBfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMF9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMF9TMF9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMF9DT05GSUcoKSAgICBiZmluX3JlYWQxNihNRE1BMF9TMF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzBfQ09ORklHKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX1MwX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzBfWF9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQTBfUzBfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMF9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX1MwX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX1MwX1hfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUEwX1MwX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MwX1hfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX1MwX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMF9ZX0NPVU5UKCkgICBiZmluX3JlYWQxNihNRE1BMF9TMF9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MwX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTBfUzBfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzBfWV9NT0RJRlkoKSAgYmZpbl9yZWFkMTYoTURNQTBfUzBfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzBfWV9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoTURNQTBfUzBfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX1MwX0NVUlJfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQTBfUzBfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMF9DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMF9TMF9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMF9DVVJSX0FERFIoKSBiZmluX3JlYWRQVFIoTURNQTBfUzBfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MwX0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTBfUzBfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMF9JUlFfU1RBVFVTKCkgYmZpbl9yZWFkMTYoTURNQTBfUzBfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMF9JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX1MwX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX1MwX1BFUklQSEVSQUxfTUFQKCkgYmZpbl9yZWFkMTYoTURNQTBfUzBfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzBfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoTURNQTBfUzBfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX1MwX0NVUlJfWF9DT1VOVCgpIGJmaW5fcmVhZDE2KE1ETUEwX1MwX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMF9DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTBfUzBfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMF9DVVJSX1lfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BMF9TMF9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzBfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX1MwX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDFfTkVYVF9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihNRE1BMF9EMV9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QxX05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUEwX0QxX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX0QxX1NUQVJUX0FERFIoKSBiZmluX3JlYWRQVFIoTURNQTBfRDFfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMV9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMF9EMV9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMV9DT05GSUcoKSAgICBiZmluX3JlYWQxNihNRE1BMF9EMV9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDFfQ09ORklHKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX0QxX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDFfWF9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQTBfRDFfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMV9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX0QxX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX0QxX1hfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUEwX0QxX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QxX1hfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX0QxX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMV9ZX0NPVU5UKCkgICBiZmluX3JlYWQxNihNRE1BMF9EMV9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QxX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTBfRDFfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDFfWV9NT0RJRlkoKSAgYmZpbl9yZWFkMTYoTURNQTBfRDFfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDFfWV9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoTURNQTBfRDFfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX0QxX0NVUlJfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQTBfRDFfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMV9DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMF9EMV9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMV9DVVJSX0FERFIoKSBiZmluX3JlYWRQVFIoTURNQTBfRDFfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QxX0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTBfRDFfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMV9JUlFfU1RBVFVTKCkgYmZpbl9yZWFkMTYoTURNQTBfRDFfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMV9JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX0QxX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX0QxX1BFUklQSEVSQUxfTUFQKCkgYmZpbl9yZWFkMTYoTURNQTBfRDFfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDFfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoTURNQTBfRDFfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX0QxX0NVUlJfWF9DT1VOVCgpIGJmaW5fcmVhZDE2KE1ETUEwX0QxX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMV9DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTBfRDFfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMV9DVVJSX1lfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BMF9EMV9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDFfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX0QxX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzFfTkVYVF9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihNRE1BMF9TMV9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MxX05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUEwX1MxX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX1MxX1NUQVJUX0FERFIoKSBiZmluX3JlYWRQVFIoTURNQTBfUzFfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMV9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMF9TMV9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMV9DT05GSUcoKSAgICBiZmluX3JlYWQxNihNRE1BMF9TMV9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzFfQ09ORklHKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX1MxX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzFfWF9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQTBfUzFfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMV9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX1MxX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX1MxX1hfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUEwX1MxX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MxX1hfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX1MxX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMV9ZX0NPVU5UKCkgICBiZmluX3JlYWQxNihNRE1BMF9TMV9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MxX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTBfUzFfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzFfWV9NT0RJRlkoKSAgYmZpbl9yZWFkMTYoTURNQTBfUzFfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzFfWV9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoTURNQTBfUzFfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX1MxX0NVUlJfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQTBfUzFfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMV9DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMF9TMV9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMV9DVVJSX0FERFIoKSBiZmluX3JlYWRQVFIoTURNQTBfUzFfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MxX0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTBfUzFfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMV9JUlFfU1RBVFVTKCkgYmZpbl9yZWFkMTYoTURNQTBfUzFfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMV9JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX1MxX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX1MxX1BFUklQSEVSQUxfTUFQKCkgYmZpbl9yZWFkMTYoTURNQTBfUzFfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzFfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoTURNQTBfUzFfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX1MxX0NVUlJfWF9DT1VOVCgpIGJmaW5fcmVhZDE2KE1ETUEwX1MxX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMV9DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTBfUzFfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMV9DVVJSX1lfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BMF9TMV9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzFfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX1MxX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDBfTkVYVF9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihNRE1BMV9EMF9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QwX05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUExX0QwX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QwX1NUQVJUX0FERFIoKSBiZmluX3JlYWRQVFIoTURNQTFfRDBfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMF9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMV9EMF9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMF9DT05GSUcoKSAgICBiZmluX3JlYWQxNihNRE1BMV9EMF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDBfQ09ORklHKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QwX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDBfWF9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQTFfRDBfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMF9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QwX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QwX1hfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUExX0QwX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QwX1hfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QwX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMF9ZX0NPVU5UKCkgICBiZmluX3JlYWQxNihNRE1BMV9EMF9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QwX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfRDBfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDBfWV9NT0RJRlkoKSAgYmZpbl9yZWFkMTYoTURNQTFfRDBfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDBfWV9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfRDBfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QwX0NVUlJfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQTFfRDBfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMF9DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMV9EMF9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMF9DVVJSX0FERFIoKSBiZmluX3JlYWRQVFIoTURNQTFfRDBfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QwX0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTFfRDBfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMF9JUlFfU1RBVFVTKCkgYmZpbl9yZWFkMTYoTURNQTFfRDBfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMF9JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QwX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QwX1BFUklQSEVSQUxfTUFQKCkgYmZpbl9yZWFkMTYoTURNQTFfRDBfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDBfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfRDBfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QwX0NVUlJfWF9DT1VOVCgpIGJmaW5fcmVhZDE2KE1ETUExX0QwX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMF9DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfRDBfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMF9DVVJSX1lfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BMV9EMF9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDBfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QwX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzBfTkVYVF9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihNRE1BMV9TMF9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MwX05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUExX1MwX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MwX1NUQVJUX0FERFIoKSBiZmluX3JlYWRQVFIoTURNQTFfUzBfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMF9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMV9TMF9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMF9DT05GSUcoKSAgICBiZmluX3JlYWQxNihNRE1BMV9TMF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzBfQ09ORklHKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX1MwX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzBfWF9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQTFfUzBfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMF9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX1MwX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MwX1hfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUExX1MwX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MwX1hfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX1MwX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMF9ZX0NPVU5UKCkgICBiZmluX3JlYWQxNihNRE1BMV9TMF9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MwX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfUzBfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzBfWV9NT0RJRlkoKSAgYmZpbl9yZWFkMTYoTURNQTFfUzBfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzBfWV9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfUzBfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MwX0NVUlJfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQTFfUzBfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMF9DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMV9TMF9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMF9DVVJSX0FERFIoKSBiZmluX3JlYWRQVFIoTURNQTFfUzBfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MwX0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTFfUzBfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMF9JUlFfU1RBVFVTKCkgYmZpbl9yZWFkMTYoTURNQTFfUzBfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMF9JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX1MwX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MwX1BFUklQSEVSQUxfTUFQKCkgYmZpbl9yZWFkMTYoTURNQTFfUzBfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzBfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfUzBfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MwX0NVUlJfWF9DT1VOVCgpIGJmaW5fcmVhZDE2KE1ETUExX1MwX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMF9DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfUzBfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMF9DVVJSX1lfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BMV9TMF9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzBfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX1MwX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDFfTkVYVF9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihNRE1BMV9EMV9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QxX05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUExX0QxX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QxX1NUQVJUX0FERFIoKSBiZmluX3JlYWRQVFIoTURNQTFfRDFfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMV9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMV9EMV9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMV9DT05GSUcoKSAgICBiZmluX3JlYWQxNihNRE1BMV9EMV9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDFfQ09ORklHKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QxX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDFfWF9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQTFfRDFfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMV9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QxX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QxX1hfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUExX0QxX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QxX1hfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QxX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMV9ZX0NPVU5UKCkgICBiZmluX3JlYWQxNihNRE1BMV9EMV9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QxX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfRDFfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDFfWV9NT0RJRlkoKSAgYmZpbl9yZWFkMTYoTURNQTFfRDFfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDFfWV9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfRDFfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QxX0NVUlJfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQTFfRDFfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMV9DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMV9EMV9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMV9DVVJSX0FERFIoKSBiZmluX3JlYWRQVFIoTURNQTFfRDFfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QxX0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTFfRDFfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMV9JUlFfU1RBVFVTKCkgYmZpbl9yZWFkMTYoTURNQTFfRDFfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMV9JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QxX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QxX1BFUklQSEVSQUxfTUFQKCkgYmZpbl9yZWFkMTYoTURNQTFfRDFfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDFfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfRDFfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QxX0NVUlJfWF9DT1VOVCgpIGJmaW5fcmVhZDE2KE1ETUExX0QxX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMV9DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfRDFfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMV9DVVJSX1lfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BMV9EMV9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDFfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QxX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzFfTkVYVF9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihNRE1BMV9TMV9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MxX05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUExX1MxX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MxX1NUQVJUX0FERFIoKSBiZmluX3JlYWRQVFIoTURNQTFfUzFfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMV9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMV9TMV9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMV9DT05GSUcoKSAgICBiZmluX3JlYWQxNihNRE1BMV9TMV9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzFfQ09ORklHKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX1MxX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzFfWF9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQTFfUzFfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMV9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX1MxX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MxX1hfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUExX1MxX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MxX1hfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX1MxX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMV9ZX0NPVU5UKCkgICBiZmluX3JlYWQxNihNRE1BMV9TMV9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MxX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfUzFfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzFfWV9NT0RJRlkoKSAgYmZpbl9yZWFkMTYoTURNQTFfUzFfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzFfWV9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfUzFfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MxX0NVUlJfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQTFfUzFfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMV9DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMV9TMV9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMV9DVVJSX0FERFIoKSBiZmluX3JlYWRQVFIoTURNQTFfUzFfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MxX0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTFfUzFfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMV9JUlFfU1RBVFVTKCkgYmZpbl9yZWFkMTYoTURNQTFfUzFfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMV9JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX1MxX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MxX1BFUklQSEVSQUxfTUFQKCkgYmZpbl9yZWFkMTYoTURNQTFfUzFfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzFfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfUzFfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MxX0NVUlJfWF9DT1VOVCgpIGJmaW5fcmVhZDE2KE1ETUExX1MxX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMV9DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfUzFfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMV9DVVJSX1lfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BMV9TMV9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzFfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX1MxX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUFBJX0NPTlRST0woKSAgICAgICAgYmZpbl9yZWFkMTYoUFBJX0NPTlRST0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfUFBJX0NPTlRST0wodmFsKSAgICBiZmluX3dyaXRlMTYoUFBJX0NPTlRST0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BQSV9TVEFUVVMoKSAgICAgICAgIGJmaW5fcmVhZDE2KFBQSV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfUFBJX1NUQVRVUyh2YWwpICAgICBiZmluX3dyaXRlMTYoUFBJX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUFBJX0RFTEFZKCkgICAgICAgICAgYmZpbl9yZWFkMTYoUFBJX0RFTEFZKQorI2RlZmluZSBiZmluX3dyaXRlX1BQSV9ERUxBWSh2YWwpICAgICAgYmZpbl93cml0ZTE2KFBQSV9ERUxBWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUFBJX0NPVU5UKCkgICAgICAgICAgYmZpbl9yZWFkMTYoUFBJX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX1BQSV9DT1VOVCh2YWwpICAgICAgYmZpbl93cml0ZTE2KFBQSV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUFBJX0ZSQU1FKCkgICAgICAgICAgYmZpbl9yZWFkMTYoUFBJX0ZSQU1FKQorI2RlZmluZSBiZmluX3dyaXRlX1BQSV9GUkFNRSh2YWwpICAgICAgYmZpbl93cml0ZTE2KFBQSV9GUkFNRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJMF9DTEtESVYoKSAgICAgICAgYmZpbl9yZWFkMTYoVFdJMF9DTEtESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMF9DTEtESVYodmFsKSAgICBiZmluX3dyaXRlMTYoVFdJMF9DTEtESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSTBfQ09OVFJPTCgpICAgICAgIGJmaW5fcmVhZDE2KFRXSTBfQ09OVFJPTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0kwX0NPTlRST0wodmFsKSAgIGJmaW5fd3JpdGUxNihUV0kwX0NPTlRST0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSTBfU0xBVkVfQ1RSTCgpICAgIGJmaW5fcmVhZDE2KFRXSTBfU0xBVkVfQ1RSTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0kwX1NMQVZFX0NUUkwodmFsKSBiZmluX3dyaXRlMTYoVFdJMF9TTEFWRV9DVFJMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kwX1NMQVZFX1NUQVQoKSAgICBiZmluX3JlYWQxNihUV0kwX1NMQVZFX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMF9TTEFWRV9TVEFUKHZhbCkgYmZpbl93cml0ZTE2KFRXSTBfU0xBVkVfU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJMF9TTEFWRV9BRERSKCkgICAgYmZpbl9yZWFkMTYoVFdJMF9TTEFWRV9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX1RXSTBfU0xBVkVfQUREUih2YWwpIGJmaW5fd3JpdGUxNihUV0kwX1NMQVZFX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSTBfTUFTVEVSX0NUTCgpICAgIGJmaW5fcmVhZDE2KFRXSTBfTUFTVEVSX0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0kwX01BU1RFUl9DVEwodmFsKSBiZmluX3dyaXRlMTYoVFdJMF9NQVNURVJfQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kwX01BU1RFUl9TVEFUKCkgICBiZmluX3JlYWQxNihUV0kwX01BU1RFUl9TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX1RXSTBfTUFTVEVSX1NUQVQodmFsKSBiZmluX3dyaXRlMTYoVFdJMF9NQVNURVJfU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJMF9NQVNURVJfQUREUigpICAgYmZpbl9yZWFkMTYoVFdJMF9NQVNURVJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0kwX01BU1RFUl9BRERSKHZhbCkgYmZpbl93cml0ZTE2KFRXSTBfTUFTVEVSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSTBfSU5UX1NUQVQoKSAgICAgIGJmaW5fcmVhZDE2KFRXSTBfSU5UX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMF9JTlRfU1RBVCh2YWwpICBiZmluX3dyaXRlMTYoVFdJMF9JTlRfU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJMF9JTlRfTUFTSygpICAgICAgYmZpbl9yZWFkMTYoVFdJMF9JTlRfTUFTSykKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0kwX0lOVF9NQVNLKHZhbCkgIGJmaW5fd3JpdGUxNihUV0kwX0lOVF9NQVNLLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kwX0ZJRk9fQ1RMKCkgICAgICBiZmluX3JlYWQxNihUV0kwX0ZJRk9fQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX1RXSTBfRklGT19DVEwodmFsKSAgYmZpbl93cml0ZTE2KFRXSTBfRklGT19DVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSTBfRklGT19TVEFUKCkgICAgIGJmaW5fcmVhZDE2KFRXSTBfRklGT19TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX1RXSTBfRklGT19TVEFUKHZhbCkgYmZpbl93cml0ZTE2KFRXSTBfRklGT19TVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kwX1hNVF9EQVRBOCgpICAgICBiZmluX3JlYWQxNihUV0kwX1hNVF9EQVRBOCkKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0kwX1hNVF9EQVRBOCh2YWwpIGJmaW5fd3JpdGUxNihUV0kwX1hNVF9EQVRBOCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJMF9YTVRfREFUQTE2KCkgICAgYmZpbl9yZWFkMTYoVFdJMF9YTVRfREFUQTE2KQorI2RlZmluZSBiZmluX3dyaXRlX1RXSTBfWE1UX0RBVEExNih2YWwpIGJmaW5fd3JpdGUxNihUV0kwX1hNVF9EQVRBMTYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSTBfUkNWX0RBVEE4KCkgICAgIGJmaW5fcmVhZDE2KFRXSTBfUkNWX0RBVEE4KQorI2RlZmluZSBiZmluX3dyaXRlX1RXSTBfUkNWX0RBVEE4KHZhbCkgYmZpbl93cml0ZTE2KFRXSTBfUkNWX0RBVEE4LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kwX1JDVl9EQVRBMTYoKSAgICBiZmluX3JlYWQxNihUV0kwX1JDVl9EQVRBMTYpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMF9SQ1ZfREFUQTE2KHZhbCkgYmZpbl93cml0ZTE2KFRXSTBfUkNWX0RBVEExNiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJMV9DTEtESVYoKSAgICAgICAgYmZpbl9yZWFkMTYoVFdJMV9DTEtESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMV9DTEtESVYodmFsKSAgICBiZmluX3dyaXRlMTYoVFdJMV9DTEtESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSTFfQ09OVFJPTCgpICAgICAgIGJmaW5fcmVhZDE2KFRXSTFfQ09OVFJPTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0kxX0NPTlRST0wodmFsKSAgIGJmaW5fd3JpdGUxNihUV0kxX0NPTlRST0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSTFfU0xBVkVfQ1RSTCgpICAgIGJmaW5fcmVhZDE2KFRXSTFfU0xBVkVfQ1RSTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0kxX1NMQVZFX0NUUkwodmFsKSBiZmluX3dyaXRlMTYoVFdJMV9TTEFWRV9DVFJMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kxX1NMQVZFX1NUQVQoKSAgICBiZmluX3JlYWQxNihUV0kxX1NMQVZFX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMV9TTEFWRV9TVEFUKHZhbCkgYmZpbl93cml0ZTE2KFRXSTFfU0xBVkVfU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJMV9TTEFWRV9BRERSKCkgICAgYmZpbl9yZWFkMTYoVFdJMV9TTEFWRV9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX1RXSTFfU0xBVkVfQUREUih2YWwpIGJmaW5fd3JpdGUxNihUV0kxX1NMQVZFX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSTFfTUFTVEVSX0NUTCgpICAgIGJmaW5fcmVhZDE2KFRXSTFfTUFTVEVSX0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0kxX01BU1RFUl9DVEwodmFsKSBiZmluX3dyaXRlMTYoVFdJMV9NQVNURVJfQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kxX01BU1RFUl9TVEFUKCkgICBiZmluX3JlYWQxNihUV0kxX01BU1RFUl9TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX1RXSTFfTUFTVEVSX1NUQVQodmFsKSBiZmluX3dyaXRlMTYoVFdJMV9NQVNURVJfU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJMV9NQVNURVJfQUREUigpICAgYmZpbl9yZWFkMTYoVFdJMV9NQVNURVJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0kxX01BU1RFUl9BRERSKHZhbCkgYmZpbl93cml0ZTE2KFRXSTFfTUFTVEVSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSTFfSU5UX1NUQVQoKSAgICAgIGJmaW5fcmVhZDE2KFRXSTFfSU5UX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMV9JTlRfU1RBVCh2YWwpICBiZmluX3dyaXRlMTYoVFdJMV9JTlRfU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJMV9JTlRfTUFTSygpICAgICAgYmZpbl9yZWFkMTYoVFdJMV9JTlRfTUFTSykKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0kxX0lOVF9NQVNLKHZhbCkgIGJmaW5fd3JpdGUxNihUV0kxX0lOVF9NQVNLLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kxX0ZJRk9fQ1RMKCkgICAgICBiZmluX3JlYWQxNihUV0kxX0ZJRk9fQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX1RXSTFfRklGT19DVEwodmFsKSAgYmZpbl93cml0ZTE2KFRXSTFfRklGT19DVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSTFfRklGT19TVEFUKCkgICAgIGJmaW5fcmVhZDE2KFRXSTFfRklGT19TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX1RXSTFfRklGT19TVEFUKHZhbCkgYmZpbl93cml0ZTE2KFRXSTFfRklGT19TVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kxX1hNVF9EQVRBOCgpICAgICBiZmluX3JlYWQxNihUV0kxX1hNVF9EQVRBOCkKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0kxX1hNVF9EQVRBOCh2YWwpIGJmaW5fd3JpdGUxNihUV0kxX1hNVF9EQVRBOCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJMV9YTVRfREFUQTE2KCkgICAgYmZpbl9yZWFkMTYoVFdJMV9YTVRfREFUQTE2KQorI2RlZmluZSBiZmluX3dyaXRlX1RXSTFfWE1UX0RBVEExNih2YWwpIGJmaW5fd3JpdGUxNihUV0kxX1hNVF9EQVRBMTYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSTFfUkNWX0RBVEE4KCkgICAgIGJmaW5fcmVhZDE2KFRXSTFfUkNWX0RBVEE4KQorI2RlZmluZSBiZmluX3dyaXRlX1RXSTFfUkNWX0RBVEE4KHZhbCkgYmZpbl93cml0ZTE2KFRXSTFfUkNWX0RBVEE4LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kxX1JDVl9EQVRBMTYoKSAgICBiZmluX3JlYWQxNihUV0kxX1JDVl9EQVRBMTYpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMV9SQ1ZfREFUQTE2KHZhbCkgYmZpbl93cml0ZTE2KFRXSTFfUkNWX0RBVEExNiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01DMSgpICAgICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX01DMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUMxKHZhbCkgICAgICAgIGJmaW5fd3JpdGUxNihDQU5fTUMxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUQxKCkgICAgICAgICAgICBiZmluX3JlYWQxNihDQU5fTUQxKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NRDEodmFsKSAgICAgICAgYmZpbl93cml0ZTE2KENBTl9NRDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9UUlMxKCkgICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9UUlMxKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9UUlMxKHZhbCkgICAgICAgYmZpbl93cml0ZTE2KENBTl9UUlMxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fVFJSMSgpICAgICAgICAgICBiZmluX3JlYWQxNihDQU5fVFJSMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fVFJSMSh2YWwpICAgICAgIGJmaW5fd3JpdGUxNihDQU5fVFJSMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX1RBMSgpICAgICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX1RBMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fVEExKHZhbCkgICAgICAgIGJmaW5fd3JpdGUxNihDQU5fVEExLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQUExKCkgICAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQUExKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9BQTEodmFsKSAgICAgICAgYmZpbl93cml0ZTE2KENBTl9BQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9STVAxKCkgICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9STVAxKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9STVAxKHZhbCkgICAgICAgYmZpbl93cml0ZTE2KENBTl9STVAxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fUk1MMSgpICAgICAgICAgICBiZmluX3JlYWQxNihDQU5fUk1MMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fUk1MMSh2YWwpICAgICAgIGJmaW5fd3JpdGUxNihDQU5fUk1MMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CVElGMSgpICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX01CVElGMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUJUSUYxKHZhbCkgICAgIGJmaW5fd3JpdGUxNihDQU5fTUJUSUYxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUJSSUYxKCkgICAgICAgICBiZmluX3JlYWQxNihDQU5fTUJSSUYxKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQlJJRjEodmFsKSAgICAgYmZpbl93cml0ZTE2KENBTl9NQlJJRjEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQklNMSgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQklNMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUJJTTEodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fTUJJTTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9SRkgxKCkgICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9SRkgxKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9SRkgxKHZhbCkgICAgICAgYmZpbl93cml0ZTE2KENBTl9SRkgxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fT1BTUzEoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fT1BTUzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX09QU1MxKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX09QU1MxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUMyKCkgICAgICAgICAgICBiZmluX3JlYWQxNihDQU5fTUMyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQzIodmFsKSAgICAgICAgYmZpbl93cml0ZTE2KENBTl9NQzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NRDIoKSAgICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9NRDIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01EMih2YWwpICAgICAgICBiZmluX3dyaXRlMTYoQ0FOX01EMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX1RSUzIoKSAgICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX1RSUzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX1RSUzIodmFsKSAgICAgICBiZmluX3dyaXRlMTYoQ0FOX1RSUzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9UUlIyKCkgICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9UUlIyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9UUlIyKHZhbCkgICAgICAgYmZpbl93cml0ZTE2KENBTl9UUlIyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fVEEyKCkgICAgICAgICAgICBiZmluX3JlYWQxNihDQU5fVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9UQTIodmFsKSAgICAgICAgYmZpbl93cml0ZTE2KENBTl9UQTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BQTIoKSAgICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BQTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FBMih2YWwpICAgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FBMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX1JNUDIoKSAgICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX1JNUDIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX1JNUDIodmFsKSAgICAgICBiZmluX3dyaXRlMTYoQ0FOX1JNUDIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9STUwyKCkgICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9STUwyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9STUwyKHZhbCkgICAgICAgYmZpbl93cml0ZTE2KENBTl9STUwyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUJUSUYyKCkgICAgICAgICBiZmluX3JlYWQxNihDQU5fTUJUSUYyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQlRJRjIodmFsKSAgICAgYmZpbl93cml0ZTE2KENBTl9NQlRJRjIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQlJJRjIoKSAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQlJJRjIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CUklGMih2YWwpICAgICBiZmluX3dyaXRlMTYoQ0FOX01CUklGMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CSU0yKCkgICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX01CSU0yKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQklNMih2YWwpICAgICAgYmZpbl93cml0ZTE2KENBTl9NQklNMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX1JGSDIoKSAgICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX1JGSDIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX1JGSDIodmFsKSAgICAgICBiZmluX3dyaXRlMTYoQ0FOX1JGSDIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9PUFNTMigpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9PUFNTMikKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fT1BTUzIodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fT1BTUzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9DTE9DSygpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9DTE9DSykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQ0xPQ0sodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQ0xPQ0ssIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9USU1JTkcoKSAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9USU1JTkcpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX1RJTUlORyh2YWwpICAgICBiZmluX3dyaXRlMTYoQ0FOX1RJTUlORywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX0RFQlVHKCkgICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX0RFQlVHKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9ERUJVRyh2YWwpICAgICAgYmZpbl93cml0ZTE2KENBTl9ERUJVRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX1NUQVRVUygpICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fU1RBVFVTKHZhbCkgICAgIGJmaW5fd3JpdGUxNihDQU5fU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQ0VDKCkgICAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQ0VDKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9DRUModmFsKSAgICAgICAgYmZpbl93cml0ZTE2KENBTl9DRUMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9HSVMoKSAgICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9HSVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0dJUyh2YWwpICAgICAgICBiZmluX3dyaXRlMTYoQ0FOX0dJUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX0dJTSgpICAgICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX0dJTSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fR0lNKHZhbCkgICAgICAgIGJmaW5fd3JpdGUxNihDQU5fR0lNLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fR0lGKCkgICAgICAgICAgICBiZmluX3JlYWQxNihDQU5fR0lGKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9HSUYodmFsKSAgICAgICAgYmZpbl93cml0ZTE2KENBTl9HSUYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9DT05UUk9MKCkgICAgICAgIGJmaW5fcmVhZDE2KENBTl9DT05UUk9MKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9DT05UUk9MKHZhbCkgICAgYmZpbl93cml0ZTE2KENBTl9DT05UUk9MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fSU5UUigpICAgICAgICAgICBiZmluX3JlYWQxNihDQU5fSU5UUikKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fSU5UUih2YWwpICAgICAgIGJmaW5fd3JpdGUxNihDQU5fSU5UUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX1ZFUlNJT04oKSAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX1ZFUlNJT04pCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX1ZFUlNJT04odmFsKSAgICBiZmluX3dyaXRlMTYoQ0FOX1ZFUlNJT04sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQlREKCkgICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQlREKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQlREKHZhbCkgICAgICAgYmZpbl93cml0ZTE2KENBTl9NQlRELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fRVdSKCkgICAgICAgICAgICBiZmluX3JlYWQxNihDQU5fRVdSKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9FV1IodmFsKSAgICAgICAgYmZpbl93cml0ZTE2KENBTl9FV1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9FU1IoKSAgICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9FU1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0VTUih2YWwpICAgICAgICBiZmluX3dyaXRlMTYoQ0FOX0VTUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX1VDUkVHKCkgICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX1VDUkVHKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9VQ1JFRyh2YWwpICAgICAgYmZpbl93cml0ZTE2KENBTl9VQ1JFRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX1VDQ05UKCkgICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX1VDQ05UKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9VQ0NOVCh2YWwpICAgICAgYmZpbl93cml0ZTE2KENBTl9VQ0NOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX1VDUkMoKSAgICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX1VDUkMpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX1VDUkModmFsKSAgICAgICBiZmluX3dyaXRlMTYoQ0FOX1VDUkMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9VQ0NORigpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9VQ0NORikKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fVUNDTkYodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fVUNDTkYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9WRVJTSU9OMigpICAgICAgIGJmaW5fcmVhZDE2KENBTl9WRVJTSU9OMikKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fVkVSU0lPTjIodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fVkVSU0lPTjIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTAwTCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTAwTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0wMEwodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0wMEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTAwSCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTAwSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0wMEgodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0wMEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTAxTCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTAxTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0wMUwodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0wMUwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTAxSCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTAxSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0wMUgodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0wMUgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTAyTCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTAyTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0wMkwodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0wMkwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTAySCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTAySCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0wMkgodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0wMkgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTAzTCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTAzTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0wM0wodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0wM0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTAzSCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTAzSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0wM0godmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0wM0gsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTA0TCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTA0TCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0wNEwodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0wNEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTA0SCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTA0SCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0wNEgodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0wNEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTA1TCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTA1TCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0wNUwodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0wNUwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTA1SCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTA1SCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0wNUgodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0wNUgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTA2TCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTA2TCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0wNkwodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0wNkwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTA2SCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTA2SCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0wNkgodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0wNkgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTA3TCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTA3TCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0wN0wodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0wN0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTA3SCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTA3SCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0wN0godmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0wN0gsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTA4TCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTA4TCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0wOEwodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0wOEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTA4SCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTA4SCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0wOEgodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0wOEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTA5TCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTA5TCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0wOUwodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0wOUwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTA5SCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTA5SCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0wOUgodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0wOUgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTEwTCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTEwTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0xMEwodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0xMEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTEwSCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTEwSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0xMEgodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0xMEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTExTCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTExTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0xMUwodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0xMUwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTExSCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTExSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0xMUgodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0xMUgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTEyTCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTEyTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0xMkwodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0xMkwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTEySCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTEySCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0xMkgodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0xMkgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTEzTCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTEzTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0xM0wodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0xM0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTEzSCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTEzSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0xM0godmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0xM0gsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTE0TCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTE0TCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0xNEwodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0xNEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTE0SCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTE0SCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0xNEgodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0xNEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTE1TCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTE1TCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0xNUwodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0xNUwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTE1SCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTE1SCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0xNUgodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0xNUgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTE2TCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTE2TCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0xNkwodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0xNkwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTE2SCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTE2SCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0xNkgodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0xNkgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTE3TCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTE3TCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0xN0wodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0xN0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTE3SCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTE3SCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0xN0godmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0xN0gsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTE4TCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTE4TCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0xOEwodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0xOEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTE4SCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTE4SCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0xOEgodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0xOEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTE5TCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTE5TCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0xOUwodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0xOUwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTE5SCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTE5SCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0xOUgodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0xOUgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTIwTCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTIwTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0yMEwodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0yMEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTIwSCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTIwSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0yMEgodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0yMEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTIxTCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTIxTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0yMUwodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0yMUwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTIxSCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTIxSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0yMUgodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0yMUgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTIyTCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTIyTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0yMkwodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0yMkwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTIySCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTIySCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0yMkgodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0yMkgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTIzTCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTIzTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0yM0wodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0yM0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTIzSCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTIzSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0yM0godmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0yM0gsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTI0TCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTI0TCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0yNEwodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0yNEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTI0SCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTI0SCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0yNEgodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0yNEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTI1TCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTI1TCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0yNUwodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0yNUwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTI1SCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTI1SCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0yNUgodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0yNUgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTI2TCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTI2TCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0yNkwodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0yNkwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTI2SCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTI2SCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0yNkgodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0yNkgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTI3TCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTI3TCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0yN0wodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0yN0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTI3SCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTI3SCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0yN0godmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0yN0gsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTI4TCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTI4TCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0yOEwodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0yOEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTI4SCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTI4SCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0yOEgodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0yOEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTI5TCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTI5TCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0yOUwodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0yOUwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTI5SCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTI5SCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0yOUgodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0yOUgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTMwTCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTMwTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0zMEwodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0zMEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTMwSCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTMwSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0zMEgodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0zMEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTMxTCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTMxTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0zMUwodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0zMUwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9BTTMxSCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9BTTMxSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQU0zMUgodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fQU0zMUgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjAwX0RBVEEwKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjAwX0RBVEEwKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjAwX0RBVEEwKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjAwX0RBVEEwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwMF9EQVRBMSgpICAgICBiZmluX3JlYWQxNihDQU5fTUIwMF9EQVRBMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwMF9EQVRBMSh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwMF9EQVRBMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDBfREFUQTIoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDBfREFUQTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDBfREFUQTIodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDBfREFUQTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjAwX0RBVEEzKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjAwX0RBVEEzKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjAwX0RBVEEzKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjAwX0RBVEEzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwMF9MRU5HVEgoKSAgICBiZmluX3JlYWQxNihDQU5fTUIwMF9MRU5HVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDBfTEVOR1RIKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjAwX0xFTkdUSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDBfVElNRVNUQU1QKCkgYmZpbl9yZWFkMTYoQ0FOX01CMDBfVElNRVNUQU1QKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjAwX1RJTUVTVEFNUCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwMF9USU1FU1RBTVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjAwX0lEMCgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjAwX0lEMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwMF9JRDAodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIwMF9JRDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjAwX0lEMSgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjAwX0lEMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwMF9JRDEodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIwMF9JRDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjAxX0RBVEEwKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjAxX0RBVEEwKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjAxX0RBVEEwKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjAxX0RBVEEwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwMV9EQVRBMSgpICAgICBiZmluX3JlYWQxNihDQU5fTUIwMV9EQVRBMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwMV9EQVRBMSh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwMV9EQVRBMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDFfREFUQTIoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDFfREFUQTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDFfREFUQTIodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDFfREFUQTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjAxX0RBVEEzKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjAxX0RBVEEzKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjAxX0RBVEEzKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjAxX0RBVEEzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwMV9MRU5HVEgoKSAgICBiZmluX3JlYWQxNihDQU5fTUIwMV9MRU5HVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDFfTEVOR1RIKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjAxX0xFTkdUSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDFfVElNRVNUQU1QKCkgYmZpbl9yZWFkMTYoQ0FOX01CMDFfVElNRVNUQU1QKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjAxX1RJTUVTVEFNUCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwMV9USU1FU1RBTVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjAxX0lEMCgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjAxX0lEMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwMV9JRDAodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIwMV9JRDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjAxX0lEMSgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjAxX0lEMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwMV9JRDEodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIwMV9JRDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjAyX0RBVEEwKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjAyX0RBVEEwKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjAyX0RBVEEwKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjAyX0RBVEEwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwMl9EQVRBMSgpICAgICBiZmluX3JlYWQxNihDQU5fTUIwMl9EQVRBMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwMl9EQVRBMSh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwMl9EQVRBMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDJfREFUQTIoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDJfREFUQTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDJfREFUQTIodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDJfREFUQTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjAyX0RBVEEzKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjAyX0RBVEEzKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjAyX0RBVEEzKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjAyX0RBVEEzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwMl9MRU5HVEgoKSAgICBiZmluX3JlYWQxNihDQU5fTUIwMl9MRU5HVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDJfTEVOR1RIKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjAyX0xFTkdUSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDJfVElNRVNUQU1QKCkgYmZpbl9yZWFkMTYoQ0FOX01CMDJfVElNRVNUQU1QKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjAyX1RJTUVTVEFNUCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwMl9USU1FU1RBTVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjAyX0lEMCgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjAyX0lEMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwMl9JRDAodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIwMl9JRDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjAyX0lEMSgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjAyX0lEMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwMl9JRDEodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIwMl9JRDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjAzX0RBVEEwKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjAzX0RBVEEwKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjAzX0RBVEEwKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjAzX0RBVEEwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwM19EQVRBMSgpICAgICBiZmluX3JlYWQxNihDQU5fTUIwM19EQVRBMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwM19EQVRBMSh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwM19EQVRBMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDNfREFUQTIoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDNfREFUQTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDNfREFUQTIodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDNfREFUQTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjAzX0RBVEEzKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjAzX0RBVEEzKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjAzX0RBVEEzKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjAzX0RBVEEzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwM19MRU5HVEgoKSAgICBiZmluX3JlYWQxNihDQU5fTUIwM19MRU5HVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDNfTEVOR1RIKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjAzX0xFTkdUSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDNfVElNRVNUQU1QKCkgYmZpbl9yZWFkMTYoQ0FOX01CMDNfVElNRVNUQU1QKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjAzX1RJTUVTVEFNUCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwM19USU1FU1RBTVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjAzX0lEMCgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjAzX0lEMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwM19JRDAodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIwM19JRDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjAzX0lEMSgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjAzX0lEMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwM19JRDEodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIwM19JRDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA0X0RBVEEwKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjA0X0RBVEEwKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA0X0RBVEEwKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjA0X0RBVEEwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwNF9EQVRBMSgpICAgICBiZmluX3JlYWQxNihDQU5fTUIwNF9EQVRBMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwNF9EQVRBMSh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwNF9EQVRBMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDRfREFUQTIoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDRfREFUQTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDRfREFUQTIodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDRfREFUQTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA0X0RBVEEzKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjA0X0RBVEEzKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA0X0RBVEEzKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjA0X0RBVEEzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwNF9MRU5HVEgoKSAgICBiZmluX3JlYWQxNihDQU5fTUIwNF9MRU5HVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDRfTEVOR1RIKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjA0X0xFTkdUSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDRfVElNRVNUQU1QKCkgYmZpbl9yZWFkMTYoQ0FOX01CMDRfVElNRVNUQU1QKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA0X1RJTUVTVEFNUCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwNF9USU1FU1RBTVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA0X0lEMCgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjA0X0lEMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwNF9JRDAodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIwNF9JRDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA0X0lEMSgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjA0X0lEMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwNF9JRDEodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIwNF9JRDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA1X0RBVEEwKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjA1X0RBVEEwKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA1X0RBVEEwKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjA1X0RBVEEwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwNV9EQVRBMSgpICAgICBiZmluX3JlYWQxNihDQU5fTUIwNV9EQVRBMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwNV9EQVRBMSh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwNV9EQVRBMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDVfREFUQTIoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDVfREFUQTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDVfREFUQTIodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDVfREFUQTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA1X0RBVEEzKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjA1X0RBVEEzKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA1X0RBVEEzKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjA1X0RBVEEzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwNV9MRU5HVEgoKSAgICBiZmluX3JlYWQxNihDQU5fTUIwNV9MRU5HVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDVfTEVOR1RIKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjA1X0xFTkdUSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDVfVElNRVNUQU1QKCkgYmZpbl9yZWFkMTYoQ0FOX01CMDVfVElNRVNUQU1QKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA1X1RJTUVTVEFNUCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwNV9USU1FU1RBTVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA1X0lEMCgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjA1X0lEMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwNV9JRDAodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIwNV9JRDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA1X0lEMSgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjA1X0lEMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwNV9JRDEodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIwNV9JRDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA2X0RBVEEwKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjA2X0RBVEEwKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA2X0RBVEEwKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjA2X0RBVEEwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwNl9EQVRBMSgpICAgICBiZmluX3JlYWQxNihDQU5fTUIwNl9EQVRBMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwNl9EQVRBMSh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwNl9EQVRBMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDZfREFUQTIoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDZfREFUQTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDZfREFUQTIodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDZfREFUQTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA2X0RBVEEzKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjA2X0RBVEEzKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA2X0RBVEEzKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjA2X0RBVEEzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwNl9MRU5HVEgoKSAgICBiZmluX3JlYWQxNihDQU5fTUIwNl9MRU5HVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDZfTEVOR1RIKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjA2X0xFTkdUSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDZfVElNRVNUQU1QKCkgYmZpbl9yZWFkMTYoQ0FOX01CMDZfVElNRVNUQU1QKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA2X1RJTUVTVEFNUCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwNl9USU1FU1RBTVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA2X0lEMCgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjA2X0lEMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwNl9JRDAodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIwNl9JRDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA2X0lEMSgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjA2X0lEMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwNl9JRDEodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIwNl9JRDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA3X0RBVEEwKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjA3X0RBVEEwKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA3X0RBVEEwKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjA3X0RBVEEwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwN19EQVRBMSgpICAgICBiZmluX3JlYWQxNihDQU5fTUIwN19EQVRBMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwN19EQVRBMSh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwN19EQVRBMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDdfREFUQTIoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDdfREFUQTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDdfREFUQTIodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDdfREFUQTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA3X0RBVEEzKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjA3X0RBVEEzKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA3X0RBVEEzKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjA3X0RBVEEzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwN19MRU5HVEgoKSAgICBiZmluX3JlYWQxNihDQU5fTUIwN19MRU5HVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDdfTEVOR1RIKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjA3X0xFTkdUSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDdfVElNRVNUQU1QKCkgYmZpbl9yZWFkMTYoQ0FOX01CMDdfVElNRVNUQU1QKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA3X1RJTUVTVEFNUCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwN19USU1FU1RBTVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA3X0lEMCgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjA3X0lEMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwN19JRDAodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIwN19JRDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA3X0lEMSgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjA3X0lEMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwN19JRDEodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIwN19JRDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA4X0RBVEEwKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjA4X0RBVEEwKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA4X0RBVEEwKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjA4X0RBVEEwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwOF9EQVRBMSgpICAgICBiZmluX3JlYWQxNihDQU5fTUIwOF9EQVRBMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwOF9EQVRBMSh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwOF9EQVRBMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDhfREFUQTIoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDhfREFUQTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDhfREFUQTIodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDhfREFUQTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA4X0RBVEEzKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjA4X0RBVEEzKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA4X0RBVEEzKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjA4X0RBVEEzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwOF9MRU5HVEgoKSAgICBiZmluX3JlYWQxNihDQU5fTUIwOF9MRU5HVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDhfTEVOR1RIKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjA4X0xFTkdUSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDhfVElNRVNUQU1QKCkgYmZpbl9yZWFkMTYoQ0FOX01CMDhfVElNRVNUQU1QKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA4X1RJTUVTVEFNUCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwOF9USU1FU1RBTVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA4X0lEMCgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjA4X0lEMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwOF9JRDAodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIwOF9JRDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA4X0lEMSgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjA4X0lEMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwOF9JRDEodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIwOF9JRDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA5X0RBVEEwKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjA5X0RBVEEwKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA5X0RBVEEwKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjA5X0RBVEEwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwOV9EQVRBMSgpICAgICBiZmluX3JlYWQxNihDQU5fTUIwOV9EQVRBMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwOV9EQVRBMSh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwOV9EQVRBMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDlfREFUQTIoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDlfREFUQTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDlfREFUQTIodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDlfREFUQTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA5X0RBVEEzKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjA5X0RBVEEzKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA5X0RBVEEzKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjA5X0RBVEEzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwOV9MRU5HVEgoKSAgICBiZmluX3JlYWQxNihDQU5fTUIwOV9MRU5HVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDlfTEVOR1RIKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjA5X0xFTkdUSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDlfVElNRVNUQU1QKCkgYmZpbl9yZWFkMTYoQ0FOX01CMDlfVElNRVNUQU1QKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA5X1RJTUVTVEFNUCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwOV9USU1FU1RBTVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA5X0lEMCgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjA5X0lEMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwOV9JRDAodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIwOV9JRDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA5X0lEMSgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjA5X0lEMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwOV9JRDEodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIwOV9JRDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjEwX0RBVEEwKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjEwX0RBVEEwKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjEwX0RBVEEwKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjEwX0RBVEEwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxMF9EQVRBMSgpICAgICBiZmluX3JlYWQxNihDQU5fTUIxMF9EQVRBMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxMF9EQVRBMSh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxMF9EQVRBMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTBfREFUQTIoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTBfREFUQTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTBfREFUQTIodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTBfREFUQTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjEwX0RBVEEzKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjEwX0RBVEEzKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjEwX0RBVEEzKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjEwX0RBVEEzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxMF9MRU5HVEgoKSAgICBiZmluX3JlYWQxNihDQU5fTUIxMF9MRU5HVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTBfTEVOR1RIKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjEwX0xFTkdUSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTBfVElNRVNUQU1QKCkgYmZpbl9yZWFkMTYoQ0FOX01CMTBfVElNRVNUQU1QKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjEwX1RJTUVTVEFNUCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxMF9USU1FU1RBTVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjEwX0lEMCgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjEwX0lEMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxMF9JRDAodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIxMF9JRDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjEwX0lEMSgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjEwX0lEMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxMF9JRDEodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIxMF9JRDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjExX0RBVEEwKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjExX0RBVEEwKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjExX0RBVEEwKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjExX0RBVEEwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxMV9EQVRBMSgpICAgICBiZmluX3JlYWQxNihDQU5fTUIxMV9EQVRBMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxMV9EQVRBMSh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxMV9EQVRBMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTFfREFUQTIoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTFfREFUQTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTFfREFUQTIodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTFfREFUQTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjExX0RBVEEzKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjExX0RBVEEzKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjExX0RBVEEzKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjExX0RBVEEzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxMV9MRU5HVEgoKSAgICBiZmluX3JlYWQxNihDQU5fTUIxMV9MRU5HVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTFfTEVOR1RIKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjExX0xFTkdUSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTFfVElNRVNUQU1QKCkgYmZpbl9yZWFkMTYoQ0FOX01CMTFfVElNRVNUQU1QKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjExX1RJTUVTVEFNUCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxMV9USU1FU1RBTVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjExX0lEMCgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjExX0lEMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxMV9JRDAodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIxMV9JRDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjExX0lEMSgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjExX0lEMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxMV9JRDEodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIxMV9JRDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjEyX0RBVEEwKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjEyX0RBVEEwKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjEyX0RBVEEwKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjEyX0RBVEEwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxMl9EQVRBMSgpICAgICBiZmluX3JlYWQxNihDQU5fTUIxMl9EQVRBMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxMl9EQVRBMSh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxMl9EQVRBMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTJfREFUQTIoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTJfREFUQTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTJfREFUQTIodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTJfREFUQTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjEyX0RBVEEzKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjEyX0RBVEEzKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjEyX0RBVEEzKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjEyX0RBVEEzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxMl9MRU5HVEgoKSAgICBiZmluX3JlYWQxNihDQU5fTUIxMl9MRU5HVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTJfTEVOR1RIKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjEyX0xFTkdUSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTJfVElNRVNUQU1QKCkgYmZpbl9yZWFkMTYoQ0FOX01CMTJfVElNRVNUQU1QKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjEyX1RJTUVTVEFNUCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxMl9USU1FU1RBTVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjEyX0lEMCgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjEyX0lEMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxMl9JRDAodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIxMl9JRDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjEyX0lEMSgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjEyX0lEMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxMl9JRDEodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIxMl9JRDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjEzX0RBVEEwKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjEzX0RBVEEwKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjEzX0RBVEEwKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjEzX0RBVEEwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxM19EQVRBMSgpICAgICBiZmluX3JlYWQxNihDQU5fTUIxM19EQVRBMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxM19EQVRBMSh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxM19EQVRBMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTNfREFUQTIoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTNfREFUQTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTNfREFUQTIodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTNfREFUQTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjEzX0RBVEEzKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjEzX0RBVEEzKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjEzX0RBVEEzKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjEzX0RBVEEzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxM19MRU5HVEgoKSAgICBiZmluX3JlYWQxNihDQU5fTUIxM19MRU5HVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTNfTEVOR1RIKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjEzX0xFTkdUSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTNfVElNRVNUQU1QKCkgYmZpbl9yZWFkMTYoQ0FOX01CMTNfVElNRVNUQU1QKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjEzX1RJTUVTVEFNUCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxM19USU1FU1RBTVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjEzX0lEMCgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjEzX0lEMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxM19JRDAodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIxM19JRDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjEzX0lEMSgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjEzX0lEMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxM19JRDEodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIxM19JRDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE0X0RBVEEwKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjE0X0RBVEEwKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE0X0RBVEEwKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjE0X0RBVEEwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxNF9EQVRBMSgpICAgICBiZmluX3JlYWQxNihDQU5fTUIxNF9EQVRBMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxNF9EQVRBMSh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxNF9EQVRBMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTRfREFUQTIoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTRfREFUQTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTRfREFUQTIodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTRfREFUQTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE0X0RBVEEzKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjE0X0RBVEEzKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE0X0RBVEEzKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjE0X0RBVEEzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxNF9MRU5HVEgoKSAgICBiZmluX3JlYWQxNihDQU5fTUIxNF9MRU5HVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTRfTEVOR1RIKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjE0X0xFTkdUSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTRfVElNRVNUQU1QKCkgYmZpbl9yZWFkMTYoQ0FOX01CMTRfVElNRVNUQU1QKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE0X1RJTUVTVEFNUCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxNF9USU1FU1RBTVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE0X0lEMCgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjE0X0lEMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxNF9JRDAodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIxNF9JRDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE0X0lEMSgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjE0X0lEMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxNF9JRDEodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIxNF9JRDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE1X0RBVEEwKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjE1X0RBVEEwKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE1X0RBVEEwKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjE1X0RBVEEwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxNV9EQVRBMSgpICAgICBiZmluX3JlYWQxNihDQU5fTUIxNV9EQVRBMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxNV9EQVRBMSh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxNV9EQVRBMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTVfREFUQTIoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTVfREFUQTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTVfREFUQTIodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTVfREFUQTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE1X0RBVEEzKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjE1X0RBVEEzKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE1X0RBVEEzKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjE1X0RBVEEzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxNV9MRU5HVEgoKSAgICBiZmluX3JlYWQxNihDQU5fTUIxNV9MRU5HVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTVfTEVOR1RIKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjE1X0xFTkdUSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTVfVElNRVNUQU1QKCkgYmZpbl9yZWFkMTYoQ0FOX01CMTVfVElNRVNUQU1QKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE1X1RJTUVTVEFNUCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxNV9USU1FU1RBTVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE1X0lEMCgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjE1X0lEMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxNV9JRDAodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIxNV9JRDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE1X0lEMSgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjE1X0lEMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxNV9JRDEodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIxNV9JRDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE2X0RBVEEwKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjE2X0RBVEEwKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE2X0RBVEEwKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjE2X0RBVEEwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxNl9EQVRBMSgpICAgICBiZmluX3JlYWQxNihDQU5fTUIxNl9EQVRBMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxNl9EQVRBMSh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxNl9EQVRBMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTZfREFUQTIoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTZfREFUQTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTZfREFUQTIodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTZfREFUQTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE2X0RBVEEzKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjE2X0RBVEEzKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE2X0RBVEEzKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjE2X0RBVEEzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxNl9MRU5HVEgoKSAgICBiZmluX3JlYWQxNihDQU5fTUIxNl9MRU5HVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTZfTEVOR1RIKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjE2X0xFTkdUSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTZfVElNRVNUQU1QKCkgYmZpbl9yZWFkMTYoQ0FOX01CMTZfVElNRVNUQU1QKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE2X1RJTUVTVEFNUCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxNl9USU1FU1RBTVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE2X0lEMCgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjE2X0lEMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxNl9JRDAodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIxNl9JRDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE2X0lEMSgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjE2X0lEMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxNl9JRDEodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIxNl9JRDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE3X0RBVEEwKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjE3X0RBVEEwKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE3X0RBVEEwKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjE3X0RBVEEwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxN19EQVRBMSgpICAgICBiZmluX3JlYWQxNihDQU5fTUIxN19EQVRBMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxN19EQVRBMSh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxN19EQVRBMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTdfREFUQTIoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTdfREFUQTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTdfREFUQTIodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTdfREFUQTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE3X0RBVEEzKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjE3X0RBVEEzKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE3X0RBVEEzKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjE3X0RBVEEzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxN19MRU5HVEgoKSAgICBiZmluX3JlYWQxNihDQU5fTUIxN19MRU5HVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTdfTEVOR1RIKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjE3X0xFTkdUSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTdfVElNRVNUQU1QKCkgYmZpbl9yZWFkMTYoQ0FOX01CMTdfVElNRVNUQU1QKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE3X1RJTUVTVEFNUCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxN19USU1FU1RBTVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE3X0lEMCgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjE3X0lEMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxN19JRDAodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIxN19JRDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE3X0lEMSgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjE3X0lEMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxN19JRDEodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIxN19JRDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE4X0RBVEEwKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjE4X0RBVEEwKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE4X0RBVEEwKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjE4X0RBVEEwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxOF9EQVRBMSgpICAgICBiZmluX3JlYWQxNihDQU5fTUIxOF9EQVRBMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxOF9EQVRBMSh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxOF9EQVRBMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMThfREFUQTIoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMThfREFUQTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMThfREFUQTIodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMThfREFUQTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE4X0RBVEEzKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjE4X0RBVEEzKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE4X0RBVEEzKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjE4X0RBVEEzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxOF9MRU5HVEgoKSAgICBiZmluX3JlYWQxNihDQU5fTUIxOF9MRU5HVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMThfTEVOR1RIKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjE4X0xFTkdUSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMThfVElNRVNUQU1QKCkgYmZpbl9yZWFkMTYoQ0FOX01CMThfVElNRVNUQU1QKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE4X1RJTUVTVEFNUCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxOF9USU1FU1RBTVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE4X0lEMCgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjE4X0lEMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxOF9JRDAodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIxOF9JRDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE4X0lEMSgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjE4X0lEMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxOF9JRDEodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIxOF9JRDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE5X0RBVEEwKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjE5X0RBVEEwKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE5X0RBVEEwKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjE5X0RBVEEwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxOV9EQVRBMSgpICAgICBiZmluX3JlYWQxNihDQU5fTUIxOV9EQVRBMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxOV9EQVRBMSh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxOV9EQVRBMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTlfREFUQTIoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTlfREFUQTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTlfREFUQTIodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTlfREFUQTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE5X0RBVEEzKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjE5X0RBVEEzKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE5X0RBVEEzKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjE5X0RBVEEzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxOV9MRU5HVEgoKSAgICBiZmluX3JlYWQxNihDQU5fTUIxOV9MRU5HVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTlfTEVOR1RIKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjE5X0xFTkdUSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTlfVElNRVNUQU1QKCkgYmZpbl9yZWFkMTYoQ0FOX01CMTlfVElNRVNUQU1QKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE5X1RJTUVTVEFNUCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxOV9USU1FU1RBTVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE5X0lEMCgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjE5X0lEMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxOV9JRDAodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIxOV9JRDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE5X0lEMSgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjE5X0lEMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxOV9JRDEodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIxOV9JRDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjIwX0RBVEEwKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjIwX0RBVEEwKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjIwX0RBVEEwKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjIwX0RBVEEwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyMF9EQVRBMSgpICAgICBiZmluX3JlYWQxNihDQU5fTUIyMF9EQVRBMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyMF9EQVRBMSh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyMF9EQVRBMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjBfREFUQTIoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjBfREFUQTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjBfREFUQTIodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjBfREFUQTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjIwX0RBVEEzKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjIwX0RBVEEzKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjIwX0RBVEEzKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjIwX0RBVEEzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyMF9MRU5HVEgoKSAgICBiZmluX3JlYWQxNihDQU5fTUIyMF9MRU5HVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjBfTEVOR1RIKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjIwX0xFTkdUSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjBfVElNRVNUQU1QKCkgYmZpbl9yZWFkMTYoQ0FOX01CMjBfVElNRVNUQU1QKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjIwX1RJTUVTVEFNUCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyMF9USU1FU1RBTVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjIwX0lEMCgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjIwX0lEMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyMF9JRDAodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIyMF9JRDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjIwX0lEMSgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjIwX0lEMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyMF9JRDEodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIyMF9JRDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjIxX0RBVEEwKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjIxX0RBVEEwKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjIxX0RBVEEwKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjIxX0RBVEEwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyMV9EQVRBMSgpICAgICBiZmluX3JlYWQxNihDQU5fTUIyMV9EQVRBMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyMV9EQVRBMSh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyMV9EQVRBMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjFfREFUQTIoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjFfREFUQTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjFfREFUQTIodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjFfREFUQTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjIxX0RBVEEzKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjIxX0RBVEEzKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjIxX0RBVEEzKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjIxX0RBVEEzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyMV9MRU5HVEgoKSAgICBiZmluX3JlYWQxNihDQU5fTUIyMV9MRU5HVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjFfTEVOR1RIKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjIxX0xFTkdUSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjFfVElNRVNUQU1QKCkgYmZpbl9yZWFkMTYoQ0FOX01CMjFfVElNRVNUQU1QKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjIxX1RJTUVTVEFNUCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyMV9USU1FU1RBTVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjIxX0lEMCgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjIxX0lEMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyMV9JRDAodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIyMV9JRDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjIxX0lEMSgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjIxX0lEMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyMV9JRDEodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIyMV9JRDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjIyX0RBVEEwKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjIyX0RBVEEwKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjIyX0RBVEEwKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjIyX0RBVEEwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyMl9EQVRBMSgpICAgICBiZmluX3JlYWQxNihDQU5fTUIyMl9EQVRBMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyMl9EQVRBMSh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyMl9EQVRBMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjJfREFUQTIoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjJfREFUQTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjJfREFUQTIodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjJfREFUQTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjIyX0RBVEEzKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjIyX0RBVEEzKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjIyX0RBVEEzKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjIyX0RBVEEzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyMl9MRU5HVEgoKSAgICBiZmluX3JlYWQxNihDQU5fTUIyMl9MRU5HVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjJfTEVOR1RIKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjIyX0xFTkdUSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjJfVElNRVNUQU1QKCkgYmZpbl9yZWFkMTYoQ0FOX01CMjJfVElNRVNUQU1QKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjIyX1RJTUVTVEFNUCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyMl9USU1FU1RBTVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjIyX0lEMCgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjIyX0lEMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyMl9JRDAodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIyMl9JRDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjIyX0lEMSgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjIyX0lEMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyMl9JRDEodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIyMl9JRDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjIzX0RBVEEwKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjIzX0RBVEEwKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjIzX0RBVEEwKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjIzX0RBVEEwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyM19EQVRBMSgpICAgICBiZmluX3JlYWQxNihDQU5fTUIyM19EQVRBMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyM19EQVRBMSh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyM19EQVRBMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjNfREFUQTIoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjNfREFUQTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjNfREFUQTIodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjNfREFUQTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjIzX0RBVEEzKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjIzX0RBVEEzKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjIzX0RBVEEzKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjIzX0RBVEEzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyM19MRU5HVEgoKSAgICBiZmluX3JlYWQxNihDQU5fTUIyM19MRU5HVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjNfTEVOR1RIKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjIzX0xFTkdUSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjNfVElNRVNUQU1QKCkgYmZpbl9yZWFkMTYoQ0FOX01CMjNfVElNRVNUQU1QKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjIzX1RJTUVTVEFNUCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyM19USU1FU1RBTVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjIzX0lEMCgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjIzX0lEMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyM19JRDAodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIyM19JRDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjIzX0lEMSgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjIzX0lEMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyM19JRDEodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIyM19JRDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI0X0RBVEEwKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjI0X0RBVEEwKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI0X0RBVEEwKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjI0X0RBVEEwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyNF9EQVRBMSgpICAgICBiZmluX3JlYWQxNihDQU5fTUIyNF9EQVRBMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyNF9EQVRBMSh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyNF9EQVRBMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjRfREFUQTIoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjRfREFUQTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjRfREFUQTIodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjRfREFUQTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI0X0RBVEEzKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjI0X0RBVEEzKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI0X0RBVEEzKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjI0X0RBVEEzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyNF9MRU5HVEgoKSAgICBiZmluX3JlYWQxNihDQU5fTUIyNF9MRU5HVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjRfTEVOR1RIKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjI0X0xFTkdUSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjRfVElNRVNUQU1QKCkgYmZpbl9yZWFkMTYoQ0FOX01CMjRfVElNRVNUQU1QKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI0X1RJTUVTVEFNUCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyNF9USU1FU1RBTVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI0X0lEMCgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjI0X0lEMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyNF9JRDAodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIyNF9JRDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI0X0lEMSgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjI0X0lEMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyNF9JRDEodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIyNF9JRDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI1X0RBVEEwKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjI1X0RBVEEwKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI1X0RBVEEwKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjI1X0RBVEEwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyNV9EQVRBMSgpICAgICBiZmluX3JlYWQxNihDQU5fTUIyNV9EQVRBMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyNV9EQVRBMSh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyNV9EQVRBMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjVfREFUQTIoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjVfREFUQTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjVfREFUQTIodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjVfREFUQTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI1X0RBVEEzKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjI1X0RBVEEzKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI1X0RBVEEzKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjI1X0RBVEEzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyNV9MRU5HVEgoKSAgICBiZmluX3JlYWQxNihDQU5fTUIyNV9MRU5HVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjVfTEVOR1RIKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjI1X0xFTkdUSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjVfVElNRVNUQU1QKCkgYmZpbl9yZWFkMTYoQ0FOX01CMjVfVElNRVNUQU1QKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI1X1RJTUVTVEFNUCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyNV9USU1FU1RBTVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI1X0lEMCgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjI1X0lEMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyNV9JRDAodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIyNV9JRDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI1X0lEMSgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjI1X0lEMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyNV9JRDEodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIyNV9JRDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI2X0RBVEEwKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjI2X0RBVEEwKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI2X0RBVEEwKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjI2X0RBVEEwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyNl9EQVRBMSgpICAgICBiZmluX3JlYWQxNihDQU5fTUIyNl9EQVRBMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyNl9EQVRBMSh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyNl9EQVRBMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjZfREFUQTIoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjZfREFUQTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjZfREFUQTIodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjZfREFUQTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI2X0RBVEEzKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjI2X0RBVEEzKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI2X0RBVEEzKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjI2X0RBVEEzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyNl9MRU5HVEgoKSAgICBiZmluX3JlYWQxNihDQU5fTUIyNl9MRU5HVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjZfTEVOR1RIKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjI2X0xFTkdUSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjZfVElNRVNUQU1QKCkgYmZpbl9yZWFkMTYoQ0FOX01CMjZfVElNRVNUQU1QKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI2X1RJTUVTVEFNUCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyNl9USU1FU1RBTVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI2X0lEMCgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjI2X0lEMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyNl9JRDAodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIyNl9JRDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI2X0lEMSgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjI2X0lEMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyNl9JRDEodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIyNl9JRDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI3X0RBVEEwKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjI3X0RBVEEwKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI3X0RBVEEwKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjI3X0RBVEEwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyN19EQVRBMSgpICAgICBiZmluX3JlYWQxNihDQU5fTUIyN19EQVRBMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyN19EQVRBMSh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyN19EQVRBMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjdfREFUQTIoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjdfREFUQTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjdfREFUQTIodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjdfREFUQTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI3X0RBVEEzKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjI3X0RBVEEzKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI3X0RBVEEzKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjI3X0RBVEEzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyN19MRU5HVEgoKSAgICBiZmluX3JlYWQxNihDQU5fTUIyN19MRU5HVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjdfTEVOR1RIKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjI3X0xFTkdUSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjdfVElNRVNUQU1QKCkgYmZpbl9yZWFkMTYoQ0FOX01CMjdfVElNRVNUQU1QKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI3X1RJTUVTVEFNUCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyN19USU1FU1RBTVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI3X0lEMCgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjI3X0lEMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyN19JRDAodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIyN19JRDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI3X0lEMSgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjI3X0lEMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyN19JRDEodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIyN19JRDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI4X0RBVEEwKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjI4X0RBVEEwKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI4X0RBVEEwKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjI4X0RBVEEwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyOF9EQVRBMSgpICAgICBiZmluX3JlYWQxNihDQU5fTUIyOF9EQVRBMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyOF9EQVRBMSh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyOF9EQVRBMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjhfREFUQTIoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjhfREFUQTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjhfREFUQTIodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjhfREFUQTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI4X0RBVEEzKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjI4X0RBVEEzKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI4X0RBVEEzKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjI4X0RBVEEzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyOF9MRU5HVEgoKSAgICBiZmluX3JlYWQxNihDQU5fTUIyOF9MRU5HVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjhfTEVOR1RIKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjI4X0xFTkdUSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjhfVElNRVNUQU1QKCkgYmZpbl9yZWFkMTYoQ0FOX01CMjhfVElNRVNUQU1QKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI4X1RJTUVTVEFNUCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyOF9USU1FU1RBTVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI4X0lEMCgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjI4X0lEMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyOF9JRDAodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIyOF9JRDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI4X0lEMSgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjI4X0lEMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyOF9JRDEodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIyOF9JRDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI5X0RBVEEwKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjI5X0RBVEEwKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI5X0RBVEEwKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjI5X0RBVEEwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyOV9EQVRBMSgpICAgICBiZmluX3JlYWQxNihDQU5fTUIyOV9EQVRBMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyOV9EQVRBMSh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyOV9EQVRBMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjlfREFUQTIoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjlfREFUQTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjlfREFUQTIodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjlfREFUQTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI5X0RBVEEzKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjI5X0RBVEEzKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI5X0RBVEEzKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjI5X0RBVEEzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyOV9MRU5HVEgoKSAgICBiZmluX3JlYWQxNihDQU5fTUIyOV9MRU5HVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjlfTEVOR1RIKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjI5X0xFTkdUSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjlfVElNRVNUQU1QKCkgYmZpbl9yZWFkMTYoQ0FOX01CMjlfVElNRVNUQU1QKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI5X1RJTUVTVEFNUCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyOV9USU1FU1RBTVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI5X0lEMCgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjI5X0lEMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyOV9JRDAodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIyOV9JRDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI5X0lEMSgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjI5X0lEMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyOV9JRDEodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIyOV9JRDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjMwX0RBVEEwKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjMwX0RBVEEwKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjMwX0RBVEEwKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjMwX0RBVEEwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIzMF9EQVRBMSgpICAgICBiZmluX3JlYWQxNihDQU5fTUIzMF9EQVRBMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIzMF9EQVRBMSh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIzMF9EQVRBMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMzBfREFUQTIoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMzBfREFUQTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMzBfREFUQTIodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMzBfREFUQTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjMwX0RBVEEzKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjMwX0RBVEEzKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjMwX0RBVEEzKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjMwX0RBVEEzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIzMF9MRU5HVEgoKSAgICBiZmluX3JlYWQxNihDQU5fTUIzMF9MRU5HVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMzBfTEVOR1RIKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjMwX0xFTkdUSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMzBfVElNRVNUQU1QKCkgYmZpbl9yZWFkMTYoQ0FOX01CMzBfVElNRVNUQU1QKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjMwX1RJTUVTVEFNUCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIzMF9USU1FU1RBTVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjMwX0lEMCgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjMwX0lEMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIzMF9JRDAodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIzMF9JRDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjMwX0lEMSgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjMwX0lEMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIzMF9JRDEodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIzMF9JRDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjMxX0RBVEEwKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjMxX0RBVEEwKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjMxX0RBVEEwKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjMxX0RBVEEwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIzMV9EQVRBMSgpICAgICBiZmluX3JlYWQxNihDQU5fTUIzMV9EQVRBMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIzMV9EQVRBMSh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIzMV9EQVRBMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMzFfREFUQTIoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMzFfREFUQTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMzFfREFUQTIodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMzFfREFUQTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjMxX0RBVEEzKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjMxX0RBVEEzKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjMxX0RBVEEzKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjMxX0RBVEEzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIzMV9MRU5HVEgoKSAgICBiZmluX3JlYWQxNihDQU5fTUIzMV9MRU5HVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMzFfTEVOR1RIKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjMxX0xFTkdUSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMzFfVElNRVNUQU1QKCkgYmZpbl9yZWFkMTYoQ0FOX01CMzFfVElNRVNUQU1QKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjMxX1RJTUVTVEFNUCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIzMV9USU1FU1RBTVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjMxX0lEMCgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjMxX0lEMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIzMV9JRDAodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIzMV9JRDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjMxX0lEMSgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjMxX0lEMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIzMV9JRDEodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIzMV9JRDEsIHZhbCkKKworLyogVGhlc2UgbmVlZCB0byBiZSBsYXN0IGR1ZSB0byB0aGUgY2RlZi9saW51eCBpbnRlci1kZXBlbmRlbmNpZXMgKi8KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKy8qIFdyaXRpbmcgdG8gUExMX0NUTCBpbml0aWF0ZXMgYSBQTEwgcmVsb2NrIHNlcXVlbmNlLiAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCBiZmluX3dyaXRlX1BMTF9DVEwodW5zaWduZWQgaW50IHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBpd3IwLCBpd3IxOworCisJaWYgKHZhbCA9PSBiZmluX3JlYWRfUExMX0NUTCgpKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CisJLyogRW5hYmxlIHRoZSBQTEwgV2FrZXVwIGJpdCBpbiBTSUMgSVdSICovCisJaXdyMCA9IGJmaW5fcmVhZDMyKFNJQ19JV1IwKTsKKwlpd3IxID0gYmZpbl9yZWFkMzIoU0lDX0lXUjEpOworCS8qIE9ubHkgYWxsb3cgUFBMIFdha2V1cCkgKi8KKwliZmluX3dyaXRlMzIoU0lDX0lXUjAsIElXUl9FTkFCTEUoMCkpOworCWJmaW5fd3JpdGUzMihTSUNfSVdSMSwgMCk7CisKKwliZmluX3dyaXRlMTYoUExMX0NUTCwgdmFsKTsKKwlTU1lOQygpOworCWFzbSgiSURMRTsiKTsKKworCWJmaW5fd3JpdGUzMihTSUNfSVdSMCwgaXdyMCk7CisJYmZpbl93cml0ZTMyKFNJQ19JV1IxLCBpd3IxKTsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7Cit9CisKKy8qIFdyaXRpbmcgdG8gVlJfQ1RMIGluaXRpYXRlcyBhIFBMTCByZWxvY2sgc2VxdWVuY2UuICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGJmaW5fd3JpdGVfVlJfQ1RMKHVuc2lnbmVkIGludCB2YWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncywgaXdyMCwgaXdyMTsKKworCWlmICh2YWwgPT0gYmZpbl9yZWFkX1ZSX0NUTCgpKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CisJLyogRW5hYmxlIHRoZSBQTEwgV2FrZXVwIGJpdCBpbiBTSUMgSVdSICovCisJaXdyMCA9IGJmaW5fcmVhZDMyKFNJQ19JV1IwKTsKKwlpd3IxID0gYmZpbl9yZWFkMzIoU0lDX0lXUjEpOworCS8qIE9ubHkgYWxsb3cgUFBMIFdha2V1cCkgKi8KKwliZmluX3dyaXRlMzIoU0lDX0lXUjAsIElXUl9FTkFCTEUoMCkpOworCWJmaW5fd3JpdGUzMihTSUNfSVdSMSwgMCk7CisKKwliZmluX3dyaXRlMTYoVlJfQ1RMLCB2YWwpOworCVNTWU5DKCk7CisJYXNtKCJJRExFOyIpOworCisJYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBpd3IwKTsKKwliZmluX3dyaXRlMzIoU0lDX0lXUjEsIGl3cjEpOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2NkZWZCRjUzOS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MzkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOThjNGJiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MzkuaApAQCAtMCwwICsxLDI0MCBAQAorLyogRE8gTk9UIEVESVQgVEhJUyBGSUxFCisgKiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBnZW5lcmF0ZS1jZGVmLWhlYWRlcnMueHNsCisgKiBETyBOT1QgRURJVCBUSElTIEZJTEUKKyAqLworCisjaWZuZGVmIF9DREVGX0JGNTM5X0gKKyNkZWZpbmUgX0NERUZfQkY1MzlfSAorCisvKiBJbmNsdWRlIE1NUnMgQ29tbW9uIHRvIEJGNTM4IAkJCQkJCQkJKi8KKyNpbmNsdWRlICJjZGVmQkY1MzguaCIKKworCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0NPTkZJRygpICAgICAgICBiZmluX3JlYWQxNihNWFZSX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0NPTkZJRyh2YWwpICAgIGJmaW5fd3JpdGUxNihNWFZSX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9QTExfQ1RMXzAoKSAgICAgYmZpbl9yZWFkMzIoTVhWUl9QTExfQ1RMXzApCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9QTExfQ1RMXzAodmFsKSBiZmluX3dyaXRlMzIoTVhWUl9QTExfQ1RMXzAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfU1RBVEVfMCgpICAgICAgIGJmaW5fcmVhZDMyKE1YVlJfU1RBVEVfMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX1NUQVRFXzAodmFsKSAgIGJmaW5fd3JpdGUzMihNWFZSX1NUQVRFXzAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfU1RBVEVfMSgpICAgICAgIGJmaW5fcmVhZDMyKE1YVlJfU1RBVEVfMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX1NUQVRFXzEodmFsKSAgIGJmaW5fd3JpdGUzMihNWFZSX1NUQVRFXzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfSU5UX1NUQVRfMCgpICAgIGJmaW5fcmVhZDMyKE1YVlJfSU5UX1NUQVRfMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0lOVF9TVEFUXzAodmFsKSBiZmluX3dyaXRlMzIoTVhWUl9JTlRfU1RBVF8wLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0lOVF9TVEFUXzEoKSAgICBiZmluX3JlYWQzMihNWFZSX0lOVF9TVEFUXzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9JTlRfU1RBVF8xKHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfSU5UX1NUQVRfMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9JTlRfRU5fMCgpICAgICAgYmZpbl9yZWFkMzIoTVhWUl9JTlRfRU5fMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0lOVF9FTl8wKHZhbCkgIGJmaW5fd3JpdGUzMihNWFZSX0lOVF9FTl8wLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0lOVF9FTl8xKCkgICAgICBiZmluX3JlYWQzMihNWFZSX0lOVF9FTl8xKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfSU5UX0VOXzEodmFsKSAgYmZpbl93cml0ZTMyKE1YVlJfSU5UX0VOXzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfUE9TSVRJT04oKSAgICAgIGJmaW5fcmVhZDE2KE1YVlJfUE9TSVRJT04pCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9QT1NJVElPTih2YWwpICBiZmluX3dyaXRlMTYoTVhWUl9QT1NJVElPTiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9NQVhfUE9TSVRJT04oKSAgYmZpbl9yZWFkMTYoTVhWUl9NQVhfUE9TSVRJT04pCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9NQVhfUE9TSVRJT04odmFsKSBiZmluX3dyaXRlMTYoTVhWUl9NQVhfUE9TSVRJT04sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfREVMQVkoKSAgICAgICAgIGJmaW5fcmVhZDE2KE1YVlJfREVMQVkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ERUxBWSh2YWwpICAgICBiZmluX3dyaXRlMTYoTVhWUl9ERUxBWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9NQVhfREVMQVkoKSAgICAgYmZpbl9yZWFkMTYoTVhWUl9NQVhfREVMQVkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9NQVhfREVMQVkodmFsKSBiZmluX3dyaXRlMTYoTVhWUl9NQVhfREVMQVksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfTEFERFIoKSAgICAgICAgIGJmaW5fcmVhZDMyKE1YVlJfTEFERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9MQUREUih2YWwpICAgICBiZmluX3dyaXRlMzIoTVhWUl9MQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9HQUREUigpICAgICAgICAgYmZpbl9yZWFkMTYoTVhWUl9HQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0dBRERSKHZhbCkgICAgIGJmaW5fd3JpdGUxNihNWFZSX0dBRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0FBRERSKCkgICAgICAgICBiZmluX3JlYWQzMihNWFZSX0FBRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfQUFERFIodmFsKSAgICAgYmZpbl93cml0ZTMyKE1YVlJfQUFERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfQUxMT0NfMCgpICAgICAgIGJmaW5fcmVhZDMyKE1YVlJfQUxMT0NfMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0FMTE9DXzAodmFsKSAgIGJmaW5fd3JpdGUzMihNWFZSX0FMTE9DXzAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfQUxMT0NfMSgpICAgICAgIGJmaW5fcmVhZDMyKE1YVlJfQUxMT0NfMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0FMTE9DXzEodmFsKSAgIGJmaW5fd3JpdGUzMihNWFZSX0FMTE9DXzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfQUxMT0NfMigpICAgICAgIGJmaW5fcmVhZDMyKE1YVlJfQUxMT0NfMikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0FMTE9DXzIodmFsKSAgIGJmaW5fd3JpdGUzMihNWFZSX0FMTE9DXzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfQUxMT0NfMygpICAgICAgIGJmaW5fcmVhZDMyKE1YVlJfQUxMT0NfMykKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0FMTE9DXzModmFsKSAgIGJmaW5fd3JpdGUzMihNWFZSX0FMTE9DXzMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfQUxMT0NfNCgpICAgICAgIGJmaW5fcmVhZDMyKE1YVlJfQUxMT0NfNCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0FMTE9DXzQodmFsKSAgIGJmaW5fd3JpdGUzMihNWFZSX0FMTE9DXzQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfQUxMT0NfNSgpICAgICAgIGJmaW5fcmVhZDMyKE1YVlJfQUxMT0NfNSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0FMTE9DXzUodmFsKSAgIGJmaW5fd3JpdGUzMihNWFZSX0FMTE9DXzUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfQUxMT0NfNigpICAgICAgIGJmaW5fcmVhZDMyKE1YVlJfQUxMT0NfNikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0FMTE9DXzYodmFsKSAgIGJmaW5fd3JpdGUzMihNWFZSX0FMTE9DXzYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfQUxMT0NfNygpICAgICAgIGJmaW5fcmVhZDMyKE1YVlJfQUxMT0NfNykKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0FMTE9DXzcodmFsKSAgIGJmaW5fd3JpdGUzMihNWFZSX0FMTE9DXzcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfQUxMT0NfOCgpICAgICAgIGJmaW5fcmVhZDMyKE1YVlJfQUxMT0NfOCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0FMTE9DXzgodmFsKSAgIGJmaW5fd3JpdGUzMihNWFZSX0FMTE9DXzgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfQUxMT0NfOSgpICAgICAgIGJmaW5fcmVhZDMyKE1YVlJfQUxMT0NfOSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0FMTE9DXzkodmFsKSAgIGJmaW5fd3JpdGUzMihNWFZSX0FMTE9DXzksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfQUxMT0NfMTAoKSAgICAgIGJmaW5fcmVhZDMyKE1YVlJfQUxMT0NfMTApCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9BTExPQ18xMCh2YWwpICBiZmluX3dyaXRlMzIoTVhWUl9BTExPQ18xMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9BTExPQ18xMSgpICAgICAgYmZpbl9yZWFkMzIoTVhWUl9BTExPQ18xMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0FMTE9DXzExKHZhbCkgIGJmaW5fd3JpdGUzMihNWFZSX0FMTE9DXzExLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0FMTE9DXzEyKCkgICAgICBiZmluX3JlYWQzMihNWFZSX0FMTE9DXzEyKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfQUxMT0NfMTIodmFsKSAgYmZpbl93cml0ZTMyKE1YVlJfQUxMT0NfMTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfQUxMT0NfMTMoKSAgICAgIGJmaW5fcmVhZDMyKE1YVlJfQUxMT0NfMTMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9BTExPQ18xMyh2YWwpICBiZmluX3dyaXRlMzIoTVhWUl9BTExPQ18xMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9BTExPQ18xNCgpICAgICAgYmZpbl9yZWFkMzIoTVhWUl9BTExPQ18xNCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0FMTE9DXzE0KHZhbCkgIGJmaW5fd3JpdGUzMihNWFZSX0FMTE9DXzE0LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX1NZTkNfTENIQU5fMCgpICBiZmluX3JlYWQzMihNWFZSX1NZTkNfTENIQU5fMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX1NZTkNfTENIQU5fMCh2YWwpIGJmaW5fd3JpdGUzMihNWFZSX1NZTkNfTENIQU5fMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9TWU5DX0xDSEFOXzEoKSAgYmZpbl9yZWFkMzIoTVhWUl9TWU5DX0xDSEFOXzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9TWU5DX0xDSEFOXzEodmFsKSBiZmluX3dyaXRlMzIoTVhWUl9TWU5DX0xDSEFOXzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfU1lOQ19MQ0hBTl8yKCkgIGJmaW5fcmVhZDMyKE1YVlJfU1lOQ19MQ0hBTl8yKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfU1lOQ19MQ0hBTl8yKHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfU1lOQ19MQ0hBTl8yLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX1NZTkNfTENIQU5fMygpICBiZmluX3JlYWQzMihNWFZSX1NZTkNfTENIQU5fMykKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX1NZTkNfTENIQU5fMyh2YWwpIGJmaW5fd3JpdGUzMihNWFZSX1NZTkNfTENIQU5fMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9TWU5DX0xDSEFOXzQoKSAgYmZpbl9yZWFkMzIoTVhWUl9TWU5DX0xDSEFOXzQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9TWU5DX0xDSEFOXzQodmFsKSBiZmluX3dyaXRlMzIoTVhWUl9TWU5DX0xDSEFOXzQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfU1lOQ19MQ0hBTl81KCkgIGJmaW5fcmVhZDMyKE1YVlJfU1lOQ19MQ0hBTl81KQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfU1lOQ19MQ0hBTl81KHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfU1lOQ19MQ0hBTl81LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX1NZTkNfTENIQU5fNigpICBiZmluX3JlYWQzMihNWFZSX1NZTkNfTENIQU5fNikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX1NZTkNfTENIQU5fNih2YWwpIGJmaW5fd3JpdGUzMihNWFZSX1NZTkNfTENIQU5fNiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9TWU5DX0xDSEFOXzcoKSAgYmZpbl9yZWFkMzIoTVhWUl9TWU5DX0xDSEFOXzcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9TWU5DX0xDSEFOXzcodmFsKSBiZmluX3dyaXRlMzIoTVhWUl9TWU5DX0xDSEFOXzcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BMF9DT05GSUcoKSAgIGJmaW5fcmVhZDMyKE1YVlJfRE1BMF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUEwX0NPTkZJRyh2YWwpIGJmaW5fd3JpdGUzMihNWFZSX0RNQTBfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTBfU1RBUlRfQUREUigpIGJmaW5fcmVhZFBUUihNWFZSX0RNQTBfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTBfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTVhWUl9ETUEwX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BMF9DT1VOVCgpICAgIGJmaW5fcmVhZDE2KE1YVlJfRE1BMF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTBfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTVhWUl9ETUEwX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTBfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1YVlJfRE1BMF9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUEwX0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTVhWUl9ETUEwX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUEwX0NVUlJfQ09VTlQoKSBiZmluX3JlYWQxNihNWFZSX0RNQTBfQ1VSUl9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTBfQ1VSUl9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNWFZSX0RNQTBfQ1VSUl9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUExX0NPTkZJRygpICAgYmZpbl9yZWFkMzIoTVhWUl9ETUExX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTFfQ09ORklHKHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfRE1BMV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BMV9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1YVlJfRE1BMV9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRE1BMV9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNWFZSX0RNQTFfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUExX0NPVU5UKCkgICAgYmZpbl9yZWFkMTYoTVhWUl9ETUExX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRE1BMV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNWFZSX0RNQTFfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BMV9DVVJSX0FERFIoKSBiZmluX3JlYWRQVFIoTVhWUl9ETUExX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTFfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNWFZSX0RNQTFfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTFfQ1VSUl9DT1VOVCgpIGJmaW5fcmVhZDE2KE1YVlJfRE1BMV9DVVJSX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRE1BMV9DVVJSX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1YVlJfRE1BMV9DVVJSX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTJfQ09ORklHKCkgICBiZmluX3JlYWQzMihNWFZSX0RNQTJfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRE1BMl9DT05GSUcodmFsKSBiZmluX3dyaXRlMzIoTVhWUl9ETUEyX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUEyX1NUQVJUX0FERFIoKSBiZmluX3JlYWRQVFIoTVhWUl9ETUEyX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUEyX1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1YVlJfRE1BMl9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTJfQ09VTlQoKSAgICBiZmluX3JlYWQxNihNWFZSX0RNQTJfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUEyX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1YVlJfRE1BMl9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUEyX0NVUlJfQUREUigpIGJmaW5fcmVhZFBUUihNWFZSX0RNQTJfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRE1BMl9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1YVlJfRE1BMl9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BMl9DVVJSX0NPVU5UKCkgYmZpbl9yZWFkMTYoTVhWUl9ETUEyX0NVUlJfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUEyX0NVUlJfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTVhWUl9ETUEyX0NVUlJfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BM19DT05GSUcoKSAgIGJmaW5fcmVhZDMyKE1YVlJfRE1BM19DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUEzX0NPTkZJRyh2YWwpIGJmaW5fd3JpdGUzMihNWFZSX0RNQTNfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTNfU1RBUlRfQUREUigpIGJmaW5fcmVhZFBUUihNWFZSX0RNQTNfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTNfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTVhWUl9ETUEzX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BM19DT1VOVCgpICAgIGJmaW5fcmVhZDE2KE1YVlJfRE1BM19DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTNfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTVhWUl9ETUEzX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTNfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1YVlJfRE1BM19DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUEzX0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTVhWUl9ETUEzX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUEzX0NVUlJfQ09VTlQoKSBiZmluX3JlYWQxNihNWFZSX0RNQTNfQ1VSUl9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTNfQ1VSUl9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNWFZSX0RNQTNfQ1VSUl9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUE0X0NPTkZJRygpICAgYmZpbl9yZWFkMzIoTVhWUl9ETUE0X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTRfQ09ORklHKHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfRE1BNF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BNF9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1YVlJfRE1BNF9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRE1BNF9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNWFZSX0RNQTRfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUE0X0NPVU5UKCkgICAgYmZpbl9yZWFkMTYoTVhWUl9ETUE0X0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRE1BNF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNWFZSX0RNQTRfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BNF9DVVJSX0FERFIoKSBiZmluX3JlYWRQVFIoTVhWUl9ETUE0X0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTRfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNWFZSX0RNQTRfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTRfQ1VSUl9DT1VOVCgpIGJmaW5fcmVhZDE2KE1YVlJfRE1BNF9DVVJSX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRE1BNF9DVVJSX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1YVlJfRE1BNF9DVVJSX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTVfQ09ORklHKCkgICBiZmluX3JlYWQzMihNWFZSX0RNQTVfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRE1BNV9DT05GSUcodmFsKSBiZmluX3dyaXRlMzIoTVhWUl9ETUE1X0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUE1X1NUQVJUX0FERFIoKSBiZmluX3JlYWRQVFIoTVhWUl9ETUE1X1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUE1X1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1YVlJfRE1BNV9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTVfQ09VTlQoKSAgICBiZmluX3JlYWQxNihNWFZSX0RNQTVfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUE1X0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1YVlJfRE1BNV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUE1X0NVUlJfQUREUigpIGJmaW5fcmVhZFBUUihNWFZSX0RNQTVfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRE1BNV9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1YVlJfRE1BNV9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BNV9DVVJSX0NPVU5UKCkgYmZpbl9yZWFkMTYoTVhWUl9ETUE1X0NVUlJfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUE1X0NVUlJfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTVhWUl9ETUE1X0NVUlJfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BNl9DT05GSUcoKSAgIGJmaW5fcmVhZDMyKE1YVlJfRE1BNl9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUE2X0NPTkZJRyh2YWwpIGJmaW5fd3JpdGUzMihNWFZSX0RNQTZfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTZfU1RBUlRfQUREUigpIGJmaW5fcmVhZFBUUihNWFZSX0RNQTZfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTZfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTVhWUl9ETUE2X1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BNl9DT1VOVCgpICAgIGJmaW5fcmVhZDE2KE1YVlJfRE1BNl9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTZfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTVhWUl9ETUE2X0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTZfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1YVlJfRE1BNl9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUE2X0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTVhWUl9ETUE2X0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUE2X0NVUlJfQ09VTlQoKSBiZmluX3JlYWQxNihNWFZSX0RNQTZfQ1VSUl9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTZfQ1VSUl9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNWFZSX0RNQTZfQ1VSUl9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUE3X0NPTkZJRygpICAgYmZpbl9yZWFkMzIoTVhWUl9ETUE3X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTdfQ09ORklHKHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfRE1BN19DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BN19TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1YVlJfRE1BN19TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRE1BN19TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNWFZSX0RNQTdfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUE3X0NPVU5UKCkgICAgYmZpbl9yZWFkMTYoTVhWUl9ETUE3X0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRE1BN19DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNWFZSX0RNQTdfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BN19DVVJSX0FERFIoKSBiZmluX3JlYWRQVFIoTVhWUl9ETUE3X0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTdfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNWFZSX0RNQTdfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTdfQ1VSUl9DT1VOVCgpIGJmaW5fcmVhZDE2KE1YVlJfRE1BN19DVVJSX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRE1BN19DVVJSX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1YVlJfRE1BN19DVVJSX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0FQX0NUTCgpICAgICAgICBiZmluX3JlYWQxNihNWFZSX0FQX0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0FQX0NUTCh2YWwpICAgIGJmaW5fd3JpdGUxNihNWFZSX0FQX0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9BUFJCX1NUQVJUX0FERFIoKSBiZmluX3JlYWRQVFIoTVhWUl9BUFJCX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9BUFJCX1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1YVlJfQVBSQl9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0FQUkJfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1YVlJfQVBSQl9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9BUFJCX0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTVhWUl9BUFJCX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9BUFRCX1NUQVJUX0FERFIoKSBiZmluX3JlYWRQVFIoTVhWUl9BUFRCX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9BUFRCX1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1YVlJfQVBUQl9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0FQVEJfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1YVlJfQVBUQl9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9BUFRCX0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTVhWUl9BUFRCX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9DTV9DVEwoKSAgICAgICAgYmZpbl9yZWFkMzIoTVhWUl9DTV9DVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9DTV9DVEwodmFsKSAgICBiZmluX3dyaXRlMzIoTVhWUl9DTV9DVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfQ01SQl9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1YVlJfQ01SQl9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfQ01SQl9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNWFZSX0NNUkJfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9DTVJCX0NVUlJfQUREUigpIGJmaW5fcmVhZFBUUihNWFZSX0NNUkJfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfQ01SQl9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1YVlJfQ01SQl9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfQ01UQl9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1YVlJfQ01UQl9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfQ01UQl9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNWFZSX0NNVEJfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9DTVRCX0NVUlJfQUREUigpIGJmaW5fcmVhZFBUUihNWFZSX0NNVEJfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfQ01UQl9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1YVlJfQ01UQl9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfUlJEQl9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1YVlJfUlJEQl9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfUlJEQl9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNWFZSX1JSREJfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9SUkRCX0NVUlJfQUREUigpIGJmaW5fcmVhZFBUUihNWFZSX1JSREJfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfUlJEQl9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1YVlJfUlJEQl9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfUEFUX0RBVEFfMCgpICAgIGJmaW5fcmVhZDMyKE1YVlJfUEFUX0RBVEFfMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX1BBVF9EQVRBXzAodmFsKSBiZmluX3dyaXRlMzIoTVhWUl9QQVRfREFUQV8wLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX1BBVF9FTl8wKCkgICAgICBiZmluX3JlYWQzMihNWFZSX1BBVF9FTl8wKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfUEFUX0VOXzAodmFsKSAgYmZpbl93cml0ZTMyKE1YVlJfUEFUX0VOXzAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfUEFUX0RBVEFfMSgpICAgIGJmaW5fcmVhZDMyKE1YVlJfUEFUX0RBVEFfMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX1BBVF9EQVRBXzEodmFsKSBiZmluX3dyaXRlMzIoTVhWUl9QQVRfREFUQV8xLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX1BBVF9FTl8xKCkgICAgICBiZmluX3JlYWQzMihNWFZSX1BBVF9FTl8xKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfUEFUX0VOXzEodmFsKSAgYmZpbl93cml0ZTMyKE1YVlJfUEFUX0VOXzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRlJBTUVfQ05UXzAoKSAgIGJmaW5fcmVhZDE2KE1YVlJfRlJBTUVfQ05UXzApCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9GUkFNRV9DTlRfMCh2YWwpIGJmaW5fd3JpdGUxNihNWFZSX0ZSQU1FX0NOVF8wLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0ZSQU1FX0NOVF8xKCkgICBiZmluX3JlYWQxNihNWFZSX0ZSQU1FX0NOVF8xKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRlJBTUVfQ05UXzEodmFsKSBiZmluX3dyaXRlMTYoTVhWUl9GUkFNRV9DTlRfMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ST1VUSU5HXzAoKSAgICAgYmZpbl9yZWFkMzIoTVhWUl9ST1VUSU5HXzApCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ST1VUSU5HXzAodmFsKSBiZmluX3dyaXRlMzIoTVhWUl9ST1VUSU5HXzAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfUk9VVElOR18xKCkgICAgIGJmaW5fcmVhZDMyKE1YVlJfUk9VVElOR18xKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfUk9VVElOR18xKHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfUk9VVElOR18xLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX1JPVVRJTkdfMigpICAgICBiZmluX3JlYWQzMihNWFZSX1JPVVRJTkdfMikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX1JPVVRJTkdfMih2YWwpIGJmaW5fd3JpdGUzMihNWFZSX1JPVVRJTkdfMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ST1VUSU5HXzMoKSAgICAgYmZpbl9yZWFkMzIoTVhWUl9ST1VUSU5HXzMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ST1VUSU5HXzModmFsKSBiZmluX3dyaXRlMzIoTVhWUl9ST1VUSU5HXzMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfUk9VVElOR180KCkgICAgIGJmaW5fcmVhZDMyKE1YVlJfUk9VVElOR180KQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfUk9VVElOR180KHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfUk9VVElOR180LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX1JPVVRJTkdfNSgpICAgICBiZmluX3JlYWQzMihNWFZSX1JPVVRJTkdfNSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX1JPVVRJTkdfNSh2YWwpIGJmaW5fd3JpdGUzMihNWFZSX1JPVVRJTkdfNSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ST1VUSU5HXzYoKSAgICAgYmZpbl9yZWFkMzIoTVhWUl9ST1VUSU5HXzYpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ST1VUSU5HXzYodmFsKSBiZmluX3dyaXRlMzIoTVhWUl9ST1VUSU5HXzYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfUk9VVElOR183KCkgICAgIGJmaW5fcmVhZDMyKE1YVlJfUk9VVElOR183KQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfUk9VVElOR183KHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfUk9VVElOR183LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX1JPVVRJTkdfOCgpICAgICBiZmluX3JlYWQzMihNWFZSX1JPVVRJTkdfOCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX1JPVVRJTkdfOCh2YWwpIGJmaW5fd3JpdGUzMihNWFZSX1JPVVRJTkdfOCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ST1VUSU5HXzkoKSAgICAgYmZpbl9yZWFkMzIoTVhWUl9ST1VUSU5HXzkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ST1VUSU5HXzkodmFsKSBiZmluX3dyaXRlMzIoTVhWUl9ST1VUSU5HXzksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfUk9VVElOR18xMCgpICAgIGJmaW5fcmVhZDMyKE1YVlJfUk9VVElOR18xMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX1JPVVRJTkdfMTAodmFsKSBiZmluX3dyaXRlMzIoTVhWUl9ST1VUSU5HXzEwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX1JPVVRJTkdfMTEoKSAgICBiZmluX3JlYWQzMihNWFZSX1JPVVRJTkdfMTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ST1VUSU5HXzExKHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfUk9VVElOR18xMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ST1VUSU5HXzEyKCkgICAgYmZpbl9yZWFkMzIoTVhWUl9ST1VUSU5HXzEyKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfUk9VVElOR18xMih2YWwpIGJmaW5fd3JpdGUzMihNWFZSX1JPVVRJTkdfMTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfUk9VVElOR18xMygpICAgIGJmaW5fcmVhZDMyKE1YVlJfUk9VVElOR18xMykKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX1JPVVRJTkdfMTModmFsKSBiZmluX3dyaXRlMzIoTVhWUl9ST1VUSU5HXzEzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX1JPVVRJTkdfMTQoKSAgICBiZmluX3JlYWQzMihNWFZSX1JPVVRJTkdfMTQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ST1VUSU5HXzE0KHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfUk9VVElOR18xNCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9QTExfQ1RMXzEoKSAgICAgYmZpbl9yZWFkMzIoTVhWUl9QTExfQ1RMXzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9QTExfQ1RMXzEodmFsKSBiZmluX3dyaXRlMzIoTVhWUl9QTExfQ1RMXzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfQkxPQ0tfQ05UKCkgICAgIGJmaW5fcmVhZDE2KE1YVlJfQkxPQ0tfQ05UKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfQkxPQ0tfQ05UKHZhbCkgYmZpbl93cml0ZTE2KE1YVlJfQkxPQ0tfQ05ULCB2YWwpCisKKyNlbmRpZiAvKiBfQ0RFRl9CRjUzOV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2RlZkJGNTM5LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2RlZkJGNTM5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFkYmZjYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvZGVmQkY1MzkuaApAQCAtMCwwICsxLDQyNDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBQdWJsaWMKKyAqIExpY2Vuc2UuIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBOb24tR1BMIExpY2Vuc2UgYWxzbyBhdmFpbGFibGUgYXMgcGFydCBvZiBWaXN1YWxEU1ArKworICogaHR0cDovL3d3dy5hbmFsb2cuY29tL3Byb2Nlc3NvcnMvcmVzb3VyY2VzL2Nyb3NzY29yZS92aXN1YWxEc3BEZXZTb2Z0d2FyZS5odG1sCisgKgorICogKGMpIENvcHlyaWdodCAyMDAxLTIwMDUgQW5hbG9nIERldmljZXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZAorICoKKyAqIFRoaXMgZmlsZSB1bmRlciBzb3VyY2UgY29kZSBjb250cm9sLCBwbGVhc2Ugc2VuZCBidWdzIG9yIGNoYW5nZXMgdG86CisgKiBkc3B0b29scy5zdXBwb3J0QGFuYWxvZy5jb20KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUzOC9kZWZCRjUzOS5oCisgKiBCYXNlZCBvbjoKKyAqIEF1dGhvcjoKKyAqCisgKiBDcmVhdGVkOgorICogRGVzY3JpcHRpb246CisgKgorICogUmV2OgorICoKKyAqIE1vZGlmaWVkOgorICoKKyAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisvKiBTWVNURU0gJiBNTSBSRUdJU1RFUiBCSVQgJiBBRERSRVNTIERFRklOSVRJT05TIEZPUiBBRFNQLUJGNTM4LzkgKi8KKworI2lmbmRlZiBfREVGX0JGNTM5X0gKKyNkZWZpbmUgX0RFRl9CRjUzOV9ICisKKy8qIGluY2x1ZGUgYWxsIENvcmUgcmVnaXN0ZXJzIGFuZCBiaXQgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxhc20vZGVmX0xQQmxhY2tmaW4uaD4KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qIFN5c3RlbSBNTVIgUmVnaXN0ZXIgTWFwICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qIENsb2NrL1JlZ3VsYXRvciBDb250cm9sICgweEZGQzAwMDAwIC0gMHhGRkMwMDBGRikgKi8KKyNkZWZpbmUJUExMX0NUTAkJCTB4RkZDMDAwMDAJLyogUExMIENvbnRyb2wgcmVnaXN0ZXIgKDE2LWJpdCkgKi8KKyNkZWZpbmUJUExMX0RJVgkJCTB4RkZDMDAwMDQJLyogUExMIERpdmlkZSBSZWdpc3RlciAoMTYtYml0KSAqLworI2RlZmluZQlWUl9DVEwJCQkweEZGQzAwMDA4CS8qIFZvbHRhZ2UgUmVndWxhdG9yIENvbnRyb2wgUmVnaXN0ZXIgKDE2LWJpdCkgKi8KKyNkZWZpbmUJUExMX1NUQVQJCTB4RkZDMDAwMEMJLyogUExMIFN0YXR1cyByZWdpc3RlciAoMTYtYml0KSAqLworI2RlZmluZQlQTExfTE9DS0NOVAkJMHhGRkMwMDAxMAkvKiBQTEwgTG9jawlDb3VudCByZWdpc3RlciAoMTYtYml0KSAqLworI2RlZmluZQlDSElQSUQJCQkweEZGQzAwMDE0CS8qIENoaXAJSUQgUmVnaXN0ZXIgKi8KKworLyogQ0hJUElEIE1hc2tzICovCisjZGVmaW5lIENISVBJRF9WRVJTSU9OICAgICAgICAgMHhGMDAwMDAwMAorI2RlZmluZSBDSElQSURfRkFNSUxZICAgICAgICAgIDB4MEZGRkYwMDAKKyNkZWZpbmUgQ0hJUElEX01BTlVGQUNUVVJFICAgICAweDAwMDAwRkZFCisKKy8qIFN5c3RlbSBJbnRlcnJ1cHQgQ29udHJvbGxlciAoMHhGRkMwMDEwMCAtIDB4RkZDMDAxRkYpICovCisjZGVmaW5lCVNXUlNUCQkJMHhGRkMwMDEwMCAgLyogU29mdHdhcmUJUmVzZXQgUmVnaXN0ZXIgKDE2LWJpdCkgKi8KKyNkZWZpbmUJU1lTQ1IJCQkweEZGQzAwMTA0ICAvKiBTeXN0ZW0gQ29uZmlndXJhdGlvbiByZWdpc3RlICovCisjZGVmaW5lCVNJQ19JTUFTSzAJCTB4RkZDMDAxMEMgIC8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lCVNJQ19JQVIwCQkweEZGQzAwMTEwICAvKiBJbnRlcnJ1cHQgQXNzaWdubWVudCBSZWdpc3RlciAwICovCisjZGVmaW5lCVNJQ19JQVIxCQkweEZGQzAwMTE0ICAvKiBJbnRlcnJ1cHQgQXNzaWdubWVudCBSZWdpc3RlciAxICovCisjZGVmaW5lCVNJQ19JQVIyCQkweEZGQzAwMTE4ICAvKiBJbnRlcnJ1cHQgQXNzaWdubWVudCBSZWdpc3RlciAyICovCisjZGVmaW5lCVNJQ19JQVIzCQkJMHhGRkMwMDExQwkvKiBJbnRlcnJ1cHQgQXNzaWdubWVudAlSZWdpc3RlciAzICovCisjZGVmaW5lCVNJQ19JU1IwCQkJMHhGRkMwMDEyMCAgLyogSW50ZXJydXB0IFN0YXR1cwlSZWdpc3RlciAqLworI2RlZmluZQlTSUNfSVdSMAkJCTB4RkZDMDAxMjQgIC8qIEludGVycnVwdCBXYWtldXAJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU0lDX0lNQVNLMQkJCTB4RkZDMDAxMjgJLyogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgMSAqLworI2RlZmluZQlTSUNfSVNSMQkJCTB4RkZDMDAxMkMJLyogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAxICovCisjZGVmaW5lCVNJQ19JV1IxCQkJMHhGRkMwMDEzMAkvKiBJbnRlcnJ1cHQgV2FrZXVwIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUJU0lDX0lBUjQJCQkweEZGQzAwMTM0CS8qIEludGVycnVwdCBBc3NpZ25tZW50CVJlZ2lzdGVyIDQgKi8KKyNkZWZpbmUJU0lDX0lBUjUJCQkweEZGQzAwMTM4CS8qIEludGVycnVwdCBBc3NpZ25tZW50CVJlZ2lzdGVyIDUgKi8KKyNkZWZpbmUJU0lDX0lBUjYJCQkweEZGQzAwMTNDCS8qIEludGVycnVwdCBBc3NpZ25tZW50CVJlZ2lzdGVyIDYgKi8KKworCisvKiBXYXRjaGRvZyBUaW1lciAoMHhGRkMwMDIwMCAtCTB4RkZDMDAyRkYpICovCisjZGVmaW5lCVdET0dfQ1RMCTB4RkZDMDAyMDAgIC8qIFdhdGNoZG9nCUNvbnRyb2wJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJV0RPR19DTlQJMHhGRkMwMDIwNCAgLyogV2F0Y2hkb2cJQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJV0RPR19TVEFUCTB4RkZDMDAyMDggIC8qIFdhdGNoZG9nCVN0YXR1cyBSZWdpc3RlciAqLworCisKKy8qIFJlYWwJVGltZSBDbG9jayAoMHhGRkMwMDMwMCAtIDB4RkZDMDAzRkYpICovCisjZGVmaW5lCVJUQ19TVEFUCTB4RkZDMDAzMDAgIC8qIFJUQyBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJUlRDX0lDVEwJMHhGRkMwMDMwNCAgLyogUlRDIEludGVycnVwdCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCVJUQ19JU1RBVAkweEZGQzAwMzA4ICAvKiBSVEMgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlSVENfU1dDTlQJMHhGRkMwMDMwQyAgLyogUlRDIFN0b3B3YXRjaCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlSVENfQUxBUk0JMHhGRkMwMDMxMCAgLyogUlRDIEFsYXJtIFRpbWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJUlRDX0ZBU1QJMHhGRkMwMDMxNCAgLyogUlRDIFByZXNjYWxlciBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJUlRDX1BSRU4JCTB4RkZDMDAzMTQgIC8qIFJUQyBQcmVzY2FsZXIgRW5hYmxlIFJlZ2lzdGVyIChhbHRlcm5hdGUJbWFjcm8pICovCisKKworLyogVUFSVDAgQ29udHJvbGxlciAoMHhGRkMwMDQwMAktIDB4RkZDMDA0RkYpICovCisjZGVmaW5lCVVBUlQwX1RIUgkgICAgICAweEZGQzAwNDAwICAvKiBUcmFuc21pdCBIb2xkaW5nIHJlZ2lzdGVyICovCisjZGVmaW5lCVVBUlQwX1JCUgkgICAgICAweEZGQzAwNDAwICAvKiBSZWNlaXZlIEJ1ZmZlciByZWdpc3RlciAqLworI2RlZmluZQlVQVJUMF9ETEwJICAgICAgMHhGRkMwMDQwMCAgLyogRGl2aXNvciBMYXRjaCAoTG93LUJ5dGUpICovCisjZGVmaW5lCVVBUlQwX0lFUgkgICAgICAweEZGQzAwNDA0ICAvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lCVVBUlQwX0RMSAkgICAgICAweEZGQzAwNDA0ICAvKiBEaXZpc29yIExhdGNoIChIaWdoLUJ5dGUpICovCisjZGVmaW5lCVVBUlQwX0lJUgkgICAgICAweEZGQzAwNDA4ICAvKiBJbnRlcnJ1cHQgSWRlbnRpZmljYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDBfTENSCSAgICAgIDB4RkZDMDA0MEMgIC8qIExpbmUgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQlVQVJUMF9NQ1IJCQkgMHhGRkMwMDQxMCAgLyoJTW9kZW0gQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQlVQVJUMF9MU1IJICAgICAgMHhGRkMwMDQxNCAgLyogTGluZSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDBfU0NSCSAgICAgIDB4RkZDMDA0MUMgIC8qIFNDUiBTY3JhdGNoIFJlZ2lzdGVyICovCisjZGVmaW5lCVVBUlQwX0dDVEwJCSAgICAgMHhGRkMwMDQyNAkgLyogR2xvYmFsIENvbnRyb2wgUmVnaXN0ZXIgKi8KKworCisvKiBTUEkwCUNvbnRyb2xsZXIgKDB4RkZDMDA1MDAgLSAweEZGQzAwNUZGKSAqLworCisjZGVmaW5lCVNQSTBfQ1RMCQkJMHhGRkMwMDUwMCAgLyogU1BJMCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTBfRkxHCQkJMHhGRkMwMDUwNCAgLyogU1BJMCBGbGFnIHJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTBfU1RBVAkJCTB4RkZDMDA1MDggIC8qIFNQSTAgU3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTBfVERCUgkJCTB4RkZDMDA1MEMgIC8qIFNQSTAgVHJhbnNtaXQgRGF0YSBCdWZmZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BJMF9SREJSCQkJMHhGRkMwMDUxMCAgLyogU1BJMCBSZWNlaXZlIERhdGEgQnVmZmVyCVJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTBfQkFVRAkJCTB4RkZDMDA1MTQgIC8qIFNQSTAgQmF1ZCByYXRlIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTBfU0hBRE9XCQkJMHhGRkMwMDUxOCAgLyogU1BJMF9SREJSIFNoYWRvdwlSZWdpc3RlciAqLworI2RlZmluZSBTUEkwX1JFR0JBU0UJCQlTUEkwX0NUTAorCisKKy8qIFRJTUVSIDAsIDEsIDIgUmVnaXN0ZXJzICgweEZGQzAwNjAwIC0gMHhGRkMwMDZGRikgKi8KKyNkZWZpbmUJVElNRVIwX0NPTkZJRwkJCTB4RkZDMDA2MDAgICAgIC8qIFRpbWVyCTAgQ29uZmlndXJhdGlvbglSZWdpc3RlciAqLworI2RlZmluZQlUSU1FUjBfQ09VTlRFUgkJCQkweEZGQzAwNjA0ICAgICAvKiBUaW1lcgkwIENvdW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVElNRVIwX1BFUklPRAkJCTB4RkZDMDA2MDggICAgIC8qIFRpbWVyCTAgUGVyaW9kIFJlZ2lzdGVyICovCisjZGVmaW5lCVRJTUVSMF9XSURUSAkJCTB4RkZDMDA2MEMgICAgIC8qIFRpbWVyCTAgV2lkdGgJUmVnaXN0ZXIgKi8KKworI2RlZmluZQlUSU1FUjFfQ09ORklHCQkJMHhGRkMwMDYxMAkvKiAgVGltZXIgMSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICAgKi8KKyNkZWZpbmUJVElNRVIxX0NPVU5URVIJCQkweEZGQzAwNjE0CS8qICBUaW1lciAxIENvdW50ZXIgUmVnaXN0ZXIJICAgICAqLworI2RlZmluZQlUSU1FUjFfUEVSSU9ECQkJMHhGRkMwMDYxOAkvKiAgVGltZXIgMSBQZXJpb2QgUmVnaXN0ZXIJICAgICAqLworI2RlZmluZQlUSU1FUjFfV0lEVEgJCQkweEZGQzAwNjFDCS8qICBUaW1lciAxIFdpZHRoIFJlZ2lzdGVyCSAgICAgKi8KKworI2RlZmluZQlUSU1FUjJfQ09ORklHCQkJMHhGRkMwMDYyMAkvKiBUaW1lciAyIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgICAqLworI2RlZmluZQlUSU1FUjJfQ09VTlRFUgkJCTB4RkZDMDA2MjQJLyogVGltZXIgMiBDb3VudGVyIFJlZ2lzdGVyCSAgICAqLworI2RlZmluZQlUSU1FUjJfUEVSSU9ECQkJMHhGRkMwMDYyOAkvKiBUaW1lciAyIFBlcmlvZCBSZWdpc3RlcgkgICAgKi8KKyNkZWZpbmUJVElNRVIyX1dJRFRICQkJMHhGRkMwMDYyQwkvKiBUaW1lciAyIFdpZHRoIFJlZ2lzdGVyCSAgICAqLworCisjZGVmaW5lCVRJTUVSX0VOQUJMRQkJCQkweEZGQzAwNjQwCS8qIFRpbWVyIEVuYWJsZQlSZWdpc3RlciAqLworI2RlZmluZQlUSU1FUl9ESVNBQkxFCQkJCTB4RkZDMDA2NDQJLyogVGltZXIgRGlzYWJsZSBSZWdpc3RlciAqLworI2RlZmluZQlUSU1FUl9TVEFUVVMJCQkJMHhGRkMwMDY0OAkvKiBUaW1lciBTdGF0dXMJUmVnaXN0ZXIgKi8KKworCisvKiBQcm9ncmFtbWFibGUJRmxhZ3MgKDB4RkZDMDA3MDAgLSAweEZGQzAwN0ZGKSAqLworI2RlZmluZQlGSU9fRkxBR19ECQkJCTB4RkZDMDA3MDAgIC8qIEZsYWcgTWFzayB0byBkaXJlY3RseSBzcGVjaWZ5IHN0YXRlIG9mIHBpbnMgKi8KKyNkZWZpbmUJRklPX0ZMQUdfQwkJCTB4RkZDMDA3MDQgIC8qIFBlcmlwaGVyYWwgSW50ZXJydXB0IEZsYWcgUmVnaXN0ZXIgKGNsZWFyKSAqLworI2RlZmluZQlGSU9fRkxBR19TCQkJMHhGRkMwMDcwOCAgLyogUGVyaXBoZXJhbCBJbnRlcnJ1cHQgRmxhZyBSZWdpc3RlciAoc2V0KSAqLworI2RlZmluZQlGSU9fRkxBR19UCQkJCQkweEZGQzAwNzBDICAvKiBGbGFnIE1hc2sgdG8gZGlyZWN0bHkgdG9nZ2xlIHN0YXRlIG9mIHBpbnMgKi8KKyNkZWZpbmUJRklPX01BU0tBX0QJCQkweEZGQzAwNzEwICAvKiBGbGFnIE1hc2sgSW50ZXJydXB0IEEgUmVnaXN0ZXIgKHNldCBkaXJlY3RseSkgKi8KKyNkZWZpbmUJRklPX01BU0tBX0MJCQkweEZGQzAwNzE0ICAvKiBGbGFnIE1hc2sgSW50ZXJydXB0IEEgUmVnaXN0ZXIgKGNsZWFyKSAqLworI2RlZmluZQlGSU9fTUFTS0FfUwkJCTB4RkZDMDA3MTggIC8qIEZsYWcgTWFzayBJbnRlcnJ1cHQgQSBSZWdpc3RlciAoc2V0KSAqLworI2RlZmluZQlGSU9fTUFTS0FfVAkJCTB4RkZDMDA3MUMgIC8qIEZsYWcgTWFzayBJbnRlcnJ1cHQgQSBSZWdpc3RlciAodG9nZ2xlKSAqLworI2RlZmluZQlGSU9fTUFTS0JfRAkJCTB4RkZDMDA3MjAgIC8qIEZsYWcgTWFzayBJbnRlcnJ1cHQgQiBSZWdpc3RlciAoc2V0IGRpcmVjdGx5KSAqLworI2RlZmluZQlGSU9fTUFTS0JfQwkJCTB4RkZDMDA3MjQgIC8qIEZsYWcgTWFzayBJbnRlcnJ1cHQgQiBSZWdpc3RlciAoY2xlYXIpICovCisjZGVmaW5lCUZJT19NQVNLQl9TCQkJMHhGRkMwMDcyOCAgLyogRmxhZyBNYXNrIEludGVycnVwdCBCIFJlZ2lzdGVyIChzZXQpICovCisjZGVmaW5lCUZJT19NQVNLQl9UCQkJMHhGRkMwMDcyQyAgLyogRmxhZyBNYXNrIEludGVycnVwdCBCIFJlZ2lzdGVyICh0b2dnbGUpICovCisjZGVmaW5lCUZJT19ESVIJCQkJMHhGRkMwMDczMCAgLyogUGVyaXBoZXJhbCBGbGFnIERpcmVjdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlGSU9fUE9MQVIJCQkweEZGQzAwNzM0ICAvKiBGbGFnIFNvdXJjZSBQb2xhcml0eSBSZWdpc3RlciAqLworI2RlZmluZQlGSU9fRURHRQkJCTB4RkZDMDA3MzggIC8qIEZsYWcgU291cmNlIFNlbnNpdGl2aXR5IFJlZ2lzdGVyICovCisjZGVmaW5lCUZJT19CT1RICQkJMHhGRkMwMDczQyAgLyogRmxhZyBTZXQJb24gQk9USAlFZGdlcyBSZWdpc3RlciAqLworI2RlZmluZQlGSU9fSU5FTgkJCQkJMHhGRkMwMDc0MCAgLyogRmxhZyBJbnB1dCBFbmFibGUgUmVnaXN0ZXIgICovCisKKworLyogU1BPUlQwIENvbnRyb2xsZXIgKDB4RkZDMDA4MDAgLSAweEZGQzAwOEZGKSAqLworI2RlZmluZQlTUE9SVDBfVENSMQkJCQkweEZGQzAwODAwICAvKiBTUE9SVDAgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMF9UQ1IyCQkJCTB4RkZDMDA4MDQgIC8qIFNQT1JUMCBUcmFuc21pdCBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQwX1RDTEtESVYJCQkweEZGQzAwODA4ICAvKiBTUE9SVDAgVHJhbnNtaXQgQ2xvY2sgRGl2aWRlciAqLworI2RlZmluZQlTUE9SVDBfVEZTRElWCQkJMHhGRkMwMDgwQyAgLyogU1BPUlQwIFRyYW5zbWl0IEZyYW1lIFN5bmMgRGl2aWRlciAqLworI2RlZmluZQlTUE9SVDBfVFgJCQkweEZGQzAwODEwICAvKiBTUE9SVDAgVFggRGF0YSBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDBfUlgJCQkweEZGQzAwODE4ICAvKiBTUE9SVDAgUlggRGF0YSBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDBfUkNSMQkJCQkweEZGQzAwODIwICAvKiBTUE9SVDAgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMF9SQ1IyCQkJCTB4RkZDMDA4MjQgIC8qIFNQT1JUMCBUcmFuc21pdCBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQwX1JDTEtESVYJCQkweEZGQzAwODI4ICAvKiBTUE9SVDAgUmVjZWl2ZSBDbG9jayBEaXZpZGVyICovCisjZGVmaW5lCVNQT1JUMF9SRlNESVYJCQkweEZGQzAwODJDICAvKiBTUE9SVDAgUmVjZWl2ZSBGcmFtZSBTeW5jIERpdmlkZXIgKi8KKyNkZWZpbmUJU1BPUlQwX1NUQVQJCQkweEZGQzAwODMwICAvKiBTUE9SVDAgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMF9DSE5MCQkJMHhGRkMwMDgzNCAgLyogU1BPUlQwIEN1cnJlbnQgQ2hhbm5lbCBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDBfTUNNQzEJCQkweEZGQzAwODM4ICAvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUJU1BPUlQwX01DTUMyCQkJMHhGRkMwMDgzQyAgLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyICovCisjZGVmaW5lCVNQT1JUMF9NVENTMAkJCTB4RkZDMDA4NDAgIC8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAwICovCisjZGVmaW5lCVNQT1JUMF9NVENTMQkJCTB4RkZDMDA4NDQgIC8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAxICovCisjZGVmaW5lCVNQT1JUMF9NVENTMgkJCTB4RkZDMDA4NDggIC8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAyICovCisjZGVmaW5lCVNQT1JUMF9NVENTMwkJCTB4RkZDMDA4NEMgIC8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAzICovCisjZGVmaW5lCVNQT1JUMF9NUkNTMAkJCTB4RkZDMDA4NTAgIC8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUJU1BPUlQwX01SQ1MxCQkJMHhGRkMwMDg1NCAgLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMSAqLworI2RlZmluZQlTUE9SVDBfTVJDUzIJCQkweEZGQzAwODU4ICAvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAyICovCisjZGVmaW5lCVNQT1JUMF9NUkNTMwkJCTB4RkZDMDA4NUMgIC8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDMgKi8KKworCisvKiBTUE9SVDEgQ29udHJvbGxlciAoMHhGRkMwMDkwMCAtIDB4RkZDMDA5RkYpICovCisjZGVmaW5lCVNQT1JUMV9UQ1IxCQkJCTB4RkZDMDA5MDAgIC8qIFNQT1JUMSBUcmFuc21pdCBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQxX1RDUjIJCQkJMHhGRkMwMDkwNCAgLyogU1BPUlQxIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMiBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDFfVENMS0RJVgkJCTB4RkZDMDA5MDggIC8qIFNQT1JUMSBUcmFuc21pdCBDbG9jayBEaXZpZGVyICovCisjZGVmaW5lCVNQT1JUMV9URlNESVYJCQkweEZGQzAwOTBDICAvKiBTUE9SVDEgVHJhbnNtaXQgRnJhbWUgU3luYyBEaXZpZGVyICovCisjZGVmaW5lCVNQT1JUMV9UWAkJCTB4RkZDMDA5MTAgIC8qIFNQT1JUMSBUWCBEYXRhIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMV9SWAkJCTB4RkZDMDA5MTggIC8qIFNQT1JUMSBSWCBEYXRhIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMV9SQ1IxCQkJCTB4RkZDMDA5MjAgIC8qIFNQT1JUMSBUcmFuc21pdCBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQxX1JDUjIJCQkJMHhGRkMwMDkyNCAgLyogU1BPUlQxIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMiBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDFfUkNMS0RJVgkJCTB4RkZDMDA5MjggIC8qIFNQT1JUMSBSZWNlaXZlIENsb2NrIERpdmlkZXIgKi8KKyNkZWZpbmUJU1BPUlQxX1JGU0RJVgkJCTB4RkZDMDA5MkMgIC8qIFNQT1JUMSBSZWNlaXZlIEZyYW1lIFN5bmMgRGl2aWRlciAqLworI2RlZmluZQlTUE9SVDFfU1RBVAkJCTB4RkZDMDA5MzAgIC8qIFNQT1JUMSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQxX0NITkwJCQkweEZGQzAwOTM0ICAvKiBTUE9SVDEgQ3VycmVudCBDaGFubmVsIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMV9NQ01DMQkJCTB4RkZDMDA5MzggIC8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMSAqLworI2RlZmluZQlTUE9SVDFfTUNNQzIJCQkweEZGQzAwOTNDICAvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUJU1BPUlQxX01UQ1MwCQkJMHhGRkMwMDk0MCAgLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUJU1BPUlQxX01UQ1MxCQkJMHhGRkMwMDk0NCAgLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUJU1BPUlQxX01UQ1MyCQkJMHhGRkMwMDk0OCAgLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUJU1BPUlQxX01UQ1MzCQkJMHhGRkMwMDk0QyAgLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDMgKi8KKyNkZWZpbmUJU1BPUlQxX01SQ1MwCQkJMHhGRkMwMDk1MCAgLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMCAqLworI2RlZmluZQlTUE9SVDFfTVJDUzEJCQkweEZGQzAwOTU0ICAvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAxICovCisjZGVmaW5lCVNQT1JUMV9NUkNTMgkJCTB4RkZDMDA5NTggIC8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUJU1BPUlQxX01SQ1MzCQkJMHhGRkMwMDk1QyAgLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMyAqLworCisKKy8qIEV4dGVybmFsIEJ1cwlJbnRlcmZhY2UgVW5pdCAoMHhGRkMwMEEwMCAtIDB4RkZDMDBBRkYpICovCisvKiBBc3luY2hyb25vdXMJTWVtb3J5IENvbnRyb2xsZXIgICovCisjZGVmaW5lCUVCSVVfQU1HQ1RMCQkJMHhGRkMwMEEwMCAgLyogQXN5bmNocm9ub3VzIE1lbW9yeSBHbG9iYWwgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQlFQklVX0FNQkNUTDAJCTB4RkZDMDBBMDQgIC8qIEFzeW5jaHJvbm91cyBNZW1vcnkgQmFuawlDb250cm9sCVJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUJRUJJVV9BTUJDVEwxCQkweEZGQzAwQTA4ICAvKiBBc3luY2hyb25vdXMgTWVtb3J5IEJhbmsJQ29udHJvbAlSZWdpc3RlciAxICovCisKKy8qIFNEUkFNIENvbnRyb2xsZXIgKi8KKyNkZWZpbmUJRUJJVV9TREdDVEwJCQkweEZGQzAwQTEwICAvKiBTRFJBTSBHbG9iYWwgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQlFQklVX1NEQkNUTAkJCTB4RkZDMDBBMTQgIC8qIFNEUkFNIEJhbmsgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQlFQklVX1NEUlJDCQkJMHhGRkMwMEExOCAgLyogU0RSQU0gUmVmcmVzaCBSYXRlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRUJJVV9TRFNUQVQJCQkweEZGQzAwQTFDICAvKiBTRFJBTSBTdGF0dXMgUmVnaXN0ZXIgKi8KKworCisKKy8qIERNQSBDb250cm9sbGVyIDAgVHJhZmZpYyBDb250cm9sIFJlZ2lzdGVycyAoMHhGRkMwMEIwMCAtIDB4RkZDMDBCRkYpICovCisKKyNkZWZpbmUJRE1BQzBfVENfUEVSCQkJMHhGRkMwMEIwQwkvKiBETUEgQ29udHJvbGxlciAwIFRyYWZmaWMgQ29udHJvbCBQZXJpb2RzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQUMwX1RDX0NOVAkJCTB4RkZDMDBCMTAJLyogRE1BIENvbnRyb2xsZXIgMCBUcmFmZmljIENvbnRyb2wgQ3VycmVudCBDb3VudHMgUmVnaXN0ZXIgKi8KKworLyogQWx0ZXJuYXRlIGRlcHJlY2F0ZWQJcmVnaXN0ZXIgbmFtZXMgKGJlbG93KSBwcm92aWRlZAlmb3IgYmFja3dhcmRzIGNvZGUgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZQlETUEwX1RDUEVSCQkJRE1BQzBfVENfUEVSCisjZGVmaW5lCURNQTBfVENDTlQJCQlETUFDMF9UQ19DTlQKKworCisvKiBETUEgQ29udHJvbGxlciAwICgweEZGQzAwQzAwCS0gMHhGRkMwMEZGRikJCQkJCQkJICovCisKKyNkZWZpbmUJRE1BMF9ORVhUX0RFU0NfUFRSCQkweEZGQzAwQzAwCS8qIERNQSBDaGFubmVsIDAgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMF9TVEFSVF9BRERSCQkJMHhGRkMwMEMwNAkvKiBETUEgQ2hhbm5lbCAwIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMF9DT05GSUcJCQkJMHhGRkMwMEMwOAkvKiBETUEgQ2hhbm5lbCAwIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMF9YX0NPVU5UCQkJMHhGRkMwMEMxMAkvKiBETUEgQ2hhbm5lbCAwIFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMF9YX01PRElGWQkJCTB4RkZDMDBDMTQJLyogRE1BIENoYW5uZWwgMCBYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUEwX1lfQ09VTlQJCQkweEZGQzAwQzE4CS8qIERNQSBDaGFubmVsIDAgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUEwX1lfTU9ESUZZCQkJMHhGRkMwMEMxQwkvKiBETUEgQ2hhbm5lbCAwIFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTBfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEMyMAkvKiBETUEgQ2hhbm5lbCAwIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTBfQ1VSUl9BRERSCQkJMHhGRkMwMEMyNAkvKiBETUEgQ2hhbm5lbCAwIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUEwX0lSUV9TVEFUVVMJCQkweEZGQzAwQzI4CS8qIERNQSBDaGFubmVsIDAgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlETUEwX1BFUklQSEVSQUxfTUFQCQkweEZGQzAwQzJDCS8qIERNQSBDaGFubmVsIDAgUGVyaXBoZXJhbCBNYXAJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMF9DVVJSX1hfQ09VTlQJCTB4RkZDMDBDMzAJLyogRE1BIENoYW5uZWwgMCBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMF9DVVJSX1lfQ09VTlQJCTB4RkZDMDBDMzgJLyogRE1BIENoYW5uZWwgMCBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlETUExX05FWFRfREVTQ19QVFIJCTB4RkZDMDBDNDAJLyogRE1BIENoYW5uZWwgMSBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExX1NUQVJUX0FERFIJCQkweEZGQzAwQzQ0CS8qIERNQSBDaGFubmVsIDEgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUExX0NPTkZJRwkJCQkweEZGQzAwQzQ4CS8qIERNQSBDaGFubmVsIDEgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlETUExX1hfQ09VTlQJCQkweEZGQzAwQzUwCS8qIERNQSBDaGFubmVsIDEgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExX1hfTU9ESUZZCQkJMHhGRkMwMEM1NAkvKiBETUEgQ2hhbm5lbCAxIFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTFfWV9DT1VOVAkJCTB4RkZDMDBDNTgJLyogRE1BIENoYW5uZWwgMSBZIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTFfWV9NT0RJRlkJCQkweEZGQzAwQzVDCS8qIERNQSBDaGFubmVsIDEgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMV9DVVJSX0RFU0NfUFRSCQkweEZGQzAwQzYwCS8qIERNQSBDaGFubmVsIDEgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMV9DVVJSX0FERFIJCQkweEZGQzAwQzY0CS8qIERNQSBDaGFubmVsIDEgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTFfSVJRX1NUQVRVUwkJCTB4RkZDMDBDNjgJLyogRE1BIENoYW5uZWwgMSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTFfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBDNkMJLyogRE1BIENoYW5uZWwgMSBQZXJpcGhlcmFsIE1hcAlSZWdpc3RlciAqLworI2RlZmluZQlETUExX0NVUlJfWF9DT1VOVAkJMHhGRkMwMEM3MAkvKiBETUEgQ2hhbm5lbCAxIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExX0NVUlJfWV9DT1VOVAkJMHhGRkMwMEM3OAkvKiBETUEgQ2hhbm5lbCAxIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCURNQTJfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEM4MAkvKiBETUEgQ2hhbm5lbCAyIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTJfU1RBUlRfQUREUgkJCTB4RkZDMDBDODQJLyogRE1BIENoYW5uZWwgMiBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTJfQ09ORklHCQkJCTB4RkZDMDBDODgJLyogRE1BIENoYW5uZWwgMiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTJfWF9DT1VOVAkJCTB4RkZDMDBDOTAJLyogRE1BIENoYW5uZWwgMiBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTJfWF9NT0RJRlkJCQkweEZGQzAwQzk0CS8qIERNQSBDaGFubmVsIDIgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMl9ZX0NPVU5UCQkJMHhGRkMwMEM5OAkvKiBETUEgQ2hhbm5lbCAyIFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMl9ZX01PRElGWQkJCTB4RkZDMDBDOUMJLyogRE1BIENoYW5uZWwgMiBZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUEyX0NVUlJfREVTQ19QVFIJCTB4RkZDMDBDQTAJLyogRE1BIENoYW5uZWwgMiBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUEyX0NVUlJfQUREUgkJCTB4RkZDMDBDQTQJLyogRE1BIENoYW5uZWwgMiBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMl9JUlFfU1RBVFVTCQkJMHhGRkMwMENBOAkvKiBETUEgQ2hhbm5lbCAyIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMl9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMENBQwkvKiBETUEgQ2hhbm5lbCAyIFBlcmlwaGVyYWwgTWFwCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTJfQ1VSUl9YX0NPVU5UCQkweEZGQzAwQ0IwCS8qIERNQSBDaGFubmVsIDIgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTJfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwQ0I4CS8qIERNQSBDaGFubmVsIDIgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJRE1BM19ORVhUX0RFU0NfUFRSCQkweEZGQzAwQ0MwCS8qIERNQSBDaGFubmVsIDMgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BM19TVEFSVF9BRERSCQkJMHhGRkMwMENDNAkvKiBETUEgQ2hhbm5lbCAzIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BM19DT05GSUcJCQkJMHhGRkMwMENDOAkvKiBETUEgQ2hhbm5lbCAzIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BM19YX0NPVU5UCQkJMHhGRkMwMENEMAkvKiBETUEgQ2hhbm5lbCAzIFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BM19YX01PRElGWQkJCTB4RkZDMDBDRDQJLyogRE1BIENoYW5uZWwgMyBYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUEzX1lfQ09VTlQJCQkweEZGQzAwQ0Q4CS8qIERNQSBDaGFubmVsIDMgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUEzX1lfTU9ESUZZCQkJMHhGRkMwMENEQwkvKiBETUEgQ2hhbm5lbCAzIFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTNfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMENFMAkvKiBETUEgQ2hhbm5lbCAzIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTNfQ1VSUl9BRERSCQkJMHhGRkMwMENFNAkvKiBETUEgQ2hhbm5lbCAzIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUEzX0lSUV9TVEFUVVMJCQkweEZGQzAwQ0U4CS8qIERNQSBDaGFubmVsIDMgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlETUEzX1BFUklQSEVSQUxfTUFQCQkweEZGQzAwQ0VDCS8qIERNQSBDaGFubmVsIDMgUGVyaXBoZXJhbCBNYXAJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BM19DVVJSX1hfQ09VTlQJCTB4RkZDMDBDRjAJLyogRE1BIENoYW5uZWwgMyBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BM19DVVJSX1lfQ09VTlQJCTB4RkZDMDBDRjgJLyogRE1BIENoYW5uZWwgMyBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlETUE0X05FWFRfREVTQ19QVFIJCTB4RkZDMDBEMDAJLyogRE1BIENoYW5uZWwgNCBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUE0X1NUQVJUX0FERFIJCQkweEZGQzAwRDA0CS8qIERNQSBDaGFubmVsIDQgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUE0X0NPTkZJRwkJCQkweEZGQzAwRDA4CS8qIERNQSBDaGFubmVsIDQgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlETUE0X1hfQ09VTlQJCQkweEZGQzAwRDEwCS8qIERNQSBDaGFubmVsIDQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUE0X1hfTU9ESUZZCQkJMHhGRkMwMEQxNAkvKiBETUEgQ2hhbm5lbCA0IFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTRfWV9DT1VOVAkJCTB4RkZDMDBEMTgJLyogRE1BIENoYW5uZWwgNCBZIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTRfWV9NT0RJRlkJCQkweEZGQzAwRDFDCS8qIERNQSBDaGFubmVsIDQgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNF9DVVJSX0RFU0NfUFRSCQkweEZGQzAwRDIwCS8qIERNQSBDaGFubmVsIDQgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNF9DVVJSX0FERFIJCQkweEZGQzAwRDI0CS8qIERNQSBDaGFubmVsIDQgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTRfSVJRX1NUQVRVUwkJCTB4RkZDMDBEMjgJLyogRE1BIENoYW5uZWwgNCBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTRfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBEMkMJLyogRE1BIENoYW5uZWwgNCBQZXJpcGhlcmFsIE1hcAlSZWdpc3RlciAqLworI2RlZmluZQlETUE0X0NVUlJfWF9DT1VOVAkJMHhGRkMwMEQzMAkvKiBETUEgQ2hhbm5lbCA0IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUE0X0NVUlJfWV9DT1VOVAkJMHhGRkMwMEQzOAkvKiBETUEgQ2hhbm5lbCA0IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCURNQTVfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEQ0MAkvKiBETUEgQ2hhbm5lbCA1IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTVfU1RBUlRfQUREUgkJCTB4RkZDMDBENDQJLyogRE1BIENoYW5uZWwgNSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTVfQ09ORklHCQkJCTB4RkZDMDBENDgJLyogRE1BIENoYW5uZWwgNSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTVfWF9DT1VOVAkJCTB4RkZDMDBENTAJLyogRE1BIENoYW5uZWwgNSBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTVfWF9NT0RJRlkJCQkweEZGQzAwRDU0CS8qIERNQSBDaGFubmVsIDUgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNV9ZX0NPVU5UCQkJMHhGRkMwMEQ1OAkvKiBETUEgQ2hhbm5lbCA1IFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNV9ZX01PRElGWQkJCTB4RkZDMDBENUMJLyogRE1BIENoYW5uZWwgNSBZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUE1X0NVUlJfREVTQ19QVFIJCTB4RkZDMDBENjAJLyogRE1BIENoYW5uZWwgNSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUE1X0NVUlJfQUREUgkJCTB4RkZDMDBENjQJLyogRE1BIENoYW5uZWwgNSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNV9JUlFfU1RBVFVTCQkJMHhGRkMwMEQ2OAkvKiBETUEgQ2hhbm5lbCA1IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNV9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMEQ2QwkvKiBETUEgQ2hhbm5lbCA1IFBlcmlwaGVyYWwgTWFwCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTVfQ1VSUl9YX0NPVU5UCQkweEZGQzAwRDcwCS8qIERNQSBDaGFubmVsIDUgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTVfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwRDc4CS8qIERNQSBDaGFubmVsIDUgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJRE1BNl9ORVhUX0RFU0NfUFRSCQkweEZGQzAwRDgwCS8qIERNQSBDaGFubmVsIDYgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNl9TVEFSVF9BRERSCQkJMHhGRkMwMEQ4NAkvKiBETUEgQ2hhbm5lbCA2IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNl9DT05GSUcJCQkJMHhGRkMwMEQ4OAkvKiBETUEgQ2hhbm5lbCA2IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNl9YX0NPVU5UCQkJMHhGRkMwMEQ5MAkvKiBETUEgQ2hhbm5lbCA2IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNl9YX01PRElGWQkJCTB4RkZDMDBEOTQJLyogRE1BIENoYW5uZWwgNiBYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUE2X1lfQ09VTlQJCQkweEZGQzAwRDk4CS8qIERNQSBDaGFubmVsIDYgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUE2X1lfTU9ESUZZCQkJMHhGRkMwMEQ5QwkvKiBETUEgQ2hhbm5lbCA2IFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTZfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMERBMAkvKiBETUEgQ2hhbm5lbCA2IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTZfQ1VSUl9BRERSCQkJMHhGRkMwMERBNAkvKiBETUEgQ2hhbm5lbCA2IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUE2X0lSUV9TVEFUVVMJCQkweEZGQzAwREE4CS8qIERNQSBDaGFubmVsIDYgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlETUE2X1BFUklQSEVSQUxfTUFQCQkweEZGQzAwREFDCS8qIERNQSBDaGFubmVsIDYgUGVyaXBoZXJhbCBNYXAJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNl9DVVJSX1hfQ09VTlQJCTB4RkZDMDBEQjAJLyogRE1BIENoYW5uZWwgNiBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNl9DVVJSX1lfQ09VTlQJCTB4RkZDMDBEQjgJLyogRE1BIENoYW5uZWwgNiBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlETUE3X05FWFRfREVTQ19QVFIJCTB4RkZDMDBEQzAJLyogRE1BIENoYW5uZWwgNyBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUE3X1NUQVJUX0FERFIJCQkweEZGQzAwREM0CS8qIERNQSBDaGFubmVsIDcgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUE3X0NPTkZJRwkJCQkweEZGQzAwREM4CS8qIERNQSBDaGFubmVsIDcgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlETUE3X1hfQ09VTlQJCQkweEZGQzAwREQwCS8qIERNQSBDaGFubmVsIDcgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUE3X1hfTU9ESUZZCQkJMHhGRkMwMERENAkvKiBETUEgQ2hhbm5lbCA3IFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTdfWV9DT1VOVAkJCTB4RkZDMDBERDgJLyogRE1BIENoYW5uZWwgNyBZIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTdfWV9NT0RJRlkJCQkweEZGQzAwRERDCS8qIERNQSBDaGFubmVsIDcgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BN19DVVJSX0RFU0NfUFRSCQkweEZGQzAwREUwCS8qIERNQSBDaGFubmVsIDcgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BN19DVVJSX0FERFIJCQkweEZGQzAwREU0CS8qIERNQSBDaGFubmVsIDcgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTdfSVJRX1NUQVRVUwkJCTB4RkZDMDBERTgJLyogRE1BIENoYW5uZWwgNyBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTdfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBERUMJLyogRE1BIENoYW5uZWwgNyBQZXJpcGhlcmFsIE1hcAlSZWdpc3RlciAqLworI2RlZmluZQlETUE3X0NVUlJfWF9DT1VOVAkJMHhGRkMwMERGMAkvKiBETUEgQ2hhbm5lbCA3IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUE3X0NVUlJfWV9DT1VOVAkJMHhGRkMwMERGOAkvKiBETUEgQ2hhbm5lbCA3IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCU1ETUEwX0QwX05FWFRfREVTQ19QVFIJMHhGRkMwMEUwMAkvKiBNZW1ETUEwIFN0cmVhbSAwIERlc3RpbmF0aW9uCU5leHQgRGVzY3JpcHRvcglQb2ludGVyCVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX0QwX1NUQVJUX0FERFIJCTB4RkZDMDBFMDQJLyogTWVtRE1BMCBTdHJlYW0gMCBEZXN0aW5hdGlvbglTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX0QwX0NPTkZJRwkJCTB4RkZDMDBFMDgJLyogTWVtRE1BMCBTdHJlYW0gMCBEZXN0aW5hdGlvbglDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX0QwX1hfQ09VTlQJCTB4RkZDMDBFMTAJLyogTWVtRE1BMCBTdHJlYW0gMCBEZXN0aW5hdGlvbglYIENvdW50CVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX0QwX1hfTU9ESUZZCQkweEZGQzAwRTE0CS8qIE1lbURNQTAgU3RyZWFtIDAgRGVzdGluYXRpb24JWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfRDBfWV9DT1VOVAkJMHhGRkMwMEUxOAkvKiBNZW1ETUEwIFN0cmVhbSAwIERlc3RpbmF0aW9uCVkgQ291bnQJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfRDBfWV9NT0RJRlkJCTB4RkZDMDBFMUMJLyogTWVtRE1BMCBTdHJlYW0gMCBEZXN0aW5hdGlvbglZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9EMF9DVVJSX0RFU0NfUFRSCTB4RkZDMDBFMjAJLyogTWVtRE1BMCBTdHJlYW0gMCBEZXN0aW5hdGlvbglDdXJyZW50CURlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9EMF9DVVJSX0FERFIJCTB4RkZDMDBFMjQJLyogTWVtRE1BMCBTdHJlYW0gMCBEZXN0aW5hdGlvbglDdXJyZW50CUFkZHJlc3MJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfRDBfSVJRX1NUQVRVUwkJMHhGRkMwMEUyOAkvKiBNZW1ETUEwIFN0cmVhbSAwIERlc3RpbmF0aW9uCUludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfRDBfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEUyQwkvKiBNZW1ETUEwIFN0cmVhbSAwIERlc3RpbmF0aW9uCVBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX0QwX0NVUlJfWF9DT1VOVAkweEZGQzAwRTMwCS8qIE1lbURNQTAgU3RyZWFtIDAgRGVzdGluYXRpb24JQ3VycmVudAlYIENvdW50CVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX0QwX0NVUlJfWV9DT1VOVAkweEZGQzAwRTM4CS8qIE1lbURNQTAgU3RyZWFtIDAgRGVzdGluYXRpb24JQ3VycmVudAlZIENvdW50CVJlZ2lzdGVyICovCisKKyNkZWZpbmUJTURNQTBfUzBfTkVYVF9ERVNDX1BUUgkweEZGQzAwRTQwCS8qIE1lbURNQTAgU3RyZWFtIDAgU291cmNlIE5leHQJRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX1MwX1NUQVJUX0FERFIJCTB4RkZDMDBFNDQJLyogTWVtRE1BMCBTdHJlYW0gMCBTb3VyY2UgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9TMF9DT05GSUcJCQkweEZGQzAwRTQ4CS8qIE1lbURNQTAgU3RyZWFtIDAgU291cmNlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfUzBfWF9DT1VOVAkJMHhGRkMwMEU1MAkvKiBNZW1ETUEwIFN0cmVhbSAwIFNvdXJjZSBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX1MwX1hfTU9ESUZZCQkweEZGQzAwRTU0CS8qIE1lbURNQTAgU3RyZWFtIDAgU291cmNlIFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX1MwX1lfQ09VTlQJCTB4RkZDMDBFNTgJLyogTWVtRE1BMCBTdHJlYW0gMCBTb3VyY2UgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9TMF9ZX01PRElGWQkJMHhGRkMwMEU1QwkvKiBNZW1ETUEwIFN0cmVhbSAwIFNvdXJjZSBZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9TMF9DVVJSX0RFU0NfUFRSCTB4RkZDMDBFNjAJLyogTWVtRE1BMCBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfUzBfQ1VSUl9BRERSCQkweEZGQzAwRTY0CS8qIE1lbURNQTAgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9TMF9JUlFfU1RBVFVTCQkweEZGQzAwRTY4CS8qIE1lbURNQTAgU3RyZWFtIDAgU291cmNlIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfUzBfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEU2QwkvKiBNZW1ETUEwIFN0cmVhbSAwIFNvdXJjZSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9TMF9DVVJSX1hfQ09VTlQJMHhGRkMwMEU3MAkvKiBNZW1ETUEwIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfUzBfQ1VSUl9ZX0NPVU5UCTB4RkZDMDBFNzgJLyogTWVtRE1BMCBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJTURNQTBfRDFfTkVYVF9ERVNDX1BUUgkweEZGQzAwRTgwCS8qIE1lbURNQTAgU3RyZWFtIDEgRGVzdGluYXRpb24JTmV4dCBEZXNjcmlwdG9yCVBvaW50ZXIJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfRDFfU1RBUlRfQUREUgkJMHhGRkMwMEU4NAkvKiBNZW1ETUEwIFN0cmVhbSAxIERlc3RpbmF0aW9uCVN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfRDFfQ09ORklHCQkJMHhGRkMwMEU4OAkvKiBNZW1ETUEwIFN0cmVhbSAxIERlc3RpbmF0aW9uCUNvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfRDFfWF9DT1VOVAkJMHhGRkMwMEU5MAkvKiBNZW1ETUEwIFN0cmVhbSAxIERlc3RpbmF0aW9uCVggQ291bnQJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfRDFfWF9NT0RJRlkJCTB4RkZDMDBFOTQJLyogTWVtRE1BMCBTdHJlYW0gMSBEZXN0aW5hdGlvbglYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9EMV9ZX0NPVU5UCQkweEZGQzAwRTk4CS8qIE1lbURNQTAgU3RyZWFtIDEgRGVzdGluYXRpb24JWSBDb3VudAlSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9EMV9ZX01PRElGWQkJMHhGRkMwMEU5QwkvKiBNZW1ETUEwIFN0cmVhbSAxIERlc3RpbmF0aW9uCVkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX0QxX0NVUlJfREVTQ19QVFIJMHhGRkMwMEVBMAkvKiBNZW1ETUEwIFN0cmVhbSAxIERlc3RpbmF0aW9uCUN1cnJlbnQJRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX0QxX0NVUlJfQUREUgkJMHhGRkMwMEVBNAkvKiBNZW1ETUEwIFN0cmVhbSAxIERlc3RpbmF0aW9uCUN1cnJlbnQJQWRkcmVzcwlSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9EMV9JUlFfU1RBVFVTCQkweEZGQzAwRUE4CS8qIE1lbURNQTAgU3RyZWFtIDEgRGVzdGluYXRpb24JSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9EMV9QRVJJUEhFUkFMX01BUAkweEZGQzAwRUFDCS8qIE1lbURNQTAgU3RyZWFtIDEgRGVzdGluYXRpb24JUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfRDFfQ1VSUl9YX0NPVU5UCTB4RkZDMDBFQjAJLyogTWVtRE1BMCBTdHJlYW0gMSBEZXN0aW5hdGlvbglDdXJyZW50CVggQ291bnQJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfRDFfQ1VSUl9ZX0NPVU5UCTB4RkZDMDBFQjgJLyogTWVtRE1BMCBTdHJlYW0gMSBEZXN0aW5hdGlvbglDdXJyZW50CVkgQ291bnQJUmVnaXN0ZXIgKi8KKworI2RlZmluZQlNRE1BMF9TMV9ORVhUX0RFU0NfUFRSCTB4RkZDMDBFQzAJLyogTWVtRE1BMCBTdHJlYW0gMSBTb3VyY2UgTmV4dAlEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfUzFfU1RBUlRfQUREUgkJMHhGRkMwMEVDNAkvKiBNZW1ETUEwIFN0cmVhbSAxIFNvdXJjZSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX1MxX0NPTkZJRwkJCTB4RkZDMDBFQzgJLyogTWVtRE1BMCBTdHJlYW0gMSBTb3VyY2UgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9TMV9YX0NPVU5UCQkweEZGQzAwRUQwCS8qIE1lbURNQTAgU3RyZWFtIDEgU291cmNlIFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfUzFfWF9NT0RJRlkJCTB4RkZDMDBFRDQJLyogTWVtRE1BMCBTdHJlYW0gMSBTb3VyY2UgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfUzFfWV9DT1VOVAkJMHhGRkMwMEVEOAkvKiBNZW1ETUEwIFN0cmVhbSAxIFNvdXJjZSBZIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX1MxX1lfTU9ESUZZCQkweEZGQzAwRURDCS8qIE1lbURNQTAgU3RyZWFtIDEgU291cmNlIFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX1MxX0NVUlJfREVTQ19QVFIJMHhGRkMwMEVFMAkvKiBNZW1ETUEwIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9TMV9DVVJSX0FERFIJCTB4RkZDMDBFRTQJLyogTWVtRE1BMCBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX1MxX0lSUV9TVEFUVVMJCTB4RkZDMDBFRTgJLyogTWVtRE1BMCBTdHJlYW0gMSBTb3VyY2UgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9TMV9QRVJJUEhFUkFMX01BUAkweEZGQzAwRUVDCS8qIE1lbURNQTAgU3RyZWFtIDEgU291cmNlIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX1MxX0NVUlJfWF9DT1VOVAkweEZGQzAwRUYwCS8qIE1lbURNQTAgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9TMV9DVVJSX1lfQ09VTlQJMHhGRkMwMEVGOAkvKiBNZW1ETUEwIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworCisvKiBQYXJhbGxlbCBQZXJpcGhlcmFsIEludGVyZmFjZSAoUFBJKSAoMHhGRkMwMTAwMCAtIDB4RkZDMDEwRkYpICovCisjZGVmaW5lCVBQSV9DT05UUk9MCQkJMHhGRkMwMTAwMAkvKiBQUEkgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQlQUElfU1RBVFVTCQkJMHhGRkMwMTAwNAkvKiBQUEkgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCVBQSV9DT1VOVAkJCTB4RkZDMDEwMDgJLyogUFBJIFRyYW5zZmVyCUNvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCVBQSV9ERUxBWQkJCTB4RkZDMDEwMEMJLyogUFBJIERlbGF5IENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCVBQSV9GUkFNRQkJCTB4RkZDMDEwMTAJLyogUFBJIEZyYW1lIExlbmd0aCBSZWdpc3RlciAqLworCisKKy8qIFR3by1XaXJlIEludGVyZmFjZSAwCSgweEZGQzAxNDAwIC0gMHhGRkMwMTRGRikJCQkgKi8KKyNkZWZpbmUJVFdJMF9DTEtESVYJCQkweEZGQzAxNDAwCS8qIFNlcmlhbCBDbG9jawlEaXZpZGVyCVJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTBfQ09OVFJPTAkJMHhGRkMwMTQwNAkvKiBUV0kwCU1hc3RlciBJbnRlcm5hbAlUaW1lIFJlZmVyZW5jZSBSZWdpc3RlciAqLworI2RlZmluZQlUV0kwX1NMQVZFX0NUUkwJCTB4RkZDMDE0MDgJLyogU2xhdmUgTW9kZSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTBfU0xBVkVfU1RBVAkJMHhGRkMwMTQwQwkvKiBTbGF2ZSBNb2RlIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlUV0kwX1NMQVZFX0FERFIJCTB4RkZDMDE0MTAJLyogU2xhdmUgTW9kZSBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTBfTUFTVEVSX0NUUkwJMHhGRkMwMTQxNAkvKiBNYXN0ZXIgTW9kZSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTBfTUFTVEVSX1NUQVQJMHhGRkMwMTQxOAkvKiBNYXN0ZXIgTW9kZSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMF9NQVNURVJfQUREUgkweEZGQzAxNDFDCS8qIE1hc3RlciBNb2RlIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMF9JTlRfU1RBVAkJMHhGRkMwMTQyMAkvKiBUV0kwCU1hc3RlciBJbnRlcnJ1cHQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMF9JTlRfTUFTSwkJMHhGRkMwMTQyNAkvKiBUV0kwCU1hc3RlciBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworI2RlZmluZQlUV0kwX0ZJRk9fQ1RSTAkJMHhGRkMwMTQyOAkvKiBGSUZPCUNvbnRyb2wJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMF9GSUZPX1NUQVQJCTB4RkZDMDE0MkMJLyogRklGTwlTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMF9YTVRfREFUQTgJCTB4RkZDMDE0ODAJLyogRklGTwlUcmFuc21pdCBEYXRhIFNpbmdsZSBCeXRlIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTBfWE1UX0RBVEExNgkJMHhGRkMwMTQ4NAkvKiBGSUZPCVRyYW5zbWl0IERhdGEgRG91YmxlIEJ5dGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMF9SQ1ZfREFUQTgJCTB4RkZDMDE0ODgJLyogRklGTwlSZWNlaXZlCURhdGEgU2luZ2xlIEJ5dGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMF9SQ1ZfREFUQTE2CQkweEZGQzAxNDhDCS8qIEZJRk8JUmVjZWl2ZQlEYXRhIERvdWJsZSBCeXRlIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgVFdJMF9SRUdCQVNFCQlUV0kwX0NMS0RJVgorCisvKiB0aGUgZm9sbG93aW5nIGFyZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUJVFdJMF9QUkVTQ0FMRQkgVFdJMF9DT05UUk9MCisjZGVmaW5lCVRXSTBfSU5UX1NSQwkgVFdJMF9JTlRfU1RBVAorI2RlZmluZQlUV0kwX0lOVF9FTkFCTEUJIFRXSTBfSU5UX01BU0sKKworCisvKiBHZW5lcmFsLVB1cnBvc2UgUG9ydHMgICgweEZGQzAxNTAwIC0JMHhGRkMwMTVGRikJICovCisKKy8qIEdQSU8JUG9ydCBDIFJlZ2lzdGVyCU5hbWVzICovCisjZGVmaW5lCUdQSU9fQ19DTkZHCQkJMHhGRkMwMTUwMAkvKiBHUElPCVBpbiBQb3J0IEMgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlHUElPX0NfRAkJCTB4RkZDMDE1MTAJLyogR1BJTwlQaW4gUG9ydCBDIERhdGEJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJR1BJT19DX0MJCQkweEZGQzAxNTIwCS8qIENsZWFyIEdQSU8gUGluIFBvcnQgQyBSZWdpc3RlciAqLworI2RlZmluZQlHUElPX0NfUwkJCTB4RkZDMDE1MzAJLyogU2V0IEdQSU8gUGluCVBvcnQgQyBSZWdpc3RlciAqLworI2RlZmluZQlHUElPX0NfVAkJCTB4RkZDMDE1NDAJLyogVG9nZ2xlIEdQSU8gUGluIFBvcnQJQyBSZWdpc3RlciAqLworI2RlZmluZQlHUElPX0NfRElSCQkJMHhGRkMwMTU1MAkvKiBHUElPCVBpbiBQb3J0IEMgRGlyZWN0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCUdQSU9fQ19JTkVOCQkJMHhGRkMwMTU2MAkvKiBHUElPCVBpbiBQb3J0IEMgSW5wdXQgRW5hYmxlCVJlZ2lzdGVyICovCisKKy8qIEdQSU8JUG9ydCBEIFJlZ2lzdGVyCU5hbWVzICovCisjZGVmaW5lCUdQSU9fRF9DTkZHCQkJMHhGRkMwMTUwNAkvKiBHUElPCVBpbiBQb3J0IEQgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlHUElPX0RfRAkJCTB4RkZDMDE1MTQJLyogR1BJTwlQaW4gUG9ydCBEIERhdGEJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJR1BJT19EX0MJCQkweEZGQzAxNTI0CS8qIENsZWFyIEdQSU8gUGluIFBvcnQgRCBSZWdpc3RlciAqLworI2RlZmluZQlHUElPX0RfUwkJCTB4RkZDMDE1MzQJLyogU2V0IEdQSU8gUGluCVBvcnQgRCBSZWdpc3RlciAqLworI2RlZmluZQlHUElPX0RfVAkJCTB4RkZDMDE1NDQJLyogVG9nZ2xlIEdQSU8gUGluIFBvcnQJRCBSZWdpc3RlciAqLworI2RlZmluZQlHUElPX0RfRElSCQkJMHhGRkMwMTU1NAkvKiBHUElPCVBpbiBQb3J0IEQgRGlyZWN0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCUdQSU9fRF9JTkVOCQkJMHhGRkMwMTU2NAkvKiBHUElPCVBpbiBQb3J0IEQgSW5wdXQgRW5hYmxlCVJlZ2lzdGVyICovCisKKy8qIEdQSU8JUG9ydCBFIFJlZ2lzdGVyCU5hbWVzICovCisjZGVmaW5lCUdQSU9fRV9DTkZHCQkJMHhGRkMwMTUwOAkvKiBHUElPCVBpbiBQb3J0IEUgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlHUElPX0VfRAkJCTB4RkZDMDE1MTgJLyogR1BJTwlQaW4gUG9ydCBFIERhdGEJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJR1BJT19FX0MJCQkweEZGQzAxNTI4CS8qIENsZWFyIEdQSU8gUGluIFBvcnQgRSBSZWdpc3RlciAqLworI2RlZmluZQlHUElPX0VfUwkJCTB4RkZDMDE1MzgJLyogU2V0IEdQSU8gUGluCVBvcnQgRSBSZWdpc3RlciAqLworI2RlZmluZQlHUElPX0VfVAkJCTB4RkZDMDE1NDgJLyogVG9nZ2xlIEdQSU8gUGluIFBvcnQJRSBSZWdpc3RlciAqLworI2RlZmluZQlHUElPX0VfRElSCQkJMHhGRkMwMTU1OAkvKiBHUElPCVBpbiBQb3J0IEUgRGlyZWN0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCUdQSU9fRV9JTkVOCQkJMHhGRkMwMTU2OAkvKiBHUElPCVBpbiBQb3J0IEUgSW5wdXQgRW5hYmxlCVJlZ2lzdGVyICovCisKKy8qIERNQSBDb250cm9sbGVyIDEgVHJhZmZpYyBDb250cm9sIFJlZ2lzdGVycyAoMHhGRkMwMUIwMCAtIDB4RkZDMDFCRkYpICovCisKKyNkZWZpbmUJRE1BQzFfVENfUEVSCQkJMHhGRkMwMUIwQwkvKiBETUEgQ29udHJvbGxlciAxIFRyYWZmaWMgQ29udHJvbCBQZXJpb2RzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQUMxX1RDX0NOVAkJCTB4RkZDMDFCMTAJLyogRE1BIENvbnRyb2xsZXIgMSBUcmFmZmljIENvbnRyb2wgQ3VycmVudCBDb3VudHMgUmVnaXN0ZXIgKi8KKworLyogQWx0ZXJuYXRlIGRlcHJlY2F0ZWQJcmVnaXN0ZXIgbmFtZXMgKGJlbG93KSBwcm92aWRlZAlmb3IgYmFja3dhcmRzIGNvZGUgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZQlETUExX1RDUEVSCQkJRE1BQzFfVENfUEVSCisjZGVmaW5lCURNQTFfVENDTlQJCQlETUFDMV9UQ19DTlQKKworCisvKiBETUEgQ29udHJvbGxlciAxICgweEZGQzAxQzAwCS0gMHhGRkMwMUZGRikJCQkJCQkJICovCisjZGVmaW5lCURNQThfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMUMwMAkvKiBETUEgQ2hhbm5lbCA4IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQThfU1RBUlRfQUREUgkJCTB4RkZDMDFDMDQJLyogRE1BIENoYW5uZWwgOCBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQThfQ09ORklHCQkJCTB4RkZDMDFDMDgJLyogRE1BIENoYW5uZWwgOCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQThfWF9DT1VOVAkJCTB4RkZDMDFDMTAJLyogRE1BIENoYW5uZWwgOCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQThfWF9NT0RJRlkJCQkweEZGQzAxQzE0CS8qIERNQSBDaGFubmVsIDggWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOF9ZX0NPVU5UCQkJMHhGRkMwMUMxOAkvKiBETUEgQ2hhbm5lbCA4IFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOF9ZX01PRElGWQkJCTB4RkZDMDFDMUMJLyogRE1BIENoYW5uZWwgOCBZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUE4X0NVUlJfREVTQ19QVFIJCTB4RkZDMDFDMjAJLyogRE1BIENoYW5uZWwgOCBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUE4X0NVUlJfQUREUgkJCTB4RkZDMDFDMjQJLyogRE1BIENoYW5uZWwgOCBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOF9JUlFfU1RBVFVTCQkJMHhGRkMwMUMyOAkvKiBETUEgQ2hhbm5lbCA4IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOF9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMUMyQwkvKiBETUEgQ2hhbm5lbCA4IFBlcmlwaGVyYWwgTWFwCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQThfQ1VSUl9YX0NPVU5UCQkweEZGQzAxQzMwCS8qIERNQSBDaGFubmVsIDggQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQThfQ1VSUl9ZX0NPVU5UCQkweEZGQzAxQzM4CS8qIERNQSBDaGFubmVsIDggQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJRE1BOV9ORVhUX0RFU0NfUFRSCQkweEZGQzAxQzQwCS8qIERNQSBDaGFubmVsIDkgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOV9TVEFSVF9BRERSCQkJMHhGRkMwMUM0NAkvKiBETUEgQ2hhbm5lbCA5IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOV9DT05GSUcJCQkJMHhGRkMwMUM0OAkvKiBETUEgQ2hhbm5lbCA5IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOV9YX0NPVU5UCQkJMHhGRkMwMUM1MAkvKiBETUEgQ2hhbm5lbCA5IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOV9YX01PRElGWQkJCTB4RkZDMDFDNTQJLyogRE1BIENoYW5uZWwgOSBYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUE5X1lfQ09VTlQJCQkweEZGQzAxQzU4CS8qIERNQSBDaGFubmVsIDkgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUE5X1lfTU9ESUZZCQkJMHhGRkMwMUM1QwkvKiBETUEgQ2hhbm5lbCA5IFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTlfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMUM2MAkvKiBETUEgQ2hhbm5lbCA5IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTlfQ1VSUl9BRERSCQkJMHhGRkMwMUM2NAkvKiBETUEgQ2hhbm5lbCA5IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUE5X0lSUV9TVEFUVVMJCQkweEZGQzAxQzY4CS8qIERNQSBDaGFubmVsIDkgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlETUE5X1BFUklQSEVSQUxfTUFQCQkweEZGQzAxQzZDCS8qIERNQSBDaGFubmVsIDkgUGVyaXBoZXJhbCBNYXAJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOV9DVVJSX1hfQ09VTlQJCTB4RkZDMDFDNzAJLyogRE1BIENoYW5uZWwgOSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOV9DVVJSX1lfQ09VTlQJCTB4RkZDMDFDNzgJLyogRE1BIENoYW5uZWwgOSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlETUExMF9ORVhUX0RFU0NfUFRSCQkweEZGQzAxQzgwCS8qIERNQSBDaGFubmVsIDEwIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEwX1NUQVJUX0FERFIJCTB4RkZDMDFDODQJLyogRE1BIENoYW5uZWwgMTAgU3RhcnQJQWRkcmVzcwlSZWdpc3RlciAqLworI2RlZmluZQlETUExMF9DT05GSUcJCQkweEZGQzAxQzg4CS8qIERNQSBDaGFubmVsIDEwIENvbmZpZ3VyYXRpb24JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTBfWF9DT1VOVAkJCTB4RkZDMDFDOTAJLyogRE1BIENoYW5uZWwgMTAgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExMF9YX01PRElGWQkJCTB4RkZDMDFDOTQJLyogRE1BIENoYW5uZWwgMTAgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTBfWV9DT1VOVAkJCTB4RkZDMDFDOTgJLyogRE1BIENoYW5uZWwgMTAgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExMF9ZX01PRElGWQkJCTB4RkZDMDFDOUMJLyogRE1BIENoYW5uZWwgMTAgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTBfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMUNBMAkvKiBETUEgQ2hhbm5lbCAxMCBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExMF9DVVJSX0FERFIJCQkweEZGQzAxQ0E0CS8qIERNQSBDaGFubmVsIDEwIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUExMF9JUlFfU1RBVFVTCQkweEZGQzAxQ0E4CS8qIERNQSBDaGFubmVsIDEwIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTBfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMUNBQwkvKiBETUEgQ2hhbm5lbCAxMCBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLworI2RlZmluZQlETUExMF9DVVJSX1hfQ09VTlQJCTB4RkZDMDFDQjAJLyogRE1BIENoYW5uZWwgMTAgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEwX0NVUlJfWV9DT1VOVAkJMHhGRkMwMUNCOAkvKiBETUEgQ2hhbm5lbCAxMCBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlETUExMV9ORVhUX0RFU0NfUFRSCQkweEZGQzAxQ0MwCS8qIERNQSBDaGFubmVsIDExIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTExX1NUQVJUX0FERFIJCTB4RkZDMDFDQzQJLyogRE1BIENoYW5uZWwgMTEgU3RhcnQJQWRkcmVzcwlSZWdpc3RlciAqLworI2RlZmluZQlETUExMV9DT05GSUcJCQkweEZGQzAxQ0M4CS8qIERNQSBDaGFubmVsIDExIENvbmZpZ3VyYXRpb24JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTFfWF9DT1VOVAkJCTB4RkZDMDFDRDAJLyogRE1BIENoYW5uZWwgMTEgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExMV9YX01PRElGWQkJCTB4RkZDMDFDRDQJLyogRE1BIENoYW5uZWwgMTEgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTFfWV9DT1VOVAkJCTB4RkZDMDFDRDgJLyogRE1BIENoYW5uZWwgMTEgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExMV9ZX01PRElGWQkJCTB4RkZDMDFDREMJLyogRE1BIENoYW5uZWwgMTEgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTFfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMUNFMAkvKiBETUEgQ2hhbm5lbCAxMSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExMV9DVVJSX0FERFIJCQkweEZGQzAxQ0U0CS8qIERNQSBDaGFubmVsIDExIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUExMV9JUlFfU1RBVFVTCQkweEZGQzAxQ0U4CS8qIERNQSBDaGFubmVsIDExIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTFfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMUNFQwkvKiBETUEgQ2hhbm5lbCAxMSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLworI2RlZmluZQlETUExMV9DVVJSX1hfQ09VTlQJCTB4RkZDMDFDRjAJLyogRE1BIENoYW5uZWwgMTEgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTExX0NVUlJfWV9DT1VOVAkJMHhGRkMwMUNGOAkvKiBETUEgQ2hhbm5lbCAxMSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlETUExMl9ORVhUX0RFU0NfUFRSCQkweEZGQzAxRDAwCS8qIERNQSBDaGFubmVsIDEyIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEyX1NUQVJUX0FERFIJCTB4RkZDMDFEMDQJLyogRE1BIENoYW5uZWwgMTIgU3RhcnQJQWRkcmVzcwlSZWdpc3RlciAqLworI2RlZmluZQlETUExMl9DT05GSUcJCQkweEZGQzAxRDA4CS8qIERNQSBDaGFubmVsIDEyIENvbmZpZ3VyYXRpb24JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTJfWF9DT1VOVAkJCTB4RkZDMDFEMTAJLyogRE1BIENoYW5uZWwgMTIgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExMl9YX01PRElGWQkJCTB4RkZDMDFEMTQJLyogRE1BIENoYW5uZWwgMTIgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTJfWV9DT1VOVAkJCTB4RkZDMDFEMTgJLyogRE1BIENoYW5uZWwgMTIgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExMl9ZX01PRElGWQkJCTB4RkZDMDFEMUMJLyogRE1BIENoYW5uZWwgMTIgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTJfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMUQyMAkvKiBETUEgQ2hhbm5lbCAxMiBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExMl9DVVJSX0FERFIJCQkweEZGQzAxRDI0CS8qIERNQSBDaGFubmVsIDEyIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUExMl9JUlFfU1RBVFVTCQkweEZGQzAxRDI4CS8qIERNQSBDaGFubmVsIDEyIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTJfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMUQyQwkvKiBETUEgQ2hhbm5lbCAxMiBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLworI2RlZmluZQlETUExMl9DVVJSX1hfQ09VTlQJCTB4RkZDMDFEMzAJLyogRE1BIENoYW5uZWwgMTIgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEyX0NVUlJfWV9DT1VOVAkJMHhGRkMwMUQzOAkvKiBETUEgQ2hhbm5lbCAxMiBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlETUExM19ORVhUX0RFU0NfUFRSCQkweEZGQzAxRDQwCS8qIERNQSBDaGFubmVsIDEzIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEzX1NUQVJUX0FERFIJCTB4RkZDMDFENDQJLyogRE1BIENoYW5uZWwgMTMgU3RhcnQJQWRkcmVzcwlSZWdpc3RlciAqLworI2RlZmluZQlETUExM19DT05GSUcJCQkweEZGQzAxRDQ4CS8qIERNQSBDaGFubmVsIDEzIENvbmZpZ3VyYXRpb24JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTNfWF9DT1VOVAkJCTB4RkZDMDFENTAJLyogRE1BIENoYW5uZWwgMTMgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExM19YX01PRElGWQkJCTB4RkZDMDFENTQJLyogRE1BIENoYW5uZWwgMTMgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTNfWV9DT1VOVAkJCTB4RkZDMDFENTgJLyogRE1BIENoYW5uZWwgMTMgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExM19ZX01PRElGWQkJCTB4RkZDMDFENUMJLyogRE1BIENoYW5uZWwgMTMgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTNfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMUQ2MAkvKiBETUEgQ2hhbm5lbCAxMyBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExM19DVVJSX0FERFIJCQkweEZGQzAxRDY0CS8qIERNQSBDaGFubmVsIDEzIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUExM19JUlFfU1RBVFVTCQkweEZGQzAxRDY4CS8qIERNQSBDaGFubmVsIDEzIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTNfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMUQ2QwkvKiBETUEgQ2hhbm5lbCAxMyBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLworI2RlZmluZQlETUExM19DVVJSX1hfQ09VTlQJCTB4RkZDMDFENzAJLyogRE1BIENoYW5uZWwgMTMgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEzX0NVUlJfWV9DT1VOVAkJMHhGRkMwMUQ3OAkvKiBETUEgQ2hhbm5lbCAxMyBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlETUExNF9ORVhUX0RFU0NfUFRSCQkweEZGQzAxRDgwCS8qIERNQSBDaGFubmVsIDE0IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE0X1NUQVJUX0FERFIJCTB4RkZDMDFEODQJLyogRE1BIENoYW5uZWwgMTQgU3RhcnQJQWRkcmVzcwlSZWdpc3RlciAqLworI2RlZmluZQlETUExNF9DT05GSUcJCQkweEZGQzAxRDg4CS8qIERNQSBDaGFubmVsIDE0IENvbmZpZ3VyYXRpb24JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTRfWF9DT1VOVAkJCTB4RkZDMDFEOTAJLyogRE1BIENoYW5uZWwgMTQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExNF9YX01PRElGWQkJCTB4RkZDMDFEOTQJLyogRE1BIENoYW5uZWwgMTQgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTRfWV9DT1VOVAkJCTB4RkZDMDFEOTgJLyogRE1BIENoYW5uZWwgMTQgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExNF9ZX01PRElGWQkJCTB4RkZDMDFEOUMJLyogRE1BIENoYW5uZWwgMTQgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTRfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMURBMAkvKiBETUEgQ2hhbm5lbCAxNCBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExNF9DVVJSX0FERFIJCQkweEZGQzAxREE0CS8qIERNQSBDaGFubmVsIDE0IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUExNF9JUlFfU1RBVFVTCQkweEZGQzAxREE4CS8qIERNQSBDaGFubmVsIDE0IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTRfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMURBQwkvKiBETUEgQ2hhbm5lbCAxNCBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLworI2RlZmluZQlETUExNF9DVVJSX1hfQ09VTlQJCTB4RkZDMDFEQjAJLyogRE1BIENoYW5uZWwgMTQgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE0X0NVUlJfWV9DT1VOVAkJMHhGRkMwMURCOAkvKiBETUEgQ2hhbm5lbCAxNCBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlETUExNV9ORVhUX0RFU0NfUFRSCQkweEZGQzAxREMwCS8qIERNQSBDaGFubmVsIDE1IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE1X1NUQVJUX0FERFIJCTB4RkZDMDFEQzQJLyogRE1BIENoYW5uZWwgMTUgU3RhcnQJQWRkcmVzcwlSZWdpc3RlciAqLworI2RlZmluZQlETUExNV9DT05GSUcJCQkweEZGQzAxREM4CS8qIERNQSBDaGFubmVsIDE1IENvbmZpZ3VyYXRpb24JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTVfWF9DT1VOVAkJCTB4RkZDMDFERDAJLyogRE1BIENoYW5uZWwgMTUgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExNV9YX01PRElGWQkJCTB4RkZDMDFERDQJLyogRE1BIENoYW5uZWwgMTUgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTVfWV9DT1VOVAkJCTB4RkZDMDFERDgJLyogRE1BIENoYW5uZWwgMTUgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExNV9ZX01PRElGWQkJCTB4RkZDMDFEREMJLyogRE1BIENoYW5uZWwgMTUgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTVfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMURFMAkvKiBETUEgQ2hhbm5lbCAxNSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExNV9DVVJSX0FERFIJCQkweEZGQzAxREU0CS8qIERNQSBDaGFubmVsIDE1IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUExNV9JUlFfU1RBVFVTCQkweEZGQzAxREU4CS8qIERNQSBDaGFubmVsIDE1IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTVfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMURFQwkvKiBETUEgQ2hhbm5lbCAxNSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLworI2RlZmluZQlETUExNV9DVVJSX1hfQ09VTlQJCTB4RkZDMDFERjAJLyogRE1BIENoYW5uZWwgMTUgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE1X0NVUlJfWV9DT1VOVAkJMHhGRkMwMURGOAkvKiBETUEgQ2hhbm5lbCAxNSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlETUExNl9ORVhUX0RFU0NfUFRSCQkweEZGQzAxRTAwCS8qIERNQSBDaGFubmVsIDE2IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE2X1NUQVJUX0FERFIJCTB4RkZDMDFFMDQJLyogRE1BIENoYW5uZWwgMTYgU3RhcnQJQWRkcmVzcwlSZWdpc3RlciAqLworI2RlZmluZQlETUExNl9DT05GSUcJCQkweEZGQzAxRTA4CS8qIERNQSBDaGFubmVsIDE2IENvbmZpZ3VyYXRpb24JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTZfWF9DT1VOVAkJCTB4RkZDMDFFMTAJLyogRE1BIENoYW5uZWwgMTYgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExNl9YX01PRElGWQkJCTB4RkZDMDFFMTQJLyogRE1BIENoYW5uZWwgMTYgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTZfWV9DT1VOVAkJCTB4RkZDMDFFMTgJLyogRE1BIENoYW5uZWwgMTYgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExNl9ZX01PRElGWQkJCTB4RkZDMDFFMUMJLyogRE1BIENoYW5uZWwgMTYgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTZfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMUUyMAkvKiBETUEgQ2hhbm5lbCAxNiBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExNl9DVVJSX0FERFIJCQkweEZGQzAxRTI0CS8qIERNQSBDaGFubmVsIDE2IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUExNl9JUlFfU1RBVFVTCQkweEZGQzAxRTI4CS8qIERNQSBDaGFubmVsIDE2IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTZfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMUUyQwkvKiBETUEgQ2hhbm5lbCAxNiBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLworI2RlZmluZQlETUExNl9DVVJSX1hfQ09VTlQJCTB4RkZDMDFFMzAJLyogRE1BIENoYW5uZWwgMTYgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE2X0NVUlJfWV9DT1VOVAkJMHhGRkMwMUUzOAkvKiBETUEgQ2hhbm5lbCAxNiBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlETUExN19ORVhUX0RFU0NfUFRSCQkweEZGQzAxRTQwCS8qIERNQSBDaGFubmVsIDE3IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE3X1NUQVJUX0FERFIJCTB4RkZDMDFFNDQJLyogRE1BIENoYW5uZWwgMTcgU3RhcnQJQWRkcmVzcwlSZWdpc3RlciAqLworI2RlZmluZQlETUExN19DT05GSUcJCQkweEZGQzAxRTQ4CS8qIERNQSBDaGFubmVsIDE3IENvbmZpZ3VyYXRpb24JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTdfWF9DT1VOVAkJCTB4RkZDMDFFNTAJLyogRE1BIENoYW5uZWwgMTcgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExN19YX01PRElGWQkJCTB4RkZDMDFFNTQJLyogRE1BIENoYW5uZWwgMTcgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTdfWV9DT1VOVAkJCTB4RkZDMDFFNTgJLyogRE1BIENoYW5uZWwgMTcgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExN19ZX01PRElGWQkJCTB4RkZDMDFFNUMJLyogRE1BIENoYW5uZWwgMTcgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTdfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMUU2MAkvKiBETUEgQ2hhbm5lbCAxNyBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExN19DVVJSX0FERFIJCQkweEZGQzAxRTY0CS8qIERNQSBDaGFubmVsIDE3IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUExN19JUlFfU1RBVFVTCQkweEZGQzAxRTY4CS8qIERNQSBDaGFubmVsIDE3IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTdfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMUU2QwkvKiBETUEgQ2hhbm5lbCAxNyBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLworI2RlZmluZQlETUExN19DVVJSX1hfQ09VTlQJCTB4RkZDMDFFNzAJLyogRE1BIENoYW5uZWwgMTcgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE3X0NVUlJfWV9DT1VOVAkJMHhGRkMwMUU3OAkvKiBETUEgQ2hhbm5lbCAxNyBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlETUExOF9ORVhUX0RFU0NfUFRSCQkweEZGQzAxRTgwCS8qIERNQSBDaGFubmVsIDE4IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE4X1NUQVJUX0FERFIJCTB4RkZDMDFFODQJLyogRE1BIENoYW5uZWwgMTggU3RhcnQJQWRkcmVzcwlSZWdpc3RlciAqLworI2RlZmluZQlETUExOF9DT05GSUcJCQkweEZGQzAxRTg4CS8qIERNQSBDaGFubmVsIDE4IENvbmZpZ3VyYXRpb24JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMThfWF9DT1VOVAkJCTB4RkZDMDFFOTAJLyogRE1BIENoYW5uZWwgMTggWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExOF9YX01PRElGWQkJCTB4RkZDMDFFOTQJLyogRE1BIENoYW5uZWwgMTggWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMThfWV9DT1VOVAkJCTB4RkZDMDFFOTgJLyogRE1BIENoYW5uZWwgMTggWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExOF9ZX01PRElGWQkJCTB4RkZDMDFFOUMJLyogRE1BIENoYW5uZWwgMTggWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMThfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMUVBMAkvKiBETUEgQ2hhbm5lbCAxOCBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExOF9DVVJSX0FERFIJCQkweEZGQzAxRUE0CS8qIERNQSBDaGFubmVsIDE4IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUExOF9JUlFfU1RBVFVTCQkweEZGQzAxRUE4CS8qIERNQSBDaGFubmVsIDE4IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMThfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMUVBQwkvKiBETUEgQ2hhbm5lbCAxOCBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLworI2RlZmluZQlETUExOF9DVVJSX1hfQ09VTlQJCTB4RkZDMDFFQjAJLyogRE1BIENoYW5uZWwgMTggQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE4X0NVUlJfWV9DT1VOVAkJMHhGRkMwMUVCOAkvKiBETUEgQ2hhbm5lbCAxOCBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlETUExOV9ORVhUX0RFU0NfUFRSCQkweEZGQzAxRUMwCS8qIERNQSBDaGFubmVsIDE5IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE5X1NUQVJUX0FERFIJCTB4RkZDMDFFQzQJLyogRE1BIENoYW5uZWwgMTkgU3RhcnQJQWRkcmVzcwlSZWdpc3RlciAqLworI2RlZmluZQlETUExOV9DT05GSUcJCQkweEZGQzAxRUM4CS8qIERNQSBDaGFubmVsIDE5IENvbmZpZ3VyYXRpb24JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTlfWF9DT1VOVAkJCTB4RkZDMDFFRDAJLyogRE1BIENoYW5uZWwgMTkgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExOV9YX01PRElGWQkJCTB4RkZDMDFFRDQJLyogRE1BIENoYW5uZWwgMTkgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTlfWV9DT1VOVAkJCTB4RkZDMDFFRDgJLyogRE1BIENoYW5uZWwgMTkgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExOV9ZX01PRElGWQkJCTB4RkZDMDFFREMJLyogRE1BIENoYW5uZWwgMTkgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTlfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMUVFMAkvKiBETUEgQ2hhbm5lbCAxOSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExOV9DVVJSX0FERFIJCQkweEZGQzAxRUU0CS8qIERNQSBDaGFubmVsIDE5IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUExOV9JUlFfU1RBVFVTCQkweEZGQzAxRUU4CS8qIERNQSBDaGFubmVsIDE5IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTlfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMUVFQwkvKiBETUEgQ2hhbm5lbCAxOSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLworI2RlZmluZQlETUExOV9DVVJSX1hfQ09VTlQJCTB4RkZDMDFFRjAJLyogRE1BIENoYW5uZWwgMTkgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE5X0NVUlJfWV9DT1VOVAkJMHhGRkMwMUVGOAkvKiBETUEgQ2hhbm5lbCAxOSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlNRE1BMV9EMF9ORVhUX0RFU0NfUFRSCTB4RkZDMDFGMDAJLyogTWVtRE1BMSBTdHJlYW0gMCBEZXN0aW5hdGlvbglOZXh0IERlc2NyaXB0b3IJUG9pbnRlcglSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9EMF9TVEFSVF9BRERSCQkweEZGQzAxRjA0CS8qIE1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24JU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9EMF9DT05GSUcJCQkweEZGQzAxRjA4CS8qIE1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24JQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9EMF9YX0NPVU5UCQkweEZGQzAxRjEwCS8qIE1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24JWCBDb3VudAlSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9EMF9YX01PRElGWQkJMHhGRkMwMUYxNAkvKiBNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uCVggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX0QwX1lfQ09VTlQJCTB4RkZDMDFGMTgJLyogTWVtRE1BMSBTdHJlYW0gMCBEZXN0aW5hdGlvbglZIENvdW50CVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX0QwX1lfTU9ESUZZCQkweEZGQzAxRjFDCS8qIE1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24JWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfRDBfQ1VSUl9ERVNDX1BUUgkweEZGQzAxRjIwCS8qIE1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24JQ3VycmVudAlEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfRDBfQ1VSUl9BRERSCQkweEZGQzAxRjI0CS8qIE1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24JQ3VycmVudAlBZGRyZXNzCVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX0QwX0lSUV9TVEFUVVMJCTB4RkZDMDFGMjgJLyogTWVtRE1BMSBTdHJlYW0gMCBEZXN0aW5hdGlvbglJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX0QwX1BFUklQSEVSQUxfTUFQCTB4RkZDMDFGMkMJLyogTWVtRE1BMSBTdHJlYW0gMCBEZXN0aW5hdGlvbglQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9EMF9DVVJSX1hfQ09VTlQJMHhGRkMwMUYzMAkvKiBNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uCUN1cnJlbnQJWCBDb3VudAlSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9EMF9DVVJSX1lfQ09VTlQJMHhGRkMwMUYzOAkvKiBNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uCUN1cnJlbnQJWSBDb3VudAlSZWdpc3RlciAqLworCisjZGVmaW5lCU1ETUExX1MwX05FWFRfREVTQ19QVFIJMHhGRkMwMUY0MAkvKiBNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBOZXh0CURlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9TMF9TVEFSVF9BRERSCQkweEZGQzAxRjQ0CS8qIE1lbURNQTEgU3RyZWFtIDAgU291cmNlIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfUzBfQ09ORklHCQkJMHhGRkMwMUY0OAkvKiBNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX1MwX1hfQ09VTlQJCTB4RkZDMDFGNTAJLyogTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9TMF9YX01PRElGWQkJMHhGRkMwMUY1NAkvKiBNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9TMF9ZX0NPVU5UCQkweEZGQzAxRjU4CS8qIE1lbURNQTEgU3RyZWFtIDAgU291cmNlIFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfUzBfWV9NT0RJRlkJCTB4RkZDMDFGNUMJLyogTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfUzBfQ1VSUl9ERVNDX1BUUgkweEZGQzAxRjYwCS8qIE1lbURNQTEgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX1MwX0NVUlJfQUREUgkJMHhGRkMwMUY2NAkvKiBNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfUzBfSVJRX1NUQVRVUwkJMHhGRkMwMUY2OAkvKiBNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX1MwX1BFUklQSEVSQUxfTUFQCTB4RkZDMDFGNkMJLyogTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfUzBfQ1VSUl9YX0NPVU5UCTB4RkZDMDFGNzAJLyogTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX1MwX0NVUlJfWV9DT1VOVAkweEZGQzAxRjc4CS8qIE1lbURNQTEgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCU1ETUExX0QxX05FWFRfREVTQ19QVFIJMHhGRkMwMUY4MAkvKiBNZW1ETUExIFN0cmVhbSAxIERlc3RpbmF0aW9uCU5leHQgRGVzY3JpcHRvcglQb2ludGVyCVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX0QxX1NUQVJUX0FERFIJCTB4RkZDMDFGODQJLyogTWVtRE1BMSBTdHJlYW0gMSBEZXN0aW5hdGlvbglTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX0QxX0NPTkZJRwkJCTB4RkZDMDFGODgJLyogTWVtRE1BMSBTdHJlYW0gMSBEZXN0aW5hdGlvbglDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX0QxX1hfQ09VTlQJCTB4RkZDMDFGOTAJLyogTWVtRE1BMSBTdHJlYW0gMSBEZXN0aW5hdGlvbglYIENvdW50CVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX0QxX1hfTU9ESUZZCQkweEZGQzAxRjk0CS8qIE1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24JWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfRDFfWV9DT1VOVAkJMHhGRkMwMUY5OAkvKiBNZW1ETUExIFN0cmVhbSAxIERlc3RpbmF0aW9uCVkgQ291bnQJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfRDFfWV9NT0RJRlkJCTB4RkZDMDFGOUMJLyogTWVtRE1BMSBTdHJlYW0gMSBEZXN0aW5hdGlvbglZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9EMV9DVVJSX0RFU0NfUFRSCTB4RkZDMDFGQTAJLyogTWVtRE1BMSBTdHJlYW0gMSBEZXN0aW5hdGlvbglDdXJyZW50CURlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9EMV9DVVJSX0FERFIJCTB4RkZDMDFGQTQJLyogTWVtRE1BMSBTdHJlYW0gMSBEZXN0aW5hdGlvbglDdXJyZW50CUFkZHJlc3MJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfRDFfSVJRX1NUQVRVUwkJMHhGRkMwMUZBOAkvKiBNZW1ETUExIFN0cmVhbSAxIERlc3RpbmF0aW9uCUludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfRDFfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMUZBQwkvKiBNZW1ETUExIFN0cmVhbSAxIERlc3RpbmF0aW9uCVBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX0QxX0NVUlJfWF9DT1VOVAkweEZGQzAxRkIwCS8qIE1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24JQ3VycmVudAlYIENvdW50CVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX0QxX0NVUlJfWV9DT1VOVAkweEZGQzAxRkI4CS8qIE1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24JQ3VycmVudAlZIENvdW50CVJlZ2lzdGVyICovCisKKyNkZWZpbmUJTURNQTFfUzFfTkVYVF9ERVNDX1BUUgkweEZGQzAxRkMwCS8qIE1lbURNQTEgU3RyZWFtIDEgU291cmNlIE5leHQJRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX1MxX1NUQVJUX0FERFIJCTB4RkZDMDFGQzQJLyogTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9TMV9DT05GSUcJCQkweEZGQzAxRkM4CS8qIE1lbURNQTEgU3RyZWFtIDEgU291cmNlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfUzFfWF9DT1VOVAkJMHhGRkMwMUZEMAkvKiBNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX1MxX1hfTU9ESUZZCQkweEZGQzAxRkQ0CS8qIE1lbURNQTEgU3RyZWFtIDEgU291cmNlIFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX1MxX1lfQ09VTlQJCTB4RkZDMDFGRDgJLyogTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9TMV9ZX01PRElGWQkJMHhGRkMwMUZEQwkvKiBNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9TMV9DVVJSX0RFU0NfUFRSCTB4RkZDMDFGRTAJLyogTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfUzFfQ1VSUl9BRERSCQkweEZGQzAxRkU0CS8qIE1lbURNQTEgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9TMV9JUlFfU1RBVFVTCQkweEZGQzAxRkU4CS8qIE1lbURNQTEgU3RyZWFtIDEgU291cmNlIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfUzFfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMUZFQwkvKiBNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9TMV9DVVJSX1hfQ09VTlQJMHhGRkMwMUZGMAkvKiBNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfUzFfQ1VSUl9ZX0NPVU5UCTB4RkZDMDFGRjgJLyogTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKworLyogVUFSVDEgQ29udHJvbGxlcgkJKDB4RkZDMDIwMDAgLSAweEZGQzAyMEZGKQkgKi8KKyNkZWZpbmUJVUFSVDFfVEhSCQkJMHhGRkMwMjAwMAkvKiBUcmFuc21pdCBIb2xkaW5nIHJlZ2lzdGVyICovCisjZGVmaW5lCVVBUlQxX1JCUgkJCTB4RkZDMDIwMDAJLyogUmVjZWl2ZSBCdWZmZXIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDFfRExMCQkJMHhGRkMwMjAwMAkvKiBEaXZpc29yIExhdGNoIChMb3ctQnl0ZSkgKi8KKyNkZWZpbmUJVUFSVDFfSUVSCQkJMHhGRkMwMjAwNAkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lCVVBUlQxX0RMSAkJCTB4RkZDMDIwMDQJLyogRGl2aXNvciBMYXRjaCAoSGlnaC1CeXRlKSAqLworI2RlZmluZQlVQVJUMV9JSVIJCQkweEZGQzAyMDA4CS8qIEludGVycnVwdCBJZGVudGlmaWNhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlVQVJUMV9MQ1IJCQkweEZGQzAyMDBDCS8qIExpbmUJQ29udHJvbAlSZWdpc3RlciAqLworI2RlZmluZQlVQVJUMV9NQ1IJCQkweEZGQzAyMDEwCS8qIE1vZGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDFfTFNSCQkJMHhGRkMwMjAxNAkvKiBMaW5lCVN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlVQVJUMV9TQ1IJCQkweEZGQzAyMDFDCS8qIFNDUiBTY3JhdGNoIFJlZ2lzdGVyICovCisjZGVmaW5lCVVBUlQxX0dDVEwJCQkweEZGQzAyMDI0CS8qIEdsb2JhbCBDb250cm9sIFJlZ2lzdGVyICovCisKKworLyogVUFSVDIgQ29udHJvbGxlcgkJKDB4RkZDMDIxMDAgLSAweEZGQzAyMUZGKQkgKi8KKyNkZWZpbmUJVUFSVDJfVEhSCQkJMHhGRkMwMjEwMAkvKiBUcmFuc21pdCBIb2xkaW5nIHJlZ2lzdGVyICovCisjZGVmaW5lCVVBUlQyX1JCUgkJCTB4RkZDMDIxMDAJLyogUmVjZWl2ZSBCdWZmZXIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDJfRExMCQkJMHhGRkMwMjEwMAkvKiBEaXZpc29yIExhdGNoIChMb3ctQnl0ZSkgKi8KKyNkZWZpbmUJVUFSVDJfSUVSCQkJMHhGRkMwMjEwNAkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lCVVBUlQyX0RMSAkJCTB4RkZDMDIxMDQJLyogRGl2aXNvciBMYXRjaCAoSGlnaC1CeXRlKSAqLworI2RlZmluZQlVQVJUMl9JSVIJCQkweEZGQzAyMTA4CS8qIEludGVycnVwdCBJZGVudGlmaWNhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlVQVJUMl9MQ1IJCQkweEZGQzAyMTBDCS8qIExpbmUJQ29udHJvbAlSZWdpc3RlciAqLworI2RlZmluZQlVQVJUMl9NQ1IJCQkweEZGQzAyMTEwCS8qIE1vZGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDJfTFNSCQkJMHhGRkMwMjExNAkvKiBMaW5lCVN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlVQVJUMl9TQ1IJCQkweEZGQzAyMTFDCS8qIFNDUiBTY3JhdGNoIFJlZ2lzdGVyICovCisjZGVmaW5lCVVBUlQyX0dDVEwJCQkweEZGQzAyMTI0CS8qIEdsb2JhbCBDb250cm9sIFJlZ2lzdGVyICovCisKKworLyogVHdvLVdpcmUgSW50ZXJmYWNlIDEJKDB4RkZDMDIyMDAgLSAweEZGQzAyMkZGKQkJCSAqLworI2RlZmluZQlUV0kxX0NMS0RJVgkJCTB4RkZDMDIyMDAJLyogU2VyaWFsIENsb2NrCURpdmlkZXIJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMV9DT05UUk9MCQkweEZGQzAyMjA0CS8qIFRXSTEJTWFzdGVyIEludGVybmFsCVRpbWUgUmVmZXJlbmNlIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTFfU0xBVkVfQ1RSTAkJMHhGRkMwMjIwOAkvKiBTbGF2ZSBNb2RlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMV9TTEFWRV9TVEFUCQkweEZGQzAyMjBDCS8qIFNsYXZlIE1vZGUgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTFfU0xBVkVfQUREUgkJMHhGRkMwMjIxMAkvKiBTbGF2ZSBNb2RlIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMV9NQVNURVJfQ1RSTAkweEZGQzAyMjE0CS8qIE1hc3RlciBNb2RlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMV9NQVNURVJfU1RBVAkweEZGQzAyMjE4CS8qIE1hc3RlciBNb2RlIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlUV0kxX01BU1RFUl9BRERSCTB4RkZDMDIyMUMJLyogTWFzdGVyIE1vZGUgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlUV0kxX0lOVF9TVEFUCQkweEZGQzAyMjIwCS8qIFRXSTEJTWFzdGVyIEludGVycnVwdCBSZWdpc3RlciAqLworI2RlZmluZQlUV0kxX0lOVF9NQVNLCQkweEZGQzAyMjI0CS8qIFRXSTEJTWFzdGVyIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTFfRklGT19DVFJMCQkweEZGQzAyMjI4CS8qIEZJRk8JQ29udHJvbAlSZWdpc3RlciAqLworI2RlZmluZQlUV0kxX0ZJRk9fU1RBVAkJMHhGRkMwMjIyQwkvKiBGSUZPCVN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlUV0kxX1hNVF9EQVRBOAkJMHhGRkMwMjI4MAkvKiBGSUZPCVRyYW5zbWl0IERhdGEgU2luZ2xlIEJ5dGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMV9YTVRfREFUQTE2CQkweEZGQzAyMjg0CS8qIEZJRk8JVHJhbnNtaXQgRGF0YSBEb3VibGUgQnl0ZSBSZWdpc3RlciAqLworI2RlZmluZQlUV0kxX1JDVl9EQVRBOAkJMHhGRkMwMjI4OAkvKiBGSUZPCVJlY2VpdmUJRGF0YSBTaW5nbGUgQnl0ZSBSZWdpc3RlciAqLworI2RlZmluZQlUV0kxX1JDVl9EQVRBMTYJCTB4RkZDMDIyOEMJLyogRklGTwlSZWNlaXZlCURhdGEgRG91YmxlIEJ5dGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVFdJMV9SRUdCQVNFCQlUV0kxX0NMS0RJVgorCisKKy8qIHRoZSBmb2xsb3dpbmcgYXJlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZQlUV0kxX1BSRVNDQUxFCSAgVFdJMV9DT05UUk9MCisjZGVmaW5lCVRXSTFfSU5UX1NSQwkgIFRXSTFfSU5UX1NUQVQKKyNkZWZpbmUJVFdJMV9JTlRfRU5BQkxFCSAgVFdJMV9JTlRfTUFTSworCisKKy8qIFNQSTEJQ29udHJvbGxlcgkJKDB4RkZDMDIzMDAgLSAweEZGQzAyM0ZGKQkgKi8KKyNkZWZpbmUJU1BJMV9DVEwJCQkweEZGQzAyMzAwICAvKiBTUEkxIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BJMV9GTEcJCQkweEZGQzAyMzA0ICAvKiBTUEkxIEZsYWcgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BJMV9TVEFUCQkJMHhGRkMwMjMwOCAgLyogU1BJMSBTdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BJMV9UREJSCQkJMHhGRkMwMjMwQyAgLyogU1BJMSBUcmFuc21pdCBEYXRhIEJ1ZmZlciBSZWdpc3RlciAqLworI2RlZmluZQlTUEkxX1JEQlIJCQkweEZGQzAyMzEwICAvKiBTUEkxIFJlY2VpdmUgRGF0YSBCdWZmZXIJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BJMV9CQVVECQkJMHhGRkMwMjMxNCAgLyogU1BJMSBCYXVkIHJhdGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BJMV9TSEFET1cJCQkweEZGQzAyMzE4ICAvKiBTUEkxX1JEQlIgU2hhZG93CVJlZ2lzdGVyICovCisjZGVmaW5lIFNQSTFfUkVHQkFTRQkJCVNQSTFfQ1RMCisKKy8qIFNQSTIJQ29udHJvbGxlcgkJKDB4RkZDMDI0MDAgLSAweEZGQzAyNEZGKQkgKi8KKyNkZWZpbmUJU1BJMl9DVEwJCQkweEZGQzAyNDAwICAvKiBTUEkyIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BJMl9GTEcJCQkweEZGQzAyNDA0ICAvKiBTUEkyIEZsYWcgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BJMl9TVEFUCQkJMHhGRkMwMjQwOCAgLyogU1BJMiBTdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BJMl9UREJSCQkJMHhGRkMwMjQwQyAgLyogU1BJMiBUcmFuc21pdCBEYXRhIEJ1ZmZlciBSZWdpc3RlciAqLworI2RlZmluZQlTUEkyX1JEQlIJCQkweEZGQzAyNDEwICAvKiBTUEkyIFJlY2VpdmUgRGF0YSBCdWZmZXIJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BJMl9CQVVECQkJMHhGRkMwMjQxNCAgLyogU1BJMiBCYXVkIHJhdGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BJMl9TSEFET1cJCQkweEZGQzAyNDE4ICAvKiBTUEkyX1JEQlIgU2hhZG93CVJlZ2lzdGVyICovCisjZGVmaW5lIFNQSTJfUkVHQkFTRQkJCVNQSTJfQ1RMCisKKy8qIFNQT1JUMiBDb250cm9sbGVyCQkoMHhGRkMwMjUwMCAtIDB4RkZDMDI1RkYpCQkJICovCisjZGVmaW5lCVNQT1JUMl9UQ1IxCQkJMHhGRkMwMjUwMAkvKiBTUE9SVDIgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMl9UQ1IyCQkJMHhGRkMwMjUwNAkvKiBTUE9SVDIgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAyIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMl9UQ0xLRElWCQkweEZGQzAyNTA4CS8qIFNQT1JUMiBUcmFuc21pdCBDbG9jayBEaXZpZGVyICovCisjZGVmaW5lCVNQT1JUMl9URlNESVYJCTB4RkZDMDI1MEMJLyogU1BPUlQyIFRyYW5zbWl0IEZyYW1lIFN5bmMgRGl2aWRlciAqLworI2RlZmluZQlTUE9SVDJfVFgJCQkweEZGQzAyNTEwCS8qIFNQT1JUMiBUWCBEYXRhIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMl9SWAkJCTB4RkZDMDI1MTgJLyogU1BPUlQyIFJYIERhdGEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQyX1JDUjEJCQkweEZGQzAyNTIwCS8qIFNQT1JUMiBUcmFuc21pdCBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQyX1JDUjIJCQkweEZGQzAyNTI0CS8qIFNQT1JUMiBUcmFuc21pdCBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQyX1JDTEtESVYJCTB4RkZDMDI1MjgJLyogU1BPUlQyIFJlY2VpdmUgQ2xvY2sJRGl2aWRlciAqLworI2RlZmluZQlTUE9SVDJfUkZTRElWCQkweEZGQzAyNTJDCS8qIFNQT1JUMiBSZWNlaXZlIEZyYW1lCVN5bmMgRGl2aWRlciAqLworI2RlZmluZQlTUE9SVDJfU1RBVAkJCTB4RkZDMDI1MzAJLyogU1BPUlQyIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDJfQ0hOTAkJCTB4RkZDMDI1MzQJLyogU1BPUlQyIEN1cnJlbnQgQ2hhbm5lbCBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDJfTUNNQzEJCTB4RkZDMDI1MzgJLyogU1BPUlQyIE11bHRpLUNoYW5uZWwJQ29uZmlndXJhdGlvbiBSZWdpc3RlciAxICovCisjZGVmaW5lCVNQT1JUMl9NQ01DMgkJMHhGRkMwMjUzQwkvKiBTUE9SVDIgTXVsdGktQ2hhbm5lbAlDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUJU1BPUlQyX01UQ1MwCQkweEZGQzAyNTQwCS8qIFNQT1JUMiBNdWx0aS1DaGFubmVsCVRyYW5zbWl0IFNlbGVjdAlSZWdpc3RlciAwICovCisjZGVmaW5lCVNQT1JUMl9NVENTMQkJMHhGRkMwMjU0NAkvKiBTUE9SVDIgTXVsdGktQ2hhbm5lbAlUcmFuc21pdCBTZWxlY3QJUmVnaXN0ZXIgMSAqLworI2RlZmluZQlTUE9SVDJfTVRDUzIJCTB4RkZDMDI1NDgJLyogU1BPUlQyIE11bHRpLUNoYW5uZWwJVHJhbnNtaXQgU2VsZWN0CVJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUJU1BPUlQyX01UQ1MzCQkweEZGQzAyNTRDCS8qIFNQT1JUMiBNdWx0aS1DaGFubmVsCVRyYW5zbWl0IFNlbGVjdAlSZWdpc3RlciAzICovCisjZGVmaW5lCVNQT1JUMl9NUkNTMAkJMHhGRkMwMjU1MAkvKiBTUE9SVDIgTXVsdGktQ2hhbm5lbAlSZWNlaXZlCVNlbGVjdCBSZWdpc3RlcgkwICovCisjZGVmaW5lCVNQT1JUMl9NUkNTMQkJMHhGRkMwMjU1NAkvKiBTUE9SVDIgTXVsdGktQ2hhbm5lbAlSZWNlaXZlCVNlbGVjdCBSZWdpc3RlcgkxICovCisjZGVmaW5lCVNQT1JUMl9NUkNTMgkJMHhGRkMwMjU1OAkvKiBTUE9SVDIgTXVsdGktQ2hhbm5lbAlSZWNlaXZlCVNlbGVjdCBSZWdpc3RlcgkyICovCisjZGVmaW5lCVNQT1JUMl9NUkNTMwkJMHhGRkMwMjU1QwkvKiBTUE9SVDIgTXVsdGktQ2hhbm5lbAlSZWNlaXZlCVNlbGVjdCBSZWdpc3RlcgkzICovCisKKworLyogU1BPUlQzIENvbnRyb2xsZXIJCSgweEZGQzAyNjAwIC0gMHhGRkMwMjZGRikJCQkgKi8KKyNkZWZpbmUJU1BPUlQzX1RDUjEJCQkweEZGQzAyNjAwCS8qIFNQT1JUMyBUcmFuc21pdCBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQzX1RDUjIJCQkweEZGQzAyNjA0CS8qIFNQT1JUMyBUcmFuc21pdCBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQzX1RDTEtESVYJCTB4RkZDMDI2MDgJLyogU1BPUlQzIFRyYW5zbWl0IENsb2NrIERpdmlkZXIgKi8KKyNkZWZpbmUJU1BPUlQzX1RGU0RJVgkJMHhGRkMwMjYwQwkvKiBTUE9SVDMgVHJhbnNtaXQgRnJhbWUgU3luYyBEaXZpZGVyICovCisjZGVmaW5lCVNQT1JUM19UWAkJCTB4RkZDMDI2MTAJLyogU1BPUlQzIFRYIERhdGEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQzX1JYCQkJMHhGRkMwMjYxOAkvKiBTUE9SVDMgUlggRGF0YSBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDNfUkNSMQkJCTB4RkZDMDI2MjAJLyogU1BPUlQzIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMSBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDNfUkNSMgkJCTB4RkZDMDI2MjQJLyogU1BPUlQzIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMiBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDNfUkNMS0RJVgkJMHhGRkMwMjYyOAkvKiBTUE9SVDMgUmVjZWl2ZSBDbG9jawlEaXZpZGVyICovCisjZGVmaW5lCVNQT1JUM19SRlNESVYJCTB4RkZDMDI2MkMJLyogU1BPUlQzIFJlY2VpdmUgRnJhbWUJU3luYyBEaXZpZGVyICovCisjZGVmaW5lCVNQT1JUM19TVEFUCQkJMHhGRkMwMjYzMAkvKiBTUE9SVDMgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUM19DSE5MCQkJMHhGRkMwMjYzNAkvKiBTUE9SVDMgQ3VycmVudCBDaGFubmVsIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUM19NQ01DMQkJMHhGRkMwMjYzOAkvKiBTUE9SVDMgTXVsdGktQ2hhbm5lbAlDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUJU1BPUlQzX01DTUMyCQkweEZGQzAyNjNDCS8qIFNQT1JUMyBNdWx0aS1DaGFubmVsCUNvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMiAqLworI2RlZmluZQlTUE9SVDNfTVRDUzAJCTB4RkZDMDI2NDAJLyogU1BPUlQzIE11bHRpLUNoYW5uZWwJVHJhbnNtaXQgU2VsZWN0CVJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUJU1BPUlQzX01UQ1MxCQkweEZGQzAyNjQ0CS8qIFNQT1JUMyBNdWx0aS1DaGFubmVsCVRyYW5zbWl0IFNlbGVjdAlSZWdpc3RlciAxICovCisjZGVmaW5lCVNQT1JUM19NVENTMgkJMHhGRkMwMjY0OAkvKiBTUE9SVDMgTXVsdGktQ2hhbm5lbAlUcmFuc21pdCBTZWxlY3QJUmVnaXN0ZXIgMiAqLworI2RlZmluZQlTUE9SVDNfTVRDUzMJCTB4RkZDMDI2NEMJLyogU1BPUlQzIE11bHRpLUNoYW5uZWwJVHJhbnNtaXQgU2VsZWN0CVJlZ2lzdGVyIDMgKi8KKyNkZWZpbmUJU1BPUlQzX01SQ1MwCQkweEZGQzAyNjUwCS8qIFNQT1JUMyBNdWx0aS1DaGFubmVsCVJlY2VpdmUJU2VsZWN0IFJlZ2lzdGVyCTAgKi8KKyNkZWZpbmUJU1BPUlQzX01SQ1MxCQkweEZGQzAyNjU0CS8qIFNQT1JUMyBNdWx0aS1DaGFubmVsCVJlY2VpdmUJU2VsZWN0IFJlZ2lzdGVyCTEgKi8KKyNkZWZpbmUJU1BPUlQzX01SQ1MyCQkweEZGQzAyNjU4CS8qIFNQT1JUMyBNdWx0aS1DaGFubmVsCVJlY2VpdmUJU2VsZWN0IFJlZ2lzdGVyCTIgKi8KKyNkZWZpbmUJU1BPUlQzX01SQ1MzCQkweEZGQzAyNjVDCS8qIFNQT1JUMyBNdWx0aS1DaGFubmVsCVJlY2VpdmUJU2VsZWN0IFJlZ2lzdGVyCTMgKi8KKworCisvKiBNZWRpYSBUcmFuc2NlaXZlciAoTVhWUikgICAoMHhGRkMwMjcwMCAtIDB4RkZDMDI4RkYpICovCisKKyNkZWZpbmUJTVhWUl9DT05GSUcJICAgICAgMHhGRkMwMjcwMCAgLyogTVhWUiBDb25maWd1cmF0aW9uCVJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfUExMX0NUTF8wCSAgICAgIDB4RkZDMDI3MDQgIC8qIE1YVlIgUGhhc2UJTG9jayBMb29wIENvbnRyb2wgUmVnaXN0ZXIgMCAqLworCisjZGVmaW5lCU1YVlJfU1RBVEVfMAkgICAgICAweEZGQzAyNzA4ICAvKiBNWFZSIFN0YXRlCVJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUJTVhWUl9TVEFURV8xCSAgICAgIDB4RkZDMDI3MEMgIC8qIE1YVlIgU3RhdGUJUmVnaXN0ZXIgMSAqLworCisjZGVmaW5lCU1YVlJfSU5UX1NUQVRfMAkgICAgICAweEZGQzAyNzEwICAvKiBNWFZSIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgMCAqLworI2RlZmluZQlNWFZSX0lOVF9TVEFUXzEJICAgICAgMHhGRkMwMjcxNCAgLyogTVhWUiBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyIDEgKi8KKworI2RlZmluZQlNWFZSX0lOVF9FTl8wCSAgICAgIDB4RkZDMDI3MTggIC8qIE1YVlIgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAwICovCisjZGVmaW5lCU1YVlJfSU5UX0VOXzEJICAgICAgMHhGRkMwMjcxQyAgLyogTVhWUiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyIDEgKi8KKworI2RlZmluZQlNWFZSX1BPU0lUSU9OCSAgICAgIDB4RkZDMDI3MjAgIC8qIE1YVlIgTm9kZSBQb3NpdGlvbglSZWdpc3RlciAqLworI2RlZmluZQlNWFZSX01BWF9QT1NJVElPTiAgICAgMHhGRkMwMjcyNCAgLyogTVhWUiBNYXhpbXVtIE5vZGUgUG9zaXRpb24JUmVnaXN0ZXIgKi8KKworI2RlZmluZQlNWFZSX0RFTEFZCSAgICAgIDB4RkZDMDI3MjggIC8qIE1YVlIgTm9kZSBGcmFtZSBEZWxheSBSZWdpc3RlciAqLworI2RlZmluZQlNWFZSX01BWF9ERUxBWQkgICAgICAweEZGQzAyNzJDICAvKiBNWFZSIE1heGltdW0gTm9kZSBGcmFtZSBEZWxheSBSZWdpc3RlciAqLworCisjZGVmaW5lCU1YVlJfTEFERFIJICAgICAgMHhGRkMwMjczMCAgLyogTVhWUiBMb2dpY2FsIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9HQUREUgkgICAgICAweEZGQzAyNzM0ICAvKiBNWFZSIEdyb3VwCUFkZHJlc3MJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9BQUREUgkgICAgICAweEZGQzAyNzM4ICAvKiBNWFZSIEFsdGVybmF0ZSBBZGRyZXNzIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJTVhWUl9BTExPQ18wCSAgICAgIDB4RkZDMDI3M0MgIC8qIE1YVlIgQWxsb2NhdGlvbiBUYWJsZSBSZWdpc3RlciAwICovCisjZGVmaW5lCU1YVlJfQUxMT0NfMQkgICAgICAweEZGQzAyNzQwICAvKiBNWFZSIEFsbG9jYXRpb24gVGFibGUgUmVnaXN0ZXIgMSAqLworI2RlZmluZQlNWFZSX0FMTE9DXzIJICAgICAgMHhGRkMwMjc0NCAgLyogTVhWUiBBbGxvY2F0aW9uIFRhYmxlIFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUJTVhWUl9BTExPQ18zCSAgICAgIDB4RkZDMDI3NDggIC8qIE1YVlIgQWxsb2NhdGlvbiBUYWJsZSBSZWdpc3RlciAzICovCisjZGVmaW5lCU1YVlJfQUxMT0NfNAkgICAgICAweEZGQzAyNzRDICAvKiBNWFZSIEFsbG9jYXRpb24gVGFibGUgUmVnaXN0ZXIgNCAqLworI2RlZmluZQlNWFZSX0FMTE9DXzUJICAgICAgMHhGRkMwMjc1MCAgLyogTVhWUiBBbGxvY2F0aW9uIFRhYmxlIFJlZ2lzdGVyIDUgKi8KKyNkZWZpbmUJTVhWUl9BTExPQ182CSAgICAgIDB4RkZDMDI3NTQgIC8qIE1YVlIgQWxsb2NhdGlvbiBUYWJsZSBSZWdpc3RlciA2ICovCisjZGVmaW5lCU1YVlJfQUxMT0NfNwkgICAgICAweEZGQzAyNzU4ICAvKiBNWFZSIEFsbG9jYXRpb24gVGFibGUgUmVnaXN0ZXIgNyAqLworI2RlZmluZQlNWFZSX0FMTE9DXzgJICAgICAgMHhGRkMwMjc1QyAgLyogTVhWUiBBbGxvY2F0aW9uIFRhYmxlIFJlZ2lzdGVyIDggKi8KKyNkZWZpbmUJTVhWUl9BTExPQ185CSAgICAgIDB4RkZDMDI3NjAgIC8qIE1YVlIgQWxsb2NhdGlvbiBUYWJsZSBSZWdpc3RlciA5ICovCisjZGVmaW5lCU1YVlJfQUxMT0NfMTAJICAgICAgMHhGRkMwMjc2NCAgLyogTVhWUiBBbGxvY2F0aW9uIFRhYmxlIFJlZ2lzdGVyIDEwICovCisjZGVmaW5lCU1YVlJfQUxMT0NfMTEJICAgICAgMHhGRkMwMjc2OCAgLyogTVhWUiBBbGxvY2F0aW9uIFRhYmxlIFJlZ2lzdGVyIDExICovCisjZGVmaW5lCU1YVlJfQUxMT0NfMTIJICAgICAgMHhGRkMwMjc2QyAgLyogTVhWUiBBbGxvY2F0aW9uIFRhYmxlIFJlZ2lzdGVyIDEyICovCisjZGVmaW5lCU1YVlJfQUxMT0NfMTMJICAgICAgMHhGRkMwMjc3MCAgLyogTVhWUiBBbGxvY2F0aW9uIFRhYmxlIFJlZ2lzdGVyIDEzICovCisjZGVmaW5lCU1YVlJfQUxMT0NfMTQJICAgICAgMHhGRkMwMjc3NCAgLyogTVhWUiBBbGxvY2F0aW9uIFRhYmxlIFJlZ2lzdGVyIDE0ICovCisKKyNkZWZpbmUJTVhWUl9TWU5DX0xDSEFOXzAgICAgIDB4RkZDMDI3NzggIC8qIE1YVlIgU3luYyBEYXRhIExvZ2ljYWwgQ2hhbm5lbCBBc3NpZ24gUmVnaXN0ZXIgMCAqLworI2RlZmluZQlNWFZSX1NZTkNfTENIQU5fMSAgICAgMHhGRkMwMjc3QyAgLyogTVhWUiBTeW5jIERhdGEgTG9naWNhbCBDaGFubmVsIEFzc2lnbiBSZWdpc3RlciAxICovCisjZGVmaW5lCU1YVlJfU1lOQ19MQ0hBTl8yICAgICAweEZGQzAyNzgwICAvKiBNWFZSIFN5bmMgRGF0YSBMb2dpY2FsIENoYW5uZWwgQXNzaWduIFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUJTVhWUl9TWU5DX0xDSEFOXzMgICAgIDB4RkZDMDI3ODQgIC8qIE1YVlIgU3luYyBEYXRhIExvZ2ljYWwgQ2hhbm5lbCBBc3NpZ24gUmVnaXN0ZXIgMyAqLworI2RlZmluZQlNWFZSX1NZTkNfTENIQU5fNCAgICAgMHhGRkMwMjc4OCAgLyogTVhWUiBTeW5jIERhdGEgTG9naWNhbCBDaGFubmVsIEFzc2lnbiBSZWdpc3RlciA0ICovCisjZGVmaW5lCU1YVlJfU1lOQ19MQ0hBTl81ICAgICAweEZGQzAyNzhDICAvKiBNWFZSIFN5bmMgRGF0YSBMb2dpY2FsIENoYW5uZWwgQXNzaWduIFJlZ2lzdGVyIDUgKi8KKyNkZWZpbmUJTVhWUl9TWU5DX0xDSEFOXzYgICAgIDB4RkZDMDI3OTAgIC8qIE1YVlIgU3luYyBEYXRhIExvZ2ljYWwgQ2hhbm5lbCBBc3NpZ24gUmVnaXN0ZXIgNiAqLworI2RlZmluZQlNWFZSX1NZTkNfTENIQU5fNyAgICAgMHhGRkMwMjc5NCAgLyogTVhWUiBTeW5jIERhdGEgTG9naWNhbCBDaGFubmVsIEFzc2lnbiBSZWdpc3RlciA3ICovCisKKyNkZWZpbmUJTVhWUl9ETUEwX0NPTkZJRyAgICAgIDB4RkZDMDI3OTggIC8qIE1YVlIgU3luYyBEYXRhIERNQTAgQ29uZmlnCVJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BMF9TVEFSVF9BRERSICAweEZGQzAyNzlDICAvKiBNWFZSIFN5bmMgRGF0YSBETUEwIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9ETUEwX0NPVU5UCSAgICAgIDB4RkZDMDI3QTAgIC8qIE1YVlIgU3luYyBEYXRhIERNQTAgTG9vcCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlNWFZSX0RNQTBfQ1VSUl9BRERSICAgMHhGRkMwMjdBNCAgLyogTVhWUiBTeW5jIERhdGEgRE1BMCBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9ETUEwX0NVUlJfQ09VTlQgIDB4RkZDMDI3QTggIC8qIE1YVlIgU3luYyBEYXRhIERNQTAgQ3VycmVudCBMb29wIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJTVhWUl9ETUExX0NPTkZJRyAgICAgIDB4RkZDMDI3QUMgIC8qIE1YVlIgU3luYyBEYXRhIERNQTEgQ29uZmlnCVJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BMV9TVEFSVF9BRERSICAweEZGQzAyN0IwICAvKiBNWFZSIFN5bmMgRGF0YSBETUExIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9ETUExX0NPVU5UCSAgICAgIDB4RkZDMDI3QjQgIC8qIE1YVlIgU3luYyBEYXRhIERNQTEgTG9vcCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlNWFZSX0RNQTFfQ1VSUl9BRERSICAgMHhGRkMwMjdCOCAgLyogTVhWUiBTeW5jIERhdGEgRE1BMSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9ETUExX0NVUlJfQ09VTlQgIDB4RkZDMDI3QkMgIC8qIE1YVlIgU3luYyBEYXRhIERNQTEgQ3VycmVudCBMb29wIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJTVhWUl9ETUEyX0NPTkZJRyAgICAgIDB4RkZDMDI3QzAgIC8qIE1YVlIgU3luYyBEYXRhIERNQTIgQ29uZmlnCVJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BMl9TVEFSVF9BRERSICAweEZGQzAyN0M0ICAvKiBNWFZSIFN5bmMgRGF0YSBETUEyIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9ETUEyX0NPVU5UCSAgICAgIDB4RkZDMDI3QzggIC8qIE1YVlIgU3luYyBEYXRhIERNQTIgTG9vcCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlNWFZSX0RNQTJfQ1VSUl9BRERSICAgMHhGRkMwMjdDQyAgLyogTVhWUiBTeW5jIERhdGEgRE1BMiBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9ETUEyX0NVUlJfQ09VTlQgIDB4RkZDMDI3RDAgIC8qIE1YVlIgU3luYyBEYXRhIERNQTIgQ3VycmVudCBMb29wIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJTVhWUl9ETUEzX0NPTkZJRyAgICAgIDB4RkZDMDI3RDQgIC8qIE1YVlIgU3luYyBEYXRhIERNQTMgQ29uZmlnCVJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BM19TVEFSVF9BRERSICAweEZGQzAyN0Q4ICAvKiBNWFZSIFN5bmMgRGF0YSBETUEzIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9ETUEzX0NPVU5UCSAgICAgIDB4RkZDMDI3REMgIC8qIE1YVlIgU3luYyBEYXRhIERNQTMgTG9vcCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlNWFZSX0RNQTNfQ1VSUl9BRERSICAgMHhGRkMwMjdFMCAgLyogTVhWUiBTeW5jIERhdGEgRE1BMyBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9ETUEzX0NVUlJfQ09VTlQgIDB4RkZDMDI3RTQgIC8qIE1YVlIgU3luYyBEYXRhIERNQTMgQ3VycmVudCBMb29wIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJTVhWUl9ETUE0X0NPTkZJRyAgICAgIDB4RkZDMDI3RTggIC8qIE1YVlIgU3luYyBEYXRhIERNQTQgQ29uZmlnCVJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BNF9TVEFSVF9BRERSICAweEZGQzAyN0VDICAvKiBNWFZSIFN5bmMgRGF0YSBETUE0IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9ETUE0X0NPVU5UCSAgICAgIDB4RkZDMDI3RjAgIC8qIE1YVlIgU3luYyBEYXRhIERNQTQgTG9vcCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlNWFZSX0RNQTRfQ1VSUl9BRERSICAgMHhGRkMwMjdGNCAgLyogTVhWUiBTeW5jIERhdGEgRE1BNCBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9ETUE0X0NVUlJfQ09VTlQgIDB4RkZDMDI3RjggIC8qIE1YVlIgU3luYyBEYXRhIERNQTQgQ3VycmVudCBMb29wIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJTVhWUl9ETUE1X0NPTkZJRyAgICAgIDB4RkZDMDI3RkMgIC8qIE1YVlIgU3luYyBEYXRhIERNQTUgQ29uZmlnCVJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BNV9TVEFSVF9BRERSICAweEZGQzAyODAwICAvKiBNWFZSIFN5bmMgRGF0YSBETUE1IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9ETUE1X0NPVU5UCSAgICAgIDB4RkZDMDI4MDQgIC8qIE1YVlIgU3luYyBEYXRhIERNQTUgTG9vcCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlNWFZSX0RNQTVfQ1VSUl9BRERSICAgMHhGRkMwMjgwOCAgLyogTVhWUiBTeW5jIERhdGEgRE1BNSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9ETUE1X0NVUlJfQ09VTlQgIDB4RkZDMDI4MEMgIC8qIE1YVlIgU3luYyBEYXRhIERNQTUgQ3VycmVudCBMb29wIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJTVhWUl9ETUE2X0NPTkZJRyAgICAgIDB4RkZDMDI4MTAgIC8qIE1YVlIgU3luYyBEYXRhIERNQTYgQ29uZmlnCVJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BNl9TVEFSVF9BRERSICAweEZGQzAyODE0ICAvKiBNWFZSIFN5bmMgRGF0YSBETUE2IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9ETUE2X0NPVU5UCSAgICAgIDB4RkZDMDI4MTggIC8qIE1YVlIgU3luYyBEYXRhIERNQTYgTG9vcCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlNWFZSX0RNQTZfQ1VSUl9BRERSICAgMHhGRkMwMjgxQyAgLyogTVhWUiBTeW5jIERhdGEgRE1BNiBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9ETUE2X0NVUlJfQ09VTlQgIDB4RkZDMDI4MjAgIC8qIE1YVlIgU3luYyBEYXRhIERNQTYgQ3VycmVudCBMb29wIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJTVhWUl9ETUE3X0NPTkZJRyAgICAgIDB4RkZDMDI4MjQgIC8qIE1YVlIgU3luYyBEYXRhIERNQTcgQ29uZmlnCVJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BN19TVEFSVF9BRERSICAweEZGQzAyODI4ICAvKiBNWFZSIFN5bmMgRGF0YSBETUE3IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9ETUE3X0NPVU5UCSAgICAgIDB4RkZDMDI4MkMgIC8qIE1YVlIgU3luYyBEYXRhIERNQTcgTG9vcCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlNWFZSX0RNQTdfQ1VSUl9BRERSICAgMHhGRkMwMjgzMCAgLyogTVhWUiBTeW5jIERhdGEgRE1BNyBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9ETUE3X0NVUlJfQ09VTlQgIDB4RkZDMDI4MzQgIC8qIE1YVlIgU3luYyBEYXRhIERNQTcgQ3VycmVudCBMb29wIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJTVhWUl9BUF9DVEwJICAgICAgMHhGRkMwMjgzOCAgLyogTVhWUiBBc3luYwlQYWNrZXQgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQlNWFZSX0FQUkJfU1RBUlRfQUREUiAgMHhGRkMwMjgzQyAgLyogTVhWUiBBc3luYwlQYWNrZXQgUlggQnVmZmVyIFN0YXJ0IEFkZHIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9BUFJCX0NVUlJfQUREUiAgIDB4RkZDMDI4NDAgIC8qIE1YVlIgQXN5bmMJUGFja2V0IFJYIEJ1ZmZlciBDdXJyZW50IEFkZHIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9BUFRCX1NUQVJUX0FERFIgIDB4RkZDMDI4NDQgIC8qIE1YVlIgQXN5bmMJUGFja2V0IFRYIEJ1ZmZlciBTdGFydCBBZGRyIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfQVBUQl9DVVJSX0FERFIgICAweEZGQzAyODQ4ICAvKiBNWFZSIEFzeW5jCVBhY2tldCBUWCBCdWZmZXIgQ3VycmVudCBBZGRyIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJTVhWUl9DTV9DVEwJICAgICAgMHhGRkMwMjg0QyAgLyogTVhWUiBDb250cm9sIE1lc3NhZ2UgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQlNWFZSX0NNUkJfU1RBUlRfQUREUiAgMHhGRkMwMjg1MCAgLyogTVhWUiBDb250cm9sIE1lc3NhZ2UgUlggQnVmZmVyIFN0YXJ0IEFkZHIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9DTVJCX0NVUlJfQUREUiAgIDB4RkZDMDI4NTQgIC8qIE1YVlIgQ29udHJvbCBNZXNzYWdlIFJYIEJ1ZmZlciBDdXJyZW50IEFkZHJlc3MgKi8KKyNkZWZpbmUJTVhWUl9DTVRCX1NUQVJUX0FERFIgIDB4RkZDMDI4NTggIC8qIE1YVlIgQ29udHJvbCBNZXNzYWdlIFRYIEJ1ZmZlciBTdGFydCBBZGRyIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfQ01UQl9DVVJSX0FERFIgICAweEZGQzAyODVDICAvKiBNWFZSIENvbnRyb2wgTWVzc2FnZSBUWCBCdWZmZXIgQ3VycmVudCBBZGRyZXNzICovCisKKyNkZWZpbmUJTVhWUl9SUkRCX1NUQVJUX0FERFIgIDB4RkZDMDI4NjAgIC8qIE1YVlIgUmVtb3RlIFJlYWQgQnVmZmVyIFN0YXJ0IEFkZHIJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9SUkRCX0NVUlJfQUREUiAgIDB4RkZDMDI4NjQgIC8qIE1YVlIgUmVtb3RlIFJlYWQgQnVmZmVyIEN1cnJlbnQgQWRkciBSZWdpc3RlciAqLworCisjZGVmaW5lCU1YVlJfUEFUX0RBVEFfMAkgICAgICAweEZGQzAyODY4ICAvKiBNWFZSIFBhdHRlcm4gRGF0YSBSZWdpc3RlcgkwICovCisjZGVmaW5lCU1YVlJfUEFUX0VOXzAJICAgICAgMHhGRkMwMjg2QyAgLyogTVhWUiBQYXR0ZXJuIEVuYWJsZSBSZWdpc3RlciAwICovCisjZGVmaW5lCU1YVlJfUEFUX0RBVEFfMQkgICAgICAweEZGQzAyODcwICAvKiBNWFZSIFBhdHRlcm4gRGF0YSBSZWdpc3RlcgkxICovCisjZGVmaW5lCU1YVlJfUEFUX0VOXzEJICAgICAgMHhGRkMwMjg3NCAgLyogTVhWUiBQYXR0ZXJuIEVuYWJsZSBSZWdpc3RlciAxICovCisKKyNkZWZpbmUJTVhWUl9GUkFNRV9DTlRfMCAgICAgIDB4RkZDMDI4NzggIC8qIE1YVlIgRnJhbWUJQ291bnRlcgkwICovCisjZGVmaW5lCU1YVlJfRlJBTUVfQ05UXzEgICAgICAweEZGQzAyODdDICAvKiBNWFZSIEZyYW1lCUNvdW50ZXIJMSAqLworCisjZGVmaW5lCU1YVlJfUk9VVElOR18wCSAgICAgIDB4RkZDMDI4ODAgIC8qIE1YVlIgUm91dGluZyBUYWJsZQlSZWdpc3RlciAwICovCisjZGVmaW5lCU1YVlJfUk9VVElOR18xCSAgICAgIDB4RkZDMDI4ODQgIC8qIE1YVlIgUm91dGluZyBUYWJsZQlSZWdpc3RlciAxICovCisjZGVmaW5lCU1YVlJfUk9VVElOR18yCSAgICAgIDB4RkZDMDI4ODggIC8qIE1YVlIgUm91dGluZyBUYWJsZQlSZWdpc3RlciAyICovCisjZGVmaW5lCU1YVlJfUk9VVElOR18zCSAgICAgIDB4RkZDMDI4OEMgIC8qIE1YVlIgUm91dGluZyBUYWJsZQlSZWdpc3RlciAzICovCisjZGVmaW5lCU1YVlJfUk9VVElOR180CSAgICAgIDB4RkZDMDI4OTAgIC8qIE1YVlIgUm91dGluZyBUYWJsZQlSZWdpc3RlciA0ICovCisjZGVmaW5lCU1YVlJfUk9VVElOR181CSAgICAgIDB4RkZDMDI4OTQgIC8qIE1YVlIgUm91dGluZyBUYWJsZQlSZWdpc3RlciA1ICovCisjZGVmaW5lCU1YVlJfUk9VVElOR182CSAgICAgIDB4RkZDMDI4OTggIC8qIE1YVlIgUm91dGluZyBUYWJsZQlSZWdpc3RlciA2ICovCisjZGVmaW5lCU1YVlJfUk9VVElOR183CSAgICAgIDB4RkZDMDI4OUMgIC8qIE1YVlIgUm91dGluZyBUYWJsZQlSZWdpc3RlciA3ICovCisjZGVmaW5lCU1YVlJfUk9VVElOR184CSAgICAgIDB4RkZDMDI4QTAgIC8qIE1YVlIgUm91dGluZyBUYWJsZQlSZWdpc3RlciA4ICovCisjZGVmaW5lCU1YVlJfUk9VVElOR185CSAgICAgIDB4RkZDMDI4QTQgIC8qIE1YVlIgUm91dGluZyBUYWJsZQlSZWdpc3RlciA5ICovCisjZGVmaW5lCU1YVlJfUk9VVElOR18xMAkgICAgICAweEZGQzAyOEE4ICAvKiBNWFZSIFJvdXRpbmcgVGFibGUJUmVnaXN0ZXIgMTAgKi8KKyNkZWZpbmUJTVhWUl9ST1VUSU5HXzExCSAgICAgIDB4RkZDMDI4QUMgIC8qIE1YVlIgUm91dGluZyBUYWJsZQlSZWdpc3RlciAxMSAqLworI2RlZmluZQlNWFZSX1JPVVRJTkdfMTIJICAgICAgMHhGRkMwMjhCMCAgLyogTVhWUiBSb3V0aW5nIFRhYmxlCVJlZ2lzdGVyIDEyICovCisjZGVmaW5lCU1YVlJfUk9VVElOR18xMwkgICAgICAweEZGQzAyOEI0ICAvKiBNWFZSIFJvdXRpbmcgVGFibGUJUmVnaXN0ZXIgMTMgKi8KKyNkZWZpbmUJTVhWUl9ST1VUSU5HXzE0CSAgICAgIDB4RkZDMDI4QjggIC8qIE1YVlIgUm91dGluZyBUYWJsZQlSZWdpc3RlciAxNCAqLworCisjZGVmaW5lCU1YVlJfUExMX0NUTF8xCSAgICAgIDB4RkZDMDI4QkMgIC8qIE1YVlIgUGhhc2UJTG9jayBMb29wIENvbnRyb2wgUmVnaXN0ZXIgMSAqLworI2RlZmluZQlNWFZSX0JMT0NLX0NOVAkgICAgICAweEZGQzAyOEMwICAvKiBNWFZSIEJsb2NrCUNvdW50ZXIgKi8KKyNkZWZpbmUJTVhWUl9QTExfQ1RMXzIJICAgICAgMHhGRkMwMjhDNCAgLyogTVhWUiBQaGFzZQlMb2NrIExvb3AgQ29udHJvbCBSZWdpc3RlciAyICovCisKKworLyogQ0FOIENvbnRyb2xsZXIJCSgweEZGQzAyQTAwIC0gMHhGRkMwMkZGRikJCQkJICovCisvKiBGb3IgTWFpbGJveGVzIDAtMTUJCQkJCQkJCQkJCSAqLworI2RlZmluZQlDQU5fTUMxCQkJCTB4RkZDMDJBMDAJLyogTWFpbGJveCBjb25maWcgcmVnIDEJICovCisjZGVmaW5lCUNBTl9NRDEJCQkJMHhGRkMwMkEwNAkvKiBNYWlsYm94IGRpcmVjdGlvbiByZWcgMSAqLworI2RlZmluZQlDQU5fVFJTMQkJCTB4RkZDMDJBMDgJLyogVHJhbnNtaXQgUmVxdWVzdCBTZXQJcmVnIDEgKi8KKyNkZWZpbmUJQ0FOX1RSUjEJCQkweEZGQzAyQTBDCS8qIFRyYW5zbWl0IFJlcXVlc3QgUmVzZXQgcmVnIDEgKi8KKyNkZWZpbmUJQ0FOX1RBMQkJCQkweEZGQzAyQTEwCS8qIFRyYW5zbWl0IEFja25vd2xlZGdlCXJlZyAxICovCisjZGVmaW5lCUNBTl9BQTEJCQkJMHhGRkMwMkExNAkvKiBUcmFuc21pdCBBYm9ydCBBY2tub3dsZWRnZSByZWcgMSAqLworI2RlZmluZQlDQU5fUk1QMQkJCTB4RkZDMDJBMTgJLyogUmVjZWl2ZSBNZXNzYWdlIFBlbmRpbmcgcmVnIDEgKi8KKyNkZWZpbmUJQ0FOX1JNTDEJCQkweEZGQzAyQTFDCS8qIFJlY2VpdmUgTWVzc2FnZSBMb3N0CXJlZyAxICovCisjZGVmaW5lCUNBTl9NQlRJRjEJCQkweEZGQzAyQTIwCS8qIE1haWxib3ggVHJhbnNtaXQgSW50ZXJydXB0IEZsYWcgcmVnIDEgKi8KKyNkZWZpbmUJQ0FOX01CUklGMQkJCTB4RkZDMDJBMjQJLyogTWFpbGJveCBSZWNlaXZlICBJbnRlcnJ1cHQgRmxhZyByZWcgMSAqLworI2RlZmluZQlDQU5fTUJJTTEJCQkweEZGQzAyQTI4CS8qIE1haWxib3ggSW50ZXJydXB0IE1hc2sgcmVnIDEgKi8KKyNkZWZpbmUJQ0FOX1JGSDEJCQkweEZGQzAyQTJDCS8qIFJlbW90ZSBGcmFtZQlIYW5kbGluZyByZWcgMSAqLworI2RlZmluZQlDQU5fT1BTUzEJCQkweEZGQzAyQTMwCS8qIE92ZXJ3cml0ZSBQcm90ZWN0aW9uCVNpbmdsZSBTaG90IFhtaXNzaW9uIHJlZyAxICovCisKKy8qIEZvciBNYWlsYm94ZXMgMTYtMzEJCQkJCQkJCQkJCSAqLworI2RlZmluZQlDQU5fTUMyCQkJCTB4RkZDMDJBNDAJLyogTWFpbGJveCBjb25maWcgcmVnIDIJICovCisjZGVmaW5lCUNBTl9NRDIJCQkJMHhGRkMwMkE0NAkvKiBNYWlsYm94IGRpcmVjdGlvbiByZWcgMiAqLworI2RlZmluZQlDQU5fVFJTMgkJCTB4RkZDMDJBNDgJLyogVHJhbnNtaXQgUmVxdWVzdCBTZXQJcmVnIDIgKi8KKyNkZWZpbmUJQ0FOX1RSUjIJCQkweEZGQzAyQTRDCS8qIFRyYW5zbWl0IFJlcXVlc3QgUmVzZXQgcmVnIDIgKi8KKyNkZWZpbmUJQ0FOX1RBMgkJCQkweEZGQzAyQTUwCS8qIFRyYW5zbWl0IEFja25vd2xlZGdlCXJlZyAyICovCisjZGVmaW5lCUNBTl9BQTIJCQkJMHhGRkMwMkE1NAkvKiBUcmFuc21pdCBBYm9ydCBBY2tub3dsZWRnZSByZWcgMiAqLworI2RlZmluZQlDQU5fUk1QMgkJCTB4RkZDMDJBNTgJLyogUmVjZWl2ZSBNZXNzYWdlIFBlbmRpbmcgcmVnIDIgKi8KKyNkZWZpbmUJQ0FOX1JNTDIJCQkweEZGQzAyQTVDCS8qIFJlY2VpdmUgTWVzc2FnZSBMb3N0CXJlZyAyICovCisjZGVmaW5lCUNBTl9NQlRJRjIJCQkweEZGQzAyQTYwCS8qIE1haWxib3ggVHJhbnNtaXQgSW50ZXJydXB0IEZsYWcgcmVnIDIgKi8KKyNkZWZpbmUJQ0FOX01CUklGMgkJCTB4RkZDMDJBNjQJLyogTWFpbGJveCBSZWNlaXZlICBJbnRlcnJ1cHQgRmxhZyByZWcgMiAqLworI2RlZmluZQlDQU5fTUJJTTIJCQkweEZGQzAyQTY4CS8qIE1haWxib3ggSW50ZXJydXB0IE1hc2sgcmVnIDIgKi8KKyNkZWZpbmUJQ0FOX1JGSDIJCQkweEZGQzAyQTZDCS8qIFJlbW90ZSBGcmFtZQlIYW5kbGluZyByZWcgMiAqLworI2RlZmluZQlDQU5fT1BTUzIJCQkweEZGQzAyQTcwCS8qIE92ZXJ3cml0ZSBQcm90ZWN0aW9uCVNpbmdsZSBTaG90IFhtaXNzaW9uIHJlZyAyICovCisKKyNkZWZpbmUJQ0FOX0NMT0NLCQkJMHhGRkMwMkE4MAkvKiBCaXQgVGltaW5nIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgMCAqLworI2RlZmluZQlDQU5fVElNSU5HCQkJMHhGRkMwMkE4NAkvKiBCaXQgVGltaW5nIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgMSAqLworCisjZGVmaW5lCUNBTl9ERUJVRwkJCTB4RkZDMDJBODgJLyogRGVidWcgUmVnaXN0ZXIJCSAqLworLyogdGhlIGZvbGxvd2luZyBpcyBmb3IJYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUJQ0FOX0NORgkJIENBTl9ERUJVRworCisjZGVmaW5lCUNBTl9TVEFUVVMJCQkweEZGQzAyQThDCS8qIEdsb2JhbCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX0NFQwkJCQkweEZGQzAyQTkwCS8qIEVycm9yIENvdW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX0dJUwkJCQkweEZGQzAyQTk0CS8qIEdsb2JhbCBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9HSU0JCQkJMHhGRkMwMkE5OAkvKiBHbG9iYWwgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX0dJRgkJCQkweEZGQzAyQTlDCS8qIEdsb2JhbCBJbnRlcnJ1cHQgRmxhZyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fQ09OVFJPTAkJCTB4RkZDMDJBQTAJLyogTWFzdGVyIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX0lOVFIJCQkweEZGQzAyQUE0CS8qIEludGVycnVwdCBQZW5kaW5nIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQlRECQkJMHhGRkMwMkFBQwkvKiBNYWlsYm94IFRlbXBvcmFyeSBEaXNhYmxlIEZlYXR1cmUgKi8KKyNkZWZpbmUJQ0FOX0VXUgkJCQkweEZGQzAyQUIwCS8qIFByb2dyYW1tYWJsZQlXYXJuaW5nCUxldmVsICovCisjZGVmaW5lCUNBTl9FU1IJCQkJMHhGRkMwMkFCNAkvKiBFcnJvciBTdGF0dXMJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX1VDQ05UCQkJMHhGRkMwMkFDNAkvKiBVbml2ZXJzYWwgQ291bnRlcgkgKi8KKyNkZWZpbmUJQ0FOX1VDUkMJCQkweEZGQzAyQUM4CS8qIFVuaXZlcnNhbCBDb3VudGVyIFJlbG9hZC9DYXB0dXJlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9VQ0NORgkJCTB4RkZDMDJBQ0MJLyogVW5pdmVyc2FsIENvdW50ZXIgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworCisvKiBNYWlsYm94IEFjY2VwdGFuY2UgTWFza3MJCQkJCSAqLworI2RlZmluZQlDQU5fQU0wMEwJCQkweEZGQzAyQjAwCS8qIE1haWxib3ggMCBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTAwSAkJCTB4RkZDMDJCMDQJLyogTWFpbGJveCAwIEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTAxTAkJCTB4RkZDMDJCMDgJLyogTWFpbGJveCAxIExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMDFICQkJMHhGRkMwMkIwQwkvKiBNYWlsYm94IDEgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMDJMCQkJMHhGRkMwMkIxMAkvKiBNYWlsYm94IDIgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0wMkgJCQkweEZGQzAyQjE0CS8qIE1haWxib3ggMiBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0wM0wJCQkweEZGQzAyQjE4CS8qIE1haWxib3ggMyBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTAzSAkJCTB4RkZDMDJCMUMJLyogTWFpbGJveCAzIEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTA0TAkJCTB4RkZDMDJCMjAJLyogTWFpbGJveCA0IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMDRICQkJMHhGRkMwMkIyNAkvKiBNYWlsYm94IDQgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMDVMCQkJMHhGRkMwMkIyOAkvKiBNYWlsYm94IDUgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0wNUgJCQkweEZGQzAyQjJDCS8qIE1haWxib3ggNSBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0wNkwJCQkweEZGQzAyQjMwCS8qIE1haWxib3ggNiBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTA2SAkJCTB4RkZDMDJCMzQJLyogTWFpbGJveCA2IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTA3TAkJCTB4RkZDMDJCMzgJLyogTWFpbGJveCA3IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMDdICQkJMHhGRkMwMkIzQwkvKiBNYWlsYm94IDcgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMDhMCQkJMHhGRkMwMkI0MAkvKiBNYWlsYm94IDggTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0wOEgJCQkweEZGQzAyQjQ0CS8qIE1haWxib3ggOCBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0wOUwJCQkweEZGQzAyQjQ4CS8qIE1haWxib3ggOSBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTA5SAkJCTB4RkZDMDJCNEMJLyogTWFpbGJveCA5IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTEwTAkJCTB4RkZDMDJCNTAJLyogTWFpbGJveCAxMCBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTEwSAkJCTB4RkZDMDJCNTQJLyogTWFpbGJveCAxMCBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0xMUwJCQkweEZGQzAyQjU4CS8qIE1haWxib3ggMTEgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0xMUgJCQkweEZGQzAyQjVDCS8qIE1haWxib3ggMTEgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMTJMCQkJMHhGRkMwMkI2MAkvKiBNYWlsYm94IDEyIExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMTJICQkJMHhGRkMwMkI2NAkvKiBNYWlsYm94IDEyIEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTEzTAkJCTB4RkZDMDJCNjgJLyogTWFpbGJveCAxMyBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTEzSAkJCTB4RkZDMDJCNkMJLyogTWFpbGJveCAxMyBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0xNEwJCQkweEZGQzAyQjcwCS8qIE1haWxib3ggMTQgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0xNEgJCQkweEZGQzAyQjc0CS8qIE1haWxib3ggMTQgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMTVMCQkJMHhGRkMwMkI3OAkvKiBNYWlsYm94IDE1IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMTVICQkJMHhGRkMwMkI3QwkvKiBNYWlsYm94IDE1IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisKKyNkZWZpbmUJQ0FOX0FNMTZMCQkJMHhGRkMwMkI4MAkvKiBNYWlsYm94IDE2IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMTZICQkJMHhGRkMwMkI4NAkvKiBNYWlsYm94IDE2IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTE3TAkJCTB4RkZDMDJCODgJLyogTWFpbGJveCAxNyBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTE3SAkJCTB4RkZDMDJCOEMJLyogTWFpbGJveCAxNyBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0xOEwJCQkweEZGQzAyQjkwCS8qIE1haWxib3ggMTggTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0xOEgJCQkweEZGQzAyQjk0CS8qIE1haWxib3ggMTggSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMTlMCQkJMHhGRkMwMkI5OAkvKiBNYWlsYm94IDE5IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMTlICQkJMHhGRkMwMkI5QwkvKiBNYWlsYm94IDE5IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTIwTAkJCTB4RkZDMDJCQTAJLyogTWFpbGJveCAyMCBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTIwSAkJCTB4RkZDMDJCQTQJLyogTWFpbGJveCAyMCBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0yMUwJCQkweEZGQzAyQkE4CS8qIE1haWxib3ggMjEgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0yMUgJCQkweEZGQzAyQkFDCS8qIE1haWxib3ggMjEgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMjJMCQkJMHhGRkMwMkJCMAkvKiBNYWlsYm94IDIyIExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMjJICQkJMHhGRkMwMkJCNAkvKiBNYWlsYm94IDIyIEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTIzTAkJCTB4RkZDMDJCQjgJLyogTWFpbGJveCAyMyBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTIzSAkJCTB4RkZDMDJCQkMJLyogTWFpbGJveCAyMyBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0yNEwJCQkweEZGQzAyQkMwCS8qIE1haWxib3ggMjQgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0yNEgJCQkweEZGQzAyQkM0CS8qIE1haWxib3ggMjQgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMjVMCQkJMHhGRkMwMkJDOAkvKiBNYWlsYm94IDI1IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMjVICQkJMHhGRkMwMkJDQwkvKiBNYWlsYm94IDI1IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTI2TAkJCTB4RkZDMDJCRDAJLyogTWFpbGJveCAyNiBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTI2SAkJCTB4RkZDMDJCRDQJLyogTWFpbGJveCAyNiBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0yN0wJCQkweEZGQzAyQkQ4CS8qIE1haWxib3ggMjcgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0yN0gJCQkweEZGQzAyQkRDCS8qIE1haWxib3ggMjcgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMjhMCQkJMHhGRkMwMkJFMAkvKiBNYWlsYm94IDI4IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMjhICQkJMHhGRkMwMkJFNAkvKiBNYWlsYm94IDI4IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTI5TAkJCTB4RkZDMDJCRTgJLyogTWFpbGJveCAyOSBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTI5SAkJCTB4RkZDMDJCRUMJLyogTWFpbGJveCAyOSBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0zMEwJCQkweEZGQzAyQkYwCS8qIE1haWxib3ggMzAgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0zMEgJCQkweEZGQzAyQkY0CS8qIE1haWxib3ggMzAgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMzFMCQkJMHhGRkMwMkJGOAkvKiBNYWlsYm94IDMxIExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMzFICQkJMHhGRkMwMkJGQwkvKiBNYWlsYm94IDMxIEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisKKy8qIENBTiBBY2NlcHRhbmNlIE1hc2sgTWFjcm9zICovCisjZGVmaW5lCUNBTl9BTV9MKHgpCQkJKENBTl9BTTAwTCsoKHgpKjB4OCkpCisjZGVmaW5lCUNBTl9BTV9IKHgpCQkJKENBTl9BTTAwSCsoKHgpKjB4OCkpCisKKy8qIE1haWxib3ggUmVnaXN0ZXJzCQkJCQkJCQkJICovCisjZGVmaW5lCUNBTl9NQjAwX0RBVEEwCQkweEZGQzAyQzAwCS8qIE1haWxib3ggMCBEYXRhIFdvcmQgMCBbMTU6MF0JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDBfREFUQTEJCTB4RkZDMDJDMDQJLyogTWFpbGJveCAwIERhdGEgV29yZCAxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDBfREFUQTIJCTB4RkZDMDJDMDgJLyogTWFpbGJveCAwIERhdGEgV29yZCAyIFs0NzozMl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDBfREFUQTMJCTB4RkZDMDJDMEMJLyogTWFpbGJveCAwIERhdGEgV29yZCAzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDBfTEVOR1RICQkweEZGQzAyQzEwCS8qIE1haWxib3ggMCBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAwX1RJTUVTVEFNUAkweEZGQzAyQzE0CS8qIE1haWxib3ggMCBUaW1lIFN0YW1wCVZhbHVlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAwX0lEMAkJMHhGRkMwMkMxOAkvKiBNYWlsYm94IDAgSWRlbnRpZmllcglMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDBfSUQxCQkweEZGQzAyQzFDCS8qIE1haWxib3ggMCBJZGVudGlmaWVyCUhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIwMV9EQVRBMAkJMHhGRkMwMkMyMAkvKiBNYWlsYm94IDEgRGF0YSBXb3JkIDAgWzE1OjBdCVJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAxX0RBVEExCQkweEZGQzAyQzI0CS8qIE1haWxib3ggMSBEYXRhIFdvcmQgMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAxX0RBVEEyCQkweEZGQzAyQzI4CS8qIE1haWxib3ggMSBEYXRhIFdvcmQgMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAxX0RBVEEzCQkweEZGQzAyQzJDCS8qIE1haWxib3ggMSBEYXRhIFdvcmQgMyBbNjM6NDhdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAxX0xFTkdUSAkJMHhGRkMwMkMzMAkvKiBNYWlsYm94IDEgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwMV9USU1FU1RBTVAJMHhGRkMwMkMzNAkvKiBNYWlsYm94IDEgVGltZSBTdGFtcAlWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwMV9JRDAJCTB4RkZDMDJDMzgJLyogTWFpbGJveCAxIElkZW50aWZpZXIJTG93IFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAxX0lEMQkJMHhGRkMwMkMzQwkvKiBNYWlsYm94IDEgSWRlbnRpZmllcglIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMDJfREFUQTAJCTB4RkZDMDJDNDAJLyogTWFpbGJveCAyIERhdGEgV29yZCAwIFsxNTowXQlSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwMl9EQVRBMQkJMHhGRkMwMkM0NAkvKiBNYWlsYm94IDIgRGF0YSBXb3JkIDEgWzMxOjE2XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwMl9EQVRBMgkJMHhGRkMwMkM0OAkvKiBNYWlsYm94IDIgRGF0YSBXb3JkIDIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwMl9EQVRBMwkJMHhGRkMwMkM0QwkvKiBNYWlsYm94IDIgRGF0YSBXb3JkIDMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwMl9MRU5HVEgJCTB4RkZDMDJDNTAJLyogTWFpbGJveCAyIERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDJfVElNRVNUQU1QCTB4RkZDMDJDNTQJLyogTWFpbGJveCAyIFRpbWUgU3RhbXAJVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDJfSUQwCQkweEZGQzAyQzU4CS8qIE1haWxib3ggMiBJZGVudGlmaWVyCUxvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwMl9JRDEJCTB4RkZDMDJDNUMJLyogTWFpbGJveCAyIElkZW50aWZpZXIJSGlnaCBSZWdpc3RlciAqLworCisjZGVmaW5lCUNBTl9NQjAzX0RBVEEwCQkweEZGQzAyQzYwCS8qIE1haWxib3ggMyBEYXRhIFdvcmQgMCBbMTU6MF0JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDNfREFUQTEJCTB4RkZDMDJDNjQJLyogTWFpbGJveCAzIERhdGEgV29yZCAxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDNfREFUQTIJCTB4RkZDMDJDNjgJLyogTWFpbGJveCAzIERhdGEgV29yZCAyIFs0NzozMl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDNfREFUQTMJCTB4RkZDMDJDNkMJLyogTWFpbGJveCAzIERhdGEgV29yZCAzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDNfTEVOR1RICQkweEZGQzAyQzcwCS8qIE1haWxib3ggMyBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAzX1RJTUVTVEFNUAkweEZGQzAyQzc0CS8qIE1haWxib3ggMyBUaW1lIFN0YW1wCVZhbHVlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAzX0lEMAkJMHhGRkMwMkM3OAkvKiBNYWlsYm94IDMgSWRlbnRpZmllcglMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDNfSUQxCQkweEZGQzAyQzdDCS8qIE1haWxib3ggMyBJZGVudGlmaWVyCUhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIwNF9EQVRBMAkJMHhGRkMwMkM4MAkvKiBNYWlsYm94IDQgRGF0YSBXb3JkIDAgWzE1OjBdCVJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA0X0RBVEExCQkweEZGQzAyQzg0CS8qIE1haWxib3ggNCBEYXRhIFdvcmQgMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA0X0RBVEEyCQkweEZGQzAyQzg4CS8qIE1haWxib3ggNCBEYXRhIFdvcmQgMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA0X0RBVEEzCQkweEZGQzAyQzhDCS8qIE1haWxib3ggNCBEYXRhIFdvcmQgMyBbNjM6NDhdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA0X0xFTkdUSAkJMHhGRkMwMkM5MAkvKiBNYWlsYm94IDQgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwNF9USU1FU1RBTVAJMHhGRkMwMkM5NAkvKiBNYWlsYm94IDQgVGltZSBTdGFtcAlWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwNF9JRDAJCTB4RkZDMDJDOTgJLyogTWFpbGJveCA0IElkZW50aWZpZXIJTG93IFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA0X0lEMQkJMHhGRkMwMkM5QwkvKiBNYWlsYm94IDQgSWRlbnRpZmllcglIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMDVfREFUQTAJCTB4RkZDMDJDQTAJLyogTWFpbGJveCA1IERhdGEgV29yZCAwIFsxNTowXQlSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwNV9EQVRBMQkJMHhGRkMwMkNBNAkvKiBNYWlsYm94IDUgRGF0YSBXb3JkIDEgWzMxOjE2XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwNV9EQVRBMgkJMHhGRkMwMkNBOAkvKiBNYWlsYm94IDUgRGF0YSBXb3JkIDIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwNV9EQVRBMwkJMHhGRkMwMkNBQwkvKiBNYWlsYm94IDUgRGF0YSBXb3JkIDMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwNV9MRU5HVEgJCTB4RkZDMDJDQjAJLyogTWFpbGJveCA1IERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDVfVElNRVNUQU1QCTB4RkZDMDJDQjQJLyogTWFpbGJveCA1IFRpbWUgU3RhbXAJVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDVfSUQwCQkweEZGQzAyQ0I4CS8qIE1haWxib3ggNSBJZGVudGlmaWVyCUxvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwNV9JRDEJCTB4RkZDMDJDQkMJLyogTWFpbGJveCA1IElkZW50aWZpZXIJSGlnaCBSZWdpc3RlciAqLworCisjZGVmaW5lCUNBTl9NQjA2X0RBVEEwCQkweEZGQzAyQ0MwCS8qIE1haWxib3ggNiBEYXRhIFdvcmQgMCBbMTU6MF0JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDZfREFUQTEJCTB4RkZDMDJDQzQJLyogTWFpbGJveCA2IERhdGEgV29yZCAxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDZfREFUQTIJCTB4RkZDMDJDQzgJLyogTWFpbGJveCA2IERhdGEgV29yZCAyIFs0NzozMl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDZfREFUQTMJCTB4RkZDMDJDQ0MJLyogTWFpbGJveCA2IERhdGEgV29yZCAzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDZfTEVOR1RICQkweEZGQzAyQ0QwCS8qIE1haWxib3ggNiBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA2X1RJTUVTVEFNUAkweEZGQzAyQ0Q0CS8qIE1haWxib3ggNiBUaW1lIFN0YW1wCVZhbHVlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA2X0lEMAkJMHhGRkMwMkNEOAkvKiBNYWlsYm94IDYgSWRlbnRpZmllcglMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDZfSUQxCQkweEZGQzAyQ0RDCS8qIE1haWxib3ggNiBJZGVudGlmaWVyCUhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIwN19EQVRBMAkJMHhGRkMwMkNFMAkvKiBNYWlsYm94IDcgRGF0YSBXb3JkIDAgWzE1OjBdCVJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA3X0RBVEExCQkweEZGQzAyQ0U0CS8qIE1haWxib3ggNyBEYXRhIFdvcmQgMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA3X0RBVEEyCQkweEZGQzAyQ0U4CS8qIE1haWxib3ggNyBEYXRhIFdvcmQgMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA3X0RBVEEzCQkweEZGQzAyQ0VDCS8qIE1haWxib3ggNyBEYXRhIFdvcmQgMyBbNjM6NDhdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA3X0xFTkdUSAkJMHhGRkMwMkNGMAkvKiBNYWlsYm94IDcgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwN19USU1FU1RBTVAJMHhGRkMwMkNGNAkvKiBNYWlsYm94IDcgVGltZSBTdGFtcAlWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwN19JRDAJCTB4RkZDMDJDRjgJLyogTWFpbGJveCA3IElkZW50aWZpZXIJTG93IFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA3X0lEMQkJMHhGRkMwMkNGQwkvKiBNYWlsYm94IDcgSWRlbnRpZmllcglIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMDhfREFUQTAJCTB4RkZDMDJEMDAJLyogTWFpbGJveCA4IERhdGEgV29yZCAwIFsxNTowXQlSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwOF9EQVRBMQkJMHhGRkMwMkQwNAkvKiBNYWlsYm94IDggRGF0YSBXb3JkIDEgWzMxOjE2XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwOF9EQVRBMgkJMHhGRkMwMkQwOAkvKiBNYWlsYm94IDggRGF0YSBXb3JkIDIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwOF9EQVRBMwkJMHhGRkMwMkQwQwkvKiBNYWlsYm94IDggRGF0YSBXb3JkIDMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwOF9MRU5HVEgJCTB4RkZDMDJEMTAJLyogTWFpbGJveCA4IERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDhfVElNRVNUQU1QCTB4RkZDMDJEMTQJLyogTWFpbGJveCA4IFRpbWUgU3RhbXAJVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDhfSUQwCQkweEZGQzAyRDE4CS8qIE1haWxib3ggOCBJZGVudGlmaWVyCUxvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwOF9JRDEJCTB4RkZDMDJEMUMJLyogTWFpbGJveCA4IElkZW50aWZpZXIJSGlnaCBSZWdpc3RlciAqLworCisjZGVmaW5lCUNBTl9NQjA5X0RBVEEwCQkweEZGQzAyRDIwCS8qIE1haWxib3ggOSBEYXRhIFdvcmQgMCBbMTU6MF0JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDlfREFUQTEJCTB4RkZDMDJEMjQJLyogTWFpbGJveCA5IERhdGEgV29yZCAxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDlfREFUQTIJCTB4RkZDMDJEMjgJLyogTWFpbGJveCA5IERhdGEgV29yZCAyIFs0NzozMl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDlfREFUQTMJCTB4RkZDMDJEMkMJLyogTWFpbGJveCA5IERhdGEgV29yZCAzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDlfTEVOR1RICQkweEZGQzAyRDMwCS8qIE1haWxib3ggOSBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA5X1RJTUVTVEFNUAkweEZGQzAyRDM0CS8qIE1haWxib3ggOSBUaW1lIFN0YW1wCVZhbHVlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA5X0lEMAkJMHhGRkMwMkQzOAkvKiBNYWlsYm94IDkgSWRlbnRpZmllcglMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDlfSUQxCQkweEZGQzAyRDNDCS8qIE1haWxib3ggOSBJZGVudGlmaWVyCUhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIxMF9EQVRBMAkJMHhGRkMwMkQ0MAkvKiBNYWlsYm94IDEwIERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMF9EQVRBMQkJMHhGRkMwMkQ0NAkvKiBNYWlsYm94IDEwIERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTBfREFUQTIJCTB4RkZDMDJENDgJLyogTWFpbGJveCAxMCBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjEwX0RBVEEzCQkweEZGQzAyRDRDCS8qIE1haWxib3ggMTAgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMF9MRU5HVEgJCTB4RkZDMDJENTAJLyogTWFpbGJveCAxMCBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjEwX1RJTUVTVEFNUAkweEZGQzAyRDU0CS8qIE1haWxib3ggMTAgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMF9JRDAJCTB4RkZDMDJENTgJLyogTWFpbGJveCAxMCBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMF9JRDEJCTB4RkZDMDJENUMJLyogTWFpbGJveCAxMCBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIxMV9EQVRBMAkJMHhGRkMwMkQ2MAkvKiBNYWlsYm94IDExIERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMV9EQVRBMQkJMHhGRkMwMkQ2NAkvKiBNYWlsYm94IDExIERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTFfREFUQTIJCTB4RkZDMDJENjgJLyogTWFpbGJveCAxMSBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjExX0RBVEEzCQkweEZGQzAyRDZDCS8qIE1haWxib3ggMTEgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMV9MRU5HVEgJCTB4RkZDMDJENzAJLyogTWFpbGJveCAxMSBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjExX1RJTUVTVEFNUAkweEZGQzAyRDc0CS8qIE1haWxib3ggMTEgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMV9JRDAJCTB4RkZDMDJENzgJLyogTWFpbGJveCAxMSBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMV9JRDEJCTB4RkZDMDJEN0MJLyogTWFpbGJveCAxMSBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIxMl9EQVRBMAkJMHhGRkMwMkQ4MAkvKiBNYWlsYm94IDEyIERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMl9EQVRBMQkJMHhGRkMwMkQ4NAkvKiBNYWlsYm94IDEyIERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTJfREFUQTIJCTB4RkZDMDJEODgJLyogTWFpbGJveCAxMiBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjEyX0RBVEEzCQkweEZGQzAyRDhDCS8qIE1haWxib3ggMTIgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMl9MRU5HVEgJCTB4RkZDMDJEOTAJLyogTWFpbGJveCAxMiBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjEyX1RJTUVTVEFNUAkweEZGQzAyRDk0CS8qIE1haWxib3ggMTIgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMl9JRDAJCTB4RkZDMDJEOTgJLyogTWFpbGJveCAxMiBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMl9JRDEJCTB4RkZDMDJEOUMJLyogTWFpbGJveCAxMiBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIxM19EQVRBMAkJMHhGRkMwMkRBMAkvKiBNYWlsYm94IDEzIERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxM19EQVRBMQkJMHhGRkMwMkRBNAkvKiBNYWlsYm94IDEzIERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTNfREFUQTIJCTB4RkZDMDJEQTgJLyogTWFpbGJveCAxMyBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjEzX0RBVEEzCQkweEZGQzAyREFDCS8qIE1haWxib3ggMTMgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxM19MRU5HVEgJCTB4RkZDMDJEQjAJLyogTWFpbGJveCAxMyBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjEzX1RJTUVTVEFNUAkweEZGQzAyREI0CS8qIE1haWxib3ggMTMgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxM19JRDAJCTB4RkZDMDJEQjgJLyogTWFpbGJveCAxMyBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxM19JRDEJCTB4RkZDMDJEQkMJLyogTWFpbGJveCAxMyBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIxNF9EQVRBMAkJMHhGRkMwMkRDMAkvKiBNYWlsYm94IDE0IERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNF9EQVRBMQkJMHhGRkMwMkRDNAkvKiBNYWlsYm94IDE0IERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTRfREFUQTIJCTB4RkZDMDJEQzgJLyogTWFpbGJveCAxNCBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE0X0RBVEEzCQkweEZGQzAyRENDCS8qIE1haWxib3ggMTQgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNF9MRU5HVEgJCTB4RkZDMDJERDAJLyogTWFpbGJveCAxNCBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE0X1RJTUVTVEFNUAkweEZGQzAyREQ0CS8qIE1haWxib3ggMTQgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNF9JRDAJCTB4RkZDMDJERDgJLyogTWFpbGJveCAxNCBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNF9JRDEJCTB4RkZDMDJEREMJLyogTWFpbGJveCAxNCBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIxNV9EQVRBMAkJMHhGRkMwMkRFMAkvKiBNYWlsYm94IDE1IERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNV9EQVRBMQkJMHhGRkMwMkRFNAkvKiBNYWlsYm94IDE1IERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTVfREFUQTIJCTB4RkZDMDJERTgJLyogTWFpbGJveCAxNSBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE1X0RBVEEzCQkweEZGQzAyREVDCS8qIE1haWxib3ggMTUgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNV9MRU5HVEgJCTB4RkZDMDJERjAJLyogTWFpbGJveCAxNSBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE1X1RJTUVTVEFNUAkweEZGQzAyREY0CS8qIE1haWxib3ggMTUgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNV9JRDAJCTB4RkZDMDJERjgJLyogTWFpbGJveCAxNSBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNV9JRDEJCTB4RkZDMDJERkMJLyogTWFpbGJveCAxNSBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIxNl9EQVRBMAkJMHhGRkMwMkUwMAkvKiBNYWlsYm94IDE2IERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNl9EQVRBMQkJMHhGRkMwMkUwNAkvKiBNYWlsYm94IDE2IERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTZfREFUQTIJCTB4RkZDMDJFMDgJLyogTWFpbGJveCAxNiBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE2X0RBVEEzCQkweEZGQzAyRTBDCS8qIE1haWxib3ggMTYgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNl9MRU5HVEgJCTB4RkZDMDJFMTAJLyogTWFpbGJveCAxNiBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE2X1RJTUVTVEFNUAkweEZGQzAyRTE0CS8qIE1haWxib3ggMTYgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNl9JRDAJCTB4RkZDMDJFMTgJLyogTWFpbGJveCAxNiBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNl9JRDEJCTB4RkZDMDJFMUMJLyogTWFpbGJveCAxNiBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIxN19EQVRBMAkJMHhGRkMwMkUyMAkvKiBNYWlsYm94IDE3IERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxN19EQVRBMQkJMHhGRkMwMkUyNAkvKiBNYWlsYm94IDE3IERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTdfREFUQTIJCTB4RkZDMDJFMjgJLyogTWFpbGJveCAxNyBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE3X0RBVEEzCQkweEZGQzAyRTJDCS8qIE1haWxib3ggMTcgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxN19MRU5HVEgJCTB4RkZDMDJFMzAJLyogTWFpbGJveCAxNyBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE3X1RJTUVTVEFNUAkweEZGQzAyRTM0CS8qIE1haWxib3ggMTcgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxN19JRDAJCTB4RkZDMDJFMzgJLyogTWFpbGJveCAxNyBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxN19JRDEJCTB4RkZDMDJFM0MJLyogTWFpbGJveCAxNyBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIxOF9EQVRBMAkJMHhGRkMwMkU0MAkvKiBNYWlsYm94IDE4IERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxOF9EQVRBMQkJMHhGRkMwMkU0NAkvKiBNYWlsYm94IDE4IERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMThfREFUQTIJCTB4RkZDMDJFNDgJLyogTWFpbGJveCAxOCBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE4X0RBVEEzCQkweEZGQzAyRTRDCS8qIE1haWxib3ggMTggRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxOF9MRU5HVEgJCTB4RkZDMDJFNTAJLyogTWFpbGJveCAxOCBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE4X1RJTUVTVEFNUAkweEZGQzAyRTU0CS8qIE1haWxib3ggMTggVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxOF9JRDAJCTB4RkZDMDJFNTgJLyogTWFpbGJveCAxOCBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxOF9JRDEJCTB4RkZDMDJFNUMJLyogTWFpbGJveCAxOCBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIxOV9EQVRBMAkJMHhGRkMwMkU2MAkvKiBNYWlsYm94IDE5IERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxOV9EQVRBMQkJMHhGRkMwMkU2NAkvKiBNYWlsYm94IDE5IERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTlfREFUQTIJCTB4RkZDMDJFNjgJLyogTWFpbGJveCAxOSBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE5X0RBVEEzCQkweEZGQzAyRTZDCS8qIE1haWxib3ggMTkgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxOV9MRU5HVEgJCTB4RkZDMDJFNzAJLyogTWFpbGJveCAxOSBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE5X1RJTUVTVEFNUAkweEZGQzAyRTc0CS8qIE1haWxib3ggMTkgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxOV9JRDAJCTB4RkZDMDJFNzgJLyogTWFpbGJveCAxOSBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxOV9JRDEJCTB4RkZDMDJFN0MJLyogTWFpbGJveCAxOSBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIyMF9EQVRBMAkJMHhGRkMwMkU4MAkvKiBNYWlsYm94IDIwIERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMF9EQVRBMQkJMHhGRkMwMkU4NAkvKiBNYWlsYm94IDIwIERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjBfREFUQTIJCTB4RkZDMDJFODgJLyogTWFpbGJveCAyMCBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjIwX0RBVEEzCQkweEZGQzAyRThDCS8qIE1haWxib3ggMjAgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMF9MRU5HVEgJCTB4RkZDMDJFOTAJLyogTWFpbGJveCAyMCBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjIwX1RJTUVTVEFNUAkweEZGQzAyRTk0CS8qIE1haWxib3ggMjAgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMF9JRDAJCTB4RkZDMDJFOTgJLyogTWFpbGJveCAyMCBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMF9JRDEJCTB4RkZDMDJFOUMJLyogTWFpbGJveCAyMCBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIyMV9EQVRBMAkJMHhGRkMwMkVBMAkvKiBNYWlsYm94IDIxIERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMV9EQVRBMQkJMHhGRkMwMkVBNAkvKiBNYWlsYm94IDIxIERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjFfREFUQTIJCTB4RkZDMDJFQTgJLyogTWFpbGJveCAyMSBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjIxX0RBVEEzCQkweEZGQzAyRUFDCS8qIE1haWxib3ggMjEgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMV9MRU5HVEgJCTB4RkZDMDJFQjAJLyogTWFpbGJveCAyMSBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjIxX1RJTUVTVEFNUAkweEZGQzAyRUI0CS8qIE1haWxib3ggMjEgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMV9JRDAJCTB4RkZDMDJFQjgJLyogTWFpbGJveCAyMSBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMV9JRDEJCTB4RkZDMDJFQkMJLyogTWFpbGJveCAyMSBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIyMl9EQVRBMAkJMHhGRkMwMkVDMAkvKiBNYWlsYm94IDIyIERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMl9EQVRBMQkJMHhGRkMwMkVDNAkvKiBNYWlsYm94IDIyIERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjJfREFUQTIJCTB4RkZDMDJFQzgJLyogTWFpbGJveCAyMiBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjIyX0RBVEEzCQkweEZGQzAyRUNDCS8qIE1haWxib3ggMjIgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMl9MRU5HVEgJCTB4RkZDMDJFRDAJLyogTWFpbGJveCAyMiBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjIyX1RJTUVTVEFNUAkweEZGQzAyRUQ0CS8qIE1haWxib3ggMjIgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMl9JRDAJCTB4RkZDMDJFRDgJLyogTWFpbGJveCAyMiBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMl9JRDEJCTB4RkZDMDJFREMJLyogTWFpbGJveCAyMiBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIyM19EQVRBMAkJMHhGRkMwMkVFMAkvKiBNYWlsYm94IDIzIERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyM19EQVRBMQkJMHhGRkMwMkVFNAkvKiBNYWlsYm94IDIzIERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjNfREFUQTIJCTB4RkZDMDJFRTgJLyogTWFpbGJveCAyMyBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjIzX0RBVEEzCQkweEZGQzAyRUVDCS8qIE1haWxib3ggMjMgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyM19MRU5HVEgJCTB4RkZDMDJFRjAJLyogTWFpbGJveCAyMyBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjIzX1RJTUVTVEFNUAkweEZGQzAyRUY0CS8qIE1haWxib3ggMjMgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyM19JRDAJCTB4RkZDMDJFRjgJLyogTWFpbGJveCAyMyBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyM19JRDEJCTB4RkZDMDJFRkMJLyogTWFpbGJveCAyMyBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIyNF9EQVRBMAkJMHhGRkMwMkYwMAkvKiBNYWlsYm94IDI0IERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNF9EQVRBMQkJMHhGRkMwMkYwNAkvKiBNYWlsYm94IDI0IERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjRfREFUQTIJCTB4RkZDMDJGMDgJLyogTWFpbGJveCAyNCBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI0X0RBVEEzCQkweEZGQzAyRjBDCS8qIE1haWxib3ggMjQgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNF9MRU5HVEgJCTB4RkZDMDJGMTAJLyogTWFpbGJveCAyNCBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI0X1RJTUVTVEFNUAkweEZGQzAyRjE0CS8qIE1haWxib3ggMjQgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNF9JRDAJCTB4RkZDMDJGMTgJLyogTWFpbGJveCAyNCBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNF9JRDEJCTB4RkZDMDJGMUMJLyogTWFpbGJveCAyNCBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIyNV9EQVRBMAkJMHhGRkMwMkYyMAkvKiBNYWlsYm94IDI1IERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNV9EQVRBMQkJMHhGRkMwMkYyNAkvKiBNYWlsYm94IDI1IERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjVfREFUQTIJCTB4RkZDMDJGMjgJLyogTWFpbGJveCAyNSBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI1X0RBVEEzCQkweEZGQzAyRjJDCS8qIE1haWxib3ggMjUgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNV9MRU5HVEgJCTB4RkZDMDJGMzAJLyogTWFpbGJveCAyNSBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI1X1RJTUVTVEFNUAkweEZGQzAyRjM0CS8qIE1haWxib3ggMjUgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNV9JRDAJCTB4RkZDMDJGMzgJLyogTWFpbGJveCAyNSBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNV9JRDEJCTB4RkZDMDJGM0MJLyogTWFpbGJveCAyNSBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIyNl9EQVRBMAkJMHhGRkMwMkY0MAkvKiBNYWlsYm94IDI2IERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNl9EQVRBMQkJMHhGRkMwMkY0NAkvKiBNYWlsYm94IDI2IERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjZfREFUQTIJCTB4RkZDMDJGNDgJLyogTWFpbGJveCAyNiBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI2X0RBVEEzCQkweEZGQzAyRjRDCS8qIE1haWxib3ggMjYgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNl9MRU5HVEgJCTB4RkZDMDJGNTAJLyogTWFpbGJveCAyNiBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI2X1RJTUVTVEFNUAkweEZGQzAyRjU0CS8qIE1haWxib3ggMjYgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNl9JRDAJCTB4RkZDMDJGNTgJLyogTWFpbGJveCAyNiBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNl9JRDEJCTB4RkZDMDJGNUMJLyogTWFpbGJveCAyNiBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIyN19EQVRBMAkJMHhGRkMwMkY2MAkvKiBNYWlsYm94IDI3IERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyN19EQVRBMQkJMHhGRkMwMkY2NAkvKiBNYWlsYm94IDI3IERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjdfREFUQTIJCTB4RkZDMDJGNjgJLyogTWFpbGJveCAyNyBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI3X0RBVEEzCQkweEZGQzAyRjZDCS8qIE1haWxib3ggMjcgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyN19MRU5HVEgJCTB4RkZDMDJGNzAJLyogTWFpbGJveCAyNyBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI3X1RJTUVTVEFNUAkweEZGQzAyRjc0CS8qIE1haWxib3ggMjcgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyN19JRDAJCTB4RkZDMDJGNzgJLyogTWFpbGJveCAyNyBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyN19JRDEJCTB4RkZDMDJGN0MJLyogTWFpbGJveCAyNyBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIyOF9EQVRBMAkJMHhGRkMwMkY4MAkvKiBNYWlsYm94IDI4IERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyOF9EQVRBMQkJMHhGRkMwMkY4NAkvKiBNYWlsYm94IDI4IERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjhfREFUQTIJCTB4RkZDMDJGODgJLyogTWFpbGJveCAyOCBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI4X0RBVEEzCQkweEZGQzAyRjhDCS8qIE1haWxib3ggMjggRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyOF9MRU5HVEgJCTB4RkZDMDJGOTAJLyogTWFpbGJveCAyOCBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI4X1RJTUVTVEFNUAkweEZGQzAyRjk0CS8qIE1haWxib3ggMjggVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyOF9JRDAJCTB4RkZDMDJGOTgJLyogTWFpbGJveCAyOCBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyOF9JRDEJCTB4RkZDMDJGOUMJLyogTWFpbGJveCAyOCBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIyOV9EQVRBMAkJMHhGRkMwMkZBMAkvKiBNYWlsYm94IDI5IERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyOV9EQVRBMQkJMHhGRkMwMkZBNAkvKiBNYWlsYm94IDI5IERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjlfREFUQTIJCTB4RkZDMDJGQTgJLyogTWFpbGJveCAyOSBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI5X0RBVEEzCQkweEZGQzAyRkFDCS8qIE1haWxib3ggMjkgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyOV9MRU5HVEgJCTB4RkZDMDJGQjAJLyogTWFpbGJveCAyOSBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI5X1RJTUVTVEFNUAkweEZGQzAyRkI0CS8qIE1haWxib3ggMjkgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyOV9JRDAJCTB4RkZDMDJGQjgJLyogTWFpbGJveCAyOSBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyOV9JRDEJCTB4RkZDMDJGQkMJLyogTWFpbGJveCAyOSBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIzMF9EQVRBMAkJMHhGRkMwMkZDMAkvKiBNYWlsYm94IDMwIERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIzMF9EQVRBMQkJMHhGRkMwMkZDNAkvKiBNYWlsYm94IDMwIERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMzBfREFUQTIJCTB4RkZDMDJGQzgJLyogTWFpbGJveCAzMCBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjMwX0RBVEEzCQkweEZGQzAyRkNDCS8qIE1haWxib3ggMzAgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIzMF9MRU5HVEgJCTB4RkZDMDJGRDAJLyogTWFpbGJveCAzMCBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjMwX1RJTUVTVEFNUAkweEZGQzAyRkQ0CS8qIE1haWxib3ggMzAgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIzMF9JRDAJCTB4RkZDMDJGRDgJLyogTWFpbGJveCAzMCBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIzMF9JRDEJCTB4RkZDMDJGREMJLyogTWFpbGJveCAzMCBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIzMV9EQVRBMAkJMHhGRkMwMkZFMAkvKiBNYWlsYm94IDMxIERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIzMV9EQVRBMQkJMHhGRkMwMkZFNAkvKiBNYWlsYm94IDMxIERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMzFfREFUQTIJCTB4RkZDMDJGRTgJLyogTWFpbGJveCAzMSBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjMxX0RBVEEzCQkweEZGQzAyRkVDCS8qIE1haWxib3ggMzEgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIzMV9MRU5HVEgJCTB4RkZDMDJGRjAJLyogTWFpbGJveCAzMSBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjMxX1RJTUVTVEFNUAkweEZGQzAyRkY0CS8qIE1haWxib3ggMzEgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIzMV9JRDAJCTB4RkZDMDJGRjgJLyogTWFpbGJveCAzMSBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIzMV9JRDEJCTB4RkZDMDJGRkMJLyogTWFpbGJveCAzMSBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworLyogQ0FOIE1haWxib3ggQXJlYSBNYWNyb3MgKi8KKyNkZWZpbmUJQ0FOX01CX0lEMSh4KQkJKENBTl9NQjAwX0lEMSsoKHgpKjB4MjApKQorI2RlZmluZQlDQU5fTUJfSUQwKHgpCQkoQ0FOX01CMDBfSUQwKygoeCkqMHgyMCkpCisjZGVmaW5lCUNBTl9NQl9USU1FU1RBTVAoeCkJKENBTl9NQjAwX1RJTUVTVEFNUCsoKHgpKjB4MjApKQorI2RlZmluZQlDQU5fTUJfTEVOR1RIKHgpCShDQU5fTUIwMF9MRU5HVEgrKCh4KSoweDIwKSkKKyNkZWZpbmUJQ0FOX01CX0RBVEEzKHgpCQkoQ0FOX01CMDBfREFUQTMrKCh4KSoweDIwKSkKKyNkZWZpbmUJQ0FOX01CX0RBVEEyKHgpCQkoQ0FOX01CMDBfREFUQTIrKCh4KSoweDIwKSkKKyNkZWZpbmUJQ0FOX01CX0RBVEExKHgpCQkoQ0FOX01CMDBfREFUQTErKCh4KSoweDIwKSkKKyNkZWZpbmUJQ0FOX01CX0RBVEEwKHgpCQkoQ0FOX01CMDBfREFUQTArKCh4KSoweDIwKSkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qIFN5c3RlbSBNTVIgUmVnaXN0ZXIgQml0cyBhbmQJTWFjcm9zICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKiogUExMIEFORCBSRVNFVCBNQVNLUyAqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qIFBMTF9DVEwgTWFza3MgKi8KKyNkZWZpbmUJUExMX0NMS0lOCQkJMHgwMDAwCS8qIFBhc3MJQ0xLSU4gdG8gUExMICovCisjZGVmaW5lCVBMTF9DTEtJTl9ESVYyCQkweDAwMDEJLyogUGFzcwlDTEtJTi8yCXRvIFBMTCAqLworI2RlZmluZQlERgkJCQkJMHgwMDAxCSAvKiAwOiBQTEwgPSBDTEtJTiwgMTogUExMID0gQ0xLSU4vMiAqLworI2RlZmluZQlQTExfT0ZGCQkJCTB4MDAwMgkvKiBTaHV0CW9mZiBQTEwJY2xvY2tzICovCisKKyNkZWZpbmUJU1RPUENLCQkJCTB4MDAwOAkvKiBDb3JlCUNsb2NrIE9mZgkJICovCisjZGVmaW5lCVBEV04JCQkJMHgwMDIwCS8qIFB1dCB0aGUgUExMIGluIGEgRGVlcCBTbGVlcCBzdGF0ZSAqLworI2RlZmluZQlJTl9ERUxBWQkJCTB4MDAxNAkvKiBFQklVCUlucHV0IERlbGF5IFNlbGVjdCAqLworI2RlZmluZQlPVVRfREVMQVkJCQkweDAwQzAJLyogRUJJVQlPdXRwdXQgRGVsYXkgU2VsZWN0ICovCisjZGVmaW5lCUJZUEFTUwkJCQkweDAxMDAJLyogQnlwYXNzIHRoZSBQTEwgKi8KKyNkZWZpbmUJTVNFTAkJCTB4N0UwMAkvKiBNdWx0aXBsaWVyIFNlbGVjdCBGb3IgQ0NMSy9WQ08gRmFjdG9ycyAqLworCisvKiBQTExfQ1RMIE1hY3JvcwkJCQkgKi8KKyNpZmRlZiBfTUlTUkFfUlVMRVMKKyNkZWZpbmUJU0VUX01TRUwoeCkJCSgoKHgpJjB4M0Z1KSA8PAkweDkpCS8qIFNldCBNU0VMID0gMC02MyAtLT4gVkNPID0gQ0xLSU4qTVNFTCAqLworI2RlZmluZQlTRVRfT1VUX0RFTEFZKHgpCSgoKHgpJjB4MDN1KSA8PAkweDYpCisjZGVmaW5lCVNFVF9JTl9ERUxBWSh4KQkJKCgoKHgpJjB4MDJ1KSA8PCAweDMpIHwJKCgoeCkmMHgwMXUpIDw8CTB4MikpCisjZWxzZQorI2RlZmluZQlTRVRfTVNFTCh4KQkJKCgoeCkmMHgzRikgPDwgMHg5KQkvKiBTZXQgTVNFTCA9IDAtNjMgLS0+IFZDTyA9IENMS0lOKk1TRUwgKi8KKyNkZWZpbmUJU0VUX09VVF9ERUxBWSh4KQkoKCh4KSYweDAzKSA8PCAweDYpCisjZGVmaW5lCVNFVF9JTl9ERUxBWSh4KQkJKCgoKHgpJjB4MDIpIDw8CTB4MykgfCAoKCh4KSYweDAxKSA8PCAweDIpKQorI2VuZGlmIC8qIF9NSVNSQV9SVUxFUyAqLworCisvKiBQTExfRElWIE1hc2tzICovCisjZGVmaW5lCVNTRUwJCQkJMHgwMDBGCS8qIFN5c3RlbSBTZWxlY3QgKi8KKyNkZWZpbmUJQ1NFTAkJCQkweDAwMzAJLyogQ29yZQlTZWxlY3QgKi8KKyNkZWZpbmUJQ1NFTF9ESVYxCQkweDAwMDAJLyoJCUNDTEsgPSBWQ08gLyAxICovCisjZGVmaW5lCUNTRUxfRElWMgkJMHgwMDEwCS8qCQlDQ0xLID0gVkNPIC8gMiAqLworI2RlZmluZQlDU0VMX0RJVjQJCTB4MDAyMAkvKgkJQ0NMSyA9IFZDTyAvIDQgKi8KKyNkZWZpbmUJQ1NFTF9ESVY4CQkweDAwMzAJLyoJCUNDTEsgPSBWQ08gLyA4ICovCisKKyNkZWZpbmUJU0NMS19ESVYoeCkJCQkoeCkJCS8qIFNDTEsJPSBWQ08gLwl4ICovCisKKy8qIFBMTF9ESVYgTWFjcm9zCQkJCQkJCSAqLworI2lmZGVmIF9NSVNSQV9SVUxFUworI2RlZmluZQlTRVRfU1NFTCh4KQkJCSgoeCkmMHhGdSkJLyogU2V0IFNTRUwgPSAwLTE1IC0tPiBTQ0xLID0gVkNPL1NTRUwgKi8KKyNlbHNlCisjZGVmaW5lCVNFVF9TU0VMKHgpCQkJKCh4KSYweEYpCS8qIFNldCBTU0VMID0gMC0xNSAtLT4gU0NMSyA9IFZDTy9TU0VMICovCisjZW5kaWYgLyogX01JU1JBX1JVTEVTICovCisKKy8qIFBMTF9TVEFUIE1hc2tzCQkJCQkJCQkJCSAqLworI2RlZmluZQlBQ1RJVkVfUExMRU5BQkxFRAkweDAwMDEJLyogUHJvY2Vzc29yIEluCUFjdGl2ZSBNb2RlIFdpdGggUExMIEVuYWJsZWQgKi8KKyNkZWZpbmUJRlVMTF9PTgkJCQkweDAwMDIJLyogUHJvY2Vzc29yIEluCUZ1bGwgT24JTW9kZSAqLworI2RlZmluZQlBQ1RJVkVfUExMRElTQUJMRUQJMHgwMDA0CS8qIFByb2Nlc3NvciBJbglBY3RpdmUgTW9kZSBXaXRoIFBMTCBEaXNhYmxlZCAqLworI2RlZmluZQlQTExfTE9DS0VECQkJMHgwMDIwCS8qIFBMTF9MT0NLQ05UIEhhcyBCZWVuCVJlYWNoZWQgKi8KKworLyogVlJfQ1RMIE1hc2tzCQkJCQkJCQkJCSAqLworI2RlZmluZQlGUkVRCQkJMHgwMDAzCS8qIFN3aXRjaGluZyBPc2NpbGxhdG9yCUZyZXF1ZW5jeSBGb3IgUmVndWxhdG9yICovCisjZGVmaW5lCUhJQkVSTkFURQkJMHgwMDAwCS8qCQlQb3dlcmRvd24vQnlwYXNzIE9uLUJvYXJkIFJlZ3VsYXRpb24gKi8KKyNkZWZpbmUJRlJFUV8zMzMJCTB4MDAwMQkvKgkJU3dpdGNoaW5nIEZyZXF1ZW5jeSBJcyAzMzMga0h6ICovCisjZGVmaW5lCUZSRVFfNjY3CQkweDAwMDIJLyoJCVN3aXRjaGluZyBGcmVxdWVuY3kgSXMgNjY3IGtIeiAqLworI2RlZmluZQlGUkVRXzEwMDAJCTB4MDAwMwkvKgkJU3dpdGNoaW5nIEZyZXF1ZW5jeSBJcyAxIE1IeiAqLworCisjZGVmaW5lCUdBSU4JCQkweDAwMEMJLyogVm9sdGFnZSBMZXZlbCBHYWluICovCisjZGVmaW5lCUdBSU5fNQkJCTB4MDAwMAkvKgkJR0FJTiA9IDUgKi8KKyNkZWZpbmUJR0FJTl8xMAkJCTB4MDAwNAkvKgkJR0FJTiA9IDEwICovCisjZGVmaW5lCUdBSU5fMjAJCQkweDAwMDgJLyoJCUdBSU4gPSAyMCAqLworI2RlZmluZQlHQUlOXzUwCQkJMHgwMDBDCS8qCQlHQUlOID0gNTAgKi8KKworI2RlZmluZQlWTEVWCQkJMHgwMEYwCS8qIEludGVybmFsIFZvbHRhZ2UgTGV2ZWwgLSBPbmx5IFByb2dyYW0gVmFsdWVzCVdpdGhpbiBTcGVjaWZpY2F0aW9ucyAqLworI2RlZmluZQlWTEVWXzEwMAkJMHgwMDkwCS8qCVZMRVYgPSAxLjAwIFYgKFNlZSBEYXRhc2hlZXQgZm9yIFJlZ3VsYXRvciBUb2xlcmFuY2UpICovCisjZGVmaW5lCVZMRVZfMTA1CQkweDAwQTAJLyoJVkxFViA9IDEuMDUgViAoU2VlIERhdGFzaGVldCBmb3IgUmVndWxhdG9yIFRvbGVyYW5jZSkgKi8KKyNkZWZpbmUJVkxFVl8xMTAJCTB4MDBCMAkvKglWTEVWID0gMS4xMCBWIChTZWUgRGF0YXNoZWV0IGZvciBSZWd1bGF0b3IgVG9sZXJhbmNlKSAqLworI2RlZmluZQlWTEVWXzExNQkJMHgwMEMwCS8qCVZMRVYgPSAxLjE1IFYgKFNlZSBEYXRhc2hlZXQgZm9yIFJlZ3VsYXRvciBUb2xlcmFuY2UpICovCisjZGVmaW5lCVZMRVZfMTIwCQkweDAwRDAJLyoJVkxFViA9IDEuMjAgViAoU2VlIERhdGFzaGVldCBmb3IgUmVndWxhdG9yIFRvbGVyYW5jZSkgKi8KKyNkZWZpbmUJVkxFVl8xMjUJCTB4MDBFMAkvKglWTEVWID0gMS4yNSBWIChTZWUgRGF0YXNoZWV0IGZvciBSZWd1bGF0b3IgVG9sZXJhbmNlKSAqLworI2RlZmluZQlWTEVWXzEzMAkJMHgwMEYwCS8qCVZMRVYgPSAxLjMwIFYgKFNlZSBEYXRhc2hlZXQgZm9yIFJlZ3VsYXRvciBUb2xlcmFuY2UpICovCisKKyNkZWZpbmUJV0FLRQkJCTB4MDEwMAkvKiBFbmFibGUgUlRDL1Jlc2V0IFdha2V1cCBGcm9tCUhpYmVybmF0ZSAqLworI2RlZmluZQlDQU5XRQkJCTB4MDIwMAkvKiBFbmFibGUgQ0FOIFdha2V1cCBGcm9tIEhpYmVybmF0ZSAqLworI2RlZmluZQlNWFZSV0UJCQkweDA0MDAJLyogRW5hYmxlIE1YVlIgV2FrZXVwIEZyb20gSGliZXJuYXRlICovCisjZGVmaW5lCVNDS0VMT1cJCQkweDgwMDAJLyogRG8gTm90IERyaXZlCVNDS0UgSGlnaCBEdXJpbmcgUmVzZXQgQWZ0ZXIgSGliZXJuYXRlICovCisKKy8qIFNXUlNUIE1hc2sgKi8KKyNkZWZpbmUJU1lTVEVNX1JFU0VUCTB4MDAwNwkvKiBJbml0aWF0ZXMgQSBTeXN0ZW0gU29mdHdhcmUgUmVzZXQgKi8KKyNkZWZpbmUJRE9VQkxFX0ZBVUxUCTB4MDAwOAkvKiBDb3JlCURvdWJsZSBGYXVsdCBDYXVzZXMgUmVzZXQgKi8KKyNkZWZpbmUJUkVTRVRfRE9VQkxFCTB4MjAwMAkvKiBTVyBSZXNldCBHZW5lcmF0ZWQgQnkgQ29yZSBEb3VibGUtRmF1bHQgKi8KKyNkZWZpbmUJUkVTRVRfV0RPRwkJMHg0MDAwCS8qIFNXIFJlc2V0IEdlbmVyYXRlZCBCeSBXYXRjaGRvZyBUaW1lciAqLworI2RlZmluZQlSRVNFVF9TT0ZUV0FSRQkweDgwMDAJLyogU1cgUmVzZXQgT2NjdXJyZWQgU2luY2UgTGFzdAlSZWFkIE9mCVNXUlNUICovCisKKy8qIFNZU0NSIE1hc2tzCQkJCQkJCQkJCQkJCSAqLworI2RlZmluZQlCTU9ERQkJCTB4MDAwNgkvKiBCb290CU1vZGUgLSBMYXRjaGVkIER1cmluZyBIVyBSZXNldCBGcm9tIE1vZGUgUGlucyAqLworI2RlZmluZQlOT0JPT1QJCQkweDAwMTAJLyogRXhlY3V0ZSBGcm9tCUwxIG9yIEFTWU5DIEJhbmsgMCBXaGVuCUJNT0RFID0JMCAqLworCisKKy8qICoqKioqKioqKioqKiogIFNZU1RFTSBJTlRFUlJVUFQgQ09OVFJPTExFUiBNQVNLUyAqKioqKioqKioqKioqKioqKiAqLworCisvKiBQZXJpcGhlcmFsIE1hc2tzIEZvcglTSUMwX0lTUiwgU0lDMF9JV1IsIFNJQzBfSU1BU0sgKi8KKyNkZWZpbmUJUExMX1dBS0VVUF9JUlEJCTB4MDAwMDAwMDEJLyogUExMIFdha2V1cCBJbnRlcnJ1cHQJUmVxdWVzdCAqLworI2RlZmluZQlETUFDMF9FUlJfSVJRCQkweDAwMDAwMDAyCS8qIERNQSBDb250cm9sbGVyIDAgRXJyb3IgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJUFBJX0VSUl9JUlEJCTB4MDAwMDAwMDQJLyogUFBJIEVycm9yIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCVNQT1JUMF9FUlJfSVJRCQkweDAwMDAwMDA4CS8qIFNQT1JUMCBFcnJvcglJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlTUE9SVDFfRVJSX0lSUQkJMHgwMDAwMDAxMAkvKiBTUE9SVDEgRXJyb3IJSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJU1BJMF9FUlJfSVJRCQkweDAwMDAwMDIwCS8qIFNQSTAJRXJyb3IgSW50ZXJydXB0CVJlcXVlc3QgKi8KKyNkZWZpbmUJVUFSVDBfRVJSX0lSUQkJMHgwMDAwMDA0MAkvKiBVQVJUMCBFcnJvciBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlSVENfSVJRCQkJMHgwMDAwMDA4MAkvKiBSZWFsLVRpbWUgQ2xvY2sgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJRE1BMF9JUlEJCTB4MDAwMDAxMDAJLyogRE1BIENoYW5uZWwgMCAoUFBJKSBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlETUExX0lSUQkJMHgwMDAwMDIwMAkvKiBETUEgQ2hhbm5lbCAxIChTUE9SVDAgUlgpIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCURNQTJfSVJRCQkweDAwMDAwNDAwCS8qIERNQSBDaGFubmVsIDIgKFNQT1JUMCBUWCkgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJRE1BM19JUlEJCTB4MDAwMDA4MDAJLyogRE1BIENoYW5uZWwgMyAoU1BPUlQxIFJYKSBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlETUE0X0lSUQkJMHgwMDAwMTAwMAkvKiBETUEgQ2hhbm5lbCA0IChTUE9SVDEgVFgpIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCURNQTVfSVJRCQkweDAwMDAyMDAwCS8qIERNQSBDaGFubmVsIDUgKFNQSSkgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJRE1BNl9JUlEJCTB4MDAwMDQwMDAJLyogRE1BIENoYW5uZWwgNiAoVUFSVCBSWCkgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJRE1BN19JUlEJCTB4MDAwMDgwMDAJLyogRE1BIENoYW5uZWwgNyAoVUFSVCBUWCkgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJVElNRVIwX0lSUQkJMHgwMDAxMDAwMAkvKiBUaW1lciAwIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCVRJTUVSMV9JUlEJCTB4MDAwMjAwMDAJLyogVGltZXIgMSBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlUSU1FUjJfSVJRCQkweDAwMDQwMDAwCS8qIFRpbWVyIDIgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJUEZBX0lSUQkJCTB4MDAwODAwMDAJLyogUHJvZ3JhbW1hYmxlCUZsYWcgSW50ZXJydXB0IFJlcXVlc3QgQSAqLworI2RlZmluZQlQRkJfSVJRCQkJMHgwMDEwMDAwMAkvKiBQcm9ncmFtbWFibGUJRmxhZyBJbnRlcnJ1cHQgUmVxdWVzdCBCICovCisjZGVmaW5lCU1ETUEwXzBfSVJRCQkweDAwMjAwMDAwCS8qIE1lbURNQTAgU3RyZWFtIDAgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJTURNQTBfMV9JUlEJCTB4MDA0MDAwMDAJLyogTWVtRE1BMCBTdHJlYW0gMSBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlXRE9HX0lSUQkJMHgwMDgwMDAwMAkvKiBTb2Z0d2FyZSBXYXRjaGRvZyBUaW1lciBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlETUFDMV9FUlJfSVJRCQkweDAxMDAwMDAwCS8qIERNQSBDb250cm9sbGVyIDEgRXJyb3IgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJU1BPUlQyX0VSUl9JUlEJCTB4MDIwMDAwMDAJLyogU1BPUlQyIEVycm9yCUludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCVNQT1JUM19FUlJfSVJRCQkweDA0MDAwMDAwCS8qIFNQT1JUMyBFcnJvcglJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlNWFZSX1NEX0lSUQkJMHgwODAwMDAwMAkvKiBNWFZSCVN5bmNocm9ub3VzIERhdGEgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJU1BJMV9FUlJfSVJRCQkweDEwMDAwMDAwCS8qIFNQSTEJRXJyb3IgSW50ZXJydXB0CVJlcXVlc3QgKi8KKyNkZWZpbmUJU1BJMl9FUlJfSVJRCQkweDIwMDAwMDAwCS8qIFNQSTIJRXJyb3IgSW50ZXJydXB0CVJlcXVlc3QgKi8KKyNkZWZpbmUJVUFSVDFfRVJSX0lSUQkJMHg0MDAwMDAwMAkvKiBVQVJUMSBFcnJvciBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlVQVJUMl9FUlJfSVJRCQkweDgwMDAwMDAwCS8qIFVBUlQyIEVycm9yIEludGVycnVwdCBSZXF1ZXN0ICovCisKKy8qIHRoZSBmb2xsb3dpbmcgYXJlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZQlETUEwX0VSUl9JUlEJCURNQUMwX0VSUl9JUlEKKyNkZWZpbmUJRE1BMV9FUlJfSVJRCQlETUFDMV9FUlJfSVJRCisKKworLyogUGVyaXBoZXJhbCBNYXNrcyBGb3IJU0lDX0lTUjEsIFNJQ19JV1IxLCBTSUNfSU1BU0sxCSAqLworI2RlZmluZQlDQU5fRVJSX0lSUQkJCTB4MDAwMDAwMDEJLyogQ0FOIEVycm9yIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCURNQThfSVJRCQkJMHgwMDAwMDAwMgkvKiBETUEgQ2hhbm5lbCA4IChTUE9SVDIgUlgpIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCURNQTlfSVJRCQkJMHgwMDAwMDAwNAkvKiBETUEgQ2hhbm5lbCA5IChTUE9SVDIgVFgpIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCURNQTEwX0lSUQkJCTB4MDAwMDAwMDgJLyogRE1BIENoYW5uZWwgMTAgKFNQT1JUMyBSWCkgSW50ZXJydXB0CVJlcXVlc3QgKi8KKyNkZWZpbmUJRE1BMTFfSVJRCQkJMHgwMDAwMDAxMAkvKiBETUEgQ2hhbm5lbCAxMSAoU1BPUlQzIFRYKSBJbnRlcnJ1cHQJUmVxdWVzdCAqLworI2RlZmluZQlETUExMl9JUlEJCQkweDAwMDAwMDIwCS8qIERNQSBDaGFubmVsIDEyIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCURNQTEzX0lSUQkJCTB4MDAwMDAwNDAJLyogRE1BIENoYW5uZWwgMTMgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJRE1BMTRfSVJRCQkJMHgwMDAwMDA4MAkvKiBETUEgQ2hhbm5lbCAxNCAoU1BJMSkgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJRE1BMTVfSVJRCQkJMHgwMDAwMDEwMAkvKiBETUEgQ2hhbm5lbCAxNSAoU1BJMikgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJRE1BMTZfSVJRCQkJMHgwMDAwMDIwMAkvKiBETUEgQ2hhbm5lbCAxNiAoVUFSVDEgUlgpIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCURNQTE3X0lSUQkJCTB4MDAwMDA0MDAJLyogRE1BIENoYW5uZWwgMTcgKFVBUlQxIFRYKSBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlETUExOF9JUlEJCQkweDAwMDAwODAwCS8qIERNQSBDaGFubmVsIDE4IChVQVJUMiBSWCkgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJRE1BMTlfSVJRCQkJMHgwMDAwMTAwMAkvKiBETUEgQ2hhbm5lbCAxOSAoVUFSVDIgVFgpIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCVRXSTBfSVJRCQkJMHgwMDAwMjAwMAkvKiBUV0kwCUludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCVRXSTFfSVJRCQkJMHgwMDAwNDAwMAkvKiBUV0kxCUludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCUNBTl9SWF9JUlEJCQkweDAwMDA4MDAwCS8qIENBTiBSZWNlaXZlIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCUNBTl9UWF9JUlEJCQkweDAwMDEwMDAwCS8qIENBTiBUcmFuc21pdAlJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlNRE1BMV8wX0lSUQkJCTB4MDAwMjAwMDAJLyogTWVtRE1BMSBTdHJlYW0gMCBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlNRE1BMV8xX0lSUQkJCTB4MDAwNDAwMDAJLyogTWVtRE1BMSBTdHJlYW0gMSBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlNWFZSX1NUQVRfSVJRCQkJMHgwMDA4MDAwMAkvKiBNWFZSCVN0YXR1cyBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlNWFZSX0NNX0lSUQkJCTB4MDAxMDAwMDAJLyogTVhWUglDb250cm9sCU1lc3NhZ2UJSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJTVhWUl9BUF9JUlEJCQkweDAwMjAwMDAwCS8qIE1YVlIJQXN5bmNocm9ub3VzIFBhY2tldCBJbnRlcnJ1cHQgKi8KKworLyogdGhlIGZvbGxvd2luZyBhcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lCU1ETUEwX0lSUQkJTURNQTFfMF9JUlEKKyNkZWZpbmUJTURNQTFfSVJRCQlNRE1BMV8xX0lSUQorCisjaWZkZWYgX01JU1JBX1JVTEVTCisjZGVmaW5lCV9NRjE1IDB4RnUKKyNkZWZpbmUJX01GNyA3dQorI2Vsc2UKKyNkZWZpbmUJX01GMTUgMHhGCisjZGVmaW5lCV9NRjcgNworI2VuZGlmIC8qIF9NSVNSQV9SVUxFUyAqLworCisvKiBTSUNfSU1BU0t4IE1hc2tzCQkJCQkJCQkJCQkgKi8KKyNkZWZpbmUJU0lDX1VOTUFTS19BTEwJMHgwMDAwMDAwMAkJCQkJLyogVW5tYXNrIGFsbCBwZXJpcGhlcmFsIGludGVycnVwdHMgKi8KKyNkZWZpbmUJU0lDX01BU0tfQUxMCTB4RkZGRkZGRkYJCQkJCS8qIE1hc2sJYWxsIHBlcmlwaGVyYWwgaW50ZXJydXB0cyAqLworI2lmZGVmIF9NSVNSQV9SVUxFUworI2RlZmluZQlTSUNfTUFTSyh4KQkJKDEgPDwgKCh4KSYweDFGdSkpCQkJCQkvKiBNYXNrCVBlcmlwaGVyYWwgI3ggaW50ZXJydXB0ICovCisjZGVmaW5lCVNJQ19VTk1BU0soeCkJKDB4RkZGRkZGRkZ1IF4gKDEgPDwgKCh4KSYweDFGdSkpKQkvKiBVbm1hc2sgUGVyaXBoZXJhbCAjeAlpbnRlcnJ1cHQgKi8KKyNlbHNlCisjZGVmaW5lCVNJQ19NQVNLKHgpCQkoMSA8PCAoKHgpJjB4MUYpKQkJCQkJLyogTWFzawlQZXJpcGhlcmFsICN4IGludGVycnVwdCAqLworI2RlZmluZQlTSUNfVU5NQVNLKHgpCSgweEZGRkZGRkZGIF4gKDEgPDwgKCh4KSYweDFGKSkpCS8qIFVubWFzayBQZXJpcGhlcmFsICN4CWludGVycnVwdCAqLworI2VuZGlmIC8qIF9NSVNSQV9SVUxFUyAqLworCisvKiBTSUNfSVdSeCBNYXNrcwkJCQkJCQkJCQkJICovCisjZGVmaW5lCUlXUl9ESVNBQkxFX0FMTAkweDAwMDAwMDAwCQkJCQkvKiBXYWtldXAgRGlzYWJsZSBhbGwgcGVyaXBoZXJhbHMgKi8KKyNkZWZpbmUJSVdSX0VOQUJMRV9BTEwJMHhGRkZGRkZGRgkJCQkJLyogV2FrZXVwIEVuYWJsZSBhbGwgcGVyaXBoZXJhbHMgKi8KKyNpZmRlZiBfTUlTUkFfUlVMRVMKKyNkZWZpbmUJSVdSX0VOQUJMRSh4KQkoMSA8PCAoKHgpJjB4MUZ1KSkJCQkJCS8qIFdha2V1cCBFbmFibGUgUGVyaXBoZXJhbCAjeCAqLworI2RlZmluZQlJV1JfRElTQUJMRSh4KQkoMHhGRkZGRkZGRnUgXiAoMSA8PCAoKHgpJjB4MUZ1KSkpCS8qIFdha2V1cCBEaXNhYmxlIFBlcmlwaGVyYWwgI3ggKi8KKyNlbHNlCisjZGVmaW5lCUlXUl9FTkFCTEUoeCkJKDEgPDwgKCh4KSYweDFGKSkJCQkJCS8qIFdha2V1cCBFbmFibGUgUGVyaXBoZXJhbCAjeCAqLworI2RlZmluZQlJV1JfRElTQUJMRSh4KQkoMHhGRkZGRkZGRiBeICgxIDw8ICgoeCkmMHgxRikpKQkvKiBXYWtldXAgRGlzYWJsZSBQZXJpcGhlcmFsICN4ICovCisjZW5kaWYgLyogX01JU1JBX1JVTEVTICovCisKKworLyogKioqKioqKioqIFdBVENIRE9HIFRJTUVSIE1BU0tTICoqKioqKioqKioqKioqKioqKioqICovCisvKiBXYXRjaGRvZyBUaW1lciBXRE9HX0NUTCBSZWdpc3RlciBNYXNrcyAqLworI2lmZGVmIF9NSVNSQV9SVUxFUworI2RlZmluZQlXREVWKHgpCQkJKCgoeCk8PDEpICYgMHgwMDA2dSkJLyogZXZlbnQgZ2VuZXJhdGVkIG9uIHJvbGwgb3ZlciAqLworI2Vsc2UKKyNkZWZpbmUJV0RFVih4KQkJCSgoKHgpPDwxKSAmIDB4MDAwNikJLyogZXZlbnQgZ2VuZXJhdGVkIG9uIHJvbGwgb3ZlciAqLworI2VuZGlmIC8qIF9NSVNSQV9SVUxFUyAqLworI2RlZmluZQlXREVWX1JFU0VUCQkweDAwMDAJCQkJLyogZ2VuZXJhdGUgcmVzZXQgZXZlbnQJb24gcm9sbAlvdmVyICovCisjZGVmaW5lCVdERVZfTk1JCQkweDAwMDIJCQkJLyogZ2VuZXJhdGUgTk1JCWV2ZW50IG9uIHJvbGwgb3ZlciAqLworI2RlZmluZQlXREVWX0dQSQkJMHgwMDA0CQkJCS8qIGdlbmVyYXRlIEdQIElSUSBvbiByb2xsIG92ZXIgKi8KKyNkZWZpbmUJV0RFVl9OT05FCQkweDAwMDYJCQkJLyogbm8gZXZlbnQgb24gcm9sbCBvdmVyICovCisjZGVmaW5lCVdERU4JCQkweDBGRjAJCQkJLyogZW5hYmxlIHdhdGNoZG9nICovCisjZGVmaW5lCVdERElTCQkJMHgwQUQwCQkJCS8qIGRpc2FibGUgd2F0Y2hkb2cgKi8KKyNkZWZpbmUJV0RSTwkJCTB4ODAwMAkJCQkvKiB3YXRjaGRvZyByb2xsZWQgb3ZlcglsYXRjaCAqLworCisvKiBkZXByZWNhdGVkIFdET0dfQ1RMIFJlZ2lzdGVyCU1hc2tzIGZvciBsZWdhY3kgY29kZSAqLworI2RlZmluZQlJQ1RMIFdERVYKKyNkZWZpbmUJRU5BQkxFX1JFU0VUCVdERVZfUkVTRVQKKyNkZWZpbmUJV0RPR19SRVNFVAkJV0RFVl9SRVNFVAorI2RlZmluZQlFTkFCTEVfTk1JCQlXREVWX05NSQorI2RlZmluZQlXRE9HX05NSQkJV0RFVl9OTUkKKyNkZWZpbmUJRU5BQkxFX0dQSQkJV0RFVl9HUEkKKyNkZWZpbmUJV0RPR19HUEkJCVdERVZfR1BJCisjZGVmaW5lCURJU0FCTEVfRVZUCVdERVZfTk9ORQorI2RlZmluZQlXRE9HX05PTkUJCVdERVZfTk9ORQorCisjZGVmaW5lCVRNUl9FTgkJCVdERU4KKyNkZWZpbmUJV0RPR19ESVNBQkxFCQlXRERJUworI2RlZmluZQlUUk8JCQlXRFJPCisKKyNkZWZpbmUJSUNUTF9QMAkJCTB4MDEKKyNkZWZpbmUJSUNUTF9QMQkJCTB4MDIKKyNkZWZpbmUJVFJPX1AJCQkweDBGCisKKworLyogKioqKioqKioqKioqKioqICBSRUFMIFRJTUUgQ0xPQ0sgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUlRDX1NUQVQgYW5kCVJUQ19BTEFSTSByZWdpc3RlciAqLworI2RlZmluZQlSVFNFQwkJMHgwMDAwMDAzRgkvKiBSZWFsLVRpbWUgQ2xvY2sgU2Vjb25kcyAqLworI2RlZmluZQlSVE1JTgkJMHgwMDAwMEZDMAkvKiBSZWFsLVRpbWUgQ2xvY2sgTWludXRlcyAqLworI2RlZmluZQlSVEhSCQkweDAwMDFGMDAwCS8qIFJlYWwtVGltZSBDbG9jayBIb3VycyAqLworI2RlZmluZQlSVERBWQkJMHhGRkZFMDAwMAkvKiBSZWFsLVRpbWUgQ2xvY2sgRGF5cyAqLworCisvKiBSVENfSUNUTCByZWdpc3RlciAqLworI2RlZmluZQlTV0lFCQkweDAwMDEJCS8qIFN0b3B3YXRjaCBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lCUFJRQkJCTB4MDAwMgkJLyogQWxhcm0gSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZQlTSUUJCQkweDAwMDQJCS8qIFNlY29uZHMgKDEgSHopIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUJTUlFCQkJMHgwMDA4CQkvKiBNaW51dGVzIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUJSElFCQkJMHgwMDEwCQkvKiBIb3VycyBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lCURJRQkJCTB4MDAyMAkJLyogMjQgSG91cnMgKERheXMpIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUJREFJRQkJMHgwMDQwCQkvKiBEYXkgQWxhcm0gKERheSwgSG91ciwgTWludXRlLCBTZWNvbmQpIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUJV0NJRQkJMHg4MDAwCQkvKiBXcml0ZSBDb21wbGV0ZSBJbnRlcnJ1cHQgRW5hYmxlICovCisKKy8qIFJUQ19JU1RBVCByZWdpc3RlciAqLworI2RlZmluZQlTV0VGCQkweDAwMDEJCS8qIFN0b3B3YXRjaCBFdmVudCBGbGFnICovCisjZGVmaW5lCUFFRgkJCTB4MDAwMgkJLyogQWxhcm0gRXZlbnQgRmxhZyAqLworI2RlZmluZQlTRUYJCQkweDAwMDQJCS8qIFNlY29uZHMgKDEgSHopIEV2ZW50CUZsYWcgKi8KKyNkZWZpbmUJTUVGCQkJMHgwMDA4CQkvKiBNaW51dGVzIEV2ZW50IEZsYWcgKi8KKyNkZWZpbmUJSEVGCQkJMHgwMDEwCQkvKiBIb3VycyBFdmVudCBGbGFnICovCisjZGVmaW5lCURFRgkJCTB4MDAyMAkJLyogMjQgSG91cnMgKERheXMpIEV2ZW50IEZsYWcgKi8KKyNkZWZpbmUJREFFRgkJMHgwMDQwCQkvKiBEYXkgQWxhcm0gKERheSwgSG91ciwgTWludXRlLCBTZWNvbmQpIEV2ZW50IEZsYWcgKi8KKyNkZWZpbmUJV1BTCQkJMHg0MDAwCQkvKiBXcml0ZSBQZW5kaW5nIFN0YXR1cwkoUk8pICovCisjZGVmaW5lCVdDT00JCTB4ODAwMAkJLyogV3JpdGUgQ29tcGxldGUgKi8KKworLyogUlRDX0ZBU1QgTWFzayAoUlRDX1BSRU4gTWFzaykgKi8KKyNkZWZpbmUJRU5BQkxFX1BSRVNDQUxFCSAgICAgMHgwMDAwMDAwMQkgLyogRW5hYmxlIHByZXNjYWxlciBzbwlSVEMgcnVucyBhdCAxIEh6ICovCisjZGVmaW5lCVBSRU4JCSAgICAgMHgwMDAwMDAwMQorCQkvKiAqKiBNdXN0IGJlIHNldCBhZnRlcglwb3dlci11cCBmb3IgcHJvcGVyIG9wZXJhdGlvbiBvZiBSVEMgKi8KKworLyogRGVwcmVjYXRlZCBSVENfU1RBVCBhbmQgUlRDX0FMQVJNIE1hc2tzCQkJICovCisjZGVmaW5lCVJUQ19TRUMJCQlSVFNFQwkvKiBSZWFsLVRpbWUgQ2xvY2sgU2Vjb25kcyAqLworI2RlZmluZQlSVENfTUlOCQkJUlRNSU4JLyogUmVhbC1UaW1lIENsb2NrIE1pbnV0ZXMgKi8KKyNkZWZpbmUJUlRDX0hSCQkJUlRIUgkvKiBSZWFsLVRpbWUgQ2xvY2sgSG91cnMgKi8KKyNkZWZpbmUJUlRDX0RBWQkJCVJUREFZCS8qIFJlYWwtVGltZSBDbG9jayBEYXlzICovCisKKy8qIERlcHJlY2F0ZWQgUlRDX0lDVEwvUlRDX0lTVEFUIE1hc2tzCQkJCQkJCQkJCQkgKi8KKyNkZWZpbmUJU1RPUFdBVENICQlTV0lFCQkvKiBTdG9wd2F0Y2ggSW50ZXJydXB0IEVuYWJsZQkgKi8KKyNkZWZpbmUJQUxBUk0JCQlBSUUJCS8qIEFsYXJtIEludGVycnVwdCBFbmFibGUJCSAqLworI2RlZmluZQlTRUNPTkQJCQlTSUUJCS8qIFNlY29uZHMgKDEgSHopIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUJTUlOVVRFCQkJTUlFCQkvKiBNaW51dGVzIEludGVycnVwdCBFbmFibGUJCSAqLworI2RlZmluZQlIT1VSCQkJSElFCQkvKiBIb3VycyBJbnRlcnJ1cHQgRW5hYmxlCQkgKi8KKyNkZWZpbmUJREFZCQkJCURJRQkJLyogMjQgSG91cnMgKERheXMpIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUJREFZX0FMQVJNCQlEQUlFCQkvKiBEYXkgQWxhcm0gKERheSwgSG91ciwgTWludXRlLCBTZWNvbmQpIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUJV1JJVEVfQ09NUExFVEUJV0NJRQkJLyogV3JpdGUgQ29tcGxldGUgSW50ZXJydXB0IEVuYWJsZSAqLworCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFVBUlQgQ09OVFJPTExFUiBNQVNLUyAqKioqKioqKioqKioqKioqKioqKioqICovCisvKiBVQVJUeF9MQ1IgUmVnaXN0ZXIgKi8KKyNpZmRlZiBfTUlTUkFfUlVMRVMKKyNkZWZpbmUJV0xTKHgpCQkoKCh4KS01dSkgJiAweDAzdSkJLyogV29yZAlMZW5ndGggU2VsZWN0ICovCisjZWxzZQorI2RlZmluZQlXTFMoeCkJCSgoKHgpLTUpICYgMHgwMykJLyogV29yZAlMZW5ndGggU2VsZWN0ICovCisjZW5kaWYgLyogX01JU1JBX1JVTEVTICovCisjZGVmaW5lCVNUQgkJCTB4MDQJCQkJLyogU3RvcAlCaXRzICovCisjZGVmaW5lCVBFTgkJCTB4MDgJCQkJLyogUGFyaXR5IEVuYWJsZSAqLworI2RlZmluZQlFUFMJCQkweDEwCQkJCS8qIEV2ZW4JUGFyaXR5IFNlbGVjdCAqLworI2RlZmluZQlTVFAJCQkweDIwCQkJCS8qIFN0aWNrIFBhcml0eSAqLworI2RlZmluZQlTQgkJCTB4NDAJCQkJLyogU2V0IEJyZWFrICovCisjZGVmaW5lCURMQUIJCTB4ODAJCQkJLyogRGl2aXNvciBMYXRjaCBBY2Nlc3MgKi8KKworI2RlZmluZQlETEFCX1AJCTB4MDcKKyNkZWZpbmUJU0JfUAkJMHgwNgorI2RlZmluZQlTVFBfUAkJMHgwNQorI2RlZmluZQlFUFNfUAkJMHgwNAorI2RlZmluZQlQRU5fUAkJMHgwMworI2RlZmluZQlTVEJfUAkJMHgwMgorI2RlZmluZQlXTFNfUDEJCTB4MDEKKyNkZWZpbmUJV0xTX1AwCQkweDAwCisKKy8qIFVBUlR4X01DUiBSZWdpc3RlciAqLworI2RlZmluZQlMT09QX0VOQQkweDEwCS8qIExvb3BiYWNrIE1vZGUgRW5hYmxlICovCisjZGVmaW5lCUxPT1BfRU5BX1AJMHgwNAorLyogRGVwcmVjYXRlZCBVQVJUeF9NQ1IJTWFzawkJCSAqLworCisvKiBVQVJUeF9MU1IgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRFIJCQkweDAxCS8qIERhdGEJUmVhZHkgKi8KKyNkZWZpbmUJT0UJCQkweDAyCS8qIE92ZXJydW4gRXJyb3IgKi8KKyNkZWZpbmUJUEUJCQkweDA0CS8qIFBhcml0eSBFcnJvciAqLworI2RlZmluZQlGRQkJCTB4MDgJLyogRnJhbWluZyBFcnJvciAqLworI2RlZmluZQlCSQkJCTB4MTAJLyogQnJlYWsgSW50ZXJydXB0ICovCisjZGVmaW5lCVRIUkUJCTB4MjAJLyogVEhSIEVtcHR5ICovCisjZGVmaW5lCVRFTVQJCTB4NDAJLyogVFNSIGFuZCBVQVJUX1RIUiBFbXB0eSAqLworCisjZGVmaW5lCVRFTVBfUAkJMHgwNgorI2RlZmluZQlUSFJFX1AJCTB4MDUKKyNkZWZpbmUJQklfUAkJMHgwNAorI2RlZmluZQlGRV9QCQkweDAzCisjZGVmaW5lCVBFX1AJCTB4MDIKKyNkZWZpbmUJT0VfUAkJMHgwMQorI2RlZmluZQlEUl9QCQkweDAwCisKKy8qIFVBUlR4X0lFUiBSZWdpc3RlciAqLworI2RlZmluZQlFUkJGSQkJMHgwMQkJLyogRW5hYmxlIFJlY2VpdmUgQnVmZmVyIEZ1bGwgSW50ZXJydXB0ICovCisjZGVmaW5lCUVUQkVJCQkweDAyCQkvKiBFbmFibGUgVHJhbnNtaXQgQnVmZmVyIEVtcHR5CUludGVycnVwdCAqLworI2RlZmluZQlFTFNJCQkweDA0CQkvKiBFbmFibGUgUlggU3RhdHVzIEludGVycnVwdCAqLworCisjZGVmaW5lCUVMU0lfUAkJMHgwMgorI2RlZmluZQlFVEJFSV9QCQkweDAxCisjZGVmaW5lCUVSQkZJX1AJCTB4MDAKKworLyogVUFSVHhfSUlSIFJlZ2lzdGVyICovCisjZGVmaW5lCU5JTlQJCTB4MDEKKyNkZWZpbmUJU1RBVFVTX1AxCTB4MDIKKyNkZWZpbmUJU1RBVFVTX1AwCTB4MDEKKyNkZWZpbmUJTklOVF9QCQkweDAwCisKKy8qIFVBUlR4X0dDVEwgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUNFTgkJMHgwMQkJLyogRW5hYmxlIFVBUlR4CUNsb2NrcyAqLworI2RlZmluZQlJUkVOCQkweDAyCQkvKiBFbmFibGUgSXJEQSBNb2RlICovCisjZGVmaW5lCVRQT0xDCQkweDA0CQkvKiBJckRBCVRYIFBvbGFyaXR5IENoYW5nZSAqLworI2RlZmluZQlSUE9MQwkJMHgwOAkJLyogSXJEQQlSWCBQb2xhcml0eSBDaGFuZ2UgKi8KKyNkZWZpbmUJRlBFCQkJMHgxMAkJLyogRm9yY2UgUGFyaXR5CUVycm9yIE9uIFRyYW5zbWl0ICovCisjZGVmaW5lCUZGRQkJCTB4MjAJCS8qIEZvcmNlIEZyYW1pbmcgRXJyb3IgT24gVHJhbnNtaXQgKi8KKworI2RlZmluZQlGRkVfUAkJMHgwNQorI2RlZmluZQlGUEVfUAkJMHgwNAorI2RlZmluZQlSUE9MQ19QCQkweDAzCisjZGVmaW5lCVRQT0xDX1AJCTB4MDIKKyNkZWZpbmUJSVJFTl9QCQkweDAxCisjZGVmaW5lCVVDRU5fUAkJMHgwMAorCisKKy8qICoqKioqKioqKiogIFNFUklBTCBQT1JUIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqICovCisvKiBTUE9SVHhfVENSMSBNYXNrcyAqLworI2RlZmluZQlUU1BFTgkJMHgwMDAxCS8qIFRYIGVuYWJsZSAgKi8KKyNkZWZpbmUJSVRDTEsJCTB4MDAwMgkvKiBJbnRlcm5hbCBUWCBDbG9jayBTZWxlY3QgICovCisjZGVmaW5lCVREVFlQRQkJMHgwMDBDCS8qIFRYIERhdGEgRm9ybWF0dGluZyBTZWxlY3QgKi8KKyNkZWZpbmUJRFRZUEVfTk9STQkweDAwMDAJCS8qIERhdGEJRm9ybWF0IE5vcm1hbCAqLworI2RlZmluZQlEVFlQRV9VTEFXCTB4MDAwOAkJLyogQ29tcGFuZCBVc2luZyB1LUxhdyAqLworI2RlZmluZQlEVFlQRV9BTEFXCTB4MDAwQwkJLyogQ29tcGFuZCBVc2luZyBBLUxhdyAqLworI2RlZmluZQlUTFNCSVQJCTB4MDAxMAkvKiBUWCBCaXQgT3JkZXIgKi8KKyNkZWZpbmUJSVRGUwkJMHgwMjAwCS8qIEludGVybmFsIFRYIEZyYW1lIFN5bmMgU2VsZWN0ICAqLworI2RlZmluZQlURlNSCQkweDA0MDAJLyogVFggRnJhbWUgU3luYyBSZXF1aXJlZCBTZWxlY3QgICovCisjZGVmaW5lCURJVEZTCQkweDA4MDAJLyogRGF0YQlJbmRlcGVuZGVudCBUWCBGcmFtZSBTeW5jIFNlbGVjdCAgKi8KKyNkZWZpbmUJTFRGUwkJMHgxMDAwCS8qIExvdyBUWCBGcmFtZQlTeW5jIFNlbGVjdCAgKi8KKyNkZWZpbmUJTEFURlMJCTB4MjAwMAkvKiBMYXRlCVRYIEZyYW1lIFN5bmMgU2VsZWN0ICAqLworI2RlZmluZQlUQ0tGRQkJMHg0MDAwCS8qIFRYIENsb2NrIEZhbGxpbmcgRWRnZSBTZWxlY3QgKi8KKy8qIFNQT1JUeF9SQ1IxIERlcHJlY2F0ZWQgTWFza3MJCQkJCQkJCSAqLworI2RlZmluZQlUVUxBVwkJRFRZUEVfVUxBVwkJLyogQ29tcGFuZCBVc2luZyB1LUxhdyAqLworI2RlZmluZQlUQUxBVwkJRFRZUEVfQUxBVwkJCS8qIENvbXBhbmQgVXNpbmcgQS1MYXcgKi8KKworLyogU1BPUlR4X1RDUjIgTWFza3MgKi8KKyNpZmRlZiBfTUlTUkFfUlVMRVMKKyNkZWZpbmUJU0xFTih4KQkJKCh4KSYweDFGdSkJLyogU1BPUlQgVFggV29yZCBMZW5ndGgJKDIgLSAzMSkgKi8KKyNlbHNlCisjZGVmaW5lCVNMRU4oeCkJCSgoeCkmMHgxRikJLyogU1BPUlQgVFggV29yZCBMZW5ndGgJKDIgLSAzMSkgKi8KKyNlbmRpZiAvKiBfTUlTUkFfUlVMRVMgKi8KKyNkZWZpbmUJVFhTRQkJMHgwMTAwCS8qVFggU2Vjb25kYXJ5IEVuYWJsZSAqLworI2RlZmluZQlUU0ZTRQkJMHgwMjAwCS8qVFggU3RlcmVvIEZyYW1lIFN5bmMgRW5hYmxlICovCisjZGVmaW5lCVRSRlNUCQkweDA0MDAJLypUWCBSaWdodC1GaXJzdCBEYXRhIE9yZGVyICAqLworCisvKiBTUE9SVHhfUkNSMSBNYXNrcyAqLworI2RlZmluZQlSU1BFTgkJMHgwMDAxCS8qIFJYIGVuYWJsZSAgKi8KKyNkZWZpbmUJSVJDTEsJCTB4MDAwMgkvKiBJbnRlcm5hbCBSWCBDbG9jayBTZWxlY3QgICovCisjZGVmaW5lCVJEVFlQRQkJMHgwMDBDCS8qIFJYIERhdGEgRm9ybWF0dGluZyBTZWxlY3QgKi8KKyNkZWZpbmUJRFRZUEVfTk9STQkweDAwMDAJCS8qIG5vIGNvbXBhbmRpbmcgKi8KKyNkZWZpbmUJRFRZUEVfVUxBVwkweDAwMDgJCS8qIENvbXBhbmQgVXNpbmcgdS1MYXcgKi8KKyNkZWZpbmUJRFRZUEVfQUxBVwkweDAwMEMJCS8qIENvbXBhbmQgVXNpbmcgQS1MYXcgKi8KKyNkZWZpbmUJUkxTQklUCQkweDAwMTAJLyogUlggQml0IE9yZGVyICovCisjZGVmaW5lCUlSRlMJCTB4MDIwMAkvKiBJbnRlcm5hbCBSWCBGcmFtZSBTeW5jIFNlbGVjdCAgKi8KKyNkZWZpbmUJUkZTUgkJMHgwNDAwCS8qIFJYIEZyYW1lIFN5bmMgUmVxdWlyZWQgU2VsZWN0ICAqLworI2RlZmluZQlMUkZTCQkweDEwMDAJLyogTG93IFJYIEZyYW1lCVN5bmMgU2VsZWN0ICAqLworI2RlZmluZQlMQVJGUwkJMHgyMDAwCS8qIExhdGUJUlggRnJhbWUgU3luYyBTZWxlY3QgICovCisjZGVmaW5lCVJDS0ZFCQkweDQwMDAJLyogUlggQ2xvY2sgRmFsbGluZyBFZGdlIFNlbGVjdCAqLworLyogU1BPUlR4X1JDUjEgRGVwcmVjYXRlZCBNYXNrcwkJCQkJCQkJICovCisjZGVmaW5lCVJVTEFXCQlEVFlQRV9VTEFXCQkvKiBDb21wYW5kIFVzaW5nIHUtTGF3ICovCisjZGVmaW5lCVJBTEFXCQlEVFlQRV9BTEFXCQkJLyogQ29tcGFuZCBVc2luZyBBLUxhdyAqLworCisvKiBTUE9SVHhfUkNSMiBNYXNrcyAqLworI2lmZGVmIF9NSVNSQV9SVUxFUworI2RlZmluZQlTTEVOKHgpCQkoKHgpJjB4MUZ1KQkvKiBTUE9SVCBSWCBXb3JkIExlbmd0aAkoMiAtIDMxKSAqLworI2Vsc2UKKyNkZWZpbmUJU0xFTih4KQkJKCh4KSYweDFGKQkvKiBTUE9SVCBSWCBXb3JkIExlbmd0aAkoMiAtIDMxKSAqLworI2VuZGlmIC8qIF9NSVNSQV9SVUxFUyAqLworI2RlZmluZQlSWFNFCQkweDAxMDAJLypSWCBTZWNvbmRhcnkgRW5hYmxlICovCisjZGVmaW5lCVJTRlNFCQkweDAyMDAJLypSWCBTdGVyZW8gRnJhbWUgU3luYyBFbmFibGUgKi8KKyNkZWZpbmUJUlJGU1QJCTB4MDQwMAkvKlJpZ2h0LUZpcnN0IERhdGEgT3JkZXIgICovCisKKy8qU1BPUlR4X1NUQVQgTWFza3MgKi8KKyNkZWZpbmUJUlhORQkJMHgwMDAxCQkvKlJYIEZJRk8gTm90IEVtcHR5IFN0YXR1cyAqLworI2RlZmluZQlSVVZGCQkweDAwMDIJCS8qUlggVW5kZXJmbG93IFN0YXR1cyAqLworI2RlZmluZQlST1ZGCQkweDAwMDQJCS8qUlggT3ZlcmZsb3cgU3RhdHVzICovCisjZGVmaW5lCVRYRgkJCTB4MDAwOAkJLypUWCBGSUZPIEZ1bGwgU3RhdHVzICovCisjZGVmaW5lCVRVVkYJCTB4MDAxMAkJLypUWCBVbmRlcmZsb3cgU3RhdHVzICovCisjZGVmaW5lCVRPVkYJCTB4MDAyMAkJLypUWCBPdmVyZmxvdyBTdGF0dXMgKi8KKyNkZWZpbmUJVFhIUkUJCTB4MDA0MAkJLypUWCBIb2xkIFJlZ2lzdGVyIEVtcHR5ICovCisKKy8qU1BPUlR4X01DTUMxIE1hc2tzICovCisjZGVmaW5lCVdPRkYJCQkweDAwMDAwM0ZGCS8qTXVsdGljaGFubmVsIFdpbmRvdyBPZmZzZXQgRmllbGQgKi8KKy8qIFNQT1JUeF9NQ01DMQlNYWNyb3MJCQkJCQkJCSAqLworI2lmZGVmIF9NSVNSQV9SVUxFUworI2RlZmluZQlTRVRfV09GRih4KQkJKCh4KSAmIDB4M0ZGdSkJLyogTXVsdGljaGFubmVsCVdpbmRvdyBPZmZzZXQgRmllbGQgKi8KKy8qIE9ubHkJdXNlIFNFVF9XU0laRSBNYWNybyBXaXRoIExvZ2ljIE9SIFdoaWxlCVNldHRpbmcJTG93ZXIgT3JkZXIgQml0cyAqLworI2RlZmluZQlTRVRfV1NJWkUoeCkJKCgoKCh4KT4+MHgzKS0xdSkmMHhGdSkJPDwgMHhDKQkvKiBNdWx0aWNoYW5uZWwJV2luZG93IFNpemUgPSAoeC84KS0xICovCisjZWxzZQorI2RlZmluZQlTRVRfV09GRih4KQkJKCh4KSAmIDB4M0ZGKQkvKiBNdWx0aWNoYW5uZWwJV2luZG93IE9mZnNldCBGaWVsZCAqLworLyogT25seQl1c2UgU0VUX1dTSVpFIE1hY3JvIFdpdGggTG9naWMgT1IgV2hpbGUJU2V0dGluZwlMb3dlciBPcmRlciBCaXRzICovCisjZGVmaW5lCVNFVF9XU0laRSh4KQkoKCgoKHgpPj4weDMpLTEpJjB4RikgPDwgMHhDKQkvKiBNdWx0aWNoYW5uZWwJV2luZG93IFNpemUgPSAoeC84KS0xICovCisjZW5kaWYgLyogX01JU1JBX1JVTEVTICovCisKKworLypTUE9SVHhfTUNNQzIgTWFza3MgKi8KKyNkZWZpbmUJTUNDUk0JCTB4MDAwMwkvKk11bHRpY2hhbm5lbCBDbG9jayBSZWNvdmVyeSBNb2RlICovCisjZGVmaW5lCVJFQ19CWVBBU1MJMHgwMDAwCQkvKiBCeXBhc3MgTW9kZSAoTm8gQ2xvY2sgUmVjb3ZlcnkpICovCisjZGVmaW5lCVJFQ18yRlJPTTQJMHgwMDAyCQkvKiBSZWNvdmVyIDIgTUh6IENsb2NrIGZyb20gNCBNSHogQ2xvY2sgKi8KKyNkZWZpbmUJUkVDXzhGUk9NMTYJMHgwMDAzCQkvKiBSZWNvdmVyIDggTUh6IENsb2NrIGZyb20gMTYgTUh6IENsb2NrICovCisjZGVmaW5lCU1DRFRYUEUJCTB4MDAwNAkvKk11bHRpY2hhbm5lbCBETUEgVHJhbnNtaXQgUGFja2luZyAqLworI2RlZmluZQlNQ0RSWFBFCQkweDAwMDgJLypNdWx0aWNoYW5uZWwgRE1BIFJlY2VpdmUgUGFja2luZyAqLworI2RlZmluZQlNQ01FTgkJMHgwMDEwCS8qTXVsdGljaGFubmVsIEZyYW1lIE1vZGUgRW5hYmxlICovCisjZGVmaW5lCUZTRFIJCTB4MDA4MAkvKk11bHRpY2hhbm5lbCBGcmFtZSBTeW5jIHRvIERhdGEgUmVsYXRpb25zaGlwICovCisjZGVmaW5lCU1GRAkJCTB4RjAwMAkvKk11bHRpY2hhbm5lbCBGcmFtZSBEZWxheSAgICAqLworI2RlZmluZQlNRkRfMAkJMHgwMDAwCQkvKiBNdWx0aWNoYW5uZWwJRnJhbWUgRGVsYXkgPSAwICovCisjZGVmaW5lCU1GRF8xCQkweDEwMDAJCS8qIE11bHRpY2hhbm5lbAlGcmFtZSBEZWxheSA9IDEgKi8KKyNkZWZpbmUJTUZEXzIJCTB4MjAwMAkJLyogTXVsdGljaGFubmVsCUZyYW1lIERlbGF5ID0gMiAqLworI2RlZmluZQlNRkRfMwkJMHgzMDAwCQkvKiBNdWx0aWNoYW5uZWwJRnJhbWUgRGVsYXkgPSAzICovCisjZGVmaW5lCU1GRF80CQkweDQwMDAJCS8qIE11bHRpY2hhbm5lbAlGcmFtZSBEZWxheSA9IDQgKi8KKyNkZWZpbmUJTUZEXzUJCTB4NTAwMAkJLyogTXVsdGljaGFubmVsCUZyYW1lIERlbGF5ID0gNSAqLworI2RlZmluZQlNRkRfNgkJMHg2MDAwCQkvKiBNdWx0aWNoYW5uZWwJRnJhbWUgRGVsYXkgPSA2ICovCisjZGVmaW5lCU1GRF83CQkweDcwMDAJCS8qIE11bHRpY2hhbm5lbAlGcmFtZSBEZWxheSA9IDcgKi8KKyNkZWZpbmUJTUZEXzgJCTB4ODAwMAkJLyogTXVsdGljaGFubmVsCUZyYW1lIERlbGF5ID0gOCAqLworI2RlZmluZQlNRkRfOQkJMHg5MDAwCQkvKiBNdWx0aWNoYW5uZWwJRnJhbWUgRGVsYXkgPSA5ICovCisjZGVmaW5lCU1GRF8xMAkJMHhBMDAwCQkvKiBNdWx0aWNoYW5uZWwJRnJhbWUgRGVsYXkgPSAxMCAqLworI2RlZmluZQlNRkRfMTEJCTB4QjAwMAkJLyogTXVsdGljaGFubmVsCUZyYW1lIERlbGF5ID0gMTEgKi8KKyNkZWZpbmUJTUZEXzEyCQkweEMwMDAJCS8qIE11bHRpY2hhbm5lbAlGcmFtZSBEZWxheSA9IDEyICovCisjZGVmaW5lCU1GRF8xMwkJMHhEMDAwCQkvKiBNdWx0aWNoYW5uZWwJRnJhbWUgRGVsYXkgPSAxMyAqLworI2RlZmluZQlNRkRfMTQJCTB4RTAwMAkJLyogTXVsdGljaGFubmVsCUZyYW1lIERlbGF5ID0gMTQgKi8KKyNkZWZpbmUJTUZEXzE1CQkweEYwMDAJCS8qIE11bHRpY2hhbm5lbAlGcmFtZSBEZWxheSA9IDE1ICovCisKKworLyogICoqKioqKioqKiAgUEFSQUxMRUwJUEVSSVBIRVJBTCBJTlRFUkZBQ0UgKFBQSSkgTUFTS1MgKioqKioqKioqKioqKioqKiAgICovCisvKiAgUFBJX0NPTlRST0wJTWFza3MJICAgICAgKi8KKyNkZWZpbmUJUE9SVF9FTgkJMHgwMDAxCS8qIFBQSSBQb3J0IEVuYWJsZSAgKi8KKyNkZWZpbmUJUE9SVF9ESVIJMHgwMDAyCS8qIFBQSSBQb3J0IERpcmVjdGlvbgkgICAgKi8KKyNkZWZpbmUJWEZSX1RZUEUJMHgwMDBDCS8qIFBQSSBUcmFuc2ZlcglUeXBlICAqLworI2RlZmluZQlQT1JUX0NGRwkweDAwMzAJLyogUFBJIFBvcnQgQ29uZmlndXJhdGlvbiAqLworI2RlZmluZQlGTERfU0VMCQkweDAwNDAJLyogUFBJIEFjdGl2ZSBGaWVsZCBTZWxlY3QgKi8KKyNkZWZpbmUJUEFDS19FTgkJMHgwMDgwCS8qIFBQSSBQYWNraW5nIE1vZGUgKi8KKy8qIHByZXZpb3VzIHZlcnNpb25zIG9mCWRlZkJGNTM5LmggZXJyb25lb3VzbHkgaW5jbHVkZWQJRE1BMzIgKFBQSSAzMi1iaXQgRE1BIEVuYWJsZSkgKi8KKyNkZWZpbmUJU0tJUF9FTgkJMHgwMjAwCS8qIFBQSSBTa2lwIEVsZW1lbnQgRW5hYmxlICovCisjZGVmaW5lCVNLSVBfRU8JCTB4MDQwMAkvKiBQUEkgU2tpcCBFdmVuL09kZCBFbGVtZW50cyAqLworI2RlZmluZQlETEVOR1RICQkweDM4MDAJLyogUFBJIERhdGEgTGVuZ3RoICAqLworI2RlZmluZQlETEVOXzgJCTB4MAkgICAgIC8qCVBQSSBEYXRhIExlbmd0aAltYXNrIGZvciBETEVOPTggKi8KKyNkZWZpbmUJRExFTl8xMAkJMHgwODAwCQkvKiBEYXRhCUxlbmd0aCA9IDEwIEJpdHMgKi8KKyNkZWZpbmUJRExFTl8xMQkJMHgxMDAwCQkvKiBEYXRhCUxlbmd0aCA9IDExIEJpdHMgKi8KKyNkZWZpbmUJRExFTl8xMgkJMHgxODAwCQkvKiBEYXRhCUxlbmd0aCA9IDEyIEJpdHMgKi8KKyNkZWZpbmUJRExFTl8xMwkJMHgyMDAwCQkvKiBEYXRhCUxlbmd0aCA9IDEzIEJpdHMgKi8KKyNkZWZpbmUJRExFTl8xNAkJMHgyODAwCQkvKiBEYXRhCUxlbmd0aCA9IDE0IEJpdHMgKi8KKyNkZWZpbmUJRExFTl8xNQkJMHgzMDAwCQkvKiBEYXRhCUxlbmd0aCA9IDE1IEJpdHMgKi8KKyNkZWZpbmUJRExFTl8xNgkJMHgzODAwCQkvKiBEYXRhCUxlbmd0aCA9IDE2IEJpdHMgKi8KKyNpZmRlZiBfTUlTUkFfUlVMRVMKKyNkZWZpbmUJRExFTih4KQkJKCgoKHgpLTl1KSAmIDB4MDd1KSA8PCAxMSkgIC8qIFBQSSBEYXRhCUxlbmd0aCAob25seSB3b3JrcyBmb3IgeD0xMC0tPng9MTYpICovCisjZWxzZQorI2RlZmluZQlETEVOKHgpCQkoKCgoeCktOSkgJiAweDA3KSA8PCAxMSkgIC8qIFBQSSBEYXRhIExlbmd0aCAob25seSB3b3JrcyBmb3IgeD0xMC0tPng9MTYpICovCisjZW5kaWYgLyogX01JU1JBX1JVTEVTICovCisjZGVmaW5lCVBPTAkJCTB4QzAwMAkvKiBQUEkgU2lnbmFsIFBvbGFyaXRpZXMgICAgICAgKi8KKyNkZWZpbmUJUE9MQwkJMHg0MDAwCQkvKiBQUEkgQ2xvY2sgUG9sYXJpdHkgKi8KKyNkZWZpbmUJUE9MUwkJMHg4MDAwCQkvKiBQUEkgRnJhbWUgU3luYyBQb2xhcml0eSAqLworCisKKy8qIFBQSV9TVEFUVVMgTWFza3MJCQkJCSAgICAgKi8KKyNkZWZpbmUJRkxECQkJMHgwNDAwCS8qIEZpZWxkIEluZGljYXRvciAgICovCisjZGVmaW5lCUZUX0VSUgkJMHgwODAwCS8qIEZyYW1lIFRyYWNrIEVycm9yICovCisjZGVmaW5lCU9WUgkJCTB4MTAwMAkvKiBGSUZPCU92ZXJmbG93IEVycm9yICovCisjZGVmaW5lCVVORFIJCTB4MjAwMAkvKiBGSUZPCVVuZGVycnVuIEVycm9yICovCisjZGVmaW5lCUVSUl9ERVQJCTB4NDAwMAkvKiBFcnJvciBEZXRlY3RlZCBJbmRpY2F0b3IgKi8KKyNkZWZpbmUJRVJSX05DT1IJMHg4MDAwCS8qIEVycm9yIE5vdCBDb3JyZWN0ZWQgSW5kaWNhdG9yICovCisKKworLyogKioqKioqKioqKiAgRE1BIENPTlRST0xMRVIgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKioqLworLyogRE1BeF9DT05GSUcsCU1ETUFfeXlfQ09ORklHIE1hc2tzICovCisjZGVmaW5lCURNQUVOCQkweDAwMDEJLyogQ2hhbm5lbCBFbmFibGUgKi8KKyNkZWZpbmUJV05SCQkJMHgwMDAyCS8qIENoYW5uZWwgRGlyZWN0aW9uIChXL1IqKSAqLworI2RlZmluZQlXRFNJWkVfOAkweDAwMDAJLyogV29yZAlTaXplIDggYml0cyAqLworI2RlZmluZQlXRFNJWkVfMTYJMHgwMDA0CS8qIFdvcmQJU2l6ZSAxNgliaXRzICovCisjZGVmaW5lCVdEU0laRV8zMgkweDAwMDgJLyogV29yZAlTaXplIDMyCWJpdHMgKi8KKyNkZWZpbmUJRE1BMkQJCTB4MDAxMAkvKiAyRC8xRCogTW9kZSAqLworI2RlZmluZQlSRVNUQVJUCQkweDAwMjAJLyogUmVzdGFydCAqLworI2RlZmluZQlESV9TRUwJCTB4MDA0MAkvKiBEYXRhCUludGVycnVwdCBTZWxlY3QgKi8KKyNkZWZpbmUJRElfRU4JCTB4MDA4MAkvKiBEYXRhCUludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUJTkRTSVpFCQkweDA5MDAJLyogTmV4dAlEZXNjcmlwdG9yIFNpemUgKi8KKyNkZWZpbmUJTkRTSVpFXzAJMHgwMDAwCS8qIE5leHQJRGVzY3JpcHRvciBTaXplCT0gMCAoU3RvcC9BdXRvYnVmZmVyKSAqLworI2RlZmluZQlORFNJWkVfMQkweDAxMDAJLyogTmV4dAlEZXNjcmlwdG9yIFNpemUJPSAxICovCisjZGVmaW5lCU5EU0laRV8yCTB4MDIwMAkvKiBOZXh0CURlc2NyaXB0b3IgU2l6ZQk9IDIgKi8KKyNkZWZpbmUJTkRTSVpFXzMJMHgwMzAwCS8qIE5leHQJRGVzY3JpcHRvciBTaXplCT0gMyAqLworI2RlZmluZQlORFNJWkVfNAkweDA0MDAJLyogTmV4dAlEZXNjcmlwdG9yIFNpemUJPSA0ICovCisjZGVmaW5lCU5EU0laRV81CTB4MDUwMAkvKiBOZXh0CURlc2NyaXB0b3IgU2l6ZQk9IDUgKi8KKyNkZWZpbmUJTkRTSVpFXzYJMHgwNjAwCS8qIE5leHQJRGVzY3JpcHRvciBTaXplCT0gNiAqLworI2RlZmluZQlORFNJWkVfNwkweDA3MDAJLyogTmV4dAlEZXNjcmlwdG9yIFNpemUJPSA3ICovCisjZGVmaW5lCU5EU0laRV84CTB4MDgwMAkvKiBOZXh0CURlc2NyaXB0b3IgU2l6ZQk9IDggKi8KKyNkZWZpbmUJTkRTSVpFXzkJMHgwOTAwCS8qIE5leHQJRGVzY3JpcHRvciBTaXplCT0gOSAqLworCisjZGVmaW5lIERNQUZMT1cJCQkweDcwMDAJLyogRmxvdyBDb250cm9sICovCisjZGVmaW5lIERNQUZMT1dfU1RPUAkJMHgwMDAwCS8qIFN0b3AgTW9kZSAqLworI2RlZmluZSBETUFGTE9XX0FVVE8JCTB4MTAwMAkvKiBBdXRvYnVmZmVyIE1vZGUgKi8KKyNkZWZpbmUgRE1BRkxPV19BUlJBWQkJMHg0MDAwCS8qIERlc2NyaXB0b3IgQXJyYXkgTW9kZSAqLworI2RlZmluZSBETUFGTE9XX1NNQUxMCQkweDYwMDAJLyogU21hbGwgTW9kZWwgRGVzY3JpcHRvciBMaXN0IE1vZGUgKi8KKyNkZWZpbmUgRE1BRkxPV19MQVJHRQkJMHg3MDAwCS8qIExhcmdlIE1vZGVsIERlc2NyaXB0b3IgTGlzdCBNb2RlICovCisKKyNkZWZpbmUJRE1BRU5fUAkJMHgwCQkvKiBDaGFubmVsIEVuYWJsZSAqLworI2RlZmluZQlXTlJfUAkJMHgxCQkvKiBDaGFubmVsIERpcmVjdGlvbiAoVy9SKikgKi8KKyNkZWZpbmUJRE1BMkRfUAkJMHg0CQkvKiAyRC8xRCogTW9kZSAqLworI2RlZmluZQlSRVNUQVJUX1AJMHg1CQkvKiBSZXN0YXJ0ICovCisjZGVmaW5lCURJX1NFTF9QCTB4NgkJLyogRGF0YQlJbnRlcnJ1cHQgU2VsZWN0ICovCisjZGVmaW5lCURJX0VOX1AJCTB4NwkJLyogRGF0YQlJbnRlcnJ1cHQgRW5hYmxlICovCisKKy8qIERNQXhfSVJRX1NUQVRVUywgTURNQV95eV9JUlFfU1RBVFVTIE1hc2tzICovCisjZGVmaW5lCURNQV9ET05FCTB4MDAwMQkvKiBETUEgRG9uZSBJbmRpY2F0b3IgKi8KKyNkZWZpbmUJRE1BX0VSUgkJMHgwMDAyCS8qIERNQSBFcnJvciBJbmRpY2F0b3IgKi8KKyNkZWZpbmUJREZFVENICQkweDAwMDQJLyogRGVzY3JpcHRvciBGZXRjaCBJbmRpY2F0b3IgKi8KKyNkZWZpbmUJRE1BX1JVTgkJMHgwMDA4CS8qIERNQSBSdW5uaW5nIEluZGljYXRvciAqLworCisjZGVmaW5lCURNQV9ET05FX1AJMHgwCQkvKiBETUEgRG9uZSBJbmRpY2F0b3IgKi8KKyNkZWZpbmUJRE1BX0VSUl9QCTB4MQkJLyogRE1BIEVycm9yIEluZGljYXRvciAqLworI2RlZmluZQlERkVUQ0hfUAkweDIJCS8qIERlc2NyaXB0b3IgRmV0Y2ggSW5kaWNhdG9yICovCisjZGVmaW5lCURNQV9SVU5fUAkweDMJCS8qIERNQSBSdW5uaW5nIEluZGljYXRvciAqLworCisvKiBETUF4X1BFUklQSEVSQUxfTUFQLAlNRE1BX3l5X1BFUklQSEVSQUxfTUFQIE1hc2tzICovCisKKyNkZWZpbmUJQ1RZUEUJCQkweDAwNDAJLyogRE1BIENoYW5uZWwgVHlwZSBJbmRpY2F0b3IgKi8KKyNkZWZpbmUJQ1RZUEVfUAkJCTB4NgkJLyogRE1BIENoYW5uZWwgVHlwZSBJbmRpY2F0b3IgQklUIFBPU0lUSU9OICovCisjZGVmaW5lCVBDQVA4CQkJMHgwMDgwCS8qIERNQSA4LWJpdCBPcGVyYXRpb24gSW5kaWNhdG9yICAgKi8KKyNkZWZpbmUJUENBUDE2CQkJMHgwMTAwCS8qIERNQSAxNi1iaXQgT3BlcmF0aW9uCUluZGljYXRvciAqLworI2RlZmluZQlQQ0FQMzIJCQkweDAyMDAJLyogRE1BIDMyLWJpdCBPcGVyYXRpb24JSW5kaWNhdG9yICovCisjZGVmaW5lCVBDQVBXUgkJCTB4MDQwMAkvKiBETUEgV3JpdGUgT3BlcmF0aW9uIEluZGljYXRvciAqLworI2RlZmluZQlQQ0FQUkQJCQkweDA4MDAJLyogRE1BIFJlYWQgT3BlcmF0aW9uIEluZGljYXRvciAqLworI2RlZmluZQlQTUFQCQkJMHhGMDAwCS8qIERNQSBQZXJpcGhlcmFsIE1hcCBGaWVsZCAqLworCisvKiBQTUFQCUVuY29kaW5ncyBGb3IgRE1BIENvbnRyb2xsZXIgMCAqLworI2RlZmluZQlQTUFQX1BQSQkJMHgwMDAwCS8qIFBNQVAJUFBJIFBvcnQgRE1BICovCisjZGVmaW5lCVBNQVBfU1BPUlQwUlgJMHgxMDAwCS8qIFBNQVAJU1BPUlQwIFJlY2VpdmUgRE1BICovCisjZGVmaW5lCVBNQVBfU1BPUlQwVFgJMHgyMDAwCS8qIFBNQVAJU1BPUlQwIFRyYW5zbWl0CURNQSAqLworI2RlZmluZQlQTUFQX1NQT1JUMVJYCTB4MzAwMAkvKiBQTUFQCVNQT1JUMSBSZWNlaXZlIERNQSAqLworI2RlZmluZQlQTUFQX1NQT1JUMVRYCTB4NDAwMAkvKiBQTUFQCVNQT1JUMSBUcmFuc21pdAlETUEgKi8KKyNkZWZpbmUJUE1BUF9TUEkwCQkweDUwMDAJLyogUE1BUAlTUEkgRE1BICovCisjZGVmaW5lCVBNQVBfVUFSVDBSWAkJMHg2MDAwCS8qIFBNQVAJVUFSVCBSZWNlaXZlIERNQSAqLworI2RlZmluZQlQTUFQX1VBUlQwVFgJCTB4NzAwMAkvKiBQTUFQCVVBUlQgVHJhbnNtaXQgRE1BICovCisKKy8qIFBNQVAJRW5jb2RpbmdzIEZvciBETUEgQ29udHJvbGxlciAxICovCisjZGVmaW5lCVBNQVBfU1BPUlQyUlgJICAgIDB4MDAwMCAgLyogUE1BUCBTUE9SVDIgUmVjZWl2ZSBETUEgKi8KKyNkZWZpbmUJUE1BUF9TUE9SVDJUWAkgICAgMHgxMDAwICAvKiBQTUFQIFNQT1JUMiBUcmFuc21pdCBETUEgKi8KKyNkZWZpbmUJUE1BUF9TUE9SVDNSWAkgICAgMHgyMDAwICAvKiBQTUFQIFNQT1JUMyBSZWNlaXZlIERNQSAqLworI2RlZmluZQlQTUFQX1NQT1JUM1RYCSAgICAweDMwMDAgIC8qIFBNQVAgU1BPUlQzIFRyYW5zbWl0IERNQSAqLworI2RlZmluZQlQTUFQX1NQSTEJICAgIDB4NjAwMCAgLyogUE1BUCBTUEkxIERNQSAqLworI2RlZmluZQlQTUFQX1NQSTIJICAgIDB4NzAwMCAgLyogUE1BUCBTUEkyIERNQSAqLworI2RlZmluZQlQTUFQX1VBUlQxUlgJICAgIDB4ODAwMCAgLyogUE1BUCBVQVJUMSBSZWNlaXZlIERNQSAqLworI2RlZmluZQlQTUFQX1VBUlQxVFgJICAgIDB4OTAwMCAgLyogUE1BUCBVQVJUMSBUcmFuc21pdCBETUEgKi8KKyNkZWZpbmUJUE1BUF9VQVJUMlJYCSAgICAweEEwMDAgIC8qIFBNQVAgVUFSVDIgUmVjZWl2ZSBETUEgKi8KKyNkZWZpbmUJUE1BUF9VQVJUMlRYCSAgICAweEIwMDAgIC8qIFBNQVAgVUFSVDIgVHJhbnNtaXQgRE1BICovCisKKworLyogICoqKioqKioqKioqKiogIEdFTkVSQUwgUFVSUE9TRSBUSU1FUiBNQVNLUwkqKioqKioqKioqKioqKioqKioqKiAqLworLyogUFdNIFRpbWVyIGJpdCBkZWZpbml0aW9ucyAqLworLyogVElNRVJfRU5BQkxFCVJlZ2lzdGVyICovCisjZGVmaW5lCVRJTUVOMAkJCTB4MDAwMQkvKiBFbmFibGUgVGltZXIJMCAqLworI2RlZmluZQlUSU1FTjEJCQkweDAwMDIJLyogRW5hYmxlIFRpbWVyCTEgKi8KKyNkZWZpbmUJVElNRU4yCQkJMHgwMDA0CS8qIEVuYWJsZSBUaW1lcgkyICovCisKKyNkZWZpbmUJVElNRU4wX1AJCTB4MDAKKyNkZWZpbmUJVElNRU4xX1AJCTB4MDEKKyNkZWZpbmUJVElNRU4yX1AJCTB4MDIKKworLyogVElNRVJfRElTQUJMRSBSZWdpc3RlciAqLworI2RlZmluZQlUSU1ESVMwCQkJMHgwMDAxCS8qIERpc2FibGUgVGltZXIgMCAqLworI2RlZmluZQlUSU1ESVMxCQkJMHgwMDAyCS8qIERpc2FibGUgVGltZXIgMSAqLworI2RlZmluZQlUSU1ESVMyCQkJMHgwMDA0CS8qIERpc2FibGUgVGltZXIgMiAqLworCisjZGVmaW5lCVRJTURJUzBfUAkJMHgwMAorI2RlZmluZQlUSU1ESVMxX1AJCTB4MDEKKyNkZWZpbmUJVElNRElTMl9QCQkweDAyCisKKy8qIFRJTUVSX1NUQVRVUwlSZWdpc3RlciAqLworI2RlZmluZQlUSU1JTDAJCQkweDAwMDEJLyogVGltZXIgMCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJVElNSUwxCQkJMHgwMDAyCS8qIFRpbWVyIDEgSW50ZXJydXB0ICovCisjZGVmaW5lCVRJTUlMMgkJCTB4MDAwNAkvKiBUaW1lciAyIEludGVycnVwdCAqLworI2RlZmluZQlUT1ZGX0VSUjAJCTB4MDAxMAkvKiBUaW1lciAwIENvdW50ZXIgT3ZlcmZsb3cgKi8KKyNkZWZpbmUJVE9WRl9FUlIxCQkweDAwMjAJLyogVGltZXIgMSBDb3VudGVyIE92ZXJmbG93ICovCisjZGVmaW5lCVRPVkZfRVJSMgkJMHgwMDQwCS8qIFRpbWVyIDIgQ291bnRlciBPdmVyZmxvdyAqLworI2RlZmluZQlUUlVOMAkJCTB4MTAwMAkvKiBUaW1lciAwIFNsYXZlIEVuYWJsZQlTdGF0dXMgKi8KKyNkZWZpbmUJVFJVTjEJCQkweDIwMDAJLyogVGltZXIgMSBTbGF2ZSBFbmFibGUJU3RhdHVzICovCisjZGVmaW5lCVRSVU4yCQkJMHg0MDAwCS8qIFRpbWVyIDIgU2xhdmUgRW5hYmxlCVN0YXR1cyAqLworCisjZGVmaW5lCVRJTUlMMF9QCQkweDAwCisjZGVmaW5lCVRJTUlMMV9QCQkweDAxCisjZGVmaW5lCVRJTUlMMl9QCQkweDAyCisjZGVmaW5lCVRPVkZfRVJSMF9QCQkweDA0CisjZGVmaW5lCVRPVkZfRVJSMV9QCQkweDA1CisjZGVmaW5lCVRPVkZfRVJSMl9QCQkweDA2CisjZGVmaW5lCVRSVU4wX1AJCQkweDBDCisjZGVmaW5lCVRSVU4xX1AJCQkweDBECisjZGVmaW5lCVRSVU4yX1AJCQkweDBFCisKKy8qIEFsdGVybmF0ZSBEZXByZWNhdGVkCU1hY3JvcyBQcm92aWRlZAlGb3IgQmFja3dhcmRzIENvZGUgQ29tcGF0aWJpbGl0eSAqLworI2RlZmluZQlUT1ZMX0VSUjAJCVRPVkZfRVJSMAorI2RlZmluZQlUT1ZMX0VSUjEJCVRPVkZfRVJSMQorI2RlZmluZQlUT1ZMX0VSUjIJCVRPVkZfRVJSMgorI2RlZmluZQlUT1ZMX0VSUjBfUAkJVE9WRl9FUlIwX1AKKyNkZWZpbmUJVE9WTF9FUlIxX1AJVE9WRl9FUlIxX1AKKyNkZWZpbmUJVE9WTF9FUlIyX1AJVE9WRl9FUlIyX1AKKworLyogVElNRVJ4X0NPTkZJRyBSZWdpc3RlcnMgKi8KKyNkZWZpbmUJUFdNX09VVAkJCTB4MDAwMQorI2RlZmluZQlXRFRIX0NBUAkJMHgwMDAyCisjZGVmaW5lCUVYVF9DTEsJCQkweDAwMDMKKyNkZWZpbmUJUFVMU0VfSEkJCTB4MDAwNAorI2RlZmluZQlQRVJJT0RfQ05UCQkweDAwMDgKKyNkZWZpbmUJSVJRX0VOQQkJCTB4MDAxMAorI2RlZmluZQlUSU5fU0VMCQkJMHgwMDIwCisjZGVmaW5lCU9VVF9ESVMJCQkweDAwNDAKKyNkZWZpbmUJQ0xLX1NFTAkJCTB4MDA4MAorI2RlZmluZQlUT0dHTEVfSEkJCTB4MDEwMAorI2RlZmluZQlFTVVfUlVOCQkJMHgwMjAwCisjaWZkZWYgX01JU1JBX1JVTEVTCisjZGVmaW5lCUVSUl9UWVAoeCkJCSgoKHgpICYJMHgwM3UpIDw8IDE0KQorI2Vsc2UKKyNkZWZpbmUJRVJSX1RZUCh4KQkJKCgoeCkgJgkweDAzKSA8PCAxNCkKKyNlbmRpZiAvKiBfTUlTUkFfUlVMRVMgKi8KKworI2RlZmluZQlUTU9ERV9QMAkJMHgwMAorI2RlZmluZQlUTU9ERV9QMQkJMHgwMQorI2RlZmluZQlQVUxTRV9ISV9QCQkweDAyCisjZGVmaW5lCVBFUklPRF9DTlRfUAkweDAzCisjZGVmaW5lCUlSUV9FTkFfUAkJMHgwNAorI2RlZmluZQlUSU5fU0VMX1AJCTB4MDUKKyNkZWZpbmUJT1VUX0RJU19QCQkweDA2CisjZGVmaW5lCUNMS19TRUxfUAkJMHgwNworI2RlZmluZQlUT0dHTEVfSElfUAkJMHgwOAorI2RlZmluZQlFTVVfUlVOX1AJCTB4MDkKKyNkZWZpbmUJRVJSX1RZUF9QMAkJMHgwRQorI2RlZmluZQlFUlJfVFlQX1AxCQkweDBGCisKKworLyovICoqKioqKioqKioqKioqKioqKgkgR0VORVJBTC1QVVJQT1NFIEkvTyAgKioqKioqKioqKioqKioqKioqKioqICovCisvKiAgRmxhZyBJL08gKEZJT18pIE1hc2tzICovCisjZGVmaW5lCVBGMAkJCTB4MDAwMQorI2RlZmluZQlQRjEJCQkweDAwMDIKKyNkZWZpbmUJUEYyCQkJMHgwMDA0CisjZGVmaW5lCVBGMwkJCTB4MDAwOAorI2RlZmluZQlQRjQJCQkweDAwMTAKKyNkZWZpbmUJUEY1CQkJMHgwMDIwCisjZGVmaW5lCVBGNgkJCTB4MDA0MAorI2RlZmluZQlQRjcJCQkweDAwODAKKyNkZWZpbmUJUEY4CQkJMHgwMTAwCisjZGVmaW5lCVBGOQkJCTB4MDIwMAorI2RlZmluZQlQRjEwCQkweDA0MDAKKyNkZWZpbmUJUEYxMQkJMHgwODAwCisjZGVmaW5lCVBGMTIJCTB4MTAwMAorI2RlZmluZQlQRjEzCQkweDIwMDAKKyNkZWZpbmUJUEYxNAkJMHg0MDAwCisjZGVmaW5lCVBGMTUJCTB4ODAwMAorCisvKiAgUE9SVCBGIEJJVCBQT1NJVElPTlMgKi8KKyNkZWZpbmUJUEYwX1AJCTB4MAorI2RlZmluZQlQRjFfUAkJMHgxCisjZGVmaW5lCVBGMl9QCQkweDIKKyNkZWZpbmUJUEYzX1AJCTB4MworI2RlZmluZQlQRjRfUAkJMHg0CisjZGVmaW5lCVBGNV9QCQkweDUKKyNkZWZpbmUJUEY2X1AJCTB4NgorI2RlZmluZQlQRjdfUAkJMHg3CisjZGVmaW5lCVBGOF9QCQkweDgKKyNkZWZpbmUJUEY5X1AJCTB4OQorI2RlZmluZQlQRjEwX1AJCTB4QQorI2RlZmluZQlQRjExX1AJCTB4QgorI2RlZmluZQlQRjEyX1AJCTB4QworI2RlZmluZQlQRjEzX1AJCTB4RAorI2RlZmluZQlQRjE0X1AJCTB4RQorI2RlZmluZQlQRjE1X1AJCTB4RgorCisKKy8qKioqKioqKioqKioqKioqKioqICAgR1BJTyBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqLworLyogUG9ydAlDIE1hc2tzICovCisjZGVmaW5lCVBDMAkJMHgwMDAxCisjZGVmaW5lCVBDMQkJMHgwMDAyCisjZGVmaW5lCVBDNAkJMHgwMDEwCisjZGVmaW5lCVBDNQkJMHgwMDIwCisjZGVmaW5lCVBDNgkJMHgwMDQwCisjZGVmaW5lCVBDNwkJMHgwMDgwCisjZGVmaW5lCVBDOAkJMHgwMTAwCisjZGVmaW5lCVBDOQkJMHgwMjAwCisvKiBQb3J0CUMgQml0IFBvc2l0aW9ucyAqLworI2RlZmluZQlQQzBfUAkweDAKKyNkZWZpbmUJUEMxX1AJMHgxCisjZGVmaW5lCVBDNF9QCTB4NAorI2RlZmluZQlQQzVfUAkweDUKKyNkZWZpbmUJUEM2X1AJMHg2CisjZGVmaW5lCVBDN19QCTB4NworI2RlZmluZQlQQzhfUAkweDgKKyNkZWZpbmUJUEM5X1AJMHg5CisKKy8qIFBvcnQJRCAqLworI2RlZmluZQlQRDAJCTB4MDAwMQorI2RlZmluZQlQRDEJCTB4MDAwMgorI2RlZmluZQlQRDIJCTB4MDAwNAorI2RlZmluZQlQRDMJCTB4MDAwOAorI2RlZmluZQlQRDQJCTB4MDAxMAorI2RlZmluZQlQRDUJCTB4MDAyMAorI2RlZmluZQlQRDYJCTB4MDA0MAorI2RlZmluZQlQRDcJCTB4MDA4MAorI2RlZmluZQlQRDgJCTB4MDEwMAorI2RlZmluZQlQRDkJCTB4MDIwMAorI2RlZmluZQlQRDEwCTB4MDQwMAorI2RlZmluZQlQRDExCTB4MDgwMAorI2RlZmluZQlQRDEyCTB4MTAwMAorI2RlZmluZQlQRDEzCTB4MjAwMAorI2RlZmluZQlQRDE0CTB4NDAwMAorI2RlZmluZQlQRDE1CTB4ODAwMAorLyogUG9ydAlEIEJpdCBQb3NpdGlvbnMgKi8KKyNkZWZpbmUJUEQwX1AJMHgwCisjZGVmaW5lCVBEMV9QCTB4MQorI2RlZmluZQlQRDJfUAkweDIKKyNkZWZpbmUJUEQzX1AJMHgzCisjZGVmaW5lCVBENF9QCTB4NAorI2RlZmluZQlQRDVfUAkweDUKKyNkZWZpbmUJUEQ2X1AJMHg2CisjZGVmaW5lCVBEN19QCTB4NworI2RlZmluZQlQRDhfUAkweDgKKyNkZWZpbmUJUEQ5X1AJMHg5CisjZGVmaW5lCVBEMTBfUAkweEEKKyNkZWZpbmUJUEQxMV9QCTB4QgorI2RlZmluZQlQRDEyX1AJMHhDCisjZGVmaW5lCVBEMTNfUAkweEQKKyNkZWZpbmUJUEQxNF9QCTB4RQorI2RlZmluZQlQRDE1X1AJMHhGCisKKy8qIFBvcnQJRSAqLworI2RlZmluZQlQRTAJCTB4MDAwMQorI2RlZmluZQlQRTEJCTB4MDAwMgorI2RlZmluZQlQRTIJCTB4MDAwNAorI2RlZmluZQlQRTMJCTB4MDAwOAorI2RlZmluZQlQRTQJCTB4MDAxMAorI2RlZmluZQlQRTUJCTB4MDAyMAorI2RlZmluZQlQRTYJCTB4MDA0MAorI2RlZmluZQlQRTcJCTB4MDA4MAorI2RlZmluZQlQRTgJCTB4MDEwMAorI2RlZmluZQlQRTkJCTB4MDIwMAorI2RlZmluZQlQRTEwCTB4MDQwMAorI2RlZmluZQlQRTExCTB4MDgwMAorI2RlZmluZQlQRTEyCTB4MTAwMAorI2RlZmluZQlQRTEzCTB4MjAwMAorI2RlZmluZQlQRTE0CTB4NDAwMAorI2RlZmluZQlQRTE1CTB4ODAwMAorLyogUG9ydAlFIEJpdCBQb3NpdGlvbnMgKi8KKyNkZWZpbmUJUEUwX1AJMHgwCisjZGVmaW5lCVBFMV9QCTB4MQorI2RlZmluZQlQRTJfUAkweDIKKyNkZWZpbmUJUEUzX1AJMHgzCisjZGVmaW5lCVBFNF9QCTB4NAorI2RlZmluZQlQRTVfUAkweDUKKyNkZWZpbmUJUEU2X1AJMHg2CisjZGVmaW5lCVBFN19QCTB4NworI2RlZmluZQlQRThfUAkweDgKKyNkZWZpbmUJUEU5X1AJMHg5CisjZGVmaW5lCVBFMTBfUAkweEEKKyNkZWZpbmUJUEUxMV9QCTB4QgorI2RlZmluZQlQRTEyX1AJMHhDCisjZGVmaW5lCVBFMTNfUAkweEQKKyNkZWZpbmUJUEUxNF9QCTB4RQorI2RlZmluZQlQRTE1X1AJMHhGCisKKworLyogKioqKioqKioqKioJU0VSSUFMIFBFUklQSEVSQUwgSU5URVJGQUNFIChTUEkpIE1BU0tTCSAqKioqKioqKioqKioqKioqICovCisvKiBTUEl4X0NUTCBNYXNrcyAqLworI2RlZmluZQlUSU1PRAkJMHgwMDAzCQkvKiBUcmFuc2ZlciBJbml0aWF0ZSBNb2RlICovCisjZGVmaW5lCVJEQlJfQ09SRQkweDAwMDAJCS8qCQlSREJSIFJlYWQgSW5pdGlhdGVzLCBJUlEgV2hlbiBSREJSIEZ1bGwgKi8KKyNkZWZpbmUJVERCUl9DT1JFCTB4MDAwMQkJLyoJCVREQlIgV3JpdGUgSW5pdGlhdGVzLCBJUlEgV2hlbiBUREJSIEVtcHR5ICovCisjZGVmaW5lCVJEQlJfRE1BCTB4MDAwMgkJLyoJCURNQSBSZWFkLCBETUEgVW50aWwgRklGTyBFbXB0eSAqLworI2RlZmluZQlUREJSX0RNQQkweDAwMDMJCS8qCQlETUEgV3JpdGUsIERNQSBVbnRpbCBGSUZPIEZ1bGwgKi8KKyNkZWZpbmUJU1oJCQkweDAwMDQJCS8qIFNlbmQJWmVybyAoV2hlbiBUREJSCUVtcHR5LCBTZW5kIFplcm8vTGFzdCopICovCisjZGVmaW5lCUdNCQkJMHgwMDA4CQkvKiBHZXQgTW9yZSAoV2hlbiBSREJSIEZ1bGwsIE92ZXJ3cml0ZS9EaXNjYXJkKikgKi8KKyNkZWZpbmUJUFNTRQkJMHgwMDEwCQkvKiBTbGF2ZS1TZWxlY3QJSW5wdXQgRW5hYmxlICovCisjZGVmaW5lCUVNSVNPCQkweDAwMjAJCS8qIEVuYWJsZSBNSVNPIEFzIE91dHB1dCAqLworI2RlZmluZQlTSVpFCQkweDAxMDAJCS8qIFNpemUJb2YgV29yZHMgKDE2LzgqCUJpdHMpICovCisjZGVmaW5lCUxTQkYJCTB4MDIwMAkJLyogTFNCIEZpcnN0CQkJICovCisjZGVmaW5lCUNQSEEJCTB4MDQwMAkJLyogQ2xvY2sgUGhhc2UJCQkgKi8KKyNkZWZpbmUJQ1BPTAkJMHgwODAwCQkvKiBDbG9jayBQb2xhcml0eQkJICovCisjZGVmaW5lCU1TVFIJCTB4MTAwMAkJLyogTWFzdGVyL1NsYXZlKgkJICovCisjZGVmaW5lCVdPTQkJCTB4MjAwMAkJLyogV3JpdGUgT3BlbiBEcmFpbiBNYXN0ZXIgKi8KKyNkZWZpbmUJU1BFCQkJMHg0MDAwCQkvKiBTUEkgRW5hYmxlCQkJICovCisKKy8qIFNQSXhfRkxHIE1hc2tzICovCisjZGVmaW5lCUZMUzEJMHgwMDAyCS8qIEVuYWJsZXMgKD0xKQlTUElfRkxPVVQxIGFzIGZsYWcgb3V0cHV0IGZvciBTUEkgU2xhdmUtc2VsZWN0ICovCisjZGVmaW5lCUZMUzIJMHgwMDA0CS8qIEVuYWJsZXMgKD0xKQlTUElfRkxPVVQyIGFzIGZsYWcgb3V0cHV0IGZvciBTUEkgU2xhdmUtc2VsZWN0ICovCisjZGVmaW5lCUZMUzMJMHgwMDA4CS8qIEVuYWJsZXMgKD0xKQlTUElfRkxPVVQzIGFzIGZsYWcgb3V0cHV0IGZvciBTUEkgU2xhdmUtc2VsZWN0ICovCisjZGVmaW5lCUZMUzQJMHgwMDEwCS8qIEVuYWJsZXMgKD0xKQlTUElfRkxPVVQ0IGFzIGZsYWcgb3V0cHV0IGZvciBTUEkgU2xhdmUtc2VsZWN0ICovCisjZGVmaW5lCUZMUzUJMHgwMDIwCS8qIEVuYWJsZXMgKD0xKQlTUElfRkxPVVQ1IGFzIGZsYWcgb3V0cHV0IGZvciBTUEkgU2xhdmUtc2VsZWN0ICovCisjZGVmaW5lCUZMUzYJMHgwMDQwCS8qIEVuYWJsZXMgKD0xKQlTUElfRkxPVVQ2IGFzIGZsYWcgb3V0cHV0IGZvciBTUEkgU2xhdmUtc2VsZWN0ICovCisjZGVmaW5lCUZMUzcJMHgwMDgwCS8qIEVuYWJsZXMgKD0xKQlTUElfRkxPVVQ3IGFzIGZsYWcgb3V0cHV0IGZvciBTUEkgU2xhdmUtc2VsZWN0ICovCisKKyNkZWZpbmUJRkxHMQkweDAyMDAJLyogQWN0aXZhdGVzICg9MCkgU1BJX0ZMT1VUMSBhcwlmbGFnIG91dHB1dCBmb3IJU1BJIFNsYXZlLXNlbGVjdCAgKi8KKyNkZWZpbmUJRkxHMgkweDA0MDAJLyogQWN0aXZhdGVzICg9MCkgU1BJX0ZMT1VUMiBhcwlmbGFnIG91dHB1dCBmb3IJU1BJIFNsYXZlLXNlbGVjdCAqLworI2RlZmluZQlGTEczCTB4MDgwMAkvKiBBY3RpdmF0ZXMgKD0wKSBTUElfRkxPVVQzIGFzCWZsYWcgb3V0cHV0IGZvcglTUEkgU2xhdmUtc2VsZWN0ICAqLworI2RlZmluZQlGTEc0CTB4MTAwMAkvKiBBY3RpdmF0ZXMgKD0wKSBTUElfRkxPVVQ0IGFzCWZsYWcgb3V0cHV0IGZvcglTUEkgU2xhdmUtc2VsZWN0ICAqLworI2RlZmluZQlGTEc1CTB4MjAwMAkvKiBBY3RpdmF0ZXMgKD0wKSBTUElfRkxPVVQ1IGFzCWZsYWcgb3V0cHV0IGZvcglTUEkgU2xhdmUtc2VsZWN0ICAqLworI2RlZmluZQlGTEc2CTB4NDAwMAkvKiBBY3RpdmF0ZXMgKD0wKSBTUElfRkxPVVQ2IGFzCWZsYWcgb3V0cHV0IGZvcglTUEkgU2xhdmUtc2VsZWN0ICAqLworI2RlZmluZQlGTEc3CTB4ODAwMAkvKiBBY3RpdmF0ZXMgKD0wKSBTUElfRkxPVVQ3IGFzCWZsYWcgb3V0cHV0IGZvcglTUEkgU2xhdmUtc2VsZWN0ICovCisKKy8qIFNQSXhfRkxHIEJpdAlQb3NpdGlvbnMgKi8KKyNkZWZpbmUJRkxTMV9QCTB4MDAwMQkvKiBFbmFibGVzICg9MSkJU1BJX0ZMT1VUMSBhcyBmbGFnIG91dHB1dCBmb3IgU1BJIFNsYXZlLXNlbGVjdCAqLworI2RlZmluZQlGTFMyX1AJMHgwMDAyCS8qIEVuYWJsZXMgKD0xKQlTUElfRkxPVVQyIGFzIGZsYWcgb3V0cHV0IGZvciBTUEkgU2xhdmUtc2VsZWN0ICovCisjZGVmaW5lCUZMUzNfUAkweDAwMDMJLyogRW5hYmxlcyAoPTEpCVNQSV9GTE9VVDMgYXMgZmxhZyBvdXRwdXQgZm9yIFNQSSBTbGF2ZS1zZWxlY3QgKi8KKyNkZWZpbmUJRkxTNF9QCTB4MDAwNAkvKiBFbmFibGVzICg9MSkJU1BJX0ZMT1VUNCBhcyBmbGFnIG91dHB1dCBmb3IgU1BJIFNsYXZlLXNlbGVjdCAqLworI2RlZmluZQlGTFM1X1AJMHgwMDA1CS8qIEVuYWJsZXMgKD0xKQlTUElfRkxPVVQ1IGFzIGZsYWcgb3V0cHV0IGZvciBTUEkgU2xhdmUtc2VsZWN0ICovCisjZGVmaW5lCUZMUzZfUAkweDAwMDYJLyogRW5hYmxlcyAoPTEpCVNQSV9GTE9VVDYgYXMgZmxhZyBvdXRwdXQgZm9yIFNQSSBTbGF2ZS1zZWxlY3QgKi8KKyNkZWZpbmUJRkxTN19QCTB4MDAwNwkvKiBFbmFibGVzICg9MSkJU1BJX0ZMT1VUNyBhcyBmbGFnIG91dHB1dCBmb3IgU1BJIFNsYXZlLXNlbGVjdCAqLworI2RlZmluZQlGTEcxX1AJMHgwMDA5CS8qIEFjdGl2YXRlcyAoPTApIFNQSV9GTE9VVDEgYXMJZmxhZyBvdXRwdXQgZm9yCVNQSSBTbGF2ZS1zZWxlY3QgICovCisjZGVmaW5lCUZMRzJfUAkweDAwMEEJLyogQWN0aXZhdGVzICg9MCkgU1BJX0ZMT1VUMiBhcwlmbGFnIG91dHB1dCBmb3IJU1BJIFNsYXZlLXNlbGVjdCAqLworI2RlZmluZQlGTEczX1AJMHgwMDBCCS8qIEFjdGl2YXRlcyAoPTApIFNQSV9GTE9VVDMgYXMJZmxhZyBvdXRwdXQgZm9yCVNQSSBTbGF2ZS1zZWxlY3QgICovCisjZGVmaW5lCUZMRzRfUAkweDAwMEMJLyogQWN0aXZhdGVzICg9MCkgU1BJX0ZMT1VUNCBhcwlmbGFnIG91dHB1dCBmb3IJU1BJIFNsYXZlLXNlbGVjdCAgKi8KKyNkZWZpbmUJRkxHNV9QCTB4MDAwRAkvKiBBY3RpdmF0ZXMgKD0wKSBTUElfRkxPVVQ1IGFzCWZsYWcgb3V0cHV0IGZvcglTUEkgU2xhdmUtc2VsZWN0ICAqLworI2RlZmluZQlGTEc2X1AJMHgwMDBFCS8qIEFjdGl2YXRlcyAoPTApIFNQSV9GTE9VVDYgYXMJZmxhZyBvdXRwdXQgZm9yCVNQSSBTbGF2ZS1zZWxlY3QgICovCisjZGVmaW5lCUZMRzdfUAkweDAwMEYJLyogQWN0aXZhdGVzICg9MCkgU1BJX0ZMT1VUNyBhcwlmbGFnIG91dHB1dCBmb3IJU1BJIFNsYXZlLXNlbGVjdCAqLworCisvKiBTUEl4X1NUQVQgTWFza3MgKi8KKyNkZWZpbmUJU1BJRgkweDAwMDEJLyogU2V0ICg9MSkgd2hlbiBTUEkgc2luZ2xlLXdvcmQgdHJhbnNmZXIgY29tcGxldGUgKi8KKyNkZWZpbmUJTU9ERgkweDAwMDIJLyogU2V0ICg9MSkgaW4gYSBtYXN0ZXIJZGV2aWNlIHdoZW4gc29tZSBvdGhlciBkZXZpY2UgdHJpZXMgdG8gYmVjb21lIG1hc3RlciAqLworI2RlZmluZQlUWEUJCTB4MDAwNAkvKiBTZXQgKD0xKSB3aGVuIHRyYW5zbWlzc2lvbiBvY2N1cnMgd2l0aCBubyBuZXcgZGF0YSBpbiBTUElfVERCUiAqLworI2RlZmluZQlUWFMJCTB4MDAwOAkvKiBTUElfVERCUiBEYXRhIEJ1ZmZlcglTdGF0dXMgKDA9RW1wdHksIDE9RnVsbCkgKi8KKyNkZWZpbmUJUkJTWQkweDAwMTAJLyogU2V0ICg9MSkgd2hlbiBkYXRhIGlzIHJlY2VpdmVkIHdpdGggUkRCUiBmdWxsICovCisjZGVmaW5lCVJYUwkJMHgwMDIwCS8qIFNQSV9SREJSIERhdGEgQnVmZmVyCVN0YXR1cyAoMD1FbXB0eSwgMT1GdWxsKSAgKi8KKyNkZWZpbmUJVFhDT0wJMHgwMDQwCS8qIFdoZW4Jc2V0ICg9MSksIGNvcnJ1cHQgZGF0YSBtYXkgaGF2ZQliZWVuIHRyYW5zbWl0dGVkICAqLworCisvKiBTUEl4X0ZMRyBNYXNrcwkJCQkJCQkJCQkgKi8KKyNkZWZpbmUJRkxHMUUJMHhGREZGCQkvKiBBY3RpdmF0ZXMgU1BJX0ZMT1VUMQkgKi8KKyNkZWZpbmUJRkxHMkUJMHhGQkZGCQkvKiBBY3RpdmF0ZXMgU1BJX0ZMT1VUMgkgKi8KKyNkZWZpbmUJRkxHM0UJMHhGN0ZGCQkvKiBBY3RpdmF0ZXMgU1BJX0ZMT1VUMwkgKi8KKyNkZWZpbmUJRkxHNEUJMHhFRkZGCQkvKiBBY3RpdmF0ZXMgU1BJX0ZMT1VUNAkgKi8KKyNkZWZpbmUJRkxHNUUJMHhERkZGCQkvKiBBY3RpdmF0ZXMgU1BJX0ZMT1VUNQkgKi8KKyNkZWZpbmUJRkxHNkUJMHhCRkZGCQkvKiBBY3RpdmF0ZXMgU1BJX0ZMT1VUNgkgKi8KKyNkZWZpbmUJRkxHN0UJMHg3RkZGCQkvKiBBY3RpdmF0ZXMgU1BJX0ZMT1VUNwkgKi8KKworCisvKiAqKioqKioqKioqKioqKioqKioqKiogIEFTWU5DSFJPTk9VUyBNRU1PUlkgQ09OVFJPTExFUiBNQVNLUwkqKioqKioqKioqKioqICovCisvKiBFQklVX0FNR0NUTCBNYXNrcyAqLworI2RlZmluZQlBTUNLRU4JCTB4MDAwMQkvKiBFbmFibGUgQ0xLT1VUICovCisjZGVmaW5lCUFNQkVOX05PTkUJMHgwMDAwCS8qIEFsbCBCYW5rcyBEaXNhYmxlZCAqLworI2RlZmluZQlBTUJFTl9CMAkweDAwMDIJLyogRW5hYmxlIEFzeW5jaHJvbm91cyBNZW1vcnkgQmFuayAwIG9ubHkgKi8KKyNkZWZpbmUJQU1CRU5fQjBfQjEJMHgwMDA0CS8qIEVuYWJsZSBBc3luY2hyb25vdXMgTWVtb3J5IEJhbmtzIDAgJgkxIG9ubHkgKi8KKyNkZWZpbmUJQU1CRU5fQjBfQjFfQjIJMHgwMDA2CS8qIEVuYWJsZSBBc3luY2hyb25vdXMgTWVtb3J5IEJhbmtzIDAsIDEsIGFuZCAyICovCisjZGVmaW5lCUFNQkVOX0FMTAkweDAwMDgJLyogRW5hYmxlIEFzeW5jaHJvbm91cyBNZW1vcnkgQmFua3MgKGFsbCkgMCwgMSwJMiwgYW5kIDMgKi8KKyNkZWZpbmUJQ0RQUklPCQkweDAxMDAJLyogRE1BIGhhcyBwcmlvcml0eSBvdmVyIGNvcmUgZm9yIGZvciBleHRlcm5hbCBhY2Nlc3NlcyAqLworCisvKiBFQklVX0FNR0NUTCBCaXQgUG9zaXRpb25zICovCisjZGVmaW5lCUFNQ0tFTl9QCQkweDAwMDAJLyogRW5hYmxlIENMS09VVCAqLworI2RlZmluZQlBTUJFTl9QMAkJMHgwMDAxCS8qIEFzeW5jaHJvbm91cwlNZW1vcnkgRW5hYmxlLCAwMDAgLSBiYW5rcyAwLTMgZGlzYWJsZWQsIDAwMSAtIEJhbmsgMCBlbmFibGVkICovCisjZGVmaW5lCUFNQkVOX1AxCQkweDAwMDIJLyogQXN5bmNocm9ub3VzCU1lbW9yeSBFbmFibGUsIDAxMCAtIGJhbmtzIDAmMSBlbmFibGVkLAkgMDExIC0gYmFua3MgMC0zIGVuYWJsZWQgKi8KKyNkZWZpbmUJQU1CRU5fUDIJCTB4MDAwMwkvKiBBc3luY2hyb25vdXMJTWVtb3J5IEVuYWJsZSwgMXh4IC0gQWxsIGJhbmtzIChiYW5rIDAsCTEsIDIsIGFuZCAzKSBlbmFibGVkICovCisKKy8qIEVCSVVfQU1CQ1RMMAlNYXNrcyAqLworI2RlZmluZQlCMFJEWUVOCQkJMHgwMDAwMDAwMSAgLyogQmFuayAwIFJEWSBFbmFibGUsIDA9ZGlzYWJsZSwgMT1lbmFibGUgKi8KKyNkZWZpbmUJQjBSRFlQT0wJCTB4MDAwMDAwMDIgIC8qIEJhbmsgMCBSRFkgQWN0aXZlIGhpZ2gsIDA9YWN0aXZlCWxvdywgMT1hY3RpdmUgaGlnaCAqLworI2RlZmluZQlCMFRUXzEJCQkweDAwMDAwMDA0ICAvKiBCYW5rIDAgVHJhbnNpdGlvbiBUaW1lIGZyb20gUmVhZAl0byBXcml0ZSA9IDEgY3ljbGUgKi8KKyNkZWZpbmUJQjBUVF8yCQkJMHgwMDAwMDAwOCAgLyogQmFuayAwIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSAyIGN5Y2xlcyAqLworI2RlZmluZQlCMFRUXzMJCQkweDAwMDAwMDBDICAvKiBCYW5rIDAgVHJhbnNpdGlvbiBUaW1lIGZyb20gUmVhZAl0byBXcml0ZSA9IDMgY3ljbGVzICovCisjZGVmaW5lCUIwVFRfNAkJCTB4MDAwMDAwMDAgIC8qIEJhbmsgMCBUcmFuc2l0aW9uIFRpbWUgZnJvbSBSZWFkCXRvIFdyaXRlID0gNCBjeWNsZXMgKi8KKyNkZWZpbmUJQjBTVF8xCQkJMHgwMDAwMDAxMCAgLyogQmFuayAwIFNldHVwIFRpbWUgZnJvbSBBT0UgYXNzZXJ0ZWQgdG8gUmVhZC9Xcml0ZSBhc3NlcnRlZD0xIGN5Y2xlICovCisjZGVmaW5lCUIwU1RfMgkJCTB4MDAwMDAwMjAgIC8qIEJhbmsgMCBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQvV3JpdGUgYXNzZXJ0ZWQ9MiBjeWNsZXMgKi8KKyNkZWZpbmUJQjBTVF8zCQkJMHgwMDAwMDAzMCAgLyogQmFuayAwIFNldHVwIFRpbWUgZnJvbSBBT0UgYXNzZXJ0ZWQgdG8gUmVhZC9Xcml0ZSBhc3NlcnRlZD0zIGN5Y2xlcyAqLworI2RlZmluZQlCMFNUXzQJCQkweDAwMDAwMDAwICAvKiBCYW5rIDAgU2V0dXAgVGltZSBmcm9tIEFPRSBhc3NlcnRlZCB0byBSZWFkL1dyaXRlIGFzc2VydGVkPTQgY3ljbGVzICovCisjZGVmaW5lCUIwSFRfMQkJCTB4MDAwMDAwNDAgIC8qIEJhbmsgMCBIb2xkIFRpbWUJZnJvbSBSZWFkL1dyaXRlCWRlYXNzZXJ0ZWQgdG8gQU9FIGRlYXNzZXJ0ZWQgPSAxIGN5Y2xlICovCisjZGVmaW5lCUIwSFRfMgkJCTB4MDAwMDAwODAgIC8qIEJhbmsgMCBIb2xkIFRpbWUJZnJvbSBSZWFkL1dyaXRlCWRlYXNzZXJ0ZWQgdG8gQU9FIGRlYXNzZXJ0ZWQgPSAyIGN5Y2xlcyAqLworI2RlZmluZQlCMEhUXzMJCQkweDAwMDAwMEMwICAvKiBCYW5rIDAgSG9sZCBUaW1lCWZyb20gUmVhZC9Xcml0ZQlkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkID0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjBIVF8wCQkJMHgwMDAwMDAwMCAgLyogQmFuayAwIEhvbGQgVGltZQlmcm9tIFJlYWQvV3JpdGUJZGVhc3NlcnRlZCB0byBBT0UgZGVhc3NlcnRlZCA9IDAgY3ljbGVzICovCisjZGVmaW5lCUIwUkFUXzEJCQkweDAwMDAwMTAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDEgY3ljbGUgKi8KKyNkZWZpbmUJQjBSQVRfMgkJCTB4MDAwMDAyMDAgIC8qIEJhbmsgMCBSZWFkIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjBSQVRfMwkJCTB4MDAwMDAzMDAgIC8qIEJhbmsgMCBSZWFkIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjBSQVRfNAkJCTB4MDAwMDA0MDAgIC8qIEJhbmsgMCBSZWFkIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMgKi8KKyNkZWZpbmUJQjBSQVRfNQkJCTB4MDAwMDA1MDAgIC8qIEJhbmsgMCBSZWFkIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMgKi8KKyNkZWZpbmUJQjBSQVRfNgkJCTB4MDAwMDA2MDAgIC8qIEJhbmsgMCBSZWFkIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMgKi8KKyNkZWZpbmUJQjBSQVRfNwkJCTB4MDAwMDA3MDAgIC8qIEJhbmsgMCBSZWFkIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMgKi8KKyNkZWZpbmUJQjBSQVRfOAkJCTB4MDAwMDA4MDAgIC8qIEJhbmsgMCBSZWFkIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMgKi8KKyNkZWZpbmUJQjBSQVRfOQkJCTB4MDAwMDA5MDAgIC8qIEJhbmsgMCBSZWFkIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMgKi8KKyNkZWZpbmUJQjBSQVRfMTAJCTB4MDAwMDBBMDAgIC8qIEJhbmsgMCBSZWFkIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzICovCisjZGVmaW5lCUIwUkFUXzExCQkweDAwMDAwQjAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcyAqLworI2RlZmluZQlCMFJBVF8xMgkJMHgwMDAwMEMwMCAgLyogQmFuayAwIFJlYWQgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjBSQVRfMTMJCTB4MDAwMDBEMDAgIC8qIEJhbmsgMCBSZWFkIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzICovCisjZGVmaW5lCUIwUkFUXzE0CQkweDAwMDAwRTAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcyAqLworI2RlZmluZQlCMFJBVF8xNQkJMHgwMDAwMEYwMCAgLyogQmFuayAwIFJlYWQgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMgKi8KKyNkZWZpbmUJQjBXQVRfMQkJCTB4MDAwMDEwMDAgIC8qIEJhbmsgMCBXcml0ZSBBY2Nlc3MgVGltZQk9IDEgY3ljbGUgKi8KKyNkZWZpbmUJQjBXQVRfMgkJCTB4MDAwMDIwMDAgIC8qIEJhbmsgMCBXcml0ZSBBY2Nlc3MgVGltZQk9IDIgY3ljbGVzICovCisjZGVmaW5lCUIwV0FUXzMJCQkweDAwMDAzMDAwICAvKiBCYW5rIDAgV3JpdGUgQWNjZXNzIFRpbWUJPSAzIGN5Y2xlcyAqLworI2RlZmluZQlCMFdBVF80CQkJMHgwMDAwNDAwMCAgLyogQmFuayAwIFdyaXRlIEFjY2VzcyBUaW1lCT0gNCBjeWNsZXMgKi8KKyNkZWZpbmUJQjBXQVRfNQkJCTB4MDAwMDUwMDAgIC8qIEJhbmsgMCBXcml0ZSBBY2Nlc3MgVGltZQk9IDUgY3ljbGVzICovCisjZGVmaW5lCUIwV0FUXzYJCQkweDAwMDA2MDAwICAvKiBCYW5rIDAgV3JpdGUgQWNjZXNzIFRpbWUJPSA2IGN5Y2xlcyAqLworI2RlZmluZQlCMFdBVF83CQkJMHgwMDAwNzAwMCAgLyogQmFuayAwIFdyaXRlIEFjY2VzcyBUaW1lCT0gNyBjeWNsZXMgKi8KKyNkZWZpbmUJQjBXQVRfOAkJCTB4MDAwMDgwMDAgIC8qIEJhbmsgMCBXcml0ZSBBY2Nlc3MgVGltZQk9IDggY3ljbGVzICovCisjZGVmaW5lCUIwV0FUXzkJCQkweDAwMDA5MDAwICAvKiBCYW5rIDAgV3JpdGUgQWNjZXNzIFRpbWUJPSA5IGN5Y2xlcyAqLworI2RlZmluZQlCMFdBVF8xMAkJMHgwMDAwQTAwMCAgLyogQmFuayAwIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTAgY3ljbGVzICovCisjZGVmaW5lCUIwV0FUXzExCQkweDAwMDBCMDAwICAvKiBCYW5rIDAgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMSBjeWNsZXMgKi8KKyNkZWZpbmUJQjBXQVRfMTIJCTB4MDAwMEMwMDAgIC8qIEJhbmsgMCBXcml0ZSBBY2Nlc3MgVGltZQk9IDEyIGN5Y2xlcyAqLworI2RlZmluZQlCMFdBVF8xMwkJMHgwMDAwRDAwMCAgLyogQmFuayAwIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTMgY3ljbGVzICovCisjZGVmaW5lCUIwV0FUXzE0CQkweDAwMDBFMDAwICAvKiBCYW5rIDAgV3JpdGUgQWNjZXNzIFRpbWUJPSAxNCBjeWNsZXMgKi8KKyNkZWZpbmUJQjBXQVRfMTUJCTB4MDAwMEYwMDAgIC8qIEJhbmsgMCBXcml0ZSBBY2Nlc3MgVGltZQk9IDE1IGN5Y2xlcyAqLworI2RlZmluZQlCMVJEWUVOCQkJMHgwMDAxMDAwMCAgLyogQmFuayAxIFJEWSBlbmFibGUsIDA9ZGlzYWJsZSwgMT1lbmFibGUgKi8KKyNkZWZpbmUJQjFSRFlQT0wJCTB4MDAwMjAwMDAgIC8qIEJhbmsgMSBSRFkgQWN0aXZlIGhpZ2gsIDA9YWN0aXZlCWxvdywgMT1hY3RpdmUgaGlnaCAqLworI2RlZmluZQlCMVRUXzEJCQkweDAwMDQwMDAwICAvKiBCYW5rIDEgVHJhbnNpdGlvbiBUaW1lIGZyb20gUmVhZAl0byBXcml0ZSA9IDEgY3ljbGUgKi8KKyNkZWZpbmUJQjFUVF8yCQkJMHgwMDA4MDAwMCAgLyogQmFuayAxIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSAyIGN5Y2xlcyAqLworI2RlZmluZQlCMVRUXzMJCQkweDAwMEMwMDAwICAvKiBCYW5rIDEgVHJhbnNpdGlvbiBUaW1lIGZyb20gUmVhZAl0byBXcml0ZSA9IDMgY3ljbGVzICovCisjZGVmaW5lCUIxVFRfNAkJCTB4MDAwMDAwMDAgIC8qIEJhbmsgMSBUcmFuc2l0aW9uIFRpbWUgZnJvbSBSZWFkCXRvIFdyaXRlID0gNCBjeWNsZXMgKi8KKyNkZWZpbmUJQjFTVF8xCQkJMHgwMDEwMDAwMCAgLyogQmFuayAxIFNldHVwIFRpbWUgZnJvbSBBT0UgYXNzZXJ0ZWQgdG8gUmVhZCBvciBXcml0ZSBhc3NlcnRlZCA9IDEgY3ljbGUgKi8KKyNkZWZpbmUJQjFTVF8yCQkJMHgwMDIwMDAwMCAgLyogQmFuayAxIFNldHVwIFRpbWUgZnJvbSBBT0UgYXNzZXJ0ZWQgdG8gUmVhZCBvciBXcml0ZSBhc3NlcnRlZCA9IDIgY3ljbGVzICovCisjZGVmaW5lCUIxU1RfMwkJCTB4MDAzMDAwMDAgIC8qIEJhbmsgMSBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQgb3IgV3JpdGUgYXNzZXJ0ZWQgPSAzIGN5Y2xlcyAqLworI2RlZmluZQlCMVNUXzQJCQkweDAwMDAwMDAwICAvKiBCYW5rIDEgU2V0dXAgVGltZSBmcm9tIEFPRSBhc3NlcnRlZCB0byBSZWFkIG9yIFdyaXRlIGFzc2VydGVkID0gNCBjeWNsZXMgKi8KKyNkZWZpbmUJQjFIVF8xCQkJMHgwMDQwMDAwMCAgLyogQmFuayAxIEhvbGQgVGltZQlmcm9tIFJlYWQgb3IgV3JpdGUgZGVhc3NlcnRlZCB0byBBT0UgZGVhc3NlcnRlZAk9IDEgY3ljbGUgKi8KKyNkZWZpbmUJQjFIVF8yCQkJMHgwMDgwMDAwMCAgLyogQmFuayAxIEhvbGQgVGltZQlmcm9tIFJlYWQgb3IgV3JpdGUgZGVhc3NlcnRlZCB0byBBT0UgZGVhc3NlcnRlZAk9IDIgY3ljbGVzICovCisjZGVmaW5lCUIxSFRfMwkJCTB4MDBDMDAwMDAgIC8qIEJhbmsgMSBIb2xkIFRpbWUJZnJvbSBSZWFkIG9yIFdyaXRlIGRlYXNzZXJ0ZWQgdG8gQU9FIGRlYXNzZXJ0ZWQJPSAzIGN5Y2xlcyAqLworI2RlZmluZQlCMUhUXzAJCQkweDAwMDAwMDAwICAvKiBCYW5rIDEgSG9sZCBUaW1lCWZyb20gUmVhZCBvciBXcml0ZSBkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkCT0gMCBjeWNsZXMgKi8KKyNkZWZpbmUJQjFSQVRfMQkJCTB4MDEwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gMSBjeWNsZSAqLworI2RlZmluZQlCMVJBVF8yCQkJMHgwMjAwMDAwMCAgLyogQmFuayAxIFJlYWQgQWNjZXNzIFRpbWUgPSAyIGN5Y2xlcyAqLworI2RlZmluZQlCMVJBVF8zCQkJMHgwMzAwMDAwMCAgLyogQmFuayAxIFJlYWQgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcyAqLworI2RlZmluZQlCMVJBVF80CQkJMHgwNDAwMDAwMCAgLyogQmFuayAxIFJlYWQgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcyAqLworI2RlZmluZQlCMVJBVF81CQkJMHgwNTAwMDAwMCAgLyogQmFuayAxIFJlYWQgQWNjZXNzIFRpbWUgPSA1IGN5Y2xlcyAqLworI2RlZmluZQlCMVJBVF82CQkJMHgwNjAwMDAwMCAgLyogQmFuayAxIFJlYWQgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcyAqLworI2RlZmluZQlCMVJBVF83CQkJMHgwNzAwMDAwMCAgLyogQmFuayAxIFJlYWQgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcyAqLworI2RlZmluZQlCMVJBVF84CQkJMHgwODAwMDAwMCAgLyogQmFuayAxIFJlYWQgQWNjZXNzIFRpbWUgPSA4IGN5Y2xlcyAqLworI2RlZmluZQlCMVJBVF85CQkJMHgwOTAwMDAwMCAgLyogQmFuayAxIFJlYWQgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcyAqLworI2RlZmluZQlCMVJBVF8xMAkJMHgwQTAwMDAwMCAgLyogQmFuayAxIFJlYWQgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMgKi8KKyNkZWZpbmUJQjFSQVRfMTEJCTB4MEIwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gMTEgY3ljbGVzICovCisjZGVmaW5lCUIxUkFUXzEyCQkweDBDMDAwMDAwICAvKiBCYW5rIDEgUmVhZCBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcyAqLworI2RlZmluZQlCMVJBVF8xMwkJMHgwRDAwMDAwMCAgLyogQmFuayAxIFJlYWQgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjFSQVRfMTQJCTB4MEUwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gMTQgY3ljbGVzICovCisjZGVmaW5lCUIxUkFUXzE1CQkweDBGMDAwMDAwICAvKiBCYW5rIDEgUmVhZCBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcyAqLworI2RlZmluZQlCMVdBVF8xCQkJMHgxMDAwMDAwMCAvKiBCYW5rIDEgV3JpdGUgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlICovCisjZGVmaW5lCUIxV0FUXzIJCQkweDIwMDAwMDAwICAvKiBCYW5rIDEgV3JpdGUgQWNjZXNzIFRpbWUJPSAyIGN5Y2xlcyAqLworI2RlZmluZQlCMVdBVF8zCQkJMHgzMDAwMDAwMCAgLyogQmFuayAxIFdyaXRlIEFjY2VzcyBUaW1lCT0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjFXQVRfNAkJCTB4NDAwMDAwMDAgIC8qIEJhbmsgMSBXcml0ZSBBY2Nlc3MgVGltZQk9IDQgY3ljbGVzICovCisjZGVmaW5lCUIxV0FUXzUJCQkweDUwMDAwMDAwICAvKiBCYW5rIDEgV3JpdGUgQWNjZXNzIFRpbWUJPSA1IGN5Y2xlcyAqLworI2RlZmluZQlCMVdBVF82CQkJMHg2MDAwMDAwMCAgLyogQmFuayAxIFdyaXRlIEFjY2VzcyBUaW1lCT0gNiBjeWNsZXMgKi8KKyNkZWZpbmUJQjFXQVRfNwkJCTB4NzAwMDAwMDAgIC8qIEJhbmsgMSBXcml0ZSBBY2Nlc3MgVGltZQk9IDcgY3ljbGVzICovCisjZGVmaW5lCUIxV0FUXzgJCQkweDgwMDAwMDAwICAvKiBCYW5rIDEgV3JpdGUgQWNjZXNzIFRpbWUJPSA4IGN5Y2xlcyAqLworI2RlZmluZQlCMVdBVF85CQkJMHg5MDAwMDAwMCAgLyogQmFuayAxIFdyaXRlIEFjY2VzcyBUaW1lCT0gOSBjeWNsZXMgKi8KKyNkZWZpbmUJQjFXQVRfMTAJCTB4QTAwMDAwMDAgIC8qIEJhbmsgMSBXcml0ZSBBY2Nlc3MgVGltZQk9IDEwIGN5Y2xlcyAqLworI2RlZmluZQlCMVdBVF8xMQkJMHhCMDAwMDAwMCAgLyogQmFuayAxIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTEgY3ljbGVzICovCisjZGVmaW5lCUIxV0FUXzEyCQkweEMwMDAwMDAwICAvKiBCYW5rIDEgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjFXQVRfMTMJCTB4RDAwMDAwMDAgIC8qIEJhbmsgMSBXcml0ZSBBY2Nlc3MgVGltZQk9IDEzIGN5Y2xlcyAqLworI2RlZmluZQlCMVdBVF8xNAkJMHhFMDAwMDAwMCAgLyogQmFuayAxIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTQgY3ljbGVzICovCisjZGVmaW5lCUIxV0FUXzE1CQkweEYwMDAwMDAwICAvKiBCYW5rIDEgV3JpdGUgQWNjZXNzIFRpbWUJPSAxNSBjeWNsZXMgKi8KKworLyogRUJJVV9BTUJDVEwxCU1hc2tzICovCisjZGVmaW5lCUIyUkRZRU4JCQkweDAwMDAwMDAxICAvKiBCYW5rIDIgUkRZIEVuYWJsZSwgMD1kaXNhYmxlLCAxPWVuYWJsZSAqLworI2RlZmluZQlCMlJEWVBPTAkJMHgwMDAwMDAwMiAgLyogQmFuayAyIFJEWSBBY3RpdmUgaGlnaCwgMD1hY3RpdmUJbG93LCAxPWFjdGl2ZSBoaWdoICovCisjZGVmaW5lCUIyVFRfMQkJCTB4MDAwMDAwMDQgIC8qIEJhbmsgMiBUcmFuc2l0aW9uIFRpbWUgZnJvbSBSZWFkCXRvIFdyaXRlID0gMSBjeWNsZSAqLworI2RlZmluZQlCMlRUXzIJCQkweDAwMDAwMDA4ICAvKiBCYW5rIDIgVHJhbnNpdGlvbiBUaW1lIGZyb20gUmVhZAl0byBXcml0ZSA9IDIgY3ljbGVzICovCisjZGVmaW5lCUIyVFRfMwkJCTB4MDAwMDAwMEMgIC8qIEJhbmsgMiBUcmFuc2l0aW9uIFRpbWUgZnJvbSBSZWFkCXRvIFdyaXRlID0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjJUVF80CQkJMHgwMDAwMDAwMCAgLyogQmFuayAyIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSA0IGN5Y2xlcyAqLworI2RlZmluZQlCMlNUXzEJCQkweDAwMDAwMDEwICAvKiBCYW5rIDIgU2V0dXAgVGltZSBmcm9tIEFPRSBhc3NlcnRlZCB0byBSZWFkIG9yIFdyaXRlIGFzc2VydGVkID0gMSBjeWNsZSAqLworI2RlZmluZQlCMlNUXzIJCQkweDAwMDAwMDIwICAvKiBCYW5rIDIgU2V0dXAgVGltZSBmcm9tIEFPRSBhc3NlcnRlZCB0byBSZWFkIG9yIFdyaXRlIGFzc2VydGVkID0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjJTVF8zCQkJMHgwMDAwMDAzMCAgLyogQmFuayAyIFNldHVwIFRpbWUgZnJvbSBBT0UgYXNzZXJ0ZWQgdG8gUmVhZCBvciBXcml0ZSBhc3NlcnRlZCA9IDMgY3ljbGVzICovCisjZGVmaW5lCUIyU1RfNAkJCTB4MDAwMDAwMDAgIC8qIEJhbmsgMiBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQgb3IgV3JpdGUgYXNzZXJ0ZWQgPSA0IGN5Y2xlcyAqLworI2RlZmluZQlCMkhUXzEJCQkweDAwMDAwMDQwICAvKiBCYW5rIDIgSG9sZCBUaW1lCWZyb20gUmVhZCBvciBXcml0ZSBkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkCT0gMSBjeWNsZSAqLworI2RlZmluZQlCMkhUXzIJCQkweDAwMDAwMDgwICAvKiBCYW5rIDIgSG9sZCBUaW1lCWZyb20gUmVhZCBvciBXcml0ZSBkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkCT0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjJIVF8zCQkJMHgwMDAwMDBDMCAgLyogQmFuayAyIEhvbGQgVGltZQlmcm9tIFJlYWQgb3IgV3JpdGUgZGVhc3NlcnRlZCB0byBBT0UgZGVhc3NlcnRlZAk9IDMgY3ljbGVzICovCisjZGVmaW5lCUIySFRfMAkJCTB4MDAwMDAwMDAgIC8qIEJhbmsgMiBIb2xkIFRpbWUJZnJvbSBSZWFkIG9yIFdyaXRlIGRlYXNzZXJ0ZWQgdG8gQU9FIGRlYXNzZXJ0ZWQJPSAwIGN5Y2xlcyAqLworI2RlZmluZQlCMlJBVF8xCQkJMHgwMDAwMDEwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlICovCisjZGVmaW5lCUIyUkFUXzIJCQkweDAwMDAwMjAwICAvKiBCYW5rIDIgUmVhZCBBY2Nlc3MgVGltZSA9IDIgY3ljbGVzICovCisjZGVmaW5lCUIyUkFUXzMJCQkweDAwMDAwMzAwICAvKiBCYW5rIDIgUmVhZCBBY2Nlc3MgVGltZSA9IDMgY3ljbGVzICovCisjZGVmaW5lCUIyUkFUXzQJCQkweDAwMDAwNDAwICAvKiBCYW5rIDIgUmVhZCBBY2Nlc3MgVGltZSA9IDQgY3ljbGVzICovCisjZGVmaW5lCUIyUkFUXzUJCQkweDAwMDAwNTAwICAvKiBCYW5rIDIgUmVhZCBBY2Nlc3MgVGltZSA9IDUgY3ljbGVzICovCisjZGVmaW5lCUIyUkFUXzYJCQkweDAwMDAwNjAwICAvKiBCYW5rIDIgUmVhZCBBY2Nlc3MgVGltZSA9IDYgY3ljbGVzICovCisjZGVmaW5lCUIyUkFUXzcJCQkweDAwMDAwNzAwICAvKiBCYW5rIDIgUmVhZCBBY2Nlc3MgVGltZSA9IDcgY3ljbGVzICovCisjZGVmaW5lCUIyUkFUXzgJCQkweDAwMDAwODAwICAvKiBCYW5rIDIgUmVhZCBBY2Nlc3MgVGltZSA9IDggY3ljbGVzICovCisjZGVmaW5lCUIyUkFUXzkJCQkweDAwMDAwOTAwICAvKiBCYW5rIDIgUmVhZCBBY2Nlc3MgVGltZSA9IDkgY3ljbGVzICovCisjZGVmaW5lCUIyUkFUXzEwCQkweDAwMDAwQTAwICAvKiBCYW5rIDIgUmVhZCBBY2Nlc3MgVGltZSA9IDEwIGN5Y2xlcyAqLworI2RlZmluZQlCMlJBVF8xMQkJMHgwMDAwMEIwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSAxMSBjeWNsZXMgKi8KKyNkZWZpbmUJQjJSQVRfMTIJCTB4MDAwMDBDMDAgIC8qIEJhbmsgMiBSZWFkIEFjY2VzcyBUaW1lID0gMTIgY3ljbGVzICovCisjZGVmaW5lCUIyUkFUXzEzCQkweDAwMDAwRDAwICAvKiBCYW5rIDIgUmVhZCBBY2Nlc3MgVGltZSA9IDEzIGN5Y2xlcyAqLworI2RlZmluZQlCMlJBVF8xNAkJMHgwMDAwMEUwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSAxNCBjeWNsZXMgKi8KKyNkZWZpbmUJQjJSQVRfMTUJCTB4MDAwMDBGMDAgIC8qIEJhbmsgMiBSZWFkIEFjY2VzcyBUaW1lID0gMTUgY3ljbGVzICovCisjZGVmaW5lCUIyV0FUXzEJCQkweDAwMDAxMDAwICAvKiBCYW5rIDIgV3JpdGUgQWNjZXNzIFRpbWUJPSAxIGN5Y2xlICovCisjZGVmaW5lCUIyV0FUXzIJCQkweDAwMDAyMDAwICAvKiBCYW5rIDIgV3JpdGUgQWNjZXNzIFRpbWUJPSAyIGN5Y2xlcyAqLworI2RlZmluZQlCMldBVF8zCQkJMHgwMDAwMzAwMCAgLyogQmFuayAyIFdyaXRlIEFjY2VzcyBUaW1lCT0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjJXQVRfNAkJCTB4MDAwMDQwMDAgIC8qIEJhbmsgMiBXcml0ZSBBY2Nlc3MgVGltZQk9IDQgY3ljbGVzICovCisjZGVmaW5lCUIyV0FUXzUJCQkweDAwMDA1MDAwICAvKiBCYW5rIDIgV3JpdGUgQWNjZXNzIFRpbWUJPSA1IGN5Y2xlcyAqLworI2RlZmluZQlCMldBVF82CQkJMHgwMDAwNjAwMCAgLyogQmFuayAyIFdyaXRlIEFjY2VzcyBUaW1lCT0gNiBjeWNsZXMgKi8KKyNkZWZpbmUJQjJXQVRfNwkJCTB4MDAwMDcwMDAgIC8qIEJhbmsgMiBXcml0ZSBBY2Nlc3MgVGltZQk9IDcgY3ljbGVzICovCisjZGVmaW5lCUIyV0FUXzgJCQkweDAwMDA4MDAwICAvKiBCYW5rIDIgV3JpdGUgQWNjZXNzIFRpbWUJPSA4IGN5Y2xlcyAqLworI2RlZmluZQlCMldBVF85CQkJMHgwMDAwOTAwMCAgLyogQmFuayAyIFdyaXRlIEFjY2VzcyBUaW1lCT0gOSBjeWNsZXMgKi8KKyNkZWZpbmUJQjJXQVRfMTAJCTB4MDAwMEEwMDAgIC8qIEJhbmsgMiBXcml0ZSBBY2Nlc3MgVGltZQk9IDEwIGN5Y2xlcyAqLworI2RlZmluZQlCMldBVF8xMQkJMHgwMDAwQjAwMCAgLyogQmFuayAyIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTEgY3ljbGVzICovCisjZGVmaW5lCUIyV0FUXzEyCQkweDAwMDBDMDAwICAvKiBCYW5rIDIgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjJXQVRfMTMJCTB4MDAwMEQwMDAgIC8qIEJhbmsgMiBXcml0ZSBBY2Nlc3MgVGltZQk9IDEzIGN5Y2xlcyAqLworI2RlZmluZQlCMldBVF8xNAkJMHgwMDAwRTAwMCAgLyogQmFuayAyIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTQgY3ljbGVzICovCisjZGVmaW5lCUIyV0FUXzE1CQkweDAwMDBGMDAwICAvKiBCYW5rIDIgV3JpdGUgQWNjZXNzIFRpbWUJPSAxNSBjeWNsZXMgKi8KKyNkZWZpbmUJQjNSRFlFTgkJCTB4MDAwMTAwMDAgIC8qIEJhbmsgMyBSRFkgZW5hYmxlLCAwPWRpc2FibGUsIDE9ZW5hYmxlICovCisjZGVmaW5lCUIzUkRZUE9MCQkweDAwMDIwMDAwICAvKiBCYW5rIDMgUkRZIEFjdGl2ZSBoaWdoLCAwPWFjdGl2ZQlsb3csIDE9YWN0aXZlIGhpZ2ggKi8KKyNkZWZpbmUJQjNUVF8xCQkJMHgwMDA0MDAwMCAgLyogQmFuayAzIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSAxIGN5Y2xlICovCisjZGVmaW5lCUIzVFRfMgkJCTB4MDAwODAwMDAgIC8qIEJhbmsgMyBUcmFuc2l0aW9uIFRpbWUgZnJvbSBSZWFkCXRvIFdyaXRlID0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjNUVF8zCQkJMHgwMDBDMDAwMCAgLyogQmFuayAzIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSAzIGN5Y2xlcyAqLworI2RlZmluZQlCM1RUXzQJCQkweDAwMDAwMDAwICAvKiBCYW5rIDMgVHJhbnNpdGlvbiBUaW1lIGZyb20gUmVhZAl0byBXcml0ZSA9IDQgY3ljbGVzICovCisjZGVmaW5lCUIzU1RfMQkJCTB4MDAxMDAwMDAgIC8qIEJhbmsgMyBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQgb3IgV3JpdGUgYXNzZXJ0ZWQgPSAxIGN5Y2xlICovCisjZGVmaW5lCUIzU1RfMgkJCTB4MDAyMDAwMDAgIC8qIEJhbmsgMyBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQgb3IgV3JpdGUgYXNzZXJ0ZWQgPSAyIGN5Y2xlcyAqLworI2RlZmluZQlCM1NUXzMJCQkweDAwMzAwMDAwICAvKiBCYW5rIDMgU2V0dXAgVGltZSBmcm9tIEFPRSBhc3NlcnRlZCB0byBSZWFkIG9yIFdyaXRlIGFzc2VydGVkID0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjNTVF80CQkJMHgwMDAwMDAwMCAgLyogQmFuayAzIFNldHVwIFRpbWUgZnJvbSBBT0UgYXNzZXJ0ZWQgdG8gUmVhZCBvciBXcml0ZSBhc3NlcnRlZCA9IDQgY3ljbGVzICovCisjZGVmaW5lCUIzSFRfMQkJCTB4MDA0MDAwMDAgIC8qIEJhbmsgMyBIb2xkIFRpbWUJZnJvbSBSZWFkIG9yIFdyaXRlIGRlYXNzZXJ0ZWQgdG8gQU9FIGRlYXNzZXJ0ZWQJPSAxIGN5Y2xlICovCisjZGVmaW5lCUIzSFRfMgkJCTB4MDA4MDAwMDAgIC8qIEJhbmsgMyBIb2xkIFRpbWUJZnJvbSBSZWFkIG9yIFdyaXRlIGRlYXNzZXJ0ZWQgdG8gQU9FIGRlYXNzZXJ0ZWQJPSAyIGN5Y2xlcyAqLworI2RlZmluZQlCM0hUXzMJCQkweDAwQzAwMDAwICAvKiBCYW5rIDMgSG9sZCBUaW1lCWZyb20gUmVhZCBvciBXcml0ZSBkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkCT0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjNIVF8wCQkJMHgwMDAwMDAwMCAgLyogQmFuayAzIEhvbGQgVGltZQlmcm9tIFJlYWQgb3IgV3JpdGUgZGVhc3NlcnRlZCB0byBBT0UgZGVhc3NlcnRlZAk9IDAgY3ljbGVzICovCisjZGVmaW5lCUIzUkFUXzEJCQkweDAxMDAwMDAwIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0JMSBjeWNsZSAqLworI2RlZmluZQlCM1JBVF8yCQkJMHgwMjAwMDAwMCAgLyogQmFuayAzIFJlYWQgQWNjZXNzIFRpbWUgPSAyIGN5Y2xlcyAqLworI2RlZmluZQlCM1JBVF8zCQkJMHgwMzAwMDAwMCAgLyogQmFuayAzIFJlYWQgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcyAqLworI2RlZmluZQlCM1JBVF80CQkJMHgwNDAwMDAwMCAgLyogQmFuayAzIFJlYWQgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcyAqLworI2RlZmluZQlCM1JBVF81CQkJMHgwNTAwMDAwMCAgLyogQmFuayAzIFJlYWQgQWNjZXNzIFRpbWUgPSA1IGN5Y2xlcyAqLworI2RlZmluZQlCM1JBVF82CQkJMHgwNjAwMDAwMCAgLyogQmFuayAzIFJlYWQgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcyAqLworI2RlZmluZQlCM1JBVF83CQkJMHgwNzAwMDAwMCAgLyogQmFuayAzIFJlYWQgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcyAqLworI2RlZmluZQlCM1JBVF84CQkJMHgwODAwMDAwMCAgLyogQmFuayAzIFJlYWQgQWNjZXNzIFRpbWUgPSA4IGN5Y2xlcyAqLworI2RlZmluZQlCM1JBVF85CQkJMHgwOTAwMDAwMCAgLyogQmFuayAzIFJlYWQgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcyAqLworI2RlZmluZQlCM1JBVF8xMAkJMHgwQTAwMDAwMCAgLyogQmFuayAzIFJlYWQgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMgKi8KKyNkZWZpbmUJQjNSQVRfMTEJCTB4MEIwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gMTEgY3ljbGVzICovCisjZGVmaW5lCUIzUkFUXzEyCQkweDBDMDAwMDAwICAvKiBCYW5rIDMgUmVhZCBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcyAqLworI2RlZmluZQlCM1JBVF8xMwkJMHgwRDAwMDAwMCAgLyogQmFuayAzIFJlYWQgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjNSQVRfMTQJCTB4MEUwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gMTQgY3ljbGVzICovCisjZGVmaW5lCUIzUkFUXzE1CQkweDBGMDAwMDAwICAvKiBCYW5rIDMgUmVhZCBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcyAqLworI2RlZmluZQlCM1dBVF8xCQkJMHgxMDAwMDAwMCAvKiBCYW5rIDMgV3JpdGUgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlICovCisjZGVmaW5lCUIzV0FUXzIJCQkweDIwMDAwMDAwICAvKiBCYW5rIDMgV3JpdGUgQWNjZXNzIFRpbWUJPSAyIGN5Y2xlcyAqLworI2RlZmluZQlCM1dBVF8zCQkJMHgzMDAwMDAwMCAgLyogQmFuayAzIFdyaXRlIEFjY2VzcyBUaW1lCT0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjNXQVRfNAkJCTB4NDAwMDAwMDAgIC8qIEJhbmsgMyBXcml0ZSBBY2Nlc3MgVGltZQk9IDQgY3ljbGVzICovCisjZGVmaW5lCUIzV0FUXzUJCQkweDUwMDAwMDAwICAvKiBCYW5rIDMgV3JpdGUgQWNjZXNzIFRpbWUJPSA1IGN5Y2xlcyAqLworI2RlZmluZQlCM1dBVF82CQkJMHg2MDAwMDAwMCAgLyogQmFuayAzIFdyaXRlIEFjY2VzcyBUaW1lCT0gNiBjeWNsZXMgKi8KKyNkZWZpbmUJQjNXQVRfNwkJCTB4NzAwMDAwMDAgIC8qIEJhbmsgMyBXcml0ZSBBY2Nlc3MgVGltZQk9IDcgY3ljbGVzICovCisjZGVmaW5lCUIzV0FUXzgJCQkweDgwMDAwMDAwICAvKiBCYW5rIDMgV3JpdGUgQWNjZXNzIFRpbWUJPSA4IGN5Y2xlcyAqLworI2RlZmluZQlCM1dBVF85CQkJMHg5MDAwMDAwMCAgLyogQmFuayAzIFdyaXRlIEFjY2VzcyBUaW1lCT0gOSBjeWNsZXMgKi8KKyNkZWZpbmUJQjNXQVRfMTAJCTB4QTAwMDAwMDAgIC8qIEJhbmsgMyBXcml0ZSBBY2Nlc3MgVGltZQk9IDEwIGN5Y2xlcyAqLworI2RlZmluZQlCM1dBVF8xMQkJMHhCMDAwMDAwMCAgLyogQmFuayAzIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTEgY3ljbGVzICovCisjZGVmaW5lCUIzV0FUXzEyCQkweEMwMDAwMDAwICAvKiBCYW5rIDMgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjNXQVRfMTMJCTB4RDAwMDAwMDAgIC8qIEJhbmsgMyBXcml0ZSBBY2Nlc3MgVGltZQk9IDEzIGN5Y2xlcyAqLworI2RlZmluZQlCM1dBVF8xNAkJMHhFMDAwMDAwMCAgLyogQmFuayAzIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTQgY3ljbGVzICovCisjZGVmaW5lCUIzV0FUXzE1CQkweEYwMDAwMDAwICAvKiBCYW5rIDMgV3JpdGUgQWNjZXNzIFRpbWUJPSAxNSBjeWNsZXMgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKiAgU0RSQU0gQ09OVFJPTExFUiBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiBFQklVX1NER0NUTCBNYXNrcyAqLworI2RlZmluZQlTQ1RMRQkJCTB4MDAwMDAwMDEgLyogRW5hYmxlIFNDTEtbMF0sIC9TUkFTLCAvU0NBUywgL1NXRSwgU0RRTVszOjBdICovCisjZGVmaW5lCUNMXzIJCQkweDAwMDAwMDA4IC8qIFNEUkFNIENBUwlsYXRlbmN5CT0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQ0xfMwkJCTB4MDAwMDAwMEMgLyogU0RSQU0gQ0FTCWxhdGVuY3kJPSAzIGN5Y2xlcyAqLworI2RlZmluZQlQRkUJCQkJMHgwMDAwMDAxMCAvKiBFbmFibGUgU0RSQU0gcHJlZmV0Y2ggKi8KKyNkZWZpbmUJUEZQCQkJCTB4MDAwMDAwMjAgLyogUHJlZmV0Y2ggaGFzIHByaW9yaXR5IG92ZXIgQU1DIHJlcXVlc3RzICovCisjZGVmaW5lCVBBU1JfQUxMCQkweDAwMDAwMDAwCS8qIEFsbCA0IFNEUkFNIEJhbmtzIFJlZnJlc2hlZCBJbiBTZWxmLVJlZnJlc2ggKi8KKyNkZWZpbmUJUEFTUl9CMF9CMQkJMHgwMDAwMDAxMAkvKiBTRFJBTSBCYW5rcyAwIGFuZCAxIEFyZSBSZWZyZXNoZWQgSW4JU2VsZi1SZWZyZXNoICovCisjZGVmaW5lCVBBU1JfQjAJCQkweDAwMDAwMDIwCS8qIE9ubHkJU0RSQU0gQmFuayAwIElzCVJlZnJlc2hlZCBJbiBTZWxmLVJlZnJlc2ggKi8KKyNkZWZpbmUJVFJBU18xCQkJMHgwMDAwMDA0MCAvKiBTRFJBTSB0UkFTID0gMSBjeWNsZSAqLworI2RlZmluZQlUUkFTXzIJCQkweDAwMDAwMDgwIC8qIFNEUkFNIHRSQVMgPSAyIGN5Y2xlcyAqLworI2RlZmluZQlUUkFTXzMJCQkweDAwMDAwMEMwIC8qIFNEUkFNIHRSQVMgPSAzIGN5Y2xlcyAqLworI2RlZmluZQlUUkFTXzQJCQkweDAwMDAwMTAwIC8qIFNEUkFNIHRSQVMgPSA0IGN5Y2xlcyAqLworI2RlZmluZQlUUkFTXzUJCQkweDAwMDAwMTQwIC8qIFNEUkFNIHRSQVMgPSA1IGN5Y2xlcyAqLworI2RlZmluZQlUUkFTXzYJCQkweDAwMDAwMTgwIC8qIFNEUkFNIHRSQVMgPSA2IGN5Y2xlcyAqLworI2RlZmluZQlUUkFTXzcJCQkweDAwMDAwMUMwIC8qIFNEUkFNIHRSQVMgPSA3IGN5Y2xlcyAqLworI2RlZmluZQlUUkFTXzgJCQkweDAwMDAwMjAwIC8qIFNEUkFNIHRSQVMgPSA4IGN5Y2xlcyAqLworI2RlZmluZQlUUkFTXzkJCQkweDAwMDAwMjQwIC8qIFNEUkFNIHRSQVMgPSA5IGN5Y2xlcyAqLworI2RlZmluZQlUUkFTXzEwCQkJMHgwMDAwMDI4MCAvKiBTRFJBTSB0UkFTID0gMTAgY3ljbGVzICovCisjZGVmaW5lCVRSQVNfMTEJCQkweDAwMDAwMkMwIC8qIFNEUkFNIHRSQVMgPSAxMSBjeWNsZXMgKi8KKyNkZWZpbmUJVFJBU18xMgkJCTB4MDAwMDAzMDAgLyogU0RSQU0gdFJBUyA9IDEyIGN5Y2xlcyAqLworI2RlZmluZQlUUkFTXzEzCQkJMHgwMDAwMDM0MCAvKiBTRFJBTSB0UkFTID0gMTMgY3ljbGVzICovCisjZGVmaW5lCVRSQVNfMTQJCQkweDAwMDAwMzgwIC8qIFNEUkFNIHRSQVMgPSAxNCBjeWNsZXMgKi8KKyNkZWZpbmUJVFJBU18xNQkJCTB4MDAwMDAzQzAgLyogU0RSQU0gdFJBUyA9IDE1IGN5Y2xlcyAqLworI2RlZmluZQlUUlBfMQkJCTB4MDAwMDA4MDAgLyogU0RSQU0gdFJQCT0gMSBjeWNsZSAqLworI2RlZmluZQlUUlBfMgkJCTB4MDAwMDEwMDAgLyogU0RSQU0gdFJQCT0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJVFJQXzMJCQkweDAwMDAxODAwIC8qIFNEUkFNIHRSUAk9IDMgY3ljbGVzICovCisjZGVmaW5lCVRSUF80CQkJMHgwMDAwMjAwMCAvKiBTRFJBTSB0UlAJPSA0IGN5Y2xlcyAqLworI2RlZmluZQlUUlBfNQkJCTB4MDAwMDI4MDAgLyogU0RSQU0gdFJQCT0gNSBjeWNsZXMgKi8KKyNkZWZpbmUJVFJQXzYJCQkweDAwMDAzMDAwIC8qIFNEUkFNIHRSUAk9IDYgY3ljbGVzICovCisjZGVmaW5lCVRSUF83CQkJMHgwMDAwMzgwMCAvKiBTRFJBTSB0UlAJPSA3IGN5Y2xlcyAqLworI2RlZmluZQlUUkNEXzEJCQkweDAwMDA4MDAwIC8qIFNEUkFNIHRSQ0QgPSAxIGN5Y2xlICovCisjZGVmaW5lCVRSQ0RfMgkJCTB4MDAwMTAwMDAgLyogU0RSQU0gdFJDRCA9IDIgY3ljbGVzICovCisjZGVmaW5lCVRSQ0RfMwkJCTB4MDAwMTgwMDAgLyogU0RSQU0gdFJDRCA9IDMgY3ljbGVzICovCisjZGVmaW5lCVRSQ0RfNAkJCTB4MDAwMjAwMDAgLyogU0RSQU0gdFJDRCA9IDQgY3ljbGVzICovCisjZGVmaW5lCVRSQ0RfNQkJCTB4MDAwMjgwMDAgLyogU0RSQU0gdFJDRCA9IDUgY3ljbGVzICovCisjZGVmaW5lCVRSQ0RfNgkJCTB4MDAwMzAwMDAgLyogU0RSQU0gdFJDRCA9IDYgY3ljbGVzICovCisjZGVmaW5lCVRSQ0RfNwkJCTB4MDAwMzgwMDAgLyogU0RSQU0gdFJDRCA9IDcgY3ljbGVzICovCisjZGVmaW5lCVRXUl8xCQkJMHgwMDA4MDAwMCAvKiBTRFJBTSB0V1IJPSAxIGN5Y2xlICovCisjZGVmaW5lCVRXUl8yCQkJMHgwMDEwMDAwMCAvKiBTRFJBTSB0V1IJPSAyIGN5Y2xlcyAqLworI2RlZmluZQlUV1JfMwkJCTB4MDAxODAwMDAgLyogU0RSQU0gdFdSCT0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJUFVQU0QJCQkweDAwMjAwMDAwIC8qUG93ZXItdXAgc3RhcnQgZGVsYXkgKi8KKyNkZWZpbmUJUFNNCQkJCTB4MDA0MDAwMDAgLyogU0RSQU0gcG93ZXItdXAgc2VxdWVuY2UgPQlQcmVjaGFyZ2UsIG1vZGUJcmVnaXN0ZXIgc2V0LCA4CUNCUiByZWZyZXNoIGN5Y2xlcyAqLworI2RlZmluZQlQU1MJCQkJMHgwMDgwMDAwMCAvKiBlbmFibGUgU0RSQU0gcG93ZXItdXAgc2VxdWVuY2Ugb24JbmV4dCBTRFJBTSBhY2Nlc3MgKi8KKyNkZWZpbmUJU1JGUwkJCTB4MDEwMDAwMDAgLyogU3RhcnQgU0RSQU0gc2VsZi1yZWZyZXNoIG1vZGUgKi8KKyNkZWZpbmUJRUJVRkUJCQkweDAyMDAwMDAwIC8qIEVuYWJsZSBleHRlcm5hbCBidWZmZXJpbmcJdGltaW5nICovCisjZGVmaW5lCUZCQlJXCQkJMHgwNDAwMDAwMCAvKiBGYXN0IGJhY2stdG8tYmFjawlyZWFkIHdyaXRlIGVuYWJsZSAqLworI2RlZmluZQlFTVJFTgkJCTB4MTAwMDAwMDAgLyogRXh0ZW5kZWQgbW9kZSByZWdpc3RlciBlbmFibGUgKi8KKyNkZWZpbmUJVENTUgkJCTB4MjAwMDAwMDAgLyogVGVtcCBjb21wZW5zYXRlZCBzZWxmIHJlZnJlc2ggdmFsdWUgODUgZGVnIEMgKi8KKyNkZWZpbmUJQ0REQkcJCQkweDQwMDAwMDAwIC8qIFRyaXN0YXRlIFNEUkFNIGNvbnRyb2xzIGR1cmluZyBidXMgZ3JhbnQgKi8KKworLyogRUJJVV9TREJDVEwgTWFza3MgKi8KKyNkZWZpbmUJRUJFCQkJCTB4MDAwMDAwMDEgLyogRW5hYmxlIFNEUkFNIGV4dGVybmFsIGJhbmsgKi8KKyNkZWZpbmUJRUJTWl8xNgkJCTB4MDAwMDAwMDAgLyogU0RSQU0gZXh0ZXJuYWwgYmFuayBzaXplID0gMTZNQiAqLworI2RlZmluZQlFQlNaXzMyCQkJMHgwMDAwMDAwMiAvKiBTRFJBTSBleHRlcm5hbCBiYW5rIHNpemUgPSAzMk1CICovCisjZGVmaW5lCUVCU1pfNjQJCQkweDAwMDAwMDA0IC8qIFNEUkFNIGV4dGVybmFsIGJhbmsgc2l6ZSA9IDY0TUIgKi8KKyNkZWZpbmUJRUJTWl8xMjgJCTB4MDAwMDAwMDYgLyogU0RSQU0gZXh0ZXJuYWwgYmFuayBzaXplID0gMTI4TUIgKi8KKyNkZWZpbmUJRUJTWl8yNTYJCTB4MDAwMDAwMDggLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBTaXplID0gMjU2TUIgKi8KKyNkZWZpbmUJRUJTWl81MTIJCTB4MDAwMDAwMEEgLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBTaXplID0gNTEyTUIgKi8KKyNkZWZpbmUJRUJDQVdfOAkJCTB4MDAwMDAwMDAgLyogU0RSQU0gZXh0ZXJuYWwgYmFuayBjb2x1bW4gYWRkcmVzcyB3aWR0aCA9IDggYml0cyAqLworI2RlZmluZQlFQkNBV185CQkJMHgwMDAwMDAxMCAvKiBTRFJBTSBleHRlcm5hbCBiYW5rIGNvbHVtbiBhZGRyZXNzIHdpZHRoID0gOSBiaXRzICovCisjZGVmaW5lCUVCQ0FXXzEwCQkweDAwMDAwMDIwIC8qIFNEUkFNIGV4dGVybmFsIGJhbmsgY29sdW1uIGFkZHJlc3Mgd2lkdGggPSA5IGJpdHMgKi8KKyNkZWZpbmUJRUJDQVdfMTEJCTB4MDAwMDAwMzAgLyogU0RSQU0gZXh0ZXJuYWwgYmFuayBjb2x1bW4gYWRkcmVzcyB3aWR0aCA9IDkgYml0cyAqLworCisvKiBFQklVX1NEU1RBVCBNYXNrcyAqLworI2RlZmluZQlTRENJCQkJMHgwMDAwMDAwMSAvKiBTRFJBTSBjb250cm9sbGVyIGlzIGlkbGUgKi8KKyNkZWZpbmUJU0RTUkEJCQkweDAwMDAwMDAyIC8qIFNEUkFNIFNEUkFNIHNlbGYgcmVmcmVzaCBpcyBhY3RpdmUgKi8KKyNkZWZpbmUJU0RQVUEJCQkweDAwMDAwMDA0IC8qIFNEUkFNIHBvd2VyIHVwIGFjdGl2ZSAgKi8KKyNkZWZpbmUJU0RSUwkJCTB4MDAwMDAwMDggLyogU0RSQU0gaXMgaW4gcmVzZXQJc3RhdGUgKi8KKyNkZWZpbmUJU0RFQVNFCQkJMHgwMDAwMDAxMCAvKiBTRFJBTSBFQUIJc3RpY2t5IGVycm9yIHN0YXR1cyAtIFcxQyAqLworI2RlZmluZQlCR1NUQVQJCQkweDAwMDAwMDIwIC8qIEJ1cyBncmFudGVkICovCisKKworLyogICoqKioqKioqKioqKioqKioqKioqICBUV08tV0lSRSBJTlRFUkZBQ0UgKFRXSXgpIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRXSXhfQ0xLRElWIE1hY3JvcyAoVXNlOiAqcFRXSXhfQ0xLRElWID0gQ0xLTE9XKHgpfENMS0hJKHkpOwkgKSAqLworI2lmZGVmIF9NSVNSQV9SVUxFUworI2RlZmluZQlDTEtMT1coeCkJKCh4KSAmIDB4RkZ1KQkJLyogUGVyaW9kcyBDbG9jayBJcyBIZWxkIExvdyAqLworI2RlZmluZQlDTEtISSh5KQkoKCh5KSYweEZGdSk8PDB4OCkJLyogUGVyaW9kcyBCZWZvcmUgTmV3IENsb2NrIExvdyAqLworI2Vsc2UKKyNkZWZpbmUJQ0xLTE9XKHgpCSgoeCkgJiAweEZGKQkJLyogUGVyaW9kcyBDbG9jayBJcyBIZWxkIExvdyAqLworI2RlZmluZQlDTEtISSh5KQkoKCh5KSYweEZGKTw8MHg4KQkvKiBQZXJpb2RzIEJlZm9yZSBOZXcgQ2xvY2sgTG93ICovCisjZW5kaWYgLyogX01JU1JBX1JVTEVTICovCisKKy8qIFRXSXhfUFJFU0NBTEUgTWFza3MJCQkJCQkJCSAqLworI2RlZmluZQlQUkVTQ0FMRQkweDAwN0YJCS8qIFNDTEtzIFBlciBJbnRlcm5hbCBUaW1lIFJlZmVyZW5jZSAoMTBNSHopICovCisjZGVmaW5lCVRXSV9FTkEJCTB4MDA4MAkJLyogVFdJIEVuYWJsZQkJICovCisjZGVmaW5lCVNDQ0IJCTB4MDIwMAkJLyogU0NDQglDb21wYXRpYmlsaXR5IEVuYWJsZSAqLworCisvKiBUV0l4X1NMQVZFX0NUUkwgTWFza3MJCQkJCQkJCSAqLworI2RlZmluZQlTRU4JCQkweDAwMDEJCS8qIFNsYXZlIEVuYWJsZQkJICovCisjZGVmaW5lCVNBRERfTEVOCTB4MDAwMgkJLyogU2xhdmUgQWRkcmVzcyBMZW5ndGggKi8KKyNkZWZpbmUJU1REVkFMCQkweDAwMDQJCS8qIFNsYXZlIFRyYW5zbWl0IERhdGEgVmFsaWQgKi8KKyNkZWZpbmUJTkFLCQkJMHgwMDA4CQkvKiBOQUsvQUNLKiBHZW5lcmF0ZWQgQXQgQ29uY2x1c2lvbiBPZiBUcmFuc2ZlciAqLworI2RlZmluZQlHRU4JCQkweDAwMTAJCS8qIEdlbmVyYWwgQ2FsbAlBZHJyZXNzCU1hdGNoaW5nIEVuYWJsZWQgKi8KKworLyogVFdJeF9TTEFWRV9TVEFUIE1hc2tzCQkJCQkJCQkgKi8KKyNkZWZpbmUJU0RJUgkJMHgwMDAxCQkvKiBTbGF2ZSBUcmFuc2ZlciBEaXJlY3Rpb24gKFRyYW5zbWl0L1JlY2VpdmUqKSAqLworI2RlZmluZQlHQ0FMTAkJMHgwMDAyCQkvKiBHZW5lcmFsIENhbGwJSW5kaWNhdG9yICovCisKKy8qIFRXSXhfTUFTVEVSX0NUUkwgTWFza3MJCQkJCQkgKi8KKyNkZWZpbmUJTUVOCQkJMHgwMDAxCQkvKiBNYXN0ZXIgTW9kZSBFbmFibGUgKi8KKyNkZWZpbmUJTUFERF9MRU4JMHgwMDAyCQkvKiBNYXN0ZXIgQWRkcmVzcyBMZW5ndGggKi8KKyNkZWZpbmUJTURJUgkJMHgwMDA0CQkvKiBNYXN0ZXIgVHJhbnNtaXQgRGlyZWN0aW9uIChSWC9UWCopICovCisjZGVmaW5lCUZBU1QJCTB4MDAwOAkJLyogVXNlIEZhc3QgTW9kZSBUaW1pbmcJU3BlY3MgKi8KKyNkZWZpbmUJU1RPUAkJMHgwMDEwCQkvKiBJc3N1ZSBTdG9wIENvbmRpdGlvbiAqLworI2RlZmluZQlSU1RBUlQJCTB4MDAyMAkJLyogUmVwZWF0IFN0YXJ0CW9yIFN0b3AqIEF0IEVuZAlPZiBUcmFuc2ZlciAqLworI2RlZmluZQlEQ05UCQkweDNGQzAJCS8qIERhdGEJQnl0ZXMgVG8gVHJhbnNmZXIgKi8KKyNkZWZpbmUJU0RBT1ZSCQkweDQwMDAJCS8qIFNlcmlhbCBEYXRhIE92ZXJyaWRlICovCisjZGVmaW5lCVNDTE9WUgkJMHg4MDAwCQkvKiBTZXJpYWwgQ2xvY2sJT3ZlcnJpZGUgKi8KKworLyogVFdJeF9NQVNURVJfU1RBVCBNYXNrcwkJCQkJCQkgKi8KKyNkZWZpbmUJTVBST0cJCTB4MDAwMQkJLyogTWFzdGVyIFRyYW5zZmVyIEluIFByb2dyZXNzICovCisjZGVmaW5lCUxPU1RBUkIJCTB4MDAwMgkJLyogTG9zdAlBcmJpdHJhdGlvbiBJbmRpY2F0b3IgKFhmZXIgQWJvcnRlZCkgKi8KKyNkZWZpbmUJQU5BSwkJMHgwMDA0CQkvKiBBZGRyZXNzIE5vdCBBY2tub3dsZWRnZWQgKi8KKyNkZWZpbmUJRE5BSwkJMHgwMDA4CQkvKiBEYXRhCU5vdCBBY2tub3dsZWRnZWQgKi8KKyNkZWZpbmUJQlVGUkRFUlIJMHgwMDEwCQkvKiBCdWZmZXIgUmVhZCBFcnJvciAqLworI2RlZmluZQlCVUZXUkVSUgkweDAwMjAJCS8qIEJ1ZmZlciBXcml0ZQlFcnJvciAqLworI2RlZmluZQlTREFTRU4JCTB4MDA0MAkJLyogU2VyaWFsIERhdGEgU2Vuc2UgKi8KKyNkZWZpbmUJU0NMU0VOCQkweDAwODAJCS8qIFNlcmlhbCBDbG9jawlTZW5zZSAqLworI2RlZmluZQlCVVNCVVNZCQkweDAxMDAJCS8qIEJ1cyBCdXN5IEluZGljYXRvciAqLworCisvKiBUV0l4X0lOVF9TUkMJYW5kIFRXSXhfSU5UX0VOQUJMRSBNYXNrcyAqLworI2RlZmluZQlTSU5JVAkJMHgwMDAxCQkvKiBTbGF2ZSBUcmFuc2ZlciBJbml0aWF0ZWQgKi8KKyNkZWZpbmUJU0NPTVAJCTB4MDAwMgkJLyogU2xhdmUgVHJhbnNmZXIgQ29tcGxldGUgKi8KKyNkZWZpbmUJU0VSUgkJMHgwMDA0CQkvKiBTbGF2ZSBUcmFuc2ZlciBFcnJvciAqLworI2RlZmluZQlTT1ZGCQkweDAwMDgJCS8qIFNsYXZlIE92ZXJmbG93ICovCisjZGVmaW5lCU1DT01QCQkweDAwMTAJCS8qIE1hc3RlciBUcmFuc2ZlciBDb21wbGV0ZSAqLworI2RlZmluZQlNRVJSCQkweDAwMjAJCS8qIE1hc3RlciBUcmFuc2ZlciBFcnJvciAqLworI2RlZmluZQlYTVRTRVJWCQkweDAwNDAJCS8qIFRyYW5zbWl0IEZJRk8gU2VydmljZSAqLworI2RlZmluZQlSQ1ZTRVJWCQkweDAwODAJCS8qIFJlY2VpdmUgRklGTwlTZXJ2aWNlICovCisKKy8qIFRXSXhfRklGT19DVFJMIE1hc2tzCQkJCQkgKi8KKyNkZWZpbmUJWE1URkxVU0gJMHgwMDAxCQkvKiBUcmFuc21pdCBCdWZmZXIgRmx1c2ggKi8KKyNkZWZpbmUJUkNWRkxVU0gJMHgwMDAyCQkvKiBSZWNlaXZlIEJ1ZmZlciBGbHVzaCAqLworI2RlZmluZQlYTVRJTlRMRU4JMHgwMDA0CQkvKiBUcmFuc21pdCBCdWZmZXIgSW50ZXJydXB0IExlbmd0aCAqLworI2RlZmluZQlSQ1ZJTlRMRU4JMHgwMDA4CQkvKiBSZWNlaXZlIEJ1ZmZlciBJbnRlcnJ1cHQgTGVuZ3RoICovCisKKy8qIFRXSXhfRklGT19TVEFUIE1hc2tzCQkJCQkJCQkgKi8KKyNkZWZpbmUJWE1UU1RBVAkJMHgwMDAzCQkvKiBUcmFuc21pdCBGSUZPIFN0YXR1cyAqLworI2RlZmluZQlYTVRfRU1QVFkJMHgwMDAwCQkvKgkJVHJhbnNtaXQgRklGTyBFbXB0eSAqLworI2RlZmluZQlYTVRfSEFMRgkweDAwMDEJCS8qCQlUcmFuc21pdCBGSUZPIEhhcyAxIEJ5dGUgVG8gV3JpdGUgKi8KKyNkZWZpbmUJWE1UX0ZVTEwJMHgwMDAzCQkvKgkJVHJhbnNtaXQgRklGTyBGdWxsICgyIEJ5dGVzIFRvIFdyaXRlKSAqLworCisjZGVmaW5lCVJDVlNUQVQJCTB4MDAwQwkJLyogUmVjZWl2ZSBGSUZPCVN0YXR1cyAqLworI2RlZmluZQlSQ1ZfRU1QVFkJMHgwMDAwCQkvKgkJUmVjZWl2ZQlGSUZPIEVtcHR5ICovCisjZGVmaW5lCVJDVl9IQUxGCTB4MDAwNAkJLyoJCVJlY2VpdmUJRklGTyBIYXMgMSBCeXRlCVRvIFJlYWQgKi8KKyNkZWZpbmUJUkNWX0ZVTEwJMHgwMDBDCQkvKgkJUmVjZWl2ZQlGSUZPIEZ1bGwgKDIgQnl0ZXMgVG8gUmVhZCkgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1YVlIJTUFTS1MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTVhWUl9DT05GSUcgTWFza3MgKi8KKworI2RlZmluZQlNWFZSRU4JICAweDAwMDAwMDAxbHUKKyNkZWZpbmUJTU1TTQkgIDB4MDAwMDAwMDJsdQorI2RlZmluZQlBQ1RJVkUJICAweDAwMDAwMDA0bHUKKyNkZWZpbmUJU0RFTEFZCSAgMHgwMDAwMDAwOGx1CisjZGVmaW5lCU5DTVJYRU4JICAweDAwMDAwMDEwbHUKKyNkZWZpbmUJUldSUlhFTgkgIDB4MDAwMDAwMjBsdQorI2RlZmluZQlNVFhFTgkgIDB4MDAwMDAwNDBsdQorI2RlZmluZQlNVFhPTgkgIDB4MDAwMDAwODBsdSAvKmxlZ2FjeSovCisjZGVmaW5lCU1UWE9OQgkgIDB4MDAwMDAwODBsdQorI2RlZmluZQlFUEFSSVRZCSAgMHgwMDAwMDEwMGx1CisjZGVmaW5lCU1TQgkgIDB4MDAwMDFFMDBsdQorI2RlZmluZQlBUFJYRU4JICAweDAwMDAyMDAwbHUKKyNkZWZpbmUJV0FLRVVQCSAgMHgwMDAwNDAwMGx1CisjZGVmaW5lCUxNRUNICSAgMHgwMDAwODAwMGx1CisKKyNpZmRlZiBfTUlTUkFfUlVMRVMKKyNkZWZpbmUJU0VUX01TQih4KSAgICAgKCgoeCkmMHhGdSkgPDwgMHg5KQorI2Vsc2UKKyNkZWZpbmUJU0VUX01TQih4KSAgICAgKCgoeCkmMHhGKSA8PCAweDkpCisjZW5kaWYgLyogX01JU1JBX1JVTEVTICovCisKKworLyogTVhWUl9QTExfQ1RMXzAgTWFza3MgKi8KKworI2RlZmluZQlNWFRBTENFTiAgMHgwMDAwMDAwMWx1CisjZGVmaW5lCU1YVEFMRkVOICAweDAwMDAwMDAybHUKKyNkZWZpbmUJTVBMTE1TCSAgMHgwMDAwMDAwOGx1CisjZGVmaW5lCU1YVEFMTVVMICAweDAwMDAwMDMwbHUKKyNkZWZpbmUJTVBMTEVOCSAgMHgwMDAwMDA0MGx1CisjZGVmaW5lCU1QTExFTjAJICAweDAwMDAwMDQwbHUgLyogbGVnYWN5ICovCisjZGVmaW5lCU1QTExFTjEJICAweDAwMDAwMDgwbHUgLyogbGVnYWN5ICovCisjZGVmaW5lCU1NQ0xLRU4JICAweDAwMDAwMTAwbHUKKyNkZWZpbmUJTU1DTEtNVUwgIDB4MDAwMDFFMDBsdQorI2RlZmluZQlNUExMUlNUQiAgMHgwMDAwMjAwMGx1CisjZGVmaW5lCU1QTExSU1RCMCAweDAwMDAyMDAwbHUgLyogbGVnYWN5ICovCisjZGVmaW5lCU1QTExSU1RCMSAweDAwMDA0MDAwbHUgLyogbGVnYWN5ICovCisjZGVmaW5lCU1CQ0xLRU4JICAweDAwMDEwMDAwbHUKKyNkZWZpbmUJTUJDTEtESVYgIDB4MDAxRTAwMDBsdQorI2RlZmluZQlNUExMQ0RSCSAgMHgwMDIwMDAwMGx1CisjZGVmaW5lCU1QTExDRFIwICAweDAwMjAwMDAwbHUgLyogbGVnYWN5ICovCisjZGVmaW5lCU1QTExDRFIxICAweDAwNDAwMDAwbHUgLyogbGVnYWN5ICovCisjZGVmaW5lCUlOVlJYCSAgMHgwMDgwMDAwMGx1CisjZGVmaW5lCU1GU0VOCSAgMHgwMTAwMDAwMGx1CisjZGVmaW5lCU1GU0RJVgkgIDB4MUUwMDAwMDBsdQorI2RlZmluZQlNRlNTRUwJICAweDYwMDAwMDAwbHUKKyNkZWZpbmUJTUZTU1lOQwkgIDB4ODAwMDAwMDBsdQorCisjZGVmaW5lCU1YVEFMTVVMXzI1NkZTCSAweDAwMDAwMDAwbHUgLyogbGVnYWN5ICovCisjZGVmaW5lCU1YVEFMTVVMXzM4NEZTCSAweDAwMDAwMDEwbHUgLyogbGVnYWN5ICovCisjZGVmaW5lCU1YVEFMTVVMXzUxMkZTCSAweDAwMDAwMDIwbHUgLyogbGVnYWN5ICovCisjZGVmaW5lCU1YVEFMTVVMXzEwMjRGUwkgMHgwMDAwMDAzMGx1CisKKyNkZWZpbmUJTU1DTEtNVUxfMTAyNEZTCSAweDAwMDAwMDAwbHUKKyNkZWZpbmUJTU1DTEtNVUxfNTEyRlMJIDB4MDAwMDAyMDBsdQorI2RlZmluZQlNTUNMS01VTF8yNTZGUwkgMHgwMDAwMDQwMGx1CisjZGVmaW5lCU1NQ0xLTVVMXzEyOEZTCSAweDAwMDAwNjAwbHUKKyNkZWZpbmUJTU1DTEtNVUxfNjRGUwkgMHgwMDAwMDgwMGx1CisjZGVmaW5lCU1NQ0xLTVVMXzMyRlMJIDB4MDAwMDBBMDBsdQorI2RlZmluZQlNTUNMS01VTF8xNkZTCSAweDAwMDAwQzAwbHUKKyNkZWZpbmUJTU1DTEtNVUxfOEZTCSAweDAwMDAwRTAwbHUKKyNkZWZpbmUJTU1DTEtNVUxfNEZTCSAweDAwMDAxMDAwbHUKKyNkZWZpbmUJTU1DTEtNVUxfMkZTCSAweDAwMDAxMjAwbHUKKyNkZWZpbmUJTU1DTEtNVUxfMUZTCSAweDAwMDAxNDAwbHUKKyNkZWZpbmUJTU1DTEtNVUxfMTUzNkZTCSAweDAwMDAxQTAwbHUKKyNkZWZpbmUJTU1DTEtNVUxfNzY4RlMJIDB4MDAwMDFDMDBsdQorI2RlZmluZQlNTUNMS01VTF8zODRGUwkgMHgwMDAwMUUwMGx1CisKKyNkZWZpbmUJTUJDTEtESVZfRElWMgkgMHgwMDAyMDAwMGx1CisjZGVmaW5lCU1CQ0xLRElWX0RJVjQJIDB4MDAwNDAwMDBsdQorI2RlZmluZQlNQkNMS0RJVl9ESVY4CSAweDAwMDYwMDAwbHUKKyNkZWZpbmUJTUJDTEtESVZfRElWMTYJIDB4MDAwODAwMDBsdQorI2RlZmluZQlNQkNMS0RJVl9ESVYzMgkgMHgwMDBBMDAwMGx1CisjZGVmaW5lCU1CQ0xLRElWX0RJVjY0CSAweDAwMEMwMDAwbHUKKyNkZWZpbmUJTUJDTEtESVZfRElWMTI4CSAweDAwMEUwMDAwbHUKKyNkZWZpbmUJTUJDTEtESVZfRElWMjU2CSAweDAwMTAwMDAwbHUKKyNkZWZpbmUJTUJDTEtESVZfRElWNTEyCSAweDAwMTIwMDAwbHUKKyNkZWZpbmUJTUJDTEtESVZfRElWMTAyNCAweDAwMTQwMDAwbHUKKworI2RlZmluZQlNRlNESVZfRElWMgkgMHgwMjAwMDAwMGx1CisjZGVmaW5lCU1GU0RJVl9ESVY0CSAweDA0MDAwMDAwbHUKKyNkZWZpbmUJTUZTRElWX0RJVjgJIDB4MDYwMDAwMDBsdQorI2RlZmluZQlNRlNESVZfRElWMTYJIDB4MDgwMDAwMDBsdQorI2RlZmluZQlNRlNESVZfRElWMzIJIDB4MEEwMDAwMDBsdQorI2RlZmluZQlNRlNESVZfRElWNjQJIDB4MEMwMDAwMDBsdQorI2RlZmluZQlNRlNESVZfRElWMTI4CSAweDBFMDAwMDAwbHUKKyNkZWZpbmUJTUZTRElWX0RJVjI1NgkgMHgxMDAwMDAwMGx1CisjZGVmaW5lCU1GU0RJVl9ESVY1MTIJIDB4MTIwMDAwMDBsdQorI2RlZmluZQlNRlNESVZfRElWMTAyNAkgMHgxNDAwMDAwMGx1CisKKyNkZWZpbmUJTUZTU0VMX0NMT0NLCSAweDAwMDAwMDAwbHUKKyNkZWZpbmUJTUZTU0VMX1BVTFNFX0hJCSAweDIwMDAwMDAwbHUKKyNkZWZpbmUJTUZTU0VMX1BVTFNFX0xPCSAweDQwMDAwMDAwbHUKKworCisvKiBNWFZSX1BMTF9DVExfMSBNYXNrcyAqLworCisjZGVmaW5lCU1TVE8JICAgMHgwMDAwMDAwMWx1CisjZGVmaW5lCU1TVE8wCSAgIDB4MDAwMDAwMDFsdQkvKiBsZWdhY3kgKi8KKyNkZWZpbmUJTUhPR0dECSAgIDB4MDAwMDAwMDRsdQorI2RlZmluZQlNSE9HR0QwCSAgIDB4MDAwMDAwMDRsdQkvKiBsZWdhY3kgKi8KKyNkZWZpbmUJTUhPR0dEMQkgICAweDAwMDAwMDA4bHUJLyogbGVnYWN5ICovCisjZGVmaW5lCU1TSEFQRVJFTiAgMHgwMDAwMDAxMGx1CisjZGVmaW5lCU1TSEFQRVJFTjAgMHgwMDAwMDAxMGx1CS8qIGxlZ2FjeSAqLworI2RlZmluZQlNU0hBUEVSRU4xIDB4MDAwMDAwMjBsdQkvKiBsZWdhY3kgKi8KKyNkZWZpbmUJTVBMTENOVEVOICAweDAwMDA4MDAwbHUKKyNkZWZpbmUJTVBMTENOVAkgICAweEZGRkYwMDAwbHUKKworI2lmZGVmIF9NSVNSQV9SVUxFUworI2RlZmluZQlTRVRfTVBMTENOVCh4KQkgICAoKCh4KSYweEZGRkZ1KSA8PCAweDEwKQorI2Vsc2UKKyNkZWZpbmUJU0VUX01QTExDTlQoeCkJICAgKCgoeCkmMHhGRkZGKSA8PCAweDEwKQorI2VuZGlmIC8qIF9NSVNSQV9SVUxFUyAqLworCisKKy8qIE1YVlJfUExMX0NUTF8yIE1hc2tzICovCisKKyNkZWZpbmUJTVNIQVBFUlNFTCAweDAwMDAwMDA3bHUKKyNkZWZpbmUJTUNQU0VMCSAgIDB4MDAwMDAwRTBsdQorCisvKiBNWFZSX0lOVF9TVEFUXzAgTWFza3MgKi8KKworI2RlZmluZQlOSTJBICAweDAwMDAwMDAxbHUKKyNkZWZpbmUJTkEySSAgMHgwMDAwMDAwMmx1CisjZGVmaW5lCVNCVTJMIDB4MDAwMDAwMDRsdQorI2RlZmluZQlTQkwyVSAweDAwMDAwMDA4bHUKKyNkZWZpbmUJUFJVICAgMHgwMDAwMDAxMGx1CisjZGVmaW5lCU1QUlUgIDB4MDAwMDAwMjBsdQorI2RlZmluZQlEUlUgICAweDAwMDAwMDQwbHUKKyNkZWZpbmUJTURSVSAgMHgwMDAwMDA4MGx1CisjZGVmaW5lCVNCVSAgIDB4MDAwMDAxMDBsdQorI2RlZmluZQlBVFUgICAweDAwMDAwMjAwbHUKKyNkZWZpbmUJRkNaMCAgMHgwMDAwMDQwMGx1CisjZGVmaW5lCUZDWjEgIDB4MDAwMDA4MDBsdQorI2RlZmluZQlQRVJSICAweDAwMDAxMDAwbHUKKyNkZWZpbmUJTUgyTCAgMHgwMDAwMjAwMGx1CisjZGVmaW5lCU1MMkggIDB4MDAwMDQwMDBsdQorI2RlZmluZQlXVVAgICAweDAwMDA4MDAwbHUKKyNkZWZpbmUJRlUyTCAgMHgwMDAxMDAwMGx1CisjZGVmaW5lCUZMMlUgIDB4MDAwMjAwMDBsdQorI2RlZmluZQlCVTJMICAweDAwMDQwMDAwbHUKKyNkZWZpbmUJQkwyVSAgMHgwMDA4MDAwMGx1CisjZGVmaW5lCVBDWiAgIDB4MDA0MDAwMDBsdQorI2RlZmluZQlGRVJSICAweDAwODAwMDAwbHUKKyNkZWZpbmUJQ01SICAgMHgwMTAwMDAwMGx1CisjZGVmaW5lCUNNUk9GIDB4MDIwMDAwMDBsdQorI2RlZmluZQlDTVRTICAweDA0MDAwMDAwbHUKKyNkZWZpbmUJQ01UQyAgMHgwODAwMDAwMGx1CisjZGVmaW5lCVJXUkMgIDB4MTAwMDAwMDBsdQorI2RlZmluZQlCQ1ogICAweDIwMDAwMDAwbHUKKyNkZWZpbmUJQk1FUlIgMHg0MDAwMDAwMGx1CisjZGVmaW5lCURFUlIgIDB4ODAwMDAwMDBsdQorCisKKy8qIE1YVlJfSU5UX0VOXzAgTWFza3MgKi8KKworI2RlZmluZQlOSTJBRU4JTkkyQQorI2RlZmluZQlOQTJJRU4JTkEySQorI2RlZmluZQlTQlUyTEVOCVNCVTJMCisjZGVmaW5lCVNCTDJVRU4JU0JMMlUKKyNkZWZpbmUJUFJVRU4JUFJVCisjZGVmaW5lCU1QUlVFTglNUFJVCisjZGVmaW5lCURSVUVOCURSVQorI2RlZmluZQlNRFJVRU4JTURSVQorI2RlZmluZQlTQlVFTglTQlUKKyNkZWZpbmUJQVRVRU4JQVRVCisjZGVmaW5lCUZDWjBFTglGQ1owCisjZGVmaW5lCUZDWjFFTglGQ1oxCisjZGVmaW5lCVBFUlJFTglQRVJSCisjZGVmaW5lCU1IMkxFTglNSDJMCisjZGVmaW5lCU1MMkhFTglNTDJICisjZGVmaW5lCVdVUEVOCVdVUAorI2RlZmluZQlGVTJMRU4JRlUyTAorI2RlZmluZQlGTDJVRU4JRkwyVQorI2RlZmluZQlCVTJMRU4JQlUyTAorI2RlZmluZQlCTDJVRU4JQkwyVQorI2RlZmluZQlQQ1pFTglQQ1oKKyNkZWZpbmUJRkVSUkVOCUZFUlIKKyNkZWZpbmUJQ01SRU4JQ01SCisjZGVmaW5lCUNNUk9GRU4JQ01ST0YKKyNkZWZpbmUJQ01UU0VOCUNNVFMKKyNkZWZpbmUJQ01UQ0VOCUNNVEMKKyNkZWZpbmUJUldSQ0VOCVJXUkMKKyNkZWZpbmUJQkNaRU4JQkNaCisjZGVmaW5lCUJNRVJSRU4JQk1FUlIKKyNkZWZpbmUJREVSUkVOCURFUlIKKworCisvKiBNWFZSX0lOVF9TVEFUXzEgTWFza3MgKi8KKworI2RlZmluZQlBUFIgICAweDAwMDAwMDA0bHUKKyNkZWZpbmUJQVBST0YgMHgwMDAwMDAwOGx1CisjZGVmaW5lCUFQVFMgIDB4MDAwMDAwNDBsdQorI2RlZmluZQlBUFRDICAweDAwMDAwMDgwbHUKKyNkZWZpbmUJQVBSQ0UgMHgwMDAwMDQwMGx1CisjZGVmaW5lCUFQUlBFIDB4MDAwMDA4MDBsdQorCisjZGVmaW5lCUhET05FMCAweDAwMDAwMDAxbHUKKyNkZWZpbmUJRE9ORTAgIDB4MDAwMDAwMDJsdQorI2RlZmluZQlIRE9ORTEgMHgwMDAwMDAxMGx1CisjZGVmaW5lCURPTkUxICAweDAwMDAwMDIwbHUKKyNkZWZpbmUJSERPTkUyIDB4MDAwMDAxMDBsdQorI2RlZmluZQlET05FMiAgMHgwMDAwMDIwMGx1CisjZGVmaW5lCUhET05FMyAweDAwMDAxMDAwbHUKKyNkZWZpbmUJRE9ORTMgIDB4MDAwMDIwMDBsdQorI2RlZmluZQlIRE9ORTQgMHgwMDAxMDAwMGx1CisjZGVmaW5lCURPTkU0ICAweDAwMDIwMDAwbHUKKyNkZWZpbmUJSERPTkU1IDB4MDAxMDAwMDBsdQorI2RlZmluZQlET05FNSAgMHgwMDIwMDAwMGx1CisjZGVmaW5lCUhET05FNiAweDAxMDAwMDAwbHUKKyNkZWZpbmUJRE9ORTYgIDB4MDIwMDAwMDBsdQorI2RlZmluZQlIRE9ORTcgMHgxMDAwMDAwMGx1CisjZGVmaW5lCURPTkU3ICAweDIwMDAwMDAwbHUKKworI2RlZmluZQlET05FWCh4KSAoMHgwMDAwMDAwMiA8PAkoNCAqICh4KSkpCisjZGVmaW5lCUhET05FWCh4KSAoMHgwMDAwMDAwMSA8PCAoNCAqICh4KSkpCisKKworLyogTVhWUl9JTlRfRU5fMSBNYXNrcyAqLworCisjZGVmaW5lCUFQUkVOCUFQUgorI2RlZmluZQlBUFJPRkVOCUFQUk9GCisjZGVmaW5lCUFQVFNFTglBUFRTCisjZGVmaW5lCUFQVENFTglBUFRDCisjZGVmaW5lCUFQUkNFRU4JQVBSQ0UKKyNkZWZpbmUJQVBSUEVFTglBUFJQRQorCisjZGVmaW5lCUhET05FRU4wIEhET05FMAorI2RlZmluZQlET05FRU4wCSBET05FMAorI2RlZmluZQlIRE9ORUVOMSBIRE9ORTEKKyNkZWZpbmUJRE9ORUVOMQkgRE9ORTEKKyNkZWZpbmUJSERPTkVFTjIgSERPTkUyCisjZGVmaW5lCURPTkVFTjIJIERPTkUyCisjZGVmaW5lCUhET05FRU4zIEhET05FMworI2RlZmluZQlET05FRU4zCSBET05FMworI2RlZmluZQlIRE9ORUVONCBIRE9ORTQKKyNkZWZpbmUJRE9ORUVONAkgRE9ORTQKKyNkZWZpbmUJSERPTkVFTjUgSERPTkU1CisjZGVmaW5lCURPTkVFTjUJIERPTkU1CisjZGVmaW5lCUhET05FRU42IEhET05FNgorI2RlZmluZQlET05FRU42CSBET05FNgorI2RlZmluZQlIRE9ORUVONyBIRE9ORTcKKyNkZWZpbmUJRE9ORUVONwkgRE9ORTcKKworI2RlZmluZQlET05FRU5YKHgpICgweDAwMDAwMDAyIDw8ICg0ICogKHgpKSkKKyNkZWZpbmUJSERPTkVFTlgoeCkgKDB4MDAwMDAwMDEJPDwgKDQgKgkoeCkpKQorCisKKy8qIE1YVlJfU1RBVEVfMAlNYXNrcyAqLworCisjZGVmaW5lCU5BQ1QJIDB4MDAwMDAwMDFsdQorI2RlZmluZQlTQkxPQ0sJIDB4MDAwMDAwMDJsdQorI2RlZmluZQlQRkRMT0NLCSAweDAwMDAwMDA0bHUKKyNkZWZpbmUJUEZETE9DSzAgMHgwMDAwMDAwNGx1IC8qIGxlZ2FjeSAqLworI2RlZmluZQlQREQJIDB4MDAwMDAwMDhsdQorI2RlZmluZQlQREQwCSAweDAwMDAwMDA4bHUgLyogbGVnYWN5ICovCisjZGVmaW5lCVBWQ08JIDB4MDAwMDAwMTBsdQorI2RlZmluZQlQVkNPMAkgMHgwMDAwMDAxMGx1IC8qIGxlZ2FjeSAqLworI2RlZmluZQlQRkRMT0NLMSAweDAwMDAwMDIwbHUgLyogbGVnYWN5ICovCisjZGVmaW5lCVBERDEJIDB4MDAwMDAwNDBsdSAvKiBsZWdhY3kgKi8KKyNkZWZpbmUJUFZDTzEJIDB4MDAwMDAwODBsdSAvKiBsZWdhY3kgKi8KKyNkZWZpbmUJQVBCU1kJIDB4MDAwMDAxMDBsdQorI2RlZmluZQlBUEFSQgkgMHgwMDAwMDIwMGx1CisjZGVmaW5lCUFQVFgJIDB4MDAwMDA0MDBsdQorI2RlZmluZQlBUFJYCSAweDAwMDAwODAwbHUKKyNkZWZpbmUJQ01CU1kJIDB4MDAwMDEwMDBsdQorI2RlZmluZQlDTUFSQgkgMHgwMDAwMjAwMGx1CisjZGVmaW5lCUNNVFgJIDB4MDAwMDQwMDBsdQorI2RlZmluZQlDTVJYCSAweDAwMDA4MDAwbHUKKyNkZWZpbmUJTVJYT05CCSAweDAwMDEwMDAwbHUKKyNkZWZpbmUJUkdTSVAJIDB4MDAwMjAwMDBsdQorI2RlZmluZQlEQUxJUAkgMHgwMDA0MDAwMGx1CisjZGVmaW5lCUFMSVAJIDB4MDAwODAwMDBsdQorI2RlZmluZQlSUkRJUAkgMHgwMDEwMDAwMGx1CisjZGVmaW5lCVJXUklQCSAweDAwMjAwMDAwbHUKKyNkZWZpbmUJRkxPQ0sJIDB4MDA0MDAwMDBsdQorI2RlZmluZQlCTE9DSwkgMHgwMDgwMDAwMGx1CisjZGVmaW5lCVJTQgkgMHgwRjAwMDAwMGx1CisjZGVmaW5lCURFUlJOVU0JIDB4RjAwMDAwMDBsdQorCisKKy8qIE1YVlJfU1RBVEVfMQlNYXNrcyAqLworCisjZGVmaW5lCVNUWE5VTUIJICAgIDB4MDAwMDAwMEZsdQorI2RlZmluZQlTUlhOVU1CCSAgICAweDAwMDAwMEYwbHUKKyNkZWZpbmUJQVBDT05UCSAgICAweDAwMDAwMTAwbHUKKyNkZWZpbmUJRE1BQUNUSVZFWCAgMHgwMEZGMDAwMGx1CisjZGVmaW5lCURNQUFDVElWRTAgIDB4MDAwMTAwMDBsdQorI2RlZmluZQlETUFBQ1RJVkUxICAweDAwMDIwMDAwbHUKKyNkZWZpbmUJRE1BQUNUSVZFMiAgMHgwMDA0MDAwMGx1CisjZGVmaW5lCURNQUFDVElWRTMgIDB4MDAwODAwMDBsdQorI2RlZmluZQlETUFBQ1RJVkU0ICAweDAwMTAwMDAwbHUKKyNkZWZpbmUJRE1BQUNUSVZFNSAgMHgwMDIwMDAwMGx1CisjZGVmaW5lCURNQUFDVElWRTYgIDB4MDA0MDAwMDBsdQorI2RlZmluZQlETUFBQ1RJVkU3ICAweDAwODAwMDAwbHUKKyNkZWZpbmUJRE1BUE1FTlggICAgMHhGRjAwMDAwMGx1CisjZGVmaW5lCURNQVBNRU4wICAgIDB4MDEwMDAwMDBsdQorI2RlZmluZQlETUFQTUVOMSAgICAweDAyMDAwMDAwbHUKKyNkZWZpbmUJRE1BUE1FTjIgICAgMHgwNDAwMDAwMGx1CisjZGVmaW5lCURNQVBNRU4zICAgIDB4MDgwMDAwMDBsdQorI2RlZmluZQlETUFQTUVONCAgICAweDEwMDAwMDAwbHUKKyNkZWZpbmUJRE1BUE1FTjUgICAgMHgyMDAwMDAwMGx1CisjZGVmaW5lCURNQVBNRU42ICAgIDB4NDAwMDAwMDBsdQorI2RlZmluZQlETUFQTUVONyAgICAweDgwMDAwMDAwbHUKKworCisvKiBNWFZSX1BPU0lUSU9OIE1hc2tzICovCisKKyNkZWZpbmUJUFZBTElECSAgICAgMHg4MDAwCisjZGVmaW5lCVBPU0lUSU9OICAgICAweDAwM0YKKworCisvKiBNWFZSX01BWF9QT1NJVElPTiBNYXNrcyAqLworCisjZGVmaW5lCU1QVkFMSUQJICAgICAweDgwMDAKKyNkZWZpbmUJTVBPU0lUSU9OICAgIDB4MDAzRgorCisKKy8qIE1YVlJfREVMQVkgTWFza3MgKi8KKworI2RlZmluZQlEVkFMSUQJICAgICAweDgwMDAKKyNkZWZpbmUJREVMQVkJICAgICAweDAwM0YKKworCisvKiBNWFZSX01BWF9ERUxBWSBNYXNrcyAqLworCisjZGVmaW5lCU1EVkFMSUQJICAgICAweDgwMDAKKyNkZWZpbmUJTURFTEFZCSAgICAgMHgwMDNGCisKKworLyogTVhWUl9MQUREUiBNYXNrcyAqLworCisjZGVmaW5lCUxWQUxJRAkgICAgIDB4ODAwMDAwMDBsdQorI2RlZmluZQlMQUREUgkgICAgIDB4MDAwMEZGRkZsdQorCisKKy8qIE1YVlJfR0FERFIgTWFza3MgKi8KKworI2RlZmluZQlHVkFMSUQJICAgICAweDgwMDAKKyNkZWZpbmUJR0FERFJMCSAgICAgMHgwMEZGCisKKworLyogTVhWUl9BQUREUiBNYXNrcyAqLworCisjZGVmaW5lCUFWQUxJRAkgICAgIDB4ODAwMDAwMDBsdQorI2RlZmluZQlBQUREUgkgICAgIDB4MDAwMEZGRkZsdQorCisKKy8qIE1YVlJfQUxMT0NfMAlNYXNrcyAqLworCisjZGVmaW5lCUNJVTAJICAgICAweDAwMDAwMDgwbHUKKyNkZWZpbmUJQ0lVMQkgICAgIDB4MDAwMDgwMDBsdQorI2RlZmluZQlDSVUyCSAgICAgMHgwMDgwMDAwMGx1CisjZGVmaW5lCUNJVTMJICAgICAweDgwMDAwMDAwbHUKKworI2RlZmluZQlDTDAJICAgICAweDAwMDAwMDdGbHUKKyNkZWZpbmUJQ0wxCSAgICAgMHgwMDAwN0YwMGx1CisjZGVmaW5lCUNMMgkgICAgIDB4MDA3RjAwMDBsdQorI2RlZmluZQlDTDMJICAgICAweDdGMDAwMDAwbHUKKworCisvKiBNWFZSX0FMTE9DXzEJTWFza3MgKi8KKworI2RlZmluZQlDSVU0CSAgICAgMHgwMDAwMDA4MGx1CisjZGVmaW5lCUNJVTUJICAgICAweDAwMDA4MDAwbHUKKyNkZWZpbmUJQ0lVNgkgICAgIDB4MDA4MDAwMDBsdQorI2RlZmluZQlDSVU3CSAgICAgMHg4MDAwMDAwMGx1CisKKyNkZWZpbmUJQ0w0CSAgICAgMHgwMDAwMDA3Rmx1CisjZGVmaW5lCUNMNQkgICAgIDB4MDAwMDdGMDBsdQorI2RlZmluZQlDTDYJICAgICAweDAwN0YwMDAwbHUKKyNkZWZpbmUJQ0w3CSAgICAgMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9BTExPQ18yCU1hc2tzICovCisKKyNkZWZpbmUJQ0lVOAkgICAgIDB4MDAwMDAwODBsdQorI2RlZmluZQlDSVU5CSAgICAgMHgwMDAwODAwMGx1CisjZGVmaW5lCUNJVTEwCSAgICAgMHgwMDgwMDAwMGx1CisjZGVmaW5lCUNJVTExCSAgICAgMHg4MDAwMDAwMGx1CisKKyNkZWZpbmUJQ0w4CSAgICAgMHgwMDAwMDA3Rmx1CisjZGVmaW5lCUNMOQkgICAgIDB4MDAwMDdGMDBsdQorI2RlZmluZQlDTDEwCSAgICAgMHgwMDdGMDAwMGx1CisjZGVmaW5lCUNMMTEJICAgICAweDdGMDAwMDAwbHUKKworCisvKiBNWFZSX0FMTE9DXzMJTWFza3MgKi8KKworI2RlZmluZQlDSVUxMgkgICAgIDB4MDAwMDAwODBsdQorI2RlZmluZQlDSVUxMwkgICAgIDB4MDAwMDgwMDBsdQorI2RlZmluZQlDSVUxNAkgICAgIDB4MDA4MDAwMDBsdQorI2RlZmluZQlDSVUxNQkgICAgIDB4ODAwMDAwMDBsdQorCisjZGVmaW5lCUNMMTIJICAgICAweDAwMDAwMDdGbHUKKyNkZWZpbmUJQ0wxMwkgICAgIDB4MDAwMDdGMDBsdQorI2RlZmluZQlDTDE0CSAgICAgMHgwMDdGMDAwMGx1CisjZGVmaW5lCUNMMTUJICAgICAweDdGMDAwMDAwbHUKKworCisvKiBNWFZSX0FMTE9DXzQJTWFza3MgKi8KKworI2RlZmluZQlDSVUxNgkgICAgIDB4MDAwMDAwODBsdQorI2RlZmluZQlDSVUxNwkgICAgIDB4MDAwMDgwMDBsdQorI2RlZmluZQlDSVUxOAkgICAgIDB4MDA4MDAwMDBsdQorI2RlZmluZQlDSVUxOQkgICAgIDB4ODAwMDAwMDBsdQorCisjZGVmaW5lCUNMMTYJICAgICAweDAwMDAwMDdGbHUKKyNkZWZpbmUJQ0wxNwkgICAgIDB4MDAwMDdGMDBsdQorI2RlZmluZQlDTDE4CSAgICAgMHgwMDdGMDAwMGx1CisjZGVmaW5lCUNMMTkJICAgICAweDdGMDAwMDAwbHUKKworCisvKiBNWFZSX0FMTE9DXzUJTWFza3MgKi8KKworI2RlZmluZQlDSVUyMAkgICAgIDB4MDAwMDAwODBsdQorI2RlZmluZQlDSVUyMQkgICAgIDB4MDAwMDgwMDBsdQorI2RlZmluZQlDSVUyMgkgICAgIDB4MDA4MDAwMDBsdQorI2RlZmluZQlDSVUyMwkgICAgIDB4ODAwMDAwMDBsdQorCisjZGVmaW5lCUNMMjAJICAgICAweDAwMDAwMDdGbHUKKyNkZWZpbmUJQ0wyMQkgICAgIDB4MDAwMDdGMDBsdQorI2RlZmluZQlDTDIyCSAgICAgMHgwMDdGMDAwMGx1CisjZGVmaW5lCUNMMjMJICAgICAweDdGMDAwMDAwbHUKKworCisvKiBNWFZSX0FMTE9DXzYJTWFza3MgKi8KKworI2RlZmluZQlDSVUyNAkgICAgIDB4MDAwMDAwODBsdQorI2RlZmluZQlDSVUyNQkgICAgIDB4MDAwMDgwMDBsdQorI2RlZmluZQlDSVUyNgkgICAgIDB4MDA4MDAwMDBsdQorI2RlZmluZQlDSVUyNwkgICAgIDB4ODAwMDAwMDBsdQorCisjZGVmaW5lCUNMMjQJICAgICAweDAwMDAwMDdGbHUKKyNkZWZpbmUJQ0wyNQkgICAgIDB4MDAwMDdGMDBsdQorI2RlZmluZQlDTDI2CSAgICAgMHgwMDdGMDAwMGx1CisjZGVmaW5lCUNMMjcJICAgICAweDdGMDAwMDAwbHUKKworCisvKiBNWFZSX0FMTE9DXzcJTWFza3MgKi8KKworI2RlZmluZQlDSVUyOAkgICAgIDB4MDAwMDAwODBsdQorI2RlZmluZQlDSVUyOQkgICAgIDB4MDAwMDgwMDBsdQorI2RlZmluZQlDSVUzMAkgICAgIDB4MDA4MDAwMDBsdQorI2RlZmluZQlDSVUzMQkgICAgIDB4ODAwMDAwMDBsdQorCisjZGVmaW5lCUNMMjgJICAgICAweDAwMDAwMDdGbHUKKyNkZWZpbmUJQ0wyOQkgICAgIDB4MDAwMDdGMDBsdQorI2RlZmluZQlDTDMwCSAgICAgMHgwMDdGMDAwMGx1CisjZGVmaW5lCUNMMzEJICAgICAweDdGMDAwMDAwbHUKKworCisvKiBNWFZSX0FMTE9DXzgJTWFza3MgKi8KKworI2RlZmluZQlDSVUzMgkgICAgIDB4MDAwMDAwODBsdQorI2RlZmluZQlDSVUzMwkgICAgIDB4MDAwMDgwMDBsdQorI2RlZmluZQlDSVUzNAkgICAgIDB4MDA4MDAwMDBsdQorI2RlZmluZQlDSVUzNQkgICAgIDB4ODAwMDAwMDBsdQorCisjZGVmaW5lCUNMMzIJICAgICAweDAwMDAwMDdGbHUKKyNkZWZpbmUJQ0wzMwkgICAgIDB4MDAwMDdGMDBsdQorI2RlZmluZQlDTDM0CSAgICAgMHgwMDdGMDAwMGx1CisjZGVmaW5lCUNMMzUJICAgICAweDdGMDAwMDAwbHUKKworCisvKiBNWFZSX0FMTE9DXzkJTWFza3MgKi8KKworI2RlZmluZQlDSVUzNgkgICAgIDB4MDAwMDAwODBsdQorI2RlZmluZQlDSVUzNwkgICAgIDB4MDAwMDgwMDBsdQorI2RlZmluZQlDSVUzOAkgICAgIDB4MDA4MDAwMDBsdQorI2RlZmluZQlDSVUzOQkgICAgIDB4ODAwMDAwMDBsdQorCisjZGVmaW5lCUNMMzYJICAgICAweDAwMDAwMDdGbHUKKyNkZWZpbmUJQ0wzNwkgICAgIDB4MDAwMDdGMDBsdQorI2RlZmluZQlDTDM4CSAgICAgMHgwMDdGMDAwMGx1CisjZGVmaW5lCUNMMzkJICAgICAweDdGMDAwMDAwbHUKKworCisvKiBNWFZSX0FMTE9DXzEwIE1hc2tzICovCisKKyNkZWZpbmUJQ0lVNDAJICAgICAweDAwMDAwMDgwbHUKKyNkZWZpbmUJQ0lVNDEJICAgICAweDAwMDA4MDAwbHUKKyNkZWZpbmUJQ0lVNDIJICAgICAweDAwODAwMDAwbHUKKyNkZWZpbmUJQ0lVNDMJICAgICAweDgwMDAwMDAwbHUKKworI2RlZmluZQlDTDQwCSAgICAgMHgwMDAwMDA3Rmx1CisjZGVmaW5lCUNMNDEJICAgICAweDAwMDA3RjAwbHUKKyNkZWZpbmUJQ0w0MgkgICAgIDB4MDA3RjAwMDBsdQorI2RlZmluZQlDTDQzCSAgICAgMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9BTExPQ18xMSBNYXNrcyAqLworCisjZGVmaW5lCUNJVTQ0CSAgICAgMHgwMDAwMDA4MGx1CisjZGVmaW5lCUNJVTQ1CSAgICAgMHgwMDAwODAwMGx1CisjZGVmaW5lCUNJVTQ2CSAgICAgMHgwMDgwMDAwMGx1CisjZGVmaW5lCUNJVTQ3CSAgICAgMHg4MDAwMDAwMGx1CisKKyNkZWZpbmUJQ0w0NAkgICAgIDB4MDAwMDAwN0ZsdQorI2RlZmluZQlDTDQ1CSAgICAgMHgwMDAwN0YwMGx1CisjZGVmaW5lCUNMNDYJICAgICAweDAwN0YwMDAwbHUKKyNkZWZpbmUJQ0w0NwkgICAgIDB4N0YwMDAwMDBsdQorCisKKy8qIE1YVlJfQUxMT0NfMTIgTWFza3MgKi8KKworI2RlZmluZQlDSVU0OAkgICAgIDB4MDAwMDAwODBsdQorI2RlZmluZQlDSVU0OQkgICAgIDB4MDAwMDgwMDBsdQorI2RlZmluZQlDSVU1MAkgICAgIDB4MDA4MDAwMDBsdQorI2RlZmluZQlDSVU1MQkgICAgIDB4ODAwMDAwMDBsdQorCisjZGVmaW5lCUNMNDgJICAgICAweDAwMDAwMDdGbHUKKyNkZWZpbmUJQ0w0OQkgICAgIDB4MDAwMDdGMDBsdQorI2RlZmluZQlDTDUwCSAgICAgMHgwMDdGMDAwMGx1CisjZGVmaW5lCUNMNTEJICAgICAweDdGMDAwMDAwbHUKKworCisvKiBNWFZSX0FMTE9DXzEzIE1hc2tzICovCisKKyNkZWZpbmUJQ0lVNTIJICAgICAweDAwMDAwMDgwbHUKKyNkZWZpbmUJQ0lVNTMJICAgICAweDAwMDA4MDAwbHUKKyNkZWZpbmUJQ0lVNTQJICAgICAweDAwODAwMDAwbHUKKyNkZWZpbmUJQ0lVNTUJICAgICAweDgwMDAwMDAwbHUKKworI2RlZmluZQlDTDUyCSAgICAgMHgwMDAwMDA3Rmx1CisjZGVmaW5lCUNMNTMJICAgICAweDAwMDA3RjAwbHUKKyNkZWZpbmUJQ0w1NAkgICAgIDB4MDA3RjAwMDBsdQorI2RlZmluZQlDTDU1CSAgICAgMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9BTExPQ18xNCBNYXNrcyAqLworCisjZGVmaW5lCUNJVTU2CSAgICAgMHgwMDAwMDA4MGx1CisjZGVmaW5lCUNJVTU3CSAgICAgMHgwMDAwODAwMGx1CisjZGVmaW5lCUNJVTU4CSAgICAgMHgwMDgwMDAwMGx1CisjZGVmaW5lCUNJVTU5CSAgICAgMHg4MDAwMDAwMGx1CisKKyNkZWZpbmUJQ0w1NgkgICAgIDB4MDAwMDAwN0ZsdQorI2RlZmluZQlDTDU3CSAgICAgMHgwMDAwN0YwMGx1CisjZGVmaW5lCUNMNTgJICAgICAweDAwN0YwMDAwbHUKKyNkZWZpbmUJQ0w1OQkgICAgIDB4N0YwMDAwMDBsdQorCisKKy8qIE1YVlJfU1lOQ19MQ0hBTl8wIE1hc2tzICovCisKKyNkZWZpbmUJTENIQU5QQzAgICAgIDB4MDAwMDAwMEZsdQorI2RlZmluZQlMQ0hBTlBDMSAgICAgMHgwMDAwMDBGMGx1CisjZGVmaW5lCUxDSEFOUEMyICAgICAweDAwMDAwRjAwbHUKKyNkZWZpbmUJTENIQU5QQzMgICAgIDB4MDAwMEYwMDBsdQorI2RlZmluZQlMQ0hBTlBDNCAgICAgMHgwMDBGMDAwMGx1CisjZGVmaW5lCUxDSEFOUEM1ICAgICAweDAwRjAwMDAwbHUKKyNkZWZpbmUJTENIQU5QQzYgICAgIDB4MEYwMDAwMDBsdQorI2RlZmluZQlMQ0hBTlBDNyAgICAgMHhGMDAwMDAwMGx1CisKKworLyogTVhWUl9TWU5DX0xDSEFOXzEgTWFza3MgKi8KKworI2RlZmluZQlMQ0hBTlBDOCAgICAgMHgwMDAwMDAwRmx1CisjZGVmaW5lCUxDSEFOUEM5ICAgICAweDAwMDAwMEYwbHUKKyNkZWZpbmUJTENIQU5QQzEwICAgIDB4MDAwMDBGMDBsdQorI2RlZmluZQlMQ0hBTlBDMTEgICAgMHgwMDAwRjAwMGx1CisjZGVmaW5lCUxDSEFOUEMxMiAgICAweDAwMEYwMDAwbHUKKyNkZWZpbmUJTENIQU5QQzEzICAgIDB4MDBGMDAwMDBsdQorI2RlZmluZQlMQ0hBTlBDMTQgICAgMHgwRjAwMDAwMGx1CisjZGVmaW5lCUxDSEFOUEMxNSAgICAweEYwMDAwMDAwbHUKKworCisvKiBNWFZSX1NZTkNfTENIQU5fMiBNYXNrcyAqLworCisjZGVmaW5lCUxDSEFOUEMxNiAgICAweDAwMDAwMDBGbHUKKyNkZWZpbmUJTENIQU5QQzE3ICAgIDB4MDAwMDAwRjBsdQorI2RlZmluZQlMQ0hBTlBDMTggICAgMHgwMDAwMEYwMGx1CisjZGVmaW5lCUxDSEFOUEMxOSAgICAweDAwMDBGMDAwbHUKKyNkZWZpbmUJTENIQU5QQzIwICAgIDB4MDAwRjAwMDBsdQorI2RlZmluZQlMQ0hBTlBDMjEgICAgMHgwMEYwMDAwMGx1CisjZGVmaW5lCUxDSEFOUEMyMiAgICAweDBGMDAwMDAwbHUKKyNkZWZpbmUJTENIQU5QQzIzICAgIDB4RjAwMDAwMDBsdQorCisKKy8qIE1YVlJfU1lOQ19MQ0hBTl8zIE1hc2tzICovCisKKyNkZWZpbmUJTENIQU5QQzI0ICAgIDB4MDAwMDAwMEZsdQorI2RlZmluZQlMQ0hBTlBDMjUgICAgMHgwMDAwMDBGMGx1CisjZGVmaW5lCUxDSEFOUEMyNiAgICAweDAwMDAwRjAwbHUKKyNkZWZpbmUJTENIQU5QQzI3ICAgIDB4MDAwMEYwMDBsdQorI2RlZmluZQlMQ0hBTlBDMjggICAgMHgwMDBGMDAwMGx1CisjZGVmaW5lCUxDSEFOUEMyOSAgICAweDAwRjAwMDAwbHUKKyNkZWZpbmUJTENIQU5QQzMwICAgIDB4MEYwMDAwMDBsdQorI2RlZmluZQlMQ0hBTlBDMzEgICAgMHhGMDAwMDAwMGx1CisKKworLyogTVhWUl9TWU5DX0xDSEFOXzQgTWFza3MgKi8KKworI2RlZmluZQlMQ0hBTlBDMzIgICAgMHgwMDAwMDAwRmx1CisjZGVmaW5lCUxDSEFOUEMzMyAgICAweDAwMDAwMEYwbHUKKyNkZWZpbmUJTENIQU5QQzM0ICAgIDB4MDAwMDBGMDBsdQorI2RlZmluZQlMQ0hBTlBDMzUgICAgMHgwMDAwRjAwMGx1CisjZGVmaW5lCUxDSEFOUEMzNiAgICAweDAwMEYwMDAwbHUKKyNkZWZpbmUJTENIQU5QQzM3ICAgIDB4MDBGMDAwMDBsdQorI2RlZmluZQlMQ0hBTlBDMzggICAgMHgwRjAwMDAwMGx1CisjZGVmaW5lCUxDSEFOUEMzOSAgICAweEYwMDAwMDAwbHUKKworCisvKiBNWFZSX1NZTkNfTENIQU5fNSBNYXNrcyAqLworCisjZGVmaW5lCUxDSEFOUEM0MCAgICAweDAwMDAwMDBGbHUKKyNkZWZpbmUJTENIQU5QQzQxICAgIDB4MDAwMDAwRjBsdQorI2RlZmluZQlMQ0hBTlBDNDIgICAgMHgwMDAwMEYwMGx1CisjZGVmaW5lCUxDSEFOUEM0MyAgICAweDAwMDBGMDAwbHUKKyNkZWZpbmUJTENIQU5QQzQ0ICAgIDB4MDAwRjAwMDBsdQorI2RlZmluZQlMQ0hBTlBDNDUgICAgMHgwMEYwMDAwMGx1CisjZGVmaW5lCUxDSEFOUEM0NiAgICAweDBGMDAwMDAwbHUKKyNkZWZpbmUJTENIQU5QQzQ3ICAgIDB4RjAwMDAwMDBsdQorCisKKy8qIE1YVlJfU1lOQ19MQ0hBTl82IE1hc2tzICovCisKKyNkZWZpbmUJTENIQU5QQzQ4ICAgIDB4MDAwMDAwMEZsdQorI2RlZmluZQlMQ0hBTlBDNDkgICAgMHgwMDAwMDBGMGx1CisjZGVmaW5lCUxDSEFOUEM1MCAgICAweDAwMDAwRjAwbHUKKyNkZWZpbmUJTENIQU5QQzUxICAgIDB4MDAwMEYwMDBsdQorI2RlZmluZQlMQ0hBTlBDNTIgICAgMHgwMDBGMDAwMGx1CisjZGVmaW5lCUxDSEFOUEM1MyAgICAweDAwRjAwMDAwbHUKKyNkZWZpbmUJTENIQU5QQzU0ICAgIDB4MEYwMDAwMDBsdQorI2RlZmluZQlMQ0hBTlBDNTUgICAgMHhGMDAwMDAwMGx1CisKKworLyogTVhWUl9TWU5DX0xDSEFOXzcgTWFza3MgKi8KKworI2RlZmluZQlMQ0hBTlBDNTYgICAgMHgwMDAwMDAwRmx1CisjZGVmaW5lCUxDSEFOUEM1NyAgICAweDAwMDAwMEYwbHUKKyNkZWZpbmUJTENIQU5QQzU4ICAgIDB4MDAwMDBGMDBsdQorI2RlZmluZQlMQ0hBTlBDNTkgICAgMHgwMDAwRjAwMGx1CisKKworLyogTVhWUl9ETUF4X0NPTkZJRyBNYXNrcyAqLworCisjZGVmaW5lCU1ETUFFTgkgICAgMHgwMDAwMDAwMWx1CisjZGVmaW5lCURECSAgICAweDAwMDAwMDAybHUKKyNkZWZpbmUJTENIQU4JICAgIDB4MDAwMDAzQzBsdQorI2RlZmluZQlCSVRTV0FQRU4gICAweDAwMDAwNDAwbHUKKyNkZWZpbmUJQllTV0FQRU4gICAgMHgwMDAwMDgwMGx1CisjZGVmaW5lCU1GTE9XCSAgICAweDAwMDA3MDAwbHUKKyNkZWZpbmUJRklYRURQTQkgICAgMHgwMDA4MDAwMGx1CisjZGVmaW5lCVNUQVJUUEFUICAgIDB4MDAzMDAwMDBsdQorI2RlZmluZQlTVE9QUEFUCSAgICAweDAwQzAwMDAwbHUKKyNkZWZpbmUJQ09VTlRQT1MgICAgMHgxQzAwMDAwMGx1CisKKyNkZWZpbmUJRERfVFgJICAgIDB4MDAwMDAwMDBsdQorI2RlZmluZQlERF9SWAkgICAgMHgwMDAwMDAwMmx1CisKKyNkZWZpbmUJTENIQU5fMAkgICAgMHgwMDAwMDAwMGx1CisjZGVmaW5lCUxDSEFOXzEJICAgIDB4MDAwMDAwNDBsdQorI2RlZmluZQlMQ0hBTl8yCSAgICAweDAwMDAwMDgwbHUKKyNkZWZpbmUJTENIQU5fMwkgICAgMHgwMDAwMDBDMGx1CisjZGVmaW5lCUxDSEFOXzQJICAgIDB4MDAwMDAxMDBsdQorI2RlZmluZQlMQ0hBTl81CSAgICAweDAwMDAwMTQwbHUKKyNkZWZpbmUJTENIQU5fNgkgICAgMHgwMDAwMDE4MGx1CisjZGVmaW5lCUxDSEFOXzcJICAgIDB4MDAwMDAxQzBsdQorCisjZGVmaW5lCU1GTE9XX1NUT1AgIDB4MDAwMDAwMDBsdQorI2RlZmluZQlNRkxPV19BVVRPICAweDAwMDAxMDAwbHUKKyNkZWZpbmUJTUZMT1dfUFZDICAgMHgwMDAwMjAwMGx1CisjZGVmaW5lCU1GTE9XX1BTUyAgIDB4MDAwMDMwMDBsdQorI2RlZmluZQlNRkxPV19QRkMgICAweDAwMDA0MDAwbHUKKworI2RlZmluZQlTVEFSVFBBVF8wICAweDAwMDAwMDAwbHUKKyNkZWZpbmUJU1RBUlRQQVRfMSAgMHgwMDEwMDAwMGx1CisKKyNkZWZpbmUJU1RPUFBBVF8wICAgMHgwMDAwMDAwMGx1CisjZGVmaW5lCVNUT1BQQVRfMSAgIDB4MDA0MDAwMDBsdQorCisjZGVmaW5lCUNPVU5UUE9TXzAgIDB4MDAwMDAwMDBsdQorI2RlZmluZQlDT1VOVFBPU18xICAweDA0MDAwMDAwbHUKKyNkZWZpbmUJQ09VTlRQT1NfMiAgMHgwODAwMDAwMGx1CisjZGVmaW5lCUNPVU5UUE9TXzMgIDB4MEMwMDAwMDBsdQorI2RlZmluZQlDT1VOVFBPU180ICAweDEwMDAwMDAwbHUKKyNkZWZpbmUJQ09VTlRQT1NfNSAgMHgxNDAwMDAwMGx1CisjZGVmaW5lCUNPVU5UUE9TXzYgIDB4MTgwMDAwMDBsdQorI2RlZmluZQlDT1VOVFBPU183ICAweDFDMDAwMDAwbHUKKworCisvKiBNWFZSX0FQX0NUTCBNYXNrcyAqLworCisjZGVmaW5lCVNUQVJUQVAJICAgMHgwMDAwMDAwMWx1CisjZGVmaW5lCUNBTkNFTEFQICAgMHgwMDAwMDAwMmx1CisjZGVmaW5lCVJFU0VUQVAJICAgMHgwMDAwMDAwNGx1CisjZGVmaW5lCUFQUkJFMAkgICAweDAwMDA0MDAwbHUKKyNkZWZpbmUJQVBSQkUxCSAgIDB4MDAwMDgwMDBsdQorI2RlZmluZQlBUFJCRVgJICAgMHgwMDAwQzAwMGx1CisKKworLyogTVhWUl9DTV9DVEwgTWFza3MgKi8KKworI2RlZmluZQlTVEFSVENNCSAgIDB4MDAwMDAwMDFsdQorI2RlZmluZQlDQU5DRUxDTSAgIDB4MDAwMDAwMDJsdQorI2RlZmluZQlDTVJCRVgJICAgMHhGRkZGMDAwMGx1CisjZGVmaW5lCUNNUkJFMAkgICAweDAwMDEwMDAwbHUKKyNkZWZpbmUJQ01SQkUxCSAgIDB4MDAwMjAwMDBsdQorI2RlZmluZQlDTVJCRTIJICAgMHgwMDA0MDAwMGx1CisjZGVmaW5lCUNNUkJFMwkgICAweDAwMDgwMDAwbHUKKyNkZWZpbmUJQ01SQkU0CSAgIDB4MDAxMDAwMDBsdQorI2RlZmluZQlDTVJCRTUJICAgMHgwMDIwMDAwMGx1CisjZGVmaW5lCUNNUkJFNgkgICAweDAwNDAwMDAwbHUKKyNkZWZpbmUJQ01SQkU3CSAgIDB4MDA4MDAwMDBsdQorI2RlZmluZQlDTVJCRTgJICAgMHgwMTAwMDAwMGx1CisjZGVmaW5lCUNNUkJFOQkgICAweDAyMDAwMDAwbHUKKyNkZWZpbmUJQ01SQkUxMAkgICAweDA0MDAwMDAwbHUKKyNkZWZpbmUJQ01SQkUxMQkgICAweDA4MDAwMDAwbHUKKyNkZWZpbmUJQ01SQkUxMgkgICAweDEwMDAwMDAwbHUKKyNkZWZpbmUJQ01SQkUxMwkgICAweDIwMDAwMDAwbHUKKyNkZWZpbmUJQ01SQkUxNAkgICAweDQwMDAwMDAwbHUKKyNkZWZpbmUJQ01SQkUxNQkgICAweDgwMDAwMDAwbHUKKworCisvKiBNWFZSX1BBVF9EQVRBX3ggTWFza3MgKi8KKworI2RlZmluZQlNQVRDSF9EQVRBXzAgMHgwMDAwMDBGRmx1CisjZGVmaW5lCU1BVENIX0RBVEFfMSAweDAwMDBGRjAwbHUKKyNkZWZpbmUJTUFUQ0hfREFUQV8yIDB4MDBGRjAwMDBsdQorI2RlZmluZQlNQVRDSF9EQVRBXzMgMHhGRjAwMDAwMGx1CisKKworCisvKiBNWFZSX1BBVF9FTl94IE1hc2tzICovCisKKyNkZWZpbmUJTUFUQ0hfRU5fMF8wIDB4MDAwMDAwMDFsdQorI2RlZmluZQlNQVRDSF9FTl8wXzEgMHgwMDAwMDAwMmx1CisjZGVmaW5lCU1BVENIX0VOXzBfMiAweDAwMDAwMDA0bHUKKyNkZWZpbmUJTUFUQ0hfRU5fMF8zIDB4MDAwMDAwMDhsdQorI2RlZmluZQlNQVRDSF9FTl8wXzQgMHgwMDAwMDAxMGx1CisjZGVmaW5lCU1BVENIX0VOXzBfNSAweDAwMDAwMDIwbHUKKyNkZWZpbmUJTUFUQ0hfRU5fMF82IDB4MDAwMDAwNDBsdQorI2RlZmluZQlNQVRDSF9FTl8wXzcgMHgwMDAwMDA4MGx1CisKKyNkZWZpbmUJTUFUQ0hfRU5fMV8wIDB4MDAwMDAxMDBsdQorI2RlZmluZQlNQVRDSF9FTl8xXzEgMHgwMDAwMDIwMGx1CisjZGVmaW5lCU1BVENIX0VOXzFfMiAweDAwMDAwNDAwbHUKKyNkZWZpbmUJTUFUQ0hfRU5fMV8zIDB4MDAwMDA4MDBsdQorI2RlZmluZQlNQVRDSF9FTl8xXzQgMHgwMDAwMTAwMGx1CisjZGVmaW5lCU1BVENIX0VOXzFfNSAweDAwMDAyMDAwbHUKKyNkZWZpbmUJTUFUQ0hfRU5fMV82IDB4MDAwMDQwMDBsdQorI2RlZmluZQlNQVRDSF9FTl8xXzcgMHgwMDAwODAwMGx1CisKKyNkZWZpbmUJTUFUQ0hfRU5fMl8wIDB4MDAwMTAwMDBsdQorI2RlZmluZQlNQVRDSF9FTl8yXzEgMHgwMDAyMDAwMGx1CisjZGVmaW5lCU1BVENIX0VOXzJfMiAweDAwMDQwMDAwbHUKKyNkZWZpbmUJTUFUQ0hfRU5fMl8zIDB4MDAwODAwMDBsdQorI2RlZmluZQlNQVRDSF9FTl8yXzQgMHgwMDEwMDAwMGx1CisjZGVmaW5lCU1BVENIX0VOXzJfNSAweDAwMjAwMDAwbHUKKyNkZWZpbmUJTUFUQ0hfRU5fMl82IDB4MDA0MDAwMDBsdQorI2RlZmluZQlNQVRDSF9FTl8yXzcgMHgwMDgwMDAwMGx1CisKKyNkZWZpbmUJTUFUQ0hfRU5fM18wIDB4MDEwMDAwMDBsdQorI2RlZmluZQlNQVRDSF9FTl8zXzEgMHgwMjAwMDAwMGx1CisjZGVmaW5lCU1BVENIX0VOXzNfMiAweDA0MDAwMDAwbHUKKyNkZWZpbmUJTUFUQ0hfRU5fM18zIDB4MDgwMDAwMDBsdQorI2RlZmluZQlNQVRDSF9FTl8zXzQgMHgxMDAwMDAwMGx1CisjZGVmaW5lCU1BVENIX0VOXzNfNSAweDIwMDAwMDAwbHUKKyNkZWZpbmUJTUFUQ0hfRU5fM182IDB4NDAwMDAwMDBsdQorI2RlZmluZQlNQVRDSF9FTl8zXzcgMHg4MDAwMDAwMGx1CisKKworLyogTVhWUl9ST1VUSU5HXzAgTWFza3MgKi8KKworI2RlZmluZQlNVVRFX0NIMAkweDAwMDAwMDgwbHUKKyNkZWZpbmUJTVVURV9DSDEJMHgwMDAwODAwMGx1CisjZGVmaW5lCU1VVEVfQ0gyCTB4MDA4MDAwMDBsdQorI2RlZmluZQlNVVRFX0NIMwkweDgwMDAwMDAwbHUKKworI2RlZmluZQlUWF9DSDAJCTB4MDAwMDAwN0ZsdQorI2RlZmluZQlUWF9DSDEJCTB4MDAwMDdGMDBsdQorI2RlZmluZQlUWF9DSDIJCTB4MDA3RjAwMDBsdQorI2RlZmluZQlUWF9DSDMJCTB4N0YwMDAwMDBsdQorCisKKy8qIE1YVlJfUk9VVElOR18xIE1hc2tzICovCisKKyNkZWZpbmUJTVVURV9DSDQJMHgwMDAwMDA4MGx1CisjZGVmaW5lCU1VVEVfQ0g1CTB4MDAwMDgwMDBsdQorI2RlZmluZQlNVVRFX0NINgkweDAwODAwMDAwbHUKKyNkZWZpbmUJTVVURV9DSDcJMHg4MDAwMDAwMGx1CisKKyNkZWZpbmUJVFhfQ0g0CQkweDAwMDAwMDdGbHUKKyNkZWZpbmUJVFhfQ0g1CQkweDAwMDA3RjAwbHUKKyNkZWZpbmUJVFhfQ0g2CQkweDAwN0YwMDAwbHUKKyNkZWZpbmUJVFhfQ0g3CQkweDdGMDAwMDAwbHUKKworCisvKiBNWFZSX1JPVVRJTkdfMiBNYXNrcyAqLworCisjZGVmaW5lCU1VVEVfQ0g4CTB4MDAwMDAwODBsdQorI2RlZmluZQlNVVRFX0NIOQkweDAwMDA4MDAwbHUKKyNkZWZpbmUJTVVURV9DSDEwCTB4MDA4MDAwMDBsdQorI2RlZmluZQlNVVRFX0NIMTEJMHg4MDAwMDAwMGx1CisKKyNkZWZpbmUJVFhfQ0g4CQkweDAwMDAwMDdGbHUKKyNkZWZpbmUJVFhfQ0g5CQkweDAwMDA3RjAwbHUKKyNkZWZpbmUJVFhfQ0gxMAkJMHgwMDdGMDAwMGx1CisjZGVmaW5lCVRYX0NIMTEJCTB4N0YwMDAwMDBsdQorCisvKiBNWFZSX1JPVVRJTkdfMyBNYXNrcyAqLworCisjZGVmaW5lCU1VVEVfQ0gxMgkweDAwMDAwMDgwbHUKKyNkZWZpbmUJTVVURV9DSDEzCTB4MDAwMDgwMDBsdQorI2RlZmluZQlNVVRFX0NIMTQJMHgwMDgwMDAwMGx1CisjZGVmaW5lCU1VVEVfQ0gxNQkweDgwMDAwMDAwbHUKKworI2RlZmluZQlUWF9DSDEyCQkweDAwMDAwMDdGbHUKKyNkZWZpbmUJVFhfQ0gxMwkJMHgwMDAwN0YwMGx1CisjZGVmaW5lCVRYX0NIMTQJCTB4MDA3RjAwMDBsdQorI2RlZmluZQlUWF9DSDE1CQkweDdGMDAwMDAwbHUKKworCisvKiBNWFZSX1JPVVRJTkdfNCBNYXNrcyAqLworCisjZGVmaW5lCU1VVEVfQ0gxNgkweDAwMDAwMDgwbHUKKyNkZWZpbmUJTVVURV9DSDE3CTB4MDAwMDgwMDBsdQorI2RlZmluZQlNVVRFX0NIMTgJMHgwMDgwMDAwMGx1CisjZGVmaW5lCU1VVEVfQ0gxOQkweDgwMDAwMDAwbHUKKworI2RlZmluZQlUWF9DSDE2CQkweDAwMDAwMDdGbHUKKyNkZWZpbmUJVFhfQ0gxNwkJMHgwMDAwN0YwMGx1CisjZGVmaW5lCVRYX0NIMTgJCTB4MDA3RjAwMDBsdQorI2RlZmluZQlUWF9DSDE5CQkweDdGMDAwMDAwbHUKKworCisvKiBNWFZSX1JPVVRJTkdfNSBNYXNrcyAqLworCisjZGVmaW5lCU1VVEVfQ0gyMAkweDAwMDAwMDgwbHUKKyNkZWZpbmUJTVVURV9DSDIxCTB4MDAwMDgwMDBsdQorI2RlZmluZQlNVVRFX0NIMjIJMHgwMDgwMDAwMGx1CisjZGVmaW5lCU1VVEVfQ0gyMwkweDgwMDAwMDAwbHUKKworI2RlZmluZQlUWF9DSDIwCQkweDAwMDAwMDdGbHUKKyNkZWZpbmUJVFhfQ0gyMQkJMHgwMDAwN0YwMGx1CisjZGVmaW5lCVRYX0NIMjIJCTB4MDA3RjAwMDBsdQorI2RlZmluZQlUWF9DSDIzCQkweDdGMDAwMDAwbHUKKworCisvKiBNWFZSX1JPVVRJTkdfNiBNYXNrcyAqLworCisjZGVmaW5lCU1VVEVfQ0gyNAkweDAwMDAwMDgwbHUKKyNkZWZpbmUJTVVURV9DSDI1CTB4MDAwMDgwMDBsdQorI2RlZmluZQlNVVRFX0NIMjYJMHgwMDgwMDAwMGx1CisjZGVmaW5lCU1VVEVfQ0gyNwkweDgwMDAwMDAwbHUKKworI2RlZmluZQlUWF9DSDI0CQkweDAwMDAwMDdGbHUKKyNkZWZpbmUJVFhfQ0gyNQkJMHgwMDAwN0YwMGx1CisjZGVmaW5lCVRYX0NIMjYJCTB4MDA3RjAwMDBsdQorI2RlZmluZQlUWF9DSDI3CQkweDdGMDAwMDAwbHUKKworCisvKiBNWFZSX1JPVVRJTkdfNyBNYXNrcyAqLworCisjZGVmaW5lCU1VVEVfQ0gyOAkweDAwMDAwMDgwbHUKKyNkZWZpbmUJTVVURV9DSDI5CTB4MDAwMDgwMDBsdQorI2RlZmluZQlNVVRFX0NIMzAJMHgwMDgwMDAwMGx1CisjZGVmaW5lCU1VVEVfQ0gzMQkweDgwMDAwMDAwbHUKKworI2RlZmluZQlUWF9DSDI4CQkweDAwMDAwMDdGbHUKKyNkZWZpbmUJVFhfQ0gyOQkJMHgwMDAwN0YwMGx1CisjZGVmaW5lCVRYX0NIMzAJCTB4MDA3RjAwMDBsdQorI2RlZmluZQlUWF9DSDMxCQkweDdGMDAwMDAwbHUKKworCisvKiBNWFZSX1JPVVRJTkdfOCBNYXNrcyAqLworCisjZGVmaW5lCU1VVEVfQ0gzMgkweDAwMDAwMDgwbHUKKyNkZWZpbmUJTVVURV9DSDMzCTB4MDAwMDgwMDBsdQorI2RlZmluZQlNVVRFX0NIMzQJMHgwMDgwMDAwMGx1CisjZGVmaW5lCU1VVEVfQ0gzNQkweDgwMDAwMDAwbHUKKworI2RlZmluZQlUWF9DSDMyCQkweDAwMDAwMDdGbHUKKyNkZWZpbmUJVFhfQ0gzMwkJMHgwMDAwN0YwMGx1CisjZGVmaW5lCVRYX0NIMzQJCTB4MDA3RjAwMDBsdQorI2RlZmluZQlUWF9DSDM1CQkweDdGMDAwMDAwbHUKKworCisvKiBNWFZSX1JPVVRJTkdfOSBNYXNrcyAqLworCisjZGVmaW5lCU1VVEVfQ0gzNgkweDAwMDAwMDgwbHUKKyNkZWZpbmUJTVVURV9DSDM3CTB4MDAwMDgwMDBsdQorI2RlZmluZQlNVVRFX0NIMzgJMHgwMDgwMDAwMGx1CisjZGVmaW5lCU1VVEVfQ0gzOQkweDgwMDAwMDAwbHUKKworI2RlZmluZQlUWF9DSDM2CQkweDAwMDAwMDdGbHUKKyNkZWZpbmUJVFhfQ0gzNwkJMHgwMDAwN0YwMGx1CisjZGVmaW5lCVRYX0NIMzgJCTB4MDA3RjAwMDBsdQorI2RlZmluZQlUWF9DSDM5CQkweDdGMDAwMDAwbHUKKworCisvKiBNWFZSX1JPVVRJTkdfMTAgTWFza3MgKi8KKworI2RlZmluZQlNVVRFX0NINDAJMHgwMDAwMDA4MGx1CisjZGVmaW5lCU1VVEVfQ0g0MQkweDAwMDA4MDAwbHUKKyNkZWZpbmUJTVVURV9DSDQyCTB4MDA4MDAwMDBsdQorI2RlZmluZQlNVVRFX0NINDMJMHg4MDAwMDAwMGx1CisKKyNkZWZpbmUJVFhfQ0g0MAkJMHgwMDAwMDA3Rmx1CisjZGVmaW5lCVRYX0NINDEJCTB4MDAwMDdGMDBsdQorI2RlZmluZQlUWF9DSDQyCQkweDAwN0YwMDAwbHUKKyNkZWZpbmUJVFhfQ0g0MwkJMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9ST1VUSU5HXzExIE1hc2tzICovCisKKyNkZWZpbmUJTVVURV9DSDQ0CTB4MDAwMDAwODBsdQorI2RlZmluZQlNVVRFX0NINDUJMHgwMDAwODAwMGx1CisjZGVmaW5lCU1VVEVfQ0g0NgkweDAwODAwMDAwbHUKKyNkZWZpbmUJTVVURV9DSDQ3CTB4ODAwMDAwMDBsdQorCisjZGVmaW5lCVRYX0NINDQJCTB4MDAwMDAwN0ZsdQorI2RlZmluZQlUWF9DSDQ1CQkweDAwMDA3RjAwbHUKKyNkZWZpbmUJVFhfQ0g0NgkJMHgwMDdGMDAwMGx1CisjZGVmaW5lCVRYX0NINDcJCTB4N0YwMDAwMDBsdQorCisKKy8qIE1YVlJfUk9VVElOR18xMiBNYXNrcyAqLworCisjZGVmaW5lCU1VVEVfQ0g0OAkweDAwMDAwMDgwbHUKKyNkZWZpbmUJTVVURV9DSDQ5CTB4MDAwMDgwMDBsdQorI2RlZmluZQlNVVRFX0NINTAJMHgwMDgwMDAwMGx1CisjZGVmaW5lCU1VVEVfQ0g1MQkweDgwMDAwMDAwbHUKKworI2RlZmluZQlUWF9DSDQ4CQkweDAwMDAwMDdGbHUKKyNkZWZpbmUJVFhfQ0g0OQkJMHgwMDAwN0YwMGx1CisjZGVmaW5lCVRYX0NINTAJCTB4MDA3RjAwMDBsdQorI2RlZmluZQlUWF9DSDUxCQkweDdGMDAwMDAwbHUKKworCisvKiBNWFZSX1JPVVRJTkdfMTMgTWFza3MgKi8KKworI2RlZmluZQlNVVRFX0NINTIJMHgwMDAwMDA4MGx1CisjZGVmaW5lCU1VVEVfQ0g1MwkweDAwMDA4MDAwbHUKKyNkZWZpbmUJTVVURV9DSDU0CTB4MDA4MDAwMDBsdQorI2RlZmluZQlNVVRFX0NINTUJMHg4MDAwMDAwMGx1CisKKyNkZWZpbmUJVFhfQ0g1MgkJMHgwMDAwMDA3Rmx1CisjZGVmaW5lCVRYX0NINTMJCTB4MDAwMDdGMDBsdQorI2RlZmluZQlUWF9DSDU0CQkweDAwN0YwMDAwbHUKKyNkZWZpbmUJVFhfQ0g1NQkJMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9ST1VUSU5HXzE0IE1hc2tzICovCisKKyNkZWZpbmUJTVVURV9DSDU2CTB4MDAwMDAwODBsdQorI2RlZmluZQlNVVRFX0NINTcJMHgwMDAwODAwMGx1CisjZGVmaW5lCU1VVEVfQ0g1OAkweDAwODAwMDAwbHUKKyNkZWZpbmUJTVVURV9DSDU5CTB4ODAwMDAwMDBsdQorCisjZGVmaW5lCVRYX0NINTYJCTB4MDAwMDAwN0ZsdQorI2RlZmluZQlUWF9DSDU3CQkweDAwMDA3RjAwbHUKKyNkZWZpbmUJVFhfQ0g1OAkJMHgwMDdGMDAwMGx1CisjZGVmaW5lCVRYX0NINTkJCTB4N0YwMDAwMDBsdQorCisKKy8qIENvbnRyb2wgTWVzc2FnZSBSZWNlaXZlIEJ1ZmZlciAoQ01SQikgQWRkcmVzcyBPZmZzZXRzICovCisKKyNkZWZpbmUJQ01SQl9TVFJJREUJICAweDAwMDAwMDE2bHUKKworI2RlZmluZQlDTVJCX0RTVF9PRkZTRVQJICAweDAwMDAwMDAwbHUKKyNkZWZpbmUJQ01SQl9TUkNfT0ZGU0VUCSAgMHgwMDAwMDAwMmx1CisjZGVmaW5lCUNNUkJfREFUQV9PRkZTRVQgIDB4MDAwMDAwMDVsdQorCisKKy8qIENvbnRyb2wgTWVzc2FnZSBUcmFuc21pdCBCdWZmZXIgKENNVEIpIEFkZHJlc3MgT2Zmc2V0cyAqLworCisjZGVmaW5lCUNNVEJfUFJJT19PRkZTRVQgICAgMHgwMDAwMDAwMGx1CisjZGVmaW5lCUNNVEJfRFNUX09GRlNFVAkgICAgMHgwMDAwMDAwMmx1CisjZGVmaW5lCUNNVEJfU1JDX09GRlNFVAkgICAgMHgwMDAwMDAwNGx1CisjZGVmaW5lCUNNVEJfVFlQRV9PRkZTRVQgICAgMHgwMDAwMDAwNmx1CisjZGVmaW5lCUNNVEJfREFUQV9PRkZTRVQgICAgMHgwMDAwMDAwN2x1CisKKyNkZWZpbmUJQ01UQl9BTlNXRVJfT0ZGU0VUICAweDAwMDAwMDBBbHUKKworI2RlZmluZQlDTVRCX1NUQVRfTl9PRkZTRVQgIDB4MDAwMDAwMThsdQorI2RlZmluZQlDTVRCX1NUQVRfQV9PRkZTRVQgIDB4MDAwMDAwMTZsdQorI2RlZmluZQlDTVRCX1NUQVRfRF9PRkZTRVQgIDB4MDAwMDAwMEVsdQorI2RlZmluZQlDTVRCX1NUQVRfUl9PRkZTRVQgIDB4MDAwMDAwMTRsdQorI2RlZmluZQlDTVRCX1NUQVRfV19PRkZTRVQgIDB4MDAwMDAwMTRsdQorI2RlZmluZQlDTVRCX1NUQVRfR19PRkZTRVQgIDB4MDAwMDAwMTRsdQorCisKKy8qIEFzeW5jaHJvbm91cwlQYWNrZXQgUmVjZWl2ZSBCdWZmZXIgKEFQUkIpIEFkZHJlc3MgT2Zmc2V0cyAqLworCisjZGVmaW5lCUFQUkJfU1RSSURFCSAgMHgwMDAwMDQwMGx1CisKKyNkZWZpbmUJQVBSQl9EU1RfT0ZGU0VUCSAgMHgwMDAwMDAwMGx1CisjZGVmaW5lCUFQUkJfTEVOX09GRlNFVAkgIDB4MDAwMDAwMDJsdQorI2RlZmluZQlBUFJCX1NSQ19PRkZTRVQJICAweDAwMDAwMDA0bHUKKyNkZWZpbmUJQVBSQl9EQVRBX09GRlNFVCAgMHgwMDAwMDAwNmx1CisKKworLyogQXN5bmNocm9ub3VzCVBhY2tldCBUcmFuc21pdAlCdWZmZXIgKEFQVEIpIEFkZHJlc3MgT2Zmc2V0cyAqLworCisjZGVmaW5lCUFQVEJfUFJJT19PRkZTRVQgIDB4MDAwMDAwMDBsdQorI2RlZmluZQlBUFRCX0RTVF9PRkZTRVQJICAweDAwMDAwMDAybHUKKyNkZWZpbmUJQVBUQl9MRU5fT0ZGU0VUCSAgMHgwMDAwMDAwNGx1CisjZGVmaW5lCUFQVEJfU1JDX09GRlNFVAkgIDB4MDAwMDAwMDZsdQorI2RlZmluZQlBUFRCX0RBVEFfT0ZGU0VUICAweDAwMDAwMDA4bHUKKworCisvKiBSZW1vdGUgUmVhZCBCdWZmZXIgKFJSREIpIEFkZHJlc3MgT2Zmc2V0cyAqLworCisjZGVmaW5lCVJSREJfV0FERFJfT0ZGU0VUIDB4MDAwMDAxMDBsdQorI2RlZmluZQlSUkRCX1dMRU5fT0ZGU0VUICAweDAwMDAwMTAxbHUKKworCisKKy8qICoqKioqKioqKioqKgkgQ09OVFJPTExFUiBBUkVBIE5FVFdPUksgKENBTikgTUFTS1MgICoqKioqKioqKioqKioqKi8KKy8qIENBTl9DT05UUk9MIE1hc2tzCQkJCQkgKi8KKyNkZWZpbmUJU1JTCQkJMHgwMDAxCS8qIFNvZnR3YXJlIFJlc2V0ICovCisjZGVmaW5lCUROTQkJCTB4MDAwMgkvKiBEZXZpY2UgTmV0IE1vZGUgKi8KKyNkZWZpbmUJQUJPCQkJMHgwMDA0CS8qIEF1dG8tQnVzIE9uIEVuYWJsZSAqLworI2RlZmluZQlXQkEJCQkweDAwMTAJLyogV2FrZS1VcCBPbiBDQU4gQnVzIEFjdGl2aXR5IEVuYWJsZSAqLworI2RlZmluZQlTTVIJCQkweDAwMjAJLyogU2xlZXAgTW9kZSBSZXF1ZXN0ICovCisjZGVmaW5lCUNTUgkJCTB4MDA0MAkvKiBDQU4gU3VzcGVuZCBNb2RlIFJlcXVlc3QgKi8KKyNkZWZpbmUJQ0NSCQkJMHgwMDgwCS8qIENBTiBDb25maWd1cmF0aW9uIE1vZGUgUmVxdWVzdCAqLworCisvKiBDQU5fU1RBVFVTIE1hc2tzCQkJCQkgKi8KKyNkZWZpbmUJV1QJCQkweDAwMDEJLyogVFggV2FybmluZyBGbGFnICovCisjZGVmaW5lCVdSCQkJMHgwMDAyCS8qIFJYIFdhcm5pbmcgRmxhZyAqLworI2RlZmluZQlFUAkJCTB4MDAwNAkvKiBFcnJvciBQYXNzaXZlIE1vZGUgKi8KKyNkZWZpbmUJRUJPCQkJMHgwMDA4CS8qIEVycm9yIEJ1cyBPZmYgTW9kZSAqLworI2RlZmluZQlDU0EJCQkweDAwNDAJLyogU3VzcGVuZCBNb2RlCUFja25vd2xlZGdlICovCisjZGVmaW5lCUNDQQkJCTB4MDA4MAkvKiBDb25maWd1cmF0aW9uIE1vZGUgQWNrbm93bGVkZ2UgKi8KKyNkZWZpbmUJTUJQVFIJCTB4MUYwMAkvKiBNYWlsYm94IFBvaW50ZXIgKi8KKyNkZWZpbmUJVFJNCQkJMHg0MDAwCS8qIFRyYW5zbWl0IE1vZGUgKi8KKyNkZWZpbmUJUkVDCQkJMHg4MDAwCS8qIFJlY2VpdmUgTW9kZSAqLworCisvKiBDQU5fQ0xPQ0sgTWFza3MJCSAqLworI2RlZmluZQlCUlAJCQkweDAzRkYJLyogQml0LVJhdGUgUHJlLVNjYWxlciAqLworCisvKiBDQU5fVElNSU5HIE1hc2tzCQkJCSAqLworI2RlZmluZQlUU0VHMQkJMHgwMDBGCS8qIFRpbWUJU2VnbWVudAkxICovCisjZGVmaW5lCVRTRUcyCQkweDAwNzAJLyogVGltZQlTZWdtZW50CTIgKi8KKyNkZWZpbmUJU0FNCQkJMHgwMDgwCS8qIFNhbXBsaW5nICovCisjZGVmaW5lCVNKVwkJCTB4MDMwMAkvKiBTeW5jaHJvbml6YXRpb24gSnVtcAlXaWR0aCAqLworCisvKiBDQU5fREVCVUcgTWFza3MJCQkJICovCisjZGVmaW5lCURFQwkJCTB4MDAwMQkvKiBEaXNhYmxlIENBTiBFcnJvciBDb3VudGVycyAqLworI2RlZmluZQlEUkkJCQkweDAwMDIJLyogRGlzYWJsZSBDQU4gUlggSW5wdXQgKi8KKyNkZWZpbmUJRFRPCQkJMHgwMDA0CS8qIERpc2FibGUgQ0FOIFRYIE91dHB1dCAqLworI2RlZmluZQlESUwJCQkweDAwMDgJLyogRGlzYWJsZSBDQU4gSW50ZXJuYWwJTG9vcCAqLworI2RlZmluZQlNQUEJCQkweDAwMTAJLyogTW9kZQlBdXRvLUFja25vd2xlZGdlIEVuYWJsZSAqLworI2RlZmluZQlNUkIJCQkweDAwMjAJLyogTW9kZQlSZWFkIEJhY2sgRW5hYmxlICovCisjZGVmaW5lCUNERQkJCTB4ODAwMAkvKiBDQU4gRGVidWcgRW5hYmxlICovCisKKy8qIENBTl9DRUMgTWFza3MJCQkgKi8KKyNkZWZpbmUJUlhFQ05UCQkweDAwRkYJLyogUmVjZWl2ZSBFcnJvciBDb3VudGVyICovCisjZGVmaW5lCVRYRUNOVAkJMHhGRjAwCS8qIFRyYW5zbWl0IEVycm9yIENvdW50ZXIgKi8KKworLyogQ0FOX0lOVFIgTWFza3MJCQkJICovCisjZGVmaW5lCU1CUklSUQkweDAwMDEJLyogTWFpbGJveCBSZWNlaXZlIEludGVycnVwdCAqLworI2RlZmluZQlNQlJJRgkJTUJSSVJRCS8qIGxlZ2FjeSAqLworI2RlZmluZQlNQlRJUlEJMHgwMDAyCS8qIE1haWxib3ggVHJhbnNtaXQgSW50ZXJydXB0ICovCisjZGVmaW5lCU1CVElGCQlNQlRJUlEJLyogbGVnYWN5ICovCisjZGVmaW5lCUdJUlEJCTB4MDAwNAkvKiBHbG9iYWwgSW50ZXJydXB0ICovCisjZGVmaW5lCVNNQUNLCQkweDAwMDgJLyogU2xlZXAgTW9kZSBBY2tub3dsZWRnZSAqLworI2RlZmluZQlDQU5UWAkJMHgwMDQwCS8qIENBTiBUWCBCdXMgVmFsdWUgKi8KKyNkZWZpbmUJQ0FOUlgJCTB4MDA4MAkvKiBDQU4gUlggQnVzIFZhbHVlICovCisKKy8qIENBTl9NQnh4X0lEMQlhbmQgQ0FOX01CeHhfSUQwIE1hc2tzCQkJICovCisjZGVmaW5lCURGQwkJCTB4RkZGRgkvKiBEYXRhCUZpbHRlcmluZyBDb2RlIChJZiBFbmFibGVkKSAoSUQwKSAqLworI2RlZmluZQlFWFRJRF9MTwkweEZGRkYJLyogTG93ZXIgMTYgQml0cyBvZiBFeHRlbmRlZCBJZGVudGlmaWVyCShJRDApICovCisjZGVmaW5lCUVYVElEX0hJCTB4MDAwMwkvKiBVcHBlciAyIEJpdHMJb2YgRXh0ZW5kZWQgSWRlbnRpZmllciAoSUQxKSAqLworI2RlZmluZQlCQVNFSUQJCTB4MUZGQwkvKiBCYXNlCUlkZW50aWZpZXIJICovCisjZGVmaW5lCUlERQkJCTB4MjAwMAkvKiBJZGVudGlmaWVyIEV4dGVuc2lvbiAqLworI2RlZmluZQlSVFIJCQkweDQwMDAJLyogUmVtb3RlIEZyYW1lCVRyYW5zbWlzc2lvbiBSZXF1ZXN0ICovCisjZGVmaW5lCUFNRQkJCTB4ODAwMAkvKiBBY2NlcHRhbmNlIE1hc2sgRW5hYmxlICovCisKKy8qIENBTl9NQnh4X1RJTUVTVEFNUCBNYXNrcyAqLworI2RlZmluZQlUU1YJCQkweEZGRkYJLyogVGltZXN0YW1wICovCisKKy8qIENBTl9NQnh4X0xFTkdUSCBNYXNrcyAqLworI2RlZmluZQlETEMJCQkweDAwMEYJLyogRGF0YQlMZW5ndGggQ29kZSAqLworCisvKiBDQU5fQU14eEggYW5kIENBTl9BTXh4TCBNYXNrcwkJCQkJICovCisjZGVmaW5lCURGTQkJCTB4RkZGRgkvKiBEYXRhCUZpZWxkIE1hc2sgKElmIEVuYWJsZWQpCShDQU5fQU14eEwpICovCisjZGVmaW5lCUVYVElEX0xPCTB4RkZGRgkvKiBMb3dlciAxNiBCaXRzIG9mIEV4dGVuZGVkIElkZW50aWZpZXIJKENBTl9BTXh4TCkgKi8KKyNkZWZpbmUJRVhUSURfSEkJMHgwMDAzCS8qIFVwcGVyIDIgQml0cwlvZiBFeHRlbmRlZCBJZGVudGlmaWVyIChDQU5fQU14eEgpICovCisjZGVmaW5lCUJBU0VJRAkJMHgxRkZDCS8qIEJhc2UJSWRlbnRpZmllcgkJICovCisjZGVmaW5lCUFNSURFCQkweDIwMDAJLyogQWNjZXB0YW5jZSBNYXNrIElEIEV4dGVuc2lvbglFbmFibGUgKi8KKyNkZWZpbmUJRk1ECQkJMHg0MDAwCS8qIEZ1bGwJTWFzayBEYXRhIEZpZWxkCUVuYWJsZSAqLworI2RlZmluZQlGREYJCQkweDgwMDAJLyogRmlsdGVyIE9uIERhdGEgRmllbGQJRW5hYmxlICovCisKKy8qIENBTl9NQzEgTWFza3MJCSAqLworI2RlZmluZQlNQzAJCQkweDAwMDEJLyogRW5hYmxlIE1haWxib3ggMCAqLworI2RlZmluZQlNQzEJCQkweDAwMDIJLyogRW5hYmxlIE1haWxib3ggMSAqLworI2RlZmluZQlNQzIJCQkweDAwMDQJLyogRW5hYmxlIE1haWxib3ggMiAqLworI2RlZmluZQlNQzMJCQkweDAwMDgJLyogRW5hYmxlIE1haWxib3ggMyAqLworI2RlZmluZQlNQzQJCQkweDAwMTAJLyogRW5hYmxlIE1haWxib3ggNCAqLworI2RlZmluZQlNQzUJCQkweDAwMjAJLyogRW5hYmxlIE1haWxib3ggNSAqLworI2RlZmluZQlNQzYJCQkweDAwNDAJLyogRW5hYmxlIE1haWxib3ggNiAqLworI2RlZmluZQlNQzcJCQkweDAwODAJLyogRW5hYmxlIE1haWxib3ggNyAqLworI2RlZmluZQlNQzgJCQkweDAxMDAJLyogRW5hYmxlIE1haWxib3ggOCAqLworI2RlZmluZQlNQzkJCQkweDAyMDAJLyogRW5hYmxlIE1haWxib3ggOSAqLworI2RlZmluZQlNQzEwCQkweDA0MDAJLyogRW5hYmxlIE1haWxib3ggMTAgKi8KKyNkZWZpbmUJTUMxMQkJMHgwODAwCS8qIEVuYWJsZSBNYWlsYm94IDExICovCisjZGVmaW5lCU1DMTIJCTB4MTAwMAkvKiBFbmFibGUgTWFpbGJveCAxMiAqLworI2RlZmluZQlNQzEzCQkweDIwMDAJLyogRW5hYmxlIE1haWxib3ggMTMgKi8KKyNkZWZpbmUJTUMxNAkJMHg0MDAwCS8qIEVuYWJsZSBNYWlsYm94IDE0ICovCisjZGVmaW5lCU1DMTUJCTB4ODAwMAkvKiBFbmFibGUgTWFpbGJveCAxNSAqLworCisvKiBDQU5fTUMyIE1hc2tzCQkgKi8KKyNkZWZpbmUJTUMxNgkJMHgwMDAxCS8qIEVuYWJsZSBNYWlsYm94IDE2ICovCisjZGVmaW5lCU1DMTcJCTB4MDAwMgkvKiBFbmFibGUgTWFpbGJveCAxNyAqLworI2RlZmluZQlNQzE4CQkweDAwMDQJLyogRW5hYmxlIE1haWxib3ggMTggKi8KKyNkZWZpbmUJTUMxOQkJMHgwMDA4CS8qIEVuYWJsZSBNYWlsYm94IDE5ICovCisjZGVmaW5lCU1DMjAJCTB4MDAxMAkvKiBFbmFibGUgTWFpbGJveCAyMCAqLworI2RlZmluZQlNQzIxCQkweDAwMjAJLyogRW5hYmxlIE1haWxib3ggMjEgKi8KKyNkZWZpbmUJTUMyMgkJMHgwMDQwCS8qIEVuYWJsZSBNYWlsYm94IDIyICovCisjZGVmaW5lCU1DMjMJCTB4MDA4MAkvKiBFbmFibGUgTWFpbGJveCAyMyAqLworI2RlZmluZQlNQzI0CQkweDAxMDAJLyogRW5hYmxlIE1haWxib3ggMjQgKi8KKyNkZWZpbmUJTUMyNQkJMHgwMjAwCS8qIEVuYWJsZSBNYWlsYm94IDI1ICovCisjZGVmaW5lCU1DMjYJCTB4MDQwMAkvKiBFbmFibGUgTWFpbGJveCAyNiAqLworI2RlZmluZQlNQzI3CQkweDA4MDAJLyogRW5hYmxlIE1haWxib3ggMjcgKi8KKyNkZWZpbmUJTUMyOAkJMHgxMDAwCS8qIEVuYWJsZSBNYWlsYm94IDI4ICovCisjZGVmaW5lCU1DMjkJCTB4MjAwMAkvKiBFbmFibGUgTWFpbGJveCAyOSAqLworI2RlZmluZQlNQzMwCQkweDQwMDAJLyogRW5hYmxlIE1haWxib3ggMzAgKi8KKyNkZWZpbmUJTUMzMQkJMHg4MDAwCS8qIEVuYWJsZSBNYWlsYm94IDMxICovCisKKy8qIENBTl9NRDEgTWFza3MJCQkJCSAqLworI2RlZmluZQlNRDAJCQkweDAwMDEJLyogRW5hYmxlIE1haWxib3ggMCBGb3IJUmVjZWl2ZSAqLworI2RlZmluZQlNRDEJCQkweDAwMDIJLyogRW5hYmxlIE1haWxib3ggMSBGb3IJUmVjZWl2ZSAqLworI2RlZmluZQlNRDIJCQkweDAwMDQJLyogRW5hYmxlIE1haWxib3ggMiBGb3IJUmVjZWl2ZSAqLworI2RlZmluZQlNRDMJCQkweDAwMDgJLyogRW5hYmxlIE1haWxib3ggMyBGb3IJUmVjZWl2ZSAqLworI2RlZmluZQlNRDQJCQkweDAwMTAJLyogRW5hYmxlIE1haWxib3ggNCBGb3IJUmVjZWl2ZSAqLworI2RlZmluZQlNRDUJCQkweDAwMjAJLyogRW5hYmxlIE1haWxib3ggNSBGb3IJUmVjZWl2ZSAqLworI2RlZmluZQlNRDYJCQkweDAwNDAJLyogRW5hYmxlIE1haWxib3ggNiBGb3IJUmVjZWl2ZSAqLworI2RlZmluZQlNRDcJCQkweDAwODAJLyogRW5hYmxlIE1haWxib3ggNyBGb3IJUmVjZWl2ZSAqLworI2RlZmluZQlNRDgJCQkweDAxMDAJLyogRW5hYmxlIE1haWxib3ggOCBGb3IJUmVjZWl2ZSAqLworI2RlZmluZQlNRDkJCQkweDAyMDAJLyogRW5hYmxlIE1haWxib3ggOSBGb3IJUmVjZWl2ZSAqLworI2RlZmluZQlNRDEwCQkweDA0MDAJLyogRW5hYmxlIE1haWxib3ggMTAgRm9yIFJlY2VpdmUgKi8KKyNkZWZpbmUJTUQxMQkJMHgwODAwCS8qIEVuYWJsZSBNYWlsYm94IDExIEZvciBSZWNlaXZlICovCisjZGVmaW5lCU1EMTIJCTB4MTAwMAkvKiBFbmFibGUgTWFpbGJveCAxMiBGb3IgUmVjZWl2ZSAqLworI2RlZmluZQlNRDEzCQkweDIwMDAJLyogRW5hYmxlIE1haWxib3ggMTMgRm9yIFJlY2VpdmUgKi8KKyNkZWZpbmUJTUQxNAkJMHg0MDAwCS8qIEVuYWJsZSBNYWlsYm94IDE0IEZvciBSZWNlaXZlICovCisjZGVmaW5lCU1EMTUJCTB4ODAwMAkvKiBFbmFibGUgTWFpbGJveCAxNSBGb3IgUmVjZWl2ZSAqLworCisvKiBDQU5fTUQyIE1hc2tzCQkJCQkgKi8KKyNkZWZpbmUJTUQxNgkJMHgwMDAxCS8qIEVuYWJsZSBNYWlsYm94IDE2IEZvciBSZWNlaXZlICovCisjZGVmaW5lCU1EMTcJCTB4MDAwMgkvKiBFbmFibGUgTWFpbGJveCAxNyBGb3IgUmVjZWl2ZSAqLworI2RlZmluZQlNRDE4CQkweDAwMDQJLyogRW5hYmxlIE1haWxib3ggMTggRm9yIFJlY2VpdmUgKi8KKyNkZWZpbmUJTUQxOQkJMHgwMDA4CS8qIEVuYWJsZSBNYWlsYm94IDE5IEZvciBSZWNlaXZlICovCisjZGVmaW5lCU1EMjAJCTB4MDAxMAkvKiBFbmFibGUgTWFpbGJveCAyMCBGb3IgUmVjZWl2ZSAqLworI2RlZmluZQlNRDIxCQkweDAwMjAJLyogRW5hYmxlIE1haWxib3ggMjEgRm9yIFJlY2VpdmUgKi8KKyNkZWZpbmUJTUQyMgkJMHgwMDQwCS8qIEVuYWJsZSBNYWlsYm94IDIyIEZvciBSZWNlaXZlICovCisjZGVmaW5lCU1EMjMJCTB4MDA4MAkvKiBFbmFibGUgTWFpbGJveCAyMyBGb3IgUmVjZWl2ZSAqLworI2RlZmluZQlNRDI0CQkweDAxMDAJLyogRW5hYmxlIE1haWxib3ggMjQgRm9yIFJlY2VpdmUgKi8KKyNkZWZpbmUJTUQyNQkJMHgwMjAwCS8qIEVuYWJsZSBNYWlsYm94IDI1IEZvciBSZWNlaXZlICovCisjZGVmaW5lCU1EMjYJCTB4MDQwMAkvKiBFbmFibGUgTWFpbGJveCAyNiBGb3IgUmVjZWl2ZSAqLworI2RlZmluZQlNRDI3CQkweDA4MDAJLyogRW5hYmxlIE1haWxib3ggMjcgRm9yIFJlY2VpdmUgKi8KKyNkZWZpbmUJTUQyOAkJMHgxMDAwCS8qIEVuYWJsZSBNYWlsYm94IDI4IEZvciBSZWNlaXZlICovCisjZGVmaW5lCU1EMjkJCTB4MjAwMAkvKiBFbmFibGUgTWFpbGJveCAyOSBGb3IgUmVjZWl2ZSAqLworI2RlZmluZQlNRDMwCQkweDQwMDAJLyogRW5hYmxlIE1haWxib3ggMzAgRm9yIFJlY2VpdmUgKi8KKyNkZWZpbmUJTUQzMQkJMHg4MDAwCS8qIEVuYWJsZSBNYWlsYm94IDMxIEZvciBSZWNlaXZlICovCisKKy8qIENBTl9STVAxIE1hc2tzCQkJCQkgKi8KKyNkZWZpbmUJUk1QMAkJMHgwMDAxCS8qIFJYIE1lc3NhZ2UgUGVuZGluZyBJbiBNYWlsYm94IDAgKi8KKyNkZWZpbmUJUk1QMQkJMHgwMDAyCS8qIFJYIE1lc3NhZ2UgUGVuZGluZyBJbiBNYWlsYm94IDEgKi8KKyNkZWZpbmUJUk1QMgkJMHgwMDA0CS8qIFJYIE1lc3NhZ2UgUGVuZGluZyBJbiBNYWlsYm94IDIgKi8KKyNkZWZpbmUJUk1QMwkJMHgwMDA4CS8qIFJYIE1lc3NhZ2UgUGVuZGluZyBJbiBNYWlsYm94IDMgKi8KKyNkZWZpbmUJUk1QNAkJMHgwMDEwCS8qIFJYIE1lc3NhZ2UgUGVuZGluZyBJbiBNYWlsYm94IDQgKi8KKyNkZWZpbmUJUk1QNQkJMHgwMDIwCS8qIFJYIE1lc3NhZ2UgUGVuZGluZyBJbiBNYWlsYm94IDUgKi8KKyNkZWZpbmUJUk1QNgkJMHgwMDQwCS8qIFJYIE1lc3NhZ2UgUGVuZGluZyBJbiBNYWlsYm94IDYgKi8KKyNkZWZpbmUJUk1QNwkJMHgwMDgwCS8qIFJYIE1lc3NhZ2UgUGVuZGluZyBJbiBNYWlsYm94IDcgKi8KKyNkZWZpbmUJUk1QOAkJMHgwMTAwCS8qIFJYIE1lc3NhZ2UgUGVuZGluZyBJbiBNYWlsYm94IDggKi8KKyNkZWZpbmUJUk1QOQkJMHgwMjAwCS8qIFJYIE1lc3NhZ2UgUGVuZGluZyBJbiBNYWlsYm94IDkgKi8KKyNkZWZpbmUJUk1QMTAJCTB4MDQwMAkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCAxMCAqLworI2RlZmluZQlSTVAxMQkJMHgwODAwCS8qIFJYIE1lc3NhZ2UgUGVuZGluZyBJbiBNYWlsYm94IDExICovCisjZGVmaW5lCVJNUDEyCQkweDEwMDAJLyogUlggTWVzc2FnZSBQZW5kaW5nIEluIE1haWxib3ggMTIgKi8KKyNkZWZpbmUJUk1QMTMJCTB4MjAwMAkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCAxMyAqLworI2RlZmluZQlSTVAxNAkJMHg0MDAwCS8qIFJYIE1lc3NhZ2UgUGVuZGluZyBJbiBNYWlsYm94IDE0ICovCisjZGVmaW5lCVJNUDE1CQkweDgwMDAJLyogUlggTWVzc2FnZSBQZW5kaW5nIEluIE1haWxib3ggMTUgKi8KKworLyogQ0FOX1JNUDIgTWFza3MJCQkJCSAqLworI2RlZmluZQlSTVAxNgkJMHgwMDAxCS8qIFJYIE1lc3NhZ2UgUGVuZGluZyBJbiBNYWlsYm94IDE2ICovCisjZGVmaW5lCVJNUDE3CQkweDAwMDIJLyogUlggTWVzc2FnZSBQZW5kaW5nIEluIE1haWxib3ggMTcgKi8KKyNkZWZpbmUJUk1QMTgJCTB4MDAwNAkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCAxOCAqLworI2RlZmluZQlSTVAxOQkJMHgwMDA4CS8qIFJYIE1lc3NhZ2UgUGVuZGluZyBJbiBNYWlsYm94IDE5ICovCisjZGVmaW5lCVJNUDIwCQkweDAwMTAJLyogUlggTWVzc2FnZSBQZW5kaW5nIEluIE1haWxib3ggMjAgKi8KKyNkZWZpbmUJUk1QMjEJCTB4MDAyMAkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCAyMSAqLworI2RlZmluZQlSTVAyMgkJMHgwMDQwCS8qIFJYIE1lc3NhZ2UgUGVuZGluZyBJbiBNYWlsYm94IDIyICovCisjZGVmaW5lCVJNUDIzCQkweDAwODAJLyogUlggTWVzc2FnZSBQZW5kaW5nIEluIE1haWxib3ggMjMgKi8KKyNkZWZpbmUJUk1QMjQJCTB4MDEwMAkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCAyNCAqLworI2RlZmluZQlSTVAyNQkJMHgwMjAwCS8qIFJYIE1lc3NhZ2UgUGVuZGluZyBJbiBNYWlsYm94IDI1ICovCisjZGVmaW5lCVJNUDI2CQkweDA0MDAJLyogUlggTWVzc2FnZSBQZW5kaW5nIEluIE1haWxib3ggMjYgKi8KKyNkZWZpbmUJUk1QMjcJCTB4MDgwMAkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCAyNyAqLworI2RlZmluZQlSTVAyOAkJMHgxMDAwCS8qIFJYIE1lc3NhZ2UgUGVuZGluZyBJbiBNYWlsYm94IDI4ICovCisjZGVmaW5lCVJNUDI5CQkweDIwMDAJLyogUlggTWVzc2FnZSBQZW5kaW5nIEluIE1haWxib3ggMjkgKi8KKyNkZWZpbmUJUk1QMzAJCTB4NDAwMAkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCAzMCAqLworI2RlZmluZQlSTVAzMQkJMHg4MDAwCS8qIFJYIE1lc3NhZ2UgUGVuZGluZyBJbiBNYWlsYm94IDMxICovCisKKy8qIENBTl9STUwxIE1hc2tzCQkJCQkgKi8KKyNkZWZpbmUJUk1MMAkJMHgwMDAxCS8qIFJYIE1lc3NhZ2UgTG9zdCBJbiBNYWlsYm94IDAgKi8KKyNkZWZpbmUJUk1MMQkJMHgwMDAyCS8qIFJYIE1lc3NhZ2UgTG9zdCBJbiBNYWlsYm94IDEgKi8KKyNkZWZpbmUJUk1MMgkJMHgwMDA0CS8qIFJYIE1lc3NhZ2UgTG9zdCBJbiBNYWlsYm94IDIgKi8KKyNkZWZpbmUJUk1MMwkJMHgwMDA4CS8qIFJYIE1lc3NhZ2UgTG9zdCBJbiBNYWlsYm94IDMgKi8KKyNkZWZpbmUJUk1MNAkJMHgwMDEwCS8qIFJYIE1lc3NhZ2UgTG9zdCBJbiBNYWlsYm94IDQgKi8KKyNkZWZpbmUJUk1MNQkJMHgwMDIwCS8qIFJYIE1lc3NhZ2UgTG9zdCBJbiBNYWlsYm94IDUgKi8KKyNkZWZpbmUJUk1MNgkJMHgwMDQwCS8qIFJYIE1lc3NhZ2UgTG9zdCBJbiBNYWlsYm94IDYgKi8KKyNkZWZpbmUJUk1MNwkJMHgwMDgwCS8qIFJYIE1lc3NhZ2UgTG9zdCBJbiBNYWlsYm94IDcgKi8KKyNkZWZpbmUJUk1MOAkJMHgwMTAwCS8qIFJYIE1lc3NhZ2UgTG9zdCBJbiBNYWlsYm94IDggKi8KKyNkZWZpbmUJUk1MOQkJMHgwMjAwCS8qIFJYIE1lc3NhZ2UgTG9zdCBJbiBNYWlsYm94IDkgKi8KKyNkZWZpbmUJUk1MMTAJCTB4MDQwMAkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCAxMCAqLworI2RlZmluZQlSTUwxMQkJMHgwODAwCS8qIFJYIE1lc3NhZ2UgTG9zdCBJbiBNYWlsYm94IDExICovCisjZGVmaW5lCVJNTDEyCQkweDEwMDAJLyogUlggTWVzc2FnZSBMb3N0IEluIE1haWxib3ggMTIgKi8KKyNkZWZpbmUJUk1MMTMJCTB4MjAwMAkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCAxMyAqLworI2RlZmluZQlSTUwxNAkJMHg0MDAwCS8qIFJYIE1lc3NhZ2UgTG9zdCBJbiBNYWlsYm94IDE0ICovCisjZGVmaW5lCVJNTDE1CQkweDgwMDAJLyogUlggTWVzc2FnZSBMb3N0IEluIE1haWxib3ggMTUgKi8KKworLyogQ0FOX1JNTDIgTWFza3MJCQkJCSAqLworI2RlZmluZQlSTUwxNgkJMHgwMDAxCS8qIFJYIE1lc3NhZ2UgTG9zdCBJbiBNYWlsYm94IDE2ICovCisjZGVmaW5lCVJNTDE3CQkweDAwMDIJLyogUlggTWVzc2FnZSBMb3N0IEluIE1haWxib3ggMTcgKi8KKyNkZWZpbmUJUk1MMTgJCTB4MDAwNAkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCAxOCAqLworI2RlZmluZQlSTUwxOQkJMHgwMDA4CS8qIFJYIE1lc3NhZ2UgTG9zdCBJbiBNYWlsYm94IDE5ICovCisjZGVmaW5lCVJNTDIwCQkweDAwMTAJLyogUlggTWVzc2FnZSBMb3N0IEluIE1haWxib3ggMjAgKi8KKyNkZWZpbmUJUk1MMjEJCTB4MDAyMAkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCAyMSAqLworI2RlZmluZQlSTUwyMgkJMHgwMDQwCS8qIFJYIE1lc3NhZ2UgTG9zdCBJbiBNYWlsYm94IDIyICovCisjZGVmaW5lCVJNTDIzCQkweDAwODAJLyogUlggTWVzc2FnZSBMb3N0IEluIE1haWxib3ggMjMgKi8KKyNkZWZpbmUJUk1MMjQJCTB4MDEwMAkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCAyNCAqLworI2RlZmluZQlSTUwyNQkJMHgwMjAwCS8qIFJYIE1lc3NhZ2UgTG9zdCBJbiBNYWlsYm94IDI1ICovCisjZGVmaW5lCVJNTDI2CQkweDA0MDAJLyogUlggTWVzc2FnZSBMb3N0IEluIE1haWxib3ggMjYgKi8KKyNkZWZpbmUJUk1MMjcJCTB4MDgwMAkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCAyNyAqLworI2RlZmluZQlSTUwyOAkJMHgxMDAwCS8qIFJYIE1lc3NhZ2UgTG9zdCBJbiBNYWlsYm94IDI4ICovCisjZGVmaW5lCVJNTDI5CQkweDIwMDAJLyogUlggTWVzc2FnZSBMb3N0IEluIE1haWxib3ggMjkgKi8KKyNkZWZpbmUJUk1MMzAJCTB4NDAwMAkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCAzMCAqLworI2RlZmluZQlSTUwzMQkJMHg4MDAwCS8qIFJYIE1lc3NhZ2UgTG9zdCBJbiBNYWlsYm94IDMxICovCisKKy8qIENBTl9PUFNTMSBNYXNrcwkJCQkJCQkJCQkJCQkgKi8KKyNkZWZpbmUJT1BTUzAJCTB4MDAwMQkvKiBFbmFibGUgUlggT3ZlcndyaXRlIFByb3RlY3Rpb24gb3IgVFgJU2luZ2xlLVNob3QgRm9yCU1haWxib3gJMCAqLworI2RlZmluZQlPUFNTMQkJMHgwMDAyCS8qIEVuYWJsZSBSWCBPdmVyd3JpdGUgUHJvdGVjdGlvbiBvciBUWAlTaW5nbGUtU2hvdCBGb3IJTWFpbGJveAkxICovCisjZGVmaW5lCU9QU1MyCQkweDAwMDQJLyogRW5hYmxlIFJYIE92ZXJ3cml0ZSBQcm90ZWN0aW9uIG9yIFRYCVNpbmdsZS1TaG90IEZvcglNYWlsYm94CTIgKi8KKyNkZWZpbmUJT1BTUzMJCTB4MDAwOAkvKiBFbmFibGUgUlggT3ZlcndyaXRlIFByb3RlY3Rpb24gb3IgVFgJU2luZ2xlLVNob3QgRm9yCU1haWxib3gJMyAqLworI2RlZmluZQlPUFNTNAkJMHgwMDEwCS8qIEVuYWJsZSBSWCBPdmVyd3JpdGUgUHJvdGVjdGlvbiBvciBUWAlTaW5nbGUtU2hvdCBGb3IJTWFpbGJveAk0ICovCisjZGVmaW5lCU9QU1M1CQkweDAwMjAJLyogRW5hYmxlIFJYIE92ZXJ3cml0ZSBQcm90ZWN0aW9uIG9yIFRYCVNpbmdsZS1TaG90IEZvcglNYWlsYm94CTUgKi8KKyNkZWZpbmUJT1BTUzYJCTB4MDA0MAkvKiBFbmFibGUgUlggT3ZlcndyaXRlIFByb3RlY3Rpb24gb3IgVFgJU2luZ2xlLVNob3QgRm9yCU1haWxib3gJNiAqLworI2RlZmluZQlPUFNTNwkJMHgwMDgwCS8qIEVuYWJsZSBSWCBPdmVyd3JpdGUgUHJvdGVjdGlvbiBvciBUWAlTaW5nbGUtU2hvdCBGb3IJTWFpbGJveAk3ICovCisjZGVmaW5lCU9QU1M4CQkweDAxMDAJLyogRW5hYmxlIFJYIE92ZXJ3cml0ZSBQcm90ZWN0aW9uIG9yIFRYCVNpbmdsZS1TaG90IEZvcglNYWlsYm94CTggKi8KKyNkZWZpbmUJT1BTUzkJCTB4MDIwMAkvKiBFbmFibGUgUlggT3ZlcndyaXRlIFByb3RlY3Rpb24gb3IgVFgJU2luZ2xlLVNob3QgRm9yCU1haWxib3gJOSAqLworI2RlZmluZQlPUFNTMTAJCTB4MDQwMAkvKiBFbmFibGUgUlggT3ZlcndyaXRlIFByb3RlY3Rpb24gb3IgVFgJU2luZ2xlLVNob3QgRm9yCU1haWxib3gJMTAgKi8KKyNkZWZpbmUJT1BTUzExCQkweDA4MDAJLyogRW5hYmxlIFJYIE92ZXJ3cml0ZSBQcm90ZWN0aW9uIG9yIFRYCVNpbmdsZS1TaG90IEZvcglNYWlsYm94CTExICovCisjZGVmaW5lCU9QU1MxMgkJMHgxMDAwCS8qIEVuYWJsZSBSWCBPdmVyd3JpdGUgUHJvdGVjdGlvbiBvciBUWAlTaW5nbGUtU2hvdCBGb3IJTWFpbGJveAkxMiAqLworI2RlZmluZQlPUFNTMTMJCTB4MjAwMAkvKiBFbmFibGUgUlggT3ZlcndyaXRlIFByb3RlY3Rpb24gb3IgVFgJU2luZ2xlLVNob3QgRm9yCU1haWxib3gJMTMgKi8KKyNkZWZpbmUJT1BTUzE0CQkweDQwMDAJLyogRW5hYmxlIFJYIE92ZXJ3cml0ZSBQcm90ZWN0aW9uIG9yIFRYCVNpbmdsZS1TaG90IEZvcglNYWlsYm94CTE0ICovCisjZGVmaW5lCU9QU1MxNQkJMHg4MDAwCS8qIEVuYWJsZSBSWCBPdmVyd3JpdGUgUHJvdGVjdGlvbiBvciBUWAlTaW5nbGUtU2hvdCBGb3IJTWFpbGJveAkxNSAqLworCisvKiBDQU5fT1BTUzIgTWFza3MJCQkJCQkJCQkJCQkJICovCisjZGVmaW5lCU9QU1MxNgkJMHgwMDAxCS8qIEVuYWJsZSBSWCBPdmVyd3JpdGUgUHJvdGVjdGlvbiBvciBUWAlTaW5nbGUtU2hvdCBGb3IJTWFpbGJveAkxNiAqLworI2RlZmluZQlPUFNTMTcJCTB4MDAwMgkvKiBFbmFibGUgUlggT3ZlcndyaXRlIFByb3RlY3Rpb24gb3IgVFgJU2luZ2xlLVNob3QgRm9yCU1haWxib3gJMTcgKi8KKyNkZWZpbmUJT1BTUzE4CQkweDAwMDQJLyogRW5hYmxlIFJYIE92ZXJ3cml0ZSBQcm90ZWN0aW9uIG9yIFRYCVNpbmdsZS1TaG90IEZvcglNYWlsYm94CTE4ICovCisjZGVmaW5lCU9QU1MxOQkJMHgwMDA4CS8qIEVuYWJsZSBSWCBPdmVyd3JpdGUgUHJvdGVjdGlvbiBvciBUWAlTaW5nbGUtU2hvdCBGb3IJTWFpbGJveAkxOSAqLworI2RlZmluZQlPUFNTMjAJCTB4MDAxMAkvKiBFbmFibGUgUlggT3ZlcndyaXRlIFByb3RlY3Rpb24gb3IgVFgJU2luZ2xlLVNob3QgRm9yCU1haWxib3gJMjAgKi8KKyNkZWZpbmUJT1BTUzIxCQkweDAwMjAJLyogRW5hYmxlIFJYIE92ZXJ3cml0ZSBQcm90ZWN0aW9uIG9yIFRYCVNpbmdsZS1TaG90IEZvcglNYWlsYm94CTIxICovCisjZGVmaW5lCU9QU1MyMgkJMHgwMDQwCS8qIEVuYWJsZSBSWCBPdmVyd3JpdGUgUHJvdGVjdGlvbiBvciBUWAlTaW5nbGUtU2hvdCBGb3IJTWFpbGJveAkyMiAqLworI2RlZmluZQlPUFNTMjMJCTB4MDA4MAkvKiBFbmFibGUgUlggT3ZlcndyaXRlIFByb3RlY3Rpb24gb3IgVFgJU2luZ2xlLVNob3QgRm9yCU1haWxib3gJMjMgKi8KKyNkZWZpbmUJT1BTUzI0CQkweDAxMDAJLyogRW5hYmxlIFJYIE92ZXJ3cml0ZSBQcm90ZWN0aW9uIG9yIFRYCVNpbmdsZS1TaG90IEZvcglNYWlsYm94CTI0ICovCisjZGVmaW5lCU9QU1MyNQkJMHgwMjAwCS8qIEVuYWJsZSBSWCBPdmVyd3JpdGUgUHJvdGVjdGlvbiBvciBUWAlTaW5nbGUtU2hvdCBGb3IJTWFpbGJveAkyNSAqLworI2RlZmluZQlPUFNTMjYJCTB4MDQwMAkvKiBFbmFibGUgUlggT3ZlcndyaXRlIFByb3RlY3Rpb24gb3IgVFgJU2luZ2xlLVNob3QgRm9yCU1haWxib3gJMjYgKi8KKyNkZWZpbmUJT1BTUzI3CQkweDA4MDAJLyogRW5hYmxlIFJYIE92ZXJ3cml0ZSBQcm90ZWN0aW9uIG9yIFRYCVNpbmdsZS1TaG90IEZvcglNYWlsYm94CTI3ICovCisjZGVmaW5lCU9QU1MyOAkJMHgxMDAwCS8qIEVuYWJsZSBSWCBPdmVyd3JpdGUgUHJvdGVjdGlvbiBvciBUWAlTaW5nbGUtU2hvdCBGb3IJTWFpbGJveAkyOCAqLworI2RlZmluZQlPUFNTMjkJCTB4MjAwMAkvKiBFbmFibGUgUlggT3ZlcndyaXRlIFByb3RlY3Rpb24gb3IgVFgJU2luZ2xlLVNob3QgRm9yCU1haWxib3gJMjkgKi8KKyNkZWZpbmUJT1BTUzMwCQkweDQwMDAJLyogRW5hYmxlIFJYIE92ZXJ3cml0ZSBQcm90ZWN0aW9uIG9yIFRYCVNpbmdsZS1TaG90IEZvcglNYWlsYm94CTMwICovCisjZGVmaW5lCU9QU1MzMQkJMHg4MDAwCS8qIEVuYWJsZSBSWCBPdmVyd3JpdGUgUHJvdGVjdGlvbiBvciBUWAlTaW5nbGUtU2hvdCBGb3IJTWFpbGJveAkzMSAqLworCisvKiBDQU5fVFJSMSBNYXNrcwkJCQkJCQkgKi8KKyNkZWZpbmUJVFJSMAkJMHgwMDAxCS8qIERlbnkJQnV0IERvbid0IExvY2sgQWNjZXNzIFRvIE1haWxib3ggMCAqLworI2RlZmluZQlUUlIxCQkweDAwMDIJLyogRGVueQlCdXQgRG9uJ3QgTG9jayBBY2Nlc3MgVG8gTWFpbGJveCAxICovCisjZGVmaW5lCVRSUjIJCTB4MDAwNAkvKiBEZW55CUJ1dCBEb24ndCBMb2NrIEFjY2VzcyBUbyBNYWlsYm94IDIgKi8KKyNkZWZpbmUJVFJSMwkJMHgwMDA4CS8qIERlbnkJQnV0IERvbid0IExvY2sgQWNjZXNzIFRvIE1haWxib3ggMyAqLworI2RlZmluZQlUUlI0CQkweDAwMTAJLyogRGVueQlCdXQgRG9uJ3QgTG9jayBBY2Nlc3MgVG8gTWFpbGJveCA0ICovCisjZGVmaW5lCVRSUjUJCTB4MDAyMAkvKiBEZW55CUJ1dCBEb24ndCBMb2NrIEFjY2VzcyBUbyBNYWlsYm94IDUgKi8KKyNkZWZpbmUJVFJSNgkJMHgwMDQwCS8qIERlbnkJQnV0IERvbid0IExvY2sgQWNjZXNzIFRvIE1haWxib3ggNiAqLworI2RlZmluZQlUUlI3CQkweDAwODAJLyogRGVueQlCdXQgRG9uJ3QgTG9jayBBY2Nlc3MgVG8gTWFpbGJveCA3ICovCisjZGVmaW5lCVRSUjgJCTB4MDEwMAkvKiBEZW55CUJ1dCBEb24ndCBMb2NrIEFjY2VzcyBUbyBNYWlsYm94IDggKi8KKyNkZWZpbmUJVFJSOQkJMHgwMjAwCS8qIERlbnkJQnV0IERvbid0IExvY2sgQWNjZXNzIFRvIE1haWxib3ggOSAqLworI2RlZmluZQlUUlIxMAkJMHgwNDAwCS8qIERlbnkJQnV0IERvbid0IExvY2sgQWNjZXNzIFRvIE1haWxib3ggMTAgKi8KKyNkZWZpbmUJVFJSMTEJCTB4MDgwMAkvKiBEZW55CUJ1dCBEb24ndCBMb2NrIEFjY2VzcyBUbyBNYWlsYm94IDExICovCisjZGVmaW5lCVRSUjEyCQkweDEwMDAJLyogRGVueQlCdXQgRG9uJ3QgTG9jayBBY2Nlc3MgVG8gTWFpbGJveCAxMiAqLworI2RlZmluZQlUUlIxMwkJMHgyMDAwCS8qIERlbnkJQnV0IERvbid0IExvY2sgQWNjZXNzIFRvIE1haWxib3ggMTMgKi8KKyNkZWZpbmUJVFJSMTQJCTB4NDAwMAkvKiBEZW55CUJ1dCBEb24ndCBMb2NrIEFjY2VzcyBUbyBNYWlsYm94IDE0ICovCisjZGVmaW5lCVRSUjE1CQkweDgwMDAJLyogRGVueQlCdXQgRG9uJ3QgTG9jayBBY2Nlc3MgVG8gTWFpbGJveCAxNSAqLworCisvKiBDQU5fVFJSMiBNYXNrcwkJCQkJCQkgKi8KKyNkZWZpbmUJVFJSMTYJCTB4MDAwMQkvKiBEZW55CUJ1dCBEb24ndCBMb2NrIEFjY2VzcyBUbyBNYWlsYm94IDE2ICovCisjZGVmaW5lCVRSUjE3CQkweDAwMDIJLyogRGVueQlCdXQgRG9uJ3QgTG9jayBBY2Nlc3MgVG8gTWFpbGJveCAxNyAqLworI2RlZmluZQlUUlIxOAkJMHgwMDA0CS8qIERlbnkJQnV0IERvbid0IExvY2sgQWNjZXNzIFRvIE1haWxib3ggMTggKi8KKyNkZWZpbmUJVFJSMTkJCTB4MDAwOAkvKiBEZW55CUJ1dCBEb24ndCBMb2NrIEFjY2VzcyBUbyBNYWlsYm94IDE5ICovCisjZGVmaW5lCVRSUjIwCQkweDAwMTAJLyogRGVueQlCdXQgRG9uJ3QgTG9jayBBY2Nlc3MgVG8gTWFpbGJveCAyMCAqLworI2RlZmluZQlUUlIyMQkJMHgwMDIwCS8qIERlbnkJQnV0IERvbid0IExvY2sgQWNjZXNzIFRvIE1haWxib3ggMjEgKi8KKyNkZWZpbmUJVFJSMjIJCTB4MDA0MAkvKiBEZW55CUJ1dCBEb24ndCBMb2NrIEFjY2VzcyBUbyBNYWlsYm94IDIyICovCisjZGVmaW5lCVRSUjIzCQkweDAwODAJLyogRGVueQlCdXQgRG9uJ3QgTG9jayBBY2Nlc3MgVG8gTWFpbGJveCAyMyAqLworI2RlZmluZQlUUlIyNAkJMHgwMTAwCS8qIERlbnkJQnV0IERvbid0IExvY2sgQWNjZXNzIFRvIE1haWxib3ggMjQgKi8KKyNkZWZpbmUJVFJSMjUJCTB4MDIwMAkvKiBEZW55CUJ1dCBEb24ndCBMb2NrIEFjY2VzcyBUbyBNYWlsYm94IDI1ICovCisjZGVmaW5lCVRSUjI2CQkweDA0MDAJLyogRGVueQlCdXQgRG9uJ3QgTG9jayBBY2Nlc3MgVG8gTWFpbGJveCAyNiAqLworI2RlZmluZQlUUlIyNwkJMHgwODAwCS8qIERlbnkJQnV0IERvbid0IExvY2sgQWNjZXNzIFRvIE1haWxib3ggMjcgKi8KKyNkZWZpbmUJVFJSMjgJCTB4MTAwMAkvKiBEZW55CUJ1dCBEb24ndCBMb2NrIEFjY2VzcyBUbyBNYWlsYm94IDI4ICovCisjZGVmaW5lCVRSUjI5CQkweDIwMDAJLyogRGVueQlCdXQgRG9uJ3QgTG9jayBBY2Nlc3MgVG8gTWFpbGJveCAyOSAqLworI2RlZmluZQlUUlIzMAkJMHg0MDAwCS8qIERlbnkJQnV0IERvbid0IExvY2sgQWNjZXNzIFRvIE1haWxib3ggMzAgKi8KKyNkZWZpbmUJVFJSMzEJCTB4ODAwMAkvKiBEZW55CUJ1dCBEb24ndCBMb2NrIEFjY2VzcyBUbyBNYWlsYm94IDMxICovCisKKy8qIENBTl9UUlMxIE1hc2tzCQkJCQkJICovCisjZGVmaW5lCVRSUzAJCTB4MDAwMQkvKiBSZW1vdGUgRnJhbWUJUmVxdWVzdAlGb3IgTWFpbGJveCAwICovCisjZGVmaW5lCVRSUzEJCTB4MDAwMgkvKiBSZW1vdGUgRnJhbWUJUmVxdWVzdAlGb3IgTWFpbGJveCAxICovCisjZGVmaW5lCVRSUzIJCTB4MDAwNAkvKiBSZW1vdGUgRnJhbWUJUmVxdWVzdAlGb3IgTWFpbGJveCAyICovCisjZGVmaW5lCVRSUzMJCTB4MDAwOAkvKiBSZW1vdGUgRnJhbWUJUmVxdWVzdAlGb3IgTWFpbGJveCAzICovCisjZGVmaW5lCVRSUzQJCTB4MDAxMAkvKiBSZW1vdGUgRnJhbWUJUmVxdWVzdAlGb3IgTWFpbGJveCA0ICovCisjZGVmaW5lCVRSUzUJCTB4MDAyMAkvKiBSZW1vdGUgRnJhbWUJUmVxdWVzdAlGb3IgTWFpbGJveCA1ICovCisjZGVmaW5lCVRSUzYJCTB4MDA0MAkvKiBSZW1vdGUgRnJhbWUJUmVxdWVzdAlGb3IgTWFpbGJveCA2ICovCisjZGVmaW5lCVRSUzcJCTB4MDA4MAkvKiBSZW1vdGUgRnJhbWUJUmVxdWVzdAlGb3IgTWFpbGJveCA3ICovCisjZGVmaW5lCVRSUzgJCTB4MDEwMAkvKiBSZW1vdGUgRnJhbWUJUmVxdWVzdAlGb3IgTWFpbGJveCA4ICovCisjZGVmaW5lCVRSUzkJCTB4MDIwMAkvKiBSZW1vdGUgRnJhbWUJUmVxdWVzdAlGb3IgTWFpbGJveCA5ICovCisjZGVmaW5lCVRSUzEwCQkweDA0MDAJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggMTAgKi8KKyNkZWZpbmUJVFJTMTEJCTB4MDgwMAkvKiBSZW1vdGUgRnJhbWUJUmVxdWVzdAlGb3IgTWFpbGJveCAxMSAqLworI2RlZmluZQlUUlMxMgkJMHgxMDAwCS8qIFJlbW90ZSBGcmFtZQlSZXF1ZXN0CUZvciBNYWlsYm94IDEyICovCisjZGVmaW5lCVRSUzEzCQkweDIwMDAJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggMTMgKi8KKyNkZWZpbmUJVFJTMTQJCTB4NDAwMAkvKiBSZW1vdGUgRnJhbWUJUmVxdWVzdAlGb3IgTWFpbGJveCAxNCAqLworI2RlZmluZQlUUlMxNQkJMHg4MDAwCS8qIFJlbW90ZSBGcmFtZQlSZXF1ZXN0CUZvciBNYWlsYm94IDE1ICovCisKKy8qIENBTl9UUlMyIE1hc2tzCQkJCQkJICovCisjZGVmaW5lCVRSUzE2CQkweDAwMDEJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggMTYgKi8KKyNkZWZpbmUJVFJTMTcJCTB4MDAwMgkvKiBSZW1vdGUgRnJhbWUJUmVxdWVzdAlGb3IgTWFpbGJveCAxNyAqLworI2RlZmluZQlUUlMxOAkJMHgwMDA0CS8qIFJlbW90ZSBGcmFtZQlSZXF1ZXN0CUZvciBNYWlsYm94IDE4ICovCisjZGVmaW5lCVRSUzE5CQkweDAwMDgJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggMTkgKi8KKyNkZWZpbmUJVFJTMjAJCTB4MDAxMAkvKiBSZW1vdGUgRnJhbWUJUmVxdWVzdAlGb3IgTWFpbGJveCAyMCAqLworI2RlZmluZQlUUlMyMQkJMHgwMDIwCS8qIFJlbW90ZSBGcmFtZQlSZXF1ZXN0CUZvciBNYWlsYm94IDIxICovCisjZGVmaW5lCVRSUzIyCQkweDAwNDAJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggMjIgKi8KKyNkZWZpbmUJVFJTMjMJCTB4MDA4MAkvKiBSZW1vdGUgRnJhbWUJUmVxdWVzdAlGb3IgTWFpbGJveCAyMyAqLworI2RlZmluZQlUUlMyNAkJMHgwMTAwCS8qIFJlbW90ZSBGcmFtZQlSZXF1ZXN0CUZvciBNYWlsYm94IDI0ICovCisjZGVmaW5lCVRSUzI1CQkweDAyMDAJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggMjUgKi8KKyNkZWZpbmUJVFJTMjYJCTB4MDQwMAkvKiBSZW1vdGUgRnJhbWUJUmVxdWVzdAlGb3IgTWFpbGJveCAyNiAqLworI2RlZmluZQlUUlMyNwkJMHgwODAwCS8qIFJlbW90ZSBGcmFtZQlSZXF1ZXN0CUZvciBNYWlsYm94IDI3ICovCisjZGVmaW5lCVRSUzI4CQkweDEwMDAJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggMjggKi8KKyNkZWZpbmUJVFJTMjkJCTB4MjAwMAkvKiBSZW1vdGUgRnJhbWUJUmVxdWVzdAlGb3IgTWFpbGJveCAyOSAqLworI2RlZmluZQlUUlMzMAkJMHg0MDAwCS8qIFJlbW90ZSBGcmFtZQlSZXF1ZXN0CUZvciBNYWlsYm94IDMwICovCisjZGVmaW5lCVRSUzMxCQkweDgwMDAJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggMzEgKi8KKworLyogQ0FOX0FBMSBNYXNrcwkJCQkJICovCisjZGVmaW5lCUFBMAkJCTB4MDAwMQkvKiBBYm9ydGVkIE1lc3NhZ2UgSW4gTWFpbGJveCAwICovCisjZGVmaW5lCUFBMQkJCTB4MDAwMgkvKiBBYm9ydGVkIE1lc3NhZ2UgSW4gTWFpbGJveCAxICovCisjZGVmaW5lCUFBMgkJCTB4MDAwNAkvKiBBYm9ydGVkIE1lc3NhZ2UgSW4gTWFpbGJveCAyICovCisjZGVmaW5lCUFBMwkJCTB4MDAwOAkvKiBBYm9ydGVkIE1lc3NhZ2UgSW4gTWFpbGJveCAzICovCisjZGVmaW5lCUFBNAkJCTB4MDAxMAkvKiBBYm9ydGVkIE1lc3NhZ2UgSW4gTWFpbGJveCA0ICovCisjZGVmaW5lCUFBNQkJCTB4MDAyMAkvKiBBYm9ydGVkIE1lc3NhZ2UgSW4gTWFpbGJveCA1ICovCisjZGVmaW5lCUFBNgkJCTB4MDA0MAkvKiBBYm9ydGVkIE1lc3NhZ2UgSW4gTWFpbGJveCA2ICovCisjZGVmaW5lCUFBNwkJCTB4MDA4MAkvKiBBYm9ydGVkIE1lc3NhZ2UgSW4gTWFpbGJveCA3ICovCisjZGVmaW5lCUFBOAkJCTB4MDEwMAkvKiBBYm9ydGVkIE1lc3NhZ2UgSW4gTWFpbGJveCA4ICovCisjZGVmaW5lCUFBOQkJCTB4MDIwMAkvKiBBYm9ydGVkIE1lc3NhZ2UgSW4gTWFpbGJveCA5ICovCisjZGVmaW5lCUFBMTAJCTB4MDQwMAkvKiBBYm9ydGVkIE1lc3NhZ2UgSW4gTWFpbGJveCAxMCAqLworI2RlZmluZQlBQTExCQkweDA4MDAJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggMTEgKi8KKyNkZWZpbmUJQUExMgkJMHgxMDAwCS8qIEFib3J0ZWQgTWVzc2FnZSBJbiBNYWlsYm94IDEyICovCisjZGVmaW5lCUFBMTMJCTB4MjAwMAkvKiBBYm9ydGVkIE1lc3NhZ2UgSW4gTWFpbGJveCAxMyAqLworI2RlZmluZQlBQTE0CQkweDQwMDAJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggMTQgKi8KKyNkZWZpbmUJQUExNQkJMHg4MDAwCS8qIEFib3J0ZWQgTWVzc2FnZSBJbiBNYWlsYm94IDE1ICovCisKKy8qIENBTl9BQTIgTWFza3MJCQkJCSAqLworI2RlZmluZQlBQTE2CQkweDAwMDEJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggMTYgKi8KKyNkZWZpbmUJQUExNwkJMHgwMDAyCS8qIEFib3J0ZWQgTWVzc2FnZSBJbiBNYWlsYm94IDE3ICovCisjZGVmaW5lCUFBMTgJCTB4MDAwNAkvKiBBYm9ydGVkIE1lc3NhZ2UgSW4gTWFpbGJveCAxOCAqLworI2RlZmluZQlBQTE5CQkweDAwMDgJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggMTkgKi8KKyNkZWZpbmUJQUEyMAkJMHgwMDEwCS8qIEFib3J0ZWQgTWVzc2FnZSBJbiBNYWlsYm94IDIwICovCisjZGVmaW5lCUFBMjEJCTB4MDAyMAkvKiBBYm9ydGVkIE1lc3NhZ2UgSW4gTWFpbGJveCAyMSAqLworI2RlZmluZQlBQTIyCQkweDAwNDAJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggMjIgKi8KKyNkZWZpbmUJQUEyMwkJMHgwMDgwCS8qIEFib3J0ZWQgTWVzc2FnZSBJbiBNYWlsYm94IDIzICovCisjZGVmaW5lCUFBMjQJCTB4MDEwMAkvKiBBYm9ydGVkIE1lc3NhZ2UgSW4gTWFpbGJveCAyNCAqLworI2RlZmluZQlBQTI1CQkweDAyMDAJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggMjUgKi8KKyNkZWZpbmUJQUEyNgkJMHgwNDAwCS8qIEFib3J0ZWQgTWVzc2FnZSBJbiBNYWlsYm94IDI2ICovCisjZGVmaW5lCUFBMjcJCTB4MDgwMAkvKiBBYm9ydGVkIE1lc3NhZ2UgSW4gTWFpbGJveCAyNyAqLworI2RlZmluZQlBQTI4CQkweDEwMDAJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggMjggKi8KKyNkZWZpbmUJQUEyOQkJMHgyMDAwCS8qIEFib3J0ZWQgTWVzc2FnZSBJbiBNYWlsYm94IDI5ICovCisjZGVmaW5lCUFBMzAJCTB4NDAwMAkvKiBBYm9ydGVkIE1lc3NhZ2UgSW4gTWFpbGJveCAzMCAqLworI2RlZmluZQlBQTMxCQkweDgwMDAJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggMzEgKi8KKworLyogQ0FOX1RBMSBNYXNrcwkJCQkJCSAqLworI2RlZmluZQlUQTAJCQkweDAwMDEJLyogVHJhbnNtaXQgU3VjY2Vzc2Z1bCBGcm9tIE1haWxib3ggMCAqLworI2RlZmluZQlUQTEJCQkweDAwMDIJLyogVHJhbnNtaXQgU3VjY2Vzc2Z1bCBGcm9tIE1haWxib3ggMSAqLworI2RlZmluZQlUQTIJCQkweDAwMDQJLyogVHJhbnNtaXQgU3VjY2Vzc2Z1bCBGcm9tIE1haWxib3ggMiAqLworI2RlZmluZQlUQTMJCQkweDAwMDgJLyogVHJhbnNtaXQgU3VjY2Vzc2Z1bCBGcm9tIE1haWxib3ggMyAqLworI2RlZmluZQlUQTQJCQkweDAwMTAJLyogVHJhbnNtaXQgU3VjY2Vzc2Z1bCBGcm9tIE1haWxib3ggNCAqLworI2RlZmluZQlUQTUJCQkweDAwMjAJLyogVHJhbnNtaXQgU3VjY2Vzc2Z1bCBGcm9tIE1haWxib3ggNSAqLworI2RlZmluZQlUQTYJCQkweDAwNDAJLyogVHJhbnNtaXQgU3VjY2Vzc2Z1bCBGcm9tIE1haWxib3ggNiAqLworI2RlZmluZQlUQTcJCQkweDAwODAJLyogVHJhbnNtaXQgU3VjY2Vzc2Z1bCBGcm9tIE1haWxib3ggNyAqLworI2RlZmluZQlUQTgJCQkweDAxMDAJLyogVHJhbnNtaXQgU3VjY2Vzc2Z1bCBGcm9tIE1haWxib3ggOCAqLworI2RlZmluZQlUQTkJCQkweDAyMDAJLyogVHJhbnNtaXQgU3VjY2Vzc2Z1bCBGcm9tIE1haWxib3ggOSAqLworI2RlZmluZQlUQTEwCQkweDA0MDAJLyogVHJhbnNtaXQgU3VjY2Vzc2Z1bCBGcm9tIE1haWxib3ggMTAgKi8KKyNkZWZpbmUJVEExMQkJMHgwODAwCS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDExICovCisjZGVmaW5lCVRBMTIJCTB4MTAwMAkvKiBUcmFuc21pdCBTdWNjZXNzZnVsIEZyb20gTWFpbGJveCAxMiAqLworI2RlZmluZQlUQTEzCQkweDIwMDAJLyogVHJhbnNtaXQgU3VjY2Vzc2Z1bCBGcm9tIE1haWxib3ggMTMgKi8KKyNkZWZpbmUJVEExNAkJMHg0MDAwCS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDE0ICovCisjZGVmaW5lCVRBMTUJCTB4ODAwMAkvKiBUcmFuc21pdCBTdWNjZXNzZnVsIEZyb20gTWFpbGJveCAxNSAqLworCisvKiBDQU5fVEEyIE1hc2tzCQkJCQkJICovCisjZGVmaW5lCVRBMTYJCTB4MDAwMQkvKiBUcmFuc21pdCBTdWNjZXNzZnVsIEZyb20gTWFpbGJveCAxNiAqLworI2RlZmluZQlUQTE3CQkweDAwMDIJLyogVHJhbnNtaXQgU3VjY2Vzc2Z1bCBGcm9tIE1haWxib3ggMTcgKi8KKyNkZWZpbmUJVEExOAkJMHgwMDA0CS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDE4ICovCisjZGVmaW5lCVRBMTkJCTB4MDAwOAkvKiBUcmFuc21pdCBTdWNjZXNzZnVsIEZyb20gTWFpbGJveCAxOSAqLworI2RlZmluZQlUQTIwCQkweDAwMTAJLyogVHJhbnNtaXQgU3VjY2Vzc2Z1bCBGcm9tIE1haWxib3ggMjAgKi8KKyNkZWZpbmUJVEEyMQkJMHgwMDIwCS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDIxICovCisjZGVmaW5lCVRBMjIJCTB4MDA0MAkvKiBUcmFuc21pdCBTdWNjZXNzZnVsIEZyb20gTWFpbGJveCAyMiAqLworI2RlZmluZQlUQTIzCQkweDAwODAJLyogVHJhbnNtaXQgU3VjY2Vzc2Z1bCBGcm9tIE1haWxib3ggMjMgKi8KKyNkZWZpbmUJVEEyNAkJMHgwMTAwCS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDI0ICovCisjZGVmaW5lCVRBMjUJCTB4MDIwMAkvKiBUcmFuc21pdCBTdWNjZXNzZnVsIEZyb20gTWFpbGJveCAyNSAqLworI2RlZmluZQlUQTI2CQkweDA0MDAJLyogVHJhbnNtaXQgU3VjY2Vzc2Z1bCBGcm9tIE1haWxib3ggMjYgKi8KKyNkZWZpbmUJVEEyNwkJMHgwODAwCS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDI3ICovCisjZGVmaW5lCVRBMjgJCTB4MTAwMAkvKiBUcmFuc21pdCBTdWNjZXNzZnVsIEZyb20gTWFpbGJveCAyOCAqLworI2RlZmluZQlUQTI5CQkweDIwMDAJLyogVHJhbnNtaXQgU3VjY2Vzc2Z1bCBGcm9tIE1haWxib3ggMjkgKi8KKyNkZWZpbmUJVEEzMAkJMHg0MDAwCS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDMwICovCisjZGVmaW5lCVRBMzEJCTB4ODAwMAkvKiBUcmFuc21pdCBTdWNjZXNzZnVsIEZyb20gTWFpbGJveCAzMSAqLworCisvKiBDQU5fTUJURCBNYXNrcwkJCQkJICovCisjZGVmaW5lCVREUFRSCQkweDAwMUYJLyogTWFpbGJveCBUbyBUZW1wb3JhcmlseSBEaXNhYmxlICovCisjZGVmaW5lCVREQQkJCTB4MDA0MAkvKiBUZW1wb3JhcnkgRGlzYWJsZSBBY2tub3dsZWRnZSAqLworI2RlZmluZQlURFIJCQkweDAwODAJLyogVGVtcG9yYXJ5IERpc2FibGUgUmVxdWVzdCAqLworCisvKiBDQU5fUkZIMSBNYXNrcwkJCQkJCQkJCQkJICovCisjZGVmaW5lCVJGSDAJCTB4MDAwMQkvKiBFbmFibGUgQXV0b21hdGljIFJlbW90ZSBGcmFtZSBIYW5kbGluZyBGb3IgTWFpbGJveCAwICovCisjZGVmaW5lCVJGSDEJCTB4MDAwMgkvKiBFbmFibGUgQXV0b21hdGljIFJlbW90ZSBGcmFtZSBIYW5kbGluZyBGb3IgTWFpbGJveCAxICovCisjZGVmaW5lCVJGSDIJCTB4MDAwNAkvKiBFbmFibGUgQXV0b21hdGljIFJlbW90ZSBGcmFtZSBIYW5kbGluZyBGb3IgTWFpbGJveCAyICovCisjZGVmaW5lCVJGSDMJCTB4MDAwOAkvKiBFbmFibGUgQXV0b21hdGljIFJlbW90ZSBGcmFtZSBIYW5kbGluZyBGb3IgTWFpbGJveCAzICovCisjZGVmaW5lCVJGSDQJCTB4MDAxMAkvKiBFbmFibGUgQXV0b21hdGljIFJlbW90ZSBGcmFtZSBIYW5kbGluZyBGb3IgTWFpbGJveCA0ICovCisjZGVmaW5lCVJGSDUJCTB4MDAyMAkvKiBFbmFibGUgQXV0b21hdGljIFJlbW90ZSBGcmFtZSBIYW5kbGluZyBGb3IgTWFpbGJveCA1ICovCisjZGVmaW5lCVJGSDYJCTB4MDA0MAkvKiBFbmFibGUgQXV0b21hdGljIFJlbW90ZSBGcmFtZSBIYW5kbGluZyBGb3IgTWFpbGJveCA2ICovCisjZGVmaW5lCVJGSDcJCTB4MDA4MAkvKiBFbmFibGUgQXV0b21hdGljIFJlbW90ZSBGcmFtZSBIYW5kbGluZyBGb3IgTWFpbGJveCA3ICovCisjZGVmaW5lCVJGSDgJCTB4MDEwMAkvKiBFbmFibGUgQXV0b21hdGljIFJlbW90ZSBGcmFtZSBIYW5kbGluZyBGb3IgTWFpbGJveCA4ICovCisjZGVmaW5lCVJGSDkJCTB4MDIwMAkvKiBFbmFibGUgQXV0b21hdGljIFJlbW90ZSBGcmFtZSBIYW5kbGluZyBGb3IgTWFpbGJveCA5ICovCisjZGVmaW5lCVJGSDEwCQkweDA0MDAJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggMTAgKi8KKyNkZWZpbmUJUkZIMTEJCTB4MDgwMAkvKiBFbmFibGUgQXV0b21hdGljIFJlbW90ZSBGcmFtZSBIYW5kbGluZyBGb3IgTWFpbGJveCAxMSAqLworI2RlZmluZQlSRkgxMgkJMHgxMDAwCS8qIEVuYWJsZSBBdXRvbWF0aWMgUmVtb3RlIEZyYW1lIEhhbmRsaW5nIEZvciBNYWlsYm94IDEyICovCisjZGVmaW5lCVJGSDEzCQkweDIwMDAJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggMTMgKi8KKyNkZWZpbmUJUkZIMTQJCTB4NDAwMAkvKiBFbmFibGUgQXV0b21hdGljIFJlbW90ZSBGcmFtZSBIYW5kbGluZyBGb3IgTWFpbGJveCAxNCAqLworI2RlZmluZQlSRkgxNQkJMHg4MDAwCS8qIEVuYWJsZSBBdXRvbWF0aWMgUmVtb3RlIEZyYW1lIEhhbmRsaW5nIEZvciBNYWlsYm94IDE1ICovCisKKy8qIENBTl9SRkgyIE1hc2tzCQkJCQkJCQkJCQkgKi8KKyNkZWZpbmUJUkZIMTYJCTB4MDAwMQkvKiBFbmFibGUgQXV0b21hdGljIFJlbW90ZSBGcmFtZSBIYW5kbGluZyBGb3IgTWFpbGJveCAxNiAqLworI2RlZmluZQlSRkgxNwkJMHgwMDAyCS8qIEVuYWJsZSBBdXRvbWF0aWMgUmVtb3RlIEZyYW1lIEhhbmRsaW5nIEZvciBNYWlsYm94IDE3ICovCisjZGVmaW5lCVJGSDE4CQkweDAwMDQJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggMTggKi8KKyNkZWZpbmUJUkZIMTkJCTB4MDAwOAkvKiBFbmFibGUgQXV0b21hdGljIFJlbW90ZSBGcmFtZSBIYW5kbGluZyBGb3IgTWFpbGJveCAxOSAqLworI2RlZmluZQlSRkgyMAkJMHgwMDEwCS8qIEVuYWJsZSBBdXRvbWF0aWMgUmVtb3RlIEZyYW1lIEhhbmRsaW5nIEZvciBNYWlsYm94IDIwICovCisjZGVmaW5lCVJGSDIxCQkweDAwMjAJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggMjEgKi8KKyNkZWZpbmUJUkZIMjIJCTB4MDA0MAkvKiBFbmFibGUgQXV0b21hdGljIFJlbW90ZSBGcmFtZSBIYW5kbGluZyBGb3IgTWFpbGJveCAyMiAqLworI2RlZmluZQlSRkgyMwkJMHgwMDgwCS8qIEVuYWJsZSBBdXRvbWF0aWMgUmVtb3RlIEZyYW1lIEhhbmRsaW5nIEZvciBNYWlsYm94IDIzICovCisjZGVmaW5lCVJGSDI0CQkweDAxMDAJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggMjQgKi8KKyNkZWZpbmUJUkZIMjUJCTB4MDIwMAkvKiBFbmFibGUgQXV0b21hdGljIFJlbW90ZSBGcmFtZSBIYW5kbGluZyBGb3IgTWFpbGJveCAyNSAqLworI2RlZmluZQlSRkgyNgkJMHgwNDAwCS8qIEVuYWJsZSBBdXRvbWF0aWMgUmVtb3RlIEZyYW1lIEhhbmRsaW5nIEZvciBNYWlsYm94IDI2ICovCisjZGVmaW5lCVJGSDI3CQkweDA4MDAJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggMjcgKi8KKyNkZWZpbmUJUkZIMjgJCTB4MTAwMAkvKiBFbmFibGUgQXV0b21hdGljIFJlbW90ZSBGcmFtZSBIYW5kbGluZyBGb3IgTWFpbGJveCAyOCAqLworI2RlZmluZQlSRkgyOQkJMHgyMDAwCS8qIEVuYWJsZSBBdXRvbWF0aWMgUmVtb3RlIEZyYW1lIEhhbmRsaW5nIEZvciBNYWlsYm94IDI5ICovCisjZGVmaW5lCVJGSDMwCQkweDQwMDAJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggMzAgKi8KKyNkZWZpbmUJUkZIMzEJCTB4ODAwMAkvKiBFbmFibGUgQXV0b21hdGljIFJlbW90ZSBGcmFtZSBIYW5kbGluZyBGb3IgTWFpbGJveCAzMSAqLworCisvKiBDQU5fTUJUSUYxIE1hc2tzCQkJCQkJICovCisjZGVmaW5lCU1CVElGMAkJMHgwMDAxCS8qIFRYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAwICovCisjZGVmaW5lCU1CVElGMQkJMHgwMDAyCS8qIFRYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAxICovCisjZGVmaW5lCU1CVElGMgkJMHgwMDA0CS8qIFRYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAyICovCisjZGVmaW5lCU1CVElGMwkJMHgwMDA4CS8qIFRYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAzICovCisjZGVmaW5lCU1CVElGNAkJMHgwMDEwCS8qIFRYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCA0ICovCisjZGVmaW5lCU1CVElGNQkJMHgwMDIwCS8qIFRYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCA1ICovCisjZGVmaW5lCU1CVElGNgkJMHgwMDQwCS8qIFRYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCA2ICovCisjZGVmaW5lCU1CVElGNwkJMHgwMDgwCS8qIFRYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCA3ICovCisjZGVmaW5lCU1CVElGOAkJMHgwMTAwCS8qIFRYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCA4ICovCisjZGVmaW5lCU1CVElGOQkJMHgwMjAwCS8qIFRYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCA5ICovCisjZGVmaW5lCU1CVElGMTAJCTB4MDQwMAkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMTAgKi8KKyNkZWZpbmUJTUJUSUYxMQkJMHgwODAwCS8qIFRYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAxMSAqLworI2RlZmluZQlNQlRJRjEyCQkweDEwMDAJLyogVFggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDEyICovCisjZGVmaW5lCU1CVElGMTMJCTB4MjAwMAkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMTMgKi8KKyNkZWZpbmUJTUJUSUYxNAkJMHg0MDAwCS8qIFRYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAxNCAqLworI2RlZmluZQlNQlRJRjE1CQkweDgwMDAJLyogVFggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDE1ICovCisKKy8qIENBTl9NQlRJRjIgTWFza3MJCQkJCQkgKi8KKyNkZWZpbmUJTUJUSUYxNgkJMHgwMDAxCS8qIFRYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAxNiAqLworI2RlZmluZQlNQlRJRjE3CQkweDAwMDIJLyogVFggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDE3ICovCisjZGVmaW5lCU1CVElGMTgJCTB4MDAwNAkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMTggKi8KKyNkZWZpbmUJTUJUSUYxOQkJMHgwMDA4CS8qIFRYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAxOSAqLworI2RlZmluZQlNQlRJRjIwCQkweDAwMTAJLyogVFggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDIwICovCisjZGVmaW5lCU1CVElGMjEJCTB4MDAyMAkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMjEgKi8KKyNkZWZpbmUJTUJUSUYyMgkJMHgwMDQwCS8qIFRYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAyMiAqLworI2RlZmluZQlNQlRJRjIzCQkweDAwODAJLyogVFggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDIzICovCisjZGVmaW5lCU1CVElGMjQJCTB4MDEwMAkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMjQgKi8KKyNkZWZpbmUJTUJUSUYyNQkJMHgwMjAwCS8qIFRYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAyNSAqLworI2RlZmluZQlNQlRJRjI2CQkweDA0MDAJLyogVFggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDI2ICovCisjZGVmaW5lCU1CVElGMjcJCTB4MDgwMAkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMjcgKi8KKyNkZWZpbmUJTUJUSUYyOAkJMHgxMDAwCS8qIFRYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAyOCAqLworI2RlZmluZQlNQlRJRjI5CQkweDIwMDAJLyogVFggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDI5ICovCisjZGVmaW5lCU1CVElGMzAJCTB4NDAwMAkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMzAgKi8KKyNkZWZpbmUJTUJUSUYzMQkJMHg4MDAwCS8qIFRYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAzMSAqLworCisvKiBDQU5fTUJSSUYxIE1hc2tzCQkJCQkJICovCisjZGVmaW5lCU1CUklGMAkJMHgwMDAxCS8qIFJYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAwICovCisjZGVmaW5lCU1CUklGMQkJMHgwMDAyCS8qIFJYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAxICovCisjZGVmaW5lCU1CUklGMgkJMHgwMDA0CS8qIFJYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAyICovCisjZGVmaW5lCU1CUklGMwkJMHgwMDA4CS8qIFJYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAzICovCisjZGVmaW5lCU1CUklGNAkJMHgwMDEwCS8qIFJYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCA0ICovCisjZGVmaW5lCU1CUklGNQkJMHgwMDIwCS8qIFJYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCA1ICovCisjZGVmaW5lCU1CUklGNgkJMHgwMDQwCS8qIFJYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCA2ICovCisjZGVmaW5lCU1CUklGNwkJMHgwMDgwCS8qIFJYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCA3ICovCisjZGVmaW5lCU1CUklGOAkJMHgwMTAwCS8qIFJYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCA4ICovCisjZGVmaW5lCU1CUklGOQkJMHgwMjAwCS8qIFJYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCA5ICovCisjZGVmaW5lCU1CUklGMTAJCTB4MDQwMAkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMTAgKi8KKyNkZWZpbmUJTUJSSUYxMQkJMHgwODAwCS8qIFJYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAxMSAqLworI2RlZmluZQlNQlJJRjEyCQkweDEwMDAJLyogUlggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDEyICovCisjZGVmaW5lCU1CUklGMTMJCTB4MjAwMAkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMTMgKi8KKyNkZWZpbmUJTUJSSUYxNAkJMHg0MDAwCS8qIFJYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAxNCAqLworI2RlZmluZQlNQlJJRjE1CQkweDgwMDAJLyogUlggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDE1ICovCisKKy8qIENBTl9NQlJJRjIgTWFza3MJCQkJCQkgKi8KKyNkZWZpbmUJTUJSSUYxNgkJMHgwMDAxCS8qIFJYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAxNiAqLworI2RlZmluZQlNQlJJRjE3CQkweDAwMDIJLyogUlggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDE3ICovCisjZGVmaW5lCU1CUklGMTgJCTB4MDAwNAkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMTggKi8KKyNkZWZpbmUJTUJSSUYxOQkJMHgwMDA4CS8qIFJYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAxOSAqLworI2RlZmluZQlNQlJJRjIwCQkweDAwMTAJLyogUlggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDIwICovCisjZGVmaW5lCU1CUklGMjEJCTB4MDAyMAkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMjEgKi8KKyNkZWZpbmUJTUJSSUYyMgkJMHgwMDQwCS8qIFJYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAyMiAqLworI2RlZmluZQlNQlJJRjIzCQkweDAwODAJLyogUlggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDIzICovCisjZGVmaW5lCU1CUklGMjQJCTB4MDEwMAkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMjQgKi8KKyNkZWZpbmUJTUJSSUYyNQkJMHgwMjAwCS8qIFJYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAyNSAqLworI2RlZmluZQlNQlJJRjI2CQkweDA0MDAJLyogUlggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDI2ICovCisjZGVmaW5lCU1CUklGMjcJCTB4MDgwMAkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMjcgKi8KKyNkZWZpbmUJTUJSSUYyOAkJMHgxMDAwCS8qIFJYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAyOCAqLworI2RlZmluZQlNQlJJRjI5CQkweDIwMDAJLyogUlggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDI5ICovCisjZGVmaW5lCU1CUklGMzAJCTB4NDAwMAkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMzAgKi8KKyNkZWZpbmUJTUJSSUYzMQkJMHg4MDAwCS8qIFJYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAzMSAqLworCisvKiBDQU5fTUJJTTEgTWFza3MJCQkJCSAqLworI2RlZmluZQlNQklNMAkJMHgwMDAxCS8qIEVuYWJsZSBJbnRlcnJ1cHQgRm9yCU1haWxib3gJMCAqLworI2RlZmluZQlNQklNMQkJMHgwMDAyCS8qIEVuYWJsZSBJbnRlcnJ1cHQgRm9yCU1haWxib3gJMSAqLworI2RlZmluZQlNQklNMgkJMHgwMDA0CS8qIEVuYWJsZSBJbnRlcnJ1cHQgRm9yCU1haWxib3gJMiAqLworI2RlZmluZQlNQklNMwkJMHgwMDA4CS8qIEVuYWJsZSBJbnRlcnJ1cHQgRm9yCU1haWxib3gJMyAqLworI2RlZmluZQlNQklNNAkJMHgwMDEwCS8qIEVuYWJsZSBJbnRlcnJ1cHQgRm9yCU1haWxib3gJNCAqLworI2RlZmluZQlNQklNNQkJMHgwMDIwCS8qIEVuYWJsZSBJbnRlcnJ1cHQgRm9yCU1haWxib3gJNSAqLworI2RlZmluZQlNQklNNgkJMHgwMDQwCS8qIEVuYWJsZSBJbnRlcnJ1cHQgRm9yCU1haWxib3gJNiAqLworI2RlZmluZQlNQklNNwkJMHgwMDgwCS8qIEVuYWJsZSBJbnRlcnJ1cHQgRm9yCU1haWxib3gJNyAqLworI2RlZmluZQlNQklNOAkJMHgwMTAwCS8qIEVuYWJsZSBJbnRlcnJ1cHQgRm9yCU1haWxib3gJOCAqLworI2RlZmluZQlNQklNOQkJMHgwMjAwCS8qIEVuYWJsZSBJbnRlcnJ1cHQgRm9yCU1haWxib3gJOSAqLworI2RlZmluZQlNQklNMTAJCTB4MDQwMAkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTEwICovCisjZGVmaW5lCU1CSU0xMQkJMHgwODAwCS8qIEVuYWJsZSBJbnRlcnJ1cHQgRm9yCU1haWxib3gJMTEgKi8KKyNkZWZpbmUJTUJJTTEyCQkweDEwMDAJLyogRW5hYmxlIEludGVycnVwdCBGb3IJTWFpbGJveAkxMiAqLworI2RlZmluZQlNQklNMTMJCTB4MjAwMAkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTEzICovCisjZGVmaW5lCU1CSU0xNAkJMHg0MDAwCS8qIEVuYWJsZSBJbnRlcnJ1cHQgRm9yCU1haWxib3gJMTQgKi8KKyNkZWZpbmUJTUJJTTE1CQkweDgwMDAJLyogRW5hYmxlIEludGVycnVwdCBGb3IJTWFpbGJveAkxNSAqLworCisvKiBDQU5fTUJJTTIgTWFza3MJCQkJCSAqLworI2RlZmluZQlNQklNMTYJCTB4MDAwMQkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTE2ICovCisjZGVmaW5lCU1CSU0xNwkJMHgwMDAyCS8qIEVuYWJsZSBJbnRlcnJ1cHQgRm9yCU1haWxib3gJMTcgKi8KKyNkZWZpbmUJTUJJTTE4CQkweDAwMDQJLyogRW5hYmxlIEludGVycnVwdCBGb3IJTWFpbGJveAkxOCAqLworI2RlZmluZQlNQklNMTkJCTB4MDAwOAkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTE5ICovCisjZGVmaW5lCU1CSU0yMAkJMHgwMDEwCS8qIEVuYWJsZSBJbnRlcnJ1cHQgRm9yCU1haWxib3gJMjAgKi8KKyNkZWZpbmUJTUJJTTIxCQkweDAwMjAJLyogRW5hYmxlIEludGVycnVwdCBGb3IJTWFpbGJveAkyMSAqLworI2RlZmluZQlNQklNMjIJCTB4MDA0MAkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTIyICovCisjZGVmaW5lCU1CSU0yMwkJMHgwMDgwCS8qIEVuYWJsZSBJbnRlcnJ1cHQgRm9yCU1haWxib3gJMjMgKi8KKyNkZWZpbmUJTUJJTTI0CQkweDAxMDAJLyogRW5hYmxlIEludGVycnVwdCBGb3IJTWFpbGJveAkyNCAqLworI2RlZmluZQlNQklNMjUJCTB4MDIwMAkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTI1ICovCisjZGVmaW5lCU1CSU0yNgkJMHgwNDAwCS8qIEVuYWJsZSBJbnRlcnJ1cHQgRm9yCU1haWxib3gJMjYgKi8KKyNkZWZpbmUJTUJJTTI3CQkweDA4MDAJLyogRW5hYmxlIEludGVycnVwdCBGb3IJTWFpbGJveAkyNyAqLworI2RlZmluZQlNQklNMjgJCTB4MTAwMAkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTI4ICovCisjZGVmaW5lCU1CSU0yOQkJMHgyMDAwCS8qIEVuYWJsZSBJbnRlcnJ1cHQgRm9yCU1haWxib3gJMjkgKi8KKyNkZWZpbmUJTUJJTTMwCQkweDQwMDAJLyogRW5hYmxlIEludGVycnVwdCBGb3IJTWFpbGJveAkzMCAqLworI2RlZmluZQlNQklNMzEJCTB4ODAwMAkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTMxICovCisKKy8qIENBTl9HSU0gTWFza3MJCQkJCQkJCQkgKi8KKyNkZWZpbmUJRVdUSU0JCTB4MDAwMQkvKiBFbmFibGUgVFggRXJyb3IgQ291bnQgSW50ZXJydXB0ICovCisjZGVmaW5lCUVXUklNCQkweDAwMDIJLyogRW5hYmxlIFJYIEVycm9yIENvdW50IEludGVycnVwdCAqLworI2RlZmluZQlFUElNCQkweDAwMDQJLyogRW5hYmxlIEVycm9yLVBhc3NpdmUJTW9kZSBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJQk9JTQkJMHgwMDA4CS8qIEVuYWJsZSBCdXMgT2ZmIEludGVycnVwdCAqLworI2RlZmluZQlXVUlNCQkweDAwMTAJLyogRW5hYmxlIFdha2UtVXAgSW50ZXJydXB0ICovCisjZGVmaW5lCVVJQUlNCQkweDAwMjAJLyogRW5hYmxlIEFjY2VzcyBUbyBVbmltcGxlbWVudGVkIEFkZHJlc3MgSW50ZXJydXB0ICovCisjZGVmaW5lCUFBSU0JCTB4MDA0MAkvKiBFbmFibGUgQWJvcnQJQWNrbm93bGVkZ2UgSW50ZXJydXB0ICovCisjZGVmaW5lCVJNTElNCQkweDAwODAJLyogRW5hYmxlIFJYIE1lc3NhZ2UgTG9zdCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJVUNFSU0JCTB4MDEwMAkvKiBFbmFibGUgVW5pdmVyc2FsIENvdW50ZXIgT3ZlcmZsb3cgSW50ZXJydXB0ICovCisjZGVmaW5lCUVYVElNCQkweDAyMDAJLyogRW5hYmxlIEV4dGVybmFsIFRyaWdnZXIgT3V0cHV0IEludGVycnVwdCAqLworI2RlZmluZQlBRElNCQkweDA0MDAJLyogRW5hYmxlIEFjY2VzcyBEZW5pZWQJSW50ZXJydXB0ICovCisKKy8qIENBTl9HSVMgTWFza3MJCQkJCQkJCSAqLworI2RlZmluZQlFV1RJUwkJMHgwMDAxCS8qIFRYIEVycm9yIENvdW50IElSUSBTdGF0dXMgKi8KKyNkZWZpbmUJRVdSSVMJCTB4MDAwMgkvKiBSWCBFcnJvciBDb3VudCBJUlEgU3RhdHVzICovCisjZGVmaW5lCUVQSVMJCTB4MDAwNAkvKiBFcnJvci1QYXNzaXZlIE1vZGUgSVJRIFN0YXR1cyAqLworI2RlZmluZQlCT0lTCQkweDAwMDgJLyogQnVzIE9mZiBJUlEgU3RhdHVzICovCisjZGVmaW5lCVdVSVMJCTB4MDAxMAkvKiBXYWtlLVVwIElSUSBTdGF0dXMgKi8KKyNkZWZpbmUJVUlBSVMJCTB4MDAyMAkvKiBBY2Nlc3MgVG8gVW5pbXBsZW1lbnRlZCBBZGRyZXNzIElSUSBTdGF0dXMgKi8KKyNkZWZpbmUJQUFJUwkJMHgwMDQwCS8qIEFib3J0IEFja25vd2xlZGdlIElSUSBTdGF0dXMgKi8KKyNkZWZpbmUJUk1MSVMJCTB4MDA4MAkvKiBSWCBNZXNzYWdlIExvc3QgSVJRIFN0YXR1cyAqLworI2RlZmluZQlVQ0VJUwkJMHgwMTAwCS8qIFVuaXZlcnNhbCBDb3VudGVyIE92ZXJmbG93IElSUSBTdGF0dXMgKi8KKyNkZWZpbmUJRVhUSVMJCTB4MDIwMAkvKiBFeHRlcm5hbCBUcmlnZ2VyIE91dHB1dCBJUlEgU3RhdHVzICovCisjZGVmaW5lCUFESVMJCTB4MDQwMAkvKiBBY2Nlc3MgRGVuaWVkIElSUSBTdGF0dXMgKi8KKworLyogQ0FOX0dJRiBNYXNrcwkJCQkJCQkJICovCisjZGVmaW5lCUVXVElGCQkweDAwMDEJLyogVFggRXJyb3IgQ291bnQgSVJRIEZsYWcgKi8KKyNkZWZpbmUJRVdSSUYJCTB4MDAwMgkvKiBSWCBFcnJvciBDb3VudCBJUlEgRmxhZyAqLworI2RlZmluZQlFUElGCQkweDAwMDQJLyogRXJyb3ItUGFzc2l2ZSBNb2RlIElSUSBGbGFnICovCisjZGVmaW5lCUJPSUYJCTB4MDAwOAkvKiBCdXMgT2ZmIElSUSBGbGFnCSAqLworI2RlZmluZQlXVUlGCQkweDAwMTAJLyogV2FrZS1VcCBJUlEgRmxhZwkgKi8KKyNkZWZpbmUJVUlBSUYJCTB4MDAyMAkvKiBBY2Nlc3MgVG8gVW5pbXBsZW1lbnRlZCBBZGRyZXNzIElSUSBGbGFnICovCisjZGVmaW5lCUFBSUYJCTB4MDA0MAkvKiBBYm9ydCBBY2tub3dsZWRnZSBJUlEgRmxhZyAqLworI2RlZmluZQlSTUxJRgkJMHgwMDgwCS8qIFJYIE1lc3NhZ2UgTG9zdCBJUlEgRmxhZyAqLworI2RlZmluZQlVQ0VJRgkJMHgwMTAwCS8qIFVuaXZlcnNhbCBDb3VudGVyIE92ZXJmbG93IElSUSBGbGFnICovCisjZGVmaW5lCUVYVElGCQkweDAyMDAJLyogRXh0ZXJuYWwgVHJpZ2dlciBPdXRwdXQgSVJRIEZsYWcgKi8KKyNkZWZpbmUJQURJRgkJMHgwNDAwCS8qIEFjY2VzcyBEZW5pZWQgSVJRIEZsYWcgKi8KKworLyogQ0FOX1VDQ05GIE1hc2tzCQkJCQkJCQkgKi8KKyNkZWZpbmUJVUNDTkYJCTB4MDAwRgkvKiBVbml2ZXJzYWwgQ291bnRlciBNb2RlICovCisjZGVmaW5lCVVDX1NUQU1QCTB4MDAwMQkvKgkJVGltZXN0YW1wIE1vZGUgKi8KKyNkZWZpbmUJVUNfV0RPRwkJMHgwMDAyCS8qCQlXYXRjaGRvZyBNb2RlICovCisjZGVmaW5lCVVDX0FVVE9UWAkweDAwMDMJLyoJCUF1dG8tVHJhbnNtaXQgTW9kZSAqLworI2RlZmluZQlVQ19FUlJPUgkweDAwMDYJLyoJCUNBTiBFcnJvciBGcmFtZQlDb3VudCAqLworI2RlZmluZQlVQ19PVkVSCQkweDAwMDcJLyoJCUNBTiBPdmVybG9hZCBGcmFtZSBDb3VudCAqLworI2RlZmluZQlVQ19MT1NUCQkweDAwMDgJLyoJCUFyYml0cmF0aW9uIExvc3QgRHVyaW5nCVRYIENvdW50ICovCisjZGVmaW5lCVVDX0FBCQkweDAwMDkJLyoJCVRYIEFib3J0IENvdW50ICovCisjZGVmaW5lCVVDX1RBCQkweDAwMEEJLyoJCVRYIFN1Y2Nlc3NmdWwgQ291bnQgKi8KKyNkZWZpbmUJVUNfUkVKRUNUCTB4MDAwQgkvKgkJUlggTWVzc2FnZSBSZWplY3RlZCBDb3VudCAqLworI2RlZmluZQlVQ19STUwJCTB4MDAwQwkvKgkJUlggTWVzc2FnZSBMb3N0CUNvdW50ICovCisjZGVmaW5lCVVDX1JYCQkweDAwMEQJLyoJCVRvdGFsIFN1Y2Nlc3NmdWwgUlggTWVzc2FnZXMgQ291bnQgKi8KKyNkZWZpbmUJVUNfUk1QCQkweDAwMEUJLyoJCVN1Y2Nlc3NmdWwgUlggVy9NYXRjaGluZyBJRCBDb3VudCAqLworI2RlZmluZQlVQ19BTEwJCTB4MDAwRgkvKgkJQ29ycmVjdAlNZXNzYWdlCU9uIENBTiBCdXMgTGluZQlDb3VudCAqLworI2RlZmluZQlVQ1JDCQkweDAwMjAJLyogVW5pdmVyc2FsIENvdW50ZXIgUmVsb2FkL0NsZWFyICovCisjZGVmaW5lCVVDQ1QJCTB4MDA0MAkvKiBVbml2ZXJzYWwgQ291bnRlciBDQU4gVHJpZ2dlciAqLworI2RlZmluZQlVQ0UJCQkweDAwODAJLyogVW5pdmVyc2FsIENvdW50ZXIgRW5hYmxlICovCisKKy8qIENBTl9FU1IgTWFza3MJCQkgKi8KKyNkZWZpbmUJQUNLRQkJMHgwMDA0CS8qIEFja25vd2xlZGdlIEVycm9yICovCisjZGVmaW5lCVNFUgkJCTB4MDAwOAkvKiBTdHVmZiBFcnJvciAqLworI2RlZmluZQlDUkNFCQkweDAwMTAJLyogQ1JDIEVycm9yICovCisjZGVmaW5lCVNBMAkJCTB4MDAyMAkvKiBTdHVjayBBdCBEb21pbmFudCBFcnJvciAqLworI2RlZmluZQlCRUYJCQkweDAwNDAJLyogQml0IEVycm9yIEZsYWcgKi8KKyNkZWZpbmUJRkVSCQkJMHgwMDgwCS8qIEZvcm0JRXJyb3IgRmxhZyAqLworCisvKiBDQU5fRVdSIE1hc2tzCQkJCQkgKi8KKyNkZWZpbmUJRVdMUkVDCQkweDAwRkYJLyogUlggRXJyb3IgQ291bnQgTGltaXQJKEZvciBFV1JJUykgKi8KKyNkZWZpbmUJRVdMVEVDCQkweEZGMDAJLyogVFggRXJyb3IgQ291bnQgTGltaXQJKEZvciBFV1RJUykgKi8KKworI2VuZGlmIC8qIF9ERUZfQkY1MzlfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9kbWEuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvZG1hLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIwNWNhYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvZG1hLmgKQEAgLTAsMCArMSw0MSBAQAorLyogbWFjaC9kbWEuaCAtIGFyY2gtc3BlY2lmaWMgRE1BIGRlZmluZXMKKyAqCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2lmbmRlZiBfTUFDSF9ETUFfSF8KKyNkZWZpbmUgX01BQ0hfRE1BX0hfCisKKyNkZWZpbmUgQ0hfUFBJCQkJMAorI2RlZmluZSBDSF9TUE9SVDBfUlgJCTEKKyNkZWZpbmUgQ0hfU1BPUlQwX1RYCQkyCisjZGVmaW5lIENIX1NQT1JUMV9SWAkJMworI2RlZmluZSBDSF9TUE9SVDFfVFgJCTQKKyNkZWZpbmUgQ0hfU1BJMAkJCTUKKyNkZWZpbmUgQ0hfVUFSVDBfUlgJCTYKKyNkZWZpbmUgQ0hfVUFSVDBfVFgJCTcKKyNkZWZpbmUgQ0hfU1BPUlQyX1JYCQk4CisjZGVmaW5lIENIX1NQT1JUMl9UWAkJOQorI2RlZmluZSBDSF9TUE9SVDNfUlgJCTEwCisjZGVmaW5lIENIX1NQT1JUM19UWAkJMTEKKyNkZWZpbmUgQ0hfU1BJMQkJCTE0CisjZGVmaW5lIENIX1NQSTIJCQkxNQorI2RlZmluZSBDSF9VQVJUMV9SWAkJMTYKKyNkZWZpbmUgQ0hfVUFSVDFfVFgJCTE3CisjZGVmaW5lIENIX1VBUlQyX1JYCQkxOAorI2RlZmluZSBDSF9VQVJUMl9UWAkJMTkKKworI2RlZmluZSBDSF9NRU1fU1RSRUFNMF9ERVNUCTIwCisjZGVmaW5lIENIX01FTV9TVFJFQU0wX1NSQwkyMQorI2RlZmluZSBDSF9NRU1fU1RSRUFNMV9ERVNUCTIyCisjZGVmaW5lIENIX01FTV9TVFJFQU0xX1NSQwkyMworI2RlZmluZSBDSF9NRU1fU1RSRUFNMl9ERVNUCTI0CisjZGVmaW5lIENIX01FTV9TVFJFQU0yX1NSQwkyNQorI2RlZmluZSBDSF9NRU1fU1RSRUFNM19ERVNUCTI2CisjZGVmaW5lIENIX01FTV9TVFJFQU0zX1NSQwkyNworCisjZGVmaW5lIE1BWF9ETUFfQ0hBTk5FTFMgMjgKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvZ3Bpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZjRmNzIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMCwwICsxLDc5IEBACisvKgorICogRmlsZTogYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9ncGlvLmgKKyAqIEJ1Z3M6IEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworCisjaWZuZGVmIF9NQUNIX0dQSU9fSF8KKyNkZWZpbmUgX01BQ0hfR1BJT19IXworCisJLyogRklYTUU6CisJICogRm9yIG5vdyBvbmx5IHN1cHBvcnQgUE9SVEYgR1BJT3MuCisJICogUE9SVCBDLEQgYW5kIEUgYXJlIGZvciBwZXJpcGhlcmFsIHVzYWdlIG9ubHkKKwkgKi8KKyNkZWZpbmUgTUFYX0JMQUNLRklOX0dQSU9TIDE2CisKKyNkZWZpbmUJR1BJT19QRjAJMAkvKiBQRiAqLworI2RlZmluZQlHUElPX1BGMQkxCisjZGVmaW5lCUdQSU9fUEYyCTIKKyNkZWZpbmUJR1BJT19QRjMJMworI2RlZmluZQlHUElPX1BGNAk0CisjZGVmaW5lCUdQSU9fUEY1CTUKKyNkZWZpbmUJR1BJT19QRjYJNgorI2RlZmluZQlHUElPX1BGNwk3CisjZGVmaW5lCUdQSU9fUEY4CTgKKyNkZWZpbmUJR1BJT19QRjkJOQorI2RlZmluZQlHUElPX1BGMTAJMTAKKyNkZWZpbmUJR1BJT19QRjExCTExCisjZGVmaW5lCUdQSU9fUEYxMgkxMgorI2RlZmluZQlHUElPX1BGMTMJMTMKKyNkZWZpbmUJR1BJT19QRjE0CTE0CisjZGVmaW5lCUdQSU9fUEYxNQkxNQorI2RlZmluZQlHUElPX1BDMAkxNgkvKiBQQyAqLworI2RlZmluZQlHUElPX1BDMQkxNworI2RlZmluZQlHUElPX1BDNAkyMAorI2RlZmluZQlHUElPX1BDNQkyMQorI2RlZmluZQlHUElPX1BDNgkyMgorI2RlZmluZQlHUElPX1BDNwkyMworI2RlZmluZQlHUElPX1BDOAkyNAorI2RlZmluZQlHUElPX1BDOQkyNQorI2RlZmluZQlHUElPX1BEMAkzMgkvKiBQRCAqLworI2RlZmluZQlHUElPX1BEMQkzMworI2RlZmluZQlHUElPX1BEMgkzNAorI2RlZmluZQlHUElPX1BEMwkzNQorI2RlZmluZQlHUElPX1BENAkzNgorI2RlZmluZQlHUElPX1BENQkzNworI2RlZmluZQlHUElPX1BENgkzOAorI2RlZmluZQlHUElPX1BENwkzOQorI2RlZmluZQlHUElPX1BEOAk0MAorI2RlZmluZQlHUElPX1BEOQk0MQorI2RlZmluZQlHUElPX1BEMTAgICAgICAJNDIKKyNkZWZpbmUJR1BJT19QRDExICAgICAgCTQzCisjZGVmaW5lCUdQSU9fUEQxMiAgICAgIAk0NAorI2RlZmluZQlHUElPX1BEMTMgICAgICAJNDUKKyNkZWZpbmUJR1BJT19QRTAJNDgJLyogUEUgKi8KKyNkZWZpbmUJR1BJT19QRTEJNDkKKyNkZWZpbmUJR1BJT19QRTIJNTAKKyNkZWZpbmUJR1BJT19QRTMJNTEKKyNkZWZpbmUJR1BJT19QRTQJNTIKKyNkZWZpbmUJR1BJT19QRTUJNTMKKyNkZWZpbmUJR1BJT19QRTYJNTQKKyNkZWZpbmUJR1BJT19QRTcJNTUKKyNkZWZpbmUJR1BJT19QRTgJNTYKKyNkZWZpbmUJR1BJT19QRTkJNTcKKyNkZWZpbmUJR1BJT19QRTEwICAgICAgCTU4CisjZGVmaW5lCUdQSU9fUEUxMSAgICAgIAk1OQorI2RlZmluZQlHUElPX1BFMTIgICAgICAJNjAKKyNkZWZpbmUJR1BJT19QRTEzICAgICAgCTYxCisjZGVmaW5lCUdQSU9fUEUxNCAgICAgIAk2MgorI2RlZmluZQlHUElPX1BFMTUgICAgICAJNjMKKworI2RlZmluZSBQT1JUX0YgR1BJT19QRjAKKyNkZWZpbmUgUE9SVF9DIEdQSU9fUEMwCisjZGVmaW5lIFBPUlRfRCBHUElPX1BEMAorI2RlZmluZSBQT1JUX0UgR1BJT19QRTAKKworI2VuZGlmIC8qIF9NQUNIX0dQSU9fSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvaXJxLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2lycS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYzg3ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2lycS5oCkBAIC0wLDAgKzEsMjExIEBACisvKgorICogZmlsZToJaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUzOC9pcnEuaAorICogYmFzZWQgb246CWluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MzcvaXJxLmgKKyAqIGF1dGhvcjoJTWljaGFlbCBIZW5uZXJpY2ggKG1pY2hhZWwuaGVubmVyaWNoQGFuYWxvZy5jb20pCisgKgorICogY3JlYXRlZDoKKyAqIGRlc2NyaXB0aW9uOgorICoJc3lzdGVtIG1tciByZWdpc3RlciBtYXAKKyAqIHJldjoKKyAqCisgKiBtb2RpZmllZDoKKyAqCisgKgorICogYnVnczogICAgICAgICBlbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiB0aGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBnbnUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBmcmVlIHNvZnR3YXJlIGZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIHRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IHdpdGhvdXQgYW55IHdhcnJhbnR5OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIG1lcmNoYW50YWJpbGl0eSBvciBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gIHNlZSB0aGUKKyAqIGdudSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgZ251IGdlbmVyYWwgcHVibGljIGxpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgY29weWluZy4KKyAqIGlmIG5vdCwgd3JpdGUgdG8gdGhlIGZyZWUgc29mdHdhcmUgZm91bmRhdGlvbiwKKyAqIDU5IHRlbXBsZSBwbGFjZSAtIHN1aXRlIDMzMCwgYm9zdG9uLCBtYSAwMjExMS0xMzA3LCB1c2EuCisgKi8KKworI2lmbmRlZiBfQkY1MzhfSVJRX0hfCisjZGVmaW5lIF9CRjUzOF9JUlFfSF8KKworLyoKKyAqIEludGVycnVwdCBzb3VyY2UgZGVmaW5pdGlvbnMKKwlFdmVudCBTb3VyY2UgICAgQ29yZSBFdmVudCBOYW1lCisJQ29yZSAgICAgICAgRW11bGF0aW9uICAgICAgICAgICAgICAgKioKKwlFdmVudHMgICAgICAgICAoaGlnaGVzdCBwcmlvcml0eSkgIEVNVSAgICAgICAgIDAKKwlSZXNldCAgICAgICAgICAgICAgICAgICBSU1QgICAgICAgICAxCisJTk1JICAgICAgICAgICAgICAgICAgICAgTk1JICAgICAgICAgMgorCUV4Y2VwdGlvbiAgICAgICAgICAgICAgIEVWWCAgICAgICAgIDMKKwlSZXNlcnZlZCAgICAgICAgICAgICAgICAtLSAgICAgICAgICA0CisJSGFyZHdhcmUgRXJyb3IgICAgICAgICAgSVZIVyAgICAgICAgNQorCUNvcmUgVGltZXIgICAgICAgICAgICAgIElWVE1SICAgICAgIDYgKgorCisJLi4uLi4KKworCSBTb2Z0d2FyZSBJbnRlcnJ1cHQgMSAgICBJVkcxNCAgICAgICAzMQorCSBTb2Z0d2FyZSBJbnRlcnJ1cHQgMiAgICAtLQorCSAobG93ZXN0IHByaW9yaXR5KSAgSVZHMTUgICAgICAgMzIgKgorKi8KKworI2RlZmluZSBOUl9QRVJJX0lOVFMgICAgKDIgKiAzMikKKworLyogVGhlIEFCU1RSQUNUIElSUSBkZWZpbml0aW9ucyAqLworLyoqIHRoZSBmaXJzdCBzZXZlbiBvZiB0aGUgZm9sbG93aW5nIGFyZSBmaXhlZCwgdGhlIHJlc3QgeW91IGNoYW5nZSBpZiB5b3UgbmVlZCB0byAqKi8KKyNkZWZpbmUgSVJRX0VNVQkJCTAJLyogRW11bGF0aW9uICovCisjZGVmaW5lIElSUV9SU1QJCQkxCS8qIHJlc2V0ICovCisjZGVmaW5lIElSUV9OTUkJCQkyCS8qIE5vbiBNYXNrYWJsZSAqLworI2RlZmluZSBJUlFfRVZYCQkJMwkvKiBFeGNlcHRpb24gKi8KKyNkZWZpbmUgSVJRX1VOVVNFRAkJNAkvKiAtIHVudXNlZCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSVJRX0hXRVJSCQk1CS8qIEhhcmR3YXJlIEVycm9yICovCisjZGVmaW5lIElSUV9DT1JFVE1SCQk2CS8qIENvcmUgdGltZXIgKi8KKworI2RlZmluZSBCRklOX0lSUSh4KQkJKCh4KSArIDcpCisKKyNkZWZpbmUgSVJRX1BMTF9XQUtFVVAJCUJGSU5fSVJRKDApCS8qIFBMTCBXYWtldXAgSW50ZXJydXB0ICovCisjZGVmaW5lIElSUV9ETUEwX0VSUk9SCQlCRklOX0lSUSgxKQkvKiBETUEgRXJyb3IgMCAoZ2VuZXJpYykgKi8KKyNkZWZpbmUgSVJRX1BQSV9FUlJPUgkJQkZJTl9JUlEoMikJLyogUFBJIEVycm9yICovCisjZGVmaW5lIElSUV9TUE9SVDBfRVJST1IJQkZJTl9JUlEoMykJLyogU1BPUlQwIFN0YXR1cyAqLworI2RlZmluZSBJUlFfU1BPUlQxX0VSUk9SCUJGSU5fSVJRKDQpCS8qIFNQT1JUMSBTdGF0dXMgKi8KKyNkZWZpbmUgSVJRX1NQSTBfRVJST1IJCUJGSU5fSVJRKDUpCS8qIFNQSTAgU3RhdHVzICovCisjZGVmaW5lIElSUV9VQVJUMF9FUlJPUgkJQkZJTl9JUlEoNikJLyogVUFSVDAgU3RhdHVzICovCisjZGVmaW5lIElSUV9SVEMJCQlCRklOX0lSUSg3KQkvKiBSVEMgKi8KKyNkZWZpbmUgSVJRX1BQSQkJCUJGSU5fSVJRKDgpCS8qIERNQSBDaGFubmVsIDAgKFBQSSkgKi8KKyNkZWZpbmUgSVJRX1NQT1JUMF9SWAkJQkZJTl9JUlEoOSkJLyogRE1BIDEgQ2hhbm5lbCAoU1BPUlQwIFJYKSAqLworI2RlZmluZSBJUlFfU1BPUlQwX1RYCQlCRklOX0lSUSgxMCkJLyogRE1BIDIgQ2hhbm5lbCAoU1BPUlQwIFRYKSAqLworI2RlZmluZSBJUlFfU1BPUlQxX1JYCQlCRklOX0lSUSgxMSkJLyogRE1BIDMgQ2hhbm5lbCAoU1BPUlQxIFJYKSAqLworI2RlZmluZSBJUlFfU1BPUlQxX1RYCQlCRklOX0lSUSgxMikJLyogRE1BIDQgQ2hhbm5lbCAoU1BPUlQxIFRYKSAqLworI2RlZmluZSBJUlFfU1BJMAkJQkZJTl9JUlEoMTMpCS8qIERNQSA1IENoYW5uZWwgKFNQSTApICovCisjZGVmaW5lIElSUV9VQVJUMF9SWAkJQkZJTl9JUlEoMTQpCS8qIERNQSA2IENoYW5uZWwgKFVBUlQwIFJYKSAqLworI2RlZmluZSBJUlFfVUFSVDBfVFgJCUJGSU5fSVJRKDE1KQkvKiBETUEgNyBDaGFubmVsIChVQVJUMCBUWCkgKi8KKyNkZWZpbmUgSVJRX1RJTUVSMAkJQkZJTl9JUlEoMTYpCS8qIFRpbWVyIDAgKi8KKyNkZWZpbmUgSVJRX1RJTUVSMQkJQkZJTl9JUlEoMTcpCS8qIFRpbWVyIDEgKi8KKyNkZWZpbmUgSVJRX1RJTUVSMgkJQkZJTl9JUlEoMTgpCS8qIFRpbWVyIDIgKi8KKyNkZWZpbmUgSVJRX1BPUlRGX0lOVEEJCUJGSU5fSVJRKDE5KQkvKiBQb3J0IEYgSW50ZXJydXB0IEEgKi8KKyNkZWZpbmUgSVJRX1BPUlRGX0lOVEIJCUJGSU5fSVJRKDIwKQkvKiBQb3J0IEYgSW50ZXJydXB0IEIgKi8KKyNkZWZpbmUgSVJRX01FTTBfRE1BMAkJQkZJTl9JUlEoMjEpCS8qIE1ETUEwIFN0cmVhbSAwICovCisjZGVmaW5lIElSUV9NRU0wX0RNQTEJCUJGSU5fSVJRKDIyKQkvKiBNRE1BMCBTdHJlYW0gMSAqLworI2RlZmluZSBJUlFfV0FUQ0gJCUJGSU5fSVJRKDIzKQkvKiBTb2Z0d2FyZSBXYXRjaGRvZyBUaW1lciAqLworI2RlZmluZSBJUlFfRE1BMV9FUlJPUgkJQkZJTl9JUlEoMjQpCS8qIERNQSBFcnJvciAxIChnZW5lcmljKSAqLworI2RlZmluZSBJUlFfU1BPUlQyX0VSUk9SCUJGSU5fSVJRKDI1KQkvKiBTUE9SVDIgU3RhdHVzICovCisjZGVmaW5lIElSUV9TUE9SVDNfRVJST1IJQkZJTl9JUlEoMjYpCS8qIFNQT1JUMyBTdGF0dXMgKi8KKyNkZWZpbmUgSVJRX1NQSTFfRVJST1IJCUJGSU5fSVJRKDI4KQkvKiBTUEkxIFN0YXR1cyAqLworI2RlZmluZSBJUlFfU1BJMl9FUlJPUgkJQkZJTl9JUlEoMjkpCS8qIFNQSTIgU3RhdHVzICovCisjZGVmaW5lIElSUV9VQVJUMV9FUlJPUgkJQkZJTl9JUlEoMzApCS8qIFVBUlQxIFN0YXR1cyAqLworI2RlZmluZSBJUlFfVUFSVDJfRVJST1IJCUJGSU5fSVJRKDMxKQkvKiBVQVJUMiBTdGF0dXMgKi8KKyNkZWZpbmUgSVJRX0NBTl9FUlJPUgkJQkZJTl9JUlEoMzIpCS8qIENBTiBTdGF0dXMgKEVycm9yKSBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSVJRX1NQT1JUMl9SWAkJQkZJTl9JUlEoMzMpCS8qIERNQSA4IENoYW5uZWwgKFNQT1JUMiBSWCkgKi8KKyNkZWZpbmUgSVJRX1NQT1JUMl9UWAkJQkZJTl9JUlEoMzQpCS8qIERNQSA5IENoYW5uZWwgKFNQT1JUMiBUWCkgKi8KKyNkZWZpbmUgSVJRX1NQT1JUM19SWAkJQkZJTl9JUlEoMzUpCS8qIERNQSAxMCBDaGFubmVsIChTUE9SVDMgUlgpICovCisjZGVmaW5lIElSUV9TUE9SVDNfVFgJCUJGSU5fSVJRKDM2KQkvKiBETUEgMTEgQ2hhbm5lbCAoU1BPUlQzIFRYKSAqLworI2RlZmluZSBJUlFfU1BJMQkJQkZJTl9JUlEoMzkpCS8qIERNQSAxNCBDaGFubmVsIChTUEkxKSAqLworI2RlZmluZSBJUlFfU1BJMgkJQkZJTl9JUlEoNDApCS8qIERNQSAxNSBDaGFubmVsIChTUEkyKSAqLworI2RlZmluZSBJUlFfVUFSVDFfUlgJCUJGSU5fSVJRKDQxKQkvKiBETUEgMTYgQ2hhbm5lbCAoVUFSVDEgUlgpICovCisjZGVmaW5lIElSUV9VQVJUMV9UWAkJQkZJTl9JUlEoNDIpCS8qIERNQSAxNyBDaGFubmVsIChVQVJUMSBUWCkgKi8KKyNkZWZpbmUgSVJRX1VBUlQyX1JYCQlCRklOX0lSUSg0MykJLyogRE1BIDE4IENoYW5uZWwgKFVBUlQyIFJYKSAqLworI2RlZmluZSBJUlFfVUFSVDJfVFgJCUJGSU5fSVJRKDQ0KQkvKiBETUEgMTkgQ2hhbm5lbCAoVUFSVDIgVFgpICovCisjZGVmaW5lIElSUV9UV0kwCQlCRklOX0lSUSg0NSkJLyogVFdJMCAqLworI2RlZmluZSBJUlFfVFdJMQkJQkZJTl9JUlEoNDYpCS8qIFRXSTEgKi8KKyNkZWZpbmUgSVJRX0NBTl9SWAkJQkZJTl9JUlEoNDcpCS8qIENBTiBSZWNlaXZlIEludGVycnVwdCAqLworI2RlZmluZSBJUlFfQ0FOX1RYCQlCRklOX0lSUSg0OCkJLyogQ0FOIFRyYW5zbWl0IEludGVycnVwdCAqLworI2RlZmluZSBJUlFfTUVNMV9ETUEwCQlCRklOX0lSUSg0OSkJLyogTURNQTEgU3RyZWFtIDAgKi8KKyNkZWZpbmUgSVJRX01FTTFfRE1BMQkJQkZJTl9JUlEoNTApCS8qIE1ETUExIFN0cmVhbSAxICovCisKKyNkZWZpbmUgU1lTX0lSUVMJCUJGSU5fSVJRKDYzKQkvKiA3MCAqLworCisjZGVmaW5lIElSUV9QRjAgICAgICAgICA3MQorI2RlZmluZSBJUlFfUEYxICAgICAgICAgNzIKKyNkZWZpbmUgSVJRX1BGMiAgICAgICAgIDczCisjZGVmaW5lIElSUV9QRjMgICAgICAgICA3NAorI2RlZmluZSBJUlFfUEY0ICAgICAgICAgNzUKKyNkZWZpbmUgSVJRX1BGNSAgICAgICAgIDc2CisjZGVmaW5lIElSUV9QRjYgICAgICAgICA3NworI2RlZmluZSBJUlFfUEY3ICAgICAgICAgNzgKKyNkZWZpbmUgSVJRX1BGOCAgICAgICAgIDc5CisjZGVmaW5lIElSUV9QRjkgICAgICAgICA4MAorI2RlZmluZSBJUlFfUEYxMCAgICAgICAgODEKKyNkZWZpbmUgSVJRX1BGMTEgICAgICAgIDgyCisjZGVmaW5lIElSUV9QRjEyICAgICAgICA4MworI2RlZmluZSBJUlFfUEYxMyAgICAgICAgODQKKyNkZWZpbmUgSVJRX1BGMTQgICAgICAgIDg1CisjZGVmaW5lIElSUV9QRjE1ICAgICAgICA4NgorCisjZGVmaW5lIEdQSU9fSVJRX0JBU0UJSVJRX1BGMAorCisjZGVmaW5lIE5SX0lSUVMgICAgIChJUlFfUEYxNSsxKQorCisjZGVmaW5lIElWRzcgICAgICAgICAgICA3CisjZGVmaW5lIElWRzggICAgICAgICAgICA4CisjZGVmaW5lIElWRzkgICAgICAgICAgICA5CisjZGVmaW5lIElWRzEwICAgICAgICAgICAxMAorI2RlZmluZSBJVkcxMSAgICAgICAgICAgMTEKKyNkZWZpbmUgSVZHMTIgICAgICAgICAgIDEyCisjZGVmaW5lIElWRzEzICAgICAgICAgICAxMworI2RlZmluZSBJVkcxNCAgICAgICAgICAgMTQKKyNkZWZpbmUgSVZHMTUgICAgICAgICAgIDE1CisKKy8qIElBUjAgQklUIEZJRUxEUyAqLworI2RlZmluZSBJUlFfUExMX1dBS0VVUF9QT1MJMAorI2RlZmluZSBJUlFfRE1BMF9FUlJPUl9QT1MJNAorI2RlZmluZSBJUlFfUFBJX0VSUk9SX1BPUwk4CisjZGVmaW5lIElSUV9TUE9SVDBfRVJST1JfUE9TCTEyCisjZGVmaW5lIElSUV9TUE9SVDFfRVJST1JfUE9TCTE2CisjZGVmaW5lIElSUV9TUEkwX0VSUk9SX1BPUwkyMAorI2RlZmluZSBJUlFfVUFSVDBfRVJST1JfUE9TCTI0CisjZGVmaW5lIElSUV9SVENfUE9TCQkyOAorCisvKiBJQVIxIEJJVCBGSUVMRFMgKi8KKyNkZWZpbmUgSVJRX1BQSV9QT1MJCTAKKyNkZWZpbmUgSVJRX1NQT1JUMF9SWF9QT1MJNAorI2RlZmluZSBJUlFfU1BPUlQwX1RYX1BPUwk4CisjZGVmaW5lIElSUV9TUE9SVDFfUlhfUE9TCTEyCisjZGVmaW5lIElSUV9TUE9SVDFfVFhfUE9TCTE2CisjZGVmaW5lIElSUV9TUEkwX1BPUwkJMjAKKyNkZWZpbmUgSVJRX1VBUlQwX1JYX1BPUwkyNAorI2RlZmluZSBJUlFfVUFSVDBfVFhfUE9TCTI4CisKKy8qIElBUjIgQklUIEZJRUxEUyAqLworI2RlZmluZSBJUlFfVElNRVIwX1BPUwkJMAorI2RlZmluZSBJUlFfVElNRVIxX1BPUwkJNAorI2RlZmluZSBJUlFfVElNRVIyX1BPUwkJOAorI2RlZmluZSBJUlFfUE9SVEZfSU5UQV9QT1MJMTIKKyNkZWZpbmUgSVJRX1BPUlRGX0lOVEJfUE9TCTE2CisjZGVmaW5lIElSUV9NRU0wX0RNQTBfUE9TCTIwCisjZGVmaW5lIElSUV9NRU0wX0RNQTFfUE9TCTI0CisjZGVmaW5lIElSUV9XQVRDSF9QT1MJCTI4CisKKy8qIElBUjMgQklUIEZJRUxEUyAqLworI2RlZmluZSBJUlFfRE1BMV9FUlJPUl9QT1MJMAorI2RlZmluZSBJUlFfU1BPUlQyX0VSUk9SX1BPUwk0CisjZGVmaW5lIElSUV9TUE9SVDNfRVJST1JfUE9TCTgKKyNkZWZpbmUgSVJRX1NQSTFfRVJST1JfUE9TCTE2CisjZGVmaW5lIElSUV9TUEkyX0VSUk9SX1BPUwkyMAorI2RlZmluZSBJUlFfVUFSVDFfRVJST1JfUE9TCTI0CisjZGVmaW5lIElSUV9VQVJUMl9FUlJPUl9QT1MJMjgKKworLyogSUFSNCBCSVQgRklFTERTICovCisjZGVmaW5lIElSUV9DQU5fRVJST1JfUE9TCTAKKyNkZWZpbmUgSVJRX1NQT1JUMl9SWF9QT1MJNAorI2RlZmluZSBJUlFfU1BPUlQyX1RYX1BPUwk4CisjZGVmaW5lIElSUV9TUE9SVDNfUlhfUE9TCTEyCisjZGVmaW5lIElSUV9TUE9SVDNfVFhfUE9TCTE2CisjZGVmaW5lIElSUV9TUEkxX1BPUwkJMjgKKworLyogSUFSNSBCSVQgRklFTERTICovCisjZGVmaW5lIElSUV9TUEkyX1BPUwkJMAorI2RlZmluZSBJUlFfVUFSVDFfUlhfUE9TCTQKKyNkZWZpbmUgSVJRX1VBUlQxX1RYX1BPUwk4CisjZGVmaW5lIElSUV9VQVJUMl9SWF9QT1MJMTIKKyNkZWZpbmUgSVJRX1VBUlQyX1RYX1BPUwkxNgorI2RlZmluZSBJUlFfVFdJMF9QT1MJCTIwCisjZGVmaW5lIElSUV9UV0kxX1BPUwkJMjQKKyNkZWZpbmUgSVJRX0NBTl9SWF9QT1MJCTI4CisKKy8qIElBUjYgQklUIEZJRUxEUyAqLworI2RlZmluZSBJUlFfQ0FOX1RYX1BPUwkJMAorI2RlZmluZSBJUlFfTUVNMV9ETUEwX1BPUwk0CisjZGVmaW5lIElSUV9NRU0xX0RNQTFfUE9TCTgKKyNlbmRpZgkJCQkvKiBfQkY1MzhfSVJRX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL21lbV9tYXAuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvbWVtX21hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ODExOTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL21lbV9tYXAuaApAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUzOC9tZW1fbWFwLmgKKyAqIEJhc2VkIG9uOgorICogQXV0aG9yOgorICoKKyAqIENyZWF0ZWQ6CisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBSZXY6CisgKgorICogTW9kaWZpZWQ6CisgKgorICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAqIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUVNX01BUF81MzhfSF8KKyNkZWZpbmUgX01FTV9NQVBfNTM4X0hfCisKKyNkZWZpbmUgQ09SRU1NUl9CQVNFICAgICAgICAgICAweEZGRTAwMDAwCSAvKiBDb3JlIE1NUnMgKi8KKyNkZWZpbmUgU1lTTU1SX0JBU0UgICAgICAgICAgICAweEZGQzAwMDAwCSAvKiBTeXN0ZW0gTU1ScyAqLworCisvKiBBc3luYyBNZW1vcnkgQmFua3MgKi8KKyNkZWZpbmUgQVNZTkNfQkFOSzNfQkFTRQkweDIwMzAwMDAwCSAvKiBBc3luYyBCYW5rIDMgKi8KKyNkZWZpbmUgQVNZTkNfQkFOSzNfU0laRQkweDAwMTAwMDAwCS8qIDFNICovCisjZGVmaW5lIEFTWU5DX0JBTksyX0JBU0UJMHgyMDIwMDAwMAkgLyogQXN5bmMgQmFuayAyICovCisjZGVmaW5lIEFTWU5DX0JBTksyX1NJWkUJMHgwMDEwMDAwMAkvKiAxTSAqLworI2RlZmluZSBBU1lOQ19CQU5LMV9CQVNFCTB4MjAxMDAwMDAJIC8qIEFzeW5jIEJhbmsgMSAqLworI2RlZmluZSBBU1lOQ19CQU5LMV9TSVpFCTB4MDAxMDAwMDAJLyogMU0gKi8KKyNkZWZpbmUgQVNZTkNfQkFOSzBfQkFTRQkweDIwMDAwMDAwCSAvKiBBc3luYyBCYW5rIDAgKi8KKyNkZWZpbmUgQVNZTkNfQkFOSzBfU0laRQkweDAwMTAwMDAwCS8qIDFNICovCisKKy8qIEJvb3QgUk9NIE1lbW9yeSAqLworCisjZGVmaW5lIEJPT1RfUk9NX1NUQVJUCQkweEVGMDAwMDAwCisjZGVmaW5lIEJPT1RfUk9NX0xFTkdUSAkJMHg0MDAKKworLyogTGV2ZWwgMSBNZW1vcnkgKi8KKworI2lmZGVmIENPTkZJR19CRklOX0lDQUNIRQorI2RlZmluZSBCRklOX0lDQUNIRVNJWkUJKDE2KjEwMjQpCisjZWxzZQorI2RlZmluZSBCRklOX0lDQUNIRVNJWkUJKDAqMTAyNCkKKyNlbmRpZgorCisvKiBNZW1vcnkgTWFwIGZvciBBRFNQLUJGNTM4LzkgcHJvY2Vzc29ycyAqLworCisjZGVmaW5lIEwxX0NPREVfU1RBUlQgICAgICAgMHhGRkEwMDAwMAorI2RlZmluZSBMMV9EQVRBX0FfU1RBUlQgICAgIDB4RkY4MDAwMDAKKyNkZWZpbmUgTDFfREFUQV9CX1NUQVJUICAgICAweEZGOTAwMDAwCisKKyNpZmRlZiBDT05GSUdfQkZJTl9JQ0FDSEUKKyNkZWZpbmUgTDFfQ09ERV9MRU5HVEggICAgICAoMHgxNDAwMCAtIDB4NDAwMCkKKyNlbHNlCisjZGVmaW5lIEwxX0NPREVfTEVOR1RIICAgICAgMHgxNDAwMAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQkZJTl9EQ0FDSEUKKworI2lmZGVmIENPTkZJR19CRklOX0RDQUNIRV9CQU5LQQorI2RlZmluZSBETUVNX0NOVFIgKEFDQUNIRV9CU1JBTSB8IEVORENQTEIgfCBQT1JUX1BSRUYwKQorI2RlZmluZSBMMV9EQVRBX0FfTEVOR1RIICAgICAgKDB4ODAwMCAtIDB4NDAwMCkKKyNkZWZpbmUgTDFfREFUQV9CX0xFTkdUSCAgICAgIDB4ODAwMAorI2RlZmluZSBCRklOX0RDQUNIRVNJWkUJKDE2KjEwMjQpCisjZGVmaW5lIEJGSU5fRFNVUEJBTktTCTEKKyNlbHNlCisjZGVmaW5lIERNRU1fQ05UUiAoQUNBQ0hFX0JDQUNIRSB8IEVORENQTEIgfCBQT1JUX1BSRUYwKQorI2RlZmluZSBMMV9EQVRBX0FfTEVOR1RIICAgICAgKDB4ODAwMCAtIDB4NDAwMCkKKyNkZWZpbmUgTDFfREFUQV9CX0xFTkdUSCAgICAgICgweDgwMDAgLSAweDQwMDApCisjZGVmaW5lIEJGSU5fRENBQ0hFU0laRQkoMzIqMTAyNCkKKyNkZWZpbmUgQkZJTl9EU1VQQkFOS1MJMgorI2VuZGlmCisKKyNlbHNlCisjZGVmaW5lIERNRU1fQ05UUiAoQVNSQU1fQlNSQU0gfCBFTkRDUExCIHwgUE9SVF9QUkVGMCkKKyNkZWZpbmUgTDFfREFUQV9BX0xFTkdUSCAgICAgIDB4ODAwMAorI2RlZmluZSBMMV9EQVRBX0JfTEVOR1RIICAgICAgMHg4MDAwCisjZGVmaW5lIEJGSU5fRENBQ0hFU0laRQkoMCoxMDI0KQorI2RlZmluZSBCRklOX0RTVVBCQU5LUwkwCisjZW5kaWYgLypDT05GSUdfQkZJTl9EQ0FDSEUqLworCisKKy8qIExldmVsIDIgTWVtb3J5IC0gbm9uZSAqLworCisjZGVmaW5lIEwyX1NUQVJUCTAKKyNkZWZpbmUgTDJfTEVOR1RICTAKKworLyogU2NyYXRjaCBQYWQgTWVtb3J5ICovCisKKyNkZWZpbmUgTDFfU0NSQVRDSF9TVEFSVAkweEZGQjAwMDAwCisjZGVmaW5lIEwxX1NDUkFUQ0hfTEVOR1RICTB4MTAwMAorCisjZGVmaW5lIEdFVF9QREFfU0FGRShwcmVnKQkJXAorCXByZWcubCA9IF9jcHVfcGRhOwkJXAorCXByZWcuaCA9IF9jcHVfcGRhOworCisjZGVmaW5lIEdFVF9QREEocHJlZywgZHJlZykJR0VUX1BEQV9TQUZFKHByZWcpCisKKyNlbmRpZgkJCQkvKiBfTUVNX01BUF81MzhfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvcG9ydG11eC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9wb3J0bXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUwMzFiNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvcG9ydG11eC5oCkBAIC0wLDAgKzEsMTA2IEBACisjaWZuZGVmIF9NQUNIX1BPUlRNVVhfSF8KKyNkZWZpbmUgX01BQ0hfUE9SVE1VWF9IXworCisjZGVmaW5lIE1BWF9SRVNPVVJDRVMJTUFYX0JMQUNLRklOX0dQSU9TCisKKyNkZWZpbmUgUF9UTVIyCQkoUF9ET05UQ0FSRSkKKyNkZWZpbmUgUF9UTVIxCQkoUF9ET05UQ0FSRSkKKyNkZWZpbmUgUF9UTVIwCQkoUF9ET05UQ0FSRSkKKyNkZWZpbmUgUF9UTVJDTEsJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfUFBJMF9DTEsJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfUFBJMF9GUzEJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfUFBJMF9GUzIJKFBfRE9OVENBUkUpCisKKyNkZWZpbmUgUF9UV0kwX1NDTAkoUF9ET05UQ0FSRSkKKyNkZWZpbmUgUF9UV0kwX1NEQQkoUF9ET05UQ0FSRSkKKyNkZWZpbmUgUF9UV0kxX1NDTAkoUF9ET05UQ0FSRSkKKyNkZWZpbmUgUF9UV0kxX1NEQQkoUF9ET05UQ0FSRSkKKworI2RlZmluZSBQX1NQT1JUMV9UU0NMSwkoUF9ET05UQ0FSRSkKKyNkZWZpbmUgUF9TUE9SVDFfUlNDTEsJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfU1BPUlQwX1RTQ0xLCShQX0RPTlRDQVJFKQorI2RlZmluZSBQX1NQT1JUMF9SU0NMSwkoUF9ET05UQ0FSRSkKKyNkZWZpbmUgUF9TUE9SVDFfRFJTRUMJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfU1BPUlQxX1JGUwkoUF9ET05UQ0FSRSkKKyNkZWZpbmUgUF9TUE9SVDFfRFRQUkkJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfU1BPUlQxX0RUU0VDCShQX0RPTlRDQVJFKQorI2RlZmluZSBQX1NQT1JUMV9URlMJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfU1BPUlQxX0RSUFJJCShQX0RPTlRDQVJFKQorI2RlZmluZSBQX1NQT1JUMF9EUlNFQwkoUF9ET05UQ0FSRSkKKyNkZWZpbmUgUF9TUE9SVDBfUkZTCShQX0RPTlRDQVJFKQorI2RlZmluZSBQX1NQT1JUMF9EVFBSSQkoUF9ET05UQ0FSRSkKKyNkZWZpbmUgUF9TUE9SVDBfRFRTRUMJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfU1BPUlQwX1RGUwkoUF9ET05UQ0FSRSkKKyNkZWZpbmUgUF9TUE9SVDBfRFJQUkkJKFBfRE9OVENBUkUpCisKKyNkZWZpbmUgUF9VQVJUMF9SWAkoUF9ET05UQ0FSRSkKKyNkZWZpbmUgUF9VQVJUMF9UWAkoUF9ET05UQ0FSRSkKKworI2RlZmluZSBQX1NQSTBfTU9TSQkoUF9ET05UQ0FSRSkKKyNkZWZpbmUgUF9TUEkwX01JU08JKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfU1BJMF9TQ0sJKFBfRE9OVENBUkUpCisKKyNkZWZpbmUgUF9QUEkwX0QwCShQX0RPTlRDQVJFKQorI2RlZmluZSBQX1BQSTBfRDEJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfUFBJMF9EMgkoUF9ET05UQ0FSRSkKKyNkZWZpbmUgUF9QUEkwX0QzCShQX0RPTlRDQVJFKQorCisjZGVmaW5lIFBfQ0FOMF9UWAkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BDMCkpCisjZGVmaW5lIFBfQ0FOMF9SWAkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BDMSkpCisKKyNkZWZpbmUgUF9TUEkxX01PU0kJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRDApKQorI2RlZmluZSBQX1NQSTFfTUlTTwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BEMSkpCisjZGVmaW5lIFBfU1BJMV9TQ0sJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRDIpKQorI2RlZmluZSBQX1NQSTFfU1MJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRDMpKQorI2RlZmluZSBQX1NQSTFfU1NFTDEJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRDQpKQorI2RlZmluZSBQX1NQSTJfTU9TSQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BENSkpCisjZGVmaW5lIFBfU1BJMl9NSVNPCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEQ2KSkKKyNkZWZpbmUgUF9TUEkyX1NDSwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BENykpCisjZGVmaW5lIFBfU1BJMl9TUwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BEOCkpCisjZGVmaW5lIFBfU1BJMl9TU0VMMQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BEOSkpCisjZGVmaW5lIFBfVUFSVDFfUlgJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRDEwKSkKKyNkZWZpbmUgUF9VQVJUMV9UWAkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BEMTEpKQorI2RlZmluZSBQX1VBUlQyX1JYCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEQxMikpCisjZGVmaW5lIFBfVUFSVDJfVFgJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRDEzKSkKKworI2RlZmluZSBQX1NQT1JUMl9SU0NMSwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BFMCkpCisjZGVmaW5lIFBfU1BPUlQyX1JGUwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BFMSkpCisjZGVmaW5lIFBfU1BPUlQyX0RSUFJJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEUyKSkKKyNkZWZpbmUgUF9TUE9SVDJfRFJTRUMJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRTMpKQorI2RlZmluZSBQX1NQT1JUMl9UU0NMSwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BFNCkpCisjZGVmaW5lIFBfU1BPUlQyX1RGUwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BFNSkpCisjZGVmaW5lIFBfU1BPUlQyX0RUUFJJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEU2KSkKKyNkZWZpbmUgUF9TUE9SVDJfRFRTRUMJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRTcpKQorI2RlZmluZSBQX1NQT1JUM19SU0NMSwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BFOCkpCisjZGVmaW5lIFBfU1BPUlQzX1JGUwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BFOSkpCisjZGVmaW5lIFBfU1BPUlQzX0RSUFJJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEUxMCkpCisjZGVmaW5lIFBfU1BPUlQzX0RSU0VDCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEUxMSkpCisjZGVmaW5lIFBfU1BPUlQzX1RTQ0xLCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEUxMikpCisjZGVmaW5lIFBfU1BPUlQzX1RGUwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BFMTMpKQorI2RlZmluZSBQX1NQT1JUM19EVFBSSQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BFMTQpKQorI2RlZmluZSBQX1NQT1JUM19EVFNFQwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BFMTUpKQorCisjZGVmaW5lIFBfUFBJMF9GUzMJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjMpKQorI2RlZmluZSBQX1BQSTBfRDE1CShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEY0KSkKKyNkZWZpbmUgUF9QUEkwX0QxNAkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGNSkpCisjZGVmaW5lIFBfUFBJMF9EMTMJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjYpKQorI2RlZmluZSBQX1BQSTBfRDEyCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEY3KSkKKyNkZWZpbmUgUF9QUEkwX0QxMQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGOCkpCisjZGVmaW5lIFBfUFBJMF9EMTAJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjkpKQorI2RlZmluZSBQX1BQSTBfRDkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjEwKSkKKyNkZWZpbmUgUF9QUEkwX0Q4CShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYxMSkpCisKKyNkZWZpbmUgUF9QUEkwX0Q0CShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYxNSkpCisjZGVmaW5lIFBfUFBJMF9ENQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMTQpKQorI2RlZmluZSBQX1BQSTBfRDYJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjEzKSkKKyNkZWZpbmUgUF9QUEkwX0Q3CShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYxMikpCisjZGVmaW5lIFBfU1BJMF9TU0VMNwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGNykpCisjZGVmaW5lIFBfU1BJMF9TU0VMNgkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGNikpCisjZGVmaW5lIFBfU1BJMF9TU0VMNQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGNSkpCisjZGVmaW5lIFBfU1BJMF9TU0VMNAkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGNCkpCisjZGVmaW5lIFBfU1BJMF9TU0VMMwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMykpCisjZGVmaW5lIFBfU1BJMF9TU0VMMgkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMikpCisjZGVmaW5lIFBfU1BJMF9TU0VMMQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMSkpCisjZGVmaW5lIFBfU1BJMF9TUwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMCkpCisKKyNlbmRpZiAvKiBfTUFDSF9QT1JUTVVYX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW50cy1wcmlvcml0eS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2ludHMtcHJpb3JpdHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGQxN2U1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2ludHMtcHJpb3JpdHkuYwpAQCAtMCwwICsxLDk0IEBACisvKgorICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW50cy1wcmlvcml0eS5jCisgKiBCYXNlZCBvbjogICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbnRzLXByaW9yaXR5LmMKKyAqIEF1dGhvcjogICAgICAgTWljaGFlbCBIZW5uZXJpY2gKKyAqCisgKiBDcmVhdGVkOgorICogRGVzY3JpcHRpb246ICBTZXQgdXAgdGhlIGludGVycnVwdCBwcmlvcml0aWVzCisgKgorICogTW9kaWZpZWQ6CisgKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCisgKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CisKK3ZvaWQgX19pbml0IHByb2dyYW1fSUFSKHZvaWQpCit7CisKKwkvKiBQcm9ncmFtIHRoZSBJQVIwIFJlZ2lzdGVyIHdpdGggdGhlIGNvbmZpZ3VyZWQgcHJpb3JpdHkgKi8KKwliZmluX3dyaXRlX1NJQ19JQVIwKCgoQ09ORklHX0lSUV9QTExfV0FLRVVQIC0gNykgPDwgSVJRX1BMTF9XQUtFVVBfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfRE1BMF9FUlJPUiAtIDcpIDw8IElSUV9ETUEwX0VSUk9SX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1BQSV9FUlJPUiAtIDcpIDw8IElSUV9QUElfRVJST1JfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfU1BPUlQwX0VSUk9SIC0gNykgPDwgSVJRX1NQT1JUMF9FUlJPUl9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9TUE9SVDFfRVJST1IgLSA3KSA8PCBJUlFfU1BPUlQxX0VSUk9SX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1NQSTBfRVJST1IgLSA3KSA8PCBJUlFfU1BJMF9FUlJPUl9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9VQVJUMF9FUlJPUiAtIDcpIDw8IElSUV9VQVJUMF9FUlJPUl9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9SVEMgLSA3KSA8PCBJUlFfUlRDX1BPUykpOworCisJYmZpbl93cml0ZV9TSUNfSUFSMSgoKENPTkZJR19JUlFfUFBJIC0gNykgPDwgSVJRX1BQSV9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9TUE9SVDBfUlggLSA3KSA8PCBJUlFfU1BPUlQwX1JYX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1NQT1JUMF9UWCAtIDcpIDw8IElSUV9TUE9SVDBfVFhfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfU1BPUlQxX1JYIC0gNykgPDwgSVJRX1NQT1JUMV9SWF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9TUE9SVDFfVFggLSA3KSA8PCBJUlFfU1BPUlQxX1RYX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1NQSTAgLSA3KSA8PCBJUlFfU1BJMF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9VQVJUMF9SWCAtIDcpIDw8IElSUV9VQVJUMF9SWF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9VQVJUMF9UWCAtIDcpIDw8IElSUV9VQVJUMF9UWF9QT1MpKTsKKworCWJmaW5fd3JpdGVfU0lDX0lBUjIoKChDT05GSUdfSVJRX1RJTUVSMCAtIDcpIDw8IElSUV9USU1FUjBfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVElNRVIxIC0gNykgPDwgSVJRX1RJTUVSMV9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9USU1FUjIgLSA3KSA8PCBJUlFfVElNRVIyX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1BPUlRGX0lOVEEgLSA3KSA8PCBJUlFfUE9SVEZfSU5UQV9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9QT1JURl9JTlRCIC0gNykgPDwgSVJRX1BPUlRGX0lOVEJfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfTUVNMF9ETUEwIC0gNykgPDwgSVJRX01FTTBfRE1BMF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9NRU0wX0RNQTEgLSA3KSA8PCBJUlFfTUVNMF9ETUExX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1dBVENIIC0gNykgPDwgSVJRX1dBVENIX1BPUykpOworCisJYmZpbl93cml0ZV9TSUNfSUFSMygoKENPTkZJR19JUlFfRE1BMV9FUlJPUiAtIDcpIDw8IElSUV9ETUExX0VSUk9SX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1NQT1JUMl9FUlJPUiAtIDcpIDw8IElSUV9TUE9SVDJfRVJST1JfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfU1BPUlQzX0VSUk9SIC0gNykgPDwgSVJRX1NQT1JUM19FUlJPUl9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9TUEkxX0VSUk9SIC0gNykgPDwgSVJRX1NQSTFfRVJST1JfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfU1BJMl9FUlJPUiAtIDcpIDw8IElSUV9TUEkyX0VSUk9SX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1VBUlQxX0VSUk9SIC0gNykgPDwgSVJRX1VBUlQxX0VSUk9SX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1VBUlQyX0VSUk9SIC0gNykgPDwgSVJRX1VBUlQyX0VSUk9SX1BPUykpOworCisJYmZpbl93cml0ZV9TSUNfSUFSNCgoKENPTkZJR19JUlFfQ0FOX0VSUk9SIC0gNykgPDwgSVJRX0NBTl9FUlJPUl9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9TUE9SVDJfUlggLSA3KSA8PCBJUlFfU1BPUlQyX1JYX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1NQT1JUMl9UWCAtIDcpIDw8IElSUV9TUE9SVDJfVFhfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfU1BPUlQzX1JYIC0gNykgPDwgSVJRX1NQT1JUM19SWF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9TUE9SVDNfVFggLSA3KSA8PCBJUlFfU1BPUlQzX1RYX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1NQSTEgLSA3KSA8PCBJUlFfU1BJMV9QT1MpKTsKKworCWJmaW5fd3JpdGVfU0lDX0lBUjUoKChDT05GSUdfSVJRX1NQSTIgLSA3KSA8PCBJUlFfU1BJMl9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9VQVJUMV9SWCAtIDcpIDw8IElSUV9VQVJUMV9SWF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9VQVJUMV9UWCAtIDcpIDw8IElSUV9VQVJUMV9UWF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9VQVJUMl9SWCAtIDcpIDw8IElSUV9VQVJUMl9SWF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9VQVJUMl9UWCAtIDcpIDw8IElSUV9VQVJUMl9UWF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9UV0kwIC0gNykgPDwgSVJRX1RXSTBfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVFdJMSAtIDcpIDw8IElSUV9UV0kxX1BPUykgfAorCQkJKChDT05GSUdfSVJRX0NBTl9SWCAtIDcpIDw8IElSUV9DQU5fUlhfUE9TKSk7CisKKwliZmluX3dyaXRlX1NJQ19JQVI2KCgoQ09ORklHX0lSUV9DQU5fVFggLSA3KSA8PCBJUlFfQ0FOX1RYX1BPUykgfAorCQkJKChDT05GSUdfSVJRX01FTTFfRE1BMCAtIDcpIDw8IElSUV9NRU0xX0RNQTBfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfTUVNMV9ETUExIC0gNykgPDwgSVJRX01FTTFfRE1BMV9QT1MpKTsKKworCVNTWU5DKCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvS2NvbmZpZyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9LY29uZmlnCmluZGV4IDFiZmNkOGYuLmRjZjY1NzEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9LY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9LY29uZmlnCkBAIC0yNTAsNyArMjUwLDcgQEAKIAlkZWZhdWx0IDExCiBjb25maWcgSVJRX1RJTUVSMAogCWludCAiSVJRX1RJTUVSMCIKLQlkZWZhdWx0IDExCisJZGVmYXVsdCA4CiBjb25maWcgSVJRX1RJTUVSMQogCWludCAiSVJRX1RJTUVSMSIKIAlkZWZhdWx0IDExCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvTWFrZWZpbGUgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvTWFrZWZpbGUKaW5kZXggNjhlNTQ3OC4uNTY5OTRiNiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L01ha2VmaWxlCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9NYWtlZmlsZQpAQCAtMiw2ICsyLDQgQEAKICMgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L01ha2VmaWxlCiAjCiAKLWV4dHJhLXkgOj0gaGVhZC5vCi0KIG9iai15IDo9IGludHMtcHJpb3JpdHkubyBkbWEubwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2JvYXJkcy9jbV9iZjU0OC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2JvYXJkcy9jbV9iZjU0OC5jCmluZGV4IDI0MTkyYWEuLmY1M2FkNjggMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9ib2FyZHMvY21fYmY1NDguYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvYm9hcmRzL2NtX2JmNTQ4LmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvZmxhc2guaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KQEAgLTQyLDYgKzQzLDcgQEAKICNpbmNsdWRlIDxhc20vZ3Bpby5oPgogI2luY2x1ZGUgPGFzbS9uYW5kLmg+CiAjaW5jbHVkZSA8YXNtL3BvcnRtdXguaD4KKyNpbmNsdWRlIDxhc20vYmZpbl9zZGguaD4KICNpbmNsdWRlIDxtYWNoL2JmNTR4X2tleXMuaD4KICNpbmNsdWRlIDxhc20vZHBtYy5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CkBAIC0xODYsNDQgKzE4OCwxMDcgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXJfcmVzb3VyY2VzW10gPSB7CiAjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NpcjBfcmVzb3VyY2VzW10gPSB7CiAJewogCQkuc3RhcnQgPSAweEZGQzAwNDAwLAogCQkuZW5kID0gMHhGRkMwMDRGRiwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDBfUlgsCisJCS5lbmQgPSBDSF9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAorfTsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyMF9kZXZpY2UgPSB7CisJLm5hbWUgPSAiYmZpbl9zaXIiLAorCS5pZCA9IDAsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMF9yZXNvdXJjZXMsCit9OwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0JGSU5fU0lSMQorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NpcjFfcmVzb3VyY2VzW10gPSB7CiAJewogCQkuc3RhcnQgPSAweEZGQzAyMDAwLAogCQkuZW5kID0gMHhGRkMwMjBGRiwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMV9SWCwKKwkJLmVuZCA9IElSUV9VQVJUMV9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDFfUlgsCisJCS5lbmQgPSBDSF9VQVJUMV9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAorfTsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyMV9kZXZpY2UgPSB7CisJLm5hbWUgPSAiYmZpbl9zaXIiLAorCS5pZCA9IDEsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMV9yZXNvdXJjZXMsCit9OwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0JGSU5fU0lSMgorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NpcjJfcmVzb3VyY2VzW10gPSB7CiAJewogCQkuc3RhcnQgPSAweEZGQzAyMTAwLAogCQkuZW5kID0gMHhGRkMwMjFGRiwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMl9SWCwKKwkJLmVuZCA9IElSUV9VQVJUMl9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDJfUlgsCisJCS5lbmQgPSBDSF9VQVJUMl9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAorfTsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyMl9kZXZpY2UgPSB7CisJLm5hbWUgPSAiYmZpbl9zaXIiLAorCS5pZCA9IDIsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMl9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMl9yZXNvdXJjZXMsCit9OwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0JGSU5fU0lSMworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NpcjNfcmVzb3VyY2VzW10gPSB7CiAJewogCQkuc3RhcnQgPSAweEZGQzAzMTAwLAogCQkuZW5kID0gMHhGRkMwMzFGRiwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKLSNlbmRpZgorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQzX1JYLAorCQkuZW5kID0gSVJRX1VBUlQzX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUM19SWCwKKwkJLmVuZCA9IENIX1VBUlQzX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCiB9OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Npcl9kZXZpY2UgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjNfZGV2aWNlID0gewogCS5uYW1lID0gImJmaW5fc2lyIiwKLQkuaWQgPSAwLAotCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3Npcl9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZSA9IGJmaW5fc2lyX3Jlc291cmNlcywKKwkuaWQgPSAzLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjNfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjNfcmVzb3VyY2VzLAogfTsKICNlbmRpZgorI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19TTVNDOTExWCkgfHwgZGVmaW5lZChDT05GSUdfU01TQzkxMVhfTU9EVUxFKQogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzbXNjOTExeF9yZXNvdXJjZXNbXSA9IHsKQEAgLTI3MSw4ICszMzYsOCBAQAogCS5keW5fZmlmbwk9IDAsCiAJLnNvZnRfY29uCT0gMSwKIAkuZG1hCQk9IDEsCi0JLm51bV9lcHMJPSA3LAotCS5kbWFfY2hhbm5lbHMJPSA3LAorCS5udW1fZXBzCT0gOCwKKwkuZG1hX2NoYW5uZWxzCT0gOCwKIAkuZ3Bpb192cnNlbAk9IEdQSU9fUEg2LAogfTsKIApAQCAtMzAyLDYgKzM2NywxOSBAQAogfTsKICNlbmRpZgogCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fZ3Bpb3NfcmVzb3VyY2VzID0geworCS5zdGFydCA9IDAsCisJLmVuZCAgID0gTUFYX0JMQUNLRklOX0dQSU9TIC0gMSwKKwkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fZ3Bpb3NfZGV2aWNlID0geworCS5uYW1lID0gInNpbXBsZS1ncGlvIiwKKwkuaWQgPSAtMSwKKwkubnVtX3Jlc291cmNlcyA9IDEsCisJLnJlc291cmNlID0gJmJmaW5fZ3Bpb3NfcmVzb3VyY2VzLAorfTsKKwogI2lmIGRlZmluZWQoQ09ORklHX1BBVEFfQkY1NFgpIHx8IGRlZmluZWQoQ09ORklHX1BBVEFfQkY1NFhfTU9EVUxFKQogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX2F0YXBpX3Jlc291cmNlc1tdID0gewogCXsKQEAgLTM3Miw5ICs0NTAsNTggQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfU0RIX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1NESF9CRklOX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgYmZpbl9zZF9ob3N0IGJmaW5fc2RoX2RhdGEgPSB7CisJLmRtYV9jaGFuID0gQ0hfU0RILAorCS5pcnFfaW50MCA9IElSUV9TREhfTUFTSzAsCisJLnBpbl9yZXEgPSB7UF9TRF9EMCwgUF9TRF9EMSwgUF9TRF9EMiwgUF9TRF9EMywgUF9TRF9DTEssIFBfU0RfQ01ELCAwfSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmNTR4X3NkaF9kZXZpY2UgPSB7CiAJLm5hbWUgPSAiYmZpbi1zZGgiLAogCS5pZCA9IDAsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmYmZpbl9zZGhfZGF0YSwKKwl9LAorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfTVREX1BIWVNNQVApIHx8IGRlZmluZWQoQ09ORklHX01URF9QSFlTTUFQX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBwYXJhX3BhcnRpdGlvbnNbXSA9IHsKKwl7CisJCS5uYW1lICAgICAgID0gImJvb3Rsb2FkZXIobm9yKSIsCisJCS5zaXplICAgICAgID0gMHg0MDAwMCwKKwkJLm9mZnNldCAgICAgPSAwLAorCX0sIHsKKwkJLm5hbWUgICAgICAgPSAibGludXgga2VybmVsKG5vcikiLAorCQkuc2l6ZSAgICAgICA9IDB4NDAwMDAwLAorCQkub2Zmc2V0ICAgICA9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwl9LCB7CisJCS5uYW1lICAgICAgID0gImZpbGUgc3lzdGVtKG5vcikiLAorCQkuc2l6ZSAgICAgICA9IE1URFBBUlRfU0laX0ZVTEwsCisJCS5vZmZzZXQgICAgID0gTVREUEFSVF9PRlNfQVBQRU5ELAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIHBhcmFfZmxhc2hfZGF0YSA9IHsKKwkud2lkdGggICAgICA9IDIsCisJLnBhcnRzICAgICAgPSBwYXJhX3BhcnRpdGlvbnMsCisJLm5yX3BhcnRzICAgPSBBUlJBWV9TSVpFKHBhcmFfcGFydGl0aW9ucyksCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHBhcmFfZmxhc2hfcmVzb3VyY2UgPSB7CisJLnN0YXJ0ID0gMHgyMDAwMDAwMCwKKwkuZW5kICAgPSAweDIwN2ZmZmZmLAorCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcGFyYV9mbGFzaF9kZXZpY2UgPSB7CisJLm5hbWUgICAgICAgICAgPSAicGh5c21hcC1mbGFzaCIsCisJLmlkICAgICAgICAgICAgPSAwLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJnBhcmFfZmxhc2hfZGF0YSwKKwl9LAorCS5udW1fcmVzb3VyY2VzID0gMSwKKwkucmVzb3VyY2UgICAgICA9ICZwYXJhX2ZsYXNoX3Jlc291cmNlLAogfTsKICNlbmRpZgogCkBAIC02NDIsNyArNzY5LDE4IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi0JJmJmaW5fc2lyX2RldmljZSwKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCisJJmJmaW5fc2lyMF9kZXZpY2UsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIxCisJJmJmaW5fc2lyMV9kZXZpY2UsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIyCisJJmJmaW5fc2lyMl9kZXZpY2UsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIzCisJJmJmaW5fc2lyM19kZXZpY2UsCisjZW5kaWYKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfRkJfQkY1NFhfTFEwNDMpIHx8IGRlZmluZWQoQ09ORklHX0ZCX0JGNTRYX0xRMDQzX01PRFVMRSkKQEAgLTY3OSw3ICs4MTcsNyBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX01PRFVMRSkKLS8qCSZpMmNfYmZpbl90d2kwX2RldmljZSwgKi8KKwkmaTJjX2JmaW5fdHdpMF9kZXZpY2UsCiAjaWYgIWRlZmluZWQoQ09ORklHX0JGNTQyKQogCSZpMmNfYmZpbl90d2kxX2RldmljZSwKICNlbmRpZgpAQCAtNjg4LDYgKzgyNiwxMiBAQAogI2lmIGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX0dQSU8pIHx8IGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX0dQSU9fTU9EVUxFKQogCSZiZmluX2RldmljZV9ncGlva2V5cywKICNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfTVREX1BIWVNNQVApIHx8IGRlZmluZWQoQ09ORklHX01URF9QSFlTTUFQX01PRFVMRSkKKwkmcGFyYV9mbGFzaF9kZXZpY2UsCisjZW5kaWYKKworCSZiZmluX2dwaW9zX2RldmljZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGNtX2JmNTQ4X2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9ib2FyZHMvZXpraXQuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9ib2FyZHMvZXpraXQuYwppbmRleCA1Mjg4MTg3Li4zMDljMTYwIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvYm9hcmRzL2V6a2l0LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2JvYXJkcy9lemtpdC5jCkBAIC00NSw2ICs0NSw3IEBACiAjaW5jbHVkZSA8YXNtL25hbmQuaD4KICNpbmNsdWRlIDxhc20vZHBtYy5oPgogI2luY2x1ZGUgPGFzbS9wb3J0bXV4Lmg+CisjaW5jbHVkZSA8YXNtL2JmaW5fc2RoLmg+CiAjaW5jbHVkZSA8bWFjaC9iZjU0eF9rZXlzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvYWQ3ODc3Lmg+CkBAIC01MiwxNiArNTMsMTYgQEAKIC8qCiAgKiBOYW1lIHRoZSBCb2FyZCBmb3IgdGhlIC9wcm9jL2NwdWluZm8KICAqLwotY29uc3QgY2hhciBiZmluX2JvYXJkX25hbWVbXSA9ICJBRFNQLUJGNTQ4LUVaS0lUIjsKK2NvbnN0IGNoYXIgYmZpbl9ib2FyZF9uYW1lW10gPSAiQURJIEJGNTQ4LUVaS0lUIjsKIAogLyoKICAqICBEcml2ZXIgbmVlZHMgdG8ga25vdyBhZGRyZXNzLCBpcnEgYW5kIGZsYWcgcGluLgogICovCiAKICNpZiBkZWZpbmVkKENPTkZJR19VU0JfSVNQMTc2MF9IQ0QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9JU1AxNzYwX0hDRF9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5faXNwMTc2MV9yZXNvdXJjZXNbXSA9IHsKKyNpbmNsdWRlIDxsaW51eC91c2IvaXNwMTc2MC5oPgorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX2lzcDE3NjBfcmVzb3VyY2VzW10gPSB7CiAJWzBdID0gewotCQkubmFtZQk9ICJpc3AxNzYxLXJlZ3MiLAogCQkuc3RhcnQgID0gMHgyQzBDMDAwMCwKIAkJLmVuZCAgICA9IDB4MkMwQzAwMDAgKyAweGZmZmZmLAogCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCkBAIC03MywzMiArNzQsMjUgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9pc3AxNzYxX2RldmljZSA9IHsKLQkubmFtZSAgICAgICAgICAgPSAiaXNwMTc2MSIsCitzdGF0aWMgc3RydWN0IGlzcDE3NjBfcGxhdGZvcm1fZGF0YSBpc3AxNzYwX3ByaXYgPSB7CisJLmlzX2lzcDE3NjEgPSAwLAorCS5wb3J0MV9kaXNhYmxlID0gMCwKKwkuYnVzX3dpZHRoXzE2ID0gMSwKKwkucG9ydDFfb3RnID0gMCwKKwkuYW5hbG9nX29jID0gMCwKKwkuZGFja19wb2xhcml0eV9oaWdoID0gMCwKKwkuZHJlcV9wb2xhcml0eV9oaWdoID0gMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5faXNwMTc2MF9kZXZpY2UgPSB7CisJLm5hbWUgICAgICAgICAgID0gImlzcDE3NjAtaGNkIiwKIAkuaWQgICAgICAgICAgICAgPSAwLAotCS5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUoYmZpbl9pc3AxNzYxX3Jlc291cmNlcyksCi0JLnJlc291cmNlICAgICAgID0gYmZpbl9pc3AxNzYxX3Jlc291cmNlcywKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZpc3AxNzYwX3ByaXYsCisJfSwKKwkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKGJmaW5faXNwMTc2MF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSAgICAgICA9IGJmaW5faXNwMTc2MF9yZXNvdXJjZXMsCiB9OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqYmZpbl9pc3AxNzYxX2RldmljZXNbXSA9IHsKLQkmYmZpbl9pc3AxNzYxX2RldmljZSwKLX07Ci0KLWludCBfX2luaXQgYmZpbl9pc3AxNzYxX2luaXQodm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgbnVtX2RldmljZXMgPSBBUlJBWV9TSVpFKGJmaW5faXNwMTc2MV9kZXZpY2VzKTsKLQotCXByaW50ayhLRVJOX0lORk8gIiVzKCk6IHJlZ2lzdGVyaW5nIGRldmljZSByZXNvdXJjZXNcbiIsIF9fZnVuY19fKTsKLQlzZXRfaXJxX3R5cGUoYmZpbl9pc3AxNzYxX3Jlc291cmNlc1sxXS5zdGFydCwgSVJRRl9UUklHR0VSX0ZBTExJTkcpOwotCi0JcmV0dXJuIHBsYXRmb3JtX2FkZF9kZXZpY2VzKGJmaW5faXNwMTc2MV9kZXZpY2VzLCBudW1fZGV2aWNlcyk7Ci19Ci0KLXZvaWQgX19leGl0IGJmaW5faXNwMTc2MV9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoJmJmaW5faXNwMTc2MV9kZXZpY2UpOwotfQotYXJjaF9pbml0Y2FsbChiZmluX2lzcDE3NjFfaW5pdCk7CiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0ZCX0JGNTRYX0xRMDQzKSB8fCBkZWZpbmVkKENPTkZJR19GQl9CRjU0WF9MUTA0M19NT0RVTEUpCkBAIC0yNjIsNDQgKzI1NiwxMDcgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXJfcmVzb3VyY2VzW10gPSB7CiAjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NpcjBfcmVzb3VyY2VzW10gPSB7CiAJewogCQkuc3RhcnQgPSAweEZGQzAwNDAwLAogCQkuZW5kID0gMHhGRkMwMDRGRiwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDBfUlgsCisJCS5lbmQgPSBDSF9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAorfTsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyMF9kZXZpY2UgPSB7CisJLm5hbWUgPSAiYmZpbl9zaXIiLAorCS5pZCA9IDAsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMF9yZXNvdXJjZXMsCit9OwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0JGSU5fU0lSMQorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NpcjFfcmVzb3VyY2VzW10gPSB7CiAJewogCQkuc3RhcnQgPSAweEZGQzAyMDAwLAogCQkuZW5kID0gMHhGRkMwMjBGRiwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMV9SWCwKKwkJLmVuZCA9IElSUV9VQVJUMV9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDFfUlgsCisJCS5lbmQgPSBDSF9VQVJUMV9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAorfTsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyMV9kZXZpY2UgPSB7CisJLm5hbWUgPSAiYmZpbl9zaXIiLAorCS5pZCA9IDEsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMV9yZXNvdXJjZXMsCit9OwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0JGSU5fU0lSMgorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NpcjJfcmVzb3VyY2VzW10gPSB7CiAJewogCQkuc3RhcnQgPSAweEZGQzAyMTAwLAogCQkuZW5kID0gMHhGRkMwMjFGRiwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMl9SWCwKKwkJLmVuZCA9IElSUV9VQVJUMl9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDJfUlgsCisJCS5lbmQgPSBDSF9VQVJUMl9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAorfTsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyMl9kZXZpY2UgPSB7CisJLm5hbWUgPSAiYmZpbl9zaXIiLAorCS5pZCA9IDIsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMl9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMl9yZXNvdXJjZXMsCit9OwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0JGSU5fU0lSMworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NpcjNfcmVzb3VyY2VzW10gPSB7CiAJewogCQkuc3RhcnQgPSAweEZGQzAzMTAwLAogCQkuZW5kID0gMHhGRkMwMzFGRiwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKLSNlbmRpZgorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQzX1JYLAorCQkuZW5kID0gSVJRX1VBUlQzX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUM19SWCwKKwkJLmVuZCA9IENIX1VBUlQzX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCiB9OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Npcl9kZXZpY2UgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjNfZGV2aWNlID0gewogCS5uYW1lID0gImJmaW5fc2lyIiwKLQkuaWQgPSAwLAotCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3Npcl9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZSA9IGJmaW5fc2lyX3Jlc291cmNlcywKKwkuaWQgPSAzLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjNfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjNfcmVzb3VyY2VzLAogfTsKICNlbmRpZgorI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19TTVNDOTExWCkgfHwgZGVmaW5lZChDT05GSUdfU01TQzkxMVhfTU9EVUxFKQogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzbXNjOTExeF9yZXNvdXJjZXNbXSA9IHsKQEAgLTM0Nyw4ICs0MDQsOCBAQAogCS5keW5fZmlmbwk9IDAsCiAJLnNvZnRfY29uCT0gMSwKIAkuZG1hCQk9IDEsCi0JLm51bV9lcHMJPSA3LAotCS5kbWFfY2hhbm5lbHMJPSA3LAorCS5udW1fZXBzCT0gOCwKKwkuZG1hX2NoYW5uZWxzCT0gOCwKIAkuZ3Bpb192cnNlbAk9IEdQSU9fUEU3LAogfTsKIApAQCAtNDQ4LDkgKzUwNSwxOSBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19TREhfQkZJTikgfHwgZGVmaW5lZChDT05GSUdfU0RIX0JGSU5fTU9EVUxFKQorCitzdGF0aWMgc3RydWN0IGJmaW5fc2RfaG9zdCBiZmluX3NkaF9kYXRhID0geworCS5kbWFfY2hhbiA9IENIX1NESCwKKwkuaXJxX2ludDAgPSBJUlFfU0RIX01BU0swLAorCS5waW5fcmVxID0ge1BfU0RfRDAsIFBfU0RfRDEsIFBfU0RfRDIsIFBfU0RfRDMsIFBfU0RfQ0xLLCBQX1NEX0NNRCwgMH0sCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZjU0eF9zZGhfZGV2aWNlID0gewogCS5uYW1lID0gImJmaW4tc2RoIiwKIAkuaWQgPSAwLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmJmaW5fc2RoX2RhdGEsCisJfSwKIH07CiAjZW5kaWYKIApAQCAtNTg5LDcgKzY1Niw3IEBACiB7CiAJLm1vZGFsaWFzCQk9ICJhZDc4NzciLAogCS5wbGF0Zm9ybV9kYXRhCQk9ICZiZmluX2FkNzg3N190c19pbmZvLAotCS5pcnEJCQk9IElSUV9QSjExLAkvKiBuZXdlciBib2FyZHMgKFJldiAxLjQrKSB1c2UgSVJRX1BCNCAqLworCS5pcnEJCQk9IElSUV9QQjQsCS8qIG9sZCBib2FyZHMgKDw9UmV2IDEuMykgdXNlIElSUV9QSjExICovCiAJLm1heF9zcGVlZF9oegkJPSAxMjUwMDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KIAkuYnVzX251bQkJPSAwLAogCS5jaGlwX3NlbGVjdCAgCQk9IDIsCkBAIC04MTIsNyArODc5LDE4IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi0JJmJmaW5fc2lyX2RldmljZSwKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCisJJmJmaW5fc2lyMF9kZXZpY2UsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIxCisJJmJmaW5fc2lyMV9kZXZpY2UsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIyCisJJmJmaW5fc2lyMl9kZXZpY2UsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIzCisJJmJmaW5fc2lyM19kZXZpY2UsCisjZW5kaWYKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfRkJfQkY1NFhfTFEwNDMpIHx8IGRlZmluZWQoQ09ORklHX0ZCX0JGNTRYX0xRMDQzX01PRFVMRSkKQEAgLTgyNyw2ICs5MDUsMTAgQEAKIAkmbXVzYl9kZXZpY2UsCiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX1VTQl9JU1AxNzYwX0hDRCkgfHwgZGVmaW5lZChDT05GSUdfVVNCX0lTUDE3NjBfSENEX01PRFVMRSkKKwkmYmZpbl9pc3AxNzYwX2RldmljZSwKKyNlbmRpZgorCiAjaWYgZGVmaW5lZChDT05GSUdfUEFUQV9CRjU0WCkgfHwgZGVmaW5lZChDT05GSUdfUEFUQV9CRjU0WF9NT0RVTEUpCiAJJmJmaW5fYXRhcGlfZGV2aWNlLAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvZG1hLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvZG1hLmMKaW5kZXggNzQ3MzBlYi4uNTM1OTgwNiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2RtYS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9kbWEuYwpAQCAtMzIsNyArMzIsNyBAQAogI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KIAotc3RydWN0IGRtYV9yZWdpc3RlciAqZG1hX2lvX2Jhc2VfYWRkcltNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUxdID0geworc3RydWN0IGRtYV9yZWdpc3RlciAqZG1hX2lvX2Jhc2VfYWRkcltNQVhfRE1BX0NIQU5ORUxTXSA9IHsKIAkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUEwX05FWFRfREVTQ19QVFIsCiAJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMV9ORVhUX0RFU0NfUFRSLAogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTJfTkVYVF9ERVNDX1BUUiwKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9oZWFkLlMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaGVhZC5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2IzNjFkLi4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9oZWFkLlMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2hlYWQuUwotICogQmFzZWQgb246ICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaGVhZC5TCi0gKiBBdXRob3I6ICAgICAgIEplZmYgRGlvbm5lIDxqZWZmQHVjbGludXgub3JnPiBDT1BZUklHSFQgMTk5OCBELiBKZWZmIERpb25uZQotICoKLSAqIENyZWF0ZWQ6ICAgICAgMTk5OAotICogRGVzY3JpcHRpb246ICBTdGFydHVwIGNvZGUgZm9yIEJsYWNrZmluIEJGNTQ4Ci0gKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDcgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgotI2lmZGVmIENPTkZJR19CRklOX0tFUk5FTF9DTE9DSwotI2luY2x1ZGUgPGFzbS9jbG9ja3MuaD4KLSNpbmNsdWRlIDxtYWNoL21lbV9pbml0Lmg+Ci0jZW5kaWYKLQotLnNlY3Rpb24gLmwxLnRleHQKLSNpZmRlZiBDT05GSUdfQkZJTl9LRVJORUxfQ0xPQ0sKLUVOVFJZKF9zdGFydF9kbWFfY29kZSkKLQotCS8qIEVuYWJsZSBQSFkgQ0xLIGJ1ZmZlciBvdXRwdXQgKi8KLQlwMC5oID0gaGkoVlJfQ1RMKTsKLQlwMC5sID0gbG8oVlJfQ1RMKTsKLQlyMC5sID0gd1twMF07Ci0JYml0c2V0KHIwLCAxNCk7Ci0Jd1twMF0gPSByMC5sOwotCXNzeW5jOwotCi0JcDAuaCA9IGhpKFNJQ19JV1IwKTsKLQlwMC5sID0gbG8oU0lDX0lXUjApOwotCXIwLmwgPSAweDE7Ci0JcjAuaCA9IDB4MDsKLQlbcDBdID0gcjA7Ci0JU1NZTkM7Ci0KLQkvKgotCSAqICBTZXQgUExMX0NUTAotCSAqICAgLSBbMTQ6MDldID0gTVNFTFs1OjBdIDogQ0xLSU4gLyBWQ08gbXVsdGlwbGljYXRpb24gZmFjdG9ycwotCSAqICAgLSBbOF0gICAgID0gQllQQVNTICAgIDogQllQQVNTIHRoZSBQTEwsIHJ1biBDTEtJTiBpbnRvIENDTEsvU0NMSwotCSAqICAgLSBbN10gICAgID0gb3V0cHV0IGRlbGF5IChhZGQgMjAwcHMgb2YgZGVsYXkgdG8gbWVtIHNpZ25hbHMpCi0JICogICAtIFs2XSAgICAgPSBpbnB1dCBkZWxheSAoYWRkIDIwMHBzIG9mIGlucHV0IGRlbGF5IHRvIG1lbSBzaWduYWxzKQotCSAqICAgLSBbNV0gICAgID0gUERXTiAgICAgIDogMT1BbGwgQ2xvY2tzIG9mZgotCSAqICAgLSBbM10gICAgID0gU1RPUENLICAgIDogMT1Db3JlIENsb2NrIG9mZgotCSAqICAgLSBbMV0gICAgID0gUExMX09GRiAgIDogMT1EaXNhYmxlIFBvd2VyIHRvIFBMTAotCSAqICAgLSBbMF0gICAgID0gREYgICAgICAgIDogMT1QYXNzIENMS0lOLzIgdG8gUExMIC8gMD1QYXNzIENMS0lOIHRvIFBMTAotCSAqICAgYWxsIG90aGVyIGJpdHMgc2V0IHRvIHplcm8KLQkgKi8KLQotCXAwLmggPSBoaShQTExfTE9DS0NOVCk7Ci0JcDAubCA9IGxvKFBMTF9MT0NLQ05UKTsKLQlyMCA9IDB4MzAwKFopOwotCXdbcDBdID0gcjAubDsKLQlzc3luYzsKLQotCS8qIGVuYWJsZSBzZWxmIHJlZnJlc2ggdmlhIFNSUkVRICovCi0JUDIuSCA9IGhpKEVCSVVfUlNUQ1RMKTsKLQlQMi5MID0gbG8oRUJJVV9SU1RDVEwpOwotCVIwID0gW1AyXTsKLQlCSVRTRVQgKFIwLCAzKTsKLQlbUDJdID0gUjA7Ci0JU1NZTkM7Ci0KLQkvKiB3YWl0IGZvciBTUkFDSyBiaXQgdG8gYmUgc2V0ICovCi0uTFNSUl9NT0RFOgotCVIwID0gW1AyXTsKLQlDQyA9IEJJVFRTVChSMCwgNCk7Ci0JaWYgIUNDIEpVTVAgLkxTUlJfTU9ERTsKLQotCXIwID0gQ09ORklHX1ZDT19NVUxUICYgNjM7ICAgICAgIC8qIExvYWQgdGhlIFZDTyBtdWx0aXBsaWVyICAgICAgICAgKi8KLQlyMCA9IHIwIDw8IDk7ICAgICAgICAgICAgICAgICAgICAvKiBTaGlmdCBpdCBvdmVyLCAgICAgICAgICAgICAgICAgICovCi0JcjEgPSBDTEtJTl9IQUxGOyAgICAgICAgICAgICAgICAgLyogRG8gd2UgbmVlZCB0byBkaXZpZGUgQ0xLSU4gYnkgMj8qLwotCXIwID0gcjEgfCByMDsKLQlyMSA9IFBMTF9CWVBBU1M7ICAgICAgICAgICAgICAgICAvKiBCeXBhc3MgdGhlIFBMTD8gICAgICAgICAgICAgICAgICovCi0JcjEgPSByMSA8PCA4OyAgICAgICAgICAgICAgICAgICAgLyogU2hpZnQgaXQgb3ZlciAgICAgICAgICAgICAgICAgICAqLwotCXIwID0gcjEgfCByMDsgICAgICAgICAgICAgICAgICAgIC8qIGFkZCB0aGVtIGFsbCB0b2dldGhlciAgICAgICAgICAgKi8KLSNpZmRlZiBBTk9NQUxZXzA1MDAwMjY1Ci0JQklUU0VUKHIwLCAxNSk7ICAgICAgICAgICAgICAgICAgLyogQWRkIDI1MCBtViBvZiBoeXN0ZXJlc2lzIHRvIFNQT1JUIGlucHV0IHBpbnMgKi8KLSNlbmRpZgotCi0JcDAuaCA9IGhpKFBMTF9DVEwpOwotCXAwLmwgPSBsbyhQTExfQ1RMKTsgICAgICAgICAgICAgIC8qIExvYWQgdGhlIGFkZHJlc3MgICAgICAgICAgICAgICAgKi8KLQljbGkgcjI7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEaXNhYmxlIGludGVycnVwdHMgICAgICAgICAgICAgICovCi0Jc3N5bmM7Ci0Jd1twMF0gPSByMC5sOyAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSB2YWx1ZSAgICAgICAgICAgICAgICAgICAqLwotCWlkbGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdhaXQgZm9yIHRoZSBQTEwgdG8gc3RhYmxpemUgICAgKi8KLQlzdGkgcjI7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgaW50ZXJydXB0cyAgICAgICAgICAgICAgICovCi0KLS5MY2hlY2tfYWdhaW46Ci0JcDAuaCA9IGhpKFBMTF9TVEFUKTsKLQlwMC5sID0gbG8oUExMX1NUQVQpOwotCVIwID0gV1tQMF0oWik7Ci0JQ0MgPSBCSVRUU1QoUjAsNSk7Ci0JaWYgISBDQyBqdW1wIC5MY2hlY2tfYWdhaW47Ci0KLQkvKiBDb25maWd1cmUgU0NMSyAmIENDTEsgRGl2aWRlcnMgKi8KLQlyMCA9IChDT05GSUdfQ0NMS19BQ1RfRElWIHwgQ09ORklHX1NDTEtfRElWKTsKLQlwMC5oID0gaGkoUExMX0RJVik7Ci0JcDAubCA9IGxvKFBMTF9ESVYpOwotCXdbcDBdID0gcjAubDsKLQlzc3luYzsKLQotCS8qIGRpc2FibGUgc2VsZiByZWZyZXNoIGJ5IGNsZWFyaW5nIFNSUkVRICovCi0JUDIuSCA9IGhpKEVCSVVfUlNUQ1RMKTsKLQlQMi5MID0gbG8oRUJJVV9SU1RDVEwpOwotCVIwID0gW1AyXTsKLQlDQyA9IEJJVFRTVChSMCwgMCk7Ci0JaWYgQ0MganVtcCAuTHNraXBkZHJyc3Q7Ci0JQklUU0VUIChSMCwgMCk7Ci0uTHNraXBkZHJyc3Q6Ci0JQklUQ0xSIChSMCwgMyk7Ci0JW1AyXSA9IFIwOwotCVNTWU5DOwotCi0JcDAubCA9IGxvKEVCSVVfRERSQ1RMMCk7Ci0JcDAuaCA9IGhpKEVCSVVfRERSQ1RMMCk7Ci0JcjAubCA9IGxvKG1lbV9ERFJDVEwwKTsKLQlyMC5oID0gaGkobWVtX0REUkNUTDApOwotCVtwMF0gPSByMDsKLQlzc3luYzsKLQotCXAwLmwgPSBsbyhFQklVX0REUkNUTDEpOwotCXAwLmggPSBoaShFQklVX0REUkNUTDEpOwotCXIwLmwgPSBsbyhtZW1fRERSQ1RMMSk7Ci0JcjAuaCA9IGhpKG1lbV9ERFJDVEwxKTsKLQlbcDBdID0gcjA7Ci0Jc3N5bmM7Ci0KLQlwMC5sID0gbG8oRUJJVV9ERFJDVEwyKTsKLQlwMC5oID0gaGkoRUJJVV9ERFJDVEwyKTsKLQlyMC5sID0gbG8obWVtX0REUkNUTDIpOwotCXIwLmggPSBoaShtZW1fRERSQ1RMMik7Ci0JW3AwXSA9IHIwOwotCXNzeW5jOwotCi0JUlRTOwotRU5EUFJPQyhfc3RhcnRfZG1hX2NvZGUpCi0jZW5kaWYgLyogQ09ORklHX0JGSU5fS0VSTkVMX0NMT0NLICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2Fub21hbHkuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvYW5vbWFseS5oCmluZGV4IDgxNmIwOTIuLjNiNTQzMDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvYW5vbWFseS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvYW5vbWFseS5oCkBAIC0xNTcsNiArMTU3LDggQEAKICNkZWZpbmUgQU5PTUFMWV8wNTAwMDQyOSAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAyKQogLyogU29mdHdhcmUgU3lzdGVtIFJlc2V0IENvcnJ1cHRzIFBMTF9MT0NLQ05UIFJlZ2lzdGVyICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDA0MzAgKF9fU0lMSUNPTl9SRVZJU0lPTl9fID49IDIpCisvKiBJRkxVU0ggSW5zdHJ1Y3Rpb24gYXQgRW5kIG9mIEhhcmR3YXJlIExvb3AgQ2F1c2VzIEluZmluaXRlIFN0YWxsICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0NDMgKDEpCiAKIC8qIEFub21hbGllcyB0aGF0IGRvbid0IGV4aXN0IG9uIHRoaXMgcHJvYyAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwMTI1ICgwKQpAQCAtMTczLDUgKzE3NSw4IEBACiAjZGVmaW5lIEFOT01BTFlfMDUwMDAzMTEgKDApCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAzMjMgKDApCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAzNjMgKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MTIgKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MzIgKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MzUgKDApCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9iZjU0OC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9iZjU0OC5oCmluZGV4IDQ5ZjliNDAuLmYwZTU2OTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvYmY1NDguaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2JmNTQ4LmgKQEAgLTEyMiw3ICsxMjIsNyBAQAogI2VuZGlmCiAKICNpZm5kZWYgQ1BVCi0jZXJyb3IgVW5rbm93biBDUFUgdHlwZSAtIFRoaXMga2VybmVsIGRvZXNuJ3Qgc2VlbSB0byBiZSBjb25maWd1cmVkIHByb3Blcmx5CisjZXJyb3IgIlVua25vd24gQ1BVIHR5cGUgLSBUaGlzIGtlcm5lbCBkb2Vzbid0IHNlZW0gdG8gYmUgY29uZmlndXJlZCBwcm9wZXJseSIKICNlbmRpZgogCiAjZW5kaWYJLyogX19NQUNIX0JGNDhfSF9fICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9iZmluX3Npci5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9iZmluX3Npci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDFmOWNmLi4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvYmZpbl9zaXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKgotICogQmxhY2tmaW4gSW5mcmEtcmVkIERyaXZlcgotICoKLSAqIENvcHlyaWdodCAyMDA2LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgotI2luY2x1ZGUgPGFzbS9kbWEuaD4KLSNpbmNsdWRlIDxhc20vcG9ydG11eC5oPgotCi0jZGVmaW5lIFNJUl9VQVJUX0dFVF9DSEFSKHBvcnQpICAgYmZpbl9yZWFkMTYoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX1JCUikKLSNkZWZpbmUgU0lSX1VBUlRfR0VUX0RMTChwb3J0KSAgICBiZmluX3JlYWQxNigocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfRExMKQotI2RlZmluZSBTSVJfVUFSVF9HRVRfSUVSKHBvcnQpICAgIGJmaW5fcmVhZDE2KChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9JRVJfU0VUKQotI2RlZmluZSBTSVJfVUFSVF9HRVRfRExIKHBvcnQpICAgIGJmaW5fcmVhZDE2KChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9ETEgpCi0jZGVmaW5lIFNJUl9VQVJUX0dFVF9MQ1IocG9ydCkgICAgYmZpbl9yZWFkMTYoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0xDUikKLSNkZWZpbmUgU0lSX1VBUlRfR0VUX0xTUihwb3J0KSAgICBiZmluX3JlYWQxNigocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfTFNSKQotI2RlZmluZSBTSVJfVUFSVF9HRVRfR0NUTChwb3J0KSAgIGJmaW5fcmVhZDE2KChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9HQ1RMKQotCi0jZGVmaW5lIFNJUl9VQVJUX1BVVF9DSEFSKHBvcnQsIHYpIGJmaW5fd3JpdGUxNigoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX1RIUiksIHYpCi0jZGVmaW5lIFNJUl9VQVJUX1BVVF9ETEwocG9ydCwgdikgIGJmaW5fd3JpdGUxNigoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0RMTCksIHYpCi0jZGVmaW5lIFNJUl9VQVJUX1NFVF9JRVIocG9ydCwgdikgIGJmaW5fd3JpdGUxNigoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0lFUl9TRVQpLCB2KQotI2RlZmluZSBTSVJfVUFSVF9DTEVBUl9JRVIocG9ydCwgdikgIGJmaW5fd3JpdGUxNigoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0lFUl9DTEVBUiksIHYpCi0jZGVmaW5lIFNJUl9VQVJUX1BVVF9ETEgocG9ydCwgdikgIGJmaW5fd3JpdGUxNigoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0RMSCksIHYpCi0jZGVmaW5lIFNJUl9VQVJUX1BVVF9MU1IocG9ydCwgdikgIGJmaW5fd3JpdGUxNigoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0xTUiksIHYpCi0jZGVmaW5lIFNJUl9VQVJUX1BVVF9MQ1IocG9ydCwgdikgIGJmaW5fd3JpdGUxNigoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0xDUiksIHYpCi0jZGVmaW5lIFNJUl9VQVJUX0NMRUFSX0xTUihwb3J0KSAgYmZpbl93cml0ZTE2KCgocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfTFNSKSwgLTEpCi0jZGVmaW5lIFNJUl9VQVJUX1BVVF9HQ1RMKHBvcnQsIHYpIGJmaW5fd3JpdGUxNigoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0dDVEwpLCB2KQotCi0jaWZkZWYgQ09ORklHX1NJUl9CRklOX0RNQQotc3RydWN0IGRtYV9yeF9idWYgewotCWNoYXIgKmJ1ZjsKLQlpbnQgaGVhZDsKLQlpbnQgdGFpbDsKLQl9OwotI2VuZGlmIC8qIENPTkZJR19TSVJfQkZJTl9ETUEgKi8KLQotc3RydWN0IGJmaW5fc2lyX3BvcnQgewotCXVuc2lnbmVkIGNoYXIgX19pb21lbSAgICptZW1iYXNlOwotCXVuc2lnbmVkIGludCAgICAgICAgICAgIGlycTsKLQl1bnNpZ25lZCBpbnQgICAgICAgICAgICBsc3I7Ci0JdW5zaWduZWQgbG9uZyAgICAgICAgICAgY2xrOwotCXN0cnVjdCBuZXRfZGV2aWNlICAgICAgICpkZXY7Ci0jaWZkZWYgQ09ORklHX1NJUl9CRklOX0RNQQotCWludCAgICAgICAgICAgICAgICAgICAgIHR4X2RvbmU7Ci0Jc3RydWN0IGRtYV9yeF9idWYgICAgICAgcnhfZG1hX2J1ZjsKLQlzdHJ1Y3QgdGltZXJfbGlzdCAgICAgICByeF9kbWFfdGltZXI7Ci0JaW50ICAgICAgICAgICAgICAgICAgICAgcnhfZG1hX25yb3dzOwotI2VuZGlmIC8qIENPTkZJR19TSVJfQkZJTl9ETUEgKi8KLQl1bnNpZ25lZCBpbnQgICAgICAgICAgICB0eF9kbWFfY2hhbm5lbDsKLQl1bnNpZ25lZCBpbnQgICAgICAgICAgICByeF9kbWFfY2hhbm5lbDsKLX07Ci0KLXN0cnVjdCBiZmluX3Npcl9wb3J0IHNpcl9wb3J0c1tCRklOX1VBUlRfTlJfUE9SVFNdOwotCi1zdHJ1Y3QgYmZpbl9zaXJfcG9ydF9yZXMgewotCXVuc2lnbmVkIGxvbmcgICBiYXNlX2FkZHI7Ci0JaW50ICAgICAgICAgICAgIGlycTsKLQl1bnNpZ25lZCBpbnQgICAgcnhfZG1hX2NoYW5uZWw7Ci0JdW5zaWduZWQgaW50ICAgIHR4X2RtYV9jaGFubmVsOwotfTsKLQotc3RydWN0IGJmaW5fc2lyX3BvcnRfcmVzIGJmaW5fc2lyX3BvcnRfcmVzb3VyY2VbXSA9IHsKLSNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCi0JewotCTB4RkZDMDA0MDAsCi0JSVJRX1VBUlQwX1JYLAotCUNIX1VBUlQwX1JYLAotCUNIX1VBUlQwX1RYLAotCX0sCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfQkZJTl9TSVIxCi0JewotCTB4RkZDMDIwMDAsCi0JSVJRX1VBUlQxX1JYLAotCUNIX1VBUlQxX1JYLAotCUNIX1VBUlQxX1RYLAotCX0sCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfQkZJTl9TSVIyCi0JewotCTB4RkZDMDIxMDAsCi0JSVJRX1VBUlQyX1JYLAotCUNIX1VBUlQyX1JYLAotCUNIX1VBUlQyX1RYLAotCX0sCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfQkZJTl9TSVIzCi0JewotCTB4RkZDMDMxMDAsCi0JSVJRX1VBUlQzX1JYLAotCUNIX1VBUlQzX1JYLAotCUNIX1VBUlQzX1RYLAotCX0sCi0jZW5kaWYKLX07Ci0KLWludCBucl9zaXJzID0gQVJSQVlfU0laRShiZmluX3Npcl9wb3J0X3Jlc291cmNlKTsKLQotc3RydWN0IGJmaW5fc2lyX3NlbGYgewotCXN0cnVjdCBiZmluX3Npcl9wb3J0ICAgICpzaXJfcG9ydDsKLQlzcGlubG9ja190ICAgICAgICAgICAgICBsb2NrOwotCXVuc2lnbmVkIGludCAgICAgICAgICAgIG9wZW47Ci0JaW50ICAgICAgICAgICAgICAgICAgICAgc3BlZWQ7Ci0JaW50ICAgICAgICAgICAgICAgICAgICAgbmV3c3BlZWQ7Ci0KLQlzdHJ1Y3Qgc2tfYnVmZiAgICAgICAgICAqdHhza2I7Ci0Jc3RydWN0IHNrX2J1ZmYgICAgICAgICAgKnJ4c2tiOwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwotCXN0cnVjdCBkZXZpY2UgICAgICAgICAgICpkZXY7Ci0Jc3RydWN0IGlybGFwX2NiICAgICAgICAgKmlybGFwOwotCXN0cnVjdCBxb3NfaW5mbyAgICAgICAgIHFvczsKLQotCWlvYnVmZl90ICAgICAgICAgICAgICAgIHR4X2J1ZmY7Ci0JaW9idWZmX3QgICAgICAgICAgICAgICAgcnhfYnVmZjsKLQotCXN0cnVjdCB3b3JrX3N0cnVjdCAgICAgIHdvcms7Ci0JaW50ICAgICAgICAgICAgICAgICAgICAgbXR0OwotfTsKLQotI2RlZmluZSBEUklWRVJfTkFNRSAiYmZpbl9zaXIiCi0KLXN0YXRpYyBpbnQgYmZpbl9zaXJfaHdfaW5pdCh2b2lkKQotewotCWludCByZXQgPSAtRU5PREVWOwotI2lmZGVmIENPTkZJR19CRklOX1NJUjAKLQlyZXQgPSBwZXJpcGhlcmFsX3JlcXVlc3QoUF9VQVJUMF9UWCwgRFJJVkVSX05BTUUpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0JcmV0ID0gcGVyaXBoZXJhbF9yZXF1ZXN0KFBfVUFSVDBfUlgsIERSSVZFUl9OQU1FKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfQkZJTl9TSVIxCi0JcmV0ID0gcGVyaXBoZXJhbF9yZXF1ZXN0KFBfVUFSVDFfVFgsIERSSVZFUl9OQU1FKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCXJldCA9IHBlcmlwaGVyYWxfcmVxdWVzdChQX1VBUlQxX1JYLCBEUklWRVJfTkFNRSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0JGSU5fU0lSMgotCXJldCA9IHBlcmlwaGVyYWxfcmVxdWVzdChQX1VBUlQyX1RYLCBEUklWRVJfTkFNRSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQlyZXQgPSBwZXJpcGhlcmFsX3JlcXVlc3QoUF9VQVJUMl9SWCwgRFJJVkVSX05BTUUpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19CRklOX1NJUjMKLQlyZXQgPSBwZXJpcGhlcmFsX3JlcXVlc3QoUF9VQVJUM19UWCwgRFJJVkVSX05BTUUpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0JcmV0ID0gcGVyaXBoZXJhbF9yZXF1ZXN0KFBfVUFSVDNfUlgsIERSSVZFUl9OQU1FKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotI2VuZGlmCi0JcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaAppbmRleCBkNmVlNzRhLi4wYzBlM2UyIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oCkBAIC0xMTEsNyArMTExLDcgQEAKIAogLyogVUFSVCAwKi8KIAotLyogRE1BIENoYW5ubmVsICovCisvKiBETUEgQ2hhbm5lbCAqLwogI2RlZmluZSBiZmluX3JlYWRfQ0hfVUFSVF9SWCgpCQliZmluX3JlYWRfQ0hfVUFSVDFfUlgoKQogI2RlZmluZSBiZmluX3dyaXRlX0NIX1VBUlRfUlgodmFsKQliZmluX3dyaXRlX0NIX1VBUlQxX1JYKHZhbCkKICNkZWZpbmUgYmZpbl9yZWFkX0NIX1VBUlRfVFgoKQkJYmZpbl9yZWFkX0NIX1VBUlQxX1RYKCkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvY2RlZkJGNTR4X2Jhc2UuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvY2RlZkJGNTR4X2Jhc2UuaAppbmRleCA1N2FjOGNiLi42ZTYzNmM0IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2NkZWZCRjU0eF9iYXNlLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9jZGVmQkY1NHhfYmFzZS5oCkBAIC0zNCw3ICszNCw2IEBACiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CiAKICNpbmNsdWRlICJkZWZCRjU0eF9iYXNlLmgiCi0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCiAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogLyogU1lTVEVNICYgTU1SIEFERFJFU1MgREVGSU5JVElPTlMgQ09NTU9OIFRPIEFMTCBBRFNQLUJGNTR4ICAgICovCkBAIC00Myw2MyArNDIsOSBAQAogLyogUExMIFJlZ2lzdGVycyAqLwogCiAjZGVmaW5lIGJmaW5fcmVhZF9QTExfQ1RMKCkJCWJmaW5fcmVhZDE2KFBMTF9DVEwpCi0vKiBXcml0aW5nIHRvIFBMTF9DVEwgaW5pdGlhdGVzIGEgUExMIHJlbG9jayBzZXF1ZW5jZS4gKi8KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgYmZpbl93cml0ZV9QTExfQ1RMKHVuc2lnbmVkIGludCB2YWwpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFncywgaXdyMCwgaXdyMSwgaXdyMjsKLQotCWlmICh2YWwgPT0gYmZpbl9yZWFkX1BMTF9DVEwoKSkKLQkJcmV0dXJuOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCS8qIEVuYWJsZSB0aGUgUExMIFdha2V1cCBiaXQgaW4gU0lDIElXUiAqLwotCWl3cjAgPSBiZmluX3JlYWQzMihTSUNfSVdSMCk7Ci0JaXdyMSA9IGJmaW5fcmVhZDMyKFNJQ19JV1IxKTsKLQlpd3IyID0gYmZpbl9yZWFkMzIoU0lDX0lXUjIpOwotCS8qIE9ubHkgYWxsb3cgUFBMIFdha2V1cCkgKi8KLQliZmluX3dyaXRlMzIoU0lDX0lXUjAsIElXUl9FTkFCTEUoMCkpOwotCWJmaW5fd3JpdGUzMihTSUNfSVdSMSwgMCk7Ci0JYmZpbl93cml0ZTMyKFNJQ19JV1IyLCAwKTsKLQotCWJmaW5fd3JpdGUxNihQTExfQ1RMLCB2YWwpOwotCVNTWU5DKCk7Ci0JYXNtKCJJRExFOyIpOwotCi0JYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBpd3IwKTsKLQliZmluX3dyaXRlMzIoU0lDX0lXUjEsIGl3cjEpOwotCWJmaW5fd3JpdGUzMihTSUNfSVdSMiwgaXdyMik7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQogI2RlZmluZSBiZmluX3JlYWRfUExMX0RJVigpCQliZmluX3JlYWQxNihQTExfRElWKQogI2RlZmluZSBiZmluX3dyaXRlX1BMTF9ESVYodmFsKQkJYmZpbl93cml0ZTE2KFBMTF9ESVYsIHZhbCkKICNkZWZpbmUgYmZpbl9yZWFkX1ZSX0NUTCgpCQliZmluX3JlYWQxNihWUl9DVEwpCi0vKiBXcml0aW5nIHRvIFZSX0NUTCBpbml0aWF0ZXMgYSBQTEwgcmVsb2NrIHNlcXVlbmNlLiAqLwotc3RhdGljIF9faW5saW5lX18gdm9pZCBiZmluX3dyaXRlX1ZSX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGl3cjAsIGl3cjEsIGl3cjI7Ci0KLQlpZiAodmFsID09IGJmaW5fcmVhZF9WUl9DVEwoKSkKLQkJcmV0dXJuOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCS8qIEVuYWJsZSB0aGUgUExMIFdha2V1cCBiaXQgaW4gU0lDIElXUiAqLwotCWl3cjAgPSBiZmluX3JlYWQzMihTSUNfSVdSMCk7Ci0JaXdyMSA9IGJmaW5fcmVhZDMyKFNJQ19JV1IxKTsKLQlpd3IyID0gYmZpbl9yZWFkMzIoU0lDX0lXUjIpOwotCS8qIE9ubHkgYWxsb3cgUFBMIFdha2V1cCkgKi8KLQliZmluX3dyaXRlMzIoU0lDX0lXUjAsIElXUl9FTkFCTEUoMCkpOwotCWJmaW5fd3JpdGUzMihTSUNfSVdSMSwgMCk7Ci0JYmZpbl93cml0ZTMyKFNJQ19JV1IyLCAwKTsKLQotCWJmaW5fd3JpdGUxNihWUl9DVEwsIHZhbCk7Ci0JU1NZTkMoKTsKLQlhc20oIklETEU7Iik7Ci0KLQliZmluX3dyaXRlMzIoU0lDX0lXUjAsIGl3cjApOwotCWJmaW5fd3JpdGUzMihTSUNfSVdSMSwgaXdyMSk7Ci0JYmZpbl93cml0ZTMyKFNJQ19JV1IyLCBpd3IyKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19CiAjZGVmaW5lIGJmaW5fcmVhZF9QTExfU1RBVCgpCQliZmluX3JlYWQxNihQTExfU1RBVCkKICNkZWZpbmUgYmZpbl93cml0ZV9QTExfU1RBVCh2YWwpCWJmaW5fd3JpdGUxNihQTExfU1RBVCwgdmFsKQogI2RlZmluZSBiZmluX3JlYWRfUExMX0xPQ0tDTlQoKQkJYmZpbl9yZWFkMTYoUExMX0xPQ0tDTlQpCkBAIC0yNzQ2LDUgKzI2OTEsNjQgQEAKICNkZWZpbmUgYmZpbl9yZWFkX1BJTlQzX0lSUQkJYmZpbl9yZWFkX1BJTlQzX1JFUVVFU1QKICNkZWZpbmUgYmZpbl93cml0ZV9QSU5UM19JUlEJCWJmaW5fd3JpdGVfUElOVDNfUkVRVUVTVAogCisvKiBUaGVzZSBuZWVkIHRvIGJlIGxhc3QgZHVlIHRvIHRoZSBjZGVmL2xpbnV4IGludGVyLWRlcGVuZGVuY2llcyAqLworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworLyogV3JpdGluZyB0byBQTExfQ1RMIGluaXRpYXRlcyBhIFBMTCByZWxvY2sgc2VxdWVuY2UuICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGJmaW5fd3JpdGVfUExMX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGl3cjAsIGl3cjEsIGl3cjI7CisKKwlpZiAodmFsID09IGJmaW5fcmVhZF9QTExfQ1RMKCkpCisJCXJldHVybjsKKworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKKwkvKiBFbmFibGUgdGhlIFBMTCBXYWtldXAgYml0IGluIFNJQyBJV1IgKi8KKwlpd3IwID0gYmZpbl9yZWFkMzIoU0lDX0lXUjApOworCWl3cjEgPSBiZmluX3JlYWQzMihTSUNfSVdSMSk7CisJaXdyMiA9IGJmaW5fcmVhZDMyKFNJQ19JV1IyKTsKKwkvKiBPbmx5IGFsbG93IFBQTCBXYWtldXApICovCisJYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBJV1JfRU5BQkxFKDApKTsKKwliZmluX3dyaXRlMzIoU0lDX0lXUjEsIDApOworCWJmaW5fd3JpdGUzMihTSUNfSVdSMiwgMCk7CisKKwliZmluX3dyaXRlMTYoUExMX0NUTCwgdmFsKTsKKwlTU1lOQygpOworCWFzbSgiSURMRTsiKTsKKworCWJmaW5fd3JpdGUzMihTSUNfSVdSMCwgaXdyMCk7CisJYmZpbl93cml0ZTMyKFNJQ19JV1IxLCBpd3IxKTsKKwliZmluX3dyaXRlMzIoU0lDX0lXUjIsIGl3cjIpOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKK30KKworLyogV3JpdGluZyB0byBWUl9DVEwgaW5pdGlhdGVzIGEgUExMIHJlbG9jayBzZXF1ZW5jZS4gKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgYmZpbl93cml0ZV9WUl9DVEwodW5zaWduZWQgaW50IHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBpd3IwLCBpd3IxLCBpd3IyOworCisJaWYgKHZhbCA9PSBiZmluX3JlYWRfVlJfQ1RMKCkpCisJCXJldHVybjsKKworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKKwkvKiBFbmFibGUgdGhlIFBMTCBXYWtldXAgYml0IGluIFNJQyBJV1IgKi8KKwlpd3IwID0gYmZpbl9yZWFkMzIoU0lDX0lXUjApOworCWl3cjEgPSBiZmluX3JlYWQzMihTSUNfSVdSMSk7CisJaXdyMiA9IGJmaW5fcmVhZDMyKFNJQ19JV1IyKTsKKwkvKiBPbmx5IGFsbG93IFBQTCBXYWtldXApICovCisJYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBJV1JfRU5BQkxFKDApKTsKKwliZmluX3dyaXRlMzIoU0lDX0lXUjEsIDApOworCWJmaW5fd3JpdGUzMihTSUNfSVdSMiwgMCk7CisKKwliZmluX3dyaXRlMTYoVlJfQ1RMLCB2YWwpOworCVNTWU5DKCk7CisJYXNtKCJJRExFOyIpOworCisJYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBpd3IwKTsKKwliZmluX3dyaXRlMzIoU0lDX0lXUjEsIGl3cjEpOworCWJmaW5fd3JpdGUzMihTSUNfSVdSMiwgaXdyMik7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOworfQorCiAjZW5kaWYgLyogX0NERUZfQkY1NFhfSCAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2RtYS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9kbWEuaAppbmRleCAzNmEyZWY3Li5hMzBkMjQyIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2RtYS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvZG1hLmgKQEAgLTEsMzIgKzEsOCBAQAotLyoKLSAqIGZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjU0OC9kbWEuaAotICogYmFzZWQgb246Ci0gKiBhdXRob3I6CisvKiBtYWNoL2RtYS5oIC0gYXJjaC1zcGVjaWZpYyBETUEgZGVmaW5lcwogICoKLSAqIGNyZWF0ZWQ6Ci0gKiBkZXNjcmlwdGlvbjoKLSAqCXN5c3RlbSBtbXIgcmVnaXN0ZXIgbWFwCi0gKiByZXY6CisgKiBDb3B5cmlnaHQgMjAwNC0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBtb2RpZmllZDoKLSAqCi0gKgotICogYnVnczogICAgICAgICBlbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiB0aGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBnbnUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBmcmVlIHNvZnR3YXJlIGZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIHRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IHdpdGhvdXQgYW55IHdhcnJhbnR5OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIG1lcmNoYW50YWJpbGl0eSBvciBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gIHNlZSB0aGUKLSAqIGdudSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgZ251IGdlbmVyYWwgcHVibGljIGxpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgY29weWluZy4KLSAqIGlmIG5vdCwgd3JpdGUgdG8gdGhlIGZyZWUgc29mdHdhcmUgZm91bmRhdGlvbiwKLSAqIDU5IHRlbXBsZSBwbGFjZSAtIHN1aXRlIDMzMCwgYm9zdG9uLCBtYSAwMjExMS0xMzA3LCB1c2EuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2lmbmRlZiBfTUFDSF9ETUFfSF8KQEAgLTcxLDYgKzQ3LDYgQEAKICNkZWZpbmUgQ0hfTUVNX1NUUkVBTTNfREVTVAkzMAogI2RlZmluZSBDSF9NRU1fU1RSRUFNM19TUkMJMzEKIAotI2RlZmluZSBNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUwgMzIKKyNkZWZpbmUgTUFYX0RNQV9DSEFOTkVMUyAzMgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvaXJxLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2lycS5oCmluZGV4IGFkMzgwZDEuLjYwMjk5YTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvaXJxLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9pcnEuaApAQCAtMTU4LDcgKzE1OCw3IEBACiAjZGVmaW5lIElSUV9QSU5UMgkJQkZJTl9JUlEoOTQpCS8qIFBJTlQyIEludGVycnVwdCAqLwogI2RlZmluZSBJUlFfUElOVDMJCUJGSU5fSVJRKDk1KQkvKiBQSU5UMyBJbnRlcnJ1cHQgKi8KIAotI2RlZmluZSBTWVNfSVJRUyAgICAgICAgCUlSUV9QSU5UMworI2RlZmluZSBTWVNfSVJRUwkJSVJRX1BJTlQzCiAKICNkZWZpbmUgQkZJTl9QQV9JUlEoeCkJCSgoeCkgKyBTWVNfSVJRUyArIDEpCiAjZGVmaW5lIElSUV9QQTAJCQlCRklOX1BBX0lSUSgwKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9tZW1faW5pdC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9tZW1faW5pdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjBiODYzLi4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvbWVtX2luaXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKgotICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTQ4L21lbV9pbml0LmgKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOgotICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKLSAqCi0gKiBSZXY6Ci0gKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCi0gKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotICovCi0jZGVmaW5lIE1JTl9ERFJfU0NMSyh4KQkoeCooQ09ORklHX1NDTEtfSFovMTAwMC8xMDAwKS8xMDAwICsgMSkKLSNkZWZpbmUgTUFYX0REUl9TQ0xLKHgpCSh4KihDT05GSUdfU0NMS19IWi8xMDAwLzEwMDApLzEwMDApCi0jZGVmaW5lIEREUl9DTEtfSFooeCkJKDEwMDAqMTAwMCoxMDAwL3gpCi0KLSNpZiAoQ09ORklHX01FTV9NVDQ2VjMyTTE2XzZUKQotI2RlZmluZSBERFJfU0laRQlERVZTWl81MTIKLSNkZWZpbmUgRERSX1dJRFRICURFVldEXzE2Ci0jZGVmaW5lIEREUl9NQVhfdENLCTEzCi0KLSNkZWZpbmUgRERSX3RSQwkJRERSX1RSQyhNSU5fRERSX1NDTEsoNjApKQotI2RlZmluZSBERFJfdFJBUwlERFJfVFJBUyhNSU5fRERSX1NDTEsoNDIpKQotI2RlZmluZSBERFJfdFJQCQlERFJfVFJQKE1JTl9ERFJfU0NMSygxNSkpCi0jZGVmaW5lIEREUl90UkZDCUREUl9UUkZDKE1JTl9ERFJfU0NMSyg3MikpCi0jZGVmaW5lIEREUl90UkVGSQlERFJfVFJFRkkoTUFYX0REUl9TQ0xLKDc4MDApKQotCi0jZGVmaW5lIEREUl90UkNECUREUl9UUkNEKE1JTl9ERFJfU0NMSygxNSkpCi0jZGVmaW5lIEREUl90V1RSCUREUl9UV1RSKDEpCi0jZGVmaW5lIEREUl90TVJECUREUl9UTVJEKE1JTl9ERFJfU0NMSygxMikpCi0jZGVmaW5lIEREUl90V1IJCUREUl9UV1IoTUlOX0REUl9TQ0xLKDE1KSkKLSNlbmRpZgotCi0jaWYgKENPTkZJR19NRU1fTVQ0NlYzMk0xNl81QikKLSNkZWZpbmUgRERSX1NJWkUJREVWU1pfNTEyCi0jZGVmaW5lIEREUl9XSURUSAlERVZXRF8xNgotI2RlZmluZSBERFJfTUFYX3RDSwkxMwotCi0jZGVmaW5lIEREUl90UkMJCUREUl9UUkMoTUlOX0REUl9TQ0xLKDU1KSkKLSNkZWZpbmUgRERSX3RSQVMJRERSX1RSQVMoTUlOX0REUl9TQ0xLKDQwKSkKLSNkZWZpbmUgRERSX3RSUAkJRERSX1RSUChNSU5fRERSX1NDTEsoMTUpKQotI2RlZmluZSBERFJfdFJGQwlERFJfVFJGQyhNSU5fRERSX1NDTEsoNzApKQotI2RlZmluZSBERFJfdFJFRkkJRERSX1RSRUZJKE1BWF9ERFJfU0NMSyg3ODAwKSkKLQotI2RlZmluZSBERFJfdFJDRAlERFJfVFJDRChNSU5fRERSX1NDTEsoMTUpKQotI2RlZmluZSBERFJfdFdUUglERFJfVFdUUigyKQotI2RlZmluZSBERFJfdE1SRAlERFJfVE1SRChNSU5fRERSX1NDTEsoMTApKQotI2RlZmluZSBERFJfdFdSCQlERFJfVFdSKE1JTl9ERFJfU0NMSygxNSkpCi0jZW5kaWYKLQotI2lmIChDT05GSUdfTUVNX0dFTkVSSUNfQk9BUkQpCi0jZGVmaW5lIEREUl9TSVpFCURFVlNaXzUxMgotI2RlZmluZSBERFJfV0lEVEgJREVWV0RfMTYKLSNkZWZpbmUgRERSX01BWF90Q0sJMTMKLQotI2RlZmluZSBERFJfdFJDRAlERFJfVFJDRCgzKQotI2RlZmluZSBERFJfdFdUUglERFJfVFdUUigyKQotI2RlZmluZSBERFJfdFdSCQlERFJfVFdSKDIpCi0jZGVmaW5lIEREUl90TVJECUREUl9UTVJEKDIpCi0jZGVmaW5lIEREUl90UlAJCUREUl9UUlAoMykKLSNkZWZpbmUgRERSX3RSQVMJRERSX1RSQVMoNykKLSNkZWZpbmUgRERSX3RSQwkJRERSX1RSQygxMCkKLSNkZWZpbmUgRERSX3RSRkMJRERSX1RSRkMoMTIpCi0jZGVmaW5lIEREUl90UkVGSQlERFJfVFJFRkkoMTI4OCkKLSNlbmRpZgotCi0jaWYgKENPTkZJR19TQ0xLX0haIDwgRERSX0NMS19IWihERFJfTUFYX3RDSykpCi0jIGVycm9yICJDT05GSUdfU0NMS19IWiBpcyB0b28gc21hbGwgKDxERFJfQ0xLX0haKEREUl9NQVhfdENLKSBIeikuIgotI2VsaWYoQ09ORklHX1NDTEtfSFogPD0gMTMzMzMzMzMzKQotIyBkZWZpbmUJRERSX0NMCQlDTF8yCi0jZWxzZQotIyBlcnJvciAiQ09ORklHX1NDTEtfSFogaXMgdG9vIGxhcmdlICg+MTMzMzMzMzMzIEh6KS4iCi0jZW5kaWYKLQotCi0jZGVmaW5lIG1lbV9ERFJDVEwwCShERFJfdFJQIHwgRERSX3RSQVMgfCBERFJfdFJDIHwgRERSX3RSRkMgfCBERFJfdFJFRkkpCi0jZGVmaW5lIG1lbV9ERFJDVEwxCShERFJfREFUV0lEVEggfCBFWFRCQU5LXzEgfCBERFJfU0laRSB8IEREUl9XSURUSCB8IEREUl90V1RSIFwKLQkJCXwgRERSX3RNUkQgfCBERFJfdFdSIHwgRERSX3RSQ0QpCi0jZGVmaW5lIG1lbV9ERFJDVEwyCUREUl9DTAotCi0KLSNpZiBkZWZpbmVkIENPTkZJR19DTEtJTl9IQUxGCi0jZGVmaW5lIENMS0lOX0hBTEYgICAgICAgMQotI2Vsc2UKLSNkZWZpbmUgQ0xLSU5fSEFMRiAgICAgICAwCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgQ09ORklHX1BMTF9CWVBBU1MKLSNkZWZpbmUgUExMX0JZUEFTUyAgICAgIDEKLSNlbHNlCi0jZGVmaW5lIFBMTF9CWVBBU1MgICAgICAgMAotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipDdXJyZW50bHkgTm90IEJlaW5nIFVzZWQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTF9XQVQgICgoQ09ORklHX0ZMQVNIX1NQRUVEX0JXQVQgKiA0KSAvICg0MDAwMDAwMDAwIC8gQ09ORklHX1NDTEtfSFopKSArIDEKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVExfUkFUICAoKENPTkZJR19GTEFTSF9TUEVFRF9CUkFUICogNCkgLyAoNDAwMDAwMDAwMCAvIENPTkZJR19TQ0xLX0haKSkgKyAxCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMX0hUICAgKChDT05GSUdfRkxBU0hfU1BFRURfQkhUICAqIDQpIC8gKDQwMDAwMDAwMDAgLyBDT05GSUdfU0NMS19IWikpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMX1NUICAgKChDT05GSUdfRkxBU0hfU1BFRURfQlNUICAqIDQpIC8gKDQwMDAwMDAwMDAgLyBDT05GSUdfU0NMS19IWikpICsgMQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTF9UVCAgICgoQ09ORklHX0ZMQVNIX1NQRUVEX0JUVCAgKiA0KSAvICg0MDAwMDAwMDAwIC8gQ09ORklHX1NDTEtfSFopKSArIDEKLQotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9UVCA+IDMpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9UVCAgIEIwVFRfNAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1RUID09IDMpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9UVCAgIEIwVFRfMwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1RUID09IDIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9UVCAgIEIwVFRfMgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1RUIDwgMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1RUICAgQjBUVF8xCi0jZW5kaWYKLQotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9TVCA+IDMpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9TVCAgIEIwU1RfNAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1NUID09IDMpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9TVCAgIEIwU1RfMwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1NUID09IDIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9TVCAgIEIwU1RfMgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1NUIDwgMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1NUICAgQjBTVF8xCi0jZW5kaWYKLQotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9IVCA+IDIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9IVCAgIEIwSFRfMwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX0hUID09IDIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9IVCAgIEIwSFRfMgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX0hUID09IDEpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9IVCAgIEIwSFRfMQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX0hUID09IDAgJiYgQ09ORklHX0ZMQVNIX1NQRUVEX0JIVCA9PSAwKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfSFQgICBCMEhUXzAKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9IVCA9PSAwICYmIENPTkZJR19GTEFTSF9TUEVFRF9CSFQgIT0gMCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX0hUICAgQjBIVF8xCi0jZW5kaWYKLQotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPiAxNCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMTUKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMTQpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzE0Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDEzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xMwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAxMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMTIKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMTEpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzExCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDEwKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xMAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSA5KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF85Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDgpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzgKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gNykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfNwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSA2KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF82Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDUpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzUKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gNCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfNAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8zCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzIKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMQotI2VuZGlmCi0KLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID4gMTQpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzE1Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDE0KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xNAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAxMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMTMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMTIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzEyCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDExKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xMQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAxMCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMTAKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gOSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfOQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSA4KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF84Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDcpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzcKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gNikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfNgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSA1KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF81Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDQpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzQKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8yCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDEpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzEKLSNlbmRpZgotCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMCAgXAotCShmbGFzaF9FQklVX0FNQkNUTDBfV0FUIHwgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCB8IGZsYXNoX0VCSVVfQU1CQ1RMMF9IVCB8IFwKLQkgZmxhc2hfRUJJVV9BTUJDVEwwX1NUIHwgZmxhc2hfRUJJVV9BTUJDVEwwX1RUIHwgQ09ORklHX0ZMQVNIX1NQRUVEX1JEWUVOKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9tZW1fbWFwLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL21lbV9tYXAuaAppbmRleCBhMjIyODQyLi43MGI5YzExIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL21lbV9tYXAuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL21lbV9tYXAuaApAQCAtMTA4LDQgKzEwOCwxMCBAQAogI2RlZmluZSBMMV9TQ1JBVENIX1NUQVJUCTB4RkZCMDAwMDAKICNkZWZpbmUgTDFfU0NSQVRDSF9MRU5HVEgJMHgxMDAwCiAKKyNkZWZpbmUgR0VUX1BEQV9TQUZFKHByZWcpCQlcCisJcHJlZy5sID0gX2NwdV9wZGE7CQlcCisJcHJlZy5oID0gX2NwdV9wZGE7CisKKyNkZWZpbmUgR0VUX1BEQShwcmVnLCBkcmVnKQlHRVRfUERBX1NBRkUocHJlZykKKwogI2VuZGlmLyogX01FTV9NQVBfNTQ4X0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvS2NvbmZpZyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9LY29uZmlnCmluZGV4IDNmNDg5NTQuLjYzOGVjMzggMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9LY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9LY29uZmlnCkBAIC00LDkgKzQsOSBAQAogCiBtZW51ICJCRjU2MSBTcGVjaWZpYyBDb25maWd1cmF0aW9uIgogCi1jb21tZW50ICJDb3JlIEIgU3VwcG9ydCIKK2lmICghU01QKQogCi1tZW51ICJDb3JlIEIgU3VwcG9ydCIKK2NvbW1lbnQgIkNvcmUgQiBTdXBwb3J0IgogCiBjb25maWcgQkY1NjFfQ09SRUIKIAlib29sICJFbmFibGUgQ29yZSBCIHN1cHBvcnQiCkBAIC0yNSw3ICsyNSw3IEBACiAJICAwIGlzIHNldCwgYW5kIHdpbGwgcmVzZXQgUEMgdG8gMHhmZjYwMDAwMCB3aGVuCiAJICBDT1JFQl9TUkFNX0lOSVQgaXMgY2xlYXJlZC4KIAotZW5kbWVudQorZW5kaWYKIAogY29tbWVudCAiSW50ZXJydXB0IFByaW9yaXR5IEFzc2lnbm1lbnQiCiAKQEAgLTEzOCw3ICsxMzgsNyBAQAogCWRlZmF1bHQgOQogY29uZmlnIElSUV9USU1FUjAKIAlpbnQgIlRJTUVSIDAgIEludGVycnVwdCIKLQlkZWZhdWx0IDEwCisJZGVmYXVsdCA4CiBjb25maWcgSVJRX1RJTUVSMQogCWludCAiVElNRVIgMSAgSW50ZXJydXB0IgogCWRlZmF1bHQgMTAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9NYWtlZmlsZSBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9NYWtlZmlsZQppbmRleCBmMzkyMzVhLi41OWUxOGFmIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvTWFrZWZpbGUKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL01ha2VmaWxlCkBAIC0yLDggKzIsNyBAQAogIyBhcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvTWFrZWZpbGUKICMKIAotZXh0cmEteSA6PSBoZWFkLm8KLQogb2JqLXkgOj0gaW50cy1wcmlvcml0eS5vIGRtYS5vCiAKIG9iai0kKENPTkZJR19CRjU2MV9DT1JFQikgKz0gY29yZWIubworb2JqLSQoQ09ORklHX1NNUCkgICs9IHNtcC5vIHNlY29uZGFyeS5vIGF0b21pYy5vCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYXRvbWljLlMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYXRvbWljLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQzOWJjNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9hdG9taWMuUwpAQCAtMCwwICsxLDkxOSBAQAorLyoKKyAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2F0b21pYy5TCisgKiBBdXRob3I6ICAgICAgIFBoaWxpcHBlIEdlcnVtIDxycG1AeGVub21haS5vcmc+CisgKgorICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNyBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKKyAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL3J3bG9jay5oPgorI2luY2x1ZGUgPGFzbS9jcGxiLmg+CisKKy50ZXh0CisKKy5tYWNybyBjb3Jlc2xvdF9sb2FkYWRkciByZWc6cmVxCisJXHJlZ1woKS5sID0gX2NvcmVsb2NrOworCVxyZWdcKCkuaCA9IF9jb3JlbG9jazsKKy5lbmRtCisKKy8qCisgKiByMCA9IGFkZHJlc3Mgb2YgYXRvbWljIGRhdGEgdG8gZmx1c2ggYW5kIGludmFsaWRhdGUgKDMyYml0KS4KKyAqCisgKiBDbGVhciBpbnRlcnJ1cHRzIGFuZCByZXR1cm4gdGhlIG9sZCBtYXNrLgorICogV2UgYXNzdW1lIHRoYXQgbm8gYXRvbWljIGRhdGEgY2FuIHNwYW4gY2FjaGVsaW5lcy4KKyAqCisgKiBDbG9iYmVyczogcjI6MCwgcDAKKyAqLworRU5UUlkoX2dldF9jb3JlX2xvY2spCisJcjEgPSAtTDFfQ0FDSEVfQllURVM7CisJcjEgPSByMCAmIHIxOworCWNsaSByMDsKKwljb3Jlc2xvdF9sb2FkYWRkciBwMDsKKy5McmV0cnlfY29yZWxvY2s6CisJdGVzdHNldCAocDApOworCWlmIGNjIGp1bXAgLkxkb25lX2NvcmVsb2NrOworCVNTWU5DKHIyKTsKKwlqdW1wIC5McmV0cnlfY29yZWxvY2sKKy5MZG9uZV9jb3JlbG9jazoKKwlwMCA9IHIxOworCUNTWU5DKHIyKTsKKwlmbHVzaGludltwMF07CisJU1NZTkMocjIpOworCXJ0czsKK0VORFBST0MoX2dldF9jb3JlX2xvY2spCisKKy8qCisgKiByMCA9IGFkZHJlc3Mgb2YgYXRvbWljIGRhdGEgaW4gdW5jYWNoZWFibGUgbWVtb3J5IHJlZ2lvbiAoMzJiaXQpLgorICoKKyAqIENsZWFyIGludGVycnVwdHMgYW5kIHJldHVybiB0aGUgb2xkIG1hc2suCisgKgorICogQ2xvYmJlcnM6IHIwLCBwMAorICovCitFTlRSWShfZ2V0X2NvcmVfbG9ja19ub2ZsdXNoKQorCWNsaSByMDsKKwljb3Jlc2xvdF9sb2FkYWRkciBwMDsKKy5McmV0cnlfY29yZWxvY2tfbm9mbHVzaDoKKwl0ZXN0c2V0IChwMCk7CisJaWYgY2MganVtcCAuTGRvbmVfY29yZWxvY2tfbm9mbHVzaDsKKwlTU1lOQyhyMik7CisJanVtcCAuTHJldHJ5X2NvcmVsb2NrX25vZmx1c2gKKy5MZG9uZV9jb3JlbG9ja19ub2ZsdXNoOgorCXJ0czsKK0VORFBST0MoX2dldF9jb3JlX2xvY2tfbm9mbHVzaCkKKworLyoKKyAqIHIwID0gaW50ZXJydXB0IG1hc2sgdG8gcmVzdG9yZS4KKyAqIHIxID0gYWRkcmVzcyBvZiBhdG9taWMgZGF0YSB0byBmbHVzaCBhbmQgaW52YWxpZGF0ZSAoMzJiaXQpLgorICoKKyAqIEludGVycnVwdHMgYXJlIG1hc2tlZCBvbiBlbnRyeSAoc2VlIF9nZXRfY29yZV9sb2NrKS4KKyAqIENsb2JiZXJzOiByMjowLCBwMAorICovCitFTlRSWShfcHV0X2NvcmVfbG9jaykKKwkvKiBXcml0ZS10aHJvdWdoIGNhY2hlIGFzc3VtZWQsIHNvIG5vIGZsdXNoIG5lZWRlZCBoZXJlLiAqLworCWNvcmVzbG90X2xvYWRhZGRyIHAwOworCXIxID0gMDsKKwlbcDBdID0gcjE7CisJU1NZTkMocjIpOworCXN0aSByMDsKKwlydHM7CitFTkRQUk9DKF9wdXRfY29yZV9sb2NrKQorCisjaWZkZWYgX19BUkNIX1NZTkNfQ09SRV9EQ0FDSEUKKworRU5UUlkoX19fcmF3X3NtcF9tYXJrX2JhcnJpZXJfYXNtKQorCVstLXNwXSA9IHJldHM7CisJWy0tc3BdID0gKCByNzo1ICk7CisJWy0tc3BdID0gcjA7CisJWy0tc3BdID0gcDE7CisJWy0tc3BdID0gcDA7CisJY2FsbCBfZ2V0X2NvcmVfbG9ja19ub2ZsdXNoOworCisJLyoKKwkgKiBDYWxjdWxhdGUgY3VycmVudCBjb3JlIG1hc2sKKwkgKi8KKwlHRVRfQ1BVSUQocDEsIHI3KTsKKwlyNiA9IDE7CisJcjYgPDw9IHI3OworCisJLyoKKwkgKiBTZXQgYml0IG9mIG90aGVyIGNvcmVzIGluIGJhcnJpZXIgbWFzay4gRG9uJ3QgY2hhbmdlIGN1cnJlbnQgY29yZSBiaXQuCisJICovCisJcDEubCA9IF9iYXJyaWVyX21hc2s7CisJcDEuaCA9IF9iYXJyaWVyX21hc2s7CisJcjcgPSBbcDFdOworCXI1ID0gcjcgJiByNjsKKwlyNyA9IH5yNjsKKwljYyA9IHI1ID09IDA7CisJaWYgY2MganVtcCAxZjsKKwlyNyA9IHI3IHwgcjY7CisxOgorCVtwMV0gPSByNzsKKwlTU1lOQyhyMik7CisKKwljYWxsIF9wdXRfY29yZV9sb2NrOworCXAwID0gW3NwKytdOworCXAxID0gW3NwKytdOworCXIwID0gW3NwKytdOworCSggcjc6NSApID0gW3NwKytdOworCXJldHMgPSBbc3ArK107CisJcnRzOworRU5EUFJPQyhfX19yYXdfc21wX21hcmtfYmFycmllcl9hc20pCisKK0VOVFJZKF9fX3Jhd19zbXBfY2hlY2tfYmFycmllcl9hc20pCisJWy0tc3BdID0gcmV0czsKKwlbLS1zcF0gPSAoIHI3OjUgKTsKKwlbLS1zcF0gPSByMDsKKwlbLS1zcF0gPSBwMTsKKwlbLS1zcF0gPSBwMDsKKwljYWxsIF9nZXRfY29yZV9sb2NrX25vZmx1c2g7CisKKwkvKgorCSAqIENhbGN1bGF0ZSBjdXJyZW50IGNvcmUgbWFzaworCSAqLworCUdFVF9DUFVJRChwMSwgcjcpOworCXI2ID0gMTsKKwlyNiA8PD0gcjc7CisKKwkvKgorCSAqIENsZWFyIGN1cnJlbnQgY29yZSBiaXQgaW4gYmFycmllciBtYXNrIGlmIGl0IGlzIHNldC4KKwkgKi8KKwlwMS5sID0gX2JhcnJpZXJfbWFzazsKKwlwMS5oID0gX2JhcnJpZXJfbWFzazsKKwlyNyA9IFtwMV07CisJcjUgPSByNyAmIHI2OworCWNjID0gcjUgPT0gMDsKKwlpZiBjYyBqdW1wIDFmOworCXI2ID0gfnI2OworCXI3ID0gcjcgJiByNjsKKwlbcDFdID0gcjc7CisJU1NZTkMocjIpOworCisJY2FsbCBfcHV0X2NvcmVfbG9jazsKKworCS8qCisJICogSW52YWxpZGF0ZSB0aGUgZW50aXJlIEQtY2FjaGUgb2YgY3VycmVudCBjb3JlLgorCSAqLworCXNwICs9IC0xMjsKKwljYWxsIF9yZXN5bmNfY29yZV9kY2FjaGUKKwlzcCArPSAxMjsKKwlqdW1wIDJmOworMToKKwljYWxsIF9wdXRfY29yZV9sb2NrOworMjoKKwlwMCA9IFtzcCsrXTsKKwlwMSA9IFtzcCsrXTsKKwlyMCA9IFtzcCsrXTsKKwkoIHI3OjUgKSA9IFtzcCsrXTsKKwlyZXRzID0gW3NwKytdOworCXJ0czsKK0VORFBST0MoX19fcmF3X3NtcF9jaGVja19iYXJyaWVyX2FzbSkKKworLyoKKyAqIHIwID0gaXJxZmxhZ3MKKyAqIHIxID0gYWRkcmVzcyBvZiBhdG9taWMgZGF0YQorICoKKyAqIENsb2JiZXJzOiByMjowLCBwMTowCisgKi8KK19zdGFydF9sb2NrX2NvaGVyZW50OgorCisJWy0tc3BdID0gcmV0czsKKwlbLS1zcF0gPSAoIHI3OjYgKTsKKwlyNyA9IHIwOworCXAxID0gcjE7CisKKwkvKgorCSAqIERldGVybWluZSB3aGV0aGVyIHRoZSBhdG9taWMgZGF0YSB3YXMgcHJldmlvdXNseQorCSAqIG93bmVkIGJ5IGFub3RoZXIgQ1BVICg9cjYpLgorCSAqLworCUdFVF9DUFVJRChwMCwgcjIpOworCXIxID0gMTsKKwlyMSA8PD0gcjI7CisJcjIgPSB+cjE7CisKKwlyMSA9IFtwMV07CisJcjEgPj49IDI4OyAgIC8qIENQVSBmaW5nZXJwcmludHMgYXJlIHN0b3JlZCBpbiB0aGUgaGlnaCBuaWJibGUuICovCisJcjYgPSByMSAmIHIyOworCXIxID0gW3AxXTsKKwlyMSA8PD0gNDsKKwlyMSA+Pj0gNDsKKwlbcDFdID0gcjE7CisKKwkvKgorCSAqIFJlbGVhc2UgdGhlIGNvcmUgbG9jayBub3csIGJ1dCBrZWVwIElSUXMgZGlzYWJsZWQgd2hpbGUgd2UgYXJlCisJICogcGVyZm9ybWluZyB0aGUgcmVtYWluaW5nIGhvdXNla2VlcGluZyBjaG9yZXMgZm9yIHRoZSBjdXJyZW50IENQVS4KKwkgKi8KKwljb3Jlc2xvdF9sb2FkYWRkciBwMDsKKwlyMSA9IDA7CisJW3AwXSA9IHIxOworCisJLyoKKwkgKiBJZiBhbm90aGVyIENQVSBoYXMgb3duZWQgdGhlIHNhbWUgYXRvbWljIHNlY3Rpb24gYmVmb3JlIHVzLAorCSAqIHRoZW4gb3VyIEQtY2FjaGVkIGNvcHkgb2YgdGhlIHNoYXJlZCBkYXRhIHByb3RlY3RlZCBieSB0aGUKKwkgKiBjdXJyZW50IHNwaW4vd3JpdGVfbG9jayBtYXkgYmUgb2Jzb2xldGUuCisJICovCisJY2MgPSByNiA9PSAwOworCWlmIGNjIGp1bXAgLkxjYWNoZV9zeW5jZWQKKworCS8qCisJICogSW52YWxpZGF0ZSB0aGUgZW50aXJlIEQtY2FjaGUgb2YgdGhlIGN1cnJlbnQgY29yZS4KKwkgKi8KKwlzcCArPSAtMTI7CisJY2FsbCBfcmVzeW5jX2NvcmVfZGNhY2hlCisJc3AgKz0gMTI7CisKKy5MY2FjaGVfc3luY2VkOgorCVNTWU5DKHIyKTsKKwlzdGkgcjc7CisJKCByNzo2ICkgPSBbc3ArK107CisJcmV0cyA9IFtzcCsrXTsKKwlydHMKKworLyoKKyAqIHIwID0gaXJxZmxhZ3MKKyAqIHIxID0gYWRkcmVzcyBvZiBhdG9taWMgZGF0YQorICoKKyAqIENsb2JiZXJzOiByMjowLCBwMTowCisgKi8KK19lbmRfbG9ja19jb2hlcmVudDoKKworCXAxID0gcjE7CisJR0VUX0NQVUlEKHAwLCByMik7CisJcjIgKz0gMjg7CisJcjEgPSAxOworCXIxIDw8PSByMjsKKwlyMiA9IFtwMV07CisJcjIgPSByMSB8IHIyOworCVtwMV0gPSByMjsKKwlyMSA9IHAxOworCWp1bXAgX3B1dF9jb3JlX2xvY2s7CisKKyNlbmRpZiAvKiBfX0FSQ0hfU1lOQ19DT1JFX0RDQUNIRSAqLworCisvKgorICogcjAgPSAmc3BpbmxvY2stPmxvY2sKKyAqCisgKiBDbG9iYmVyczogcjM6MCwgcDE6MAorICovCitFTlRSWShfX19yYXdfc3Bpbl9pc19sb2NrZWRfYXNtKQorCXAxID0gcjA7CisJWy0tc3BdID0gcmV0czsKKwljYWxsIF9nZXRfY29yZV9sb2NrOworCXIzID0gW3AxXTsKKwljYyA9IGJpdHRzdCggcjMsIDAgKTsKKwlyMyA9IGNjOworCXIxID0gcDE7CisJY2FsbCBfcHV0X2NvcmVfbG9jazsKKwlyZXRzID0gW3NwKytdOworCXIwID0gcjM7CisJcnRzOworRU5EUFJPQyhfX19yYXdfc3Bpbl9pc19sb2NrZWRfYXNtKQorCisvKgorICogcjAgPSAmc3BpbmxvY2stPmxvY2sKKyAqCisgKiBDbG9iYmVyczogcjM6MCwgcDE6MAorICovCitFTlRSWShfX19yYXdfc3Bpbl9sb2NrX2FzbSkKKwlwMSA9IHIwOworCVstLXNwXSA9IHJldHM7CisuTHJldHJ5X3NwaW5sb2NrOgorCWNhbGwgX2dldF9jb3JlX2xvY2s7CisJcjEgPSBwMTsKKwlyMiA9IFtwMV07CisJY2MgPSBiaXR0c3QoIHIyLCAwICk7CisJaWYgY2MganVtcCAuTGJ1c3lfc3BpbmxvY2sKKyNpZmRlZiBfX0FSQ0hfU1lOQ19DT1JFX0RDQUNIRQorCXIzID0gcDE7CisJYml0c2V0ICggcjIsIDAgKTsgLyogUmFpc2UgdGhlIGxvY2sgYml0LiAqLworCVtwMV0gPSByMjsKKwljYWxsIF9zdGFydF9sb2NrX2NvaGVyZW50CisjZWxzZQorCXIyID0gMTsKKwlbcDFdID0gcjI7CisJY2FsbCBfcHV0X2NvcmVfbG9jazsKKyNlbmRpZgorCXJldHMgPSBbc3ArK107CisJcnRzOworCisuTGJ1c3lfc3BpbmxvY2s6CisJLyogV2UgZG9uJ3QgdG91Y2ggdGhlIGF0b21pYyBhcmVhIGlmIGJ1c3ksIHNvIHRoYXQgZmx1c2gKKwkgICB3aWxsIGJlaGF2ZSBsaWtlIG5vcCBpbiBfcHV0X2NvcmVfbG9jay4gKi8KKwljYWxsIF9wdXRfY29yZV9sb2NrOworCVNTWU5DKHIyKTsKKwlyMCA9IHAxOworCWp1bXAgLkxyZXRyeV9zcGlubG9jaworRU5EUFJPQyhfX19yYXdfc3Bpbl9sb2NrX2FzbSkKKworLyoKKyAqIHIwID0gJnNwaW5sb2NrLT5sb2NrCisgKgorICogQ2xvYmJlcnM6IHIzOjAsIHAxOjAKKyAqLworRU5UUlkoX19fcmF3X3NwaW5fdHJ5bG9ja19hc20pCisJcDEgPSByMDsKKwlbLS1zcF0gPSByZXRzOworCWNhbGwgX2dldF9jb3JlX2xvY2s7CisJcjEgPSBwMTsKKwlyMyA9IFtwMV07CisJY2MgPSBiaXR0c3QoIHIzLCAwICk7CisJaWYgY2MganVtcCAuTGZhaWxlZF90cnlsb2NrCisjaWZkZWYgX19BUkNIX1NZTkNfQ09SRV9EQ0FDSEUKKwliaXRzZXQgKCByMywgMCApOyAvKiBSYWlzZSB0aGUgbG9jayBiaXQuICovCisJW3AxXSA9IHIzOworCWNhbGwgX3N0YXJ0X2xvY2tfY29oZXJlbnQKKyNlbHNlCisJcjIgPSAxOworCVtwMV0gPSByMjsKKwljYWxsIF9wdXRfY29yZV9sb2NrOworI2VuZGlmCisJcjAgPSAxOworCXJldHMgPSBbc3ArK107CisJcnRzOworLkxmYWlsZWRfdHJ5bG9jazoKKwljYWxsIF9wdXRfY29yZV9sb2NrOworCXIwID0gMDsKKwlyZXRzID0gW3NwKytdOworCXJ0czsKK0VORFBST0MoX19fcmF3X3NwaW5fdHJ5bG9ja19hc20pCisKKy8qCisgKiByMCA9ICZzcGlubG9jay0+bG9jaworICoKKyAqIENsb2JiZXJzOiByMjowLCBwMTowCisgKi8KK0VOVFJZKF9fX3Jhd19zcGluX3VubG9ja19hc20pCisJcDEgPSByMDsKKwlbLS1zcF0gPSByZXRzOworCWNhbGwgX2dldF9jb3JlX2xvY2s7CisJcjIgPSBbcDFdOworCWJpdGNsciAoIHIyLCAwICk7CisJW3AxXSA9IHIyOworCXIxID0gcDE7CisjaWZkZWYgX19BUkNIX1NZTkNfQ09SRV9EQ0FDSEUKKwljYWxsIF9lbmRfbG9ja19jb2hlcmVudAorI2Vsc2UKKwljYWxsIF9wdXRfY29yZV9sb2NrOworI2VuZGlmCisJcmV0cyA9IFtzcCsrXTsKKwlydHM7CitFTkRQUk9DKF9fX3Jhd19zcGluX3VubG9ja19hc20pCisKKy8qCisgKiByMCA9ICZyd2xvY2stPmxvY2sKKyAqCisgKiBDbG9iYmVyczogcjI6MCwgcDE6MAorICovCitFTlRSWShfX19yYXdfcmVhZF9sb2NrX2FzbSkKKwlwMSA9IHIwOworCVstLXNwXSA9IHJldHM7CisJY2FsbCBfZ2V0X2NvcmVfbG9jazsKKy5McmRsb2NrX3RyeToKKwlyMSA9IFtwMV07CisJcjEgKz0gLTE7CisJW3AxXSA9IHIxOworCWNjID0gcjEgPCAwOworCWlmIGNjIGp1bXAgLkxyZGxvY2tfZmFpbGVkCisJcjEgPSBwMTsKKyNpZmRlZiBfX0FSQ0hfU1lOQ19DT1JFX0RDQUNIRQorCWNhbGwgX3N0YXJ0X2xvY2tfY29oZXJlbnQKKyNlbHNlCisJY2FsbCBfcHV0X2NvcmVfbG9jazsKKyNlbmRpZgorCXJldHMgPSBbc3ArK107CisJcnRzOworCisuTHJkbG9ja19mYWlsZWQ6CisJcjEgKz0gMTsKKwlbcDFdID0gcjE7CisuTHJkbG9ja193YWl0OgorCXIxID0gcDE7CisJY2FsbCBfcHV0X2NvcmVfbG9jazsKKwlTU1lOQyhyMik7CisJcjAgPSBwMTsKKwljYWxsIF9nZXRfY29yZV9sb2NrOworCXIxID0gW3AxXTsKKwljYyA9IHIxIDwgMjsKKwlpZiBjYyBqdW1wIC5McmRsb2NrX3dhaXQ7CisJanVtcCAuTHJkbG9ja190cnkKK0VORFBST0MoX19fcmF3X3JlYWRfbG9ja19hc20pCisKKy8qCisgKiByMCA9ICZyd2xvY2stPmxvY2sKKyAqCisgKiBDbG9iYmVyczogcjM6MCwgcDE6MAorICovCitFTlRSWShfX19yYXdfcmVhZF90cnlsb2NrX2FzbSkKKwlwMSA9IHIwOworCVstLXNwXSA9IHJldHM7CisJY2FsbCBfZ2V0X2NvcmVfbG9jazsKKwlyMSA9IFtwMV07CisJY2MgPSByMSA8PSAwOworCWlmIGNjIGp1bXAgLkxmYWlsZWRfdHJ5cmRsb2NrOworCXIxICs9IC0xOworCVtwMV0gPSByMTsKKwlyMSA9IHAxOworI2lmZGVmIF9fQVJDSF9TWU5DX0NPUkVfRENBQ0hFCisJY2FsbCBfc3RhcnRfbG9ja19jb2hlcmVudAorI2Vsc2UKKwljYWxsIF9wdXRfY29yZV9sb2NrOworI2VuZGlmCisJcmV0cyA9IFtzcCsrXTsKKwlyMCA9IDE7CisJcnRzOworLkxmYWlsZWRfdHJ5cmRsb2NrOgorCXIxID0gcDE7CisJY2FsbCBfcHV0X2NvcmVfbG9jazsKKwlyZXRzID0gW3NwKytdOworCXIwID0gMDsKKwlydHM7CitFTkRQUk9DKF9fX3Jhd19yZWFkX3RyeWxvY2tfYXNtKQorCisvKgorICogcjAgPSAmcndsb2NrLT5sb2NrCisgKgorICogTm90ZTogUHJvY2Vzc2luZyBjb250cm9sbGVkIGJ5IGEgcmVhZGVyIGxvY2sgc2hvdWxkIG5vdCBoYXZlCisgKiBhbnkgc2lkZS1lZmZlY3Qgb24gY2FjaGUgaXNzdWVzIHdpdGggdGhlIG90aGVyIGNvcmUsIHNvIHdlCisgKiBqdXN0IHJlbGVhc2UgdGhlIGNvcmUgbG9jayBhbmQgZXhpdCAobm8gX2VuZF9sb2NrX2NvaGVyZW50KS4KKyAqCisgKiBDbG9iYmVyczogcjM6MCwgcDE6MAorICovCitFTlRSWShfX19yYXdfcmVhZF91bmxvY2tfYXNtKQorCXAxID0gcjA7CisJWy0tc3BdID0gcmV0czsKKwljYWxsIF9nZXRfY29yZV9sb2NrOworCXIxID0gW3AxXTsKKwlyMSArPSAxOworCVtwMV0gPSByMTsKKwlyMSA9IHAxOworCWNhbGwgX3B1dF9jb3JlX2xvY2s7CisJcmV0cyA9IFtzcCsrXTsKKwlydHM7CitFTkRQUk9DKF9fX3Jhd19yZWFkX3VubG9ja19hc20pCisKKy8qCisgKiByMCA9ICZyd2xvY2stPmxvY2sKKyAqCisgKiBDbG9iYmVyczogcjM6MCwgcDE6MAorICovCitFTlRSWShfX19yYXdfd3JpdGVfbG9ja19hc20pCisJcDEgPSByMDsKKwlyMy5sID0gbG8oUldfTE9DS19CSUFTKTsKKwlyMy5oID0gaGkoUldfTE9DS19CSUFTKTsKKwlbLS1zcF0gPSByZXRzOworCWNhbGwgX2dldF9jb3JlX2xvY2s7CisuTHdybG9ja190cnk6CisJcjEgPSBbcDFdOworCXIxID0gcjEgLSByMzsKKyNpZmRlZiBfX0FSQ0hfU1lOQ19DT1JFX0RDQUNIRQorCXIyID0gcjE7CisJcjIgPDw9IDQ7CisJcjIgPj49IDQ7CisJY2MgPSByMiA9PSAwOworI2Vsc2UKKwljYyA9IHIxID09IDA7CisjZW5kaWYKKwlpZiAhY2MganVtcCAuTHdybG9ja193YWl0CisJW3AxXSA9IHIxOworCXIxID0gcDE7CisjaWZkZWYgX19BUkNIX1NZTkNfQ09SRV9EQ0FDSEUKKwljYWxsIF9zdGFydF9sb2NrX2NvaGVyZW50CisjZWxzZQorCWNhbGwgX3B1dF9jb3JlX2xvY2s7CisjZW5kaWYKKwlyZXRzID0gW3NwKytdOworCXJ0czsKKworLkx3cmxvY2tfd2FpdDoKKwlyMSA9IHAxOworCWNhbGwgX3B1dF9jb3JlX2xvY2s7CisJU1NZTkMocjIpOworCXIwID0gcDE7CisJY2FsbCBfZ2V0X2NvcmVfbG9jazsKKwlyMSA9IFtwMV07CisjaWZkZWYgX19BUkNIX1NZTkNfQ09SRV9EQ0FDSEUKKwlyMSA8PD0gNDsKKwlyMSA+Pj0gNDsKKyNlbmRpZgorCWNjID0gcjEgPT0gcjM7CisJaWYgIWNjIGp1bXAgLkx3cmxvY2tfd2FpdDsKKwlqdW1wIC5Md3Jsb2NrX3RyeQorRU5EUFJPQyhfX19yYXdfd3JpdGVfbG9ja19hc20pCisKKy8qCisgKiByMCA9ICZyd2xvY2stPmxvY2sKKyAqCisgKiBDbG9iYmVyczogcjM6MCwgcDE6MAorICovCitFTlRSWShfX19yYXdfd3JpdGVfdHJ5bG9ja19hc20pCisJcDEgPSByMDsKKwlbLS1zcF0gPSByZXRzOworCWNhbGwgX2dldF9jb3JlX2xvY2s7CisJcjEgPSBbcDFdOworCXIyLmwgPSBsbyhSV19MT0NLX0JJQVMpOworCXIyLmggPSBoaShSV19MT0NLX0JJQVMpOworCWNjID0gcjEgPT0gcjI7CisJaWYgIWNjIGp1bXAgLkxmYWlsZWRfdHJ5d3Jsb2NrOworI2lmZGVmIF9fQVJDSF9TWU5DX0NPUkVfRENBQ0hFCisJcjEgPj49IDI4OworCXIxIDw8PSAyODsKKyNlbHNlCisJcjEgPSAwOworI2VuZGlmCisJW3AxXSA9IHIxOworCXIxID0gcDE7CisjaWZkZWYgX19BUkNIX1NZTkNfQ09SRV9EQ0FDSEUKKwljYWxsIF9zdGFydF9sb2NrX2NvaGVyZW50CisjZWxzZQorCWNhbGwgX3B1dF9jb3JlX2xvY2s7CisjZW5kaWYKKwlyZXRzID0gW3NwKytdOworCXIwID0gMTsKKwlydHM7CisKKy5MZmFpbGVkX3RyeXdybG9jazoKKwlyMSA9IHAxOworCWNhbGwgX3B1dF9jb3JlX2xvY2s7CisJcmV0cyA9IFtzcCsrXTsKKwlyMCA9IDA7CisJcnRzOworRU5EUFJPQyhfX19yYXdfd3JpdGVfdHJ5bG9ja19hc20pCisKKy8qCisgKiByMCA9ICZyd2xvY2stPmxvY2sKKyAqCisgKiBDbG9iYmVyczogcjM6MCwgcDE6MAorICovCitFTlRSWShfX19yYXdfd3JpdGVfdW5sb2NrX2FzbSkKKwlwMSA9IHIwOworCXIzLmwgPSBsbyhSV19MT0NLX0JJQVMpOworCXIzLmggPSBoaShSV19MT0NLX0JJQVMpOworCVstLXNwXSA9IHJldHM7CisJY2FsbCBfZ2V0X2NvcmVfbG9jazsKKwlyMSA9IFtwMV07CisJcjEgPSByMSArIHIzOworCVtwMV0gPSByMTsKKwlyMSA9IHAxOworI2lmZGVmIF9fQVJDSF9TWU5DX0NPUkVfRENBQ0hFCisJY2FsbCBfZW5kX2xvY2tfY29oZXJlbnQKKyNlbHNlCisJY2FsbCBfcHV0X2NvcmVfbG9jazsKKyNlbmRpZgorCXJldHMgPSBbc3ArK107CisJcnRzOworRU5EUFJPQyhfX19yYXdfd3JpdGVfdW5sb2NrX2FzbSkKKworLyoKKyAqIHIwID0gcHRyCisgKiByMSA9IHZhbHVlCisgKgorICogQWRkIGEgc2lnbmVkIHZhbHVlIHRvIGEgMzJiaXQgd29yZCBhbmQgcmV0dXJuIHRoZSBuZXcgdmFsdWUgYXRvbWljYWxseS4KKyAqIENsb2JiZXJzOiByMzowLCBwMTowCisgKi8KK0VOVFJZKF9fX3Jhd19hdG9taWNfdXBkYXRlX2FzbSkKKwlwMSA9IHIwOworCXIzID0gcjE7CisJWy0tc3BdID0gcmV0czsKKwljYWxsIF9nZXRfY29yZV9sb2NrOworCXIyID0gW3AxXTsKKwlyMyA9IHIzICsgcjI7CisJW3AxXSA9IHIzOworCXIxID0gcDE7CisJY2FsbCBfcHV0X2NvcmVfbG9jazsKKwlyMCA9IHIzOworCXJldHMgPSBbc3ArK107CisJcnRzOworRU5EUFJPQyhfX19yYXdfYXRvbWljX3VwZGF0ZV9hc20pCisKKy8qCisgKiByMCA9IHB0cgorICogcjEgPSBtYXNrCisgKgorICogQ2xlYXIgdGhlIG1hc2sgYml0cyBmcm9tIGEgMzJiaXQgd29yZCBhbmQgcmV0dXJuIHRoZSBvbGQgMzJiaXQgdmFsdWUKKyAqIGF0b21pY2FsbHkuCisgKiBDbG9iYmVyczogcjM6MCwgcDE6MAorICovCitFTlRSWShfX19yYXdfYXRvbWljX2NsZWFyX2FzbSkKKwlwMSA9IHIwOworCXIzID0gfnIxOworCVstLXNwXSA9IHJldHM7CisJY2FsbCBfZ2V0X2NvcmVfbG9jazsKKwlyMiA9IFtwMV07CisJcjMgPSByMiAmIHIzOworCVtwMV0gPSByMzsKKwlyMyA9IHIyOworCXIxID0gcDE7CisJY2FsbCBfcHV0X2NvcmVfbG9jazsKKwlyMCA9IHIzOworCXJldHMgPSBbc3ArK107CisJcnRzOworRU5EUFJPQyhfX19yYXdfYXRvbWljX2NsZWFyX2FzbSkKKworLyoKKyAqIHIwID0gcHRyCisgKiByMSA9IG1hc2sKKyAqCisgKiBTZXQgdGhlIG1hc2sgYml0cyBpbnRvIGEgMzJiaXQgd29yZCBhbmQgcmV0dXJuIHRoZSBvbGQgMzJiaXQgdmFsdWUKKyAqIGF0b21pY2FsbHkuCisgKiBDbG9iYmVyczogcjM6MCwgcDE6MAorICovCitFTlRSWShfX19yYXdfYXRvbWljX3NldF9hc20pCisJcDEgPSByMDsKKwlyMyA9IHIxOworCVstLXNwXSA9IHJldHM7CisJY2FsbCBfZ2V0X2NvcmVfbG9jazsKKwlyMiA9IFtwMV07CisJcjMgPSByMiB8IHIzOworCVtwMV0gPSByMzsKKwlyMyA9IHIyOworCXIxID0gcDE7CisJY2FsbCBfcHV0X2NvcmVfbG9jazsKKwlyMCA9IHIzOworCXJldHMgPSBbc3ArK107CisJcnRzOworRU5EUFJPQyhfX19yYXdfYXRvbWljX3NldF9hc20pCisKKy8qCisgKiByMCA9IHB0cgorICogcjEgPSBtYXNrCisgKgorICogWE9SIHRoZSBtYXNrIGJpdHMgd2l0aCBhIDMyYml0IHdvcmQgYW5kIHJldHVybiB0aGUgb2xkIDMyYml0IHZhbHVlCisgKiBhdG9taWNhbGx5LgorICogQ2xvYmJlcnM6IHIzOjAsIHAxOjAKKyAqLworRU5UUlkoX19fcmF3X2F0b21pY194b3JfYXNtKQorCXAxID0gcjA7CisJcjMgPSByMTsKKwlbLS1zcF0gPSByZXRzOworCWNhbGwgX2dldF9jb3JlX2xvY2s7CisJcjIgPSBbcDFdOworCXIzID0gcjIgXiByMzsKKwlbcDFdID0gcjM7CisJcjMgPSByMjsKKwlyMSA9IHAxOworCWNhbGwgX3B1dF9jb3JlX2xvY2s7CisJcjAgPSByMzsKKwlyZXRzID0gW3NwKytdOworCXJ0czsKK0VORFBST0MoX19fcmF3X2F0b21pY194b3JfYXNtKQorCisvKgorICogcjAgPSBwdHIKKyAqIHIxID0gbWFzaworICoKKyAqIFBlcmZvcm0gYSBsb2dpY2FsIEFORCBiZXR3ZWVuIHRoZSBtYXNrIGJpdHMgYW5kIGEgMzJiaXQgd29yZCwgYW5kCisgKiByZXR1cm4gdGhlIG1hc2tlZCB2YWx1ZS4gV2UgbmVlZCB0aGlzIG9uIHRoaXMgYXJjaGl0ZWN0dXJlIGluCisgKiBvcmRlciB0byBpbnZhbGlkYXRlIHRoZSBsb2NhbCBjYWNoZSBiZWZvcmUgdGVzdGluZy4KKyAqCisgKiBDbG9iYmVyczogcjM6MCwgcDE6MAorICovCitFTlRSWShfX19yYXdfYXRvbWljX3Rlc3RfYXNtKQorCXAxID0gcjA7CisJcjMgPSByMTsKKwlyMSA9IC1MMV9DQUNIRV9CWVRFUzsKKwlyMSA9IHIwICYgcjE7CisJcDAgPSByMTsKKwlmbHVzaGludltwMF07CisJU1NZTkMocjIpOworCXIwID0gW3AxXTsKKwlyMCA9IHIwICYgcjM7CisJcnRzOworRU5EUFJPQyhfX19yYXdfYXRvbWljX3Rlc3RfYXNtKQorCisvKgorICogcjAgPSBwdHIKKyAqIHIxID0gdmFsdWUKKyAqCisgKiBTd2FwICpwdHIgd2l0aCB2YWx1ZSBhbmQgcmV0dXJuIHRoZSBvbGQgMzJiaXQgdmFsdWUgYXRvbWljYWxseS4KKyAqIENsb2JiZXJzOiByMzowLCBwMTowCisgKi8KKyNkZWZpbmUJX19kb194Y2hnKHNyYywgZHN0KSAJCVwKKwlwMSA9IHIwOwkJCVwKKwlyMyA9IHIxOwkJCVwKKwlbLS1zcF0gPSByZXRzOwkJCVwKKwljYWxsIF9nZXRfY29yZV9sb2NrOwkJXAorCXIyID0gc3JjOwkJCVwKKwlkc3QgPSByMzsJCQlcCisJcjMgPSByMjsJCQlcCisJcjEgPSBwMTsJCQlcCisJY2FsbCBfcHV0X2NvcmVfbG9jazsJCVwKKwlyMCA9IHIzOwkJCVwKKwlyZXRzID0gW3NwKytdOwkJCVwKKwlydHM7CisKK0VOVFJZKF9fX3Jhd194Y2hnXzFfYXNtKQorCV9fZG9feGNoZyhiW3AxXSAoeiksIGJbcDFdKQorRU5EUFJPQyhfX19yYXdfeGNoZ18xX2FzbSkKKworRU5UUlkoX19fcmF3X3hjaGdfMl9hc20pCisJX19kb194Y2hnKHdbcDFdICh6KSwgd1twMV0pCitFTkRQUk9DKF9fX3Jhd194Y2hnXzJfYXNtKQorCitFTlRSWShfX19yYXdfeGNoZ180X2FzbSkKKwlfX2RvX3hjaGcoW3AxXSwgW3AxXSkKK0VORFBST0MoX19fcmF3X3hjaGdfNF9hc20pCisKKy8qCisgKiByMCA9IHB0cgorICogcjEgPSBuZXcKKyAqIHIyID0gb2xkCisgKgorICogU3dhcCAqcHRyIHdpdGggbmV3IGlmICpwdHIgPT0gb2xkIGFuZCByZXR1cm4gdGhlIHByZXZpb3VzICpwdHIKKyAqIHZhbHVlIGF0b21pY2FsbHkuCisgKgorICogQ2xvYmJlcnM6IHIzOjAsIHAxOjAKKyAqLworI2RlZmluZQlfX2RvX2NtcHhjaGcoc3JjLCBkc3QpIAkJXAorCVstLXNwXSA9IHJldHM7CQkJXAorCVstLXNwXSA9IHI0OwkJCVwKKwlwMSA9IHIwOwkJCVwKKwlyMyA9IHIxOwkJCVwKKwlyNCA9IHIyOwkJCVwKKwljYWxsIF9nZXRfY29yZV9sb2NrOwkJXAorCXIyID0gc3JjOwkJCVwKKwljYyA9IHIyID09IHI0OwkJCVwKKwlpZiAhY2MganVtcCAxZjsJCQlcCisJZHN0ID0gcjM7CQkJXAorICAgICAxOiByMyA9IHIyOwkJCVwKKwlyMSA9IHAxOwkJCVwKKwljYWxsIF9wdXRfY29yZV9sb2NrOwkJXAorCXIwID0gcjM7CQkJXAorCXI0ID0gW3NwKytdOwkJCVwKKwlyZXRzID0gW3NwKytdOwkJCVwKKwlydHM7CisKK0VOVFJZKF9fX3Jhd19jbXB4Y2hnXzFfYXNtKQorCV9fZG9fY21weGNoZyhiW3AxXSAoeiksIGJbcDFdKQorRU5EUFJPQyhfX19yYXdfY21weGNoZ18xX2FzbSkKKworRU5UUlkoX19fcmF3X2NtcHhjaGdfMl9hc20pCisJX19kb19jbXB4Y2hnKHdbcDFdICh6KSwgd1twMV0pCitFTkRQUk9DKF9fX3Jhd19jbXB4Y2hnXzJfYXNtKQorCitFTlRSWShfX19yYXdfY21weGNoZ180X2FzbSkKKwlfX2RvX2NtcHhjaGcoW3AxXSwgW3AxXSkKK0VORFBST0MoX19fcmF3X2NtcHhjaGdfNF9hc20pCisKKy8qCisgKiByMCA9IHB0cgorICogcjEgPSBiaXRucgorICoKKyAqIFNldCBhIGJpdCBpbiBhIDMyYml0IHdvcmQgYW5kIHJldHVybiB0aGUgb2xkIDMyYml0IHZhbHVlIGF0b21pY2FsbHkuCisgKiBDbG9iYmVyczogcjM6MCwgcDE6MAorICovCitFTlRSWShfX19yYXdfYml0X3NldF9hc20pCisJcjIgPSByMTsKKwlyMSA9IDE7CisJcjEgPDw9IHIyOworCWp1bXAgX19fcmF3X2F0b21pY19zZXRfYXNtCitFTkRQUk9DKF9fX3Jhd19iaXRfc2V0X2FzbSkKKworLyoKKyAqIHIwID0gcHRyCisgKiByMSA9IGJpdG5yCisgKgorICogQ2xlYXIgYSBiaXQgaW4gYSAzMmJpdCB3b3JkIGFuZCByZXR1cm4gdGhlIG9sZCAzMmJpdCB2YWx1ZSBhdG9taWNhbGx5LgorICogQ2xvYmJlcnM6IHIzOjAsIHAxOjAKKyAqLworRU5UUlkoX19fcmF3X2JpdF9jbGVhcl9hc20pCisJcjIgPSByMTsKKwlyMSA9IDE7CisJcjEgPDw9IHIyOworCWp1bXAgX19fcmF3X2F0b21pY19jbGVhcl9hc20KK0VORFBST0MoX19fcmF3X2JpdF9jbGVhcl9hc20pCisKKy8qCisgKiByMCA9IHB0cgorICogcjEgPSBiaXRucgorICoKKyAqIFRvZ2dsZSBhIGJpdCBpbiBhIDMyYml0IHdvcmQgYW5kIHJldHVybiB0aGUgb2xkIDMyYml0IHZhbHVlIGF0b21pY2FsbHkuCisgKiBDbG9iYmVyczogcjM6MCwgcDE6MAorICovCitFTlRSWShfX19yYXdfYml0X3RvZ2dsZV9hc20pCisJcjIgPSByMTsKKwlyMSA9IDE7CisJcjEgPDw9IHIyOworCWp1bXAgX19fcmF3X2F0b21pY194b3JfYXNtCitFTkRQUk9DKF9fX3Jhd19iaXRfdG9nZ2xlX2FzbSkKKworLyoKKyAqIHIwID0gcHRyCisgKiByMSA9IGJpdG5yCisgKgorICogVGVzdC1hbmQtc2V0IGEgYml0IGluIGEgMzJiaXQgd29yZCBhbmQgcmV0dXJuIHRoZSBvbGQgYml0IHZhbHVlIGF0b21pY2FsbHkuCisgKiBDbG9iYmVyczogcjM6MCwgcDE6MAorICovCitFTlRSWShfX19yYXdfYml0X3Rlc3Rfc2V0X2FzbSkKKwlbLS1zcF0gPSByZXRzOworCVstLXNwXSA9IHIxOworCWNhbGwgX19fcmF3X2JpdF9zZXRfYXNtCisJcjEgPSBbc3ArK107CisJcjIgPSAxOworCXIyIDw8PSByMTsKKwlyMCA9IHIwICYgcjI7CisJY2MgPSByMCA9PSAwOworCWlmIGNjIGp1bXAgMWYKKwlyMCA9IDE7CisxOgorCXJldHMgPSBbc3ArK107CisJcnRzOworRU5EUFJPQyhfX19yYXdfYml0X3Rlc3Rfc2V0X2FzbSkKKworLyoKKyAqIHIwID0gcHRyCisgKiByMSA9IGJpdG5yCisgKgorICogVGVzdC1hbmQtY2xlYXIgYSBiaXQgaW4gYSAzMmJpdCB3b3JkIGFuZCByZXR1cm4gdGhlIG9sZCBiaXQgdmFsdWUgYXRvbWljYWxseS4KKyAqIENsb2JiZXJzOiByMzowLCBwMTowCisgKi8KK0VOVFJZKF9fX3Jhd19iaXRfdGVzdF9jbGVhcl9hc20pCisJWy0tc3BdID0gcmV0czsKKwlbLS1zcF0gPSByMTsKKwljYWxsIF9fX3Jhd19iaXRfY2xlYXJfYXNtCisJcjEgPSBbc3ArK107CisJcjIgPSAxOworCXIyIDw8PSByMTsKKwlyMCA9IHIwICYgcjI7CisJY2MgPSByMCA9PSAwOworCWlmIGNjIGp1bXAgMWYKKwlyMCA9IDE7CisxOgorCXJldHMgPSBbc3ArK107CisJcnRzOworRU5EUFJPQyhfX19yYXdfYml0X3Rlc3RfY2xlYXJfYXNtKQorCisvKgorICogcjAgPSBwdHIKKyAqIHIxID0gYml0bnIKKyAqCisgKiBUZXN0LWFuZC10b2dnbGUgYSBiaXQgaW4gYSAzMmJpdCB3b3JkLAorICogYW5kIHJldHVybiB0aGUgb2xkIGJpdCB2YWx1ZSBhdG9taWNhbGx5LgorICogQ2xvYmJlcnM6IHIzOjAsIHAxOjAKKyAqLworRU5UUlkoX19fcmF3X2JpdF90ZXN0X3RvZ2dsZV9hc20pCisJWy0tc3BdID0gcmV0czsKKwlbLS1zcF0gPSByMTsKKwljYWxsIF9fX3Jhd19iaXRfdG9nZ2xlX2FzbQorCXIxID0gW3NwKytdOworCXIyID0gMTsKKwlyMiA8PD0gcjE7CisJcjAgPSByMCAmIHIyOworCWNjID0gcjAgPT0gMDsKKwlpZiBjYyBqdW1wIDFmCisJcjAgPSAxOworMToKKwlyZXRzID0gW3NwKytdOworCXJ0czsKK0VORFBST0MoX19fcmF3X2JpdF90ZXN0X3RvZ2dsZV9hc20pCisKKy8qCisgKiByMCA9IHB0cgorICogcjEgPSBiaXRucgorICoKKyAqIFRlc3QgYSBiaXQgaW4gYSAzMmJpdCB3b3JkIGFuZCByZXR1cm4gaXRzIHZhbHVlLgorICogV2UgbmVlZCB0aGlzIG9uIHRoaXMgYXJjaGl0ZWN0dXJlIGluIG9yZGVyIHRvIGludmFsaWRhdGUKKyAqIHRoZSBsb2NhbCBjYWNoZSBiZWZvcmUgdGVzdGluZy4KKyAqCisgKiBDbG9iYmVyczogcjM6MCwgcDE6MAorICovCitFTlRSWShfX19yYXdfYml0X3Rlc3RfYXNtKQorCXIyID0gcjE7CisJcjEgPSAxOworCXIxIDw8PSByMjsKKwlqdW1wIF9fX3Jhd19hdG9taWNfdGVzdF9hc20KK0VORFBST0MoX19fcmF3X2JpdF90ZXN0X2FzbSkKKworLyoKKyAqIHIwID0gcHRyCisgKgorICogRmV0Y2ggYW5kIHJldHVybiBhbiB1bmNhY2hlZCAzMmJpdCB2YWx1ZS4KKyAqCisgKiBDbG9iYmVyczogcjI6MCwgcDE6MAorICovCitFTlRSWShfX19yYXdfdW5jYWNoZWRfZmV0Y2hfYXNtKQorCXAxID0gcjA7CisJcjEgPSAtTDFfQ0FDSEVfQllURVM7CisJcjEgPSByMCAmIHIxOworCXAwID0gcjE7CisJZmx1c2hpbnZbcDBdOworCVNTWU5DKHIyKTsKKwlyMCA9IFtwMV07CisJcnRzOworRU5EUFJPQyhfX19yYXdfdW5jYWNoZWRfZmV0Y2hfYXNtKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9jbV9iZjU2MS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9jbV9iZjU2MS5jCmluZGV4IDhmNDA5OTAuLjY4ODBkMWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvY21fYmY1NjEuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2NtX2JmNTYxLmMKQEAgLTIzMCw2ICsyMzAsMTkgQEAKIH07CiAjZW5kaWYKIAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX2dwaW9zX3Jlc291cmNlcyA9IHsKKwkuc3RhcnQgPSAwLAorCS5lbmQgICA9IE1BWF9CTEFDS0ZJTl9HUElPUyAtIDEsCisJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2dwaW9zX2RldmljZSA9IHsKKwkubmFtZSA9ICJzaW1wbGUtZ3BpbyIsCisJLmlkID0gLTEsCisJLm51bV9yZXNvdXJjZXMgPSAxLAorCS5yZXNvdXJjZSA9ICZiZmluX2dwaW9zX3Jlc291cmNlcywKK307CisKICNpZiBkZWZpbmVkKENPTkZJR19VU0JfSVNQMTM2Ml9IQ0QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9JU1AxMzYyX0hDRF9NT0RVTEUpCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGlzcDEzNjJfaGNkX3Jlc291cmNlc1tdID0gewogCXsKQEAgLTI4NywyMyArMzAwLDMzIEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyX3Jlc291cmNlc1tdID0gewogI2lmZGVmIENPTkZJR19CRklOX1NJUjAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIwX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMDQwMCwKIAkJLmVuZCA9IDB4RkZDMDA0RkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCi0jZW5kaWYKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDBfUlgsCisJCS5lbmQgPSBDSF9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXJfZGV2aWNlID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIwX2RldmljZSA9IHsKIAkubmFtZSA9ICJiZmluX3NpciIsCiAJLmlkID0gMCwKLQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXJfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgPSBiZmluX3Npcl9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMF9yZXNvdXJjZXMsCiB9OwogI2VuZGlmCisjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX1BBVEFfUExBVEZPUk0pIHx8IGRlZmluZWQoQ09ORklHX1BBVEFfUExBVEZPUk1fTU9EVUxFKQogI2RlZmluZSBQQVRBX0lOVAlJUlFfUEY0NgpAQCAtMzgyLDcgKzQwNSw5IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi0JJmJmaW5fc2lyX2RldmljZSwKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCisJJmJmaW5fc2lyMF9kZXZpY2UsCisjZW5kaWYKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfVVNCX0lTUDEzNjJfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfSVNQMTM2Ml9IQ0RfTU9EVUxFKQpAQCAtNDAwLDYgKzQyNSw4IEBACiAjaWYgZGVmaW5lZChDT05GSUdfUEFUQV9QTEFURk9STSkgfHwgZGVmaW5lZChDT05GSUdfUEFUQV9QTEFURk9STV9NT0RVTEUpCiAJJmJmaW5fcGF0YV9kZXZpY2UsCiAjZW5kaWYKKworCSZiZmluX2dwaW9zX2RldmljZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGNtX2JmNTYxX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvZXpraXQuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvZXpraXQuYwppbmRleCA1MGI0Y2RjLi4wZTIxNzhhIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2V6a2l0LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9lemtpdC5jCkBAIC00Myw1MyArNDMsNDIgQEAKIC8qCiAgKiBOYW1lIHRoZSBCb2FyZCBmb3IgdGhlIC9wcm9jL2NwdWluZm8KICAqLwotY29uc3QgY2hhciBiZmluX2JvYXJkX25hbWVbXSA9ICJBRERTLUJGNTYxLUVaS0lUIjsKLQotI2RlZmluZSBJU1AxNzYxX0JBU0UgICAgICAgMHgyQzBGMDAwMAotI2RlZmluZSBJU1AxNzYxX0lSUSAgICAgICAgSVJRX1BGMTAKK2NvbnN0IGNoYXIgYmZpbl9ib2FyZF9uYW1lW10gPSAiQURJIEJGNTYxLUVaS0lUIjsKIAogI2lmIGRlZmluZWQoQ09ORklHX1VTQl9JU1AxNzYwX0hDRCkgfHwgZGVmaW5lZChDT05GSUdfVVNCX0lTUDE3NjBfSENEX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9pc3AxNzYxX3Jlc291cmNlc1tdID0gewotCXsKLQkJLm5hbWUJPSAiaXNwMTc2MS1yZWdzIiwKLQkJLnN0YXJ0ICA9IElTUDE3NjFfQkFTRSArIDB4MDAwMDAwMDAsCi0JCS5lbmQgICAgPSBJU1AxNzYxX0JBU0UgKyAweDAwMGZmZmZmLAorI2luY2x1ZGUgPGxpbnV4L3VzYi9pc3AxNzYwLmg+CitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5faXNwMTc2MF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCAgPSAweDJDMEYwMDAwLAorCQkuZW5kICAgID0gMHgyMDNDMDAwMCArIDB4ZmZmZmYsCiAJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKIAl9LAotCXsKLQkJLnN0YXJ0ICA9IElTUDE3NjFfSVJRLAotCQkuZW5kICAgID0gSVNQMTc2MV9JUlEsCisJWzFdID0geworCQkuc3RhcnQgID0gSVJRX1BGMTAsCisJCS5lbmQgICAgPSBJUlFfUEYxMCwKIAkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2lzcDE3NjFfZGV2aWNlID0gewotCS5uYW1lICAgICAgICAgICA9ICJpc3AxNzYxIiwKK3N0YXRpYyBzdHJ1Y3QgaXNwMTc2MF9wbGF0Zm9ybV9kYXRhIGlzcDE3NjBfcHJpdiA9IHsKKwkuaXNfaXNwMTc2MSA9IDAsCisJLnBvcnQxX2Rpc2FibGUgPSAwLAorCS5idXNfd2lkdGhfMTYgPSAxLAorCS5wb3J0MV9vdGcgPSAwLAorCS5hbmFsb2dfb2MgPSAwLAorCS5kYWNrX3BvbGFyaXR5X2hpZ2ggPSAwLAorCS5kcmVxX3BvbGFyaXR5X2hpZ2ggPSAwLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9pc3AxNzYwX2RldmljZSA9IHsKKwkubmFtZSAgICAgICAgICAgPSAiaXNwMTc2MC1oY2QiLAogCS5pZCAgICAgICAgICAgICA9IDAsCi0JLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShiZmluX2lzcDE3NjFfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgICAgICAgPSBiZmluX2lzcDE3NjFfcmVzb3VyY2VzLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmlzcDE3NjBfcHJpdiwKKwl9LAorCS5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUoYmZpbl9pc3AxNzYwX3Jlc291cmNlcyksCisJLnJlc291cmNlICAgICAgID0gYmZpbl9pc3AxNzYwX3Jlc291cmNlcywKIH07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpiZmluX2lzcDE3NjFfZGV2aWNlc1tdID0gewotCSZiZmluX2lzcDE3NjFfZGV2aWNlLAotfTsKLQotaW50IF9faW5pdCBiZmluX2lzcDE3NjFfaW5pdCh2b2lkKQotewotCXVuc2lnbmVkIGludCBudW1fZGV2aWNlcyA9IEFSUkFZX1NJWkUoYmZpbl9pc3AxNzYxX2RldmljZXMpOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXMoKTogcmVnaXN0ZXJpbmcgZGV2aWNlIHJlc291cmNlc1xuIiwgX19mdW5jX18pOwotCXNldF9pcnFfdHlwZShJU1AxNzYxX0lSUSwgSVJRRl9UUklHR0VSX0ZBTExJTkcpOwotCi0JcmV0dXJuIHBsYXRmb3JtX2FkZF9kZXZpY2VzKGJmaW5faXNwMTc2MV9kZXZpY2VzLCBudW1fZGV2aWNlcyk7Ci19Ci0KLXZvaWQgX19leGl0IGJmaW5faXNwMTc2MV9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoJmJmaW5faXNwMTc2MV9kZXZpY2UpOwotfQotCi1hcmNoX2luaXRjYWxsKGJmaW5faXNwMTc2MV9pbml0KTsKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfVVNCX0lTUDEzNjJfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfSVNQMTM2Ml9IQ0RfTU9EVUxFKQpAQCAtMjIxLDIzICsyMTAsMzMgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXJfcmVzb3VyY2VzW10gPSB7CiAjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NpcjBfcmVzb3VyY2VzW10gPSB7CiAJewogCQkuc3RhcnQgPSAweEZGQzAwNDAwLAogCQkuZW5kID0gMHhGRkMwMDRGRiwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKLSNlbmRpZgorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQwX1JYLAorCQkuZW5kID0gSVJRX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMF9SWCwKKwkJLmVuZCA9IENIX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Npcl9kZXZpY2UgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjBfZGV2aWNlID0gewogCS5uYW1lID0gImJmaW5fc2lyIiwKIAkuaWQgPSAwLAotCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3Npcl9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZSA9IGJmaW5fc2lyX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIwX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIwX3Jlc291cmNlcywKIH07CiAjZW5kaWYKKyNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfTVREX1BIWVNNQVApIHx8IGRlZmluZWQoQ09ORklHX01URF9QSFlTTUFQX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBlemtpdF9wYXJ0aXRpb25zW10gPSB7CkBAIC00NDksNiArNDQ4LDEwIEBACiAJJm5ldDIyNzJfYmZpbl9kZXZpY2UsCiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX1VTQl9JU1AxNzYwX0hDRCkgfHwgZGVmaW5lZChDT05GSUdfVVNCX0lTUDE3NjBfSENEX01PRFVMRSkKKwkmYmZpbl9pc3AxNzYwX2RldmljZSwKKyNlbmRpZgorCiAjaWYgZGVmaW5lZChDT05GSUdfU1BJX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1NQSV9CRklOX01PRFVMRSkKIAkmYmZpbl9zcGkwX2RldmljZSwKICNlbmRpZgpAQCAtNDU4LDcgKzQ2MSw5IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi0JJmJmaW5fc2lyX2RldmljZSwKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCisJJmJmaW5fc2lyMF9kZXZpY2UsCisjZW5kaWYKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfR1BJTykgfHwgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfR1BJT19NT0RVTEUpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2dlbmVyaWNfYm9hcmQuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvZ2VuZXJpY19ib2FyZC5jCmluZGV4IDJmYWEwMDcuLjBiYTM2NmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvZ2VuZXJpY19ib2FyZC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvZ2VuZXJpY19ib2FyZC5jCkBAIC02MiwxMCArNjIsNDUgQEAKIH07CiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NpcjBfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQgPSAweEZGQzAwNDAwLAorCQkuZW5kID0gMHhGRkMwMDRGRiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDBfUlgsCisJCS5lbmQgPSBDSF9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIwX2RldmljZSA9IHsKKwkubmFtZSA9ICJiZmluX3NpciIsCisJLmlkID0gMCwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIwX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIwX3Jlc291cmNlcywKK307CisjZW5kaWYKKyNlbmRpZgorCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZ2VuZXJpY19ib2FyZF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKICNpZiBkZWZpbmVkKENPTkZJR19TTUM5MVgpIHx8IGRlZmluZWQoQ09ORklHX1NNQzkxWF9NT0RVTEUpCiAJJnNtYzkxeF9kZXZpY2UsCiAjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorCSZiZmluX3NpcjBfZGV2aWNlLAorI2VuZGlmCisjZW5kaWYKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGdlbmVyaWNfYm9hcmRfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy90ZXBsYS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy90ZXBsYS5jCmluZGV4IGM5MTc0YjMuLjZmNzdkYmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvdGVwbGEuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL3RlcGxhLmMKQEAgLTQ0LDggKzQ0LDQyIEBACiAJLnJlc291cmNlICAgICAgPSBzbWM5MXhfcmVzb3VyY2VzLAogfTsKIAorI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NpcjBfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQgPSAweEZGQzAwNDAwLAorCQkuZW5kID0gMHhGRkMwMDRGRiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDBfUlgsCisJCS5lbmQgPSBDSF9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIwX2RldmljZSA9IHsKKwkubmFtZSA9ICJiZmluX3NpciIsCisJLmlkID0gMCwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIwX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIwX3Jlc291cmNlcywKK307CisjZW5kaWYKKyNlbmRpZgorCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqdGVwbGFfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAJJnNtYzkxeF9kZXZpY2UsCisjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCisJJmJmaW5fc2lyMF9kZXZpY2UsCisjZW5kaWYKKyNlbmRpZgogfTsKIAogc3RhdGljIGludCBfX2luaXQgdGVwbGFfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2RtYS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2RtYS5jCmluZGV4IDI0NDE1ZWIuLjQyYjAwMzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9kbWEuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvZG1hLmMKQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAKLXN0cnVjdCBkbWFfcmVnaXN0ZXIgKmRtYV9pb19iYXNlX2FkZHJbTUFYX0JMQUNLRklOX0RNQV9DSEFOTkVMXSA9IHsKK3N0cnVjdCBkbWFfcmVnaXN0ZXIgKmRtYV9pb19iYXNlX2FkZHJbTUFYX0RNQV9DSEFOTkVMU10gPSB7CiAJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMV8wX05FWFRfREVTQ19QVFIsCiAJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMV8xX05FWFRfREVTQ19QVFIsCiAJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMV8yX05FWFRfREVTQ19QVFIsCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaGVhZC5TIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2hlYWQuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFhNzc3YS4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaGVhZC5TCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9oZWFkLlMKLSAqIEJhc2VkIG9uOiAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2hlYWQuUwotICogQXV0aG9yOgotICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjogIEJGNTYxIHN0YXJ0dXAgZmlsZQotICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA2IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KLSNpZmRlZiBDT05GSUdfQkZJTl9LRVJORUxfQ0xPQ0sKLSNpbmNsdWRlIDxhc20vY2xvY2tzLmg+Ci0jaW5jbHVkZSA8bWFjaC9tZW1faW5pdC5oPgotI2VuZGlmCi0KLS5zZWN0aW9uIC5sMS50ZXh0Ci0jaWZkZWYgQ09ORklHX0JGSU5fS0VSTkVMX0NMT0NLCi1FTlRSWShfc3RhcnRfZG1hX2NvZGUpCi0JcDAuaCA9IGhpKFNJQ0FfSVdSMCk7Ci0JcDAubCA9IGxvKFNJQ0FfSVdSMCk7Ci0JcjAubCA9IDB4MTsKLQlbcDBdID0gcjA7Ci0JU1NZTkM7Ci0KLQkvKgotCSAqICBTZXQgUExMX0NUTAotCSAqICAgLSBbMTQ6MDldID0gTVNFTFs1OjBdIDogQ0xLSU4gLyBWQ08gbXVsdGlwbGljYXRpb24gZmFjdG9ycwotCSAqICAgLSBbOF0gICAgID0gQllQQVNTICAgIDogQllQQVNTIHRoZSBQTEwsIHJ1biBDTEtJTiBpbnRvIENDTEsvU0NMSwotCSAqICAgLSBbN10gICAgID0gb3V0cHV0IGRlbGF5IChhZGQgMjAwcHMgb2YgZGVsYXkgdG8gbWVtIHNpZ25hbHMpCi0JICogICAtIFs2XSAgICAgPSBpbnB1dCBkZWxheSAoYWRkIDIwMHBzIG9mIGlucHV0IGRlbGF5IHRvIG1lbSBzaWduYWxzKQotCSAqICAgLSBbNV0gICAgID0gUERXTiAgICAgIDogMT1BbGwgQ2xvY2tzIG9mZgotCSAqICAgLSBbM10gICAgID0gU1RPUENLICAgIDogMT1Db3JlIENsb2NrIG9mZgotCSAqICAgLSBbMV0gICAgID0gUExMX09GRiAgIDogMT1EaXNhYmxlIFBvd2VyIHRvIFBMTAotCSAqICAgLSBbMF0gICAgID0gREYgICAgICAgIDogMT1QYXNzIENMS0lOLzIgdG8gUExMIC8gMD1QYXNzIENMS0lOIHRvIFBMTAotCSAqICAgYWxsIG90aGVyIGJpdHMgc2V0IHRvIHplcm8KLQkgKi8KLQotCXAwLmggPSBoaShQTExfTE9DS0NOVCk7Ci0JcDAubCA9IGxvKFBMTF9MT0NLQ05UKTsKLQlyMCA9IDB4MzAwKFopOwotCXdbcDBdID0gcjAubDsKLQlzc3luYzsKLQotCVAyLkggPSBoaShFQklVX1NER0NUTCk7Ci0JUDIuTCA9IGxvKEVCSVVfU0RHQ1RMKTsKLQlSMCA9IFtQMl07Ci0JQklUU0VUIChSMCwgMjQpOwotCVtQMl0gPSBSMDsKLQlTU1lOQzsKLQotCXIwID0gQ09ORklHX1ZDT19NVUxUICYgNjM7ICAgICAgIC8qIExvYWQgdGhlIFZDTyBtdWx0aXBsaWVyICAgICAgICAgKi8KLQlyMCA9IHIwIDw8IDk7ICAgICAgICAgICAgICAgICAgICAvKiBTaGlmdCBpdCBvdmVyLCAgICAgICAgICAgICAgICAgICovCi0JcjEgPSBDTEtJTl9IQUxGOyAgICAgICAgICAgICAgICAgLyogRG8gd2UgbmVlZCB0byBkaXZpZGUgQ0xLSU4gYnkgMj8qLwotCXIwID0gcjEgfCByMDsKLQlyMSA9IFBMTF9CWVBBU1M7ICAgICAgICAgICAgICAgICAvKiBCeXBhc3MgdGhlIFBMTD8gICAgICAgICAgICAgICAgICovCi0JcjEgPSByMSA8PCA4OyAgICAgICAgICAgICAgICAgICAgLyogU2hpZnQgaXQgb3ZlciAgICAgICAgICAgICAgICAgICAqLwotCXIwID0gcjEgfCByMDsgICAgICAgICAgICAgICAgICAgIC8qIGFkZCB0aGVtIGFsbCB0b2dldGhlciAgICAgICAgICAgKi8KLSNpZmRlZiBBTk9NQUxZXzA1MDAwMjY1Ci0JQklUU0VUKHIwLCAxNSk7ICAgICAgICAgICAgICAgICAgLyogQWRkIDI1MCBtViBvZiBoeXN0ZXJlc2lzIHRvIFNQT1JUIGlucHV0IHBpbnMgKi8KLSNlbmRpZgotCi0JcDAuaCA9IGhpKFBMTF9DVEwpOwotCXAwLmwgPSBsbyhQTExfQ1RMKTsgICAgICAgICAgICAgIC8qIExvYWQgdGhlIGFkZHJlc3MgICAgICAgICAgICAgICAgKi8KLQljbGkgcjI7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEaXNhYmxlIGludGVycnVwdHMgICAgICAgICAgICAgICovCi0Jc3N5bmM7Ci0Jd1twMF0gPSByMC5sOyAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSB2YWx1ZSAgICAgICAgICAgICAgICAgICAqLwotCWlkbGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdhaXQgZm9yIHRoZSBQTEwgdG8gc3RhYmxpemUgICAgKi8KLQlzdGkgcjI7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgaW50ZXJydXB0cyAgICAgICAgICAgICAgICovCi0KLS5MY2hlY2tfYWdhaW46Ci0JcDAuaCA9IGhpKFBMTF9TVEFUKTsKLQlwMC5sID0gbG8oUExMX1NUQVQpOwotCVIwID0gV1tQMF0oWik7Ci0JQ0MgPSBCSVRUU1QoUjAsNSk7Ci0JaWYgISBDQyBqdW1wIC5MY2hlY2tfYWdhaW47Ci0KLQkvKiBDb25maWd1cmUgU0NMSyAmIENDTEsgRGl2aWRlcnMgKi8KLQlyMCA9IChDT05GSUdfQ0NMS19BQ1RfRElWIHwgQ09ORklHX1NDTEtfRElWKTsKLQlwMC5oID0gaGkoUExMX0RJVik7Ci0JcDAubCA9IGxvKFBMTF9ESVYpOwotCXdbcDBdID0gcjAubDsKLQlzc3luYzsKLQotCXAwLmwgPSBsbyhFQklVX1NEUlJDKTsKLQlwMC5oID0gaGkoRUJJVV9TRFJSQyk7Ci0JcjAgPSBtZW1fU0RSUkM7Ci0Jd1twMF0gPSByMC5sOwotCXNzeW5jOwotCi0JUDIuSCA9IGhpKEVCSVVfU0RHQ1RMKTsKLQlQMi5MID0gbG8oRUJJVV9TREdDVEwpOwotCVIwID0gW1AyXTsKLQlCSVRDTFIgKFIwLCAyNCk7Ci0JcDAuaCA9IGhpKEVCSVVfU0RTVEFUKTsKLQlwMC5sID0gbG8oRUJJVV9TRFNUQVQpOwotCXIyLmwgPSB3W3AwXTsKLQljYyA9IGJpdHRzdChyMiwzKTsKLQlpZiAhY2MganVtcCAuTHNraXA7Ci0JTk9QOwotCUJJVFNFVCAoUjAsIDIzKTsKLS5Mc2tpcDoKLQlbUDJdID0gUjA7Ci0JU1NZTkM7Ci0KLQlSMC5MID0gbG8obWVtX1NER0NUTCk7Ci0JUjAuSCA9IGhpKG1lbV9TREdDVEwpOwotCVIxID0gW3AyXTsKLQlSMSA9IFIxIHwgUjA7Ci0JW1AyXSA9IFIxOwotCVNTWU5DOwotCi0JUlRTOwotRU5EUFJPQyhfc3RhcnRfZG1hX2NvZGUpCi0jZW5kaWYgLyogQ09ORklHX0JGSU5fS0VSTkVMX0NMT0NLICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2Fub21hbHkuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvYW5vbWFseS5oCmluZGV4IDIyOTkwZGYuLjFhOWUxNzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvYW5vbWFseS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvYW5vbWFseS5oCkBAIC03LDcgKzcsNyBAQAogICovCiAKIC8qIFRoaXMgZmlsZSBzaG91bGUgYmUgdXAgdG8gZGF0ZSB3aXRoOgotICogIC0gUmV2aXNpb24gUCwgMDIvMDgvMjAwODsgQURTUC1CRjU2MSBCbGFja2ZpbiBQcm9jZXNzb3IgQW5vbWFseSBMaXN0CisgKiAgLSBSZXZpc2lvbiBRLCAxMS8wNy8yMDA4OyBBRFNQLUJGNTYxIEJsYWNrZmluIFByb2Nlc3NvciBBbm9tYWx5IExpc3QKICAqLwogCiAjaWZuZGVmIF9NQUNIX0FOT01BTFlfSF8KQEAgLTI2NCw2ICsyNjQsMTggQEAKICNkZWZpbmUgQU5PTUFMWV8wNTAwMDM3MSAoMSkKIC8qIExldmVsLVNlbnNpdGl2ZSBFeHRlcm5hbCBHUElPIFdha2V1cHMgTWF5IENhdXNlIEluZGVmaW5pdGUgU3RhbGwgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDQwMyAoMSkKKy8qIFRFU1RTRVQgSW5zdHJ1Y3Rpb24gQ2F1c2VzIERhdGEgQ29ycnVwdGlvbiB3aXRoIFdyaXRlYmFjayBEYXRhIENhY2hlIEVuYWJsZWQgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQxMiAoMSkKKy8qIFNwZWN1bGF0aXZlIEZldGNoZXMgQ2FuIENhdXNlIFVuZGVzaXJlZCBFeHRlcm5hbCBGSUZPIE9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQxNiAoMSkKKy8qIE11bHRpY2hhbm5lbCBTUE9SVCBDaGFubmVsIE1pc2FsaWdubWVudCBVbmRlciBTcGVjaWZpYyBDb25maWd1cmF0aW9uICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MjUgKDEpCisvKiBTcGVjdWxhdGl2ZSBGZXRjaGVzIG9mIEluZGlyZWN0LVBvaW50ZXIgSW5zdHJ1Y3Rpb25zIENhbiBDYXVzZSBGYWxzZSBIYXJkd2FyZSBFcnJvcnMgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQyNiAoMSkKKy8qIExvc3QvQ29ycnVwdGVkIEwyL0wzIE1lbW9yeSBXcml0ZSBhZnRlciBTcGVjdWxhdGl2ZSBMMiBNZW1vcnkgUmVhZCBieSBDb3JlIEIgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQyOCAoX19TSUxJQ09OX1JFVklTSU9OX18gPiAzKQorLyogSUZMVVNIIEluc3RydWN0aW9uIGF0IEVuZCBvZiBIYXJkd2FyZSBMb29wIENhdXNlcyBJbmZpbml0ZSBTdGFsbCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDQzICgxKQogCiAvKiBBbm9tYWxpZXMgdGhhdCBkb24ndCBleGlzdCBvbiB0aGlzIHByb2MgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDE1OCAoMCkKQEAgLTI3Miw1ICsyODQsNyBAQAogI2RlZmluZSBBTk9NQUxZXzA1MDAwMzExICgwKQogI2RlZmluZSBBTk9NQUxZXzA1MDAwMzUzICgxKQogI2RlZmluZSBBTk9NQUxZXzA1MDAwMzg2ICgxKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwNDMyICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwNDM1ICgwKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvYmY1NjEuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvYmY1NjEuaAppbmRleCAxOGIxYjNhLi45OTY4MzYyIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2JmNTYxLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9iZjU2MS5oCkBAIC0yMTUsNyArMjE1LDcgQEAKICNlbmRpZgogCiAjaWZuZGVmIENQVQotI2Vycm9yIFVua25vd24gQ1BVIHR5cGUgLSBUaGlzIGtlcm5lbCBkb2Vzbid0IHNlZW0gdG8gYmUgY29uZmlndXJlZCBwcm9wZXJseQorI2Vycm9yICJVbmtub3duIENQVSB0eXBlIC0gVGhpcyBrZXJuZWwgZG9lc24ndCBzZWVtIHRvIGJlIGNvbmZpZ3VyZWQgcHJvcGVybHkiCiAjZW5kaWYKIAogI2VuZGlmCQkJCS8qIF9fTUFDSF9CRjU2MV9IX18gICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2JmaW5fc2lyLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2JmaW5fc2lyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYjg3ZTkuLjAwMDAwMDAKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9iZmluX3Npci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiBCbGFja2ZpbiBJbmZyYS1yZWQgRHJpdmVyCi0gKgotICogQ29weXJpZ2h0IDIwMDYtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+Ci0jaW5jbHVkZSA8YXNtL2RtYS5oPgotI2luY2x1ZGUgPGFzbS9wb3J0bXV4Lmg+Ci0KLSNkZWZpbmUgU0lSX1VBUlRfR0VUX0NIQVIocG9ydCkgICBiZmluX3JlYWQxNigocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfUkJSKQotI2RlZmluZSBTSVJfVUFSVF9HRVRfRExMKHBvcnQpICAgIGJmaW5fcmVhZDE2KChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9ETEwpCi0jZGVmaW5lIFNJUl9VQVJUX0dFVF9JRVIocG9ydCkgICAgYmZpbl9yZWFkMTYoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0lFUikKLSNkZWZpbmUgU0lSX1VBUlRfR0VUX0RMSChwb3J0KSAgICBiZmluX3JlYWQxNigocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfRExIKQotI2RlZmluZSBTSVJfVUFSVF9HRVRfSUlSKHBvcnQpICAgIGJmaW5fcmVhZDE2KChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9JSVIpCi0jZGVmaW5lIFNJUl9VQVJUX0dFVF9MQ1IocG9ydCkgICAgYmZpbl9yZWFkMTYoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0xDUikKLSNkZWZpbmUgU0lSX1VBUlRfR0VUX0dDVEwocG9ydCkgICBiZmluX3JlYWQxNigocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfR0NUTCkKLQotI2RlZmluZSBTSVJfVUFSVF9QVVRfQ0hBUihwb3J0LCB2KSBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9USFIpLCB2KQotI2RlZmluZSBTSVJfVUFSVF9QVVRfRExMKHBvcnQsIHYpICBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9ETEwpLCB2KQotI2RlZmluZSBTSVJfVUFSVF9QVVRfSUVSKHBvcnQsIHYpICBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9JRVIpLCB2KQotI2RlZmluZSBTSVJfVUFSVF9QVVRfRExIKHBvcnQsIHYpICBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9ETEgpLCB2KQotI2RlZmluZSBTSVJfVUFSVF9QVVRfTENSKHBvcnQsIHYpICBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9MQ1IpLCB2KQotI2RlZmluZSBTSVJfVUFSVF9QVVRfR0NUTChwb3J0LCB2KSBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9HQ1RMKSwgdikKLQotI2lmZGVmIENPTkZJR19TSVJfQkZJTl9ETUEKLXN0cnVjdCBkbWFfcnhfYnVmIHsKLQljaGFyICpidWY7Ci0JaW50IGhlYWQ7Ci0JaW50IHRhaWw7Ci0JfTsKLSNlbmRpZiAvKiBDT05GSUdfU0lSX0JGSU5fRE1BICovCi0KLXN0cnVjdCBiZmluX3Npcl9wb3J0IHsKLQl1bnNpZ25lZCBjaGFyIF9faW9tZW0gICAqbWVtYmFzZTsKLQl1bnNpZ25lZCBpbnQgICAgICAgICAgICBpcnE7Ci0JdW5zaWduZWQgaW50ICAgICAgICAgICAgbHNyOwotCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIGNsazsKLQlzdHJ1Y3QgbmV0X2RldmljZSAgICAgICAqZGV2OwotI2lmZGVmIENPTkZJR19TSVJfQkZJTl9ETUEKLQlpbnQgICAgICAgICAgICAgICAgICAgICB0eF9kb25lOwotCXN0cnVjdCBkbWFfcnhfYnVmICAgICAgIHJ4X2RtYV9idWY7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgICAgICAgcnhfZG1hX3RpbWVyOwotCWludCAgICAgICAgICAgICAgICAgICAgIHJ4X2RtYV9ucm93czsKLSNlbmRpZiAvKiBDT05GSUdfU0lSX0JGSU5fRE1BICovCi0JdW5zaWduZWQgaW50ICAgICAgICAgICAgdHhfZG1hX2NoYW5uZWw7Ci0JdW5zaWduZWQgaW50ICAgICAgICAgICAgcnhfZG1hX2NoYW5uZWw7Ci19OwotCi1zdHJ1Y3QgYmZpbl9zaXJfcG9ydCBzaXJfcG9ydHNbQkZJTl9VQVJUX05SX1BPUlRTXTsKLQotc3RydWN0IGJmaW5fc2lyX3BvcnRfcmVzIHsKLQl1bnNpZ25lZCBsb25nICAgYmFzZV9hZGRyOwotCWludCAgICAgICAgICAgICBpcnE7Ci0JdW5zaWduZWQgaW50ICAgIHJ4X2RtYV9jaGFubmVsOwotCXVuc2lnbmVkIGludCAgICB0eF9kbWFfY2hhbm5lbDsKLX07Ci0KLXN0cnVjdCBiZmluX3Npcl9wb3J0X3JlcyBiZmluX3Npcl9wb3J0X3Jlc291cmNlW10gPSB7Ci0jaWZkZWYgQ09ORklHX0JGSU5fU0lSMAotCXsKLQkweEZGQzAwNDAwLAotCUlSUV9VQVJUX1JYLAotCUNIX1VBUlRfUlgsCi0JQ0hfVUFSVF9UWCwKLQl9LAotI2VuZGlmCi19OwotCi1pbnQgbnJfc2lycyA9IEFSUkFZX1NJWkUoYmZpbl9zaXJfcG9ydF9yZXNvdXJjZSk7Ci0KLXN0cnVjdCBiZmluX3Npcl9zZWxmIHsKLQlzdHJ1Y3QgYmZpbl9zaXJfcG9ydCAgICAqc2lyX3BvcnQ7Ci0Jc3BpbmxvY2tfdCAgICAgICAgICAgICAgbG9jazsKLQl1bnNpZ25lZCBpbnQgICAgICAgICAgICBvcGVuOwotCWludCAgICAgICAgICAgICAgICAgICAgIHNwZWVkOwotCWludCAgICAgICAgICAgICAgICAgICAgIG5ld3NwZWVkOwotCi0Jc3RydWN0IHNrX2J1ZmYgICAgICAgICAgKnR4c2tiOwotCXN0cnVjdCBza19idWZmICAgICAgICAgICpyeHNrYjsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKLQlzdHJ1Y3QgZGV2aWNlICAgICAgICAgICAqZGV2OwotCXN0cnVjdCBpcmxhcF9jYiAgICAgICAgICppcmxhcDsKLQlzdHJ1Y3QgcW9zX2luZm8gICAgICAgICBxb3M7Ci0KLQlpb2J1ZmZfdCAgICAgICAgICAgICAgICB0eF9idWZmOwotCWlvYnVmZl90ICAgICAgICAgICAgICAgIHJ4X2J1ZmY7Ci0KLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgICAgICB3b3JrOwotCWludCAgICAgICAgICAgICAgICAgICAgIG10dDsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IFNJUl9VQVJUX0dFVF9MU1Ioc3RydWN0IGJmaW5fc2lyX3BvcnQgKnBvcnQpCi17Ci0JdW5zaWduZWQgaW50IGxzciA9IGJmaW5fcmVhZDE2KHBvcnQtPm1lbWJhc2UgKyBPRkZTRVRfTFNSKTsKLQlwb3J0LT5sc3IgfD0gKGxzciAmIChCSXxGRXxQRXxPRSkpOwotCXJldHVybiBsc3IgfCBwb3J0LT5sc3I7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBTSVJfVUFSVF9DTEVBUl9MU1Ioc3RydWN0IGJmaW5fc2lyX3BvcnQgKnBvcnQpCi17Ci0JcG9ydC0+bHNyID0gMDsKLQliZmluX3JlYWQxNihwb3J0LT5tZW1iYXNlICsgT0ZGU0VUX0xTUik7Ci19Ci0KLSNkZWZpbmUgRFJJVkVSX05BTUUgImJmaW5fc2lyIgotCi1zdGF0aWMgaW50IGJmaW5fc2lyX2h3X2luaXQodm9pZCkKLXsKLQlpbnQgcmV0ID0gLUVOT0RFVjsKLSNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCi0JcmV0ID0gcGVyaXBoZXJhbF9yZXF1ZXN0KFBfVUFSVDBfVFgsIERSSVZFUl9OQU1FKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCXJldCA9IHBlcmlwaGVyYWxfcmVxdWVzdChQX1VBUlQwX1JYLCBEUklWRVJfTkFNRSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLSNlbmRpZgotCXJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKaW5kZXggMGVhODY2Ni4uZjc5ZjY2MjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKQEAgLTY2LDggKzY2LDEyIEBACiAKICNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JTUFTSyh4KQkJYmZpbl9yZWFkMzIoU0lDQV9JTUFTSzAgKyAoeCA8PCAyKSkKICNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSU1BU0soeCwgdmFsKQliZmluX3dyaXRlMzIoKFNJQ0FfSU1BU0swICsgKHggPDwgMikpLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNCX0lNQVNLKHgpCQliZmluX3JlYWQzMihTSUNCX0lNQVNLMCArICh4IDw8IDIpKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ0JfSU1BU0soeCwgdmFsKQliZmluX3dyaXRlMzIoKFNJQ0JfSU1BU0swICsgKHggPDwgMikpLCB2YWwpCiAjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSVNSKHgpCQliZmluX3JlYWQzMihTSUNBX0lTUjAgKyAoeCA8PCAyKSkKICNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSVNSKHgsIHZhbCkJYmZpbl93cml0ZTMyKChTSUNBX0lTUjAgKyAoeCA8PCAyKSksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ0JfSVNSKHgpCQliZmluX3JlYWQzMihTSUNCX0lTUjAgKyAoeCA8PCAyKSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNCX0lTUih4LCB2YWwpCWJmaW5fd3JpdGUzMigoU0lDQl9JU1IwICsgKHggPDwgMikpLCB2YWwpCiAKICNkZWZpbmUgQkZJTl9VQVJUX05SX1BPUlRTICAgICAgMQogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2NkZWZCRjU2MS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9jZGVmQkY1NjEuaAppbmRleCBjMTRkNjM0Li45NWQ2MDlmIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2NkZWZCRjU2MS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvY2RlZkJGNTYxLmgKQEAgLTM5LDY1ICszOSwxNSBAQAogLyppbmNsdWRlIGNvcmUgc3BlY2lmaWMgcmVnaXN0ZXIgcG9pbnRlciBkZWZpbml0aW9ucyovCiAjaW5jbHVkZSA8YXNtL2NkZWZfTFBCbGFja2Zpbi5oPgogCi0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIC8qIFN5c3RlbSBNTVIgUmVnaXN0ZXIgTWFwICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIAogLyogQ2xvY2sgYW5kIFN5c3RlbSBDb250cm9sICgweEZGQzAwMDAwIC0gMHhGRkMwMDBGRikgKi8KICNkZWZpbmUgYmZpbl9yZWFkX1BMTF9DVEwoKSAgICAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KFBMTF9DVEwpCi0vKiBXcml0aW5nIHRvIFBMTF9DVEwgaW5pdGlhdGVzIGEgUExMIHJlbG9jayBzZXF1ZW5jZS4gKi8KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgYmZpbl93cml0ZV9QTExfQ1RMKHVuc2lnbmVkIGludCB2YWwpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFncywgaXdyMCwgaXdyMTsKLQotCWlmICh2YWwgPT0gYmZpbl9yZWFkX1BMTF9DVEwoKSkKLQkJcmV0dXJuOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCS8qIEVuYWJsZSB0aGUgUExMIFdha2V1cCBiaXQgaW4gU0lDIElXUiAqLwotCWl3cjAgPSBiZmluX3JlYWQzMihTSUNBX0lXUjApOwotCWl3cjEgPSBiZmluX3JlYWQzMihTSUNBX0lXUjEpOwotCS8qIE9ubHkgYWxsb3cgUFBMIFdha2V1cCkgKi8KLQliZmluX3dyaXRlMzIoU0lDQV9JV1IwLCBJV1JfRU5BQkxFKDApKTsKLQliZmluX3dyaXRlMzIoU0lDQV9JV1IxLCAwKTsKLQotCWJmaW5fd3JpdGUxNihQTExfQ1RMLCB2YWwpOwotCVNTWU5DKCk7Ci0JYXNtKCJJRExFOyIpOwotCi0JYmZpbl93cml0ZTMyKFNJQ0FfSVdSMCwgaXdyMCk7Ci0JYmZpbl93cml0ZTMyKFNJQ0FfSVdSMSwgaXdyMSk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQogI2RlZmluZSBiZmluX3JlYWRfUExMX0RJVigpICAgICAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoUExMX0RJVikKICNkZWZpbmUgYmZpbl93cml0ZV9QTExfRElWKHZhbCkgICAgICAgICAgICAgIGJmaW5fd3JpdGUxNihQTExfRElWLHZhbCkKICNkZWZpbmUgYmZpbl9yZWFkX1ZSX0NUTCgpICAgICAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KFZSX0NUTCkKLS8qIFdyaXRpbmcgdG8gVlJfQ1RMIGluaXRpYXRlcyBhIFBMTCByZWxvY2sgc2VxdWVuY2UuICovCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGJmaW5fd3JpdGVfVlJfQ1RMKHVuc2lnbmVkIGludCB2YWwpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFncywgaXdyMCwgaXdyMTsKLQotCWlmICh2YWwgPT0gYmZpbl9yZWFkX1ZSX0NUTCgpKQotCQlyZXR1cm47Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JLyogRW5hYmxlIHRoZSBQTEwgV2FrZXVwIGJpdCBpbiBTSUMgSVdSICovCi0JaXdyMCA9IGJmaW5fcmVhZDMyKFNJQ0FfSVdSMCk7Ci0JaXdyMSA9IGJmaW5fcmVhZDMyKFNJQ0FfSVdSMSk7Ci0JLyogT25seSBhbGxvdyBQUEwgV2FrZXVwKSAqLwotCWJmaW5fd3JpdGUzMihTSUNBX0lXUjAsIElXUl9FTkFCTEUoMCkpOwotCWJmaW5fd3JpdGUzMihTSUNBX0lXUjEsIDApOwotCi0JYmZpbl93cml0ZTE2KFZSX0NUTCwgdmFsKTsKLQlTU1lOQygpOwotCWFzbSgiSURMRTsiKTsKLQotCWJmaW5fd3JpdGUzMihTSUNBX0lXUjAsIGl3cjApOwotCWJmaW5fd3JpdGUzMihTSUNBX0lXUjEsIGl3cjEpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KICNkZWZpbmUgYmZpbl9yZWFkX1BMTF9TVEFUKCkgICAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KFBMTF9TVEFUKQogI2RlZmluZSBiZmluX3dyaXRlX1BMTF9TVEFUKHZhbCkgICAgICAgICAgICAgYmZpbl93cml0ZTE2KFBMTF9TVEFULHZhbCkKICNkZWZpbmUgYmZpbl9yZWFkX1BMTF9MT0NLQ05UKCkgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KFBMTF9MT0NLQ05UKQpAQCAtMTU3Niw0ICsxNTI2LDU3IEBACiAjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX1NUQVJUX0FERFIoKSAgYmZpbl9yZWFkX01ETUExX0QwX1NUQVJUX0FERFIoKQogI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVfTURNQTFfRDBfU1RBUlRfQUREUih2YWwpCiAKKy8qIFRoZXNlIG5lZWQgdG8gYmUgbGFzdCBkdWUgdG8gdGhlIGNkZWYvbGludXggaW50ZXItZGVwZW5kZW5jaWVzICovCisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisvKiBXcml0aW5nIHRvIFBMTF9DVEwgaW5pdGlhdGVzIGEgUExMIHJlbG9jayBzZXF1ZW5jZS4gKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgYmZpbl93cml0ZV9QTExfQ1RMKHVuc2lnbmVkIGludCB2YWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncywgaXdyMCwgaXdyMTsKKworCWlmICh2YWwgPT0gYmZpbl9yZWFkX1BMTF9DVEwoKSkKKwkJcmV0dXJuOworCisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOworCS8qIEVuYWJsZSB0aGUgUExMIFdha2V1cCBiaXQgaW4gU0lDIElXUiAqLworCWl3cjAgPSBiZmluX3JlYWQzMihTSUNBX0lXUjApOworCWl3cjEgPSBiZmluX3JlYWQzMihTSUNBX0lXUjEpOworCS8qIE9ubHkgYWxsb3cgUFBMIFdha2V1cCkgKi8KKwliZmluX3dyaXRlMzIoU0lDQV9JV1IwLCBJV1JfRU5BQkxFKDApKTsKKwliZmluX3dyaXRlMzIoU0lDQV9JV1IxLCAwKTsKKworCWJmaW5fd3JpdGUxNihQTExfQ1RMLCB2YWwpOworCVNTWU5DKCk7CisJYXNtKCJJRExFOyIpOworCisJYmZpbl93cml0ZTMyKFNJQ0FfSVdSMCwgaXdyMCk7CisJYmZpbl93cml0ZTMyKFNJQ0FfSVdSMSwgaXdyMSk7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOworfQorCisvKiBXcml0aW5nIHRvIFZSX0NUTCBpbml0aWF0ZXMgYSBQTEwgcmVsb2NrIHNlcXVlbmNlLiAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCBiZmluX3dyaXRlX1ZSX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGl3cjAsIGl3cjE7CisKKwlpZiAodmFsID09IGJmaW5fcmVhZF9WUl9DVEwoKSkKKwkJcmV0dXJuOworCisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOworCS8qIEVuYWJsZSB0aGUgUExMIFdha2V1cCBiaXQgaW4gU0lDIElXUiAqLworCWl3cjAgPSBiZmluX3JlYWQzMihTSUNBX0lXUjApOworCWl3cjEgPSBiZmluX3JlYWQzMihTSUNBX0lXUjEpOworCS8qIE9ubHkgYWxsb3cgUFBMIFdha2V1cCkgKi8KKwliZmluX3dyaXRlMzIoU0lDQV9JV1IwLCBJV1JfRU5BQkxFKDApKTsKKwliZmluX3dyaXRlMzIoU0lDQV9JV1IxLCAwKTsKKworCWJmaW5fd3JpdGUxNihWUl9DVEwsIHZhbCk7CisJU1NZTkMoKTsKKwlhc20oIklETEU7Iik7CisKKwliZmluX3dyaXRlMzIoU0lDQV9JV1IwLCBpd3IwKTsKKwliZmluX3dyaXRlMzIoU0lDQV9JV1IxLCBpd3IxKTsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7Cit9CisKICNlbmRpZgkJCQkvKiBfQ0RFRl9CRjU2MV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2RlZkJGNTYxLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2RlZkJGNTYxLmgKaW5kZXggNGVjYTIwMi4uZDdjNTA5NyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9kZWZCRjU2MS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvZGVmQkY1NjEuaApAQCAtOTEyLDYgKzkxMiw5IEBACiAjZGVmaW5lIEFDVElWRV9QTExESVNBQkxFRAkweDAwMDQJLyogUHJvY2Vzc29yIEluIEFjdGl2ZSBNb2RlIFdpdGggUExMIERpc2FibGVkICAgKi8KICNkZWZpbmUJUExMX0xPQ0tFRAkJCTB4MDAyMAkvKiBQTExfTE9DS0NOVCBIYXMgQmVlbiBSZWFjaGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAorLyogU0lDQV9TWVNDUiBNYXNrcyAqLworI2RlZmluZSBDT1JFQl9TUkFNX0lOSVQJCTB4MDAyMAorCiAvKiBTV1JTVCBNYXNrICovCiAjZGVmaW5lIFNZU1RFTV9SRVNFVCAgICAgICAgICAgMHgwMDA3CS8qIEluaXRpYXRlcyBhIHN5c3RlbSBzb2Z0d2FyZSByZXNldCAqLwogI2RlZmluZSBET1VCTEVfRkFVTFRfQSAgICAgICAgIDB4MDAwOAkvKiBDb3JlIEEgRG91YmxlIEZhdWx0IENhdXNlcyBSZXNldCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9kbWEuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvZG1hLmgKaW5kZXggOGJjNDZjZC4uMTM2NDdjNyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9kbWEuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2RtYS5oCkBAIC0xLDEzICsxLDE3IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgIEJGLTUzMy8yLzEgU3BlY2lmaWMgRGVjbGFyYXRpb25zCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogbWFjaC9kbWEuaCAtIGFyY2gtc3BlY2lmaWMgRE1BIGRlZmluZXMKKyAqCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KIAogI2lmbmRlZiBfTUFDSF9ETUFfSF8KICNkZWZpbmUgX01BQ0hfRE1BX0hfCiAKLSNkZWZpbmUgTUFYX0JMQUNLRklOX0RNQV9DSEFOTkVMIDM2CisjZGVmaW5lIE1BWF9ETUFfQ0hBTk5FTFMgMzYKKworLyogWyM0MjY3XSBJTURNQSBjaGFubmVscyBoYXZlIG5vIFBFUklQSEVSQUxfTUFQIE1NUiAqLworI2RlZmluZSBNQVhfRE1BX1NVU1BFTkRfQ0hBTk5FTFMgMzIKIAogI2RlZmluZSBDSF9QUEkwCQkJMAogI2RlZmluZSBDSF9QUEkJCQkoQ0hfUFBJMCkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9ncGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg4MmY3OQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvZ3Bpby5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBGaWxlOiBhcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2dwaW8uaAorICogQnVnczogRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisKKyNpZm5kZWYgX01BQ0hfR1BJT19IXworI2RlZmluZSBfTUFDSF9HUElPX0hfCisKKyNkZWZpbmUgTUFYX0JMQUNLRklOX0dQSU9TIDQ4CisKKyNkZWZpbmUJR1BJT19QRjAJMAorI2RlZmluZQlHUElPX1BGMQkxCisjZGVmaW5lCUdQSU9fUEYyCTIKKyNkZWZpbmUJR1BJT19QRjMJMworI2RlZmluZQlHUElPX1BGNAk0CisjZGVmaW5lCUdQSU9fUEY1CTUKKyNkZWZpbmUJR1BJT19QRjYJNgorI2RlZmluZQlHUElPX1BGNwk3CisjZGVmaW5lCUdQSU9fUEY4CTgKKyNkZWZpbmUJR1BJT19QRjkJOQorI2RlZmluZQlHUElPX1BGMTAJMTAKKyNkZWZpbmUJR1BJT19QRjExCTExCisjZGVmaW5lCUdQSU9fUEYxMgkxMgorI2RlZmluZQlHUElPX1BGMTMJMTMKKyNkZWZpbmUJR1BJT19QRjE0CTE0CisjZGVmaW5lCUdQSU9fUEYxNQkxNQorI2RlZmluZQlHUElPX1BGMTYJMTYKKyNkZWZpbmUJR1BJT19QRjE3CTE3CisjZGVmaW5lCUdQSU9fUEYxOAkxOAorI2RlZmluZQlHUElPX1BGMTkJMTkKKyNkZWZpbmUJR1BJT19QRjIwCTIwCisjZGVmaW5lCUdQSU9fUEYyMQkyMQorI2RlZmluZQlHUElPX1BGMjIJMjIKKyNkZWZpbmUJR1BJT19QRjIzCTIzCisjZGVmaW5lCUdQSU9fUEYyNAkyNAorI2RlZmluZQlHUElPX1BGMjUJMjUKKyNkZWZpbmUJR1BJT19QRjI2CTI2CisjZGVmaW5lCUdQSU9fUEYyNwkyNworI2RlZmluZQlHUElPX1BGMjgJMjgKKyNkZWZpbmUJR1BJT19QRjI5CTI5CisjZGVmaW5lCUdQSU9fUEYzMAkzMAorI2RlZmluZQlHUElPX1BGMzEJMzEKKyNkZWZpbmUJR1BJT19QRjMyCTMyCisjZGVmaW5lCUdQSU9fUEYzMwkzMworI2RlZmluZQlHUElPX1BGMzQJMzQKKyNkZWZpbmUJR1BJT19QRjM1CTM1CisjZGVmaW5lCUdQSU9fUEYzNgkzNgorI2RlZmluZQlHUElPX1BGMzcJMzcKKyNkZWZpbmUJR1BJT19QRjM4CTM4CisjZGVmaW5lCUdQSU9fUEYzOQkzOQorI2RlZmluZQlHUElPX1BGNDAJNDAKKyNkZWZpbmUJR1BJT19QRjQxCTQxCisjZGVmaW5lCUdQSU9fUEY0Mgk0MgorI2RlZmluZQlHUElPX1BGNDMJNDMKKyNkZWZpbmUJR1BJT19QRjQ0CTQ0CisjZGVmaW5lCUdQSU9fUEY0NQk0NQorI2RlZmluZQlHUElPX1BGNDYJNDYKKyNkZWZpbmUJR1BJT19QRjQ3CTQ3CisKKyNkZWZpbmUgUE9SVF9GSU8wIEdQSU9fMAorI2RlZmluZSBQT1JUX0ZJTzEgR1BJT18xNgorI2RlZmluZSBQT1JUX0ZJTzIgR1BJT18zMgorCisjZW5kaWYgLyogX01BQ0hfR1BJT19IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9tZW1faW5pdC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9tZW1faW5pdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTYzMjYwLi4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvbWVtX2luaXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5NSArMCwwIEBACi0vKgotICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTYxL21lbV9pbml0LmgKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOgotICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKLSAqCi0gKiBSZXY6Ci0gKgotICogTW9kaWZpZWQ6Ci0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KLSAqIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0gKi8KLQotI2lmIChDT05GSUdfTUVNX01UNDhMQzE2TTE2QTJUR183NSB8fCBDT05GSUdfTUVNX01UNDhMQzY0TTRBMkZCXzdFIHx8IENPTkZJR19NRU1fR0VORVJJQ19CT0FSRCB8fCBDT05GSUdfTUVNX01UNDhMQzhNMzJCMkI1XzcpCi0jaWYgKENPTkZJR19TQ0xLX0haID4gMTE5NDAyOTg1KQotI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzIKLSNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDIKLSNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfNwotI2RlZmluZSBTRFJBTV90UkFTX251bSAgNwotI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8yCi0jZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgotI2VuZGlmCi0jaWYgKENPTkZJR19TQ0xLX0haID4gMTA0NDc3NjEyKSAmJiAoQ09ORklHX1NDTEtfSFogPD0gMTE5NDAyOTg1KQotI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzIKLSNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDIKLSNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfNgotI2RlZmluZSBTRFJBTV90UkFTX251bSAgNgotI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8yCi0jZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgotI2VuZGlmCi0jaWYgKENPTkZJR19TQ0xLX0haID4gODk1NTIyMzkpICYmIChDT05GSUdfU0NMS19IWiA8PSAxMDQ0Nzc2MTIpCi0jZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMgotI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMgotI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU181Ci0jZGVmaW5lIFNEUkFNX3RSQVNfbnVtICA1Ci0jZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzIKLSNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCi0jZW5kaWYKLSNpZiAoQ09ORklHX1NDTEtfSFogPiA3NDYyNjg2NikgJiYgKENPTkZJR19TQ0xLX0haIDw9IDg5NTUyMjM5KQotI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzIKLSNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDIKLSNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfNAotI2RlZmluZSBTRFJBTV90UkFTX251bSAgNAotI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8yCi0jZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgotI2VuZGlmCi0jaWYgKENPTkZJR19TQ0xLX0haID4gNjY2NjY2NjcpICYmIChDT05GSUdfU0NMS19IWiA8PSA3NDYyNjg2NikKLSNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8yCi0jZGVmaW5lIFNEUkFNX3RSUF9udW0gICAyCi0jZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzMKLSNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDMKLSNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMgotI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKLSNlbmRpZgotI2lmIChDT05GSUdfU0NMS19IWiA+IDU5NzAxNDkzKSAmJiAoQ09ORklHX1NDTEtfSFogPD0gNjY2NjY2NjcpCi0jZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMQotI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMQotI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU180Ci0jZGVmaW5lIFNEUkFNX3RSQVNfbnVtICAzCi0jZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzEKLSNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCi0jZW5kaWYKLSNpZiAoQ09ORklHX1NDTEtfSFogPiA0NDc3NjExOSkgJiYgKENPTkZJR19TQ0xLX0haIDw9IDU5NzAxNDkzKQotI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzEKLSNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDEKLSNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfMwotI2RlZmluZSBTRFJBTV90UkFTX251bSAgMwotI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8xCi0jZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgotI2VuZGlmCi0jaWYgKENPTkZJR19TQ0xLX0haID4gMjk4NTA3NDYpICYmIChDT05GSUdfU0NMS19IWiA8PSA0NDc3NjExOSkKLSNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8xCi0jZGVmaW5lIFNEUkFNX3RSUF9udW0gICAxCi0jZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzIKLSNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDIKLSNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMQotI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKLSNlbmRpZgotI2lmIChDT05GSUdfU0NMS19IWiA8PSAyOTg1MDc0NikKLSNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8xCi0jZGVmaW5lIFNEUkFNX3RSUF9udW0gICAxCi0jZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzEKLSNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDEKLSNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMQotI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiAoQ09ORklHX01FTV9NVDQ4TEMxNk0xNkEyVEdfNzUpCi0gIC8qU0RSQU0gSU5GT1JNQVRJT046ICovCi0jZGVmaW5lIFNEUkFNX1RyZWYgIDY0CQkvKiBSZWZyZXNoIHBlcmlvZCBpbiBtaWxsaXNlY29uZHMgICAqLwotI2RlZmluZSBTRFJBTV9OUkEgICA4MTkyCS8qIE51bWJlciBvZiByb3cgYWRkcmVzc2VzIGluIFNEUkFNICovCi0jZGVmaW5lIFNEUkFNX0NMICAgIENMXzMKLSNlbmRpZgotCi0jaWYgKENPTkZJR19NRU1fTVQ0OExDNjRNNEEyRkJfN0UpCi0gIC8qU0RSQU0gSU5GT1JNQVRJT046ICovCi0jZGVmaW5lIFNEUkFNX1RyZWYgIDY0CQkvKiBSZWZyZXNoIHBlcmlvZCBpbiBtaWxsaXNlY29uZHMgICAqLwotI2RlZmluZSBTRFJBTV9OUkEgICA4MTkyCS8qIE51bWJlciBvZiByb3cgYWRkcmVzc2VzIGluIFNEUkFNICovCi0jZGVmaW5lIFNEUkFNX0NMICAgIENMXzMKLSNlbmRpZgotCi0jaWYgKENPTkZJR19NRU1fTVQ0OExDOE0zMkIyQjVfNykKLSAgLypTRFJBTSBJTkZPUk1BVElPTjogKi8KLSNkZWZpbmUgU0RSQU1fVHJlZiAgNjQJCS8qIFJlZnJlc2ggcGVyaW9kIGluIG1pbGxpc2Vjb25kcyAgICovCi0jZGVmaW5lIFNEUkFNX05SQSAgIDQwOTYJLyogTnVtYmVyIG9mIHJvdyBhZGRyZXNzZXMgaW4gU0RSQU0gKi8KLSNkZWZpbmUgU0RSQU1fQ0wgICAgQ0xfMwotI2VuZGlmCi0KLSNpZiAoQ09ORklHX01FTV9HRU5FUklDX0JPQVJEKQotICAvKlNEUkFNIElORk9STUFUSU9OOiBNb2RpZnkgdGhpcyBmb3IgeW91ciBib2FyZCAqLwotI2RlZmluZSBTRFJBTV9UcmVmICA2NAkJLyogUmVmcmVzaCBwZXJpb2QgaW4gbWlsbGlzZWNvbmRzICAgKi8KLSNkZWZpbmUgU0RSQU1fTlJBICAgODE5MgkvKiBOdW1iZXIgb2Ygcm93IGFkZHJlc3NlcyBpbiBTRFJBTSAqLwotI2RlZmluZSBTRFJBTV9DTCAgICBDTF8zCi0jZW5kaWYKLQotLyogRXF1YXRpb24gZnJvbSBzZWN0aW9uIDE3IChwMTctNDYpIG9mIEJGNTMzIEhSTSAqLwotI2RlZmluZSBtZW1fU0RSUkMgICAgICAgKCgoQ09ORklHX1NDTEtfSFogLyAxMDAwKSAqIFNEUkFNX1RyZWYpIC8gU0RSQU1fTlJBKSAtIChTRFJBTV90UkFTX251bSArIFNEUkFNX3RSUF9udW0pCi0KLS8qIEVuYWJsZSBTQ0xLIE91dCAqLwotI2RlZmluZSBtZW1fU0RHQ1RMICAgICAgICAoU0NUTEUgfCBTRFJBTV9DTCB8IFNEUkFNX3RSQVMgfCBTRFJBTV90UlAgfCBTRFJBTV90UkNEIHwgU0RSQU1fdFdSIHwgUFNTKQotCi0jaWYgZGVmaW5lZCBDT05GSUdfQ0xLSU5fSEFMRgotI2RlZmluZSBDTEtJTl9IQUxGICAgICAgIDEKLSNlbHNlCi0jZGVmaW5lIENMS0lOX0hBTEYgICAgICAgMAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIENPTkZJR19QTExfQllQQVNTCi0jZGVmaW5lIFBMTF9CWVBBU1MgICAgICAxCi0jZWxzZQotI2RlZmluZSBQTExfQllQQVNTICAgICAgIDAKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqQ3VycmVudGx5IE5vdCBCZWluZyBVc2VkICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVExfV0FUICAoKENPTkZJR19GTEFTSF9TUEVFRF9CV0FUICogNCkgLyAoNDAwMDAwMDAwMCAvIENPTkZJR19TQ0xLX0haKSkgKyAxCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCAgKChDT05GSUdfRkxBU0hfU1BFRURfQlJBVCAqIDQpIC8gKDQwMDAwMDAwMDAgLyBDT05GSUdfU0NMS19IWikpICsgMQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTF9IVCAgICgoQ09ORklHX0ZMQVNIX1NQRUVEX0JIVCAgKiA0KSAvICg0MDAwMDAwMDAwIC8gQ09ORklHX1NDTEtfSFopKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTF9TVCAgICgoQ09ORklHX0ZMQVNIX1NQRUVEX0JTVCAgKiA0KSAvICg0MDAwMDAwMDAwIC8gQ09ORklHX1NDTEtfSFopKSArIDEKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVExfVFQgICAoKENPTkZJR19GTEFTSF9TUEVFRF9CVFQgICogNCkgLyAoNDAwMDAwMDAwMCAvIENPTkZJR19TQ0xLX0haKSkgKyAxCi0KLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfVFQgPiAzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfVFQgICBCMFRUXzQKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9UVCA9PSAzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfVFQgICBCMFRUXzMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9UVCA9PSAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfVFQgICBCMFRUXzIKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9UVCA8IDIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9UVCAgIEIwVFRfMQotI2VuZGlmCi0KLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfU1QgPiAzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfU1QgICBCMFNUXzQKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9TVCA9PSAzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfU1QgICBCMFNUXzMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9TVCA9PSAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfU1QgICBCMFNUXzIKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9TVCA8IDIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9TVCAgIEIwU1RfMQotI2VuZGlmCi0KLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfSFQgPiAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfSFQgICBCMEhUXzMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9IVCA9PSAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfSFQgICBCMEhUXzIKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9IVCA9PSAxKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfSFQgICBCMEhUXzEKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9IVCA9PSAwICYmIENPTkZJR19GTEFTSF9TUEVFRF9CSFQgPT0gMCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX0hUICAgQjBIVF8wCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfSFQgPT0gMCAmJiBDT05GSUdfRkxBU0hfU1BFRURfQkhUICE9IDApCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9IVCAgIEIwSFRfMQotI2VuZGlmCi0KLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID4gMTQpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzE1Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDE0KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xNAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAxMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMTMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMTIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzEyCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDExKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xMQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAxMCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMTAKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gOSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfOQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSA4KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF84Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDcpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzcKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gNikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfNgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSA1KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF81Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDQpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzQKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8yCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDEpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzEKLSNlbmRpZgotCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA+IDE0KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xNQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAxNCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMTQKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMTMpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzEzCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDEyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xMgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAxMSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMTEKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMTApCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzEwCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDkpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzkKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gOCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfOAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSA3KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF83Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDYpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzYKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gNSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfNQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSA0KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF80Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDMpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAxKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xCi0jZW5kaWYKLQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDAgIFwKLQkoZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCB8IGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgfCBmbGFzaF9FQklVX0FNQkNUTDBfSFQgfCBcCi0JIGZsYXNoX0VCSVVfQU1CQ1RMMF9TVCB8IGZsYXNoX0VCSVVfQU1CQ1RMMF9UVCB8IENPTkZJR19GTEFTSF9TUEVFRF9SRFlFTikKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvbWVtX21hcC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9tZW1fbWFwLmgKaW5kZXggZjFkNGMwNi4uNDE5ZGZmZCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9tZW1fbWFwLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9tZW1fbWFwLmgKQEAgLTg1LDQgKzg1LDg0IEBACiAjZGVmaW5lIEwxX1NDUkFUQ0hfU1RBUlQJQ09SRUFfTDFfU0NSQVRDSF9TVEFSVAogI2RlZmluZSBMMV9TQ1JBVENIX0xFTkdUSAkweDEwMDAKIAorI2lmZGVmIF9fQVNTRU1CTFlfXworCisvKgorICogVGhlIGZvbGxvd2luZyBtYWNyb3MgYm90aCByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIFBEQSBmb3IgdGhlCisgKiBjdXJyZW50IGNvcmUuCisgKgorICogSW4gaXRzIGZpcnN0IHNhZmUgKGFuZCBoYWlyeSkgZm9ybSwgdGhlIG1hY3JvIG5laXRoZXIgY2xvYmJlcnMgYW55CisgKiByZWdpc3RlciBhc2lkZSBvZiB0aGUgb3V0cHV0IFByZWcsIG5vciB1c2VzIHRoZSBzdGFjaywgc2luY2UgaXQKKyAqIGNvdWxkIGJlIGNhbGxlZCB3aXRoIGFuIGludmFsaWQgc3RhY2sgcG9pbnRlciwgb3IgdGhlIGN1cnJlbnQgc3RhY2sKKyAqIHNwYWNlIGJlaW5nIHVuY292ZXJlZCBieSBhbnkgQ1BMQiAoZS5nLiBlYXJseSBleGNlcHRpb24gaGFuZGxpbmcpLgorICoKKyAqIFRoZSBjb25zdHJhaW50cyBvbiB0aGUgc2Vjb25kIGZvcm0gYXJlIGEgYml0IHJlbGF4ZWQsIGFuZCB0aGUgY29kZQorICogaXMgYWxsb3dlZCB0byB1c2UgdGhlIHNwZWNpZmllZCBEcmVnIGZvciBkZXRlcm1pbmluZyB0aGUgUERBCisgKiBhZGRyZXNzIHRvIGJlIHJldHVybmVkIGludG8gUHJlZy4KKyAqLworI2lmZGVmIENPTkZJR19TTVAKKyNkZWZpbmUgR0VUX1BEQV9TQUZFKHByZWcpCQlcCisJcHJlZy5sID0gbG8oRFNQSUQpOwkJXAorCXByZWcuaCA9IGhpKERTUElEKTsJCVwKKwlwcmVnID0gW3ByZWddOwkJCVwKKwlwcmVnID0gcHJlZyA8PCAyOwkJXAorCXByZWcgPSBwcmVnIDw8IDI7CQlcCisJcHJlZyA9IHByZWcgPDwgMjsJCVwKKwlwcmVnID0gcHJlZyA8PCAyOwkJXAorCXByZWcgPSBwcmVnIDw8IDI7CQlcCisJcHJlZyA9IHByZWcgPDwgMjsJCVwKKwlwcmVnID0gcHJlZyA8PCAyOwkJXAorCXByZWcgPSBwcmVnIDw8IDI7CQlcCisJcHJlZyA9IHByZWcgPDwgMjsJCVwKKwlwcmVnID0gcHJlZyA8PCAyOwkJXAorCXByZWcgPSBwcmVnIDw8IDI7CQlcCisJcHJlZyA9IHByZWcgPDwgMjsJCVwKKwlpZiBjYyBqdW1wIDJmOwkJCVwKKwljYyA9IHByZWcgPT0gMHgwOwkJXAorCXByZWcubCA9IF9jcHVfcGRhOwkJXAorCXByZWcuaCA9IF9jcHVfcGRhOwkJXAorCWlmICFjYyBqdW1wIDNmOwkJCVwKKzE6CQkJCQlcCisJLyogcHJlZyA9IDB4MDsgKi8JCVwKKwljYyA9ICFjYzsgLyogcmVzdG9yZSBjYyB0byAwICovCVwKKwlqdW1wIDRmOwkJCVwKKzI6CQkJCQlcCisJY2MgPSBwcmVnID09IDB4MDsJCVwKKwlwcmVnLmwgPSBfY3B1X3BkYTsJCVwKKwlwcmVnLmggPSBfY3B1X3BkYTsJCVwKKwlpZiBjYyBqdW1wIDRmOwkJCVwKKwkvKiBwcmVnID0gMHgxMDAwMDAwOyAqLwkJXAorCWNjID0gIWNjOyAvKiByZXN0b3JlIGNjIHRvIDEgKi8JXAorMzoJCQkJCVwKKwlwcmVnID0gW3ByZWddOwkJCVwKKzQ6CisKKyNkZWZpbmUgR0VUX1BEQShwcmVnLCBkcmVnKQkJXAorCXByZWcubCA9IGxvKERTUElEKTsJCVwKKwlwcmVnLmggPSBoaShEU1BJRCk7CQlcCisJZHJlZyA9IFtwcmVnXTsJCQlcCisJcHJlZy5sID0gX2NwdV9wZGE7CQlcCisJcHJlZy5oID0gX2NwdV9wZGE7CQlcCisJY2MgPSBiaXR0c3QoZHJlZywgMCk7CQlcCisJaWYgIWNjIGp1bXAgMWY7CQkJXAorCXByZWcgPSBbcHJlZ107CQkJXAorMToJCQkJCVwKKworI2RlZmluZSBHRVRfQ1BVSUQocHJlZywgZHJlZykJCVwKKwlwcmVnLmwgPSBsbyhEU1BJRCk7CQlcCisJcHJlZy5oID0gaGkoRFNQSUQpOwkJXAorCWRyZWcgPSBbcHJlZ107CQkJXAorCWRyZWcgPSBST1QgZHJlZyBCWSAtMTsJCVwKKwlkcmVnID0gQ0M7CisKKyNlbHNlCisjZGVmaW5lIEdFVF9QREFfU0FGRShwcmVnKQkJXAorCXByZWcubCA9IF9jcHVfcGRhOwkJXAorCXByZWcuaCA9IF9jcHVfcGRhOworCisjZGVmaW5lIEdFVF9QREEocHJlZywgZHJlZykJR0VUX1BEQV9TQUZFKHByZWcpCisjZW5kaWYgLyogQ09ORklHX1NNUCAqLworCisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisKICNlbmRpZgkJCQkvKiBfTUVNX01BUF81MzNfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvc21wLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL3NtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZTY1ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL3NtcC5oCkBAIC0wLDAgKzEsMjIgQEAKKyNpZm5kZWYgX01BQ0hfQkY1NjFfU01QCisjZGVmaW5lIF9NQUNIX0JGNTYxX1NNUAorCitzdHJ1Y3QgdGFza19zdHJ1Y3Q7CisKK3ZvaWQgcGxhdGZvcm1faW5pdF9jcHVzKHZvaWQpOworCit2b2lkIHBsYXRmb3JtX3ByZXBhcmVfY3B1cyh1bnNpZ25lZCBpbnQgbWF4X2NwdXMpOworCitpbnQgcGxhdGZvcm1fYm9vdF9zZWNvbmRhcnkodW5zaWduZWQgaW50IGNwdSwgc3RydWN0IHRhc2tfc3RydWN0ICppZGxlKTsKKwordm9pZCBwbGF0Zm9ybV9zZWNvbmRhcnlfaW5pdCh1bnNpZ25lZCBpbnQgY3B1KTsKKwordm9pZCBwbGF0Zm9ybV9yZXF1ZXN0X2lwaShpbnQgKCpoYW5kbGVyKShpbnQsIHZvaWQgKikpOworCit2b2lkIHBsYXRmb3JtX3NlbmRfaXBpKGNwdW1hc2tfdCBjYWxsbWFwKTsKKwordm9pZCBwbGF0Zm9ybV9zZW5kX2lwaV9jcHUodW5zaWduZWQgaW50IGNwdSk7CisKK3ZvaWQgcGxhdGZvcm1fY2xlYXJfaXBpKHVuc2lnbmVkIGludCBjcHUpOworCisjZW5kaWYgLyogIV9NQUNIX0JGNTYxX1NNUCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL3NlY29uZGFyeS5TIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL3NlY29uZGFyeS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MjgwZjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvc2Vjb25kYXJ5LlMKQEAgLTAsMCArMSwyMTUgQEAKKy8qCisgKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9zZWNvbmRhcnkuUworICogQmFzZWQgb246ICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaGVhZC5TCisgKiBBdXRob3I6ICAgICAgIFBoaWxpcHBlIEdlcnVtIDxycG1AeGVub21haS5vcmc+CisgKgorICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNyBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogRGVzY3JpcHRpb246ICBCRjU2MSBjb3JlQiBib290c3RyYXAgZmlsZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCisgKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KKworX19JTklUCisKKy8qIExheSB0aGUgaW5pdGlhbCBzdGFjayBpbnRvIHRoZSBMMSBzY3JhdGNoIGFyZWEgb2YgQ29yZSBCICovCisjZGVmaW5lIElOSVRJQUxfU1RBQ0sJKENPUkVCX0wxX1NDUkFUQ0hfU1RBUlQgKyBMMV9TQ1JBVENIX0xFTkdUSCAtIDEyKQorCitFTlRSWShfY29yZWJfdHJhbXBvbGluZV9zdGFydCkKKwkvKiBTZXQgdGhlIFNZU0NGRyByZWdpc3RlciAqLworCVIwID0gMHgzNjsKKwlTWVNDRkcgPSBSMDsgLypFbmFibGUgQ3ljbGUgQ291bnRlciBhbmQgTmVzdGluZyBPZiBJbnRlcnJ1cHRzKDNyZCBCaXQpKi8KKwlSMCA9IDA7CisKKwkvKkNsZWFyIE91dCBBbGwgdGhlIGRhdGEgYW5kIHBvaW50ZXIgIFJlZ2lzdGVycyovCisJUjEgPSBSMDsKKwlSMiA9IFIwOworCVIzID0gUjA7CisJUjQgPSBSMDsKKwlSNSA9IFIwOworCVI2ID0gUjA7CisJUjcgPSBSMDsKKworCVAwID0gUjA7CisJUDEgPSBSMDsKKwlQMiA9IFIwOworCVAzID0gUjA7CisJUDQgPSBSMDsKKwlQNSA9IFIwOworCisJTEMwID0gcjA7CisJTEMxID0gcjA7CisJTDAgPSByMDsKKwlMMSA9IHIwOworCUwyID0gcjA7CisJTDMgPSByMDsKKworCS8qIENsZWFyIE91dCBBbGwgdGhlIERBRyBSZWdpc3RlcnMqLworCUIwID0gcjA7CisJQjEgPSByMDsKKwlCMiA9IHIwOworCUIzID0gcjA7CisKKwlJMCA9IHIwOworCUkxID0gcjA7CisJSTIgPSByMDsKKwlJMyA9IHIwOworCisJTTAgPSByMDsKKwlNMSA9IHIwOworCU0yID0gcjA7CisJTTMgPSByMDsKKworCS8qIFR1cm4gb2ZmIHRoZSBpY2FjaGUgKi8KKwlwMC5sID0gTE8oSU1FTV9DT05UUk9MKTsKKwlwMC5oID0gSEkoSU1FTV9DT05UUk9MKTsKKwlSMSA9IFtwMF07CisJUjAgPSB+RU5JQ1BMQjsKKwlSMCA9IFIwICYgUjE7CisKKwkvKiBBbm9tYWx5IDA1MDAwMTI1ICovCisjaWZkZWYgQU5PTUFMWV8wNTAwMDEyNQorCUNMSSBSMjsKKwlTU1lOQzsKKyNlbmRpZgorCVtwMF0gPSBSMDsKKwlTU1lOQzsKKyNpZmRlZiBBTk9NQUxZXzA1MDAwMTI1CisJU1RJIFIyOworI2VuZGlmCisKKwkvKiBUdXJuIG9mZiB0aGUgZGNhY2hlICovCisJcDAubCA9IExPKERNRU1fQ09OVFJPTCk7CisJcDAuaCA9IEhJKERNRU1fQ09OVFJPTCk7CisJUjEgPSBbcDBdOworCVIwID0gfkVORENQTEI7CisJUjAgPSBSMCAmIFIxOworCisJLyogQW5vbWFseSAwNTAwMDEyNSAqLworI2lmZGVmIEFOT01BTFlfMDUwMDAxMjUKKwlDTEkgUjI7CisJU1NZTkM7CisjZW5kaWYKKwlbcDBdID0gUjA7CisJU1NZTkM7CisjaWZkZWYgQU5PTUFMWV8wNTAwMDEyNQorCVNUSSBSMjsKKyNlbmRpZgorCisJLyogaW4gY2FzZSBvZiBkb3VibGUgZmF1bHRzLCBzYXZlIGEgZmV3IHRoaW5ncyAqLworCXAwLmwgPSBfaW5pdF9yZXR4X2NvcmViOworCXAwLmggPSBfaW5pdF9yZXR4X2NvcmViOworCVIwID0gUkVUWDsKKwlbUDBdID0gUjA7CisKKyNpZmRlZiBDT05GSUdfREVCVUdfRE9VQkxFRkFVTFQKKwkvKiBPbmx5IHNhdmUgdGhlc2UgaWYgd2UgYXJlIHN0b3JpbmcgdGhlbSwKKwkgKiBUaGlzIGhhcHBlbnMgaGVyZSwgc2luY2UgTDEgZ2V0cyBjbG9iYmVyZWQKKwkgKiBiZWxvdworCSAqLworCUdFVF9QREEocDAsIHIwKTsKKwlyNyA9IFtwMCArIFBEQV9SRVRYXTsKKwlwMS5sID0gX2luaXRfc2F2ZWRfcmV0eF9jb3JlYjsKKwlwMS5oID0gX2luaXRfc2F2ZWRfcmV0eF9jb3JlYjsKKwlbcDFdID0gcjc7CisKKwlyNyA9IFtwMCArIFBEQV9EQ1BMQl07CisJcDEubCA9IF9pbml0X3NhdmVkX2RjcGxiX2ZhdWx0X2FkZHJfY29yZWI7CisJcDEuaCA9IF9pbml0X3NhdmVkX2RjcGxiX2ZhdWx0X2FkZHJfY29yZWI7CisJW3AxXSA9IHI3OworCisJcjcgPSBbcDAgKyBQREFfSUNQTEJdOworCXAxLmwgPSBfaW5pdF9zYXZlZF9pY3BsYl9mYXVsdF9hZGRyX2NvcmViOworCXAxLmggPSBfaW5pdF9zYXZlZF9pY3BsYl9mYXVsdF9hZGRyX2NvcmViOworCVtwMV0gPSByNzsKKworCXI3ID0gW3AwICsgUERBX1NFUVNUQVRdOworCXAxLmwgPSBfaW5pdF9zYXZlZF9zZXFzdGF0X2NvcmViOworCXAxLmggPSBfaW5pdF9zYXZlZF9zZXFzdGF0X2NvcmViOworCVtwMV0gPSByNzsKKyNlbmRpZgorCisJLyogSW5pdGlhbGl6ZSBzdGFjayBwb2ludGVyICovCisJc3AubCA9IGxvKElOSVRJQUxfU1RBQ0spOworCXNwLmggPSBoaShJTklUSUFMX1NUQUNLKTsKKwlmcCA9IHNwOworCXVzcCA9IHNwOworCisJLyogVGhpcyBzZWN0aW9uIGtlZXBzIHRoZSBwcm9jZXNzb3IgaW4gc3VwZXJ2aXNvciBtb2RlCisJICogZHVyaW5nIGNvcmUgQiBzdGFydHVwLiAgQnJhbmNoZXMgdG8gdGhlIGlkbGUgdGFzay4KKwkgKi8KKworCS8qIEVWVDE1ID0gX3JlYWxfc3RhcnQgKi8KKworCXAwLmwgPSBsbyhFVlQxNSk7CisJcDAuaCA9IGhpKEVWVDE1KTsKKwlwMS5sID0gX2NvcmViX3N0YXJ0OworCXAxLmggPSBfY29yZWJfc3RhcnQ7CisJW3AwXSA9IHAxOworCWNzeW5jOworCisJcDAubCA9IGxvKElNQVNLKTsKKwlwMC5oID0gaGkoSU1BU0spOworCXAxLmwgPSBJTUFTS19JVkcxNTsKKwlwMS5oID0gMHgwOworCVtwMF0gPSBwMTsKKwljc3luYzsKKworCXJhaXNlIDE1OworCXAwLmwgPSAuTFdBSVRfSEVSRTsKKwlwMC5oID0gLkxXQUlUX0hFUkU7CisJcmV0aSA9IHAwOworI2lmIGRlZmluZWQoQU5PTUFMWV8wNTAwMDI4MSkKKwlub3A7IG5vcDsgbm9wOworI2VuZGlmCisJcnRpOworCisuTFdBSVRfSEVSRToKKwlqdW1wIC5MV0FJVF9IRVJFOworRU5EUFJPQyhfY29yZWJfdHJhbXBvbGluZV9zdGFydCkKK0VOVFJZKF9jb3JlYl90cmFtcG9saW5lX2VuZCkKKworRU5UUlkoX2NvcmViX3N0YXJ0KQorCVstLXNwXSA9IHJldGk7CisKKwlwMC5sID0gbG8oV0RPR0JfQ1RMKTsKKwlwMC5oID0gaGkoV0RPR0JfQ1RMKTsKKwlyMCA9IDB4QUQ2KHopOworCXdbcDBdID0gcjA7CS8qIENsZWFyIHRoZSB3YXRjaGRvZy4gKi8KKwlzc3luYzsKKworCS8qCisJICogc3dpdGNoIHRvIElETEUgc3RhY2suCisJICovCisJcDAubCA9IF9zZWNvbmRhcnlfc3RhY2s7CisJcDAuaCA9IF9zZWNvbmRhcnlfc3RhY2s7CisJc3AgPSBbcDBdOworCXVzcCA9IHNwOworCWZwID0gc3A7CisJc3AgKz0gLTEyOworCWNhbGwgX2luaXRfcGRhCisJc3AgKz0gMTI7CisJY2FsbCBfc2Vjb25kYXJ5X3N0YXJ0X2tlcm5lbDsKKy5MX2V4aXQ6CisJanVtcC5zCS5MX2V4aXQ7CitFTkRQUk9DKF9jb3JlYl9zdGFydCkKKworX19GSU5JVApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL3NtcC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL3NtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMjdlNjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvc21wLmMKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9zbXAuYworICogQXV0aG9yOiAgICAgICBQaGlsaXBwZSBHZXJ1bSA8cnBtQHhlbm9tYWkub3JnPgorICoKKyAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDcgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCisgKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vc21wLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGJvb3RfbG9jayk7CisKK3N0YXRpYyBjcHVtYXNrX3QgY3B1X2NhbGxpbl9tYXA7CisKKy8qCisgKiBwbGF0Zm9ybV9pbml0X2NwdXMoKSAtIFRlbGwgdGhlIHdvcmxkIGFib3V0IGhvdyBtYW55IGNvcmVzIHdlCisgKiBoYXZlLiBUaGlzIGlzIGNhbGxlZCB3aGlsZSBzZXR0aW5nIHVwIHRoZSBhcmNoaXRlY3R1cmUgc3VwcG9ydAorICogKHNldHVwX2FyY2goKSksIHNvIGRvbid0IGJlIHRvbyBkZW1hbmRpbmcgaGVyZSB3aXRoIHJlc3BlY3QgdG8KKyAqIGF2YWlsYWJsZSBrZXJuZWwgc2VydmljZXMuCisgKi8KKwordm9pZCBfX2luaXQgcGxhdGZvcm1faW5pdF9jcHVzKHZvaWQpCit7CisJY3B1X3NldCgwLCBjcHVfcG9zc2libGVfbWFwKTsgLyogQ29yZUEgKi8KKwljcHVfc2V0KDEsIGNwdV9wb3NzaWJsZV9tYXApOyAvKiBDb3JlQiAqLworfQorCit2b2lkIF9faW5pdCBwbGF0Zm9ybV9wcmVwYXJlX2NwdXModW5zaWduZWQgaW50IG1heF9jcHVzKQoreworCWludCBsZW47CisKKwlsZW4gPSAmY29yZWJfdHJhbXBvbGluZV9lbmQgLSAmY29yZWJfdHJhbXBvbGluZV9zdGFydCArIDE7CisJQlVHX09OKGxlbiA+IEwxX0NPREVfTEVOR1RIKTsKKworCWRtYV9tZW1jcHkoKHZvaWQgKilDT1JFQl9MMV9DT0RFX1NUQVJULCAmY29yZWJfdHJhbXBvbGluZV9zdGFydCwgbGVuKTsKKworCS8qIEJvdGggY29yZXMgb3VnaHQgdG8gYmUgcHJlc2VudCBvbiBhIGJmNTYxISAqLworCWNwdV9zZXQoMCwgY3B1X3ByZXNlbnRfbWFwKTsgLyogQ29yZUEgKi8KKwljcHVfc2V0KDEsIGNwdV9wcmVzZW50X21hcCk7IC8qIENvcmVCICovCisKKwlwcmludGsoS0VSTl9JTkZPICJDb3JlQiBib290c3RyYXAgY29kZSB0byBTUkFNICVwIHZpYSBETUEuXG4iLCAodm9pZCAqKUNPUkVCX0wxX0NPREVfU1RBUlQpOworfQorCitpbnQgX19pbml0IHNldHVwX3Byb2ZpbGluZ190aW1lcih1bnNpZ25lZCBpbnQgbXVsdGlwbGllcikgLyogbm90IHN1cHBvcnRlZCAqLworeworCXJldHVybiAtRUlOVkFMOworfQorCit2b2lkIF9fY3B1aW5pdCBwbGF0Zm9ybV9zZWNvbmRhcnlfaW5pdCh1bnNpZ25lZCBpbnQgY3B1KQoreworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisKKwkvKiBDbG9uZSBzZXR1cCBmb3IgcGVyaXBoZXJhbCBpbnRlcnJ1cHQgc291cmNlcyBmcm9tIENvcmVBLiAqLworCWJmaW5fd3JpdGVfU0lDQl9JTUFTSzAoYmZpbl9yZWFkX1NJQ0FfSU1BU0swKCkpOworCWJmaW5fd3JpdGVfU0lDQl9JTUFTSzEoYmZpbl9yZWFkX1NJQ0FfSU1BU0sxKCkpOworCVNTWU5DKCk7CisKKwkvKiBDbG9uZSBzZXR1cCBmb3IgSUFScyBmcm9tIENvcmVBLiAqLworCWJmaW5fd3JpdGVfU0lDQl9JQVIwKGJmaW5fcmVhZF9TSUNBX0lBUjAoKSk7CisJYmZpbl93cml0ZV9TSUNCX0lBUjEoYmZpbl9yZWFkX1NJQ0FfSUFSMSgpKTsKKwliZmluX3dyaXRlX1NJQ0JfSUFSMihiZmluX3JlYWRfU0lDQV9JQVIyKCkpOworCWJmaW5fd3JpdGVfU0lDQl9JQVIzKGJmaW5fcmVhZF9TSUNBX0lBUjMoKSk7CisJYmZpbl93cml0ZV9TSUNCX0lBUjQoYmZpbl9yZWFkX1NJQ0FfSUFSNCgpKTsKKwliZmluX3dyaXRlX1NJQ0JfSUFSNShiZmluX3JlYWRfU0lDQV9JQVI1KCkpOworCWJmaW5fd3JpdGVfU0lDQl9JQVI2KGJmaW5fcmVhZF9TSUNBX0lBUjYoKSk7CisJYmZpbl93cml0ZV9TSUNCX0lBUjcoYmZpbl9yZWFkX1NJQ0FfSUFSNygpKTsKKwlTU1lOQygpOworCisJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJLyogQ2FsaWJyYXRlIGxvb3BzIHBlciBqaWZmeSB2YWx1ZS4gKi8KKwljYWxpYnJhdGVfZGVsYXkoKTsKKworCS8qIFN0b3JlIENQVS1wcml2YXRlIGluZm9ybWF0aW9uIHRvIHRoZSBjcHVfZGF0YSBhcnJheS4gKi8KKwliZmluX3NldHVwX2NwdWRhdGEoY3B1KTsKKworCS8qIFdlIGFyZSBkb25lIHdpdGggbG9jYWwgQ1BVIGluaXRzLCB1bmJsb2NrIHRoZSBib290IENQVS4gKi8KKwljcHVfc2V0KGNwdSwgY3B1X2NhbGxpbl9tYXApOworCXNwaW5fbG9jaygmYm9vdF9sb2NrKTsKKwlzcGluX3VubG9jaygmYm9vdF9sb2NrKTsKK30KKworaW50IF9fY3B1aW5pdCBwbGF0Zm9ybV9ib290X3NlY29uZGFyeSh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGUpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJLyogQ29yZUIgYWxyZWFkeSBydW5uaW5nPyEgKi8KKwlCVUdfT04oKGJmaW5fcmVhZF9TSUNBX1NZU0NSKCkgJiBDT1JFQl9TUkFNX0lOSVQpID09IDApOworCisJcHJpbnRrKEtFUk5fSU5GTyAiQm9vdGluZyBDb3JlIEIuXG4iKTsKKworCXNwaW5fbG9jaygmYm9vdF9sb2NrKTsKKworCS8qIEtpY2sgQ29yZUIsIHdoaWNoIHNob3VsZCBzdGFydCBleGVjdXRpb24gZnJvbSBDT1JFX1NSQU1fQkFTRS4gKi8KKwlTU1lOQygpOworCWJmaW5fd3JpdGVfU0lDQV9TWVNDUihiZmluX3JlYWRfU0lDQV9TWVNDUigpICYgfkNPUkVCX1NSQU1fSU5JVCk7CisJU1NZTkMoKTsKKworCXRpbWVvdXQgPSBqaWZmaWVzICsgMSAqIEhaOworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQlpZiAoY3B1X2lzc2V0KGNwdSwgY3B1X2NhbGxpbl9tYXApKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMDApOworCQliYXJyaWVyKCk7CisJfQorCisJc3Bpbl91bmxvY2soJmJvb3RfbG9jayk7CisKKwlyZXR1cm4gY3B1X2lzc2V0KGNwdSwgY3B1X2NhbGxpbl9tYXApID8gMCA6IC1FTk9TWVM7Cit9CisKK3ZvaWQgX19pbml0IHBsYXRmb3JtX3JlcXVlc3RfaXBpKGlycV9oYW5kbGVyX3QgaGFuZGxlcikKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gcmVxdWVzdF9pcnEoSVJRX1NVUFBMRV8wLCBoYW5kbGVyLCBJUlFGX0RJU0FCTEVELAorCQkJICAiU01QIGludGVycnVwdCIsIGhhbmRsZXIpOworCWlmIChyZXQpCisJCXBhbmljKCJDYW5ub3QgcmVxdWVzdCBzdXBwbGVtZW50YWwgaW50ZXJydXB0IDAgZm9yIElQSSBzZXJ2aWNlXG4iKTsKK30KKwordm9pZCBwbGF0Zm9ybV9zZW5kX2lwaShjcHVtYXNrX3QgY2FsbG1hcCkKK3sKKwl1bnNpZ25lZCBpbnQgY3B1OworCisJZm9yX2VhY2hfY3B1X21hc2soY3B1LCBjYWxsbWFwKSB7CisJCUJVR19PTihjcHUgPj0gMik7CisJCVNTWU5DKCk7CisJCWJmaW5fd3JpdGVfU0lDQl9TWVNDUihiZmluX3JlYWRfU0lDQl9TWVNDUigpIHwgKDEgPDwgKDYgKyBjcHUpKSk7CisJCVNTWU5DKCk7CisJfQorfQorCit2b2lkIHBsYXRmb3JtX3NlbmRfaXBpX2NwdSh1bnNpZ25lZCBpbnQgY3B1KQoreworCUJVR19PTihjcHUgPj0gMik7CisJU1NZTkMoKTsKKwliZmluX3dyaXRlX1NJQ0JfU1lTQ1IoYmZpbl9yZWFkX1NJQ0JfU1lTQ1IoKSB8ICgxIDw8ICg2ICsgY3B1KSkpOworCVNTWU5DKCk7Cit9CisKK3ZvaWQgcGxhdGZvcm1fY2xlYXJfaXBpKHVuc2lnbmVkIGludCBjcHUpCit7CisJQlVHX09OKGNwdSA+PSAyKTsKKwlTU1lOQygpOworCWJmaW5fd3JpdGVfU0lDQl9TWVNDUihiZmluX3JlYWRfU0lDQl9TWVNDUigpIHwgKDEgPDwgKDEwICsgY3B1KSkpOworCVNTWU5DKCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL01ha2VmaWxlIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9NYWtlZmlsZQppbmRleCBlNmVkNTdjLi4xZjMyMjhlIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL01ha2VmaWxlCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vTWFrZWZpbGUKQEAgLTMsMTAgKzMsMTIgQEAKICMKIAogb2JqLXkgOj0gXAotCWNhY2hlLm8gZW50cnkubyBoZWFkLm8gXAorCWNhY2hlLm8gY2FjaGUtYy5vIGVudHJ5Lm8gaGVhZC5vIFwKIAlpbnRlcnJ1cHQubyBpcnFwYW5pYy5vIGFyY2hfY2hlY2tzLm8gaW50cy1wcmlvcml0eS5vCiAKIG9iai0kKENPTkZJR19CRklOX0lDQUNIRV9MT0NLKSArPSBsb2NrLm8KIG9iai0kKENPTkZJR19QTSkgICAgICAgICAgKz0gcG0ubyBkcG1jX21vZGVzLm8KIG9iai0kKENPTkZJR19DUFVfRlJFUSkgICAgKz0gY3B1ZnJlcS5vCiBvYmotJChDT05GSUdfQ1BVX1ZPTFRBR0UpICs9IGRwbWMubworb2JqLSQoQ09ORklHX1NNUCkgICAgICAgICArPSBzbXAubworb2JqLSQoQ09ORklHX0JGSU5fS0VSTkVMX0NMT0NLKSArPSBjbG9ja3MtaW5pdC5vCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2NhY2hlLWMuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vY2FjaGUtYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YWIxZjgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2NhY2hlLWMuYwpAQCAtMCwwICsxLDI0IEBACisvKgorICogQmxhY2tmaW4gY2FjaGUgY29udHJvbCBjb2RlIChzaW1wbGVyIGNvbnRyb2wtc3R5bGUgZnVuY3Rpb25zKQorICoKKyAqIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CisKKy8qIEludmFsaWRhdGUgdGhlIEVudGlyZSBEYXRhIGNhY2hlIGJ5CisgKiBjbGVhcmluZyBETUNbMTowXSBiaXRzCisgKi8KK3ZvaWQgYmxhY2tmaW5faW52YWxpZGF0ZV9lbnRpcmVfZGNhY2hlKHZvaWQpCit7CisJdTMyIGRtZW0gPSBiZmluX3JlYWRfRE1FTV9DT05UUk9MKCk7CisJU1NZTkMoKTsKKwliZmluX3dyaXRlX0RNRU1fQ09OVFJPTChkbWVtICYgfjB4Yyk7CisJU1NZTkMoKTsKKwliZmluX3dyaXRlX0RNRU1fQ09OVFJPTChkbWVtKTsKKwlTU1lOQygpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jYWNoZS5TIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jYWNoZS5TCmluZGV4IGEwMjhlOTQuLjNjOThkYWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vY2FjaGUuUworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2NhY2hlLlMKQEAgLTQ5LDEzICs0OSwxNyBAQAogLmlmbmIgXG9wdGZsdXNoaW5zCiAJXG9wdGZsdXNoaW5zIFtQMF07CiAuZW5kaWYKKyNpZiBBTk9NQUxZXzA1MDAwNDQzCiAuaWZiIFxvcHRub3BpbnMKIDI6CiAuZW5kaWYKIAlcZmx1c2hpbnMgW1AwKytdOwogLmlmbmIgXG9wdG5vcGlucwotMjogXG9wdG5vcGluczsKKzI6CVxvcHRub3BpbnM7CiAuZW5kaWYKKyNlbHNlCisyOglcZmx1c2hpbnMgW1AwKytdOworI2VuZGlmCiAKIAlSVFM7CiAuZW5kbQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jbG9ja3MtaW5pdC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jbG9ja3MtaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMTgyYWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2Nsb2Nrcy1pbml0LmMKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIGFyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vY2xvY2tzLWluaXQuYyAtIHJlcHJvZ3JhbSBjbG9ja3MgLyBtZW1vcnkKKyAqCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CisKKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2Nsb2Nrcy5oPgorI2luY2x1ZGUgPGFzbS9tZW1faW5pdC5oPgorCisjZGVmaW5lIFBMTF9DVExfVkFMIFwKKwkoKChDT05GSUdfVkNPX01VTFQgJiA2MykgPDwgOSkgfCBDTEtJTl9IQUxGIHwgXAorCSAoUExMX0JZUEFTUyA8PCA4KSB8IChBTk9NQUxZXzA1MDAwMjY1ID8gMHg4MDAwIDogMCkpCisKK19fYXR0cmlidXRlX18oKGwxX3RleHQpKQorc3RhdGljIHZvaWQgZG9fc3luYyh2b2lkKQoreworCV9fYnVpbHRpbl9iZmluX3NzeW5jKCk7Cit9CisKK19fYXR0cmlidXRlX18oKGwxX3RleHQpKQordm9pZCBpbml0X2Nsb2Nrcyh2b2lkKQoreworCS8qIEtpbGwgYW55IGFjdGl2ZSBETUFzIGFzIHRoZXkgbWF5IHRyaWdnZXIgZXh0ZXJuYWwgbWVtb3J5IGFjY2Vzc2VzCisJICogaW4gdGhlIG1pZGRsZSBvZiByZXByb2dyYW1taW5nIHRoaW5ncywgYW5kIHRoYXQnbGwgc2NyZXcgdXMgdXAuCisJICogRm9yIGV4YW1wbGUsIGFueSBhdXRvbWF0aWMgRE1BcyBsZWZ0IGJ5IFUtQm9vdCBmb3Igc3BsYXNoIHNjcmVlbnMuCisJICovCisJc2l6ZV90IGk7CisJZm9yIChpID0gMDsgaSA8IE1BWF9ETUFfQ0hBTk5FTFM7ICsraSkgeworCQlzdHJ1Y3QgZG1hX3JlZ2lzdGVyICpkbWEgPSBkbWFfaW9fYmFzZV9hZGRyW2ldOworCQlkbWEtPmNmZyA9IDA7CisJfQorCisJZG9fc3luYygpOworCisjaWZkZWYgU0lDX0lXUjAKKwliZmluX3dyaXRlX1NJQ19JV1IwKElXUl9FTkFCTEUoMCkpOworIyBpZmRlZiBTSUNfSVdSMQorCS8qIEJGNTJ4IHN5c3RlbSByZXNldCBkb2VzIG5vdCBwcm9wZXJseSByZXNldCBTSUNfSVdSMSB3aGljaAorCSAqIHdpbGwgc2NyZXcgdXAgdGhlIGJvb3Ryb20gYXMgaXQgcmVsaWVzIG9uIE1ETUEwLzEgd2FraW5nIGl0CisJICogdXAgZnJvbSBJRExFIGluc3RydWN0aW9ucy4gIFNlZSB0aGlzIHJlcG9ydCBmb3IgbW9yZSBpbmZvOgorCSAqIGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy9nZi90cmFja2VyLzQzMjMKKwkgKi8KKwlpZiAoQU5PTUFMWV8wNTAwMDQzNSkKKwkJYmZpbl93cml0ZV9TSUNfSVdSMShJV1JfRU5BQkxFKDEwKSB8IElXUl9FTkFCTEUoMTEpKTsKKwllbHNlCisJCWJmaW5fd3JpdGVfU0lDX0lXUjEoSVdSX0RJU0FCTEVfQUxMKTsKKyMgZW5kaWYKKyMgaWZkZWYgU0lDX0lXUjIKKwliZmluX3dyaXRlX1NJQ19JV1IyKElXUl9ESVNBQkxFX0FMTCk7CisjIGVuZGlmCisjZWxzZQorCWJmaW5fd3JpdGVfU0lDX0lXUihJV1JfRU5BQkxFKDApKTsKKyNlbmRpZgorCWRvX3N5bmMoKTsKKyNpZmRlZiBFQklVX1NER0NUTAorCWJmaW5fd3JpdGVfRUJJVV9TREdDVEwoYmZpbl9yZWFkX0VCSVVfU0RHQ1RMKCkgfCBTUkZTKTsKKwlkb19zeW5jKCk7CisjZW5kaWYKKworI2lmZGVmIENMS0JVRk9FCisJYmZpbl93cml0ZTE2KFZSX0NUTCwgYmZpbl9yZWFkX1ZSX0NUTCgpIHwgQ0xLQlVGT0UpOworCWRvX3N5bmMoKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygiSURMRTsiKTsKKyNlbmRpZgorCWJmaW5fd3JpdGVfUExMX0xPQ0tDTlQoMHgzMDApOworCWRvX3N5bmMoKTsKKwliZmluX3dyaXRlMTYoUExMX0NUTCwgUExMX0NUTF9WQUwpOworCV9fYXNtX18gX192b2xhdGlsZV9fKCJJRExFOyIpOworCWJmaW5fd3JpdGVfUExMX0RJVihDT05GSUdfQ0NMS19BQ1RfRElWIHwgQ09ORklHX1NDTEtfRElWKTsKKyNpZmRlZiBFQklVX1NER0NUTAorCWJmaW5fd3JpdGVfRUJJVV9TRFJSQyhtZW1fU0RSUkMpOworCWJmaW5fd3JpdGVfRUJJVV9TREdDVEwobWVtX1NER0NUTCk7CisjZWxzZQorCWJmaW5fd3JpdGVfRUJJVV9SU1RDVEwoYmZpbl9yZWFkX0VCSVVfUlNUQ1RMKCkgJiB+KFNSUkVRKSk7CisJZG9fc3luYygpOworCWJmaW5fd3JpdGVfRUJJVV9SU1RDVEwoYmZpbl9yZWFkX0VCSVVfUlNUQ1RMKCkgfCAweDEpOworCWJmaW5fd3JpdGVfRUJJVV9ERFJDVEwwKG1lbV9ERFJDVEwwKTsKKwliZmluX3dyaXRlX0VCSVVfRERSQ1RMMShtZW1fRERSQ1RMMSk7CisJYmZpbl93cml0ZV9FQklVX0REUkNUTDIobWVtX0REUkNUTDIpOworI2lmZGVmIENPTkZJR19NRU1fRUJJVV9ERFJRVUUKKwliZmluX3dyaXRlX0VCSVVfRERSUVVFKENPTkZJR19NRU1fRUJJVV9ERFJRVUUpOworI2VuZGlmCisjZW5kaWYKKwlkb19zeW5jKCk7CisJYmZpbl9yZWFkMTYoMCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2NwdWZyZXEuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vY3B1ZnJlcS5jCmluZGV4IGRkYTU0NDMuLjcyZTE2NjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vY3B1ZnJlcS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vY3B1ZnJlcS5jCkBAIC0xMDQsNyArMTA0LDcgQEAKIAkJIGNjbGtfaHosIHRhcmdldF9mcmVxLCBmcmVxcy5vbGQpOwogCiAJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUFJFQ0hBTkdFKTsKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOwogCQlwbGxkaXYgPSAoYmZpbl9yZWFkX1BMTF9ESVYoKSAmIFNTRUwpIHwgZHBtX3N0YXRlX3RhYmxlW2luZGV4XS5jc2VsOwogCQl0c2NhbGUgPSBkcG1fc3RhdGVfdGFibGVbaW5kZXhdLnRzY2FsZTsKIAkJYmZpbl93cml0ZV9QTExfRElWKHBsbGRpdik7CkBAIC0xMTIsMTAgKzExMiwxMCBAQAogCQliZmluX3dyaXRlX1RTQ0FMRSh0c2NhbGUpOwogCQljeWNsZXMgPSBnZXRfY3ljbGVzKCk7CiAJCVNTWU5DKCk7Ci0JY3ljbGVzICs9IDEwOyAvKiB+MTAgY3ljbGVzIHdlIGxvb3NlIGFmdGVyIGdldF9jeWNsZXMoKSAqLworCWN5Y2xlcyArPSAxMDsgLyogfjEwIGN5Y2xlcyB3ZSBsb3NlIGFmdGVyIGdldF9jeWNsZXMoKSAqLwogCV9fYmZpbl9jeWNsZXNfb2ZmICs9IChjeWNsZXMgPDwgX19iZmluX2N5Y2xlc19tb2QpIC0gKGN5Y2xlcyA8PCBpbmRleCk7CiAJX19iZmluX2N5Y2xlc19tb2QgPSBpbmRleDsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogCS8qIFRPRE86IGp1c3QgdGVzdCBjYXNlIGZvciBjeWNsZXMgY2xvY2sgc291cmNlLCByZW1vdmUgbGF0ZXIgKi8KIAlwcl9kZWJ1ZygiY3B1ZnJlcTogZG9uZVxuIik7CiAJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2RwbWNfbW9kZXMuUyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vZHBtY19tb2Rlcy5TCmluZGV4IGFkNTQzMWUuLjRkYTUwYmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vZHBtY19tb2Rlcy5TCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vZHBtY19tb2Rlcy5TCkBAIC0yNDcsNyArMjQ3LDggQEAKIEVORFBST0MoX3Vuc2V0X2RyYW1fc3JmcykKIAogRU5UUlkoX3NldF9zaWNfaXdyKQotI2lmIGRlZmluZWQoQ09ORklHX0JGNTR4KSB8fCBkZWZpbmVkKENPTkZJR19CRjUyeCkgIHx8IGRlZmluZWQoQ09ORklHX0JGNTYxKQorI2lmIGRlZmluZWQoQ09ORklHX0JGNTR4KSB8fCBkZWZpbmVkKENPTkZJR19CRjUyeCkgfHwgZGVmaW5lZChDT05GSUdfQkY1NjEpIHx8IFwKKwlkZWZpbmVkKENPTkZJR19CRjUzOCkgfHwgZGVmaW5lZChDT05GSUdfQkY1MzkpIHx8IGRlZmluZWQoQ09ORklHX0JGNTF4KQogCVAwLkggPSBoaShTSUNfSVdSMCk7CiAJUDAuTCA9IGxvKFNJQ19JV1IwKTsKIAlQMS5IID0gaGkoU0lDX0lXUjEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9lbnRyeS5TIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9lbnRyeS5TCmluZGV4IGJkZTZkYzQuLmZhZTc3NDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vZW50cnkuUworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2VudHJ5LlMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KICNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KICNpbmNsdWRlIDxhc20vZml4ZWRfY29kZS5oPgpAQCAtNzUsMTEgKzc2LDExIEBACiAJICogaGFuZGxlIGl0LgogCSAqLwogCVA0ID0gUjc7CS8qIFN0b3JlIEVYQ0FVU0UgKi8KLQlwNS5sID0gX2xhc3RfY3BsYl9mYXVsdF9yZXR4OwotCXA1LmggPSBfbGFzdF9jcGxiX2ZhdWx0X3JldHg7Ci0JcjcgPSBbcDVdOworCisJR0VUX1BEQShwNSwgcjcpOworCXI3ID0gW3A1ICsgUERBX0xGUkVUWF07CiAJcjYgPSByZXR4OwotCVtwNV0gPSByNjsKKwlbcDUgKyBQREFfTEZSRVRYXSA9IHI2OwogCWNjID0gcjYgPT0gcjc7CiAJaWYgIWNjIGp1bXAgX2JmaW5fcmV0dXJuX2Zyb21fZXhjZXB0aW9uOwogCS8qIGZhbGwgdGhyb3VnaCAqLwpAQCAtMTExLDI0ICsxMTIsMjEgQEAKIEVOVFJZKF9leF9kY3BsYl9taXNzKQogRU5UUlkoX2V4X2ljcGxiX21pc3MpCiAJKFI3OjYsUDU6NCkgPSBbc3ArK107Ci0JQVNUQVQgPSBbc3ArK107Ci0JU0FWRV9BTExfU1lTCi0jaWZkZWYgQ09ORklHX01QVQorCS8qIFdlIGxlYXZlIHRoZSBwcmV2aW91c2x5IHB1c2hlZCBBU1RBVCBvbiB0aGUgc3RhY2suICAqLworCVNBVkVfQ09OVEVYVF9DUExCCisKIAkvKiBXZSBtdXN0IGxvYWQgUjEgaGVyZSwgX2JlZm9yZV8gREVCVUdfSFdUUkFDRV9TQVZFLCBzaW5jZSB0aGF0CiAJICogd2lsbCBjaGFuZ2UgdGhlIHN0YWNrIHBvaW50ZXIuICAqLwogCVIwID0gU0VRU1RBVDsKIAlSMSA9IFNQOwotI2VuZGlmCisKIAlERUJVR19IV1RSQUNFX1NBVkUocDUsIHI3KQotI2lmZGVmIENPTkZJR19NUFUKKwogCXNwICs9IC0xMjsKIAljYWxsIF9jcGxiX2hkcjsKIAlzcCArPSAxMjsKIAlDQyA9IFIwID09IDA7CiAJSUYgIUNDIEpVTVAgX2hhbmRsZV9iYWRfY3BsYjsKLSNlbHNlCi0JY2FsbCBfX2NwbGJfaGRyOwotI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfREVCVUdfRE9VQkxFRkFVTFQKIAkvKiBXaGlsZSB3ZSB3ZXJlIHByb2Nlc3NpbmcgdGhpcywgZGlkIHdlIGRvdWJsZSBmYXVsdD8gKi8KQEAgLTE0Miw3ICsxNDAsOCBAQAogI2VuZGlmCiAKIAlERUJVR19IV1RSQUNFX1JFU1RPUkUocDUsIHI3KQotCVJFU1RPUkVfQUxMX1NZUworCVJFU1RPUkVfQ09OVEVYVF9DUExCCisJQVNUQVQgPSBbU1ArK107CiAJU1AgPSBFWF9TQ1JBVENIX1JFRzsKIAlydHg7CiBFTkRQUk9DKF9leF9pY3BsYl9taXNzKQpAQCAtMjk3LDkgKzI5Niw4IEBACiAJICogdGhlIHN0YWNrIHRvIGdldCByZWFkeSBzbywgd2UgY2FuIGZhbGwgdGhyb3VnaCAtIHdlCiAJICogbmVlZCB0byBtYWtlIGEgQ1BMQiBleGNlcHRpb24gbG9vayBsaWtlIGEgbm9ybWFsIGV4Y2VwdGlvbgogCSAqLwotCi0JUkVTVE9SRV9BTExfU1lTCi0JWy0tc3BdID0gQVNUQVQ7CisJUkVTVE9SRV9DT05URVhUX0NQTEIKKwkvKiBBU1RBVCBpcyBzdGlsbCBvbiB0aGUgc3RhY2ssIHdoZXJlIGl0IGlzIG5lZWRlZC4gICovCiAJWy0tc3BdID0gKFI3OjYsUDU6NCk7CiAKIEVOVFJZKF9leF9yZXBsYWNlYWJsZSkKQEAgLTMyNCw3ICszMjIsOSBAQAogCVtwNF0gPSBwNTsKIAljc3luYzsKIAorCUdFVF9QREEocDUsIHI2KTsKICNpZm5kZWYgQ09ORklHX0RFQlVHX0RPVUJMRUZBVUxUCisKIAkvKgogCSAqIFNhdmUgdGhlc2UgcmVnaXN0ZXJzLCBhcyB0aGV5IGFyZSBvbmx5IHZhbGlkIGluIGV4Y2VwdGlvbiBjb250ZXh0CiAJICogICh3aGVyZSB3ZSBhcmUgbm93IC0gYXMgc29vbiBhcyB3ZSBkZWZlciB0byBJUlE1LCB0aGV5IGNhbiBjaGFuZ2UpCkBAIC0zMzUsMjkgKzMzNSwyNSBAQAogCXA0LmwgPSBsbyhEQ1BMQl9GQVVMVF9BRERSKTsKIAlwNC5oID0gaGkoRENQTEJfRkFVTFRfQUREUik7CiAJcjcgPSBbcDRdOwotCXA1LmggPSBfc2F2ZWRfZGNwbGJfZmF1bHRfYWRkcjsKLQlwNS5sID0gX3NhdmVkX2RjcGxiX2ZhdWx0X2FkZHI7Ci0JW3A1XSA9IHI3OworCVtwNSArIFBEQV9EQ1BMQl0gPSByNzsKIAotCXI3ID0gW3A0ICsgKElDUExCX0ZBVUxUX0FERFIgLSBEQ1BMQl9GQVVMVF9BRERSKV07Ci0JcDUuaCA9IF9zYXZlZF9pY3BsYl9mYXVsdF9hZGRyOwotCXA1LmwgPSBfc2F2ZWRfaWNwbGJfZmF1bHRfYWRkcjsKLQlbcDVdID0gcjc7CisJcDQubCA9IGxvKElDUExCX0ZBVUxUX0FERFIpOworCXA0LmggPSBoaShJQ1BMQl9GQVVMVF9BRERSKTsKKwlyNiA9IFtwNF07CisJW3A1ICsgUERBX0lDUExCXSA9IHI2OwogCiAJcjYgPSByZXR4OwotCXA0LmwgPSBfc2F2ZWRfcmV0eDsKLQlwNC5oID0gX3NhdmVkX3JldHg7Ci0JW3A0XSA9IHI2OworCVtwNSArIFBEQV9SRVRYXSA9IHI2OwogI2VuZGlmCiAJcjYgPSBTWVNDRkc7Ci0JW3A0ICsgNF0gPSByNjsKKwlbcDUgKyBQREFfU1lTQ0ZHXSA9IHI2OwogCUJJVENMUihyNiwgMCk7CiAJU1lTQ0ZHID0gcjY7CiAKIAkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzLCBidXQgbWFrZSBzdXJlIGxldmVsIDUgaXMgZW5hYmxlZCBzbwogCSAqIHdlIGNhbiBzd2l0Y2ggdG8gdGhhdCBsZXZlbC4gIFNhdmUgdGhlIG9sZCBtYXNrLiAgKi8KIAljbGkgcjY7Ci0JW3A0ICsgOF0gPSByNjsKKwlbcDUgKyBQREFfRVhJTUFTS10gPSByNjsKIAogCXA0LmwgPSBsbyhTQUZFX1VTRVJfSU5TVFJVQ1RJT04pOwogCXA0LmggPSBoaShTQUZFX1VTRVJfSU5TVFJVQ1RJT04pOwpAQCAtMzcxLDkgKzM2NywxMCBAQAogRU5EUFJPQyhfZXhfdHJhcF9jKQogCiAvKiBXZSBqdXN0IHJlYWxpemVkIHdlIGdvdCBhbiBleGNlcHRpb24sIHdoaWxlIHdlIHdlcmUgcHJvY2Vzc2luZyBhIGRpZmZlcmVudAotICogZXhjZXB0aW9uLiBUaGlzIGlzIGEgdW5yZWNvdmVyYWJsZSBldmVudCwgc28gY3Jhc2gKKyAqIGV4Y2VwdGlvbi4gVGhpcyBpcyBhIHVucmVjb3ZlcmFibGUgZXZlbnQsIHNvIGNyYXNoLgorICogTm90ZTogdGhpcyBjYW5ub3QgYmUgRU5UUlkoKSBhcyB3ZSBqdW1wIGhlcmUgd2l0aCAiaWYgY2MganVtcCIgLi4uCiAgKi8KLUVOVFJZKF9kb3VibGVfZmF1bHQpCitfZG91YmxlX2ZhdWx0OgogCS8qIFR1cm4gY2FjaGVzICYgcHJvdGVjdGlvbiBvZmYsIHRvIGVuc3VyZSB3ZSBkb24ndCBnZXQgYW55IG1vcmUKIAkgKiBkb3VibGUgZXhjZXB0aW9ucwogCSAqLwpAQCAtNDI0LDE3ICs0MjEsMTYgQEAKIEVOVFJZKF9leGNlcHRpb25fdG9fbGV2ZWw1KQogCVNBVkVfQUxMX1NZUwogCi0JcDQubCA9IF9zYXZlZF9yZXR4OwotCXA0LmggPSBfc2F2ZWRfcmV0eDsKLQlyNiA9IFtwNF07CisJR0VUX1BEQShwNCwgcjcpOyAgICAgICAgLyogRmV0Y2ggY3VycmVudCBQREEgKi8KKwlyNiA9IFtwNCArIFBEQV9SRVRYXTsKIAlbc3AgKyBQVF9QQ10gPSByNjsKIAotCXI2ID0gW3A0ICsgNF07CisJcjYgPSBbcDQgKyBQREFfU1lTQ0ZHXTsKIAlbc3AgKyBQVF9TWVNDRkddID0gcjY7CiAKIAkvKiBSZXN0b3JlIGludGVycnVwdCBtYXNrLiAgV2UgaGF2ZW4ndCBwdXNoZWQgUkVUSSwgc28gdGhpcwogCSAqIGRvZXNuJ3QgZW5hYmxlIGludGVycnVwdHMgdW50aWwgd2UgcmV0dXJuIGZyb20gdGhpcyBoYW5kbGVyLiAgKi8KLQlyNiA9IFtwNCArIDhdOworCXI2ID0gW3A0ICsgUERBX0VYSU1BU0tdOwogCXN0aSByNjsKIAogCS8qIFJlc3RvcmUgdGhlIGhhcmR3YXJlIGVycm9yIHZlY3Rvci4gICovCkBAIC00NzgsOCArNDc0LDggQEAKIAkgKiBzY3JhdGNoIHJlZ2lzdGVyIChmb3Igd2FudCBvZiBhIGJldHRlciBvcHRpb24pLgogCSAqLwogCUVYX1NDUkFUQ0hfUkVHID0gc3A7Ci0Jc3AubCA9IF9leGNlcHRpb25fc3RhY2tfdG9wOwotCXNwLmggPSBfZXhjZXB0aW9uX3N0YWNrX3RvcDsKKwlHRVRfUERBX1NBRkUoc3ApOworCXNwID0gW3NwICsgUERBX0VYU1RBQ0tdCiAJLyogVHJ5IHRvIGRlYWwgd2l0aCBzeXNjYWxscyBxdWlja2x5LiAgKi8KIAlbLS1zcF0gPSBBU1RBVDsKIAlbLS1zcF0gPSAoUjc6NixQNTo0KTsKQEAgLTUwMSwyNyArNDk3LDIyIEBACiAJICogYnV0IHRoZXkgYXJlIG5vdCB2ZXJ5IGludGVyZXN0aW5nLCBzbyBkb24ndCBzYXZlIHRoZW0KIAkgKi8KIAorCUdFVF9QREEocDUsIHI3KTsKIAlwNC5sID0gbG8oRENQTEJfRkFVTFRfQUREUik7CiAJcDQuaCA9IGhpKERDUExCX0ZBVUxUX0FERFIpOwogCXI3ID0gW3A0XTsKLQlwNS5oID0gX3NhdmVkX2RjcGxiX2ZhdWx0X2FkZHI7Ci0JcDUubCA9IF9zYXZlZF9kY3BsYl9mYXVsdF9hZGRyOwotCVtwNV0gPSByNzsKKwlbcDUgKyBQREFfRENQTEJdID0gcjc7CiAKLQlyNyA9IFtwNCArIChJQ1BMQl9GQVVMVF9BRERSIC0gRENQTEJfRkFVTFRfQUREUildOwotCXA1LmggPSBfc2F2ZWRfaWNwbGJfZmF1bHRfYWRkcjsKLQlwNS5sID0gX3NhdmVkX2ljcGxiX2ZhdWx0X2FkZHI7Ci0JW3A1XSA9IHI3OworCXA0LmwgPSBsbyhJQ1BMQl9GQVVMVF9BRERSKTsKKwlwNC5oID0gaGkoSUNQTEJfRkFVTFRfQUREUik7CisJcjcgPSBbcDRdOworCVtwNSArIFBEQV9JQ1BMQl0gPSByNzsKIAotCXA0LmwgPSBfc2F2ZWRfcmV0eDsKLQlwNC5oID0gX3NhdmVkX3JldHg7CiAJcjYgPSByZXR4OwotCVtwNF0gPSByNjsKKwlbcDUgKyBQREFfUkVUWF0gPSByNjsKIAogCXI3ID0gU0VRU1RBVDsJCS8qIHJlYXNvbiBjb2RlIGlzIGluIGJpdCA1OjAgKi8KLQlwNC5sID0gX3NhdmVkX3NlcXN0YXQ7Ci0JcDQuaCA9IF9zYXZlZF9zZXFzdGF0OwotCVtwNF0gPSByNzsKKwlbcDUgKyBQREFfU0VRU1RBVF0gPSByNzsKICNlbHNlCiAJcjcgPSBTRVFTVEFUOyAgICAgICAgICAgLyogcmVhc29uIGNvZGUgaXMgaW4gYml0IDU6MCAqLwogI2VuZGlmCkBAIC01NDYsMTEgKzUzNywxMSBAQAogCXAwID0gc3A7CiAJcjMgPSBTSVpFT0ZfUFRSRUdTIC8gNDsKIAlyNCA9IDAoeCk7Ci0wOgorLkxjbGVhcl9yZWdzOgogCVtwMCsrXSA9IHI0OwogCXIzICs9IC0xOwogCWNjID0gcjMgPT0gMDsKLQlpZiAhY2MganVtcCAwYiAoYnApOworCWlmICFjYyBqdW1wIC5MY2xlYXJfcmVncyAoYnApOwogCiAJcDAgPSBzcDsKIAlzcCArPSAtMTY7CkBAIC01NTgsNyArNTQ5LDcgQEAKIAljYWxsIF9kb19leGVjdmU7CiAJU1AgKz0gMTY7CiAJY2MgPSByMCA9PSAwOwotCWlmICEgY2MganVtcCAxZjsKKwlpZiAhIGNjIGp1bXAgLkxleGVjdmVfZmFpbGVkOwogCS8qIFN1Y2Nlc3MuICBDb3B5IG91ciB0ZW1wb3JhcnkgcHRfcmVncyB0byB0aGUgdG9wIG9mIHRoZSBrZXJuZWwKIAkgKiBzdGFjayBhbmQgZG8gYSBub3JtYWwgZXhjZXB0aW9uIHJldHVybi4KIAkgKi8KQEAgLTU3NCwxMiArNTY1LDEyIEBACiAJcDAgPSBmcDsKIAlyNCA9IFtwMC0tXTsKIAlyMyA9IFNJWkVPRl9QVFJFR1MgLyA0OwotMDoKKy5MY29weV9yZWdzOgogCXI0ID0gW3AwLS1dOwogCVtwMS0tXSA9IHI0OwogCXIzICs9IC0xOwogCWNjID0gcjMgPT0gMDsKLQlpZiAhIGNjIGp1bXAgMGIgKGJwKTsKKwlpZiAhIGNjIGp1bXAgLkxjb3B5X3JlZ3MgKGJwKTsKIAogCXIwID0gKEtFUk5FTF9TVEFDS19TSVpFIC0gU0laRU9GX1BUUkVHUykgKHopOwogCXAxID0gcjA7CkBAIC01OTEsNyArNTgyLDcgQEAKIAogCVJFU1RPUkVfQ09OVEVYVDsKIAlydGk7Ci0xOgorLkxleGVjdmVfZmFpbGVkOgogCXVubGluazsKIAlydHM7CiBFTkRQUk9DKF9rZXJuZWxfZXhlY3ZlKQpAQCAtOTI1LDkgKzkxNiwxNCBAQAogCXAxID0gcmV0czsKIAlbc3AgKyBQVF9SRVNFUlZFRF0gPSBwMTsKIAotCXAwLmwgPSBfaXJxX2ZsYWdzOwotCXAwLmggPSBfaXJxX2ZsYWdzOworI2lmZGVmIENPTkZJR19TTVAKKwlHRVRfUERBKHAwLCByMCk7IAkvKiBGZXRjaCBjdXJyZW50IFBEQSAoY2FuJ3QgbWlncmF0ZSB0byBvdGhlciBDUFUgaGVyZSkgKi8KKwlyMCA9IFtwMCArIFBEQV9JUlFGTEFHU107CisjZWxzZQorCXAwLmwgPSBfYmZpbl9pcnFfZmxhZ3M7CisJcDAuaCA9IF9iZmluX2lycV9mbGFnczsKIAlyMCA9IFtwMF07CisjZW5kaWYKIAlzdGkgcjA7CiAKIAlyMCA9IHNwOwpAQCAtMTUzOSwxNCArMTUzNSwxOCBAQAogCS5lbmRyCiBFTkQoX3N5c19jYWxsX3RhYmxlKQogCi1fZXhjZXB0aW9uX3N0YWNrOgotCS5yZXB0IDEwMjQKLQkubG9uZyAwOworI2lmZGVmIENPTkZJR19FWENFUFRJT05fTDFfU0NSQVRDSAorLyogLnNlY3Rpb24gLmwxLmJzcy5zY3JhdGNoICovCisuc2V0IF9leGNlcHRpb25fc3RhY2tfdG9wLCBMMV9TQ1JBVENIX1NUQVJUICsgTDFfU0NSQVRDSF9MRU5HVEgKKyNlbHNlCisjaWZkZWYgQ09ORklHX1NZU0NBTExfVEFCX0wxCisuc2VjdGlvbiAubDEuYnNzCisjZWxzZQorLmJzcworI2VuZGlmCitFTlRSWShfZXhjZXB0aW9uX3N0YWNrKQorCS5yZXB0IDEwMjQgKiBOUl9DUFVTCisJLmxvbmcgMAogCS5lbmRyCiBfZXhjZXB0aW9uX3N0YWNrX3RvcDoKLQotI2lmIEFOT01BTFlfMDUwMDAyNjEKLS8qIFVzZWQgYnkgdGhlIGFzc2VtYmx5IGVudHJ5IHBvaW50IHRvIHdvcmsgYXJvdW5kIGFuIGFub21hbHkuICAqLwotX2xhc3RfY3BsYl9mYXVsdF9yZXR4OgotCS5sb25nIDA7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaGVhZC5TIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9oZWFkLlMKaW5kZXggZjEyM2E2Mi4uZTFlNDJjMCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9oZWFkLlMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9oZWFkLlMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogX19JTklUCiAKQEAgLTExMSwzMyArMTEyLDI2IEBACiAJICogVGhpcyBoYXBwZW5zIGhlcmUsIHNpbmNlIEwxIGdldHMgY2xvYmJlcmVkCiAJICogYmVsb3cKIAkgKi8KLQlwMC5sID0gX3NhdmVkX3JldHg7Ci0JcDAuaCA9IF9zYXZlZF9yZXR4OworCUdFVF9QREEocDAsIHIwKTsKKwlyNyA9IFtwMCArIFBEQV9SRVRYXTsKIAlwMS5sID0gX2luaXRfc2F2ZWRfcmV0eDsKIAlwMS5oID0gX2luaXRfc2F2ZWRfcmV0eDsKLQlyMCA9IFtwMF07Ci0JW3AxXSA9IHIwOworCVtwMV0gPSByNzsKIAotCXAwLmwgPSBfc2F2ZWRfZGNwbGJfZmF1bHRfYWRkcjsKLQlwMC5oID0gX3NhdmVkX2RjcGxiX2ZhdWx0X2FkZHI7CisJcjcgPSBbcDAgKyBQREFfRENQTEJdOwogCXAxLmwgPSBfaW5pdF9zYXZlZF9kY3BsYl9mYXVsdF9hZGRyOwogCXAxLmggPSBfaW5pdF9zYXZlZF9kY3BsYl9mYXVsdF9hZGRyOwotCXIwID0gW3AwXTsKLQlbcDFdID0gcjA7CisJW3AxXSA9IHI3OwogCi0JcDAubCA9IF9zYXZlZF9pY3BsYl9mYXVsdF9hZGRyOwotCXAwLmggPSBfc2F2ZWRfaWNwbGJfZmF1bHRfYWRkcjsKKwlyNyA9IFtwMCArIFBEQV9JQ1BMQl07CiAJcDEubCA9IF9pbml0X3NhdmVkX2ljcGxiX2ZhdWx0X2FkZHI7CiAJcDEuaCA9IF9pbml0X3NhdmVkX2ljcGxiX2ZhdWx0X2FkZHI7Ci0JcjAgPSBbcDBdOwotCVtwMV0gPSByMDsKKwlbcDFdID0gcjc7CiAKLQlwMC5sID0gX3NhdmVkX3NlcXN0YXQ7Ci0JcDAuaCA9IF9zYXZlZF9zZXFzdGF0OworCXI3ID0gW3AwICsgUERBX1NFUVNUQVRdOwogCXAxLmwgPSBfaW5pdF9zYXZlZF9zZXFzdGF0OwogCXAxLmggPSBfaW5pdF9zYXZlZF9zZXFzdGF0OwotCXIwID0gW3AwXTsKLQlbcDFdID0gcjA7CisJW3AxXSA9IHI3OwogI2VuZGlmCiAKIAkvKiBJbml0aWFsaXplIHN0YWNrIHBvaW50ZXIgKi8KQEAgLTE1Myw3ICsxNDcsNyBAQAogCS8qIFB1dCBUaGUgQ29kZSBmb3IgUExMIFByb2dyYW1taW5nIGFuZCBTRFJBTSBQcm9ncmFtbWluZyBpbiBMMSBJU1JBTSAqLwogCWNhbGwgX2JmaW5fcmVsb2NhdGVfbDFfbWVtOwogI2lmZGVmIENPTkZJR19CRklOX0tFUk5FTF9DTE9DSwotCWNhbGwgX3N0YXJ0X2RtYV9jb2RlOworCWNhbGwgX2luaXRfY2xvY2tzOwogI2VuZGlmCiAKIAkvKiBUaGlzIHNlY3Rpb24ga2VlcHMgdGhlIHByb2Nlc3NvciBpbiBzdXBlcnZpc29yIG1vZGUKQEAgLTE3MCwxMiArMTY0LDggQEAKIAlbcDBdID0gcDE7CiAJY3N5bmM7CiAKLQlwMC5sID0gbG8oSU1BU0spOwotCXAwLmggPSBoaShJTUFTSyk7Ci0JcDEubCA9IElNQVNLX0lWRzE1OwotCXAxLmggPSAweDA7Ci0JW3AwXSA9IHAxOwotCWNzeW5jOworCXIwID0gRVZUX0lWRzE1ICh6KTsKKwlzdGkgcjA7CiAKIAlyYWlzZSAxNTsKIAlwMC5sID0gLkxXQUlUX0hFUkU7CkBAIC0xOTUsNiArMTg1LDE5IEBACiAjIGRlZmluZSBXRE9HX0NUTCBXRE9HQV9DVEwKICNlbmRpZgogCitFTlRSWShfX2luaXRfY2xlYXJfYnNzKQorCXIyID0gcjIgLSByMTsKKwljYyA9IHIyID09IDA7CisJaWYgY2MganVtcCAuTF9ic3NfZG9uZTsKKwlyMiA+Pj0gMjsKKwlwMSA9IHIxOworCXAyID0gcjI7CisJbHNldHVwICgxZiwgMWYpIGxjMCA9IHAyOworMToJW3AxKytdID0gcjA7CisuTF9ic3NfZG9uZToKKwlydHM7CitFTkRQUk9DKF9faW5pdF9jbGVhcl9ic3MpCisKIEVOVFJZKF9yZWFsX3N0YXJ0KQogCS8qIEVuYWJsZSBuZXN0ZWQgaW50ZXJydXB0cyAqLwogCVstLXNwXSA9IHJldGk7CkBAIC0yMDYsODcgKzIwOSwzNCBAQAogCXdbcDBdID0gcjA7CiAJc3N5bmM7CiAKKwlyMCA9IDAgKHgpOworCS8qIFplcm8gb3V0IGFsbCBvZiB0aGUgZnVuIGJzcyByZWdpb25zICovCiAjaWYgTDFfREFUQV9BX0xFTkdUSCA+IDAKIAlyMS5sID0gX19zYnNzX2wxOwogCXIxLmggPSBfX3Nic3NfbDE7CiAJcjIubCA9IF9fZWJzc19sMTsKIAlyMi5oID0gX19lYnNzX2wxOwotCXIwID0gMCAoeik7Ci0JcjIgPSByMiAtIHIxOwotCWNjID0gcjIgPT0gMDsKLQlpZiBjYyBqdW1wIC5MX2FfbDFfZG9uZTsKLQlyMiA+Pj0gMjsKLQlwMSA9IHIxOwotCXAyID0gcjI7Ci0JbHNldHVwICguTF9jbGVhcl9hX2wxLCAuTF9jbGVhcl9hX2wxICkgbGMwID0gcDI7Ci0uTF9jbGVhcl9hX2wxOgotCVtwMSsrXSA9IHIwOwotLkxfYV9sMV9kb25lOgorCWNhbGwgX19pbml0X2NsZWFyX2JzcwogI2VuZGlmCi0KICNpZiBMMV9EQVRBX0JfTEVOR1RIID4gMAogCXIxLmwgPSBfX3Nic3NfYl9sMTsKIAlyMS5oID0gX19zYnNzX2JfbDE7CiAJcjIubCA9IF9fZWJzc19iX2wxOwogCXIyLmggPSBfX2Vic3NfYl9sMTsKLQlyMCA9IDAgKHopOwotCXIyID0gcjIgLSByMTsKLQljYyA9IHIyID09IDA7Ci0JaWYgY2MganVtcCAuTF9iX2wxX2RvbmU7Ci0JcjIgPj49IDI7Ci0JcDEgPSByMTsKLQlwMiA9IHIyOwotCWxzZXR1cCAoLkxfY2xlYXJfYl9sMSwgLkxfY2xlYXJfYl9sMSApIGxjMCA9IHAyOwotLkxfY2xlYXJfYl9sMToKLQlbcDErK10gPSByMDsKLS5MX2JfbDFfZG9uZToKKwljYWxsIF9faW5pdF9jbGVhcl9ic3MKICNlbmRpZgotCiAjaWYgTDJfTEVOR1RIID4gMAogCXIxLmwgPSBfX3Nic3NfbDI7CiAJcjEuaCA9IF9fc2Jzc19sMjsKIAlyMi5sID0gX19lYnNzX2wyOwogCXIyLmggPSBfX2Vic3NfbDI7Ci0JcjAgPSAwICh6KTsKLQlyMiA9IHIyIC0gcjE7Ci0JY2MgPSByMiA9PSAwOwotCWlmIGNjIGp1bXAgLkxfbDJfZG9uZTsKLQlyMiA+Pj0gMjsKLQlwMSA9IHIxOwotCXAyID0gcjI7Ci0JbHNldHVwICguTF9jbGVhcl9sMiwgLkxfY2xlYXJfbDIgKSBsYzAgPSBwMjsKLS5MX2NsZWFyX2wyOgotCVtwMSsrXSA9IHIwOwotLkxfbDJfZG9uZToKKwljYWxsIF9faW5pdF9jbGVhcl9ic3MKICNlbmRpZgotCi0JLyogWmVybyBvdXQgdGhlIGJzcyByZWdpb24KLQkgKiBOb3RlOiB0aGlzIHdpbGwgZmFpbCBpZiBic3MgaXMgMCBieXRlcyAuLi4KLQkgKi8KLQlyMCA9IDAgKHopOwogCXIxLmwgPSBfX19ic3Nfc3RhcnQ7CiAJcjEuaCA9IF9fX2Jzc19zdGFydDsKIAlyMi5sID0gX19fYnNzX3N0b3A7CiAJcjIuaCA9IF9fX2Jzc19zdG9wOwotCXIyID0gcjIgLSByMTsKLQlyMiA+Pj0gMjsKLQlwMSA9IHIxOwotCXAyID0gcjI7Ci0JbHNldHVwICguTF9jbGVhcl9ic3MsIC5MX2NsZWFyX2JzcykgbGMwID0gcDI7Ci0uTF9jbGVhcl9ic3M6Ci0JW3AxKytdID0gcjA7Ci0KLQkvKiBJbiBjYXNlIHRoZXJlIGlzIGEgTlVMTCBwb2ludGVyIHJlZmVyZW5jZSwKLQkgKiB6ZXJvIG91dCByZWdpb24gYmVmb3JlIHN0ZXh0Ci0JICovCi0JcDEgPSByMDsKLQlyMi5sID0gX19zdGV4dDsKLQlyMi5oID0gX19zdGV4dDsKLQlyMiA+Pj0gMjsKLQlwMiA9IHIyOwotCWxzZXR1cCAoLkxfY2xlYXJfemVybywgLkxfY2xlYXJfemVybykgbGMwID0gcDI7Ci0uTF9jbGVhcl96ZXJvOgotCVtwMSsrXSA9IHIwOworCWNhbGwgX19pbml0X2NsZWFyX2JzcwogCiAJLyogUGFzcyB0aGUgdS1ib290IGFyZ3VtZW50cyB0byB0aGUgZ2xvYmFsIHZhbHVlIGNvbW1hbmQgbGluZSAqLwogCVIwID0gUjc7CkBAIC0yOTksNiArMjQ5LDkgQEAKIAlzcCA9IHNwICsgcDE7CiAJdXNwID0gc3A7CiAJZnAgPSBzcDsKKwlzcCArPSAtMTI7CisJY2FsbCBfaW5pdF9wZGEKKwlzcCArPSAxMjsKIAlqdW1wLmwgX3N0YXJ0X2tlcm5lbDsKIEVORFBST0MoX3JlYWxfc3RhcnQpCiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaW50ZXJydXB0LlMgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2ludGVycnVwdC5TCmluZGV4IDRhMmVjN2EuLjQ3M2RmMGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaW50ZXJydXB0LlMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9pbnRlcnJ1cHQuUwpAQCAtMTI5LDggKzEyOSwxNSBAQAogI2VuZGlmCiAJcjEgPSAgc3A7CiAJU1AgKz0gLTEyOworI2lmZGVmIENPTkZJR19JUElQRQorCWNhbGwgX19faXBpcGVfZ3JhYl9pcnEKKwlTUCArPSAxMjsKKwljYyA9IHIwID09IDA7CisJaWYgY2MganVtcCAuTGNvbW1vbl9yZXN0b3JlX2NvbnRleHQ7CisjZWxzZSAvKiBDT05GSUdfSVBJUEUgKi8KIAljYWxsIF9kb19pcnE7CiAJU1AgKz0gMTI7CisjZW5kaWYgLyogQ09ORklHX0lQSVBFICovCiAJY2FsbCBfcmV0dXJuX2Zyb21faW50OwogLkxjb21tb25fcmVzdG9yZV9jb250ZXh0OgogCVJFU1RPUkVfQ09OVEVYVApAQCAtMTUyLDE1ICsxNTksNiBAQAogMToKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX0hBUkRXQVJFX1BNCi0JcjcgPSBbc3AgKyBQVF9TRVFTVEFUXTsKLQlyNyA9IHI3ID4+PiAweGU7Ci0JcjYgPSAweDFGOwotCXI3ID0gcjcgJiByNjsKLQlyNSA9IDB4MTI7Ci0JY2MgPSByNyA9PSByNTsKLQlpZiBjYyBqdW1wIC5MY2FsbF9kb19vdmY7IC8qIGRlYWwgd2l0aCBwZXJmb3JtYW5jZSBjb3VudGVyIG92ZXJmbG93ICovCi0jZW5kaWYKIAkjIFdlIGFyZSBnb2luZyB0byBkdW1wIHNvbWV0aGluZyBvdXQsIHNvIG1ha2Ugc3VyZSB3ZSBwcmludCBJUEVORCBwcm9wZXJseQogCXAyLmwgPSBsbyhJUEVORCk7CiAJcDIuaCA9IGhpKElQRU5EKTsKQEAgLTE5MiwxNyArMTkwLDYgQEAKIC5MY29tbW9uX3Jlc3RvcmVfYWxsX3N5czoKIAlSRVNUT1JFX0FMTF9TWVMKIAlydGk7Ci0KLSNpZmRlZiBDT05GSUdfSEFSRFdBUkVfUE0KLS5MY2FsbF9kb19vdmY6Ci0KLQlTUCArPSAtMTI7Ci0JY2FsbCBfcG1fb3ZlcmZsb3c7Ci0JU1AgKz0gMTI7Ci0KLQlqdW1wIC5MY29tbW9uX3Jlc3RvcmVfYWxsX3N5czsKLSNlbmRpZgotCiBFTkRQUk9DKF9ldnRfaXZodykKIAogLyogSW50ZXJydXB0IHJvdXRpbmUgZm9yIGV2dDIgKE5NSSkuCkBAIC0yNDUsMyArMjMyLDU2IEBACiAJY2FsbCBfc3lzdGVtX2NhbGw7CiAJanVtcCAuTGNvbW1vbl9yZXN0b3JlX2NvbnRleHQ7CiBFTkRQUk9DKF9ldnRfc3lzdGVtX2NhbGwpCisKKyNpZmRlZiBDT05GSUdfSVBJUEUKK0VOVFJZKF9fX2lwaXBlX2NhbGxfaXJxdGFpbCkKKwlyMC5sID0gMWY7CisJcjAuaCA9IDFmOworCXJldGkgPSByMDsKKwlydGk7CisxOgorCVstLXNwXSA9IHJldHM7CisJWy0tc3BdID0gKCByNzo0LCBwNTozICk7CisJcDAubCA9IF9fX2lwaXBlX2lycV90YWlsX2hvb2s7CisJcDAuaCA9IF9fX2lwaXBlX2lycV90YWlsX2hvb2s7CisJcDAgPSBbcDBdOworCXNwICs9IC0xMjsKKwljYWxsIChwMCk7CisJc3AgKz0gMTI7CisJKCByNzo0LCBwNTozICkgPSBbc3ArK107CisJcmV0cyA9IFtzcCsrXTsKKworCVstLXNwXSA9IHJldGk7CisJcmV0aSA9IFtzcCsrXTsgICAgICAgICAgLyogSVJRcyBhcmUgb2ZmLiAqLworCXIwLmggPSAzZjsKKwlyMC5sID0gM2Y7CisJcDAubCA9IGxvKEVWVDE0KTsKKwlwMC5oID0gaGkoRVZUMTQpOworCVtwMF0gPSByMDsKKwljc3luYzsKKwlyMCA9IDB4NDAxZjsKKwlzdGkgcjA7CisJcmFpc2UgMTQ7CisJWy0tc3BdID0gcmV0aTsgICAgICAgICAgLyogSVJRcyBvbi4gKi8KKzI6CisJanVtcCAyYjsgICAgICAgICAgICAgICAgLyogTGlrZWx5IHBhcmFub2lkLiAqLworMzoKKwlzcCArPSA0OyAgICAgICAgICAgICAgICAvKiBEaXNjYXJkIHNhdmVkIFJFVEkgKi8KKwlyMC5oID0gX2V2dDE0X3NvZnRpcnE7CisJcjAubCA9IF9ldnQxNF9zb2Z0aXJxOworCXAwLmwgPSBsbyhFVlQxNCk7CisJcDAuaCA9IGhpKEVWVDE0KTsKKwlbcDBdID0gcjA7CisJY3N5bmM7CisJcDAubCA9IF9iZmluX2lycV9mbGFnczsKKwlwMC5oID0gX2JmaW5faXJxX2ZsYWdzOworCXIwID0gW3AwXTsKKwlzdGkgcjA7CisjaWYgMCAvKiBGSVhNRTogdGhpcyBhY3R1YWxseSByYWlzZXMgc2NoZWR1bGluZyBsYXRlbmNpZXMgKi8KKwkvKiBSZWVuYWJsZSBpbnRlcnJ1cHRzICovCisJWy0tc3BdID0gcmV0aTsKKwlyMCA9IFtzcCsrXTsKKyNlbmRpZgorCXJ0czsKK0VORFBST0MoX19faXBpcGVfY2FsbF9pcnF0YWlsKQorI2VuZGlmIC8qIENPTkZJR19JUElQRSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9pbnRzLXByaW9yaXR5LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2ludHMtcHJpb3JpdHkuYwppbmRleCAzNGU4YTcyLi4xYmJhNjAzIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2ludHMtcHJpb3JpdHkuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2ludHMtcHJpb3JpdHkuYwpAQCAtMSw5ICsxLDYgQEAKIC8qCiAgKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaW50cy1wcmlvcml0eS5jCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKICAqCi0gKiBDcmVhdGVkOiAgICAgID8KICAqIERlc2NyaXB0aW9uOiAgU2V0IHVwIHRoZSBpbnRlcnJ1cHQgcHJpb3JpdGllcwogICoKICAqIE1vZGlmaWVkOgpAQCAtMzcsNiArMzQsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpZmRlZiBDT05GSUdfSVBJUEUKKyNpbmNsdWRlIDxsaW51eC9pcGlwZS5oPgorI2VuZGlmCiAjaWZkZWYgQ09ORklHX0tHREIKICNpbmNsdWRlIDxsaW51eC9rZ2RiLmg+CiAjZW5kaWYKQEAgLTQ1LDYgKzQ1LDggQEAKICNpbmNsdWRlIDxhc20vZ3Bpby5oPgogI2luY2x1ZGUgPGFzbS9pcnFfaGFuZGxlci5oPgogCisjZGVmaW5lIFNJQ19TWVNJUlEoaXJxKQkoaXJxIC0gKElSUV9DT1JFVE1SICsgMSkpCisKICNpZmRlZiBCRjUzN19GQU1JTFkKICMgZGVmaW5lIEJGNTM3X0dFTkVSSUNfRVJST1JfSU5UX0RFTVVYCiAjZWxzZQpAQCAtNTgsMTMgKzYwLDE2IEBACiAgKiAtCiAgKi8KIAorI2lmbmRlZiBDT05GSUdfU01QCiAvKiBJbml0aWFsaXplIHRoaXMgdG8gYW4gYWN0dWFsIHZhbHVlIHRvIGZvcmNlIGl0IGludG8gdGhlIC5kYXRhCiAgKiBzZWN0aW9uIHNvIHRoYXQgd2Uga25vdyBpdCBpcyBwcm9wZXJseSBpbml0aWFsaXplZCBhdCBlbnRyeSBpbnRvCiAgKiB0aGUga2VybmVsIGJ1dCBiZWZvcmUgYnNzIGlzIGluaXRpYWxpemVkIHRvIHplcm8gKHdoaWNoIGlzIHdoZXJlCiAgKiBpdCB3b3VsZCBsaXZlIG90aGVyd2lzZSkuICBUaGUgMHgxZiBtYWdpYyByZXByZXNlbnRzIHRoZSBJUlFzIHdlCiAgKiBjYW5ub3QgYWN0dWFsbHkgbWFzayBvdXQgaW4gaGFyZHdhcmUuCiAgKi8KLXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzID0gMHgxZjsKK3Vuc2lnbmVkIGxvbmcgYmZpbl9pcnFfZmxhZ3MgPSAweDFmOworRVhQT1JUX1NZTUJPTChiZmluX2lycV9mbGFncyk7CisjZW5kaWYKIAogLyogVGhlIG51bWJlciBvZiBzcHVyaW91cyBpbnRlcnJ1cHRzICovCiBhdG9taWNfdCBudW1fc3B1cmlvdXM7CkBAIC0xMDMsMTIgKzEwOCwxNCBAQAogCQlmb3IgKGlycW4gPSAwOyBpcnFuIDwgTlJfUEVSSV9JTlRTOyBpcnFuKyspIHsKIAkJCWludCBpYXJfc2hpZnQgPSAoaXJxbiAmIDcpICogNDsKIAkJCQlpZiAoaXZnID09ICgweGYgJgotI2lmbmRlZiBDT05GSUdfQkY1MngKKyNpZiBkZWZpbmVkKENPTkZJR19CRjUyeCkgfHwgZGVmaW5lZChDT05GSUdfQkY1MzgpIFwKKwl8fCBkZWZpbmVkKENPTkZJR19CRjUzOSkgfHwgZGVmaW5lZChDT05GSUdfQkY1MXgpCiAJCQkgICAgIGJmaW5fcmVhZDMyKCh1bnNpZ25lZCBsb25nICopU0lDX0lBUjAgKwotCQkJCQkgKGlycW4gPj4gMykpID4+IGlhcl9zaGlmdCkpIHsKKwkJCQkJICgoaXJxbiAlIDMyKSA+PiAzKSArICgoaXJxbiAvIDMyKSAqCisJCQkJCSAoKFNJQ19JQVI0IC0gU0lDX0lBUjApIC8gNCkpKSA+PiBpYXJfc2hpZnQpKSB7CiAjZWxzZQogCQkJICAgICBiZmluX3JlYWQzMigodW5zaWduZWQgbG9uZyAqKVNJQ19JQVIwICsKLQkJCQkJICgoaXJxbiUzMikgPj4gMykgKyAoKGlycW4gLyAzMikgKiAxNikpID4+IGlhcl9zaGlmdCkpIHsKKwkJCQkJIChpcnFuID4+IDMpKSA+PiBpYXJfc2hpZnQpKSB7CiAjZW5kaWYKIAkJCQlpdmdfdGFibGVbaXJxX3Bvc10uaXJxbm8gPSBJVkc3ICsgaXJxbjsKIAkJCQlpdmdfdGFibGVbaXJxX3Bvc10uaXNyZmxhZyA9IDEgPDwgKGlycW4gJSAzMik7CkBAIC0xMzAsMjUgKzEzNywyNSBAQAogCiBzdGF0aWMgdm9pZCBiZmluX2NvcmVfbWFza19pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQlpcnFfZmxhZ3MgJj0gfigxIDw8IGlycSk7Ci0JaWYgKCFpcnFzX2Rpc2FibGVkKCkpCi0JCWxvY2FsX2lycV9lbmFibGUoKTsKKwliZmluX2lycV9mbGFncyAmPSB+KDEgPDwgaXJxKTsKKwlpZiAoIWlycXNfZGlzYWJsZWRfaHcoKSkKKwkJbG9jYWxfaXJxX2VuYWJsZV9odygpOwogfQogCiBzdGF0aWMgdm9pZCBiZmluX2NvcmVfdW5tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCWlycV9mbGFncyB8PSAxIDw8IGlycTsKKwliZmluX2lycV9mbGFncyB8PSAxIDw8IGlycTsKIAkvKgogCSAqIElmIGludGVycnVwdHMgYXJlIGVuYWJsZWQsIElNQVNLIG11c3QgY29udGFpbiB0aGUgc2FtZSB2YWx1ZQotCSAqIGFzIGlycV9mbGFncy4gIE1ha2Ugc3VyZSB0aGF0IGludmFyaWFudCBob2xkcy4gIElmIGludGVycnVwdHMKKwkgKiBhcyBiZmluX2lycV9mbGFncy4gIE1ha2Ugc3VyZSB0aGF0IGludmFyaWFudCBob2xkcy4gIElmIGludGVycnVwdHMKIAkgKiBhcmUgY3VycmVudGx5IGRpc2FibGVkIHdlIG5lZWQgbm90IGRvIGFueXRoaW5nOyBvbmUgb2YgdGhlCiAJICogY2FsbGVycyB3aWxsIHRha2UgY2FyZSBvZiBzZXR0aW5nIElNQVNLIHRvIHRoZSBwcm9wZXIgdmFsdWUKIAkgKiB3aGVuIHJlZW5hYmxpbmcgaW50ZXJydXB0cy4KLQkgKiBsb2NhbF9pcnFfZW5hYmxlIGp1c3QgZG9lcyAiU1RJIGlycV9mbGFncyIsIHNvIGl0J3MgZXhhY3RseQorCSAqIGxvY2FsX2lycV9lbmFibGUganVzdCBkb2VzICJTVEkgYmZpbl9pcnFfZmxhZ3MiLCBzbyBpdCdzIGV4YWN0bHkKIAkgKiB3aGF0IHdlIG5lZWQuCiAJICovCi0JaWYgKCFpcnFzX2Rpc2FibGVkKCkpCi0JCWxvY2FsX2lycV9lbmFibGUoKTsKKwlpZiAoIWlycXNfZGlzYWJsZWRfaHcoKSkKKwkJbG9jYWxfaXJxX2VuYWJsZV9odygpOwogCXJldHVybjsKIH0KIApAQCAtMTYzLDggKzE3MCwxMSBAQAogCW1hc2tfYml0ID0gU0lDX1NZU0lSUShpcnEpICUgMzI7CiAJYmZpbl93cml0ZV9TSUNfSU1BU0sobWFza19iYW5rLCBiZmluX3JlYWRfU0lDX0lNQVNLKG1hc2tfYmFuaykgJgogCQkJICAgICB+KDEgPDwgbWFza19iaXQpKTsKKyNpZmRlZiBDT05GSUdfU01QCisJYmZpbl93cml0ZV9TSUNCX0lNQVNLKG1hc2tfYmFuaywgYmZpbl9yZWFkX1NJQ0JfSU1BU0sobWFza19iYW5rKSAmCisJCQkgICAgIH4oMSA8PCBtYXNrX2JpdCkpOwogI2VuZGlmCi0JU1NZTkMoKTsKKyNlbmRpZgogfQogCiBzdGF0aWMgdm9pZCBiZmluX2ludGVybmFsX3VubWFza19pcnEodW5zaWduZWQgaW50IGlycSkKQEAgLTE3OCwxNCArMTg4LDE3IEBACiAJbWFza19iaXQgPSBTSUNfU1lTSVJRKGlycSkgJSAzMjsKIAliZmluX3dyaXRlX1NJQ19JTUFTSyhtYXNrX2JhbmssIGJmaW5fcmVhZF9TSUNfSU1BU0sobWFza19iYW5rKSB8CiAJCQkgICAgICgxIDw8IG1hc2tfYml0KSk7CisjaWZkZWYgQ09ORklHX1NNUAorCWJmaW5fd3JpdGVfU0lDQl9JTUFTSyhtYXNrX2JhbmssIGJmaW5fcmVhZF9TSUNCX0lNQVNLKG1hc2tfYmFuaykgfAorCQkJICAgICAoMSA8PCBtYXNrX2JpdCkpOwogI2VuZGlmCi0JU1NZTkMoKTsKKyNlbmRpZgogfQogCiAjaWZkZWYgQ09ORklHX1BNCiBpbnQgYmZpbl9pbnRlcm5hbF9zZXRfd2FrZSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgc3RhdGUpCiB7Ci0JdW5zaWduZWQgYmFuaywgYml0LCB3YWtldXAgPSAwOworCXUzMiBiYW5rLCBiaXQsIHdha2V1cCA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAliYW5rID0gU0lDX1NZU0lSUShpcnEpIC8gMzI7CiAJYml0ID0gU0lDX1NZU0lSUShpcnEpICUgMzI7CkBAIC0yMjUsNyArMjM4LDcgQEAKIAlicmVhazsKIAl9CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOwogCiAJaWYgKHN0YXRlKSB7CiAJCWJmaW5fc2ljX2l3cltiYW5rXSB8PSAoMSA8PCBiaXQpOwpAQCAtMjM2LDcgKzI0OSw3IEBACiAJCXZyX3dha2V1cCAgJj0gfndha2V1cDsKIAl9CiAKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yNjIsNiArMjc1LDE5IEBACiAjZW5kaWYKIH07CiAKK3N0YXRpYyB2b2lkIGJmaW5faGFuZGxlX2lycSh1bnNpZ25lZCBpcnEpCit7CisjaWZkZWYgQ09ORklHX0lQSVBFCisJc3RydWN0IHB0X3JlZ3MgcmVnczsgICAgLyogQ29udGVudHMgbm90IHVzZWQuICovCisJaXBpcGVfdHJhY2VfaXJxX2VudHJ5KGlycSk7CisJX19pcGlwZV9oYW5kbGVfaXJxKGlycSwgJnJlZ3MpOworCWlwaXBlX3RyYWNlX2lycV9leGl0KGlycSk7CisjZWxzZSAvKiAhQ09ORklHX0lQSVBFICovCisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CisJZGVzYy0+aGFuZGxlX2lycShpcnEsIGRlc2MpOworI2VuZGlmICAvKiAhQ09ORklHX0lQSVBFICovCit9CisKICNpZmRlZiBCRjUzN19HRU5FUklDX0VSUk9SX0lOVF9ERU1VWAogc3RhdGljIGludCBlcnJvcl9pbnRfbWFzazsKIApAQCAtMjkyLDggKzMxOCw2IEBACiB7CiAJaW50IGlycSA9IDA7CiAKLQlTU1lOQygpOwotCiAjaWYgKGRlZmluZWQoQ09ORklHX0JGNTM3KSB8fCBkZWZpbmVkKENPTkZJR19CRjUzNikpCiAJaWYgKGJmaW5fcmVhZF9FTUFDX1NZU1RBVCgpICYgRU1BQ19FUlJfTUFTSykKIAkJaXJxID0gSVJRX01BQ19FUlJPUjsKQEAgLTMxNywxMCArMzQxLDkgQEAKIAkJaXJxID0gSVJRX1VBUlQxX0VSUk9SOwogCiAJaWYgKGlycSkgewotCQlpZiAoZXJyb3JfaW50X21hc2sgJiAoMUwgPDwgKGlycSAtIElSUV9QUElfRVJST1IpKSkgewotCQkJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX2Rlc2MgKyBpcnE7Ci0JCQlkZXNjLT5oYW5kbGVfaXJxKGlycSwgZGVzYyk7Ci0JCX0gZWxzZSB7CisJCWlmIChlcnJvcl9pbnRfbWFzayAmICgxTCA8PCAoaXJxIC0gSVJRX1BQSV9FUlJPUikpKQorCQkJYmZpbl9oYW5kbGVfaXJxKGlycSk7CisJCWVsc2UgewogCiAJCQlzd2l0Y2ggKGlycSkgewogCQkJY2FzZSBJUlFfUFBJX0VSUk9SOgpAQCAtMzY2LDYyICszODksNTcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGJmaW5fc2V0X2lycV9oYW5kbGVyKHVuc2lnbmVkIGlycSwgaXJxX2Zsb3dfaGFuZGxlcl90IGhhbmRsZSkKIHsKKyNpZmRlZiBDT05GSUdfSVBJUEUKKwlfc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX2VkZ2VfaXJxKTsKKyNlbHNlCiAJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CiAJLyogTWF5IG5vdCBjYWxsIGdlbmVyaWMgc2V0X2lycV9oYW5kbGVyKCkgZHVlIHRvIHNwaW5sb2NrCiAJICAgcmVjdXJzaW9uLiAqLwogCWRlc2MtPmhhbmRsZV9pcnEgPSBoYW5kbGU7CisjZW5kaWYKIH0KIAorc3RhdGljIERFQ0xBUkVfQklUTUFQKGdwaW9fZW5hYmxlZCwgTUFYX0JMQUNLRklOX0dQSU9TKTsKK2V4dGVybiB2b2lkIGJmaW5fZ3Bpb19pcnFfcHJlcGFyZSh1bnNpZ25lZCBncGlvKTsKKwogI2lmICFkZWZpbmVkKENPTkZJR19CRjU0eCkKIAotc3RhdGljIHVuc2lnbmVkIHNob3J0IGdwaW9fZW5hYmxlZFtncGlvX2JhbmsoTUFYX0JMQUNLRklOX0dQSU9TKV07Ci1zdGF0aWMgdW5zaWduZWQgc2hvcnQgZ3Bpb19lZGdlX3RyaWdnZXJlZFtncGlvX2JhbmsoTUFYX0JMQUNLRklOX0dQSU9TKV07Ci0KLWV4dGVybiB2b2lkIGJmaW5fZ3Bpb19pcnFfcHJlcGFyZSh1bnNpZ25lZCBncGlvKTsKLQogc3RhdGljIHZvaWQgYmZpbl9ncGlvX2Fja19pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQl1MTYgZ3Bpb25yID0gaXJxIC0gSVJRX1BGMDsKLQotCWlmIChncGlvX2VkZ2VfdHJpZ2dlcmVkW2dwaW9fYmFuayhncGlvbnIpXSAmIGdwaW9fYml0KGdwaW9ucikpIHsKLQkJc2V0X2dwaW9fZGF0YShncGlvbnIsIDApOwotCQlTU1lOQygpOwotCX0KKwkvKiBBRkFJSyBhY2tfaXJxIGluIGNhc2UgbWFza19hY2sgaXMgcHJvdmlkZWQKKwkgKiBnZXQncyBvbmx5IGNhbGxlZCBmb3IgZWRnZSBzZW5zZSBpcnFzCisJICovCisJc2V0X2dwaW9fZGF0YShpcnFfdG9fZ3BpbyhpcnEpLCAwKTsKIH0KIAogc3RhdGljIHZvaWQgYmZpbl9ncGlvX21hc2tfYWNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXUxNiBncGlvbnIgPSBpcnEgLSBJUlFfUEYwOworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV9kZXNjICsgaXJxOworCXUzMiBncGlvbnIgPSBpcnFfdG9fZ3BpbyhpcnEpOwogCi0JaWYgKGdwaW9fZWRnZV90cmlnZ2VyZWRbZ3Bpb19iYW5rKGdwaW9ucildICYgZ3Bpb19iaXQoZ3Bpb25yKSkgeworCWlmIChkZXNjLT5oYW5kbGVfaXJxID09IGhhbmRsZV9lZGdlX2lycSkKIAkJc2V0X2dwaW9fZGF0YShncGlvbnIsIDApOwotCQlTU1lOQygpOwotCX0KIAogCXNldF9ncGlvX21hc2thKGdwaW9uciwgMCk7Ci0JU1NZTkMoKTsKIH0KIAogc3RhdGljIHZvaWQgYmZpbl9ncGlvX21hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0Jc2V0X2dwaW9fbWFza2EoaXJxIC0gSVJRX1BGMCwgMCk7Ci0JU1NZTkMoKTsKKwlzZXRfZ3Bpb19tYXNrYShpcnFfdG9fZ3BpbyhpcnEpLCAwKTsKIH0KIAogc3RhdGljIHZvaWQgYmZpbl9ncGlvX3VubWFza19pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQlzZXRfZ3Bpb19tYXNrYShpcnEgLSBJUlFfUEYwLCAxKTsKLQlTU1lOQygpOworCXNldF9ncGlvX21hc2thKGlycV90b19ncGlvKGlycSksIDEpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IGJmaW5fZ3Bpb19pcnFfc3RhcnR1cCh1bnNpZ25lZCBpbnQgaXJxKQogewotCXUxNiBncGlvbnIgPSBpcnEgLSBJUlFfUEYwOworCXUzMiBncGlvbnIgPSBpcnFfdG9fZ3BpbyhpcnEpOwogCi0JaWYgKCEoZ3Bpb19lbmFibGVkW2dwaW9fYmFuayhncGlvbnIpXSAmIGdwaW9fYml0KGdwaW9ucikpKQorCWlmIChfX3Rlc3RfYW5kX3NldF9iaXQoZ3Bpb25yLCBncGlvX2VuYWJsZWQpKQogCQliZmluX2dwaW9faXJxX3ByZXBhcmUoZ3Bpb25yKTsKIAotCWdwaW9fZW5hYmxlZFtncGlvX2JhbmsoZ3Bpb25yKV0gfD0gZ3Bpb19iaXQoZ3Bpb25yKTsKIAliZmluX2dwaW9fdW5tYXNrX2lycShpcnEpOwogCiAJcmV0dXJuIDA7CkBAIC00MjksMjkgKzQ0NywzOSBAQAogCiBzdGF0aWMgdm9pZCBiZmluX2dwaW9faXJxX3NodXRkb3duKHVuc2lnbmVkIGludCBpcnEpCiB7CisJdTMyIGdwaW9uciA9IGlycV90b19ncGlvKGlycSk7CisKIAliZmluX2dwaW9fbWFza19pcnEoaXJxKTsKLQlncGlvX2VuYWJsZWRbZ3Bpb19iYW5rKGlycSAtIElSUV9QRjApXSAmPSB+Z3Bpb19iaXQoaXJxIC0gSVJRX1BGMCk7CisJX19jbGVhcl9iaXQoZ3Bpb25yLCBncGlvX2VuYWJsZWQpOworCWJmaW5fZ3Bpb19pcnFfZnJlZShncGlvbnIpOwogfQogCiBzdGF0aWMgaW50IGJmaW5fZ3Bpb19pcnFfdHlwZSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgdHlwZSkKIHsKLQl1MTYgZ3Bpb25yID0gaXJxIC0gSVJRX1BGMDsKKwlpbnQgcmV0OworCWNoYXIgYnVmWzE2XTsKKwl1MzIgZ3Bpb25yID0gaXJxX3RvX2dwaW8oaXJxKTsKIAogCWlmICh0eXBlID09IElSUV9UWVBFX1BST0JFKSB7CiAJCS8qIG9ubHkgcHJvYmUgdW5lbmFibGVkIEdQSU8gaW50ZXJydXB0IGxpbmVzICovCi0JCWlmIChncGlvX2VuYWJsZWRbZ3Bpb19iYW5rKGdwaW9ucildICYgZ3Bpb19iaXQoZ3Bpb25yKSkKKwkJaWYgKF9fdGVzdF9iaXQoZ3Bpb25yLCBncGlvX2VuYWJsZWQpKQogCQkJcmV0dXJuIDA7CiAJCXR5cGUgPSBJUlFfVFlQRV9FREdFX1JJU0lORyB8IElSUV9UWVBFX0VER0VfRkFMTElORzsKIAl9CiAKIAlpZiAodHlwZSAmIChJUlFfVFlQRV9FREdFX1JJU0lORyB8IElSUV9UWVBFX0VER0VfRkFMTElORyB8CiAJCSAgICBJUlFfVFlQRV9MRVZFTF9ISUdIIHwgSVJRX1RZUEVfTEVWRUxfTE9XKSkgewotCQlpZiAoIShncGlvX2VuYWJsZWRbZ3Bpb19iYW5rKGdwaW9ucildICYgZ3Bpb19iaXQoZ3Bpb25yKSkpCisKKwkJc25wcmludGYoYnVmLCAxNiwgImdwaW8taXJxJWQiLCBpcnEpOworCQlyZXQgPSBiZmluX2dwaW9faXJxX3JlcXVlc3QoZ3Bpb25yLCBidWYpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlpZiAoX190ZXN0X2FuZF9zZXRfYml0KGdwaW9uciwgZ3Bpb19lbmFibGVkKSkKIAkJCWJmaW5fZ3Bpb19pcnFfcHJlcGFyZShncGlvbnIpOwogCi0JCWdwaW9fZW5hYmxlZFtncGlvX2JhbmsoZ3Bpb25yKV0gfD0gZ3Bpb19iaXQoZ3Bpb25yKTsKIAl9IGVsc2UgewotCQlncGlvX2VuYWJsZWRbZ3Bpb19iYW5rKGdwaW9ucildICY9IH5ncGlvX2JpdChncGlvbnIpOworCQlfX2NsZWFyX2JpdChncGlvbnIsIGdwaW9fZW5hYmxlZCk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtNDcyLDE3ICs1MDAsMTMgQEAKIAlpZiAodHlwZSAmIChJUlFfVFlQRV9FREdFX1JJU0lORyB8IElSUV9UWVBFX0VER0VfRkFMTElORykpIHsKIAkJc2V0X2dwaW9fZWRnZShncGlvbnIsIDEpOwogCQlzZXRfZ3Bpb19pbmVuKGdwaW9uciwgMSk7Ci0JCWdwaW9fZWRnZV90cmlnZ2VyZWRbZ3Bpb19iYW5rKGdwaW9ucildIHw9IGdwaW9fYml0KGdwaW9ucik7CiAJCXNldF9ncGlvX2RhdGEoZ3Bpb25yLCAwKTsKIAogCX0gZWxzZSB7CiAJCXNldF9ncGlvX2VkZ2UoZ3Bpb25yLCAwKTsKLQkJZ3Bpb19lZGdlX3RyaWdnZXJlZFtncGlvX2JhbmsoZ3Bpb25yKV0gJj0gfmdwaW9fYml0KGdwaW9ucik7CiAJCXNldF9ncGlvX2luZW4oZ3Bpb25yLCAxKTsKIAl9CiAKLQlTU1lOQygpOwotCiAJaWYgKHR5cGUgJiAoSVJRX1RZUEVfRURHRV9SSVNJTkcgfCBJUlFfVFlQRV9FREdFX0ZBTExJTkcpKQogCQliZmluX3NldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9lZGdlX2lycSk7CiAJZWxzZQpAQCAtNTA1LDIyICs1MjksNiBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgYmZpbl9ncGlvX2lycWNoaXAgPSB7Ci0JLm5hbWUgPSAiR1BJTyIsCi0JLmFjayA9IGJmaW5fZ3Bpb19hY2tfaXJxLAotCS5tYXNrID0gYmZpbl9ncGlvX21hc2tfaXJxLAotCS5tYXNrX2FjayA9IGJmaW5fZ3Bpb19tYXNrX2Fja19pcnEsCi0JLnVubWFzayA9IGJmaW5fZ3Bpb191bm1hc2tfaXJxLAotCS5kaXNhYmxlID0gYmZpbl9ncGlvX21hc2tfaXJxLAotCS5lbmFibGUgPSBiZmluX2dwaW9fdW5tYXNrX2lycSwKLQkuc2V0X3R5cGUgPSBiZmluX2dwaW9faXJxX3R5cGUsCi0JLnN0YXJ0dXAgPSBiZmluX2dwaW9faXJxX3N0YXJ0dXAsCi0JLnNodXRkb3duID0gYmZpbl9ncGlvX2lycV9zaHV0ZG93biwKLSNpZmRlZiBDT05GSUdfUE0KLQkuc2V0X3dha2UgPSBiZmluX2dwaW9fc2V0X3dha2UsCi0jZW5kaWYKLX07Ci0KIHN0YXRpYyB2b2lkIGJmaW5fZGVtdXhfZ3Bpb19pcnEodW5zaWduZWQgaW50IGludGFfaXJxLAogCQkJCXN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsKQEAgLTUzNyw3ICs1NDUsMTEgQEAKIAkJaXJxID0gSVJRX1BIMDsKIAkJYnJlYWs7CiAjIGVuZGlmCi0jZWxpZiBkZWZpbmVkKENPTkZJR19CRjUyeCkKKyNlbGlmIGRlZmluZWQoQ09ORklHX0JGNTM4KSB8fCBkZWZpbmVkKENPTkZJR19CRjUzOSkKKwljYXNlIElSUV9QT1JURl9JTlRBOgorCQlpcnEgPSBJUlFfUEYwOworCQlicmVhazsKKyNlbGlmIGRlZmluZWQoQ09ORklHX0JGNTJ4KSB8fCBkZWZpbmVkKENPTkZJR19CRjUxeCkKIAljYXNlIElSUV9QT1JURl9JTlRBOgogCQlpcnEgPSBJUlFfUEYwOwogCQlicmVhazsKQEAgLTU2NywzMCArNTc5LDIyIEBACiAJCWZvciAoaSA9IDA7IGkgPCBNQVhfQkxBQ0tGSU5fR1BJT1M7IGkgKz0gR1BJT19CQU5LU0laRSkgewogCQkJaXJxICs9IGk7CiAKLQkJCW1hc2sgPSBnZXRfZ3Bpb3BfZGF0YShpKSAmCi0JCQkJKGdwaW9fZW5hYmxlZFtncGlvX2JhbmsoaSldICYKLQkJCQlnZXRfZ3Bpb3BfbWFza2EoaSkpOworCQkJbWFzayA9IGdldF9ncGlvcF9kYXRhKGkpICYgZ2V0X2dwaW9wX21hc2thKGkpOwogCiAJCQl3aGlsZSAobWFzaykgewotCQkJCWlmIChtYXNrICYgMSkgewotCQkJCQlkZXNjID0gaXJxX2Rlc2MgKyBpcnE7Ci0JCQkJCWRlc2MtPmhhbmRsZV9pcnEoaXJxLCBkZXNjKTsKLQkJCQl9CisJCQkJaWYgKG1hc2sgJiAxKQorCQkJCQliZmluX2hhbmRsZV9pcnEoaXJxKTsKIAkJCQlpcnErKzsKIAkJCQltYXNrID4+PSAxOwogCQkJfQogCQl9CiAJfSBlbHNlIHsKIAkJCWdwaW8gPSBpcnFfdG9fZ3BpbyhpcnEpOwotCQkJbWFzayA9IGdldF9ncGlvcF9kYXRhKGdwaW8pICYKLQkJCQkoZ3Bpb19lbmFibGVkW2dwaW9fYmFuayhncGlvKV0gJgotCQkJCWdldF9ncGlvcF9tYXNrYShncGlvKSk7CisJCQltYXNrID0gZ2V0X2dwaW9wX2RhdGEoZ3BpbykgJiBnZXRfZ3Bpb3BfbWFza2EoZ3Bpbyk7CiAKIAkJCWRvIHsKLQkJCQlpZiAobWFzayAmIDEpIHsKLQkJCQkJZGVzYyA9IGlycV9kZXNjICsgaXJxOwotCQkJCQlkZXNjLT5oYW5kbGVfaXJxKGlycSwgZGVzYyk7Ci0JCQkJfQorCQkJCWlmIChtYXNrICYgMSkKKwkJCQkJYmZpbl9oYW5kbGVfaXJxKGlycSk7CiAJCQkJaXJxKys7CiAJCQkJbWFzayA+Pj0gMTsKIAkJCX0gd2hpbGUgKG1hc2spOwpAQCAtNjEyLDEwICs2MTYsNiBAQAogc3RhdGljIHVuc2lnbmVkIGNoYXIgaXJxMnBpbnRfbHV0W05SX1BJTlRTXTsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHBpbnQyaXJxX2x1dFtOUl9QSU5UX1NZU19JUlFTICogTlJfUElOVF9CSVRTXTsKIAotc3RhdGljIHVuc2lnbmVkIGludCBncGlvX2JvdGhfZWRnZV90cmlnZ2VyZWRbTlJfUElOVF9TWVNfSVJRU107Ci1zdGF0aWMgdW5zaWduZWQgc2hvcnQgZ3Bpb19lbmFibGVkW2dwaW9fYmFuayhNQVhfQkxBQ0tGSU5fR1BJT1MpXTsKLQotCiBzdHJ1Y3QgcGluX2ludF90IHsKIAl1bnNpZ25lZCBpbnQgbWFza19zZXQ7CiAJdW5zaWduZWQgaW50IG1hc2tfY2xlYXI7CkBAIC02MzYsMTIgKzYzNiw5IEBACiAJKHN0cnVjdCBwaW5faW50X3QgKilQSU5UM19NQVNLX1NFVCwKIH07CiAKLWV4dGVybiB2b2lkIGJmaW5fZ3Bpb19pcnFfcHJlcGFyZSh1bnNpZ25lZCBncGlvKTsKLQotaW5saW5lIHVuc2lnbmVkIHNob3J0IGdldF9pcnFfYmFzZSh1OCBiYW5rLCB1OCBibWFwKQoraW5saW5lIHVuc2lnbmVkIGludCBnZXRfaXJxX2Jhc2UodTMyIGJhbmssIHU4IGJtYXApCiB7Ci0KLQl1MTYgaXJxX2Jhc2U7CisJdW5zaWduZWQgaW50IGlycV9iYXNlOwogCiAJaWYgKGJhbmsgPCAyKSB7CQkvKlBBLVBCICovCiAJCWlycV9iYXNlID0gSVJRX1BBMCArIGJtYXAgKiAxNjsKQEAgLTY1MCw3ICs2NDcsNiBAQAogCX0KIAogCXJldHVybiBpcnFfYmFzZTsKLQogfQogCiAJLyogV2hlbmV2ZXIgUElOVHhfQVNTSUdOIGlzIGFsdGVyZWQgaW5pdF9waW50X2x1dCgpIG11c3QgYmUgZXhlY3V0ZWQhICovCkBAIC02NzcsMjAgKzY3MywxOCBAQAogCiAJCQlwaW50MmlycV9sdXRbYml0X3Bvc10gPSBpcnFfYmFzZSAtIFNZU19JUlFTOwogCQkJaXJxMnBpbnRfbHV0W2lycV9iYXNlIC0gU1lTX0lSUVNdID0gYml0X3BvczsKLQogCQl9Ci0KIAl9Ci0KIH0KIAogc3RhdGljIHZvaWQgYmZpbl9ncGlvX2Fja19pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQl1OCBwaW50X3ZhbCA9IGlycTJwaW50X2x1dFtpcnEgLSBTWVNfSVJRU107CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CisJdTMyIHBpbnRfdmFsID0gaXJxMnBpbnRfbHV0W2lycSAtIFNZU19JUlFTXTsKIAl1MzIgcGludGJpdCA9IFBJTlRfQklUKHBpbnRfdmFsKTsKLQl1OCBiYW5rID0gUElOVF8yX0JBTksocGludF92YWwpOworCXUzMiBiYW5rID0gUElOVF8yX0JBTksocGludF92YWwpOwogCi0JaWYgKHVubGlrZWx5KGdwaW9fYm90aF9lZGdlX3RyaWdnZXJlZFtiYW5rXSAmIHBpbnRiaXQpKSB7CisJaWYgKChkZXNjLT5zdGF0dXMgJiBJUlFfVFlQRV9TRU5TRV9NQVNLKSA9PSBJUlFfVFlQRV9FREdFX0JPVEgpIHsKIAkJaWYgKHBpbnRbYmFua10tPmludmVydF9zZXQgJiBwaW50Yml0KQogCQkJcGludFtiYW5rXS0+aW52ZXJ0X2NsZWFyID0gcGludGJpdDsKIAkJZWxzZQpAQCAtNjk4LDE2ICs2OTIsMTYgQEAKIAl9CiAJcGludFtiYW5rXS0+cmVxdWVzdCA9IHBpbnRiaXQ7CiAKLQlTU1lOQygpOwogfQogCiBzdGF0aWMgdm9pZCBiZmluX2dwaW9fbWFza19hY2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdTggcGludF92YWwgPSBpcnEycGludF9sdXRbaXJxIC0gU1lTX0lSUVNdOworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV9kZXNjICsgaXJxOworCXUzMiBwaW50X3ZhbCA9IGlycTJwaW50X2x1dFtpcnEgLSBTWVNfSVJRU107CiAJdTMyIHBpbnRiaXQgPSBQSU5UX0JJVChwaW50X3ZhbCk7Ci0JdTggYmFuayA9IFBJTlRfMl9CQU5LKHBpbnRfdmFsKTsKKwl1MzIgYmFuayA9IFBJTlRfMl9CQU5LKHBpbnRfdmFsKTsKIAotCWlmICh1bmxpa2VseShncGlvX2JvdGhfZWRnZV90cmlnZ2VyZWRbYmFua10gJiBwaW50Yml0KSkgeworCWlmICgoZGVzYy0+c3RhdHVzICYgSVJRX1RZUEVfU0VOU0VfTUFTSykgPT0gSVJRX1RZUEVfRURHRV9CT1RIKSB7CiAJCWlmIChwaW50W2JhbmtdLT5pbnZlcnRfc2V0ICYgcGludGJpdCkKIAkJCXBpbnRbYmFua10tPmludmVydF9jbGVhciA9IHBpbnRiaXQ7CiAJCWVsc2UKQEAgLTcxNiwzMiArNzEwLDI5IEBACiAKIAlwaW50W2JhbmtdLT5yZXF1ZXN0ID0gcGludGJpdDsKIAlwaW50W2JhbmtdLT5tYXNrX2NsZWFyID0gcGludGJpdDsKLQlTU1lOQygpOwogfQogCiBzdGF0aWMgdm9pZCBiZmluX2dwaW9fbWFza19pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQl1OCBwaW50X3ZhbCA9IGlycTJwaW50X2x1dFtpcnEgLSBTWVNfSVJRU107CisJdTMyIHBpbnRfdmFsID0gaXJxMnBpbnRfbHV0W2lycSAtIFNZU19JUlFTXTsKIAogCXBpbnRbUElOVF8yX0JBTksocGludF92YWwpXS0+bWFza19jbGVhciA9IFBJTlRfQklUKHBpbnRfdmFsKTsKLQlTU1lOQygpOwogfQogCiBzdGF0aWMgdm9pZCBiZmluX2dwaW9fdW5tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXU4IHBpbnRfdmFsID0gaXJxMnBpbnRfbHV0W2lycSAtIFNZU19JUlFTXTsKKwl1MzIgcGludF92YWwgPSBpcnEycGludF9sdXRbaXJxIC0gU1lTX0lSUVNdOwogCXUzMiBwaW50Yml0ID0gUElOVF9CSVQocGludF92YWwpOwotCXU4IGJhbmsgPSBQSU5UXzJfQkFOSyhwaW50X3ZhbCk7CisJdTMyIGJhbmsgPSBQSU5UXzJfQkFOSyhwaW50X3ZhbCk7CiAKIAlwaW50W2JhbmtdLT5yZXF1ZXN0ID0gcGludGJpdDsKIAlwaW50W2JhbmtdLT5tYXNrX3NldCA9IHBpbnRiaXQ7Ci0JU1NZTkMoKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBiZmluX2dwaW9faXJxX3N0YXJ0dXAodW5zaWduZWQgaW50IGlycSkKIHsKLQl1MTYgZ3Bpb25yID0gaXJxX3RvX2dwaW8oaXJxKTsKLQl1OCBwaW50X3ZhbCA9IGlycTJwaW50X2x1dFtpcnEgLSBTWVNfSVJRU107CisJdTMyIGdwaW9uciA9IGlycV90b19ncGlvKGlycSk7CisJdTMyIHBpbnRfdmFsID0gaXJxMnBpbnRfbHV0W2lycSAtIFNZU19JUlFTXTsKIAogCWlmIChwaW50X3ZhbCA9PSBJUlFfTk9UX0FWQUlMKSB7CiAJCXByaW50ayhLRVJOX0VSUgpAQCAtNzUwLDEwICs3NDEsOSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlpZiAoIShncGlvX2VuYWJsZWRbZ3Bpb19iYW5rKGdwaW9ucildICYgZ3Bpb19iaXQoZ3Bpb25yKSkpCisJaWYgKF9fdGVzdF9hbmRfc2V0X2JpdChncGlvbnIsIGdwaW9fZW5hYmxlZCkpCiAJCWJmaW5fZ3Bpb19pcnFfcHJlcGFyZShncGlvbnIpOwogCi0JZ3Bpb19lbmFibGVkW2dwaW9fYmFuayhncGlvbnIpXSB8PSBncGlvX2JpdChncGlvbnIpOwogCWJmaW5fZ3Bpb191bm1hc2tfaXJxKGlycSk7CiAKIAlyZXR1cm4gMDsKQEAgLTc2MSwzOCArNzUxLDQ1IEBACiAKIHN0YXRpYyB2b2lkIGJmaW5fZ3Bpb19pcnFfc2h1dGRvd24odW5zaWduZWQgaW50IGlycSkKIHsKLQl1MTYgZ3Bpb25yID0gaXJxX3RvX2dwaW8oaXJxKTsKKwl1MzIgZ3Bpb25yID0gaXJxX3RvX2dwaW8oaXJxKTsKIAogCWJmaW5fZ3Bpb19tYXNrX2lycShpcnEpOwotCWdwaW9fZW5hYmxlZFtncGlvX2JhbmsoZ3Bpb25yKV0gJj0gfmdwaW9fYml0KGdwaW9ucik7CisJX19jbGVhcl9iaXQoZ3Bpb25yLCBncGlvX2VuYWJsZWQpOworCWJmaW5fZ3Bpb19pcnFfZnJlZShncGlvbnIpOwogfQogCiBzdGF0aWMgaW50IGJmaW5fZ3Bpb19pcnFfdHlwZSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgdHlwZSkKIHsKLQotCXUxNiBncGlvbnIgPSBpcnFfdG9fZ3BpbyhpcnEpOwotCXU4IHBpbnRfdmFsID0gaXJxMnBpbnRfbHV0W2lycSAtIFNZU19JUlFTXTsKKwlpbnQgcmV0OworCWNoYXIgYnVmWzE2XTsKKwl1MzIgZ3Bpb25yID0gaXJxX3RvX2dwaW8oaXJxKTsKKwl1MzIgcGludF92YWwgPSBpcnEycGludF9sdXRbaXJxIC0gU1lTX0lSUVNdOwogCXUzMiBwaW50Yml0ID0gUElOVF9CSVQocGludF92YWwpOwotCXU4IGJhbmsgPSBQSU5UXzJfQkFOSyhwaW50X3ZhbCk7CisJdTMyIGJhbmsgPSBQSU5UXzJfQkFOSyhwaW50X3ZhbCk7CiAKIAlpZiAocGludF92YWwgPT0gSVJRX05PVF9BVkFJTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpZiAodHlwZSA9PSBJUlFfVFlQRV9QUk9CRSkgewogCQkvKiBvbmx5IHByb2JlIHVuZW5hYmxlZCBHUElPIGludGVycnVwdCBsaW5lcyAqLwotCQlpZiAoZ3Bpb19lbmFibGVkW2dwaW9fYmFuayhncGlvbnIpXSAmIGdwaW9fYml0KGdwaW9ucikpCisJCWlmIChfX3Rlc3RfYml0KGdwaW9uciwgZ3Bpb19lbmFibGVkKSkKIAkJCXJldHVybiAwOwogCQl0eXBlID0gSVJRX1RZUEVfRURHRV9SSVNJTkcgfCBJUlFfVFlQRV9FREdFX0ZBTExJTkc7CiAJfQogCiAJaWYgKHR5cGUgJiAoSVJRX1RZUEVfRURHRV9SSVNJTkcgfCBJUlFfVFlQRV9FREdFX0ZBTExJTkcgfAogCQkgICAgSVJRX1RZUEVfTEVWRUxfSElHSCB8IElSUV9UWVBFX0xFVkVMX0xPVykpIHsKLQkJaWYgKCEoZ3Bpb19lbmFibGVkW2dwaW9fYmFuayhncGlvbnIpXSAmIGdwaW9fYml0KGdwaW9ucikpKQorCisJCXNucHJpbnRmKGJ1ZiwgMTYsICJncGlvLWlycSVkIiwgaXJxKTsKKwkJcmV0ID0gYmZpbl9ncGlvX2lycV9yZXF1ZXN0KGdwaW9uciwgYnVmKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJaWYgKF9fdGVzdF9hbmRfc2V0X2JpdChncGlvbnIsIGdwaW9fZW5hYmxlZCkpCiAJCQliZmluX2dwaW9faXJxX3ByZXBhcmUoZ3Bpb25yKTsKIAotCQlncGlvX2VuYWJsZWRbZ3Bpb19iYW5rKGdwaW9ucildIHw9IGdwaW9fYml0KGdwaW9ucik7CiAJfSBlbHNlIHsKLQkJZ3Bpb19lbmFibGVkW2dwaW9fYmFuayhncGlvbnIpXSAmPSB+Z3Bpb19iaXQoZ3Bpb25yKTsKKwkJX19jbGVhcl9iaXQoZ3Bpb25yLCBncGlvX2VuYWJsZWQpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTgwMywxNSArODAwLDEwIEBACiAKIAlpZiAoKHR5cGUgJiAoSVJRX1RZUEVfRURHRV9SSVNJTkcgfCBJUlFfVFlQRV9FREdFX0ZBTExJTkcpKQogCSAgICA9PSAoSVJRX1RZUEVfRURHRV9SSVNJTkcgfCBJUlFfVFlQRV9FREdFX0ZBTExJTkcpKSB7Ci0KLQkJZ3Bpb19ib3RoX2VkZ2VfdHJpZ2dlcmVkW2JhbmtdIHw9IHBpbnRiaXQ7Ci0KIAkJaWYgKGdwaW9fZ2V0X3ZhbHVlKGdwaW9ucikpCiAJCQlwaW50W2JhbmtdLT5pbnZlcnRfc2V0ID0gcGludGJpdDsKIAkJZWxzZQogCQkJcGludFtiYW5rXS0+aW52ZXJ0X2NsZWFyID0gcGludGJpdDsKLQl9IGVsc2UgewotCQlncGlvX2JvdGhfZWRnZV90cmlnZ2VyZWRbYmFua10gJj0gfnBpbnRiaXQ7CiAJfQogCiAJaWYgKHR5cGUgJiAoSVJRX1RZUEVfRURHRV9SSVNJTkcgfCBJUlFfVFlQRV9FREdFX0ZBTExJTkcpKSB7CkBAIC04MjIsOCArODE0LDYgQEAKIAkJYmZpbl9zZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfbGV2ZWxfaXJxKTsKIAl9CiAKLQlTU1lOQygpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTgzNCw3ICs4MjQsNyBAQAogaW50IGJmaW5fZ3Bpb19zZXRfd2FrZSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgc3RhdGUpCiB7CiAJdTMyIHBpbnRfaXJxOwotCXU4IHBpbnRfdmFsID0gaXJxMnBpbnRfbHV0W2lycSAtIFNZU19JUlFTXTsKKwl1MzIgcGludF92YWwgPSBpcnEycGludF9sdXRbaXJxIC0gU1lTX0lSUVNdOwogCXUzMiBiYW5rID0gUElOVF8yX0JBTksocGludF92YWwpOwogCXUzMiBwaW50Yml0ID0gUElOVF9CSVQocGludF92YWwpOwogCkBAIC04OTUsMjYgKzg4NSwxMCBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgYmZpbl9ncGlvX2lycWNoaXAgPSB7Ci0JLm5hbWUgPSAiR1BJTyIsCi0JLmFjayA9IGJmaW5fZ3Bpb19hY2tfaXJxLAotCS5tYXNrID0gYmZpbl9ncGlvX21hc2tfaXJxLAotCS5tYXNrX2FjayA9IGJmaW5fZ3Bpb19tYXNrX2Fja19pcnEsCi0JLnVubWFzayA9IGJmaW5fZ3Bpb191bm1hc2tfaXJxLAotCS5kaXNhYmxlID0gYmZpbl9ncGlvX21hc2tfaXJxLAotCS5lbmFibGUgPSBiZmluX2dwaW9fdW5tYXNrX2lycSwKLQkuc2V0X3R5cGUgPSBiZmluX2dwaW9faXJxX3R5cGUsCi0JLnN0YXJ0dXAgPSBiZmluX2dwaW9faXJxX3N0YXJ0dXAsCi0JLnNodXRkb3duID0gYmZpbl9ncGlvX2lycV9zaHV0ZG93biwKLSNpZmRlZiBDT05GSUdfUE0KLQkuc2V0X3dha2UgPSBiZmluX2dwaW9fc2V0X3dha2UsCi0jZW5kaWYKLX07Ci0KIHN0YXRpYyB2b2lkIGJmaW5fZGVtdXhfZ3Bpb19pcnEodW5zaWduZWQgaW50IGludGFfaXJxLAogCQkJCXN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsKLQl1OCBiYW5rLCBwaW50X3ZhbDsKKwl1MzIgYmFuaywgcGludF92YWw7CiAJdTMyIHJlcXVlc3QsIGlycTsKIAogCXN3aXRjaCAoaW50YV9pcnEpIHsKQEAgLTk0MSw4ICs5MTUsNyBAQAogCXdoaWxlIChyZXF1ZXN0KSB7CiAJCWlmIChyZXF1ZXN0ICYgMSkgewogCQkJaXJxID0gcGludDJpcnFfbHV0W3BpbnRfdmFsXSArIFNZU19JUlFTOwotCQkJZGVzYyA9IGlycV9kZXNjICsgaXJxOwotCQkJZGVzYy0+aGFuZGxlX2lycShpcnEsIGRlc2MpOworCQkJYmZpbl9oYW5kbGVfaXJxKGlycSk7CiAJCX0KIAkJcGludF92YWwrKzsKIAkJcmVxdWVzdCA+Pj0gMTsKQEAgLTk1MSwxMCArOTI0LDI0IEBACiB9CiAjZW5kaWYKIAotdm9pZCBfX2luaXQgaW5pdF9leGNlcHRpb25fdmVjdG9ycyh2b2lkKQotewotCVNTWU5DKCk7CitzdGF0aWMgc3RydWN0IGlycV9jaGlwIGJmaW5fZ3Bpb19pcnFjaGlwID0geworCS5uYW1lID0gIkdQSU8iLAorCS5hY2sgPSBiZmluX2dwaW9fYWNrX2lycSwKKwkubWFzayA9IGJmaW5fZ3Bpb19tYXNrX2lycSwKKwkubWFza19hY2sgPSBiZmluX2dwaW9fbWFza19hY2tfaXJxLAorCS51bm1hc2sgPSBiZmluX2dwaW9fdW5tYXNrX2lycSwKKwkuZGlzYWJsZSA9IGJmaW5fZ3Bpb19tYXNrX2lycSwKKwkuZW5hYmxlID0gYmZpbl9ncGlvX3VubWFza19pcnEsCisJLnNldF90eXBlID0gYmZpbl9ncGlvX2lycV90eXBlLAorCS5zdGFydHVwID0gYmZpbl9ncGlvX2lycV9zdGFydHVwLAorCS5zaHV0ZG93biA9IGJmaW5fZ3Bpb19pcnFfc2h1dGRvd24sCisjaWZkZWYgQ09ORklHX1BNCisJLnNldF93YWtlID0gYmZpbl9ncGlvX3NldF93YWtlLAorI2VuZGlmCit9OwogCit2b2lkIF9fY3B1aW5pdCBpbml0X2V4Y2VwdGlvbl92ZWN0b3JzKHZvaWQpCit7CiAJLyogY2Fubm90IHByb2dyYW0gaW4gc29mdHdhcmU6CiAJICogZXZ0MCAtIGVtdWxhdGlvbiAoanRhZykKIAkgKiBldnQxIC0gcmVzZXQKQEAgLTk3OSwxNyArOTY2LDIzIEBACiAgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgZHVyaW5nIGtlcm5lbCBzdGFydHVwIHRvIGluaXRpYWxpemUKICAqIHRoZSBCRmluIElSUSBoYW5kbGluZyByb3V0aW5lcy4KICAqLworCiBpbnQgX19pbml0IGluaXRfYXJjaF9pcnEodm9pZCkKIHsKIAlpbnQgaXJxOwogCXVuc2lnbmVkIGxvbmcgaWxhdCA9IDA7CiAJLyogIERpc2FibGUgYWxsIHRoZSBwZXJpcGhlcmFsIGludHJzICAtIHBhZ2UgNC0yOSBIVyBSZWYgbWFudWFsICovCi0jaWYgZGVmaW5lZChDT05GSUdfQkY1NHgpIHx8IGRlZmluZWQoQ09ORklHX0JGNTJ4KSB8fCBkZWZpbmVkKENPTkZJR19CRjU2MSkKKyNpZiBkZWZpbmVkKENPTkZJR19CRjU0eCkgfHwgZGVmaW5lZChDT05GSUdfQkY1MngpIHx8IGRlZmluZWQoQ09ORklHX0JGNTYxKSBcCisJfHwgZGVmaW5lZChCRjUzOF9GQU1JTFkpIHx8IGRlZmluZWQoQ09ORklHX0JGNTF4KQogCWJmaW5fd3JpdGVfU0lDX0lNQVNLMChTSUNfVU5NQVNLX0FMTCk7CiAJYmZpbl93cml0ZV9TSUNfSU1BU0sxKFNJQ19VTk1BU0tfQUxMKTsKICMgaWZkZWYgQ09ORklHX0JGNTR4CiAJYmZpbl93cml0ZV9TSUNfSU1BU0syKFNJQ19VTk1BU0tfQUxMKTsKICMgZW5kaWYKKyMgaWZkZWYgQ09ORklHX1NNUAorCWJmaW5fd3JpdGVfU0lDQl9JTUFTSzAoU0lDX1VOTUFTS19BTEwpOworCWJmaW5fd3JpdGVfU0lDQl9JTUFTSzEoU0lDX1VOTUFTS19BTEwpOworIyBlbmRpZgogI2Vsc2UKIAliZmluX3dyaXRlX1NJQ19JTUFTSyhTSUNfVU5NQVNLX0FMTCk7CiAjZW5kaWYKQEAgLTEwMjksNyArMTAyMiw3IEBACiAJCWNhc2UgSVJRX1BJTlQxOgogCQljYXNlIElSUV9QSU5UMjoKIAkJY2FzZSBJUlFfUElOVDM6Ci0jZWxpZiBkZWZpbmVkKENPTkZJR19CRjUyeCkKKyNlbGlmIGRlZmluZWQoQ09ORklHX0JGNTJ4KSB8fCBkZWZpbmVkKENPTkZJR19CRjUxeCkKIAkJY2FzZSBJUlFfUE9SVEZfSU5UQToKIAkJY2FzZSBJUlFfUE9SVEdfSU5UQToKIAkJY2FzZSBJUlFfUE9SVEhfSU5UQToKQEAgLTEwMzcsMTggKzEwMzAsNDEgQEAKIAkJY2FzZSBJUlFfUFJPRzBfSU5UQToKIAkJY2FzZSBJUlFfUFJPRzFfSU5UQToKIAkJY2FzZSBJUlFfUFJPRzJfSU5UQToKKyNlbGlmIGRlZmluZWQoQ09ORklHX0JGNTM4KSB8fCBkZWZpbmVkKENPTkZJR19CRjUzOSkKKwkJY2FzZSBJUlFfUE9SVEZfSU5UQToKICNlbmRpZgorCiAJCQlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihpcnEsCiAJCQkJCQliZmluX2RlbXV4X2dwaW9faXJxKTsKIAkJCWJyZWFrOwogI2lmZGVmIEJGNTM3X0dFTkVSSUNfRVJST1JfSU5UX0RFTVVYCiAJCWNhc2UgSVJRX0dFTkVSSUNfRVJST1I6Ci0JCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBiZmluX2RlbXV4X2Vycm9yX2lycSk7Ci0KKwkJCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKGlycSwgYmZpbl9kZW11eF9lcnJvcl9pcnEpOworCQkJYnJlYWs7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19USUNLX1NPVVJDRV9TWVNUTVIwKSB8fCBkZWZpbmVkKENPTkZJR19JUElQRSkKKwkJY2FzZSBJUlFfVElNRVIwOgorCQkJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX3BlcmNwdV9pcnEpOworCQkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU01QCisJCWNhc2UgSVJRX1NVUFBMRV8wOgorCQljYXNlIElSUV9TVVBQTEVfMToKKwkJCXNldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9wZXJjcHVfaXJxKTsKIAkJCWJyZWFrOwogI2VuZGlmCiAJCWRlZmF1bHQ6CisjaWZkZWYgQ09ORklHX0lQSVBFCisJLyoKKwkgKiBXZSB3YW50IGludGVybmFsIGludGVycnVwdCBzb3VyY2VzIHRvIGJlIG1hc2tlZCwgYmVjYXVzZQorCSAqIElTUnMgbWF5IHRyaWdnZXIgaW50ZXJydXB0cyByZWN1cnNpdmVseSAoZS5nLiBETUEpLCBidXQKKwkgKiBpbnRlcnJ1cHRzIGFyZSBfbm90XyBtYXNrZWQgYXQgQ1BVIGxldmVsLiBTbyBsZXQncyBoYW5kbGUKKwkgKiB0aGVtIGFzIGxldmVsIGludGVycnVwdHMuCisJICovCisJCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfbGV2ZWxfaXJxKTsKKyNlbHNlIC8qICFDT05GSUdfSVBJUEUgKi8KIAkJCXNldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9zaW1wbGVfaXJxKTsKKyNlbmRpZiAvKiAhQ09ORklHX0lQSVBFICovCiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTEwNzMsNyArMTA4OSw3IEBACiAJQ1NZTkMoKTsKIAogCXByaW50ayhLRVJOX0lORk8gIkNvbmZpZ3VyaW5nIEJsYWNrZmluIFByaW9yaXR5IERyaXZlbiBJbnRlcnJ1cHRzXG4iKTsKLQkvKiBJTUFTSz14eHggaXMgZXF1aXZhbGVudCB0byBTVEkgeHggb3IgaXJxX2ZsYWdzPXh4LAorCS8qIElNQVNLPXh4eCBpcyBlcXVpdmFsZW50IHRvIFNUSSB4eCBvciBiZmluX2lycV9mbGFncz14eCwKIAkgKiBsb2NhbF9pcnFfZW5hYmxlKCkKIAkgKi8KIAlwcm9ncmFtX0lBUigpOwpAQCAtMTA4MSwxOSArMTA5NywyMyBAQAogCXNlYXJjaF9JQVIoKTsKIAogCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIElWRzctMTUgKi8KLQlpcnFfZmxhZ3MgPSBpcnFfZmxhZ3MgfCBJTUFTS19JVkcxNSB8CisJYmZpbl9pcnFfZmxhZ3MgfD0gSU1BU0tfSVZHMTUgfAogCSAgICBJTUFTS19JVkcxNCB8IElNQVNLX0lWRzEzIHwgSU1BU0tfSVZHMTIgfCBJTUFTS19JVkcxMSB8CiAJICAgIElNQVNLX0lWRzEwIHwgSU1BU0tfSVZHOSB8IElNQVNLX0lWRzggfCBJTUFTS19JVkc3IHwgSU1BU0tfSVZHSFc7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19CRjU0eCkgfHwgZGVmaW5lZChDT05GSUdfQkY1MngpIHx8IGRlZmluZWQoQ09ORklHX0JGNTYxKQorI2lmIGRlZmluZWQoQ09ORklHX0JGNTR4KSB8fCBkZWZpbmVkKENPTkZJR19CRjUyeCkgfHwgZGVmaW5lZChDT05GSUdfQkY1NjEpIFwKKwl8fCBkZWZpbmVkKEJGNTM4X0ZBTUlMWSkgfHwgZGVmaW5lZChDT05GSUdfQkY1MXgpCiAJYmZpbl93cml0ZV9TSUNfSVdSMChJV1JfRElTQUJMRV9BTEwpOwotI2lmIGRlZmluZWQoQ09ORklHX0JGNTJ4KQotCS8qIEJGNTJ4IHN5c3RlbSByZXNldCBkb2VzIG5vdCBwcm9wZXJseSByZXNldCBTSUNfSVdSMSB3aGljaAorI2lmIGRlZmluZWQoQ09ORklHX0JGNTJ4KSB8fCBkZWZpbmVkKENPTkZJR19CRjUxeCkKKwkvKiBCRjUyeC9CRjUxeCBzeXN0ZW0gcmVzZXQgZG9lcyBub3QgcHJvcGVybHkgcmVzZXQgU0lDX0lXUjEgd2hpY2gKIAkgKiB3aWxsIHNjcmV3IHVwIHRoZSBib290cm9tIGFzIGl0IHJlbGllcyBvbiBNRE1BMC8xIHdha2luZyBpdAogCSAqIHVwIGZyb20gSURMRSBpbnN0cnVjdGlvbnMuICBTZWUgdGhpcyByZXBvcnQgZm9yIG1vcmUgaW5mbzoKIAkgKiBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvZ2YvdHJhY2tlci80MzIzCiAJICovCi0JYmZpbl93cml0ZV9TSUNfSVdSMShJV1JfRU5BQkxFKDEwKSB8IElXUl9FTkFCTEUoMTEpKTsKKwlpZiAoQU5PTUFMWV8wNTAwMDQzNSkKKwkJYmZpbl93cml0ZV9TSUNfSVdSMShJV1JfRU5BQkxFKDEwKSB8IElXUl9FTkFCTEUoMTEpKTsKKwllbHNlCisJCWJmaW5fd3JpdGVfU0lDX0lXUjEoSVdSX0RJU0FCTEVfQUxMKTsKICNlbHNlCiAJYmZpbl93cml0ZV9TSUNfSVdSMShJV1JfRElTQUJMRV9BTEwpOwogI2VuZGlmCkBAIC0xMTA0LDYgKzExMjQsMTQgQEAKIAliZmluX3dyaXRlX1NJQ19JV1IoSVdSX0RJU0FCTEVfQUxMKTsKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX0lQSVBFCisJZm9yIChpcnEgPSAwOyBpcnEgPCBOUl9JUlFTOyBpcnErKykgeworCQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfZGVzYyArIGlycTsKKwkJZGVzYy0+aWNfcHJpbyA9IF9faXBpcGVfZ2V0X2lycV9wcmlvcml0eShpcnEpOworCQlkZXNjLT50aHJfcHJpbyA9IF9faXBpcGVfZ2V0X2lycXRocmVhZF9wcmlvcml0eShpcnEpOworCX0KKyNlbmRpZiAvKiBDT05GSUdfSVBJUEUgKi8KKwogCXJldHVybiAwOwogfQogCkBAIC0xMTE3LDExICsxMTQ1LDIwIEBACiAJfSBlbHNlIHsKIAkJc3RydWN0IGl2Z3ggKml2ZyA9IGl2ZzdfMTNbdmVjIC0gSVZHN10uaWZpcnN0OwogCQlzdHJ1Y3QgaXZneCAqaXZnX3N0b3AgPSBpdmc3XzEzW3ZlYyAtIElWRzddLmlzdG9wOwotI2lmIGRlZmluZWQoQ09ORklHX0JGNTR4KSB8fCBkZWZpbmVkKENPTkZJR19CRjUyeCkgfHwgZGVmaW5lZChDT05GSUdfQkY1NjEpCisjaWYgZGVmaW5lZChDT05GSUdfQkY1NHgpIHx8IGRlZmluZWQoQ09ORklHX0JGNTJ4KSB8fCBkZWZpbmVkKENPTkZJR19CRjU2MSkgXAorCXx8IGRlZmluZWQoQkY1MzhfRkFNSUxZKSB8fCBkZWZpbmVkKENPTkZJR19CRjUxeCkKIAkJdW5zaWduZWQgbG9uZyBzaWNfc3RhdHVzWzNdOwogCi0JCXNpY19zdGF0dXNbMF0gPSBiZmluX3JlYWRfU0lDX0lTUjAoKSAmIGJmaW5fcmVhZF9TSUNfSU1BU0swKCk7Ci0JCXNpY19zdGF0dXNbMV0gPSBiZmluX3JlYWRfU0lDX0lTUjEoKSAmIGJmaW5fcmVhZF9TSUNfSU1BU0sxKCk7CisJCWlmIChzbXBfcHJvY2Vzc29yX2lkKCkpIHsKKyNpZmRlZiBDT05GSUdfU01QCisJCQkvKiBUaGlzIHdpbGwgYmUgb3B0aW1pemVkIG91dCBpbiBVUCBtb2RlLiAqLworCQkJc2ljX3N0YXR1c1swXSA9IGJmaW5fcmVhZF9TSUNCX0lTUjAoKSAmIGJmaW5fcmVhZF9TSUNCX0lNQVNLMCgpOworCQkJc2ljX3N0YXR1c1sxXSA9IGJmaW5fcmVhZF9TSUNCX0lTUjEoKSAmIGJmaW5fcmVhZF9TSUNCX0lNQVNLMSgpOworI2VuZGlmCisJCX0gZWxzZSB7CisJCQlzaWNfc3RhdHVzWzBdID0gYmZpbl9yZWFkX1NJQ19JU1IwKCkgJiBiZmluX3JlYWRfU0lDX0lNQVNLMCgpOworCQkJc2ljX3N0YXR1c1sxXSA9IGJmaW5fcmVhZF9TSUNfSVNSMSgpICYgYmZpbl9yZWFkX1NJQ19JTUFTSzEoKTsKKwkJfQogI2lmZGVmIENPTkZJR19CRjU0eAogCQlzaWNfc3RhdHVzWzJdID0gYmZpbl9yZWFkX1NJQ19JU1IyKCkgJiBiZmluX3JlYWRfU0lDX0lNQVNLMigpOwogI2VuZGlmCkBAIC0xMTUwLDMgKzExODcsMTYxIEBACiAJfQogCWFzbV9kb19JUlEodmVjLCBmcCk7CiB9CisKKyNpZmRlZiBDT05GSUdfSVBJUEUKKworaW50IF9faXBpcGVfZ2V0X2lycV9wcmlvcml0eSh1bnNpZ25lZCBpcnEpCit7CisJaW50IGllbnQsIHByaW87CisKKwlpZiAoaXJxIDw9IElSUV9DT1JFVE1SKQorCQlyZXR1cm4gaXJxOworCisJZm9yIChpZW50ID0gMDsgaWVudCA8IE5SX1BFUklfSU5UUzsgaWVudCsrKSB7CisJCXN0cnVjdCBpdmd4ICppdmcgPSBpdmdfdGFibGUgKyBpZW50OworCQlpZiAoaXZnLT5pcnFubyA9PSBpcnEpIHsKKwkJCWZvciAocHJpbyA9IDA7IHByaW8gPD0gSVZHMTMtSVZHNzsgcHJpbysrKSB7CisJCQkJaWYgKGl2ZzdfMTNbcHJpb10uaWZpcnN0IDw9IGl2ZyAmJgorCQkJCSAgICBpdmc3XzEzW3ByaW9dLmlzdG9wID4gaXZnKQorCQkJCQlyZXR1cm4gSVZHNyArIHByaW87CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gSVZHMTU7Cit9CisKK2ludCBfX2lwaXBlX2dldF9pcnF0aHJlYWRfcHJpb3JpdHkodW5zaWduZWQgaXJxKQoreworCWludCBpZW50LCBwcmlvOworCWludCBkZW11eF9pcnE7CisKKwkvKiBUaGUgcmV0dXJuZWQgcHJpb3JpdHkgdmFsdWUgaXMgcmVzY2FsZWQgdG8gWzAuLklWRzEzKzFdCisJICogd2l0aCAwIGJlaW5nIHRoZSBsb3dlc3QgZWZmZWN0aXZlIHByaW9yaXR5IGxldmVsLiAqLworCisJaWYgKGlycSA8PSBJUlFfQ09SRVRNUikKKwkJcmV0dXJuIElWRzEzIC0gaXJxICsgMTsKKworCS8qIEdQSU8gSVJRcyBhcmUgZ2l2ZW4gdGhlIHByaW9yaXR5IG9mIHRoZSBkZW11eAorCSAqIGludGVycnVwdC4gKi8KKwlpZiAoSVNfR1BJT0lSUShpcnEpKSB7CisjaWYgZGVmaW5lZChDT05GSUdfQkY1NHgpCisJCXUzMiBiYW5rID0gUElOVF8yX0JBTksoaXJxMnBpbnRfbHV0W2lycSAtIFNZU19JUlFTXSk7CisJCWRlbXV4X2lycSA9IChiYW5rID09IDAgPyBJUlFfUElOVDAgOgorCQkJCWJhbmsgPT0gMSA/IElSUV9QSU5UMSA6CisJCQkJYmFuayA9PSAyID8gSVJRX1BJTlQyIDoKKwkJCQlJUlFfUElOVDMpOworI2VsaWYgZGVmaW5lZChDT05GSUdfQkY1NjEpCisJCWRlbXV4X2lycSA9IChpcnEgPj0gSVJRX1BGMzIgPyBJUlFfUFJPRzJfSU5UQSA6CisJCQkJaXJxID49IElSUV9QRjE2ID8gSVJRX1BST0cxX0lOVEEgOgorCQkJCUlSUV9QUk9HMF9JTlRBKTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX0JGNTJ4KQorCQlkZW11eF9pcnEgPSAoaXJxID49IElSUV9QSDAgPyBJUlFfUE9SVEhfSU5UQSA6CisJCQkJaXJxID49IElSUV9QRzAgPyBJUlFfUE9SVEdfSU5UQSA6CisJCQkJSVJRX1BPUlRGX0lOVEEpOworI2Vsc2UKKwkJZGVtdXhfaXJxID0gaXJxOworI2VuZGlmCisJCXJldHVybiBJVkcxMyAtIFBSSU9fR1BJT0RFTVVYKGRlbXV4X2lycSkgKyAxOworCX0KKworCS8qIFRoZSBHUElPIGRlbXV4IGludGVycnVwdCBpcyBnaXZlbiBhIGxvd2VyIHByaW9yaXR5CisJICogdGhhbiB0aGUgR1BJTyBJUlFzLCBzbyB0aGF0IGl0cyB0aHJlYWRlZCBoYW5kbGVyCisJICogdW5tYXNrcyB0aGUgaW50ZXJydXB0IGxpbmUgYWZ0ZXIgdGhlIGRlY29kZWQgSVJRcworCSAqIGhhdmUgYmVlbiBwcm9jZXNzZWQuICovCisJcHJpbyA9IFBSSU9fR1BJT0RFTVVYKGlycSk7CisJLyogZGVtdXggaXJxPyAqLworCWlmIChwcmlvICE9IC0xKQorCQlyZXR1cm4gSVZHMTMgLSBwcmlvOworCisJZm9yIChpZW50ID0gMDsgaWVudCA8IE5SX1BFUklfSU5UUzsgaWVudCsrKSB7CisJCXN0cnVjdCBpdmd4ICppdmcgPSBpdmdfdGFibGUgKyBpZW50OworCQlpZiAoaXZnLT5pcnFubyA9PSBpcnEpIHsKKwkJCWZvciAocHJpbyA9IDA7IHByaW8gPD0gSVZHMTMtSVZHNzsgcHJpbysrKSB7CisJCQkJaWYgKGl2ZzdfMTNbcHJpb10uaWZpcnN0IDw9IGl2ZyAmJgorCQkJCSAgICBpdmc3XzEzW3ByaW9dLmlzdG9wID4gaXZnKQorCQkJCQlyZXR1cm4gSVZHNyAtIHByaW87CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogSHcgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgb24gZW50cnkgKGNoZWNrIFNBVkVfQ09OVEVYVCkuICovCisjaWZkZWYgQ09ORklHX0RPX0lSUV9MMQorX19hdHRyaWJ1dGVfXygobDFfdGV4dCkpCisjZW5kaWYKK2FzbWxpbmthZ2UgaW50IF9faXBpcGVfZ3JhYl9pcnEoaW50IHZlYywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGl2Z3ggKml2Z19zdG9wID0gaXZnN18xM1t2ZWMtSVZHN10uaXN0b3A7CisJc3RydWN0IGl2Z3ggKml2ZyA9IGl2ZzdfMTNbdmVjLUlWRzddLmlmaXJzdDsKKwlpbnQgaXJxOworCisJaWYgKGxpa2VseSh2ZWMgPT0gRVZUX0lWVE1SX1ApKSB7CisJCWlycSA9IElSUV9DT1JFVE1SOworCQlnb3RvIGhhbmRsZV9pcnE7CisJfQorCisJU1NZTkMoKTsKKworI2lmIGRlZmluZWQoQ09ORklHX0JGNTR4KSB8fCBkZWZpbmVkKENPTkZJR19CRjUyeCkgfHwgZGVmaW5lZChDT05GSUdfQkY1NjEpCisJeworCQl1bnNpZ25lZCBsb25nIHNpY19zdGF0dXNbM107CisKKwkJc2ljX3N0YXR1c1swXSA9IGJmaW5fcmVhZF9TSUNfSVNSMCgpICYgYmZpbl9yZWFkX1NJQ19JTUFTSzAoKTsKKwkJc2ljX3N0YXR1c1sxXSA9IGJmaW5fcmVhZF9TSUNfSVNSMSgpICYgYmZpbl9yZWFkX1NJQ19JTUFTSzEoKTsKKyNpZmRlZiBDT05GSUdfQkY1NHgKKwkJc2ljX3N0YXR1c1syXSA9IGJmaW5fcmVhZF9TSUNfSVNSMigpICYgYmZpbl9yZWFkX1NJQ19JTUFTSzIoKTsKKyNlbmRpZgorCQlmb3IgKDs7IGl2ZysrKSB7CisJCQlpZiAoaXZnID49IGl2Z19zdG9wKSB7CisJCQkJYXRvbWljX2luYygmbnVtX3NwdXJpb3VzKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWlmIChzaWNfc3RhdHVzWyhpdmctPmlycW5vIC0gSVZHNykgLyAzMl0gJiBpdmctPmlzcmZsYWcpCisJCQkJYnJlYWs7CisJCX0KKwl9CisjZWxzZQorCXsKKwkJdW5zaWduZWQgbG9uZyBzaWNfc3RhdHVzOworCisJCXNpY19zdGF0dXMgPSBiZmluX3JlYWRfU0lDX0lNQVNLKCkgJiBiZmluX3JlYWRfU0lDX0lTUigpOworCisJCWZvciAoOzsgaXZnKyspIHsKKwkJCWlmIChpdmcgPj0gaXZnX3N0b3ApIHsKKwkJCQlhdG9taWNfaW5jKCZudW1fc3B1cmlvdXMpOworCQkJCXJldHVybiAwOworCQkJfSBlbHNlIGlmIChzaWNfc3RhdHVzICYgaXZnLT5pc3JmbGFnKQorCQkJCWJyZWFrOworCQl9CisJfQorI2VuZGlmCisKKwlpcnEgPSBpdmctPmlycW5vOworCisJaWYgKGlycSA9PSBJUlFfU1lTVE1SKSB7CisJCWJmaW5fd3JpdGVfVElNRVJfU1RBVFVTKDEpOyAvKiBMYXRjaCBUSU1JTDAgKi8KKwkJLyogVGhpcyBpcyBiYXNpY2FsbHkgd2hhdCB3ZSBuZWVkIGZyb20gdGhlIHJlZ2lzdGVyIGZyYW1lLiAqLworCQlfX3Jhd19nZXRfY3B1X3ZhcihfX2lwaXBlX3RpY2tfcmVncykuaXBlbmQgPSByZWdzLT5pcGVuZDsKKwkJX19yYXdfZ2V0X2NwdV92YXIoX19pcGlwZV90aWNrX3JlZ3MpLnBjID0gcmVncy0+cGM7CisJCWlmICghaXBpcGVfcm9vdF9kb21haW5fcCkKKwkJCV9fcmF3X2dldF9jcHVfdmFyKF9faXBpcGVfdGlja19yZWdzKS5pcGVuZCB8PSAweDEwOworCQllbHNlCisJCQlfX3Jhd19nZXRfY3B1X3ZhcihfX2lwaXBlX3RpY2tfcmVncykuaXBlbmQgJj0gfjB4MTA7CisJfQorCitoYW5kbGVfaXJxOgorCisJaXBpcGVfdHJhY2VfaXJxX2VudHJ5KGlycSk7CisJX19pcGlwZV9oYW5kbGVfaXJxKGlycSwgcmVncyk7CisgICAgICAgaXBpcGVfdHJhY2VfaXJxX2V4aXQoaXJxKTsKKworICAgICAgIGlmIChpcGlwZV9yb290X2RvbWFpbl9wKQorCQlyZXR1cm4gIXRlc3RfYml0KElQSVBFX1NUQUxMX0ZMQUcsICZpcGlwZV9yb290X2NwdWRvbV92YXIoc3RhdHVzKSk7CisKKyAgICAgICByZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIENPTkZJR19JUElQRSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9pcnFwYW5pYy5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9pcnFwYW5pYy5jCmluZGV4IDYwNmRlZDkuLjA1MDA0ZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaXJxcGFuaWMuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2lycXBhbmljLmMKQEAgLTMzLDggKzMzLDYgQEAKICNpbmNsdWRlIDxhc20vdHJhcHMuaD4KICNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KIAotI2luY2x1ZGUgIi4uL29wcm9maWxlL29wX2JsYWNrZmluLmgiCi0KICNpZmRlZiBDT05GSUdfREVCVUdfSUNBQ0hFX0NIRUNLCiAjZGVmaW5lIEwxX0lDQUNIRV9TVEFSVCAweGZmYTEwMDAwCiAjZGVmaW5lIEwxX0lDQUNIRV9FTkQgICAweGZmYTEzZmZmCkBAIC0xMzQsMTMgKzEzMiwzIEBACiAjZW5kaWYKIAogfQotCi0jaWZkZWYgQ09ORklHX0hBUkRXQVJFX1BNCi0vKgotICogY2FsbCB0aGUgaGFuZGxlciBvZiBQZXJmb3JtYW5jZSBvdmVyZmxvdwotICovCi1hc21saW5rYWdlIHZvaWQgcG1fb3ZlcmZsb3coaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JcG1fb3ZlcmZsb3dfaGFuZGxlcihpcnEsIHJlZ3MpOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2xvY2suUyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vbG9jay5TCmluZGV4IDlkYWYwMTIuLjZjNWY1ZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vbG9jay5TCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vbG9jay5TCkBAIC0xNjAsNyArMTYwLDcgQEAKICAqIFIwIC0gV2hpY2ggd2F5IHRvIGJlIGxvY2tlZAogICovCiAKLUVOVFJZKF9jYWNoZV9sb2NrKQorRU5UUlkoX2JmaW5fY2FjaGVfbG9jaykKIAogCVstLVNQXT0oIFI3OjAsUDU6MCApOwogCkBAIC0xODQsNyArMTg0LDcgQEAKIAogCSggUjc6MCxQNTowICkgPSBbU1ArK107CiAJUlRTOwotRU5EUFJPQyhfY2FjaGVfbG9jaykKK0VORFBST0MoX2JmaW5fY2FjaGVfbG9jaykKIAogLyogSW52YWxpZGF0ZSB0aGUgRW50aXJlIEluc3RydWN0aW9uIGNhY2hlIGJ5CiAgKiBkaXNhYmxpbmcgSU1DIGJpdApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9wbS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9wbS5jCmluZGV4IGUyOGM2YWYuLmQzZDcwZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vcG0uYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL3BtLmMKQEAgLTcxLDcgKzcxLDcgQEAKIAlncGlvX3BtX3dha2V1cF9yZXF1ZXN0KENPTkZJR19QTV9XQUtFVVBfR1BJT19OVU1CRVIsIFdBS0VVUF9UWVBFKTsKICNlbmRpZgogCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKIAliZmluX3BtX3N0YW5kYnlfc2V0dXAoKTsKIAogI2lmZGVmIENPTkZJR19QTV9CRklOX1NMRUVQX0RFRVBFUgpAQCAtODIsMTUgKzgyLDE5IEBACiAKIAliZmluX3BtX3N0YW5kYnlfcmVzdG9yZSgpOwogCi0jaWYgZGVmaW5lZChDT05GSUdfQkY1NHgpIHx8IGRlZmluZWQoQ09ORklHX0JGNTJ4KSAgfHwgZGVmaW5lZChDT05GSUdfQkY1NjEpCisjaWYgZGVmaW5lZChDT05GSUdfQkY1NHgpIHx8IGRlZmluZWQoQ09ORklHX0JGNTJ4KSAgfHwgZGVmaW5lZChDT05GSUdfQkY1NjEpIHx8IFwKKwlkZWZpbmVkKENPTkZJR19CRjUzOCkgfHwgZGVmaW5lZChDT05GSUdfQkY1MzkpIHx8IGRlZmluZWQoQ09ORklHX0JGNTF4KQogCWJmaW5fd3JpdGVfU0lDX0lXUjAoSVdSX0RJU0FCTEVfQUxMKTsKLSNpZiBkZWZpbmVkKENPTkZJR19CRjUyeCkKKyNpZiBkZWZpbmVkKENPTkZJR19CRjUyeCkgfHwgZGVmaW5lZChDT05GSUdfQkY1MXgpCiAJLyogQkY1Mnggc3lzdGVtIHJlc2V0IGRvZXMgbm90IHByb3Blcmx5IHJlc2V0IFNJQ19JV1IxIHdoaWNoCiAJICogd2lsbCBzY3JldyB1cCB0aGUgYm9vdHJvbSBhcyBpdCByZWxpZXMgb24gTURNQTAvMSB3YWtpbmcgaXQKIAkgKiB1cCBmcm9tIElETEUgaW5zdHJ1Y3Rpb25zLiAgU2VlIHRoaXMgcmVwb3J0IGZvciBtb3JlIGluZm86CiAJICogaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnL2dmL3RyYWNrZXIvNDMyMwogCSAqLwotCWJmaW5fd3JpdGVfU0lDX0lXUjEoSVdSX0VOQUJMRSgxMCkgfCBJV1JfRU5BQkxFKDExKSk7CisJaWYgKEFOT01BTFlfMDUwMDA0MzUpCisJCWJmaW5fd3JpdGVfU0lDX0lXUjEoSVdSX0VOQUJMRSgxMCkgfCBJV1JfRU5BQkxFKDExKSk7CisJZWxzZQorCQliZmluX3dyaXRlX1NJQ19JV1IxKElXUl9ESVNBQkxFX0FMTCk7CiAjZWxzZQogCWJmaW5fd3JpdGVfU0lDX0lXUjEoSVdSX0RJU0FCTEVfQUxMKTsKICNlbmRpZgpAQCAtMTAxLDcgKzEwNSw3IEBACiAJYmZpbl93cml0ZV9TSUNfSVdSKElXUl9ESVNBQkxFX0FMTCk7CiAjZW5kaWYKIAotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CiB9CiAKIGludCBiZjUzeF9zdXNwZW5kX2wxX21lbSh1bnNpZ25lZCBjaGFyICptZW1wdHIpCkBAIC0yNDUsMTIgKzI0OSwxMiBAQAogCXdha2V1cCB8PSBHUFdFOwogI2VuZGlmCiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOwogCiAJcmV0ID0gYmxhY2tmaW5fZG1hX3N1c3BlbmQoKTsKIAogCWlmIChyZXQpIHsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CiAJCWtmcmVlKG1lbXB0cik7CiAJCXJldHVybiByZXQ7CiAJfQpAQCAtMjcxLDcgKzI3NSw3IEBACiAJYmZpbl9ncGlvX3BtX2hpYmVybmF0ZV9yZXN0b3JlKCk7CiAJYmxhY2tmaW5fZG1hX3Jlc3VtZSgpOwogCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKIAlrZnJlZShtZW1wdHIpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL3NtcC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9zbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2M5OTI4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9zbXAuYwpAQCAtMCwwICsxLDQ3NiBAQAorLyoKKyAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9rZXJuZWwvc21wLmMKKyAqIEF1dGhvcjogICAgICAgUGhpbGlwcGUgR2VydW0gPHJwbUB4ZW5vbWFpLm9yZz4KKyAqIElQSSBtYW5hZ2VtZW50IGJhc2VkIG9uIGFyY2gvYXJtL2tlcm5lbC9zbXAuYy4KKyAqCisgKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA3IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQorICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisKK3N0cnVjdCBjb3JlbG9ja19zbG90IGNvcmVsb2NrIF9fYXR0cmlidXRlX18gKChfX3NlY3Rpb25fXygiLmwyLmJzcyIpKSk7CisKK3ZvaWQgX19jcHVpbml0ZGF0YSAqaW5pdF9yZXR4X2NvcmViLCAqaW5pdF9zYXZlZF9yZXR4X2NvcmViLAorCSppbml0X3NhdmVkX3NlcXN0YXRfY29yZWIsICppbml0X3NhdmVkX2ljcGxiX2ZhdWx0X2FkZHJfY29yZWIsCisJKmluaXRfc2F2ZWRfZGNwbGJfZmF1bHRfYWRkcl9jb3JlYjsKKworY3B1bWFza190IGNwdV9wb3NzaWJsZV9tYXA7CitFWFBPUlRfU1lNQk9MKGNwdV9wb3NzaWJsZV9tYXApOworCitjcHVtYXNrX3QgY3B1X29ubGluZV9tYXA7CitFWFBPUlRfU1lNQk9MKGNwdV9vbmxpbmVfbWFwKTsKKworI2RlZmluZSBCRklOX0lQSV9SRVNDSEVEVUxFICAgMAorI2RlZmluZSBCRklOX0lQSV9DQUxMX0ZVTkMgICAgMQorI2RlZmluZSBCRklOX0lQSV9DUFVfU1RPUCAgICAgMgorCitzdHJ1Y3QgYmxhY2tmaW5fZmx1c2hfZGF0YSB7CisJdW5zaWduZWQgbG9uZyBzdGFydDsKKwl1bnNpZ25lZCBsb25nIGVuZDsKK307CisKK3ZvaWQgKnNlY29uZGFyeV9zdGFjazsKKworCitzdHJ1Y3Qgc21wX2NhbGxfc3RydWN0IHsKKwl2b2lkICgqZnVuYykodm9pZCAqaW5mbyk7CisJdm9pZCAqaW5mbzsKKwlpbnQgd2FpdDsKKwljcHVtYXNrX3QgcGVuZGluZzsKKwljcHVtYXNrX3Qgd2FpdG1hc2s7Cit9OworCitzdGF0aWMgc3RydWN0IGJsYWNrZmluX2ZsdXNoX2RhdGEgc21wX2ZsdXNoX2RhdGE7CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soc3RvcF9sb2NrKTsKKworc3RydWN0IGlwaV9tZXNzYWdlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJdW5zaWduZWQgbG9uZyB0eXBlOworCXN0cnVjdCBzbXBfY2FsbF9zdHJ1Y3QgY2FsbF9zdHJ1Y3Q7Cit9OworCitzdHJ1Y3QgaXBpX21lc3NhZ2VfcXVldWUgeworCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsKKwlzcGlubG9ja190IGxvY2s7CisJdW5zaWduZWQgbG9uZyBjb3VudDsKK307CisKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgaXBpX21lc3NhZ2VfcXVldWUsIGlwaV9tc2dfcXVldWUpOworCitzdGF0aWMgdm9pZCBpcGlfY3B1X3N0b3AodW5zaWduZWQgaW50IGNwdSkKK3sKKwlzcGluX2xvY2soJnN0b3BfbG9jayk7CisJcHJpbnRrKEtFUk5fQ1JJVCAiQ1BVJXU6IHN0b3BwaW5nXG4iLCBjcHUpOworCWR1bXBfc3RhY2soKTsKKwlzcGluX3VubG9jaygmc3RvcF9sb2NrKTsKKworCWNwdV9jbGVhcihjcHUsIGNwdV9vbmxpbmVfbWFwKTsKKworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisKKwl3aGlsZSAoMSkKKwkJU1NZTkMoKTsKK30KKworc3RhdGljIHZvaWQgaXBpX2ZsdXNoX2ljYWNoZSh2b2lkICppbmZvKQoreworCXN0cnVjdCBibGFja2Zpbl9mbHVzaF9kYXRhICpmZGF0YSA9IGluZm87CisKKwkvKiBJbnZhbGlkYXRlIHRoZSBtZW1vcnkgaG9sZGluZyB0aGUgYm91bmRzIG9mIHRoZSBmbHVzaGVkIHJlZ2lvbi4gKi8KKwlibGFja2Zpbl9kY2FjaGVfaW52YWxpZGF0ZV9yYW5nZSgodW5zaWduZWQgbG9uZylmZGF0YSwKKwkJCQkJICh1bnNpZ25lZCBsb25nKWZkYXRhICsgc2l6ZW9mKCpmZGF0YSkpOworCisJYmxhY2tmaW5faWNhY2hlX2ZsdXNoX3JhbmdlKGZkYXRhLT5zdGFydCwgZmRhdGEtPmVuZCk7Cit9CisKK3N0YXRpYyB2b2lkIGlwaV9jYWxsX2Z1bmN0aW9uKHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBpcGlfbWVzc2FnZSAqbXNnKQoreworCWludCB3YWl0OworCXZvaWQgKCpmdW5jKSh2b2lkICppbmZvKTsKKwl2b2lkICppbmZvOworCWZ1bmMgPSBtc2ctPmNhbGxfc3RydWN0LmZ1bmM7CisJaW5mbyA9IG1zZy0+Y2FsbF9zdHJ1Y3QuaW5mbzsKKwl3YWl0ID0gbXNnLT5jYWxsX3N0cnVjdC53YWl0OworCWNwdV9jbGVhcihjcHUsIG1zZy0+Y2FsbF9zdHJ1Y3QucGVuZGluZyk7CisJZnVuYyhpbmZvKTsKKwlpZiAod2FpdCkKKwkJY3B1X2NsZWFyKGNwdSwgbXNnLT5jYWxsX3N0cnVjdC53YWl0bWFzayk7CisJZWxzZQorCQlrZnJlZShtc2cpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgaXBpX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKQoreworCXN0cnVjdCBpcGlfbWVzc2FnZSAqbXNnLCAqbWc7CisJc3RydWN0IGlwaV9tZXNzYWdlX3F1ZXVlICptc2dfcXVldWU7CisJdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCXBsYXRmb3JtX2NsZWFyX2lwaShjcHUpOworCisJbXNnX3F1ZXVlID0gJl9fZ2V0X2NwdV92YXIoaXBpX21zZ19xdWV1ZSk7CisJbXNnX3F1ZXVlLT5jb3VudCsrOworCisJc3Bpbl9sb2NrKCZtc2dfcXVldWUtPmxvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtc2csIG1nLCAmbXNnX3F1ZXVlLT5oZWFkLCBsaXN0KSB7CisJCWxpc3RfZGVsKCZtc2ctPmxpc3QpOworCQlzd2l0Y2ggKG1zZy0+dHlwZSkgeworCQljYXNlIEJGSU5fSVBJX1JFU0NIRURVTEU6CisJCQkvKiBUaGF0J3MgdGhlIGVhc2llc3Qgb25lOyBsZWF2ZSBpdCB0bworCQkJICogcmV0dXJuX2Zyb21faW50LiAqLworCQkJa2ZyZWUobXNnKTsKKwkJCWJyZWFrOworCQljYXNlIEJGSU5fSVBJX0NBTExfRlVOQzoKKwkJCWlwaV9jYWxsX2Z1bmN0aW9uKGNwdSwgbXNnKTsKKwkJCWJyZWFrOworCQljYXNlIEJGSU5fSVBJX0NQVV9TVE9QOgorCQkJaXBpX2NwdV9zdG9wKGNwdSk7CisJCQlrZnJlZShtc2cpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9DUklUICJDUFUldTogVW5rbm93biBJUEkgbWVzc2FnZSBcCisJCQkweCVseFxuIiwgY3B1LCBtc2ctPnR5cGUpOworCQkJa2ZyZWUobXNnKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZtc2dfcXVldWUtPmxvY2spOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgaXBpX3F1ZXVlX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgY3B1OworCXN0cnVjdCBpcGlfbWVzc2FnZV9xdWV1ZSAqbXNnX3F1ZXVlOworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwkJbXNnX3F1ZXVlID0gJnBlcl9jcHUoaXBpX21zZ19xdWV1ZSwgY3B1KTsKKwkJSU5JVF9MSVNUX0hFQUQoJm1zZ19xdWV1ZS0+aGVhZCk7CisJCXNwaW5fbG9ja19pbml0KCZtc2dfcXVldWUtPmxvY2spOworCQltc2dfcXVldWUtPmNvdW50ID0gMDsKKwl9Cit9CisKK2ludCBzbXBfY2FsbF9mdW5jdGlvbih2b2lkICgqZnVuYykodm9pZCAqaW5mbyksIHZvaWQgKmluZm8sIGludCB3YWl0KQoreworCXVuc2lnbmVkIGludCBjcHU7CisJY3B1bWFza190IGNhbGxtYXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaXBpX21lc3NhZ2VfcXVldWUgKm1zZ19xdWV1ZTsKKwlzdHJ1Y3QgaXBpX21lc3NhZ2UgKm1zZzsKKworCWNhbGxtYXAgPSBjcHVfb25saW5lX21hcDsKKwljcHVfY2xlYXIoc21wX3Byb2Nlc3Nvcl9pZCgpLCBjYWxsbWFwKTsKKwlpZiAoY3B1c19lbXB0eShjYWxsbWFwKSkKKwkJcmV0dXJuIDA7CisKKwltc2cgPSBrbWFsbG9jKHNpemVvZigqbXNnKSwgR0ZQX0FUT01JQyk7CisJSU5JVF9MSVNUX0hFQUQoJm1zZy0+bGlzdCk7CisJbXNnLT5jYWxsX3N0cnVjdC5mdW5jID0gZnVuYzsKKwltc2ctPmNhbGxfc3RydWN0LmluZm8gPSBpbmZvOworCW1zZy0+Y2FsbF9zdHJ1Y3Qud2FpdCA9IHdhaXQ7CisJbXNnLT5jYWxsX3N0cnVjdC5wZW5kaW5nID0gY2FsbG1hcDsKKwltc2ctPmNhbGxfc3RydWN0LndhaXRtYXNrID0gY2FsbG1hcDsKKwltc2ctPnR5cGUgPSBCRklOX0lQSV9DQUxMX0ZVTkM7CisKKwlmb3JfZWFjaF9jcHVfbWFzayhjcHUsIGNhbGxtYXApIHsKKwkJbXNnX3F1ZXVlID0gJnBlcl9jcHUoaXBpX21zZ19xdWV1ZSwgY3B1KTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm1zZ19xdWV1ZS0+bG9jaywgZmxhZ3MpOworCQlsaXN0X2FkZCgmbXNnLT5saXN0LCAmbXNnX3F1ZXVlLT5oZWFkKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXNnX3F1ZXVlLT5sb2NrLCBmbGFncyk7CisJCXBsYXRmb3JtX3NlbmRfaXBpX2NwdShjcHUpOworCX0KKwlpZiAod2FpdCkgeworCQl3aGlsZSAoIWNwdXNfZW1wdHkobXNnLT5jYWxsX3N0cnVjdC53YWl0bWFzaykpCisJCQlibGFja2Zpbl9kY2FjaGVfaW52YWxpZGF0ZV9yYW5nZSgKKwkJCQkodW5zaWduZWQgbG9uZykoJm1zZy0+Y2FsbF9zdHJ1Y3Qud2FpdG1hc2spLAorCQkJCSh1bnNpZ25lZCBsb25nKSgmbXNnLT5jYWxsX3N0cnVjdC53YWl0bWFzaykpOworCQlrZnJlZShtc2cpOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNtcF9jYWxsX2Z1bmN0aW9uKTsKKworaW50IHNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShpbnQgY3B1aWQsIHZvaWQgKCpmdW5jKSAodm9pZCAqaW5mbyksIHZvaWQgKmluZm8sCisJCQkJaW50IHdhaXQpCit7CisJdW5zaWduZWQgaW50IGNwdSA9IGNwdWlkOworCWNwdW1hc2tfdCBjYWxsbWFwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGlwaV9tZXNzYWdlX3F1ZXVlICptc2dfcXVldWU7CisJc3RydWN0IGlwaV9tZXNzYWdlICptc2c7CisKKwlpZiAoY3B1X2lzX29mZmxpbmUoY3B1KSkKKwkJcmV0dXJuIDA7CisJY3B1c19jbGVhcihjYWxsbWFwKTsKKwljcHVfc2V0KGNwdSwgY2FsbG1hcCk7CisKKwltc2cgPSBrbWFsbG9jKHNpemVvZigqbXNnKSwgR0ZQX0FUT01JQyk7CisJSU5JVF9MSVNUX0hFQUQoJm1zZy0+bGlzdCk7CisJbXNnLT5jYWxsX3N0cnVjdC5mdW5jID0gZnVuYzsKKwltc2ctPmNhbGxfc3RydWN0LmluZm8gPSBpbmZvOworCW1zZy0+Y2FsbF9zdHJ1Y3Qud2FpdCA9IHdhaXQ7CisJbXNnLT5jYWxsX3N0cnVjdC5wZW5kaW5nID0gY2FsbG1hcDsKKwltc2ctPmNhbGxfc3RydWN0LndhaXRtYXNrID0gY2FsbG1hcDsKKwltc2ctPnR5cGUgPSBCRklOX0lQSV9DQUxMX0ZVTkM7CisKKwltc2dfcXVldWUgPSAmcGVyX2NwdShpcGlfbXNnX3F1ZXVlLCBjcHUpOworCXNwaW5fbG9ja19pcnFzYXZlKCZtc2dfcXVldWUtPmxvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZCgmbXNnLT5saXN0LCAmbXNnX3F1ZXVlLT5oZWFkKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc2dfcXVldWUtPmxvY2ssIGZsYWdzKTsKKwlwbGF0Zm9ybV9zZW5kX2lwaV9jcHUoY3B1KTsKKworCWlmICh3YWl0KSB7CisJCXdoaWxlICghY3B1c19lbXB0eShtc2ctPmNhbGxfc3RydWN0LndhaXRtYXNrKSkKKwkJCWJsYWNrZmluX2RjYWNoZV9pbnZhbGlkYXRlX3JhbmdlKAorCQkJCSh1bnNpZ25lZCBsb25nKSgmbXNnLT5jYWxsX3N0cnVjdC53YWl0bWFzayksCisJCQkJKHVuc2lnbmVkIGxvbmcpKCZtc2ctPmNhbGxfc3RydWN0LndhaXRtYXNrKSk7CisJCWtmcmVlKG1zZyk7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKTsKKwordm9pZCBzbXBfc2VuZF9yZXNjaGVkdWxlKGludCBjcHUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaXBpX21lc3NhZ2VfcXVldWUgKm1zZ19xdWV1ZTsKKwlzdHJ1Y3QgaXBpX21lc3NhZ2UgKm1zZzsKKworCWlmIChjcHVfaXNfb2ZmbGluZShjcHUpKQorCQlyZXR1cm47CisKKwltc2cgPSBrbWFsbG9jKHNpemVvZigqbXNnKSwgR0ZQX0FUT01JQyk7CisJbWVtc2V0KG1zZywgMCwgc2l6ZW9mKG1zZykpOworCUlOSVRfTElTVF9IRUFEKCZtc2ctPmxpc3QpOworCW1zZy0+dHlwZSA9IEJGSU5fSVBJX1JFU0NIRURVTEU7CisKKwltc2dfcXVldWUgPSAmcGVyX2NwdShpcGlfbXNnX3F1ZXVlLCBjcHUpOworCXNwaW5fbG9ja19pcnFzYXZlKCZtc2dfcXVldWUtPmxvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZCgmbXNnLT5saXN0LCAmbXNnX3F1ZXVlLT5oZWFkKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc2dfcXVldWUtPmxvY2ssIGZsYWdzKTsKKwlwbGF0Zm9ybV9zZW5kX2lwaV9jcHUoY3B1KTsKKworCXJldHVybjsKK30KKwordm9pZCBzbXBfc2VuZF9zdG9wKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGNwdTsKKwljcHVtYXNrX3QgY2FsbG1hcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpcGlfbWVzc2FnZV9xdWV1ZSAqbXNnX3F1ZXVlOworCXN0cnVjdCBpcGlfbWVzc2FnZSAqbXNnOworCisJY2FsbG1hcCA9IGNwdV9vbmxpbmVfbWFwOworCWNwdV9jbGVhcihzbXBfcHJvY2Vzc29yX2lkKCksIGNhbGxtYXApOworCWlmIChjcHVzX2VtcHR5KGNhbGxtYXApKQorCQlyZXR1cm47CisKKwltc2cgPSBrbWFsbG9jKHNpemVvZigqbXNnKSwgR0ZQX0FUT01JQyk7CisJbWVtc2V0KG1zZywgMCwgc2l6ZW9mKG1zZykpOworCUlOSVRfTElTVF9IRUFEKCZtc2ctPmxpc3QpOworCW1zZy0+dHlwZSA9IEJGSU5fSVBJX0NQVV9TVE9QOworCisJZm9yX2VhY2hfY3B1X21hc2soY3B1LCBjYWxsbWFwKSB7CisJCW1zZ19xdWV1ZSA9ICZwZXJfY3B1KGlwaV9tc2dfcXVldWUsIGNwdSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZtc2dfcXVldWUtPmxvY2ssIGZsYWdzKTsKKwkJbGlzdF9hZGQoJm1zZy0+bGlzdCwgJm1zZ19xdWV1ZS0+aGVhZCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1zZ19xdWV1ZS0+bG9jaywgZmxhZ3MpOworCQlwbGF0Zm9ybV9zZW5kX2lwaV9jcHUoY3B1KTsKKwl9CisJcmV0dXJuOworfQorCitpbnQgX19jcHVpbml0IF9fY3B1X3VwKHVuc2lnbmVkIGludCBjcHUpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICppZGxlOworCWludCByZXQ7CisKKwlpZGxlID0gZm9ya19pZGxlKGNwdSk7CisJaWYgKElTX0VSUihpZGxlKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkNQVSV1OiBmb3JrKCkgZmFpbGVkXG4iLCBjcHUpOworCQlyZXR1cm4gUFRSX0VSUihpZGxlKTsKKwl9CisKKwlzZWNvbmRhcnlfc3RhY2sgPSB0YXNrX3N0YWNrX3BhZ2UoaWRsZSkgKyBUSFJFQURfU0laRTsKKwlzbXBfd21iKCk7CisKKwlyZXQgPSBwbGF0Zm9ybV9ib290X3NlY29uZGFyeShjcHUsIGlkbGUpOworCisJaWYgKHJldCkgeworCQljcHVfY2xlYXIoY3B1LCBjcHVfcHJlc2VudF9tYXApOworCQlwcmludGsoS0VSTl9DUklUICJDUFUldTogcHJvY2Vzc29yIGZhaWxlZCB0byBib290ICglZClcbiIsIGNwdSwgcmV0KTsKKwkJZnJlZV90YXNrKGlkbGUpOworCX0gZWxzZQorCQljcHVfc2V0KGNwdSwgY3B1X29ubGluZV9tYXApOworCisJc2Vjb25kYXJ5X3N0YWNrID0gTlVMTDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBzZXR1cF9zZWNvbmRhcnkodW5zaWduZWQgaW50IGNwdSkKK3sKKyNpZiAhKGRlZmluZWQoQ09ORklHX1RJQ0tfU09VUkNFX1NZU1RNUjApIHx8IGRlZmluZWQoQ09ORklHX0lQSVBFKSkKKwlzdHJ1Y3QgaXJxX2Rlc2MgKnRpbWVyX2Rlc2M7CisjZW5kaWYKKwl1bnNpZ25lZCBsb25nIGlsYXQ7CisKKwliZmluX3dyaXRlX0lNQVNLKDApOworCUNTWU5DKCk7CisJaWxhdCA9IGJmaW5fcmVhZF9JTEFUKCk7CisJQ1NZTkMoKTsKKwliZmluX3dyaXRlX0lMQVQoaWxhdCk7CisJQ1NZTkMoKTsKKworCS8qIFJlc2VydmUgdGhlIFBEQSBzcGFjZSBmb3IgdGhlIHNlY29uZGFyeSBDUFUuICovCisJcmVzZXJ2ZV9wZGEoKTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHQgbGV2ZWxzIElWRzctMTUuIElBUnMgaGF2ZSBiZWVuIGFscmVhZHkKKwkgKiBwcm9ncmFtbWVkIGJ5IHRoZSBib290IENQVS4gICovCisJYmZpbl9pcnFfZmxhZ3MgfD0gSU1BU0tfSVZHMTUgfAorCSAgICBJTUFTS19JVkcxNCB8IElNQVNLX0lWRzEzIHwgSU1BU0tfSVZHMTIgfCBJTUFTS19JVkcxMSB8CisJICAgIElNQVNLX0lWRzEwIHwgSU1BU0tfSVZHOSB8IElNQVNLX0lWRzggfCBJTUFTS19JVkc3IHwgSU1BU0tfSVZHSFc7CisKKyNpZiBkZWZpbmVkKENPTkZJR19USUNLX1NPVVJDRV9TWVNUTVIwKSB8fCBkZWZpbmVkKENPTkZJR19JUElQRSkKKwkvKiBQb3dlciBkb3duIHRoZSBjb3JlIHRpbWVyLCBqdXN0IHRvIHBsYXkgc2FmZS4gKi8KKwliZmluX3dyaXRlX1RDTlRMKDApOworCisJLyogc3lzdGVtIHRpbWVyMCBoYXMgYmVlbiBzZXR1cCBieSBDb3JlQS4gKi8KKyNlbHNlCisJdGltZXJfZGVzYyA9IGlycV9kZXNjICsgSVJRX0NPUkVUTVI7CisJc2V0dXBfY29yZV90aW1lcigpOworCXRpbWVyX2Rlc2MtPmNoaXAtPmVuYWJsZShJUlFfQ09SRVRNUik7CisjZW5kaWYKK30KKwordm9pZCBfX2NwdWluaXQgc2Vjb25kYXJ5X3N0YXJ0X2tlcm5lbCh2b2lkKQoreworCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSAmaW5pdF9tbTsKKworCWlmIChfYmZpbl9zd3JzdCAmIFNXUlNUX0RCTF9GQVVMVF9CKSB7CisJCXByaW50ayhLRVJOX0VNRVJHICJDb3JlQiBSZWNvdmVyaW5nIGZyb20gRE9VQkxFIEZBVUxUIGV2ZW50XG4iKTsKKyNpZmRlZiBDT05GSUdfREVCVUdfRE9VQkxFRkFVTFQKKwkJcHJpbnRrKEtFUk5fRU1FUkcgIiBXaGlsZSBoYW5kbGluZyBleGNlcHRpb24gKEVYQ0FVU0UgPSAweCV4KSBhdCAlcEZcbiIsCisJCQkoaW50KWluaXRfc2F2ZWRfc2Vxc3RhdF9jb3JlYiAmIFNFUVNUQVRfRVhDQVVTRSwgaW5pdF9zYXZlZF9yZXR4X2NvcmViKTsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIgICBEQ1BMQl9GQVVMVF9BRERSOiAlcEZcbiIsIGluaXRfc2F2ZWRfZGNwbGJfZmF1bHRfYWRkcl9jb3JlYik7CisJCXByaW50ayhLRVJOX05PVElDRSAiICAgSUNQTEJfRkFVTFRfQUREUjogJXBGXG4iLCBpbml0X3NhdmVkX2ljcGxiX2ZhdWx0X2FkZHJfY29yZWIpOworI2VuZGlmCisJCXByaW50ayhLRVJOX05PVElDRSAiIFRoZSBpbnN0cnVjdGlvbiBhdCAlcEYgY2F1c2VkIGEgZG91YmxlIGV4Y2VwdGlvblxuIiwKKwkJCWluaXRfcmV0eF9jb3JlYik7CisJfQorCisJLyoKKwkgKiBXZSB3YW50IHRoZSBELWNhY2hlIHRvIGJlIGVuYWJsZWQgZWFybHksIGluIGNhc2UgdGhlIGF0b21pYworCSAqIHN1cHBvcnQgY29kZSBlbXVsYXRlcyBjYWNoZSBjb2hlcmVuY2UgKHNlZQorCSAqIF9fQVJDSF9TWU5DX0NPUkVfRENBQ0hFKS4KKwkgKi8KKwlpbml0X2V4Y2VwdGlvbl92ZWN0b3JzKCk7CisKKwliZmluX3NldHVwX2NhY2hlcyhjcHUpOworCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKworCS8qIEF0dGFjaCB0aGUgbmV3IGlkbGUgdGFzayB0byB0aGUgZ2xvYmFsIG1tLiAqLworCWF0b21pY19pbmMoJm1tLT5tbV91c2Vycyk7CisJYXRvbWljX2luYygmbW0tPm1tX2NvdW50KTsKKwljdXJyZW50LT5hY3RpdmVfbW0gPSBtbTsKKwlCVUdfT04oY3VycmVudC0+bW0pOwkvKiBDYW4ndCBiZSwgYnV0IGJldHRlciBiZSBzYWZlIHRoYW4gc29ycnkuICovCisKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKworCXNldHVwX3NlY29uZGFyeShjcHUpOworCisJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJcGxhdGZvcm1fc2Vjb25kYXJ5X2luaXQoY3B1KTsKKworCWNwdV9pZGxlKCk7Cit9CisKK3ZvaWQgX19pbml0IHNtcF9wcmVwYXJlX2Jvb3RfY3B1KHZvaWQpCit7Cit9CisKK3ZvaWQgX19pbml0IHNtcF9wcmVwYXJlX2NwdXModW5zaWduZWQgaW50IG1heF9jcHVzKQoreworCXBsYXRmb3JtX3ByZXBhcmVfY3B1cyhtYXhfY3B1cyk7CisJaXBpX3F1ZXVlX2luaXQoKTsKKwlwbGF0Zm9ybV9yZXF1ZXN0X2lwaSgmaXBpX2hhbmRsZXIpOworfQorCit2b2lkIF9faW5pdCBzbXBfY3B1c19kb25lKHVuc2lnbmVkIGludCBtYXhfY3B1cykKK3sKKwl1bnNpZ25lZCBsb25nIGJvZ29zdW0gPSAwOworCXVuc2lnbmVkIGludCBjcHU7CisKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKKwkJYm9nb3N1bSArPSBwZXJfY3B1KGNwdV9kYXRhLCBjcHUpLmxvb3BzX3Blcl9qaWZmeTsKKworCXByaW50ayhLRVJOX0lORk8gIlNNUDogVG90YWwgb2YgJWQgcHJvY2Vzc29ycyBhY3RpdmF0ZWQgIgorCSAgICAgICAiKCVsdS4lMDJsdSBCb2dvTUlQUykuXG4iLAorCSAgICAgICBudW1fb25saW5lX2NwdXMoKSwKKwkgICAgICAgYm9nb3N1bSAvICg1MDAwMDAvSFopLAorCSAgICAgICAoYm9nb3N1bSAvICg1MDAwL0haKSkgJSAxMDApOworfQorCit2b2lkIHNtcF9pY2FjaGVfZmx1c2hfcmFuZ2Vfb3RoZXJzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCXNtcF9mbHVzaF9kYXRhLnN0YXJ0ID0gc3RhcnQ7CisJc21wX2ZsdXNoX2RhdGEuZW5kID0gZW5kOworCisJaWYgKHNtcF9jYWxsX2Z1bmN0aW9uKCZpcGlfZmx1c2hfaWNhY2hlLCAmc21wX2ZsdXNoX2RhdGEsIDEpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJTTVA6IGZhaWxlZCB0byBydW4gSS1jYWNoZSBmbHVzaCByZXF1ZXN0IG9uIG90aGVyIENQVXNcbiIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc21wX2ljYWNoZV9mbHVzaF9yYW5nZV9vdGhlcnMpOworCisjaWZkZWYgX19BUkNIX1NZTkNfQ09SRV9EQ0FDSEUKK3Vuc2lnbmVkIGxvbmcgYmFycmllcl9tYXNrIF9fYXR0cmlidXRlX18gKChfX3NlY3Rpb25fXygiLmwyLmJzcyIpKSk7CisKK3ZvaWQgcmVzeW5jX2NvcmVfZGNhY2hlKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGNwdSA9IGdldF9jcHUoKTsKKwlibGFja2Zpbl9pbnZhbGlkYXRlX2VudGlyZV9kY2FjaGUoKTsKKwkrK3Blcl9jcHUoY3B1X2RhdGEsIGNwdSkuZGNhY2hlX2ludmxkX2NvdW50OworCXB1dF9jcHUoKTsKK30KK0VYUE9SVF9TWU1CT0wocmVzeW5jX2NvcmVfZGNhY2hlKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tbS9pbml0LmMgYi9hcmNoL2JsYWNrZmluL21tL2luaXQuYwppbmRleCBiYzI0MGFiLi5kMDUzMmI3IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21tL2luaXQuYworKysgYi9hcmNoL2JsYWNrZmluL21tL2luaXQuYwpAQCAtMzEsNyArMzEsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2JmaW4tZ2xvYmFsLmg+Ci0jaW5jbHVkZSA8YXNtL2wxbGF5b3V0Lmg+CisjaW5jbHVkZSA8YXNtL3BkYS5oPgorI2luY2x1ZGUgPGFzbS9jcGxiaW5pdC5oPgogI2luY2x1ZGUgImJsYWNrZmluX3NyYW0uaCIKIAogLyoKQEAgLTUzLDYgKzU0LDExIEBACiAKIHVuc2lnbmVkIGxvbmcgZW1wdHlfemVyb19wYWdlOwogCitleHRlcm4gdW5zaWduZWQgbG9uZyBleGNlcHRpb25fc3RhY2tbTlJfQ1BVU11bMTAyNF07CisKK3N0cnVjdCBibGFja2Zpbl9wZGEgY3B1X3BkYVtOUl9DUFVTXTsKK0VYUE9SVF9TWU1CT0woY3B1X3BkYSk7CisKIC8qCiAgKiBwYWdpbmdfaW5pdCgpIGNvbnRpbnVlcyB0aGUgdmlydHVhbCBtZW1vcnkgZW52aXJvbm1lbnQgc2V0dXAgd2hpY2gKICAqIHdhcyBiZWd1biBieSB0aGUgY29kZSBpbiBhcmNoL2hlYWQuUy4KQEAgLTk4LDYgKzEwNCwzMiBAQAogCX0KIH0KIAorYXNtbGlua2FnZSB2b2lkIGluaXRfcGRhKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGNwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBQREEgZmllbGRzIGhvbGRpbmcgcmVmZXJlbmNlcyB0byBvdGhlciBwYXJ0cworCSAgIG9mIHRoZSBtZW1vcnkuIFRoZSBjb250ZW50IG9mIHN1Y2ggbWVtb3J5IGlzIHN0aWxsCisJICAgdW5kZWZpbmVkIGF0IHRoZSB0aW1lIG9mIHRoZSBjYWxsLCB3ZSBhcmUgb25seSBzZXR0aW5nIHVwCisJICAgdmFsaWQgcG9pbnRlcnMgdG8gaXQuICovCisJbWVtc2V0KCZjcHVfcGRhW2NwdV0sIDAsIHNpemVvZihjcHVfcGRhW2NwdV0pKTsKKworCWNwdV9wZGFbMF0ubmV4dCA9ICZjcHVfcGRhWzFdOworCWNwdV9wZGFbMV0ubmV4dCA9ICZjcHVfcGRhWzBdOworCisJY3B1X3BkYVtjcHVdLmV4X3N0YWNrID0gZXhjZXB0aW9uX3N0YWNrW2NwdSArIDFdOworCisjaWZkZWYgQ09ORklHX1NNUAorCWNwdV9wZGFbY3B1XS5pbWFzayA9IDB4MWY7CisjZW5kaWYKK30KKwordm9pZCBfX2NwdWluaXQgcmVzZXJ2ZV9wZGEodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJQREEgZm9yIENQVSV1IHJlc2VydmVkIGF0ICVwXG4iLCBzbXBfcHJvY2Vzc29yX2lkKCksCisJCQkJCSZjcHVfcGRhW3NtcF9wcm9jZXNzb3JfaWQoKV0pOworfQorCiB2b2lkIF9faW5pdCBtZW1faW5pdCh2b2lkKQogewogCXVuc2lnbmVkIGludCBjb2RlayA9IDAsIGRhdGFrID0gMCwgaW5pdGsgPSAwOwpAQCAtMTQxLDIxICsxNzMsMTMgQEAKIAogc3RhdGljIGludCBfX2luaXQgc3JhbV9pbml0KHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyB0bXA7Ci0KIAkvKiBJbml0aWFsaXplIHRoZSBibGFja2ZpbiBMMSBNZW1vcnkuICovCiAJYmZpbl9zcmFtX2luaXQoKTsKIAotCS8qIEFsbG9jYXRlIHRoaXMgb25jZTsgbmV2ZXIgZnJlZSBpdC4gIFdlIGFzc3VtZSB0aGlzIGdpdmVzIHVzIGEKLQkgICBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiBMMSBzY3JhdGNocGFkIG1lbW9yeTsgcGFuaWMgaWYgaXQKLQkgICBkb2Vzbid0LiAgKi8KLQl0bXAgPSAodW5zaWduZWQgbG9uZylsMXNyYW1fYWxsb2Moc2l6ZW9mKHN0cnVjdCBsMV9zY3JhdGNoX3Rhc2tfaW5mbykpOwotCWlmICh0bXAgIT0gKHVuc2lnbmVkIGxvbmcpTDFfU0NSQVRDSF9UQVNLX0lORk8pIHsKLQkJcHJpbnRrKEtFUk5fRU1FUkcgIm1lbV9pbml0KCk6IERpZCBub3QgZ2V0IHRoZSByaWdodCBhZGRyZXNzIGZyb20gbDFzcmFtX2FsbG9jOiAlMDhseCAhPSAlMDhseFxuIiwKLQkJCXRtcCwgKHVuc2lnbmVkIGxvbmcpTDFfU0NSQVRDSF9UQVNLX0lORk8pOwotCQlwYW5pYygiTm8gTDEsIHRpbWUgdG8gZ2l2ZSB1cFxuIik7Ci0JfQotCisJLyogUmVzZXJ2ZSB0aGUgUERBIHNwYWNlIGZvciB0aGUgYm9vdCBDUFUgcmlnaHQgYWZ0ZXIgd2UKKwkgKiBpbml0aWFsaXplZCB0aGUgc2NyYXRjaCBtZW1vcnkgYWxsb2NhdG9yLgorCSAqLworCXJlc2VydmVfcGRhKCk7CiAJcmV0dXJuIDA7CiB9CiBwdXJlX2luaXRjYWxsKHNyYW1faW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21tL3NyYW0tYWxsb2MuYyBiL2FyY2gvYmxhY2tmaW4vbW0vc3JhbS1hbGxvYy5jCmluZGV4IGNjNmYzMzYuLjgzNGNhYjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbW0vc3JhbS1hbGxvYy5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbW0vc3JhbS1hbGxvYy5jCkBAIC0zOSwxMCArMzksMTMgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgogI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgorI2luY2x1ZGUgPGFzbS9tZW1fbWFwLmg+CiAjaW5jbHVkZSAiYmxhY2tmaW5fc3JhbS5oIgogCi1zdGF0aWMgc3BpbmxvY2tfdCBsMXNyYW1fbG9jaywgbDFfZGF0YV9zcmFtX2xvY2ssIGwxX2luc3Rfc3JhbV9sb2NrOwotc3RhdGljIHNwaW5sb2NrX3QgbDJfc3JhbV9sb2NrOworc3RhdGljIERFRklORV9QRVJfQ1BVKHNwaW5sb2NrX3QsIGwxc3JhbV9sb2NrKSBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOworc3RhdGljIERFRklORV9QRVJfQ1BVKHNwaW5sb2NrX3QsIGwxX2RhdGFfc3JhbV9sb2NrKSBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOworc3RhdGljIERFRklORV9QRVJfQ1BVKHNwaW5sb2NrX3QsIGwxX2luc3Rfc3JhbV9sb2NrKSBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOworc3RhdGljIHNwaW5sb2NrX3QgbDJfc3JhbV9sb2NrIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CiAKIC8qIHRoZSBkYXRhIHN0cnVjdHVyZSBmb3IgTDEgc2NyYXRjaHBhZCBhbmQgREFUQSBTUkFNICovCiBzdHJ1Y3Qgc3JhbV9waWVjZSB7CkBAIC01MiwxOCArNTUsMjIgQEAKIAlzdHJ1Y3Qgc3JhbV9waWVjZSAqbmV4dDsKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc3JhbV9waWVjZSBmcmVlX2wxX3NzcmFtX2hlYWQsIHVzZWRfbDFfc3NyYW1faGVhZDsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgc3JhbV9waWVjZSwgZnJlZV9sMV9zc3JhbV9oZWFkKTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgc3JhbV9waWVjZSwgdXNlZF9sMV9zc3JhbV9oZWFkKTsKIAogI2lmIEwxX0RBVEFfQV9MRU5HVEggIT0gMAotc3RhdGljIHN0cnVjdCBzcmFtX3BpZWNlIGZyZWVfbDFfZGF0YV9BX3NyYW1faGVhZCwgdXNlZF9sMV9kYXRhX0Ffc3JhbV9oZWFkOworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBzcmFtX3BpZWNlLCBmcmVlX2wxX2RhdGFfQV9zcmFtX2hlYWQpOworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBzcmFtX3BpZWNlLCB1c2VkX2wxX2RhdGFfQV9zcmFtX2hlYWQpOwogI2VuZGlmCiAKICNpZiBMMV9EQVRBX0JfTEVOR1RIICE9IDAKLXN0YXRpYyBzdHJ1Y3Qgc3JhbV9waWVjZSBmcmVlX2wxX2RhdGFfQl9zcmFtX2hlYWQsIHVzZWRfbDFfZGF0YV9CX3NyYW1faGVhZDsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgc3JhbV9waWVjZSwgZnJlZV9sMV9kYXRhX0Jfc3JhbV9oZWFkKTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgc3JhbV9waWVjZSwgdXNlZF9sMV9kYXRhX0Jfc3JhbV9oZWFkKTsKICNlbmRpZgogCiAjaWYgTDFfQ09ERV9MRU5HVEggIT0gMAotc3RhdGljIHN0cnVjdCBzcmFtX3BpZWNlIGZyZWVfbDFfaW5zdF9zcmFtX2hlYWQsIHVzZWRfbDFfaW5zdF9zcmFtX2hlYWQ7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHNyYW1fcGllY2UsIGZyZWVfbDFfaW5zdF9zcmFtX2hlYWQpOworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBzcmFtX3BpZWNlLCB1c2VkX2wxX2luc3Rfc3JhbV9oZWFkKTsKICNlbmRpZgogCiAjaWYgTDJfTEVOR1RIICE9IDAKQEAgLTc1LDEwMiArODIsMTE3IEBACiAvKiBMMSBTY3JhdGNocGFkIFNSQU0gaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gKi8KIHN0YXRpYyB2b2lkIF9faW5pdCBsMXNyYW1faW5pdCh2b2lkKQogewotCWZyZWVfbDFfc3NyYW1faGVhZC5uZXh0ID0KLQkJa21lbV9jYWNoZV9hbGxvYyhzcmFtX3BpZWNlX2NhY2hlLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWZyZWVfbDFfc3NyYW1faGVhZC5uZXh0KSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIkZhaWxlZCB0byBpbml0aWFsaXplIFNjcmF0Y2hwYWQgZGF0YSBTUkFNXG4iKTsKLQkJcmV0dXJuOworCXVuc2lnbmVkIGludCBjcHU7CisJZm9yIChjcHUgPSAwOyBjcHUgPCBudW1fcG9zc2libGVfY3B1cygpOyArK2NwdSkgeworCQlwZXJfY3B1KGZyZWVfbDFfc3NyYW1faGVhZCwgY3B1KS5uZXh0ID0KKwkJCWttZW1fY2FjaGVfYWxsb2Moc3JhbV9waWVjZV9jYWNoZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcGVyX2NwdShmcmVlX2wxX3NzcmFtX2hlYWQsIGNwdSkubmV4dCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiRmFpbCB0byBpbml0aWFsaXplIFNjcmF0Y2hwYWQgZGF0YSBTUkFNLlxuIik7CisJCQlyZXR1cm47CisJCX0KKworCQlwZXJfY3B1KGZyZWVfbDFfc3NyYW1faGVhZCwgY3B1KS5uZXh0LT5wYWRkciA9ICh2b2lkICopZ2V0X2wxX3NjcmF0Y2hfc3RhcnRfY3B1KGNwdSk7CisJCXBlcl9jcHUoZnJlZV9sMV9zc3JhbV9oZWFkLCBjcHUpLm5leHQtPnNpemUgPSBMMV9TQ1JBVENIX0xFTkdUSDsKKwkJcGVyX2NwdShmcmVlX2wxX3NzcmFtX2hlYWQsIGNwdSkubmV4dC0+cGlkID0gMDsKKwkJcGVyX2NwdShmcmVlX2wxX3NzcmFtX2hlYWQsIGNwdSkubmV4dC0+bmV4dCA9IE5VTEw7CisKKwkJcGVyX2NwdSh1c2VkX2wxX3NzcmFtX2hlYWQsIGNwdSkubmV4dCA9IE5VTEw7CisKKwkJLyogbXV0ZXggaW5pdGlhbGl6ZSAqLworCQlzcGluX2xvY2tfaW5pdCgmcGVyX2NwdShsMXNyYW1fbG9jaywgY3B1KSk7CisJCXByaW50ayhLRVJOX0lORk8gIkJsYWNrZmluIFNjcmF0Y2hwYWQgZGF0YSBTUkFNOiAlZCBLQlxuIiwKKwkJCUwxX1NDUkFUQ0hfTEVOR1RIID4+IDEwKTsKIAl9Ci0KLQlmcmVlX2wxX3NzcmFtX2hlYWQubmV4dC0+cGFkZHIgPSAodm9pZCAqKUwxX1NDUkFUQ0hfU1RBUlQ7Ci0JZnJlZV9sMV9zc3JhbV9oZWFkLm5leHQtPnNpemUgPSBMMV9TQ1JBVENIX0xFTkdUSDsKLQlmcmVlX2wxX3NzcmFtX2hlYWQubmV4dC0+cGlkID0gMDsKLQlmcmVlX2wxX3NzcmFtX2hlYWQubmV4dC0+bmV4dCA9IE5VTEw7Ci0KLQl1c2VkX2wxX3NzcmFtX2hlYWQubmV4dCA9IE5VTEw7Ci0KLQkvKiBtdXRleCBpbml0aWFsaXplICovCi0Jc3Bpbl9sb2NrX2luaXQoJmwxc3JhbV9sb2NrKTsKLQotCXByaW50ayhLRVJOX0lORk8gIkJsYWNrZmluIFNjcmF0Y2hwYWQgZGF0YSBTUkFNOiAlZCBLQlxuIiwKLQkgICAgICAgTDFfU0NSQVRDSF9MRU5HVEggPj4gMTApOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgbDFfZGF0YV9zcmFtX2luaXQodm9pZCkKIHsKKyNpZiBMMV9EQVRBX0FfTEVOR1RIICE9IDAgfHwgTDFfREFUQV9CX0xFTkdUSCAhPSAwCisJdW5zaWduZWQgaW50IGNwdTsKKyNlbmRpZgogI2lmIEwxX0RBVEFfQV9MRU5HVEggIT0gMAotCWZyZWVfbDFfZGF0YV9BX3NyYW1faGVhZC5uZXh0ID0KLQkJa21lbV9jYWNoZV9hbGxvYyhzcmFtX3BpZWNlX2NhY2hlLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWZyZWVfbDFfZGF0YV9BX3NyYW1faGVhZC5uZXh0KSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIkZhaWxlZCB0byBpbml0aWFsaXplIEwxIERhdGEgQSBTUkFNXG4iKTsKLQkJcmV0dXJuOworCWZvciAoY3B1ID0gMDsgY3B1IDwgbnVtX3Bvc3NpYmxlX2NwdXMoKTsgKytjcHUpIHsKKwkJcGVyX2NwdShmcmVlX2wxX2RhdGFfQV9zcmFtX2hlYWQsIGNwdSkubmV4dCA9CisJCQlrbWVtX2NhY2hlX2FsbG9jKHNyYW1fcGllY2VfY2FjaGUsIEdGUF9LRVJORUwpOworCQlpZiAoIXBlcl9jcHUoZnJlZV9sMV9kYXRhX0Ffc3JhbV9oZWFkLCBjcHUpLm5leHQpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIkZhaWwgdG8gaW5pdGlhbGl6ZSBMMSBEYXRhIEEgU1JBTS5cbiIpOworCQkJcmV0dXJuOworCQl9CisKKwkJcGVyX2NwdShmcmVlX2wxX2RhdGFfQV9zcmFtX2hlYWQsIGNwdSkubmV4dC0+cGFkZHIgPQorCQkJKHZvaWQgKilnZXRfbDFfZGF0YV9hX3N0YXJ0X2NwdShjcHUpICsgKF9lYnNzX2wxIC0gX3NkYXRhX2wxKTsKKwkJcGVyX2NwdShmcmVlX2wxX2RhdGFfQV9zcmFtX2hlYWQsIGNwdSkubmV4dC0+c2l6ZSA9CisJCQlMMV9EQVRBX0FfTEVOR1RIIC0gKF9lYnNzX2wxIC0gX3NkYXRhX2wxKTsKKwkJcGVyX2NwdShmcmVlX2wxX2RhdGFfQV9zcmFtX2hlYWQsIGNwdSkubmV4dC0+cGlkID0gMDsKKwkJcGVyX2NwdShmcmVlX2wxX2RhdGFfQV9zcmFtX2hlYWQsIGNwdSkubmV4dC0+bmV4dCA9IE5VTEw7CisKKwkJcGVyX2NwdSh1c2VkX2wxX2RhdGFfQV9zcmFtX2hlYWQsIGNwdSkubmV4dCA9IE5VTEw7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQmxhY2tmaW4gTDEgRGF0YSBBIFNSQU06ICVkIEtCICglZCBLQiBmcmVlKVxuIiwKKwkJCUwxX0RBVEFfQV9MRU5HVEggPj4gMTAsCisJCQlwZXJfY3B1KGZyZWVfbDFfZGF0YV9BX3NyYW1faGVhZCwgY3B1KS5uZXh0LT5zaXplID4+IDEwKTsKIAl9Ci0KLQlmcmVlX2wxX2RhdGFfQV9zcmFtX2hlYWQubmV4dC0+cGFkZHIgPQotCQkodm9pZCAqKUwxX0RBVEFfQV9TVEFSVCArIChfZWJzc19sMSAtIF9zZGF0YV9sMSk7Ci0JZnJlZV9sMV9kYXRhX0Ffc3JhbV9oZWFkLm5leHQtPnNpemUgPQotCQlMMV9EQVRBX0FfTEVOR1RIIC0gKF9lYnNzX2wxIC0gX3NkYXRhX2wxKTsKLQlmcmVlX2wxX2RhdGFfQV9zcmFtX2hlYWQubmV4dC0+cGlkID0gMDsKLQlmcmVlX2wxX2RhdGFfQV9zcmFtX2hlYWQubmV4dC0+bmV4dCA9IE5VTEw7Ci0KLQl1c2VkX2wxX2RhdGFfQV9zcmFtX2hlYWQubmV4dCA9IE5VTEw7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJCbGFja2ZpbiBMMSBEYXRhIEEgU1JBTTogJWQgS0IgKCVkIEtCIGZyZWUpXG4iLAotCQlMMV9EQVRBX0FfTEVOR1RIID4+IDEwLAotCQlmcmVlX2wxX2RhdGFfQV9zcmFtX2hlYWQubmV4dC0+c2l6ZSA+PiAxMCk7CiAjZW5kaWYKICNpZiBMMV9EQVRBX0JfTEVOR1RIICE9IDAKLQlmcmVlX2wxX2RhdGFfQl9zcmFtX2hlYWQubmV4dCA9Ci0JCWttZW1fY2FjaGVfYWxsb2Moc3JhbV9waWVjZV9jYWNoZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFmcmVlX2wxX2RhdGFfQl9zcmFtX2hlYWQubmV4dCkgewotCQlwcmludGsoS0VSTl9JTkZPICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBMMSBEYXRhIEIgU1JBTVxuIik7Ci0JCXJldHVybjsKKwlmb3IgKGNwdSA9IDA7IGNwdSA8IG51bV9wb3NzaWJsZV9jcHVzKCk7ICsrY3B1KSB7CisJCXBlcl9jcHUoZnJlZV9sMV9kYXRhX0Jfc3JhbV9oZWFkLCBjcHUpLm5leHQgPQorCQkJa21lbV9jYWNoZV9hbGxvYyhzcmFtX3BpZWNlX2NhY2hlLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwZXJfY3B1KGZyZWVfbDFfZGF0YV9CX3NyYW1faGVhZCwgY3B1KS5uZXh0KSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJGYWlsIHRvIGluaXRpYWxpemUgTDEgRGF0YSBCIFNSQU0uXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXBlcl9jcHUoZnJlZV9sMV9kYXRhX0Jfc3JhbV9oZWFkLCBjcHUpLm5leHQtPnBhZGRyID0KKwkJCSh2b2lkICopZ2V0X2wxX2RhdGFfYl9zdGFydF9jcHUoY3B1KSArIChfZWJzc19iX2wxIC0gX3NkYXRhX2JfbDEpOworCQlwZXJfY3B1KGZyZWVfbDFfZGF0YV9CX3NyYW1faGVhZCwgY3B1KS5uZXh0LT5zaXplID0KKwkJCUwxX0RBVEFfQl9MRU5HVEggLSAoX2Vic3NfYl9sMSAtIF9zZGF0YV9iX2wxKTsKKwkJcGVyX2NwdShmcmVlX2wxX2RhdGFfQl9zcmFtX2hlYWQsIGNwdSkubmV4dC0+cGlkID0gMDsKKwkJcGVyX2NwdShmcmVlX2wxX2RhdGFfQl9zcmFtX2hlYWQsIGNwdSkubmV4dC0+bmV4dCA9IE5VTEw7CisKKwkJcGVyX2NwdSh1c2VkX2wxX2RhdGFfQl9zcmFtX2hlYWQsIGNwdSkubmV4dCA9IE5VTEw7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQmxhY2tmaW4gTDEgRGF0YSBCIFNSQU06ICVkIEtCICglZCBLQiBmcmVlKVxuIiwKKwkJCUwxX0RBVEFfQl9MRU5HVEggPj4gMTAsCisJCQlwZXJfY3B1KGZyZWVfbDFfZGF0YV9CX3NyYW1faGVhZCwgY3B1KS5uZXh0LT5zaXplID4+IDEwKTsKKwkJLyogbXV0ZXggaW5pdGlhbGl6ZSAqLwogCX0KLQotCWZyZWVfbDFfZGF0YV9CX3NyYW1faGVhZC5uZXh0LT5wYWRkciA9Ci0JCSh2b2lkICopTDFfREFUQV9CX1NUQVJUICsgKF9lYnNzX2JfbDEgLSBfc2RhdGFfYl9sMSk7Ci0JZnJlZV9sMV9kYXRhX0Jfc3JhbV9oZWFkLm5leHQtPnNpemUgPQotCQlMMV9EQVRBX0JfTEVOR1RIIC0gKF9lYnNzX2JfbDEgLSBfc2RhdGFfYl9sMSk7Ci0JZnJlZV9sMV9kYXRhX0Jfc3JhbV9oZWFkLm5leHQtPnBpZCA9IDA7Ci0JZnJlZV9sMV9kYXRhX0Jfc3JhbV9oZWFkLm5leHQtPm5leHQgPSBOVUxMOwotCi0JdXNlZF9sMV9kYXRhX0Jfc3JhbV9oZWFkLm5leHQgPSBOVUxMOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiQmxhY2tmaW4gTDEgRGF0YSBCIFNSQU06ICVkIEtCICglZCBLQiBmcmVlKVxuIiwKLQkJTDFfREFUQV9CX0xFTkdUSCA+PiAxMCwKLQkJZnJlZV9sMV9kYXRhX0Jfc3JhbV9oZWFkLm5leHQtPnNpemUgPj4gMTApOwogI2VuZGlmCiAKLQkvKiBtdXRleCBpbml0aWFsaXplICovCi0Jc3Bpbl9sb2NrX2luaXQoJmwxX2RhdGFfc3JhbV9sb2NrKTsKKyNpZiBMMV9EQVRBX0FfTEVOR1RIICE9IDAgfHwgTDFfREFUQV9CX0xFTkdUSCAhPSAwCisJZm9yIChjcHUgPSAwOyBjcHUgPCBudW1fcG9zc2libGVfY3B1cygpOyArK2NwdSkKKwkJc3Bpbl9sb2NrX2luaXQoJnBlcl9jcHUobDFfZGF0YV9zcmFtX2xvY2ssIGNwdSkpOworI2VuZGlmCiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBsMV9pbnN0X3NyYW1faW5pdCh2b2lkKQogewogI2lmIEwxX0NPREVfTEVOR1RIICE9IDAKLQlmcmVlX2wxX2luc3Rfc3JhbV9oZWFkLm5leHQgPQotCQlrbWVtX2NhY2hlX2FsbG9jKHNyYW1fcGllY2VfY2FjaGUsIEdGUF9LRVJORUwpOwotCWlmICghZnJlZV9sMV9pbnN0X3NyYW1faGVhZC5uZXh0KSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIkZhaWxlZCB0byBpbml0aWFsaXplIEwxIEluc3RydWN0aW9uIFNSQU1cbiIpOwotCQlyZXR1cm47CisJdW5zaWduZWQgaW50IGNwdTsKKwlmb3IgKGNwdSA9IDA7IGNwdSA8IG51bV9wb3NzaWJsZV9jcHVzKCk7ICsrY3B1KSB7CisJCXBlcl9jcHUoZnJlZV9sMV9pbnN0X3NyYW1faGVhZCwgY3B1KS5uZXh0ID0KKwkJCWttZW1fY2FjaGVfYWxsb2Moc3JhbV9waWVjZV9jYWNoZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcGVyX2NwdShmcmVlX2wxX2luc3Rfc3JhbV9oZWFkLCBjcHUpLm5leHQpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIkZhaWxlZCB0byBpbml0aWFsaXplIEwxIEluc3RydWN0aW9uIFNSQU1cbiIpOworCQkJcmV0dXJuOworCQl9CisKKwkJcGVyX2NwdShmcmVlX2wxX2luc3Rfc3JhbV9oZWFkLCBjcHUpLm5leHQtPnBhZGRyID0KKwkJCSh2b2lkICopZ2V0X2wxX2NvZGVfc3RhcnRfY3B1KGNwdSkgKyAoX2V0ZXh0X2wxIC0gX3N0ZXh0X2wxKTsKKwkJcGVyX2NwdShmcmVlX2wxX2luc3Rfc3JhbV9oZWFkLCBjcHUpLm5leHQtPnNpemUgPQorCQkJTDFfQ09ERV9MRU5HVEggLSAoX2V0ZXh0X2wxIC0gX3N0ZXh0X2wxKTsKKwkJcGVyX2NwdShmcmVlX2wxX2luc3Rfc3JhbV9oZWFkLCBjcHUpLm5leHQtPnBpZCA9IDA7CisJCXBlcl9jcHUoZnJlZV9sMV9pbnN0X3NyYW1faGVhZCwgY3B1KS5uZXh0LT5uZXh0ID0gTlVMTDsKKworCQlwZXJfY3B1KHVzZWRfbDFfaW5zdF9zcmFtX2hlYWQsIGNwdSkubmV4dCA9IE5VTEw7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQmxhY2tmaW4gTDEgSW5zdHJ1Y3Rpb24gU1JBTTogJWQgS0IgKCVkIEtCIGZyZWUpXG4iLAorCQkJTDFfQ09ERV9MRU5HVEggPj4gMTAsCisJCQlwZXJfY3B1KGZyZWVfbDFfaW5zdF9zcmFtX2hlYWQsIGNwdSkubmV4dC0+c2l6ZSA+PiAxMCk7CisKKwkJLyogbXV0ZXggaW5pdGlhbGl6ZSAqLworCQlzcGluX2xvY2tfaW5pdCgmcGVyX2NwdShsMV9pbnN0X3NyYW1fbG9jaywgY3B1KSk7CiAJfQotCi0JZnJlZV9sMV9pbnN0X3NyYW1faGVhZC5uZXh0LT5wYWRkciA9Ci0JCSh2b2lkICopTDFfQ09ERV9TVEFSVCArIChfZXRleHRfbDEgLSBfc3RleHRfbDEpOwotCWZyZWVfbDFfaW5zdF9zcmFtX2hlYWQubmV4dC0+c2l6ZSA9Ci0JCUwxX0NPREVfTEVOR1RIIC0gKF9ldGV4dF9sMSAtIF9zdGV4dF9sMSk7Ci0JZnJlZV9sMV9pbnN0X3NyYW1faGVhZC5uZXh0LT5waWQgPSAwOwotCWZyZWVfbDFfaW5zdF9zcmFtX2hlYWQubmV4dC0+bmV4dCA9IE5VTEw7Ci0KLQl1c2VkX2wxX2luc3Rfc3JhbV9oZWFkLm5leHQgPSBOVUxMOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiQmxhY2tmaW4gTDEgSW5zdHJ1Y3Rpb24gU1JBTTogJWQgS0IgKCVkIEtCIGZyZWUpXG4iLAotCQlMMV9DT0RFX0xFTkdUSCA+PiAxMCwKLQkJZnJlZV9sMV9pbnN0X3NyYW1faGVhZC5uZXh0LT5zaXplID4+IDEwKTsKICNlbmRpZgotCi0JLyogbXV0ZXggaW5pdGlhbGl6ZSAqLwotCXNwaW5fbG9ja19pbml0KCZsMV9pbnN0X3NyYW1fbG9jayk7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBsMl9zcmFtX2luaXQodm9pZCkKQEAgLTE3OSw3ICsyMDEsNyBAQAogCWZyZWVfbDJfc3JhbV9oZWFkLm5leHQgPQogCQlrbWVtX2NhY2hlX2FsbG9jKHNyYW1fcGllY2VfY2FjaGUsIEdGUF9LRVJORUwpOwogCWlmICghZnJlZV9sMl9zcmFtX2hlYWQubmV4dCkgewotCQlwcmludGsoS0VSTl9JTkZPICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBMMiBTUkFNXG4iKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRmFpbCB0byBpbml0aWFsaXplIEwyIFNSQU0uXG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjAwLDYgKzIyMiw3IEBACiAJLyogbXV0ZXggaW5pdGlhbGl6ZSAqLwogCXNwaW5fbG9ja19pbml0KCZsMl9zcmFtX2xvY2spOwogfQorCiB2b2lkIF9faW5pdCBiZmluX3NyYW1faW5pdCh2b2lkKQogewogCXNyYW1fcGllY2VfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgic3JhbV9waWVjZV9jYWNoZSIsCkBAIC0zNTMsMjAgKzM3NiwyMCBAQAogewogCiAjaWYgTDFfQ09ERV9MRU5HVEggIT0gMAotCWlmIChhZGRyID49ICh2b2lkICopTDFfQ09ERV9TVEFSVAotCQkgJiYgYWRkciA8ICh2b2lkICopKEwxX0NPREVfU1RBUlQgKyBMMV9DT0RFX0xFTkdUSCkpCisJaWYgKGFkZHIgPj0gKHZvaWQgKilnZXRfbDFfY29kZV9zdGFydCgpCisJCSAmJiBhZGRyIDwgKHZvaWQgKikoZ2V0X2wxX2NvZGVfc3RhcnQoKSArIEwxX0NPREVfTEVOR1RIKSkKIAkJcmV0dXJuIGwxX2luc3Rfc3JhbV9mcmVlKGFkZHIpOwogCWVsc2UKICNlbmRpZgogI2lmIEwxX0RBVEFfQV9MRU5HVEggIT0gMAotCWlmIChhZGRyID49ICh2b2lkICopTDFfREFUQV9BX1NUQVJUCi0JCSAmJiBhZGRyIDwgKHZvaWQgKikoTDFfREFUQV9BX1NUQVJUICsgTDFfREFUQV9BX0xFTkdUSCkpCisJaWYgKGFkZHIgPj0gKHZvaWQgKilnZXRfbDFfZGF0YV9hX3N0YXJ0KCkKKwkJICYmIGFkZHIgPCAodm9pZCAqKShnZXRfbDFfZGF0YV9hX3N0YXJ0KCkgKyBMMV9EQVRBX0FfTEVOR1RIKSkKIAkJcmV0dXJuIGwxX2RhdGFfQV9zcmFtX2ZyZWUoYWRkcik7CiAJZWxzZQogI2VuZGlmCiAjaWYgTDFfREFUQV9CX0xFTkdUSCAhPSAwCi0JaWYgKGFkZHIgPj0gKHZvaWQgKilMMV9EQVRBX0JfU1RBUlQKLQkJICYmIGFkZHIgPCAodm9pZCAqKShMMV9EQVRBX0JfU1RBUlQgKyBMMV9EQVRBX0JfTEVOR1RIKSkKKwlpZiAoYWRkciA+PSAodm9pZCAqKWdldF9sMV9kYXRhX2Jfc3RhcnQoKQorCQkgJiYgYWRkciA8ICh2b2lkICopKGdldF9sMV9kYXRhX2Jfc3RhcnQoKSArIEwxX0RBVEFfQl9MRU5HVEgpKQogCQlyZXR1cm4gbDFfZGF0YV9CX3NyYW1fZnJlZShhZGRyKTsKIAllbHNlCiAjZW5kaWYKQEAgLTM4NCwxNyArNDA3LDIwIEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl2b2lkICphZGRyID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgY3B1OwogCisJY3B1ID0gZ2V0X2NwdSgpOwogCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbDFfZGF0YV9zcmFtX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGVyX2NwdShsMV9kYXRhX3NyYW1fbG9jaywgY3B1KSwgZmxhZ3MpOwogCiAjaWYgTDFfREFUQV9BX0xFTkdUSCAhPSAwCi0JYWRkciA9IF9zcmFtX2FsbG9jKHNpemUsICZmcmVlX2wxX2RhdGFfQV9zcmFtX2hlYWQsCi0JCQkmdXNlZF9sMV9kYXRhX0Ffc3JhbV9oZWFkKTsKKwlhZGRyID0gX3NyYW1fYWxsb2Moc2l6ZSwgJnBlcl9jcHUoZnJlZV9sMV9kYXRhX0Ffc3JhbV9oZWFkLCBjcHUpLAorCQkJJnBlcl9jcHUodXNlZF9sMV9kYXRhX0Ffc3JhbV9oZWFkLCBjcHUpKTsKICNlbmRpZgogCiAJLyogYWRkIG11dGV4IG9wZXJhdGlvbiAqLwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmwxX2RhdGFfc3JhbV9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGVyX2NwdShsMV9kYXRhX3NyYW1fbG9jaywgY3B1KSwgZmxhZ3MpOworCXB1dF9jcHUoKTsKIAogCXByX2RlYnVnKCJBbGxvY2F0ZWQgYWRkcmVzcyBpbiBsMV9kYXRhX0Ffc3JhbV9hbGxvYyBpcyAweCVseCsweCVseFxuIiwKIAkJIChsb25nIHVuc2lnbmVkIGludClhZGRyLCBzaXplKTsKQEAgLTQwNywxOSArNDMzLDIyIEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0OworCXVuc2lnbmVkIGludCBjcHU7CiAKKwljcHUgPSBnZXRfY3B1KCk7CiAJLyogYWRkIG11dGV4IG9wZXJhdGlvbiAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZsMV9kYXRhX3NyYW1fbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZwZXJfY3B1KGwxX2RhdGFfc3JhbV9sb2NrLCBjcHUpLCBmbGFncyk7CiAKICNpZiBMMV9EQVRBX0FfTEVOR1RIICE9IDAKLQlyZXQgPSBfc3JhbV9mcmVlKGFkZHIsICZmcmVlX2wxX2RhdGFfQV9zcmFtX2hlYWQsCi0JCQkmdXNlZF9sMV9kYXRhX0Ffc3JhbV9oZWFkKTsKKwlyZXQgPSBfc3JhbV9mcmVlKGFkZHIsICZwZXJfY3B1KGZyZWVfbDFfZGF0YV9BX3NyYW1faGVhZCwgY3B1KSwKKwkJCSZwZXJfY3B1KHVzZWRfbDFfZGF0YV9BX3NyYW1faGVhZCwgY3B1KSk7CiAjZWxzZQogCXJldCA9IC0xOwogI2VuZGlmCiAKIAkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbDFfZGF0YV9zcmFtX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZXJfY3B1KGwxX2RhdGFfc3JhbV9sb2NrLCBjcHUpLCBmbGFncyk7CisJcHV0X2NwdSgpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTQzMCwxNSArNDU5LDE4IEBACiAjaWYgTDFfREFUQV9CX0xFTkdUSCAhPSAwCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl2b2lkICphZGRyOworCXVuc2lnbmVkIGludCBjcHU7CisKKwljcHUgPSBnZXRfY3B1KCk7CisJLyogYWRkIG11dGV4IG9wZXJhdGlvbiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwZXJfY3B1KGwxX2RhdGFfc3JhbV9sb2NrLCBjcHUpLCBmbGFncyk7CisKKwlhZGRyID0gX3NyYW1fYWxsb2Moc2l6ZSwgJnBlcl9jcHUoZnJlZV9sMV9kYXRhX0Jfc3JhbV9oZWFkLCBjcHUpLAorCQkJJnBlcl9jcHUodXNlZF9sMV9kYXRhX0Jfc3JhbV9oZWFkLCBjcHUpKTsKIAogCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbDFfZGF0YV9zcmFtX2xvY2ssIGZsYWdzKTsKLQotCWFkZHIgPSBfc3JhbV9hbGxvYyhzaXplLCAmZnJlZV9sMV9kYXRhX0Jfc3JhbV9oZWFkLAotCQkJJnVzZWRfbDFfZGF0YV9CX3NyYW1faGVhZCk7Ci0KLQkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbDFfZGF0YV9zcmFtX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZXJfY3B1KGwxX2RhdGFfc3JhbV9sb2NrLCBjcHUpLCBmbGFncyk7CisJcHV0X2NwdSgpOwogCiAJcHJfZGVidWcoIkFsbG9jYXRlZCBhZGRyZXNzIGluIGwxX2RhdGFfQl9zcmFtX2FsbG9jIGlzIDB4JWx4KzB4JWx4XG4iLAogCQkgKGxvbmcgdW5zaWduZWQgaW50KWFkZHIsIHNpemUpOwpAQCAtNDU1LDE1ICs0ODcsMTggQEAKICNpZiBMMV9EQVRBX0JfTEVOR1RIICE9IDAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQ7CisJdW5zaWduZWQgaW50IGNwdTsKKworCWNwdSA9IGdldF9jcHUoKTsKKwkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBlcl9jcHUobDFfZGF0YV9zcmFtX2xvY2ssIGNwdSksIGZsYWdzKTsKKworCXJldCA9IF9zcmFtX2ZyZWUoYWRkciwgJnBlcl9jcHUoZnJlZV9sMV9kYXRhX0Jfc3JhbV9oZWFkLCBjcHUpLAorCQkJJnBlcl9jcHUodXNlZF9sMV9kYXRhX0Jfc3JhbV9oZWFkLCBjcHUpKTsKIAogCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbDFfZGF0YV9zcmFtX2xvY2ssIGZsYWdzKTsKLQotCXJldCA9IF9zcmFtX2ZyZWUoYWRkciwgJmZyZWVfbDFfZGF0YV9CX3NyYW1faGVhZCwKLQkJCSZ1c2VkX2wxX2RhdGFfQl9zcmFtX2hlYWQpOwotCi0JLyogYWRkIG11dGV4IG9wZXJhdGlvbiAqLwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmwxX2RhdGFfc3JhbV9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGVyX2NwdShsMV9kYXRhX3NyYW1fbG9jaywgY3B1KSwgZmxhZ3MpOworCXB1dF9jcHUoKTsKIAogCXJldHVybiByZXQ7CiAjZWxzZQpAQCAtNTA5LDE1ICs1NDQsMTggQEAKICNpZiBMMV9DT0RFX0xFTkdUSCAhPSAwCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl2b2lkICphZGRyOworCXVuc2lnbmVkIGludCBjcHU7CisKKwljcHUgPSBnZXRfY3B1KCk7CisJLyogYWRkIG11dGV4IG9wZXJhdGlvbiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwZXJfY3B1KGwxX2luc3Rfc3JhbV9sb2NrLCBjcHUpLCBmbGFncyk7CisKKwlhZGRyID0gX3NyYW1fYWxsb2Moc2l6ZSwgJnBlcl9jcHUoZnJlZV9sMV9pbnN0X3NyYW1faGVhZCwgY3B1KSwKKwkJCSZwZXJfY3B1KHVzZWRfbDFfaW5zdF9zcmFtX2hlYWQsIGNwdSkpOwogCiAJLyogYWRkIG11dGV4IG9wZXJhdGlvbiAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZsMV9pbnN0X3NyYW1fbG9jaywgZmxhZ3MpOwotCi0JYWRkciA9IF9zcmFtX2FsbG9jKHNpemUsICZmcmVlX2wxX2luc3Rfc3JhbV9oZWFkLAotCQkJJnVzZWRfbDFfaW5zdF9zcmFtX2hlYWQpOwotCi0JLyogYWRkIG11dGV4IG9wZXJhdGlvbiAqLwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmwxX2luc3Rfc3JhbV9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGVyX2NwdShsMV9pbnN0X3NyYW1fbG9jaywgY3B1KSwgZmxhZ3MpOworCXB1dF9jcHUoKTsKIAogCXByX2RlYnVnKCJBbGxvY2F0ZWQgYWRkcmVzcyBpbiBsMV9pbnN0X3NyYW1fYWxsb2MgaXMgMHglbHgrMHglbHhcbiIsCiAJCSAobG9uZyB1bnNpZ25lZCBpbnQpYWRkciwgc2l6ZSk7CkBAIC01MzQsMTUgKzU3MiwxOCBAQAogI2lmIEwxX0NPREVfTEVOR1RIICE9IDAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQ7CisJdW5zaWduZWQgaW50IGNwdTsKKworCWNwdSA9IGdldF9jcHUoKTsKKwkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBlcl9jcHUobDFfaW5zdF9zcmFtX2xvY2ssIGNwdSksIGZsYWdzKTsKKworCXJldCA9IF9zcmFtX2ZyZWUoYWRkciwgJnBlcl9jcHUoZnJlZV9sMV9pbnN0X3NyYW1faGVhZCwgY3B1KSwKKwkJCSZwZXJfY3B1KHVzZWRfbDFfaW5zdF9zcmFtX2hlYWQsIGNwdSkpOwogCiAJLyogYWRkIG11dGV4IG9wZXJhdGlvbiAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZsMV9pbnN0X3NyYW1fbG9jaywgZmxhZ3MpOwotCi0JcmV0ID0gX3NyYW1fZnJlZShhZGRyLCAmZnJlZV9sMV9pbnN0X3NyYW1faGVhZCwKLQkJCSZ1c2VkX2wxX2luc3Rfc3JhbV9oZWFkKTsKLQotCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsMV9pbnN0X3NyYW1fbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBlcl9jcHUobDFfaW5zdF9zcmFtX2xvY2ssIGNwdSksIGZsYWdzKTsKKwlwdXRfY3B1KCk7CiAKIAlyZXR1cm4gcmV0OwogI2Vsc2UKQEAgLTU1NiwxNSArNTk3LDE4IEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl2b2lkICphZGRyOworCXVuc2lnbmVkIGludCBjcHU7CisKKwljcHUgPSBnZXRfY3B1KCk7CisJLyogYWRkIG11dGV4IG9wZXJhdGlvbiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwZXJfY3B1KGwxc3JhbV9sb2NrLCBjcHUpLCBmbGFncyk7CisKKwlhZGRyID0gX3NyYW1fYWxsb2Moc2l6ZSwgJnBlcl9jcHUoZnJlZV9sMV9zc3JhbV9oZWFkLCBjcHUpLAorCQkJJnBlcl9jcHUodXNlZF9sMV9zc3JhbV9oZWFkLCBjcHUpKTsKIAogCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbDFzcmFtX2xvY2ssIGZsYWdzKTsKLQotCWFkZHIgPSBfc3JhbV9hbGxvYyhzaXplLCAmZnJlZV9sMV9zc3JhbV9oZWFkLAotCQkJJnVzZWRfbDFfc3NyYW1faGVhZCk7Ci0KLQkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbDFzcmFtX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZXJfY3B1KGwxc3JhbV9sb2NrLCBjcHUpLCBmbGFncyk7CisJcHV0X2NwdSgpOwogCiAJcmV0dXJuIGFkZHI7CiB9CkBAIC01NzQsMTUgKzYxOCwxOCBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdm9pZCAqYWRkcjsKKwl1bnNpZ25lZCBpbnQgY3B1OworCisJY3B1ID0gZ2V0X2NwdSgpOworCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGVyX2NwdShsMXNyYW1fbG9jaywgY3B1KSwgZmxhZ3MpOworCisJYWRkciA9IF9zcmFtX2FsbG9jX21heCgmcGVyX2NwdShmcmVlX2wxX3NzcmFtX2hlYWQsIGNwdSksCisJCQkmcGVyX2NwdSh1c2VkX2wxX3NzcmFtX2hlYWQsIGNwdSksIHBzaXplKTsKIAogCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbDFzcmFtX2xvY2ssIGZsYWdzKTsKLQotCWFkZHIgPSBfc3JhbV9hbGxvY19tYXgoJmZyZWVfbDFfc3NyYW1faGVhZCwKLQkJCSZ1c2VkX2wxX3NzcmFtX2hlYWQsIHBzaXplKTsKLQotCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsMXNyYW1fbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBlcl9jcHUobDFzcmFtX2xvY2ssIGNwdSksIGZsYWdzKTsKKwlwdXRfY3B1KCk7CiAKIAlyZXR1cm4gYWRkcjsKIH0KQEAgLTU5MiwxNSArNjM5LDE4IEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0OworCXVuc2lnbmVkIGludCBjcHU7CisKKwljcHUgPSBnZXRfY3B1KCk7CisJLyogYWRkIG11dGV4IG9wZXJhdGlvbiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwZXJfY3B1KGwxc3JhbV9sb2NrLCBjcHUpLCBmbGFncyk7CisKKwlyZXQgPSBfc3JhbV9mcmVlKGFkZHIsICZwZXJfY3B1KGZyZWVfbDFfc3NyYW1faGVhZCwgY3B1KSwKKwkJCSZwZXJfY3B1KHVzZWRfbDFfc3NyYW1faGVhZCwgY3B1KSk7CiAKIAkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmwxc3JhbV9sb2NrLCBmbGFncyk7Ci0KLQlyZXQgPSBfc3JhbV9mcmVlKGFkZHIsICZmcmVlX2wxX3NzcmFtX2hlYWQsCi0JCQkmdXNlZF9sMV9zc3JhbV9oZWFkKTsKLQotCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsMXNyYW1fbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBlcl9jcHUobDFzcmFtX2xvY2ssIGNwdSksIGZsYWdzKTsKKwlwdXRfY3B1KCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNzYxLDMzICs4MTEsMzYgQEAKIAkJaW50ICplb2YsIHZvaWQgKmRhdGEpCiB7CiAJaW50IGxlbiA9IDA7CisJdW5zaWduZWQgaW50IGNwdTsKIAotCWlmIChfc3JhbV9wcm9jX3JlYWQoYnVmLCAmbGVuLCBjb3VudCwgIlNjcmF0Y2hwYWQiLAotCQkJJmZyZWVfbDFfc3NyYW1faGVhZCwgJnVzZWRfbDFfc3NyYW1faGVhZCkpCi0JCWdvdG8gbm90X2RvbmU7CisJZm9yIChjcHUgPSAwOyBjcHUgPCBudW1fcG9zc2libGVfY3B1cygpOyArK2NwdSkgeworCQlpZiAoX3NyYW1fcHJvY19yZWFkKGJ1ZiwgJmxlbiwgY291bnQsICJTY3JhdGNocGFkIiwKKwkJCSZwZXJfY3B1KGZyZWVfbDFfc3NyYW1faGVhZCwgY3B1KSwgJnBlcl9jcHUodXNlZF9sMV9zc3JhbV9oZWFkLCBjcHUpKSkKKwkJCWdvdG8gbm90X2RvbmU7CiAjaWYgTDFfREFUQV9BX0xFTkdUSCAhPSAwCi0JaWYgKF9zcmFtX3Byb2NfcmVhZChidWYsICZsZW4sIGNvdW50LCAiTDEgRGF0YSBBIiwKLQkJCSZmcmVlX2wxX2RhdGFfQV9zcmFtX2hlYWQsCi0JCQkmdXNlZF9sMV9kYXRhX0Ffc3JhbV9oZWFkKSkKLQkJZ290byBub3RfZG9uZTsKKwkJaWYgKF9zcmFtX3Byb2NfcmVhZChidWYsICZsZW4sIGNvdW50LCAiTDEgRGF0YSBBIiwKKwkJCSZwZXJfY3B1KGZyZWVfbDFfZGF0YV9BX3NyYW1faGVhZCwgY3B1KSwKKwkJCSZwZXJfY3B1KHVzZWRfbDFfZGF0YV9BX3NyYW1faGVhZCwgY3B1KSkpCisJCQlnb3RvIG5vdF9kb25lOwogI2VuZGlmCiAjaWYgTDFfREFUQV9CX0xFTkdUSCAhPSAwCi0JaWYgKF9zcmFtX3Byb2NfcmVhZChidWYsICZsZW4sIGNvdW50LCAiTDEgRGF0YSBCIiwKLQkJCSZmcmVlX2wxX2RhdGFfQl9zcmFtX2hlYWQsCi0JCQkmdXNlZF9sMV9kYXRhX0Jfc3JhbV9oZWFkKSkKLQkJZ290byBub3RfZG9uZTsKKwkJaWYgKF9zcmFtX3Byb2NfcmVhZChidWYsICZsZW4sIGNvdW50LCAiTDEgRGF0YSBCIiwKKwkJCSZwZXJfY3B1KGZyZWVfbDFfZGF0YV9CX3NyYW1faGVhZCwgY3B1KSwKKwkJCSZwZXJfY3B1KHVzZWRfbDFfZGF0YV9CX3NyYW1faGVhZCwgY3B1KSkpCisJCQlnb3RvIG5vdF9kb25lOwogI2VuZGlmCiAjaWYgTDFfQ09ERV9MRU5HVEggIT0gMAotCWlmIChfc3JhbV9wcm9jX3JlYWQoYnVmLCAmbGVuLCBjb3VudCwgIkwxIEluc3RydWN0aW9uIiwKLQkJCSZmcmVlX2wxX2luc3Rfc3JhbV9oZWFkLCAmdXNlZF9sMV9pbnN0X3NyYW1faGVhZCkpCi0JCWdvdG8gbm90X2RvbmU7CisJCWlmIChfc3JhbV9wcm9jX3JlYWQoYnVmLCAmbGVuLCBjb3VudCwgIkwxIEluc3RydWN0aW9uIiwKKwkJCSZwZXJfY3B1KGZyZWVfbDFfaW5zdF9zcmFtX2hlYWQsIGNwdSksCisJCQkmcGVyX2NwdSh1c2VkX2wxX2luc3Rfc3JhbV9oZWFkLCBjcHUpKSkKKwkJCWdvdG8gbm90X2RvbmU7CiAjZW5kaWYKKwl9CiAjaWYgTDJfTEVOR1RIICE9IDAKLQlpZiAoX3NyYW1fcHJvY19yZWFkKGJ1ZiwgJmxlbiwgY291bnQsICJMMiIsCi0JCQkmZnJlZV9sMl9zcmFtX2hlYWQsICZ1c2VkX2wyX3NyYW1faGVhZCkpCisJaWYgKF9zcmFtX3Byb2NfcmVhZChidWYsICZsZW4sIGNvdW50LCAiTDIiLCAmZnJlZV9sMl9zcmFtX2hlYWQsCisJCSZ1c2VkX2wyX3NyYW1faGVhZCkpCiAJCWdvdG8gbm90X2RvbmU7CiAjZW5kaWYKLQogCSplb2YgPSAxOwogIG5vdF9kb25lOgogCXJldHVybiBsZW47CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL29wcm9maWxlL01ha2VmaWxlIGIvYXJjaC9ibGFja2Zpbi9vcHJvZmlsZS9NYWtlZmlsZQppbmRleCA2MzRlMzAwLi5jNzBhZjNhIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL29wcm9maWxlL01ha2VmaWxlCisrKyBiL2FyY2gvYmxhY2tmaW4vb3Byb2ZpbGUvTWFrZWZpbGUKQEAgLTEwLDUgKzEwLDQgQEAKIAkJb3Byb2ZpbGVmcy5vIG9wcm9maWxlX3N0YXRzLm8gXAogCQl0aW1lcl9pbnQubyApCiAKLW9wcm9maWxlLXkgOj0gJChEUklWRVJfT0JKUykgY29tbW9uLm8KLW9wcm9maWxlLSQoQ09ORklHX0hBUkRXQVJFX1BNKSArPSBvcF9tb2RlbF9iZjUzMy5vCitvcHJvZmlsZS15IDo9ICQoRFJJVkVSX09CSlMpIGJmaW5fb3Byb2ZpbGUubwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9vcHJvZmlsZS9iZmluX29wcm9maWxlLmMgYi9hcmNoL2JsYWNrZmluL29wcm9maWxlL2JmaW5fb3Byb2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2I5NzEzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9vcHJvZmlsZS9iZmluX29wcm9maWxlLmMKQEAgLTAsMCArMSwxOCBAQAorLyoKKyAqIGJmaW5fb3Byb2ZpbGUuYyAtIEJsYWNrZmluIG9wcm9maWxlIGNvZGUKKyAqCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvb3Byb2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKK2ludCBfX2luaXQgb3Byb2ZpbGVfYXJjaF9pbml0KHN0cnVjdCBvcHJvZmlsZV9vcGVyYXRpb25zICpvcHMpCit7CisJcmV0dXJuIC0xOworfQorCit2b2lkIG9wcm9maWxlX2FyY2hfZXhpdCh2b2lkKQoreworfQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9vcHJvZmlsZS9jb21tb24uYyBiL2FyY2gvYmxhY2tmaW4vb3Byb2ZpbGUvY29tbW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNmQzMDMuLjAwMDAwMDAKLS0tIGEvYXJjaC9ibGFja2Zpbi9vcHJvZmlsZS9jb21tb24uYworKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL29wcm9maWxlL2NvbW1vbi5jCi0gKiBCYXNlZCBvbjogICAgIGFyY2gvYWxwaGEvb3Byb2ZpbGUvY29tbW9uLmMKLSAqIEF1dGhvcjogICAgICAgQW50b24gQmxhbmNoYXJkIDxhbnRvbkBhdS5pYm0uY29tPgotICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAyMDA0IEFudG9uIEJsYW5jaGFyZCA8YW50b25AYXUuaWJtLmNvbT4sIElCTQotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA2IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvb3Byb2ZpbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc21wLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+Ci0KLSNpbmNsdWRlICJvcF9ibGFja2Zpbi5oIgotCi0jZGVmaW5lIEJGSU5fNTMzX0lEICAweEU1MDQwMDAzCi0jZGVmaW5lIEJGSU5fNTM3X0lEICAweEU1MDQwMDAyCi0KLXN0YXRpYyBpbnQgcGZtb25fZW5hYmxlZDsKLXN0YXRpYyBzdHJ1Y3QgbXV0ZXggcGZtb25fbG9jazsKLQotc3RydWN0IG9wX2JmaW41MzNfbW9kZWwgKm1vZGVsOwotCi1zdHJ1Y3Qgb3BfY291bnRlcl9jb25maWcgY3RyW09QX01BWF9DT1VOVEVSXTsKLQotc3RhdGljIGludCBvcF9iZmluX3NldHVwKHZvaWQpCi17Ci0JaW50IHJldDsKLQotCS8qIFByZS1jb21wdXRlIHRoZSB2YWx1ZXMgdG8gc3R1ZmYgaW4gdGhlIGhhcmR3YXJlIHJlZ2lzdGVycy4gICovCi0Jc3Bpbl9sb2NrKCZvcHJvZmlsZWZzX2xvY2spOwotCXJldCA9IG1vZGVsLT5yZWdfc2V0dXAoY3RyKTsKLQlzcGluX3VubG9jaygmb3Byb2ZpbGVmc19sb2NrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIG9wX2JmaW5fc2h1dGRvd24odm9pZCkKLXsKLSNpZiAwCi0JLyogd2hhdCBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHNodXRkb3duIGFuZCBzdG9wPyAqLwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbnQgb3BfYmZpbl9zdGFydCh2b2lkKQotewotCWludCByZXQgPSAtRUJVU1k7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJLU0RCRzppbiAlc1xuIiwgX19mdW5jX18pOwotCW11dGV4X2xvY2soJnBmbW9uX2xvY2spOwotCWlmICghcGZtb25fZW5hYmxlZCkgewotCQlyZXQgPSBtb2RlbC0+c3RhcnQoY3RyKTsKLQkJcGZtb25fZW5hYmxlZCA9ICFyZXQ7Ci0JfQotCW11dGV4X3VubG9jaygmcGZtb25fbG9jayk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBvcF9iZmluX3N0b3Aodm9pZCkKLXsKLQltdXRleF9sb2NrKCZwZm1vbl9sb2NrKTsKLQlpZiAocGZtb25fZW5hYmxlZCkgewotCQltb2RlbC0+c3RvcCgpOwotCQlwZm1vbl9lbmFibGVkID0gMDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZwZm1vbl9sb2NrKTsKLX0KLQotc3RhdGljIGludCBvcF9iZmluX2NyZWF0ZV9maWxlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZGVudHJ5ICpyb290KQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IG1vZGVsLT5udW1fY291bnRlcnM7ICsraSkgewotCQlzdHJ1Y3QgZGVudHJ5ICpkaXI7Ci0JCWNoYXIgYnVmWzNdOwotCQlwcmludGsoS0VSTl9JTkZPICJPcHJvZmlsZTogY3JlYXRpbmcgZmlsZXMuLi4gXG4iKTsKLQotCQlzbnByaW50ZihidWYsIHNpemVvZiBidWYsICIlZCIsIGkpOwotCQlkaXIgPSBvcHJvZmlsZWZzX21rZGlyKHNiLCByb290LCBidWYpOwotCi0JCW9wcm9maWxlZnNfY3JlYXRlX3Vsb25nKHNiLCBkaXIsICJlbmFibGVkIiwgJmN0cltpXS5lbmFibGVkKTsKLQkJb3Byb2ZpbGVmc19jcmVhdGVfdWxvbmcoc2IsIGRpciwgImV2ZW50IiwgJmN0cltpXS5ldmVudCk7Ci0JCW9wcm9maWxlZnNfY3JlYXRlX3Vsb25nKHNiLCBkaXIsICJjb3VudCIsICZjdHJbaV0uY291bnQpOwotCQkvKgotCQkgKiBXZSBkb250IHN1cHBvcnQgcGVyIGNvdW50ZXIgdXNlci9rZXJuZWwgc2VsZWN0aW9uLCBidXQKLQkJICogd2UgbGVhdmUgdGhlIGVudHJpZXMgYmVjYXVzZSB1c2Vyc3BhY2UgZXhwZWN0cyB0aGVtCi0JCSAqLwotCQlvcHJvZmlsZWZzX2NyZWF0ZV91bG9uZyhzYiwgZGlyLCAia2VybmVsIiwgJmN0cltpXS5rZXJuZWwpOwotCQlvcHJvZmlsZWZzX2NyZWF0ZV91bG9uZyhzYiwgZGlyLCAidXNlciIsICZjdHJbaV0udXNlcik7Ci0JCW9wcm9maWxlZnNfY3JlYXRlX3Vsb25nKHNiLCBkaXIsICJ1bml0X21hc2siLAotCQkJCQkmY3RyW2ldLnVuaXRfbWFzayk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci1pbnQgX19pbml0IG9wcm9maWxlX2FyY2hfaW5pdChzdHJ1Y3Qgb3Byb2ZpbGVfb3BlcmF0aW9ucyAqb3BzKQotewotI2lmZGVmIENPTkZJR19IQVJEV0FSRV9QTQotCXVuc2lnbmVkIGludCBkc3BpZDsKLQotCW11dGV4X2luaXQoJnBmbW9uX2xvY2spOwotCi0JZHNwaWQgPSBiZmluX3JlYWRfRFNQSUQoKTsKLQotCXByaW50ayhLRVJOX0lORk8gIk9wcm9maWxlIGdvdCB0aGUgY3B1IGlkIGlzIDB4JXguIFxuIiwgZHNwaWQpOwotCi0Jc3dpdGNoIChkc3BpZCkgewotCWNhc2UgQkZJTl81MzNfSUQ6Ci0JCW1vZGVsID0gJm9wX21vZGVsX2JmaW41MzM7Ci0JCW1vZGVsLT5udW1fY291bnRlcnMgPSAyOwotCQlicmVhazsKLQljYXNlIEJGSU5fNTM3X0lEOgotCQltb2RlbCA9ICZvcF9tb2RlbF9iZmluNTMzOwotCQltb2RlbC0+bnVtX2NvdW50ZXJzID0gMjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0Jb3BzLT5jcHVfdHlwZSA9IG1vZGVsLT5uYW1lOwotCW9wcy0+Y3JlYXRlX2ZpbGVzID0gb3BfYmZpbl9jcmVhdGVfZmlsZXM7Ci0Jb3BzLT5zZXR1cCA9IG9wX2JmaW5fc2V0dXA7Ci0Jb3BzLT5zaHV0ZG93biA9IG9wX2JmaW5fc2h1dGRvd247Ci0Jb3BzLT5zdGFydCA9IG9wX2JmaW5fc3RhcnQ7Ci0Jb3BzLT5zdG9wID0gb3BfYmZpbl9zdG9wOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAib3Byb2ZpbGU6IHVzaW5nICVzIHBlcmZvcm1hbmNlIG1vbml0b3JpbmcuXG4iLAotCSAgICAgICBvcHMtPmNwdV90eXBlKTsKLQotCXJldHVybiAwOwotI2Vsc2UKLQlyZXR1cm4gLTE7Ci0jZW5kaWYKLX0KLQotdm9pZCBvcHJvZmlsZV9hcmNoX2V4aXQodm9pZCkKLXsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vb3Byb2ZpbGUvb3BfYmxhY2tmaW4uaCBiL2FyY2gvYmxhY2tmaW4vb3Byb2ZpbGUvb3BfYmxhY2tmaW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVkZDA4Yy4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL29wcm9maWxlL29wX2JsYWNrZmluLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL29wcm9maWxlL29wX2JsYWNrZmluLmgKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOiAgICAgICBBbnRvbiBCbGFuY2hhcmQgPGFudG9uQGF1LmlibS5jb20+Ci0gKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOgotICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMDQgQW50b24gQmxhbmNoYXJkIDxhbnRvbkBhdS5pYm0uY29tPiwgSUJNCi0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotICovCi0KLSNpZm5kZWYgT1BfQkxBQ0tGSU5fSAotI2RlZmluZSBPUF9CTEFDS0ZJTl9IIDEKLQotI2RlZmluZSBPUF9NQVhfQ09VTlRFUiAyCi0KLSNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KLQotLyogUGVyLWNvdW50ZXIgY29uZmlndXJhdGlvbiBhcyBzZXQgdmlhIG9wcm9maWxlZnMuICAqLwotc3RydWN0IG9wX2NvdW50ZXJfY29uZmlnIHsKLQl1bnNpZ25lZCBsb25nIHZhbGlkOwotCXVuc2lnbmVkIGxvbmcgZW5hYmxlZDsKLQl1bnNpZ25lZCBsb25nIGV2ZW50OwotCXVuc2lnbmVkIGxvbmcgY291bnQ7Ci0JdW5zaWduZWQgbG9uZyBrZXJuZWw7Ci0JdW5zaWduZWQgbG9uZyB1c2VyOwotCXVuc2lnbmVkIGxvbmcgdW5pdF9tYXNrOwotfTsKLQotLyogU3lzdGVtLXdpZGUgY29uZmlndXJhdGlvbiBhcyBzZXQgdmlhIG9wcm9maWxlZnMuICAqLwotc3RydWN0IG9wX3N5c3RlbV9jb25maWcgewotCXVuc2lnbmVkIGxvbmcgZW5hYmxlX2tlcm5lbDsKLQl1bnNpZ25lZCBsb25nIGVuYWJsZV91c2VyOwotfTsKLQotLyogUGVyLWFyY2ggY29uZmlndXJhdGlvbiAqLwotc3RydWN0IG9wX2JmaW41MzNfbW9kZWwgewotCWludCAoKnJlZ19zZXR1cCkgKHN0cnVjdCBvcF9jb3VudGVyX2NvbmZpZyAqKTsKLQlpbnQgKCpzdGFydCkgKHN0cnVjdCBvcF9jb3VudGVyX2NvbmZpZyAqKTsKLQl2b2lkICgqc3RvcCkgKHZvaWQpOwotCWludCBudW1fY291bnRlcnM7Ci0JY2hhciAqbmFtZTsKLX07Ci0KLWV4dGVybiBzdHJ1Y3Qgb3BfYmZpbjUzM19tb2RlbCBvcF9tb2RlbF9iZmluNTMzOwotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjdHJfcmVhZCh2b2lkKQotewotCXVuc2lnbmVkIGludCB0bXA7Ci0KLQl0bXAgPSBiZmluX3JlYWRfUEZDVEwoKTsKLQlDU1lOQygpOwotCi0JcmV0dXJuIHRtcDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGN0cl93cml0ZSh1bnNpZ25lZCBpbnQgdmFsKQotewotCWJmaW5fd3JpdGVfUEZDVEwodmFsKTsKLQlDU1lOQygpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgY291bnRfcmVhZCh1bnNpZ25lZCBpbnQgKmNvdW50KQotewotCWNvdW50WzBdID0gYmZpbl9yZWFkX1BGQ05UUjAoKTsKLQljb3VudFsxXSA9IGJmaW5fcmVhZF9QRkNOVFIxKCk7Ci0JQ1NZTkMoKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGNvdW50X3dyaXRlKHVuc2lnbmVkIGludCAqY291bnQpCi17Ci0JYmZpbl93cml0ZV9QRkNOVFIwKGNvdW50WzBdKTsKLQliZmluX3dyaXRlX1BGQ05UUjEoY291bnRbMV0pOwotCUNTWU5DKCk7Ci19Ci0KLWV4dGVybiBpbnQgcG1fb3ZlcmZsb3dfaGFuZGxlcihpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9vcHJvZmlsZS9vcF9tb2RlbF9iZjUzMy5jIGIvYXJjaC9ibGFja2Zpbi9vcHJvZmlsZS9vcF9tb2RlbF9iZjUzMy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWM2OThiLi4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vb3Byb2ZpbGUvb3BfbW9kZWxfYmY1MzMuYworKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL29wcm9maWxlL29wX21vZGVsX2JmNTMzLmMKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOiAgICAgICBBbnRvbiBCbGFuY2hhcmQgPGFudG9uQGF1LmlibS5jb20+Ci0gKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOgotICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMDQgQW50b24gQmxhbmNoYXJkIDxhbnRvbkBhdS5pYm0uY29tPiwgSUJNCi0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9vcHJvZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXAuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+Ci0KLSNpbmNsdWRlICJvcF9ibGFja2Zpbi5oIgotCi0jZGVmaW5lIFBNX0VOQUJMRSAweDAxOwotI2RlZmluZSBQTV9DVEwxX0VOQUJMRSAgMHgxOAotI2RlZmluZSBQTV9DVEwwX0VOQUJMRSAgMHhDMDAwCi0jZGVmaW5lIENPVU5UX0VER0VfT05MWSAweDMwMDAwMDAKLQotc3RhdGljIGludCBvcHJvZmlsZV9ydW5uaW5nOwotCi1zdGF0aWMgdW5zaWduZWQgY3Vycl9wZmN0bCwgY3Vycl9jb3VudFsyXTsKLQotc3RhdGljIGludCBiZmluNTMzX3JlZ19zZXR1cChzdHJ1Y3Qgb3BfY291bnRlcl9jb25maWcgKmN0cikKLXsKLQl1bnNpZ25lZCBpbnQgcGZjdGwgPSBjdHJfcmVhZCgpOwotCXVuc2lnbmVkIGludCBjb3VudFsyXTsKLQotCS8qIHNldCBCbGFja2ZpbiBwZXJmIG1vbml0b3IgcmVncyB3aXRoIGN0ciAqLwotCWlmIChjdHJbMF0uZW5hYmxlZCkgewotCQlwZmN0bCB8PSAoUE1fQ1RMMF9FTkFCTEUgfCAoKGNoYXIpY3RyWzBdLmV2ZW50IDw8IDUpKTsKLQkJY291bnRbMF0gPSAweEZGRkZGRkZGIC0gY3RyWzBdLmNvdW50OwotCQljdXJyX2NvdW50WzBdID0gY291bnRbMF07Ci0JfQotCWlmIChjdHJbMV0uZW5hYmxlZCkgewotCQlwZmN0bCB8PSAoUE1fQ1RMMV9FTkFCTEUgfCAoKGNoYXIpY3RyWzFdLmV2ZW50IDw8IDE2KSk7Ci0JCWNvdW50WzFdID0gMHhGRkZGRkZGRiAtIGN0clsxXS5jb3VudDsKLQkJY3Vycl9jb3VudFsxXSA9IGNvdW50WzFdOwotCX0KLQotCXByX2RlYnVnKCJjdHJbMF0uZW5hYmxlZD0lZCxjdHJbMV0uZW5hYmxlZD0lZCxjdHJbMF0uZXZlbnQ8PDU9MHgleCxjdHJbMV0uZXZlbnQ8PDE2PTB4JXhcbiIsIGN0clswXS5lbmFibGVkLCBjdHJbMV0uZW5hYmxlZCwgY3RyWzBdLmV2ZW50IDw8IDUsIGN0clsxXS5ldmVudCA8PCAxNik7Ci0JcGZjdGwgfD0gQ09VTlRfRURHRV9PTkxZOwotCWN1cnJfcGZjdGwgPSBwZmN0bDsKLQotCXByX2RlYnVnKCJ3cml0ZSAweCV4IHRvIHBmY3RsXG4iLCBwZmN0bCk7Ci0JY3RyX3dyaXRlKHBmY3RsKTsKLQljb3VudF93cml0ZShjb3VudCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBiZmluNTMzX3N0YXJ0KHN0cnVjdCBvcF9jb3VudGVyX2NvbmZpZyAqY3RyKQotewotCXVuc2lnbmVkIGludCBwZmN0bCA9IGN0cl9yZWFkKCk7Ci0KLQlwZmN0bCB8PSBQTV9FTkFCTEU7Ci0JY3Vycl9wZmN0bCA9IHBmY3RsOwotCi0JY3RyX3dyaXRlKHBmY3RsKTsKLQotCW9wcm9maWxlX3J1bm5pbmcgPSAxOwotCXByX2RlYnVnKCJzdGFydCBvcHJvZmlsZSBjb3VudGVyIFxuIik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYmZpbjUzM19zdG9wKHZvaWQpCi17Ci0JaW50IHBmY3RsOwotCi0JcGZjdGwgPSBjdHJfcmVhZCgpOwotCXBmY3RsICY9IH5QTV9FTkFCTEU7Ci0JLyogZnJlZXplIGNvdW50ZXJzICovCi0JY3RyX3dyaXRlKHBmY3RsKTsKLQotCW9wcm9maWxlX3J1bm5pbmcgPSAwOwotCXByX2RlYnVnKCJzdG9wIG9wcm9maWxlIGNvdW50ZXIgXG4iKTsKLX0KLQotc3RhdGljIGludCBnZXRfa2VybmVsKHZvaWQpCi17Ci0JaW50IGlwZW5kLCBpc19rZXJuZWw7Ci0KLQlpcGVuZCA9IGJmaW5fcmVhZF9JUEVORCgpOwotCi0JLyogdGVzdCBiaXQgMTUgKi8KLQlpc19rZXJuZWwgPSAoKGlwZW5kICYgMHg4MDAwKSAhPSAwKTsKLQotCXJldHVybiBpc19rZXJuZWw7Ci19Ci0KLWludCBwbV9vdmVyZmxvd19oYW5kbGVyKGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCWludCBpc19rZXJuZWw7Ci0JaW50IGksIGNwdTsKLQl1bnNpZ25lZCBpbnQgcGMsIHBmY3RsOwotCXVuc2lnbmVkIGludCBjb3VudFsyXTsKLQotCXByX2RlYnVnKCJnZXQgaW50ZXJydXB0IGluICVzXG4iLCBfX2Z1bmNfXyk7Ci0JaWYgKG9wcm9maWxlX3J1bm5pbmcgPT0gMCkgewotCQlwcl9kZWJ1ZygiZXJyb3I6IGVudGVyaW5nIGludGVycnVwdCB3aGVuIG9wcm9maWxlIGlzIHN0b3BwZWQuXG5cciIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaXNfa2VybmVsID0gZ2V0X2tlcm5lbCgpOwotCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQlwYyA9IHJlZ3MtPnBjOwotCXBmY3RsID0gY3RyX3JlYWQoKTsKLQotCS8qIHJlYWQgdGhlIHR3byBldmVudCBjb3VudGVyIHJlZ3MgKi8KLQljb3VudF9yZWFkKGNvdW50KTsKLQotCS8qIGlmIHRoZSBjb3VudGVyIG92ZXJmbG93cywgYWRkIHNhbXBsZSB0byBvcHJvZmlsZSBidWZmZXIgKi8KLQlmb3IgKGkgPSAwOyBpIDwgMjsgKytpKSB7Ci0JCWlmIChvcHJvZmlsZV9ydW5uaW5nKSB7Ci0JCQlvcHJvZmlsZV9hZGRfc2FtcGxlKHJlZ3MsIGkpOwotCQl9Ci0JfQotCi0JLyogcmVzZXQgdGhlIHBlcmZtb24gY291bnRlciAqLwotCWN0cl93cml0ZShjdXJyX3BmY3RsKTsKLQljb3VudF93cml0ZShjdXJyX2NvdW50KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IG9wX2JmaW41MzNfbW9kZWwgb3BfbW9kZWxfYmZpbjUzMyA9IHsKLQkucmVnX3NldHVwID0gYmZpbjUzM19yZWdfc2V0dXAsCi0JLnN0YXJ0ID0gYmZpbjUzM19zdGFydCwKLQkuc3RvcCA9IGJmaW41MzNfc3RvcCwKLQkubnVtX2NvdW50ZXJzID0gMiwKLQkubmFtZSA9ICJibGFja2Zpbi9iZjUzMyIKLX07CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL29wcm9maWxlL3RpbWVyX2ludC5jIGIvYXJjaC9ibGFja2Zpbi9vcHJvZmlsZS90aW1lcl9pbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM2Zjg2MC4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL29wcm9maWxlL3RpbWVyX2ludC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9vcHJvZmlsZS90aW1lcl9pbnQuYwotICogQmFzZWQgb246Ci0gKiBBdXRob3I6ICAgICAgIE1pY2hhZWwgS2FuZwotICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXAuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9vcHJvZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgotCi1zdGF0aWMgdm9pZCBlbmFibGVfc3lzX3RpbWVyMCgpCi17Ci19Ci1zdGF0aWMgdm9pZCBkaXNhYmxlX3N5c190aW1lcjAoKQotewotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3Qgc3lzX3RpbWVyMF9pbnRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsCi0JCQkJCSAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0Jb3Byb2ZpbGVfYWRkX3NhbXBsZShyZWdzLCAwKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBpbnQgc3lzX3RpbWVyMF9zdGFydCh2b2lkKQotewotCWVuYWJsZV9zeXNfdGltZXIwKCk7Ci0JcmV0dXJuIHJlcXVlc3RfaXJxKElWRzExLCBzeXNfdGltZXIwX2ludF9oYW5kbGVyLCAwLCAic3lzX3RpbWVyMCIsIE5VTEwpOwotfQotCi1zdGF0aWMgdm9pZCBzeXNfdGltZXIwX3N0b3Aodm9pZCkKLXsKLQlkaXNhYmxlX3N5c190aW1lcigpOwotfQotCi1pbnQgX19pbml0IHN5c190aW1lcjBfaW5pdChzdHJ1Y3Qgb3Byb2ZpbGVfb3BlcmF0aW9ucyAqb3BzKQotewotCWV4dGVybiBpbnQgbm1pX2FjdGl2ZTsKLQotCWlmIChubWlfYWN0aXZlIDw9IDApCi0JCXJldHVybiAtRU5PREVWOwotCi0Jb3BzLT5zdGFydCA9IHRpbWVyX3N0YXJ0OwotCW9wcy0+c3RvcCA9IHRpbWVyX3N0b3A7Ci0Jb3BzLT5jcHVfdHlwZSA9ICJ0aW1lciI7Ci0JcHJpbnRrKEtFUk5fSU5GTyAib3Byb2ZpbGU6IHVzaW5nIE5NSSB0aW1lciBpbnRlcnJ1cHQuXG4iKTsKLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9LY29uZmlnIGIvYXJjaC9jcmlzL0tjb25maWcKaW5kZXggYjE3YWVlYS4uMzQ2MjI0NSAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL0tjb25maWcKKysrIGIvYXJjaC9jcmlzL0tjb25maWcKQEAgLTY4MSw2ICs2ODEsOCBAQAogCiBzb3VyY2UgImRyaXZlcnMvdXdiL0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL0tjb25maWciCisKIHNvdXJjZSAiYXJjaC9jcmlzL0tjb25maWcuZGVidWciCiAKIHNvdXJjZSAic2VjdXJpdHkvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2lvcF9md19sb2FkLmMgYi9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9pb3BfZndfbG9hZC5jCmluZGV4IDNiMzg1N2UuLjJmOGVhMGYgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2lvcF9md19sb2FkLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvaW9wX2Z3X2xvYWQuYwpAQCAtMjQsMTIgKzI0LDEyIEBACiAjZXJyb3IgIlBsZWFzZSBjb250YWN0IDxncmVnQGtyb2FoLmNvbT4gZm9yIGRldGFpbHMgb24gaG93IHRvIGZpeCBpdCBwcm9wZXJseS4iCiAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlIGlvcF9zcHVfZGV2aWNlWzJdID0gewotCXsgLmJ1c19pZCA9ICAgICAiaW9wLXNwdTAiLCB9LAotCXsgLmJ1c19pZCA9ICAgICAiaW9wLXNwdTEiLCB9LAorCXsgLmluaXRfbmFtZSA9ICAgICAiaW9wLXNwdTAiLCB9LAorCXsgLmluaXRfbmFtZSA9ICAgICAiaW9wLXNwdTEiLCB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBkZXZpY2UgaW9wX21wdV9kZXZpY2UgPSB7Ci0JLmJ1c19pZCA9ICAgICAgICJpb3AtbXB1IiwKKwkuaW5pdF9uYW1lID0gICAgICAgImlvcC1tcHUiLAogfTsKIAogc3RhdGljIGludCB3YWl0X21wdV9pZGxlKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9zaWduYWwuYwppbmRleCBkYTdkMmJlLi4zNzJkMGNhIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvc2lnbmFsLmMKQEAgLTQ1Niw3ICs0NTYsNyBAQAogCXJldHVybiAtRUZBVUxUOwogfQogCi0vKiBJbnZva2UgYSBzaW5nYWwgaGFuZGxlciB0bywgd2VsbCwgaGFuZGxlIHRoZSBzaWduYWwuICovCisvKiBJbnZva2UgYSBzaWduYWwgaGFuZGxlciB0bywgd2VsbCwgaGFuZGxlIHRoZSBzaWduYWwuICovCiBzdGF0aWMgaW5saW5lIGludAogaGFuZGxlX3NpZ25hbChpbnQgY2FucmVzdGFydCwgdW5zaWduZWQgbG9uZyBzaWcsCiAJICAgICAgc2lnaW5mb190ICppbmZvLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLApkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2luY2x1ZGUvYXNtL2F0b21pYy5oIGIvYXJjaC9jcmlzL2luY2x1ZGUvYXNtL2F0b21pYy5oCmluZGV4IGY3MWVhNjguLjU3MThkZDggMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9pbmNsdWRlL2FzbS9hdG9taWMuaAorKysgYi9hcmNoL2NyaXMvaW5jbHVkZS9hc20vYXRvbWljLmgKQEAgLTQsNyArNCw3IEBACiAjZGVmaW5lIF9fQVNNX0NSSVNfQVRPTUlDX18KIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhcmNoL2F0b21pYy5oPgogCkBAIC0xMyw4ICsxMyw2IEBACiAgKiByZXNvdXJjZSBjb3VudGluZyBldGMuLgogICovCiAKLXR5cGVkZWYgc3RydWN0IHsgdm9sYXRpbGUgaW50IGNvdW50ZXI7IH0gYXRvbWljX3Q7Ci0KICNkZWZpbmUgQVRPTUlDX0lOSVQoaSkgIHsgKGkpIH0KIAogI2RlZmluZSBhdG9taWNfcmVhZCh2KSAoKHYpLT5jb3VudGVyKQpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9LY29uZmlnIGIvYXJjaC9oODMwMC9LY29uZmlnCmluZGV4IDI4ZjA2ZmQuLjk0MjA2NDggMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAvS2NvbmZpZworKysgYi9hcmNoL2g4MzAwL0tjb25maWcKQEAgLTIyMCw2ICsyMjAsOCBAQAogCiBlbmRtZW51CiAKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL0tjb25maWciCisKIHNvdXJjZSAiZnMvS2NvbmZpZyIKIAogc291cmNlICJhcmNoL2g4MzAwL0tjb25maWcuZGVidWciCmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvaDgzMDAvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IGM2OGUxNjguLjI3YjEwOGEgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvaDgzMDAvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0xICsxLDIgQEAKIGluY2x1ZGUgaW5jbHVkZS9hc20tZ2VuZXJpYy9LYnVpbGQuYXNtCit1bmlmZGVmLXkgKz0gc3dhYi5oCmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL2luY2x1ZGUvYXNtL2F0b21pYy5oIGIvYXJjaC9oODMwMC9pbmNsdWRlL2FzbS9hdG9taWMuaAppbmRleCBiNGNmMGVhLi44MzMxODZjIDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL2luY2x1ZGUvYXNtL2F0b21pYy5oCisrKyBiL2FyY2gvaDgzMDAvaW5jbHVkZS9hc20vYXRvbWljLmgKQEAgLTEsMTIgKzEsMTMgQEAKICNpZm5kZWYgX19BUkNIX0g4MzAwX0FUT01JQ19fCiAjZGVmaW5lIF9fQVJDSF9IODMwMF9BVE9NSUNfXwogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKwogLyoKICAqIEF0b21pYyBvcGVyYXRpb25zIHRoYXQgQyBjYW4ndCBndWFyYW50ZWUgdXMuICBVc2VmdWwgZm9yCiAgKiByZXNvdXJjZSBjb3VudGluZyBldGMuLgogICovCiAKLXR5cGVkZWYgc3RydWN0IHsgaW50IGNvdW50ZXI7IH0gYXRvbWljX3Q7CiAjZGVmaW5lIEFUT01JQ19JTklUKGkpCXsgKGkpIH0KIAogI2RlZmluZSBhdG9taWNfcmVhZCh2KQkJKCh2KS0+Y291bnRlcikKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmggYi9hcmNoL2g4MzAwL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCmluZGV4IDM2ZTU5N2QuLmMzNmI4MGEgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKKysrIGIvYXJjaC9oODMwMC9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaApAQCAtMSwxMyArMSw3IEBACiAjaWZuZGVmIF9IODMwMF9CWVRFT1JERVJfSAogI2RlZmluZSBfSDgzMDBfQllURU9SREVSX0gKIAotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgotCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSB8fCBkZWZpbmVkKF9fS0VSTkVMX18pCi0jICBkZWZpbmUgX19CWVRFT1JERVJfSEFTX1U2NF9fCi0jICBkZWZpbmUgX19TV0FCXzY0X1RIUlVfMzJfXwotI2VuZGlmCi0KKyNpbmNsdWRlIDxhc20vc3dhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9iaWdfZW5kaWFuLmg+CiAKICNlbmRpZiAvKiBfSDgzMDBfQllURU9SREVSX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvaW5jbHVkZS9hc20vc3dhYi5oIGIvYXJjaC9oODMwMC9pbmNsdWRlL2FzbS9zd2FiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEwOGYzOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaDgzMDAvaW5jbHVkZS9hc20vc3dhYi5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgX0g4MzAwX1NXQUJfSAorI2RlZmluZSBfSDgzMDBfU1dBQl9ICisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKworI2lmIGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgfHwgZGVmaW5lZChfX0tFUk5FTF9fKQorIyAgZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KKyNlbmRpZgorCisjZW5kaWYgLyogX0g4MzAwX1NXQUJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggY2NiZThhZS4uM2IyNWJkOSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0xNCwzICsxNCw0IEBACiB1bmlmZGVmLXkgKz0gaW50cmluc2ljcy5oCiB1bmlmZGVmLXkgKz0gcGVyZm1vbi5oCiB1bmlmZGVmLXkgKz0gdXN0YWNrLmgKK3VuaWZkZWYteSArPSBzd2FiLmgKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9hdG9taWMuaCBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9hdG9taWMuaAppbmRleCA1MGMyYjgzLi5kMzcyOTJiIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vYXRvbWljLmgKKysrIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL2F0b21pYy5oCkBAIC0xNywxMiArMTcsNiBAQAogI2luY2x1ZGUgPGFzbS9pbnRyaW5zaWNzLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCi0vKgotICogT24gSUEtNjQsIGNvdW50ZXIgbXVzdCBhbHdheXMgYmUgdm9sYXRpbGUgdG8gZW5zdXJlIHRoYXQgdGhhdCB0aGUKLSAqIG1lbW9yeSBhY2Nlc3NlcyBhcmUgb3JkZXJlZC4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBfX3MzMiBjb3VudGVyOyB9IGF0b21pY190OwotdHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBfX3M2NCBjb3VudGVyOyB9IGF0b21pYzY0X3Q7CiAKICNkZWZpbmUgQVRPTUlDX0lOSVQoaSkJCSgoYXRvbWljX3QpIHsgKGkpIH0pCiAjZGVmaW5lIEFUT01JQzY0X0lOSVQoaSkJKChhdG9taWM2NF90KSB7IChpKSB9KQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCmluZGV4IDY5YmQ0MWQuLjBmODRjNWMgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaAorKysgYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKQEAgLTEsNDIgKzEsNyBAQAogI2lmbmRlZiBfQVNNX0lBNjRfQllURU9SREVSX0gKICNkZWZpbmUgX0FTTV9JQTY0X0JZVEVPUkRFUl9ICiAKLS8qCi0gKiBNb2RpZmllZCAxOTk4LCAxOTk5Ci0gKglEYXZpZCBNb3NiZXJnZXItVGFuZyA8ZGF2aWRtQGhwbC5ocC5jb20+LCBIZXdsZXR0LVBhY2thcmQgQ28uCi0gKi8KLQotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9pbnRyaW5zaWNzLmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KLQotc3RhdGljIF9faW5saW5lX18gX19hdHRyaWJ1dGVfY29uc3RfXyBfX3U2NAotX19pYTY0X3N3YWI2NCAoX191NjQgeCkKLXsKLQlfX3U2NCByZXN1bHQ7Ci0KLQlyZXN1bHQgPSBpYTY0X211eDEoeCwgaWE2NF9tdXgxX3Jldik7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIF9faW5saW5lX18gX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UzMgotX19pYTY0X3N3YWIzMiAoX191MzIgeCkKLXsKLQlyZXR1cm4gX19pYTY0X3N3YWI2NCh4KSA+PiAzMjsKLX0KLQotc3RhdGljIF9faW5saW5lX18gX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UxNgotX19pYTY0X3N3YWIxNihfX3UxNiB4KQotewotCXJldHVybiBfX2lhNjRfc3dhYjY0KHgpID4+IDQ4OwotfQotCi0jZGVmaW5lIF9fYXJjaF9fc3dhYjY0KHgpIF9faWE2NF9zd2FiNjQoeCkKLSNkZWZpbmUgX19hcmNoX19zd2FiMzIoeCkgX19pYTY0X3N3YWIzMih4KQotI2RlZmluZSBfX2FyY2hfX3N3YWIxNih4KSBfX2lhNjRfc3dhYjE2KHgpCi0KLSNkZWZpbmUgX19CWVRFT1JERVJfSEFTX1U2NF9fCi0KKyNpbmNsdWRlIDxhc20vc3dhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9saXR0bGVfZW5kaWFuLmg+CiAKICNlbmRpZiAvKiBfQVNNX0lBNjRfQllURU9SREVSX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9zd2FiLmggYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vc3dhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYTU4YjYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vc3dhYi5oCkBAIC0wLDAgKzEsMzQgQEAKKyNpZm5kZWYgX0FTTV9JQTY0X1NXQUJfSAorI2RlZmluZSBfQVNNX0lBNjRfU1dBQl9ICisKKy8qCisgKiBNb2RpZmllZCAxOTk4LCAxOTk5CisgKglEYXZpZCBNb3NiZXJnZXItVGFuZyA8ZGF2aWRtQGhwbC5ocC5jb20+LCBIZXdsZXR0LVBhY2thcmQgQ28uCisgKi8KKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9pbnRyaW5zaWNzLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKworc3RhdGljIF9faW5saW5lX18gX19hdHRyaWJ1dGVfY29uc3RfXyBfX3U2NCBfX2FyY2hfc3dhYjY0KF9fdTY0IHgpCit7CisJX191NjQgcmVzdWx0OworCisJcmVzdWx0ID0gaWE2NF9tdXgxKHgsIGlhNjRfbXV4MV9yZXYpOworCXJldHVybiByZXN1bHQ7Cit9CisjZGVmaW5lIF9fYXJjaF9zd2FiNjQgX19hcmNoX3N3YWI2NAorCitzdGF0aWMgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyIF9fYXJjaF9zd2FiMzIoX191MzIgeCkKK3sKKwlyZXR1cm4gX19hcmNoX3N3YWI2NCh4KSA+PiAzMjsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWIzMiBfX2FyY2hfc3dhYjMyCisKK3N0YXRpYyBfX2lubGluZV9fIF9fYXR0cmlidXRlX2NvbnN0X18gX191MTYgX19hcmNoX3N3YWIxNihfX3UxNiB4KQoreworCXJldHVybiBfX2FyY2hfc3dhYjY0KHgpID4+IDQ4OworfQorI2RlZmluZSBfX2FyY2hfc3dhYjE2IF9fYXJjaF9zd2FiMTYKKworI2VuZGlmIC8qIF9BU01fSUE2NF9TV0FCX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9zd2lvdGxiLmggYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vc3dpb3RsYi5oCmluZGV4IGZiNzk0MjMuLmRjYmFlYTcgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9zd2lvdGxiLmgKKysrIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3N3aW90bGIuaApAQCAtMiw0NCArMiw3IEBACiAjZGVmaW5lIEFTTV9JQTY0X19TV0lPVExCX0gKIAogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0KLS8qIFNXSU9UTEIgaW50ZXJmYWNlICovCi0KLWV4dGVybiBkbWFfYWRkcl90IHN3aW90bGJfbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpod2Rldiwgdm9pZCAqcHRyLAotCQkJCSAgICAgc2l6ZV90IHNpemUsIGludCBkaXIpOwotZXh0ZXJuIHZvaWQgKnN3aW90bGJfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqaHdkZXYsIHNpemVfdCBzaXplLAotCQkJCSAgICBkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCBnZnBfdCBmbGFncyk7Ci1leHRlcm4gdm9pZCBzd2lvdGxiX3VubWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpod2RldiwgZG1hX2FkZHJfdCBkZXZfYWRkciwKLQkJCQkgc2l6ZV90IHNpemUsIGludCBkaXIpOwotZXh0ZXJuIHZvaWQgc3dpb3RsYl9zeW5jX3NpbmdsZV9mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmh3ZGV2LAotCQkJCQlkbWFfYWRkcl90IGRldl9hZGRyLAotCQkJCQlzaXplX3Qgc2l6ZSwgaW50IGRpcik7Ci1leHRlcm4gdm9pZCBzd2lvdGxiX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqaHdkZXYsCi0JCQkJCSAgIGRtYV9hZGRyX3QgZGV2X2FkZHIsCi0JCQkJCSAgIHNpemVfdCBzaXplLCBpbnQgZGlyKTsKLWV4dGVybiB2b2lkIHN3aW90bGJfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpod2RldiwKLQkJCQkJICAgICAgZG1hX2FkZHJfdCBkZXZfYWRkciwKLQkJCQkJICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsCi0JCQkJCSAgICAgIHNpemVfdCBzaXplLCBpbnQgZGlyKTsKLWV4dGVybiB2b2lkIHN3aW90bGJfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpod2RldiwKLQkJCQkJCSBkbWFfYWRkcl90IGRldl9hZGRyLAotCQkJCQkJIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAotCQkJCQkJIHNpemVfdCBzaXplLCBpbnQgZGlyKTsKLWV4dGVybiB2b2lkIHN3aW90bGJfc3luY19zZ19mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmh3ZGV2LAotCQkJCSAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVsZW1zLAotCQkJCSAgICBpbnQgZGlyKTsKLWV4dGVybiB2b2lkIHN3aW90bGJfc3luY19zZ19mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LAotCQkJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVsZW1zLAotCQkJCSAgICAgICBpbnQgZGlyKTsKLWV4dGVybiBpbnQgc3dpb3RsYl9tYXBfc2coc3RydWN0IGRldmljZSAqaHdkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCi0JCQkgIGludCBuZW50cywgaW50IGRpcmVjdGlvbik7Ci1leHRlcm4gdm9pZCBzd2lvdGxiX3VubWFwX3NnKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAotCQkJICAgICBpbnQgbmVudHMsIGludCBkaXJlY3Rpb24pOwotZXh0ZXJuIGludCBzd2lvdGxiX2RtYV9tYXBwaW5nX2Vycm9yKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyKTsKLWV4dGVybiB2b2lkIHN3aW90bGJfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc2l6ZV90IHNpemUsCi0JCQkJICB2b2lkICp2YWRkciwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlKTsKLWV4dGVybiBpbnQgc3dpb3RsYl9kbWFfc3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCB1NjQgbWFzayk7Ci1leHRlcm4gdm9pZCBzd2lvdGxiX2luaXQodm9pZCk7CisjaW5jbHVkZSA8bGludXgvc3dpb3RsYi5oPgogCiBleHRlcm4gaW50IHN3aW90bGJfZm9yY2U7CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwva3Byb2Jlcy5jIGIvYXJjaC9pYTY0L2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggZjA3Njg4ZC4uZjkwYmU1MSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9rcHJvYmVzLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9rcHJvYmVzLmMKQEAgLTQzNCw3ICs0MzQsNyBAQAogCS8qCiAJICogSXQgaXMgcG9zc2libGUgdG8gaGF2ZSBtdWx0aXBsZSBpbnN0YW5jZXMgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4KIAkgKiB0YXNrIGVpdGhlciBiZWNhdXNlIGFuIG11bHRpcGxlIGZ1bmN0aW9ucyBpbiB0aGUgY2FsbCBwYXRoCi0JICogaGF2ZSBhIHJldHVybiBwcm9iZSBpbnN0YWxsZWQgb24gdGhlbSwgYW5kL29yIG1vcmUgdGhlbiBvbmUgcmV0dXJuCisJICogaGF2ZSBhIHJldHVybiBwcm9iZSBpbnN0YWxsZWQgb24gdGhlbSwgYW5kL29yIG1vcmUgdGhhbiBvbmUgcmV0dXJuCiAJICogcmV0dXJuIHByb2JlIHdhcyByZWdpc3RlcmVkIGZvciBhIHRhcmdldCBmdW5jdGlvbi4KIAkgKgogCSAqIFdlIGNhbiBoYW5kbGUgdGhpcyBiZWNhdXNlOgpAQCAtNjcwLDkgKzY3MCwxMSBAQAogCiB2b2lkIF9fa3Byb2JlcyBhcmNoX3JlbW92ZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKLQltdXRleF9sb2NrKCZrcHJvYmVfbXV0ZXgpOwotCWZyZWVfaW5zbl9zbG90KHAtPmFpbnNuLmluc24sIHAtPmFpbnNuLmluc3RfZmxhZyAmIElOU1RfRkxBR19CT09TVEFCTEUpOwotCW11dGV4X3VubG9jaygma3Byb2JlX211dGV4KTsKKwlpZiAocC0+YWluc24uaW5zbikgeworCQlmcmVlX2luc25fc2xvdChwLT5haW5zbi5pbnNuLAorCQkJICAgICAgIHAtPmFpbnNuLmluc3RfZmxhZyAmIElOU1RfRkxBR19CT09TVEFCTEUpOworCQlwLT5haW5zbi5pbnNuID0gTlVMTDsKKwl9CiB9CiAvKgogICogV2UgYXJlIHJlc3VtaW5nIGV4ZWN1dGlvbiBhZnRlciBhIHNpbmdsZSBzdGVwIGZhdWx0LCBzbyB0aGUgcHRfcmVncwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9wY2ktZG1hLmMgYi9hcmNoL2lhNjQva2VybmVsL3BjaS1kbWEuYwppbmRleCAyYTkyZjYzLi5kMGFkYTA2IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3BjaS1kbWEuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3BjaS1kbWEuYwpAQCAtMzksNyArMzksNyBAQAogICAgYmUgcHJvYmFibHkgYSBzbWFsbGVyIERNQSBtYXNrLCBidXQgdGhpcyBpcyBidWctdG8tYnVnIGNvbXBhdGlibGUKICAgIHRvIGkzODYuICovCiBzdHJ1Y3QgZGV2aWNlIGZhbGxiYWNrX2RldiA9IHsKLQkuYnVzX2lkID0gImZhbGxiYWNrIGRldmljZSIsCisJLmluaXRfbmFtZSA9ICJmYWxsYmFjayBkZXZpY2UiLAogCS5jb2hlcmVudF9kbWFfbWFzayA9IERNQV8zMkJJVF9NQVNLLAogCS5kbWFfbWFzayA9ICZmYWxsYmFja19kZXYuY29oZXJlbnRfZG1hX21hc2ssCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L21tL2luaXQuYyBiL2FyY2gvaWE2NC9tbS9pbml0LmMKaW5kZXggMDU0YmNkOS4uNTZlMTI5MCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L21tL2luaXQuYworKysgYi9hcmNoL2lhNjQvbW0vaW5pdC5jCkBAIC02OTIsNyArNjkyLDcgQEAKIAlwZ2RhdCA9IE5PREVfREFUQShuaWQpOwogCiAJem9uZSA9IHBnZGF0LT5ub2RlX3pvbmVzICsgWk9ORV9OT1JNQUw7Ci0JcmV0ID0gX19hZGRfcGFnZXMoem9uZSwgc3RhcnRfcGZuLCBucl9wYWdlcyk7CisJcmV0ID0gX19hZGRfcGFnZXMobmlkLCB6b25lLCBzdGFydF9wZm4sIG5yX3BhZ2VzKTsKIAogCWlmIChyZXQpCiAJCXByaW50aygiJXM6IFByb2JsZW0gZW5jb3VudGVyZWQgaW4gX19hZGRfcGFnZXMoKSBhcyByZXQ9JWRcbiIsCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL3Rpb2N4LmMgYi9hcmNoL2lhNjQvc24va2VybmVsL3Rpb2N4LmMKaW5kZXggYTg4ZWJhMy4uM2Y4NjQyMyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC90aW9jeC5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvdGlvY3guYwpAQCAtMjA2LDggKzIwNiw3IEBACiAJY3hfZGV2LT5kZXYucGFyZW50ID0gTlVMTDsKIAljeF9kZXYtPmRldi5idXMgPSAmdGlvY3hfYnVzX3R5cGU7CiAJY3hfZGV2LT5kZXYucmVsZWFzZSA9IHRpb2N4X2J1c19yZWxlYXNlOwotCXNucHJpbnRmKGN4X2Rldi0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsICIlZCIsCi0JCSBjeF9kZXYtPmN4X2lkLm5hc2lkKTsKKwlkZXZfc2V0X25hbWUoJmN4X2Rldi0+ZGV2LCAiJWQiLCBjeF9kZXYtPmN4X2lkLm5hc2lkKTsKIAlkZXZpY2VfcmVnaXN0ZXIoJmN4X2Rldi0+ZGV2KTsKIAlnZXRfZGV2aWNlKCZjeF9kZXYtPmRldik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9LY29uZmlnIGIvYXJjaC9tNjhrL0tjb25maWcKaW5kZXggYzgyNWJkZS4uZmI4N2MwOCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL0tjb25maWcKKysrIGIvYXJjaC9tNjhrL0tjb25maWcKQEAgLTMwMyw3ICszMDMsNyBAQAogCSAgY29ycmVjdCByb3VuZGluZywgdGhlIGVtdWxhdG9yIGNhbiAob2Z0ZW4pIGRvIHRoZSBzYW1lIGJ1dCB0aGlzCiAJICBleHRyYSBjYWxjdWxhdGlvbiBjYW4gY29zdCBxdWl0ZSBzb21lIHRpbWUsIHNvIHlvdSBjYW4gZGlzYWJsZQogCSAgaXQgaGVyZS4gVGhlIGVtdWxhdG9yIHdpbGwgdGhlbiAib25seSIgY2FsY3VsYXRlIHdpdGggYSA2NCBiaXQKLQkgIG1hbnRpc3NhIGFuZCByb3VuZCBzbGlnaHRseSBpbmNvcnJlY3QsIHdoYXQgaXMgbW9yZSB0aGVuIGVub3VnaAorCSAgbWFudGlzc2EgYW5kIHJvdW5kIHNsaWdodGx5IGluY29ycmVjdCwgd2hhdCBpcyBtb3JlIHRoYW4gZW5vdWdoCiAJICBmb3Igbm9ybWFsIHVzYWdlLgogCiBjb25maWcgTTY4S0ZQVV9FTVVfT05MWQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9tNjhrL2tlcm5lbC90cmFwcy5jCmluZGV4IDZkODEzZGUuLjE4NGFjYzkgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL202OGsva2VybmVsL3RyYXBzLmMKQEAgLTQwMSw3ICs0MDEsNyBAQAogICogY2FsbGVkIGZyb20gc2lncmV0dXJuKCksIG11c3QgZW5zdXJlIHVzZXJzcGFjZSBjb2RlIGRpZG4ndAogICogbWFuaXB1bGF0ZSBleGNlcHRpb24gZnJhbWUgdG8gY2lyY3VtdmVudCBwcm90ZWN0aW9uLCB0aGVuIGNvbXBsZXRlCiAgKiBwZW5kaW5nIHdyaXRlYmFja3MKLSAqIHdlIGp1c3QgY2xlYXIgVE0yIHRvIHR1cm4gaXQgaW50byBhbiB1c2Vyc3BhY2UgYWNjZXNzCisgKiB3ZSBqdXN0IGNsZWFyIFRNMiB0byB0dXJuIGl0IGludG8gYSB1c2Vyc3BhY2UgYWNjZXNzCiAgKi8KIGFzbWxpbmthZ2Ugdm9pZCBiZXJyXzA0MGNsZWFudXAoc3RydWN0IGZyYW1lICpmcCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvbTY4a25vbW11L2luY2x1ZGUvYXNtL0tidWlsZAppbmRleCBjNjhlMTY4Li41OGMwMmE0IDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9tNjhrbm9tbXUvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0xICsxLDMgQEAKIGluY2x1ZGUgaW5jbHVkZS9hc20tZ2VuZXJpYy9LYnVpbGQuYXNtCisKK3VuaWZkZWYteSArPSBzd2FiLmgKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2luY2x1ZGUvYXNtL2F0b21pYy5oIGIvYXJjaC9tNjhrbm9tbXUvaW5jbHVkZS9hc20vYXRvbWljLmgKaW5kZXggZDU2MzJhMy4uNmJiNjc0OCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUvaW5jbHVkZS9hc20vYXRvbWljLmgKKysrIGIvYXJjaC9tNjhrbm9tbXUvaW5jbHVkZS9hc20vYXRvbWljLmgKQEAgLTEsNiArMSw3IEBACiAjaWZuZGVmIF9fQVJDSF9NNjhLTk9NTVVfQVRPTUlDX18KICNkZWZpbmUgX19BUkNIX002OEtOT01NVV9BVE9NSUNfXwogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKIC8qCkBAIC0xMiw3ICsxMyw2IEBACiAgKiBXZSBkbyBub3QgaGF2ZSBTTVAgbTY4ayBzeXN0ZW1zLCBzbyB3ZSBkb24ndCBoYXZlIHRvIGRlYWwgd2l0aCB0aGF0LgogICovCiAKLXR5cGVkZWYgc3RydWN0IHsgaW50IGNvdW50ZXI7IH0gYXRvbWljX3Q7CiAjZGVmaW5lIEFUT01JQ19JTklUKGkpCXsgKGkpIH0KIAogI2RlZmluZSBhdG9taWNfcmVhZCh2KQkJKCh2KS0+Y291bnRlcikKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oIGIvYXJjaC9tNjhrbm9tbXUvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKaW5kZXggMjBiYjQ0Mi4uYTZmMGI4ZiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKKysrIGIvYXJjaC9tNjhrbm9tbXUvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKQEAgLTEsMjcgKzEsNyBAQAogI2lmbmRlZiBfTTY4S05PTU1VX0JZVEVPUkRFUl9ICiAjZGVmaW5lIF9NNjhLTk9NTVVfQllURU9SREVSX0gKIAotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0KLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pIHx8IGRlZmluZWQoX19LRVJORUxfXykKLSMgIGRlZmluZSBfX0JZVEVPUkRFUl9IQVNfVTY0X18KLSMgIGRlZmluZSBfX1NXQUJfNjRfVEhSVV8zMl9fCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9fbWNmaXNhYXBsdXNfXykgfHwgZGVmaW5lZCAoX19tY2Zpc2FjX18pCi1zdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19fYXJjaF9fc3dhYjMyKF9fdTMyIHZhbCkKLXsKLQlhc20oCi0JCQkiYnl0ZXJldiAlMCIKLQkJCTogIj1kIiAodmFsKQotCQkJOiAiMCIgKHZhbCkKLQkgICApOwotCXJldHVybiB2YWw7Ci19Ci0KLSNkZWZpbmUgX19hcmNoX19zd2FiMzIoeCkgX19fYXJjaF9fc3dhYjMyKHgpCi0jZW5kaWYKLQorI2luY2x1ZGUgPGFzbS9zd2FiLmg+CiAjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2JpZ19lbmRpYW4uaD4KIAogI2VuZGlmIC8qIF9NNjhLTk9NTVVfQllURU9SREVSX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2luY2x1ZGUvYXNtL3N3YWIuaCBiL2FyY2gvbTY4a25vbW11L2luY2x1ZGUvYXNtL3N3YWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTgyMjU3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tNjhrbm9tbXUvaW5jbHVkZS9hc20vc3dhYi5oCkBAIC0wLDAgKzEsMjQgQEAKKyNpZm5kZWYgX002OEtOT01NVV9TV0FCX0gKKyNkZWZpbmUgX002OEtOT01NVV9TV0FCX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pIHx8IGRlZmluZWQoX19LRVJORUxfXykKKyMgIGRlZmluZSBfX1NXQUJfNjRfVEhSVV8zMl9fCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fbWNmaXNhYXBsdXNfXykgfHwgZGVmaW5lZCAoX19tY2Zpc2FjX18pCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19hcmNoX3N3YWIzMihfX3UzMiB2YWwpCit7CisJYXNtKAorCQkJImJ5dGVyZXYgJTAiCisJCQk6ICI9ZCIgKHZhbCkKKwkJCTogIjAiICh2YWwpCisJICAgKTsKKwlyZXR1cm4gdmFsOworfQorCisjZGVmaW5lIF9fYXJjaF9zd2FiMzIgX19hcmNoX3N3YWIzMgorI2VuZGlmCisKKyNlbmRpZiAvKiBfTTY4S05PTU1VX1NXQUJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggNzg5N2YwNS4uMDIzODY2YyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0xLDMgKzEsNCBAQAogaW5jbHVkZSBpbmNsdWRlL2FzbS1nZW5lcmljL0tidWlsZC5hc20KIAogaGVhZGVyLXkgKz0gY2FjaGVjdGwuaCBzZ2lkZWZzLmggc3lzbWlwcy5oCitoZWFkZXIteSArPSBzd2FiLmgKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9hdG9taWMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9hdG9taWMuaAppbmRleCAxMjMyYmUzLi5jOTk2YzNiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vYXRvbWljLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2F0b21pYy5oCkBAIC0xNSwxMyArMTUsMTIgQEAKICNkZWZpbmUgX0FTTV9BVE9NSUNfSAogCiAjaW5jbHVkZSA8bGludXgvaXJxZmxhZ3MuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9iYXJyaWVyLmg+CiAjaW5jbHVkZSA8YXNtL2NwdS1mZWF0dXJlcy5oPgogI2luY2x1ZGUgPGFzbS93YXIuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKLXR5cGVkZWYgc3RydWN0IHsgdm9sYXRpbGUgaW50IGNvdW50ZXI7IH0gYXRvbWljX3Q7Ci0KICNkZWZpbmUgQVRPTUlDX0lOSVQoaSkgICAgeyAoaSkgfQogCiAvKgpAQCAtNDA0LDggKzQwMyw2IEBACiAKICNpZmRlZiBDT05GSUdfNjRCSVQKIAotdHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBsb25nIGNvdW50ZXI7IH0gYXRvbWljNjRfdDsKLQogI2RlZmluZSBBVE9NSUM2NF9JTklUKGkpICAgIHsgKGkpIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaAppbmRleCAzMzc5MGI5Li42MDdiNzE4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCkBAIC04LDYwICs4LDE0IEBACiAjaWZuZGVmIF9BU01fQllURU9SREVSX0gKICNkZWZpbmUgX0FTTV9CWVRFT1JERVJfSAogCi0jaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KLSNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vc3dhYi5oPgogCiAjaWYgZGVmaW5lZChfX01JUFNFQl9fKQotIyBkZWZpbmUgX19CSUdfRU5ESUFOCisjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2JpZ19lbmRpYW4uaD4KICNlbGlmIGRlZmluZWQoX19NSVBTRUxfXykKLSMgZGVmaW5lIF9fTElUVExFX0VORElBTgorI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9saXR0bGVfZW5kaWFuLmg+CiAjZWxzZQogIyBlcnJvciAiTUlQUywgYnV0IG5laXRoZXIgX19NSVBTRUJfXywgbm9yIF9fTUlQU0VMX18/Pz8iCiAjZW5kaWYKIAotI2RlZmluZSBfX1NXQUJfNjRfVEhSVV8zMl9fCi0KLSNpZmRlZiBDT05GSUdfQ1BVX01JUFNSMgotCi1zdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MTYgX19hcmNoX3N3YWIxNihfX3UxNiB4KQotewotCV9fYXNtX18oCi0JIgl3c2JoCSUwLCAlMQkJCVxuIgotCTogIj1yIiAoeCkKLQk6ICJyIiAoeCkpOwotCi0JcmV0dXJuIHg7Ci19Ci0jZGVmaW5lIF9fYXJjaF9zd2FiMTYgX19hcmNoX3N3YWIxNgotCi1zdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19hcmNoX3N3YWIzMihfX3UzMiB4KQotewotCV9fYXNtX18oCi0JIgl3c2JoCSUwLCAlMQkJCVxuIgotCSIJcm90cgklMCwgJTAsIDE2CQlcbiIKLQk6ICI9ciIgKHgpCi0JOiAiciIgKHgpKTsKLQotCXJldHVybiB4OwotfQotI2RlZmluZSBfX2FyY2hfc3dhYjMyIF9fYXJjaF9zd2FiMzIKLQotI2lmZGVmIENPTkZJR19DUFVfTUlQUzY0X1IyCi1zdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191NjQgX19hcmNoX3N3YWI2NChfX3U2NCB4KQotewotCV9fYXNtX18oCi0JIglkc2JoCSUwLCAlMVxuIgotCSIJZHNoZAklMCwgJTAiCi0JOiAiPXIiICh4KQotCTogInIiICh4KSk7Ci0KLQlyZXR1cm4geDsKLX0KLSNkZWZpbmUgX19hcmNoX3N3YWI2NCBfX2FyY2hfc3dhYjY0Ci0jZW5kaWYgLyogQ09ORklHX0NQVV9NSVBTNjRfUjIgKi8KLQotI2VuZGlmIC8qIENPTkZJR19DUFVfTUlQU1IyICovCi0KLSNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIuaD4KLQogI2VuZGlmIC8qIF9BU01fQllURU9SREVSX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zd2FiLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc3dhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZjFmN2QKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc3dhYi5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDk5LCAyMDAzIGJ5IFJhbGYgQmFlY2hsZQorICovCisjaWZuZGVmIF9BU01fU1dBQl9ICisjZGVmaW5lIF9BU01fU1dBQl9ICisKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCisjZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KKworI2lmZGVmIENPTkZJR19DUFVfTUlQU1IyCisKK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UxNiBfX2FyY2hfc3dhYjE2KF9fdTE2IHgpCit7CisJX19hc21fXygKKwkiCXdzYmgJJTAsICUxCQkJXG4iCisJOiAiPXIiICh4KQorCTogInIiICh4KSk7CisKKwlyZXR1cm4geDsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWIxNiBfX2FyY2hfc3dhYjE2CisKK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UzMiBfX2FyY2hfc3dhYjMyKF9fdTMyIHgpCit7CisJX19hc21fXygKKwkiCXdzYmgJJTAsICUxCQkJXG4iCisJIglyb3RyCSUwLCAlMCwgMTYJCVxuIgorCTogIj1yIiAoeCkKKwk6ICJyIiAoeCkpOworCisJcmV0dXJuIHg7Cit9CisjZGVmaW5lIF9fYXJjaF9zd2FiMzIgX19hcmNoX3N3YWIzMgorCisjaWZkZWYgQ09ORklHX0NQVV9NSVBTNjRfUjIKK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyBfX3U2NCBfX2FyY2hfc3dhYjY0KF9fdTY0IHgpCit7CisJX19hc21fXygKKwkiCWRzYmgJJTAsICUxXG4iCisJIglkc2hkCSUwLCAlMCIKKwk6ICI9ciIgKHgpCisJOiAiciIgKHgpKTsKKworCXJldHVybiB4OworfQorI2RlZmluZSBfX2FyY2hfc3dhYjY0IF9fYXJjaF9zd2FiNjQKKyNlbmRpZiAvKiBDT05GSUdfQ1BVX01JUFM2NF9SMiAqLworI2VuZGlmIC8qIENPTkZJR19DUFVfTUlQU1IyICovCisjZW5kaWYgLyogX0FTTV9TV0FCX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc3RhY2t0cmFjZS5jIGIvYXJjaC9taXBzL2tlcm5lbC9zdGFja3RyYWNlLmMKaW5kZXggMDYzMmUyYS4uNThmNWNkNyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zdGFja3RyYWNlLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zdGFja3RyYWNlLmMKQEAgLTMyLDcgKzMyLDggQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHNhdmVfY29udGV4dF9zdGFjayhzdHJ1Y3Qgc3RhY2tfdHJhY2UgKnRyYWNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyB2b2lkIHNhdmVfY29udGV4dF9zdGFjayhzdHJ1Y3Qgc3RhY2tfdHJhY2UgKnRyYWNlLAorCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl1bnNpZ25lZCBsb25nIHNwID0gcmVncy0+cmVnc1syOV07CiAjaWZkZWYgQ09ORklHX0tBTExTWU1TCkBAIC00MSw3ICs0Miw3IEBACiAKIAlpZiAocmF3X3Nob3dfdHJhY2UgfHwgIV9fa2VybmVsX3RleHRfYWRkcmVzcyhwYykpIHsKIAkJdW5zaWduZWQgbG9uZyBzdGFja19wYWdlID0KLQkJCSh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZShjdXJyZW50KTsKKwkJCSh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZSh0c2spOwogCQlpZiAoc3RhY2tfcGFnZSAmJiBzcCA+PSBzdGFja19wYWdlICYmCiAJCSAgICBzcCA8PSBzdGFja19wYWdlICsgVEhSRUFEX1NJWkUgLSAzMikKIAkJCXNhdmVfcmF3X2NvbnRleHRfc3RhY2sodHJhY2UsIHNwKTsKQEAgLTU0LDcgKzU1LDcgQEAKIAkJCXRyYWNlLT5lbnRyaWVzW3RyYWNlLT5ucl9lbnRyaWVzKytdID0gcGM7CiAJCWlmICh0cmFjZS0+bnJfZW50cmllcyA+PSB0cmFjZS0+bWF4X2VudHJpZXMpCiAJCQlicmVhazsKLQkJcGMgPSB1bndpbmRfc3RhY2soY3VycmVudCwgJnNwLCBwYywgJnJhKTsKKwkJcGMgPSB1bndpbmRfc3RhY2sodHNrLCAmc3AsIHBjLCAmcmEpOwogCX0gd2hpbGUgKHBjKTsKICNlbHNlCiAJc2F2ZV9yYXdfY29udGV4dF9zdGFjayh0cmFjZSwgc3ApOwpAQCAtNjYsMTIgKzY3LDIzIEBACiAgKi8KIHZvaWQgc2F2ZV9zdGFja190cmFjZShzdHJ1Y3Qgc3RhY2tfdHJhY2UgKnRyYWNlKQogeworCXNhdmVfc3RhY2tfdHJhY2VfdHNrKGN1cnJlbnQsIHRyYWNlKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNhdmVfc3RhY2tfdHJhY2UpOworCit2b2lkIHNhdmVfc3RhY2tfdHJhY2VfdHNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3Qgc3RhY2tfdHJhY2UgKnRyYWNlKQorewogCXN0cnVjdCBwdF9yZWdzIGR1bW15cmVnczsKIAlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9ICZkdW1teXJlZ3M7CiAKIAlXQVJOX09OKHRyYWNlLT5ucl9lbnRyaWVzIHx8ICF0cmFjZS0+bWF4X2VudHJpZXMpOwogCi0JcHJlcGFyZV9mcmFtZXRyYWNlKHJlZ3MpOwotCXNhdmVfY29udGV4dF9zdGFjayh0cmFjZSwgcmVncyk7CisJaWYgKHRzayAhPSBjdXJyZW50KSB7CisJCXJlZ3MtPnJlZ3NbMjldID0gdHNrLT50aHJlYWQucmVnMjk7CisJCXJlZ3MtPnJlZ3NbMzFdID0gMDsKKwkJcmVncy0+Y3AwX2VwYyA9IHRzay0+dGhyZWFkLnJlZzMxOworCX0gZWxzZQorCQlwcmVwYXJlX2ZyYW1ldHJhY2UocmVncyk7CisJc2F2ZV9jb250ZXh0X3N0YWNrKHRyYWNlLCB0c2ssIHJlZ3MpOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoc2F2ZV9zdGFja190cmFjZSk7CitFWFBPUlRfU1lNQk9MX0dQTChzYXZlX3N0YWNrX3RyYWNlX3Rzayk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3ZwZS5jIGIvYXJjaC9taXBzL2tlcm5lbC92cGUuYwppbmRleCAwMTBiMjdlLi4zY2E1ZjQyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3ZwZS5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvdnBlLmMKQEAgLTE0NTQsNyArMTQ1NCw3IEBACiAJZGV2aWNlX2luaXRpYWxpemUoJnZwZV9kZXZpY2UpOwogCXZwZV9kZXZpY2UuY2xhc3MJPSAmdnBlX2NsYXNzLAogCXZwZV9kZXZpY2UucGFyZW50CT0gTlVMTCwKLQlzdHJsY3B5KHZwZV9kZXZpY2UuYnVzX2lkLCAidnBlMSIsIEJVU19JRF9TSVpFKTsKKwlkZXZfc2V0X25hbWUoJnZwZV9kZXZpY2UsICJ2cGUxIik7CiAJdnBlX2RldmljZS5kZXZ0ID0gTUtERVYobWFqb3IsIG1pbm9yKTsKIAllcnIgPSBkZXZpY2VfYWRkKCZ2cGVfZGV2aWNlKTsKIAlpZiAoZXJyKSB7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL3BjaS1pcDI3LmMgYi9hcmNoL21pcHMvcGNpL3BjaS1pcDI3LmMKaW5kZXggZjk3YWIxNC4uZGRhNmYyMCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BjaS9wY2ktaXAyNy5jCisrKyBiL2FyY2gvbWlwcy9wY2kvcGNpLWlwMjcuYwpAQCAtMTQ2LDEyICsxNDYsNiBAQAogCXJldHVybiAwOwogfQogCi0vKiBNb3N0IE1JUFMgc3lzdGVtcyBoYXZlIHN0cmFpZ2h0LWZvcndhcmQgc3dpenpsaW5nIG5lZWRzLiAgKi8KLXN0YXRpYyBpbmxpbmUgdTggYnJpZGdlX3N3aXp6bGUodTggcGluLCB1OCBzbG90KQotewotCXJldHVybiAoKChwaW4gLSAxKSArIHNsb3QpICUgNCkgKyAxOwotfQotCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBwY2lfZGV2ICpicmlkZ2Vfcm9vdF9kZXYoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAl3aGlsZSAoZGV2LT5idXMtPnBhcmVudCkgewpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BjaS9wY2kuYyBiL2FyY2gvbWlwcy9wY2kvcGNpLmMKaW5kZXggNjJjYWU3NC4uYjBlYjllNyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BjaS9wY2kuYworKysgYi9hcmNoL21pcHMvcGNpL3BjaS5jCkBAIC0xNDksMjggKzE0OSw2IEBACiAJICAgICAgICJTa2lwcGluZyBQQ0kgYnVzIHNjYW4gZHVlIHRvIHJlc291cmNlIGNvbmZsaWN0XG4iKTsKIH0KIAotLyogTW9zdCBNSVBTIHN5c3RlbXMgaGF2ZSBzdHJhaWdodC1mb3J3YXJkIHN3aXp6bGluZyBuZWVkcy4gICovCi0KLXN0YXRpYyBpbmxpbmUgdTggYnJpZGdlX3N3aXp6bGUodTggcGluLCB1OCBzbG90KQotewotCXJldHVybiAoKChwaW4gLSAxKSArIHNsb3QpICUgNCkgKyAxOwotfQotCi1zdGF0aWMgdTggX19pbml0IGNvbW1vbl9zd2l6emxlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4ICpwaW5wKQotewotCXU4IHBpbiA9ICpwaW5wOwotCi0Jd2hpbGUgKGRldi0+YnVzLT5wYXJlbnQpIHsKLQkJcGluID0gYnJpZGdlX3N3aXp6bGUocGluLCBQQ0lfU0xPVChkZXYtPmRldmZuKSk7Ci0JCS8qIE1vdmUgdXAgdGhlIGNoYWluIG9mIGJyaWRnZXMuICovCi0JCWRldiA9IGRldi0+YnVzLT5zZWxmOwotICAgICAgICB9Ci0JKnBpbnAgPSBwaW47Ci0KLQkvKiBUaGUgc2xvdCBpcyB0aGUgc2xvdCBvZiB0aGUgbGFzdCBicmlkZ2UuICovCi0JcmV0dXJuIFBDSV9TTE9UKGRldi0+ZGV2Zm4pOwotfQotCiBzdGF0aWMgaW50IF9faW5pdCBwY2liaW9zX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7CkBAIC0xNzksNyArMTU3LDcgQEAKIAlmb3IgKGhvc2UgPSBob3NlX2hlYWQ7IGhvc2U7IGhvc2UgPSBob3NlLT5uZXh0KQogCQlwY2liaW9zX3NjYW5idXMoaG9zZSk7CiAKLQlwY2lfZml4dXBfaXJxcyhjb21tb25fc3dpenpsZSwgcGNpYmlvc19tYXBfaXJxKTsKKwlwY2lfZml4dXBfaXJxcyhwY2lfY29tbW9uX3N3aXp6bGUsIHBjaWJpb3NfbWFwX2lycSk7CiAKIAlwY2lfaW5pdGlhbGl6ZWQgPSAxOwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcG1jLXNpZXJyYS95b3NlbWl0ZS9hdG1lbF9yZWFkX2VlcHJvbS5jIGIvYXJjaC9taXBzL3BtYy1zaWVycmEveW9zZW1pdGUvYXRtZWxfcmVhZF9lZXByb20uYwppbmRleCA5Nzg2MmY0Li5jYWY1ZTlhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcG1jLXNpZXJyYS95b3NlbWl0ZS9hdG1lbF9yZWFkX2VlcHJvbS5jCisrKyBiL2FyY2gvbWlwcy9wbWMtc2llcnJhL3lvc2VtaXRlL2F0bWVsX3JlYWRfZWVwcm9tLmMKQEAgLTE0OCw3ICsxNDgsNyBAQAogCXNlbmRfYnl0ZShXX0hFQURFUik7CiAJcmVjdl9hY2soKTsKIAotCS8qIEVFUFJPTSB3aXRoIHNpemUgb2YgbW9yZSB0aGVuIDJLIG5lZWQgdHdvIGJ5dGUgYWRkcmVzc2luZyAqLworCS8qIEVFUFJPTSB3aXRoIHNpemUgb2YgbW9yZSB0aGFuIDJLIG5lZWQgdHdvIGJ5dGUgYWRkcmVzc2luZyAqLwogCWlmIChlZXByb21fc2l6ZSA+IDIwNDgpIHsKIAkJc2VuZF9ieXRlKDB4MDApOwogCQlyZWN2X2FjaygpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vYXRvbWljLmggYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9hdG9taWMuaAppbmRleCA1N2ZjYzRhLi5lZGJmZTI1IDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9hdG9taWMuaAorKysgYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9hdG9taWMuaApAQCAtMTU1LDE0ICsxNTUsMTEgQEAKICNkZWZpbmUgY21weGNoZzY0X2xvY2FsKHB0ciwgbywgbikgX19jbXB4Y2hnNjRfbG9jYWxfZ2VuZXJpYygocHRyKSwgKG8pLCAobikpCiAjZW5kaWYKIAotLyogTm90ZSB0aGF0IHdlIG5lZWQgbm90IGxvY2sgcmVhZCBhY2Nlc3NlcyAtIGFsaWduZWQgd29yZCB3cml0ZXMvcmVhZHMKLSAqIGFyZSBhdG9taWMsIHNvIGEgcmVhZGVyIG5ldmVyIHNlZXMgdW5jb25zaXN0ZW50IHZhbHVlcy4KLSAqCi0gKiBDYWNoZS1saW5lIGFsaWdubWVudCB3b3VsZCBjb25mbGljdCB3aXRoLCBmb3IgZXhhbXBsZSwgbGludXgvbW9kdWxlLmgKKy8qCisgKiBOb3RlIHRoYXQgd2UgbmVlZCBub3QgbG9jayByZWFkIGFjY2Vzc2VzIC0gYWxpZ25lZCB3b3JkIHdyaXRlcy9yZWFkcworICogYXJlIGF0b21pYywgc28gYSByZWFkZXIgbmV2ZXIgc2VlcyBpbmNvbnNpc3RlbnQgdmFsdWVzLgogICovCiAKLXR5cGVkZWYgc3RydWN0IHsgdm9sYXRpbGUgaW50IGNvdW50ZXI7IH0gYXRvbWljX3Q7Ci0KIC8qIEl0J3MgcG9zc2libGUgdG8gcmVkdWNlIGFsbCBhdG9taWMgb3BlcmF0aW9ucyB0byBlaXRoZXIKICAqIF9fYXRvbWljX2FkZF9yZXR1cm4sIGF0b21pY19zZXQgYW5kIGF0b21pY19yZWFkICh0aGUgbGF0dGVyCiAgKiBpcyB0aGVyZSBvbmx5IGZvciBjb25zaXN0ZW5jeSkuCkBAIC0yNjAsOCArMjU3LDYgQEAKIAogI2lmZGVmIENPTkZJR182NEJJVAogCi10eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIHM2NCBjb3VudGVyOyB9IGF0b21pYzY0X3Q7Ci0KICNkZWZpbmUgQVRPTUlDNjRfSU5JVChpKSAoKGF0b21pYzY0X3QpIHsgKGkpIH0pCiAKIHN0YXRpYyBfX2lubGluZV9fIGludApkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vbW9kdWxlLmggYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9tb2R1bGUuaAppbmRleCBjMmNiNDllLi4xZjQxMjM0IDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9tb2R1bGUuaAorKysgYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9tb2R1bGUuaApAQCAtMjMsOCArMjMsMTAgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGdvdF9vZmZzZXQsIGdvdF9jb3VudCwgZ290X21heDsKIAl1bnNpZ25lZCBsb25nIGZkZXNjX29mZnNldCwgZmRlc2NfY291bnQsIGZkZXNjX21heDsKLQl1bnNpZ25lZCBsb25nIHN0dWJfb2Zmc2V0LCBzdHViX2NvdW50LCBzdHViX21heDsKLQl1bnNpZ25lZCBsb25nIGluaXRfc3R1Yl9vZmZzZXQsIGluaXRfc3R1Yl9jb3VudCwgaW5pdF9zdHViX21heDsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBsb25nIHN0dWJfb2Zmc2V0OworCQl1bnNpZ25lZCBpbnQgc3R1Yl9lbnRyaWVzOworCQl9ICpzZWN0aW9uOwogCWludCB1bndpbmRfc2VjdGlvbjsKIAlzdHJ1Y3QgdW53aW5kX3RhYmxlICp1bndpbmQ7CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL21vZHVsZS5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL21vZHVsZS5jCmluZGV4IDQ0MTM4YzMuLjkwMTMyNDMgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC9tb2R1bGUuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvbW9kdWxlLmMKQEAgLTYsNiArNiw3IEBACiAgKgogICogICAgTGludXgvUEEtUklTQyBQcm9qZWN0IChodHRwOi8vd3d3LnBhcmlzYy1saW51eC5vcmcvKQogICogICAgQ29weXJpZ2h0IChDKSAyMDAzIFJhbmRvbHBoIENodW5nIDx0YXVzcSBhdCBkZWJpYW4gLiBvcmc+CisgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDggSGVsZ2UgRGVsbGVyIDxkZWxsZXJAZ214LmRlPgogICoKICAqCiAgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpAQCAtMjQsNiArMjUsMTkgQEAKICAqCiAgKgogICogICAgTm90ZXM6CisgKiAgICAtIFBMVCBzdHViIGhhbmRsaW5nCisgKiAgICAgIE9uIDMyYml0IChhbmQgc29tZXRpbWVzIDY0Yml0KSBhbmQgd2l0aCBiaWcga2VybmVsIG1vZHVsZXMgbGlrZSB4ZnMgb3IKKyAqICAgICAgaXB2NiB0aGUgcmVsb2NhdGlvbiB0eXBlcyBSX1BBUklTQ19QQ1JFTDE3RiBhbmQgUl9QQVJJU0NfUENSRUwyMkYgbWF5CisgKiAgICAgIGZhaWwgdG8gcmVhY2ggdGhlaXIgUExUIHN0dWIgaWYgd2Ugb25seSBjcmVhdGUgb25lIGJpZyBzdHViIGFycmF5IGZvcgorICogICAgICBhbGwgc2VjdGlvbnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgY29yZSBvciBpbml0IHNlY3Rpb24uCisgKiAgICAgIEluc3RlYWQgd2Ugbm93IGluc2VydCBpbmRpdmlkdWFsIFBMVCBzdHViIGVudHJpZXMgZGlyZWN0bHkgaW4gZnJvbnQgb2YKKyAqICAgICAgb2YgdGhlIGNvZGUgc2VjdGlvbnMgd2hlcmUgdGhlIHN0dWJzIGFyZSBhY3R1YWxseSBjYWxsZWQuCisgKiAgICAgIFRoaXMgcmVkdWNlcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgUENSRUwgbG9jYXRpb24gYW5kIHRoZSBzdHViIGVudHJ5CisgKiAgICAgIHNvIHRoYXQgdGhlIHJlbG9jYXRpb25zIGNhbiBiZSBmdWxmaWxsZWQuCisgKiAgICAgIFdoaWxlIGNhbGN1bGF0aW5nIHRoZSBmaW5hbCBsYXlvdXQgb2YgdGhlIGtlcm5lbCBtb2R1bGUgaW4gbWVtb3J5LCB0aGUKKyAqICAgICAga2VybmVsIG1vZHVsZSBsb2FkZXIgY2FsbHMgYXJjaF9tb2Rfc2VjdGlvbl9wcmVwZW5kKCkgdG8gcmVxdWVzdCB0aGUKKyAqICAgICAgdG8gYmUgcmVzZXJ2ZWQgYW1vdW50IG9mIG1lbW9yeSBpbiBmcm9udCBvZiBlYWNoIGluZGl2aWR1YWwgc2VjdGlvbi4KKyAqCiAgKiAgICAtIFNFR1JFTDMyIGhhbmRsaW5nCiAgKiAgICAgIFdlIGFyZSBub3QgZG9pbmcgU0VHUkVMMzIgaGFuZGxpbmcgY29ycmVjdGx5LiBBY2NvcmRpbmcgdG8gdGhlIEFCSSwgd2UKICAqICAgICAgc2hvdWxkIGRvIGEgdmFsdWUgb2Zmc2V0LCBsaWtlIHRoaXM6CkBAIC01OCw5ICs3MiwxMyBAQAogI2RlZmluZSBERUJVR1AoZm10Li4uKQogI2VuZGlmCiAKKyNkZWZpbmUgUkVMT0NfUkVBQ0hBQkxFKHZhbCwgYml0cykgXAorCSgoICggISgodmFsKSAmICgxPDwoKGJpdHMpLTEpKSkgJiYgKCh2YWwpPj4oYml0cykpICE9IDAgKSAgfHwJXAorCSAgICAgKCAoKHZhbCkgJiAoMTw8KChiaXRzKS0xKSkpICYmICgodmFsKT4+KGJpdHMpKSAhPSAoKChfX3R5cGVvZl9fKHZhbCkpKH4wKSk+PigoYml0cykrMikpKSkgPyBcCisJMCA6IDEpCisKICNkZWZpbmUgQ0hFQ0tfUkVMT0ModmFsLCBiaXRzKSBcCi0JaWYgKCAoICEoKHZhbCkgJiAoMTw8KChiaXRzKS0xKSkpICYmICgodmFsKT4+KGJpdHMpKSAhPSAwICkgIHx8CVwKLQkgICAgICggKCh2YWwpICYgKDE8PCgoYml0cyktMSkpKSAmJiAoKHZhbCk+PihiaXRzKSkgIT0gKCgoX190eXBlb2ZfXyh2YWwpKSh+MCkpPj4oKGJpdHMpKzIpKSkpIHsgXAorCWlmICghUkVMT0NfUkVBQ0hBQkxFKHZhbCwgYml0cykpIHsgXAogCQlwcmludGsoS0VSTl9FUlIgIm1vZHVsZSAlcyByZWxvY2F0aW9uIG9mIHN5bWJvbCAlcyBpcyBvdXQgb2YgcmFuZ2UgKDB4JWx4IGluICVkIGJpdHMpXG4iLCBcCiAJCW1lLT5uYW1lLCBzdHJ0YWIgKyBzeW0tPnN0X25hbWUsICh1bnNpZ25lZCBsb25nKXZhbCwgYml0cyk7IFwKIAkJcmV0dXJuIC1FTk9FWEVDOwkJCVwKQEAgLTkyLDEzICsxMTAsNiBAQAogCXJldHVybiBpbl9pbml0KG1lLCBsb2MpIHx8IGluX2NvcmUobWUsIGxvYyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGluX2xvY2FsX3NlY3Rpb24oc3RydWN0IG1vZHVsZSAqbWUsIHZvaWQgKmxvYywgdm9pZCAqZG90KQotewotCXJldHVybiAoaW5faW5pdChtZSwgbG9jKSAmJiBpbl9pbml0KG1lLCBkb3QpKSB8fAotCQkoaW5fY29yZShtZSwgbG9jKSAmJiBpbl9jb3JlKG1lLCBkb3QpKTsKLX0KLQotCiAjaWZuZGVmIENPTkZJR182NEJJVAogc3RydWN0IGdvdF9lbnRyeSB7CiAJRWxmMzJfQWRkciBhZGRyOwpAQCAtMjU4LDIzICsyNjksNDIgQEAKIC8qIEZyZWUgbWVtb3J5IHJldHVybmVkIGZyb20gbW9kdWxlX2FsbG9jICovCiB2b2lkIG1vZHVsZV9mcmVlKHN0cnVjdCBtb2R1bGUgKm1vZCwgdm9pZCAqbW9kdWxlX3JlZ2lvbikKIHsKKwlrZnJlZShtb2QtPmFyY2guc2VjdGlvbik7CisJbW9kLT5hcmNoLnNlY3Rpb24gPSBOVUxMOworCiAJdmZyZWUobW9kdWxlX3JlZ2lvbik7CiAJLyogRklYTUU6IElmIG1vZHVsZV9yZWdpb24gPT0gbW9kLT5pbml0X3JlZ2lvbiwgdHJpbSBleGNlcHRpb24KICAgICAgICAgICAgdGFibGUgZW50cmllcy4gKi8KIH0KIAorLyogQWRkaXRpb25hbCBieXRlcyBuZWVkZWQgaW4gZnJvbnQgb2YgaW5kaXZpZHVhbCBzZWN0aW9ucyAqLwordW5zaWduZWQgaW50IGFyY2hfbW9kX3NlY3Rpb25fcHJlcGVuZChzdHJ1Y3QgbW9kdWxlICptb2QsCisJCQkJICAgICAgdW5zaWduZWQgaW50IHNlY3Rpb24pCit7CisJLyogc2l6ZSBuZWVkZWQgZm9yIGFsbCBzdHVicyBvZiB0aGlzIHNlY3Rpb24gKGluY2x1ZGluZworCSAqIG9uZSBhZGRpdGlvbmFsIGZvciBjb3JyZWN0IGFsaWdubWVudCBvZiB0aGUgc3R1YnMpICovCisJcmV0dXJuIChtb2QtPmFyY2guc2VjdGlvbltzZWN0aW9uXS5zdHViX2VudHJpZXMgKyAxKQorCQkqIHNpemVvZihzdHJ1Y3Qgc3R1Yl9lbnRyeSk7Cit9CisKICNkZWZpbmUgQ09OU1QgCiBpbnQgbW9kdWxlX2Zyb2JfYXJjaF9zZWN0aW9ucyhDT05TVCBFbGZfRWhkciAqaGRyLAogCQkJICAgICAgQ09OU1QgRWxmX1NoZHIgKnNlY2hkcnMsCiAJCQkgICAgICBDT05TVCBjaGFyICpzZWNzdHJpbmdzLAogCQkJICAgICAgc3RydWN0IG1vZHVsZSAqbWUpCiB7Ci0JdW5zaWduZWQgbG9uZyBnb3RzID0gMCwgZmRlc2NzID0gMCwgc3R1YnMgPSAwLCBpbml0X3N0dWJzID0gMDsKKwl1bnNpZ25lZCBsb25nIGdvdHMgPSAwLCBmZGVzY3MgPSAwLCBsZW47CiAJdW5zaWduZWQgaW50IGk7CiAKKwlsZW4gPSBoZHItPmVfc2hudW0gKiBzaXplb2YobWUtPmFyY2guc2VjdGlvblswXSk7CisJbWUtPmFyY2guc2VjdGlvbiA9IGt6YWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1lLT5hcmNoLnNlY3Rpb24pCisJCXJldHVybiAtRU5PTUVNOworCiAJZm9yIChpID0gMTsgaSA8IGhkci0+ZV9zaG51bTsgaSsrKSB7Ci0JCWNvbnN0IEVsZl9SZWxhICpyZWxzID0gKHZvaWQgKiloZHIgKyBzZWNoZHJzW2ldLnNoX29mZnNldDsKKwkJY29uc3QgRWxmX1JlbGEgKnJlbHMgPSAodm9pZCAqKXNlY2hkcnNbaV0uc2hfYWRkcjsKIAkJdW5zaWduZWQgbG9uZyBucmVscyA9IHNlY2hkcnNbaV0uc2hfc2l6ZSAvIHNpemVvZigqcmVscyk7CisJCXVuc2lnbmVkIGludCBjb3VudCwgczsKIAogCQlpZiAoc3RybmNtcChzZWNzdHJpbmdzICsgc2VjaGRyc1tpXS5zaF9uYW1lLAogCQkJICAgICIuUEFSSVNDLnVud2luZCIsIDE0KSA9PSAwKQpAQCAtMjkwLDExICszMjAsMjMgQEAKIAkJICovCiAJCWdvdHMgKz0gY291bnRfZ290cyhyZWxzLCBucmVscyk7CiAJCWZkZXNjcyArPSBjb3VudF9mZGVzY3MocmVscywgbnJlbHMpOwotCQlpZihzdHJuY21wKHNlY3N0cmluZ3MgKyBzZWNoZHJzW2ldLnNoX25hbWUsCi0JCQkgICAiLnJlbGEuaW5pdCIsIDEwKSA9PSAwKQotCQkJaW5pdF9zdHVicyArPSBjb3VudF9zdHVicyhyZWxzLCBucmVscyk7Ci0JCWVsc2UKLQkJCXN0dWJzICs9IGNvdW50X3N0dWJzKHJlbHMsIG5yZWxzKTsKKworCQkvKiBYWFg6IEJ5IHNvcnRpbmcgdGhlIHJlbG9jcyBhbmQgZmluZGluZyBkdXBsaWNhdGUgZW50cmllcworCQkgKiAgd2UgY291bGQgcmVkdWNlIHRoZSBudW1iZXIgb2YgbmVjZXNzYXJ5IHN0dWJzIGFuZCBzYXZlCisJCSAqICBzb21lIG1lbW9yeS4gKi8KKwkJY291bnQgPSBjb3VudF9zdHVicyhyZWxzLCBucmVscyk7CisJCWlmICghY291bnQpCisJCQljb250aW51ZTsKKworCQkvKiBzbyB3ZSBuZWVkIHJlbG9jYXRpb24gc3R1YnMuIHJlc2VydmUgbmVjZXNzYXJ5IG1lbW9yeS4gKi8KKwkJLyogc2hfaW5mbyBnaXZlcyB0aGUgc2VjdGlvbiBmb3Igd2hpY2ggd2UgbmVlZCB0byBhZGQgc3R1YnMuICovCisJCXMgPSBzZWNoZHJzW2ldLnNoX2luZm87CisKKwkJLyogZWFjaCBjb2RlIHNlY3Rpb24gc2hvdWxkIG9ubHkgaGF2ZSBvbmUgcmVsb2NhdGlvbiBzZWN0aW9uICovCisJCVdBUk5fT04obWUtPmFyY2guc2VjdGlvbltzXS5zdHViX2VudHJpZXMpOworCisJCS8qIHN0b3JlIG51bWJlciBvZiBzdHVicyB3ZSBuZWVkIGZvciB0aGlzIHNlY3Rpb24gKi8KKwkJbWUtPmFyY2guc2VjdGlvbltzXS5zdHViX2VudHJpZXMgKz0gY291bnQ7CiAJfQogCiAJLyogYWxpZ24gdGhpbmdzIGEgYml0ICovCkBAIC0zMDYsMTggKzM0OCw4IEBACiAJbWUtPmFyY2guZmRlc2Nfb2Zmc2V0ID0gbWUtPmNvcmVfc2l6ZTsKIAltZS0+Y29yZV9zaXplICs9IGZkZXNjcyAqIHNpemVvZihFbGZfRmRlc2MpOwogCi0JbWUtPmNvcmVfc2l6ZSA9IEFMSUdOKG1lLT5jb3JlX3NpemUsIDE2KTsKLQltZS0+YXJjaC5zdHViX29mZnNldCA9IG1lLT5jb3JlX3NpemU7Ci0JbWUtPmNvcmVfc2l6ZSArPSBzdHVicyAqIHNpemVvZihzdHJ1Y3Qgc3R1Yl9lbnRyeSk7Ci0KLQltZS0+aW5pdF9zaXplID0gQUxJR04obWUtPmluaXRfc2l6ZSwgMTYpOwotCW1lLT5hcmNoLmluaXRfc3R1Yl9vZmZzZXQgPSBtZS0+aW5pdF9zaXplOwotCW1lLT5pbml0X3NpemUgKz0gaW5pdF9zdHVicyAqIHNpemVvZihzdHJ1Y3Qgc3R1Yl9lbnRyeSk7Ci0KIAltZS0+YXJjaC5nb3RfbWF4ID0gZ290czsKIAltZS0+YXJjaC5mZGVzY19tYXggPSBmZGVzY3M7Ci0JbWUtPmFyY2guc3R1Yl9tYXggPSBzdHViczsKLQltZS0+YXJjaC5pbml0X3N0dWJfbWF4ID0gaW5pdF9zdHViczsKIAogCXJldHVybiAwOwogfQpAQCAtMzgwLDIzICs0MTIsMjcgQEAKIH07CiAKIHN0YXRpYyBFbGZfQWRkciBnZXRfc3R1YihzdHJ1Y3QgbW9kdWxlICptZSwgdW5zaWduZWQgbG9uZyB2YWx1ZSwgbG9uZyBhZGRlbmQsCi0JZW51bSBlbGZfc3R1Yl90eXBlIHN0dWJfdHlwZSwgaW50IGluaXRfc2VjdGlvbikKKwllbnVtIGVsZl9zdHViX3R5cGUgc3R1Yl90eXBlLCBFbGZfQWRkciBsb2MwLCB1bnNpZ25lZCBpbnQgdGFyZ2V0c2VjKQogewotCXVuc2lnbmVkIGxvbmcgaTsKIAlzdHJ1Y3Qgc3R1Yl9lbnRyeSAqc3R1YjsKIAotCWlmKGluaXRfc2VjdGlvbikgewotCQlpID0gbWUtPmFyY2guaW5pdF9zdHViX2NvdW50Kys7Ci0JCUJVR19PTihtZS0+YXJjaC5pbml0X3N0dWJfY291bnQgPiBtZS0+YXJjaC5pbml0X3N0dWJfbWF4KTsKLQkJc3R1YiA9IG1lLT5tb2R1bGVfaW5pdCArIG1lLT5hcmNoLmluaXRfc3R1Yl9vZmZzZXQgKyAKLQkJCWkgKiBzaXplb2Yoc3RydWN0IHN0dWJfZW50cnkpOwotCX0gZWxzZSB7Ci0JCWkgPSBtZS0+YXJjaC5zdHViX2NvdW50Kys7Ci0JCUJVR19PTihtZS0+YXJjaC5zdHViX2NvdW50ID4gbWUtPmFyY2guc3R1Yl9tYXgpOwotCQlzdHViID0gbWUtPm1vZHVsZV9jb3JlICsgbWUtPmFyY2guc3R1Yl9vZmZzZXQgKyAKLQkJCWkgKiBzaXplb2Yoc3RydWN0IHN0dWJfZW50cnkpOworCS8qIGluaXRpYWxpemUgc3R1Yl9vZmZzZXQgdG8gcG9pbnQgaW4gZnJvbnQgb2YgdGhlIHNlY3Rpb24gKi8KKwlpZiAoIW1lLT5hcmNoLnNlY3Rpb25bdGFyZ2V0c2VjXS5zdHViX29mZnNldCkgeworCQlsb2MwIC09IChtZS0+YXJjaC5zZWN0aW9uW3RhcmdldHNlY10uc3R1Yl9lbnRyaWVzICsgMSkgKgorCQkJCXNpemVvZihzdHJ1Y3Qgc3R1Yl9lbnRyeSk7CisJCS8qIGdldCBjb3JyZWN0IGFsaWdubWVudCBmb3IgdGhlIHN0dWJzICovCisJCWxvYzAgPSBBTElHTihsb2MwLCBzaXplb2Yoc3RydWN0IHN0dWJfZW50cnkpKTsKKwkJbWUtPmFyY2guc2VjdGlvblt0YXJnZXRzZWNdLnN0dWJfb2Zmc2V0ID0gbG9jMDsKIAl9CiAKKwkvKiBnZXQgYWRkcmVzcyBvZiBzdHViIGVudHJ5ICovCisJc3R1YiA9ICh2b2lkICopIG1lLT5hcmNoLnNlY3Rpb25bdGFyZ2V0c2VjXS5zdHViX29mZnNldDsKKwltZS0+YXJjaC5zZWN0aW9uW3RhcmdldHNlY10uc3R1Yl9vZmZzZXQgKz0gc2l6ZW9mKHN0cnVjdCBzdHViX2VudHJ5KTsKKworCS8qIGRvIG5vdCB3cml0ZSBvdXRzaWRlIGF2YWlsYWJsZSBzdHViIGFyZWEgKi8KKwlCVUdfT04oMCA9PSBtZS0+YXJjaC5zZWN0aW9uW3RhcmdldHNlY10uc3R1Yl9lbnRyaWVzLS0pOworCisKICNpZm5kZWYgQ09ORklHXzY0QklUCiAvKiBmb3IgMzItYml0IHRoZSBzdHViIGxvb2tzIGxpa2UgdGhpczoKICAqIAlsZGlsIEwnWFhYLCVyMQpAQCAtNDg5LDE1ICs1MjUsMTkgQEAKIAlFbGYzMl9BZGRyIHZhbDsKIAlFbGYzMl9Td29yZCBhZGRlbmQ7CiAJRWxmMzJfQWRkciBkb3Q7CisJRWxmX0FkZHIgbG9jMDsKKwl1bnNpZ25lZCBpbnQgdGFyZ2V0c2VjID0gc2VjaGRyc1tyZWxzZWNdLnNoX2luZm87CiAJLy91bnNpZ25lZCBsb25nIGRwID0gKHVuc2lnbmVkIGxvbmcpJGdsb2JhbCQ7CiAJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBkcCBhc20gKCJyMjciKTsKIAogCURFQlVHUCgiQXBwbHlpbmcgcmVsb2NhdGUgc2VjdGlvbiAldSB0byAldVxuIiwgcmVsc2VjLAotCSAgICAgICBzZWNoZHJzW3JlbHNlY10uc2hfaW5mbyk7CisJICAgICAgIHRhcmdldHNlYyk7CiAJZm9yIChpID0gMDsgaSA8IHNlY2hkcnNbcmVsc2VjXS5zaF9zaXplIC8gc2l6ZW9mKCpyZWwpOyBpKyspIHsKIAkJLyogVGhpcyBpcyB3aGVyZSB0byBtYWtlIHRoZSBjaGFuZ2UgKi8KLQkJbG9jID0gKHZvaWQgKilzZWNoZHJzW3NlY2hkcnNbcmVsc2VjXS5zaF9pbmZvXS5zaF9hZGRyCisJCWxvYyA9ICh2b2lkICopc2VjaGRyc1t0YXJnZXRzZWNdLnNoX2FkZHIKIAkJICAgICAgKyByZWxbaV0ucl9vZmZzZXQ7CisJCS8qIFRoaXMgaXMgdGhlIHN0YXJ0IG9mIHRoZSB0YXJnZXQgc2VjdGlvbiAqLworCQlsb2MwID0gc2VjaGRyc1t0YXJnZXRzZWNdLnNoX2FkZHI7CiAJCS8qIFRoaXMgaXMgdGhlIHN5bWJvbCBpdCBpcyByZWZlcnJpbmcgdG8gKi8KIAkJc3ltID0gKEVsZjMyX1N5bSAqKXNlY2hkcnNbc3ltaW5kZXhdLnNoX2FkZHIKIAkJCSsgRUxGMzJfUl9TWU0ocmVsW2ldLnJfaW5mbyk7CkBAIC01NjksMTkgKzYwOSwzMiBAQAogCQkJYnJlYWs7CiAJCWNhc2UgUl9QQVJJU0NfUENSRUwxN0Y6CiAJCQkvKiAxNy1iaXQgUEMgcmVsYXRpdmUgYWRkcmVzcyAqLwotCQkJdmFsID0gZ2V0X3N0dWIobWUsIHZhbCwgYWRkZW5kLCBFTEZfU1RVQl9HT1QsIGluX2luaXQobWUsIGxvYykpOworCQkJLyogY2FsY3VsYXRlIGRpcmVjdCBjYWxsIG9mZnNldCAqLworCQkJdmFsICs9IGFkZGVuZDsKIAkJCXZhbCA9ICh2YWwgLSBkb3QgLSA4KS80OwotCQkJQ0hFQ0tfUkVMT0ModmFsLCAxNykKKwkJCWlmICghUkVMT0NfUkVBQ0hBQkxFKHZhbCwgMTcpKSB7CisJCQkJLyogZGlyZWN0IGRpc3RhbmNlIHRvbyBmYXIsIGNyZWF0ZQorCQkJCSAqIHN0dWIgZW50cnkgaW5zdGVhZCAqLworCQkJCXZhbCA9IGdldF9zdHViKG1lLCBzeW0tPnN0X3ZhbHVlLCBhZGRlbmQsCisJCQkJCUVMRl9TVFVCX0RJUkVDVCwgbG9jMCwgdGFyZ2V0c2VjKTsKKwkJCQl2YWwgPSAodmFsIC0gZG90IC0gOCkvNDsKKwkJCQlDSEVDS19SRUxPQyh2YWwsIDE3KTsKKwkJCX0KIAkJCSpsb2MgPSAoKmxvYyAmIH4weDFmMWZmZCkgfCByZWFzc2VtYmxlXzE3KHZhbCk7CiAJCQlicmVhazsKIAkJY2FzZSBSX1BBUklTQ19QQ1JFTDIyRjoKIAkJCS8qIDIyLWJpdCBQQyByZWxhdGl2ZSBhZGRyZXNzOyBvbmx5IGRlZmluZWQgZm9yIHBhMjAgKi8KLQkJCXZhbCA9IGdldF9zdHViKG1lLCB2YWwsIGFkZGVuZCwgRUxGX1NUVUJfR09ULCBpbl9pbml0KG1lLCBsb2MpKTsKLQkJCURFQlVHUCgiU1RVQiBGT1IgJXMgbG9jICVseCslbHggYXQgJWx4XG4iLCAKLQkJCSAgICAgICBzdHJ0YWIgKyBzeW0tPnN0X25hbWUsICh1bnNpZ25lZCBsb25nKWxvYywgYWRkZW5kLCAKLQkJCSAgICAgICB2YWwpCisJCQkvKiBjYWxjdWxhdGUgZGlyZWN0IGNhbGwgb2Zmc2V0ICovCisJCQl2YWwgKz0gYWRkZW5kOwogCQkJdmFsID0gKHZhbCAtIGRvdCAtIDgpLzQ7Ci0JCQlDSEVDS19SRUxPQyh2YWwsIDIyKTsKKwkJCWlmICghUkVMT0NfUkVBQ0hBQkxFKHZhbCwgMjIpKSB7CisJCQkJLyogZGlyZWN0IGRpc3RhbmNlIHRvbyBmYXIsIGNyZWF0ZQorCQkJCSAqIHN0dWIgZW50cnkgaW5zdGVhZCAqLworCQkJCXZhbCA9IGdldF9zdHViKG1lLCBzeW0tPnN0X3ZhbHVlLCBhZGRlbmQsCisJCQkJCUVMRl9TVFVCX0RJUkVDVCwgbG9jMCwgdGFyZ2V0c2VjKTsKKwkJCQl2YWwgPSAodmFsIC0gZG90IC0gOCkvNDsKKwkJCQlDSEVDS19SRUxPQyh2YWwsIDIyKTsKKwkJCX0KIAkJCSpsb2MgPSAoKmxvYyAmIH4weDNmZjFmZmQpIHwgcmVhc3NlbWJsZV8yMih2YWwpOwogCQkJYnJlYWs7CiAKQEAgLTYxMCwxMyArNjYzLDE3IEBACiAJRWxmNjRfQWRkciB2YWw7CiAJRWxmNjRfU3h3b3JkIGFkZGVuZDsKIAlFbGY2NF9BZGRyIGRvdDsKKwlFbGZfQWRkciBsb2MwOworCXVuc2lnbmVkIGludCB0YXJnZXRzZWMgPSBzZWNoZHJzW3JlbHNlY10uc2hfaW5mbzsKIAogCURFQlVHUCgiQXBwbHlpbmcgcmVsb2NhdGUgc2VjdGlvbiAldSB0byAldVxuIiwgcmVsc2VjLAotCSAgICAgICBzZWNoZHJzW3JlbHNlY10uc2hfaW5mbyk7CisJICAgICAgIHRhcmdldHNlYyk7CiAJZm9yIChpID0gMDsgaSA8IHNlY2hkcnNbcmVsc2VjXS5zaF9zaXplIC8gc2l6ZW9mKCpyZWwpOyBpKyspIHsKIAkJLyogVGhpcyBpcyB3aGVyZSB0byBtYWtlIHRoZSBjaGFuZ2UgKi8KLQkJbG9jID0gKHZvaWQgKilzZWNoZHJzW3NlY2hkcnNbcmVsc2VjXS5zaF9pbmZvXS5zaF9hZGRyCisJCWxvYyA9ICh2b2lkICopc2VjaGRyc1t0YXJnZXRzZWNdLnNoX2FkZHIKIAkJICAgICAgKyByZWxbaV0ucl9vZmZzZXQ7CisJCS8qIFRoaXMgaXMgdGhlIHN0YXJ0IG9mIHRoZSB0YXJnZXQgc2VjdGlvbiAqLworCQlsb2MwID0gc2VjaGRyc1t0YXJnZXRzZWNdLnNoX2FkZHI7CiAJCS8qIFRoaXMgaXMgdGhlIHN5bWJvbCBpdCBpcyByZWZlcnJpbmcgdG8gKi8KIAkJc3ltID0gKEVsZjY0X1N5bSAqKXNlY2hkcnNbc3ltaW5kZXhdLnNoX2FkZHIKIAkJCSsgRUxGNjRfUl9TWU0ocmVsW2ldLnJfaW5mbyk7CkBAIC02NzIsNDIgKzcyOSw0MCBAQAogCQkJREVCVUdQKCJQQ1JFTDIyRiBTeW1ib2wgJXMgbG9jICVwIHZhbCAlbHhcbiIsCiAJCQkgICAgICAgc3RydGFiICsgc3ltLT5zdF9uYW1lLAogCQkJICAgICAgIGxvYywgdmFsKTsKKwkJCXZhbCArPSBhZGRlbmQ7CiAJCQkvKiBjYW4gd2UgcmVhY2ggaXQgbG9jYWxseT8gKi8KLQkJCWlmKCFpbl9sb2NhbF9zZWN0aW9uKG1lLCAodm9pZCAqKXZhbCwgKHZvaWQgKilkb3QpKSB7Ci0KLQkJCQlpZiAoaW5fbG9jYWwobWUsICh2b2lkICopdmFsKSkKLQkJCQkJLyogdGhpcyBpcyB0aGUgY2FzZSB3aGVyZSB0aGUKLQkJCQkJICogc3ltYm9sIGlzIGxvY2FsIHRvIHRoZQotCQkJCQkgKiBtb2R1bGUsIGJ1dCBpbiBhIGRpZmZlcmVudAotCQkJCQkgKiBzZWN0aW9uLCBzbyBzdHViIHRoZSBqdW1wCi0JCQkJCSAqIGluIGNhc2UgaXQncyBtb3JlIHRoYW4gMjIKLQkJCQkJICogYml0cyBhd2F5ICovCi0JCQkJCXZhbCA9IGdldF9zdHViKG1lLCB2YWwsIGFkZGVuZCwgRUxGX1NUVUJfRElSRUNULAotCQkJCQkJICAgICAgIGluX2luaXQobWUsIGxvYykpOwotCQkJCWVsc2UgaWYgKHN0cm5jbXAoc3RydGFiICsgc3ltLT5zdF9uYW1lLCAiJCQiLCAyKQorCQkJaWYgKGluX2xvY2FsKG1lLCAodm9pZCAqKXZhbCkpIHsKKwkJCQkvKiB0aGlzIGlzIHRoZSBjYXNlIHdoZXJlIHRoZSBzeW1ib2wgaXMgbG9jYWwKKwkJCQkgKiB0byB0aGUgbW9kdWxlLCBidXQgaW4gYSBkaWZmZXJlbnQgc2VjdGlvbiwKKwkJCQkgKiBzbyBzdHViIHRoZSBqdW1wIGluIGNhc2UgaXQncyBtb3JlIHRoYW4gMjIKKwkJCQkgKiBiaXRzIGF3YXkgKi8KKwkJCQl2YWwgPSAodmFsIC0gZG90IC0gOCkvNDsKKwkJCQlpZiAoIVJFTE9DX1JFQUNIQUJMRSh2YWwsIDIyKSkgeworCQkJCQkvKiBkaXJlY3QgZGlzdGFuY2UgdG9vIGZhciwgY3JlYXRlCisJCQkJCSAqIHN0dWIgZW50cnkgaW5zdGVhZCAqLworCQkJCQl2YWwgPSBnZXRfc3R1YihtZSwgc3ltLT5zdF92YWx1ZSwKKwkJCQkJCWFkZGVuZCwgRUxGX1NUVUJfRElSRUNULAorCQkJCQkJbG9jMCwgdGFyZ2V0c2VjKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBPaywgd2UgY2FuIHJlYWNoIGl0IGRpcmVjdGx5LiAqLworCQkJCQl2YWwgPSBzeW0tPnN0X3ZhbHVlOworCQkJCQl2YWwgKz0gYWRkZW5kOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJdmFsID0gc3ltLT5zdF92YWx1ZTsKKwkJCQlpZiAoc3RybmNtcChzdHJ0YWIgKyBzeW0tPnN0X25hbWUsICIkJCIsIDIpCiAJCQkJICAgID09IDApCiAJCQkJCXZhbCA9IGdldF9zdHViKG1lLCB2YWwsIGFkZGVuZCwgRUxGX1NUVUJfTUlMTEksCi0JCQkJCQkgICAgICAgaW5faW5pdChtZSwgbG9jKSk7CisJCQkJCQkgICAgICAgbG9jMCwgdGFyZ2V0c2VjKTsKIAkJCQllbHNlCiAJCQkJCXZhbCA9IGdldF9zdHViKG1lLCB2YWwsIGFkZGVuZCwgRUxGX1NUVUJfR09ULAotCQkJCQkJICAgICAgIGluX2luaXQobWUsIGxvYykpOworCQkJCQkJICAgICAgIGxvYzAsIHRhcmdldHNlYyk7CiAJCQl9CiAJCQlERUJVR1AoIlNUVUIgRk9SICVzIGxvYyAlbHgsIHZhbCAlbHgrJWx4IGF0ICVseFxuIiwgCiAJCQkgICAgICAgc3RydGFiICsgc3ltLT5zdF9uYW1lLCBsb2MsIHN5bS0+c3RfdmFsdWUsCiAJCQkgICAgICAgYWRkZW5kLCB2YWwpOwotCQkJLyogRklYTUU6IGxvY2FsIHN5bWJvbHMgd29yayBhcyBsb25nIGFzIHRoZQotCQkJICogY29yZSBhbmQgaW5pdCBwaWVjZXMgYXJlbid0IHNlcGFyYXRlZCB0b28KLQkJCSAqIGZhci4gIElmIHRoaXMgaXMgZXZlciBicm9rZW4sIHlvdSB3aWxsIHRyaXAKLQkJCSAqIHRoZSBjaGVjayBiZWxvdy4gIFRoZSB3YXkgdG8gZml4IGl0IHdvdWxkCi0JCQkgKiBiZSB0byBnZW5lcmF0ZSBsb2NhbCBzdHVicyB0byBnbyBiZXR3ZWVuIGluaXQKLQkJCSAqIGFuZCBjb3JlICovCi0JCQlpZigoRWxmNjRfU3h3b3JkKSh2YWwgLSBkb3QgLSA4KSA+IDB4ODAwMDAwIC0xIHx8Ci0JCQkgICAoRWxmNjRfU3h3b3JkKSh2YWwgLSBkb3QgLSA4KSA8IC0weDgwMDAwMCkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiTW9kdWxlICVzLCBzeW1ib2wgJXMgaXMgb3V0IG9mIHJhbmdlIGZvciBQQ1JFTDIyRiByZWxvY2F0aW9uXG4iLAotCQkJCSAgICAgICBtZS0+bmFtZSwgc3RydGFiICsgc3ltLT5zdF9uYW1lKTsKLQkJCQlyZXR1cm4gLUVOT0VYRUM7Ci0JCQl9CiAJCQl2YWwgPSAodmFsIC0gZG90IC0gOCkvNDsKKwkJCUNIRUNLX1JFTE9DKHZhbCwgMjIpOwogCQkJKmxvYyA9ICgqbG9jICYgfjB4M2ZmMWZmZCkgfCByZWFzc2VtYmxlXzIyKHZhbCk7CiAJCQlicmVhazsKIAkJY2FzZSBSX1BBUklTQ19ESVI2NDoKQEAgLTc5NCwxMiArODQ5LDggQEAKIAlhZGRyID0gKHUzMiAqKWVudHJ5LT5hZGRyOwogCXByaW50aygiSU5TTlM6ICV4ICV4ICV4ICV4XG4iLAogCSAgICAgICBhZGRyWzBdLCBhZGRyWzFdLCBhZGRyWzJdLCBhZGRyWzNdKTsKLQlwcmludGsoInN0dWJzIHVzZWQgJWxkLCBzdHVicyBtYXggJWxkXG4iCi0JICAgICAgICJpbml0X3N0dWJzIHVzZWQgJWxkLCBpbml0IHN0dWJzIG1heCAlbGRcbiIKLQkgICAgICAgImdvdCBlbnRyaWVzIHVzZWQgJWxkLCBnb3RzIG1heCAlbGRcbiIKKwlwcmludGsoImdvdCBlbnRyaWVzIHVzZWQgJWxkLCBnb3RzIG1heCAlbGRcbiIKIAkgICAgICAgImZkZXNjcyB1c2VkICVsZCwgZmRlc2NzIG1heCAlbGRcbiIsCi0JICAgICAgIG1lLT5hcmNoLnN0dWJfY291bnQsIG1lLT5hcmNoLnN0dWJfbWF4LAotCSAgICAgICBtZS0+YXJjaC5pbml0X3N0dWJfY291bnQsIG1lLT5hcmNoLmluaXRfc3R1Yl9tYXgsCiAJICAgICAgIG1lLT5hcmNoLmdvdF9jb3VudCwgbWUtPmFyY2guZ290X21heCwKIAkgICAgICAgbWUtPmFyY2guZmRlc2NfY291bnQsIG1lLT5hcmNoLmZkZXNjX21heCk7CiAjZW5kaWYKQEAgLTgyOSw3ICs4ODAsMTAgQEAKIAkJCQltZS0+bmFtZSwgbWUtPmFyY2guZ290X2NvdW50LCBNQVhfR09UUyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQkKKworCWtmcmVlKG1lLT5hcmNoLnNlY3Rpb24pOworCW1lLT5hcmNoLnNlY3Rpb24gPSBOVUxMOworCiAJLyogbm8gc3ltYm9sIHRhYmxlICovCiAJaWYoc3ltaGRyID09IE5VTEwpCiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvS2NvbmZpZwppbmRleCA3OWYyNWNlLi44NGI4NjEzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvS2NvbmZpZwpAQCAtMTA4LDYgKzEwOCw4IEBACiBjb25maWcgUFBDCiAJYm9vbAogCWRlZmF1bHQgeQorCXNlbGVjdCBIQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JECisJc2VsZWN0IEhBVkVfRFlOQU1JQ19GVFJBQ0UKIAlzZWxlY3QgSEFWRV9GVU5DVElPTl9UUkFDRVIKIAlzZWxlY3QgQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUIKIAlzZWxlY3QgSEFWRV9JREUKQEAgLTMyNiw3ICszMjgsOCBAQAogCiBjb25maWcgQ1JBU0hfRFVNUAogCWJvb2wgIkJ1aWxkIGEga2R1bXAgY3Jhc2gga2VybmVsIgotCWRlcGVuZHMgb24gKFBQQzY0ICYmIFJFTE9DQVRBQkxFKSB8fCA2eHgKKwlkZXBlbmRzIG9uIFBQQzY0IHx8IDZ4eAorCXNlbGVjdCBSRUxPQ0FUQUJMRSBpZiBQUEM2NAogCWhlbHAKIAkgIEJ1aWxkIGEga2VybmVsIHN1aXRhYmxlIGZvciB1c2UgYXMgYSBrZHVtcCBjYXB0dXJlIGtlcm5lbC4KIAkgIFRoZSBzYW1lIGtlcm5lbCBiaW5hcnkgY2FuIGJlIHVzZWQgYXMgcHJvZHVjdGlvbiBrZXJuZWwgYW5kIGR1bXAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2Jvb3QvTWFrZWZpbGUKaW5kZXggZjMyODI5OS4uZTg0ZGYzMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvTWFrZWZpbGUKQEAgLTIwOCw3ICsyMDgsNyBAQAogIwogIyBUaGVzZXMgYXJlIGRlZmF1bHQgdGFyZ2V0cyB0byBidWlsZCBpbWFnZXMgd2hpY2ggZW1iZWQgZGV2aWNlIHRyZWUgYmxvYnMuCiAjIFRoZXkgYXJlIG9ubHkgcmVxdWlyZWQgb24gYm9hcmRzIHdoaWNoIGRvIG5vdCBoYXZlIEZEVCBzdXBwb3J0IGluIGZpcm13YXJlLgotIyBCb2FyZHMgd2l0aCBuZXdpc2ggdS1ib290IGZpcm1hcmUgY2FuIHVzZSB0aGUgdUltYWdlIHRhcmdldCBhYm92ZQorIyBCb2FyZHMgd2l0aCBuZXdpc2ggdS1ib290IGZpcm13YXJlIGNhbiB1c2UgdGhlIHVJbWFnZSB0YXJnZXQgYWJvdmUKICMKIAogIyBCb2FyZCBwb3J0cyBpbiBhcmNoL3Bvd2VycGMvcGxhdGZvcm0vNDB4L0tjb25maWcKQEAgLTM1Niw3ICszNTYsNyBAQAogCUBybSAtZiAkQDsgbG4gJDwgJEAKIAogaW5zdGFsbDogJChDT05GSUdVUkUpICQoYWRkcHJlZml4ICQob2JqKS8sICQoaW1hZ2UteSkpCi0Jc2ggLXggJChzcmN0cmVlKS8kKHNyYykvaW5zdGFsbC5zaCAiJChLRVJORUxSRUxFQVNFKSIgdm1saW51eCBTeXN0ZW0ubWFwICIkKElOU1RBTExfUEFUSCkiICQ8CisJc2ggLXggJChzcmN0cmVlKS8kKHNyYykvaW5zdGFsbC5zaCAiJChLRVJORUxSRUxFQVNFKSIgdm1saW51eCBTeXN0ZW0ubWFwICIkKElOU1RBTExfUEFUSCkiICReCiAKICMgYW55dGhpbmcgbm90IGluICQodGFyZ2V0cykKIGNsZWFuLWZpbGVzICs9ICQoaW1hZ2UtKSAkKGluaXRyZC0pIGN1SW1hZ2UuKiBkdGJJbWFnZS4qIHRyZWVJbWFnZS4qIFwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzZ4X21kcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM2eF9tZHMuZHRzCmluZGV4IDE0NTM0ZDAuLjZlMzRmMTcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzZ4X21kcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNnhfbWRzLmR0cwpAQCAtNjksOCArNjksMTggQEAKIAkJfTsKIAogCQliY3NyQDEsMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OwogIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNjBtZHMtYmNzciI7CiAJCQlyZWcgPSA8MSAwIDB4ODAwMD47CisJCQlyYW5nZXMgPSA8MCAxIDAgMHg4MDAwPjsKKworCQkJYmNzcjEzOiBncGlvLWNvbnRyb2xsZXJAZCB7CisJCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODM2MG1kcy1iY3NyLWdwaW8iOworCQkJCXJlZyA9IDwweGQgMT47CisJCQkJZ3Bpby1jb250cm9sbGVyOworCQkJfTsKIAkJfTsKIAl9OwogCkBAIC0xOTUsMTAgKzIwNSwyMSBAQAogCQl9OwogCiAJCXBhcl9pb0AxNDAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CiAJCQlyZWcgPSA8MHgxNDAwIDB4MTAwPjsKKwkJCXJhbmdlcyA9IDwwIDB4MTQwMCAweDEwMD47CiAJCQlkZXZpY2VfdHlwZSA9ICJwYXJfaW8iOwogCQkJbnVtLXBvcnRzID0gPDc+OwogCisJCQlxZV9waW9fYjogZ3Bpby1jb250cm9sbGVyQDE4IHsKKwkJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzYwLXFlLXBhcmlvLWJhbmsiLAorCQkJCQkgICAgICJmc2wsbXBjODMyMy1xZS1wYXJpby1iYW5rIjsKKwkJCQlyZWcgPSA8MHgxOCAweDE4PjsKKwkJCQlncGlvLWNvbnRyb2xsZXI7CisJCQl9OworCiAJCQlwaW8xOiB1Y2NfcGluQDAxIHsKIAkJCQlwaW8tbWFwID0gPAogCQkJLyogcG9ydCAgcGluICBkaXIgIG9wZW5fZHJhaW4gIGFzc2lnbm1lbnQgIGhhc19pcnEgKi8KQEAgLTI4Miw2ICszMDMsMTUgQEAKIAkJCX07CiAJCX07CiAKKwkJdGltZXJANDQwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNjAtcWUtZ3RtIiwKKwkJCQkgICAgICJmc2wscWUtZ3RtIiwgImZzbCxndG0iOworCQkJcmVnID0gPDB4NDQwIDB4NDA+OworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDEzMjAwMDAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDEyIDEzIDE0IDE1PjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JnFlaWM+OworCQl9OworCiAJCXNwaUA0YzAgewogCQkJY2VsbC1pbmRleCA9IDwwPjsKIAkJCWNvbXBhdGlibGUgPSAiZnNsLHNwaSI7CkBAIC0zMDEsMTEgKzMzMSwyMCBAQAogCQl9OwogCiAJCXVzYkA2YzAgewotCQkJY29tcGF0aWJsZSA9ICJxZV91ZGMiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODM2MC1xZS11c2IiLAorCQkJCSAgICAgImZzbCxtcGM4MzIzLXFlLXVzYiI7CiAJCQlyZWcgPSA8MHg2YzAgMHg0MCAweDhiMDAgMHgxMDA+OwogCQkJaW50ZXJydXB0cyA9IDwxMT47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZxZWljPjsKLQkJCW1vZGUgPSAic2xhdmUiOworCQkJZnNsLGZ1bGxzcGVlZC1jbG9jayA9ICJjbGsyMSI7CisJCQlmc2wsbG93c3BlZWQtY2xvY2sgPSAiYnJnOSI7CisJCQlncGlvcyA9IDwmcWVfcGlvX2IgIDIgMCAgIC8qIFVTQk9FICovCisJCQkJICZxZV9waW9fYiAgMyAwICAgLyogVVNCVFAgKi8KKwkJCQkgJnFlX3Bpb19iICA4IDAgICAvKiBVU0JUTiAqLworCQkJCSAmcWVfcGlvX2IgIDkgMCAgIC8qIFVTQlJQICovCisJCQkJICZxZV9waW9fYiAxMSAwICAgLyogVVNCUk4gKi8KKwkJCQkgJmJjc3IxMyAgICA1IDAgICAvKiBTUEVFRCAqLworCQkJCSAmYmNzcjEzICAgIDQgMT47IC8qIFBPV0VSICovCiAJCX07CiAKIAkJZW5ldDA6IHVjY0AyMDAwIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzZ4X3Jkay5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM2eF9yZGsuZHRzCmluZGV4IGRlY2FkZjMuLjM3Yjc4OTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzZ4X3Jkay5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNnhfcmRrLmR0cwpAQCAtMjE4LDggKzIxOCwyMyBAQAogCQkJCXJlZyA9IDwweDQ0MCAweDQwPjsKIAkJCQlpbnRlcnJ1cHRzID0gPDEyIDEzIDE0IDE1PjsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZxZWljPjsKLQkJCQkvKiBmaWxsZWQgYnkgdS1ib290ICovCi0JCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OworCQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwxNjY2NjY2NjY+OworCQkJfTsKKworCQkJdXNiQDZjMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODM2MC1xZS11c2IiLAorCQkJCQkgICAgICJmc2wsbXBjODMyMy1xZS11c2IiOworCQkJCXJlZyA9IDwweDZjMCAweDQwIDB4OGIwMCAweDEwMD47CisJCQkJaW50ZXJydXB0cyA9IDwxMT47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmcWVpYz47CisJCQkJZnNsLGZ1bGxzcGVlZC1jbG9jayA9ICJjbGsyMSI7CisJCQkJZ3Bpb3MgPSA8JnFlX3Bpb19iICAyIDAgLyogVVNCT0UgKi8KKwkJCQkJICZxZV9waW9fYiAgMyAwIC8qIFVTQlRQICovCisJCQkJCSAmcWVfcGlvX2IgIDggMCAvKiBVU0JUTiAqLworCQkJCQkgJnFlX3Bpb19iICA5IDAgLyogVVNCUlAgKi8KKwkJCQkJICZxZV9waW9fYiAxMSAwIC8qIFVTQlJOICovCisJCQkJCSAmcWVfcGlvX2UgMjAgMCAvKiBTUEVFRCAqLworCQkJCQkgJnFlX3Bpb19lIDIxIDEgLyogUE9XRVIgKi8+OwogCQkJfTsKIAogCQkJc3BpQDRjMCB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODY0MV9ocGNuLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjQxX2hwY24uZHRzCmluZGV4IDM1ZDVlMjQuLjQ0ODE1MzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjQxX2hwY24uZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjQxX2hwY24uZHRzCkBAIC0yNiw3ICsyNiwxMyBAQAogCQlzZXJpYWwxID0gJnNlcmlhbDE7CiAJCXBjaTAgPSAmcGNpMDsKIAkJcGNpMSA9ICZwY2kxOwotCQlyYXBpZGlvMCA9ICZyYXBpZGlvMDsKKy8qCisgKiBPbmx5IG9uZSBvZiBSYXBpZCBJTyBvciBQQ0kgY2FuIGJlIHByZXNlbnQgZHVlIHRvIEhXIGxpbWl0YXRpb25zIGFuZAorICogZHVlIHRvIHRoZSBmYWN0IHRoYXQgdGhlIDIgbm93IHNoYXJlIGFkZHJlc3Mgc3BhY2UgaW4gdGhlIG5ldyBtZW1vcnkKKyAqIG1hcC4gIFRoZSBtb3N0IGxpa2VseSBjYXNlIGlzIHRoYXQgd2UgaGF2ZSBQQ0ksIHNvIGNvbW1lbnQgb3V0IHRoZQorICogcmFwaWRpbyBub2RlLiAgTGVhdmUgaXQgaGVyZSBmb3IgcmVmZXJlbmNlLgorICovCisJCS8qIHJhcGlkaW8wID0gJnJhcGlkaW8wOyAqLwogCX07CiAKIAljcHVzIHsKQEAgLTYyLDE4ICs2OCwxNyBAQAogCQlyZWcgPSA8MHgwMDAwMDAwMCAweDQwMDAwMDAwPjsJLy8gMUcgYXQgMHgwCiAJfTsKIAotCWxvY2FsYnVzQGY4MDA1MDAwIHsKKwlsb2NhbGJ1c0BmZmUwNTAwMCB7CiAJCSNhZGRyZXNzLWNlbGxzID0gPDI+OwogCQkjc2l6ZS1jZWxscyA9IDwxPjsKIAkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODY0MS1sb2NhbGJ1cyIsICJzaW1wbGUtYnVzIjsKLQkJcmVnID0gPDB4ZjgwMDUwMDAgMHgxMDAwPjsKKwkJcmVnID0gPDB4ZmZlMDUwMDAgMHgxMDAwPjsKIAkJaW50ZXJydXB0cyA9IDwxOSAyPjsKIAkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAKLQkJcmFuZ2VzID0gPDAgMCAweGZmODAwMDAwIDB4MDA4MDAwMDAKLQkJCSAgMSAwIDB4ZmUwMDAwMDAgMHgwMTAwMDAwMAotCQkJICAyIDAgMHhmODIwMDAwMCAweDAwMTAwMDAwCi0JCQkgIDMgMCAweGY4MTAwMDAwIDB4MDAxMDAwMDA+OworCQlyYW5nZXMgPSA8MCAwIDB4ZWY4MDAwMDAgMHgwMDgwMDAwMAorCQkJICAyIDAgMHhmZmRmODAwMCAweDAwMDA4MDAwCisJCQkgIDMgMCAweGZmZGYwMDAwIDB4MDAwMDgwMDA+OwogCiAJCWZsYXNoQDAsMCB7CiAJCQljb21wYXRpYmxlID0gImNmaS1mbGFzaCI7CkBAIC0xMDMsMTMgKzEwOCwxMyBAQAogCQl9OwogCX07CiAKLQlzb2M4NjQxQGY4MDAwMDAwIHsKKwlzb2M4NjQxQGZmZTAwMDAwIHsKIAkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCSNzaXplLWNlbGxzID0gPDE+OwogCQlkZXZpY2VfdHlwZSA9ICJzb2MiOwogCQljb21wYXRpYmxlID0gInNpbXBsZS1idXMiOwotCQlyYW5nZXMgPSA8MHgwMDAwMDAwMCAweGY4MDAwMDAwIDB4MDAxMDAwMDA+OwotCQlyZWcgPSA8MHhmODAwMDAwMCAweDAwMDAxMDAwPjsJLy8gQ0NTUkJBUgorCQlyYW5nZXMgPSA8MHgwMDAwMDAwMCAweGZmZTAwMDAwIDB4MDAxMDAwMDA+OworCQlyZWcgPSA8MHhmZmUwMDAwMCAweDAwMDAxMDAwPjsJLy8gQ0NTUkJBUgogCQlidXMtZnJlcXVlbmN5ID0gPDA+OwogCiAJCWkyY0AzMDAwIHsKQEAgLTM0MCwxNyArMzQ1LDE3IEBACiAJCX07CiAJfTsKIAotCXBjaTA6IHBjaWVAZjgwMDgwMDAgeworCXBjaTA6IHBjaWVAZmZlMDgwMDAgewogCQljZWxsLWluZGV4ID0gPDA+OwogCQljb21wYXRpYmxlID0gImZzbCxtcGM4NjQxLXBjaWUiOwogCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwogCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwogCQkjc2l6ZS1jZWxscyA9IDwyPjsKIAkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCXJlZyA9IDwweGY4MDA4MDAwIDB4MTAwMD47CisJCXJlZyA9IDwweGZmZTA4MDAwIDB4MTAwMD47CiAJCWJ1cy1yYW5nZSA9IDwweDAgMHhmZj47CiAJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDB4MCAweDgwMDAwMDAwIDB4ODAwMDAwMDAgMHgwIDB4MjAwMDAwMDAKLQkJCSAgMHgwMTAwMDAwMCAweDAgMHgwMDAwMDAwMCAweGUyMDAwMDAwIDB4MCAweDAwMTAwMDAwPjsKKwkJCSAgMHgwMTAwMDAwMCAweDAgMHgwMDAwMDAwMCAweGZmYzAwMDAwIDB4MCAweDAwMDEwMDAwPjsKIAkJY2xvY2stZnJlcXVlbmN5ID0gPDMzMzMzMzMzPjsKIAkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCWludGVycnVwdHMgPSA8MjQgMj47CkBAIC00ODEsNyArNDg2LDcgQEAKIAogCQkJCSAgMHgwMTAwMDAwMCAweDAgMHgwMDAwMDAwMAogCQkJCSAgMHgwMTAwMDAwMCAweDAgMHgwMDAwMDAwMAotCQkJCSAgMHgwIDB4MDAxMDAwMDA+OworCQkJCSAgMHgwIDB4MDAwMTAwMDA+OwogCQkJdWxpMTU3NUAwIHsKIAkJCQlyZWcgPSA8MCAwIDAgMCAwPjsKIAkJCQkjc2l6ZS1jZWxscyA9IDwyPjsKQEAgLTQ5MSw3ICs0OTYsNyBAQAogCQkJCQkgIDB4MCAweDIwMDAwMDAwCiAJCQkJCSAgMHgwMTAwMDAwMCAweDAgMHgwMDAwMDAwMAogCQkJCQkgIDB4MDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAKLQkJCQkJICAweDAgMHgwMDEwMDAwMD47CisJCQkJCSAgMHgwIDB4MDAwMTAwMDA+OwogCQkJCWlzYUAxZSB7CiAJCQkJCWRldmljZV90eXBlID0gImlzYSI7CiAJCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CkBAIC01NDksMTcgKzU1NCwxNyBAQAogCiAJfTsKIAotCXBjaTE6IHBjaWVAZjgwMDkwMDAgeworCXBjaTE6IHBjaWVAZmZlMDkwMDAgewogCQljZWxsLWluZGV4ID0gPDE+OwogCQljb21wYXRpYmxlID0gImZzbCxtcGM4NjQxLXBjaWUiOwogCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwogCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwogCQkjc2l6ZS1jZWxscyA9IDwyPjsKIAkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCXJlZyA9IDwweGY4MDA5MDAwIDB4MTAwMD47CisJCXJlZyA9IDwweGZmZTA5MDAwIDB4MTAwMD47CiAJCWJ1cy1yYW5nZSA9IDwwIDB4ZmY+OwogCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAweDAgMHhhMDAwMDAwMCAweGEwMDAwMDAwIDB4MCAweDIwMDAwMDAwCi0JCQkgIDB4MDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAgMHhlMzAwMDAwMCAweDAgMHgwMDEwMDAwMD47CisJCQkgIDB4MDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAgMHhmZmMxMDAwMCAweDAgMHgwMDAxMDAwMD47CiAJCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47CiAJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQlpbnRlcnJ1cHRzID0gPDI1IDI+OwpAQCAtNTgyLDE4ICs1ODcsMjEgQEAKIAogCQkJCSAgMHgwMTAwMDAwMCAweDAgMHgwMDAwMDAwMAogCQkJCSAgMHgwMTAwMDAwMCAweDAgMHgwMDAwMDAwMAotCQkJCSAgMHgwIDB4MDAxMDAwMDA+OworCQkJCSAgMHgwIDB4MDAwMTAwMDA+OwogCQl9OwogCX07Ci0JcmFwaWRpbzA6IHJhcGlkaW9AZjgwYzAwMDAgeworLyoKKwlyYXBpZGlvMDogcmFwaWRpb0BmZmVjMDAwMCB7CiAJCSNhZGRyZXNzLWNlbGxzID0gPDI+OwogCQkjc2l6ZS1jZWxscyA9IDwyPjsKIAkJY29tcGF0aWJsZSA9ICJmc2wscmFwaWRpby1kZWx0YSI7Ci0JCXJlZyA9IDwweGY4MGMwMDAwIDB4MjAwMDA+OwotCQlyYW5nZXMgPSA8MCAwIDB4YzAwMDAwMDAgMCAweDIwMDAwMDAwPjsKKwkJcmVnID0gPDB4ZmZlYzAwMDAgMHgyMDAwMD47CisJCXJhbmdlcyA9IDwwIDAgMHg4MDAwMDAwMCAwIDB4MjAwMDAwMDA+OwogCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJLyogZXJyX2lycSBiZWxsX291dGJfaXJxIGJlbGxfaW5iX2lycQotCQkJbXNnMV90eF9pcnEgbXNnMV9yeF9pcnEJbXNnMl90eF9pcnEgbXNnMl9yeF9pcnEgKi8KKwkJLy8gZXJyX2lycSBiZWxsX291dGJfaXJxIGJlbGxfaW5iX2lycQorCQkvLwltc2cxX3R4X2lycSBtc2cxX3J4X2lycQltc2cyX3R4X2lycSBtc2cyX3J4X2lycQogCQlpbnRlcnJ1cHRzID0gPDQ4IDIgNDkgMiA1MCAyIDUzIDIgNTQgMiA1NSAyIDU2IDI+OwogCX07CisqLworCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3NlcXVvaWEuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3NlcXVvaWEuZHRzCmluZGV4IDNiMjk1ZTguLjQzY2M2OGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9zZXF1b2lhLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvc2VxdW9pYS5kdHMKQEAgLTEzNCw3ICsxMzQsNyBAQAogCQl9OwogCiAJCVVTQjE6IHVzYkBlMDAwMDQwMCB7Ci0JCQljb21wYXRpYmxlID0gIm9oY2ktYmUiOworCQkJY29tcGF0aWJsZSA9ICJpYm0sdXNiLW9oY2ktNDQwZXB4IiwgIm9oY2ktYmUiOwogCQkJcmVnID0gPDB4MDAwMDAwMDAgMHhlMDAwMDQwMCAweDAwMDAwMDYwPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8JlVJQzA+OwogCQkJaW50ZXJydXB0cyA9IDwweDE1IDB4OD47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9pbnN0YWxsLnNoIGIvYXJjaC9wb3dlcnBjL2Jvb3QvaW5zdGFsbC5zaAppbmRleCBiMDAyYmZkLi41MWIyMzg3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9pbnN0YWxsLnNoCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2luc3RhbGwuc2gKQEAgLTE1LDcgKzE1LDcgQEAKICMgICAkMiAtIGtlcm5lbCBpbWFnZSBmaWxlCiAjICAgJDMgLSBrZXJuZWwgbWFwIGZpbGUKICMgICAkNCAtIGRlZmF1bHQgaW5zdGFsbCBwYXRoIChibGFuayBpZiByb290IGRpcmVjdG9yeSkKLSMgICAkNSAtIGtlcm5lbCBib290IGZpbGUsIHRoZSB6SW1hZ2UKKyMgICAkNSBhbmQgbW9yZSAtIGtlcm5lbCBib290IGZpbGVzOyB6SW1hZ2UqLCB1SW1hZ2UsIGN1SW1hZ2UuKiwgZXRjLgogIwogCiAjIFVzZXIgbWF5IGhhdmUgYSBjdXN0b20gaW5zdGFsbCBzY3JpcHQKQEAgLTM4LDMgKzM4LDE1IEBACiAKIGNhdCAkMiA+ICQ0LyRpbWFnZV9uYW1lCiBjcCAkMyAkNC9TeXN0ZW0ubWFwCisKKyMgQ29weSBhbGwgdGhlIGJvb3RhYmxlIGltYWdlIGZpbGVzCitwYXRoPSQ0CitzaGlmdCA0Cit3aGlsZSBbICQjIC1uZSAwIF07IGRvCisJaW1hZ2VfbmFtZT1gYmFzZW5hbWUgJDFgCisJaWYgWyAtZiAkcGF0aC8kaW1hZ2VfbmFtZSBdOyB0aGVuCisJCW12ICRwYXRoLyRpbWFnZV9uYW1lICRwYXRoLyRpbWFnZV9uYW1lLm9sZAorCWZpCisJY2F0ICQxID4gJHBhdGgvJGltYWdlX25hbWUKKwlzaGlmdAorZG9uZTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzg1eHgvbXBjODU3Ml9kc19kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84NXh4L21wYzg1NzJfZHNfZGVmY29uZmlnCmluZGV4IDYzNTU4ODMuLjMyYWViNzkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzg1eHgvbXBjODU3Ml9kc19kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODV4eC9tcGM4NTcyX2RzX2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yOC1yYzMKLSMgU2F0IE5vdiAgOCAxMjo0MDoxMyAyMDA4CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjgtcmM4CisjIFR1ZSBEZWMgMzAgMTE6MTc6NDYgMjAwOAogIwogIyBDT05GSUdfUFBDNjQgaXMgbm90IHNldAogCkBAIC0yMSw3ICsyMSwxMCBAQAogQ09ORklHX0ZTTF9FTUJfUEVSRk1PTj15CiAjIENPTkZJR19QSFlTXzY0QklUIGlzIG5vdCBzZXQKIENPTkZJR19TUEU9eQorQ09ORklHX1BQQ19NTVVfTk9IQVNIPXkKICMgQ09ORklHX1BQQ19NTV9TTElDRVMgaXMgbm90IHNldAorQ09ORklHX1NNUD15CitDT05GSUdfTlJfQ1BVUz0yCiBDT05GSUdfUFBDMzI9eQogQ09ORklHX1dPUkRfU0laRT0zMgogIyBDT05GSUdfQVJDSF9QSFlTX0FERFJfVF82NEJJVCBpcyBub3Qgc2V0CkBAIC01MCw3ICs1Myw3IEBACiBDT05GSUdfUFBDX09GPXkKIENPTkZJR19PRj15CiBDT05GSUdfUFBDX1VEQkdfMTY1NTA9eQotIyBDT05GSUdfR0VORVJJQ19UQlNZTkMgaXMgbm90IHNldAorQ09ORklHX0dFTkVSSUNfVEJTWU5DPXkKIENPTkZJR19BVURJVF9BUkNIPXkKIENPTkZJR19HRU5FUklDX0JVRz15CiBDT05GSUdfREVGQVVMVF9VSU1BR0U9eQpAQCAtNjIsNyArNjUsNyBAQAogIyBHZW5lcmFsIHNldHVwCiAjCiBDT05GSUdfRVhQRVJJTUVOVEFMPXkKLUNPTkZJR19CUk9LRU5fT05fU01QPXkKK0NPTkZJR19MT0NLX0tFUk5FTD15CiBDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCiBDT05GSUdfTE9DQUxWRVJTSU9OPSIiCiBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQpAQCAtMTI2LDYgKzEyOSw3IEBACiBDT05GSUdfSEFWRV9LUFJPQkVTPXkKIENPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQogQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQorQ09ORklHX1VTRV9HRU5FUklDX1NNUF9IRUxQRVJTPXkKICMgQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQgaXMgbm90IHNldAogQ09ORklHX1NMQUJJTkZPPXkKIENPTkZJR19SVF9NVVRFWEVTPXkKQEAgLTEzOCw2ICsxNDIsNyBAQAogQ09ORklHX01PRFZFUlNJT05TPXkKICMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfS01PRD15CitDT05GSUdfU1RPUF9NQUNISU5FPXkKIENPTkZJR19CTE9DSz15CiBDT05GSUdfTEJEPXkKICMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldApAQCAtMTk3LDYgKzIwMiw3IEBACiAjIENPTkZJR19DUE0yIGlzIG5vdCBzZXQKIENPTkZJR19GU0xfVUxJMTU3NT15CiAjIENPTkZJR19NUEM4eHh4X0dQSU8gaXMgbm90IHNldAorIyBDT05GSUdfU0lNUExFX0dQSU8gaXMgbm90IHNldAogCiAjCiAjIEtlcm5lbCBvcHRpb25zCkBAIC0yMjQsNiArMjMwLDcgQEAKIENPTkZJR19BUkNIX0VOQUJMRV9NRU1PUllfSE9UUExVRz15CiBDT05GSUdfQVJDSF9IQVNfV0FMS19NRU1PUlk9eQogQ09ORklHX0FSQ0hfRU5BQkxFX01FTU9SWV9IT1RSRU1PVkU9eQorIyBDT05GSUdfSVJRX0FMTF9DUFVTIGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX0ZMQVRNRU1fRU5BQkxFPXkKIENPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUD15CiBDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CkBAIC0yNDEsNiArMjQ4LDkgQEAKIENPTkZJR19CT1VOQ0U9eQogQ09ORklHX1ZJUlRfVE9fQlVTPXkKIENPTkZJR19VTkVWSUNUQUJMRV9MUlU9eQorQ09ORklHX1BQQ180S19QQUdFUz15CisjIENPTkZJR19QUENfMTZLX1BBR0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ182NEtfUEFHRVMgaXMgbm90IHNldAogQ09ORklHX0ZPUkNFX01BWF9aT05FT1JERVI9MTEKIENPTkZJR19QUk9DX0RFVklDRVRSRUU9eQogIyBDT05GSUdfQ01ETElORV9CT09MIGlzIG5vdCBzZXQKQEAgLTQ0Myw4ICs0NTMsMTAgQEAKICMgQ09ORklHX0VFUFJPTV85M0NYNiBpcyBub3Qgc2V0CiAjIENPTkZJR19TR0lfSU9DNCBpcyBub3Qgc2V0CiAjIENPTkZJR19USUZNX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSUNTOTMyUzQwMSBpcyBub3Qgc2V0CiAjIENPTkZJR19FTkNMT1NVUkVfU0VSVklDRVMgaXMgbm90IHNldAogIyBDT05GSUdfSFBfSUxPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0MyUE9SVCBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9JREU9eQogIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKIApAQCAtNzg0LDYgKzc5Niw3IEBACiBDT05GSUdfVU5JWDk4X1BUWVM9eQogQ09ORklHX0xFR0FDWV9QVFlTPXkKIENPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgorIyBDT05GSUdfSFZDX1VEQkcgaXMgbm90IHNldAogIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKIENPTkZJR19IV19SQU5ET009eQogQ09ORklHX05WUkFNPXkKQEAgLTg2OSwxMSArODgyLDExIEBACiAjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKICMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAogIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorQ09ORklHX1NTQl9QT1NTSUJMRT15CiAKICMKICMgU29uaWNzIFNpbGljb24gQmFja3BsYW5lCiAjCi1DT05GSUdfU1NCX1BPU1NJQkxFPXkKICMgQ09ORklHX1NTQiBpcyBub3Qgc2V0CiAKICMKQEAgLTg4NiwxNCArODk5LDcgQEAKICMgQ09ORklHX1BNSUNfREE5MDNYIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9XTTg0MDAgaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1dNODM1MF9JMkMgaXMgbm90IHNldAotCi0jCi0jIFZvbHRhZ2UgYW5kIEN1cnJlbnQgcmVndWxhdG9ycwotIwogIyBDT05GSUdfUkVHVUxBVE9SIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JFR1VMQVRPUl9GSVhFRF9WT0xUQUdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JFR1VMQVRPUl9WSVJUVUFMX0NPTlNVTUVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JFR1VMQVRPUl9CUTI0MDIyIGlzIG5vdCBzZXQKIAogIwogIyBNdWx0aW1lZGlhIGRldmljZXMKQEAgLTEyNTIsMTEgKzEyNTgsMTEgQEAKICMgQ09ORklHX1VTQl9UTUMgaXMgbm90IHNldAogCiAjCi0jIE5PVEU6IFVTQl9TVE9SQUdFIGVuYWJsZXMgU0NTSSwgYW5kICdTQ1NJIGRpc2sgc3VwcG9ydCcKKyMgTk9URTogVVNCX1NUT1JBR0UgZGVwZW5kcyBvbiBTQ1NJIGJ1dCBCTEtfREVWX1NEIG1heSBhbHNvIGJlIG5lZWRlZDsKICMKIAogIwotIyBtYXkgYWxzbyBiZSBuZWVkZWQ7IHNlZSBVU0JfU1RPUkFHRSBIZWxwIGZvciBtb3JlIGluZm9ybWF0aW9uCisjIHNlZSBVU0JfU1RPUkFHRSBIZWxwIGZvciBtb3JlIGluZm9ybWF0aW9uCiAjCiBDT05GSUdfVVNCX1NUT1JBR0U9eQogIyBDT05GSUdfVVNCX1NUT1JBR0VfREVCVUcgaXMgbm90IHNldApAQCAtMTM0OCw2ICsxMzU0LDcgQEAKICMgQ09ORklHX1JUQ19EUlZfTTQxVDgwIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfUzM1MzkwQSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX0ZNMzEzMCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JYODU4MSBpcyBub3Qgc2V0CiAKICMKICMgU1BJIFJUQyBkcml2ZXJzCkBAIC0xNjI0LDYgKzE2MzEsNyBAQAogIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9BUkNIX0tHREI9eQogIyBDT05GSUdfS0dEQiBpcyBub3Qgc2V0CitDT05GSUdfUFJJTlRfU1RBQ0tfREVQVEg9NjQKICMgQ09ORklHX0RFQlVHX1NUQUNLT1ZFUkZMT1cgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfUEFHRUFMTE9DIGlzIG5vdCBzZXQKQEAgLTE2NDksMTEgKzE2NTcsMTYgQEAKICMKICMgQ09ORklHX0NSWVBUT19GSVBTIGlzIG5vdCBzZXQKIENPTkZJR19DUllQVE9fQUxHQVBJPXkKK0NPTkZJR19DUllQVE9fQUxHQVBJMj15CiBDT05GSUdfQ1JZUFRPX0FFQUQ9eQorQ09ORklHX0NSWVBUT19BRUFEMj15CiBDT05GSUdfQ1JZUFRPX0JMS0NJUEhFUj15CitDT05GSUdfQ1JZUFRPX0JMS0NJUEhFUjI9eQogQ09ORklHX0NSWVBUT19IQVNIPXkKLUNPTkZJR19DUllQVE9fUk5HPXkKK0NPTkZJR19DUllQVE9fSEFTSDI9eQorQ09ORklHX0NSWVBUT19STkcyPXkKIENPTkZJR19DUllQVE9fTUFOQUdFUj15CitDT05GSUdfQ1JZUFRPX01BTkFHRVIyPXkKICMgQ09ORklHX0NSWVBUT19HRjEyOE1VTCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fQ1JZUFREIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IDVhYjdkN2YuLjkyNjg2MDIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMzUsMyArMzUsNCBAQAogdW5pZmRlZi15ICs9IHRlcm1pb3MuaAogdW5pZmRlZi15ICs9IHR5cGVzLmgKIHVuaWZkZWYteSArPSB1bmlzdGQuaAordW5pZmRlZi15ICs9IHN3YWIuaApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2F0b21pYy5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2F0b21pYy5oCmluZGV4IDQ5OWJlNWIuLmI0MDE5NTAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9hdG9taWMuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vYXRvbWljLmgKQEAgLTUsNyArNSw3IEBACiAgKiBQb3dlclBDIGF0b21pYyBvcGVyYXRpb25zCiAgKi8KIAotdHlwZWRlZiBzdHJ1Y3QgeyBpbnQgY291bnRlcjsgfSBhdG9taWNfdDsKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiAjaWZkZWYgX19LRVJORUxfXwogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CkBAIC0yNTEsOCArMjUxLDYgQEAKIAogI2lmZGVmIF9fcG93ZXJwYzY0X18KIAotdHlwZWRlZiBzdHJ1Y3QgeyBsb25nIGNvdW50ZXI7IH0gYXRvbWljNjRfdDsKLQogI2RlZmluZSBBVE9NSUM2NF9JTklUKGkpCXsgKGkpIH0KIAogc3RhdGljIF9faW5saW5lX18gbG9uZyBhdG9taWM2NF9yZWFkKGNvbnN0IGF0b21pYzY0X3QgKnYpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKaW5kZXggZDVkZTMyNS4uNWNjYTI3YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaApAQCAtOCw4NiArOCw3IEBACiAgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKLSNpbmNsdWRlIDxhc20vdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotCi0jZGVmaW5lIF9fQklHX0VORElBTgotCi0jaWZkZWYgX19HTlVDX18KLSNpZmRlZiBfX0tFUk5FTF9fCi0KLXN0YXRpYyBfX2lubGluZV9fIF9fdTE2IGxkX2xlMTYoY29uc3Qgdm9sYXRpbGUgX191MTYgKmFkZHIpCi17Ci0JX191MTYgdmFsOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJsaGJyeCAlMCwwLCUxIiA6ICI9ciIgKHZhbCkgOiAiciIgKGFkZHIpLCAibSIgKCphZGRyKSk7Ci0JcmV0dXJuIHZhbDsKLX0KLSNkZWZpbmUgX19hcmNoX3N3YWIxNnAgbGRfbGUxNgotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIHN0X2xlMTYodm9sYXRpbGUgX191MTYgKmFkZHIsIGNvbnN0IF9fdTE2IHZhbCkKLXsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN0aGJyeCAlMSwwLCUyIiA6ICI9bSIgKCphZGRyKSA6ICJyIiAodmFsKSwgInIiIChhZGRyKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2FyY2hfc3dhYjE2cyhfX3UxNiAqYWRkcikKLXsKLQlzdF9sZTE2KGFkZHIsICphZGRyKTsKLX0KLSNkZWZpbmUgX19hcmNoX3N3YWIxNnMgX19hcmNoX3N3YWIxNnMKLQotc3RhdGljIF9faW5saW5lX18gX191MzIgbGRfbGUzMihjb25zdCB2b2xhdGlsZSBfX3UzMiAqYWRkcikKLXsKLQlfX3UzMiB2YWw7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImx3YnJ4ICUwLDAsJTEiIDogIj1yIiAodmFsKSA6ICJyIiAoYWRkciksICJtIiAoKmFkZHIpKTsKLQlyZXR1cm4gdmFsOwotfQotI2RlZmluZSBfX2FyY2hfc3dhYjMycCBsZF9sZTMyCi0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgc3RfbGUzMih2b2xhdGlsZSBfX3UzMiAqYWRkciwgY29uc3QgX191MzIgdmFsKQotewotCV9fYXNtX18gX192b2xhdGlsZV9fICgic3R3YnJ4ICUxLDAsJTIiIDogIj1tIiAoKmFkZHIpIDogInIiICh2YWwpLCAiciIgKGFkZHIpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9fYXJjaF9zd2FiMzJzKF9fdTMyICphZGRyKQotewotCXN0X2xlMzIoYWRkciwgKmFkZHIpOwotfQotI2RlZmluZSBfX2FyY2hfc3dhYjMycyBfX2FyY2hfc3dhYjMycwotCi1zdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MTYgX19hcmNoX3N3YWIxNihfX3UxNiB2YWx1ZSkKLXsKLQlfX3UxNiByZXN1bHQ7Ci0KLQlfX2FzbV9fKCJybHdpbWkgJTAsJTEsOCwxNiwyMyIKLQkgICAgOiAiPXIiIChyZXN1bHQpCi0JICAgIDogInIiICh2YWx1ZSksICIwIiAodmFsdWUgPj4gOCkpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0jZGVmaW5lIF9fYXJjaF9zd2FiMTYgX19hcmNoX3N3YWIxNgotCi1zdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19hcmNoX3N3YWIzMihfX3UzMiB2YWx1ZSkKLXsKLQlfX3UzMiByZXN1bHQ7Ci0KLQlfX2FzbV9fKCJybHdpbWkgJTAsJTEsMjQsMTYsMjNcblx0IgotCSAgICAicmx3aW1pICUwLCUxLDgsOCwxNVxuXHQiCi0JICAgICJybHdpbWkgJTAsJTEsMjQsMCw3IgotCSAgICA6ICI9ciIgKHJlc3VsdCkKLQkgICAgOiAiciIgKHZhbHVlKSwgIjAiICh2YWx1ZSA+PiAyNCkpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0jZGVmaW5lIF9fYXJjaF9zd2FiMzIgX19hcmNoX3N3YWIzMgotCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwotCi0jaWZuZGVmIF9fcG93ZXJwYzY0X18KLSNkZWZpbmUgX19TV0FCXzY0X1RIUlVfMzJfXwotI2VuZGlmIC8qIF9fcG93ZXJwYzY0X18gKi8KLQotI2VuZGlmIC8qIF9fR05VQ19fICovCi0KLSNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vc3dhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9iaWdfZW5kaWFuLmg+CiAKICNlbmRpZiAvKiBfQVNNX1BPV0VSUENfQllURU9SREVSX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9odWdldGxiLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaHVnZXRsYi5oCmluZGV4IDI2ZjBkMGEuLmIxZGFmYjYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9odWdldGxiLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2h1Z2V0bGIuaApAQCAtMTgsNiArMTgsMTIgQEAKIAkJCSAgICAgIHB0ZV90ICpwdGVwKTsKIAogLyoKKyAqIFRoZSB2ZXJzaW9uIG9mIHZtYV9tbXVfcGFnZXNpemUoKSBpbiBhcmNoL3Bvd2VycGMvbW0vaHVnZXRsYnBhZ2UuYyBuZWVkcworICogdG8gb3ZlcnJpZGUgdGhlIHZlcnNpb24gaW4gbW0vaHVnZXRsYi5jCisgKi8KKyNkZWZpbmUgdm1hX21tdV9wYWdlc2l6ZSB2bWFfbW11X3BhZ2VzaXplCisKKy8qCiAgKiBJZiB0aGUgYXJjaCBkb2Vzbid0IHN1cHBseSBzb21ldGhpbmcgZWxzZSwgYXNzdW1lIHRoYXQgaHVnZXBhZ2UKICAqIHNpemUgYWxpZ25lZCByZWdpb25zIGFyZSBvayB3aXRob3V0IGZ1cnRoZXIgcHJlcGFyYXRpb24uCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9pb2N0bHMuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9pb2N0bHMuaAppbmRleCAyNzlhNjIyLi4xODQyMTg2ZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2lvY3Rscy5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9pb2N0bHMuaApAQCAtODksNiArODksOCBAQAogI2RlZmluZSBUSU9DU0JSSwkweDU0MjcgIC8qIEJTRCBjb21wYXRpYmlsaXR5ICovCiAjZGVmaW5lIFRJT0NDQlJLCTB4NTQyOCAgLyogQlNEIGNvbXBhdGliaWxpdHkgKi8KICNkZWZpbmUgVElPQ0dTSUQJMHg1NDI5ICAvKiBSZXR1cm4gdGhlIHNlc3Npb24gSUQgb2YgRkQgKi8KKyNkZWZpbmUgVElPQ0dSUzQ4NQkweDU0MmUKKyNkZWZpbmUgVElPQ1NSUzQ4NQkweDU0MmYKICNkZWZpbmUgVElPQ0dQVE4JX0lPUignVCcsMHgzMCwgdW5zaWduZWQgaW50KSAvKiBHZXQgUHR5IE51bWJlciAob2YgcHR5LW11eCBkZXZpY2UpICovCiAjZGVmaW5lIFRJT0NTUFRMQ0sJX0lPVygnVCcsMHgzMSwgaW50KSAgLyogTG9jay91bmxvY2sgUHR5ICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rZXhlYy5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2tleGVjLmgKaW5kZXggNmRiZmZjOS4uN2UwNmI0MyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2tleGVjLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2tleGVjLmgKQEAgLTQ4LDYzICs0OCw4IEBACiB7CiAJaWYgKG9sZHJlZ3MpCiAJCW1lbWNweShuZXdyZWdzLCBvbGRyZWdzLCBzaXplb2YoKm5ld3JlZ3MpKTsKLSNpZmRlZiBfX3Bvd2VycGM2NF9fCi0JZWxzZSB7Ci0JCS8qIEZJWE1FIE1lcmdlIHRoaXMgd2l0aCB4bW9uX3NhdmVfcmVncyA/PyAqLwotCQl1bnNpZ25lZCBsb25nIHRtcDEsIHRtcDI7Ci0JCV9fYXNtX18gX192b2xhdGlsZV9fICgKLQkJCSJzdGQgICAgMCwwKCUyKVxuIgotCQkJInN0ZCAgICAxLDgoJTIpXG4iCi0JCQkic3RkICAgIDIsMTYoJTIpXG4iCi0JCQkic3RkICAgIDMsMjQoJTIpXG4iCi0JCQkic3RkICAgIDQsMzIoJTIpXG4iCi0JCQkic3RkICAgIDUsNDAoJTIpXG4iCi0JCQkic3RkICAgIDYsNDgoJTIpXG4iCi0JCQkic3RkICAgIDcsNTYoJTIpXG4iCi0JCQkic3RkICAgIDgsNjQoJTIpXG4iCi0JCQkic3RkICAgIDksNzIoJTIpXG4iCi0JCQkic3RkICAgIDEwLDgwKCUyKVxuIgotCQkJInN0ZCAgICAxMSw4OCglMilcbiIKLQkJCSJzdGQgICAgMTIsOTYoJTIpXG4iCi0JCQkic3RkICAgIDEzLDEwNCglMilcbiIKLQkJCSJzdGQgICAgMTQsMTEyKCUyKVxuIgotCQkJInN0ZCAgICAxNSwxMjAoJTIpXG4iCi0JCQkic3RkICAgIDE2LDEyOCglMilcbiIKLQkJCSJzdGQgICAgMTcsMTM2KCUyKVxuIgotCQkJInN0ZCAgICAxOCwxNDQoJTIpXG4iCi0JCQkic3RkICAgIDE5LDE1MiglMilcbiIKLQkJCSJzdGQgICAgMjAsMTYwKCUyKVxuIgotCQkJInN0ZCAgICAyMSwxNjgoJTIpXG4iCi0JCQkic3RkICAgIDIyLDE3NiglMilcbiIKLQkJCSJzdGQgICAgMjMsMTg0KCUyKVxuIgotCQkJInN0ZCAgICAyNCwxOTIoJTIpXG4iCi0JCQkic3RkICAgIDI1LDIwMCglMilcbiIKLQkJCSJzdGQgICAgMjYsMjA4KCUyKVxuIgotCQkJInN0ZCAgICAyNywyMTYoJTIpXG4iCi0JCQkic3RkICAgIDI4LDIyNCglMilcbiIKLQkJCSJzdGQgICAgMjksMjMyKCUyKVxuIgotCQkJInN0ZCAgICAzMCwyNDAoJTIpXG4iCi0JCQkic3RkICAgIDMxLDI0OCglMilcbiIKLQkJCSJtZm1zciAgJTBcbiIKLQkJCSJzdGQgICAgJTAsIDI2NCglMilcbiIKLQkJCSJtZmN0ciAgJTBcbiIKLQkJCSJzdGQgICAgJTAsIDI4MCglMilcbiIKLQkJCSJtZmxyICAgJTBcbiIKLQkJCSJzdGQgICAgJTAsIDI4OCglMilcbiIKLQkJCSJibCAgICAgMWZcbiIKLQkJIjE6ICAgICBtZmxyICAgJTFcbiIKLQkJCSJzdGQgICAgJTEsIDI1NiglMilcbiIKLQkJCSJtdGxyICAgJTBcbiIKLQkJCSJtZnhlciAgJTBcbiIKLQkJCSJzdGQgICAgJTAsIDI5NiglMilcbiIKLQkJCTogIj0mciIgKHRtcDEpLCAiPSZyIiAodG1wMikKLQkJCTogImIiIChuZXdyZWdzKQotCQkJOiAibWVtb3J5Iik7Ci0JfQotI2Vsc2UKIAllbHNlCiAJCXBwY19zYXZlX3JlZ3MobmV3cmVncyk7Ci0jZW5kaWYgLyogX19wb3dlcnBjNjRfXyAqLwogfQogCiBleHRlcm4gdm9pZCBrZXhlY19zbXBfd2FpdCh2b2lkKTsJLyogZ2V0IGFuZCBjbGVhciBuYWNhIHBoeXNpZCwgd2FpdCBmb3IKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wczMuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wczMuaAppbmRleCBjZmYzMGMwLi5lZWFkNWM2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHMzLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BzMy5oCkBAIC0zMjAsNiArMzIwLDcgQEAKIAogZW51bSBwczNfbWF0Y2hfc3ViX2lkIHsKIAlQUzNfTUFUQ0hfU1VCX0lEX0dQVV9GQgkJPSAxLAorCVBTM19NQVRDSF9TVUJfSURfR1BVX1JBTURJU0sJPSAyLAogfTsKIAogI2RlZmluZSBQUzNfTU9EVUxFX0FMSUFTX0VIQ0kJCSJwczM6MTowIgpAQCAtMzMyLDYgKzMzMyw3IEBACiAjZGVmaW5lIFBTM19NT0RVTEVfQUxJQVNfU1RPUl9GTEFTSAkicHMzOjg6MCIKICNkZWZpbmUgUFMzX01PRFVMRV9BTElBU19TT1VORAkJInBzMzo5OjAiCiAjZGVmaW5lIFBTM19NT0RVTEVfQUxJQVNfR1BVX0ZCCQkicHMzOjEwOjEiCisjZGVmaW5lIFBTM19NT0RVTEVfQUxJQVNfR1BVX1JBTURJU0sJInBzMzoxMDoyIgogI2RlZmluZSBQUzNfTU9EVUxFX0FMSUFTX0xQTQkJInBzMzoxMTowIgogCiBlbnVtIHBzM19zeXN0ZW1fYnVzX2RldmljZV90eXBlIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9xZS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3FlLmgKaW5kZXggZWRlZTE1ZC4uYTBhMTUzMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3FlLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3FlLmgKQEAgLTE3LDYgKzE3LDggQEAKICNpZmRlZiBfX0tFUk5FTF9fCiAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8YXNtL2NwbS5oPgogI2luY2x1ZGUgPGFzbS9pbW1hcF9xZS5oPgogCkBAIC04NCw3ICs4NiwxMSBAQAogZXh0ZXJuIHNwaW5sb2NrX3QgY214Z2NyX2xvY2s7CiAKIC8qIEV4cG9ydCBRRSBjb21tb24gb3BlcmF0aW9ucyAqLworI2lmZGVmIENPTkZJR19RVUlDQ19FTkdJTkUKIGV4dGVybiB2b2lkIF9faW5pdCBxZV9yZXNldCh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgcWVfcmVzZXQodm9pZCkge30KKyNlbmRpZgogCiAvKiBRRSBQSU8gKi8KICNkZWZpbmUgUUVfUElPX1BJTlMgMzIKQEAgLTEwMSwxNiArMTA3LDQzIEBACiAjZW5kaWYKIH07CiAKLWV4dGVybiBpbnQgcGFyX2lvX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpucCk7Ci1leHRlcm4gaW50IHBhcl9pb19vZl9jb25maWcoc3RydWN0IGRldmljZV9ub2RlICpucCk7CiAjZGVmaW5lIFFFX1BJT19ESVJfSU4JMgogI2RlZmluZSBRRV9QSU9fRElSX09VVAkxCiBleHRlcm4gdm9pZCBfX3Bhcl9pb19jb25maWdfcGluKHN0cnVjdCBxZV9waW9fcmVncyBfX2lvbWVtICpwYXJfaW8sIHU4IHBpbiwKIAkJCQlpbnQgZGlyLCBpbnQgb3Blbl9kcmFpbiwgaW50IGFzc2lnbm1lbnQsCiAJCQkJaW50IGhhc19pcnEpOworI2lmZGVmIENPTkZJR19RVUlDQ19FTkdJTkUKK2V4dGVybiBpbnQgcGFyX2lvX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpucCk7CitleHRlcm4gaW50IHBhcl9pb19vZl9jb25maWcoc3RydWN0IGRldmljZV9ub2RlICpucCk7CiBleHRlcm4gaW50IHBhcl9pb19jb25maWdfcGluKHU4IHBvcnQsIHU4IHBpbiwgaW50IGRpciwgaW50IG9wZW5fZHJhaW4sCiAJCQkgICAgIGludCBhc3NpZ25tZW50LCBpbnQgaGFzX2lycSk7CiBleHRlcm4gaW50IHBhcl9pb19kYXRhX3NldCh1OCBwb3J0LCB1OCBwaW4sIHU4IHZhbCk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgcGFyX2lvX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpucCkgeyByZXR1cm4gLUVOT1NZUzsgfQorc3RhdGljIGlubGluZSBpbnQgcGFyX2lvX29mX2NvbmZpZyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKSB7IHJldHVybiAtRU5PU1lTOyB9CitzdGF0aWMgaW5saW5lIGludCBwYXJfaW9fY29uZmlnX3Bpbih1OCBwb3J0LCB1OCBwaW4sIGludCBkaXIsIGludCBvcGVuX2RyYWluLAorCQlpbnQgYXNzaWdubWVudCwgaW50IGhhc19pcnEpIHsgcmV0dXJuIC1FTk9TWVM7IH0KK3N0YXRpYyBpbmxpbmUgaW50IHBhcl9pb19kYXRhX3NldCh1OCBwb3J0LCB1OCBwaW4sIHU4IHZhbCkgeyByZXR1cm4gLUVOT1NZUzsgfQorI2VuZGlmIC8qIENPTkZJR19RVUlDQ19FTkdJTkUgKi8KKworLyoKKyAqIFBpbiBtdWx0aXBsZXhpbmcgZnVuY3Rpb25zLgorICovCitzdHJ1Y3QgcWVfcGluOworI2lmZGVmIENPTkZJR19RRV9HUElPCitleHRlcm4gc3RydWN0IHFlX3BpbiAqcWVfcGluX3JlcXVlc3Qoc3RydWN0IGRldmljZV9ub2RlICpucCwgaW50IGluZGV4KTsKK2V4dGVybiB2b2lkIHFlX3Bpbl9mcmVlKHN0cnVjdCBxZV9waW4gKnFlX3Bpbik7CitleHRlcm4gdm9pZCBxZV9waW5fc2V0X2dwaW8oc3RydWN0IHFlX3BpbiAqcWVfcGluKTsKK2V4dGVybiB2b2lkIHFlX3Bpbl9zZXRfZGVkaWNhdGVkKHN0cnVjdCBxZV9waW4gKnBpbik7CisjZWxzZQorc3RhdGljIGlubGluZSBzdHJ1Y3QgcWVfcGluICpxZV9waW5fcmVxdWVzdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBpbnQgaW5kZXgpCit7CisJcmV0dXJuIEVSUl9QVFIoLUVOT1NZUyk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgcWVfcGluX2ZyZWUoc3RydWN0IHFlX3BpbiAqcWVfcGluKSB7fQorc3RhdGljIGlubGluZSB2b2lkIHFlX3Bpbl9zZXRfZ3BpbyhzdHJ1Y3QgcWVfcGluICpxZV9waW4pIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgcWVfcGluX3NldF9kZWRpY2F0ZWQoc3RydWN0IHFlX3BpbiAqcGluKSB7fQorI2VuZGlmIC8qIENPTkZJR19RRV9HUElPICovCiAKIC8qIFFFIGludGVybmFsIEFQSSAqLwogaW50IHFlX2lzc3VlX2NtZCh1MzIgY21kLCB1MzIgZGV2aWNlLCB1OCBtY25fcHJvdG9jb2wsIHUzMiBjbWRfaW5wdXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3FlX2ljLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcWVfaWMuaAppbmRleCA1NmE3NzQ1Li5jZjUxOTY2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcWVfaWMuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcWVfaWMuaApAQCAtMTcsNiArMTcsOSBAQAogCiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAKK3N0cnVjdCBkZXZpY2Vfbm9kZTsKK3N0cnVjdCBxZV9pYzsKKwogI2RlZmluZSBOVU1fT0ZfUUVfSUNfR1JPVVBTCTYKIAogLyogRmxhZ3Mgd2hlbiB3ZSBpbml0IHRoZSBRRSBJQyAqLwpAQCAtNTQsMTcgKzU3LDI3IEBACiAJUUVfSUNfR1JQX1JJU0NCCQkvKiBRRSBpbnRlcnJ1cHQgY29udHJvbGxlciBSSVNDIGdyb3VwIEIgKi8KIH07CiAKKyNpZmRlZiBDT05GSUdfUVVJQ0NfRU5HSU5FCiB2b2lkIHFlX2ljX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpub2RlLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCiAJCXZvaWQgKCpsb3dfaGFuZGxlcikodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKSwKIAkJdm9pZCAoKmhpZ2hfaGFuZGxlcikodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKSk7Cit1bnNpZ25lZCBpbnQgcWVfaWNfZ2V0X2xvd19pcnEoc3RydWN0IHFlX2ljICpxZV9pYyk7Cit1bnNpZ25lZCBpbnQgcWVfaWNfZ2V0X2hpZ2hfaXJxKHN0cnVjdCBxZV9pYyAqcWVfaWMpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBxZV9pY19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwgdW5zaWduZWQgaW50IGZsYWdzLAorCQl2b2lkICgqbG93X2hhbmRsZXIpKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYyksCisJCXZvaWQgKCpoaWdoX2hhbmRsZXIpKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykpCit7fQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcWVfaWNfZ2V0X2xvd19pcnEoc3RydWN0IHFlX2ljICpxZV9pYykKK3sgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHFlX2ljX2dldF9oaWdoX2lycShzdHJ1Y3QgcWVfaWMgKnFlX2ljKQoreyByZXR1cm4gMDsgfQorI2VuZGlmIC8qIENPTkZJR19RVUlDQ19FTkdJTkUgKi8KKwogdm9pZCBxZV9pY19zZXRfaGlnaGVzdF9wcmlvcml0eSh1bnNpZ25lZCBpbnQgdmlycSwgaW50IGhpZ2gpOwogaW50IHFlX2ljX3NldF9wcmlvcml0eSh1bnNpZ25lZCBpbnQgdmlycSwgdW5zaWduZWQgaW50IHByaW9yaXR5KTsKIGludCBxZV9pY19zZXRfaGlnaF9wcmlvcml0eSh1bnNpZ25lZCBpbnQgdmlycSwgdW5zaWduZWQgaW50IHByaW9yaXR5LCBpbnQgaGlnaCk7CiAKLXN0cnVjdCBxZV9pYzsKLXVuc2lnbmVkIGludCBxZV9pY19nZXRfbG93X2lycShzdHJ1Y3QgcWVfaWMgKnFlX2ljKTsKLXVuc2lnbmVkIGludCBxZV9pY19nZXRfaGlnaF9pcnEoc3RydWN0IHFlX2ljICpxZV9pYyk7Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBxZV9pY19jYXNjYWRlX2xvd19pcGljKHVuc2lnbmVkIGludCBpcnEsCiAJCQkJCSAgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3NwdS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3NwdS5oCmluZGV4IDhiMmViMDQuLjBhYjhkODY5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc3B1LmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3NwdS5oCkBAIC0xMjgsNyArMTI4LDcgQEAKIAlpbnQgbnVtYmVyOwogCXVuc2lnbmVkIGludCBpcnFzWzNdOwogCXUzMiBub2RlOwotCXU2NCBmbGFnczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXU2NCBjbGFzc18wX3BlbmRpbmc7CiAJdTY0IGNsYXNzXzBfZGFyOwogCXU2NCBjbGFzc18xX2RhcjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zd2FiLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc3dhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmODI0YWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc3dhYi5oCkBAIC0wLDAgKzEsOTAgQEAKKyNpZm5kZWYgX0FTTV9QT1dFUlBDX1NXQUJfSAorI2RlZmluZSBfQVNNX1BPV0VSUENfU1dBQl9ICisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorCisjaWZkZWYgX19HTlVDX18KKworI2lmbmRlZiBfX3Bvd2VycGM2NF9fCisjZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KKyNlbmRpZiAvKiBfX3Bvd2VycGM2NF9fICovCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKK3N0YXRpYyBfX2lubGluZV9fIF9fdTE2IGxkX2xlMTYoY29uc3Qgdm9sYXRpbGUgX191MTYgKmFkZHIpCit7CisJX191MTYgdmFsOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJsaGJyeCAlMCwwLCUxIiA6ICI9ciIgKHZhbCkgOiAiciIgKGFkZHIpLCAibSIgKCphZGRyKSk7CisJcmV0dXJuIHZhbDsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWIxNnAgbGRfbGUxNgorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHN0X2xlMTYodm9sYXRpbGUgX191MTYgKmFkZHIsIGNvbnN0IF9fdTE2IHZhbCkKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN0aGJyeCAlMSwwLCUyIiA6ICI9bSIgKCphZGRyKSA6ICJyIiAodmFsKSwgInIiIChhZGRyKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2FyY2hfc3dhYjE2cyhfX3UxNiAqYWRkcikKK3sKKwlzdF9sZTE2KGFkZHIsICphZGRyKTsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWIxNnMgX19hcmNoX3N3YWIxNnMKKworc3RhdGljIF9faW5saW5lX18gX191MzIgbGRfbGUzMihjb25zdCB2b2xhdGlsZSBfX3UzMiAqYWRkcikKK3sKKwlfX3UzMiB2YWw7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImx3YnJ4ICUwLDAsJTEiIDogIj1yIiAodmFsKSA6ICJyIiAoYWRkciksICJtIiAoKmFkZHIpKTsKKwlyZXR1cm4gdmFsOworfQorI2RlZmluZSBfX2FyY2hfc3dhYjMycCBsZF9sZTMyCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgc3RfbGUzMih2b2xhdGlsZSBfX3UzMiAqYWRkciwgY29uc3QgX191MzIgdmFsKQoreworCV9fYXNtX18gX192b2xhdGlsZV9fICgic3R3YnJ4ICUxLDAsJTIiIDogIj1tIiAoKmFkZHIpIDogInIiICh2YWwpLCAiciIgKGFkZHIpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fYXJjaF9zd2FiMzJzKF9fdTMyICphZGRyKQoreworCXN0X2xlMzIoYWRkciwgKmFkZHIpOworfQorI2RlZmluZSBfX2FyY2hfc3dhYjMycyBfX2FyY2hfc3dhYjMycworCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MTYgX19hcmNoX3N3YWIxNihfX3UxNiB2YWx1ZSkKK3sKKwlfX3UxNiByZXN1bHQ7CisKKwlfX2FzbV9fKCJybHdpbWkgJTAsJTEsOCwxNiwyMyIKKwkgICAgOiAiPXIiIChyZXN1bHQpCisJICAgIDogInIiICh2YWx1ZSksICIwIiAodmFsdWUgPj4gOCkpOworCXJldHVybiByZXN1bHQ7Cit9CisjZGVmaW5lIF9fYXJjaF9zd2FiMTYgX19hcmNoX3N3YWIxNgorCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19hcmNoX3N3YWIzMihfX3UzMiB2YWx1ZSkKK3sKKwlfX3UzMiByZXN1bHQ7CisKKwlfX2FzbV9fKCJybHdpbWkgJTAsJTEsMjQsMTYsMjNcblx0IgorCSAgICAicmx3aW1pICUwLCUxLDgsOCwxNVxuXHQiCisJICAgICJybHdpbWkgJTAsJTEsMjQsMCw3IgorCSAgICA6ICI9ciIgKHJlc3VsdCkKKwkgICAgOiAiciIgKHZhbHVlKSwgIjAiICh2YWx1ZSA+PiAyNCkpOworCXJldHVybiByZXN1bHQ7Cit9CisjZGVmaW5lIF9fYXJjaF9zd2FiMzIgX19hcmNoX3N3YWIzMgorCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjZW5kaWYgLyogX19HTlVDX18gKi8KKworI2VuZGlmIC8qIF9BU01fUE9XRVJQQ19TV0FCX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlCmluZGV4IDEzMDhhODYuLjhkMWE0MTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZQpAQCAtMjksNyArMjksNyBAQAogb2JqLXkJCQkJOj0gY3B1dGFibGUubyBwdHJhY2UubyBzeXNjYWxscy5vIFwKIAkJCQkgICBpcnEubyBhbGlnbi5vIHNpZ25hbF8zMi5vIHBtYy5vIHZkc28ubyBcCiAJCQkJICAgaW5pdF90YXNrLm8gcHJvY2Vzcy5vIHN5c3RibC5vIGlkbGUubyBcCi0JCQkJICAgc2lnbmFsLm8gc3lzZnMubworCQkJCSAgIHNpZ25hbC5vIHN5c2ZzLm8gY2FjaGVpbmZvLm8KIG9iai15CQkJCSs9IHZkc28zMi8KIG9iai0kKENPTkZJR19QUEM2NCkJCSs9IHNldHVwXzY0Lm8gc3lzX3BwYzMyLm8gXAogCQkJCSAgIHNpZ25hbF82NC5vIHB0cmFjZTMyLm8gXApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jYWNoZWluZm8uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY2FjaGVpbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMzZjA0MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY2FjaGVpbmZvLmMKQEAgLTAsMCArMSw4MzcgQEAKKy8qCisgKiBQcm9jZXNzb3IgY2FjaGUgaW5mb3JtYXRpb24gbWFkZSBhdmFpbGFibGUgdG8gdXNlcnNwYWNlIHZpYSBzeXNmczsKKyAqIGludGVuZGVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB4ODYgaW50ZWxfY2FjaGVpbmZvIGltcGxlbWVudGF0aW9uLgorICoKKyAqIENvcHlyaWdodCAyMDA4IElCTSBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBOYXRoYW4gTHluY2gKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisKKyNpbmNsdWRlICJjYWNoZWluZm8uaCIKKworLyogcGVyLWNwdSBvYmplY3QgZm9yIHRyYWNraW5nOgorICogLSBhICJjYWNoZSIga29iamVjdCBmb3IgdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkKKyAqIC0gYSBsaXN0IG9mICJpbmRleCIgb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIGNwdSdzIGxvY2FsIGNhY2hlIGhpZXJhcmNoeQorICovCitzdHJ1Y3QgY2FjaGVfZGlyIHsKKwlzdHJ1Y3Qga29iamVjdCAqa29iajsgLyogYmFyZSAobm90IGVtYmVkZGVkKSBrb2JqZWN0IGZvciBjYWNoZQorCQkJICAgICAgICogZGlyZWN0b3J5ICovCisJc3RydWN0IGNhY2hlX2luZGV4X2RpciAqaW5kZXg7IC8qIGxpc3Qgb2YgaW5kZXggb2JqZWN0cyAqLworfTsKKworLyogImluZGV4IiBvYmplY3Q6IGVhY2ggY3B1J3MgY2FjaGUgZGlyZWN0b3J5IGhhcyBhbiBpbmRleAorICogc3ViZGlyZWN0b3J5IGNvcnJlc3BvbmRpbmcgdG8gYSBjYWNoZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZQorICogY3B1LiAgVGhpcyBvYmplY3QncyBsaWZldGltZSBpcyBtYW5hZ2VkIHZpYSB0aGUgZW1iZWRkZWQga29iamVjdC4KKyAqLworc3RydWN0IGNhY2hlX2luZGV4X2RpciB7CisJc3RydWN0IGtvYmplY3Qga29iajsKKwlzdHJ1Y3QgY2FjaGVfaW5kZXhfZGlyICpuZXh0OyAvKiBuZXh0IGluZGV4IGluIHBhcmVudCBkaXJlY3RvcnkgKi8KKwlzdHJ1Y3QgY2FjaGUgKmNhY2hlOworfTsKKworLyogVGVtcGxhdGUgZm9yIGRldGVybWluaW5nIHdoaWNoIE9GIHByb3BlcnRpZXMgdG8gcXVlcnkgZm9yIGEgZ2l2ZW4KKyAqIGNhY2hlIHR5cGUgKi8KK3N0cnVjdCBjYWNoZV90eXBlX2luZm8geworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqc2l6ZV9wcm9wOworCisJLyogQWxsb3cgZm9yIGJvdGggW2RpXS1jYWNoZS1saW5lLXNpemUgYW5kCisJICogW2RpXS1jYWNoZS1ibG9jay1zaXplIHByb3BlcnRpZXMuICBBY2NvcmRpbmcgdG8gdGhlIFBvd2VyUEMKKwkgKiBQcm9jZXNzb3IgYmluZGluZywgLWxpbmUtc2l6ZSBzaG91bGQgYmUgcHJvdmlkZWQgaWYgaXQKKwkgKiBkaWZmZXJzIGZyb20gdGhlIGNhY2hlIGJsb2NrIHNpemUgKHRoYXQgd2hpY2ggaXMgb3BlcmF0ZWQKKwkgKiBvbiBieSBjYWNoZSBpbnN0cnVjdGlvbnMpLCBzbyB3ZSBsb29rIGZvciAtbGluZS1zaXplIGZpcnN0LgorCSAqIFNlZSBjYWNoZV9nZXRfbGluZV9zaXplKCkuICovCisKKwljb25zdCBjaGFyICpsaW5lX3NpemVfcHJvcHNbMl07CisJY29uc3QgY2hhciAqbnJfc2V0c19wcm9wOworfTsKKworLyogVGhlc2UgYXJlIHVzZWQgdG8gaW5kZXggdGhlIGNhY2hlX3R5cGVfaW5mbyBhcnJheS4gKi8KKyNkZWZpbmUgQ0FDSEVfVFlQRV9VTklGSUVEICAgICAwCisjZGVmaW5lIENBQ0hFX1RZUEVfSU5TVFJVQ1RJT04gMQorI2RlZmluZSBDQUNIRV9UWVBFX0RBVEEgICAgICAgIDIKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjYWNoZV90eXBlX2luZm8gY2FjaGVfdHlwZV9pbmZvW10gPSB7CisJeworCQkvKiBQb3dlclBDIFByb2Nlc3NvciBiaW5kaW5nIHNheXMgdGhlIFtkaV0tY2FjaGUtKgorCQkgKiBtdXN0IGJlIGVxdWFsIG9uIHVuaWZpZWQgY2FjaGVzLCBzbyBqdXN0IHVzZQorCQkgKiBkLWNhY2hlIHByb3BlcnRpZXMuICovCisJCS5uYW1lICAgICAgICAgICAgPSAiVW5pZmllZCIsCisJCS5zaXplX3Byb3AgICAgICAgPSAiZC1jYWNoZS1zaXplIiwKKwkJLmxpbmVfc2l6ZV9wcm9wcyA9IHsgImQtY2FjaGUtbGluZS1zaXplIiwKKwkJCQkgICAgICJkLWNhY2hlLWJsb2NrLXNpemUiLCB9LAorCQkubnJfc2V0c19wcm9wICAgID0gImQtY2FjaGUtc2V0cyIsCisJfSwKKwl7CisJCS5uYW1lICAgICAgICAgICAgPSAiSW5zdHJ1Y3Rpb24iLAorCQkuc2l6ZV9wcm9wICAgICAgID0gImktY2FjaGUtc2l6ZSIsCisJCS5saW5lX3NpemVfcHJvcHMgPSB7ICJpLWNhY2hlLWxpbmUtc2l6ZSIsCisJCQkJICAgICAiaS1jYWNoZS1ibG9jay1zaXplIiwgfSwKKwkJLm5yX3NldHNfcHJvcCAgICA9ICJpLWNhY2hlLXNldHMiLAorCX0sCisJeworCQkubmFtZSAgICAgICAgICAgID0gIkRhdGEiLAorCQkuc2l6ZV9wcm9wICAgICAgID0gImQtY2FjaGUtc2l6ZSIsCisJCS5saW5lX3NpemVfcHJvcHMgPSB7ICJkLWNhY2hlLWxpbmUtc2l6ZSIsCisJCQkJICAgICAiZC1jYWNoZS1ibG9jay1zaXplIiwgfSwKKwkJLm5yX3NldHNfcHJvcCAgICA9ICJkLWNhY2hlLXNldHMiLAorCX0sCit9OworCisvKiBDYWNoZSBvYmplY3Q6IGVhY2ggaW5zdGFuY2Ugb2YgdGhpcyBjb3JyZXNwb25kcyB0byBhIGRpc3RpbmN0IGNhY2hlCisgKiBpbiB0aGUgc3lzdGVtLiAgVGhlcmUgYXJlIHNlcGFyYXRlIG9iamVjdHMgZm9yIEhhcnZhcmQgY2FjaGVzOiBvbmUKKyAqIGVhY2ggZm9yIGluc3RydWN0aW9uIGFuZCBkYXRhLCBhbmQgZWFjaCByZWZlcnMgdG8gdGhlIHNhbWUgT0Ygbm9kZS4KKyAqIFRoZSByZWZjb3VudCBvZiB0aGUgT0Ygbm9kZSBpcyBlbGV2YXRlZCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZQorICogY2FjaGUgb2JqZWN0LiAgQSBjYWNoZSBvYmplY3QgaXMgcmVsZWFzZWQgd2hlbiBpdHMgc2hhcmVkX2NwdV9tYXAKKyAqIGlzIGNsZWFyZWQgKHNlZSBjYWNoZV9jcHVfY2xlYXIpLgorICoKKyAqIEEgY2FjaGUgb2JqZWN0IGlzIG9uIHR3byBsaXN0czogYW4gdW5zb3J0ZWQgZ2xvYmFsIGxpc3QKKyAqIChjYWNoZV9saXN0KSBvZiBjYWNoZSBvYmplY3RzOyBhbmQgYSBzaW5nbHktbGlua2VkIGxpc3QKKyAqIHJlcHJlc2VudGluZyB0aGUgbG9jYWwgY2FjaGUgaGllcmFyY2h5LCB3aGljaCBpcyBvcmRlcmVkIGJ5IGxldmVsCisgKiAoZS5nLiBMMWQgLT4gTDFpIC0+IEwyIC0+IEwzKS4KKyAqLworc3RydWN0IGNhY2hlIHsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mbm9kZTsgICAgLyogT0Ygbm9kZSBmb3IgdGhpcyBjYWNoZSwgbWF5IGJlIGNwdSAqLworCXN0cnVjdCBjcHVtYXNrIHNoYXJlZF9jcHVfbWFwOyAvKiBvbmxpbmUgQ1BVcyB1c2luZyB0aGlzIGNhY2hlICovCisJaW50IHR5cGU7ICAgICAgICAgICAgICAgICAgICAgIC8qIHNwbGl0IGNhY2hlIGRpc2FtYmlndWF0aW9uICovCisJaW50IGxldmVsOyAgICAgICAgICAgICAgICAgICAgIC8qIGxldmVsIG5vdCBleHBsaWNpdCBpbiBkZXZpY2UgdHJlZSAqLworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsgICAgICAgICAvKiBnbG9iYWwgbGlzdCBvZiBjYWNoZSBvYmplY3RzICovCisJc3RydWN0IGNhY2hlICpuZXh0X2xvY2FsOyAgICAgIC8qIG5leHQgY2FjaGUgb2YgPj0gbGV2ZWwgKi8KK307CisKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgY2FjaGVfZGlyICosIGNhY2hlX2Rpcik7CisKKy8qIHRyYXZlcnNhbC9tb2RpZmljYXRpb24gb2YgdGhpcyBsaXN0IG9jY3VycyBvbmx5IGF0IGNwdSBob3RwbHVnIHRpbWU7CisgKiBhY2Nlc3MgaXMgc2VyaWFsaXplZCBieSBjcHUgaG90cGx1ZyBsb2NraW5nCisgKi8KK3N0YXRpYyBMSVNUX0hFQUQoY2FjaGVfbGlzdCk7CisKK3N0YXRpYyBzdHJ1Y3QgY2FjaGVfaW5kZXhfZGlyICprb2JqX3RvX2NhY2hlX2luZGV4X2RpcihzdHJ1Y3Qga29iamVjdCAqaykKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGssIHN0cnVjdCBjYWNoZV9pbmRleF9kaXIsIGtvYmopOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqY2FjaGVfdHlwZV9zdHJpbmcoY29uc3Qgc3RydWN0IGNhY2hlICpjYWNoZSkKK3sKKwlyZXR1cm4gY2FjaGVfdHlwZV9pbmZvW2NhY2hlLT50eXBlXS5uYW1lOworfQorCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgY2FjaGVfaW5pdChzdHJ1Y3QgY2FjaGUgKmNhY2hlLCBpbnQgdHlwZSwgaW50IGxldmVsLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mbm9kZSkKK3sKKwljYWNoZS0+dHlwZSA9IHR5cGU7CisJY2FjaGUtPmxldmVsID0gbGV2ZWw7CisJY2FjaGUtPm9mbm9kZSA9IG9mX25vZGVfZ2V0KG9mbm9kZSk7CisJSU5JVF9MSVNUX0hFQUQoJmNhY2hlLT5saXN0KTsKKwlsaXN0X2FkZCgmY2FjaGUtPmxpc3QsICZjYWNoZV9saXN0KTsKK30KKworc3RhdGljIHN0cnVjdCBjYWNoZSAqX19jcHVpbml0IG5ld19jYWNoZShpbnQgdHlwZSwgaW50IGxldmVsLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mbm9kZSkKK3sKKwlzdHJ1Y3QgY2FjaGUgKmNhY2hlOworCisJY2FjaGUgPSBremFsbG9jKHNpemVvZigqY2FjaGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2FjaGUpCisJCWNhY2hlX2luaXQoY2FjaGUsIHR5cGUsIGxldmVsLCBvZm5vZGUpOworCisJcmV0dXJuIGNhY2hlOworfQorCitzdGF0aWMgdm9pZCByZWxlYXNlX2NhY2hlX2RlYnVnY2hlY2soc3RydWN0IGNhY2hlICpjYWNoZSkKK3sKKwlzdHJ1Y3QgY2FjaGUgKml0ZXI7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGl0ZXIsICZjYWNoZV9saXN0LCBsaXN0KQorCQlXQVJOX09OQ0UoaXRlci0+bmV4dF9sb2NhbCA9PSBjYWNoZSwKKwkJCSAgImNhY2hlIGZvciAlcyglcykgcmVmZXJzIHRvIGNhY2hlIGZvciAlcyglcylcbiIsCisJCQkgIGl0ZXItPm9mbm9kZS0+ZnVsbF9uYW1lLAorCQkJICBjYWNoZV90eXBlX3N0cmluZyhpdGVyKSwKKwkJCSAgY2FjaGUtPm9mbm9kZS0+ZnVsbF9uYW1lLAorCQkJICBjYWNoZV90eXBlX3N0cmluZyhjYWNoZSkpOworfQorCitzdGF0aWMgdm9pZCByZWxlYXNlX2NhY2hlKHN0cnVjdCBjYWNoZSAqY2FjaGUpCit7CisJaWYgKCFjYWNoZSkKKwkJcmV0dXJuOworCisJcHJfZGVidWcoImZyZWVpbmcgTCVkICVzIGNhY2hlIGZvciAlc1xuIiwgY2FjaGUtPmxldmVsLAorCQkgY2FjaGVfdHlwZV9zdHJpbmcoY2FjaGUpLCBjYWNoZS0+b2Zub2RlLT5mdWxsX25hbWUpOworCisJcmVsZWFzZV9jYWNoZV9kZWJ1Z2NoZWNrKGNhY2hlKTsKKwlsaXN0X2RlbCgmY2FjaGUtPmxpc3QpOworCW9mX25vZGVfcHV0KGNhY2hlLT5vZm5vZGUpOworCWtmcmVlKGNhY2hlKTsKK30KKworc3RhdGljIHZvaWQgY2FjaGVfY3B1X3NldChzdHJ1Y3QgY2FjaGUgKmNhY2hlLCBpbnQgY3B1KQoreworCXN0cnVjdCBjYWNoZSAqbmV4dCA9IGNhY2hlOworCisJd2hpbGUgKG5leHQpIHsKKwkJV0FSTl9PTkNFKGNwdW1hc2tfdGVzdF9jcHUoY3B1LCAmbmV4dC0+c2hhcmVkX2NwdV9tYXApLAorCQkJICAiQ1BVICVpIGFscmVhZHkgYWNjb3VudGVkIGluICVzKCVzKVxuIiwKKwkJCSAgY3B1LCBuZXh0LT5vZm5vZGUtPmZ1bGxfbmFtZSwKKwkJCSAgY2FjaGVfdHlwZV9zdHJpbmcobmV4dCkpOworCQljcHVtYXNrX3NldF9jcHUoY3B1LCAmbmV4dC0+c2hhcmVkX2NwdV9tYXApOworCQluZXh0ID0gbmV4dC0+bmV4dF9sb2NhbDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY2FjaGVfc2l6ZShjb25zdCBzdHJ1Y3QgY2FjaGUgKmNhY2hlLCB1bnNpZ25lZCBpbnQgKnJldCkKK3sKKwljb25zdCBjaGFyICpwcm9wbmFtZTsKKwljb25zdCB1MzIgKmNhY2hlX3NpemU7CisKKwlwcm9wbmFtZSA9IGNhY2hlX3R5cGVfaW5mb1tjYWNoZS0+dHlwZV0uc2l6ZV9wcm9wOworCisJY2FjaGVfc2l6ZSA9IG9mX2dldF9wcm9wZXJ0eShjYWNoZS0+b2Zub2RlLCBwcm9wbmFtZSwgTlVMTCk7CisJaWYgKCFjYWNoZV9zaXplKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCSpyZXQgPSAqY2FjaGVfc2l6ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjYWNoZV9zaXplX2tiKGNvbnN0IHN0cnVjdCBjYWNoZSAqY2FjaGUsIHVuc2lnbmVkIGludCAqcmV0KQoreworCXVuc2lnbmVkIGludCBzaXplOworCisJaWYgKGNhY2hlX3NpemUoY2FjaGUsICZzaXplKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkqcmV0ID0gc2l6ZSAvIDEwMjQ7CisJcmV0dXJuIDA7Cit9CisKKy8qIG5vdCBjYWNoZV9saW5lX3NpemUoKSBiZWNhdXNlIHRoYXQncyBhIG1hY3JvIGluIGluY2x1ZGUvbGludXgvY2FjaGUuaCAqLworc3RhdGljIGludCBjYWNoZV9nZXRfbGluZV9zaXplKGNvbnN0IHN0cnVjdCBjYWNoZSAqY2FjaGUsIHVuc2lnbmVkIGludCAqcmV0KQoreworCWNvbnN0IHUzMiAqbGluZV9zaXplOworCWludCBpLCBsaW07CisKKwlsaW0gPSBBUlJBWV9TSVpFKGNhY2hlX3R5cGVfaW5mb1tjYWNoZS0+dHlwZV0ubGluZV9zaXplX3Byb3BzKTsKKworCWZvciAoaSA9IDA7IGkgPCBsaW07IGkrKykgeworCQljb25zdCBjaGFyICpwcm9wbmFtZTsKKworCQlwcm9wbmFtZSA9IGNhY2hlX3R5cGVfaW5mb1tjYWNoZS0+dHlwZV0ubGluZV9zaXplX3Byb3BzW2ldOworCQlsaW5lX3NpemUgPSBvZl9nZXRfcHJvcGVydHkoY2FjaGUtPm9mbm9kZSwgcHJvcG5hbWUsIE5VTEwpOworCQlpZiAobGluZV9zaXplKQorCQkJYnJlYWs7CisJfQorCisJaWYgKCFsaW5lX3NpemUpCisJCXJldHVybiAtRU5PREVWOworCisJKnJldCA9ICpsaW5lX3NpemU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2FjaGVfbnJfc2V0cyhjb25zdCBzdHJ1Y3QgY2FjaGUgKmNhY2hlLCB1bnNpZ25lZCBpbnQgKnJldCkKK3sKKwljb25zdCBjaGFyICpwcm9wbmFtZTsKKwljb25zdCB1MzIgKm5yX3NldHM7CisKKwlwcm9wbmFtZSA9IGNhY2hlX3R5cGVfaW5mb1tjYWNoZS0+dHlwZV0ubnJfc2V0c19wcm9wOworCisJbnJfc2V0cyA9IG9mX2dldF9wcm9wZXJ0eShjYWNoZS0+b2Zub2RlLCBwcm9wbmFtZSwgTlVMTCk7CisJaWYgKCFucl9zZXRzKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCSpyZXQgPSAqbnJfc2V0czsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjYWNoZV9hc3NvY2lhdGl2aXR5KGNvbnN0IHN0cnVjdCBjYWNoZSAqY2FjaGUsIHVuc2lnbmVkIGludCAqcmV0KQoreworCXVuc2lnbmVkIGludCBsaW5lX3NpemU7CisJdW5zaWduZWQgaW50IG5yX3NldHM7CisJdW5zaWduZWQgaW50IHNpemU7CisKKwlpZiAoY2FjaGVfbnJfc2V0cyhjYWNoZSwgJm5yX3NldHMpKQorCQlnb3RvIGVycjsKKworCS8qIElmIHRoZSBjYWNoZSBpcyBmdWxseSBhc3NvY2lhdGl2ZSwgdGhlcmUgaXMgbm8gbmVlZCB0bworCSAqIGNoZWNrIHRoZSBvdGhlciBwcm9wZXJ0aWVzLgorCSAqLworCWlmIChucl9zZXRzID09IDEpIHsKKwkJKnJldCA9IDA7CisJCXJldHVybiAwOworCX0KKworCWlmIChjYWNoZV9nZXRfbGluZV9zaXplKGNhY2hlLCAmbGluZV9zaXplKSkKKwkJZ290byBlcnI7CisJaWYgKGNhY2hlX3NpemUoY2FjaGUsICZzaXplKSkKKwkJZ290byBlcnI7CisKKwlpZiAoIShucl9zZXRzID4gMCAmJiBzaXplID4gMCAmJiBsaW5lX3NpemUgPiAwKSkKKwkJZ290byBlcnI7CisKKwkqcmV0ID0gKHNpemUgLyBucl9zZXRzKSAvIGxpbmVfc2l6ZTsKKwlyZXR1cm4gMDsKK2VycjoKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworLyogaGVscGVyIGZvciBkZWFsaW5nIHdpdGggc3BsaXQgY2FjaGVzICovCitzdGF0aWMgc3RydWN0IGNhY2hlICpjYWNoZV9maW5kX2ZpcnN0X3NpYmxpbmcoc3RydWN0IGNhY2hlICpjYWNoZSkKK3sKKwlzdHJ1Y3QgY2FjaGUgKml0ZXI7CisKKwlpZiAoY2FjaGUtPnR5cGUgPT0gQ0FDSEVfVFlQRV9VTklGSUVEKQorCQlyZXR1cm4gY2FjaGU7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGl0ZXIsICZjYWNoZV9saXN0LCBsaXN0KQorCQlpZiAoaXRlci0+b2Zub2RlID09IGNhY2hlLT5vZm5vZGUgJiYgaXRlci0+bmV4dF9sb2NhbCA9PSBjYWNoZSkKKwkJCXJldHVybiBpdGVyOworCisJcmV0dXJuIGNhY2hlOworfQorCisvKiByZXR1cm4gdGhlIGZpcnN0IGNhY2hlIG9uIGEgbG9jYWwgbGlzdCBtYXRjaGluZyBub2RlICovCitzdGF0aWMgc3RydWN0IGNhY2hlICpjYWNoZV9sb29rdXBfYnlfbm9kZShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCit7CisJc3RydWN0IGNhY2hlICpjYWNoZSA9IE5VTEw7CisJc3RydWN0IGNhY2hlICppdGVyOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShpdGVyLCAmY2FjaGVfbGlzdCwgbGlzdCkgeworCQlpZiAoaXRlci0+b2Zub2RlICE9IG5vZGUpCisJCQljb250aW51ZTsKKwkJY2FjaGUgPSBjYWNoZV9maW5kX2ZpcnN0X3NpYmxpbmcoaXRlcik7CisJCWJyZWFrOworCX0KKworCXJldHVybiBjYWNoZTsKK30KKworc3RhdGljIGJvb2wgY2FjaGVfbm9kZV9pc191bmlmaWVkKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJcmV0dXJuIG9mX2dldF9wcm9wZXJ0eShucCwgImNhY2hlLXVuaWZpZWQiLCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBjYWNoZSAqX19jcHVpbml0IGNhY2hlX2RvX29uZV9kZXZub2RlX3VuaWZpZWQoc3RydWN0IGRldmljZV9ub2RlICpub2RlLCBpbnQgbGV2ZWwpCit7CisJc3RydWN0IGNhY2hlICpjYWNoZTsKKworCXByX2RlYnVnKCJjcmVhdGluZyBMJWQgdWNhY2hlIGZvciAlc1xuIiwgbGV2ZWwsIG5vZGUtPmZ1bGxfbmFtZSk7CisKKwljYWNoZSA9IG5ld19jYWNoZShDQUNIRV9UWVBFX1VOSUZJRUQsIGxldmVsLCBub2RlKTsKKworCXJldHVybiBjYWNoZTsKK30KKworc3RhdGljIHN0cnVjdCBjYWNoZSAqX19jcHVpbml0IGNhY2hlX2RvX29uZV9kZXZub2RlX3NwbGl0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwgaW50IGxldmVsKQoreworCXN0cnVjdCBjYWNoZSAqZGNhY2hlLCAqaWNhY2hlOworCisJcHJfZGVidWcoImNyZWF0aW5nIEwlZCBkY2FjaGUgYW5kIGljYWNoZSBmb3IgJXNcbiIsIGxldmVsLAorCQkgbm9kZS0+ZnVsbF9uYW1lKTsKKworCWRjYWNoZSA9IG5ld19jYWNoZShDQUNIRV9UWVBFX0RBVEEsIGxldmVsLCBub2RlKTsKKwlpY2FjaGUgPSBuZXdfY2FjaGUoQ0FDSEVfVFlQRV9JTlNUUlVDVElPTiwgbGV2ZWwsIG5vZGUpOworCisJaWYgKCFkY2FjaGUgfHwgIWljYWNoZSkKKwkJZ290byBlcnI7CisKKwlkY2FjaGUtPm5leHRfbG9jYWwgPSBpY2FjaGU7CisKKwlyZXR1cm4gZGNhY2hlOworZXJyOgorCXJlbGVhc2VfY2FjaGUoZGNhY2hlKTsKKwlyZWxlYXNlX2NhY2hlKGljYWNoZSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2FjaGUgKl9fY3B1aW5pdCBjYWNoZV9kb19vbmVfZGV2bm9kZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIGludCBsZXZlbCkKK3sKKwlzdHJ1Y3QgY2FjaGUgKmNhY2hlOworCisJaWYgKGNhY2hlX25vZGVfaXNfdW5pZmllZChub2RlKSkKKwkJY2FjaGUgPSBjYWNoZV9kb19vbmVfZGV2bm9kZV91bmlmaWVkKG5vZGUsIGxldmVsKTsKKwllbHNlCisJCWNhY2hlID0gY2FjaGVfZG9fb25lX2Rldm5vZGVfc3BsaXQobm9kZSwgbGV2ZWwpOworCisJcmV0dXJuIGNhY2hlOworfQorCitzdGF0aWMgc3RydWN0IGNhY2hlICpfX2NwdWluaXQgY2FjaGVfbG9va3VwX29yX2luc3RhbnRpYXRlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwgaW50IGxldmVsKQoreworCXN0cnVjdCBjYWNoZSAqY2FjaGU7CisKKwljYWNoZSA9IGNhY2hlX2xvb2t1cF9ieV9ub2RlKG5vZGUpOworCisJV0FSTl9PTkNFKGNhY2hlICYmIGNhY2hlLT5sZXZlbCAhPSBsZXZlbCwKKwkJICAiY2FjaGUgbGV2ZWwgbWlzbWF0Y2ggb24gbG9va3VwIChnb3QgJWQsIGV4cGVjdGVkICVkKVxuIiwKKwkJICBjYWNoZS0+bGV2ZWwsIGxldmVsKTsKKworCWlmICghY2FjaGUpCisJCWNhY2hlID0gY2FjaGVfZG9fb25lX2Rldm5vZGUobm9kZSwgbGV2ZWwpOworCisJcmV0dXJuIGNhY2hlOworfQorCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgbGlua19jYWNoZV9saXN0cyhzdHJ1Y3QgY2FjaGUgKnNtYWxsZXIsIHN0cnVjdCBjYWNoZSAqYmlnZ2VyKQoreworCXdoaWxlIChzbWFsbGVyLT5uZXh0X2xvY2FsKSB7CisJCWlmIChzbWFsbGVyLT5uZXh0X2xvY2FsID09IGJpZ2dlcikKKwkJCXJldHVybjsgLyogYWxyZWFkeSBsaW5rZWQgKi8KKwkJc21hbGxlciA9IHNtYWxsZXItPm5leHRfbG9jYWw7CisJfQorCisJc21hbGxlci0+bmV4dF9sb2NhbCA9IGJpZ2dlcjsKK30KKworc3RhdGljIHZvaWQgX19jcHVpbml0IGRvX3N1YnNpZGlhcnlfY2FjaGVzX2RlYnVnY2hlY2soc3RydWN0IGNhY2hlICpjYWNoZSkKK3sKKwlXQVJOX09OX09OQ0UoY2FjaGUtPmxldmVsICE9IDEpOworCVdBUk5fT05fT05DRShzdHJjbXAoY2FjaGUtPm9mbm9kZS0+dHlwZSwgImNwdSIpKTsKK30KKworc3RhdGljIHZvaWQgX19jcHVpbml0IGRvX3N1YnNpZGlhcnlfY2FjaGVzKHN0cnVjdCBjYWNoZSAqY2FjaGUpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpzdWJjYWNoZV9ub2RlOworCWludCBsZXZlbCA9IGNhY2hlLT5sZXZlbDsKKworCWRvX3N1YnNpZGlhcnlfY2FjaGVzX2RlYnVnY2hlY2soY2FjaGUpOworCisJd2hpbGUgKChzdWJjYWNoZV9ub2RlID0gb2ZfZmluZF9uZXh0X2NhY2hlX25vZGUoY2FjaGUtPm9mbm9kZSkpKSB7CisJCXN0cnVjdCBjYWNoZSAqc3ViY2FjaGU7CisKKwkJbGV2ZWwrKzsKKwkJc3ViY2FjaGUgPSBjYWNoZV9sb29rdXBfb3JfaW5zdGFudGlhdGUoc3ViY2FjaGVfbm9kZSwgbGV2ZWwpOworCQlvZl9ub2RlX3B1dChzdWJjYWNoZV9ub2RlKTsKKwkJaWYgKCFzdWJjYWNoZSkKKwkJCWJyZWFrOworCisJCWxpbmtfY2FjaGVfbGlzdHMoY2FjaGUsIHN1YmNhY2hlKTsKKwkJY2FjaGUgPSBzdWJjYWNoZTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2FjaGUgKl9fY3B1aW5pdCBjYWNoZV9jaGFpbl9pbnN0YW50aWF0ZSh1bnNpZ25lZCBpbnQgY3B1X2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY3B1X25vZGU7CisJc3RydWN0IGNhY2hlICpjcHVfY2FjaGUgPSBOVUxMOworCisJcHJfZGVidWcoImNyZWF0aW5nIGNhY2hlIG9iamVjdChzKSBmb3IgQ1BVICVpXG4iLCBjcHVfaWQpOworCisJY3B1X25vZGUgPSBvZl9nZXRfY3B1X25vZGUoY3B1X2lkLCBOVUxMKTsKKwlXQVJOX09OQ0UoIWNwdV9ub2RlLCAibm8gT0Ygbm9kZSBmb3VuZCBmb3IgQ1BVICVpXG4iLCBjcHVfaWQpOworCWlmICghY3B1X25vZGUpCisJCWdvdG8gb3V0OworCisJY3B1X2NhY2hlID0gY2FjaGVfbG9va3VwX29yX2luc3RhbnRpYXRlKGNwdV9ub2RlLCAxKTsKKwlpZiAoIWNwdV9jYWNoZSkKKwkJZ290byBvdXQ7CisKKwlkb19zdWJzaWRpYXJ5X2NhY2hlcyhjcHVfY2FjaGUpOworCisJY2FjaGVfY3B1X3NldChjcHVfY2FjaGUsIGNwdV9pZCk7CitvdXQ6CisJb2Zfbm9kZV9wdXQoY3B1X25vZGUpOworCisJcmV0dXJuIGNwdV9jYWNoZTsKK30KKworc3RhdGljIHN0cnVjdCBjYWNoZV9kaXIgKl9fY3B1aW5pdCBjYWNoZWluZm9fY3JlYXRlX2NhY2hlX2Rpcih1bnNpZ25lZCBpbnQgY3B1X2lkKQoreworCXN0cnVjdCBjYWNoZV9kaXIgKmNhY2hlX2RpcjsKKwlzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2OworCXN0cnVjdCBrb2JqZWN0ICprb2JqID0gTlVMTDsKKworCXN5c2RldiA9IGdldF9jcHVfc3lzZGV2KGNwdV9pZCk7CisJV0FSTl9PTkNFKCFzeXNkZXYsICJubyBzeXNkZXYgZm9yIENQVSAlaVxuIiwgY3B1X2lkKTsKKwlpZiAoIXN5c2RldikKKwkJZ290byBlcnI7CisKKwlrb2JqID0ga29iamVjdF9jcmVhdGVfYW5kX2FkZCgiY2FjaGUiLCAmc3lzZGV2LT5rb2JqKTsKKwlpZiAoIWtvYmopCisJCWdvdG8gZXJyOworCisJY2FjaGVfZGlyID0ga3phbGxvYyhzaXplb2YoKmNhY2hlX2RpciksIEdGUF9LRVJORUwpOworCWlmICghY2FjaGVfZGlyKQorCQlnb3RvIGVycjsKKworCWNhY2hlX2Rpci0+a29iaiA9IGtvYmo7CisKKwlXQVJOX09OX09OQ0UocGVyX2NwdShjYWNoZV9kaXIsIGNwdV9pZCkgIT0gTlVMTCk7CisKKwlwZXJfY3B1KGNhY2hlX2RpciwgY3B1X2lkKSA9IGNhY2hlX2RpcjsKKworCXJldHVybiBjYWNoZV9kaXI7CitlcnI6CisJa29iamVjdF9wdXQoa29iaik7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGNhY2hlX2luZGV4X3JlbGVhc2Uoc3RydWN0IGtvYmplY3QgKmtvYmopCit7CisJc3RydWN0IGNhY2hlX2luZGV4X2RpciAqaW5kZXg7CisKKwlpbmRleCA9IGtvYmpfdG9fY2FjaGVfaW5kZXhfZGlyKGtvYmopOworCisJcHJfZGVidWcoImZyZWVpbmcgaW5kZXggZGlyZWN0b3J5IGZvciBMJWQgJXMgY2FjaGVcbiIsCisJCSBpbmRleC0+Y2FjaGUtPmxldmVsLCBjYWNoZV90eXBlX3N0cmluZyhpbmRleC0+Y2FjaGUpKTsKKworCWtmcmVlKGluZGV4KTsKK30KKworc3RhdGljIHNzaXplX3QgY2FjaGVfaW5kZXhfc2hvdyhzdHJ1Y3Qga29iamVjdCAqaywgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqa29ial9hdHRyOworCisJa29ial9hdHRyID0gY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSwgYXR0cik7CisKKwlyZXR1cm4ga29ial9hdHRyLT5zaG93KGssIGtvYmpfYXR0ciwgYnVmKTsKK30KKworc3RhdGljIHN0cnVjdCBjYWNoZSAqaW5kZXhfa29ial90b19jYWNoZShzdHJ1Y3Qga29iamVjdCAqaykKK3sKKwlzdHJ1Y3QgY2FjaGVfaW5kZXhfZGlyICppbmRleDsKKworCWluZGV4ID0ga29ial90b19jYWNoZV9pbmRleF9kaXIoayk7CisKKwlyZXR1cm4gaW5kZXgtPmNhY2hlOworfQorCitzdGF0aWMgc3NpemVfdCBzaXplX3Nob3coc3RydWN0IGtvYmplY3QgKmssIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXVuc2lnbmVkIGludCBzaXplX2tiOworCXN0cnVjdCBjYWNoZSAqY2FjaGU7CisKKwljYWNoZSA9IGluZGV4X2tvYmpfdG9fY2FjaGUoayk7CisKKwlpZiAoY2FjaGVfc2l6ZV9rYihjYWNoZSwgJnNpemVfa2IpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1S1xuIiwgc2l6ZV9rYik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgY2FjaGVfc2l6ZV9hdHRyID0KKwlfX0FUVFIoc2l6ZSwgMDQ0NCwgc2l6ZV9zaG93LCBOVUxMKTsKKworCitzdGF0aWMgc3NpemVfdCBsaW5lX3NpemVfc2hvdyhzdHJ1Y3Qga29iamVjdCAqaywgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJdW5zaWduZWQgaW50IGxpbmVfc2l6ZTsKKwlzdHJ1Y3QgY2FjaGUgKmNhY2hlOworCisJY2FjaGUgPSBpbmRleF9rb2JqX3RvX2NhY2hlKGspOworCisJaWYgKGNhY2hlX2dldF9saW5lX3NpemUoY2FjaGUsICZsaW5lX3NpemUpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBsaW5lX3NpemUpOworfQorCitzdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIGNhY2hlX2xpbmVfc2l6ZV9hdHRyID0KKwlfX0FUVFIoY29oZXJlbmN5X2xpbmVfc2l6ZSwgMDQ0NCwgbGluZV9zaXplX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBucl9zZXRzX3Nob3coc3RydWN0IGtvYmplY3QgKmssIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXVuc2lnbmVkIGludCBucl9zZXRzOworCXN0cnVjdCBjYWNoZSAqY2FjaGU7CisKKwljYWNoZSA9IGluZGV4X2tvYmpfdG9fY2FjaGUoayk7CisKKwlpZiAoY2FjaGVfbnJfc2V0cyhjYWNoZSwgJm5yX3NldHMpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBucl9zZXRzKTsKK30KKworc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBjYWNoZV9ucl9zZXRzX2F0dHIgPQorCV9fQVRUUihudW1iZXJfb2Zfc2V0cywgMDQ0NCwgbnJfc2V0c19zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgYXNzb2NpYXRpdml0eV9zaG93KHN0cnVjdCBrb2JqZWN0ICprLCBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwl1bnNpZ25lZCBpbnQgYXNzb2NpYXRpdml0eTsKKwlzdHJ1Y3QgY2FjaGUgKmNhY2hlOworCisJY2FjaGUgPSBpbmRleF9rb2JqX3RvX2NhY2hlKGspOworCisJaWYgKGNhY2hlX2Fzc29jaWF0aXZpdHkoY2FjaGUsICZhc3NvY2lhdGl2aXR5KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgYXNzb2NpYXRpdml0eSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgY2FjaGVfYXNzb2NfYXR0ciA9CisJX19BVFRSKHdheXNfb2ZfYXNzb2NpYXRpdml0eSwgMDQ0NCwgYXNzb2NpYXRpdml0eV9zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgdHlwZV9zaG93KHN0cnVjdCBrb2JqZWN0ICprLCBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgY2FjaGUgKmNhY2hlOworCisJY2FjaGUgPSBpbmRleF9rb2JqX3RvX2NhY2hlKGspOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIGNhY2hlX3R5cGVfc3RyaW5nKGNhY2hlKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgY2FjaGVfdHlwZV9hdHRyID0KKwlfX0FUVFIodHlwZSwgMDQ0NCwgdHlwZV9zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgbGV2ZWxfc2hvdyhzdHJ1Y3Qga29iamVjdCAqaywgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGNhY2hlX2luZGV4X2RpciAqaW5kZXg7CisJc3RydWN0IGNhY2hlICpjYWNoZTsKKworCWluZGV4ID0ga29ial90b19jYWNoZV9pbmRleF9kaXIoayk7CisJY2FjaGUgPSBpbmRleC0+Y2FjaGU7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgY2FjaGUtPmxldmVsKTsKK30KKworc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBjYWNoZV9sZXZlbF9hdHRyID0KKwlfX0FUVFIobGV2ZWwsIDA0NDQsIGxldmVsX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBzaGFyZWRfY3B1X21hcF9zaG93KHN0cnVjdCBrb2JqZWN0ICprLCBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgY2FjaGVfaW5kZXhfZGlyICppbmRleDsKKwlzdHJ1Y3QgY2FjaGUgKmNhY2hlOworCWludCBsZW47CisJaW50IG4gPSAwOworCisJaW5kZXggPSBrb2JqX3RvX2NhY2hlX2luZGV4X2RpcihrKTsKKwljYWNoZSA9IGluZGV4LT5jYWNoZTsKKwlsZW4gPSBQQUdFX1NJWkUgLSAyOworCisJaWYgKGxlbiA+IDEpIHsKKwkJbiA9IGNwdW1hc2tfc2NucHJpbnRmKGJ1ZiwgbGVuLCAmY2FjaGUtPnNoYXJlZF9jcHVfbWFwKTsKKwkJYnVmW24rK10gPSAnXG4nOworCQlidWZbbl0gPSAnXDAnOworCX0KKwlyZXR1cm4gbjsKK30KKworc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBjYWNoZV9zaGFyZWRfY3B1X21hcF9hdHRyID0KKwlfX0FUVFIoc2hhcmVkX2NwdV9tYXAsIDA0NDQsIHNoYXJlZF9jcHVfbWFwX3Nob3csIE5VTEwpOworCisvKiBBdHRyaWJ1dGVzIHdoaWNoIHNob3VsZCBhbHdheXMgYmUgY3JlYXRlZCAtLSB0aGUga29iamVjdC9zeXNmcyBjb3JlCisgKiBkb2VzIHRoaXMgYXV0b21hdGljYWxseSB2aWEga29ial90eXBlLT5kZWZhdWx0X2F0dHJzLiAgVGhpcyBpcyB0aGUKKyAqIG1pbmltdW0gZGF0YSByZXF1aXJlZCB0byB1bmlxdWVseSBpZGVudGlmeSBhIGNhY2hlLgorICovCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqY2FjaGVfaW5kZXhfZGVmYXVsdF9hdHRyc1tdID0geworCSZjYWNoZV90eXBlX2F0dHIuYXR0ciwKKwkmY2FjaGVfbGV2ZWxfYXR0ci5hdHRyLAorCSZjYWNoZV9zaGFyZWRfY3B1X21hcF9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKKy8qIEF0dHJpYnV0ZXMgd2hpY2ggc2hvdWxkIGJlIGNyZWF0ZWQgaWYgdGhlIGNhY2hlIGRldmljZSBub2RlIGhhcyB0aGUKKyAqIHJpZ2h0IHByb3BlcnRpZXMgLS0gc2VlIGNhY2hlaW5mb19jcmVhdGVfaW5kZXhfb3B0X2F0dHJzCisgKi8KK3N0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmNhY2hlX2luZGV4X29wdF9hdHRyc1tdID0geworCSZjYWNoZV9zaXplX2F0dHIsCisJJmNhY2hlX2xpbmVfc2l6ZV9hdHRyLAorCSZjYWNoZV9ucl9zZXRzX2F0dHIsCisJJmNhY2hlX2Fzc29jX2F0dHIsCit9OworCitzdGF0aWMgc3RydWN0IHN5c2ZzX29wcyBjYWNoZV9pbmRleF9vcHMgPSB7CisJLnNob3cgPSBjYWNoZV9pbmRleF9zaG93LAorfTsKKworc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgY2FjaGVfaW5kZXhfdHlwZSA9IHsKKwkucmVsZWFzZSA9IGNhY2hlX2luZGV4X3JlbGVhc2UsCisJLnN5c2ZzX29wcyA9ICZjYWNoZV9pbmRleF9vcHMsCisJLmRlZmF1bHRfYXR0cnMgPSBjYWNoZV9pbmRleF9kZWZhdWx0X2F0dHJzLAorfTsKKworc3RhdGljIHZvaWQgX19jcHVpbml0IGNhY2hlaW5mb19jcmVhdGVfaW5kZXhfb3B0X2F0dHJzKHN0cnVjdCBjYWNoZV9pbmRleF9kaXIgKmRpcikKK3sKKwljb25zdCBjaGFyICpjYWNoZV9uYW1lOworCWNvbnN0IGNoYXIgKmNhY2hlX3R5cGU7CisJc3RydWN0IGNhY2hlICpjYWNoZTsKKwljaGFyICpidWY7CisJaW50IGk7CisKKwlidWYgPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCXJldHVybjsKKworCWNhY2hlID0gZGlyLT5jYWNoZTsKKwljYWNoZV9uYW1lID0gY2FjaGUtPm9mbm9kZS0+ZnVsbF9uYW1lOworCWNhY2hlX3R5cGUgPSBjYWNoZV90eXBlX3N0cmluZyhjYWNoZSk7CisKKwkvKiBXZSBkb24ndCB3YW50IHRvIGNyZWF0ZSBhbiBhdHRyaWJ1dGUgdGhhdCBjYW4ndCBwcm92aWRlIGEKKwkgKiBtZWFuaW5nZnVsIHZhbHVlLiAgQ2hlY2sgdGhlIHJldHVybiB2YWx1ZSBvZiBlYWNoIG9wdGlvbmFsCisJICogYXR0cmlidXRlJ3MgLT5zaG93IG1ldGhvZCBiZWZvcmUgcmVnaXN0ZXJpbmcgdGhlCisJICogYXR0cmlidXRlLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNhY2hlX2luZGV4X29wdF9hdHRycyk7IGkrKykgeworCQlzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHI7CisJCXNzaXplX3QgcmM7CisKKwkJYXR0ciA9IGNhY2hlX2luZGV4X29wdF9hdHRyc1tpXTsKKworCQlyYyA9IGF0dHItPnNob3coJmRpci0+a29iaiwgYXR0ciwgYnVmKTsKKwkJaWYgKHJjIDw9IDApIHsKKwkJCXByX2RlYnVnKCJub3QgY3JlYXRpbmcgJXMgYXR0cmlidXRlIGZvciAiCisJCQkJICIlcyglcykgKHJjID0gJXpkKVxuIiwKKwkJCQkgYXR0ci0+YXR0ci5uYW1lLCBjYWNoZV9uYW1lLAorCQkJCSBjYWNoZV90eXBlLCByYyk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoc3lzZnNfY3JlYXRlX2ZpbGUoJmRpci0+a29iaiwgJmF0dHItPmF0dHIpKQorCQkJcHJfZGVidWcoImNvdWxkIG5vdCBjcmVhdGUgJXMgYXR0cmlidXRlIGZvciAlcyglcylcbiIsCisJCQkJIGF0dHItPmF0dHIubmFtZSwgY2FjaGVfbmFtZSwgY2FjaGVfdHlwZSk7CisJfQorCisJa2ZyZWUoYnVmKTsKK30KKworc3RhdGljIHZvaWQgX19jcHVpbml0IGNhY2hlaW5mb19jcmVhdGVfaW5kZXhfZGlyKHN0cnVjdCBjYWNoZSAqY2FjaGUsIGludCBpbmRleCwgc3RydWN0IGNhY2hlX2RpciAqY2FjaGVfZGlyKQoreworCXN0cnVjdCBjYWNoZV9pbmRleF9kaXIgKmluZGV4X2RpcjsKKwlpbnQgcmM7CisKKwlpbmRleF9kaXIgPSBremFsbG9jKHNpemVvZigqaW5kZXhfZGlyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmRleF9kaXIpCisJCWdvdG8gZXJyOworCisJaW5kZXhfZGlyLT5jYWNoZSA9IGNhY2hlOworCisJcmMgPSBrb2JqZWN0X2luaXRfYW5kX2FkZCgmaW5kZXhfZGlyLT5rb2JqLCAmY2FjaGVfaW5kZXhfdHlwZSwKKwkJCQkgIGNhY2hlX2Rpci0+a29iaiwgImluZGV4JWQiLCBpbmRleCk7CisJaWYgKHJjKQorCQlnb3RvIGVycjsKKworCWluZGV4X2Rpci0+bmV4dCA9IGNhY2hlX2Rpci0+aW5kZXg7CisJY2FjaGVfZGlyLT5pbmRleCA9IGluZGV4X2RpcjsKKworCWNhY2hlaW5mb19jcmVhdGVfaW5kZXhfb3B0X2F0dHJzKGluZGV4X2Rpcik7CisKKwlyZXR1cm47CitlcnI6CisJa2ZyZWUoaW5kZXhfZGlyKTsKK30KKworc3RhdGljIHZvaWQgX19jcHVpbml0IGNhY2hlaW5mb19zeXNmc19wb3B1bGF0ZSh1bnNpZ25lZCBpbnQgY3B1X2lkLCBzdHJ1Y3QgY2FjaGUgKmNhY2hlX2xpc3QpCit7CisJc3RydWN0IGNhY2hlX2RpciAqY2FjaGVfZGlyOworCXN0cnVjdCBjYWNoZSAqY2FjaGU7CisJaW50IGluZGV4ID0gMDsKKworCWNhY2hlX2RpciA9IGNhY2hlaW5mb19jcmVhdGVfY2FjaGVfZGlyKGNwdV9pZCk7CisJaWYgKCFjYWNoZV9kaXIpCisJCXJldHVybjsKKworCWNhY2hlID0gY2FjaGVfbGlzdDsKKwl3aGlsZSAoY2FjaGUpIHsKKwkJY2FjaGVpbmZvX2NyZWF0ZV9pbmRleF9kaXIoY2FjaGUsIGluZGV4LCBjYWNoZV9kaXIpOworCQlpbmRleCsrOworCQljYWNoZSA9IGNhY2hlLT5uZXh0X2xvY2FsOworCX0KK30KKwordm9pZCBfX2NwdWluaXQgY2FjaGVpbmZvX2NwdV9vbmxpbmUodW5zaWduZWQgaW50IGNwdV9pZCkKK3sKKwlzdHJ1Y3QgY2FjaGUgKmNhY2hlOworCisJY2FjaGUgPSBjYWNoZV9jaGFpbl9pbnN0YW50aWF0ZShjcHVfaWQpOworCWlmICghY2FjaGUpCisJCXJldHVybjsKKworCWNhY2hlaW5mb19zeXNmc19wb3B1bGF0ZShjcHVfaWQsIGNhY2hlKTsKK30KKworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVSAvKiBmdW5jdGlvbnMgbmVlZGVkIGZvciBjcHUgb2ZmbGluZSAqLworCitzdGF0aWMgc3RydWN0IGNhY2hlICpjYWNoZV9sb29rdXBfYnlfY3B1KHVuc2lnbmVkIGludCBjcHVfaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpjcHVfbm9kZTsKKwlzdHJ1Y3QgY2FjaGUgKmNhY2hlOworCisJY3B1X25vZGUgPSBvZl9nZXRfY3B1X25vZGUoY3B1X2lkLCBOVUxMKTsKKwlXQVJOX09OQ0UoIWNwdV9ub2RlLCAibm8gT0Ygbm9kZSBmb3VuZCBmb3IgQ1BVICVpXG4iLCBjcHVfaWQpOworCWlmICghY3B1X25vZGUpCisJCXJldHVybiBOVUxMOworCisJY2FjaGUgPSBjYWNoZV9sb29rdXBfYnlfbm9kZShjcHVfbm9kZSk7CisJb2Zfbm9kZV9wdXQoY3B1X25vZGUpOworCisJcmV0dXJuIGNhY2hlOworfQorCitzdGF0aWMgdm9pZCByZW1vdmVfaW5kZXhfZGlycyhzdHJ1Y3QgY2FjaGVfZGlyICpjYWNoZV9kaXIpCit7CisJc3RydWN0IGNhY2hlX2luZGV4X2RpciAqaW5kZXg7CisKKwlpbmRleCA9IGNhY2hlX2Rpci0+aW5kZXg7CisKKwl3aGlsZSAoaW5kZXgpIHsKKwkJc3RydWN0IGNhY2hlX2luZGV4X2RpciAqbmV4dDsKKworCQluZXh0ID0gaW5kZXgtPm5leHQ7CisJCWtvYmplY3RfcHV0KCZpbmRleC0+a29iaik7CisJCWluZGV4ID0gbmV4dDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZV9jYWNoZV9kaXIoc3RydWN0IGNhY2hlX2RpciAqY2FjaGVfZGlyKQoreworCXJlbW92ZV9pbmRleF9kaXJzKGNhY2hlX2Rpcik7CisKKwlrb2JqZWN0X3B1dChjYWNoZV9kaXItPmtvYmopOworCisJa2ZyZWUoY2FjaGVfZGlyKTsKK30KKworc3RhdGljIHZvaWQgY2FjaGVfY3B1X2NsZWFyKHN0cnVjdCBjYWNoZSAqY2FjaGUsIGludCBjcHUpCit7CisJd2hpbGUgKGNhY2hlKSB7CisJCXN0cnVjdCBjYWNoZSAqbmV4dCA9IGNhY2hlLT5uZXh0X2xvY2FsOworCisJCVdBUk5fT05DRSghY3B1bWFza190ZXN0X2NwdShjcHUsICZjYWNoZS0+c2hhcmVkX2NwdV9tYXApLAorCQkJICAiQ1BVICVpIG5vdCBhY2NvdW50ZWQgaW4gJXMoJXMpXG4iLAorCQkJICBjcHUsIGNhY2hlLT5vZm5vZGUtPmZ1bGxfbmFtZSwKKwkJCSAgY2FjaGVfdHlwZV9zdHJpbmcoY2FjaGUpKTsKKworCQljcHVtYXNrX2NsZWFyX2NwdShjcHUsICZjYWNoZS0+c2hhcmVkX2NwdV9tYXApOworCisJCS8qIFJlbGVhc2UgdGhlIGNhY2hlIG9iamVjdCBpZiBhbGwgdGhlIGNwdXMgdXNpbmcgaXQKKwkJICogYXJlIG9mZmxpbmUgKi8KKwkJaWYgKGNwdW1hc2tfZW1wdHkoJmNhY2hlLT5zaGFyZWRfY3B1X21hcCkpCisJCQlyZWxlYXNlX2NhY2hlKGNhY2hlKTsKKworCQljYWNoZSA9IG5leHQ7CisJfQorfQorCit2b2lkIGNhY2hlaW5mb19jcHVfb2ZmbGluZSh1bnNpZ25lZCBpbnQgY3B1X2lkKQoreworCXN0cnVjdCBjYWNoZV9kaXIgKmNhY2hlX2RpcjsKKwlzdHJ1Y3QgY2FjaGUgKmNhY2hlOworCisJLyogUHJldmVudCB1c2Vyc3BhY2UgZnJvbSBzZWVpbmcgaW5jb25zaXN0ZW50IHN0YXRlIC0gcmVtb3ZlCisJICogdGhlIHN5c2ZzIGhpZXJhcmNoeSBmaXJzdCAqLworCWNhY2hlX2RpciA9IHBlcl9jcHUoY2FjaGVfZGlyLCBjcHVfaWQpOworCisJLyogY2FyZWZ1bCwgc3lzZnMgcG9wdWxhdGlvbiBtYXkgaGF2ZSBmYWlsZWQgKi8KKwlpZiAoY2FjaGVfZGlyKQorCQlyZW1vdmVfY2FjaGVfZGlyKGNhY2hlX2Rpcik7CisKKwlwZXJfY3B1KGNhY2hlX2RpciwgY3B1X2lkKSA9IE5VTEw7CisKKwkvKiBjbGVhciB0aGUgQ1BVJ3MgYml0IGluIGl0cyBjYWNoZSBjaGFpbiwgcG9zc2libHkgZnJlZWluZworCSAqIGNhY2hlIG9iamVjdHMgKi8KKwljYWNoZSA9IGNhY2hlX2xvb2t1cF9ieV9jcHUoY3B1X2lkKTsKKwlpZiAoY2FjaGUpCisJCWNhY2hlX2NwdV9jbGVhcihjYWNoZSwgY3B1X2lkKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY2FjaGVpbmZvLmggYi9hcmNoL3Bvd2VycGMva2VybmVsL2NhY2hlaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3Yjc0ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NhY2hlaW5mby5oCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBfUFBDX0NBQ0hFSU5GT19ICisjZGVmaW5lIF9QUENfQ0FDSEVJTkZPX0gKKworLyogVGhlc2UgYXJlIGp1c3QgaG9va3MgZm9yIHN5c2ZzLmMgdG8gdXNlLiAqLworZXh0ZXJuIHZvaWQgY2FjaGVpbmZvX2NwdV9vbmxpbmUodW5zaWduZWQgaW50IGNwdV9pZCk7CitleHRlcm4gdm9pZCBjYWNoZWluZm9fY3B1X29mZmxpbmUodW5zaWduZWQgaW50IGNwdV9pZCk7CisKKyNlbmRpZiAvKiBfUFBDX0NBQ0hFSU5GT19IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2twcm9iZXMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwva3Byb2Jlcy5jCmluZGV4IGRlNzk5MTUuLmM5MzI5NzggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwva3Byb2Jlcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwva3Byb2Jlcy5jCkBAIC05Niw5ICs5NiwxMCBAQAogCiB2b2lkIF9fa3Byb2JlcyBhcmNoX3JlbW92ZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKLQltdXRleF9sb2NrKCZrcHJvYmVfbXV0ZXgpOwotCWZyZWVfaW5zbl9zbG90KHAtPmFpbnNuLmluc24sIDApOwotCW11dGV4X3VubG9jaygma3Byb2JlX211dGV4KTsKKwlpZiAocC0+YWluc24uaW5zbikgeworCQlmcmVlX2luc25fc2xvdChwLT5haW5zbi5pbnNuLCAwKTsKKwkJcC0+YWluc24uaW5zbiA9IE5VTEw7CisJfQogfQogCiBzdGF0aWMgdm9pZCBfX2twcm9iZXMgcHJlcGFyZV9zaW5nbGVzdGVwKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQpAQCAtMzE2LDcgKzMxNyw3IEBACiAJLyoKIAkgKiBJdCBpcyBwb3NzaWJsZSB0byBoYXZlIG11bHRpcGxlIGluc3RhbmNlcyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbgogCSAqIHRhc2sgZWl0aGVyIGJlY2F1c2UgYW4gbXVsdGlwbGUgZnVuY3Rpb25zIGluIHRoZSBjYWxsIHBhdGgKLQkgKiBoYXZlIGEgcmV0dXJuIHByb2JlIGluc3RhbGxlZCBvbiB0aGVtLCBhbmQvb3IgbW9yZSB0aGVuIG9uZSByZXR1cm4KKwkgKiBoYXZlIGEgcmV0dXJuIHByb2JlIGluc3RhbGxlZCBvbiB0aGVtLCBhbmQvb3IgbW9yZSB0aGFuIG9uZSByZXR1cm4KIAkgKiByZXR1cm4gcHJvYmUgd2FzIHJlZ2lzdGVyZWQgZm9yIGEgdGFyZ2V0IGZ1bmN0aW9uLgogCSAqCiAJICogV2UgY2FuIGhhbmRsZSB0aGlzIGJlY2F1c2U6CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaS1jb21tb24uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpLWNvbW1vbi5jCmluZGV4IDI1MzgwMzAuLmRhNWEzODUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpLWNvbW1vbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpLWNvbW1vbi5jCkBAIC0xNiw3ICsxNiw3IEBACiAgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKLSN1bmRlZiBERUJVRworI2RlZmluZSBERUJVRwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CkBAIC0xMzU2LDYgKzEzNTYsNjMgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIF9faW5pdCBwY2liaW9zX3Jlc2VydmVfbGVnYWN5X3JlZ2lvbnMoc3RydWN0IHBjaV9idXMgKmJ1cykKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwY2lfYnVzX3RvX2hvc3QoYnVzKTsKKwlyZXNvdXJjZV9zaXplX3QJb2Zmc2V0OworCXN0cnVjdCByZXNvdXJjZSAqcmVzLCAqcHJlczsKKwlpbnQgaTsKKworCXByX2RlYnVnKCJSZXNlcnZpbmcgbGVnYWN5IHJhbmdlcyBmb3IgZG9tYWluICUwNHhcbiIsIHBjaV9kb21haW5fbnIoYnVzKSk7CisKKwkvKiBDaGVjayBmb3IgSU8gKi8KKwlpZiAoIShob3NlLT5pb19yZXNvdXJjZS5mbGFncyAmIElPUkVTT1VSQ0VfSU8pKQorCQlnb3RvIG5vX2lvOworCW9mZnNldCA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtIF9JT19CQVNFOworCXJlcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSksIEdGUF9LRVJORUwpOworCUJVR19PTihyZXMgPT0gTlVMTCk7CisJcmVzLT5uYW1lID0gIkxlZ2FjeSBJTyI7CisJcmVzLT5mbGFncyA9IElPUkVTT1VSQ0VfSU87CisJcmVzLT5zdGFydCA9IG9mZnNldDsKKwlyZXMtPmVuZCA9IChvZmZzZXQgKyAweGZmZikgJiAweGZmZmZmZmZmdWw7CisJcHJfZGVidWcoIkNhbmRpZGF0ZSBsZWdhY3kgSU86ICVwUlxuIiwgcmVzKTsKKwlpZiAocmVxdWVzdF9yZXNvdXJjZSgmaG9zZS0+aW9fcmVzb3VyY2UsIHJlcykpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICJQQ0kgJTA0eDolMDJ4IENhbm5vdCByZXNlcnZlIExlZ2FjeSBJTyAlcFJcbiIsCisJCSAgICAgICBwY2lfZG9tYWluX25yKGJ1cyksIGJ1cy0+bnVtYmVyLCByZXMpOworCQlrZnJlZShyZXMpOworCX0KKworIG5vX2lvOgorCS8qIENoZWNrIGZvciBtZW1vcnkgKi8KKwlvZmZzZXQgPSBob3NlLT5wY2lfbWVtX29mZnNldDsKKwlwcl9kZWJ1ZygiaG9zZSBtZW0gb2Zmc2V0OiAlMDE2bGx4XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKW9mZnNldCk7CisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlwcmVzID0gJmhvc2UtPm1lbV9yZXNvdXJjZXNbaV07CisJCWlmICghKHByZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pKQorCQkJY29udGludWU7CisJCXByX2RlYnVnKCJob3NlIG1lbSByZXM6ICVwUlxuIiwgcHJlcyk7CisJCWlmICgocHJlcy0+c3RhcnQgLSBvZmZzZXQpIDw9IDB4YTAwMDAgJiYKKwkJICAgIChwcmVzLT5lbmQgLSBvZmZzZXQpID49IDB4YmZmZmYpCisJCQlicmVhazsKKwl9CisJaWYgKGkgPj0gMykKKwkJcmV0dXJuOworCXJlcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSksIEdGUF9LRVJORUwpOworCUJVR19PTihyZXMgPT0gTlVMTCk7CisJcmVzLT5uYW1lID0gIkxlZ2FjeSBWR0EgbWVtb3J5IjsKKwlyZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9NRU07CisJcmVzLT5zdGFydCA9IDB4YTAwMDAgKyBvZmZzZXQ7CisJcmVzLT5lbmQgPSAweGJmZmZmICsgb2Zmc2V0OworCXByX2RlYnVnKCJDYW5kaWRhdGUgVkdBIG1lbW9yeTogJXBSXG4iLCByZXMpOworCWlmIChyZXF1ZXN0X3Jlc291cmNlKHByZXMsIHJlcykpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICJQQ0kgJTA0eDolMDJ4IENhbm5vdCByZXNlcnZlIFZHQSBtZW1vcnkgJXBSXG4iLAorCQkgICAgICAgcGNpX2RvbWFpbl9ucihidXMpLCBidXMtPm51bWJlciwgcmVzKTsKKwkJa2ZyZWUocmVzKTsKKwl9Cit9CisKIHZvaWQgX19pbml0IHBjaWJpb3NfcmVzb3VyY2Vfc3VydmV5KHZvaWQpCiB7CiAJc3RydWN0IHBjaV9idXMgKmI7CkBAIC0xMzcxLDYgKzE0MjgsMTggQEAKIAkJcGNpYmlvc19hbGxvY2F0ZV9yZXNvdXJjZXMoMSk7CiAJfQogCisJLyogQmVmb3JlIHdlIHN0YXJ0IGFzc2lnbmluZyB1bmFzc2lnbmVkIHJlc291cmNlLCB3ZSB0cnkgdG8gcmVzZXJ2ZQorCSAqIHRoZSBsb3cgSU8gYXJlYSBhbmQgdGhlIFZHQSBtZW1vcnkgYXJlYSBpZiB0aGV5IGludGVyc2VjdCB0aGUKKwkgKiBidXMgYXZhaWxhYmxlIHJlc291cmNlcyB0byBhdm9pZCBhbGxvY2F0aW5nIHRoaW5ncyBvbiB0b3Agb2YgdGhlbQorCSAqLworCWlmICghKHBwY19wY2lfZmxhZ3MgJiBQUENfUENJX1BST0JFX09OTFkpKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoYiwgJnBjaV9yb290X2J1c2VzLCBub2RlKQorCQkJcGNpYmlvc19yZXNlcnZlX2xlZ2FjeV9yZWdpb25zKGIpOworCX0KKworCS8qIE5vdywgaWYgdGhlIHBsYXRmb3JtIGRpZG4ndCBkZWNpZGUgdG8gYmxpbmRseSB0cnVzdCB0aGUgZmlybXdhcmUsCisJICogd2UgcHJvY2VlZCB0byBhc3NpZ25pbmcgdGhpbmdzIHRoYXQgd2VyZSBsZWZ0IHVuYXNzaWduZWQKKwkgKi8KIAlpZiAoIShwcGNfcGNpX2ZsYWdzICYgUFBDX1BDSV9QUk9CRV9PTkxZKSkgewogCQlwcl9kZWJ1ZygiUENJOiBBc3NpZ25pbmcgdW5hc3NpZ25lZCByZXNvdWNlcy4uLlxuIik7CiAJCXBjaV9hc3NpZ25fdW5hc3NpZ25lZF9yZXNvdXJjZXMoKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzY0LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV82NC5jCmluZGV4IDM5ZmFkYzYuLjU4Njk2MmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfNjQuYwpAQCAtNTYwLDkgKzU2MCwxNCBAQAogCSAqIEc1IG1hY2hpbmVzLi4uIFNvIHdoZW4gc29tZXRoaW5nIGFza3MgZm9yIGJ1cyAwIGlvIGJhc2UKIAkgKiAoYnVzIDAgaXMgSFQgcm9vdCksIHdlIHJldHVybiB0aGUgQUdQIG9uZSBpbnN0ZWFkLgogCSAqLwotCWlmIChtYWNoaW5lX2lzX2NvbXBhdGlibGUoIk1hY1JJU0M0IikpCi0JCWlmIChpbl9idXMgPT0gMCkKKwlpZiAoaW5fYnVzID09IDAgJiYgbWFjaGluZV9pc19jb21wYXRpYmxlKCJNYWNSSVNDNCIpKSB7CisJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqYWdwOworCisJCWFncCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJ1My1hZ3AiKTsKKwkJaWYgKGFncCkKIAkJCWluX2J1cyA9IDB4ZjA7CisJCW9mX25vZGVfcHV0KGFncCk7CisJfQogCiAJLyogVGhhdCBzeXNjYWxsIGlzbid0IHF1aXRlIGNvbXBhdGlibGUgd2l0aCBQQ0kgZG9tYWlucywgYnV0IGl0J3MKIAkgKiB1c2VkIG9uIHByZS1kb21haW5zIHNldHVwLiBXZSByZXR1cm4gdGhlIGZpcnN0IG1hdGNoCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BwY19rc3ltcy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcGNfa3N5bXMuYwppbmRleCBkY2VjMTMyLi5jOGIyN2JiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3BwY19rc3ltcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHBjX2tzeW1zLmMKQEAgLTE2NSw2ICsxNjUsNyBAQAogRVhQT1JUX1NZTUJPTChpcnFfZGVzYyk7CiBFWFBPUlRfU1lNQk9MKHRiX3RpY2tzX3Blcl9qaWZmeSk7CiBFWFBPUlRfU1lNQk9MKGNhY2hlYWJsZV9tZW1jcHkpOworRVhQT1JUX1NZTUJPTChjYWNoZWFibGVfbWVtemVybyk7CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19QUEMzMgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb20uYwppbmRleCA2ZjczYzczLi5jMDljZmZhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb20uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb20uYwpAQCAtODI0LDExICs4MjQsMTEgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0tFWEVDCi0JbHByb3AgPSAodTY0KilvZl9nZXRfZmxhdF9kdF9wcm9wKG5vZGUsICJsaW51eCxjcmFzaGtlcm5lbC1iYXNlIiwgTlVMTCk7CisJbHByb3AgPSBvZl9nZXRfZmxhdF9kdF9wcm9wKG5vZGUsICJsaW51eCxjcmFzaGtlcm5lbC1iYXNlIiwgTlVMTCk7CiAJaWYgKGxwcm9wKQogCQljcmFzaGtfcmVzLnN0YXJ0ID0gKmxwcm9wOwogCi0JbHByb3AgPSAodTY0KilvZl9nZXRfZmxhdF9kdF9wcm9wKG5vZGUsICJsaW51eCxjcmFzaGtlcm5lbC1zaXplIiwgTlVMTCk7CisJbHByb3AgPSBvZl9nZXRfZmxhdF9kdF9wcm9wKG5vZGUsICJsaW51eCxjcmFzaGtlcm5lbC1zaXplIiwgTlVMTCk7CiAJaWYgKGxwcm9wKQogCQljcmFzaGtfcmVzLmVuZCA9IGNyYXNoa19yZXMuc3RhcnQgKyAqbHByb3AgLSAxOwogI2VuZGlmCkBAIC04OTMsMTIgKzg5MywxMiBAQAogCXU2NCBiYXNlLCBzaXplLCBsbWJfc2l6ZTsKIAl1bnNpZ25lZCBpbnQgaXNfa2V4ZWNfa2R1bXAgPSAwLCBybmdzOwogCi0JbHMgPSAoY2VsbF90ICopb2ZfZ2V0X2ZsYXRfZHRfcHJvcChub2RlLCAiaWJtLGxtYi1zaXplIiwgJmwpOworCWxzID0gb2ZfZ2V0X2ZsYXRfZHRfcHJvcChub2RlLCAiaWJtLGxtYi1zaXplIiwgJmwpOwogCWlmIChscyA9PSBOVUxMIHx8IGwgPCBkdF9yb290X3NpemVfY2VsbHMgKiBzaXplb2YoY2VsbF90KSkKIAkJcmV0dXJuIDA7CiAJbG1iX3NpemUgPSBkdF9tZW1fbmV4dF9jZWxsKGR0X3Jvb3Rfc2l6ZV9jZWxscywgJmxzKTsKIAotCWRtID0gKGNlbGxfdCAqKW9mX2dldF9mbGF0X2R0X3Byb3Aobm9kZSwgImlibSxkeW5hbWljLW1lbW9yeSIsICZsKTsKKwlkbSA9IG9mX2dldF9mbGF0X2R0X3Byb3Aobm9kZSwgImlibSxkeW5hbWljLW1lbW9yeSIsICZsKTsKIAlpZiAoZG0gPT0gTlVMTCB8fCBsIDwgc2l6ZW9mKGNlbGxfdCkpCiAJCXJldHVybiAwOwogCkBAIC05MDcsNyArOTA3LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAkvKiBjaGVjayBpZiB0aGlzIGlzIGEga2V4ZWMva2R1bXAga2VybmVsLiAqLwotCXVzbSA9IChjZWxsX3QgKilvZl9nZXRfZmxhdF9kdF9wcm9wKG5vZGUsICJsaW51eCxkcmNvbmYtdXNhYmxlLW1lbW9yeSIsCisJdXNtID0gb2ZfZ2V0X2ZsYXRfZHRfcHJvcChub2RlLCAibGludXgsZHJjb25mLXVzYWJsZS1tZW1vcnkiLAogCQkJCQkJICZsKTsKIAlpZiAodXNtICE9IE5VTEwpCiAJCWlzX2tleGVjX2tkdW1wID0gMTsKQEAgLTk4MSw5ICs5ODEsOSBAQAogCX0gZWxzZSBpZiAoc3RyY21wKHR5cGUsICJtZW1vcnkiKSAhPSAwKQogCQlyZXR1cm4gMDsKIAotCXJlZyA9IChjZWxsX3QgKilvZl9nZXRfZmxhdF9kdF9wcm9wKG5vZGUsICJsaW51eCx1c2FibGUtbWVtb3J5IiwgJmwpOworCXJlZyA9IG9mX2dldF9mbGF0X2R0X3Byb3Aobm9kZSwgImxpbnV4LHVzYWJsZS1tZW1vcnkiLCAmbCk7CiAJaWYgKHJlZyA9PSBOVUxMKQotCQlyZWcgPSAoY2VsbF90ICopb2ZfZ2V0X2ZsYXRfZHRfcHJvcChub2RlLCAicmVnIiwgJmwpOworCQlyZWcgPSBvZl9nZXRfZmxhdF9kdF9wcm9wKG5vZGUsICJyZWciLCAmbCk7CiAJaWYgKHJlZyA9PSBOVUxMKQogCQlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX2luaXQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9pbml0LmMKaW5kZXggMjQ0NTk0NS4uN2YxYjMzZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX2luaXQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21faW5pdC5jCkBAIC0xMjEwLDcgKzEyMTAsNyBAQAogCQkvKiBJbml0aWFsaXplIHRoZSB0YWJsZSB0byBoYXZlIGEgb25lLXRvLW9uZSBtYXBwaW5nCiAJCSAqIG92ZXIgdGhlIGFsbG9jYXRlZCBzaXplLgogCQkgKi8KLQkJdGNlX2VudHJ5cCA9ICh1bnNpZ25lZCBsb25nICopYmFzZTsKKwkJdGNlX2VudHJ5cCA9ICh1NjQgKiliYXNlOwogCQlmb3IgKGkgPSAwOyBpIDwgKG1pbnNpemUgPj4gMykgO3RjZV9lbnRyeXArKywgaSsrKSB7CiAJCQl0Y2VfZW50cnkgPSAoaSA8PCBQQUdFX1NISUZUKTsKIAkJCXRjZV9lbnRyeSB8PSAweDM7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21fcGFyc2UuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9wYXJzZS5jCmluZGV4IDhjMTMzNTUuLjhmMDg1NmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9wYXJzZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9wYXJzZS5jCkBAIC0yMzIsMTEgKzIzMiw2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChvZl9wY2lfYWRkcmVzc190b19yZXNvdXJjZSk7CiAKLXN0YXRpYyB1OCBvZl9pcnFfcGNpX3N3aXp6bGUodTggc2xvdCwgdTggcGluKQotewotCXJldHVybiAoKChwaW4gLSAxKSArIHNsb3QpICUgNCkgKyAxOwotfQotCiBpbnQgb2ZfaXJxX21hcF9wY2koc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBvZl9pcnEgKm91dF9pcnEpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpkbiwgKnBwbm9kZTsKQEAgLTMwNiw3ICszMDEsNyBAQAogCQkvKiBXZSBjYW4gb25seSBnZXQgaGVyZSBpZiB3ZSBoaXQgYSBQMlAgYnJpZGdlIHdpdGggbm8gbm9kZSwKIAkJICogbGV0J3MgZG8gc3RhbmRhcmQgc3dpenpsaW5nIGFuZCB0cnkgYWdhaW4KIAkJICovCi0JCWxzcGVjID0gb2ZfaXJxX3BjaV9zd2l6emxlKFBDSV9TTE9UKHBkZXYtPmRldmZuKSwgbHNwZWMpOworCQlsc3BlYyA9IHBjaV9zd2l6emxlX2ludGVycnVwdF9waW4ocGRldiwgbHNwZWMpOwogCQlwZGV2ID0gcHBkZXY7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3N5c2ZzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3N5c2ZzLmMKaW5kZXggMGM2NGYxMC4uNGEyZWUwOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zeXNmcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3lzZnMuYwpAQCAtMTgsNiArMTgsOCBAQAogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiAjaW5jbHVkZSA8YXNtL3NtcC5oPgogCisjaW5jbHVkZSAiY2FjaGVpbmZvLmgiCisKICNpZmRlZiBDT05GSUdfUFBDNjQKICNpbmNsdWRlIDxhc20vcGFjYS5oPgogI2luY2x1ZGUgPGFzbS9scHBhY2EuaD4KQEAgLTI1LDggKzI3LDYgQEAKIAogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjcHUsIGNwdV9kZXZpY2VzKTsKIAotc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBrb2JqZWN0ICosIGNhY2hlX3RvcGxldmVsKTsKLQogLyoKICAqIFNNVCBzbm9vemUgZGVsYXkgc3R1ZmYsIDY0LWJpdCBvbmx5IGZvciBub3cKICAqLwpAQCAtMzQzLDI4MyArMzQzLDYgQEAKICNlbmRpZiAvKiBIQVNfUFBDX1BNQ19QQTZUICovCiAjZW5kaWYgLyogSEFTX1BQQ19QTUNfQ0xBU1NJQyAqLwogCi1zdHJ1Y3QgY2FjaGVfZGVzYyB7Ci0Jc3RydWN0IGtvYmplY3Qga29iajsKLQlzdHJ1Y3QgY2FjaGVfZGVzYyAqbmV4dDsKLQljb25zdCBjaGFyICp0eXBlOwkvKiBJbnN0cnVjdGlvbiwgRGF0YSwgb3IgVW5pZmllZCAqLwotCXUzMiBzaXplOwkJLyogdG90YWwgY2FjaGUgc2l6ZSBpbiBLQiAqLwotCXUzMiBsaW5lX3NpemU7CQkvKiBpbiBieXRlcyAqLwotCXUzMiBucl9zZXRzOwkJLyogbnVtYmVyIG9mIHNldHMgKi8KLQl1MzIgbGV2ZWw7CQkvKiBlLmcuIDEsIDIsIDMuLi4gKi8KLQl1MzIgYXNzb2NpYXRpdml0eTsJLyogZS5nLiA4LXdheS4uLiAwIGlzIGZ1bGx5IGFzc29jaWF0aXZlICovCi19OwotCi1ERUZJTkVfUEVSX0NQVShzdHJ1Y3QgY2FjaGVfZGVzYyAqLCBjYWNoZV9kZXNjKTsKLQotc3RhdGljIHN0cnVjdCBjYWNoZV9kZXNjICprb2JqX3RvX2NhY2hlX2Rlc2Moc3RydWN0IGtvYmplY3QgKmspCi17Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZihrLCBzdHJ1Y3QgY2FjaGVfZGVzYywga29iaik7Ci19Ci0KLXN0YXRpYyB2b2lkIGNhY2hlX2Rlc2NfcmVsZWFzZShzdHJ1Y3Qga29iamVjdCAqaykKLXsKLQlzdHJ1Y3QgY2FjaGVfZGVzYyAqZGVzYyA9IGtvYmpfdG9fY2FjaGVfZGVzYyhrKTsKLQotCXByX2RlYnVnKCIlczogcmVsZWFzaW5nICVzXG4iLCBfX2Z1bmNfXywga29iamVjdF9uYW1lKGspKTsKLQotCWlmIChkZXNjLT5uZXh0KQotCQlrb2JqZWN0X3B1dCgmZGVzYy0+bmV4dC0+a29iaik7Ci0KLQlrZnJlZShrb2JqX3RvX2NhY2hlX2Rlc2MoaykpOwotfQotCi1zdGF0aWMgc3NpemVfdCBjYWNoZV9kZXNjX3Nob3coc3RydWN0IGtvYmplY3QgKmssIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmtvYmpfYXR0cjsKLQotCWtvYmpfYXR0ciA9IGNvbnRhaW5lcl9vZihhdHRyLCBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUsIGF0dHIpOwotCi0JcmV0dXJuIGtvYmpfYXR0ci0+c2hvdyhrLCBrb2JqX2F0dHIsIGJ1Zik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3lzZnNfb3BzIGNhY2hlX2Rlc2Nfc3lzZnNfb3BzID0gewotCS5zaG93ID0gY2FjaGVfZGVzY19zaG93LAotfTsKLQotc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgY2FjaGVfZGVzY190eXBlID0gewotCS5yZWxlYXNlID0gY2FjaGVfZGVzY19yZWxlYXNlLAotCS5zeXNmc19vcHMgPSAmY2FjaGVfZGVzY19zeXNmc19vcHMsCi19OwotCi1zdGF0aWMgc3NpemVfdCBjYWNoZV9zaXplX3Nob3coc3RydWN0IGtvYmplY3QgKmssIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBjYWNoZV9kZXNjICpjYWNoZSA9IGtvYmpfdG9fY2FjaGVfZGVzYyhrKTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1S1xuIiwgY2FjaGUtPnNpemUpOwotfQotCi1zdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIGNhY2hlX3NpemVfYXR0ciA9Ci0JX19BVFRSKHNpemUsIDA0NDQsIGNhY2hlX3NpemVfc2hvdywgTlVMTCk7Ci0KLXN0YXRpYyBzc2l6ZV90IGNhY2hlX2xpbmVfc2l6ZV9zaG93KHN0cnVjdCBrb2JqZWN0ICprLCBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgY2FjaGVfZGVzYyAqY2FjaGUgPSBrb2JqX3RvX2NhY2hlX2Rlc2Moayk7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgY2FjaGUtPmxpbmVfc2l6ZSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgY2FjaGVfbGluZV9zaXplX2F0dHIgPQotCV9fQVRUUihjb2hlcmVuY3lfbGluZV9zaXplLCAwNDQ0LCBjYWNoZV9saW5lX3NpemVfc2hvdywgTlVMTCk7Ci0KLXN0YXRpYyBzc2l6ZV90IGNhY2hlX25yX3NldHNfc2hvdyhzdHJ1Y3Qga29iamVjdCAqaywgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGNhY2hlX2Rlc2MgKmNhY2hlID0ga29ial90b19jYWNoZV9kZXNjKGspOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGNhY2hlLT5ucl9zZXRzKTsKLX0KLQotc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBjYWNoZV9ucl9zZXRzX2F0dHIgPQotCV9fQVRUUihudW1iZXJfb2Zfc2V0cywgMDQ0NCwgY2FjaGVfbnJfc2V0c19zaG93LCBOVUxMKTsKLQotc3RhdGljIHNzaXplX3QgY2FjaGVfdHlwZV9zaG93KHN0cnVjdCBrb2JqZWN0ICprLCBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgY2FjaGVfZGVzYyAqY2FjaGUgPSBrb2JqX3RvX2NhY2hlX2Rlc2Moayk7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgY2FjaGUtPnR5cGUpOwotfQotCi1zdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIGNhY2hlX3R5cGVfYXR0ciA9Ci0JX19BVFRSKHR5cGUsIDA0NDQsIGNhY2hlX3R5cGVfc2hvdywgTlVMTCk7Ci0KLXN0YXRpYyBzc2l6ZV90IGNhY2hlX2xldmVsX3Nob3coc3RydWN0IGtvYmplY3QgKmssIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBjYWNoZV9kZXNjICpjYWNoZSA9IGtvYmpfdG9fY2FjaGVfZGVzYyhrKTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBjYWNoZS0+bGV2ZWwpOwotfQotCi1zdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIGNhY2hlX2xldmVsX2F0dHIgPQotCV9fQVRUUihsZXZlbCwgMDQ0NCwgY2FjaGVfbGV2ZWxfc2hvdywgTlVMTCk7Ci0KLXN0YXRpYyBzc2l6ZV90IGNhY2hlX2Fzc29jX3Nob3coc3RydWN0IGtvYmplY3QgKmssIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBjYWNoZV9kZXNjICpjYWNoZSA9IGtvYmpfdG9fY2FjaGVfZGVzYyhrKTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBjYWNoZS0+YXNzb2NpYXRpdml0eSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgY2FjaGVfYXNzb2NfYXR0ciA9Ci0JX19BVFRSKHdheXNfb2ZfYXNzb2NpYXRpdml0eSwgMDQ0NCwgY2FjaGVfYXNzb2Nfc2hvdywgTlVMTCk7Ci0KLXN0cnVjdCBjYWNoZV9kZXNjX2luZm8gewotCWNvbnN0IGNoYXIgKnR5cGU7Ci0JY29uc3QgY2hhciAqc2l6ZV9wcm9wOwotCWNvbnN0IGNoYXIgKmxpbmVfc2l6ZV9wcm9wOwotCWNvbnN0IGNoYXIgKm5yX3NldHNfcHJvcDsKLX07Ci0KLS8qIFBvd2VyUEMgUHJvY2Vzc29yIGJpbmRpbmcgc2F5cyB0aGUgW2RpXS1jYWNoZS0qIG11c3QgYmUgZXF1YWwgb24KLSAqIHVuaWZpZWQgY2FjaGVzLCBzbyBqdXN0IHVzZSBkLWNhY2hlIHByb3BlcnRpZXMuICovCi1zdGF0aWMgc3RydWN0IGNhY2hlX2Rlc2NfaW5mbyB1Y2FjaGVfaW5mbyA9IHsKLQkudHlwZSA9ICJVbmlmaWVkIiwKLQkuc2l6ZV9wcm9wID0gImQtY2FjaGUtc2l6ZSIsCi0JLmxpbmVfc2l6ZV9wcm9wID0gImQtY2FjaGUtbGluZS1zaXplIiwKLQkubnJfc2V0c19wcm9wID0gImQtY2FjaGUtc2V0cyIsCi19OwotCi1zdGF0aWMgc3RydWN0IGNhY2hlX2Rlc2NfaW5mbyBkY2FjaGVfaW5mbyA9IHsKLQkudHlwZSA9ICJEYXRhIiwKLQkuc2l6ZV9wcm9wID0gImQtY2FjaGUtc2l6ZSIsCi0JLmxpbmVfc2l6ZV9wcm9wID0gImQtY2FjaGUtbGluZS1zaXplIiwKLQkubnJfc2V0c19wcm9wID0gImQtY2FjaGUtc2V0cyIsCi19OwotCi1zdGF0aWMgc3RydWN0IGNhY2hlX2Rlc2NfaW5mbyBpY2FjaGVfaW5mbyA9IHsKLQkudHlwZSA9ICJJbnN0cnVjdGlvbiIsCi0JLnNpemVfcHJvcCA9ICJpLWNhY2hlLXNpemUiLAotCS5saW5lX3NpemVfcHJvcCA9ICJpLWNhY2hlLWxpbmUtc2l6ZSIsCi0JLm5yX3NldHNfcHJvcCA9ICJpLWNhY2hlLXNldHMiLAotfTsKLQotc3RhdGljIHN0cnVjdCBjYWNoZV9kZXNjICogX19jcHVpbml0IGNyZWF0ZV9jYWNoZV9kZXNjKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIHN0cnVjdCBrb2JqZWN0ICpwYXJlbnQsIGludCBpbmRleCwgaW50IGxldmVsLCBzdHJ1Y3QgY2FjaGVfZGVzY19pbmZvICppbmZvKQotewotCWNvbnN0IHUzMiAqY2FjaGVfbGluZV9zaXplOwotCXN0cnVjdCBjYWNoZV9kZXNjICpuZXc7Ci0JY29uc3QgdTMyICpjYWNoZV9zaXplOwotCWNvbnN0IHUzMiAqbnJfc2V0czsKLQlpbnQgcmM7Ci0KLQluZXcgPSBremFsbG9jKHNpemVvZigqbmV3KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFuZXcpCi0JCXJldHVybiBOVUxMOwotCi0JcmMgPSBrb2JqZWN0X2luaXRfYW5kX2FkZCgmbmV3LT5rb2JqLCAmY2FjaGVfZGVzY190eXBlLCBwYXJlbnQsCi0JCQkJICAiaW5kZXglZCIsIGluZGV4KTsKLQlpZiAocmMpCi0JCWdvdG8gZXJyOwotCi0JLyogdHlwZSAqLwotCW5ldy0+dHlwZSA9IGluZm8tPnR5cGU7Ci0JcmMgPSBzeXNmc19jcmVhdGVfZmlsZSgmbmV3LT5rb2JqLCAmY2FjaGVfdHlwZV9hdHRyLmF0dHIpOwotCVdBUk5fT04ocmMpOwotCi0JLyogbGV2ZWwgKi8KLQluZXctPmxldmVsID0gbGV2ZWw7Ci0JcmMgPSBzeXNmc19jcmVhdGVfZmlsZSgmbmV3LT5rb2JqLCAmY2FjaGVfbGV2ZWxfYXR0ci5hdHRyKTsKLQlXQVJOX09OKHJjKTsKLQotCS8qIHNpemUgKi8KLQljYWNoZV9zaXplID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCBpbmZvLT5zaXplX3Byb3AsIE5VTEwpOwotCWlmIChjYWNoZV9zaXplKSB7Ci0JCW5ldy0+c2l6ZSA9ICpjYWNoZV9zaXplIC8gMTAyNDsKLQkJcmMgPSBzeXNmc19jcmVhdGVfZmlsZSgmbmV3LT5rb2JqLAotCQkJCSAgICAgICAmY2FjaGVfc2l6ZV9hdHRyLmF0dHIpOwotCQlXQVJOX09OKHJjKTsKLQl9Ci0KLQkvKiBjb2hlcmVuY3lfbGluZV9zaXplICovCi0JY2FjaGVfbGluZV9zaXplID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCBpbmZvLT5saW5lX3NpemVfcHJvcCwgTlVMTCk7Ci0JaWYgKGNhY2hlX2xpbmVfc2l6ZSkgewotCQluZXctPmxpbmVfc2l6ZSA9ICpjYWNoZV9saW5lX3NpemU7Ci0JCXJjID0gc3lzZnNfY3JlYXRlX2ZpbGUoJm5ldy0+a29iaiwKLQkJCQkgICAgICAgJmNhY2hlX2xpbmVfc2l6ZV9hdHRyLmF0dHIpOwotCQlXQVJOX09OKHJjKTsKLQl9Ci0KLQkvKiBudW1iZXJfb2Zfc2V0cyAqLwotCW5yX3NldHMgPSBvZl9nZXRfcHJvcGVydHkobnAsIGluZm8tPm5yX3NldHNfcHJvcCwgTlVMTCk7Ci0JaWYgKG5yX3NldHMpIHsKLQkJbmV3LT5ucl9zZXRzID0gKm5yX3NldHM7Ci0JCXJjID0gc3lzZnNfY3JlYXRlX2ZpbGUoJm5ldy0+a29iaiwKLQkJCQkgICAgICAgJmNhY2hlX25yX3NldHNfYXR0ci5hdHRyKTsKLQkJV0FSTl9PTihyYyk7Ci0JfQotCi0JLyogd2F5c19vZl9hc3NvY2lhdGl2aXR5ICovCi0JaWYgKG5ldy0+bnJfc2V0cyA9PSAxKSB7Ci0JCS8qIGZ1bGx5IGFzc29jaWF0aXZlICovCi0JCW5ldy0+YXNzb2NpYXRpdml0eSA9IDA7Ci0JCWdvdG8gY3JlYXRlX2Fzc29jOwotCX0KLQotCWlmIChuZXctPm5yX3NldHMgJiYgbmV3LT5zaXplICYmIG5ldy0+bGluZV9zaXplKSB7Ci0JCS8qIElmIHdlIGhhdmUgdmFsdWVzIGZvciBhbGwgb2YgdGhlc2Ugd2UgY2FuIGRlcml2ZQotCQkgKiB0aGUgYXNzb2NpYXRpdml0eS4gKi8KLQkJbmV3LT5hc3NvY2lhdGl2aXR5ID0KLQkJCSgobmV3LT5zaXplICogMTAyNCkgLyBuZXctPm5yX3NldHMpIC8gbmV3LT5saW5lX3NpemU7Ci1jcmVhdGVfYXNzb2M6Ci0JCXJjID0gc3lzZnNfY3JlYXRlX2ZpbGUoJm5ldy0+a29iaiwKLQkJCQkgICAgICAgJmNhY2hlX2Fzc29jX2F0dHIuYXR0cik7Ci0JCVdBUk5fT04ocmMpOwotCX0KLQotCXJldHVybiBuZXc7Ci1lcnI6Ci0Ja2ZyZWUobmV3KTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGJvb2wgY2FjaGVfaXNfdW5pZmllZChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQotewotCXJldHVybiBvZl9nZXRfcHJvcGVydHkobnAsICJjYWNoZS11bmlmaWVkIiwgTlVMTCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2FjaGVfZGVzYyAqIF9fY3B1aW5pdCBjcmVhdGVfY2FjaGVfaW5kZXhfaW5mbyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBzdHJ1Y3Qga29iamVjdCAqcGFyZW50LCBpbnQgaW5kZXgsIGludCBsZXZlbCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5leHRfY2FjaGU7Ci0Jc3RydWN0IGNhY2hlX2Rlc2MgKm5ldywgKiplbmQ7Ci0KLQlwcl9kZWJ1ZygiJXMobm9kZSA9ICVzLCBpbmRleCA9ICVkKVxuIiwgX19mdW5jX18sIG5wLT5mdWxsX25hbWUsIGluZGV4KTsKLQotCWlmIChjYWNoZV9pc191bmlmaWVkKG5wKSkgewotCQluZXcgPSBjcmVhdGVfY2FjaGVfZGVzYyhucCwgcGFyZW50LCBpbmRleCwgbGV2ZWwsCi0JCQkJCSZ1Y2FjaGVfaW5mbyk7Ci0JfSBlbHNlIHsKLQkJbmV3ID0gY3JlYXRlX2NhY2hlX2Rlc2MobnAsIHBhcmVudCwgaW5kZXgsIGxldmVsLAotCQkJCQkmZGNhY2hlX2luZm8pOwotCQlpZiAobmV3KSB7Ci0JCQlpbmRleCsrOwotCQkJbmV3LT5uZXh0ID0gY3JlYXRlX2NhY2hlX2Rlc2MobnAsIHBhcmVudCwgaW5kZXgsIGxldmVsLAotCQkJCQkJICAgICAgJmljYWNoZV9pbmZvKTsKLQkJfQotCX0KLQlpZiAoIW5ldykKLQkJcmV0dXJuIE5VTEw7Ci0KLQllbmQgPSAmbmV3LT5uZXh0OwotCXdoaWxlICgqZW5kKQotCQllbmQgPSAmKCplbmQpLT5uZXh0OwotCi0JbmV4dF9jYWNoZSA9IG9mX2ZpbmRfbmV4dF9jYWNoZV9ub2RlKG5wKTsKLQlpZiAoIW5leHRfY2FjaGUpCi0JCWdvdG8gb3V0OwotCi0JKmVuZCA9IGNyZWF0ZV9jYWNoZV9pbmRleF9pbmZvKG5leHRfY2FjaGUsIHBhcmVudCwgKytpbmRleCwgKytsZXZlbCk7Ci0KLQlvZl9ub2RlX3B1dChuZXh0X2NhY2hlKTsKLW91dDoKLQlyZXR1cm4gbmV3OwotfQotCi1zdGF0aWMgdm9pZCBfX2NwdWluaXQgY3JlYXRlX2NhY2hlX2luZm8oc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldikKLXsKLQlzdHJ1Y3Qga29iamVjdCAqY2FjaGVfdG9wbGV2ZWw7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucCA9IE5VTEw7Ci0JaW50IGNwdSA9IHN5c2Rldi0+aWQ7Ci0KLQljYWNoZV90b3BsZXZlbCA9IGtvYmplY3RfY3JlYXRlX2FuZF9hZGQoImNhY2hlIiwgJnN5c2Rldi0+a29iaik7Ci0JaWYgKCFjYWNoZV90b3BsZXZlbCkKLQkJcmV0dXJuOwotCXBlcl9jcHUoY2FjaGVfdG9wbGV2ZWwsIGNwdSkgPSBjYWNoZV90b3BsZXZlbDsKLQlucCA9IG9mX2dldF9jcHVfbm9kZShjcHUsIE5VTEwpOwotCWlmIChucCAhPSBOVUxMKSB7Ci0JCXBlcl9jcHUoY2FjaGVfZGVzYywgY3B1KSA9Ci0JCQljcmVhdGVfY2FjaGVfaW5kZXhfaW5mbyhucCwgY2FjaGVfdG9wbGV2ZWwsIDAsIDEpOwotCQlvZl9ub2RlX3B1dChucCk7Ci0JfQotCXJldHVybjsKLX0KLQogc3RhdGljIHZvaWQgX19jcHVpbml0IHJlZ2lzdGVyX2NwdV9vbmxpbmUodW5zaWduZWQgaW50IGNwdSkKIHsKIAlzdHJ1Y3QgY3B1ICpjID0gJnBlcl9jcHUoY3B1X2RldmljZXMsIGNwdSk7CkBAIC02ODQsMjUgKzQwNywxMCBAQAogCQlzeXNkZXZfY3JlYXRlX2ZpbGUocywgJmF0dHJfZHNjcik7CiAjZW5kaWYgLyogQ09ORklHX1BQQzY0ICovCiAKLQljcmVhdGVfY2FjaGVfaW5mbyhzKTsKKwljYWNoZWluZm9fY3B1X29ubGluZShjcHUpOwogfQogCiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi1zdGF0aWMgdm9pZCByZW1vdmVfY2FjaGVfaW5mbyhzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2KQotewotCXN0cnVjdCBrb2JqZWN0ICpjYWNoZV90b3BsZXZlbDsKLQlzdHJ1Y3QgY2FjaGVfZGVzYyAqY2FjaGVfZGVzYzsKLQlpbnQgY3B1ID0gc3lzZGV2LT5pZDsKLQotCWNhY2hlX2Rlc2MgPSBwZXJfY3B1KGNhY2hlX2Rlc2MsIGNwdSk7Ci0JaWYgKGNhY2hlX2Rlc2MgIT0gTlVMTCkKLQkJa29iamVjdF9wdXQoJmNhY2hlX2Rlc2MtPmtvYmopOwotCi0JY2FjaGVfdG9wbGV2ZWwgPSBwZXJfY3B1KGNhY2hlX3RvcGxldmVsLCBjcHUpOwotCWlmIChjYWNoZV90b3BsZXZlbCAhPSBOVUxMKQotCQlrb2JqZWN0X3B1dChjYWNoZV90b3BsZXZlbCk7Ci19Ci0KIHN0YXRpYyB2b2lkIHVucmVnaXN0ZXJfY3B1X29ubGluZSh1bnNpZ25lZCBpbnQgY3B1KQogewogCXN0cnVjdCBjcHUgKmMgPSAmcGVyX2NwdShjcHVfZGV2aWNlcywgY3B1KTsKQEAgLTc2OSw3ICs0NzcsNyBAQAogCQlzeXNkZXZfcmVtb3ZlX2ZpbGUocywgJmF0dHJfZHNjcik7CiAjZW5kaWYgLyogQ09ORklHX1BQQzY0ICovCiAKLQlyZW1vdmVfY2FjaGVfaW5mbyhzKTsKKwljYWNoZWluZm9fY3B1X29mZmxpbmUoY3B1KTsKIH0KICNlbmRpZiAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2h1Z2V0bGJwYWdlLmMgYi9hcmNoL3Bvd2VycGMvbW0vaHVnZXRsYnBhZ2UuYwppbmRleCAyMDFjN2E1Li45OTIwZDZhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vaHVnZXRsYnBhZ2UuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vaHVnZXRsYnBhZ2UuYwpAQCAtNTEyLDYgKzUxMiwxMyBAQAogCXJldHVybiBzbGljZV9nZXRfdW5tYXBwZWRfYXJlYShhZGRyLCBsZW4sIGZsYWdzLCBtbXVfcHNpemUsIDEsIDApOwogfQogCit1bnNpZ25lZCBsb25nIHZtYV9tbXVfcGFnZXNpemUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJdW5zaWduZWQgaW50IHBzaXplID0gZ2V0X3NsaWNlX3BzaXplKHZtYS0+dm1fbW0sIHZtYS0+dm1fc3RhcnQpOworCisJcmV0dXJuIDFVTCA8PCBtbXVfcHNpemVfdG9fc2hpZnQocHNpemUpOworfQorCiAvKgogICogQ2FsbGVkIGJ5IGFzbSBoYXNodGFibGUuUyBmb3IgZG9pbmcgbGF6eSBpY2FjaGUgZmx1c2gKICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL21lbS5jIGIvYXJjaC9wb3dlcnBjL21tL21lbS5jCmluZGV4IDUzYjA2ZWIuLmYwMGYwOWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9tZW0uYworKysgYi9hcmNoL3Bvd2VycGMvbW0vbWVtLmMKQEAgLTEzMiw3ICsxMzIsNyBAQAogCS8qIHRoaXMgc2hvdWxkIHdvcmsgZm9yIG1vc3Qgbm9uLWhpZ2htZW0gcGxhdGZvcm1zICovCiAJem9uZSA9IHBnZGF0YS0+bm9kZV96b25lczsKIAotCXJldHVybiBfX2FkZF9wYWdlcyh6b25lLCBzdGFydF9wZm4sIG5yX3BhZ2VzKTsKKwlyZXR1cm4gX19hZGRfcGFnZXMobmlkLCB6b25lLCBzdGFydF9wZm4sIG5yX3BhZ2VzKTsKIH0KICNlbmRpZiAvKiBDT05GSUdfTUVNT1JZX0hPVFBMVUcgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL21tdV9kZWNsLmggYi9hcmNoL3Bvd2VycGMvbW0vbW11X2RlY2wuaAppbmRleCA0MzE0YjM5Li5hZDEyM2JjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vbW11X2RlY2wuaAorKysgYi9hcmNoL3Bvd2VycGMvbW0vbW11X2RlY2wuaApAQCAtMzAsMTEgKzMwLDExIEBACiAjaWYgZGVmaW5lZChDT05GSUdfNDB4KSB8fCBkZWZpbmVkKENPTkZJR184eHgpCiBzdGF0aWMgaW5saW5lIHZvaWQgX3RsYmlsX2FsbCh2b2lkKQogewotCWFzbSB2b2xhdGlsZSAoInN5bmM7IHRsYmlhOyBpc3luYyIgOiA6IDogIm1lbW9yeSIpCisJYXNtIHZvbGF0aWxlICgic3luYzsgdGxiaWE7IGlzeW5jIiA6IDogOiAibWVtb3J5Iik7CiB9CiBzdGF0aWMgaW5saW5lIHZvaWQgX3RsYmlsX3BpZCh1bnNpZ25lZCBpbnQgcGlkKQogewotCWFzbSB2b2xhdGlsZSAoInN5bmM7IHRsYmlhOyBpc3luYyIgOiA6IDogIm1lbW9yeSIpCisJYXNtIHZvbGF0aWxlICgic3luYzsgdGxiaWE7IGlzeW5jIiA6IDogOiAibWVtb3J5Iik7CiB9CiAjZWxzZSAvKiBDT05GSUdfNDB4IHx8IENPTkZJR184eHggKi8KIGV4dGVybiB2b2lkIF90bGJpbF9hbGwodm9pZCk7CkBAIC00Nyw3ICs0Nyw3IEBACiAjaWZkZWYgQ09ORklHXzh4eAogc3RhdGljIGlubGluZSB2b2lkIF90bGJpbF92YSh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGludCBwaWQpCiB7Ci0JYXNtIHZvbGF0aWxlICgidGxiaWUgJTA7IHN5bmMiIDogOiAiciIgKGFkZHJlc3MpIDogIm1lbW9yeSIpCisJYXNtIHZvbGF0aWxlICgidGxiaWUgJTA7IHN5bmMiIDogOiAiciIgKGFkZHJlc3MpIDogIm1lbW9yeSIpOwogfQogI2Vsc2UgLyogQ09ORklHXzh4eCAqLwogZXh0ZXJuIHZvaWQgX3RsYmlsX3ZhKHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgaW50IHBpZCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vbnVtYS5jIGIvYXJjaC9wb3dlcnBjL21tL251bWEuYwppbmRleCBjZjgxMDQ5Li43MzkzYmQ3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vbnVtYS5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9udW1hLmMKQEAgLTgyMiw0MiArODIyLDUwIEBACiAgKiByZXF1aXJlZC4gbmlkIGlzIHRoZSBwcmVmZXJyZWQgbm9kZSBhbmQgZW5kIGlzIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mCiAgKiB0aGUgaGlnaGVzdCBhZGRyZXNzIGluIHRoZSBub2RlLgogICoKLSAqIFJldHVybnMgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeS4KKyAqIFJldHVybnMgdGhlIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgbWVtb3J5LgogICovCi1zdGF0aWMgdm9pZCBfX2luaXQgKmNhcmVmdWxfYWxsb2NhdGlvbihpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHNpemUsCitzdGF0aWMgdm9pZCBfX2luaXQgKmNhcmVmdWxfemFsbG9jYXRpb24oaW50IG5pZCwgdW5zaWduZWQgbG9uZyBzaXplLAogCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFsaWduLAogCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGVuZF9wZm4pCiB7CisJdm9pZCAqcmV0OwogCWludCBuZXdfbmlkOwotCXVuc2lnbmVkIGxvbmcgcmV0ID0gX19sbWJfYWxsb2NfYmFzZShzaXplLCBhbGlnbiwgZW5kX3BmbiA8PCBQQUdFX1NISUZUKTsKKwl1bnNpZ25lZCBsb25nIHJldF9wYWRkcjsKKworCXJldF9wYWRkciA9IF9fbG1iX2FsbG9jX2Jhc2Uoc2l6ZSwgYWxpZ24sIGVuZF9wZm4gPDwgUEFHRV9TSElGVCk7CiAKIAkvKiByZXRyeSBvdmVyIGFsbCBtZW1vcnkgKi8KLQlpZiAoIXJldCkKLQkJcmV0ID0gX19sbWJfYWxsb2NfYmFzZShzaXplLCBhbGlnbiwgbG1iX2VuZF9vZl9EUkFNKCkpOworCWlmICghcmV0X3BhZGRyKQorCQlyZXRfcGFkZHIgPSBfX2xtYl9hbGxvY19iYXNlKHNpemUsIGFsaWduLCBsbWJfZW5kX29mX0RSQU0oKSk7CiAKLQlpZiAoIXJldCkKLQkJcGFuaWMoIm51bWEuYzogY2Fubm90IGFsbG9jYXRlICVsdSBieXRlcyBvbiBub2RlICVkIiwKKwlpZiAoIXJldF9wYWRkcikKKwkJcGFuaWMoIm51bWEuYzogY2Fubm90IGFsbG9jYXRlICVsdSBieXRlcyBmb3Igbm9kZSAlZCIsCiAJCSAgICAgIHNpemUsIG5pZCk7CiAKKwlyZXQgPSBfX3ZhKHJldF9wYWRkcik7CisKIAkvKgotCSAqIElmIHRoZSBtZW1vcnkgY2FtZSBmcm9tIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQgbm9kZSwgd2UgbXVzdAotCSAqIHJldHJ5IHdpdGggdGhlIGJvb3RtZW0gYWxsb2NhdG9yLgorCSAqIFdlIGluaXRpYWxpemUgdGhlIG5vZGVzIGluIG51bWVyaWMgb3JkZXI6IDAsIDEsIDIuLi4KKwkgKiBhbmQgaGFuZCBvdmVyIGNvbnRyb2wgZnJvbSB0aGUgTE1CIGFsbG9jYXRvciB0byB0aGUKKwkgKiBib290bWVtIGFsbG9jYXRvci4gIElmIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvcgorCSAqIG5vZGUgNSwgdGhlbiB3ZSBrbm93IHRoYXQgYWxsIG5vZGVzIDw1IGFyZSB1c2luZyB0aGUKKwkgKiBib290bWVtIGFsbG9jYXRvciBpbnN0ZWFkIG9mIHRoZSBMTUIgYWxsb2NhdG9yLgorCSAqCisJICogU28sIGNoZWNrIHRoZSBuaWQgZnJvbSB3aGljaCB0aGlzIGFsbG9jYXRpb24gY2FtZQorCSAqIGFuZCBkb3VibGUgY2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgdG8gdXNlIGJvb3RtZW0KKwkgKiBpbnN0ZWFkIG9mIHRoZSBMTUIuICBXZSBkb24ndCBmcmVlIHRoZSBMTUIgbWVtb3J5CisJICogc2luY2UgaXQgd291bGQgYmUgdXNlbGVzcy4KIAkgKi8KLQluZXdfbmlkID0gZWFybHlfcGZuX3RvX25pZChyZXQgPj4gUEFHRV9TSElGVCk7CisJbmV3X25pZCA9IGVhcmx5X3Bmbl90b19uaWQocmV0X3BhZGRyID4+IFBBR0VfU0hJRlQpOwogCWlmIChuZXdfbmlkIDwgbmlkKSB7Ci0JCXJldCA9ICh1bnNpZ25lZCBsb25nKV9fYWxsb2NfYm9vdG1lbV9ub2RlKE5PREVfREFUQShuZXdfbmlkKSwKKwkJcmV0ID0gX19hbGxvY19ib290bWVtX25vZGUoTk9ERV9EQVRBKG5ld19uaWQpLAogCQkJCXNpemUsIGFsaWduLCAwKTsKIAotCQlpZiAoIXJldCkKLQkJCXBhbmljKCJudW1hLmM6IGNhbm5vdCBhbGxvY2F0ZSAlbHUgYnl0ZXMgb24gbm9kZSAlZCIsCi0JCQkgICAgICBzaXplLCBuZXdfbmlkKTsKLQotCQlyZXQgPSBfX3BhKHJldCk7Ci0KLQkJZGJnKCJhbGxvY19ib290bWVtICVseCAlbHhcbiIsIHJldCwgc2l6ZSk7CisJCWRiZygiYWxsb2NfYm9vdG1lbSAlcCAlbHhcbiIsIHJldCwgc2l6ZSk7CiAJfQogCi0JcmV0dXJuICh2b2lkICopcmV0OworCW1lbXNldChyZXQsIDAsIHNpemUpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgX19jcHVpbml0ZGF0YSBwcGM2NF9udW1hX25iID0gewpAQCAtOTUyLDcgKzk2MCw3IEBACiAKIAlmb3JfZWFjaF9vbmxpbmVfbm9kZShuaWQpIHsKIAkJdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIGVuZF9wZm47Ci0JCXVuc2lnbmVkIGxvbmcgYm9vdG1lbV9wYWRkcjsKKwkJdm9pZCAqYm9vdG1lbV92YWRkcjsKIAkJdW5zaWduZWQgbG9uZyBib290bWFwX3BhZ2VzOwogCiAJCWdldF9wZm5fcmFuZ2VfZm9yX25pZChuaWQsICZzdGFydF9wZm4sICZlbmRfcGZuKTsKQEAgLTk2NCwxMSArOTcyLDkgQEAKIAkJICogcHJldmlvdXMgbm9kZXMnIGJvb3RtZW0gdG8gYmUgaW5pdGlhbGl6ZWQgYW5kIGhhdmUKIAkJICogYWxsIHJlc2VydmVkIGFyZWFzIG1hcmtlZC4KIAkJICovCi0JCU5PREVfREFUQShuaWQpID0gY2FyZWZ1bF9hbGxvY2F0aW9uKG5pZCwKKwkJTk9ERV9EQVRBKG5pZCkgPSBjYXJlZnVsX3phbGxvY2F0aW9uKG5pZCwKIAkJCQkJc2l6ZW9mKHN0cnVjdCBwZ2xpc3RfZGF0YSksCiAJCQkJCVNNUF9DQUNIRV9CWVRFUywgZW5kX3Bmbik7Ci0JCU5PREVfREFUQShuaWQpID0gX192YShOT0RFX0RBVEEobmlkKSk7Ci0JCW1lbXNldChOT0RFX0RBVEEobmlkKSwgMCwgc2l6ZW9mKHN0cnVjdCBwZ2xpc3RfZGF0YSkpOwogCiAgIAkJZGJnKCJub2RlICVkXG4iLCBuaWQpOwogCQlkYmcoIk5PREVfREFUQSgpID0gJXBcbiIsIE5PREVfREFUQShuaWQpKTsKQEAgLTk4NCwyMCArOTkwLDIwIEBACiAgIAkJZGJnKCJlbmRfcGFkZHIgPSAlbHhcbiIsIGVuZF9wZm4gPDwgUEFHRV9TSElGVCk7CiAKIAkJYm9vdG1hcF9wYWdlcyA9IGJvb3RtZW1fYm9vdG1hcF9wYWdlcyhlbmRfcGZuIC0gc3RhcnRfcGZuKTsKLQkJYm9vdG1lbV9wYWRkciA9ICh1bnNpZ25lZCBsb25nKWNhcmVmdWxfYWxsb2NhdGlvbihuaWQsCisJCWJvb3RtZW1fdmFkZHIgPSBjYXJlZnVsX3phbGxvY2F0aW9uKG5pZCwKIAkJCQkJYm9vdG1hcF9wYWdlcyA8PCBQQUdFX1NISUZULAogCQkJCQlQQUdFX1NJWkUsIGVuZF9wZm4pOwotCQltZW1zZXQoX192YShib290bWVtX3BhZGRyKSwgMCwgYm9vdG1hcF9wYWdlcyA8PCBQQUdFX1NISUZUKTsKIAotCQlkYmcoImJvb3RtYXBfcGFkZHIgPSAlbHhcbiIsIGJvb3RtZW1fcGFkZHIpOworCQlkYmcoImJvb3RtYXBfdmFkZHIgPSAlcFxuIiwgYm9vdG1lbV92YWRkcik7CiAKLQkJaW5pdF9ib290bWVtX25vZGUoTk9ERV9EQVRBKG5pZCksIGJvb3RtZW1fcGFkZHIgPj4gUEFHRV9TSElGVCwKKwkJaW5pdF9ib290bWVtX25vZGUoTk9ERV9EQVRBKG5pZCksCisJCQkJICBfX3BhKGJvb3RtZW1fdmFkZHIpID4+IFBBR0VfU0hJRlQsCiAJCQkJICBzdGFydF9wZm4sIGVuZF9wZm4pOwogCiAJCWZyZWVfYm9vdG1lbV93aXRoX2FjdGl2ZV9yZWdpb25zKG5pZCwgZW5kX3Bmbik7CiAJCS8qCiAJCSAqIEJlIHZlcnkgY2FyZWZ1bCBhYm91dCBtb3ZpbmcgdGhpcyBhcm91bmQuICBGdXR1cmUKLQkJICogY2FsbHMgdG8gY2FyZWZ1bF9hbGxvY2F0aW9uKCkgZGVwZW5kIG9uIHRoaXMgZ2V0dGluZworCQkgKiBjYWxscyB0byBjYXJlZnVsX3phbGxvY2F0aW9uKCkgZGVwZW5kIG9uIHRoaXMgZ2V0dGluZwogCQkgKiBkb25lIGNvcnJlY3RseS4KIAkJICovCiAJCW1hcmtfcmVzZXJ2ZWRfcmVnaW9uc19mb3JfbmlkKG5pZCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZV8zMi5jIGIvYXJjaC9wb3dlcnBjL21tL3BndGFibGVfMzIuYwppbmRleCAzOGZmMzVmLi4yMjk3MmNkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZV8zMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzMyLmMKQEAgLTI2Niw3ICsyNjYsOCBAQAogCQkvKiBUaGUgUFRFIHNob3VsZCBuZXZlciBiZSBhbHJlYWR5IHNldCBub3IgcHJlc2VudCBpbiB0aGUKIAkJICogaGFzaCB0YWJsZQogCQkgKi8KLQkJQlVHX09OKHB0ZV92YWwoKnBnKSAmIChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfSEFTSFBURSkpOworCQlCVUdfT04oKHB0ZV92YWwoKnBnKSAmIChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfSEFTSFBURSkpICYmCisJCSAgICAgICBmbGFncyk7CiAJCXNldF9wdGVfYXQoJmluaXRfbW0sIHZhLCBwZywgcGZuX3B0ZShwYSA+PiBQQUdFX1NISUZULAogCQkJCQkJICAgICBfX3BncHJvdChmbGFncykpKTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vdGxiX25vaGFzaC5jIGIvYXJjaC9wb3dlcnBjL21tL3RsYl9ub2hhc2guYwppbmRleCA4MDNhNjRjLi4zOWFjMjJiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vdGxiX25vaGFzaC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS90bGJfbm9oYXNoLmMKQEAgLTE4OSw4ICsxODksOSBAQAogCXNtcF9jYWxsX2Z1bmN0aW9uKGRvX2ZsdXNoX3RsYl9tbV9pcGksIE5VTEwsIDEpOwogCV90bGJpbF9waWQoMCk7CiAJcHJlZW1wdF9lbmFibGUoKTsKLSNlbmRpZgorI2Vsc2UKIAlfdGxiaWxfcGlkKDApOworI2VuZGlmCiB9CiBFWFBPUlRfU1lNQk9MKGZsdXNoX3RsYl9rZXJuZWxfcmFuZ2UpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvY2VsbC9wcl91dGlsLmggYi9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvY2VsbC9wcl91dGlsLmgKaW5kZXggNjI4MDA5Yy4uZGZkYmZmYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL2NlbGwvcHJfdXRpbC5oCisrKyBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9jZWxsL3ByX3V0aWwuaApAQCAtNzksNyArNzksNyBAQAogICogdGhlIHZtYS10by1maWxlb2Zmc2V0IG1hcC4KICAqLwogc3RydWN0IHZtYV90b19maWxlb2Zmc2V0X21hcCAqY3JlYXRlX3ZtYV9tYXAoY29uc3Qgc3RydWN0IHNwdSAqc3B1LAotCQkJCQkgICAgIHU2NCBvYmplY3RpZCk7CisJCQkJCSAgICAgdW5zaWduZWQgbG9uZyBvYmplY3RpZCk7CiB1bnNpZ25lZCBpbnQgdm1hX21hcF9sb29rdXAoc3RydWN0IHZtYV90b19maWxlb2Zmc2V0X21hcCAqbWFwLAogCQkJICAgIHVuc2lnbmVkIGludCB2bWEsIGNvbnN0IHN0cnVjdCBzcHUgKmFTcHUsCiAJCQkgICAgaW50ICpncmRfdmFsKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9jZWxsL3NwdV9wcm9maWxlci5jIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL2NlbGwvc3B1X3Byb2ZpbGVyLmMKaW5kZXggZGQ0OTljMy4uODNmYWE5NSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL2NlbGwvc3B1X3Byb2ZpbGVyLmMKKysrIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL2NlbGwvc3B1X3Byb2ZpbGVyLmMKQEAgLTQ5LDcgKzQ5LDcgQEAKIAkgKiBvZiBwcmVjaXNpb24uICBUaGlzIGlzIGNsb3NlIGVub3VnaCBmb3IgdGhlIHB1cnBvc2UgYXQgaGFuZC4KIAkgKgogCSAqIFRoZSB2YWx1ZSBvZiB0aGUgdGltZW91dCBzaG91bGQgYmUgc21hbGwgZW5vdWdoIHRoYXQgdGhlIGh3Ci0JICogdHJhY2UgYnVmZmVyIHdpbGwgbm90IGdldCBtb3JlIHRoZW4gYWJvdXQgMS8zIGZ1bGwgZm9yIHRoZQorCSAqIHRyYWNlIGJ1ZmZlciB3aWxsIG5vdCBnZXQgbW9yZSB0aGFuIGFib3V0IDEvMyBmdWxsIGZvciB0aGUKIAkgKiBtYXhpbXVtIHVzZXIgc3BlY2lmaWVkICh0aGUgTEZTUiB2YWx1ZSkgaHcgc2FtcGxpbmcgZnJlcXVlbmN5LgogCSAqIFRoaXMgaXMgdG8gZW5zdXJlIHRoZSB0cmFjZSBidWZmZXIgd2lsbCBuZXZlciBmaWxsIGV2ZW4gaWYgdGhlCiAJICoga2VybmVsIHRocmVhZCBzY2hlZHVsaW5nIHZhcmllcyB1bmRlciBhIGhlYXZ5IHN5c3RlbSBsb2FkLgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfY29tbW9uLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9jb21tb24uYwppbmRleCBhZTdjMzRmLi45ODM2N2EwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9jb21tb24uYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9jb21tb24uYwpAQCAtNDIsNyArNDIsNyBAQAogICogZnJvbSBpbnRlcnJ1cHQgY29udGV4dCB3aGlsZSBub2RlIG1hcHBpbmcgKHdoaWNoIGNhbGxzIGlvcmVtYXAoKSkKICAqIGNhbm5vdCBiZSB1c2VkIGF0IHN1Y2ggcG9pbnQuCiAgKi8KLXN0YXRpYyBzcGlubG9ja190IG1wYzUyeHhfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobXBjNTJ4eF9sb2NrKTsKIHN0YXRpYyBzdHJ1Y3QgbXBjNTJ4eF9ncHQgX19pb21lbSAqbXBjNTJ4eF93ZHQ7CiBzdGF0aWMgc3RydWN0IG1wYzUyeHhfY2RtIF9faW9tZW0gKm1wYzUyeHhfY2RtOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMxeF9yZGIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzF4X3JkYi5jCmluZGV4IGE0MjhmOGQuLjUxNzdiZGQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzF4X3JkYi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzF4X3JkYi5jCkBAIC00Miw3ICs0Miw3IEBACiAJbXBjODMxeF91c2JfY2ZnKCk7CiB9CiAKLXZvaWQgX19pbml0IG1wYzgzMXhfcmRiX2luaXRfSVJRKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgbXBjODMxeF9yZGJfaW5pdF9JUlEodm9pZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9tZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzJ4X21kcy5jCmluZGV4IGVjNDM0NzcuLmVjMGI0MDFiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9tZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9tZHMuYwpAQCAtNDksOCArNDksNiBAQAogI2RlZmluZSBEQkcoZm10Li4uKQogI2VuZGlmCiAKLXN0YXRpYyB1OCAqYmNzcl9yZWdzID0gTlVMTDsKLQogLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogU2V0dXAgdGhlIGFyY2hpdGVjdHVyZQpAQCAtNTksMTMgKzU3LDE0IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgbXBjODMyeF9zeXNfc2V0dXBfYXJjaCh2b2lkKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJdTggX19pb21lbSAqYmNzcl9yZWdzID0gTlVMTDsKIAogCWlmIChwcGNfbWQucHJvZ3Jlc3MpCiAJCXBwY19tZC5wcm9ncmVzcygibXBjODMyeF9zeXNfc2V0dXBfYXJjaCgpIiwgMCk7CiAKIAkvKiBNYXAgQkNTUiBhcmVhICovCiAJbnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAiYmNzciIpOwotCWlmIChucCAhPSAwKSB7CisJaWYgKG5wKSB7CiAJCXN0cnVjdCByZXNvdXJjZSByZXM7CiAKIAkJb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnJlcyk7CkBAIC05Myw5ICs5Miw5IEBACiAJCQkhPSBOVUxMKXsKIAkJLyogUmVzZXQgdGhlIEV0aGVybmV0IFBIWXMgKi8KICNkZWZpbmUgQkNTUjhfRkVUSF9SU1QgMHg1MAotCQliY3NyX3JlZ3NbOF0gJj0gfkJDU1I4X0ZFVEhfUlNUOworCQljbHJiaXRzOCgmYmNzcl9yZWdzWzhdLCBCQ1NSOF9GRVRIX1JTVCk7CiAJCXVkZWxheSgxMDAwKTsKLQkJYmNzcl9yZWdzWzhdIHw9IEJDU1I4X0ZFVEhfUlNUOworCQlzZXRiaXRzOCgmYmNzcl9yZWdzWzhdLCBCQ1NSOF9GRVRIX1JTVCk7CiAJCWlvdW5tYXAoYmNzcl9yZWdzKTsKIAkJb2Zfbm9kZV9wdXQobnApOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzJ4X3JkYi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMnhfcmRiLmMKaW5kZXggMDMwMDI2OC4uMmExMjk1ZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMnhfcmRiLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMnhfcmRiLmMKQEAgLTM4LDYgKzM4LDcgQEAKICNkZWZpbmUgREJHKGZtdC4uLikKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1FVSUNDX0VOR0lORQogc3RhdGljIHZvaWQgbXBjODN4eF9zcGlfYWN0aXZhdGVfY3ModTggY3MsIHU4IHBvbGFyaXR5KQogewogCXByX2RlYnVnKCIlcyAlZCAlZFxuIiwgX19mdW5jX18sIGNzLCBwb2xhcml0eSk7CkBAIC03Nyw4ICs3OCw4IEBACiAJCQkgICAgbXBjODN4eF9zcGlfYWN0aXZhdGVfY3MsCiAJCQkgICAgbXBjODN4eF9zcGlfZGVhY3RpdmF0ZV9jcyk7CiB9Ci0KIG1hY2hpbmVfZGV2aWNlX2luaXRjYWxsKG1wYzgzMnhfcmRiLCBtcGM4MzJ4X3NwaV9pbml0KTsKKyNlbmRpZiAvKiBDT05GSUdfUVVJQ0NfRU5HSU5FICovCiAKIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTEzMCw3ICsxMzEsNyBAQAogfQogbWFjaGluZV9kZXZpY2VfaW5pdGNhbGwobXBjODMyeF9yZGIsIG1wYzgzMnhfZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKTsKIAotdm9pZCBfX2luaXQgbXBjODMyeF9yZGJfaW5pdF9JUlEodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBtcGM4MzJ4X3JkYl9pbml0X0lSUSh2b2lkKQogewogCiAJc3RydWN0IGRldmljZV9ub2RlICpucDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzZ4X21kcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNnhfbWRzLmMKaW5kZXggOWQ0NmU1Yi4uMDllOWQ2ZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNnhfbWRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNnhfbWRzLmMKQEAgLTE4LDYgKzE4LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CkBAIC00Myw2ICs0NCw3IEBACiAjaW5jbHVkZSA8YXNtL3VkYmcuaD4KICNpbmNsdWRlIDxzeXNkZXYvZnNsX3NvYy5oPgogI2luY2x1ZGUgPHN5c2Rldi9mc2xfcGNpLmg+CisjaW5jbHVkZSA8c3lzZGV2L3NpbXBsZV9ncGlvLmg+CiAjaW5jbHVkZSA8YXNtL3FlLmg+CiAjaW5jbHVkZSA8YXNtL3FlX2ljLmg+CiAKQEAgLTU1LDggKzU3LDYgQEAKICNkZWZpbmUgREJHKGZtdC4uLikKICNlbmRpZgogCi1zdGF0aWMgdTggKmJjc3JfcmVncyA9IE5VTEw7Ci0KIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIFNldHVwIHRoZSBhcmNoaXRlY3R1cmUKQEAgLTY1LDEzICs2NSwxNCBAQAogc3RhdGljIHZvaWQgX19pbml0IG1wYzgzNnhfbWRzX3NldHVwX2FyY2godm9pZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCXU4IF9faW9tZW0gKmJjc3JfcmVncyA9IE5VTEw7CiAKIAlpZiAocHBjX21kLnByb2dyZXNzKQogCQlwcGNfbWQucHJvZ3Jlc3MoIm1wYzgzNnhfbWRzX3NldHVwX2FyY2goKSIsIDApOwogCiAJLyogTWFwIEJDU1IgYXJlYSAqLwogCW5wID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgImJjc3IiKTsKLQlpZiAobnAgIT0gMCkgeworCWlmIChucCkgewogCQlzdHJ1Y3QgcmVzb3VyY2UgcmVzOwogCiAJCW9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyZXMpOwpAQCAtOTMsNiArOTQsMTYgQEAKIAogCQlmb3IgKG5wID0gTlVMTDsgKG5wID0gb2ZfZmluZF9ub2RlX2J5X25hbWUobnAsICJ1Y2MiKSkgIT0gTlVMTDspCiAJCQlwYXJfaW9fb2ZfY29uZmlnKG5wKTsKKyNpZmRlZiBDT05GSUdfUUVfVVNCCisJCS8qIE11c3QgZml4dXAgUGFyIElPIGJlZm9yZSBRRSBHUElPIGNoaXBzIGFyZSByZWdpc3RlcmVkLiAqLworCQlwYXJfaW9fY29uZmlnX3BpbigxLCAgMiwgMSwgMCwgMywgMCk7IC8qIFVTQk9FICAqLworCQlwYXJfaW9fY29uZmlnX3BpbigxLCAgMywgMSwgMCwgMywgMCk7IC8qIFVTQlRQICAqLworCQlwYXJfaW9fY29uZmlnX3BpbigxLCAgOCwgMSwgMCwgMSwgMCk7IC8qIFVTQlROICAqLworCQlwYXJfaW9fY29uZmlnX3BpbigxLCAxMCwgMiwgMCwgMywgMCk7IC8qIFVTQlJYRCAqLworCQlwYXJfaW9fY29uZmlnX3BpbigxLCAgOSwgMiwgMSwgMywgMCk7IC8qIFVTQlJQICAqLworCQlwYXJfaW9fY29uZmlnX3BpbigxLCAxMSwgMiwgMSwgMywgMCk7IC8qIFVTQlJOICAqLworCQlwYXJfaW9fY29uZmlnX3BpbigyLCAyMCwgMiwgMCwgMSwgMCk7IC8qIENMSzIxICAqLworI2VuZGlmIC8qIENPTkZJR19RRV9VU0IgKi8KIAl9CiAKIAlpZiAoKG5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgIm5ldHdvcmsiLCAidWNjX2dldGgiKSkKQEAgLTE1MSw2ICsxNjIsNzAgQEAKIH0KIG1hY2hpbmVfZGV2aWNlX2luaXRjYWxsKG1wYzgzNnhfbWRzLCBtcGM4MzZ4X2RlY2xhcmVfb2ZfcGxhdGZvcm1fZGV2aWNlcyk7CiAKKyNpZmRlZiBDT05GSUdfUUVfVVNCCitzdGF0aWMgaW50IF9faW5pdCBtcGM4MzZ4X3VzYl9jZmcodm9pZCkKK3sKKwl1OCBfX2lvbWVtICpiY3NyOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJY29uc3QgY2hhciAqbW9kZTsKKwlpbnQgcmV0ID0gMDsKKworCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImZzbCxtcGM4MzYwbWRzLWJjc3IiKTsKKwlpZiAoIW5wKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWJjc3IgPSBvZl9pb21hcChucCwgMCk7CisJb2Zfbm9kZV9wdXQobnApOworCWlmICghYmNzcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJmc2wsbXBjODMyMy1xZS11c2IiKTsKKwlpZiAoIW5wKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyOworCX0KKworI2RlZmluZSBCQ1NSOF9UU0VDMU1fTUFTSwkoMHgzIDw8IDYpCisjZGVmaW5lIEJDU1I4X1RTRUMxTV9SR01JSQkoMHgwIDw8IDYpCisjZGVmaW5lIEJDU1I4X1RTRUMyTV9NQVNLCSgweDMgPDwgNCkKKyNkZWZpbmUgQkNTUjhfVFNFQzJNX1JHTUlJCSgweDAgPDwgNCkKKwkvKgorCSAqIERlZmF1bHQgaXMgR01JSSAoMiksIGJ1dCB3ZSBzaG91bGQgc2V0IGl0IHRvIFJHTUlJICgwKSBpZiB3ZSB1c2UKKwkgKiBVU0IgKEV0aCBQSFkgaXMgaW4gUkdNSUkgbW9kZSBhbnl3YXkpLgorCSAqLworCWNscnNldGJpdHNfOCgmYmNzcls4XSwgQkNTUjhfVFNFQzFNX01BU0sgfCBCQ1NSOF9UU0VDMk1fTUFTSywKKwkJCSAgICAgICBCQ1NSOF9UU0VDMU1fUkdNSUkgfCBCQ1NSOF9UU0VDMk1fUkdNSUkpOworCisjZGVmaW5lIEJDU1IxM19VU0JNQVNLCTB4MGYKKyNkZWZpbmUgQkNTUjEzX25VU0JFTgkweDA4IC8qIDEgLSBEaXNhYmxlLCAwIC0gRW5hYmxlCQkJKi8KKyNkZWZpbmUgQkNTUjEzX1VTQlNQRUVECTB4MDQgLyogMSAtIEZ1bGwsIDAgLSBMb3cJCQkqLworI2RlZmluZSBCQ1NSMTNfVVNCTU9ERQkweDAyIC8qIDEgLSBIb3N0LCAwIC0gRnVuY3Rpb24JCQkqLworI2RlZmluZSBCQ1NSMTNfblVTQlZDQwkweDAxIC8qIDEgLSBnZXRzIFZCVVMsIDAgLSBzdXBwbGllcyBWQlVTIAkqLworCisJY2xyc2V0Yml0c184KCZiY3NyWzEzXSwgQkNTUjEzX1VTQk1BU0ssIEJDU1IxM19VU0JTUEVFRCk7CisKKwltb2RlID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAibW9kZSIsIE5VTEwpOworCWlmIChtb2RlICYmICFzdHJjbXAobW9kZSwgInBlcmlwaGVyYWwiKSkgeworCQlzZXRiaXRzOCgmYmNzclsxM10sIEJDU1IxM19uVVNCVkNDKTsKKwkJcWVfdXNiX2Nsb2NrX3NldChRRV9DTEsyMSwgNDgwMDAwMDApOworCX0gZWxzZSB7CisJCXNldGJpdHM4KCZiY3NyWzEzXSwgQkNTUjEzX1VTQk1PREUpOworCQkvKgorCQkgKiBUaGUgQkNTUiBHUElPcyBhcmUgdXNlZCB0byBjb250cm9sIHBvd2VyIGFuZAorCQkgKiBzcGVlZCBvZiB0aGUgVVNCIHRyYW5zY2VpdmVyLiBUaGlzIGlzIG5lZWRlZCBmb3IKKwkJICogdGhlIFVTQiBIb3N0IG9ubHkuCisJCSAqLworCQlzaW1wbGVfZ3Bpb2NoaXBfaW5pdCgiZnNsLG1wYzgzNjBtZHMtYmNzci1ncGlvIik7CisJfQorCisJb2Zfbm9kZV9wdXQobnApOworZXJyOgorCWlvdW5tYXAoYmNzcik7CisJcmV0dXJuIHJldDsKK30KK21hY2hpbmVfYXJjaF9pbml0Y2FsbChtcGM4MzZ4X21kcywgbXBjODM2eF91c2JfY2ZnKTsKKyNlbmRpZiAvKiBDT05GSUdfUUVfVVNCICovCisKIHN0YXRpYyB2b2lkIF9faW5pdCBtcGM4MzZ4X21kc19pbml0X0lSUSh2b2lkKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM2eF9yZGsuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzZ4X3Jkay5jCmluZGV4IGE1MjczYmIuLmIwMDkwYWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzZ4X3Jkay5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzZ4X3Jkay5jCkBAIC01MSw4ICs1MSw5IEBACiAJZm9yX2VhY2hfY29tcGF0aWJsZV9ub2RlKG5wLCAicGNpIiwgImZzbCxtcGM4MzQ5LXBjaSIpCiAJCW1wYzgzeHhfYWRkX2JyaWRnZShucCk7CiAjZW5kaWYKLQorI2lmZGVmIENPTkZJR19RVUlDQ19FTkdJTkUKIAlxZV9yZXNldCgpOworI2VuZGlmCiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBtcGM4MzZ4X3Jka19pbml0X0lSUSh2b2lkKQpAQCAtNzEsMTMgKzcyLDE0IEBACiAJICovCiAJaXBpY19zZXRfZGVmYXVsdF9wcmlvcml0eSgpOwogCW9mX25vZGVfcHV0KG5wKTsKLQorI2lmZGVmIENPTkZJR19RVUlDQ19FTkdJTkUKIAlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJmc2wscWUtaWMiKTsKIAlpZiAoIW5wKQogCQlyZXR1cm47CiAKIAlxZV9pY19pbml0KG5wLCAwLCBxZV9pY19jYXNjYWRlX2xvd19pcGljLCBxZV9pY19jYXNjYWRlX2hpZ2hfaXBpYyk7CiAJb2Zfbm9kZV9wdXQobnApOworI2VuZGlmCiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM3eF9tZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4Mzd4X21kcy5jCmluZGV4IDhiYjEzYzguLjUzMGVmOTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4Mzd4X21kcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4Mzd4X21kcy5jCkBAIC0yNiw3ICsyNiw2IEBACiAjZGVmaW5lIEJDU1IxMl9VU0JfU0VSX01BU0sJMHg4YQogI2RlZmluZSBCQ1NSMTJfVVNCX1NFUl9QSU4JMHg4MAogI2RlZmluZSBCQ1NSMTJfVVNCX1NFUl9ERVZJQ0UJMHgwMgotZXh0ZXJuIGludCBtcGM4Mzd4X3VzYl9jZmcodm9pZCk7CiAKIHN0YXRpYyBpbnQgbXBjODM3eG1kc191c2JfY2ZnKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM3eF9yZGIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4Mzd4X3JkYi5jCmluZGV4IGRhMDMwYWYuLjFkMDk2NTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4Mzd4X3JkYi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4Mzd4X3JkYi5jCkBAIC0yMSw4ICsyMSw2IEBACiAKICNpbmNsdWRlICJtcGM4M3h4LmgiCiAKLWV4dGVybiBpbnQgbXBjODM3eF91c2JfY2ZnKHZvaWQpOwotCiAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBTZXR1cCB0aGUgYXJjaGl0ZWN0dXJlCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODN4eC5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzeHguaAppbmRleCAyYTdjYmFiLi44M2NmZTUxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODN4eC5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4M3h4LmgKQEAgLTYxLDYgKzYxLDcgQEAKIAogZXh0ZXJuIHZvaWQgbXBjODN4eF9yZXN0YXJ0KGNoYXIgKmNtZCk7CiBleHRlcm4gbG9uZyBtcGM4M3h4X3RpbWVfaW5pdCh2b2lkKTsKK2V4dGVybiBpbnQgbXBjODM3eF91c2JfY2ZnKHZvaWQpOwogZXh0ZXJuIGludCBtcGM4MzR4X3VzYl9jZmcodm9pZCk7CiBleHRlcm4gaW50IG1wYzgzMXhfdXNiX2NmZyh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2RzLmMKaW5kZXggYTgzMDFjOC4uNzMyNmQ5MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9kcy5jCkBAIC0xNDgsNiArMTQ4LDkgQEAKIC8qCiAgKiBTZXR1cCB0aGUgYXJjaGl0ZWN0dXJlCiAgKi8KKyNpZmRlZiBDT05GSUdfU01QCitleHRlcm4gdm9pZCBfX2luaXQgbXBjODV4eF9zbXBfaW5pdCh2b2lkKTsKKyNlbmRpZgogc3RhdGljIHZvaWQgX19pbml0IG1wYzg1eHhfZHNfc2V0dXBfYXJjaCh2b2lkKQogewogI2lmZGVmIENPTkZJR19QQ0kKQEAgLTE3Myw2ICsxNzYsMTAgQEAKIAlwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlID0gbXBjODV4eF9leGNsdWRlX2RldmljZTsKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1NNUAorCW1wYzg1eHhfc21wX2luaXQoKTsKKyNlbmRpZgorCiAJcHJpbnRrKCJNUEM4NXh4IERTIGJvYXJkIGZyb20gRnJlZXNjYWxlIFNlbWljb25kdWN0b3JcbiIpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvc21wLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvc21wLmMKaW5kZXggZDY1MmM3MS4uNzlhMGRmMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3NtcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9zbXAuYwpAQCAtNTgsNiArNTgsNyBAQAogCiAJaWYgKGNwdV9yZWxfYWRkciA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiTm8gY3B1LXJlbGVhc2UtYWRkciBmb3IgY3B1ICVkXG4iLCBucik7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAkJcmV0dXJuOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnCmluZGV4IDQ3ZTk1NmMuLjQ3ZmUyYmUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcKQEAgLTMxMiw0ICszMTIsMTUgQEAKIAkgIFNheSBZIGhlcmUgaWYgeW91J3JlIGdvaW5nIHRvIHVzZSBoYXJkd2FyZSB0aGF0IGNvbm5lY3RzIHRvIHRoZQogCSAgTVBDODMxeC84MzR4LzgzN3gvODU3Mi84NjEwIEdQSU9zLgogCitjb25maWcgU0lNUExFX0dQSU8KKwlib29sICJTdXBwb3J0IGZvciBzaW1wbGUsIG1lbW9yeS1tYXBwZWQgR1BJTyBjb250cm9sbGVycyIKKwlkZXBlbmRzIG9uIFBQQworCXNlbGVjdCBHRU5FUklDX0dQSU8KKwlzZWxlY3QgQVJDSF9SRVFVSVJFX0dQSU9MSUIKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgc2ltcGxlLCBtZW1vcnktbWFwcGVkIEdQSU8gY29udHJvbGxlcnMuCisJICBUaGVzZSBhcmUgdXN1YWxseSBCQ1NScyB1c2VkIHRvIGNvbnRyb2wgYm9hcmQncyBzd2l0Y2hlcywgTEVEcywKKwkgIGNoaXAtc2VsZWN0cywgRXRoZXJuZXQvVVNCIFBIWSdzIHBvd2VyIGFuZCB2YXJpb3VzIG90aGVyIHNtYWxsCisJICBvbi1ib2FyZCBwZXJpcGhlcmFscy4KKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnLmNwdXR5cGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcuY3B1dHlwZQppbmRleCAzZDBjNzc2Li5lODY4YjVjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcuY3B1dHlwZQorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcuY3B1dHlwZQpAQCAtMjMxLDcgKzIzMSw3IEBACiAJICBJZiBpbiBkb3VidCwgc2F5IFkgaGVyZS4KIAogY29uZmlnIFNNUAotCWRlcGVuZHMgb24gUFBDX1NURF9NTVUKKwlkZXBlbmRzIG9uIFBQQ19TVERfTU1VIHx8IEZTTF9CT09LRQogCWJvb2wgIlN5bW1ldHJpYyBtdWx0aS1wcm9jZXNzaW5nIHN1cHBvcnQiCiAJLS0taGVscC0tLQogCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHN5c3RlbXMgd2l0aCBtb3JlIHRoYW4gb25lIENQVS4gSWYgeW91IGhhdmUKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9iZWF0X2h0YWIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9iZWF0X2h0YWIuYwppbmRleCAyZTY3YmQ4Li4zNWIxZWM0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvYmVhdF9odGFiLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2JlYXRfaHRhYi5jCkBAIC00NCw4ICs0NCw4IEBACiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGJlYXRfcmVhZF9tYXNrKHVuc2lnbmVkIGhwdGVfZ3JvdXApCiB7Ci0JdW5zaWduZWQgbG9uZyBocHRlX3ZbNV07CiAJdW5zaWduZWQgbG9uZyBybWFzayA9IDA7CisJdTY0IGhwdGVfdls1XTsKIAogCWJlYXRfcmVhZF9odGFiX2VudHJpZXMoMCwgaHB0ZV9ncm91cCArIDAsIGhwdGVfdik7CiAJaWYgKCEoaHB0ZV92WzBdICYgSFBURV9WX0JPTFRFRCkpCkBAIC05Myw4ICs5Myw3IEBACiAJCQkJICBpbnQgcHNpemUsIGludCBzc2l6ZSkKIHsKIAl1bnNpZ25lZCBsb25nIGxwYXJfcmM7Ci0JdW5zaWduZWQgbG9uZyBzbG90OwotCXVuc2lnbmVkIGxvbmcgaHB0ZV92LCBocHRlX3I7CisJdTY0IGhwdGVfdiwgaHB0ZV9yLCBzbG90OwogCiAJLyogc2FtZSBhcyBpc2VyaWVzICovCiAJaWYgKHZmbGFncyAmIEhQVEVfVl9TRUNPTkRBUlkpCkBAIC0xNTMsOCArMTUyLDkgQEAKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgYmVhdF9scGFyX2hwdGVfZ2V0d29yZDAodW5zaWduZWQgbG9uZyBzbG90KQogewotCXVuc2lnbmVkIGxvbmcgZHdvcmQwLCBkd29yZFs1XTsKKwl1bnNpZ25lZCBsb25nIGR3b3JkMDsKIAl1bnNpZ25lZCBsb25nIGxwYXJfcmM7CisJdTY0IGR3b3JkWzVdOwogCiAJbHBhcl9yYyA9IGJlYXRfcmVhZF9odGFiX2VudHJpZXMoMCwgc2xvdCAmIH4zVUwsIGR3b3JkKTsKIApAQCAtMTcwLDcgKzE3MCw3IEBACiAJdW5zaWduZWQgbG9uZyBzaXplX2J5dGVzID0gMVVMIDw8IHBwYzY0X3BmdF9zaXplOwogCXVuc2lnbmVkIGxvbmcgaHB0ZV9jb3VudCA9IHNpemVfYnl0ZXMgPj4gNDsKIAlpbnQgaTsKLQl1bnNpZ25lZCBsb25nIGR1bW15MCwgZHVtbXkxOworCXU2NCBkdW1teTAsIGR1bW15MTsKIAogCS8qIFRPRE86IFVzZSBidWxrIGNhbGwgKi8KIAlmb3IgKGkgPSAwOyBpIDwgaHB0ZV9jb3VudDsgaSsrKQpAQCAtMTg5LDcgKzE4OSw4IEBACiAJCQkJICAgIGludCBwc2l6ZSwgaW50IHNzaXplLCBpbnQgbG9jYWwpCiB7CiAJdW5zaWduZWQgbG9uZyBscGFyX3JjOwotCXVuc2lnbmVkIGxvbmcgZHVtbXkwLCBkdW1teTEsIHdhbnRfdjsKKwl1NjQgZHVtbXkwLCBkdW1teTE7CisJdW5zaWduZWQgbG9uZyB3YW50X3Y7CiAKIAl3YW50X3YgPSBocHRlX2VuY29kZV92KHZhLCBwc2l6ZSwgTU1VX1NFR1NJWkVfMjU2TSk7CiAKQEAgLTI1NSw3ICsyNTYsOCBAQAogCQkJCQkgIHVuc2lnbmVkIGxvbmcgZWEsCiAJCQkJCSAgaW50IHBzaXplLCBpbnQgc3NpemUpCiB7Ci0JdW5zaWduZWQgbG9uZyBscGFyX3JjLCBzbG90LCB2c2lkLCB2YSwgZHVtbXkwLCBkdW1teTE7CisJdW5zaWduZWQgbG9uZyBscGFyX3JjLCBzbG90LCB2c2lkLCB2YTsKKwl1NjQgZHVtbXkwLCBkdW1teTE7CiAKIAl2c2lkID0gZ2V0X2tlcm5lbF92c2lkKGVhLCBNTVVfU0VHU0laRV8yNTZNKTsKIAl2YSA9ICh2c2lkIDw8IDI4KSB8IChlYSAmIDB4MGZmZmZmZmYpOwpAQCAtMjc2LDcgKzI3OCw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyB3YW50X3Y7CiAJdW5zaWduZWQgbG9uZyBscGFyX3JjOwotCXVuc2lnbmVkIGxvbmcgZHVtbXkxLCBkdW1teTI7CisJdTY0IGR1bW15MSwgZHVtbXkyOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlEQkdfTE9XKCIgICAgaW52YWwgOiBzbG90PSVseCwgdmE9JTAxNmx4LCBwc2l6ZTogJWQsIGxvY2FsOiAlZFxuIiwKQEAgLTMxNSw4ICszMTcsNyBAQAogCQkJCSAgaW50IHBzaXplLCBpbnQgc3NpemUpCiB7CiAJdW5zaWduZWQgbG9uZyBscGFyX3JjOwotCXVuc2lnbmVkIGxvbmcgc2xvdDsKLQl1bnNpZ25lZCBsb25nIGhwdGVfdiwgaHB0ZV9yOworCXU2NCBocHRlX3YsIGhwdGVfciwgc2xvdDsKIAogCS8qIHNhbWUgYXMgaXNlcmllcyAqLwogCWlmICh2ZmxhZ3MgJiBIUFRFX1ZfU0VDT05EQVJZKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2JlYXRfdWRiZy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2JlYXRfdWRiZy5jCmluZGV4IDZiNDE4ZjYuLjM1MDczNWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9iZWF0X3VkYmcuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvYmVhdF91ZGJnLmMKQEAgLTQwLDggKzQwLDggQEAKIH0KIAogLyogQnVmZmVyZWQgY2hhcnMgZ2V0YyAqLwotc3RhdGljIGxvbmcgaW5idWZsZW47Ci1zdGF0aWMgbG9uZyBpbmJ1ZlsyXTsJLyogbXVzdCBiZSAyIGxvbmdzICovCitzdGF0aWMgdTY0IGluYnVmbGVuOworc3RhdGljIHU2NCBpbmJ1ZlsyXTsJLyogbXVzdCBiZSAyIHU2NHMgKi8KIAogc3RhdGljIGludCB1ZGJnX2dldGNfcG9sbF9iZWF0KHZvaWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX2NwdWZyZXFfcGVydmFzaXZlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX2NwdWZyZXFfcGVydmFzaXZlLmMKaW5kZXggNzBmYTdhZS4uMjA0NzJlNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NiZV9jcHVmcmVxX3BlcnZhc2l2ZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jYmVfY3B1ZnJlcV9wZXJ2YXNpdmUuYwpAQCAtNTQsNyArNTQsNyBAQAogewogCXN0cnVjdCBjYmVfcG1kX3JlZ3MgX19pb21lbSAqcG1kX3JlZ3M7CiAJc3RydWN0IGNiZV9taWNfdG1fcmVncyBfX2lvbWVtICptaWNfdG1fcmVnczsKLQl1NjQgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1NjQgdmFsdWU7CiAjaWZkZWYgREVCVUcKIAlsb25nIHRpbWU7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW50ZXJydXB0LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW50ZXJydXB0LmMKaW5kZXggMmQ1YmIyMi4uMjhjMDRkYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2ludGVycnVwdC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pbnRlcnJ1cHQuYwpAQCAtMTQ4LDcgKzE0OCw3IEBACiAKIAlpaWMgPSAmX19nZXRfY3B1X3ZhcihpaWMpOwogCSoodW5zaWduZWQgbG9uZyAqKSAmcGVuZGluZyA9Ci0JCWluX2JlNjQoKHVuc2lnbmVkIGxvbmcgX19pb21lbSAqKSAmaWljLT5yZWdzLT5wZW5kaW5nX2Rlc3RyKTsKKwkJaW5fYmU2NCgodTY0IF9faW9tZW0gKikgJmlpYy0+cmVncy0+cGVuZGluZ19kZXN0cik7CiAJaWYgKCEocGVuZGluZy5mbGFncyAmIENCRV9JSUNfSVJRX1ZBTElEKSkKIAkJcmV0dXJuIE5PX0lSUTsKIAl2aXJxID0gaXJxX2xpbmVhcl9yZXZtYXAoaWljX2hvc3QsIGlpY19wZW5kaW5nX3RvX2h3bnVtKHBlbmRpbmcpKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pby13b3JrYXJvdW5kcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvLXdvcmthcm91bmRzLmMKaW5kZXggYjVmODRlOC4uMDU5Y2FkNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvLXdvcmthcm91bmRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvLXdvcmthcm91bmRzLmMKQEAgLTEzMCwxNCArMTMwLDE0IEBACiAKIH07CiAKLXN0YXRpYyB2b2lkIF9faW9tZW0gKmlvd2FfaW9yZW1hcCh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKK3N0YXRpYyB2b2lkIF9faW9tZW0gKmlvd2FfaW9yZW1hcChwaHlzX2FkZHJfdCBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsCiAJCQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCXN0cnVjdCBpb3dhX2J1cyAqYnVzOwogCXZvaWQgX19pb21lbSAqcmVzID0gX19pb3JlbWFwKGFkZHIsIHNpemUsIGZsYWdzKTsKIAlpbnQgYnVzbm87CiAKLQlidXMgPSBpb3dhX3BjaV9maW5kKDAsIGFkZHIpOworCWJ1cyA9IGlvd2FfcGNpX2ZpbmQoMCwgKHVuc2lnbmVkIGxvbmcpYWRkcik7CiAJaWYgKGJ1cyAhPSBOVUxMKSB7CiAJCWJ1c25vID0gYnVzIC0gaW93YV9idXNzZXM7CiAJCVBDSV9TRVRfQUREUl9UT0tFTihyZXMsIGJ1c25vICsgMSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW9tbXUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pb21tdS5jCmluZGV4IDg2ZGI0ZGQuLjg4ZDk0YjUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pb21tdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pb21tdS5jCkBAIC0xNTAsOCArMTUwLDggQEAKIHN0YXRpYyB2b2lkIGludmFsaWRhdGVfdGNlX2NhY2hlKHN0cnVjdCBjYmVfaW9tbXUgKmlvbW11LCB1bnNpZ25lZCBsb25nICpwdGUsCiAJCWxvbmcgbl9wdGVzKQogewotCXVuc2lnbmVkIGxvbmcgX19pb21lbSAqcmVnOwotCXVuc2lnbmVkIGxvbmcgdmFsOworCXU2NCBfX2lvbWVtICpyZWc7CisJdTY0IHZhbDsKIAlsb25nIG47CiAKIAlyZWcgPSBpb21tdS0+eGxhdGVfcmVncyArIElPQ19JT1BUX0NhY2hlSW52ZDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9pbm9kZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2lub2RlLmMKaW5kZXggNjI5NmJmZC4uZTMwOWVmNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2lub2RlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2lub2RlLmMKQEAgLTk3LDcgKzk3LDYgQEAKIAlpbm9kZS0+aV9tb2RlID0gbW9kZTsKIAlpbm9kZS0+aV91aWQgPSBjdXJyZW50X2ZzdWlkKCk7CiAJaW5vZGUtPmlfZ2lkID0gY3VycmVudF9mc2dpZCgpOwotCWlub2RlLT5pX2Jsb2NrcyA9IDA7CiAJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogb3V0OgogCXJldHVybiBpbm9kZTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVmcy5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdWZzLmgKaW5kZXggMTVjNjJkMy4uM2JmOTA4ZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdWZzLmgKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdWZzLmgKQEAgLTMxNCw3ICszMTQsNyBAQAogICoJd2UgbmVlZCB0byBjYWxsIHNwdV9yZWxlYXNlKGN0eCkgYmVmb3JlIHNsZWVwaW5nLCBhbmQKICAqCXRoZW4gc3B1X2FjcXVpcmUoY3R4KSB3aGVuIGF3b2tlbi4KICAqCi0gKiAJUmV0dXJucyB3aXRoIHN0YXRlX211dGV4IHJlLWFjcXVpcmVkIHdoZW4gc3VjY2Vzc2Z1bGwgb3IKKyAqIAlSZXR1cm5zIHdpdGggc3RhdGVfbXV0ZXggcmUtYWNxdWlyZWQgd2hlbiBzdWNjZXNzZnVsIG9yCiAgKiAJd2l0aCAtRVJFU1RBUlRTWVMgYW5kIHRoZSBzdGF0ZV9tdXRleCBkcm9wcGVkIHdoZW4gaW50ZXJydXB0ZWQuCiAgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvS2NvbmZpZwppbmRleCBlZDM3NTNkLi43ZGRkMGEyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvS2NvbmZpZwpAQCAtMTAsMTggKzEwLDIxIEBACiBjb25maWcgVklPREFTRAogCXRyaXN0YXRlICJpU2VyaWVzIFZpcnR1YWwgSS9PIGRpc2sgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEJMT0NLCisJc2VsZWN0IFZJT1BBVEgKIAloZWxwCiAJICBJZiB5b3UgYXJlIHJ1bm5pbmcgb24gYW4gaVNlcmllcyBzeXN0ZW0gYW5kIHlvdSB3YW50IHRvIHVzZQogCSAgdmlydHVhbCBkaXNrcyBjcmVhdGVkIGFuZCBtYW5hZ2VkIGJ5IE9TLzQwMCwgc2F5IFkuCiAKIGNvbmZpZyBWSU9DRAogCXRyaXN0YXRlICJpU2VyaWVzIFZpcnR1YWwgSS9PIENEIHN1cHBvcnQiCisJc2VsZWN0IFZJT1BBVEgKIAloZWxwCiAJICBJZiB5b3UgYXJlIHJ1bm5pbmcgTGludXggb24gYW4gSUJNIGlTZXJpZXMgc3lzdGVtIGFuZCB5b3Ugd2FudCB0bwogCSAgcmVhZCBhIENEIGRyaXZlIG93bmVkIGJ5IE9TLzQwMCwgc2F5IFkgaGVyZS4KIAogY29uZmlnIFZJT1RBUEUKIAl0cmlzdGF0ZSAiaVNlcmllcyBWaXJ0dWFsIFRhcGUgU3VwcG9ydCIKKwlzZWxlY3QgVklPUEFUSAogCWhlbHAKIAkgIElmIHlvdSBhcmUgcnVubmluZyBMaW51eCBvbiBhbiBpU2VyaWVzIHN5c3RlbSBhbmQgeW91IHdhbnQgTGludXgKIAkgIHRvIHJlYWQgYW5kL29yIHdyaXRlIGEgdGFwZSBkcml2ZSBvd25lZCBieSBPUy80MDAsIHNheSBZIGhlcmUuCkBAIC0zMCw1ICszMywzIEBACiAKIGNvbmZpZyBWSU9QQVRICiAJYm9vbAotCWRlcGVuZHMgb24gVklPREFTRCB8fCBWSU9DRCB8fCBWSU9UQVBFIHx8IElTRVJJRVNfVkVUSAotCWRlZmF1bHQgeQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc2V0dXAuYwppbmRleCA3MGI2ODhjLi4yNDUxOWI5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc2V0dXAuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CisjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KICNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgogI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC02MzgsNiArNjM5LDEzIEBACiAJcmV0dXJuIDE7CiB9CiAKKyNpZmRlZiBDT05GSUdfS0VYRUMKK3N0YXRpYyBpbnQgaXNlcmllc19rZXhlY19wcmVwYXJlKHN0cnVjdCBraW1hZ2UgKmltYWdlKQoreworCXJldHVybiAtRU5PU1lTOworfQorI2VuZGlmCisKIGRlZmluZV9tYWNoaW5lKGlzZXJpZXMpIHsKIAkubmFtZQkJCT0gImlTZXJpZXMiLAogCS5zZXR1cF9hcmNoCQk9IGlTZXJpZXNfc2V0dXBfYXJjaCwKQEAgLTY1OCw2ICs2NjYsOSBAQAogCS5wcm9iZQkJCT0gaXNlcmllc19wcm9iZSwKIAkuaW9yZW1hcAkJPSBpc2VyaWVzX2lvcmVtYXAsCiAJLmlvdW5tYXAJCT0gaXNlcmllc19pb3VubWFwLAorI2lmZGVmIENPTkZJR19LRVhFQworCS5tYWNoaW5lX2tleGVjX3ByZXBhcmUJPSBpc2VyaWVzX2tleGVjX3ByZXBhcmUsCisjZW5kaWYKIAkvKiBYWFggSW1wbGVtZW50IGVuYWJsZV9wbWNzIGZvciBpU2VyaWVzICovCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9jcHVmcmVxLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9jcHVmcmVxLmMKaW5kZXggNTg1NTZiMC4uODZkYjQ3YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvY3B1ZnJlcS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL2NwdWZyZXEuYwpAQCAtMTEyLDcgKzExMiw3IEBACiAKIHN0YXRpYyB2b2lkIHNldF9hc3RhdGUoaW50IGNwdSwgdW5zaWduZWQgaW50IGFzdGF0ZSkKIHsKLQl1NjQgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIFJldHVybiBpZiBjYWxsZWQgYmVmb3JlIGluaXQgaGFzIHJ1biAqLwogCWlmICh1bmxpa2VseSghc2RjYXNyX21hcGJhc2UpKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvZG1hX2xpYi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvZG1hX2xpYi5jCmluZGV4IDIxN2FmMzIuLmE2MTUyZDkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL2RtYV9saWIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9kbWFfbGliLmMKQEAgLTUwOSw3ICs1MDksNyBAQAogICovCiBpbnQgcGFzZW1pX2RtYV9pbml0KHZvaWQpCiB7Ci0Jc3RhdGljIHNwaW5sb2NrX3QgaW5pdF9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soaW5pdF9sb2NrKTsKIAlzdHJ1Y3QgcGNpX2RldiAqaW9iX3BkZXY7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXY7CiAJc3RydWN0IHJlc291cmNlIHJlczsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BjaS5jCmluZGV4IDU0YjdiNzYuLjA0Y2RkMzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9wY2kuYwpAQCAtNjYxLDYgKzY2MSw3IEBACiAJCQlwY2lfZmluZF9ob3NlX2Zvcl9PRl9kZXZpY2UobnApOwogCQlpZiAoIWhvc2UpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgZmluZCBQQ0kgaG9zZSBmb3IgT0hhcmUyICFcbiIpOworCQkJb2Zfbm9kZV9wdXQobnApOwogCQkJcmV0dXJuOwogCQl9CiAJCWVhcmx5X3JlYWRfY29uZmlnX3dvcmQoaG9zZSwgYnVzLCBkZXZmbiwgUENJX0NPTU1BTkQsICZjbWQpOwpAQCAtNjY5LDYgKzY3MCw3IEBACiAJCWVhcmx5X3dyaXRlX2NvbmZpZ193b3JkKGhvc2UsIGJ1cywgZGV2Zm4sIFBDSV9DT01NQU5ELCBjbWQpOwogCX0KIAloYXNfc2Vjb25kX29oYXJlID0gMTsKKwlvZl9ub2RlX3B1dChucCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3RpbWUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvdGltZS5jCmluZGV4IDU5ZWI4NDAuLjE4MTBlNDIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvdGltZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvdGltZS5jCkBAIC0yNjUsMTIgKzI2NSwxNSBAQAogCXN0cnVjdCByZXNvdXJjZSByc3JjOwogCiAJdmlhcyA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJ2aWEtY3VkYSIpOwotCWlmICh2aWFzID09IDApCisJaWYgKHZpYXMgPT0gTlVMTCkKIAkJdmlhcyA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJ2aWEtcG11Iik7Ci0JaWYgKHZpYXMgPT0gMCkKKwlpZiAodmlhcyA9PSBOVUxMKQogCQl2aWFzID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgInZpYSIpOwotCWlmICh2aWFzID09IDAgfHwgb2ZfYWRkcmVzc190b19yZXNvdXJjZSh2aWFzLCAwLCAmcnNyYykpCisJaWYgKHZpYXMgPT0gTlVMTCB8fCBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKHZpYXMsIDAsICZyc3JjKSkgeworCSAgICAgICAgb2Zfbm9kZV9wdXQodmlhcyk7CiAJCXJldHVybiAwOworCX0KKwlvZl9ub2RlX3B1dCh2aWFzKTsKIAl2aWEgPSBpb3JlbWFwKHJzcmMuc3RhcnQsIHJzcmMuZW5kIC0gcnNyYy5zdGFydCArIDEpOwogCWlmICh2aWEgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBtYXAgVklBIGZvciB0aW1lciBjYWxpYnJhdGlvbiAhXG4iKTsKQEAgLTI5Nyw3ICszMDAsNyBAQAogCXBwY190Yl9mcmVxID0gKGRzdGFydCAtIGRlbmQpICogMTAwIC8gNjsKIAogCWlvdW5tYXAodmlhKTsKLQkKKwogCXJldHVybiAxOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9kZXZpY2UtaW5pdC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvZGV2aWNlLWluaXQuYwppbmRleCBkYmMxMjRlLi5jYTcxYTEyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9kZXZpY2UtaW5pdC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2RldmljZS1pbml0LmMKQEAgLTUxOCw2ICs1MTgsNDEgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCitzdGF0aWMgaW50IF9faW5pdCBwczNfcmVnaXN0ZXJfcmFtZGlza19kZXZpY2Uodm9pZCkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBsYXlvdXQgeworCQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlIGRldjsKKwl9ICpwOworCisJcHJfZGVidWcoIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbGF5b3V0KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXApCisJCXJldHVybiAtRU5PTUVNOworCisJcC0+ZGV2Lm1hdGNoX2lkID0gUFMzX01BVENIX0lEX0dQVTsKKwlwLT5kZXYubWF0Y2hfc3ViX2lkID0gUFMzX01BVENIX1NVQl9JRF9HUFVfUkFNRElTSzsKKwlwLT5kZXYuZGV2X3R5cGUgPSBQUzNfREVWSUNFX1RZUEVfSU9DMDsKKworCXJlc3VsdCA9IHBzM19zeXN0ZW1fYnVzX2RldmljZV9yZWdpc3RlcigmcC0+ZGV2KTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkIHBzM19zeXN0ZW1fYnVzX2RldmljZV9yZWdpc3RlciBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQlnb3RvIGZhaWxfZGV2aWNlX3JlZ2lzdGVyOworCX0KKworCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIDA7CisKK2ZhaWxfZGV2aWNlX3JlZ2lzdGVyOgorCWtmcmVlKHApOworCXByX2RlYnVnKCIgPC0gJXM6JWQgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiByZXN1bHQ7Cit9CisKIC8qKgogICogcHMzX3NldHVwX2R5bmFtaWNfZGV2aWNlIC0gU2V0dXAgYSBkeW5hbWljIGRldmljZSBmcm9tIHRoZSByZXBvc2l0b3J5CiAgKi8KQEAgLTk0Niw2ICs5ODEsOCBAQAogCiAJcHMzX3JlZ2lzdGVyX2xwbV9kZXZpY2VzKCk7CiAKKwlwczNfcmVnaXN0ZXJfcmFtZGlza19kZXZpY2UoKTsKKwogCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9NYWtlZmlsZQppbmRleCA1YWZjZTExLi5iMzNiMjhhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvTWFrZWZpbGUKQEAgLTE3LDYgKzE3LDcgQEAKIG9iai0kKENPTkZJR19GU0xfTEJDKQkJKz0gZnNsX2xiYy5vCiBvYmotJChDT05GSUdfRlNMX0dUTSkJCSs9IGZzbF9ndG0ubwogb2JqLSQoQ09ORklHX01QQzh4eHhfR1BJTykJKz0gbXBjOHh4eF9ncGlvLm8KK29iai0kKENPTkZJR19TSU1QTEVfR1BJTykJKz0gc2ltcGxlX2dwaW8ubwogb2JqLSQoQ09ORklHX1JBUElESU8pCQkrPSBmc2xfcmlvLm8KIG9iai0kKENPTkZJR19UU0kxMDhfQlJJREdFKQkrPSB0c2kxMDhfcGNpLm8gdHNpMTA4X2Rldi5vCiBvYmotJChDT05GSUdfUVVJQ0NfRU5HSU5FKQkrPSBxZV9saWIvCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wY2kuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3BjaS5jCmluZGV4IGQ1ZjlhZTAuLmY2MTFkMDMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3BjaS5jCkBAIC0yOSw3ICsyOSw4IEBACiAKICNpZiBkZWZpbmVkKENPTkZJR19QUENfODV4eCkgfHwgZGVmaW5lZChDT05GSUdfUFBDXzg2eHgpCiAvKiBhdG11IHNldHVwIGZvciBmc2wgcGNpL3BjaWUgY29udHJvbGxlciAqLwotdm9pZCBfX2luaXQgc2V0dXBfcGNpX2F0bXUoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCBzdHJ1Y3QgcmVzb3VyY2UgKnJzcmMpCitzdGF0aWMgdm9pZCBfX2luaXQgc2V0dXBfcGNpX2F0bXUoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAorCQkJCSAgc3RydWN0IHJlc291cmNlICpyc3JjKQogewogCXN0cnVjdCBjY3NyX3BjaSBfX2lvbWVtICpwY2k7CiAJaW50IGk7CkBAIC04Niw3ICs4Nyw3IEBACiAJb3V0X2JlMzIoJnBjaS0+cGl3WzJdLnBpd2FyLCBQSVdBUl8yRyk7CiB9CiAKLXZvaWQgX19pbml0IHNldHVwX3BjaV9jbWQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQorc3RhdGljIHZvaWQgX19pbml0IHNldHVwX3BjaV9jbWQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQogewogCXUxNiBjbWQ7CiAJaW50IGNhcF94OwpAQCAtMTMwLDcgKzEzMSw3IEBACiAJcmV0dXJuIDsKIH0KIAotaW50IF9faW5pdCBmc2xfcGNpZV9jaGVja19saW5rKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSkKK3N0YXRpYyBpbnQgX19pbml0IGZzbF9wY2llX2NoZWNrX2xpbmsoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQogewogCXUzMiB2YWw7CiAJZWFybHlfcmVhZF9jb25maWdfZHdvcmQoaG9zZSwgMCwgMCwgUENJRV9MVFNTTSwgJnZhbCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuaCBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3NvYy5oCmluZGV4IDYwZjdmMjIuLjljNzQ0ZTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3NvYy5oCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3NvYy5oCkBAIC01LDggKzUsMTMgQEAKICNpbmNsdWRlIDxhc20vbW11Lmg+CiAKIGV4dGVybiBwaHlzX2FkZHJfdCBnZXRfaW1tcmJhc2Uodm9pZCk7CisjaWYgZGVmaW5lZChDT05GSUdfQ1BNMikgfHwgZGVmaW5lZChDT05GSUdfUVVJQ0NfRU5HSU5FKSB8fCBkZWZpbmVkKENPTkZJR184eHgpCiBleHRlcm4gdTMyIGdldF9icmdmcmVxKHZvaWQpOwogZXh0ZXJuIHUzMiBnZXRfYmF1ZHJhdGUodm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSB1MzIgZ2V0X2JyZ2ZyZXEodm9pZCkgeyByZXR1cm4gLTE7IH0KK3N0YXRpYyBpbmxpbmUgdTMyIGdldF9iYXVkcmF0ZSh2b2lkKSB7IHJldHVybiAtMTsgfQorI2VuZGlmCiBleHRlcm4gdTMyIGZzbF9nZXRfc3lzX2ZyZXEodm9pZCk7CiAKIHN0cnVjdCBzcGlfYm9hcmRfaW5mbzsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi9LY29uZmlnCmluZGV4IDc2ZmZiYzQuLjQxYWMzZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvS2NvbmZpZwpAQCAtMjIsNSArMjIsNiBAQAogCiBjb25maWcgUUVfVVNCCiAJYm9vbAorCWRlZmF1bHQgeSBpZiBVU0JfR0FER0VUX0ZTTF9RRQogCWhlbHAKLQkgIFFFIFVTQiBIb3N0IENvbnRyb2xsZXIgc3VwcG9ydAorCSAgUUUgVVNCIENvbnRyb2xsZXIgc3VwcG9ydApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvZ3Bpby5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvZ3Bpby5jCmluZGV4IDhlNWEwYmMuLjM0ODUyODggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL2dwaW8uYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi9ncGlvLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgpAQCAtMjQsOCArMjUsMTQgQEAKIAlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwIG1tX2djOwogCXNwaW5sb2NrX3QgbG9jazsKIAorCXVuc2lnbmVkIGxvbmcgcGluX2ZsYWdzW1FFX1BJT19QSU5TXTsKKyNkZWZpbmUgUUVfUElOX1JFUVVFU1RFRCAwCisKIAkvKiBzaGFkb3dlZCBkYXRhIHJlZ2lzdGVyIHRvIGNsZWFyL3NldCBiaXRzIHNhZmVseSAqLwogCXUzMiBjcGRhdGE7CisKKwkvKiBzYXZlZF9yZWdzIHVzZWQgdG8gcmVzdG9yZSBkZWRpY2F0ZWQgZnVuY3Rpb25zICovCisJc3RydWN0IHFlX3Bpb19yZWdzIHNhdmVkX3JlZ3M7CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBxZV9ncGlvX2NoaXAgKgpAQCAtNDAsNiArNDcsMTIgQEAKIAlzdHJ1Y3QgcWVfcGlvX3JlZ3MgX19pb21lbSAqcmVncyA9IG1tX2djLT5yZWdzOwogCiAJcWVfZ2MtPmNwZGF0YSA9IGluX2JlMzIoJnJlZ3MtPmNwZGF0YSk7CisJcWVfZ2MtPnNhdmVkX3JlZ3MuY3BkYXRhID0gcWVfZ2MtPmNwZGF0YTsKKwlxZV9nYy0+c2F2ZWRfcmVncy5jcGRpcjEgPSBpbl9iZTMyKCZyZWdzLT5jcGRpcjEpOworCXFlX2djLT5zYXZlZF9yZWdzLmNwZGlyMiA9IGluX2JlMzIoJnJlZ3MtPmNwZGlyMik7CisJcWVfZ2MtPnNhdmVkX3JlZ3MuY3BwYXIxID0gaW5fYmUzMigmcmVncy0+Y3BwYXIxKTsKKwlxZV9nYy0+c2F2ZWRfcmVncy5jcHBhcjIgPSBpbl9iZTMyKCZyZWdzLT5jcHBhcjIpOworCXFlX2djLT5zYXZlZF9yZWdzLmNwb2RyID0gaW5fYmUzMigmcmVncy0+Y3BvZHIpOwogfQogCiBzdGF0aWMgaW50IHFlX2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgZ3BpbykKQEAgLTEwMyw2ICsxMTYsMTg4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0cnVjdCBxZV9waW4geworCS8qCisJICogVGhlIHFlX2dwaW9fY2hpcCBuYW1lIGlzIHVuZm9ydHVuYXRlLCB3ZSBzaG91bGQgY2hhbmdlIHRoYXQgdG8KKwkgKiBzb21ldGhpbmcgbGlrZSBxZV9waW9fY29udHJvbGxlci4gU29tZWRheS4KKwkgKi8KKwlzdHJ1Y3QgcWVfZ3Bpb19jaGlwICpjb250cm9sbGVyOworCWludCBudW07Cit9OworCisvKioKKyAqIHFlX3Bpbl9yZXF1ZXN0IC0gUmVxdWVzdCBhIFFFIHBpbgorICogQG5wOgkJZGV2aWNlIG5vZGUgdG8gZ2V0IGEgcGluIGZyb20KKyAqIEBpbmRleDoJaW5kZXggb2YgYSBwaW4gaW4gdGhlIGRldmljZSB0cmVlCisgKiBDb250ZXh0Oglub24tYXRvbWljCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm4gcWVfcGluIHNvIHRoYXQgeW91IGNvdWxkIHVzZSBpdCB3aXRoIHRoZSByZXN0IG9mCisgKiB0aGUgUUUgUGluIE11bHRpcGxleGluZyBBUEkuCisgKi8KK3N0cnVjdCBxZV9waW4gKnFlX3Bpbl9yZXF1ZXN0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgcWVfcGluICpxZV9waW47CisJc3RydWN0IGRldmljZV9ub2RlICpnYzsKKwlzdHJ1Y3Qgb2ZfZ3Bpb19jaGlwICpvZl9nYyA9IE5VTEw7CisJc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW1fZ2M7CisJc3RydWN0IHFlX2dwaW9fY2hpcCAqcWVfZ2M7CisJaW50IGVycjsKKwlpbnQgc2l6ZTsKKwljb25zdCB2b2lkICpncGlvX3NwZWM7CisJY29uc3QgdTMyICpncGlvX2NlbGxzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlxZV9waW4gPSBremFsbG9jKHNpemVvZigqcWVfcGluKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFxZV9waW4pIHsKKwkJcHJfZGVidWcoIiVzOiBjYW4ndCBhbGxvY2F0ZSBtZW1vcnlcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCisJZXJyID0gb2ZfcGFyc2VfcGhhbmRsZXNfd2l0aF9hcmdzKG5wLCAiZ3Bpb3MiLCAiI2dwaW8tY2VsbHMiLCBpbmRleCwKKwkJCQkJICAmZ2MsICZncGlvX3NwZWMpOworCWlmIChlcnIpIHsKKwkJcHJfZGVidWcoIiVzOiBjYW4ndCBwYXJzZSBncGlvcyBwcm9wZXJ0eVxuIiwgX19mdW5jX18pOworCQlnb3RvIGVycjA7CisJfQorCisJaWYgKCFvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShnYywgImZzbCxtcGM4MzIzLXFlLXBhcmlvLWJhbmsiKSkgeworCQlwcl9kZWJ1ZygiJXM6IHRyaWVkIHRvIGdldCBhIG5vbi1xZSBwaW5cbiIsIF9fZnVuY19fKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBlcnIxOworCX0KKworCW9mX2djID0gZ2MtPmRhdGE7CisJaWYgKCFvZl9nYykgeworCQlwcl9kZWJ1ZygiJXM6IGdwaW8gY29udHJvbGxlciAlcyBpc24ndCByZWdpc3RlcmVkXG4iLAorCQkJIG5wLT5mdWxsX25hbWUsIGdjLT5mdWxsX25hbWUpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycjE7CisJfQorCisJZ3Bpb19jZWxscyA9IG9mX2dldF9wcm9wZXJ0eShnYywgIiNncGlvLWNlbGxzIiwgJnNpemUpOworCWlmICghZ3Bpb19jZWxscyB8fCBzaXplICE9IHNpemVvZigqZ3Bpb19jZWxscykgfHwKKwkJCSpncGlvX2NlbGxzICE9IG9mX2djLT5ncGlvX2NlbGxzKSB7CisJCXByX2RlYnVnKCIlczogd3JvbmcgI2dwaW8tY2VsbHMgZm9yICVzXG4iLAorCQkJIG5wLT5mdWxsX25hbWUsIGdjLT5mdWxsX25hbWUpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGVycjE7CisJfQorCisJZXJyID0gb2ZfZ2MtPnhsYXRlKG9mX2djLCBucCwgZ3Bpb19zcGVjLCBOVUxMKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnIxOworCisJbW1fZ2MgPSB0b19vZl9tbV9ncGlvX2NoaXAoJm9mX2djLT5nYyk7CisJcWVfZ2MgPSB0b19xZV9ncGlvX2NoaXAobW1fZ2MpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnFlX2djLT5sb2NrLCBmbGFncyk7CisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChRRV9QSU5fUkVRVUVTVEVELCAmcWVfZ2MtPnBpbl9mbGFnc1tlcnJdKSA9PSAwKSB7CisJCXFlX3Bpbi0+Y29udHJvbGxlciA9IHFlX2djOworCQlxZV9waW4tPm51bSA9IGVycjsKKwkJZXJyID0gMDsKKwl9IGVsc2UgeworCQllcnIgPSAtRUJVU1k7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcWVfZ2MtPmxvY2ssIGZsYWdzKTsKKworCWlmICghZXJyKQorCQlyZXR1cm4gcWVfcGluOworZXJyMToKKwlvZl9ub2RlX3B1dChnYyk7CitlcnIwOgorCWtmcmVlKHFlX3Bpbik7CisJcHJfZGVidWcoIiVzIGZhaWxlZCB3aXRoIHN0YXR1cyAlZFxuIiwgX19mdW5jX18sIGVycik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KK0VYUE9SVF9TWU1CT0wocWVfcGluX3JlcXVlc3QpOworCisvKioKKyAqIHFlX3Bpbl9mcmVlIC0gRnJlZSBhIHBpbgorICogQHFlX3BpbjoJcG9pbnRlciB0byB0aGUgcWVfcGluIHN0cnVjdHVyZQorICogQ29udGV4dDoJYW55CisgKgorICogVGhpcyBmdW5jdGlvbiBmcmVlcyB0aGUgcWVfcGluIHN0cnVjdHVyZSBhbmQgbWFrZXMgYSBwaW4gYXZhaWxhYmxlCisgKiBmb3IgZnVydGhlciBxZV9waW5fcmVxdWVzdCgpIGNhbGxzLgorICovCit2b2lkIHFlX3Bpbl9mcmVlKHN0cnVjdCBxZV9waW4gKnFlX3BpbikKK3sKKwlzdHJ1Y3QgcWVfZ3Bpb19jaGlwICpxZV9nYyA9IHFlX3Bpbi0+Y29udHJvbGxlcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWNvbnN0IGludCBwaW4gPSBxZV9waW4tPm51bTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZxZV9nYy0+bG9jaywgZmxhZ3MpOworCXRlc3RfYW5kX2NsZWFyX2JpdChRRV9QSU5fUkVRVUVTVEVELCAmcWVfZ2MtPnBpbl9mbGFnc1twaW5dKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxZV9nYy0+bG9jaywgZmxhZ3MpOworCisJa2ZyZWUocWVfcGluKTsKK30KK0VYUE9SVF9TWU1CT0wocWVfcGluX2ZyZWUpOworCisvKioKKyAqIHFlX3Bpbl9zZXRfZGVkaWNhdGVkIC0gUmV2ZXJ0IGEgcGluIHRvIGEgZGVkaWNhdGVkIHBlcmlwaGVyYWwgZnVuY3Rpb24gbW9kZQorICogQHFlX3BpbjoJcG9pbnRlciB0byB0aGUgcWVfcGluIHN0cnVjdHVyZQorICogQ29udGV4dDoJYW55CisgKgorICogVGhpcyBmdW5jdGlvbiByZXNldHMgYSBwaW4gdG8gYSBkZWRpY2F0ZWQgcGVyaXBoZXJhbCBmdW5jdGlvbiB0aGF0CisgKiBoYXMgYmVlbiBzZXQgdXAgYnkgdGhlIGZpcm13YXJlLgorICovCit2b2lkIHFlX3Bpbl9zZXRfZGVkaWNhdGVkKHN0cnVjdCBxZV9waW4gKnFlX3BpbikKK3sKKwlzdHJ1Y3QgcWVfZ3Bpb19jaGlwICpxZV9nYyA9IHFlX3Bpbi0+Y29udHJvbGxlcjsKKwlzdHJ1Y3QgcWVfcGlvX3JlZ3MgX19pb21lbSAqcmVncyA9IHFlX2djLT5tbV9nYy5yZWdzOworCXN0cnVjdCBxZV9waW9fcmVncyAqc3JlZ3MgPSAmcWVfZ2MtPnNhdmVkX3JlZ3M7CisJaW50IHBpbiA9IHFlX3Bpbi0+bnVtOworCXUzMiBtYXNrMSA9IDEgPDwgKFFFX1BJT19QSU5TIC0gKHBpbiArIDEpKTsKKwl1MzIgbWFzazIgPSAweDMgPDwgKFFFX1BJT19QSU5TIC0gKHBpbiAlIChRRV9QSU9fUElOUyAvIDIpICsgMSkgKiAyKTsKKwlib29sIHNlY29uZF9yZWcgPSBwaW4gPiAoUUVfUElPX1BJTlMgLyAyKSAtIDE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZxZV9nYy0+bG9jaywgZmxhZ3MpOworCisJaWYgKHNlY29uZF9yZWcpIHsKKwkJY2xyc2V0Yml0c19iZTMyKCZyZWdzLT5jcGRpcjIsIG1hc2syLCBzcmVncy0+Y3BkaXIyICYgbWFzazIpOworCQljbHJzZXRiaXRzX2JlMzIoJnJlZ3MtPmNwcGFyMiwgbWFzazIsIHNyZWdzLT5jcHBhcjIgJiBtYXNrMik7CisJfSBlbHNlIHsKKwkJY2xyc2V0Yml0c19iZTMyKCZyZWdzLT5jcGRpcjEsIG1hc2syLCBzcmVncy0+Y3BkaXIxICYgbWFzazIpOworCQljbHJzZXRiaXRzX2JlMzIoJnJlZ3MtPmNwcGFyMSwgbWFzazIsIHNyZWdzLT5jcHBhcjEgJiBtYXNrMik7CisJfQorCisJaWYgKHNyZWdzLT5jcGRhdGEgJiBtYXNrMSkKKwkJcWVfZ2MtPmNwZGF0YSB8PSBtYXNrMTsKKwllbHNlCisJCXFlX2djLT5jcGRhdGEgJj0gfm1hc2sxOworCisJb3V0X2JlMzIoJnJlZ3MtPmNwZGF0YSwgcWVfZ2MtPmNwZGF0YSk7CisJY2xyc2V0Yml0c19iZTMyKCZyZWdzLT5jcG9kciwgbWFzazEsIHNyZWdzLT5jcG9kciAmIG1hc2sxKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFlX2djLT5sb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKHFlX3Bpbl9zZXRfZGVkaWNhdGVkKTsKKworLyoqCisgKiBxZV9waW5fc2V0X2dwaW8gLSBTZXQgYSBwaW4gdG8gdGhlIEdQSU8gbW9kZQorICogQHFlX3BpbjoJcG9pbnRlciB0byB0aGUgcWVfcGluIHN0cnVjdHVyZQorICogQ29udGV4dDoJYW55CisgKgorICogVGhpcyBmdW5jdGlvbiBzZXRzIGEgcGluIHRvIHRoZSBHUElPIG1vZGUuCisgKi8KK3ZvaWQgcWVfcGluX3NldF9ncGlvKHN0cnVjdCBxZV9waW4gKnFlX3BpbikKK3sKKwlzdHJ1Y3QgcWVfZ3Bpb19jaGlwICpxZV9nYyA9IHFlX3Bpbi0+Y29udHJvbGxlcjsKKwlzdHJ1Y3QgcWVfcGlvX3JlZ3MgX19pb21lbSAqcmVncyA9IHFlX2djLT5tbV9nYy5yZWdzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcWVfZ2MtPmxvY2ssIGZsYWdzKTsKKworCS8qIExldCdzIG1ha2UgaXQgaW5wdXQgYnkgZGVmYXVsdCwgR1BJTyBBUEkgaXMgYWJsZSB0byBjaGFuZ2UgdGhhdC4gKi8KKwlfX3Bhcl9pb19jb25maWdfcGluKHJlZ3MsIHFlX3Bpbi0+bnVtLCBRRV9QSU9fRElSX0lOLCAwLCAwLCAwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFlX2djLT5sb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKHFlX3Bpbl9zZXRfZ3Bpbyk7CisKIHN0YXRpYyBpbnQgX19pbml0IHFlX2FkZF9ncGlvY2hpcHModm9pZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9zaW1wbGVfZ3Bpby5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9zaW1wbGVfZ3Bpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYzQ1NjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3NpbXBsZV9ncGlvLmMKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiBTaW1wbGUgTWVtb3J5LU1hcHBlZCBHUElPcworICoKKyAqIENvcHlyaWdodCAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiAyMDA4LgorICoKKyAqIEF1dGhvcjogQW50b24gVm9yb250c292IDxhdm9yb250c292QHJ1Lm12aXN0YS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgInNpbXBsZV9ncGlvLmgiCisKK3N0cnVjdCB1OF9ncGlvX2NoaXAgeworCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgbW1fZ2M7CisJc3BpbmxvY2tfdCBsb2NrOworCisJLyogc2hhZG93ZWQgZGF0YSByZWdpc3RlciB0byBjbGVhci9zZXQgYml0cyBzYWZlbHkgKi8KKwl1OCBkYXRhOworfTsKKworc3RhdGljIHN0cnVjdCB1OF9ncGlvX2NoaXAgKnRvX3U4X2dwaW9fY2hpcChzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbV9nYykKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKG1tX2djLCBzdHJ1Y3QgdThfZ3Bpb19jaGlwLCBtbV9nYyk7Cit9CisKK3N0YXRpYyB1OCB1OF9waW4ybWFzayh1bnNpZ25lZCBpbnQgcGluKQoreworCXJldHVybiAxIDw8ICg4IC0gMSAtIHBpbik7Cit9CisKK3N0YXRpYyBpbnQgdThfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBncGlvKQoreworCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tX2djID0gdG9fb2ZfbW1fZ3Bpb19jaGlwKGdjKTsKKworCXJldHVybiBpbl84KG1tX2djLT5yZWdzKSAmIHU4X3BpbjJtYXNrKGdwaW8pOworfQorCitzdGF0aWMgdm9pZCB1OF9ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IGdwaW8sIGludCB2YWwpCit7CisJc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW1fZ2MgPSB0b19vZl9tbV9ncGlvX2NoaXAoZ2MpOworCXN0cnVjdCB1OF9ncGlvX2NoaXAgKnU4X2djID0gdG9fdThfZ3Bpb19jaGlwKG1tX2djKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnU4X2djLT5sb2NrLCBmbGFncyk7CisKKwlpZiAodmFsKQorCQl1OF9nYy0+ZGF0YSB8PSB1OF9waW4ybWFzayhncGlvKTsKKwllbHNlCisJCXU4X2djLT5kYXRhICY9IH51OF9waW4ybWFzayhncGlvKTsKKworCW91dF84KG1tX2djLT5yZWdzLCB1OF9nYy0+ZGF0YSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1OF9nYy0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHU4X2dwaW9fZGlyX2luKHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgZ3BpbykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1OF9ncGlvX2Rpcl9vdXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBncGlvLCBpbnQgdmFsKQoreworCXU4X2dwaW9fc2V0KGdjLCBncGlvLCB2YWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1OF9ncGlvX3NhdmVfcmVncyhzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbV9nYykKK3sKKwlzdHJ1Y3QgdThfZ3Bpb19jaGlwICp1OF9nYyA9IHRvX3U4X2dwaW9fY2hpcChtbV9nYyk7CisKKwl1OF9nYy0+ZGF0YSA9IGluXzgobW1fZ2MtPnJlZ3MpOworfQorCitzdGF0aWMgaW50IF9faW5pdCB1OF9zaW1wbGVfZ3Bpb2NoaXBfYWRkKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgdThfZ3Bpb19jaGlwICp1OF9nYzsKKwlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbV9nYzsKKwlzdHJ1Y3Qgb2ZfZ3Bpb19jaGlwICpvZl9nYzsKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpnYzsKKworCXU4X2djID0ga3phbGxvYyhzaXplb2YoKnU4X2djKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF1OF9nYykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGluX2xvY2tfaW5pdCgmdThfZ2MtPmxvY2spOworCisJbW1fZ2MgPSAmdThfZ2MtPm1tX2djOworCW9mX2djID0gJm1tX2djLT5vZl9nYzsKKwlnYyA9ICZvZl9nYy0+Z2M7CisKKwltbV9nYy0+c2F2ZV9yZWdzID0gdThfZ3Bpb19zYXZlX3JlZ3M7CisJb2ZfZ2MtPmdwaW9fY2VsbHMgPSAyOworCWdjLT5uZ3BpbyA9IDg7CisJZ2MtPmRpcmVjdGlvbl9pbnB1dCA9IHU4X2dwaW9fZGlyX2luOworCWdjLT5kaXJlY3Rpb25fb3V0cHV0ID0gdThfZ3Bpb19kaXJfb3V0OworCWdjLT5nZXQgPSB1OF9ncGlvX2dldDsKKwlnYy0+c2V0ID0gdThfZ3Bpb19zZXQ7CisKKwlyZXQgPSBvZl9tbV9ncGlvY2hpcF9hZGQobnAsIG1tX2djKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKwlyZXR1cm4gMDsKK2VycjoKKwlrZnJlZSh1OF9nYyk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBfX2luaXQgc2ltcGxlX2dwaW9jaGlwX2luaXQoY29uc3QgY2hhciAqY29tcGF0aWJsZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCisJZm9yX2VhY2hfY29tcGF0aWJsZV9ub2RlKG5wLCBOVUxMLCBjb21wYXRpYmxlKSB7CisJCWludCByZXQ7CisJCXN0cnVjdCByZXNvdXJjZSByOworCisJCXJldCA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyOworCisJCXN3aXRjaCAocmVzb3VyY2Vfc2l6ZSgmcikpIHsKKwkJY2FzZSAxOgorCQkJcmV0ID0gdThfc2ltcGxlX2dwaW9jaGlwX2FkZChucCk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZXJyOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKgorCQkJICogV2hlbmV2ZXIgeW91IG5lZWQgc3VwcG9ydCBmb3IgR1BJTyBiYW5rIHdpZHRoID4gMSwKKwkJCSAqIHBsZWFzZSBqdXN0IHR1cm4gdThfIGNvZGUgaW50byBodWdlIG1hY3JvcywgYW5kCisJCQkgKiBjb25zdHJ1Y3QgbmVlZGVkIHVYXyBjb2RlIHdpdGggaXQuCisJCQkgKi8KKwkJCXJldCA9IC1FTk9TWVM7CisJCQlnb3RvIGVycjsKKwkJfQorCQljb250aW51ZTsKK2VycjoKKwkJcHJfZXJyKCIlczogcmVnaXN0cmF0aW9uIGZhaWxlZCwgc3RhdHVzICVkXG4iLAorCQkgICAgICAgbnAtPmZ1bGxfbmFtZSwgcmV0KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3NpbXBsZV9ncGlvLmggYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3NpbXBsZV9ncGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E3YjBjNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvc2ltcGxlX2dwaW8uaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9fU1lTREVWX1NJTVBMRV9HUElPX0gKKyNkZWZpbmUgX19TWVNERVZfU0lNUExFX0dQSU9fSAorCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworI2lmZGVmIENPTkZJR19TSU1QTEVfR1BJTworZXh0ZXJuIHZvaWQgc2ltcGxlX2dwaW9jaGlwX2luaXQoY29uc3QgY2hhciAqY29tcGF0aWJsZSk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHNpbXBsZV9ncGlvY2hpcF9pbml0KGNvbnN0IGNoYXIgKmNvbXBhdGlibGUpIHt9CisjZW5kaWYgLyogQ09ORklHX1NJTVBMRV9HUElPICovCisKKyNlbmRpZiAvKiBfX1NZU0RFVl9TSU1QTEVfR1BJT19IICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvS2NvbmZpZyBiL2FyY2gvczM5MC9LY29uZmlnCmluZGV4IDE5NTc3YWUuLmE5NGEzYzMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9LY29uZmlnCisrKyBiL2FyY2gvczM5MC9LY29uZmlnCkBAIC0yOTksNyArMjk5LDcgQEAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgdGhlIGNvbXBpbGVyIG9wdGlvbnMgLW13YXJuLWZyYW1lc2l6ZSBhbmQKIAkgIC1td2Fybi1keW5hbWljc3RhY2suIElmIHRoZSBjb21waWxlciBzdXBwb3J0cyB0aGVzZSBvcHRpb25zIGl0CiAJICB3aWxsIGdlbmVyYXRlIHdhcm5pbmdzIGZvciBmdW5jdGlvbiB3aGljaCBlaXRoZXIgdXNlIGFsbG9jYSBvcgotCSAgY3JlYXRlIGEgc3RhY2sgZnJhbWUgYmlnZ2VyIHRoZW4gQ09ORklHX1dBUk5fU1RBQ0tfU0laRS4KKwkgIGNyZWF0ZSBhIHN0YWNrIGZyYW1lIGJpZ2dlciB0aGFuIENPTkZJR19XQVJOX1NUQUNLX1NJWkUuCiAKIAkgIFNheSBOIGlmIHlvdSBhcmUgdW5zdXJlLgogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaHlwZnMvaW5vZGUuYyBiL2FyY2gvczM5MC9oeXBmcy9pbm9kZS5jCmluZGV4IDlkNGY4ZTYuLjVhODA1ZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9oeXBmcy9pbm9kZS5jCisrKyBiL2FyY2gvczM5MC9oeXBmcy9pbm9kZS5jCkBAIC0xMDYsNyArMTA2LDYgQEAKIAkJcmV0LT5pX21vZGUgPSBtb2RlOwogCQlyZXQtPmlfdWlkID0gaHlwZnNfaW5mby0+dWlkOwogCQlyZXQtPmlfZ2lkID0gaHlwZnNfaW5mby0+Z2lkOwotCQlyZXQtPmlfYmxvY2tzID0gMDsKIAkJcmV0LT5pX2F0aW1lID0gcmV0LT5pX210aW1lID0gcmV0LT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCQlpZiAobW9kZSAmIFNfSUZESVIpCiAJCQlyZXQtPmlfbmxpbmsgPSAyOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggNjNhMjM0MS4uZjJhZjQxNiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0xMywzICsxMyw0IEBACiB1bmlmZGVmLXkgKz0gZGVidWcuaAogdW5pZmRlZi15ICs9IGNocGlkLmgKIHVuaWZkZWYteSArPSBzY2hpZC5oCit1bmlmZGVmLXkgKz0gc3dhYi5oCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vYXRvbWljLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vYXRvbWljLmgKaW5kZXggMmQxODQ2NS4uZGU0MzJmMiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2F0b21pYy5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9hdG9taWMuaApAQCAtMiw2ICsyLDcgQEAKICNkZWZpbmUgX19BUkNIX1MzOTBfQVRPTUlDX18KIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogLyoKICAqICBpbmNsdWRlL2FzbS1zMzkwL2F0b21pYy5oCkBAIC0yMyw5ICsyNCw2IEBACiAgKiBTMzkwIHVzZXMgJ0NvbXBhcmUgQW5kIFN3YXAnIGZvciBhdG9taWNpdHkgaW4gU01QIGVudmlyb21lbnQKICAqLwogCi10eXBlZGVmIHN0cnVjdCB7Ci0JaW50IGNvdW50ZXI7Ci19IF9fYXR0cmlidXRlX18gKChhbGlnbmVkICg0KSkpIGF0b21pY190OwogI2RlZmluZSBBVE9NSUNfSU5JVChpKSAgeyAoaSkgfQogCiAjaWZkZWYgX19LRVJORUxfXwpAQCAtMTQ5LDkgKzE0Nyw2IEBACiAjdW5kZWYgX19DU19MT09QCiAKICNpZmRlZiBfX3MzOTB4X18KLXR5cGVkZWYgc3RydWN0IHsKLQlsb25nIGxvbmcgY291bnRlcjsKLX0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDgpKSkgYXRvbWljNjRfdDsKICNkZWZpbmUgQVRPTUlDNjRfSU5JVChpKSAgeyAoaSkgfQogCiAjaWYgX19HTlVDX18gPiAzIHx8IChfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fID4gMikKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaAppbmRleCA4YmNmMjc3Li5iOTVhMmIyIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCkBAIC0xLDk1ICsxLDcgQEAKICNpZm5kZWYgX1MzOTBfQllURU9SREVSX0gKICNkZWZpbmUgX1MzOTBfQllURU9SREVSX0gKIAotLyoKLSAqICBpbmNsdWRlL2FzbS1zMzkwL2J5dGVvcmRlci5oCi0gKgotICogIFMzOTAgdmVyc2lvbgotICogICAgQ29weXJpZ2h0IChDKSAxOTk5IElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILCBJQk0gQ29ycG9yYXRpb24KLSAqICAgIEF1dGhvcihzKTogTWFydGluIFNjaHdpZGVmc2t5IChzY2h3aWRlZnNreUBkZS5pYm0uY29tKQotICovCi0KLSNpbmNsdWRlIDxhc20vdHlwZXMuaD4KLQotI2RlZmluZSBfX0JJR19FTkRJQU4KLQotI2lmbmRlZiBfX3MzOTB4X18KLSMgZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KLSNlbmRpZgotCi0jaWZkZWYgX19zMzkweF9fCi1zdGF0aWMgaW5saW5lIF9fdTY0IF9fYXJjaF9zd2FiNjRwKGNvbnN0IF9fdTY0ICp4KQotewotCV9fdTY0IHJlc3VsdDsKLQotCWFzbSB2b2xhdGlsZSgibHJ2ZyAlMCwlMSIgOiAiPWQiIChyZXN1bHQpIDogIm0iICgqeCkpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0jZGVmaW5lIF9fYXJjaF9zd2FiNjRwIF9fYXJjaF9zd2FiNjRwCi0KLXN0YXRpYyBpbmxpbmUgX191NjQgX19hcmNoX3N3YWI2NChfX3U2NCB4KQotewotCV9fdTY0IHJlc3VsdDsKLQotCWFzbSB2b2xhdGlsZSgibHJ2Z3IgJTAsJTEiIDogIj1kIiAocmVzdWx0KSA6ICJkIiAoeCkpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0jZGVmaW5lIF9fYXJjaF9zd2FiNjQgX19hcmNoX3N3YWI2NAotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19hcmNoX3N3YWI2NHMoX191NjQgKngpCi17Ci0JKnggPSBfX2FyY2hfc3dhYjY0cCh4KTsKLX0KLSNkZWZpbmUgX19hcmNoX3N3YWI2NHMgX19hcmNoX3N3YWI2NHMKLSNlbmRpZiAvKiBfX3MzOTB4X18gKi8KLQotc3RhdGljIGlubGluZSBfX3UzMiBfX2FyY2hfc3dhYjMycChjb25zdCBfX3UzMiAqeCkKLXsKLQlfX3UzMiByZXN1bHQ7Ci0JCi0JYXNtIHZvbGF0aWxlKAotI2lmbmRlZiBfX3MzOTB4X18KLQkJIglpY20JJTAsOCwzKCUxKVxuIgotCQkiCWljbQklMCw0LDIoJTEpXG4iCi0JCSIJaWNtCSUwLDIsMSglMSlcbiIKLQkJIglpYwklMCwwKCUxKSIKLQkJOiAiPSZkIiAocmVzdWx0KSA6ICJhIiAoeCksICJtIiAoKngpIDogImNjIik7Ci0jZWxzZSAvKiBfX3MzOTB4X18gKi8KLQkJIglscnYJJTAsJTEiCi0JCTogIj1kIiAocmVzdWx0KSA6ICJtIiAoKngpKTsKLSNlbmRpZiAvKiBfX3MzOTB4X18gKi8KLQlyZXR1cm4gcmVzdWx0OwotfQotI2RlZmluZSBfX2FyY2hfc3dhYjMycCBfX2FyY2hfc3dhYjMycAotCi0jaWZkZWYgX19zMzkweF9fCi1zdGF0aWMgaW5saW5lIF9fdTMyIF9fYXJjaF9zd2FiMzIoX191MzIgeCkKLXsKLQlfX3UzMiByZXN1bHQ7Ci0JCi0JYXNtIHZvbGF0aWxlKCJscnZyICAlMCwlMSIgOiAiPWQiIChyZXN1bHQpIDogImQiICh4KSk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLSNkZWZpbmUgX19hcmNoX3N3YWIzMiBfX2FyY2hfc3dhYjMyCi0jZW5kaWYgLyogX19zMzkweF9fICovCi0KLXN0YXRpYyBpbmxpbmUgX191MTYgX19hcmNoX3N3YWIxNnAoY29uc3QgX191MTYgKngpCi17Ci0JX191MTYgcmVzdWx0OwotCQotCWFzbSB2b2xhdGlsZSgKLSNpZm5kZWYgX19zMzkweF9fCi0JCSIJaWNtCSUwLDIsMSglMSlcbiIKLQkJIglpYwklMCwwKCUxKVxuIgotCQk6ICI9JmQiIChyZXN1bHQpIDogImEiICh4KSwgIm0iICgqeCkgOiAiY2MiKTsKLSNlbHNlIC8qIF9fczM5MHhfXyAqLwotCQkiCWxydmgJJTAsJTEiCi0JCTogIj1kIiAocmVzdWx0KSA6ICJtIiAoKngpKTsKLSNlbmRpZiAvKiBfX3MzOTB4X18gKi8KLQlyZXR1cm4gcmVzdWx0OwotfQotI2RlZmluZSBfX2FyY2hfc3dhYjE2cCBfX2FyY2hfc3dhYjE2cAotCi0jaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL3N3YWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvYmlnX2VuZGlhbi5oPgogCiAjZW5kaWYgLyogX1MzOTBfQllURU9SREVSX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zMzkwX3JkZXYuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zMzkwX3JkZXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZhMjA0NC4uMDAwMDAwMAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vczM5MF9yZGV2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKgotICogIGluY2x1ZGUvYXNtLXMzOTAvY2N3ZGV2LmgKLSAqCi0gKiAgICBDb3B5cmlnaHQgKEMpIDIwMDIsMjAwNSBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSCwgSUJNIENvcnBvcmF0aW9uCi0gKiAgICBBdXRob3Iocyk6IENvcm5lbGlhIEh1Y2sgPGNvcm5lbGlhLmh1Y2tAZGUuaWJtLmNvbT4KLSAqICAgICAgICAgICAgICAgQ2Fyc3RlbiBPdHRlICA8Y290dGVAZGUuaWJtLmNvbT4KLSAqCi0gKiAgSW50ZXJmYWNlIGZvciBzMzkwIHJvb3QgZGV2aWNlCi0gKi8KLQotI2lmbmRlZiBfUzM5MF9SREVWX0hfCi0jZGVmaW5lIF9TMzkwX1JERVZfSF8KLWV4dGVybiBzdHJ1Y3QgZGV2aWNlICpzMzkwX3Jvb3RfZGV2X3JlZ2lzdGVyKGNvbnN0IGNoYXIgKik7Ci1leHRlcm4gdm9pZCBzMzkwX3Jvb3RfZGV2X3VucmVnaXN0ZXIoc3RydWN0IGRldmljZSAqKTsKLSNlbmRpZiAvKiBfUzM5MF9SREVWX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc3dhYi5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3N3YWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDkzMjFhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3N3YWIuaApAQCAtMCwwICsxLDkxIEBACisjaWZuZGVmIF9TMzkwX1NXQUJfSAorI2RlZmluZSBfUzM5MF9TV0FCX0gKKworLyoKKyAqICBpbmNsdWRlL2FzbS1zMzkwL3N3YWIuaAorICoKKyAqICBTMzkwIHZlcnNpb24KKyAqICAgIENvcHlyaWdodCAoQykgMTk5OSBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSCwgSUJNIENvcnBvcmF0aW9uCisgKiAgICBBdXRob3Iocyk6IE1hcnRpbiBTY2h3aWRlZnNreSAoc2Nod2lkZWZza3lAZGUuaWJtLmNvbSkKKyAqLworCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKKyNpZm5kZWYgX19zMzkweF9fCisjIGRlZmluZSBfX1NXQUJfNjRfVEhSVV8zMl9fCisjZW5kaWYKKworI2lmZGVmIF9fczM5MHhfXworc3RhdGljIGlubGluZSBfX3U2NCBfX2FyY2hfc3dhYjY0cChjb25zdCBfX3U2NCAqeCkKK3sKKwlfX3U2NCByZXN1bHQ7CisKKwlhc20gdm9sYXRpbGUoImxydmcgJTAsJTEiIDogIj1kIiAocmVzdWx0KSA6ICJtIiAoKngpKTsKKwlyZXR1cm4gcmVzdWx0OworfQorI2RlZmluZSBfX2FyY2hfc3dhYjY0cCBfX2FyY2hfc3dhYjY0cAorCitzdGF0aWMgaW5saW5lIF9fdTY0IF9fYXJjaF9zd2FiNjQoX191NjQgeCkKK3sKKwlfX3U2NCByZXN1bHQ7CisKKwlhc20gdm9sYXRpbGUoImxydmdyICUwLCUxIiA6ICI9ZCIgKHJlc3VsdCkgOiAiZCIgKHgpKTsKKwlyZXR1cm4gcmVzdWx0OworfQorI2RlZmluZSBfX2FyY2hfc3dhYjY0IF9fYXJjaF9zd2FiNjQKKworc3RhdGljIGlubGluZSB2b2lkIF9fYXJjaF9zd2FiNjRzKF9fdTY0ICp4KQoreworCSp4ID0gX19hcmNoX3N3YWI2NHAoeCk7Cit9CisjZGVmaW5lIF9fYXJjaF9zd2FiNjRzIF9fYXJjaF9zd2FiNjRzCisjZW5kaWYgLyogX19zMzkweF9fICovCisKK3N0YXRpYyBpbmxpbmUgX191MzIgX19hcmNoX3N3YWIzMnAoY29uc3QgX191MzIgKngpCit7CisJX191MzIgcmVzdWx0OworCQorCWFzbSB2b2xhdGlsZSgKKyNpZm5kZWYgX19zMzkweF9fCisJCSIJaWNtCSUwLDgsMyglMSlcbiIKKwkJIglpY20JJTAsNCwyKCUxKVxuIgorCQkiCWljbQklMCwyLDEoJTEpXG4iCisJCSIJaWMJJTAsMCglMSkiCisJCTogIj0mZCIgKHJlc3VsdCkgOiAiYSIgKHgpLCAibSIgKCp4KSA6ICJjYyIpOworI2Vsc2UgLyogX19zMzkweF9fICovCisJCSIJbHJ2CSUwLCUxIgorCQk6ICI9ZCIgKHJlc3VsdCkgOiAibSIgKCp4KSk7CisjZW5kaWYgLyogX19zMzkweF9fICovCisJcmV0dXJuIHJlc3VsdDsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWIzMnAgX19hcmNoX3N3YWIzMnAKKworI2lmZGVmIF9fczM5MHhfXworc3RhdGljIGlubGluZSBfX3UzMiBfX2FyY2hfc3dhYjMyKF9fdTMyIHgpCit7CisJX191MzIgcmVzdWx0OworCQorCWFzbSB2b2xhdGlsZSgibHJ2ciAgJTAsJTEiIDogIj1kIiAocmVzdWx0KSA6ICJkIiAoeCkpOworCXJldHVybiByZXN1bHQ7Cit9CisjZGVmaW5lIF9fYXJjaF9zd2FiMzIgX19hcmNoX3N3YWIzMgorI2VuZGlmIC8qIF9fczM5MHhfXyAqLworCitzdGF0aWMgaW5saW5lIF9fdTE2IF9fYXJjaF9zd2FiMTZwKGNvbnN0IF9fdTE2ICp4KQoreworCV9fdTE2IHJlc3VsdDsKKwkKKwlhc20gdm9sYXRpbGUoCisjaWZuZGVmIF9fczM5MHhfXworCQkiCWljbQklMCwyLDEoJTEpXG4iCisJCSIJaWMJJTAsMCglMSlcbiIKKwkJOiAiPSZkIiAocmVzdWx0KSA6ICJhIiAoeCksICJtIiAoKngpIDogImNjIik7CisjZWxzZSAvKiBfX3MzOTB4X18gKi8KKwkJIglscnZoCSUwLCUxIgorCQk6ICI9ZCIgKHJlc3VsdCkgOiAibSIgKCp4KSk7CisjZW5kaWYgLyogX19zMzkweF9fICovCisJcmV0dXJuIHJlc3VsdDsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWIxNnAgX19hcmNoX3N3YWIxNnAKKworI2VuZGlmIC8qIF9TMzkwX1NXQUJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9rcHJvYmVzLmMgYi9hcmNoL3MzOTAva2VybmVsL2twcm9iZXMuYwppbmRleCA1NjkwNzllLi5hMDFjZjAyIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2twcm9iZXMuYworKysgYi9hcmNoL3MzOTAva2VybmVsL2twcm9iZXMuYwpAQCAtMjE4LDkgKzIxOCwxMCBAQAogCiB2b2lkIF9fa3Byb2JlcyBhcmNoX3JlbW92ZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKLQltdXRleF9sb2NrKCZrcHJvYmVfbXV0ZXgpOwotCWZyZWVfaW5zbl9zbG90KHAtPmFpbnNuLmluc24sIDApOwotCW11dGV4X3VubG9jaygma3Byb2JlX211dGV4KTsKKwlpZiAocC0+YWluc24uaW5zbikgeworCQlmcmVlX2luc25fc2xvdChwLT5haW5zbi5pbnNuLCAwKTsKKwkJcC0+YWluc24uaW5zbiA9IE5VTEw7CisJfQogfQogCiBzdGF0aWMgdm9pZCBfX2twcm9iZXMgcHJlcGFyZV9zaW5nbGVzdGVwKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQpAQCAtMzgxLDcgKzM4Miw3IEBACiAJLyoKIAkgKiBJdCBpcyBwb3NzaWJsZSB0byBoYXZlIG11bHRpcGxlIGluc3RhbmNlcyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbgogCSAqIHRhc2sgZWl0aGVyIGJlY2F1c2UgYW4gbXVsdGlwbGUgZnVuY3Rpb25zIGluIHRoZSBjYWxsIHBhdGgKLQkgKiBoYXZlIGEgcmV0dXJuIHByb2JlIGluc3RhbGxlZCBvbiB0aGVtLCBhbmQvb3IgbW9yZSB0aGVuIG9uZSByZXR1cm4KKwkgKiBoYXZlIGEgcmV0dXJuIHByb2JlIGluc3RhbGxlZCBvbiB0aGVtLCBhbmQvb3IgbW9yZSB0aGFuIG9uZSByZXR1cm4KIAkgKiByZXR1cm4gcHJvYmUgd2FzIHJlZ2lzdGVyZWQgZm9yIGEgdGFyZ2V0IGZ1bmN0aW9uLgogCSAqCiAJICogV2UgY2FuIGhhbmRsZSB0aGlzIGJlY2F1c2U6CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbW0vaW5pdC5jIGIvYXJjaC9zMzkwL21tL2luaXQuYwppbmRleCAxNThiMGQ2Li5mMDI1OGNhIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbW0vaW5pdC5jCisrKyBiL2FyY2gvczM5MC9tbS9pbml0LmMKQEAgLTE4Myw3ICsxODMsNyBAQAogCXJjID0gdm1lbV9hZGRfbWFwcGluZyhzdGFydCwgc2l6ZSk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7Ci0JcmMgPSBfX2FkZF9wYWdlcyh6b25lLCBQRk5fRE9XTihzdGFydCksIFBGTl9ET1dOKHNpemUpKTsKKwlyYyA9IF9fYWRkX3BhZ2VzKG5pZCwgem9uZSwgUEZOX0RPV04oc3RhcnQpLCBQRk5fRE9XTihzaXplKSk7CiAJaWYgKHJjKQogCQl2bWVtX3JlbW92ZV9tYXBwaW5nKHN0YXJ0LCBzaXplKTsKIAlyZXR1cm4gcmM7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL29wcy1jYXltYW4uYyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLWNheW1hbi5jCmluZGV4IDVjY2Y5ZWEuLjM4ZWY3NjIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLWNheW1hbi5jCisrKyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLWNheW1hbi5jCkBAIC01LDExICs1LDYgQEAKICNpbmNsdWRlIDxjcHUvaXJxLmg+CiAjaW5jbHVkZSAicGNpLXNoNS5oIgogCi1zdGF0aWMgaW5saW5lIHU4IGJyaWRnZV9zd2l6emxlKHU4IHBpbiwgdTggc2xvdCkKLXsKLQlyZXR1cm4gKCgocGluIC0gMSkgKyBzbG90KSAlIDQpICsgMTsKLX0KLQogaW50IF9faW5pdCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCWludCByZXN1bHQgPSAtMTsKQEAgLTQyLDcgKzM3LDcgQEAKIAl3aGlsZSAoZGV2LT5idXMtPm51bWJlciA+IDApIHsKIAogCQlzbG90ID0gcGF0aFtpXS5zbG90ID0gUENJX1NMT1QoZGV2LT5kZXZmbik7Ci0JCXBpbiA9IHBhdGhbaV0ucGluID0gYnJpZGdlX3N3aXp6bGUocGluLCBzbG90KTsKKwkJcGluID0gcGF0aFtpXS5waW4gPSBwY2lfc3dpenpsZV9pbnRlcnJ1cHRfcGluKGRldiwgcGluKTsKIAkJZGV2ID0gZGV2LT5idXMtPnNlbGY7CiAJCWkrKzsKIAkJaWYgKGkgPiAzKSBwYW5pYygiUENJIHBhdGggdG8gcm9vdCBidXMgdG9vIGxvbmchXG4iKTsKQEAgLTU2LDcgKzUxLDcgQEAKIAlpZiAoKHNsb3QgPCAzKSB8fCAoaSA9PSAwKSkgewogCQkvKiBCdXMgMCAoaW5jbC4gUENJLVBDSSBicmlkZ2UgaXRzZWxmKSA6IHBlcmZvcm0gdGhlIGZpbmFsCiAJCSAgIHN3aXp6bGUgbm93LiAqLwotCQlyZXN1bHQgPSBJUlFfSU5UQSArIGJyaWRnZV9zd2l6emxlKHBpbiwgc2xvdCkgLSAxOworCQlyZXN1bHQgPSBJUlFfSU5UQSArIHBjaV9zd2l6emxlX2ludGVycnVwdF9waW4oZGV2LCBwaW4pIC0gMTsKIAl9IGVsc2UgewogCQlpLS07CiAJCXNsb3QgPSBwYXRoW2ldLnNsb3Q7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS5jIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2kuYwppbmRleCBkMzgzOWU2Li5lMzZjN2I4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS5jCisrKyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLmMKQEAgLTIxLDI2ICsyMSw2IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCi1zdGF0aWMgaW5saW5lIHU4IGJyaWRnZV9zd2l6emxlKHU4IHBpbiwgdTggc2xvdCkKLXsKLQlyZXR1cm4gKCgocGluIC0gMSkgKyBzbG90KSAlIDQpICsgMTsKLX0KLQotc3RhdGljIHU4IF9faW5pdCBzaW1wbGVfc3dpenpsZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCAqcGlucCkKLXsKLQl1OCBwaW4gPSAqcGlucDsKLQotCXdoaWxlIChkZXYtPmJ1cy0+cGFyZW50KSB7Ci0JCXBpbiA9IGJyaWRnZV9zd2l6emxlKHBpbiwgUENJX1NMT1QoZGV2LT5kZXZmbikpOwotCQkvKiBNb3ZlIHVwIHRoZSBjaGFpbiBvZiBicmlkZ2VzLiAqLwotCQlkZXYgPSBkZXYtPmJ1cy0+c2VsZjsKLQl9Ci0JKnBpbnAgPSBwaW47Ci0KLQkvKiBUaGUgc2xvdCBpcyB0aGUgc2xvdCBvZiB0aGUgbGFzdCBicmlkZ2UuICovCi0JcmV0dXJuIFBDSV9TTE9UKGRldi0+ZGV2Zm4pOwotfQotCiBzdGF0aWMgaW50IF9faW5pdCBwY2liaW9zX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgcGNpX2NoYW5uZWwgKnA7CkBAIC02MSw3ICs0MSw3IEBACiAJCWJ1c25vID0gYnVzLT5zdWJvcmRpbmF0ZSArIDE7CiAJfQogCi0JcGNpX2ZpeHVwX2lycXMoc2ltcGxlX3N3aXp6bGUsIHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycSk7CisJcGNpX2ZpeHVwX2lycXMocGNpX2NvbW1vbl9zd2l6emxlLCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvc2gvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IDQzOTEwY2QuLmYxYTJhMGQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC02LDMgKzYsNCBAQAogdW5pZmRlZi15ICs9IHVuaXN0ZF82NC5oCiB1bmlmZGVmLXkgKz0gcG9zaXhfdHlwZXNfMzIuaAogdW5pZmRlZi15ICs9IHBvc2l4X3R5cGVzXzY0LmgKK3VuaWZkZWYteSArPSBzd2FiLmgKZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9hc20vYXRvbWljLmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL2F0b21pYy5oCmluZGV4IGMwNDNlZjAuLjYzMjdmZmIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vYXRvbWljLmgKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9hdG9taWMuaApAQCAtNywxNiArNywxNSBAQAogICoKICAqLwogCi10eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIGludCBjb3VudGVyOyB9IGF0b21pY190OworI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKICNkZWZpbmUgQVRPTUlDX0lOSVQoaSkJKCAoYXRvbWljX3QpIHsgKGkpIH0gKQogCiAjZGVmaW5lIGF0b21pY19yZWFkKHYpCQkoKHYpLT5jb3VudGVyKQogI2RlZmluZSBhdG9taWNfc2V0KHYsaSkJCSgodiktPmNvdW50ZXIgPSAoaSkpCiAKLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLQogI2lmIGRlZmluZWQoQ09ORklHX0dVU0FfUkIpCiAjaW5jbHVkZSA8YXNtL2F0b21pYy1ncmIuaD4KICNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TSDRBKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaCBiL2FyY2gvc2gvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKaW5kZXggZjVmYTA2NS4uZTk1YzQxYSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaAorKysgYi9hcmNoL3NoL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCkBAIC0xLDY4ICsxLDEyIEBACiAjaWZuZGVmIF9fQVNNX1NIX0JZVEVPUkRFUl9ICiAjZGVmaW5lIF9fQVNNX1NIX0JZVEVPUkRFUl9ICiAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTkgIE5paWJlIFl1dGFrYQotICogQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxICBQYW9sbyBBbGJlcmVsbGkKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vc3dhYi5oPgogCiAjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KLSMgZGVmaW5lIF9fTElUVExFX0VORElBTgorI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9saXR0bGVfZW5kaWFuLmg+CiAjZWxzZQotIyBkZWZpbmUgX19CSUdfRU5ESUFOCisjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2JpZ19lbmRpYW4uaD4KICNlbmRpZgogCi0jZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KLQotc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyIF9fYXJjaF9zd2FiMzIoX191MzIgeCkKLXsKLQlfX2FzbV9fKAotI2lmZGVmIF9fU0g1X18KLQkJImJ5dGVyZXYJJTAsICUwXG5cdCIKLQkJInNoYXJpCQklMCwgMzIsICUwIgotI2Vsc2UKLQkJInN3YXAuYgkJJTAsICUwXG5cdCIKLQkJInN3YXAudwkJJTAsICUwXG5cdCIKLQkJInN3YXAuYgkJJTAsICUwIgotI2VuZGlmCi0JCTogIj1yIiAoeCkKLQkJOiAiMCIgKHgpKTsKLQotCXJldHVybiB4OwotfQotI2RlZmluZSBfX2FyY2hfc3dhYjMyIF9fYXJjaF9zd2FiMzIKLQotc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTE2IF9fYXJjaF9zd2FiMTYoX191MTYgeCkKLXsKLQlfX2FzbV9fKAotI2lmZGVmIF9fU0g1X18KLQkJImJ5dGVyZXYJJTAsICUwXG5cdCIKLQkJInNoYXJpCQklMCwgMzIsICUwIgotI2Vsc2UKLQkJInN3YXAuYgkJJTAsICUwIgotI2VuZGlmCi0JCTogIj1yIiAoeCkKLQkJOiAgIjAiICh4KSk7Ci0KLQlyZXR1cm4geDsKLX0KLSNkZWZpbmUgX19hcmNoX3N3YWIxNiBfX2FyY2hfc3dhYjE2Ci0KLXN0YXRpYyBpbmxpbmUgX191NjQgX19hcmNoX3N3YWI2NChfX3U2NCB2YWwpCi17Ci0JdW5pb24gewotCQlzdHJ1Y3QgeyBfX3UzMiBhLGI7IH0gczsKLQkJX191NjQgdTsKLQl9IHYsIHc7Ci0Jdi51ID0gdmFsOwotCXcucy5iID0gX19hcmNoX3N3YWIzMih2LnMuYSk7Ci0Jdy5zLmEgPSBfX2FyY2hfc3dhYjMyKHYucy5iKTsKLQlyZXR1cm4gdy51OwotfQotI2RlZmluZSBfX2FyY2hfc3dhYjY0IF9fYXJjaF9zd2FiNjQKLQotI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci5oPgotCiAjZW5kaWYgLyogX19BU01fU0hfQllURU9SREVSX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9hc20vc3dhYi5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9zd2FiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5MzE1OQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vc3dhYi5oCkBAIC0wLDAgKzEsNjAgQEAKKyNpZm5kZWYgX19BU01fU0hfU1dBQl9ICisjZGVmaW5lIF9fQVNNX1NIX1NXQUJfSAorCisvKgorICogQ29weXJpZ2h0IChDKSAxOTk5ICBOaWliZSBZdXRha2EKKyAqIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSAgUGFvbG8gQWxiZXJlbGxpCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgX19TV0FCXzY0X1RIUlVfMzJfXworCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19hcmNoX3N3YWIzMihfX3UzMiB4KQoreworCV9fYXNtX18oCisjaWZkZWYgX19TSDVfXworCQkiYnl0ZXJldgklMCwgJTBcblx0IgorCQkic2hhcmkJCSUwLCAzMiwgJTAiCisjZWxzZQorCQkic3dhcC5iCQklMCwgJTBcblx0IgorCQkic3dhcC53CQklMCwgJTBcblx0IgorCQkic3dhcC5iCQklMCwgJTAiCisjZW5kaWYKKwkJOiAiPXIiICh4KQorCQk6ICIwIiAoeCkpOworCisJcmV0dXJuIHg7Cit9CisjZGVmaW5lIF9fYXJjaF9zd2FiMzIgX19hcmNoX3N3YWIzMgorCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MTYgX19hcmNoX3N3YWIxNihfX3UxNiB4KQoreworCV9fYXNtX18oCisjaWZkZWYgX19TSDVfXworCQkiYnl0ZXJldgklMCwgJTBcblx0IgorCQkic2hhcmkJCSUwLCAzMiwgJTAiCisjZWxzZQorCQkic3dhcC5iCQklMCwgJTAiCisjZW5kaWYKKwkJOiAiPXIiICh4KQorCQk6ICAiMCIgKHgpKTsKKworCXJldHVybiB4OworfQorI2RlZmluZSBfX2FyY2hfc3dhYjE2IF9fYXJjaF9zd2FiMTYKKworc3RhdGljIGlubGluZSBfX3U2NCBfX2FyY2hfc3dhYjY0KF9fdTY0IHZhbCkKK3sKKwl1bmlvbiB7CisJCXN0cnVjdCB7IF9fdTMyIGEsYjsgfSBzOworCQlfX3U2NCB1OworCX0gdiwgdzsKKwl2LnUgPSB2YWw7CisJdy5zLmIgPSBfX2FyY2hfc3dhYjMyKHYucy5hKTsKKwl3LnMuYSA9IF9fYXJjaF9zd2FiMzIodi5zLmIpOworCXJldHVybiB3LnU7Cit9CisjZGVmaW5lIF9fYXJjaF9zd2FiNjQgX19hcmNoX3N3YWI2NAorCisjZW5kaWYgLyogX19BU01fU0hfU1dBQl9IICovCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC90cmFwc18zMi5jIGIvYXJjaC9zaC9rZXJuZWwvdHJhcHNfMzIuYwppbmRleCA4ODgwN2EyLi5jMGFhM2Q4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC90cmFwc18zMi5jCisrKyBiL2FyY2gvc2gva2VybmVsL3RyYXBzXzMyLmMKQEAgLTEzLDYgKzEzLDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vaW5pdC5jIGIvYXJjaC9zaC9tbS9pbml0LmMKaW5kZXggNmNiZWY4Yy4uM2VkZjI5NyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9pbml0LmMKKysrIGIvYXJjaC9zaC9tbS9pbml0LmMKQEAgLTMxMSw3ICszMTEsOCBAQAogCXBnZGF0ID0gTk9ERV9EQVRBKG5pZCk7CiAKIAkvKiBXZSBvbmx5IGhhdmUgWk9ORV9OT1JNQUwsIHNvIHRoaXMgaXMgZWFzeS4uICovCi0JcmV0ID0gX19hZGRfcGFnZXMocGdkYXQtPm5vZGVfem9uZXMgKyBaT05FX05PUk1BTCwgc3RhcnRfcGZuLCBucl9wYWdlcyk7CisJcmV0ID0gX19hZGRfcGFnZXMobmlkLCBwZ2RhdC0+bm9kZV96b25lcyArIFpPTkVfTk9STUFMLAorCQkJCXN0YXJ0X3BmbiwgbnJfcGFnZXMpOwogCWlmICh1bmxpa2VseShyZXQpKQogCQlwcmludGsoIiVzOiBGYWlsZWQsIF9fYWRkX3BhZ2VzKCkgPT0gJWRcbiIsIF9fZnVuY19fLCByZXQpOwogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL0tjb25maWcgYi9hcmNoL3NwYXJjL0tjb25maWcKaW5kZXggMGE5NGQ5Yy4uZGU1OGMwMiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9LY29uZmlnCisrKyBiL2FyY2gvc3BhcmMvS2NvbmZpZwpAQCAtNCw2ICs0LDE3IEBACiAKIG1haW5tZW51ICJMaW51eC9TUEFSQyBLZXJuZWwgQ29uZmlndXJhdGlvbiIKIAorY29uZmlnIDY0QklUCisJYm9vbCAiNjQtYml0IGtlcm5lbCIgaWYgQVJDSCA9ICJzcGFyYyIKKwlkZWZhdWx0IEFSQ0ggPSAic3BhcmM2NCIKKwloZWxwCisJICBTUEFSQyBpcyBhIGZhbWlseSBvZiBSSVNDIG1pY3JvcHJvY2Vzc29ycyBkZXNpZ25lZCBhbmQgbWFya2V0ZWQgYnkKKwkgIFN1biBNaWNyb3N5c3RlbXMsIGluY29ycG9yYXRlZC4gIFRoZXkgYXJlIHZlcnkgd2lkZWx5IGZvdW5kIGluIFN1bgorCSAgd29ya3N0YXRpb25zIGFuZCBjbG9uZXMuCisKKwkgIFNheSB5ZXMgdG8gYnVpbGQgYSA2NC1iaXQga2VybmVsIC0gZm9ybWVybHkga25vd24gYXMgc3BhcmM2NAorCSAgU2F5IG5vIHRvIGJ1aWxkIGEgMzItYml0IGtlcm5lbCAtIGZvcm1lcmx5IGtub3duIGFzIHNwYXJjCisKIGNvbmZpZyBTUEFSQwogCWJvb2wKIAlkZWZhdWx0IHkKQEAgLTE1LDIyICsyNiwxMSBAQAogCXNlbGVjdCBSVENfQ0xBU1MKIAlzZWxlY3QgUlRDX0RSVl9NNDhUNTkKIAotIyBJZGVudGlmeSB0aGlzIGFzIGEgU3BhcmMzMiBidWlsZAogY29uZmlnIFNQQVJDMzIKLQlib29sCi0JZGVmYXVsdCB5IGlmIEFSQ0ggPSAic3BhcmMiCi0JaGVscAotCSAgU1BBUkMgaXMgYSBmYW1pbHkgb2YgUklTQyBtaWNyb3Byb2Nlc3NvcnMgZGVzaWduZWQgYW5kIG1hcmtldGVkIGJ5Ci0JICBTdW4gTWljcm9zeXN0ZW1zLCBpbmNvcnBvcmF0ZWQuICBUaGV5IGFyZSB2ZXJ5IHdpZGVseSBmb3VuZCBpbiBTdW4KLQkgIHdvcmtzdGF0aW9ucyBhbmQgY2xvbmVzLiBUaGlzIHBvcnQgY292ZXJzIHRoZSBvcmlnaW5hbCAzMi1iaXQgU1BBUkM7Ci0JICBpdCBpcyBvbGQgYW5kIHN0YWJsZSBhbmQgdXN1YWxseSBjb25zaWRlcmVkIG9uZSBvZiB0aGUgImJpZyB0aHJlZSIKLQkgIGFsb25nIHdpdGggdGhlIEludGVsIGFuZCBBbHBoYSBwb3J0cy4gIFRoZSBVbHRyYUxpbnV4IHByb2plY3QKLQkgIG1haW50YWlucyBib3RoIHRoZSBTUEFSQzMyIGFuZCBTUEFSQzY0IHBvcnRzOyBpdHMgd2ViIHBhZ2UgaXMKLQkgIGF2YWlsYWJsZSBhdCA8aHR0cDovL3d3dy51bHRyYWxpbnV4Lm9yZy8+LgorCWRlZl9ib29sICE2NEJJVAogCiBjb25maWcgU1BBUkM2NAotCWJvb2wKLQlkZWZhdWx0IHkgaWYgQVJDSCA9ICJzcGFyYzY0IgorCWRlZl9ib29sIDY0QklUCiAJc2VsZWN0IEFSQ0hfU1VQUE9SVFNfTVNJCiAJc2VsZWN0IEhBVkVfRlVOQ1RJT05fVFJBQ0VSCiAJc2VsZWN0IEhBVkVfS1JFVFBST0JFUwpAQCAtNTMsOSArNTMsNiBAQAogCWRlZmF1bHQgMzIgaWYgU1BBUkMzMgogCWRlZmF1bHQgNjQgaWYgU1BBUkM2NAogCi1jb25maWcgNjRCSVQKLQlkZWZfYm9vbCB5IGlmIFNQQVJDNjQKLQogY29uZmlnIEdFTkVSSUNfVElNRQogCWJvb2wKIAlkZWZhdWx0IHkgaWYgU1BBUkM2NApAQCAtMTg4LDE0ICsxODUsNiBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAotY29uZmlnIEFSQ0hfSEFTX0lMT0cyX1UzMgotCWJvb2wKLQlkZWZhdWx0IG4KLQotY29uZmlnIEFSQ0hfSEFTX0lMT0cyX1U2NAotCWJvb2wKLQlkZWZhdWx0IG4KLQogY29uZmlnIEVNVUxBVEVEX0NNUFhDSEcKIAlib29sCiAJZGVmYXVsdCB5IGlmIFNQQVJDMzIKQEAgLTQ0MiwyNiArNDMxLDYgQEAKIGVuZG1lbnUKIAogbWVudSAiQnVzIG9wdGlvbnMgKFBDSSBldGMuKSIKLWNvbmZpZyBJU0EKLQlib29sCi0JaGVscAotCSAgSVNBIGlzIGZvdW5kIG9uIEVzcHJlc3NvIG9ubHkgYW5kIGlzIG5vdCBzdXBwb3J0ZWQgY3VycmVudGx5LgotCi1jb25maWcgSVNBUE5QCi0JYm9vbAotCWhlbHAKLQkgIElTQVBOUCBpcyBub3Qgc3VwcG9ydGVkCi0KLWNvbmZpZyBFSVNBCi0JYm9vbAotCWhlbHAKLQkgIEVJU0EgaXMgbm90IHN1cHBvcnRlZC4KLQotY29uZmlnIE1DQQotCWJvb2wKLQloZWxwCi0JICBNQ0EgaXMgbm90IHN1cHBvcnRlZC4KLQogY29uZmlnIFNCVVMKIAlib29sCiAJZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2NvbmZpZ3Mvc3BhcmM2NF9kZWZjb25maWcgYi9hcmNoL3NwYXJjL2NvbmZpZ3Mvc3BhcmM2NF9kZWZjb25maWcKaW5kZXggMDVkMTlhMy4uY2RlMTlhZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9jb25maWdzL3NwYXJjNjRfZGVmY29uZmlnCisrKyBiL2FyY2gvc3BhcmMvY29uZmlncy9zcGFyYzY0X2RlZmNvbmZpZwpAQCAtMSwyNyArMSwyNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI4LXJjNAotIyBNb24gTm92IDEwIDEyOjM1OjA5IDIwMDgKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yOAorIyBGcmkgSmFuICAyIDE4OjE0OjI2IDIwMDkKICMKIENPTkZJR19TUEFSQz15CiBDT05GSUdfU1BBUkM2ND15CitDT05GSUdfQVJDSF9ERUZDT05GSUc9ImFyY2gvc3BhcmMvY29uZmlncy9zcGFyYzY0X2RlZmNvbmZpZyIKK0NPTkZJR19CSVRTPTY0CitDT05GSUdfNjRCSVQ9eQogQ09ORklHX0dFTkVSSUNfVElNRT15CiBDT05GSUdfR0VORVJJQ19DTU9TX1VQREFURT15CiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15Ci1DT05GSUdfNjRCSVQ9eQotQ09ORklHX01NVT15CiBDT05GSUdfSU9NTVVfSEVMUEVSPXkKIENPTkZJR19RVUlDS0xJU1Q9eQogQ09ORklHX1NUQUNLVFJBQ0VfU1VQUE9SVD15CiBDT05GSUdfTE9DS0RFUF9TVVBQT1JUPXkKLUNPTkZJR19BUkNIX01BWV9IQVZFX1BDX0ZEQz15Ci0jIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0xBVEVOQ1lUT1BfU1VQUE9SVD15CiBDT05GSUdfQVVESVRfQVJDSD15CiBDT05GSUdfSEFWRV9TRVRVUF9QRVJfQ1BVX0FSRUE9eQorQ09ORklHX0dFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUT15CitDT05GSUdfTU1VPXkKIENPTkZJR19BUkNIX05PX1ZJUlRfVE9fQlVTPXkKIENPTkZJR19PRj15Ci1DT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRPXkKIENPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCiAKICMKQEAgLTg2LDYgKzg2LDcgQEAKIENPTkZJR19TTFVCPXkKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogQ09ORklHX1BST0ZJTElORz15CitDT05GSUdfVFJBQ0VQT0lOVFM9eQogIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiBDT05GSUdfT1BST0ZJTEU9bQogQ09ORklHX0hBVkVfT1BST0ZJTEU9eQpAQCAtMTI3LDM0ICsxMjgsNDAgQEAKICMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0CiBDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJhbnRpY2lwYXRvcnkiCiBDT05GSUdfQ0xBU1NJQ19SQ1U9eQorIyBDT05GSUdfVFJFRV9SQ1UgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorIyBDT05GSUdfVFJFRV9SQ1VfVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVF9SQ1VfVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfRlJFRVpFUiBpcyBub3Qgc2V0CiAKICMKICMgUHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzCiAjCi1DT05GSUdfU1BBUkM2NF9QQUdFX1NJWkVfOEtCPXkKLSMgQ09ORklHX1NQQVJDNjRfUEFHRV9TSVpFXzY0S0IgaXMgbm90IHNldAotQ09ORklHX1NFQ0NPTVA9eQorQ09ORklHX1NNUD15CitDT05GSUdfTlJfQ1BVUz02NAogQ09ORklHX0haXzEwMD15CiAjIENPTkZJR19IWl8yNTAgaXMgbm90IHNldAogIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAogQ09ORklHX0haPTEwMAogQ09ORklHX1NDSEVEX0hSVElDSz15CitDT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE09eQorQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CitDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfQVJDSF9NQVlfSEFWRV9QQ19GREM9eQorQ09ORklHX1NQQVJDNjRfU01QPXkKK0NPTkZJR19TUEFSQzY0X1BBR0VfU0laRV84S0I9eQorIyBDT05GSUdfU1BBUkM2NF9QQUdFX1NJWkVfNjRLQiBpcyBub3Qgc2V0CitDT05GSUdfU0VDQ09NUD15CiBDT05GSUdfSE9UUExVR19DUFU9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX1RJQ0tfT05FU0hPVD15CiBDT05GSUdfTk9fSFo9eQogQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15CiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CVUlMRD15Ci1DT05GSUdfU01QPXkKLUNPTkZJR19OUl9DUFVTPTY0CiAjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0CiBDT05GSUdfVVMzX01DPXkKLUNPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15Ci1DT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUPXkKLUNPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQotQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKIENPTkZJR19IVUdFVExCX1BBR0VfU0laRV80TUI9eQogIyBDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfNTEySyBpcyBub3Qgc2V0CiAjIENPTkZJR19IVUdFVExCX1BBR0VfU0laRV82NEsgaXMgbm90IHNldApAQCAtMTgzLDEwICsxOTAsMTggQEAKIENPTkZJR19aT05FX0RNQV9GTEFHPTAKIENPTkZJR19OUl9RVUlDSz0xCiBDT05GSUdfVU5FVklDVEFCTEVfTFJVPXkKK0NPTkZJR19TQ0hFRF9TTVQ9eQorQ09ORklHX1NDSEVEX01DPXkKKyMgQ09ORklHX1BSRUVNUFRfTk9ORSBpcyBub3Qgc2V0CitDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlk9eQorIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CisjIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAorCisjCisjIEJ1cyBvcHRpb25zIChQQ0kgZXRjLikKKyMKIENPTkZJR19TQlVTPXkKIENPTkZJR19TQlVTQ0hBUj15Ci1DT05GSUdfU1VOX0FVWElPPXkKLUNPTkZJR19TVU5fSU89eQogQ09ORklHX1NVTl9MRE9NUz15CiBDT05GSUdfUENJPXkKIENPTkZJR19QQ0lfRE9NQUlOUz15CkBAIC0xOTUsNyArMjEwLDkgQEAKIENPTkZJR19QQ0lfTVNJPXkKICMgQ09ORklHX1BDSV9MRUdBQ1kgaXMgbm90IHNldAogIyBDT05GSUdfUENJX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CiBDT05GSUdfU1VOX09QRU5QUk9NRlM9bQorQ09ORklHX1NQQVJDNjRfUENJPXkKIAogIwogIyBFeGVjdXRhYmxlIGZpbGUgZm9ybWF0cwpAQCAtMjA3LDE3ICsyMjQsMTMgQEAKIENPTkZJR19CSU5GTVRfTUlTQz1tCiBDT05GSUdfQ09NUEFUPXkKIENPTkZJR19TWVNWSVBDX0NPTVBBVD15Ci1DT05GSUdfU0NIRURfU01UPXkKLUNPTkZJR19TQ0hFRF9NQz15Ci0jIENPTkZJR19QUkVFTVBUX05PTkUgaXMgbm90IHNldAotQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZPXkKLSMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAotIyBDT05GSUdfQ01ETElORV9CT09MIGlzIG5vdCBzZXQKIENPTkZJR19ORVQ9eQogCiAjCiAjIE5ldHdvcmtpbmcgb3B0aW9ucwogIworIyBDT05GSUdfTkVUX05TIGlzIG5vdCBzZXQKK0NPTkZJR19DT01QQVRfTkVUX0RFVl9PUFM9eQogQ09ORklHX1BBQ0tFVD15CiBDT05GSUdfUEFDS0VUX01NQVA9eQogQ09ORklHX1VOSVg9eQpAQCAtMzE0LDYgKzMyNyw3IEBACiAjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAogIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorIyBDT05GSUdfRENCIGlzIG5vdCBzZXQKIAogIwogIyBOZXR3b3JrIHRlc3RpbmcKQEAgLTMzMCw4ICszNDQsOCBAQAogIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAogQ09ORklHX1dJUkVMRVNTX09MRF9SRUdVTEFUT1JZPXkKICMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0CisjIENPTkZJR19MSUI4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF85UCBpcyBub3Qgc2V0CiAKQEAgLTM3OCw4ICszOTIsMTAgQEAKICMgQ09ORklHX0VFUFJPTV85M0NYNiBpcyBub3Qgc2V0CiAjIENPTkZJR19TR0lfSU9DNCBpcyBub3Qgc2V0CiAjIENPTkZJR19USUZNX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSUNTOTMyUzQwMSBpcyBub3Qgc2V0CiAjIENPTkZJR19FTkNMT1NVUkVfU0VSVklDRVMgaXMgbm90IHNldAogIyBDT05GSUdfSFBfSUxPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0MyUE9SVCBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9JREU9eQogQ09ORklHX0lERT15CiAKQEAgLTM4Nyw2ICs0MDMsNyBAQAogIyBQbGVhc2Ugc2VlIERvY3VtZW50YXRpb24vaWRlL2lkZS50eHQgZm9yIGhlbHAvaW5mbyBvbiBJREUgZHJpdmVzCiAjCiBDT05GSUdfSURFX1RJTUlOR1M9eQorQ09ORklHX0lERV9BVEFQST15CiAjIENPTkZJR19CTEtfREVWX0lERV9TQVRBIGlzIG5vdCBzZXQKIENPTkZJR19JREVfR0Q9eQogQ09ORklHX0lERV9HRF9BVEE9eQpAQCAtMzk0LDcgKzQxMSw2IEBACiBDT05GSUdfQkxLX0RFVl9JREVDRD15CiBDT05GSUdfQkxLX0RFVl9JREVDRF9WRVJCT1NFX0VSUk9SUz15CiAjIENPTkZJR19CTEtfREVWX0lERVRBUEUgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JREVTQ1NJIGlzIG5vdCBzZXQKICMgQ09ORklHX0lERV9UQVNLX0lPQ1RMIGlzIG5vdCBzZXQKIENPTkZJR19JREVfUFJPQ19GUz15CiAKQEAgLTQ3Nyw2ICs0OTMsNyBAQAogIyBDT05GSUdfU0NTSV9TUlBfQVRUUlMgaXMgbm90IHNldAogQ09ORklHX1NDU0lfTE9XTEVWRUw9eQogIyBDT05GSUdfSVNDU0lfVENQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQ1hHQjNfSVNDU0kgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl8zV19YWFhYX1JBSUQgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV8zV185WFhYIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfQUNBUkQgaXMgbm90IHNldApAQCAtNDkwLDYgKzUwNyw4IEBACiAjIENPTkZJR19NRUdBUkFJRF9MRUdBQ1kgaXMgbm90IHNldAogIyBDT05GSUdfTUVHQVJBSURfU0FTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfSFBUSU9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xJQkZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZDT0UgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ETVgzMTkxRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0ZVVFVSRV9ET01BSU4gaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9JUFMgaXMgbm90IHNldApAQCAtNTY0LDYgKzU4Myw5IEBACiAjIENPTkZJR19CUk9BRENPTV9QSFkgaXMgbm90IHNldAogIyBDT05GSUdfSUNQTFVTX1BIWSBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUFMVEVLX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19OQVRJT05BTF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfU1RFMTBYUCBpcyBub3Qgc2V0CisjIENPTkZJR19MU0lfRVQxMDExQ19QSFkgaXMgbm90IHNldAogIyBDT05GSUdfTURJT19CSVRCQU5HIGlzIG5vdCBzZXQKIENPTkZJR19ORVRfRVRIRVJORVQ9eQogQ09ORklHX01JST1tCkBAIC01OTAsNyArNjEyLDYgQEAKICMgQ09ORklHX0FEQVBURUNfU1RBUkZJUkUgaXMgbm90IHNldAogIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKICMgQ09ORklHX0ZPUkNFREVUSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FRVBSTzEwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19FMTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZFQUxOWCBpcyBub3Qgc2V0CiAjIENPTkZJR19OQVRTRU1JIGlzIG5vdCBzZXQKQEAgLTYwMCw2ICs2MjEsNyBAQAogIyBDT05GSUdfUjYwNDAgaXMgbm90IHNldAogIyBDT05GSUdfU0lTOTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0VQSUMxMDAgaXMgbm90IHNldAorIyBDT05GSUdfU01TQzk0MjAgaXMgbm90IHNldAogIyBDT05GSUdfU1VOREFOQ0UgaXMgbm90IHNldAogIyBDT05GSUdfVExBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19WSUFfUkhJTkUgaXMgbm90IHNldApAQCAtNjI5LDYgKzY1MSw3IEBACiAjIENPTkZJR19KTUUgaXMgbm90IHNldAogQ09ORklHX05FVERFVl8xMDAwMD15CiAjIENPTkZJR19DSEVMU0lPX1QxIGlzIG5vdCBzZXQKK0NPTkZJR19DSEVMU0lPX1QzX0RFUEVORFM9eQogIyBDT05GSUdfQ0hFTFNJT19UMyBpcyBub3Qgc2V0CiAjIENPTkZJR19FTklDIGlzIG5vdCBzZXQKICMgQ09ORklHX0lYR0JFIGlzIG5vdCBzZXQKQEAgLTc3OCw2ICs4MDEsNyBAQAogQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQogIyBDT05GSUdfU0VSSUFMX0pTTSBpcyBub3Qgc2V0CiBDT05GSUdfVU5JWDk4X1BUWVM9eQorIyBDT05GSUdfREVWUFRTX01VTFRJUExFX0lOU1RBTkNFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAogQ09ORklHX0hXX1JBTkRPTT1tCkBAIC04NzAsNiArODk0LDcgQEAKICMgQ09ORklHX1NFTlNPUlNfQURNMTAyOSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FETTEwMzEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE05MjQwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURUNzQ2MiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FEVDc0NzAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRFQ3NDczIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQVRYUDEgaXMgbm90IHNldApAQCAtOTE5LDExICs5NDQsMTEgQEAKICMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAogIyBDT05GSUdfVEhFUk1BTF9IV01PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CitDT05GSUdfU1NCX1BPU1NJQkxFPXkKIAogIwogIyBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUKICMKLUNPTkZJR19TU0JfUE9TU0lCTEU9eQogIyBDT05GSUdfU1NCIGlzIG5vdCBzZXQKIAogIwpAQCAtMTA3MSw2ICsxMDk2LDcgQEAKIENPTkZJR19TTkRfUENNX09TUz1tCiBDT05GSUdfU05EX1BDTV9PU1NfUExVR0lOUz15CiBDT05GSUdfU05EX1NFUVVFTkNFUl9PU1M9eQorIyBDT05GSUdfU05EX0hSVElNRVIgaXMgbm90IHNldAogIyBDT05GSUdfU05EX0RZTkFNSUNfTUlOT1JTIGlzIG5vdCBzZXQKIENPTkZJR19TTkRfU1VQUE9SVF9PTERfQVBJPXkKIENPTkZJR19TTkRfVkVSQk9TRV9QUk9DRlM9eQpAQCAtMTI0MiwxMSArMTI2OCwxMSBAQAogIyBDT05GSUdfVVNCX1RNQyBpcyBub3Qgc2V0CiAKICMKLSMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JworIyBOT1RFOiBVU0JfU1RPUkFHRSBkZXBlbmRzIG9uIFNDU0kgYnV0IEJMS19ERVZfU0QgbWF5IGFsc28gYmUgbmVlZGVkOwogIwogCiAjCi0jIG1heSBhbHNvIGJlIG5lZWRlZDsgc2VlIFVTQl9TVE9SQUdFIEhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyMgc2VlIFVTQl9TVE9SQUdFIEhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24KICMKIENPTkZJR19VU0JfU1RPUkFHRT1tCiAjIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRyBpcyBub3Qgc2V0CkBAIC0xMzM3LDYgKzEzNjMsNyBAQAogIyBDT05GSUdfUlRDX0RSVl9NNDFUODAgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9TMzUzOTBBIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfRk0zMTMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUlg4NTgxIGlzIG5vdCBzZXQKIAogIwogIyBTUEkgUlRDIGRyaXZlcnMKQEAgLTEzNjUsNyArMTM5Miw2IEBACiAjIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19TVEFHSU5HIGlzIG5vdCBzZXQKLUNPTkZJR19TVEFHSU5HX0VYQ0xVREVfQlVJTEQ9eQogCiAjCiAjIE1pc2MgTGludXgvU1BBUkMgZHJpdmVycwpAQCAtMTU0NCw2ICsxNTcwLDcgQEAKICMgQ09ORklHX0xPQ0tfU1RBVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAorQ09ORklHX1NUQUNLVFJBQ0U9eQogIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CiAjIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKQEAgLTE1NTIsNiArMTU3OSw3IEBACiBDT05GSUdfREVCVUdfTUVNT1JZX0lOSVQ9eQogIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TRyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19OT1RJRklFUlMgaXMgbm90IHNldAogIyBDT05GSUdfQk9PVF9QUklOVEtfREVMQVkgaXMgbm90IHNldAogIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKQEAgLTE1NjAsOCArMTU4OCwxMiBAQAogIyBDT05GSUdfREVCVUdfQkxPQ0tfRVhUX0RFVlQgaXMgbm90IHNldAogIyBDT05GSUdfTEtEVE0gaXMgbm90IHNldAogIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBVEVOQ1lUT1AgaXMgbm90IHNldAogQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKK0NPTkZJR19OT1BfVFJBQ0VSPXkKIENPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFUj15CitDT05GSUdfUklOR19CVUZGRVI9eQorQ09ORklHX1RSQUNJTkc9eQogCiAjCiAjIFRyYWNlcnMKQEAgLTE1NzEsNyArMTYwMyw5IEBACiAjIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX0JPT1RfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RSQUNFX0JSQU5DSF9QUk9GSUxJTkcgaXMgbm90IHNldAogIyBDT05GSUdfU1RBQ0tfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZUUkFDRV9TVEFSVFVQX1RFU1QgaXMgbm90IHNldAogIyBDT05GSUdfRFlOQU1JQ19QUklOVEtfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9BUkNIX0tHREI9eQpAQCAtMTYwMCwxMSArMTYzNCwxNiBAQAogIwogIyBDT05GSUdfQ1JZUFRPX0ZJUFMgaXMgbm90IHNldAogQ09ORklHX0NSWVBUT19BTEdBUEk9eQorQ09ORklHX0NSWVBUT19BTEdBUEkyPXkKIENPTkZJR19DUllQVE9fQUVBRD15CitDT05GSUdfQ1JZUFRPX0FFQUQyPXkKIENPTkZJR19DUllQVE9fQkxLQ0lQSEVSPXkKK0NPTkZJR19DUllQVE9fQkxLQ0lQSEVSMj15CiBDT05GSUdfQ1JZUFRPX0hBU0g9eQotQ09ORklHX0NSWVBUT19STkc9eQorQ09ORklHX0NSWVBUT19IQVNIMj15CitDT05GSUdfQ1JZUFRPX1JORzI9eQogQ09ORklHX0NSWVBUT19NQU5BR0VSPXkKK0NPTkZJR19DUllQVE9fTUFOQUdFUjI9eQogQ09ORklHX0NSWVBUT19HRjEyOE1VTD1tCiBDT05GSUdfQ1JZUFRPX05VTEw9bQogIyBDT05GSUdfQ1JZUFRPX0NSWVBURCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IDg5YzI2MGEuLjk1ZTM4YTQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0xLDIxICsxLDYgQEAKICMgVXNlciBleHBvcnRlZCBzcGFyYyBoZWFkZXIgZmlsZXMKIGluY2x1ZGUgaW5jbHVkZS9hc20tZ2VuZXJpYy9LYnVpbGQuYXNtCiAKLWhlYWRlci15ICs9IGlwY2J1Zl8zMi5oCi1oZWFkZXIteSArPSBpcGNidWZfNjQuaAotaGVhZGVyLXkgKz0gcG9zaXhfdHlwZXNfMzIuaAotaGVhZGVyLXkgKz0gcG9zaXhfdHlwZXNfNjQuaAotaGVhZGVyLXkgKz0gcHRyYWNlXzMyLmgKLWhlYWRlci15ICs9IHB0cmFjZV82NC5oCi1oZWFkZXIteSArPSBzaWdjb250ZXh0XzMyLmgKLWhlYWRlci15ICs9IHNpZ2NvbnRleHRfNjQuaAotaGVhZGVyLXkgKz0gc2lnaW5mb18zMi5oCi1oZWFkZXIteSArPSBzaWdpbmZvXzY0LmgKLWhlYWRlci15ICs9IHNpZ25hbF8zMi5oCi1oZWFkZXIteSArPSBzaWduYWxfNjQuaAotaGVhZGVyLXkgKz0gc3RhdF8zMi5oCi1oZWFkZXIteSArPSBzdGF0XzY0LmgKLQogaGVhZGVyLXkgKz0gYXBjLmgKIGhlYWRlci15ICs9IGFzaS5oCiBoZWFkZXIteSArPSBkaXNwbGF5N3NlZy5oCkBAIC0yMywxNyArOCwxMyBAQAogaGVhZGVyLXkgKz0gZmJpby5oCiBoZWFkZXIteSArPSBqc2ZsYXNoLmgKIGhlYWRlci15ICs9IG9wZW5wcm9tLmgKLWhlYWRlci15ICs9IG9wZW5wcm9tXzMyLmgKLWhlYWRlci15ICs9IG9wZW5wcm9tXzY0LmgKIGhlYWRlci15ICs9IG9wZW5wcm9taW8uaAogaGVhZGVyLXkgKz0gcGVyZmN0ci5oCiBoZWFkZXIteSArPSBwc3Jjb21wYXQuaAogaGVhZGVyLXkgKz0gcHNyLmgKIGhlYWRlci15ICs9IHBzdGF0ZS5oCi1oZWFkZXIteSArPSByZWcuaAotaGVhZGVyLXkgKz0gcmVnXzMyLmgKLWhlYWRlci15ICs9IHJlZ182NC5oCiBoZWFkZXIteSArPSB0cmFwcy5oCiBoZWFkZXIteSArPSB1Y3R4LmgKIGhlYWRlci15ICs9IHV0cmFwLmgKIGhlYWRlci15ICs9IHdhdGNoZG9nLmgKK2hlYWRlci15ICs9IHN3YWIuaApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9hdG9taWNfMzIuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vYXRvbWljXzMyLmgKaW5kZXggNWM5NDRiNS4uY2U0NjU5NyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9hdG9taWNfMzIuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2F0b21pY18zMi5oCkBAIC0xMyw4ICsxMyw2IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCi10eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIGludCBjb3VudGVyOyB9IGF0b21pY190OwotCiAjaWZkZWYgX19LRVJORUxfXwogCiAjZGVmaW5lIEFUT01JQ19JTklUKGkpICB7IChpKSB9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2F0b21pY182NC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9hdG9taWNfNjQuaAppbmRleCA1OTgyYzVhLi5hMGE3MDY0IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2F0b21pY182NC5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vYXRvbWljXzY0LmgKQEAgLTEwLDkgKzEwLDYgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAotdHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBpbnQgY291bnRlcjsgfSBhdG9taWNfdDsKLXR5cGVkZWYgc3RydWN0IHsgdm9sYXRpbGUgX19zNjQgY291bnRlcjsgfSBhdG9taWM2NF90OwotCiAjZGVmaW5lIEFUT01JQ19JTklUKGkpCQl7IChpKSB9CiAjZGVmaW5lIEFUT01JQzY0X0lOSVQoaSkJeyAoaSkgfQogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaAppbmRleCA1YTcwZjEzLi40OGEwNDdjIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKQEAgLTEsNTEgKzEsNyBAQAogI2lmbmRlZiBfU1BBUkNfQllURU9SREVSX0gKICNkZWZpbmUgX1NQQVJDX0JZVEVPUkRFUl9ICiAKLSNpbmNsdWRlIDxhc20vdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vYXNpLmg+Ci0KLSNkZWZpbmUgX19CSUdfRU5ESUFOCi0KLSNpZmRlZiBDT05GSUdfU1BBUkMzMgotI2RlZmluZSBfX1NXQUJfNjRfVEhSVV8zMl9fCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19TUEFSQzY0Ci1zdGF0aWMgaW5saW5lIF9fdTE2IF9fYXJjaF9zd2FiMTZwKGNvbnN0IF9fdTE2ICphZGRyKQotewotCV9fdTE2IHJldDsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fICgibGR1aGEgWyUxXSAlMiwgJTAiCi0JCQkgICAgICA6ICI9ciIgKHJldCkKLQkJCSAgICAgIDogInIiIChhZGRyKSwgImkiIChBU0lfUEwpKTsKLQlyZXR1cm4gcmV0OwotfQotI2RlZmluZSBfX2FyY2hfc3dhYjE2cCBfX2FyY2hfc3dhYjE2cAotCi1zdGF0aWMgaW5saW5lIF9fdTMyIF9fYXJjaF9zd2FiMzJwKGNvbnN0IF9fdTMyICphZGRyKQotewotCV9fdTMyIHJldDsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fICgibGR1d2EgWyUxXSAlMiwgJTAiCi0JCQkgICAgICA6ICI9ciIgKHJldCkKLQkJCSAgICAgIDogInIiIChhZGRyKSwgImkiIChBU0lfUEwpKTsKLQlyZXR1cm4gcmV0OwotfQotI2RlZmluZSBfX2FyY2hfc3dhYjMycCBfX2FyY2hfc3dhYjMycAotCi1zdGF0aWMgaW5saW5lIF9fdTY0IF9fYXJjaF9zd2FiNjRwKGNvbnN0IF9fdTY0ICphZGRyKQotewotCV9fdTY0IHJldDsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fICgibGR4YSBbJTFdICUyLCAlMCIKLQkJCSAgICAgIDogIj1yIiAocmV0KQotCQkJICAgICAgOiAiciIgKGFkZHIpLCAiaSIgKEFTSV9QTCkpOwotCXJldHVybiByZXQ7Ci19Ci0jZGVmaW5lIF9fYXJjaF9zd2FiNjRwIF9fYXJjaF9zd2FiNjRwCi0KLSNlbmRpZiAvKiBDT05GSUdfU1BBUkM2NCAqLwotCi0jaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL3N3YWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvYmlnX2VuZGlhbi5oPgogCiAjZW5kaWYgLyogX1NQQVJDX0JZVEVPUkRFUl9IICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2lwY2J1Zi5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9pcGNidWYuaAppbmRleCAxN2Q2ZWY3Li42NjAxM2I0IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2lwY2J1Zi5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vaXBjYnVmLmgKQEAgLTEsOCArMSwzMiBAQAotI2lmbmRlZiBfX19BU01fU1BBUkNfSVBDQlVGX0gKLSNkZWZpbmUgX19fQVNNX1NQQVJDX0lQQ0JVRl9ICi0jaWYgZGVmaW5lZChfX3NwYXJjX18pICYmIGRlZmluZWQoX19hcmNoNjRfXykKLSNpbmNsdWRlIDxhc20vaXBjYnVmXzY0Lmg+Ci0jZWxzZQotI2luY2x1ZGUgPGFzbS9pcGNidWZfMzIuaD4KKyNpZm5kZWYgX19TUEFSQ19JUENCVUZfSAorI2RlZmluZSBfX1NQQVJDX0lQQ0JVRl9ICisKKy8qCisgKiBUaGUgaXBjNjRfcGVybSBzdHJ1Y3R1cmUgZm9yIHNwYXJjL3NwYXJjNjQgYXJjaGl0ZWN0dXJlLgorICogTm90ZSBleHRyYSBwYWRkaW5nIGJlY2F1c2UgdGhpcyBzdHJ1Y3R1cmUgaXMgcGFzc2VkIGJhY2sgYW5kIGZvcnRoCisgKiBiZXR3ZWVuIGtlcm5lbCBhbmQgdXNlciBzcGFjZS4KKyAqCisgKiBQYWQgc3BhY2UgaXMgbGVmdCBmb3I6CisgKiAtIDMyLWJpdCBzZXEKKyAqIC0gb24gc3BhcmMgZm9yIDMyIGJpdCBtb2RlIChpdCBpcyAzMiBiaXQgb24gc3BhcmM2NCkKKyAqIC0gMiBtaXNjZWxsYW5lb3VzIDY0LWJpdCB2YWx1ZXMKKyAqLworCitzdHJ1Y3QgaXBjNjRfcGVybQoreworCV9fa2VybmVsX2tleV90CWtleTsKKwlfX2tlcm5lbF91aWRfdAl1aWQ7CisJX19rZXJuZWxfZ2lkX3QJZ2lkOworCV9fa2VybmVsX3VpZF90CWN1aWQ7CisJX19rZXJuZWxfZ2lkX3QJY2dpZDsKKyNpZm5kZWYgX19hcmNoNjRfXworCXVuc2lnbmVkIHNob3J0CV9fcGFkMDsKICNlbmRpZgotI2VuZGlmCisJX19rZXJuZWxfbW9kZV90CW1vZGU7CisJdW5zaWduZWQgc2hvcnQJX19wYWQxOworCXVuc2lnbmVkIHNob3J0CXNlcTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgX191bnVzZWQxOworCXVuc2lnbmVkIGxvbmcgbG9uZyBfX3VudXNlZDI7Cit9OworCisjZW5kaWYgLyogX19TUEFSQ19JUENCVUZfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9pcGNidWZfMzIuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vaXBjYnVmXzMyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzODcyMDkuLjAwMDAwMDAKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9pcGNidWZfMzIuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSNpZm5kZWYgX1NQQVJDX0lQQ0JVRl9ICi0jZGVmaW5lIF9TUEFSQ19JUENCVUZfSAotCi0vKgotICogVGhlIGlwYzY0X3Blcm0gc3RydWN0dXJlIGZvciBzcGFyYyBhcmNoaXRlY3R1cmUuCi0gKiBOb3RlIGV4dHJhIHBhZGRpbmcgYmVjYXVzZSB0aGlzIHN0cnVjdHVyZSBpcyBwYXNzZWQgYmFjayBhbmQgZm9ydGgKLSAqIGJldHdlZW4ga2VybmVsIGFuZCB1c2VyIHNwYWNlLgotICoKLSAqIFBhZCBzcGFjZSBpcyBsZWZ0IGZvcjoKLSAqIC0gMzItYml0IG1vZGUKLSAqIC0gMzItYml0IHNlcQotICogLSAyIG1pc2NlbGxhbmVvdXMgNjQtYml0IHZhbHVlcyAoc28gdGhhdCB0aGlzIHN0cnVjdHVyZSBtYXRjaGVzCi0gKgkJCQkgICAgc3BhcmM2NCBpcGM2NF9wZXJtKQotICovCi0KLXN0cnVjdCBpcGM2NF9wZXJtCi17Ci0JX19rZXJuZWxfa2V5X3QJCWtleTsKLQlfX2tlcm5lbF91aWQzMl90CXVpZDsKLQlfX2tlcm5lbF9naWQzMl90CWdpZDsKLQlfX2tlcm5lbF91aWQzMl90CWN1aWQ7Ci0JX19rZXJuZWxfZ2lkMzJfdAljZ2lkOwotCXVuc2lnbmVkIHNob3J0CQlfX3BhZDE7Ci0JX19rZXJuZWxfbW9kZV90CQltb2RlOwotCXVuc2lnbmVkIHNob3J0CQlfX3BhZDI7Ci0JdW5zaWduZWQgc2hvcnQJCXNlcTsKLQl1bnNpZ25lZCBsb25nIGxvbmcJX191bnVzZWQxOwotCXVuc2lnbmVkIGxvbmcgbG9uZwlfX3VudXNlZDI7Ci19OwotCi0jZW5kaWYgLyogX1NQQVJDX0lQQ0JVRl9IICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2lwY2J1Zl82NC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9pcGNidWZfNjQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ0Yjg1NS4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2lwY2J1Zl82NC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotI2lmbmRlZiBfU1BBUkM2NF9JUENCVUZfSAotI2RlZmluZSBfU1BBUkM2NF9JUENCVUZfSAotCi0vKgotICogVGhlIGlwYzY0X3Blcm0gc3RydWN0dXJlIGZvciBzcGFyYzY0IGFyY2hpdGVjdHVyZS4KLSAqIE5vdGUgZXh0cmEgcGFkZGluZyBiZWNhdXNlIHRoaXMgc3RydWN0dXJlIGlzIHBhc3NlZCBiYWNrIGFuZCBmb3J0aAotICogYmV0d2VlbiBrZXJuZWwgYW5kIHVzZXIgc3BhY2UuCi0gKgotICogUGFkIHNwYWNlIGlzIGxlZnQgZm9yOgotICogLSAzMi1iaXQgc2VxCi0gKiAtIDIgbWlzY2VsbGFuZW91cyA2NC1iaXQgdmFsdWVzCi0gKi8KLQotc3RydWN0IGlwYzY0X3Blcm0KLXsKLQlfX2tlcm5lbF9rZXlfdAlrZXk7Ci0JX19rZXJuZWxfdWlkX3QJdWlkOwotCV9fa2VybmVsX2dpZF90CWdpZDsKLQlfX2tlcm5lbF91aWRfdAljdWlkOwotCV9fa2VybmVsX2dpZF90CWNnaWQ7Ci0JX19rZXJuZWxfbW9kZV90CW1vZGU7Ci0JdW5zaWduZWQgc2hvcnQJX19wYWQxOwotCXVuc2lnbmVkIHNob3J0CXNlcTsKLQl1bnNpZ25lZCBsb25nCV9fdW51c2VkMTsKLQl1bnNpZ25lZCBsb25nCV9fdW51c2VkMjsKLX07Ci0KLSNlbmRpZiAvKiBfU1BBUkM2NF9JUENCVUZfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9qc2ZsYXNoLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2pzZmxhc2guaAppbmRleCAzNDU3ZjI5Li4wNzE3ZDllIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2pzZmxhc2guaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2pzZmxhc2guaApAQCAtOCw3ICs4LDcgQEAKICNkZWZpbmUgX1NQQVJDX0pTRkxBU0hfSAogCiAjaWZuZGVmIF9TUEFSQ19UWVBFU19ICi0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNlbmRpZgogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9vcGVucHJvbS5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9vcGVucHJvbS5oCmluZGV4IGFhZWFlOTA1Li45NjNlMWE0IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL29wZW5wcm9tLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9vcGVucHJvbS5oCkBAIC0xLDggKzEsMjc3IEBACi0jaWZuZGVmIF9fX0FTTV9TUEFSQ19PUEVOUFJPTV9ICi0jZGVmaW5lIF9fX0FTTV9TUEFSQ19PUEVOUFJPTV9ICisjaWZuZGVmIF9fU1BBUkNfT1BFTlBST01fSAorI2RlZmluZSBfX1NQQVJDX09QRU5QUk9NX0gKKworLyogb3BlbnByb20uaDogIFByb20gc3RydWN0dXJlcyBhbmQgZGVmaW5lcyBmb3IgYWNjZXNzIHRvIHRoZSBPUEVOQk9PVAorICogICAgICAgICAgICAgIHByb20gcm91dGluZXMgYW5kIGRhdGEgYXJlYXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LDE5OTYgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KQorICovCisKKy8qIEVtcGlyaWNhbCBjb25zdGFudHMuLi4gKi8KKyNkZWZpbmUgTElOVVhfT1BQUk9NX01BR0lDICAgICAgMHgxMDAxMDQwNworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworLyogVjAgcHJvbSBkZXZpY2Ugb3BlcmF0aW9ucy4gKi8KK3N0cnVjdCBsaW51eF9kZXZfdjBfZnVuY3MgeworCWludCAoKnYwX2Rldm9wZW4pKGNoYXIgKmRldmljZV9zdHIpOworCWludCAoKnYwX2RldmNsb3NlKShpbnQgZGV2X2Rlc2MpOworCWludCAoKnYwX3JkYmxrZGV2KShpbnQgZGV2X2Rlc2MsIGludCBudW1fYmxrcywgaW50IGJsa19zdCwgY2hhciAqYnVmKTsKKwlpbnQgKCp2MF93cmJsa2RldikoaW50IGRldl9kZXNjLCBpbnQgbnVtX2Jsa3MsIGludCBibGtfc3QsIGNoYXIgKmJ1Zik7CisJaW50ICgqdjBfd3JuZXRkZXYpKGludCBkZXZfZGVzYywgaW50IG51bV9ieXRlcywgY2hhciAqYnVmKTsKKwlpbnQgKCp2MF9yZG5ldGRldikoaW50IGRldl9kZXNjLCBpbnQgbnVtX2J5dGVzLCBjaGFyICpidWYpOworCWludCAoKnYwX3JkY2hhcmRldikoaW50IGRldl9kZXNjLCBpbnQgbnVtX2J5dGVzLCBpbnQgZHVtbXksIGNoYXIgKmJ1Zik7CisJaW50ICgqdjBfd3JjaGFyZGV2KShpbnQgZGV2X2Rlc2MsIGludCBudW1fYnl0ZXMsIGludCBkdW1teSwgY2hhciAqYnVmKTsKKwlpbnQgKCp2MF9zZWVrZGV2KShpbnQgZGV2X2Rlc2MsIGxvbmcgbG9naWNhbF9vZmZzdCwgaW50IGZyb20pOworfTsKKworLyogVjIgYW5kIGxhdGVyIHByb20gZGV2aWNlIG9wZXJhdGlvbnMuICovCitzdHJ1Y3QgbGludXhfZGV2X3YyX2Z1bmNzIHsKKwlpbnQgKCp2Ml9pbnN0MnBrZykoaW50IGQpOwkvKiBDb252ZXJ0IGloYW5kbGUgdG8gcGhhbmRsZSAqLworCWNoYXIgKiAoKnYyX2R1bWJfbWVtX2FsbG9jKShjaGFyICp2YSwgdW5zaWduZWQgc3opOworCXZvaWQgKCp2Ml9kdW1iX21lbV9mcmVlKShjaGFyICp2YSwgdW5zaWduZWQgc3opOworCisJLyogVG8gbWFwIGRldmljZXMgaW50byB2aXJ0dWFsIEkvTyBzcGFjZS4gKi8KKwljaGFyICogKCp2Ml9kdW1iX21tYXApKGNoYXIgKnZpcnRhLCBpbnQgd2hpY2hfaW8sIHVuc2lnbmVkIHBhZGRyLCB1bnNpZ25lZCBzeik7CisJdm9pZCAoKnYyX2R1bWJfbXVubWFwKShjaGFyICp2aXJ0YSwgdW5zaWduZWQgc2l6ZSk7CisKKwlpbnQgKCp2Ml9kZXZfb3BlbikoY2hhciAqZGV2cGF0aCk7CisJdm9pZCAoKnYyX2Rldl9jbG9zZSkoaW50IGQpOworCWludCAoKnYyX2Rldl9yZWFkKShpbnQgZCwgY2hhciAqYnVmLCBpbnQgbmJ5dGVzKTsKKwlpbnQgKCp2Ml9kZXZfd3JpdGUpKGludCBkLCBjaGFyICpidWYsIGludCBuYnl0ZXMpOworCWludCAoKnYyX2Rldl9zZWVrKShpbnQgZCwgaW50IGhpLCBpbnQgbG8pOworCisJLyogTmV2ZXIgaXNzdWVkIChtdWx0aXN0YWdlIGxvYWQgc3VwcG9ydCkgKi8KKwl2b2lkICgqdjJfd2hlZWUyKSh2b2lkKTsKKwl2b2lkICgqdjJfd2hlZWUzKSh2b2lkKTsKK307CisKK3N0cnVjdCBsaW51eF9tbGlzdF92MCB7CisJc3RydWN0IGxpbnV4X21saXN0X3YwICp0aGVyZXNfbW9yZTsKKwl1bnNpZ25lZCBpbnQgc3RhcnRfYWRyOworCXVuc2lnbmVkIG51bV9ieXRlczsKK307CisKK3N0cnVjdCBsaW51eF9tZW1fdjAgeworCXN0cnVjdCBsaW51eF9tbGlzdF92MCAqKnYwX3RvdHBoeXM7CisJc3RydWN0IGxpbnV4X21saXN0X3YwICoqdjBfcHJvbW1hcDsKKwlzdHJ1Y3QgbGludXhfbWxpc3RfdjAgKip2MF9hdmFpbGFibGU7IC8qIFdoYXQgd2UgY2FuIHVzZSAqLworfTsKKworLyogQXJndW1lbnRzIHNlbnQgdG8gdGhlIGtlcm5lbCBmcm9tIHRoZSBib290IHByb21wdC4gKi8KK3N0cnVjdCBsaW51eF9hcmd1bWVudHNfdjAgeworCWNoYXIgKmFyZ3ZbOF07CisJY2hhciBhcmdzWzEwMF07CisJY2hhciBib290X2RldlsyXTsKKwlpbnQgYm9vdF9kZXZfY3RybDsKKwlpbnQgYm9vdF9kZXZfdW5pdDsKKwlpbnQgZGV2X3BhcnRpdGlvbjsKKwljaGFyICprZXJuZWxfZmlsZV9uYW1lOworCXZvaWQgKmFpZWVlMTsgICAgICAgICAgIC8qIFhYWCAqLworfTsKKworLyogVjIgYW5kIHVwIGJvb3QgdGhpbmdzLiAqLworc3RydWN0IGxpbnV4X2Jvb3RhcmdzX3YyIHsKKwljaGFyICoqYm9vdHBhdGg7CisJY2hhciAqKmJvb3RhcmdzOworCWludCAqZmRfc3RkaW47CisJaW50ICpmZF9zdGRvdXQ7Cit9OworCisvKiBUaGUgdG9wIGxldmVsIFBST00gdmVjdG9yLiAqLworc3RydWN0IGxpbnV4X3JvbXZlYyB7CisJLyogVmVyc2lvbiBudW1iZXJzLiAqLworCXVuc2lnbmVkIGludCBwdl9tYWdpY19jb29raWU7CisJdW5zaWduZWQgaW50IHB2X3JvbXZlcnM7CisJdW5zaWduZWQgaW50IHB2X3BsdWdpbl9yZXZpc2lvbjsKKwl1bnNpZ25lZCBpbnQgcHZfcHJpbnRyZXY7CisKKwkvKiBWZXJzaW9uIDAgbWVtb3J5IGRlc2NyaXB0b3JzLiAqLworCXN0cnVjdCBsaW51eF9tZW1fdjAgcHZfdjBtZW07CisKKwkvKiBOb2RlIG9wZXJhdGlvbnMuICovCisJc3RydWN0IGxpbnV4X25vZGVvcHMgKnB2X25vZGVvcHM7CisKKwljaGFyICoqcHZfYm9vdHN0cjsKKwlzdHJ1Y3QgbGludXhfZGV2X3YwX2Z1bmNzIHB2X3YwZGV2b3BzOworCisJY2hhciAqcHZfc3RkaW47CisJY2hhciAqcHZfc3Rkb3V0OworI2RlZmluZQlQUk9NREVWX0tCRAkwCQkvKiBpbnB1dCBmcm9tIGtleWJvYXJkICovCisjZGVmaW5lCVBST01ERVZfU0NSRUVOCTAJCS8qIG91dHB1dCB0byBzY3JlZW4gKi8KKyNkZWZpbmUJUFJPTURFVl9UVFlBCTEJCS8qIGluL291dCB0byB0dHlhICovCisjZGVmaW5lCVBST01ERVZfVFRZQgkyCQkvKiBpbi9vdXQgdG8gdHR5YiAqLworCisJLyogQmxvY2tpbmcgZ2V0Y2hhci9wdXRjaGFyLiAgTk9UIFJFRU5UUkFOVCEgKGdycikgKi8KKwlpbnQgKCpwdl9nZXRjaGFyKSh2b2lkKTsKKwl2b2lkICgqcHZfcHV0Y2hhcikoaW50IGNoKTsKKworCS8qIE5vbi1ibG9ja2luZyB2YXJpYW50cy4gKi8KKwlpbnQgKCpwdl9uYmdldGNoYXIpKHZvaWQpOworCWludCAoKnB2X25icHV0Y2hhcikoaW50IGNoKTsKKworCXZvaWQgKCpwdl9wdXRzdHIpKGNoYXIgKnN0ciwgaW50IGxlbik7CisKKwkvKiBNaXNjZWxsYW55LiAqLworCXZvaWQgKCpwdl9yZWJvb3QpKGNoYXIgKmJvb3RzdHIpOworCXZvaWQgKCpwdl9wcmludGYpKF9fY29uc3RfXyBjaGFyICpmbXQsIC4uLik7CisJdm9pZCAoKnB2X2Fib3J0KSh2b2lkKTsKKwlfX3ZvbGF0aWxlX18gaW50ICpwdl90aWNrczsKKwl2b2lkICgqcHZfaGFsdCkodm9pZCk7CisJdm9pZCAoKipwdl9zeW5jaG9vaykodm9pZCk7CisKKwkvKiBFdmFsdWF0ZSBhIGZvcnRoIHN0cmluZywgbm90IGRpZmZlcmVudCBwcm90byBmb3IgVjAgYW5kIFYyLT51cC4gKi8KKwl1bmlvbiB7CisJCXZvaWQgKCp2MF9ldmFsKShpbnQgbGVuLCBjaGFyICpzdHIpOworCQl2b2lkICgqdjJfZXZhbCkoY2hhciAqc3RyKTsKKwl9IHB2X2ZvcnRoZXZhbDsKKworCXN0cnVjdCBsaW51eF9hcmd1bWVudHNfdjAgKipwdl92MGJvb3RhcmdzOworCisJLyogR2V0IGV0aGVyIGFkZHJlc3MuICovCisJdW5zaWduZWQgaW50ICgqcHZfZW5hZGRyKShpbnQgZCwgY2hhciAqZW5hZGRyKTsKKworCXN0cnVjdCBsaW51eF9ib290YXJnc192MiBwdl92MmJvb3RhcmdzOworCXN0cnVjdCBsaW51eF9kZXZfdjJfZnVuY3MgcHZfdjJkZXZvcHM7CisKKwlpbnQgZmlsbGVyWzE1XTsKKworCS8qIFRoaXMgb25lIGlzIHN1bjRjL3N1bjQgb25seS4gKi8KKwl2b2lkICgqcHZfc2V0Y3R4dCkoaW50IGN0eHQsIGNoYXIgKnZhLCBpbnQgcG1lZyk7CisKKwkvKiBQcm9tIHZlcnNpb24gMyBNdWx0aXByb2Nlc3NvciByb3V0aW5lcy4gVGhpcyBzdHVmZiBpcyBjcmF6eS4KKwkgKiBObyBqb2tlLiBDYWxsaW5nIHRoZXNlIHdoZW4gdGhlcmUgaXMgb25seSBvbmUgY3B1IHByb2JhYmx5CisJICogY3Jhc2hlcyB0aGUgbWFjaGluZSwgaGF2ZSB0byB0ZXN0IHRoaXMuIDotKQorCSAqLworCisJLyogdjNfY3B1c3RhcnQoKSB3aWxsIHN0YXJ0IHRoZSBjcHUgJ3doaWNoY3B1JyBpbiBtbXUtY29udGV4dAorCSAqICd0aGlzY29udGV4dCcgZXhlY3V0aW5nIGF0IGFkZHJlc3MgJ3Byb2dfY291bnRlcicKKwkgKi8KKwlpbnQgKCp2M19jcHVzdGFydCkodW5zaWduZWQgaW50IHdoaWNoY3B1LCBpbnQgY3R4dGJsX3B0ciwKKwkJCSAgIGludCB0aGlzY29udGV4dCwgY2hhciAqcHJvZ19jb3VudGVyKTsKKworCS8qIHYzX2NwdXN0b3AoKSB3aWxsIGNhdXNlIGNwdSAnd2hpY2hjcHUnIHRvIHN0b3AgZXhlY3V0aW5nCisJICogdW50aWwgYSByZXN1bWUgY3B1IGNhbGwgaXMgbWFkZS4KKwkgKi8KKwlpbnQgKCp2M19jcHVzdG9wKSh1bnNpZ25lZCBpbnQgd2hpY2hjcHUpOworCisJLyogdjNfY3B1aWRsZSgpIHdpbGwgaWRsZSBjcHUgJ3doaWNoY3B1JyB1bnRpbCBhIHN0b3Agb3IKKwkgKiByZXN1bWUgY3B1IGNhbGwgaXMgbWFkZS4KKwkgKi8KKwlpbnQgKCp2M19jcHVpZGxlKSh1bnNpZ25lZCBpbnQgd2hpY2hjcHUpOworCisJLyogdjNfY3B1cmVzdW1lKCkgd2lsbCByZXN1bWUgcHJvY2Vzc29yICd3aGljaGNwdScgZXhlY3V0aW5nCisJICogc3RhcnRpbmcgd2l0aCB3aGF0ZXZlciAncGMnIGFuZCAnbnBjJyB3ZXJlIGxlZnQgYXQgdGhlCisJICogbGFzdCAnaWRsZScgb3IgJ3N0b3AnIGNhbGwuCisJICovCisJaW50ICgqdjNfY3B1cmVzdW1lKSh1bnNpZ25lZCBpbnQgd2hpY2hjcHUpOworfTsKKworLyogUm91dGluZXMgZm9yIHRyYXZlcnNpbmcgdGhlIHByb20gZGV2aWNlIHRyZWUuICovCitzdHJ1Y3QgbGludXhfbm9kZW9wcyB7CisJaW50ICgqbm9fbmV4dG5vZGUpKGludCBub2RlKTsKKwlpbnQgKCpub19jaGlsZCkoaW50IG5vZGUpOworCWludCAoKm5vX3Byb3BsZW4pKGludCBub2RlLCBjb25zdCBjaGFyICpuYW1lKTsKKwlpbnQgKCpub19nZXRwcm9wKShpbnQgbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgY2hhciAqdmFsKTsKKwlpbnQgKCpub19zZXRwcm9wKShpbnQgbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgY2hhciAqdmFsLCBpbnQgbGVuKTsKKwljaGFyICogKCpub19uZXh0cHJvcCkoaW50IG5vZGUsIGNoYXIgKm5hbWUpOworfTsKKworLyogTW9yZSBmdW4gUFJPTSBzdHJ1Y3R1cmVzIGZvciBkZXZpY2UgcHJvYmluZy4gKi8KICNpZiBkZWZpbmVkKF9fc3BhcmNfXykgJiYgZGVmaW5lZChfX2FyY2g2NF9fKQotI2luY2x1ZGUgPGFzbS9vcGVucHJvbV82NC5oPgorI2RlZmluZSBQUk9NUkVHX01BWCAgICAgMjQKKyNkZWZpbmUgUFJPTVZBRERSX01BWCAgIDE2CisjZGVmaW5lIFBST01JTlRSX01BWCAgICAzMgogI2Vsc2UKLSNpbmNsdWRlIDxhc20vb3BlbnByb21fMzIuaD4KKyNkZWZpbmUgUFJPTVJFR19NQVggICAgIDE2CisjZGVmaW5lIFBST01WQUREUl9NQVggICAxNgorI2RlZmluZSBQUk9NSU5UUl9NQVggICAgMTUKICNlbmRpZgorCitzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgeworCXVuc2lnbmVkIGludCB3aGljaF9pbzsJLyogaGkgcGFydCBvZiBwaHlzaWNhbCBhZGRyZXNzICovCisJdW5zaWduZWQgaW50IHBoeXNfYWRkcjsJLyogVGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhpcyByZWdpc3RlciAqLworCXVuc2lnbmVkIGludCByZWdfc2l6ZTsJLyogSG93IG1hbnkgYnl0ZXMgZG9lcyB0aGlzIHJlZ2lzdGVyIHRha2UgdXA/ICovCit9OworCitzdHJ1Y3QgbGludXhfcHJvbTY0X3JlZ2lzdGVycyB7CisJdW5zaWduZWQgbG9uZyBwaHlzX2FkZHI7CisJdW5zaWduZWQgbG9uZyByZWdfc2l6ZTsKK307CisKK3N0cnVjdCBsaW51eF9wcm9tX2lycXMgeworCWludCBwcmk7ICAgIC8qIElSUSBwcmlvcml0eSAqLworCWludCB2ZWN0b3I7IC8qIFRoaXMgaXMgZm9vYmFyLCB3aGF0IGRvZXMgaXQgZG8/ICovCit9OworCisvKiBFbGVtZW50IG9mIHRoZSAicmFuZ2VzIiB2ZWN0b3IgKi8KK3N0cnVjdCBsaW51eF9wcm9tX3JhbmdlcyB7CisJdW5zaWduZWQgaW50IG90X2NoaWxkX3NwYWNlOworCXVuc2lnbmVkIGludCBvdF9jaGlsZF9iYXNlOwkJLyogQnVzIGZlZWxzIHRoaXMgKi8KKwl1bnNpZ25lZCBpbnQgb3RfcGFyZW50X3NwYWNlOworCXVuc2lnbmVkIGludCBvdF9wYXJlbnRfYmFzZTsJCS8qIENQVSBsb29rcyBmcm9tIGhlcmUgKi8KKwl1bnNpZ25lZCBpbnQgb3Jfc2l6ZTsKK307CisKKy8qCisgKiBSYW5nZXMgYW5kIHJlZyBwcm9wZXJ0aWVzIGFyZSBhIGJpdCBkaWZmZXJlbnQgZm9yIFBDSS4KKyAqLworI2lmIGRlZmluZWQoX19zcGFyY19fKSAmJiBkZWZpbmVkKF9fYXJjaDY0X18pCitzdHJ1Y3QgbGludXhfcHJvbV9wY2lfcmVnaXN0ZXJzIHsKKwl1bnNpZ25lZCBpbnQgcGh5c19oaTsKKwl1bnNpZ25lZCBpbnQgcGh5c19taWQ7CisJdW5zaWduZWQgaW50IHBoeXNfbG87CisKKwl1bnNpZ25lZCBpbnQgc2l6ZV9oaTsKKwl1bnNpZ25lZCBpbnQgc2l6ZV9sbzsKK307CisjZWxzZQorc3RydWN0IGxpbnV4X3Byb21fcGNpX3JlZ2lzdGVycyB7CisJLyoKKwkgKiBXZSBkb24ndCBrbm93IHdoYXQgaW5mb3JtYXRpb24gdGhpcyBmaWVsZCBjb250YWluLgorCSAqIFdlIGd1ZXNzLCBQQ0kgZGV2aWNlIGZ1bmN0aW9uIGlzIGluIGJpdHMgMTU6OAorCSAqIFNvLCAuLi4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgd2hpY2hfaW87ICAvKiBMZXQgaXQgYmUgd2hpY2hfaW8gKi8KKworCXVuc2lnbmVkIGludCBwaHlzX2hpOworCXVuc2lnbmVkIGludCBwaHlzX2xvOworCisJdW5zaWduZWQgaW50IHNpemVfaGk7CisJdW5zaWduZWQgaW50IHNpemVfbG87Cit9OworCiAjZW5kaWYKKworc3RydWN0IGxpbnV4X3Byb21fcGNpX3JhbmdlcyB7CisJdW5zaWduZWQgaW50IGNoaWxkX3BoeXNfaGk7CS8qIE9ubHkgY2VydGFpbiBiaXRzIGFyZSBlbmNvZGVkIGhlcmUuICovCisJdW5zaWduZWQgaW50IGNoaWxkX3BoeXNfbWlkOworCXVuc2lnbmVkIGludCBjaGlsZF9waHlzX2xvOworCisJdW5zaWduZWQgaW50IHBhcmVudF9waHlzX2hpOworCXVuc2lnbmVkIGludCBwYXJlbnRfcGh5c19sbzsKKworCXVuc2lnbmVkIGludCBzaXplX2hpOworCXVuc2lnbmVkIGludCBzaXplX2xvOworfTsKKworc3RydWN0IGxpbnV4X3Byb21fcGNpX2ludG1hcCB7CisJdW5zaWduZWQgaW50IHBoeXNfaGk7CisJdW5zaWduZWQgaW50IHBoeXNfbWlkOworCXVuc2lnbmVkIGludCBwaHlzX2xvOworCisJdW5zaWduZWQgaW50IGludGVycnVwdDsKKworCWludCAgICAgICAgICBjbm9kZTsKKwl1bnNpZ25lZCBpbnQgY2ludGVycnVwdDsKK307CisKK3N0cnVjdCBsaW51eF9wcm9tX3BjaV9pbnRtYXNrIHsKKwl1bnNpZ25lZCBpbnQgcGh5c19oaTsKKwl1bnNpZ25lZCBpbnQgcGh5c19taWQ7CisJdW5zaWduZWQgaW50IHBoeXNfbG87CisJdW5zaWduZWQgaW50IGludGVycnVwdDsKK307CisKKyNlbmRpZiAvKiAhKF9fQVNTRU1CTFlfXykgKi8KKworI2VuZGlmIC8qICEoX19TUEFSQ19PUEVOUFJPTV9IKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9vcGVucHJvbV8zMi5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9vcGVucHJvbV8zMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzVkYTM1Li4wMDAwMDAwCi0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vb3BlbnByb21fMzIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0jaWZuZGVmIF9fU1BBUkNfT1BFTlBST01fSAotI2RlZmluZSBfX1NQQVJDX09QRU5QUk9NX0gKLQotLyogb3BlbnByb20uaDogIFByb20gc3RydWN0dXJlcyBhbmQgZGVmaW5lcyBmb3IgYWNjZXNzIHRvIHRoZSBPUEVOQk9PVAotICogICAgICAgICAgICAgIHByb20gcm91dGluZXMgYW5kIGRhdGEgYXJlYXMuCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk1IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSkKLSAqLwotCi0vKiBFbXBpcmljYWwgY29uc3RhbnRzLi4uICovCi0jZGVmaW5lCUxJTlVYX09QUFJPTV9NQUdJQyAgICAgIDB4MTAwMTA0MDcKLQotI2lmbmRlZiBfX0FTU0VNQkxZX18KLS8qIFYwIHByb20gZGV2aWNlIG9wZXJhdGlvbnMuICovCi1zdHJ1Y3QgbGludXhfZGV2X3YwX2Z1bmNzIHsKLQlpbnQgKCp2MF9kZXZvcGVuKShjaGFyICpkZXZpY2Vfc3RyKTsKLQlpbnQgKCp2MF9kZXZjbG9zZSkoaW50IGRldl9kZXNjKTsKLQlpbnQgKCp2MF9yZGJsa2RldikoaW50IGRldl9kZXNjLCBpbnQgbnVtX2Jsa3MsIGludCBibGtfc3QsIGNoYXIgKmJ1Zik7Ci0JaW50ICgqdjBfd3JibGtkZXYpKGludCBkZXZfZGVzYywgaW50IG51bV9ibGtzLCBpbnQgYmxrX3N0LCBjaGFyICpidWYpOwotCWludCAoKnYwX3dybmV0ZGV2KShpbnQgZGV2X2Rlc2MsIGludCBudW1fYnl0ZXMsIGNoYXIgKmJ1Zik7Ci0JaW50ICgqdjBfcmRuZXRkZXYpKGludCBkZXZfZGVzYywgaW50IG51bV9ieXRlcywgY2hhciAqYnVmKTsKLQlpbnQgKCp2MF9yZGNoYXJkZXYpKGludCBkZXZfZGVzYywgaW50IG51bV9ieXRlcywgaW50IGR1bW15LCBjaGFyICpidWYpOwotCWludCAoKnYwX3dyY2hhcmRldikoaW50IGRldl9kZXNjLCBpbnQgbnVtX2J5dGVzLCBpbnQgZHVtbXksIGNoYXIgKmJ1Zik7Ci0JaW50ICgqdjBfc2Vla2RldikoaW50IGRldl9kZXNjLCBsb25nIGxvZ2ljYWxfb2Zmc3QsIGludCBmcm9tKTsKLX07Ci0KLS8qIFYyIGFuZCBsYXRlciBwcm9tIGRldmljZSBvcGVyYXRpb25zLiAqLwotc3RydWN0IGxpbnV4X2Rldl92Ml9mdW5jcyB7Ci0JaW50ICgqdjJfaW5zdDJwa2cpKGludCBkKTsJLyogQ29udmVydCBpaGFuZGxlIHRvIHBoYW5kbGUgKi8KLQljaGFyICogKCp2Ml9kdW1iX21lbV9hbGxvYykoY2hhciAqdmEsIHVuc2lnbmVkIHN6KTsKLQl2b2lkICgqdjJfZHVtYl9tZW1fZnJlZSkoY2hhciAqdmEsIHVuc2lnbmVkIHN6KTsKLQotCS8qIFRvIG1hcCBkZXZpY2VzIGludG8gdmlydHVhbCBJL08gc3BhY2UuICovCi0JY2hhciAqICgqdjJfZHVtYl9tbWFwKShjaGFyICp2aXJ0YSwgaW50IHdoaWNoX2lvLCB1bnNpZ25lZCBwYWRkciwgdW5zaWduZWQgc3opOwotCXZvaWQgKCp2Ml9kdW1iX211bm1hcCkoY2hhciAqdmlydGEsIHVuc2lnbmVkIHNpemUpOwotCi0JaW50ICgqdjJfZGV2X29wZW4pKGNoYXIgKmRldnBhdGgpOwotCXZvaWQgKCp2Ml9kZXZfY2xvc2UpKGludCBkKTsKLQlpbnQgKCp2Ml9kZXZfcmVhZCkoaW50IGQsIGNoYXIgKmJ1ZiwgaW50IG5ieXRlcyk7Ci0JaW50ICgqdjJfZGV2X3dyaXRlKShpbnQgZCwgY2hhciAqYnVmLCBpbnQgbmJ5dGVzKTsKLQlpbnQgKCp2Ml9kZXZfc2VlaykoaW50IGQsIGludCBoaSwgaW50IGxvKTsKLQotCS8qIE5ldmVyIGlzc3VlZCAobXVsdGlzdGFnZSBsb2FkIHN1cHBvcnQpICovCi0Jdm9pZCAoKnYyX3doZWVlMikodm9pZCk7Ci0Jdm9pZCAoKnYyX3doZWVlMykodm9pZCk7Ci19OwotCi1zdHJ1Y3QgbGludXhfbWxpc3RfdjAgewotCXN0cnVjdCBsaW51eF9tbGlzdF92MCAqdGhlcmVzX21vcmU7Ci0JY2hhciAqc3RhcnRfYWRyOwotCXVuc2lnbmVkIG51bV9ieXRlczsKLX07Ci0KLXN0cnVjdCBsaW51eF9tZW1fdjAgewotCXN0cnVjdCBsaW51eF9tbGlzdF92MCAqKnYwX3RvdHBoeXM7Ci0Jc3RydWN0IGxpbnV4X21saXN0X3YwICoqdjBfcHJvbW1hcDsKLQlzdHJ1Y3QgbGludXhfbWxpc3RfdjAgKip2MF9hdmFpbGFibGU7IC8qIFdoYXQgd2UgY2FuIHVzZSAqLwotfTsKLQotLyogQXJndW1lbnRzIHNlbnQgdG8gdGhlIGtlcm5lbCBmcm9tIHRoZSBib290IHByb21wdC4gKi8KLXN0cnVjdCBsaW51eF9hcmd1bWVudHNfdjAgewotCWNoYXIgKmFyZ3ZbOF07Ci0JY2hhciBhcmdzWzEwMF07Ci0JY2hhciBib290X2RldlsyXTsKLQlpbnQgYm9vdF9kZXZfY3RybDsKLQlpbnQgYm9vdF9kZXZfdW5pdDsKLQlpbnQgZGV2X3BhcnRpdGlvbjsKLQljaGFyICprZXJuZWxfZmlsZV9uYW1lOwotCXZvaWQgKmFpZWVlMTsgICAgICAgICAgIC8qIFhYWCAqLwotfTsKLQotLyogVjIgYW5kIHVwIGJvb3QgdGhpbmdzLiAqLwotc3RydWN0IGxpbnV4X2Jvb3RhcmdzX3YyIHsKLQljaGFyICoqYm9vdHBhdGg7Ci0JY2hhciAqKmJvb3RhcmdzOwotCWludCAqZmRfc3RkaW47Ci0JaW50ICpmZF9zdGRvdXQ7Ci19OwotCi0vKiBUaGUgdG9wIGxldmVsIFBST00gdmVjdG9yLiAqLwotc3RydWN0IGxpbnV4X3JvbXZlYyB7Ci0JLyogVmVyc2lvbiBudW1iZXJzLiAqLwotCXVuc2lnbmVkIGludCBwdl9tYWdpY19jb29raWU7Ci0JdW5zaWduZWQgaW50IHB2X3JvbXZlcnM7Ci0JdW5zaWduZWQgaW50IHB2X3BsdWdpbl9yZXZpc2lvbjsKLQl1bnNpZ25lZCBpbnQgcHZfcHJpbnRyZXY7Ci0KLQkvKiBWZXJzaW9uIDAgbWVtb3J5IGRlc2NyaXB0b3JzLiAqLwotCXN0cnVjdCBsaW51eF9tZW1fdjAgcHZfdjBtZW07Ci0KLQkvKiBOb2RlIG9wZXJhdGlvbnMuICovCi0Jc3RydWN0IGxpbnV4X25vZGVvcHMgKnB2X25vZGVvcHM7Ci0KLQljaGFyICoqcHZfYm9vdHN0cjsKLQlzdHJ1Y3QgbGludXhfZGV2X3YwX2Z1bmNzIHB2X3YwZGV2b3BzOwotCi0JY2hhciAqcHZfc3RkaW47Ci0JY2hhciAqcHZfc3Rkb3V0OwotI2RlZmluZQlQUk9NREVWX0tCRAkwCQkvKiBpbnB1dCBmcm9tIGtleWJvYXJkICovCi0jZGVmaW5lCVBST01ERVZfU0NSRUVOCTAJCS8qIG91dHB1dCB0byBzY3JlZW4gKi8KLSNkZWZpbmUJUFJPTURFVl9UVFlBCTEJCS8qIGluL291dCB0byB0dHlhICovCi0jZGVmaW5lCVBST01ERVZfVFRZQgkyCQkvKiBpbi9vdXQgdG8gdHR5YiAqLwotCi0JLyogQmxvY2tpbmcgZ2V0Y2hhci9wdXRjaGFyLiAgTk9UIFJFRU5UUkFOVCEgKGdycikgKi8KLQlpbnQgKCpwdl9nZXRjaGFyKSh2b2lkKTsKLQl2b2lkICgqcHZfcHV0Y2hhcikoaW50IGNoKTsKLQotCS8qIE5vbi1ibG9ja2luZyB2YXJpYW50cy4gKi8KLQlpbnQgKCpwdl9uYmdldGNoYXIpKHZvaWQpOwotCWludCAoKnB2X25icHV0Y2hhcikoaW50IGNoKTsKLQotCXZvaWQgKCpwdl9wdXRzdHIpKGNoYXIgKnN0ciwgaW50IGxlbik7Ci0KLQkvKiBNaXNjZWxsYW55LiAqLwotCXZvaWQgKCpwdl9yZWJvb3QpKGNoYXIgKmJvb3RzdHIpOwotCXZvaWQgKCpwdl9wcmludGYpKF9fY29uc3RfXyBjaGFyICpmbXQsIC4uLik7Ci0Jdm9pZCAoKnB2X2Fib3J0KSh2b2lkKTsKLQlfX3ZvbGF0aWxlX18gaW50ICpwdl90aWNrczsKLQl2b2lkICgqcHZfaGFsdCkodm9pZCk7Ci0Jdm9pZCAoKipwdl9zeW5jaG9vaykodm9pZCk7Ci0KLQkvKiBFdmFsdWF0ZSBhIGZvcnRoIHN0cmluZywgbm90IGRpZmZlcmVudCBwcm90byBmb3IgVjAgYW5kIFYyLT51cC4gKi8KLQl1bmlvbiB7Ci0JCXZvaWQgKCp2MF9ldmFsKShpbnQgbGVuLCBjaGFyICpzdHIpOwotCQl2b2lkICgqdjJfZXZhbCkoY2hhciAqc3RyKTsKLQl9IHB2X2ZvcnRoZXZhbDsKLQotCXN0cnVjdCBsaW51eF9hcmd1bWVudHNfdjAgKipwdl92MGJvb3RhcmdzOwotCi0JLyogR2V0IGV0aGVyIGFkZHJlc3MuICovCi0JdW5zaWduZWQgaW50ICgqcHZfZW5hZGRyKShpbnQgZCwgY2hhciAqZW5hZGRyKTsKLQotCXN0cnVjdCBsaW51eF9ib290YXJnc192MiBwdl92MmJvb3RhcmdzOwotCXN0cnVjdCBsaW51eF9kZXZfdjJfZnVuY3MgcHZfdjJkZXZvcHM7Ci0KLQlpbnQgZmlsbGVyWzE1XTsKLQotCS8qIFRoaXMgb25lIGlzIHN1bjRjL3N1bjQgb25seS4gKi8KLQl2b2lkICgqcHZfc2V0Y3R4dCkoaW50IGN0eHQsIGNoYXIgKnZhLCBpbnQgcG1lZyk7Ci0KLQkvKiBQcm9tIHZlcnNpb24gMyBNdWx0aXByb2Nlc3NvciByb3V0aW5lcy4gVGhpcyBzdHVmZiBpcyBjcmF6eS4KLQkgKiBObyBqb2tlLiBDYWxsaW5nIHRoZXNlIHdoZW4gdGhlcmUgaXMgb25seSBvbmUgY3B1IHByb2JhYmx5Ci0JICogY3Jhc2hlcyB0aGUgbWFjaGluZSwgaGF2ZSB0byB0ZXN0IHRoaXMuIDotKQotCSAqLwotCi0JLyogdjNfY3B1c3RhcnQoKSB3aWxsIHN0YXJ0IHRoZSBjcHUgJ3doaWNoY3B1JyBpbiBtbXUtY29udGV4dAotCSAqICd0aGlzY29udGV4dCcgZXhlY3V0aW5nIGF0IGFkZHJlc3MgJ3Byb2dfY291bnRlcicKLQkgKi8KLQlpbnQgKCp2M19jcHVzdGFydCkodW5zaWduZWQgaW50IHdoaWNoY3B1LCBpbnQgY3R4dGJsX3B0ciwKLQkJCSAgIGludCB0aGlzY29udGV4dCwgY2hhciAqcHJvZ19jb3VudGVyKTsKLQotCS8qIHYzX2NwdXN0b3AoKSB3aWxsIGNhdXNlIGNwdSAnd2hpY2hjcHUnIHRvIHN0b3AgZXhlY3V0aW5nCi0JICogdW50aWwgYSByZXN1bWUgY3B1IGNhbGwgaXMgbWFkZS4KLQkgKi8KLQlpbnQgKCp2M19jcHVzdG9wKSh1bnNpZ25lZCBpbnQgd2hpY2hjcHUpOwotCi0JLyogdjNfY3B1aWRsZSgpIHdpbGwgaWRsZSBjcHUgJ3doaWNoY3B1JyB1bnRpbCBhIHN0b3Agb3IKLQkgKiByZXN1bWUgY3B1IGNhbGwgaXMgbWFkZS4KLQkgKi8KLQlpbnQgKCp2M19jcHVpZGxlKSh1bnNpZ25lZCBpbnQgd2hpY2hjcHUpOwotCi0JLyogdjNfY3B1cmVzdW1lKCkgd2lsbCByZXN1bWUgcHJvY2Vzc29yICd3aGljaGNwdScgZXhlY3V0aW5nCi0JICogc3RhcnRpbmcgd2l0aCB3aGF0ZXZlciAncGMnIGFuZCAnbnBjJyB3ZXJlIGxlZnQgYXQgdGhlCi0JICogbGFzdCAnaWRsZScgb3IgJ3N0b3AnIGNhbGwuCi0JICovCi0JaW50ICgqdjNfY3B1cmVzdW1lKSh1bnNpZ25lZCBpbnQgd2hpY2hjcHUpOwotfTsKLQotLyogUm91dGluZXMgZm9yIHRyYXZlcnNpbmcgdGhlIHByb20gZGV2aWNlIHRyZWUuICovCi1zdHJ1Y3QgbGludXhfbm9kZW9wcyB7Ci0JaW50ICgqbm9fbmV4dG5vZGUpKGludCBub2RlKTsKLQlpbnQgKCpub19jaGlsZCkoaW50IG5vZGUpOwotCWludCAoKm5vX3Byb3BsZW4pKGludCBub2RlLCBjb25zdCBjaGFyICpuYW1lKTsKLQlpbnQgKCpub19nZXRwcm9wKShpbnQgbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgY2hhciAqdmFsKTsKLQlpbnQgKCpub19zZXRwcm9wKShpbnQgbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgY2hhciAqdmFsLCBpbnQgbGVuKTsKLQljaGFyICogKCpub19uZXh0cHJvcCkoaW50IG5vZGUsIGNoYXIgKm5hbWUpOwotfTsKLQotLyogTW9yZSBmdW4gUFJPTSBzdHJ1Y3R1cmVzIGZvciBkZXZpY2UgcHJvYmluZy4gKi8KLSNkZWZpbmUgUFJPTVJFR19NQVggICAgIDE2Ci0jZGVmaW5lIFBST01WQUREUl9NQVggICAxNgotI2RlZmluZSBQUk9NSU5UUl9NQVggICAgMTUKLQotc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzIHsKLQl1bnNpZ25lZCBpbnQgd2hpY2hfaW87ICAgICAgICAgLyogaXMgdGhpcyBpbiBPQklPIHNwYWNlPyAqLwotCXVuc2lnbmVkIGludCBwaHlzX2FkZHI7ICAgICAgICAvKiBUaGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGlzIHJlZ2lzdGVyICovCi0JdW5zaWduZWQgaW50IHJlZ19zaXplOyAgICAgICAgIC8qIEhvdyBtYW55IGJ5dGVzIGRvZXMgdGhpcyByZWdpc3RlciB0YWtlIHVwPyAqLwotfTsKLQotc3RydWN0IGxpbnV4X3Byb21faXJxcyB7Ci0JaW50IHByaTsgICAgLyogSVJRIHByaW9yaXR5ICovCi0JaW50IHZlY3RvcjsgLyogVGhpcyBpcyBmb29iYXIsIHdoYXQgZG9lcyBpdCBkbz8gKi8KLX07Ci0KLS8qIEVsZW1lbnQgb2YgdGhlICJyYW5nZXMiIHZlY3RvciAqLwotc3RydWN0IGxpbnV4X3Byb21fcmFuZ2VzIHsKLQl1bnNpZ25lZCBpbnQgb3RfY2hpbGRfc3BhY2U7Ci0JdW5zaWduZWQgaW50IG90X2NoaWxkX2Jhc2U7CQkvKiBCdXMgZmVlbHMgdGhpcyAqLwotCXVuc2lnbmVkIGludCBvdF9wYXJlbnRfc3BhY2U7Ci0JdW5zaWduZWQgaW50IG90X3BhcmVudF9iYXNlOwkJLyogQ1BVIGxvb2tzIGZyb20gaGVyZSAqLwotCXVuc2lnbmVkIGludCBvcl9zaXplOwotfTsKLQotLyogUmFuZ2VzIGFuZCByZWcgcHJvcGVydGllcyBhcmUgYSBiaXQgZGlmZmVyZW50IGZvciBQQ0kuICovCi1zdHJ1Y3QgbGludXhfcHJvbV9wY2lfcmVnaXN0ZXJzIHsKLQkvKgotCSAqIFdlIGRvbid0IGtub3cgd2hhdCBpbmZvcm1hdGlvbiB0aGlzIGZpZWxkIGNvbnRhaW4uCi0JICogV2UgZ3Vlc3MsIFBDSSBkZXZpY2UgZnVuY3Rpb24gaXMgaW4gYml0cyAxNTo4Ci0JICogU28sIC4uLgotCSAqLwotCXVuc2lnbmVkIGludCB3aGljaF9pbzsgIC8qIExldCBpdCBiZSB3aGljaF9pbyAqLwotCi0JdW5zaWduZWQgaW50IHBoeXNfaGk7Ci0JdW5zaWduZWQgaW50IHBoeXNfbG87Ci0KLQl1bnNpZ25lZCBpbnQgc2l6ZV9oaTsKLQl1bnNpZ25lZCBpbnQgc2l6ZV9sbzsKLX07Ci0KLXN0cnVjdCBsaW51eF9wcm9tX3BjaV9yYW5nZXMgewotCXVuc2lnbmVkIGludCBjaGlsZF9waHlzX2hpOwkvKiBPbmx5IGNlcnRhaW4gYml0cyBhcmUgZW5jb2RlZCBoZXJlLiAqLwotCXVuc2lnbmVkIGludCBjaGlsZF9waHlzX21pZDsKLQl1bnNpZ25lZCBpbnQgY2hpbGRfcGh5c19sbzsKLQotCXVuc2lnbmVkIGludCBwYXJlbnRfcGh5c19oaTsKLQl1bnNpZ25lZCBpbnQgcGFyZW50X3BoeXNfbG87Ci0KLQl1bnNpZ25lZCBpbnQgc2l6ZV9oaTsKLQl1bnNpZ25lZCBpbnQgc2l6ZV9sbzsKLX07Ci0KLXN0cnVjdCBsaW51eF9wcm9tX3BjaV9hc3NpZ25lZF9hZGRyZXNzZXMgewotCXVuc2lnbmVkIGludCB3aGljaF9pbzsKLQotCXVuc2lnbmVkIGludCBwaHlzX2hpOwotCXVuc2lnbmVkIGludCBwaHlzX2xvOwotCi0JdW5zaWduZWQgaW50IHNpemVfaGk7Ci0JdW5zaWduZWQgaW50IHNpemVfbG87Ci19OwotCi1zdHJ1Y3QgbGludXhfcHJvbV9lYnVzX3JhbmdlcyB7Ci0JdW5zaWduZWQgaW50IGNoaWxkX3BoeXNfaGk7Ci0JdW5zaWduZWQgaW50IGNoaWxkX3BoeXNfbG87Ci0KLQl1bnNpZ25lZCBpbnQgcGFyZW50X3BoeXNfaGk7Ci0JdW5zaWduZWQgaW50IHBhcmVudF9waHlzX21pZDsKLQl1bnNpZ25lZCBpbnQgcGFyZW50X3BoeXNfbG87Ci0KLQl1bnNpZ25lZCBpbnQgc2l6ZTsKLX07Ci0KLSNlbmRpZiAvKiAhKF9fQVNTRU1CTFlfXykgKi8KLQotI2VuZGlmIC8qICEoX19TUEFSQ19PUEVOUFJPTV9IKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9vcGVucHJvbV82NC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9vcGVucHJvbV82NC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjllNGE4Li4wMDAwMDAwCi0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vb3BlbnByb21fNjQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0jaWZuZGVmIF9fU1BBUkM2NF9PUEVOUFJPTV9ICi0jZGVmaW5lIF9fU1BBUkM2NF9PUEVOUFJPTV9ICi0KLS8qIG9wZW5wcm9tLmg6ICBQcm9tIHN0cnVjdHVyZXMgYW5kIGRlZmluZXMgZm9yIGFjY2VzcyB0byB0aGUgT1BFTkJPT1QKLSAqICAgICAgICAgICAgICBwcm9tIHJvdXRpbmVzIGFuZCBkYXRhIGFyZWFzLgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NiBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGNhaXAucnV0Z2Vycy5lZHUpCi0gKi8KLQotI2lmbmRlZiBfX0FTU0VNQkxZX18KLS8qIFYwIHByb20gZGV2aWNlIG9wZXJhdGlvbnMuICovCi1zdHJ1Y3QgbGludXhfZGV2X3YwX2Z1bmNzIHsKLQlpbnQgKCp2MF9kZXZvcGVuKShjaGFyICpkZXZpY2Vfc3RyKTsKLQlpbnQgKCp2MF9kZXZjbG9zZSkoaW50IGRldl9kZXNjKTsKLQlpbnQgKCp2MF9yZGJsa2RldikoaW50IGRldl9kZXNjLCBpbnQgbnVtX2Jsa3MsIGludCBibGtfc3QsIGNoYXIgKmJ1Zik7Ci0JaW50ICgqdjBfd3JibGtkZXYpKGludCBkZXZfZGVzYywgaW50IG51bV9ibGtzLCBpbnQgYmxrX3N0LCBjaGFyICpidWYpOwotCWludCAoKnYwX3dybmV0ZGV2KShpbnQgZGV2X2Rlc2MsIGludCBudW1fYnl0ZXMsIGNoYXIgKmJ1Zik7Ci0JaW50ICgqdjBfcmRuZXRkZXYpKGludCBkZXZfZGVzYywgaW50IG51bV9ieXRlcywgY2hhciAqYnVmKTsKLQlpbnQgKCp2MF9yZGNoYXJkZXYpKGludCBkZXZfZGVzYywgaW50IG51bV9ieXRlcywgaW50IGR1bW15LCBjaGFyICpidWYpOwotCWludCAoKnYwX3dyY2hhcmRldikoaW50IGRldl9kZXNjLCBpbnQgbnVtX2J5dGVzLCBpbnQgZHVtbXksIGNoYXIgKmJ1Zik7Ci0JaW50ICgqdjBfc2Vla2RldikoaW50IGRldl9kZXNjLCBsb25nIGxvZ2ljYWxfb2Zmc3QsIGludCBmcm9tKTsKLX07Ci0KLS8qIFYyIGFuZCBsYXRlciBwcm9tIGRldmljZSBvcGVyYXRpb25zLiAqLwotc3RydWN0IGxpbnV4X2Rldl92Ml9mdW5jcyB7Ci0JaW50ICgqdjJfaW5zdDJwa2cpKGludCBkKTsJLyogQ29udmVydCBpaGFuZGxlIHRvIHBoYW5kbGUgKi8KLQljaGFyICogKCp2Ml9kdW1iX21lbV9hbGxvYykoY2hhciAqdmEsIHVuc2lnbmVkIHN6KTsKLQl2b2lkICgqdjJfZHVtYl9tZW1fZnJlZSkoY2hhciAqdmEsIHVuc2lnbmVkIHN6KTsKLQotCS8qIFRvIG1hcCBkZXZpY2VzIGludG8gdmlydHVhbCBJL08gc3BhY2UuICovCi0JY2hhciAqICgqdjJfZHVtYl9tbWFwKShjaGFyICp2aXJ0YSwgaW50IHdoaWNoX2lvLCB1bnNpZ25lZCBwYWRkciwgdW5zaWduZWQgc3opOwotCXZvaWQgKCp2Ml9kdW1iX211bm1hcCkoY2hhciAqdmlydGEsIHVuc2lnbmVkIHNpemUpOwotCi0JaW50ICgqdjJfZGV2X29wZW4pKGNoYXIgKmRldnBhdGgpOwotCXZvaWQgKCp2Ml9kZXZfY2xvc2UpKGludCBkKTsKLQlpbnQgKCp2Ml9kZXZfcmVhZCkoaW50IGQsIGNoYXIgKmJ1ZiwgaW50IG5ieXRlcyk7Ci0JaW50ICgqdjJfZGV2X3dyaXRlKShpbnQgZCwgY2hhciAqYnVmLCBpbnQgbmJ5dGVzKTsKLQlpbnQgKCp2Ml9kZXZfc2VlaykoaW50IGQsIGludCBoaSwgaW50IGxvKTsKLQotCS8qIE5ldmVyIGlzc3VlZCAobXVsdGlzdGFnZSBsb2FkIHN1cHBvcnQpICovCi0Jdm9pZCAoKnYyX3doZWVlMikodm9pZCk7Ci0Jdm9pZCAoKnYyX3doZWVlMykodm9pZCk7Ci19OwotCi1zdHJ1Y3QgbGludXhfbWxpc3RfdjAgewotCXN0cnVjdCBsaW51eF9tbGlzdF92MCAqdGhlcmVzX21vcmU7Ci0JdW5zaWduZWQgc3RhcnRfYWRyOwotCXVuc2lnbmVkIG51bV9ieXRlczsKLX07Ci0KLXN0cnVjdCBsaW51eF9tZW1fdjAgewotCXN0cnVjdCBsaW51eF9tbGlzdF92MCAqKnYwX3RvdHBoeXM7Ci0Jc3RydWN0IGxpbnV4X21saXN0X3YwICoqdjBfcHJvbW1hcDsKLQlzdHJ1Y3QgbGludXhfbWxpc3RfdjAgKip2MF9hdmFpbGFibGU7IC8qIFdoYXQgd2UgY2FuIHVzZSAqLwotfTsKLQotLyogQXJndW1lbnRzIHNlbnQgdG8gdGhlIGtlcm5lbCBmcm9tIHRoZSBib290IHByb21wdC4gKi8KLXN0cnVjdCBsaW51eF9hcmd1bWVudHNfdjAgewotCWNoYXIgKmFyZ3ZbOF07Ci0JY2hhciBhcmdzWzEwMF07Ci0JY2hhciBib290X2RldlsyXTsKLQlpbnQgYm9vdF9kZXZfY3RybDsKLQlpbnQgYm9vdF9kZXZfdW5pdDsKLQlpbnQgZGV2X3BhcnRpdGlvbjsKLQljaGFyICprZXJuZWxfZmlsZV9uYW1lOwotCXZvaWQgKmFpZWVlMTsgICAgICAgICAgIC8qIFhYWCAqLwotfTsKLQotLyogVjIgYW5kIHVwIGJvb3QgdGhpbmdzLiAqLwotc3RydWN0IGxpbnV4X2Jvb3RhcmdzX3YyIHsKLQljaGFyICoqYm9vdHBhdGg7Ci0JY2hhciAqKmJvb3RhcmdzOwotCWludCAqZmRfc3RkaW47Ci0JaW50ICpmZF9zdGRvdXQ7Ci19OwotCi0vKiBUaGUgdG9wIGxldmVsIFBST00gdmVjdG9yLiAqLwotc3RydWN0IGxpbnV4X3JvbXZlYyB7Ci0JLyogVmVyc2lvbiBudW1iZXJzLiAqLwotCXVuc2lnbmVkIGludCBwdl9tYWdpY19jb29raWU7Ci0JdW5zaWduZWQgaW50IHB2X3JvbXZlcnM7Ci0JdW5zaWduZWQgaW50IHB2X3BsdWdpbl9yZXZpc2lvbjsKLQl1bnNpZ25lZCBpbnQgcHZfcHJpbnRyZXY7Ci0KLQkvKiBWZXJzaW9uIDAgbWVtb3J5IGRlc2NyaXB0b3JzLiAqLwotCXN0cnVjdCBsaW51eF9tZW1fdjAgcHZfdjBtZW07Ci0KLQkvKiBOb2RlIG9wZXJhdGlvbnMuICovCi0Jc3RydWN0IGxpbnV4X25vZGVvcHMgKnB2X25vZGVvcHM7Ci0KLQljaGFyICoqcHZfYm9vdHN0cjsKLQlzdHJ1Y3QgbGludXhfZGV2X3YwX2Z1bmNzIHB2X3YwZGV2b3BzOwotCi0JY2hhciAqcHZfc3RkaW47Ci0JY2hhciAqcHZfc3Rkb3V0OwotI2RlZmluZQlQUk9NREVWX0tCRAkwCQkvKiBpbnB1dCBmcm9tIGtleWJvYXJkICovCi0jZGVmaW5lCVBST01ERVZfU0NSRUVOCTAJCS8qIG91dHB1dCB0byBzY3JlZW4gKi8KLSNkZWZpbmUJUFJPTURFVl9UVFlBCTEJCS8qIGluL291dCB0byB0dHlhICovCi0jZGVmaW5lCVBST01ERVZfVFRZQgkyCQkvKiBpbi9vdXQgdG8gdHR5YiAqLwotCi0JLyogQmxvY2tpbmcgZ2V0Y2hhci9wdXRjaGFyLiAgTk9UIFJFRU5UUkFOVCEgKGdycikgKi8KLQlpbnQgKCpwdl9nZXRjaGFyKSh2b2lkKTsKLQl2b2lkICgqcHZfcHV0Y2hhcikoaW50IGNoKTsKLQotCS8qIE5vbi1ibG9ja2luZyB2YXJpYW50cy4gKi8KLQlpbnQgKCpwdl9uYmdldGNoYXIpKHZvaWQpOwotCWludCAoKnB2X25icHV0Y2hhcikoaW50IGNoKTsKLQotCXZvaWQgKCpwdl9wdXRzdHIpKGNoYXIgKnN0ciwgaW50IGxlbik7Ci0KLQkvKiBNaXNjZWxsYW55LiAqLwotCXZvaWQgKCpwdl9yZWJvb3QpKGNoYXIgKmJvb3RzdHIpOwotCXZvaWQgKCpwdl9wcmludGYpKF9fY29uc3RfXyBjaGFyICpmbXQsIC4uLik7Ci0Jdm9pZCAoKnB2X2Fib3J0KSh2b2lkKTsKLQlfX3ZvbGF0aWxlX18gaW50ICpwdl90aWNrczsKLQl2b2lkICgqcHZfaGFsdCkodm9pZCk7Ci0Jdm9pZCAoKipwdl9zeW5jaG9vaykodm9pZCk7Ci0KLQkvKiBFdmFsdWF0ZSBhIGZvcnRoIHN0cmluZywgbm90IGRpZmZlcmVudCBwcm90byBmb3IgVjAgYW5kIFYyLT51cC4gKi8KLQl1bmlvbiB7Ci0JCXZvaWQgKCp2MF9ldmFsKShpbnQgbGVuLCBjaGFyICpzdHIpOwotCQl2b2lkICgqdjJfZXZhbCkoY2hhciAqc3RyKTsKLQl9IHB2X2ZvcnRoZXZhbDsKLQotCXN0cnVjdCBsaW51eF9hcmd1bWVudHNfdjAgKipwdl92MGJvb3RhcmdzOwotCi0JLyogR2V0IGV0aGVyIGFkZHJlc3MuICovCi0JdW5zaWduZWQgaW50ICgqcHZfZW5hZGRyKShpbnQgZCwgY2hhciAqZW5hZGRyKTsKLQotCXN0cnVjdCBsaW51eF9ib290YXJnc192MiBwdl92MmJvb3RhcmdzOwotCXN0cnVjdCBsaW51eF9kZXZfdjJfZnVuY3MgcHZfdjJkZXZvcHM7Ci0KLQlpbnQgZmlsbGVyWzE1XTsKLQotCS8qIFRoaXMgb25lIGlzIHN1bjRjL3N1bjQgb25seS4gKi8KLQl2b2lkICgqcHZfc2V0Y3R4dCkoaW50IGN0eHQsIGNoYXIgKnZhLCBpbnQgcG1lZyk7Ci0KLQkvKiBQcm9tIHZlcnNpb24gMyBNdWx0aXByb2Nlc3NvciByb3V0aW5lcy4gVGhpcyBzdHVmZiBpcyBjcmF6eS4KLQkgKiBObyBqb2tlLiBDYWxsaW5nIHRoZXNlIHdoZW4gdGhlcmUgaXMgb25seSBvbmUgY3B1IHByb2JhYmx5Ci0JICogY3Jhc2hlcyB0aGUgbWFjaGluZSwgaGF2ZSB0byB0ZXN0IHRoaXMuIDotKQotCSAqLwotCi0JLyogdjNfY3B1c3RhcnQoKSB3aWxsIHN0YXJ0IHRoZSBjcHUgJ3doaWNoY3B1JyBpbiBtbXUtY29udGV4dAotCSAqICd0aGlzY29udGV4dCcgZXhlY3V0aW5nIGF0IGFkZHJlc3MgJ3Byb2dfY291bnRlcicKLQkgKi8KLQlpbnQgKCp2M19jcHVzdGFydCkodW5zaWduZWQgaW50IHdoaWNoY3B1LCBpbnQgY3R4dGJsX3B0ciwKLQkJCSAgIGludCB0aGlzY29udGV4dCwgY2hhciAqcHJvZ19jb3VudGVyKTsKLQotCS8qIHYzX2NwdXN0b3AoKSB3aWxsIGNhdXNlIGNwdSAnd2hpY2hjcHUnIHRvIHN0b3AgZXhlY3V0aW5nCi0JICogdW50aWwgYSByZXN1bWUgY3B1IGNhbGwgaXMgbWFkZS4KLQkgKi8KLQlpbnQgKCp2M19jcHVzdG9wKSh1bnNpZ25lZCBpbnQgd2hpY2hjcHUpOwotCi0JLyogdjNfY3B1aWRsZSgpIHdpbGwgaWRsZSBjcHUgJ3doaWNoY3B1JyB1bnRpbCBhIHN0b3Agb3IKLQkgKiByZXN1bWUgY3B1IGNhbGwgaXMgbWFkZS4KLQkgKi8KLQlpbnQgKCp2M19jcHVpZGxlKSh1bnNpZ25lZCBpbnQgd2hpY2hjcHUpOwotCi0JLyogdjNfY3B1cmVzdW1lKCkgd2lsbCByZXN1bWUgcHJvY2Vzc29yICd3aGljaGNwdScgZXhlY3V0aW5nCi0JICogc3RhcnRpbmcgd2l0aCB3aGF0ZXZlciAncGMnIGFuZCAnbnBjJyB3ZXJlIGxlZnQgYXQgdGhlCi0JICogbGFzdCAnaWRsZScgb3IgJ3N0b3AnIGNhbGwuCi0JICovCi0JaW50ICgqdjNfY3B1cmVzdW1lKSh1bnNpZ25lZCBpbnQgd2hpY2hjcHUpOwotfTsKLQotLyogUm91dGluZXMgZm9yIHRyYXZlcnNpbmcgdGhlIHByb20gZGV2aWNlIHRyZWUuICovCi1zdHJ1Y3QgbGludXhfbm9kZW9wcyB7Ci0JaW50ICgqbm9fbmV4dG5vZGUpKGludCBub2RlKTsKLQlpbnQgKCpub19jaGlsZCkoaW50IG5vZGUpOwotCWludCAoKm5vX3Byb3BsZW4pKGludCBub2RlLCBjaGFyICpuYW1lKTsKLQlpbnQgKCpub19nZXRwcm9wKShpbnQgbm9kZSwgY2hhciAqbmFtZSwgY2hhciAqdmFsKTsKLQlpbnQgKCpub19zZXRwcm9wKShpbnQgbm9kZSwgY2hhciAqbmFtZSwgY2hhciAqdmFsLCBpbnQgbGVuKTsKLQljaGFyICogKCpub19uZXh0cHJvcCkoaW50IG5vZGUsIGNoYXIgKm5hbWUpOwotfTsKLQotLyogTW9yZSBmdW4gUFJPTSBzdHJ1Y3R1cmVzIGZvciBkZXZpY2UgcHJvYmluZy4gKi8KLSNkZWZpbmUgUFJPTVJFR19NQVggICAgIDI0Ci0jZGVmaW5lIFBST01WQUREUl9NQVggICAxNgotI2RlZmluZSBQUk9NSU5UUl9NQVggICAgMzIKLQotc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzIHsKLQl1bnNpZ25lZCB3aGljaF9pbzsJLyogaGkgcGFydCBvZiBwaHlzaWNhbCBhZGRyZXNzCQkJKi8KLQl1bnNpZ25lZCBwaHlzX2FkZHI7CS8qIFRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoaXMgcmVnaXN0ZXIJKi8KLQlpbnQgcmVnX3NpemU7CQkvKiBIb3cgbWFueSBieXRlcyBkb2VzIHRoaXMgcmVnaXN0ZXIgdGFrZSB1cD8JKi8KLX07Ci0KLXN0cnVjdCBsaW51eF9wcm9tNjRfcmVnaXN0ZXJzIHsKLQl1bnNpZ25lZCBsb25nIHBoeXNfYWRkcjsKLQl1bnNpZ25lZCBsb25nIHJlZ19zaXplOwotfTsKLQotc3RydWN0IGxpbnV4X3Byb21faXJxcyB7Ci0JaW50IHByaTsgICAgLyogSVJRIHByaW9yaXR5ICovCi0JaW50IHZlY3RvcjsgLyogVGhpcyBpcyBmb29iYXIsIHdoYXQgZG9lcyBpdCBkbz8gKi8KLX07Ci0KLS8qIEVsZW1lbnQgb2YgdGhlICJyYW5nZXMiIHZlY3RvciAqLwotc3RydWN0IGxpbnV4X3Byb21fcmFuZ2VzIHsKLQl1bnNpZ25lZCBpbnQgb3RfY2hpbGRfc3BhY2U7Ci0JdW5zaWduZWQgaW50IG90X2NoaWxkX2Jhc2U7CQkvKiBCdXMgZmVlbHMgdGhpcyAqLwotCXVuc2lnbmVkIGludCBvdF9wYXJlbnRfc3BhY2U7Ci0JdW5zaWduZWQgaW50IG90X3BhcmVudF9iYXNlOwkJLyogQ1BVIGxvb2tzIGZyb20gaGVyZSAqLwotCXVuc2lnbmVkIGludCBvcl9zaXplOwotfTsKLQotc3RydWN0IGxpbnV4X3Byb202NF9yYW5nZXMgewotCXVuc2lnbmVkIGxvbmcgb3RfY2hpbGRfYmFzZTsJCS8qIEJ1cyBmZWVscyB0aGlzICovCi0JdW5zaWduZWQgbG9uZyBvdF9wYXJlbnRfYmFzZTsJCS8qIENQVSBsb29rcyBmcm9tIGhlcmUgKi8KLQl1bnNpZ25lZCBsb25nIG9yX3NpemU7Ci19OwotCi0vKiBSYW5nZXMgYW5kIHJlZyBwcm9wZXJ0aWVzIGFyZSBhIGJpdCBkaWZmZXJlbnQgZm9yIFBDSS4gKi8KLXN0cnVjdCBsaW51eF9wcm9tX3BjaV9yZWdpc3RlcnMgewotCXVuc2lnbmVkIGludCBwaHlzX2hpOwotCXVuc2lnbmVkIGludCBwaHlzX21pZDsKLQl1bnNpZ25lZCBpbnQgcGh5c19sbzsKLQotCXVuc2lnbmVkIGludCBzaXplX2hpOwotCXVuc2lnbmVkIGludCBzaXplX2xvOwotfTsKLQotc3RydWN0IGxpbnV4X3Byb21fcGNpX3JhbmdlcyB7Ci0JdW5zaWduZWQgaW50IGNoaWxkX3BoeXNfaGk7CS8qIE9ubHkgY2VydGFpbiBiaXRzIGFyZSBlbmNvZGVkIGhlcmUuICovCi0JdW5zaWduZWQgaW50IGNoaWxkX3BoeXNfbWlkOwotCXVuc2lnbmVkIGludCBjaGlsZF9waHlzX2xvOwotCi0JdW5zaWduZWQgaW50IHBhcmVudF9waHlzX2hpOwotCXVuc2lnbmVkIGludCBwYXJlbnRfcGh5c19sbzsKLQotCXVuc2lnbmVkIGludCBzaXplX2hpOwotCXVuc2lnbmVkIGludCBzaXplX2xvOwotfTsKLQotc3RydWN0IGxpbnV4X3Byb21fcGNpX2ludG1hcCB7Ci0JdW5zaWduZWQgaW50IHBoeXNfaGk7Ci0JdW5zaWduZWQgaW50IHBoeXNfbWlkOwotCXVuc2lnbmVkIGludCBwaHlzX2xvOwotCi0JdW5zaWduZWQgaW50IGludGVycnVwdDsKLQotCWludCAgICAgICAgICBjbm9kZTsKLQl1bnNpZ25lZCBpbnQgY2ludGVycnVwdDsKLX07Ci0KLXN0cnVjdCBsaW51eF9wcm9tX3BjaV9pbnRtYXNrIHsKLQl1bnNpZ25lZCBpbnQgcGh5c19oaTsKLQl1bnNpZ25lZCBpbnQgcGh5c19taWQ7Ci0JdW5zaWduZWQgaW50IHBoeXNfbG87Ci0JdW5zaWduZWQgaW50IGludGVycnVwdDsKLX07Ci0KLXN0cnVjdCBsaW51eF9wcm9tX2VidXNfcmFuZ2VzIHsKLQl1bnNpZ25lZCBpbnQgY2hpbGRfcGh5c19oaTsKLQl1bnNpZ25lZCBpbnQgY2hpbGRfcGh5c19sbzsKLQotCXVuc2lnbmVkIGludCBwYXJlbnRfcGh5c19oaTsKLQl1bnNpZ25lZCBpbnQgcGFyZW50X3BoeXNfbWlkOwotCXVuc2lnbmVkIGludCBwYXJlbnRfcGh5c19sbzsKLQotCXVuc2lnbmVkIGludCBzaXplOwotfTsKLQotc3RydWN0IGxpbnV4X3Byb21fZWJ1c19pbnRtYXAgewotCXVuc2lnbmVkIGludCBwaHlzX2hpOwotCXVuc2lnbmVkIGludCBwaHlzX2xvOwotCi0JdW5zaWduZWQgaW50IGludGVycnVwdDsKLQotCWludCAgICAgICAgICBjbm9kZTsKLQl1bnNpZ25lZCBpbnQgY2ludGVycnVwdDsKLX07Ci0KLXN0cnVjdCBsaW51eF9wcm9tX2VidXNfaW50bWFzayB7Ci0JdW5zaWduZWQgaW50IHBoeXNfaGk7Ci0JdW5zaWduZWQgaW50IHBoeXNfbG87Ci0JdW5zaWduZWQgaW50IGludGVycnVwdDsKLX07Ci0jZW5kaWYgLyogIShfX0FTU0VNQkxZX18pICovCi0KLSNlbmRpZiAvKiAhKF9fU1BBUkM2NF9PUEVOUFJPTV9IKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wb3NpeF90eXBlcy5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wb3NpeF90eXBlcy5oCmluZGV4IDAzYTBlMDkuLjk4ZDZlYmIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcG9zaXhfdHlwZXMuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3Bvc2l4X3R5cGVzLmgKQEAgLTEsOCArMSwxNTUgQEAKLSNpZm5kZWYgX19fQVNNX1NQQVJDX1BPU0lYX1RZUEVTX0gKLSNkZWZpbmUgX19fQVNNX1NQQVJDX1BPU0lYX1RZUEVTX0gKKy8qCisgKiBUaGlzIGZpbGUgaXMgZ2VuZXJhbGx5IHVzZWQgYnkgdXNlci1sZXZlbCBzb2Z0d2FyZSwgc28geW91IG5lZWQgdG8KKyAqIGJlIGEgbGl0dGxlIGNhcmVmdWwgYWJvdXQgbmFtZXNwYWNlIHBvbGx1dGlvbiBldGMuICBBbHNvLCB3ZSBjYW5ub3QKKyAqIGFzc3VtZSBHQ0MgaXMgYmVpbmcgdXNlZC4KKyAqLworCisjaWZuZGVmIF9fU1BBUkNfUE9TSVhfVFlQRVNfSAorI2RlZmluZSBfX1NQQVJDX1BPU0lYX1RZUEVTX0gKKwogI2lmIGRlZmluZWQoX19zcGFyY19fKSAmJiBkZWZpbmVkKF9fYXJjaDY0X18pCi0jaW5jbHVkZSA8YXNtL3Bvc2l4X3R5cGVzXzY0Lmg+CisvKiBzcGFyYyA2NCBiaXQgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgICAgICAgICBfX2tlcm5lbF9zaXplX3Q7Cit0eXBlZGVmIGxvbmcgICAgICAgICAgICAgICAgICAgX19rZXJuZWxfc3NpemVfdDsKK3R5cGVkZWYgbG9uZyAgICAgICAgICAgICAgICAgICBfX2tlcm5lbF9wdHJkaWZmX3Q7Cit0eXBlZGVmIGxvbmcgICAgICAgICAgICAgICAgICAgX19rZXJuZWxfdGltZV90OwordHlwZWRlZiBsb25nICAgICAgICAgICAgICAgICAgIF9fa2VybmVsX2Nsb2NrX3Q7Cit0eXBlZGVmIGludCAgICAgICAgICAgICAgICAgICAgX19rZXJuZWxfcGlkX3Q7Cit0eXBlZGVmIGludCAgICAgICAgICAgICAgICAgICAgX19rZXJuZWxfaXBjX3BpZF90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgICAgIF9fa2VybmVsX3VpZF90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgICAgIF9fa2VybmVsX2dpZF90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nICAgICAgICAgIF9fa2VybmVsX2lub190OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgICAgIF9fa2VybmVsX21vZGVfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgICAgICBfX2tlcm5lbF91bW9kZV90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgICAgIF9fa2VybmVsX25saW5rX3Q7Cit0eXBlZGVmIGludCAgICAgICAgICAgICAgICAgICAgX19rZXJuZWxfZGFkZHJfdDsKK3R5cGVkZWYgbG9uZyAgICAgICAgICAgICAgICAgICBfX2tlcm5lbF9vZmZfdDsKK3R5cGVkZWYgY2hhciAqICAgICAgICAgICAgICAgICBfX2tlcm5lbF9jYWRkcl90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAkgICAgICAgX19rZXJuZWxfdWlkMTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJICAgICAgIF9fa2VybmVsX2dpZDE2X3Q7Cit0eXBlZGVmIGludCAgICAgICAgICAgICAgICAgICAgX19rZXJuZWxfY2xvY2tpZF90OwordHlwZWRlZiBpbnQgICAgICAgICAgICAgICAgICAgIF9fa2VybmVsX3RpbWVyX3Q7CisKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgCSAgICAgICBfX2tlcm5lbF9vbGRfdWlkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICAgICAgX19rZXJuZWxfb2xkX2dpZF90OwordHlwZWRlZiBfX2tlcm5lbF91aWRfdAkgICAgICAgX19rZXJuZWxfdWlkMzJfdDsKK3R5cGVkZWYgX19rZXJuZWxfZ2lkX3QJICAgICAgIF9fa2VybmVsX2dpZDMyX3Q7CisKK3R5cGVkZWYgdW5zaWduZWQgaW50CSAgICAgICBfX2tlcm5lbF9vbGRfZGV2X3Q7CisKKy8qIE5vdGUgdGhpcyBwaWVjZSBvZiBhc3ltbWV0cnkgZnJvbSB0aGUgdjkgQUJJLiAgKi8KK3R5cGVkZWYgaW50CQkgICAgICAgX19rZXJuZWxfc3VzZWNvbmRzX3Q7CisKICNlbHNlCi0jaW5jbHVkZSA8YXNtL3Bvc2l4X3R5cGVzXzMyLmg+CisvKiBzcGFyYyAzMiBiaXQgKi8KKwordHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgICAgIF9fa2VybmVsX3NpemVfdDsKK3R5cGVkZWYgaW50ICAgICAgICAgICAgICAgICAgICBfX2tlcm5lbF9zc2l6ZV90OwordHlwZWRlZiBsb25nIGludCAgICAgICAgICAgICAgIF9fa2VybmVsX3B0cmRpZmZfdDsKK3R5cGVkZWYgbG9uZyAgICAgICAgICAgICAgICAgICBfX2tlcm5lbF90aW1lX3Q7Cit0eXBlZGVmIGxvbmcJCSAgICAgICBfX2tlcm5lbF9zdXNlY29uZHNfdDsKK3R5cGVkZWYgbG9uZyAgICAgICAgICAgICAgICAgICBfX2tlcm5lbF9jbG9ja190OwordHlwZWRlZiBpbnQgICAgICAgICAgICAgICAgICAgIF9fa2VybmVsX3BpZF90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAgICAgIF9fa2VybmVsX2lwY19waWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgICAgICBfX2tlcm5lbF91aWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgICAgICBfX2tlcm5lbF9naWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgICAgICAgICBfX2tlcm5lbF9pbm9fdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgICAgICBfX2tlcm5lbF9tb2RlX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICAgICAgX19rZXJuZWxfdW1vZGVfdDsKK3R5cGVkZWYgc2hvcnQgICAgICAgICAgICAgICAgICBfX2tlcm5lbF9ubGlua190OwordHlwZWRlZiBsb25nICAgICAgICAgICAgICAgICAgIF9fa2VybmVsX2RhZGRyX3Q7Cit0eXBlZGVmIGxvbmcgICAgICAgICAgICAgICAgICAgX19rZXJuZWxfb2ZmX3Q7Cit0eXBlZGVmIGNoYXIgKiAgICAgICAgICAgICAgICAgX19rZXJuZWxfY2FkZHJfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJICAgICAgIF9fa2VybmVsX3VpZDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CSAgICAgICBfX2tlcm5lbF9naWQxNl90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQJICAgICAgIF9fa2VybmVsX3VpZDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAkgICAgICAgX19rZXJuZWxfZ2lkMzJfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJICAgICAgIF9fa2VybmVsX29sZF91aWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJICAgICAgIF9fa2VybmVsX29sZF9naWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJICAgICAgIF9fa2VybmVsX29sZF9kZXZfdDsKK3R5cGVkZWYgaW50ICAgICAgICAgICAgICAgICAgICBfX2tlcm5lbF9jbG9ja2lkX3Q7Cit0eXBlZGVmIGludCAgICAgICAgICAgICAgICAgICAgX19rZXJuZWxfdGltZXJfdDsKKworI2VuZGlmIC8qIGRlZmluZWQoX19zcGFyY19fKSAmJiBkZWZpbmVkKF9fYXJjaDY0X18pICovCisKKyNpZmRlZiBfX0dOVUNfXwordHlwZWRlZiBsb25nIGxvbmcgICAgICAgICAgICAgIF9fa2VybmVsX2xvZmZfdDsKICNlbmRpZgotI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQJdmFsWzJdOworfSBfX2tlcm5lbF9mc2lkX3Q7CisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyN1bmRlZiBfX0ZEX1NFVAorc3RhdGljIGlubGluZSB2b2lkIF9fRkRfU0VUKHVuc2lnbmVkIGxvbmcgZmQsIF9fa2VybmVsX2ZkX3NldCAqZmRzZXRwKQoreworCXVuc2lnbmVkIGxvbmcgX3RtcCA9IGZkIC8gX19ORkRCSVRTOworCXVuc2lnbmVkIGxvbmcgX3JlbSA9IGZkICUgX19ORkRCSVRTOworCWZkc2V0cC0+ZmRzX2JpdHNbX3RtcF0gfD0gKDFVTDw8X3JlbSk7Cit9CisKKyN1bmRlZiBfX0ZEX0NMUgorc3RhdGljIGlubGluZSB2b2lkIF9fRkRfQ0xSKHVuc2lnbmVkIGxvbmcgZmQsIF9fa2VybmVsX2ZkX3NldCAqZmRzZXRwKQoreworCXVuc2lnbmVkIGxvbmcgX3RtcCA9IGZkIC8gX19ORkRCSVRTOworCXVuc2lnbmVkIGxvbmcgX3JlbSA9IGZkICUgX19ORkRCSVRTOworCWZkc2V0cC0+ZmRzX2JpdHNbX3RtcF0gJj0gfigxVUw8PF9yZW0pOworfQorCisjdW5kZWYgX19GRF9JU1NFVAorc3RhdGljIGlubGluZSBpbnQgX19GRF9JU1NFVCh1bnNpZ25lZCBsb25nIGZkLCBfX2NvbnN0X18gX19rZXJuZWxfZmRfc2V0ICpwKQoreworCXVuc2lnbmVkIGxvbmcgX3RtcCA9IGZkIC8gX19ORkRCSVRTOworCXVuc2lnbmVkIGxvbmcgX3JlbSA9IGZkICUgX19ORkRCSVRTOworCXJldHVybiAocC0+ZmRzX2JpdHNbX3RtcF0gJiAoMVVMPDxfcmVtKSkgIT0gMDsKK30KKworLyoKKyAqIFRoaXMgd2lsbCB1bnJvbGwgdGhlIGxvb3AgZm9yIHRoZSBub3JtYWwgY29uc3RhbnQgY2FzZXMgKDggb3IgMzIgbG9uZ3MsCisgKiBmb3IgMjU2IGFuZCAxMDI0LWJpdCBmZF9zZXRzIHJlc3BlY3RpdmVseSkKKyAqLworI3VuZGVmIF9fRkRfWkVSTworc3RhdGljIGlubGluZSB2b2lkIF9fRkRfWkVSTyhfX2tlcm5lbF9mZF9zZXQgKnApCit7CisJdW5zaWduZWQgbG9uZyAqdG1wID0gcC0+ZmRzX2JpdHM7CisJaW50IGk7CisKKwlpZiAoX19idWlsdGluX2NvbnN0YW50X3AoX19GRFNFVF9MT05HUykpIHsKKwkJc3dpdGNoIChfX0ZEU0VUX0xPTkdTKSB7CisJCQljYXNlIDMyOgorCQkJICB0bXBbIDBdID0gMDsgdG1wWyAxXSA9IDA7IHRtcFsgMl0gPSAwOyB0bXBbIDNdID0gMDsKKwkJCSAgdG1wWyA0XSA9IDA7IHRtcFsgNV0gPSAwOyB0bXBbIDZdID0gMDsgdG1wWyA3XSA9IDA7CisJCQkgIHRtcFsgOF0gPSAwOyB0bXBbIDldID0gMDsgdG1wWzEwXSA9IDA7IHRtcFsxMV0gPSAwOworCQkJICB0bXBbMTJdID0gMDsgdG1wWzEzXSA9IDA7IHRtcFsxNF0gPSAwOyB0bXBbMTVdID0gMDsKKwkJCSAgdG1wWzE2XSA9IDA7IHRtcFsxN10gPSAwOyB0bXBbMThdID0gMDsgdG1wWzE5XSA9IDA7CisJCQkgIHRtcFsyMF0gPSAwOyB0bXBbMjFdID0gMDsgdG1wWzIyXSA9IDA7IHRtcFsyM10gPSAwOworCQkJICB0bXBbMjRdID0gMDsgdG1wWzI1XSA9IDA7IHRtcFsyNl0gPSAwOyB0bXBbMjddID0gMDsKKwkJCSAgdG1wWzI4XSA9IDA7IHRtcFsyOV0gPSAwOyB0bXBbMzBdID0gMDsgdG1wWzMxXSA9IDA7CisJCQkgIHJldHVybjsKKwkJCWNhc2UgMTY6CisJCQkgIHRtcFsgMF0gPSAwOyB0bXBbIDFdID0gMDsgdG1wWyAyXSA9IDA7IHRtcFsgM10gPSAwOworCQkJICB0bXBbIDRdID0gMDsgdG1wWyA1XSA9IDA7IHRtcFsgNl0gPSAwOyB0bXBbIDddID0gMDsKKwkJCSAgdG1wWyA4XSA9IDA7IHRtcFsgOV0gPSAwOyB0bXBbMTBdID0gMDsgdG1wWzExXSA9IDA7CisJCQkgIHRtcFsxMl0gPSAwOyB0bXBbMTNdID0gMDsgdG1wWzE0XSA9IDA7IHRtcFsxNV0gPSAwOworCQkJICByZXR1cm47CisJCQljYXNlIDg6CisJCQkgIHRtcFsgMF0gPSAwOyB0bXBbIDFdID0gMDsgdG1wWyAyXSA9IDA7IHRtcFsgM10gPSAwOworCQkJICB0bXBbIDRdID0gMDsgdG1wWyA1XSA9IDA7IHRtcFsgNl0gPSAwOyB0bXBbIDddID0gMDsKKwkJCSAgcmV0dXJuOworCQkJY2FzZSA0OgorCQkJICB0bXBbIDBdID0gMDsgdG1wWyAxXSA9IDA7IHRtcFsgMl0gPSAwOyB0bXBbIDNdID0gMDsKKwkJCSAgcmV0dXJuOworCQl9CisJfQorCWkgPSBfX0ZEU0VUX0xPTkdTOworCXdoaWxlIChpKSB7CisJCWktLTsKKwkJKnRtcCA9IDA7CisJCXRtcCsrOworCX0KK30KKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZiAvKiBfX1NQQVJDX1BPU0lYX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcG9zaXhfdHlwZXNfMzIuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcG9zaXhfdHlwZXNfMzIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJiNmViMS4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3Bvc2l4X3R5cGVzXzMyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotI2lmbmRlZiBfX0FSQ0hfU1BBUkNfUE9TSVhfVFlQRVNfSAotI2RlZmluZSBfX0FSQ0hfU1BBUkNfUE9TSVhfVFlQRVNfSAotCi0vKgotICogVGhpcyBmaWxlIGlzIGdlbmVyYWxseSB1c2VkIGJ5IHVzZXItbGV2ZWwgc29mdHdhcmUsIHNvIHlvdSBuZWVkIHRvCi0gKiBiZSBhIGxpdHRsZSBjYXJlZnVsIGFib3V0IG5hbWVzcGFjZSBwb2xsdXRpb24gZXRjLiAgQWxzbywgd2UgY2Fubm90Ci0gKiBhc3N1bWUgR0NDIGlzIGJlaW5nIHVzZWQuCi0gKi8KLQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgICAgIF9fa2VybmVsX3NpemVfdDsKLXR5cGVkZWYgaW50ICAgICAgICAgICAgICAgICAgICBfX2tlcm5lbF9zc2l6ZV90OwotdHlwZWRlZiBsb25nIGludCAgICAgICAgICAgICAgIF9fa2VybmVsX3B0cmRpZmZfdDsKLXR5cGVkZWYgbG9uZyAgICAgICAgICAgICAgICAgICBfX2tlcm5lbF90aW1lX3Q7Ci10eXBlZGVmIGxvbmcJCSAgICAgICBfX2tlcm5lbF9zdXNlY29uZHNfdDsKLXR5cGVkZWYgbG9uZyAgICAgICAgICAgICAgICAgICBfX2tlcm5lbF9jbG9ja190OwotdHlwZWRlZiBpbnQgICAgICAgICAgICAgICAgICAgIF9fa2VybmVsX3BpZF90OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAgICAgIF9fa2VybmVsX2lwY19waWRfdDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgICAgICBfX2tlcm5lbF91aWRfdDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgICAgICBfX2tlcm5lbF9naWRfdDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyAgICAgICAgICBfX2tlcm5lbF9pbm9fdDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgICAgICBfX2tlcm5lbF9tb2RlX3Q7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICAgICAgX19rZXJuZWxfdW1vZGVfdDsKLXR5cGVkZWYgc2hvcnQgICAgICAgICAgICAgICAgICBfX2tlcm5lbF9ubGlua190OwotdHlwZWRlZiBsb25nICAgICAgICAgICAgICAgICAgIF9fa2VybmVsX2RhZGRyX3Q7Ci10eXBlZGVmIGxvbmcgICAgICAgICAgICAgICAgICAgX19rZXJuZWxfb2ZmX3Q7Ci10eXBlZGVmIGNoYXIgKiAgICAgICAgICAgICAgICAgX19rZXJuZWxfY2FkZHJfdDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQJICAgICAgIF9fa2VybmVsX3VpZDE2X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0CSAgICAgICBfX2tlcm5lbF9naWQxNl90OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQJICAgICAgIF9fa2VybmVsX3VpZDMyX3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGludAkgICAgICAgX19rZXJuZWxfZ2lkMzJfdDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQJICAgICAgIF9fa2VybmVsX29sZF91aWRfdDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQJICAgICAgIF9fa2VybmVsX29sZF9naWRfdDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQJICAgICAgIF9fa2VybmVsX29sZF9kZXZfdDsKLXR5cGVkZWYgaW50ICAgICAgICAgICAgICAgICAgICBfX2tlcm5lbF9jbG9ja2lkX3Q7Ci10eXBlZGVmIGludCAgICAgICAgICAgICAgICAgICAgX19rZXJuZWxfdGltZXJfdDsKLQotI2lmZGVmIF9fR05VQ19fCi10eXBlZGVmIGxvbmcgbG9uZwlfX2tlcm5lbF9sb2ZmX3Q7Ci0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QgewotCWludAl2YWxbMl07Ci19IF9fa2VybmVsX2ZzaWRfdDsKLQotI2lmIGRlZmluZWQoX19LRVJORUxfXykKLQotI3VuZGVmIF9fRkRfU0VUCi1zdGF0aWMgaW5saW5lIHZvaWQgX19GRF9TRVQodW5zaWduZWQgbG9uZyBmZCwgX19rZXJuZWxfZmRfc2V0ICpmZHNldHApCi17Ci0JdW5zaWduZWQgbG9uZyBfdG1wID0gZmQgLyBfX05GREJJVFM7Ci0JdW5zaWduZWQgbG9uZyBfcmVtID0gZmQgJSBfX05GREJJVFM7Ci0JZmRzZXRwLT5mZHNfYml0c1tfdG1wXSB8PSAoMVVMPDxfcmVtKTsKLX0KLQotI3VuZGVmIF9fRkRfQ0xSCi1zdGF0aWMgaW5saW5lIHZvaWQgX19GRF9DTFIodW5zaWduZWQgbG9uZyBmZCwgX19rZXJuZWxfZmRfc2V0ICpmZHNldHApCi17Ci0JdW5zaWduZWQgbG9uZyBfdG1wID0gZmQgLyBfX05GREJJVFM7Ci0JdW5zaWduZWQgbG9uZyBfcmVtID0gZmQgJSBfX05GREJJVFM7Ci0JZmRzZXRwLT5mZHNfYml0c1tfdG1wXSAmPSB+KDFVTDw8X3JlbSk7Ci19Ci0KLSN1bmRlZiBfX0ZEX0lTU0VUCi1zdGF0aWMgaW5saW5lIGludCBfX0ZEX0lTU0VUKHVuc2lnbmVkIGxvbmcgZmQsIF9fY29uc3RfXyBfX2tlcm5lbF9mZF9zZXQgKnApCi17Ci0JdW5zaWduZWQgbG9uZyBfdG1wID0gZmQgLyBfX05GREJJVFM7Ci0JdW5zaWduZWQgbG9uZyBfcmVtID0gZmQgJSBfX05GREJJVFM7Ci0JcmV0dXJuIChwLT5mZHNfYml0c1tfdG1wXSAmICgxVUw8PF9yZW0pKSAhPSAwOwotfQotCi0vKgotICogVGhpcyB3aWxsIHVucm9sbCB0aGUgbG9vcCBmb3IgdGhlIG5vcm1hbCBjb25zdGFudCBjYXNlcyAoOCBvciAzMiBsb25ncywKLSAqIGZvciAyNTYgYW5kIDEwMjQtYml0IGZkX3NldHMgcmVzcGVjdGl2ZWx5KQotICovCi0jdW5kZWYgX19GRF9aRVJPCi1zdGF0aWMgaW5saW5lIHZvaWQgX19GRF9aRVJPKF9fa2VybmVsX2ZkX3NldCAqcCkKLXsKLQl1bnNpZ25lZCBsb25nICp0bXAgPSBwLT5mZHNfYml0czsKLQlpbnQgaTsKLQotCWlmIChfX2J1aWx0aW5fY29uc3RhbnRfcChfX0ZEU0VUX0xPTkdTKSkgewotCQlzd2l0Y2ggKF9fRkRTRVRfTE9OR1MpIHsKLQkJCWNhc2UgMzI6Ci0JCQkgIHRtcFsgMF0gPSAwOyB0bXBbIDFdID0gMDsgdG1wWyAyXSA9IDA7IHRtcFsgM10gPSAwOwotCQkJICB0bXBbIDRdID0gMDsgdG1wWyA1XSA9IDA7IHRtcFsgNl0gPSAwOyB0bXBbIDddID0gMDsKLQkJCSAgdG1wWyA4XSA9IDA7IHRtcFsgOV0gPSAwOyB0bXBbMTBdID0gMDsgdG1wWzExXSA9IDA7Ci0JCQkgIHRtcFsxMl0gPSAwOyB0bXBbMTNdID0gMDsgdG1wWzE0XSA9IDA7IHRtcFsxNV0gPSAwOwotCQkJICB0bXBbMTZdID0gMDsgdG1wWzE3XSA9IDA7IHRtcFsxOF0gPSAwOyB0bXBbMTldID0gMDsKLQkJCSAgdG1wWzIwXSA9IDA7IHRtcFsyMV0gPSAwOyB0bXBbMjJdID0gMDsgdG1wWzIzXSA9IDA7Ci0JCQkgIHRtcFsyNF0gPSAwOyB0bXBbMjVdID0gMDsgdG1wWzI2XSA9IDA7IHRtcFsyN10gPSAwOwotCQkJICB0bXBbMjhdID0gMDsgdG1wWzI5XSA9IDA7IHRtcFszMF0gPSAwOyB0bXBbMzFdID0gMDsKLQkJCSAgcmV0dXJuOwotCQkJY2FzZSAxNjoKLQkJCSAgdG1wWyAwXSA9IDA7IHRtcFsgMV0gPSAwOyB0bXBbIDJdID0gMDsgdG1wWyAzXSA9IDA7Ci0JCQkgIHRtcFsgNF0gPSAwOyB0bXBbIDVdID0gMDsgdG1wWyA2XSA9IDA7IHRtcFsgN10gPSAwOwotCQkJICB0bXBbIDhdID0gMDsgdG1wWyA5XSA9IDA7IHRtcFsxMF0gPSAwOyB0bXBbMTFdID0gMDsKLQkJCSAgdG1wWzEyXSA9IDA7IHRtcFsxM10gPSAwOyB0bXBbMTRdID0gMDsgdG1wWzE1XSA9IDA7Ci0JCQkgIHJldHVybjsKLQkJCWNhc2UgODoKLQkJCSAgdG1wWyAwXSA9IDA7IHRtcFsgMV0gPSAwOyB0bXBbIDJdID0gMDsgdG1wWyAzXSA9IDA7Ci0JCQkgIHRtcFsgNF0gPSAwOyB0bXBbIDVdID0gMDsgdG1wWyA2XSA9IDA7IHRtcFsgN10gPSAwOwotCQkJICByZXR1cm47Ci0JCQljYXNlIDQ6Ci0JCQkgIHRtcFsgMF0gPSAwOyB0bXBbIDFdID0gMDsgdG1wWyAyXSA9IDA7IHRtcFsgM10gPSAwOwotCQkJICByZXR1cm47Ci0JCX0KLQl9Ci0JaSA9IF9fRkRTRVRfTE9OR1M7Ci0Jd2hpbGUgKGkpIHsKLQkJaS0tOwotCQkqdG1wID0gMDsKLQkJdG1wKys7Ci0JfQotfQotCi0jZW5kaWYgLyogZGVmaW5lZChfX0tFUk5FTF9fKSAqLwotCi0jZW5kaWYgLyogIShfX0FSQ0hfU1BBUkNfUE9TSVhfVFlQRVNfSCkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcG9zaXhfdHlwZXNfNjQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcG9zaXhfdHlwZXNfNjQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE4ZjkzMi4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3Bvc2l4X3R5cGVzXzY0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotI2lmbmRlZiBfX0FSQ0hfU1BBUkM2NF9QT1NJWF9UWVBFU19ICi0jZGVmaW5lIF9fQVJDSF9TUEFSQzY0X1BPU0lYX1RZUEVTX0gKLQotLyoKLSAqIFRoaXMgZmlsZSBpcyBnZW5lcmFsbHkgdXNlZCBieSB1c2VyLWxldmVsIHNvZnR3YXJlLCBzbyB5b3UgbmVlZCB0bwotICogYmUgYSBsaXR0bGUgY2FyZWZ1bCBhYm91dCBuYW1lc3BhY2UgcG9sbHV0aW9uIGV0Yy4gIEFsc28sIHdlIGNhbm5vdAotICogYXNzdW1lIEdDQyBpcyBiZWluZyB1c2VkLgotICovCi0KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyAgICAgICAgICBfX2tlcm5lbF9zaXplX3Q7Ci10eXBlZGVmIGxvbmcgICAgICAgICAgICAgICAgICAgX19rZXJuZWxfc3NpemVfdDsKLXR5cGVkZWYgbG9uZyAgICAgICAgICAgICAgICAgICBfX2tlcm5lbF9wdHJkaWZmX3Q7Ci10eXBlZGVmIGxvbmcgICAgICAgICAgICAgICAgICAgX19rZXJuZWxfdGltZV90OwotdHlwZWRlZiBsb25nICAgICAgICAgICAgICAgICAgIF9fa2VybmVsX2Nsb2NrX3Q7Ci10eXBlZGVmIGludCAgICAgICAgICAgICAgICAgICAgX19rZXJuZWxfcGlkX3Q7Ci10eXBlZGVmIGludCAgICAgICAgICAgICAgICAgICAgX19rZXJuZWxfaXBjX3BpZF90OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgICAgIF9fa2VybmVsX3VpZF90OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgICAgIF9fa2VybmVsX2dpZF90OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgICAgICAgIF9fa2VybmVsX2lub190OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgICAgIF9fa2VybmVsX21vZGVfdDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgICAgICBfX2tlcm5lbF91bW9kZV90OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgICAgIF9fa2VybmVsX25saW5rX3Q7Ci10eXBlZGVmIGludCAgICAgICAgICAgICAgICAgICAgX19rZXJuZWxfZGFkZHJfdDsKLXR5cGVkZWYgbG9uZyAgICAgICAgICAgICAgICAgICBfX2tlcm5lbF9vZmZfdDsKLXR5cGVkZWYgY2hhciAqICAgICAgICAgICAgICAgICBfX2tlcm5lbF9jYWRkcl90OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydAkgICAgICAgX19rZXJuZWxfdWlkMTZfdDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQJICAgICAgIF9fa2VybmVsX2dpZDE2X3Q7Ci10eXBlZGVmIGludCAgICAgICAgICAgICAgICAgICAgX19rZXJuZWxfY2xvY2tpZF90OwotdHlwZWRlZiBpbnQgICAgICAgICAgICAgICAgICAgIF9fa2VybmVsX3RpbWVyX3Q7Ci0KLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgCSAgICAgICBfX2tlcm5lbF9vbGRfdWlkX3Q7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICAgICAgX19rZXJuZWxfb2xkX2dpZF90OwotdHlwZWRlZiBfX2tlcm5lbF91aWRfdAkgICAgICAgX19rZXJuZWxfdWlkMzJfdDsKLXR5cGVkZWYgX19rZXJuZWxfZ2lkX3QJICAgICAgIF9fa2VybmVsX2dpZDMyX3Q7Ci0KLXR5cGVkZWYgdW5zaWduZWQgaW50CSAgICAgICBfX2tlcm5lbF9vbGRfZGV2X3Q7Ci0KLS8qIE5vdGUgdGhpcyBwaWVjZSBvZiBhc3ltbWV0cnkgZnJvbSB0aGUgdjkgQUJJLiAgKi8KLXR5cGVkZWYgaW50CQkgICAgICAgX19rZXJuZWxfc3VzZWNvbmRzX3Q7Ci0KLSNpZmRlZiBfX0dOVUNfXwotdHlwZWRlZiBsb25nIGxvbmcgICAgICAgICAgICAgIF9fa2VybmVsX2xvZmZfdDsKLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdCB7Ci0JaW50CXZhbFsyXTsKLX0gX19rZXJuZWxfZnNpZF90OwotCi0jaWYgZGVmaW5lZChfX0tFUk5FTF9fKQotCi0jdW5kZWYgX19GRF9TRVQKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX0ZEX1NFVCh1bnNpZ25lZCBsb25nIGZkLCBfX2tlcm5lbF9mZF9zZXQgKmZkc2V0cCkKLXsKLQl1bnNpZ25lZCBsb25nIF90bXAgPSBmZCAvIF9fTkZEQklUUzsKLQl1bnNpZ25lZCBsb25nIF9yZW0gPSBmZCAlIF9fTkZEQklUUzsKLQlmZHNldHAtPmZkc19iaXRzW190bXBdIHw9ICgxVUw8PF9yZW0pOwotfQotCi0jdW5kZWYgX19GRF9DTFIKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX0ZEX0NMUih1bnNpZ25lZCBsb25nIGZkLCBfX2tlcm5lbF9mZF9zZXQgKmZkc2V0cCkKLXsKLQl1bnNpZ25lZCBsb25nIF90bXAgPSBmZCAvIF9fTkZEQklUUzsKLQl1bnNpZ25lZCBsb25nIF9yZW0gPSBmZCAlIF9fTkZEQklUUzsKLQlmZHNldHAtPmZkc19iaXRzW190bXBdICY9IH4oMVVMPDxfcmVtKTsKLX0KLQotI3VuZGVmIF9fRkRfSVNTRVQKLXN0YXRpYyBpbmxpbmUgaW50IF9fRkRfSVNTRVQodW5zaWduZWQgbG9uZyBmZCwgX19jb25zdF9fIF9fa2VybmVsX2ZkX3NldCAqcCkKLXsKLQl1bnNpZ25lZCBsb25nIF90bXAgPSBmZCAvIF9fTkZEQklUUzsKLQl1bnNpZ25lZCBsb25nIF9yZW0gPSBmZCAlIF9fTkZEQklUUzsKLQlyZXR1cm4gKHAtPmZkc19iaXRzW190bXBdICYgKDFVTDw8X3JlbSkpICE9IDA7Ci19Ci0KLS8qCi0gKiBUaGlzIHdpbGwgdW5yb2xsIHRoZSBsb29wIGZvciB0aGUgbm9ybWFsIGNvbnN0YW50IGNhc2VzICg4IG9yIDMyIGxvbmdzLAotICogZm9yIDI1NiBhbmQgMTAyNC1iaXQgZmRfc2V0cyByZXNwZWN0aXZlbHkpCi0gKi8KLSN1bmRlZiBfX0ZEX1pFUk8KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX0ZEX1pFUk8oX19rZXJuZWxfZmRfc2V0ICpwKQotewotCXVuc2lnbmVkIGxvbmcgKnRtcCA9IHAtPmZkc19iaXRzOwotCWludCBpOwotCi0JaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKF9fRkRTRVRfTE9OR1MpKSB7Ci0JCXN3aXRjaCAoX19GRFNFVF9MT05HUykgewotCQkJY2FzZSAzMjoKLQkJCSAgdG1wWyAwXSA9IDA7IHRtcFsgMV0gPSAwOyB0bXBbIDJdID0gMDsgdG1wWyAzXSA9IDA7Ci0JCQkgIHRtcFsgNF0gPSAwOyB0bXBbIDVdID0gMDsgdG1wWyA2XSA9IDA7IHRtcFsgN10gPSAwOwotCQkJICB0bXBbIDhdID0gMDsgdG1wWyA5XSA9IDA7IHRtcFsxMF0gPSAwOyB0bXBbMTFdID0gMDsKLQkJCSAgdG1wWzEyXSA9IDA7IHRtcFsxM10gPSAwOyB0bXBbMTRdID0gMDsgdG1wWzE1XSA9IDA7Ci0JCQkgIHRtcFsxNl0gPSAwOyB0bXBbMTddID0gMDsgdG1wWzE4XSA9IDA7IHRtcFsxOV0gPSAwOwotCQkJICB0bXBbMjBdID0gMDsgdG1wWzIxXSA9IDA7IHRtcFsyMl0gPSAwOyB0bXBbMjNdID0gMDsKLQkJCSAgdG1wWzI0XSA9IDA7IHRtcFsyNV0gPSAwOyB0bXBbMjZdID0gMDsgdG1wWzI3XSA9IDA7Ci0JCQkgIHRtcFsyOF0gPSAwOyB0bXBbMjldID0gMDsgdG1wWzMwXSA9IDA7IHRtcFszMV0gPSAwOwotCQkJICByZXR1cm47Ci0JCQljYXNlIDE2OgotCQkJICB0bXBbIDBdID0gMDsgdG1wWyAxXSA9IDA7IHRtcFsgMl0gPSAwOyB0bXBbIDNdID0gMDsKLQkJCSAgdG1wWyA0XSA9IDA7IHRtcFsgNV0gPSAwOyB0bXBbIDZdID0gMDsgdG1wWyA3XSA9IDA7Ci0JCQkgIHRtcFsgOF0gPSAwOyB0bXBbIDldID0gMDsgdG1wWzEwXSA9IDA7IHRtcFsxMV0gPSAwOwotCQkJICB0bXBbMTJdID0gMDsgdG1wWzEzXSA9IDA7IHRtcFsxNF0gPSAwOyB0bXBbMTVdID0gMDsKLQkJCSAgcmV0dXJuOwotCQkJY2FzZSA4OgotCQkJICB0bXBbIDBdID0gMDsgdG1wWyAxXSA9IDA7IHRtcFsgMl0gPSAwOyB0bXBbIDNdID0gMDsKLQkJCSAgdG1wWyA0XSA9IDA7IHRtcFsgNV0gPSAwOyB0bXBbIDZdID0gMDsgdG1wWyA3XSA9IDA7Ci0JCQkgIHJldHVybjsKLQkJCWNhc2UgNDoKLQkJCSAgdG1wWyAwXSA9IDA7IHRtcFsgMV0gPSAwOyB0bXBbIDJdID0gMDsgdG1wWyAzXSA9IDA7Ci0JCQkgIHJldHVybjsKLQkJfQotCX0KLQlpID0gX19GRFNFVF9MT05HUzsKLQl3aGlsZSAoaSkgewotCQlpLS07Ci0JCSp0bXAgPSAwOwotCQl0bXArKzsKLQl9Ci19Ci0KLSNlbmRpZiAvKiBkZWZpbmVkKF9fS0VSTkVMX18pICovCi0KLSNlbmRpZiAvKiAhKF9fQVJDSF9TUEFSQzY0X1BPU0lYX1RZUEVTX0gpICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvcl8zMi5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wcm9jZXNzb3JfMzIuaAppbmRleCAyYWU2N2EyLi4wOTUyMWM2IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvcl8zMi5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcHJvY2Vzc29yXzMyLmgKQEAgLTk5LDcgKzk5LDcgQEAKIAkJCSAgICAgInN0XHQlJWcwLCBbJTAgKyAlMyArIDB4M2NdIgogCQkJICAgICA6IC8qIG5vIG91dHB1dHMgKi8KIAkJCSAgICAgOiAiciIgKHJlZ3MpLAotCQkJICAgICAgICJyIiAoc3AgLSBzaXplb2Yoc3RydWN0IHJlZ193aW5kb3cpKSwKKwkJCSAgICAgICAiciIgKHNwIC0gc2l6ZW9mKHN0cnVjdCByZWdfd2luZG93MzIpKSwKIAkJCSAgICAgICAiciIgKHplcm8pLAogCQkJICAgICAgICJpIiAoKGNvbnN0IHVuc2lnbmVkIGxvbmcpKCYoKHN0cnVjdCBwdF9yZWdzICopMCktPnVfcmVnc1swXSkpCiAJCQkgICAgIDogIm1lbW9yeSIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wdHJhY2UuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcHRyYWNlLmgKaW5kZXggNmRjYmUyZS4uMzBiMGI3OSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wdHJhY2UuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3B0cmFjZS5oCkBAIC0xLDggKzEsNDQ4IEBACi0jaWZuZGVmIF9fX0FTTV9TUEFSQ19QVFJBQ0VfSAotI2RlZmluZSBfX19BU01fU1BBUkNfUFRSQUNFX0gKKyNpZm5kZWYgX19TUEFSQ19QVFJBQ0VfSAorI2RlZmluZSBfX1NQQVJDX1BUUkFDRV9ICisKICNpZiBkZWZpbmVkKF9fc3BhcmNfXykgJiYgZGVmaW5lZChfX2FyY2g2NF9fKQotI2luY2x1ZGUgPGFzbS9wdHJhY2VfNjQuaD4KKy8qIDY0IGJpdCBzcGFyYyAqLworI2luY2x1ZGUgPGFzbS9wc3RhdGUuaD4KKworLyogVGhpcyBzdHJ1Y3QgZGVmaW5lcyB0aGUgd2F5IHRoZSByZWdpc3RlcnMgYXJlIHN0b3JlZCBvbiB0aGUKKyAqIHN0YWNrIGR1cmluZyBhIHN5c3RlbSBjYWxsIGFuZCBiYXNpY2FsbHkgYWxsIHRyYXBzLgorICovCisKKy8qIFRoaXMgbWFnaWMgdmFsdWUgbXVzdCBoYXZlIHRoZSBsb3cgOSBiaXRzIGNsZWFyLAorICogYXMgdGhhdCBpcyB3aGVyZSB3ZSBlbmNvZGUgdGhlICV0dCB2YWx1ZSwgc2VlIGJlbG93LgorICovCisjZGVmaW5lIFBUX1JFR1NfTUFHSUMgMHg1N2FjNmMwMAorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IHB0X3JlZ3MgeworCXVuc2lnbmVkIGxvbmcgdV9yZWdzWzE2XTsgLyogZ2xvYmFscyBhbmQgaW5zICovCisJdW5zaWduZWQgbG9uZyB0c3RhdGU7CisJdW5zaWduZWQgbG9uZyB0cGM7CisJdW5zaWduZWQgbG9uZyB0bnBjOworCXVuc2lnbmVkIGludCB5OworCisJLyogV2UgZW5jb2RlIGEgbWFnaWMgbnVtYmVyLCBQVF9SRUdTX01BR0lDLCBhbG9uZworCSAqIHdpdGggdGhlICV0dCAodHJhcCB0eXBlKSByZWdpc3RlciB2YWx1ZSBhdCB0cmFwCisJICogZW50cnkgdGltZS4gIFRoZSBtYWdpYyBudW1iZXIgYWxsb3dzIHVzIHRvIGlkZW50aWZ5CisJICogYWNjdXJhdGVseSBhIHRyYXAgc3RhY2sgZnJhbWUgaW4gdGhlIHN0YWNrCisJICogdW53aW5kZXIsIGFuZCB0aGUgJXR0IHZhbHVlIGFsbG93cyB1cyB0byB0ZXN0CisJICogdGhpbmdzIGxpa2UgImluIGEgc3lzdGVtIGNhbGwiIGV0Yy4gZm9yIGFuIGFyYml0cmF5CisJICogcHJvY2Vzcy4KKwkgKgorCSAqIFRoZSBQVF9SRUdTX01BR0lDIGlzIGNob29zZW4gc3VjaCB0aGF0IGl0IGNhbiBiZQorCSAqIGxvYWRlZCBjb21wbGV0ZWx5IHVzaW5nIGp1c3QgYSBzZXRoaSBpbnN0cnVjdGlvbi4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgbWFnaWM7Cit9OworCitzdHJ1Y3QgcHRfcmVnczMyIHsKKwl1bnNpZ25lZCBpbnQgcHNyOworCXVuc2lnbmVkIGludCBwYzsKKwl1bnNpZ25lZCBpbnQgbnBjOworCXVuc2lnbmVkIGludCB5OworCXVuc2lnbmVkIGludCB1X3JlZ3NbMTZdOyAvKiBnbG9iYWxzIGFuZCBpbnMgKi8KK307CisKKy8qIEEgVjkgcmVnaXN0ZXIgd2luZG93ICovCitzdHJ1Y3QgcmVnX3dpbmRvdyB7CisJdW5zaWduZWQgbG9uZyBsb2NhbHNbOF07CisJdW5zaWduZWQgbG9uZyBpbnNbOF07Cit9OworCisvKiBBIDMyLWJpdCByZWdpc3RlciB3aW5kb3cuICovCitzdHJ1Y3QgcmVnX3dpbmRvdzMyIHsKKwl1bnNpZ25lZCBpbnQgbG9jYWxzWzhdOworCXVuc2lnbmVkIGludCBpbnNbOF07Cit9OworCisvKiBBIFY5IFNwYXJjIHN0YWNrIGZyYW1lICovCitzdHJ1Y3Qgc3BhcmNfc3RhY2tmIHsKKwl1bnNpZ25lZCBsb25nIGxvY2Fsc1s4XTsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBpbnNbNl07CisJc3RydWN0IHNwYXJjX3N0YWNrZiAqZnA7CisJdW5zaWduZWQgbG9uZyBjYWxsZXJzX3BjOworCWNoYXIgKnN0cnVjdHB0cjsKKwl1bnNpZ25lZCBsb25nIHhhcmdzWzZdOworCXVuc2lnbmVkIGxvbmcgeHhhcmdzWzFdOworfTsKKworLyogQSAzMi1iaXQgU3BhcmMgc3RhY2sgZnJhbWUgKi8KK3N0cnVjdCBzcGFyY19zdGFja2YzMiB7CisJdW5zaWduZWQgaW50IGxvY2Fsc1s4XTsKKyAgICAgICAgdW5zaWduZWQgaW50IGluc1s2XTsKKwl1bnNpZ25lZCBpbnQgZnA7CisJdW5zaWduZWQgaW50IGNhbGxlcnNfcGM7CisJdW5zaWduZWQgaW50IHN0cnVjdHB0cjsKKwl1bnNpZ25lZCBpbnQgeGFyZ3NbNl07CisJdW5zaWduZWQgaW50IHh4YXJnc1sxXTsKK307CisKK3N0cnVjdCBzcGFyY190cmFwZiB7CisJdW5zaWduZWQgbG9uZyBsb2NhbHNbOF07CisJdW5zaWduZWQgbG9uZyBpbnNbOF07CisJdW5zaWduZWQgbG9uZyBfdW51c2VkOworCXN0cnVjdCBwdF9yZWdzICpyZWdzOworfTsKKyNlbmRpZiAvKiAoIV9fQVNTRU1CTFlfXykgKi8KICNlbHNlCi0jaW5jbHVkZSA8YXNtL3B0cmFjZV8zMi5oPgorLyogMzIgYml0IHNwYXJjICovCisKKyNpbmNsdWRlIDxhc20vcHNyLmg+CisKKy8qIFRoaXMgc3RydWN0IGRlZmluZXMgdGhlIHdheSB0aGUgcmVnaXN0ZXJzIGFyZSBzdG9yZWQgb24gdGhlCisgKiBzdGFjayBkdXJpbmcgYSBzeXN0ZW0gY2FsbCBhbmQgYmFzaWNhbGx5IGFsbCB0cmFwcy4KKyAqLworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworc3RydWN0IHB0X3JlZ3MgeworCXVuc2lnbmVkIGxvbmcgcHNyOworCXVuc2lnbmVkIGxvbmcgcGM7CisJdW5zaWduZWQgbG9uZyBucGM7CisJdW5zaWduZWQgbG9uZyB5OworCXVuc2lnbmVkIGxvbmcgdV9yZWdzWzE2XTsgLyogZ2xvYmFscyBhbmQgaW5zICovCit9OworCisvKiBBIDMyLWJpdCByZWdpc3RlciB3aW5kb3cuICovCitzdHJ1Y3QgcmVnX3dpbmRvdzMyIHsKKwl1bnNpZ25lZCBsb25nIGxvY2Fsc1s4XTsKKwl1bnNpZ25lZCBsb25nIGluc1s4XTsKK307CisKKy8qIEEgU3BhcmMgc3RhY2sgZnJhbWUgKi8KK3N0cnVjdCBzcGFyY19zdGFja2YgeworCXVuc2lnbmVkIGxvbmcgbG9jYWxzWzhdOworICAgICAgICB1bnNpZ25lZCBsb25nIGluc1s2XTsKKwlzdHJ1Y3Qgc3BhcmNfc3RhY2tmICpmcDsKKwl1bnNpZ25lZCBsb25nIGNhbGxlcnNfcGM7CisJY2hhciAqc3RydWN0cHRyOworCXVuc2lnbmVkIGxvbmcgeGFyZ3NbNl07CisJdW5zaWduZWQgbG9uZyB4eGFyZ3NbMV07Cit9OworI2VuZGlmIC8qICghX19BU1NFTUJMWV9fKSAqLworCisjZW5kaWYgLyogKGRlZmluZWQoX19zcGFyY19fKSAmJiBkZWZpbmVkKF9fYXJjaDY0X18pKSovCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKyNkZWZpbmUgVFJBQ0VSRUdfU1oJc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKQorI2RlZmluZSBTVEFDS0ZSQU1FX1NaCXNpemVvZihzdHJ1Y3Qgc3BhcmNfc3RhY2tmKQorCisjZGVmaW5lIFRSQUNFUkVHMzJfU1oJc2l6ZW9mKHN0cnVjdCBwdF9yZWdzMzIpCisjZGVmaW5lIFNUQUNLRlJBTUUzMl9TWglzaXplb2Yoc3RydWN0IHNwYXJjX3N0YWNrZjMyKQorCisjZW5kaWYgLyogKCFfX0FTU0VNQkxZX18pICovCisKKyNkZWZpbmUgVVJFR19HMCAgICAgICAgMAorI2RlZmluZSBVUkVHX0cxICAgICAgICAxCisjZGVmaW5lIFVSRUdfRzIgICAgICAgIDIKKyNkZWZpbmUgVVJFR19HMyAgICAgICAgMworI2RlZmluZSBVUkVHX0c0ICAgICAgICA0CisjZGVmaW5lIFVSRUdfRzUgICAgICAgIDUKKyNkZWZpbmUgVVJFR19HNiAgICAgICAgNgorI2RlZmluZSBVUkVHX0c3ICAgICAgICA3CisjZGVmaW5lIFVSRUdfSTAgICAgICAgIDgKKyNkZWZpbmUgVVJFR19JMSAgICAgICAgOQorI2RlZmluZSBVUkVHX0kyICAgICAgICAxMAorI2RlZmluZSBVUkVHX0kzICAgICAgICAxMQorI2RlZmluZSBVUkVHX0k0ICAgICAgICAxMgorI2RlZmluZSBVUkVHX0k1ICAgICAgICAxMworI2RlZmluZSBVUkVHX0k2ICAgICAgICAxNAorI2RlZmluZSBVUkVHX0k3ICAgICAgICAxNQorI2RlZmluZSBVUkVHX0ZQICAgICAgICBVUkVHX0k2CisjZGVmaW5lIFVSRUdfUkVUUEMgICAgIFVSRUdfSTcKKworI2lmIGRlZmluZWQoX19zcGFyY19fKSAmJiBkZWZpbmVkKF9fYXJjaDY0X18pCisvKiA2NCBiaXQgc3BhcmMgKi8KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKK3N0YXRpYyBpbmxpbmUgaW50IHB0X3JlZ3NfdHJhcF90eXBlKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXJldHVybiByZWdzLT5tYWdpYyAmIDB4MWZmOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgcHRfcmVnc19pc19zeXNjYWxsKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXJldHVybiAocmVncy0+dHN0YXRlICYgVFNUQVRFX1NZU0NBTEwpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgcHRfcmVnc19jbGVhcl9zeXNjYWxsKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXJldHVybiAocmVncy0+dHN0YXRlICY9IH5UU1RBVEVfU1lTQ0FMTCk7Cit9CisKKyNkZWZpbmUgYXJjaF9wdHJhY2Vfc3RvcF9uZWVkZWQoZXhpdF9jb2RlLCBpbmZvKSBcCisoewlmbHVzaF91c2VyX3dpbmRvd3MoKTsgXAorCWdldF90aHJlYWRfd3NhdmVkKCkgIT0gMDsgXAorfSkKKworI2RlZmluZSBhcmNoX3B0cmFjZV9zdG9wKGV4aXRfY29kZSwgaW5mbykgXAorCXN5bmNocm9uaXplX3VzZXJfc3RhY2soKQorCitzdHJ1Y3QgZ2xvYmFsX3JlZ19zbmFwc2hvdCB7CisJdW5zaWduZWQgbG9uZwkJdHN0YXRlOworCXVuc2lnbmVkIGxvbmcJCXRwYzsKKwl1bnNpZ25lZCBsb25nCQl0bnBjOworCXVuc2lnbmVkIGxvbmcJCW83OworCXVuc2lnbmVkIGxvbmcJCWk3OworCXVuc2lnbmVkIGxvbmcJCXJwYzsKKwlzdHJ1Y3QgdGhyZWFkX2luZm8JKnRocmVhZDsKKwl1bnNpZ25lZCBsb25nCQlwYWQxOworfTsKK2V4dGVybiBzdHJ1Y3QgZ2xvYmFsX3JlZ19zbmFwc2hvdCBnbG9iYWxfcmVnX3NuYXBzaG90W05SX0NQVVNdOworCisjZGVmaW5lIGZvcmNlX3N1Y2Nlc3NmdWxfc3lzY2FsbF9yZXR1cm4oKQkgICAgXAorZG8gewljdXJyZW50X3RocmVhZF9pbmZvKCktPnN5c2NhbGxfbm9lcnJvciA9IDE7IFwKK30gd2hpbGUgKDApCisjZGVmaW5lIHVzZXJfbW9kZShyZWdzKSAoISgocmVncyktPnRzdGF0ZSAmIFRTVEFURV9QUklWKSkKKyNkZWZpbmUgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKSAoKHJlZ3MpLT50cGMpCisjZGVmaW5lIHVzZXJfc3RhY2tfcG9pbnRlcihyZWdzKSAoKHJlZ3MpLT51X3JlZ3NbVVJFR19GUF0pCisjZGVmaW5lIHJlZ3NfcmV0dXJuX3ZhbHVlKHJlZ3MpICgocmVncyktPnVfcmVnc1tVUkVHX0kwXSkKKyNpZmRlZiBDT05GSUdfU01QCitleHRlcm4gdW5zaWduZWQgbG9uZyBwcm9maWxlX3BjKHN0cnVjdCBwdF9yZWdzICopOworI2Vsc2UKKyNkZWZpbmUgcHJvZmlsZV9wYyhyZWdzKSBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpCiAjZW5kaWYKK2V4dGVybiB2b2lkIHNob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqKTsKKyNlbmRpZiAvKiAoX19LRVJORUxfXykgKi8KKworI2Vsc2UgLyogX19BU1NFTUJMWV9fICovCisvKiBGb3IgYXNzZW1ibHkgY29kZS4gKi8KKyNkZWZpbmUgVFJBQ0VSRUdfU1oJCTB4YTAKKyNkZWZpbmUgU1RBQ0tGUkFNRV9TWgkJMHhjMAorCisjZGVmaW5lIFRSQUNFUkVHMzJfU1oJCTB4NTAKKyNkZWZpbmUgU1RBQ0tGUkFNRTMyX1NaCQkweDYwCisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisKKyNlbHNlIC8qIChkZWZpbmVkKF9fc3BhcmNfXykgJiYgZGVmaW5lZChfX2FyY2g2NF9fKSkgKi8KKworLyogMzIgYml0IHNwYXJjICovCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBwdF9yZWdzX2lzX3N5c2NhbGwoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcmV0dXJuIChyZWdzLT5wc3IgJiBQU1JfU1lTQ0FMTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBwdF9yZWdzX2NsZWFyX3N5c2NhbGwoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcmV0dXJuIChyZWdzLT5wc3IgJj0gflBTUl9TWVNDQUxMKTsKK30KKworI2RlZmluZSBhcmNoX3B0cmFjZV9zdG9wX25lZWRlZChleGl0X2NvZGUsIGluZm8pIFwKKyh7CWZsdXNoX3VzZXJfd2luZG93cygpOyBcCisJY3VycmVudF90aHJlYWRfaW5mbygpLT53X3NhdmVkICE9IDA7CVwKK30pCisKKyNkZWZpbmUgYXJjaF9wdHJhY2Vfc3RvcChleGl0X2NvZGUsIGluZm8pIFwKKwlzeW5jaHJvbml6ZV91c2VyX3N0YWNrKCkKKworI2RlZmluZSB1c2VyX21vZGUocmVncykgKCEoKHJlZ3MpLT5wc3IgJiBQU1JfUFMpKQorI2RlZmluZSBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpICgocmVncyktPnBjKQorI2RlZmluZSB1c2VyX3N0YWNrX3BvaW50ZXIocmVncykgKChyZWdzKS0+dV9yZWdzW1VSRUdfRlBdKQordW5zaWduZWQgbG9uZyBwcm9maWxlX3BjKHN0cnVjdCBwdF9yZWdzICopOworZXh0ZXJuIHZvaWQgc2hvd19yZWdzKHN0cnVjdCBwdF9yZWdzICopOworI2VuZGlmIC8qIChfX0tFUk5FTF9fKSAqLworCisjZWxzZSAvKiAoIV9fQVNTRU1CTFlfXykgKi8KKy8qIEZvciBhc3NlbWJseSBjb2RlLiAqLworI2RlZmluZSBUUkFDRVJFR19TWiAgICAgICAweDUwCisjZGVmaW5lIFNUQUNLRlJBTUVfU1ogICAgIDB4NjAKKyNlbmRpZiAvKiAoIV9fQVNTRU1CTFlfXykgKi8KKworI2VuZGlmIC8qIChkZWZpbmVkKF9fc3BhcmNfXykgJiYgZGVmaW5lZChfX2FyY2g2NF9fKSkgKi8KKworI2lmZGVmIF9fS0VSTkVMX18KKyNkZWZpbmUgU1RBQ0tfQklBUwkJMjA0NwogI2VuZGlmCisKKy8qIFRoZXNlIGFyZSBmb3IgcHRfcmVncy4gKi8KKyNkZWZpbmUgUFRfVjlfRzAgICAgIDB4MDAKKyNkZWZpbmUgUFRfVjlfRzEgICAgIDB4MDgKKyNkZWZpbmUgUFRfVjlfRzIgICAgIDB4MTAKKyNkZWZpbmUgUFRfVjlfRzMgICAgIDB4MTgKKyNkZWZpbmUgUFRfVjlfRzQgICAgIDB4MjAKKyNkZWZpbmUgUFRfVjlfRzUgICAgIDB4MjgKKyNkZWZpbmUgUFRfVjlfRzYgICAgIDB4MzAKKyNkZWZpbmUgUFRfVjlfRzcgICAgIDB4MzgKKyNkZWZpbmUgUFRfVjlfSTAgICAgIDB4NDAKKyNkZWZpbmUgUFRfVjlfSTEgICAgIDB4NDgKKyNkZWZpbmUgUFRfVjlfSTIgICAgIDB4NTAKKyNkZWZpbmUgUFRfVjlfSTMgICAgIDB4NTgKKyNkZWZpbmUgUFRfVjlfSTQgICAgIDB4NjAKKyNkZWZpbmUgUFRfVjlfSTUgICAgIDB4NjgKKyNkZWZpbmUgUFRfVjlfSTYgICAgIDB4NzAKKyNkZWZpbmUgUFRfVjlfRlAgICAgIFBUX1Y5X0k2CisjZGVmaW5lIFBUX1Y5X0k3ICAgICAweDc4CisjZGVmaW5lIFBUX1Y5X1RTVEFURSAweDgwCisjZGVmaW5lIFBUX1Y5X1RQQyAgICAweDg4CisjZGVmaW5lIFBUX1Y5X1ROUEMgICAweDkwCisjZGVmaW5lIFBUX1Y5X1kgICAgICAweDk4CisjZGVmaW5lIFBUX1Y5X01BR0lDICAweDljCisjZGVmaW5lIFBUX1RTVEFURQlQVF9WOV9UU1RBVEUKKyNkZWZpbmUgUFRfVFBDCQlQVF9WOV9UUEMKKyNkZWZpbmUgUFRfVE5QQwkJUFRfVjlfVE5QQworCisvKiBUaGVzZSBmb3IgcHRfcmVnczMyLiAqLworI2RlZmluZSBQVF9QU1IgICAgMHgwCisjZGVmaW5lIFBUX1BDICAgICAweDQKKyNkZWZpbmUgUFRfTlBDICAgIDB4OAorI2RlZmluZSBQVF9ZICAgICAgMHhjCisjZGVmaW5lIFBUX0cwICAgICAweDEwCisjZGVmaW5lIFBUX1dJTSAgICBQVF9HMAorI2RlZmluZSBQVF9HMSAgICAgMHgxNAorI2RlZmluZSBQVF9HMiAgICAgMHgxOAorI2RlZmluZSBQVF9HMyAgICAgMHgxYworI2RlZmluZSBQVF9HNCAgICAgMHgyMAorI2RlZmluZSBQVF9HNSAgICAgMHgyNAorI2RlZmluZSBQVF9HNiAgICAgMHgyOAorI2RlZmluZSBQVF9HNyAgICAgMHgyYworI2RlZmluZSBQVF9JMCAgICAgMHgzMAorI2RlZmluZSBQVF9JMSAgICAgMHgzNAorI2RlZmluZSBQVF9JMiAgICAgMHgzOAorI2RlZmluZSBQVF9JMyAgICAgMHgzYworI2RlZmluZSBQVF9JNCAgICAgMHg0MAorI2RlZmluZSBQVF9JNSAgICAgMHg0NAorI2RlZmluZSBQVF9JNiAgICAgMHg0OAorI2RlZmluZSBQVF9GUCAgICAgUFRfSTYKKyNkZWZpbmUgUFRfSTcgICAgIDB4NGMKKworLyogUmVnX3dpbmRvdyBvZmZzZXRzICovCisjZGVmaW5lIFJXX1Y5X0wwICAgICAweDAwCisjZGVmaW5lIFJXX1Y5X0wxICAgICAweDA4CisjZGVmaW5lIFJXX1Y5X0wyICAgICAweDEwCisjZGVmaW5lIFJXX1Y5X0wzICAgICAweDE4CisjZGVmaW5lIFJXX1Y5X0w0ICAgICAweDIwCisjZGVmaW5lIFJXX1Y5X0w1ICAgICAweDI4CisjZGVmaW5lIFJXX1Y5X0w2ICAgICAweDMwCisjZGVmaW5lIFJXX1Y5X0w3ICAgICAweDM4CisjZGVmaW5lIFJXX1Y5X0kwICAgICAweDQwCisjZGVmaW5lIFJXX1Y5X0kxICAgICAweDQ4CisjZGVmaW5lIFJXX1Y5X0kyICAgICAweDUwCisjZGVmaW5lIFJXX1Y5X0kzICAgICAweDU4CisjZGVmaW5lIFJXX1Y5X0k0ICAgICAweDYwCisjZGVmaW5lIFJXX1Y5X0k1ICAgICAweDY4CisjZGVmaW5lIFJXX1Y5X0k2ICAgICAweDcwCisjZGVmaW5lIFJXX1Y5X0k3ICAgICAweDc4CisKKyNkZWZpbmUgUldfTDAgICAgIDB4MDAKKyNkZWZpbmUgUldfTDEgICAgIDB4MDQKKyNkZWZpbmUgUldfTDIgICAgIDB4MDgKKyNkZWZpbmUgUldfTDMgICAgIDB4MGMKKyNkZWZpbmUgUldfTDQgICAgIDB4MTAKKyNkZWZpbmUgUldfTDUgICAgIDB4MTQKKyNkZWZpbmUgUldfTDYgICAgIDB4MTgKKyNkZWZpbmUgUldfTDcgICAgIDB4MWMKKyNkZWZpbmUgUldfSTAgICAgIDB4MjAKKyNkZWZpbmUgUldfSTEgICAgIDB4MjQKKyNkZWZpbmUgUldfSTIgICAgIDB4MjgKKyNkZWZpbmUgUldfSTMgICAgIDB4MmMKKyNkZWZpbmUgUldfSTQgICAgIDB4MzAKKyNkZWZpbmUgUldfSTUgICAgIDB4MzQKKyNkZWZpbmUgUldfSTYgICAgIDB4MzgKKyNkZWZpbmUgUldfSTcgICAgIDB4M2MKKworLyogU3RhY2tfZnJhbWUgb2Zmc2V0cyAqLworI2RlZmluZSBTRl9WOV9MMCAgICAgMHgwMAorI2RlZmluZSBTRl9WOV9MMSAgICAgMHgwOAorI2RlZmluZSBTRl9WOV9MMiAgICAgMHgxMAorI2RlZmluZSBTRl9WOV9MMyAgICAgMHgxOAorI2RlZmluZSBTRl9WOV9MNCAgICAgMHgyMAorI2RlZmluZSBTRl9WOV9MNSAgICAgMHgyOAorI2RlZmluZSBTRl9WOV9MNiAgICAgMHgzMAorI2RlZmluZSBTRl9WOV9MNyAgICAgMHgzOAorI2RlZmluZSBTRl9WOV9JMCAgICAgMHg0MAorI2RlZmluZSBTRl9WOV9JMSAgICAgMHg0OAorI2RlZmluZSBTRl9WOV9JMiAgICAgMHg1MAorI2RlZmluZSBTRl9WOV9JMyAgICAgMHg1OAorI2RlZmluZSBTRl9WOV9JNCAgICAgMHg2MAorI2RlZmluZSBTRl9WOV9JNSAgICAgMHg2OAorI2RlZmluZSBTRl9WOV9GUCAgICAgMHg3MAorI2RlZmluZSBTRl9WOV9QQyAgICAgMHg3OAorI2RlZmluZSBTRl9WOV9SRVRQICAgMHg4MAorI2RlZmluZSBTRl9WOV9YQVJHMCAgMHg4OAorI2RlZmluZSBTRl9WOV9YQVJHMSAgMHg5MAorI2RlZmluZSBTRl9WOV9YQVJHMiAgMHg5OAorI2RlZmluZSBTRl9WOV9YQVJHMyAgMHhhMAorI2RlZmluZSBTRl9WOV9YQVJHNCAgMHhhOAorI2RlZmluZSBTRl9WOV9YQVJHNSAgMHhiMAorI2RlZmluZSBTRl9WOV9YWEFSRyAgMHhiOAorCisjZGVmaW5lIFNGX0wwICAgICAweDAwCisjZGVmaW5lIFNGX0wxICAgICAweDA0CisjZGVmaW5lIFNGX0wyICAgICAweDA4CisjZGVmaW5lIFNGX0wzICAgICAweDBjCisjZGVmaW5lIFNGX0w0ICAgICAweDEwCisjZGVmaW5lIFNGX0w1ICAgICAweDE0CisjZGVmaW5lIFNGX0w2ICAgICAweDE4CisjZGVmaW5lIFNGX0w3ICAgICAweDFjCisjZGVmaW5lIFNGX0kwICAgICAweDIwCisjZGVmaW5lIFNGX0kxICAgICAweDI0CisjZGVmaW5lIFNGX0kyICAgICAweDI4CisjZGVmaW5lIFNGX0kzICAgICAweDJjCisjZGVmaW5lIFNGX0k0ICAgICAweDMwCisjZGVmaW5lIFNGX0k1ICAgICAweDM0CisjZGVmaW5lIFNGX0ZQICAgICAweDM4CisjZGVmaW5lIFNGX1BDICAgICAweDNjCisjZGVmaW5lIFNGX1JFVFAgICAweDQwCisjZGVmaW5lIFNGX1hBUkcwICAweDQ0CisjZGVmaW5lIFNGX1hBUkcxICAweDQ4CisjZGVmaW5lIFNGX1hBUkcyICAweDRjCisjZGVmaW5lIFNGX1hBUkczICAweDUwCisjZGVmaW5lIFNGX1hBUkc0ICAweDU0CisjZGVmaW5lIFNGX1hBUkc1ICAweDU4CisjZGVmaW5lIFNGX1hYQVJHICAweDVjCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qIGdsb2JhbF9yZWdfc25hcHNob3Qgb2Zmc2V0cyAqLworI2RlZmluZSBHUl9TTkFQX1RTVEFURQkweDAwCisjZGVmaW5lIEdSX1NOQVBfVFBDCTB4MDgKKyNkZWZpbmUgR1JfU05BUF9UTlBDCTB4MTAKKyNkZWZpbmUgR1JfU05BUF9PNwkweDE4CisjZGVmaW5lIEdSX1NOQVBfSTcJMHgyMAorI2RlZmluZSBHUl9TTkFQX1JQQwkweDI4CisjZGVmaW5lIEdSX1NOQVBfVEhSRUFECTB4MzAKKyNkZWZpbmUgR1JfU05BUF9QQUQxCTB4MzgKKworI2VuZGlmICAvKiAgX19LRVJORUxfXyAgKi8KKworLyogU3R1ZmYgZm9yIHRoZSBwdHJhY2Ugc3lzdGVtIGNhbGwgKi8KKyNkZWZpbmUgUFRSQUNFX1NQQVJDX0RFVEFDSCAgICAgICAxMQorI2RlZmluZSBQVFJBQ0VfR0VUUkVHUyAgICAgICAgICAgIDEyCisjZGVmaW5lIFBUUkFDRV9TRVRSRUdTICAgICAgICAgICAgMTMKKyNkZWZpbmUgUFRSQUNFX0dFVEZQUkVHUyAgICAgICAgICAxNAorI2RlZmluZSBQVFJBQ0VfU0VURlBSRUdTICAgICAgICAgIDE1CisjZGVmaW5lIFBUUkFDRV9SRUFEREFUQSAgICAgICAgICAgMTYKKyNkZWZpbmUgUFRSQUNFX1dSSVRFREFUQSAgICAgICAgICAxNworI2RlZmluZSBQVFJBQ0VfUkVBRFRFWFQgICAgICAgICAgIDE4CisjZGVmaW5lIFBUUkFDRV9XUklURVRFWFQgICAgICAgICAgMTkKKyNkZWZpbmUgUFRSQUNFX0dFVEZQQVJFR1MgICAgICAgICAyMAorI2RlZmluZSBQVFJBQ0VfU0VURlBBUkVHUyAgICAgICAgIDIxCisKKy8qIFRoZXJlIGFyZSBmb3IgZGVidWdnaW5nIDY0LWJpdCBwcm9jZXNzZXMsIGVpdGhlciBmcm9tIGEgMzIgb3IgNjQgYml0CisgKiBwYXJlbnQuICBUaHVzIHRoZWlyIGNvbXBsZW1lbnRzIGFyZSBmb3IgZGVidWdnaW5nIDMyLWJpdCBwcm9jZXNzZXMgb25seS4KKyAqLworCisjZGVmaW5lIFBUUkFDRV9HRVRSRUdTNjQJICAyMgorI2RlZmluZSBQVFJBQ0VfU0VUUkVHUzY0CSAgMjMKKy8qIFBUUkFDRV9TWVNDQUxMIGlzIDI0ICovCisjZGVmaW5lIFBUUkFDRV9HRVRGUFJFR1M2NAkgIDI1CisjZGVmaW5lIFBUUkFDRV9TRVRGUFJFR1M2NAkgIDI2CisKKyNlbmRpZiAvKiAhKF9fU1BBUkNfUFRSQUNFX0gpICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3B0cmFjZV8zMi5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wdHJhY2VfMzIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNlZjQ1MC4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3B0cmFjZV8zMi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLSNpZm5kZWYgX1NQQVJDX1BUUkFDRV9ICi0jZGVmaW5lIF9TUEFSQ19QVFJBQ0VfSAotCi0jaW5jbHVkZSA8YXNtL3Bzci5oPgotCi0vKiBUaGlzIHN0cnVjdCBkZWZpbmVzIHRoZSB3YXkgdGhlIHJlZ2lzdGVycyBhcmUgc3RvcmVkIG9uIHRoZQotICogc3RhY2sgZHVyaW5nIGEgc3lzdGVtIGNhbGwgYW5kIGJhc2ljYWxseSBhbGwgdHJhcHMuCi0gKi8KLQotI2lmbmRlZiBfX0FTU0VNQkxZX18KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0KLXN0cnVjdCBwdF9yZWdzIHsKLQl1bnNpZ25lZCBsb25nIHBzcjsKLQl1bnNpZ25lZCBsb25nIHBjOwotCXVuc2lnbmVkIGxvbmcgbnBjOwotCXVuc2lnbmVkIGxvbmcgeTsKLQl1bnNpZ25lZCBsb25nIHVfcmVnc1sxNl07IC8qIGdsb2JhbHMgYW5kIGlucyAqLwotfTsKLQotI2RlZmluZSBVUkVHX0cwICAgICAgICAwCi0jZGVmaW5lIFVSRUdfRzEgICAgICAgIDEKLSNkZWZpbmUgVVJFR19HMiAgICAgICAgMgotI2RlZmluZSBVUkVHX0czICAgICAgICAzCi0jZGVmaW5lIFVSRUdfRzQgICAgICAgIDQKLSNkZWZpbmUgVVJFR19HNSAgICAgICAgNQotI2RlZmluZSBVUkVHX0c2ICAgICAgICA2Ci0jZGVmaW5lIFVSRUdfRzcgICAgICAgIDcKLSNkZWZpbmUgVVJFR19JMCAgICAgICAgOAotI2RlZmluZSBVUkVHX0kxICAgICAgICA5Ci0jZGVmaW5lIFVSRUdfSTIgICAgICAgIDEwCi0jZGVmaW5lIFVSRUdfSTMgICAgICAgIDExCi0jZGVmaW5lIFVSRUdfSTQgICAgICAgIDEyCi0jZGVmaW5lIFVSRUdfSTUgICAgICAgIDEzCi0jZGVmaW5lIFVSRUdfSTYgICAgICAgIDE0Ci0jZGVmaW5lIFVSRUdfSTcgICAgICAgIDE1Ci0jZGVmaW5lIFVSRUdfV0lNICAgICAgIFVSRUdfRzAKLSNkZWZpbmUgVVJFR19GQUREUiAgICAgVVJFR19HMAotI2RlZmluZSBVUkVHX0ZQICAgICAgICBVUkVHX0k2Ci0jZGVmaW5lIFVSRUdfUkVUUEMgICAgIFVSRUdfSTcKLQotLyogQSByZWdpc3RlciB3aW5kb3cgKi8KLXN0cnVjdCByZWdfd2luZG93IHsKLQl1bnNpZ25lZCBsb25nIGxvY2Fsc1s4XTsKLQl1bnNpZ25lZCBsb25nIGluc1s4XTsKLX07Ci0KLS8qIEEgU3BhcmMgc3RhY2sgZnJhbWUgKi8KLXN0cnVjdCBzcGFyY19zdGFja2YgewotCXVuc2lnbmVkIGxvbmcgbG9jYWxzWzhdOwotICAgICAgICB1bnNpZ25lZCBsb25nIGluc1s2XTsKLQlzdHJ1Y3Qgc3BhcmNfc3RhY2tmICpmcDsKLQl1bnNpZ25lZCBsb25nIGNhbGxlcnNfcGM7Ci0JY2hhciAqc3RydWN0cHRyOwotCXVuc2lnbmVkIGxvbmcgeGFyZ3NbNl07Ci0JdW5zaWduZWQgbG9uZyB4eGFyZ3NbMV07Ci19OwotCi0jZGVmaW5lIFRSQUNFUkVHX1NaICAgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKQotI2RlZmluZSBTVEFDS0ZSQU1FX1NaIHNpemVvZihzdHJ1Y3Qgc3BhcmNfc3RhY2tmKQotCi0jaWZkZWYgX19LRVJORUxfXwotCi0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotCi1zdGF0aWMgaW5saW5lIGJvb2wgcHRfcmVnc19pc19zeXNjYWxsKHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXJldHVybiAocmVncy0+cHNyICYgUFNSX1NZU0NBTEwpOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgcHRfcmVnc19jbGVhcl9zeXNjYWxsKHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXJldHVybiAocmVncy0+cHNyICY9IH5QU1JfU1lTQ0FMTCk7Ci19Ci0KLSNkZWZpbmUgYXJjaF9wdHJhY2Vfc3RvcF9uZWVkZWQoZXhpdF9jb2RlLCBpbmZvKSBcCi0oewlmbHVzaF91c2VyX3dpbmRvd3MoKTsgXAotCWN1cnJlbnRfdGhyZWFkX2luZm8oKS0+d19zYXZlZCAhPSAwOwlcCi19KQotCi0jZGVmaW5lIGFyY2hfcHRyYWNlX3N0b3AoZXhpdF9jb2RlLCBpbmZvKSBcCi0Jc3luY2hyb25pemVfdXNlcl9zdGFjaygpCi0KLSNkZWZpbmUgdXNlcl9tb2RlKHJlZ3MpICghKChyZWdzKS0+cHNyICYgUFNSX1BTKSkKLSNkZWZpbmUgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKSAoKHJlZ3MpLT5wYykKLSNkZWZpbmUgdXNlcl9zdGFja19wb2ludGVyKHJlZ3MpICgocmVncyktPnVfcmVnc1tVUkVHX0ZQXSkKLXVuc2lnbmVkIGxvbmcgcHJvZmlsZV9wYyhzdHJ1Y3QgcHRfcmVncyAqKTsKLWV4dGVybiB2b2lkIHNob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqKTsKLSNlbmRpZgotCi0jZWxzZSAvKiBfX0FTU0VNQkxZX18gKi8KLS8qIEZvciBhc3NlbWJseSBjb2RlLiAqLwotI2RlZmluZSBUUkFDRVJFR19TWiAgICAgICAweDUwCi0jZGVmaW5lIFNUQUNLRlJBTUVfU1ogICAgIDB4NjAKLSNlbmRpZgotCi0vKgotICogVGhlIGFzbS1vZmZzZXRzLmggaXMgYSBnZW5lcmF0ZWQgZmlsZSwgc28gd2UgY2Fubm90IGluY2x1ZGUgaXQuCi0gKiBJdCBtYXkgYmUgT0sgZm9yIGdsaWJjIGhlYWRlcnMsIGJ1dCBpdCdzIHV0dGVybHkgcG9pbnRsZXNzIGZvciBDIGNvZGUuCi0gKiBUaGUgYXNzZW1ibHkgY29kZSB1c2luZyB0aG9zZSBvZmZzZXRzIGhhcyB0byBpbmNsdWRlIGl0IGV4cGxpY2l0bHkuCi0gKi8KLS8qICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4gKi8KLQotLyogVGhlc2UgYXJlIGZvciBwdF9yZWdzLiAqLwotI2RlZmluZSBQVF9QU1IgICAgMHgwCi0jZGVmaW5lIFBUX1BDICAgICAweDQKLSNkZWZpbmUgUFRfTlBDICAgIDB4OAotI2RlZmluZSBQVF9ZICAgICAgMHhjCi0jZGVmaW5lIFBUX0cwICAgICAweDEwCi0jZGVmaW5lIFBUX1dJTSAgICBQVF9HMAotI2RlZmluZSBQVF9HMSAgICAgMHgxNAotI2RlZmluZSBQVF9HMiAgICAgMHgxOAotI2RlZmluZSBQVF9HMyAgICAgMHgxYwotI2RlZmluZSBQVF9HNCAgICAgMHgyMAotI2RlZmluZSBQVF9HNSAgICAgMHgyNAotI2RlZmluZSBQVF9HNiAgICAgMHgyOAotI2RlZmluZSBQVF9HNyAgICAgMHgyYwotI2RlZmluZSBQVF9JMCAgICAgMHgzMAotI2RlZmluZSBQVF9JMSAgICAgMHgzNAotI2RlZmluZSBQVF9JMiAgICAgMHgzOAotI2RlZmluZSBQVF9JMyAgICAgMHgzYwotI2RlZmluZSBQVF9JNCAgICAgMHg0MAotI2RlZmluZSBQVF9JNSAgICAgMHg0NAotI2RlZmluZSBQVF9JNiAgICAgMHg0OAotI2RlZmluZSBQVF9GUCAgICAgUFRfSTYKLSNkZWZpbmUgUFRfSTcgICAgIDB4NGMKLQotLyogUmVnX3dpbmRvdyBvZmZzZXRzICovCi0jZGVmaW5lIFJXX0wwICAgICAweDAwCi0jZGVmaW5lIFJXX0wxICAgICAweDA0Ci0jZGVmaW5lIFJXX0wyICAgICAweDA4Ci0jZGVmaW5lIFJXX0wzICAgICAweDBjCi0jZGVmaW5lIFJXX0w0ICAgICAweDEwCi0jZGVmaW5lIFJXX0w1ICAgICAweDE0Ci0jZGVmaW5lIFJXX0w2ICAgICAweDE4Ci0jZGVmaW5lIFJXX0w3ICAgICAweDFjCi0jZGVmaW5lIFJXX0kwICAgICAweDIwCi0jZGVmaW5lIFJXX0kxICAgICAweDI0Ci0jZGVmaW5lIFJXX0kyICAgICAweDI4Ci0jZGVmaW5lIFJXX0kzICAgICAweDJjCi0jZGVmaW5lIFJXX0k0ICAgICAweDMwCi0jZGVmaW5lIFJXX0k1ICAgICAweDM0Ci0jZGVmaW5lIFJXX0k2ICAgICAweDM4Ci0jZGVmaW5lIFJXX0k3ICAgICAweDNjCi0KLS8qIFN0YWNrX2ZyYW1lIG9mZnNldHMgKi8KLSNkZWZpbmUgU0ZfTDAgICAgIDB4MDAKLSNkZWZpbmUgU0ZfTDEgICAgIDB4MDQKLSNkZWZpbmUgU0ZfTDIgICAgIDB4MDgKLSNkZWZpbmUgU0ZfTDMgICAgIDB4MGMKLSNkZWZpbmUgU0ZfTDQgICAgIDB4MTAKLSNkZWZpbmUgU0ZfTDUgICAgIDB4MTQKLSNkZWZpbmUgU0ZfTDYgICAgIDB4MTgKLSNkZWZpbmUgU0ZfTDcgICAgIDB4MWMKLSNkZWZpbmUgU0ZfSTAgICAgIDB4MjAKLSNkZWZpbmUgU0ZfSTEgICAgIDB4MjQKLSNkZWZpbmUgU0ZfSTIgICAgIDB4MjgKLSNkZWZpbmUgU0ZfSTMgICAgIDB4MmMKLSNkZWZpbmUgU0ZfSTQgICAgIDB4MzAKLSNkZWZpbmUgU0ZfSTUgICAgIDB4MzQKLSNkZWZpbmUgU0ZfRlAgICAgIDB4MzgKLSNkZWZpbmUgU0ZfUEMgICAgIDB4M2MKLSNkZWZpbmUgU0ZfUkVUUCAgIDB4NDAKLSNkZWZpbmUgU0ZfWEFSRzAgIDB4NDQKLSNkZWZpbmUgU0ZfWEFSRzEgIDB4NDgKLSNkZWZpbmUgU0ZfWEFSRzIgIDB4NGMKLSNkZWZpbmUgU0ZfWEFSRzMgIDB4NTAKLSNkZWZpbmUgU0ZfWEFSRzQgIDB4NTQKLSNkZWZpbmUgU0ZfWEFSRzUgIDB4NTgKLSNkZWZpbmUgU0ZfWFhBUkcgIDB4NWMKLQotLyogU3R1ZmYgZm9yIHRoZSBwdHJhY2Ugc3lzdGVtIGNhbGwgKi8KLSNkZWZpbmUgUFRSQUNFX1NQQVJDX0RFVEFDSCAgICAgICAxMQotI2RlZmluZSBQVFJBQ0VfR0VUUkVHUyAgICAgICAgICAgIDEyCi0jZGVmaW5lIFBUUkFDRV9TRVRSRUdTICAgICAgICAgICAgMTMKLSNkZWZpbmUgUFRSQUNFX0dFVEZQUkVHUyAgICAgICAgICAxNAotI2RlZmluZSBQVFJBQ0VfU0VURlBSRUdTICAgICAgICAgIDE1Ci0jZGVmaW5lIFBUUkFDRV9SRUFEREFUQSAgICAgICAgICAgMTYKLSNkZWZpbmUgUFRSQUNFX1dSSVRFREFUQSAgICAgICAgICAxNwotI2RlZmluZSBQVFJBQ0VfUkVBRFRFWFQgICAgICAgICAgIDE4Ci0jZGVmaW5lIFBUUkFDRV9XUklURVRFWFQgICAgICAgICAgMTkKLSNkZWZpbmUgUFRSQUNFX0dFVEZQQVJFR1MgICAgICAgICAyMAotI2RlZmluZSBQVFJBQ0VfU0VURlBBUkVHUyAgICAgICAgIDIxCi0KLSNlbmRpZiAvKiAhKF9TUEFSQ19QVFJBQ0VfSCkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcHRyYWNlXzY0LmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3B0cmFjZV82NC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDZmYmZjLi4wMDAwMDAwCi0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcHRyYWNlXzY0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNTYgKzAsMCBAQAotI2lmbmRlZiBfU1BBUkM2NF9QVFJBQ0VfSAotI2RlZmluZSBfU1BBUkM2NF9QVFJBQ0VfSAotCi0jaW5jbHVkZSA8YXNtL3BzdGF0ZS5oPgotCi0vKiBUaGlzIHN0cnVjdCBkZWZpbmVzIHRoZSB3YXkgdGhlIHJlZ2lzdGVycyBhcmUgc3RvcmVkIG9uIHRoZQotICogc3RhY2sgZHVyaW5nIGEgc3lzdGVtIGNhbGwgYW5kIGJhc2ljYWxseSBhbGwgdHJhcHMuCi0gKi8KLQotLyogVGhpcyBtYWdpYyB2YWx1ZSBtdXN0IGhhdmUgdGhlIGxvdyA5IGJpdHMgY2xlYXIsCi0gKiBhcyB0aGF0IGlzIHdoZXJlIHdlIGVuY29kZSB0aGUgJXR0IHZhbHVlLCBzZWUgYmVsb3cuCi0gKi8KLSNkZWZpbmUgUFRfUkVHU19NQUdJQyAweDU3YWM2YzAwCi0KLSNpZm5kZWYgX19BU1NFTUJMWV9fCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotCi1zdHJ1Y3QgcHRfcmVncyB7Ci0JdW5zaWduZWQgbG9uZyB1X3JlZ3NbMTZdOyAvKiBnbG9iYWxzIGFuZCBpbnMgKi8KLQl1bnNpZ25lZCBsb25nIHRzdGF0ZTsKLQl1bnNpZ25lZCBsb25nIHRwYzsKLQl1bnNpZ25lZCBsb25nIHRucGM7Ci0JdW5zaWduZWQgaW50IHk7Ci0KLQkvKiBXZSBlbmNvZGUgYSBtYWdpYyBudW1iZXIsIFBUX1JFR1NfTUFHSUMsIGFsb25nCi0JICogd2l0aCB0aGUgJXR0ICh0cmFwIHR5cGUpIHJlZ2lzdGVyIHZhbHVlIGF0IHRyYXAKLQkgKiBlbnRyeSB0aW1lLiAgVGhlIG1hZ2ljIG51bWJlciBhbGxvd3MgdXMgdG8gaWRlbnRpZnkKLQkgKiBhY2N1cmF0ZWx5IGEgdHJhcCBzdGFjayBmcmFtZSBpbiB0aGUgc3RhY2sKLQkgKiB1bndpbmRlciwgYW5kIHRoZSAldHQgdmFsdWUgYWxsb3dzIHVzIHRvIHRlc3QKLQkgKiB0aGluZ3MgbGlrZSAiaW4gYSBzeXN0ZW0gY2FsbCIgZXRjLiBmb3IgYW4gYXJiaXRyYXkKLQkgKiBwcm9jZXNzLgotCSAqCi0JICogVGhlIFBUX1JFR1NfTUFHSUMgaXMgY2hvb3NlbiBzdWNoIHRoYXQgaXQgY2FuIGJlCi0JICogbG9hZGVkIGNvbXBsZXRlbHkgdXNpbmcganVzdCBhIHNldGhpIGluc3RydWN0aW9uLgotCSAqLwotCXVuc2lnbmVkIGludCBtYWdpYzsKLX07Ci0KLXN0cnVjdCBwdF9yZWdzMzIgewotCXVuc2lnbmVkIGludCBwc3I7Ci0JdW5zaWduZWQgaW50IHBjOwotCXVuc2lnbmVkIGludCBucGM7Ci0JdW5zaWduZWQgaW50IHk7Ci0JdW5zaWduZWQgaW50IHVfcmVnc1sxNl07IC8qIGdsb2JhbHMgYW5kIGlucyAqLwotfTsKLQotI2RlZmluZSBVUkVHX0cwICAgICAgICAwCi0jZGVmaW5lIFVSRUdfRzEgICAgICAgIDEKLSNkZWZpbmUgVVJFR19HMiAgICAgICAgMgotI2RlZmluZSBVUkVHX0czICAgICAgICAzCi0jZGVmaW5lIFVSRUdfRzQgICAgICAgIDQKLSNkZWZpbmUgVVJFR19HNSAgICAgICAgNQotI2RlZmluZSBVUkVHX0c2ICAgICAgICA2Ci0jZGVmaW5lIFVSRUdfRzcgICAgICAgIDcKLSNkZWZpbmUgVVJFR19JMCAgICAgICAgOAotI2RlZmluZSBVUkVHX0kxICAgICAgICA5Ci0jZGVmaW5lIFVSRUdfSTIgICAgICAgIDEwCi0jZGVmaW5lIFVSRUdfSTMgICAgICAgIDExCi0jZGVmaW5lIFVSRUdfSTQgICAgICAgIDEyCi0jZGVmaW5lIFVSRUdfSTUgICAgICAgIDEzCi0jZGVmaW5lIFVSRUdfSTYgICAgICAgIDE0Ci0jZGVmaW5lIFVSRUdfSTcgICAgICAgIDE1Ci0jZGVmaW5lIFVSRUdfRlAgICAgICAgIFVSRUdfSTYKLSNkZWZpbmUgVVJFR19SRVRQQyAgICAgVVJFR19JNwotCi0vKiBBIFY5IHJlZ2lzdGVyIHdpbmRvdyAqLwotc3RydWN0IHJlZ193aW5kb3cgewotCXVuc2lnbmVkIGxvbmcgbG9jYWxzWzhdOwotCXVuc2lnbmVkIGxvbmcgaW5zWzhdOwotfTsKLQotLyogQSAzMi1iaXQgcmVnaXN0ZXIgd2luZG93LiAqLwotc3RydWN0IHJlZ193aW5kb3czMiB7Ci0JdW5zaWduZWQgaW50IGxvY2Fsc1s4XTsKLQl1bnNpZ25lZCBpbnQgaW5zWzhdOwotfTsKLQotLyogQSBWOSBTcGFyYyBzdGFjayBmcmFtZSAqLwotc3RydWN0IHNwYXJjX3N0YWNrZiB7Ci0JdW5zaWduZWQgbG9uZyBsb2NhbHNbOF07Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgaW5zWzZdOwotCXN0cnVjdCBzcGFyY19zdGFja2YgKmZwOwotCXVuc2lnbmVkIGxvbmcgY2FsbGVyc19wYzsKLQljaGFyICpzdHJ1Y3RwdHI7Ci0JdW5zaWduZWQgbG9uZyB4YXJnc1s2XTsKLQl1bnNpZ25lZCBsb25nIHh4YXJnc1sxXTsKLX07Ci0KLS8qIEEgMzItYml0IFNwYXJjIHN0YWNrIGZyYW1lICovCi1zdHJ1Y3Qgc3BhcmNfc3RhY2tmMzIgewotCXVuc2lnbmVkIGludCBsb2NhbHNbOF07Ci0gICAgICAgIHVuc2lnbmVkIGludCBpbnNbNl07Ci0JdW5zaWduZWQgaW50IGZwOwotCXVuc2lnbmVkIGludCBjYWxsZXJzX3BjOwotCXVuc2lnbmVkIGludCBzdHJ1Y3RwdHI7Ci0JdW5zaWduZWQgaW50IHhhcmdzWzZdOwotCXVuc2lnbmVkIGludCB4eGFyZ3NbMV07Ci19OwotCi1zdHJ1Y3Qgc3BhcmNfdHJhcGYgewotCXVuc2lnbmVkIGxvbmcgbG9jYWxzWzhdOwotCXVuc2lnbmVkIGxvbmcgaW5zWzhdOwotCXVuc2lnbmVkIGxvbmcgX3VudXNlZDsKLQlzdHJ1Y3QgcHRfcmVncyAqcmVnczsKLX07Ci0KLSNkZWZpbmUgVFJBQ0VSRUdfU1oJc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKQotI2RlZmluZSBTVEFDS0ZSQU1FX1NaCXNpemVvZihzdHJ1Y3Qgc3BhcmNfc3RhY2tmKQotCi0jZGVmaW5lIFRSQUNFUkVHMzJfU1oJc2l6ZW9mKHN0cnVjdCBwdF9yZWdzMzIpCi0jZGVmaW5lIFNUQUNLRlJBTUUzMl9TWglzaXplb2Yoc3RydWN0IHNwYXJjX3N0YWNrZjMyKQotCi0jaWZkZWYgX19LRVJORUxfXwotCi0jaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLQotc3RhdGljIGlubGluZSBpbnQgcHRfcmVnc190cmFwX3R5cGUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JcmV0dXJuIHJlZ3MtPm1hZ2ljICYgMHgxZmY7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBwdF9yZWdzX2lzX3N5c2NhbGwoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JcmV0dXJuIChyZWdzLT50c3RhdGUgJiBUU1RBVEVfU1lTQ0FMTCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBwdF9yZWdzX2NsZWFyX3N5c2NhbGwoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JcmV0dXJuIChyZWdzLT50c3RhdGUgJj0gflRTVEFURV9TWVNDQUxMKTsKLX0KLQotI2RlZmluZSBhcmNoX3B0cmFjZV9zdG9wX25lZWRlZChleGl0X2NvZGUsIGluZm8pIFwKLSh7CWZsdXNoX3VzZXJfd2luZG93cygpOyBcCi0JZ2V0X3RocmVhZF93c2F2ZWQoKSAhPSAwOyBcCi19KQotCi0jZGVmaW5lIGFyY2hfcHRyYWNlX3N0b3AoZXhpdF9jb2RlLCBpbmZvKSBcCi0Jc3luY2hyb25pemVfdXNlcl9zdGFjaygpCi0KLXN0cnVjdCBnbG9iYWxfcmVnX3NuYXBzaG90IHsKLQl1bnNpZ25lZCBsb25nCQl0c3RhdGU7Ci0JdW5zaWduZWQgbG9uZwkJdHBjOwotCXVuc2lnbmVkIGxvbmcJCXRucGM7Ci0JdW5zaWduZWQgbG9uZwkJbzc7Ci0JdW5zaWduZWQgbG9uZwkJaTc7Ci0JdW5zaWduZWQgbG9uZwkJcnBjOwotCXN0cnVjdCB0aHJlYWRfaW5mbwkqdGhyZWFkOwotCXVuc2lnbmVkIGxvbmcJCXBhZDE7Ci19OwotZXh0ZXJuIHN0cnVjdCBnbG9iYWxfcmVnX3NuYXBzaG90IGdsb2JhbF9yZWdfc25hcHNob3RbTlJfQ1BVU107Ci0KLSNkZWZpbmUgZm9yY2Vfc3VjY2Vzc2Z1bF9zeXNjYWxsX3JldHVybigpCSAgICBcCi1kbyB7CWN1cnJlbnRfdGhyZWFkX2luZm8oKS0+c3lzY2FsbF9ub2Vycm9yID0gMTsgXAotfSB3aGlsZSAoMCkKLSNkZWZpbmUgdXNlcl9tb2RlKHJlZ3MpICghKChyZWdzKS0+dHN0YXRlICYgVFNUQVRFX1BSSVYpKQotI2RlZmluZSBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpICgocmVncyktPnRwYykKLSNkZWZpbmUgdXNlcl9zdGFja19wb2ludGVyKHJlZ3MpICgocmVncyktPnVfcmVnc1tVUkVHX0ZQXSkKLSNkZWZpbmUgcmVnc19yZXR1cm5fdmFsdWUocmVncykgKChyZWdzKS0+dV9yZWdzW1VSRUdfSTBdKQotI2lmZGVmIENPTkZJR19TTVAKLWV4dGVybiB1bnNpZ25lZCBsb25nIHByb2ZpbGVfcGMoc3RydWN0IHB0X3JlZ3MgKik7Ci0jZWxzZQotI2RlZmluZSBwcm9maWxlX3BjKHJlZ3MpIGluc3RydWN0aW9uX3BvaW50ZXIocmVncykKLSNlbmRpZgotZXh0ZXJuIHZvaWQgc2hvd19yZWdzKHN0cnVjdCBwdF9yZWdzICopOwotI2VuZGlmCi0KLSNlbHNlIC8qIF9fQVNTRU1CTFlfXyAqLwotLyogRm9yIGFzc2VtYmx5IGNvZGUuICovCi0jZGVmaW5lIFRSQUNFUkVHX1NaCQkweGEwCi0jZGVmaW5lIFNUQUNLRlJBTUVfU1oJCTB4YzAKLQotI2RlZmluZSBUUkFDRVJFRzMyX1NaCQkweDUwCi0jZGVmaW5lIFNUQUNLRlJBTUUzMl9TWgkJMHg2MAotI2VuZGlmCi0KLSNpZmRlZiBfX0tFUk5FTF9fCi0jZGVmaW5lIFNUQUNLX0JJQVMJCTIwNDcKLSNlbmRpZgotCi0vKiBUaGVzZSBhcmUgZm9yIHB0X3JlZ3MuICovCi0jZGVmaW5lIFBUX1Y5X0cwICAgICAweDAwCi0jZGVmaW5lIFBUX1Y5X0cxICAgICAweDA4Ci0jZGVmaW5lIFBUX1Y5X0cyICAgICAweDEwCi0jZGVmaW5lIFBUX1Y5X0czICAgICAweDE4Ci0jZGVmaW5lIFBUX1Y5X0c0ICAgICAweDIwCi0jZGVmaW5lIFBUX1Y5X0c1ICAgICAweDI4Ci0jZGVmaW5lIFBUX1Y5X0c2ICAgICAweDMwCi0jZGVmaW5lIFBUX1Y5X0c3ICAgICAweDM4Ci0jZGVmaW5lIFBUX1Y5X0kwICAgICAweDQwCi0jZGVmaW5lIFBUX1Y5X0kxICAgICAweDQ4Ci0jZGVmaW5lIFBUX1Y5X0kyICAgICAweDUwCi0jZGVmaW5lIFBUX1Y5X0kzICAgICAweDU4Ci0jZGVmaW5lIFBUX1Y5X0k0ICAgICAweDYwCi0jZGVmaW5lIFBUX1Y5X0k1ICAgICAweDY4Ci0jZGVmaW5lIFBUX1Y5X0k2ICAgICAweDcwCi0jZGVmaW5lIFBUX1Y5X0ZQICAgICBQVF9WOV9JNgotI2RlZmluZSBQVF9WOV9JNyAgICAgMHg3OAotI2RlZmluZSBQVF9WOV9UU1RBVEUgMHg4MAotI2RlZmluZSBQVF9WOV9UUEMgICAgMHg4OAotI2RlZmluZSBQVF9WOV9UTlBDICAgMHg5MAotI2RlZmluZSBQVF9WOV9ZICAgICAgMHg5OAotI2RlZmluZSBQVF9WOV9NQUdJQyAgMHg5YwotI2RlZmluZSBQVF9UU1RBVEUJUFRfVjlfVFNUQVRFCi0jZGVmaW5lIFBUX1RQQwkJUFRfVjlfVFBDCi0jZGVmaW5lIFBUX1ROUEMJCVBUX1Y5X1ROUEMKLQotLyogVGhlc2UgZm9yIHB0X3JlZ3MzMi4gKi8KLSNkZWZpbmUgUFRfUFNSICAgIDB4MAotI2RlZmluZSBQVF9QQyAgICAgMHg0Ci0jZGVmaW5lIFBUX05QQyAgICAweDgKLSNkZWZpbmUgUFRfWSAgICAgIDB4YwotI2RlZmluZSBQVF9HMCAgICAgMHgxMAotI2RlZmluZSBQVF9XSU0gICAgUFRfRzAKLSNkZWZpbmUgUFRfRzEgICAgIDB4MTQKLSNkZWZpbmUgUFRfRzIgICAgIDB4MTgKLSNkZWZpbmUgUFRfRzMgICAgIDB4MWMKLSNkZWZpbmUgUFRfRzQgICAgIDB4MjAKLSNkZWZpbmUgUFRfRzUgICAgIDB4MjQKLSNkZWZpbmUgUFRfRzYgICAgIDB4MjgKLSNkZWZpbmUgUFRfRzcgICAgIDB4MmMKLSNkZWZpbmUgUFRfSTAgICAgIDB4MzAKLSNkZWZpbmUgUFRfSTEgICAgIDB4MzQKLSNkZWZpbmUgUFRfSTIgICAgIDB4MzgKLSNkZWZpbmUgUFRfSTMgICAgIDB4M2MKLSNkZWZpbmUgUFRfSTQgICAgIDB4NDAKLSNkZWZpbmUgUFRfSTUgICAgIDB4NDQKLSNkZWZpbmUgUFRfSTYgICAgIDB4NDgKLSNkZWZpbmUgUFRfRlAgICAgIFBUX0k2Ci0jZGVmaW5lIFBUX0k3ICAgICAweDRjCi0KLS8qIFJlZ193aW5kb3cgb2Zmc2V0cyAqLwotI2RlZmluZSBSV19WOV9MMCAgICAgMHgwMAotI2RlZmluZSBSV19WOV9MMSAgICAgMHgwOAotI2RlZmluZSBSV19WOV9MMiAgICAgMHgxMAotI2RlZmluZSBSV19WOV9MMyAgICAgMHgxOAotI2RlZmluZSBSV19WOV9MNCAgICAgMHgyMAotI2RlZmluZSBSV19WOV9MNSAgICAgMHgyOAotI2RlZmluZSBSV19WOV9MNiAgICAgMHgzMAotI2RlZmluZSBSV19WOV9MNyAgICAgMHgzOAotI2RlZmluZSBSV19WOV9JMCAgICAgMHg0MAotI2RlZmluZSBSV19WOV9JMSAgICAgMHg0OAotI2RlZmluZSBSV19WOV9JMiAgICAgMHg1MAotI2RlZmluZSBSV19WOV9JMyAgICAgMHg1OAotI2RlZmluZSBSV19WOV9JNCAgICAgMHg2MAotI2RlZmluZSBSV19WOV9JNSAgICAgMHg2OAotI2RlZmluZSBSV19WOV9JNiAgICAgMHg3MAotI2RlZmluZSBSV19WOV9JNyAgICAgMHg3OAotCi0jZGVmaW5lIFJXX0wwICAgICAweDAwCi0jZGVmaW5lIFJXX0wxICAgICAweDA0Ci0jZGVmaW5lIFJXX0wyICAgICAweDA4Ci0jZGVmaW5lIFJXX0wzICAgICAweDBjCi0jZGVmaW5lIFJXX0w0ICAgICAweDEwCi0jZGVmaW5lIFJXX0w1ICAgICAweDE0Ci0jZGVmaW5lIFJXX0w2ICAgICAweDE4Ci0jZGVmaW5lIFJXX0w3ICAgICAweDFjCi0jZGVmaW5lIFJXX0kwICAgICAweDIwCi0jZGVmaW5lIFJXX0kxICAgICAweDI0Ci0jZGVmaW5lIFJXX0kyICAgICAweDI4Ci0jZGVmaW5lIFJXX0kzICAgICAweDJjCi0jZGVmaW5lIFJXX0k0ICAgICAweDMwCi0jZGVmaW5lIFJXX0k1ICAgICAweDM0Ci0jZGVmaW5lIFJXX0k2ICAgICAweDM4Ci0jZGVmaW5lIFJXX0k3ICAgICAweDNjCi0KLS8qIFN0YWNrX2ZyYW1lIG9mZnNldHMgKi8KLSNkZWZpbmUgU0ZfVjlfTDAgICAgIDB4MDAKLSNkZWZpbmUgU0ZfVjlfTDEgICAgIDB4MDgKLSNkZWZpbmUgU0ZfVjlfTDIgICAgIDB4MTAKLSNkZWZpbmUgU0ZfVjlfTDMgICAgIDB4MTgKLSNkZWZpbmUgU0ZfVjlfTDQgICAgIDB4MjAKLSNkZWZpbmUgU0ZfVjlfTDUgICAgIDB4MjgKLSNkZWZpbmUgU0ZfVjlfTDYgICAgIDB4MzAKLSNkZWZpbmUgU0ZfVjlfTDcgICAgIDB4MzgKLSNkZWZpbmUgU0ZfVjlfSTAgICAgIDB4NDAKLSNkZWZpbmUgU0ZfVjlfSTEgICAgIDB4NDgKLSNkZWZpbmUgU0ZfVjlfSTIgICAgIDB4NTAKLSNkZWZpbmUgU0ZfVjlfSTMgICAgIDB4NTgKLSNkZWZpbmUgU0ZfVjlfSTQgICAgIDB4NjAKLSNkZWZpbmUgU0ZfVjlfSTUgICAgIDB4NjgKLSNkZWZpbmUgU0ZfVjlfRlAgICAgIDB4NzAKLSNkZWZpbmUgU0ZfVjlfUEMgICAgIDB4NzgKLSNkZWZpbmUgU0ZfVjlfUkVUUCAgIDB4ODAKLSNkZWZpbmUgU0ZfVjlfWEFSRzAgIDB4ODgKLSNkZWZpbmUgU0ZfVjlfWEFSRzEgIDB4OTAKLSNkZWZpbmUgU0ZfVjlfWEFSRzIgIDB4OTgKLSNkZWZpbmUgU0ZfVjlfWEFSRzMgIDB4YTAKLSNkZWZpbmUgU0ZfVjlfWEFSRzQgIDB4YTgKLSNkZWZpbmUgU0ZfVjlfWEFSRzUgIDB4YjAKLSNkZWZpbmUgU0ZfVjlfWFhBUkcgIDB4YjgKLQotI2RlZmluZSBTRl9MMCAgICAgMHgwMAotI2RlZmluZSBTRl9MMSAgICAgMHgwNAotI2RlZmluZSBTRl9MMiAgICAgMHgwOAotI2RlZmluZSBTRl9MMyAgICAgMHgwYwotI2RlZmluZSBTRl9MNCAgICAgMHgxMAotI2RlZmluZSBTRl9MNSAgICAgMHgxNAotI2RlZmluZSBTRl9MNiAgICAgMHgxOAotI2RlZmluZSBTRl9MNyAgICAgMHgxYwotI2RlZmluZSBTRl9JMCAgICAgMHgyMAotI2RlZmluZSBTRl9JMSAgICAgMHgyNAotI2RlZmluZSBTRl9JMiAgICAgMHgyOAotI2RlZmluZSBTRl9JMyAgICAgMHgyYwotI2RlZmluZSBTRl9JNCAgICAgMHgzMAotI2RlZmluZSBTRl9JNSAgICAgMHgzNAotI2RlZmluZSBTRl9GUCAgICAgMHgzOAotI2RlZmluZSBTRl9QQyAgICAgMHgzYwotI2RlZmluZSBTRl9SRVRQICAgMHg0MAotI2RlZmluZSBTRl9YQVJHMCAgMHg0NAotI2RlZmluZSBTRl9YQVJHMSAgMHg0OAotI2RlZmluZSBTRl9YQVJHMiAgMHg0YwotI2RlZmluZSBTRl9YQVJHMyAgMHg1MAotI2RlZmluZSBTRl9YQVJHNCAgMHg1NAotI2RlZmluZSBTRl9YQVJHNSAgMHg1OAotI2RlZmluZSBTRl9YWEFSRyAgMHg1YwotCi0jaWZkZWYgX19LRVJORUxfXwotCi0vKiBnbG9iYWxfcmVnX3NuYXBzaG90IG9mZnNldHMgKi8KLSNkZWZpbmUgR1JfU05BUF9UU1RBVEUJMHgwMAotI2RlZmluZSBHUl9TTkFQX1RQQwkweDA4Ci0jZGVmaW5lIEdSX1NOQVBfVE5QQwkweDEwCi0jZGVmaW5lIEdSX1NOQVBfTzcJMHgxOAotI2RlZmluZSBHUl9TTkFQX0k3CTB4MjAKLSNkZWZpbmUgR1JfU05BUF9SUEMJMHgyOAotI2RlZmluZSBHUl9TTkFQX1RIUkVBRAkweDMwCi0jZGVmaW5lIEdSX1NOQVBfUEFEMQkweDM4Ci0KLSNlbmRpZiAgLyogIF9fS0VSTkVMX18gICovCi0KLS8qIFN0dWZmIGZvciB0aGUgcHRyYWNlIHN5c3RlbSBjYWxsICovCi0jZGVmaW5lIFBUUkFDRV9TUEFSQ19ERVRBQ0ggICAgICAgMTEKLSNkZWZpbmUgUFRSQUNFX0dFVFJFR1MgICAgICAgICAgICAxMgotI2RlZmluZSBQVFJBQ0VfU0VUUkVHUyAgICAgICAgICAgIDEzCi0jZGVmaW5lIFBUUkFDRV9HRVRGUFJFR1MgICAgICAgICAgMTQKLSNkZWZpbmUgUFRSQUNFX1NFVEZQUkVHUyAgICAgICAgICAxNQotI2RlZmluZSBQVFJBQ0VfUkVBRERBVEEgICAgICAgICAgIDE2Ci0jZGVmaW5lIFBUUkFDRV9XUklURURBVEEgICAgICAgICAgMTcKLSNkZWZpbmUgUFRSQUNFX1JFQURURVhUICAgICAgICAgICAxOAotI2RlZmluZSBQVFJBQ0VfV1JJVEVURVhUICAgICAgICAgIDE5Ci0jZGVmaW5lIFBUUkFDRV9HRVRGUEFSRUdTICAgICAgICAgMjAKLSNkZWZpbmUgUFRSQUNFX1NFVEZQQVJFR1MgICAgICAgICAyMQotCi0vKiBUaGVyZSBhcmUgZm9yIGRlYnVnZ2luZyA2NC1iaXQgcHJvY2Vzc2VzLCBlaXRoZXIgZnJvbSBhIDMyIG9yIDY0IGJpdAotICogcGFyZW50LiAgVGh1cyB0aGVpciBjb21wbGVtZW50cyBhcmUgZm9yIGRlYnVnZ2luZyAzMi1iaXQgcHJvY2Vzc2VzIG9ubHkuCi0gKi8KLQotI2RlZmluZSBQVFJBQ0VfR0VUUkVHUzY0CSAgMjIKLSNkZWZpbmUgUFRSQUNFX1NFVFJFR1M2NAkgIDIzCi0vKiBQVFJBQ0VfU1lTQ0FMTCBpcyAyNCAqLwotI2RlZmluZSBQVFJBQ0VfR0VURlBSRUdTNjQJICAyNQotI2RlZmluZSBQVFJBQ0VfU0VURlBSRUdTNjQJICAyNgotCi0jZW5kaWYgLyogIShfU1BBUkM2NF9QVFJBQ0VfSCkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcmVnLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3JlZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzE2ZTE5Li4wMDAwMDAwCi0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcmVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNpZm5kZWYgX19fQVNNX1NQQVJDX1JFR19ICi0jZGVmaW5lIF9fX0FTTV9TUEFSQ19SRUdfSAotI2lmIGRlZmluZWQoX19zcGFyY19fKSAmJiBkZWZpbmVkKF9fYXJjaDY0X18pCi0jaW5jbHVkZSA8YXNtL3JlZ182NC5oPgotI2Vsc2UKLSNpbmNsdWRlIDxhc20vcmVnXzMyLmg+Ci0jZW5kaWYKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9yZWdfMzIuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcmVnXzMyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZmIwNTYuLjAwMDAwMDAKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9yZWdfMzIuaAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiBsaW51eC9pbmNsdWRlL2FzbS9yZWcuaAotICogTGF5b3V0IG9mIHRoZSByZWdpc3RlcnMgYXMgZXhwZWN0ZWQgYnkgZ2RiIG9uIHRoZSBTcGFyYwotICogd2Ugc2hvdWxkIHJlcGxhY2UgdGhlIHVzZXIuaCBkZWZpbml0aW9ucyB3aXRoIHRob3NlIGluCi0gKiB0aGlzIGZpbGUsIHdlIGRvbid0IGV2ZW4gdXNlIHRoZSBvdGhlcgotICogLW1pZ3VlbAotICoKLSAqIFRoZSBuYW1lcyBvZiB0aGUgc3RydWN0dXJlcywgY29uc3RhbnRzIGFuZCBhbGlhc2VzIGluIHRoaXMgZmlsZQotICogaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgc3Vub3Mgb25lcywgc29tZSBwcm9ncmFtcyByZWx5IG9uIHRoZXNlCi0gKiBuYW1lcyAoZ2RiIGZvciBleGFtcGxlKS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfX1NQQVJDX1JFR19ICi0jZGVmaW5lIF9fU1BBUkNfUkVHX0gKLQotc3RydWN0IHJlZ3MgewotCWludCAgICAgcl9wc3I7Ci0jZGVmaW5lIHJfcHMgcl9wc3IKLSAgICAgICAgaW50ICAgICByX3BjOwotICAgICAgICBpbnQgICAgIHJfbnBjOwotICAgICAgICBpbnQgICAgIHJfeTsKLSAgICAgICAgaW50ICAgICByX2cxOwotICAgICAgICBpbnQgICAgIHJfZzI7Ci0gICAgICAgIGludCAgICAgcl9nMzsKLSAgICAgICAgaW50ICAgICByX2c0OwotICAgICAgICBpbnQgICAgIHJfZzU7Ci0gICAgICAgIGludCAgICAgcl9nNjsKLSAgICAgICAgaW50ICAgICByX2c3OwotICAgICAgICBpbnQgICAgIHJfbzA7Ci0gICAgICAgIGludCAgICAgcl9vMTsKLSAgICAgICAgaW50ICAgICByX28yOwotICAgICAgICBpbnQgICAgIHJfbzM7Ci0gICAgICAgIGludCAgICAgcl9vNDsKLSAgICAgICAgaW50ICAgICByX281OwotICAgICAgICBpbnQgICAgIHJfbzY7Ci0gICAgICAgIGludCAgICAgcl9vNzsKLX07Ci0KLXN0cnVjdCBmcHEgewotICAgICAgICB1bnNpZ25lZCBsb25nICphZGRyOwotICAgICAgICB1bnNpZ25lZCBsb25nIGluc3RyOwotfTsKLQotc3RydWN0ICBmcSB7Ci0gICAgICAgIHVuaW9uIHsKLSAgICAgICAgICAgICAgICBkb3VibGUgIHdob2xlOwotICAgICAgICAgICAgICAgIHN0cnVjdCAgZnBxIGZwcTsKLSAgICAgICAgfSBGUXU7Ci19OwotCi0jZGVmaW5lIEZQVV9SRUdTX1RZUEUgdW5zaWduZWQgaW50Ci0jZGVmaW5lIEZQVV9GU1JfVFlQRSB1bnNpZ25lZAotCi1zdHJ1Y3QgZnBfc3RhdHVzIHsKLSAgICAgICAgdW5pb24gewotICAgICAgICAgICAgICAgIEZQVV9SRUdTX1RZUEUgRnB1X3JlZ3NbMzJdOwotICAgICAgICAgICAgICAgIGRvdWJsZSAgRnB1X2RyZWdzWzE2XTsKLSAgICAgICAgfSBmcHVfZnI7Ci0gICAgICAgIEZQVV9GU1JfVFlQRSBGcHVfZnNyOwotICAgICAgICB1bnNpZ25lZCBGcHVfZmxhZ3M7Ci0gICAgICAgIHVuc2lnbmVkIEZwdV9leHRyYTsKLSAgICAgICAgdW5zaWduZWQgRnB1X3FjbnQ7Ci0gICAgICAgIHN0cnVjdCBmcSBGcHVfcVsxNl07Ci19OwotCi0jZGVmaW5lIGZwdV9yZWdzICBmX2Zwc3RhdHVzLmZwdV9mci5GcHVfcmVncwotI2RlZmluZSBmcHVfZHJlZ3MgZl9mcHN0YXR1cy5mcHVfZnIuRnB1X2RyZWdzCi0jZGVmaW5lIGZwdV9mc3IgICBmX2Zwc3RhdHVzLkZwdV9mc3IKLSNkZWZpbmUgZnB1X2ZsYWdzIGZfZnBzdGF0dXMuRnB1X2ZsYWdzCi0jZGVmaW5lIGZwdV9leHRyYSBmX2Zwc3RhdHVzLkZwdV9leHRyYQotI2RlZmluZSBmcHVfcSAgICAgZl9mcHN0YXR1cy5GcHVfcQotI2RlZmluZSBmcHVfcWNudCAgZl9mcHN0YXR1cy5GcHVfcWNudAotCi1zdHJ1Y3QgZnB1IHsKLSAgICAgICAgc3RydWN0IGZwX3N0YXR1cyBmX2Zwc3RhdHVzOwotfTsKLQotI2VuZGlmIC8qIF9fU1BBUkNfUkVHX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcmVnXzY0LmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3JlZ182NC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjI3N2Q3Li4wMDAwMDAwCi0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcmVnXzY0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogbGludXgvYXNtL3JlZy5oCi0gKiBMYXlvdXQgb2YgdGhlIHJlZ2lzdGVycyBhcyBleHBlY3RlZCBieSBnZGIgb24gdGhlIFNwYXJjCi0gKiB3ZSBzaG91bGQgcmVwbGFjZSB0aGUgdXNlci5oIGRlZmluaXRpb25zIHdpdGggdGhvc2UgaW4KLSAqIHRoaXMgZmlsZSwgd2UgZG9uJ3QgZXZlbiB1c2UgdGhlIG90aGVyCi0gKiAtbWlndWVsCi0gKgotICogVGhlIG5hbWVzIG9mIHRoZSBzdHJ1Y3R1cmVzLCBjb25zdGFudHMgYW5kIGFsaWFzZXMgaW4gdGhpcyBmaWxlCi0gKiBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBzdW5vcyBvbmVzLCBzb21lIHByb2dyYW1zIHJlbHkgb24gdGhlc2UKLSAqIG5hbWVzIChnZGIgZm9yIGV4YW1wbGUpLgotICoKLSAqLwotCi0jaWZuZGVmIF9fU1BBUkM2NF9SRUdfSAotI2RlZmluZSBfX1NQQVJDNjRfUkVHX0gKLQotc3RydWN0IHJlZ3MgewotICAgICAgICB1bnNpZ25lZCBsb25nIHJfZzE7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgcl9nMjsKLSAgICAgICAgdW5zaWduZWQgbG9uZyByX2czOwotICAgICAgICB1bnNpZ25lZCBsb25nIHJfZzQ7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgcl9nNTsKLSAgICAgICAgdW5zaWduZWQgbG9uZyByX2c2OwotICAgICAgICB1bnNpZ25lZCBsb25nIHJfZzc7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgcl9vMDsKLSAgICAgICAgdW5zaWduZWQgbG9uZyByX28xOwotICAgICAgICB1bnNpZ25lZCBsb25nIHJfbzI7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgcl9vMzsKLSAgICAgICAgdW5zaWduZWQgbG9uZyByX280OwotICAgICAgICB1bnNpZ25lZCBsb25nIHJfbzU7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgcl9vNjsKLSAgICAgICAgdW5zaWduZWQgbG9uZyByX283OwotICAgICAgICB1bnNpZ25lZCBsb25nIF9fcGFkOwotICAgICAgICB1bnNpZ25lZCBsb25nIHJfdHN0YXRlOwotICAgICAgICB1bnNpZ25lZCBsb25nIHJfdHBjOwotICAgICAgICB1bnNpZ25lZCBsb25nIHJfdG5wYzsKLSAgICAgICAgdW5zaWduZWQgaW50ICByX3k7Ci0gICAgICAgIHVuc2lnbmVkIGludCAgcl9mcHJzOwotfTsKLQotI2RlZmluZSBGUFVfUkVHU19UWVBFIHVuc2lnbmVkIGludAotI2RlZmluZSBGUFVfRlNSX1RZUEUgdW5zaWduZWQgbG9uZwotCi1zdHJ1Y3QgZnBfc3RhdHVzIHsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBmcHVfZnJbMzJdOwotICAgICAgICB1bnNpZ25lZCBsb25nIEZwdV9mc3I7Ci19OwotCi1zdHJ1Y3QgZnB1IHsKLQlzdHJ1Y3QgZnBfc3RhdHVzIGZfZnBzdGF0dXM7Ci19OwotCi0jZGVmaW5lIGZwdV9yZWdzICBmX2Zwc3RhdHVzLmZwdV9mcgotI2RlZmluZSBmcHVfZnNyICAgZl9mcHN0YXR1cy5GcHVfZnNyCi0KLSNlbmRpZiAvKiBfX1NQQVJDNjRfUkVHX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc2lnY29udGV4dC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zaWdjb250ZXh0LmgKaW5kZXggZTkyZGU3ZS4uYTE2MDdkMSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zaWdjb250ZXh0LmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zaWdjb250ZXh0LmgKQEAgLTEsOCArMSw5NiBAQAotI2lmbmRlZiBfX19BU01fU1BBUkNfU0lHQ09OVEVYVF9ICi0jZGVmaW5lIF9fX0FTTV9TUEFSQ19TSUdDT05URVhUX0gKLSNpZiBkZWZpbmVkKF9fc3BhcmNfXykgJiYgZGVmaW5lZChfX2FyY2g2NF9fKQotI2luY2x1ZGUgPGFzbS9zaWdjb250ZXh0XzY0Lmg+CisjaWZuZGVmIF9fU1BBUkNfU0lHQ09OVEVYVF9ICisjZGVmaW5lIF9fU1BBUkNfU0lHQ09OVEVYVF9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisjZGVmaW5lIF9fU1VOT1NfTUFYV0lOICAgMzEKKworLyogVGhpcyBpcyB3aGF0IFN1bk9TIGRvZXMsIHNvIHNoYWxsIEkgdW5sZXNzIHdlIHVzZSBuZXcgMzJiaXQgc2lnbmFscyBvciBydCBzaWduYWxzLiAqLworc3RydWN0IHNpZ2NvbnRleHQzMiB7CisJaW50IHNpZ2Nfb25zdGFjazsgICAgICAvKiBzdGF0ZSB0byByZXN0b3JlICovCisJaW50IHNpZ2NfbWFzazsgICAgICAgICAvKiBzaWdtYXNrIHRvIHJlc3RvcmUgKi8KKwlpbnQgc2lnY19zcDsgICAgICAgICAgIC8qIHN0YWNrIHBvaW50ZXIgKi8KKwlpbnQgc2lnY19wYzsgICAgICAgICAgIC8qIHByb2dyYW0gY291bnRlciAqLworCWludCBzaWdjX25wYzsgICAgICAgICAgLyogbmV4dCBwcm9ncmFtIGNvdW50ZXIgKi8KKwlpbnQgc2lnY19wc3I7ICAgICAgICAgIC8qIGZvciBjb25kaXRpb24gY29kZXMgZXRjICovCisJaW50IHNpZ2NfZzE7ICAgICAgICAgICAvKiBVc2VyIHVzZXMgdGhlc2UgdHdvIHJlZ2lzdGVycyAqLworCWludCBzaWdjX28wOyAgICAgICAgICAgLyogd2l0aGluIHRoZSB0cmFtcG9saW5lIGNvZGUuICovCisKKwkvKiBOb3cgY29tZXMgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSB1c2VycyB3aW5kb3cgc2V0CisJICogYXQgdGhlIHRpbWUgb2YgdGhlIHNpZ25hbC4KKwkgKi8KKwlpbnQgc2lnY19vc3dpbnM7ICAgICAgIC8qIG91dHN0YW5kaW5nIHdpbmRvd3MgKi8KKworCS8qIHN0YWNrIHB0cnMgZm9yIGVhY2ggcmVnd2luIGJ1ZiAqLworCXVuc2lnbmVkIHNpZ2Nfc3BidWZbX19TVU5PU19NQVhXSU5dOworCisJLyogV2luZG93cyB0byByZXN0b3JlIGFmdGVyIHNpZ25hbCAqLworCXN0cnVjdCByZWdfd2luZG93MzIgc2lnY193YnVmW19fU1VOT1NfTUFYV0lOXTsKK307CisKKworLyogVGhpcyBpcyB3aGF0IHdlIHVzZSBmb3IgMzJiaXQgbmV3IG5vbi1ydCBzaWduYWxzLiAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgaW50IHBzcjsKKwkJdW5zaWduZWQgaW50IHBjOworCQl1bnNpZ25lZCBpbnQgbnBjOworCQl1bnNpZ25lZCBpbnQgeTsKKwkJdW5zaWduZWQgaW50IHVfcmVnc1sxNl07IC8qIGdsb2JhbHMgYW5kIGlucyAqLworCX0JCQlzaV9yZWdzOworCWludAkJCXNpX21hc2s7Cit9IF9fc2lnaW5mbzMyX3Q7CisKKyNpZmRlZiBDT05GSUdfU1BBUkM2NAordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkICAgaW50IHNpX2Zsb2F0X3JlZ3MgWzY0XTsKKwl1bnNpZ25lZCAgIGxvbmcgc2lfZnNyOworCXVuc2lnbmVkICAgbG9uZyBzaV9nc3I7CisJdW5zaWduZWQgICBsb25nIHNpX2ZwcnM7Cit9IF9fc2lnaW5mb19mcHVfdDsKKworLyogVGhpcyBpcyB3aGF0IFN1bk9TIGRvZXNuJ3QsIHNvIHdlIGhhdmUgdG8gd3JpdGUgdGhpcyBhbG9uZQorICAgYW5kIGRvIGl0IHByb3Blcmx5LiAqLworc3RydWN0IHNpZ2NvbnRleHQgeworCS8qIFRoZSBzaXplIG9mIHRoaXMgYXJyYXkgaGFzIHRvIG1hdGNoIFNJX01BWF9TSVpFIGZyb20gc2lnaW5mby5oICovCisJY2hhcgkJCXNpZ2NfaW5mb1sxMjhdOworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGxvbmcJdV9yZWdzWzE2XTsgLyogZ2xvYmFscyBhbmQgaW5zICovCisJCXVuc2lnbmVkIGxvbmcJdHN0YXRlOworCQl1bnNpZ25lZCBsb25nCXRwYzsKKwkJdW5zaWduZWQgbG9uZwl0bnBjOworCQl1bnNpZ25lZCBpbnQJeTsKKwkJdW5zaWduZWQgaW50CWZwcnM7CisJfQkJCXNpZ2NfcmVnczsKKwlfX3NpZ2luZm9fZnB1X3QgKglzaWdjX2ZwdV9zYXZlOworCXN0cnVjdCB7CisJCXZvaWQJKglzc19zcDsKKwkJaW50CQlzc19mbGFnczsKKwkJdW5zaWduZWQgbG9uZwlzc19zaXplOworCX0JCQlzaWdjX3N0YWNrOworCXVuc2lnbmVkIGxvbmcJCXNpZ2NfbWFzazsKK307CisKICNlbHNlCi0jaW5jbHVkZSA8YXNtL3NpZ2NvbnRleHRfMzIuaD4KLSNlbmRpZgotI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIHNpX2Zsb2F0X3JlZ3MgWzMyXTsKKwl1bnNpZ25lZCBsb25nIHNpX2ZzcjsKKwl1bnNpZ25lZCBsb25nIHNpX2ZwcWRlcHRoOworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGxvbmcgKmluc25fYWRkcjsKKwkJdW5zaWduZWQgbG9uZyBpbnNuOworCX0gc2lfZnBxdWV1ZSBbMTZdOworfSBfX3NpZ2luZm9fZnB1X3Q7CisjZW5kaWYgLyogKENPTkZJR19TUEFSQzY0KSAqLworCisKKyNlbmRpZiAvKiAhKF9fQVNTRU1CTFlfXykgKi8KKworI2VuZGlmIC8qIChfX0tFUk5FTF9fKSAqLworCisjZW5kaWYgLyogIShfX1NQQVJDX1NJR0NPTlRFWFRfSCkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc2lnY29udGV4dF8zMi5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zaWdjb250ZXh0XzMyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZmI2MGQuLjAwMDAwMDAKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zaWdjb250ZXh0XzMyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0jaWZuZGVmIF9fU1BBUkNfU0lHQ09OVEVYVF9ICi0jZGVmaW5lIF9fU1BBUkNfU0lHQ09OVEVYVF9ICi0KLSNpZmRlZiBfX0tFUk5FTF9fCi0jaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgotCi0jaWZuZGVmIF9fQVNTRU1CTFlfXwotCi0jZGVmaW5lIF9fU1VOT1NfTUFYV0lOICAgMzEKLQotLyogVGhpcyBpcyB3aGF0IFN1bk9TIGRvZXMsIHNvIHNoYWxsIEkuICovCi1zdHJ1Y3Qgc2lnY29udGV4dCB7Ci0JaW50IHNpZ2Nfb25zdGFjazsgICAgICAvKiBzdGF0ZSB0byByZXN0b3JlICovCi0JaW50IHNpZ2NfbWFzazsgICAgICAgICAvKiBzaWdtYXNrIHRvIHJlc3RvcmUgKi8KLQlpbnQgc2lnY19zcDsgICAgICAgICAgIC8qIHN0YWNrIHBvaW50ZXIgKi8KLQlpbnQgc2lnY19wYzsgICAgICAgICAgIC8qIHByb2dyYW0gY291bnRlciAqLwotCWludCBzaWdjX25wYzsgICAgICAgICAgLyogbmV4dCBwcm9ncmFtIGNvdW50ZXIgKi8KLQlpbnQgc2lnY19wc3I7ICAgICAgICAgIC8qIGZvciBjb25kaXRpb24gY29kZXMgZXRjICovCi0JaW50IHNpZ2NfZzE7ICAgICAgICAgICAvKiBVc2VyIHVzZXMgdGhlc2UgdHdvIHJlZ2lzdGVycyAqLwotCWludCBzaWdjX28wOyAgICAgICAgICAgLyogd2l0aGluIHRoZSB0cmFtcG9saW5lIGNvZGUuICovCi0KLQkvKiBOb3cgY29tZXMgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSB1c2VycyB3aW5kb3cgc2V0Ci0JICogYXQgdGhlIHRpbWUgb2YgdGhlIHNpZ25hbC4KLQkgKi8KLQlpbnQgc2lnY19vc3dpbnM7ICAgICAgIC8qIG91dHN0YW5kaW5nIHdpbmRvd3MgKi8KLQotCS8qIHN0YWNrIHB0cnMgZm9yIGVhY2ggcmVnd2luIGJ1ZiAqLwotCWNoYXIgKnNpZ2Nfc3BidWZbX19TVU5PU19NQVhXSU5dOwotCi0JLyogV2luZG93cyB0byByZXN0b3JlIGFmdGVyIHNpZ25hbCAqLwotCXN0cnVjdCB7Ci0JCXVuc2lnbmVkIGxvbmcJbG9jYWxzWzhdOwotCQl1bnNpZ25lZCBsb25nCWluc1s4XTsKLQl9IHNpZ2Nfd2J1ZltfX1NVTk9TX01BWFdJTl07Ci19OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0Jc3RydWN0IHsKLQkJdW5zaWduZWQgbG9uZyBwc3I7Ci0JCXVuc2lnbmVkIGxvbmcgcGM7Ci0JCXVuc2lnbmVkIGxvbmcgbnBjOwotCQl1bnNpZ25lZCBsb25nIHk7Ci0JCXVuc2lnbmVkIGxvbmcgdV9yZWdzWzE2XTsgLyogZ2xvYmFscyBhbmQgaW5zICovCi0JfQkJc2lfcmVnczsKLQlpbnQJCXNpX21hc2s7Ci19IF9fc2lnaW5mb190OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgICBsb25nIHNpX2Zsb2F0X3JlZ3MgWzMyXTsKLQl1bnNpZ25lZCAgIGxvbmcgc2lfZnNyOwotCXVuc2lnbmVkICAgbG9uZyBzaV9mcHFkZXB0aDsKLQlzdHJ1Y3QgewotCQl1bnNpZ25lZCBsb25nICppbnNuX2FkZHI7Ci0JCXVuc2lnbmVkIGxvbmcgaW5zbjsKLQl9IHNpX2ZwcXVldWUgWzE2XTsKLX0gX19zaWdpbmZvX2ZwdV90OwotCi0jZW5kaWYgLyogIShfX0FTU0VNQkxZX18pICovCi0KLSNlbmRpZiAvKiAoX19LRVJORUxfXykgKi8KLQotI2VuZGlmIC8qICEoX19TUEFSQ19TSUdDT05URVhUX0gpICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NpZ2NvbnRleHRfNjQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc2lnY29udGV4dF82NC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzg2OGQ2Li4wMDAwMDAwCi0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc2lnY29udGV4dF82NC5oCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotI2lmbmRlZiBfX1NQQVJDNjRfU0lHQ09OVEVYVF9ICi0jZGVmaW5lIF9fU1BBUkM2NF9TSUdDT05URVhUX0gKLQotI2lmZGVmIF9fS0VSTkVMX18KLSNpbmNsdWRlIDxhc20vcHRyYWNlLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfX0FTU0VNQkxZX18KLQotI2lmZGVmIF9fS0VSTkVMX18KLQotI2RlZmluZSBfX1NVTk9TX01BWFdJTiAgIDMxCi0KLS8qIFRoaXMgaXMgd2hhdCBTdW5PUyBkb2VzLCBzbyBzaGFsbCBJIHVubGVzcyB3ZSB1c2UgbmV3IDMyYml0IHNpZ25hbHMgb3IgcnQgc2lnbmFscy4gKi8KLXN0cnVjdCBzaWdjb250ZXh0MzIgewotCWludCBzaWdjX29uc3RhY2s7ICAgICAgLyogc3RhdGUgdG8gcmVzdG9yZSAqLwotCWludCBzaWdjX21hc2s7ICAgICAgICAgLyogc2lnbWFzayB0byByZXN0b3JlICovCi0JaW50IHNpZ2Nfc3A7ICAgICAgICAgICAvKiBzdGFjayBwb2ludGVyICovCi0JaW50IHNpZ2NfcGM7ICAgICAgICAgICAvKiBwcm9ncmFtIGNvdW50ZXIgKi8KLQlpbnQgc2lnY19ucGM7ICAgICAgICAgIC8qIG5leHQgcHJvZ3JhbSBjb3VudGVyICovCi0JaW50IHNpZ2NfcHNyOyAgICAgICAgICAvKiBmb3IgY29uZGl0aW9uIGNvZGVzIGV0YyAqLwotCWludCBzaWdjX2cxOyAgICAgICAgICAgLyogVXNlciB1c2VzIHRoZXNlIHR3byByZWdpc3RlcnMgKi8KLQlpbnQgc2lnY19vMDsgICAgICAgICAgIC8qIHdpdGhpbiB0aGUgdHJhbXBvbGluZSBjb2RlLiAqLwotCi0JLyogTm93IGNvbWVzIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgdXNlcnMgd2luZG93IHNldAotCSAqIGF0IHRoZSB0aW1lIG9mIHRoZSBzaWduYWwuCi0JICovCi0JaW50IHNpZ2Nfb3N3aW5zOyAgICAgICAvKiBvdXRzdGFuZGluZyB3aW5kb3dzICovCi0KLQkvKiBzdGFjayBwdHJzIGZvciBlYWNoIHJlZ3dpbiBidWYgKi8KLQl1bnNpZ25lZCBzaWdjX3NwYnVmW19fU1VOT1NfTUFYV0lOXTsKLQotCS8qIFdpbmRvd3MgdG8gcmVzdG9yZSBhZnRlciBzaWduYWwgKi8KLQlzdHJ1Y3QgcmVnX3dpbmRvdzMyIHNpZ2Nfd2J1ZltfX1NVTk9TX01BWFdJTl07Ci19OwotCi0jZW5kaWYKLQotI2lmZGVmIF9fS0VSTkVMX18KLQotLyogVGhpcyBpcyB3aGF0IHdlIHVzZSBmb3IgMzJiaXQgbmV3IG5vbi1ydCBzaWduYWxzLiAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0Jc3RydWN0IHsKLQkJdW5zaWduZWQgaW50IHBzcjsKLQkJdW5zaWduZWQgaW50IHBjOwotCQl1bnNpZ25lZCBpbnQgbnBjOwotCQl1bnNpZ25lZCBpbnQgeTsKLQkJdW5zaWduZWQgaW50IHVfcmVnc1sxNl07IC8qIGdsb2JhbHMgYW5kIGlucyAqLwotCX0JCQlzaV9yZWdzOwotCWludAkJCXNpX21hc2s7Ci19IF9fc2lnaW5mbzMyX3Q7Ci0KLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgICBpbnQgc2lfZmxvYXRfcmVncyBbNjRdOwotCXVuc2lnbmVkICAgbG9uZyBzaV9mc3I7Ci0JdW5zaWduZWQgICBsb25nIHNpX2dzcjsKLQl1bnNpZ25lZCAgIGxvbmcgc2lfZnByczsKLX0gX19zaWdpbmZvX2ZwdV90OwotCi0vKiBUaGlzIGlzIHdoYXQgU3VuT1MgZG9lc24ndCwgc28gd2UgaGF2ZSB0byB3cml0ZSB0aGlzIGFsb25lCi0gICBhbmQgZG8gaXQgcHJvcGVybHkuICovCi1zdHJ1Y3Qgc2lnY29udGV4dCB7Ci0JLyogVGhlIHNpemUgb2YgdGhpcyBhcnJheSBoYXMgdG8gbWF0Y2ggU0lfTUFYX1NJWkUgZnJvbSBzaWdpbmZvLmggKi8KLQljaGFyCQkJc2lnY19pbmZvWzEyOF07Ci0Jc3RydWN0IHsKLQkJdW5zaWduZWQgbG9uZwl1X3JlZ3NbMTZdOyAvKiBnbG9iYWxzIGFuZCBpbnMgKi8KLQkJdW5zaWduZWQgbG9uZwl0c3RhdGU7Ci0JCXVuc2lnbmVkIGxvbmcJdHBjOwotCQl1bnNpZ25lZCBsb25nCXRucGM7Ci0JCXVuc2lnbmVkIGludAl5OwotCQl1bnNpZ25lZCBpbnQJZnByczsKLQl9CQkJc2lnY19yZWdzOwotCV9fc2lnaW5mb19mcHVfdCAqCXNpZ2NfZnB1X3NhdmU7Ci0Jc3RydWN0IHsKLQkJdm9pZAkqCXNzX3NwOwotCQlpbnQJCXNzX2ZsYWdzOwotCQl1bnNpZ25lZCBsb25nCXNzX3NpemU7Ci0JfQkJCXNpZ2Nfc3RhY2s7Ci0JdW5zaWduZWQgbG9uZwkJc2lnY19tYXNrOwotfTsKLQotI2VuZGlmIC8qICEoX19BU1NFTUJMWV9fKSAqLwotCi0jZW5kaWYgLyogIShfX1NQQVJDNjRfU0lHQ09OVEVYVF9IKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zaWdpbmZvLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NpZ2luZm8uaAppbmRleCBiZDgxZjhkLi45ODhlNWQ4IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NpZ2luZm8uaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NpZ2luZm8uaApAQCAtMSw4ICsxLDM3IEBACi0jaWZuZGVmIF9fX0FTTV9TUEFSQ19TSUdJTkZPX0gKLSNkZWZpbmUgX19fQVNNX1NQQVJDX1NJR0lORk9fSAorI2lmbmRlZiBfX1NQQVJDX1NJR0lORk9fSAorI2RlZmluZSBfX1NQQVJDX1NJR0lORk9fSAorCiAjaWYgZGVmaW5lZChfX3NwYXJjX18pICYmIGRlZmluZWQoX19hcmNoNjRfXykKLSNpbmNsdWRlIDxhc20vc2lnaW5mb182NC5oPgotI2Vsc2UKLSNpbmNsdWRlIDxhc20vc2lnaW5mb18zMi5oPgotI2VuZGlmCi0jZW5kaWYKKworI2RlZmluZSBTSV9QQURfU0laRTMyCSgoU0lfTUFYX1NJWkUvc2l6ZW9mKGludCkpIC0gMykKKyNkZWZpbmUgX19BUkNIX1NJX1BSRUFNQkxFX1NJWkUJKDQgKiBzaXplb2YoaW50KSkKKyNkZWZpbmUgX19BUkNIX1NJX0JBTkRfVCBpbnQKKworI2VuZGlmIC8qIGRlZmluZWQoX19zcGFyY19fKSAmJiBkZWZpbmVkKF9fYXJjaDY0X18pICovCisKKworI2RlZmluZSBfX0FSQ0hfU0lfVFJBUE5PCisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9zaWdpbmZvLmg+CisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKworI2lmZGVmIENPTkZJR19DT01QQVQKKworc3RydWN0IGNvbXBhdF9zaWdpbmZvOworCisjZW5kaWYgLyogQ09ORklHX0NPTVBBVCAqLworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjZGVmaW5lIFNJX05PSU5GTwkzMjc2NwkJLyogbm8gaW5mb3JtYXRpb24gaW4gc2lnaW5mb190ICovCisKKy8qCisgKiBTSUdFTVQgc2lfY29kZXMKKyAqLworI2RlZmluZSBFTVRfVEFHT1ZGCShfX1NJX0ZBVUxUfDEpCS8qIHRhZyBvdmVyZmxvdyAqLworI2RlZmluZSBOU0lHRU1UCQkxCisKKyNlbmRpZiAvKiAhKF9fU1BBUkNfU0lHSU5GT19IKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zaWdpbmZvXzMyLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NpZ2luZm9fMzIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M3MWFmMS4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NpZ2luZm9fMzIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSNpZm5kZWYgX1NQQVJDX1NJR0lORk9fSAotI2RlZmluZSBfU1BBUkNfU0lHSU5GT19ICi0KLSNkZWZpbmUgX19BUkNIX1NJX1VJRF9UCQl1bnNpZ25lZCBpbnQKLSNkZWZpbmUgX19BUkNIX1NJX1RSQVBOTwotCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvc2lnaW5mby5oPgotCi0jZGVmaW5lIFNJX05PSU5GTwkzMjc2NwkJLyogbm8gaW5mb3JtYXRpb24gaW4gc2lnaW5mb190ICovCi0KLS8qCi0gKiBTSUdFTVQgc2lfY29kZXMKLSAqLwotI2RlZmluZSBFTVRfVEFHT1ZGCShfX1NJX0ZBVUxUfDEpCS8qIHRhZyBvdmVyZmxvdyAqLwotI2RlZmluZSBOU0lHRU1UCQkxCi0KLSNlbmRpZiAvKiAhKF9TUEFSQ19TSUdJTkZPX0gpICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NpZ2luZm9fNjQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc2lnaW5mb182NC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTZlNmMzLi4wMDAwMDAwCi0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc2lnaW5mb182NC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotI2lmbmRlZiBfU1BBUkM2NF9TSUdJTkZPX0gKLSNkZWZpbmUgX1NQQVJDNjRfU0lHSU5GT19ICi0KLSNkZWZpbmUgU0lfUEFEX1NJWkUzMgkoKFNJX01BWF9TSVpFL3NpemVvZihpbnQpKSAtIDMpCi0KLSNkZWZpbmUgX19BUkNIX1NJX1BSRUFNQkxFX1NJWkUJKDQgKiBzaXplb2YoaW50KSkKLSNkZWZpbmUgX19BUkNIX1NJX1RSQVBOTwotI2RlZmluZSBfX0FSQ0hfU0lfQkFORF9UIGludAotCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvc2lnaW5mby5oPgotCi0jaWZkZWYgX19LRVJORUxfXwotCi0jaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+Ci0KLSNpZmRlZiBDT05GSUdfQ09NUEFUCi0KLXN0cnVjdCBjb21wYXRfc2lnaW5mbzsKLQotI2VuZGlmIC8qIENPTkZJR19DT01QQVQgKi8KLQotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQotI2RlZmluZSBTSV9OT0lORk8JMzI3NjcJCS8qIG5vIGluZm9ybWF0aW9uIGluIHNpZ2luZm9fdCAqLwotCi0vKgotICogU0lHRU1UIHNpX2NvZGVzCi0gKi8KLSNkZWZpbmUgRU1UX1RBR09WRgkoX19TSV9GQVVMVHwxKQkvKiB0YWcgb3ZlcmZsb3cgKi8KLSNkZWZpbmUgTlNJR0VNVAkJMQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc2lnbmFsLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NpZ25hbC5oCmluZGV4IDI3YWIwNWQuLjQxNTM1ZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc2lnbmFsLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zaWduYWwuaApAQCAtMSw4ICsxLDIxMCBAQAotI2lmbmRlZiBfX19BU01fU1BBUkNfU0lHTkFMX0gKLSNkZWZpbmUgX19fQVNNX1NQQVJDX1NJR05BTF9ICi0jaWYgZGVmaW5lZChfX3NwYXJjX18pICYmIGRlZmluZWQoX19hcmNoNjRfXykKLSNpbmNsdWRlIDxhc20vc2lnbmFsXzY0Lmg+CisjaWZuZGVmIF9fU1BBUkNfU0lHTkFMX0gKKyNkZWZpbmUgX19TUEFSQ19TSUdOQUxfSAorCisjaW5jbHVkZSA8YXNtL3NpZ2NvbnRleHQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorCisjaWZkZWYgX19LRVJORUxfXworI2lmbmRlZiBfX0FTU0VNQkxZX18KKyNpbmNsdWRlIDxsaW51eC9wZXJzb25hbGl0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjZW5kaWYKKyNlbmRpZgorCisvKiBPbiB0aGUgU3BhcmMgdGhlIHNpZ25hbCBoYW5kbGVycyBnZXQgcGFzc2VkIGEgJ3N1Yi1zaWduYWwnIGNvZGUKKyAqIGZvciBjZXJ0YWluIHNpZ25hbCB0eXBlcywgd2hpY2ggd2UgZG9jdW1lbnQgaGVyZS4KKyAqLworI2RlZmluZSBTSUdIVVAJCSAxCisjZGVmaW5lIFNJR0lOVAkJIDIKKyNkZWZpbmUgU0lHUVVJVAkJIDMKKyNkZWZpbmUgU0lHSUxMCQkgNAorI2RlZmluZSAgICBTVUJTSUdfU1RBQ0sgICAgICAgMAorI2RlZmluZSAgICBTVUJTSUdfSUxMSU5TVCAgICAgMgorI2RlZmluZSAgICBTVUJTSUdfUFJJVklOU1QgICAgMworI2RlZmluZSAgICBTVUJTSUdfQkFEVFJBUCh0KSAgKDB4ODAgKyAodCkpCisKKyNkZWZpbmUgU0lHVFJBUAkJIDUKKyNkZWZpbmUgU0lHQUJSVAkJIDYKKyNkZWZpbmUgU0lHSU9UCQkgNgorCisjZGVmaW5lIFNJR0VNVCAgICAgICAgICAgNworI2RlZmluZSAgICBTVUJTSUdfVEFHICAgIDEwCisKKyNkZWZpbmUgU0lHRlBFCQkgOAorI2RlZmluZSAgICBTVUJTSUdfRlBESVNBQkxFRCAgICAgMHg0MDAKKyNkZWZpbmUgICAgU1VCU0lHX0ZQRVJST1IgICAgICAgIDB4NDA0CisjZGVmaW5lICAgIFNVQlNJR19GUElOVE9WRkwgICAgICAweDAwMQorI2RlZmluZSAgICBTVUJTSUdfRlBTVFNJRyAgICAgICAgMHgwMDIKKyNkZWZpbmUgICAgU1VCU0lHX0lESVZaRVJPICAgICAgIDB4MDE0CisjZGVmaW5lICAgIFNVQlNJR19GUElORVhBQ1QgICAgICAweDBjNAorI2RlZmluZSAgICBTVUJTSUdfRlBESVZaRVJPICAgICAgMHgwYzgKKyNkZWZpbmUgICAgU1VCU0lHX0ZQVU5GTE9XICAgICAgIDB4MGNjCisjZGVmaW5lICAgIFNVQlNJR19GUE9QRVJST1IgICAgICAweDBkMAorI2RlZmluZSAgICBTVUJTSUdfRlBPVkZMT1cgICAgICAgMHgwZDQKKworI2RlZmluZSBTSUdLSUxMCQkgOQorI2RlZmluZSBTSUdCVVMgICAgICAgICAgMTAKKyNkZWZpbmUgICAgU1VCU0lHX0JVU1RJTUVPVVQgICAgMQorI2RlZmluZSAgICBTVUJTSUdfQUxJR05NRU5UICAgICAyCisjZGVmaW5lICAgIFNVQlNJR19NSVNDRVJST1IgICAgIDUKKworI2RlZmluZSBTSUdTRUdWCQkxMQorI2RlZmluZSAgICBTVUJTSUdfTk9NQVBQSU5HICAgICAzCisjZGVmaW5lICAgIFNVQlNJR19QUk9URUNUSU9OICAgIDQKKyNkZWZpbmUgICAgU1VCU0lHX1NFR0VSUk9SICAgICAgNQorCisjZGVmaW5lIFNJR1NZUwkJMTIKKworI2RlZmluZSBTSUdQSVBFCQkxMworI2RlZmluZSBTSUdBTFJNCQkxNAorI2RlZmluZSBTSUdURVJNCQkxNQorI2RlZmluZSBTSUdVUkcgICAgICAgICAgMTYKKworLyogU3VuT1MgdmFsdWVzIHdoaWNoIGRldmlhdGUgZnJvbSB0aGUgTGludXgvaTM4NiBvbmVzICovCisjZGVmaW5lIFNJR1NUT1AJCTE3CisjZGVmaW5lIFNJR1RTVFAJCTE4CisjZGVmaW5lIFNJR0NPTlQJCTE5CisjZGVmaW5lIFNJR0NITEQJCTIwCisjZGVmaW5lIFNJR1RUSU4JCTIxCisjZGVmaW5lIFNJR1RUT1UJCTIyCisjZGVmaW5lIFNJR0lPCQkyMworI2RlZmluZSBTSUdQT0xMCQlTSUdJTyAgIC8qIFN5c1YgbmFtZSBmb3IgU0lHSU8gKi8KKyNkZWZpbmUgU0lHWENQVQkJMjQKKyNkZWZpbmUgU0lHWEZTWgkJMjUKKyNkZWZpbmUgU0lHVlRBTFJNCTI2CisjZGVmaW5lIFNJR1BST0YJCTI3CisjZGVmaW5lIFNJR1dJTkNICTI4CisjZGVmaW5lIFNJR0xPU1QJCTI5CisjZGVmaW5lIFNJR1BXUgkJU0lHTE9TVAorI2RlZmluZSBTSUdVU1IxCQkzMAorI2RlZmluZSBTSUdVU1IyCQkzMQorCisvKiBNb3N0IHRoaW5ncyBzaG91bGQgYmUgY2xlYW4gZW5vdWdoIHRvIHJlZGVmaW5lIHRoaXMgYXQgd2lsbCwgaWYgY2FyZQorICAgaXMgdGFrZW4gdG8gbWFrZSBsaWJjIG1hdGNoLiAgKi8KKworI2RlZmluZSBfX09MRF9OU0lHCTMyCisjZGVmaW5lIF9fTkVXX05TSUcgICAgICA2NAorI2RlZmluZSBfTlNJR19CUFcgICAgICAgNjQKKyNkZWZpbmUgX05TSUdfV09SRFMgICAgIChfX05FV19OU0lHIC8gX05TSUdfQlBXKQorCisjZGVmaW5lIFNJR1JUTUlOICAgICAgIDMyCisjZGVmaW5lIFNJR1JUTUFYICAgICAgIF9fTkVXX05TSUcKKworI2lmIGRlZmluZWQoX19LRVJORUxfXykgfHwgZGVmaW5lZChfX1dBTlRfUE9TSVgxQl9TSUdOQUxTX18pCisjZGVmaW5lIF9OU0lHCQkJX19ORVdfTlNJRworI2RlZmluZSBfX25ld19zaWdzZXRfdAkJc2lnc2V0X3QKKyNkZWZpbmUgX19uZXdfc2lnYWN0aW9uCQlzaWdhY3Rpb24KKyNkZWZpbmUgX19uZXdfc2lnYWN0aW9uMzIJc2lnYWN0aW9uMzIKKyNkZWZpbmUgX19vbGRfc2lnc2V0X3QJCW9sZF9zaWdzZXRfdAorI2RlZmluZSBfX29sZF9zaWdhY3Rpb24JCW9sZF9zaWdhY3Rpb24KKyNkZWZpbmUgX19vbGRfc2lnYWN0aW9uMzIJb2xkX3NpZ2FjdGlvbjMyCiAjZWxzZQotI2luY2x1ZGUgPGFzbS9zaWduYWxfMzIuaD4KKyNkZWZpbmUgX05TSUcJCQlfX09MRF9OU0lHCisjZGVmaW5lIE5TSUcJCQlfTlNJRworI2RlZmluZSBfX29sZF9zaWdzZXRfdAkJc2lnc2V0X3QKKyNkZWZpbmUgX19vbGRfc2lnYWN0aW9uCQlzaWdhY3Rpb24KKyNkZWZpbmUgX19vbGRfc2lnYWN0aW9uMzIJc2lnYWN0aW9uMzIKICNlbmRpZgorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgX19vbGRfc2lnc2V0X3Q7ICAgICAgICAgICAgLyogYXQgbGVhc3QgMzIgYml0cyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgdW5zaWduZWQgbG9uZyBzaWdbX05TSUdfV09SRFNdOworfSBfX25ld19zaWdzZXRfdDsKKworLyogQSBTdW5PUyBzaWdzdGFjayAqLworc3RydWN0IHNpZ3N0YWNrIHsKKwkvKiBYWFggMzItYml0IHBvaW50ZXJzIHBpbmhlYWQgWFhYICovCisJY2hhciAqdGhlX3N0YWNrOworCWludCAgIGN1cl9zdGF0dXM7Cit9OworCisvKiBTaWd2ZWMgZmxhZ3MgKi8KKyNkZWZpbmUgX1NWX1NTVEFDSyAgICAxdSAgICAvKiBUaGlzIHNpZ25hbCBoYW5kbGVyIHNob3VsZCB1c2Ugc2lnLXN0YWNrICovCisjZGVmaW5lIF9TVl9JTlRSICAgICAgMnUgICAgLyogU2lnIHJldHVybiBzaG91bGQgbm90IHJlc3RhcnQgc3lzdGVtIGNhbGwgKi8KKyNkZWZpbmUgX1NWX1JFU0VUICAgICA0dSAgICAvKiBTZXQgaGFuZGxlciB0byBTSUdfREZMIHVwb24gdGFrZW4gc2lnbmFsICovCisjZGVmaW5lIF9TVl9JR05DSElMRCAgOHUgICAgLyogRG8gbm90IHNlbmQgU0lHQ0hMRCAqLworCisvKgorICogc2FfZmxhZ3MgdmFsdWVzOiBTQV9TVEFDSyBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCwgYnV0IHdpbGwgYWxsb3cgdGhlCisgKiB1c2FnZSBvZiBzaWduYWwgc3RhY2tzIGJ5IHVzaW5nIHRoZSAobm93IG9ic29sZXRlKSBzYV9yZXN0b3JlciBmaWVsZCBpbgorICogdGhlIHNpZ2FjdGlvbiBzdHJ1Y3R1cmUgYXMgYSBzdGFjayBwb2ludGVyLiBUaGlzIGlzIG5vdyBwb3NzaWJsZSBkdWUgdG8KKyAqIHRoZSBjaGFuZ2VzIGluIHNpZ25hbCBoYW5kbGluZy4gTEJUIDAxMDQ5My4KKyAqIFNBX1JFU1RBUlQgZmxhZyB0byBnZXQgcmVzdGFydGluZyBzaWduYWxzICh3aGljaCB3ZXJlIHRoZSBkZWZhdWx0IGxvbmcgYWdvKQorICovCisjZGVmaW5lIFNBX05PQ0xEU1RPUAlfU1ZfSUdOQ0hJTEQKKyNkZWZpbmUgU0FfU1RBQ0sJX1NWX1NTVEFDSworI2RlZmluZSBTQV9PTlNUQUNLCV9TVl9TU1RBQ0sKKyNkZWZpbmUgU0FfUkVTVEFSVAlfU1ZfSU5UUgorI2RlZmluZSBTQV9PTkVTSE9UCV9TVl9SRVNFVAorI2RlZmluZSBTQV9OT01BU0sJMHgyMHUKKyNkZWZpbmUgU0FfTk9DTERXQUlUICAgIDB4MTAwdQorI2RlZmluZSBTQV9TSUdJTkZPICAgICAgMHgyMDB1CisKKworI2RlZmluZSBTSUdfQkxPQ0sgICAgICAgICAgMHgwMQkvKiBmb3IgYmxvY2tpbmcgc2lnbmFscyAqLworI2RlZmluZSBTSUdfVU5CTE9DSyAgICAgICAgMHgwMgkvKiBmb3IgdW5ibG9ja2luZyBzaWduYWxzICovCisjZGVmaW5lIFNJR19TRVRNQVNLICAgICAgICAweDA0CS8qIGZvciBzZXR0aW5nIHRoZSBzaWduYWwgbWFzayAqLworCisvKgorICogc2lnYWx0c3RhY2sgY29udHJvbHMKKyAqLworI2RlZmluZSBTU19PTlNUQUNLCTEKKyNkZWZpbmUgU1NfRElTQUJMRQkyCisKKyNkZWZpbmUgTUlOU0lHU1RLU1oJNDA5NgorI2RlZmluZSBTSUdTVEtTWgkxNjM4NAorCisjaWZkZWYgX19LRVJORUxfXworLyoKKyAqIERKSFIKKyAqIFNBX1NUQVRJQ19BTExPQyBpcyB1c2VkIGZvciB0aGUgc3BhcmMzMiBzeXN0ZW0gdG8gaW5kaWNhdGUgdGhhdCB0aGlzCisgKiBpbnRlcnJ1cHQgaGFuZGxlcidzIGlycSBzdHJ1Y3R1cmUgc2hvdWxkIGJlIHN0YXRpY2FsbHkgYWxsb2NhdGVkCisgKiBieSB0aGUgcmVxdWVzdF9pcnEgcm91dGluZS4KKyAqIFRoZSBhbHRlcm5hdGl2ZSBpcyB0aGF0IGFyY2gvc3BhcmMva2VybmVsL2lycS5jIGhhcyBjYXJuYWwga25vd2xlZGdlCisgKiBvZiBpbnRlcnJ1cHQgdXNhZ2UgYW5kIHRoYXQgc3Vja3MuIEFsc28gd2l0aG91dCBhIGZsYWcgbGlrZSB0aGlzCisgKiBpdCBtYXkgYmUgcG9zc2libGUgZm9yIHRoZSBmcmVlX2lycSByb3V0aW5lIHRvIGF0dGVtcHQgdG8gZnJlZQorICogc3RhdGljYWxseSBhbGxvY2F0ZWQgZGF0YS4uIHdoaWNoIGlzIE5PVCBHT09ELgorICoKKyAqLworI2RlZmluZSBTQV9TVEFUSUNfQUxMT0MgICAgICAgICAweDgwMDAKICNlbmRpZgorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvc2lnbmFsLmg+CisKK3N0cnVjdCBfX25ld19zaWdhY3Rpb24geworCV9fc2lnaGFuZGxlcl90CQlzYV9oYW5kbGVyOworCXVuc2lnbmVkIGxvbmcJCXNhX2ZsYWdzOworCV9fc2lncmVzdG9yZV90CQlzYV9yZXN0b3JlcjsgIC8qIG5vdCB1c2VkIGJ5IExpbnV4L1NQQVJDIHlldCAqLworCV9fbmV3X3NpZ3NldF90CQlzYV9tYXNrOworfTsKKworc3RydWN0IF9fb2xkX3NpZ2FjdGlvbiB7CisJX19zaWdoYW5kbGVyX3QJCXNhX2hhbmRsZXI7CisJX19vbGRfc2lnc2V0X3QJCXNhX21hc2s7CisJdW5zaWduZWQgbG9uZwkJc2FfZmxhZ3M7CisJdm9pZAkJCSgqc2FfcmVzdG9yZXIpKHZvaWQpOyAgLyogbm90IHVzZWQgYnkgTGludXgvU1BBUkMgeWV0ICovCit9OworCit0eXBlZGVmIHN0cnVjdCBzaWdhbHRzdGFjayB7CisJdm9pZAkJCV9fdXNlciAqc3Nfc3A7CisJaW50CQkJc3NfZmxhZ3M7CisJc2l6ZV90CQkJc3Nfc2l6ZTsKK30gc3RhY2tfdDsKKworI2lmZGVmIF9fS0VSTkVMX18KKworc3RydWN0IGtfc2lnYWN0aW9uIHsKKwlzdHJ1Y3QJCQlfX25ld19zaWdhY3Rpb24gc2E7CisJdm9pZAkJCV9fdXNlciAqa2FfcmVzdG9yZXI7Cit9OworCisjZGVmaW5lIHB0cmFjZV9zaWduYWxfZGVsaXZlcihyZWdzLCBjb29raWUpIGRvIHsgfSB3aGlsZSAoMCkKKworI2VuZGlmIC8qICEoX19LRVJORUxfXykgKi8KKworI2VuZGlmIC8qICEoX19BU1NFTUJMWV9fKSAqLworCisjZW5kaWYgLyogIShfX1NQQVJDX1NJR05BTF9IKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zaWduYWxfMzIuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc2lnbmFsXzMyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2YTYwYWIuLjAwMDAwMDAKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zaWduYWxfMzIuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0jaWZuZGVmIF9BU01TUEFSQ19TSUdOQUxfSAotI2RlZmluZSBfQVNNU1BBUkNfU0lHTkFMX0gKLQotI2luY2x1ZGUgPGFzbS9zaWdjb250ZXh0Lmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KLQotI2lmZGVmIF9fS0VSTkVMX18KLSNpZm5kZWYgX19BU1NFTUJMWV9fCi0jaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2VuZGlmCi0jZW5kaWYKLQotLyogT24gdGhlIFNwYXJjIHRoZSBzaWduYWwgaGFuZGxlcnMgZ2V0IHBhc3NlZCBhICdzdWItc2lnbmFsJyBjb2RlCi0gKiBmb3IgY2VydGFpbiBzaWduYWwgdHlwZXMsIHdoaWNoIHdlIGRvY3VtZW50IGhlcmUuCi0gKi8KLSNkZWZpbmUgU0lHSFVQCQkgMQotI2RlZmluZSBTSUdJTlQJCSAyCi0jZGVmaW5lIFNJR1FVSVQJCSAzCi0jZGVmaW5lIFNJR0lMTAkJIDQKLSNkZWZpbmUgICAgU1VCU0lHX1NUQUNLICAgICAgIDAKLSNkZWZpbmUgICAgU1VCU0lHX0lMTElOU1QgICAgIDIKLSNkZWZpbmUgICAgU1VCU0lHX1BSSVZJTlNUICAgIDMKLSNkZWZpbmUgICAgU1VCU0lHX0JBRFRSQVAodCkgICgweDgwICsgKHQpKQotCi0jZGVmaW5lIFNJR1RSQVAJCSA1Ci0jZGVmaW5lIFNJR0FCUlQJCSA2Ci0jZGVmaW5lIFNJR0lPVAkJIDYKLQotI2RlZmluZSBTSUdFTVQgICAgICAgICAgIDcKLSNkZWZpbmUgICAgU1VCU0lHX1RBRyAgICAxMAotCi0jZGVmaW5lIFNJR0ZQRQkJIDgKLSNkZWZpbmUgICAgU1VCU0lHX0ZQRElTQUJMRUQgICAgIDB4NDAwCi0jZGVmaW5lICAgIFNVQlNJR19GUEVSUk9SICAgICAgICAweDQwNAotI2RlZmluZSAgICBTVUJTSUdfRlBJTlRPVkZMICAgICAgMHgwMDEKLSNkZWZpbmUgICAgU1VCU0lHX0ZQU1RTSUcgICAgICAgIDB4MDAyCi0jZGVmaW5lICAgIFNVQlNJR19JRElWWkVSTyAgICAgICAweDAxNAotI2RlZmluZSAgICBTVUJTSUdfRlBJTkVYQUNUICAgICAgMHgwYzQKLSNkZWZpbmUgICAgU1VCU0lHX0ZQRElWWkVSTyAgICAgIDB4MGM4Ci0jZGVmaW5lICAgIFNVQlNJR19GUFVORkxPVyAgICAgICAweDBjYwotI2RlZmluZSAgICBTVUJTSUdfRlBPUEVSUk9SICAgICAgMHgwZDAKLSNkZWZpbmUgICAgU1VCU0lHX0ZQT1ZGTE9XICAgICAgIDB4MGQ0Ci0KLSNkZWZpbmUgU0lHS0lMTAkJIDkKLSNkZWZpbmUgU0lHQlVTICAgICAgICAgIDEwCi0jZGVmaW5lICAgIFNVQlNJR19CVVNUSU1FT1VUICAgIDEKLSNkZWZpbmUgICAgU1VCU0lHX0FMSUdOTUVOVCAgICAgMgotI2RlZmluZSAgICBTVUJTSUdfTUlTQ0VSUk9SICAgICA1Ci0KLSNkZWZpbmUgU0lHU0VHVgkJMTEKLSNkZWZpbmUgICAgU1VCU0lHX05PTUFQUElORyAgICAgMwotI2RlZmluZSAgICBTVUJTSUdfUFJPVEVDVElPTiAgICA0Ci0jZGVmaW5lICAgIFNVQlNJR19TRUdFUlJPUiAgICAgIDUKLQotI2RlZmluZSBTSUdTWVMJCTEyCi0KLSNkZWZpbmUgU0lHUElQRQkJMTMKLSNkZWZpbmUgU0lHQUxSTQkJMTQKLSNkZWZpbmUgU0lHVEVSTQkJMTUKLSNkZWZpbmUgU0lHVVJHICAgICAgICAgIDE2Ci0KLS8qIFN1bk9TIHZhbHVlcyB3aGljaCBkZXZpYXRlIGZyb20gdGhlIExpbnV4L2kzODYgb25lcyAqLwotI2RlZmluZSBTSUdTVE9QCQkxNwotI2RlZmluZSBTSUdUU1RQCQkxOAotI2RlZmluZSBTSUdDT05UCQkxOQotI2RlZmluZSBTSUdDSExECQkyMAotI2RlZmluZSBTSUdUVElOCQkyMQotI2RlZmluZSBTSUdUVE9VCQkyMgotI2RlZmluZSBTSUdJTwkJMjMKLSNkZWZpbmUgU0lHUE9MTAkJU0lHSU8gICAvKiBTeXNWIG5hbWUgZm9yIFNJR0lPICovCi0jZGVmaW5lIFNJR1hDUFUJCTI0Ci0jZGVmaW5lIFNJR1hGU1oJCTI1Ci0jZGVmaW5lIFNJR1ZUQUxSTQkyNgotI2RlZmluZSBTSUdQUk9GCQkyNwotI2RlZmluZSBTSUdXSU5DSAkyOAotI2RlZmluZSBTSUdMT1NUCQkyOQotI2RlZmluZSBTSUdQV1IJCVNJR0xPU1QKLSNkZWZpbmUgU0lHVVNSMQkJMzAKLSNkZWZpbmUgU0lHVVNSMgkJMzEKLQotLyogTW9zdCB0aGluZ3Mgc2hvdWxkIGJlIGNsZWFuIGVub3VnaCB0byByZWRlZmluZSB0aGlzIGF0IHdpbGwsIGlmIGNhcmUKLSAqIGlzIHRha2VuIHRvIG1ha2UgbGliYyBtYXRjaC4KLSAqLwotCi0jZGVmaW5lIF9fT0xEX05TSUcJMzIKLSNkZWZpbmUgX19ORVdfTlNJRwk2NAotI2RlZmluZSBfTlNJR19CUFcJMzIKLSNkZWZpbmUgX05TSUdfV09SRFMJKF9fTkVXX05TSUcgLyBfTlNJR19CUFcpCi0KLSNkZWZpbmUgU0lHUlRNSU4JMzIKLSNkZWZpbmUgU0lHUlRNQVgJX19ORVdfTlNJRwotCi0jaWYgZGVmaW5lZChfX0tFUk5FTF9fKSB8fCBkZWZpbmVkKF9fV0FOVF9QT1NJWDFCX1NJR05BTFNfXykKLSNkZWZpbmUJX05TSUcJCV9fTkVXX05TSUcKLSNkZWZpbmUgX19uZXdfc2lnc2V0X3QJc2lnc2V0X3QKLSNkZWZpbmUgX19uZXdfc2lnYWN0aW9uCXNpZ2FjdGlvbgotI2RlZmluZSBfX29sZF9zaWdzZXRfdAlvbGRfc2lnc2V0X3QKLSNkZWZpbmUgX19vbGRfc2lnYWN0aW9uCW9sZF9zaWdhY3Rpb24KLSNlbHNlCi0jZGVmaW5lIF9OU0lHCQlfX09MRF9OU0lHCi0jZGVmaW5lIF9fb2xkX3NpZ3NldF90CXNpZ3NldF90Ci0jZGVmaW5lIF9fb2xkX3NpZ2FjdGlvbglzaWdhY3Rpb24KLSNlbmRpZgotCi0jaWZuZGVmIF9fQVNTRU1CTFlfXwotCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgX19vbGRfc2lnc2V0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBsb25nCXNpZ1tfTlNJR19XT1JEU107Ci19IF9fbmV3X3NpZ3NldF90OwotCi0KLSNpZmRlZiBfX0tFUk5FTF9fCi0vKiBBIFN1bk9TIHNpZ3N0YWNrICovCi1zdHJ1Y3Qgc2lnc3RhY2sgewotCWNoYXIgKnRoZV9zdGFjazsKLQlpbnQgICBjdXJfc3RhdHVzOwotfTsKLSNlbmRpZgotCi0vKiBTaWd2ZWMgZmxhZ3MgKi8KLSNkZWZpbmUgX1NWX1NTVEFDSyAgICAxdSAgICAvKiBUaGlzIHNpZ25hbCBoYW5kbGVyIHNob3VsZCB1c2Ugc2lnLXN0YWNrICovCi0jZGVmaW5lIF9TVl9JTlRSICAgICAgMnUgICAgLyogU2lnIHJldHVybiBzaG91bGQgbm90IHJlc3RhcnQgc3lzdGVtIGNhbGwgKi8KLSNkZWZpbmUgX1NWX1JFU0VUICAgICA0dSAgICAvKiBTZXQgaGFuZGxlciB0byBTSUdfREZMIHVwb24gdGFrZW4gc2lnbmFsICovCi0jZGVmaW5lIF9TVl9JR05DSElMRCAgOHUgICAgLyogRG8gbm90IHNlbmQgU0lHQ0hMRCAqLwotCi0vKgotICogc2FfZmxhZ3MgdmFsdWVzOiBTQV9TVEFDSyBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCwgYnV0IHdpbGwgYWxsb3cgdGhlCi0gKiB1c2FnZSBvZiBzaWduYWwgc3RhY2tzIGJ5IHVzaW5nIHRoZSAobm93IG9ic29sZXRlKSBzYV9yZXN0b3JlciBmaWVsZCBpbgotICogdGhlIHNpZ2FjdGlvbiBzdHJ1Y3R1cmUgYXMgYSBzdGFjayBwb2ludGVyLiBUaGlzIGlzIG5vdyBwb3NzaWJsZSBkdWUgdG8KLSAqIHRoZSBjaGFuZ2VzIGluIHNpZ25hbCBoYW5kbGluZy4gTEJUIDAxMDQ5My4KLSAqIFNBX1JFU1RBUlQgZmxhZyB0byBnZXQgcmVzdGFydGluZyBzaWduYWxzICh3aGljaCB3ZXJlIHRoZSBkZWZhdWx0IGxvbmcgYWdvKQotICovCi0jZGVmaW5lIFNBX05PQ0xEU1RPUAlfU1ZfSUdOQ0hJTEQKLSNkZWZpbmUgU0FfU1RBQ0sJX1NWX1NTVEFDSwotI2RlZmluZSBTQV9PTlNUQUNLCV9TVl9TU1RBQ0sKLSNkZWZpbmUgU0FfUkVTVEFSVAlfU1ZfSU5UUgotI2RlZmluZSBTQV9PTkVTSE9UCV9TVl9SRVNFVAotI2RlZmluZSBTQV9OT01BU0sJMHgyMHUKLSNkZWZpbmUgU0FfTk9DTERXQUlUCTB4MTAwdQotI2RlZmluZSBTQV9TSUdJTkZPCTB4MjAwdQotCi0jZGVmaW5lIFNJR19CTE9DSyAgICAgICAgICAweDAxCS8qIGZvciBibG9ja2luZyBzaWduYWxzICovCi0jZGVmaW5lIFNJR19VTkJMT0NLICAgICAgICAweDAyCS8qIGZvciB1bmJsb2NraW5nIHNpZ25hbHMgKi8KLSNkZWZpbmUgU0lHX1NFVE1BU0sgICAgICAgIDB4MDQJLyogZm9yIHNldHRpbmcgdGhlIHNpZ25hbCBtYXNrICovCi0KLS8qCi0gKiBzaWdhbHRzdGFjayBjb250cm9scwotICovCi0jZGVmaW5lIFNTX09OU1RBQ0sJMQotI2RlZmluZSBTU19ESVNBQkxFCTIKLQotI2RlZmluZSBNSU5TSUdTVEtTWgk0MDk2Ci0jZGVmaW5lIFNJR1NUS1NaCTE2Mzg0Ci0KLSNpZmRlZiBfX0tFUk5FTF9fCi0vKgotICogREpIUgotICogU0FfU1RBVElDX0FMTE9DIGlzIHVzZWQgZm9yIHRoZSBTUEFSQyBzeXN0ZW0gdG8gaW5kaWNhdGUgdGhhdCB0aGlzCi0gKiBpbnRlcnJ1cHQgaGFuZGxlcidzIGlycSBzdHJ1Y3R1cmUgc2hvdWxkIGJlIHN0YXRpY2FsbHkgYWxsb2NhdGVkCi0gKiBieSB0aGUgcmVxdWVzdF9pcnEgcm91dGluZS4KLSAqIFRoZSBhbHRlcm5hdGl2ZSBpcyB0aGF0IGFyY2gvc3BhcmMva2VybmVsL2lycS5jIGhhcyBjYXJuYWwga25vd2xlZGdlCi0gKiBvZiBpbnRlcnJ1cHQgdXNhZ2UgYW5kIHRoYXQgc3Vja3MuIEFsc28gd2l0aG91dCBhIGZsYWcgbGlrZSB0aGlzCi0gKiBpdCBtYXkgYmUgcG9zc2libGUgZm9yIHRoZSBmcmVlX2lycSByb3V0aW5lIHRvIGF0dGVtcHQgdG8gZnJlZQotICogc3RhdGljYWxseSBhbGxvY2F0ZWQgZGF0YS4uIHdoaWNoIGlzIE5PVCBHT09ELgotICoKLSAqLwotI2RlZmluZSBTQV9TVEFUSUNfQUxMT0MJCTB4ODAwMAotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9zaWduYWwuaD4KLQotI2lmZGVmIF9fS0VSTkVMX18KLXN0cnVjdCBfX25ld19zaWdhY3Rpb24gewotCV9fc2lnaGFuZGxlcl90CXNhX2hhbmRsZXI7Ci0JdW5zaWduZWQgbG9uZwlzYV9mbGFnczsKLQl2b2lkCQkoKnNhX3Jlc3RvcmVyKSh2b2lkKTsJLyogTm90IHVzZWQgYnkgTGludXgvU1BBUkMgKi8KLQlfX25ld19zaWdzZXRfdAlzYV9tYXNrOwotfTsKLQotc3RydWN0IGtfc2lnYWN0aW9uIHsKLQlzdHJ1Y3QgX19uZXdfc2lnYWN0aW9uCXNhOwotCXZvaWQJCQlfX3VzZXIgKmthX3Jlc3RvcmVyOwotfTsKLQotc3RydWN0IF9fb2xkX3NpZ2FjdGlvbiB7Ci0JX19zaWdoYW5kbGVyX3QJc2FfaGFuZGxlcjsKLQlfX29sZF9zaWdzZXRfdAlzYV9tYXNrOwotCXVuc2lnbmVkIGxvbmcJc2FfZmxhZ3M7Ci0Jdm9pZAkJKCpzYV9yZXN0b3JlcikgKHZvaWQpOwkvKiBub3QgdXNlZCBieSBMaW51eC9TUEFSQyAqLwotfTsKLQotdHlwZWRlZiBzdHJ1Y3Qgc2lnYWx0c3RhY2sgewotCXZvaWQJCV9fdXNlciAqc3Nfc3A7Ci0JaW50CQlzc19mbGFnczsKLQlzaXplX3QJCXNzX3NpemU7Ci19IHN0YWNrX3Q7Ci0KLSNkZWZpbmUgcHRyYWNlX3NpZ25hbF9kZWxpdmVyKHJlZ3MsIGNvb2tpZSkgZG8geyB9IHdoaWxlICgwKQotCi0jZW5kaWYgLyogIShfX0tFUk5FTF9fKSAqLwotCi0jZW5kaWYgLyogIShfX0FTU0VNQkxZX18pICovCi0KLSNlbmRpZiAvKiAhKF9BU01TUEFSQ19TSUdOQUxfSCkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc2lnbmFsXzY0LmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NpZ25hbF82NC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjE1MDlhLi4wMDAwMDAwCi0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc2lnbmFsXzY0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotI2lmbmRlZiBfQVNNU1BBUkM2NF9TSUdOQUxfSAotI2RlZmluZSBfQVNNU1BBUkM2NF9TSUdOQUxfSAotCi0jaW5jbHVkZSA8YXNtL3NpZ2NvbnRleHQuaD4KLQotI2lmZGVmIF9fS0VSTkVMX18KLSNpZm5kZWYgX19BU1NFTUJMWV9fCi0jaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2VuZGlmCi0jZW5kaWYKLQotLyogT24gdGhlIFNwYXJjIHRoZSBzaWduYWwgaGFuZGxlcnMgZ2V0IHBhc3NlZCBhICdzdWItc2lnbmFsJyBjb2RlCi0gKiBmb3IgY2VydGFpbiBzaWduYWwgdHlwZXMsIHdoaWNoIHdlIGRvY3VtZW50IGhlcmUuCi0gKi8KLSNkZWZpbmUgU0lHSFVQCQkgMQotI2RlZmluZSBTSUdJTlQJCSAyCi0jZGVmaW5lIFNJR1FVSVQJCSAzCi0jZGVmaW5lIFNJR0lMTAkJIDQKLSNkZWZpbmUgICAgU1VCU0lHX1NUQUNLICAgICAgIDAKLSNkZWZpbmUgICAgU1VCU0lHX0lMTElOU1QgICAgIDIKLSNkZWZpbmUgICAgU1VCU0lHX1BSSVZJTlNUICAgIDMKLSNkZWZpbmUgICAgU1VCU0lHX0JBRFRSQVAodCkgICgweDgwICsgKHQpKQotCi0jZGVmaW5lIFNJR1RSQVAJCSA1Ci0jZGVmaW5lIFNJR0FCUlQJCSA2Ci0jZGVmaW5lIFNJR0lPVAkJIDYKLQotI2RlZmluZSBTSUdFTVQgICAgICAgICAgIDcKLSNkZWZpbmUgICAgU1VCU0lHX1RBRyAgICAxMAotCi0jZGVmaW5lIFNJR0ZQRQkJIDgKLSNkZWZpbmUgICAgU1VCU0lHX0ZQRElTQUJMRUQgICAgIDB4NDAwCi0jZGVmaW5lICAgIFNVQlNJR19GUEVSUk9SICAgICAgICAweDQwNAotI2RlZmluZSAgICBTVUJTSUdfRlBJTlRPVkZMICAgICAgMHgwMDEKLSNkZWZpbmUgICAgU1VCU0lHX0ZQU1RTSUcgICAgICAgIDB4MDAyCi0jZGVmaW5lICAgIFNVQlNJR19JRElWWkVSTyAgICAgICAweDAxNAotI2RlZmluZSAgICBTVUJTSUdfRlBJTkVYQUNUICAgICAgMHgwYzQKLSNkZWZpbmUgICAgU1VCU0lHX0ZQRElWWkVSTyAgICAgIDB4MGM4Ci0jZGVmaW5lICAgIFNVQlNJR19GUFVORkxPVyAgICAgICAweDBjYwotI2RlZmluZSAgICBTVUJTSUdfRlBPUEVSUk9SICAgICAgMHgwZDAKLSNkZWZpbmUgICAgU1VCU0lHX0ZQT1ZGTE9XICAgICAgIDB4MGQ0Ci0KLSNkZWZpbmUgU0lHS0lMTAkJIDkKLSNkZWZpbmUgU0lHQlVTICAgICAgICAgIDEwCi0jZGVmaW5lICAgIFNVQlNJR19CVVNUSU1FT1VUICAgIDEKLSNkZWZpbmUgICAgU1VCU0lHX0FMSUdOTUVOVCAgICAgMgotI2RlZmluZSAgICBTVUJTSUdfTUlTQ0VSUk9SICAgICA1Ci0KLSNkZWZpbmUgU0lHU0VHVgkJMTEKLSNkZWZpbmUgICAgU1VCU0lHX05PTUFQUElORyAgICAgMwotI2RlZmluZSAgICBTVUJTSUdfUFJPVEVDVElPTiAgICA0Ci0jZGVmaW5lICAgIFNVQlNJR19TRUdFUlJPUiAgICAgIDUKLQotI2RlZmluZSBTSUdTWVMJCTEyCi0KLSNkZWZpbmUgU0lHUElQRQkJMTMKLSNkZWZpbmUgU0lHQUxSTQkJMTQKLSNkZWZpbmUgU0lHVEVSTQkJMTUKLSNkZWZpbmUgU0lHVVJHICAgICAgICAgIDE2Ci0KLS8qIFN1bk9TIHZhbHVlcyB3aGljaCBkZXZpYXRlIGZyb20gdGhlIExpbnV4L2kzODYgb25lcyAqLwotI2RlZmluZSBTSUdTVE9QCQkxNwotI2RlZmluZSBTSUdUU1RQCQkxOAotI2RlZmluZSBTSUdDT05UCQkxOQotI2RlZmluZSBTSUdDSExECQkyMAotI2RlZmluZSBTSUdUVElOCQkyMQotI2RlZmluZSBTSUdUVE9VCQkyMgotI2RlZmluZSBTSUdJTwkJMjMKLSNkZWZpbmUgU0lHUE9MTAkJU0lHSU8gICAvKiBTeXNWIG5hbWUgZm9yIFNJR0lPICovCi0jZGVmaW5lIFNJR1hDUFUJCTI0Ci0jZGVmaW5lIFNJR1hGU1oJCTI1Ci0jZGVmaW5lIFNJR1ZUQUxSTQkyNgotI2RlZmluZSBTSUdQUk9GCQkyNwotI2RlZmluZSBTSUdXSU5DSAkyOAotI2RlZmluZSBTSUdMT1NUCQkyOQotI2RlZmluZSBTSUdQV1IJCVNJR0xPU1QKLSNkZWZpbmUgU0lHVVNSMQkJMzAKLSNkZWZpbmUgU0lHVVNSMgkJMzEKLQotLyogTW9zdCB0aGluZ3Mgc2hvdWxkIGJlIGNsZWFuIGVub3VnaCB0byByZWRlZmluZSB0aGlzIGF0IHdpbGwsIGlmIGNhcmUKLSAgIGlzIHRha2VuIHRvIG1ha2UgbGliYyBtYXRjaC4gICovCi0KLSNkZWZpbmUgX19PTERfTlNJRwkzMgotI2RlZmluZSBfX05FV19OU0lHICAgICAgNjQKLSNkZWZpbmUgX05TSUdfQlBXICAgICAJNjQKLSNkZWZpbmUgX05TSUdfV09SRFMgICAJKF9fTkVXX05TSUcgLyBfTlNJR19CUFcpCi0KLSNkZWZpbmUgU0lHUlRNSU4gICAgICAgMzIKLSNkZWZpbmUgU0lHUlRNQVggICAgICAgX19ORVdfTlNJRwotCi0jaWYgZGVmaW5lZChfX0tFUk5FTF9fKSB8fCBkZWZpbmVkKF9fV0FOVF9QT1NJWDFCX1NJR05BTFNfXykKLSNkZWZpbmUgX05TSUcJCQlfX05FV19OU0lHCi0jZGVmaW5lIF9fbmV3X3NpZ3NldF90CQlzaWdzZXRfdAotI2RlZmluZSBfX25ld19zaWdhY3Rpb24JCXNpZ2FjdGlvbgotI2RlZmluZSBfX25ld19zaWdhY3Rpb24zMglzaWdhY3Rpb24zMgotI2RlZmluZSBfX29sZF9zaWdzZXRfdAkJb2xkX3NpZ3NldF90Ci0jZGVmaW5lIF9fb2xkX3NpZ2FjdGlvbgkJb2xkX3NpZ2FjdGlvbgotI2RlZmluZSBfX29sZF9zaWdhY3Rpb24zMglvbGRfc2lnYWN0aW9uMzIKLSNlbHNlCi0jZGVmaW5lIF9OU0lHCQkJX19PTERfTlNJRwotI2RlZmluZSBOU0lHCQkJX05TSUcKLSNkZWZpbmUgX19vbGRfc2lnc2V0X3QJCXNpZ3NldF90Ci0jZGVmaW5lIF9fb2xkX3NpZ2FjdGlvbgkJc2lnYWN0aW9uCi0jZGVmaW5lIF9fb2xkX3NpZ2FjdGlvbjMyCXNpZ2FjdGlvbjMyCi0jZW5kaWYKLQotI2lmbmRlZiBfX0FTU0VNQkxZX18KLQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIF9fb2xkX3NpZ3NldF90OyAgICAgICAgICAgIC8qIGF0IGxlYXN0IDMyIGJpdHMgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgICAgIHVuc2lnbmVkIGxvbmcgc2lnW19OU0lHX1dPUkRTXTsKLX0gX19uZXdfc2lnc2V0X3Q7Ci0KLS8qIEEgU3VuT1Mgc2lnc3RhY2sgKi8KLXN0cnVjdCBzaWdzdGFjayB7Ci0JLyogWFhYIDMyLWJpdCBwb2ludGVycyBwaW5oZWFkIFhYWCAqLwotCWNoYXIgKnRoZV9zdGFjazsKLQlpbnQgICBjdXJfc3RhdHVzOwotfTsKLQotLyogU2lndmVjIGZsYWdzICovCi0jZGVmaW5lIF9TVl9TU1RBQ0sgICAgMXUgICAgLyogVGhpcyBzaWduYWwgaGFuZGxlciBzaG91bGQgdXNlIHNpZy1zdGFjayAqLwotI2RlZmluZSBfU1ZfSU5UUiAgICAgIDJ1ICAgIC8qIFNpZyByZXR1cm4gc2hvdWxkIG5vdCByZXN0YXJ0IHN5c3RlbSBjYWxsICovCi0jZGVmaW5lIF9TVl9SRVNFVCAgICAgNHUgICAgLyogU2V0IGhhbmRsZXIgdG8gU0lHX0RGTCB1cG9uIHRha2VuIHNpZ25hbCAqLwotI2RlZmluZSBfU1ZfSUdOQ0hJTEQgIDh1ICAgIC8qIERvIG5vdCBzZW5kIFNJR0NITEQgKi8KLQotLyoKLSAqIHNhX2ZsYWdzIHZhbHVlczogU0FfU1RBQ0sgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQsIGJ1dCB3aWxsIGFsbG93IHRoZQotICogdXNhZ2Ugb2Ygc2lnbmFsIHN0YWNrcyBieSB1c2luZyB0aGUgKG5vdyBvYnNvbGV0ZSkgc2FfcmVzdG9yZXIgZmllbGQgaW4KLSAqIHRoZSBzaWdhY3Rpb24gc3RydWN0dXJlIGFzIGEgc3RhY2sgcG9pbnRlci4gVGhpcyBpcyBub3cgcG9zc2libGUgZHVlIHRvCi0gKiB0aGUgY2hhbmdlcyBpbiBzaWduYWwgaGFuZGxpbmcuIExCVCAwMTA0OTMuCi0gKiBTQV9SRVNUQVJUIGZsYWcgdG8gZ2V0IHJlc3RhcnRpbmcgc2lnbmFscyAod2hpY2ggd2VyZSB0aGUgZGVmYXVsdCBsb25nIGFnbykKLSAqLwotI2RlZmluZSBTQV9OT0NMRFNUT1AJX1NWX0lHTkNISUxECi0jZGVmaW5lIFNBX1NUQUNLCV9TVl9TU1RBQ0sKLSNkZWZpbmUgU0FfT05TVEFDSwlfU1ZfU1NUQUNLCi0jZGVmaW5lIFNBX1JFU1RBUlQJX1NWX0lOVFIKLSNkZWZpbmUgU0FfT05FU0hPVAlfU1ZfUkVTRVQKLSNkZWZpbmUgU0FfTk9NQVNLCTB4MjB1Ci0jZGVmaW5lIFNBX05PQ0xEV0FJVCAgICAweDEwMHUKLSNkZWZpbmUgU0FfU0lHSU5GTyAgICAgIDB4MjAwdQotCi0KLSNkZWZpbmUgU0lHX0JMT0NLICAgICAgICAgIDB4MDEJLyogZm9yIGJsb2NraW5nIHNpZ25hbHMgKi8KLSNkZWZpbmUgU0lHX1VOQkxPQ0sgICAgICAgIDB4MDIJLyogZm9yIHVuYmxvY2tpbmcgc2lnbmFscyAqLwotI2RlZmluZSBTSUdfU0VUTUFTSyAgICAgICAgMHgwNAkvKiBmb3Igc2V0dGluZyB0aGUgc2lnbmFsIG1hc2sgKi8KLQotLyoKLSAqIHNpZ2FsdHN0YWNrIGNvbnRyb2xzCi0gKi8KLSNkZWZpbmUgU1NfT05TVEFDSwkxCi0jZGVmaW5lIFNTX0RJU0FCTEUJMgotCi0jZGVmaW5lIE1JTlNJR1NUS1NaCTQwOTYKLSNkZWZpbmUgU0lHU1RLU1oJMTYzODQKLQotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NpZ25hbC5oPgotCi1zdHJ1Y3QgX19uZXdfc2lnYWN0aW9uIHsKLQlfX3NpZ2hhbmRsZXJfdAkJc2FfaGFuZGxlcjsKLQl1bnNpZ25lZCBsb25nCQlzYV9mbGFnczsKLQlfX3NpZ3Jlc3RvcmVfdCAJCXNhX3Jlc3RvcmVyOyAgLyogbm90IHVzZWQgYnkgTGludXgvU1BBUkMgeWV0ICovCi0JX19uZXdfc2lnc2V0X3QJCXNhX21hc2s7Ci19OwotCi1zdHJ1Y3QgX19vbGRfc2lnYWN0aW9uIHsKLQlfX3NpZ2hhbmRsZXJfdCAgCXNhX2hhbmRsZXI7Ci0JX19vbGRfc2lnc2V0X3QgIAlzYV9tYXNrOwotCXVuc2lnbmVkIGxvbmcgICAJc2FfZmxhZ3M7Ci0Jdm9pZCAJCQkoKnNhX3Jlc3RvcmVyKSh2b2lkKTsgICAgIC8qIG5vdCB1c2VkIGJ5IExpbnV4L1NQQVJDIHlldCAqLwotfTsKLQotdHlwZWRlZiBzdHJ1Y3Qgc2lnYWx0c3RhY2sgewotCXZvaWQJCQlfX3VzZXIgKnNzX3NwOwotCWludAkJCXNzX2ZsYWdzOwotCXNpemVfdAkJCXNzX3NpemU7Ci19IHN0YWNrX3Q7Ci0KLSNpZmRlZiBfX0tFUk5FTF9fCi0KLXN0cnVjdCBrX3NpZ2FjdGlvbiB7Ci0Jc3RydWN0IF9fbmV3X3NpZ2FjdGlvbiAJc2E7Ci0Jdm9pZCBfX3VzZXIJCSprYV9yZXN0b3JlcjsKLX07Ci0KLSNkZWZpbmUgcHRyYWNlX3NpZ25hbF9kZWxpdmVyKHJlZ3MsIGNvb2tpZSkgZG8geyB9IHdoaWxlICgwKQotCi0jZW5kaWYgLyogIShfX0tFUk5FTF9fKSAqLwotCi0jZW5kaWYgLyogIShfX0FTU0VNQkxZX18pICovCi0KLSNlbmRpZiAvKiAhKF9BU01TUEFSQzY0X1NJR05BTF9IKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zbXBfMzIuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc21wXzMyLmgKaW5kZXggODQwOGQ5ZC4uNTgxMDFkYyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zbXBfMzIuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NtcF8zMi5oCkBAIC0xNzAsNyArMTcwLDQgQEAKICNkZWZpbmUgc21wX3NldHVwX2NwdV9wb3NzaWJsZV9tYXAoKSBkbyB7IH0gd2hpbGUgKDApCiAKICNlbmRpZiAvKiAhKFNNUCkgKi8KLQotI2RlZmluZSBOT19QUk9DX0lEICAgICAgICAgICAgMHhGRgotCiAjZW5kaWYgLyogIShfU1BBUkNfU01QX0gpICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3N0YXQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc3RhdC5oCmluZGV4IGQ4MTUzMDEuLjU1ZGI1ZWMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc3RhdC5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc3RhdC5oCkBAIC0xLDggKzEsMTA3IEBACi0jaWZuZGVmIF9fX0FTTV9TUEFSQ19TVEFUX0gKLSNkZWZpbmUgX19fQVNNX1NQQVJDX1NUQVRfSAorI2lmbmRlZiBfX1NQQVJDX1NUQVRfSAorI2RlZmluZSBfX1NQQVJDX1NUQVRfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKwogI2lmIGRlZmluZWQoX19zcGFyY19fKSAmJiBkZWZpbmVkKF9fYXJjaDY0X18pCi0jaW5jbHVkZSA8YXNtL3N0YXRfNjQuaD4KKy8qIDY0IGJpdCBzcGFyYyAqLworc3RydWN0IHN0YXQgeworCXVuc2lnbmVkICAgc3RfZGV2OworCWlub190ICAgc3RfaW5vOworCW1vZGVfdCAgc3RfbW9kZTsKKwlzaG9ydCAgIHN0X25saW5rOworCXVpZF90ICAgc3RfdWlkOworCWdpZF90ICAgc3RfZ2lkOworCXVuc2lnbmVkICAgc3RfcmRldjsKKwlvZmZfdCAgIHN0X3NpemU7CisJdGltZV90ICBzdF9hdGltZTsKKwl0aW1lX3QgIHN0X210aW1lOworCXRpbWVfdCAgc3RfY3RpbWU7CisJb2ZmX3QgICBzdF9ibGtzaXplOworCW9mZl90ICAgc3RfYmxvY2tzOworCXVuc2lnbmVkIGxvbmcgIF9fdW51c2VkNFsyXTsKK307CisKK3N0cnVjdCBzdGF0NjQgeworCXVuc2lnbmVkIGxvbmcJc3RfZGV2OworCXVuc2lnbmVkIGxvbmcJc3RfaW5vOworCXVuc2lnbmVkIGxvbmcJc3Rfbmxpbms7CisKKwl1bnNpZ25lZCBpbnQJc3RfbW9kZTsKKwl1bnNpZ25lZCBpbnQJc3RfdWlkOworCXVuc2lnbmVkIGludAlzdF9naWQ7CisJdW5zaWduZWQgaW50CV9fcGFkMDsKKworCXVuc2lnbmVkIGxvbmcJc3RfcmRldjsKKwlsb25nCQlzdF9zaXplOworCWxvbmcJCXN0X2Jsa3NpemU7CisJbG9uZwkJc3RfYmxvY2tzOworCisJdW5zaWduZWQgbG9uZwlzdF9hdGltZTsKKwl1bnNpZ25lZCBsb25nCXN0X2F0aW1lX25zZWM7CisJdW5zaWduZWQgbG9uZwlzdF9tdGltZTsKKwl1bnNpZ25lZCBsb25nCXN0X210aW1lX25zZWM7CisJdW5zaWduZWQgbG9uZwlzdF9jdGltZTsKKwl1bnNpZ25lZCBsb25nCXN0X2N0aW1lX25zZWM7CisJbG9uZwkJX191bnVzZWRbM107Cit9OworCiAjZWxzZQotI2luY2x1ZGUgPGFzbS9zdGF0XzMyLmg+Ci0jZW5kaWYKLSNlbmRpZgorLyogMzIgYml0IHNwYXJjICovCitzdHJ1Y3Qgc3RhdCB7CisJdW5zaWduZWQgc2hvcnQJc3RfZGV2OworCWlub190CQlzdF9pbm87CisJbW9kZV90CQlzdF9tb2RlOworCXNob3J0CQlzdF9ubGluazsKKwl1aWRfdAkJc3RfdWlkOworCWdpZF90CQlzdF9naWQ7CisJdW5zaWduZWQgc2hvcnQJc3RfcmRldjsKKwlvZmZfdAkJc3Rfc2l6ZTsKKwl0aW1lX3QJCXN0X2F0aW1lOworCXVuc2lnbmVkIGxvbmcJc3RfYXRpbWVfbnNlYzsKKwl0aW1lX3QJCXN0X210aW1lOworCXVuc2lnbmVkIGxvbmcJc3RfbXRpbWVfbnNlYzsKKwl0aW1lX3QJCXN0X2N0aW1lOworCXVuc2lnbmVkIGxvbmcJc3RfY3RpbWVfbnNlYzsKKwlvZmZfdAkJc3RfYmxrc2l6ZTsKKwlvZmZfdAkJc3RfYmxvY2tzOworCXVuc2lnbmVkIGxvbmcJX191bnVzZWQ0WzJdOworfTsKKworI2RlZmluZSBTVEFUX0hBVkVfTlNFQyAxCisKK3N0cnVjdCBzdGF0NjQgeworCXVuc2lnbmVkIGxvbmcgbG9uZyBzdF9kZXY7CisKKwl1bnNpZ25lZCBsb25nIGxvbmcgc3RfaW5vOworCisJdW5zaWduZWQgaW50CXN0X21vZGU7CisJdW5zaWduZWQgaW50CXN0X25saW5rOworCisJdW5zaWduZWQgaW50CXN0X3VpZDsKKwl1bnNpZ25lZCBpbnQJc3RfZ2lkOworCisJdW5zaWduZWQgbG9uZyBsb25nIHN0X3JkZXY7CisKKwl1bnNpZ25lZCBjaGFyCV9fcGFkM1s4XTsKKworCWxvbmcgbG9uZwlzdF9zaXplOworCXVuc2lnbmVkIGludAlzdF9ibGtzaXplOworCisJdW5zaWduZWQgY2hhcglfX3BhZDRbOF07CisJdW5zaWduZWQgaW50CXN0X2Jsb2NrczsKKworCXVuc2lnbmVkIGludAlzdF9hdGltZTsKKwl1bnNpZ25lZCBpbnQJc3RfYXRpbWVfbnNlYzsKKworCXVuc2lnbmVkIGludAlzdF9tdGltZTsKKwl1bnNpZ25lZCBpbnQJc3RfbXRpbWVfbnNlYzsKKworCXVuc2lnbmVkIGludAlzdF9jdGltZTsKKwl1bnNpZ25lZCBpbnQJc3RfY3RpbWVfbnNlYzsKKworCXVuc2lnbmVkIGludAlfX3VudXNlZDQ7CisJdW5zaWduZWQgaW50CV9fdW51c2VkNTsKK307CisjZW5kaWYgLyogZGVmaW5lZChfX3NwYXJjX18pICYmIGRlZmluZWQoX19hcmNoNjRfXykgKi8KKyNlbmRpZiAvKiBfX1NQQVJDX1NUQVRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zdGF0XzMyLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3N0YXRfMzIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI5OWUxZDUuLjAwMDAwMDAKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zdGF0XzMyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0jaWZuZGVmIF9TUEFSQ19TVEFUX0gKLSNkZWZpbmUgX1NQQVJDX1NUQVRfSAotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQotc3RydWN0IF9fb2xkX2tlcm5lbF9zdGF0IHsKLQl1bnNpZ25lZCBzaG9ydCBzdF9kZXY7Ci0JdW5zaWduZWQgc2hvcnQgc3RfaW5vOwotCXVuc2lnbmVkIHNob3J0IHN0X21vZGU7Ci0JdW5zaWduZWQgc2hvcnQgc3Rfbmxpbms7Ci0JdW5zaWduZWQgc2hvcnQgc3RfdWlkOwotCXVuc2lnbmVkIHNob3J0IHN0X2dpZDsKLQl1bnNpZ25lZCBzaG9ydCBzdF9yZGV2OwotCXVuc2lnbmVkIGxvbmcgIHN0X3NpemU7Ci0JdW5zaWduZWQgbG9uZyAgc3RfYXRpbWU7Ci0JdW5zaWduZWQgbG9uZyAgc3RfbXRpbWU7Ci0JdW5zaWduZWQgbG9uZyAgc3RfY3RpbWU7Ci19OwotCi1zdHJ1Y3Qgc3RhdCB7Ci0JdW5zaWduZWQgc2hvcnQJc3RfZGV2OwotCXVuc2lnbmVkIGxvbmcJc3RfaW5vOwotCXVuc2lnbmVkIHNob3J0CXN0X21vZGU7Ci0Jc2hvcnQJCXN0X25saW5rOwotCXVuc2lnbmVkIHNob3J0CXN0X3VpZDsKLQl1bnNpZ25lZCBzaG9ydAlzdF9naWQ7Ci0JdW5zaWduZWQgc2hvcnQJc3RfcmRldjsKLQlsb25nCQlzdF9zaXplOwotCWxvbmcJCXN0X2F0aW1lOwotCXVuc2lnbmVkIGxvbmcJc3RfYXRpbWVfbnNlYzsKLQlsb25nCQlzdF9tdGltZTsKLQl1bnNpZ25lZCBsb25nCXN0X210aW1lX25zZWM7Ci0JbG9uZwkJc3RfY3RpbWU7Ci0JdW5zaWduZWQgbG9uZwlzdF9jdGltZV9uc2VjOwotCWxvbmcJCXN0X2Jsa3NpemU7Ci0JbG9uZwkJc3RfYmxvY2tzOwotCXVuc2lnbmVkIGxvbmcJX191bnVzZWQ0WzJdOwotfTsKLQotI2RlZmluZSBTVEFUX0hBVkVfTlNFQyAxCi0KLXN0cnVjdCBzdGF0NjQgewotCXVuc2lnbmVkIGxvbmcgbG9uZyBzdF9kZXY7Ci0KLQl1bnNpZ25lZCBsb25nIGxvbmcgc3RfaW5vOwotCi0JdW5zaWduZWQgaW50CXN0X21vZGU7Ci0JdW5zaWduZWQgaW50CXN0X25saW5rOwotCi0JdW5zaWduZWQgaW50CXN0X3VpZDsKLQl1bnNpZ25lZCBpbnQJc3RfZ2lkOwotCi0JdW5zaWduZWQgbG9uZyBsb25nIHN0X3JkZXY7Ci0KLQl1bnNpZ25lZCBjaGFyCV9fcGFkM1s4XTsKLQotCWxvbmcgbG9uZwlzdF9zaXplOwotCXVuc2lnbmVkIGludAlzdF9ibGtzaXplOwotCi0JdW5zaWduZWQgY2hhcglfX3BhZDRbOF07Ci0JdW5zaWduZWQgaW50CXN0X2Jsb2NrczsKLQotCXVuc2lnbmVkIGludAlzdF9hdGltZTsKLQl1bnNpZ25lZCBpbnQJc3RfYXRpbWVfbnNlYzsKLQotCXVuc2lnbmVkIGludAlzdF9tdGltZTsKLQl1bnNpZ25lZCBpbnQJc3RfbXRpbWVfbnNlYzsKLQotCXVuc2lnbmVkIGludAlzdF9jdGltZTsKLQl1bnNpZ25lZCBpbnQJc3RfY3RpbWVfbnNlYzsKLQotCXVuc2lnbmVkIGludAlfX3VudXNlZDQ7Ci0JdW5zaWduZWQgaW50CV9fdW51c2VkNTsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zdGF0XzY0LmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3N0YXRfNjQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY1MGZkZS4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3N0YXRfNjQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLSNpZm5kZWYgX1NQQVJDNjRfU1RBVF9ICi0jZGVmaW5lIF9TUEFSQzY0X1NUQVRfSAotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQotc3RydWN0IHN0YXQgewotCXVuc2lnbmVkICAgc3RfZGV2OwotCWlub190ICAgc3RfaW5vOwotCW1vZGVfdCAgc3RfbW9kZTsKLQlzaG9ydCAgIHN0X25saW5rOwotCXVpZF90ICAgc3RfdWlkOwotCWdpZF90ICAgc3RfZ2lkOwotCXVuc2lnbmVkICAgc3RfcmRldjsKLQlvZmZfdCAgIHN0X3NpemU7Ci0JdGltZV90ICBzdF9hdGltZTsKLQl0aW1lX3QgIHN0X210aW1lOwotCXRpbWVfdCAgc3RfY3RpbWU7Ci0Jb2ZmX3QgICBzdF9ibGtzaXplOwotCW9mZl90ICAgc3RfYmxvY2tzOwotCXVuc2lnbmVkIGxvbmcgIF9fdW51c2VkNFsyXTsKLX07Ci0KLXN0cnVjdCBzdGF0NjQgewotCXVuc2lnbmVkIGxvbmcJc3RfZGV2OwotCXVuc2lnbmVkIGxvbmcJc3RfaW5vOwotCXVuc2lnbmVkIGxvbmcJc3Rfbmxpbms7Ci0KLQl1bnNpZ25lZCBpbnQJc3RfbW9kZTsKLQl1bnNpZ25lZCBpbnQJc3RfdWlkOwotCXVuc2lnbmVkIGludAlzdF9naWQ7Ci0JdW5zaWduZWQgaW50CV9fcGFkMDsKLQotCXVuc2lnbmVkIGxvbmcJc3RfcmRldjsKLQlsb25nCQlzdF9zaXplOwotCWxvbmcJCXN0X2Jsa3NpemU7Ci0JbG9uZwkJc3RfYmxvY2tzOwotCi0JdW5zaWduZWQgbG9uZwlzdF9hdGltZTsKLQl1bnNpZ25lZCBsb25nCXN0X2F0aW1lX25zZWM7Ci0JdW5zaWduZWQgbG9uZwlzdF9tdGltZTsKLQl1bnNpZ25lZCBsb25nCXN0X210aW1lX25zZWM7Ci0JdW5zaWduZWQgbG9uZwlzdF9jdGltZTsKLQl1bnNpZ25lZCBsb25nCXN0X2N0aW1lX25zZWM7Ci0JbG9uZwkJX191bnVzZWRbM107Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc3dhYi5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zd2FiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM0YWQwNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc3dhYi5oCkBAIC0wLDAgKzEsNDUgQEAKKyNpZm5kZWYgX1NQQVJDX1NXQUJfSAorI2RlZmluZSBfU1BBUkNfU1dBQl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9hc2kuaD4KKworI2lmIGRlZmluZWQoX19zcGFyY19fKSAmJiBkZWZpbmVkKF9fYXJjaDY0X18pCitzdGF0aWMgaW5saW5lIF9fdTE2IF9fYXJjaF9zd2FiMTZwKGNvbnN0IF9fdTE2ICphZGRyKQoreworCV9fdTE2IHJldDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgibGR1aGEgWyUxXSAlMiwgJTAiCisJCQkgICAgICA6ICI9ciIgKHJldCkKKwkJCSAgICAgIDogInIiIChhZGRyKSwgImkiIChBU0lfUEwpKTsKKwlyZXR1cm4gcmV0OworfQorI2RlZmluZSBfX2FyY2hfc3dhYjE2cCBfX2FyY2hfc3dhYjE2cAorCitzdGF0aWMgaW5saW5lIF9fdTMyIF9fYXJjaF9zd2FiMzJwKGNvbnN0IF9fdTMyICphZGRyKQoreworCV9fdTMyIHJldDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgibGR1d2EgWyUxXSAlMiwgJTAiCisJCQkgICAgICA6ICI9ciIgKHJldCkKKwkJCSAgICAgIDogInIiIChhZGRyKSwgImkiIChBU0lfUEwpKTsKKwlyZXR1cm4gcmV0OworfQorI2RlZmluZSBfX2FyY2hfc3dhYjMycCBfX2FyY2hfc3dhYjMycAorCitzdGF0aWMgaW5saW5lIF9fdTY0IF9fYXJjaF9zd2FiNjRwKGNvbnN0IF9fdTY0ICphZGRyKQoreworCV9fdTY0IHJldDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgibGR4YSBbJTFdICUyLCAlMCIKKwkJCSAgICAgIDogIj1yIiAocmV0KQorCQkJICAgICAgOiAiciIgKGFkZHIpLCAiaSIgKEFTSV9QTCkpOworCXJldHVybiByZXQ7Cit9CisjZGVmaW5lIF9fYXJjaF9zd2FiNjRwIF9fYXJjaF9zd2FiNjRwCisKKyNlbHNlCisjZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KKyNlbmRpZiAvKiBkZWZpbmVkKF9fc3BhcmNfXykgJiYgZGVmaW5lZChfX2FyY2g2NF9fKSAqLworCisjZW5kaWYgLyogX1NQQVJDX1NXQUJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90aHJlYWRfaW5mb18zMi5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90aHJlYWRfaW5mb18zMi5oCmluZGV4IDgwZmU1NDcuLjBmN2IwZTUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdGhyZWFkX2luZm9fMzIuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvXzMyLmgKQEAgLTQ1LDcgKzQ1LDcgQEAKIAkvKiBBIHBsYWNlIHRvIHN0b3JlIHVzZXIgd2luZG93cyBhbmQgc3RhY2sgcG9pbnRlcnMKIAkgKiB3aGVuIHRoZSBzdGFjayBuZWVkcyBpbnNwZWN0aW9uLgogCSAqLwotCXN0cnVjdCByZWdfd2luZG93CXJlZ193aW5kb3dbTlNXSU5TXTsJLyogYWxpZ24gZm9yIGxkZCEgKi8KKwlzdHJ1Y3QgcmVnX3dpbmRvdzMyCXJlZ193aW5kb3dbTlNXSU5TXTsJLyogYWxpZ24gZm9yIGxkZCEgKi8KIAl1bnNpZ25lZCBsb25nCQlyd2J1Zl9zdGtwdHJzW05TV0lOU107CiAJdW5zaWduZWQgbG9uZwkJd19zYXZlZDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90aW1lcl82NC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90aW1lcl82NC5oCmluZGV4IDViNzc5ZmQuLmVmM2MzNjggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdGltZXJfNjQuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3RpbWVyXzY0LmgKQEAgLTEwLDcgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAKIHN0cnVjdCBzcGFyYzY0X3RpY2tfb3BzIHsKLQl1bnNpZ25lZCBsb25nICgqZ2V0X3RpY2spKHZvaWQpOworCXVuc2lnbmVkIGxvbmcgbG9uZyAoKmdldF90aWNrKSh2b2lkKTsKIAlpbnQgKCphZGRfY29tcGFyZSkodW5zaWduZWQgbG9uZyk7CiAJdW5zaWduZWQgbG9uZyBzb2Z0aW50X21hc2s7CiAJdm9pZCAoKmRpc2FibGVfaXJxKSh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdHJhcHMuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdHJhcHMuaAppbmRleCBiZWJkYmY4Li4zYWE2MmRkIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3RyYXBzLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90cmFwcy5oCkBAIC0xMCw3ICsxMCw3IEBACiAjZGVmaW5lIE5VTV9TUEFSQ19UUkFQUyAgMjU1CiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCi0KKyNpZmRlZiBfX0tFUk5FTF9fCiAvKiBUaGlzIGlzIGZvciBWOCBjb21wbGlhbnQgU3BhcmMgQ1BVUyAqLwogc3RydWN0IHR0X2VudHJ5IHsKIAl1bnNpZ25lZCBsb25nIGluc3Rfb25lOwpAQCAtMjIsMTQgKzIyLDcgQEAKIC8qIFdlIHNldCB0aGlzIHRvIF9zdGFydCBpbiBzeXN0ZW0gc2V0dXAuICovCiBleHRlcm4gc3RydWN0IHR0X2VudHJ5ICpzcGFyY190dGFibGU7CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfdGJyKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyB0YnI7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygicmQgJSV0YnIsICUwXG5cdCIgOiAiPXIiICh0YnIpKTsKLQlyZXR1cm4gdGJyOwotfQotCisjZW5kaWYgLyogKF9fS0VSTkVMX18pICovCiAjZW5kaWYgLyogIShfX0FTU0VNQkxZX18pICovCiAKIC8qIEZvciBwYXRjaGluZyB0aGUgdHJhcCB0YWJsZSBhdCBib290IHRpbWUsIHdlIG5lZWQgdG8ga25vdyBob3cgdG8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdHlwZXMuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdHlwZXMuaAppbmRleCA4YzI4ZmRlLi4yMjM3MTE4OCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90eXBlcy5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdHlwZXMuaApAQCAtMTEsNyArMTEsNyBAQAogI2lmIGRlZmluZWQoX19zcGFyY19fKSAmJiBkZWZpbmVkKF9fYXJjaDY0X18pCiAKIC8qKiogU1BBUkMgNjQgYml0ICoqKi8KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9pbnQtbDY0Lmg+CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvaW50LWxsNjQuaD4KIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvZHMuYyBiL2FyY2gvc3BhcmMva2VybmVsL2RzLmMKaW5kZXggZjUyZTA1My4uNTdjMzk4NCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvZHMuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9kcy5jCkBAIC0yODYsNyArMjg2LDcgQEAKIAogCXJwID0gKHN0cnVjdCBkc19tZF91cGRhdGVfcmVxICopIChkcGt0ICsgMSk7CiAKLQlwcmludGsoS0VSTl9JTkZPICJkcy0lbHU6IE1hY2hpbmUgZGVzY3JpcHRpb24gdXBkYXRlLlxuIiwgZHAtPmlkKTsKKwlwcmludGsoS0VSTl9JTkZPICJkcy0lbGx1OiBNYWNoaW5lIGRlc2NyaXB0aW9uIHVwZGF0ZS5cbiIsIGRwLT5pZCk7CiAKIAltZGVzY191cGRhdGUoKTsKIApAQCAtMzI1LDcgKzMyNSw3IEBACiAKIAlycCA9IChzdHJ1Y3QgZHNfc2h1dGRvd25fcmVxICopIChkcGt0ICsgMSk7CiAKLQlwcmludGsoS0VSTl9BTEVSVCAiZHMtJWx1OiBTaHV0ZG93biByZXF1ZXN0IGZyb20gIgorCXByaW50ayhLRVJOX0FMRVJUICJkcy0lbGx1OiBTaHV0ZG93biByZXF1ZXN0IGZyb20gIgogCSAgICAgICAiTERPTSBtYW5hZ2VyIHJlY2VpdmVkLlxuIiwgZHAtPmlkKTsKIAogCW1lbXNldCgmcGt0LCAwLCBzaXplb2YocGt0KSk7CkBAIC0zNjUsNyArMzY1LDcgQEAKIAogCXJwID0gKHN0cnVjdCBkc19wYW5pY19yZXEgKikgKGRwa3QgKyAxKTsKIAotCXByaW50ayhLRVJOX0FMRVJUICJkcy0lbHU6IFBhbmljIHJlcXVlc3QgZnJvbSAiCisJcHJpbnRrKEtFUk5fQUxFUlQgImRzLSVsbHU6IFBhbmljIHJlcXVlc3QgZnJvbSAiCiAJICAgICAgICJMRE9NIG1hbmFnZXIgcmVjZWl2ZWQuXG4iLCBkcC0+aWQpOwogCiAJbWVtc2V0KCZwa3QsIDAsIHNpemVvZihwa3QpKTsKQEAgLTU0OSw3ICs1NDksNyBAQAogCWZvcl9lYWNoX2NwdV9tYXNrKGNwdSwgKm1hc2spIHsKIAkJaW50IGVycjsKIAotCQlwcmludGsoS0VSTl9JTkZPICJkcy0lbHU6IFN0YXJ0aW5nIGNwdSAlZC4uLlxuIiwKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZHMtJWxsdTogU3RhcnRpbmcgY3B1ICVkLi4uXG4iLAogCQkgICAgICAgZHAtPmlkLCBjcHUpOwogCQllcnIgPSBjcHVfdXAoY3B1KTsKIAkJaWYgKGVycikgewpAQCAtNTY1LDcgKzU2NSw3IEBACiAJCQkJcmVzID0gRFJfQ1BVX1JFU19DUFVfTk9UX1JFU1BPTkRJTkc7CiAJCQl9CiAKLQkJCXByaW50ayhLRVJOX0lORk8gImRzLSVsdTogQ1BVIHN0YXJ0dXAgZmFpbGVkIGVycj0lZFxuIiwKKwkJCXByaW50ayhLRVJOX0lORk8gImRzLSVsbHU6IENQVSBzdGFydHVwIGZhaWxlZCBlcnI9JWRcbiIsCiAJCQkgICAgICAgZHAtPmlkLCBlcnIpOwogCQkJZHJfY3B1X21hcmsocmVzcCwgY3B1LCBuY3B1cywgcmVzLCBzdGF0KTsKIAkJfQpAQCAtNjA1LDcgKzYwNSw3IEBACiAJZm9yX2VhY2hfY3B1X21hc2soY3B1LCAqbWFzaykgewogCQlpbnQgZXJyOwogCi0JCXByaW50ayhLRVJOX0lORk8gImRzLSVsdTogU2h1dHRpbmcgZG93biBjcHUgJWQuLi5cbiIsCisJCXByaW50ayhLRVJOX0lORk8gImRzLSVsbHU6IFNodXR0aW5nIGRvd24gY3B1ICVkLi4uXG4iLAogCQkgICAgICAgZHAtPmlkLCBjcHUpOwogCQllcnIgPSBjcHVfZG93bihjcHUpOwogCQlpZiAoZXJyKQpAQCAtNjg0LDcgKzY4NCw3IEBACiAKIAlycCA9IChzdHJ1Y3QgZHNfcHJpX21zZyAqKSAoZHBrdCArIDEpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiZHMtJWx1OiBQUkkgUkVRIFslbHg6JWx4XSwgbGVuPSVkXG4iLAorCXByaW50ayhLRVJOX0lORk8gImRzLSVsbHU6IFBSSSBSRVEgWyVsbHg6JWxseF0sIGxlbj0lZFxuIiwKIAkgICAgICAgZHAtPmlkLCBycC0+cmVxX251bSwgcnAtPnR5cGUsIGxlbik7CiB9CiAKQEAgLTgxNiw3ICs4MTYsNyBAQAogCiAJCWlmIChkc192YXJfZG9vcmJlbGwgPT0gMCB8fAogCQkgICAgZHNfdmFyX3Jlc3BvbnNlICE9IERTX1ZBUl9TVUNDRVNTKQotCQkJcHJpbnRrKEtFUk5fRVJSICJkcy0lbHU6IHZhci1jb25maWcgWyVzOiVzXSAiCisJCQlwcmludGsoS0VSTl9FUlIgImRzLSVsbHU6IHZhci1jb25maWcgWyVzOiVzXSAiCiAJCQkgICAgICAgImZhaWxlZCwgcmVzcG9uc2UoJWQpLlxuIiwKIAkJCSAgICAgICBkcC0+aWQsIHZhciwgdmFsdWUsCiAJCQkgICAgICAgZHNfdmFyX3Jlc3BvbnNlKTsKQEAgLTg1MCw3ICs4NTAsNyBAQAogCiBzdGF0aWMgdm9pZCBkc19jb25uX3Jlc2V0KHN0cnVjdCBkc19pbmZvICpkcCkKIHsKLQlwcmludGsoS0VSTl9FUlIgImRzLSVsdTogZHNfY29ubl9yZXNldCgpIGZyb20gJXBcbiIsCisJcHJpbnRrKEtFUk5fRVJSICJkcy0lbGx1OiBkc19jb25uX3Jlc2V0KCkgZnJvbSAlcFxuIiwKIAkgICAgICAgZHAtPmlkLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwogfQogCkBAIC05MTIsMTEgKzkxMiwxMSBAQAogCQlzdHJ1Y3QgZHNfY2FwX3N0YXRlICpjcCA9IGZpbmRfY2FwKGRwLCBhcC0+aGFuZGxlKTsKIAogCQlpZiAoIWNwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImRzLSVsdTogUkVHIEFDSyBmb3IgdW5rbm93biAiCi0JCQkgICAgICAgImhhbmRsZSAlbHhcbiIsIGRwLT5pZCwgYXAtPmhhbmRsZSk7CisJCQlwcmludGsoS0VSTl9FUlIgImRzLSVsbHU6IFJFRyBBQ0sgZm9yIHVua25vd24gIgorCQkJICAgICAgICJoYW5kbGUgJWxseFxuIiwgZHAtPmlkLCBhcC0+aGFuZGxlKTsKIAkJCXJldHVybiAwOwogCQl9Ci0JCXByaW50ayhLRVJOX0lORk8gImRzLSVsdTogUmVnaXN0ZXJlZCAlcyBzZXJ2aWNlLlxuIiwKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZHMtJWxsdTogUmVnaXN0ZXJlZCAlcyBzZXJ2aWNlLlxuIiwKIAkJICAgICAgIGRwLT5pZCwgY3AtPnNlcnZpY2VfaWQpOwogCQljcC0+c3RhdGUgPSBDQVBfU1RBVEVfUkVHSVNURVJFRDsKIAl9IGVsc2UgaWYgKHBrdC0+dHlwZSA9PSBEU19SRUdfTkFDSykgewpAQCAtOTI0LDggKzkyNCw4IEBACiAJCXN0cnVjdCBkc19jYXBfc3RhdGUgKmNwID0gZmluZF9jYXAoZHAsIG5wLT5oYW5kbGUpOwogCiAJCWlmICghY3ApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiZHMtJWx1OiBSRUcgTkFDSyBmb3IgIgotCQkJICAgICAgICJ1bmtub3duIGhhbmRsZSAlbHhcbiIsCisJCQlwcmludGsoS0VSTl9FUlIgImRzLSVsbHU6IFJFRyBOQUNLIGZvciAiCisJCQkgICAgICAgInVua25vd24gaGFuZGxlICVsbHhcbiIsCiAJCQkgICAgICAgZHAtPmlkLCBucC0+aGFuZGxlKTsKIAkJCXJldHVybiAwOwogCQl9CkBAIC05ODIsOCArOTgyLDggQEAKIAkJaW50IHJlcV9sZW4gPSBxcC0+cmVxX2xlbjsKIAogCQlpZiAoIWNwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImRzLSVsdTogRGF0YSBmb3IgdW5rbm93biAiCi0JCQkgICAgICAgImhhbmRsZSAlbHVcbiIsCisJCQlwcmludGsoS0VSTl9FUlIgImRzLSVsbHU6IERhdGEgZm9yIHVua25vd24gIgorCQkJICAgICAgICJoYW5kbGUgJWxsdVxuIiwKIAkJCSAgICAgICBkcC0+aWQsIGRwa3QtPmhhbmRsZSk7CiAKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZkc19sb2NrLCBmbGFncyk7CkBAIC0xMDg1LDcgKzEwODUsNyBAQAogCX0KIAogCWlmIChldmVudCAhPSBMRENfRVZFTlRfREFUQV9SRUFEWSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJkcy0lbHU6IFVuZXhwZWN0ZWQgTERDIGV2ZW50ICVkXG4iLAorCQlwcmludGsoS0VSTl9XQVJOSU5HICJkcy0lbGx1OiBVbmV4cGVjdGVkIExEQyBldmVudCAlZFxuIiwKIAkJICAgICAgIGRwLT5pZCwgZXZlbnQpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc19sb2NrLCBmbGFncyk7CiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2lvbW11LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9pb21tdS5jCmluZGV4IDFjYzE5OTUuLmQ4OTAwZTEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2lvbW11LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvaW9tbXUuYwpAQCAtNDM0LDcgKzQzNCw3IEBACiAJCXZhbCA9IGlvbW11X3JlYWQobWF0Y2hyZWcpOwogCQlpZiAodW5saWtlbHkodmFsKSkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAic3RyYnVmX2ZsdXNoOiBjdHggZmx1c2ggIgotCQkJICAgICAgICJ0aW1lb3V0IG1hdGNocmVnWyVseF0gY3R4WyVseF1cbiIsCisJCQkgICAgICAgInRpbWVvdXQgbWF0Y2hyZWdbJWxseF0gY3R4WyVseF1cbiIsCiAJCQkgICAgICAgdmFsLCBjdHgpOwogCQkJZ290byBkb19wYWdlX2ZsdXNoOwogCQl9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9pcnFfMzIuYyBiL2FyY2gvc3BhcmMva2VybmVsL2lycV8zMi5jCmluZGV4IGYzNDg4YzQuLjFlZmY5NDIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2lycV8zMi5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2lycV8zMi5jCkBAIC02NjksNyArNjY5LDkgQEAKIAlidGZpeHVwKCk7CiB9CiAKKyNpZmRlZiBDT05GSUdfUFJPQ19GUwogdm9pZCBpbml0X2lycV9wcm9jKHZvaWQpCiB7CiAJLyogRm9yIG5vdywgbm90aGluZy4uLiAqLwogfQorI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9rZ2RiXzMyLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9rZ2RiXzMyLmMKaW5kZXggNzU3ODA1Yy4uMDRkZjRlZCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwva2dkYl8zMi5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2tnZGJfMzIuYwpAQCAtMTQsMTQgKzE0LDE0IEBACiAKIHZvaWQgcHRfcmVnc190b19nZGJfcmVncyh1bnNpZ25lZCBsb25nICpnZGJfcmVncywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0Jc3RydWN0IHJlZ193aW5kb3cgKndpbjsKKwlzdHJ1Y3QgcmVnX3dpbmRvdzMyICp3aW47CiAJaW50IGk7CiAKIAlnZGJfcmVnc1tHREJfRzBdID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgMTU7IGkrKykKIAkJZ2RiX3JlZ3NbR0RCX0cxICsgaV0gPSByZWdzLT51X3JlZ3NbVVJFR19HMSArIGldOwogCi0Jd2luID0gKHN0cnVjdCByZWdfd2luZG93ICopIHJlZ3MtPnVfcmVnc1tVUkVHX0ZQXTsKKwl3aW4gPSAoc3RydWN0IHJlZ193aW5kb3czMiAqKSByZWdzLT51X3JlZ3NbVVJFR19GUF07CiAJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKIAkJZ2RiX3JlZ3NbR0RCX0wwICsgaV0gPSB3aW4tPmxvY2Fsc1tpXTsKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQpAQCAtNDMsNyArNDMsNyBAQAogdm9pZCBzbGVlcGluZ190aHJlYWRfdG9fZ2RiX3JlZ3ModW5zaWduZWQgbG9uZyAqZ2RiX3JlZ3MsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKIHsKIAlzdHJ1Y3QgdGhyZWFkX2luZm8gKnQgPSB0YXNrX3RocmVhZF9pbmZvKHApOwotCXN0cnVjdCByZWdfd2luZG93ICp3aW47CisJc3RydWN0IHJlZ193aW5kb3czMiAqd2luOwogCWludCBpOwogCiAJZm9yIChpID0gR0RCX0cwOyBpIDwgR0RCX0c2OyBpKyspCkBAIC01NSw3ICs1NSw3IEBACiAJZ2RiX3JlZ3NbR0RCX1NQXSA9IHQtPmtzcDsKIAlnZGJfcmVnc1tHREJfTzddID0gMDsKIAotCXdpbiA9IChzdHJ1Y3QgcmVnX3dpbmRvdyAqKSB0LT5rc3A7CisJd2luID0gKHN0cnVjdCByZWdfd2luZG93MzIgKikgdC0+a3NwOwogCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCiAJCWdkYl9yZWdzW0dEQl9MMCArIGldID0gd2luLT5sb2NhbHNbaV07CiAJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKQEAgLTc3LDcgKzc3LDcgQEAKIAogdm9pZCBnZGJfcmVnc190b19wdF9yZWdzKHVuc2lnbmVkIGxvbmcgKmdkYl9yZWdzLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlzdHJ1Y3QgcmVnX3dpbmRvdyAqd2luOworCXN0cnVjdCByZWdfd2luZG93MzIgKndpbjsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCAxNTsgaSsrKQpAQCAtOTYsNyArOTYsNyBAQAogCXJlZ3MtPm5wYyA9IGdkYl9yZWdzW0dEQl9OUENdOwogCXJlZ3MtPnkgPSBnZGJfcmVnc1tHREJfWV07CiAKLQl3aW4gPSAoc3RydWN0IHJlZ193aW5kb3cgKikgcmVncy0+dV9yZWdzW1VSRUdfRlBdOworCXdpbiA9IChzdHJ1Y3QgcmVnX3dpbmRvdzMyICopIHJlZ3MtPnVfcmVnc1tVUkVHX0ZQXTsKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQogCQl3aW4tPmxvY2Fsc1tpXSA9IGdkYl9yZWdzW0dEQl9MMCArIGldOwogCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9rcHJvYmVzLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggMjAxYTZlNS4uM2JjNjUyNyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwva3Byb2Jlcy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2twcm9iZXMuYwpAQCAtNTE3LDcgKzUxNyw3IEBACiAJLyoKIAkgKiBJdCBpcyBwb3NzaWJsZSB0byBoYXZlIG11bHRpcGxlIGluc3RhbmNlcyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbgogCSAqIHRhc2sgZWl0aGVyIGJlY2F1c2UgYW4gbXVsdGlwbGUgZnVuY3Rpb25zIGluIHRoZSBjYWxsIHBhdGgKLQkgKiBoYXZlIGEgcmV0dXJuIHByb2JlIGluc3RhbGxlZCBvbiB0aGVtLCBhbmQvb3IgbW9yZSB0aGVuIG9uZSByZXR1cm4KKwkgKiBoYXZlIGEgcmV0dXJuIHByb2JlIGluc3RhbGxlZCBvbiB0aGVtLCBhbmQvb3IgbW9yZSB0aGFuIG9uZSByZXR1cm4KIAkgKiByZXR1cm4gcHJvYmUgd2FzIHJlZ2lzdGVyZWQgZm9yIGEgdGFyZ2V0IGZ1bmN0aW9uLgogCSAqCiAJICogV2UgY2FuIGhhbmRsZSB0aGlzIGJlY2F1c2U6CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9sZGMuYyBiL2FyY2gvc3BhcmMva2VybmVsL2xkYy5jCmluZGV4IGQ2ODk4MjMzLi42Y2U1ZDI1IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9sZGMuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9sZGMuYwpAQCAtNjI1LDIyICs2MjUsMjMgQEAKIHN0YXRpYyBpbnQgcHJvY2Vzc192ZXJfbmFjayhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCBzdHJ1Y3QgbGRjX3ZlcnNpb24gKnZwKQogewogCXN0cnVjdCBsZGNfdmVyc2lvbiAqdmFwOworCXN0cnVjdCBsZGNfcGFja2V0ICpwOworCXVuc2lnbmVkIGxvbmcgbmV3X3RhaWw7CiAKLQlpZiAoKHZwLT5tYWpvciA9PSAwICYmIHZwLT5taW5vciA9PSAwKSB8fAotCSAgICAhKHZhcCA9IGZpbmRfYnlfbWFqb3IodnAtPm1ham9yKSkpIHsKKwlpZiAodnAtPm1ham9yID09IDAgJiYgdnAtPm1pbm9yID09IDApCiAJCXJldHVybiBsZGNfYWJvcnQobHApOwotCX0gZWxzZSB7Ci0JCXN0cnVjdCBsZGNfcGFja2V0ICpwOwotCQl1bnNpZ25lZCBsb25nIG5ld190YWlsOwogCi0JCXAgPSBoYW5kc2hha2VfY29tcG9zZV9jdHJsKGxwLCBMRENfSU5GTywgTERDX1ZFUlMsCisJdmFwID0gZmluZF9ieV9tYWpvcih2cC0+bWFqb3IpOworCWlmICghdmFwKQorCQlyZXR1cm4gbGRjX2Fib3J0KGxwKTsKKworCXAgPSBoYW5kc2hha2VfY29tcG9zZV9jdHJsKGxwLCBMRENfSU5GTywgTERDX1ZFUlMsCiAJCQkJCSAgIHZhcCwgc2l6ZW9mKCp2YXApLAogCQkJCQkgICAmbmV3X3RhaWwpOwotCQlpZiAocCkKLQkJCXJldHVybiBzZW5kX3R4X3BhY2tldChscCwgcCwgbmV3X3RhaWwpOwotCQllbHNlCi0JCQlyZXR1cm4gbGRjX2Fib3J0KGxwKTsKLQl9CisJaWYgKCFwKQorCQlyZXR1cm4gbGRjX2Fib3J0KGxwKTsKKworCXJldHVybiBzZW5kX3R4X3BhY2tldChscCwgcCwgbmV3X3RhaWwpOwogfQogCiBzdGF0aWMgaW50IHByb2Nlc3NfdmVyc2lvbihzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvbWRlc2MuYyBiL2FyY2gvc3BhcmMva2VybmVsL21kZXNjLmMKaW5kZXggM2M1MzlhNi4uM2Y3OWYwYyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvbWRlc2MuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9tZGVzYy5jCkBAIC01MzYsMjQgKzUzNiwyNCBAQAogCiAJdiA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgcG4sICJob3N0aWQiLCBOVUxMKTsKIAlpZiAodikKLQkJcHJpbnRrKCJQTEFURk9STTogaG9zdGlkIFslMDhseF1cbiIsICp2KTsKKwkJcHJpbnRrKCJQTEFURk9STTogaG9zdGlkIFslMDhsbHhdXG4iLCAqdik7CiAJdiA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgcG4sICJzZXJpYWwjIiwgTlVMTCk7CiAJaWYgKHYpCi0JCXByaW50aygiUExBVEZPUk06IHNlcmlhbCMgWyUwOGx4XVxuIiwgKnYpOworCQlwcmludGsoIlBMQVRGT1JNOiBzZXJpYWwjIFslMDhsbHhdXG4iLCAqdik7CiAJdiA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgcG4sICJzdGljay1mcmVxdWVuY3kiLCBOVUxMKTsKLQlwcmludGsoIlBMQVRGT1JNOiBzdGljay1mcmVxdWVuY3kgWyUwOGx4XVxuIiwgKnYpOworCXByaW50aygiUExBVEZPUk06IHN0aWNrLWZyZXF1ZW5jeSBbJTA4bGx4XVxuIiwgKnYpOwogCXYgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIHBuLCAibWFjLWFkZHJlc3MiLCBOVUxMKTsKIAlpZiAodikKLQkJcHJpbnRrKCJQTEFURk9STTogbWFjLWFkZHJlc3MgWyVseF1cbiIsICp2KTsKKwkJcHJpbnRrKCJQTEFURk9STTogbWFjLWFkZHJlc3MgWyVsbHhdXG4iLCAqdik7CiAJdiA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgcG4sICJ3YXRjaGRvZy1yZXNvbHV0aW9uIiwgTlVMTCk7CiAJaWYgKHYpCi0JCXByaW50aygiUExBVEZPUk06IHdhdGNoZG9nLXJlc29sdXRpb24gWyVsdSBtc11cbiIsICp2KTsKKwkJcHJpbnRrKCJQTEFURk9STTogd2F0Y2hkb2ctcmVzb2x1dGlvbiBbJWxsdSBtc11cbiIsICp2KTsKIAl2ID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBwbiwgIndhdGNoZG9nLW1heC10aW1lb3V0IiwgTlVMTCk7CiAJaWYgKHYpCi0JCXByaW50aygiUExBVEZPUk06IHdhdGNoZG9nLW1heC10aW1lb3V0IFslbHUgbXNdXG4iLCAqdik7CisJCXByaW50aygiUExBVEZPUk06IHdhdGNoZG9nLW1heC10aW1lb3V0IFslbGx1IG1zXVxuIiwgKnYpOwogCXYgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIHBuLCAibWF4LWNwdXMiLCBOVUxMKTsKIAlpZiAodikKLQkJcHJpbnRrKCJQTEFURk9STTogbWF4LWNwdXMgWyVsdV1cbiIsICp2KTsKKwkJcHJpbnRrKCJQTEFURk9STTogbWF4LWNwdXMgWyVsbHVdXG4iLCAqdik7CiAKICNpZmRlZiBDT05GSUdfU01QCiAJewpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvbXVsZGl2LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9tdWxkaXYuYwppbmRleCBiYTk2MGMwLi42Y2UxMDIxIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9tdWxkaXYuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9tdWxkaXYuYwpAQCAtNjAsNyArNjAsNyBAQAogfQogCiAjZGVmaW5lIGZldGNoX3JlZyhyZWcsIHJlZ3MpICh7CQkJCQkJXAotCXN0cnVjdCByZWdfd2luZG93IF9fdXNlciAqd2luOwkJCQkJXAorCXN0cnVjdCByZWdfd2luZG93MzIgX191c2VyICp3aW47CQkJCQlcCiAJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByZXQ7CQkJCQlcCiAJCQkJCQkJCQlcCiAJaWYgKCEocmVnKSkgcmV0ID0gMDsJCQkJCQlcCkBAIC02OCw3ICs2OCw3IEBACiAJCXJldCA9IHJlZ3MtPnVfcmVnc1socmVnKV07CQkJCVwKIAl9IGVsc2UgewkJCQkJCQlcCiAJCS8qIEhvIGh1bSwgdGhlIHNsaWdodGx5IGNvbXBsaWNhdGVkIGNhc2UuICovCQlcCi0JCXdpbiA9IChzdHJ1Y3QgcmVnX3dpbmRvdyBfX3VzZXIgKilyZWdzLT51X3JlZ3NbVVJFR19GUF07XAorCQl3aW4gPSAoc3RydWN0IHJlZ193aW5kb3czMiBfX3VzZXIgKilyZWdzLT51X3JlZ3NbVVJFR19GUF07XAogCQlpZiAoZ2V0X3VzZXIgKHJldCwgJndpbi0+bG9jYWxzWyhyZWcpIC0gMTZdKSkgcmV0dXJuIC0xO1wKIAl9CQkJCQkJCQlcCiAJcmV0OwkJCQkJCQkJXApAQCAtNzcsNyArNzcsNyBAQAogc3RhdGljIGlubGluZSBpbnQKIHN0b3JlX3JlZyh1bnNpZ25lZCBpbnQgcmVzdWx0LCB1bnNpZ25lZCBpbnQgcmVnLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlzdHJ1Y3QgcmVnX3dpbmRvdyBfX3VzZXIgKndpbjsKKwlzdHJ1Y3QgcmVnX3dpbmRvdzMyIF9fdXNlciAqd2luOwogCiAJaWYgKCFyZWcpCiAJCXJldHVybiAwOwpAQCAtODYsNyArODYsNyBAQAogCQlyZXR1cm4gMDsKIAl9IGVsc2UgewogCQkvKiBuZWVkIHRvIHVzZSBwdXRfdXNlcigpIGluIHRoaXMgY2FzZTogKi8KLQkJd2luID0gKHN0cnVjdCByZWdfd2luZG93IF9fdXNlciAqKSByZWdzLT51X3JlZ3NbVVJFR19GUF07CisJCXdpbiA9IChzdHJ1Y3QgcmVnX3dpbmRvdzMyIF9fdXNlciAqKSByZWdzLT51X3JlZ3NbVVJFR19GUF07CiAJCXJldHVybiAocHV0X3VzZXIocmVzdWx0LCAmd2luLT5sb2NhbHNbcmVnIC0gMTZdKSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvb2ZfZGV2aWNlXzY0LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9vZl9kZXZpY2VfNjQuYwppbmRleCA0ODczZjI4Li5iNGExMmM5IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9vZl9kZXZpY2VfNjQuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9vZl9kZXZpY2VfNjQuYwpAQCAtNTU0LDcgKzU1NCw3IEBACiAJCW1lbXNldChyLCAwLCBzaXplb2YoKnIpKTsKIAogCQlpZiAob2ZfcmVzb3VyY2VfdmVyYm9zZSkKLQkJCXByaW50aygiJXMgcmVnWyVkXSAtPiAlbHhcbiIsCisJCQlwcmludGsoIiVzIHJlZ1slZF0gLT4gJWxseFxuIiwKIAkJCSAgICAgICBvcC0+bm9kZS0+ZnVsbF9uYW1lLCBpbmRleCwKIAkJCSAgICAgICByZXN1bHQpOwogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2kuYyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaS5jCmluZGV4IGJkYjdjMGEuLjkyM2U5YmIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3BjaS5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaS5jCkBAIC0yMjMsNyArMjIzLDcgQEAKIAkJCWNvbnRpbnVlOwogCQlpID0gYWRkcnNbMF0gJiAweGZmOwogCQlpZiAob2ZwY2lfdmVyYm9zZSkKLQkJCXByaW50aygiICBzdGFydDogJWx4LCBlbmQ6ICVseCwgaTogJXhcbiIsCisJCQlwcmludGsoIiAgc3RhcnQ6ICVsbHgsIGVuZDogJWxseCwgaTogJXhcbiIsCiAJCQkgICAgICAgb3BfcmVzLT5zdGFydCwgb3BfcmVzLT5lbmQsIGkpOwogCiAJCWlmIChQQ0lfQkFTRV9BRERSRVNTXzAgPD0gaSAmJiBpIDw9IFBDSV9CQVNFX0FERFJFU1NfNSkgewpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX2NvbW1vbi5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX2NvbW1vbi5jCmluZGV4IDIzYjg4MDguLjY0ZTZlZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3BjaV9jb21tb24uYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfY29tbW9uLmMKQEAgLTQ1Nyw3ICs0NTcsNyBAQAogCQlwcm9tX2hhbHQoKTsKIAl9CiAKLQlwcmludGsoIiVzOiBQQ0kgSU9bJWx4XSBNRU1bJWx4XVxuIiwKKwlwcmludGsoIiVzOiBQQ0kgSU9bJWxseF0gTUVNWyVsbHhdXG4iLAogCSAgICAgICBwYm0tPm5hbWUsCiAJICAgICAgIHBibS0+aW9fc3BhY2Uuc3RhcnQsCiAJICAgICAgIHBibS0+bWVtX3NwYWNlLnN0YXJ0KTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3BjaV9tc2kuYyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaV9tc2kuYwppbmRleCA0ZWYyODJlLi5mMWJlMzdhIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfbXNpLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX21zaS5jCkBAIC00MjYsOCArNDI2LDggQEAKIAkJICAgICAgIHBibS0+bmFtZSwKIAkJICAgICAgIHBibS0+bXNpX2ZpcnN0LCBwYm0tPm1zaV9udW0sIHBibS0+bXNpX2RhdGFfbWFzaywKIAkJICAgICAgIHBibS0+bXNpeF9kYXRhX3dpZHRoKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1TSSBhZGRyMzJbMHglbHg6MHgleF0gIgotCQkgICAgICAgImFkZHI2NFsweCVseDoweCV4XVxuIiwKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1TSSBhZGRyMzJbMHglbGx4OjB4JXhdICIKKwkJICAgICAgICJhZGRyNjRbMHglbGx4OjB4JXhdXG4iLAogCQkgICAgICAgcGJtLT5uYW1lLAogCQkgICAgICAgcGJtLT5tc2kzMl9zdGFydCwgcGJtLT5tc2kzMl9sZW4sCiAJCSAgICAgICBwYm0tPm1zaTY0X3N0YXJ0LCBwYm0tPm1zaTY0X2xlbik7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfcHN5Y2hvLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfcHN5Y2hvLmMKaW5kZXggZGZiM2VjOC4uM2IzNDM0NCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3BzeWNoby5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaV9wc3ljaG8uYwpAQCAtMzA3LDEwICszMDcsNyBAQAogCiAJLyogV2UgcmVhbGx5IG1lYW4gdG8gaWdub3JlIHRoZSByZXR1cm4gcmVzdWx0IGhlcmUuICBUd28KIAkgKiBQQ0kgY29udHJvbGxlciBzaGFyZSB0aGUgc2FtZSBpbnRlcnJ1cHQgbnVtYmVycyBhbmQKLQkgKiBkcml2ZSB0aGUgc2FtZSBmcm9udC1lbmQgaGFyZHdhcmUuICBXaGljaGV2ZXIgb2YgdGhlCi0JICogdHdvIGdldCBpbiBoZXJlIGZpcnN0IHdpbGwgcmVnaXN0ZXIgdGhlIElSUSBoYW5kbGVyCi0JICogdGhlIHNlY29uZCB3aWxsIGp1c3QgZXJyb3Igb3V0IHNpbmNlIHdlIGRvIG5vdCBwYXNzIGluCi0JICogSVJRRl9TSEFSRUQuCisJICogZHJpdmUgdGhlIHNhbWUgZnJvbnQtZW5kIGhhcmR3YXJlLgogCSAqLwogCWVyciA9IHJlcXVlc3RfaXJxKG9wLT5pcnFzWzFdLCBwc3ljaG9fdWVfaW50ciwgSVJRRl9TSEFSRUQsCiAJCQkgICJQU1lDSE9fVUUiLCBwYm0pOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3NjaGl6by5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3NjaGl6by5jCmluZGV4IDQ1ZDlkYmEuLjJiNWNkZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3BjaV9zY2hpem8uYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfc2NoaXpvLmMKQEAgLTc5NCw3ICs3OTQsNyBAQAogCQkgICBwYm0tPmNvbnRyb2xsZXJfcmVncyArIFNDSElaT19TQUZBUklfRVJSTE9HKTsKIAogCWlmICghKGVycmxvZyAmIEJVU19FUlJPUl9VTk1BUCkpIHsKLQkJcHJpbnRrKCIlczogVW5leHBlY3RlZCBTYWZhcmkvSkJVUyBlcnJvciBpbnRlcnJ1cHQsIGVycmxvZ1slMDE2bHhdXG4iLAorCQlwcmludGsoIiVzOiBVbmV4cGVjdGVkIFNhZmFyaS9KQlVTIGVycm9yIGludGVycnVwdCwgZXJybG9nWyUwMTZsbHhdXG4iLAogCQkgICAgICAgcGJtLT5uYW1lLCBlcnJsb2cpOwogCiAJCXJldHVybiBJUlFfSEFORExFRDsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3BjaV9zdW40di5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3N1bjR2LmMKaW5kZXggMzRhMWZkZS4uMGVmMGFiMyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3N1bjR2LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3N1bjR2LmMKQEAgLTczLDcgKzczLDcgQEAKIAkJaWYgKHVubGlrZWx5KG51bSA8IDApKSB7CiAJCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQogCQkJCXByaW50aygiaW9tbXVfYmF0Y2hfZmx1c2g6IElPTU1VIG1hcCBvZiAiCi0JCQkJICAgICAgICJbJTA4bHg6JTA4bHg6JWx4OiVseDolbHhdIGZhaWxlZCB3aXRoICIKKwkJCQkgICAgICAgIlslMDhseDolMDhsbHg6JWx4OiVseDolbHhdIGZhaWxlZCB3aXRoICIKIAkJCQkgICAgICAgInN0YXR1cyAlbGRcbiIsCiAJCQkJICAgICAgIGRldmhhbmRsZSwgSFZfUENJX1RTQklEKDAsIGVudHJ5KSwKIAkJCQkgICAgICAgbnBhZ2VzLCBwcm90LCBfX3BhKHBnbGlzdCksIG51bSk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wb3dlci5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcG93ZXIuYwppbmRleCAwNzZjYWQ3Li5hZTg4ZjA2IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wb3dlci5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3Bvd2VyLmMKQEAgLTQwLDcgKzQwLDcgQEAKIAogCXBvd2VyX3JlZyA9IG9mX2lvcmVtYXAocmVzLCAwLCAweDQsICJwb3dlciIpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENvbnRyb2wgcmVnIGF0ICVseFxuIiwKKwlwcmludGsoS0VSTl9JTkZPICIlczogQ29udHJvbCByZWcgYXQgJWxseFxuIiwKIAkgICAgICAgb3AtPm5vZGUtPm5hbWUsIHJlcy0+c3RhcnQpOwogCiAJaWYgKGhhc19idXR0b25faW50ZXJydXB0KGlycSwgb3AtPm5vZGUpKSB7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wcm9jZXNzXzMyLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wcm9jZXNzXzMyLmMKaW5kZXggNjlkOTMxNS4uNWE4ZDhjZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcHJvY2Vzc18zMi5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3Byb2Nlc3NfMzIuYwpAQCAtMTgwLDEzICsxODAsMTMgQEAKIAogdm9pZCBfX3Nob3dfYmFja3RyYWNlKHVuc2lnbmVkIGxvbmcgZnApCiB7Ci0Jc3RydWN0IHJlZ193aW5kb3cgKnJ3OworCXN0cnVjdCByZWdfd2luZG93MzIgKnJ3OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZzcGFyY19iYWNrdHJhY2VfbG9jaywgZmxhZ3MpOwogCi0JcncgPSAoc3RydWN0IHJlZ193aW5kb3cgKilmcDsKKwlydyA9IChzdHJ1Y3QgcmVnX3dpbmRvdzMyICopZnA7CiAgICAgICAgIHdoaWxlKHJ3ICYmICgoKHVuc2lnbmVkIGxvbmcpIHJ3KSA+PSBQQUdFX09GRlNFVCkgJiYKICAgICAgICAgICAgICEoKCh1bnNpZ25lZCBsb25nKSBydykgJiAweDcpKSB7CiAJCXByaW50aygiQ1BVWyVkXTogQVJHU1slMDhseCwlMDhseCwlMDhseCwlMDhseCwlMDhseCwlMDhseF0gIgpAQCAtMTk2LDcgKzE5Niw3IEBACiAJCSAgICAgICBydy0+aW5zWzZdLAogCQkgICAgICAgcnctPmluc1s3XSk7CiAJCXByaW50aygiJXBTXG4iLCAodm9pZCAqKSBydy0+aW5zWzddKTsKLQkJcncgPSAoc3RydWN0IHJlZ193aW5kb3cgKikgcnctPmluc1s2XTsKKwkJcncgPSAoc3RydWN0IHJlZ193aW5kb3czMiAqKSBydy0+aW5zWzZdOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcGFyY19iYWNrdHJhY2VfbG9jaywgZmxhZ3MpOwogfQpAQCAtMjU4LDcgKzI1OCw3IEBACiAKIHZvaWQgc2hvd19yZWdzKHN0cnVjdCBwdF9yZWdzICpyKQogewotCXN0cnVjdCByZWdfd2luZG93ICpydyA9IChzdHJ1Y3QgcmVnX3dpbmRvdyAqKSByLT51X3JlZ3NbMTRdOworCXN0cnVjdCByZWdfd2luZG93MzIgKnJ3ID0gKHN0cnVjdCByZWdfd2luZG93MzIgKikgci0+dV9yZWdzWzE0XTsKIAogICAgICAgICBwcmludGsoIlBTUjogJTA4bHggUEM6ICUwOGx4IE5QQzogJTA4bHggWTogJTA4bHggICAgJXNcbiIsCiAJICAgICAgIHItPnBzciwgci0+cGMsIHItPm5wYywgci0+eSwgcHJpbnRfdGFpbnRlZCgpKTsKQEAgLTI4Nyw3ICsyODcsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgcGMsIGZwOwogCXVuc2lnbmVkIGxvbmcgdGFza19iYXNlOwotCXN0cnVjdCByZWdfd2luZG93ICpydzsKKwlzdHJ1Y3QgcmVnX3dpbmRvdzMyICpydzsKIAlpbnQgY291bnQgPSAwOwogCiAJaWYgKHRzayAhPSBOVUxMKQpAQCAtMzAxLDcgKzMwMSw3IEBACiAJCWlmIChmcCA8ICh0YXNrX2Jhc2UgKyBzaXplb2Yoc3RydWN0IHRocmVhZF9pbmZvKSkgfHwKIAkJICAgIGZwID49ICh0YXNrX2Jhc2UgKyAoUEFHRV9TSVpFIDw8IDEpKSkKIAkJCWJyZWFrOwotCQlydyA9IChzdHJ1Y3QgcmVnX3dpbmRvdyAqKSBmcDsKKwkJcncgPSAoc3RydWN0IHJlZ193aW5kb3czMiAqKSBmcDsKIAkJcGMgPSBydy0+aW5zWzddOwogCQlwcmludGsoIlslMDhseCA6ICIsIHBjKTsKIAkJcHJpbnRrKCIlcFMgXSAiLCAodm9pZCAqKSBwYyk7CkBAIC02NzksNyArNjc5LDcgQEAKIAl1bnNpZ25lZCBsb25nIHBjLCBmcCwgYmlhcyA9IDA7CiAJdW5zaWduZWQgbG9uZyB0YXNrX2Jhc2UgPSAodW5zaWduZWQgbG9uZykgdGFzazsKICAgICAgICAgdW5zaWduZWQgbG9uZyByZXQgPSAwOwotCXN0cnVjdCByZWdfd2luZG93ICpydzsKKwlzdHJ1Y3QgcmVnX3dpbmRvdzMyICpydzsKIAlpbnQgY291bnQgPSAwOwogCiAJaWYgKCF0YXNrIHx8IHRhc2sgPT0gY3VycmVudCB8fApAQCAtNjkyLDcgKzY5Miw3IEBACiAJCWlmIChmcCA8ICh0YXNrX2Jhc2UgKyBzaXplb2Yoc3RydWN0IHRocmVhZF9pbmZvKSkgfHwKIAkJICAgIGZwID49ICh0YXNrX2Jhc2UgKyAoMiAqIFBBR0VfU0laRSkpKQogCQkJYnJlYWs7Ci0JCXJ3ID0gKHN0cnVjdCByZWdfd2luZG93ICopIGZwOworCQlydyA9IChzdHJ1Y3QgcmVnX3dpbmRvdzMyICopIGZwOwogCQlwYyA9IHJ3LT5pbnNbN107CiAJCWlmICghaW5fc2NoZWRfZnVuY3Rpb25zKHBjKSkgewogCQkJcmV0ID0gcGM7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tX2NvbW1vbi5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHJvbV9jb21tb24uYwppbmRleCA0ZTlhZjU5Li5mZjdiNTkxIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tX2NvbW1vbi5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3Byb21fY29tbW9uLmMKQEAgLTE1NSwyMCArMTU1LDEyIEBACiAJCXAtPnZhbHVlID0gcHJvbV9lYXJseV9hbGxvYyhzcGVjaWFsX2xlbik7CiAJCW1lbWNweShwLT52YWx1ZSwgc3BlY2lhbF92YWwsIHNwZWNpYWxfbGVuKTsKIAl9IGVsc2UgewotI2lmZGVmIENPTkZJR19TUEFSQzMyCiAJCWlmIChwcmV2ID09IE5VTEwpIHsKLQkJCW5hbWUgPSBwcm9tX2ZpcnN0cHJvcChub2RlLCBOVUxMKTsKKwkJCW5hbWUgPSBwcm9tX2ZpcnN0cHJvcChub2RlLCBwLT5uYW1lKTsKIAkJfSBlbHNlIHsKLQkJCW5hbWUgPSBwcm9tX25leHRwcm9wKG5vZGUsIHByZXYsIE5VTEwpOworCQkJbmFtZSA9IHByb21fbmV4dHByb3Aobm9kZSwgcHJldiwgcC0+bmFtZSk7CiAJCX0KLSNlbHNlCi0JCWlmIChwcmV2ID09IE5VTEwpIHsKLQkJCXByb21fZmlyc3Rwcm9wKG5vZGUsIHAtPm5hbWUpOwotCQl9IGVsc2UgewotCQkJcHJvbV9uZXh0cHJvcChub2RlLCBwcmV2LCBwLT5uYW1lKTsKLQkJfQotCQluYW1lID0gcC0+bmFtZTsKLSNlbmRpZgorCiAJCWlmIChzdHJsZW4obmFtZSkgPT0gMCkgewogCQkJdG1wID0gcDsKIAkJCXJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcHJvbV9pcnF0cmFucy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHJvbV9pcnF0cmFucy5jCmluZGV4IDk2OTU4YzQuLjU3MDJhZDQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3Byb21faXJxdHJhbnMuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tX2lycXRyYW5zLmMKQEAgLTM0Niw3ICszNDYsNyBAQAogCQkJYnJlYWs7CiAJfQogCWlmIChsaW1pdCA8PSAwKSB7Ci0JCXByaW50aygidG9tYXRpbGxvX3dzeW5jX2hhbmRsZXI6IERNQSB3b24ndCBzeW5jIFslbHg6JWx4XVxuIiwKKwkJcHJpbnRrKCJ0b21hdGlsbG9fd3N5bmNfaGFuZGxlcjogRE1BIHdvbid0IHN5bmMgWyVsbHg6JWxseF1cbiIsCiAJCSAgICAgICB2YWwsIG1hc2spOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcHN5Y2hvX2NvbW1vbi5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHN5Y2hvX2NvbW1vbi5jCmluZGV4IDc5MDk5NjQuLjQwNjg5YWUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3BzeWNob19jb21tb24uYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wc3ljaG9fY29tbW9uLmMKQEAgLTk0LDcgKzk0LDcgQEAKIAkJaWYgKHNhd19lcnJvciAhPSAwKSB7CiAJCQl1NjQgdGFndmFsID0gc3RjX3RhZ19idWZbaV07CiAJCQl1NjQgbGluZXZhbCA9IHN0Y19saW5lX2J1ZltpXTsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFNUQ19UQUcoJWQpW1BBKCUwMTZseClWQSglMDhseCkiCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBTVENfVEFHKCVkKVtQQSglMDE2bGx4KVZBKCUwOGxseCkiCiAJCQkgICAgICAgIlYoJWQpVyglZCldXG4iLAogCQkJICAgICAgIHBibS0+bmFtZSwKIAkJCSAgICAgICBpLApAQCAtMTAyLDggKzEwMiw4IEBACiAJCQkgICAgICAgKHRhZ3ZhbCAmIFBTWUNIT19TVENUQUdfVlBOKSwKIAkJCSAgICAgICAoKHRhZ3ZhbCAmIFBTWUNIT19TVENUQUdfVkFMSUQpID8gMSA6IDApLAogCQkJICAgICAgICgodGFndmFsICYgUFNZQ0hPX1NUQ1RBR19XUklURSkgPyAxIDogMCkpOwotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogU1RDX0xJTkUoJWQpW0xJRFgoJWx4KVNQKCVseCkiCi0JCQkgICAgICAgIkxBRERSKCVseClFUCglbHgpViglZClGT0ZOKCVkKV1cbiIsCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBTVENfTElORSglZClbTElEWCglbGx4KVNQKCVsbHgpIgorCQkJICAgICAgICJMQUREUiglbGx4KUVQKCVsbHgpViglZClGT0ZOKCVkKV1cbiIsCiAJCQkgICAgICAgcGJtLT5uYW1lLAogCQkJICAgICAgIGksCiAJCQkgICAgICAgKChsaW5ldmFsICYgUFNZQ0hPX1NUQ0xJTkVfTElORFgpID4+IDIxVUwpLApAQCAtMTc5LDE0ICsxNzksMTQgQEAKIAkJfQogCiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IElPTU1VIFRBRyglZClbZXJyb3IoJXMpIHdyKCVkKSAiCi0JCSAgICAgICAic3RyKCVkKSBzeiglZEspIHZwZyglMDhseCldXG4iLAorCQkgICAgICAgInN0ciglZCkgc3ooJWRLKSB2cGcoJTA4bGx4KV1cbiIsCiAJCSAgICAgICBwYm0tPm5hbWUsIGksIHR5cGVfc3RyLAogCQkgICAgICAgKCh0YWdfdmFsICYgUFNZQ0hPX0lPTU1VX1RBR19XUklURSkgPyAxIDogMCksCiAJCSAgICAgICAoKHRhZ192YWwgJiBQU1lDSE9fSU9NTVVfVEFHX1NUUkVBTSkgPyAxIDogMCksCiAJCSAgICAgICAoKHRhZ192YWwgJiBQU1lDSE9fSU9NTVVfVEFHX1NJWkUpID8gNjQgOiA4KSwKIAkJICAgICAgICh0YWdfdmFsICYgUFNZQ0hPX0lPTU1VX1RBR19WUEFHRSkgPDwgSU9NTVVfUEFHRV9TSElGVCk7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IElPTU1VIERBVEEoJWQpW3ZhbGlkKCVkKSBjYWNoZSglZCkgIgotCQkgICAgICAgInBwZyglMDE2bHgpXVxuIiwKKwkJICAgICAgICJwcGcoJTAxNmxseCldXG4iLAogCQkgICAgICAgcGJtLT5uYW1lLCBpLAogCQkgICAgICAgKChkYXRhX3ZhbCAmIFBTWUNIT19JT01NVV9EQVRBX1ZBTElEKSA/IDEgOiAwKSwKIAkJICAgICAgICgoZGF0YV92YWwgJiBQU1lDSE9fSU9NTVVfREFUQV9DQUNIRSkgPyAxIDogMCksCkBAIC0zMjYsMTIgKzMyNiwxMiBAQAogCQkgICAiRXhjZXNzaXZlIFJldHJpZXMiIDoKIAkJICAgKChlcnJvcl9iaXRzICYgUFNZQ0hPX1BDSUFGU1JfUFBFUlIpID8KIAkJICAgICJQYXJpdHkgRXJyb3IiIDogIj8/PyIpKSkpKSk7Ci0JcHJpbnRrKEtFUk5fRVJSICIlczogYnl0ZW1hc2tbJTA0bHhdIFVQQV9NSURbJTAybHhdIHdhc19ibG9jayglZClcbiIsCisJcHJpbnRrKEtFUk5fRVJSICIlczogYnl0ZW1hc2tbJTA0bGx4XSBVUEFfTUlEWyUwMmxseF0gd2FzX2Jsb2NrKCVkKVxuIiwKIAkgICAgICAgcGJtLT5uYW1lLAogCSAgICAgICAoYWZzciAmIFBTWUNIT19QQ0lBRlNSX0JNU0spID4+IDMyVUwsCiAJICAgICAgIChhZnNyICYgUFNZQ0hPX1BDSUFGU1JfTUlEKSA+PiAyNVVMLAogCSAgICAgICAoYWZzciAmIFBTWUNIT19QQ0lBRlNSX0JMSykgPyAxIDogMCk7Ci0JcHJpbnRrKEtFUk5fRVJSICIlczogUENJIEFGQVIgWyUwMTZseF1cbiIsIHBibS0+bmFtZSwgYWZhcik7CisJcHJpbnRrKEtFUk5fRVJSICIlczogUENJIEFGQVIgWyUwMTZsbHhdXG4iLCBwYm0tPm5hbWUsIGFmYXIpOwogCXByaW50ayhLRVJOX0VSUiAiJXM6IFBDSSBTZWNvbmRhcnkgZXJyb3JzIFsiLCBwYm0tPm5hbWUpOwogCXJlcG9ydGVkID0gMDsKIAlpZiAoYWZzciAmIFBTWUNIT19QQ0lBRlNSX1NNQSkgewpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc2lnbmFsXzMyLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zaWduYWxfMzIuYwppbmRleCBjOTRmOTFjLi4xODFkMDY5IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zaWduYWxfMzIuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zaWduYWxfMzIuYwpAQCAtMzQsNyArMzQsNyBAQAogCiBzdHJ1Y3Qgc2lnbmFsX2ZyYW1lIHsKIAlzdHJ1Y3Qgc3BhcmNfc3RhY2tmCXNzOwotCV9fc2lnaW5mb190CQlpbmZvOworCV9fc2lnaW5mbzMyX3QJCWluZm87CiAJX19zaWdpbmZvX2ZwdV90IF9fdXNlcgkqZnB1X3NhdmU7CiAJdW5zaWduZWQgbG9uZwkJaW5zbnNbMl0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDgpKSk7CiAJdW5zaWduZWQgaW50CQlleHRyYW1hc2tbX05TSUdfV09SRFMgLSAxXTsKQEAgLTM1MSw3ICszNTEsNyBAQAogCWVyciB8PSBfX2NvcHlfdG9fdXNlcihzZi0+ZXh0cmFtYXNrLCAmb2xkc2V0LT5zaWdbMV0sCiAJCQkgICAgICAoX05TSUdfV09SRFMgLSAxKSAqIHNpemVvZih1bnNpZ25lZCBpbnQpKTsKIAllcnIgfD0gX19jb3B5X3RvX3VzZXIoc2YsIChjaGFyICopIHJlZ3MtPnVfcmVnc1tVUkVHX0ZQXSwKLQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgcmVnX3dpbmRvdykpOworCQkJICAgICAgc2l6ZW9mKHN0cnVjdCByZWdfd2luZG93MzIpKTsKIAlpZiAoZXJyKQogCQlnb3RvIHNpZ3NlZ3Y7CiAJCkBAIC00MzMsNyArNDMzLDcgQEAKIAllcnIgfD0gX19wdXRfdXNlcihjdXJyZW50LT5zYXNfc3Nfc2l6ZSwgJnNmLT5zdGFjay5zc19zaXplKTsKIAkKIAllcnIgfD0gX19jb3B5X3RvX3VzZXIoc2YsIChjaGFyICopIHJlZ3MtPnVfcmVnc1tVUkVHX0ZQXSwKLQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgcmVnX3dpbmRvdykpOwkKKwkJCSAgICAgIHNpemVvZihzdHJ1Y3QgcmVnX3dpbmRvdzMyKSk7CiAKIAllcnIgfD0gY29weV9zaWdpbmZvX3RvX3VzZXIoJnNmLT5pbmZvLCBpbmZvKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc21wXzY0LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zbXBfNjQuYwppbmRleCA0NjMyOTc5Li42Y2QxYTViIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zbXBfNjQuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zbXBfNjQuYwpAQCAtNDQ5LDcgKzQ0OSw3IEBACiAJX19hc21fXyBfX3ZvbGF0aWxlX18oIndycHIgJTAsIDB4MCwgJSVwc3RhdGUiCiAJCQkgICAgIDogOiAiciIgKHBzdGF0ZSkpOwogCWlmIChzdHVjayA9PSAwKSB7Ci0JCXByaW50aygiQ1BVWyVkXTogbW9uZG8gc3R1Y2thZ2UgcmVzdWx0WyUwMTZseF1cbiIsCisJCXByaW50aygiQ1BVWyVkXTogbW9uZG8gc3R1Y2thZ2UgcmVzdWx0WyUwMTZsbHhdXG4iLAogCQkgICAgICAgc21wX3Byb2Nlc3Nvcl9pZCgpLCByZXN1bHQpOwogCX0gZWxzZSB7CiAJCXVkZWxheSgyKTsKQEAgLTU4NCw3ICs1ODQsNyBAQAogCQkJLyogQnVzeSBiaXRzIHdpbGwgbm90IGNsZWFyLCBjb250aW51ZSBpbnN0ZWFkCiAJCQkgKiBvZiBmcmVlemluZyB1cCBvbiB0aGlzIGNwdS4KIAkJCSAqLwotCQkJcHJpbnRrKCJDUFVbJWRdOiBtb25kbyBzdHVja2FnZSByZXN1bHRbJTAxNmx4XVxuIiwKKwkJCXByaW50aygiQ1BVWyVkXTogbW9uZG8gc3R1Y2thZ2UgcmVzdWx0WyUwMTZsbHhdXG4iLAogCQkJICAgICAgIHNtcF9wcm9jZXNzb3JfaWQoKSwgZGlzcGF0Y2hfc3RhdCk7CiAJCX0gZWxzZSB7CiAJCQlpbnQgaSwgdGhpc19idXN5X25hY2sgPSAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3VuNG1fc21wLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zdW40bV9zbXAuYwppbmRleCA0ZjhkNjA1Li44MDQwMzc2IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zdW40bV9zbXAuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zdW40bV9zbXAuYwpAQCAtNTQsNyArNTQsOCBAQAogI2RlZmluZSBTTVBfUFJJTlRLKHgpCiAjZW5kaWYKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHN3YXAodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqcHRyLCB1bnNpZ25lZCBsb25nIHZhbCkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworc3dhcF91bG9uZyh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICpwdHIsIHVuc2lnbmVkIGxvbmcgdmFsKQogewogCV9fYXNtX18gX192b2xhdGlsZV9fKCJzd2FwIFslMV0sICUwXG5cdCIgOgogCQkJICAgICAiPSZyIiAodmFsKSwgIj0mciIgKHB0cikgOgpAQCAtOTAsNyArOTEsNyBAQAogCSAqIHRvIGNhbGwgdGhlIHNjaGVkdWxlciBjb2RlLgogCSAqLwogCS8qIEFsbG93IG1hc3RlciB0byBjb250aW51ZS4gKi8KLQlzd2FwKCZjcHVfY2FsbGluX21hcFtjcHVpZF0sIDEpOworCXN3YXBfdWxvbmcoJmNwdV9jYWxsaW5fbWFwW2NwdWlkXSwgMSk7CiAKIAkvKiBYWFg6IFdoYXQncyB1cCB3aXRoIGFsbCB0aGUgZmx1c2hlcz8gKi8KIAlsb2NhbF9mbHVzaF9jYWNoZV9hbGwoKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3RpbWVfNjQuYyBiL2FyY2gvc3BhcmMva2VybmVsL3RpbWVfNjQuYwppbmRleCA5ZGY4ZjA5Li41NDQwNWQzIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC90aW1lXzY0LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvdGltZV82NC5jCkBAIC0xMDYsNyArMTA2LDcgQEAKIAl0aWNrX2Rpc2FibGVfaXJxKCk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHRpY2tfZ2V0X3RpY2sodm9pZCkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgdGlja19nZXRfdGljayh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgcmV0OwogCkBAIC0yMDgsNyArMjA4LDcgQEAKIAlzdGlja19kaXNhYmxlX2lycSgpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzdGlja19nZXRfdGljayh2b2lkKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBzdGlja19nZXRfdGljayh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgcmV0OwogCkBAIC0zNTIsNyArMzUyLDcgQEAKIAloYnRpY2tfZGlzYWJsZV9pcnEoKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgaGJ0aWNrX2dldF90aWNrKHZvaWQpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIGhidGlja19nZXRfdGljayh2b2lkKQogewogCXJldHVybiBfX2hiaXJkX3JlYWRfc3RpY2soKSAmIH5USUNLX1BSSVZfQklUOwogfQpAQCAtNDIyLDcgKzQyMiw3IEBACiB7CiAJc3RydWN0IHJlc291cmNlICpyOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJUQyByZWdzIGF0IDB4JWx4XG4iLAorCXByaW50ayhLRVJOX0lORk8gIiVzOiBSVEMgcmVncyBhdCAweCVsbHhcbiIsCiAJICAgICAgIG9wLT5ub2RlLT5mdWxsX25hbWUsIG9wLT5yZXNvdXJjZVswXS5zdGFydCk7CiAKIAkvKiBUaGUgQ01PUyBSVEMgZHJpdmVyIG9ubHkgYWNjZXB0cyBJT1JFU09VUkNFX0lPLCBzbyBjb25zCkBAIC00NzgsNyArNDc4LDcgQEAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGJxNDgwMl9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7CiAKLQlwcmludGsoS0VSTl9JTkZPICIlczogQlE0ODAyIHJlZ3MgYXQgMHglbHhcbiIsCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEJRNDgwMiByZWdzIGF0IDB4JWxseFxuIiwKIAkgICAgICAgb3AtPm5vZGUtPmZ1bGxfbmFtZSwgb3AtPnJlc291cmNlWzBdLnN0YXJ0KTsKIAogCXJ0Y19icTQ4MDJfZGV2aWNlLnJlc291cmNlID0gJm9wLT5yZXNvdXJjZVswXTsKQEAgLTU0Miw3ICs1NDIsNyBAQAogCSAgICBzdHJjbXAoZHAtPnBhcmVudC0+cGFyZW50LT5uYW1lLCAiY2VudHJhbCIpICE9IDApCiAJCXJldHVybiAtRU5PREVWOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1vc3RlayByZWdzIGF0IDB4JWx4XG4iLAorCXByaW50ayhLRVJOX0lORk8gIiVzOiBNb3N0ZWsgcmVncyBhdCAweCVsbHhcbiIsCiAJICAgICAgIGRwLT5mdWxsX25hbWUsIG9wLT5yZXNvdXJjZVswXS5zdGFydCk7CiAKIAltNDh0NTlfcnRjLnJlc291cmNlID0gJm9wLT5yZXNvdXJjZVswXTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3RyYXBzXzMyLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC90cmFwc18zMi5jCmluZGV4IDcxNmYzOTQuLjIxMzY0NWIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3RyYXBzXzMyLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvdHJhcHNfMzIuYwpAQCAtNjcsNyArNjcsNyBAQAogCV9fUkVTVE9SRTsgX19SRVNUT1JFOyBfX1JFU1RPUkU7IF9fUkVTVE9SRTsKIAogCXsKLQkJc3RydWN0IHJlZ193aW5kb3cgKnJ3ID0gKHN0cnVjdCByZWdfd2luZG93ICopcmVncy0+dV9yZWdzW1VSRUdfRlBdOworCQlzdHJ1Y3QgcmVnX3dpbmRvdzMyICpydyA9IChzdHJ1Y3QgcmVnX3dpbmRvdzMyICopcmVncy0+dV9yZWdzW1VSRUdfRlBdOwogCiAJCS8qIFN0b3AgdGhlIGJhY2sgdHJhY2Ugd2hlbiB3ZSBoaXQgdXNlcmxhbmQgb3Igd2UKIAkJICogZmluZCBzb21lIGJhZGx5IGFsaWduZWQga2VybmVsIHN0YWNrLiBTZXQgYW4gdXBwZXIKQEAgLTc5LDcgKzc5LDcgQEAKIAkJICAgICAgISgoKHVuc2lnbmVkIGxvbmcpIHJ3KSAmIDB4NykpIHsKIAkJCXByaW50aygiQ2FsbGVyWyUwOGx4XTogJXBTXG4iLCBydy0+aW5zWzddLAogCQkJICAgICAgICh2b2lkICopIHJ3LT5pbnNbN10pOwotCQkJcncgPSAoc3RydWN0IHJlZ193aW5kb3cgKilydy0+aW5zWzZdOworCQkJcncgPSAoc3RydWN0IHJlZ193aW5kb3czMiAqKXJ3LT5pbnNbNl07CiAJCX0KIAl9CiAJcHJpbnRrKCJJbnN0cnVjdGlvbiBEVU1QOiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvdHJhcHNfNjQuYyBiL2FyY2gvc3BhcmMva2VybmVsL3RyYXBzXzY0LmMKaW5kZXggNDYzOGFmMi4uYmNhM2I0ZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvdHJhcHNfNjQuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC90cmFwc182NC5jCkBAIC0xMTY4LDIwICsxMTY4LDIwIEBACiAJfQogCiAJLyogTm93IGR1bXAgdGhlIGNhY2hlIHNuYXBzaG90cy4gKi8KLQlwcmludGsoIiVzIiAiRVJST1IoJWQpOiBELWNhY2hlIGlkeFsleF0gdGFnWyUwMTZseF0gdXRhZ1slMDE2bHhdIHN0YWdbJTAxNmx4XVxuIiwKKwlwcmludGsoIiVzIiAiRVJST1IoJWQpOiBELWNhY2hlIGlkeFsleF0gdGFnWyUwMTZsbHhdIHV0YWdbJTAxNmxseF0gc3RhZ1slMDE2bGx4XVxuIiwKIAkgICAgICAgKHJlY292ZXJhYmxlID8gS0VSTl9XQVJOSU5HIDogS0VSTl9DUklUKSwgc21wX3Byb2Nlc3Nvcl9pZCgpLAogCSAgICAgICAoaW50KSBpbmZvLT5kY2FjaGVfaW5kZXgsCiAJICAgICAgIGluZm8tPmRjYWNoZV90YWcsCiAJICAgICAgIGluZm8tPmRjYWNoZV91dGFnLAogCSAgICAgICBpbmZvLT5kY2FjaGVfc3RhZyk7Ci0JcHJpbnRrKCIlcyIgIkVSUk9SKCVkKTogRC1jYWNoZSBkYXRhMFslMDE2bHhdIGRhdGExWyUwMTZseF0gZGF0YTJbJTAxNmx4XSBkYXRhM1slMDE2bHhdXG4iLAorCXByaW50aygiJXMiICJFUlJPUiglZCk6IEQtY2FjaGUgZGF0YTBbJTAxNmxseF0gZGF0YTFbJTAxNmxseF0gZGF0YTJbJTAxNmxseF0gZGF0YTNbJTAxNmxseF1cbiIsCiAJICAgICAgIChyZWNvdmVyYWJsZSA/IEtFUk5fV0FSTklORyA6IEtFUk5fQ1JJVCksIHNtcF9wcm9jZXNzb3JfaWQoKSwKIAkgICAgICAgaW5mby0+ZGNhY2hlX2RhdGFbMF0sCiAJICAgICAgIGluZm8tPmRjYWNoZV9kYXRhWzFdLAogCSAgICAgICBpbmZvLT5kY2FjaGVfZGF0YVsyXSwKIAkgICAgICAgaW5mby0+ZGNhY2hlX2RhdGFbM10pOwotCXByaW50aygiJXMiICJFUlJPUiglZCk6IEktY2FjaGUgaWR4WyV4XSB0YWdbJTAxNmx4XSB1dGFnWyUwMTZseF0gc3RhZ1slMDE2bHhdICIKLQkgICAgICAgInVbJTAxNmx4XSBsWyUwMTZseF1cbiIsCisJcHJpbnRrKCIlcyIgIkVSUk9SKCVkKTogSS1jYWNoZSBpZHhbJXhdIHRhZ1slMDE2bGx4XSB1dGFnWyUwMTZsbHhdIHN0YWdbJTAxNmxseF0gIgorCSAgICAgICAidVslMDE2bGx4XSBsWyUwMTZsbHhdXG4iLAogCSAgICAgICAocmVjb3ZlcmFibGUgPyBLRVJOX1dBUk5JTkcgOiBLRVJOX0NSSVQpLCBzbXBfcHJvY2Vzc29yX2lkKCksCiAJICAgICAgIChpbnQpIGluZm8tPmljYWNoZV9pbmRleCwKIAkgICAgICAgaW5mby0+aWNhY2hlX3RhZywKQEAgLTExODksMjIgKzExODksMjIgQEAKIAkgICAgICAgaW5mby0+aWNhY2hlX3N0YWcsCiAJICAgICAgIGluZm8tPmljYWNoZV91cHBlciwKIAkgICAgICAgaW5mby0+aWNhY2hlX2xvd2VyKTsKLQlwcmludGsoIiVzIiAiRVJST1IoJWQpOiBJLWNhY2hlIElOU04wWyUwMTZseF0gSU5TTjFbJTAxNmx4XSBJTlNOMlslMDE2bHhdIElOU04zWyUwMTZseF1cbiIsCisJcHJpbnRrKCIlcyIgIkVSUk9SKCVkKTogSS1jYWNoZSBJTlNOMFslMDE2bGx4XSBJTlNOMVslMDE2bGx4XSBJTlNOMlslMDE2bGx4XSBJTlNOM1slMDE2bGx4XVxuIiwKIAkgICAgICAgKHJlY292ZXJhYmxlID8gS0VSTl9XQVJOSU5HIDogS0VSTl9DUklUKSwgc21wX3Byb2Nlc3Nvcl9pZCgpLAogCSAgICAgICBpbmZvLT5pY2FjaGVfZGF0YVswXSwKIAkgICAgICAgaW5mby0+aWNhY2hlX2RhdGFbMV0sCiAJICAgICAgIGluZm8tPmljYWNoZV9kYXRhWzJdLAogCSAgICAgICBpbmZvLT5pY2FjaGVfZGF0YVszXSk7Ci0JcHJpbnRrKCIlcyIgIkVSUk9SKCVkKTogSS1jYWNoZSBJTlNONFslMDE2bHhdIElOU041WyUwMTZseF0gSU5TTjZbJTAxNmx4XSBJTlNON1slMDE2bHhdXG4iLAorCXByaW50aygiJXMiICJFUlJPUiglZCk6IEktY2FjaGUgSU5TTjRbJTAxNmxseF0gSU5TTjVbJTAxNmxseF0gSU5TTjZbJTAxNmxseF0gSU5TTjdbJTAxNmxseF1cbiIsCiAJICAgICAgIChyZWNvdmVyYWJsZSA/IEtFUk5fV0FSTklORyA6IEtFUk5fQ1JJVCksIHNtcF9wcm9jZXNzb3JfaWQoKSwKIAkgICAgICAgaW5mby0+aWNhY2hlX2RhdGFbNF0sCiAJICAgICAgIGluZm8tPmljYWNoZV9kYXRhWzVdLAogCSAgICAgICBpbmZvLT5pY2FjaGVfZGF0YVs2XSwKIAkgICAgICAgaW5mby0+aWNhY2hlX2RhdGFbN10pOwotCXByaW50aygiJXMiICJFUlJPUiglZCk6IEUtY2FjaGUgaWR4WyV4XSB0YWdbJTAxNmx4XVxuIiwKKwlwcmludGsoIiVzIiAiRVJST1IoJWQpOiBFLWNhY2hlIGlkeFsleF0gdGFnWyUwMTZsbHhdXG4iLAogCSAgICAgICAocmVjb3ZlcmFibGUgPyBLRVJOX1dBUk5JTkcgOiBLRVJOX0NSSVQpLCBzbXBfcHJvY2Vzc29yX2lkKCksCiAJICAgICAgIChpbnQpIGluZm8tPmVjYWNoZV9pbmRleCwgaW5mby0+ZWNhY2hlX3RhZyk7Ci0JcHJpbnRrKCIlcyIgIkVSUk9SKCVkKTogRS1jYWNoZSBkYXRhMFslMDE2bHhdIGRhdGExWyUwMTZseF0gZGF0YTJbJTAxNmx4XSBkYXRhM1slMDE2bHhdXG4iLAorCXByaW50aygiJXMiICJFUlJPUiglZCk6IEUtY2FjaGUgZGF0YTBbJTAxNmxseF0gZGF0YTFbJTAxNmxseF0gZGF0YTJbJTAxNmxseF0gZGF0YTNbJTAxNmxseF1cbiIsCiAJICAgICAgIChyZWNvdmVyYWJsZSA/IEtFUk5fV0FSTklORyA6IEtFUk5fQ1JJVCksIHNtcF9wcm9jZXNzb3JfaWQoKSwKIAkgICAgICAgaW5mby0+ZWNhY2hlX2RhdGFbMF0sCiAJICAgICAgIGluZm8tPmVjYWNoZV9kYXRhWzFdLApAQCAtMTc5NCw3ICsxNzk0LDcgQEAKIAlpbnQgY250OwogCiAJcHJpbnRrKCIlczogUmVwb3J0aW5nIG9uIGNwdSAlZFxuIiwgcGZ4LCBjcHUpOwotCXByaW50aygiJXM6IGVycl9oYW5kbGVbJWx4XSBlcnJfc3RpY2tbJWx4XSBlcnJfdHlwZVslMDh4OiVzXVxuIiwKKwlwcmludGsoIiVzOiBlcnJfaGFuZGxlWyVsbHhdIGVycl9zdGlja1slbGx4XSBlcnJfdHlwZVslMDh4OiVzXVxuIiwKIAkgICAgICAgcGZ4LAogCSAgICAgICBlbnQtPmVycl9oYW5kbGUsIGVudC0+ZXJyX3N0aWNrLAogCSAgICAgICBlbnQtPmVycl90eXBlLApAQCAtMTgxOCw3ICsxODE4LDcgQEAKIAkJInByaXZpbGVnZWQiIDogIiIpLAogCSAgICAgICAoKGVudC0+ZXJyX2F0dHJzICYgU1VONFZfRVJSX0FUVFJTX1JFU19RVUVVRV9GVUxMKSA/CiAJCSJxdWV1ZS1mdWxsIiA6ICIiKSk7Ci0JcHJpbnRrKCIlczogZXJyX3JhZGRyWyUwMTZseF0gZXJyX3NpemVbJXVdIGVycl9jcHVbJXVdXG4iLAorCXByaW50aygiJXM6IGVycl9yYWRkclslMDE2bGx4XSBlcnJfc2l6ZVsldV0gZXJyX2NwdVsldV1cbiIsCiAJICAgICAgIHBmeCwKIAkgICAgICAgZW50LT5lcnJfcmFkZHIsIGVudC0+ZXJyX3NpemUsIGVudC0+ZXJyX2NwdSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3VuYWxpZ25lZF8zMi5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdW5hbGlnbmVkXzMyLmMKaW5kZXggYzJhMjhjNS4uNmIxZTZjZCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvdW5hbGlnbmVkXzMyLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvdW5hbGlnbmVkXzMyLmMKQEAgLTk3LDI2ICs5NywyNiBAQAogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZmV0Y2hfcmVnKHVuc2lnbmVkIGludCByZWcsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXN0cnVjdCByZWdfd2luZG93ICp3aW47CisJc3RydWN0IHJlZ193aW5kb3czMiAqd2luOwogCiAJaWYocmVnIDwgMTYpCiAJCXJldHVybiAoIXJlZyA/IDAgOiByZWdzLT51X3JlZ3NbcmVnXSk7CiAKIAkvKiBIbyBodW0sIHRoZSBzbGlnaHRseSBjb21wbGljYXRlZCBjYXNlLiAqLwotCXdpbiA9IChzdHJ1Y3QgcmVnX3dpbmRvdyAqKSByZWdzLT51X3JlZ3NbVVJFR19GUF07CisJd2luID0gKHN0cnVjdCByZWdfd2luZG93MzIgKikgcmVncy0+dV9yZWdzW1VSRUdfRlBdOwogCXJldHVybiB3aW4tPmxvY2Fsc1tyZWcgLSAxNl07IC8qIHllcywgSSBrbm93IHdoYXQgdGhpcyBkb2VzLi4uICovCiB9CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBzYWZlX2ZldGNoX3JlZyh1bnNpZ25lZCBpbnQgcmVnLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlzdHJ1Y3QgcmVnX3dpbmRvdyBfX3VzZXIgKndpbjsKKwlzdHJ1Y3QgcmVnX3dpbmRvdzMyIF9fdXNlciAqd2luOwogCXVuc2lnbmVkIGxvbmcgcmV0OwogCiAJaWYgKHJlZyA8IDE2KQogCQlyZXR1cm4gKCFyZWcgPyAwIDogcmVncy0+dV9yZWdzW3JlZ10pOwogCiAJLyogSG8gaHVtLCB0aGUgc2xpZ2h0bHkgY29tcGxpY2F0ZWQgY2FzZS4gKi8KLQl3aW4gPSAoc3RydWN0IHJlZ193aW5kb3cgX191c2VyICopIHJlZ3MtPnVfcmVnc1tVUkVHX0ZQXTsKKwl3aW4gPSAoc3RydWN0IHJlZ193aW5kb3czMiBfX3VzZXIgKikgcmVncy0+dV9yZWdzW1VSRUdfRlBdOwogCiAJaWYgKCh1bnNpZ25lZCBsb25nKXdpbiAmIDMpCiAJCXJldHVybiAtMTsKQEAgLTEyOSwxMSArMTI5LDExIEBACiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyAqZmV0Y2hfcmVnX2FkZHIodW5zaWduZWQgaW50IHJlZywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0Jc3RydWN0IHJlZ193aW5kb3cgKndpbjsKKwlzdHJ1Y3QgcmVnX3dpbmRvdzMyICp3aW47CiAKIAlpZihyZWcgPCAxNikKIAkJcmV0dXJuICZyZWdzLT51X3JlZ3NbcmVnXTsKLQl3aW4gPSAoc3RydWN0IHJlZ193aW5kb3cgKikgcmVncy0+dV9yZWdzW1VSRUdfRlBdOworCXdpbiA9IChzdHJ1Y3QgcmVnX3dpbmRvdzMyICopIHJlZ3MtPnVfcmVnc1tVUkVHX0ZQXTsKIAlyZXR1cm4gJndpbi0+bG9jYWxzW3JlZyAtIDE2XTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvdW5hbGlnbmVkXzY0LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC91bmFsaWduZWRfNjQuYwppbmRleCAyMDNkZGZhLi5mMTY0ZDVhIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC91bmFsaWduZWRfNjQuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC91bmFsaWduZWRfNjQuYwpAQCAtNjAxLDExICs2MDEsMTUgQEAKIAkJcGMgPSAodTMyKXBjOwogCWlmIChnZXRfdXNlcihpbnNuLCAodTMyIF9fdXNlciAqKSBwYykgIT0gLUVGQVVMVCkgewogCQlpbnQgYXNpID0gZGVjb2RlX2FzaShpbnNuLCByZWdzKTsKKwkJaW50IGVycjsKKwogCQlpZiAoKGFzaSA+IEFTSV9TTkZMKSB8fAogCQkgICAgKGFzaSA8IEFTSV9QKSkKIAkJCWdvdG8gZGFleDsKLQkJaWYgKGdldF91c2VyKGZpcnN0LCAodTMyIF9fdXNlciAqKXNmYXIpIHx8Ci0JCSAgICAgZ2V0X3VzZXIoc2Vjb25kLCAodTMyIF9fdXNlciAqKShzZmFyICsgNCkpKSB7CisJCWVyciA9IGdldF91c2VyKGZpcnN0LCAodTMyIF9fdXNlciAqKXNmYXIpOworCQlpZiAoIWVycikKKwkJCWVyciA9IGdldF91c2VyKHNlY29uZCwgKHUzMiBfX3VzZXIgKikoc2ZhciArIDQpKTsKKwkJaWYgKGVycikgewogCQkJaWYgKGFzaSAmIDB4MikgLyogTkYgKi8gewogCQkJCWZpcnN0ID0gMDsgc2Vjb25kID0gMDsKIAkJCX0gZWxzZQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvdmlvLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC92aW8uYwppbmRleCA5MmIxZjhlLi43NTNkMTI4IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC92aW8uYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC92aW8uYwpAQCAtMjYzLDEwICsyNjMsMTAgQEAKIAkJZGV2X3NldF9uYW1lKCZ2ZGV2LT5kZXYsICIlcyIsIGJ1c19pZF9uYW1lKTsKIAkJdmRldi0+ZGV2X25vID0gfih1NjQpMDsKIAl9IGVsc2UgaWYgKCFjZmdfaGFuZGxlKSB7Ci0JCWRldl9zZXRfbmFtZSgmdmRldi0+ZGV2LCAiJXMtJWx1IiwgYnVzX2lkX25hbWUsICppZCk7CisJCWRldl9zZXRfbmFtZSgmdmRldi0+ZGV2LCAiJXMtJWxsdSIsIGJ1c19pZF9uYW1lLCAqaWQpOwogCQl2ZGV2LT5kZXZfbm8gPSAqaWQ7CiAJfSBlbHNlIHsKLQkJZGV2X3NldF9uYW1lKCZ2ZGV2LT5kZXYsICIlcy0lbHUtJWx1IiwgYnVzX2lkX25hbWUsCisJCWRldl9zZXRfbmFtZSgmdmRldi0+ZGV2LCAiJXMtJWxsdS0lbGx1IiwgYnVzX2lkX25hbWUsCiAJCQkgICAgICpjZmdfaGFuZGxlLCAqaWQpOwogCQl2ZGV2LT5kZXZfbm8gPSAqY2ZnX2hhbmRsZTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC92aW9ocy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdmlvaHMuYwppbmRleCA3MDhmYTE3Li5hYTZhYzcwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC92aW9ocy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3Zpb2hzLmMKQEAgLTMzNyw4ICszMzcsMTAgQEAKIAl2aW9kYmcoSFMsICJHT1QgVkVSU0lPTiBOQUNLIG1halsldV0gbWluWyV1XSBkZXZjbGFzc1sldV1cbiIsCiAJICAgICAgIHBrdC0+bWFqb3IsIHBrdC0+bWlub3IsIHBrdC0+ZGV2X2NsYXNzKTsKIAotCWlmICgocGt0LT5tYWpvciA9PSAwICYmIHBrdC0+bWlub3IgPT0gMCkgfHwKLQkgICAgIShudmVyID0gZmluZF9ieV9tYWpvcih2aW8sIHBrdC0+bWFqb3IpKSkKKwlpZiAocGt0LT5tYWpvciA9PSAwICYmIHBrdC0+bWlub3IgPT0gMCkKKwkJcmV0dXJuIGhhbmRzaGFrZV9mYWlsdXJlKHZpbyk7CisJbnZlciA9IGZpbmRfYnlfbWFqb3IodmlvLCBwa3QtPm1ham9yKTsKKwlpZiAoIW52ZXIpCiAJCXJldHVybiBoYW5kc2hha2VfZmFpbHVyZSh2aW8pOwogCiAJaWYgKHNlbmRfdmVyc2lvbih2aW8sIG52ZXItPm1ham9yLCBudmVyLT5taW5vcikgPCAwKQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvd2luZG93cy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvd2luZG93cy5jCmluZGV4IDljYzkzZWEuLmYyNGQyOTggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3dpbmRvd3MuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC93aW5kb3dzLmMKQEAgLTQyLDcgKzQyLDcgQEAKIAogCWZvcihpID0gZmlyc3Rfd2luOyBpIDwgbGFzdF93aW47IGkrKykgewogCQl0cC0+cndidWZfc3RrcHRyc1tpXSA9IHRwLT5yd2J1Zl9zdGtwdHJzW2krMV07Ci0JCW1lbWNweSgmdHAtPnJlZ193aW5kb3dbaV0sICZ0cC0+cmVnX3dpbmRvd1tpKzFdLCBzaXplb2Yoc3RydWN0IHJlZ193aW5kb3cpKTsKKwkJbWVtY3B5KCZ0cC0+cmVnX3dpbmRvd1tpXSwgJnRwLT5yZWdfd2luZG93W2krMV0sIHNpemVvZihzdHJ1Y3QgcmVnX3dpbmRvdzMyKSk7CiAJfQogfQogCkBAIC03MCw3ICs3MCw3IEBACiAKIAkJLyogT2ssIGxldCBpdCByaXAuICovCiAJCWlmIChjb3B5X3RvX3VzZXIoKGNoYXIgX191c2VyICopIHNwLCAmdHAtPnJlZ193aW5kb3dbd2luZG93XSwKLQkJCQkgc2l6ZW9mKHN0cnVjdCByZWdfd2luZG93KSkpCisJCQkJIHNpemVvZihzdHJ1Y3QgcmVnX3dpbmRvdzMyKSkpCiAJCQljb250aW51ZTsKIAogCQlzaGlmdF93aW5kb3dfYnVmZmVyKHdpbmRvdywgdHAtPndfc2F2ZWQgLSAxLCB0cCk7CkBAIC0xMTksNyArMTE5LDcgQEAKIAogCQlpZiAoKHNwICYgNykgfHwKIAkJICAgIGNvcHlfdG9fdXNlcigoY2hhciBfX3VzZXIgKikgc3AsICZ0cC0+cmVnX3dpbmRvd1t3aW5kb3ddLAotCQkJCSBzaXplb2Yoc3RydWN0IHJlZ193aW5kb3cpKSkKKwkJCQkgc2l6ZW9mKHN0cnVjdCByZWdfd2luZG93MzIpKSkKIAkJCWRvX2V4aXQoU0lHSUxMKTsKIAl9CiAJdHAtPndfc2F2ZWQgPSAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9tbS9mYXVsdF8zMi5jIGIvYXJjaC9zcGFyYy9tbS9mYXVsdF8zMi5jCmluZGV4IGE1MDdlMTEuLjEyZTQ0N2YgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbW0vZmF1bHRfMzIuYworKysgYi9hcmNoL3NwYXJjL21tL2ZhdWx0XzMyLmMKQEAgLTI4Myw3ICsyODMsOCBAQAogCS8qIElzIHRoaXMgaW4gZXhfdGFibGU/ICovCiBub19jb250ZXh0OgogCWcyID0gcmVncy0+dV9yZWdzW1VSRUdfRzJdOwotCWlmICghZnJvbV91c2VyICYmIChmaXh1cCA9IHNlYXJjaF9leHRhYmxlc19yYW5nZShyZWdzLT5wYywgJmcyKSkpIHsKKwlpZiAoIWZyb21fdXNlcikgeworCQlmaXh1cCA9IHNlYXJjaF9leHRhYmxlc19yYW5nZShyZWdzLT5wYywgJmcyKTsKIAkJaWYgKGZpeHVwID4gMTApIHsgLyogVmFsdWVzIGJlbG93IGFyZSByZXNlcnZlZCBmb3Igb3RoZXIgdGhpbmdzICovCiAJCQlleHRlcm4gY29uc3QgdW5zaWduZWQgX19tZW1zZXRfc3RhcnRbXTsKIAkJCWV4dGVybiBjb25zdCB1bnNpZ25lZCBfX21lbXNldF9lbmRbXTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbW0vaW5pdF82NC5jIGIvYXJjaC9zcGFyYy9tbS9pbml0XzY0LmMKaW5kZXggNmVhNzNkYS4uYzc3YzdlZiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9tbS9pbml0XzY0LmMKKysrIGIvYXJjaC9zcGFyYy9tbS9pbml0XzY0LmMKQEAgLTI1OCwyMSArMjU4LDE2IEBACiB1bnNpZ25lZCBsb25nIF9QQUdFX0FMTF9TWl9CSVRTIF9fcmVhZF9tb3N0bHk7CiB1bnNpZ25lZCBsb25nIF9QQUdFX1NaQklUUyBfX3JlYWRfbW9zdGx5OwogCi12b2lkIHVwZGF0ZV9tbXVfY2FjaGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcHRlX3QgcHRlKQorc3RhdGljIHZvaWQgZmx1c2hfZGNhY2hlKHVuc2lnbmVkIGxvbmcgcGZuKQogewotCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOwotCXN0cnVjdCB0c2IgKnRzYjsKLQl1bnNpZ25lZCBsb25nIHRhZywgZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZyB0c2JfaW5kZXgsIHRzYl9oYXNoX3NoaWZ0OworCXN0cnVjdCBwYWdlICpwYWdlOwogCi0JaWYgKHRsYl90eXBlICE9IGh5cGVydmlzb3IpIHsKLQkJdW5zaWduZWQgbG9uZyBwZm4gPSBwdGVfcGZuKHB0ZSk7CisJcGFnZSA9IHBmbl90b19wYWdlKHBmbik7CisJaWYgKHBhZ2UgJiYgcGFnZV9tYXBwaW5nKHBhZ2UpKSB7CiAJCXVuc2lnbmVkIGxvbmcgcGdfZmxhZ3M7Ci0JCXN0cnVjdCBwYWdlICpwYWdlOwogCi0JCWlmIChwZm5fdmFsaWQocGZuKSAmJgotCQkgICAgKHBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pLCBwYWdlX21hcHBpbmcocGFnZSkpICYmCi0JCSAgICAoKHBnX2ZsYWdzID0gcGFnZS0+ZmxhZ3MpICYgKDFVTCA8PCBQR19kY2FjaGVfZGlydHkpKSkgeworCQlwZ19mbGFncyA9IHBhZ2UtPmZsYWdzOworCQlpZiAocGdfZmxhZ3MgJiAoMVVMIDw8IFBHX2RjYWNoZV9kaXJ0eSkpIHsKIAkJCWludCBjcHUgPSAoKHBnX2ZsYWdzID4+IFBHX2RjYWNoZV9jcHVfc2hpZnQpICYKIAkJCQkgICBQR19kY2FjaGVfY3B1X21hc2spOwogCQkJaW50IHRoaXNfY3B1ID0gZ2V0X2NwdSgpOwpAQCAtMjkwLDYgKzI4NSwyMSBAQAogCQkJcHV0X2NwdSgpOwogCQl9CiAJfQorfQorCit2b2lkIHVwZGF0ZV9tbXVfY2FjaGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcHRlX3QgcHRlKQoreworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOworCXN0cnVjdCB0c2IgKnRzYjsKKwl1bnNpZ25lZCBsb25nIHRhZywgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyB0c2JfaW5kZXgsIHRzYl9oYXNoX3NoaWZ0OworCisJaWYgKHRsYl90eXBlICE9IGh5cGVydmlzb3IpIHsKKwkJdW5zaWduZWQgbG9uZyBwZm4gPSBwdGVfcGZuKHB0ZSk7CisKKwkJaWYgKHBmbl92YWxpZChwZm4pKQorCQkJZmx1c2hfZGNhY2hlKHBmbik7CisJfQogCiAJbW0gPSB2bWEtPnZtX21tOwogCkBAIC03NjksOCArNzc5LDggQEAKIAlyZXR1cm4gLTE7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIG5pZF9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwKLQkJCSAgICAgICBpbnQgKm5pZCkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgbmlkX3JhbmdlKHVuc2lnbmVkIGxvbmcgbG9uZyBzdGFydCwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBsb25nIGVuZCwgaW50ICpuaWQpCiB7CiAJKm5pZCA9IGZpbmRfbm9kZShzdGFydCk7CiAJc3RhcnQgKz0gUEFHRV9TSVpFOwpAQCAtNzg4LDggKzc5OCw4IEBACiAJcmV0dXJuIHN0YXJ0OwogfQogI2Vsc2UKLXN0YXRpYyB1bnNpZ25lZCBsb25nIG5pZF9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwKLQkJCSAgICAgICBpbnQgKm5pZCkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgbmlkX3JhbmdlKHVuc2lnbmVkIGxvbmcgbG9uZyBzdGFydCwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBsb25nIGVuZCwgaW50ICpuaWQpCiB7CiAJKm5pZCA9IDA7CiAJcmV0dXJuIGVuZDsKQEAgLTEwMTYsOCArMTAyNiw4IEBACiAJCXZhbCA9IG1kZXNjX2dldF9wcm9wZXJ0eShtZCwgbm9kZSwgImFkZHJlc3MtbWFzayIsIE5VTEwpOwogCQltLT5tYXNrID0gKnZhbDsKIAotCQludW1hZGJnKCJNTEdST1VQWyVkXTogbm9kZVslbHhdIGxhdGVuY3lbJWx4XSAiCi0JCQkibWF0Y2hbJWx4XSBtYXNrWyVseF1cbiIsCisJCW51bWFkYmcoIk1MR1JPVVBbJWRdOiBub2RlWyVsbHhdIGxhdGVuY3lbJWxseF0gIgorCQkJIm1hdGNoWyVsbHhdIG1hc2tbJWxseF1cbiIsCiAJCQljb3VudCAtIDEsIG0tPm5vZGUsIG0tPmxhdGVuY3ksIG0tPm1hdGNoLCBtLT5tYXNrKTsKIAl9CiAKQEAgLTEwNTYsNyArMTA2Niw3IEBACiAJCQkJCSAiYWRkcmVzcy1jb25ncnVlbmNlLW9mZnNldCIsIE5VTEwpOwogCQltLT5vZmZzZXQgPSAqdmFsOwogCi0JCW51bWFkYmcoIk1CTE9DS1slZF06IGJhc2VbJWx4XSBzaXplWyVseF0gb2Zmc2V0WyVseF1cbiIsCisJCW51bWFkYmcoIk1CTE9DS1slZF06IGJhc2VbJWxseF0gc2l6ZVslbGx4XSBvZmZzZXRbJWxseF1cbiIsCiAJCQljb3VudCAtIDEsIG0tPmJhc2UsIG0tPnNpemUsIG0tPm9mZnNldCk7CiAJfQogCkBAIC0xMTI3LDcgKzExMzcsNyBAQAogCW4tPm1hc2sgPSBjYW5kaWRhdGUtPm1hc2s7CiAJbi0+dmFsID0gY2FuZGlkYXRlLT5tYXRjaDsKIAotCW51bWFkYmcoIk5VTUEgTk9ERVslZF06IG1hc2tbJWx4XSB2YWxbJWx4XSAobGF0ZW5jeVslbHhdKVxuIiwKKwludW1hZGJnKCJOVU1BIE5PREVbJWRdOiBtYXNrWyVseF0gdmFsWyVseF0gKGxhdGVuY3lbJWxseF0pXG4iLAogCQlpbmRleCwgbi0+bWFzaywgbi0+dmFsLCBjYW5kaWRhdGUtPmxhdGVuY3kpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL3VtL01ha2VmaWxlIGIvYXJjaC91bS9NYWtlZmlsZQppbmRleCBkOTQ0YzM0Li4wNzI4ZGVmIDEwMDY0NAotLS0gYS9hcmNoL3VtL01ha2VmaWxlCisrKyBiL2FyY2gvdW0vTWFrZWZpbGUKQEAgLTIyLDEwICsyMiwxMSBAQAogCiBpbmNsdWRlICQoc3JjdHJlZSkvJChBUkNIX0RJUikvTWFrZWZpbGUtc2thcwogCi1BUkNIX0lOQ0xVREUJOj0gLUkkKHNyY3RyZWUpLyQoQVJDSF9ESVIpL2luY2x1ZGUvc2hhcmVkCitTSEFSRURfSEVBREVSUwk6PSAkKEFSQ0hfRElSKS9pbmNsdWRlL3NoYXJlZAorQVJDSF9JTkNMVURFCTo9IC1JJChzcmN0cmVlKS8kKFNIQVJFRF9IRUFERVJTKQogQVJDSF9JTkNMVURFCSs9IC1JJChzcmN0cmVlKS8kKEFSQ0hfRElSKS9zeXMtJChTVUJBUkNIKS9zaGFyZWQKIGlmbmVxICgkKEtCVUlMRF9TUkMpLCkKLUFSQ0hfSU5DTFVERQkrPSAtSSQoQVJDSF9ESVIpL2luY2x1ZGUvc2hhcmVkICMgZm9yIHR3byBnZW5lcmF0ZWQgZmlsZXMKK0FSQ0hfSU5DTFVERQkrPSAtSSQoU0hBUkVEX0hFQURFUlMpCiBlbmRpZgogS0JVSUxEX0NQUEZMQUdTICs9IC1JJChzcmN0cmVlKS8kKEFSQ0hfRElSKS9zeXMtJChTVUJBUkNIKQogCkBAIC04NSw4ICs4Niw4IEBACiAKIEtCVUlMRF9LQ09ORklHIDo9IGFyY2gvdW0vS2NvbmZpZy4kKEhFQURFUl9BUkNIKQogCi1hcmNocHJlcGFyZTogJChBUkNIX0RJUikvaW5jbHVkZS9zaGFyZWQvdXNlcl9jb25zdGFudHMuaAotcHJlcGFyZTogJChBUkNIX0RJUikvaW5jbHVkZS9zaGFyZWQva2Vybl9jb25zdGFudHMuaAorYXJjaHByZXBhcmU6ICQoU0hBUkVEX0hFQURFUlMpL3VzZXJfY29uc3RhbnRzLmgKK2FyY2hwcmVwYXJlOiAkKFNIQVJFRF9IRUFERVJTKS9rZXJuX2NvbnN0YW50cy5oCiAKIExJTkstJChDT05GSUdfTERfU0NSSVBUX1NUQVRJQykgKz0gLXN0YXRpYwogTElOSy0kKENPTkZJR19MRF9TQ1JJUFRfRFlOKSArPSAtV2wsLXJwYXRoLC9saWIKQEAgLTExOSwxNyArMTIwLDEzIEBACiAjIFdoZW4gY2xlYW5pbmcgd2UgZG9uJ3QgaW5jbHVkZSAuY29uZmlnLCBzbyB3ZSBkb24ndCBpbmNsdWRlCiAjIFRUIG9yIHNrYXMgbWFrZWZpbGVzIGFuZCBkb24ndCBjbGVhbiBza2FzX3B0cmVncy5oLgogQ0xFQU5fRklMRVMgKz0gbGludXggeC5pIGdtb24ub3V0IFwKLQkkKEFSQ0hfRElSKS9pbmNsdWRlL3NoYXJlZC91c2VyX2NvbnN0YW50cy5oIFwKLQkkKEFSQ0hfRElSKS9pbmNsdWRlL3NoYXJlZC9rZXJuX2NvbnN0YW50cy5oCisJJChTSEFSRURfSEVBREVSUykvdXNlcl9jb25zdGFudHMuaCBcCisJJChTSEFSRURfSEVBREVSUykva2Vybl9jb25zdGFudHMuaAogCiBhcmNoY2xlYW46CiAJQGZpbmQgLiBcKCAtbmFtZSAnKi5iYicgLW8gLW5hbWUgJyouYmJnJyAtbyAtbmFtZSAnKi5kYScgXAogCQktbyAtbmFtZSAnKi5nY292JyBcKSAtdHlwZSBmIC1wcmludCB8IHhhcmdzIHJtIC1mCiAKLSQob2JqdHJlZSkvJChBUkNIX0RJUikvaW5jbHVkZS9zaGFyZWQ6Ci0JQGVjaG8gJyAgTUtESVIgJEAnCi0JJChRKW1rZGlyIC1wICRACi0KICMgR2VuZXJhdGVkIGZpbGVzCiAKICQoQVJDSF9ESVIpL3N5cy0kKFNVQkFSQ0gpL3VzZXItb2Zmc2V0cy5zOiBGT1JDRQpAQCAtMTQ4LDExICsxNDUsMTEgQEAKICAgICAgICAgIGVjaG8gIiI7ICkKIGVuZGVmCiAKLSQoQVJDSF9ESVIpL2luY2x1ZGUvc2hhcmVkL3VzZXJfY29uc3RhbnRzLmg6ICQoQVJDSF9ESVIpL3N5cy0kKFNVQkFSQ0gpL3VzZXItb2Zmc2V0cy5zCiskKFNIQVJFRF9IRUFERVJTKS91c2VyX2NvbnN0YW50cy5oOiAkKEFSQ0hfRElSKS9zeXMtJChTVUJBUkNIKS91c2VyLW9mZnNldHMucwogCSQoY2FsbCBmaWxlY2hrLGdlbi1hc20tb2Zmc2V0cykKIAotJChBUkNIX0RJUikvaW5jbHVkZS9zaGFyZWQva2Vybl9jb25zdGFudHMuaDogJChvYmp0cmVlKS8kKEFSQ0hfRElSKS9pbmNsdWRlL3NoYXJlZAotCUBlY2hvICcgIFNZTUxJTksgJEAnCi0JJChRKWxuIC1zZiAuLi8uLi8uLi8uLi9pbmNsdWRlL2FzbS9hc20tb2Zmc2V0cy5oICRACiskKFNIQVJFRF9IRUFERVJTKS9rZXJuX2NvbnN0YW50cy5oOgorCSQoUSlta2RpciAtcCAkKGRpciAkQCkKKwkkKFEpZWNobyAnI2luY2x1ZGUgIi4uLy4uLy4uLy4uL2luY2x1ZGUvYXNtL2FzbS1vZmZzZXRzLmgiJyA+JEAKIAogZXhwb3J0IFNVQkFSQ0ggVVNFUl9DRkxBR1MgQ0ZMQUdTX05PX0hBUkRFTklORyBPUyBIRUFERVJfQVJDSCBERVZfTlVMTF9QQVRICmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvYXNtL3N5c3RlbS5oIGIvYXJjaC91bS9pbmNsdWRlL2FzbS9zeXN0ZW0uaAppbmRleCBhZTVmOTRkLi43NTMzNDZlIDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvYXNtL3N5c3RlbS5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9hc20vc3lzdGVtLmgKQEAgLTExLDIxICsxMSwyMSBAQAogZXh0ZXJuIHZvaWQgYmxvY2tfc2lnbmFscyh2b2lkKTsKIGV4dGVybiB2b2lkIHVuYmxvY2tfc2lnbmFscyh2b2lkKTsKIAotI2RlZmluZSByYXdfbG9jYWxfc2F2ZV9mbGFncyhmbGFncykgZG8geyB0eXBlY2hlY2sodW5zaWduZWQgbG9uZywgZmxhZ3MpOyBcCisjZGVmaW5lIGxvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpIGRvIHsgdHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsIGZsYWdzKTsgXAogCQkJCSAgICAgKGZsYWdzKSA9IGdldF9zaWduYWxzKCk7IH0gd2hpbGUoMCkKLSNkZWZpbmUgcmF3X2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKSBkbyB7IHR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCBmbGFncyk7IFwKKyNkZWZpbmUgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpIGRvIHsgdHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsIGZsYWdzKTsgXAogCQkJCSAgICAgIHNldF9zaWduYWxzKGZsYWdzKTsgfSB3aGlsZSgwKQogCi0jZGVmaW5lIHJhd19sb2NhbF9pcnFfc2F2ZShmbGFncykgZG8geyByYXdfbG9jYWxfc2F2ZV9mbGFncyhmbGFncyk7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X2xvY2FsX2lycV9kaXNhYmxlKCk7IH0gd2hpbGUoMCkKKyNkZWZpbmUgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpIGRvIHsgbG9jYWxfc2F2ZV9mbGFncyhmbGFncyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxfaXJxX2Rpc2FibGUoKTsgfSB3aGlsZSgwKQogCi0jZGVmaW5lIHJhd19sb2NhbF9pcnFfZW5hYmxlKCkgdW5ibG9ja19zaWduYWxzKCkKLSNkZWZpbmUgcmF3X2xvY2FsX2lycV9kaXNhYmxlKCkgYmxvY2tfc2lnbmFscygpCisjZGVmaW5lIGxvY2FsX2lycV9lbmFibGUoKSB1bmJsb2NrX3NpZ25hbHMoKQorI2RlZmluZSBsb2NhbF9pcnFfZGlzYWJsZSgpIGJsb2NrX3NpZ25hbHMoKQogCiAjZGVmaW5lIGlycXNfZGlzYWJsZWQoKSAgICAgICAgICAgICAgICAgXAogKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsgICAgICAgICAgICBcCi0gICAgICAgIHJhd19sb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKTsgICAgICAgIFwKKyAgICAgICAgbG9jYWxfc2F2ZV9mbGFncyhmbGFncyk7ICAgICAgICBcCiAgICAgICAgIChmbGFncyA9PSAwKTsgICAgICAgICAgICAgICAgICAgXAogfSkKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvdHJhcC5jIGIvYXJjaC91bS9rZXJuZWwvdHJhcC5jCmluZGV4IDQ0ZTQ5MDQuLjczODRkOGEgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3RyYXAuYworKysgYi9hcmNoL3VtL2tlcm5lbC90cmFwLmMKQEAgLTY0LDExICs2NCwxMCBAQAogCiAJZG8gewogCQlpbnQgZmF1bHQ7Ci1zdXJ2aXZlOgorCiAJCWZhdWx0ID0gaGFuZGxlX21tX2ZhdWx0KG1tLCB2bWEsIGFkZHJlc3MsIGlzX3dyaXRlKTsKIAkJaWYgKHVubGlrZWx5KGZhdWx0ICYgVk1fRkFVTFRfRVJST1IpKSB7CiAJCQlpZiAoZmF1bHQgJiBWTV9GQVVMVF9PT00pIHsKLQkJCQllcnIgPSAtRU5PTUVNOwogCQkJCWdvdG8gb3V0X29mX21lbW9yeTsKIAkJCX0gZWxzZSBpZiAoZmF1bHQgJiBWTV9GQVVMVF9TSUdCVVMpIHsKIAkJCQllcnIgPSAtRUFDQ0VTOwpAQCAtMTA0LDE4ICsxMDMsMTQgQEAKIG91dF9ub3NlbWFwaG9yZToKIAlyZXR1cm4gZXJyOwogCi0vKgotICogV2UgcmFuIG91dCBvZiBtZW1vcnksIG9yIHNvbWUgb3RoZXIgdGhpbmcgaGFwcGVuZWQgdG8gdXMgdGhhdCBtYWRlCi0gKiB1cyB1bmFibGUgdG8gaGFuZGxlIHRoZSBwYWdlIGZhdWx0IGdyYWNlZnVsbHkuCi0gKi8KIG91dF9vZl9tZW1vcnk6Ci0JaWYgKGlzX2dsb2JhbF9pbml0KGN1cnJlbnQpKSB7Ci0JCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7Ci0JCXlpZWxkKCk7Ci0JCWRvd25fcmVhZCgmbW0tPm1tYXBfc2VtKTsKLQkJZ290byBzdXJ2aXZlOwotCX0KLQlnb3RvIG91dDsKKwkvKgorCSAqIFdlIHJhbiBvdXQgb2YgbWVtb3J5LCBjYWxsIHRoZSBPT00ga2lsbGVyLCBhbmQgcmV0dXJuIHRoZSB1c2Vyc3BhY2UKKwkgKiAod2hpY2ggd2lsbCByZXRyeSB0aGUgZmF1bHQsIG9yIGtpbGwgdXMgaWYgd2UgZ290IG9vbS1raWxsZWQpLgorCSAqLworCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJcGFnZWZhdWx0X291dF9vZl9tZW1vcnkoKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgYmFkX3NlZ3Yoc3RydWN0IGZhdWx0aW5mbyBmaSwgdW5zaWduZWQgbG9uZyBpcCkKQEAgLTIxNCw5ICsyMDksNiBAQAogCQlzaS5zaV9hZGRyID0gKHZvaWQgX191c2VyICopYWRkcmVzczsKIAkJY3VycmVudC0+dGhyZWFkLmFyY2guZmF1bHRpbmZvID0gZmk7CiAJCWZvcmNlX3NpZ19pbmZvKFNJR0JVUywgJnNpLCBjdXJyZW50KTsKLQl9IGVsc2UgaWYgKGVyciA9PSAtRU5PTUVNKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIlZNOiBraWxsaW5nIHByb2Nlc3MgJXNcbiIsIGN1cnJlbnQtPmNvbW0pOwotCQlkb19leGl0KFNJR0tJTEwpOwogCX0gZWxzZSB7CiAJCUJVR19PTihlcnIgIT0gLUVGQVVMVCk7CiAJCXNpLnNpX3NpZ25vID0gU0lHU0VHVjsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L0tjb25maWcuY3B1IGIvYXJjaC94ODYvS2NvbmZpZy5jcHUKaW5kZXggODVhNzg1Ny4uODA3ODk1NSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvS2NvbmZpZy5jcHUKKysrIGIvYXJjaC94ODYvS2NvbmZpZy5jcHUKQEAgLTQwOCw3ICs0MDgsNyBAQAogCiBjb25maWcgWDg2X0RFQlVHQ1RMTVNSCiAJZGVmX2Jvb2wgeQotCWRlcGVuZHMgb24gIShNSzYgfHwgTVdJTkNISVBDNiB8fCBNV0lOQ0hJUDNEIHx8IE1DWVJJWElJSSB8fCBNNTg2TU1YIHx8IE01ODZUU0MgfHwgTTU4NiB8fCBNNDg2IHx8IE0zODYpCisJZGVwZW5kcyBvbiAhKE1LNiB8fCBNV0lOQ0hJUEM2IHx8IE1XSU5DSElQM0QgfHwgTUNZUklYSUlJIHx8IE01ODZNTVggfHwgTTU4NlRTQyB8fCBNNTg2IHx8IE00ODYgfHwgTTM4NikgJiYgIVVNTAogCiBtZW51Y29uZmlnIFBST0NFU1NPUl9TRUxFQ1QKIAlib29sICJTdXBwb3J0ZWQgcHJvY2Vzc29yIHZlbmRvcnMiIGlmIEVNQkVEREVECmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggNGE4ZTgwYy4uYTlmOGE4MSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMjIsMyArMjIsNCBAQAogdW5pZmRlZi15ICs9IHVuaXN0ZF82NC5oCiB1bmlmZGVmLXkgKz0gdm04Ni5oCiB1bmlmZGVmLXkgKz0gdnN5c2NhbGwuaAordW5pZmRlZi15ICs9IHN3YWIuaApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYXRvbWljXzMyLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hdG9taWNfMzIuaAppbmRleCBhZDViOWY2Li44NWI0NmZiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hdG9taWNfMzIuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hdG9taWNfMzIuaApAQCAtMiw2ICsyLDcgQEAKICNkZWZpbmUgX0FTTV9YODZfQVRPTUlDXzMyX0gKIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL2NtcHhjaGcuaD4KIApAQCAtMTAsMTUgKzExLDYgQEAKICAqIHJlc291cmNlIGNvdW50aW5nIGV0Yy4uCiAgKi8KIAotLyoKLSAqIE1ha2Ugc3VyZSBnY2MgZG9lc24ndCB0cnkgdG8gYmUgY2xldmVyIGFuZCBtb3ZlIHRoaW5ncyBhcm91bmQKLSAqIG9uIHVzLiBXZSBuZWVkIHRvIHVzZSBfZXhhY3RseV8gdGhlIGFkZHJlc3MgdGhlIHVzZXIgZ2F2ZSB1cywKLSAqIG5vdCBzb21lIGFsaWFzIHRoYXQgY29udGFpbnMgdGhlIHNhbWUgaW5mb3JtYXRpb24uCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLQlpbnQgY291bnRlcjsKLX0gYXRvbWljX3Q7Ci0KICNkZWZpbmUgQVRPTUlDX0lOSVQoaSkJeyAoaSkgfQogCiAvKioKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2F0b21pY182NC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYXRvbWljXzY0LmgKaW5kZXggMjc5ZDJhNy4uOGMyMTczMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYXRvbWljXzY0LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYXRvbWljXzY0LmgKQEAgLTEsMjUgKzEsMTUgQEAKICNpZm5kZWYgX0FTTV9YODZfQVRPTUlDXzY0X0gKICNkZWZpbmUgX0FTTV9YODZfQVRPTUlDXzY0X0gKIAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL2FsdGVybmF0aXZlLmg+CiAjaW5jbHVkZSA8YXNtL2NtcHhjaGcuaD4KIAotLyogYXRvbWljX3Qgc2hvdWxkIGJlIDMyIGJpdCBzaWduZWQgdHlwZSAqLwotCiAvKgogICogQXRvbWljIG9wZXJhdGlvbnMgdGhhdCBDIGNhbid0IGd1YXJhbnRlZSB1cy4gIFVzZWZ1bCBmb3IKICAqIHJlc291cmNlIGNvdW50aW5nIGV0Yy4uCiAgKi8KIAotLyoKLSAqIE1ha2Ugc3VyZSBnY2MgZG9lc24ndCB0cnkgdG8gYmUgY2xldmVyIGFuZCBtb3ZlIHRoaW5ncyBhcm91bmQKLSAqIG9uIHVzLiBXZSBuZWVkIHRvIHVzZSBfZXhhY3RseV8gdGhlIGFkZHJlc3MgdGhlIHVzZXIgZ2F2ZSB1cywKLSAqIG5vdCBzb21lIGFsaWFzIHRoYXQgY29udGFpbnMgdGhlIHNhbWUgaW5mb3JtYXRpb24uCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLQlpbnQgY291bnRlcjsKLX0gYXRvbWljX3Q7Ci0KICNkZWZpbmUgQVRPTUlDX0lOSVQoaSkJeyAoaSkgfQogCiAvKioKQEAgLTE5MSwxMSArMTgxLDcgQEAKICNkZWZpbmUgYXRvbWljX2luY19yZXR1cm4odikgIChhdG9taWNfYWRkX3JldHVybigxLCB2KSkKICNkZWZpbmUgYXRvbWljX2RlY19yZXR1cm4odikgIChhdG9taWNfc3ViX3JldHVybigxLCB2KSkKIAotLyogQW4gNjRiaXQgYXRvbWljIHR5cGUgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotCWxvbmcgY291bnRlcjsKLX0gYXRvbWljNjRfdDsKKy8qIFRoZSA2NC1iaXQgYXRvbWljIHR5cGUgKi8KIAogI2RlZmluZSBBVE9NSUM2NF9JTklUKGkpCXsgKGkpIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaAppbmRleCBmMTEwYWQ0Li43YzQ5OTE3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaApAQCAtMSw2NSArMSw3IEBACiAjaWZuZGVmIF9BU01fWDg2X0JZVEVPUkRFUl9ICiAjZGVmaW5lIF9BU01fWDg2X0JZVEVPUkRFUl9ICiAKLSNpbmNsdWRlIDxhc20vdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotCi0jZGVmaW5lIF9fTElUVExFX0VORElBTgotCi1zdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19hcmNoX3N3YWIzMihfX3UzMiB2YWwpCi17Ci0jaWZkZWYgX19pMzg2X18KLSMgaWZkZWYgQ09ORklHX1g4Nl9CU1dBUAotCWFzbSgiYnN3YXAgJTAiIDogIj1yIiAodmFsKSA6ICIwIiAodmFsKSk7Ci0jIGVsc2UKLQlhc20oInhjaGdiICViMCwlaDBcblx0IgkvKiBzd2FwIGxvd2VyIGJ5dGVzCSovCi0JICAgICJyb3JsICQxNiwlMFxuXHQiCS8qIHN3YXAgd29yZHMJCSovCi0JICAgICJ4Y2hnYiAlYjAsJWgwIgkvKiBzd2FwIGhpZ2hlciBieXRlcwkqLwotCSAgICA6ICI9cSIgKHZhbCkKLQkgICAgOiAiMCIgKHZhbCkpOwotIyBlbmRpZgotCi0jZWxzZSAvKiBfX2kzODZfXyAqLwotCWFzbSgiYnN3YXBsICUwIgotCSAgICA6ICI9ciIgKHZhbCkKLQkgICAgOiAiMCIgKHZhbCkpOwotI2VuZGlmCi0JcmV0dXJuIHZhbDsKLX0KLSNkZWZpbmUgX19hcmNoX3N3YWIzMiBfX2FyY2hfc3dhYjMyCi0KLXN0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyBfX3U2NCBfX2FyY2hfc3dhYjY0KF9fdTY0IHZhbCkKLXsKLSNpZmRlZiBfX2kzODZfXwotCXVuaW9uIHsKLQkJc3RydWN0IHsKLQkJCV9fdTMyIGE7Ci0JCQlfX3UzMiBiOwotCQl9IHM7Ci0JCV9fdTY0IHU7Ci0JfSB2OwotCXYudSA9IHZhbDsKLSMgaWZkZWYgQ09ORklHX1g4Nl9CU1dBUAotCWFzbSgiYnN3YXBsICUwIDsgYnN3YXBsICUxIDsgeGNoZ2wgJTAsJTEiCi0JICAgIDogIj1yIiAodi5zLmEpLCAiPXIiICh2LnMuYikKLQkgICAgOiAiMCIgKHYucy5hKSwgIjEiICh2LnMuYikpOwotIyBlbHNlCi0Jdi5zLmEgPSBfX2FyY2hfc3dhYjMyKHYucy5hKTsKLQl2LnMuYiA9IF9fYXJjaF9zd2FiMzIodi5zLmIpOwotCWFzbSgieGNoZ2wgJTAsJTEiCi0JICAgIDogIj1yIiAodi5zLmEpLCAiPXIiICh2LnMuYikKLQkgICAgOiAiMCIgKHYucy5hKSwgIjEiICh2LnMuYikpOwotIyBlbmRpZgotCXJldHVybiB2LnU7Ci0jZWxzZSAvKiBfX2kzODZfXyAqLwotCWFzbSgiYnN3YXBxICUwIgotCSAgICA6ICI9ciIgKHZhbCkKLQkgICAgOiAiMCIgKHZhbCkpOwotCXJldHVybiB2YWw7Ci0jZW5kaWYKLX0KLSNkZWZpbmUgX19hcmNoX3N3YWI2NCBfX2FyY2hfc3dhYjY0Ci0KLSNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vc3dhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9saXR0bGVfZW5kaWFuLmg+CiAKICNlbmRpZiAvKiBfQVNNX1g4Nl9CWVRFT1JERVJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc3dhYi5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc3dhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNmQ0MTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zd2FiLmgKQEAgLTAsMCArMSw2MSBAQAorI2lmbmRlZiBfQVNNX1g4Nl9TV0FCX0gKKyNkZWZpbmUgX0FTTV9YODZfU1dBQl9ICisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19hcmNoX3N3YWIzMihfX3UzMiB2YWwpCit7CisjaWZkZWYgX19pMzg2X18KKyMgaWZkZWYgQ09ORklHX1g4Nl9CU1dBUAorCWFzbSgiYnN3YXAgJTAiIDogIj1yIiAodmFsKSA6ICIwIiAodmFsKSk7CisjIGVsc2UKKwlhc20oInhjaGdiICViMCwlaDBcblx0IgkvKiBzd2FwIGxvd2VyIGJ5dGVzCSovCisJICAgICJyb3JsICQxNiwlMFxuXHQiCS8qIHN3YXAgd29yZHMJCSovCisJICAgICJ4Y2hnYiAlYjAsJWgwIgkvKiBzd2FwIGhpZ2hlciBieXRlcwkqLworCSAgICA6ICI9cSIgKHZhbCkKKwkgICAgOiAiMCIgKHZhbCkpOworIyBlbmRpZgorCisjZWxzZSAvKiBfX2kzODZfXyAqLworCWFzbSgiYnN3YXBsICUwIgorCSAgICA6ICI9ciIgKHZhbCkKKwkgICAgOiAiMCIgKHZhbCkpOworI2VuZGlmCisJcmV0dXJuIHZhbDsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWIzMiBfX2FyY2hfc3dhYjMyCisKK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyBfX3U2NCBfX2FyY2hfc3dhYjY0KF9fdTY0IHZhbCkKK3sKKyNpZmRlZiBfX2kzODZfXworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fdTMyIGE7CisJCQlfX3UzMiBiOworCQl9IHM7CisJCV9fdTY0IHU7CisJfSB2OworCXYudSA9IHZhbDsKKyMgaWZkZWYgQ09ORklHX1g4Nl9CU1dBUAorCWFzbSgiYnN3YXBsICUwIDsgYnN3YXBsICUxIDsgeGNoZ2wgJTAsJTEiCisJICAgIDogIj1yIiAodi5zLmEpLCAiPXIiICh2LnMuYikKKwkgICAgOiAiMCIgKHYucy5hKSwgIjEiICh2LnMuYikpOworIyBlbHNlCisJdi5zLmEgPSBfX2FyY2hfc3dhYjMyKHYucy5hKTsKKwl2LnMuYiA9IF9fYXJjaF9zd2FiMzIodi5zLmIpOworCWFzbSgieGNoZ2wgJTAsJTEiCisJICAgIDogIj1yIiAodi5zLmEpLCAiPXIiICh2LnMuYikKKwkgICAgOiAiMCIgKHYucy5hKSwgIjEiICh2LnMuYikpOworIyBlbmRpZgorCXJldHVybiB2LnU7CisjZWxzZSAvKiBfX2kzODZfXyAqLworCWFzbSgiYnN3YXBxICUwIgorCSAgICA6ICI9ciIgKHZhbCkKKwkgICAgOiAiMCIgKHZhbCkpOworCXJldHVybiB2YWw7CisjZW5kaWYKK30KKyNkZWZpbmUgX19hcmNoX3N3YWI2NCBfX2FyY2hfc3dhYjY0CisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9TV0FCX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N3aW90bGIuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N3aW90bGIuaAppbmRleCA1MWZiMmM3Li5iOWU0ZTIwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zd2lvdGxiLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc3dpb3RsYi5oCkBAIC0xLDQ2ICsxLDEwIEBACiAjaWZuZGVmIF9BU01fWDg2X1NXSU9UTEJfSAogI2RlZmluZSBfQVNNX1g4Nl9TV0lPVExCX0gKIAotI2luY2x1ZGUgPGFzbS9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N3aW90bGIuaD4KIAogLyogU1dJT1RMQiBpbnRlcmZhY2UgKi8KIAotZXh0ZXJuIGRtYV9hZGRyX3Qgc3dpb3RsYl9tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCB2b2lkICpwdHIsCi0JCQkJICAgICBzaXplX3Qgc2l6ZSwgaW50IGRpcik7Ci1leHRlcm4gdm9pZCAqc3dpb3RsYl9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc2l6ZV90IHNpemUsCi0JCQkJICAgIGRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsIGdmcF90IGZsYWdzKTsKLWV4dGVybiB2b2lkIHN3aW90bGJfdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBkbWFfYWRkcl90IGRldl9hZGRyLAotCQkJCSBzaXplX3Qgc2l6ZSwgaW50IGRpcik7Ci1leHRlcm4gdm9pZCBzd2lvdGxiX3N5bmNfc2luZ2xlX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqaHdkZXYsCi0JCQkJCWRtYV9hZGRyX3QgZGV2X2FkZHIsCi0JCQkJCXNpemVfdCBzaXplLCBpbnQgZGlyKTsKLWV4dGVybiB2b2lkIHN3aW90bGJfc3luY19zaW5nbGVfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpod2RldiwKLQkJCQkJICAgZG1hX2FkZHJfdCBkZXZfYWRkciwKLQkJCQkJICAgc2l6ZV90IHNpemUsIGludCBkaXIpOwotZXh0ZXJuIHZvaWQgc3dpb3RsYl9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmh3ZGV2LAotCQkJCQkgICAgICBkbWFfYWRkcl90IGRldl9hZGRyLAotCQkJCQkgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwKLQkJCQkJICAgICAgc2l6ZV90IHNpemUsIGludCBkaXIpOwotZXh0ZXJuIHZvaWQgc3dpb3RsYl9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LAotCQkJCQkJIGRtYV9hZGRyX3QgZGV2X2FkZHIsCi0JCQkJCQkgdW5zaWduZWQgbG9uZyBvZmZzZXQsCi0JCQkJCQkgc2l6ZV90IHNpemUsIGludCBkaXIpOwotZXh0ZXJuIHZvaWQgc3dpb3RsYl9zeW5jX3NnX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqaHdkZXYsCi0JCQkJICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZWxlbXMsCi0JCQkJICAgIGludCBkaXIpOwotZXh0ZXJuIHZvaWQgc3dpb3RsYl9zeW5jX3NnX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqaHdkZXYsCi0JCQkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZWxlbXMsCi0JCQkJICAgICAgIGludCBkaXIpOwotZXh0ZXJuIGludCBzd2lvdGxiX21hcF9zZyhzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKLQkJCSAgaW50IG5lbnRzLCBpbnQgZGlyZWN0aW9uKTsKLWV4dGVybiB2b2lkIHN3aW90bGJfdW5tYXBfc2coc3RydWN0IGRldmljZSAqaHdkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCi0JCQkgICAgIGludCBuZW50cywgaW50IGRpcmVjdGlvbik7Ci1leHRlcm4gaW50IHN3aW90bGJfZG1hX21hcHBpbmdfZXJyb3Ioc3RydWN0IGRldmljZSAqaHdkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIpOwotZXh0ZXJuIHZvaWQgc3dpb3RsYl9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBzaXplX3Qgc2l6ZSwKLQkJCQkgIHZvaWQgKnZhZGRyLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUpOwotZXh0ZXJuIGludCBzd2lvdGxiX2RtYV9zdXBwb3J0ZWQoc3RydWN0IGRldmljZSAqaHdkZXYsIHU2NCBtYXNrKTsKLWV4dGVybiB2b2lkIHN3aW90bGJfaW5pdCh2b2lkKTsKLQogZXh0ZXJuIGludCBzd2lvdGxiX2ZvcmNlOwogCiAjaWZkZWYgQ09ORklHX1NXSU9UTEIKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Vud2luZC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdW53aW5kLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMDY0YmQuLjAwMDAwMDAKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdW53aW5kLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jaWZuZGVmIF9BU01fWDg2X1VOV0lORF9ICi0jZGVmaW5lIF9BU01fWDg2X1VOV0lORF9ICi0KLSNkZWZpbmUgVU5XX1BDKGZyYW1lKSAoKHZvaWQpKGZyYW1lKSwgMFVMKQotI2RlZmluZSBVTldfU1AoZnJhbWUpICgodm9pZCkoZnJhbWUpLCAwVUwpCi0jZGVmaW5lIFVOV19GUChmcmFtZSkgKCh2b2lkKShmcmFtZSksIDBVTCkKLQotc3RhdGljIGlubGluZSBpbnQgYXJjaF91bndfdXNlcl9tb2RlKGNvbnN0IHZvaWQgKmluZm8pCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiBfQVNNX1g4Nl9VTldJTkRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2xvbmdoYXVsLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuYwppbmRleCBiMDQ2MTg1Li5hNGNmZjVkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuYwpAQCAtOTgyLDcgKzk4Miw3IEBACiAJY2FzZSAxMDoKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVXNlIGFjcGktY3B1ZnJlcSBkcml2ZXIgZm9yIFZJQSBDN1xuIik7CiAJZGVmYXVsdDoKLQkJOzsKKwkJOwogCX0KIAogCXJldHVybiAtRU5PREVWOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3A0LWNsb2NrbW9kLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcDQtY2xvY2ttb2QuYwppbmRleCBiOGUwNWVlLi5iZWVhNDQ2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcDQtY2xvY2ttb2QuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcDQtY2xvY2ttb2QuYwpAQCAtMTYwLDYgKzE2MCw3IEBACiAJCXN3aXRjaCAoYy0+eDg2X21vZGVsKSB7CiAJCWNhc2UgMHgwRTogLyogQ29yZSAqLwogCQljYXNlIDB4MEY6IC8qIENvcmUgRHVvICovCisJCWNhc2UgMHgxNjogLyogQ2VsZXJvbiBDb3JlICovCiAJCQlwNGNsb2NrbW9kX2RyaXZlci5mbGFncyB8PSBDUFVGUkVRX0NPTlNUX0xPT1BTOwogCQkJcmV0dXJuIHNwZWVkc3RlcF9nZXRfcHJvY2Vzc29yX2ZyZXF1ZW5jeShTUEVFRFNURVBfUFJPQ0VTU09SX1BDT1JFKTsKIAkJY2FzZSAweDBEOiAvKiBQZW50aXVtIE0gKERvdGhhbikgKi8KQEAgLTE3MSw3ICsxNzIsOSBAQAogCX0KIAogCWlmIChjLT54ODYgIT0gMHhGKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJVbmtub3duIHA0LWNsb2NrbW9kLWNhcGFibGUgQ1BVLiBQbGVhc2Ugc2VuZCBhbiBlLW1haWwgdG8gPGNwdWZyZXFAdmdlci5rZXJuZWwub3JnPlxuIik7CisJCWlmICghY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9FU1QpKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIlVua25vd24gcDQtY2xvY2ttb2QtY2FwYWJsZSBDUFUuICIKKwkJCQkiUGxlYXNlIHNlbmQgYW4gZS1tYWlsIHRvIDxjcHVmcmVxQHZnZXIua2VybmVsLm9yZz5cbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTI3NCw2ICsyNzcsNyBAQAogCS5uYW1lCQk9ICJwNC1jbG9ja21vZCIsCiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5hdHRyCQk9IHA0Y2xvY2ttb2RfYXR0ciwKKwkuaGlkZV9pbnRlcmZhY2UJPSAxLAogfTsKIAogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWNlbnRyaW5vLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWNlbnRyaW5vLmMKaW5kZXggM2I1ZjA2NC4uZjBlYTZmYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1jZW50cmluby5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtY2VudHJpbm8uYwpAQCAtNDU5LDkgKzQ1OSw3IEBACiAgKiBTZXRzIGEgbmV3IENQVUZyZXEgcG9saWN5LgogICovCiBzdHJ1Y3QgYWxsbWFza3MgewotCWNwdW1hc2tfdAkJb25saW5lX3BvbGljeV9jcHVzOwogCWNwdW1hc2tfdAkJc2F2ZWRfbWFzazsKLQljcHVtYXNrX3QJCXNldF9tYXNrOwogCWNwdW1hc2tfdAkJY292ZXJlZF9jcHVzOwogfTsKIApAQCAtNDc1LDkgKzQ3Myw3IEBACiAJaW50CQkJcmV0dmFsID0gMDsKIAl1bnNpZ25lZCBpbnQJCWosIGssIGZpcnN0X2NwdSwgdG1wOwogCUNQVU1BU0tfQUxMT0MoYWxsbWFza3MpOwotCUNQVU1BU0tfUFRSKG9ubGluZV9wb2xpY3lfY3B1cywgYWxsbWFza3MpOwogCUNQVU1BU0tfUFRSKHNhdmVkX21hc2ssIGFsbG1hc2tzKTsKLQlDUFVNQVNLX1BUUihzZXRfbWFzaywgYWxsbWFza3MpOwogCUNQVU1BU0tfUFRSKGNvdmVyZWRfY3B1cywgYWxsbWFza3MpOwogCiAJaWYgKHVubGlrZWx5KGFsbG1hc2tzID09IE5VTEwpKQpAQCAtNDk3LDMwICs0OTMsMjggQEAKIAkJZ290byBvdXQ7CiAJfQogCi0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi0JLyogY3B1ZnJlcSBob2xkcyB0aGUgaG90cGx1ZyBsb2NrLCBzbyB3ZSBhcmUgc2FmZSBmcm9tIGhlcmUgb24gKi8KLQljcHVzX2FuZCgqb25saW5lX3BvbGljeV9jcHVzLCBjcHVfb25saW5lX21hcCwgcG9saWN5LT5jcHVzKTsKLSNlbHNlCi0JKm9ubGluZV9wb2xpY3lfY3B1cyA9IHBvbGljeS0+Y3B1czsKLSNlbmRpZgotCiAJKnNhdmVkX21hc2sgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CiAJZmlyc3RfY3B1ID0gMTsKIAljcHVzX2NsZWFyKCpjb3ZlcmVkX2NwdXMpOwotCWZvcl9lYWNoX2NwdV9tYXNrX25yKGosICpvbmxpbmVfcG9saWN5X2NwdXMpIHsKKwlmb3JfZWFjaF9jcHVfbWFza19ucihqLCBwb2xpY3ktPmNwdXMpIHsKKwkJY29uc3QgY3B1bWFza190ICptYXNrOworCisJCS8qIGNwdWZyZXEgaG9sZHMgdGhlIGhvdHBsdWcgbG9jaywgc28gd2UgYXJlIHNhZmUgaGVyZSAqLworCQlpZiAoIWNwdV9vbmxpbmUoaikpCisJCQljb250aW51ZTsKKwogCQkvKgogCQkgKiBTdXBwb3J0IGZvciBTTVAgc3lzdGVtcy4KIAkJICogTWFrZSBzdXJlIHdlIGFyZSBydW5uaW5nIG9uIENQVSB0aGF0IHdhbnRzIHRvIGNoYW5nZSBmcmVxCiAJCSAqLwotCQljcHVzX2NsZWFyKCpzZXRfbWFzayk7CiAJCWlmIChwb2xpY3ktPnNoYXJlZF90eXBlID09IENQVUZSRVFfU0hBUkVEX1RZUEVfQU5ZKQotCQkJY3B1c19vcigqc2V0X21hc2ssICpzZXRfbWFzaywgKm9ubGluZV9wb2xpY3lfY3B1cyk7CisJCQltYXNrID0gJnBvbGljeS0+Y3B1czsKIAkJZWxzZQotCQkJY3B1X3NldChqLCAqc2V0X21hc2spOworCQkJbWFzayA9ICZjcHVtYXNrX29mX2NwdShqKTsKIAotCQlzZXRfY3B1c19hbGxvd2VkX3B0cihjdXJyZW50LCBzZXRfbWFzayk7CisJCXNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsIG1hc2spOwogCQlwcmVlbXB0X2Rpc2FibGUoKTsKLQkJaWYgKHVubGlrZWx5KCFjcHVfaXNzZXQoc21wX3Byb2Nlc3Nvcl9pZCgpLCAqc2V0X21hc2spKSkgeworCQlpZiAodW5saWtlbHkoIWNwdV9pc3NldChzbXBfcHJvY2Vzc29yX2lkKCksICptYXNrKSkpIHsKIAkJCWRwcmludGsoImNvdWxkbid0IGxpbWl0IHRvIENQVXMgaW4gdGhpcyBkb21haW5cbiIpOwogCQkJcmV0dmFsID0gLUVBR0FJTjsKIAkJCWlmIChmaXJzdF9jcHUpIHsKQEAgLTU0OCw3ICs1NDIsOSBAQAogCQkJZHByaW50aygidGFyZ2V0PSVka0h6IG9sZD0lZCBuZXc9JWQgbXNyPSUwNHhcbiIsCiAJCQkJdGFyZ2V0X2ZyZXEsIGZyZXFzLm9sZCwgZnJlcXMubmV3LCBtc3IpOwogCi0JCQlmb3JfZWFjaF9jcHVfbWFza19ucihrLCAqb25saW5lX3BvbGljeV9jcHVzKSB7CisJCQlmb3JfZWFjaF9jcHVfbWFza19ucihrLCBwb2xpY3ktPmNwdXMpIHsKKwkJCQlpZiAoIWNwdV9vbmxpbmUoaykpCisJCQkJCWNvbnRpbnVlOwogCQkJCWZyZXFzLmNwdSA9IGs7CiAJCQkJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsCiAJCQkJCUNQVUZSRVFfUFJFQ0hBTkdFKTsKQEAgLTU3MSw3ICs1NjcsOSBAQAogCQlwcmVlbXB0X2VuYWJsZSgpOwogCX0KIAotCWZvcl9lYWNoX2NwdV9tYXNrX25yKGssICpvbmxpbmVfcG9saWN5X2NwdXMpIHsKKwlmb3JfZWFjaF9jcHVfbWFza19ucihrLCBwb2xpY3ktPmNwdXMpIHsKKwkJaWYgKCFjcHVfb25saW5lKGspKQorCQkJY29udGludWU7CiAJCWZyZXFzLmNwdSA9IGs7CiAJCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOwogCX0KQEAgLTU4NCwxOCArNTgyLDE3IEBACiAJCSAqIEJlc3QgZWZmb3J0IHVuZG8uLgogCQkgKi8KIAotCQlpZiAoIWNwdXNfZW1wdHkoKmNvdmVyZWRfY3B1cykpCi0JCQlmb3JfZWFjaF9jcHVfbWFza19ucihqLCAqY292ZXJlZF9jcHVzKSB7Ci0JCQkJc2V0X2NwdXNfYWxsb3dlZF9wdHIoY3VycmVudCwKLQkJCQkJCSAgICAgJmNwdW1hc2tfb2ZfY3B1KGopKTsKLQkJCQl3cm1zcihNU1JfSUEzMl9QRVJGX0NUTCwgb2xkbXNyLCBoKTsKLQkJCX0KKwkJZm9yX2VhY2hfY3B1X21hc2tfbnIoaiwgKmNvdmVyZWRfY3B1cykgeworCQkJc2V0X2NwdXNfYWxsb3dlZF9wdHIoY3VycmVudCwgJmNwdW1hc2tfb2ZfY3B1KGopKTsKKwkJCXdybXNyKE1TUl9JQTMyX1BFUkZfQ1RMLCBvbGRtc3IsIGgpOworCQl9CiAKIAkJdG1wID0gZnJlcXMubmV3OwogCQlmcmVxcy5uZXcgPSBmcmVxcy5vbGQ7CiAJCWZyZXFzLm9sZCA9IHRtcDsKLQkJZm9yX2VhY2hfY3B1X21hc2tfbnIoaiwgKm9ubGluZV9wb2xpY3lfY3B1cykgewotCQkJZnJlcXMuY3B1ID0gajsKKwkJZm9yX2VhY2hfY3B1X21hc2tfbnIoaiwgcG9saWN5LT5jcHVzKSB7CisJCQlpZiAoIWNwdV9vbmxpbmUoaikpCisJCQkJY29udGludWU7CiAJCQljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QUkVDSEFOR0UpOwogCQkJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7CiAJCX0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtbGliLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWxpYi5jCmluZGV4IDk4ZDRmZGIuLmNkYWM3ZDYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtbGliLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1saWIuYwpAQCAtMTM5LDYgKzEzOSwxNSBAQAogCWNhc2UgMzoKIAkJZnNiID0gMTY2NjY3OwogCQlicmVhazsKKwljYXNlIDI6CisJCWZzYiA9IDIwMDAwMDsKKwkJYnJlYWs7CisJY2FzZSAwOgorCQlmc2IgPSAyNjY2Njc7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJZnNiID0gMzMzMzMzOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlwcmludGsoS0VSTl9FUlIgIlBDT1JFIC0gTVNSX0ZTQl9GUkVRIHVuZGVmaW5lZCB2YWx1ZSIpOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9rcHJvYmVzLmMgYi9hcmNoL3g4Ni9rZXJuZWwva3Byb2Jlcy5jCmluZGV4IDZjMjc2NzkuLjg4NGQ5ODUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9rcHJvYmVzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2twcm9iZXMuYwpAQCAtMzc2LDkgKzM3NiwxMCBAQAogCiB2b2lkIF9fa3Byb2JlcyBhcmNoX3JlbW92ZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKLQltdXRleF9sb2NrKCZrcHJvYmVfbXV0ZXgpOwotCWZyZWVfaW5zbl9zbG90KHAtPmFpbnNuLmluc24sIChwLT5haW5zbi5ib29zdGFibGUgPT0gMSkpOwotCW11dGV4X3VubG9jaygma3Byb2JlX211dGV4KTsKKwlpZiAocC0+YWluc24uaW5zbikgeworCQlmcmVlX2luc25fc2xvdChwLT5haW5zbi5pbnNuLCAocC0+YWluc24uYm9vc3RhYmxlID09IDEpKTsKKwkJcC0+YWluc24uaW5zbiA9IE5VTEw7CisJfQogfQogCiBzdGF0aWMgdm9pZCBfX2twcm9iZXMgc2F2ZV9wcmV2aW91c19rcHJvYmUoc3RydWN0IGtwcm9iZV9jdGxibGsgKmtjYikKQEAgLTY5NCw3ICs2OTUsNyBAQAogCS8qCiAJICogSXQgaXMgcG9zc2libGUgdG8gaGF2ZSBtdWx0aXBsZSBpbnN0YW5jZXMgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4KIAkgKiB0YXNrIGVpdGhlciBiZWNhdXNlIG11bHRpcGxlIGZ1bmN0aW9ucyBpbiB0aGUgY2FsbCBwYXRoIGhhdmUKLQkgKiByZXR1cm4gcHJvYmVzIGluc3RhbGxlZCBvbiB0aGVtLCBhbmQvb3IgbW9yZSB0aGVuIG9uZQorCSAqIHJldHVybiBwcm9iZXMgaW5zdGFsbGVkIG9uIHRoZW0sIGFuZC9vciBtb3JlIHRoYW4gb25lCiAJICogcmV0dXJuIHByb2JlIHdhcyByZWdpc3RlcmVkIGZvciBhIHRhcmdldCBmdW5jdGlvbi4KIAkgKgogCSAqIFdlIGNhbiBoYW5kbGUgdGhpcyBiZWNhdXNlOgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL21mZ3B0XzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvbWZncHRfMzIuYwppbmRleCBjMTIzMTRjLi44ODE1ZjNjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvbWZncHRfMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvbWZncHRfMzIuYwpAQCAtMjUyLDcgKzI1Miw3IEBACiAvKgogICogVGhlIE1GUEdUIHRpbWVycyBvbiB0aGUgQ1M1NTM2IHByb3ZpZGUgdXMgd2l0aCBzdWl0YWJsZSB0aW1lcnMgdG8gdXNlCiAgKiBhcyBjbG9jayBldmVudCBzb3VyY2VzIC0gbm90IGFzIGdvb2QgYXMgYSBIUEVUIG9yIEFQSUMsIGJ1dCBjZXJ0YWlubHkKLSAqIGJldHRlciB0aGVuIHRoZSBQSVQuICBUaGlzIGlzbid0IGEgZ2VuZXJhbCBwdXJwb3NlIE1GR1BUIGRyaXZlciwgYnV0CisgKiBiZXR0ZXIgdGhhbiB0aGUgUElULiAgVGhpcyBpc24ndCBhIGdlbmVyYWwgcHVycG9zZSBNRkdQVCBkcml2ZXIsIGJ1dAogICogYSBzaW1wbGlmaWVkIG9uZSBkZXNpZ25lZCBzcGVjaWZpY2FsbHkgdG8gYWN0IGFzIGEgY2xvY2sgZXZlbnQgc291cmNlLgogICogRm9yIGZ1bGwgZGV0YWlscyBhYm91dCB0aGUgTUZHUFQsIHBsZWFzZSBjb25zdWx0IHRoZSBDUzU1MzYgZGF0YSBzaGVldC4KICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3BjaS1kbWEuYyBiL2FyY2gveDg2L2tlcm5lbC9wY2ktZG1hLmMKaW5kZXggMTlhMTA0NC4uYjI1NDI4NSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3BjaS1kbWEuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcGNpLWRtYS5jCkBAIC0zOCw3ICszOCw3IEBACiAgICBiZSBwcm9iYWJseSBhIHNtYWxsZXIgRE1BIG1hc2ssIGJ1dCB0aGlzIGlzIGJ1Zy10by1idWcgY29tcGF0aWJsZQogICAgdG8gb2xkZXIgaTM4Ni4gKi8KIHN0cnVjdCBkZXZpY2UgeDg2X2RtYV9mYWxsYmFja19kZXYgPSB7Ci0JLmJ1c19pZCA9ICJmYWxsYmFjayBkZXZpY2UiLAorCS5pbml0X25hbWUgPSAiZmFsbGJhY2sgZGV2aWNlIiwKIAkuY29oZXJlbnRfZG1hX21hc2sgPSBETUFfMzJCSVRfTUFTSywKIAkuZG1hX21hc2sgPSAmeDg2X2RtYV9mYWxsYmFja19kZXYuY29oZXJlbnRfZG1hX21hc2ssCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3BjaS1zd2lvdGxiXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvcGNpLXN3aW90bGJfNjQuYwppbmRleCAyNDJjMzQ0Li5kNTljOTE3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcGNpLXN3aW90bGJfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcGNpLXN3aW90bGJfNjQuYwpAQCAtMTMsNyArMTMsNyBAQAogCiBpbnQgc3dpb3RsYiBfX3JlYWRfbW9zdGx5OwogCi12b2lkICpzd2lvdGxiX2FsbG9jX2Jvb3Qoc2l6ZV90IHNpemUsIHVuc2lnbmVkIGxvbmcgbnNsYWJzKQordm9pZCAqIF9faW5pdCBzd2lvdGxiX2FsbG9jX2Jvb3Qoc2l6ZV90IHNpemUsIHVuc2lnbmVkIGxvbmcgbnNsYWJzKQogewogCXJldHVybiBhbGxvY19ib290bWVtX2xvd19wYWdlcyhzaXplKTsKIH0KQEAgLTIzLDcgKzIzLDcgQEAKIAlyZXR1cm4gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9ETUEgfCBfX0dGUF9OT1dBUk4sIG9yZGVyKTsKIH0KIAotZG1hX2FkZHJfdCBzd2lvdGxiX3BoeXNfdG9fYnVzKHBoeXNfYWRkcl90IHBhZGRyKQorZG1hX2FkZHJfdCBzd2lvdGxiX3BoeXNfdG9fYnVzKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBwaHlzX2FkZHJfdCBwYWRkcikKIHsKIAlyZXR1cm4gcGFkZHI7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvdHJhcHMuYyBiL2FyY2gveDg2L2tlcm5lbC90cmFwcy5jCmluZGV4IGNlNjY1MGUuLmM5YTY2NmMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC90cmFwcy5jCkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvdW53aW5kLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2tleGVjLmg+CkBAIC01MSw3ICs1MCw2IEBACiAjaW5jbHVkZSA8YXNtL2RlYnVncmVnLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vdW53aW5kLmg+CiAjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CiAjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KICNpbmNsdWRlIDxhc20vaTM4Ny5oPgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vZmF1bHQuYyBiL2FyY2gveDg2L21tL2ZhdWx0LmMKaW5kZXggNTdlYzhjOC4uOWUyNjhiNmIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL2ZhdWx0LmMKKysrIGIvYXJjaC94ODYvbW0vZmF1bHQuYwpAQCAtNjY3LDcgKzY2Nyw2IEBACiAJaWYgKHVubGlrZWx5KGluX2F0b21pYygpIHx8ICFtbSkpCiAJCWdvdG8gYmFkX2FyZWFfbm9zZW1hcGhvcmU7CiAKLWFnYWluOgogCS8qCiAJICogV2hlbiBydW5uaW5nIGluIHRoZSBrZXJuZWwgd2UgZXhwZWN0IGZhdWx0cyB0byBvY2N1ciBvbmx5IHRvCiAJICogYWRkcmVzc2VzIGluIHVzZXIgc3BhY2UuICBBbGwgb3RoZXIgZmF1bHRzIHJlcHJlc2VudCBlcnJvcnMgaW4gdGhlCkBAIC04NTksMjUgKzg1OCwxNCBAQAogCW9vcHNfZW5kKGZsYWdzLCByZWdzLCBzaWcpOwogI2VuZGlmCiAKLS8qCi0gKiBXZSByYW4gb3V0IG9mIG1lbW9yeSwgb3Igc29tZSBvdGhlciB0aGluZyBoYXBwZW5lZCB0byB1cyB0aGF0IG1hZGUKLSAqIHVzIHVuYWJsZSB0byBoYW5kbGUgdGhlIHBhZ2UgZmF1bHQgZ3JhY2VmdWxseS4KLSAqLwogb3V0X29mX21lbW9yeToKKwkvKgorCSAqIFdlIHJhbiBvdXQgb2YgbWVtb3J5LCBjYWxsIHRoZSBPT00ga2lsbGVyLCBhbmQgcmV0dXJuIHRoZSB1c2Vyc3BhY2UKKwkgKiAod2hpY2ggd2lsbCByZXRyeSB0aGUgZmF1bHQsIG9yIGtpbGwgdXMgaWYgd2UgZ290IG9vbS1raWxsZWQpLgorCSAqLwogCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7Ci0JaWYgKGlzX2dsb2JhbF9pbml0KHRzaykpIHsKLQkJeWllbGQoKTsKLQkJLyoKLQkJICogUmUtbG9va3VwIHRoZSB2bWEgLSBpbiB0aGVvcnkgdGhlIHZtYSB0cmVlIG1pZ2h0Ci0JCSAqIGhhdmUgY2hhbmdlZDoKLQkJICovCi0JCWdvdG8gYWdhaW47Ci0JfQotCi0JcHJpbnRrKCJWTToga2lsbGluZyBwcm9jZXNzICVzXG4iLCB0c2stPmNvbW0pOwotCWlmIChlcnJvcl9jb2RlICYgUEZfVVNFUikKLQkJZG9fZ3JvdXBfZXhpdChTSUdLSUxMKTsKLQlnb3RvIG5vX2NvbnRleHQ7CisJcGFnZWZhdWx0X291dF9vZl9tZW1vcnkoKTsKKwlyZXR1cm47CiAKIGRvX3NpZ2J1czoKIAl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vaW5pdF8zMi5jIGIvYXJjaC94ODYvbW0vaW5pdF8zMi5jCmluZGV4IGY5OWE2YzYuLjg4ZjFiMTAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL2luaXRfMzIuYworKysgYi9hcmNoL3g4Ni9tbS9pbml0XzMyLmMKQEAgLTMyOCw2ICszMjgsOCBAQAogewogCWlmIChwYWdlbnIgPD0gMjU2KQogCQlyZXR1cm4gMTsKKwlpZiAoaW9tZW1faXNfZXhjbHVzaXZlKHBhZ2VuciA8PCBQQUdFX1NISUZUKSkKKwkJcmV0dXJuIDA7CiAJaWYgKCFwYWdlX2lzX3JhbShwYWdlbnIpKQogCQlyZXR1cm4gMTsKIAlyZXR1cm4gMDsKQEAgLTEwNzksNyArMTA4MSw3IEBACiAJdW5zaWduZWQgbG9uZyBzdGFydF9wZm4gPSBzdGFydCA+PiBQQUdFX1NISUZUOwogCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBzaXplID4+IFBBR0VfU0hJRlQ7CiAKLQlyZXR1cm4gX19hZGRfcGFnZXMoem9uZSwgc3RhcnRfcGZuLCBucl9wYWdlcyk7CisJcmV0dXJuIF9fYWRkX3BhZ2VzKG5pZCwgem9uZSwgc3RhcnRfcGZuLCBucl9wYWdlcyk7CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vaW5pdF82NC5jIGIvYXJjaC94ODYvbW0vaW5pdF82NC5jCmluZGV4IDlmN2EwZDIuLjIzZjY4ZTcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL2luaXRfNjQuYworKysgYi9hcmNoL3g4Ni9tbS9pbml0XzY0LmMKQEAgLTg1Nyw3ICs4NTcsNyBAQAogCWlmIChsYXN0X21hcHBlZF9wZm4gPiBtYXhfcGZuX21hcHBlZCkKIAkJbWF4X3Bmbl9tYXBwZWQgPSBsYXN0X21hcHBlZF9wZm47CiAKLQlyZXQgPSBfX2FkZF9wYWdlcyh6b25lLCBzdGFydF9wZm4sIG5yX3BhZ2VzKTsKKwlyZXQgPSBfX2FkZF9wYWdlcyhuaWQsIHpvbmUsIHN0YXJ0X3BmbiwgbnJfcGFnZXMpOwogCVdBUk5fT05fT05DRShyZXQpOwogCiAJcmV0dXJuIHJldDsKQEAgLTg4OCw2ICs4ODgsOCBAQAogewogCWlmIChwYWdlbnIgPD0gMjU2KQogCQlyZXR1cm4gMTsKKwlpZiAoaW9tZW1faXNfZXhjbHVzaXZlKHBhZ2VuciA8PCBQQUdFX1NISUZUKSkKKwkJcmV0dXJuIDA7CiAJaWYgKCFwYWdlX2lzX3JhbShwYWdlbnIpKQogCQlyZXR1cm4gMTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL251bWFfMzIuYyBiL2FyY2gveDg2L21tL251bWFfMzIuYwppbmRleCA4NTE4YzY3Li5kMWY3NDM5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9udW1hXzMyLmMKKysrIGIvYXJjaC94ODYvbW0vbnVtYV8zMi5jCkBAIC0yMzksNyArMjM5LDcgQEAKIAkJc3RhcnRfcGZuID0gbm9kZV9yZW1hcF9zdGFydF9wZm5bbm9kZV07CiAJCXNpemUgPSBub2RlX3JlbWFwX3NpemVbbm9kZV07CiAKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBub2RlICVkXG4iLCBfX0ZVTkNUSU9OX18sIG5vZGUpOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IG5vZGUgJWRcbiIsIF9fZnVuY19fLCBub2RlKTsKIAogCQlmb3IgKHBmbiA9IDA7IHBmbiA8IHNpemU7IHBmbiArPSBQVFJTX1BFUl9QVEUpIHsKIAkJCXVuc2lnbmVkIGxvbmcgdmFkZHIgPSBzdGFydF92YSArIChwZm4gPDwgUEFHRV9TSElGVCk7CkBAIC0yNTEsNyArMjUxLDcgQEAKIAkJCQkJCVBBR0VfS0VSTkVMX0xBUkdFX0VYRUMpKTsKIAogCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlMDhseCAtPiBwZm4gJTA4bHhcbiIsCi0JCQkJX19GVU5DVElPTl9fLCB2YWRkciwgc3RhcnRfcGZuICsgcGZuKTsKKwkJCQlfX2Z1bmNfXywgdmFkZHIsIHN0YXJ0X3BmbiArIHBmbik7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvYWNwaS5jIGIvYXJjaC94ODYvcGNpL2FjcGkuYwppbmRleCA5ZTU3NTJmLi5jMGVjZjI1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kvYWNwaS5jCisrKyBiL2FyY2gveDg2L3BjaS9hY3BpLmMKQEAgLTIxMCwxMSArMjEwLDEwIEBACiAJaWYgKGJ1cyAmJiBub2RlICE9IC0xKSB7CiAjaWZkZWYgQ09ORklHX0FDUElfTlVNQQogCQlpZiAocHhtID49IDApCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiYnVzICUwMnggLT4gcHhtICVkIC0+IG5vZGUgJWRcbiIsCi0JCQkJYnVzbnVtLCBweG0sIG5vZGUpOworCQkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmYnVzLT5kZXYsCisJCQkJICAgIm9uIE5VTUEgbm9kZSAlZCAocHhtICVkKVxuIiwgbm9kZSwgcHhtKTsKICNlbHNlCi0JCXByaW50ayhLRVJOX0RFQlVHICJidXMgJTAyeCAtPiBub2RlICVkXG4iLAotCQkJYnVzbnVtLCBub2RlKTsKKwkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmYnVzLT5kZXYsICJvbiBOVU1BIG5vZGUgJWRcbiIsIG5vZGUpOwogI2VuZGlmCiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvY29tbW9uLmMgYi9hcmNoL3g4Ni9wY2kvY29tbW9uLmMKaW5kZXggNjJkZGI3My4uODJkMjJmYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL2NvbW1vbi5jCisrKyBiL2FyY2gveDg2L3BjaS9jb21tb24uYwpAQCAtNTUxLDE3ICs1NTEsMjUgQEAKIAlpZiAoKGVyciA9IHBjaV9lbmFibGVfcmVzb3VyY2VzKGRldiwgbWFzaykpIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCWlmICghZGV2LT5tc2lfZW5hYmxlZCkKKwlpZiAoIXBjaV9kZXZfbXNpX2VuYWJsZWQoZGV2KSkKIAkJcmV0dXJuIHBjaWJpb3NfZW5hYmxlX2lycShkZXYpOwogCXJldHVybiAwOwogfQogCiB2b2lkIHBjaWJpb3NfZGlzYWJsZV9kZXZpY2UgKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7Ci0JaWYgKCFkZXYtPm1zaV9lbmFibGVkICYmIHBjaWJpb3NfZGlzYWJsZV9pcnEpCisJaWYgKCFwY2lfZGV2X21zaV9lbmFibGVkKGRldikgJiYgcGNpYmlvc19kaXNhYmxlX2lycSkKIAkJcGNpYmlvc19kaXNhYmxlX2lycShkZXYpOwogfQogCitpbnQgcGNpX2V4dF9jZmdfYXZhaWwoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpZiAocmF3X3BjaV9leHRfb3BzKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiAwOworfQorCiBzdHJ1Y3QgcGNpX2J1cyAqIF9fZGV2aW5pdCBwY2lfc2Nhbl9idXNfb25fbm9kZShpbnQgYnVzbm8sIHN0cnVjdCBwY2lfb3BzICpvcHMsIGludCBub2RlKQogewogCXN0cnVjdCBwY2lfYnVzICpidXMgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL2kzODYuYyBiL2FyY2gveDg2L3BjaS9pMzg2LmMKaW5kZXggZTUxYmYyYy4uZjg4NDc0MCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL2kzODYuYworKysgYi9hcmNoL3g4Ni9wY2kvaTM4Ni5jCkBAIC0xMjksNyArMTI5LDcgQEAKIAkJCQlwciA9IHBjaV9maW5kX3BhcmVudF9yZXNvdXJjZShkZXYsIHIpOwogCQkJCWlmICghci0+c3RhcnQgfHwgIXByIHx8CiAJCQkJICAgIHJlcXVlc3RfcmVzb3VyY2UocHIsIHIpIDwgMCkgewotCQkJCQlkZXZfZXJyKCZkZXYtPmRldiwgIkJBUiAlZDogY2FuJ3QgYWxsb2NhdGUgcmVzb3VyY2VcbiIsIGlkeCk7CisJCQkJCWRldl9pbmZvKCZkZXYtPmRldiwgIkJBUiAlZDogY2FuJ3QgYWxsb2NhdGUgcmVzb3VyY2VcbiIsIGlkeCk7CiAJCQkJCS8qCiAJCQkJCSAqIFNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIHRoZSByZWdpb24uCiAJCQkJCSAqIEludmFsaWRhdGUgdGhlIHJlc291cmNlIHRvIHByZXZlbnQKQEAgLTE3MCw3ICsxNzAsNyBAQAogCQkJCQlyLT5mbGFncywgZGlzYWJsZWQsIHBhc3MpOwogCQkJCXByID0gcGNpX2ZpbmRfcGFyZW50X3Jlc291cmNlKGRldiwgcik7CiAJCQkJaWYgKCFwciB8fCByZXF1ZXN0X3Jlc291cmNlKHByLCByKSA8IDApIHsKLQkJCQkJZGV2X2VycigmZGV2LT5kZXYsICJCQVIgJWQ6IGNhbid0IGFsbG9jYXRlIHJlc291cmNlXG4iLCBpZHgpOworCQkJCQlkZXZfaW5mbygmZGV2LT5kZXYsICJCQVIgJWQ6IGNhbid0IGFsbG9jYXRlIHJlc291cmNlXG4iLCBpZHgpOwogCQkJCQkvKiBXZSdsbCBhc3NpZ24gYSBuZXcgYWRkcmVzcyBsYXRlciAqLwogCQkJCQlyLT5lbmQgLT0gci0+c3RhcnQ7CiAJCQkJCXItPnN0YXJ0ID0gMDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9pbml0LmMgYi9hcmNoL3g4Ni9wY2kvaW5pdC5jCmluZGV4IGJlYzNiMDQuLjI1YTFmOGUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9pbml0LmMKKysrIGIvYXJjaC94ODYvcGNpL2luaXQuYwpAQCAtMTIsNyArMTIsOCBAQAogCXR5cGUgPSBwY2lfZGlyZWN0X3Byb2JlKCk7CiAjZW5kaWYKIAotCXBjaV9tbWNmZ19lYXJseV9pbml0KCk7CisJaWYgKCEocGNpX3Byb2JlICYgUENJX1BST0JFX05PRUFSTFkpKQorCQlwY2lfbW1jZmdfZWFybHlfaW5pdCgpOwogCiAjaWZkZWYgQ09ORklHX1BDSV9PTFBDCiAJaWYgKCFwY2lfb2xwY19pbml0KCkpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvaXJxLmMgYi9hcmNoL3g4Ni9wY2kvaXJxLmMKaW5kZXggMzczYjlhZi4uNDA2NDM0NSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL2lycS5jCisrKyBiL2FyY2gveDg2L3BjaS9pcnEuYwpAQCAtNTMzLDcgKzUzMyw3IEBACiB7CiAJc3RydWN0IHBjaV9kZXYgKmJyaWRnZTsKIAlpbnQgcGluID0gcGNpX2dldF9pbnRlcnJ1cHRfcGluKGRldiwgJmJyaWRnZSk7Ci0JcmV0dXJuIHBjaWJpb3Nfc2V0X2lycV9yb3V0aW5nKGJyaWRnZSwgcGluLCBpcnEpOworCXJldHVybiBwY2liaW9zX3NldF9pcnFfcm91dGluZyhicmlkZ2UsIHBpbiAtIDEsIGlycSk7CiB9CiAKICNlbmRpZgpAQCAtODg3LDcgKzg4Nyw2IEBACiAJCWRldl9kYmcoJmRldi0+ZGV2LCAibm8gaW50ZXJydXB0IHBpblxuIik7CiAJCXJldHVybiAwOwogCX0KLQlwaW4gPSBwaW4gLSAxOwogCiAJLyogRmluZCBJUlEgcm91dGluZyBlbnRyeSAqLwogCkBAIC04OTcsMTcgKzg5NiwxNyBAQAogCWluZm8gPSBwaXJxX2dldF9pbmZvKGRldik7CiAJaWYgKCFpbmZvKSB7CiAJCWRldl9kYmcoJmRldi0+ZGV2LCAiUENJIElOVCAlYyBub3QgZm91bmQgaW4gcm91dGluZyB0YWJsZVxuIiwKLQkJCSdBJyArIHBpbik7CisJCQknQScgKyBwaW4gLSAxKTsKIAkJcmV0dXJuIDA7CiAJfQotCXBpcnEgPSBpbmZvLT5pcnFbcGluXS5saW5rOwotCW1hc2sgPSBpbmZvLT5pcnFbcGluXS5iaXRtYXA7CisJcGlycSA9IGluZm8tPmlycVtwaW4gLSAxXS5saW5rOworCW1hc2sgPSBpbmZvLT5pcnFbcGluIC0gMV0uYml0bWFwOwogCWlmICghcGlycSkgewotCQlkZXZfZGJnKCZkZXYtPmRldiwgIlBDSSBJTlQgJWMgbm90IHJvdXRlZFxuIiwgJ0EnICsgcGluKTsKKwkJZGV2X2RiZygmZGV2LT5kZXYsICJQQ0kgSU5UICVjIG5vdCByb3V0ZWRcbiIsICdBJyArIHBpbiAtIDEpOwogCQlyZXR1cm4gMDsKIAl9CiAJZGV2X2RiZygmZGV2LT5kZXYsICJQQ0kgSU5UICVjIC0+IFBJUlEgJTAyeCwgbWFzayAlMDR4LCBleGNsICUwNHgiLAotCQknQScgKyBwaW4sIHBpcnEsIG1hc2ssIHBpcnFfdGFibGUtPmV4Y2x1c2l2ZV9pcnFzKTsKKwkJJ0EnICsgcGluIC0gMSwgcGlycSwgbWFzaywgcGlycV90YWJsZS0+ZXhjbHVzaXZlX2lycXMpOwogCW1hc2sgJj0gcGNpYmlvc19pcnFfbWFzazsKIAogCS8qIFdvcmsgYXJvdW5kIGJyb2tlbiBIUCBQYXZpbGlvbiBOb3RlYm9va3Mgd2hpY2ggYXNzaWduIFVTQiB0bwpAQCAtOTQ5LDcgKzk0OCw3IEBACiAJCQkJbmV3aXJxID0gaTsKIAkJfQogCX0KLQlkZXZfZGJnKCZkZXYtPmRldiwgIlBDSSBJTlQgJWMgLT4gbmV3aXJxICVkIiwgJ0EnICsgcGluLCBuZXdpcnEpOworCWRldl9kYmcoJmRldi0+ZGV2LCAiUENJIElOVCAlYyAtPiBuZXdpcnEgJWQiLCAnQScgKyBwaW4gLSAxLCBuZXdpcnEpOwogCiAJLyogQ2hlY2sgaWYgaXQgaXMgaGFyZGNvZGVkICovCiAJaWYgKChwaXJxICYgMHhmMCkgPT0gMHhmMCkgewpAQCAtOTc3LDE4ICs5NzYsMTggQEAKIAkJCXJldHVybiAwOwogCQl9CiAJfQotCWRldl9pbmZvKCZkZXYtPmRldiwgIiVzIFBDSSBJTlQgJWMgLT4gSVJRICVkXG4iLCBtc2csICdBJyArIHBpbiwgaXJxKTsKKwlkZXZfaW5mbygmZGV2LT5kZXYsICIlcyBQQ0kgSU5UICVjIC0+IElSUSAlZFxuIiwgbXNnLCAnQScgKyBwaW4gLSAxLCBpcnEpOwogCiAJLyogVXBkYXRlIElSUSBmb3IgYWxsIGRldmljZXMgd2l0aCB0aGUgc2FtZSBwaXJxIHZhbHVlICovCiAJd2hpbGUgKChkZXYyID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgZGV2MikpICE9IE5VTEwpIHsKIAkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2MiwgUENJX0lOVEVSUlVQVF9QSU4sICZwaW4pOwogCQlpZiAoIXBpbikKIAkJCWNvbnRpbnVlOwotCQlwaW4tLTsKKwogCQlpbmZvID0gcGlycV9nZXRfaW5mbyhkZXYyKTsKIAkJaWYgKCFpbmZvKQogCQkJY29udGludWU7Ci0JCWlmIChpbmZvLT5pcnFbcGluXS5saW5rID09IHBpcnEpIHsKKwkJaWYgKGluZm8tPmlycVtwaW4gLSAxXS5saW5rID09IHBpcnEpIHsKIAkJCS8qCiAJCQkgKiBXZSByZWZ1c2UgdG8gb3ZlcnJpZGUgdGhlIGRldi0+aXJxCiAJCQkgKiBpbmZvcm1hdGlvbi4gR2l2ZSBhIHdhcm5pbmchCkBAIC0xMDQyLDYgKzEwNDEsOSBAQAogCWRldiA9IE5VTEw7CiAJd2hpbGUgKChkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBkZXYpKSAhPSBOVUxMKSB7CiAJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9QSU4sICZwaW4pOworCQlpZiAoIXBpbikKKwkJCWNvbnRpbnVlOworCiAjaWZkZWYgQ09ORklHX1g4Nl9JT19BUElDCiAJCS8qCiAJCSAqIFJlY2FsY3VsYXRlIElSUSBudW1iZXJzIGlmIHdlIHVzZSB0aGUgSS9PIEFQSUMuCkBAIC0xMDQ5LDE1ICsxMDUxLDExIEBACiAJCWlmIChpb19hcGljX2Fzc2lnbl9wY2lfaXJxcykgewogCQkJaW50IGlycTsKIAotCQkJaWYgKCFwaW4pCi0JCQkJY29udGludWU7Ci0KIAkJCS8qCiAJCQkgKiBpbnRlcnJ1cHQgcGlucyBhcmUgbnVtYmVyZWQgc3RhcnRpbmcgZnJvbSAxCiAJCQkgKi8KLQkJCXBpbi0tOwogCQkJaXJxID0gSU9fQVBJQ19nZXRfUENJX2lycV92ZWN0b3IoZGV2LT5idXMtPm51bWJlciwKLQkJCQlQQ0lfU0xPVChkZXYtPmRldmZuKSwgcGluKTsKKwkJCQlQQ0lfU0xPVChkZXYtPmRldmZuKSwgcGluIC0gMSk7CiAJCQkvKgogCQkJICogQnVzc2VzIGJlaGluZCBicmlkZ2VzIGFyZSB0eXBpY2FsbHkgbm90IGxpc3RlZCBpbiB0aGUKIAkJCSAqIE1QLXRhYmxlLiAgSW4gdGhpcyBjYXNlIHdlIGhhdmUgdG8gbG9vayB1cCB0aGUgSVJRCkBAIC0xMDcwLDIyICsxMDY4LDIyIEBACiAJCQkJc3RydWN0IHBjaV9kZXYgKmJyaWRnZSA9IGRldi0+YnVzLT5zZWxmOwogCQkJCWludCBidXM7CiAKLQkJCQlwaW4gPSAocGluICsgUENJX1NMT1QoZGV2LT5kZXZmbikpICUgNDsKKwkJCQlwaW4gPSBwY2lfc3dpenpsZV9pbnRlcnJ1cHRfcGluKGRldiwgcGluKTsKIAkJCQlidXMgPSBicmlkZ2UtPmJ1cy0+bnVtYmVyOwogCQkJCWlycSA9IElPX0FQSUNfZ2V0X1BDSV9pcnFfdmVjdG9yKGJ1cywKLQkJCQkJCVBDSV9TTE9UKGJyaWRnZS0+ZGV2Zm4pLCBwaW4pOworCQkJCQkJUENJX1NMT1QoYnJpZGdlLT5kZXZmbiksIHBpbiAtIDEpOwogCQkJCWlmIChpcnEgPj0gMCkKIAkJCQkJZGV2X3dhcm4oJmRldi0+ZGV2LAogCQkJCQkJInVzaW5nIGJyaWRnZSAlcyBJTlQgJWMgdG8gIgogCQkJCQkJCSJnZXQgSVJRICVkXG4iLAogCQkJCQkJIHBjaV9uYW1lKGJyaWRnZSksCi0JCQkJCQkgJ0EnICsgcGluLCBpcnEpOworCQkJCQkJICdBJyArIHBpbiAtIDEsIGlycSk7CiAJCQl9CiAJCQlpZiAoaXJxID49IDApIHsKIAkJCQlkZXZfaW5mbygmZGV2LT5kZXYsCiAJCQkJCSJQQ0ktPkFQSUMgSVJRIHRyYW5zZm9ybTogSU5UICVjICIKIAkJCQkJCSItPiBJUlEgJWRcbiIsCi0JCQkJCSdBJyArIHBpbiwgaXJxKTsKKwkJCQkJJ0EnICsgcGluIC0gMSwgaXJxKTsKIAkJCQlkZXYtPmlycSA9IGlycTsKIAkJCX0KIAkJfQpAQCAtMTA5Myw3ICsxMDkxLDcgQEAKIAkJLyoKIAkJICogU3RpbGwgbm8gSVJRPyBUcnkgdG8gbG9va3VwIG9uZS4uLgogCQkgKi8KLQkJaWYgKHBpbiAmJiAhZGV2LT5pcnEpCisJCWlmICghZGV2LT5pcnEpCiAJCQlwY2liaW9zX2xvb2t1cF9pcnEoZGV2LCAwKTsKIAl9CiB9CkBAIC0xMjIwLDEyICsxMjE4LDEwIEBACiAJaWYgKHBpbiAmJiAhcGNpYmlvc19sb29rdXBfaXJxKGRldiwgMSkgJiYgIWRldi0+aXJxKSB7CiAJCWNoYXIgKm1zZyA9ICIiOwogCi0JCXBpbi0tOyAvKiBpbnRlcnJ1cHQgcGlucyBhcmUgbnVtYmVyZWQgc3RhcnRpbmcgZnJvbSAxICovCi0KIAkJaWYgKGlvX2FwaWNfYXNzaWduX3BjaV9pcnFzKSB7CiAJCQlpbnQgaXJxOwogCi0JCQlpcnEgPSBJT19BUElDX2dldF9QQ0lfaXJxX3ZlY3RvcihkZXYtPmJ1cy0+bnVtYmVyLCBQQ0lfU0xPVChkZXYtPmRldmZuKSwgcGluKTsKKwkJCWlycSA9IElPX0FQSUNfZ2V0X1BDSV9pcnFfdmVjdG9yKGRldi0+YnVzLT5udW1iZXIsIFBDSV9TTE9UKGRldi0+ZGV2Zm4pLCBwaW4gLSAxKTsKIAkJCS8qCiAJCQkgKiBCdXNzZXMgYmVoaW5kIGJyaWRnZXMgYXJlIHR5cGljYWxseSBub3QgbGlzdGVkIGluIHRoZSBNUC10YWJsZS4KIAkJCSAqIEluIHRoaXMgY2FzZSB3ZSBoYXZlIHRvIGxvb2sgdXAgdGhlIElSUSBiYXNlZCBvbiB0aGUgcGFyZW50IGJ1cywKQEAgLTEyMzYsMjAgKzEyMzIsMjAgQEAKIAkJCXdoaWxlIChpcnEgPCAwICYmIGRldi0+YnVzLT5wYXJlbnQpIHsgLyogZ28gYmFjayB0byB0aGUgYnJpZGdlICovCiAJCQkJc3RydWN0IHBjaV9kZXYgKmJyaWRnZSA9IGRldi0+YnVzLT5zZWxmOwogCi0JCQkJcGluID0gKHBpbiArIFBDSV9TTE9UKGRldi0+ZGV2Zm4pKSAlIDQ7CisJCQkJcGluID0gcGNpX3N3aXp6bGVfaW50ZXJydXB0X3BpbihkZXYsIHBpbik7CiAJCQkJaXJxID0gSU9fQVBJQ19nZXRfUENJX2lycV92ZWN0b3IoYnJpZGdlLT5idXMtPm51bWJlciwKLQkJCQkJCVBDSV9TTE9UKGJyaWRnZS0+ZGV2Zm4pLCBwaW4pOworCQkJCQkJUENJX1NMT1QoYnJpZGdlLT5kZXZmbiksIHBpbiAtIDEpOwogCQkJCWlmIChpcnEgPj0gMCkKIAkJCQkJZGV2X3dhcm4oJmRldi0+ZGV2LCAidXNpbmcgYnJpZGdlICVzICIKIAkJCQkJCSAiSU5UICVjIHRvIGdldCBJUlEgJWRcbiIsCi0JCQkJCQkgcGNpX25hbWUoYnJpZGdlKSwgJ0EnICsgcGluLAorCQkJCQkJIHBjaV9uYW1lKGJyaWRnZSksICdBJyArIHBpbiAtIDEsCiAJCQkJCQkgaXJxKTsKIAkJCQlkZXYgPSBicmlkZ2U7CiAJCQl9CiAJCQlkZXYgPSB0ZW1wX2RldjsKIAkJCWlmIChpcnEgPj0gMCkgewogCQkJCWRldl9pbmZvKCZkZXYtPmRldiwgIlBDSS0+QVBJQyBJUlEgdHJhbnNmb3JtOiAiCi0JCQkJCSAiSU5UICVjIC0+IElSUSAlZFxuIiwgJ0EnICsgcGluLCBpcnEpOworCQkJCQkgIklOVCAlYyAtPiBJUlEgJWRcbiIsICdBJyArIHBpbiAtIDEsIGlycSk7CiAJCQkJZGV2LT5pcnEgPSBpcnE7CiAJCQkJcmV0dXJuIDA7CiAJCQl9IGVsc2UKQEAgLTEyNjgsNyArMTI2NCw3IEBACiAJCQlyZXR1cm4gMDsKIAogCQlkZXZfd2FybigmZGV2LT5kZXYsICJjYW4ndCBmaW5kIElSUSBmb3IgUENJIElOVCAlYyVzXG4iLAotCQkJICdBJyArIHBpbiwgbXNnKTsKKwkJCSAnQScgKyBwaW4gLSAxLCBtc2cpOwogCX0KIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS92aXN3cy5jIGIvYXJjaC94ODYvcGNpL3Zpc3dzLmMKaW5kZXggMTZkMGMwZS4uYmNlYWQ3YSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL3Zpc3dzLmMKKysrIGIvYXJjaC94ODYvcGNpL3Zpc3dzLmMKQEAgLTI0LDI0ICsyNCw2IEBACiAKIHVuc2lnbmVkIGludCBwY2lfYnVzMCwgcGNpX2J1czE7CiAKLXN0YXRpYyBpbmxpbmUgdTggYnJpZGdlX3N3aXp6bGUodTggcGluLCB1OCBzbG90KSAKLXsKLQlyZXR1cm4gKCgocGluIC0gMSkgKyBzbG90KSAlIDQpICsgMTsKLX0KLQotc3RhdGljIHU4IF9faW5pdCB2aXN3c19zd2l6emxlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4ICpwaW5wKQotewotCXU4IHBpbiA9ICpwaW5wOwotCi0Jd2hpbGUgKGRldi0+YnVzLT5zZWxmKSB7CS8qIE1vdmUgdXAgdGhlIGNoYWluIG9mIGJyaWRnZXMuICovCi0JCXBpbiA9IGJyaWRnZV9zd2l6emxlKHBpbiwgUENJX1NMT1QoZGV2LT5kZXZmbikpOwotCQlkZXYgPSBkZXYtPmJ1cy0+c2VsZjsKLQl9Ci0JKnBpbnAgPSBwaW47Ci0KLQlyZXR1cm4gUENJX1NMT1QoZGV2LT5kZXZmbik7Ci19Ci0KIHN0YXRpYyBpbnQgX19pbml0IHZpc3dzX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCWludCBpcnEsIGJ1cyA9IGRldi0+YnVzLT5udW1iZXI7CkBAIC0xMDYsNyArODgsNyBAQAogCXJhd19wY2lfb3BzID0gJnBjaV9kaXJlY3RfY29uZjE7CiAJcGNpX3NjYW5fYnVzX3dpdGhfc3lzZGF0YShwY2lfYnVzMCk7CiAJcGNpX3NjYW5fYnVzX3dpdGhfc3lzZGF0YShwY2lfYnVzMSk7Ci0JcGNpX2ZpeHVwX2lycXModmlzd3Nfc3dpenpsZSwgdmlzd3NfbWFwX2lycSk7CisJcGNpX2ZpeHVwX2lycXMocGNpX2NvbW1vbl9zd2l6emxlLCB2aXN3c19tYXBfaXJxKTsKIAlwY2liaW9zX3Jlc291cmNlX3N1cnZleSgpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvTWFrZWZpbGUgYi9hcmNoL3h0ZW5zYS9NYWtlZmlsZQppbmRleCAwMTViNmIyLi4xZGE1NWZlIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9NYWtlZmlsZQorKysgYi9hcmNoL3h0ZW5zYS9NYWtlZmlsZQpAQCAtMzMsNiArMzMsMTUgQEAKIAogS0JVSUxEX0NGTEFHUyArPSAtcGlwZSAtbWxvbmdjYWxscwogCit2YXJkaXJzIDo9ICQocGF0c3Vic3QgJSxhcmNoL3h0ZW5zYS92YXJpYW50cy8lLywkKHZhcmlhbnQteSkpCitwbGZkaXJzIDo9ICQocGF0c3Vic3QgJSxhcmNoL3h0ZW5zYS9wbGF0Zm9ybXMvJS8sJChwbGF0Zm9ybS15KSkKKworaWZlcSAoJChLQlVJTERfU1JDKSwpCitLQlVJTERfQ1BQRkxBR1MgKz0gJChwYXRzdWJzdCAlLC1JJWluY2x1ZGUsJCh2YXJkaXJzKSAkKHBsZmRpcnMpKQorZWxzZQorS0JVSUxEX0NQUEZMQUdTICs9ICQocGF0c3Vic3QgJSwtSSQoc3JjdHJlZSkvJWluY2x1ZGUsJCh2YXJkaXJzKSAkKHBsZmRpcnMpKQorZW5kaWYKKwogS0JVSUxEX0RFRkNPTkZJRyA6PSBpc3NfZGVmY29uZmlnCiAKICMgcmFtZGlzay9pbml0cmQgc3VwcG9ydApAQCAtNjYsMjEgKzc1LDYgQEAKIAogYm9vdAkJOj0gYXJjaC94dGVuc2EvYm9vdAogCi1hcmNoaW5jCQk6PSBpbmNsdWRlL2FzbS14dGVuc2EKLQotYXJjaHByZXBhcmU6ICQoYXJjaGluYykvLnBsYXRmb3JtCi0KLSMgVXBkYXRlIHByb2Nlc3NvciB2YXJpYW50IGFuZCBwbGF0Zm9ybSBzeW1saW5rcyBpZiBzb21ldGhpbmcgd2hpY2ggYWZmZWN0cwotIyB0aGVtIGNoYW5nZWQuCi0KLSQoYXJjaGluYykvLnBsYXRmb3JtOiAkKHdpbGRjYXJkIGluY2x1ZGUvY29uZmlnL2FyY2gvKi5oKSBpbmNsdWRlL2NvbmZpZy9hdXRvLmNvbmYKLQlAZWNobyAnICBTWU1MSU5LICQoYXJjaGluYykvdmFyaWFudCAtPiAkKGFyY2hpbmMpL3ZhcmlhbnQtJChWQVJJQU5UKScKLQkkKFEpbWtkaXIgLXAgJChhcmNoaW5jKQotCSQoUSlsbiAtZnNuICQoc3JjdHJlZSkvJChhcmNoaW5jKS92YXJpYW50LSQoVkFSSUFOVCkgJChhcmNoaW5jKS92YXJpYW50Ci0JQGVjaG8gJyAgU1lNTElOSyAkKGFyY2hpbmMpL3BsYXRmb3JtIC0+ICQoYXJjaGluYykvcGxhdGZvcm0tJChQTEFURk9STSknCi0JJChRKWxuIC1mc24gJChzcmN0cmVlKS8kKGFyY2hpbmMpL3BsYXRmb3JtLSQoUExBVEZPUk0pICQoYXJjaGluYykvcGxhdGZvcm0KLQlAdG91Y2ggJEAKLQogCiBhbGw6IHpJbWFnZQogCkBAIC04OSwxMCArODMsNiBAQAogekltYWdlIHpJbWFnZS5pbml0cmQ6IHZtbGludXgKIAkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKGJvb3QpICRACiAKLUNMRUFOX0ZJTEVTCSs9IGFyY2gveHRlbnNhL3ZtbGludXgubGRzICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgJChhcmNoaW5jKS9wbGF0Zm9ybSAkKGFyY2hpbmMpL3ZhcmlhbnQJXAotCQkgICAkKGFyY2hpbmMpLy5wbGF0Zm9ybQotCiBkZWZpbmUgYXJjaGhlbHAKICAgQGVjaG8gJyogekltYWdlICAgICAgLSBDb21wcmVzc2VkIGtlcm5lbCBpbWFnZSAoYXJjaC94dGVuc2EvYm9vdC9pbWFnZXMvekltYWdlLiopJwogZW5kZWYKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2Jvb3QvYm9vdC1lbGYvYm9vdC5sZHMuUyBiL2FyY2gveHRlbnNhL2Jvb3QvYm9vdC1lbGYvYm9vdC5sZHMuUwppbmRleCA4NDlkZmNhLi40ZTUzYjc0IDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9ib290L2Jvb3QtZWxmL2Jvb3QubGRzLlMKKysrIGIvYXJjaC94dGVuc2EvYm9vdC9ib290LWVsZi9ib290Lmxkcy5TCkBAIC0xLDQgKzEsNCBAQAotI2luY2x1ZGUgPGFzbS92YXJpYW50L2NvcmUuaD4KKyNpbmNsdWRlIDx2YXJpYW50L2NvcmUuaD4KIE9VVFBVVF9BUkNIKHh0ZW5zYSkKIEVOVFJZKF9SZXNldFZlY3RvcikKIApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvYm9vdC9ib290LXJlZGJvb3QvYm9vdHN0cmFwLlMgYi9hcmNoL3h0ZW5zYS9ib290L2Jvb3QtcmVkYm9vdC9ib290c3RyYXAuUwppbmRleCA4NDg0ODEyLi41NTgyZThjIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9ib290L2Jvb3QtcmVkYm9vdC9ib290c3RyYXAuUworKysgYi9hcmNoL3h0ZW5zYS9ib290L2Jvb3QtcmVkYm9vdC9ib290c3RyYXAuUwpAQCAtMSw0ICsxLDQgQEAKLSNpbmNsdWRlIDxhc20vdmFyaWFudC9jb3JlLmg+CisjaW5jbHVkZSA8dmFyaWFudC9jb3JlLmg+CiAjaW5jbHVkZSA8YXNtL3JlZ3MuaD4KICNpbmNsdWRlIDxhc20vYXNtbWFjcm8uaD4KICNpbmNsdWRlIDxhc20vY2FjaGVhc20uaD4KZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL0tidWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGMwMmE0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0wLDAgKzEsMyBAQAoraW5jbHVkZSBpbmNsdWRlL2FzbS1nZW5lcmljL0tidWlsZC5hc20KKwordW5pZmRlZi15ICs9IHN3YWIuaApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vYXNtbWFjcm8uaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2FzbW1hY3JvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU1MzIwZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2FzbW1hY3JvLmgKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS14dGVuc2EvYXNtbWFjcm8uaAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9BU01NQUNST19ICisjZGVmaW5lIF9YVEVOU0FfQVNNTUFDUk9fSAorCisjaW5jbHVkZSA8dmFyaWFudC9jb3JlLmg+CisKKy8qCisgKiBTb21lIGxpdHRsZSBoZWxwZXJzIGZvciBsb29wcy4gVXNlIHplcm8tb3ZlcmhlYWQtbG9vcHMKKyAqIHdoZXJlIGFwcGxpY2FibGUgYW5kIGlmIHN1cHBvcnRlZCBieSB0aGUgcHJvY2Vzc29yLgorICoKKyAqIF9fbG9vcGkgYXIsIGF0LCBzaXplLCBpbmMKKyAqICAgICAgICAgYXIJcmVnaXN0ZXIgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgc3RhcnQgYWRkcmVzcworICoJICAgYXQJc2NyYXRjaCByZWdpc3RlciB1c2VkIGJ5IG1hY3JvCisgKgkgICBzaXplCXNpemUgaW1tZWRpYXRlIHZhbHVlCisgKgkgICBpbmMJaW5jcmVtZW50CisgKgorICogX19sb29wcyBhciwgYXMsIGF0LCBpbmNfbG9nMlssIG1hc2tfbG9nMl1bLCBjb25kXVssIG5jb25kXQorICoJICAgYXIJcmVnaXN0ZXIgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgc3RhcnQgYWRkcmVzcworICoJICAgYXMJcmVnaXN0ZXIgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgc2l6ZQorICoJICAgYXQJc2NyYXRjaCByZWdpc3RlciB1c2UgYnkgbWFjcm8KKyAqCSAgIGluY19sb2cyCWluY3JlbWVudCBbaW4gbG9nMl0KKyAqCSAgIG1hc2tfbG9nMgltYXNrIFtpbiBsb2cyXQorICoJICAgY29uZAkJdHJ1ZSBjb25kaXRpb24gKHVzZWQgaW4gbG9vcCdjb25kJykKKyAqCSAgIG5jb25kCWZhbHNlIGNvbmRpdGlvbiAodXNlZCBpbiBiJ25jb25kJykKKyAqCisgKiBfX2xvb3AgIGFzCisgKgkgICByZXN0YXJ0IGxvb3AuICdhcycgcmVnaXN0ZXIgbXVzdCBub3QgaGF2ZSBiZWVuIG1vZGlmaWVkIQorICoKKyAqIF9fZW5kbGEgYXIsIGF0LCBpbmNyCisgKgkgICBhcglzdGFydCBhZGRyZXNzIChtb2RpZmllZCkKKyAqCSAgIGFzCXNjcmF0Y2ggcmVnaXN0ZXIgdXNlZCBieSBtYWNybworICoJICAgaW5jCWluY3JlbWVudAorICovCisKKy8qCisgKiBsb29wIGZvciBnaXZlbiBzaXplIGFzIGltbWVkaWF0ZQorICovCisKKwkubWFjcm8JX19sb29waSBhciwgYXQsIHNpemUsIGluY3IKKworI2lmIFhDSEFMX0hBVkVfTE9PUFMKKwkJbW92aQlcYXQsICgoXHNpemUgKyBcaW5jciAtIDEpIC8gKFxpbmNyKSkKKwkJbG9vcAlcYXQsIDk5ZgorI2Vsc2UKKwkJYWRkaQlcYXQsIFxhciwgXHNpemUKKwkJOTg6CisjZW5kaWYKKworCS5lbmRtCisKKy8qCisgKiBsb29wIGZvciBnaXZlbiBzaXplIGluIHJlZ2lzdGVyCisgKi8KKworCS5tYWNybwlfX2xvb3BzCWFyLCBhcywgYXQsIGluY3JfbG9nMiwgbWFza19sb2cyLCBjb25kLCBuY29uZAorCisjaWYgWENIQUxfSEFWRV9MT09QUworCQkuaWZndCBcaW5jcl9sb2cyIC0gMQorCQkJYWRkaQlcYXQsIFxhcywgKDEgPDwgXGluY3JfbG9nMikgLSAxCisJCQkuaWZuYyBcbWFza19sb2cyLAorCQkJCWV4dHVpCVxhdCwgXGF0LCBcaW5jcl9sb2cyLCBcbWFza19sb2cyCisJCQkuZWxzZQorCQkJCXNybGkJXGF0LCBcYXQsIFxpbmNyX2xvZzIKKwkJCS5lbmRpZgorCQkuZW5kaWYKKwkJbG9vcFxjb25kCVxhdCwgOTlmCisjZWxzZQorCQkuaWZuYyBcbWFza19sb2cyLAorCQkJZXh0dWkJXGF0LCBcYXMsIFxpbmNyX2xvZzIsIFxtYXNrX2xvZzIKKwkJLmVsc2UKKwkJCS5pZm5jIFxuY29uZCwKKwkJCQlzcmxpCVxhdCwgXGFzLCBcaW5jcl9sb2cyCisJCQkuZW5kaWYKKwkJLmVuZGlmCisJCS5pZm5jIFxuY29uZCwKKwkJCWJcbmNvbmQJXGF0LCA5OWYKKworCQkuZW5kaWYKKwkJLmlmbmMgXG1hc2tfbG9nMiwKKwkJCXNsbGkJXGF0LCBcYXQsIFxpbmNyX2xvZzIKKwkJCWFkZAlcYXQsIFxhciwgXGF0CisJCS5lbHNlCisJCQlhZGQJXGF0LCBcYXIsIFxhcworCQkuZW5kaWYKKyNlbmRpZgorCQk5ODoKKworCS5lbmRtCisKKy8qCisgKiBsb29wIGZyb20gYXIgdG8gYXgKKyAqLworCisJLm1hY3JvCV9fbG9vcHQJYXIsIGFzLCBhdCwgaW5jcl9sb2cyCisKKyNpZiBYQ0hBTF9IQVZFX0xPT1BTCisJCXN1YglcYXQsIFxhcywgXGFyCisJCS5pZmd0CVxpbmNyX2xvZzIgLSAxCisJCQlhZGRpCVxhdCwgXGF0LCAoMSA8PCBcaW5jcl9sb2cyKSAtIDEKKwkJCXNybGkJXGF0LCBcYXQsIFxpbmNyX2xvZzIKKwkJLmVuZGlmCisJCWxvb3AJXGF0LCA5OWYKKyNlbHNlCisJCTk4OgorI2VuZGlmCisKKwkuZW5kbQorCisvKgorICogcmVzdGFydCBsb29wLiByZWdpc3RlcnMgbXVzdCBiZSB1bmNoYW5nZWQKKyAqLworCisJLm1hY3JvCV9fbG9vcAlhcworCisjaWYgWENIQUxfSEFWRV9MT09QUworCQlsb29wCVxhcywgOTlmCisjZWxzZQorCQk5ODoKKyNlbmRpZgorCisJLmVuZG0KKworLyoKKyAqIGVuZCBvZiBsb29wIHdpdGggbm8gaW5jcmVtZW50IG9mIHRoZSBhZGRyZXNzLgorICovCisKKwkubWFjcm8JX19lbmRsCWFyLCBhcworI2lmICFYQ0hBTF9IQVZFX0xPT1BTCisJCWJsdHUJXGFyLCBcYXMsIDk4YgorI2VuZGlmCisJCTk5OgorCS5lbmRtCisKKy8qCisgKiBlbmQgb2YgbG9vcCB3aXRoIGluY3JlbWVudCBvZiB0aGUgYWRkcmVzcy4KKyAqLworCisJLm1hY3JvCV9fZW5kbGEJYXIsIGFzLCBpbmNyCisJCWFkZGkJXGFyLCBcYXIsIFxpbmNyCisJCV9fZW5kbAlcYXIgXGFzCisJLmVuZG0KKworCisjZW5kaWYgLyogX1hURU5TQV9BU01NQUNST19IICovCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9hdG9taWMuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2F0b21pYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YWQ2N2IKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9hdG9taWMuaApAQCAtMCwwICsxLDI5OSBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9hdG9taWMuaAorICoKKyAqIEF0b21pYyBvcGVyYXRpb25zIHRoYXQgQyBjYW4ndCBndWFyYW50ZWUgdXMuICBVc2VmdWwgZm9yIHJlc291cmNlIGNvdW50aW5nLi4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCisgKi8KKworI2lmbmRlZiBfWFRFTlNBX0FUT01JQ19ICisjZGVmaW5lIF9YVEVOU0FfQVRPTUlDX0gKKworI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2RlZmluZSBBVE9NSUNfSU5JVChpKQl7IChpKSB9CisKKy8qCisgKiBUaGlzIFh0ZW5zYSBpbXBsZW1lbnRhdGlvbiBhc3N1bWVzIHRoYXQgdGhlIHJpZ2h0IG1lY2hhbmlzbQorICogZm9yIGV4Y2x1c2lvbiBpcyBmb3IgbG9ja2luZyBpbnRlcnJ1cHRzIHRvIGxldmVsIDEuCisgKgorICogTG9ja2luZyBpbnRlcnJ1cHRzIGxvb2tzIGxpa2UgdGhpczoKKyAqCisgKiAgICByc2lsIGExNSwgMQorICogICAgPGNvZGU+CisgKiAgICB3c3IgIGExNSwgUFMKKyAqICAgIHJzeW5jCisgKgorICogTm90ZSB0aGF0IGExNSBpcyB1c2VkIGhlcmUgYmVjYXVzZSB0aGUgcmVnaXN0ZXIgYWxsb2NhdGlvbgorICogZG9uZSBieSB0aGUgY29tcGlsZXIgaXMgbm90IGd1YXJhbnRlZWQgYW5kIGEgd2luZG93IG92ZXJmbG93CisgKiBtYXkgbm90IG9jY3VyIGJldHdlZW4gdGhlIHJzaWwgYW5kIHdzciBpbnN0cnVjdGlvbnMuIEJ5IHVzaW5nCisgKiBhMTUgaW4gdGhlIHJzaWwsIHRoZSBtYWNoaW5lIGlzIGd1YXJhbnRlZWQgdG8gYmUgaW4gYSBzdGF0ZQorICogd2hlcmUgbm8gcmVnaXN0ZXIgcmVmZXJlbmNlIHdpbGwgY2F1c2UgYW4gb3ZlcmZsb3cuCisgKi8KKworLyoqCisgKiBhdG9taWNfcmVhZCAtIHJlYWQgYXRvbWljIHZhcmlhYmxlCisgKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKgorICogQXRvbWljYWxseSByZWFkcyB0aGUgdmFsdWUgb2YgQHYuCisgKi8KKyNkZWZpbmUgYXRvbWljX3JlYWQodikJCSgodiktPmNvdW50ZXIpCisKKy8qKgorICogYXRvbWljX3NldCAtIHNldCBhdG9taWMgdmFyaWFibGUKKyAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqIEBpOiByZXF1aXJlZCB2YWx1ZQorICoKKyAqIEF0b21pY2FsbHkgc2V0cyB0aGUgdmFsdWUgb2YgQHYgdG8gQGkuCisgKi8KKyNkZWZpbmUgYXRvbWljX3NldCh2LGkpCQkoKHYpLT5jb3VudGVyID0gKGkpKQorCisvKioKKyAqIGF0b21pY19hZGQgLSBhZGQgaW50ZWdlciB0byBhdG9taWMgdmFyaWFibGUKKyAqIEBpOiBpbnRlZ2VyIHZhbHVlIHRvIGFkZAorICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICoKKyAqIEF0b21pY2FsbHkgYWRkcyBAaSB0byBAdi4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGF0b21pY19hZGQoaW50IGksIGF0b21pY190ICogdikKK3sKKyAgICB1bnNpZ25lZCBpbnQgdnZhbDsKKworICAgIF9fYXNtX18gX192b2xhdGlsZV9fKAorCSJyc2lsICAgIGExNSwgIl9fc3RyaW5naWZ5KExPQ0tMRVZFTCkiXG5cdCIKKwkibDMyaSAgICAlMCwgJTIsIDAgICAgICAgICAgICAgIFxuXHQiCisJImFkZCAgICAgJTAsICUwLCAlMSAgICAgICAgICAgICBcblx0IgorCSJzMzJpICAgICUwLCAlMiwgMCAgICAgICAgICAgICAgXG5cdCIKKwkid3NyICAgICBhMTUsICJfX3N0cmluZ2lmeShQUykiICAgICAgIFxuXHQiCisJInJzeW5jICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKwk6ICI9JmEiICh2dmFsKQorCTogImEiIChpKSwgImEiICh2KQorCTogImExNSIsICJtZW1vcnkiCisJKTsKK30KKworLyoqCisgKiBhdG9taWNfc3ViIC0gc3VidHJhY3QgdGhlIGF0b21pYyB2YXJpYWJsZQorICogQGk6IGludGVnZXIgdmFsdWUgdG8gc3VidHJhY3QKKyAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqCisgKiBBdG9taWNhbGx5IHN1YnRyYWN0cyBAaSBmcm9tIEB2LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX3N1YihpbnQgaSwgYXRvbWljX3QgKnYpCit7CisgICAgdW5zaWduZWQgaW50IHZ2YWw7CisKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkicnNpbCAgICBhMTUsICJfX3N0cmluZ2lmeShMT0NLTEVWRUwpIlxuXHQiCisJImwzMmkgICAgJTAsICUyLCAwICAgICAgICAgICAgICBcblx0IgorCSJzdWIgICAgICUwLCAlMCwgJTEgICAgICAgICAgICAgXG5cdCIKKwkiczMyaSAgICAlMCwgJTIsIDAgICAgICAgICAgICAgIFxuXHQiCisJIndzciAgICAgYTE1LCAiX19zdHJpbmdpZnkoUFMpIiAgICAgICBcblx0IgorCSJyc3luYyAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJOiAiPSZhIiAodnZhbCkKKwk6ICJhIiAoaSksICJhIiAodikKKwk6ICJhMTUiLCAibWVtb3J5IgorCSk7Cit9CisKKy8qCisgKiBXZSB1c2UgYXRvbWljX3thZGR8c3VifV9yZXR1cm4gdG8gZGVmaW5lIG90aGVyIGZ1bmN0aW9ucy4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCBhdG9taWNfYWRkX3JldHVybihpbnQgaSwgYXRvbWljX3QgKiB2KQoreworICAgICB1bnNpZ25lZCBpbnQgdnZhbDsKKworICAgIF9fYXNtX18gX192b2xhdGlsZV9fKAorCSJyc2lsICAgIGExNSwiX19zdHJpbmdpZnkoTE9DS0xFVkVMKSJcblx0IgorCSJsMzJpICAgICUwLCAlMiwgMCAgICAgICAgICAgICBcblx0IgorCSJhZGQgICAgICUwLCAlMCwgJTEgICAgICAgICAgICBcblx0IgorCSJzMzJpICAgICUwLCAlMiwgMCAgICAgICAgICAgICBcblx0IgorCSJ3c3IgICAgIGExNSwgIl9fc3RyaW5naWZ5KFBTKSIgICAgICBcblx0IgorCSJyc3luYyAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKwk6ICI9JmEiICh2dmFsKQorCTogImEiIChpKSwgImEiICh2KQorCTogImExNSIsICJtZW1vcnkiCisJKTsKKworICAgIHJldHVybiB2dmFsOworfQorCitzdGF0aWMgaW5saW5lIGludCBhdG9taWNfc3ViX3JldHVybihpbnQgaSwgYXRvbWljX3QgKiB2KQoreworICAgIHVuc2lnbmVkIGludCB2dmFsOworCisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oCisJInJzaWwgICAgYTE1LCJfX3N0cmluZ2lmeShMT0NLTEVWRUwpIlxuXHQiCisJImwzMmkgICAgJTAsICUyLCAwICAgICAgICAgICAgIFxuXHQiCisJInN1YiAgICAgJTAsICUwLCAlMSAgICAgICAgICAgIFxuXHQiCisJInMzMmkgICAgJTAsICUyLCAwICAgICAgICAgICAgIFxuXHQiCisJIndzciAgICAgYTE1LCAiX19zdHJpbmdpZnkoUFMpIiAgICAgICBcblx0IgorCSJyc3luYyAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKwk6ICI9JmEiICh2dmFsKQorCTogImEiIChpKSwgImEiICh2KQorCTogImExNSIsICJtZW1vcnkiCisJKTsKKworICAgIHJldHVybiB2dmFsOworfQorCisvKioKKyAqIGF0b21pY19zdWJfYW5kX3Rlc3QgLSBzdWJ0cmFjdCB2YWx1ZSBmcm9tIHZhcmlhYmxlIGFuZCB0ZXN0IHJlc3VsdAorICogQGk6IGludGVnZXIgdmFsdWUgdG8gc3VidHJhY3QKKyAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqCisgKiBBdG9taWNhbGx5IHN1YnRyYWN0cyBAaSBmcm9tIEB2IGFuZCByZXR1cm5zCisgKiB0cnVlIGlmIHRoZSByZXN1bHQgaXMgemVybywgb3IgZmFsc2UgZm9yIGFsbAorICogb3RoZXIgY2FzZXMuCisgKi8KKyNkZWZpbmUgYXRvbWljX3N1Yl9hbmRfdGVzdChpLHYpIChhdG9taWNfc3ViX3JldHVybigoaSksKHYpKSA9PSAwKQorCisvKioKKyAqIGF0b21pY19pbmMgLSBpbmNyZW1lbnQgYXRvbWljIHZhcmlhYmxlCisgKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKgorICogQXRvbWljYWxseSBpbmNyZW1lbnRzIEB2IGJ5IDEuCisgKi8KKyNkZWZpbmUgYXRvbWljX2luYyh2KSBhdG9taWNfYWRkKDEsKHYpKQorCisvKioKKyAqIGF0b21pY19pbmMgLSBpbmNyZW1lbnQgYXRvbWljIHZhcmlhYmxlCisgKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKgorICogQXRvbWljYWxseSBpbmNyZW1lbnRzIEB2IGJ5IDEuCisgKi8KKyNkZWZpbmUgYXRvbWljX2luY19yZXR1cm4odikgYXRvbWljX2FkZF9yZXR1cm4oMSwodikpCisKKy8qKgorICogYXRvbWljX2RlYyAtIGRlY3JlbWVudCBhdG9taWMgdmFyaWFibGUKKyAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqCisgKiBBdG9taWNhbGx5IGRlY3JlbWVudHMgQHYgYnkgMS4KKyAqLworI2RlZmluZSBhdG9taWNfZGVjKHYpIGF0b21pY19zdWIoMSwodikpCisKKy8qKgorICogYXRvbWljX2RlY19yZXR1cm4gLSBkZWNyZW1lbnQgYXRvbWljIHZhcmlhYmxlCisgKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKgorICogQXRvbWljYWxseSBkZWNyZW1lbnRzIEB2IGJ5IDEuCisgKi8KKyNkZWZpbmUgYXRvbWljX2RlY19yZXR1cm4odikgYXRvbWljX3N1Yl9yZXR1cm4oMSwodikpCisKKy8qKgorICogYXRvbWljX2RlY19hbmRfdGVzdCAtIGRlY3JlbWVudCBhbmQgdGVzdAorICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICoKKyAqIEF0b21pY2FsbHkgZGVjcmVtZW50cyBAdiBieSAxIGFuZAorICogcmV0dXJucyB0cnVlIGlmIHRoZSByZXN1bHQgaXMgMCwgb3IgZmFsc2UgZm9yIGFsbCBvdGhlcgorICogY2FzZXMuCisgKi8KKyNkZWZpbmUgYXRvbWljX2RlY19hbmRfdGVzdCh2KSAoYXRvbWljX3N1Yl9yZXR1cm4oMSwodikpID09IDApCisKKy8qKgorICogYXRvbWljX2luY19hbmRfdGVzdCAtIGluY3JlbWVudCBhbmQgdGVzdAorICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICoKKyAqIEF0b21pY2FsbHkgaW5jcmVtZW50cyBAdiBieSAxCisgKiBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZSByZXN1bHQgaXMgemVybywgb3IgZmFsc2UgZm9yIGFsbAorICogb3RoZXIgY2FzZXMuCisgKi8KKyNkZWZpbmUgYXRvbWljX2luY19hbmRfdGVzdCh2KSAoYXRvbWljX2FkZF9yZXR1cm4oMSwodikpID09IDApCisKKy8qKgorICogYXRvbWljX2FkZF9uZWdhdGl2ZSAtIGFkZCBhbmQgdGVzdCBpZiBuZWdhdGl2ZQorICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICogQGk6IGludGVnZXIgdmFsdWUgdG8gYWRkCisgKgorICogQXRvbWljYWxseSBhZGRzIEBpIHRvIEB2IGFuZCByZXR1cm5zIHRydWUKKyAqIGlmIHRoZSByZXN1bHQgaXMgbmVnYXRpdmUsIG9yIGZhbHNlIHdoZW4KKyAqIHJlc3VsdCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gemVyby4KKyAqLworI2RlZmluZSBhdG9taWNfYWRkX25lZ2F0aXZlKGksdikgKGF0b21pY19hZGRfcmV0dXJuKChpKSwodikpIDwgMCkKKworI2RlZmluZSBhdG9taWNfY21weGNoZyh2LCBvLCBuKSAoKGludCljbXB4Y2hnKCYoKHYpLT5jb3VudGVyKSwgKG8pLCAobikpKQorI2RlZmluZSBhdG9taWNfeGNoZyh2LCBuZXcpICh4Y2hnKCYoKHYpLT5jb3VudGVyKSwgbmV3KSkKKworLyoqCisgKiBhdG9taWNfYWRkX3VubGVzcyAtIGFkZCB1bmxlc3MgdGhlIG51bWJlciBpcyBhIGdpdmVuIHZhbHVlCisgKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKiBAYTogdGhlIGFtb3VudCB0byBhZGQgdG8gdi4uLgorICogQHU6IC4uLnVubGVzcyB2IGlzIGVxdWFsIHRvIHUuCisgKgorICogQXRvbWljYWxseSBhZGRzIEBhIHRvIEB2LCBzbyBsb25nIGFzIGl0IHdhcyBub3QgQHUuCisgKiBSZXR1cm5zIG5vbi16ZXJvIGlmIEB2IHdhcyBub3QgQHUsIGFuZCB6ZXJvIG90aGVyd2lzZS4KKyAqLworc3RhdGljIF9faW5saW5lX18gaW50IGF0b21pY19hZGRfdW5sZXNzKGF0b21pY190ICp2LCBpbnQgYSwgaW50IHUpCit7CisJaW50IGMsIG9sZDsKKwljID0gYXRvbWljX3JlYWQodik7CisJZm9yICg7OykgeworCQlpZiAodW5saWtlbHkoYyA9PSAodSkpKQorCQkJYnJlYWs7CisJCW9sZCA9IGF0b21pY19jbXB4Y2hnKCh2KSwgYywgYyArIChhKSk7CisJCWlmIChsaWtlbHkob2xkID09IGMpKQorCQkJYnJlYWs7CisJCWMgPSBvbGQ7CisJfQorCXJldHVybiBjICE9ICh1KTsKK30KKworI2RlZmluZSBhdG9taWNfaW5jX25vdF96ZXJvKHYpIGF0b21pY19hZGRfdW5sZXNzKCh2KSwgMSwgMCkKKworc3RhdGljIGlubGluZSB2b2lkIGF0b21pY19jbGVhcl9tYXNrKHVuc2lnbmVkIGludCBtYXNrLCBhdG9taWNfdCAqdikKK3sKKyAgICB1bnNpZ25lZCBpbnQgYWxsX2YgPSAtMTsKKyAgICB1bnNpZ25lZCBpbnQgdnZhbDsKKworICAgIF9fYXNtX18gX192b2xhdGlsZV9fKAorCSJyc2lsICAgIGExNSwiX19zdHJpbmdpZnkoTE9DS0xFVkVMKSJcblx0IgorCSJsMzJpICAgICUwLCAlMiwgMCAgICAgICAgICAgICBcblx0IgorCSJ4b3IgICAgICUxLCAlNCwgJTMgICAgICAgICAgICBcblx0IgorCSJhbmQgICAgICUwLCAlMCwgJTQgICAgICAgICAgICBcblx0IgorCSJzMzJpICAgICUwLCAlMiwgMCAgICAgICAgICAgICBcblx0IgorCSJ3c3IgICAgIGExNSwgIl9fc3RyaW5naWZ5KFBTKSIgICAgICBcblx0IgorCSJyc3luYyAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKwk6ICI9JmEiICh2dmFsKSwgIj1hIiAobWFzaykKKwk6ICJhIiAodiksICJhIiAoYWxsX2YpLCAiMSIgKG1hc2spCisJOiAiYTE1IiwgIm1lbW9yeSIKKwkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX3NldF9tYXNrKHVuc2lnbmVkIGludCBtYXNrLCBhdG9taWNfdCAqdikKK3sKKyAgICB1bnNpZ25lZCBpbnQgdnZhbDsKKworICAgIF9fYXNtX18gX192b2xhdGlsZV9fKAorCSJyc2lsICAgIGExNSwiX19zdHJpbmdpZnkoTE9DS0xFVkVMKSJcblx0IgorCSJsMzJpICAgICUwLCAlMiwgMCAgICAgICAgICAgICBcblx0IgorCSJvciAgICAgICUwLCAlMCwgJTEgICAgICAgICAgICBcblx0IgorCSJzMzJpICAgICUwLCAlMiwgMCAgICAgICAgICAgICBcblx0IgorCSJ3c3IgICAgIGExNSwgIl9fc3RyaW5naWZ5KFBTKSIgICAgICAgXG5cdCIKKwkicnN5bmMgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJOiAiPSZhIiAodnZhbCkKKwk6ICJhIiAobWFzayksICJhIiAodikKKwk6ICJhMTUiLCAibWVtb3J5IgorCSk7Cit9CisKKy8qIEF0b21pYyBvcGVyYXRpb25zIGFyZSBhbHJlYWR5IHNlcmlhbGl6aW5nICovCisjZGVmaW5lIHNtcF9tYl9fYmVmb3JlX2F0b21pY19kZWMoKQliYXJyaWVyKCkKKyNkZWZpbmUgc21wX21iX19hZnRlcl9hdG9taWNfZGVjKCkJYmFycmllcigpCisjZGVmaW5lIHNtcF9tYl9fYmVmb3JlX2F0b21pY19pbmMoKQliYXJyaWVyKCkKKyNkZWZpbmUgc21wX21iX19hZnRlcl9hdG9taWNfaW5jKCkJYmFycmllcigpCisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9hdG9taWMuaD4KKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZiAvKiBfWFRFTlNBX0FUT01JQ19IICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9hdXh2ZWMuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2F1eHZlYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvYXV4dmVjLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2F1eHZlYy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvYml0b3BzLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9iaXRvcHMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL2JpdG9wcy5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9iaXRvcHMuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2Jvb3RwYXJhbS5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vYm9vdHBhcmFtLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9ib290cGFyYW0uaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vYm9vdHBhcmFtLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9idWcuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2J1Zy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvYnVnLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2J1Zy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvYnVncy5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vYnVncy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvYnVncy5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9idWdzLmgKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI5Yjk0NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCkBAIC0wLDAgKzEsMTQgQEAKKyNpZm5kZWYgX1hURU5TQV9CWVRFT1JERVJfSAorI2RlZmluZSBfWFRFTlNBX0JZVEVPUkRFUl9ICisKKyNpbmNsdWRlIDxhc20vc3dhYi5oPgorCisjaWZkZWYgX19YVEVOU0FfRUxfXworI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9saXR0bGVfZW5kaWFuLmg+CisjZWxpZiBkZWZpbmVkKF9fWFRFTlNBX0VCX18pCisjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2JpZ19lbmRpYW4uaD4KKyNlbHNlCisjIGVycm9yIHByb2Nlc3NvciBieXRlIG9yZGVyIHVuZGVmaW5lZCEKKyNlbmRpZgorCisjZW5kaWYgLyogX1hURU5TQV9CWVRFT1JERVJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vY2FjaGUuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2NhY2hlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA0Yzk4OQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2NhY2hlLmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9jYWNoZS5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCisgKi8KKworI2lmbmRlZiBfWFRFTlNBX0NBQ0hFX0gKKyNkZWZpbmUgX1hURU5TQV9DQUNIRV9ICisKKyNpbmNsdWRlIDx2YXJpYW50L2NvcmUuaD4KKworI2RlZmluZSBMMV9DQUNIRV9TSElGVAlYQ0hBTF9EQ0FDSEVfTElORVdJRFRICisjZGVmaW5lIEwxX0NBQ0hFX0JZVEVTCVhDSEFMX0RDQUNIRV9MSU5FU0laRQorI2RlZmluZSBTTVBfQ0FDSEVfQllURVMJTDFfQ0FDSEVfQllURVMKKworI2RlZmluZSBEQ0FDSEVfV0FZX1NJWkUJKFhDSEFMX0RDQUNIRV9TSVpFL1hDSEFMX0RDQUNIRV9XQVlTKQorI2RlZmluZSBJQ0FDSEVfV0FZX1NJWkUJKFhDSEFMX0lDQUNIRV9TSVpFL1hDSEFMX0lDQUNIRV9XQVlTKQorI2RlZmluZSBEQ0FDSEVfV0FZX1NISUZUIChYQ0hBTF9EQ0FDSEVfU0VUV0lEVEggKyBYQ0hBTF9EQ0FDSEVfTElORVdJRFRIKQorI2RlZmluZSBJQ0FDSEVfV0FZX1NISUZUIChYQ0hBTF9JQ0FDSEVfU0VUV0lEVEggKyBYQ0hBTF9JQ0FDSEVfTElORVdJRFRIKQorCisvKiBNYXhpbXVtIGNhY2hlIHNpemUgcGVyIHdheS4gKi8KKyNpZiBEQ0FDSEVfV0FZX1NJWkUgPj0gSUNBQ0hFX1dBWV9TSVpFCisjIGRlZmluZSBDQUNIRV9XQVlfU0laRSBEQ0FDSEVfV0FZX1NJWkUKKyNlbHNlCisjIGRlZmluZSBDQUNIRV9XQVlfU0laRSBJQ0FDSEVfV0FZX1NJWkUKKyNlbmRpZgorCisKKyNlbmRpZgkvKiBfWFRFTlNBX0NBQ0hFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9jYWNoZWFzbS5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vY2FjaGVhc20uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL2NhY2hlYXNtLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2NhY2hlYXNtLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9jYWNoZWZsdXNoLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9jYWNoZWZsdXNoLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2NhY2hlZmx1c2guaApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vY2hlY2tzdW0uaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2NoZWNrc3VtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg0ZDNmMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2NoZWNrc3VtLmgKQEAgLTAsMCArMSwyNTAgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS14dGVuc2EvY2hlY2tzdW0uaAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfQ0hFQ0tTVU1fSAorI2RlZmluZSBfWFRFTlNBX0NIRUNLU1VNX0gKKworI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPHZhcmlhbnQvY29yZS5oPgorCisvKgorICogY29tcHV0ZXMgdGhlIGNoZWNrc3VtIG9mIGEgbWVtb3J5IGJsb2NrIGF0IGJ1ZmYsIGxlbmd0aCBsZW4sCisgKiBhbmQgYWRkcyBpbiAic3VtIiAoMzItYml0KQorICoKKyAqIHJldHVybnMgYSAzMi1iaXQgbnVtYmVyIHN1aXRhYmxlIGZvciBmZWVkaW5nIGludG8gaXRzZWxmCisgKiBvciBjc3VtX3RjcHVkcF9tYWdpYworICoKKyAqIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCBldmVuIGxlbmd0aHMsIGV4Y2VwdAorICogZm9yIHRoZSBsYXN0IGZyYWdtZW50LCB3aGljaCBtYXkgYmUgb2RkCisgKgorICogaXQncyBiZXN0IHRvIGhhdmUgYnVmZiBhbGlnbmVkIG9uIGEgMzItYml0IGJvdW5kYXJ5CisgKi8KK2FzbWxpbmthZ2UgX193c3VtIGNzdW1fcGFydGlhbChjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuLCBfX3dzdW0gc3VtKTsKKworLyoKKyAqIHRoZSBzYW1lIGFzIGNzdW1fcGFydGlhbCwgYnV0IGNvcGllcyBmcm9tIHNyYyB3aGlsZSBpdAorICogY2hlY2tzdW1zLCBhbmQgaGFuZGxlcyB1c2VyLXNwYWNlIHBvaW50ZXIgZXhjZXB0aW9ucyBjb3JyZWN0bHksIHdoZW4gbmVlZGVkLgorICoKKyAqIGhlcmUgZXZlbiBtb3JlIGltcG9ydGFudCB0byBhbGlnbiBzcmMgYW5kIGRzdCBvbiBhIDMyLWJpdCAob3IgZXZlbgorICogYmV0dGVyIDY0LWJpdCkgYm91bmRhcnkKKyAqLworCithc21saW5rYWdlIF9fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LCBpbnQgbGVuLCBfX3dzdW0gc3VtLAorCQkJCQkJICAgaW50ICpzcmNfZXJyX3B0ciwgaW50ICpkc3RfZXJyX3B0cik7CisKKy8qCisgKglOb3RlOiB3aGVuIHlvdSBnZXQgYSBOVUxMIHBvaW50ZXIgZXhjZXB0aW9uIGhlcmUgdGhpcyBtZWFucyBzb21lb25lCisgKglwYXNzZWQgaW4gYW4gaW5jb3JyZWN0IGtlcm5lbCBhZGRyZXNzIHRvIG9uZSBvZiB0aGVzZSBmdW5jdGlvbnMuCisgKgorICoJSWYgeW91IHVzZSB0aGVzZSBmdW5jdGlvbnMgZGlyZWN0bHkgcGxlYXNlIGRvbid0IGZvcmdldCB0aGUgYWNjZXNzX29rKCkuCisgKi8KK3N0YXRpYyBpbmxpbmUKK19fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LAorCQkJCQlpbnQgbGVuLCBfX3dzdW0gc3VtKQoreworCXJldHVybiBjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljKHNyYywgZHN0LCBsZW4sIHN1bSwgTlVMTCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUKK19fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywgdm9pZCAqZHN0LAorCQkJCQkJaW50IGxlbiwgX193c3VtIHN1bSwgaW50ICplcnJfcHRyKQoreworCXJldHVybiBjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljKChfX2ZvcmNlIGNvbnN0IHZvaWQgKilzcmMsIGRzdCwKKwkJCQkJbGVuLCBzdW0sIGVycl9wdHIsIE5VTEwpOworfQorCisvKgorICoJRm9sZCBhIHBhcnRpYWwgY2hlY2tzdW0KKyAqLworCitzdGF0aWMgX19pbmxpbmVfXyBfX3N1bTE2IGNzdW1fZm9sZChfX3dzdW0gc3VtKQoreworCXVuc2lnbmVkIGludCBfX2R1bW15OworCV9fYXNtX18oImV4dHVpCSUxLCAlMCwgMTYsIDE2XG5cdCIKKwkJImV4dHVpCSUwICwlMCwgMCwgMTZcblx0IgorCQkiYWRkCSUwLCAlMCwgJTFcblx0IgorCQkic2xsaQklMSwgJTAsIDE2XG5cdCIKKwkJImFkZAklMCwgJTAsICUxXG5cdCIKKwkJImV4dHVpCSUwLCAlMCwgMTYsIDE2XG5cdCIKKwkJIm5lZwklMCwgJTBcblx0IgorCQkiYWRkaQklMCwgJTAsIC0xXG5cdCIKKwkJImV4dHVpCSUwLCAlMCwgMCwgMTZcblx0IgorCQk6ICI9ciIgKHN1bSksICI9JnIiIChfX2R1bW15KQorCQk6ICIwIiAoc3VtKSk7CisJcmV0dXJuIChfX2ZvcmNlIF9fc3VtMTYpc3VtOworfQorCisvKgorICoJVGhpcyBpcyBhIHZlcnNpb24gb2YgaXBfY29tcHV0ZV9jc3VtKCkgb3B0aW1pemVkIGZvciBJUCBoZWFkZXJzLAorICoJd2hpY2ggYWx3YXlzIGNoZWNrc3VtIG9uIDQgb2N0ZXQgYm91bmRhcmllcy4KKyAqLworc3RhdGljIF9faW5saW5lX18gX19zdW0xNiBpcF9mYXN0X2NzdW0oY29uc3Qgdm9pZCAqaXBoLCB1bnNpZ25lZCBpbnQgaWhsKQoreworCXVuc2lnbmVkIGludCBzdW0sIHRtcCwgZW5kYWRkcjsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkic3ViCQklMCwgJTAsICUwXG5cdCIKKyNpZiBYQ0hBTF9IQVZFX0xPT1BTCisJCSJsb29wZ3R6CSUyLCAyZlxuXHQiCisjZWxzZQorCQkiYmVxegkJJTIsIDJmXG5cdCIKKwkJInNsbGkJCSU0LCAlMiwgMlxuXHQiCisJCSJhZGQJCSU0LCAlNCwgJTFcblx0IgorCQkiMDpcdCIKKyNlbmRpZgorCQkibDMyaQkJJTMsICUxLCAwXG5cdCIKKwkJImFkZAkJJTAsICUwLCAlM1xuXHQiCisJCSJiZ2V1CQklMCwgJTMsIDFmXG5cdCIKKwkJImFkZGkJCSUwLCAlMCwgMVxuXHQiCisJCSIxOlx0IgorCQkiYWRkaQkJJTEsICUxLCA0XG5cdCIKKyNpZiAhWENIQUxfSEFWRV9MT09QUworCQkiYmx0CQklMSwgJTQsIDBiXG5cdCIKKyNlbmRpZgorCQkiMjpcdCIKKwkvKiBTaW5jZSB0aGUgaW5wdXQgcmVnaXN0ZXJzIHdoaWNoIGFyZSBsb2FkZWQgd2l0aCBpcGggYW5kIGlobAorCSAgIGFyZSBtb2RpZmllZCwgd2UgbXVzdCBhbHNvIHNwZWNpZnkgdGhlbSBhcyBvdXRwdXRzLCBvciBnY2MKKwkgICB3aWxsIGFzc3VtZSB0aGV5IGNvbnRhaW4gdGhlaXIgb3JpZ2luYWwgdmFsdWVzLiAqLworCQk6ICI9ciIgKHN1bSksICI9ciIgKGlwaCksICI9ciIgKGlobCksICI9JnIiICh0bXApLCAiPSZyIiAoZW5kYWRkcikKKwkJOiAiMSIgKGlwaCksICIyIiAoaWhsKSk7CisKKwlyZXR1cm4JY3N1bV9mb2xkKHN1bSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fd3N1bSBjc3VtX3RjcHVkcF9ub2ZvbGQoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCisJCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBsZW4sCisJCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBwcm90bywKKwkJCQkJCSAgIF9fd3N1bSBzdW0pCit7CisKKyNpZmRlZiBfX1hURU5TQV9FTF9fCisJdW5zaWduZWQgbG9uZyBsZW5fcHJvdG8gPSAobGVuICsgcHJvdG8pIDw8IDg7CisjZWxpZiBkZWZpbmVkKF9fWFRFTlNBX0VCX18pCisJdW5zaWduZWQgbG9uZyBsZW5fcHJvdG8gPSBsZW4gKyBwcm90bzsKKyNlbHNlCisjIGVycm9yIHByb2Nlc3NvciBieXRlIG9yZGVyIHVuZGVmaW5lZCEKKyNlbmRpZgorCV9fYXNtX18oImFkZAklMCwgJTAsICUxXG5cdCIKKwkJImJnZXUJJTAsICUxLCAxZlxuXHQiCisJCSJhZGRpCSUwLCAlMCwgMVxuXHQiCisJCSIxOlx0IgorCQkiYWRkCSUwLCAlMCwgJTJcblx0IgorCQkiYmdldQklMCwgJTIsIDFmXG5cdCIKKwkJImFkZGkJJTAsICUwLCAxXG5cdCIKKwkJIjE6XHQiCisJCSJhZGQJJTAsICUwLCAlM1xuXHQiCisJCSJiZ2V1CSUwLCAlMywgMWZcblx0IgorCQkiYWRkaQklMCwgJTAsIDFcblx0IgorCQkiMTpcdCIKKwkJOiAiPXIiIChzdW0pLCAiPXIiIChsZW5fcHJvdG8pCisJCTogInIiIChkYWRkciksICJyIiAoc2FkZHIpLCAiMSIgKGxlbl9wcm90byksICIwIiAoc3VtKSk7CisJcmV0dXJuIHN1bTsKK30KKworLyoKKyAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiB0aGUgVENQL1VEUCBwc2V1ZG8taGVhZGVyCisgKiByZXR1cm5zIGEgMTYtYml0IGNoZWNrc3VtLCBhbHJlYWR5IGNvbXBsZW1lbnRlZAorICovCitzdGF0aWMgX19pbmxpbmVfXyBfX3N1bTE2IGNzdW1fdGNwdWRwX21hZ2ljKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAorCQkJCQkJICAgICAgIHVuc2lnbmVkIHNob3J0IGxlbiwKKwkJCQkJCSAgICAgICB1bnNpZ25lZCBzaG9ydCBwcm90bywKKwkJCQkJCSAgICAgICBfX3dzdW0gc3VtKQoreworCXJldHVybiBjc3VtX2ZvbGQoY3N1bV90Y3B1ZHBfbm9mb2xkKHNhZGRyLGRhZGRyLGxlbixwcm90byxzdW0pKTsKK30KKworLyoKKyAqIHRoaXMgcm91dGluZSBpcyB1c2VkIGZvciBtaXNjZWxsYW5lb3VzIElQLWxpa2UgY2hlY2tzdW1zLCBtYWlubHkKKyAqIGluIGljbXAuYworICovCisKK3N0YXRpYyBfX2lubGluZV9fIF9fc3VtMTYgaXBfY29tcHV0ZV9jc3VtKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4pCit7CisgICAgcmV0dXJuIGNzdW1fZm9sZCAoY3N1bV9wYXJ0aWFsKGJ1ZmYsIGxlbiwgMCkpOworfQorCisjZGVmaW5lIF9IQVZFX0FSQ0hfSVBWNl9DU1VNCitzdGF0aWMgX19pbmxpbmVfXyBfX3N1bTE2IGNzdW1faXB2Nl9tYWdpYyhjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLAorCQkJCQkgIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsCisJCQkJCSAgX191MzIgbGVuLCB1bnNpZ25lZCBzaG9ydCBwcm90bywKKwkJCQkJICBfX3dzdW0gc3VtKQoreworCXVuc2lnbmVkIGludCBfX2R1bW15OworCV9fYXNtX18oImwzMmkJJTEsICUyLCAwXG5cdCIKKwkJImFkZAklMCwgJTAsICUxXG5cdCIKKwkJImJnZXUJJTAsICUxLCAxZlxuXHQiCisJCSJhZGRpCSUwLCAlMCwgMVxuXHQiCisJCSIxOlx0IgorCQkibDMyaQklMSwgJTIsIDRcblx0IgorCQkiYWRkCSUwLCAlMCwgJTFcblx0IgorCQkiYmdldQklMCwgJTEsIDFmXG5cdCIKKwkJImFkZGkJJTAsICUwLCAxXG5cdCIKKwkJIjE6XHQiCisJCSJsMzJpCSUxLCAlMiwgOFxuXHQiCisJCSJhZGQJJTAsICUwLCAlMVxuXHQiCisJCSJiZ2V1CSUwLCAlMSwgMWZcblx0IgorCQkiYWRkaQklMCwgJTAsIDFcblx0IgorCQkiMTpcdCIKKwkJImwzMmkJJTEsICUyLCAxMlxuXHQiCisJCSJhZGQJJTAsICUwLCAlMVxuXHQiCisJCSJiZ2V1CSUwLCAlMSwgMWZcblx0IgorCQkiYWRkaQklMCwgJTAsIDFcblx0IgorCQkiMTpcdCIKKwkJImwzMmkJJTEsICUzLCAwXG5cdCIKKwkJImFkZAklMCwgJTAsICUxXG5cdCIKKwkJImJnZXUJJTAsICUxLCAxZlxuXHQiCisJCSJhZGRpCSUwLCAlMCwgMVxuXHQiCisJCSIxOlx0IgorCQkibDMyaQklMSwgJTMsIDRcblx0IgorCQkiYWRkCSUwLCAlMCwgJTFcblx0IgorCQkiYmdldQklMCwgJTEsIDFmXG5cdCIKKwkJImFkZGkJJTAsICUwLCAxXG5cdCIKKwkJIjE6XHQiCisJCSJsMzJpCSUxLCAlMywgOFxuXHQiCisJCSJhZGQJJTAsICUwLCAlMVxuXHQiCisJCSJiZ2V1CSUwLCAlMSwgMWZcblx0IgorCQkiYWRkaQklMCwgJTAsIDFcblx0IgorCQkiMTpcdCIKKwkJImwzMmkJJTEsICUzLCAxMlxuXHQiCisJCSJhZGQJJTAsICUwLCAlMVxuXHQiCisJCSJiZ2V1CSUwLCAlMSwgMWZcblx0IgorCQkiYWRkaQklMCwgJTAsIDFcblx0IgorCQkiMTpcdCIKKwkJImFkZAklMCwgJTAsICU0XG5cdCIKKwkJImJnZXUJJTAsICU0LCAxZlxuXHQiCisJCSJhZGRpCSUwLCAlMCwgMVxuXHQiCisJCSIxOlx0IgorCQkiYWRkCSUwLCAlMCwgJTVcblx0IgorCQkiYmdldQklMCwgJTUsIDFmXG5cdCIKKwkJImFkZGkJJTAsICUwLCAxXG5cdCIKKwkJIjE6XHQiCisJCTogIj1yIiAoc3VtKSwgIj0mciIgKF9fZHVtbXkpCisJCTogInIiIChzYWRkciksICJyIiAoZGFkZHIpLAorCQkgICJyIiAoaHRvbmwobGVuKSksICJyIiAoaHRvbmwocHJvdG8pKSwgIjAiIChzdW0pKTsKKworCXJldHVybiBjc3VtX2ZvbGQoc3VtKTsKK30KKworLyoKKyAqCUNvcHkgYW5kIGNoZWNrc3VtIHRvIHVzZXIKKyAqLworI2RlZmluZSBIQVZFX0NTVU1fQ09QWV9VU0VSCitzdGF0aWMgX19pbmxpbmVfXyBfX3dzdW0gY3N1bV9hbmRfY29weV90b191c2VyKGNvbnN0IHZvaWQgKnNyYywgdm9pZCBfX3VzZXIgKmRzdCwKKwkJCQkgICAgaW50IGxlbiwgX193c3VtIHN1bSwgaW50ICplcnJfcHRyKQoreworCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBkc3QsIGxlbikpCisJCXJldHVybiBjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljKHNyYywgZHN0LCBsZW4sIHN1bSwgTlVMTCwgZXJyX3B0cik7CisKKwlpZiAobGVuKQorCQkqZXJyX3B0ciA9IC1FRkFVTFQ7CisKKwlyZXR1cm4gKF9fZm9yY2UgX193c3VtKS0xOyAvKiBpbnZhbGlkIGNoZWNrc3VtICovCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2NvcHJvY2Vzc29yLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9jb3Byb2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YTI4NWQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9jb3Byb2Nlc3Nvci5oCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogaW5jbHVkZS9hc20teHRlbnNhL2NvcHJvY2Vzc29yLmgKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgLSAyMDA3IFRlbnNpbGljYSBJbmMuCisgKi8KKworCisjaWZuZGVmIF9YVEVOU0FfQ09QUk9DRVNTT1JfSAorI2RlZmluZSBfWFRFTlNBX0NPUFJPQ0VTU09SX0gKKworI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgorI2luY2x1ZGUgPHZhcmlhbnQvdGllLmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKKyNpZmRlZiBfX0FTU0VNQkxZX18KKyMgaW5jbHVkZSA8dmFyaWFudC90aWUtYXNtLmg+CisKKy5tYWNybwl4Y2hhbF9zYV9zdGFydCAgYSBiCisJLnNldCAuTHhjaGFsX3BvZnNfLCAwCisJLnNldCAuTHhjaGFsX29mc18sIDAKKy5lbmRtCisKKy5tYWNybwl4Y2hhbF9zYV9hbGlnbiAgcHRyIG1pbm9mcyBtYXhvZnMgb2ZzYWxpZ24gdG90YWxpZ24KKwkuc2V0CS5MeGNoYWxfb2ZzXywgLkx4Y2hhbF9vZnNfICsgLkx4Y2hhbF9wb2ZzXyArIFx0b3RhbGlnbiAtIDEKKwkuc2V0CS5MeGNoYWxfb2ZzXywgKC5MeGNoYWxfb2ZzXyAmIC1cdG90YWxpZ24pIC0gLkx4Y2hhbF9wb2ZzXworLmVuZG0KKworI2RlZmluZSBfU0VMRUNUCSggIFhUSEFMX1NBU19USUUgfCBYVEhBTF9TQVNfT1BUIFwKKwkJIHwgWFRIQUxfU0FTX0NDIFwKKwkJIHwgWFRIQUxfU0FTX0NBTFIgfCBYVEhBTF9TQVNfQ0FMRSApCisKKy5tYWNybyBzYXZlX3h0cmVnc19vcHQgcHRyIGNsYiBhdDEgYXQyIGF0MyBhdDQgb2Zmc2V0CisJLmlmIFhUUkVHU19PUFRfU0laRSA+IDAKKwkJYWRkaQlcY2xiLCBccHRyLCBcb2Zmc2V0CisJCXhjaGFsX25jcF9zdG9yZSBcY2xiIFxhdDEgXGF0MiBcYXQzIFxhdDQgc2VsZWN0PV9TRUxFQ1QKKwkuZW5kaWYKKy5lbmRtCisKKy5tYWNybyBsb2FkX3h0cmVnc19vcHQgcHRyIGNsYiBhdDEgYXQyIGF0MyBhdDQgb2Zmc2V0CisJLmlmIFhUUkVHU19PUFRfU0laRSA+IDAKKwkJYWRkaQlcY2xiLCBccHRyLCBcb2Zmc2V0CisJCXhjaGFsX25jcF9sb2FkIFxjbGIgXGF0MSBcYXQyIFxhdDMgXGF0NCBzZWxlY3Q9X1NFTEVDVAorCS5lbmRpZgorLmVuZG0KKyN1bmRlZiBfU0VMRUNUCisKKyNkZWZpbmUgX1NFTEVDVAkoICBYVEhBTF9TQVNfVElFIHwgWFRIQUxfU0FTX09QVCBcCisJCSB8IFhUSEFMX1NBU19OT0NDIFwKKwkJIHwgWFRIQUxfU0FTX0NBTFIgfCBYVEhBTF9TQVNfQ0FMRSB8IFhUSEFMX1NBU19HTE9CICkKKworLm1hY3JvIHNhdmVfeHRyZWdzX3VzZXIgcHRyIGNsYiBhdDEgYXQyIGF0MyBhdDQgb2Zmc2V0CisJLmlmIFhUUkVHU19VU0VSX1NJWkUgPiAwCisJCWFkZGkJXGNsYiwgXHB0ciwgXG9mZnNldAorCQl4Y2hhbF9uY3Bfc3RvcmUgXGNsYiBcYXQxIFxhdDIgXGF0MyBcYXQ0IHNlbGVjdD1fU0VMRUNUCisJLmVuZGlmCisuZW5kbQorCisubWFjcm8gbG9hZF94dHJlZ3NfdXNlciBwdHIgY2xiIGF0MSBhdDIgYXQzIGF0NCBvZmZzZXQKKwkuaWYgWFRSRUdTX1VTRVJfU0laRSA+IDAKKwkJYWRkaQlcY2xiLCBccHRyLCBcb2Zmc2V0CisJCXhjaGFsX25jcF9sb2FkIFxjbGIgXGF0MSBcYXQyIFxhdDMgXGF0NCBzZWxlY3Q9X1NFTEVDVAorCS5lbmRpZgorLmVuZG0KKyN1bmRlZiBfU0VMRUNUCisKKworCisjZW5kaWYJLyogX19BU1NFTUJMWV9fICovCisKKy8qCisgKiBYVEVOU0FfSEFWRV9DT1BST0NFU1NPUih4KSByZXR1cm5zIDEgaWYgY29wcm9jZXNzb3IgeCBpcyBjb25maWd1cmVkLgorICoKKyAqIFhURU5TQV9IQVZFX0lPX1BPUlQoeCkgcmV0dXJucyAxIGlmIGlvLXBvcnQgeCBpcyBjb25maWd1cmVkLgorICoKKyAqLworCisjZGVmaW5lIFhURU5TQV9IQVZFX0NPUFJPQ0VTU09SKHgpCQkJCQlcCisJKChYQ0hBTF9DUF9NQVNLIF4gWENIQUxfQ1BfUE9SVF9NQVNLKSAmICgxIDw8ICh4KSkpCisjZGVmaW5lIFhURU5TQV9IQVZFX0NPUFJPQ0VTU09SUwkJCQkJXAorCShYQ0hBTF9DUF9NQVNLIF4gWENIQUxfQ1BfUE9SVF9NQVNLKQorI2RlZmluZSBYVEVOU0FfSEFWRV9JT19QT1JUKHgpCQkJCQkJXAorCShYQ0hBTF9DUF9QT1JUX01BU0sgJiAoMSA8PCAoeCkpKQorI2RlZmluZSBYVEVOU0FfSEFWRV9JT19QT1JUUwkJCQkJCVwKKwlYQ0hBTF9DUF9QT1JUX01BU0sKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworCisjaWYgWENIQUxfSEFWRV9DUAorCisjZGVmaW5lIFJTUl9DUEVOQUJMRSh4KQlkbyB7CQkJCQkJICBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oInJzciAlMCwiIF9fc3RyaW5naWZ5KENQRU5BQkxFKSA6ICI9YSIgKHgpKTsgXAorCX0gd2hpbGUoMCk7CisjZGVmaW5lIFdTUl9DUEVOQUJMRSh4KQlkbyB7CQkJCQkJICBcCisgIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygid3NyICUwLCIgX19zdHJpbmdpZnkoQ1BFTkFCTEUpICI7IHJzeW5jIiAJICBcCisJICAgIAkJICAgICA6OiAiYSIgKHgpKTsJCQkJICBcCisJfSB3aGlsZSgwKTsKKworI2VuZGlmIC8qIFhDSEFMX0hBVkVfQ1AgKi8KKworCisvKgorICogQWRkaXRpb25hbCByZWdpc3RlcnMuCisgKiBXZSBkZWZpbmUgdGhyZWUgdHlwZXMgb2YgYWRkaXRpb25hbCByZWdpc3RlcnM6CisgKiAgZXh0OiBleHRyYSByZWdpc3RlcnMgdGhhdCBhcmUgdXNlZCBieSB0aGUgY29tcGlsZXIKKyAqICBjcG46IG9wdGlvbmFsIHJlZ2lzdGVycyB0aGF0IGNhbiBiZSB1c2VkIGJ5IGEgdXNlciBhcHBsaWNhdGlvbgorICogIGNwWDogY29wcm9jZXNzb3IgcmVnaXN0ZXJzIHRoYXQgY2FuIG9ubHkgYmUgdXNlZCBpZiB0aGUgY29ycmVzcG9uZGluZworICogICAgICAgQ1BFTkFCTEUgYml0IGlzIHNldC4KKyAqLworCisjZGVmaW5lIFhDSEFMX1NBX1JFRyhsaXN0LGNjLGFiaSx0eXBlLHksbmFtZSx6LGFsaWduLHNpemUsLi4uKQlcCisJX19SRUcgIyMgbGlzdCAoY2MsIGFiaSwgdHlwZSwgbmFtZSwgc2l6ZSwgYWxpZ24pCisKKyNkZWZpbmUgX19SRUcwKGNjLGFiaSx0LG5hbWUscyxhKQlfX1JFRzBfICMjIGNjIChhYmksbmFtZSkKKyNkZWZpbmUgX19SRUcxKGNjLGFiaSx0LG5hbWUscyxhKQlfX1JFRzFfICMjIGNjIChuYW1lKQorI2RlZmluZSBfX1JFRzIoY2MsYWJpLHR5cGUsLi4uKQkJX19SRUcyXyAjIyB0eXBlIChfX1ZBX0FSR1NfXykKKworI2RlZmluZSBfX1JFRzBfMChhYmksbmFtZSkKKyNkZWZpbmUgX19SRUcwXzEoYWJpLG5hbWUpCQlfX1JFRzBfMSAjIyBhYmkgKG5hbWUpCisjZGVmaW5lIF9fUkVHMF8xMChuYW1lKQlfX3UzMiBuYW1lOworI2RlZmluZSBfX1JFRzBfMTEobmFtZSkJX191MzIgbmFtZTsKKyNkZWZpbmUgX19SRUcwXzEyKG5hbWUpCisKKyNkZWZpbmUgX19SRUcxXzAobmFtZSkJX191MzIgbmFtZTsKKyNkZWZpbmUgX19SRUcxXzEobmFtZSkKKworI2RlZmluZSBfX1JFRzJfMChuLHMsYSkJX191MzIgbmFtZTsKKyNkZWZpbmUgX19SRUcyXzEobixzLGEpCXVuc2lnbmVkIGNoYXIgbltzXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZChhKSkpOworI2RlZmluZSBfX1JFRzJfMihuLHMsYSkgdW5zaWduZWQgY2hhciBuW3NdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKGEpKSk7CisKK3R5cGVkZWYgc3RydWN0IHsgWENIQUxfTkNQX1NBX0xJU1QoMCkgfSB4dHJlZ3Nfb3B0X3QKKwlfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoWENIQUxfTkNQX1NBX0FMSUdOKSkpOwordHlwZWRlZiBzdHJ1Y3QgeyBYQ0hBTF9OQ1BfU0FfTElTVCgxKSB9IHh0cmVnc191c2VyX3QKKwlfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoWENIQUxfTkNQX1NBX0FMSUdOKSkpOworCisjaWYgWFRFTlNBX0hBVkVfQ09QUk9DRVNTT1JTCisKK3R5cGVkZWYgc3RydWN0IHsgWENIQUxfQ1AwX1NBX0xJU1QoMikgfSB4dHJlZ3NfY3AwX3QKKwlfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoWENIQUxfQ1AwX1NBX0FMSUdOKSkpOwordHlwZWRlZiBzdHJ1Y3QgeyBYQ0hBTF9DUDFfU0FfTElTVCgyKSB9IHh0cmVnc19jcDFfdAorCV9fYXR0cmlidXRlX18gKChhbGlnbmVkIChYQ0hBTF9DUDFfU0FfQUxJR04pKSk7Cit0eXBlZGVmIHN0cnVjdCB7IFhDSEFMX0NQMl9TQV9MSVNUKDIpIH0geHRyZWdzX2NwMl90CisJX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKFhDSEFMX0NQMl9TQV9BTElHTikpKTsKK3R5cGVkZWYgc3RydWN0IHsgWENIQUxfQ1AzX1NBX0xJU1QoMikgfSB4dHJlZ3NfY3AzX3QKKwlfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoWENIQUxfQ1AzX1NBX0FMSUdOKSkpOwordHlwZWRlZiBzdHJ1Y3QgeyBYQ0hBTF9DUDRfU0FfTElTVCgyKSB9IHh0cmVnc19jcDRfdAorCV9fYXR0cmlidXRlX18gKChhbGlnbmVkIChYQ0hBTF9DUDRfU0FfQUxJR04pKSk7Cit0eXBlZGVmIHN0cnVjdCB7IFhDSEFMX0NQNV9TQV9MSVNUKDIpIH0geHRyZWdzX2NwNV90CisJX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKFhDSEFMX0NQNV9TQV9BTElHTikpKTsKK3R5cGVkZWYgc3RydWN0IHsgWENIQUxfQ1A2X1NBX0xJU1QoMikgfSB4dHJlZ3NfY3A2X3QKKwlfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoWENIQUxfQ1A2X1NBX0FMSUdOKSkpOwordHlwZWRlZiBzdHJ1Y3QgeyBYQ0hBTF9DUDdfU0FfTElTVCgyKSB9IHh0cmVnc19jcDdfdAorCV9fYXR0cmlidXRlX18gKChhbGlnbmVkIChYQ0hBTF9DUDdfU0FfQUxJR04pKSk7CisKK2V4dGVybiBzdHJ1Y3QgdGhyZWFkX2luZm8qIGNvcHJvY2Vzc29yX293bmVyW1hDSEFMX0NQX01BWF07CitleHRlcm4gdm9pZCBjb3Byb2Nlc3Nvcl9zYXZlKHZvaWQqLCBpbnQpOworZXh0ZXJuIHZvaWQgY29wcm9jZXNzb3JfbG9hZCh2b2lkKiwgaW50KTsKK2V4dGVybiB2b2lkIGNvcHJvY2Vzc29yX2ZsdXNoKHN0cnVjdCB0aHJlYWRfaW5mbyosIGludCk7CitleHRlcm4gdm9pZCBjb3Byb2Nlc3Nvcl9yZXN0b3JlKHN0cnVjdCB0aHJlYWRfaW5mbyosIGludCk7CisKK2V4dGVybiB2b2lkIGNvcHJvY2Vzc29yX3JlbGVhc2VfYWxsKHN0cnVjdCB0aHJlYWRfaW5mbyopOworZXh0ZXJuIHZvaWQgY29wcm9jZXNzb3JfZmx1c2hfYWxsKHN0cnVjdCB0aHJlYWRfaW5mbyopOworCitzdGF0aWMgaW5saW5lIHZvaWQgY29wcm9jZXNzb3JfY2xlYXJfY3BlbmFibGUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGkgPSAwOworCVdTUl9DUEVOQUJMRShpKTsKK30KKworI2VuZGlmCS8qIFhURU5TQV9IQVZFX0NPUFJPQ0VTU09SUyAqLworCisjZW5kaWYJLyogIV9fQVNTRU1CTFlfXyAqLworI2VuZGlmCS8qIF9YVEVOU0FfQ09QUk9DRVNTT1JfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2NwdW1hc2suaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2NwdW1hc2suaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL2NwdW1hc2suaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vY3B1bWFzay5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvY3B1dGltZS5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vY3B1dGltZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvY3B1dGltZS5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9jcHV0aW1lLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9jdXJyZW50LmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9jdXJyZW50LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9jdXJyZW50LmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2N1cnJlbnQuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2RlbGF5LmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9kZWxheS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvZGVsYXkuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vZGVsYXkuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2RldmljZS5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vZGV2aWNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9kZXZpY2UuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vZGV2aWNlLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9kaXY2NC5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vZGl2NjQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL2RpdjY0LmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2RpdjY0LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9kbWEtbWFwcGluZy5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vZG1hLW1hcHBpbmcuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL2RtYS1tYXBwaW5nLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9kbWEuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2RtYS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvZG1hLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2RtYS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvZWxmLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9lbGYuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL2VsZi5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9lbGYuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2VtZXJnZW5jeS1yZXN0YXJ0LmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9lbWVyZ2VuY3ktcmVzdGFydC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvZW1lcmdlbmN5LXJlc3RhcnQuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vZW1lcmdlbmN5LXJlc3RhcnQuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2Vycm5vLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9lcnJuby5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvZXJybm8uaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vZXJybm8uaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2ZiLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9mYi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvZmIuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vZmIuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2ZjbnRsLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9mY250bC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvZmNudGwuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vZmNudGwuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2Z1dGV4LmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9mdXRleC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvZnV0ZXguaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vZnV0ZXguaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2hhcmRpcnEuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2hhcmRpcnEuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL2hhcmRpcnEuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vaGFyZGlycS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvaGlnaG1lbS5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vaGlnaG1lbS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvaGlnaG1lbS5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9oaWdobWVtLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9od19pcnEuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2h3X2lycS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvaHdfaXJxLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2h3X2lycS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvaW8uaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2lvLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9pby5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9pby5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvaW9jdGwuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2lvY3RsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9pb2N0bC5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9pb2N0bC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvaW9jdGxzLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9pb2N0bHMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL2lvY3Rscy5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9pb2N0bHMuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2lwY2J1Zi5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vaXBjYnVmLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9pcGNidWYuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vaXBjYnVmLmgKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2lycS5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vaXJxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYyMGQxZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2lycS5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS14dGVuc2EvaXJxLmgKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCisgKi8KKworI2lmbmRlZiBfWFRFTlNBX0lSUV9ICisjZGVmaW5lIF9YVEVOU0FfSVJRX0gKKworI2luY2x1ZGUgPHBsYXRmb3JtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8dmFyaWFudC9jb3JlLmg+CisKKyNpZm5kZWYgUExBVEZPUk1fTlJfSVJRUworIyBkZWZpbmUgUExBVEZPUk1fTlJfSVJRUyAwCisjZW5kaWYKKyNkZWZpbmUgWFRFTlNBX05SX0lSUVMgWENIQUxfTlVNX0lOVEVSUlVQVFMKKyNkZWZpbmUgTlJfSVJRUyAoWFRFTlNBX05SX0lSUVMgKyBQTEFURk9STV9OUl9JUlFTKQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgaXJxX2Nhbm9uaWNhbGl6ZShpbnQgaXJxKQoreworCXJldHVybiAoaXJxKTsKK30KKworc3RydWN0IGlycWFjdGlvbjsKKworI2VuZGlmCS8qIF9YVEVOU0FfSVJRX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9pcnFfcmVncy5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vaXJxX3JlZ3MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL2lycV9yZWdzLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2lycV9yZWdzLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9rZGVidWcuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2tkZWJ1Zy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2Eva2RlYnVnLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2tkZWJ1Zy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2Eva21hcF90eXBlcy5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20va21hcF90eXBlcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2Eva21hcF90eXBlcy5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9rbWFwX3R5cGVzLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9saW5rYWdlLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9saW5rYWdlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9saW5rYWdlLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2xpbmthZ2UuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2xvY2FsLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9sb2NhbC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvbG9jYWwuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vbG9jYWwuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL21tYW4uaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL21tYW4uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL21tYW4uaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vbW1hbi5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvbW11LmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9tbXUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL21tdS5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9tbXUuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL21tdV9jb250ZXh0LmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvbW11X2NvbnRleHQuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL21vZHVsZS5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vbW9kdWxlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9tb2R1bGUuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vbW9kdWxlLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9tc2didWYuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL21zZ2J1Zi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvbXNnYnVmLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL21zZ2J1Zi5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvbXV0ZXguaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL211dGV4LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9tdXRleC5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9tdXRleC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvcGFnZS5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcGFnZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvcGFnZS5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wYWdlLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wYXJhbS5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcGFyYW0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3BhcmFtLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3BhcmFtLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wY2ktYnJpZGdlLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wY2ktYnJpZGdlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9wY2ktYnJpZGdlLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3BjaS1icmlkZ2UuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3BjaS5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcGNpLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9wY2kuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcGNpLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wZXJjcHUuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3BlcmNwdS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvcGVyY3B1LmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3BlcmNwdS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvcGdhbGxvYy5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcGdhbGxvYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvcGdhbGxvYy5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wZ2FsbG9jLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wZ3RhYmxlLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9wZ3RhYmxlLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3BndGFibGUuaApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcGxhdGZvcm0uaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3BsYXRmb3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNkNWE0OAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3BsYXRmb3JtLmgKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIFBsYXRmb3JtIHNwZWNpZmljIGZ1bmN0aW9ucworICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YKKyAqIHRoaXMgYXJjaGl2ZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfUExBVEZPUk1fSAorI2RlZmluZSBfWFRFTlNBX1BMQVRGT1JNX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKyNpbmNsdWRlIDxhc20vYm9vdHBhcmFtLmg+CisKKy8qCisgKiBwbGF0Zm9ybV9pbml0IGlzIGNhbGxlZCBiZWZvcmUgdGhlIG1tdSBpcyBpbml0aWFsaXplZCB0byBnaXZlIHRoZQorICogcGxhdGZvcm0gYSBlYXJseSBob29rLXVwLiBicF90YWdfdCBpcyBhIGxpc3Qgb2YgY29uZmlndXJhdGlvbiB0YWdzCisgKiBwYXNzZWQgZnJvbSB0aGUgYm9vdC1sb2FkZXIuCisgKi8KK2V4dGVybiB2b2lkIHBsYXRmb3JtX2luaXQoYnBfdGFnX3QqKTsKKworLyoKKyAqIHBsYXRmb3JtX3NldHVwIGlzIGNhbGxlZCBmcm9tIHNldHVwX2FyY2ggd2l0aCBhIHBvaW50ZXIgdG8gdGhlIGNvbW1hbmQtbGluZQorICogc3RyaW5nLgorICovCitleHRlcm4gdm9pZCBwbGF0Zm9ybV9zZXR1cCAoY2hhciAqKik7CisKKy8qCisgKiBwbGF0Zm9ybV9pbml0X2lycSBpcyBjYWxsZWQgZnJvbSBpbml0X0lSUS4KKyAqLworZXh0ZXJuIHZvaWQgcGxhdGZvcm1faW5pdF9pcnEgKHZvaWQpOworCisvKgorICogcGxhdGZvcm1fcmVzdGFydCBpcyBjYWxsZWQgdG8gcmVzdGFydCB0aGUgc3lzdGVtLgorICovCitleHRlcm4gdm9pZCBwbGF0Zm9ybV9yZXN0YXJ0ICh2b2lkKTsKKworLyoKKyAqIHBsYXRmb3JtX2hhbHQgaXMgY2FsbGVkIHRvIHN0b3AgdGhlIHN5c3RlbSBhbmQgaGFsdC4KKyAqLworZXh0ZXJuIHZvaWQgcGxhdGZvcm1faGFsdCAodm9pZCk7CisKKy8qCisgKiBwbGF0Zm9ybV9wb3dlcl9vZmYgaXMgY2FsbGVkIHRvIHN0b3AgdGhlIHN5c3RlbSBhbmQgcG93ZXIgaXQgb2ZmLgorICovCitleHRlcm4gdm9pZCBwbGF0Zm9ybV9wb3dlcl9vZmYgKHZvaWQpOworCisvKgorICogcGxhdGZvcm1faWRsZSBpcyBjYWxsZWQgZnJvbSB0aGUgaWRsZSBmdW5jdGlvbi4KKyAqLworZXh0ZXJuIHZvaWQgcGxhdGZvcm1faWRsZSAodm9pZCk7CisKKy8qCisgKiBwbGF0Zm9ybV9oZWFydGJlYXQgaXMgY2FsbGVkIGV2ZXJ5IEhaCisgKi8KK2V4dGVybiB2b2lkIHBsYXRmb3JtX2hlYXJ0YmVhdCAodm9pZCk7CisKKy8qCisgKiBwbGF0Zm9ybV9wY2liaW9zX2luaXQgaXMgY2FsbGVkIHRvIGFsbG93IHRoZSBwbGF0Zm9ybSB0byBzZXR1cCB0aGUgcGNpIGJ1cy4KKyAqLworZXh0ZXJuIHZvaWQgcGxhdGZvcm1fcGNpYmlvc19pbml0ICh2b2lkKTsKKworLyoKKyAqIHBsYXRmb3JtX3BjaWJpb3NfZml4dXAgYWxsb3dzIHRvIG1vZGlmeSB0aGUgUENJIGNvbmZpZ3VyYXRpb24uCisgKi8KK2V4dGVybiBpbnQgcGxhdGZvcm1fcGNpYmlvc19maXh1cCAodm9pZCk7CisKKy8qCisgKiBwbGF0Zm9ybV9jYWxpYnJhdGVfY2NvdW50IGNhbGlicmF0ZXMgY3B1IGNsb2NrIGZyZXEgKENPTkZJR19YVEVOU0FfQ0FMSUJSQVRFKQorICovCitleHRlcm4gdm9pZCBwbGF0Zm9ybV9jYWxpYnJhdGVfY2NvdW50ICh2b2lkKTsKKworLyoKKyAqIHBsYXRmb3JtX2dldF9ydGNfdGltZSByZXR1cm5zIFJUQyBzZWNvbmRzIChyZXR1cm5zIDAgZm9yIG5vIGVycm9yKQorICovCitleHRlcm4gaW50IHBsYXRmb3JtX2dldF9ydGNfdGltZSh0aW1lX3QqKTsKKworLyoKKyAqIHBsYXRmb3JtX3NldF9ydGNfdGltZSBzZXQgUlRDIHNlY29uZHMgKHJldHVybnMgMCBmb3Igbm8gZXJyb3IpCisgKi8KK2V4dGVybiBpbnQgcGxhdGZvcm1fc2V0X3J0Y190aW1lKHRpbWVfdCk7CisKKworI2VuZGlmCS8qIF9YVEVOU0FfUExBVEZPUk1fSCAqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvcG9sbC5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcG9sbC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvcG9sbC5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wb2xsLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wb3NpeF90eXBlcy5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcG9zaXhfdHlwZXMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3Bvc2l4X3R5cGVzLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3Bvc2l4X3R5cGVzLmgKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDczODdkMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCkBAIC0wLDAgKzEsMTkzIEBACisvKgorICogaW5jbHVkZS9hc20teHRlbnNhL3Byb2Nlc3Nvci5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9QUk9DRVNTT1JfSAorI2RlZmluZSBfWFRFTlNBX1BST0NFU1NPUl9ICisKKyNpbmNsdWRlIDx2YXJpYW50L2NvcmUuaD4KKyNpbmNsdWRlIDxhc20vY29wcm9jZXNzb3IuaD4KKworI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9yZWdzLmg+CisKKy8qIEFzc2VydGlvbnMuICovCisKKyNpZiAoWENIQUxfSEFWRV9XSU5ET1dFRCAhPSAxKQorIyBlcnJvciBMaW51eCByZXF1aXJlcyB0aGUgWHRlbnNhIFdpbmRvd2VkIFJlZ2lzdGVycyBPcHRpb24uCisjZW5kaWYKKworLyoKKyAqIFVzZXIgc3BhY2UgcHJvY2VzcyBzaXplOiAxIEdCLgorICogV2luZG93ZWQgY2FsbCBBQkkgcmVxdWlyZXMgY2FsbGVyIGFuZCBjYWxsZWUgdG8gYmUgbG9jYXRlZCB3aXRoaW4gdGhlIHNhbWUKKyAqIDEgR0IgcmVnaW9uLiBUaGUgQyBjb21waWxlciBwbGFjZXMgdHJhbXBvbGluZSBjb2RlIG9uIHRoZSBzdGFjayBmb3Igc291cmNlcworICogdGhhdCB0YWtlIHRoZSBhZGRyZXNzIG9mIGEgbmVzdGVkIEMgZnVuY3Rpb24gKGEgZmVhdHVyZSB1c2VkIGJ5IGdsaWJjKSwgc28KKyAqIHRoZSAxIEdCIHJlcXVpcmVtZW50IGFwcGxpZXMgdG8gdGhlIHN0YWNrIGFzIHdlbGwuCisgKi8KKworI2RlZmluZSBUQVNLX1NJWkUJX19YVEVOU0FfVUxfQ09OU1QoMHg0MDAwMDAwMCkKKyNkZWZpbmUgU1RBQ0tfVE9QCVRBU0tfU0laRQorI2RlZmluZSBTVEFDS19UT1BfTUFYCVNUQUNLX1RPUAorCisvKgorICogR2VuZXJhbCBleGNlcHRpb24gY2F1c2UgYXNzaWduZWQgdG8gZGVidWcgZXhjZXB0aW9ucy4gRGVidWcgZXhjZXB0aW9ucyBnbworICogdG8gdGhlaXIgb3duIHZlY3RvciwgcmF0aGVyIHRoYW4gdGhlIGdlbmVyYWwgZXhjZXB0aW9uIHZlY3RvcnMgKHVzZXIsCisgKiBrZXJuZWwsIGRvdWJsZSk7IGFuZCB0aGVpciBzcGVjaWZpYyBjYXVzZXMgYXJlIHJlcG9ydGVkIHZpYSBERUJVR0NBVVNFCisgKiByYXRoZXIgdGhhbiBFWENDQVVTRS4gIEhvd2V2ZXIgaXQgaXMgc29tZXRpbWVzIGNvbnZlbmllbnQgdG8gcmVkaXJlY3QgZGVidWcKKyAqIGV4Y2VwdGlvbnMgdG8gdGhlIGdlbmVyYWwgZXhjZXB0aW9uIG1lY2hhbmlzbS4gIFRvIGRvIHRoaXMsIGFuIG90aGVyd2lzZQorICogdW51c2VkIEVYQ0NBVVNFIHZhbHVlIHdhcyBhc3NpZ25lZCB0byBkZWJ1ZyBleGNlcHRpb25zIGZvciB0aGlzIHB1cnBvc2UuCisgKi8KKworI2RlZmluZSBFWENDQVVTRV9NQVBQRURfREVCVUcJNjMKKworLyoKKyAqIFdlIHVzZSBERVBDIGFsc28gYXMgYSBmbGFnIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gZG91YmxlIGFuZCByZWd1bGFyCisgKiBleGNlcHRpb25zLiBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgREVQQyBtaWdodCBjb250YWluIHRoZSB2YWx1ZSBvZgorICogRVhDQ0FVU0UgZm9yIHJlZ3VsYXIgZXhjZXB0aW9ucywgc28gd2UgdXNlIHRoaXMgZGVmaW5pdGlvbiB0byBtYXJrIGEKKyAqIHZhbGlkIGRvdWJsZSBleGNlcHRpb24gYWRkcmVzcy4KKyAqIChOb3RlOiBXZSB1c2UgaXQgaW4gYmdldWksIHNvIGl0IHNob3VsZCBiZSA2NCwgMTI4LCBvciAyNTYpCisgKi8KKworI2RlZmluZSBWQUxJRF9ET1VCTEVfRVhDRVBUSU9OX0FERFJFU1MJNjQKKworLyogTE9DS0xFVkVMIGRlZmluZXMgdGhlIGludGVycnVwdCBsZXZlbCB0aGF0IG1hc2tzIGFsbAorICogZ2VuZXJhbC1wdXJwb3NlIGludGVycnVwdHMuCisgKi8KKyNkZWZpbmUgTE9DS0xFVkVMIDEKKworLyogV1NCSVRTIGFuZCBXQkJJVFMgYXJlIHRoZSB3aWR0aCBvZiB0aGUgV0lORE9XU1RBUlQgYW5kIFdJTkRPV0JBU0UKKyAqIHJlZ2lzdGVycworICovCisjZGVmaW5lIFdTQklUUyAgKFhDSEFMX05VTV9BUkVHUyAvIDQpICAgICAgLyogd2lkdGggb2YgV0lORE9XU1RBUlQgaW4gYml0cyAqLworI2RlZmluZSBXQkJJVFMgIChYQ0hBTF9OVU1fQVJFR1NfTE9HMiAtIDIpIC8qIHdpZHRoIG9mIFdJTkRPV0JBU0UgaW4gYml0cyAqLworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisvKiBCdWlsZCBhIHZhbGlkIHJldHVybiBhZGRyZXNzIGZvciB0aGUgc3BlY2lmaWVkIGNhbGwgd2luc2l6ZS4KKyAqIHdpbnNpemUgbXVzdCBiZSAxIChjYWxsNCksIDIgKGNhbGw4KSwgb3IgMyAoY2FsbDEyKQorICovCisjZGVmaW5lIE1BS0VfUkFfRk9SX0NBTEwocmEsd3MpICAgKCgocmEpICYgMHgzZmZmZmZmZikgfCAod3MpIDw8IDMwKQorCisvKiBDb252ZXJ0IHJldHVybiBhZGRyZXNzIHRvIGEgdmFsaWQgcGMKKyAqIE5vdGU6IFdlIGFzc3VtZSB0aGF0IHRoZSBzdGFjayBwb2ludGVyIGlzIGluIHRoZSBzYW1lIDFHQiByYW5nZXMgYXMgdGhlIHJhCisgKi8KKyNkZWZpbmUgTUFLRV9QQ19GUk9NX1JBKHJhLHNwKSAgICAoKChyYSkgJiAweDNmZmZmZmZmKSB8ICgoc3ApICYgMHhjMDAwMDAwMCkpCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBsb25nIHNlZzsKK30gbW1fc2VnbWVudF90OworCitzdHJ1Y3QgdGhyZWFkX3N0cnVjdCB7CisKKwkvKiBrZXJuZWwncyByZXR1cm4gYWRkcmVzcyBhbmQgc3RhY2sgcG9pbnRlciBmb3IgY29udGV4dCBzd2l0Y2hpbmcgKi8KKwl1bnNpZ25lZCBsb25nIHJhOyAvKiBrZXJuZWwncyBhMDogcmV0dXJuIGFkZHJlc3MgYW5kIHdpbmRvdyBjYWxsIHNpemUgKi8KKwl1bnNpZ25lZCBsb25nIHNwOyAvKiBrZXJuZWwncyBhMTogc3RhY2sgcG9pbnRlciAqLworCisJbW1fc2VnbWVudF90IGN1cnJlbnRfZHM7ICAgIC8qIHNlZSB1YWNjZXNzLmggZm9yIGV4YW1wbGUgdXNlcyAqLworCisJLyogc3RydWN0IHh0ZW5zYV9jcHVpbmZvIGluZm87ICovCisKKwl1bnNpZ25lZCBsb25nIGJhZF92YWRkcjsgLyogbGFzdCB1c2VyIGZhdWx0ICovCisJdW5zaWduZWQgbG9uZyBiYWRfdWFkZHI7IC8qIGxhc3Qga2VybmVsIGZhdWx0IGFjY2Vzc2luZyB1c2VyIHNwYWNlICovCisJdW5zaWduZWQgbG9uZyBlcnJvcl9jb2RlOworCisJdW5zaWduZWQgbG9uZyBpYnJlYWtbWENIQUxfTlVNX0lCUkVBS107CisJdW5zaWduZWQgbG9uZyBkYnJlYWthW1hDSEFMX05VTV9EQlJFQUtdOworCXVuc2lnbmVkIGxvbmcgZGJyZWFrY1tYQ0hBTF9OVU1fREJSRUFLXTsKKworCS8qIE1ha2Ugc3RydWN0dXJlIDE2IGJ5dGVzIGFsaWduZWQuICovCisJaW50IGFsaWduWzBdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDE2KSkpOworfTsKKworCisvKgorICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBtYWNybyB0aGF0IHJldHVybnMgY3VycmVudAorICogaW5zdHJ1Y3Rpb24gcG9pbnRlciAoInByb2dyYW0gY291bnRlciIpLgorICovCisjZGVmaW5lIGN1cnJlbnRfdGV4dF9hZGRyKCkgICh7IF9fbGFiZWxfXyBfbDsgX2w6ICYmX2w7fSkKKworCisvKiBUaGlzIGRlY2lkZXMgd2hlcmUgdGhlIGtlcm5lbCB3aWxsIHNlYXJjaCBmb3IgYSBmcmVlIGNodW5rIG9mIHZtCisgKiBzcGFjZSBkdXJpbmcgbW1hcCdzLgorICovCisjZGVmaW5lIFRBU0tfVU5NQVBQRURfQkFTRQkoVEFTS19TSVpFIC8gMikKKworI2RlZmluZSBJTklUX1RIUkVBRCAgXAorewkJCQkJCQkJCVwKKwlyYToJCTAsIAkJCQkJCVwKKwlzcDoJCXNpemVvZihpbml0X3N0YWNrKSArIChsb25nKSAmaW5pdF9zdGFjaywJXAorCWN1cnJlbnRfZHM6CXswfSwJCQkJCQlcCisJLyppbmZvOgkJezB9LCAqLwkJCQkJCVwKKwliYWRfdmFkZHI6CTAsCQkJCQkJXAorCWJhZF91YWRkcjoJMCwJCQkJCQlcCisJZXJyb3JfY29kZToJMCwJCQkJCQlcCit9CisKKworLyoKKyAqIERvIG5lY2Vzc2FyeSBzZXR1cCB0byBzdGFydCB1cCBhIG5ld2x5IGV4ZWN1dGVkIHRocmVhZC4KKyAqIE5vdGU6IFdlIHNldC11cCBwcyBhcyBpZiB3ZSBkaWQgYSBjYWxsNCB0byB0aGUgbmV3IHBjLgorICogICAgICAgc2V0X3RocmVhZF9zdGF0ZSBpbiBzaWduYWwuYyBkZXBlbmRzIG9uIGl0LgorICovCisjZGVmaW5lIFVTRVJfUFNfVkFMVUUgKCgxIDw8IFBTX1dPRV9CSVQpIHwJCQkJXAorICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBQU19DQUxMSU5DX1NISUZUKSB8CQkJXAorICAgICAgICAgICAgICAgICAgICAgICAoVVNFUl9SSU5HIDw8IFBTX1JJTkdfU0hJRlQpIHwJCQlcCisgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IFBTX1VNX0JJVCkgfAkJCQlcCisgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IFBTX0VYQ01fQklUKSkKKworLyogQ2xlYXJpbmcgYTAgdGVybWluYXRlcyB0aGUgYmFja3RyYWNlLiAqLworI2RlZmluZSBzdGFydF90aHJlYWQocmVncywgbmV3X3BjLCBuZXdfc3ApIFwKKwlyZWdzLT5wYyA9IG5ld19wYzsgXAorCXJlZ3MtPnBzID0gVVNFUl9QU19WQUxVRTsgXAorCXJlZ3MtPmFyZWdbMV0gPSBuZXdfc3A7IFwKKwlyZWdzLT5hcmVnWzBdID0gMDsgXAorCXJlZ3MtPndtYXNrID0gMTsgXAorCXJlZ3MtPmRlcGMgPSAwOyBcCisJcmVncy0+d2luZG93YmFzZSA9IDA7IFwKKwlyZWdzLT53aW5kb3dzdGFydCA9IDE7CisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb24gKi8KK3N0cnVjdCB0YXNrX3N0cnVjdDsKK3N0cnVjdCBtbV9zdHJ1Y3Q7CisKKy8qIEZyZWUgYWxsIHJlc291cmNlcyBoZWxkIGJ5IGEgdGhyZWFkLiAqLworI2RlZmluZSByZWxlYXNlX3RocmVhZCh0aHJlYWQpIGRvIHsgfSB3aGlsZSgwKQorCisvKiBQcmVwYXJlIHRvIGNvcHkgdGhyZWFkIHN0YXRlIC0gdW5sYXp5IGFsbCBsYXp5IHN0YXR1cyAqLworZXh0ZXJuIHZvaWQgcHJlcGFyZV90b19jb3B5KHN0cnVjdCB0YXNrX3N0cnVjdCopOworCisvKiBDcmVhdGUgYSBrZXJuZWwgdGhyZWFkIHdpdGhvdXQgcmVtb3ZpbmcgaXQgZnJvbSB0YXNrbGlzdHMgKi8KK2V4dGVybiBpbnQga2VybmVsX3RocmVhZChpbnQgKCpmbikodm9pZCAqKSwgdm9pZCAqIGFyZywgdW5zaWduZWQgbG9uZyBmbGFncyk7CisKKy8qIENvcHkgYW5kIHJlbGVhc2UgYWxsIHNlZ21lbnQgaW5mbyBhc3NvY2lhdGVkIHdpdGggYSBWTSAqLworI2RlZmluZSBjb3B5X3NlZ21lbnRzKHAsIG1tKQlkbyB7IH0gd2hpbGUoMCkKKyNkZWZpbmUgcmVsZWFzZV9zZWdtZW50cyhtbSkJZG8geyB9IHdoaWxlKDApCisjZGVmaW5lIGZvcmdldF9zZWdtZW50cygpCWRvIHsgfSB3aGlsZSAoMCkKKworI2RlZmluZSB0aHJlYWRfc2F2ZWRfcGModHNrKQkodGFza19wdF9yZWdzKHRzayktPnBjKQorCitleHRlcm4gdW5zaWduZWQgbG9uZyBnZXRfd2NoYW4oc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKKworI2RlZmluZSBLU1RLX0VJUCh0c2spCQkodGFza19wdF9yZWdzKHRzayktPnBjKQorI2RlZmluZSBLU1RLX0VTUCh0c2spCQkodGFza19wdF9yZWdzKHRzayktPmFyZWdbMV0pCisKKyNkZWZpbmUgY3B1X3JlbGF4KCkgIGJhcnJpZXIoKQorCisvKiBTcGVjaWFsIHJlZ2lzdGVyIGFjY2Vzcy4gKi8KKworI2RlZmluZSBXU1IodixzcikgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJ3c3IgJTAsIl9fc3RyaW5naWZ5KHNyKSA6OiAiYSIodikpOworI2RlZmluZSBSU1IodixzcikgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJyc3IgJTAsIl9fc3RyaW5naWZ5KHNyKSA6ICI9YSIodikpOworCisjZGVmaW5lIHNldF9zcih4LHNyKSAoe3Vuc2lnbmVkIGludCB2PSh1bnNpZ25lZCBpbnQpeDsgV1NSKHYsc3IpO30pCisjZGVmaW5lIGdldF9zcihzcikgKHt1bnNpZ25lZCBpbnQgdjsgUlNSKHYsc3IpOyB2OyB9KQorCisjZW5kaWYJLyogX19BU1NFTUJMWV9fICovCisjZW5kaWYJLyogX1hURU5TQV9QUk9DRVNTT1JfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcHRyYWNlLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wdHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDVlMWU2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcHRyYWNlLmgKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS14dGVuc2EvcHRyYWNlLmgKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCisgKi8KKworI2lmbmRlZiBfWFRFTlNBX1BUUkFDRV9ICisjZGVmaW5lIF9YVEVOU0FfUFRSQUNFX0gKKworLyoKKyAqIEtlcm5lbCBzdGFjaworICoKKyAqIAkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgLS0tLS0tLS0gU1RBQ0tfU0laRQorICogCQl8ICAgICByZWdpc3RlciBmaWxlICAgICB8ICB8CisgKiAJCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgIHwKKyAqIAkJfCAgICBzdHJ1Y3QgcHRfcmVncyAgICAgfCAgfAorICogCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICB8IC0tLS0tLSBQVF9SRUdTX09GRlNFVAorICogZG91YmxlIAk6ICAxNiBieXRlcyBzcGlsbCBhcmVhICA6ICB8ICBeCisgKiBleGNldGlvbiAJOi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtOiAgfCAgfAorICogZnJhbWUJOiAgICBzdHJ1Y3QgcHRfcmVncyAgICAgOiAgfCAgfAorICogCQk6LSAtIC0gLSAtIC0gLSAtIC0gLSAtIC06ICB8ICB8CisgKiAJCXwgICAgICAgICAgICAgICAgICAgICAgIHwgIHwgIHwKKyAqIAkJfCAgICAgbWVtb3J5IHN0YWNrICAgICAgfCAgfCAgfAorICogCQl8ICAgICAgICAgICAgICAgICAgICAgICB8ICB8ICB8CisgKiAJCX4gICAgICAgICAgICAgICAgICAgICAgIH4gIH4gIH4KKyAqIAkJfiAgICAgICAgICAgICAgICAgICAgICAgfiAgfiAgfgorICogCQl8ICAgICAgICAgICAgICAgICAgICAgICB8ICB8ICB8CisgKiAJCXwgICAgICAgICAgICAgICAgICAgICAgIHwgIHwgIHwKKyAqIAkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgfCAgfCAtLS0gU1RBQ0tfQklBUworICogCQl8ICBzdHJ1Y3QgdGFza19zdHJ1Y3QgICB8ICB8ICB8ICBeCisgKiAgY3VycmVudCAtLT4gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgfCAgfCAgfAorICogCQl8ICBzdHJ1Y3QgdGhyZWFkX2luZm8gICB8ICB8ICB8ICB8CisgKgkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAtLS0tLS0tLQorICovCisKKyNkZWZpbmUgS0VSTkVMX1NUQUNLX1NJWkUgKDIgKiBQQUdFX1NJWkUpCisKKy8qICBPZmZzZXRzIGZvciBleGNlcHRpb25faGFuZGxlcnNbXSAoMyB4IDY0LWVudHJpZXMgeCA0LWJ5dGUgdGFibGVzKS4gKi8KKworI2RlZmluZSBFWENfVEFCTEVfS1NUSwkJMHgwMDQJLyogS2VybmVsIFN0YWNrICovCisjZGVmaW5lIEVYQ19UQUJMRV9ET1VCTEVfU0FWRQkweDAwOAkvKiBEb3VibGUgZXhjZXB0aW9uIHNhdmUgYXJlYSBmb3IgYTAgKi8KKyNkZWZpbmUgRVhDX1RBQkxFX0ZJWFVQCQkweDAwYwkvKiBGaXh1cCBoYW5kbGVyICovCisjZGVmaW5lIEVYQ19UQUJMRV9QQVJBTQkJMHgwMTAJLyogRm9yIHBhc3NpbmcgYSBwYXJhbWV0ZXIgdG8gZml4dXAgKi8KKyNkZWZpbmUgRVhDX1RBQkxFX1NZU0NBTExfU0FWRQkweDAxNAkvKiBGb3IgZmFzdCBzeXNjYWxsIGhhbmRsZXIgKi8KKyNkZWZpbmUgRVhDX1RBQkxFX0ZBU1RfVVNFUgkweDEwMAkvKiBGYXN0IHVzZXIgZXhjZXB0aW9uIGhhbmRsZXIgKi8KKyNkZWZpbmUgRVhDX1RBQkxFX0ZBU1RfS0VSTkVMCTB4MjAwCS8qIEZhc3Qga2VybmVsIGV4Y2VwdGlvbiBoYW5kbGVyICovCisjZGVmaW5lIEVYQ19UQUJMRV9ERUZBVUxUCTB4MzAwCS8qIERlZmF1bHQgQy1IYW5kbGVyICovCisjZGVmaW5lIEVYQ19UQUJMRV9TSVpFCQkweDQwMAorCisvKiBSZWdpc3RlcnMgdXNlZCBieSBzdHJhY2UgKi8KKworI2RlZmluZSBSRUdfQV9CQVNFCTB4MDAwMAorI2RlZmluZSBSRUdfQVJfQkFTRQkweDAxMDAKKyNkZWZpbmUgUkVHX1BDCQkweDAwMjAKKyNkZWZpbmUgUkVHX1BTCQkweDAyZTYKKyNkZWZpbmUgUkVHX1dCCQkweDAyNDgKKyNkZWZpbmUgUkVHX1dTCQkweDAyNDkKKyNkZWZpbmUgUkVHX0xCRUcJMHgwMjAwCisjZGVmaW5lIFJFR19MRU5ECTB4MDIwMQorI2RlZmluZSBSRUdfTENPVU5UCTB4MDIwMgorI2RlZmluZSBSRUdfU0FSCQkweDAyMDMKKworI2RlZmluZSBTWVNDQUxMX05SCTB4MDBmZgorCisvKiBPdGhlciBQVFJBQ0VfIHZhbHVlcyBkZWZpbmVkIGluIDxsaW51eC9wdHJhY2UuaD4gdXNpbmcgdmFsdWVzIDAtOSwxNiwxNywyNCAqLworCisjZGVmaW5lIFBUUkFDRV9HRVRSRUdTCQkxMgorI2RlZmluZSBQVFJBQ0VfU0VUUkVHUwkJMTMKKyNkZWZpbmUgUFRSQUNFX0dFVFhUUkVHUwkxOAorI2RlZmluZSBQVFJBQ0VfU0VUWFRSRUdTCTE5CisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKy8qCisgKiBUaGlzIHN0cnVjdCBkZWZpbmVzIHRoZSB3YXkgdGhlIHJlZ2lzdGVycyBhcmUgc3RvcmVkIG9uIHRoZQorICoga2VybmVsIHN0YWNrIGR1cmluZyBhIHN5c3RlbSBjYWxsIG9yIG90aGVyIGtlcm5lbCBlbnRyeS4KKyAqLworc3RydWN0IHB0X3JlZ3MgeworCXVuc2lnbmVkIGxvbmcgcGM7CQkvKiAgIDQgKi8KKwl1bnNpZ25lZCBsb25nIHBzOwkJLyogICA4ICovCisJdW5zaWduZWQgbG9uZyBkZXBjOwkJLyogIDEyICovCisJdW5zaWduZWQgbG9uZyBleGNjYXVzZTsJCS8qICAxNiAqLworCXVuc2lnbmVkIGxvbmcgZXhjdmFkZHI7CQkvKiAgMjAgKi8KKwl1bnNpZ25lZCBsb25nIGRlYnVnY2F1c2U7CS8qICAyNCAqLworCXVuc2lnbmVkIGxvbmcgd21hc2s7CQkvKiAgMjggKi8KKwl1bnNpZ25lZCBsb25nIGxiZWc7CQkvKiAgMzIgKi8KKwl1bnNpZ25lZCBsb25nIGxlbmQ7CQkvKiAgMzYgKi8KKwl1bnNpZ25lZCBsb25nIGxjb3VudDsJCS8qICA0MCAqLworCXVuc2lnbmVkIGxvbmcgc2FyOwkJLyogIDQ0ICovCisJdW5zaWduZWQgbG9uZyB3aW5kb3diYXNlOwkvKiAgNDggKi8KKwl1bnNpZ25lZCBsb25nIHdpbmRvd3N0YXJ0OwkvKiAgNTIgKi8KKwl1bnNpZ25lZCBsb25nIHN5c2NhbGw7CQkvKiAgNTYgKi8KKwl1bnNpZ25lZCBsb25nIGljb3VudGxldmVsOwkvKiAgNjAgKi8KKwlpbnQgcmVzZXJ2ZWRbMV07CQkvKiAgNjQgKi8KKworCS8qIEFkZGl0aW9uYWwgY29uZmlndXJhYmxlIHJlZ2lzdGVycyB0aGF0IGFyZSB1c2VkIGJ5IHRoZSBjb21waWxlci4gKi8KKwl4dHJlZ3Nfb3B0X3QgeHRyZWdzX29wdDsKKworCS8qIE1ha2Ugc3VyZSB0aGUgYXJlZyBmaWVsZCBpcyAxNiBieXRlcyBhbGlnbmVkLiAqLworCWludCBhbGlnblswXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgxNikpKTsKKworCS8qIGN1cnJlbnQgcmVnaXN0ZXIgZnJhbWUuCisJICogTm90ZTogVGhlIEVTRiBmb3Iga2VybmVsIGV4Y2VwdGlvbnMgZW5kcyBhZnRlciAxNiByZWdpc3RlcnMhCisJICovCisJdW5zaWduZWQgbG9uZyBhcmVnWzE2XTsJCS8qIDEyOCAoNjQpICovCit9OworCisjaW5jbHVkZSA8dmFyaWFudC9jb3JlLmg+CisKKyMgZGVmaW5lIHRhc2tfcHRfcmVncyh0c2spICgoc3RydWN0IHB0X3JlZ3MqKSBcCisgICh0YXNrX3N0YWNrX3BhZ2UodHNrKSArIEtFUk5FTF9TVEFDS19TSVpFIC0gKFhDSEFMX05VTV9BUkVHUy0xNikqNCkgLSAxKQorIyBkZWZpbmUgdXNlcl9tb2RlKHJlZ3MpICgoKHJlZ3MpLT5wcyAmIDB4MDAwMDAwMjApIT0wKQorIyBkZWZpbmUgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKSAoKHJlZ3MpLT5wYykKK2V4dGVybiB2b2lkIHNob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqKTsKKworIyBpZm5kZWYgQ09ORklHX1NNUAorIyAgZGVmaW5lIHByb2ZpbGVfcGMocmVncykgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKQorIyBlbmRpZgorCisjZWxzZQkvKiBfX0FTU0VNQkxZX18gKi8KKworIyBpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KKyNkZWZpbmUgUFRfUkVHU19PRkZTRVQJICAoS0VSTkVMX1NUQUNLX1NJWkUgLSBQVF9VU0VSX1NJWkUpCisKKyNlbmRpZgkvKiAhX19BU1NFTUJMWV9fICovCisKKyNlbmRpZiAgLyogX19LRVJORUxfXyAqLworCisjZW5kaWYJLyogX1hURU5TQV9QVFJBQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3JlZ3MuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3JlZ3MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3JlZ3MuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcmVncy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvcmVzb3VyY2UuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3Jlc291cmNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9yZXNvdXJjZS5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9yZXNvdXJjZS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2Evcm1hcC5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcm1hcC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2Evcm1hcC5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9ybWFwLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9yd3NlbS5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcndzZW0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3J3c2VtLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3J3c2VtLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9zY2F0dGVybGlzdC5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc2NhdHRlcmxpc3QuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3NjYXR0ZXJsaXN0LmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3NjYXR0ZXJsaXN0LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9zZWN0aW9ucy5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc2VjdGlvbnMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3NlY3Rpb25zLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3NlY3Rpb25zLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9zZWdtZW50LmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zZWdtZW50LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9zZWdtZW50LmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3NlZ21lbnQuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3NlbWJ1Zi5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc2VtYnVmLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9zZW1idWYuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc2VtYnVmLmgKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3NlcmlhbC5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc2VyaWFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThhMjQ5MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3NlcmlhbC5oCkBAIC0wLDAgKzEsMTggQEAKKy8qCisgKiBpbmNsdWRlL2FzbS14dGVuc2Evc2VyaWFsLmgKKyAqCisgKiBDb25maWd1cmF0aW9uIGRldGFpbHMgZm9yIDgyNTAsIDE2NDUwLCAxNjU1MCwgZXRjLiBzZXJpYWwgcG9ydHMKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCisgKi8KKworI2lmbmRlZiBfWFRFTlNBX1NFUklBTF9ICisjZGVmaW5lIF9YVEVOU0FfU0VSSUFMX0gKKworI2luY2x1ZGUgPHBsYXRmb3JtL3NlcmlhbC5oPgorCisjZW5kaWYJLyogX1hURU5TQV9TRVJJQUxfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3NldHVwLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zZXR1cC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2Evc2V0dXAuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc2V0dXAuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3NobWJ1Zi5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc2htYnVmLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9zaG1idWYuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc2htYnVmLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9zaG1wYXJhbS5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc2htcGFyYW0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3NobXBhcmFtLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3NobXBhcmFtLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9zaWdjb250ZXh0LmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zaWdjb250ZXh0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9zaWdjb250ZXh0LmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3NpZ2NvbnRleHQuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3NpZ2luZm8uaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3NpZ2luZm8uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3NpZ2luZm8uaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc2lnaW5mby5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2Evc2lnbmFsLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zaWduYWwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3NpZ25hbC5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zaWduYWwuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3NtcC5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc21wLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9zbXAuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc21wLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9zb2NrZXQuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3NvY2tldC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2Evc29ja2V0LmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3NvY2tldC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2Evc29ja2lvcy5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc29ja2lvcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2Evc29ja2lvcy5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zb2NraW9zLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9zcGlubG9jay5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc3BpbmxvY2suaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3NwaW5sb2NrLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3NwaW5sb2NrLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9zdGF0LmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zdGF0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9zdGF0LmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3N0YXQuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3N0YXRmcy5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc3RhdGZzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9zdGF0ZnMuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc3RhdGZzLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9zdHJpbmcuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3N0cmluZy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2Evc3RyaW5nLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3N0cmluZy5oCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zd2FiLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zd2FiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUwYjY5NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3N3YWIuaApAQCAtMCwwICsxLDcwIEBACisvKgorICogaW5jbHVkZS9hc20teHRlbnNhL3N3YWIuaAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfU1dBQl9ICisjZGVmaW5lIF9YVEVOU0FfU1dBQl9ICisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorCisjZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KKworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyIF9fYXJjaF9zd2FiMzIoX191MzIgeCkKK3sKKyAgICBfX3UzMiByZXM7CisgICAgLyogaW5zdHJ1Y3Rpb24gc2VxdWVuY2UgZnJvbSBYdGVuc2EgSVNBIHJlbGVhc2UgMi8yMDAwICovCisgICAgX19hc21fXygic3NhaSAgICAgOCAgICAgICAgICAgXG5cdCIKKwkgICAgInNybGkgICAgICUwLCAlMSwgMTYgIFxuXHQiCisJICAgICJzcmMgICAgICAlMCwgJTAsICUxICBcblx0IgorCSAgICAic3JjICAgICAgJTAsICUwLCAlMCAgXG5cdCIKKwkgICAgInNyYyAgICAgICUwLCAlMSwgJTAgIFxuIgorCSAgICA6ICI9JmEiIChyZXMpCisJICAgIDogImEiICh4KQorCSAgICApOworICAgIHJldHVybiByZXM7Cit9CisjZGVmaW5lIF9fYXJjaF9zd2FiMzIgX19hcmNoX3N3YWIzMgorCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MTYgX19hcmNoX3N3YWIxNihfX3UxNiB4KQoreworICAgIC8qIEdpdmVuIHRoYXQgJ3Nob3J0JyB2YWx1ZXMgYXJlIHNpZ25lZCAoaS5lLiwgY2FuIGJlIG5lZ2F0aXZlKSwKKyAgICAgKiB3ZSBjYW5ub3QgYXNzdW1lIHRoYXQgdGhlIHVwcGVyIDE2LWJpdHMgb2YgdGhlIHJlZ2lzdGVyIGFyZQorICAgICAqIHplcm8uICBXZSBhcmUgY2FyZWZ1bCB0byBtYXNrIHZhbHVlcyBhZnRlciBzaGlmdGluZy4KKyAgICAgKi8KKworICAgIC8qIFRoZXJlIGV4aXN0cyBhbiBhbm9tYWx5IGJldHdlZW4geHQtZ2NjIGFuZCB4dC14Y2MuICB4dC1nY2MKKyAgICAgKiBpbnNlcnRzIGFuIGV4dHVpIGluc3RydWN0aW9uIGFmdGVyIHB1dHRpbmcgdGhpcyBmdW5jdGlvbiBpbmxpbmUKKyAgICAgKiB0byBlbnN1cmUgdGhhdCBpdCB1c2VzIG9ubHkgdGhlIGxlYXN0LXNpZ25pZmljYW50IDE2IGJpdHMgb2YKKyAgICAgKiB0aGUgcmVzdWx0LiAgeHQteGNjIGRvZXNuJ3QgdXNlIGFuIGV4dHVpLCBidXQgYXNzdW1lcyB0aGUKKyAgICAgKiBfX2FzbV9fIG1hY3JvIGZvbGxvd3MgY29udmVudGlvbiB0aGF0IHRoZSB1cHBlciAxNiBiaXRzIG9mIGFuCisgICAgICogJ3Vuc2lnbmVkIHNob3J0JyByZXN1bHQgYXJlIHN0aWxsIHplcm8uICBUaGlzIG1hY3JvIGRvZXNuJ3QKKyAgICAgKiBmb2xsb3cgY29udmVudGlvbjsgaW5kZWVkLCBpdCBsZWF2ZXMgZ2FyYmFnZSBpbiB0aGUgdXBwb3J0IDE2CisgICAgICogYml0cyBvZiB0aGUgcmVnaXN0ZXIuCisKKyAgICAgKiBEZWNsYXJpbmcgdGhlIHRlbXBvcmFyeSB2YXJpYWJsZXMgJ3JlcycgYW5kICd0bXAnIHRvIGJlIDMyLWJpdAorICAgICAqIHR5cGVzIHdoaWxlIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgZnVuY3Rpb24gaXMgYSAxNi1iaXQgdHlwZQorICAgICAqIGZvcmNlcyBib3RoIGNvbXBpbGVycyB0byBpbnNlcnQgZXhhY3RseSBvbmUgZXh0dWkgaW5zdHJ1Y3Rpb24KKyAgICAgKiAob3IgZXF1aXZhbGVudCkgdG8gbWFzayBvZmYgdGhlIHVwcGVyIDE2IGJpdHMuICovCisKKyAgICBfX3UzMiByZXM7CisgICAgX191MzIgdG1wOworCisgICAgX19hc21fXygiZXh0dWkgICAgJTEsICUyLCA4LCA4XG5cdCIKKwkgICAgInNsbGkgICAgICUwLCAlMiwgOCAgIFxuXHQiCisJICAgICJvciAgICAgICAlMCwgJTAsICUxICBcbiIKKwkgICAgOiAiPSZhIiAocmVzKSwgIj0mYSIgKHRtcCkKKwkgICAgOiAiYSIgKHgpCisJICAgICk7CisKKyAgICByZXR1cm4gcmVzOworfQorI2RlZmluZSBfX2FyY2hfc3dhYjE2IF9fYXJjaF9zd2FiMTYKKworI2VuZGlmIC8qIF9YVEVOU0FfU1dBQl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2Evc3lzY2FsbC5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc3lzY2FsbC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2Evc3lzY2FsbC5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zeXNjYWxsLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9zeXN0ZW0uaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3N5c3RlbS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2Evc3lzdGVtLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3N5c3RlbS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvdGVybWJpdHMuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3Rlcm1iaXRzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS90ZXJtYml0cy5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS90ZXJtYml0cy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvdGVybWlvcy5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vdGVybWlvcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvdGVybWlvcy5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS90ZXJtaW9zLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS90aHJlYWRfaW5mby5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3RocmVhZF9pbmZvLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS90aW1leC5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vdGltZXguaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3RpbWV4LmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3RpbWV4LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS90bGIuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3RsYi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvdGxiLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3RsYi5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvdGxiZmx1c2guaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3RsYmZsdXNoLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS90bGJmbHVzaC5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS90bGJmbHVzaC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvdG9wb2xvZ3kuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS90b3BvbG9neS5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS90b3BvbG9neS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvdHlwZXMuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3R5cGVzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS90eXBlcy5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS90eXBlcy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvdWFjY2Vzcy5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvdWFjY2Vzcy5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS91YWNjZXNzLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS91Y29udGV4dC5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vdWNvbnRleHQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3Vjb250ZXh0LmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3Vjb250ZXh0LmgKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3VuYWxpZ25lZC5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vdW5hbGlnbmVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU3ZWQwNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3VuYWxpZ25lZC5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBYdGVuc2EgZG9lc24ndCBoYW5kbGUgdW5hbGlnbmVkIGFjY2Vzc2VzIGVmZmljaWVudGx5LgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworI2lmbmRlZiBfQVNNX1hURU5TQV9VTkFMSUdORURfSAorI2RlZmluZSBfQVNNX1hURU5TQV9VTkFMSUdORURfSAorCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjaWZkZWYgX19MSVRUTEVfRU5ESUFOCisjIGluY2x1ZGUgPGxpbnV4L3VuYWxpZ25lZC9sZV9zdHJ1Y3QuaD4KKyMgaW5jbHVkZSA8bGludXgvdW5hbGlnbmVkL2JlX2J5dGVzaGlmdC5oPgorIyBpbmNsdWRlIDxsaW51eC91bmFsaWduZWQvZ2VuZXJpYy5oPgorIyBkZWZpbmUgZ2V0X3VuYWxpZ25lZAlfX2dldF91bmFsaWduZWRfbGUKKyMgZGVmaW5lIHB1dF91bmFsaWduZWQJX19wdXRfdW5hbGlnbmVkX2xlCisjZWxzZQorIyBpbmNsdWRlIDxsaW51eC91bmFsaWduZWQvYmVfc3RydWN0Lmg+CisjIGluY2x1ZGUgPGxpbnV4L3VuYWxpZ25lZC9sZV9ieXRlc2hpZnQuaD4KKyMgaW5jbHVkZSA8bGludXgvdW5hbGlnbmVkL2dlbmVyaWMuaD4KKyMgZGVmaW5lIGdldF91bmFsaWduZWQJX19nZXRfdW5hbGlnbmVkX2JlCisjIGRlZmluZSBwdXRfdW5hbGlnbmVkCV9fcHV0X3VuYWxpZ25lZF9iZQorI2VuZGlmCisKKyNlbmRpZgkvKiBfQVNNX1hURU5TQV9VTkFMSUdORURfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3VuaXN0ZC5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vdW5pc3RkLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS91bmlzdGQuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vdW5pc3RkLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS91c2VyLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS91c2VyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS91c2VyLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3VzZXIuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3ZnYS5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vdmdhLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS92Z2EuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vdmdhLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS94b3IuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3hvci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EveG9yLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3hvci5oCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvZW50cnkuUyBiL2FyY2gveHRlbnNhL2tlcm5lbC9lbnRyeS5TCmluZGV4IGRmZDM1ZGMuLmE1MWQzNmEgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC9lbnRyeS5TCkBAIC0yNSw3ICsyNSw3IEBACiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vc2lnbmFsLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+Ci0jaW5jbHVkZSA8YXNtL3ZhcmlhbnQvdGllLWFzbS5oPgorI2luY2x1ZGUgPHZhcmlhbnQvdGllLWFzbS5oPgogCiAvKiBVbmltcGxlbWVudGVkIGZlYXR1cmVzLiAqLwogCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gveHRlbnNhL2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IDUxZjRmYjYuLmQ1MDY3NzQgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC0xNiw3ICsxNiw3IEBACiAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oPgogCi0jaW5jbHVkZSA8YXNtL3ZhcmlhbnQvY29yZS5oPgorI2luY2x1ZGUgPHZhcmlhbnQvY29yZS5oPgogT1VUUFVUX0FSQ0goeHRlbnNhKQogRU5UUlkoX3N0YXJ0KQogCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9saWIvY2hlY2tzdW0uUyBiL2FyY2gveHRlbnNhL2xpYi9jaGVja3N1bS5TCmluZGV4IDlkOWNkOTkuLmRmMzk3ZjkgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2xpYi9jaGVja3N1bS5TCisrKyBiL2FyY2gveHRlbnNhL2xpYi9jaGVja3N1bS5TCkBAIC0xNiw3ICsxNiw3IEBACiAKICNpbmNsdWRlIDxhc20vZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL3ZhcmlhbnQvY29yZS5oPgorI2luY2x1ZGUgPHZhcmlhbnQvY29yZS5oPgogCiAvKgogICogY29tcHV0ZXMgYSBwYXJ0aWFsIGNoZWNrc3VtLCBlLmcuIGZvciBUQ1AvVURQIGZyYWdtZW50cwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvbGliL21lbWNvcHkuUyBiL2FyY2gveHRlbnNhL2xpYi9tZW1jb3B5LlMKaW5kZXggZGRkYThmNC4uZWE1OWRjZCAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvbGliL21lbWNvcHkuUworKysgYi9hcmNoL3h0ZW5zYS9saWIvbWVtY29weS5TCkBAIC05LDcgKzksNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDAyIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgogICovCiAKLSNpbmNsdWRlIDxhc20vdmFyaWFudC9jb3JlLmg+CisjaW5jbHVkZSA8dmFyaWFudC9jb3JlLmg+CiAKIAkubWFjcm8Jc3JjX2IJciwgdzAsIHcxCiAjaWZkZWYgX19YVEVOU0FfRUJfXwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvbGliL21lbXNldC5TIGIvYXJjaC94dGVuc2EvbGliL21lbXNldC5TCmluZGV4IDU2YTE3NDkuLjEwYjhjNDAgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2xpYi9tZW1zZXQuUworKysgYi9hcmNoL3h0ZW5zYS9saWIvbWVtc2V0LlMKQEAgLTExLDcgKzExLDcgQEAKICAqICBDb3B5cmlnaHQgKEMpIDIwMDIgVGVuc2lsaWNhIEluYy4KICAqLwogCi0jaW5jbHVkZSA8YXNtL3ZhcmlhbnQvY29yZS5oPgorI2luY2x1ZGUgPHZhcmlhbnQvY29yZS5oPgogCiAvKgogICogdm9pZCAqbWVtc2V0KHZvaWQgKmRzdCwgaW50IGMsIHNpemVfdCBsZW5ndGgpCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9saWIvc3RybmNweV91c2VyLlMgYi9hcmNoL3h0ZW5zYS9saWIvc3RybmNweV91c2VyLlMKaW5kZXggYjI2NTVkOS4uOWY2MDNjZCAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvbGliL3N0cm5jcHlfdXNlci5TCisrKyBiL2FyY2gveHRlbnNhL2xpYi9zdHJuY3B5X3VzZXIuUwpAQCAtMTEsNyArMTEsNyBAQAogICogIENvcHlyaWdodCAoQykgMjAwMiBUZW5zaWxpY2EgSW5jLgogICovCiAKLSNpbmNsdWRlIDxhc20vdmFyaWFudC9jb3JlLmg+CisjaW5jbHVkZSA8dmFyaWFudC9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KIAogLyogTG9hZCBvciBzdG9yZSBpbnN0cnVjdGlvbnMgdGhhdCBtYXkgY2F1c2UgZXhjZXB0aW9ucyB1c2UgdGhlIEVYIG1hY3JvLiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvbGliL3N0cm5sZW5fdXNlci5TIGIvYXJjaC94dGVuc2EvbGliL3N0cm5sZW5fdXNlci5TCmluZGV4IGFkM2Y2MTYuLjIzZjJhODkgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2xpYi9zdHJubGVuX3VzZXIuUworKysgYi9hcmNoL3h0ZW5zYS9saWIvc3Rybmxlbl91c2VyLlMKQEAgLTExLDcgKzExLDcgQEAKICAqICBDb3B5cmlnaHQgKEMpIDIwMDIgVGVuc2lsaWNhIEluYy4KICAqLwogCi0jaW5jbHVkZSA8YXNtL3ZhcmlhbnQvY29yZS5oPgorI2luY2x1ZGUgPHZhcmlhbnQvY29yZS5oPgogCiAvKiBMb2FkIG9yIHN0b3JlIGluc3RydWN0aW9ucyB0aGF0IG1heSBjYXVzZSBleGNlcHRpb25zIHVzZSB0aGUgRVggbWFjcm8uICovCiAKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2xpYi91c2VyY29weS5TIGIvYXJjaC94dGVuc2EvbGliL3VzZXJjb3B5LlMKaW5kZXggYThhYjFkNC4uNDZkNjAzMSAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvbGliL3VzZXJjb3B5LlMKKysrIGIvYXJjaC94dGVuc2EvbGliL3VzZXJjb3B5LlMKQEAgLTUzLDcgKzUzLDcgQEAKICAqCWExMS8gb3JpZ2luYWwgbGVuZ3RoCiAgKi8KIAotI2luY2x1ZGUgPGFzbS92YXJpYW50L2NvcmUuaD4KKyNpbmNsdWRlIDx2YXJpYW50L2NvcmUuaD4KIAogI2lmZGVmIF9fWFRFTlNBX0VCX18KICNkZWZpbmUgQUxJR04oUiwgVzAsIFcxKSBzcmMJUiwgVzAsIFcxCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMvaXNzL2NvbnNvbGUuYyBiL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy9pc3MvY29uc29sZS5jCmluZGV4IDkxNDFlMzYuLmVmZWQ4ODkgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy9pc3MvY29uc29sZS5jCisrKyBiL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy9pc3MvY29uc29sZS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIGFyY2gveHRlbnNhL3BsYXRmb3JtLWlzcy9jb25zb2xlLmMKKyAqIGFyY2gveHRlbnNhL3BsYXRmb3Jtcy9pc3MvY29uc29sZS5jCiAgKgogICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KIAotI2luY2x1ZGUgPGFzbS9wbGF0Zm9ybS9zaW1jYWxsLmg+CisjaW5jbHVkZSA8cGxhdGZvcm0vc2ltY2FsbC5oPgogCiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wbGF0Zm9ybS1pc3MvaGFyZHdhcmUuaCBiL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy9pc3MvaW5jbHVkZS9wbGF0Zm9ybS9oYXJkd2FyZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvcGxhdGZvcm0taXNzL2hhcmR3YXJlLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL3BsYXRmb3Jtcy9pc3MvaW5jbHVkZS9wbGF0Zm9ybS9oYXJkd2FyZS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvcGxhdGZvcm0taXNzL3NpbWNhbGwuaCBiL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy9pc3MvaW5jbHVkZS9wbGF0Zm9ybS9zaW1jYWxsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9wbGF0Zm9ybS1pc3Mvc2ltY2FsbC5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9wbGF0Zm9ybXMvaXNzL2luY2x1ZGUvcGxhdGZvcm0vc2ltY2FsbC5oCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMvaXNzL2lvLmMgYi9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMvaXNzL2lvLmMKaW5kZXggNWIxNjFhNS4uNTcxZDBiMiAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvcGxhdGZvcm1zL2lzcy9pby5jCisrKyBiL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy9pc3MvaW8uYwpAQCAtMyw3ICszLDcgQEAKICNpZiAwCiAKICNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDx4dGVuc2Evc2ltY2FsbC5oPgorI2luY2x1ZGUgPHBsYXRmb3JtL3BsYXRmb3JtLWlzcy9zaW1jYWxsLmg+CiAKIGV4dGVybiBpbnQgX19zaW1jICgpOwogCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMvaXNzL25ldHdvcmsuYyBiL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy9pc3MvbmV0d29yay5jCmluZGV4IDY0ZjA1N2QuLmVkYWQ0MTUgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy9pc3MvbmV0d29yay5jCisrKyBiL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy9pc3MvbmV0d29yay5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqCi0gKiBhcmNoL3h0ZW5zYS9wbGF0Zm9ybS1pc3MvbmV0d29yay5jCisgKiBhcmNoL3h0ZW5zYS9wbGF0Zm9ybXMvaXNzL25ldHdvcmsuYwogICoKICAqIFBsYXRmb3JtIHNwZWNpZmljIGluaXRpYWxpemF0aW9uLgogICoKQEAgLTMzLDcgKzMzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAotI2luY2x1ZGUgPGFzbS9wbGF0Zm9ybS9zaW1jYWxsLmg+CisjaW5jbHVkZSA8cGxhdGZvcm0vc2ltY2FsbC5oPgogCiAjZGVmaW5lIERSSVZFUl9OQU1FICJpc3MtbmV0ZGV2IgogI2RlZmluZSBFVEhfTUFYX1BBQ0tFVCAxNTAwCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMveHQyMDAwL01ha2VmaWxlIGIvYXJjaC94dGVuc2EvcGxhdGZvcm1zL3h0MjAwMC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGQwMThlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2EvcGxhdGZvcm1zL3h0MjAwMC9NYWtlZmlsZQpAQCAtMCwwICsxLDUgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBUZW5zaWxpY2EgWFQyMDAwIEVtdWxhdGlvbiBCb2FyZAorIworCitvYmoteSAJCQk9IHNldHVwLm8KZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy94dDIwMDAvaW5jbHVkZS9wbGF0Zm9ybS9oYXJkd2FyZS5oIGIvYXJjaC94dGVuc2EvcGxhdGZvcm1zL3h0MjAwMC9pbmNsdWRlL3BsYXRmb3JtL2hhcmR3YXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE0NTlhZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy94dDIwMDAvaW5jbHVkZS9wbGF0Zm9ybS9oYXJkd2FyZS5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBwbGF0Zm9ybS9oYXJkd2FyZS5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIFRlbnNpbGljYSBJbmMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaGFyZHdhcmUgY29uZmlndXJhdGlvbiBvZiB0aGUgWFQyMDAwIGJvYXJkLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9YVDIwMDBfSEFSRFdBUkVfSAorI2RlZmluZSBfWFRFTlNBX1hUMjAwMF9IQVJEV0FSRV9ICisKKyNpbmNsdWRlIDx2YXJpYW50L2NvcmUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworLyogCisgKiBNZW1vcnkgY29uZmlndXJhdGlvbi4KKyAqLworCisjZGVmaW5lIFBMQVRGT1JNX0RFRkFVTFRfTUVNX1NUQVJUIDB4MDAwMDAwMDAKKyNkZWZpbmUgUExBVEZPUk1fREVGQVVMVF9NRU1fU0laRSAweDA4MDAwMDAwCisKKy8qCisgKiBOdW1iZXIgb2YgcGxhdGZvcm0gSVJRcworICovCisjZGVmaW5lIFBMQVRGT1JNX05SX0lSUVMgMworLyoKKyAqIE9uLWJvYXJkIGNvbXBvbmVudHMuCisgKi8KKworI2RlZmluZSBTT05JQzgzOTM0X0lOVE5VTQlYQ0hBTF9FWFRJTlQzX05VTQorI2RlZmluZSBTT05JQzgzOTM0X0FERFIJCUlPQUREUigweDBkMDMwMDAwKQorCisvKgorICogVjMtUENJCisgKi8KKworLyogVGhlIFhUMjAwMCB1c2VzIHRoZSBWMyBhcyBhIGNhc2NhZGVkIGludGVycnVwdCBjb250cm9sbGVyIGZvciB0aGUgUENJIGJ1cyAqLworCisjZGVmaW5lIElSUV9QQ0lfQQkJKFhDSEFMX05VTV9JTlRFUlJVUFRTICsgMCkKKyNkZWZpbmUgSVJRX1BDSV9CCQkoWENIQUxfTlVNX0lOVEVSUlVQVFMgKyAxKQorI2RlZmluZSBJUlFfUENJX0MJCShYQ0hBTF9OVU1fSU5URVJSVVBUUyArIDIpCisKKy8qCisgKiBWYXJpb3VzIG90aGVyIGNvbXBvbmVudHMuCisgKi8KKworI2RlZmluZSBYVDIwMDBfTEVEX0FERFIJCUlPQUREUigweDBkMDQwMDAwKQorCisjZW5kaWYgLyogX1hURU5TQV9YVDIwMDBfSEFSRFdBUkVfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvcGxhdGZvcm1zL3h0MjAwMC9pbmNsdWRlL3BsYXRmb3JtL3NlcmlhbC5oIGIvYXJjaC94dGVuc2EvcGxhdGZvcm1zL3h0MjAwMC9pbmNsdWRlL3BsYXRmb3JtL3NlcmlhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMjZjZjcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMveHQyMDAwL2luY2x1ZGUvcGxhdGZvcm0vc2VyaWFsLmgKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIHBsYXRmb3JtL3NlcmlhbC5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIFRlbnNpbGljYSBJbmMuCisgKi8KKworI2lmbmRlZiBfWFRFTlNBX1hUMjAwMF9TRVJJQUxfSAorI2RlZmluZSBfWFRFTlNBX1hUMjAwMF9TRVJJQUxfSAorCisjaW5jbHVkZSA8dmFyaWFudC9jb3JlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKy8qICBOYXRpb25hbC1TZW1pIFBDMTY1NTJEIERVQVJUOiAgKi8KKworI2RlZmluZSBEVUFSVDE2NTUyXzFfSU5UTlVNCVhDSEFMX0VYVElOVDRfTlVNCisjZGVmaW5lIERVQVJUMTY1NTJfMl9JTlROVU0JWENIQUxfRVhUSU5UNV9OVU0KKworI2RlZmluZSBEVUFSVDE2NTUyXzFfQUREUglJT0FERFIoMHgwZDA1MDAyMCkJLyogY2hhbm5lbCAxICovCisjZGVmaW5lIERVQVJUMTY1NTJfMl9BRERSCUlPQUREUigweDBkMDUwMDAwKQkvKiBjaGFubmVsIDIgKi8KKworI2RlZmluZSBEVUFSVDE2NTUyX1hUQUxfRlJFUQkxODQzMjAwMAkvKiBjcnlzdGFsIGZyZXF1ZW5jeSBpbiBIeiAqLworI2RlZmluZSBCQVNFX0JBVUQgKCBEVUFSVDE2NTUyX1hUQUxfRlJFUSAvIDE2ICkKKworI2VuZGlmIC8qIF9YVEVOU0FfWFQyMDAwX1NFUklBTF9IICovCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMveHQyMDAwL3NldHVwLmMgYi9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMveHQyMDAwL3NldHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU4Mzk0MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy94dDIwMDAvc2V0dXAuYwpAQCAtMCwwICsxLDE4MSBAQAorLyoKKyAqIGFyY2gveHRlbnNhL3BsYXRmb3Jtcy94dDIwMDAvc2V0dXAuYworICoKKyAqIFBsYXRmb3JtIHNwZWNpZmljIGZ1bmN0aW9ucyBmb3IgdGhlIFhUMjAwMCBib2FyZC4KKyAqCisgKiBBdXRob3JzOglDaHJpcyBaYW5rZWwgPGNocmlzQHphbmtlbC5uZXQ+CisgKgkJSm9lIFRheWxvciA8am9lQHRlbnNpbGljYS5jb20+CisgKgorICogQ29weXJpZ2h0IDIwMDEgLSAyMDA0IFRlbnNpbGljYSBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxhc20vYm9vdHBhcmFtLmg+CisjaW5jbHVkZSA8cGxhdGZvcm0vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxwbGF0Zm9ybS9zZXJpYWwuaD4KKworLyogQXNzdW1lcyBzIHBvaW50cyB0byBhbiA4LWNociBzdHJpbmcuICBObyBjaGVja2luZyBmb3IgTlVMTC4gKi8KKworc3RhdGljIHZvaWQgbGVkX3ByaW50IChpbnQgZiwgY2hhciAqcykKK3sKKwl1bnNpZ25lZCBsb25nKiBsZWRfYWRkciA9ICh1bnNpZ25lZCBsb25nKikgKFhUMjAwMF9MRURfQUREUiArIDB4RTApICsgZjsKKwlpbnQgaTsKKwlmb3IgKGkgPSBmOyBpIDwgODsgaSsrKQorCQlpZiAoKCpsZWRfYWRkcisrID0gKnMrKykgPT0gMCkKKwkJICAgIGJyZWFrOworfQorCit2b2lkIHBsYXRmb3JtX2hhbHQodm9pZCkKK3sKKwlsZWRfcHJpbnQgKDAsICIgIEhBTFQgICIpOworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJd2hpbGUgKDEpOworfQorCit2b2lkIHBsYXRmb3JtX3Bvd2VyX29mZih2b2lkKQoreworCWxlZF9wcmludCAoMCwgIlBPV0VST0ZGIik7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwl3aGlsZSAoMSk7Cit9CisKK3ZvaWQgcGxhdGZvcm1fcmVzdGFydCh2b2lkKQoreworCS8qIEZsdXNoIGFuZCByZXNldCB0aGUgbW11LCBzaW11bGF0ZSBhIHByb2Nlc3NvciByZXNldCwgYW5kCisJICoganVtcCB0byB0aGUgcmVzZXQgdmVjdG9yLiAqLworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZpCWEyLCAxNVxuXHQiCisJCQkgICAgICAid3NyCWEyLCAiIF9fc3RyaW5naWZ5KElDT1VOVExFVkVMKSAiXG5cdCIKKwkJCSAgICAgICJtb3ZpCWEyLCAwXG5cdCIKKwkJCSAgICAgICJ3c3IJYTIsICIgX19zdHJpbmdpZnkoSUNPVU5UKSAiXG5cdCIKKwkJCSAgICAgICJ3c3IJYTIsICIgX19zdHJpbmdpZnkoSUJSRUFLRU5BQkxFKSAiXG5cdCIKKwkJCSAgICAgICJ3c3IJYTIsICIgX19zdHJpbmdpZnkoTENPVU5UKSAiXG5cdCIKKwkJCSAgICAgICJtb3ZpCWEyLCAweDFmXG5cdCIKKwkJCSAgICAgICJ3c3IJYTIsICIgX19zdHJpbmdpZnkoUFMpICJcblx0IgorCQkJICAgICAgImlzeW5jXG5cdCIKKwkJCSAgICAgICJqeAklMFxuXHQiCisJCQkgICAgICA6CisJCQkgICAgICA6ICJhIiAoWENIQUxfUkVTRVRfVkVDVE9SX1ZBRERSKQorCQkJICAgICAgOiAiYTIiCisJCQkgICAgICApOworCisJLyogY29udHJvbCBuZXZlciBnZXRzIGhlcmUgKi8KK30KKwordm9pZCBfX2luaXQgcGxhdGZvcm1fc2V0dXAoY2hhcioqIGNtZGxpbmUpCit7CisJbGVkX3ByaW50ICgwLCAiTElOVVggICAiKTsKK30KKworLyogZWFybHkgaW5pdGlhbGl6YXRpb24gKi8KKworZXh0ZXJuIHN5c21lbV9pbmZvX3QgX19pbml0ZGF0YSBzeXNtZW07CisKK3ZvaWQgcGxhdGZvcm1faW5pdChicF90YWdfdCogZmlyc3QpCit7CisJLyogU2V0IGRlZmF1bHQgbWVtb3J5IGJsb2NrIGlmIG5vdCBwcm92aWRlZCBieSB0aGUgYm9vdGxvYWRlci4gKi8KKworCWlmIChzeXNtZW0ubnJfYmFua3MgPT0gMCkgeworCQlzeXNtZW0ubnJfYmFua3MgPSAxOworCQlzeXNtZW0uYmFua1swXS5zdGFydCA9IFBMQVRGT1JNX0RFRkFVTFRfTUVNX1NUQVJUOworCQlzeXNtZW0uYmFua1swXS5lbmQgPSBQTEFURk9STV9ERUZBVUxUX01FTV9TVEFSVAorCQkJCSAgICAgKyBQTEFURk9STV9ERUZBVUxUX01FTV9TSVpFOworCX0KK30KKworLyogSGVhcnRiZWF0LiBMZXQgdGhlIExFRCBibGluay4gKi8KKwordm9pZCBwbGF0Zm9ybV9oZWFydGJlYXQodm9pZCkKK3sKKwlzdGF0aWMgaW50IGk9MCwgdCA9IDA7CisKKwlpZiAoLS10IDwgMCkKKwl7CisJCXQgPSA1OTsKKwkJbGVkX3ByaW50KDcsIGkgPyAiLiI6ICIgIik7CisJCWkgXj0gMTsKKwl9Cit9CisKKy8vI2RlZmluZSBSU19UQUJMRV9TSVpFIDIKKy8vI2RlZmluZSBTVERfQ09NX0ZMQUdTIChBU1lOQ19CT09UX0FVVE9DT05GfEFTWU5DX1NLSVBfVEVTVCkKKworI2RlZmluZSBfU0VSSUFMX1BPUlQoX2Jhc2UsX2lycSkJCQkJCVwKK3sJCQkJCQkJCQlcCisJLm1hcGJhc2UJPSAoX2Jhc2UpLAkJCQkJXAorCS5tZW1iYXNlCT0gKHZvaWQqKShfYmFzZSksCQkJCVwKKwkuaXJxCQk9IChfaXJxKSwJCQkJCVwKKwkudWFydGNsawk9IERVQVJUMTY1NTJfWFRBTF9GUkVRLAkJCQlcCisJLmlvdHlwZQkJPSBVUElPX01FTSwJCQkJCVwKKwkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCQkJCVwKKwkucmVnc2hpZnQJPSAyLAkJCQkJCVwKK30KKworc3RhdGljIHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCB4dDIwMDBfc2VyaWFsX2RhdGFbXSA9IHsKKyNpZiBYQ0hBTF9IQVZFX0JFCisJX1NFUklBTF9QT1JUKERVQVJUMTY1NTJfMV9BRERSICsgMywgRFVBUlQxNjU1Ml8xX0lOVE5VTSksCisJX1NFUklBTF9QT1JUKERVQVJUMTY1NTJfMl9BRERSICsgMywgRFVBUlQxNjU1Ml8yX0lOVE5VTSksCisjZWxzZQorCV9TRVJJQUxfUE9SVChEVUFSVDE2NTUyXzFfQUREUiwgRFVBUlQxNjU1Ml8xX0lOVE5VTSksCisJX1NFUklBTF9QT1JUKERVQVJUMTY1NTJfMl9BRERSLCBEVUFSVDE2NTUyXzJfSU5UTlVNKSwKKyNlbmRpZgorCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgeHQyMDAwX3NlcmlhbDgyNTBfZGV2aWNlID0geworCS5uYW1lCQk9ICJzZXJpYWw4MjUwIiwKKwkuaWQJCT0gUExBVDgyNTBfREVWX1BMQVRGT1JNLAorCS5kZXYJCT0geworCSAgICAucGxhdGZvcm1fZGF0YSA9IHh0MjAwMF9zZXJpYWxfZGF0YSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB4dDIwMDBfc29uaWNfcmVzW10gPSB7CisJeworCQkuc3RhcnQgPSBTT05JQzgzOTM0X0FERFIsCisJCS5lbmQgICA9IFNPTklDODM5MzRfQUREUiArIDB4ZmYsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkuc3RhcnQgPSBTT05JQzgzOTM0X0lOVE5VTSwKKwkJLmVuZCA9IFNPTklDODM5MzRfSU5UTlVNLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgeHQyMDAwX3NvbmljX2RldmljZSA9IHsKKwkubmFtZQkJPSAieHRzb25pYyIsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHh0MjAwMF9zb25pY19yZXMpLAorCS5yZXNvdXJjZQkJPSB4dDIwMDBfc29uaWNfcmVzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgeHQyMDAwX3NldHVwX2RldmluaXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnh0MjAwMF9zZXJpYWw4MjUwX2RldmljZSk7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZ4dDIwMDBfc29uaWNfZGV2aWNlKTsKKworCXJldHVybiAwOworfQorCitkZXZpY2VfaW5pdGNhbGwoeHQyMDAwX3NldHVwX2RldmluaXQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3ZhcmlhbnQtZGMyMzJiL2NvcmUuaCBiL2FyY2gveHRlbnNhL3ZhcmlhbnRzL2RjMjMyYi9pbmNsdWRlL3ZhcmlhbnQvY29yZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvdmFyaWFudC1kYzIzMmIvY29yZS5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS92YXJpYW50cy9kYzIzMmIvaW5jbHVkZS92YXJpYW50L2NvcmUuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3ZhcmlhbnQtZGMyMzJiL3RpZS1hc20uaCBiL2FyY2gveHRlbnNhL3ZhcmlhbnRzL2RjMjMyYi9pbmNsdWRlL3ZhcmlhbnQvdGllLWFzbS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvdmFyaWFudC1kYzIzMmIvdGllLWFzbS5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS92YXJpYW50cy9kYzIzMmIvaW5jbHVkZS92YXJpYW50L3RpZS1hc20uaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3ZhcmlhbnQtZGMyMzJiL3RpZS5oIGIvYXJjaC94dGVuc2EvdmFyaWFudHMvZGMyMzJiL2luY2x1ZGUvdmFyaWFudC90aWUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3ZhcmlhbnQtZGMyMzJiL3RpZS5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS92YXJpYW50cy9kYzIzMmIvaW5jbHVkZS92YXJpYW50L3RpZS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvdmFyaWFudC1mc2YvY29yZS5oIGIvYXJjaC94dGVuc2EvdmFyaWFudHMvZnNmL2luY2x1ZGUvdmFyaWFudC9jb3JlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS92YXJpYW50LWZzZi9jb3JlLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL3ZhcmlhbnRzL2ZzZi9pbmNsdWRlL3ZhcmlhbnQvY29yZS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvdmFyaWFudC1mc2YvdGllLWFzbS5oIGIvYXJjaC94dGVuc2EvdmFyaWFudHMvZnNmL2luY2x1ZGUvdmFyaWFudC90aWUtYXNtLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS92YXJpYW50LWZzZi90aWUtYXNtLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL3ZhcmlhbnRzL2ZzZi9pbmNsdWRlL3ZhcmlhbnQvdGllLWFzbS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvdmFyaWFudC1mc2YvdGllLmggYi9hcmNoL3h0ZW5zYS92YXJpYW50cy9mc2YvaW5jbHVkZS92YXJpYW50L3RpZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvdmFyaWFudC1mc2YvdGllLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL3ZhcmlhbnRzL2ZzZi9pbmNsdWRlL3ZhcmlhbnQvdGllLmgKZGlmZiAtLWdpdCBhL2Jsb2NrL0tjb25maWcgYi9ibG9jay9LY29uZmlnCmluZGV4IGFjMDk1NmYuLjBjYmIzYjggMTAwNjQ0Ci0tLSBhL2Jsb2NrL0tjb25maWcKKysrIGIvYmxvY2svS2NvbmZpZwpAQCAtMzYsNiArMzYsMTIgQEAKIAkgIFRoaXMgb3B0aW9uIGFsc28gZW5hYmxlcyBzdXBwb3J0IGZvciBzaW5nbGUgZmlsZXMgbGFyZ2VyIHRoYW4KIAkgIDJUQi4KIAorCSAgVGhlIGV4dDQgZmlsZXN5c3RlbSByZXF1aXJlcyB0aGF0IHRoaXMgZmVhdHVyZSBiZSBlbmFibGVkIGluCisJICBvcmRlciB0byBzdXBwb3J0IGZpbGVzeXN0ZW1zIHRoYXQgaGF2ZSB0aGUgaHVnZV9maWxlIGZlYXR1cmUKKwkgIGVuYWJsZWQuICAgIE90aGVyd2lzZSwgaXQgd2lsbCByZWZ1c2UgdG8gbW91bnQgYW55IGZpbGVzeXN0ZW1zCisJICB0aGF0IHVzZSB0aGUgaHVnZV9maWxlIGZlYXR1cmUsIHdoaWNoIGlzIGVuYWJsZWQgYnkgZGVmYXVsdAorCSAgYnkgbWtlMmZzLmV4dDQuICAgVGhlIEdGUzIgZmlsZXN5c3RlbSBhbHNvIHJlcXVpcmVzIHRoaXMgZmVhdHVyZS4KKwogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAogY29uZmlnIEJMS19ERVZfSU9fVFJBQ0UKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1tYXAuYyBiL2Jsb2NrL2Jsay1tYXAuYwppbmRleCAyOTkwNDQ3Li5mMTAzNzI5IDEwMDY0NAotLS0gYS9ibG9jay9ibGstbWFwLmMKKysrIGIvYmxvY2svYmxrLW1hcC5jCkBAIC00Miw3ICs0Miw3IEBACiAKIHN0YXRpYyBpbnQgX19ibGtfcnFfbWFwX3VzZXIoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSwKIAkJCSAgICAgc3RydWN0IHJxX21hcF9kYXRhICptYXBfZGF0YSwgdm9pZCBfX3VzZXIgKnVidWYsCi0JCQkgICAgIHVuc2lnbmVkIGludCBsZW4sIGludCBudWxsX21hcHBlZCwgZ2ZwX3QgZ2ZwX21hc2spCisJCQkgICAgIHVuc2lnbmVkIGludCBsZW4sIGdmcF90IGdmcF9tYXNrKQogewogCXVuc2lnbmVkIGxvbmcgdWFkZHI7CiAJc3RydWN0IGJpbyAqYmlvLCAqb3JpZ19iaW87CkBAIC02Myw3ICs2Myw3IEBACiAJaWYgKElTX0VSUihiaW8pKQogCQlyZXR1cm4gUFRSX0VSUihiaW8pOwogCi0JaWYgKG51bGxfbWFwcGVkKQorCWlmIChtYXBfZGF0YSAmJiBtYXBfZGF0YS0+bnVsbF9tYXBwZWQpCiAJCWJpby0+YmlfZmxhZ3MgfD0gKDEgPDwgQklPX05VTExfTUFQUEVEKTsKIAogCW9yaWdfYmlvID0gYmlvOwpAQCAtMTE0LDE3ICsxMTQsMTUgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGJ5dGVzX3JlYWQgPSAwOwogCXN0cnVjdCBiaW8gKmJpbyA9IE5VTEw7Ci0JaW50IHJldCwgbnVsbF9tYXBwZWQgPSAwOworCWludCByZXQ7CiAKIAlpZiAobGVuID4gKHEtPm1heF9od19zZWN0b3JzIDw8IDkpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoIWxlbikKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKCF1YnVmKSB7Ci0JCWlmICghbWFwX2RhdGEgfHwgcnFfZGF0YV9kaXIocnEpICE9IFJFQUQpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJbnVsbF9tYXBwZWQgPSAxOwotCX0KKworCWlmICghdWJ1ZiAmJiAoIW1hcF9kYXRhIHx8ICFtYXBfZGF0YS0+bnVsbF9tYXBwZWQpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCXdoaWxlIChieXRlc19yZWFkICE9IGxlbikgewogCQl1bnNpZ25lZCBsb25nIG1hcF9sZW4sIGVuZCwgc3RhcnQ7CkBAIC0xNDMsMTMgKzE0MSwxNiBAQAogCQkJbWFwX2xlbiAtPSBQQUdFX1NJWkU7CiAKIAkJcmV0ID0gX19ibGtfcnFfbWFwX3VzZXIocSwgcnEsIG1hcF9kYXRhLCB1YnVmLCBtYXBfbGVuLAotCQkJCQludWxsX21hcHBlZCwgZ2ZwX21hc2spOworCQkJCQlnZnBfbWFzayk7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byB1bm1hcF9ycTsKIAkJaWYgKCFiaW8pCiAJCQliaW8gPSBycS0+YmlvOwogCQlieXRlc19yZWFkICs9IHJldDsKIAkJdWJ1ZiArPSByZXQ7CisKKwkJaWYgKG1hcF9kYXRhKQorCQkJbWFwX2RhdGEtPm9mZnNldCArPSByZXQ7CiAJfQogCiAJaWYgKCFiaW9fZmxhZ2dlZChiaW8sIEJJT19VU0VSX01BUFBFRCkpCmRpZmYgLS1naXQgYS9ibG9jay9ic2cuYyBiL2Jsb2NrL2JzZy5jCmluZGV4IGU3M2U1MGQuLmQ0MTRiYjUgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2JzZy5jCisrKyBiL2Jsb2NrL2JzZy5jCkBAIC00Miw3ICs0Miw3IEBACiAJaW50IGRvbmVfY21kczsKIAl3YWl0X3F1ZXVlX2hlYWRfdCB3cV9kb25lOwogCXdhaXRfcXVldWVfaGVhZF90IHdxX2ZyZWU7Ci0JY2hhciBuYW1lW0JVU19JRF9TSVpFXTsKKwljaGFyIG5hbWVbMjBdOwogCWludCBtYXhfcXVldWU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIH07CkBAIC03ODEsNyArNzgxLDcgQEAKIAltdXRleF9sb2NrKCZic2dfbXV0ZXgpOwogCWhsaXN0X2FkZF9oZWFkKCZiZC0+ZGV2X2xpc3QsIGJzZ19kZXZfaWR4X2hhc2goaW1pbm9yKGlub2RlKSkpOwogCi0Jc3RybmNweShiZC0+bmFtZSwgcnEtPmJzZ19kZXYuY2xhc3NfZGV2LT5idXNfaWQsIHNpemVvZihiZC0+bmFtZSkgLSAxKTsKKwlzdHJuY3B5KGJkLT5uYW1lLCBkZXZfbmFtZShycS0+YnNnX2Rldi5jbGFzc19kZXYpLCBzaXplb2YoYmQtPm5hbWUpIC0gMSk7CiAJZHByaW50aygiYm91bmQgdG8gPCVzPiwgbWF4IHF1ZXVlICVkXG4iLAogCQlmb3JtYXRfZGV2X3QoYnVmLCBpbm9kZS0+aV9yZGV2KSwgYmQtPm1heF9xdWV1ZSk7CiAKQEAgLTk5Miw3ICs5OTIsNyBAQAogCWlmIChuYW1lKQogCQlkZXZuYW1lID0gbmFtZTsKIAllbHNlCi0JCWRldm5hbWUgPSBwYXJlbnQtPmJ1c19pZDsKKwkJZGV2bmFtZSA9IGRldl9uYW1lKHBhcmVudCk7CiAKIAkvKgogCSAqIHdlIG5lZWQgYSBwcm9wZXIgdHJhbnNwb3J0IHRvIHNlbmQgY29tbWFuZHMsIG5vdCBhIHN0YWNrZWQgZGV2aWNlCmRpZmYgLS1naXQgYS9ibG9jay9nZW5oZC5jIGIvYmxvY2svZ2VuaGQuYwppbmRleCBkODRhN2RmLi4zOTc5NjBjIDEwMDY0NAotLS0gYS9ibG9jay9nZW5oZC5jCisrKyBiL2Jsb2NrL2dlbmhkLmMKQEAgLTEwODQsNyArMTA4NCw3IEBACiAJCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gZGV2X3RvX2Rpc2soZGV2KTsKIAkJc3RydWN0IGhkX3N0cnVjdCAqcGFydDsKIAotCQlpZiAoc3RyY21wKGRldi0+YnVzX2lkLCBuYW1lKSkKKwkJaWYgKHN0cmNtcChkZXZfbmFtZShkZXYpLCBuYW1lKSkKIAkJCWNvbnRpbnVlOwogCiAJCXBhcnQgPSBkaXNrX2dldF9wYXJ0KGRpc2ssIHBhcnRubyk7CmRpZmYgLS1naXQgYS9jcnlwdG8vYXN5bmNfdHgvYXN5bmNfdHguYyBiL2NyeXB0by9hc3luY190eC9hc3luY190eC5jCmluZGV4IGRjYmYxYmUuLmYyMTE0N2YgMTAwNjQ0Ci0tLSBhL2NyeXB0by9hc3luY190eC9hc3luY190eC5jCisrKyBiL2NyeXB0by9hc3luY190eC9hc3luY190eC5jCkBAIC0yOCwzNTEgKzI4LDE4IEBACiAjaW5jbHVkZSA8bGludXgvYXN5bmNfdHguaD4KIAogI2lmZGVmIENPTkZJR19ETUFfRU5HSU5FCi1zdGF0aWMgZW51bSBkbWFfc3RhdGVfY2xpZW50Ci1kbWFfY2hhbm5lbF9hZGRfcmVtb3ZlKHN0cnVjdCBkbWFfY2xpZW50ICpjbGllbnQsCi0Jc3RydWN0IGRtYV9jaGFuICpjaGFuLCBlbnVtIGRtYV9zdGF0ZSBzdGF0ZSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgZG1hX2NsaWVudCBhc3luY190eF9kbWEgPSB7Ci0JLmV2ZW50X2NhbGxiYWNrID0gZG1hX2NoYW5uZWxfYWRkX3JlbW92ZSwKLQkvKiAuY2FwX21hc2sgPT0gMCBkZWZhdWx0cyB0byBhbGwgY2hhbm5lbHMgKi8KLX07Ci0KLS8qKgotICogZG1hX2NhcF9tYXNrX2FsbCAtIGVuYWJsZSBpdGVyYXRpb24gb3ZlciBhbGwgb3BlcmF0aW9uIHR5cGVzCi0gKi8KLXN0YXRpYyBkbWFfY2FwX21hc2tfdCBkbWFfY2FwX21hc2tfYWxsOwotCi0vKioKLSAqIGNoYW5fcmVmX3BlcmNwdSAtIHRyYWNrcyBjaGFubmVsIGFsbG9jYXRpb25zIHBlciBjb3JlL29wZXJ0aW9uCi0gKi8KLXN0cnVjdCBjaGFuX3JlZl9wZXJjcHUgewotCXN0cnVjdCBkbWFfY2hhbl9yZWYgKnJlZjsKLX07Ci0KLXN0YXRpYyBpbnQgY2hhbm5lbF90YWJsZV9pbml0aWFsaXplZDsKLXN0YXRpYyBzdHJ1Y3QgY2hhbl9yZWZfcGVyY3B1ICpjaGFubmVsX3RhYmxlW0RNQV9UWF9UWVBFX0VORF07Ci0KLS8qKgotICogYXN5bmNfdHhfbG9jayAtIHByb3RlY3QgbW9kaWZpY2F0aW9uIG9mIGFzeW5jX3R4X21hc3Rlcl9saXN0IGFuZCBzZXJpYWxpemUKLSAqCXJlYmFsYW5jZSBvcGVyYXRpb25zCi0gKi8KLXN0YXRpYyBzcGlubG9ja190IGFzeW5jX3R4X2xvY2s7Ci0KLXN0YXRpYyBMSVNUX0hFQUQoYXN5bmNfdHhfbWFzdGVyX2xpc3QpOwotCi0vKiBhc3luY190eF9pc3N1ZV9wZW5kaW5nX2FsbCAtIHN0YXJ0IGFsbCB0cmFuc2FjdGlvbnMgb24gYWxsIGNoYW5uZWxzICovCi12b2lkIGFzeW5jX3R4X2lzc3VlX3BlbmRpbmdfYWxsKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBhc3luY190eF9pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IGRtYV9jaGFuX3JlZiAqcmVmOwotCi0JcmN1X3JlYWRfbG9jaygpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHJlZiwgJmFzeW5jX3R4X21hc3Rlcl9saXN0LCBub2RlKQotCQlyZWYtPmNoYW4tPmRldmljZS0+ZGV2aWNlX2lzc3VlX3BlbmRpbmcocmVmLT5jaGFuKTsKLQlyY3VfcmVhZF91bmxvY2soKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGFzeW5jX3R4X2lzc3VlX3BlbmRpbmdfYWxsKTsKLQotLyogZG1hX3dhaXRfZm9yX2FzeW5jX3R4IC0gc3BpbiB3YWl0IGZvciBhIHRyYW5zY2F0aW9uIHRvIGNvbXBsZXRlCi0gKiBAdHg6IHRyYW5zYWN0aW9uIHRvIHdhaXQgb24KLSAqLwotZW51bSBkbWFfc3RhdHVzCi1kbWFfd2FpdF9mb3JfYXN5bmNfdHgoc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eCkKLXsKLQllbnVtIGRtYV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqaXRlcjsKLQlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnBhcmVudDsKLQotCWlmICghdHgpCi0JCXJldHVybiBETUFfU1VDQ0VTUzsKLQotCS8qIHBvbGwgdGhyb3VnaCB0aGUgZGVwZW5kZW5jeSBjaGFpbiwgcmV0dXJuIHdoZW4gdHggaXMgY29tcGxldGUgKi8KLQlkbyB7Ci0JCWl0ZXIgPSB0eDsKLQotCQkvKiBmaW5kIHRoZSByb290IG9mIHRoZSB1bnN1Ym1pdHRlZCBkZXBlbmRlbmN5IGNoYWluICovCi0JCWRvIHsKLQkJCXBhcmVudCA9IGl0ZXItPnBhcmVudDsKLQkJCWlmICghcGFyZW50KQotCQkJCWJyZWFrOwotCQkJZWxzZQotCQkJCWl0ZXIgPSBwYXJlbnQ7Ci0JCX0gd2hpbGUgKHBhcmVudCk7Ci0KLQkJLyogdGhlcmUgaXMgYSBzbWFsbCB3aW5kb3cgZm9yIC0+cGFyZW50ID09IE5VTEwgYW5kCi0JCSAqIC0+Y29va2llID09IC1FQlVTWQotCQkgKi8KLQkJd2hpbGUgKGl0ZXItPmNvb2tpZSA9PSAtRUJVU1kpCi0JCQljcHVfcmVsYXgoKTsKLQotCQlzdGF0dXMgPSBkbWFfc3luY193YWl0KGl0ZXItPmNoYW4sIGl0ZXItPmNvb2tpZSk7Ci0JfSB3aGlsZSAoc3RhdHVzID09IERNQV9JTl9QUk9HUkVTUyB8fCAoaXRlciAhPSB0eCkpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGRtYV93YWl0X2Zvcl9hc3luY190eCk7Ci0KLS8qIGFzeW5jX3R4X3J1bl9kZXBlbmRlbmNpZXMgLSBoZWxwZXIgcm91dGluZSBmb3IgZG1hIGRyaXZlcnMgdG8gcHJvY2VzcwotICoJKHN0YXJ0KSBkZXBlbmRlbnQgb3BlcmF0aW9ucyBvbiB0aGVpciB0YXJnZXQgY2hhbm5lbAotICogQHR4OiB0cmFuc2FjdGlvbiB3aXRoIGRlcGVuZGVuY2llcwotICovCi12b2lkIGFzeW5jX3R4X3J1bl9kZXBlbmRlbmNpZXMoc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eCkKLXsKLQlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlcCA9IHR4LT5uZXh0OwotCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqZGVwX25leHQ7Ci0Jc3RydWN0IGRtYV9jaGFuICpjaGFuOwotCi0JaWYgKCFkZXApCi0JCXJldHVybjsKLQotCWNoYW4gPSBkZXAtPmNoYW47Ci0KLQkvKiBrZWVwIHN1Ym1pdHRpbmcgdXAgdW50aWwgYSBjaGFubmVsIHN3aXRjaCBpcyBkZXRlY3RlZAotCSAqIGluIHRoYXQgY2FzZSB3ZSB3aWxsIGJlIGNhbGxlZCBhZ2FpbiBhcyBhIHJlc3VsdCBvZgotCSAqIHByb2Nlc3NpbmcgdGhlIGludGVycnVwdCBmcm9tIGFzeW5jX3R4X2NoYW5uZWxfc3dpdGNoCi0JICovCi0JZm9yICg7IGRlcDsgZGVwID0gZGVwX25leHQpIHsKLQkJc3Bpbl9sb2NrX2JoKCZkZXAtPmxvY2spOwotCQlkZXAtPnBhcmVudCA9IE5VTEw7Ci0JCWRlcF9uZXh0ID0gZGVwLT5uZXh0OwotCQlpZiAoZGVwX25leHQgJiYgZGVwX25leHQtPmNoYW4gPT0gY2hhbikKLQkJCWRlcC0+bmV4dCA9IE5VTEw7IC8qIC0+bmV4dCB3aWxsIGJlIHN1Ym1pdHRlZCAqLwotCQllbHNlCi0JCQlkZXBfbmV4dCA9IE5VTEw7IC8qIHN1Ym1pdCBjdXJyZW50IGRlcCBhbmQgdGVybWluYXRlICovCi0JCXNwaW5fdW5sb2NrX2JoKCZkZXAtPmxvY2spOwotCi0JCWRlcC0+dHhfc3VibWl0KGRlcCk7Ci0JfQotCi0JY2hhbi0+ZGV2aWNlLT5kZXZpY2VfaXNzdWVfcGVuZGluZyhjaGFuKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGFzeW5jX3R4X3J1bl9kZXBlbmRlbmNpZXMpOwotCi1zdGF0aWMgdm9pZAotZnJlZV9kbWFfY2hhbl9yZWYoc3RydWN0IHJjdV9oZWFkICpyY3UpCi17Ci0Jc3RydWN0IGRtYV9jaGFuX3JlZiAqcmVmOwotCXJlZiA9IGNvbnRhaW5lcl9vZihyY3UsIHN0cnVjdCBkbWFfY2hhbl9yZWYsIHJjdSk7Ci0Ja2ZyZWUocmVmKTsKLX0KLQotc3RhdGljIHZvaWQKLWluaXRfZG1hX2NoYW5fcmVmKHN0cnVjdCBkbWFfY2hhbl9yZWYgKnJlZiwgc3RydWN0IGRtYV9jaGFuICpjaGFuKQotewotCUlOSVRfTElTVF9IRUFEKCZyZWYtPm5vZGUpOwotCUlOSVRfUkNVX0hFQUQoJnJlZi0+cmN1KTsKLQlyZWYtPmNoYW4gPSBjaGFuOwotCWF0b21pY19zZXQoJnJlZi0+Y291bnQsIDApOwotfQotCi0vKioKLSAqIGdldF9jaGFuX3JlZl9ieV9jYXAgLSByZXR1cm5zIHRoZSBudGggY2hhbm5lbCBvZiB0aGUgZ2l2ZW4gY2FwYWJpbGl0eQotICogCWRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgY2hhbm5lbCB3aXRoIHRoZSBkZXNpcmVkIGNhcGFiaWxpdHkgYW5kIHRoZQotICogCWxvd2VzdCByZWZlcmVuY2UgY291bnQgaWYgdGhlIGluZGV4IGNhbiBub3QgYmUgc2F0aXNmaWVkCi0gKiBAY2FwOiBjYXBhYmlsaXR5IHRvIG1hdGNoCi0gKiBAaW5kZXg6IG50aCBjaGFubmVsIGRlc2lyZWQsIHBhc3NpbmcgLTEgaGFzIHRoZSBlZmZlY3Qgb2YgZm9yY2luZyB0aGUKLSAqICBkZWZhdWx0IHJldHVybiB2YWx1ZQotICovCi1zdGF0aWMgc3RydWN0IGRtYV9jaGFuX3JlZiAqCi1nZXRfY2hhbl9yZWZfYnlfY2FwKGVudW0gZG1hX3RyYW5zYWN0aW9uX3R5cGUgY2FwLCBpbnQgaW5kZXgpCi17Ci0Jc3RydWN0IGRtYV9jaGFuX3JlZiAqcmV0X3JlZiA9IE5VTEwsICptaW5fcmVmID0gTlVMTCwgKnJlZjsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShyZWYsICZhc3luY190eF9tYXN0ZXJfbGlzdCwgbm9kZSkKLQkJaWYgKGRtYV9oYXNfY2FwKGNhcCwgcmVmLT5jaGFuLT5kZXZpY2UtPmNhcF9tYXNrKSkgewotCQkJaWYgKCFtaW5fcmVmKQotCQkJCW1pbl9yZWYgPSByZWY7Ci0JCQllbHNlIGlmIChhdG9taWNfcmVhZCgmcmVmLT5jb3VudCkgPAotCQkJCWF0b21pY19yZWFkKCZtaW5fcmVmLT5jb3VudCkpCi0JCQkJbWluX3JlZiA9IHJlZjsKLQotCQkJaWYgKGluZGV4LS0gPT0gMCkgewotCQkJCXJldF9yZWYgPSByZWY7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKLQotCWlmICghcmV0X3JlZikKLQkJcmV0X3JlZiA9IG1pbl9yZWY7Ci0KLQlpZiAocmV0X3JlZikKLQkJYXRvbWljX2luYygmcmV0X3JlZi0+Y291bnQpOwotCi0JcmV0dXJuIHJldF9yZWY7Ci19Ci0KLS8qKgotICogYXN5bmNfdHhfcmViYWxhbmNlIC0gcmVkaXN0cmlidXRlIHRoZSBhdmFpbGFibGUgY2hhbm5lbHMsIG9wdGltaXplCi0gKiBmb3IgY3B1IGlzb2xhdGlvbiBpbiB0aGUgU01QIGNhc2UsIGFuZCBvcGVydGFpb24gaXNvbGF0aW9uIGluIHRoZQotICogdW5pcHJvY2Vzc29yIGNhc2UKLSAqLwotc3RhdGljIHZvaWQgYXN5bmNfdHhfcmViYWxhbmNlKHZvaWQpCi17Ci0JaW50IGNwdSwgY2FwLCBjcHVfaWR4ID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKCFjaGFubmVsX3RhYmxlX2luaXRpYWxpemVkKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXN5bmNfdHhfbG9jaywgZmxhZ3MpOwotCi0JLyogdW5kbyB0aGUgbGFzdCBkaXN0cmlidXRpb24gKi8KLQlmb3JfZWFjaF9kbWFfY2FwX21hc2soY2FwLCBkbWFfY2FwX21hc2tfYWxsKQotCQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7Ci0JCQlzdHJ1Y3QgZG1hX2NoYW5fcmVmICpyZWYgPQotCQkJCXBlcl9jcHVfcHRyKGNoYW5uZWxfdGFibGVbY2FwXSwgY3B1KS0+cmVmOwotCQkJaWYgKHJlZikgewotCQkJCWF0b21pY19zZXQoJnJlZi0+Y291bnQsIDApOwotCQkJCXBlcl9jcHVfcHRyKGNoYW5uZWxfdGFibGVbY2FwXSwgY3B1KS0+cmVmID0KLQkJCQkJCQkJCU5VTEw7Ci0JCQl9Ci0JCX0KLQotCWZvcl9lYWNoX2RtYV9jYXBfbWFzayhjYXAsIGRtYV9jYXBfbWFza19hbGwpCi0JCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7Ci0JCQlzdHJ1Y3QgZG1hX2NoYW5fcmVmICpuZXc7Ci0JCQlpZiAoTlJfQ1BVUyA+IDEpCi0JCQkJbmV3ID0gZ2V0X2NoYW5fcmVmX2J5X2NhcChjYXAsIGNwdV9pZHgrKyk7Ci0JCQllbHNlCi0JCQkJbmV3ID0gZ2V0X2NoYW5fcmVmX2J5X2NhcChjYXAsIC0xKTsKLQotCQkJcGVyX2NwdV9wdHIoY2hhbm5lbF90YWJsZVtjYXBdLCBjcHUpLT5yZWYgPSBuZXc7Ci0JCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFzeW5jX3R4X2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIGVudW0gZG1hX3N0YXRlX2NsaWVudAotZG1hX2NoYW5uZWxfYWRkX3JlbW92ZShzdHJ1Y3QgZG1hX2NsaWVudCAqY2xpZW50LAotCXN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgZW51bSBkbWFfc3RhdGUgc3RhdGUpCi17Ci0JdW5zaWduZWQgbG9uZyBmb3VuZCwgZmxhZ3M7Ci0Jc3RydWN0IGRtYV9jaGFuX3JlZiAqbWFzdGVyX3JlZiwgKnJlZjsKLQllbnVtIGRtYV9zdGF0ZV9jbGllbnQgYWNrID0gRE1BX0RVUDsgLyogZGVmYXVsdDogdGFrZSBubyBhY3Rpb24gKi8KLQotCXN3aXRjaCAoc3RhdGUpIHsKLQljYXNlIERNQV9SRVNPVVJDRV9BVkFJTEFCTEU6Ci0JCWZvdW5kID0gMDsKLQkJcmN1X3JlYWRfbG9jaygpOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShyZWYsICZhc3luY190eF9tYXN0ZXJfbGlzdCwgbm9kZSkKLQkJCWlmIChyZWYtPmNoYW4gPT0gY2hhbikgewotCQkJCWZvdW5kID0gMTsKLQkJCQlicmVhazsKLQkJCX0KLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0KLQkJcHJfZGVidWcoImFzeW5jX3R4OiBkbWEgcmVzb3VyY2UgYXZhaWxhYmxlIFslc11cbiIsCi0JCQlmb3VuZCA/ICJvbGQiIDogIm5ldyIpOwotCi0JCWlmICghZm91bmQpCi0JCQlhY2sgPSBETUFfQUNLOwotCQllbHNlCi0JCQlicmVhazsKLQotCQkvKiBhZGQgdGhlIGNoYW5uZWwgdG8gdGhlIGdlbmVyaWMgbWFuYWdlbWVudCBsaXN0ICovCi0JCW1hc3Rlcl9yZWYgPSBrbWFsbG9jKHNpemVvZigqbWFzdGVyX3JlZiksIEdGUF9LRVJORUwpOwotCQlpZiAobWFzdGVyX3JlZikgewotCQkJLyoga2VlcCBhIHJlZmVyZW5jZSB1bnRpbCBhc3luY190eCBpcyB1bmxvYWRlZCAqLwotCQkJZG1hX2NoYW5fZ2V0KGNoYW4pOwotCQkJaW5pdF9kbWFfY2hhbl9yZWYobWFzdGVyX3JlZiwgY2hhbik7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXN5bmNfdHhfbG9jaywgZmxhZ3MpOwotCQkJbGlzdF9hZGRfdGFpbF9yY3UoJm1hc3Rlcl9yZWYtPm5vZGUsCi0JCQkJJmFzeW5jX3R4X21hc3Rlcl9saXN0KTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFzeW5jX3R4X2xvY2ssCi0JCQkJZmxhZ3MpOwotCQl9IGVsc2UgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXN5bmNfdHg6IHVuYWJsZSB0byBjcmVhdGUiCi0JCQkJIiBuZXcgbWFzdGVyIGVudHJ5IGluIHJlc3BvbnNlIHRvIgotCQkJCSIgYSBETUFfUkVTT1VSQ0VfQURERUQgZXZlbnQiCi0JCQkJIiAoLUVOT01FTSlcbiIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlhc3luY190eF9yZWJhbGFuY2UoKTsKLQkJYnJlYWs7Ci0JY2FzZSBETUFfUkVTT1VSQ0VfUkVNT1ZFRDoKLQkJZm91bmQgPSAwOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXN5bmNfdHhfbG9jaywgZmxhZ3MpOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlZiwgJmFzeW5jX3R4X21hc3Rlcl9saXN0LCBub2RlKQotCQkJaWYgKHJlZi0+Y2hhbiA9PSBjaGFuKSB7Ci0JCQkJLyogcGVybWl0IGJhY2tpbmcgZGV2aWNlcyB0byBnbyBhd2F5ICovCi0JCQkJZG1hX2NoYW5fcHV0KHJlZi0+Y2hhbik7Ci0JCQkJbGlzdF9kZWxfcmN1KCZyZWYtPm5vZGUpOwotCQkJCWNhbGxfcmN1KCZyZWYtPnJjdSwgZnJlZV9kbWFfY2hhbl9yZWYpOwotCQkJCWZvdW5kID0gMTsKLQkJCQlicmVhazsKLQkJCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXN5bmNfdHhfbG9jaywgZmxhZ3MpOwotCi0JCXByX2RlYnVnKCJhc3luY190eDogZG1hIHJlc291cmNlIHJlbW92ZWQgWyVzXVxuIiwKLQkJCWZvdW5kID8gIm91cnMiIDogIm5vdCBvdXJzIik7Ci0KLQkJaWYgKGZvdW5kKQotCQkJYWNrID0gRE1BX0FDSzsKLQkJZWxzZQotCQkJYnJlYWs7Ci0KLQkJYXN5bmNfdHhfcmViYWxhbmNlKCk7Ci0JCWJyZWFrOwotCWNhc2UgRE1BX1JFU09VUkNFX1NVU1BFTkQ6Ci0JY2FzZSBETUFfUkVTT1VSQ0VfUkVTVU1FOgotCQlwcmludGsoS0VSTl9XQVJOSU5HICJhc3luY190eDogZG9lcyBub3Qgc3VwcG9ydCBkbWEgY2hhbm5lbCIKLQkJCSIgc3VzcGVuZC9yZXN1bWVcbiIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlCVUcoKTsKLQl9Ci0KLQlyZXR1cm4gYWNrOwotfQotCi1zdGF0aWMgaW50IF9faW5pdAotYXN5bmNfdHhfaW5pdCh2b2lkKQotewotCWVudW0gZG1hX3RyYW5zYWN0aW9uX3R5cGUgY2FwOwotCi0Jc3Bpbl9sb2NrX2luaXQoJmFzeW5jX3R4X2xvY2spOwotCWJpdG1hcF9maWxsKGRtYV9jYXBfbWFza19hbGwuYml0cywgRE1BX1RYX1RZUEVfRU5EKTsKLQotCS8qIGFuIGludGVycnVwdCB3aWxsIG5ldmVyIGJlIGFuIGV4cGxpY2l0IG9wZXJhdGlvbiB0eXBlLgotCSAqIGNsZWFyaW5nIHRoaXMgYml0IHByZXZlbnRzIGFsbG9jYXRpb24gdG8gYSBzbG90IGluICdjaGFubmVsX3RhYmxlJwotCSAqLwotCWNsZWFyX2JpdChETUFfSU5URVJSVVBULCBkbWFfY2FwX21hc2tfYWxsLmJpdHMpOwotCi0JZm9yX2VhY2hfZG1hX2NhcF9tYXNrKGNhcCwgZG1hX2NhcF9tYXNrX2FsbCkgewotCQljaGFubmVsX3RhYmxlW2NhcF0gPSBhbGxvY19wZXJjcHUoc3RydWN0IGNoYW5fcmVmX3BlcmNwdSk7Ci0JCWlmICghY2hhbm5lbF90YWJsZVtjYXBdKQotCQkJZ290byBlcnI7Ci0JfQotCi0JY2hhbm5lbF90YWJsZV9pbml0aWFsaXplZCA9IDE7Ci0JZG1hX2FzeW5jX2NsaWVudF9yZWdpc3RlcigmYXN5bmNfdHhfZG1hKTsKLQlkbWFfYXN5bmNfY2xpZW50X2NoYW5fcmVxdWVzdCgmYXN5bmNfdHhfZG1hKTsKKwlkbWFlbmdpbmVfZ2V0KCk7CiAKIAlwcmludGsoS0VSTl9JTkZPICJhc3luY190eDogYXBpIGluaXRpYWxpemVkIChhc3luYylcbiIpOwogCiAJcmV0dXJuIDA7Ci1lcnI6Ci0JcHJpbnRrKEtFUk5fRVJSICJhc3luY190eDogaW5pdGlhbGl6YXRpb24gZmFpbHVyZVxuIik7Ci0KLQl3aGlsZSAoLS1jYXAgPj0gMCkKLQkJZnJlZV9wZXJjcHUoY2hhbm5lbF90YWJsZVtjYXBdKTsKLQotCXJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgYXN5bmNfdHhfZXhpdCh2b2lkKQogewotCWVudW0gZG1hX3RyYW5zYWN0aW9uX3R5cGUgY2FwOwotCi0JY2hhbm5lbF90YWJsZV9pbml0aWFsaXplZCA9IDA7Ci0KLQlmb3JfZWFjaF9kbWFfY2FwX21hc2soY2FwLCBkbWFfY2FwX21hc2tfYWxsKQotCQlpZiAoY2hhbm5lbF90YWJsZVtjYXBdKQotCQkJZnJlZV9wZXJjcHUoY2hhbm5lbF90YWJsZVtjYXBdKTsKLQotCWRtYV9hc3luY19jbGllbnRfdW5yZWdpc3RlcigmYXN5bmNfdHhfZG1hKTsKKwlkbWFlbmdpbmVfcHV0KCk7CiB9CiAKIC8qKgpAQCAtMzg3LDE2ICs1NCw5IEBACiB7CiAJLyogc2VlIGlmIHdlIGNhbiBrZWVwIHRoZSBjaGFpbiBvbiBvbmUgY2hhbm5lbCAqLwogCWlmIChkZXBlbmRfdHggJiYKLQkJZG1hX2hhc19jYXAodHhfdHlwZSwgZGVwZW5kX3R4LT5jaGFuLT5kZXZpY2UtPmNhcF9tYXNrKSkKKwkgICAgZG1hX2hhc19jYXAodHhfdHlwZSwgZGVwZW5kX3R4LT5jaGFuLT5kZXZpY2UtPmNhcF9tYXNrKSkKIAkJcmV0dXJuIGRlcGVuZF90eC0+Y2hhbjsKLQllbHNlIGlmIChsaWtlbHkoY2hhbm5lbF90YWJsZV9pbml0aWFsaXplZCkpIHsKLQkJc3RydWN0IGRtYV9jaGFuX3JlZiAqcmVmOwotCQlpbnQgY3B1ID0gZ2V0X2NwdSgpOwotCQlyZWYgPSBwZXJfY3B1X3B0cihjaGFubmVsX3RhYmxlW3R4X3R5cGVdLCBjcHUpLT5yZWY7Ci0JCXB1dF9jcHUoKTsKLQkJcmV0dXJuIHJlZiA/IHJlZi0+Y2hhbiA6IE5VTEw7Ci0JfSBlbHNlCi0JCXJldHVybiBOVUxMOworCXJldHVybiBkbWFfZmluZF9jaGFubmVsKHR4X3R5cGUpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoX19hc3luY190eF9maW5kX2NoYW5uZWwpOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvTWFrZWZpbGUgYi9kcml2ZXJzL01ha2VmaWxlCmluZGV4IGZjZWI3MWEuLjYzMjZmNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9NYWtlZmlsZQpAQCAtMTgsNiArMTgsOSBAQAogCiBvYmotJChDT05GSUdfWEVOKQkJKz0geGVuLwogCisjIHJlZ3VsYXRvcnMgZWFybHksIHNpbmNlIHNvbWUgc3Vic3lzdGVtcyByZWx5IG9uIHRoZW0gdG8gaW5pdGlhbGl6ZQorb2JqLSQoQ09ORklHX1JFR1VMQVRPUikJCSs9IHJlZ3VsYXRvci8KKwogIyBjaGFyLyBjb21lcyBiZWZvcmUgc2VyaWFsLyBldGMgc28gdGhhdCB0aGUgVlQgY29uc29sZSBpcyB0aGUgYm9vdC10aW1lCiAjIGRlZmF1bHQuCiBvYmoteQkJCQkrPSBjaGFyLwpAQCAtNTcsNiArNjAsNyBAQAogb2JqLSQoQ09ORklHX1BBUklERSkgCQkrPSBibG9jay9wYXJpZGUvCiBvYmotJChDT05GSUdfVEMpCQkrPSB0Yy8KIG9iai0kKENPTkZJR19VV0IpCQkrPSB1d2IvCitvYmotJChDT05GSUdfVVNCX09UR19VVElMUykJKz0gdXNiL290Zy8KIG9iai0kKENPTkZJR19VU0IpCQkrPSB1c2IvCiBvYmotJChDT05GSUdfVVNCX01VU0JfSERSQykJKz0gdXNiL211c2IvCiBvYmotJChDT05GSUdfUENJKQkJKz0gdXNiLwpAQCAtMTAwLDUgKzEwNCw0IEBACiBvYmotJChDT05GSUdfT0YpCQkrPSBvZi8KIG9iai0kKENPTkZJR19TU0IpCQkrPSBzc2IvCiBvYmotJChDT05GSUdfVklSVElPKQkJKz0gdmlydGlvLwotb2JqLSQoQ09ORklHX1JFR1VMQVRPUikJCSs9IHJlZ3VsYXRvci8KIG9iai0kKENPTkZJR19TVEFHSU5HKQkJKz0gc3RhZ2luZy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpX21lbWhvdHBsdWcuYyBiL2RyaXZlcnMvYWNwaS9hY3BpX21lbWhvdHBsdWcuYwppbmRleCA2M2ExN2I1Li43YTBmNGFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaV9tZW1ob3RwbHVnLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGlfbWVtaG90cGx1Zy5jCkBAIC0yMCw3ICsyMCw3IEBACiAgKgogICoKICAqIEFDUEkgYmFzZWQgSG90UGx1ZyBkcml2ZXIgdGhhdCBzdXBwb3J0cyBNZW1vcnkgSG90cGx1ZwotICogVGhpcyBkcml2ZXIgZmllbGRzIG5vdGlmaWNhdGlvbnMgZnJvbSBmaXJtYXJlIGZvciBtZW1vcnkgYWRkCisgKiBUaGlzIGRyaXZlciBmaWVsZHMgbm90aWZpY2F0aW9ucyBmcm9tIGZpcm13YXJlIGZvciBtZW1vcnkgYWRkCiAgKiBhbmQgcmVtb3ZlIG9wZXJhdGlvbnMgYW5kIGFsZXJ0cyB0aGUgVk0gb2YgdGhlIGFmZmVjdGVkIG1lbW9yeQogICogcmFuZ2VzLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhwcmVwLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhwcmVwLmMKaW5kZXggNWQ0MzhjMy4uYTdkYzg3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cHJlcC5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHByZXAuYwpAQCAtNDA0LDcgKzQwNCw3IEBACiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBDb25zdHJ1Y3QgYW4gdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCBvZiB0eXBlIGRlZl9maWVsZCBhbmQKKyAqIERFU0NSSVBUSU9OOiBDb25zdHJ1Y3QgYSB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0IG9mIHR5cGUgZGVmX2ZpZWxkIGFuZAogICogICAgICAgICAgICAgIGNvbm5lY3QgaXQgdG8gdGhlIHBhcmVudCBOb2RlLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZXNvbHYuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc29sdi5jCmluZGV4IDg5NTcxYjkuLjYwZThjNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc29sdi5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc29sdi5jCkBAIC0xNDYsNyArMTQ2LDcgQEAKIAogCXN0YWNrX2Rlc2MgPSAqc3RhY2tfcHRyOwogCi0JLyogVGhpcyBpcyBhbiB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICovCisJLyogVGhpcyBpcyBhIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgKi8KIAogCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoc3RhY2tfZGVzYykpIHsKIAljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0U6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzdG9yZS5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3RvcmUuYwppbmRleCAzMzE4ZGY0Li4xYzExOGJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzdG9yZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN0b3JlLmMKQEAgLTI3NCw3ICsyNzQsNyBAQAogICoKICAqIFBBUkFNRVRFUlM6ICAqc291cmNlX2Rlc2MgICAgICAgIC0gVmFsdWUgdG8gYmUgc3RvcmVkCiAgKiAgICAgICAgICAgICAgKmRlc3RfZGVzYyAgICAgICAgICAtIFdoZXJlIHRvIHN0b3JlIGl0LiAgTXVzdCBiZSBhbiBOUyBub2RlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGFuIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3Qgb2YgdHlwZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBhIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3Qgb2YgdHlwZQogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2U7CiAgKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgd2FsayBzdGF0ZQogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wY2lfcm9vdC5jIGIvZHJpdmVycy9hY3BpL3BjaV9yb290LmMKaW5kZXggNjQyNTU0Yi4uNWIzOGEwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BjaV9yb290LmMKKysrIGIvZHJpdmVycy9hY3BpL3BjaV9yb290LmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLWFjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CkBAIC0xOTMsNiArMTk0LDcgQEAKIAl1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWUgPSAwOwogCWFjcGlfaGFuZGxlIGhhbmRsZSA9IE5VTEw7CiAJc3RydWN0IGFjcGlfZGV2aWNlICpjaGlsZDsKKwl1MzIgZmxhZ3MsIGJhc2VfZmxhZ3M7CiAKIAogCWlmICghZGV2aWNlKQpAQCAtMjEwLDYgKzIxMiwxMyBAQAogCiAJZGV2aWNlLT5vcHMuYmluZCA9IGFjcGlfcGNpX2JpbmQ7CiAKKwkvKgorCSAqIEFsbCBzdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlcyB0aGF0IHVzZSBBQ1BJIGhhdmUgc3VwcG9ydCBmb3IKKwkgKiBQQ0kgZG9tYWlucywgc28gd2UgaW5kaWNhdGUgdGhpcyBpbiBfT1NDIHN1cHBvcnQgY2FwYWJpbGl0aWVzLgorCSAqLworCWZsYWdzID0gYmFzZV9mbGFncyA9IE9TQ19QQ0lfU0VHTUVOVF9HUk9VUFNfU1VQUE9SVDsKKwlwY2lfYWNwaV9vc2Nfc3VwcG9ydChkZXZpY2UtPmhhbmRsZSwgZmxhZ3MpOworCiAJLyogCiAJICogU2VnbWVudAogCSAqIC0tLS0tLS0KQEAgLTMzNSw2ICszNDQsMTcgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoaWxkLCAmZGV2aWNlLT5jaGlsZHJlbiwgbm9kZSkKIAkJYWNwaV9wY2lfYnJpZGdlX3NjYW4oY2hpbGQpOwogCisJLyogSW5kaWNhdGUgc3VwcG9ydCBmb3IgdmFyaW91cyBfT1NDIGNhcGFiaWxpdGllcy4gKi8KKwlpZiAocGNpX2V4dF9jZmdfYXZhaWwocm9vdC0+YnVzLT5zZWxmKSkKKwkJZmxhZ3MgfD0gT1NDX0VYVF9QQ0lfQ09ORklHX1NVUFBPUlQ7CisJaWYgKHBjaWVfYXNwbV9lbmFibGVkKCkpCisJCWZsYWdzIHw9IE9TQ19BQ1RJVkVfU1RBVEVfUFdSX1NVUFBPUlQgfAorCQkJT1NDX0NMT0NLX1BXUl9DQVBBQklMSVRZX1NVUFBPUlQ7CisJaWYgKHBjaV9tc2lfZW5hYmxlZCgpKQorCQlmbGFncyB8PSBPU0NfTVNJX1NVUFBPUlQ7CisJaWYgKGZsYWdzICE9IGJhc2VfZmxhZ3MpCisJCXBjaV9hY3BpX29zY19zdXBwb3J0KGRldmljZS0+aGFuZGxlLCBmbGFncyk7CisKICAgICAgIGVuZDoKIAlpZiAocmVzdWx0KSB7CiAJCWlmICghbGlzdF9lbXB0eSgmcm9vdC0+bm9kZSkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2lkbGUuYyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jCmluZGV4IDM4YWNhMDQuLjY2YTlkODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jCkBAIC00MSw2ICs0MSw3IEBACiAjaW5jbHVkZSA8bGludXgvcG1fcW9zX3BhcmFtcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVpZGxlLmg+CisjaW5jbHVkZSA8bGludXgvaXJxZmxhZ3MuaD4KIAogLyoKICAqIEluY2x1ZGUgdGhlIGFwaWMgZGVmaW5pdGlvbnMgZm9yIHg4NiB0byBoYXZlIHRoZSBBUElDIHRpbWVyIHJlbGF0ZWQgZGVmaW5lcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2NyZWF0ZS5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2NyZWF0ZS5jCmluZGV4IGMwYmJmYTIuLjA4YjhkNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNjcmVhdGUuYworKysgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzY3JlYXRlLmMKQEAgLTEyNCw3ICsxMjQsNyBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2NyZWF0ZV9wY2lfcm91dGluZ190YWJsZQogICoKLSAqIFBBUkFNRVRFUlM6ICBwYWNrYWdlX29iamVjdCAgICAgICAgICAtIFBvaW50ZXIgdG8gYW4gdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdAorICogUEFSQU1FVEVSUzogIHBhY2thZ2Vfb2JqZWN0ICAgICAgICAgIC0gUG9pbnRlciB0byBhIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2UKICAqICAgICAgICAgICAgICBvdXRwdXRfYnVmZmVyICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHVzZXIncyBidWZmZXIKICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0b2JqZWN0LmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0b2JqZWN0LmMKaW5kZXggYzM1NGU3YS4uNGJlZjNjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG9iamVjdC5jCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRvYmplY3QuYwpAQCAtMjk3LDcgKzI5Nyw3IEBACiAgKgogICogUkVUVVJOOiAgICAgIFRSVUUgaWYgb2JqZWN0IGlzIHZhbGlkLCBGQUxTRSBvdGhlcndpc2UKICAqCi0gKiBERVNDUklQVElPTjogVmFsaWRhdGUgYSBwb2ludGVyIHRvIGJlIGFuIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QKKyAqIERFU0NSSVBUSU9OOiBWYWxpZGF0ZSBhIHBvaW50ZXIgdG8gYmUgYSB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0CiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtMzg5LDcgKzM4OSw3IEBACiB7CiAJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIodXRfZGVsZXRlX29iamVjdF9kZXNjLCBvYmplY3QpOwogCi0JLyogT2JqZWN0IG11c3QgYmUgYW4gdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAqLworCS8qIE9iamVjdCBtdXN0IGJlIGEgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAqLwogCiAJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShvYmplY3QpICE9IEFDUElfREVTQ19UWVBFX09QRVJBTkQpIHsKIAkJQUNQSV9FUlJPUigoQUVfSU5GTywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYW1iYS9idXMuYyBiL2RyaXZlcnMvYW1iYS9idXMuYwppbmRleCA2Yjk0ZmI3Li4wMGM0NmUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FtYmEvYnVzLmMKKysrIGIvZHJpdmVycy9hbWJhL2J1cy5jCkBAIC0xMiw5ICsxMiwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CiAKLSNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3NpemVzLmg+CiAKICNkZWZpbmUgdG9fYW1iYV9kZXZpY2UoZCkJY29udGFpbmVyX29mKGQsIHN0cnVjdCBhbWJhX2RldmljZSwgZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvYWhjaS5jIGIvZHJpdmVycy9hdGEvYWhjaS5jCmluZGV4IDY1NjQ0OGMuLjdmNzAxY2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2FoY2kuYworKysgYi9kcml2ZXJzL2F0YS9haGNpLmMKQEAgLTEwNSw3ICsxMDUsNyBAQAogCWJvYXJkX2FoY2lfaWduX2lmZXJyCT0gMiwKIAlib2FyZF9haGNpX3NiNjAwCT0gMywKIAlib2FyZF9haGNpX212CQk9IDQsCi0JYm9hcmRfYWhjaV9zYjcwMAk9IDUsCisJYm9hcmRfYWhjaV9zYjcwMAk9IDUsIC8qIGZvciBTQjcwMCBhbmQgU0I4MDAgKi8KIAlib2FyZF9haGNpX21jcDY1CT0gNiwKIAlib2FyZF9haGNpX25vcG1wCT0gNywKIApAQCAtNDM5LDcgKzQzOSw3IEBACiAJCS51ZG1hX21hc2sJPSBBVEFfVURNQTYsCiAJCS5wb3J0X29wcwk9ICZhaGNpX29wcywKIAl9LAotCS8qIGJvYXJkX2FoY2lfc2I3MDAgKi8KKwkvKiBib2FyZF9haGNpX3NiNzAwLCBmb3IgU0I3MDAgYW5kIFNCODAwICovCiAJewogCQlBSENJX0hGTEFHUwkoQUhDSV9IRkxBR19JR05fU0VSUl9JTlRFUk5BTCksCiAJCS5mbGFncwkJPSBBSENJX0ZMQUdfQ09NTU9OLApAQCAtMjQ0Niw2ICsyNDQ2LDggQEAKIAkJc3BlZWRfcyA9ICIxLjUiOwogCWVsc2UgaWYgKHNwZWVkID09IDIpCiAJCXNwZWVkX3MgPSAiMyI7CisJZWxzZSBpZiAoc3BlZWQgPT0gMykKKwkJc3BlZWRfcyA9ICI2IjsKIAllbHNlCiAJCXNwZWVkX3MgPSAiPyI7CiAKQEAgLTI2MTAsNiArMjYxMiwxMCBAQAogCSAgICAocGRldi0+cmV2aXNpb24gPT0gMHhhMSB8fCBwZGV2LT5yZXZpc2lvbiA9PSAweGEyKSkKIAkJaHByaXYtPmZsYWdzIHw9IEFIQ0lfSEZMQUdfTk9fTVNJOwogCisJLyogU0I4MDAgZG9lcyBOT1QgbmVlZCB0aGUgd29ya2Fyb3VuZCB0byBpZ25vcmUgU0VSUl9JTlRFUk5BTCAqLworCWlmIChib2FyZF9pZCA9PSBib2FyZF9haGNpX3NiNzAwICYmIHBkZXYtPnJldmlzaW9uID49IDB4NDApCisJCWhwcml2LT5mbGFncyAmPSB+QUhDSV9IRkxBR19JR05fU0VSUl9JTlRFUk5BTDsKKwogCWlmICgoaHByaXYtPmZsYWdzICYgQUhDSV9IRkxBR19OT19NU0kpIHx8IHBjaV9lbmFibGVfbXNpKHBkZXYpKQogCQlwY2lfaW50eChwZGV2LCAxKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvYXRhX3BpaXguYyBiL2RyaXZlcnMvYXRhL2F0YV9waWl4LmMKaW5kZXggNWZkZjE2Ny4uODg3ZDhmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvYXRhX3BpaXguYworKysgYi9kcml2ZXJzL2F0YS9hdGFfcGlpeC5jCkBAIC0xNTQsMTEgKzE1NCwxMyBAQAogCiBzdHJ1Y3QgcGlpeF9ob3N0X3ByaXYgewogCWNvbnN0IGludCAqbWFwOworCXUzMiBzYXZlZF9pb2NmZzsKIAl2b2lkIF9faW9tZW0gKnNpZHByOwogfTsKIAogc3RhdGljIGludCBwaWl4X2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOworc3RhdGljIHZvaWQgcGlpeF9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKIHN0YXRpYyBpbnQgcGlpeF9wYXRhX3ByZXJlc2V0KHN0cnVjdCBhdGFfbGluayAqbGluaywgdW5zaWduZWQgbG9uZyBkZWFkbGluZSk7CiBzdGF0aWMgdm9pZCBwaWl4X3NldF9waW9tb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2KTsKIHN0YXRpYyB2b2lkIHBpaXhfc2V0X2RtYW1vZGUoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpOwpAQCAtMjk2LDcgKzI5OCw3IEBACiAJLm5hbWUJCQk9IERSVl9OQU1FLAogCS5pZF90YWJsZQkJPSBwaWl4X3BjaV90YmwsCiAJLnByb2JlCQkJPSBwaWl4X2luaXRfb25lLAotCS5yZW1vdmUJCQk9IGF0YV9wY2lfcmVtb3ZlX29uZSwKKwkucmVtb3ZlCQkJPSBwaWl4X3JlbW92ZV9vbmUsCiAjaWZkZWYgQ09ORklHX1BNCiAJLnN1c3BlbmQJCT0gcGlpeF9wY2lfZGV2aWNlX3N1c3BlbmQsCiAJLnJlc3VtZQkJCT0gcGlpeF9wY2lfZGV2aWNlX3Jlc3VtZSwKQEAgLTMwOCw3ICszMTAsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIHBpaXhfcGF0YV9vcHMgPSB7Ci0JLmluaGVyaXRzCQk9ICZhdGFfYm1kbWFfcG9ydF9vcHMsCisJLmluaGVyaXRzCQk9ICZhdGFfYm1kbWEzMl9wb3J0X29wcywKIAkuY2FibGVfZGV0ZWN0CQk9IGF0YV9jYWJsZV80MHdpcmUsCiAJLnNldF9waW9tb2RlCQk9IHBpaXhfc2V0X3Bpb21vZGUsCiAJLnNldF9kbWFtb2RlCQk9IHBpaXhfc2V0X2RtYW1vZGUsCkBAIC02MTAsOCArNjEyLDkgQEAKIHN0YXRpYyBpbnQgaWNoX3BhdGFfY2FibGVfZGV0ZWN0KHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOworCXN0cnVjdCBwaWl4X2hvc3RfcHJpdiAqaHByaXYgPSBhcC0+aG9zdC0+cHJpdmF0ZV9kYXRhOwogCWNvbnN0IHN0cnVjdCBpY2hfbGFwdG9wICpsYXAgPSAmaWNoX2xhcHRvcFswXTsKLQl1OCB0bXAsIG1hc2s7CisJdTggbWFzazsKIAogCS8qIENoZWNrIGZvciBzcGVjaWFscyAtIEFjZXIgQXNwaXJlIDU2MDJXTE1pICovCiAJd2hpbGUgKGxhcC0+ZGV2aWNlKSB7CkBAIC02MjUsOCArNjI4LDcgQEAKIAogCS8qIGNoZWNrIEJJT1MgY2FibGUgZGV0ZWN0IHJlc3VsdHMgKi8KIAltYXNrID0gYXAtPnBvcnRfbm8gPT0gMCA/IFBJSVhfODBDX1BSSSA6IFBJSVhfODBDX1NFQzsKLQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQSUlYX0lPQ0ZHLCAmdG1wKTsKLQlpZiAoKHRtcCAmIG1hc2spID09IDApCisJaWYgKChocHJpdi0+c2F2ZWRfaW9jZmcgJiBtYXNrKSA9PSAwKQogCQlyZXR1cm4gQVRBX0NCTF9QQVRBNDA7CiAJcmV0dXJuIEFUQV9DQkxfUEFUQTgwOwogfQpAQCAtMTM1MCw3ICsxMzUyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcGlpeF9pb2NmZ19iaXQxOF9xdWlyayhzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3N0YXRpYyB2b2lkIHBpaXhfaW9jZmdfYml0MThfcXVpcmsoc3RydWN0IGF0YV9ob3N0ICpob3N0KQogewogCXN0YXRpYyBjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBzeXNpZHNbXSA9IHsKIAkJewpAQCAtMTM2Nyw3ICsxMzY5LDggQEAKIAogCQl7IH0JLyogdGVybWluYXRlIGxpc3QgKi8KIAl9OwotCXUzMiBpb2NmZzsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoaG9zdC0+ZGV2KTsKKwlzdHJ1Y3QgcGlpeF9ob3N0X3ByaXYgKmhwcml2ID0gaG9zdC0+cHJpdmF0ZV9kYXRhOwogCiAJaWYgKCFkbWlfY2hlY2tfc3lzdGVtKHN5c2lkcykpCiAJCXJldHVybjsKQEAgLTEzNzYsMTIgKzEzNzksMTEgQEAKIAkgKiBzZWVtIHRvIHVzZSBpdCB0byBkaXNhYmxlIGEgY2hhbm5lbC4gIENsZWFyIHRoZSBiaXQgb24gdGhlCiAJICogYWZmZWN0ZWQgc3lzdGVtcy4KIAkgKi8KLQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgUElJWF9JT0NGRywgJmlvY2ZnKTsKLQlpZiAoaW9jZmcgJiAoMSA8PCAxOCkpIHsKKwlpZiAoaHByaXYtPnNhdmVkX2lvY2ZnICYgKDEgPDwgMTgpKSB7CiAJCWRldl9wcmludGsoS0VSTl9JTkZPLCAmcGRldi0+ZGV2LAogCQkJICAgImFwcGx5aW5nIElPQ0ZHIGJpdDE4IHF1aXJrXG4iKTsKLQkJaW9jZmcgJj0gfigxIDw8IDE4KTsKLQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBQSUlYX0lPQ0ZHLCBpb2NmZyk7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgUElJWF9JT0NGRywKKwkJCQkgICAgICAgaHByaXYtPnNhdmVkX2lvY2ZnICYgfigxIDw8IDE4KSk7CiAJfQogfQogCkBAIC0xNDMwLDYgKzE0MzIsMTcgQEAKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAorCWhwcml2ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpocHJpdiksIEdGUF9LRVJORUwpOworCWlmICghaHByaXYpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogU2F2ZSBJT0NGRywgdGhpcyB3aWxsIGJlIHVzZWQgZm9yIGNhYmxlIGRldGVjdGlvbiwgcXVpcmsKKwkgKiBkZXRlY3Rpb24gYW5kIHJlc3RvcmF0aW9uIG9uIGRldGFjaC4gIFRoaXMgaXMgbmVjZXNzYXJ5CisJICogYmVjYXVzZSBzb21lIEFDUEkgaW1wbGVtZW50YXRpb25zIG1lc3MgdXAgY2FibGUgcmVsYXRlZAorCSAqIGJpdHMgb24gX1NUTS4gIFJlcG9ydGVkIG9uIGtlcm5lbCBieiMxMTg3OS4KKwkgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgUElJWF9JT0NGRywgJmhwcml2LT5zYXZlZF9pb2NmZyk7CisKIAkvKiBJQ0g2UiBtYXkgYmUgZHJpdmVuIGJ5IGVpdGhlciBhdGFfcGlpeCBvciBhaGNpIGRyaXZlcgogCSAqIHJlZ2FyZGxlc3Mgb2YgQklPUyBjb25maWd1cmF0aW9uLiAgTWFrZSBzdXJlIEFIQ0kgbW9kZSBpcwogCSAqIG9mZi4KQEAgLTE0NDEsMTAgKzE0NTQsNiBAQAogCX0KIAogCS8qIFNBVEEgbWFwIGluaXQgY2FuIGNoYW5nZSBwb3J0X2luZm8sIGRvIGl0IGJlZm9yZSBwcmVwcGluZyBob3N0ICovCi0JaHByaXYgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmhwcml2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFocHJpdikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KIAlpZiAocG9ydF9mbGFncyAmIEFUQV9GTEFHX1NBVEEpCiAJCWhwcml2LT5tYXAgPSBwaWl4X2luaXRfc2F0YV9tYXAocGRldiwgcG9ydF9pbmZvLAogCQkJCQlwaWl4X21hcF9kYl90YWJsZVtlbnQtPmRyaXZlcl9kYXRhXSk7CkBAIC0xNDYzLDcgKzE0NzIsNyBAQAogCX0KIAogCS8qIGFwcGx5IElPQ0ZHIGJpdDE4IHF1aXJrICovCi0JcGlpeF9pb2NmZ19iaXQxOF9xdWlyayhwZGV2KTsKKwlwaWl4X2lvY2ZnX2JpdDE4X3F1aXJrKGhvc3QpOwogCiAJLyogT24gSUNINSwgc29tZSBCSU9TZW4gZGlzYWJsZSB0aGUgaW50ZXJydXB0IHVzaW5nIHRoZQogCSAqIFBDSV9DT01NQU5EX0lOVFhfRElTQUJMRSBiaXQgYWRkZWQgaW4gUENJIDIuMy4KQEAgLTE0ODgsNiArMTQ5NywxNiBAQAogCXJldHVybiBhdGFfcGNpX3NmZl9hY3RpdmF0ZV9ob3N0KGhvc3QsIGF0YV9zZmZfaW50ZXJydXB0LCAmcGlpeF9zaHQpOwogfQogCitzdGF0aWMgdm9pZCBwaWl4X3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGF0YV9ob3N0ICpob3N0ID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOworCXN0cnVjdCBwaWl4X2hvc3RfcHJpdiAqaHByaXYgPSBob3N0LT5wcml2YXRlX2RhdGE7CisKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIFBJSVhfSU9DRkcsIGhwcml2LT5zYXZlZF9pb2NmZyk7CisKKwlhdGFfcGNpX3JlbW92ZV9vbmUocGRldik7Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IHBpaXhfaW5pdCh2b2lkKQogewogCWludCByYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS1jb3JlLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtY29yZS5jCmluZGV4IGZlY2NhNDIuLjE3NWRmNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS1jb3JlLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLWNvcmUuYwpAQCAtNTYsNiArNTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9hc3luYy5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KQEAgLTEwMDYsNiArMTAwNyw3IEBACiAJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGRfc3RyW10gPSB7CiAJCSIxLjUgR2JwcyIsCiAJCSIzLjAgR2JwcyIsCisJCSI2LjAgR2JwcyIsCiAJfTsKIAogCWlmIChzcGQgPT0gMCB8fCAoc3BkIC0gMSkgPj0gQVJSQVlfU0laRShzcGRfc3RyKSkKQEAgLTE5OTksNiArMjAwMSwxMCBAQAogCSAgIGFzIHRoZSBjYWxsZXIgc2hvdWxkIGtub3cgdGhpcyAqLwogCWlmIChhZGV2LT5saW5rLT5hcC0+ZmxhZ3MgJiBBVEFfRkxBR19OT19JT1JEWSkKIAkJcmV0dXJuIDA7CisJLyogQ0Ygc3BlYy4gcjQuMSBUYWJsZSAyMiBzYXlzIG5vIGlvcmR5IG9uIFBJTzUgYW5kIFBJTzYuICAqLworCWlmIChhdGFfaWRfaXNfY2ZhKGFkZXYtPmlkKQorCSAgICAmJiAoYWRldi0+cGlvX21vZGUgPT0gWEZFUl9QSU9fNSB8fCBhZGV2LT5waW9fbW9kZSA9PSBYRkVSX1BJT182KSkKKwkJcmV0dXJuIDA7CiAJLyogUElPMyBhbmQgaGlnaGVyIGl0IGlzIG1hbmRhdG9yeSAqLwogCWlmIChhZGV2LT5waW9fbW9kZSA+IFhGRVJfUElPXzIpCiAJCXJldHVybiAxOwpAQCAtNTkwOSw2ICs1OTE1LDU0IEBACiAJaG9zdC0+b3BzID0gb3BzOwogfQogCisKK3N0YXRpYyB2b2lkIGFzeW5jX3BvcnRfcHJvYmUodm9pZCAqZGF0YSwgYXN5bmNfY29va2llX3QgY29va2llKQoreworCWludCByYzsKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gZGF0YTsKKwkvKiBwcm9iZSAqLworCWlmIChhcC0+b3BzLT5lcnJvcl9oYW5kbGVyKSB7CisJCXN0cnVjdCBhdGFfZWhfaW5mbyAqZWhpID0gJmFwLT5saW5rLmVoX2luZm87CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJYXRhX3BvcnRfcHJvYmUoYXApOworCisJCS8qIGtpY2sgRUggZm9yIGJvb3QgcHJvYmluZyAqLworCQlzcGluX2xvY2tfaXJxc2F2ZShhcC0+bG9jaywgZmxhZ3MpOworCisJCWVoaS0+cHJvYmVfbWFzayB8PSBBVEFfQUxMX0RFVklDRVM7CisJCWVoaS0+YWN0aW9uIHw9IEFUQV9FSF9SRVNFVCB8IEFUQV9FSF9MUE07CisJCWVoaS0+ZmxhZ3MgfD0gQVRBX0VISV9OT19BVVRPUFNZIHwgQVRBX0VISV9RVUlFVDsKKworCQlhcC0+cGZsYWdzICY9IH5BVEFfUEZMQUdfSU5JVElBTElaSU5HOworCQlhcC0+cGZsYWdzIHw9IEFUQV9QRkxBR19MT0FESU5HOworCQlhdGFfcG9ydF9zY2hlZHVsZV9laChhcCk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShhcC0+bG9jaywgZmxhZ3MpOworCisJCS8qIHdhaXQgZm9yIEVIIHRvIGZpbmlzaCAqLworCQlhdGFfcG9ydF93YWl0X2VoKGFwKTsKKwl9IGVsc2UgeworCQlEUFJJTlRLKCJhdGEldTogYnVzIHByb2JlIGJlZ2luXG4iLCBhcC0+cHJpbnRfaWQpOworCQlyYyA9IGF0YV9idXNfcHJvYmUoYXApOworCQlEUFJJTlRLKCJhdGEldTogYnVzIHByb2JlIGVuZFxuIiwgYXAtPnByaW50X2lkKTsKKworCQlpZiAocmMpIHsKKwkJCS8qIEZJWE1FOiBkbyBzb21ldGhpbmcgdXNlZnVsIGhlcmU/CisJCQkgKiBDdXJyZW50IGxpYmF0YSBiZWhhdmlvciB3aWxsCisJCQkgKiB0ZWFyIGRvd24gZXZlcnl0aGluZyB3aGVuCisJCQkgKiB0aGUgbW9kdWxlIGlzIHJlbW92ZWQKKwkJCSAqIG9yIHRoZSBoL3cgaXMgdW5wbHVnZ2VkLgorCQkJICovCisJCX0KKwl9CisKKwkvKiBpbiBvcmRlciB0byBrZWVwIGRldmljZSBvcmRlciwgd2UgbmVlZCB0byBzeW5jaHJvbml6ZSBhdCB0aGlzIHBvaW50ICovCisJYXN5bmNfc3luY2hyb25pemVfY29va2llKGNvb2tpZSk7CisKKwlhdGFfc2NzaV9zY2FuX2hvc3QoYXAsIDEpOworCit9CiAvKioKICAqCWF0YV9ob3N0X3JlZ2lzdGVyIC0gcmVnaXN0ZXIgaW5pdGlhbGl6ZWQgQVRBIGhvc3QKICAqCUBob3N0OiBBVEEgaG9zdCB0byByZWdpc3RlcgpAQCAtNTk4OCw1MiArNjA0Miw5IEBACiAJRFBSSU5USygicHJvYmUgYmVnaW5cbiIpOwogCWZvciAoaSA9IDA7IGkgPCBob3N0LT5uX3BvcnRzOyBpKyspIHsKIAkJc3RydWN0IGF0YV9wb3J0ICphcCA9IGhvc3QtPnBvcnRzW2ldOwotCi0JCS8qIHByb2JlICovCi0JCWlmIChhcC0+b3BzLT5lcnJvcl9oYW5kbGVyKSB7Ci0JCQlzdHJ1Y3QgYXRhX2VoX2luZm8gKmVoaSA9ICZhcC0+bGluay5laF9pbmZvOwotCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCQkJYXRhX3BvcnRfcHJvYmUoYXApOwotCi0JCQkvKiBraWNrIEVIIGZvciBib290IHByb2JpbmcgKi8KLQkJCXNwaW5fbG9ja19pcnFzYXZlKGFwLT5sb2NrLCBmbGFncyk7Ci0KLQkJCWVoaS0+cHJvYmVfbWFzayB8PSBBVEFfQUxMX0RFVklDRVM7Ci0JCQllaGktPmFjdGlvbiB8PSBBVEFfRUhfUkVTRVQgfCBBVEFfRUhfTFBNOwotCQkJZWhpLT5mbGFncyB8PSBBVEFfRUhJX05PX0FVVE9QU1kgfCBBVEFfRUhJX1FVSUVUOwotCi0JCQlhcC0+cGZsYWdzICY9IH5BVEFfUEZMQUdfSU5JVElBTElaSU5HOwotCQkJYXAtPnBmbGFncyB8PSBBVEFfUEZMQUdfTE9BRElORzsKLQkJCWF0YV9wb3J0X3NjaGVkdWxlX2VoKGFwKTsKLQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShhcC0+bG9jaywgZmxhZ3MpOwotCi0JCQkvKiB3YWl0IGZvciBFSCB0byBmaW5pc2ggKi8KLQkJCWF0YV9wb3J0X3dhaXRfZWgoYXApOwotCQl9IGVsc2UgewotCQkJRFBSSU5USygiYXRhJXU6IGJ1cyBwcm9iZSBiZWdpblxuIiwgYXAtPnByaW50X2lkKTsKLQkJCXJjID0gYXRhX2J1c19wcm9iZShhcCk7Ci0JCQlEUFJJTlRLKCJhdGEldTogYnVzIHByb2JlIGVuZFxuIiwgYXAtPnByaW50X2lkKTsKLQotCQkJaWYgKHJjKSB7Ci0JCQkJLyogRklYTUU6IGRvIHNvbWV0aGluZyB1c2VmdWwgaGVyZT8KLQkJCQkgKiBDdXJyZW50IGxpYmF0YSBiZWhhdmlvciB3aWxsCi0JCQkJICogdGVhciBkb3duIGV2ZXJ5dGhpbmcgd2hlbgotCQkJCSAqIHRoZSBtb2R1bGUgaXMgcmVtb3ZlZAotCQkJCSAqIG9yIHRoZSBoL3cgaXMgdW5wbHVnZ2VkLgotCQkJCSAqLwotCQkJfQotCQl9CisJCWFzeW5jX3NjaGVkdWxlKGFzeW5jX3BvcnRfcHJvYmUsIGFwKTsKIAl9Ci0KLQkvKiBwcm9iZXMgYXJlIGRvbmUsIG5vdyBzY2FuIGVhY2ggcG9ydCdzIGRpc2socykgKi8KLQlEUFJJTlRLKCJob3N0IHByb2JlIGJlZ2luXG4iKTsKLQlmb3IgKGkgPSAwOyBpIDwgaG9zdC0+bl9wb3J0czsgaSsrKSB7Ci0JCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBob3N0LT5wb3J0c1tpXTsKLQotCQlhdGFfc2NzaV9zY2FuX2hvc3QoYXAsIDEpOwotCX0KKwlEUFJJTlRLKCJwcm9iZSBlbmRcbiIpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9saWJhdGEtc2NzaS5jIGIvZHJpdmVycy9hdGEvbGliYXRhLXNjc2kuYwppbmRleCA0MDQwZDhiLi45ZTkyMTA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhdGEtc2NzaS5jCisrKyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMKQEAgLTMzNjksNyArMzM2OSw3IEBACiAKIAlpZiAoc2RldikgewogCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fSU5GTywgImRldGFjaGluZyAoU0NTSSAlcylcbiIsCi0JCQkgICAgICAgc2Rldi0+c2Rldl9nZW5kZXYuYnVzX2lkKTsKKwkJCSAgICAgICBkZXZfbmFtZSgmc2Rldi0+c2Rldl9nZW5kZXYpKTsKIAogCQlzY3NpX3JlbW92ZV9kZXZpY2Uoc2Rldik7CiAJCXNjc2lfZGV2aWNlX3B1dChzZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS1zZmYuYyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1zZmYuYwppbmRleCA5MDMzZDE2Li5jNTlhZDc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhdGEtc2ZmLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLXNmZi5jCkBAIC02Niw2ICs2Niw3IEBACiAKIAkucG9ydF9zdGFydAkJPSBhdGFfc2ZmX3BvcnRfc3RhcnQsCiB9OworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9wb3J0X29wcyk7CiAKIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGF0YV9ibWRtYV9wb3J0X29wcyA9IHsKIAkuaW5oZXJpdHMJCT0gJmF0YV9zZmZfcG9ydF9vcHMsCkBAIC03Nyw2ICs3OCwxNCBAQAogCS5ibWRtYV9zdG9wCQk9IGF0YV9ibWRtYV9zdG9wLAogCS5ibWRtYV9zdGF0dXMJCT0gYXRhX2JtZG1hX3N0YXR1cywKIH07CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfYm1kbWFfcG9ydF9vcHMpOworCitjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBhdGFfYm1kbWEzMl9wb3J0X29wcyA9IHsKKwkuaW5oZXJpdHMJCT0gJmF0YV9ibWRtYV9wb3J0X29wcywKKworCS5zZmZfZGF0YV94ZmVyCQk9IGF0YV9zZmZfZGF0YV94ZmVyMzIsCit9OworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2JtZG1hMzJfcG9ydF9vcHMpOwogCiAvKioKICAqCWF0YV9maWxsX3NnIC0gRmlsbCBQQ0kgSURFIFBSRCB0YWJsZQpAQCAtMTY2LDggKzE3NSw5IEBACiAJCQlibGVuID0gbGVuICYgMHhmZmZmOwogCQkJYXAtPnByZFtwaV0uYWRkciA9IGNwdV90b19sZTMyKGFkZHIpOwogCQkJaWYgKGJsZW4gPT0gMCkgewotCQkJICAgLyogU29tZSBQQVRBIGNoaXBzZXRzIGxpa2UgdGhlIENTNTUzMCBjYW4ndAotCQkJICAgICAgY29wZSB3aXRoIDB4MDAwMCBtZWFuaW5nIDY0SyBhcyB0aGUgc3BlYyBzYXlzICovCisJCQkJLyogU29tZSBQQVRBIGNoaXBzZXRzIGxpa2UgdGhlIENTNTUzMCBjYW4ndAorCQkJCSAgIGNvcGUgd2l0aCAweDAwMDAgbWVhbmluZyA2NEsgYXMgdGhlIHNwZWMKKwkJCQkgICBzYXlzICovCiAJCQkJYXAtPnByZFtwaV0uZmxhZ3NfbGVuID0gY3B1X3RvX2xlMzIoMHg4MDAwKTsKIAkJCQlibGVuID0gMHg4MDAwOwogCQkJCWFwLT5wcmRbKytwaV0uYWRkciA9IGNwdV90b19sZTMyKGFkZHIgKyAweDgwMDApOwpAQCAtMjAwLDYgKzIxMCw3IEBACiAKIAlhdGFfZmlsbF9zZyhxYyk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX3FjX3ByZXApOwogCiAvKioKICAqCWF0YV9zZmZfZHVtYl9xY19wcmVwIC0gUHJlcGFyZSB0YXNrZmlsZSBmb3Igc3VibWlzc2lvbgpAQCAtMjE3LDYgKzIyOCw3IEBACiAKIAlhdGFfZmlsbF9zZ19kdW1iKHFjKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfZHVtYl9xY19wcmVwKTsKIAogLyoqCiAgKglhdGFfc2ZmX2NoZWNrX3N0YXR1cyAtIFJlYWQgZGV2aWNlIHN0YXR1cyByZWcgJiBjbGVhciBpbnRlcnJ1cHQKQEAgLTIzMyw2ICsyNDUsNyBAQAogewogCXJldHVybiBpb3JlYWQ4KGFwLT5pb2FkZHIuc3RhdHVzX2FkZHIpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9jaGVja19zdGF0dXMpOwogCiAvKioKICAqCWF0YV9zZmZfYWx0c3RhdHVzIC0gUmVhZCBkZXZpY2UgYWx0ZXJuYXRlIHN0YXR1cyByZWcKQEAgLTI3NSw3ICsyODgsNyBAQAogCQlzdGF0dXMgPSBhdGFfc2ZmX2FsdHN0YXR1cyhhcCk7CiAJCS8qIE5vdCB1czogV2UgYXJlIGJ1c3kgKi8KIAkJaWYgKHN0YXR1cyAmIEFUQV9CVVNZKQotCQkgICAgCXJldHVybiBzdGF0dXM7CisJCQlyZXR1cm4gc3RhdHVzOwogCX0KIAkvKiBDbGVhciBJTlRSUSBsYXRjaCAqLwogCXN0YXR1cyA9IGFwLT5vcHMtPnNmZl9jaGVja19zdGF0dXMoYXApOwpAQCAtMzE5LDYgKzMzMiw3IEBACiAJYXRhX3NmZl9zeW5jKGFwKTsKIAluZGVsYXkoNDAwKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfcGF1c2UpOwogCiAvKioKICAqCWF0YV9zZmZfZG1hX3BhdXNlCS0JUGF1c2UgYmVmb3JlIGNvbW1lbmNpbmcgRE1BCkBAIC0zMjcsNyArMzQxLDcgQEAKICAqCVBlcmZvcm0gSS9PIGZlbmNpbmcgYW5kIGVuc3VyZSBzdWZmaWNpZW50IGN5Y2xlIGRlbGF5cyBvY2N1cgogICoJZm9yIHRoZSBIRE1BMTowIHRyYW5zaXRpb24KICAqLwotIAorCiB2b2lkIGF0YV9zZmZfZG1hX3BhdXNlKHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CiAJaWYgKGFwLT5vcHMtPnNmZl9jaGVja19hbHRzdGF0dXMgfHwgYXAtPmlvYWRkci5hbHRzdGF0dXNfYWRkcikgewpAQCAtMzQxLDYgKzM1NSw3IEBACiAJICAgY29ycnVwdGlvbi4gKi8KIAlCVUcoKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfZG1hX3BhdXNlKTsKIAogLyoqCiAgKglhdGFfc2ZmX2J1c3lfc2xlZXAgLSBzbGVlcCB1bnRpbCBCU1kgY2xlYXJzLCBvciB0aW1lb3V0CkBAIC0zOTYsNiArNDExLDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9idXN5X3NsZWVwKTsKIAogc3RhdGljIGludCBhdGFfc2ZmX2NoZWNrX3JlYWR5KHN0cnVjdCBhdGFfbGluayAqbGluaykKIHsKQEAgLTQyMiw2ICs0MzgsNyBAQAogewogCXJldHVybiBhdGFfd2FpdF9yZWFkeShsaW5rLCBkZWFkbGluZSwgYXRhX3NmZl9jaGVja19yZWFkeSk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX3dhaXRfcmVhZHkpOwogCiAvKioKICAqCWF0YV9zZmZfZGV2X3NlbGVjdCAtIFNlbGVjdCBkZXZpY2UgMC8xIG9uIEFUQSBidXMKQEAgLTQ0OSw2ICs0NjYsNyBAQAogCWlvd3JpdGU4KHRtcCwgYXAtPmlvYWRkci5kZXZpY2VfYWRkcik7CiAJYXRhX3NmZl9wYXVzZShhcCk7CS8qIG5lZWRlZDsgYWxzbyBmbHVzaGVzLCBmb3IgbW1pbyAqLwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9kZXZfc2VsZWN0KTsKIAogLyoqCiAgKglhdGFfZGV2X3NlbGVjdCAtIFNlbGVjdCBkZXZpY2UgMC8xIG9uIEFUQSBidXMKQEAgLTUxMyw2ICs1MzEsNyBAQAogCiAJcmV0dXJuIHRtcDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfaXJxX29uKTsKIAogLyoqCiAgKglhdGFfc2ZmX2lycV9jbGVhciAtIENsZWFyIFBDSSBJREUgQk1ETUEgaW50ZXJydXB0LgpAQCAtNTM0LDYgKzU1Myw3IEBACiAKIAlpb3dyaXRlOChpb3JlYWQ4KG1taW8gKyBBVEFfRE1BX1NUQVRVUyksIG1taW8gKyBBVEFfRE1BX1NUQVRVUyk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX2lycV9jbGVhcik7CiAKIC8qKgogICoJYXRhX3NmZl90Zl9sb2FkIC0gc2VuZCB0YXNrZmlsZSByZWdpc3RlcnMgdG8gaG9zdCBjb250cm9sbGVyCkBAIC01OTMsNiArNjEzLDcgQEAKIAogCWF0YV93YWl0X2lkbGUoYXApOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl90Zl9sb2FkKTsKIAogLyoqCiAgKglhdGFfc2ZmX3RmX3JlYWQgLSBpbnB1dCBkZXZpY2UncyBBVEEgdGFza2ZpbGUgc2hhZG93IHJlZ2lzdGVycwpAQCAtNjMzLDYgKzY1NCw3IEBACiAJCQlXQVJOX09OKDEpOwogCX0KIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfdGZfcmVhZCk7CiAKIC8qKgogICoJYXRhX3NmZl9leGVjX2NvbW1hbmQgLSBpc3N1ZSBBVEEgY29tbWFuZCB0byBob3N0IGNvbnRyb2xsZXIKQEAgLTY1Miw2ICs2NzQsNyBAQAogCWlvd3JpdGU4KHRmLT5jb21tYW5kLCBhcC0+aW9hZGRyLmNvbW1hbmRfYWRkcik7CiAJYXRhX3NmZl9wYXVzZShhcCk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX2V4ZWNfY29tbWFuZCk7CiAKIC8qKgogICoJYXRhX3RmX3RvX2hvc3QgLSBpc3N1ZSBBVEEgdGFza2ZpbGUgdG8gaG9zdCBjb250cm9sbGVyCkBAIC03MTcsNiArNzQwLDUzIEBACiAKIAlyZXR1cm4gd29yZHMgPDwgMTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfZGF0YV94ZmVyKTsKKworLyoqCisgKglhdGFfc2ZmX2RhdGFfeGZlcjMyIC0gVHJhbnNmZXIgZGF0YSBieSBQSU8KKyAqCUBkZXY6IGRldmljZSB0byB0YXJnZXQKKyAqCUBidWY6IGRhdGEgYnVmZmVyCisgKglAYnVmbGVuOiBidWZmZXIgbGVuZ3RoCisgKglAcnc6IHJlYWQvd3JpdGUKKyAqCisgKglUcmFuc2ZlciBkYXRhIGZyb20vdG8gdGhlIGRldmljZSBkYXRhIHJlZ2lzdGVyIGJ5IFBJTyB1c2luZyAzMmJpdAorICoJSS9PIG9wZXJhdGlvbnMuCisgKgorICoJTE9DS0lORzoKKyAqCUluaGVyaXRlZCBmcm9tIGNhbGxlci4KKyAqCisgKglSRVRVUk5TOgorICoJQnl0ZXMgY29uc3VtZWQuCisgKi8KKwordW5zaWduZWQgaW50IGF0YV9zZmZfZGF0YV94ZmVyMzIoc3RydWN0IGF0YV9kZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciAqYnVmLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBidWZsZW4sIGludCBydykKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gZGV2LT5saW5rLT5hcDsKKwl2b2lkIF9faW9tZW0gKmRhdGFfYWRkciA9IGFwLT5pb2FkZHIuZGF0YV9hZGRyOworCXVuc2lnbmVkIGludCB3b3JkcyA9IGJ1ZmxlbiA+PiAyOworCWludCBzbG9wID0gYnVmbGVuICYgMzsKKworCS8qIFRyYW5zZmVyIG11bHRpcGxlIG9mIDQgYnl0ZXMgKi8KKwlpZiAocncgPT0gUkVBRCkKKwkJaW9yZWFkMzJfcmVwKGRhdGFfYWRkciwgYnVmLCB3b3Jkcyk7CisJZWxzZQorCQlpb3dyaXRlMzJfcmVwKGRhdGFfYWRkciwgYnVmLCB3b3Jkcyk7CisKKwlpZiAodW5saWtlbHkoc2xvcCkpIHsKKwkJX19sZTMyIHBhZDsKKwkJaWYgKHJ3ID09IFJFQUQpIHsKKwkJCXBhZCA9IGNwdV90b19sZTMyKGlvcmVhZDMyKGFwLT5pb2FkZHIuZGF0YV9hZGRyKSk7CisJCQltZW1jcHkoYnVmICsgYnVmbGVuIC0gc2xvcCwgJnBhZCwgc2xvcCk7CisJCX0gZWxzZSB7CisJCQltZW1jcHkoJnBhZCwgYnVmICsgYnVmbGVuIC0gc2xvcCwgc2xvcCk7CisJCQlpb3dyaXRlMzIobGUzMl90b19jcHUocGFkKSwgYXAtPmlvYWRkci5kYXRhX2FkZHIpOworCQl9CisJCXdvcmRzKys7CisJfQorCXJldHVybiB3b3JkcyA8PCAyOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9kYXRhX3hmZXIzMik7CiAKIC8qKgogICoJYXRhX3NmZl9kYXRhX3hmZXJfbm9pcnEgLSBUcmFuc2ZlciBkYXRhIGJ5IFBJTwpAQCAtNzQ2LDYgKzgxNiw3IEBACiAKIAlyZXR1cm4gY29uc3VtZWQ7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX2RhdGFfeGZlcl9ub2lycSk7CiAKIC8qKgogICoJYXRhX3Bpb19zZWN0b3IgLSBUcmFuc2ZlciBhIHNlY3RvciBvZiBkYXRhLgpAQCAtOTIyLDEzICs5OTMsMTUgQEAKIAkJYnVmID0ga21hcF9hdG9taWMocGFnZSwgS01fSVJRMCk7CiAKIAkJLyogZG8gdGhlIGFjdHVhbCBkYXRhIHRyYW5zZmVyICovCi0JCWNvbnN1bWVkID0gYXAtPm9wcy0+c2ZmX2RhdGFfeGZlcihkZXYsICBidWYgKyBvZmZzZXQsIGNvdW50LCBydyk7CisJCWNvbnN1bWVkID0gYXAtPm9wcy0+c2ZmX2RhdGFfeGZlcihkZXYsICBidWYgKyBvZmZzZXQsCisJCQkJCQkJCWNvdW50LCBydyk7CiAKIAkJa3VubWFwX2F0b21pYyhidWYsIEtNX0lSUTApOwogCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJfSBlbHNlIHsKIAkJYnVmID0gcGFnZV9hZGRyZXNzKHBhZ2UpOwotCQljb25zdW1lZCA9IGFwLT5vcHMtPnNmZl9kYXRhX3hmZXIoZGV2LCAgYnVmICsgb2Zmc2V0LCBjb3VudCwgcncpOworCQljb25zdW1lZCA9IGFwLT5vcHMtPnNmZl9kYXRhX3hmZXIoZGV2LCAgYnVmICsgb2Zmc2V0LAorCQkJCQkJCQljb3VudCwgcncpOwogCX0KIAogCWJ5dGVzIC09IG1pbihieXRlcywgY29uc3VtZWQpOwpAQCAtMTAxMywxOCArMTA4NiwxOSBAQAogICoJUkVUVVJOUzoKICAqCTEgaWYgb2sgaW4gd29ya3F1ZXVlLCAwIG90aGVyd2lzZS4KICAqLwotc3RhdGljIGlubGluZSBpbnQgYXRhX2hzbV9va19pbl93cShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQorc3RhdGljIGlubGluZSBpbnQgYXRhX2hzbV9va19pbl93cShzdHJ1Y3QgYXRhX3BvcnQgKmFwLAorCQkJCQkJc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKIHsKIAlpZiAocWMtPnRmLmZsYWdzICYgQVRBX1RGTEFHX1BPTExJTkcpCiAJCXJldHVybiAxOwogCiAJaWYgKGFwLT5oc21fdGFza19zdGF0ZSA9PSBIU01fU1RfRklSU1QpIHsKIAkJaWYgKHFjLT50Zi5wcm90b2NvbCA9PSBBVEFfUFJPVF9QSU8gJiYKLQkJICAgIChxYy0+dGYuZmxhZ3MgJiBBVEFfVEZMQUdfV1JJVEUpKQorCQkgICAocWMtPnRmLmZsYWdzICYgQVRBX1RGTEFHX1dSSVRFKSkKIAkJICAgIHJldHVybiAxOwogCiAJCWlmIChhdGFfaXNfYXRhcGkocWMtPnRmLnByb3RvY29sKSAmJgotCQkgICAgIShxYy0+ZGV2LT5mbGFncyAmIEFUQV9ERkxBR19DREJfSU5UUikpCisJCSAgICEocWMtPmRldi0+ZmxhZ3MgJiBBVEFfREZMQUdfQ0RCX0lOVFIpKQogCQkJcmV0dXJuIDE7CiAJfQogCkBAIC0xMzM4LDYgKzE0MTIsNyBAQAogCiAJcmV0dXJuIHBvbGxfbmV4dDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfaHNtX21vdmUpOwogCiB2b2lkIGF0YV9waW9fdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CkBAIC0xNTA3LDYgKzE1ODIsNyBAQAogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX3FjX2lzc3VlKTsKIAogLyoqCiAgKglhdGFfc2ZmX3FjX2ZpbGxfcnRmIC0gZmlsbCByZXN1bHQgVEYgdXNpbmcgLT5zZmZfdGZfcmVhZApAQCAtMTUyNiw2ICsxNjAyLDcgQEAKIAlxYy0+YXAtPm9wcy0+c2ZmX3RmX3JlYWQocWMtPmFwLCAmcWMtPnJlc3VsdF90Zik7CiAJcmV0dXJuIHRydWU7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX3FjX2ZpbGxfcnRmKTsKIAogLyoqCiAgKglhdGFfc2ZmX2hvc3RfaW50ciAtIEhhbmRsZSBob3N0IGludGVycnVwdCBmb3IgZ2l2ZW4gKHBvcnQsIHRhc2spCkBAIC0xNjIzLDYgKzE3MDAsNyBAQAogI2VuZGlmCiAJcmV0dXJuIDA7CS8qIGlycSBub3QgaGFuZGxlZCAqLwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9ob3N0X2ludHIpOwogCiAvKioKICAqCWF0YV9zZmZfaW50ZXJydXB0IC0gRGVmYXVsdCBBVEEgaG9zdCBpbnRlcnJ1cHQgaGFuZGxlcgpAQCAtMTY2Nyw2ICsxNzQ1LDcgQEAKIAogCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9pbnRlcnJ1cHQpOwogCiAvKioKICAqCWF0YV9zZmZfZnJlZXplIC0gRnJlZXplIFNGRiBjb250cm9sbGVyIHBvcnQKQEAgLTE2OTUsNiArMTc3NCw3IEBACiAKIAlhcC0+b3BzLT5zZmZfaXJxX2NsZWFyKGFwKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfZnJlZXplKTsKIAogLyoqCiAgKglhdGFfc2ZmX3RoYXcgLSBUaGF3IFNGRiBjb250cm9sbGVyIHBvcnQKQEAgLTE3MTIsNiArMTc5Miw3IEBACiAJYXAtPm9wcy0+c2ZmX2lycV9jbGVhcihhcCk7CiAJYXAtPm9wcy0+c2ZmX2lycV9vbihhcCk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX3RoYXcpOwogCiAvKioKICAqCWF0YV9zZmZfcHJlcmVzZXQgLSBwcmVwYXJlIFNGRiBsaW5rIGZvciByZXNldApAQCAtMTc1Myw2ICsxODM0LDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9wcmVyZXNldCk7CiAKIC8qKgogICoJYXRhX2RldmNoayAtIFBBVEEgZGV2aWNlIHByZXNlbmNlIGRldGVjdGlvbgpAQCAtMTg2NSw2ICsxOTQ3LDcgQEAKIAogCXJldHVybiBjbGFzczsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfZGV2X2NsYXNzaWZ5KTsKIAogLyoqCiAgKglhdGFfc2ZmX3dhaXRfYWZ0ZXJfcmVzZXQgLSB3YWl0IGZvciBkZXZpY2VzIHRvIGJlY29tZSByZWFkeSBhZnRlciByZXNldApAQCAtMTk0MSw2ICsyMDI0LDcgQEAKIAogCXJldHVybiByZXQ7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX3dhaXRfYWZ0ZXJfcmVzZXQpOwogCiBzdGF0aWMgaW50IGF0YV9idXNfc29mdHJlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBkZXZtYXNrLAogCQkJICAgICB1bnNpZ25lZCBsb25nIGRlYWRsaW5lKQpAQCAtMjAxMyw2ICsyMDk3LDcgQEAKIAlEUFJJTlRLKCJFWElULCBjbGFzc2VzWzBdPSV1IFsxXT0ldVxuIiwgY2xhc3Nlc1swXSwgY2xhc3Nlc1sxXSk7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX3NvZnRyZXNldCk7CiAKIC8qKgogICoJc2F0YV9zZmZfaGFyZHJlc2V0IC0gcmVzZXQgaG9zdCBwb3J0IHZpYSBTQVRBIHBoeSByZXNldApAQCAtMjA0NSw2ICsyMTMwLDcgQEAKIAlEUFJJTlRLKCJFWElULCBjbGFzcz0ldVxuIiwgKmNsYXNzKTsKIAlyZXR1cm4gcmM7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChzYXRhX3NmZl9oYXJkcmVzZXQpOwogCiAvKioKICAqCWF0YV9zZmZfcG9zdHJlc2V0IC0gU0ZGIHBvc3RyZXNldCBjYWxsYmFjawpAQCAtMjA4MCw2ICsyMTY2LDcgQEAKIAlpZiAoYXAtPmlvYWRkci5jdGxfYWRkcikKIAkJaW93cml0ZTgoYXAtPmN0bCwgYXAtPmlvYWRkci5jdGxfYWRkcik7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX3Bvc3RyZXNldCk7CiAKIC8qKgogICoJYXRhX3NmZl9lcnJvcl9oYW5kbGVyIC0gU3RvY2sgZXJyb3IgaGFuZGxlciBmb3IgQk1ETUEgY29udHJvbGxlcgpAQCAtMjE1Miw2ICsyMjM5LDcgQEAKIAlhdGFfZG9fZWgoYXAsIGFwLT5vcHMtPnByZXJlc2V0LCBzb2Z0cmVzZXQsIGhhcmRyZXNldCwKIAkJICBhcC0+b3BzLT5wb3N0cmVzZXQpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9lcnJvcl9oYW5kbGVyKTsKIAogLyoqCiAgKglhdGFfc2ZmX3Bvc3RfaW50ZXJuYWxfY21kIC0gU3RvY2sgcG9zdF9pbnRlcm5hbF9jbWQgZm9yIFNGRiBjb250cm9sbGVyCkBAIC0yMTc0LDYgKzIyNjIsNyBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShhcC0+bG9jaywgZmxhZ3MpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9wb3N0X2ludGVybmFsX2NtZCk7CiAKIC8qKgogICoJYXRhX3NmZl9wb3J0X3N0YXJ0IC0gU2V0IHBvcnQgdXAgZm9yIGRtYS4KQEAgLTIxOTQsNiArMjI4Myw3IEBACiAJCXJldHVybiBhdGFfcG9ydF9zdGFydChhcCk7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX3BvcnRfc3RhcnQpOwogCiAvKioKICAqCWF0YV9zZmZfc3RkX3BvcnRzIC0gaW5pdGlhbGl6ZSBpb2FkZHIgd2l0aCBzdGFuZGFyZCBwb3J0IG9mZnNldHMuCkBAIC0yMjE5LDYgKzIzMDksNyBAQAogCWlvYWRkci0+c3RhdHVzX2FkZHIgPSBpb2FkZHItPmNtZF9hZGRyICsgQVRBX1JFR19TVEFUVVM7CiAJaW9hZGRyLT5jb21tYW5kX2FkZHIgPSBpb2FkZHItPmNtZF9hZGRyICsgQVRBX1JFR19DTUQ7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX3N0ZF9wb3J0cyk7CiAKIHVuc2lnbmVkIGxvbmcgYXRhX2JtZG1hX21vZGVfZmlsdGVyKHN0cnVjdCBhdGFfZGV2aWNlICphZGV2LAogCQkJCSAgICB1bnNpZ25lZCBsb25nIHhmZXJfbWFzaykKQEAgLTIyMzAsNiArMjMyMSw3IEBACiAJCXhmZXJfbWFzayAmPSB+KEFUQV9NQVNLX01XRE1BIHwgQVRBX01BU0tfVURNQSk7CiAJcmV0dXJuIHhmZXJfbWFzazsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9ibWRtYV9tb2RlX2ZpbHRlcik7CiAKIC8qKgogICoJYXRhX2JtZG1hX3NldHVwIC0gU2V0IHVwIFBDSSBJREUgQk1ETUEgdHJhbnNhY3Rpb24KQEAgLTIyNTgsNiArMjM1MCw3IEBACiAJLyogaXNzdWUgci93IGNvbW1hbmQgKi8KIAlhcC0+b3BzLT5zZmZfZXhlY19jb21tYW5kKGFwLCAmcWMtPnRmKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9ibWRtYV9zZXR1cCk7CiAKIC8qKgogICoJYXRhX2JtZG1hX3N0YXJ0IC0gU3RhcnQgYSBQQ0kgSURFIEJNRE1BIHRyYW5zYWN0aW9uCkBAIC0yMjkwLDYgKzIzODMsNyBAQAogCSAqIHVubmVjY2Vzc2FyaWx5IGRlbGF5ZWQgZm9yIE1NSU8KIAkgKi8KIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9ibWRtYV9zdGFydCk7CiAKIC8qKgogICoJYXRhX2JtZG1hX3N0b3AgLSBTdG9wIFBDSSBJREUgQk1ETUEgdHJhbnNmZXIKQEAgLTIzMTQsNiArMjQwOCw3IEBACiAJLyogb25lLVBJTy1jeWNsZSBndWFyYW50ZWVkIHdhaXQsIHBlciBzcGVjLCBmb3IgSERNQTE6MCB0cmFuc2l0aW9uICovCiAJYXRhX3NmZl9kbWFfcGF1c2UoYXApOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2JtZG1hX3N0b3ApOwogCiAvKioKICAqCWF0YV9ibWRtYV9zdGF0dXMgLSBSZWFkIFBDSSBJREUgQk1ETUEgc3RhdHVzCkBAIC0yMzMwLDYgKzI0MjUsNyBAQAogewogCXJldHVybiBpb3JlYWQ4KGFwLT5pb2FkZHIuYm1kbWFfYWRkciArIEFUQV9ETUFfU1RBVFVTKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9ibWRtYV9zdGF0dXMpOwogCiAvKioKICAqCWF0YV9idXNfcmVzZXQgLSByZXNldCBob3N0IHBvcnQgYW5kIGFzc29jaWF0ZWQgQVRBIGNoYW5uZWwKQEAgLTI0MjIsNiArMjUxOCw3IEBACiAKIAlEUFJJTlRLKCJFWElUXG4iKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9idXNfcmVzZXQpOwogCiAjaWZkZWYgQ09ORklHX1BDSQogCkBAIC0yNDQ5LDYgKzI1NDYsNyBAQAogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfcGNpX2JtZG1hX2NsZWFyX3NpbXBsZXgpOwogCiAvKioKICAqCWF0YV9wY2lfYm1kbWFfaW5pdCAtIGFjcXVpcmUgUENJIEJNRE1BIHJlc291cmNlcyBhbmQgaW5pdCBBVEEgaG9zdApAQCAtMjUwMSwxMSArMjU5OSwxMiBAQAogCQkJaG9zdC0+ZmxhZ3MgfD0gQVRBX0hPU1RfU0lNUExFWDsKIAogCQlhdGFfcG9ydF9kZXNjKGFwLCAiYm1kbWEgMHglbGx4IiwKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDQpICsgOCAqIGkpOworCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgNCkgKyA4ICogaSk7CiAJfQogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfcGNpX2JtZG1hX2luaXQpOwogCiBzdGF0aWMgaW50IGF0YV9yZXNvdXJjZXNfcHJlc2VudChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IHBvcnQpCiB7CkBAIC0yNTEzLDcgKzI2MTIsNyBAQAogCiAJLyogQ2hlY2sgdGhlIFBDSSByZXNvdXJjZXMgZm9yIHRoaXMgY2hhbm5lbCBhcmUgZW5hYmxlZCAqLwogCXBvcnQgPSBwb3J0ICogMjsKLQlmb3IgKGkgPSAwOyBpIDwgMjsgaSArKykgeworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKIAkJaWYgKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBwb3J0ICsgaSkgPT0gMCB8fAogCQkgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCBwb3J0ICsgaSkgPT0gMCkKIAkJCXJldHVybiAwOwpAQCAtMjU5OCw2ICsyNjk3LDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3BjaV9zZmZfaW5pdF9ob3N0KTsKIAogLyoqCiAgKglhdGFfcGNpX3NmZl9wcmVwYXJlX2hvc3QgLSBoZWxwZXIgdG8gcHJlcGFyZSBuYXRpdmUgUENJIEFUQSBob3N0CkBAIC0yNjE1LDcgKzI3MTUsNyBAQAogICoJMCBvbiBzdWNjZXNzLCAtZXJybm8gb3RoZXJ3aXNlLgogICovCiBpbnQgYXRhX3BjaV9zZmZfcHJlcGFyZV9ob3N0KHN0cnVjdCBwY2lfZGV2ICpwZGV2LAotCQkJICAgICBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqIGNvbnN0ICogcHBpLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqIGNvbnN0ICpwcGksCiAJCQkgICAgIHN0cnVjdCBhdGFfaG9zdCAqKnJfaG9zdCkKIHsKIAlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3Q7CkBAIC0yNjQ1LDE3ICsyNzQ1LDE4IEBACiAJKnJfaG9zdCA9IGhvc3Q7CiAJcmV0dXJuIDA7CiAKLSBlcnJfYm1kbWE6CitlcnJfYm1kbWE6CiAJLyogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBQQ0kgYW5kIGlvbWFwIHJlc291cmNlcyBhcmUKIAkgKiBtZXJnZWQgYW5kIHJlbGVhc2luZyB0aGUgdG9wIGdyb3VwIHdvbid0IHJlbGVhc2UgdGhlCiAJICogYWNxdWlyZWQgcmVzb3VyY2VzIGlmIHNvbWUgb2YgdGhvc2UgaGF2ZSBiZWVuIGFjcXVpcmVkCiAJICogYmVmb3JlIGVudGVyaW5nIHRoaXMgZnVuY3Rpb24uCiAJICovCiAJcGNpbV9pb3VubWFwX3JlZ2lvbnMocGRldiwgMHhmKTsKLSBlcnJfb3V0OgorZXJyX291dDoKIAlkZXZyZXNfcmVsZWFzZV9ncm91cCgmcGRldi0+ZGV2LCBOVUxMKTsKIAlyZXR1cm4gcmM7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfcGNpX3NmZl9wcmVwYXJlX2hvc3QpOwogCiAvKioKICAqCWF0YV9wY2lfc2ZmX2FjdGl2YXRlX2hvc3QgLSBzdGFydCBTRkYgaG9zdCwgcmVxdWVzdCBJUlEgYW5kIHJlZ2lzdGVyIGl0CkBAIC0yNzQxLDcgKzI4NDIsNyBAQAogCX0KIAogCXJjID0gYXRhX2hvc3RfcmVnaXN0ZXIoaG9zdCwgc2h0KTsKLSBvdXQ6CitvdXQ6CiAJaWYgKHJjID09IDApCiAJCWRldnJlc19yZW1vdmVfZ3JvdXAoZGV2LCBOVUxMKTsKIAllbHNlCkBAIC0yNzQ5LDYgKzI4NTAsNyBAQAogCiAJcmV0dXJuIHJjOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3BjaV9zZmZfYWN0aXZhdGVfaG9zdCk7CiAKIC8qKgogICoJYXRhX3BjaV9zZmZfaW5pdF9vbmUgLSBJbml0aWFsaXplL3JlZ2lzdGVyIFBDSSBJREUgaG9zdCBjb250cm9sbGVyCkBAIC0yNzc2LDcgKzI4NzgsNyBAQAogICoJWmVybyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBlcnJuby1iYXNlZCB2YWx1ZSBvbiBlcnJvci4KICAqLwogaW50IGF0YV9wY2lfc2ZmX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAotCQkJIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICogY29uc3QgKiBwcGksCisJCQkgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKiBjb25zdCAqcHBpLAogCQkJIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnNodCwgdm9pZCAqaG9zdF9wcml2KQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CkBAIC0yODE1LDcgKzI5MTcsNyBAQAogCiAJcGNpX3NldF9tYXN0ZXIocGRldik7CiAJcmMgPSBhdGFfcGNpX3NmZl9hY3RpdmF0ZV9ob3N0KGhvc3QsIGF0YV9zZmZfaW50ZXJydXB0LCBzaHQpOwotIG91dDoKK291dDoKIAlpZiAocmMgPT0gMCkKIAkJZGV2cmVzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LCBOVUxMKTsKIAllbHNlCkBAIC0yODIzLDU0ICsyOTI1LDcgQEAKIAogCXJldHVybiByYzsKIH0KLQotI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KLQotRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9wb3J0X29wcyk7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfYm1kbWFfcG9ydF9vcHMpOwotRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9xY19wcmVwKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfZHVtYl9xY19wcmVwKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfZGV2X3NlbGVjdCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX2NoZWNrX3N0YXR1cyk7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX2RtYV9wYXVzZSk7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX3BhdXNlKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfYnVzeV9zbGVlcCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX3dhaXRfcmVhZHkpOwotRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl90Zl9sb2FkKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfdGZfcmVhZCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX2V4ZWNfY29tbWFuZCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX2RhdGFfeGZlcik7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX2RhdGFfeGZlcl9ub2lycSk7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX2lycV9vbik7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX2lycV9jbGVhcik7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX2hzbV9tb3ZlKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfcWNfaXNzdWUpOwotRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9xY19maWxsX3J0Zik7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX2hvc3RfaW50cik7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX2ludGVycnVwdCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX2ZyZWV6ZSk7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX3RoYXcpOwotRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9wcmVyZXNldCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX2Rldl9jbGFzc2lmeSk7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX3dhaXRfYWZ0ZXJfcmVzZXQpOwotRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9zb2Z0cmVzZXQpOwotRVhQT1JUX1NZTUJPTF9HUEwoc2F0YV9zZmZfaGFyZHJlc2V0KTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfcG9zdHJlc2V0KTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfZXJyb3JfaGFuZGxlcik7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX3Bvc3RfaW50ZXJuYWxfY21kKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfcG9ydF9zdGFydCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX3N0ZF9wb3J0cyk7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfYm1kbWFfbW9kZV9maWx0ZXIpOwotRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2JtZG1hX3NldHVwKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9ibWRtYV9zdGFydCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfYm1kbWFfc3RvcCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfYm1kbWFfc3RhdHVzKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9idXNfcmVzZXQpOwotI2lmZGVmIENPTkZJR19QQ0kKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9wY2lfYm1kbWFfY2xlYXJfc2ltcGxleCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfcGNpX2JtZG1hX2luaXQpOwotRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3BjaV9zZmZfaW5pdF9ob3N0KTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9wY2lfc2ZmX3ByZXBhcmVfaG9zdCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfcGNpX3NmZl9hY3RpdmF0ZV9ob3N0KTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9wY2lfc2ZmX2luaXRfb25lKTsKKwogI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9hbGkuYyBiL2RyaXZlcnMvYXRhL3BhdGFfYWxpLmMKaW5kZXggNzNjNDY2ZS4uYTc5OTljMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9hbGkuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2FsaS5jCkBAIC0xOSw3ICsxOSw5IEBACiAgKgogICogIFRPRE8vQ0hFQ0sKICAqCUNhbm5vdCBoYXZlIEFUQVBJIG9uIGJvdGggbWFzdGVyICYgc2xhdmUgZm9yIHJldiA8IGMyICg/Pz8pIGJ1dAotICoJb3RoZXJ3aXNlIHNob3VsZCBkbyBhdGFwaSBETUEuCisgKglvdGhlcndpc2Ugc2hvdWxkIGRvIGF0YXBpIERNQSAoRm9yIG5vdyBmb3Igb2xkIHdlIGRvIFBJTyBvbmx5IGZvcgorICoJQVRBUEkpCisgKglSZXZpZXcgU3VuYmxhZGUgd29ya2Fyb3VuZC4KICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0zMywxMiArMzUsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9kbWkuaD4KIAogI2RlZmluZSBEUlZfTkFNRSAicGF0YV9hbGkiCi0jZGVmaW5lIERSVl9WRVJTSU9OICIwLjcuNSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuNy44IgogCiBzdGF0aWMgaW50IGFsaV9hdGFwaV9kbWEgPSAwOwogbW9kdWxlX3BhcmFtX25hbWVkKGF0YXBpX2RtYSwgYWxpX2F0YXBpX2RtYSwgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoYXRhcGlfZG1hLCAiRW5hYmxlIEFUQVBJIERNQSAoMD1kaXNhYmxlLCAxPWVuYWJsZSkiKTsKIAorc3RhdGljIHN0cnVjdCBwY2lfZGV2ICppc2FfYnJpZGdlOworCiAvKgogICoJQ2FibGUgc3BlY2lhbCBjYXNlcwogICovCkBAIC0xNDcsOCArMTUxLDcgQEAKIAogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIHBpb19maWZvLCAmZmlmbyk7CiAJZmlmbyAmPSB+KDB4MEYgPDwgc2hpZnQpOwotCWlmIChvbikKLQkJZmlmbyB8PSAob24gPDwgc2hpZnQpOworCWZpZm8gfD0gKG9uIDw8IHNoaWZ0KTsKIAlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgcGlvX2ZpZm8sIGZpZm8pOwogfQogCkBAIC0zMzcsNiArMzQwLDIzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGFsaV9jMl9jM19wb3N0cmVzZXQoc3RydWN0IGF0YV9saW5rICpsaW5rLCB1bnNpZ25lZCBpbnQgKmNsYXNzZXMpCit7CisJdTggcjsKKwlpbnQgcG9ydF9iaXQgPSA0IDw8IGxpbmstPmFwLT5wb3J0X25vOworCisJLyogSWYgb3VyIGJyaWRnZSBpcyBhbiBBTEkgMTUzMyB0aGVuIGRvIHRoZSBleHRyYSB3b3JrICovCisJaWYgKGlzYV9icmlkZ2UpIHsKKwkJLyogVHJpc3RhdGUgYW5kIHJlLWVuYWJsZSB0aGUgYnVzIHNpZ25hbHMgKi8KKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoaXNhX2JyaWRnZSwgMHg1OCwgJnIpOworCQlyICY9IH5wb3J0X2JpdDsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGlzYV9icmlkZ2UsIDB4NTgsIHIpOworCQlyIHw9IHBvcnRfYml0OworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoaXNhX2JyaWRnZSwgMHg1OCwgcik7CisJfQorCWF0YV9zZmZfcG9zdHJlc2V0KGxpbmssIGNsYXNzZXMpOworfQorCiBzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBhbGlfc2h0ID0gewogCUFUQV9CTURNQV9TSFQoRFJWX05BTUUpLAogfTsKQEAgLTM0OSwxMCArMzY5LDExIEBACiAJLmluaGVyaXRzCT0gJmF0YV9zZmZfcG9ydF9vcHMsCiAJLmNhYmxlX2RldGVjdAk9IGF0YV9jYWJsZV80MHdpcmUsCiAJLnNldF9waW9tb2RlCT0gYWxpX3NldF9waW9tb2RlLAorCS5zZmZfZGF0YV94ZmVyICA9IGF0YV9zZmZfZGF0YV94ZmVyMzIsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgYWxpX2RtYV9iYXNlX29wcyA9IHsKLQkuaW5oZXJpdHMJPSAmYXRhX2JtZG1hX3BvcnRfb3BzLAorCS5pbmhlcml0cwk9ICZhdGFfYm1kbWEzMl9wb3J0X29wcywKIAkuc2V0X3Bpb21vZGUJPSBhbGlfc2V0X3Bpb21vZGUsCiAJLnNldF9kbWFtb2RlCT0gYWxpX3NldF9kbWFtb2RlLAogfTsKQEAgLTM3Nyw2ICszOTgsMTcgQEAKIAkuY2hlY2tfYXRhcGlfZG1hID0gYWxpX2NoZWNrX2F0YXBpX2RtYSwKIAkuY2FibGVfZGV0ZWN0CT0gYWxpX2MyX2NhYmxlX2RldGVjdCwKIAkuZGV2X2NvbmZpZwk9IGFsaV9sb2NrX3NlY3RvcnMsCisJLnBvc3RyZXNldAk9IGFsaV9jMl9jM19wb3N0cmVzZXQsCit9OworCisvKgorICoJUG9ydCBvcGVyYXRpb25zIGZvciBETUEgY2FwYWJsZSBBTGkgd2l0aCBjYWJsZSBkZXRlY3QKKyAqLworc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGFsaV9jNF9wb3J0X29wcyA9IHsKKwkuaW5oZXJpdHMJPSAmYWxpX2RtYV9iYXNlX29wcywKKwkuY2hlY2tfYXRhcGlfZG1hID0gYWxpX2NoZWNrX2F0YXBpX2RtYSwKKwkuY2FibGVfZGV0ZWN0CT0gYWxpX2MyX2NhYmxlX2RldGVjdCwKKwkuZGV2X2NvbmZpZwk9IGFsaV9sb2NrX3NlY3RvcnMsCiB9OwogCiAvKgpAQCAtNDAxLDI3ICs0MzMsNDAgQEAKIHN0YXRpYyB2b2lkIGFsaV9pbml0X2NoaXBzZXQoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJdTggdG1wOwotCXN0cnVjdCBwY2lfZGV2ICpub3J0aCwgKmlzYV9icmlkZ2U7CisJc3RydWN0IHBjaV9kZXYgKm5vcnRoOwogCiAJLyoKIAkgKiBUaGUgY2hpcHNldCByZXZpc2lvbiBzZWxlY3RzIHRoZSBkcml2ZXIgb3BlcmF0aW9ucyBhbmQKIAkgKiBtb2RlIGRhdGEuCiAJICovCiAKLQlpZiAocGRldi0+cmV2aXNpb24gPj0gMHgyMCAmJiBwZGV2LT5yZXZpc2lvbiA8IDB4QzIpIHsKLQkJLyogMTU0My1FL0YsIDE1NDNDLUMsIDE1NDNDLUQsIDE1NDNDLUUgKi8KKwlpZiAocGRldi0+cmV2aXNpb24gPD0gMHgyMCkgeworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDUzLCAmdG1wKTsKKwkJdG1wIHw9IDB4MDM7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDUzLCB0bXApOworCX0gZWxzZSB7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4NGEsICZ0bXApOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg0YSwgdG1wIHwgMHgyMCk7CiAJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4NEIsICZ0bXApOwotCQkvKiBDbGVhciBDRC1ST00gRE1BIHdyaXRlIGJpdCAqLwotCQl0bXAgJj0gMHg3RjsKLQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NEIsIHRtcCk7Ci0JfSBlbHNlIGlmIChwZGV2LT5yZXZpc2lvbiA+PSAweEMyKSB7Ci0JCS8qIEVuYWJsZSBjYWJsZSBkZXRlY3Rpb24gbG9naWMgKi8KLQkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHg0QiwgJnRtcCk7Ci0JCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDRCLCB0bXAgfCAweDA4KTsKKwkJaWYgKHBkZXYtPnJldmlzaW9uIDwgMHhDMikKKwkJCS8qIDE1NDMtRS9GLCAxNTQzQy1DLCAxNTQzQy1ELCAxNTQzQy1FICovCisJCQkvKiBDbGVhciBDRC1ST00gRE1BIHdyaXRlIGJpdCAqLworCQkJdG1wICY9IDB4N0Y7CisJCS8qIENhYmxlIGFuZCBVRE1BICovCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDRCLCB0bXAgfCAweDA5KTsKKwkJLyoKKwkJICogQ0RfUk9NIERNQSBvbiAoMHg1MyBiaXQgMCkuIEVuYWJsZSB0aGlzIGV2ZW4gaWYgd2Ugd2FudAorCQkgKiB0byB1c2UgUElPLiAweDUzIGJpdCAxIChyZXYgMjAgb25seSkgLSBlbmFibGUgRklGTyBjb250cm9sCisJCSAqIHZpYSAweDU0LzU1LgorCQkgKi8KKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHg1MywgJnRtcCk7CisJCWlmIChwZGV2LT5yZXZpc2lvbiA+PSAweGM3KQorCQkJdG1wIHw9IDB4MDM7CisJCWVsc2UKKwkJCXRtcCB8PSAweDAxOwkvKiBDRF9ST00gZW5hYmxlIGZvciBETUEgKi8KKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NTMsIHRtcCk7CiAJfQogCW5vcnRoID0gcGNpX2dldF9idXNfYW5kX3Nsb3QoMCwgUENJX0RFVkZOKDAsMCkpOwotCWlzYV9icmlkZ2UgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0FMLCBQQ0lfREVWSUNFX0lEX0FMX00xNTMzLCBOVUxMKTsKLQogCWlmIChub3J0aCAmJiBub3J0aC0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfQUwgJiYgaXNhX2JyaWRnZSkgewogCQkvKiBDb25maWd1cmUgdGhlIEFMaSBicmlkZ2UgbG9naWMuIEZvciBub24gQUxpIHJlbHkgb24gQklPUy4KIAkJICAgU2V0IHRoZSBzb3V0aCBicmlkZ2UgZW5hYmxlIGJpdCAqLwpAQCAtNDMxLDIyICs0NzYsNiBAQAogCQllbHNlIGlmIChwZGV2LT5yZXZpc2lvbiA+IDB4QzIgJiYgcGRldi0+cmV2aXNpb24gPCAweEM1KQogCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGlzYV9icmlkZ2UsIDB4NzksIHRtcCB8IDB4MDIpOwogCX0KLQlpZiAocGRldi0+cmV2aXNpb24gPj0gMHgyMCkgewotCQkvKgotCQkgKiBDRF9ST00gRE1BIG9uICgweDUzIGJpdCAwKS4gRW5hYmxlIHRoaXMgZXZlbiBpZiB3ZSB3YW50Ci0JCSAqIHRvIHVzZSBQSU8uIDB4NTMgYml0IDEgKHJldiAyMCBvbmx5KSAtIGVuYWJsZSBGSUZPIGNvbnRyb2wKLQkJICogdmlhIDB4NTQvNTUuCi0JCSAqLwotCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDUzLCAmdG1wKTsKLQkJaWYgKHBkZXYtPnJldmlzaW9uIDw9IDB4MjApCi0JCQl0bXAgJj0gfjB4MDI7Ci0JCWlmIChwZGV2LT5yZXZpc2lvbiA+PSAweGM3KQotCQkJdG1wIHw9IDB4MDM7Ci0JCWVsc2UKLQkJCXRtcCB8PSAweDAxOwkvKiBDRF9ST00gZW5hYmxlIGZvciBETUEgKi8KLQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NTMsIHRtcCk7Ci0JfQotCXBjaV9kZXZfcHV0KGlzYV9icmlkZ2UpOwogCXBjaV9kZXZfcHV0KG5vcnRoKTsKIAlhdGFfcGNpX2JtZG1hX2NsZWFyX3NpbXBsZXgocGRldik7CiB9CkBAIC01MDMsNyArNTMyLDcgQEAKIAkJLnBpb19tYXNrID0gMHgxZiwKIAkJLm13ZG1hX21hc2sgPSAweDA3LAogCQkudWRtYV9tYXNrID0gQVRBX1VETUE1LAotCQkucG9ydF9vcHMgPSAmYWxpX2MyX3BvcnRfb3BzCisJCS5wb3J0X29wcyA9ICZhbGlfYzRfcG9ydF9vcHMKIAl9OwogCS8qIFJldmlzaW9uIDB4QzUgaXMgVURNQTEzMyB3aXRoIExCQTQ4IERNQSAqLwogCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvX2M1ID0gewpAQCAtNTE2LDcgKzU0NSw2IEBACiAKIAljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPSB7IE5VTEwsIE5VTEwgfTsKIAl1OCB0bXA7Ci0Jc3RydWN0IHBjaV9kZXYgKmlzYV9icmlkZ2U7CiAJaW50IHJjOwogCiAJcmMgPSBwY2ltX2VuYWJsZV9kZXZpY2UocGRldik7CkBAIC01NDMsMTQgKzU3MSwxMiBAQAogCiAJYWxpX2luaXRfY2hpcHNldChwZGV2KTsKIAotCWlzYV9icmlkZ2UgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0FMLCBQQ0lfREVWSUNFX0lEX0FMX00xNTMzLCBOVUxMKTsKIAlpZiAoaXNhX2JyaWRnZSAmJiBwZGV2LT5yZXZpc2lvbiA+PSAweDIwICYmIHBkZXYtPnJldmlzaW9uIDwgMHhDMikgewogCQkvKiBBcmUgd2UgcGFpcmVkIHdpdGggYSBVRE1BIGNhcGFibGUgY2hpcCAqLwogCQlwY2lfcmVhZF9jb25maWdfYnl0ZShpc2FfYnJpZGdlLCAweDVFLCAmdG1wKTsKIAkJaWYgKCh0bXAgJiAweDFFKSA9PSAweDEyKQogCSAgICAgICAgCXBwaVswXSA9ICZpbmZvXzIwX3VkbWE7CiAJfQotCXBjaV9kZXZfcHV0KGlzYV9icmlkZ2UpOwogCiAJcmV0dXJuIGF0YV9wY2lfc2ZmX2luaXRfb25lKHBkZXYsIHBwaSwgJmFsaV9zaHQsIE5VTEwpOwogfQpAQCAtNTkwLDEzICs2MTYsMjAgQEAKIAogc3RhdGljIGludCBfX2luaXQgYWxpX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmYWxpX3BjaV9kcml2ZXIpOworCWludCByZXQ7CisJaXNhX2JyaWRnZSA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQUwsIFBDSV9ERVZJQ0VfSURfQUxfTTE1MzMsIE5VTEwpOworCisJcmV0ID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmYWxpX3BjaV9kcml2ZXIpOworCWlmIChyZXQgPCAwKQorCQlwY2lfZGV2X3B1dChpc2FfYnJpZGdlKTsKKwlyZXR1cm4gcmV0OwogfQogCiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhbGlfZXhpdCh2b2lkKQogewogCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYWxpX3BjaV9kcml2ZXIpOworCXBjaV9kZXZfcHV0KGlzYV9icmlkZ2UpOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfYW1kLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2FtZC5jCmluZGV4IDBlYzljN2QuLjYzNzE5YWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfYW1kLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9hbWQuYwpAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FICJwYXRhX2FtZCIKLSNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMy4xMCIKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMy4xMSIKIAogLyoqCiAgKgl0aW1pbmdfc2V0dXAJCS0Jc2hhcmVkIHRpbWluZyBjb21wdXRhdGlvbiBhbmQgbG9hZApAQCAtMzQ1LDcgKzM0NSw3IEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgYW1kX2Jhc2VfcG9ydF9vcHMgPSB7Ci0JLmluaGVyaXRzCT0gJmF0YV9ibWRtYV9wb3J0X29wcywKKwkuaW5oZXJpdHMJPSAmYXRhX2JtZG1hMzJfcG9ydF9vcHMsCiAJLnByZXJlc2V0CT0gYW1kX3ByZV9yZXNldCwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfaHB0MzY2LmMgYi9kcml2ZXJzL2F0YS9wYXRhX2hwdDM2Ni5jCmluZGV4IGUwYzRmMDUuLjY1YzI4ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfaHB0MzY2LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9ocHQzNjYuYwpAQCAtMzAsNyArMzAsNyBAQAogI2RlZmluZSBEUlZfVkVSU0lPTgkiMC42LjIiCiAKIHN0cnVjdCBocHRfY2xvY2sgewotCXU4CXhmZXJfc3BlZWQ7CisJdTgJeGZlcl9tb2RlOwogCXUzMgl0aW1pbmc7CiB9OwogCkBAIC0xODksMjggKzE4OSw2IEBACiAJcmV0dXJuIGF0YV9ibWRtYV9tb2RlX2ZpbHRlcihhZGV2LCBtYXNrKTsKIH0KIAotLyoqCi0gKglocHQzNnhfZmluZF9tb2RlCS0JcmVzZXQgdGhlIGhwdDM2eCBidXMKLSAqCUBhcDogQVRBIHBvcnQKLSAqCUBzcGVlZDogdHJhbnNmZXIgbW9kZQotICoKLSAqCVJldHVybiB0aGUgMzJiaXQgcmVnaXN0ZXIgcHJvZ3JhbW1pbmcgaW5mb3JtYXRpb24gZm9yIHRoaXMgY2hhbm5lbAotICoJdGhhdCBtYXRjaGVzIHRoZSBzcGVlZCBwcm92aWRlZC4KLSAqLwotCi1zdGF0aWMgdTMyIGhwdDM2eF9maW5kX21vZGUoc3RydWN0IGF0YV9wb3J0ICphcCwgaW50IHNwZWVkKQotewotCXN0cnVjdCBocHRfY2xvY2sgKmNsb2NrcyA9IGFwLT5ob3N0LT5wcml2YXRlX2RhdGE7Ci0KLQl3aGlsZShjbG9ja3MtPnhmZXJfc3BlZWQpIHsKLQkJaWYgKGNsb2Nrcy0+eGZlcl9zcGVlZCA9PSBzcGVlZCkKLQkJCXJldHVybiBjbG9ja3MtPnRpbWluZzsKLQkJY2xvY2tzKys7Ci0JfQotCUJVRygpOwotCXJldHVybiAweGZmZmZmZmZmVTsJLyogc2lsZW5jZSBjb21waWxlciB3YXJuaW5nICovCi19Ci0KIHN0YXRpYyBpbnQgaHB0MzZ4X2NhYmxlX2RldGVjdChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKQEAgLTIyNiw2ICsyMDQsNDkgQEAKIAlyZXR1cm4gQVRBX0NCTF9QQVRBODA7CiB9CiAKK3N0YXRpYyB2b2lkIGhwdDM2Nl9zZXRfbW9kZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldiwKKwkJCSAgICB1OCBtb2RlKQoreworCXN0cnVjdCBocHRfY2xvY2sgKmNsb2NrcyA9IGFwLT5ob3N0LT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOworCXUzMiBhZGRyMSA9IDB4NDAgKyA0ICogKGFkZXYtPmRldm5vICsgMiAqIGFwLT5wb3J0X25vKTsKKwl1MzIgYWRkcjIgPSAweDUxICsgNCAqIGFwLT5wb3J0X25vOworCXUzMiBtYXNrLCByZWc7CisJdTggZmFzdDsKKworCS8qIEZhc3QgaW50ZXJydXB0IHByZWRpY3Rpb24gZGlzYWJsZSwgaG9sZCBvZmYgaW50ZXJydXB0IGRpc2FibGUgKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBhZGRyMiwgJmZhc3QpOworCWlmIChmYXN0ICYgMHg4MCkgeworCQlmYXN0ICY9IH4weDgwOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgYWRkcjIsIGZhc3QpOworCX0KKworCS8qIGRldGVybWluZSB0aW1pbmcgbWFzayBhbmQgZmluZCBtYXRjaGluZyBjbG9jayBlbnRyeSAqLworCWlmIChtb2RlIDwgWEZFUl9NV19ETUFfMCkKKwkJbWFzayA9IDB4YzFmOGZmZmY7CisJZWxzZSBpZiAobW9kZSA8IFhGRVJfVURNQV8wKQorCQltYXNrID0gMHgzMDM4MDBmZjsKKwllbHNlCisJCW1hc2sgPSAweDMwMDcwMDAwOworCisJd2hpbGUgKGNsb2Nrcy0+eGZlcl9tb2RlKSB7CisJCWlmIChjbG9ja3MtPnhmZXJfbW9kZSA9PSBtb2RlKQorCQkJYnJlYWs7CisJCWNsb2NrcysrOworCX0KKwlpZiAoIWNsb2Nrcy0+eGZlcl9tb2RlKQorCQlCVUcoKTsKKworCS8qCisJICogQ29tYmluZSBuZXcgbW9kZSBiaXRzIHdpdGggb2xkIGNvbmZpZyBiaXRzIGFuZCBkaXNhYmxlCisJICogb24tY2hpcCBQSU8gRklGTy9idWZmZXIgKGFuZCBQSU8gTVNUIG1vZGUgYXMgd2VsbCkgdG8gYXZvaWQKKwkgKiBwcm9ibGVtcyBoYW5kbGluZyBJL08gZXJyb3JzIGxhdGVyLgorCSAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBhZGRyMSwgJnJlZyk7CisJcmVnID0gKChyZWcgJiB+bWFzaykgfCAoY2xvY2tzLT50aW1pbmcgJiBtYXNrKSkgJiB+MHhjMDAwMDAwMDsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIGFkZHIxLCByZWcpOworfQorCiAvKioKICAqCWhwdDM2Nl9zZXRfcGlvbW9kZQkJLQlQSU8gc2V0dXAKICAqCUBhcDogQVRBIGludGVyZmFjZQpAQCAtMjM2LDI4ICsyNTcsNyBAQAogCiBzdGF0aWMgdm9pZCBocHQzNjZfc2V0X3Bpb21vZGUoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpCiB7Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwotCXUzMiBhZGRyMSwgYWRkcjI7Ci0JdTMyIHJlZzsKLQl1MzIgbW9kZTsKLQl1OCBmYXN0OwotCi0JYWRkcjEgPSAweDQwICsgNCAqIChhZGV2LT5kZXZubyArIDIgKiBhcC0+cG9ydF9ubyk7Ci0JYWRkcjIgPSAweDUxICsgNCAqIGFwLT5wb3J0X25vOwotCi0JLyogRmFzdCBpbnRlcnJ1cHQgcHJlZGljdGlvbiBkaXNhYmxlLCBob2xkIG9mZiBpbnRlcnJ1cHQgZGlzYWJsZSAqLwotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIGFkZHIyLCAmZmFzdCk7Ci0JaWYgKGZhc3QgJiAweDgwKSB7Ci0JCWZhc3QgJj0gfjB4ODA7Ci0JCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBhZGRyMiwgZmFzdCk7Ci0JfQotCi0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIGFkZHIxLCAmcmVnKTsKLQltb2RlID0gaHB0MzZ4X2ZpbmRfbW9kZShhcCwgYWRldi0+cGlvX21vZGUpOwotCW1vZGUgJj0gfjB4ODAwMDAwMDsJLyogTm8gRklGTyBpbiBQSU8gKi8KLQltb2RlICY9IH4weDMwMDcwMDAwOwkvKiBMZWF2ZSBjb25maWcgYml0cyBhbG9uZSAqLwotCXJlZyAmPSAweDMwMDcwMDAwOwkvKiBTdHJpcCB0aW1pbmcgYml0cyAqLwotCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgYWRkcjEsIHJlZyB8IG1vZGUpOworCWhwdDM2Nl9zZXRfbW9kZShhcCwgYWRldiwgYWRldi0+cGlvX21vZGUpOwogfQogCiAvKioKQEAgLTI3MSwyOCArMjcxLDcgQEAKIAogc3RhdGljIHZvaWQgaHB0MzY2X3NldF9kbWFtb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2KQogewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKLQl1MzIgYWRkcjEsIGFkZHIyOwotCXUzMiByZWc7Ci0JdTMyIG1vZGU7Ci0JdTggZmFzdDsKLQotCWFkZHIxID0gMHg0MCArIDQgKiAoYWRldi0+ZGV2bm8gKyAyICogYXAtPnBvcnRfbm8pOwotCWFkZHIyID0gMHg1MSArIDQgKiBhcC0+cG9ydF9ubzsKLQotCS8qIEZhc3QgaW50ZXJydXB0IHByZWRpY3Rpb24gZGlzYWJsZSwgaG9sZCBvZmYgaW50ZXJydXB0IGRpc2FibGUgKi8KLQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBhZGRyMiwgJmZhc3QpOwotCWlmIChmYXN0ICYgMHg4MCkgewotCQlmYXN0ICY9IH4weDgwOwotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgYWRkcjIsIGZhc3QpOwotCX0KLQotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBhZGRyMSwgJnJlZyk7Ci0JbW9kZSA9IGhwdDM2eF9maW5kX21vZGUoYXAsIGFkZXYtPmRtYV9tb2RlKTsKLQltb2RlIHw9IDB4ODAwMDAwMDsJLyogRklGTyBpbiBNV0RNQSBvciBVRE1BICovCi0JbW9kZSAmPSB+MHhDMDAwMDAwMDsJLyogTGVhdmUgY29uZmlnIGJpdHMgYWxvbmUgKi8KLQlyZWcgJj0gMHhDMDAwMDAwMDsJLyogU3RyaXAgdGltaW5nIGJpdHMgKi8KLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIGFkZHIxLCByZWcgfCBtb2RlKTsKKwlocHQzNjZfc2V0X21vZGUoYXAsIGFkZXYsIGFkZXYtPmRtYV9tb2RlKTsKIH0KIAogc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgaHB0MzZ4X3NodCA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfaHB0M3gzLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2hwdDN4My5jCmluZGV4IGYxMWEzMjAuLmYxOWNjNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfaHB0M3gzLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9ocHQzeDMuYwpAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FCSJwYXRhX2hwdDN4MyIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuNS4zIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC42LjEiCiAKIC8qKgogICoJaHB0M3gzX3NldF9waW9tb2RlCQktCVBJTyBzZXR1cApAQCAtODAsMTQgKzgwLDQ4IEBACiAJcjIgJj0gfigweDExIDw8IGRuKTsJLyogQ2xlYXIgTVdETUEgYW5kIFVETUEgYml0cyAqLwogCiAJaWYgKGFkZXYtPmRtYV9tb2RlID49IFhGRVJfVURNQV8wKQotCQlyMiB8PSAoMHgxMCA8PCBkbik7CS8qIFVsdHJhIG1vZGUgKi8KKwkJcjIgfD0gKDB4MDEgPDwgZG4pOwkvKiBVbHRyYSBtb2RlICovCiAJZWxzZQotCQlyMiB8PSAoMHgwMSA8PCBkbik7CS8qIE1XRE1BICovCisJCXIyIHw9ICgweDEwIDw8IGRuKTsJLyogTVdETUEgKi8KIAogCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgMHg0NCwgcjEpOwogCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgMHg0OCwgcjIpOwogfQotI2VuZGlmIC8qIENPTkZJR19QQVRBX0hQVDNYM19ETUEgKi8KKworLyoqCisgKglocHQzeDNfZnJlZXplCQktCURNQSB3b3JrYXJvdW5kCisgKglAYXA6IHBvcnQgdG8gZnJlZXplCisgKgorICoJV2hlbiBmcmVlemluZyBhbiBIUFQzeDMgd2UgbXVzdCBzdG9wIGFueSBwZW5kaW5nIERNQSBiZWZvcmUKKyAqCXdyaXRpbmcgdG8gdGhlIGNvbnRyb2wgcmVnaXN0ZXIgb3IgdGhlIGNoaXAgd2lsbCBoYW5nCisgKi8KKworc3RhdGljIHZvaWQgaHB0M3gzX2ZyZWV6ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXZvaWQgX19pb21lbSAqbW1pbyA9IGFwLT5pb2FkZHIuYm1kbWFfYWRkcjsKKworCWlvd3JpdGU4KGlvcmVhZDgobW1pbyArIEFUQV9ETUFfQ01EKSAmIH4gQVRBX0RNQV9TVEFSVCwKKwkJCW1taW8gKyBBVEFfRE1BX0NNRCk7CisJYXRhX3NmZl9kbWFfcGF1c2UoYXApOworCWF0YV9zZmZfZnJlZXplKGFwKTsKK30KKworLyoqCisgKglocHQzeDNfYm1kbWFfc2V0dXAJLQlETUEgd29ya2Fyb3VuZAorICoJQHFjOiBRdWV1ZWQgY29tbWFuZAorICoKKyAqCVdoZW4gaXNzdWluZyBCTURNQSB3ZSBtdXN0IGNsZWFuIHVwIHRoZSBlcnJvci9hY3RpdmUgYml0cyBpbgorICoJc29mdHdhcmUgb24gdGhpcyBkZXZpY2UKKyAqLworCitzdGF0aWMgdm9pZCBocHQzeDNfYm1kbWFfc2V0dXAoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOworCXU4IHIgPSBpb3JlYWQ4KGFwLT5pb2FkZHIuYm1kbWFfYWRkciArIEFUQV9ETUFfU1RBVFVTKTsKKwlyIHw9IEFUQV9ETUFfSU5UUiB8IEFUQV9ETUFfRVJSOworCWlvd3JpdGU4KHIsIGFwLT5pb2FkZHIuYm1kbWFfYWRkciArIEFUQV9ETUFfU1RBVFVTKTsKKwlyZXR1cm4gYXRhX2JtZG1hX3NldHVwKHFjKTsKK30KIAogLyoqCiAgKglocHQzeDNfYXRhcGlfZG1hCS0JQVRBUEkgRE1BIGNoZWNrCkBAIC0xMDEsMTggKzEzNSwyMyBAQAogCXJldHVybiAxOwogfQogCisjZW5kaWYgLyogQ09ORklHX1BBVEFfSFBUM1gzX0RNQSAqLworCiBzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBocHQzeDNfc2h0ID0gewogCUFUQV9CTURNQV9TSFQoRFJWX05BTUUpLAogfTsKIAogc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGhwdDN4M19wb3J0X29wcyA9IHsKIAkuaW5oZXJpdHMJPSAmYXRhX2JtZG1hX3BvcnRfb3BzLAotCS5jaGVja19hdGFwaV9kbWE9IGhwdDN4M19hdGFwaV9kbWEsCiAJLmNhYmxlX2RldGVjdAk9IGF0YV9jYWJsZV80MHdpcmUsCiAJLnNldF9waW9tb2RlCT0gaHB0M3gzX3NldF9waW9tb2RlLAogI2lmIGRlZmluZWQoQ09ORklHX1BBVEFfSFBUM1gzX0RNQSkKIAkuc2V0X2RtYW1vZGUJPSBocHQzeDNfc2V0X2RtYW1vZGUsCisJLmJtZG1hX3NldHVwCT0gaHB0M3gzX2JtZG1hX3NldHVwLAorCS5jaGVja19hdGFwaV9kbWE9IGhwdDN4M19hdGFwaV9kbWEsCisJLmZyZWV6ZQkJPSBocHQzeDNfZnJlZXplLAogI2VuZGlmCisJCiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfbXBpaXguYyBiL2RyaXZlcnMvYXRhL3BhdGFfbXBpaXguYwppbmRleCA3YzhmYWE0Li5hYTU3NmNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX21waWl4LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9tcGlpeC5jCkBAIC0zNSw3ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CiAKICNkZWZpbmUgRFJWX05BTUUgInBhdGFfbXBpaXgiCi0jZGVmaW5lIERSVl9WRVJTSU9OICIwLjcuNiIKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuNy43IgogCiBlbnVtIHsKIAlJREVUSU0gPSAweDZDLAkJLyogSURFIGNvbnRyb2wgcmVnaXN0ZXIgKi8KQEAgLTE0Niw2ICsxNDYsNyBAQAogCS5jYWJsZV9kZXRlY3QJPSBhdGFfY2FibGVfNDB3aXJlLAogCS5zZXRfcGlvbW9kZQk9IG1waWl4X3NldF9waW9tb2RlLAogCS5wcmVyZXNldAk9IG1waWl4X3ByZV9yZXNldCwKKwkuc2ZmX2RhdGFfeGZlcgk9IGF0YV9zZmZfZGF0YV94ZmVyMzIsCiB9OwogCiBzdGF0aWMgaW50IG1waWl4X2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfcGxhdGZvcm0uYyBiL2RyaXZlcnMvYXRhL3BhdGFfcGxhdGZvcm0uYwppbmRleCA2YWZhMDdhLi5kOGQ3NDNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3BsYXRmb3JtLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9wbGF0Zm9ybS5jCkBAIC0xODYsNyArMTg2LDcgQEAKICAqCUEgcGxhdGZvcm0gYnVzIEFUQSBkZXZpY2UgaGFzIGJlZW4gdW5wbHVnZ2VkLiBQZXJmb3JtIHRoZSBuZWVkZWQKICAqCWNsZWFudXAuIEFsc28gY2FsbGVkIG9uIG1vZHVsZSB1bmxvYWQgZm9yIGFueSBhY3RpdmUgZGV2aWNlcy4KICAqLwotaW50IF9fZGV2ZXhpdCBfX3BhdGFfcGxhdGZvcm1fcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK2ludCBfX3BhdGFfcGxhdGZvcm1fcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9zaWw2ODAuYyBiL2RyaXZlcnMvYXRhL3BhdGFfc2lsNjgwLmMKaW5kZXggODM1ODBhNS4uOWU3NjRlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9zaWw2ODAuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3NpbDY4MC5jCkBAIC0zMiw3ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CiAKICNkZWZpbmUgRFJWX05BTUUgInBhdGFfc2lsNjgwIgotI2RlZmluZSBEUlZfVkVSU0lPTiAiMC40LjgiCisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjQuOSIKIAogI2RlZmluZSBTSUw2ODBfTU1JT19CQVIJCTUKIApAQCAtMTk1LDcgKzE5NSw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgc2lsNjgwX3BvcnRfb3BzID0gewotCS5pbmhlcml0cwk9ICZhdGFfYm1kbWFfcG9ydF9vcHMsCisJLmluaGVyaXRzCT0gJmF0YV9ibWRtYTMyX3BvcnRfb3BzLAogCS5jYWJsZV9kZXRlY3QJPSBzaWw2ODBfY2FibGVfZGV0ZWN0LAogCS5zZXRfcGlvbW9kZQk9IHNpbDY4MF9zZXRfcGlvbW9kZSwKIAkuc2V0X2RtYW1vZGUJPSBzaWw2ODBfc2V0X2RtYW1vZGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX3NpbDI0LmMgYi9kcml2ZXJzL2F0YS9zYXRhX3NpbDI0LmMKaW5kZXggY2NlZTkzMC4uMjU5MGMyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvc2F0YV9zaWwyNC5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfc2lsMjQuYwpAQCAtNTEsMTMgKzUxLDYgQEAKIAlfX2xlMzIJZmxhZ3M7CiB9OwogCi0vKgotICogUG9ydCBtdWx0aXBsaWVyCi0gKi8KLXN0cnVjdCBzaWwyNF9wb3J0X211bHRpcGxpZXIgewotCV9fbGUzMglkaWFnOwotCV9fbGUzMglzYWN0aXZlOwotfTsKIAogZW51bSB7CiAJU0lMMjRfSE9TVF9CQVIJCT0gMCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRtL2lwaGFzZS5jIGIvZHJpdmVycy9hdG0vaXBoYXNlLmMKaW5kZXggMDg4ODg1ZS4uZTFjNzYxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vaXBoYXNlLmMKKysrIGIvZHJpdmVycy9hdG0vaXBoYXNlLmMKQEAgLTY0LDcgKzY0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSAiaXBoYXNlLmgiCQkgIAogI2luY2x1ZGUgInN1bmkuaCIJCSAgCi0jZGVmaW5lIHN3YXAoeCkgKCgoeCAmIDB4ZmYpIDw8IDgpIHwgKCh4ICYgMHhmZjAwKSA+PiA4KSkgIAorI2RlZmluZSBzd2FwX2J5dGVfb3JkZXIoeCkgKCgoeCAmIDB4ZmYpIDw8IDgpIHwgKCh4ICYgMHhmZjAwKSA+PiA4KSkKIAogI2RlZmluZSBQUklWKGRldikgKChzdHJ1Y3Qgc3VuaV9wcml2ICopIGRldi0+cGh5X2RhdGEpCiAKQEAgLTEzMDYsNyArMTMwNiw3IEBACiAgICAgICAgICAgLy8gZ2V0IHJlYWwgcGt0IGxlbmd0aCAgcHdhbmdfdGVzdAogICAgICAgICAgIHRyYWlsZXIgPSAoc3RydWN0IGNwY3NfdHJhaWxlciopKCh1X2NoYXIgKilza2ItPmRhdGEgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tiLT5sZW4gLSBzaXplb2YoKnRyYWlsZXIpKTsKLSAgICAgICAgICBsZW5ndGggPSAgc3dhcCh0cmFpbGVyLT5sZW5ndGgpOworCSAgbGVuZ3RoID0gc3dhcF9ieXRlX29yZGVyKHRyYWlsZXItPmxlbmd0aCk7CiAgICAgICAgICAgaWYgKChsZW5ndGggPiBpYWRldi0+cnhfYnVmX3N6KSB8fCAobGVuZ3RoID4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2tiLT5sZW4gLSBzaXplb2Yoc3RydWN0IGNwY3NfdHJhaWxlcikpKSkKICAgICAgICAgICB7CkBAIC0yOTk1LDcgKzI5OTUsNyBAQAogCQlza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CiAJd3JfcHRyLT5sb2NhbF9wa3RfYWRkciA9IChidWZfZGVzY19wdHItPmJ1Zl9zdGFydF9oaSA8PCAxNikgfCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmX2Rlc2NfcHRyLT5idWZfc3RhcnRfbG87ICAKLQkvKiB3cl9wdHItPmJ5dGVzID0gc3dhcCh0b3RhbF9sZW4pOwlkaWRuJ3Qgc2VlbSB0byBhZmZlY3QgPz8gKi8gIAorCS8qIHdyX3B0ci0+Ynl0ZXMgPSBzd2FwX2J5dGVfb3JkZXIodG90YWxfbGVuKTsgZGlkbid0IHNlZW0gdG8gYWZmZWN0Pz8gKi8KIAl3cl9wdHItPmJ5dGVzID0gc2tiLT5sZW47ICAKIAogICAgICAgICAvKiBodyBidWcgLSBETEVzIG9mIDB4MmQsIDB4MmUsIDB4MmYgY2F1c2UgRE1BIGxvY2t1cCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL0tjb25maWcgYi9kcml2ZXJzL2Jhc2UvS2NvbmZpZwppbmRleCBkOGU4YzQ5Li44ZjAwNmY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvS2NvbmZpZworKysgYi9kcml2ZXJzL2Jhc2UvS2NvbmZpZwpAQCAtNTQsNyArNTQsNyBAQAogCSAgc3VjaCBmaXJtd2FyZSwgYW5kIGRvIG5vdCB3aXNoIHRvIHVzZSBhbiBpbml0cmQuCiAKIAkgIFRoaXMgc2luZ2xlIG9wdGlvbiBjb250cm9scyB0aGUgaW5jbHVzaW9uIG9mIGZpcm13YXJlIGZvcgotCSAgZXZlcnkgZHJpdmVyIHdoaWNoIHVzZXMgcmVxdWVzdF9maXJtYXJlKCkgYW5kIHNoaXBzIGl0cworCSAgZXZlcnkgZHJpdmVyIHdoaWNoIHVzZXMgcmVxdWVzdF9maXJtd2FyZSgpIGFuZCBzaGlwcyBpdHMKIAkgIGZpcm13YXJlIGluIHRoZSBrZXJuZWwgc291cmNlIHRyZWUsIHRvIGF2b2lkIGEgcHJvbGlmZXJhdGlvbgogCSAgb2YgJ0luY2x1ZGUgZmlybXdhcmUgZm9yIHh4eCBkZXZpY2UnIG9wdGlvbnMuCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9hdHRyaWJ1dGVfY29udGFpbmVyLmMgYi9kcml2ZXJzL2Jhc2UvYXR0cmlidXRlX2NvbnRhaW5lci5jCmluZGV4IGY1NzY1MmQuLmI5Y2RhMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9hdHRyaWJ1dGVfY29udGFpbmVyLmMKKysrIGIvZHJpdmVycy9iYXNlL2F0dHJpYnV0ZV9jb250YWluZXIuYwpAQCAtMTY3LDcgKzE2Nyw3IEBACiAJCWljLT5jbGFzc2Rldi5wYXJlbnQgPSBnZXRfZGV2aWNlKGRldik7CiAJCWljLT5jbGFzc2Rldi5jbGFzcyA9IGNvbnQtPmNsYXNzOwogCQljb250LT5jbGFzcy0+ZGV2X3JlbGVhc2UgPSBhdHRyaWJ1dGVfY29udGFpbmVyX3JlbGVhc2U7Ci0JCXN0cmNweShpYy0+Y2xhc3NkZXYuYnVzX2lkLCBkZXYtPmJ1c19pZCk7CisJCWRldl9zZXRfbmFtZSgmaWMtPmNsYXNzZGV2LCBkZXZfbmFtZShkZXYpKTsKIAkJaWYgKGZuKQogCQkJZm4oY29udCwgZGV2LCAmaWMtPmNsYXNzZGV2KTsKIAkJZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2Jhc2UuaCBiL2RyaXZlcnMvYmFzZS9iYXNlLmgKaW5kZXggMGE1ZjA1NS4uYjY3NmY4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2Jhc2UuaAorKysgYi9kcml2ZXJzL2Jhc2UvYmFzZS5oCkBAIC02Myw2ICs2MywzMiBAQAogI2RlZmluZSB0b19jbGFzcyhvYmopCVwKIAljb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgY2xhc3NfcHJpdmF0ZSwgY2xhc3Nfc3Vic3lzLmtvYmopCiAKKy8qKgorICogc3RydWN0IGRldmljZV9wcml2YXRlIC0gc3RydWN0dXJlIHRvIGhvbGQgdGhlIHByaXZhdGUgdG8gdGhlIGRyaXZlciBjb3JlIHBvcnRpb25zIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlLgorICoKKyAqIEBrbGlzdF9jaGlsZHJlbiAtIGtsaXN0IGNvbnRhaW5pbmcgYWxsIGNoaWxkcmVuIG9mIHRoaXMgZGV2aWNlCisgKiBAa25vZGVfcGFyZW50IC0gbm9kZSBpbiBzaWJsaW5nIGxpc3QKKyAqIEBrbm9kZV9kcml2ZXIgLSBub2RlIGluIGRyaXZlciBsaXN0CisgKiBAa25vZGVfYnVzIC0gbm9kZSBpbiBidXMgbGlzdAorICogQGRldmljZSAtIHBvaW50ZXIgYmFjayB0byB0aGUgc3RydWN0IGNsYXNzIHRoYXQgdGhpcyBzdHJ1Y3R1cmUgaXMKKyAqIGFzc29jaWF0ZWQgd2l0aC4KKyAqCisgKiBOb3RoaW5nIG91dHNpZGUgb2YgdGhlIGRyaXZlciBjb3JlIHNob3VsZCBldmVyIHRvdWNoIHRoZXNlIGZpZWxkcy4KKyAqLworc3RydWN0IGRldmljZV9wcml2YXRlIHsKKwlzdHJ1Y3Qga2xpc3Qga2xpc3RfY2hpbGRyZW47CisJc3RydWN0IGtsaXN0X25vZGUga25vZGVfcGFyZW50OworCXN0cnVjdCBrbGlzdF9ub2RlIGtub2RlX2RyaXZlcjsKKwlzdHJ1Y3Qga2xpc3Rfbm9kZSBrbm9kZV9idXM7CisJc3RydWN0IGRldmljZSAqZGV2aWNlOworfTsKKyNkZWZpbmUgdG9fZGV2aWNlX3ByaXZhdGVfcGFyZW50KG9iaikJXAorCWNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBkZXZpY2VfcHJpdmF0ZSwga25vZGVfcGFyZW50KQorI2RlZmluZSB0b19kZXZpY2VfcHJpdmF0ZV9kcml2ZXIob2JqKQlcCisJY29udGFpbmVyX29mKG9iaiwgc3RydWN0IGRldmljZV9wcml2YXRlLCBrbm9kZV9kcml2ZXIpCisjZGVmaW5lIHRvX2RldmljZV9wcml2YXRlX2J1cyhvYmopCVwKKwljb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUsIGtub2RlX2J1cykKKwogLyogaW5pdGlhbGlzYXRpb24gZnVuY3Rpb25zICovCiBleHRlcm4gaW50IGRldmljZXNfaW5pdCh2b2lkKTsKIGV4dGVybiBpbnQgYnVzZXNfaW5pdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9idXMuYyBiL2RyaXZlcnMvYmFzZS9idXMuYwppbmRleCA1YWVlMWMwLi4wZjBhNTA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvYnVzLmMKKysrIGIvZHJpdmVycy9iYXNlL2J1cy5jCkBAIC0yNTMsNyArMjUzLDE0IEBACiBzdGF0aWMgc3RydWN0IGRldmljZSAqbmV4dF9kZXZpY2Uoc3RydWN0IGtsaXN0X2l0ZXIgKmkpCiB7CiAJc3RydWN0IGtsaXN0X25vZGUgKm4gPSBrbGlzdF9uZXh0KGkpOwotCXJldHVybiBuID8gY29udGFpbmVyX29mKG4sIHN0cnVjdCBkZXZpY2UsIGtub2RlX2J1cykgOiBOVUxMOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IGRldmljZV9wcml2YXRlICpkZXZfcHJ2OworCisJaWYgKG4pIHsKKwkJZGV2X3BydiA9IHRvX2RldmljZV9wcml2YXRlX2J1cyhuKTsKKwkJZGV2ID0gZGV2X3Bydi0+ZGV2aWNlOworCX0KKwlyZXR1cm4gZGV2OwogfQogCiAvKioKQEAgLTI4Niw3ICsyOTMsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWtsaXN0X2l0ZXJfaW5pdF9ub2RlKCZidXMtPnAtPmtsaXN0X2RldmljZXMsICZpLAotCQkJICAgICAoc3RhcnQgPyAmc3RhcnQtPmtub2RlX2J1cyA6IE5VTEwpKTsKKwkJCSAgICAgKHN0YXJ0ID8gJnN0YXJ0LT5wLT5rbm9kZV9idXMgOiBOVUxMKSk7CiAJd2hpbGUgKChkZXYgPSBuZXh0X2RldmljZSgmaSkpICYmICFlcnJvcikKIAkJZXJyb3IgPSBmbihkZXYsIGRhdGEpOwogCWtsaXN0X2l0ZXJfZXhpdCgmaSk7CkBAIC0zMjAsNyArMzI3LDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlrbGlzdF9pdGVyX2luaXRfbm9kZSgmYnVzLT5wLT5rbGlzdF9kZXZpY2VzLCAmaSwKLQkJCSAgICAgKHN0YXJ0ID8gJnN0YXJ0LT5rbm9kZV9idXMgOiBOVUxMKSk7CisJCQkgICAgIChzdGFydCA/ICZzdGFydC0+cC0+a25vZGVfYnVzIDogTlVMTCkpOwogCXdoaWxlICgoZGV2ID0gbmV4dF9kZXZpY2UoJmkpKSkKIAkJaWYgKG1hdGNoKGRldiwgZGF0YSkgJiYgZ2V0X2RldmljZShkZXYpKQogCQkJYnJlYWs7CkBAIC0zMzMsNyArMzQwLDcgQEAKIHsKIAljb25zdCBjaGFyICpuYW1lID0gZGF0YTsKIAotCXJldHVybiBzeXNmc19zdHJlcShuYW1lLCBkZXYtPmJ1c19pZCk7CisJcmV0dXJuIHN5c2ZzX3N0cmVxKG5hbWUsIGRldl9uYW1lKGRldikpOwogfQogCiAvKioKQEAgLTQ2MSwxMiArNDY4LDEyIEBACiAJaW50IGVycm9yID0gMDsKIAogCWlmIChidXMpIHsKLQkJcHJfZGVidWcoImJ1czogJyVzJzogYWRkIGRldmljZSAlc1xuIiwgYnVzLT5uYW1lLCBkZXYtPmJ1c19pZCk7CisJCXByX2RlYnVnKCJidXM6ICclcyc6IGFkZCBkZXZpY2UgJXNcbiIsIGJ1cy0+bmFtZSwgZGV2X25hbWUoZGV2KSk7CiAJCWVycm9yID0gZGV2aWNlX2FkZF9hdHRycyhidXMsIGRldik7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0X3B1dDsKIAkJZXJyb3IgPSBzeXNmc19jcmVhdGVfbGluaygmYnVzLT5wLT5kZXZpY2VzX2tzZXQtPmtvYmosCi0JCQkJCQkmZGV2LT5rb2JqLCBkZXYtPmJ1c19pZCk7CisJCQkJCQkmZGV2LT5rb2JqLCBkZXZfbmFtZShkZXYpKTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBvdXRfaWQ7CiAJCWVycm9yID0gc3lzZnNfY3JlYXRlX2xpbmsoJmRldi0+a29iaiwKQEAgLTQ4Miw3ICs0ODksNyBAQAogb3V0X2RlcHJlY2F0ZWQ6CiAJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+a29iaiwgInN1YnN5c3RlbSIpOwogb3V0X3N1YnN5czoKLQlzeXNmc19yZW1vdmVfbGluaygmYnVzLT5wLT5kZXZpY2VzX2tzZXQtPmtvYmosIGRldi0+YnVzX2lkKTsKKwlzeXNmc19yZW1vdmVfbGluaygmYnVzLT5wLT5kZXZpY2VzX2tzZXQtPmtvYmosIGRldl9uYW1lKGRldikpOwogb3V0X2lkOgogCWRldmljZV9yZW1vdmVfYXR0cnMoYnVzLCBkZXYpOwogb3V0X3B1dDoKQEAgLTUwNyw3ICs1MTQsOCBAQAogCQkJcmV0ID0gZGV2aWNlX2F0dGFjaChkZXYpOwogCQlXQVJOX09OKHJldCA8IDApOwogCQlpZiAocmV0ID49IDApCi0JCQlrbGlzdF9hZGRfdGFpbCgmZGV2LT5rbm9kZV9idXMsICZidXMtPnAtPmtsaXN0X2RldmljZXMpOworCQkJa2xpc3RfYWRkX3RhaWwoJmRldi0+cC0+a25vZGVfYnVzLAorCQkJCSAgICAgICAmYnVzLT5wLT5rbGlzdF9kZXZpY2VzKTsKIAl9CiB9CiAKQEAgLTUyNiwxMyArNTM0LDEzIEBACiAJCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmtvYmosICJzdWJzeXN0ZW0iKTsKIAkJcmVtb3ZlX2RlcHJlY2F0ZWRfYnVzX2xpbmtzKGRldik7CiAJCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmJ1cy0+cC0+ZGV2aWNlc19rc2V0LT5rb2JqLAotCQkJCSAgZGV2LT5idXNfaWQpOworCQkJCSAgZGV2X25hbWUoZGV2KSk7CiAJCWRldmljZV9yZW1vdmVfYXR0cnMoZGV2LT5idXMsIGRldik7Ci0JCWlmIChrbGlzdF9ub2RlX2F0dGFjaGVkKCZkZXYtPmtub2RlX2J1cykpCi0JCQlrbGlzdF9kZWwoJmRldi0+a25vZGVfYnVzKTsKKwkJaWYgKGtsaXN0X25vZGVfYXR0YWNoZWQoJmRldi0+cC0+a25vZGVfYnVzKSkKKwkJCWtsaXN0X2RlbCgmZGV2LT5wLT5rbm9kZV9idXMpOwogCiAJCXByX2RlYnVnKCJidXM6ICclcyc6IHJlbW92ZSBkZXZpY2UgJXNcbiIsCi0JCQkgZGV2LT5idXMtPm5hbWUsIGRldi0+YnVzX2lkKTsKKwkJCSBkZXYtPmJ1cy0+bmFtZSwgZGV2X25hbWUoZGV2KSk7CiAJCWRldmljZV9yZWxlYXNlX2RyaXZlcihkZXYpOwogCQlidXNfcHV0KGRldi0+YnVzKTsKIAl9CkBAIC04MzEsMTQgKzgzOSwxNiBAQAogCiBzdGF0aWMgdm9pZCBrbGlzdF9kZXZpY2VzX2dldChzdHJ1Y3Qga2xpc3Rfbm9kZSAqbikKIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yobiwgc3RydWN0IGRldmljZSwga25vZGVfYnVzKTsKKwlzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUgKmRldl9wcnYgPSB0b19kZXZpY2VfcHJpdmF0ZV9idXMobik7CisJc3RydWN0IGRldmljZSAqZGV2ID0gZGV2X3Bydi0+ZGV2aWNlOwogCiAJZ2V0X2RldmljZShkZXYpOwogfQogCiBzdGF0aWMgdm9pZCBrbGlzdF9kZXZpY2VzX3B1dChzdHJ1Y3Qga2xpc3Rfbm9kZSAqbikKIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yobiwgc3RydWN0IGRldmljZSwga25vZGVfYnVzKTsKKwlzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUgKmRldl9wcnYgPSB0b19kZXZpY2VfcHJpdmF0ZV9idXMobik7CisJc3RydWN0IGRldmljZSAqZGV2ID0gZGV2X3Bydi0+ZGV2aWNlOwogCiAJcHV0X2RldmljZShkZXYpOwogfQpAQCAtOTkzLDE4ICsxMDAzLDIwIEBACiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqcG9zOwogCXN0cnVjdCBrbGlzdF9ub2RlICpuOworCXN0cnVjdCBkZXZpY2VfcHJpdmF0ZSAqZGV2X3BydjsKIAlzdHJ1Y3QgZGV2aWNlICpiOwogCiAJbGlzdF9mb3JfZWFjaChwb3MsIGxpc3QpIHsKIAkJbiA9IGNvbnRhaW5lcl9vZihwb3MsIHN0cnVjdCBrbGlzdF9ub2RlLCBuX25vZGUpOwotCQliID0gY29udGFpbmVyX29mKG4sIHN0cnVjdCBkZXZpY2UsIGtub2RlX2J1cyk7CisJCWRldl9wcnYgPSB0b19kZXZpY2VfcHJpdmF0ZV9idXMobik7CisJCWIgPSBkZXZfcHJ2LT5kZXZpY2U7CiAJCWlmIChjb21wYXJlKGEsIGIpIDw9IDApIHsKLQkJCWxpc3RfbW92ZV90YWlsKCZhLT5rbm9kZV9idXMubl9ub2RlLAotCQkJCSAgICAgICAmYi0+a25vZGVfYnVzLm5fbm9kZSk7CisJCQlsaXN0X21vdmVfdGFpbCgmYS0+cC0+a25vZGVfYnVzLm5fbm9kZSwKKwkJCQkgICAgICAgJmItPnAtPmtub2RlX2J1cy5uX25vZGUpOwogCQkJcmV0dXJuOwogCQl9CiAJfQotCWxpc3RfbW92ZV90YWlsKCZhLT5rbm9kZV9idXMubl9ub2RlLCBsaXN0KTsKKwlsaXN0X21vdmVfdGFpbCgmYS0+cC0+a25vZGVfYnVzLm5fbm9kZSwgbGlzdCk7CiB9CiAKIHZvaWQgYnVzX3NvcnRfYnJlYWR0aGZpcnN0KHN0cnVjdCBidXNfdHlwZSAqYnVzLApAQCAtMTAxNCw2ICsxMDI2LDcgQEAKIAlMSVNUX0hFQUQoc29ydGVkX2RldmljZXMpOwogCXN0cnVjdCBsaXN0X2hlYWQgKnBvcywgKnRtcDsKIAlzdHJ1Y3Qga2xpc3Rfbm9kZSAqbjsKKwlzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUgKmRldl9wcnY7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCXN0cnVjdCBrbGlzdCAqZGV2aWNlX2tsaXN0OwogCkBAIC0xMDIyLDcgKzEwMzUsOCBAQAogCXNwaW5fbG9jaygmZGV2aWNlX2tsaXN0LT5rX2xvY2spOwogCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHRtcCwgJmRldmljZV9rbGlzdC0+a19saXN0KSB7CiAJCW4gPSBjb250YWluZXJfb2YocG9zLCBzdHJ1Y3Qga2xpc3Rfbm9kZSwgbl9ub2RlKTsKLQkJZGV2ID0gY29udGFpbmVyX29mKG4sIHN0cnVjdCBkZXZpY2UsIGtub2RlX2J1cyk7CisJCWRldl9wcnYgPSB0b19kZXZpY2VfcHJpdmF0ZV9idXMobik7CisJCWRldiA9IGRldl9wcnYtPmRldmljZTsKIAkJZGV2aWNlX2luc2VydGlvbl9zb3J0X2tsaXN0KGRldiwgJnNvcnRlZF9kZXZpY2VzLCBjb21wYXJlKTsKIAl9CiAJbGlzdF9zcGxpY2UoJnNvcnRlZF9kZXZpY2VzLCAmZGV2aWNlX2tsaXN0LT5rX2xpc3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2NvcmUuYyBiL2RyaXZlcnMvYmFzZS9jb3JlLmMKaW5kZXggOGMyY2MyNi4uNjFkZjUwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2NvcmUuYworKysgYi9kcml2ZXJzL2Jhc2UvY29yZS5jCkBAIC0xMDksNiArMTA5LDcgQEAKIHN0YXRpYyB2b2lkIGRldmljZV9yZWxlYXNlKHN0cnVjdCBrb2JqZWN0ICprb2JqKQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRvX2Rldihrb2JqKTsKKwlzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUgKnAgPSBkZXYtPnA7CiAKIAlpZiAoZGV2LT5yZWxlYXNlKQogCQlkZXYtPnJlbGVhc2UoZGV2KTsKQEAgLTExOSw3ICsxMjAsOCBAQAogCWVsc2UKIAkJV0FSTigxLCBLRVJOX0VSUiAiRGV2aWNlICclcycgZG9lcyBub3QgaGF2ZSBhIHJlbGVhc2UoKSAiCiAJCQkiZnVuY3Rpb24sIGl0IGlzIGJyb2tlbiBhbmQgbXVzdCBiZSBmaXhlZC5cbiIsCi0JCQlkZXYtPmJ1c19pZCk7CisJCQlkZXZfbmFtZShkZXYpKTsKKwlrZnJlZShwKTsKIH0KIAogc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgZGV2aWNlX2t0eXBlID0gewpAQCAtMjA5LDcgKzIxMSw3IEBACiAJCXJldHZhbCA9IGRldi0+YnVzLT51ZXZlbnQoZGV2LCBlbnYpOwogCQlpZiAocmV0dmFsKQogCQkJcHJfZGVidWcoImRldmljZTogJyVzJzogJXM6IGJ1cyB1ZXZlbnQoKSByZXR1cm5lZCAlZFxuIiwKLQkJCQkgZGV2LT5idXNfaWQsIF9fZnVuY19fLCByZXR2YWwpOworCQkJCSBkZXZfbmFtZShkZXYpLCBfX2Z1bmNfXywgcmV0dmFsKTsKIAl9CiAKIAkvKiBoYXZlIHRoZSBjbGFzcyBzcGVjaWZpYyBmdW5jdGlvbiBhZGQgaXRzIHN0dWZmICovCkBAIC0yMTcsNyArMjE5LDcgQEAKIAkJcmV0dmFsID0gZGV2LT5jbGFzcy0+ZGV2X3VldmVudChkZXYsIGVudik7CiAJCWlmIChyZXR2YWwpCiAJCQlwcl9kZWJ1ZygiZGV2aWNlOiAnJXMnOiAlczogY2xhc3MgdWV2ZW50KCkgIgotCQkJCSAicmV0dXJuZWQgJWRcbiIsIGRldi0+YnVzX2lkLAorCQkJCSAicmV0dXJuZWQgJWRcbiIsIGRldl9uYW1lKGRldiksCiAJCQkJIF9fZnVuY19fLCByZXR2YWwpOwogCX0KIApAQCAtMjI2LDcgKzIyOCw3IEBACiAJCXJldHZhbCA9IGRldi0+dHlwZS0+dWV2ZW50KGRldiwgZW52KTsKIAkJaWYgKHJldHZhbCkKIAkJCXByX2RlYnVnKCJkZXZpY2U6ICclcyc6ICVzOiBkZXZfdHlwZSB1ZXZlbnQoKSAiCi0JCQkJICJyZXR1cm5lZCAlZFxuIiwgZGV2LT5idXNfaWQsCisJCQkJICJyZXR1cm5lZCAlZFxuIiwgZGV2X25hbWUoZGV2KSwKIAkJCQkgX19mdW5jX18sIHJldHZhbCk7CiAJfQogCkBAIC01MDcsMTQgKzUwOSwxNiBAQAogCiBzdGF0aWMgdm9pZCBrbGlzdF9jaGlsZHJlbl9nZXQoc3RydWN0IGtsaXN0X25vZGUgKm4pCiB7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKG4sIHN0cnVjdCBkZXZpY2UsIGtub2RlX3BhcmVudCk7CisJc3RydWN0IGRldmljZV9wcml2YXRlICpwID0gdG9fZGV2aWNlX3ByaXZhdGVfcGFyZW50KG4pOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHAtPmRldmljZTsKIAogCWdldF9kZXZpY2UoZGV2KTsKIH0KIAogc3RhdGljIHZvaWQga2xpc3RfY2hpbGRyZW5fcHV0KHN0cnVjdCBrbGlzdF9ub2RlICpuKQogewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgZGV2aWNlLCBrbm9kZV9wYXJlbnQpOworCXN0cnVjdCBkZXZpY2VfcHJpdmF0ZSAqcCA9IHRvX2RldmljZV9wcml2YXRlX3BhcmVudChuKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBwLT5kZXZpY2U7CiAKIAlwdXRfZGV2aWNlKGRldik7CiB9CkBAIC01MzYsOSArNTQwLDE1IEBACiAgKi8KIHZvaWQgZGV2aWNlX2luaXRpYWxpemUoc3RydWN0IGRldmljZSAqZGV2KQogeworCWRldi0+cCA9IGt6YWxsb2Moc2l6ZW9mKCpkZXYtPnApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldi0+cCkgeworCQlXQVJOX09OKDEpOworCQlyZXR1cm47CisJfQorCWRldi0+cC0+ZGV2aWNlID0gZGV2OwogCWRldi0+a29iai5rc2V0ID0gZGV2aWNlc19rc2V0OwogCWtvYmplY3RfaW5pdCgmZGV2LT5rb2JqLCAmZGV2aWNlX2t0eXBlKTsKLQlrbGlzdF9pbml0KCZkZXYtPmtsaXN0X2NoaWxkcmVuLCBrbGlzdF9jaGlsZHJlbl9nZXQsCisJa2xpc3RfaW5pdCgmZGV2LT5wLT5rbGlzdF9jaGlsZHJlbiwga2xpc3RfY2hpbGRyZW5fZ2V0LAogCQkgICBrbGlzdF9jaGlsZHJlbl9wdXQpOwogCUlOSVRfTElTVF9IRUFEKCZkZXYtPmRtYV9wb29scyk7CiAJaW5pdF9NVVRFWCgmZGV2LT5zZW0pOwpAQCAtNjcyLDcgKzY4Miw3IEBACiAJaWYgKGRldi0+a29iai5wYXJlbnQgIT0gJmRldi0+Y2xhc3MtPnAtPmNsYXNzX3N1YnN5cy5rb2JqICYmCiAJICAgIGRldmljZV9pc19ub3RfcGFydGl0aW9uKGRldikpIHsKIAkJZXJyb3IgPSBzeXNmc19jcmVhdGVfbGluaygmZGV2LT5jbGFzcy0+cC0+Y2xhc3Nfc3Vic3lzLmtvYmosCi0JCQkJCSAgJmRldi0+a29iaiwgZGV2LT5idXNfaWQpOworCQkJCQkgICZkZXYtPmtvYmosIGRldl9uYW1lKGRldikpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG91dF9zdWJzeXM7CiAJfQpAQCAtNzEyLDExICs3MjIsMTEgQEAKIAlpZiAoZGV2LT5rb2JqLnBhcmVudCAhPSAmZGV2LT5jbGFzcy0+cC0+Y2xhc3Nfc3Vic3lzLmtvYmogJiYKIAkgICAgZGV2aWNlX2lzX25vdF9wYXJ0aXRpb24oZGV2KSkKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+Y2xhc3MtPnAtPmNsYXNzX3N1YnN5cy5rb2JqLAotCQkJCSAgZGV2LT5idXNfaWQpOworCQkJCSAgZGV2X25hbWUoZGV2KSk7CiAjZWxzZQogCS8qIGxpbmsgaW4gdGhlIGNsYXNzIGRpcmVjdG9yeSBwb2ludGluZyB0byB0aGUgZGV2aWNlICovCiAJZXJyb3IgPSBzeXNmc19jcmVhdGVfbGluaygmZGV2LT5jbGFzcy0+cC0+Y2xhc3Nfc3Vic3lzLmtvYmosCi0JCQkJICAmZGV2LT5rb2JqLCBkZXYtPmJ1c19pZCk7CisJCQkJICAmZGV2LT5rb2JqLCBkZXZfbmFtZShkZXYpKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X3N1YnN5czsKIApAQCAtNzI5LDcgKzczOSw3IEBACiAJcmV0dXJuIDA7CiAKIG91dF9idXNpZDoKLQlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5jbGFzcy0+cC0+Y2xhc3Nfc3Vic3lzLmtvYmosIGRldi0+YnVzX2lkKTsKKwlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5jbGFzcy0+cC0+Y2xhc3Nfc3Vic3lzLmtvYmosIGRldl9uYW1lKGRldikpOwogI2VuZGlmCiAKIG91dF9zdWJzeXM6CkBAIC03NTgsMTIgKzc2OCwxMiBAQAogCWlmIChkZXYtPmtvYmoucGFyZW50ICE9ICZkZXYtPmNsYXNzLT5wLT5jbGFzc19zdWJzeXMua29iaiAmJgogCSAgICBkZXZpY2VfaXNfbm90X3BhcnRpdGlvbihkZXYpKQogCQlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5jbGFzcy0+cC0+Y2xhc3Nfc3Vic3lzLmtvYmosCi0JCQkJICBkZXYtPmJ1c19pZCk7CisJCQkJICBkZXZfbmFtZShkZXYpKTsKICNlbHNlCiAJaWYgKGRldi0+cGFyZW50ICYmIGRldmljZV9pc19ub3RfcGFydGl0aW9uKGRldikpCiAJCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmtvYmosICJkZXZpY2UiKTsKIAotCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmNsYXNzLT5wLT5jbGFzc19zdWJzeXMua29iaiwgZGV2LT5idXNfaWQpOworCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmNsYXNzLT5wLT5jbGFzc19zdWJzeXMua29iaiwgZGV2X25hbWUoZGV2KSk7CiAjZW5kaWYKIAogCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmtvYmosICJzdWJzeXN0ZW0iKTsKQEAgLTg2Niw3ICs4NzYsNyBAQAogCWlmICghc3RybGVuKGRldi0+YnVzX2lkKSkKIAkJZ290byBkb25lOwogCi0JcHJfZGVidWcoImRldmljZTogJyVzJzogJXNcbiIsIGRldi0+YnVzX2lkLCBfX2Z1bmNfXyk7CisJcHJfZGVidWcoImRldmljZTogJyVzJzogJXNcbiIsIGRldl9uYW1lKGRldiksIF9fZnVuY19fKTsKIAogCXBhcmVudCA9IGdldF9kZXZpY2UoZGV2LT5wYXJlbnQpOwogCXNldHVwX3BhcmVudChkZXYsIHBhcmVudCk7CkBAIC04NzYsNyArODg2LDcgQEAKIAkJc2V0X2Rldl9ub2RlKGRldiwgZGV2X3RvX25vZGUocGFyZW50KSk7CiAKIAkvKiBmaXJzdCwgcmVnaXN0ZXIgd2l0aCBnZW5lcmljIGxheWVyLiAqLwotCWVycm9yID0ga29iamVjdF9hZGQoJmRldi0+a29iaiwgZGV2LT5rb2JqLnBhcmVudCwgIiVzIiwgZGV2LT5idXNfaWQpOworCWVycm9yID0ga29iamVjdF9hZGQoJmRldi0+a29iaiwgZGV2LT5rb2JqLnBhcmVudCwgIiVzIiwgZGV2X25hbWUoZGV2KSk7CiAJaWYgKGVycm9yKQogCQlnb3RvIEVycm9yOwogCkBAIC04ODQsMTEgKzg5NCw2IEBACiAJaWYgKHBsYXRmb3JtX25vdGlmeSkKIAkJcGxhdGZvcm1fbm90aWZ5KGRldik7CiAKLQkvKiBub3RpZnkgY2xpZW50cyBvZiBkZXZpY2UgZW50cnkgKG5ldyB3YXkpICovCi0JaWYgKGRldi0+YnVzKQotCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZkZXYtPmJ1cy0+cC0+YnVzX25vdGlmaWVyLAotCQkJCQkgICAgIEJVU19OT1RJRllfQUREX0RFVklDRSwgZGV2KTsKLQogCWVycm9yID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJnVldmVudF9hdHRyKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gYXR0ckVycm9yOwpAQCAtOTE2LDEwICs5MjEsMTkgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gRFBNRXJyb3I7CiAJZGV2aWNlX3BtX2FkZChkZXYpOworCisJLyogTm90aWZ5IGNsaWVudHMgb2YgZGV2aWNlIGFkZGl0aW9uLiAgVGhpcyBjYWxsIG11c3QgY29tZQorCSAqIGFmdGVyIGRwbV9zeXNmX2FkZCgpIGFuZCBiZWZvcmUga29iamVjdF91ZXZlbnQoKS4KKwkgKi8KKwlpZiAoZGV2LT5idXMpCisJCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJmRldi0+YnVzLT5wLT5idXNfbm90aWZpZXIsCisJCQkJCSAgICAgQlVTX05PVElGWV9BRERfREVWSUNFLCBkZXYpOworCiAJa29iamVjdF91ZXZlbnQoJmRldi0+a29iaiwgS09CSl9BREQpOwogCWJ1c19hdHRhY2hfZGV2aWNlKGRldik7CiAJaWYgKHBhcmVudCkKLQkJa2xpc3RfYWRkX3RhaWwoJmRldi0+a25vZGVfcGFyZW50LCAmcGFyZW50LT5rbGlzdF9jaGlsZHJlbik7CisJCWtsaXN0X2FkZF90YWlsKCZkZXYtPnAtPmtub2RlX3BhcmVudCwKKwkJCSAgICAgICAmcGFyZW50LT5wLT5rbGlzdF9jaGlsZHJlbik7CiAKIAlpZiAoZGV2LT5jbGFzcykgewogCQltdXRleF9sb2NrKCZkZXYtPmNsYXNzLT5wLT5jbGFzc19tdXRleCk7CkBAIC05NDAsOSArOTU0LDYgQEAKICBEUE1FcnJvcjoKIAlidXNfcmVtb3ZlX2RldmljZShkZXYpOwogIEJ1c0Vycm9yOgotCWlmIChkZXYtPmJ1cykKLQkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmZGV2LT5idXMtPnAtPmJ1c19ub3RpZmllciwKLQkJCQkJICAgICBCVVNfTk9USUZZX0RFTF9ERVZJQ0UsIGRldik7CiAJZGV2aWNlX3JlbW92ZV9hdHRycyhkZXYpOwogIEF0dHJzRXJyb3I6CiAJZGV2aWNlX3JlbW92ZV9jbGFzc19zeW1saW5rcyhkZXYpOwpAQCAtMTAyNywxMCArMTAzOCwxNiBAQAogCXN0cnVjdCBkZXZpY2UgKnBhcmVudCA9IGRldi0+cGFyZW50OwogCXN0cnVjdCBjbGFzc19pbnRlcmZhY2UgKmNsYXNzX2ludGY7CiAKKwkvKiBOb3RpZnkgY2xpZW50cyBvZiBkZXZpY2UgcmVtb3ZhbC4gIFRoaXMgY2FsbCBtdXN0IGNvbWUKKwkgKiBiZWZvcmUgZHBtX3N5c2ZzX3JlbW92ZSgpLgorCSAqLworCWlmIChkZXYtPmJ1cykKKwkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmZGV2LT5idXMtPnAtPmJ1c19ub3RpZmllciwKKwkJCQkJICAgICBCVVNfTk9USUZZX0RFTF9ERVZJQ0UsIGRldik7CiAJZGV2aWNlX3BtX3JlbW92ZShkZXYpOwogCWRwbV9zeXNmc19yZW1vdmUoZGV2KTsKIAlpZiAocGFyZW50KQotCQlrbGlzdF9kZWwoJmRldi0+a25vZGVfcGFyZW50KTsKKwkJa2xpc3RfZGVsKCZkZXYtPnAtPmtub2RlX3BhcmVudCk7CiAJaWYgKE1BSk9SKGRldi0+ZGV2dCkpIHsKIAkJZGV2aWNlX3JlbW92ZV9zeXNfZGV2X2VudHJ5KGRldik7CiAJCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZ0X2F0dHIpOwpAQCAtMTA2NCw5ICsxMDgxLDYgQEAKIAkgKi8KIAlpZiAocGxhdGZvcm1fbm90aWZ5X3JlbW92ZSkKIAkJcGxhdGZvcm1fbm90aWZ5X3JlbW92ZShkZXYpOwotCWlmIChkZXYtPmJ1cykKLQkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmZGV2LT5idXMtPnAtPmJ1c19ub3RpZmllciwKLQkJCQkJICAgICBCVVNfTk9USUZZX0RFTF9ERVZJQ0UsIGRldik7CiAJa29iamVjdF91ZXZlbnQoJmRldi0+a29iaiwgS09CSl9SRU1PVkUpOwogCWNsZWFudXBfZGV2aWNlX3BhcmVudChkZXYpOwogCWtvYmplY3RfZGVsKCZkZXYtPmtvYmopOwpAQCAtMTA4Niw3ICsxMTAwLDcgQEAKICAqLwogdm9pZCBkZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JcHJfZGVidWcoImRldmljZTogJyVzJzogJXNcbiIsIGRldi0+YnVzX2lkLCBfX2Z1bmNfXyk7CisJcHJfZGVidWcoImRldmljZTogJyVzJzogJXNcbiIsIGRldl9uYW1lKGRldiksIF9fZnVuY19fKTsKIAlkZXZpY2VfZGVsKGRldik7CiAJcHV0X2RldmljZShkZXYpOwogfQpAQCAtMTA5NCw3ICsxMTA4LDE0IEBACiBzdGF0aWMgc3RydWN0IGRldmljZSAqbmV4dF9kZXZpY2Uoc3RydWN0IGtsaXN0X2l0ZXIgKmkpCiB7CiAJc3RydWN0IGtsaXN0X25vZGUgKm4gPSBrbGlzdF9uZXh0KGkpOwotCXJldHVybiBuID8gY29udGFpbmVyX29mKG4sIHN0cnVjdCBkZXZpY2UsIGtub2RlX3BhcmVudCkgOiBOVUxMOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IGRldmljZV9wcml2YXRlICpwOworCisJaWYgKG4pIHsKKwkJcCA9IHRvX2RldmljZV9wcml2YXRlX3BhcmVudChuKTsKKwkJZGV2ID0gcC0+ZGV2aWNlOworCX0KKwlyZXR1cm4gZGV2OwogfQogCiAvKioKQEAgLTExMTYsNyArMTEzNyw3IEBACiAJc3RydWN0IGRldmljZSAqY2hpbGQ7CiAJaW50IGVycm9yID0gMDsKIAotCWtsaXN0X2l0ZXJfaW5pdCgmcGFyZW50LT5rbGlzdF9jaGlsZHJlbiwgJmkpOworCWtsaXN0X2l0ZXJfaW5pdCgmcGFyZW50LT5wLT5rbGlzdF9jaGlsZHJlbiwgJmkpOwogCXdoaWxlICgoY2hpbGQgPSBuZXh0X2RldmljZSgmaSkpICYmICFlcnJvcikKIAkJZXJyb3IgPSBmbihjaGlsZCwgZGF0YSk7CiAJa2xpc3RfaXRlcl9leGl0KCZpKTsKQEAgLTExNDcsNyArMTE2OCw3IEBACiAJaWYgKCFwYXJlbnQpCiAJCXJldHVybiBOVUxMOwogCi0Ja2xpc3RfaXRlcl9pbml0KCZwYXJlbnQtPmtsaXN0X2NoaWxkcmVuLCAmaSk7CisJa2xpc3RfaXRlcl9pbml0KCZwYXJlbnQtPnAtPmtsaXN0X2NoaWxkcmVuLCAmaSk7CiAJd2hpbGUgKChjaGlsZCA9IG5leHRfZGV2aWNlKCZpKSkpCiAJCWlmIChtYXRjaChjaGlsZCwgZGF0YSkgJiYgZ2V0X2RldmljZShjaGlsZCkpCiAJCQlicmVhazsKQEAgLTExOTYsMTAgKzEyMTcsMTAxIEBACiBFWFBPUlRfU1lNQk9MX0dQTChkZXZpY2VfY3JlYXRlX2ZpbGUpOwogRVhQT1JUX1NZTUJPTF9HUEwoZGV2aWNlX3JlbW92ZV9maWxlKTsKIAorc3RydWN0IHJvb3RfZGV2aWNlCit7CisJc3RydWN0IGRldmljZSBkZXY7CisJc3RydWN0IG1vZHVsZSAqb3duZXI7Cit9OworCisjZGVmaW5lIHRvX3Jvb3RfZGV2aWNlKGRldikgY29udGFpbmVyX29mKGRldiwgc3RydWN0IHJvb3RfZGV2aWNlLCBkZXYpCisKK3N0YXRpYyB2b2lkIHJvb3RfZGV2aWNlX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCWtmcmVlKHRvX3Jvb3RfZGV2aWNlKGRldikpOworfQorCisvKioKKyAqIF9fcm9vdF9kZXZpY2VfcmVnaXN0ZXIgLSBhbGxvY2F0ZSBhbmQgcmVnaXN0ZXIgYSByb290IGRldmljZQorICogQG5hbWU6IHJvb3QgZGV2aWNlIG5hbWUKKyAqIEBvd25lcjogb3duZXIgbW9kdWxlIG9mIHRoZSByb290IGRldmljZSwgdXN1YWxseSBUSElTX01PRFVMRQorICoKKyAqIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGEgcm9vdCBkZXZpY2UgYW5kIHJlZ2lzdGVycyBpdAorICogdXNpbmcgZGV2aWNlX3JlZ2lzdGVyKCkuIEluIG9yZGVyIHRvIGZyZWUgdGhlIHJldHVybmVkCisgKiBkZXZpY2UsIHVzZSByb290X2RldmljZV91bnJlZ2lzdGVyKCkuCisgKgorICogUm9vdCBkZXZpY2VzIGFyZSBkdW1teSBkZXZpY2VzIHdoaWNoIGFsbG93IG90aGVyIGRldmljZXMKKyAqIHRvIGJlIGdyb3VwZWQgdW5kZXIgL3N5cy9kZXZpY2VzLiBVc2UgdGhpcyBmdW5jdGlvbiB0bworICogYWxsb2NhdGUgYSByb290IGRldmljZSBhbmQgdGhlbiB1c2UgaXQgYXMgdGhlIHBhcmVudCBvZgorICogYW55IGRldmljZSB3aGljaCBzaG91bGQgYXBwZWFyIHVuZGVyIC9zeXMvZGV2aWNlcy97bmFtZX0KKyAqCisgKiBUaGUgL3N5cy9kZXZpY2VzL3tuYW1lfSBkaXJlY3Rvcnkgd2lsbCBhbHNvIGNvbnRhaW4gYQorICogJ21vZHVsZScgc3ltbGluayB3aGljaCBwb2ludHMgdG8gdGhlIEBvd25lciBkaXJlY3RvcnkKKyAqIGluIHN5c2ZzLgorICoKKyAqIE5vdGU6IFlvdSBwcm9iYWJseSB3YW50IHRvIHVzZSByb290X2RldmljZV9yZWdpc3RlcigpLgorICovCitzdHJ1Y3QgZGV2aWNlICpfX3Jvb3RfZGV2aWNlX3JlZ2lzdGVyKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBtb2R1bGUgKm93bmVyKQoreworCXN0cnVjdCByb290X2RldmljZSAqcm9vdDsKKwlpbnQgZXJyID0gLUVOT01FTTsKKworCXJvb3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgcm9vdF9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJvb3QpCisJCXJldHVybiBFUlJfUFRSKGVycik7CisKKwllcnIgPSBkZXZfc2V0X25hbWUoJnJvb3QtPmRldiwgbmFtZSk7CisJaWYgKGVycikgeworCQlrZnJlZShyb290KTsKKwkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKwl9CisKKwlyb290LT5kZXYucmVsZWFzZSA9IHJvb3RfZGV2aWNlX3JlbGVhc2U7CisKKwllcnIgPSBkZXZpY2VfcmVnaXN0ZXIoJnJvb3QtPmRldik7CisJaWYgKGVycikgeworCQlwdXRfZGV2aWNlKCZyb290LT5kZXYpOworCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCX0KKworI2lmZGVmIENPTkZJR19NT0RVTEUJLyogZ290dGEgZmluZCBhICJjbGVhbmVyIiB3YXkgdG8gZG8gdGhpcyAqLworCWlmIChvd25lcikgeworCQlzdHJ1Y3QgbW9kdWxlX2tvYmplY3QgKm1rID0gJm93bmVyLT5ta29iajsKKworCQllcnIgPSBzeXNmc19jcmVhdGVfbGluaygmcm9vdC0+ZGV2LmtvYmosICZtay0+a29iaiwgIm1vZHVsZSIpOworCQlpZiAoZXJyKSB7CisJCQlkZXZpY2VfdW5yZWdpc3Rlcigmcm9vdC0+ZGV2KTsKKwkJCXJldHVybiBFUlJfUFRSKGVycik7CisJCX0KKwkJcm9vdC0+b3duZXIgPSBvd25lcjsKKwl9CisjZW5kaWYKKworCXJldHVybiAmcm9vdC0+ZGV2OworfQorRVhQT1JUX1NZTUJPTF9HUEwoX19yb290X2RldmljZV9yZWdpc3Rlcik7CisKKy8qKgorICogcm9vdF9kZXZpY2VfdW5yZWdpc3RlciAtIHVucmVnaXN0ZXIgYW5kIGZyZWUgYSByb290IGRldmljZQorICogQHJvb3Q6IGRldmljZSBnb2luZyBhd2F5LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gdW5yZWdpc3RlcnMgYW5kIGNsZWFucyB1cCBhIGRldmljZSB0aGF0IHdhcyBjcmVhdGVkIGJ5CisgKiByb290X2RldmljZV9yZWdpc3RlcigpLgorICovCit2b2lkIHJvb3RfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCByb290X2RldmljZSAqcm9vdCA9IHRvX3Jvb3RfZGV2aWNlKGRldik7CisKKwlpZiAocm9vdC0+b3duZXIpCisJCXN5c2ZzX3JlbW92ZV9saW5rKCZyb290LT5kZXYua29iaiwgIm1vZHVsZSIpOworCisJZGV2aWNlX3VucmVnaXN0ZXIoZGV2KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJvb3RfZGV2aWNlX3VucmVnaXN0ZXIpOworCiAKIHN0YXRpYyB2b2lkIGRldmljZV9jcmVhdGVfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JcHJfZGVidWcoImRldmljZTogJyVzJzogJXNcbiIsIGRldi0+YnVzX2lkLCBfX2Z1bmNfXyk7CisJcHJfZGVidWcoImRldmljZTogJyVzJzogJXNcbiIsIGRldl9uYW1lKGRldiksIF9fZnVuY19fKTsKIAlrZnJlZShkZXYpOwogfQogCkBAIC0xMzQ0LDcgKzE0NTYsNyBAQAogCWlmICghZGV2KQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXByX2RlYnVnKCJkZXZpY2U6ICclcyc6ICVzOiByZW5hbWluZyB0byAnJXMnXG4iLCBkZXYtPmJ1c19pZCwKKwlwcl9kZWJ1ZygiZGV2aWNlOiAnJXMnOiAlczogcmVuYW1pbmcgdG8gJyVzJ1xuIiwgZGV2X25hbWUoZGV2KSwKIAkJIF9fZnVuY19fLCBuZXdfbmFtZSk7CiAKICNpZmRlZiBDT05GSUdfU1lTRlNfREVQUkVDQVRFRApAQCAtMTM4MSw3ICsxNDkzLDcgQEAKICNlbHNlCiAJaWYgKGRldi0+Y2xhc3MpIHsKIAkJZXJyb3IgPSBzeXNmc19jcmVhdGVfbGlua19ub3dhcm4oJmRldi0+Y2xhc3MtPnAtPmNsYXNzX3N1YnN5cy5rb2JqLAotCQkJCQkJICZkZXYtPmtvYmosIGRldi0+YnVzX2lkKTsKKwkJCQkJCSAmZGV2LT5rb2JqLCBkZXZfbmFtZShkZXYpKTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBvdXQ7CiAJCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmNsYXNzLT5wLT5jbGFzc19zdWJzeXMua29iaiwKQEAgLTE0NTksOCArMTU3MSw4IEBACiAJbmV3X3BhcmVudCA9IGdldF9kZXZpY2UobmV3X3BhcmVudCk7CiAJbmV3X3BhcmVudF9rb2JqID0gZ2V0X2RldmljZV9wYXJlbnQoZGV2LCBuZXdfcGFyZW50KTsKIAotCXByX2RlYnVnKCJkZXZpY2U6ICclcyc6ICVzOiBtb3ZpbmcgdG8gJyVzJ1xuIiwgZGV2LT5idXNfaWQsCi0JCSBfX2Z1bmNfXywgbmV3X3BhcmVudCA/IG5ld19wYXJlbnQtPmJ1c19pZCA6ICI8TlVMTD4iKTsKKwlwcl9kZWJ1ZygiZGV2aWNlOiAnJXMnOiAlczogbW92aW5nIHRvICclcydcbiIsIGRldl9uYW1lKGRldiksCisJCSBfX2Z1bmNfXywgbmV3X3BhcmVudCA/IGRldl9uYW1lKG5ld19wYXJlbnQpIDogIjxOVUxMPiIpOwogCWVycm9yID0ga29iamVjdF9tb3ZlKCZkZXYtPmtvYmosIG5ld19wYXJlbnRfa29iaik7CiAJaWYgKGVycm9yKSB7CiAJCWNsZWFudXBfZ2x1ZV9kaXIoZGV2LCBuZXdfcGFyZW50X2tvYmopOwpAQCAtMTQ3MCw5ICsxNTgyLDEwIEBACiAJb2xkX3BhcmVudCA9IGRldi0+cGFyZW50OwogCWRldi0+cGFyZW50ID0gbmV3X3BhcmVudDsKIAlpZiAob2xkX3BhcmVudCkKLQkJa2xpc3RfcmVtb3ZlKCZkZXYtPmtub2RlX3BhcmVudCk7CisJCWtsaXN0X3JlbW92ZSgmZGV2LT5wLT5rbm9kZV9wYXJlbnQpOwogCWlmIChuZXdfcGFyZW50KSB7Ci0JCWtsaXN0X2FkZF90YWlsKCZkZXYtPmtub2RlX3BhcmVudCwgJm5ld19wYXJlbnQtPmtsaXN0X2NoaWxkcmVuKTsKKwkJa2xpc3RfYWRkX3RhaWwoJmRldi0+cC0+a25vZGVfcGFyZW50LAorCQkJICAgICAgICZuZXdfcGFyZW50LT5wLT5rbGlzdF9jaGlsZHJlbik7CiAJCXNldF9kZXZfbm9kZShkZXYsIGRldl90b19ub2RlKG5ld19wYXJlbnQpKTsKIAl9CiAKQEAgLTE0ODQsMTEgKzE1OTcsMTEgQEAKIAkJZGV2aWNlX21vdmVfY2xhc3NfbGlua3MoZGV2LCBuZXdfcGFyZW50LCBvbGRfcGFyZW50KTsKIAkJaWYgKCFrb2JqZWN0X21vdmUoJmRldi0+a29iaiwgJm9sZF9wYXJlbnQtPmtvYmopKSB7CiAJCQlpZiAobmV3X3BhcmVudCkKLQkJCQlrbGlzdF9yZW1vdmUoJmRldi0+a25vZGVfcGFyZW50KTsKKwkJCQlrbGlzdF9yZW1vdmUoJmRldi0+cC0+a25vZGVfcGFyZW50KTsKIAkJCWRldi0+cGFyZW50ID0gb2xkX3BhcmVudDsKIAkJCWlmIChvbGRfcGFyZW50KSB7Ci0JCQkJa2xpc3RfYWRkX3RhaWwoJmRldi0+a25vZGVfcGFyZW50LAotCQkJCQkgICAgICAgJm9sZF9wYXJlbnQtPmtsaXN0X2NoaWxkcmVuKTsKKwkJCQlrbGlzdF9hZGRfdGFpbCgmZGV2LT5wLT5rbm9kZV9wYXJlbnQsCisJCQkJCSAgICAgICAmb2xkX3BhcmVudC0+cC0+a2xpc3RfY2hpbGRyZW4pOwogCQkJCXNldF9kZXZfbm9kZShkZXYsIGRldl90b19ub2RlKG9sZF9wYXJlbnQpKTsKIAkJCX0KIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2RkLmMgYi9kcml2ZXJzL2Jhc2UvZGQuYwppbmRleCAyMGZlYmMwLi42ZmRhZjc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvZGQuYworKysgYi9kcml2ZXJzL2Jhc2UvZGQuYwpAQCAtMjgsMjAgKzI4LDIwIEBACiAKIHN0YXRpYyB2b2lkIGRyaXZlcl9ib3VuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JaWYgKGtsaXN0X25vZGVfYXR0YWNoZWQoJmRldi0+a25vZGVfZHJpdmVyKSkgeworCWlmIChrbGlzdF9ub2RlX2F0dGFjaGVkKCZkZXYtPnAtPmtub2RlX2RyaXZlcikpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRldmljZSAlcyBhbHJlYWR5IGJvdW5kXG4iLAogCQkJX19mdW5jX18sIGtvYmplY3RfbmFtZSgmZGV2LT5rb2JqKSk7CiAJCXJldHVybjsKIAl9CiAKLQlwcl9kZWJ1ZygiZHJpdmVyOiAnJXMnOiAlczogYm91bmQgdG8gZGV2aWNlICclcydcbiIsIGRldi0+YnVzX2lkLAorCXByX2RlYnVnKCJkcml2ZXI6ICclcyc6ICVzOiBib3VuZCB0byBkZXZpY2UgJyVzJ1xuIiwgZGV2X25hbWUoZGV2KSwKIAkJIF9fZnVuY19fLCBkZXYtPmRyaXZlci0+bmFtZSk7CiAKIAlpZiAoZGV2LT5idXMpCiAJCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJmRldi0+YnVzLT5wLT5idXNfbm90aWZpZXIsCiAJCQkJCSAgICAgQlVTX05PVElGWV9CT1VORF9EUklWRVIsIGRldik7CiAKLQlrbGlzdF9hZGRfdGFpbCgmZGV2LT5rbm9kZV9kcml2ZXIsICZkZXYtPmRyaXZlci0+cC0+a2xpc3RfZGV2aWNlcyk7CisJa2xpc3RfYWRkX3RhaWwoJmRldi0+cC0+a25vZGVfZHJpdmVyLCAmZGV2LT5kcml2ZXItPnAtPmtsaXN0X2RldmljZXMpOwogfQogCiBzdGF0aWMgaW50IGRyaXZlcl9zeXNmc19hZGQoc3RydWN0IGRldmljZSAqZGV2KQpAQCAtMTA0LDEzICsxMDQsMTMgQEAKIAogCWF0b21pY19pbmMoJnByb2JlX2NvdW50KTsKIAlwcl9kZWJ1ZygiYnVzOiAnJXMnOiAlczogcHJvYmluZyBkcml2ZXIgJXMgd2l0aCBkZXZpY2UgJXNcbiIsCi0JCSBkcnYtPmJ1cy0+bmFtZSwgX19mdW5jX18sIGRydi0+bmFtZSwgZGV2LT5idXNfaWQpOworCQkgZHJ2LT5idXMtPm5hbWUsIF9fZnVuY19fLCBkcnYtPm5hbWUsIGRldl9uYW1lKGRldikpOwogCVdBUk5fT04oIWxpc3RfZW1wdHkoJmRldi0+ZGV2cmVzX2hlYWQpKTsKIAogCWRldi0+ZHJpdmVyID0gZHJ2OwogCWlmIChkcml2ZXJfc3lzZnNfYWRkKGRldikpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogZHJpdmVyX3N5c2ZzX2FkZCglcykgZmFpbGVkXG4iLAotCQkJX19mdW5jX18sIGRldi0+YnVzX2lkKTsKKwkJCV9fZnVuY19fLCBkZXZfbmFtZShkZXYpKTsKIAkJZ290byBwcm9iZV9mYWlsZWQ7CiAJfQogCkBAIC0xMjcsNyArMTI3LDcgQEAKIAlkcml2ZXJfYm91bmQoZGV2KTsKIAlyZXQgPSAxOwogCXByX2RlYnVnKCJidXM6ICclcyc6ICVzOiBib3VuZCBkZXZpY2UgJXMgdG8gZHJpdmVyICVzXG4iLAotCQkgZHJ2LT5idXMtPm5hbWUsIF9fZnVuY19fLCBkZXYtPmJ1c19pZCwgZHJ2LT5uYW1lKTsKKwkJIGRydi0+YnVzLT5uYW1lLCBfX2Z1bmNfXywgZGV2X25hbWUoZGV2KSwgZHJ2LT5uYW1lKTsKIAlnb3RvIGRvbmU7CiAKIHByb2JlX2ZhaWxlZDoKQEAgLTEzOSw3ICsxMzksNyBAQAogCQkvKiBkcml2ZXIgbWF0Y2hlZCBidXQgdGhlIHByb2JlIGZhaWxlZCAqLwogCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCSAgICAgICAiJXM6IHByb2JlIG9mICVzIGZhaWxlZCB3aXRoIGVycm9yICVkXG4iLAotCQkgICAgICAgZHJ2LT5uYW1lLCBkZXYtPmJ1c19pZCwgcmV0KTsKKwkJICAgICAgIGRydi0+bmFtZSwgZGV2X25hbWUoZGV2KSwgcmV0KTsKIAl9CiAJLyoKIAkgKiBJZ25vcmUgZXJyb3JzIHJldHVybmVkIGJ5IC0+cHJvYmUgc28gdGhhdCB0aGUgbmV4dCBkcml2ZXIgY2FuIHRyeQpAQCAtMTk0LDcgKzE5NCw3IEBACiAJCWdvdG8gZG9uZTsKIAogCXByX2RlYnVnKCJidXM6ICclcyc6ICVzOiBtYXRjaGVkIGRldmljZSAlcyB3aXRoIGRyaXZlciAlc1xuIiwKLQkJIGRydi0+YnVzLT5uYW1lLCBfX2Z1bmNfXywgZGV2LT5idXNfaWQsIGRydi0+bmFtZSk7CisJCSBkcnYtPmJ1cy0+bmFtZSwgX19mdW5jX18sIGRldl9uYW1lKGRldiksIGRydi0+bmFtZSk7CiAKIAlyZXQgPSByZWFsbHlfcHJvYmUoZGV2LCBkcnYpOwogCkBAIC0yOTgsNyArMjk4LDYgQEAKIAlkcnYgPSBkZXYtPmRyaXZlcjsKIAlpZiAoZHJ2KSB7CiAJCWRyaXZlcl9zeXNmc19yZW1vdmUoZGV2KTsKLQkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+a29iaiwgImRyaXZlciIpOwogCiAJCWlmIChkZXYtPmJ1cykKIAkJCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJmRldi0+YnVzLT5wLT5idXNfbm90aWZpZXIsCkBAIC0zMTEsNyArMzEwLDcgQEAKIAkJCWRydi0+cmVtb3ZlKGRldik7CiAJCWRldnJlc19yZWxlYXNlX2FsbChkZXYpOwogCQlkZXYtPmRyaXZlciA9IE5VTEw7Ci0JCWtsaXN0X3JlbW92ZSgmZGV2LT5rbm9kZV9kcml2ZXIpOworCQlrbGlzdF9yZW1vdmUoJmRldi0+cC0+a25vZGVfZHJpdmVyKTsKIAl9CiB9CiAKQEAgLTM0MSw2ICszNDAsNyBAQAogICovCiB2b2lkIGRyaXZlcl9kZXRhY2goc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKIHsKKwlzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUgKmRldl9wcnY7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCiAJZm9yICg7OykgewpAQCAtMzQ5LDggKzM0OSwxMCBAQAogCQkJc3Bpbl91bmxvY2soJmRydi0+cC0+a2xpc3RfZGV2aWNlcy5rX2xvY2spOwogCQkJYnJlYWs7CiAJCX0KLQkJZGV2ID0gbGlzdF9lbnRyeShkcnYtPnAtPmtsaXN0X2RldmljZXMua19saXN0LnByZXYsCi0JCQkJc3RydWN0IGRldmljZSwga25vZGVfZHJpdmVyLm5fbm9kZSk7CisJCWRldl9wcnYgPSBsaXN0X2VudHJ5KGRydi0+cC0+a2xpc3RfZGV2aWNlcy5rX2xpc3QucHJldiwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfcHJpdmF0ZSwKKwkJCQkgICAgIGtub2RlX2RyaXZlci5uX25vZGUpOworCQlkZXYgPSBkZXZfcHJ2LT5kZXZpY2U7CiAJCWdldF9kZXZpY2UoZGV2KTsKIAkJc3Bpbl91bmxvY2soJmRydi0+cC0+a2xpc3RfZGV2aWNlcy5rX2xvY2spOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZHJpdmVyLmMgYi9kcml2ZXJzL2Jhc2UvZHJpdmVyLmMKaW5kZXggMWUyYmRhNy4uYjc2Y2M2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2RyaXZlci5jCisrKyBiL2RyaXZlcnMvYmFzZS9kcml2ZXIuYwpAQCAtMTksNyArMTksMTQgQEAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlICpuZXh0X2RldmljZShzdHJ1Y3Qga2xpc3RfaXRlciAqaSkKIHsKIAlzdHJ1Y3Qga2xpc3Rfbm9kZSAqbiA9IGtsaXN0X25leHQoaSk7Ci0JcmV0dXJuIG4gPyBjb250YWluZXJfb2Yobiwgc3RydWN0IGRldmljZSwga25vZGVfZHJpdmVyKSA6IE5VTEw7CisJc3RydWN0IGRldmljZSAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUgKmRldl9wcnY7CisKKwlpZiAobikgeworCQlkZXZfcHJ2ID0gdG9fZGV2aWNlX3ByaXZhdGVfZHJpdmVyKG4pOworCQlkZXYgPSBkZXZfcHJ2LT5kZXZpY2U7CisJfQorCXJldHVybiBkZXY7CiB9CiAKIC8qKgpAQCAtNDIsNyArNDksNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWtsaXN0X2l0ZXJfaW5pdF9ub2RlKCZkcnYtPnAtPmtsaXN0X2RldmljZXMsICZpLAotCQkJICAgICBzdGFydCA/ICZzdGFydC0+a25vZGVfZHJpdmVyIDogTlVMTCk7CisJCQkgICAgIHN0YXJ0ID8gJnN0YXJ0LT5wLT5rbm9kZV9kcml2ZXIgOiBOVUxMKTsKIAl3aGlsZSAoKGRldiA9IG5leHRfZGV2aWNlKCZpKSkgJiYgIWVycm9yKQogCQllcnJvciA9IGZuKGRldiwgZGF0YSk7CiAJa2xpc3RfaXRlcl9leGl0KCZpKTsKQEAgLTc2LDcgKzgzLDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlrbGlzdF9pdGVyX2luaXRfbm9kZSgmZHJ2LT5wLT5rbGlzdF9kZXZpY2VzLCAmaSwKLQkJCSAgICAgKHN0YXJ0ID8gJnN0YXJ0LT5rbm9kZV9kcml2ZXIgOiBOVUxMKSk7CisJCQkgICAgIChzdGFydCA/ICZzdGFydC0+cC0+a25vZGVfZHJpdmVyIDogTlVMTCkpOwogCXdoaWxlICgoZGV2ID0gbmV4dF9kZXZpY2UoJmkpKSkKIAkJaWYgKG1hdGNoKGRldiwgZGF0YSkgJiYgZ2V0X2RldmljZShkZXYpKQogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZmlybXdhcmVfY2xhc3MuYyBiL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jCmluZGV4IGI3ZTU3MTAuLjQ0Njk5ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jCkBAIC0yOTEsMTIgKzI5MSw2IEBACiAJZndfbG9hZF9hYm9ydChmd19wcml2KTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGZ3X3NldHVwX2RldmljZV9pZChzdHJ1Y3QgZGV2aWNlICpmX2Rldiwgc3RydWN0IGRldmljZSAqZGV2KQotewotCS8qIFhYWCB3YXJuaW5nIHdlIHNob3VsZCB3YXRjaCBvdXQgZm9yIG5hbWUgY29sbGlzaW9ucyAqLwotCXN0cmxjcHkoZl9kZXYtPmJ1c19pZCwgZGV2LT5idXNfaWQsIEJVU19JRF9TSVpFKTsKLX0KLQogc3RhdGljIGludCBmd19yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqKmRldl9wLCBjb25zdCBjaGFyICpmd19uYW1lLAogCQkJICAgICAgc3RydWN0IGRldmljZSAqZGV2aWNlKQogewpAQCAtMzIxLDcgKzMxNSw3IEBACiAJZndfcHJpdi0+dGltZW91dC5kYXRhID0gKHVfbG9uZykgZndfcHJpdjsKIAlpbml0X3RpbWVyKCZmd19wcml2LT50aW1lb3V0KTsKIAotCWZ3X3NldHVwX2RldmljZV9pZChmX2RldiwgZGV2aWNlKTsKKwlkZXZfc2V0X25hbWUoZl9kZXYsIGRldl9uYW1lKGRldmljZSkpOwogCWZfZGV2LT5wYXJlbnQgPSBkZXZpY2U7CiAJZl9kZXYtPmNsYXNzID0gJmZpcm13YXJlX2NsYXNzOwogCWRldl9zZXRfZHJ2ZGF0YShmX2RldiwgZndfcHJpdik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvaXNhLmMgYi9kcml2ZXJzL2Jhc2UvaXNhLmMKaW5kZXggZWZkNTc3NS4uNDc5Njk0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2lzYS5jCisrKyBiL2RyaXZlcnMvYmFzZS9pc2EuYwpAQCAtMTEsNyArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lzYS5oPgogCiBzdGF0aWMgc3RydWN0IGRldmljZSBpc2FfYnVzID0gewotCS5idXNfaWQJCT0gImlzYSIKKwkuaW5pdF9uYW1lCT0gImlzYSIKIH07CiAKIHN0cnVjdCBpc2FfZGV2IHsKQEAgLTEzNSw5ICsxMzUsOCBAQAogCQlpc2FfZGV2LT5kZXYucGFyZW50CT0gJmlzYV9idXM7CiAJCWlzYV9kZXYtPmRldi5idXMJPSAmaXNhX2J1c190eXBlOwogCi0JCXNucHJpbnRmKGlzYV9kZXYtPmRldi5idXNfaWQsIEJVU19JRF9TSVpFLCAiJXMuJXUiLAotCQkJCWlzYV9kcml2ZXItPmRyaXZlci5uYW1lLCBpZCk7Ci0KKwkJZGV2X3NldF9uYW1lKCZpc2FfZGV2LT5kZXYsICIlcy4ldSIsCisJCQkgICAgIGlzYV9kcml2ZXItPmRyaXZlci5uYW1lLCBpZCk7CiAJCWlzYV9kZXYtPmRldi5wbGF0Zm9ybV9kYXRhCT0gaXNhX2RyaXZlcjsKIAkJaXNhX2Rldi0+ZGV2LnJlbGVhc2UJCT0gaXNhX2Rldl9yZWxlYXNlOwogCQlpc2FfZGV2LT5pZAkJCT0gaWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvbWVtb3J5LmMgYi9kcml2ZXJzL2Jhc2UvbWVtb3J5LmMKaW5kZXggNTI2MGU5ZS4uOTg5NDI5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL21lbW9yeS5jCisrKyBiL2RyaXZlcnMvYmFzZS9tZW1vcnkuYwpAQCAtMzQ3LDggKzM0Nyw5IEBACiAgKiBzZWN0aW9uIGJlbG9uZ3MgdG8uLi4KICAqLwogCi1zdGF0aWMgaW50IGFkZF9tZW1vcnlfYmxvY2sodW5zaWduZWQgbG9uZyBub2RlX2lkLCBzdHJ1Y3QgbWVtX3NlY3Rpb24gKnNlY3Rpb24sCi0JCSAgICAgdW5zaWduZWQgbG9uZyBzdGF0ZSwgaW50IHBoeXNfZGV2aWNlKQorc3RhdGljIGludCBhZGRfbWVtb3J5X2Jsb2NrKGludCBuaWQsIHN0cnVjdCBtZW1fc2VjdGlvbiAqc2VjdGlvbiwKKwkJCXVuc2lnbmVkIGxvbmcgc3RhdGUsIGludCBwaHlzX2RldmljZSwKKwkJCWVudW0gbWVtX2FkZF9jb250ZXh0IGNvbnRleHQpCiB7CiAJc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtID0ga3phbGxvYyhzaXplb2YoKm1lbSksIEdGUF9LRVJORUwpOwogCWludCByZXQgPSAwOwpAQCAtMzcwLDYgKzM3MSwxMCBAQAogCQlyZXQgPSBtZW1fY3JlYXRlX3NpbXBsZV9maWxlKG1lbSwgcGh5c19kZXZpY2UpOwogCWlmICghcmV0KQogCQlyZXQgPSBtZW1fY3JlYXRlX3NpbXBsZV9maWxlKG1lbSwgcmVtb3ZhYmxlKTsKKwlpZiAoIXJldCkgeworCQlpZiAoY29udGV4dCA9PSBIT1RQTFVHKQorCQkJcmV0ID0gcmVnaXN0ZXJfbWVtX3NlY3RfdW5kZXJfbm9kZShtZW0sIG5pZCk7CisJfQogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTM4Miw3ICszODcsNyBAQAogICoKICAqIFRoaXMgY291bGQgYmUgbWFkZSBnZW5lcmljIGZvciBhbGwgc3lzZGV2IGNsYXNzZXMuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgbWVtb3J5X2Jsb2NrICpmaW5kX21lbW9yeV9ibG9jayhzdHJ1Y3QgbWVtX3NlY3Rpb24gKnNlY3Rpb24pCitzdHJ1Y3QgbWVtb3J5X2Jsb2NrICpmaW5kX21lbW9yeV9ibG9jayhzdHJ1Y3QgbWVtX3NlY3Rpb24gKnNlY3Rpb24pCiB7CiAJc3RydWN0IGtvYmplY3QgKmtvYmo7CiAJc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldjsKQEAgLTQxMSw2ICs0MTYsNyBAQAogCXN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbTsKIAogCW1lbSA9IGZpbmRfbWVtb3J5X2Jsb2NrKHNlY3Rpb24pOworCXVucmVnaXN0ZXJfbWVtX3NlY3RfdW5kZXJfbm9kZXMobWVtKTsKIAltZW1fcmVtb3ZlX3NpbXBsZV9maWxlKG1lbSwgcGh5c19pbmRleCk7CiAJbWVtX3JlbW92ZV9zaW1wbGVfZmlsZShtZW0sIHN0YXRlKTsKIAltZW1fcmVtb3ZlX3NpbXBsZV9maWxlKG1lbSwgcGh5c19kZXZpY2UpOwpAQCAtNDI0LDkgKzQzMCw5IEBACiAgKiBuZWVkIGFuIGludGVyZmFjZSBmb3IgdGhlIFZNIHRvIGFkZCBuZXcgbWVtb3J5IHJlZ2lvbnMsCiAgKiBidXQgd2l0aG91dCBvbmxpbmluZyBpdC4KICAqLwotaW50IHJlZ2lzdGVyX25ld19tZW1vcnkoc3RydWN0IG1lbV9zZWN0aW9uICpzZWN0aW9uKQoraW50IHJlZ2lzdGVyX25ld19tZW1vcnkoaW50IG5pZCwgc3RydWN0IG1lbV9zZWN0aW9uICpzZWN0aW9uKQogewotCXJldHVybiBhZGRfbWVtb3J5X2Jsb2NrKDAsIHNlY3Rpb24sIE1FTV9PRkZMSU5FLCAwKTsKKwlyZXR1cm4gYWRkX21lbW9yeV9ibG9jayhuaWQsIHNlY3Rpb24sIE1FTV9PRkZMSU5FLCAwLCBIT1RQTFVHKTsKIH0KIAogaW50IHVucmVnaXN0ZXJfbWVtb3J5X3NlY3Rpb24oc3RydWN0IG1lbV9zZWN0aW9uICpzZWN0aW9uKQpAQCAtNDU4LDcgKzQ2NCw4IEBACiAJZm9yIChpID0gMDsgaSA8IE5SX01FTV9TRUNUSU9OUzsgaSsrKSB7CiAJCWlmICghcHJlc2VudF9zZWN0aW9uX25yKGkpKQogCQkJY29udGludWU7Ci0JCWVyciA9IGFkZF9tZW1vcnlfYmxvY2soMCwgX19ucl90b19zZWN0aW9uKGkpLCBNRU1fT05MSU5FLCAwKTsKKwkJZXJyID0gYWRkX21lbW9yeV9ibG9jaygwLCBfX25yX3RvX3NlY3Rpb24oaSksIE1FTV9PTkxJTkUsCisJCQkJCTAsIEJPT1QpOwogCQlpZiAoIXJldCkKIAkJCXJldCA9IGVycjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2Uvbm9kZS5jIGIvZHJpdmVycy9iYXNlL25vZGUuYwppbmRleCA5MTYzNmNkLi40M2ZhOTBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2Uvbm9kZS5jCisrKyBiL2RyaXZlcnMvYmFzZS9ub2RlLmMKQEAgLTYsNiArNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbWVtb3J5Lmg+CiAjaW5jbHVkZSA8bGludXgvbm9kZS5oPgogI2luY2x1ZGUgPGxpbnV4L2h1Z2V0bGIuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CkBAIC0yNDgsNiArMjQ5LDEwNSBAQAogCXJldHVybiAwOwogfQogCisjaWZkZWYgQ09ORklHX01FTU9SWV9IT1RQTFVHX1NQQVJTRQorI2RlZmluZSBwYWdlX2luaXRpYWxpemVkKHBhZ2UpICAocGFnZS0+bHJ1Lm5leHQpCisKK3N0YXRpYyBpbnQgZ2V0X25pZF9mb3JfcGZuKHVuc2lnbmVkIGxvbmcgcGZuKQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCisJaWYgKCFwZm5fdmFsaWRfd2l0aGluKHBmbikpCisJCXJldHVybiAtMTsKKwlwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKKwlpZiAoIXBhZ2VfaW5pdGlhbGl6ZWQocGFnZSkpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gcGZuX3RvX25pZChwZm4pOworfQorCisvKiByZWdpc3RlciBtZW1vcnkgc2VjdGlvbiB1bmRlciBzcGVjaWZpZWQgbm9kZSBpZiBpdCBzcGFucyB0aGF0IG5vZGUgKi8KK2ludCByZWdpc3Rlcl9tZW1fc2VjdF91bmRlcl9ub2RlKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbV9ibGssIGludCBuaWQpCit7CisJdW5zaWduZWQgbG9uZyBwZm4sIHNlY3Rfc3RhcnRfcGZuLCBzZWN0X2VuZF9wZm47CisKKwlpZiAoIW1lbV9ibGspCisJCXJldHVybiAtRUZBVUxUOworCWlmICghbm9kZV9vbmxpbmUobmlkKSkKKwkJcmV0dXJuIDA7CisJc2VjdF9zdGFydF9wZm4gPSBzZWN0aW9uX25yX3RvX3BmbihtZW1fYmxrLT5waHlzX2luZGV4KTsKKwlzZWN0X2VuZF9wZm4gPSBzZWN0X3N0YXJ0X3BmbiArIFBBR0VTX1BFUl9TRUNUSU9OIC0gMTsKKwlmb3IgKHBmbiA9IHNlY3Rfc3RhcnRfcGZuOyBwZm4gPD0gc2VjdF9lbmRfcGZuOyBwZm4rKykgeworCQlpbnQgcGFnZV9uaWQ7CisKKwkJcGFnZV9uaWQgPSBnZXRfbmlkX2Zvcl9wZm4ocGZuKTsKKwkJaWYgKHBhZ2VfbmlkIDwgMCkKKwkJCWNvbnRpbnVlOworCQlpZiAocGFnZV9uaWQgIT0gbmlkKQorCQkJY29udGludWU7CisJCXJldHVybiBzeXNmc19jcmVhdGVfbGlua19ub3dhcm4oJm5vZGVfZGV2aWNlc1tuaWRdLnN5c2Rldi5rb2JqLAorCQkJCQkmbWVtX2Jsay0+c3lzZGV2LmtvYmosCisJCQkJCWtvYmplY3RfbmFtZSgmbWVtX2Jsay0+c3lzZGV2LmtvYmopKTsKKwl9CisJLyogbWVtIHNlY3Rpb24gZG9lcyBub3Qgc3BhbiB0aGUgc3BlY2lmaWVkIG5vZGUgKi8KKwlyZXR1cm4gMDsKK30KKworLyogdW5yZWdpc3RlciBtZW1vcnkgc2VjdGlvbiB1bmRlciBhbGwgbm9kZXMgdGhhdCBpdCBzcGFucyAqLworaW50IHVucmVnaXN0ZXJfbWVtX3NlY3RfdW5kZXJfbm9kZXMoc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtX2JsaykKK3sKKwlub2RlbWFza190IHVubGlua2VkX25vZGVzOworCXVuc2lnbmVkIGxvbmcgcGZuLCBzZWN0X3N0YXJ0X3Bmbiwgc2VjdF9lbmRfcGZuOworCisJaWYgKCFtZW1fYmxrKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlub2Rlc19jbGVhcih1bmxpbmtlZF9ub2Rlcyk7CisJc2VjdF9zdGFydF9wZm4gPSBzZWN0aW9uX25yX3RvX3BmbihtZW1fYmxrLT5waHlzX2luZGV4KTsKKwlzZWN0X2VuZF9wZm4gPSBzZWN0X3N0YXJ0X3BmbiArIFBBR0VTX1BFUl9TRUNUSU9OIC0gMTsKKwlmb3IgKHBmbiA9IHNlY3Rfc3RhcnRfcGZuOyBwZm4gPD0gc2VjdF9lbmRfcGZuOyBwZm4rKykgeworCQl1bnNpZ25lZCBpbnQgbmlkOworCisJCW5pZCA9IGdldF9uaWRfZm9yX3BmbihwZm4pOworCQlpZiAobmlkIDwgMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoIW5vZGVfb25saW5lKG5pZCkpCisJCQljb250aW51ZTsKKwkJaWYgKG5vZGVfdGVzdF9hbmRfc2V0KG5pZCwgdW5saW5rZWRfbm9kZXMpKQorCQkJY29udGludWU7CisJCXN5c2ZzX3JlbW92ZV9saW5rKCZub2RlX2RldmljZXNbbmlkXS5zeXNkZXYua29iaiwKKwkJCSBrb2JqZWN0X25hbWUoJm1lbV9ibGstPnN5c2Rldi5rb2JqKSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxpbmtfbWVtX3NlY3Rpb25zKGludCBuaWQpCit7CisJdW5zaWduZWQgbG9uZyBzdGFydF9wZm4gPSBOT0RFX0RBVEEobmlkKS0+bm9kZV9zdGFydF9wZm47CisJdW5zaWduZWQgbG9uZyBlbmRfcGZuID0gc3RhcnRfcGZuICsgTk9ERV9EQVRBKG5pZCktPm5vZGVfc3Bhbm5lZF9wYWdlczsKKwl1bnNpZ25lZCBsb25nIHBmbjsKKwlpbnQgZXJyID0gMDsKKworCWZvciAocGZuID0gc3RhcnRfcGZuOyBwZm4gPCBlbmRfcGZuOyBwZm4gKz0gUEFHRVNfUEVSX1NFQ1RJT04pIHsKKwkJdW5zaWduZWQgbG9uZyBzZWN0aW9uX25yID0gcGZuX3RvX3NlY3Rpb25fbnIocGZuKTsKKwkJc3RydWN0IG1lbV9zZWN0aW9uICptZW1fc2VjdDsKKwkJc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtX2JsazsKKwkJaW50IHJldDsKKworCQlpZiAoIXByZXNlbnRfc2VjdGlvbl9ucihzZWN0aW9uX25yKSkKKwkJCWNvbnRpbnVlOworCQltZW1fc2VjdCA9IF9fbnJfdG9fc2VjdGlvbihzZWN0aW9uX25yKTsKKwkJbWVtX2JsayA9IGZpbmRfbWVtb3J5X2Jsb2NrKG1lbV9zZWN0KTsKKwkJcmV0ID0gcmVnaXN0ZXJfbWVtX3NlY3RfdW5kZXJfbm9kZShtZW1fYmxrLCBuaWQpOworCQlpZiAoIWVycikKKwkJCWVyciA9IHJldDsKKworCQkvKiBkaXNjYXJkIHJlZiBvYnRhaW5lZCBpbiBmaW5kX21lbW9yeV9ibG9jaygpICovCisJCWtvYmplY3RfcHV0KCZtZW1fYmxrLT5zeXNkZXYua29iaik7CisJfQorCXJldHVybiBlcnI7Cit9CisjZWxzZQorc3RhdGljIGludCBsaW5rX21lbV9zZWN0aW9ucyhpbnQgbmlkKSB7IHJldHVybiAwOyB9CisjZW5kaWYgLyogQ09ORklHX01FTU9SWV9IT1RQTFVHX1NQQVJTRSAqLworCiBpbnQgcmVnaXN0ZXJfb25lX25vZGUoaW50IG5pZCkKIHsKIAlpbnQgZXJyb3IgPSAwOwpAQCAtMjY3LDYgKzM2Nyw5IEBACiAJCQlpZiAoY3B1X3RvX25vZGUoY3B1KSA9PSBuaWQpCiAJCQkJcmVnaXN0ZXJfY3B1X3VuZGVyX25vZGUoY3B1LCBuaWQpOwogCQl9CisKKwkJLyogbGluayBtZW1vcnkgc2VjdGlvbnMgdW5kZXIgdGhpcyBub2RlICovCisJCWVycm9yID0gbGlua19tZW1fc2VjdGlvbnMobmlkKTsKIAl9CiAKIAlyZXR1cm4gZXJyb3I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcGxhdGZvcm0uYyBiL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jCmluZGV4IGRmY2JmZTUuLjM0OWExMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jCkBAIC0yNCw3ICsyNCw3IEBACiAJCQkJIGRyaXZlcikpCiAKIHN0cnVjdCBkZXZpY2UgcGxhdGZvcm1fYnVzID0gewotCS5idXNfaWQJCT0gInBsYXRmb3JtIiwKKwkuaW5pdF9uYW1lCT0gInBsYXRmb3JtIiwKIH07CiBFWFBPUlRfU1lNQk9MX0dQTChwbGF0Zm9ybV9idXMpOwogCkBAIC0yNDIsMTYgKzI0MiwxNSBAQAogCXBkZXYtPmRldi5idXMgPSAmcGxhdGZvcm1fYnVzX3R5cGU7CiAKIAlpZiAocGRldi0+aWQgIT0gLTEpCi0JCXNucHJpbnRmKHBkZXYtPmRldi5idXNfaWQsIEJVU19JRF9TSVpFLCAiJXMuJWQiLCBwZGV2LT5uYW1lLAotCQkJIHBkZXYtPmlkKTsKKwkJZGV2X3NldF9uYW1lKCZwZGV2LT5kZXYsICIlcy4lZCIsIHBkZXYtPm5hbWUsICBwZGV2LT5pZCk7CiAJZWxzZQotCQlzdHJsY3B5KHBkZXYtPmRldi5idXNfaWQsIHBkZXYtPm5hbWUsIEJVU19JRF9TSVpFKTsKKwkJZGV2X3NldF9uYW1lKCZwZGV2LT5kZXYsIHBkZXYtPm5hbWUpOwogCiAJZm9yIChpID0gMDsgaSA8IHBkZXYtPm51bV9yZXNvdXJjZXM7IGkrKykgewogCQlzdHJ1Y3QgcmVzb3VyY2UgKnAsICpyID0gJnBkZXYtPnJlc291cmNlW2ldOwogCiAJCWlmIChyLT5uYW1lID09IE5VTEwpCi0JCQlyLT5uYW1lID0gcGRldi0+ZGV2LmJ1c19pZDsKKwkJCXItPm5hbWUgPSBkZXZfbmFtZSgmcGRldi0+ZGV2KTsKIAogCQlwID0gci0+cGFyZW50OwogCQlpZiAoIXApIHsKQEAgLTI2NCwxNCArMjYzLDE0IEBACiAJCWlmIChwICYmIGluc2VydF9yZXNvdXJjZShwLCByKSkgewogCQkJcHJpbnRrKEtFUk5fRVJSCiAJCQkgICAgICAgIiVzOiBmYWlsZWQgdG8gY2xhaW0gcmVzb3VyY2UgJWRcbiIsCi0JCQkgICAgICAgcGRldi0+ZGV2LmJ1c19pZCwgaSk7CisJCQkgICAgICAgZGV2X25hbWUoJnBkZXYtPmRldiksIGkpOwogCQkJcmV0ID0gLUVCVVNZOwogCQkJZ290byBmYWlsZWQ7CiAJCX0KIAl9CiAKIAlwcl9kZWJ1ZygiUmVnaXN0ZXJpbmcgcGxhdGZvcm0gZGV2aWNlICclcycuIFBhcmVudCBhdCAlc1xuIiwKLQkJIHBkZXYtPmRldi5idXNfaWQsIHBkZXYtPmRldi5wYXJlbnQtPmJ1c19pZCk7CisJCSBkZXZfbmFtZSgmcGRldi0+ZGV2KSwgZGV2X25hbWUocGRldi0+ZGV2LnBhcmVudCkpOwogCiAJcmV0ID0gZGV2aWNlX2FkZCgmcGRldi0+ZGV2KTsKIAlpZiAocmV0ID09IDApCkBAIC01MDMsOCArNTAyLDYgQEAKIAkJZHJ2LT5kcml2ZXIuc3VzcGVuZCA9IHBsYXRmb3JtX2Rydl9zdXNwZW5kOwogCWlmIChkcnYtPnJlc3VtZSkKIAkJZHJ2LT5kcml2ZXIucmVzdW1lID0gcGxhdGZvcm1fZHJ2X3Jlc3VtZTsKLQlpZiAoZHJ2LT5wbSkKLQkJZHJ2LT5kcml2ZXIucG0gPSAmZHJ2LT5wbS0+YmFzZTsKIAlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmRyaXZlcik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIpOwpAQCAtNjA5LDcgKzYwNiw3IEBACiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKIAogCXBkZXYgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlLCBkZXYpOwotCXJldHVybiAoc3RybmNtcChwZGV2LT5uYW1lLCBkcnYtPm5hbWUsIEJVU19JRF9TSVpFKSA9PSAwKTsKKwlyZXR1cm4gKHN0cmNtcChwZGV2LT5uYW1lLCBkcnYtPm5hbWUpID09IDApOwogfQogCiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCkBAIC02ODYsNyArNjgzLDEwIEBACiAJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwogCWludCByZXQgPSAwOwogCi0JaWYgKGRydiAmJiBkcnYtPnBtKSB7CisJaWYgKCFkcnYpCisJCXJldHVybiAwOworCisJaWYgKGRydi0+cG0pIHsKIAkJaWYgKGRydi0+cG0tPnN1c3BlbmQpCiAJCQlyZXQgPSBkcnYtPnBtLT5zdXNwZW5kKGRldik7CiAJfSBlbHNlIHsKQEAgLTY5OCwxNiArNjk4LDE1IEBACiAKIHN0YXRpYyBpbnQgcGxhdGZvcm1fcG1fc3VzcGVuZF9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHBsYXRmb3JtX2RyaXZlciAqcGRydjsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAoIWRldi0+ZHJpdmVyKQorCWlmICghZHJ2KQogCQlyZXR1cm4gMDsKIAotCXBkcnYgPSB0b19wbGF0Zm9ybV9kcml2ZXIoZGV2LT5kcml2ZXIpOwotCWlmIChwZHJ2LT5wbSkgewotCQlpZiAocGRydi0+cG0tPnN1c3BlbmRfbm9pcnEpCi0JCQlyZXQgPSBwZHJ2LT5wbS0+c3VzcGVuZF9ub2lycShkZXYpOworCWlmIChkcnYtPnBtKSB7CisJCWlmIChkcnYtPnBtLT5zdXNwZW5kX25vaXJxKQorCQkJcmV0ID0gZHJ2LT5wbS0+c3VzcGVuZF9ub2lycShkZXYpOwogCX0gZWxzZSB7CiAJCXJldCA9IHBsYXRmb3JtX2xlZ2FjeV9zdXNwZW5kX2xhdGUoZGV2LCBQTVNHX1NVU1BFTkQpOwogCX0KQEAgLTcyMCw3ICs3MTksMTAgQEAKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAoZHJ2ICYmIGRydi0+cG0pIHsKKwlpZiAoIWRydikKKwkJcmV0dXJuIDA7CisKKwlpZiAoZHJ2LT5wbSkgewogCQlpZiAoZHJ2LT5wbS0+cmVzdW1lKQogCQkJcmV0ID0gZHJ2LT5wbS0+cmVzdW1lKGRldik7CiAJfSBlbHNlIHsKQEAgLTczMiwxNiArNzM0LDE1IEBACiAKIHN0YXRpYyBpbnQgcGxhdGZvcm1fcG1fcmVzdW1lX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyICpwZHJ2OworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKIAlpbnQgcmV0ID0gMDsKIAotCWlmICghZGV2LT5kcml2ZXIpCisJaWYgKCFkcnYpCiAJCXJldHVybiAwOwogCi0JcGRydiA9IHRvX3BsYXRmb3JtX2RyaXZlcihkZXYtPmRyaXZlcik7Ci0JaWYgKHBkcnYtPnBtKSB7Ci0JCWlmIChwZHJ2LT5wbS0+cmVzdW1lX25vaXJxKQotCQkJcmV0ID0gcGRydi0+cG0tPnJlc3VtZV9ub2lycShkZXYpOworCWlmIChkcnYtPnBtKSB7CisJCWlmIChkcnYtPnBtLT5yZXN1bWVfbm9pcnEpCisJCQlyZXQgPSBkcnYtPnBtLT5yZXN1bWVfbm9pcnEoZGV2KTsKIAl9IGVsc2UgewogCQlyZXQgPSBwbGF0Zm9ybV9sZWdhY3lfcmVzdW1lX2Vhcmx5KGRldik7CiAJfQpAQCAtNzgwLDE2ICs3ODEsMTUgQEAKIAogc3RhdGljIGludCBwbGF0Zm9ybV9wbV9mcmVlemVfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgKnBkcnY7CisJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwogCWludCByZXQgPSAwOwogCi0JaWYgKCFkZXYtPmRyaXZlcikKKwlpZiAoIWRydikKIAkJcmV0dXJuIDA7CiAKLQlwZHJ2ID0gdG9fcGxhdGZvcm1fZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQlpZiAocGRydi0+cG0pIHsKLQkJaWYgKHBkcnYtPnBtLT5mcmVlemVfbm9pcnEpCi0JCQlyZXQgPSBwZHJ2LT5wbS0+ZnJlZXplX25vaXJxKGRldik7CisJaWYgKGRydi0+cG0pIHsKKwkJaWYgKGRydi0+cG0tPmZyZWV6ZV9ub2lycSkKKwkJCXJldCA9IGRydi0+cG0tPmZyZWV6ZV9ub2lycShkZXYpOwogCX0gZWxzZSB7CiAJCXJldCA9IHBsYXRmb3JtX2xlZ2FjeV9zdXNwZW5kX2xhdGUoZGV2LCBQTVNHX0ZSRUVaRSk7CiAJfQpAQCAtODAyLDcgKzgwMiwxMCBAQAogCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKIAlpbnQgcmV0ID0gMDsKIAotCWlmIChkcnYgJiYgZHJ2LT5wbSkgeworCWlmICghZHJ2KQorCQlyZXR1cm4gMDsKKworCWlmIChkcnYtPnBtKSB7CiAJCWlmIChkcnYtPnBtLT50aGF3KQogCQkJcmV0ID0gZHJ2LT5wbS0+dGhhdyhkZXYpOwogCX0gZWxzZSB7CkBAIC04MTQsMTYgKzgxNywxNSBAQAogCiBzdGF0aWMgaW50IHBsYXRmb3JtX3BtX3RoYXdfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgKnBkcnY7CisJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwogCWludCByZXQgPSAwOwogCi0JaWYgKCFkZXYtPmRyaXZlcikKKwlpZiAoIWRydikKIAkJcmV0dXJuIDA7CiAKLQlwZHJ2ID0gdG9fcGxhdGZvcm1fZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQlpZiAocGRydi0+cG0pIHsKLQkJaWYgKHBkcnYtPnBtLT50aGF3X25vaXJxKQotCQkJcmV0ID0gcGRydi0+cG0tPnRoYXdfbm9pcnEoZGV2KTsKKwlpZiAoZHJ2LT5wbSkgeworCQlpZiAoZHJ2LT5wbS0+dGhhd19ub2lycSkKKwkJCXJldCA9IGRydi0+cG0tPnRoYXdfbm9pcnEoZGV2KTsKIAl9IGVsc2UgewogCQlyZXQgPSBwbGF0Zm9ybV9sZWdhY3lfcmVzdW1lX2Vhcmx5KGRldik7CiAJfQpAQCAtODM2LDcgKzgzOCwxMCBAQAogCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKIAlpbnQgcmV0ID0gMDsKIAotCWlmIChkcnYgJiYgZHJ2LT5wbSkgeworCWlmICghZHJ2KQorCQlyZXR1cm4gMDsKKworCWlmIChkcnYtPnBtKSB7CiAJCWlmIChkcnYtPnBtLT5wb3dlcm9mZikKIAkJCXJldCA9IGRydi0+cG0tPnBvd2Vyb2ZmKGRldik7CiAJfSBlbHNlIHsKQEAgLTg0OCwxNiArODUzLDE1IEBACiAKIHN0YXRpYyBpbnQgcGxhdGZvcm1fcG1fcG93ZXJvZmZfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgKnBkcnY7CisJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwogCWludCByZXQgPSAwOwogCi0JaWYgKCFkZXYtPmRyaXZlcikKKwlpZiAoIWRydikKIAkJcmV0dXJuIDA7CiAKLQlwZHJ2ID0gdG9fcGxhdGZvcm1fZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQlpZiAocGRydi0+cG0pIHsKLQkJaWYgKHBkcnYtPnBtLT5wb3dlcm9mZl9ub2lycSkKLQkJCXJldCA9IHBkcnYtPnBtLT5wb3dlcm9mZl9ub2lycShkZXYpOworCWlmIChkcnYtPnBtKSB7CisJCWlmIChkcnYtPnBtLT5wb3dlcm9mZl9ub2lycSkKKwkJCXJldCA9IGRydi0+cG0tPnBvd2Vyb2ZmX25vaXJxKGRldik7CiAJfSBlbHNlIHsKIAkJcmV0ID0gcGxhdGZvcm1fbGVnYWN5X3N1c3BlbmRfbGF0ZShkZXYsIFBNU0dfSElCRVJOQVRFKTsKIAl9CkBAIC04NzAsNyArODc0LDEwIEBACiAJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwogCWludCByZXQgPSAwOwogCi0JaWYgKGRydiAmJiBkcnYtPnBtKSB7CisJaWYgKCFkcnYpCisJCXJldHVybiAwOworCisJaWYgKGRydi0+cG0pIHsKIAkJaWYgKGRydi0+cG0tPnJlc3RvcmUpCiAJCQlyZXQgPSBkcnYtPnBtLT5yZXN0b3JlKGRldik7CiAJfSBlbHNlIHsKQEAgLTg4MiwxNiArODg5LDE1IEBACiAKIHN0YXRpYyBpbnQgcGxhdGZvcm1fcG1fcmVzdG9yZV9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHBsYXRmb3JtX2RyaXZlciAqcGRydjsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAoIWRldi0+ZHJpdmVyKQorCWlmICghZHJ2KQogCQlyZXR1cm4gMDsKIAotCXBkcnYgPSB0b19wbGF0Zm9ybV9kcml2ZXIoZGV2LT5kcml2ZXIpOwotCWlmIChwZHJ2LT5wbSkgewotCQlpZiAocGRydi0+cG0tPnJlc3RvcmVfbm9pcnEpCi0JCQlyZXQgPSBwZHJ2LT5wbS0+cmVzdG9yZV9ub2lycShkZXYpOworCWlmIChkcnYtPnBtKSB7CisJCWlmIChkcnYtPnBtLT5yZXN0b3JlX25vaXJxKQorCQkJcmV0ID0gZHJ2LT5wbS0+cmVzdG9yZV9ub2lycShkZXYpOwogCX0gZWxzZSB7CiAJCXJldCA9IHBsYXRmb3JtX2xlZ2FjeV9yZXN1bWVfZWFybHkoZGV2KTsKIAl9CkBAIC05MTIsMTcgKzkxOCwxNSBAQAogCiAjZW5kaWYgLyogIUNPTkZJR19ISUJFUk5BVElPTiAqLwogCi1zdGF0aWMgc3RydWN0IHBtX2V4dF9vcHMgcGxhdGZvcm1fcG1fb3BzID0gewotCS5iYXNlID0gewotCQkucHJlcGFyZSA9IHBsYXRmb3JtX3BtX3ByZXBhcmUsCi0JCS5jb21wbGV0ZSA9IHBsYXRmb3JtX3BtX2NvbXBsZXRlLAotCQkuc3VzcGVuZCA9IHBsYXRmb3JtX3BtX3N1c3BlbmQsCi0JCS5yZXN1bWUgPSBwbGF0Zm9ybV9wbV9yZXN1bWUsCi0JCS5mcmVlemUgPSBwbGF0Zm9ybV9wbV9mcmVlemUsCi0JCS50aGF3ID0gcGxhdGZvcm1fcG1fdGhhdywKLQkJLnBvd2Vyb2ZmID0gcGxhdGZvcm1fcG1fcG93ZXJvZmYsCi0JCS5yZXN0b3JlID0gcGxhdGZvcm1fcG1fcmVzdG9yZSwKLQl9LAorc3RhdGljIHN0cnVjdCBkZXZfcG1fb3BzIHBsYXRmb3JtX2Rldl9wbV9vcHMgPSB7CisJLnByZXBhcmUgPSBwbGF0Zm9ybV9wbV9wcmVwYXJlLAorCS5jb21wbGV0ZSA9IHBsYXRmb3JtX3BtX2NvbXBsZXRlLAorCS5zdXNwZW5kID0gcGxhdGZvcm1fcG1fc3VzcGVuZCwKKwkucmVzdW1lID0gcGxhdGZvcm1fcG1fcmVzdW1lLAorCS5mcmVlemUgPSBwbGF0Zm9ybV9wbV9mcmVlemUsCisJLnRoYXcgPSBwbGF0Zm9ybV9wbV90aGF3LAorCS5wb3dlcm9mZiA9IHBsYXRmb3JtX3BtX3Bvd2Vyb2ZmLAorCS5yZXN0b3JlID0gcGxhdGZvcm1fcG1fcmVzdG9yZSwKIAkuc3VzcGVuZF9ub2lycSA9IHBsYXRmb3JtX3BtX3N1c3BlbmRfbm9pcnEsCiAJLnJlc3VtZV9ub2lycSA9IHBsYXRmb3JtX3BtX3Jlc3VtZV9ub2lycSwKIAkuZnJlZXplX25vaXJxID0gcGxhdGZvcm1fcG1fZnJlZXplX25vaXJxLApAQCAtOTMxLDcgKzkzNSw3IEBACiAJLnJlc3RvcmVfbm9pcnEgPSBwbGF0Zm9ybV9wbV9yZXN0b3JlX25vaXJxLAogfTsKIAotI2RlZmluZSBQTEFURk9STV9QTV9PUFNfUFRSCSZwbGF0Zm9ybV9wbV9vcHMKKyNkZWZpbmUgUExBVEZPUk1fUE1fT1BTX1BUUgkoJnBsYXRmb3JtX2Rldl9wbV9vcHMpCiAKICNlbHNlIC8qICFDT05GSUdfUE1fU0xFRVAgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL21haW4uYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9tYWluLmMKaW5kZXggNjkyYzIwYi4uNjcwYzlkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL21haW4uYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvbWFpbi5jCkBAIC03Niw3ICs3Niw3IEBACiAJaWYgKGRldi0+cGFyZW50KSB7CiAJCWlmIChkZXYtPnBhcmVudC0+cG93ZXIuc3RhdHVzID49IERQTV9TVVNQRU5ESU5HKQogCQkJZGV2X3dhcm4oZGV2LCAicGFyZW50ICVzIHNob3VsZCBub3QgYmUgc2xlZXBpbmdcbiIsCi0JCQkJZGV2LT5wYXJlbnQtPmJ1c19pZCk7CisJCQkJIGRldl9uYW1lKGRldi0+cGFyZW50KSk7CiAJfSBlbHNlIGlmICh0cmFuc2l0aW9uX3N0YXJ0ZWQpIHsKIAkJLyoKIAkJICogV2UgcmVmdXNlIHRvIHJlZ2lzdGVyIHBhcmVudGxlc3MgZGV2aWNlcyB3aGlsZSBhIFBNCkBAIC0xMTIsNyArMTEyLDggQEAKICAqCUBvcHM6CVBNIG9wZXJhdGlvbnMgdG8gY2hvb3NlIGZyb20uCiAgKglAc3RhdGU6CVBNIHRyYW5zaXRpb24gb2YgdGhlIHN5c3RlbSBiZWluZyBjYXJyaWVkIG91dC4KICAqLwotc3RhdGljIGludCBwbV9vcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwbV9vcHMgKm9wcywgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBwbV9vcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZfcG1fb3BzICpvcHMsCisJCQlwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CiAJaW50IGVycm9yID0gMDsKIApAQCAtMTc0LDcgKzE3NSw3IEBACiAgKglUaGUgb3BlcmF0aW9uIGlzIGV4ZWN1dGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCBieSB0aGUgb25seSByZW1haW5pbmcKICAqCWZ1bmN0aW9uYWwgQ1BVIGluIHRoZSBzeXN0ZW0uCiAgKi8KLXN0YXRpYyBpbnQgcG1fbm9pcnFfb3Aoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcG1fZXh0X29wcyAqb3BzLAorc3RhdGljIGludCBwbV9ub2lycV9vcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZfcG1fb3BzICpvcHMsCiAJCQlwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CiAJaW50IGVycm9yID0gMDsKQEAgLTM1NCw3ICszNTUsNyBAQAogCWlmIChkZXYtPmJ1cykgewogCQlpZiAoZGV2LT5idXMtPnBtKSB7CiAJCQlwbV9kZXZfZGJnKGRldiwgc3RhdGUsICIiKTsKLQkJCWVycm9yID0gcG1fb3AoZGV2LCAmZGV2LT5idXMtPnBtLT5iYXNlLCBzdGF0ZSk7CisJCQllcnJvciA9IHBtX29wKGRldiwgZGV2LT5idXMtPnBtLCBzdGF0ZSk7CiAJCX0gZWxzZSBpZiAoZGV2LT5idXMtPnJlc3VtZSkgewogCQkJcG1fZGV2X2RiZyhkZXYsIHN0YXRlLCAibGVnYWN5ICIpOwogCQkJZXJyb3IgPSBkZXYtPmJ1cy0+cmVzdW1lKGRldik7CkBAIC00NTEsOSArNDUyLDkgQEAKIAkJZGV2LT50eXBlLT5wbS0+Y29tcGxldGUoZGV2KTsKIAl9CiAKLQlpZiAoZGV2LT5idXMgJiYgZGV2LT5idXMtPnBtICYmIGRldi0+YnVzLT5wbS0+YmFzZS5jb21wbGV0ZSkgeworCWlmIChkZXYtPmJ1cyAmJiBkZXYtPmJ1cy0+cG0gJiYgZGV2LT5idXMtPnBtLT5jb21wbGV0ZSkgewogCQlwbV9kZXZfZGJnKGRldiwgc3RhdGUsICJjb21wbGV0aW5nICIpOwotCQlkZXYtPmJ1cy0+cG0tPmJhc2UuY29tcGxldGUoZGV2KTsKKwkJZGV2LT5idXMtPnBtLT5jb21wbGV0ZShkZXYpOwogCX0KIAogCXVwKCZkZXYtPnNlbSk7CkBAIC02MjQsNyArNjI1LDcgQEAKIAlpZiAoZGV2LT5idXMpIHsKIAkJaWYgKGRldi0+YnVzLT5wbSkgewogCQkJcG1fZGV2X2RiZyhkZXYsIHN0YXRlLCAiIik7Ci0JCQllcnJvciA9IHBtX29wKGRldiwgJmRldi0+YnVzLT5wbS0+YmFzZSwgc3RhdGUpOworCQkJZXJyb3IgPSBwbV9vcChkZXYsIGRldi0+YnVzLT5wbSwgc3RhdGUpOwogCQl9IGVsc2UgaWYgKGRldi0+YnVzLT5zdXNwZW5kKSB7CiAJCQlwbV9kZXZfZGJnKGRldiwgc3RhdGUsICJsZWdhY3kgIik7CiAJCQllcnJvciA9IGRldi0+YnVzLT5zdXNwZW5kKGRldiwgc3RhdGUpOwpAQCAtNjg1LDEwICs2ODYsMTAgQEAKIAogCWRvd24oJmRldi0+c2VtKTsKIAotCWlmIChkZXYtPmJ1cyAmJiBkZXYtPmJ1cy0+cG0gJiYgZGV2LT5idXMtPnBtLT5iYXNlLnByZXBhcmUpIHsKKwlpZiAoZGV2LT5idXMgJiYgZGV2LT5idXMtPnBtICYmIGRldi0+YnVzLT5wbS0+cHJlcGFyZSkgewogCQlwbV9kZXZfZGJnKGRldiwgc3RhdGUsICJwcmVwYXJpbmcgIik7Ci0JCWVycm9yID0gZGV2LT5idXMtPnBtLT5iYXNlLnByZXBhcmUoZGV2KTsKLQkJc3VzcGVuZF9yZXBvcnRfcmVzdWx0KGRldi0+YnVzLT5wbS0+YmFzZS5wcmVwYXJlLCBlcnJvcik7CisJCWVycm9yID0gZGV2LT5idXMtPnBtLT5wcmVwYXJlKGRldik7CisJCXN1c3BlbmRfcmVwb3J0X3Jlc3VsdChkZXYtPmJ1cy0+cG0tPnByZXBhcmUsIGVycm9yKTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBFbmQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL3RyYWNlLmMgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvdHJhY2UuYwppbmRleCAyYWE2ZThmLi4wYTFhMmM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvdHJhY2UuYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvdHJhY2UuYwpAQCAtMTQwLDcgKzE0MCw3IEBACiAKIHZvaWQgc2V0X3RyYWNlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JZGV2X2hhc2hfdmFsdWUgPSBoYXNoX3N0cmluZyhERVZTRUVELCBkZXYtPmJ1c19pZCwgREVWSEFTSCk7CisJZGV2X2hhc2hfdmFsdWUgPSBoYXNoX3N0cmluZyhERVZTRUVELCBkZXZfbmFtZShkZXYpLCBERVZIQVNIKTsKIH0KIEVYUE9SVF9TWU1CT0woc2V0X3RyYWNlX2RldmljZSk7CiAKQEAgLTE5Miw3ICsxOTIsNyBAQAogCiAJd2hpbGUgKGVudHJ5ICE9ICZkcG1fbGlzdCkgewogCQlzdHJ1Y3QgZGV2aWNlICogZGV2ID0gdG9fZGV2aWNlKGVudHJ5KTsKLQkJdW5zaWduZWQgaW50IGhhc2ggPSBoYXNoX3N0cmluZyhERVZTRUVELCBkZXYtPmJ1c19pZCwgREVWSEFTSCk7CisJCXVuc2lnbmVkIGludCBoYXNoID0gaGFzaF9zdHJpbmcoREVWU0VFRCwgZGV2X25hbWUoZGV2KSwgREVWSEFTSCk7CiAJCWlmIChoYXNoID09IHZhbHVlKSB7CiAJCQlkZXZfaW5mbyhkZXYsICJoYXNoIG1hdGNoZXNcbiIpOwogCQkJbWF0Y2grKzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS90b3BvbG9neS5jIGIvZHJpdmVycy9iYXNlL3RvcG9sb2d5LmMKaW5kZXggYThiYzFjYi4uYTc3OGZiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3RvcG9sb2d5LmMKKysrIGIvZHJpdmVycy9iYXNlL3RvcG9sb2d5LmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KICNpbmNsdWRlIDxsaW51eC90b3BvbG9neS5oPgogCiAjZGVmaW5lIGRlZmluZV9vbmVfcm8oX25hbWUpIAkJXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9zdW52ZGMuYyBiL2RyaXZlcnMvYmxvY2svc3VudmRjLmMKaW5kZXggOTUzYzBiOC4uNTg2MWUzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9zdW52ZGMuYworKysgYi9kcml2ZXJzL2Jsb2NrL3N1bnZkYy5jCkBAIC0xNTMsNyArMTUzLDcgQEAKIAlwa3QudmRpc2tfYmxvY2tfc2l6ZSA9IHBvcnQtPnZkaXNrX2Jsb2NrX3NpemU7CiAJcGt0Lm1heF94ZmVyX3NpemUgPSBwb3J0LT5tYXhfeGZlcl9zaXplOwogCi0JdmlvZGJnKEhTLCAiU0VORCBBVFRSIHhmZXJfbW9kZVsweCV4XSBibGtzelsldV0gbWF4X3hmZXJbJWx1XVxuIiwKKwl2aW9kYmcoSFMsICJTRU5EIEFUVFIgeGZlcl9tb2RlWzB4JXhdIGJsa3N6WyV1XSBtYXhfeGZlclslbGx1XVxuIiwKIAkgICAgICAgcGt0LnhmZXJfbW9kZSwgcGt0LnZkaXNrX2Jsb2NrX3NpemUsIHBrdC5tYXhfeGZlcl9zaXplKTsKIAogCXJldHVybiB2aW9fbGRjX3NlbmQoJnBvcnQtPnZpbywgJnBrdCwgc2l6ZW9mKHBrdCkpOwpAQCAtMTY0LDggKzE2NCw4IEBACiAJc3RydWN0IHZkY19wb3J0ICpwb3J0ID0gdG9fdmRjX3BvcnQodmlvKTsKIAlzdHJ1Y3QgdmlvX2Rpc2tfYXR0cl9pbmZvICpwa3QgPSBhcmc7CiAKLQl2aW9kYmcoSFMsICJHT1QgQVRUUiBzdHlwZVsweCV4XSBvcHNbJWx4XSBkaXNrX3NpemVbJWx1XSBkaXNrX3R5cGVbJXhdICIKLQkgICAgICAgInhmZXJfbW9kZVsweCV4XSBibGtzelsldV0gbWF4X3hmZXJbJWx1XVxuIiwKKwl2aW9kYmcoSFMsICJHT1QgQVRUUiBzdHlwZVsweCV4XSBvcHNbJWxseF0gZGlza19zaXplWyVsbHVdIGRpc2tfdHlwZVsleF0gIgorCSAgICAgICAieGZlcl9tb2RlWzB4JXhdIGJsa3N6WyV1XSBtYXhfeGZlclslbGx1XVxuIiwKIAkgICAgICAgcGt0LT50YWcuc3R5cGUsIHBrdC0+b3BlcmF0aW9ucywKIAkgICAgICAgcGt0LT52ZGlza19zaXplLCBwa3QtPnZkaXNrX3R5cGUsCiAJICAgICAgIHBrdC0+eGZlcl9tb2RlLCBwa3QtPnZkaXNrX2Jsb2NrX3NpemUsCkBAIC03NTMsNyArNzUzLDcgQEAKIAogCWVyciA9IC1FTk9ERVY7CiAJaWYgKCh2ZGV2LT5kZXZfbm8gPDwgUEFSVElUSU9OX1NISUZUKSAmIH4odTY0KU1JTk9STUFTSykgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICJQb3J0IGlkIFslbHVdIHRvbyBsYXJnZS5cbiIsCisJCXByaW50ayhLRVJOX0VSUiBQRlggIlBvcnQgaWQgWyVsbHVdIHRvbyBsYXJnZS5cbiIsCiAJCSAgICAgICB2ZGV2LT5kZXZfbm8pOwogCQlnb3RvIGVycl9vdXRfcmVsZWFzZV9tZGVzYzsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3ViLmMgYi9kcml2ZXJzL2Jsb2NrL3ViLmMKaW5kZXggMDQ4ZDcxZC4uMTJmYjgxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay91Yi5jCisrKyBiL2RyaXZlcnMvYmxvY2svdWIuYwpAQCAtMTU3OSw3ICsxNTc5LDcgQEAKIAlzdHJ1Y3QgdWJfZGV2ICpzYyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdWJfZGV2LCByZXNldF93b3JrKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCB1Yl9sdW4gKmx1bjsKLQlpbnQgbGtyLCByYzsKKwlpbnQgcmM7CiAKIAlpZiAoIXNjLT5yZXNldCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUnVubmluZyByZXNldCB1bnJlcXVlc3RlZFxuIiwKQEAgLTE1OTcsMTAgKzE1OTcsMTEgQEAKIAl9IGVsc2UgaWYgKHNjLT5kZXYtPmFjdGNvbmZpZy0+ZGVzYy5iTnVtSW50ZXJmYWNlcyAhPSAxKSB7CiAJCTsKIAl9IGVsc2UgewotCQlpZiAoKGxrciA9IHVzYl9sb2NrX2RldmljZV9mb3JfcmVzZXQoc2MtPmRldiwgc2MtPmludGYpKSA8IDApIHsKKwkJcmMgPSB1c2JfbG9ja19kZXZpY2VfZm9yX3Jlc2V0KHNjLT5kZXYsIHNjLT5pbnRmKTsKKwkJaWYgKHJjIDwgMCkgewogCQkJcHJpbnRrKEtFUk5fTk9USUNFCiAJCQkgICAgIiVzOiB1c2JfbG9ja19kZXZpY2VfZm9yX3Jlc2V0IGZhaWxlZCAoJWQpXG4iLAotCQkJICAgIHNjLT5uYW1lLCBsa3IpOworCQkJICAgIHNjLT5uYW1lLCByYyk7CiAJCX0gZWxzZSB7CiAJCQlyYyA9IHVzYl9yZXNldF9kZXZpY2Uoc2MtPmRldik7CiAJCQlpZiAocmMgPCAwKSB7CkBAIC0xNjA4LDkgKzE2MDksNyBAQAogCQkJCSAgICAidXNiX2xvY2tfZGV2aWNlX2Zvcl9yZXNldCBmYWlsZWQgKCVkKVxuIiwKIAkJCQkgICAgc2MtPm5hbWUsIHJjKTsKIAkJCX0KLQotCQkJaWYgKGxrcikKLQkJCQl1c2JfdW5sb2NrX2RldmljZShzYy0+ZGV2KTsKKwkJCXVzYl91bmxvY2tfZGV2aWNlKHNjLT5kZXYpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvS2NvbmZpZyBiL2RyaXZlcnMvY2hhci9LY29uZmlnCmluZGV4IDE2OTcwNDMuLmY1YmU4MDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9LY29uZmlnCisrKyBiL2RyaXZlcnMvY2hhci9LY29uZmlnCkBAIC02MTYsNiArNjE2LDcgQEAKIAlkZWZhdWx0IHkKIAlzZWxlY3QgSFZDX0RSSVZFUgogCXNlbGVjdCBIVkNfSVJRCisJc2VsZWN0IFZJT1BBVEgKIAloZWxwCiAJICBpU2VyaWVzIG1hY2hpbmVzIHN1cHBvcnQgYSBoeXBlcnZpc29yIHZpcnR1YWwgY29uc29sZS4KIApAQCAtODQxLDcgKzg0Miw3IEBACiAKIGNvbmZpZyBHRU5fUlRDCiAJdHJpc3RhdGUgIkdlbmVyaWMgL2Rldi9ydGMgZW11bGF0aW9uIgotCWRlcGVuZHMgb24gUlRDIT15ICYmICFJQTY0ICYmICFBUk0gJiYgIU0zMlIgJiYgIU1JUFMgJiYgIVNQQVJDICYmICFGUlYgJiYgIVMzOTAgJiYgIVNVUEVSSCAmJiAhQVZSMzIKKwlkZXBlbmRzIG9uIFJUQyE9eSAmJiAhSUE2NCAmJiAhQVJNICYmICFNMzJSICYmICFNSVBTICYmICFTUEFSQyAmJiAhRlJWICYmICFTMzkwICYmICFTVVBFUkggJiYgIUFWUjMyICYmICFCTEFDS0ZJTgogCS0tLWhlbHAtLS0KIAkgIElmIHlvdSBzYXkgWSBoZXJlIGFuZCBjcmVhdGUgYSBjaGFyYWN0ZXIgc3BlY2lhbCBmaWxlIC9kZXYvcnRjIHdpdGgKIAkgIG1ham9yIG51bWJlciAxMCBhbmQgbWlub3IgbnVtYmVyIDEzNSB1c2luZyBta25vZCAoIm1hbiBta25vZCIpLCB5b3UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9jb25zb2xlbWFwLmMgYi9kcml2ZXJzL2NoYXIvY29uc29sZW1hcC5jCmluZGV4IDQyNDZiOGUuLjQ1ZDNlODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9jb25zb2xlbWFwLmMKKysrIGIvZHJpdmVycy9jaGFyL2NvbnNvbGVtYXAuYwpAQCAtNTU0LDcgKzU1NCw3IEBACiAJCV9fZ2V0X3VzZXIoZm9udHBvcywgJmxpc3QtPmZvbnRwb3MpOwogCQlpZiAoKGVycjEgPSBjb25faW5zZXJ0X3VuaXBhaXIocCwgdW5pY29kZSxmb250cG9zKSkgIT0gMCkKIAkJCWVyciA9IGVycjE7Ci0JCQlsaXN0Kys7CisJCWxpc3QrKzsKIAl9CiAJCiAJaWYgKGNvbl91bmlmeV91bmltYXAodmMsIHApKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2VwY2EuYyBiL2RyaXZlcnMvY2hhci9lcGNhLmMKaW5kZXggMzlhZDgyMC4uYWY3YzEzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2VwY2EuYworKysgYi9kcml2ZXJzL2NoYXIvZXBjYS5jCkBAIC03NjksNyArNzY5LDcgQEAKIAkvKiBDaGVjayBzdGF0dXMgb2YgYm9hcmQgY29uZmlndXJlZCBpbiBzeXN0ZW0uICAqLwogCiAJLyoKLQkgKiBJIGNoZWNrIHRvIHNlZSBpZiB0aGUgZXBjYV9zZXR1cCByb3V0aW5lIGRldGVjdGVkIGFuIHVzZXIgZXJyb3IuIEl0CisJICogSSBjaGVjayB0byBzZWUgaWYgdGhlIGVwY2Ffc2V0dXAgcm91dGluZSBkZXRlY3RlZCBhIHVzZXIgZXJyb3IuIEl0CiAJICogbWlnaHQgYmUgYmV0dGVyIHRvIHB1dCB0aGlzIGluIHBjX2luaXQsIGJ1dCBmb3IgdGhlIG1vbWVudCBpdCBnb2VzCiAJICogaGVyZS4KIAkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9odmNfYmVhdC5jIGIvZHJpdmVycy9jaGFyL2h2Y19iZWF0LmMKaW5kZXggOTFjZGIzNS4uMGFmYzhiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h2Y19iZWF0LmMKKysrIGIvZHJpdmVycy9jaGFyL2h2Y19iZWF0LmMKQEAgLTQ0LDcgKzQ0LDcgQEAKIAlzdGF0aWMgdW5zaWduZWQgY2hhciBxW3NpemVvZih1bnNpZ25lZCBsb25nKSAqIDJdCiAJCV9fYXR0cmlidXRlX18oKGFsaWduZWQoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSkpOwogCXN0YXRpYyBpbnQgcWxlbiA9IDA7Ci0JdW5zaWduZWQgbG9uZyBnb3Q7CisJdTY0IGdvdDsKIAogYWdhaW46CiAJaWYgKHFsZW4pIHsKQEAgLTYzLDcgKzYzLDcgQEAKIAkJfQogCX0KIAlpZiAoYmVhdF9nZXRfdGVybV9jaGFyKHZ0ZXJtbm8sICZnb3QsCi0JCSgodW5zaWduZWQgbG9uZyAqKXEpLCAoKHVuc2lnbmVkIGxvbmcgKilxKSArIDEpID09IDApIHsKKwkJKCh1NjQgKilxKSwgKCh1NjQgKilxKSArIDEpID09IDApIHsKIAkJcWxlbiA9IGdvdDsKIAkJZ290byBhZ2FpbjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL24yLWRydi5jIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9uMi1kcnYuYwppbmRleCA4ODU5YWVhLi45YjNlMDljIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL24yLWRydi5jCisrKyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vbjItZHJ2LmMKQEAgLTQ4Miw3ICs0ODIsNyBAQAogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IFNFTEZURVNUX0JVRkZFUl9XT1JEUzsgaSsrKQotCQlkZXZfZXJyKCZucC0+b3AtPmRldiwgIlRlc3QgYnVmZmVyIHNsb3QgJWQgWzB4JTAxNmx4XVxuIiwKKwkJZGV2X2VycigmbnAtPm9wLT5kZXYsICJUZXN0IGJ1ZmZlciBzbG90ICVkIFsweCUwMTZsbHhdXG4iLAogCQkJaSwgbnAtPnRlc3RfYnVmZmVyW2ldKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL21lbS5jIGIvZHJpdmVycy9jaGFyL21lbS5jCmluZGV4IDY0MzFmNjkuLjM1ODZiM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9tZW0uYworKysgYi9kcml2ZXJzL2NoYXIvbWVtLmMKQEAgLTQyNSw5ICs0MjUsNiBAQAogfQogI2VuZGlmCiAKLWV4dGVybiBsb25nIHZyZWFkKGNoYXIgKmJ1ZiwgY2hhciAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCk7Ci1leHRlcm4gbG9uZyB2d3JpdGUoY2hhciAqYnVmLCBjaGFyICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKLQogI2lmZGVmIENPTkZJR19ERVZLTUVNCiAvKgogICogVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgKnZpcnR1YWwqIG1lbW9yeSBhcyBzZWVuIGJ5IHRoZSBrZXJuZWwuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXdhdmUvbXdhdmVkZC5jIGIvZHJpdmVycy9jaGFyL213YXZlL213YXZlZGQuYwppbmRleCA0ZjhkNjdmLi45NGFkMmMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbXdhdmUvbXdhdmVkZC5jCisrKyBiL2RyaXZlcnMvY2hhci9td2F2ZS9td2F2ZWRkLmMKQEAgLTY2Myw3ICs2NjMsNyBAQAogI2lmIDAKIAkvKiBzeXNmcyAqLwogCW1lbXNldCgmbXdhdmVfZGV2aWNlLCAwLCBzaXplb2YgKHN0cnVjdCBkZXZpY2UpKTsKLQlzbnByaW50Zihtd2F2ZV9kZXZpY2UuYnVzX2lkLCBCVVNfSURfU0laRSwgIm13YXZlIik7CisJZGV2X3NldF9uYW1lKCZtd2F2ZV9kZXZpY2UsICJtd2F2ZSIpOwogCiAJaWYgKGRldmljZV9yZWdpc3RlcigmbXdhdmVfZGV2aWNlKSkKIAkJZ290byBjbGVhbnVwX2Vycm9yOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3B0eS5jIGIvZHJpdmVycy9jaGFyL3B0eS5jCmluZGV4IDExMmE2YmEuLjE0NmM5NzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9wdHkuYworKysgYi9kcml2ZXJzL2NoYXIvcHR5LmMKQEAgLTMyLDcgKzMyLDcgQEAKIAogLyogVGhlc2UgYXJlIGdsb2JhbCBiZWNhdXNlIHRoZXkgYXJlIGFjY2Vzc2VkIGluIHR0eV9pby5jICovCiAjaWZkZWYgQ09ORklHX1VOSVg5OF9QVFlTCi1zdHJ1Y3QgdHR5X2RyaXZlciAqcHRtX2RyaXZlcjsKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqcHRtX2RyaXZlcjsKIHN0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqcHRzX2RyaXZlcjsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmFuZG9tLmMgYi9kcml2ZXJzL2NoYXIvcmFuZG9tLmMKaW5kZXggYzdhZmMwNi4uN2MxMzU4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3JhbmRvbS5jCisrKyBiL2RyaXZlcnMvY2hhci9yYW5kb20uYwpAQCAtNDA3LDcgKzQwNyw3IEBACiAJLyogcmVhZC13cml0ZSBkYXRhOiAqLwogCXNwaW5sb2NrX3QgbG9jazsKIAl1bnNpZ25lZCBhZGRfcHRyOwotCWludCBlbnRyb3B5X2NvdW50OwkvKiBNdXN0IGF0IG5vIHRpbWUgZXhjZWVkIC0+UE9PTEJJVFMhICovCisJaW50IGVudHJvcHlfY291bnQ7CiAJaW50IGlucHV0X3JvdGF0ZTsKIH07CiAKQEAgLTc2NywxMSArNzY3LDEwIEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCUJVR19PTihyLT5lbnRyb3B5X2NvdW50ID4gci0+cG9vbGluZm8tPlBPT0xCSVRTKTsKLQogCS8qIEhvbGQgbG9jayB3aGlsZSBhY2NvdW50aW5nICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnItPmxvY2ssIGZsYWdzKTsKIAorCUJVR19PTihyLT5lbnRyb3B5X2NvdW50ID4gci0+cG9vbGluZm8tPlBPT0xCSVRTKTsKIAlERUJVR19FTlQoInRyeWluZyB0byBleHRyYWN0ICVkIGJpdHMgZnJvbSAlc1xuIiwKIAkJICBuYnl0ZXMgKiA4LCByLT5uYW1lKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3J0Yy5jIGIvZHJpdmVycy9jaGFyL3J0Yy5jCmluZGV4IDIwZDZlZmIuLmUwZDBmOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9ydGMuYworKysgYi9kcml2ZXJzL2NoYXIvcnRjLmMKQEAgLTQ4LDkgKzQ4LDEwIEBACiAgKgkJQ09ORklHX0hQRVRfRU1VTEFURV9SVEMKICAqCTEuMTJhCU1hY2llaiBXLiBSb3p5Y2tpOiBIYW5kbGUgbWVtb3J5LW1hcHBlZCBjaGlwcyBwcm9wZXJseS4KICAqCTEuMTJhYwlBbGFuIENveDogQWxsb3cgcmVhZCBhY2Nlc3MgdG8gdGhlIGRheSBvZiB3ZWVrIHJlZ2lzdGVyCisgKgkxLjEyYglEYXZpZCBKb2huOiBSZW1vdmUgY2FsbHMgdG8gdGhlIEJLTC4KICAqLwogCi0jZGVmaW5lIFJUQ19WRVJTSU9OCQkiMS4xMmFjIgorI2RlZmluZSBSVENfVkVSU0lPTgkJIjEuMTJiIgogCiAvKgogICoJTm90ZSB0aGF0ICphbGwqIGNhbGxzIHRvIENNT1NfUkVBRCBhbmQgQ01PU19XUklURSBhcmUgZG9uZSB3aXRoCkBAIC03Myw3ICs3NCw2IEBACiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9iY2QuaD4KQEAgLTE4Miw4ICsxODIsOCBAQAogCiAvKgogICogcnRjX3N0YXR1cyBpcyBuZXZlciBjaGFuZ2VkIGJ5IHJ0Y19pbnRlcnJ1cHQsIGFuZCBpb2N0bC9vcGVuL2Nsb3NlIGlzCi0gKiBwcm90ZWN0ZWQgYnkgdGhlIGJpZyBrZXJuZWwgbG9jay4gSG93ZXZlciwgaW9jdGwgY2FuIHN0aWxsIGRpc2FibGUgdGhlIHRpbWVyCi0gKiBpbiBydGNfc3RhdHVzIGFuZCB0aGVuIHdpdGggZGVsX3RpbWVyIGFmdGVyIHRoZSBpbnRlcnJ1cHQgaGFzIHJlYWQKKyAqIHByb3RlY3RlZCBieSB0aGUgc3BpbiBsb2NrIHJ0Y19sb2NrLiBIb3dldmVyLCBpb2N0bCBjYW4gc3RpbGwgZGlzYWJsZSB0aGUKKyAqIHRpbWVyIGluIHJ0Y19zdGF0dXMgYW5kIHRoZW4gd2l0aCBkZWxfdGltZXIgYWZ0ZXIgdGhlIGludGVycnVwdCBoYXMgcmVhZAogICogcnRjX3N0YXR1cyBidXQgYmVmb3JlIG1vZF90aW1lciBpcyBjYWxsZWQsIHdoaWNoIHdvdWxkIHRoZW4gcmVlbmFibGUgdGhlCiAgKiB0aW1lciAoYnV0IHlvdSB3b3VsZCBuZWVkIHRvIGhhdmUgYW4gYXdmdWwgdGltaW5nIGJlZm9yZSB5b3UnZCB0cmlwIG9uIGl0KQogICovCkBAIC03MjAsOSArNzIwLDcgQEAKIHN0YXRpYyBsb25nIHJ0Y19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJbG9uZyByZXQ7Ci0JbG9ja19rZXJuZWwoKTsKIAlyZXQgPSBydGNfZG9faW9jdGwoY21kLCBhcmcsIDApOwotCXVubG9ja19rZXJuZWwoKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC03MzEsMTIgKzcyOSw4IEBACiAgKglBbHNvIGNsZWFyIHRoZSBwcmV2aW91cyBpbnRlcnJ1cHQgZGF0YSBvbiBhbiBvcGVuLCBhbmQgY2xlYW4KICAqCXVwIHRoaW5ncyBvbiBhIGNsb3NlLgogICovCi0KLS8qIFdlIHVzZSBydGNfbG9jayB0byBwcm90ZWN0IGFnYWluc3QgY29uY3VycmVudCBvcGVucy4gU28gdGhlIEJLTCBpcyBub3QKLSAqIG5lZWRlZCBoZXJlLiBPciBhbnl3aGVyZSBlbHNlIGluIHRoaXMgZHJpdmVyLiAqLwogc3RhdGljIGludCBydGNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlsb2NrX2tlcm5lbCgpOwogCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKIAogCWlmIChydGNfc3RhdHVzICYgUlRDX0lTX09QRU4pCkBAIC03NDYsMTIgKzc0MCwxMCBAQAogCiAJcnRjX2lycV9kYXRhID0gMDsKIAlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKLQl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIDA7CiAKIG91dF9idXN5OgogCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOwotCXVubG9ja19rZXJuZWwoKTsKIAlyZXR1cm4gLUVCVVNZOwogfQogCkBAIC04MDAsNyArNzkyLDYgQEAKIH0KIAogI2lmZGVmIFJUQ19JUlEKLS8qIENhbGxlZCB3aXRob3V0IHRoZSBrZXJuZWwgbG9jayAtIGZpbmUgKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQgcnRjX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCiB7CiAJdW5zaWduZWQgbG9uZyBsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3N5c3JxLmMgYi9kcml2ZXJzL2NoYXIvc3lzcnEuYwppbmRleCA5NDk2NmVkLi5kNDFiOWY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc3lzcnEuYworKysgYi9kcml2ZXJzL2NoYXIvc3lzcnEuYwpAQCAtODIsNyArODIsNyBAQAogfQogc3RhdGljIHN0cnVjdCBzeXNycV9rZXlfb3Agc3lzcnFfbG9nbGV2ZWxfb3AgPSB7CiAJLmhhbmRsZXIJPSBzeXNycV9oYW5kbGVfbG9nbGV2ZWwsCi0JLmhlbHBfbXNnCT0gImxvZ2xldmVsMC04IiwKKwkuaGVscF9tc2cJPSAibG9nbGV2ZWwoMC05KSIsCiAJLmFjdGlvbl9tc2cJPSAiQ2hhbmdpbmcgTG9nbGV2ZWwiLAogCS5lbmFibGVfbWFzawk9IFNZU1JRX0VOQUJMRV9MT0csCiB9OwpAQCAtMjMzLDcgKzIzMyw3IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc3lzcnFfa2V5X29wIHN5c3JxX3Nob3dhbGxjcHVzX29wID0gewogCS5oYW5kbGVyCT0gc3lzcnFfaGFuZGxlX3Nob3dhbGxjcHVzLAotCS5oZWxwX21zZwk9ICJhTGxjcHVzIiwKKwkuaGVscF9tc2cJPSAic2hvdy1iYWNrdHJhY2UtYWxsLWFjdGl2ZS1jcHVzKEwpIiwKIAkuYWN0aW9uX21zZwk9ICJTaG93IGJhY2t0cmFjZSBvZiBhbGwgYWN0aXZlIENQVXMiLAogCS5lbmFibGVfbWFzawk9IFNZU1JRX0VOQUJMRV9EVU1QLAogfTsKQEAgLTI0Nyw3ICsyNDcsNyBAQAogfQogc3RhdGljIHN0cnVjdCBzeXNycV9rZXlfb3Agc3lzcnFfc2hvd3JlZ3Nfb3AgPSB7CiAJLmhhbmRsZXIJPSBzeXNycV9oYW5kbGVfc2hvd3JlZ3MsCi0JLmhlbHBfbXNnCT0gInNob3dQYyIsCisJLmhlbHBfbXNnCT0gInNob3ctcmVnaXN0ZXJzKFApIiwKIAkuYWN0aW9uX21zZwk9ICJTaG93IFJlZ3MiLAogCS5lbmFibGVfbWFzawk9IFNZU1JRX0VOQUJMRV9EVU1QLAogfTsKQEAgLTI1OCw3ICsyNTgsNyBAQAogfQogc3RhdGljIHN0cnVjdCBzeXNycV9rZXlfb3Agc3lzcnFfc2hvd3N0YXRlX29wID0gewogCS5oYW5kbGVyCT0gc3lzcnFfaGFuZGxlX3Nob3dzdGF0ZSwKLQkuaGVscF9tc2cJPSAic2hvd1Rhc2tzIiwKKwkuaGVscF9tc2cJPSAic2hvdy10YXNrLXN0YXRlcyhUKSIsCiAJLmFjdGlvbl9tc2cJPSAiU2hvdyBTdGF0ZSIsCiAJLmVuYWJsZV9tYXNrCT0gU1lTUlFfRU5BQkxFX0RVTVAsCiB9OwpAQCAtMjY5LDcgKzI2OSw3IEBACiB9CiBzdGF0aWMgc3RydWN0IHN5c3JxX2tleV9vcCBzeXNycV9zaG93c3RhdGVfYmxvY2tlZF9vcCA9IHsKIAkuaGFuZGxlcgk9IHN5c3JxX2hhbmRsZV9zaG93c3RhdGVfYmxvY2tlZCwKLQkuaGVscF9tc2cJPSAic2hvVy1ibG9ja2VkLXRhc2tzIiwKKwkuaGVscF9tc2cJPSAic2hvdy1ibG9ja2VkLXRhc2tzKFcpIiwKIAkuYWN0aW9uX21zZwk9ICJTaG93IEJsb2NrZWQgU3RhdGUiLAogCS5lbmFibGVfbWFzawk9IFNZU1JRX0VOQUJMRV9EVU1QLAogfTsKQEAgLTI5Nyw3ICsyOTcsNyBAQAogfQogc3RhdGljIHN0cnVjdCBzeXNycV9rZXlfb3Agc3lzcnFfc2hvd21lbV9vcCA9IHsKIAkuaGFuZGxlcgk9IHN5c3JxX2hhbmRsZV9zaG93bWVtLAotCS5oZWxwX21zZwk9ICJzaG93TWVtIiwKKwkuaGVscF9tc2cJPSAic2hvdy1tZW1vcnktdXNhZ2UoTSkiLAogCS5hY3Rpb25fbXNnCT0gIlNob3cgTWVtb3J5IiwKIAkuZW5hYmxlX21hc2sJPSBTWVNSUV9FTkFCTEVfRFVNUCwKIH07CkBAIC0zMjMsNyArMzIzLDcgQEAKIH0KIHN0YXRpYyBzdHJ1Y3Qgc3lzcnFfa2V5X29wIHN5c3JxX3Rlcm1fb3AgPSB7CiAJLmhhbmRsZXIJPSBzeXNycV9oYW5kbGVfdGVybSwKLQkuaGVscF9tc2cJPSAidEVybSIsCisJLmhlbHBfbXNnCT0gInRlcm1pbmF0ZS1hbGwtdGFza3MoRSkiLAogCS5hY3Rpb25fbXNnCT0gIlRlcm1pbmF0ZSBBbGwgVGFza3MiLAogCS5lbmFibGVfbWFzawk9IFNZU1JRX0VOQUJMRV9TSUdOQUwsCiB9OwpAQCAtMzQxLDcgKzM0MSw3IEBACiB9CiBzdGF0aWMgc3RydWN0IHN5c3JxX2tleV9vcCBzeXNycV9tb29tX29wID0gewogCS5oYW5kbGVyCT0gc3lzcnFfaGFuZGxlX21vb20sCi0JLmhlbHBfbXNnCT0gIkZ1bGwiLAorCS5oZWxwX21zZwk9ICJtZW1vcnktZnVsbC1vb20ta2lsbChGKSIsCiAJLmFjdGlvbl9tc2cJPSAiTWFudWFsIE9PTSBleGVjdXRpb24iLAogCS5lbmFibGVfbWFzawk9IFNZU1JRX0VOQUJMRV9TSUdOQUwsCiB9OwpAQCAtMzUzLDcgKzM1Myw3IEBACiB9CiBzdGF0aWMgc3RydWN0IHN5c3JxX2tleV9vcCBzeXNycV9raWxsX29wID0gewogCS5oYW5kbGVyCT0gc3lzcnFfaGFuZGxlX2tpbGwsCi0JLmhlbHBfbXNnCT0gImtJbGwiLAorCS5oZWxwX21zZwk9ICJraWxsLWFsbC10YXNrcyhJKSIsCiAJLmFjdGlvbl9tc2cJPSAiS2lsbCBBbGwgVGFza3MiLAogCS5lbmFibGVfbWFzawk9IFNZU1JRX0VOQUJMRV9TSUdOQUwsCiB9OwpAQCAtMzY0LDcgKzM2NCw3IEBACiB9CiBzdGF0aWMgc3RydWN0IHN5c3JxX2tleV9vcCBzeXNycV91bnJ0X29wID0gewogCS5oYW5kbGVyCT0gc3lzcnFfaGFuZGxlX3VucnQsCi0JLmhlbHBfbXNnCT0gIk5pY2UiLAorCS5oZWxwX21zZwk9ICJuaWNlLWFsbC1SVC10YXNrcyhOKSIsCiAJLmFjdGlvbl9tc2cJPSAiTmljZSBBbGwgUlQgVGFza3MiLAogCS5lbmFibGVfbWFzawk9IFNZU1JRX0VOQUJMRV9SVE5JQ0UsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RwbS90cG1fbnNjLmMgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbV9uc2MuYwppbmRleCBhYjE4YzFlLi43MGVmYmEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHBtL3RwbV9uc2MuYworKysgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbV9uc2MuYwpAQCAtMjczLDEyICsyNzMsMjMgQEAKIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBuc2NfZHJ2ID0gewotCS5uYW1lID0gInRwbV9uc2MiLAotCS5idXMgPSAmcGxhdGZvcm1fYnVzX3R5cGUsCi0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLnN1c3BlbmQgPSB0cG1fcG1fc3VzcGVuZCwKLQkucmVzdW1lID0gdHBtX3BtX3Jlc3VtZSwKK3N0YXRpYyBpbnQgdHBtX25zY19zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IG1zZykKK3sKKwlyZXR1cm4gdHBtX3BtX3N1c3BlbmQoJmRldi0+ZGV2LCBtc2cpOworfQorCitzdGF0aWMgaW50IHRwbV9uc2NfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gdHBtX3BtX3Jlc3VtZSgmZGV2LT5kZXYpOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBuc2NfZHJ2ID0geworCS5zdXNwZW5kICAgICAgICAgPSB0cG1fbnNjX3N1c3BlbmQsCisJLnJlc3VtZSAgICAgICAgICA9IHRwbV9uc2NfcmVzdW1lLAorCS5kcml2ZXIgICAgICAgICAgPSB7CisJCS5uYW1lICAgID0gInRwbV9uc2MiLAorCQkub3duZXIgICA9IFRISVNfTU9EVUxFLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X25zYyh2b2lkKQpAQCAtMjk3LDcgKzMwOCw3IEBACiAJCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQllcnIgPSBkcml2ZXJfcmVnaXN0ZXIoJm5zY19kcnYpOworCWVyciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbnNjX2Rydik7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIApAQCAtMzA4LDE3ICszMTksMTUgQEAKIAkvKiBlbmFibGUgdGhlIERQTSBtb2R1bGUgKi8KIAl0cG1fd3JpdGVfaW5kZXgobnNjQWRkckJhc2UsIE5TQ19MRENfSU5ERVgsIDB4MDEpOwogCi0JcGRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJ0cG1fbnNjbDAiLCAtMSk7CiAJaWYgKCFwZGV2KSB7CiAJCXJjID0gLUVOT01FTTsKIAkJZ290byBlcnJfdW5yZWdfZHJ2OwogCX0KIAotCXBkZXYtPm5hbWUgPSAidHBtX25zY2wwIjsKLQlwZGV2LT5pZCA9IC0xOwogCXBkZXYtPm51bV9yZXNvdXJjZXMgPSAwOworCXBkZXYtPmRldi5kcml2ZXIgPSAmbnNjX2Rydi5kcml2ZXI7CiAJcGRldi0+ZGV2LnJlbGVhc2UgPSB0cG1fbnNjX3JlbW92ZTsKLQlwZGV2LT5kZXYuZHJpdmVyID0gJm5zY19kcnY7CiAKIAlpZiAoKHJjID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKHBkZXYpKSA8IDApCiAJCWdvdG8gZXJyX2ZyZWVfZGV2OwpAQCAtMzc3LDcgKzM4Niw3IEBACiBlcnJfZnJlZV9kZXY6CiAJa2ZyZWUocGRldik7CiBlcnJfdW5yZWdfZHJ2OgotCWRyaXZlcl91bnJlZ2lzdGVyKCZuc2NfZHJ2KTsKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbnNjX2Rydik7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0zOTAsNyArMzk5LDcgQEAKIAkJcGRldiA9IE5VTEw7CiAJfQogCi0JZHJpdmVyX3VucmVnaXN0ZXIoJm5zY19kcnYpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZuc2NfZHJ2KTsKIH0KIAogbW9kdWxlX2luaXQoaW5pdF9uc2MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Z0LmMgYi9kcml2ZXJzL2NoYXIvdnQuYwppbmRleCA4MDAxNDIxLi43OTAwYmQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdnQuYworKysgYi9kcml2ZXJzL2NoYXIvdnQuYwpAQCAtOTY5LDggKzk2OSw3IEBACiAgKglUYWtlcyB0aGUgY29uc29sZSBzZW0gYW5kIHRoZSBjYWxsZWQgbWV0aG9kcyB0aGVuIHRha2UgdGhlIHR0eQogICoJdGVybWlvc19tdXRleCBhbmQgdGhlIHR0eSBjdHJsX2xvY2sgaW4gdGhhdCBvcmRlci4KICAqLwotCi1pbnQgdnRfcmVzaXplKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB3aW5zaXplICp3cykKK3N0YXRpYyBpbnQgdnRfcmVzaXplKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB3aW5zaXplICp3cykKIHsKIAlzdHJ1Y3QgdmNfZGF0YSAqdmMgPSB0dHktPmRyaXZlcl9kYXRhOwogCWludCByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvS2NvbmZpZyBiL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnCmluZGV4IDVmMDc2YWUuLmE4YzhkOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnCkBAIC04Myw3ICs4Myw3IEBACiAJc2VsZWN0IENQVV9GUkVRX0dPVl9VU0VSU1BBQ0UKIAloZWxwCiAJICBVc2UgdGhlIENQVUZyZXEgZ292ZXJub3IgJ3VzZXJzcGFjZScgYXMgZGVmYXVsdC4gVGhpcyBhbGxvd3MKLQkgIHlvdSB0byBzZXQgdGhlIENQVSBmcmVxdWVuY3kgbWFudWFsbHkgb3Igd2hlbiBhbiB1c2Vyc3BhY2UgCisJICB5b3UgdG8gc2V0IHRoZSBDUFUgZnJlcXVlbmN5IG1hbnVhbGx5IG9yIHdoZW4gYSB1c2Vyc3BhY2UgCiAJICBwcm9ncmFtIHNoYWxsIGJlIGFibGUgdG8gc2V0IHRoZSBDUFUgZHluYW1pY2FsbHkgd2l0aG91dCBoYXZpbmcKIAkgIHRvIGVuYWJsZSB0aGUgdXNlcnNwYWNlIGdvdmVybm9yIG1hbnVhbGx5LgogCkBAIC0xMzgsNyArMTM4LDcgQEAKIAl0cmlzdGF0ZSAiJ3VzZXJzcGFjZScgZ292ZXJub3IgZm9yIHVzZXJzcGFjZSBmcmVxdWVuY3kgc2NhbGluZyIKIAloZWxwCiAJICBFbmFibGUgdGhpcyBjcHVmcmVxIGdvdmVybm9yIHdoZW4geW91IGVpdGhlciB3YW50IHRvIHNldCB0aGUKLQkgIENQVSBmcmVxdWVuY3kgbWFudWFsbHkgb3Igd2hlbiBhbiB1c2Vyc3BhY2UgcHJvZ3JhbSBzaGFsbAorCSAgQ1BVIGZyZXF1ZW5jeSBtYW51YWxseSBvciB3aGVuIGEgdXNlcnNwYWNlIHByb2dyYW0gc2hhbGwKIAkgIGJlIGFibGUgdG8gc2V0IHRoZSBDUFUgZHluYW1pY2FsbHksIGxpa2Ugb24gTEFSVCAKIAkgIDxodHRwOi8vd3d3LmxhcnRtYWtlci5ubC8+LgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS5jIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYwppbmRleCAzMWQ2ZjUzLi4wMWRkZTgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMKQEAgLTc1NCw2ICs3NTQsMTEgQEAKIAkucmVsZWFzZQk9IGNwdWZyZXFfc3lzZnNfcmVsZWFzZSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qga29ial90eXBlIGt0eXBlX2VtcHR5X2NwdWZyZXEgPSB7CisJLnN5c2ZzX29wcwk9ICZzeXNmc19vcHMsCisJLnJlbGVhc2UJPSBjcHVmcmVxX3N5c2ZzX3JlbGVhc2UsCit9OworCiAKIC8qKgogICogY3B1ZnJlcV9hZGRfZGV2IC0gYWRkIGEgQ1BVIGRldmljZQpAQCAtODIyLDggKzgyNyw4IEBACiAJCWRwcmludGsoImluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX291dDsKIAl9Ci0JcG9saWN5LT51c2VyX3BvbGljeS5taW4gPSBwb2xpY3ktPmNwdWluZm8ubWluX2ZyZXE7Ci0JcG9saWN5LT51c2VyX3BvbGljeS5tYXggPSBwb2xpY3ktPmNwdWluZm8ubWF4X2ZyZXE7CisJcG9saWN5LT51c2VyX3BvbGljeS5taW4gPSBwb2xpY3ktPm1pbjsKKwlwb2xpY3ktPnVzZXJfcG9saWN5Lm1heCA9IHBvbGljeS0+bWF4OwogCiAJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmY3B1ZnJlcV9wb2xpY3lfbm90aWZpZXJfbGlzdCwKIAkJCQkgICAgIENQVUZSRVFfU1RBUlQsIHBvbGljeSk7CkBAIC04NzYsMjYgKzg4MSwzNiBAQAogCW1lbWNweSgmbmV3X3BvbGljeSwgcG9saWN5LCBzaXplb2Yoc3RydWN0IGNwdWZyZXFfcG9saWN5KSk7CiAKIAkvKiBwcmVwYXJlIGludGVyZmFjZSBkYXRhICovCi0JcmV0ID0ga29iamVjdF9pbml0X2FuZF9hZGQoJnBvbGljeS0+a29iaiwgJmt0eXBlX2NwdWZyZXEsICZzeXNfZGV2LT5rb2JqLAotCQkJCSAgICJjcHVmcmVxIik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJfb3V0X2RyaXZlcl9leGl0OworCWlmICghY3B1ZnJlcV9kcml2ZXItPmhpZGVfaW50ZXJmYWNlKSB7CisJCXJldCA9IGtvYmplY3RfaW5pdF9hbmRfYWRkKCZwb2xpY3ktPmtvYmosICZrdHlwZV9jcHVmcmVxLAorCQkJCQkgICAmc3lzX2Rldi0+a29iaiwgImNwdWZyZXEiKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX291dF9kcml2ZXJfZXhpdDsKIAotCS8qIHNldCB1cCBmaWxlcyBmb3IgdGhpcyBjcHUgZGV2aWNlICovCi0JZHJ2X2F0dHIgPSBjcHVmcmVxX2RyaXZlci0+YXR0cjsKLQl3aGlsZSAoKGRydl9hdHRyKSAmJiAoKmRydl9hdHRyKSkgewotCQlyZXQgPSBzeXNmc19jcmVhdGVfZmlsZSgmcG9saWN5LT5rb2JqLCAmKCgqZHJ2X2F0dHIpLT5hdHRyKSk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIGVycl9vdXRfZHJpdmVyX2V4aXQ7Ci0JCWRydl9hdHRyKys7Ci0JfQotCWlmIChjcHVmcmVxX2RyaXZlci0+Z2V0KSB7Ci0JCXJldCA9IHN5c2ZzX2NyZWF0ZV9maWxlKCZwb2xpY3ktPmtvYmosICZjcHVpbmZvX2N1cl9mcmVxLmF0dHIpOwotCQlpZiAocmV0KQotCQkJZ290byBlcnJfb3V0X2RyaXZlcl9leGl0OwotCX0KLQlpZiAoY3B1ZnJlcV9kcml2ZXItPnRhcmdldCkgewotCQlyZXQgPSBzeXNmc19jcmVhdGVfZmlsZSgmcG9saWN5LT5rb2JqLCAmc2NhbGluZ19jdXJfZnJlcS5hdHRyKTsKKwkJLyogc2V0IHVwIGZpbGVzIGZvciB0aGlzIGNwdSBkZXZpY2UgKi8KKwkJZHJ2X2F0dHIgPSBjcHVmcmVxX2RyaXZlci0+YXR0cjsKKwkJd2hpbGUgKChkcnZfYXR0cikgJiYgKCpkcnZfYXR0cikpIHsKKwkJCXJldCA9IHN5c2ZzX2NyZWF0ZV9maWxlKCZwb2xpY3ktPmtvYmosCisJCQkJCQkmKCgqZHJ2X2F0dHIpLT5hdHRyKSk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZXJyX291dF9kcml2ZXJfZXhpdDsKKwkJCWRydl9hdHRyKys7CisJCX0KKwkJaWYgKGNwdWZyZXFfZHJpdmVyLT5nZXQpIHsKKwkJCXJldCA9IHN5c2ZzX2NyZWF0ZV9maWxlKCZwb2xpY3ktPmtvYmosCisJCQkJCQkmY3B1aW5mb19jdXJfZnJlcS5hdHRyKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBlcnJfb3V0X2RyaXZlcl9leGl0OworCQl9CisJCWlmIChjcHVmcmVxX2RyaXZlci0+dGFyZ2V0KSB7CisJCQlyZXQgPSBzeXNmc19jcmVhdGVfZmlsZSgmcG9saWN5LT5rb2JqLAorCQkJCQkJJnNjYWxpbmdfY3VyX2ZyZXEuYXR0cik7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZXJyX291dF9kcml2ZXJfZXhpdDsKKwkJfQorCX0gZWxzZSB7CisJCXJldCA9IGtvYmplY3RfaW5pdF9hbmRfYWRkKCZwb2xpY3ktPmtvYmosICZrdHlwZV9lbXB0eV9jcHVmcmVxLAorCQkJCQkgICAmc3lzX2Rldi0+a29iaiwgImNwdWZyZXEiKTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gZXJyX291dF9kcml2ZXJfZXhpdDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RjYS9kY2EtY29yZS5jIGIvZHJpdmVycy9kY2EvZGNhLWNvcmUuYwppbmRleCBkODgzZTFiLi41NTQzMzg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RjYS9kY2EtY29yZS5jCisrKyBiL2RyaXZlcnMvZGNhL2RjYS1jb3JlLmMKQEAgLTI3MCw2ICsyNzAsNiBAQAogCWRjYV9zeXNmc19leGl0KCk7CiB9CiAKLXN1YnN5c19pbml0Y2FsbChkY2FfaW5pdCk7CithcmNoX2luaXRjYWxsKGRjYV9pbml0KTsKIG1vZHVsZV9leGl0KGRjYV9leGl0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvS2NvbmZpZyBiL2RyaXZlcnMvZG1hL0tjb25maWcKaW5kZXggOTA0ZTU3NS4uZTM0YjA2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvS2NvbmZpZworKysgYi9kcml2ZXJzL2RtYS9LY29uZmlnCkBAIC0zMyw3ICszMyw2IEBACiBjb25maWcgSU5URUxfSU9QX0FETUEKIAl0cmlzdGF0ZSAiSW50ZWwgSU9QIEFETUEgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEFSQ0hfSU9QMzJYIHx8IEFSQ0hfSU9QMzNYIHx8IEFSQ0hfSU9QMTNYWAotCXNlbGVjdCBBU1lOQ19DT1JFCiAJc2VsZWN0IERNQV9FTkdJTkUKIAloZWxwCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIEludGVsKFIpIElPUCBTZXJpZXMgUkFJRCBlbmdpbmVzLgpAQCAtNTksNyArNTgsNiBAQAogY29uZmlnIE1WX1hPUgogCWJvb2wgIk1hcnZlbGwgWE9SIGVuZ2luZSBzdXBwb3J0IgogCWRlcGVuZHMgb24gUExBVF9PUklPTgotCXNlbGVjdCBBU1lOQ19DT1JFCiAJc2VsZWN0IERNQV9FTkdJTkUKIAktLS1oZWxwLS0tCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIE1hcnZlbGwgWE9SIGVuZ2luZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2RtYWVuZ2luZS5jIGIvZHJpdmVycy9kbWEvZG1hZW5naW5lLmMKaW5kZXggNjU3OTk2NS4uNDAzZGJlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvZG1hZW5naW5lLmMKKysrIGIvZHJpdmVycy9kbWEvZG1hZW5naW5lLmMKQEAgLTMxLDMyICszMSwxOCBAQAogICoKICAqIExPQ0tJTkc6CiAgKgotICogVGhlIHN1YnN5c3RlbSBrZWVwcyB0d28gZ2xvYmFsIGxpc3RzLCBkbWFfZGV2aWNlX2xpc3QgYW5kIGRtYV9jbGllbnRfbGlzdC4KLSAqIEJvdGggb2YgdGhlc2UgYXJlIHByb3RlY3RlZCBieSBhIG11dGV4LCBkbWFfbGlzdF9tdXRleC4KKyAqIFRoZSBzdWJzeXN0ZW0ga2VlcHMgYSBnbG9iYWwgbGlzdCBvZiBkbWFfZGV2aWNlIHN0cnVjdHMgaXQgaXMgcHJvdGVjdGVkIGJ5IGEKKyAqIG11dGV4LCBkbWFfbGlzdF9tdXRleC4KKyAqCisgKiBBIHN1YnN5c3RlbSBjYW4gZ2V0IGFjY2VzcyB0byBhIGNoYW5uZWwgYnkgY2FsbGluZyBkbWFlbmdpbmVfZ2V0KCkgZm9sbG93ZWQKKyAqIGJ5IGRtYV9maW5kX2NoYW5uZWwoKSwgb3IgaWYgaXQgaGFzIG5lZWQgZm9yIGFuIGV4Y2x1c2l2ZSBjaGFubmVsIGl0IGNhbiBjYWxsCisgKiBkbWFfcmVxdWVzdF9jaGFubmVsKCkuICBPbmNlIGEgY2hhbm5lbCBpcyBhbGxvY2F0ZWQgYSByZWZlcmVuY2UgaXMgdGFrZW4KKyAqIGFnYWluc3QgaXRzIGNvcnJlc3BvbmRpbmcgZHJpdmVyIHRvIGRpc2FibGUgcmVtb3ZhbC4KICAqCiAgKiBFYWNoIGRldmljZSBoYXMgYSBjaGFubmVscyBsaXN0LCB3aGljaCBydW5zIHVubG9ja2VkIGJ1dCBpcyBuZXZlciBtb2RpZmllZAogICogb25jZSB0aGUgZGV2aWNlIGlzIHJlZ2lzdGVyZWQsIGl0J3MganVzdCBzZXR1cCBieSB0aGUgZHJpdmVyLgogICoKLSAqIEVhY2ggY2xpZW50IGlzIHJlc3BvbnNpYmxlIGZvciBrZWVwaW5nIHRyYWNrIG9mIHRoZSBjaGFubmVscyBpdCB1c2VzLiAgU2VlCi0gKiB0aGUgZGVmaW5pdGlvbiBvZiBkbWFfZXZlbnRfY2FsbGJhY2sgaW4gZG1hZW5naW5lLmguCi0gKgotICogRWFjaCBkZXZpY2UgaGFzIGEga3JlZiwgd2hpY2ggaXMgaW5pdGlhbGl6ZWQgdG8gMSB3aGVuIHRoZSBkZXZpY2UgaXMKLSAqIHJlZ2lzdGVyZWQuIEEga3JlZl9nZXQgaXMgZG9uZSBmb3IgZWFjaCBkZXZpY2UgcmVnaXN0ZXJlZC4gIFdoZW4gdGhlCi0gKiBkZXZpY2UgaXMgcmVsZWFzZWQsIHRoZSBjb3JyZXNwb25kaW5nIGtyZWZfcHV0IGlzIGRvbmUgaW4gdGhlIHJlbGVhc2UKLSAqIG1ldGhvZC4gRXZlcnkgdGltZSBvbmUgb2YgdGhlIGRldmljZSdzIGNoYW5uZWxzIGlzIGFsbG9jYXRlZCB0byBhIGNsaWVudCwKLSAqIGEga3JlZl9nZXQgb2NjdXJzLiAgV2hlbiB0aGUgY2hhbm5lbCBpcyBmcmVlZCwgdGhlIGNvcnJlc3BvbmRpbmcga3JlZl9wdXQKLSAqIGhhcHBlbnMuIFRoZSBkZXZpY2UncyByZWxlYXNlIGZ1bmN0aW9uIGRvZXMgYSBjb21wbGV0aW9uLCBzbwotICogdW5yZWdpc3Rlcl9kZXZpY2UgZG9lcyBhIHJlbW92ZSBldmVudCwgZGV2aWNlX3VucmVnaXN0ZXIsIGEga3JlZl9wdXQKLSAqIGZvciB0aGUgZmlyc3QgcmVmZXJlbmNlLCB0aGVuIHdhaXRzIG9uIHRoZSBjb21wbGV0aW9uIGZvciBhbGwgb3RoZXIKLSAqIHJlZmVyZW5jZXMgdG8gZmluaXNoLgotICoKLSAqIEVhY2ggY2hhbm5lbCBoYXMgYW4gb3Blbi1jb2RlZCBpbXBsZW1lbnRhdGlvbiBvZiBSdXN0eSBSdXNzZWxsJ3MgImJpZ3JlZiwiCi0gKiB3aXRoIGEga3JlZiBhbmQgYSBwZXJfY3B1IGxvY2FsX3QuICBBIGRtYV9jaGFuX2dldCBpcyBjYWxsZWQgd2hlbiBhIGNsaWVudAotICogc2lnbmFscyB0aGF0IGl0IHdhbnRzIHRvIHVzZSBhIGNoYW5uZWwsIGFuZCBkbWFfY2hhbl9wdXQgaXMgY2FsbGVkIHdoZW4KLSAqIGEgY2hhbm5lbCBpcyByZW1vdmVkIG9yIGEgY2xpZW50IHVzaW5nIGl0IGlzIHVucmVnaXN0ZXJlZC4gIEEgY2xpZW50IGNhbgotICogdGFrZSBleHRyYSByZWZlcmVuY2VzIHBlciBvdXRzdGFuZGluZyB0cmFuc2FjdGlvbiwgYXMgaXMgdGhlIGNhc2Ugd2l0aAotICogdGhlIE5FVCBETUEgY2xpZW50LiAgVGhlIHJlbGVhc2UgZnVuY3Rpb24gZG9lcyBhIGtyZWZfcHV0IG9uIHRoZSBkZXZpY2UuCi0gKgktQ2hyaXNMLCBEYW5XCisgKiBTZWUgRG9jdW1lbnRhdGlvbi9kbWFlbmdpbmUudHh0IGZvciBtb3JlIGRldGFpbHMKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtNzAsNTQgKzU2LDg1IEBACiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaWRyLmg+CiAKIHN0YXRpYyBERUZJTkVfTVVURVgoZG1hX2xpc3RfbXV0ZXgpOwogc3RhdGljIExJU1RfSEVBRChkbWFfZGV2aWNlX2xpc3QpOwotc3RhdGljIExJU1RfSEVBRChkbWFfY2xpZW50X2xpc3QpOworc3RhdGljIGxvbmcgZG1hZW5naW5lX3JlZl9jb3VudDsKK3N0YXRpYyBzdHJ1Y3QgaWRyIGRtYV9pZHI7CiAKIC8qIC0tLSBzeXNmcyBpbXBsZW1lbnRhdGlvbiAtLS0gKi8KIAorLyoqCisgKiBkZXZfdG9fZG1hX2NoYW4gLSBjb252ZXJ0IGEgZGV2aWNlIHBvaW50ZXIgdG8gdGhlIGl0cyBzeXNmcyBjb250YWluZXIgb2JqZWN0CisgKiBAZGV2IC0gZGV2aWNlIG5vZGUKKyAqCisgKiBNdXN0IGJlIGNhbGxlZCB1bmRlciBkbWFfbGlzdF9tdXRleAorICovCitzdGF0aWMgc3RydWN0IGRtYV9jaGFuICpkZXZfdG9fZG1hX2NoYW4oc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBkbWFfY2hhbl9kZXYgKmNoYW5fZGV2OworCisJY2hhbl9kZXYgPSBjb250YWluZXJfb2YoZGV2LCB0eXBlb2YoKmNoYW5fZGV2KSwgZGV2aWNlKTsKKwlyZXR1cm4gY2hhbl9kZXYtPmNoYW47Cit9CisKIHN0YXRpYyBzc2l6ZV90IHNob3dfbWVtY3B5X2NvdW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4gPSB0b19kbWFfY2hhbihkZXYpOworCXN0cnVjdCBkbWFfY2hhbiAqY2hhbjsKIAl1bnNpZ25lZCBsb25nIGNvdW50ID0gMDsKIAlpbnQgaTsKKwlpbnQgZXJyOwogCi0JZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpCi0JCWNvdW50ICs9IHBlcl9jcHVfcHRyKGNoYW4tPmxvY2FsLCBpKS0+bWVtY3B5X2NvdW50OworCW11dGV4X2xvY2soJmRtYV9saXN0X211dGV4KTsKKwljaGFuID0gZGV2X3RvX2RtYV9jaGFuKGRldik7CisJaWYgKGNoYW4pIHsKKwkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpCisJCQljb3VudCArPSBwZXJfY3B1X3B0cihjaGFuLT5sb2NhbCwgaSktPm1lbWNweV9jb3VudDsKKwkJZXJyID0gc3ByaW50ZihidWYsICIlbHVcbiIsIGNvdW50KTsKKwl9IGVsc2UKKwkJZXJyID0gLUVOT0RFVjsKKwltdXRleF91bmxvY2soJmRtYV9saXN0X211dGV4KTsKIAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsdVxuIiwgY291bnQpOworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHNob3dfYnl0ZXNfdHJhbnNmZXJyZWQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCQkgICAgICBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IGRtYV9jaGFuICpjaGFuID0gdG9fZG1hX2NoYW4oZGV2KTsKKwlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW47CiAJdW5zaWduZWQgbG9uZyBjb3VudCA9IDA7CiAJaW50IGk7CisJaW50IGVycjsKIAotCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKQotCQljb3VudCArPSBwZXJfY3B1X3B0cihjaGFuLT5sb2NhbCwgaSktPmJ5dGVzX3RyYW5zZmVycmVkOworCW11dGV4X2xvY2soJmRtYV9saXN0X211dGV4KTsKKwljaGFuID0gZGV2X3RvX2RtYV9jaGFuKGRldik7CisJaWYgKGNoYW4pIHsKKwkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpCisJCQljb3VudCArPSBwZXJfY3B1X3B0cihjaGFuLT5sb2NhbCwgaSktPmJ5dGVzX3RyYW5zZmVycmVkOworCQllcnIgPSBzcHJpbnRmKGJ1ZiwgIiVsdVxuIiwgY291bnQpOworCX0gZWxzZQorCQllcnIgPSAtRU5PREVWOworCW11dGV4X3VubG9jaygmZG1hX2xpc3RfbXV0ZXgpOwogCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWx1XG4iLCBjb3VudCk7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHNzaXplX3Qgc2hvd19pbl91c2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCBkbWFfY2hhbiAqY2hhbiA9IHRvX2RtYV9jaGFuKGRldik7Ci0JaW50IGluX3VzZSA9IDA7CisJc3RydWN0IGRtYV9jaGFuICpjaGFuOworCWludCBlcnI7CiAKLQlpZiAodW5saWtlbHkoY2hhbi0+c2xvd19yZWYpICYmCi0JCWF0b21pY19yZWFkKCZjaGFuLT5yZWZjb3VudC5yZWZjb3VudCkgPiAxKQotCQlpbl91c2UgPSAxOwotCWVsc2UgewotCQlpZiAobG9jYWxfcmVhZCgmKHBlcl9jcHVfcHRyKGNoYW4tPmxvY2FsLAotCQkJZ2V0X2NwdSgpKS0+cmVmY291bnQpKSA+IDApCi0JCQlpbl91c2UgPSAxOwotCQlwdXRfY3B1KCk7Ci0JfQorCW11dGV4X2xvY2soJmRtYV9saXN0X211dGV4KTsKKwljaGFuID0gZGV2X3RvX2RtYV9jaGFuKGRldik7CisJaWYgKGNoYW4pCisJCWVyciA9IHNwcmludGYoYnVmLCAiJWRcbiIsIGNoYW4tPmNsaWVudF9jb3VudCk7CisJZWxzZQorCQllcnIgPSAtRU5PREVWOworCW11dGV4X3VubG9jaygmZG1hX2xpc3RfbXV0ZXgpOwogCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGluX3VzZSk7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRtYV9hdHRyc1tdID0gewpAQCAtMTI3LDc4ICsxNDQsMTEyIEBACiAJX19BVFRSX05VTEwKIH07CiAKLXN0YXRpYyB2b2lkIGRtYV9hc3luY19kZXZpY2VfY2xlYW51cChzdHJ1Y3Qga3JlZiAqa3JlZik7Ci0KLXN0YXRpYyB2b2lkIGRtYV9kZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBjaGFuX2Rldl9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4gPSB0b19kbWFfY2hhbihkZXYpOwotCWtyZWZfcHV0KCZjaGFuLT5kZXZpY2UtPnJlZmNvdW50LCBkbWFfYXN5bmNfZGV2aWNlX2NsZWFudXApOworCXN0cnVjdCBkbWFfY2hhbl9kZXYgKmNoYW5fZGV2OworCisJY2hhbl9kZXYgPSBjb250YWluZXJfb2YoZGV2LCB0eXBlb2YoKmNoYW5fZGV2KSwgZGV2aWNlKTsKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdChjaGFuX2Rldi0+aWRyX3JlZikpIHsKKwkJbXV0ZXhfbG9jaygmZG1hX2xpc3RfbXV0ZXgpOworCQlpZHJfcmVtb3ZlKCZkbWFfaWRyLCBjaGFuX2Rldi0+ZGV2X2lkKTsKKwkJbXV0ZXhfdW5sb2NrKCZkbWFfbGlzdF9tdXRleCk7CisJCWtmcmVlKGNoYW5fZGV2LT5pZHJfcmVmKTsKKwl9CisJa2ZyZWUoY2hhbl9kZXYpOwogfQogCiBzdGF0aWMgc3RydWN0IGNsYXNzIGRtYV9kZXZjbGFzcyA9IHsKIAkubmFtZQkJPSAiZG1hIiwKIAkuZGV2X2F0dHJzCT0gZG1hX2F0dHJzLAotCS5kZXZfcmVsZWFzZQk9IGRtYV9kZXZfcmVsZWFzZSwKKwkuZGV2X3JlbGVhc2UJPSBjaGFuX2Rldl9yZWxlYXNlLAogfTsKIAogLyogLS0tIGNsaWVudCBhbmQgZGV2aWNlIHJlZ2lzdHJhdGlvbiAtLS0gKi8KIAotI2RlZmluZSBkbWFfY2hhbl9zYXRpc2ZpZXNfbWFzayhjaGFuLCBtYXNrKSBcCi0JX19kbWFfY2hhbl9zYXRpc2ZpZXNfbWFzaygoY2hhbiksICYobWFzaykpCisjZGVmaW5lIGRtYV9kZXZpY2Vfc2F0aXNmaWVzX21hc2soZGV2aWNlLCBtYXNrKSBcCisJX19kbWFfZGV2aWNlX3NhdGlzZmllc19tYXNrKChkZXZpY2UpLCAmKG1hc2spKQogc3RhdGljIGludAotX19kbWFfY2hhbl9zYXRpc2ZpZXNfbWFzayhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIGRtYV9jYXBfbWFza190ICp3YW50KQorX19kbWFfZGV2aWNlX3NhdGlzZmllc19tYXNrKHN0cnVjdCBkbWFfZGV2aWNlICpkZXZpY2UsIGRtYV9jYXBfbWFza190ICp3YW50KQogewogCWRtYV9jYXBfbWFza190IGhhczsKIAotCWJpdG1hcF9hbmQoaGFzLmJpdHMsIHdhbnQtPmJpdHMsIGNoYW4tPmRldmljZS0+Y2FwX21hc2suYml0cywKKwliaXRtYXBfYW5kKGhhcy5iaXRzLCB3YW50LT5iaXRzLCBkZXZpY2UtPmNhcF9tYXNrLmJpdHMsCiAJCURNQV9UWF9UWVBFX0VORCk7CiAJcmV0dXJuIGJpdG1hcF9lcXVhbCh3YW50LT5iaXRzLCBoYXMuYml0cywgRE1BX1RYX1RZUEVfRU5EKTsKIH0KIAotLyoqCi0gKiBkbWFfY2xpZW50X2NoYW5fYWxsb2MgLSB0cnkgdG8gYWxsb2NhdGUgY2hhbm5lbHMgdG8gYSBjbGllbnQKLSAqIEBjbGllbnQ6ICZkbWFfY2xpZW50Ci0gKgotICogQ2FsbGVkIHdpdGggZG1hX2xpc3RfbXV0ZXggaGVsZC4KLSAqLwotc3RhdGljIHZvaWQgZG1hX2NsaWVudF9jaGFuX2FsbG9jKHN0cnVjdCBkbWFfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgc3RydWN0IG1vZHVsZSAqZG1hX2NoYW5fdG9fb3duZXIoc3RydWN0IGRtYV9jaGFuICpjaGFuKQogewotCXN0cnVjdCBkbWFfZGV2aWNlICpkZXZpY2U7Ci0Jc3RydWN0IGRtYV9jaGFuICpjaGFuOwotCWludCBkZXNjOwkvKiBhbGxvY2F0ZWQgZGVzY3JpcHRvciBjb3VudCAqLwotCWVudW0gZG1hX3N0YXRlX2NsaWVudCBhY2s7CisJcmV0dXJuIGNoYW4tPmRldmljZS0+ZGV2LT5kcml2ZXItPm93bmVyOworfQogCi0JLyogRmluZCBhIGNoYW5uZWwgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldmljZSwgJmRtYV9kZXZpY2VfbGlzdCwgZ2xvYmFsX25vZGUpIHsKLQkJLyogRG9lcyB0aGUgY2xpZW50IHJlcXVpcmUgYSBzcGVjaWZpYyBETUEgY29udHJvbGxlcj8gKi8KLQkJaWYgKGNsaWVudC0+c2xhdmUgJiYgY2xpZW50LT5zbGF2ZS0+ZG1hX2RldgotCQkJCSYmIGNsaWVudC0+c2xhdmUtPmRtYV9kZXYgIT0gZGV2aWNlLT5kZXYpCi0JCQljb250aW51ZTsKKy8qKgorICogYmFsYW5jZV9yZWZfY291bnQgLSBjYXRjaCB1cCB0aGUgY2hhbm5lbCByZWZlcmVuY2UgY291bnQKKyAqIEBjaGFuIC0gY2hhbm5lbCB0byBiYWxhbmNlIC0+Y2xpZW50X2NvdW50IHZlcnN1cyBkbWFlbmdpbmVfcmVmX2NvdW50CisgKgorICogYmFsYW5jZV9yZWZfY291bnQgbXVzdCBiZSBjYWxsZWQgdW5kZXIgZG1hX2xpc3RfbXV0ZXgKKyAqLworc3RhdGljIHZvaWQgYmFsYW5jZV9yZWZfY291bnQoc3RydWN0IGRtYV9jaGFuICpjaGFuKQoreworCXN0cnVjdCBtb2R1bGUgKm93bmVyID0gZG1hX2NoYW5fdG9fb3duZXIoY2hhbik7CiAKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGFuLCAmZGV2aWNlLT5jaGFubmVscywgZGV2aWNlX25vZGUpIHsKLQkJCWlmICghZG1hX2NoYW5fc2F0aXNmaWVzX21hc2soY2hhbiwgY2xpZW50LT5jYXBfbWFzaykpCi0JCQkJY29udGludWU7Ci0KLQkJCWRlc2MgPSBjaGFuLT5kZXZpY2UtPmRldmljZV9hbGxvY19jaGFuX3Jlc291cmNlcygKLQkJCQkJY2hhbiwgY2xpZW50KTsKLQkJCWlmIChkZXNjID49IDApIHsKLQkJCQlhY2sgPSBjbGllbnQtPmV2ZW50X2NhbGxiYWNrKGNsaWVudCwKLQkJCQkJCWNoYW4sCi0JCQkJCQlETUFfUkVTT1VSQ0VfQVZBSUxBQkxFKTsKLQotCQkJCS8qIHdlIGFyZSBkb25lIG9uY2UgdGhpcyBjbGllbnQgcmVqZWN0cwotCQkJCSAqIGFuIGF2YWlsYWJsZSByZXNvdXJjZQotCQkJCSAqLwotCQkJCWlmIChhY2sgPT0gRE1BX0FDSykgewotCQkJCQlkbWFfY2hhbl9nZXQoY2hhbik7Ci0JCQkJCWNoYW4tPmNsaWVudF9jb3VudCsrOwotCQkJCX0gZWxzZSBpZiAoYWNrID09IERNQV9OQUspCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJfQorCXdoaWxlIChjaGFuLT5jbGllbnRfY291bnQgPCBkbWFlbmdpbmVfcmVmX2NvdW50KSB7CisJCV9fbW9kdWxlX2dldChvd25lcik7CisJCWNoYW4tPmNsaWVudF9jb3VudCsrOwogCX0KIH0KIAorLyoqCisgKiBkbWFfY2hhbl9nZXQgLSB0cnkgdG8gZ3JhYiBhIGRtYSBjaGFubmVsJ3MgcGFyZW50IGRyaXZlciBtb2R1bGUKKyAqIEBjaGFuIC0gY2hhbm5lbCB0byBncmFiCisgKgorICogTXVzdCBiZSBjYWxsZWQgdW5kZXIgZG1hX2xpc3RfbXV0ZXgKKyAqLworc3RhdGljIGludCBkbWFfY2hhbl9nZXQoc3RydWN0IGRtYV9jaGFuICpjaGFuKQoreworCWludCBlcnIgPSAtRU5PREVWOworCXN0cnVjdCBtb2R1bGUgKm93bmVyID0gZG1hX2NoYW5fdG9fb3duZXIoY2hhbik7CisKKwlpZiAoY2hhbi0+Y2xpZW50X2NvdW50KSB7CisJCV9fbW9kdWxlX2dldChvd25lcik7CisJCWVyciA9IDA7CisJfSBlbHNlIGlmICh0cnlfbW9kdWxlX2dldChvd25lcikpCisJCWVyciA9IDA7CisKKwlpZiAoZXJyID09IDApCisJCWNoYW4tPmNsaWVudF9jb3VudCsrOworCisJLyogYWxsb2NhdGUgdXBvbiBmaXJzdCBjbGllbnQgcmVmZXJlbmNlICovCisJaWYgKGNoYW4tPmNsaWVudF9jb3VudCA9PSAxICYmIGVyciA9PSAwKSB7CisJCWludCBkZXNjX2NudCA9IGNoYW4tPmRldmljZS0+ZGV2aWNlX2FsbG9jX2NoYW5fcmVzb3VyY2VzKGNoYW4pOworCisJCWlmIChkZXNjX2NudCA8IDApIHsKKwkJCWVyciA9IGRlc2NfY250OworCQkJY2hhbi0+Y2xpZW50X2NvdW50ID0gMDsKKwkJCW1vZHVsZV9wdXQob3duZXIpOworCQl9IGVsc2UgaWYgKCFkbWFfaGFzX2NhcChETUFfUFJJVkFURSwgY2hhbi0+ZGV2aWNlLT5jYXBfbWFzaykpCisJCQliYWxhbmNlX3JlZl9jb3VudChjaGFuKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIGRtYV9jaGFuX3B1dCAtIGRyb3AgYSByZWZlcmVuY2UgdG8gYSBkbWEgY2hhbm5lbCdzIHBhcmVudCBkcml2ZXIgbW9kdWxlCisgKiBAY2hhbiAtIGNoYW5uZWwgdG8gcmVsZWFzZQorICoKKyAqIE11c3QgYmUgY2FsbGVkIHVuZGVyIGRtYV9saXN0X211dGV4CisgKi8KK3N0YXRpYyB2b2lkIGRtYV9jaGFuX3B1dChzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJaWYgKCFjaGFuLT5jbGllbnRfY291bnQpCisJCXJldHVybjsgLyogdGhpcyBjaGFubmVsIGZhaWxlZCBhbGxvY19jaGFuX3Jlc291cmNlcyAqLworCWNoYW4tPmNsaWVudF9jb3VudC0tOworCW1vZHVsZV9wdXQoZG1hX2NoYW5fdG9fb3duZXIoY2hhbikpOworCWlmIChjaGFuLT5jbGllbnRfY291bnQgPT0gMCkKKwkJY2hhbi0+ZGV2aWNlLT5kZXZpY2VfZnJlZV9jaGFuX3Jlc291cmNlcyhjaGFuKTsKK30KKwogZW51bSBkbWFfc3RhdHVzIGRtYV9zeW5jX3dhaXQoc3RydWN0IGRtYV9jaGFuICpjaGFuLCBkbWFfY29va2llX3QgY29va2llKQogewogCWVudW0gZG1hX3N0YXR1cyBzdGF0dXM7CkBAIC0yMTgsMTM4ICsyNjksMzQyIEBACiBFWFBPUlRfU1lNQk9MKGRtYV9zeW5jX3dhaXQpOwogCiAvKioKLSAqIGRtYV9jaGFuX2NsZWFudXAgLSByZWxlYXNlIGEgRE1BIGNoYW5uZWwncyByZXNvdXJjZXMKLSAqIEBrcmVmOiBrZXJuZWwgcmVmZXJlbmNlIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBETUEgY2hhbm5lbCBkZXZpY2UKKyAqIGRtYV9jYXBfbWFza19hbGwgLSBlbmFibGUgaXRlcmF0aW9uIG92ZXIgYWxsIG9wZXJhdGlvbiB0eXBlcwogICovCi12b2lkIGRtYV9jaGFuX2NsZWFudXAoc3RydWN0IGtyZWYgKmtyZWYpCi17Ci0Jc3RydWN0IGRtYV9jaGFuICpjaGFuID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBkbWFfY2hhbiwgcmVmY291bnQpOwotCWNoYW4tPmRldmljZS0+ZGV2aWNlX2ZyZWVfY2hhbl9yZXNvdXJjZXMoY2hhbik7Ci0Ja3JlZl9wdXQoJmNoYW4tPmRldmljZS0+cmVmY291bnQsIGRtYV9hc3luY19kZXZpY2VfY2xlYW51cCk7Ci19Ci1FWFBPUlRfU1lNQk9MKGRtYV9jaGFuX2NsZWFudXApOwotCi1zdGF0aWMgdm9pZCBkbWFfY2hhbl9mcmVlX3JjdShzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkKLXsKLQlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4gPSBjb250YWluZXJfb2YocmN1LCBzdHJ1Y3QgZG1hX2NoYW4sIHJjdSk7Ci0JaW50IGJpYXMgPSAweDdGRkZGRkZGOwotCWludCBpOwotCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKQotCQliaWFzIC09IGxvY2FsX3JlYWQoJnBlcl9jcHVfcHRyKGNoYW4tPmxvY2FsLCBpKS0+cmVmY291bnQpOwotCWF0b21pY19zdWIoYmlhcywgJmNoYW4tPnJlZmNvdW50LnJlZmNvdW50KTsKLQlrcmVmX3B1dCgmY2hhbi0+cmVmY291bnQsIGRtYV9jaGFuX2NsZWFudXApOwotfQotCi1zdGF0aWMgdm9pZCBkbWFfY2hhbl9yZWxlYXNlKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKLXsKLQlhdG9taWNfYWRkKDB4N0ZGRkZGRkYsICZjaGFuLT5yZWZjb3VudC5yZWZjb3VudCk7Ci0JY2hhbi0+c2xvd19yZWYgPSAxOwotCWNhbGxfcmN1KCZjaGFuLT5yY3UsIGRtYV9jaGFuX2ZyZWVfcmN1KTsKLX0KK3N0YXRpYyBkbWFfY2FwX21hc2tfdCBkbWFfY2FwX21hc2tfYWxsOwogCiAvKioKLSAqIGRtYV9jaGFuc19ub3RpZnlfYXZhaWxhYmxlIC0gYnJvYWRjYXN0IGF2YWlsYWJsZSBjaGFubmVscyB0byB0aGUgY2xpZW50cworICogZG1hX2NoYW5fdGJsX2VudCAtIHRyYWNrcyBjaGFubmVsIGFsbG9jYXRpb25zIHBlciBjb3JlL29wZXJhdGlvbgorICogQGNoYW4gLSBhc3NvY2lhdGVkIGNoYW5uZWwgZm9yIHRoaXMgZW50cnkKICAqLwotc3RhdGljIHZvaWQgZG1hX2NsaWVudHNfbm90aWZ5X2F2YWlsYWJsZSh2b2lkKQotewotCXN0cnVjdCBkbWFfY2xpZW50ICpjbGllbnQ7Ci0KLQltdXRleF9sb2NrKCZkbWFfbGlzdF9tdXRleCk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNsaWVudCwgJmRtYV9jbGllbnRfbGlzdCwgZ2xvYmFsX25vZGUpCi0JCWRtYV9jbGllbnRfY2hhbl9hbGxvYyhjbGllbnQpOwotCi0JbXV0ZXhfdW5sb2NrKCZkbWFfbGlzdF9tdXRleCk7Ci19CitzdHJ1Y3QgZG1hX2NoYW5fdGJsX2VudCB7CisJc3RydWN0IGRtYV9jaGFuICpjaGFuOworfTsKIAogLyoqCi0gKiBkbWFfY2hhbnNfbm90aWZ5X2F2YWlsYWJsZSAtIHRlbGwgdGhlIGNsaWVudHMgdGhhdCBhIGNoYW5uZWwgaXMgZ29pbmcgYXdheQotICogQGNoYW46IGNoYW5uZWwgb24gaXRzIHdheSBvdXQKKyAqIGNoYW5uZWxfdGFibGUgLSBwZXJjcHUgbG9va3VwIHRhYmxlIGZvciBtZW1vcnktdG8tbWVtb3J5IG9mZmxvYWQgcHJvdmlkZXJzCiAgKi8KLXN0YXRpYyB2b2lkIGRtYV9jbGllbnRzX25vdGlmeV9yZW1vdmVkKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKK3N0YXRpYyBzdHJ1Y3QgZG1hX2NoYW5fdGJsX2VudCAqY2hhbm5lbF90YWJsZVtETUFfVFhfVFlQRV9FTkRdOworCitzdGF0aWMgaW50IF9faW5pdCBkbWFfY2hhbm5lbF90YWJsZV9pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IGRtYV9jbGllbnQgKmNsaWVudDsKLQllbnVtIGRtYV9zdGF0ZV9jbGllbnQgYWNrOworCWVudW0gZG1hX3RyYW5zYWN0aW9uX3R5cGUgY2FwOworCWludCBlcnIgPSAwOwogCi0JbXV0ZXhfbG9jaygmZG1hX2xpc3RfbXV0ZXgpOworCWJpdG1hcF9maWxsKGRtYV9jYXBfbWFza19hbGwuYml0cywgRE1BX1RYX1RZUEVfRU5EKTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoY2xpZW50LCAmZG1hX2NsaWVudF9saXN0LCBnbG9iYWxfbm9kZSkgewotCQlhY2sgPSBjbGllbnQtPmV2ZW50X2NhbGxiYWNrKGNsaWVudCwgY2hhbiwKLQkJCQlETUFfUkVTT1VSQ0VfUkVNT1ZFRCk7CisJLyogJ2ludGVycnVwdCcsICdwcml2YXRlJywgYW5kICdzbGF2ZScgYXJlIGNoYW5uZWwgY2FwYWJpbGl0aWVzLAorCSAqIGJ1dCBhcmUgbm90IGFzc29jaWF0ZWQgd2l0aCBhbiBvcGVyYXRpb24gc28gdGhleSBkbyBub3QgbmVlZAorCSAqIGFuIGVudHJ5IGluIHRoZSBjaGFubmVsX3RhYmxlCisJICovCisJY2xlYXJfYml0KERNQV9JTlRFUlJVUFQsIGRtYV9jYXBfbWFza19hbGwuYml0cyk7CisJY2xlYXJfYml0KERNQV9QUklWQVRFLCBkbWFfY2FwX21hc2tfYWxsLmJpdHMpOworCWNsZWFyX2JpdChETUFfU0xBVkUsIGRtYV9jYXBfbWFza19hbGwuYml0cyk7CiAKLQkJLyogY2xpZW50IHdhcyBob2xkaW5nIHJlc291cmNlcyBmb3IgdGhpcyBjaGFubmVsIHNvCi0JCSAqIGZyZWUgaXQKLQkJICovCi0JCWlmIChhY2sgPT0gRE1BX0FDSykgewotCQkJZG1hX2NoYW5fcHV0KGNoYW4pOwotCQkJY2hhbi0+Y2xpZW50X2NvdW50LS07CisJZm9yX2VhY2hfZG1hX2NhcF9tYXNrKGNhcCwgZG1hX2NhcF9tYXNrX2FsbCkgeworCQljaGFubmVsX3RhYmxlW2NhcF0gPSBhbGxvY19wZXJjcHUoc3RydWN0IGRtYV9jaGFuX3RibF9lbnQpOworCQlpZiAoIWNoYW5uZWxfdGFibGVbY2FwXSkgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWJyZWFrOwogCQl9CiAJfQogCi0JbXV0ZXhfdW5sb2NrKCZkbWFfbGlzdF9tdXRleCk7CisJaWYgKGVycikgeworCQlwcl9lcnIoImRtYWVuZ2luZTogaW5pdGlhbGl6YXRpb24gZmFpbHVyZVxuIik7CisJCWZvcl9lYWNoX2RtYV9jYXBfbWFzayhjYXAsIGRtYV9jYXBfbWFza19hbGwpCisJCQlpZiAoY2hhbm5lbF90YWJsZVtjYXBdKQorCQkJCWZyZWVfcGVyY3B1KGNoYW5uZWxfdGFibGVbY2FwXSk7CisJfQorCisJcmV0dXJuIGVycjsKIH0KK2FyY2hfaW5pdGNhbGwoZG1hX2NoYW5uZWxfdGFibGVfaW5pdCk7CiAKIC8qKgotICogZG1hX2FzeW5jX2NsaWVudF9yZWdpc3RlciAtIHJlZ2lzdGVyIGEgJmRtYV9jbGllbnQKLSAqIEBjbGllbnQ6IHB0ciB0byBhIGNsaWVudCBzdHJ1Y3R1cmUgd2l0aCB2YWxpZCAnZXZlbnRfY2FsbGJhY2snIGFuZCAnY2FwX21hc2snCisgKiBkbWFfZmluZF9jaGFubmVsIC0gZmluZCBhIGNoYW5uZWwgdG8gY2Fycnkgb3V0IHRoZSBvcGVyYXRpb24KKyAqIEB0eF90eXBlOiB0cmFuc2FjdGlvbiB0eXBlCiAgKi8KLXZvaWQgZG1hX2FzeW5jX2NsaWVudF9yZWdpc3RlcihzdHJ1Y3QgZG1hX2NsaWVudCAqY2xpZW50KQorc3RydWN0IGRtYV9jaGFuICpkbWFfZmluZF9jaGFubmVsKGVudW0gZG1hX3RyYW5zYWN0aW9uX3R5cGUgdHhfdHlwZSkKIHsKLQkvKiB2YWxpZGF0ZSBjbGllbnQgZGF0YSAqLwotCUJVR19PTihkbWFfaGFzX2NhcChETUFfU0xBVkUsIGNsaWVudC0+Y2FwX21hc2spICYmCi0JCSFjbGllbnQtPnNsYXZlKTsKKwlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW47CisJaW50IGNwdTsKIAotCW11dGV4X2xvY2soJmRtYV9saXN0X211dGV4KTsKLQlsaXN0X2FkZF90YWlsKCZjbGllbnQtPmdsb2JhbF9ub2RlLCAmZG1hX2NsaWVudF9saXN0KTsKLQltdXRleF91bmxvY2soJmRtYV9saXN0X211dGV4KTsKKwlXQVJOX09OQ0UoZG1hZW5naW5lX3JlZl9jb3VudCA9PSAwLAorCQkgICJjbGllbnQgY2FsbGVkICVzIHdpdGhvdXQgYSByZWZlcmVuY2UiLCBfX2Z1bmNfXyk7CisKKwljcHUgPSBnZXRfY3B1KCk7CisJY2hhbiA9IHBlcl9jcHVfcHRyKGNoYW5uZWxfdGFibGVbdHhfdHlwZV0sIGNwdSktPmNoYW47CisJcHV0X2NwdSgpOworCisJcmV0dXJuIGNoYW47CiB9Ci1FWFBPUlRfU1lNQk9MKGRtYV9hc3luY19jbGllbnRfcmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChkbWFfZmluZF9jaGFubmVsKTsKIAogLyoqCi0gKiBkbWFfYXN5bmNfY2xpZW50X3VucmVnaXN0ZXIgLSB1bnJlZ2lzdGVyIGEgY2xpZW50IGFuZCBmcmVlIHRoZSAmZG1hX2NsaWVudAotICogQGNsaWVudDogJmRtYV9jbGllbnQgdG8gZnJlZQotICoKLSAqIEZvcmNlIGZyZWVzIGFueSBhbGxvY2F0ZWQgRE1BIGNoYW5uZWxzLCBmcmVlcyB0aGUgJmRtYV9jbGllbnQgbWVtb3J5CisgKiBkbWFfaXNzdWVfcGVuZGluZ19hbGwgLSBmbHVzaCBhbGwgcGVuZGluZyBvcGVyYXRpb25zIGFjcm9zcyBhbGwgY2hhbm5lbHMKICAqLwotdm9pZCBkbWFfYXN5bmNfY2xpZW50X3VucmVnaXN0ZXIoc3RydWN0IGRtYV9jbGllbnQgKmNsaWVudCkKK3ZvaWQgZG1hX2lzc3VlX3BlbmRpbmdfYWxsKHZvaWQpCiB7CiAJc3RydWN0IGRtYV9kZXZpY2UgKmRldmljZTsKIAlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW47Ci0JZW51bSBkbWFfc3RhdGVfY2xpZW50IGFjazsKIAotCWlmICghY2xpZW50KQotCQlyZXR1cm47CisJV0FSTl9PTkNFKGRtYWVuZ2luZV9yZWZfY291bnQgPT0gMCwKKwkJICAiY2xpZW50IGNhbGxlZCAlcyB3aXRob3V0IGEgcmVmZXJlbmNlIiwgX19mdW5jX18pOwogCi0JbXV0ZXhfbG9jaygmZG1hX2xpc3RfbXV0ZXgpOwotCS8qIGZyZWUgYWxsIGNoYW5uZWxzIHRoZSBjbGllbnQgaXMgaG9sZGluZyAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2aWNlLCAmZG1hX2RldmljZV9saXN0LCBnbG9iYWxfbm9kZSkKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGFuLCAmZGV2aWNlLT5jaGFubmVscywgZGV2aWNlX25vZGUpIHsKLQkJCWFjayA9IGNsaWVudC0+ZXZlbnRfY2FsbGJhY2soY2xpZW50LCBjaGFuLAotCQkJCURNQV9SRVNPVVJDRV9SRU1PVkVEKTsKLQotCQkJaWYgKGFjayA9PSBETUFfQUNLKSB7Ci0JCQkJZG1hX2NoYW5fcHV0KGNoYW4pOwotCQkJCWNoYW4tPmNsaWVudF9jb3VudC0tOwotCQkJfQotCQl9Ci0KLQlsaXN0X2RlbCgmY2xpZW50LT5nbG9iYWxfbm9kZSk7Ci0JbXV0ZXhfdW5sb2NrKCZkbWFfbGlzdF9tdXRleCk7CisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGRldmljZSwgJmRtYV9kZXZpY2VfbGlzdCwgZ2xvYmFsX25vZGUpIHsKKwkJaWYgKGRtYV9oYXNfY2FwKERNQV9QUklWQVRFLCBkZXZpY2UtPmNhcF9tYXNrKSkKKwkJCWNvbnRpbnVlOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoYW4sICZkZXZpY2UtPmNoYW5uZWxzLCBkZXZpY2Vfbm9kZSkKKwkJCWlmIChjaGFuLT5jbGllbnRfY291bnQpCisJCQkJZGV2aWNlLT5kZXZpY2VfaXNzdWVfcGVuZGluZyhjaGFuKTsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CiB9Ci1FWFBPUlRfU1lNQk9MKGRtYV9hc3luY19jbGllbnRfdW5yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKGRtYV9pc3N1ZV9wZW5kaW5nX2FsbCk7CiAKIC8qKgotICogZG1hX2FzeW5jX2NsaWVudF9jaGFuX3JlcXVlc3QgLSBzZW5kIGFsbCBhdmFpbGFibGUgY2hhbm5lbHMgdG8gdGhlCi0gKiBjbGllbnQgdGhhdCBzYXRpc2Z5IHRoZSBjYXBhYmlsaXR5IG1hc2sKLSAqIEBjbGllbnQgLSByZXF1ZXN0ZXIKKyAqIG50aF9jaGFuIC0gcmV0dXJucyB0aGUgbnRoIGNoYW5uZWwgb2YgdGhlIGdpdmVuIGNhcGFiaWxpdHkKKyAqIEBjYXA6IGNhcGFiaWxpdHkgdG8gbWF0Y2gKKyAqIEBuOiBudGggY2hhbm5lbCBkZXNpcmVkCisgKgorICogRGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBjaGFubmVsIHdpdGggdGhlIGRlc2lyZWQgY2FwYWJpbGl0eSBhbmQgdGhlCisgKiBsb3dlc3QgcmVmZXJlbmNlIGNvdW50IHdoZW4gJ24nIGNhbm5vdCBiZSBzYXRpc2ZpZWQuICBNdXN0IGJlIGNhbGxlZAorICogdW5kZXIgZG1hX2xpc3RfbXV0ZXguCiAgKi8KLXZvaWQgZG1hX2FzeW5jX2NsaWVudF9jaGFuX3JlcXVlc3Qoc3RydWN0IGRtYV9jbGllbnQgKmNsaWVudCkKK3N0YXRpYyBzdHJ1Y3QgZG1hX2NoYW4gKm50aF9jaGFuKGVudW0gZG1hX3RyYW5zYWN0aW9uX3R5cGUgY2FwLCBpbnQgbikKK3sKKwlzdHJ1Y3QgZG1hX2RldmljZSAqZGV2aWNlOworCXN0cnVjdCBkbWFfY2hhbiAqY2hhbjsKKwlzdHJ1Y3QgZG1hX2NoYW4gKnJldCA9IE5VTEw7CisJc3RydWN0IGRtYV9jaGFuICptaW4gPSBOVUxMOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXZpY2UsICZkbWFfZGV2aWNlX2xpc3QsIGdsb2JhbF9ub2RlKSB7CisJCWlmICghZG1hX2hhc19jYXAoY2FwLCBkZXZpY2UtPmNhcF9tYXNrKSB8fAorCQkgICAgZG1hX2hhc19jYXAoRE1BX1BSSVZBVEUsIGRldmljZS0+Y2FwX21hc2spKQorCQkJY29udGludWU7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hhbiwgJmRldmljZS0+Y2hhbm5lbHMsIGRldmljZV9ub2RlKSB7CisJCQlpZiAoIWNoYW4tPmNsaWVudF9jb3VudCkKKwkJCQljb250aW51ZTsKKwkJCWlmICghbWluKQorCQkJCW1pbiA9IGNoYW47CisJCQllbHNlIGlmIChjaGFuLT50YWJsZV9jb3VudCA8IG1pbi0+dGFibGVfY291bnQpCisJCQkJbWluID0gY2hhbjsKKworCQkJaWYgKG4tLSA9PSAwKSB7CisJCQkJcmV0ID0gY2hhbjsKKwkJCQlicmVhazsgLyogZG9uZSAqLworCQkJfQorCQl9CisJCWlmIChyZXQpCisJCQlicmVhazsgLyogZG9uZSAqLworCX0KKworCWlmICghcmV0KQorCQlyZXQgPSBtaW47CisKKwlpZiAocmV0KQorCQlyZXQtPnRhYmxlX2NvdW50Kys7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGRtYV9jaGFubmVsX3JlYmFsYW5jZSAtIHJlZGlzdHJpYnV0ZSB0aGUgYXZhaWxhYmxlIGNoYW5uZWxzCisgKgorICogT3B0aW1pemUgZm9yIGNwdSBpc29sYXRpb24gKGVhY2ggY3B1IGdldHMgYSBkZWRpY2F0ZWQgY2hhbm5lbCBmb3IgYW4KKyAqIG9wZXJhdGlvbiB0eXBlKSBpbiB0aGUgU01QIGNhc2UsICBhbmQgb3BlcmF0aW9uIGlzb2xhdGlvbiAoYXZvaWQKKyAqIG11bHRpLXRhc2tpbmcgY2hhbm5lbHMpIGluIHRoZSBub24tU01QIGNhc2UuICBNdXN0IGJlIGNhbGxlZCB1bmRlcgorICogZG1hX2xpc3RfbXV0ZXguCisgKi8KK3N0YXRpYyB2b2lkIGRtYV9jaGFubmVsX3JlYmFsYW5jZSh2b2lkKQoreworCXN0cnVjdCBkbWFfY2hhbiAqY2hhbjsKKwlzdHJ1Y3QgZG1hX2RldmljZSAqZGV2aWNlOworCWludCBjcHU7CisJaW50IGNhcDsKKwlpbnQgbjsKKworCS8qIHVuZG8gdGhlIGxhc3QgZGlzdHJpYnV0aW9uICovCisJZm9yX2VhY2hfZG1hX2NhcF9tYXNrKGNhcCwgZG1hX2NhcF9tYXNrX2FsbCkKKwkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkKKwkJCXBlcl9jcHVfcHRyKGNoYW5uZWxfdGFibGVbY2FwXSwgY3B1KS0+Y2hhbiA9IE5VTEw7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldmljZSwgJmRtYV9kZXZpY2VfbGlzdCwgZ2xvYmFsX25vZGUpIHsKKwkJaWYgKGRtYV9oYXNfY2FwKERNQV9QUklWQVRFLCBkZXZpY2UtPmNhcF9tYXNrKSkKKwkJCWNvbnRpbnVlOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoYW4sICZkZXZpY2UtPmNoYW5uZWxzLCBkZXZpY2Vfbm9kZSkKKwkJCWNoYW4tPnRhYmxlX2NvdW50ID0gMDsKKwl9CisKKwkvKiBkb24ndCBwb3B1bGF0ZSB0aGUgY2hhbm5lbF90YWJsZSBpZiBubyBjbGllbnRzIGFyZSBhdmFpbGFibGUgKi8KKwlpZiAoIWRtYWVuZ2luZV9yZWZfY291bnQpCisJCXJldHVybjsKKworCS8qIHJlZGlzdHJpYnV0ZSBhdmFpbGFibGUgY2hhbm5lbHMgKi8KKwluID0gMDsKKwlmb3JfZWFjaF9kbWFfY2FwX21hc2soY2FwLCBkbWFfY2FwX21hc2tfYWxsKQorCQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQkJaWYgKG51bV9wb3NzaWJsZV9jcHVzKCkgPiAxKQorCQkJCWNoYW4gPSBudGhfY2hhbihjYXAsIG4rKyk7CisJCQllbHNlCisJCQkJY2hhbiA9IG50aF9jaGFuKGNhcCwgLTEpOworCisJCQlwZXJfY3B1X3B0cihjaGFubmVsX3RhYmxlW2NhcF0sIGNwdSktPmNoYW4gPSBjaGFuOworCQl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1hX2NoYW4gKnByaXZhdGVfY2FuZGlkYXRlKGRtYV9jYXBfbWFza190ICptYXNrLCBzdHJ1Y3QgZG1hX2RldmljZSAqZGV2LAorCQkJCQkgIGRtYV9maWx0ZXJfZm4gZm4sIHZvaWQgKmZuX3BhcmFtKQoreworCXN0cnVjdCBkbWFfY2hhbiAqY2hhbjsKKworCWlmICghX19kbWFfZGV2aWNlX3NhdGlzZmllc19tYXNrKGRldiwgbWFzaykpIHsKKwkJcHJfZGVidWcoIiVzOiB3cm9uZyBjYXBhYmlsaXRpZXNcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8qIGRldmljZXMgd2l0aCBtdWx0aXBsZSBjaGFubmVscyBuZWVkIHNwZWNpYWwgaGFuZGxpbmcgYXMgd2UgbmVlZCB0bworCSAqIGVuc3VyZSB0aGF0IGFsbCBjaGFubmVscyBhcmUgZWl0aGVyIHByaXZhdGUgb3IgcHVibGljLgorCSAqLworCWlmIChkZXYtPmNoYW5jbnQgPiAxICYmICFkbWFfaGFzX2NhcChETUFfUFJJVkFURSwgZGV2LT5jYXBfbWFzaykpCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hhbiwgJmRldi0+Y2hhbm5lbHMsIGRldmljZV9ub2RlKSB7CisJCQkvKiBzb21lIGNoYW5uZWxzIGFyZSBhbHJlYWR5IHB1YmxpY2x5IGFsbG9jYXRlZCAqLworCQkJaWYgKGNoYW4tPmNsaWVudF9jb3VudCkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGFuLCAmZGV2LT5jaGFubmVscywgZGV2aWNlX25vZGUpIHsKKwkJaWYgKGNoYW4tPmNsaWVudF9jb3VudCkgeworCQkJcHJfZGVidWcoIiVzOiAlcyBidXN5XG4iLAorCQkJCSBfX2Z1bmNfXywgZG1hX2NoYW5fbmFtZShjaGFuKSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoZm4gJiYgIWZuKGNoYW4sIGZuX3BhcmFtKSkgeworCQkJcHJfZGVidWcoIiVzOiAlcyBmaWx0ZXIgc2FpZCBmYWxzZVxuIiwKKwkJCQkgX19mdW5jX18sIGRtYV9jaGFuX25hbWUoY2hhbikpOworCQkJY29udGludWU7CisJCX0KKwkJcmV0dXJuIGNoYW47CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogZG1hX3JlcXVlc3RfY2hhbm5lbCAtIHRyeSB0byBhbGxvY2F0ZSBhbiBleGNsdXNpdmUgY2hhbm5lbAorICogQG1hc2s6IGNhcGFiaWxpdGllcyB0aGF0IHRoZSBjaGFubmVsIG11c3Qgc2F0aXNmeQorICogQGZuOiBvcHRpb25hbCBjYWxsYmFjayB0byBkaXNwb3NpdGlvbiBhdmFpbGFibGUgY2hhbm5lbHMKKyAqIEBmbl9wYXJhbTogb3BhcXVlIHBhcmFtZXRlciB0byBwYXNzIHRvIGRtYV9maWx0ZXJfZm4KKyAqLworc3RydWN0IGRtYV9jaGFuICpfX2RtYV9yZXF1ZXN0X2NoYW5uZWwoZG1hX2NhcF9tYXNrX3QgKm1hc2ssIGRtYV9maWx0ZXJfZm4gZm4sIHZvaWQgKmZuX3BhcmFtKQoreworCXN0cnVjdCBkbWFfZGV2aWNlICpkZXZpY2UsICpfZDsKKwlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4gPSBOVUxMOworCWludCBlcnI7CisKKwkvKiBGaW5kIGEgY2hhbm5lbCAqLworCW11dGV4X2xvY2soJmRtYV9saXN0X211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGV2aWNlLCBfZCwgJmRtYV9kZXZpY2VfbGlzdCwgZ2xvYmFsX25vZGUpIHsKKwkJY2hhbiA9IHByaXZhdGVfY2FuZGlkYXRlKG1hc2ssIGRldmljZSwgZm4sIGZuX3BhcmFtKTsKKwkJaWYgKGNoYW4pIHsKKwkJCS8qIEZvdW5kIGEgc3VpdGFibGUgY2hhbm5lbCwgdHJ5IHRvIGdyYWIsIHByZXAsIGFuZAorCQkJICogcmV0dXJuIGl0LiAgV2UgZmlyc3Qgc2V0IERNQV9QUklWQVRFIHRvIGRpc2FibGUKKwkJCSAqIGJhbGFuY2VfcmVmX2NvdW50IGFzIHRoaXMgY2hhbm5lbCB3aWxsIG5vdCBiZQorCQkJICogcHVibGlzaGVkIGluIHRoZSBnZW5lcmFsLXB1cnBvc2UgYWxsb2NhdG9yCisJCQkgKi8KKwkJCWRtYV9jYXBfc2V0KERNQV9QUklWQVRFLCBkZXZpY2UtPmNhcF9tYXNrKTsKKwkJCWVyciA9IGRtYV9jaGFuX2dldChjaGFuKTsKKworCQkJaWYgKGVyciA9PSAtRU5PREVWKSB7CisJCQkJcHJfZGVidWcoIiVzOiAlcyBtb2R1bGUgcmVtb3ZlZFxuIiwgX19mdW5jX18sCisJCQkJCSBkbWFfY2hhbl9uYW1lKGNoYW4pKTsKKwkJCQlsaXN0X2RlbF9yY3UoJmRldmljZS0+Z2xvYmFsX25vZGUpOworCQkJfSBlbHNlIGlmIChlcnIpCisJCQkJcHJfZXJyKCJkbWFlbmdpbmU6IGZhaWxlZCB0byBnZXQgJXM6ICglZClcbiIsCisJCQkJICAgICAgIGRtYV9jaGFuX25hbWUoY2hhbiksIGVycik7CisJCQllbHNlCisJCQkJYnJlYWs7CisJCQljaGFuID0gTlVMTDsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJmRtYV9saXN0X211dGV4KTsKKworCXByX2RlYnVnKCIlczogJXMgKCVzKVxuIiwgX19mdW5jX18sIGNoYW4gPyAic3VjY2VzcyIgOiAiZmFpbCIsCisJCSBjaGFuID8gZG1hX2NoYW5fbmFtZShjaGFuKSA6IE5VTEwpOworCisJcmV0dXJuIGNoYW47Cit9CitFWFBPUlRfU1lNQk9MX0dQTChfX2RtYV9yZXF1ZXN0X2NoYW5uZWwpOworCit2b2lkIGRtYV9yZWxlYXNlX2NoYW5uZWwoc3RydWN0IGRtYV9jaGFuICpjaGFuKQogewogCW11dGV4X2xvY2soJmRtYV9saXN0X211dGV4KTsKLQlkbWFfY2xpZW50X2NoYW5fYWxsb2MoY2xpZW50KTsKKwlXQVJOX09OQ0UoY2hhbi0+Y2xpZW50X2NvdW50ICE9IDEsCisJCSAgImNoYW4gcmVmZXJlbmNlIGNvdW50ICVkICE9IDFcbiIsIGNoYW4tPmNsaWVudF9jb3VudCk7CisJZG1hX2NoYW5fcHV0KGNoYW4pOwogCW11dGV4X3VubG9jaygmZG1hX2xpc3RfbXV0ZXgpOwogfQotRVhQT1JUX1NZTUJPTChkbWFfYXN5bmNfY2xpZW50X2NoYW5fcmVxdWVzdCk7CitFWFBPUlRfU1lNQk9MX0dQTChkbWFfcmVsZWFzZV9jaGFubmVsKTsKKworLyoqCisgKiBkbWFlbmdpbmVfZ2V0IC0gcmVnaXN0ZXIgaW50ZXJlc3QgaW4gZG1hX2NoYW5uZWxzCisgKi8KK3ZvaWQgZG1hZW5naW5lX2dldCh2b2lkKQoreworCXN0cnVjdCBkbWFfZGV2aWNlICpkZXZpY2UsICpfZDsKKwlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW47CisJaW50IGVycjsKKworCW11dGV4X2xvY2soJmRtYV9saXN0X211dGV4KTsKKwlkbWFlbmdpbmVfcmVmX2NvdW50Kys7CisKKwkvKiB0cnkgdG8gZ3JhYiBjaGFubmVscyAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXZpY2UsIF9kLCAmZG1hX2RldmljZV9saXN0LCBnbG9iYWxfbm9kZSkgeworCQlpZiAoZG1hX2hhc19jYXAoRE1BX1BSSVZBVEUsIGRldmljZS0+Y2FwX21hc2spKQorCQkJY29udGludWU7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hhbiwgJmRldmljZS0+Y2hhbm5lbHMsIGRldmljZV9ub2RlKSB7CisJCQllcnIgPSBkbWFfY2hhbl9nZXQoY2hhbik7CisJCQlpZiAoZXJyID09IC1FTk9ERVYpIHsKKwkJCQkvKiBtb2R1bGUgcmVtb3ZlZCBiZWZvcmUgd2UgY291bGQgdXNlIGl0ICovCisJCQkJbGlzdF9kZWxfcmN1KCZkZXZpY2UtPmdsb2JhbF9ub2RlKTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAoZXJyKQorCQkJCXByX2VycigiZG1hZW5naW5lOiBmYWlsZWQgdG8gZ2V0ICVzOiAoJWQpXG4iLAorCQkJCSAgICAgICBkbWFfY2hhbl9uYW1lKGNoYW4pLCBlcnIpOworCQl9CisJfQorCisJLyogaWYgdGhpcyBpcyB0aGUgZmlyc3QgcmVmZXJlbmNlIGFuZCB0aGVyZSB3ZXJlIGNoYW5uZWxzCisJICogd2FpdGluZyB3ZSBuZWVkIHRvIHJlYmFsYW5jZSB0byBnZXQgdGhvc2UgY2hhbm5lbHMKKwkgKiBpbmNvcnBvcmF0ZWQgaW50byB0aGUgY2hhbm5lbCB0YWJsZQorCSAqLworCWlmIChkbWFlbmdpbmVfcmVmX2NvdW50ID09IDEpCisJCWRtYV9jaGFubmVsX3JlYmFsYW5jZSgpOworCW11dGV4X3VubG9jaygmZG1hX2xpc3RfbXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTChkbWFlbmdpbmVfZ2V0KTsKKworLyoqCisgKiBkbWFlbmdpbmVfcHV0IC0gbGV0IGRtYSBkcml2ZXJzIGJlIHJlbW92ZWQgd2hlbiByZWZfY291bnQgPT0gMAorICovCit2b2lkIGRtYWVuZ2luZV9wdXQodm9pZCkKK3sKKwlzdHJ1Y3QgZG1hX2RldmljZSAqZGV2aWNlOworCXN0cnVjdCBkbWFfY2hhbiAqY2hhbjsKKworCW11dGV4X2xvY2soJmRtYV9saXN0X211dGV4KTsKKwlkbWFlbmdpbmVfcmVmX2NvdW50LS07CisJQlVHX09OKGRtYWVuZ2luZV9yZWZfY291bnQgPCAwKTsKKwkvKiBkcm9wIGNoYW5uZWwgcmVmZXJlbmNlcyAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2aWNlLCAmZG1hX2RldmljZV9saXN0LCBnbG9iYWxfbm9kZSkgeworCQlpZiAoZG1hX2hhc19jYXAoRE1BX1BSSVZBVEUsIGRldmljZS0+Y2FwX21hc2spKQorCQkJY29udGludWU7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hhbiwgJmRldmljZS0+Y2hhbm5lbHMsIGRldmljZV9ub2RlKQorCQkJZG1hX2NoYW5fcHV0KGNoYW4pOworCX0KKwltdXRleF91bmxvY2soJmRtYV9saXN0X211dGV4KTsKK30KK0VYUE9SVF9TWU1CT0woZG1hZW5naW5lX3B1dCk7CiAKIC8qKgogICogZG1hX2FzeW5jX2RldmljZV9yZWdpc3RlciAtIHJlZ2lzdGVycyBETUEgZGV2aWNlcyBmb3VuZApAQCAtMzU3LDkgKzYxMiw5IEBACiAgKi8KIGludCBkbWFfYXN5bmNfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBkbWFfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RhdGljIGludCBpZDsKIAlpbnQgY2hhbmNudCA9IDAsIHJjOwogCXN0cnVjdCBkbWFfY2hhbiogY2hhbjsKKwlhdG9taWNfdCAqaWRyX3JlZjsKIAogCWlmICghZGV2aWNlKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTM4Niw1NyArNjQxLDgzIEBACiAJQlVHX09OKCFkZXZpY2UtPmRldmljZV9pc3N1ZV9wZW5kaW5nKTsKIAlCVUdfT04oIWRldmljZS0+ZGV2KTsKIAotCWluaXRfY29tcGxldGlvbigmZGV2aWNlLT5kb25lKTsKLQlrcmVmX2luaXQoJmRldmljZS0+cmVmY291bnQpOwotCisJaWRyX3JlZiA9IGttYWxsb2Moc2l6ZW9mKCppZHJfcmVmKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpZHJfcmVmKQorCQlyZXR1cm4gLUVOT01FTTsKKwlhdG9taWNfc2V0KGlkcl9yZWYsIDApOworIGlkcl9yZXRyeToKKwlpZiAoIWlkcl9wcmVfZ2V0KCZkbWFfaWRyLCBHRlBfS0VSTkVMKSkKKwkJcmV0dXJuIC1FTk9NRU07CiAJbXV0ZXhfbG9jaygmZG1hX2xpc3RfbXV0ZXgpOwotCWRldmljZS0+ZGV2X2lkID0gaWQrKzsKKwlyYyA9IGlkcl9nZXRfbmV3KCZkbWFfaWRyLCBOVUxMLCAmZGV2aWNlLT5kZXZfaWQpOwogCW11dGV4X3VubG9jaygmZG1hX2xpc3RfbXV0ZXgpOworCWlmIChyYyA9PSAtRUFHQUlOKQorCQlnb3RvIGlkcl9yZXRyeTsKKwllbHNlIGlmIChyYyAhPSAwKQorCQlyZXR1cm4gcmM7CiAKIAkvKiByZXByZXNlbnQgY2hhbm5lbHMgaW4gc3lzZnMuIFByb2JhYmx5IHdhbnQgZGV2cyB0b28gKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoYW4sICZkZXZpY2UtPmNoYW5uZWxzLCBkZXZpY2Vfbm9kZSkgewogCQljaGFuLT5sb2NhbCA9IGFsbG9jX3BlcmNwdSh0eXBlb2YoKmNoYW4tPmxvY2FsKSk7CiAJCWlmIChjaGFuLT5sb2NhbCA9PSBOVUxMKQogCQkJY29udGludWU7CisJCWNoYW4tPmRldiA9IGt6YWxsb2Moc2l6ZW9mKCpjaGFuLT5kZXYpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGNoYW4tPmRldiA9PSBOVUxMKSB7CisJCQlmcmVlX3BlcmNwdShjaGFuLT5sb2NhbCk7CisJCQljb250aW51ZTsKKwkJfQogCiAJCWNoYW4tPmNoYW5faWQgPSBjaGFuY250Kys7Ci0JCWNoYW4tPmRldi5jbGFzcyA9ICZkbWFfZGV2Y2xhc3M7Ci0JCWNoYW4tPmRldi5wYXJlbnQgPSBkZXZpY2UtPmRldjsKLQkJZGV2X3NldF9uYW1lKCZjaGFuLT5kZXYsICJkbWElZGNoYW4lZCIsCisJCWNoYW4tPmRldi0+ZGV2aWNlLmNsYXNzID0gJmRtYV9kZXZjbGFzczsKKwkJY2hhbi0+ZGV2LT5kZXZpY2UucGFyZW50ID0gZGV2aWNlLT5kZXY7CisJCWNoYW4tPmRldi0+Y2hhbiA9IGNoYW47CisJCWNoYW4tPmRldi0+aWRyX3JlZiA9IGlkcl9yZWY7CisJCWNoYW4tPmRldi0+ZGV2X2lkID0gZGV2aWNlLT5kZXZfaWQ7CisJCWF0b21pY19pbmMoaWRyX3JlZik7CisJCWRldl9zZXRfbmFtZSgmY2hhbi0+ZGV2LT5kZXZpY2UsICJkbWElZGNoYW4lZCIsCiAJCQkgICAgIGRldmljZS0+ZGV2X2lkLCBjaGFuLT5jaGFuX2lkKTsKIAotCQlyYyA9IGRldmljZV9yZWdpc3RlcigmY2hhbi0+ZGV2KTsKKwkJcmMgPSBkZXZpY2VfcmVnaXN0ZXIoJmNoYW4tPmRldi0+ZGV2aWNlKTsKIAkJaWYgKHJjKSB7Ci0JCQljaGFuY250LS07CiAJCQlmcmVlX3BlcmNwdShjaGFuLT5sb2NhbCk7CiAJCQljaGFuLT5sb2NhbCA9IE5VTEw7CiAJCQlnb3RvIGVycl9vdXQ7CiAJCX0KLQotCQkvKiBPbmUgZm9yIHRoZSBjaGFubmVsLCBvbmUgb2YgdGhlIGNsYXNzIGRldmljZSAqLwotCQlrcmVmX2dldCgmZGV2aWNlLT5yZWZjb3VudCk7Ci0JCWtyZWZfZ2V0KCZkZXZpY2UtPnJlZmNvdW50KTsKLQkJa3JlZl9pbml0KCZjaGFuLT5yZWZjb3VudCk7CiAJCWNoYW4tPmNsaWVudF9jb3VudCA9IDA7Ci0JCWNoYW4tPnNsb3dfcmVmID0gMDsKLQkJSU5JVF9SQ1VfSEVBRCgmY2hhbi0+cmN1KTsKIAl9CisJZGV2aWNlLT5jaGFuY250ID0gY2hhbmNudDsKIAogCW11dGV4X2xvY2soJmRtYV9saXN0X211dGV4KTsKLQlsaXN0X2FkZF90YWlsKCZkZXZpY2UtPmdsb2JhbF9ub2RlLCAmZG1hX2RldmljZV9saXN0KTsKKwkvKiB0YWtlIHJlZmVyZW5jZXMgb24gcHVibGljIGNoYW5uZWxzICovCisJaWYgKGRtYWVuZ2luZV9yZWZfY291bnQgJiYgIWRtYV9oYXNfY2FwKERNQV9QUklWQVRFLCBkZXZpY2UtPmNhcF9tYXNrKSkKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGFuLCAmZGV2aWNlLT5jaGFubmVscywgZGV2aWNlX25vZGUpIHsKKwkJCS8qIGlmIGNsaWVudHMgYXJlIGFscmVhZHkgd2FpdGluZyBmb3IgY2hhbm5lbHMgd2UgbmVlZAorCQkJICogdG8gdGFrZSByZWZlcmVuY2VzIG9uIHRoZWlyIGJlaGFsZgorCQkJICovCisJCQlpZiAoZG1hX2NoYW5fZ2V0KGNoYW4pID09IC1FTk9ERVYpIHsKKwkJCQkvKiBub3RlIHdlIGNhbiBvbmx5IGdldCBoZXJlIGZvciB0aGUgZmlyc3QKKwkJCQkgKiBjaGFubmVsIGFzIHRoZSByZW1haW5pbmcgY2hhbm5lbHMgYXJlCisJCQkJICogZ3VhcmFudGVlZCB0byBnZXQgYSByZWZlcmVuY2UKKwkJCQkgKi8KKwkJCQlyYyA9IC1FTk9ERVY7CisJCQkJbXV0ZXhfdW5sb2NrKCZkbWFfbGlzdF9tdXRleCk7CisJCQkJZ290byBlcnJfb3V0OworCQkJfQorCQl9CisJbGlzdF9hZGRfdGFpbF9yY3UoJmRldmljZS0+Z2xvYmFsX25vZGUsICZkbWFfZGV2aWNlX2xpc3QpOworCWRtYV9jaGFubmVsX3JlYmFsYW5jZSgpOwogCW11dGV4X3VubG9jaygmZG1hX2xpc3RfbXV0ZXgpOwogCi0JZG1hX2NsaWVudHNfbm90aWZ5X2F2YWlsYWJsZSgpOwotCiAJcmV0dXJuIDA7CiAKIGVycl9vdXQ6CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGFuLCAmZGV2aWNlLT5jaGFubmVscywgZGV2aWNlX25vZGUpIHsKIAkJaWYgKGNoYW4tPmxvY2FsID09IE5VTEwpCiAJCQljb250aW51ZTsKLQkJa3JlZl9wdXQoJmRldmljZS0+cmVmY291bnQsIGRtYV9hc3luY19kZXZpY2VfY2xlYW51cCk7Ci0JCWRldmljZV91bnJlZ2lzdGVyKCZjaGFuLT5kZXYpOwotCQljaGFuY250LS07CisJCW11dGV4X2xvY2soJmRtYV9saXN0X211dGV4KTsKKwkJY2hhbi0+ZGV2LT5jaGFuID0gTlVMTDsKKwkJbXV0ZXhfdW5sb2NrKCZkbWFfbGlzdF9tdXRleCk7CisJCWRldmljZV91bnJlZ2lzdGVyKCZjaGFuLT5kZXYtPmRldmljZSk7CiAJCWZyZWVfcGVyY3B1KGNoYW4tPmxvY2FsKTsKIAl9CiAJcmV0dXJuIHJjOwpAQCAtNDQ0LDM3ICs3MjUsMzAgQEAKIEVYUE9SVF9TWU1CT0woZG1hX2FzeW5jX2RldmljZV9yZWdpc3Rlcik7CiAKIC8qKgotICogZG1hX2FzeW5jX2RldmljZV9jbGVhbnVwIC0gZnVuY3Rpb24gY2FsbGVkIHdoZW4gYWxsIHJlZmVyZW5jZXMgYXJlIHJlbGVhc2VkCi0gKiBAa3JlZjoga2VybmVsIHJlZmVyZW5jZSBvYmplY3QKLSAqLwotc3RhdGljIHZvaWQgZG1hX2FzeW5jX2RldmljZV9jbGVhbnVwKHN0cnVjdCBrcmVmICprcmVmKQotewotCXN0cnVjdCBkbWFfZGV2aWNlICpkZXZpY2U7Ci0KLQlkZXZpY2UgPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGRtYV9kZXZpY2UsIHJlZmNvdW50KTsKLQljb21wbGV0ZSgmZGV2aWNlLT5kb25lKTsKLX0KLQotLyoqCi0gKiBkbWFfYXN5bmNfZGV2aWNlX3VucmVnaXN0ZXIgLSB1bnJlZ2lzdGVycyBETUEgZGV2aWNlcworICogZG1hX2FzeW5jX2RldmljZV91bnJlZ2lzdGVyIC0gdW5yZWdpc3RlciBhIERNQSBkZXZpY2UKICAqIEBkZXZpY2U6ICZkbWFfZGV2aWNlCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSBkbWEgZHJpdmVyIGV4aXQgcm91dGluZXMsIGRtYWVuZ2luZSBob2xkcyBtb2R1bGUKKyAqIHJlZmVyZW5jZXMgdG8gcHJldmVudCBpdCBiZWluZyBjYWxsZWQgd2hpbGUgY2hhbm5lbHMgYXJlIGluIHVzZS4KICAqLwogdm9pZCBkbWFfYXN5bmNfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IGRtYV9kZXZpY2UgKmRldmljZSkKIHsKIAlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW47CiAKIAltdXRleF9sb2NrKCZkbWFfbGlzdF9tdXRleCk7Ci0JbGlzdF9kZWwoJmRldmljZS0+Z2xvYmFsX25vZGUpOworCWxpc3RfZGVsX3JjdSgmZGV2aWNlLT5nbG9iYWxfbm9kZSk7CisJZG1hX2NoYW5uZWxfcmViYWxhbmNlKCk7CiAJbXV0ZXhfdW5sb2NrKCZkbWFfbGlzdF9tdXRleCk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoYW4sICZkZXZpY2UtPmNoYW5uZWxzLCBkZXZpY2Vfbm9kZSkgewotCQlkbWFfY2xpZW50c19ub3RpZnlfcmVtb3ZlZChjaGFuKTsKLQkJZGV2aWNlX3VucmVnaXN0ZXIoJmNoYW4tPmRldik7Ci0JCWRtYV9jaGFuX3JlbGVhc2UoY2hhbik7CisJCVdBUk5fT05DRShjaGFuLT5jbGllbnRfY291bnQsCisJCQkgICIlcyBjYWxsZWQgd2hpbGUgJWQgY2xpZW50cyBob2xkIGEgcmVmZXJlbmNlXG4iLAorCQkJICBfX2Z1bmNfXywgY2hhbi0+Y2xpZW50X2NvdW50KTsKKwkJbXV0ZXhfbG9jaygmZG1hX2xpc3RfbXV0ZXgpOworCQljaGFuLT5kZXYtPmNoYW4gPSBOVUxMOworCQltdXRleF91bmxvY2soJmRtYV9saXN0X211dGV4KTsKKwkJZGV2aWNlX3VucmVnaXN0ZXIoJmNoYW4tPmRldi0+ZGV2aWNlKTsKIAl9Ci0KLQlrcmVmX3B1dCgmZGV2aWNlLT5yZWZjb3VudCwgZG1hX2FzeW5jX2RldmljZV9jbGVhbnVwKTsKLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZkZXZpY2UtPmRvbmUpOwogfQogRVhQT1JUX1NZTUJPTChkbWFfYXN5bmNfZGV2aWNlX3VucmVnaXN0ZXIpOwogCkBAIC02MjYsMTAgKzkwMCw5NiBAQAogfQogRVhQT1JUX1NZTUJPTChkbWFfYXN5bmNfdHhfZGVzY3JpcHRvcl9pbml0KTsKIAorLyogZG1hX3dhaXRfZm9yX2FzeW5jX3R4IC0gc3BpbiB3YWl0IGZvciBhIHRyYW5zYWN0aW9uIHRvIGNvbXBsZXRlCisgKiBAdHg6IGluLWZsaWdodCB0cmFuc2FjdGlvbiB0byB3YWl0IG9uCisgKgorICogVGhpcyByb3V0aW5lIGFzc3VtZXMgdGhhdCB0eCB3YXMgb2J0YWluZWQgZnJvbSBhIGNhbGwgdG8gYXN5bmNfbWVtY3B5LAorICogYXN5bmNfeG9yLCBhc3luY19tZW1zZXQsIGV0YyB3aGljaCBlbnN1cmVzIHRoYXQgdHggaXMgImluLWZsaWdodCIgKHByZXBwZWQKKyAqIGFuZCBzdWJtaXR0ZWQpLiAgV2Fsa2luZyB0aGUgcGFyZW50IGNoYWluIGlzIG9ubHkgbWVhbnQgdG8gY292ZXIgZm9yIERNQQorICogZHJpdmVycyB0aGF0IGRvIG5vdCBpbXBsZW1lbnQgdGhlIERNQV9JTlRFUlJVUFQgY2FwYWJpbGl0eSBhbmQgbWF5IHJhY2Ugd2l0aAorICogdGhlIGRyaXZlcidzIGRlc2NyaXB0b3IgY2xlYW51cCByb3V0aW5lLgorICovCitlbnVtIGRtYV9zdGF0dXMKK2RtYV93YWl0X2Zvcl9hc3luY190eChzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4KQoreworCWVudW0gZG1hX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICppdGVyOworCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqcGFyZW50OworCisJaWYgKCF0eCkKKwkJcmV0dXJuIERNQV9TVUNDRVNTOworCisJV0FSTl9PTkNFKHR4LT5wYXJlbnQsICIlczogc3BlY3VsYXRpdmVseSB3YWxraW5nIGRlcGVuZGVuY3kgY2hhaW4gZm9yIgorCQkgICIgJXNcbiIsIF9fZnVuY19fLCBkbWFfY2hhbl9uYW1lKHR4LT5jaGFuKSk7CisKKwkvKiBwb2xsIHRocm91Z2ggdGhlIGRlcGVuZGVuY3kgY2hhaW4sIHJldHVybiB3aGVuIHR4IGlzIGNvbXBsZXRlICovCisJZG8geworCQlpdGVyID0gdHg7CisKKwkJLyogZmluZCB0aGUgcm9vdCBvZiB0aGUgdW5zdWJtaXR0ZWQgZGVwZW5kZW5jeSBjaGFpbiAqLworCQlkbyB7CisJCQlwYXJlbnQgPSBpdGVyLT5wYXJlbnQ7CisJCQlpZiAoIXBhcmVudCkKKwkJCQlicmVhazsKKwkJCWVsc2UKKwkJCQlpdGVyID0gcGFyZW50OworCQl9IHdoaWxlIChwYXJlbnQpOworCisJCS8qIHRoZXJlIGlzIGEgc21hbGwgd2luZG93IGZvciAtPnBhcmVudCA9PSBOVUxMIGFuZAorCQkgKiAtPmNvb2tpZSA9PSAtRUJVU1kKKwkJICovCisJCXdoaWxlIChpdGVyLT5jb29raWUgPT0gLUVCVVNZKQorCQkJY3B1X3JlbGF4KCk7CisKKwkJc3RhdHVzID0gZG1hX3N5bmNfd2FpdChpdGVyLT5jaGFuLCBpdGVyLT5jb29raWUpOworCX0gd2hpbGUgKHN0YXR1cyA9PSBETUFfSU5fUFJPR1JFU1MgfHwgKGl0ZXIgIT0gdHgpKTsKKworCXJldHVybiBzdGF0dXM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkbWFfd2FpdF9mb3JfYXN5bmNfdHgpOworCisvKiBkbWFfcnVuX2RlcGVuZGVuY2llcyAtIGhlbHBlciByb3V0aW5lIGZvciBkbWEgZHJpdmVycyB0byBwcm9jZXNzCisgKgkoc3RhcnQpIGRlcGVuZGVudCBvcGVyYXRpb25zIG9uIHRoZWlyIHRhcmdldCBjaGFubmVsCisgKiBAdHg6IHRyYW5zYWN0aW9uIHdpdGggZGVwZW5kZW5jaWVzCisgKi8KK3ZvaWQgZG1hX3J1bl9kZXBlbmRlbmNpZXMoc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eCkKK3sKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlcCA9IHR4LT5uZXh0OworCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqZGVwX25leHQ7CisJc3RydWN0IGRtYV9jaGFuICpjaGFuOworCisJaWYgKCFkZXApCisJCXJldHVybjsKKworCWNoYW4gPSBkZXAtPmNoYW47CisKKwkvKiBrZWVwIHN1Ym1pdHRpbmcgdXAgdW50aWwgYSBjaGFubmVsIHN3aXRjaCBpcyBkZXRlY3RlZAorCSAqIGluIHRoYXQgY2FzZSB3ZSB3aWxsIGJlIGNhbGxlZCBhZ2FpbiBhcyBhIHJlc3VsdCBvZgorCSAqIHByb2Nlc3NpbmcgdGhlIGludGVycnVwdCBmcm9tIGFzeW5jX3R4X2NoYW5uZWxfc3dpdGNoCisJICovCisJZm9yICg7IGRlcDsgZGVwID0gZGVwX25leHQpIHsKKwkJc3Bpbl9sb2NrX2JoKCZkZXAtPmxvY2spOworCQlkZXAtPnBhcmVudCA9IE5VTEw7CisJCWRlcF9uZXh0ID0gZGVwLT5uZXh0OworCQlpZiAoZGVwX25leHQgJiYgZGVwX25leHQtPmNoYW4gPT0gY2hhbikKKwkJCWRlcC0+bmV4dCA9IE5VTEw7IC8qIC0+bmV4dCB3aWxsIGJlIHN1Ym1pdHRlZCAqLworCQllbHNlCisJCQlkZXBfbmV4dCA9IE5VTEw7IC8qIHN1Ym1pdCBjdXJyZW50IGRlcCBhbmQgdGVybWluYXRlICovCisJCXNwaW5fdW5sb2NrX2JoKCZkZXAtPmxvY2spOworCisJCWRlcC0+dHhfc3VibWl0KGRlcCk7CisJfQorCisJY2hhbi0+ZGV2aWNlLT5kZXZpY2VfaXNzdWVfcGVuZGluZyhjaGFuKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRtYV9ydW5fZGVwZW5kZW5jaWVzKTsKKwogc3RhdGljIGludCBfX2luaXQgZG1hX2J1c19pbml0KHZvaWQpCiB7CisJaWRyX2luaXQoJmRtYV9pZHIpOwogCW11dGV4X2luaXQoJmRtYV9saXN0X211dGV4KTsKIAlyZXR1cm4gY2xhc3NfcmVnaXN0ZXIoJmRtYV9kZXZjbGFzcyk7CiB9Ci1zdWJzeXNfaW5pdGNhbGwoZG1hX2J1c19pbml0KTsKK2FyY2hfaW5pdGNhbGwoZG1hX2J1c19pbml0KTsKKwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9kbWF0ZXN0LmMgYi9kcml2ZXJzL2RtYS9kbWF0ZXN0LmMKaW5kZXggZWQ5NjM2Yi4uMzYwM2YxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvZG1hdGVzdC5jCisrKyBiL2RyaXZlcnMvZG1hL2RtYXRlc3QuYwpAQCAtMzUsNyArMzUsNyBAQAogCiBzdGF0aWMgdW5zaWduZWQgaW50IG1heF9jaGFubmVsczsKIG1vZHVsZV9wYXJhbShtYXhfY2hhbm5lbHMsIHVpbnQsIFNfSVJVR08pOwotTU9EVUxFX1BBUk1fREVTQyhucl9jaGFubmVscywKK01PRFVMRV9QQVJNX0RFU0MobWF4X2NoYW5uZWxzLAogCQkiTWF4aW11bSBudW1iZXIgb2YgY2hhbm5lbHMgdG8gdXNlIChkZWZhdWx0OiBhbGwpIik7CiAKIC8qCkBAIC03MSw3ICs3MSw3IEBACiAKIC8qCiAgKiBUaGVzZSBhcmUgcHJvdGVjdGVkIGJ5IGRtYV9saXN0X211dGV4IHNpbmNlIHRoZXkncmUgb25seSB1c2VkIGJ5Ci0gKiB0aGUgRE1BIGNsaWVudCBldmVudCBjYWxsYmFjaworICogdGhlIERNQSBmaWx0ZXIgZnVuY3Rpb24gY2FsbGJhY2sKICAqLwogc3RhdGljIExJU1RfSEVBRChkbWF0ZXN0X2NoYW5uZWxzKTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbnJfY2hhbm5lbHM7CkBAIC04MCw3ICs4MCw3IEBACiB7CiAJaWYgKHRlc3RfY2hhbm5lbFswXSA9PSAnXDAnKQogCQlyZXR1cm4gdHJ1ZTsKLQlyZXR1cm4gc3RyY21wKGRldl9uYW1lKCZjaGFuLT5kZXYpLCB0ZXN0X2NoYW5uZWwpID09IDA7CisJcmV0dXJuIHN0cmNtcChkbWFfY2hhbl9uYW1lKGNoYW4pLCB0ZXN0X2NoYW5uZWwpID09IDA7CiB9CiAKIHN0YXRpYyBib29sIGRtYXRlc3RfbWF0Y2hfZGV2aWNlKHN0cnVjdCBkbWFfZGV2aWNlICpkZXZpY2UpCkBAIC0yMTUsNyArMjE1LDYgQEAKIAogCXNtcF9ybWIoKTsKIAljaGFuID0gdGhyZWFkLT5jaGFuOwotCWRtYV9jaGFuX2dldChjaGFuKTsKIAogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CiAJCXRvdGFsX3Rlc3RzKys7CkBAIC0yOTMsNyArMjkyLDYgQEAKIAl9CiAKIAlyZXQgPSAwOwotCWRtYV9jaGFuX3B1dChjaGFuKTsKIAlrZnJlZSh0aHJlYWQtPmRzdGJ1Zik7CiBlcnJfZHN0YnVmOgogCWtmcmVlKHRocmVhZC0+c3JjYnVmKTsKQEAgLTMxOSwyMSArMzE3LDE2IEBACiAJa2ZyZWUoZHRjKTsKIH0KIAotc3RhdGljIGVudW0gZG1hX3N0YXRlX2NsaWVudCBkbWF0ZXN0X2FkZF9jaGFubmVsKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKK3N0YXRpYyBpbnQgZG1hdGVzdF9hZGRfY2hhbm5lbChzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCiB7CiAJc3RydWN0IGRtYXRlc3RfY2hhbgkqZHRjOwogCXN0cnVjdCBkbWF0ZXN0X3RocmVhZAkqdGhyZWFkOwogCXVuc2lnbmVkIGludAkJaTsKIAotCS8qIEhhdmUgd2UgYWxyZWFkeSBiZWVuIHRvbGQgYWJvdXQgdGhpcyBjaGFubmVsPyAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZHRjLCAmZG1hdGVzdF9jaGFubmVscywgbm9kZSkKLQkJaWYgKGR0Yy0+Y2hhbiA9PSBjaGFuKQotCQkJcmV0dXJuIERNQV9EVVA7Ci0KIAlkdGMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZG1hdGVzdF9jaGFuKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkdGMpIHsKLQkJcHJfd2FybmluZygiZG1hdGVzdDogTm8gbWVtb3J5IGZvciAlc1xuIiwgZGV2X25hbWUoJmNoYW4tPmRldikpOwotCQlyZXR1cm4gRE1BX05BSzsKKwkJcHJfd2FybmluZygiZG1hdGVzdDogTm8gbWVtb3J5IGZvciAlc1xuIiwgZG1hX2NoYW5fbmFtZShjaGFuKSk7CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCWR0Yy0+Y2hhbiA9IGNoYW47CkBAIC0zNDMsMTYgKzMzNiwxNiBAQAogCQl0aHJlYWQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZG1hdGVzdF90aHJlYWQpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF0aHJlYWQpIHsKIAkJCXByX3dhcm5pbmcoImRtYXRlc3Q6IE5vIG1lbW9yeSBmb3IgJXMtdGVzdCV1XG4iLAotCQkJCSAgIGRldl9uYW1lKCZjaGFuLT5kZXYpLCBpKTsKKwkJCQkgICBkbWFfY2hhbl9uYW1lKGNoYW4pLCBpKTsKIAkJCWJyZWFrOwogCQl9CiAJCXRocmVhZC0+Y2hhbiA9IGR0Yy0+Y2hhbjsKIAkJc21wX3dtYigpOwogCQl0aHJlYWQtPnRhc2sgPSBrdGhyZWFkX3J1bihkbWF0ZXN0X2Z1bmMsIHRocmVhZCwgIiVzLXRlc3QldSIsCi0JCQkJZGV2X25hbWUoJmNoYW4tPmRldiksIGkpOworCQkJCWRtYV9jaGFuX25hbWUoY2hhbiksIGkpOwogCQlpZiAoSVNfRVJSKHRocmVhZC0+dGFzaykpIHsKIAkJCXByX3dhcm5pbmcoImRtYXRlc3Q6IEZhaWxlZCB0byBydW4gdGhyZWFkICVzLXRlc3QldVxuIiwKLQkJCQkJZGV2X25hbWUoJmNoYW4tPmRldiksIGkpOworCQkJCQlkbWFfY2hhbl9uYW1lKGNoYW4pLCBpKTsKIAkJCWtmcmVlKHRocmVhZCk7CiAJCQlicmVhazsKIAkJfQpAQCAtMzYyLDg2ICszNTUsNjIgQEAKIAkJbGlzdF9hZGRfdGFpbCgmdGhyZWFkLT5ub2RlLCAmZHRjLT50aHJlYWRzKTsKIAl9CiAKLQlwcl9pbmZvKCJkbWF0ZXN0OiBTdGFydGVkICV1IHRocmVhZHMgdXNpbmcgJXNcbiIsIGksIGRldl9uYW1lKCZjaGFuLT5kZXYpKTsKKwlwcl9pbmZvKCJkbWF0ZXN0OiBTdGFydGVkICV1IHRocmVhZHMgdXNpbmcgJXNcbiIsIGksIGRtYV9jaGFuX25hbWUoY2hhbikpOwogCiAJbGlzdF9hZGRfdGFpbCgmZHRjLT5ub2RlLCAmZG1hdGVzdF9jaGFubmVscyk7CiAJbnJfY2hhbm5lbHMrKzsKIAotCXJldHVybiBETUFfQUNLOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgZW51bSBkbWFfc3RhdGVfY2xpZW50IGRtYXRlc3RfcmVtb3ZlX2NoYW5uZWwoc3RydWN0IGRtYV9jaGFuICpjaGFuKQorc3RhdGljIGJvb2wgZmlsdGVyKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgdm9pZCAqcGFyYW0pCiB7Ci0Jc3RydWN0IGRtYXRlc3RfY2hhbgkqZHRjLCAqX2R0YzsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkdGMsIF9kdGMsICZkbWF0ZXN0X2NoYW5uZWxzLCBub2RlKSB7Ci0JCWlmIChkdGMtPmNoYW4gPT0gY2hhbikgewotCQkJbGlzdF9kZWwoJmR0Yy0+bm9kZSk7Ci0JCQlkbWF0ZXN0X2NsZWFudXBfY2hhbm5lbChkdGMpOwotCQkJcHJfZGVidWcoImRtYXRlc3Q6IGxvc3QgY2hhbm5lbCAlc1xuIiwKLQkJCQkJZGV2X25hbWUoJmNoYW4tPmRldikpOwotCQkJcmV0dXJuIERNQV9BQ0s7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gRE1BX0RVUDsKKwlpZiAoIWRtYXRlc3RfbWF0Y2hfY2hhbm5lbChjaGFuKSB8fCAhZG1hdGVzdF9tYXRjaF9kZXZpY2UoY2hhbi0+ZGV2aWNlKSkKKwkJcmV0dXJuIGZhbHNlOworCWVsc2UKKwkJcmV0dXJuIHRydWU7CiB9CiAKLS8qCi0gKiBTdGFydCB0ZXN0aW5nIHRocmVhZHMgYXMgbmV3IGNoYW5uZWxzIGFyZSBhc3NpZ25lZCB0byB1cywgYW5kIGtpbGwKLSAqIHRoZW0gd2hlbiB0aGUgY2hhbm5lbHMgZ28gYXdheS4KLSAqCi0gKiBXaGVuIHdlIHVucmVnaXN0ZXIgdGhlIGNsaWVudCwgYWxsIGNoYW5uZWxzIGFyZSByZW1vdmVkIHNvIHRoaXMKLSAqIHdpbGwgYWxzbyB0YWtlIGNhcmUgb2YgY2xlYW5pbmcgdGhpbmdzIHVwIHdoZW4gdGhlIG1vZHVsZSBpcwotICogdW5sb2FkZWQuCi0gKi8KLXN0YXRpYyBlbnVtIGRtYV9zdGF0ZV9jbGllbnQKLWRtYXRlc3RfZXZlbnQoc3RydWN0IGRtYV9jbGllbnQgKmNsaWVudCwgc3RydWN0IGRtYV9jaGFuICpjaGFuLAotCQllbnVtIGRtYV9zdGF0ZSBzdGF0ZSkKLXsKLQllbnVtIGRtYV9zdGF0ZV9jbGllbnQJYWNrID0gRE1BX05BSzsKLQotCXN3aXRjaCAoc3RhdGUpIHsKLQljYXNlIERNQV9SRVNPVVJDRV9BVkFJTEFCTEU6Ci0JCWlmICghZG1hdGVzdF9tYXRjaF9jaGFubmVsKGNoYW4pCi0JCQkJfHwgIWRtYXRlc3RfbWF0Y2hfZGV2aWNlKGNoYW4tPmRldmljZSkpCi0JCQlhY2sgPSBETUFfRFVQOwotCQllbHNlIGlmIChtYXhfY2hhbm5lbHMgJiYgbnJfY2hhbm5lbHMgPj0gbWF4X2NoYW5uZWxzKQotCQkJYWNrID0gRE1BX05BSzsKLQkJZWxzZQotCQkJYWNrID0gZG1hdGVzdF9hZGRfY2hhbm5lbChjaGFuKTsKLQkJYnJlYWs7Ci0KLQljYXNlIERNQV9SRVNPVVJDRV9SRU1PVkVEOgotCQlhY2sgPSBkbWF0ZXN0X3JlbW92ZV9jaGFubmVsKGNoYW4pOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXByX2luZm8oImRtYXRlc3Q6IFVuaGFuZGxlZCBldmVudCAldSAoJXMpXG4iLAotCQkJCXN0YXRlLCBkZXZfbmFtZSgmY2hhbi0+ZGV2KSk7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBhY2s7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZG1hX2NsaWVudCBkbWF0ZXN0X2NsaWVudCA9IHsKLQkuZXZlbnRfY2FsbGJhY2sJPSBkbWF0ZXN0X2V2ZW50LAotfTsKLQogc3RhdGljIGludCBfX2luaXQgZG1hdGVzdF9pbml0KHZvaWQpCiB7Ci0JZG1hX2NhcF9zZXQoRE1BX01FTUNQWSwgZG1hdGVzdF9jbGllbnQuY2FwX21hc2spOwotCWRtYV9hc3luY19jbGllbnRfcmVnaXN0ZXIoJmRtYXRlc3RfY2xpZW50KTsKLQlkbWFfYXN5bmNfY2xpZW50X2NoYW5fcmVxdWVzdCgmZG1hdGVzdF9jbGllbnQpOworCWRtYV9jYXBfbWFza190IG1hc2s7CisJc3RydWN0IGRtYV9jaGFuICpjaGFuOworCWludCBlcnIgPSAwOwogCi0JcmV0dXJuIDA7CisJZG1hX2NhcF96ZXJvKG1hc2spOworCWRtYV9jYXBfc2V0KERNQV9NRU1DUFksIG1hc2spOworCWZvciAoOzspIHsKKwkJY2hhbiA9IGRtYV9yZXF1ZXN0X2NoYW5uZWwobWFzaywgZmlsdGVyLCBOVUxMKTsKKwkJaWYgKGNoYW4pIHsKKwkJCWVyciA9IGRtYXRlc3RfYWRkX2NoYW5uZWwoY2hhbik7CisJCQlpZiAoZXJyID09IDApCisJCQkJY29udGludWU7CisJCQllbHNlIHsKKwkJCQlkbWFfcmVsZWFzZV9jaGFubmVsKGNoYW4pOworCQkJCWJyZWFrOyAvKiBhZGRfY2hhbm5lbCBmYWlsZWQsIHB1bnQgKi8KKwkJCX0KKwkJfSBlbHNlCisJCQlicmVhazsgLyogbm8gbW9yZSBjaGFubmVscyBhdmFpbGFibGUgKi8KKwkJaWYgKG1heF9jaGFubmVscyAmJiBucl9jaGFubmVscyA+PSBtYXhfY2hhbm5lbHMpCisJCQlicmVhazsgLyogd2UgaGF2ZSBhbGwgd2UgbmVlZCAqLworCX0KKworCXJldHVybiBlcnI7CiB9Ci1tb2R1bGVfaW5pdChkbWF0ZXN0X2luaXQpOworLyogd2hlbiBjb21waWxlZC1pbiB3YWl0IGZvciBkcml2ZXJzIHRvIGxvYWQgZmlyc3QgKi8KK2xhdGVfaW5pdGNhbGwoZG1hdGVzdF9pbml0KTsKIAogc3RhdGljIHZvaWQgX19leGl0IGRtYXRlc3RfZXhpdCh2b2lkKQogewotCWRtYV9hc3luY19jbGllbnRfdW5yZWdpc3RlcigmZG1hdGVzdF9jbGllbnQpOworCXN0cnVjdCBkbWF0ZXN0X2NoYW4gKmR0YywgKl9kdGM7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZHRjLCBfZHRjLCAmZG1hdGVzdF9jaGFubmVscywgbm9kZSkgeworCQlsaXN0X2RlbCgmZHRjLT5ub2RlKTsKKwkJZG1hdGVzdF9jbGVhbnVwX2NoYW5uZWwoZHRjKTsKKwkJcHJfZGVidWcoImRtYXRlc3Q6IGRyb3BwZWQgY2hhbm5lbCAlc1xuIiwKKwkJCSBkbWFfY2hhbl9uYW1lKGR0Yy0+Y2hhbikpOworCQlkbWFfcmVsZWFzZV9jaGFubmVsKGR0Yy0+Y2hhbik7CisJfQogfQogbW9kdWxlX2V4aXQoZG1hdGVzdF9leGl0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvZHdfZG1hYy5jIGIvZHJpdmVycy9kbWEvZHdfZG1hYy5jCmluZGV4IDA3NzhkOTkuLjZiNzAyY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2R3X2RtYWMuYworKysgYi9kcml2ZXJzL2RtYS9kd19kbWFjLmMKQEAgLTcwLDYgKzcwLDE1IEBACiAgKiB0aGUgY29udHJvbGxlciwgdGhvdWdoLgogICovCiAKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlICpjaGFuMmRldihzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJcmV0dXJuICZjaGFuLT5kZXYtPmRldmljZTsKK30KK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlICpjaGFuMnBhcmVudChzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJcmV0dXJuIGNoYW4tPmRldi0+ZGV2aWNlLnBhcmVudDsKK30KKwogc3RhdGljIHN0cnVjdCBkd19kZXNjICpkd2NfZmlyc3RfYWN0aXZlKHN0cnVjdCBkd19kbWFfY2hhbiAqZHdjKQogewogCXJldHVybiBsaXN0X2VudHJ5KGR3Yy0+YWN0aXZlX2xpc3QubmV4dCwgc3RydWN0IGR3X2Rlc2MsIGRlc2Nfbm9kZSk7CkBAIC05MywxMiArMTAyLDEyIEBACiAJCQlyZXQgPSBkZXNjOwogCQkJYnJlYWs7CiAJCX0KLQkJZGV2X2RiZygmZHdjLT5jaGFuLmRldiwgImRlc2MgJXAgbm90IEFDS2VkXG4iLCBkZXNjKTsKKwkJZGV2X2RiZyhjaGFuMmRldigmZHdjLT5jaGFuKSwgImRlc2MgJXAgbm90IEFDS2VkXG4iLCBkZXNjKTsKIAkJaSsrOwogCX0KIAlzcGluX3VubG9ja19iaCgmZHdjLT5sb2NrKTsKIAotCWRldl92ZGJnKCZkd2MtPmNoYW4uZGV2LCAic2Nhbm5lZCAldSBkZXNjcmlwdG9ycyBvbiBmcmVlbGlzdFxuIiwgaSk7CisJZGV2X3ZkYmcoY2hhbjJkZXYoJmR3Yy0+Y2hhbiksICJzY2FubmVkICV1IGRlc2NyaXB0b3JzIG9uIGZyZWVsaXN0XG4iLCBpKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xMDgsMTAgKzExNywxMCBAQAogCXN0cnVjdCBkd19kZXNjCSpjaGlsZDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGQsICZkZXNjLT50eGQudHhfbGlzdCwgZGVzY19ub2RlKQotCQlkbWFfc3luY19zaW5nbGVfZm9yX2NwdShkd2MtPmNoYW4uZGV2LnBhcmVudCwKKwkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoY2hhbjJwYXJlbnQoJmR3Yy0+Y2hhbiksCiAJCQkJY2hpbGQtPnR4ZC5waHlzLCBzaXplb2YoY2hpbGQtPmxsaSksCiAJCQkJRE1BX1RPX0RFVklDRSk7Ci0JZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoZHdjLT5jaGFuLmRldi5wYXJlbnQsCisJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoY2hhbjJwYXJlbnQoJmR3Yy0+Y2hhbiksCiAJCQlkZXNjLT50eGQucGh5cywgc2l6ZW9mKGRlc2MtPmxsaSksCiAJCQlETUFfVE9fREVWSUNFKTsKIH0KQEAgLTEyOSwxMSArMTM4LDExIEBACiAKIAkJc3Bpbl9sb2NrX2JoKCZkd2MtPmxvY2spOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoaWxkLCAmZGVzYy0+dHhkLnR4X2xpc3QsIGRlc2Nfbm9kZSkKLQkJCWRldl92ZGJnKCZkd2MtPmNoYW4uZGV2LAorCQkJZGV2X3ZkYmcoY2hhbjJkZXYoJmR3Yy0+Y2hhbiksCiAJCQkJCSJtb3ZpbmcgY2hpbGQgZGVzYyAlcCB0byBmcmVlbGlzdFxuIiwKIAkJCQkJY2hpbGQpOwogCQlsaXN0X3NwbGljZV9pbml0KCZkZXNjLT50eGQudHhfbGlzdCwgJmR3Yy0+ZnJlZV9saXN0KTsKLQkJZGV2X3ZkYmcoJmR3Yy0+Y2hhbi5kZXYsICJtb3ZpbmcgZGVzYyAlcCB0byBmcmVlbGlzdFxuIiwgZGVzYyk7CisJCWRldl92ZGJnKGNoYW4yZGV2KCZkd2MtPmNoYW4pLCAibW92aW5nIGRlc2MgJXAgdG8gZnJlZWxpc3RcbiIsIGRlc2MpOwogCQlsaXN0X2FkZCgmZGVzYy0+ZGVzY19ub2RlLCAmZHdjLT5mcmVlX2xpc3QpOwogCQlzcGluX3VubG9ja19iaCgmZHdjLT5sb2NrKTsKIAl9CkBAIC0xNjMsOSArMTcyLDkgQEAKIAogCS8qIEFTU0VSVDogIGNoYW5uZWwgaXMgaWRsZSAqLwogCWlmIChkbWFfcmVhZGwoZHcsIENIX0VOKSAmIGR3Yy0+bWFzaykgewotCQlkZXZfZXJyKCZkd2MtPmNoYW4uZGV2LAorCQlkZXZfZXJyKGNoYW4yZGV2KCZkd2MtPmNoYW4pLAogCQkJIkJVRzogQXR0ZW1wdGVkIHRvIHN0YXJ0IG5vbi1pZGxlIGNoYW5uZWxcbiIpOwotCQlkZXZfZXJyKCZkd2MtPmNoYW4uZGV2LAorCQlkZXZfZXJyKGNoYW4yZGV2KCZkd2MtPmNoYW4pLAogCQkJIiAgU0FSOiAweCV4IERBUjogMHgleCBMTFA6IDB4JXggQ1RMOiAweCV4OiUwOHhcbiIsCiAJCQljaGFubmVsX3JlYWRsKGR3YywgU0FSKSwKIAkJCWNoYW5uZWxfcmVhZGwoZHdjLCBEQVIpLApAQCAtMTkzLDcgKzIwMiw3IEBACiAJdm9pZAkJCQkqcGFyYW07CiAJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yCSp0eGQgPSAmZGVzYy0+dHhkOwogCi0JZGV2X3ZkYmcoJmR3Yy0+Y2hhbi5kZXYsICJkZXNjcmlwdG9yICV1IGNvbXBsZXRlXG4iLCB0eGQtPmNvb2tpZSk7CisJZGV2X3ZkYmcoY2hhbjJkZXYoJmR3Yy0+Y2hhbiksICJkZXNjcmlwdG9yICV1IGNvbXBsZXRlXG4iLCB0eGQtPmNvb2tpZSk7CiAKIAlkd2MtPmNvbXBsZXRlZCA9IHR4ZC0+Y29va2llOwogCWNhbGxiYWNrID0gdHhkLT5jYWxsYmFjazsKQEAgLTIwOCwxMSArMjE3LDExIEBACiAJICogbWFwcGVkIGJlZm9yZSB0aGV5IHdlcmUgc3VibWl0dGVkLi4uCiAJICovCiAJaWYgKCEodHhkLT5mbGFncyAmIERNQV9DT01QTF9TS0lQX0RFU1RfVU5NQVApKQotCQlkbWFfdW5tYXBfcGFnZShkd2MtPmNoYW4uZGV2LnBhcmVudCwgZGVzYy0+bGxpLmRhciwgZGVzYy0+bGVuLAotCQkJCURNQV9GUk9NX0RFVklDRSk7CisJCWRtYV91bm1hcF9wYWdlKGNoYW4ycGFyZW50KCZkd2MtPmNoYW4pLCBkZXNjLT5sbGkuZGFyLAorCQkJICAgICAgIGRlc2MtPmxlbiwgRE1BX0ZST01fREVWSUNFKTsKIAlpZiAoISh0eGQtPmZsYWdzICYgRE1BX0NPTVBMX1NLSVBfU1JDX1VOTUFQKSkKLQkJZG1hX3VubWFwX3BhZ2UoZHdjLT5jaGFuLmRldi5wYXJlbnQsIGRlc2MtPmxsaS5zYXIsIGRlc2MtPmxlbiwKLQkJCQlETUFfVE9fREVWSUNFKTsKKwkJZG1hX3VubWFwX3BhZ2UoY2hhbjJwYXJlbnQoJmR3Yy0+Y2hhbiksIGRlc2MtPmxsaS5zYXIsCisJCQkgICAgICAgZGVzYy0+bGVuLCBETUFfVE9fREVWSUNFKTsKIAogCS8qCiAJICogVGhlIEFQSSByZXF1aXJlcyB0aGF0IG5vIHN1Ym1pc3Npb25zIGFyZSBkb25lIGZyb20gYQpAQCAtMjI4LDcgKzIzNyw3IEBACiAJTElTVF9IRUFEKGxpc3QpOwogCiAJaWYgKGRtYV9yZWFkbChkdywgQ0hfRU4pICYgZHdjLT5tYXNrKSB7Ci0JCWRldl9lcnIoJmR3Yy0+Y2hhbi5kZXYsCisJCWRldl9lcnIoY2hhbjJkZXYoJmR3Yy0+Y2hhbiksCiAJCQkiQlVHOiBYRkVSIGJpdCBzZXQsIGJ1dCBjaGFubmVsIG5vdCBpZGxlIVxuIik7CiAKIAkJLyogVHJ5IHRvIGNvbnRpbnVlIGFmdGVyIHJlc2V0dGluZyB0aGUgY2hhbm5lbC4uLiAqLwpAQCAtMjczLDcgKzI4Miw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlkZXZfdmRiZygmZHdjLT5jaGFuLmRldiwgInNjYW5fZGVzY3JpcHRvcnM6IGxscD0weCV4XG4iLCBsbHApOworCWRldl92ZGJnKGNoYW4yZGV2KCZkd2MtPmNoYW4pLCAic2Nhbl9kZXNjcmlwdG9yczogbGxwPTB4JXhcbiIsIGxscCk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGVzYywgX2Rlc2MsICZkd2MtPmFjdGl2ZV9saXN0LCBkZXNjX25vZGUpIHsKIAkJaWYgKGRlc2MtPmxsaS5sbHAgPT0gbGxwKQpAQCAtMjkyLDcgKzMwMSw3IEBACiAJCWR3Y19kZXNjcmlwdG9yX2NvbXBsZXRlKGR3YywgZGVzYyk7CiAJfQogCi0JZGV2X2VycigmZHdjLT5jaGFuLmRldiwKKwlkZXZfZXJyKGNoYW4yZGV2KCZkd2MtPmNoYW4pLAogCQkiQlVHOiBBbGwgZGVzY3JpcHRvcnMgZG9uZSwgYnV0IGNoYW5uZWwgbm90IGlkbGUhXG4iKTsKIAogCS8qIFRyeSB0byBjb250aW51ZSBhZnRlciByZXNldHRpbmcgdGhlIGNoYW5uZWwuLi4gKi8KQEAgLTMwOCw3ICszMTcsNyBAQAogCiBzdGF0aWMgdm9pZCBkd2NfZHVtcF9sbGkoc3RydWN0IGR3X2RtYV9jaGFuICpkd2MsIHN0cnVjdCBkd19sbGkgKmxsaSkKIHsKLQlkZXZfcHJpbnRrKEtFUk5fQ1JJVCwgJmR3Yy0+Y2hhbi5kZXYsCisJZGV2X3ByaW50ayhLRVJOX0NSSVQsIGNoYW4yZGV2KCZkd2MtPmNoYW4pLAogCQkJIiAgZGVzYzogczB4JXggZDB4JXggbDB4JXggYzB4JXg6JXhcbiIsCiAJCQlsbGktPnNhciwgbGxpLT5kYXIsIGxsaS0+bGxwLAogCQkJbGxpLT5jdGxoaSwgbGxpLT5jdGxsbyk7CkBAIC0zNDIsOSArMzUxLDkgQEAKIAkgKiBjb250cm9sbGVyIGZsYWdnZWQgYW4gZXJyb3IgaW5zdGVhZCBvZiBzY3JpYmJsaW5nIG92ZXIKIAkgKiByYW5kb20gbWVtb3J5IGxvY2F0aW9ucy4KIAkgKi8KLQlkZXZfcHJpbnRrKEtFUk5fQ1JJVCwgJmR3Yy0+Y2hhbi5kZXYsCisJZGV2X3ByaW50ayhLRVJOX0NSSVQsIGNoYW4yZGV2KCZkd2MtPmNoYW4pLAogCQkJIkJhZCBkZXNjcmlwdG9yIHN1Ym1pdHRlZCBmb3IgRE1BIVxuIik7Ci0JZGV2X3ByaW50ayhLRVJOX0NSSVQsICZkd2MtPmNoYW4uZGV2LAorCWRldl9wcmludGsoS0VSTl9DUklULCBjaGFuMmRldigmZHdjLT5jaGFuKSwKIAkJCSIgIGNvb2tpZTogJWRcbiIsIGJhZF9kZXNjLT50eGQuY29va2llKTsKIAlkd2NfZHVtcF9sbGkoZHdjLCAmYmFkX2Rlc2MtPmxsaSk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGlsZCwgJmJhZF9kZXNjLT50eGQudHhfbGlzdCwgZGVzY19ub2RlKQpAQCAtNDQyLDEyICs0NTEsMTIgQEAKIAkgKiBmb3IgRE1BLiBCdXQgdGhpcyBpcyBoYXJkIHRvIGRvIGluIGEgcmFjZS1mcmVlIG1hbm5lci4KIAkgKi8KIAlpZiAobGlzdF9lbXB0eSgmZHdjLT5hY3RpdmVfbGlzdCkpIHsKLQkJZGV2X3ZkYmcoJnR4LT5jaGFuLT5kZXYsICJ0eF9zdWJtaXQ6IHN0YXJ0ZWQgJXVcbiIsCisJCWRldl92ZGJnKGNoYW4yZGV2KHR4LT5jaGFuKSwgInR4X3N1Ym1pdDogc3RhcnRlZCAldVxuIiwKIAkJCQlkZXNjLT50eGQuY29va2llKTsKIAkJZHdjX2Rvc3RhcnQoZHdjLCBkZXNjKTsKIAkJbGlzdF9hZGRfdGFpbCgmZGVzYy0+ZGVzY19ub2RlLCAmZHdjLT5hY3RpdmVfbGlzdCk7CiAJfSBlbHNlIHsKLQkJZGV2X3ZkYmcoJnR4LT5jaGFuLT5kZXYsICJ0eF9zdWJtaXQ6IHF1ZXVlZCAldVxuIiwKKwkJZGV2X3ZkYmcoY2hhbjJkZXYodHgtPmNoYW4pLCAidHhfc3VibWl0OiBxdWV1ZWQgJXVcbiIsCiAJCQkJZGVzYy0+dHhkLmNvb2tpZSk7CiAKIAkJbGlzdF9hZGRfdGFpbCgmZGVzYy0+ZGVzY19ub2RlLCAmZHdjLT5xdWV1ZSk7CkBAIC00NzIsMTEgKzQ4MSwxMSBAQAogCXVuc2lnbmVkIGludAkJZHN0X3dpZHRoOwogCXUzMgkJCWN0bGxvOwogCi0JZGV2X3ZkYmcoJmNoYW4tPmRldiwgInByZXBfZG1hX21lbWNweSBkMHgleCBzMHgleCBsMHglenggZjB4JWx4XG4iLAorCWRldl92ZGJnKGNoYW4yZGV2KGNoYW4pLCAicHJlcF9kbWFfbWVtY3B5IGQweCV4IHMweCV4IGwweCV6eCBmMHglbHhcbiIsCiAJCQlkZXN0LCBzcmMsIGxlbiwgZmxhZ3MpOwogCiAJaWYgKHVubGlrZWx5KCFsZW4pKSB7Ci0JCWRldl9kYmcoJmNoYW4tPmRldiwgInByZXBfZG1hX21lbWNweTogbGVuZ3RoIGlzIHplcm8hXG4iKTsKKwkJZGV2X2RiZyhjaGFuMmRldihjaGFuKSwgInByZXBfZG1hX21lbWNweTogbGVuZ3RoIGlzIHplcm8hXG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC01MTYsNyArNTI1LDcgQEAKIAkJCWZpcnN0ID0gZGVzYzsKIAkJfSBlbHNlIHsKIAkJCXByZXYtPmxsaS5sbHAgPSBkZXNjLT50eGQucGh5czsKLQkJCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGNoYW4tPmRldi5wYXJlbnQsCisJCQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShjaGFuMnBhcmVudChjaGFuKSwKIAkJCQkJcHJldi0+dHhkLnBoeXMsIHNpemVvZihwcmV2LT5sbGkpLAogCQkJCQlETUFfVE9fREVWSUNFKTsKIAkJCWxpc3RfYWRkX3RhaWwoJmRlc2MtPmRlc2Nfbm9kZSwKQEAgLTUzMSw3ICs1NDAsNyBAQAogCQlwcmV2LT5sbGkuY3RsbG8gfD0gRFdDX0NUTExfSU5UX0VOOwogCiAJcHJldi0+bGxpLmxscCA9IDA7Ci0JZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoY2hhbi0+ZGV2LnBhcmVudCwKKwlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShjaGFuMnBhcmVudChjaGFuKSwKIAkJCXByZXYtPnR4ZC5waHlzLCBzaXplb2YocHJldi0+bGxpKSwKIAkJCURNQV9UT19ERVZJQ0UpOwogCkBAIC01NjIsMTUgKzU3MSwxNSBAQAogCXN0cnVjdCBzY2F0dGVybGlzdAkqc2c7CiAJc2l6ZV90CQkJdG90YWxfbGVuID0gMDsKIAotCWRldl92ZGJnKCZjaGFuLT5kZXYsICJwcmVwX2RtYV9zbGF2ZVxuIik7CisJZGV2X3ZkYmcoY2hhbjJkZXYoY2hhbiksICJwcmVwX2RtYV9zbGF2ZVxuIik7CiAKIAlpZiAodW5saWtlbHkoIWR3cyB8fCAhc2dfbGVuKSkKIAkJcmV0dXJuIE5VTEw7CiAKLQlyZWdfd2lkdGggPSBkd3MtPnNsYXZlLnJlZ193aWR0aDsKKwlyZWdfd2lkdGggPSBkd3MtPnJlZ193aWR0aDsKIAlwcmV2ID0gZmlyc3QgPSBOVUxMOwogCi0Jc2dfbGVuID0gZG1hX21hcF9zZyhjaGFuLT5kZXYucGFyZW50LCBzZ2wsIHNnX2xlbiwgZGlyZWN0aW9uKTsKKwlzZ19sZW4gPSBkbWFfbWFwX3NnKGNoYW4ycGFyZW50KGNoYW4pLCBzZ2wsIHNnX2xlbiwgZGlyZWN0aW9uKTsKIAogCXN3aXRjaCAoZGlyZWN0aW9uKSB7CiAJY2FzZSBETUFfVE9fREVWSUNFOgpAQCAtNTc5LDcgKzU4OCw3IEBACiAJCQkJfCBEV0NfQ1RMTF9EU1RfRklYCiAJCQkJfCBEV0NfQ1RMTF9TUkNfSU5DCiAJCQkJfCBEV0NfQ1RMTF9GQ19NMlApOwotCQlyZWcgPSBkd3MtPnNsYXZlLnR4X3JlZzsKKwkJcmVnID0gZHdzLT50eF9yZWc7CiAJCWZvcl9lYWNoX3NnKHNnbCwgc2csIHNnX2xlbiwgaSkgewogCQkJc3RydWN0IGR3X2Rlc2MJKmRlc2M7CiAJCQl1MzIJCWxlbjsKQEAgLTU4Nyw3ICs1OTYsNyBAQAogCiAJCQlkZXNjID0gZHdjX2Rlc2NfZ2V0KGR3Yyk7CiAJCQlpZiAoIWRlc2MpIHsKLQkJCQlkZXZfZXJyKCZjaGFuLT5kZXYsCisJCQkJZGV2X2VycihjaGFuMmRldihjaGFuKSwKIAkJCQkJIm5vdCBlbm91Z2ggZGVzY3JpcHRvcnMgYXZhaWxhYmxlXG4iKTsKIAkJCQlnb3RvIGVycl9kZXNjX2dldDsKIAkJCX0KQEAgLTYwNyw3ICs2MTYsNyBAQAogCQkJCWZpcnN0ID0gZGVzYzsKIAkJCX0gZWxzZSB7CiAJCQkJcHJldi0+bGxpLmxscCA9IGRlc2MtPnR4ZC5waHlzOwotCQkJCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGNoYW4tPmRldi5wYXJlbnQsCisJCQkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoY2hhbjJwYXJlbnQoY2hhbiksCiAJCQkJCQlwcmV2LT50eGQucGh5cywKIAkJCQkJCXNpemVvZihwcmV2LT5sbGkpLAogCQkJCQkJRE1BX1RPX0RFVklDRSk7CkBAIC02MjUsNyArNjM0LDcgQEAKIAkJCQl8IERXQ19DVExMX1NSQ19GSVgKIAkJCQl8IERXQ19DVExMX0ZDX1AyTSk7CiAKLQkJcmVnID0gZHdzLT5zbGF2ZS5yeF9yZWc7CisJCXJlZyA9IGR3cy0+cnhfcmVnOwogCQlmb3JfZWFjaF9zZyhzZ2wsIHNnLCBzZ19sZW4sIGkpIHsKIAkJCXN0cnVjdCBkd19kZXNjCSpkZXNjOwogCQkJdTMyCQlsZW47CkBAIC02MzMsNyArNjQyLDcgQEAKIAogCQkJZGVzYyA9IGR3Y19kZXNjX2dldChkd2MpOwogCQkJaWYgKCFkZXNjKSB7Ci0JCQkJZGV2X2VycigmY2hhbi0+ZGV2LAorCQkJCWRldl9lcnIoY2hhbjJkZXYoY2hhbiksCiAJCQkJCSJub3QgZW5vdWdoIGRlc2NyaXB0b3JzIGF2YWlsYWJsZVxuIik7CiAJCQkJZ290byBlcnJfZGVzY19nZXQ7CiAJCQl9CkBAIC02NTMsNyArNjYyLDcgQEAKIAkJCQlmaXJzdCA9IGRlc2M7CiAJCQl9IGVsc2UgewogCQkJCXByZXYtPmxsaS5sbHAgPSBkZXNjLT50eGQucGh5czsKLQkJCQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShjaGFuLT5kZXYucGFyZW50LAorCQkJCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGNoYW4ycGFyZW50KGNoYW4pLAogCQkJCQkJcHJldi0+dHhkLnBoeXMsCiAJCQkJCQlzaXplb2YocHJldi0+bGxpKSwKIAkJCQkJCURNQV9UT19ERVZJQ0UpOwpAQCAtNjczLDcgKzY4Miw3IEBACiAJCXByZXYtPmxsaS5jdGxsbyB8PSBEV0NfQ1RMTF9JTlRfRU47CiAKIAlwcmV2LT5sbGkubGxwID0gMDsKLQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShjaGFuLT5kZXYucGFyZW50LAorCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGNoYW4ycGFyZW50KGNoYW4pLAogCQkJcHJldi0+dHhkLnBoeXMsIHNpemVvZihwcmV2LT5sbGkpLAogCQkJRE1BX1RPX0RFVklDRSk7CiAKQEAgLTc1OCwyOSArNzY3LDIxIEBACiAJc3Bpbl91bmxvY2tfYmgoJmR3Yy0+bG9jayk7CiB9CiAKLXN0YXRpYyBpbnQgZHdjX2FsbG9jX2NoYW5fcmVzb3VyY2VzKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwKLQkJc3RydWN0IGRtYV9jbGllbnQgKmNsaWVudCkKK3N0YXRpYyBpbnQgZHdjX2FsbG9jX2NoYW5fcmVzb3VyY2VzKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKIHsKIAlzdHJ1Y3QgZHdfZG1hX2NoYW4JKmR3YyA9IHRvX2R3X2RtYV9jaGFuKGNoYW4pOwogCXN0cnVjdCBkd19kbWEJCSpkdyA9IHRvX2R3X2RtYShjaGFuLT5kZXZpY2UpOwogCXN0cnVjdCBkd19kZXNjCQkqZGVzYzsKLQlzdHJ1Y3QgZG1hX3NsYXZlCSpzbGF2ZTsKIAlzdHJ1Y3QgZHdfZG1hX3NsYXZlCSpkd3M7CiAJaW50CQkJaTsKIAl1MzIJCQljZmdoaTsKIAl1MzIJCQljZmdsbzsKIAotCWRldl92ZGJnKCZjaGFuLT5kZXYsICJhbGxvY19jaGFuX3Jlc291cmNlc1xuIik7Ci0KLQkvKiBDaGFubmVscyBkb2luZyBzbGF2ZSBETUEgY2FuIG9ubHkgaGFuZGxlIG9uZSBjbGllbnQuICovCi0JaWYgKGR3Yy0+ZHdzIHx8IGNsaWVudC0+c2xhdmUpIHsKLQkJaWYgKGNoYW4tPmNsaWVudF9jb3VudCkKLQkJCXJldHVybiAtRUJVU1k7Ci0JfQorCWRldl92ZGJnKGNoYW4yZGV2KGNoYW4pLCAiYWxsb2NfY2hhbl9yZXNvdXJjZXNcbiIpOwogCiAJLyogQVNTRVJUOiAgY2hhbm5lbCBpcyBpZGxlICovCiAJaWYgKGRtYV9yZWFkbChkdywgQ0hfRU4pICYgZHdjLT5tYXNrKSB7Ci0JCWRldl9kYmcoJmNoYW4tPmRldiwgIkRNQSBjaGFubmVsIG5vdCBpZGxlP1xuIik7CisJCWRldl9kYmcoY2hhbjJkZXYoY2hhbiksICJETUEgY2hhbm5lbCBub3QgaWRsZT9cbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTc4OSwyMyArNzkwLDE3IEBACiAJY2ZnaGkgPSBEV0NfQ0ZHSF9GSUZPX01PREU7CiAJY2ZnbG8gPSAwOwogCi0Jc2xhdmUgPSBjbGllbnQtPnNsYXZlOwotCWlmIChzbGF2ZSkgeworCWR3cyA9IGR3Yy0+ZHdzOworCWlmIChkd3MpIHsKIAkJLyoKIAkJICogV2UgbmVlZCBjb250cm9sbGVyLXNwZWNpZmljIGRhdGEgdG8gc2V0IHVwIHNsYXZlCiAJCSAqIHRyYW5zZmVycy4KIAkJICovCi0JCUJVR19PTighc2xhdmUtPmRtYV9kZXYgfHwgc2xhdmUtPmRtYV9kZXYgIT0gZHctPmRtYS5kZXYpOworCQlCVUdfT04oIWR3cy0+ZG1hX2RldiB8fCBkd3MtPmRtYV9kZXYgIT0gZHctPmRtYS5kZXYpOwogCi0JCWR3cyA9IGNvbnRhaW5lcl9vZihzbGF2ZSwgc3RydWN0IGR3X2RtYV9zbGF2ZSwgc2xhdmUpOwotCi0JCWR3Yy0+ZHdzID0gZHdzOwogCQljZmdoaSA9IGR3cy0+Y2ZnX2hpOwogCQljZmdsbyA9IGR3cy0+Y2ZnX2xvOwotCX0gZWxzZSB7Ci0JCWR3Yy0+ZHdzID0gTlVMTDsKIAl9Ci0KIAljaGFubmVsX3dyaXRlbChkd2MsIENGR19MTywgY2ZnbG8pOwogCWNoYW5uZWxfd3JpdGVsKGR3YywgQ0ZHX0hJLCBjZmdoaSk7CiAKQEAgLTgyMiw3ICs4MTcsNyBAQAogCiAJCWRlc2MgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHdfZGVzYyksIEdGUF9LRVJORUwpOwogCQlpZiAoIWRlc2MpIHsKLQkJCWRldl9pbmZvKCZjaGFuLT5kZXYsCisJCQlkZXZfaW5mbyhjaGFuMmRldihjaGFuKSwKIAkJCQkib25seSBhbGxvY2F0ZWQgJWQgZGVzY3JpcHRvcnNcbiIsIGkpOwogCQkJc3Bpbl9sb2NrX2JoKCZkd2MtPmxvY2spOwogCQkJYnJlYWs7CkBAIC04MzIsNyArODI3LDcgQEAKIAkJZGVzYy0+dHhkLnR4X3N1Ym1pdCA9IGR3Y190eF9zdWJtaXQ7CiAJCWRlc2MtPnR4ZC5mbGFncyA9IERNQV9DVFJMX0FDSzsKIAkJSU5JVF9MSVNUX0hFQUQoJmRlc2MtPnR4ZC50eF9saXN0KTsKLQkJZGVzYy0+dHhkLnBoeXMgPSBkbWFfbWFwX3NpbmdsZShjaGFuLT5kZXYucGFyZW50LCAmZGVzYy0+bGxpLAorCQlkZXNjLT50eGQucGh5cyA9IGRtYV9tYXBfc2luZ2xlKGNoYW4ycGFyZW50KGNoYW4pLCAmZGVzYy0+bGxpLAogCQkJCXNpemVvZihkZXNjLT5sbGkpLCBETUFfVE9fREVWSUNFKTsKIAkJZHdjX2Rlc2NfcHV0KGR3YywgZGVzYyk7CiAKQEAgLTg0Nyw3ICs4NDIsNyBAQAogCiAJc3Bpbl91bmxvY2tfYmgoJmR3Yy0+bG9jayk7CiAKLQlkZXZfZGJnKCZjaGFuLT5kZXYsCisJZGV2X2RiZyhjaGFuMmRldihjaGFuKSwKIAkJImFsbG9jX2NoYW5fcmVzb3VyY2VzIGFsbG9jYXRlZCAlZCBkZXNjcmlwdG9yc1xuIiwgaSk7CiAKIAlyZXR1cm4gaTsKQEAgLTg2MCw3ICs4NTUsNyBAQAogCXN0cnVjdCBkd19kZXNjCQkqZGVzYywgKl9kZXNjOwogCUxJU1RfSEVBRChsaXN0KTsKIAotCWRldl9kYmcoJmNoYW4tPmRldiwgImZyZWVfY2hhbl9yZXNvdXJjZXMgKGRlc2NzIGFsbG9jYXRlZD0ldSlcbiIsCisJZGV2X2RiZyhjaGFuMmRldihjaGFuKSwgImZyZWVfY2hhbl9yZXNvdXJjZXMgKGRlc2NzIGFsbG9jYXRlZD0ldSlcbiIsCiAJCQlkd2MtPmRlc2NzX2FsbG9jYXRlZCk7CiAKIAkvKiBBU1NFUlQ6ICBjaGFubmVsIGlzIGlkbGUgKi8KQEAgLTg4MSwxMyArODc2LDEzIEBACiAJc3Bpbl91bmxvY2tfYmgoJmR3Yy0+bG9jayk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGVzYywgX2Rlc2MsICZsaXN0LCBkZXNjX25vZGUpIHsKLQkJZGV2X3ZkYmcoJmNoYW4tPmRldiwgIiAgZnJlZWluZyBkZXNjcmlwdG9yICVwXG4iLCBkZXNjKTsKLQkJZG1hX3VubWFwX3NpbmdsZShjaGFuLT5kZXYucGFyZW50LCBkZXNjLT50eGQucGh5cywKKwkJZGV2X3ZkYmcoY2hhbjJkZXYoY2hhbiksICIgIGZyZWVpbmcgZGVzY3JpcHRvciAlcFxuIiwgZGVzYyk7CisJCWRtYV91bm1hcF9zaW5nbGUoY2hhbjJwYXJlbnQoY2hhbiksIGRlc2MtPnR4ZC5waHlzLAogCQkJCXNpemVvZihkZXNjLT5sbGkpLCBETUFfVE9fREVWSUNFKTsKIAkJa2ZyZWUoZGVzYyk7CiAJfQogCi0JZGV2X3ZkYmcoJmNoYW4tPmRldiwgImZyZWVfY2hhbl9yZXNvdXJjZXMgZG9uZVxuIik7CisJZGV2X3ZkYmcoY2hhbjJkZXYoY2hhbiksICJmcmVlX2NoYW5fcmVzb3VyY2VzIGRvbmVcbiIpOwogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvZnNsZG1hLmMgYi9kcml2ZXJzL2RtYS9mc2xkbWEuYwppbmRleCAwYjk1ZGNjLi5jYTcwYTIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9mc2xkbWEuYworKysgYi9kcml2ZXJzL2RtYS9mc2xkbWEuYwpAQCAtMzY2LDggKzM2Niw3IEBACiAgKgogICogUmV0dXJuIC0gVGhlIG51bWJlciBvZiBkZXNjcmlwdG9ycyBhbGxvY2F0ZWQuCiAgKi8KLXN0YXRpYyBpbnQgZnNsX2RtYV9hbGxvY19jaGFuX3Jlc291cmNlcyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sCi0JCQkJCXN0cnVjdCBkbWFfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgaW50IGZzbF9kbWFfYWxsb2NfY2hhbl9yZXNvdXJjZXMoc3RydWN0IGRtYV9jaGFuICpjaGFuKQogewogCXN0cnVjdCBmc2xfZG1hX2NoYW4gKmZzbF9jaGFuID0gdG9fZnNsX2NoYW4oY2hhbik7CiAKQEAgLTgyMyw3ICs4MjIsNyBAQAogCSAqLwogCVdBUk5fT04oZmRldi0+ZmVhdHVyZSAhPSBuZXdfZnNsX2NoYW4tPmZlYXR1cmUpOwogCi0JbmV3X2ZzbF9jaGFuLT5kZXYgPSAmbmV3X2ZzbF9jaGFuLT5jb21tb24uZGV2OworCW5ld19mc2xfY2hhbi0+ZGV2ID0gJm5ld19mc2xfY2hhbi0+Y29tbW9uLmRldi0+ZGV2aWNlOwogCW5ld19mc2xfY2hhbi0+cmVnX2Jhc2UgPSBpb3JlbWFwKG5ld19mc2xfY2hhbi0+cmVnLnN0YXJ0LAogCQkJbmV3X2ZzbF9jaGFuLT5yZWcuZW5kIC0gbmV3X2ZzbF9jaGFuLT5yZWcuc3RhcnQgKyAxKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvaW9hdC5jIGIvZHJpdmVycy9kbWEvaW9hdC5jCmluZGV4IDliMTZhM2EuLjQxMDVkNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2lvYXQuYworKysgYi9kcml2ZXJzL2RtYS9pb2F0LmMKQEAgLTc1LDYwICs3NSwxMCBAQAogbW9kdWxlX3BhcmFtKGlvYXRfZGNhX2VuYWJsZWQsIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGlvYXRfZGNhX2VuYWJsZWQsICJjb250cm9sIHN1cHBvcnQgb2YgZGNhIHNlcnZpY2UgKGRlZmF1bHQ6IDEpIik7CiAKLXN0YXRpYyBpbnQgaW9hdF9zZXR1cF9mdW5jdGlvbmFsaXR5KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB2b2lkIF9faW9tZW0gKmlvYmFzZSkKLXsKLQlzdHJ1Y3QgaW9hdF9kZXZpY2UgKmRldmljZSA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQl1OCB2ZXJzaW9uOwotCWludCBlcnIgPSAwOwotCi0JdmVyc2lvbiA9IHJlYWRiKGlvYmFzZSArIElPQVRfVkVSX09GRlNFVCk7Ci0Jc3dpdGNoICh2ZXJzaW9uKSB7Ci0JY2FzZSBJT0FUX1ZFUl8xXzI6Ci0JCWRldmljZS0+ZG1hID0gaW9hdF9kbWFfcHJvYmUocGRldiwgaW9iYXNlKTsKLQkJaWYgKGRldmljZS0+ZG1hICYmIGlvYXRfZGNhX2VuYWJsZWQpCi0JCQlkZXZpY2UtPmRjYSA9IGlvYXRfZGNhX2luaXQocGRldiwgaW9iYXNlKTsKLQkJYnJlYWs7Ci0JY2FzZSBJT0FUX1ZFUl8yXzA6Ci0JCWRldmljZS0+ZG1hID0gaW9hdF9kbWFfcHJvYmUocGRldiwgaW9iYXNlKTsKLQkJaWYgKGRldmljZS0+ZG1hICYmIGlvYXRfZGNhX2VuYWJsZWQpCi0JCQlkZXZpY2UtPmRjYSA9IGlvYXQyX2RjYV9pbml0KHBkZXYsIGlvYmFzZSk7Ci0JCWJyZWFrOwotCWNhc2UgSU9BVF9WRVJfM18wOgotCQlkZXZpY2UtPmRtYSA9IGlvYXRfZG1hX3Byb2JlKHBkZXYsIGlvYmFzZSk7Ci0JCWlmIChkZXZpY2UtPmRtYSAmJiBpb2F0X2RjYV9lbmFibGVkKQotCQkJZGV2aWNlLT5kY2EgPSBpb2F0M19kY2FfaW5pdChwZGV2LCBpb2Jhc2UpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQllcnIgPSAtRU5PREVWOwotCQlicmVhazsKLQl9Ci0JaWYgKCFkZXZpY2UtPmRtYSkKLQkJZXJyID0gLUVOT0RFVjsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgdm9pZCBpb2F0X3NodXRkb3duX2Z1bmN0aW9uYWxpdHkoc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0Jc3RydWN0IGlvYXRfZGV2aWNlICpkZXZpY2UgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0KLQlkZXZfZXJyKCZwZGV2LT5kZXYsICJSZW1vdmluZyBkbWEgYW5kIGRjYSBzZXJ2aWNlc1xuIik7Ci0JaWYgKGRldmljZS0+ZGNhKSB7Ci0JCXVucmVnaXN0ZXJfZGNhX3Byb3ZpZGVyKGRldmljZS0+ZGNhKTsKLQkJZnJlZV9kY2FfcHJvdmlkZXIoZGV2aWNlLT5kY2EpOwotCQlkZXZpY2UtPmRjYSA9IE5VTEw7Ci0JfQotCi0JaWYgKGRldmljZS0+ZG1hKSB7Ci0JCWlvYXRfZG1hX3JlbW92ZShkZXZpY2UtPmRtYSk7Ci0JCWRldmljZS0+ZG1hID0gTlVMTDsKLQl9Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpb2F0X3BjaV9kcml2ZXIgPSB7CiAJLm5hbWUJCT0gImlvYXRkbWEiLAogCS5pZF90YWJsZQk9IGlvYXRfcGNpX3RibCwKIAkucHJvYmUJCT0gaW9hdF9wcm9iZSwKLQkuc2h1dGRvd24JPSBpb2F0X3NodXRkb3duX2Z1bmN0aW9uYWxpdHksCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChpb2F0X3JlbW92ZSksCiB9OwogCkBAIC0xNzksNyArMTI5LDI5IEBACiAKIAlwY2lfc2V0X21hc3RlcihwZGV2KTsKIAotCWVyciA9IGlvYXRfc2V0dXBfZnVuY3Rpb25hbGl0eShwZGV2LCBpb2Jhc2UpOworCXN3aXRjaCAocmVhZGIoaW9iYXNlICsgSU9BVF9WRVJfT0ZGU0VUKSkgeworCWNhc2UgSU9BVF9WRVJfMV8yOgorCQlkZXZpY2UtPmRtYSA9IGlvYXRfZG1hX3Byb2JlKHBkZXYsIGlvYmFzZSk7CisJCWlmIChkZXZpY2UtPmRtYSAmJiBpb2F0X2RjYV9lbmFibGVkKQorCQkJZGV2aWNlLT5kY2EgPSBpb2F0X2RjYV9pbml0KHBkZXYsIGlvYmFzZSk7CisJCWJyZWFrOworCWNhc2UgSU9BVF9WRVJfMl8wOgorCQlkZXZpY2UtPmRtYSA9IGlvYXRfZG1hX3Byb2JlKHBkZXYsIGlvYmFzZSk7CisJCWlmIChkZXZpY2UtPmRtYSAmJiBpb2F0X2RjYV9lbmFibGVkKQorCQkJZGV2aWNlLT5kY2EgPSBpb2F0Ml9kY2FfaW5pdChwZGV2LCBpb2Jhc2UpOworCQlicmVhazsKKwljYXNlIElPQVRfVkVSXzNfMDoKKwkJZGV2aWNlLT5kbWEgPSBpb2F0X2RtYV9wcm9iZShwZGV2LCBpb2Jhc2UpOworCQlpZiAoZGV2aWNlLT5kbWEgJiYgaW9hdF9kY2FfZW5hYmxlZCkKKwkJCWRldmljZS0+ZGNhID0gaW9hdDNfZGNhX2luaXQocGRldiwgaW9iYXNlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyID0gLUVOT0RFVjsKKwkJYnJlYWs7CisJfQorCWlmICghZGV2aWNlLT5kbWEpCisJCWVyciA9IC1FTk9ERVY7CisKIAlpZiAoZXJyKQogCQlnb3RvIGVycl92ZXJzaW9uOwogCkBAIC0xOTgsMTcgKzE3MCwyMSBAQAogCXJldHVybiBlcnI7CiB9CiAKLS8qCi0gKiBJdCBpcyB1bnNhZmUgdG8gcmVtb3ZlIHRoaXMgbW9kdWxlOiBpZiByZW1vdmVkIHdoaWxlIGEgcmVxdWVzdGVkCi0gKiBkbWEgaXMgb3V0c3RhbmRpbmcsIGVzcC4gZnJvbSB0Y3AsIGl0IGlzIHBvc3NpYmxlIHRvIGhhbmcgd2hpbGUKLSAqIHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0aGF0IHdpbGwgbmV2ZXIgZmluaXNoLiAgSG93ZXZlciwgaWYgeW91J3JlCi0gKiBmZWVsaW5nIGx1Y2t5LCB0aGlzIHVzdWFsbHkgd29ya3MganVzdCBmaW5lLgotICovCiBzdGF0aWMgdm9pZCBfX2RldmV4aXQgaW9hdF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJc3RydWN0IGlvYXRfZGV2aWNlICpkZXZpY2UgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAKLQlpb2F0X3NodXRkb3duX2Z1bmN0aW9uYWxpdHkocGRldik7CisJZGV2X2VycigmcGRldi0+ZGV2LCAiUmVtb3ZpbmcgZG1hIGFuZCBkY2Egc2VydmljZXNcbiIpOworCWlmIChkZXZpY2UtPmRjYSkgeworCQl1bnJlZ2lzdGVyX2RjYV9wcm92aWRlcihkZXZpY2UtPmRjYSk7CisJCWZyZWVfZGNhX3Byb3ZpZGVyKGRldmljZS0+ZGNhKTsKKwkJZGV2aWNlLT5kY2EgPSBOVUxMOworCX0KKworCWlmIChkZXZpY2UtPmRtYSkgeworCQlpb2F0X2RtYV9yZW1vdmUoZGV2aWNlLT5kbWEpOworCQlkZXZpY2UtPmRtYSA9IE5VTEw7CisJfQogCiAJa2ZyZWUoZGV2aWNlKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2lvYXRfZG1hLmMgYi9kcml2ZXJzL2RtYS9pb2F0X2RtYS5jCmluZGV4IDY2MDdmZGQuLmIzNzU5YzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2lvYXRfZG1hLmMKKysrIGIvZHJpdmVycy9kbWEvaW9hdF9kbWEuYwpAQCAtNzM0LDggKzczNCw3IEBACiAgKiBpb2F0X2RtYV9hbGxvY19jaGFuX3Jlc291cmNlcyAtIHJldHVybnMgdGhlIG51bWJlciBvZiBhbGxvY2F0ZWQgZGVzY3JpcHRvcnMKICAqIEBjaGFuOiB0aGUgY2hhbm5lbCB0byBiZSBmaWxsZWQgb3V0CiAgKi8KLXN0YXRpYyBpbnQgaW9hdF9kbWFfYWxsb2NfY2hhbl9yZXNvdXJjZXMoc3RydWN0IGRtYV9jaGFuICpjaGFuLAotCQkJCQkgc3RydWN0IGRtYV9jbGllbnQgKmNsaWVudCkKK3N0YXRpYyBpbnQgaW9hdF9kbWFfYWxsb2NfY2hhbl9yZXNvdXJjZXMoc3RydWN0IGRtYV9jaGFuICpjaGFuKQogewogCXN0cnVjdCBpb2F0X2RtYV9jaGFuICppb2F0X2NoYW4gPSB0b19pb2F0X2NoYW4oY2hhbik7CiAJc3RydWN0IGlvYXRfZGVzY19zdyAqZGVzYzsKQEAgLTEzNDEsMTIgKzEzNDAsMTEgQEAKICAqLwogI2RlZmluZSBJT0FUX1RFU1RfU0laRSAyMDAwCiAKLURFQ0xBUkVfQ09NUExFVElPTih0ZXN0X2NvbXBsZXRpb24pOwogc3RhdGljIHZvaWQgaW9hdF9kbWFfdGVzdF9jYWxsYmFjayh2b2lkICpkbWFfYXN5bmNfcGFyYW0pCiB7Ci0JcHJpbnRrKEtFUk5fRVJSICJpb2F0ZG1hOiBpb2F0X2RtYV90ZXN0X2NhbGxiYWNrKCVwKVxuIiwKLQkJZG1hX2FzeW5jX3BhcmFtKTsKLQljb21wbGV0ZSgmdGVzdF9jb21wbGV0aW9uKTsKKwlzdHJ1Y3QgY29tcGxldGlvbiAqY21wID0gZG1hX2FzeW5jX3BhcmFtOworCisJY29tcGxldGUoY21wKTsKIH0KIAogLyoqCkBAIC0xMzYzLDYgKzEzNjEsNyBAQAogCWRtYV9hZGRyX3QgZG1hX2Rlc3QsIGRtYV9zcmM7CiAJZG1hX2Nvb2tpZV90IGNvb2tpZTsKIAlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgY29tcGxldGlvbiBjbXA7CiAKIAlzcmMgPSBremFsbG9jKHNpemVvZih1OCkgKiBJT0FUX1RFU1RfU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzcmMpCkBAIC0xMzgxLDcgKzEzODAsNyBAQAogCWRtYV9jaGFuID0gY29udGFpbmVyX29mKGRldmljZS0+Y29tbW9uLmNoYW5uZWxzLm5leHQsCiAJCQkJc3RydWN0IGRtYV9jaGFuLAogCQkJCWRldmljZV9ub2RlKTsKLQlpZiAoZGV2aWNlLT5jb21tb24uZGV2aWNlX2FsbG9jX2NoYW5fcmVzb3VyY2VzKGRtYV9jaGFuLCBOVUxMKSA8IDEpIHsKKwlpZiAoZGV2aWNlLT5jb21tb24uZGV2aWNlX2FsbG9jX2NoYW5fcmVzb3VyY2VzKGRtYV9jaGFuKSA8IDEpIHsKIAkJZGV2X2VycigmZGV2aWNlLT5wZGV2LT5kZXYsCiAJCQkic2VsZnRlc3QgY2Fubm90IGFsbG9jYXRlIGNoYW4gcmVzb3VyY2VcbiIpOwogCQllcnIgPSAtRU5PREVWOwpAQCAtMTQwMiw4ICsxNDAxLDkgQEAKIAl9CiAKIAlhc3luY190eF9hY2sodHgpOworCWluaXRfY29tcGxldGlvbigmY21wKTsKIAl0eC0+Y2FsbGJhY2sgPSBpb2F0X2RtYV90ZXN0X2NhbGxiYWNrOwotCXR4LT5jYWxsYmFja19wYXJhbSA9ICh2b2lkICopMHg4MDg2OworCXR4LT5jYWxsYmFja19wYXJhbSA9ICZjbXA7CiAJY29va2llID0gdHgtPnR4X3N1Ym1pdCh0eCk7CiAJaWYgKGNvb2tpZSA8IDApIHsKIAkJZGV2X2VycigmZGV2aWNlLT5wZGV2LT5kZXYsCkBAIC0xNDEzLDcgKzE0MTMsNyBAQAogCX0KIAlkZXZpY2UtPmNvbW1vbi5kZXZpY2VfaXNzdWVfcGVuZGluZyhkbWFfY2hhbik7CiAKLQl3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnRlc3RfY29tcGxldGlvbiwgbXNlY3NfdG9famlmZmllcygzMDAwKSk7CisJd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZjbXAsIG1zZWNzX3RvX2ppZmZpZXMoMzAwMCkpOwogCiAJaWYgKGRldmljZS0+Y29tbW9uLmRldmljZV9pc190eF9jb21wbGV0ZShkbWFfY2hhbiwgY29va2llLCBOVUxMLCBOVUxMKQogCQkJCQkhPSBETUFfU1VDQ0VTUykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvaW9wLWFkbWEuYyBiL2RyaXZlcnMvZG1hL2lvcC1hZG1hLmMKaW5kZXggNmJlMzE3Mi4uZWE1NDQwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvaW9wLWFkbWEuYworKysgYi9kcml2ZXJzL2RtYS9pb3AtYWRtYS5jCkBAIC0yNCw3ICsyNCw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvYXN5bmNfdHguaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KQEAgLTExNiw3ICsxMTUsNyBAQAogCX0KIAogCS8qIHJ1biBkZXBlbmRlbnQgb3BlcmF0aW9ucyAqLwotCWFzeW5jX3R4X3J1bl9kZXBlbmRlbmNpZXMoJmRlc2MtPmFzeW5jX3R4KTsKKwlkbWFfcnVuX2RlcGVuZGVuY2llcygmZGVzYy0+YXN5bmNfdHgpOwogCiAJcmV0dXJuIGNvb2tpZTsKIH0KQEAgLTI3MCw4ICsyNjksNiBAQAogCQkJYnJlYWs7CiAJfQogCi0JQlVHX09OKCFzZWVuX2N1cnJlbnQpOwotCiAJaWYgKGNvb2tpZSA+IDApIHsKIAkJaW9wX2NoYW4tPmNvbXBsZXRlZF9jb29raWUgPSBjb29raWU7CiAJCXByX2RlYnVnKCJcdGNvbXBsZXRlZCBjb29raWUgJWRcbiIsIGNvb2tpZSk7CkBAIC00NzEsOCArNDY4LDcgQEAKICAqIGdyZWF0ZXIgdGhhbiAyeCB0aGUgbnVtYmVyIHNsb3RzIG5lZWRlZCB0byBzYXRpc2Z5IGEgZGV2aWNlLT5tYXhfeG9yCiAgKiByZXF1ZXN0LgogICogKi8KLXN0YXRpYyBpbnQgaW9wX2FkbWFfYWxsb2NfY2hhbl9yZXNvdXJjZXMoc3RydWN0IGRtYV9jaGFuICpjaGFuLAotCQkJCQkgc3RydWN0IGRtYV9jbGllbnQgKmNsaWVudCkKK3N0YXRpYyBpbnQgaW9wX2FkbWFfYWxsb2NfY2hhbl9yZXNvdXJjZXMoc3RydWN0IGRtYV9jaGFuICpjaGFuKQogewogCWNoYXIgKmh3X2Rlc2M7CiAJaW50IGlkeDsKQEAgLTg2Niw3ICs4NjIsNyBAQAogCWRtYV9jaGFuID0gY29udGFpbmVyX29mKGRldmljZS0+Y29tbW9uLmNoYW5uZWxzLm5leHQsCiAJCQkJc3RydWN0IGRtYV9jaGFuLAogCQkJCWRldmljZV9ub2RlKTsKLQlpZiAoaW9wX2FkbWFfYWxsb2NfY2hhbl9yZXNvdXJjZXMoZG1hX2NoYW4sIE5VTEwpIDwgMSkgeworCWlmIChpb3BfYWRtYV9hbGxvY19jaGFuX3Jlc291cmNlcyhkbWFfY2hhbikgPCAxKSB7CiAJCWVyciA9IC1FTk9ERVY7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTk2NCw3ICs5NjAsNyBAQAogCWRtYV9jaGFuID0gY29udGFpbmVyX29mKGRldmljZS0+Y29tbW9uLmNoYW5uZWxzLm5leHQsCiAJCQkJc3RydWN0IGRtYV9jaGFuLAogCQkJCWRldmljZV9ub2RlKTsKLQlpZiAoaW9wX2FkbWFfYWxsb2NfY2hhbl9yZXNvdXJjZXMoZG1hX2NoYW4sIE5VTEwpIDwgMSkgeworCWlmIChpb3BfYWRtYV9hbGxvY19jaGFuX3Jlc291cmNlcyhkbWFfY2hhbikgPCAxKSB7CiAJCWVyciA9IC1FTk9ERVY7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTExMTUsMjYgKzExMTEsMTMgQEAKIAlzdHJ1Y3QgaW9wX2FkbWFfZGV2aWNlICpkZXZpY2UgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgKl9jaGFuOwogCXN0cnVjdCBpb3BfYWRtYV9jaGFuICppb3BfY2hhbjsKLQlpbnQgaTsKIAlzdHJ1Y3QgaW9wX2FkbWFfcGxhdGZvcm1fZGF0YSAqcGxhdF9kYXRhID0gZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAogCWRtYV9hc3luY19kZXZpY2VfdW5yZWdpc3RlcigmZGV2aWNlLT5jb21tb24pOwogCi0JZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotCQl1bnNpZ25lZCBpbnQgaXJxOwotCQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKGRldiwgaSk7Ci0JCWZyZWVfaXJxKGlycSwgZGV2aWNlKTsKLQl9Ci0KIAlkbWFfZnJlZV9jb2hlcmVudCgmZGV2LT5kZXYsIHBsYXRfZGF0YS0+cG9vbF9zaXplLAogCQkJZGV2aWNlLT5kbWFfZGVzY19wb29sX3ZpcnQsIGRldmljZS0+ZG1hX2Rlc2NfcG9vbCk7CiAKLQlkbyB7Ci0JCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UoZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXMtPmVuZCAtIHJlcy0+c3RhcnQpOwotCX0gd2hpbGUgKDApOwotCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNoYW4sIF9jaGFuLCAmZGV2aWNlLT5jb21tb24uY2hhbm5lbHMsCiAJCQkJZGV2aWNlX25vZGUpIHsKIAkJaW9wX2NoYW4gPSB0b19pb3BfYWRtYV9jaGFuKGNoYW4pOwpAQCAtMTI1NSw3ICsxMjM4LDYgQEAKIAlzcGluX2xvY2tfaW5pdCgmaW9wX2NoYW4tPmxvY2spOwogCUlOSVRfTElTVF9IRUFEKCZpb3BfY2hhbi0+Y2hhaW4pOwogCUlOSVRfTElTVF9IRUFEKCZpb3BfY2hhbi0+YWxsX3Nsb3RzKTsKLQlJTklUX1JDVV9IRUFEKCZpb3BfY2hhbi0+Y29tbW9uLnJjdSk7CiAJaW9wX2NoYW4tPmNvbW1vbi5kZXZpY2UgPSBkbWFfZGV2OwogCWxpc3RfYWRkX3RhaWwoJmlvcF9jaGFuLT5jb21tb24uZGV2aWNlX25vZGUsICZkbWFfZGV2LT5jaGFubmVscyk7CiAKQEAgLTE0MzEsMTYgKzE0MTMsMTIgQEAKIAlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZpb3BfYWRtYV9kcml2ZXIpOwogfQogCi0vKiBpdCdzIGN1cnJlbnRseSB1bnNhZmUgdG8gdW5sb2FkIHRoaXMgbW9kdWxlICovCi0jaWYgMAogc3RhdGljIHZvaWQgX19leGl0IGlvcF9hZG1hX2V4aXQgKHZvaWQpCiB7CiAJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmlvcF9hZG1hX2RyaXZlcik7CiAJcmV0dXJuOwogfQogbW9kdWxlX2V4aXQoaW9wX2FkbWFfZXhpdCk7Ci0jZW5kaWYKLQogbW9kdWxlX2luaXQoaW9wX2FkbWFfaW5pdCk7CiAKIE1PRFVMRV9BVVRIT1IoIkludGVsIENvcnBvcmF0aW9uIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9tdl94b3IuYyBiL2RyaXZlcnMvZG1hL212X3hvci5jCmluZGV4IGJjZGExNzQuLmQzNWNiZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL212X3hvci5jCisrKyBiL2RyaXZlcnMvZG1hL212X3hvci5jCkBAIC0xOCw3ICsxOCw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvYXN5bmNfdHguaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KQEAgLTM0MCw3ICszMzksNyBAQAogCX0KIAogCS8qIHJ1biBkZXBlbmRlbnQgb3BlcmF0aW9ucyAqLwotCWFzeW5jX3R4X3J1bl9kZXBlbmRlbmNpZXMoJmRlc2MtPmFzeW5jX3R4KTsKKwlkbWFfcnVuX2RlcGVuZGVuY2llcygmZGVzYy0+YXN5bmNfdHgpOwogCiAJcmV0dXJuIGNvb2tpZTsKIH0KQEAgLTYwNyw4ICs2MDYsNyBAQAogfQogCiAvKiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYWxsb2NhdGVkIGRlc2NyaXB0b3JzICovCi1zdGF0aWMgaW50IG12X3hvcl9hbGxvY19jaGFuX3Jlc291cmNlcyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sCi0JCQkJICAgICAgIHN0cnVjdCBkbWFfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgaW50IG12X3hvcl9hbGxvY19jaGFuX3Jlc291cmNlcyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCiB7CiAJY2hhciAqaHdfZGVzYzsKIAlpbnQgaWR4OwpAQCAtOTU4LDcgKzk1Niw3IEBACiAJZG1hX2NoYW4gPSBjb250YWluZXJfb2YoZGV2aWNlLT5jb21tb24uY2hhbm5lbHMubmV4dCwKIAkJCQlzdHJ1Y3QgZG1hX2NoYW4sCiAJCQkJZGV2aWNlX25vZGUpOwotCWlmIChtdl94b3JfYWxsb2NfY2hhbl9yZXNvdXJjZXMoZG1hX2NoYW4sIE5VTEwpIDwgMSkgeworCWlmIChtdl94b3JfYWxsb2NfY2hhbl9yZXNvdXJjZXMoZG1hX2NoYW4pIDwgMSkgewogCQllcnIgPSAtRU5PREVWOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xMDUzLDcgKzEwNTEsNyBAQAogCWRtYV9jaGFuID0gY29udGFpbmVyX29mKGRldmljZS0+Y29tbW9uLmNoYW5uZWxzLm5leHQsCiAJCQkJc3RydWN0IGRtYV9jaGFuLAogCQkJCWRldmljZV9ub2RlKTsKLQlpZiAobXZfeG9yX2FsbG9jX2NoYW5fcmVzb3VyY2VzKGRtYV9jaGFuLCBOVUxMKSA8IDEpIHsKKwlpZiAobXZfeG9yX2FsbG9jX2NoYW5fcmVzb3VyY2VzKGRtYV9jaGFuKSA8IDEpIHsKIAkJZXJyID0gLUVOT0RFVjsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMTIyMSw3ICsxMjE5LDYgQEAKIAlJTklUX0xJU1RfSEVBRCgmbXZfY2hhbi0+Y2hhaW4pOwogCUlOSVRfTElTVF9IRUFEKCZtdl9jaGFuLT5jb21wbGV0ZWRfc2xvdHMpOwogCUlOSVRfTElTVF9IRUFEKCZtdl9jaGFuLT5hbGxfc2xvdHMpOwotCUlOSVRfUkNVX0hFQUQoJm12X2NoYW4tPmNvbW1vbi5yY3UpOwogCW12X2NoYW4tPmNvbW1vbi5kZXZpY2UgPSBkbWFfZGV2OwogCiAJbGlzdF9hZGRfdGFpbCgmbXZfY2hhbi0+Y29tbW9uLmRldmljZV9ub2RlLCAmZG1hX2Rldi0+Y2hhbm5lbHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL0tjb25maWcgYi9kcml2ZXJzL2VkYWMvS2NvbmZpZwppbmRleCBlMjY2N2E4Li5lZWU0N2ZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvS2NvbmZpZworKysgYi9kcml2ZXJzL2VkYWMvS2NvbmZpZwpAQCAtMTA5LDYgKzEwOSwxMyBAQAogCSAgU3VwcG9ydCBmb3IgZXJyb3IgZGV0ZWN0aW9uIGFuZCBjb3JyZWN0aW9uIG9uIHRoZSBJbnRlbAogCSAgWDM4IHNlcnZlciBjaGlwc2V0cy4KIAorY29uZmlnIEVEQUNfSTU0MDAKKwl0cmlzdGF0ZSAiSW50ZWwgNTQwMCAoU2VhYnVyZykgY2hpcHNldHMiCisJZGVwZW5kcyBvbiBFREFDX01NX0VEQUMgJiYgUENJICYmIFg4NgorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIGVycm9yIGRldGVjdGlvbiBhbmQgY29ycmVjdGlvbiB0aGUgSW50ZWwKKwkgIGk1NDAwIE1DSCBjaGlwc2V0IChTZWFidXJnKS4KKwogY29uZmlnIEVEQUNfSTgyODYwCiAJdHJpc3RhdGUgIkludGVsIDgyODYwIgogCWRlcGVuZHMgb24gRURBQ19NTV9FREFDICYmIFBDSSAmJiBYODZfMzIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9NYWtlZmlsZSBiL2RyaXZlcnMvZWRhYy9NYWtlZmlsZQppbmRleCA2MmMyZDliLi5iNzUxOTY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9lZGFjL01ha2VmaWxlCkBAIC0yMCw2ICsyMCw3IEBACiBvYmotJChDT05GSUdfRURBQ19BTUQ3NlgpCQkrPSBhbWQ3NnhfZWRhYy5vCiBvYmotJChDT05GSUdfRURBQ19JNTAwMCkJCSs9IGk1MDAwX2VkYWMubwogb2JqLSQoQ09ORklHX0VEQUNfSTUxMDApCQkrPSBpNTEwMF9lZGFjLm8KK29iai0kKENPTkZJR19FREFDX0k1NDAwKQkJKz0gaTU0MDBfZWRhYy5vCiBvYmotJChDT05GSUdfRURBQ19FN1hYWCkJCSs9IGU3eHh4X2VkYWMubwogb2JqLSQoQ09ORklHX0VEQUNfRTc1MlgpCQkrPSBlNzUyeF9lZGFjLm8KIG9iai0kKENPTkZJR19FREFDX0k4MjQ0M0JYR1gpCQkrPSBpODI0NDNieGd4X2VkYWMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2VkYWNfZGV2aWNlLmMgYi9kcml2ZXJzL2VkYWMvZWRhY19kZXZpY2UuYwppbmRleCA0MDQxZTkxLi5jYTkxMTNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvZWRhY19kZXZpY2UuYworKysgYi9kcml2ZXJzL2VkYWMvZWRhY19kZXZpY2UuYwpAQCAtMzMzLDcgKzMzMyw3IEBACiBmYWlsMDoKIAllZGFjX3ByaW50ayhLRVJOX1dBUk5JTkcsIEVEQUNfTUMsCiAJCQkiJXMgKCVzKSAlcyAlcyBhbHJlYWR5IGFzc2lnbmVkICVkXG4iLAotCQkJcm92ZXItPmRldi0+YnVzX2lkLCBlZGFjX2Rldl9uYW1lKHJvdmVyKSwKKwkJCWRldl9uYW1lKHJvdmVyLT5kZXYpLCBlZGFjX2Rldl9uYW1lKHJvdmVyKSwKIAkJCXJvdmVyLT5tb2RfbmFtZSwgcm92ZXItPmN0bF9uYW1lLCByb3Zlci0+ZGV2X2lkeCk7CiAJcmV0dXJuIDE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9lZGFjX21jLmMgYi9kcml2ZXJzL2VkYWMvZWRhY19tYy5jCmluZGV4IGQxMTAzOTIuLjI1ZDY2OTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9lZGFjX21jLmMKKysrIGIvZHJpdmVycy9lZGFjL2VkYWNfbWMuYwpAQCAtNDAxLDcgKzQwMSw3IEBACiAKIGZhaWwwOgogCWVkYWNfcHJpbnRrKEtFUk5fV0FSTklORywgRURBQ19NQywKLQkJIiVzICglcykgJXMgJXMgYWxyZWFkeSBhc3NpZ25lZCAlZFxuIiwgcC0+ZGV2LT5idXNfaWQsCisJCSIlcyAoJXMpICVzICVzIGFscmVhZHkgYXNzaWduZWQgJWRcbiIsIGRldl9uYW1lKHAtPmRldiksCiAJCWVkYWNfZGV2X25hbWUobWNpKSwgcC0+bW9kX25hbWUsIHAtPmN0bF9uYW1lLCBwLT5tY19pZHgpOwogCXJldHVybiAxOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvZWRhY19wY2kuYyBiL2RyaXZlcnMvZWRhYy9lZGFjX3BjaS5jCmluZGV4IDIyZWM5ZDUuLjVkM2M4MDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9lZGFjX3BjaS5jCisrKyBiL2RyaXZlcnMvZWRhYy9lZGFjX3BjaS5jCkBAIC0xNTAsNyArMTUwLDcgQEAKIGZhaWwwOgogCWVkYWNfcHJpbnRrKEtFUk5fV0FSTklORywgRURBQ19QQ0ksCiAJCSIlcyAoJXMpICVzICVzIGFscmVhZHkgYXNzaWduZWQgJWRcbiIsCi0JCXJvdmVyLT5kZXYtPmJ1c19pZCwgZWRhY19kZXZfbmFtZShyb3ZlciksCisJCWRldl9uYW1lKHJvdmVyLT5kZXYpLCBlZGFjX2Rldl9uYW1lKHJvdmVyKSwKIAkJcm92ZXItPm1vZF9uYW1lLCByb3Zlci0+Y3RsX25hbWUsIHJvdmVyLT5wY2lfaWR4KTsKIAlyZXR1cm4gMTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2VkYWNfcGNpX3N5c2ZzLmMgYi9kcml2ZXJzL2VkYWMvZWRhY19wY2lfc3lzZnMuYwppbmRleCA1YzE1M2RjLi40MjI3MjhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvZWRhY19wY2lfc3lzZnMuYworKysgYi9kcml2ZXJzL2VkYWMvZWRhY19wY2lfc3lzZnMuYwpAQCAtNTY5LDcgKzU2OSw3IEBACiAKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAKLQlkZWJ1Z2Y0KCJQQ0kgU1RBVFVTPSAweCUwNHggJXNcbiIsIHN0YXR1cywgZGV2LT5kZXYuYnVzX2lkKTsKKwlkZWJ1Z2Y0KCJQQ0kgU1RBVFVTPSAweCUwNHggJXNcbiIsIHN0YXR1cywgZGV2X25hbWUoJmRldi0+ZGV2KSk7CiAKIAkvKiBjaGVjayB0aGUgc3RhdHVzIHJlZyBmb3IgZXJyb3JzIG9uIGJvYXJkcyBOT1QgbWFya2VkIGFzIGJyb2tlbgogCSAqIGlmIGJyb2tlbiwgd2UgY2Fubm90IHRydXN0IGFueSBvZiB0aGUgc3RhdHVzIGJpdHMKQEAgLTYwMCwxMyArNjAwLDEzIEBACiAJfQogCiAKLQlkZWJ1Z2Y0KCJQQ0kgSEVBREVSIFRZUEU9IDB4JTAyeCAlc1xuIiwgaGVhZGVyX3R5cGUsIGRldi0+ZGV2LmJ1c19pZCk7CisJZGVidWdmNCgiUENJIEhFQURFUiBUWVBFPSAweCUwMnggJXNcbiIsIGhlYWRlcl90eXBlLCBkZXZfbmFtZSgmZGV2LT5kZXYpKTsKIAogCWlmICgoaGVhZGVyX3R5cGUgJiAweDdGKSA9PSBQQ0lfSEVBREVSX1RZUEVfQlJJREdFKSB7CiAJCS8qIE9uIGJyaWRnZXMsIG5lZWQgdG8gZXhhbWluZSBzZWNvbmRhcnkgc3RhdHVzIHJlZ2lzdGVyICAqLwogCQlzdGF0dXMgPSBnZXRfcGNpX3Bhcml0eV9zdGF0dXMoZGV2LCAxKTsKIAotCQlkZWJ1Z2Y0KCJQQ0kgU0VDX1NUQVRVUz0gMHglMDR4ICVzXG4iLCBzdGF0dXMsIGRldi0+ZGV2LmJ1c19pZCk7CisJCWRlYnVnZjQoIlBDSSBTRUNfU1RBVFVTPSAweCUwNHggJXNcbiIsIHN0YXR1cywgZGV2X25hbWUoJmRldi0+ZGV2KSk7CiAKIAkJLyogY2hlY2sgdGhlIHNlY29uZGFyeSBzdGF0dXMgcmVnIGZvciBlcnJvcnMsCiAJCSAqIG9uIE5PVCBicm9rZW4gYm9hcmRzCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvaTU0MDBfZWRhYy5jIGIvZHJpdmVycy9lZGFjL2k1NDAwX2VkYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDhiNmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9lZGFjL2k1NDAwX2VkYWMuYwpAQCAtMCwwICsxLDE0NzYgQEAKKy8qCisgKiBJbnRlbCA1NDAwIGNsYXNzIE1lbW9yeSBDb250cm9sbGVycyBrZXJuZWwgbW9kdWxlIChTZWFidXJnKQorICoKKyAqIFRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5OgorICoJIEJlbiBXb29kYXJkIDx3b29kYXJkQHJlZGhhdC5jb20+CisgKgkgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQHJlZGhhdC5jb20+CisgKgorICogUmVkIEhhdCBJbmMuIGh0dHA6Ly93d3cucmVkaGF0LmNvbQorICoKKyAqIEZvcmtlZCBhbmQgYWRhcHRlZCBmcm9tIHRoZSBpNTAwMF9lZGFjIGRyaXZlciB3aGljaCB3YXMKKyAqIHdyaXR0ZW4gYnkgRG91Z2xhcyBUaG9tcHNvbiBMaW51eCBOZXR3b3J4IDxub3JzazVAeG1pc3Npb24uY29tPgorICoKKyAqIFRoaXMgbW9kdWxlIGlzIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgZG9jdW1lbnQ6CisgKgorICogSW50ZWwgNTQwMCBDaGlwc2V0IE1lbW9yeSBDb250cm9sbGVyIEh1YiAoTUNIKSAtIERhdGFzaGVldAorICogCWh0dHA6Ly9kZXZlbG9wZXIuaW50ZWwuY29tL2Rlc2lnbi9jaGlwc2V0cy9kYXRhc2h0cy8zMTMwNzAuaHRtCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGNpX2lkcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lZGFjLmg+CisjaW5jbHVkZSA8bGludXgvbW16b25lLmg+CisKKyNpbmNsdWRlICJlZGFjX2NvcmUuaCIKKworLyoKKyAqIEFsdGVyIHRoaXMgdmVyc2lvbiBmb3IgdGhlIEk1NDAwIG1vZHVsZSB3aGVuIG1vZGlmaWNhdGlvbnMgYXJlIG1hZGUKKyAqLworI2RlZmluZSBJNTQwMF9SRVZJU0lPTiAgICAiIFZlcjogMS4wLjAgIiBfX0RBVEVfXworCisjZGVmaW5lIEVEQUNfTU9EX1NUUiAgICAgICJpNTQwMF9lZGFjIgorCisjZGVmaW5lIGk1NDAwX3ByaW50ayhsZXZlbCwgZm10LCBhcmcuLi4pIFwKKwllZGFjX3ByaW50ayhsZXZlbCwgImk1NDAwIiwgZm10LCAjI2FyZykKKworI2RlZmluZSBpNTQwMF9tY19wcmludGsobWNpLCBsZXZlbCwgZm10LCBhcmcuLi4pIFwKKwllZGFjX21jX2NoaXBzZXRfcHJpbnRrKG1jaSwgbGV2ZWwsICJpNTQwMCIsIGZtdCwgIyNhcmcpCisKKy8qIExpbWl0cyBmb3IgaTU0MDAgKi8KKyNkZWZpbmUgTlVNX01UUlNfUEVSX0JSQU5DSAk0CisjZGVmaW5lIENIQU5ORUxTX1BFUl9CUkFOQ0gJMgorI2RlZmluZQlNQVhfQ0hBTk5FTFMJCTQKKyNkZWZpbmUgTUFYX0RJTU1TCQkoTUFYX0NIQU5ORUxTICogNCkJLyogVXAgdG8gNCBESU1NJ3MgcGVyIGNoYW5uZWwgKi8KKyNkZWZpbmUgTUFYX0NTUk9XUwkJKE1BWF9ESU1NUyAqIDIpCQkvKiBtYXggcG9zc2libGUgY3Nyb3dzIHBlciBjaGFubmVsICovCisKKy8qIERldmljZSAxNiwKKyAqIEZ1bmN0aW9uIDA6IFN5c3RlbSBBZGRyZXNzCisgKiBGdW5jdGlvbiAxOiBNZW1vcnkgQnJhbmNoIE1hcCwgQ29udHJvbCwgRXJyb3JzIFJlZ2lzdGVyCisgKiBGdW5jdGlvbiAyOiBGU0IgRXJyb3IgUmVnaXN0ZXJzCisgKgorICogQWxsIDMgZnVuY3Rpb25zIG9mIERldmljZSAxNiAoMCwxLDIpIHNoYXJlIHRoZSBTQU1FIERJRCBhbmQKKyAqIHVzZXMgUENJX0RFVklDRV9JRF9JTlRFTF81NDAwX0VSUiBmb3IgZGV2aWNlIDE2ICgwLDEsMiksCisgKiBQQ0lfREVWSUNFX0lEX0lOVEVMXzU0MDBfRkJEMCBhbmQgUENJX0RFVklDRV9JRF9JTlRFTF81NDAwX0ZCRDEKKyAqIGZvciBkZXZpY2UgMjEgKDAsMSkuCisgKi8KKworCS8qIE9GRlNFVFMgZm9yIEZ1bmN0aW9uIDAgKi8KKyNkZWZpbmUJCUFNQkFTRQkJCTB4NDggLyogQU1CIE1lbSBNYXBwZWQgUmVnIFJlZ2lvbiBCYXNlICovCisjZGVmaW5lCQlNQVhDSAkJCTB4NTYgLyogTWF4IENoYW5uZWwgTnVtYmVyICovCisjZGVmaW5lCQlNQVhESU1NUEVSQ0gJCTB4NTcgLyogTWF4IERJTU0gUEVSIENoYW5uZWwgTnVtYmVyICovCisKKwkvKiBPRkZTRVRTIGZvciBGdW5jdGlvbiAxICovCisjZGVmaW5lCQlUT0xNCQkJMHg2QworI2RlZmluZQkJUkVETUVNQgkJCTB4N0MKKyNkZWZpbmUJCQlSRUNfRUNDX0xPQ0FUT1JfT0REKHgpCSgoeCkgJiAweDNmZTAwKSAvKiBiaXRzIFsxNzo5XSBpbmRpY2F0ZSBPREQsIFs4OjBdICBpbmRpY2F0ZSBFVkVOICovCisjZGVmaW5lCQlNSVIwCQkJMHg4MAorI2RlZmluZQkJTUlSMQkJCTB4ODQKKyNkZWZpbmUJCUFNSVIwCQkJMHg4YworI2RlZmluZQkJQU1JUjEJCQkweDkwCisKKwkvKiBGYXRhbCBlcnJvciByZWdpc3RlcnMgKi8KKyNkZWZpbmUJCUZFUlJfRkFUX0ZCRAkJMHg5OAkvKiBhbHNvIGNhbGxlZCBhcyBGRVJSX0ZBVF9GQl9ESU1NIGF0IGRhdGFzaGVldCAqLworI2RlZmluZQkJCUZFUlJfRkFUX0ZCRENIQU4gKDM8PDI4KQkvKiBjaGFubmVsIGluZGV4IHdoZXJlIHRoZSBoaWdoZXN0LW9yZGVyIGVycm9yIG9jY3VycmVkICovCisKKyNkZWZpbmUJCU5FUlJfRkFUX0ZCRAkJMHg5YworI2RlZmluZQkJRkVSUl9ORl9GQkQJCTB4YTAJLyogYWxzbyBjYWxsZWQgYXMgRkVSUl9ORkFUX0ZCX0RJTU0gYXQgZGF0YXNoZWV0ICovCisKKwkvKiBOb24tZmF0YWwgZXJyb3IgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJCU5FUlJfTkZfRkJECQkweGE0CisKKwkvKiBFbmFibGUgZXJyb3IgbWFzayAqLworI2RlZmluZQkJRU1BU0tfRkJECQkweGE4CisKKyNkZWZpbmUJCUVSUjBfRkJECQkweGFjCisjZGVmaW5lCQlFUlIxX0ZCRAkJMHhiMAorI2RlZmluZQkJRVJSMl9GQkQJCTB4YjQKKyNkZWZpbmUJCU1DRVJSX0ZCRAkJMHhiOAorCisJLyogTm8gT0ZGU0VUUyBmb3IgRGV2aWNlIDE2IEZ1bmN0aW9uIDIgKi8KKworLyoKKyAqIERldmljZSAyMSwKKyAqIEZ1bmN0aW9uIDA6IE1lbW9yeSBNYXAgQnJhbmNoIDAKKyAqCisgKiBEZXZpY2UgMjIsCisgKiBGdW5jdGlvbiAwOiBNZW1vcnkgTWFwIEJyYW5jaCAxCisgKi8KKworCS8qIE9GRlNFVFMgZm9yIEZ1bmN0aW9uIDAgKi8KKyNkZWZpbmUgQU1CUFJFU0VOVF8wCTB4NjQKKyNkZWZpbmUgQU1CUFJFU0VOVF8xCTB4NjYKKyNkZWZpbmUgTVRSMAkJMHg4MAorI2RlZmluZSBNVFIxCQkweDgyCisjZGVmaW5lIE1UUjIJCTB4ODQKKyNkZWZpbmUgTVRSMwkJMHg4NgorCisJLyogT0ZGU0VUUyBmb3IgRnVuY3Rpb24gMSAqLworI2RlZmluZSBOUkVDRkdMT0cJCTB4NzQKKyNkZWZpbmUgUkVDRkdMT0cJCTB4NzgKKyNkZWZpbmUgTlJFQ01FTUEJCTB4YmUKKyNkZWZpbmUgTlJFQ01FTUIJCTB4YzAKKyNkZWZpbmUgTlJFQ0ZCX0RJTU1BCQkweGM0CisjZGVmaW5lIE5SRUNGQl9ESU1NQgkJMHhjOAorI2RlZmluZSBOUkVDRkJfRElNTUMJCTB4Y2MKKyNkZWZpbmUgTlJFQ0ZCX0RJTU1ECQkweGQwCisjZGVmaW5lIE5SRUNGQl9ESU1NRQkJMHhkNAorI2RlZmluZSBOUkVDRkJfRElNTUYJCTB4ZDgKKyNkZWZpbmUgUkVETUVNQQkJCTB4ZEMKKyNkZWZpbmUgUkVDTUVNQQkJCTB4ZjAKKyNkZWZpbmUgUkVDTUVNQgkJCTB4ZjQKKyNkZWZpbmUgUkVDRkJfRElNTUEJCTB4ZjgKKyNkZWZpbmUgUkVDRkJfRElNTUIJCTB4ZWMKKyNkZWZpbmUgUkVDRkJfRElNTUMJCTB4ZjAKKyNkZWZpbmUgUkVDRkJfRElNTUQJCTB4ZjQKKyNkZWZpbmUgUkVDRkJfRElNTUUJCTB4ZjgKKyNkZWZpbmUgUkVDRkJfRElNTUYJCTB4ZkMKKworLyoKKyAqIEVycm9yIGluZGljYXRvciBiaXRzIGFuZCBtYXNrcworICogRXJyb3IgbWFza3MgYXJlIGFjY29yZGluZyB3aXRoIFRhYmxlIDUtMTcgb2YgaTU0MDAgZGF0YXNoZWV0CisgKi8KKworZW51bSBlcnJvcl9tYXNrIHsKKwlFTUFTS19NMSAgPSAxPDwwLCAgLyogTWVtb3J5IFdyaXRlIGVycm9yIG9uIG5vbi1yZWR1bmRhbnQgcmV0cnkgKi8KKwlFTUFTS19NMiAgPSAxPDwxLCAgLyogTWVtb3J5IG9yIEZCLURJTU0gY29uZmlndXJhdGlvbiBDUkMgcmVhZCBlcnJvciAqLworCUVNQVNLX00zICA9IDE8PDIsICAvKiBSZXNlcnZlZCAqLworCUVNQVNLX000ICA9IDE8PDMsICAvKiBVbmNvcnJlY3RhYmxlIERhdGEgRUNDIG9uIFJlcGxheSAqLworCUVNQVNLX001ICA9IDE8PDQsICAvKiBBbGlhc2VkIFVuY29ycmVjdGFibGUgTm9uLU1pcnJvcmVkIERlbWFuZCBEYXRhIEVDQyAqLworCUVNQVNLX002ICA9IDE8PDUsICAvKiBVbnN1cHBvcnRlZCBvbiBpNTQwMCAqLworCUVNQVNLX003ICA9IDE8PDYsICAvKiBBbGlhc2VkIFVuY29ycmVjdGFibGUgUmVzaWx2ZXItIG9yIFNwYXJlLUNvcHkgRGF0YSBFQ0MgKi8KKwlFTUFTS19NOCAgPSAxPDw3LCAgLyogQWxpYXNlZCBVbmNvcnJlY3RhYmxlIFBhdHJvbCBEYXRhIEVDQyAqLworCUVNQVNLX005ICA9IDE8PDgsICAvKiBOb24tQWxpYXNlZCBVbmNvcnJlY3RhYmxlIE5vbi1NaXJyb3JlZCBEZW1hbmQgRGF0YSBFQ0MgKi8KKwlFTUFTS19NMTAgPSAxPDw5LCAgLyogVW5zdXBwb3J0ZWQgb24gaTU0MDAgKi8KKwlFTUFTS19NMTEgPSAxPDwxMCwgLyogTm9uLUFsaWFzZWQgVW5jb3JyZWN0YWJsZSBSZXNpbHZlci0gb3IgU3BhcmUtQ29weSBEYXRhIEVDQyAgKi8KKwlFTUFTS19NMTIgPSAxPDwxMSwgLyogTm9uLUFsaWFzZWQgVW5jb3JyZWN0YWJsZSBQYXRyb2wgRGF0YSBFQ0MgKi8KKwlFTUFTS19NMTMgPSAxPDwxMiwgLyogTWVtb3J5IFdyaXRlIGVycm9yIG9uIGZpcnN0IGF0dGVtcHQgKi8KKwlFTUFTS19NMTQgPSAxPDwxMywgLyogRkItRElNTSBDb25maWd1cmF0aW9uIFdyaXRlIGVycm9yIG9uIGZpcnN0IGF0dGVtcHQgKi8KKwlFTUFTS19NMTUgPSAxPDwxNCwgLyogTWVtb3J5IG9yIEZCLURJTU0gY29uZmlndXJhdGlvbiBDUkMgcmVhZCBlcnJvciAqLworCUVNQVNLX00xNiA9IDE8PDE1LCAvKiBDaGFubmVsIEZhaWxlZC1PdmVyIE9jY3VycmVkICovCisJRU1BU0tfTTE3ID0gMTw8MTYsIC8qIENvcnJlY3RhYmxlIE5vbi1NaXJyb3JlZCBEZW1hbmQgRGF0YSBFQ0MgKi8KKwlFTUFTS19NMTggPSAxPDwxNywgLyogVW5zdXBwb3J0ZWQgb24gaTU0MDAgKi8KKwlFTUFTS19NMTkgPSAxPDwxOCwgLyogQ29ycmVjdGFibGUgUmVzaWx2ZXItIG9yIFNwYXJlLUNvcHkgRGF0YSBFQ0MgKi8KKwlFTUFTS19NMjAgPSAxPDwxOSwgLyogQ29ycmVjdGFibGUgUGF0cm9sIERhdGEgRUNDICovCisJRU1BU0tfTTIxID0gMTw8MjAsIC8qIEZCLURJTU0gTm9ydGhib3VuZCBwYXJpdHkgZXJyb3Igb24gRkItRElNTSBTeW5jIFN0YXR1cyAqLworCUVNQVNLX00yMiA9IDE8PDIxLCAvKiBTUEQgcHJvdG9jb2wgRXJyb3IgKi8KKwlFTUFTS19NMjMgPSAxPDwyMiwgLyogTm9uLVJlZHVuZGFudCBGYXN0IFJlc2V0IFRpbWVvdXQgKi8KKwlFTUFTS19NMjQgPSAxPDwyMywgLyogUmVmcmVzaCBlcnJvciAqLworCUVNQVNLX00yNSA9IDE8PDI0LCAvKiBNZW1vcnkgV3JpdGUgZXJyb3Igb24gcmVkdW5kYW50IHJldHJ5ICovCisJRU1BU0tfTTI2ID0gMTw8MjUsIC8qIFJlZHVuZGFudCBGYXN0IFJlc2V0IFRpbWVvdXQgKi8KKwlFTUFTS19NMjcgPSAxPDwyNiwgLyogQ29ycmVjdGFibGUgQ291bnRlciBUaHJlc2hvbGQgRXhjZWVkZWQgKi8KKwlFTUFTS19NMjggPSAxPDwyNywgLyogRElNTS1TcGFyZSBDb3B5IENvbXBsZXRlZCAqLworCUVNQVNLX00yOSA9IDE8PDI4LCAvKiBESU1NLUlzb2xhdGlvbiBDb21wbGV0ZWQgKi8KK307CisKKy8qCisgKiBOYW1lcyB0byB0cmFuc2xhdGUgYml0IGVycm9yIGludG8gc29tZXRoaW5nIHVzZWZ1bAorICovCitzdGF0aWMgY29uc3QgY2hhciAqZXJyb3JfbmFtZVtdID0geworCVswXSAgPSAiTWVtb3J5IFdyaXRlIGVycm9yIG9uIG5vbi1yZWR1bmRhbnQgcmV0cnkiLAorCVsxXSAgPSAiTWVtb3J5IG9yIEZCLURJTU0gY29uZmlndXJhdGlvbiBDUkMgcmVhZCBlcnJvciIsCisJLyogUmVzZXJ2ZWQgKi8KKwlbM10gID0gIlVuY29ycmVjdGFibGUgRGF0YSBFQ0Mgb24gUmVwbGF5IiwKKwlbNF0gID0gIkFsaWFzZWQgVW5jb3JyZWN0YWJsZSBOb24tTWlycm9yZWQgRGVtYW5kIERhdGEgRUNDIiwKKwkvKiBNNiBVbnN1cHBvcnRlZCBvbiBpNTQwMCAqLworCVs2XSAgPSAiQWxpYXNlZCBVbmNvcnJlY3RhYmxlIFJlc2lsdmVyLSBvciBTcGFyZS1Db3B5IERhdGEgRUNDIiwKKwlbN10gID0gIkFsaWFzZWQgVW5jb3JyZWN0YWJsZSBQYXRyb2wgRGF0YSBFQ0MiLAorCVs4XSAgPSAiTm9uLUFsaWFzZWQgVW5jb3JyZWN0YWJsZSBOb24tTWlycm9yZWQgRGVtYW5kIERhdGEgRUNDIiwKKwkvKiBNMTAgVW5zdXBwb3J0ZWQgb24gaTU0MDAgKi8KKwlbMTBdID0gIk5vbi1BbGlhc2VkIFVuY29ycmVjdGFibGUgUmVzaWx2ZXItIG9yIFNwYXJlLUNvcHkgRGF0YSBFQ0MiLAorCVsxMV0gPSAiTm9uLUFsaWFzZWQgVW5jb3JyZWN0YWJsZSBQYXRyb2wgRGF0YSBFQ0MiLAorCVsxMl0gPSAiTWVtb3J5IFdyaXRlIGVycm9yIG9uIGZpcnN0IGF0dGVtcHQiLAorCVsxM10gPSAiRkItRElNTSBDb25maWd1cmF0aW9uIFdyaXRlIGVycm9yIG9uIGZpcnN0IGF0dGVtcHQiLAorCVsxNF0gPSAiTWVtb3J5IG9yIEZCLURJTU0gY29uZmlndXJhdGlvbiBDUkMgcmVhZCBlcnJvciIsCisJWzE1XSA9ICJDaGFubmVsIEZhaWxlZC1PdmVyIE9jY3VycmVkIiwKKwlbMTZdID0gIkNvcnJlY3RhYmxlIE5vbi1NaXJyb3JlZCBEZW1hbmQgRGF0YSBFQ0MiLAorCS8qIE0xOCBVbnN1cHBvcnRlZCBvbiBpNTQwMCAqLworCVsxOF0gPSAiQ29ycmVjdGFibGUgUmVzaWx2ZXItIG9yIFNwYXJlLUNvcHkgRGF0YSBFQ0MiLAorCVsxOV0gPSAiQ29ycmVjdGFibGUgUGF0cm9sIERhdGEgRUNDIiwKKwlbMjBdID0gIkZCLURJTU0gTm9ydGhib3VuZCBwYXJpdHkgZXJyb3Igb24gRkItRElNTSBTeW5jIFN0YXR1cyIsCisJWzIxXSA9ICJTUEQgcHJvdG9jb2wgRXJyb3IiLAorCVsyMl0gPSAiTm9uLVJlZHVuZGFudCBGYXN0IFJlc2V0IFRpbWVvdXQiLAorCVsyM10gPSAiUmVmcmVzaCBlcnJvciIsCisJWzI0XSA9ICJNZW1vcnkgV3JpdGUgZXJyb3Igb24gcmVkdW5kYW50IHJldHJ5IiwKKwlbMjVdID0gIlJlZHVuZGFudCBGYXN0IFJlc2V0IFRpbWVvdXQiLAorCVsyNl0gPSAiQ29ycmVjdGFibGUgQ291bnRlciBUaHJlc2hvbGQgRXhjZWVkZWQiLAorCVsyN10gPSAiRElNTS1TcGFyZSBDb3B5IENvbXBsZXRlZCIsCisJWzI4XSA9ICJESU1NLUlzb2xhdGlvbiBDb21wbGV0ZWQiLAorfTsKKworLyogRmF0YWwgZXJyb3JzICovCisjZGVmaW5lIEVSUk9SX0ZBVF9NQVNLCQkoRU1BU0tfTTEgfCBcCisJCQkJIEVNQVNLX00yIHwgXAorCQkJCSBFTUFTS19NMjMpCisKKy8qIENvcnJlY3RhYmxlIGVycm9ycyAqLworI2RlZmluZSBFUlJPUl9ORl9DT1JSRUNUQUJMRQkoRU1BU0tfTTI3IHwgXAorCQkJCSBFTUFTS19NMjAgfCBcCisJCQkJIEVNQVNLX00xOSB8IFwKKwkJCQkgRU1BU0tfTTE4IHwgXAorCQkJCSBFTUFTS19NMTcgfCBcCisJCQkJIEVNQVNLX00xNikKKyNkZWZpbmUgRVJST1JfTkZfRElNTV9TUEFSRQkoRU1BU0tfTTI5IHwgXAorCQkJCSBFTUFTS19NMjgpCisjZGVmaW5lIEVSUk9SX05GX1NQRF9QUk9UT0NPTAkoRU1BU0tfTTIyKQorI2RlZmluZSBFUlJPUl9ORl9OT1JUSF9DUkMJKEVNQVNLX00yMSkKKworLyogUmVjb3ZlcmFibGUgZXJyb3JzICovCisjZGVmaW5lIEVSUk9SX05GX1JFQ09WRVJBQkxFCShFTUFTS19NMjYgfCBcCisJCQkJIEVNQVNLX00yNSB8IFwKKwkJCQkgRU1BU0tfTTI0IHwgXAorCQkJCSBFTUFTS19NMTUgfCBcCisJCQkJIEVNQVNLX00xNCB8IFwKKwkJCQkgRU1BU0tfTTEzIHwgXAorCQkJCSBFTUFTS19NMTIgfCBcCisJCQkJIEVNQVNLX00xMSB8IFwKKwkJCQkgRU1BU0tfTTkgIHwgXAorCQkJCSBFTUFTS19NOCAgfCBcCisJCQkJIEVNQVNLX003ICB8IFwKKwkJCQkgRU1BU0tfTTUpCisKKy8qIHVuY29ycmVjdGFibGUgZXJyb3JzICovCisjZGVmaW5lIEVSUk9SX05GX1VOQ09SUkVDVEFCTEUJKEVNQVNLX000KQorCisvKiBtYXNrIHRvIGFsbCBub24tZmF0YWwgZXJyb3JzICovCisjZGVmaW5lIEVSUk9SX05GX01BU0sJCShFUlJPUl9ORl9DT1JSRUNUQUJMRSAgIHwgXAorCQkJCSBFUlJPUl9ORl9VTkNPUlJFQ1RBQkxFIHwgXAorCQkJCSBFUlJPUl9ORl9SRUNPVkVSQUJMRSAgIHwgXAorCQkJCSBFUlJPUl9ORl9ESU1NX1NQQVJFICAgIHwgXAorCQkJCSBFUlJPUl9ORl9TUERfUFJPVE9DT0wgIHwgXAorCQkJCSBFUlJPUl9ORl9OT1JUSF9DUkMpCisKKy8qCisgKiBEZWZpbmUgZXJyb3IgbWFza3MgZm9yIHRoZSBzZXZlcmFsIHJlZ2lzdGVycworICovCisKKy8qIEVuYWJsZSBhbGwgZmF0YWwgYW5kIG5vbiBmYXRhbCBlcnJvcnMgKi8KKyNkZWZpbmUgRU5BQkxFX0VNQVNLX0FMTAkoRVJST1JfRkFUX01BU0sgfCBFUlJPUl9ORl9NQVNLKQorCisvKiBtYXNrIGZvciBmYXRhbCBlcnJvciByZWdpc3RlcnMgKi8KKyNkZWZpbmUgRkVSUl9GQVRfTUFTSyBFUlJPUl9GQVRfTUFTSworCisvKiBtYXNrcyBmb3Igbm9uLWZhdGFsIGVycm9yIHJlZ2lzdGVyICovCitzdGF0aWMgaW5saW5lIGludCB0b19uZl9tYXNrKHVuc2lnbmVkIGludCBtYXNrKQoreworCXJldHVybiAobWFzayAmIEVNQVNLX00yOSkgfCAobWFzayA+PiAzKTsKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IGZyb21fbmZfZmVycih1bnNpZ25lZCBpbnQgbWFzaykKK3sKKwlyZXR1cm4gKG1hc2sgJiBFTUFTS19NMjkpIHwJCS8qIEJpdCAyOCAqLworCSAgICAgICAobWFzayAmICgoMSA8PCAyOCkgLSAxKSA8PCAzKTsJLyogQml0cyAwIHRvIDI3ICovCit9OworCisjZGVmaW5lIEZFUlJfTkZfTUFTSwkJdG9fbmZfbWFzayhFUlJPUl9ORl9NQVNLKQorI2RlZmluZSBGRVJSX05GX0NPUlJFQ1RBQkxFCXRvX25mX21hc2soRVJST1JfTkZfQ09SUkVDVEFCTEUpCisjZGVmaW5lIEZFUlJfTkZfRElNTV9TUEFSRQl0b19uZl9tYXNrKEVSUk9SX05GX0RJTU1fU1BBUkUpCisjZGVmaW5lIEZFUlJfTkZfU1BEX1BST1RPQ09MCXRvX25mX21hc2soRVJST1JfTkZfU1BEX1BST1RPQ09MKQorI2RlZmluZSBGRVJSX05GX05PUlRIX0NSQwl0b19uZl9tYXNrKEVSUk9SX05GX05PUlRIX0NSQykKKyNkZWZpbmUgRkVSUl9ORl9SRUNPVkVSQUJMRQl0b19uZl9tYXNrKEVSUk9SX05GX1JFQ09WRVJBQkxFKQorI2RlZmluZSBGRVJSX05GX1VOQ09SUkVDVEFCTEUJdG9fbmZfbWFzayhFUlJPUl9ORl9VTkNPUlJFQ1RBQkxFKQorCisvKiBEZWZpbmVzIHRvIGV4dHJhY3QgdGhlIHZhaW91cyBmaWVsZHMgZnJvbSB0aGUKKyAqCU1UUnggLSBNZW1vcnkgVGVjaG5vbG9neSBSZWdpc3RlcnMKKyAqLworI2RlZmluZSBNVFJfRElNTVNfUFJFU0VOVChtdHIpCQkoKG10cikgJiAoMSA8PCAxMCkpCisjZGVmaW5lIE1UUl9ESU1NU19FVEhST1RUTEUobXRyKQkoKG10cikgJiAoMSA8PCA5KSkKKyNkZWZpbmUgTVRSX0RSQU1fV0lEVEgobXRyKQkJKCgobXRyKSAmICgxIDw8IDgpKSA/IDggOiA0KQorI2RlZmluZSBNVFJfRFJBTV9CQU5LUyhtdHIpCQkoKChtdHIpICYgKDEgPDwgNikpID8gOCA6IDQpCisjZGVmaW5lIE1UUl9EUkFNX0JBTktTX0FERFJfQklUUyhtdHIpCSgoTVRSX0RSQU1fQkFOS1MobXRyKSA9PSA4KSA/IDMgOiAyKQorI2RlZmluZSBNVFJfRElNTV9SQU5LKG10cikJCSgoKG10cikgPj4gNSkgJiAweDEpCisjZGVmaW5lIE1UUl9ESU1NX1JBTktfQUREUl9CSVRTKG10cikJKE1UUl9ESU1NX1JBTksobXRyKSA/IDIgOiAxKQorI2RlZmluZSBNVFJfRElNTV9ST1dTKG10cikJCSgoKG10cikgPj4gMikgJiAweDMpCisjZGVmaW5lIE1UUl9ESU1NX1JPV1NfQUREUl9CSVRTKG10cikJKE1UUl9ESU1NX1JPV1MobXRyKSArIDEzKQorI2RlZmluZSBNVFJfRElNTV9DT0xTKG10cikJCSgobXRyKSAmIDB4MykKKyNkZWZpbmUgTVRSX0RJTU1fQ09MU19BRERSX0JJVFMobXRyKQkoTVRSX0RJTU1fQ09MUyhtdHIpICsgMTApCisKKy8qIFRoaXMgYXBwbGllcyB0byBGRVJSX05GX0ZCLURJTU0gYXMgd2VsbCBhcyBGRVJSX0ZBVF9GQi1ESU1NICovCitzdGF0aWMgaW5saW5lIGludCBleHRyYWN0X2ZiZGNoYW5faW5keCh1MzIgeCkKK3sKKwlyZXR1cm4gKHg+PjI4KSAmIDB4MzsKK30KKworI2lmZGVmIENPTkZJR19FREFDX0RFQlVHCisvKiBNVFIgTlVNUk9XICovCitzdGF0aWMgY29uc3QgY2hhciAqbnVtcm93X3RvU3RyaW5nW10gPSB7CisJIjgsMTkyIC0gMTMgcm93cyIsCisJIjE2LDM4NCAtIDE0IHJvd3MiLAorCSIzMiw3NjggLSAxNSByb3dzIiwKKwkiNjUsNTM2IC0gMTYgcm93cyIKK307CisKKy8qIE1UUiBOVU1DT0wgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpudW1jb2xfdG9TdHJpbmdbXSA9IHsKKwkiMSwwMjQgLSAxMCBjb2x1bW5zIiwKKwkiMiwwNDggLSAxMSBjb2x1bW5zIiwKKwkiNCwwOTYgLSAxMiBjb2x1bW5zIiwKKwkicmVzZXJ2ZWQiCit9OworI2VuZGlmCisKKy8qIERldmljZSBuYW1lIGFuZCByZWdpc3RlciBESUQgKERldmljZSBJRCkgKi8KK3N0cnVjdCBpNTQwMF9kZXZfaW5mbyB7CisJY29uc3QgY2hhciAqY3RsX25hbWU7CS8qIG5hbWUgZm9yIHRoaXMgZGV2aWNlICovCisJdTE2IGZzYl9tYXBwaW5nX2Vycm9yczsJLyogRElEIGZvciB0aGUgYnJhbmNobWFwLGNvbnRyb2wgKi8KK307CisKKy8qIFRhYmxlIG9mIGRldmljZXMgYXR0cmlidXRlcyBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTU0MDBfZGV2X2luZm8gaTU0MDBfZGV2c1tdID0geworCXsKKwkJLmN0bF9uYW1lID0gIkk1NDAwIiwKKwkJLmZzYl9tYXBwaW5nX2Vycm9ycyA9IFBDSV9ERVZJQ0VfSURfSU5URUxfNTQwMF9FUlIsCisJfSwKK307CisKK3N0cnVjdCBpNTQwMF9kaW1tX2luZm8geworCWludCBtZWdhYnl0ZXM7CQkvKiBzaXplLCAwIG1lYW5zIG5vdCBwcmVzZW50ICAqLworCWludCBkdWFsX3Jhbms7Cit9OworCisvKiBkcml2ZXIgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSAqLworc3RydWN0IGk1NDAwX3B2dCB7CisJc3RydWN0IHBjaV9kZXYgKnN5c3RlbV9hZGRyZXNzOwkJLyogMTYuMCAqLworCXN0cnVjdCBwY2lfZGV2ICpicmFuY2htYXBfd2Vycm9yczsJLyogMTYuMSAqLworCXN0cnVjdCBwY2lfZGV2ICpmc2JfZXJyb3JfcmVnczsJCS8qIDE2LjIgKi8KKwlzdHJ1Y3QgcGNpX2RldiAqYnJhbmNoXzA7CQkvKiAyMS4wICovCisJc3RydWN0IHBjaV9kZXYgKmJyYW5jaF8xOwkJLyogMjIuMCAqLworCisJdTE2IHRvbG07CQkJCS8qIHRvcCBvZiBsb3cgbWVtb3J5ICovCisJdTY0IGFtYmFzZTsJCQkJLyogQU1CIEJBUiAqLworCisJdTE2IG1pcjAsIG1pcjE7CisKKwl1MTYgYjBfbXRyW05VTV9NVFJTX1BFUl9CUkFOQ0hdOwkvKiBNZW1vcnkgVGVjaG5sb2d5IFJlZyAqLworCXUxNiBiMF9hbWJwcmVzZW50MDsJCQkvKiBCcmFuY2ggMCwgQ2hhbm5lbCAwICovCisJdTE2IGIwX2FtYnByZXNlbnQxOwkJCS8qIEJybmFjaCAwLCBDaGFubmVsIDEgKi8KKworCXUxNiBiMV9tdHJbTlVNX01UUlNfUEVSX0JSQU5DSF07CS8qIE1lbW9yeSBUZWNobmxvZ3kgUmVnICovCisJdTE2IGIxX2FtYnByZXNlbnQwOwkJCS8qIEJyYW5jaCAxLCBDaGFubmVsIDggKi8KKwl1MTYgYjFfYW1icHJlc2VudDE7CQkJLyogQnJhbmNoIDEsIENoYW5uZWwgMSAqLworCisJLyogRElNTSBpbmZvcm1hdGlvbiBtYXRyaXgsIGFsbG9jYXRpbmcgYXJjaGl0ZWN0dXJlIG1heGltdW1zICovCisJc3RydWN0IGk1NDAwX2RpbW1faW5mbyBkaW1tX2luZm9bTUFYX0NTUk9XU11bTUFYX0NIQU5ORUxTXTsKKworCS8qIEFjdHVhbCB2YWx1ZXMgZm9yIHRoaXMgY29udHJvbGxlciAqLworCWludCBtYXhjaDsJCQkJLyogTWF4IGNoYW5uZWxzICovCisJaW50IG1heGRpbW1wZXJjaDsJCQkvKiBNYXggRElNTXMgcGVyIGNoYW5uZWwgKi8KK307CisKKy8qIEk1NDAwIE1DSCBlcnJvciBpbmZvcm1hdGlvbiByZXRyaWV2ZWQgZnJvbSBIYXJkd2FyZSAqLworc3RydWN0IGk1NDAwX2Vycm9yX2luZm8geworCS8qIFRoZXNlIHJlZ2lzdGVycyBhcmUgYWx3YXlzIHJlYWQgZnJvbSB0aGUgTUMgKi8KKwl1MzIgZmVycl9mYXRfZmJkOwkvKiBGaXJzdCBFcnJvcnMgRmF0YWwgKi8KKwl1MzIgbmVycl9mYXRfZmJkOwkvKiBOZXh0IEVycm9ycyBGYXRhbCAqLworCXUzMiBmZXJyX25mX2ZiZDsJLyogRmlyc3QgRXJyb3JzIE5vbi1GYXRhbCAqLworCXUzMiBuZXJyX25mX2ZiZDsJLyogTmV4dCBFcnJvcnMgTm9uLUZhdGFsICovCisKKwkvKiBUaGVzZSByZWdpc3RlcnMgYXJlIGlucHV0IE9OTFkgaWYgdGhlcmUgd2FzIGEgUmVjb3ZlcmFibGUgRXJyb3IgKi8KKwl1MzIgcmVkbWVtYjsJCS8qIFJlY292ZXJhYmxlIE1lbSBEYXRhIEVycm9yIGxvZyBCICovCisJdTE2IHJlY21lbWE7CQkvKiBSZWNvdmVyYWJsZSBNZW0gRXJyb3IgbG9nIEEgKi8KKwl1MzIgcmVjbWVtYjsJCS8qIFJlY292ZXJhYmxlIE1lbSBFcnJvciBsb2cgQiAqLworCisJLyogVGhlc2UgcmVnaXN0ZXJzIGFyZSBpbnB1dCBPTkxZIGlmIHRoZXJlIHdhcyBhIE5vbi1SZWMgRXJyb3IgKi8KKwl1MTYgbnJlY21lbWE7CQkvKiBOb24tUmVjb3ZlcmFibGUgTWVtIGxvZyBBICovCisJdTE2IG5yZWNtZW1iOwkJLyogTm9uLVJlY292ZXJhYmxlIE1lbSBsb2cgQiAqLworCit9OworCisvKiBub3RlIHRoYXQgbnJlY19yZHdyIGNoYW5nZWQgZnJvbSBOUkVDTUVNQSB0byBOUkVDTUVNQiBiZXR3ZWVuIHRoZSA1MDAwIGFuZAorICAgNTQwMCBiZXR0ZXIgdG8gdXNlIGFuIGlubGluZSBmdW5jdGlvbiB0aGFuIGEgbWFjcm8gaW4gdGhpcyBjYXNlICovCitzdGF0aWMgaW5saW5lIGludCBucmVjX2Jhbmsoc3RydWN0IGk1NDAwX2Vycm9yX2luZm8gKmluZm8pCit7CisJcmV0dXJuICgoaW5mby0+bnJlY21lbWEpID4+IDEyKSAmIDB4NzsKK30KK3N0YXRpYyBpbmxpbmUgaW50IG5yZWNfcmFuayhzdHJ1Y3QgaTU0MDBfZXJyb3JfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gKChpbmZvLT5ucmVjbWVtYSkgPj4gOCkgJiAweGY7Cit9CitzdGF0aWMgaW5saW5lIGludCBucmVjX2J1Zl9pZChzdHJ1Y3QgaTU0MDBfZXJyb3JfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gKChpbmZvLT5ucmVjbWVtYSkpICYgMHhmZjsKK30KK3N0YXRpYyBpbmxpbmUgaW50IG5yZWNfcmR3cihzdHJ1Y3QgaTU0MDBfZXJyb3JfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gKGluZm8tPm5yZWNtZW1iKSA+PiAzMTsKK30KKy8qIFRoaXMgYXBwbGllcyB0byBib3RoIE5SRUMgYW5kIFJFQyBzdHJpbmcgc28gaXQgY2FuIGJlIHVzZWQgd2l0aCBucmVjX3Jkd3IKKyAgIGFuZCByZWNfcmR3ciAqLworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpyZHdyX3N0cihpbnQgcmR3cikKK3sKKwlyZXR1cm4gcmR3ciA/ICJXcml0ZSIgOiAiUmVhZCI7Cit9CitzdGF0aWMgaW5saW5lIGludCBucmVjX2NhcyhzdHJ1Y3QgaTU0MDBfZXJyb3JfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gKChpbmZvLT5ucmVjbWVtYikgPj4gMTYpICYgMHgxZmZmOworfQorc3RhdGljIGlubGluZSBpbnQgbnJlY19yYXMoc3RydWN0IGk1NDAwX2Vycm9yX2luZm8gKmluZm8pCit7CisJcmV0dXJuIChpbmZvLT5ucmVjbWVtYikgJiAweGZmZmY7Cit9CitzdGF0aWMgaW5saW5lIGludCByZWNfYmFuayhzdHJ1Y3QgaTU0MDBfZXJyb3JfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gKChpbmZvLT5yZWNtZW1hKSA+PiAxMikgJiAweDc7Cit9CitzdGF0aWMgaW5saW5lIGludCByZWNfcmFuayhzdHJ1Y3QgaTU0MDBfZXJyb3JfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gKChpbmZvLT5yZWNtZW1hKSA+PiA4KSAmIDB4ZjsKK30KK3N0YXRpYyBpbmxpbmUgaW50IHJlY19yZHdyKHN0cnVjdCBpNTQwMF9lcnJvcl9pbmZvICppbmZvKQoreworCXJldHVybiAoaW5mby0+cmVjbWVtYikgPj4gMzE7Cit9CitzdGF0aWMgaW5saW5lIGludCByZWNfY2FzKHN0cnVjdCBpNTQwMF9lcnJvcl9pbmZvICppbmZvKQoreworCXJldHVybiAoKGluZm8tPnJlY21lbWIpID4+IDE2KSAmIDB4MWZmZjsKK30KK3N0YXRpYyBpbmxpbmUgaW50IHJlY19yYXMoc3RydWN0IGk1NDAwX2Vycm9yX2luZm8gKmluZm8pCit7CisJcmV0dXJuIChpbmZvLT5yZWNtZW1iKSAmIDB4ZmZmZjsKK30KKworc3RhdGljIHN0cnVjdCBlZGFjX3BjaV9jdGxfaW5mbyAqaTU0MDBfcGNpOworCisvKgorICoJaTU0MDBfZ2V0X2Vycm9yX2luZm8JUmV0cmlldmUgdGhlIGhhcmR3YXJlIGVycm9yIGluZm9ybWF0aW9uIGZyb20KKyAqCQkJCXRoZSBoYXJkd2FyZSBhbmQgY2FjaGUgaXQgaW4gdGhlICdpbmZvJworICoJCQkJc3RydWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkIGk1NDAwX2dldF9lcnJvcl9pbmZvKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKKwkJCQkgc3RydWN0IGk1NDAwX2Vycm9yX2luZm8gKmluZm8pCit7CisJc3RydWN0IGk1NDAwX3B2dCAqcHZ0OworCXUzMiB2YWx1ZTsKKworCXB2dCA9IG1jaS0+cHZ0X2luZm87CisKKwkvKiByZWFkIGluIHRoZSAxc3QgRkFUQUwgZXJyb3IgcmVnaXN0ZXIgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5icmFuY2htYXBfd2Vycm9ycywgRkVSUl9GQVRfRkJELCAmdmFsdWUpOworCisJLyogTWFzayBvbmx5IHRoZSBiaXRzIHRoYXQgdGhlIGRvYyBzYXlzIGFyZSB2YWxpZAorCSAqLworCXZhbHVlICY9IChGRVJSX0ZBVF9GQkRDSEFOIHwgRkVSUl9GQVRfTUFTSyk7CisKKwkvKiBJZiB0aGVyZSBpcyBhbiBlcnJvciwgdGhlbiByZWFkIGluIHRoZQorCSAgIE5FWFQgRkFUQUwgZXJyb3IgcmVnaXN0ZXIgYW5kIHRoZSBNZW1vcnkgRXJyb3IgTG9nIFJlZ2lzdGVyIEEKKwkgKi8KKwlpZiAodmFsdWUgJiBGRVJSX0ZBVF9NQVNLKSB7CisJCWluZm8tPmZlcnJfZmF0X2ZiZCA9IHZhbHVlOworCisJCS8qIGhhcnZlc3QgdGhlIHZhcmlvdXMgZXJyb3IgZGF0YSB3ZSBuZWVkICovCisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPmJyYW5jaG1hcF93ZXJyb3JzLAorCQkJCU5FUlJfRkFUX0ZCRCwgJmluZm8tPm5lcnJfZmF0X2ZiZCk7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHB2dC0+YnJhbmNobWFwX3dlcnJvcnMsCisJCQkJTlJFQ01FTUEsICZpbmZvLT5ucmVjbWVtYSk7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHB2dC0+YnJhbmNobWFwX3dlcnJvcnMsCisJCQkJTlJFQ01FTUIsICZpbmZvLT5ucmVjbWVtYik7CisKKwkJLyogQ2xlYXIgdGhlIGVycm9yIGJpdHMsIGJ5IHdyaXRpbmcgdGhlbSBiYWNrICovCisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQocHZ0LT5icmFuY2htYXBfd2Vycm9ycywKKwkJCQlGRVJSX0ZBVF9GQkQsIHZhbHVlKTsKKwl9IGVsc2UgeworCQlpbmZvLT5mZXJyX2ZhdF9mYmQgPSAwOworCQlpbmZvLT5uZXJyX2ZhdF9mYmQgPSAwOworCQlpbmZvLT5ucmVjbWVtYSA9IDA7CisJCWluZm8tPm5yZWNtZW1iID0gMDsKKwl9CisKKwkvKiByZWFkIGluIHRoZSAxc3QgTk9OLUZBVEFMIGVycm9yIHJlZ2lzdGVyICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+YnJhbmNobWFwX3dlcnJvcnMsIEZFUlJfTkZfRkJELCAmdmFsdWUpOworCisJLyogSWYgdGhlcmUgaXMgYW4gZXJyb3IsIHRoZW4gcmVhZCBpbiB0aGUgMXN0IE5PTi1GQVRBTCBlcnJvcgorCSAqIHJlZ2lzdGVyIGFzIHdlbGwgKi8KKwlpZiAodmFsdWUgJiBGRVJSX05GX01BU0spIHsKKwkJaW5mby0+ZmVycl9uZl9mYmQgPSB2YWx1ZTsKKworCQkvKiBoYXJ2ZXN0IHRoZSB2YXJpb3VzIGVycm9yIGRhdGEgd2UgbmVlZCAqLworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5icmFuY2htYXBfd2Vycm9ycywKKwkJCQlORVJSX05GX0ZCRCwgJmluZm8tPm5lcnJfbmZfZmJkKTsKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQocHZ0LT5icmFuY2htYXBfd2Vycm9ycywKKwkJCQlSRUNNRU1BLCAmaW5mby0+cmVjbWVtYSk7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPmJyYW5jaG1hcF93ZXJyb3JzLAorCQkJCVJFQ01FTUIsICZpbmZvLT5yZWNtZW1iKTsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+YnJhbmNobWFwX3dlcnJvcnMsCisJCQkJUkVETUVNQiwgJmluZm8tPnJlZG1lbWIpOworCisJCS8qIENsZWFyIHRoZSBlcnJvciBiaXRzLCBieSB3cml0aW5nIHRoZW0gYmFjayAqLworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHB2dC0+YnJhbmNobWFwX3dlcnJvcnMsCisJCQkJRkVSUl9ORl9GQkQsIHZhbHVlKTsKKwl9IGVsc2UgeworCQlpbmZvLT5mZXJyX25mX2ZiZCA9IDA7CisJCWluZm8tPm5lcnJfbmZfZmJkID0gMDsKKwkJaW5mby0+cmVjbWVtYSA9IDA7CisJCWluZm8tPnJlY21lbWIgPSAwOworCQlpbmZvLT5yZWRtZW1iID0gMDsKKwl9Cit9CisKKy8qCisgKiBpNTQwMF9wcm9jY2Vzc19ub25fcmVjb3ZlcmFibGVfaW5mbyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksCisgKiAJCQkJCXN0cnVjdCBpNTQwMF9lcnJvcl9pbmZvICppbmZvLAorICogCQkJCQlpbnQgaGFuZGxlX2Vycm9ycyk7CisgKgorICoJaGFuZGxlIHRoZSBJbnRlbCBGQVRBTCBhbmQgdW5yZWNvdmVyYWJsZSBlcnJvcnMsIGlmIGFueQorICovCitzdGF0aWMgdm9pZCBpNTQwMF9wcm9jY2Vzc19ub25fcmVjb3ZlcmFibGVfaW5mbyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksCisJCQkJICAgIHN0cnVjdCBpNTQwMF9lcnJvcl9pbmZvICppbmZvLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGFsbEVycm9ycykKK3sKKwljaGFyIG1zZ1tFREFDX01DX0xBQkVMX0xFTiArIDEgKyA5MCArIDgwXTsKKwlpbnQgYnJhbmNoOworCWludCBjaGFubmVsOworCWludCBiYW5rOworCWludCBidWZfaWQ7CisJaW50IHJhbms7CisJaW50IHJkd3I7CisJaW50IHJhcywgY2FzOworCWludCBlcnJudW07CisJY2hhciAqdHlwZSA9IE5VTEw7CisKKwlpZiAoIWFsbEVycm9ycykKKwkJcmV0dXJuOwkJLyogaWYgbm8gZXJyb3IsIHJldHVybiBub3cgKi8KKworCWlmIChhbGxFcnJvcnMgJiAgRVJST1JfRkFUX01BU0spCisJCXR5cGUgPSAiRkFUQUwiOworCWVsc2UgaWYgKGFsbEVycm9ycyAmIEZFUlJfTkZfVU5DT1JSRUNUQUJMRSkKKwkJdHlwZSA9ICJOT04tRkFUQUwgdW5jb3JyZWN0ZWQiOworCWVsc2UKKwkJdHlwZSA9ICJOT04tRkFUQUwgcmVjb3ZlcmFibGUiOworCisJLyogT05MWSBPTkUgb2YgdGhlIHBvc3NpYmxlIGVycm9yIGJpdHMgd2lsbCBiZSBzZXQsIGFzIHBlciB0aGUgZG9jcyAqLworCisJYnJhbmNoID0gZXh0cmFjdF9mYmRjaGFuX2luZHgoaW5mby0+ZmVycl9mYXRfZmJkKTsKKwljaGFubmVsID0gYnJhbmNoOworCisJLyogVXNlIHRoZSBOT04tUmVjb3ZlcmFibGUgbWFjcm9zIHRvIGV4dHJhY3QgZGF0YSAqLworCWJhbmsgPSBucmVjX2JhbmsoaW5mbyk7CisJcmFuayA9IG5yZWNfcmFuayhpbmZvKTsKKwlidWZfaWQgPSBucmVjX2J1Zl9pZChpbmZvKTsKKwlyZHdyID0gbnJlY19yZHdyKGluZm8pOworCXJhcyA9IG5yZWNfcmFzKGluZm8pOworCWNhcyA9IG5yZWNfY2FzKGluZm8pOworCisJZGVidWdmMCgiXHRcdENTUk9XPSAlZCAgQ2hhbm5lbHM9ICVkLCVkICAoQnJhbmNoPSAlZCAiCisJCSJEUkFNIEJhbms9ICVkIEJ1ZmZlciBJRCA9ICVkIHJkd3I9ICVzIHJhcz0gJWQgY2FzPSAlZClcbiIsCisJCXJhbmssIGNoYW5uZWwsIGNoYW5uZWwgKyAxLCBicmFuY2ggPj4gMSwgYmFuaywKKwkJYnVmX2lkLCByZHdyX3N0cihyZHdyKSwgcmFzLCBjYXMpOworCisJLyogT25seSAxIGJpdCB3aWxsIGJlIG9uICovCisJZXJybnVtID0gZmluZF9maXJzdF9iaXQoJmFsbEVycm9ycywgQVJSQVlfU0laRShlcnJvcl9uYW1lKSk7CisKKwkvKiBGb3JtIG91dCBtZXNzYWdlICovCisJc25wcmludGYobXNnLCBzaXplb2YobXNnKSwKKwkJICIlcyAoQnJhbmNoPSVkIERSQU0tQmFuaz0lZCBCdWZmZXIgSUQgPSAlZCBSRFdSPSVzICIKKwkJICJSQVM9JWQgQ0FTPSVkICVzIEVycj0weCVseCAoJXMpKSIsCisJCSB0eXBlLCBicmFuY2ggPj4gMSwgYmFuaywgYnVmX2lkLCByZHdyX3N0cihyZHdyKSwgcmFzLCBjYXMsCisJCSB0eXBlLCBhbGxFcnJvcnMsIGVycm9yX25hbWVbZXJybnVtXSk7CisKKwkvKiBDYWxsIHRoZSBoZWxwZXIgdG8gb3V0cHV0IG1lc3NhZ2UgKi8KKwllZGFjX21jX2hhbmRsZV9mYmRfdWUobWNpLCByYW5rLCBjaGFubmVsLCBjaGFubmVsICsgMSwgbXNnKTsKK30KKworLyoKKyAqIGk1NDAwX3Byb2Nlc3NfZmF0YWxfZXJyb3JfaW5mbyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksCisgKiAJCQkJc3RydWN0IGk1NDAwX2Vycm9yX2luZm8gKmluZm8sCisgKiAJCQkJaW50IGhhbmRsZV9lcnJvcnMpOworICoKKyAqCWhhbmRsZSB0aGUgSW50ZWwgTk9OLUZBVEFMIGVycm9ycywgaWYgYW55CisgKi8KK3N0YXRpYyB2b2lkIGk1NDAwX3Byb2Nlc3Nfbm9uZmF0YWxfZXJyb3JfaW5mbyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksCisJCQkJCXN0cnVjdCBpNTQwMF9lcnJvcl9pbmZvICppbmZvKQoreworCWNoYXIgbXNnW0VEQUNfTUNfTEFCRUxfTEVOICsgMSArIDkwICsgODBdOworCXVuc2lnbmVkIGxvbmcgYWxsRXJyb3JzOworCWludCBicmFuY2g7CisJaW50IGNoYW5uZWw7CisJaW50IGJhbms7CisJaW50IHJhbms7CisJaW50IHJkd3I7CisJaW50IHJhcywgY2FzOworCWludCBlcnJudW07CisKKwkvKiBtYXNrIG9mZiB0aGUgRXJyb3IgYml0cyB0aGF0IGFyZSBwb3NzaWJsZSAqLworCWFsbEVycm9ycyA9IGZyb21fbmZfZmVycihpbmZvLT5mZXJyX25mX2ZiZCAmIEZFUlJfTkZfTUFTSyk7CisJaWYgKCFhbGxFcnJvcnMpCisJCXJldHVybjsJCS8qIGlmIG5vIGVycm9yLCByZXR1cm4gbm93ICovCisKKwkvKiBPTkxZIE9ORSBvZiB0aGUgcG9zc2libGUgZXJyb3IgYml0cyB3aWxsIGJlIHNldCwgYXMgcGVyIHRoZSBkb2NzICovCisKKwlpZiAoYWxsRXJyb3JzICYgKEVSUk9SX05GX1VOQ09SUkVDVEFCTEUgfCBFUlJPUl9ORl9SRUNPVkVSQUJMRSkpIHsKKwkJaTU0MDBfcHJvY2Nlc3Nfbm9uX3JlY292ZXJhYmxlX2luZm8obWNpLCBpbmZvLCBhbGxFcnJvcnMpOworCQlyZXR1cm47CisJfQorCisJLyogQ29ycmVjdGFibGUgZXJyb3JzICovCisJaWYgKGFsbEVycm9ycyAmIEVSUk9SX05GX0NPUlJFQ1RBQkxFKSB7CisJCWRlYnVnZjAoIlx0Q29ycmVjdGVkIGJpdHM9IDB4JWx4XG4iLCBhbGxFcnJvcnMpOworCisJCWJyYW5jaCA9IGV4dHJhY3RfZmJkY2hhbl9pbmR4KGluZm8tPmZlcnJfbmZfZmJkKTsKKworCQljaGFubmVsID0gMDsKKwkJaWYgKFJFQ19FQ0NfTE9DQVRPUl9PREQoaW5mby0+cmVkbWVtYikpCisJCQljaGFubmVsID0gMTsKKworCQkvKiBDb252ZXJ0IGNoYW5uZWwgdG8gYmUgYmFzZWQgZnJvbSB6ZXJvLCBpbnN0ZWFkIG9mCisJCSAqIGZyb20gYnJhbmNoIGJhc2Ugb2YgMCAqLworCQljaGFubmVsICs9IGJyYW5jaDsKKworCQliYW5rID0gcmVjX2JhbmsoaW5mbyk7CisJCXJhbmsgPSByZWNfcmFuayhpbmZvKTsKKwkJcmR3ciA9IHJlY19yZHdyKGluZm8pOworCQlyYXMgPSByZWNfcmFzKGluZm8pOworCQljYXMgPSByZWNfY2FzKGluZm8pOworCisJCS8qIE9ubHkgMSBiaXQgd2lsbCBiZSBvbiAqLworCQllcnJudW0gPSBmaW5kX2ZpcnN0X2JpdCgmYWxsRXJyb3JzLCBBUlJBWV9TSVpFKGVycm9yX25hbWUpKTsKKworCQlkZWJ1Z2YwKCJcdFx0Q1NST1c9ICVkIENoYW5uZWw9ICVkICAoQnJhbmNoICVkICIKKwkJCSJEUkFNIEJhbms9ICVkIHJkd3I9ICVzIHJhcz0gJWQgY2FzPSAlZClcbiIsCisJCQlyYW5rLCBjaGFubmVsLCBicmFuY2ggPj4gMSwgYmFuaywKKwkJCXJkd3Jfc3RyKHJkd3IpLCByYXMsIGNhcyk7CisKKwkJLyogRm9ybSBvdXQgbWVzc2FnZSAqLworCQlzbnByaW50Zihtc2csIHNpemVvZihtc2cpLAorCQkJICJDb3JyZWN0ZWQgZXJyb3IgKEJyYW5jaD0lZCBEUkFNLUJhbms9JWQgUkRXUj0lcyAiCisJCQkgIlJBUz0lZCBDQVM9JWQsIENFIEVycj0weCVseCAoJXMpKSIsCisJCQkgYnJhbmNoID4+IDEsIGJhbmssIHJkd3Jfc3RyKHJkd3IpLCByYXMsIGNhcywKKwkJCSBhbGxFcnJvcnMsIGVycm9yX25hbWVbZXJybnVtXSk7CisKKwkJLyogQ2FsbCB0aGUgaGVscGVyIHRvIG91dHB1dCBtZXNzYWdlICovCisJCWVkYWNfbWNfaGFuZGxlX2ZiZF9jZShtY2ksIHJhbmssIGNoYW5uZWwsIG1zZyk7CisKKwkJcmV0dXJuOworCX0KKworCS8qIE1pc2NlbGFuZW91cyBlcnJvcnMgKi8KKwllcnJudW0gPSBmaW5kX2ZpcnN0X2JpdCgmYWxsRXJyb3JzLCBBUlJBWV9TSVpFKGVycm9yX25hbWUpKTsKKworCWJyYW5jaCA9IGV4dHJhY3RfZmJkY2hhbl9pbmR4KGluZm8tPmZlcnJfbmZfZmJkKTsKKworCWk1NDAwX21jX3ByaW50ayhtY2ksIEtFUk5fRU1FUkcsCisJCQkiTm9uLUZhdGFsIG1pc2MgZXJyb3IgKEJyYW5jaD0lZCBFcnI9JSNseCAoJXMpKSIsCisJCQlicmFuY2ggPj4gMSwgYWxsRXJyb3JzLCBlcnJvcl9uYW1lW2Vycm51bV0pOworfQorCisvKgorICoJaTU0MDBfcHJvY2Vzc19lcnJvcl9pbmZvCVByb2Nlc3MgdGhlIGVycm9yIGluZm8gdGhhdCBpcworICoJaW4gdGhlICdpbmZvJyBzdHJ1Y3R1cmUsIHByZXZpb3VzbHkgcmV0cmlldmVkIGZyb20gaGFyZHdhcmUKKyAqLworc3RhdGljIHZvaWQgaTU0MDBfcHJvY2Vzc19lcnJvcl9pbmZvKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKKwkJCQlzdHJ1Y3QgaTU0MDBfZXJyb3JfaW5mbyAqaW5mbykKK3sJdTMyIGFsbEVycm9yczsKKworCS8qIEZpcnN0IGhhbmRsZSBhbnkgZmF0YWwgZXJyb3JzIHRoYXQgb2NjdXJyZWQgKi8KKwlhbGxFcnJvcnMgPSAoaW5mby0+ZmVycl9mYXRfZmJkICYgRkVSUl9GQVRfTUFTSyk7CisJaTU0MDBfcHJvY2Nlc3Nfbm9uX3JlY292ZXJhYmxlX2luZm8obWNpLCBpbmZvLCBhbGxFcnJvcnMpOworCisJLyogbm93IGhhbmRsZSBhbnkgbm9uLWZhdGFsIGVycm9ycyB0aGF0IG9jY3VycmVkICovCisJaTU0MDBfcHJvY2Vzc19ub25mYXRhbF9lcnJvcl9pbmZvKG1jaSwgaW5mbyk7Cit9CisKKy8qCisgKglpNTQwMF9jbGVhcl9lcnJvcglSZXRyaWV2ZSBhbnkgZXJyb3IgZnJvbSB0aGUgaGFyZHdhcmUKKyAqCQkJCWJ1dCBkbyBOT1QgcHJvY2VzcyB0aGF0IGVycm9yLgorICoJCQkJVXNlZCBmb3IgJ2NsZWFyaW5nJyBvdXQgb2YgcHJldmlvdXMgZXJyb3JzCisgKgkJCQlDYWxsZWQgYnkgdGhlIENvcmUgbW9kdWxlLgorICovCitzdGF0aWMgdm9pZCBpNTQwMF9jbGVhcl9lcnJvcihzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpCit7CisJc3RydWN0IGk1NDAwX2Vycm9yX2luZm8gaW5mbzsKKworCWk1NDAwX2dldF9lcnJvcl9pbmZvKG1jaSwgJmluZm8pOworfQorCisvKgorICoJaTU0MDBfY2hlY2tfZXJyb3IJUmV0cmlldmUgYW5kIHByb2Nlc3MgZXJyb3JzIHJlcG9ydGVkIGJ5IHRoZQorICoJCQkJaGFyZHdhcmUuIENhbGxlZCBieSB0aGUgQ29yZSBtb2R1bGUuCisgKi8KK3N0YXRpYyB2b2lkIGk1NDAwX2NoZWNrX2Vycm9yKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSkKK3sKKwlzdHJ1Y3QgaTU0MDBfZXJyb3JfaW5mbyBpbmZvOworCWRlYnVnZjQoIk1DJWQ6ICIgX19GSUxFX18gIjogJXMoKVxuIiwgbWNpLT5tY19pZHgsIF9fZnVuY19fKTsKKwlpNTQwMF9nZXRfZXJyb3JfaW5mbyhtY2ksICZpbmZvKTsKKwlpNTQwMF9wcm9jZXNzX2Vycm9yX2luZm8obWNpLCAmaW5mbyk7Cit9CisKKy8qCisgKglpNTQwMF9wdXRfZGV2aWNlcwkncHV0JyBhbGwgdGhlIGRldmljZXMgdGhhdCB3ZSBoYXZlCisgKgkJCQlyZXNlcnZlZCB2aWEgJ2dldCcKKyAqLworc3RhdGljIHZvaWQgaTU0MDBfcHV0X2RldmljZXMoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKQoreworCXN0cnVjdCBpNTQwMF9wdnQgKnB2dDsKKworCXB2dCA9IG1jaS0+cHZ0X2luZm87CisKKwkvKiBEZWNyZW1lbnQgdXNhZ2UgY291bnQgZm9yIGRldmljZXMgKi8KKwlwY2lfZGV2X3B1dChwdnQtPmJyYW5jaF8xKTsKKwlwY2lfZGV2X3B1dChwdnQtPmJyYW5jaF8wKTsKKwlwY2lfZGV2X3B1dChwdnQtPmZzYl9lcnJvcl9yZWdzKTsKKwlwY2lfZGV2X3B1dChwdnQtPmJyYW5jaG1hcF93ZXJyb3JzKTsKK30KKworLyoKKyAqCWk1NDAwX2dldF9kZXZpY2VzCUZpbmQgYW5kIHBlcmZvcm0gJ2dldCcgb3BlcmF0aW9uIG9uIHRoZSBNQ0gncworICoJCQlkZXZpY2UvZnVuY3Rpb25zIHdlIHdhbnQgdG8gcmVmZXJlbmNlIGZvciB0aGlzIGRyaXZlcgorICoKKyAqCQkJTmVlZCB0byAnZ2V0JyBkZXZpY2UgMTYgZnVuYyAxIGFuZCBmdW5jIDIKKyAqLworc3RhdGljIGludCBpNTQwMF9nZXRfZGV2aWNlcyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksIGludCBkZXZfaWR4KQoreworCXN0cnVjdCBpNTQwMF9wdnQgKnB2dDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKworCXB2dCA9IG1jaS0+cHZ0X2luZm87CisJcHZ0LT5icmFuY2htYXBfd2Vycm9ycyA9IE5VTEw7CisJcHZ0LT5mc2JfZXJyb3JfcmVncyA9IE5VTEw7CisJcHZ0LT5icmFuY2hfMCA9IE5VTEw7CisJcHZ0LT5icmFuY2hfMSA9IE5VTEw7CisKKwkvKiBBdHRlbXB0IHRvICdnZXQnIHRoZSBNQ0ggcmVnaXN0ZXIgd2Ugd2FudCAqLworCXBkZXYgPSBOVUxMOworCXdoaWxlICghcHZ0LT5icmFuY2htYXBfd2Vycm9ycyB8fCAhcHZ0LT5mc2JfZXJyb3JfcmVncykgeworCQlwZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJCQkgICAgICBQQ0lfREVWSUNFX0lEX0lOVEVMXzU0MDBfRVJSLCBwZGV2KTsKKwkJaWYgKCFwZGV2KSB7CisJCQkvKiBFbmQgb2YgbGlzdCwgbGVhdmUgKi8KKwkJCWk1NDAwX3ByaW50ayhLRVJOX0VSUiwKKwkJCQkiJ3N5c3RlbSBhZGRyZXNzLFByb2Nlc3MgQnVzJyAiCisJCQkJImRldmljZSBub3QgZm91bmQ6IgorCQkJCSJ2ZW5kb3IgMHgleCBkZXZpY2UgMHgleCBFUlIgZnVuY3MgIgorCQkJCSIoYnJva2VuIEJJT1M/KVxuIiwKKwkJCQlQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQkJCVBDSV9ERVZJQ0VfSURfSU5URUxfNTQwMF9FUlIpOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCS8qIFN0b3JlIGRldmljZSAxNiBmdW5jcyAxIGFuZCAyICovCisJCXN3aXRjaCAoUENJX0ZVTkMocGRldi0+ZGV2Zm4pKSB7CisJCWNhc2UgMToKKwkJCXB2dC0+YnJhbmNobWFwX3dlcnJvcnMgPSBwZGV2OworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXB2dC0+ZnNiX2Vycm9yX3JlZ3MgPSBwZGV2OworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlkZWJ1Z2YxKCJTeXN0ZW0gQWRkcmVzcywgcHJvY2Vzc29yIGJ1cy0gUENJIEJ1cyBJRDogJXMgICV4OiV4XG4iLAorCQlwY2lfbmFtZShwdnQtPnN5c3RlbV9hZGRyZXNzKSwKKwkJcHZ0LT5zeXN0ZW1fYWRkcmVzcy0+dmVuZG9yLCBwdnQtPnN5c3RlbV9hZGRyZXNzLT5kZXZpY2UpOworCWRlYnVnZjEoIkJyYW5jaG1hcCwgY29udHJvbCBhbmQgZXJyb3JzIC0gUENJIEJ1cyBJRDogJXMgICV4OiV4XG4iLAorCQlwY2lfbmFtZShwdnQtPmJyYW5jaG1hcF93ZXJyb3JzKSwKKwkJcHZ0LT5icmFuY2htYXBfd2Vycm9ycy0+dmVuZG9yLCBwdnQtPmJyYW5jaG1hcF93ZXJyb3JzLT5kZXZpY2UpOworCWRlYnVnZjEoIkZTQiBFcnJvciBSZWdzIC0gUENJIEJ1cyBJRDogJXMgICV4OiV4XG4iLAorCQlwY2lfbmFtZShwdnQtPmZzYl9lcnJvcl9yZWdzKSwKKwkJcHZ0LT5mc2JfZXJyb3JfcmVncy0+dmVuZG9yLCBwdnQtPmZzYl9lcnJvcl9yZWdzLT5kZXZpY2UpOworCisJcHZ0LT5icmFuY2hfMCA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsCisJCQkJICAgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfNTQwMF9GQkQwLCBOVUxMKTsKKwlpZiAoIXB2dC0+YnJhbmNoXzApIHsKKwkJaTU0MDBfcHJpbnRrKEtFUk5fRVJSLAorCQkJIk1DOiAnQlJBTkNIIDAnIGRldmljZSBub3QgZm91bmQ6IgorCQkJInZlbmRvciAweCV4IGRldmljZSAweCV4IEZ1bmMgMCAoYnJva2VuIEJJT1M/KVxuIiwKKwkJCVBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfNTQwMF9GQkQwKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBJZiB0aGlzIGRldmljZSBjbGFpbXMgdG8gaGF2ZSBtb3JlIHRoYW4gMiBjaGFubmVscyB0aGVuCisJICogZmV0Y2ggQnJhbmNoIDEncyBpbmZvcm1hdGlvbgorCSAqLworCWlmIChwdnQtPm1heGNoIDwgQ0hBTk5FTFNfUEVSX0JSQU5DSCkKKwkJcmV0dXJuIDA7CisKKwlwdnQtPmJyYW5jaF8xID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJCQkgICAgICAgUENJX0RFVklDRV9JRF9JTlRFTF81NDAwX0ZCRDEsIE5VTEwpOworCWlmICghcHZ0LT5icmFuY2hfMSkgeworCQlpNTQwMF9wcmludGsoS0VSTl9FUlIsCisJCQkiTUM6ICdCUkFOQ0ggMScgZGV2aWNlIG5vdCBmb3VuZDoiCisJCQkidmVuZG9yIDB4JXggZGV2aWNlIDB4JXggRnVuYyAwICIKKwkJCSIoYnJva2VuIEJJT1M/KVxuIiwKKwkJCVBDSV9WRU5ET1JfSURfSU5URUwsCisJCQlQQ0lfREVWSUNFX0lEX0lOVEVMXzU0MDBfRkJEMSk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCWk1NDAwX3B1dF9kZXZpY2VzKG1jaSk7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKy8qCisgKglkZXRlcm1pbmVfYW1iX3ByZXNlbnQKKyAqCisgKgkJdGhlIGluZm9ybWF0aW9uIGlzIGNvbnRhaW5lZCBpbiBOVU1fTVRSU19QRVJfQlJBTkNIIGRpZmZlcmVudAorICoJCXJlZ2lzdGVycyBkZXRlcm1pbmluZyB3aGljaCBvZiB0aGUgTlVNX01UUlNfUEVSX0JSQU5DSCByZXF1aXJlcworICogICAgICAgICAgICAgIGtub3dpbmcgd2hpY2ggY2hhbm5lbCBpcyBpbiBxdWVzdGlvbgorICoKKyAqCTIgYnJhbmNoZXMsIGVhY2ggd2l0aCAyIGNoYW5uZWxzCisgKgkJYjBfYW1icHJlc2VudDAgZm9yIGNoYW5uZWwgJzAnCisgKgkJYjBfYW1icHJlc2VudDEgZm9yIGNoYW5uZWwgJzEnCisgKgkJYjFfYW1icHJlc2VudDAgZm9yIGNoYW5uZWwgJzInCisgKgkJYjFfYW1icHJlc2VudDEgZm9yIGNoYW5uZWwgJzMnCisgKi8KK3N0YXRpYyBpbnQgZGV0ZXJtaW5lX2FtYl9wcmVzZW50X3JlZyhzdHJ1Y3QgaTU0MDBfcHZ0ICpwdnQsIGludCBjaGFubmVsKQoreworCWludCBhbWJfcHJlc2VudDsKKworCWlmIChjaGFubmVsIDwgQ0hBTk5FTFNfUEVSX0JSQU5DSCkgeworCQlpZiAoY2hhbm5lbCAmIDB4MSkKKwkJCWFtYl9wcmVzZW50ID0gcHZ0LT5iMF9hbWJwcmVzZW50MTsKKwkJZWxzZQorCQkJYW1iX3ByZXNlbnQgPSBwdnQtPmIwX2FtYnByZXNlbnQwOworCX0gZWxzZSB7CisJCWlmIChjaGFubmVsICYgMHgxKQorCQkJYW1iX3ByZXNlbnQgPSBwdnQtPmIxX2FtYnByZXNlbnQxOworCQllbHNlCisJCQlhbWJfcHJlc2VudCA9IHB2dC0+YjFfYW1icHJlc2VudDA7CisJfQorCisJcmV0dXJuIGFtYl9wcmVzZW50OworfQorCisvKgorICogZGV0ZXJtaW5lX210cihwdnQsIGNzcm93LCBjaGFubmVsKQorICoKKyAqIHJldHVybiB0aGUgcHJvcGVyIE1UUiByZWdpc3RlciBhcyBkZXRlcm1pbmUgYnkgdGhlIGNzcm93IGFuZCBkZXNpcmVkIGNoYW5uZWwKKyAqLworc3RhdGljIGludCBkZXRlcm1pbmVfbXRyKHN0cnVjdCBpNTQwMF9wdnQgKnB2dCwgaW50IGNzcm93LCBpbnQgY2hhbm5lbCkKK3sKKwlpbnQgbXRyOworCWludCBuOworCisJLyogVGhlcmUgaXMgb25lIE1UUiBmb3IgZWFjaCBzbG90IHBhaXIgb2YgRkItRElNTXMsCisJICAgRWFjaCBzbG90IG1heSBoYXZlIG9uZSBvciB0d28gcmFua3MgKDIgY3Nyb3dzKSwKKwkgICBFYWNoIHNsb3QgcGFpciBtYXkgYmUgYXQgYnJhbmNoIDAgb3IgYnJhbmNoIDEuCisJICAgU28sIGNzcm93IHNob3VsZCBiZSBkaXZpZGVkIGJ5IGVpZ2h0CisJICovCisJbiA9IGNzcm93ID4+IDM7CisKKwlpZiAobiA+PSBOVU1fTVRSU19QRVJfQlJBTkNIKSB7CisJCWRlYnVnZjAoIkVSUk9SOiB0cnlpbmcgdG8gYWNjZXNzIGFuIGludmFsaWQgY3Nyb3c6ICVkXG4iLAorCQkJY3Nyb3cpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoY2hhbm5lbCA8IENIQU5ORUxTX1BFUl9CUkFOQ0gpCisJCW10ciA9IHB2dC0+YjBfbXRyW25dOworCWVsc2UKKwkJbXRyID0gcHZ0LT5iMV9tdHJbbl07CisKKwlyZXR1cm4gbXRyOworfQorCisvKgorICovCitzdGF0aWMgdm9pZCBkZWNvZGVfbXRyKGludCBzbG90X3JvdywgdTE2IG10cikKK3sKKwlpbnQgYW5zOworCisJYW5zID0gTVRSX0RJTU1TX1BSRVNFTlQobXRyKTsKKworCWRlYnVnZjIoIlx0TVRSJWQ9MHgleDogIERJTU1zIGFyZSAlc1xuIiwgc2xvdF9yb3csIG10ciwKKwkJYW5zID8gIlByZXNlbnQiIDogIk5PVCBQcmVzZW50Iik7CisJaWYgKCFhbnMpCisJCXJldHVybjsKKworCWRlYnVnZjIoIlx0XHRXSURUSDogeCVkXG4iLCBNVFJfRFJBTV9XSURUSChtdHIpKTsKKworCWRlYnVnZjIoIlx0XHRFTEVDVFJJQ0FMIFRIUk9UVExJTkcgaXMgJXNcbiIsCisJCU1UUl9ESU1NU19FVEhST1RUTEUobXRyKSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworCisJZGVidWdmMigiXHRcdE5VTUJBTks6ICVkIGJhbmsocylcbiIsIE1UUl9EUkFNX0JBTktTKG10cikpOworCWRlYnVnZjIoIlx0XHROVU1SQU5LOiAlc1xuIiwgTVRSX0RJTU1fUkFOSyhtdHIpID8gImRvdWJsZSIgOiAic2luZ2xlIik7CisJZGVidWdmMigiXHRcdE5VTVJPVzogJXNcbiIsIG51bXJvd190b1N0cmluZ1tNVFJfRElNTV9ST1dTKG10cildKTsKKwlkZWJ1Z2YyKCJcdFx0TlVNQ09MOiAlc1xuIiwgbnVtY29sX3RvU3RyaW5nW01UUl9ESU1NX0NPTFMobXRyKV0pOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfY2hhbm5lbChzdHJ1Y3QgaTU0MDBfcHZ0ICpwdnQsIGludCBjc3JvdywgaW50IGNoYW5uZWwsCisJCQlzdHJ1Y3QgaTU0MDBfZGltbV9pbmZvICpkaW5mbykKK3sKKwlpbnQgbXRyOworCWludCBhbWJfcHJlc2VudF9yZWc7CisJaW50IGFkZHJCaXRzOworCisJbXRyID0gZGV0ZXJtaW5lX210cihwdnQsIGNzcm93LCBjaGFubmVsKTsKKwlpZiAoTVRSX0RJTU1TX1BSRVNFTlQobXRyKSkgeworCQlhbWJfcHJlc2VudF9yZWcgPSBkZXRlcm1pbmVfYW1iX3ByZXNlbnRfcmVnKHB2dCwgY2hhbm5lbCk7CisKKwkJLyogRGV0ZXJtaW5lIGlmIHRoZXJlIGlzIGEgRElNTSBwcmVzZW50IGluIHRoaXMgRElNTSBzbG90ICovCisJCWlmIChhbWJfcHJlc2VudF9yZWcgJiAoMSA8PCAoY3Nyb3cgPj4gMSkpKSB7CisJCQlkaW5mby0+ZHVhbF9yYW5rID0gTVRSX0RJTU1fUkFOSyhtdHIpOworCisJCQlpZiAoISgoZGluZm8tPmR1YWxfcmFuayA9PSAwKSAmJgorCQkJCSgoY3Nyb3cgJiAweDEpID09IDB4MSkpKSB7CisJCQkJLyogU3RhcnQgd2l0aCB0aGUgbnVtYmVyIG9mIGJpdHMgZm9yIGEgQmFuaworCQkJCSAqIG9uIHRoZSBEUkFNICovCisJCQkJYWRkckJpdHMgPSBNVFJfRFJBTV9CQU5LU19BRERSX0JJVFMobXRyKTsKKwkJCQkvKiBBZGQgdGhlbnVtYmVyIG9mIFJPVyBiaXRzICovCisJCQkJYWRkckJpdHMgKz0gTVRSX0RJTU1fUk9XU19BRERSX0JJVFMobXRyKTsKKwkJCQkvKiBhZGQgdGhlIG51bWJlciBvZiBDT0xVTU4gYml0cyAqLworCQkJCWFkZHJCaXRzICs9IE1UUl9ESU1NX0NPTFNfQUREUl9CSVRTKG10cik7CisKKwkJCQlhZGRyQml0cyArPSA2OwkvKiBhZGQgNjQgYml0cyBwZXIgRElNTSAqLworCQkJCWFkZHJCaXRzIC09IDIwOwkvKiBkaXZpZGUgYnkgMl5eMjAgKi8KKwkJCQlhZGRyQml0cyAtPSAzOwkvKiA4IGJpdHMgcGVyIGJ5dGVzICovCisKKwkJCQlkaW5mby0+bWVnYWJ5dGVzID0gMSA8PCBhZGRyQml0czsKKwkJCX0KKwkJfQorCX0KK30KKworLyoKKyAqCWNhbGN1bGF0ZV9kaW1tX3NpemUKKyAqCisgKglhbHNvIHdpbGwgb3V0cHV0IGEgRElNTSBtYXRyaXggbWFwLCBpZiBkZWJ1ZyBpcyBlbmFibGVkLCBmb3Igdmlld2luZworICoJaG93IHRoZSBESU1NcyBhcmUgcG9wdWxhdGVkCisgKi8KK3N0YXRpYyB2b2lkIGNhbGN1bGF0ZV9kaW1tX3NpemUoc3RydWN0IGk1NDAwX3B2dCAqcHZ0KQoreworCXN0cnVjdCBpNTQwMF9kaW1tX2luZm8gKmRpbmZvOworCWludCBjc3JvdywgbWF4X2Nzcm93czsKKwljaGFyICpwLCAqbWVtX2J1ZmZlcjsKKwlpbnQgc3BhY2UsIG47CisJaW50IGNoYW5uZWw7CisKKwkvKiA9PT09PT09PT09PT09PT09PSBHZW5lcmF0ZSBzb21lIGRlYnVnIG91dHB1dCA9PT09PT09PT09PT09PT09PSAqLworCXNwYWNlID0gUEFHRV9TSVpFOworCW1lbV9idWZmZXIgPSBwID0ga21hbGxvYyhzcGFjZSwgR0ZQX0tFUk5FTCk7CisJaWYgKHAgPT0gTlVMTCkgeworCQlpNTQwMF9wcmludGsoS0VSTl9FUlIsICJNQzogJXM6JXMoKSBrbWFsbG9jKCkgZmFpbGVkXG4iLAorCQkJX19GSUxFX18sIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFNjYW4gYWxsIHRoZSBhY3R1YWwgQ1NST1dTICh3aGljaCBpcyAjIG9mIERJTU1TICogMikKKwkgKiBhbmQgY2FsY3VsYXRlIHRoZSBpbmZvcm1hdGlvbiBmb3IgZWFjaCBESU1NCisJICogU3RhcnQgd2l0aCB0aGUgaGlnaGVzdCBjc3JvdyBmaXJzdCwgdG8gZGlzcGxheSBpdCBmaXJzdAorCSAqIGFuZCB3b3JrIHRvd2FyZCB0aGUgMHRoIGNzcm93CisJICovCisJbWF4X2Nzcm93cyA9IHB2dC0+bWF4ZGltbXBlcmNoICogMjsKKwlmb3IgKGNzcm93ID0gbWF4X2Nzcm93cyAtIDE7IGNzcm93ID49IDA7IGNzcm93LS0pIHsKKworCQkvKiBvbiBhbiBvZGQgY3Nyb3csIGZpcnN0IG91dHB1dCBhICdib3VuZGFyeScgbWFya2VyLAorCQkgKiB0aGVuIHJlc2V0IHRoZSBtZXNzYWdlIGJ1ZmZlciAgKi8KKwkJaWYgKGNzcm93ICYgMHgxKSB7CisJCQluID0gc25wcmludGYocCwgc3BhY2UsICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisJCQkJCSItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworCQkJcCArPSBuOworCQkJc3BhY2UgLT0gbjsKKwkJCWRlYnVnZjIoIiVzXG4iLCBtZW1fYnVmZmVyKTsKKwkJCXAgPSBtZW1fYnVmZmVyOworCQkJc3BhY2UgPSBQQUdFX1NJWkU7CisJCX0KKwkJbiA9IHNucHJpbnRmKHAsIHNwYWNlLCAiY3Nyb3cgJTJkICAgICIsIGNzcm93KTsKKwkJcCArPSBuOworCQlzcGFjZSAtPSBuOworCisJCWZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBwdnQtPm1heGNoOyBjaGFubmVsKyspIHsKKwkJCWRpbmZvID0gJnB2dC0+ZGltbV9pbmZvW2Nzcm93XVtjaGFubmVsXTsKKwkJCWhhbmRsZV9jaGFubmVsKHB2dCwgY3Nyb3csIGNoYW5uZWwsIGRpbmZvKTsKKwkJCW4gPSBzbnByaW50ZihwLCBzcGFjZSwgIiU0ZCBNQiAgIHwgIiwgZGluZm8tPm1lZ2FieXRlcyk7CisJCQlwICs9IG47CisJCQlzcGFjZSAtPSBuOworCQl9CisJCWRlYnVnZjIoIiVzXG4iLCBtZW1fYnVmZmVyKTsKKwkJcCA9IG1lbV9idWZmZXI7CisJCXNwYWNlID0gUEFHRV9TSVpFOworCX0KKworCS8qIE91dHB1dCB0aGUgbGFzdCBib3R0b20gJ2JvdW5kYXJ5JyBtYXJrZXIgKi8KKwluID0gc25wcmludGYocCwgc3BhY2UsICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisJCQkiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKwlwICs9IG47CisJc3BhY2UgLT0gbjsKKwlkZWJ1Z2YyKCIlc1xuIiwgbWVtX2J1ZmZlcik7CisJcCA9IG1lbV9idWZmZXI7CisJc3BhY2UgPSBQQUdFX1NJWkU7CisKKwkvKiBub3cgb3V0cHV0IHRoZSAnY2hhbm5lbCcgbGFiZWxzICovCisJbiA9IHNucHJpbnRmKHAsIHNwYWNlLCAiICAgICAgICAgICAgIik7CisJcCArPSBuOworCXNwYWNlIC09IG47CisJZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IHB2dC0+bWF4Y2g7IGNoYW5uZWwrKykgeworCQluID0gc25wcmludGYocCwgc3BhY2UsICJjaGFubmVsICVkIHwgIiwgY2hhbm5lbCk7CisJCXAgKz0gbjsKKwkJc3BhY2UgLT0gbjsKKwl9CisKKwkvKiBvdXRwdXQgdGhlIGxhc3QgbWVzc2FnZSBhbmQgZnJlZSBidWZmZXIgKi8KKwlkZWJ1Z2YyKCIlc1xuIiwgbWVtX2J1ZmZlcik7CisJa2ZyZWUobWVtX2J1ZmZlcik7Cit9CisKKy8qCisgKglpNTQwMF9nZXRfbWNfcmVncwlyZWFkIGluIHRoZSBuZWNlc3NhcnkgcmVnaXN0ZXJzIGFuZAorICoJCQkJY2FjaGUgbG9jYWxseQorICoKKyAqCQkJRmlsbHMgaW4gdGhlIHByaXZhdGUgZGF0YSBtZW1iZXJzCisgKi8KK3N0YXRpYyB2b2lkIGk1NDAwX2dldF9tY19yZWdzKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSkKK3sKKwlzdHJ1Y3QgaTU0MDBfcHZ0ICpwdnQ7CisJdTMyIGFjdHVhbF90b2xtOworCXUxNiBsaW1pdDsKKwlpbnQgc2xvdF9yb3c7CisJaW50IG1heGNoOworCWludCBtYXhkaW1tcGVyY2g7CisJaW50IHdheTAsIHdheTE7CisKKwlwdnQgPSBtY2ktPnB2dF9pbmZvOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+c3lzdGVtX2FkZHJlc3MsIEFNQkFTRSwKKwkJCSh1MzIgKikgJnB2dC0+YW1iYXNlKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5zeXN0ZW1fYWRkcmVzcywgQU1CQVNFICsgc2l6ZW9mKHUzMiksCisJCQkoKHUzMiAqKSAmcHZ0LT5hbWJhc2UpICsgc2l6ZW9mKHUzMikpOworCisJbWF4ZGltbXBlcmNoID0gcHZ0LT5tYXhkaW1tcGVyY2g7CisJbWF4Y2ggPSBwdnQtPm1heGNoOworCisJZGVidWdmMigiQU1CQVNFPSAweCVseCAgTUFYQ0g9ICVkICBNQVgtRElNTS1QZXItQ0g9ICVkXG4iLAorCQkobG9uZyB1bnNpZ25lZCBpbnQpcHZ0LT5hbWJhc2UsIHB2dC0+bWF4Y2gsIHB2dC0+bWF4ZGltbXBlcmNoKTsKKworCS8qIEdldCB0aGUgQnJhbmNoIE1hcCByZWdzICovCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocHZ0LT5icmFuY2htYXBfd2Vycm9ycywgVE9MTSwgJnB2dC0+dG9sbSk7CisJcHZ0LT50b2xtID4+PSAxMjsKKwlkZWJ1Z2YyKCJcblRPTE0gKG51bWJlciBvZiAyNTZNIHJlZ2lvbnMpID0ldSAoMHgleClcbiIsIHB2dC0+dG9sbSwKKwkJcHZ0LT50b2xtKTsKKworCWFjdHVhbF90b2xtID0gKHUzMikgKCgxMDAwbCAqIHB2dC0+dG9sbSkgPj4gKDMwIC0gMjgpKTsKKwlkZWJ1Z2YyKCJBY3R1YWwgVE9MTSBieXRlIGFkZHI9JXUuJTAzdSBHQiAoMHgleClcbiIsCisJCWFjdHVhbF90b2xtLzEwMDAsIGFjdHVhbF90b2xtICUgMTAwMCwgcHZ0LT50b2xtIDw8IDI4KTsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHB2dC0+YnJhbmNobWFwX3dlcnJvcnMsIE1JUjAsICZwdnQtPm1pcjApOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHB2dC0+YnJhbmNobWFwX3dlcnJvcnMsIE1JUjEsICZwdnQtPm1pcjEpOworCisJLyogR2V0IHRoZSBNSVJbMC0xXSByZWdzICovCisJbGltaXQgPSAocHZ0LT5taXIwID4+IDQpICYgMHgwZmZmOworCXdheTAgPSBwdnQtPm1pcjAgJiAweDE7CisJd2F5MSA9IHB2dC0+bWlyMCAmIDB4MjsKKwlkZWJ1Z2YyKCJNSVIwOiBsaW1pdD0gMHgleCAgV0FZMT0gJXUgIFdBWTA9ICV4XG4iLCBsaW1pdCwgd2F5MSwgd2F5MCk7CisJbGltaXQgPSAocHZ0LT5taXIxID4+IDQpICYgMHhmZmY7CisJd2F5MCA9IHB2dC0+bWlyMSAmIDB4MTsKKwl3YXkxID0gcHZ0LT5taXIxICYgMHgyOworCWRlYnVnZjIoIk1JUjE6IGxpbWl0PSAweCV4ICBXQVkxPSAldSAgV0FZMD0gJXhcbiIsIGxpbWl0LCB3YXkxLCB3YXkwKTsKKworCS8qIEdldCB0aGUgc2V0IG9mIE1UUlswLTNdIHJlZ3MgYnkgZWFjaCBicmFuY2ggKi8KKwlmb3IgKHNsb3Rfcm93ID0gMDsgc2xvdF9yb3cgPCBOVU1fTVRSU19QRVJfQlJBTkNIOyBzbG90X3JvdysrKSB7CisJCWludCB3aGVyZSA9IE1UUjAgKyAoc2xvdF9yb3cgKiBzaXplb2YodTMyKSk7CisKKwkJLyogQnJhbmNoIDAgc2V0IG9mIE1UUiByZWdpc3RlcnMgKi8KKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQocHZ0LT5icmFuY2hfMCwgd2hlcmUsCisJCQkJJnB2dC0+YjBfbXRyW3Nsb3Rfcm93XSk7CisKKwkJZGVidWdmMigiTVRSJWQgd2hlcmU9MHgleCBCMCB2YWx1ZT0weCV4XG4iLCBzbG90X3Jvdywgd2hlcmUsCisJCQlwdnQtPmIwX210cltzbG90X3Jvd10pOworCisJCWlmIChwdnQtPm1heGNoIDwgQ0hBTk5FTFNfUEVSX0JSQU5DSCkgeworCQkJcHZ0LT5iMV9tdHJbc2xvdF9yb3ddID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogQnJhbmNoIDEgc2V0IG9mIE1UUiByZWdpc3RlcnMgKi8KKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQocHZ0LT5icmFuY2hfMSwgd2hlcmUsCisJCQkJJnB2dC0+YjFfbXRyW3Nsb3Rfcm93XSk7CisJCWRlYnVnZjIoIk1UUiVkIHdoZXJlPTB4JXggQjEgdmFsdWU9MHgleFxuIiwgc2xvdF9yb3csIHdoZXJlLAorCQkJcHZ0LT5iMV9tdHJbc2xvdF9yb3ddKTsKKwl9CisKKwkvKiBSZWFkIGFuZCBkdW1wIGJyYW5jaCAwJ3MgTVRScyAqLworCWRlYnVnZjIoIlxuTWVtb3J5IFRlY2hub2xvZ3kgUmVnaXN0ZXJzOlxuIik7CisJZGVidWdmMigiICAgQnJhbmNoIDA6XG4iKTsKKwlmb3IgKHNsb3Rfcm93ID0gMDsgc2xvdF9yb3cgPCBOVU1fTVRSU19QRVJfQlJBTkNIOyBzbG90X3JvdysrKQorCQlkZWNvZGVfbXRyKHNsb3Rfcm93LCBwdnQtPmIwX210cltzbG90X3Jvd10pOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocHZ0LT5icmFuY2hfMCwgQU1CUFJFU0VOVF8wLAorCQkJJnB2dC0+YjBfYW1icHJlc2VudDApOworCWRlYnVnZjIoIlx0XHRBTUItQnJhbmNoIDAtcHJlc2VudDAgMHgleDpcbiIsIHB2dC0+YjBfYW1icHJlc2VudDApOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHB2dC0+YnJhbmNoXzAsIEFNQlBSRVNFTlRfMSwKKwkJCSZwdnQtPmIwX2FtYnByZXNlbnQxKTsKKwlkZWJ1Z2YyKCJcdFx0QU1CLUJyYW5jaCAwLXByZXNlbnQxIDB4JXg6XG4iLCBwdnQtPmIwX2FtYnByZXNlbnQxKTsKKworCS8qIE9ubHkgaWYgd2UgaGF2ZSAyIGJyYW5jaHMgKDQgY2hhbm5lbHMpICovCisJaWYgKHB2dC0+bWF4Y2ggPCBDSEFOTkVMU19QRVJfQlJBTkNIKSB7CisJCXB2dC0+YjFfYW1icHJlc2VudDAgPSAwOworCQlwdnQtPmIxX2FtYnByZXNlbnQxID0gMDsKKwl9IGVsc2UgeworCQkvKiBSZWFkIGFuZCBkdW1wICBicmFuY2ggMSdzIE1UUnMgKi8KKwkJZGVidWdmMigiICAgQnJhbmNoIDE6XG4iKTsKKwkJZm9yIChzbG90X3JvdyA9IDA7IHNsb3Rfcm93IDwgTlVNX01UUlNfUEVSX0JSQU5DSDsgc2xvdF9yb3crKykKKwkJCWRlY29kZV9tdHIoc2xvdF9yb3csIHB2dC0+YjFfbXRyW3Nsb3Rfcm93XSk7CisKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQocHZ0LT5icmFuY2hfMSwgQU1CUFJFU0VOVF8wLAorCQkJCSZwdnQtPmIxX2FtYnByZXNlbnQwKTsKKwkJZGVidWdmMigiXHRcdEFNQi1CcmFuY2ggMS1wcmVzZW50MCAweCV4OlxuIiwKKwkJCXB2dC0+YjFfYW1icHJlc2VudDApOworCQlwY2lfcmVhZF9jb25maWdfd29yZChwdnQtPmJyYW5jaF8xLCBBTUJQUkVTRU5UXzEsCisJCQkJJnB2dC0+YjFfYW1icHJlc2VudDEpOworCQlkZWJ1Z2YyKCJcdFx0QU1CLUJyYW5jaCAxLXByZXNlbnQxIDB4JXg6XG4iLAorCQkJcHZ0LT5iMV9hbWJwcmVzZW50MSk7CisJfQorCisJLyogR28gYW5kIGRldGVybWluZSB0aGUgc2l6ZSBvZiBlYWNoIERJTU0gYW5kIHBsYWNlIGluIGFuCisJICogb3JkZXJseSBtYXRyaXggKi8KKwljYWxjdWxhdGVfZGltbV9zaXplKHB2dCk7Cit9CisKKy8qCisgKglpNTQwMF9pbml0X2Nzcm93cwlJbml0aWFsaXplIHRoZSAnY3Nyb3dzJyB0YWJsZSB3aXRoaW4KKyAqCQkJCXRoZSBtY2kgY29udHJvbAlzdHJ1Y3R1cmUgd2l0aCB0aGUKKyAqCQkJCWFkZHJlc3Npbmcgb2YgbWVtb3J5LgorICoKKyAqCXJldHVybjoKKyAqCQkwCXN1Y2Nlc3MKKyAqCQkxCW5vIGFjdHVhbCBtZW1vcnkgZm91bmQgb24gdGhpcyBNQworICovCitzdGF0aWMgaW50IGk1NDAwX2luaXRfY3Nyb3dzKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSkKK3sKKwlzdHJ1Y3QgaTU0MDBfcHZ0ICpwdnQ7CisJc3RydWN0IGNzcm93X2luZm8gKnBfY3Nyb3c7CisJaW50IGVtcHR5LCBjaGFubmVsX2NvdW50OworCWludCBtYXhfY3Nyb3dzOworCWludCBtdHI7CisJaW50IGNzcm93X21lZ3M7CisJaW50IGNoYW5uZWw7CisJaW50IGNzcm93OworCisJcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKworCWNoYW5uZWxfY291bnQgPSBwdnQtPm1heGNoOworCW1heF9jc3Jvd3MgPSBwdnQtPm1heGRpbW1wZXJjaCAqIDI7CisKKwllbXB0eSA9IDE7CQkvKiBBc3N1bWUgTk8gbWVtb3J5ICovCisKKwlmb3IgKGNzcm93ID0gMDsgY3Nyb3cgPCBtYXhfY3Nyb3dzOyBjc3JvdysrKSB7CisJCXBfY3Nyb3cgPSAmbWNpLT5jc3Jvd3NbY3Nyb3ddOworCisJCXBfY3Nyb3ctPmNzcm93X2lkeCA9IGNzcm93OworCisJCS8qIHVzZSBicmFuY2ggMCBmb3IgdGhlIGJhc2lzICovCisJCW10ciA9IGRldGVybWluZV9tdHIocHZ0LCBjc3JvdywgMCk7CisKKwkJLyogaWYgbm8gRElNTVMgb24gdGhpcyByb3csIGNvbnRpbnVlICovCisJCWlmICghTVRSX0RJTU1TX1BSRVNFTlQobXRyKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIEZBS0UgT1VUIFZBTFVFUywgRklYTUUgKi8KKwkJcF9jc3Jvdy0+Zmlyc3RfcGFnZSA9IDAgKyBjc3JvdyAqIDIwOworCQlwX2Nzcm93LT5sYXN0X3BhZ2UgPSA5ICsgY3Nyb3cgKiAyMDsKKwkJcF9jc3Jvdy0+cGFnZV9tYXNrID0gMHhGRkY7CisKKwkJcF9jc3Jvdy0+Z3JhaW4gPSA4OworCisJCWNzcm93X21lZ3MgPSAwOworCQlmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgcHZ0LT5tYXhjaDsgY2hhbm5lbCsrKQorCQkJY3Nyb3dfbWVncyArPSBwdnQtPmRpbW1faW5mb1tjc3Jvd11bY2hhbm5lbF0ubWVnYWJ5dGVzOworCisJCXBfY3Nyb3ctPm5yX3BhZ2VzID0gY3Nyb3dfbWVncyA8PCA4OworCisJCS8qIEFzc3VtZSBERFIyIGZvciBub3cgKi8KKwkJcF9jc3Jvdy0+bXR5cGUgPSBNRU1fRkJfRERSMjsKKworCQkvKiBhc2sgd2hhdCBkZXZpY2UgdHlwZSBvbiB0aGlzIHJvdyAqLworCQlpZiAoTVRSX0RSQU1fV0lEVEgobXRyKSkKKwkJCXBfY3Nyb3ctPmR0eXBlID0gREVWX1g4OworCQllbHNlCisJCQlwX2Nzcm93LT5kdHlwZSA9IERFVl9YNDsKKworCQlwX2Nzcm93LT5lZGFjX21vZGUgPSBFREFDX1M4RUNEOEVEOworCisJCWVtcHR5ID0gMDsKKwl9CisKKwlyZXR1cm4gZW1wdHk7Cit9CisKKy8qCisgKglpNTQwMF9lbmFibGVfZXJyb3JfcmVwb3J0aW5nCisgKgkJCVR1cm4gb24gdGhlIG1lbW9yeSByZXBvcnRpbmcgZmVhdHVyZXMgb2YgdGhlIGhhcmR3YXJlCisgKi8KK3N0YXRpYyB2b2lkIGk1NDAwX2VuYWJsZV9lcnJvcl9yZXBvcnRpbmcoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKQoreworCXN0cnVjdCBpNTQwMF9wdnQgKnB2dDsKKwl1MzIgZmJkX2Vycm9yX21hc2s7CisKKwlwdnQgPSBtY2ktPnB2dF9pbmZvOworCisJLyogUmVhZCB0aGUgRkJEIEVycm9yIE1hc2sgUmVnaXN0ZXIgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5icmFuY2htYXBfd2Vycm9ycywgRU1BU0tfRkJELAorCQkJJmZiZF9lcnJvcl9tYXNrKTsKKworCS8qIEVuYWJsZSB3aXRoIGEgJzAnICovCisJZmJkX2Vycm9yX21hc2sgJj0gfihFTkFCTEVfRU1BU0tfQUxMKTsKKworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocHZ0LT5icmFuY2htYXBfd2Vycm9ycywgRU1BU0tfRkJELAorCQkJZmJkX2Vycm9yX21hc2spOworfQorCisvKgorICogaTU0MDBfZ2V0X2RpbW1fYW5kX2NoYW5uZWxfY291bnRzKHBkZXYsICZudW1fY3Nyb3dzLCAmbnVtX2NoYW5uZWxzKQorICoKKyAqCWFzayB0aGUgZGV2aWNlIGhvdyBtYW55IGNoYW5uZWxzIGFyZSBwcmVzZW50IGFuZCBob3cgbWFueSBDU1JPV1MKKyAqCSBhcyB3ZWxsCisgKi8KK3N0YXRpYyB2b2lkIGk1NDAwX2dldF9kaW1tX2FuZF9jaGFubmVsX2NvdW50cyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkJaW50ICpudW1fZGltbXNfcGVyX2NoYW5uZWwsCisJCQkJCWludCAqbnVtX2NoYW5uZWxzKQoreworCXU4IHZhbHVlOworCisJLyogTmVlZCB0byByZXRyaWV2ZSBqdXN0IGhvdyBtYW55IGNoYW5uZWxzIGFuZCBkaW1tcyBwZXIgY2hhbm5lbCBhcmUKKwkgKiBzdXBwb3J0ZWQgb24gdGhpcyBtZW1vcnkgY29udHJvbGxlcgorCSAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIE1BWERJTU1QRVJDSCwgJnZhbHVlKTsKKwkqbnVtX2RpbW1zX3Blcl9jaGFubmVsID0gKGludCl2YWx1ZSAqIDI7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBNQVhDSCwgJnZhbHVlKTsKKwkqbnVtX2NoYW5uZWxzID0gKGludCl2YWx1ZTsKK30KKworLyoKKyAqCWk1NDAwX3Byb2JlMQlQcm9iZSBmb3IgT05FIGluc3RhbmNlIG9mIGRldmljZSB0byBzZWUgaWYgaXQgaXMKKyAqCQkJcHJlc2VudC4KKyAqCXJldHVybjoKKyAqCQkwIGZvciBGT1VORCBhIGRldmljZQorICoJCTwgMCBmb3IgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGk1NDAwX3Byb2JlMShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGRldl9pZHgpCit7CisJc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpOworCXN0cnVjdCBpNTQwMF9wdnQgKnB2dDsKKwlpbnQgbnVtX2NoYW5uZWxzOworCWludCBudW1fZGltbXNfcGVyX2NoYW5uZWw7CisJaW50IG51bV9jc3Jvd3M7CisKKwlpZiAoZGV2X2lkeCA+PSBBUlJBWV9TSVpFKGk1NDAwX2RldnMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRlYnVnZjAoIk1DOiAiIF9fRklMRV9fICI6ICVzKCksIHBkZXYgYnVzICV1IGRldj0weCV4IGZuPTB4JXhcbiIsCisJCV9fZnVuY19fLAorCQlwZGV2LT5idXMtPm51bWJlciwKKwkJUENJX1NMT1QocGRldi0+ZGV2Zm4pLCBQQ0lfRlVOQyhwZGV2LT5kZXZmbikpOworCisJLyogV2Ugb25seSBhcmUgbG9va2luZyBmb3IgZnVuYyAwIG9mIHRoZSBzZXQgKi8KKwlpZiAoUENJX0ZVTkMocGRldi0+ZGV2Zm4pICE9IDApCisJCXJldHVybiAtRU5PREVWOworCisJLyogQXNrIHRoZSBkZXZpY2VzIGZvciB0aGUgbnVtYmVyIG9mIENTUk9XUyBhbmQgQ0hBTk5FTFMgc28KKwkgKiB0aGF0IHdlIGNhbiBjYWxjdWxhdGUgdGhlIG1lbW9yeSByZXNvdXJjZXMsIGV0YworCSAqCisJICogVGhlIENoaXBzZXQgd2lsbCByZXBvcnQgd2hhdCBpdCBjYW4gaGFuZGxlIHdoaWNoIHdpbGwgYmUgZ3JlYXRlcgorCSAqIG9yIGVxdWFsIHRvIHdoYXQgdGhlIG1vdGhlcmJvYXJkIG1hbnVmYWN0dXJlciB3aWxsIGltcGxlbWVudC4KKwkgKgorCSAqIEFzIHdlIGRvbid0IGhhdmUgYSBtb3RoZXJib2FyZCBpZGVudGlmaWNhdGlvbiByb3V0aW5lIHRvIGRldGVybWluZQorCSAqIGFjdHVhbCBudW1iZXIgb2Ygc2xvdHMvZGltbXMgcGVyIGNoYW5uZWwsIHdlIHRodXMgdXRpbGl6ZSB0aGUKKwkgKiByZXNvdXJjZSBhcyBzcGVjaWZpZWQgYnkgdGhlIGNoaXBzZXQuIFRodXMsIHdlIG1pZ2h0IGhhdmUKKwkgKiBoYXZlIG1vcmUgRElNTXMgcGVyIGNoYW5uZWwgdGhhbiBhY3R1YWxseSBvbiB0aGUgbW9ibywgYnV0IHRoaXMKKwkgKiBhbGxvd3MgdGhlIGRyaXZlciB0byBzdXBwb3J0IHVwdG8gdGhlIGNoaXBzZXQgbWF4LCB3aXRob3V0CisJICogc29tZSBmYW5jeSBtb2JvIGRldGVybWluYXRpb24uCisJICovCisJaTU0MDBfZ2V0X2RpbW1fYW5kX2NoYW5uZWxfY291bnRzKHBkZXYsICZudW1fZGltbXNfcGVyX2NoYW5uZWwsCisJCQkJCSZudW1fY2hhbm5lbHMpOworCW51bV9jc3Jvd3MgPSBudW1fZGltbXNfcGVyX2NoYW5uZWwgKiAyOworCisJZGVidWdmMCgiTUM6ICVzKCk6IE51bWJlciBvZiAtIENoYW5uZWxzPSAlZCAgRElNTVM9ICVkICBDU1JPV1M9ICVkXG4iLAorCQlfX2Z1bmNfXywgbnVtX2NoYW5uZWxzLCBudW1fZGltbXNfcGVyX2NoYW5uZWwsIG51bV9jc3Jvd3MpOworCisJLyogYWxsb2NhdGUgYSBuZXcgTUMgY29udHJvbCBzdHJ1Y3R1cmUgKi8KKwltY2kgPSBlZGFjX21jX2FsbG9jKHNpemVvZigqcHZ0KSwgbnVtX2Nzcm93cywgbnVtX2NoYW5uZWxzLCAwKTsKKworCWlmIChtY2kgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkZWJ1Z2YwKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpOiBtY2kgPSAlcFxuIiwgX19mdW5jX18sIG1jaSk7CisKKwltY2ktPmRldiA9ICZwZGV2LT5kZXY7CS8qIHJlY29yZCBwdHIgIHRvIHRoZSBnZW5lcmljIGRldmljZSAqLworCisJcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKwlwdnQtPnN5c3RlbV9hZGRyZXNzID0gcGRldjsJLyogUmVjb3JkIHRoaXMgZGV2aWNlIGluIG91ciBwcml2YXRlICovCisJcHZ0LT5tYXhjaCA9IG51bV9jaGFubmVsczsKKwlwdnQtPm1heGRpbW1wZXJjaCA9IG51bV9kaW1tc19wZXJfY2hhbm5lbDsKKworCS8qICdnZXQnIHRoZSBwY2kgZGV2aWNlcyB3ZSB3YW50IHRvIHJlc2VydmUgZm9yIG91ciB1c2UgKi8KKwlpZiAoaTU0MDBfZ2V0X2RldmljZXMobWNpLCBkZXZfaWR4KSkKKwkJZ290byBmYWlsMDsKKworCS8qIFRpbWUgdG8gZ2V0IHNlcmlvdXMgKi8KKwlpNTQwMF9nZXRfbWNfcmVncyhtY2kpOwkvKiByZXRyaWV2ZSB0aGUgaGFyZHdhcmUgcmVnaXN0ZXJzICovCisKKwltY2ktPm1jX2lkeCA9IDA7CisJbWNpLT5tdHlwZV9jYXAgPSBNRU1fRkxBR19GQl9ERFIyOworCW1jaS0+ZWRhY19jdGxfY2FwID0gRURBQ19GTEFHX05PTkU7CisJbWNpLT5lZGFjX2NhcCA9IEVEQUNfRkxBR19OT05FOworCW1jaS0+bW9kX25hbWUgPSAiaTU0MDBfZWRhYy5jIjsKKwltY2ktPm1vZF92ZXIgPSBJNTQwMF9SRVZJU0lPTjsKKwltY2ktPmN0bF9uYW1lID0gaTU0MDBfZGV2c1tkZXZfaWR4XS5jdGxfbmFtZTsKKwltY2ktPmRldl9uYW1lID0gcGNpX25hbWUocGRldik7CisJbWNpLT5jdGxfcGFnZV90b19waHlzID0gTlVMTDsKKworCS8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlciB0byBhbiBhY3R1YWwgb3BlcmF0aW9uIGZ1bmN0aW9uICovCisJbWNpLT5lZGFjX2NoZWNrID0gaTU0MDBfY2hlY2tfZXJyb3I7CisKKwkvKiBpbml0aWFsaXplIHRoZSBNQyBjb250cm9sIHN0cnVjdHVyZSAnY3Nyb3dzJyB0YWJsZQorCSAqIHdpdGggdGhlIG1hcHBpbmcgYW5kIGNvbnRyb2wgaW5mb3JtYXRpb24gKi8KKwlpZiAoaTU0MDBfaW5pdF9jc3Jvd3MobWNpKSkgeworCQlkZWJ1Z2YwKCJNQzogU2V0dGluZyBtY2ktPmVkYWNfY2FwIHRvIEVEQUNfRkxBR19OT05FXG4iCisJCQkiICAgIGJlY2F1c2UgaTU0MDBfaW5pdF9jc3Jvd3MoKSByZXR1cm5lZCBub256ZXJvICIKKwkJCSJ2YWx1ZVxuIik7CisJCW1jaS0+ZWRhY19jYXAgPSBFREFDX0ZMQUdfTk9ORTsJLyogbm8gY3Nyb3dzIGZvdW5kICovCisJfSBlbHNlIHsKKwkJZGVidWdmMSgiTUM6IEVuYWJsZSBlcnJvciByZXBvcnRpbmcgbm93XG4iKTsKKwkJaTU0MDBfZW5hYmxlX2Vycm9yX3JlcG9ydGluZyhtY2kpOworCX0KKworCS8qIGFkZCB0aGlzIG5ldyBNQyBjb250cm9sIHN0cnVjdHVyZSB0byBFREFDJ3MgbGlzdCBvZiBNQ3MgKi8KKwlpZiAoZWRhY19tY19hZGRfbWMobWNpKSkgeworCQlkZWJ1Z2YwKCJNQzogIiBfX0ZJTEVfXworCQkJIjogJXMoKTogZmFpbGVkIGVkYWNfbWNfYWRkX21jKClcbiIsIF9fZnVuY19fKTsKKwkJLyogRklYTUU6IHBlcmhhcHMgc29tZSBjb2RlIHNob3VsZCBnbyBoZXJlIHRoYXQgZGlzYWJsZXMgZXJyb3IKKwkJICogcmVwb3J0aW5nIGlmIHdlIGp1c3QgZW5hYmxlZCBpdAorCQkgKi8KKwkJZ290byBmYWlsMTsKKwl9CisKKwlpNTQwMF9jbGVhcl9lcnJvcihtY2kpOworCisJLyogYWxsb2NhdGluZyBnZW5lcmljIFBDSSBjb250cm9sIGluZm8gKi8KKwlpNTQwMF9wY2kgPSBlZGFjX3BjaV9jcmVhdGVfZ2VuZXJpY19jdGwoJnBkZXYtPmRldiwgRURBQ19NT0RfU1RSKTsKKwlpZiAoIWk1NDAwX3BjaSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkiJXMoKTogVW5hYmxlIHRvIGNyZWF0ZSBQQ0kgY29udHJvbFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJIiVzKCk6IFBDSSBlcnJvciByZXBvcnQgdmlhIEVEQUMgbm90IHNldHVwXG4iLAorCQkJX19mdW5jX18pOworCX0KKworCXJldHVybiAwOworCisJLyogRXJyb3IgZXhpdCB1bndpbmRpbmcgc3RhY2sgKi8KK2ZhaWwxOgorCisJaTU0MDBfcHV0X2RldmljZXMobWNpKTsKKworZmFpbDA6CisJZWRhY19tY19mcmVlKG1jaSk7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKy8qCisgKglpNTQwMF9pbml0X29uZQljb25zdHJ1Y3RvciBmb3Igb25lIGluc3RhbmNlIG9mIGRldmljZQorICoKKyAqIAlyZXR1cm5zOgorICoJCW5lZ2F0aXZlIG9uIGVycm9yCisgKgkJY291bnQgKD49IDApCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGk1NDAwX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmM7CisKKwlkZWJ1Z2YwKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwkvKiB3YWtlIHVwIGRldmljZSAqLworCXJjID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJjID09IC1FSU8pCisJCXJldHVybiByYzsKKworCS8qIG5vdyBwcm9iZSBhbmQgZW5hYmxlIHRoZSBkZXZpY2UgKi8KKwlyZXR1cm4gaTU0MDBfcHJvYmUxKHBkZXYsIGlkLT5kcml2ZXJfZGF0YSk7Cit9CisKKy8qCisgKglpNTQwMF9yZW1vdmVfb25lCWRlc3RydWN0b3IgZm9yIG9uZSBpbnN0YW5jZSBvZiBkZXZpY2UKKyAqCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBpNTQwMF9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaTsKKworCWRlYnVnZjAoX19GSUxFX18gIjogJXMoKVxuIiwgX19mdW5jX18pOworCisJaWYgKGk1NDAwX3BjaSkKKwkJZWRhY19wY2lfcmVsZWFzZV9nZW5lcmljX2N0bChpNTQwMF9wY2kpOworCisJbWNpID0gZWRhY19tY19kZWxfbWMoJnBkZXYtPmRldik7CisJaWYgKCFtY2kpCisJCXJldHVybjsKKworCS8qIHJldHJpZXZlIHJlZmVyZW5jZXMgdG8gcmVzb3VyY2VzLCBhbmQgZnJlZSB0aG9zZSByZXNvdXJjZXMgKi8KKwlpNTQwMF9wdXRfZGV2aWNlcyhtY2kpOworCisJZWRhY19tY19mcmVlKG1jaSk7Cit9CisKKy8qCisgKglwY2lfZGV2aWNlX2lkCXRhYmxlIGZvciB3aGljaCBkZXZpY2VzIHdlIGFyZSBsb29raW5nIGZvcgorICoKKyAqCVRoZSAiRTUwMFAiIGRldmljZSBpcyB0aGUgZmlyc3QgZGV2aWNlIHN1cHBvcnRlZC4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGk1NDAwX3BjaV90YmxbXSBfX2RldmluaXRkYXRhID0geworCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfNTQwMF9FUlIpfSwKKwl7MCx9CQkJLyogMCB0ZXJtaW5hdGVkIGxpc3QuICovCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaTU0MDBfcGNpX3RibCk7CisKKy8qCisgKglpNTQwMF9kcml2ZXIJcGNpX2RyaXZlciBzdHJ1Y3R1cmUgZm9yIHRoaXMgbW9kdWxlCisgKgorICovCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgaTU0MDBfZHJpdmVyID0geworCS5uYW1lID0gImk1NDAwX2VkYWMiLAorCS5wcm9iZSA9IGk1NDAwX2luaXRfb25lLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChpNTQwMF9yZW1vdmVfb25lKSwKKwkuaWRfdGFibGUgPSBpNTQwMF9wY2lfdGJsLAorfTsKKworLyoKKyAqCWk1NDAwX2luaXQJCU1vZHVsZSBlbnRyeSBmdW5jdGlvbgorICoJCQlUcnkgdG8gaW5pdGlhbGl6ZSB0aGlzIG1vZHVsZSBmb3IgaXRzIGRldmljZXMKKyAqLworc3RhdGljIGludCBfX2luaXQgaTU0MDBfaW5pdCh2b2lkKQoreworCWludCBwY2lfcmM7CisKKwlkZWJ1Z2YyKCJNQzogIiBfX0ZJTEVfXyAiOiAlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwkvKiBFbnN1cmUgdGhhdCB0aGUgT1BTVEFURSBpcyBzZXQgY29ycmVjdGx5IGZvciBQT0xMIG9yIE5NSSAqLworCW9wc3RhdGVfaW5pdCgpOworCisJcGNpX3JjID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmaTU0MDBfZHJpdmVyKTsKKworCXJldHVybiAocGNpX3JjIDwgMCkgPyBwY2lfcmMgOiAwOworfQorCisvKgorICoJaTU0MDBfZXhpdCgpCU1vZHVsZSBleGl0IGZ1bmN0aW9uCisgKgkJCVVucmVnaXN0ZXIgdGhlIGRyaXZlcgorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgaTU0MDBfZXhpdCh2b2lkKQoreworCWRlYnVnZjIoIk1DOiAiIF9fRklMRV9fICI6ICVzKClcbiIsIF9fZnVuY19fKTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmk1NDAwX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGk1NDAwX2luaXQpOworbW9kdWxlX2V4aXQoaTU0MDBfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkJlbiBXb29kYXJkIDx3b29kYXJkQHJlZGhhdC5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAcmVkaGF0LmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIlJlZCBIYXQgSW5jLiAoaHR0cDovL3d3dy5yZWRoYXQuY29tKSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNQyBEcml2ZXIgZm9yIEludGVsIEk1NDAwIG1lbW9yeSBjb250cm9sbGVycyAtICIKKwkJICAgSTU0MDBfUkVWSVNJT04pOworCittb2R1bGVfcGFyYW0oZWRhY19vcF9zdGF0ZSwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZWRhY19vcF9zdGF0ZSwgIkVEQUMgRXJyb3IgUmVwb3J0aW5nIHN0YXRlOiAwPVBvbGwsMT1OTUkiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9pODI4NzVwX2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9pODI4NzVwX2VkYWMuYwppbmRleCBlYmIwMzdiLi5iMmQ4M2I5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvaTgyODc1cF9lZGFjLmMKKysrIGIvZHJpdmVycy9lZGFjL2k4Mjg3NXBfZWRhYy5jCkBAIC0zMTEsOSArMzExLDcgQEAKIAl9CiAKIAkvKiBjYWNoZSBpcyBpcnJlbGV2YW50IGZvciBQQ0kgYnVzIHJlYWRzL3dyaXRlcyAqLwotCXdpbmRvdyA9IGlvcmVtYXBfbm9jYWNoZShwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKSwKLQkJCQkgcGNpX3Jlc291cmNlX2xlbihkZXYsIDApKTsKLQorCXdpbmRvdyA9IHBjaV9pb3JlbWFwX2JhcihkZXYsIDApOwogCWlmICh3aW5kb3cgPT0gTlVMTCkgewogCQlpODI4NzVwX3ByaW50ayhLRVJOX0VSUiwgIiVzKCk6IEZhaWxlZCB0byBpb3JlbWFwIGJhcjZcbiIsCiAJCQlfX2Z1bmNfXyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvbXBjODV4eF9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvbXBjODV4eF9lZGFjLmMKaW5kZXggMGNmY2IyZC4uODUzZWYzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL21wYzg1eHhfZWRhYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9tcGM4NXh4X2VkYWMuYwpAQCAtNjMwLDI3ICs2MzAsMjIgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgbXBjODV4eF9sMl9lcnJfb2ZfbWF0Y2hbXSA9IHsKLQl7Ci0JIC5jb21wYXRpYmxlID0gImZzbCw4NTQwLWwyLWNhY2hlLWNvbnRyb2xsZXIiLAotCSB9LAotCXsKLQkgLmNvbXBhdGlibGUgPSAiZnNsLDg1NDEtbDItY2FjaGUtY29udHJvbGxlciIsCi0JIH0sCi0JewotCSAuY29tcGF0aWJsZSA9ICJmc2wsODU0NC1sMi1jYWNoZS1jb250cm9sbGVyIiwKLQkgfSwKLQl7Ci0JIC5jb21wYXRpYmxlID0gImZzbCw4NTQ4LWwyLWNhY2hlLWNvbnRyb2xsZXIiLAotCSB9LAotCXsKLQkgLmNvbXBhdGlibGUgPSAiZnNsLDg1NTUtbDItY2FjaGUtY29udHJvbGxlciIsCi0JIH0sCi0JewotCSAuY29tcGF0aWJsZSA9ICJmc2wsODU2OC1sMi1jYWNoZS1jb250cm9sbGVyIiwKLQkgfSwKLQl7Ci0JIC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTcyLWwyLWNhY2hlLWNvbnRyb2xsZXIiLAotCSB9LAorLyogZGVwcmVjYXRlIHRoZSBmc2wsODUuLiBmb3JtcyBpbiB0aGUgZnV0dXJlLCAyLjYuMzA/ICovCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsODU0MC1sMi1jYWNoZS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCw4NTQxLWwyLWNhY2hlLWNvbnRyb2xsZXIiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLDg1NDQtbDItY2FjaGUtY29udHJvbGxlciIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsODU0OC1sMi1jYWNoZS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCw4NTU1LWwyLWNhY2hlLWNvbnRyb2xsZXIiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLDg1NjgtbDItY2FjaGUtY29udHJvbGxlciIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjODUzNi1sMi1jYWNoZS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTQwLWwyLWNhY2hlLWNvbnRyb2xsZXIiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDEtbDItY2FjaGUtY29udHJvbGxlciIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0NC1sMi1jYWNoZS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTQ4LWwyLWNhY2hlLWNvbnRyb2xsZXIiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NTUtbDItY2FjaGUtY29udHJvbGxlciIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjODU2MC1sMi1jYWNoZS1jb250cm9sbGVyIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTY4LWwyLWNhY2hlLWNvbnRyb2xsZXIiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NzItbDItY2FjaGUtY29udHJvbGxlciIsIH0sCiAJe30sCiB9OwogCkBAIC05NjcsMjcgKzk2MiwyMiBAQAogfQogCiBzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBtcGM4NXh4X21jX2Vycl9vZl9tYXRjaFtdID0gewotCXsKLQkgLmNvbXBhdGlibGUgPSAiZnNsLDg1NDAtbWVtb3J5LWNvbnRyb2xsZXIiLAotCSB9LAotCXsKLQkgLmNvbXBhdGlibGUgPSAiZnNsLDg1NDEtbWVtb3J5LWNvbnRyb2xsZXIiLAotCSB9LAotCXsKLQkgLmNvbXBhdGlibGUgPSAiZnNsLDg1NDQtbWVtb3J5LWNvbnRyb2xsZXIiLAotCSB9LAotCXsKLQkgLmNvbXBhdGlibGUgPSAiZnNsLDg1NDgtbWVtb3J5LWNvbnRyb2xsZXIiLAotCSB9LAotCXsKLQkgLmNvbXBhdGlibGUgPSAiZnNsLDg1NTUtbWVtb3J5LWNvbnRyb2xsZXIiLAotCSB9LAotCXsKLQkgLmNvbXBhdGlibGUgPSAiZnNsLDg1NjgtbWVtb3J5LWNvbnRyb2xsZXIiLAotCSB9LAotCXsKLQkgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NzItbWVtb3J5LWNvbnRyb2xsZXIiLAotCSB9LAorLyogZGVwcmVjYXRlIHRoZSBmc2wsODUuLiBmb3JtcyBpbiB0aGUgZnV0dXJlLCAyLjYuMzA/ICovCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsODU0MC1tZW1vcnktY29udHJvbGxlciIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsODU0MS1tZW1vcnktY29udHJvbGxlciIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsODU0NC1tZW1vcnktY29udHJvbGxlciIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsODU0OC1tZW1vcnktY29udHJvbGxlciIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsODU1NS1tZW1vcnktY29udHJvbGxlciIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsODU2OC1tZW1vcnktY29udHJvbGxlciIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjODUzNi1tZW1vcnktY29udHJvbGxlciIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0MC1tZW1vcnktY29udHJvbGxlciIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0MS1tZW1vcnktY29udHJvbGxlciIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0NC1tZW1vcnktY29udHJvbGxlciIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0OC1tZW1vcnktY29udHJvbGxlciIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjODU1NS1tZW1vcnktY29udHJvbGxlciIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjODU2MC1tZW1vcnktY29udHJvbGxlciIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjODU2OC1tZW1vcnktY29udHJvbGxlciIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1tZW1vcnktY29udHJvbGxlciIsIH0sCiAJe30sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZpcmV3aXJlL2Z3LWNhcmQuYyBiL2RyaXZlcnMvZmlyZXdpcmUvZnctY2FyZC5jCmluZGV4IDQxOGMxOGYuLjc5OWY5NDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlyZXdpcmUvZnctY2FyZC5jCisrKyBiL2RyaXZlcnMvZmlyZXdpcmUvZnctY2FyZC5jCkBAIC03NSw3ICs3NSw3IEBACiAJICogY29udHJvbGxlciwgYmxvY2sgcmVhZHMgdG8gdGhlIGNvbmZpZyByb20gYWNjZXNzZXMgdGhlIGhvc3QKIAkgKiBtZW1vcnksIGJ1dCBxdWFkbGV0IHJlYWQgYWNjZXNzIHRoZSBoYXJkd2FyZSBidXMgaW5mbyBibG9jawogCSAqIHJlZ2lzdGVycy4gIFRoYXQncyBqdXN0IGNyYWNrLCBidXQgaXQgbWVhbnMgd2Ugc2hvdWxkIG1ha2UKLQkgKiBzdXJlIHRoZSBjb250ZW50cyBvZiBidXMgaW5mbyBibG9jayBpbiBob3N0IG1lbW9yeSBtYXRoY2VzCisJICogc3VyZSB0aGUgY29udGVudHMgb2YgYnVzIGluZm8gYmxvY2sgaW4gaG9zdCBtZW1vcnkgbWF0Y2hlcwogCSAqIHRoZSB2ZXJzaW9uIHN0b3JlZCBpbiB0aGUgT0hDSSByZWdpc3RlcnMuCiAJICovCiAKQEAgLTE4OSw2ICsxODksMTcgQEAKIAk2MywgNSwgNywgOCwgMTAsIDEzLCAxNiwgMTgsIDIxLCAyNCwgMjYsIDI5LCAzMiwgMzUsIDM3LCA0MAogfTsKIAordm9pZAorZndfc2NoZWR1bGVfYm1fd29yayhzdHJ1Y3QgZndfY2FyZCAqY2FyZCwgdW5zaWduZWQgbG9uZyBkZWxheSkKK3sKKwlpbnQgc2NoZWR1bGVkOworCisJZndfY2FyZF9nZXQoY2FyZCk7CisJc2NoZWR1bGVkID0gc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjYXJkLT53b3JrLCBkZWxheSk7CisJaWYgKCFzY2hlZHVsZWQpCisJCWZ3X2NhcmRfcHV0KGNhcmQpOworfQorCiBzdGF0aWMgdm9pZAogZndfY2FyZF9ibV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKQEAgLTIwNiw3ICsyMTcsNyBAQAogCiAJaWYgKGxvY2FsX25vZGUgPT0gTlVMTCkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKKwkJZ290byBvdXRfcHV0X2NhcmQ7CiAJfQogCWZ3X25vZGVfZ2V0KGxvY2FsX25vZGUpOwogCWZ3X25vZGVfZ2V0KHJvb3Rfbm9kZSk7CkBAIC0yODAsNyArMjkxLDcgQEAKIAkJICogdGhpcyB0YXNrIDEwMG1zIGZyb20gbm93LgogCQkgKi8KIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNhcmQtPndvcmssIERJVl9ST1VORF9VUChIWiwgMTApKTsKKwkJZndfc2NoZWR1bGVfYm1fd29yayhjYXJkLCBESVZfUk9VTkRfVVAoSFosIDEwKSk7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMzU1LDYgKzM2Niw4IEBACiAJCWZ3X2RldmljZV9wdXQocm9vdF9kZXZpY2UpOwogCWZ3X25vZGVfcHV0KHJvb3Rfbm9kZSk7CiAJZndfbm9kZV9wdXQobG9jYWxfbm9kZSk7Cisgb3V0X3B1dF9jYXJkOgorCWZ3X2NhcmRfcHV0KGNhcmQpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtNTEwLDcgKzUyMyw2IEBACiAJZndfY2FyZF9wdXQoY2FyZCk7CiAJd2FpdF9mb3JfY29tcGxldGlvbigmY2FyZC0+ZG9uZSk7CiAKLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmNhcmQtPndvcmspOwogCVdBUk5fT04oIWxpc3RfZW1wdHkoJmNhcmQtPnRyYW5zYWN0aW9uX2xpc3QpKTsKIAlkZWxfdGltZXJfc3luYygmY2FyZC0+Zmx1c2hfdGltZXIpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJld2lyZS9mdy1kZXZpY2UuYyBiL2RyaXZlcnMvZmlyZXdpcmUvZnctZGV2aWNlLmMKaW5kZXggNmI5YmU0Mi4uYzE3M2JlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJld2lyZS9mdy1kZXZpY2UuYworKysgYi9kcml2ZXJzL2ZpcmV3aXJlL2Z3LWRldmljZS5jCkBAIC02MTcsNyArNjE3LDcgQEAKICAqLwogREVDTEFSRV9SV1NFTShmd19kZXZpY2VfcndzZW0pOwogCi1zdGF0aWMgREVGSU5FX0lEUihmd19kZXZpY2VfaWRyKTsKK0RFRklORV9JRFIoZndfZGV2aWNlX2lkcik7CiBpbnQgZndfY2Rldl9tYWpvcjsKIAogc3RydWN0IGZ3X2RldmljZSAqZndfZGV2aWNlX2dldF9ieV9kZXZ0KGRldl90IGRldnQpCkBAIC02ODksNyArNjg5LDcgQEAKIAkJCWZ3X25vdGlmeSgiZ2l2aW5nIHVwIG9uIGNvbmZpZyByb20gZm9yIG5vZGUgaWQgJXhcbiIsCiAJCQkJICBkZXZpY2UtPm5vZGVfaWQpOwogCQkJaWYgKGRldmljZS0+bm9kZSA9PSBkZXZpY2UtPmNhcmQtPnJvb3Rfbm9kZSkKLQkJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmRldmljZS0+Y2FyZC0+d29yaywgMCk7CisJCQkJZndfc2NoZWR1bGVfYm1fd29yayhkZXZpY2UtPmNhcmQsIDApOwogCQkJZndfZGV2aWNlX3JlbGVhc2UoJmRldmljZS0+ZGV2aWNlKTsKIAkJfQogCQlyZXR1cm47CkBAIC03NTgsNyArNzU4LDcgQEAKIAkgKiBwcmV0dHkgaGFybWxlc3MuCiAJICovCiAJaWYgKGRldmljZS0+bm9kZSA9PSBkZXZpY2UtPmNhcmQtPnJvb3Rfbm9kZSkKLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZkZXZpY2UtPmNhcmQtPndvcmssIDApOworCQlmd19zY2hlZHVsZV9ibV93b3JrKGRldmljZS0+Y2FyZCwgMCk7CiAKIAlyZXR1cm47CiAKQEAgLTg5Miw3ICs4OTIsNyBAQAogCWZ3X2RldmljZV9zaHV0ZG93bih3b3JrKTsKICBvdXQ6CiAJaWYgKG5vZGVfaWQgPT0gY2FyZC0+cm9vdF9ub2RlLT5ub2RlX2lkKQotCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNhcmQtPndvcmssIDApOworCQlmd19zY2hlZHVsZV9ibV93b3JrKGNhcmQsIDApOwogfQogCiB2b2lkIGZ3X25vZGVfZXZlbnQoc3RydWN0IGZ3X2NhcmQgKmNhcmQsIHN0cnVjdCBmd19ub2RlICpub2RlLCBpbnQgZXZlbnQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZpcmV3aXJlL2Z3LWRldmljZS5oIGIvZHJpdmVycy9maXJld2lyZS9mdy1kZXZpY2UuaAppbmRleCA0MjMwNWJiLi5kZjUxNzMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2ZpcmV3aXJlL2Z3LWRldmljZS5oCisrKyBiL2RyaXZlcnMvZmlyZXdpcmUvZnctZGV2aWNlLmgKQEAgLTIxLDYgKzIxLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvY2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgogI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogCkBAIC05OSw2ICsxMDAsNyBAQAogdm9pZCBmd19kZXZpY2VfY2Rldl9yZW1vdmUoc3RydWN0IGZ3X2RldmljZSAqZGV2aWNlKTsKIAogZXh0ZXJuIHN0cnVjdCByd19zZW1hcGhvcmUgZndfZGV2aWNlX3J3c2VtOworZXh0ZXJuIHN0cnVjdCBpZHIgZndfZGV2aWNlX2lkcjsKIGV4dGVybiBpbnQgZndfY2Rldl9tYWpvcjsKIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlyZXdpcmUvZnctc2JwMi5jIGIvZHJpdmVycy9maXJld2lyZS9mdy1zYnAyLmMKaW5kZXggZTU0NDAzZS4uZTg4ZDUwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJld2lyZS9mdy1zYnAyLmMKKysrIGIvZHJpdmVycy9maXJld2lyZS9mdy1zYnAyLmMKQEAgLTY3MCwxNyArNjcwLDYgQEAKIAkJCSZkLCBzaXplb2YoZCksIGNvbXBsZXRlX2FnZW50X3Jlc2V0X3dyaXRlX25vX3dhaXQsIHQpOwogfQogCi1zdGF0aWMgdm9pZCBzYnAyX3NldF9nZW5lcmF0aW9uKHN0cnVjdCBzYnAyX2xvZ2ljYWxfdW5pdCAqbHUsIGludCBnZW5lcmF0aW9uKQotewotCXN0cnVjdCBmd19jYXJkICpjYXJkID0gZndfZGV2aWNlKGx1LT50Z3QtPnVuaXQtPmRldmljZS5wYXJlbnQpLT5jYXJkOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBzZXJpYWxpemUgd2l0aCBjb21wYXJpc29ucyBvZiBsdS0+Z2VuZXJhdGlvbiBhbmQgY2FyZC0+Z2VuZXJhdGlvbiAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0JbHUtPmdlbmVyYXRpb24gPSBnZW5lcmF0aW9uOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLX0KLQogc3RhdGljIGlubGluZSB2b2lkIHNicDJfYWxsb3dfYmxvY2soc3RydWN0IHNicDJfbG9naWNhbF91bml0ICpsdSkKIHsKIAkvKgpAQCAtODg0LDcgKzg3Myw3IEBACiAJCWdvdG8gb3V0OwogCiAJZ2VuZXJhdGlvbiAgICA9IGRldmljZS0+Z2VuZXJhdGlvbjsKLQlzbXBfcm1iKCk7ICAgIC8qIG5vZGVfaWQgbXVzdCBub3QgYmUgb2xkZXIgdGhhbiBnZW5lcmF0aW9uICovCisJc21wX3JtYigpOyAgICAvKiBub2RlIElEcyBtdXN0IG5vdCBiZSBvbGRlciB0aGFuIGdlbmVyYXRpb24gKi8KIAlub2RlX2lkICAgICAgID0gZGV2aWNlLT5ub2RlX2lkOwogCWxvY2FsX25vZGVfaWQgPSBkZXZpY2UtPmNhcmQtPm5vZGVfaWQ7CiAKQEAgLTkwOCw3ICs4OTcsOCBAQAogCiAJdGd0LT5ub2RlX2lkCSAgPSBub2RlX2lkOwogCXRndC0+YWRkcmVzc19oaWdoID0gbG9jYWxfbm9kZV9pZCA8PCAxNjsKLQlzYnAyX3NldF9nZW5lcmF0aW9uKGx1LCBnZW5lcmF0aW9uKTsKKwlzbXBfd21iKCk7CSAgLyogbm9kZSBJRHMgbXVzdCBub3QgYmUgb2xkZXIgdGhhbiBnZW5lcmF0aW9uICovCisJbHUtPmdlbmVyYXRpb24JICA9IGdlbmVyYXRpb247CiAKIAlsdS0+Y29tbWFuZF9ibG9ja19hZ2VudF9hZGRyZXNzID0KIAkJKCh1NjQpKGJlMzJfdG9fY3B1KHJlc3BvbnNlLmNvbW1hbmRfYmxvY2tfYWdlbnQuaGlnaCkgJiAweGZmZmYpCkBAIC0xMjAxLDcgKzExOTEsNyBAQAogCQlnb3RvIG91dDsKIAogCWdlbmVyYXRpb24gICAgPSBkZXZpY2UtPmdlbmVyYXRpb247Ci0Jc21wX3JtYigpOyAgICAvKiBub2RlX2lkIG11c3Qgbm90IGJlIG9sZGVyIHRoYW4gZ2VuZXJhdGlvbiAqLworCXNtcF9ybWIoKTsgICAgLyogbm9kZSBJRHMgbXVzdCBub3QgYmUgb2xkZXIgdGhhbiBnZW5lcmF0aW9uICovCiAJbm9kZV9pZCAgICAgICA9IGRldmljZS0+bm9kZV9pZDsKIAlsb2NhbF9ub2RlX2lkID0gZGV2aWNlLT5jYXJkLT5ub2RlX2lkOwogCkBAIC0xMjI4LDcgKzEyMTgsOCBAQAogCiAJdGd0LT5ub2RlX2lkICAgICAgPSBub2RlX2lkOwogCXRndC0+YWRkcmVzc19oaWdoID0gbG9jYWxfbm9kZV9pZCA8PCAxNjsKLQlzYnAyX3NldF9nZW5lcmF0aW9uKGx1LCBnZW5lcmF0aW9uKTsKKwlzbXBfd21iKCk7CSAgLyogbm9kZSBJRHMgbXVzdCBub3QgYmUgb2xkZXIgdGhhbiBnZW5lcmF0aW9uICovCisJbHUtPmdlbmVyYXRpb24JICA9IGdlbmVyYXRpb247CiAKIAlmd19ub3RpZnkoIiVzOiByZWNvbm5lY3RlZCB0byBMVU4gJTA0eCAoJWQgcmV0cmllcylcbiIsCiAJCSAgdGd0LT5idXNfaWQsIGx1LT5sdW4sIGx1LT5yZXRyaWVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlyZXdpcmUvZnctdG9wb2xvZ3kuYyBiL2RyaXZlcnMvZmlyZXdpcmUvZnctdG9wb2xvZ3kuYwppbmRleCA1ZTIwNDcxMy4uYzliZTZlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJld2lyZS9mdy10b3BvbG9neS5jCisrKyBiL2RyaXZlcnMvZmlyZXdpcmUvZnctdG9wb2xvZ3kuYwpAQCAtMzU1LDYgKzM1NSw5IEBACiB7CiAJZndfbm9kZV9ldmVudChjYXJkLCBub2RlLCBGV19OT0RFX0RFU1RST1lFRCk7CiAJZndfbm9kZV9wdXQobm9kZSk7CisKKwkvKiBUb3BvbG9neSBoYXMgY2hhbmdlZCAtIHJlc2V0IGJ1cyBtYW5hZ2VyIHJldHJ5IGNvdW50ZXIgKi8KKwljYXJkLT5ibV9yZXRyaWVzID0gMDsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTM3NCw2ICszNzcsOSBAQAogCX0KIAogCWZ3X25vZGVfZXZlbnQoY2FyZCwgbm9kZSwgRldfTk9ERV9DUkVBVEVEKTsKKworCS8qIFRvcG9sb2d5IGhhcyBjaGFuZ2VkIC0gcmVzZXQgYnVzIG1hbmFnZXIgcmV0cnkgY291bnRlciAqLworCWNhcmQtPmJtX3JldHJpZXMgPSAwOwogfQogCiB2b2lkIGZ3X2Rlc3Ryb3lfbm9kZXMoc3RydWN0IGZ3X2NhcmQgKmNhcmQpCkBAIC01MTQsMTQgKzUyMCw2IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwogCi0JLyoKLQkgKiBJZiB0aGUgbmV3IHRvcG9sb2d5IGhhcyBhIGRpZmZlcmVudCBzZWxmX2lkX2NvdW50IHRoZSB0b3BvbG9neQotCSAqIGNoYW5nZWQsIGVpdGhlciBub2RlcyB3ZXJlIGFkZGVkIG9yIHJlbW92ZWQuIEluIHRoYXQgY2FzZSB3ZQotCSAqIHJlc2V0IHRoZSBJUk0gcmVzZXQgY291bnRlci4KLQkgKi8KLQlpZiAoY2FyZC0+c2VsZl9pZF9jb3VudCAhPSBzZWxmX2lkX2NvdW50KQotCQljYXJkLT5ibV9yZXRyaWVzID0gMDsKLQogCWNhcmQtPm5vZGVfaWQgPSBub2RlX2lkOwogCS8qCiAJICogVXBkYXRlIG5vZGVfaWQgYmVmb3JlIGdlbmVyYXRpb24gdG8gcHJldmVudCBhbnlib2R5IGZyb20gdXNpbmcKQEAgLTUzMCw3ICs1MjgsNyBAQAogCXNtcF93bWIoKTsKIAljYXJkLT5nZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsKIAljYXJkLT5yZXNldF9qaWZmaWVzID0gamlmZmllczsKLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNhcmQtPndvcmssIDApOworCWZ3X3NjaGVkdWxlX2JtX3dvcmsoY2FyZCwgMCk7CiAKIAlsb2NhbF9ub2RlID0gYnVpbGRfdHJlZShjYXJkLCBzZWxmX2lkcywgc2VsZl9pZF9jb3VudCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlyZXdpcmUvZnctdHJhbnNhY3Rpb24uYyBiL2RyaXZlcnMvZmlyZXdpcmUvZnctdHJhbnNhY3Rpb24uYwppbmRleCAyODg0Zjg3Li42OTlhYzA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2ZpcmV3aXJlL2Z3LXRyYW5zYWN0aW9uLmMKKysrIGIvZHJpdmVycy9maXJld2lyZS9mdy10cmFuc2FjdGlvbi5jCkBAIC0xOSw2ICsxOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9pZHIuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC05NzEsNiArOTcyLDcgQEAKIHsKIAl1bnJlZ2lzdGVyX2NocmRldihmd19jZGV2X21ham9yLCAiZmlyZXdpcmUiKTsKIAlidXNfdW5yZWdpc3RlcigmZndfYnVzX3R5cGUpOworCWlkcl9kZXN0cm95KCZmd19kZXZpY2VfaWRyKTsKIH0KIAogbW9kdWxlX2luaXQoZndfY29yZV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlyZXdpcmUvZnctdHJhbnNhY3Rpb24uaCBiL2RyaXZlcnMvZmlyZXdpcmUvZnctdHJhbnNhY3Rpb24uaAppbmRleCA4Mzk0NjZmMC4uYzlhYjEyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJld2lyZS9mdy10cmFuc2FjdGlvbi5oCisrKyBiL2RyaXZlcnMvZmlyZXdpcmUvZnctdHJhbnNhY3Rpb24uaApAQCAtMjM3LDE0ICsyMzcsNiBAQAogCWludCBsaW5rX3NwZWVkOwogCWludCBjb25maWdfcm9tX2dlbmVyYXRpb247CiAKLQkvKgotCSAqIFdlIG5lZWQgdG8gc3RvcmUgdXAgdG8gNCBzZWxmIElEIGZvciBhIG1heGltdW0gb2YgNjMKLQkgKiBkZXZpY2VzIHBsdXMgMyB3b3JkcyBmb3IgdGhlIHRvcG9sb2d5IG1hcCBoZWFkZXIuCi0JICovCi0JaW50IHNlbGZfaWRfY291bnQ7Ci0JdTMyIHRvcG9sb2d5X21hcFsyNTIgKyAzXTsKLQl1MzIgYnJvYWRjYXN0X2NoYW5uZWw7Ci0KIAlzcGlubG9ja190IGxvY2s7IC8qIFRha2UgdGhpcyBsb2NrIHdoZW4gaGFuZGxpbmcgdGhlIGxpc3RzIGluCiAJCQkgICogdGhpcyBzdHJ1Y3QuICovCiAJc3RydWN0IGZ3X25vZGUgKmxvY2FsX25vZGU7CkBAIC0yNjIsNiArMjU0LDkgQEAKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIHdvcms7CiAJaW50IGJtX3JldHJpZXM7CiAJaW50IGJtX2dlbmVyYXRpb247CisKKwl1MzIgYnJvYWRjYXN0X2NoYW5uZWw7CisJdTMyIHRvcG9sb2d5X21hcFsoQ1NSX1RPUE9MT0dZX01BUF9FTkQgLSBDU1JfVE9QT0xPR1lfTUFQKSAvIDRdOwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgZndfY2FyZCAqZndfY2FyZF9nZXQoc3RydWN0IGZ3X2NhcmQgKmNhcmQpCkBAIC0yNzgsNiArMjczLDggQEAKIAlrcmVmX3B1dCgmY2FyZC0+a3JlZiwgZndfY2FyZF9yZWxlYXNlKTsKIH0KIAorZXh0ZXJuIHZvaWQgZndfc2NoZWR1bGVfYm1fd29yayhzdHJ1Y3QgZndfY2FyZCAqY2FyZCwgdW5zaWduZWQgbG9uZyBkZWxheSk7CisKIC8qCiAgKiBUaGUgaXNvIHBhY2tldCBmb3JtYXQgYWxsb3dzIGZvciBhbiBpbW1lZGlhdGUgaGVhZGVyL3BheWxvYWQgcGFydAogICogc3RvcmVkIGluICdoZWFkZXInIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBwYWNrZXQgaW5mbyBwbHVzIGFuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2RjZGJhcy5jIGIvZHJpdmVycy9maXJtd2FyZS9kY2RiYXMuYwppbmRleCA1MGEwNzFmLi43NzdmYmE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2RjZGJhcy5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZGNkYmFzLmMKQEAgLTIzOCwxMSArMjM4LDExIEBACiB9CiAKIC8qKgotICogc21pX3JlcXVlc3Q6IGdlbmVyYXRlIFNNSSByZXF1ZXN0CisgKiBkY2RiYXNfc21pX3JlcXVlc3Q6IGdlbmVyYXRlIFNNSSByZXF1ZXN0CiAgKgogICogQ2FsbGVkIHdpdGggc21pX2RhdGFfbG9jay4KICAqLwotc3RhdGljIGludCBzbWlfcmVxdWVzdChzdHJ1Y3Qgc21pX2NtZCAqc21pX2NtZCkKK2ludCBkY2RiYXNfc21pX3JlcXVlc3Qoc3RydWN0IHNtaV9jbWQgKnNtaV9jbWQpCiB7CiAJY3B1bWFza190IG9sZF9tYXNrOwogCWludCByZXQgPSAwOwpAQCAtMzA5LDE0ICszMDksMTQgQEAKIAlzd2l0Y2ggKHZhbCkgewogCWNhc2UgMjoKIAkJLyogUmF3IFNNSSAqLwotCQlyZXQgPSBzbWlfcmVxdWVzdChzbWlfY21kKTsKKwkJcmV0ID0gZGNkYmFzX3NtaV9yZXF1ZXN0KHNtaV9jbWQpOwogCQlpZiAoIXJldCkKIAkJCXJldCA9IGNvdW50OwogCQlicmVhazsKIAljYXNlIDE6CiAJCS8qIENhbGxpbmcgSW50ZXJmYWNlIFNNSSAqLwogCQlzbWlfY21kLT5lYnggPSAodTMyKSB2aXJ0X3RvX3BoeXMoc21pX2NtZC0+Y29tbWFuZF9idWZmZXIpOwotCQlyZXQgPSBzbWlfcmVxdWVzdChzbWlfY21kKTsKKwkJcmV0ID0gZGNkYmFzX3NtaV9yZXF1ZXN0KHNtaV9jbWQpOwogCQlpZiAoIXJldCkKIAkJCXJldCA9IGNvdW50OwogCQlicmVhazsKQEAgLTMzMyw2ICszMzMsNyBAQAogCW11dGV4X3VubG9jaygmc21pX2RhdGFfbG9jayk7CiAJcmV0dXJuIHJldDsKIH0KK0VYUE9SVF9TWU1CT0woZGNkYmFzX3NtaV9yZXF1ZXN0KTsKIAogLyoqCiAgKiBob3N0X2NvbnRyb2xfc21pOiBnZW5lcmF0ZSBob3N0IGNvbnRyb2wgU01JCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2RjZGJhcy5oIGIvZHJpdmVycy9maXJtd2FyZS9kY2RiYXMuaAppbmRleCA4N2JjMzQxLi5jYTNjYjBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2RjZGJhcy5oCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZGNkYmFzLmgKQEAgLTEwMSw1ICsxMDEsNyBAQAogCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHBhcmFtZXRlcnM7CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAoraW50IGRjZGJhc19zbWlfcmVxdWVzdChzdHJ1Y3Qgc21pX2NtZCAqc21pX2NtZCk7CisKICNlbmRpZiAvKiBfRENEQkFTX0hfICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZG1pLWlkLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2RtaS1pZC5jCmluZGV4IGU4ODBkNmMuLjVhNzZkMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZG1pLWlkLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9kbWktaWQuYwpAQCAtMjIzLDcgKzIyMyw3IEBACiAJfQogCiAJZG1pX2Rldi0+Y2xhc3MgPSAmZG1pX2NsYXNzOwotCXN0cmNweShkbWlfZGV2LT5idXNfaWQsICJpZCIpOworCWRldl9zZXRfbmFtZShkbWlfZGV2LCAiaWQiKTsKIAlkbWlfZGV2LT5ncm91cHMgPSBzeXNfZG1pX2F0dHJpYnV0ZV9ncm91cHM7CiAKIAlyZXQgPSBkZXZpY2VfcmVnaXN0ZXIoZG1pX2Rldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2RtaV9zY2FuLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2RtaV9zY2FuLmMKaW5kZXggNzhiOTg5ZC4uZDc2YWRmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9kbWlfc2Nhbi5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZG1pX3NjYW4uYwpAQCAtNDY4LDggKzQ2OCw4IEBACiBFWFBPUlRfU1lNQk9MKGRtaV9nZXRfc3lzdGVtX2luZm8pOwogCiAvKioKLSAqCWRtaV9uYW1lX2luX3NlcmlhbCAtIAlDaGVjayBpZiBzdHJpbmcgaXMgaW4gdGhlIERNSSBwcm9kdWN0IHNlcmlhbAotICoJCQkJaW5mb3JtYXRpb24uCisgKiBkbWlfbmFtZV9pbl9zZXJpYWwgLSBDaGVjayBpZiBzdHJpbmcgaXMgaW4gdGhlIERNSSBwcm9kdWN0IHNlcmlhbCBpbmZvcm1hdGlvbgorICogQHN0cjogc3RyaW5nIHRvIGNoZWNrIGZvcgogICovCiBpbnQgZG1pX25hbWVfaW5fc2VyaWFsKGNvbnN0IGNoYXIgKnN0cikKIHsKQEAgLTU4NSw2ICs1ODUsOCBAQAogCiAvKioKICAqIGRtaV9tYXRjaCAtIGNvbXBhcmUgYSBzdHJpbmcgdG8gdGhlIGRtaSBmaWVsZCAoaWYgZXhpc3RzKQorICogQGY6IERNSSBmaWVsZCBpZGVudGlmaWVyCisgKiBAc3RyOiBzdHJpbmcgdG8gY29tcGFyZSB0aGUgRE1JIGZpZWxkIHRvCiAgKgogICogUmV0dXJucyB0cnVlIGlmIHRoZSByZXF1ZXN0ZWQgZmllbGQgZXF1YWxzIHRvIHRoZSBzdHIgKGluY2x1ZGluZyBOVUxMKS4KICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9tZW1tYXAuYyBiL2RyaXZlcnMvZmlybXdhcmUvbWVtbWFwLmMKaW5kZXggM2JmOGVlMS4uMjYxYjlhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9tZW1tYXAuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL21lbW1hcC5jCkBAIC01Niw5ICs1Niw5IEBACiAJc3NpemVfdCAoKnNob3cpKHN0cnVjdCBmaXJtd2FyZV9tYXBfZW50cnkgKmVudHJ5LCBjaGFyICpidWYpOwogfTsKIAotc3RydWN0IG1lbW1hcF9hdHRyaWJ1dGUgbWVtbWFwX3N0YXJ0X2F0dHIgPSBfX0FUVFJfUk8oc3RhcnQpOwotc3RydWN0IG1lbW1hcF9hdHRyaWJ1dGUgbWVtbWFwX2VuZF9hdHRyICAgPSBfX0FUVFJfUk8oZW5kKTsKLXN0cnVjdCBtZW1tYXBfYXR0cmlidXRlIG1lbW1hcF90eXBlX2F0dHIgID0gX19BVFRSX1JPKHR5cGUpOworc3RhdGljIHN0cnVjdCBtZW1tYXBfYXR0cmlidXRlIG1lbW1hcF9zdGFydF9hdHRyID0gX19BVFRSX1JPKHN0YXJ0KTsKK3N0YXRpYyBzdHJ1Y3QgbWVtbWFwX2F0dHJpYnV0ZSBtZW1tYXBfZW5kX2F0dHIgICA9IF9fQVRUUl9STyhlbmQpOworc3RhdGljIHN0cnVjdCBtZW1tYXBfYXR0cmlidXRlIG1lbW1hcF90eXBlX2F0dHIgID0gX19BVFRSX1JPKHR5cGUpOwogCiAvKgogICogVGhlc2UgYXJlIGRlZmF1bHQgYXR0cmlidXRlcyB0aGF0IGFyZSBhZGRlZCBmb3IgZXZlcnkgbWVtbWFwIGVudHJ5LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL0tjb25maWcgYi9kcml2ZXJzL2dwaW8vS2NvbmZpZwppbmRleCA0OGY0OWQ5Li4zZDI1NjU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vS2NvbmZpZworKysgYi9kcml2ZXJzL2dwaW8vS2NvbmZpZwpAQCAtOTUsNyArOTUsNyBAQAogCSAgbnVtYmVyIGZvciB0aGVzZSBHUElPcy4KIAogY29uZmlnIEdQSU9fUENBOTUzWAotCXRyaXN0YXRlICJQQ0E5NTN4LCBQQ0E5NTV4LCBhbmQgTUFYNzMxMCBJL08gcG9ydHMiCisJdHJpc3RhdGUgIlBDQTk1M3gsIFBDQTk1NXgsIFRDQTY0eHgsIGFuZCBNQVg3MzEwIEkvTyBwb3J0cyIKIAlkZXBlbmRzIG9uIEkyQwogCWhlbHAKIAkgIFNheSB5ZXMgaGVyZSB0byBwcm92aWRlIGFjY2VzcyB0byBzZXZlcmFsIHJlZ2lzdGVyLW9yaWVudGVkCkBAIC0xMDQsOSArMTA0LDEwIEBACiAKIAkgIDQgYml0czoJcGNhOTUzNiwgcGNhOTUzNwogCi0JICA4IGJpdHM6CW1heDczMTAsIHBjYTk1MzQsIHBjYTk1MzgsIHBjYTk1NTQsIHBjYTk1NTcKKwkgIDggYml0czoJbWF4NzMxMCwgcGNhOTUzNCwgcGNhOTUzOCwgcGNhOTU1NCwgcGNhOTU1NywKKwkgIAkJdGNhNjQwOAogCi0JICAxNiBiaXRzOglwY2E5NTM1LCBwY2E5NTM5LCBwY2E5NTU1CisJICAxNiBiaXRzOglwY2E5NTM1LCBwY2E5NTM5LCBwY2E5NTU1LCB0Y2E2NDE2CiAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHBjYTk1M3guCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi5jIGIvZHJpdmVycy9ncGlvL2dwaW9saWIuYwppbmRleCA4MjAyMGFiLi4zNWU3YWVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvbGliLmMKQEAgLTEyMTMsNyArMTIxMyw3IEBACiAJCWlmIChkZXYpCiAJCQlzZXFfcHJpbnRmKHMsICIsICVzLyVzIiwKIAkJCQlkZXYtPmJ1cyA/IGRldi0+YnVzLT5uYW1lIDogIm5vLWJ1cyIsCi0JCQkJZGV2LT5idXNfaWQpOworCQkJCWRldl9uYW1lKGRldikpOwogCQlpZiAoY2hpcC0+bGFiZWwpCiAJCQlzZXFfcHJpbnRmKHMsICIsICVzIiwgY2hpcC0+bGFiZWwpOwogCQlpZiAoY2hpcC0+Y2FuX3NsZWVwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL3BjYTk1M3guYyBiL2RyaXZlcnMvZ3Bpby9wY2E5NTN4LmMKaW5kZXggOWNlZWI4OS4uMzdmMzUzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL3BjYTk1M3guYworKysgYi9kcml2ZXJzL2dwaW8vcGNhOTUzeC5jCkBAIC0zMyw3ICszMywxMiBAQAogCXsgInBjYTk1NTQiLCA4LCB9LAogCXsgInBjYTk1NTUiLCAxNiwgfSwKIAl7ICJwY2E5NTU3IiwgOCwgfSwKKwogCXsgIm1heDczMTAiLCA4LCB9LAorCXsgInBjYTYxMDciLCA4LCB9LAorCXsgInRjYTY0MDgiLCA4LCB9LAorCXsgInRjYTY0MTYiLCAxNiwgfSwKKwkvKiBOWUVUOiAgeyAidGNhNjQyNCIsIDI0LCB9LCAqLwogCXsgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBwY2E5NTN4X2lkKTsKQEAgLTQ3LDkgKzUyLDYgQEAKIAlzdHJ1Y3QgZ3Bpb19jaGlwIGdwaW9fY2hpcDsKIH07CiAKLS8qIE5PVEU6ICB3ZSBjYW4ndCBjdXJyZW50bHkgcmVseSBvbiBmYXVsdCBjb2RlcyB0byBjb21lIGZyb20gU01CdXMKLSAqIGNhbGxzLCBzbyB3ZSBtYXAgYWxsIGVycm9ycyB0byBFSU8gaGVyZSBhbmQgcmV0dXJuIHplcm8gb3RoZXJ3aXNlLgotICovCiBzdGF0aWMgaW50IHBjYTk1M3hfd3JpdGVfcmVnKHN0cnVjdCBwY2E5NTN4X2NoaXAgKmNoaXAsIGludCByZWcsIHVpbnQxNl90IHZhbCkKIHsKIAlpbnQgcmV0OwpAQCAtNjEsNyArNjMsNyBAQAogCiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmY2hpcC0+Y2xpZW50LT5kZXYsICJmYWlsZWQgd3JpdGluZyByZWdpc3RlclxuIik7Ci0JCXJldHVybiAtRUlPOworCQlyZXR1cm4gcmV0OwogCX0KIAogCXJldHVybiAwOwpAQCAtNzgsNyArODAsNyBAQAogCiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmY2hpcC0+Y2xpZW50LT5kZXYsICJmYWlsZWQgcmVhZGluZyByZWdpc3RlclxuIik7Ci0JCXJldHVybiAtRUlPOworCQlyZXR1cm4gcmV0OwogCX0KIAogCSp2YWwgPSAodWludDE2X3QpcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL3R3bDQwMzAtZ3Bpby5jIGIvZHJpdmVycy9ncGlvL3R3bDQwMzAtZ3Bpby5jCmluZGV4IDM3ZDNlZWMuLmFmYWQxNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby90d2w0MDMwLWdwaW8uYworKysgYi9kcml2ZXJzL2dwaW8vdHdsNDAzMC1ncGlvLmMKQEAgLTIwMiwzNyArMjAyLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKgotICogQ29uZmlndXJlIGRlYm91bmNlIHRpbWluZyB2YWx1ZSBmb3IgYSBHUElPIHBpbiBvbiBUV0w0MDMwCi0gKi8KLWludCB0d2w0MDMwX3NldF9ncGlvX2RlYm91bmNlKGludCBncGlvLCBpbnQgZW5hYmxlKQotewotCXU4IGRfYm5rID0gZ3BpbyA+PiAzOwotCXU4IGRfbXNrID0gQklUKGdwaW8gJiAweDcpOwotCXU4IHJlZyA9IDA7Ci0JdTggYmFzZSA9IDA7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAodW5saWtlbHkoKGdwaW8gPj0gVFdMNDAzMF9HUElPX01BWCkKLQkJfHwgIShncGlvX3VzYWdlX2NvdW50ICYgQklUKGdwaW8pKSkpCi0JCXJldHVybiAtRVBFUk07Ci0KLQliYXNlID0gUkVHX0dQSU9fREVCRU4xICsgZF9ibms7Ci0JbXV0ZXhfbG9jaygmZ3Bpb19sb2NrKTsKLQlyZXQgPSBncGlvX3R3bDQwMzBfcmVhZChiYXNlKTsKLQlpZiAocmV0ID49IDApIHsKLQkJaWYgKGVuYWJsZSkKLQkJCXJlZyA9IHJldCB8IGRfbXNrOwotCQllbHNlCi0JCQlyZWcgPSByZXQgJiB+ZF9tc2s7Ci0KLQkJcmV0ID0gZ3Bpb190d2w0MDMwX3dyaXRlKGJhc2UsIHJlZyk7Ci0JfQotCW11dGV4X3VubG9jaygmZ3Bpb19sb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTCh0d2w0MDMwX3NldF9ncGlvX2RlYm91bmNlKTsKLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogc3RhdGljIGludCB0d2xfcmVxdWVzdChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCkBAIC00MDUsNiArMzc0LDIzIEBACiAJCQkJUkVHX0dQSU9QVVBEQ1RSMSwgNSk7CiB9CiAKK3N0YXRpYyBpbnQgX19kZXZpbml0IGdwaW9fdHdsNDAzMF9kZWJvdW5jZSh1MzIgZGVib3VuY2UsIHU4IG1tY19jZCkKK3sKKwl1OAkJbWVzc2FnZVs0XTsKKworCS8qIDMwIG1zZWMgb2YgZGVib3VuY2luZyBpcyBhbHdheXMgdXNlZCBmb3IgTU1DIGNhcmQgZGV0ZWN0LAorCSAqIGFuZCBpcyBvcHRpb25hbCBmb3IgZXZlcnl0aGluZyBlbHNlLgorCSAqLworCW1lc3NhZ2VbMV0gPSAoZGVib3VuY2UgJiAweGZmKSB8IChtbWNfY2QgJiAweDAzKTsKKwlkZWJvdW5jZSA+Pj0gODsKKwltZXNzYWdlWzJdID0gKGRlYm91bmNlICYgMHhmZik7CisJZGVib3VuY2UgPj49IDg7CisJbWVzc2FnZVszXSA9IChkZWJvdW5jZSAmIDB4MDMpOworCisJcmV0dXJuIHR3bDQwMzBfaTJjX3dyaXRlKFRXTDQwMzBfTU9EVUxFX0dQSU8sIG1lc3NhZ2UsCisJCQkJUkVHX0dQSU9fREVCRU4xLCAzKTsKK30KKwogc3RhdGljIGludCBncGlvX3R3bDQwMzBfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBncGlvX3R3bDQwMzBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTQzOSw2ICs0MjUsMTIgQEAKIAkJCQlwZGF0YS0+cHVsbHVwcywgcGRhdGEtPnB1bGxkb3ducywKIAkJCQlyZXQpOwogCisJcmV0ID0gZ3Bpb190d2w0MDMwX2RlYm91bmNlKHBkYXRhLT5kZWJvdW5jZSwgcGRhdGEtPm1tY19jZCk7CisJaWYgKHJldCkKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiZGVib3VuY2UgJS4wM3ggJS4wMXggLS0+ICVkXG4iLAorCQkJCXBkYXRhLT5kZWJvdW5jZSwgcGRhdGEtPm1tY19jZCwKKwkJCQlyZXQpOworCiAJdHdsX2dwaW9jaGlwLmJhc2UgPSBwZGF0YS0+Z3Bpb19iYXNlOwogCXR3bF9ncGlvY2hpcC5uZ3BpbyA9IFRXTDQwMzBfR1BJT19NQVg7CiAJdHdsX2dwaW9jaGlwLmRldiA9ICZwZGV2LT5kZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGMuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Yy5jCmluZGV4IDUzYzg3MjUuLjViMmNiYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Yy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Yy5jCkBAIC0yMTAsNyArMjEwLDcgQEAKIAlpbnQgcmV0OwogCiAJV0FSTighbXV0ZXhfaXNfbG9ja2VkKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KSwKLQkgICAgICIlcyBjYWxsZWQgdy9vIG1vZGVfY29uZmlnIGxvY2tcbiIsIF9fRlVOQ1RJT05fXyk7CisJICAgICAiJXMgY2FsbGVkIHcvbyBtb2RlX2NvbmZpZyBsb2NrXG4iLCBfX2Z1bmNfXyk7CiBhZ2FpbjoKIAlpZiAoaWRyX3ByZV9nZXQoJmRldi0+bW9kZV9jb25maWcuY3J0Y19pZHIsIEdGUF9LRVJORUwpID09IDApIHsKIAkJRFJNX0VSUk9SKCJSYW4gb3V0IG1lbW9yeSBnZXR0aW5nIGEgbW9kZSBudW1iZXJcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZHJ2LmMKaW5kZXggZmViYjUxNy4uNWZmODhkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2Rydi5jCkBAIC0zMTQsMTQgKzMxNCwxNCBAQAogCQlEUk1fREVCVUcoIm10cnJfZGVsPSVkXG4iLCByZXR2YWwpOwogCX0KIAorCWlmIChkZXYtPmRyaXZlci0+dW5sb2FkKQorCQlkZXYtPmRyaXZlci0+dW5sb2FkKGRldik7CisKIAlpZiAoZHJtX2NvcmVfaGFzX0FHUChkZXYpICYmIGRldi0+YWdwKSB7CiAJCWRybV9mcmVlKGRldi0+YWdwLCBzaXplb2YoKmRldi0+YWdwKSwgRFJNX01FTV9BR1BMSVNUUyk7CiAJCWRldi0+YWdwID0gTlVMTDsKIAl9CiAKLQlpZiAoZGV2LT5kcml2ZXItPnVubG9hZCkKLQkJZGV2LT5kcml2ZXItPnVubG9hZChkZXYpOwotCiAJZHJtX2h0X3JlbW92ZSgmZGV2LT5tYXBfaGFzaCk7CiAJZHJtX2N0eGJpdG1hcF9jbGVhbnVwKGRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZm9wcy5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9mb3BzLmMKaW5kZXggMzczM2UzNi4uYjA2YTUzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9mb3BzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9mb3BzLmMKQEAgLTE4Myw2ICsxODMsMTAgQEAKIAogCW9sZF9mb3BzID0gZmlscC0+Zl9vcDsKIAlmaWxwLT5mX29wID0gZm9wc19nZXQoJmRldi0+ZHJpdmVyLT5mb3BzKTsKKwlpZiAoZmlscC0+Zl9vcCA9PSBOVUxMKSB7CisJCWZpbHAtPmZfb3AgPSBvbGRfZm9wczsKKwkJZ290byBvdXQ7CisJfQogCWlmIChmaWxwLT5mX29wLT5vcGVuICYmIChlcnIgPSBmaWxwLT5mX29wLT5vcGVuKGlub2RlLCBmaWxwKSkpIHsKIAkJZm9wc19wdXQoZmlscC0+Zl9vcCk7CiAJCWZpbHAtPmZfb3AgPSBmb3BzX2dldChvbGRfZm9wcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3N5c2ZzLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3N5c2ZzLmMKaW5kZXggNjVkNzJkMC4uNWFhNjc4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9zeXNmcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fc3lzZnMuYwpAQCAtNDg4LDcgKzQ4OCw3IEBACiAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICBtaW5vcl9zdHIgPSAiY2FyZCVkIjsKIAotCXNucHJpbnRmKG1pbm9yLT5rZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsIG1pbm9yX3N0ciwgbWlub3ItPmluZGV4KTsKKwlkZXZfc2V0X25hbWUoJm1pbm9yLT5rZGV2LCBtaW5vcl9zdHIsIG1pbm9yLT5pbmRleCk7CiAKIAllcnIgPSBkZXZpY2VfcmVnaXN0ZXIoJm1pbm9yLT5rZGV2KTsKIAlpZiAoZXJyKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmlsZSBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L01ha2VmaWxlCmluZGV4IGRkNTdhNWIuLjc5M2NiYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L01ha2VmaWxlCkBAIC0xMyw2ICsxMyw3IEBACiAJICBpbnRlbF9jcnQubyBcCiAJICBpbnRlbF9sdmRzLm8gXAogCSAgaW50ZWxfYmlvcy5vIFwKKwkgIGludGVsX2hkbWkubyBcCiAJICBpbnRlbF9zZHZvLm8gXAogCSAgaW50ZWxfbW9kZXMubyBcCiAJICBpbnRlbF9pMmMubyBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RtYS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kbWEuYwppbmRleCAzZDcwODJhLi42MmE0YmY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RtYS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZG1hLmMKQEAgLTgyNyw2ICs4MjcsNyBAQAogCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2VfZGV2OwogCXUxNiB0bXAgPSAwOwogCXVuc2lnbmVkIGxvbmcgb3ZlcmhlYWQ7CisJdW5zaWduZWQgbG9uZyBzdG9sZW47CiAKIAlicmlkZ2VfZGV2ID0gcGNpX2dldF9idXNfYW5kX3Nsb3QoMCwgUENJX0RFVkZOKDAsMCkpOwogCWlmICghYnJpZGdlX2RldikgewpAQCAtODY2LDM2ICs4NjcsNTUgQEAKIAllbHNlCiAJCW92ZXJoZWFkID0gKCphcGVydHVyZV9zaXplIC8gMTAyNCkgKyA0MDk2OwogCi0Jc3dpdGNoICh0bXAgJiBJTlRFTF84NTVfR01DSF9HTVNfTUFTSykgewotCWNhc2UgSU5URUxfODU1X0dNQ0hfR01TX1NUT0xFTl8xTToKLQkJYnJlYWs7IC8qIDFNIGFscmVhZHkgKi8KLQljYXNlIElOVEVMXzg1NV9HTUNIX0dNU19TVE9MRU5fNE06Ci0JCSpwcmVhbGxvY2F0ZWRfc2l6ZSAqPSA0OwotCQlicmVhazsKLQljYXNlIElOVEVMXzg1NV9HTUNIX0dNU19TVE9MRU5fOE06Ci0JCSpwcmVhbGxvY2F0ZWRfc2l6ZSAqPSA4OwotCQlicmVhazsKLQljYXNlIElOVEVMXzg1NV9HTUNIX0dNU19TVE9MRU5fMTZNOgotCQkqcHJlYWxsb2NhdGVkX3NpemUgKj0gMTY7Ci0JCWJyZWFrOwotCWNhc2UgSU5URUxfODU1X0dNQ0hfR01TX1NUT0xFTl8zMk06Ci0JCSpwcmVhbGxvY2F0ZWRfc2l6ZSAqPSAzMjsKLQkJYnJlYWs7Ci0JY2FzZSBJTlRFTF85MTVHX0dNQ0hfR01TX1NUT0xFTl80OE06Ci0JCSpwcmVhbGxvY2F0ZWRfc2l6ZSAqPSA0ODsKLQkJYnJlYWs7Ci0JY2FzZSBJTlRFTF85MTVHX0dNQ0hfR01TX1NUT0xFTl82NE06Ci0JCSpwcmVhbGxvY2F0ZWRfc2l6ZSAqPSA2NDsKLQkJYnJlYWs7CisJc3dpdGNoICh0bXAgJiBJTlRFTF9HTUNIX0dNU19NQVNLKSB7CiAJY2FzZSBJTlRFTF84NTVfR01DSF9HTVNfRElTQUJMRUQ6CiAJCURSTV9FUlJPUigidmlkZW8gbWVtb3J5IGlzIGRpc2FibGVkXG4iKTsKIAkJcmV0dXJuIC0xOworCWNhc2UgSU5URUxfODU1X0dNQ0hfR01TX1NUT0xFTl8xTToKKwkJc3RvbGVuID0gMSAqIDEwMjQgKiAxMDI0OworCQlicmVhazsKKwljYXNlIElOVEVMXzg1NV9HTUNIX0dNU19TVE9MRU5fNE06CisJCXN0b2xlbiA9IDQgKiAxMDI0ICogMTAyNDsKKwkJYnJlYWs7CisJY2FzZSBJTlRFTF84NTVfR01DSF9HTVNfU1RPTEVOXzhNOgorCQlzdG9sZW4gPSA4ICogMTAyNCAqIDEwMjQ7CisJCWJyZWFrOworCWNhc2UgSU5URUxfODU1X0dNQ0hfR01TX1NUT0xFTl8xNk06CisJCXN0b2xlbiA9IDE2ICogMTAyNCAqIDEwMjQ7CisJCWJyZWFrOworCWNhc2UgSU5URUxfODU1X0dNQ0hfR01TX1NUT0xFTl8zMk06CisJCXN0b2xlbiA9IDMyICogMTAyNCAqIDEwMjQ7CisJCWJyZWFrOworCWNhc2UgSU5URUxfOTE1R19HTUNIX0dNU19TVE9MRU5fNDhNOgorCQlzdG9sZW4gPSA0OCAqIDEwMjQgKiAxMDI0OworCQlicmVhazsKKwljYXNlIElOVEVMXzkxNUdfR01DSF9HTVNfU1RPTEVOXzY0TToKKwkJc3RvbGVuID0gNjQgKiAxMDI0ICogMTAyNDsKKwkJYnJlYWs7CisJY2FzZSBJTlRFTF9HTUNIX0dNU19TVE9MRU5fMTI4TToKKwkJc3RvbGVuID0gMTI4ICogMTAyNCAqIDEwMjQ7CisJCWJyZWFrOworCWNhc2UgSU5URUxfR01DSF9HTVNfU1RPTEVOXzI1Nk06CisJCXN0b2xlbiA9IDI1NiAqIDEwMjQgKiAxMDI0OworCQlicmVhazsKKwljYXNlIElOVEVMX0dNQ0hfR01TX1NUT0xFTl85Nk06CisJCXN0b2xlbiA9IDk2ICogMTAyNCAqIDEwMjQ7CisJCWJyZWFrOworCWNhc2UgSU5URUxfR01DSF9HTVNfU1RPTEVOXzE2ME06CisJCXN0b2xlbiA9IDE2MCAqIDEwMjQgKiAxMDI0OworCQlicmVhazsKKwljYXNlIElOVEVMX0dNQ0hfR01TX1NUT0xFTl8yMjRNOgorCQlzdG9sZW4gPSAyMjQgKiAxMDI0ICogMTAyNDsKKwkJYnJlYWs7CisJY2FzZSBJTlRFTF9HTUNIX0dNU19TVE9MRU5fMzUyTToKKwkJc3RvbGVuID0gMzUyICogMTAyNCAqIDEwMjQ7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCURSTV9FUlJPUigidW5leHBlY3RlZCBHTUNIX0dNUyB2YWx1ZTogMHglMDJ4XG4iLAotCQkJdG1wICYgSU5URUxfODU1X0dNQ0hfR01TX01BU0spOworCQkJdG1wICYgSU5URUxfR01DSF9HTVNfTUFTSyk7CiAJCXJldHVybiAtMTsKIAl9Ci0JKnByZWFsbG9jYXRlZF9zaXplIC09IG92ZXJoZWFkOworCSpwcmVhbGxvY2F0ZWRfc2l6ZSA9IHN0b2xlbiAtIG92ZXJoZWFkOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaAppbmRleCA0NzU2ZTVjLi41NjNkZTE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmgKQEAgLTY2NCw2ICs2NjQsNyBAQAogCQkJCSB3cml0ZWwodXBwZXJfMzJfYml0cyh2YWwpLCBkZXZfcHJpdi0+cmVncyArIFwKIAkJCQkJKHJlZykgKyA0KSkKICNlbmRpZgorI2RlZmluZSBQT1NUSU5HX1JFQUQocmVnKQkodm9pZClJOTE1X1JFQUQocmVnKQogCiAjZGVmaW5lIEk5MTVfVkVSQk9TRSAwCiAKQEAgLTc2MCw2ICs3NjEsNyBAQAogCQkJSVNfSTk0NUdNKGRldikgfHwgSVNfSTk2NUdNKGRldikgfHwgSVNfR000NShkZXYpKQogCiAjZGVmaW5lIEk5MTVfTkVFRF9HRlhfSFdTKGRldikgKElTX0czMyhkZXYpIHx8IElTX0dNNDUoZGV2KSB8fCBJU19HNFgoZGV2KSkKKyNkZWZpbmUgU1VQUE9SVFNfSU5URUdSQVRFRF9IRE1JKGRldikJKElTX0c0WChkZXYpKQogCiAjZGVmaW5lIFBSSU1BUllfUklOR0JVRkZFUl9TSVpFICAgICAgICAgKDEyOCoxMDI0KQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYwppbmRleCBjYzJjYTU1Li4xMzg0ZDY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKQEAgLTE0NDUsNyArMTQ0NSw3IEBACiAKIAlpZiAoKG9ial9wcml2LT5ndHRfb2Zmc2V0ICYgfkk5MTVfRkVOQ0VfU1RBUlRfTUFTSykgfHwKIAkgICAgKG9ial9wcml2LT5ndHRfb2Zmc2V0ICYgKG9iai0+c2l6ZSAtIDEpKSkgewotCQlXQVJOKDEsICIlczogb2JqZWN0IG5vdCAxTSBvciBzaXplIGFsaWduZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCVdBUk4oMSwgIiVzOiBvYmplY3Qgbm90IDFNIG9yIHNpemUgYWxpZ25lZFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCkBAIC0xNDc4LDcgKzE0NzgsNyBAQAogCiAJaWYgKChvYmpfcHJpdi0+Z3R0X29mZnNldCAmIH5JOTE1X0ZFTkNFX1NUQVJUX01BU0spIHx8CiAJICAgIChvYmpfcHJpdi0+Z3R0X29mZnNldCAmIChvYmotPnNpemUgLSAxKSkpIHsKLQkJV0FSTigxLCAiJXM6IG9iamVjdCBub3QgMU0gb3Igc2l6ZSBhbGlnbmVkXG4iLCBfX0ZVTkNUSU9OX18pOworCQlXQVJOKDEsICIlczogb2JqZWN0IG5vdCAxTSBvciBzaXplIGFsaWduZWRcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTYyMyw2ICsxNjIzLDggQEAKIAlzdHJ1Y3QgZHJtX21tX25vZGUgKmZyZWVfc3BhY2U7CiAJaW50IHBhZ2VfY291bnQsIHJldDsKIAorCWlmIChkZXZfcHJpdi0+bW0uc3VzcGVuZGVkKQorCQlyZXR1cm4gLUVCVVNZOwogCWlmIChhbGlnbm1lbnQgPT0gMCkKIAkJYWxpZ25tZW50ID0gUEFHRV9TSVpFOwogCWlmIChhbGlnbm1lbnQgJiAoUEFHRV9TSVpFIC0gMSkpIHsKQEAgLTI2NDEsNyArMjY0Myw3IEBACiAJaWYgKG9ial9wcml2LT5ndHRfc3BhY2UgPT0gTlVMTCkgewogCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfYmluZF90b19ndHQob2JqLCBhbGlnbm1lbnQpOwogCQlpZiAocmV0ICE9IDApIHsKLQkJCWlmIChyZXQgIT0gLUVSRVNUQVJUU1lTKQorCQkJaWYgKHJldCAhPSAtRUJVU1kgJiYgcmV0ICE9IC1FUkVTVEFSVFNZUykKIAkJCQlEUk1fRVJST1IoIkZhaWx1cmUgdG8gYmluZDogJWQiLCByZXQpOwogCQkJcmV0dXJuIHJldDsKIAkJfQpAQCAtMzIxOSwyMCArMzIyMSwyMSBAQAogCQlkZXZfcHJpdi0+bW0ud2VkZ2VkID0gMDsKIAl9CiAKLQlyZXQgPSBpOTE1X2dlbV9pbml0X3JpbmdidWZmZXIoZGV2KTsKLQlpZiAocmV0ICE9IDApCi0JCXJldHVybiByZXQ7Ci0KIAlkZXZfcHJpdi0+bW0uZ3R0X21hcHBpbmcgPSBpb19tYXBwaW5nX2NyZWF0ZV93YyhkZXYtPmFncC0+YmFzZSwKIAkJCQkJCQlkZXYtPmFncC0+YWdwX2luZm8uYXBlcl9zaXplCiAJCQkJCQkJKiAxMDI0ICogMTAyNCk7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJZGV2X3ByaXYtPm1tLnN1c3BlbmRlZCA9IDA7CisKKwlyZXQgPSBpOTE1X2dlbV9pbml0X3JpbmdidWZmZXIoZGV2KTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisKIAlCVUdfT04oIWxpc3RfZW1wdHkoJmRldl9wcml2LT5tbS5hY3RpdmVfbGlzdCkpOwogCUJVR19PTighbGlzdF9lbXB0eSgmZGV2X3ByaXYtPm1tLmZsdXNoaW5nX2xpc3QpKTsKIAlCVUdfT04oIWxpc3RfZW1wdHkoJmRldl9wcml2LT5tbS5pbmFjdGl2ZV9saXN0KSk7CiAJQlVHX09OKCFsaXN0X2VtcHR5KCZkZXZfcHJpdi0+bW0ucmVxdWVzdF9saXN0KSk7Ci0JZGV2X3ByaXYtPm1tLnN1c3BlbmRlZCA9IDA7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAKIAlkcm1faXJxX2luc3RhbGwoZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcmVnLmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3JlZy5oCmluZGV4IDQ3ZTZiYWYuLjI3MzE2MjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcmVnLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9yZWcuaApAQCAtMzUsNyArMzUsNyBAQAogI2RlZmluZSBJTlRFTF9HTUNIX01FTV82NE0JMHgxCiAjZGVmaW5lIElOVEVMX0dNQ0hfTUVNXzEyOE0JMAogCi0jZGVmaW5lIElOVEVMXzg1NV9HTUNIX0dNU19NQVNLCQkoMHg3IDw8IDQpCisjZGVmaW5lIElOVEVMX0dNQ0hfR01TX01BU0sJCSgweGYgPDwgNCkKICNkZWZpbmUgSU5URUxfODU1X0dNQ0hfR01TX0RJU0FCTEVECSgweDAgPDwgNCkKICNkZWZpbmUgSU5URUxfODU1X0dNQ0hfR01TX1NUT0xFTl8xTQkoMHgxIDw8IDQpCiAjZGVmaW5lIElOVEVMXzg1NV9HTUNIX0dNU19TVE9MRU5fNE0JKDB4MiA8PCA0KQpAQCAtNDUsNiArNDUsMTIgQEAKIAogI2RlZmluZSBJTlRFTF85MTVHX0dNQ0hfR01TX1NUT0xFTl80OE0JKDB4NiA8PCA0KQogI2RlZmluZSBJTlRFTF85MTVHX0dNQ0hfR01TX1NUT0xFTl82NE0JKDB4NyA8PCA0KQorI2RlZmluZSBJTlRFTF9HTUNIX0dNU19TVE9MRU5fMTI4TQkoMHg4IDw8IDQpCisjZGVmaW5lIElOVEVMX0dNQ0hfR01TX1NUT0xFTl8yNTZNCSgweDkgPDwgNCkKKyNkZWZpbmUgSU5URUxfR01DSF9HTVNfU1RPTEVOXzk2TQkoMHhhIDw8IDQpCisjZGVmaW5lIElOVEVMX0dNQ0hfR01TX1NUT0xFTl8xNjBNCSgweGIgPDwgNCkKKyNkZWZpbmUgSU5URUxfR01DSF9HTVNfU1RPTEVOXzIyNE0JKDB4YyA8PCA0KQorI2RlZmluZSBJTlRFTF9HTUNIX0dNU19TVE9MRU5fMzUyTQkoMHhkIDw8IDQpCiAKIC8qIFBDSSBjb25maWcgc3BhY2UgKi8KIApAQCAtNTQ5LDYgKzU1NSw4IEBACiAvKiogR005NjUgR000NSByZW5kZXIgc3RhbmRieSByZWdpc3RlciAqLwogI2RlZmluZSBNQ0hCQVJfUkVOREVSX1NUQU5EQlkJMHgxMTFCOAogCisjZGVmaW5lIFBFR19CQU5EX0dBUF9EQVRBCTB4MTRkNjgKKwogLyoKICAqIE92ZXJsYXkgcmVncwogICovCkBAIC02MTIsNiArNjIwLDkgQEAKIAogLyogSG90cGx1ZyBjb250cm9sICg5NDUrIG9ubHkpICovCiAjZGVmaW5lIFBPUlRfSE9UUExVR19FTgkJMHg2MTExMAorI2RlZmluZSAgIEhETUlCX0hPVFBMVUdfSU5UX0VOCQkJKDEgPDwgMjkpCisjZGVmaW5lICAgSERNSUNfSE9UUExVR19JTlRfRU4JCQkoMSA8PCAyOCkKKyNkZWZpbmUgICBIRE1JRF9IT1RQTFVHX0lOVF9FTgkJCSgxIDw8IDI3KQogI2RlZmluZSAgIFNEVk9CX0hPVFBMVUdfSU5UX0VOCQkJKDEgPDwgMjYpCiAjZGVmaW5lICAgU0RWT0NfSE9UUExVR19JTlRfRU4JCQkoMSA8PCAyNSkKICNkZWZpbmUgICBUVl9IT1RQTFVHX0lOVF9FTgkJCSgxIDw8IDE4KQpAQCAtNjE5LDYgKzYzMCw5IEBACiAjZGVmaW5lICAgQ1JUX0hPVFBMVUdfRk9SQ0VfREVURUNUCQkoMSA8PCAzKQogCiAjZGVmaW5lIFBPUlRfSE9UUExVR19TVEFUCTB4NjExMTQKKyNkZWZpbmUgICBIRE1JQl9IT1RQTFVHX0lOVF9TVEFUVVMJCSgxIDw8IDI5KQorI2RlZmluZSAgIEhETUlDX0hPVFBMVUdfSU5UX1NUQVRVUwkJKDEgPDwgMjgpCisjZGVmaW5lICAgSERNSURfSE9UUExVR19JTlRfU1RBVFVTCQkoMSA8PCAyNykKICNkZWZpbmUgICBDUlRfSE9UUExVR19JTlRfU1RBVFVTCQkoMSA8PCAxMSkKICNkZWZpbmUgICBUVl9IT1RQTFVHX0lOVF9TVEFUVVMJCQkoMSA8PCAxMCkKICNkZWZpbmUgICBDUlRfSE9UUExVR19NT05JVE9SX01BU0sJCSgzIDw8IDgpCkBAIC02NDgsNyArNjYyLDE2IEBACiAjZGVmaW5lICAgU0RWT19QSEFTRV9TRUxFQ1RfREVGQVVMVAkoNiA8PCAxOSkKICNkZWZpbmUgICBTRFZPX0NMT0NLX09VVFBVVF9JTlZFUlQJKDEgPDwgMTgpCiAjZGVmaW5lICAgU0RWT0NfR0FOR19NT0RFCQkoMSA8PCAxNikKKyNkZWZpbmUgICBTRFZPX0VOQ09ESU5HX1NEVk8JCSgweDAgPDwgMTApCisjZGVmaW5lICAgU0RWT19FTkNPRElOR19IRE1JCQkoMHgyIDw8IDEwKQorLyoqIFJlcXVpcmQgZm9yIEhETUkgb3BlcmF0aW9uICovCisjZGVmaW5lICAgU0RWT19OVUxMX1BBQ0tFVFNfRFVSSU5HX1ZTWU5DICgxIDw8IDkpCiAjZGVmaW5lICAgU0RWT19CT1JERVJfRU5BQkxFCQkoMSA8PCA3KQorI2RlZmluZSAgIFNEVk9fQVVESU9fRU5BQkxFCQkoMSA8PCA2KQorLyoqIE5ldyB3aXRoIDk2NSwgZGVmYXVsdCBpcyB0byBiZSBzZXQgKi8KKyNkZWZpbmUgICBTRFZPX1ZTWU5DX0FDVElWRV9ISUdICSgxIDw8IDQpCisvKiogTmV3IHdpdGggOTY1LCBkZWZhdWx0IGlzIHRvIGJlIHNldCAqLworI2RlZmluZSAgIFNEVk9fSFNZTkNfQUNUSVZFX0hJR0gJKDEgPDwgMykKICNkZWZpbmUgICBTRFZPQl9QQ0lFX0NPTkNVUlJFTkNZCSgxIDw8IDMpCiAjZGVmaW5lICAgU0RWT19ERVRFQ1RFRAkJCSgxIDw8IDIpCiAvKiBCaXRzIHRvIGJlIHByZXNlcnZlZCB3aGVuIHdyaXRpbmcgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYwppbmRleCBlNWMxYzgwLi44Y2NiOWMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kaXNwbGF5LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGlzcGxheS5jCkBAIC03NTEsNiArNzUxLDcgQEAKIAkJCWlzX2x2ZHMgPSB0cnVlOwogCQkJYnJlYWs7CiAJCWNhc2UgSU5URUxfT1VUUFVUX1NEVk86CisJCWNhc2UgSU5URUxfT1VUUFVUX0hETUk6CiAJCQlpc19zZHZvID0gdHJ1ZTsKIAkJCWJyZWFrOwogCQljYXNlIElOVEVMX09VVFBVVF9EVk86CkBAIC05ODYsMTkgKzk4NywxNyBAQAogCXVpbnQzMl90IGJhc2UgPSAocGlwZSA9PSAwKSA/IENVUkFCQVNFIDogQ1VSQkJBU0U7CiAJdWludDMyX3QgdGVtcDsKIAlzaXplX3QgYWRkcjsKKwlpbnQgcmV0OwogCiAJRFJNX0RFQlVHKCJcbiIpOwogCiAJLyogaWYgd2Ugd2FudCB0byB0dXJuIG9mZiB0aGUgY3Vyc29yIGlnbm9yZSB3aWR0aCBhbmQgaGVpZ2h0ICovCiAJaWYgKCFoYW5kbGUpIHsKIAkJRFJNX0RFQlVHKCJjdXJzb3Igb2ZmXG4iKTsKLQkJLyogdHVybiBvZiB0aGUgY3Vyc29yICovCi0JCXRlbXAgPSAwOwotCQl0ZW1wIHw9IENVUlNPUl9NT0RFX0RJU0FCTEU7Ci0KLQkJSTkxNV9XUklURShjb250cm9sLCB0ZW1wKTsKLQkJSTkxNV9XUklURShiYXNlLCAwKTsKLQkJcmV0dXJuIDA7CisJCXRlbXAgPSBDVVJTT1JfTU9ERV9ESVNBQkxFOworCQlhZGRyID0gMDsKKwkJYm8gPSBOVUxMOworCQlnb3RvIGZpbmlzaDsKIAl9CiAKIAkvKiBDdXJyZW50bHkgd2Ugb25seSBzdXBwb3J0IDY0eDY0IGN1cnNvcnMgKi8KQEAgLTEwMjUsMTUgKzEwMjQsMzAgQEAKIAkJYWRkciA9IG9ial9wcml2LT5ndHRfb2Zmc2V0OwogCX0KIAotCWludGVsX2NydGMtPmN1cnNvcl9hZGRyID0gYWRkcjsKKwlyZXQgPSBpOTE1X2dlbV9vYmplY3RfcGluKGJvLCBQQUdFX1NJWkUpOworCWlmIChyZXQpIHsKKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gcGluIGN1cnNvciBib1xuIik7CisJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKGJvKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKIAl0ZW1wID0gMDsKIAkvKiBzZXQgdGhlIHBpcGUgZm9yIHRoZSBjdXJzb3IgKi8KIAl0ZW1wIHw9IChwaXBlIDw8IDI4KTsKIAl0ZW1wIHw9IENVUlNPUl9NT0RFXzY0X0FSR0JfQVggfCBNQ1VSU09SX0dBTU1BX0VOQUJMRTsKIAorIGZpbmlzaDoKIAlJOTE1X1dSSVRFKGNvbnRyb2wsIHRlbXApOwogCUk5MTVfV1JJVEUoYmFzZSwgYWRkcik7CiAKKwlpZiAoaW50ZWxfY3J0Yy0+Y3Vyc29yX2JvKSB7CisJCWk5MTVfZ2VtX29iamVjdF91bnBpbihpbnRlbF9jcnRjLT5jdXJzb3JfYm8pOworCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShpbnRlbF9jcnRjLT5jdXJzb3JfYm8pOworCX0KKworCWludGVsX2NydGMtPmN1cnNvcl9hZGRyID0gYWRkcjsKKwlpbnRlbF9jcnRjLT5jdXJzb3JfYm8gPSBibzsKKwogCXJldHVybiAwOwogfQogCkBAIC0xNDMwLDEyICsxNDQ0LDE5IEBACiAJCWludGVsX2x2ZHNfaW5pdChkZXYpOwogCiAJaWYgKElTX0k5WFgoZGV2KSkgewotCQlpbnRlbF9zZHZvX2luaXQoZGV2LCBTRFZPQik7Ci0JCWludGVsX3Nkdm9faW5pdChkZXYsIFNEVk9DKTsKKwkJaW50IGZvdW5kOworCisJCWZvdW5kID0gaW50ZWxfc2R2b19pbml0KGRldiwgU0RWT0IpOworCQlpZiAoIWZvdW5kICYmIFNVUFBPUlRTX0lOVEVHUkFURURfSERNSShkZXYpKQorCQkJaW50ZWxfaGRtaV9pbml0KGRldiwgU0RWT0IpOworCisJCWZvdW5kID0gaW50ZWxfc2R2b19pbml0KGRldiwgU0RWT0MpOworCQlpZiAoIWZvdW5kICYmIFNVUFBPUlRTX0lOVEVHUkFURURfSERNSShkZXYpKQorCQkJaW50ZWxfaGRtaV9pbml0KGRldiwgU0RWT0MpOwogCX0gZWxzZQogCQlpbnRlbF9kdm9faW5pdChkZXYpOwogCi0JaWYgKElTX0k5WFgoZGV2KSAmJiAhSVNfSTkxNUcoZGV2KSkKKwlpZiAoSVNfSTlYWChkZXYpICYmIElTX01PQklMRShkZXYpKQogCQlpbnRlbF90dl9pbml0KGRldik7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3RvciwgJmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsIGhlYWQpIHsKQEAgLTE0NDUsNiArMTQ2NiwxMSBAQAogCiAJCS8qIHZhbGlkIGNydGNzICovCiAJCXN3aXRjaChpbnRlbF9vdXRwdXQtPnR5cGUpIHsKKwkJY2FzZSBJTlRFTF9PVVRQVVRfSERNSToKKwkJCWNydGNfbWFzayA9ICgoMSA8PCAwKXwKKwkJCQkgICAgICgxIDw8IDEpKTsKKwkJCWNsb25lX21hc2sgPSAoKDEgPDwgSU5URUxfT1VUUFVUX0hETUkpKTsKKwkJCWJyZWFrOwogCQljYXNlIElOVEVMX09VVFBVVF9EVk86CiAJCWNhc2UgSU5URUxfT1VUUFVUX1NEVk86CiAJCQljcnRjX21hc2sgPSAoKDEgPDwgMCl8CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oCmluZGV4IDQwN2VkZDUuLjhhNGNjNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oCkBAIC01Myw2ICs1Myw3IEBACiAjZGVmaW5lIElOVEVMX09VVFBVVF9TRFZPIDMKICNkZWZpbmUgSU5URUxfT1VUUFVUX0xWRFMgNAogI2RlZmluZSBJTlRFTF9PVVRQVVRfVFZPVVQgNQorI2RlZmluZSBJTlRFTF9PVVRQVVRfSERNSSA2CiAKICNkZWZpbmUgSU5URUxfRFZPX0NISVBfTk9ORSAwCiAjZGVmaW5lIElOVEVMX0RWT19DSElQX0xWRFMgMQpAQCAtODgsNiArODksNyBAQAogCXN0cnVjdCBkcm1fY3J0YyBiYXNlOwogCWludCBwaXBlOwogCWludCBwbGFuZTsKKwlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmN1cnNvcl9ibzsKIAl1aW50MzJfdCBjdXJzb3JfYWRkcjsKIAl1OCBsdXRfclsyNTZdLCBsdXRfZ1syNTZdLCBsdXRfYlsyNTZdOwogCWludCBkcG1zX21vZGU7CkBAIC0xMDgsNyArMTEwLDggQEAKIGV4dGVybiBib29sIGludGVsX2RkY19wcm9iZShzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQpOwogCiBleHRlcm4gdm9pZCBpbnRlbF9jcnRfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKLWV4dGVybiB2b2lkIGludGVsX3Nkdm9faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgb3V0cHV0X2RldmljZSk7CitleHRlcm4gdm9pZCBpbnRlbF9oZG1pX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHNkdm94X3JlZyk7CitleHRlcm4gYm9vbCBpbnRlbF9zZHZvX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IG91dHB1dF9kZXZpY2UpOwogZXh0ZXJuIHZvaWQgaW50ZWxfZHZvX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBpbnRlbF90dl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogZXh0ZXJuIHZvaWQgaW50ZWxfbHZkc19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfaGRtaS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfaGRtaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNmE0YTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9oZG1pLmMKQEAgLTAsMCArMSwyODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNiBEYXZlIEFpcmxpZSA8YWlybGllZEBsaW51eC5pZT4KKyAqIENvcHlyaWdodCDCqSAyMDA2LTIwMDkgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqCUVyaWMgQW5ob2x0IDxlcmljQGFuaG9sdC5uZXQ+CisgKglKZXNzZSBCYXJuZXMgPGplc3NlLmJhcm5lc0BpbnRlbC5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgImRybV9jcnRjLmgiCisjaW5jbHVkZSAiaW50ZWxfZHJ2LmgiCisjaW5jbHVkZSAiaTkxNV9kcm0uaCIKKyNpbmNsdWRlICJpOTE1X2Rydi5oIgorCitzdHJ1Y3QgaW50ZWxfaGRtaV9wcml2IHsKKwl1MzIgc2R2b3hfcmVnOworCXUzMiBzYXZlX1NEVk9YOworCWludCBoYXNfaGRtaV9zaW5rOworfTsKKworc3RhdGljIHZvaWQgaW50ZWxfaGRtaV9tb2RlX3NldChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YyA9IGVuY29kZXItPmNydGM7CisJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOworCXN0cnVjdCBpbnRlbF9vdXRwdXQgKmludGVsX291dHB1dCA9IGVuY190b19pbnRlbF9vdXRwdXQoZW5jb2Rlcik7CisJc3RydWN0IGludGVsX2hkbWlfcHJpdiAqaGRtaV9wcml2ID0gaW50ZWxfb3V0cHV0LT5kZXZfcHJpdjsKKwl1MzIgc2R2b3g7CisKKwlzZHZveCA9IFNEVk9fRU5DT0RJTkdfSERNSSB8CisJCVNEVk9fQk9SREVSX0VOQUJMRSB8CisJCVNEVk9fVlNZTkNfQUNUSVZFX0hJR0ggfAorCQlTRFZPX0hTWU5DX0FDVElWRV9ISUdIOworCisJaWYgKGhkbWlfcHJpdi0+aGFzX2hkbWlfc2luaykKKwkJc2R2b3ggfD0gU0RWT19BVURJT19FTkFCTEU7CisKKwlpZiAoaW50ZWxfY3J0Yy0+cGlwZSA9PSAxKQorCQlzZHZveCB8PSBTRFZPX1BJUEVfQl9TRUxFQ1Q7CisKKwlJOTE1X1dSSVRFKGhkbWlfcHJpdi0+c2R2b3hfcmVnLCBzZHZveCk7CisJUE9TVElOR19SRUFEKGhkbWlfcHJpdi0+c2R2b3hfcmVnKTsKK30KKworc3RhdGljIHZvaWQgaW50ZWxfaGRtaV9kcG1zKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwgaW50IG1vZGUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpbnRlbF9vdXRwdXQgKmludGVsX291dHB1dCA9IGVuY190b19pbnRlbF9vdXRwdXQoZW5jb2Rlcik7CisJc3RydWN0IGludGVsX2hkbWlfcHJpdiAqaGRtaV9wcml2ID0gaW50ZWxfb3V0cHV0LT5kZXZfcHJpdjsKKwl1MzIgdGVtcDsKKworCWlmIChtb2RlICE9IERSTV9NT0RFX0RQTVNfT04pIHsKKwkJdGVtcCA9IEk5MTVfUkVBRChoZG1pX3ByaXYtPnNkdm94X3JlZyk7CisJCUk5MTVfV1JJVEUoaGRtaV9wcml2LT5zZHZveF9yZWcsIHRlbXAgJiB+U0RWT19FTkFCTEUpOworCX0gZWxzZSB7CisJCXRlbXAgPSBJOTE1X1JFQUQoaGRtaV9wcml2LT5zZHZveF9yZWcpOworCQlJOTE1X1dSSVRFKGhkbWlfcHJpdi0+c2R2b3hfcmVnLCB0ZW1wIHwgU0RWT19FTkFCTEUpOworCX0KKwlQT1NUSU5HX1JFQUQoaGRtaV9wcml2LT5zZHZveF9yZWcpOworfQorCitzdGF0aWMgdm9pZCBpbnRlbF9oZG1pX3NhdmUoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQgPSB0b19pbnRlbF9vdXRwdXQoY29ubmVjdG9yKTsKKwlzdHJ1Y3QgaW50ZWxfaGRtaV9wcml2ICpoZG1pX3ByaXYgPSBpbnRlbF9vdXRwdXQtPmRldl9wcml2OworCisJaGRtaV9wcml2LT5zYXZlX1NEVk9YID0gSTkxNV9SRUFEKGhkbWlfcHJpdi0+c2R2b3hfcmVnKTsKK30KKworc3RhdGljIHZvaWQgaW50ZWxfaGRtaV9yZXN0b3JlKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0ID0gdG9faW50ZWxfb3V0cHV0KGNvbm5lY3Rvcik7CisJc3RydWN0IGludGVsX2hkbWlfcHJpdiAqaGRtaV9wcml2ID0gaW50ZWxfb3V0cHV0LT5kZXZfcHJpdjsKKworCUk5MTVfV1JJVEUoaGRtaV9wcml2LT5zZHZveF9yZWcsIGhkbWlfcHJpdi0+c2F2ZV9TRFZPWCk7CisJUE9TVElOR19SRUFEKGhkbWlfcHJpdi0+c2R2b3hfcmVnKTsKK30KKworc3RhdGljIGludCBpbnRlbF9oZG1pX21vZGVfdmFsaWQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCQkgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCit7CisJaWYgKG1vZGUtPmNsb2NrID4gMTY1MDAwKQorCQlyZXR1cm4gTU9ERV9DTE9DS19ISUdIOworCWlmIChtb2RlLT5jbG9jayA8IDIwMDAwKQorCQlyZXR1cm4gTU9ERV9DTE9DS19ISUdIOworCisJaWYgKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19EQkxTQ0FOKQorCQlyZXR1cm4gTU9ERV9OT19EQkxFU0NBTjsKKworCXJldHVybiBNT0RFX09LOworfQorCitzdGF0aWMgYm9vbCBpbnRlbF9oZG1pX21vZGVfZml4dXAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJCSAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkJICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKK3sKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMKK2ludGVsX2hkbWlfZGV0ZWN0KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0ID0gdG9faW50ZWxfb3V0cHV0KGNvbm5lY3Rvcik7CisJc3RydWN0IGludGVsX2hkbWlfcHJpdiAqaGRtaV9wcml2ID0gaW50ZWxfb3V0cHV0LT5kZXZfcHJpdjsKKwl1MzIgdGVtcCwgYml0OworCisJdGVtcCA9IEk5MTVfUkVBRChQT1JUX0hPVFBMVUdfRU4pOworCisJSTkxNV9XUklURShQT1JUX0hPVFBMVUdfRU4sCisJCSAgIHRlbXAgfAorCQkgICBIRE1JQl9IT1RQTFVHX0lOVF9FTiB8CisJCSAgIEhETUlDX0hPVFBMVUdfSU5UX0VOIHwKKwkJICAgSERNSURfSE9UUExVR19JTlRfRU4pOworCisJUE9TVElOR19SRUFEKFBPUlRfSE9UUExVR19FTik7CisKKwlzd2l0Y2ggKGhkbWlfcHJpdi0+c2R2b3hfcmVnKSB7CisJY2FzZSBTRFZPQjoKKwkJYml0ID0gSERNSUJfSE9UUExVR19JTlRfU1RBVFVTOworCQlicmVhazsKKwljYXNlIFNEVk9DOgorCQliaXQgPSBIRE1JQ19IT1RQTFVHX0lOVF9TVEFUVVM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX3Vua25vd247CisJfQorCisJaWYgKChJOTE1X1JFQUQoUE9SVF9IT1RQTFVHX1NUQVQpICYgYml0KSAhPSAwKQorCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CisJZWxzZQorCQlyZXR1cm4gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7Cit9CisKK3N0YXRpYyBpbnQgaW50ZWxfaGRtaV9nZXRfbW9kZXMoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgaW50ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQgPSB0b19pbnRlbF9vdXRwdXQoY29ubmVjdG9yKTsKKworCS8qIFdlIHNob3VsZCBwYXJzZSB0aGUgRURJRCBkYXRhIGFuZCBmaW5kIG91dCBpZiBpdCdzIGFuIEhETUkgc2luayBzbworCSAqIHdlIGNhbiBzZW5kIGF1ZGlvIHRvIGl0LgorCSAqLworCisJcmV0dXJuIGludGVsX2RkY19nZXRfbW9kZXMoaW50ZWxfb3V0cHV0KTsKK30KKworc3RhdGljIHZvaWQgaW50ZWxfaGRtaV9kZXN0cm95KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0ID0gdG9faW50ZWxfb3V0cHV0KGNvbm5lY3Rvcik7CisKKwlpZiAoaW50ZWxfb3V0cHV0LT5pMmNfYnVzKQorCQlpbnRlbF9pMmNfZGVzdHJveShpbnRlbF9vdXRwdXQtPmkyY19idXMpOworCWRybV9zeXNmc19jb25uZWN0b3JfcmVtb3ZlKGNvbm5lY3Rvcik7CisJZHJtX2Nvbm5lY3Rvcl9jbGVhbnVwKGNvbm5lY3Rvcik7CisJa2ZyZWUoaW50ZWxfb3V0cHV0KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgaW50ZWxfaGRtaV9oZWxwZXJfZnVuY3MgPSB7CisJLmRwbXMgPSBpbnRlbF9oZG1pX2RwbXMsCisJLm1vZGVfZml4dXAgPSBpbnRlbF9oZG1pX21vZGVfZml4dXAsCisJLnByZXBhcmUgPSBpbnRlbF9lbmNvZGVyX3ByZXBhcmUsCisJLm1vZGVfc2V0ID0gaW50ZWxfaGRtaV9tb2RlX3NldCwKKwkuY29tbWl0ID0gaW50ZWxfZW5jb2Rlcl9jb21taXQsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9jb25uZWN0b3JfZnVuY3MgaW50ZWxfaGRtaV9jb25uZWN0b3JfZnVuY3MgPSB7CisJLnNhdmUgPSBpbnRlbF9oZG1pX3NhdmUsCisJLnJlc3RvcmUgPSBpbnRlbF9oZG1pX3Jlc3RvcmUsCisJLmRldGVjdCA9IGludGVsX2hkbWlfZGV0ZWN0LAorCS5maWxsX21vZGVzID0gZHJtX2hlbHBlcl9wcm9iZV9zaW5nbGVfY29ubmVjdG9yX21vZGVzLAorCS5kZXN0cm95ID0gaW50ZWxfaGRtaV9kZXN0cm95LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fY29ubmVjdG9yX2hlbHBlcl9mdW5jcyBpbnRlbF9oZG1pX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgPSB7CisJLmdldF9tb2RlcyA9IGludGVsX2hkbWlfZ2V0X21vZGVzLAorCS5tb2RlX3ZhbGlkID0gaW50ZWxfaGRtaV9tb2RlX3ZhbGlkLAorCS5iZXN0X2VuY29kZXIgPSBpbnRlbF9iZXN0X2VuY29kZXIsCit9OworCitzdGF0aWMgdm9pZCBpbnRlbF9oZG1pX2VuY19kZXN0cm95KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlkcm1fZW5jb2Rlcl9jbGVhbnVwKGVuY29kZXIpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9lbmNvZGVyX2Z1bmNzIGludGVsX2hkbWlfZW5jX2Z1bmNzID0geworCS5kZXN0cm95ID0gaW50ZWxfaGRtaV9lbmNfZGVzdHJveSwKK307CisKKwordm9pZCBpbnRlbF9oZG1pX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHNkdm94X3JlZykKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CisJc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0OworCXN0cnVjdCBpbnRlbF9oZG1pX3ByaXYgKmhkbWlfcHJpdjsKKworCWludGVsX291dHB1dCA9IGtjYWxsb2Moc2l6ZW9mKHN0cnVjdCBpbnRlbF9vdXRwdXQpICsKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGludGVsX2hkbWlfcHJpdiksIDEsIEdGUF9LRVJORUwpOworCWlmICghaW50ZWxfb3V0cHV0KQorCQlyZXR1cm47CisJaGRtaV9wcml2ID0gKHN0cnVjdCBpbnRlbF9oZG1pX3ByaXYgKikoaW50ZWxfb3V0cHV0ICsgMSk7CisKKwljb25uZWN0b3IgPSAmaW50ZWxfb3V0cHV0LT5iYXNlOworCWRybV9jb25uZWN0b3JfaW5pdChkZXYsIGNvbm5lY3RvciwgJmludGVsX2hkbWlfY29ubmVjdG9yX2Z1bmNzLAorCQkJICAgRFJNX01PREVfQ09OTkVDVE9SX0RWSUQpOworCWRybV9jb25uZWN0b3JfaGVscGVyX2FkZChjb25uZWN0b3IsICZpbnRlbF9oZG1pX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MpOworCisJaW50ZWxfb3V0cHV0LT50eXBlID0gSU5URUxfT1VUUFVUX0hETUk7CisKKwljb25uZWN0b3ItPmludGVybGFjZV9hbGxvd2VkID0gMDsKKwljb25uZWN0b3ItPmRvdWJsZXNjYW5fYWxsb3dlZCA9IDA7CisKKwkvKiBTZXQgdXAgdGhlIEREQyBidXMuICovCisJaWYgKHNkdm94X3JlZyA9PSBTRFZPQikKKwkJaW50ZWxfb3V0cHV0LT5kZGNfYnVzID0gaW50ZWxfaTJjX2NyZWF0ZShkZXYsIEdQSU9FLCAiSERNSUIiKTsKKwllbHNlCisJCWludGVsX291dHB1dC0+ZGRjX2J1cyA9IGludGVsX2kyY19jcmVhdGUoZGV2LCBHUElPRCwgIkhETUlDIik7CisKKwlpZiAoIWludGVsX291dHB1dC0+ZGRjX2J1cykKKwkJZ290byBlcnJfY29ubmVjdG9yOworCisJaGRtaV9wcml2LT5zZHZveF9yZWcgPSBzZHZveF9yZWc7CisJaW50ZWxfb3V0cHV0LT5kZXZfcHJpdiA9IGhkbWlfcHJpdjsKKworCWRybV9lbmNvZGVyX2luaXQoZGV2LCAmaW50ZWxfb3V0cHV0LT5lbmMsICZpbnRlbF9oZG1pX2VuY19mdW5jcywKKwkJCSBEUk1fTU9ERV9FTkNPREVSX1RNRFMpOworCWRybV9lbmNvZGVyX2hlbHBlcl9hZGQoJmludGVsX291dHB1dC0+ZW5jLCAmaW50ZWxfaGRtaV9oZWxwZXJfZnVuY3MpOworCisJZHJtX21vZGVfY29ubmVjdG9yX2F0dGFjaF9lbmNvZGVyKCZpbnRlbF9vdXRwdXQtPmJhc2UsCisJCQkJCSAgJmludGVsX291dHB1dC0+ZW5jKTsKKwlkcm1fc3lzZnNfY29ubmVjdG9yX2FkZChjb25uZWN0b3IpOworCisJLyogRm9yIEc0WCBkZXNrdG9wIGNoaXAsIFBFR19CQU5EX0dBUF9EQVRBIDM6MCBtdXN0IGZpcnN0IGJlIHdyaXR0ZW4KKwkgKiAweGQuICBGYWlsdXJlIHRvIGRvIHNvIHdpbGwgcmVzdWx0IGluIHNwdXJpb3VzIGludGVycnVwdHMgYmVpbmcKKwkgKiBnZW5lcmF0ZWQgb24gdGhlIHBvcnQgd2hlbiBhIGNhYmxlIGlzIG5vdCBhdHRhY2hlZC4KKwkgKi8KKwlpZiAoSVNfRzRYKGRldikgJiYgIUlTX0dNNDUoZGV2KSkgeworCQl1MzIgdGVtcCA9IEk5MTVfUkVBRChQRUdfQkFORF9HQVBfREFUQSk7CisJCUk5MTVfV1JJVEUoUEVHX0JBTkRfR0FQX0RBVEEsICh0ZW1wICYgfjB4ZikgfCAweGQpOworCX0KKworCXJldHVybjsKKworZXJyX2Nvbm5lY3RvcjoKKwlkcm1fY29ubmVjdG9yX2NsZWFudXAoY29ubmVjdG9yKTsKKwlrZnJlZShpbnRlbF9vdXRwdXQpOworCisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfc2R2by5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfc2R2by5jCmluZGV4IGZiYmFhNGYuLjQwNzIxNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3Nkdm8uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zZHZvLmMKQEAgLTk3OCw3ICs5NzgsNyBAQAogfTsKIAogCi12b2lkIGludGVsX3Nkdm9faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgb3V0cHV0X2RldmljZSkKK2Jvb2wgaW50ZWxfc2R2b19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBvdXRwdXRfZGV2aWNlKQogewogCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CiAJc3RydWN0IGludGVsX291dHB1dCAqaW50ZWxfb3V0cHV0OwpAQCAtOTkxLDcgKzk5MSw3IEBACiAKIAlpbnRlbF9vdXRwdXQgPSBrY2FsbG9jKHNpemVvZihzdHJ1Y3QgaW50ZWxfb3V0cHV0KStzaXplb2Yoc3RydWN0IGludGVsX3Nkdm9fcHJpdiksIDEsIEdGUF9LRVJORUwpOwogCWlmICghaW50ZWxfb3V0cHV0KSB7Ci0JCXJldHVybjsKKwkJcmV0dXJuIGZhbHNlOwogCX0KIAogCWNvbm5lY3RvciA9ICZpbnRlbF9vdXRwdXQtPmJhc2U7CkBAIC0xMTE2LDcgKzExMTYsNyBAQAogCiAJaW50ZWxfb3V0cHV0LT5kZGNfYnVzID0gaTJjYnVzOwogCi0JcmV0dXJuOworCXJldHVybiB0cnVlOwogCiBlcnJfaTJjOgogCWludGVsX2kyY19kZXN0cm95KGludGVsX291dHB1dC0+aTJjX2J1cyk7CkBAIC0xMTI0LDUgKzExMjQsNSBAQAogCWRybV9jb25uZWN0b3JfY2xlYW51cChjb25uZWN0b3IpOwogCWtmcmVlKGludGVsX291dHB1dCk7CiAKLQlyZXR1cm47CisJcmV0dXJuIGZhbHNlOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvS2NvbmZpZyBiL2RyaXZlcnMvaGlkL0tjb25maWcKaW5kZXggYjRmZDhjYS4uZTg1YzhmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvS2NvbmZpZworKysgYi9kcml2ZXJzL2hpZC9LY29uZmlnCkBAIC04NSwxNCArODUsMTQgQEAKIGNvbmZpZyBISURfQTRURUNICiAJdHJpc3RhdGUgIkE0IHRlY2giIGlmIEVNQkVEREVECiAJZGVwZW5kcyBvbiBVU0JfSElECi0JZGVmYXVsdCB5CisJZGVmYXVsdCAhRU1CRURERUQKIAktLS1oZWxwLS0tCiAJU3VwcG9ydCBmb3IgQTQgdGVjaCBYNSBhbmQgV09QLTM1IC8gVHJ1c3QgNDUwTCBtaWNlLgogCiBjb25maWcgSElEX0FQUExFCiAJdHJpc3RhdGUgIkFwcGxlIiBpZiBFTUJFRERFRAogCWRlcGVuZHMgb24gKFVTQl9ISUQgfHwgQlRfSElEUCkKLQlkZWZhdWx0IHkKKwlkZWZhdWx0ICFFTUJFRERFRAogCS0tLWhlbHAtLS0KIAlTdXBwb3J0IGZvciBzb21lIEFwcGxlIGRldmljZXMgd2hpY2ggbGVzcyBvciBtb3JlIGJyZWFrCiAJSElEIHNwZWNpZmljYXRpb24uCkBAIC0xMDMsNjQgKzEwMyw0OSBAQAogY29uZmlnIEhJRF9CRUxLSU4KIAl0cmlzdGF0ZSAiQmVsa2luIiBpZiBFTUJFRERFRAogCWRlcGVuZHMgb24gVVNCX0hJRAotCWRlZmF1bHQgeQorCWRlZmF1bHQgIUVNQkVEREVECiAJLS0taGVscC0tLQogCVN1cHBvcnQgZm9yIEJlbGtpbiBGbGlwIEtWTSBhbmQgV2lyZWxlc3Mga2V5Ym9hcmQuCiAKLWNvbmZpZyBISURfQlJJR0hUCi0JdHJpc3RhdGUgIkJyaWdodCIgaWYgRU1CRURERUQKLQlkZXBlbmRzIG9uIFVTQl9ISUQKLQlkZWZhdWx0IHkKLQktLS1oZWxwLS0tCi0JU3VwcG9ydCBmb3IgQnJpZ2h0IEFCTlQtMiBrZXlib2FyZC4KLQogY29uZmlnIEhJRF9DSEVSUlkKIAl0cmlzdGF0ZSAiQ2hlcnJ5IiBpZiBFTUJFRERFRAogCWRlcGVuZHMgb24gVVNCX0hJRAotCWRlZmF1bHQgeQorCWRlZmF1bHQgIUVNQkVEREVECiAJLS0taGVscC0tLQogCVN1cHBvcnQgZm9yIENoZXJyeSBDeW1vdGlvbiBrZXlib2FyZC4KIAogY29uZmlnIEhJRF9DSElDT05ZCiAJdHJpc3RhdGUgIkNoaWNvbnkiIGlmIEVNQkVEREVECiAJZGVwZW5kcyBvbiBVU0JfSElECi0JZGVmYXVsdCB5CisJZGVmYXVsdCAhRU1CRURERUQKIAktLS1oZWxwLS0tCiAJU3VwcG9ydCBmb3IgQ2hpY29ueSBUYWN0aWNhbCBwYWQuCiAKIGNvbmZpZyBISURfQ1lQUkVTUwogCXRyaXN0YXRlICJDeXByZXNzIiBpZiBFTUJFRERFRAogCWRlcGVuZHMgb24gVVNCX0hJRAotCWRlZmF1bHQgeQorCWRlZmF1bHQgIUVNQkVEREVECiAJLS0taGVscC0tLQogCVN1cHBvcnQgZm9yIGN5cHJlc3MgbW91c2UgYW5kIGJhcmNvZGUgcmVhZGVycy4KIAotY29uZmlnIEhJRF9ERUxMCi0JdHJpc3RhdGUgIkRlbGwiIGlmIEVNQkVEREVECi0JZGVwZW5kcyBvbiBVU0JfSElECi0JZGVmYXVsdCB5Ci0JLS0taGVscC0tLQotCVN1cHBvcnQgZm9yIHF1aXJreSBEZWxsIEhJRCBoYXJkd2FyZSB0aGF0IHJlcXVpcmUKLQlzcGVjaWFsIExFRCBoYW5kbGluZyAoVzc2NTggYW5kIFNLODExNSBtb2RlbHMpCi0KIGNvbmZpZyBISURfRVpLRVkKIAl0cmlzdGF0ZSAiRXprZXkiIGlmIEVNQkVEREVECiAJZGVwZW5kcyBvbiBVU0JfSElECi0JZGVmYXVsdCB5CisJZGVmYXVsdCAhRU1CRURERUQKIAktLS1oZWxwLS0tCiAJU3VwcG9ydCBmb3IgRXprZXkgQlRDIDgxOTMga2V5Ym9hcmQuCiAKIGNvbmZpZyBISURfR1lSQVRJT04KIAl0cmlzdGF0ZSAiR3lyYXRpb24iIGlmIEVNQkVEREVECiAJZGVwZW5kcyBvbiBVU0JfSElECi0JZGVmYXVsdCB5CisJZGVmYXVsdCAhRU1CRURERUQKIAktLS1oZWxwLS0tCiAJU3VwcG9ydCBmb3IgR3lyYXRpb24gcmVtb3RlIGNvbnRyb2wuCiAKIGNvbmZpZyBISURfTE9HSVRFQ0gKIAl0cmlzdGF0ZSAiTG9naXRlY2giIGlmIEVNQkVEREVECiAJZGVwZW5kcyBvbiBVU0JfSElECi0JZGVmYXVsdCB5CisJZGVmYXVsdCAhRU1CRURERUQKIAktLS1oZWxwLS0tCiAJU3VwcG9ydCBmb3IgTG9naXRlY2ggZGV2aWNlcyB0aGF0IGFyZSBub3QgZnVsbHkgY29tcGxpYW50IHdpdGggSElEIHN0YW5kYXJkLgogCkBAIC0xOTEsMjEgKzE3NiwyOCBAQAogY29uZmlnIEhJRF9NSUNST1NPRlQKIAl0cmlzdGF0ZSAiTWljcm9zb2Z0IiBpZiBFTUJFRERFRAogCWRlcGVuZHMgb24gVVNCX0hJRAotCWRlZmF1bHQgeQorCWRlZmF1bHQgIUVNQkVEREVECiAJLS0taGVscC0tLQogCVN1cHBvcnQgZm9yIE1pY3Jvc29mdCBkZXZpY2VzIHRoYXQgYXJlIG5vdCBmdWxseSBjb21wbGlhbnQgd2l0aCBISUQgc3RhbmRhcmQuCiAKIGNvbmZpZyBISURfTU9OVEVSRVkKIAl0cmlzdGF0ZSAiTW9udGVyZXkiIGlmIEVNQkVEREVECiAJZGVwZW5kcyBvbiBVU0JfSElECi0JZGVmYXVsdCB5CisJZGVmYXVsdCAhRU1CRURERUQKIAktLS1oZWxwLS0tCiAJU3VwcG9ydCBmb3IgTW9udGVyZXkgR2VuaXVzIEtCMjlFLgogCitjb25maWcgSElEX05UUklHCisJdHJpc3RhdGUgIk5UcmlnIiBpZiBFTUJFRERFRAorCWRlcGVuZHMgb24gVVNCX0hJRAorCWRlZmF1bHQgIUVNQkVEREVECisJLS0taGVscC0tLQorCVN1cHBvcnQgZm9yIE4tVHJpZyB0b3VjaCBzY3JlZW4uCisKIGNvbmZpZyBISURfUEFOVEhFUkxPUkQKIAl0cmlzdGF0ZSAiUGFudGhlcmxvcmQgZGV2aWNlcyBzdXBwb3J0IiBpZiBFTUJFRERFRAogCWRlcGVuZHMgb24gVVNCX0hJRAotCWRlZmF1bHQgeQorCWRlZmF1bHQgIUVNQkVEREVECiAJLS0taGVscC0tLQogCVN1cHBvcnQgZm9yIFBhbnRoZXJMb3JkL0dyZWVuQXNpYSBiYXNlZCBkZXZpY2Ugc3VwcG9ydC4KIApAQCAtMjIwLDMxICsyMTIsNDcgQEAKIGNvbmZpZyBISURfUEVUQUxZTlgKIAl0cmlzdGF0ZSAiUGV0YWx5bngiIGlmIEVNQkVEREVECiAJZGVwZW5kcyBvbiBVU0JfSElECi0JZGVmYXVsdCB5CisJZGVmYXVsdCAhRU1CRURERUQKIAktLS1oZWxwLS0tCiAJU3VwcG9ydCBmb3IgUGV0YWx5bnggTWF4dGVyIHJlbW90ZSBjb250cm9sLgogCiBjb25maWcgSElEX1NBTVNVTkcKIAl0cmlzdGF0ZSAiU2Ftc3VuZyIgaWYgRU1CRURERUQKIAlkZXBlbmRzIG9uIFVTQl9ISUQKLQlkZWZhdWx0IHkKKwlkZWZhdWx0ICFFTUJFRERFRAogCS0tLWhlbHAtLS0KIAlTdXBwb3J0IGZvciBTYW1zdW5nIEluZnJhUmVkIHJlbW90ZSBjb250cm9sLgogCiBjb25maWcgSElEX1NPTlkKIAl0cmlzdGF0ZSAiU29ueSIgaWYgRU1CRURERUQKIAlkZXBlbmRzIG9uIFVTQl9ISUQKLQlkZWZhdWx0IHkKKwlkZWZhdWx0ICFFTUJFRERFRAogCS0tLWhlbHAtLS0KIAlTdXBwb3J0IGZvciBTb255IFBTMyBjb250cm9sbGVyLgogCiBjb25maWcgSElEX1NVTlBMVVMKIAl0cmlzdGF0ZSAiU3VucGx1cyIgaWYgRU1CRURERUQKIAlkZXBlbmRzIG9uIFVTQl9ISUQKLQlkZWZhdWx0IHkKKwlkZWZhdWx0ICFFTUJFRERFRAogCS0tLWhlbHAtLS0KIAlTdXBwb3J0IGZvciBTdW5wbHVzIHdpcmVsZXNzIGRlc2t0b3AuCiAKK2NvbmZpZyBHUkVFTkFTSUFfRkYKKwl0cmlzdGF0ZSAiR3JlZW5Bc2lhIChQcm9kdWN0IElEIDB4MTIpIGZvcmNlIGZlZWRiYWNrIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBVU0JfSElECisJc2VsZWN0IElOUFVUX0ZGX01FTUxFU1MKKwktLS1oZWxwLS0tCisJU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIEdyZWVuQXNpYSAoUHJvZHVjdCBJRCAweDEyKSBiYXNlZCBnYW1lIGNvbnRyb2xsZXIKKwkobGlrZSBNQU5UQSBXYXJpb3IgTU04MTYgYW5kIFNwZWVkTGluayBTdHJpa2UyIFNMLTY2MzUpIG9yIGFkYXB0ZXIKKwlhbmQgd2FudCB0byBlbmFibGUgZm9yY2UgZmVlZGJhY2sgc3VwcG9ydCBmb3IgaXQuCisKK2NvbmZpZyBISURfVE9QU0VFRAorCXRyaXN0YXRlICJUb3BTZWVkIEN5YmVybGluayByZW1vdGUgY29udHJvbCBzdXBwb3J0IiBpZiBFTUJFRERFRAorCWRlcGVuZHMgb24gVVNCX0hJRAorCWRlZmF1bHQgIUVNQkVEREVECisJLS0taGVscC0tLQorCVNheSBZIGlmIHlvdSBoYXZlIGEgVG9wU2VlZCBDeWJlcmxpbmsgcmVtb3RlIGNvbnRyb2wuCisKIGNvbmZpZyBUSFJVU1RNQVNURVJfRkYKIAl0cmlzdGF0ZSAiVGhydXN0TWFzdGVyIGRldmljZXMgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFVTQl9ISUQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL01ha2VmaWxlIGIvZHJpdmVycy9oaWQvTWFrZWZpbGUKaW5kZXggYjA5ZTQzZS4uZmJkMDIxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9oaWQvTWFrZWZpbGUKQEAgLTIzLDIyICsyMywyMyBAQAogb2JqLSQoQ09ORklHX0hJRF9BNFRFQ0gpCSs9IGhpZC1hNHRlY2gubwogb2JqLSQoQ09ORklHX0hJRF9BUFBMRSkJCSs9IGhpZC1hcHBsZS5vCiBvYmotJChDT05GSUdfSElEX0JFTEtJTikJKz0gaGlkLWJlbGtpbi5vCi1vYmotJChDT05GSUdfSElEX0JSSUdIVCkJKz0gaGlkLWJyaWdodC5vCiBvYmotJChDT05GSUdfSElEX0NIRVJSWSkJKz0gaGlkLWNoZXJyeS5vCiBvYmotJChDT05GSUdfSElEX0NISUNPTlkpCSs9IGhpZC1jaGljb255Lm8KIG9iai0kKENPTkZJR19ISURfQ1lQUkVTUykJKz0gaGlkLWN5cHJlc3Mubwotb2JqLSQoQ09ORklHX0hJRF9ERUxMKQkJKz0gaGlkLWRlbGwubwogb2JqLSQoQ09ORklHX0hJRF9FWktFWSkJCSs9IGhpZC1lemtleS5vCiBvYmotJChDT05GSUdfSElEX0dZUkFUSU9OKQkrPSBoaWQtZ3lyYXRpb24ubwogb2JqLSQoQ09ORklHX0hJRF9MT0dJVEVDSCkJKz0gaGlkLWxvZ2l0ZWNoLm8KIG9iai0kKENPTkZJR19ISURfTUlDUk9TT0ZUKQkrPSBoaWQtbWljcm9zb2Z0Lm8KIG9iai0kKENPTkZJR19ISURfTU9OVEVSRVkpCSs9IGhpZC1tb250ZXJleS5vCitvYmotJChDT05GSUdfSElEX05UUklHKQkJKz0gaGlkLW50cmlnLm8KIG9iai0kKENPTkZJR19ISURfUEFOVEhFUkxPUkQpCSs9IGhpZC1wbC5vCiBvYmotJChDT05GSUdfSElEX1BFVEFMWU5YKQkrPSBoaWQtcGV0YWx5bngubwogb2JqLSQoQ09ORklHX0hJRF9TQU1TVU5HKQkrPSBoaWQtc2Ftc3VuZy5vCiBvYmotJChDT05GSUdfSElEX1NPTlkpCQkrPSBoaWQtc29ueS5vCiBvYmotJChDT05GSUdfSElEX1NVTlBMVVMpCSs9IGhpZC1zdW5wbHVzLm8KK29iai0kKENPTkZJR19HUkVFTkFTSUFfRkYpCSs9IGhpZC1nYWZmLm8KIG9iai0kKENPTkZJR19USFJVU1RNQVNURVJfRkYpCSs9IGhpZC10bWZmLm8KK29iai0kKENPTkZJR19ISURfVE9QU0VFRCkJKz0gaGlkLXRvcHNlZWQubwogb2JqLSQoQ09ORklHX1pFUk9QTFVTX0ZGKQkrPSBoaWQtenBmZi5vCiAKIG9iai0kKENPTkZJR19VU0JfSElEKQkJKz0gdXNiaGlkLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWJyaWdodC5jIGIvZHJpdmVycy9oaWQvaGlkLWJyaWdodC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODUxN2ExLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvaGlkL2hpZC1icmlnaHQuYworKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiAgSElEIGRyaXZlciBmb3Igc29tZSBicmlnaHQgInNwZWNpYWwiIGRldmljZXMKLSAqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4IE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkByZWRoYXQuY29tPgotICoKLSAqIEJhc2VkIG9uIGhpZC1kZWxsIGRyaXZlcgotICovCi0KLS8qCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9oaWQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLQotI2luY2x1ZGUgImhpZC1pZHMuaCIKLQotc3RhdGljIGludCBicmlnaHRfcHJvYmUoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkICppZCkKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gaGlkX3BhcnNlKGhkZXYpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKLQkJZ290byBlcnJfZnJlZTsKLQl9Ci0KLQlyZXQgPSBoaWRfaHdfc3RhcnQoaGRldiwgSElEX0NPTk5FQ1RfREVGQVVMVCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOwotCQlnb3RvIGVycl9mcmVlOwotCX0KLQotCXVzYmhpZF9zZXRfbGVkcyhoZGV2KTsKLQotCXJldHVybiAwOwotZXJyX2ZyZWU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkIGJyaWdodF9kZXZpY2VzW10gPSB7Ci0JeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0JSSUdIVCwgVVNCX0RFVklDRV9JRF9CUklHSFRfQUJOVDIpIH0sCi0JeyB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShoaWQsIGJyaWdodF9kZXZpY2VzKTsKLQotc3RhdGljIHN0cnVjdCBoaWRfZHJpdmVyIGJyaWdodF9kcml2ZXIgPSB7Ci0JLm5hbWUgPSAiYnJpZ2h0IiwKLQkuaWRfdGFibGUgPSBicmlnaHRfZGV2aWNlcywKLQkucHJvYmUgPSBicmlnaHRfcHJvYmUsCi19OwotCi1zdGF0aWMgaW50IGJyaWdodF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIGhpZF9yZWdpc3Rlcl9kcml2ZXIoJmJyaWdodF9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBicmlnaHRfZXhpdCh2b2lkKQotewotCWhpZF91bnJlZ2lzdGVyX2RyaXZlcigmYnJpZ2h0X2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KGJyaWdodF9pbml0KTsKLW1vZHVsZV9leGl0KGJyaWdodF9leGl0KTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotSElEX0NPTVBBVF9MT0FEX0RSSVZFUihicmlnaHQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWNvcmUuYyBiL2RyaXZlcnMvaGlkL2hpZC1jb3JlLmMKaW5kZXggNDBkZjNlMS4uNWQ3NjQwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWNvcmUuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtY29yZS5jCkBAIC0xMjU2LDE5ICsxMjU2LDE2IEBACiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0ZPVU5UQUlOX1RQX09OTFkpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0dFWVNFUjFfVFBfT05MWSkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQkVMS0lOLCBVU0JfREVWSUNFX0lEX0ZMSVBfS1ZNKSB9LAotCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9CUklHSFQsIFVTQl9ERVZJQ0VfSURfQlJJR0hUX0FCTlQyKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DSEVSUlksIFVTQl9ERVZJQ0VfSURfQ0hFUlJZX0NZTU9USU9OKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DSElDT05ZLCBVU0JfREVWSUNFX0lEX0NISUNPTllfVEFDVElDQUxfUEFEKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DWVBSRVNTLCBVU0JfREVWSUNFX0lEX0NZUFJFU1NfQkFSQ09ERV8xKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DWVBSRVNTLCBVU0JfREVWSUNFX0lEX0NZUFJFU1NfQkFSQ09ERV8yKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DWVBSRVNTLCBVU0JfREVWSUNFX0lEX0NZUFJFU1NfTU9VU0UpIH0sCi0JeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0RFTEwsIFVTQl9ERVZJQ0VfSURfREVMTF9XNzY1OCkgfSwKLQl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfREVMTCwgVVNCX0RFVklDRV9JRF9ERUxMX1NLODExNSkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfRVpLRVksIFVTQl9ERVZJQ0VfSURfQlRDXzgxOTMpIH0sCi0JeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dFTkVSSUNfMTNCQSwgVVNCX0RFVklDRV9JRF9HRU5FUklDXzEzQkFfS0JEX01PVVNFKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HQU1FUk9OLCBVU0JfREVWSUNFX0lEX0dBTUVST05fRFVBTF9QU1hfQURBUFRPUikgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfR0FNRVJPTiwgVVNCX0RFVklDRV9JRF9HQU1FUk9OX0RVQUxfUENTX0FEQVBUT1IpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dSRUVOQVNJQSwgMHgwMDAzKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HUkVFTkFTSUEsIDB4MDAxMikgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfR1lSQVRJT04sIFVTQl9ERVZJQ0VfSURfR1lSQVRJT05fUkVNT1RFKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HWVJBVElPTiwgVVNCX0RFVklDRV9JRF9HWVJBVElPTl9SRU1PVEVfMikgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTEFCVEVDLCBVU0JfREVWSUNFX0lEX0xBQlRFQ19XSVJFTEVTU19LRVlCT0FSRCkgfSwKQEAgLTEyNzksNyArMTI3Niw2IEBACiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0RJTk9WT19ERVNLVE9QKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9ESU5PVk9fRURHRSkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfRElOT1ZPX01JTkkpIH0sCi0JeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0tCRCkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfRUxJVEVfS0JEKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9DT1JETEVTU19ERVNLVE9QX0xYNTAwKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9FWFRSRU1FXzNEKSB9LApAQCAtMTI5NywyMyArMTI5MywxMDUgQEAKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTUlDUk9TT0ZULCBVU0JfREVWSUNFX0lEX01TX1BSRVNFTlRFUl84S19VU0IpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX01JQ1JPU09GVCwgVVNCX0RFVklDRV9JRF9XSVJFTEVTU19PUFRJQ0FMX0RFU0tUT1BfM18wKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9NT05URVJFWSwgVVNCX0RFVklDRV9JRF9HRU5JVVNfS0IyOUUpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX05UUklHLCBVU0JfREVWSUNFX0lEX05UUklHX1RPVUNIX1NDUkVFTikgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfUEVUQUxZTlgsIFVTQl9ERVZJQ0VfSURfUEVUQUxZTlhfTUFYVEVSX1JFTU9URSkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfU0FNU1VORywgVVNCX0RFVklDRV9JRF9TQU1TVU5HX0lSX1JFTU9URSkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfU09OWSwgVVNCX0RFVklDRV9JRF9TT05ZX1BTM19DT05UUk9MTEVSKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9TT05ZLCBVU0JfREVWSUNFX0lEX1NPTllfVkFJT19WR1hfTU9VU0UpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1NVTlBMVVMsIFVTQl9ERVZJQ0VfSURfU1VOUExVU19XREVTS1RPUCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfVE9QU0VFRCwgVVNCX0RFVklDRV9JRF9UT1BTRUVEX0NZQkVSTElOSykgfSwKIAogCXsgSElEX0JMVUVUT09USF9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgMHgwMzBjKSB9LAogCXsgSElEX0JMVUVUT09USF9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9NSUNST1NPRlQsIFVTQl9ERVZJQ0VfSURfTVNfUFJFU0VOVEVSXzhLX0JUKSB9LAogCXsgfQogfTsKIAorc3RydWN0IGhpZF9keW5pZCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBoaWRfZGV2aWNlX2lkIGlkOworfTsKKworLyoqCisgKiBzdG9yZV9uZXdfaWQgLSBhZGQgYSBuZXcgSElEIGRldmljZSBJRCB0byB0aGlzIGRyaXZlciBhbmQgcmUtcHJvYmUgZGV2aWNlcworICogQGRyaXZlcjogdGFyZ2V0IGRldmljZSBkcml2ZXIKKyAqIEBidWY6IGJ1ZmZlciBmb3Igc2Nhbm5pbmcgZGV2aWNlIElEIGRhdGEKKyAqIEBjb3VudDogaW5wdXQgc2l6ZQorICoKKyAqIEFkZHMgYSBuZXcgZHluYW1pYyBoaWQgZGV2aWNlIElEIHRvIHRoaXMgZHJpdmVyLAorICogYW5kIGNhdXNlcyB0aGUgZHJpdmVyIHRvIHByb2JlIGZvciBhbGwgZGV2aWNlcyBhZ2Fpbi4KKyAqLworc3RhdGljIHNzaXplX3Qgc3RvcmVfbmV3X2lkKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBoaWRfZHJpdmVyICpoZHJ2ID0gY29udGFpbmVyX29mKGRydiwgc3RydWN0IGhpZF9kcml2ZXIsIGRyaXZlcik7CisJc3RydWN0IGhpZF9keW5pZCAqZHluaWQ7CisJX191MzIgYnVzLCB2ZW5kb3IsIHByb2R1Y3Q7CisJdW5zaWduZWQgbG9uZyBkcml2ZXJfZGF0YSA9IDA7CisJaW50IHJldDsKKworCXJldCA9IHNzY2FuZihidWYsICIleCAleCAleCAlbHgiLAorCQkJJmJ1cywgJnZlbmRvciwgJnByb2R1Y3QsICZkcml2ZXJfZGF0YSk7CisJaWYgKHJldCA8IDMpCisJCXJldHVybiAtRUlOVkFMOworCisJZHluaWQgPSBremFsbG9jKHNpemVvZigqZHluaWQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWR5bmlkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWR5bmlkLT5pZC5idXMgPSBidXM7CisJZHluaWQtPmlkLnZlbmRvciA9IHZlbmRvcjsKKwlkeW5pZC0+aWQucHJvZHVjdCA9IHByb2R1Y3Q7CisJZHluaWQtPmlkLmRyaXZlcl9kYXRhID0gZHJpdmVyX2RhdGE7CisKKwlzcGluX2xvY2soJmhkcnYtPmR5bl9sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZkeW5pZC0+bGlzdCwgJmhkcnYtPmR5bl9saXN0KTsKKwlzcGluX3VubG9jaygmaGRydi0+ZHluX2xvY2spOworCisJcmV0ID0gMDsKKwlpZiAoZ2V0X2RyaXZlcigmaGRydi0+ZHJpdmVyKSkgeworCQlyZXQgPSBkcml2ZXJfYXR0YWNoKCZoZHJ2LT5kcml2ZXIpOworCQlwdXRfZHJpdmVyKCZoZHJ2LT5kcml2ZXIpOworCX0KKworCXJldHVybiByZXQgPyA6IGNvdW50OworfQorc3RhdGljIERSSVZFUl9BVFRSKG5ld19pZCwgU19JV1VTUiwgTlVMTCwgc3RvcmVfbmV3X2lkKTsKKworc3RhdGljIHZvaWQgaGlkX2ZyZWVfZHluaWRzKHN0cnVjdCBoaWRfZHJpdmVyICpoZHJ2KQoreworCXN0cnVjdCBoaWRfZHluaWQgKmR5bmlkLCAqbjsKKworCXNwaW5fbG9jaygmaGRydi0+ZHluX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkeW5pZCwgbiwgJmhkcnYtPmR5bl9saXN0LCBsaXN0KSB7CisJCWxpc3RfZGVsKCZkeW5pZC0+bGlzdCk7CisJCWtmcmVlKGR5bmlkKTsKKwl9CisJc3Bpbl91bmxvY2soJmhkcnYtPmR5bl9sb2NrKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkICpoaWRfbWF0Y2hfZGV2aWNlKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LAorCQlzdHJ1Y3QgaGlkX2RyaXZlciAqaGRydikKK3sKKwlzdHJ1Y3QgaGlkX2R5bmlkICpkeW5pZDsKKworCXNwaW5fbG9jaygmaGRydi0+ZHluX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZHluaWQsICZoZHJ2LT5keW5fbGlzdCwgbGlzdCkgeworCQlpZiAoaGlkX21hdGNoX29uZV9pZChoZGV2LCAmZHluaWQtPmlkKSkgeworCQkJc3Bpbl91bmxvY2soJmhkcnYtPmR5bl9sb2NrKTsKKwkJCXJldHVybiAmZHluaWQtPmlkOworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZoZHJ2LT5keW5fbG9jayk7CisKKwlyZXR1cm4gaGlkX21hdGNoX2lkKGhkZXYsIGhkcnYtPmlkX3RhYmxlKTsKK30KKwogc3RhdGljIGludCBoaWRfYnVzX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKIHsKIAlzdHJ1Y3QgaGlkX2RyaXZlciAqaGRydiA9IGNvbnRhaW5lcl9vZihkcnYsIHN0cnVjdCBoaWRfZHJpdmVyLCBkcml2ZXIpOwogCXN0cnVjdCBoaWRfZGV2aWNlICpoZGV2ID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGhpZF9kZXZpY2UsIGRldik7CiAKLQlpZiAoIWhpZF9tYXRjaF9pZChoZGV2LCBoZHJ2LT5pZF90YWJsZSkpCisJaWYgKCFoaWRfbWF0Y2hfZGV2aWNlKGhkZXYsIGhkcnYpKQogCQlyZXR1cm4gMDsKIAogCS8qIGdlbmVyaWMgd2FudHMgYWxsIG5vbi1ibGFja2xpc3RlZCAqLwpAQCAtMTMzMiw3ICsxNDEwLDcgQEAKIAlpbnQgcmV0ID0gMDsKIAogCWlmICghaGRldi0+ZHJpdmVyKSB7Ci0JCWlkID0gaGlkX21hdGNoX2lkKGhkZXYsIGhkcnYtPmlkX3RhYmxlKTsKKwkJaWQgPSBoaWRfbWF0Y2hfZGV2aWNlKGhkZXYsIGhkcnYpOwogCQlpZiAoaWQgPT0gTlVMTCkKIAkJCXJldHVybiAtRU5PREVWOwogCkBAIC0xNDIwLDYgKzE0OTgsNyBAQAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DTUVESUEsIFVTQl9ERVZJQ0VfSURfQ00xMDkpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0NZUFJFU1MsIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19ISURDT00pIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0NZUFJFU1MsIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19VTFRSQU1PVVNFKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9ERUFMRVhUUkVBTUUsIFVTQl9ERVZJQ0VfSURfREVBTEVYVFJFQU1FX1JBRElPX1NJNDcwMSkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfREVMT1JNRSwgVVNCX0RFVklDRV9JRF9ERUxPUk1FX0VBUlRITUFURSkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfREVMT1JNRSwgVVNCX0RFVklDRV9JRF9ERUxPUk1FX0VNX0xUMjApIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0VTU0VOVElBTF9SRUFMSVRZLCBVU0JfREVWSUNFX0lEX0VTU0VOVElBTF9SRUFMSVRZX1A1KSB9LApAQCAtMTU3Nyw2ICsxNjU2LDkgQEAKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzJfQU5TSSkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzJfSVNPKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HMl9KSVMpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkczX0FOU0kpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkczX0lTTykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzNfSklTKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9GT1VOVEFJTl9UUF9PTkxZKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVIxX1RQX09OTFkpIH0sCiAJeyB9CkBAIC0xNjE4LDkgKzE3MDAsMTAgQEAKIAlpZiAoaGlkX2lnbm9yZShoZGV2KSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQkvKiBYWFggaGFjaywgYW55IG90aGVyIGNsZWFuZXIgc29sdXRpb24gPCAyMCBidXNfaWQgYnl0ZXM/ICovCi0Jc3ByaW50ZihoZGV2LT5kZXYuYnVzX2lkLCAiJTA0WDolMDRYOiUwNFguJTA0WCIsIGhkZXYtPmJ1cywKLQkJCWhkZXYtPnZlbmRvciwgaGRldi0+cHJvZHVjdCwgYXRvbWljX2luY19yZXR1cm4oJmlkKSk7CisJLyogWFhYIGhhY2ssIGFueSBvdGhlciBjbGVhbmVyIHNvbHV0aW9uIGFmdGVyIHRoZSBkcml2ZXIgY29yZQorCSAqIGlzIGNvbnZlcnRlZCB0byBhbGxvdyBtb3JlIHRoYW4gMjAgYnl0ZXMgYXMgdGhlIGRldmljZSBuYW1lPyAqLworCWRldl9zZXRfbmFtZSgmaGRldi0+ZGV2LCAiJTA0WDolMDRYOiUwNFguJTA0WCIsIGhkZXYtPmJ1cywKKwkJICAgICBoZGV2LT52ZW5kb3IsIGhkZXYtPnByb2R1Y3QsIGF0b21pY19pbmNfcmV0dXJuKCZpZCkpOwogCiAJcmV0ID0gZGV2aWNlX2FkZCgmaGRldi0+ZGV2KTsKIAlpZiAoIXJldCkKQEAgLTE2OTUsMTggKzE3NzgsMzMgQEAKIGludCBfX2hpZF9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGhpZF9kcml2ZXIgKmhkcnYsIHN0cnVjdCBtb2R1bGUgKm93bmVyLAogCQljb25zdCBjaGFyICptb2RfbmFtZSkKIHsKKwlpbnQgcmV0OworCiAJaGRydi0+ZHJpdmVyLm5hbWUgPSBoZHJ2LT5uYW1lOwogCWhkcnYtPmRyaXZlci5idXMgPSAmaGlkX2J1c190eXBlOwogCWhkcnYtPmRyaXZlci5vd25lciA9IG93bmVyOwogCWhkcnYtPmRyaXZlci5tb2RfbmFtZSA9IG1vZF9uYW1lOwogCi0JcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmaGRydi0+ZHJpdmVyKTsKKwlJTklUX0xJU1RfSEVBRCgmaGRydi0+ZHluX2xpc3QpOworCXNwaW5fbG9ja19pbml0KCZoZHJ2LT5keW5fbG9jayk7CisKKwlyZXQgPSBkcml2ZXJfcmVnaXN0ZXIoJmhkcnYtPmRyaXZlcik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGRyaXZlcl9jcmVhdGVfZmlsZSgmaGRydi0+ZHJpdmVyLCAmZHJpdmVyX2F0dHJfbmV3X2lkKTsKKwlpZiAocmV0KQorCQlkcml2ZXJfdW5yZWdpc3RlcigmaGRydi0+ZHJpdmVyKTsKKworCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChfX2hpZF9yZWdpc3Rlcl9kcml2ZXIpOwogCiB2b2lkIGhpZF91bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgaGlkX2RyaXZlciAqaGRydikKIHsKKwlkcml2ZXJfcmVtb3ZlX2ZpbGUoJmhkcnYtPmRyaXZlciwgJmRyaXZlcl9hdHRyX25ld19pZCk7CiAJZHJpdmVyX3VucmVnaXN0ZXIoJmhkcnYtPmRyaXZlcik7CisJaGlkX2ZyZWVfZHluaWRzKGhkcnYpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaGlkX3VucmVnaXN0ZXJfZHJpdmVyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWRlbGwuYyBiL2RyaXZlcnMvaGlkL2hpZC1kZWxsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NDc0MzAwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvaGlkL2hpZC1kZWxsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICogIEhJRCBkcml2ZXIgZm9yIHNvbWUgZGVsbCAic3BlY2lhbCIgZGV2aWNlcwotICoKLSAqICBDb3B5cmlnaHQgKGMpIDE5OTkgQW5kcmVhcyBHYWwKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBWb2p0ZWNoIFBhdmxpayA8dm9qdGVjaEBzdXNlLmN6PgotICogIENvcHlyaWdodCAoYykgMjAwNSBNaWNoYWVsIEhhYm91c3RhayA8bWlrZS1AY2luY2kucnIuY29tPiBmb3IgQ29uY2VwdDIsIEluYwotICogIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEppcmkgS29zaW5hCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IFBhdWwgV2FsbXNsZXkKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDggSmlyaSBTbGFieQotICovCi0KLS8qCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9oaWQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLQotI2luY2x1ZGUgImhpZC1pZHMuaCIKLQotc3RhdGljIGludCBkZWxsX3Byb2JlKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCAqaWQpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IGhpZF9wYXJzZShoZGV2KTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgInBhcnNlIGZhaWxlZFxuIik7Ci0JCWdvdG8gZXJyX2ZyZWU7Ci0JfQotCi0JcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKLQkJZ290byBlcnJfZnJlZTsKLQl9Ci0KLQl1c2JoaWRfc2V0X2xlZHMoaGRldik7Ci0KLQlyZXR1cm4gMDsKLWVycl9mcmVlOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCBkZWxsX2RldmljZXNbXSA9IHsKLQl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfREVMTCwgVVNCX0RFVklDRV9JRF9ERUxMX1c3NjU4KSB9LAotCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9ERUxMLCBVU0JfREVWSUNFX0lEX0RFTExfU0s4MTE1KSB9LAotCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HRU5FUklDXzEzQkEsIFVTQl9ERVZJQ0VfSURfR0VORVJJQ18xM0JBX0tCRF9NT1VTRSkgfSwKLQl7IH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKGhpZCwgZGVsbF9kZXZpY2VzKTsKLQotc3RhdGljIHN0cnVjdCBoaWRfZHJpdmVyIGRlbGxfZHJpdmVyID0gewotCS5uYW1lID0gImRlbGwiLAotCS5pZF90YWJsZSA9IGRlbGxfZGV2aWNlcywKLQkucHJvYmUgPSBkZWxsX3Byb2JlLAotfTsKLQotc3RhdGljIGludCBkZWxsX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gaGlkX3JlZ2lzdGVyX2RyaXZlcigmZGVsbF9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBkZWxsX2V4aXQodm9pZCkKLXsKLQloaWRfdW5yZWdpc3Rlcl9kcml2ZXIoJmRlbGxfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoZGVsbF9pbml0KTsKLW1vZHVsZV9leGl0KGRlbGxfZXhpdCk7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLUhJRF9DT01QQVRfTE9BRF9EUklWRVIoZGVsbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtZHVtbXkuYyBiL2RyaXZlcnMvaGlkL2hpZC1kdW1teS5jCmluZGV4IGUxNDhmODYuLmI0Y2MwZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1kdW1teS5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1kdW1teS5jCkBAIC00Myw2ICs0Myw5IEBACiAjaWZkZWYgQ09ORklHX0hJRF9NT05URVJFWV9NT0RVTEUKIAlISURfQ09NUEFUX0NBTExfRFJJVkVSKG1vbnRlcmV5KTsKICNlbmRpZgorI2lmZGVmIENPTkZJR19ISURfTlRSSUdfTU9EVUxFCisJSElEX0NPTVBBVF9DQUxMX0RSSVZFUihudHJpZyk7CisjZW5kaWYKICNpZmRlZiBDT05GSUdfSElEX1BBTlRIRVJMT1JEX01PRFVMRQogCUhJRF9DT01QQVRfQ0FMTF9EUklWRVIocGFudGhlcmxvcmQpOwogI2VuZGlmCkBAIC01OCw2ICs2MSw5IEBACiAjaWZkZWYgQ09ORklHX0hJRF9TVU5QTFVTX01PRFVMRQogCUhJRF9DT01QQVRfQ0FMTF9EUklWRVIoc3VucGx1cyk7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfR1JFRU5BU0lBX0ZGX01PRFVMRQorCUhJRF9DT01QQVRfQ0FMTF9EUklWRVIoZ3JlZW5hc2lhKTsKKyNlbmRpZgogI2lmZGVmIENPTkZJR19USFJVU1RNQVNURVJfRkZfTU9EVUxFCiAJSElEX0NPTVBBVF9DQUxMX0RSSVZFUih0aHJ1c3RtYXN0ZXIpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtZ2FmZi5jIGIvZHJpdmVycy9oaWQvaGlkLWdhZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTIxMWY2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9oaWQvaGlkLWdhZmYuYwpAQCAtMCwwICsxLDE4NSBAQAorLyoKKyAqICBGb3JjZSBmZWVkYmFjayBzdXBwb3J0IGZvciBHcmVlbkFzaWEgKFByb2R1Y3QgSUQgMHgxMikgYmFzZWQgZGV2aWNlcworICoKKyAqICBUaGUgZGV2aWNlcyBhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdmFyaW91cyBuYW1lcyBhbmQgdGhlIHNhbWUgVVNCIGRldmljZSBJRAorICogIGNhbiBiZSB1c2VkIGluIG1hbnkgZ2FtZSBjb250cm9sbGVycy4KKyAqCisgKgorICogIDBlOGY6MDAxMiAiR3JlZW5Bc2lhIEluYy4gICAgVVNCIEpveXN0aWNrICAgICAiCisgKiAgIC0gdGVzdGVkIHdpdGggTUFOVEEgV2FyaW9yIE1NODE2IGFuZCBTcGVlZExpbmsgU3RyaWtlMiBTTC02NjM1LgorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDggTHVrYXN6IEx1Ym9qYW5za2kgPGx1a2FzekBsdWJvamFuc2tpLmluZm8+CisgKi8KKworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvaGlkLmg+CisjaW5jbHVkZSAiaGlkLWlkcy5oIgorI2luY2x1ZGUgInVzYmhpZC91c2JoaWQuaCIKKworc3RydWN0IGdhZmZfZGV2aWNlIHsKKwlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OworfTsKKworc3RhdGljIGludCBoaWRfZ2FmZl9wbGF5KHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgdm9pZCAqZGF0YSwKKwkJCSBzdHJ1Y3QgZmZfZWZmZWN0ICplZmZlY3QpCit7CisJc3RydWN0IGhpZF9kZXZpY2UgKmhpZCA9IGlucHV0X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGdhZmZfZGV2aWNlICpnYWZmID0gZGF0YTsKKwlpbnQgbGVmdCwgcmlnaHQ7CisKKwlsZWZ0ID0gZWZmZWN0LT51LnJ1bWJsZS5zdHJvbmdfbWFnbml0dWRlOworCXJpZ2h0ID0gZWZmZWN0LT51LnJ1bWJsZS53ZWFrX21hZ25pdHVkZTsKKworCWRiZ19oaWQoImNhbGxlZCB3aXRoIDB4JTA0eCAweCUwNHgiLCBsZWZ0LCByaWdodCk7CisKKwlsZWZ0ID0gbGVmdCAqIDB4ZmUgLyAweGZmZmY7CisJcmlnaHQgPSByaWdodCAqIDB4ZmUgLyAweGZmZmY7CisKKwlnYWZmLT5yZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVswXSA9IDB4NTE7CisJZ2FmZi0+cmVwb3J0LT5maWVsZFswXS0+dmFsdWVbMV0gPSAweDA7CisJZ2FmZi0+cmVwb3J0LT5maWVsZFswXS0+dmFsdWVbMl0gPSByaWdodDsKKwlnYWZmLT5yZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVszXSA9IDA7CisJZ2FmZi0+cmVwb3J0LT5maWVsZFswXS0+dmFsdWVbNF0gPSBsZWZ0OworCWdhZmYtPnJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzVdID0gMDsKKwlkYmdfaGlkKCJydW5uaW5nIHdpdGggMHglMDJ4IDB4JTAyeCIsIGxlZnQsIHJpZ2h0KTsKKwl1c2JoaWRfc3VibWl0X3JlcG9ydChoaWQsIGdhZmYtPnJlcG9ydCwgVVNCX0RJUl9PVVQpOworCisJZ2FmZi0+cmVwb3J0LT5maWVsZFswXS0+dmFsdWVbMF0gPSAweGZhOworCWdhZmYtPnJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzFdID0gMHhmZTsKKwlnYWZmLT5yZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVsyXSA9IDB4MDsKKwlnYWZmLT5yZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVs0XSA9IDB4MDsKKworCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgZ2FmZi0+cmVwb3J0LCBVU0JfRElSX09VVCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYWZmX2luaXQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKK3sKKwlzdHJ1Y3QgZ2FmZl9kZXZpY2UgKmdhZmY7CisJc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydDsKKwlzdHJ1Y3QgaGlkX2lucHV0ICpoaWRpbnB1dCA9IGxpc3RfZW50cnkoaGlkLT5pbnB1dHMubmV4dCwKKwkJCQkJCXN0cnVjdCBoaWRfaW5wdXQsIGxpc3QpOworCXN0cnVjdCBsaXN0X2hlYWQgKnJlcG9ydF9saXN0ID0KKwkJCSZoaWQtPnJlcG9ydF9lbnVtW0hJRF9PVVRQVVRfUkVQT1JUXS5yZXBvcnRfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpyZXBvcnRfcHRyID0gcmVwb3J0X2xpc3Q7CisJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gaGlkaW5wdXQtPmlucHV0OworCWludCBlcnJvcjsKKworCWlmIChsaXN0X2VtcHR5KHJlcG9ydF9saXN0KSkgeworCQlkZXZfZXJyKCZoaWQtPmRldiwgIm5vIG91dHB1dCByZXBvcnRzIGZvdW5kXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmVwb3J0X3B0ciA9IHJlcG9ydF9wdHItPm5leHQ7CisKKwlyZXBvcnQgPSBsaXN0X2VudHJ5KHJlcG9ydF9wdHIsIHN0cnVjdCBoaWRfcmVwb3J0LCBsaXN0KTsKKwlpZiAocmVwb3J0LT5tYXhmaWVsZCA8IDEpIHsKKwkJZGV2X2VycigmaGlkLT5kZXYsICJubyBmaWVsZHMgaW4gdGhlIHJlcG9ydFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChyZXBvcnQtPmZpZWxkWzBdLT5yZXBvcnRfY291bnQgPCA2KSB7CisJCWRldl9lcnIoJmhpZC0+ZGV2LCAibm90IGVub3VnaCB2YWx1ZXMgaW4gdGhlIGZpZWxkXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZ2FmZiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBnYWZmX2RldmljZSksIEdGUF9LRVJORUwpOworCWlmICghZ2FmZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzZXRfYml0KEZGX1JVTUJMRSwgZGV2LT5mZmJpdCk7CisKKwllcnJvciA9IGlucHV0X2ZmX2NyZWF0ZV9tZW1sZXNzKGRldiwgZ2FmZiwgaGlkX2dhZmZfcGxheSk7CisJaWYgKGVycm9yKSB7CisJCWtmcmVlKGdhZmYpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJZ2FmZi0+cmVwb3J0ID0gcmVwb3J0OworCWdhZmYtPnJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzBdID0gMHg1MTsKKwlnYWZmLT5yZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVsxXSA9IDB4MDA7CisJZ2FmZi0+cmVwb3J0LT5maWVsZFswXS0+dmFsdWVbMl0gPSAweDAwOworCWdhZmYtPnJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzNdID0gMHgwMDsKKwl1c2JoaWRfc3VibWl0X3JlcG9ydChoaWQsIGdhZmYtPnJlcG9ydCwgVVNCX0RJUl9PVVQpOworCisJZ2FmZi0+cmVwb3J0LT5maWVsZFswXS0+dmFsdWVbMF0gPSAweGZhOworCWdhZmYtPnJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzFdID0gMHhmZTsKKworCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgZ2FmZi0+cmVwb3J0LCBVU0JfRElSX09VVCk7CisKKwlkZXZfaW5mbygmaGlkLT5kZXYsICJGb3JjZSBGZWVkYmFjayBmb3IgR3JlZW5Bc2lhIDB4MTIiCisJICAgICAgICIgZGV2aWNlcyBieSBMdWthc3ogTHVib2phbnNraSA8bHVrYXN6QGx1Ym9qYW5za2kuaW5mbz5cbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2FfcHJvYmUoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmV0OworCisJZGV2X2RiZygmaGRldi0+ZGV2LCAiR3JlZW5hc2lhIEhJRCBoYXJkd2FyZSBwcm9iZS4uLiIpOworCisJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQgJiB+SElEX0NPTk5FQ1RfRkYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJZ2FmZl9pbml0KGhkZXYpOworCisJcmV0dXJuIDA7CitlcnI6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkIGdhX2RldmljZXNbXSA9IHsKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfR1JFRU5BU0lBLCAweDAwMTIpLCAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGhpZCwgZ2FfZGV2aWNlcyk7CisKK3N0YXRpYyBzdHJ1Y3QgaGlkX2RyaXZlciBnYV9kcml2ZXIgPSB7CisJLm5hbWUgPSAiZ3JlZW5hc2lhIiwKKwkuaWRfdGFibGUgPSBnYV9kZXZpY2VzLAorCS5wcm9iZSA9IGdhX3Byb2JlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZ2FfaW5pdCh2b2lkKQoreworCXJldHVybiBoaWRfcmVnaXN0ZXJfZHJpdmVyKCZnYV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZ2FfZXhpdCh2b2lkKQoreworCWhpZF91bnJlZ2lzdGVyX2RyaXZlcigmZ2FfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoZ2FfaW5pdCk7Cittb2R1bGVfZXhpdChnYV9leGl0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworSElEX0NPTVBBVF9MT0FEX0RSSVZFUihncmVlbmFzaWEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWlkcy5oIGIvZHJpdmVycy9oaWQvaGlkLWlkcy5oCmluZGV4IDM5Mjg5NjkuLmFjYzFhYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1pZHMuaAorKysgYi9kcml2ZXJzL2hpZC9oaWQtaWRzLmgKQEAgLTEwNyw5ICsxMDcsNiBAQAogI2RlZmluZSBVU0JfVkVORE9SX0lEX0JFTEtJTiAgICAgICAgICAgMHgwNTBkCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfRkxJUF9LVk0gICAgICAgICAweDMyMDEKIAotI2RlZmluZSBVU0JfVkVORE9SX0lEX0JSSUdIVAkJMHgxMjQxCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfQlJJR0hUX0FCTlQyCTB4MTUwMwotCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfQkVSS1NISVJFCQkweDBjOTgKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9CRVJLU0hJUkVfUENXRAkweDExNDAKIApAQCAtMTQxLDkgKzEzOCw4IEBACiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19CQVJDT0RFXzEJMHhkZTYxCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19CQVJDT0RFXzIJMHhkZTY0CiAKLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9ERUxMCQkweDQxM2MKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9ERUxMX1c3NjU4CTB4MjAwNQotI2RlZmluZSBVU0JfREVWSUNFX0lEX0RFTExfU0s4MTE1CTB4MjEwNQorI2RlZmluZSBVU0JfVkVORE9SX0lEX0RFQUxFWFRSRUFNRQkweDEwYzUKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9ERUFMRVhUUkVBTUVfUkFESU9fU0k0NzAxCTB4ODE5YQogCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfREVMT1JNRQkJMHgxMTYzCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfREVMT1JNRV9FQVJUSE1BVEUgMHgwMTAwCkBAIC0xNjcsOSArMTYzLDYgQEAKIAogI2RlZmluZSBVU0JfVkVORE9SX0lEX0dFTkVSQUxfVE9VQ0gJMHgwZGZjCiAKLSNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9HRU5FUklDXzEzQkEJMHgxM2JhCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfR0VORVJJQ18xM0JBX0tCRF9NT1VTRQkweDAwMTcKLQogI2RlZmluZSBVU0JfVkVORE9SX0lEX0dMQUIJCTB4MDZjMgogI2RlZmluZSBVU0JfREVWSUNFX0lEXzRfUEhJREdFVFNFUlZPXzMwCTB4MDAzOAogI2RlZmluZSBVU0JfREVWSUNFX0lEXzFfUEhJREdFVFNFUlZPXzMwCTB4MDAzOQpAQCAtMjkyLDcgKzI4NSw2IEBACiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfV0hFRUwJMHhjMjk0CiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfTU9NT19XSEVFTAkweGMyOTUKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9FTElURV9LQkQJMHhjMzBhCi0jZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfS0JECTB4YzMxMQogI2RlZmluZSBVU0JfREVWSUNFX0lEX1M1MTBfUkVDRUlWRVIJMHhjNTBjCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfUzUxMF9SRUNFSVZFUl8yCTB4YzUxNwogI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0NPUkRMRVNTX0RFU0tUT1BfTFg1MDAJMHhjNTEyCkBAIC0zMzksNiArMzMxLDkgQEAKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9ORUMJCTB4MDczZQogI2RlZmluZSBVU0JfREVWSUNFX0lEX05FQ19VU0JfR0FNRV9QQUQJMHgwMzAxCiAKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9OVFJJRyAgICAgICAgICAgICAgICAweDFiOTYKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9OVFJJR19UT1VDSF9TQ1JFRU4gICAweDAwMDEKKwogI2RlZmluZSBVU0JfVkVORE9SX0lEX09OVFJBSwkJMHgwYTA3CiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfT05UUkFLX0FEVTEwMAkweDAwNjQKIApAQCAtMzgzLDkgKzM3OCwxNSBAQAogI2RlZmluZSBVU0JfVkVORE9SX0lEX1RPUE1BWAkJMHgwNjYzCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfVE9QTUFYX0NPQlJBUEFECTB4MDEwMwogCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfVE9QU0VFRAkJMHgwNzY2CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfVE9QU0VFRF9DWUJFUkxJTksJMHgwMjA0CisKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9UVVJCT1gJCTB4MDYyYQogI2RlZmluZSBVU0JfREVWSUNFX0lEX1RVUkJPWF9LRVlCT0FSRAkweDAyMDEKIAorI2RlZmluZSBVU0JfVkVORE9SX0lEX1VDTE9HSUMJCTB4NTU0MworI2RlZmluZSBVU0JfREVWSUNFX0lEX1VDTE9HSUNfVEFCTEVUX1BGMTIwOQkweDAwNDIKKwogI2RlZmluZSBVU0JfVkVORE9SX0lEX1ZFUk5JRVIJCTB4MDhmNwogI2RlZmluZSBVU0JfREVWSUNFX0lEX1ZFUk5JRVJfTEFCUFJPCTB4MDAwMQogI2RlZmluZSBVU0JfREVWSUNFX0lEX1ZFUk5JRVJfR09URU1QCTB4MDAwMgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWxnLmMgYi9kcml2ZXJzL2hpZC9oaWQtbGcuYwppbmRleCAyYmFlMzQwLi44M2UwN2M5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtbGcuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtbGcuYwpAQCAtMjYsNyArMjYsNiBAQAogI2RlZmluZSBMR19SREVTQwkJMHgwMDEKICNkZWZpbmUgTEdfQkFEX1JFTEFUSVZFX0tFWVMJMHgwMDIKICNkZWZpbmUgTEdfRFVQTElDQVRFX1VTQUdFUwkweDAwNAotI2RlZmluZSBMR19SRVNFVF9MRURTCQkweDAwOAogI2RlZmluZSBMR19FWFBBTkRFRF9LRVlNQVAJMHgwMTAKICNkZWZpbmUgTEdfSUdOT1JFX0RPVUJMRURfV0hFRUwJMHgwMjAKICNkZWZpbmUgTEdfV0lSRUxFU1MJCTB4MDQwCkBAIC0yNDgsOSArMjQ3LDYgQEAKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKLQlpZiAocXVpcmtzICYgTEdfUkVTRVRfTEVEUykKLQkJdXNiaGlkX3NldF9sZWRzKGhkZXYpOwotCiAJaWYgKHF1aXJrcyAmIExHX0ZGKQogCQlsZ2ZmX2luaXQoaGRldik7CiAJaWYgKHF1aXJrcyAmIExHX0ZGMikKQEAgLTI3OSw5ICsyNzUsNiBAQAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9ESU5PVk9fTUlOSSksCiAJCS5kcml2ZXJfZGF0YSA9IExHX0RVUExJQ0FURV9VU0FHRVMgfSwKIAotCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9LQkQpLAotCQkuZHJpdmVyX2RhdGEgPSBMR19SRVNFVF9MRURTIH0sCi0KIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfRUxJVEVfS0JEKSwKIAkJLmRyaXZlcl9kYXRhID0gTEdfSUdOT1JFX0RPVUJMRURfV0hFRUwgfCBMR19FWFBBTkRFRF9LRVlNQVAgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfQ09SRExFU1NfREVTS1RPUF9MWDUwMCksCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtbnRyaWcuYyBiL2RyaXZlcnMvaGlkL2hpZC1udHJpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNDRmYmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC9oaWQtbnRyaWcuYwpAQCAtMCwwICsxLDgyIEBACisvKgorICogIEhJRCBkcml2ZXIgZm9yIHNvbWUgbnRyaWcgInNwZWNpYWwiIGRldmljZXMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAxOTk5IEFuZHJlYXMgR2FsCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgVm9qdGVjaCBQYXZsaWsgPHZvanRlY2hAc3VzZS5jej4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDUgTWljaGFlbCBIYWJvdXN0YWsgPG1pa2UtQGNpbmNpLnJyLmNvbT4gZm9yIENvbmNlcHQyLCBJbmMKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBKaXJpIEtvc2luYQorICogIENvcHlyaWdodCAoYykgMjAwNyBQYXVsIFdhbG1zbGV5CisgKiAgQ29weXJpZ2h0IChjKSAyMDA4IEppcmkgU2xhYnkKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDggUmFmaSBSdWJpbgorICoKKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaGlkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlICJoaWQtaWRzLmgiCisKKyNkZWZpbmUgTlRSSUdfRFVQTElDQVRFX1VTQUdFUwkweDAwMQorCisjZGVmaW5lIG50X21hcF9rZXlfY2xlYXIoYykJaGlkX21hcF91c2FnZV9jbGVhcihoaSwgdXNhZ2UsIGJpdCwgbWF4LCBcCisJCQkJCUVWX0tFWSwgKGMpKQorCitzdGF0aWMgaW50IG50cmlnX2lucHV0X21hcHBpbmcoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIHN0cnVjdCBoaWRfaW5wdXQgKmhpLAorCQlzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCwgc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsCisJCXVuc2lnbmVkIGxvbmcgKipiaXQsIGludCAqbWF4KQoreworCWlmICgodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRV9QQUdFKSA9PSBISURfVVBfRElHSVRJWkVSICYmCisJCQkodXNhZ2UtPmhpZCAmIDB4ZmYpID09IDB4NDcpIHsKKwkJbnRfbWFwX2tleV9jbGVhcihCVE5fVE9PTF9ET1VCTEVUQVApOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbnRyaWdfaW5wdXRfbWFwcGVkKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBzdHJ1Y3QgaGlkX2lucHV0ICpoaSwKKwkJc3RydWN0IGhpZF9maWVsZCAqZmllbGQsIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLAorCQl1bnNpZ25lZCBsb25nICoqYml0LCBpbnQgKm1heCkKK3sKKwlpZiAodXNhZ2UtPnR5cGUgPT0gRVZfS0VZIHx8IHVzYWdlLT50eXBlID09IEVWX1JFTAorCQkJfHwgdXNhZ2UtPnR5cGUgPT0gRVZfQUJTKQorCQljbGVhcl9iaXQodXNhZ2UtPmNvZGUsICpiaXQpOworCisJcmV0dXJuIDA7Cit9CitzdGF0aWMgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgbnRyaWdfZGV2aWNlc1tdID0geworCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9OVFJJRywgVVNCX0RFVklDRV9JRF9OVFJJR19UT1VDSF9TQ1JFRU4pLAorCQkuZHJpdmVyX2RhdGEgPSBOVFJJR19EVVBMSUNBVEVfVVNBR0VTIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShoaWQsIG50cmlnX2RldmljZXMpOworCitzdGF0aWMgc3RydWN0IGhpZF9kcml2ZXIgbnRyaWdfZHJpdmVyID0geworCS5uYW1lID0gIm50cmlnIiwKKwkuaWRfdGFibGUgPSBudHJpZ19kZXZpY2VzLAorCS5pbnB1dF9tYXBwaW5nID0gbnRyaWdfaW5wdXRfbWFwcGluZywKKwkuaW5wdXRfbWFwcGVkID0gbnRyaWdfaW5wdXRfbWFwcGVkLAorfTsKKworc3RhdGljIGludCBudHJpZ19pbml0KHZvaWQpCit7CisJcmV0dXJuIGhpZF9yZWdpc3Rlcl9kcml2ZXIoJm50cmlnX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIG50cmlnX2V4aXQodm9pZCkKK3sKKwloaWRfdW5yZWdpc3Rlcl9kcml2ZXIoJm50cmlnX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG50cmlnX2luaXQpOworbW9kdWxlX2V4aXQobnRyaWdfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK0hJRF9DT01QQVRfTE9BRF9EUklWRVIobnRyaWcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXNvbnkuYyBiL2RyaXZlcnMvaGlkL2hpZC1zb255LmMKaW5kZXggODZlNTYzYi4uZGQ1YTM5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXNvbnkuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtc29ueS5jCkBAIC0xMDIsNyArMTAyLDcgQEAKIAl9CiAKIAlyZXQgPSBzb255X3NldF9vcGVyYXRpb25hbChoZGV2KTsKLQlpZiAocmV0KQorCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycl9zdG9wOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtdG9wc2VlZC5jIGIvZHJpdmVycy9oaWQvaGlkLXRvcHNlZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2E2NGEwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9oaWQvaGlkLXRvcHNlZWQuYwpAQCAtMCwwICsxLDc3IEBACisvKgorICogIEhJRCBkcml2ZXIgZm9yIFRvcFNlZWQgQ3liZXJsaW5rIHJlbW90ZQorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDggTGV2IEJhYmlldgorICogIGJhc2VkIG9uIGhpZC1jaGVycnkgZHJpdmVyCisgKi8KKworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAiaGlkLWlkcy5oIgorCisjZGVmaW5lIHRzX21hcF9rZXlfY2xlYXIoYykJaGlkX21hcF91c2FnZV9jbGVhcihoaSwgdXNhZ2UsIGJpdCwgbWF4LCBcCisJCQkJCUVWX0tFWSwgKGMpKQorc3RhdGljIGludCB0c19pbnB1dF9tYXBwaW5nKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBzdHJ1Y3QgaGlkX2lucHV0ICpoaSwKKwkJc3RydWN0IGhpZF9maWVsZCAqZmllbGQsIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLAorCQl1bnNpZ25lZCBsb25nICoqYml0LCBpbnQgKm1heCkKK3sKKwlpZiAoKHVzYWdlLT5oaWQgJiBISURfVVNBR0VfUEFHRSkgIT0gMHgwZmZiYzAwMDApCisJCXJldHVybiAwOworCisJc3dpdGNoICh1c2FnZS0+aGlkICYgSElEX1VTQUdFKSB7CisgICAgICAgIGNhc2UgMHgwMGQ6IHRzX21hcF9rZXlfY2xlYXIoS0VZX0hPTUUpOyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwMjQ6IHRzX21hcF9rZXlfY2xlYXIoS0VZX01FTlUpOyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwMjU6IHRzX21hcF9rZXlfY2xlYXIoS0VZX1RWKTsgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwNDg6IHRzX21hcF9rZXlfY2xlYXIoS0VZX1JFRCk7ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwNDc6IHRzX21hcF9rZXlfY2xlYXIoS0VZX0dSRUVOKTsgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwNDk6IHRzX21hcF9rZXlfY2xlYXIoS0VZX1lFTExPVyk7ICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwNGE6IHRzX21hcF9rZXlfY2xlYXIoS0VZX0JMVUUpOyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwNGI6IHRzX21hcF9rZXlfY2xlYXIoS0VZX0FOR0xFKTsgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwNGM6IHRzX21hcF9rZXlfY2xlYXIoS0VZX0xBTkdVQUdFKTsgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwNGQ6IHRzX21hcF9rZXlfY2xlYXIoS0VZX1NVQlRJVExFKTsgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwMzE6IHRzX21hcF9rZXlfY2xlYXIoS0VZX0FVRElPKTsgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwMzI6IHRzX21hcF9rZXlfY2xlYXIoS0VZX1RFWFQpOyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwMzM6IHRzX21hcF9rZXlfY2xlYXIoS0VZX0NIQU5ORUwpOyAgICAgICAgYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCB0c19kZXZpY2VzW10gPSB7CisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1RPUFNFRUQsIFVTQl9ERVZJQ0VfSURfVE9QU0VFRF9DWUJFUkxJTkspIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShoaWQsIHRzX2RldmljZXMpOworCitzdGF0aWMgc3RydWN0IGhpZF9kcml2ZXIgdHNfZHJpdmVyID0geworCS5uYW1lID0gInRvcHNlZWQiLAorCS5pZF90YWJsZSA9IHRzX2RldmljZXMsCisJLmlucHV0X21hcHBpbmcgPSB0c19pbnB1dF9tYXBwaW5nLAorfTsKKworc3RhdGljIGludCB0c19pbml0KHZvaWQpCit7CisJcmV0dXJuIGhpZF9yZWdpc3Rlcl9kcml2ZXIoJnRzX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIHRzX2V4aXQodm9pZCkKK3sKKwloaWRfdW5yZWdpc3Rlcl9kcml2ZXIoJnRzX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHRzX2luaXQpOworbW9kdWxlX2V4aXQodHNfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK0hJRF9DT01QQVRfTE9BRF9EUklWRVIodG9wc2VlZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWRyYXcuYyBiL2RyaXZlcnMvaGlkL2hpZHJhdy5jCmluZGV4IDc2ODVhZTYuLjczMjQ0OTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZHJhdy5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZHJhdy5jCkBAIC0yMDgsNyArMjA4LDcgQEAKIAogCWxpc3RfZGVsKCZsaXN0LT5ub2RlKTsKIAlkZXYgPSBoaWRyYXdfdGFibGVbbWlub3JdOwotCWlmICghZGV2LT5vcGVuLS0pIHsKKwlpZiAoIS0tZGV2LT5vcGVuKSB7CiAJCWlmIChsaXN0LT5oaWRyYXctPmV4aXN0KQogCQkJZGV2LT5oaWQtPmxsX2RyaXZlci0+Y2xvc2UoZGV2LT5oaWQpOwogCQllbHNlCkBAIC0yNjUsNiArMjY1LDM0IEBACiAJCQkJYnJlYWs7CiAJCQl9CiAJCWRlZmF1bHQ6CisJCQl7CisJCQkJc3RydWN0IGhpZF9kZXZpY2UgKmhpZCA9IGRldi0+aGlkOworCQkJCWlmIChfSU9DX1RZUEUoY21kKSAhPSAnSCcgfHwgX0lPQ19ESVIoY21kKSAhPSBfSU9DX1JFQUQpCisJCQkJCXJldHVybiAtRUlOVkFMOworCisJCQkJaWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKEhJRElPQ0dSQVdOQU1FKDApKSkgeworCQkJCQlpbnQgbGVuOworCQkJCQlpZiAoIWhpZC0+bmFtZSkKKwkJCQkJCXJldHVybiAwOworCQkJCQlsZW4gPSBzdHJsZW4oaGlkLT5uYW1lKSArIDE7CisJCQkJCWlmIChsZW4gPiBfSU9DX1NJWkUoY21kKSkKKwkJCQkJCWxlbiA9IF9JT0NfU0laRShjbWQpOworCQkJCQlyZXR1cm4gY29weV90b191c2VyKHVzZXJfYXJnLCBoaWQtPm5hbWUsIGxlbikgPworCQkJCQkJLUVGQVVMVCA6IGxlbjsKKwkJCQl9CisKKwkJCQlpZiAoX0lPQ19OUihjbWQpID09IF9JT0NfTlIoSElESU9DR1JBV1BIWVMoMCkpKSB7CisJCQkJCWludCBsZW47CisJCQkJCWlmICghaGlkLT5waHlzKQorCQkJCQkJcmV0dXJuIDA7CisJCQkJCWxlbiA9IHN0cmxlbihoaWQtPnBoeXMpICsgMTsKKwkJCQkJaWYgKGxlbiA+IF9JT0NfU0laRShjbWQpKQorCQkJCQkJbGVuID0gX0lPQ19TSVpFKGNtZCk7CisJCQkJCXJldHVybiBjb3B5X3RvX3VzZXIodXNlcl9hcmcsIGhpZC0+cGh5cywgbGVuKSA/CisJCQkJCQktRUZBVUxUIDogbGVuOworCQkJCX0KKyAgICAgICAgICAgICAgICB9CisKIAkJCXJldCA9IC1FTk9UVFk7CiAJfQogCXVubG9ja19rZXJuZWwoKTsKQEAgLTMyOSw3ICszNTcsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlkZXYtPmRldiA9IGRldmljZV9jcmVhdGUoaGlkcmF3X2NsYXNzLCBOVUxMLCBNS0RFVihoaWRyYXdfbWFqb3IsIG1pbm9yKSwKKwlkZXYtPmRldiA9IGRldmljZV9jcmVhdGUoaGlkcmF3X2NsYXNzLCAmaGlkLT5kZXYsIE1LREVWKGhpZHJhd19tYWpvciwgbWlub3IpLAogCQkJCSBOVUxMLCAiJXMlZCIsICJoaWRyYXciLCBtaW5vcik7CiAKIAlpZiAoSVNfRVJSKGRldi0+ZGV2KSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvdXNiaGlkL0tjb25maWcgYi9kcml2ZXJzL2hpZC91c2JoaWQvS2NvbmZpZwppbmRleCA1ZDlhYTk1Li40ZWRiM2JlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvS2NvbmZpZworKysgYi9kcml2ZXJzL2hpZC91c2JoaWQvS2NvbmZpZwpAQCAtNDUsNyArNDUsNyBAQAogCSAgSWYgdW5zdXJlLCBzYXkgWS4KIAogbWVudSAiVVNCIEhJRCBCb290IFByb3RvY29sIGRyaXZlcnMiCi0JZGVwZW5kcyBvbiBVU0IhPW4gJiYgVVNCX0hJRCE9eQorCWRlcGVuZHMgb24gVVNCIT1uICYmIFVTQl9ISUQhPXkgJiYgRU1CRURERUQKIAogY29uZmlnIFVTQl9LQkQKIAl0cmlzdGF0ZSAiVVNCIEhJREJQIEtleWJvYXJkIChzaW1wbGUgQm9vdCkgc3VwcG9ydCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtY29yZS5jIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1jb3JlLmMKaW5kZXggNjA2MzY5ZS4uZjBhMGY3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1jb3JlLmMKKysrIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1jb3JlLmMKQEAgLTQsNyArNCw3IEBACiAgKiAgQ29weXJpZ2h0IChjKSAxOTk5IEFuZHJlYXMgR2FsCiAgKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgVm9qdGVjaCBQYXZsaWsgPHZvanRlY2hAc3VzZS5jej4KICAqICBDb3B5cmlnaHQgKGMpIDIwMDUgTWljaGFlbCBIYWJvdXN0YWsgPG1pa2UtQGNpbmNpLnJyLmNvbT4gZm9yIENvbmNlcHQyLCBJbmMKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBKaXJpIEtvc2luYQorICogIENvcHlyaWdodCAoYykgMjAwNi0yMDA4IEppcmkgS29zaW5hCiAgKi8KIAogLyoKQEAgLTEwMiw3ICsxMDIsNyBAQAogCXN0cnVjdCB1c2JoaWRfZGV2aWNlICp1c2JoaWQgPQogCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHVzYmhpZF9kZXZpY2UsIHJlc2V0X3dvcmspOwogCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSB1c2JoaWQtPmhpZDsKLQlpbnQgcmNfbG9jaywgcmMgPSAwOworCWludCByYyA9IDA7CiAKIAlpZiAodGVzdF9iaXQoSElEX0NMRUFSX0hBTFQsICZ1c2JoaWQtPmlvZmwpKSB7CiAJCWRldl9kYmcoJnVzYmhpZC0+aW50Zi0+ZGV2LCAiY2xlYXIgaGFsdFxuIik7CkBAIC0xMTMsMTEgKzExMywxMCBAQAogCiAJZWxzZSBpZiAodGVzdF9iaXQoSElEX1JFU0VUX1BFTkRJTkcsICZ1c2JoaWQtPmlvZmwpKSB7CiAJCWRldl9kYmcoJnVzYmhpZC0+aW50Zi0+ZGV2LCAicmVzZXR0aW5nIGRldmljZVxuIik7Ci0JCXJjID0gcmNfbG9jayA9IHVzYl9sb2NrX2RldmljZV9mb3JfcmVzZXQoaGlkX3RvX3VzYl9kZXYoaGlkKSwgdXNiaGlkLT5pbnRmKTsKLQkJaWYgKHJjX2xvY2sgPj0gMCkgeworCQlyYyA9IHVzYl9sb2NrX2RldmljZV9mb3JfcmVzZXQoaGlkX3RvX3VzYl9kZXYoaGlkKSwgdXNiaGlkLT5pbnRmKTsKKwkJaWYgKHJjID09IDApIHsKIAkJCXJjID0gdXNiX3Jlc2V0X2RldmljZShoaWRfdG9fdXNiX2RldihoaWQpKTsKLQkJCWlmIChyY19sb2NrKQotCQkJCXVzYl91bmxvY2tfZGV2aWNlKGhpZF90b191c2JfZGV2KGhpZCkpOworCQkJdXNiX3VubG9ja19kZXZpY2UoaGlkX3RvX3VzYl9kZXYoaGlkKSk7CiAJCX0KIAkJY2xlYXJfYml0KEhJRF9SRVNFVF9QRU5ESU5HLCAmdXNiaGlkLT5pb2ZsKTsKIAl9CkBAIC02NDEsOSArNjQwLDcgQEAKIAl1bnNpZ25lZCBpbnQgc2l6ZTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkocmVwb3J0LCAmaGlkLT5yZXBvcnRfZW51bVt0eXBlXS5yZXBvcnRfbGlzdCwgbGlzdCkgewotCQlzaXplID0gKChyZXBvcnQtPnNpemUgLSAxKSA+PiAzKSArIDE7Ci0JCWlmICh0eXBlID09IEhJRF9JTlBVVF9SRVBPUlQgJiYgaGlkLT5yZXBvcnRfZW51bVt0eXBlXS5udW1iZXJlZCkKLQkJCXNpemUrKzsKKwkJc2l6ZSA9ICgocmVwb3J0LT5zaXplIC0gMSkgPj4gMykgKyAxICsgaGlkLT5yZXBvcnRfZW51bVt0eXBlXS5udW1iZXJlZDsKIAkJaWYgKCptYXggPCBzaXplKQogCQkJKm1heCA9IHNpemU7CiAJfQpAQCAtNjUzLDEzICs2NTAsMTYgQEAKIHsKIAlzdHJ1Y3QgdXNiaGlkX2RldmljZSAqdXNiaGlkID0gaGlkLT5kcml2ZXJfZGF0YTsKIAotCWlmICghKHVzYmhpZC0+aW5idWYgPSB1c2JfYnVmZmVyX2FsbG9jKGRldiwgdXNiaGlkLT5idWZzaXplLCBHRlBfQVRPTUlDLCAmdXNiaGlkLT5pbmJ1Zl9kbWEpKSkKLQkJcmV0dXJuIC0xOwotCWlmICghKHVzYmhpZC0+b3V0YnVmID0gdXNiX2J1ZmZlcl9hbGxvYyhkZXYsIHVzYmhpZC0+YnVmc2l6ZSwgR0ZQX0FUT01JQywgJnVzYmhpZC0+b3V0YnVmX2RtYSkpKQotCQlyZXR1cm4gLTE7Ci0JaWYgKCEodXNiaGlkLT5jciA9IHVzYl9idWZmZXJfYWxsb2MoZGV2LCBzaXplb2YoKih1c2JoaWQtPmNyKSksIEdGUF9BVE9NSUMsICZ1c2JoaWQtPmNyX2RtYSkpKQotCQlyZXR1cm4gLTE7Ci0JaWYgKCEodXNiaGlkLT5jdHJsYnVmID0gdXNiX2J1ZmZlcl9hbGxvYyhkZXYsIHVzYmhpZC0+YnVmc2l6ZSwgR0ZQX0FUT01JQywgJnVzYmhpZC0+Y3RybGJ1Zl9kbWEpKSkKKwl1c2JoaWQtPmluYnVmID0gdXNiX2J1ZmZlcl9hbGxvYyhkZXYsIHVzYmhpZC0+YnVmc2l6ZSwgR0ZQX0tFUk5FTCwKKwkJCSZ1c2JoaWQtPmluYnVmX2RtYSk7CisJdXNiaGlkLT5vdXRidWYgPSB1c2JfYnVmZmVyX2FsbG9jKGRldiwgdXNiaGlkLT5idWZzaXplLCBHRlBfS0VSTkVMLAorCQkJJnVzYmhpZC0+b3V0YnVmX2RtYSk7CisJdXNiaGlkLT5jciA9IHVzYl9idWZmZXJfYWxsb2MoZGV2LCBzaXplb2YoKnVzYmhpZC0+Y3IpLCBHRlBfS0VSTkVMLAorCQkJJnVzYmhpZC0+Y3JfZG1hKTsKKwl1c2JoaWQtPmN0cmxidWYgPSB1c2JfYnVmZmVyX2FsbG9jKGRldiwgdXNiaGlkLT5idWZzaXplLCBHRlBfS0VSTkVMLAorCQkJJnVzYmhpZC0+Y3RybGJ1Zl9kbWEpOworCWlmICghdXNiaGlkLT5pbmJ1ZiB8fCAhdXNiaGlkLT5vdXRidWYgfHwgIXVzYmhpZC0+Y3IgfHwKKwkJCSF1c2JoaWQtPmN0cmxidWYpCiAJCXJldHVybiAtMTsKIAogCXJldHVybiAwOwpAQCAtODA3LDcgKzgwNyw3IEBACiAJCWludCBpbnRlcnZhbDsKIAogCQllbmRwb2ludCA9ICZpbnRlcmZhY2UtPmVuZHBvaW50W25dLmRlc2M7Ci0JCWlmICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIDMpICE9IDMpCQkvKiBOb3QgYW4gaW50ZXJydXB0IGVuZHBvaW50ICovCisJCWlmICghdXNiX2VuZHBvaW50X3hmZXJfaW50KGVuZHBvaW50KSkKIAkJCWNvbnRpbnVlOwogCiAJCWludGVydmFsID0gZW5kcG9pbnQtPmJJbnRlcnZhbDsKQEAgLTg3Niw2ICs4NzYsMTUgQEAKIAogCXNldF9iaXQoSElEX1NUQVJURUQsICZ1c2JoaWQtPmlvZmwpOwogCisJLyogU29tZSBrZXlib2FyZHMgZG9uJ3Qgd29yayB1bnRpbCB0aGVpciBMRURzIGhhdmUgYmVlbiBzZXQuCisJICogU2luY2UgQklPU2VzIGRvIHNldCB0aGUgTEVEcywgaXQgbXVzdCBiZSBzYWZlIGZvciBhbnkgZGV2aWNlCisJICogdGhhdCBzdXBwb3J0cyB0aGUga2V5Ym9hcmQgYm9vdCBwcm90b2NvbC4KKwkgKi8KKwlpZiAoaW50ZXJmYWNlLT5kZXNjLmJJbnRlcmZhY2VTdWJDbGFzcyA9PSBVU0JfSU5URVJGQUNFX1NVQkNMQVNTX0JPT1QgJiYKKwkJCWludGVyZmFjZS0+ZGVzYy5iSW50ZXJmYWNlUHJvdG9jb2wgPT0KKwkJCQlVU0JfSU5URVJGQUNFX1BST1RPQ09MX0tFWUJPQVJEKQorCQl1c2JoaWRfc2V0X2xlZHMoaGlkKTsKKwogCXJldHVybiAwOwogCiBmYWlsOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1xdWlya3MuYyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtcXVpcmtzLmMKaW5kZXggNDdlYmUwNC4uNDM5MTcxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1xdWlya3MuYworKysgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXF1aXJrcy5jCkBAIC01NCw2ICs1NCw3IEBACiAJeyBVU0JfVkVORE9SX0lEX0VMTywgVVNCX0RFVklDRV9JRF9FTE9fVFMyNzAwLCBISURfUVVJUktfTk9HRVQgfSwKIAl7IFVTQl9WRU5ET1JfSURfU1VOLCBVU0JfREVWSUNFX0lEX1JBUklUQU5fS1ZNX0RPTkdMRSwgSElEX1FVSVJLX05PR0VUIH0sCiAJeyBVU0JfVkVORE9SX0lEX1RVUkJPWCwgVVNCX0RFVklDRV9JRF9UVVJCT1hfS0VZQk9BUkQsIEhJRF9RVUlSS19OT0dFVCB9LAorCXsgVVNCX1ZFTkRPUl9JRF9VQ0xPR0lDLCBVU0JfREVWSUNFX0lEX1VDTE9HSUNfVEFCTEVUX1BGMTIwOSwgSElEX1FVSVJLX01VTFRJX0lOUFVUIH0sCiAJeyBVU0JfVkVORE9SX0lEX1dJU0VHUk9VUCwgVVNCX0RFVklDRV9JRF9EVUFMX1VTQl9KT1lQQUQsIEhJRF9RVUlSS19OT0dFVCB8IEhJRF9RVUlSS19NVUxUSV9JTlBVVCB8IEhJRF9RVUlSS19TS0lQX09VVFBVVF9SRVBPUlRTIH0sCiAJeyBVU0JfVkVORE9SX0lEX1dJU0VHUk9VUCwgVVNCX0RFVklDRV9JRF9RVUFEX1VTQl9KT1lQQUQsIEhJRF9RVUlSS19OT0dFVCB8IEhJRF9RVUlSS19NVUxUSV9JTlBVVCB9LAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkZGV2LmMgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkZGV2LmMKaW5kZXggODNlODUxYS4uZDczZWVhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZGRldi5jCisrKyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWRkZXYuYwpAQCAtNDksNiArNDksNyBAQAogc3RydWN0IGhpZGRldiB7CiAJaW50IGV4aXN0OwogCWludCBvcGVuOworCXN0cnVjdCBtdXRleCBleGlzdGFuY2Vsb2NrOwogCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CiAJc3RydWN0IGhpZF9kZXZpY2UgKmhpZDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CkBAIC02Myw2ICs2NCw3IEBACiAJc3RydWN0IGZhc3luY19zdHJ1Y3QgKmZhc3luYzsKIAlzdHJ1Y3QgaGlkZGV2ICpoaWRkZXY7CiAJc3RydWN0IGxpc3RfaGVhZCBub2RlOworCXN0cnVjdCBtdXRleCB0aHJlYWRfbG9jazsKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaGlkZGV2ICpoaWRkZXZfdGFibGVbSElEREVWX01JTk9SU107CkBAIC0yNjQsMjkgKzI2Niw0OCBAQAogc3RhdGljIGludCBoaWRkZXZfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3QgaGlkZGV2X2xpc3QgKmxpc3Q7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmVzOwogCiAJaW50IGkgPSBpbWlub3IoaW5vZGUpIC0gSElEREVWX01JTk9SX0JBU0U7CiAKLQlpZiAoaSA+PSBISURERVZfTUlOT1JTIHx8ICFoaWRkZXZfdGFibGVbaV0pCisJaWYgKGkgPj0gSElEREVWX01JTk9SUyB8fCBpIDwgMCB8fCAhaGlkZGV2X3RhYmxlW2ldKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmICghKGxpc3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaGlkZGV2X2xpc3QpLCBHRlBfS0VSTkVMKSkpCiAJCXJldHVybiAtRU5PTUVNOworCW11dGV4X2luaXQoJmxpc3QtPnRocmVhZF9sb2NrKTsKIAogCWxpc3QtPmhpZGRldiA9IGhpZGRldl90YWJsZVtpXTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZsaXN0LT5oaWRkZXYtPmxpc3RfbG9jaywgZmxhZ3MpOwotCWxpc3RfYWRkX3RhaWwoJmxpc3QtPm5vZGUsICZoaWRkZXZfdGFibGVbaV0tPmxpc3QpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxpc3QtPmhpZGRldi0+bGlzdF9sb2NrLCBmbGFncyk7CiAKIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBsaXN0OwogCi0JaWYgKCFsaXN0LT5oaWRkZXYtPm9wZW4rKykKLQkJaWYgKGxpc3QtPmhpZGRldi0+ZXhpc3QpCi0JCQl1c2JoaWRfb3BlbihoaWRkZXZfdGFibGVbaV0tPmhpZCk7CisJLyoKKwkgKiBubyBuZWVkIGZvciBsb2NraW5nIGJlY2F1c2UgdGhlIFVTQiBtYWpvciBudW1iZXIKKwkgKiBpcyBzaGFyZWQgd2hpY2ggdXNiY29yZSBndWFyZHMgYWdhaW5zdCBkaXNjb25uZWN0CisJICovCisJaWYgKGxpc3QtPmhpZGRldi0+ZXhpc3QpIHsKKwkJaWYgKCFsaXN0LT5oaWRkZXYtPm9wZW4rKykgeworCQkJcmVzID0gdXNiaGlkX29wZW4oaGlkZGV2X3RhYmxlW2ldLT5oaWQpOworCQkJaWYgKHJlcyA8IDApIHsKKwkJCQlyZXMgPSAtRUlPOworCQkJCWdvdG8gYmFpbDsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXJlcyA9IC1FTk9ERVY7CisJCWdvdG8gYmFpbDsKKwl9CisKKwlzcGluX2xvY2tfaXJxKCZsaXN0LT5oaWRkZXYtPmxpc3RfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmbGlzdC0+bm9kZSwgJmhpZGRldl90YWJsZVtpXS0+bGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxKCZsaXN0LT5oaWRkZXYtPmxpc3RfbG9jayk7CiAKIAlyZXR1cm4gMDsKK2JhaWw6CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwlrZnJlZShsaXN0LT5oaWRkZXYpOworCXJldHVybiByZXM7CiB9CiAKIC8qCkBAIC0zMDUsNyArMzI2LDcgQEAKIAlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKIAlzdHJ1Y3QgaGlkZGV2X2xpc3QgKmxpc3QgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJaW50IGV2ZW50X3NpemU7Ci0JaW50IHJldHZhbCA9IDA7CisJaW50IHJldHZhbDsKIAogCWV2ZW50X3NpemUgPSAoKGxpc3QtPmZsYWdzICYgSElEREVWX0ZMQUdfVVJFRikgIT0gMCkgPwogCQlzaXplb2Yoc3RydWN0IGhpZGRldl91c2FnZV9yZWYpIDogc2l6ZW9mKHN0cnVjdCBoaWRkZXZfZXZlbnQpOwpAQCAtMzEzLDEwICszMzQsMTQgQEAKIAlpZiAoY291bnQgPCBldmVudF9zaXplKQogCQlyZXR1cm4gMDsKIAorCS8qIGxvY2sgYWdhaW5zdCBvdGhlciB0aHJlYWRzICovCisJcmV0dmFsID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZsaXN0LT50aHJlYWRfbG9jayk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwogCXdoaWxlIChyZXR2YWwgPT0gMCkgewogCQlpZiAobGlzdC0+aGVhZCA9PSBsaXN0LT50YWlsKSB7Ci0JCQlhZGRfd2FpdF9xdWV1ZSgmbGlzdC0+aGlkZGV2LT53YWl0LCAmd2FpdCk7Ci0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJcHJlcGFyZV90b193YWl0KCZsaXN0LT5oaWRkZXYtPndhaXQsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOwogCiAJCQl3aGlsZSAobGlzdC0+aGVhZCA9PSBsaXN0LT50YWlsKSB7CiAJCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CkBAIC0zMzIsMzUgKzM1Nyw0NSBAQAogCQkJCQlicmVhazsKIAkJCQl9CiAKKwkJCQkvKiBsZXQgT19OT05CTE9DSyB0YXNrcyBydW4gKi8KKwkJCQltdXRleF91bmxvY2soJmxpc3QtPnRocmVhZF9sb2NrKTsKIAkJCQlzY2hlZHVsZSgpOworCQkJCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmxpc3QtPnRocmVhZF9sb2NrKSkKKwkJCQkJcmV0dXJuIC1FSU5UUjsKIAkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCQkJfQorCQkJZmluaXNoX3dhaXQoJmxpc3QtPmhpZGRldi0+d2FpdCwgJndhaXQpOwogCi0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmxpc3QtPmhpZGRldi0+d2FpdCwgJndhaXQpOwogCQl9CiAKLQkJaWYgKHJldHZhbCkKKwkJaWYgKHJldHZhbCkgeworCQkJbXV0ZXhfdW5sb2NrKCZsaXN0LT50aHJlYWRfbG9jayk7CiAJCQlyZXR1cm4gcmV0dmFsOworCQl9CiAKIAogCQl3aGlsZSAobGlzdC0+aGVhZCAhPSBsaXN0LT50YWlsICYmCiAJCSAgICAgICByZXR2YWwgKyBldmVudF9zaXplIDw9IGNvdW50KSB7CiAJCQlpZiAoKGxpc3QtPmZsYWdzICYgSElEREVWX0ZMQUdfVVJFRikgPT0gMCkgewotCQkJCWlmIChsaXN0LT5idWZmZXJbbGlzdC0+dGFpbF0uZmllbGRfaW5kZXggIT0KLQkJCQkgICAgSElEX0ZJRUxEX0lOREVYX05PTkUpIHsKKwkJCQlpZiAobGlzdC0+YnVmZmVyW2xpc3QtPnRhaWxdLmZpZWxkX2luZGV4ICE9IEhJRF9GSUVMRF9JTkRFWF9OT05FKSB7CiAJCQkJCXN0cnVjdCBoaWRkZXZfZXZlbnQgZXZlbnQ7CisKIAkJCQkJZXZlbnQuaGlkID0gbGlzdC0+YnVmZmVyW2xpc3QtPnRhaWxdLnVzYWdlX2NvZGU7CiAJCQkJCWV2ZW50LnZhbHVlID0gbGlzdC0+YnVmZmVyW2xpc3QtPnRhaWxdLnZhbHVlOwotCQkJCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciArIHJldHZhbCwgJmV2ZW50LCBzaXplb2Yoc3RydWN0IGhpZGRldl9ldmVudCkpKQorCQkJCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciArIHJldHZhbCwgJmV2ZW50LCBzaXplb2Yoc3RydWN0IGhpZGRldl9ldmVudCkpKSB7CisJCQkJCQltdXRleF91bmxvY2soJmxpc3QtPnRocmVhZF9sb2NrKTsKIAkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQl9CiAJCQkJCXJldHZhbCArPSBzaXplb2Yoc3RydWN0IGhpZGRldl9ldmVudCk7CiAJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQlpZiAobGlzdC0+YnVmZmVyW2xpc3QtPnRhaWxdLmZpZWxkX2luZGV4ICE9IEhJRF9GSUVMRF9JTkRFWF9OT05FIHx8CiAJCQkJICAgIChsaXN0LT5mbGFncyAmIEhJRERFVl9GTEFHX1JFUE9SVCkgIT0gMCkgewotCQkJCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciArIHJldHZhbCwgbGlzdC0+YnVmZmVyICsgbGlzdC0+dGFpbCwgc2l6ZW9mKHN0cnVjdCBoaWRkZXZfdXNhZ2VfcmVmKSkpCisKKwkJCQkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIgKyByZXR2YWwsIGxpc3QtPmJ1ZmZlciArIGxpc3QtPnRhaWwsIHNpemVvZihzdHJ1Y3QgaGlkZGV2X3VzYWdlX3JlZikpKSB7CisJCQkJCQltdXRleF91bmxvY2soJmxpc3QtPnRocmVhZF9sb2NrKTsKIAkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQl9CiAJCQkJCXJldHZhbCArPSBzaXplb2Yoc3RydWN0IGhpZGRldl91c2FnZV9yZWYpOwogCQkJCX0KIAkJCX0KQEAgLTM2OCw2ICs0MDMsNyBAQAogCQl9CiAKIAl9CisJbXV0ZXhfdW5sb2NrKCZsaXN0LT50aHJlYWRfbG9jayk7CiAKIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtNTU1LDcgKzU5MSw3IEBACiAJc3RydWN0IGhpZF9maWVsZCAqZmllbGQ7CiAJc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7CiAJdm9pZCBfX3VzZXIgKnVzZXJfYXJnID0gKHZvaWQgX191c2VyICopYXJnOwotCWludCBpOworCWludCBpLCByOwogCQogCS8qIENhbGxlZCB3aXRob3V0IEJLTCBieSBjb21wYXQgbWV0aG9kcyBzbyBubyBCS0wgdGFrZW4gKi8KIApAQCAtNjE5LDEwICs2NTUsMjIgQEAKIAkJfQogCiAJY2FzZSBISURJT0NHU1RSSU5HOgotCQlyZXR1cm4gaGlkZGV2X2lvY3RsX3N0cmluZyhoaWRkZXYsIGNtZCwgdXNlcl9hcmcpOworCQltdXRleF9sb2NrKCZoaWRkZXYtPmV4aXN0YW5jZWxvY2spOworCQlpZiAoIWhpZGRldi0+ZXhpc3QpCisJCQlyID0gaGlkZGV2X2lvY3RsX3N0cmluZyhoaWRkZXYsIGNtZCwgdXNlcl9hcmcpOworCQllbHNlCisJCQlyID0gLUVOT0RFVjsKKwkJbXV0ZXhfdW5sb2NrKCZoaWRkZXYtPmV4aXN0YW5jZWxvY2spOworCQlyZXR1cm4gcjsKIAogCWNhc2UgSElESU9DSU5JVFJFUE9SVDoKKwkJbXV0ZXhfbG9jaygmaGlkZGV2LT5leGlzdGFuY2Vsb2NrKTsKKwkJaWYgKCFoaWRkZXYtPmV4aXN0KSB7CisJCQltdXRleF91bmxvY2soJmhpZGRldi0+ZXhpc3RhbmNlbG9jayk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQogCQl1c2JoaWRfaW5pdF9yZXBvcnRzKGhpZCk7CisJCW11dGV4X3VubG9jaygmaGlkZGV2LT5leGlzdGFuY2Vsb2NrKTsKIAogCQlyZXR1cm4gMDsKIApAQCAtNjM2LDggKzY4NCwxMiBAQAogCQlpZiAoKHJlcG9ydCA9IGhpZGRldl9sb29rdXBfcmVwb3J0KGhpZCwgJnJpbmZvKSkgPT0gTlVMTCkKIAkJCXJldHVybiAtRUlOVkFMOwogCi0JCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgcmVwb3J0LCBVU0JfRElSX0lOKTsKLQkJdXNiaGlkX3dhaXRfaW8oaGlkKTsKKwkJbXV0ZXhfbG9jaygmaGlkZGV2LT5leGlzdGFuY2Vsb2NrKTsKKwkJaWYgKGhpZGRldi0+ZXhpc3QpIHsKKwkJCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgcmVwb3J0LCBVU0JfRElSX0lOKTsKKwkJCXVzYmhpZF93YWl0X2lvKGhpZCk7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZoaWRkZXYtPmV4aXN0YW5jZWxvY2spOwogCiAJCXJldHVybiAwOwogCkBAIC02NTEsOCArNzAzLDEyIEBACiAJCWlmICgocmVwb3J0ID0gaGlkZGV2X2xvb2t1cF9yZXBvcnQoaGlkLCAmcmluZm8pKSA9PSBOVUxMKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJdXNiaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCByZXBvcnQsIFVTQl9ESVJfT1VUKTsKLQkJdXNiaGlkX3dhaXRfaW8oaGlkKTsKKwkJbXV0ZXhfbG9jaygmaGlkZGV2LT5leGlzdGFuY2Vsb2NrKTsKKwkJaWYgKGhpZGRldi0+ZXhpc3QpIHsKKwkJCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgcmVwb3J0LCBVU0JfRElSX09VVCk7CisJCQl1c2JoaWRfd2FpdF9pbyhoaWQpOworCQl9CisJCW11dGV4X3VubG9jaygmaGlkZGV2LT5leGlzdGFuY2Vsb2NrKTsKIAogCQlyZXR1cm4gMDsKIApAQCAtNzEwLDcgKzc2NiwxMyBAQAogCWNhc2UgSElESU9DR1VTQUdFUzoKIAljYXNlIEhJRElPQ1NVU0FHRVM6CiAJY2FzZSBISURJT0NHQ09MTEVDVElPTklOREVYOgotCQlyZXR1cm4gaGlkZGV2X2lvY3RsX3VzYWdlKGhpZGRldiwgY21kLCB1c2VyX2FyZyk7CisJCW11dGV4X2xvY2soJmhpZGRldi0+ZXhpc3RhbmNlbG9jayk7CisJCWlmIChoaWRkZXYtPmV4aXN0KQorCQkJciA9IGhpZGRldl9pb2N0bF91c2FnZShoaWRkZXYsIGNtZCwgdXNlcl9hcmcpOworCQllbHNlCisJCQlyID0gLUVOT0RFVjsKKwkJbXV0ZXhfdW5sb2NrKCZoaWRkZXYtPmV4aXN0YW5jZWxvY2spOworCQlyZXR1cm4gcjsKIAogCWNhc2UgSElESU9DR0NPTExFQ1RJT05JTkZPOgogCQlpZiAoY29weV9mcm9tX3VzZXIoJmNpbmZvLCB1c2VyX2FyZywgc2l6ZW9mKGNpbmZvKSkpCkBAIC04MDgsMjMgKzg3MCwyNCBAQAogCWlmICghKGhpZGRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBoaWRkZXYpLCBHRlBfS0VSTkVMKSkpCiAJCXJldHVybiAtMTsKIAotCXJldHZhbCA9IHVzYl9yZWdpc3Rlcl9kZXYodXNiaGlkLT5pbnRmLCAmaGlkZGV2X2NsYXNzKTsKLQlpZiAocmV0dmFsKSB7Ci0JCWVycl9oaWQoIk5vdCBhYmxlIHRvIGdldCBhIG1pbm9yIGZvciB0aGlzIGRldmljZS4iKTsKLQkJa2ZyZWUoaGlkZGV2KTsKLQkJcmV0dXJuIC0xOwotCX0KLQogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmhpZGRldi0+d2FpdCk7CiAJSU5JVF9MSVNUX0hFQUQoJmhpZGRldi0+bGlzdCk7CiAJc3Bpbl9sb2NrX2luaXQoJmhpZGRldi0+bGlzdF9sb2NrKTsKKwltdXRleF9pbml0KCZoaWRkZXYtPmV4aXN0YW5jZWxvY2spOworCWhpZC0+aGlkZGV2ID0gaGlkZGV2OwogCWhpZGRldi0+aGlkID0gaGlkOwogCWhpZGRldi0+ZXhpc3QgPSAxOwogCi0JaGlkLT5taW5vciA9IHVzYmhpZC0+aW50Zi0+bWlub3I7Ci0JaGlkLT5oaWRkZXYgPSBoaWRkZXY7Ci0KLQloaWRkZXZfdGFibGVbdXNiaGlkLT5pbnRmLT5taW5vciAtIEhJRERFVl9NSU5PUl9CQVNFXSA9IGhpZGRldjsKKwlyZXR2YWwgPSB1c2JfcmVnaXN0ZXJfZGV2KHVzYmhpZC0+aW50ZiwgJmhpZGRldl9jbGFzcyk7CisJaWYgKHJldHZhbCkgeworCQllcnJfaGlkKCJOb3QgYWJsZSB0byBnZXQgYSBtaW5vciBmb3IgdGhpcyBkZXZpY2UuIik7CisJCWhpZC0+aGlkZGV2ID0gTlVMTDsKKwkJa2ZyZWUoaGlkZGV2KTsKKwkJcmV0dXJuIC0xOworCX0gZWxzZSB7CisJCWhpZC0+bWlub3IgPSB1c2JoaWQtPmludGYtPm1pbm9yOworCQloaWRkZXZfdGFibGVbdXNiaGlkLT5pbnRmLT5taW5vciAtIEhJRERFVl9NSU5PUl9CQVNFXSA9IGhpZGRldjsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTgzOSw3ICs5MDIsOSBAQAogCXN0cnVjdCBoaWRkZXYgKmhpZGRldiA9IGhpZC0+aGlkZGV2OwogCXN0cnVjdCB1c2JoaWRfZGV2aWNlICp1c2JoaWQgPSBoaWQtPmRyaXZlcl9kYXRhOwogCisJbXV0ZXhfbG9jaygmaGlkZGV2LT5leGlzdGFuY2Vsb2NrKTsKIAloaWRkZXYtPmV4aXN0ID0gMDsKKwltdXRleF91bmxvY2soJmhpZGRldi0+ZXhpc3RhbmNlbG9jayk7CiAKIAloaWRkZXZfdGFibGVbaGlkZGV2LT5oaWQtPm1pbm9yIC0gSElEREVWX01JTk9SX0JBU0VdID0gTlVMTDsKIAl1c2JfZGVyZWdpc3Rlcl9kZXYodXNiaGlkLT5pbnRmLCAmaGlkZGV2X2NsYXNzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL3VzYmhpZC91c2JoaWQuaCBiL2RyaXZlcnMvaGlkL3VzYmhpZC91c2JoaWQuaAppbmRleCAzMzJhYmNkLi45ZWIzMDU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvdXNiaGlkLmgKKysrIGIvZHJpdmVycy9oaWQvdXNiaGlkL3VzYmhpZC5oCkBAIC00MCw2ICs0MCwxNiBAQAogdm9pZCB1c2JoaWRfaW5pdF9yZXBvcnRzKHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpOwogdm9pZCB1c2JoaWRfc3VibWl0X3JlcG9ydChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkLCBzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0LCB1bnNpZ25lZCBjaGFyIGRpcik7CiAKKy8qIGlvZmwgZmxhZ3MgKi8KKyNkZWZpbmUgSElEX0NUUkxfUlVOTklORwkxCisjZGVmaW5lIEhJRF9PVVRfUlVOTklORwkJMgorI2RlZmluZSBISURfSU5fUlVOTklORwkJMworI2RlZmluZSBISURfUkVTRVRfUEVORElORwk0CisjZGVmaW5lIEhJRF9TVVNQRU5ERUQJCTUKKyNkZWZpbmUgSElEX0NMRUFSX0hBTFQJCTYKKyNkZWZpbmUgSElEX0RJU0NPTk5FQ1RFRAk3CisjZGVmaW5lIEhJRF9TVEFSVEVECQk4CisKIC8qCiAgKiBVU0Itc3BlY2lmaWMgSElEIHN0cnVjdCwgdG8gYmUgcG9pbnRlZCB0bwogICogZnJvbSBzdHJ1Y3QgaGlkX2RldmljZS0+ZHJpdmVyX2RhdGEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vS2NvbmZpZyBiL2RyaXZlcnMvaHdtb24vS2NvbmZpZwppbmRleCBjNzA5ZTgyLi40YjMzYmM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL0tjb25maWcKKysrIGIvZHJpdmVycy9od21vbi9LY29uZmlnCkBAIC0yODQsMTEgKzI4NCwxMiBAQAogCSAgd2lsbCBiZSBjYWxsZWQgZjcxODA1Zi4KIAogY29uZmlnIFNFTlNPUlNfRjcxODgyRkcKLQl0cmlzdGF0ZSAiRmludGVrIEY3MTg4MkZHIGFuZCBGNzE4ODNGRyIKKwl0cmlzdGF0ZSAiRmludGVrIEY3MTg2MkZHLCBGNzE4ODJGRyBhbmQgRjgwMDAiCiAJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgaGFyZHdhcmUgbW9uaXRvcmluZwotCSAgZmVhdHVyZXMgb2YgdGhlIEZpbnRlayBGNzE4ODJGRyBhbmQgRjcxODgzRkcgU3VwZXItSS9PIGNoaXBzLgorCSAgZmVhdHVyZXMgb2YgdGhlIEZpbnRlayBGNzE4ODJGRy9GNzE4ODNGRywgRjcxODYyRkcvNzE4NjNGRworCSAgYW5kIEY4MDAwIFN1cGVyLUkvTyBjaGlwcy4KIAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgZjcxODgyZmcuCkBAIC0zMDQsOSArMzA1LDEzIEBACiAJICB3aWxsIGJlIGNhbGxlZCBmNzUzNzVzLgogCiBjb25maWcgU0VOU09SU19GU0NIRVIKLQl0cmlzdGF0ZSAiRlNDIEhlcm1lcyIKKwl0cmlzdGF0ZSAiRlNDIEhlcm1lcyAoREVQUkVDQVRFRCkiCiAJZGVwZW5kcyBvbiBYODYgJiYgSTJDCiAJaGVscAorCSAgVGhpcyBkcml2ZXIgaXMgREVQUkVDQVRFRCBwbGVhc2UgdXNlIHRoZSBuZXcgbWVyZ2VkIGZzY2htZAorCSAgKCJGU0MgUG9zZWlkb24sIFNjeWxsYSwgSGVybWVzLCBIZWltZGFsbCBhbmQgSGVyYWNsZXMiKSBkcml2ZXIKKwkgIGluc3RlYWQuCisKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBGdWppdHN1IFNpZW1lbnMKIAkgIENvbXB1dGVycyBIZXJtZXMgc2Vuc29yIGNoaXBzLgogCkBAIC0zMTQsOSArMzE5LDEzIEBACiAJICB3aWxsIGJlIGNhbGxlZCBmc2NoZXIuCiAKIGNvbmZpZyBTRU5TT1JTX0ZTQ1BPUwotCXRyaXN0YXRlICJGU0MgUG9zZWlkb24iCisJdHJpc3RhdGUgIkZTQyBQb3NlaWRvbiAoREVQUkVDQVRFRCkiCiAJZGVwZW5kcyBvbiBYODYgJiYgSTJDCiAJaGVscAorCSAgVGhpcyBkcml2ZXIgaXMgREVQUkVDQVRFRCBwbGVhc2UgdXNlIHRoZSBuZXcgbWVyZ2VkIGZzY2htZAorCSAgKCJGU0MgUG9zZWlkb24sIFNjeWxsYSwgSGVybWVzLCBIZWltZGFsbCBhbmQgSGVyYWNsZXMiKSBkcml2ZXIKKwkgIGluc3RlYWQuCisKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBGdWppdHN1IFNpZW1lbnMKIAkgIENvbXB1dGVycyBQb3NlaWRvbiBzZW5zb3IgY2hpcHMuCiAKQEAgLTMyNSwxNCArMzM0LDE1IEBACiAKIGNvbmZpZyBTRU5TT1JTX0ZTQ0hNRAogCXRyaXN0YXRlICJGU0MgUG9zZWlkb24sIFNjeWxsYSwgSGVybWVzLCBIZWltZGFsbCBhbmQgSGVyYWNsZXMiCi0JZGVwZW5kcyBvbiBYODYgJiYgSTJDICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gWDg2ICYmIEkyQwogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB2YXJpb3VzIEZ1aml0c3UgU2llbWVucwotCSAgQ29tcHV0ZXJzIHNlbnNvciBjaGlwcy4KKwkgIENvbXB1dGVycyBzZW5zb3IgY2hpcHMsIGluY2x1ZGluZyBzdXBwb3J0IGZvciB0aGUgaW50ZWdyYXRlZAorCSAgd2F0Y2hkb2cuCiAKLQkgIFRoaXMgaXMgYSBuZXcgbWVyZ2VkIGRyaXZlciBmb3IgRlNDIHNlbnNvciBjaGlwcyB3aGljaCBpcyBpbnRlbmRlZAotCSAgYXMgYSByZXBsYWNtZW50IGZvciB0aGUgZnNjcG9zLCBmc2NzY3kgYW5kIGZzY2hlciBkcml2ZXJzIGFuZCBhZGRzCi0JICBzdXBwb3J0IGZvciBzZXZlcmFsIG90aGVyIEZDUyBzZW5zb3IgY2hpcHMuCisJICBUaGlzIGlzIGEgbWVyZ2VkIGRyaXZlciBmb3IgRlNDIHNlbnNvciBjaGlwcyByZXBsYWNpbmcgdGhlIGZzY3BvcywKKwkgIGZzY3NjeSBhbmQgZnNjaGVyIGRyaXZlcnMgYW5kIGFkZGluZyBzdXBwb3J0IGZvciBzZXZlcmFsIG90aGVyIEZTQworCSAgc2Vuc29yIGNoaXBzLgogCiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBmc2NobWQuCkBAIC0zOTksNyArNDA5LDggQEAKIAlzZWxlY3QgSFdNT05fVklECiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIElURSBJVDg3MDVGLCBJVDg3MTJGLAotCSAgSVQ4NzE2RiwgSVQ4NzE4RiBhbmQgSVQ4NzI2RiBzZW5zb3IgY2hpcHMsIGFuZCB0aGUgU2lTOTYwIGNsb25lLgorCSAgSVQ4NzE2RiwgSVQ4NzE4RiwgSVQ4NzIwRiBhbmQgSVQ4NzI2RiBzZW5zb3IgY2hpcHMsIGFuZCB0aGUKKwkgIFNpUzk2MCBjbG9uZS4KIAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgaXQ4Ny4KQEAgLTQxNywxMSArNDI4LDEyIEBACiAJICB3aWxsIGJlIGNhbGxlZCBsbTYzLgogCiBjb25maWcgU0VOU09SU19MTTcwCi0JdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE03MCIKKwl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTcwIC8gVGV4YXMgSW5zdHJ1bWVudHMgVE1QMTIxIgogCWRlcGVuZHMgb24gU1BJX01BU1RFUiAmJiBFWFBFUklNRU5UQUwKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIE5hdGlvbmFsIFNlbWljb25kdWN0b3IKLQkgIExNNzAgZGlnaXRhbCB0ZW1wZXJhdHVyZSBzZW5zb3IgY2hpcC4KKwkgIExNNzAgYW5kIFRleGFzIEluc3RydW1lbnRzIFRNUDEyMS9UTVAxMjMgZGlnaXRhbCB0ZW1wZXJhdHVyZQorCSAgc2Vuc29yIGNoaXBzLgogCiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBsbTcwLgpAQCAtNTQ4LDYgKzU2MCwxNyBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgbG05My4KIAorY29uZmlnIFNFTlNPUlNfTFRDNDI0NQorCXRyaXN0YXRlICJMaW5lYXIgVGVjaG5vbG9neSBMVEM0MjQ1IgorCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAorCWRlZmF1bHQgbgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBMaW5lYXIgVGVjaG5vbG9neSBMVEM0MjQ1CisJICBNdWx0aXBsZSBTdXBwbHkgSG90IFN3YXAgQ29udHJvbGxlciBJMkMgaW50ZXJmYWNlLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIGx0YzQyNDUuCisKIGNvbmZpZyBTRU5TT1JTX01BWDExMTEKIAl0cmlzdGF0ZSAiTWF4aW0gTUFYMTExMSBNdWx0aWNoYW5uZWwsIFNlcmlhbCA4LWJpdCBBREMgY2hpcCIKIAlkZXBlbmRzIG9uIFNQSV9NQVNURVIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUgYi9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCmluZGV4IDU4ZmM1YmUuLjhmZDEyNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9od21vbi9NYWtlZmlsZQpAQCAtNjIsNiArNjIsNyBAQAogb2JqLSQoQ09ORklHX1NFTlNPUlNfTE05MCkJKz0gbG05MC5vCiBvYmotJChDT05GSUdfU0VOU09SU19MTTkyKQkrPSBsbTkyLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0xNOTMpCSs9IGxtOTMubworb2JqLSQoQ09ORklHX1NFTlNPUlNfTFRDNDI0NSkJKz0gbHRjNDI0NS5vCiBvYmotJChDT05GSUdfU0VOU09SU19NQVgxMTExKQkrPSBtYXgxMTExLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX01BWDE2MTkpCSs9IG1heDE2MTkubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfTUFYNjY1MCkJKz0gbWF4NjY1MC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2FkdDc0NjIuYyBiL2RyaXZlcnMvaHdtb24vYWR0NzQ2Mi5jCmluZGV4IDY2MTA3YjQuLjE4NTJmMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYWR0NzQ2Mi5jCisrKyBiL2RyaXZlcnMvaHdtb24vYWR0NzQ2Mi5jCkBAIC0yMDQsOCArMjA0LDYgQEAKICNkZWZpbmUgTUFTS19BTkRfU0hJRlQodmFsdWUsIHByZWZpeCkJXAogCSgoKHZhbHVlKSAmIHByZWZpeCMjX01BU0spID4+IHByZWZpeCMjX1NISUZUKQogCi0jZGVmaW5lIFJPVU5EX0RJVih4LCBkaXZpc29yKSAgKCgoeCkgKyAoKGRpdmlzb3IpIC8gMikpIC8gKGRpdmlzb3IpKQotCiBzdHJ1Y3QgYWR0NzQ2Ml9kYXRhIHsKIAlzdHJ1Y3QgZGV2aWNlCQkqaHdtb25fZGV2OwogCXN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAJYXR0cnM7CkBAIC04NDAsNyArODM4LDcgQEAKIAlpZiAoc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdGVtcCkgfHwgIXRlbXBfZW5hYmxlZChkYXRhLCBhdHRyLT5pbmRleCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JdGVtcCA9IFJPVU5EX0RJVih0ZW1wLCAxMDAwKSArIDY0OworCXRlbXAgPSBESVZfUk9VTkRfQ0xPU0VTVCh0ZW1wLCAxMDAwKSArIDY0OwogCXRlbXAgPSBTRU5TT1JTX0xJTUlUKHRlbXAsIDAsIDI1NSk7CiAKIAltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKQEAgLTg3OCw3ICs4NzYsNyBAQAogCWlmIChzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ0ZW1wKSB8fCAhdGVtcF9lbmFibGVkKGRhdGEsIGF0dHItPmluZGV4KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQl0ZW1wID0gUk9VTkRfRElWKHRlbXAsIDEwMDApICsgNjQ7CisJdGVtcCA9IERJVl9ST1VORF9DTE9TRVNUKHRlbXAsIDEwMDApICsgNjQ7CiAJdGVtcCA9IFNFTlNPUlNfTElNSVQodGVtcCwgMCwgMjU1KTsKIAogCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOwpAQCAtOTQzLDcgKzk0MSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJdGVtcCAqPSAxMDAwOyAvKiBjb252ZXJ0IG1WIHRvIHVWICovCi0JdGVtcCA9IFJPVU5EX0RJVih0ZW1wLCB4KTsKKwl0ZW1wID0gRElWX1JPVU5EX0NMT1NFU1QodGVtcCwgeCk7CiAJdGVtcCA9IFNFTlNPUlNfTElNSVQodGVtcCwgMCwgMjU1KTsKIAogCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOwpAQCAtOTg1LDcgKzk4Myw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJdGVtcCAqPSAxMDAwOyAvKiBjb252ZXJ0IG1WIHRvIHVWICovCi0JdGVtcCA9IFJPVU5EX0RJVih0ZW1wLCB4KTsKKwl0ZW1wID0gRElWX1JPVU5EX0NMT1NFU1QodGVtcCwgeCk7CiAJdGVtcCA9IFNFTlNPUlNfTElNSVQodGVtcCwgMCwgMjU1KTsKIAogCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOwpAQCAtMTI1MCw3ICsxMjQ4LDcgQEAKIAlpZiAoc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdGVtcCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JdGVtcCA9IFJPVU5EX0RJVih0ZW1wLCAxMDAwKTsKKwl0ZW1wID0gRElWX1JPVU5EX0NMT1NFU1QodGVtcCwgMTAwMCk7CiAJdGVtcCA9IFNFTlNPUlNfTElNSVQodGVtcCwgMCwgMTUpOwogCiAJLyogcGFja2FnZSB0aGluZ3MgdXAgKi8KQEAgLTEzMzcsNyArMTMzNSw3IEBACiAJaWYgKHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnRlbXApKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXRlbXAgPSBST1VORF9ESVYodGVtcCwgMTAwMCkgKyA2NDsKKwl0ZW1wID0gRElWX1JPVU5EX0NMT1NFU1QodGVtcCwgMTAwMCkgKyA2NDsKIAl0ZW1wID0gU0VOU09SU19MSU1JVCh0ZW1wLCAwLCAyNTUpOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2FkdDc0NzAuYyBiL2RyaXZlcnMvaHdtb24vYWR0NzQ3MC5jCmluZGV4IDEzMTFhNTkuLjYzM2UxYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYWR0NzQ3MC5jCisrKyBiL2RyaXZlcnMvaHdtb24vYWR0NzQ3MC5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAKIC8qIEFkZHJlc3NlcyB0byBzY2FuICovCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDJDLCAweDJFLCAweDJGLCBJMkNfQ0xJRU5UX0VORCB9OwpAQCAtNzQsNiArNzUsNyBAQAogI2RlZmluZSBBRFQ3NDcwX1JFR19QV00xMl9DRkcJCQkweDY4CiAjZGVmaW5lCQlBRFQ3NDcwX1BXTTJfQVVUT19NQVNLCQkweDQwCiAjZGVmaW5lCQlBRFQ3NDcwX1BXTTFfQVVUT19NQVNLCQkweDgwCisjZGVmaW5lCQlBRFQ3NDcwX1BXTV9BVVRPX01BU0sJCTB4QzAKICNkZWZpbmUgQURUNzQ3MF9SRUdfUFdNMzRfQ0ZHCQkJMHg2OQogI2RlZmluZQkJQURUNzQ3MF9QV00zX0FVVE9fTUFTSwkJMHg0MAogI2RlZmluZQkJQURUNzQ3MF9QV000X0FVVE9fTUFTSwkJMHg4MApAQCAtMTI4LDggKzEzMCwxMSBAQAogLyogSG93IG9mdGVuIGRvIHdlIHJlcmVhZCBzZW5zb3IgbGltaXQgdmFsdWVzPyAoSW4gamlmZmllcykgKi8KICNkZWZpbmUgTElNSVRfUkVGUkVTSF9JTlRFUlZBTAkoNjAgKiBIWikKIAotLyogc2xlZXAgMXMgd2hpbGUgZ2F0aGVyaW5nIHRlbXBlcmF0dXJlIGRhdGEgKi8KLSNkZWZpbmUgVEVNUF9DT0xMRUNUSU9OX1RJTUUJMTAwMAorLyogV2FpdCBhdCBsZWFzdCAyMDBtcyBwZXIgc2Vuc29yIGZvciAxMCBzZW5zb3JzICovCisjZGVmaW5lIFRFTVBfQ09MTEVDVElPTl9USU1FCTIwMDAKKworLyogYXV0byB1cGRhdGUgdGhpbmcgd29uJ3QgZmlyZSBtb3JlIHRoYW4gZXZlcnkgMnMgKi8KKyNkZWZpbmUgQVVUT19VUERBVEVfSU5URVJWQUwJMjAwMAogCiAvKiBkYXRhc2hlZXQgc2F5cyB0byBkaXZpZGUgdGhpcyBudW1iZXIgYnkgdGhlIGZhbiByZWFkaW5nIHRvIGdldCBmYW4gcnBtICovCiAjZGVmaW5lIEZBTl9QRVJJT0RfVE9fUlBNKHgpCSgoOTAwMDAgKiA2MCkgLyAoeCkpCkBAIC0xMzcsOCArMTQyLDYgQEAKICNkZWZpbmUgRkFOX1BFUklPRF9JTlZBTElECTY1NTM1CiAjZGVmaW5lIEZBTl9EQVRBX1ZBTElEKHgpCSgoeCkgJiYgKHgpICE9IEZBTl9QRVJJT0RfSU5WQUxJRCkKIAotI2RlZmluZSBST1VORF9ESVYoeCwgZGl2aXNvcikJKCgoeCkgKyAoKGRpdmlzb3IpIC8gMikpIC8gKGRpdmlzb3IpKQotCiBzdHJ1Y3QgYWR0NzQ3MF9kYXRhIHsKIAlzdHJ1Y3QgZGV2aWNlCQkqaHdtb25fZGV2OwogCXN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAJYXR0cnM7CkBAIC0xNDgsNiArMTUxLDkgQEAKIAl1bnNpZ25lZCBsb25nCQlzZW5zb3JzX2xhc3RfdXBkYXRlZDsJLyogSW4gamlmZmllcyAqLwogCXVuc2lnbmVkIGxvbmcJCWxpbWl0c19sYXN0X3VwZGF0ZWQ7CS8qIEluIGppZmZpZXMgKi8KIAorCWludAkJCW51bV90ZW1wX3NlbnNvcnM7CS8qIC0xID0gcHJvYmUgKi8KKwlpbnQJCQl0ZW1wZXJhdHVyZXNfcHJvYmVkOworCiAJczgJCQl0ZW1wW0FEVDc0NzBfVEVNUF9DT1VOVF07CiAJczgJCQl0ZW1wX21pbltBRFQ3NDcwX1RFTVBfQ09VTlRdOwogCXM4CQkJdGVtcF9tYXhbQURUNzQ3MF9URU1QX0NPVU5UXTsKQEAgLTE2Myw2ICsxNjksMTAgQEAKIAl1OAkJCXB3bV9taW5bQURUNzQ3MF9QV01fQ09VTlRdOwogCXM4CQkJcHdtX3RtaW5bQURUNzQ3MF9QV01fQ09VTlRdOwogCXU4CQkJcHdtX2F1dG9fdGVtcFtBRFQ3NDcwX1BXTV9DT1VOVF07CisKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QJKmF1dG9fdXBkYXRlOworCXN0cnVjdCBjb21wbGV0aW9uCWF1dG9fdXBkYXRlX3N0b3A7CisJdW5zaWduZWQgaW50CQlhdXRvX3VwZGF0ZV9pbnRlcnZhbDsKIH07CiAKIHN0YXRpYyBpbnQgYWR0NzQ3MF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LApAQCAtMjIwLDYgKzIzMCw4OCBAQAogCX0KIH0KIAorLyogUHJvYmUgZm9yIHRlbXBlcmF0dXJlIHNlbnNvcnMuICBBc3N1bWVzIGxvY2sgaXMgaGVsZCAqLworc3RhdGljIGludCBhZHQ3NDcwX3JlYWRfdGVtcGVyYXR1cmVzKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJICAgICBzdHJ1Y3QgYWR0NzQ3MF9kYXRhICpkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgcmVzOworCWludCBpOworCXU4IGNmZywgcHdtWzRdLCBwd21fY2ZnWzJdOworCisJLyogc2F2ZSBwd21bMS00XSBjb25maWcgcmVnaXN0ZXIgKi8KKwlwd21fY2ZnWzBdID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQURUNzQ3MF9SRUdfUFdNX0NGRygwKSk7CisJcHdtX2NmZ1sxXSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFEVDc0NzBfUkVHX1BXTV9DRkcoMikpOworCisJLyogc2V0IG1hbnVhbCBwd20gdG8gd2hhdGV2ZXIgaXQgaXMgc2V0IHRvIG5vdyAqLworCWZvciAoaSA9IDA7IGkgPCBBRFQ3NDcwX0ZBTl9DT1VOVDsgaSsrKQorCQlwd21baV0gPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBRFQ3NDcwX1JFR19QV00oaSkpOworCisJLyogcHV0IHB3bSBpbiBtYW51YWwgbW9kZSAqLworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBBRFQ3NDcwX1JFR19QV01fQ0ZHKDApLAorCQlwd21fY2ZnWzBdICYgfihBRFQ3NDcwX1BXTV9BVVRPX01BU0spKTsKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQURUNzQ3MF9SRUdfUFdNX0NGRygyKSwKKwkJcHdtX2NmZ1sxXSAmIH4oQURUNzQ3MF9QV01fQVVUT19NQVNLKSk7CisKKwkvKiB3cml0ZSBwd20gY29udHJvbCB0byB3aGF0ZXZlciBpdCB3YXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQURUNzQ3MF9GQU5fQ09VTlQ7IGkrKykKKwkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFEVDc0NzBfUkVHX1BXTShpKSwgcHdtW2ldKTsKKworCS8qIHN0YXJ0IHJlYWRpbmcgdGVtcGVyYXR1cmUgc2Vuc29ycyAqLworCWNmZyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFEVDc0NzBfUkVHX0NGRyk7CisJY2ZnIHw9IDB4ODA7CisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFEVDc0NzBfUkVHX0NGRywgY2ZnKTsKKworCS8qIERlbGF5IGlzIDIwMG1zICogbnVtYmVyIG9mIHRlbXAgc2Vuc29ycy4gKi8KKwlyZXMgPSBtc2xlZXBfaW50ZXJydXB0aWJsZSgoZGF0YS0+bnVtX3RlbXBfc2Vuc29ycyA+PSAwID8KKwkJCQkgICAgZGF0YS0+bnVtX3RlbXBfc2Vuc29ycyAqIDIwMCA6CisJCQkJICAgIFRFTVBfQ09MTEVDVElPTl9USU1FKSk7CisKKwkvKiBkb25lIHJlYWRpbmcgdGVtcGVyYXR1cmUgc2Vuc29ycyAqLworCWNmZyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFEVDc0NzBfUkVHX0NGRyk7CisJY2ZnICY9IH4weDgwOworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBBRFQ3NDcwX1JFR19DRkcsIGNmZyk7CisKKwkvKiByZXN0b3JlIHB3bVsxLTRdIGNvbmZpZyByZWdpc3RlcnMgKi8KKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQURUNzQ3MF9SRUdfUFdNX0NGRygwKSwgcHdtX2NmZ1swXSk7CisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFEVDc0NzBfUkVHX1BXTV9DRkcoMiksIHB3bV9jZmdbMV0pOworCisJaWYgKHJlcykgeworCQlwcmludGsoS0VSTl9FUlIgImhhIGhhLCBpbnRlcnJ1cHRlZCIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwkvKiBPbmx5IGNvdW50IGZhbnMgaWYgd2UgaGF2ZSB0byAqLworCWlmIChkYXRhLT5udW1fdGVtcF9zZW5zb3JzID49IDApCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IEFEVDc0NzBfVEVNUF9DT1VOVDsgaSsrKSB7CisJCWRhdGEtPnRlbXBbaV0gPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkJQURUNzQ3MF9URU1QX1JFRyhpKSk7CisJCWlmIChkYXRhLT50ZW1wW2ldKQorCQkJZGF0YS0+bnVtX3RlbXBfc2Vuc29ycyA9IGkgKyAxOworCX0KKwlkYXRhLT50ZW1wZXJhdHVyZXNfcHJvYmVkID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZHQ3NDcwX3VwZGF0ZV90aHJlYWQodm9pZCAqcCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gcDsKKwlzdHJ1Y3QgYWR0NzQ3MF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKKwkJYWR0NzQ3MF9yZWFkX3RlbXBlcmF0dXJlcyhjbGllbnQsIGRhdGEpOworCQltdXRleF91bmxvY2soJmRhdGEtPmxvY2spOworCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQorCQkJYnJlYWs7CisJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGRhdGEtPmF1dG9fdXBkYXRlX2ludGVydmFsKTsKKwl9CisKKwljb21wbGV0ZV9hbGwoJmRhdGEtPmF1dG9fdXBkYXRlX3N0b3ApOworCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IGFkdDc0NzBfZGF0YSAqYWR0NzQ3MF91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwpAQCAtMjI3LDMyICszMTksMzYgQEAKIAl1bnNpZ25lZCBsb25nIGxvY2FsX2ppZmZpZXMgPSBqaWZmaWVzOwogCXU4IGNmZzsKIAlpbnQgaTsKLQotCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOwotCWlmICh0aW1lX2JlZm9yZShsb2NhbF9qaWZmaWVzLCBkYXRhLT5zZW5zb3JzX2xhc3RfdXBkYXRlZCArCi0JCVNFTlNPUl9SRUZSRVNIX0lOVEVSVkFMKQotCQkmJiBkYXRhLT5zZW5zb3JzX3ZhbGlkKQotCQlnb3RvIG5vX3NlbnNvcl91cGRhdGU7Ci0KLQkvKiBzdGFydCByZWFkaW5nIHRlbXBlcmF0dXJlIHNlbnNvcnMgKi8KLQljZmcgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBRFQ3NDcwX1JFR19DRkcpOwotCWNmZyB8PSAweDgwOwotCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBBRFQ3NDcwX1JFR19DRkcsIGNmZyk7CisJaW50IG5lZWRfc2Vuc29ycyA9IDE7CisJaW50IG5lZWRfbGltaXRzID0gMTsKIAogCS8qCi0JICogRGVsYXkgaXMgMjAwbXMgKiBudW1iZXIgb2YgdG1wMDUgc2Vuc29ycy4gIFRvbyBiYWQKLQkgKiB0aGVyZSdzIG5vIHdheSB0byBmaWd1cmUgb3V0IGhvdyBtYW55IGFyZSBjb25uZWN0ZWQuCi0JICogRm9yIG5vdywgYXNzdW1lIDFzIHdpbGwgd29yay4KKwkgKiBGaWd1cmUgb3V0IGlmIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBzaGFkb3cgcmVnaXN0ZXJzLgorCSAqIExvY2tsZXNzIG1lYW5zIHRoYXQgd2UgbWF5IG9jY2FzaW9uYWxseSByZXBvcnQgb3V0IG9mCisJICogZGF0ZSBkYXRhLgogCSAqLwotCW1zbGVlcChURU1QX0NPTExFQ1RJT05fVElNRSk7CisJaWYgKHRpbWVfYmVmb3JlKGxvY2FsX2ppZmZpZXMsIGRhdGEtPnNlbnNvcnNfbGFzdF91cGRhdGVkICsKKwkJCVNFTlNPUl9SRUZSRVNIX0lOVEVSVkFMKSAmJgorCSAgICBkYXRhLT5zZW5zb3JzX3ZhbGlkKQorCQluZWVkX3NlbnNvcnMgPSAwOwogCi0JLyogZG9uZSByZWFkaW5nIHRlbXBlcmF0dXJlIHNlbnNvcnMgKi8KLQljZmcgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBRFQ3NDcwX1JFR19DRkcpOwotCWNmZyAmPSB+MHg4MDsKLQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQURUNzQ3MF9SRUdfQ0ZHLCBjZmcpOworCWlmICh0aW1lX2JlZm9yZShsb2NhbF9qaWZmaWVzLCBkYXRhLT5saW1pdHNfbGFzdF91cGRhdGVkICsKKwkJCUxJTUlUX1JFRlJFU0hfSU5URVJWQUwpICYmCisJICAgIGRhdGEtPmxpbWl0c192YWxpZCkKKwkJbmVlZF9saW1pdHMgPSAwOwogCi0JZm9yIChpID0gMDsgaSA8IEFEVDc0NzBfVEVNUF9DT1VOVDsgaSsrKQotCQlkYXRhLT50ZW1wW2ldID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwlpZiAoIW5lZWRfc2Vuc29ycyAmJiAhbmVlZF9saW1pdHMpCisJCXJldHVybiBkYXRhOworCisJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CisJaWYgKCFuZWVkX3NlbnNvcnMpCisJCWdvdG8gbm9fc2Vuc29yX3VwZGF0ZTsKKworCWlmICghZGF0YS0+dGVtcGVyYXR1cmVzX3Byb2JlZCkKKwkJYWR0NzQ3MF9yZWFkX3RlbXBlcmF0dXJlcyhjbGllbnQsIGRhdGEpOworCWVsc2UKKwkJZm9yIChpID0gMDsgaSA8IEFEVDc0NzBfVEVNUF9DT1VOVDsgaSsrKQorCQkJZGF0YS0+dGVtcFtpXSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCiAJCQkJCQlBRFQ3NDcwX1RFTVBfUkVHKGkpKTsKIAogCWZvciAoaSA9IDA7IGkgPCBBRFQ3NDcwX0ZBTl9DT1VOVDsgaSsrKQpAQCAtMzAyLDkgKzM5OCw3IEBACiAJZGF0YS0+c2Vuc29yc192YWxpZCA9IDE7CiAKIG5vX3NlbnNvcl91cGRhdGU6Ci0JaWYgKHRpbWVfYmVmb3JlKGxvY2FsX2ppZmZpZXMsIGRhdGEtPmxpbWl0c19sYXN0X3VwZGF0ZWQgKwotCQlMSU1JVF9SRUZSRVNIX0lOVEVSVkFMKQotCQkmJiBkYXRhLT5saW1pdHNfdmFsaWQpCisJaWYgKCFuZWVkX2xpbWl0cykKIAkJZ290byBvdXQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQURUNzQ3MF9URU1QX0NPVU5UOyBpKyspIHsKQEAgLTMzOCw2ICs0MzIsNjYgQEAKIAlyZXR1cm4gZGF0YTsKIH0KIAorc3RhdGljIHNzaXplX3Qgc2hvd19hdXRvX3VwZGF0ZV9pbnRlcnZhbChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCQkJIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWR0NzQ3MF9kYXRhICpkYXRhID0gYWR0NzQ3MF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPmF1dG9fdXBkYXRlX2ludGVydmFsKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X2F1dG9fdXBkYXRlX2ludGVydmFsKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCisJCQkJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkJc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGFkdDc0NzBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWxvbmcgdGVtcDsKKworCWlmIChzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ0ZW1wKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0ZW1wID0gU0VOU09SU19MSU1JVCh0ZW1wLCAwLCA2MDAwMCk7CisKKwltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKKwlkYXRhLT5hdXRvX3VwZGF0ZV9pbnRlcnZhbCA9IHRlbXA7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19udW1fdGVtcF9zZW5zb3JzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAorCQkJCSAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBhZHQ3NDcwX2RhdGEgKmRhdGEgPSBhZHQ3NDcwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YS0+bnVtX3RlbXBfc2Vuc29ycyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9udW1fdGVtcF9zZW5zb3JzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCisJCQkJICAgIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkgICAgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGFkdDc0NzBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWxvbmcgdGVtcDsKKworCWlmIChzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ0ZW1wKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0ZW1wID0gU0VOU09SU19MSU1JVCh0ZW1wLCAtMSwgMTApOworCisJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CisJZGF0YS0+bnVtX3RlbXBfc2Vuc29ycyA9IHRlbXA7CisJaWYgKHRlbXAgPCAwKQorCQlkYXRhLT50ZW1wZXJhdHVyZXNfcHJvYmVkID0gMDsKKwltdXRleF91bmxvY2soJmRhdGEtPmxvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCiBzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfbWluKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCiAJCQkgICAgIGNoYXIgKmJ1ZikKQEAgLTM2MCw3ICs1MTQsNyBAQAogCWlmIChzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ0ZW1wKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQl0ZW1wID0gUk9VTkRfRElWKHRlbXAsIDEwMDApOworCXRlbXAgPSBESVZfUk9VTkRfQ0xPU0VTVCh0ZW1wLCAxMDAwKTsKIAl0ZW1wID0gU0VOU09SU19MSU1JVCh0ZW1wLCAwLCAyNTUpOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CkBAIC0zOTQsNyArNTQ4LDcgQEAKIAlpZiAoc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdGVtcCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JdGVtcCA9IFJPVU5EX0RJVih0ZW1wLCAxMDAwKTsKKwl0ZW1wID0gRElWX1JPVU5EX0NMT1NFU1QodGVtcCwgMTAwMCk7CiAJdGVtcCA9IFNFTlNPUlNfTElNSVQodGVtcCwgMCwgMjU1KTsKIAogCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOwpAQCAtNjcxLDcgKzgyNSw3IEBACiAJaWYgKHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnRlbXApKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXRlbXAgPSBST1VORF9ESVYodGVtcCwgMTAwMCk7CisJdGVtcCA9IERJVl9ST1VORF9DTE9TRVNUKHRlbXAsIDEwMDApOwogCXRlbXAgPSBTRU5TT1JTX0xJTUlUKHRlbXAsIDAsIDI1NSk7CiAKIAltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKQEAgLTgwNCw2ICs5NTgsMTAgQEAKIH0KIAogc3RhdGljIERFVklDRV9BVFRSKGFsYXJtX21hc2ssIFNfSVJVR08sIHNob3dfYWxhcm1fbWFzaywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIobnVtX3RlbXBfc2Vuc29ycywgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfbnVtX3RlbXBfc2Vuc29ycywKKwkJICAgc2V0X251bV90ZW1wX3NlbnNvcnMpOworc3RhdGljIERFVklDRV9BVFRSKGF1dG9fdXBkYXRlX2ludGVydmFsLCBTX0lXVVNSIHwgU19JUlVHTywKKwkJICAgc2hvd19hdXRvX3VwZGF0ZV9pbnRlcnZhbCwgc2V0X2F1dG9fdXBkYXRlX2ludGVydmFsKTsKIAogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXBfbWF4LAogCQkgICAgc2V0X3RlbXBfbWF4LCAwKTsKQEAgLTk3Niw2ICsxMTM0LDggQEAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZHQ3NDcwX2F0dHJbXSA9CiB7CiAJJmRldl9hdHRyX2FsYXJtX21hc2suYXR0ciwKKwkmZGV2X2F0dHJfbnVtX3RlbXBfc2Vuc29ycy5hdHRyLAorCSZkZXZfYXR0cl9hdXRvX3VwZGF0ZV9pbnRlcnZhbC5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWF4LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9tYXguZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX21heC5kZXZfYXR0ci5hdHRyLApAQCAtMTEwOCw2ICsxMjY4LDkgQEAKIAkJZ290byBleGl0OwogCX0KIAorCWRhdGEtPm51bV90ZW1wX3NlbnNvcnMgPSAtMTsKKwlkYXRhLT5hdXRvX3VwZGF0ZV9pbnRlcnZhbCA9IEFVVE9fVVBEQVRFX0lOVEVSVkFMOworCiAJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZGF0YSk7CiAJbXV0ZXhfaW5pdCgmZGF0YS0+bG9jayk7CiAKQEAgLTExMjcsOCArMTI5MCwxNiBAQAogCQlnb3RvIGV4aXRfcmVtb3ZlOwogCX0KIAorCWluaXRfY29tcGxldGlvbigmZGF0YS0+YXV0b191cGRhdGVfc3RvcCk7CisJZGF0YS0+YXV0b191cGRhdGUgPSBrdGhyZWFkX3J1bihhZHQ3NDcwX3VwZGF0ZV90aHJlYWQsIGNsaWVudCwKKwkJCQkJZGV2X25hbWUoZGF0YS0+aHdtb25fZGV2KSk7CisJaWYgKElTX0VSUihkYXRhLT5hdXRvX3VwZGF0ZSkpCisJCWdvdG8gZXhpdF91bnJlZ2lzdGVyOworCiAJcmV0dXJuIDA7CiAKK2V4aXRfdW5yZWdpc3RlcjoKKwlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5od21vbl9kZXYpOwogZXhpdF9yZW1vdmU6CiAJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmZGF0YS0+YXR0cnMpOwogZXhpdF9mcmVlOgpAQCAtMTE0MSw2ICsxMzEyLDggQEAKIHsKIAlzdHJ1Y3QgYWR0NzQ3MF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAKKwlrdGhyZWFkX3N0b3AoZGF0YS0+YXV0b191cGRhdGUpOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmRhdGEtPmF1dG9fdXBkYXRlX3N0b3ApOwogCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmh3bW9uX2Rldik7CiAJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmZGF0YS0+YXR0cnMpOwogCWtmcmVlKGRhdGEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hZHQ3NDczLmMgYi9kcml2ZXJzL2h3bW9uL2FkdDc0NzMuYwppbmRleCAxOGFhMzA4Li4wYTZjZTIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2FkdDc0NzMuYworKysgYi9kcml2ZXJzL2h3bW9uL2FkdDc0NzMuYwpAQCAtMTI5LDggKzEyOSw2IEBACiAjZGVmaW5lIEZBTl9QRVJJT0RfSU5WQUxJRAk2NTUzNQogI2RlZmluZSBGQU5fREFUQV9WQUxJRCh4KQkoKHgpICYmICh4KSAhPSBGQU5fUEVSSU9EX0lOVkFMSUQpCiAKLSNkZWZpbmUgUk9VTkRfRElWKHgsIGRpdmlzb3IpCSgoKHgpICsgKChkaXZpc29yKSAvIDIpKSAvIChkaXZpc29yKSkKLQogc3RydWN0IGFkdDc0NzNfZGF0YSB7CiAJc3RydWN0IGRldmljZQkJKmh3bW9uX2RldjsKIAlzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwCWF0dHJzOwpAQCAtNDU5LDcgKzQ1Nyw3IEBACiAJaWYgKHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnRlbXApKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXRlbXAgPSBST1VORF9ESVYodGVtcCwgMTAwMCk7CisJdGVtcCA9IERJVl9ST1VORF9DTE9TRVNUKHRlbXAsIDEwMDApOwogCXRlbXAgPSBlbmNvZGVfdGVtcChkYXRhLT50ZW1wX3R3b3NfY29tcGxlbWVudCwgdGVtcCk7CiAKIAltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKQEAgLTQ5NSw3ICs0OTMsNyBAQAogCWlmIChzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ0ZW1wKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQl0ZW1wID0gUk9VTkRfRElWKHRlbXAsIDEwMDApOworCXRlbXAgPSBESVZfUk9VTkRfQ0xPU0VTVCh0ZW1wLCAxMDAwKTsKIAl0ZW1wID0gZW5jb2RlX3RlbXAoZGF0YS0+dGVtcF90d29zX2NvbXBsZW1lbnQsIHRlbXApOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CkBAIC03MjAsNyArNzE4LDcgQEAKIAlpZiAoc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdGVtcCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JdGVtcCA9IFJPVU5EX0RJVih0ZW1wLCAxMDAwKTsKKwl0ZW1wID0gRElWX1JPVU5EX0NMT1NFU1QodGVtcCwgMTAwMCk7CiAJdGVtcCA9IGVuY29kZV90ZW1wKGRhdGEtPnRlbXBfdHdvc19jb21wbGVtZW50LCB0ZW1wKTsKIAogCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOwpAQCAtNzU2LDcgKzc1NCw3IEBACiAJaWYgKHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnRlbXApKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXRlbXAgPSBST1VORF9ESVYodGVtcCwgMTAwMCk7CisJdGVtcCA9IERJVl9ST1VORF9DTE9TRVNUKHRlbXAsIDEwMDApOwogCXRlbXAgPSBlbmNvZGVfdGVtcChkYXRhLT50ZW1wX3R3b3NfY29tcGxlbWVudCwgdGVtcCk7CiAKIAltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYXBwbGVzbWMuYyBiL2RyaXZlcnMvaHdtb24vYXBwbGVzbWMuYwppbmRleCAwODZjMmE1Li5kY2E0N2E1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2FwcGxlc21jLmMKKysrIGIvZHJpdmVycy9od21vbi9hcHBsZXNtYy5jCkBAIC0xMzEsNiArMTMxLDEwIEBACiAvKiBTZXQgMTQ6IGlNYWMgNiwxICovCiAJeyAiVEEwUCIsICJUQzBEIiwgIlRDMEgiLCAiVEMwUCIsICJURzBEIiwgIlRHMEgiLCAiVEcwUCIsICJUSDBQIiwKIAkgICJUTzBQIiwgIlRwMFAiLCBOVUxMIH0sCisvKiBTZXQgMTU6IE1hY0Jvb2sgQWlyIDIsMSAqLworCXsgIlRCMFQiLCAiVEIxUyIsICJUQjFUIiwgIlRCMlMiLCAiVEIyVCIsICJUQzBEIiwgIlROMEQiLCAiVFRGMCIsCisJICAiVFYwUCIsICJUVkZQIiwgIlRXMFAiLCAiVGgwUCIsICJUcDBQIiwgIlRwMVAiLCAiVHBGUCIsICJUczBQIiwKKwkgICJUczBTIiwgTlVMTCB9LAogfTsKIAogLyogTGlzdCBvZiBrZXlzIHVzZWQgdG8gcmVhZC93cml0ZSBmYW4gc3BlZWRzICovCkBAIC0xMzAxLDExICsxMzA1LDE3IEBACiAJeyAuYWNjZWxlcm9tZXRlciA9IDAsIC5saWdodCA9IDAsIC50ZW1wZXJhdHVyZV9zZXQgPSAxMyB9LAogLyogaU1hYyA2OiBsaWdodCBzZW5zb3Igb25seSwgdGVtcGVyYXR1cmUgc2V0IDE0ICovCiAJeyAuYWNjZWxlcm9tZXRlciA9IDAsIC5saWdodCA9IDAsIC50ZW1wZXJhdHVyZV9zZXQgPSAxNCB9LAorLyogTWFjQm9vayBBaXIgMiwxOiBhY2NlbGVyb21ldGVyLCBiYWNrbGlnaHQgYW5kIHRlbXBlcmF0dXJlIHNldCAxNSAqLworCXsgLmFjY2VsZXJvbWV0ZXIgPSAxLCAubGlnaHQgPSAxLCAudGVtcGVyYXR1cmVfc2V0ID0gMTUgfSwKIH07CiAKIC8qIE5vdGUgdGhhdCBETUlfTUFUQ0goLi4uLCJNYWNCb29rIikgd2lsbCBtYXRjaCAiTWFjQm9va1BybzEsMSIuCiAgKiBTbyB3ZSBuZWVkIHRvIHB1dCAiQXBwbGUgTWFjQm9vayBQcm8iIGJlZm9yZSAiQXBwbGUgTWFjQm9vayIuICovCiBzdGF0aWMgX19pbml0ZGF0YSBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBhcHBsZXNtY193aGl0ZWxpc3RbXSA9IHsKKwl7IGFwcGxlc21jX2RtaV9tYXRjaCwgIkFwcGxlIE1hY0Jvb2sgQWlyIDIiLCB7CisJICBETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFwcGxlIiksCisJICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1hY0Jvb2tBaXIyIikgfSwKKwkJJmFwcGxlc21jX2RtaV9kYXRhWzE1XX0sCiAJeyBhcHBsZXNtY19kbWlfbWF0Y2gsICJBcHBsZSBNYWNCb29rIEFpciIsIHsKIAkgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQXBwbGUiKSwKIAkgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTWFjQm9va0FpciIpIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2FzYjEwMC5jIGIvZHJpdmVycy9od21vbi9hc2IxMDAuYwppbmRleCA4YTQ1YTJlLi44YWNmODI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2FzYjEwMC5jCisrKyBiL2RyaXZlcnMvaHdtb24vYXNiMTAwLmMKQEAgLTUzLDcgKzUzLDEwIEBACiAKIC8qIEluc21vZCBwYXJhbWV0ZXJzICovCiBJMkNfQ0xJRU5UX0lOU01PRF8xKGFzYjEwMCk7Ci1JMkNfQ0xJRU5UX01PRFVMRV9QQVJNKGZvcmNlX3N1YmNsaWVudHMsICJMaXN0IG9mIHN1YmNsaWVudCBhZGRyZXNzZXM6ICIKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGZvcmNlX3N1YmNsaWVudHNbNF07Cittb2R1bGVfcGFyYW1fYXJyYXkoZm9yY2Vfc3ViY2xpZW50cywgc2hvcnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9zdWJjbGllbnRzLCAiTGlzdCBvZiBzdWJjbGllbnQgYWRkcmVzc2VzOiAiCiAJIntidXMsIGNsaWVudGFkZHIsIHN1YmNsaWVudGFkZHIxLCBzdWJjbGllbnRhZGRyMn0iKTsKIAogLyogVm9sdGFnZSBJTiByZWdpc3RlcnMgMC02ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2RtZTE3MzcuYyBiL2RyaXZlcnMvaHdtb24vZG1lMTczNy5jCmluZGV4IDI3YTVkMzkuLjNkZjIwMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vZG1lMTczNy5jCisrKyBiL2RyaXZlcnMvaHdtb24vZG1lMTczNy5jCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaHdtb24tdmlkLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKIC8qIElTQSBkZXZpY2UsIGlmIGZvdW5kICovCkBAIC0yMzYxLDYgKzIzNjIsMTAgQEAKIAl9OwogCWludCBlcnI7CiAKKwllcnIgPSBhY3BpX2NoZWNrX3Jlc291cmNlX2NvbmZsaWN0KCZyZXMpOworCWlmIChlcnIpCisJCWdvdG8gZXhpdDsKKwogCWlmICghKHBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoImRtZTE3MzciLCBhZGRyKSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJkbWUxNzM3OiBGYWlsZWQgdG8gYWxsb2NhdGUgZGV2aWNlLlxuIik7CiAJCWVyciA9IC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2Y3MTgwNWYuYyBiL2RyaXZlcnMvaHdtb24vZjcxODA1Zi5jCmluZGV4IDdhMTRhMmQuLjg5OTg3NjU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2Y3MTgwNWYuYworKysgYi9kcml2ZXJzL2h3bW9uL2Y3MTgwNWYuYwpAQCAtMzksNiArMzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBmb3JjZV9pZDsKQEAgLTE0NTUsNiArMTQ1NiwxMCBAQAogCX0KIAogCXJlcy5uYW1lID0gcGRldi0+bmFtZTsKKwllcnIgPSBhY3BpX2NoZWNrX3Jlc291cmNlX2NvbmZsaWN0KCZyZXMpOworCWlmIChlcnIpCisJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OworCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgJnJlcywgMSk7CiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgcmVzb3VyY2UgYWRkaXRpb24gZmFpbGVkICIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vZjcxODgyZmcuYyBiL2RyaXZlcnMvaHdtb24vZjcxODgyZmcuYwppbmRleCA2NzA2N2U5Li42MDljYWZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2Y3MTg4MmZnLmMKKysrIGIvZHJpdmVycy9od21vbi9mNzE4ODJmZy5jCkBAIC0xLDYgKzEsNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICBDb3B5cmlnaHQgKEMpIDIwMDYgYnkgSGFucyBFZGdpbmd0b24gPGhhbnNAZWRnaW5ndG9uLm5sPiAgICAgICAgICAgICAgKgotICogICBDb3B5cmlnaHQgKEMpIDIwMDcgYnkgSGFucyBkZSBHb2VkZSAgPGoudy5yLmRlZ29lZGVAaGhzLm5sPiAgICAgICAgICAgKgorICogICBDb3B5cmlnaHQgKEMpIDIwMDcsMjAwOCBieSBIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPiAgICAgICAgKgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgogICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgpAQCAtMjcsMTEgKzI3LDEyIEBACiAjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogCiAjZGVmaW5lIERSVk5BTUUgImY3MTg4MmZnIgogCi0jZGVmaW5lIFNJT19GNzE4ODJGR19MRF9IV00JMHgwNAkvKiBIYXJkd2FyZSBtb25pdG9yIGxvZ2ljYWwgZGV2aWNlKi8KKyNkZWZpbmUgU0lPX0Y3MTg4MkZHX0xEX0hXTQkweDA0CS8qIEhhcmR3YXJlIG1vbml0b3IgbG9naWNhbCBkZXZpY2UgKi8KICNkZWZpbmUgU0lPX1VOTE9DS19LRVkJCTB4ODcJLyogS2V5IHRvIGVuYWJsZSBTdXBlci1JL08gKi8KICNkZWZpbmUgU0lPX0xPQ0tfS0VZCQkweEFBCS8qIEtleSB0byBkaWFzYmxlIFN1cGVyLUkvTyAqLwogCkBAIC00Myw3ICs0NCw5IEBACiAjZGVmaW5lIFNJT19SRUdfQUREUgkJMHg2MAkvKiBMb2dpY2FsIGRldmljZSBhZGRyZXNzICgyIGJ5dGVzKSAqLwogCiAjZGVmaW5lIFNJT19GSU5URUtfSUQJCTB4MTkzNAkvKiBNYW51ZmFjdHVyZXJzIElEICovCisjZGVmaW5lIFNJT19GNzE4NjJfSUQJCTB4MDYwMQkvKiBDaGlwc2V0IElEICovCiAjZGVmaW5lIFNJT19GNzE4ODJfSUQJCTB4MDU0MQkvKiBDaGlwc2V0IElEICovCisjZGVmaW5lIFNJT19GODAwMF9JRAkJMHgwNTgxCS8qIENoaXBzZXQgSUQgKi8KIAogI2RlZmluZSBSRUdJT05fTEVOR1RICQk4CiAjZGVmaW5lIEFERFJfUkVHX09GRlNFVAkJNQpAQCAtNTEsMjUgKzU0LDM2IEBACiAKICNkZWZpbmUgRjcxODgyRkdfUkVHX1BFQ0kJCTB4MEEKIAotI2RlZmluZSBGNzE4ODJGR19SRUdfSU5fU1RBVFVTCQkweDEyCi0jZGVmaW5lIEY3MTg4MkZHX1JFR19JTl9CRUVQCQkweDEzCisjZGVmaW5lIEY3MTg4MkZHX1JFR19JTl9TVEFUVVMJCTB4MTIgLyogZjcxODgyZmcgb25seSAqLworI2RlZmluZSBGNzE4ODJGR19SRUdfSU5fQkVFUAkJMHgxMyAvKiBmNzE4ODJmZyBvbmx5ICovCiAjZGVmaW5lIEY3MTg4MkZHX1JFR19JTihucikJCSgweDIwICArIChucikpCi0jZGVmaW5lIEY3MTg4MkZHX1JFR19JTjFfSElHSAkJMHgzMgorI2RlZmluZSBGNzE4ODJGR19SRUdfSU4xX0hJR0gJCTB4MzIgLyogZjcxODgyZmcgb25seSAqLwogCiAjZGVmaW5lIEY3MTg4MkZHX1JFR19GQU4obnIpCQkoMHhBMCArICgxNiAqIChucikpKQorI2RlZmluZSBGNzE4ODJGR19SRUdfRkFOX1RBUkdFVChucikJKDB4QTIgKyAoMTYgKiAobnIpKSkKKyNkZWZpbmUgRjcxODgyRkdfUkVHX0ZBTl9GVUxMX1NQRUVEKG5yKQkoMHhBNCArICgxNiAqIChucikpKQogI2RlZmluZSBGNzE4ODJGR19SRUdfRkFOX1NUQVRVUwkJMHg5MgogI2RlZmluZSBGNzE4ODJGR19SRUdfRkFOX0JFRVAJCTB4OTMKIAotI2RlZmluZSBGNzE4ODJGR19SRUdfVEVNUChucikJCSgweDcyICsgMiAqIChucikpCi0jZGVmaW5lIEY3MTg4MkZHX1JFR19URU1QX09WVChucikJKDB4ODIgKyAyICogKG5yKSkKLSNkZWZpbmUgRjcxODgyRkdfUkVHX1RFTVBfSElHSChucikJKDB4ODMgKyAyICogKG5yKSkKKyNkZWZpbmUgRjcxODgyRkdfUkVHX1RFTVAobnIpCQkoMHg3MCArIDIgKiAobnIpKQorI2RlZmluZSBGNzE4ODJGR19SRUdfVEVNUF9PVlQobnIpCSgweDgwICsgMiAqIChucikpCisjZGVmaW5lIEY3MTg4MkZHX1JFR19URU1QX0hJR0gobnIpCSgweDgxICsgMiAqIChucikpCiAjZGVmaW5lIEY3MTg4MkZHX1JFR19URU1QX1NUQVRVUwkweDYyCiAjZGVmaW5lIEY3MTg4MkZHX1JFR19URU1QX0JFRVAJCTB4NjMKLSNkZWZpbmUgRjcxODgyRkdfUkVHX1RFTVBfSFlTVDEJCTB4NkMKLSNkZWZpbmUgRjcxODgyRkdfUkVHX1RFTVBfSFlTVDIzCTB4NkQKKyNkZWZpbmUgRjcxODgyRkdfUkVHX1RFTVBfSFlTVChucikJKDB4NkMgKyAobnIpKQogI2RlZmluZSBGNzE4ODJGR19SRUdfVEVNUF9UWVBFCQkweDZCCiAjZGVmaW5lIEY3MTg4MkZHX1JFR19URU1QX0RJT0RFX09QRU4JMHg2RgogCisjZGVmaW5lIEY3MTg4MkZHX1JFR19QV00obnIpCQkoMHhBMyArICgxNiAqIChucikpKQorI2RlZmluZSBGNzE4ODJGR19SRUdfUFdNX1RZUEUJCTB4OTQKKyNkZWZpbmUgRjcxODgyRkdfUkVHX1BXTV9FTkFCTEUJCTB4OTYKKworI2RlZmluZSBGNzE4ODJGR19SRUdfRkFOX0hZU1QobnIpCSgweDk4ICsgKG5yKSkKKworI2RlZmluZSBGNzE4ODJGR19SRUdfUE9JTlRfUFdNKHB3bSwgcG9pbnQpCSgweEFBICsgKHBvaW50KSArICgxNiAqIChwd20pKSkKKyNkZWZpbmUgRjcxODgyRkdfUkVHX1BPSU5UX1RFTVAocHdtLCBwb2ludCkJKDB4QTYgKyAocG9pbnQpICsgKDE2ICogKHB3bSkpKQorI2RlZmluZSBGNzE4ODJGR19SRUdfUE9JTlRfTUFQUElORyhucikJCSgweEFGICsgMTYgKiAobnIpKQorCiAjZGVmaW5lCUY3MTg4MkZHX1JFR19TVEFSVAkJMHgwMQogCiAjZGVmaW5lIEZBTl9NSU5fREVURUNUCQkJMzY2IC8qIExvd2VzdCBkZXRlY3RhYmxlIGZhbnNwZWVkICovCkBAIC03OCw3ICs5MiwxNSBAQAogbW9kdWxlX3BhcmFtKGZvcmNlX2lkLCB1c2hvcnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9pZCwgIk92ZXJyaWRlIHRoZSBkZXRlY3RlZCBkZXZpY2UgSUQiKTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmY3MTg4MmZnX3BkZXYgPSBOVUxMOworZW51bSBjaGlwcyB7IGY3MTg2MmZnLCBmNzE4ODJmZywgZjgwMDAgfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmY3MTg4MmZnX25hbWVzW10gPSB7CisJImY3MTg2MmZnIiwKKwkiZjcxODgyZmciLAorCSJmODAwMCIsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZjcxODgyZmdfcGRldjsKIAogLyogU3VwZXItSS9PIEZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KIHN0YXRpYyBpbmxpbmUgaW50IHN1cGVyaW9faW5iKGludCBiYXNlLCBpbnQgcmVnKTsKQEAgLTg3LDggKzEwOSwxMyBAQAogc3RhdGljIGlubGluZSB2b2lkIHN1cGVyaW9fc2VsZWN0KGludCBiYXNlLCBpbnQgbGQpOwogc3RhdGljIGlubGluZSB2b2lkIHN1cGVyaW9fZXhpdChpbnQgYmFzZSk7CiAKK3N0cnVjdCBmNzE4ODJmZ19zaW9fZGF0YSB7CisJZW51bSBjaGlwcyB0eXBlOworfTsKKwogc3RydWN0IGY3MTg4MmZnX2RhdGEgewogCXVuc2lnbmVkIHNob3J0IGFkZHI7CisJZW51bSBjaGlwcyB0eXBlOwogCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKIAogCXN0cnVjdCBtdXRleCB1cGRhdGVfbG9jazsKQEAgLTEwMiwxOSArMTI5LDMwIEBACiAJdTgJaW5fc3RhdHVzOwogCXU4CWluX2JlZXA7CiAJdTE2CWZhbls0XTsKKwl1MTYJZmFuX3RhcmdldFs0XTsKKwl1MTYJZmFuX2Z1bGxfc3BlZWRbNF07CiAJdTgJZmFuX3N0YXR1czsKIAl1OAlmYW5fYmVlcDsKLQl1OAl0ZW1wWzNdOwotCXU4CXRlbXBfb3Z0WzNdOwotCXU4CXRlbXBfaGlnaFszXTsKLQl1OAl0ZW1wX2h5c3RbM107Ci0JdTgJdGVtcF90eXBlWzNdOworCS8qIE5vdGU6IGFsbCBtb2RlbHMgaGF2ZSBvbmx5IDMgdGVtcGVyYXR1cmUgY2hhbm5lbHMsIGJ1dCBvbiBzb21lCisJICAgdGhleSBhcmUgYWRkcmVzc2VkIGFzIDAtMiBhbmQgb24gb3RoZXJzIGFzIDEtMywgc28gZm9yIGNvZGluZworCSAgIGNvbnZlbmllbmNlIHdlIHJlc2VydmUgc3BhY2UgZm9yIDQgY2hhbm5lbHMgKi8KKwl1OAl0ZW1wWzRdOworCXU4CXRlbXBfb3Z0WzRdOworCXU4CXRlbXBfaGlnaFs0XTsKKwl1OAl0ZW1wX2h5c3RbMl07IC8qIDIgaHlzdHMgc3RvcmVkIHBlciByZWcgKi8KKwl1OAl0ZW1wX3R5cGVbNF07CiAJdTgJdGVtcF9zdGF0dXM7CiAJdTgJdGVtcF9iZWVwOwogCXU4CXRlbXBfZGlvZGVfb3BlbjsKKwl1OAlwd21bNF07CisJdTgJcHdtX2VuYWJsZTsKKwl1OAlwd21fYXV0b19wb2ludF9oeXN0WzJdOworCXU4CXB3bV9hdXRvX3BvaW50X21hcHBpbmdbNF07CisJdTgJcHdtX2F1dG9fcG9pbnRfcHdtWzRdWzVdOworCXU4CXB3bV9hdXRvX3BvaW50X3RlbXBbNF1bNF07CiB9OwogCi0vKiBTeXNmcyBpbiovCisvKiBTeXNmcyBpbiAqLwogc3RhdGljIHNzaXplX3Qgc2hvd19pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAogCWNoYXIgKmJ1Zik7CiBzdGF0aWMgc3NpemVfdCBzaG93X2luX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlCkBAIC0xMzAsNiArMTY4LDEwIEBACiAvKiBTeXNmcyBGYW4gKi8KIHN0YXRpYyBzc2l6ZV90IHNob3dfZmFuKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCiAJY2hhciAqYnVmKTsKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuX2Z1bGxfc3BlZWQoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpOworc3RhdGljIHNzaXplX3Qgc3RvcmVfZmFuX2Z1bGxfc3BlZWQoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7CiBzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9iZWVwKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUKIAkqZGV2YXR0ciwgY2hhciAqYnVmKTsKIHN0YXRpYyBzc2l6ZV90IHN0b3JlX2Zhbl9iZWVwKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUKQEAgLTE2MywxNiArMjA1LDQxIEBACiAJKmRldmF0dHIsIGNoYXIgKmJ1Zik7CiBzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfZmF1bHQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZQogCSpkZXZhdHRyLCBjaGFyICpidWYpOworLyogUFdNIGFuZCBBdXRvIHBvaW50IGNvbnRyb2wgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCisJY2hhciAqYnVmKTsKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3B3bShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAorCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1Zik7CitzdGF0aWMgc3NpemVfdCBzdG9yZV9wd21fZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZQkqZGV2YXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOworc3RhdGljIHNzaXplX3Qgc2hvd19wd21faW50ZXJwb2xhdGUoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpOworc3RhdGljIHNzaXplX3Qgc3RvcmVfcHdtX2ludGVycG9sYXRlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOworc3RhdGljIHNzaXplX3Qgc2hvd19wd21fYXV0b19wb2ludF9jaGFubmVsKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKTsKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3B3bV9hdXRvX3BvaW50X2NoYW5uZWwoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7CitzdGF0aWMgc3NpemVfdCBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1Zik7CitzdGF0aWMgc3NpemVfdCBzdG9yZV9wd21fYXV0b19wb2ludF90ZW1wX2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7CitzdGF0aWMgc3NpemVfdCBzaG93X3B3bV9hdXRvX3BvaW50X3B3bShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1Zik7CitzdGF0aWMgc3NpemVfdCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20oc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7CitzdGF0aWMgc3NpemVfdCBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpOworc3RhdGljIHNzaXplX3Qgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKIC8qIFN5c2ZzIG1pc2MgKi8KIHN0YXRpYyBzc2l6ZV90IHNob3dfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAogCWNoYXIgKmJ1Zik7CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGY3MTg4MmZnX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKiBwZGV2KTsKLXN0YXRpYyBpbnQgX19kZXZleGl0IGY3MTg4MmZnX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKLXN0YXRpYyBpbnQgX19pbml0IGY3MTg4MmZnX2luaXQodm9pZCk7Ci1zdGF0aWMgaW50IF9faW5pdCBmNzE4ODJmZ19maW5kKGludCBzaW9hZGRyLCB1bnNpZ25lZCBzaG9ydCAqYWRkcmVzcyk7Ci1zdGF0aWMgaW50IF9faW5pdCBmNzE4ODJmZ19kZXZpY2VfYWRkKHVuc2lnbmVkIHNob3J0IGFkZHJlc3MpOwotc3RhdGljIHZvaWQgX19leGl0IGY3MTg4MmZnX2V4aXQodm9pZCk7CitzdGF0aWMgaW50IGY3MTg4MmZnX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZjcxODgyZmdfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CkBAIC0xODMsODYgKzI1MCw1MzEgQEAKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGY3MTg4MmZnX3JlbW92ZSksCiB9OwogCi1zdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZjcxODgyZmdfZGV2X2F0dHJbXSA9Ci17Ci0JX19BVFRSKCBuYW1lLCBTX0lSVUdPLCBzaG93X25hbWUsIE5VTEwgKSwKK3N0YXRpYyBERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBzaG93X25hbWUsIE5VTEwpOworCisvKiBUZW1wIGFuZCBpbiBhdHRyIGNvbW1vbiB0byBib3RoIHRoZSBmNzE4NjJmZyBhbmQgZjcxODgyZmcgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiBmNzE4eDJmZ19pbl90ZW1wX2F0dHJbXSA9IHsKKwlTRU5TT1JfQVRUUl8yKGluMF9pbnB1dCwgU19JUlVHTywgc2hvd19pbiwgTlVMTCwgMCwgMCksCisJU0VOU09SX0FUVFJfMihpbjFfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4sIE5VTEwsIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIoaW4yX2lucHV0LCBTX0lSVUdPLCBzaG93X2luLCBOVUxMLCAwLCAyKSwKKwlTRU5TT1JfQVRUUl8yKGluM19pbnB1dCwgU19JUlVHTywgc2hvd19pbiwgTlVMTCwgMCwgMyksCisJU0VOU09SX0FUVFJfMihpbjRfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4sIE5VTEwsIDAsIDQpLAorCVNFTlNPUl9BVFRSXzIoaW41X2lucHV0LCBTX0lSVUdPLCBzaG93X2luLCBOVUxMLCAwLCA1KSwKKwlTRU5TT1JfQVRUUl8yKGluNl9pbnB1dCwgU19JUlVHTywgc2hvd19pbiwgTlVMTCwgMCwgNiksCisJU0VOU09SX0FUVFJfMihpbjdfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4sIE5VTEwsIDAsIDcpLAorCVNFTlNPUl9BVFRSXzIoaW44X2lucHV0LCBTX0lSVUdPLCBzaG93X2luLCBOVUxMLCAwLCA4KSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAxX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXAsIE5VTEwsIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDFfbWF4LCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9tYXgsCisJCXN0b3JlX3RlbXBfbWF4LCAwLCAxKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAxX21heF9oeXN0LCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9tYXhfaHlzdCwKKwkJc3RvcmVfdGVtcF9tYXhfaHlzdCwgMCwgMSksCisJLyogU2hvdWxkIHJlYWxseSBiZSB0ZW1wMV9tYXhfYWxhcm0sIGJ1dCBvbGRlciB2ZXJzaW9ucyBkaWQgbm90IGhhbmRsZQorCSAgIHRoZSBtYXggYW5kIGNyaXQgYWxhcm1zIHNlcGFyYXRlbHkgYW5kIGxtX3NlbnNvcnMgdjIgZGVwZW5kcyBvbiB0aGUKKwkgICBwcmVzZW5jZSBvZiB0ZW1wI19hbGFybSBmaWxlcy4gVGhlIHNhbWUgZ29lcyBmb3IgdGVtcDIvMyBfYWxhcm0uICovCisJU0VOU09SX0FUVFJfMih0ZW1wMV9hbGFybSwgU19JUlVHTywgc2hvd190ZW1wX2FsYXJtLCBOVUxMLCAwLCAxKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAxX21heF9iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9iZWVwLAorCQlzdG9yZV90ZW1wX2JlZXAsIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDFfY3JpdCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfY3JpdCwKKwkJc3RvcmVfdGVtcF9jcml0LCAwLCAxKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAxX2NyaXRfaHlzdCwgU19JUlVHTywgc2hvd190ZW1wX2NyaXRfaHlzdCwgTlVMTCwKKwkJMCwgMSksCisJU0VOU09SX0FUVFJfMih0ZW1wMV9jcml0X2FsYXJtLCBTX0lSVUdPLCBzaG93X3RlbXBfYWxhcm0sIE5VTEwsIDAsIDUpLAorCVNFTlNPUl9BVFRSXzIodGVtcDFfY3JpdF9iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9iZWVwLAorCQlzdG9yZV90ZW1wX2JlZXAsIDAsIDUpLAorCVNFTlNPUl9BVFRSXzIodGVtcDFfdHlwZSwgU19JUlVHTywgc2hvd190ZW1wX3R5cGUsIE5VTEwsIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDFfZmF1bHQsIFNfSVJVR08sIHNob3dfdGVtcF9mYXVsdCwgTlVMTCwgMCwgMSksCisJU0VOU09SX0FUVFJfMih0ZW1wMl9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wLCBOVUxMLCAwLCAyKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX21heCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfbWF4LAorCQlzdG9yZV90ZW1wX21heCwgMCwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wMl9tYXhfaHlzdCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfbWF4X2h5c3QsCisJCXN0b3JlX3RlbXBfbWF4X2h5c3QsIDAsIDIpLAorCS8qIFNob3VsZCBiZSB0ZW1wMl9tYXhfYWxhcm0sIHNlZSB0ZW1wMV9hbGFybSBub3RlICovCisJU0VOU09SX0FUVFJfMih0ZW1wMl9hbGFybSwgU19JUlVHTywgc2hvd190ZW1wX2FsYXJtLCBOVUxMLCAwLCAyKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX21heF9iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9iZWVwLAorCQlzdG9yZV90ZW1wX2JlZXAsIDAsIDIpLAorCVNFTlNPUl9BVFRSXzIodGVtcDJfY3JpdCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfY3JpdCwKKwkJc3RvcmVfdGVtcF9jcml0LCAwLCAyKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2NyaXRfaHlzdCwgU19JUlVHTywgc2hvd190ZW1wX2NyaXRfaHlzdCwgTlVMTCwKKwkJMCwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wMl9jcml0X2FsYXJtLCBTX0lSVUdPLCBzaG93X3RlbXBfYWxhcm0sIE5VTEwsIDAsIDYpLAorCVNFTlNPUl9BVFRSXzIodGVtcDJfY3JpdF9iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9iZWVwLAorCQlzdG9yZV90ZW1wX2JlZXAsIDAsIDYpLAorCVNFTlNPUl9BVFRSXzIodGVtcDJfdHlwZSwgU19JUlVHTywgc2hvd190ZW1wX3R5cGUsIE5VTEwsIDAsIDIpLAorCVNFTlNPUl9BVFRSXzIodGVtcDJfZmF1bHQsIFNfSVJVR08sIHNob3dfdGVtcF9mYXVsdCwgTlVMTCwgMCwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wM19pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wLCBOVUxMLCAwLCAzKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAzX21heCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfbWF4LAorCQlzdG9yZV90ZW1wX21heCwgMCwgMyksCisJU0VOU09SX0FUVFJfMih0ZW1wM19tYXhfaHlzdCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfbWF4X2h5c3QsCisJCXN0b3JlX3RlbXBfbWF4X2h5c3QsIDAsIDMpLAorCS8qIFNob3VsZCBiZSB0ZW1wM19tYXhfYWxhcm0sIHNlZSB0ZW1wMV9hbGFybSBub3RlICovCisJU0VOU09SX0FUVFJfMih0ZW1wM19hbGFybSwgU19JUlVHTywgc2hvd190ZW1wX2FsYXJtLCBOVUxMLCAwLCAzKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAzX21heF9iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9iZWVwLAorCQlzdG9yZV90ZW1wX2JlZXAsIDAsIDMpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfY3JpdCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfY3JpdCwKKwkJc3RvcmVfdGVtcF9jcml0LCAwLCAzKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAzX2NyaXRfaHlzdCwgU19JUlVHTywgc2hvd190ZW1wX2NyaXRfaHlzdCwgTlVMTCwKKwkJMCwgMyksCisJU0VOU09SX0FUVFJfMih0ZW1wM19jcml0X2FsYXJtLCBTX0lSVUdPLCBzaG93X3RlbXBfYWxhcm0sIE5VTEwsIDAsIDcpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfY3JpdF9iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9iZWVwLAorCQlzdG9yZV90ZW1wX2JlZXAsIDAsIDcpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfdHlwZSwgU19JUlVHTywgc2hvd190ZW1wX3R5cGUsIE5VTEwsIDAsIDMpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfZmF1bHQsIFNfSVJVR08sIHNob3dfdGVtcF9mYXVsdCwgTlVMTCwgMCwgMyksCiB9OwogCi1zdGF0aWMgc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlIGY3MTg4MmZnX2luX3RlbXBfYXR0cltdID0KLXsKLQlTRU5TT1JfQVRUUihpbjBfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4sIE5VTEwsIDApLAotCVNFTlNPUl9BVFRSKGluMV9pbnB1dCwgU19JUlVHTywgc2hvd19pbiwgTlVMTCwgMSksCi0JU0VOU09SX0FUVFIoaW4xX21heCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X2luX21heCwgc3RvcmVfaW5fbWF4LCAxKSwKLQlTRU5TT1JfQVRUUihpbjFfYmVlcCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X2luX2JlZXAsIHN0b3JlX2luX2JlZXAsIDEpLAotCVNFTlNPUl9BVFRSKGluMV9hbGFybSwgU19JUlVHTywgc2hvd19pbl9hbGFybSwgTlVMTCwgMSksCi0JU0VOU09SX0FUVFIoaW4yX2lucHV0LCBTX0lSVUdPLCBzaG93X2luLCBOVUxMLCAyKSwKLQlTRU5TT1JfQVRUUihpbjNfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4sIE5VTEwsIDMpLAotCVNFTlNPUl9BVFRSKGluNF9pbnB1dCwgU19JUlVHTywgc2hvd19pbiwgTlVMTCwgNCksCi0JU0VOU09SX0FUVFIoaW41X2lucHV0LCBTX0lSVUdPLCBzaG93X2luLCBOVUxMLCA1KSwKLQlTRU5TT1JfQVRUUihpbjZfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4sIE5VTEwsIDYpLAotCVNFTlNPUl9BVFRSKGluN19pbnB1dCwgU19JUlVHTywgc2hvd19pbiwgTlVMTCwgNyksCi0JU0VOU09SX0FUVFIoaW44X2lucHV0LCBTX0lSVUdPLCBzaG93X2luLCBOVUxMLCA4KSwKLQlTRU5TT1JfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wLCBOVUxMLCAwKSwKLQlTRU5TT1JfQVRUUih0ZW1wMV9tYXgsIFNfSVJVR098U19JV1VTUiwgc2hvd190ZW1wX21heCwKLQkJc3RvcmVfdGVtcF9tYXgsIDApLAotCVNFTlNPUl9BVFRSKHRlbXAxX21heF9oeXN0LCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9tYXhfaHlzdCwKLQkJc3RvcmVfdGVtcF9tYXhfaHlzdCwgMCksCi0JU0VOU09SX0FUVFIodGVtcDFfY3JpdCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfY3JpdCwKLQkJc3RvcmVfdGVtcF9jcml0LCAwKSwKLQlTRU5TT1JfQVRUUih0ZW1wMV9jcml0X2h5c3QsIFNfSVJVR08sIHNob3dfdGVtcF9jcml0X2h5c3QsIE5VTEwsIDApLAotCVNFTlNPUl9BVFRSKHRlbXAxX3R5cGUsIFNfSVJVR08sIHNob3dfdGVtcF90eXBlLCBOVUxMLCAwKSwKLQlTRU5TT1JfQVRUUih0ZW1wMV9iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9iZWVwLAotCQlzdG9yZV90ZW1wX2JlZXAsIDApLAotCVNFTlNPUl9BVFRSKHRlbXAxX2FsYXJtLCBTX0lSVUdPLCBzaG93X3RlbXBfYWxhcm0sIE5VTEwsIDApLAotCVNFTlNPUl9BVFRSKHRlbXAxX2ZhdWx0LCBTX0lSVUdPLCBzaG93X3RlbXBfZmF1bHQsIE5VTEwsIDApLAotCVNFTlNPUl9BVFRSKHRlbXAyX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXAsIE5VTEwsIDEpLAotCVNFTlNPUl9BVFRSKHRlbXAyX21heCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfbWF4LAotCQlzdG9yZV90ZW1wX21heCwgMSksCi0JU0VOU09SX0FUVFIodGVtcDJfbWF4X2h5c3QsIFNfSVJVR098U19JV1VTUiwgc2hvd190ZW1wX21heF9oeXN0LAotCQlzdG9yZV90ZW1wX21heF9oeXN0LCAxKSwKLQlTRU5TT1JfQVRUUih0ZW1wMl9jcml0LCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9jcml0LAotCQlzdG9yZV90ZW1wX2NyaXQsIDEpLAotCVNFTlNPUl9BVFRSKHRlbXAyX2NyaXRfaHlzdCwgU19JUlVHTywgc2hvd190ZW1wX2NyaXRfaHlzdCwgTlVMTCwgMSksCi0JU0VOU09SX0FUVFIodGVtcDJfdHlwZSwgU19JUlVHTywgc2hvd190ZW1wX3R5cGUsIE5VTEwsIDEpLAotCVNFTlNPUl9BVFRSKHRlbXAyX2JlZXAsIFNfSVJVR098U19JV1VTUiwgc2hvd190ZW1wX2JlZXAsCi0JCXN0b3JlX3RlbXBfYmVlcCwgMSksCi0JU0VOU09SX0FUVFIodGVtcDJfYWxhcm0sIFNfSVJVR08sIHNob3dfdGVtcF9hbGFybSwgTlVMTCwgMSksCi0JU0VOU09SX0FUVFIodGVtcDJfZmF1bHQsIFNfSVJVR08sIHNob3dfdGVtcF9mYXVsdCwgTlVMTCwgMSksCi0JU0VOU09SX0FUVFIodGVtcDNfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcCwgTlVMTCwgMiksCi0JU0VOU09SX0FUVFIodGVtcDNfbWF4LCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9tYXgsCi0JCXN0b3JlX3RlbXBfbWF4LCAyKSwKLQlTRU5TT1JfQVRUUih0ZW1wM19tYXhfaHlzdCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfbWF4X2h5c3QsCi0JCXN0b3JlX3RlbXBfbWF4X2h5c3QsIDIpLAotCVNFTlNPUl9BVFRSKHRlbXAzX2NyaXQsIFNfSVJVR098U19JV1VTUiwgc2hvd190ZW1wX2NyaXQsCi0JCXN0b3JlX3RlbXBfY3JpdCwgMiksCi0JU0VOU09SX0FUVFIodGVtcDNfY3JpdF9oeXN0LCBTX0lSVUdPLCBzaG93X3RlbXBfY3JpdF9oeXN0LCBOVUxMLCAyKSwKLQlTRU5TT1JfQVRUUih0ZW1wM190eXBlLCBTX0lSVUdPLCBzaG93X3RlbXBfdHlwZSwgTlVMTCwgMiksCi0JU0VOU09SX0FUVFIodGVtcDNfYmVlcCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfYmVlcCwKLQkJc3RvcmVfdGVtcF9iZWVwLCAyKSwKLQlTRU5TT1JfQVRUUih0ZW1wM19hbGFybSwgU19JUlVHTywgc2hvd190ZW1wX2FsYXJtLCBOVUxMLCAyKSwKLQlTRU5TT1JfQVRUUih0ZW1wM19mYXVsdCwgU19JUlVHTywgc2hvd190ZW1wX2ZhdWx0LCBOVUxMLCAyKQorLyogVGVtcCBhbmQgaW4gYXR0ciBmb3VuZCBvbmx5IG9uIHRoZSBmNzE4ODJmZyAqLworc3RhdGljIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yIGY3MTg4MmZnX2luX3RlbXBfYXR0cltdID0geworCVNFTlNPUl9BVFRSXzIoaW4xX21heCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X2luX21heCwgc3RvcmVfaW5fbWF4LAorCQkwLCAxKSwKKwlTRU5TT1JfQVRUUl8yKGluMV9iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfaW5fYmVlcCwgc3RvcmVfaW5fYmVlcCwKKwkJMCwgMSksCisJU0VOU09SX0FUVFJfMihpbjFfYWxhcm0sIFNfSVJVR08sIHNob3dfaW5fYWxhcm0sIE5VTEwsIDAsIDEpLAogfTsKIAotc3RhdGljIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSBmNzE4ODJmZ19mYW5fYXR0cltdID0KLXsKLQlTRU5TT1JfQVRUUihmYW4xX2lucHV0LCBTX0lSVUdPLCBzaG93X2ZhbiwgTlVMTCwgMCksCi0JU0VOU09SX0FUVFIoZmFuMV9iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfZmFuX2JlZXAsCi0JCXN0b3JlX2Zhbl9iZWVwLCAwKSwKLQlTRU5TT1JfQVRUUihmYW4xX2FsYXJtLCBTX0lSVUdPLCBzaG93X2Zhbl9hbGFybSwgTlVMTCwgMCksCi0JU0VOU09SX0FUVFIoZmFuMl9pbnB1dCwgU19JUlVHTywgc2hvd19mYW4sIE5VTEwsIDEpLAotCVNFTlNPUl9BVFRSKGZhbjJfYmVlcCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X2Zhbl9iZWVwLAotCQlzdG9yZV9mYW5fYmVlcCwgMSksCi0JU0VOU09SX0FUVFIoZmFuMl9hbGFybSwgU19JUlVHTywgc2hvd19mYW5fYWxhcm0sIE5VTEwsIDEpLAotCVNFTlNPUl9BVFRSKGZhbjNfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuLCBOVUxMLCAyKSwKLQlTRU5TT1JfQVRUUihmYW4zX2JlZXAsIFNfSVJVR098U19JV1VTUiwgc2hvd19mYW5fYmVlcCwKLQkJc3RvcmVfZmFuX2JlZXAsIDIpLAotCVNFTlNPUl9BVFRSKGZhbjNfYWxhcm0sIFNfSVJVR08sIHNob3dfZmFuX2FsYXJtLCBOVUxMLCAyKSwKLQlTRU5TT1JfQVRUUihmYW40X2lucHV0LCBTX0lSVUdPLCBzaG93X2ZhbiwgTlVMTCwgMyksCi0JU0VOU09SX0FUVFIoZmFuNF9iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfZmFuX2JlZXAsCi0JCXN0b3JlX2Zhbl9iZWVwLCAzKSwKLQlTRU5TT1JfQVRUUihmYW40X2FsYXJtLCBTX0lSVUdPLCBzaG93X2Zhbl9hbGFybSwgTlVMTCwgMykKKy8qIFRlbXAgYW5kIGluIGF0dHIgZm9yIHRoZSBmODAwMAorICAgTm90ZSBvbiB0aGUgZjgwMDAgdGVtcF9vdnQgKGNyaXQpIGlzIHVzZWQgYXMgbWF4LCBhbmQgdGVtcF9oaWdoIChtYXgpCisgICBpcyB1c2VkIGFzIGh5c3RlcmVzaXMgdmFsdWUgdG8gY2xlYXIgYWxhcm1zCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiBmODAwMF9pbl90ZW1wX2F0dHJbXSA9IHsKKwlTRU5TT1JfQVRUUl8yKGluMF9pbnB1dCwgU19JUlVHTywgc2hvd19pbiwgTlVMTCwgMCwgMCksCisJU0VOU09SX0FUVFJfMihpbjFfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4sIE5VTEwsIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIoaW4yX2lucHV0LCBTX0lSVUdPLCBzaG93X2luLCBOVUxMLCAwLCAyKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAxX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXAsIE5VTEwsIDAsIDApLAorCVNFTlNPUl9BVFRSXzIodGVtcDFfbWF4LCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9jcml0LAorCQlzdG9yZV90ZW1wX2NyaXQsIDAsIDApLAorCVNFTlNPUl9BVFRSXzIodGVtcDFfbWF4X2h5c3QsIFNfSVJVR098U19JV1VTUiwgc2hvd190ZW1wX21heCwKKwkJc3RvcmVfdGVtcF9tYXgsIDAsIDApLAorCVNFTlNPUl9BVFRSXzIodGVtcDFfYWxhcm0sIFNfSVJVR08sIHNob3dfdGVtcF9hbGFybSwgTlVMTCwgMCwgNCksCisJU0VOU09SX0FUVFJfMih0ZW1wMl9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wLCBOVUxMLCAwLCAxKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX21heCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfY3JpdCwKKwkJc3RvcmVfdGVtcF9jcml0LCAwLCAxKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX21heF9oeXN0LCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9tYXgsCisJCXN0b3JlX3RlbXBfbWF4LCAwLCAxKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2FsYXJtLCBTX0lSVUdPLCBzaG93X3RlbXBfYWxhcm0sIE5VTEwsIDAsIDUpLAorCVNFTlNPUl9BVFRSXzIodGVtcDJfdHlwZSwgU19JUlVHTywgc2hvd190ZW1wX3R5cGUsIE5VTEwsIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcCwgTlVMTCwgMCwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wM19tYXgsIFNfSVJVR098U19JV1VTUiwgc2hvd190ZW1wX2NyaXQsCisJCXN0b3JlX3RlbXBfY3JpdCwgMCwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wM19tYXhfaHlzdCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfbWF4LAorCQlzdG9yZV90ZW1wX21heCwgMCwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wM19hbGFybSwgU19JUlVHTywgc2hvd190ZW1wX2FsYXJtLCBOVUxMLCAwLCA2KSwKIH07CiAKKy8qIEZhbiAvIFBXTSBhdHRyIGNvbW1vbiB0byBhbGwgbW9kZWxzICovCitzdGF0aWMgc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgZnh4eHhfZmFuX2F0dHJbXSA9IHsKKwlTRU5TT1JfQVRUUl8yKGZhbjFfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuLCBOVUxMLCAwLCAwKSwKKwlTRU5TT1JfQVRUUl8yKGZhbjFfZnVsbF9zcGVlZCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X2Zhbl9mdWxsX3NwZWVkLAorCQkgICAgICBzdG9yZV9mYW5fZnVsbF9zcGVlZCwgMCwgMCksCisJU0VOU09SX0FUVFJfMihmYW4xX2FsYXJtLCBTX0lSVUdPLCBzaG93X2Zhbl9hbGFybSwgTlVMTCwgMCwgMCksCisJU0VOU09SX0FUVFJfMihmYW4yX2lucHV0LCBTX0lSVUdPLCBzaG93X2ZhbiwgTlVMTCwgMCwgMSksCisJU0VOU09SX0FUVFJfMihmYW4yX2Z1bGxfc3BlZWQsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19mYW5fZnVsbF9zcGVlZCwKKwkJICAgICAgc3RvcmVfZmFuX2Z1bGxfc3BlZWQsIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIoZmFuMl9hbGFybSwgU19JUlVHTywgc2hvd19mYW5fYWxhcm0sIE5VTEwsIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIoZmFuM19pbnB1dCwgU19JUlVHTywgc2hvd19mYW4sIE5VTEwsIDAsIDIpLAorCVNFTlNPUl9BVFRSXzIoZmFuM19mdWxsX3NwZWVkLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfZmFuX2Z1bGxfc3BlZWQsCisJCSAgICAgIHN0b3JlX2Zhbl9mdWxsX3NwZWVkLCAwLCAyKSwKKwlTRU5TT1JfQVRUUl8yKGZhbjNfYWxhcm0sIFNfSVJVR08sIHNob3dfZmFuX2FsYXJtLCBOVUxMLCAwLCAyKSwKKworCVNFTlNPUl9BVFRSXzIocHdtMSwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3B3bSwgc3RvcmVfcHdtLCAwLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTFfZW5hYmxlLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfcHdtX2VuYWJsZSwKKwkJICAgICAgc3RvcmVfcHdtX2VuYWJsZSwgMCwgMCksCisJU0VOU09SX0FUVFJfMihwd20xX2ludGVycG9sYXRlLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2ludGVycG9sYXRlLCBzdG9yZV9wd21faW50ZXJwb2xhdGUsIDAsIDApLAorCVNFTlNPUl9BVFRSXzIocHdtMV9hdXRvX2NoYW5uZWxzX3RlbXAsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9jaGFubmVsLAorCQkgICAgICBzdG9yZV9wd21fYXV0b19wb2ludF9jaGFubmVsLCAwLCAwKSwKKworCVNFTlNPUl9BVFRSXzIocHdtMiwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3B3bSwgc3RvcmVfcHdtLCAwLCAxKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTJfZW5hYmxlLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfcHdtX2VuYWJsZSwKKwkJICAgICAgc3RvcmVfcHdtX2VuYWJsZSwgMCwgMSksCisJU0VOU09SX0FUVFJfMihwd20yX2ludGVycG9sYXRlLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2ludGVycG9sYXRlLCBzdG9yZV9wd21faW50ZXJwb2xhdGUsIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIocHdtMl9hdXRvX2NoYW5uZWxzX3RlbXAsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9jaGFubmVsLAorCQkgICAgICBzdG9yZV9wd21fYXV0b19wb2ludF9jaGFubmVsLCAwLCAxKSwKKworCVNFTlNPUl9BVFRSXzIocHdtM19pbnRlcnBvbGF0ZSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9pbnRlcnBvbGF0ZSwgc3RvcmVfcHdtX2ludGVycG9sYXRlLCAwLCAyKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTNfYXV0b19jaGFubmVsc190ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfY2hhbm5lbCwKKwkJICAgICAgc3RvcmVfcHdtX2F1dG9fcG9pbnRfY2hhbm5lbCwgMCwgMiksCit9OworCisvKiBGYW4gLyBQV00gYXR0ciBmb3IgdGhlIGY3MTg2MmZnLCBsZXNzIHB3bXMgYW5kIGxlc3Mgem9uZXMgcGVyIHB3bSB0aGFuIHRoZQorICAgZjcxODgyZmcgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiBmNzE4NjJmZ19mYW5fYXR0cltdID0geworCVNFTlNPUl9BVFRSXzIoZmFuMV9iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfZmFuX2JlZXAsCisJCXN0b3JlX2Zhbl9iZWVwLCAwLCAwKSwKKwlTRU5TT1JfQVRUUl8yKGZhbjJfYmVlcCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X2Zhbl9iZWVwLAorCQlzdG9yZV9mYW5fYmVlcCwgMCwgMSksCisJU0VOU09SX0FUVFJfMihmYW4zX2JlZXAsIFNfSVJVR098U19JV1VTUiwgc2hvd19mYW5fYmVlcCwKKwkJc3RvcmVfZmFuX2JlZXAsIDAsIDIpLAorCisJU0VOU09SX0FUVFJfMihwd20xX2F1dG9fcG9pbnQxX3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICAxLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTFfYXV0b19wb2ludDJfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCisJCSAgICAgIDQsIDApLAorCVNFTlNPUl9BVFRSXzIocHdtMV9hdXRvX3BvaW50MV90ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMCwgMCksCisJU0VOU09SX0FUVFJfMihwd20xX2F1dG9fcG9pbnQyX3RlbXAsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wLCBzdG9yZV9wd21fYXV0b19wb2ludF90ZW1wLAorCQkgICAgICAzLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTFfYXV0b19wb2ludDFfdGVtcF9oeXN0LCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LAorCQkgICAgICBzdG9yZV9wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsCisJCSAgICAgIDAsIDApLAorCVNFTlNPUl9BVFRSXzIocHdtMV9hdXRvX3BvaW50Ml90ZW1wX2h5c3QsIFNfSVJVR08sCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LCBOVUxMLCAzLCAwKSwKKworCVNFTlNPUl9BVFRSXzIocHdtMl9hdXRvX3BvaW50MV9wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgMSwgMSksCisJU0VOU09SX0FUVFJfMihwd20yX2F1dG9fcG9pbnQyX3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICA0LCAxKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTJfYXV0b19wb2ludDFfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAsIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXAsCisJCSAgICAgIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIocHdtMl9hdXRvX3BvaW50Ml90ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMywgMSksCisJU0VOU09SX0FUVFJfMihwd20yX2F1dG9fcG9pbnQxX3RlbXBfaHlzdCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwKKwkJICAgICAgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LAorCQkgICAgICAwLCAxKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTJfYXV0b19wb2ludDJfdGVtcF9oeXN0LCBTX0lSVUdPLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwgTlVMTCwgMywgMSksCisKKwlTRU5TT1JfQVRUUl8yKHB3bTMsIFNfSVJVR098U19JV1VTUiwgc2hvd19wd20sIHN0b3JlX3B3bSwgMCwgMiksCisJU0VOU09SX0FUVFJfMihwd20zX2VuYWJsZSwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3B3bV9lbmFibGUsCisJCSAgICAgIHN0b3JlX3B3bV9lbmFibGUsIDAsIDIpLAorCVNFTlNPUl9BVFRSXzIocHdtM19hdXRvX3BvaW50MV9wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgMSwgMiksCisJU0VOU09SX0FUVFJfMihwd20zX2F1dG9fcG9pbnQyX3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICA0LCAyKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTNfYXV0b19wb2ludDFfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAsIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXAsCisJCSAgICAgIDAsIDIpLAorCVNFTlNPUl9BVFRSXzIocHdtM19hdXRvX3BvaW50Ml90ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMywgMiksCisJU0VOU09SX0FUVFJfMihwd20zX2F1dG9fcG9pbnQxX3RlbXBfaHlzdCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwKKwkJICAgICAgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LAorCQkgICAgICAwLCAyKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTNfYXV0b19wb2ludDJfdGVtcF9oeXN0LCBTX0lSVUdPLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwgTlVMTCwgMywgMiksCit9OworCisvKiBGYW4gLyBQV00gYXR0ciBmb3IgdGhlIGY3MTg4MmZnICovCitzdGF0aWMgc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgZjcxODgyZmdfZmFuX2F0dHJbXSA9IHsKKwlTRU5TT1JfQVRUUl8yKGZhbjFfYmVlcCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X2Zhbl9iZWVwLAorCQlzdG9yZV9mYW5fYmVlcCwgMCwgMCksCisJU0VOU09SX0FUVFJfMihmYW4yX2JlZXAsIFNfSVJVR098U19JV1VTUiwgc2hvd19mYW5fYmVlcCwKKwkJc3RvcmVfZmFuX2JlZXAsIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIoZmFuM19iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfZmFuX2JlZXAsCisJCXN0b3JlX2Zhbl9iZWVwLCAwLCAyKSwKKwlTRU5TT1JfQVRUUl8yKGZhbjRfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuLCBOVUxMLCAwLCAzKSwKKwlTRU5TT1JfQVRUUl8yKGZhbjRfZnVsbF9zcGVlZCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X2Zhbl9mdWxsX3NwZWVkLAorCQkgICAgICBzdG9yZV9mYW5fZnVsbF9zcGVlZCwgMCwgMyksCisJU0VOU09SX0FUVFJfMihmYW40X2JlZXAsIFNfSVJVR098U19JV1VTUiwgc2hvd19mYW5fYmVlcCwKKwkJc3RvcmVfZmFuX2JlZXAsIDAsIDMpLAorCVNFTlNPUl9BVFRSXzIoZmFuNF9hbGFybSwgU19JUlVHTywgc2hvd19mYW5fYWxhcm0sIE5VTEwsIDAsIDMpLAorCisJU0VOU09SX0FUVFJfMihwd20xX2F1dG9fcG9pbnQxX3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICAwLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTFfYXV0b19wb2ludDJfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCisJCSAgICAgIDEsIDApLAorCVNFTlNPUl9BVFRSXzIocHdtMV9hdXRvX3BvaW50M19wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgMiwgMCksCisJU0VOU09SX0FUVFJfMihwd20xX2F1dG9fcG9pbnQ0X3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICAzLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTFfYXV0b19wb2ludDVfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCisJCSAgICAgIDQsIDApLAorCVNFTlNPUl9BVFRSXzIocHdtMV9hdXRvX3BvaW50MV90ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMCwgMCksCisJU0VOU09SX0FUVFJfMihwd20xX2F1dG9fcG9pbnQyX3RlbXAsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wLCBzdG9yZV9wd21fYXV0b19wb2ludF90ZW1wLAorCQkgICAgICAxLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTFfYXV0b19wb2ludDNfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAsIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXAsCisJCSAgICAgIDIsIDApLAorCVNFTlNPUl9BVFRSXzIocHdtMV9hdXRvX3BvaW50NF90ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMywgMCksCisJU0VOU09SX0FUVFJfMihwd20xX2F1dG9fcG9pbnQxX3RlbXBfaHlzdCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwKKwkJICAgICAgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LAorCQkgICAgICAwLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTFfYXV0b19wb2ludDJfdGVtcF9oeXN0LCBTX0lSVUdPLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwgTlVMTCwgMSwgMCksCisJU0VOU09SX0FUVFJfMihwd20xX2F1dG9fcG9pbnQzX3RlbXBfaHlzdCwgU19JUlVHTywKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsIE5VTEwsIDIsIDApLAorCVNFTlNPUl9BVFRSXzIocHdtMV9hdXRvX3BvaW50NF90ZW1wX2h5c3QsIFNfSVJVR08sCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LCBOVUxMLCAzLCAwKSwKKworCVNFTlNPUl9BVFRSXzIocHdtMl9hdXRvX3BvaW50MV9wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgMCwgMSksCisJU0VOU09SX0FUVFJfMihwd20yX2F1dG9fcG9pbnQyX3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICAxLCAxKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTJfYXV0b19wb2ludDNfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCisJCSAgICAgIDIsIDEpLAorCVNFTlNPUl9BVFRSXzIocHdtMl9hdXRvX3BvaW50NF9wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgMywgMSksCisJU0VOU09SX0FUVFJfMihwd20yX2F1dG9fcG9pbnQ1X3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICA0LCAxKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTJfYXV0b19wb2ludDFfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAsIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXAsCisJCSAgICAgIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIocHdtMl9hdXRvX3BvaW50Ml90ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMSwgMSksCisJU0VOU09SX0FUVFJfMihwd20yX2F1dG9fcG9pbnQzX3RlbXAsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wLCBzdG9yZV9wd21fYXV0b19wb2ludF90ZW1wLAorCQkgICAgICAyLCAxKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTJfYXV0b19wb2ludDRfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAsIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXAsCisJCSAgICAgIDMsIDEpLAorCVNFTlNPUl9BVFRSXzIocHdtMl9hdXRvX3BvaW50MV90ZW1wX2h5c3QsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsCisJCSAgICAgIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwKKwkJICAgICAgMCwgMSksCisJU0VOU09SX0FUVFJfMihwd20yX2F1dG9fcG9pbnQyX3RlbXBfaHlzdCwgU19JUlVHTywKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsIE5VTEwsIDEsIDEpLAorCVNFTlNPUl9BVFRSXzIocHdtMl9hdXRvX3BvaW50M190ZW1wX2h5c3QsIFNfSVJVR08sCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LCBOVUxMLCAyLCAxKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTJfYXV0b19wb2ludDRfdGVtcF9oeXN0LCBTX0lSVUdPLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwgTlVMTCwgMywgMSksCisKKwlTRU5TT1JfQVRUUl8yKHB3bTMsIFNfSVJVR098U19JV1VTUiwgc2hvd19wd20sIHN0b3JlX3B3bSwgMCwgMiksCisJU0VOU09SX0FUVFJfMihwd20zX2VuYWJsZSwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3B3bV9lbmFibGUsCisJCSAgICAgIHN0b3JlX3B3bV9lbmFibGUsIDAsIDIpLAorCVNFTlNPUl9BVFRSXzIocHdtM19hdXRvX3BvaW50MV9wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgMCwgMiksCisJU0VOU09SX0FUVFJfMihwd20zX2F1dG9fcG9pbnQyX3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICAxLCAyKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTNfYXV0b19wb2ludDNfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCisJCSAgICAgIDIsIDIpLAorCVNFTlNPUl9BVFRSXzIocHdtM19hdXRvX3BvaW50NF9wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgMywgMiksCisJU0VOU09SX0FUVFJfMihwd20zX2F1dG9fcG9pbnQ1X3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICA0LCAyKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTNfYXV0b19wb2ludDFfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAsIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXAsCisJCSAgICAgIDAsIDIpLAorCVNFTlNPUl9BVFRSXzIocHdtM19hdXRvX3BvaW50Ml90ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMSwgMiksCisJU0VOU09SX0FUVFJfMihwd20zX2F1dG9fcG9pbnQzX3RlbXAsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wLCBzdG9yZV9wd21fYXV0b19wb2ludF90ZW1wLAorCQkgICAgICAyLCAyKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTNfYXV0b19wb2ludDRfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAsIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXAsCisJCSAgICAgIDMsIDIpLAorCVNFTlNPUl9BVFRSXzIocHdtM19hdXRvX3BvaW50MV90ZW1wX2h5c3QsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsCisJCSAgICAgIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwKKwkJICAgICAgMCwgMiksCisJU0VOU09SX0FUVFJfMihwd20zX2F1dG9fcG9pbnQyX3RlbXBfaHlzdCwgU19JUlVHTywKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsIE5VTEwsIDEsIDIpLAorCVNFTlNPUl9BVFRSXzIocHdtM19hdXRvX3BvaW50M190ZW1wX2h5c3QsIFNfSVJVR08sCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LCBOVUxMLCAyLCAyKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTNfYXV0b19wb2ludDRfdGVtcF9oeXN0LCBTX0lSVUdPLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwgTlVMTCwgMywgMiksCisKKwlTRU5TT1JfQVRUUl8yKHB3bTQsIFNfSVJVR098U19JV1VTUiwgc2hvd19wd20sIHN0b3JlX3B3bSwgMCwgMyksCisJU0VOU09SX0FUVFJfMihwd200X2VuYWJsZSwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3B3bV9lbmFibGUsCisJCSAgICAgIHN0b3JlX3B3bV9lbmFibGUsIDAsIDMpLAorCVNFTlNPUl9BVFRSXzIocHdtNF9pbnRlcnBvbGF0ZSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9pbnRlcnBvbGF0ZSwgc3RvcmVfcHdtX2ludGVycG9sYXRlLCAwLCAzKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTRfYXV0b19jaGFubmVsc190ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfY2hhbm5lbCwKKwkJICAgICAgc3RvcmVfcHdtX2F1dG9fcG9pbnRfY2hhbm5lbCwgMCwgMyksCisJU0VOU09SX0FUVFJfMihwd200X2F1dG9fcG9pbnQxX3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICAwLCAzKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTRfYXV0b19wb2ludDJfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCisJCSAgICAgIDEsIDMpLAorCVNFTlNPUl9BVFRSXzIocHdtNF9hdXRvX3BvaW50M19wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgMiwgMyksCisJU0VOU09SX0FUVFJfMihwd200X2F1dG9fcG9pbnQ0X3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICAzLCAzKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTRfYXV0b19wb2ludDVfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCisJCSAgICAgIDQsIDMpLAorCVNFTlNPUl9BVFRSXzIocHdtNF9hdXRvX3BvaW50MV90ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMCwgMyksCisJU0VOU09SX0FUVFJfMihwd200X2F1dG9fcG9pbnQyX3RlbXAsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wLCBzdG9yZV9wd21fYXV0b19wb2ludF90ZW1wLAorCQkgICAgICAxLCAzKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTRfYXV0b19wb2ludDNfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAsIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXAsCisJCSAgICAgIDIsIDMpLAorCVNFTlNPUl9BVFRSXzIocHdtNF9hdXRvX3BvaW50NF90ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMywgMyksCisJU0VOU09SX0FUVFJfMihwd200X2F1dG9fcG9pbnQxX3RlbXBfaHlzdCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwKKwkJICAgICAgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LAorCQkgICAgICAwLCAzKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTRfYXV0b19wb2ludDJfdGVtcF9oeXN0LCBTX0lSVUdPLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwgTlVMTCwgMSwgMyksCisJU0VOU09SX0FUVFJfMihwd200X2F1dG9fcG9pbnQzX3RlbXBfaHlzdCwgU19JUlVHTywKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsIE5VTEwsIDIsIDMpLAorCVNFTlNPUl9BVFRSXzIocHdtNF9hdXRvX3BvaW50NF90ZW1wX2h5c3QsIFNfSVJVR08sCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LCBOVUxMLCAzLCAzKSwKK307CisKKy8qIEZhbiAvIFBXTSBhdHRyIGZvciB0aGUgZjgwMDAsIHpvbmVzIG1hcHBlZCB0byB0ZW1wIGluc3RlYWQgb2YgdG8gcHdtIQorICAgQWxzbyB0aGUgcmVnaXN0ZXIgYmxvY2sgYXQgb2Zmc2V0IEEwIG1hcHMgdG8gVEVNUDEgKHNvIG91ciB0ZW1wMiwgYXMgdGhlCisgICBGODAwMCBzdGFydHMgY291bnRpbmcgdGVtcHMgYXQgMCksIEIwIG1hcHMgdGhlIFRFTVAyIGFuZCBDMCBtYXBzIHRvIFRFTVAwICovCitzdGF0aWMgc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgZjgwMDBfZmFuX2F0dHJbXSA9IHsKKwlTRU5TT1JfQVRUUl8yKGZhbjRfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuLCBOVUxMLCAwLCAzKSwKKworCVNFTlNPUl9BVFRSXzIocHdtMywgU19JUlVHTywgc2hvd19wd20sIE5VTEwsIDAsIDIpLAorCisJU0VOU09SX0FUVFJfMih0ZW1wMV9hdXRvX3BvaW50MV9wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgMCwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wMV9hdXRvX3BvaW50Ml9wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgMSwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wMV9hdXRvX3BvaW50M19wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgMiwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wMV9hdXRvX3BvaW50NF9wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgMywgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wMV9hdXRvX3BvaW50NV9wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgNCwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wMV9hdXRvX3BvaW50MV90ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMCwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wMV9hdXRvX3BvaW50Ml90ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMSwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wMV9hdXRvX3BvaW50M190ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMiwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wMV9hdXRvX3BvaW50NF90ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMywgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wMV9hdXRvX3BvaW50MV90ZW1wX2h5c3QsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsCisJCSAgICAgIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwKKwkJICAgICAgMCwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wMV9hdXRvX3BvaW50Ml90ZW1wX2h5c3QsIFNfSVJVR08sCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LCBOVUxMLCAxLCAyKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAxX2F1dG9fcG9pbnQzX3RlbXBfaHlzdCwgU19JUlVHTywKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsIE5VTEwsIDIsIDIpLAorCVNFTlNPUl9BVFRSXzIodGVtcDFfYXV0b19wb2ludDRfdGVtcF9oeXN0LCBTX0lSVUdPLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwgTlVMTCwgMywgMiksCisKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2F1dG9fcG9pbnQxX3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICAwLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2F1dG9fcG9pbnQyX3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICAxLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2F1dG9fcG9pbnQzX3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICAyLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2F1dG9fcG9pbnQ0X3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICAzLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2F1dG9fcG9pbnQ1X3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICA0LCAwKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2F1dG9fcG9pbnQxX3RlbXAsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wLCBzdG9yZV9wd21fYXV0b19wb2ludF90ZW1wLAorCQkgICAgICAwLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2F1dG9fcG9pbnQyX3RlbXAsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wLCBzdG9yZV9wd21fYXV0b19wb2ludF90ZW1wLAorCQkgICAgICAxLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2F1dG9fcG9pbnQzX3RlbXAsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wLCBzdG9yZV9wd21fYXV0b19wb2ludF90ZW1wLAorCQkgICAgICAyLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2F1dG9fcG9pbnQ0X3RlbXAsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wLCBzdG9yZV9wd21fYXV0b19wb2ludF90ZW1wLAorCQkgICAgICAzLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2F1dG9fcG9pbnQxX3RlbXBfaHlzdCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwKKwkJICAgICAgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LAorCQkgICAgICAwLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2F1dG9fcG9pbnQyX3RlbXBfaHlzdCwgU19JUlVHTywKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsIE5VTEwsIDEsIDApLAorCVNFTlNPUl9BVFRSXzIodGVtcDJfYXV0b19wb2ludDNfdGVtcF9oeXN0LCBTX0lSVUdPLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwgTlVMTCwgMiwgMCksCisJU0VOU09SX0FUVFJfMih0ZW1wMl9hdXRvX3BvaW50NF90ZW1wX2h5c3QsIFNfSVJVR08sCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LCBOVUxMLCAzLCAwKSwKKworCVNFTlNPUl9BVFRSXzIodGVtcDNfYXV0b19wb2ludDFfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCisJCSAgICAgIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfYXV0b19wb2ludDJfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCisJCSAgICAgIDEsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfYXV0b19wb2ludDNfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCisJCSAgICAgIDIsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfYXV0b19wb2ludDRfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCisJCSAgICAgIDMsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfYXV0b19wb2ludDVfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCisJCSAgICAgIDQsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfYXV0b19wb2ludDFfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAsIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXAsCisJCSAgICAgIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfYXV0b19wb2ludDJfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAsIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXAsCisJCSAgICAgIDEsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfYXV0b19wb2ludDNfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAsIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXAsCisJCSAgICAgIDIsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfYXV0b19wb2ludDRfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAsIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXAsCisJCSAgICAgIDMsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfYXV0b19wb2ludDFfdGVtcF9oeXN0LCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LAorCQkgICAgICBzdG9yZV9wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsCisJCSAgICAgIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfYXV0b19wb2ludDJfdGVtcF9oeXN0LCBTX0lSVUdPLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwgTlVMTCwgMSwgMSksCisJU0VOU09SX0FUVFJfMih0ZW1wM19hdXRvX3BvaW50M190ZW1wX2h5c3QsIFNfSVJVR08sCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LCBOVUxMLCAyLCAxKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAzX2F1dG9fcG9pbnQ0X3RlbXBfaHlzdCwgU19JUlVHTywKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsIE5VTEwsIDMsIDEpLAorfTsKIAogLyogU3VwZXIgSS9PIGZ1bmN0aW9ucyAqLwogc3RhdGljIGlubGluZSBpbnQgc3VwZXJpb19pbmIoaW50IGJhc2UsIGludCByZWcpCkBAIC0yOTksMTEgKzgxMSwxNiBAQAogCW91dGIoU0lPX0xPQ0tfS0VZLCBiYXNlKTsKIH0KIAotc3RhdGljIGlubGluZSB1MTYgZmFuX2Zyb21fcmVnKHUxNiByZWcpCitzdGF0aWMgaW5saW5lIGludCBmYW5fZnJvbV9yZWcodTE2IHJlZykKIHsKIAlyZXR1cm4gcmVnID8gKDE1MDAwMDAgLyByZWcpIDogMDsKIH0KIAorc3RhdGljIGlubGluZSB1MTYgZmFuX3RvX3JlZyhpbnQgZmFuKQoreworCXJldHVybiBmYW4gPyAoMTUwMDAwMCAvIGZhbikgOiAwOworfQorCiBzdGF0aWMgdTggZjcxODgyZmdfcmVhZDgoc3RydWN0IGY3MTg4MmZnX2RhdGEgKmRhdGEsIHU4IHJlZykKIHsKIAl1OCB2YWw7CkBAIC0zMzIsNTIgKzg0OSwxMTEgQEAKIAlvdXRiKHZhbCwgZGF0YS0+YWRkciArIERBVEFfUkVHX09GRlNFVCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZjcxODgyZmdfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICogZGV2KQorc3RhdGljIHZvaWQgZjcxODgyZmdfd3JpdGUxNihzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSwgdTggcmVnLCB1MTYgdmFsKQoreworCW91dGIocmVnKyssIGRhdGEtPmFkZHIgKyBBRERSX1JFR19PRkZTRVQpOworCW91dGIodmFsID4+IDgsIGRhdGEtPmFkZHIgKyBEQVRBX1JFR19PRkZTRVQpOworCW91dGIocmVnLCBkYXRhLT5hZGRyICsgQUREUl9SRUdfT0ZGU0VUKTsKKwlvdXRiKHZhbCAmIDI1NSwgZGF0YS0+YWRkciArIERBVEFfUkVHX09GRlNFVCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZjcxODgyZmdfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGY3MTg4MmZnX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlpbnQgbnIsIHJlZywgcmVnMjsKKwlpbnQgbnIsIHJlZyA9IDAsIHJlZzI7CisJaW50IG5yX2ZhbnMgPSAoZGF0YS0+dHlwZSA9PSBmNzE4ODJmZykgPyA0IDogMzsKKwlpbnQgbnJfaW5zID0gKGRhdGEtPnR5cGUgPT0gZjgwMDApID8gMyA6IDk7CisJaW50IHRlbXBfc3RhcnQgPSAoZGF0YS0+dHlwZSA9PSBmODAwMCkgPyAwIDogMTsKIAogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAogCS8qIFVwZGF0ZSBvbmNlIGV2ZXJ5IDYwIHNlY29uZHMgKi8KIAlpZiAoIHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF9saW1pdHMgKyA2MCAqIEhaICkgfHwKIAkJCSFkYXRhLT52YWxpZCkgewotCQlkYXRhLT5pbjFfbWF4ID0gZjcxODgyZmdfcmVhZDgoZGF0YSwgRjcxODgyRkdfUkVHX0lOMV9ISUdIKTsKLQkJZGF0YS0+aW5fYmVlcCA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsIEY3MTg4MkZHX1JFR19JTl9CRUVQKTsKKwkJaWYgKGRhdGEtPnR5cGUgPT0gZjcxODgyZmcpIHsKKwkJCWRhdGEtPmluMV9tYXggPQorCQkJCWY3MTg4MmZnX3JlYWQ4KGRhdGEsIEY3MTg4MkZHX1JFR19JTjFfSElHSCk7CisJCQlkYXRhLT5pbl9iZWVwID0KKwkJCQlmNzE4ODJmZ19yZWFkOChkYXRhLCBGNzE4ODJGR19SRUdfSU5fQkVFUCk7CisJCX0KIAogCQkvKiBHZXQgSGlnaCAmIGJvdW5kYXJ5IHRlbXBzKi8KLQkJZm9yIChuciA9IDA7IG5yIDwgMzsgbnIrKykgeworCQlmb3IgKG5yID0gdGVtcF9zdGFydDsgbnIgPCAzICsgdGVtcF9zdGFydDsgbnIrKykgewogCQkJZGF0YS0+dGVtcF9vdnRbbnJdID0gZjcxODgyZmdfcmVhZDgoZGF0YSwKIAkJCQkJCUY3MTg4MkZHX1JFR19URU1QX09WVChucikpOwogCQkJZGF0YS0+dGVtcF9oaWdoW25yXSA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsCiAJCQkJCQlGNzE4ODJGR19SRUdfVEVNUF9ISUdIKG5yKSk7CiAJCX0KIAotCQkvKiBIYXZlIHRvIGhhcmRjb2RlIGh5c3QqLwotCQlkYXRhLT50ZW1wX2h5c3RbMF0gPSBmNzE4ODJmZ19yZWFkOChkYXRhLAotCQkJCQkJRjcxODgyRkdfUkVHX1RFTVBfSFlTVDEpID4+IDQ7Ci0JCS8qIEh5c3QgdGVtcHMgMiAmIDMgc3RvcmVkIGluIHNhbWUgcmVnaXN0ZXIgKi8KLQkJcmVnID0gZjcxODgyZmdfcmVhZDgoZGF0YSwgRjcxODgyRkdfUkVHX1RFTVBfSFlTVDIzKTsKLQkJZGF0YS0+dGVtcF9oeXN0WzFdID0gcmVnICYgMHgwRjsKLQkJZGF0YS0+dGVtcF9oeXN0WzJdID0gcmVnID4+IDQ7Ci0KLQkJLyogSGF2ZSB0byBoYXJkY29kZSB0eXBlLCBiZWNhdXNlIHRlbXAxIGlzIHNwZWNpYWwgKi8KLQkJcmVnICA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsIEY3MTg4MkZHX1JFR19URU1QX1RZUEUpOworCQlpZiAoZGF0YS0+dHlwZSAhPSBmODAwMCkgeworCQkJZGF0YS0+ZmFuX2JlZXAgPSBmNzE4ODJmZ19yZWFkOChkYXRhLAorCQkJCQkJRjcxODgyRkdfUkVHX0ZBTl9CRUVQKTsKKwkJCWRhdGEtPnRlbXBfYmVlcCA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsCisJCQkJCQlGNzE4ODJGR19SRUdfVEVNUF9CRUVQKTsKKwkJCWRhdGEtPnRlbXBfaHlzdFswXSA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsCisJCQkJCQlGNzE4ODJGR19SRUdfVEVNUF9IWVNUKDApKTsKKwkJCWRhdGEtPnRlbXBfaHlzdFsxXSA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsCisJCQkJCQlGNzE4ODJGR19SRUdfVEVNUF9IWVNUKDEpKTsKKwkJCS8qIEhhdmUgdG8gaGFyZGNvZGUgdHlwZSwgYmVjYXVzZSB0ZW1wMSBpcyBzcGVjaWFsICovCisJCQlyZWcgID0gZjcxODgyZmdfcmVhZDgoZGF0YSwgRjcxODgyRkdfUkVHX1RFTVBfVFlQRSk7CisJCQlkYXRhLT50ZW1wX3R5cGVbMl0gPSAocmVnICYgMHgwNCkgPyAyIDogNDsKKwkJCWRhdGEtPnRlbXBfdHlwZVszXSA9IChyZWcgJiAweDA4KSA/IDIgOiA0OworCQl9CiAJCXJlZzIgPSBmNzE4ODJmZ19yZWFkOChkYXRhLCBGNzE4ODJGR19SRUdfUEVDSSk7CiAJCWlmICgocmVnMiAmIDB4MDMpID09IDB4MDEpCi0JCQlkYXRhLT50ZW1wX3R5cGVbMF0gPSA2IC8qIFBFQ0kgKi87CisJCQlkYXRhLT50ZW1wX3R5cGVbMV0gPSA2IC8qIFBFQ0kgKi87CiAJCWVsc2UgaWYgKChyZWcyICYgMHgwMykgPT0gMHgwMikKLQkJCWRhdGEtPnRlbXBfdHlwZVswXSA9IDUgLyogQU1EU0kgKi87CisJCQlkYXRhLT50ZW1wX3R5cGVbMV0gPSA1IC8qIEFNRFNJICovOworCQllbHNlIGlmIChkYXRhLT50eXBlICE9IGY4MDAwKQorCQkJZGF0YS0+dGVtcF90eXBlWzFdID0gKHJlZyAmIDB4MDIpID8gMiA6IDQ7CiAJCWVsc2UKLQkJCWRhdGEtPnRlbXBfdHlwZVswXSA9IChyZWcgJiAweDAyKSA/IDIgOiA0OworCQkJZGF0YS0+dGVtcF90eXBlWzFdID0gMjsgLyogRjgwMDAgb25seSBzdXBwb3J0cyBCSlQgKi8KIAotCQlkYXRhLT50ZW1wX3R5cGVbMV0gPSAocmVnICYgMHgwNCkgPyAyIDogNDsKLQkJZGF0YS0+dGVtcF90eXBlWzJdID0gKHJlZyAmIDB4MDgpID8gMiA6IDQ7CisJCWRhdGEtPnB3bV9lbmFibGUgPSBmNzE4ODJmZ19yZWFkOChkYXRhLAorCQkJCQkJICBGNzE4ODJGR19SRUdfUFdNX0VOQUJMRSk7CisJCWRhdGEtPnB3bV9hdXRvX3BvaW50X2h5c3RbMF0gPQorCQkJZjcxODgyZmdfcmVhZDgoZGF0YSwgRjcxODgyRkdfUkVHX0ZBTl9IWVNUKDApKTsKKwkJZGF0YS0+cHdtX2F1dG9fcG9pbnRfaHlzdFsxXSA9CisJCQlmNzE4ODJmZ19yZWFkOChkYXRhLCBGNzE4ODJGR19SRUdfRkFOX0hZU1QoMSkpOwogCi0JCWRhdGEtPnRlbXBfYmVlcCA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsIEY3MTg4MkZHX1JFR19URU1QX0JFRVApOworCQlmb3IgKG5yID0gMDsgbnIgPCBucl9mYW5zOyBucisrKSB7CisJCQlkYXRhLT5wd21fYXV0b19wb2ludF9tYXBwaW5nW25yXSA9CisJCQkgICAgZjcxODgyZmdfcmVhZDgoZGF0YSwKKwkJCQkJICAgRjcxODgyRkdfUkVHX1BPSU5UX01BUFBJTkcobnIpKTsKIAotCQlkYXRhLT5mYW5fYmVlcCA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsIEY3MTg4MkZHX1JFR19GQU5fQkVFUCk7Ci0KKwkJCWlmIChkYXRhLT50eXBlICE9IGY3MTg2MmZnKSB7CisJCQkJaW50IHBvaW50OworCQkJCWZvciAocG9pbnQgPSAwOyBwb2ludCA8IDU7IHBvaW50KyspIHsKKwkJCQkJZGF0YS0+cHdtX2F1dG9fcG9pbnRfcHdtW25yXVtwb2ludF0gPQorCQkJCQkJZjcxODgyZmdfcmVhZDgoZGF0YSwKKwkJCQkJCQlGNzE4ODJGR19SRUdfUE9JTlRfUFdNCisJCQkJCQkJKG5yLCBwb2ludCkpOworCQkJCX0KKwkJCQlmb3IgKHBvaW50ID0gMDsgcG9pbnQgPCA0OyBwb2ludCsrKSB7CisJCQkJCWRhdGEtPnB3bV9hdXRvX3BvaW50X3RlbXBbbnJdW3BvaW50XSA9CisJCQkJCQlmNzE4ODJmZ19yZWFkOChkYXRhLAorCQkJCQkJCUY3MTg4MkZHX1JFR19QT0lOVF9URU1QCisJCQkJCQkJKG5yLCBwb2ludCkpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJZGF0YS0+cHdtX2F1dG9fcG9pbnRfcHdtW25yXVsxXSA9CisJCQkJCWY3MTg4MmZnX3JlYWQ4KGRhdGEsCisJCQkJCQlGNzE4ODJGR19SRUdfUE9JTlRfUFdNCisJCQkJCQkobnIsIDEpKTsKKwkJCQlkYXRhLT5wd21fYXV0b19wb2ludF9wd21bbnJdWzRdID0KKwkJCQkJZjcxODgyZmdfcmVhZDgoZGF0YSwKKwkJCQkJCUY3MTg4MkZHX1JFR19QT0lOVF9QV00KKwkJCQkJCShuciwgNCkpOworCQkJCWRhdGEtPnB3bV9hdXRvX3BvaW50X3RlbXBbbnJdWzBdID0KKwkJCQkJZjcxODgyZmdfcmVhZDgoZGF0YSwKKwkJCQkJCUY3MTg4MkZHX1JFR19QT0lOVF9URU1QCisJCQkJCQkobnIsIDApKTsKKwkJCQlkYXRhLT5wd21fYXV0b19wb2ludF90ZW1wW25yXVszXSA9CisJCQkJCWY3MTg4MmZnX3JlYWQ4KGRhdGEsCisJCQkJCQlGNzE4ODJGR19SRUdfUE9JTlRfVEVNUAorCQkJCQkJKG5yLCAzKSk7CisJCQl9CisJCX0KIAkJZGF0YS0+bGFzdF9saW1pdHMgPSBqaWZmaWVzOwogCX0KIApAQCAtMzg3LDE5ICs5NjMsMzIgQEAKIAkJCQkJCUY3MTg4MkZHX1JFR19URU1QX1NUQVRVUyk7CiAJCWRhdGEtPnRlbXBfZGlvZGVfb3BlbiA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsCiAJCQkJCQlGNzE4ODJGR19SRUdfVEVNUF9ESU9ERV9PUEVOKTsKLQkJZm9yIChuciA9IDA7IG5yIDwgMzsgbnIrKykKKwkJZm9yIChuciA9IHRlbXBfc3RhcnQ7IG5yIDwgMyArIHRlbXBfc3RhcnQ7IG5yKyspCiAJCQlkYXRhLT50ZW1wW25yXSA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsCiAJCQkJCQlGNzE4ODJGR19SRUdfVEVNUChucikpOwogCiAJCWRhdGEtPmZhbl9zdGF0dXMgPSBmNzE4ODJmZ19yZWFkOChkYXRhLAogCQkJCQkJRjcxODgyRkdfUkVHX0ZBTl9TVEFUVVMpOwotCQlmb3IgKG5yID0gMDsgbnIgPCA0OyBucisrKQorCQlmb3IgKG5yID0gMDsgbnIgPCBucl9mYW5zOyBucisrKSB7CiAJCQlkYXRhLT5mYW5bbnJdID0gZjcxODgyZmdfcmVhZDE2KGRhdGEsCiAJCQkJCQlGNzE4ODJGR19SRUdfRkFOKG5yKSk7CisJCQlkYXRhLT5mYW5fdGFyZ2V0W25yXSA9CisJCQkgICAgZjcxODgyZmdfcmVhZDE2KGRhdGEsIEY3MTg4MkZHX1JFR19GQU5fVEFSR0VUKG5yKSk7CisJCQlkYXRhLT5mYW5fZnVsbF9zcGVlZFtucl0gPQorCQkJICAgIGY3MTg4MmZnX3JlYWQxNihkYXRhLAorCQkJCQkgICAgRjcxODgyRkdfUkVHX0ZBTl9GVUxMX1NQRUVEKG5yKSk7CisJCQlkYXRhLT5wd21bbnJdID0KKwkJCSAgICBmNzE4ODJmZ19yZWFkOChkYXRhLCBGNzE4ODJGR19SRUdfUFdNKG5yKSk7CisJCX0KIAotCQlkYXRhLT5pbl9zdGF0dXMgPSBmNzE4ODJmZ19yZWFkOChkYXRhLAorCQkvKiBUaGUgZjgwMDAgY2FuIG1vbml0b3IgMSBtb3JlIGZhbiwgYnV0IGhhcyBubyBwd20gZm9yIGl0ICovCisJCWlmIChkYXRhLT50eXBlID09IGY4MDAwKQorCQkJZGF0YS0+ZmFuWzNdID0gZjcxODgyZmdfcmVhZDE2KGRhdGEsCisJCQkJCQlGNzE4ODJGR19SRUdfRkFOKDMpKTsKKwkJaWYgKGRhdGEtPnR5cGUgPT0gZjcxODgyZmcpCisJCQlkYXRhLT5pbl9zdGF0dXMgPSBmNzE4ODJmZ19yZWFkOChkYXRhLAogCQkJCQkJRjcxODgyRkdfUkVHX0lOX1NUQVRVUyk7Ci0JCWZvciAobnIgPSAwOyBuciA8IDk7IG5yKyspCisJCWZvciAobnIgPSAwOyBuciA8IG5yX2luczsgbnIrKykKIAkJCWRhdGEtPmluW25yXSA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsCiAJCQkJCQlGNzE4ODJGR19SRUdfSU4obnIpKTsKIApAQCAtNDE3LDcgKzEwMDYsNyBAQAogCWNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGY3MTg4MmZnX3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKIAlpbnQgc3BlZWQgPSBmYW5fZnJvbV9yZWcoZGF0YS0+ZmFuW25yXSk7CiAKIAlpZiAoc3BlZWQgPT0gRkFOX01JTl9ERVRFQ1QpCkBAIC00MjYsMTEgKzEwMTUsMzkgQEAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgc3BlZWQpOwogfQogCitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9mdWxsX3NwZWVkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZjcxODgyZmdfdXBkYXRlX2RldmljZShkZXYpOworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKKwlpbnQgc3BlZWQgPSBmYW5fZnJvbV9yZWcoZGF0YS0+ZmFuX2Z1bGxfc3BlZWRbbnJdKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgc3BlZWQpOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9mYW5fZnVsbF9zcGVlZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAorCQkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwl2YWwgPSBTRU5TT1JTX0xJTUlUKHZhbCwgMjMsIDE1MDAwMDApOworCXZhbCA9IGZhbl90b19yZWcodmFsKTsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlmNzE4ODJmZ193cml0ZTE2KGRhdGEsIEY3MTg4MkZHX1JFR19GQU5fRlVMTF9TUEVFRChuciksIHZhbCk7CisJZGF0YS0+ZmFuX2Z1bGxfc3BlZWRbbnJdID0gdmFsOworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCiBzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9iZWVwKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUKIAkqZGV2YXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZjcxODgyZmdfdXBkYXRlX2RldmljZShkZXYpOwotCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OwogCiAJaWYgKGRhdGEtPmZhbl9iZWVwICYgKDEgPDwgbnIpKQogCQlyZXR1cm4gc3ByaW50ZihidWYsICIxXG4iKTsKQEAgLTQ0MiwxMCArMTA1OSwxMSBAQAogCSpkZXZhdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7Ci0JaW50IHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKKwl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmZhbl9iZWVwID0gZjcxODgyZmdfcmVhZDgoZGF0YSwgRjcxODgyRkdfUkVHX0ZBTl9CRUVQKTsKIAlpZiAodmFsKQogCQlkYXRhLT5mYW5fYmVlcCB8PSAxIDw8IG5yOwogCWVsc2UKQEAgLTQ2MSw3ICsxMDc5LDcgQEAKIAkqZGV2YXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZjcxODgyZmdfdXBkYXRlX2RldmljZShkZXYpOwotCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OwogCiAJaWYgKGRhdGEtPmZhbl9zdGF0dXMgJiAoMSA8PCBucikpCiAJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjFcbiIpOwpAQCAtNDczLDcgKzEwOTEsNyBAQAogCWNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGY3MTg4MmZnX3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKIAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT5pbltucl0gKiA4KTsKIH0KQEAgLTQ5MCwxMCArMTEwOCw4IEBACiAJKmRldmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JaW50IHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApIC8gODsKLQotCWlmICh2YWwgPiAyNTUpCi0JCXZhbCA9IDI1NTsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCkgLyA4OworCXZhbCA9IFNFTlNPUlNfTElNSVQodmFsLCAwLCAyNTUpOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCWY3MTg4MmZnX3dyaXRlOChkYXRhLCBGNzE4ODJGR19SRUdfSU4xX0hJR0gsIHZhbCk7CkBAIC01MDcsNyArMTEyMyw3IEBACiAJKmRldmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGY3MTg4MmZnX3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKIAogCWlmIChkYXRhLT5pbl9iZWVwICYgKDEgPDwgbnIpKQogCQlyZXR1cm4gc3ByaW50ZihidWYsICIxXG4iKTsKQEAgLTUxOSwxMCArMTEzNSwxMSBAQAogCSpkZXZhdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7Ci0JaW50IHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKKwl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmluX2JlZXAgPSBmNzE4ODJmZ19yZWFkOChkYXRhLCBGNzE4ODJGR19SRUdfSU5fQkVFUCk7CiAJaWYgKHZhbCkKIAkJZGF0YS0+aW5fYmVlcCB8PSAxIDw8IG5yOwogCWVsc2UKQEAgLTUzOCw3ICsxMTU1LDcgQEAKIAkqZGV2YXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZjcxODgyZmdfdXBkYXRlX2RldmljZShkZXYpOwotCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OwogCiAJaWYgKGRhdGEtPmluX3N0YXR1cyAmICgxIDw8IG5yKSkKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiMVxuIik7CkBAIC01NTAsNyArMTE2Nyw3IEBACiAJY2hhciAqYnVmKQogewogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZjcxODgyZmdfdXBkYXRlX2RldmljZShkZXYpOwotCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OwogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPnRlbXBbbnJdICogMTAwMCk7CiB9CkBAIC01NTksNyArMTE3Niw3IEBACiAJKmRldmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGY3MTg4MmZnX3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKIAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT50ZW1wX2hpZ2hbbnJdICogMTAwMCk7CiB9CkBAIC01NjgsMTEgKzExODUsOSBAQAogCSpkZXZhdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7Ci0JaW50IHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApIC8gMTAwMDsKLQotCWlmICh2YWwgPiAyNTUpCi0JCXZhbCA9IDI1NTsKKwlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKS0+aW5kZXg7CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApIC8gMTAwMDsKKwl2YWwgPSBTRU5TT1JTX0xJTUlUKHZhbCwgMCwgMjU1KTsKIAogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAlmNzE4ODJmZ193cml0ZTgoZGF0YSwgRjcxODgyRkdfUkVHX1RFTVBfSElHSChuciksIHZhbCk7CkBAIC01ODYsNDggKzEyMDEsNDYgQEAKIAkqZGV2YXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZjcxODgyZmdfdXBkYXRlX2RldmljZShkZXYpOwotCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OworCWludCB0ZW1wX21heF9oeXN0OwogCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsCi0JCShkYXRhLT50ZW1wX2hpZ2hbbnJdIC0gZGF0YS0+dGVtcF9oeXN0W25yXSkgKiAxMDAwKTsKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJaWYgKG5yICYgMSkKKwkJdGVtcF9tYXhfaHlzdCA9IGRhdGEtPnRlbXBfaHlzdFtuciAvIDJdID4+IDQ7CisJZWxzZQorCQl0ZW1wX21heF9oeXN0ID0gZGF0YS0+dGVtcF9oeXN0W25yIC8gMl0gJiAweDBmOworCXRlbXBfbWF4X2h5c3QgPSAoZGF0YS0+dGVtcF9oaWdoW25yXSAtIHRlbXBfbWF4X2h5c3QpICogMTAwMDsKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0ZW1wX21heF9oeXN0KTsKIH0KIAogc3RhdGljIHNzaXplX3Qgc3RvcmVfdGVtcF9tYXhfaHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlCiAJKmRldmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKLQlpbnQgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCkgLyAxMDAwOworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCkgLyAxMDAwOwogCXNzaXplX3QgcmV0ID0gY291bnQ7CisJdTggcmVnOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCiAJLyogY29udmVydCBhYnMgdG8gcmVsYXRpdmUgYW5kIGNoZWNrICovCisJZGF0YS0+dGVtcF9oaWdoW25yXSA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsIEY3MTg4MkZHX1JFR19URU1QX0hJR0gobnIpKTsKKwl2YWwgPSBTRU5TT1JTX0xJTUlUKHZhbCwgZGF0YS0+dGVtcF9oaWdoW25yXSAtIDE1LAorCQkJICAgIGRhdGEtPnRlbXBfaGlnaFtucl0pOwogCXZhbCA9IGRhdGEtPnRlbXBfaGlnaFtucl0gLSB2YWw7Ci0JaWYgKHZhbCA8IDAgfHwgdmFsID4gMTUpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBzdG9yZV90ZW1wX21heF9oeXN0X2V4aXQ7Ci0JfQotCi0JZGF0YS0+dGVtcF9oeXN0W25yXSA9IHZhbDsKIAogCS8qIGNvbnZlcnQgdmFsdWUgdG8gcmVnaXN0ZXIgY29udGVudHMgKi8KLQlzd2l0Y2ggKG5yKSB7Ci0JCWNhc2UgMDoKLQkJCXZhbCA9IHZhbCA8PCA0OwotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCXZhbCA9IHZhbCB8IChkYXRhLT50ZW1wX2h5c3RbMl0gPDwgNCk7Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQkJdmFsID0gZGF0YS0+dGVtcF9oeXN0WzFdIHwgKHZhbCA8PCA0KTsKLQkJCWJyZWFrOwotCX0KKwlyZWcgPSBmNzE4ODJmZ19yZWFkOChkYXRhLCBGNzE4ODJGR19SRUdfVEVNUF9IWVNUKG5yIC8gMikpOworCWlmIChuciAmIDEpCisJCXJlZyA9IChyZWcgJiAweDBmKSB8ICh2YWwgPDwgNCk7CisJZWxzZQorCQlyZWcgPSAocmVnICYgMHhmMCkgfCB2YWw7CisJZjcxODgyZmdfd3JpdGU4KGRhdGEsIEY3MTg4MkZHX1JFR19URU1QX0hZU1QobnIgLyAyKSwgcmVnKTsKKwlkYXRhLT50ZW1wX2h5c3RbbnIgLyAyXSA9IHJlZzsKIAotCWY3MTg4MmZnX3dyaXRlOChkYXRhLCBuciA/IEY3MTg4MkZHX1JFR19URU1QX0hZU1QyMyA6Ci0JCUY3MTg4MkZHX1JFR19URU1QX0hZU1QxLCB2YWwpOwotCi1zdG9yZV90ZW1wX21heF9oeXN0X2V4aXQ6CiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTYzNiw3ICsxMjQ5LDcgQEAKIAkqZGV2YXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZjcxODgyZmdfdXBkYXRlX2RldmljZShkZXYpOwotCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OwogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPnRlbXBfb3Z0W25yXSAqIDEwMDApOwogfQpAQCAtNjQ1LDExICsxMjU4LDkgQEAKIAkqZGV2YXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IGY3MTg4MmZnX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OwotCWludCB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKSAvIDEwMDA7Ci0KLQlpZiAodmFsID4gMjU1KQotCQl2YWwgPSAyNTU7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OworCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKSAvIDEwMDA7CisJdmFsID0gU0VOU09SU19MSU1JVCh2YWwsIDAsIDI1NSk7CiAKIAltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAJZjcxODgyZmdfd3JpdGU4KGRhdGEsIEY3MTg4MkZHX1JFR19URU1QX09WVChuciksIHZhbCk7CkBAIC02NjMsMTcgKzEyNzQsMjUgQEAKIAkqZGV2YXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZjcxODgyZmdfdXBkYXRlX2RldmljZShkZXYpOwotCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OworCWludCB0ZW1wX2NyaXRfaHlzdDsKIAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAotCQkoZGF0YS0+dGVtcF9vdnRbbnJdIC0gZGF0YS0+dGVtcF9oeXN0W25yXSkgKiAxMDAwKTsKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJaWYgKG5yICYgMSkKKwkJdGVtcF9jcml0X2h5c3QgPSBkYXRhLT50ZW1wX2h5c3RbbnIgLyAyXSA+PiA0OworCWVsc2UKKwkJdGVtcF9jcml0X2h5c3QgPSBkYXRhLT50ZW1wX2h5c3RbbnIgLyAyXSAmIDB4MGY7CisJdGVtcF9jcml0X2h5c3QgPSAoZGF0YS0+dGVtcF9vdnRbbnJdIC0gdGVtcF9jcml0X2h5c3QpICogMTAwMDsKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0ZW1wX2NyaXRfaHlzdCk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF90eXBlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUKIAkqZGV2YXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZjcxODgyZmdfdXBkYXRlX2RldmljZShkZXYpOwotCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OwogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPnRlbXBfdHlwZVtucl0pOwogfQpAQCAtNjgyLDkgKzEzMDEsOSBAQAogCSpkZXZhdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IGY3MTg4MmZnX2RhdGEgKmRhdGEgPSBmNzE4ODJmZ191cGRhdGVfZGV2aWNlKGRldik7Ci0JaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKKwlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKS0+aW5kZXg7CiAKLQlpZiAoZGF0YS0+dGVtcF9iZWVwICYgKDEgPDwgKG5yICsgMSkpKQorCWlmIChkYXRhLT50ZW1wX2JlZXAgJiAoMSA8PCBucikpCiAJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjFcbiIpOwogCWVsc2UKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiMFxuIik7CkBAIC02OTQsMTQgKzEzMTMsMTUgQEAKIAkqZGV2YXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IGY3MTg4MmZnX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OwotCWludCB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKS0+aW5kZXg7CisJdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKIAogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT50ZW1wX2JlZXAgPSBmNzE4ODJmZ19yZWFkOChkYXRhLCBGNzE4ODJGR19SRUdfVEVNUF9CRUVQKTsKIAlpZiAodmFsKQotCQlkYXRhLT50ZW1wX2JlZXAgfD0gMSA8PCAobnIgKyAxKTsKKwkJZGF0YS0+dGVtcF9iZWVwIHw9IDEgPDwgbnI7CiAJZWxzZQotCQlkYXRhLT50ZW1wX2JlZXAgJj0gfigxIDw8IChuciArIDEpKTsKKwkJZGF0YS0+dGVtcF9iZWVwICY9IH4oMSA8PCBucik7CiAKIAlmNzE4ODJmZ193cml0ZTgoZGF0YSwgRjcxODgyRkdfUkVHX1RFTVBfQkVFUCwgZGF0YS0+dGVtcF9iZWVwKTsKIAltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKQEAgLTcxMyw5ICsxMzMzLDkgQEAKIAkqZGV2YXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZjcxODgyZmdfdXBkYXRlX2RldmljZShkZXYpOwotCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OwogCi0JaWYgKGRhdGEtPnRlbXBfc3RhdHVzICYgKDEgPDwgKG5yICsgMSkpKQorCWlmIChkYXRhLT50ZW1wX3N0YXR1cyAmICgxIDw8IG5yKSkKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiMVxuIik7CiAJZWxzZQogCQlyZXR1cm4gc3ByaW50ZihidWYsICIwXG4iKTsKQEAgLTcyNSwxMTMgKzEzNDUsNTI4IEBACiAJKmRldmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGY3MTg4MmZnX3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKIAotCWlmIChkYXRhLT50ZW1wX2Rpb2RlX29wZW4gJiAoMSA8PCAobnIgKyAxKSkpCisJaWYgKGRhdGEtPnRlbXBfZGlvZGVfb3BlbiAmICgxIDw8IG5yKSkKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiMVxuIik7CiAJZWxzZQogCQlyZXR1cm4gc3ByaW50ZihidWYsICIwXG4iKTsKIH0KIAorc3RhdGljIHNzaXplX3Qgc2hvd19wd20oc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGY3MTg4MmZnX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlpbnQgdmFsLCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJaWYgKGRhdGEtPnB3bV9lbmFibGUgJiAoMSA8PCAoMiAqIG5yKSkpCisJCS8qIFBXTSBtb2RlICovCisJCXZhbCA9IGRhdGEtPnB3bVtucl07CisJZWxzZSB7CisJCS8qIFJQTSBtb2RlICovCisJCXZhbCA9IDI1NSAqIGZhbl9mcm9tX3JlZyhkYXRhLT5mYW5fdGFyZ2V0W25yXSkKKwkJCS8gZmFuX2Zyb21fcmVnKGRhdGEtPmZhbl9mdWxsX3NwZWVkW25yXSk7CisJfQorCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWwpOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9wd20oc3RydWN0IGRldmljZSAqZGV2LAorCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjb25zdCBjaGFyICpidWYsCisJCQkgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OworCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKwl2YWwgPSBTRU5TT1JTX0xJTUlUKHZhbCwgMCwgMjU1KTsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5wd21fZW5hYmxlID0gZjcxODgyZmdfcmVhZDgoZGF0YSwgRjcxODgyRkdfUkVHX1BXTV9FTkFCTEUpOworCWlmICgoZGF0YS0+dHlwZSA9PSBmODAwMCAmJiAoKGRhdGEtPnB3bV9lbmFibGUgPj4gMiAqIG5yKSAmIDMpICE9IDIpIHx8CisJICAgIChkYXRhLT50eXBlICE9IGY4MDAwICYmICEoKGRhdGEtPnB3bV9lbmFibGUgPj4gMiAqIG5yKSAmIDIpKSkgeworCQljb3VudCA9IC1FUk9GUzsKKwkJZ290byBsZWF2ZTsKKwl9CisJaWYgKGRhdGEtPnB3bV9lbmFibGUgJiAoMSA8PCAoMiAqIG5yKSkpIHsKKwkJLyogUFdNIG1vZGUgKi8KKwkJZjcxODgyZmdfd3JpdGU4KGRhdGEsIEY3MTg4MkZHX1JFR19QV00obnIpLCB2YWwpOworCQlkYXRhLT5wd21bbnJdID0gdmFsOworCX0gZWxzZSB7CisJCS8qIFJQTSBtb2RlICovCisJCWludCB0YXJnZXQsIGZ1bGxfc3BlZWQ7CisJCWZ1bGxfc3BlZWQgPSBmNzE4ODJmZ19yZWFkMTYoZGF0YSwKKwkJCQkJICAgICBGNzE4ODJGR19SRUdfRkFOX0ZVTExfU1BFRUQobnIpKTsKKwkJdGFyZ2V0ID0gZmFuX3RvX3JlZyh2YWwgKiBmYW5fZnJvbV9yZWcoZnVsbF9zcGVlZCkgLyAyNTUpOworCQlmNzE4ODJmZ193cml0ZTE2KGRhdGEsIEY3MTg4MkZHX1JFR19GQU5fVEFSR0VUKG5yKSwgdGFyZ2V0KTsKKwkJZGF0YS0+ZmFuX3RhcmdldFtucl0gPSB0YXJnZXQ7CisJCWRhdGEtPmZhbl9mdWxsX3NwZWVkW25yXSA9IGZ1bGxfc3BlZWQ7CisJfQorbGVhdmU6CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGY3MTg4MmZnX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKS0+aW5kZXg7CisKKwlzd2l0Y2ggKChkYXRhLT5wd21fZW5hYmxlID4+IDIgKiBucikgJiAzKSB7CisJY2FzZSAwOgorCWNhc2UgMToKKwkJcmVzdWx0ID0gMjsgLyogTm9ybWFsIGF1dG8gbW9kZSAqLworCQlicmVhazsKKwljYXNlIDI6CisJCXJlc3VsdCA9IDE7IC8qIE1hbnVhbCBtb2RlICovCisJCWJyZWFrOworCWNhc2UgMzoKKwkJaWYgKGRhdGEtPnR5cGUgPT0gZjgwMDApCisJCQlyZXN1bHQgPSAzOyAvKiBUaGVybW9zdGF0IG1vZGUgKi8KKwkJZWxzZQorCQkJcmVzdWx0ID0gMTsgLyogTWFudWFsIG1vZGUgKi8KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHJlc3VsdCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3B3bV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZQorCQkJCSpkZXZhdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+cHdtX2VuYWJsZSA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsIEY3MTg4MkZHX1JFR19QV01fRU5BQkxFKTsKKwkvKiBTcGVjaWFsIGNhc2UgZm9yIEY4MDAwIGF1dG8gUFdNIG1vZGUgLyBUaGVybW9zdGF0IG1vZGUgKi8KKwlpZiAoZGF0YS0+dHlwZSA9PSBmODAwMCAmJiAoKGRhdGEtPnB3bV9lbmFibGUgPj4gMiAqIG5yKSAmIDEpKSB7CisJCXN3aXRjaCAodmFsKSB7CisJCWNhc2UgMjoKKwkJCWRhdGEtPnB3bV9lbmFibGUgJj0gfigyIDw8ICgyICogbnIpKTsKKwkJCWJyZWFrOwkJLyogTm9ybWFsIGF1dG8gbW9kZSAqLworCQljYXNlIDM6CisJCQlkYXRhLT5wd21fZW5hYmxlIHw9IDIgPDwgKDIgKiBucik7CisJCQlicmVhazsJCS8qIFRoZXJtb3N0YXQgbW9kZSAqLworCQlkZWZhdWx0OgorCQkJY291bnQgPSAtRUlOVkFMOworCQkJZ290byBsZWF2ZTsKKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAodmFsKSB7CisJCWNhc2UgMToKKwkJCWRhdGEtPnB3bV9lbmFibGUgfD0gMiA8PCAoMiAqIG5yKTsKKwkJCWJyZWFrOwkJLyogTWFudWFsICovCisJCWNhc2UgMjoKKwkJCWRhdGEtPnB3bV9lbmFibGUgJj0gfigyIDw8ICgyICogbnIpKTsKKwkJCWJyZWFrOwkJLyogTm9ybWFsIGF1dG8gbW9kZSAqLworCQlkZWZhdWx0OgorCQkJY291bnQgPSAtRUlOVkFMOworCQkJZ290byBsZWF2ZTsKKwkJfQorCX0KKwlmNzE4ODJmZ193cml0ZTgoZGF0YSwgRjcxODgyRkdfUkVHX1BXTV9FTkFCTEUsIGRhdGEtPnB3bV9lbmFibGUpOworbGVhdmU6CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCisJCQkJICAgICAgIGNoYXIgKmJ1ZikKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZjcxODgyZmdfdXBkYXRlX2RldmljZShkZXYpOworCWludCBwd20gPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKS0+aW5kZXg7CisJaW50IHBvaW50ID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPm5yOworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCWlmIChkYXRhLT5wd21fZW5hYmxlICYgKDEgPDwgKDIgKiBwd20pKSkgeworCQkvKiBQV00gbW9kZSAqLworCQlyZXN1bHQgPSBkYXRhLT5wd21fYXV0b19wb2ludF9wd21bcHdtXVtwb2ludF07CisJfSBlbHNlIHsKKwkJLyogUlBNIG1vZGUgKi8KKwkJcmVzdWx0ID0gMzIgKiAyNTUgLyAoMzIgKyBkYXRhLT5wd21fYXV0b19wb2ludF9wd21bcHdtXVtwb2ludF0pOworCX0KKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCByZXN1bHQpOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20oc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGY3MTg4MmZnX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgcHdtID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OworCWludCBwb2ludCA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5ucjsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisJdmFsID0gU0VOU09SU19MSU1JVCh2YWwsIDAsIDI1NSk7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+cHdtX2VuYWJsZSA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsIEY3MTg4MkZHX1JFR19QV01fRU5BQkxFKTsKKwlpZiAoZGF0YS0+cHdtX2VuYWJsZSAmICgxIDw8ICgyICogcHdtKSkpIHsKKwkJLyogUFdNIG1vZGUgKi8KKwl9IGVsc2UgeworCQkvKiBSUE0gbW9kZSAqLworCQlpZiAodmFsIDwgMjkpCS8qIFByZXZlbnQgbmVnYXRpdmUgbnVtYmVycyAqLworCQkJdmFsID0gMjU1OworCQllbHNlCisJCQl2YWwgPSAoMjU1IC0gdmFsKSAqIDMyIC8gdmFsOworCX0KKwlmNzE4ODJmZ193cml0ZTgoZGF0YSwgRjcxODgyRkdfUkVHX1BPSU5UX1BXTShwd20sIHBvaW50KSwgdmFsKTsKKwlkYXRhLT5wd21fYXV0b19wb2ludF9wd21bcHdtXVtwb2ludF0gPSB2YWw7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCQkJICAgICBjaGFyICpidWYpCit7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IGY3MTg4MmZnX2RhdGEgKmRhdGEgPSBmNzE4ODJmZ191cGRhdGVfZGV2aWNlKGRldik7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OworCWludCBwb2ludCA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5ucjsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlpZiAobnIgJiAxKQorCQlyZXN1bHQgPSBkYXRhLT5wd21fYXV0b19wb2ludF9oeXN0W25yIC8gMl0gPj4gNDsKKwllbHNlCisJCXJlc3VsdCA9IGRhdGEtPnB3bV9hdXRvX3BvaW50X2h5c3RbbnIgLyAyXSAmIDB4MGY7CisJcmVzdWx0ID0gMTAwMCAqIChkYXRhLT5wd21fYXV0b19wb2ludF90ZW1wW25yXVtwb2ludF0gLSByZXN1bHQpOworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHJlc3VsdCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAorCQkJCQkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKKwlpbnQgcG9pbnQgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKS0+bnI7CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApIC8gMTAwMDsKKwl1OCByZWc7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+cHdtX2F1dG9fcG9pbnRfdGVtcFtucl1bcG9pbnRdID0KKwkJZjcxODgyZmdfcmVhZDgoZGF0YSwgRjcxODgyRkdfUkVHX1BPSU5UX1RFTVAobnIsIHBvaW50KSk7CisJdmFsID0gU0VOU09SU19MSU1JVCh2YWwsIGRhdGEtPnB3bV9hdXRvX3BvaW50X3RlbXBbbnJdW3BvaW50XSAtIDE1LAorCQkJCWRhdGEtPnB3bV9hdXRvX3BvaW50X3RlbXBbbnJdW3BvaW50XSk7CisJdmFsID0gZGF0YS0+cHdtX2F1dG9fcG9pbnRfdGVtcFtucl1bcG9pbnRdIC0gdmFsOworCisJcmVnID0gZjcxODgyZmdfcmVhZDgoZGF0YSwgRjcxODgyRkdfUkVHX0ZBTl9IWVNUKG5yIC8gMikpOworCWlmIChuciAmIDEpCisJCXJlZyA9IChyZWcgJiAweDBmKSB8ICh2YWwgPDwgNCk7CisJZWxzZQorCQlyZWcgPSAocmVnICYgMHhmMCkgfCB2YWw7CisKKwlmNzE4ODJmZ193cml0ZTgoZGF0YSwgRjcxODgyRkdfUkVHX0ZBTl9IWVNUKG5yIC8gMiksIHJlZyk7CisJZGF0YS0+cHdtX2F1dG9fcG9pbnRfaHlzdFtuciAvIDJdID0gcmVnOworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3B3bV9pbnRlcnBvbGF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGY3MTg4MmZnX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKS0+aW5kZXg7CisKKwlyZXN1bHQgPSAoZGF0YS0+cHdtX2F1dG9fcG9pbnRfbWFwcGluZ1tucl0gPj4gNCkgJiAxOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHJlc3VsdCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3B3bV9pbnRlcnBvbGF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OworCXVuc2lnbmVkIGxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+cHdtX2F1dG9fcG9pbnRfbWFwcGluZ1tucl0gPQorCQlmNzE4ODJmZ19yZWFkOChkYXRhLCBGNzE4ODJGR19SRUdfUE9JTlRfTUFQUElORyhucikpOworCWlmICh2YWwpCisJCXZhbCA9IGRhdGEtPnB3bV9hdXRvX3BvaW50X21hcHBpbmdbbnJdIHwgKDEgPDwgNCk7CisJZWxzZQorCQl2YWwgPSBkYXRhLT5wd21fYXV0b19wb2ludF9tYXBwaW5nW25yXSAmICh+KDEgPDwgNCkpOworCWY3MTg4MmZnX3dyaXRlOChkYXRhLCBGNzE4ODJGR19SRUdfUE9JTlRfTUFQUElORyhuciksIHZhbCk7CisJZGF0YS0+cHdtX2F1dG9fcG9pbnRfbWFwcGluZ1tucl0gPSB2YWw7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtX2F1dG9fcG9pbnRfY2hhbm5lbChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAorCQkJCQkgICBjaGFyICpidWYpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGY3MTg4MmZnX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKS0+aW5kZXg7CisJaW50IHRlbXBfc3RhcnQgPSAoZGF0YS0+dHlwZSA9PSBmODAwMCkgPyAwIDogMTsKKworCXJlc3VsdCA9IDEgPDwgKChkYXRhLT5wd21fYXV0b19wb2ludF9tYXBwaW5nW25yXSAmIDMpIC0gdGVtcF9zdGFydCk7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcmVzdWx0KTsKK30KKworc3RhdGljIHNzaXplX3Qgc3RvcmVfcHdtX2F1dG9fcG9pbnRfY2hhbm5lbChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OworCWludCB0ZW1wX3N0YXJ0ID0gKGRhdGEtPnR5cGUgPT0gZjgwMDApID8gMCA6IDE7CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJc3dpdGNoICh2YWwpIHsKKwljYXNlIDE6CisJCXZhbCA9IDA7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJdmFsID0gMTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQl2YWwgPSAyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJdmFsICs9IHRlbXBfc3RhcnQ7CisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnB3bV9hdXRvX3BvaW50X21hcHBpbmdbbnJdID0KKwkJZjcxODgyZmdfcmVhZDgoZGF0YSwgRjcxODgyRkdfUkVHX1BPSU5UX01BUFBJTkcobnIpKTsKKwl2YWwgPSAoZGF0YS0+cHdtX2F1dG9fcG9pbnRfbWFwcGluZ1tucl0gJiAweGZjKSB8IHZhbDsKKwlmNzE4ODJmZ193cml0ZTgoZGF0YSwgRjcxODgyRkdfUkVHX1BPSU5UX01BUFBJTkcobnIpLCB2YWwpOworCWRhdGEtPnB3bV9hdXRvX3BvaW50X21hcHBpbmdbbnJdID0gdmFsOworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCQkJY2hhciAqYnVmKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGY3MTg4MmZnX2RhdGEgKmRhdGEgPSBmNzE4ODJmZ191cGRhdGVfZGV2aWNlKGRldik7CisJaW50IHB3bSA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKKwlpbnQgcG9pbnQgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKS0+bnI7CisKKwlyZXN1bHQgPSBkYXRhLT5wd21fYXV0b19wb2ludF90ZW1wW3B3bV1bcG9pbnRdOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAxMDAwICogcmVzdWx0KTsKK30KKworc3RhdGljIHNzaXplX3Qgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHB3bSA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKKwlpbnQgcG9pbnQgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKS0+bnI7CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApIC8gMTAwMDsKKwl2YWwgPSBTRU5TT1JTX0xJTUlUKHZhbCwgMCwgMjU1KTsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlmNzE4ODJmZ193cml0ZTgoZGF0YSwgRjcxODgyRkdfUkVHX1BPSU5UX1RFTVAocHdtLCBwb2ludCksIHZhbCk7CisJZGF0YS0+cHdtX2F1dG9fcG9pbnRfdGVtcFtwd21dW3BvaW50XSA9IHZhbDsKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKwogc3RhdGljIHNzaXplX3Qgc2hvd19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCiAJY2hhciAqYnVmKQogewotCXJldHVybiBzcHJpbnRmKGJ1ZiwgRFJWTkFNRSAiXG4iKTsKKwlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBmNzE4ODJmZ19uYW1lc1tkYXRhLT50eXBlXSk7CiB9CiAKK3N0YXRpYyBpbnQgX19kZXZpbml0IGY3MTg4MmZnX2NyZWF0ZV9zeXNmc19maWxlcyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yICphdHRyLCBpbnQgY291bnQpCit7CisJaW50IGVyciwgaTsKIAotc3RhdGljIGludCBfX2RldmluaXQgZjcxODgyZmdfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqIHBkZXYpCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsICZhdHRyW2ldLmRldl9hdHRyKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBmNzE4ODJmZ19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhOwotCWludCBlcnIsIGk7CisJc3RydWN0IGY3MTg4MmZnX3Npb19kYXRhICpzaW9fZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWludCBlcnIsIGksIG5yX2ZhbnMgPSAoc2lvX2RhdGEtPnR5cGUgPT0gZjcxODgyZmcpID8gNCA6IDM7CiAJdTggc3RhcnRfcmVnOwogCi0JaWYgKCEoZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBmNzE4ODJmZ19kYXRhKSwgR0ZQX0tFUk5FTCkpKQorCWRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZjcxODgyZmdfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlkYXRhLT5hZGRyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSU8sIDApLT5zdGFydDsKKwlkYXRhLT50eXBlID0gc2lvX2RhdGEtPnR5cGU7CiAJbXV0ZXhfaW5pdCgmZGF0YS0+dXBkYXRlX2xvY2spOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRhdGEpOwogCisJc3RhcnRfcmVnID0gZjcxODgyZmdfcmVhZDgoZGF0YSwgRjcxODgyRkdfUkVHX1NUQVJUKTsKKwlpZiAoc3RhcnRfcmVnICYgMHgwNCkgeworCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiSGFyZHdhcmUgbW9uaXRvciBpcyBwb3dlcmVkIGRvd25cbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGV4aXRfZnJlZTsKKwl9CisJaWYgKCEoc3RhcnRfcmVnICYgMHgwMykpIHsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIkhhcmR3YXJlIG1vbml0b3Jpbmcgbm90IGFjdGl2YXRlZFxuIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXhpdF9mcmVlOworCX0KKworCWRhdGEtPnB3bV9lbmFibGUgPSBmNzE4ODJmZ19yZWFkOChkYXRhLCBGNzE4ODJGR19SRUdfUFdNX0VOQUJMRSk7CisJLyogSWYgaXQgaXMgYSA3MTg2MiBhbmQgdGhlIGZhbiAvIHB3bSBwYXJ0IGlzIGVuYWJsZWQgc2FuaXR5IGNoZWNrCisJICAgdGhlIHB3bSBzZXR0aW5ncyAqLworCWlmIChkYXRhLT50eXBlID09IGY3MTg2MmZnICYmIChzdGFydF9yZWcgJiAweDAyKSkgeworCQlpZiAoKGRhdGEtPnB3bV9lbmFibGUgJiAweDE1KSAhPSAweDE1KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJIkludmFsaWQgKHJlc2VydmVkKSBwd20gc2V0dGluZ3M6IDB4JTAyeFxuIiwKKwkJCQkodW5zaWduZWQgaW50KWRhdGEtPnB3bV9lbmFibGUpOworCQkJZXJyID0gLUVOT0RFVjsKKwkJCWdvdG8gZXhpdF9mcmVlOworCQl9CisJfQorCiAJLyogUmVnaXN0ZXIgc3lzZnMgaW50ZXJmYWNlIGZpbGVzICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZjcxODgyZmdfZGV2X2F0dHIpOyBpKyspIHsKLQkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsICZmNzE4ODJmZ19kZXZfYXR0cltpXSk7CisJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9uYW1lKTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXRfdW5yZWdpc3Rlcl9zeXNmczsKKworCWlmIChzdGFydF9yZWcgJiAweDAxKSB7CisJCXN3aXRjaCAoZGF0YS0+dHlwZSkgeworCQljYXNlIGY3MTg4MmZnOgorCQkJZXJyID0gZjcxODgyZmdfY3JlYXRlX3N5c2ZzX2ZpbGVzKHBkZXYsCisJCQkJCWY3MTg4MmZnX2luX3RlbXBfYXR0ciwKKwkJCQkJQVJSQVlfU0laRShmNzE4ODJmZ19pbl90ZW1wX2F0dHIpKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBleGl0X3VucmVnaXN0ZXJfc3lzZnM7CisJCQkvKiBmYWxsIHRocm91Z2ghICovCisJCWNhc2UgZjcxODYyZmc6CisJCQllcnIgPSBmNzE4ODJmZ19jcmVhdGVfc3lzZnNfZmlsZXMocGRldiwKKwkJCQkJZjcxOHgyZmdfaW5fdGVtcF9hdHRyLAorCQkJCQlBUlJBWV9TSVpFKGY3MTh4MmZnX2luX3RlbXBfYXR0cikpOworCQkJYnJlYWs7CisJCWNhc2UgZjgwMDA6CisJCQllcnIgPSBmNzE4ODJmZ19jcmVhdGVfc3lzZnNfZmlsZXMocGRldiwKKwkJCQkJZjgwMDBfaW5fdGVtcF9hdHRyLAorCQkJCQlBUlJBWV9TSVpFKGY4MDAwX2luX3RlbXBfYXR0cikpOworCQkJYnJlYWs7CisJCX0KIAkJaWYgKGVycikKIAkJCWdvdG8gZXhpdF91bnJlZ2lzdGVyX3N5c2ZzOwogCX0KIAotCXN0YXJ0X3JlZyA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsIEY3MTg4MkZHX1JFR19TVEFSVCk7Ci0JaWYgKHN0YXJ0X3JlZyAmIDB4MDEpIHsKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZjcxODgyZmdfaW5fdGVtcF9hdHRyKTsgaSsrKSB7Ci0JCQllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwKLQkJCQkJJmY3MTg4MmZnX2luX3RlbXBfYXR0cltpXS5kZXZfYXR0cik7Ci0JCQlpZiAoZXJyKQotCQkJCWdvdG8gZXhpdF91bnJlZ2lzdGVyX3N5c2ZzOwotCQl9Ci0JfQotCiAJaWYgKHN0YXJ0X3JlZyAmIDB4MDIpIHsKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZjcxODgyZmdfZmFuX2F0dHIpOyBpKyspIHsKLQkJCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LAotCQkJCQkmZjcxODgyZmdfZmFuX2F0dHJbaV0uZGV2X2F0dHIpOwotCQkJaWYgKGVycikKLQkJCQlnb3RvIGV4aXRfdW5yZWdpc3Rlcl9zeXNmczsKKwkJZXJyID0gZjcxODgyZmdfY3JlYXRlX3N5c2ZzX2ZpbGVzKHBkZXYsIGZ4eHh4X2Zhbl9hdHRyLAorCQkJCQlBUlJBWV9TSVpFKGZ4eHh4X2Zhbl9hdHRyKSk7CisJCWlmIChlcnIpCisJCQlnb3RvIGV4aXRfdW5yZWdpc3Rlcl9zeXNmczsKKworCQlzd2l0Y2ggKGRhdGEtPnR5cGUpIHsKKwkJY2FzZSBmNzE4NjJmZzoKKwkJCWVyciA9IGY3MTg4MmZnX2NyZWF0ZV9zeXNmc19maWxlcyhwZGV2LAorCQkJCQlmNzE4NjJmZ19mYW5fYXR0ciwKKwkJCQkJQVJSQVlfU0laRShmNzE4NjJmZ19mYW5fYXR0cikpOworCQkJYnJlYWs7CisJCWNhc2UgZjcxODgyZmc6CisJCQllcnIgPSBmNzE4ODJmZ19jcmVhdGVfc3lzZnNfZmlsZXMocGRldiwKKwkJCQkJZjcxODgyZmdfZmFuX2F0dHIsCisJCQkJCUFSUkFZX1NJWkUoZjcxODgyZmdfZmFuX2F0dHIpKTsKKwkJCWJyZWFrOworCQljYXNlIGY4MDAwOgorCQkJZXJyID0gZjcxODgyZmdfY3JlYXRlX3N5c2ZzX2ZpbGVzKHBkZXYsCisJCQkJCWY4MDAwX2Zhbl9hdHRyLAorCQkJCQlBUlJBWV9TSVpFKGY4MDAwX2Zhbl9hdHRyKSk7CisJCQlicmVhazsKIAkJfQorCQlpZiAoZXJyKQorCQkJZ290byBleGl0X3VucmVnaXN0ZXJfc3lzZnM7CisKKwkJZm9yIChpID0gMDsgaSA8IG5yX2ZhbnM7IGkrKykKKwkJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJGYW46ICVkIGlzIGluICVzIG1vZGVcbiIsIGkgKyAxLAorCQkJCSAoZGF0YS0+cHdtX2VuYWJsZSAmICgxIDw8IDIgKiBpKSkgPworCQkJCSAiZHV0eS1jeWNsZSIgOiAiUlBNIik7CiAJfQogCiAJZGF0YS0+aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZwZGV2LT5kZXYpOwogCWlmIChJU19FUlIoZGF0YS0+aHdtb25fZGV2KSkgewogCQllcnIgPSBQVFJfRVJSKGRhdGEtPmh3bW9uX2Rldik7CisJCWRhdGEtPmh3bW9uX2RldiA9IE5VTEw7CiAJCWdvdG8gZXhpdF91bnJlZ2lzdGVyX3N5c2ZzOwogCX0KIAogCXJldHVybiAwOwogCiBleGl0X3VucmVnaXN0ZXJfc3lzZnM6Ci0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZjcxODgyZmdfZGV2X2F0dHIpOyBpKyspCi0JCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmZjcxODgyZmdfZGV2X2F0dHJbaV0pOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZjcxODgyZmdfaW5fdGVtcF9hdHRyKTsgaSsrKQotCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwKLQkJCQkJJmY3MTg4MmZnX2luX3RlbXBfYXR0cltpXS5kZXZfYXR0cik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmNzE4ODJmZ19mYW5fYXR0cik7IGkrKykKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZmNzE4ODJmZ19mYW5fYXR0cltpXS5kZXZfYXR0cik7Ci0KKwlmNzE4ODJmZ19yZW1vdmUocGRldik7IC8qIFdpbGwgdW5yZWdpc3RlciB0aGUgc3lzZnMgZmlsZXMgZm9yIHVzICovCisJcmV0dXJuIGVycjsgLyogZjcxODgyZmdfcmVtb3ZlKCkgYWxzbyBmcmVlcyBvdXIgZGF0YSAqLworZXhpdF9mcmVlOgogCWtmcmVlKGRhdGEpOwotCiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBfX2RldmV4aXQgZjcxODgyZmdfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IGY3MTg4MmZnX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCWludCBpOwogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKLQlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5od21vbl9kZXYpOworCWlmIChkYXRhLT5od21vbl9kZXYpCisJCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmh3bW9uX2Rldik7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmNzE4ODJmZ19kZXZfYXR0cik7IGkrKykKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZmNzE4ODJmZ19kZXZfYXR0cltpXSk7CisJLyogTm90ZSB3ZSBhcmUgbm90IGxvb3Bpbmcgb3ZlciBhbGwgYXR0ciBhcnJheXMgd2UgaGF2ZSBhcyB0aGUgb25lcworCSAgIGJlbG93IGFyZSBzdXBlcnNldHMgb2YgdGhlIG9uZXMgc2tpcHBlZC4gKi8KKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX25hbWUpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZjcxOHgyZmdfaW5fdGVtcF9hdHRyKTsgaSsrKQorCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwKKwkJCQkJJmY3MTh4MmZnX2luX3RlbXBfYXR0cltpXS5kZXZfYXR0cik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmNzE4ODJmZ19pbl90ZW1wX2F0dHIpOyBpKyspCiAJCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LAogCQkJCQkmZjcxODgyZmdfaW5fdGVtcF9hdHRyW2ldLmRldl9hdHRyKTsKIAorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZ4eHh4X2Zhbl9hdHRyKTsgaSsrKQorCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmZ4eHh4X2Zhbl9hdHRyW2ldLmRldl9hdHRyKTsKKwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGY3MTg4MmZnX2Zhbl9hdHRyKTsgaSsrKQogCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmY3MTg4MmZnX2Zhbl9hdHRyW2ldLmRldl9hdHRyKTsKIAorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGY4MDAwX2Zhbl9hdHRyKTsgaSsrKQorCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmY4MDAwX2Zhbl9hdHRyW2ldLmRldl9hdHRyKTsKKwogCWtmcmVlKGRhdGEpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGY3MTg4MmZnX2ZpbmQoaW50IHNpb2FkZHIsIHVuc2lnbmVkIHNob3J0ICphZGRyZXNzKQorc3RhdGljIGludCBfX2luaXQgZjcxODgyZmdfZmluZChpbnQgc2lvYWRkciwgdW5zaWduZWQgc2hvcnQgKmFkZHJlc3MsCisJc3RydWN0IGY3MTg4MmZnX3Npb19kYXRhICpzaW9fZGF0YSkKIHsKIAlpbnQgZXJyID0gLUVOT0RFVjsKIAl1MTYgZGV2aWQ7Ci0JdTggc3RhcnRfcmVnOwotCXN0cnVjdCBmNzE4ODJmZ19kYXRhIGRhdGE7CiAKIAlzdXBlcmlvX2VudGVyKHNpb2FkZHIpOwogCkBAIC04NDIsNyArMTg3NywxNyBAQAogCX0KIAogCWRldmlkID0gZm9yY2VfaWQgPyBmb3JjZV9pZCA6IHN1cGVyaW9faW53KHNpb2FkZHIsIFNJT19SRUdfREVWSUQpOwotCWlmIChkZXZpZCAhPSBTSU9fRjcxODgyX0lEKSB7CisJc3dpdGNoIChkZXZpZCkgeworCWNhc2UgU0lPX0Y3MTg2Ml9JRDoKKwkJc2lvX2RhdGEtPnR5cGUgPSBmNzE4NjJmZzsKKwkJYnJlYWs7CisJY2FzZSBTSU9fRjcxODgyX0lEOgorCQlzaW9fZGF0YS0+dHlwZSA9IGY3MTg4MmZnOworCQlicmVhazsKKwljYXNlIFNJT19GODAwMF9JRDoKKwkJc2lvX2RhdGEtPnR5cGUgPSBmODAwMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJcHJpbnRrKEtFUk5fSU5GTyBEUlZOQU1FICI6IFVuc3VwcG9ydGVkIEZpbnRlayBkZXZpY2VcbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtODYxLDI0ICsxOTA2LDE3IEBACiAJfQogCSphZGRyZXNzICY9IH4oUkVHSU9OX0xFTkdUSCAtIDEpOwkvKiBJZ25vcmUgMyBMU0IgKi8KIAotCWRhdGEuYWRkciA9ICphZGRyZXNzOwotCXN0YXJ0X3JlZyA9IGY3MTg4MmZnX3JlYWQ4KCZkYXRhLCBGNzE4ODJGR19SRUdfU1RBUlQpOwotCWlmICghKHN0YXJ0X3JlZyAmIDB4MDMpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWTkFNRQotCQkJIjogSGFyZHdhcmUgbW9uaXRvcmluZyBub3QgYWN0aXZhdGVkXG4iKTsKLQkJZ290byBleGl0OwotCX0KLQogCWVyciA9IDA7Ci0JcHJpbnRrKEtFUk5fSU5GTyBEUlZOQU1FICI6IEZvdW5kIEY3MTg4MkZHIGNoaXAgYXQgJSN4LCByZXZpc2lvbiAlZFxuIiwKLQkJKHVuc2lnbmVkIGludCkqYWRkcmVzcywKKwlwcmludGsoS0VSTl9JTkZPIERSVk5BTUUgIjogRm91bmQgJXMgY2hpcCBhdCAlI3gsIHJldmlzaW9uICVkXG4iLAorCQlmNzE4ODJmZ19uYW1lc1tzaW9fZGF0YS0+dHlwZV0sCSh1bnNpZ25lZCBpbnQpKmFkZHJlc3MsCiAJCShpbnQpc3VwZXJpb19pbmIoc2lvYWRkciwgU0lPX1JFR19ERVZSRVYpKTsKIGV4aXQ6CiAJc3VwZXJpb19leGl0KHNpb2FkZHIpOwogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGY3MTg4MmZnX2RldmljZV9hZGQodW5zaWduZWQgc2hvcnQgYWRkcmVzcykKK3N0YXRpYyBpbnQgX19pbml0IGY3MTg4MmZnX2RldmljZV9hZGQodW5zaWduZWQgc2hvcnQgYWRkcmVzcywKKwljb25zdCBzdHJ1Y3QgZjcxODgyZmdfc2lvX2RhdGEgKnNpb19kYXRhKQogewogCXN0cnVjdCByZXNvdXJjZSByZXMgPSB7CiAJCS5zdGFydAk9IGFkZHJlc3MsCkBAIC04OTIsMTIgKzE5MzAsMjMgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlyZXMubmFtZSA9IGY3MTg4MmZnX3BkZXYtPm5hbWU7CisJZXJyID0gYWNwaV9jaGVja19yZXNvdXJjZV9jb25mbGljdCgmcmVzKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMoZjcxODgyZmdfcGRldiwgJnJlcywgMSk7CiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgcmVzb3VyY2UgYWRkaXRpb24gZmFpbGVkXG4iKTsKIAkJZ290byBleGl0X2RldmljZV9wdXQ7CiAJfQogCisJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKGY3MTg4MmZnX3BkZXYsIHNpb19kYXRhLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGY3MTg4MmZnX3Npb19kYXRhKSk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBQbGF0Zm9ybSBkYXRhIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJZ290byBleGl0X2RldmljZV9wdXQ7CisJfQorCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZChmNzE4ODJmZ19wZGV2KTsKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSBhZGRpdGlvbiBmYWlsZWRcbiIpOwpAQCAtOTE2LDE0ICsxOTY1LDIwIEBACiB7CiAJaW50IGVyciA9IC1FTk9ERVY7CiAJdW5zaWduZWQgc2hvcnQgYWRkcmVzczsKKwlzdHJ1Y3QgZjcxODgyZmdfc2lvX2RhdGEgc2lvX2RhdGE7CiAKLQlpZiAoZjcxODgyZmdfZmluZCgweDJlLCAmYWRkcmVzcykgJiYgZjcxODgyZmdfZmluZCgweDRlLCAmYWRkcmVzcykpCisJbWVtc2V0KCZzaW9fZGF0YSwgMCwgc2l6ZW9mKHNpb19kYXRhKSk7CisKKwlpZiAoZjcxODgyZmdfZmluZCgweDJlLCAmYWRkcmVzcywgJnNpb19kYXRhKSAmJgorCSAgICBmNzE4ODJmZ19maW5kKDB4NGUsICZhZGRyZXNzLCAmc2lvX2RhdGEpKQogCQlnb3RvIGV4aXQ7CiAKLQlpZiAoKGVyciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZjcxODgyZmdfZHJpdmVyKSkpCisJZXJyID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZmNzE4ODJmZ19kcml2ZXIpOworCWlmIChlcnIpCiAJCWdvdG8gZXhpdDsKIAotCWlmICgoZXJyID0gZjcxODgyZmdfZGV2aWNlX2FkZChhZGRyZXNzKSkpCisJZXJyID0gZjcxODgyZmdfZGV2aWNlX2FkZChhZGRyZXNzLCAmc2lvX2RhdGEpOworCWlmIChlcnIpCiAJCWdvdG8gZXhpdF9kcml2ZXI7CiAKIAlyZXR1cm4gMDsKQEAgLTk0MSw3ICsxOTk2LDcgQEAKIH0KIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJGNzE4ODJGRyBIYXJkd2FyZSBNb25pdG9yaW5nIERyaXZlciIpOwotTU9EVUxFX0FVVEhPUigiSGFucyBFZGdpbmd0b24gKGhhbnNAZWRnaW5ndG9uLm5sKSIpOworTU9EVUxFX0FVVEhPUigiSGFucyBFZGdpbmd0b24sIEhhbnMgZGUgR29lZGUgKGhkZWdvZWRlQHJlZGhhdC5jb20pIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIG1vZHVsZV9pbml0KGY3MTg4MmZnX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9mc2NobWQuYyBiL2RyaXZlcnMvaHdtb24vZnNjaG1kLmMKaW5kZXggOTY3MTcwMy4uZDA3ZjRlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9mc2NobWQuYworKysgYi9kcml2ZXJzL2h3bW9uL2ZzY2htZC5jCkBAIC0xLDYgKzEsNiBAQAogLyogZnNjaG1kLmMKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgSGFucyBkZSBHb2VkZSA8ai53LnIuZGVnb2VkZUBoaHMubmw+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcsMjAwOCBIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtNDIsMTEgKzQyLDIwIEBACiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KIAogLyogQWRkcmVzc2VzIHRvIHNjYW4gKi8KIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4NzMsIEkyQ19DTElFTlRfRU5EIH07CiAKIC8qIEluc21vZCBwYXJhbWV0ZXJzICovCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gV0FUQ0hET0dfTk9XQVlPVVQ7Cittb2R1bGVfcGFyYW0obm93YXlvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PSIKKwlfX01PRFVMRV9TVFJJTkcoV0FUQ0hET0dfTk9XQVlPVVQpICIpIik7CiBJMkNfQ0xJRU5UX0lOU01PRF81KGZzY3BvcywgZnNjaGVyLCBmc2NzY3ksIGZzY2hyYywgZnNjaG1kKTsKIAogLyoKQEAgLTYzLDE5ICs3MiwyNiBAQAogI2RlZmluZSBGU0NITURfUkVHX0VWRU5UX1NUQVRFCQkweDA0CiAjZGVmaW5lIEZTQ0hNRF9SRUdfQ09OVFJPTAkJMHgwNQogCi0jZGVmaW5lIEZTQ0hNRF9DT05UUk9MX0FMRVJUX0xFRF9NQVNLCTB4MDEKKyNkZWZpbmUgRlNDSE1EX0NPTlRST0xfQUxFUlRfTEVECTB4MDEKIAotLyogd2F0Y2hkb2cgKHN1cHBvcnQgdG8gYmUgaW1wbGVtZW50ZWQpICovCisvKiB3YXRjaGRvZyAqLwogI2RlZmluZSBGU0NITURfUkVHX1dET0dfUFJFU0VUCQkweDI4CiAjZGVmaW5lIEZTQ0hNRF9SRUdfV0RPR19TVEFURQkJMHgyMwogI2RlZmluZSBGU0NITURfUkVHX1dET0dfQ09OVFJPTAkJMHgyMQogCisjZGVmaW5lIEZTQ0hNRF9XRE9HX0NPTlRST0xfVFJJR0dFUgkweDEwCisjZGVmaW5lIEZTQ0hNRF9XRE9HX0NPTlRST0xfU1RBUlRFRAkweDEwIC8qIHRoZSBzYW1lIGFzIHRyaWdnZXIgKi8KKyNkZWZpbmUgRlNDSE1EX1dET0dfQ09OVFJPTF9TVE9QCTB4MjAKKyNkZWZpbmUgRlNDSE1EX1dET0dfQ09OVFJPTF9SRVNPTFVUSU9OCTB4NDAKKworI2RlZmluZSBGU0NITURfV0RPR19TVEFURV9DQVJEUkVTRVQJMHgwMgorCiAvKiB2b2x0YWdlcywgd2VpcmQgb3JkZXIgaXMgdG8ga2VlcCB0aGUgc2FtZSBvcmRlciBhcyB0aGUgb2xkIGRyaXZlcnMgKi8KIHN0YXRpYyBjb25zdCB1OCBGU0NITURfUkVHX1ZPTFRbM10gPSB7IDB4NDUsIDB4NDIsIDB4NDggfTsKIAogLyogbWluaW11bSBwd20gYXQgd2hpY2ggdGhlIGZhbiBpcyBkcml2ZW4gKHB3bSBjYW4gYnkgaW5jcmVhc2VkIGRlcGVuZGluZyBvbgogICAgdGhlIHRlbXAuIE5vdGljZSB0aGF0IGZvciB0aGUgc2N5IHNvbWUgZmFucyBzaGFyZSB0aGVyZSBtaW5pbXVtIHNwZWVkLgotICAgQWxzbyBub3RpY2UgdGhhdCB3aXRoIHRoZSBzY3kgdGhlIHNlbnNvciBvcmRlciBpcyBkaWZmZXJlbnQgdGhlbiB3aXRoIHRoZQorICAgQWxzbyBub3RpY2UgdGhhdCB3aXRoIHRoZSBzY3kgdGhlIHNlbnNvciBvcmRlciBpcyBkaWZmZXJlbnQgdGhhbiB3aXRoIHRoZQogICAgb3RoZXIgY2hpcHMsIHRoaXMgb3JkZXIgd2FzIGluIHRoZSAyLjQgZHJpdmVyIGFuZCBrZXB0IGZvciBjb25zaXN0ZW5jeS4gKi8KIHN0YXRpYyBjb25zdCB1OCBGU0NITURfUkVHX0ZBTl9NSU5bNV1bNl0gPSB7CiAJeyAweDU1LCAweDY1IH0sCQkJCQkvKiBwb3MgKi8KQEAgLTExNSw4ICsxMzEsOCBAQAogc3RhdGljIGNvbnN0IGludCBGU0NITURfTk9fRkFOX1NFTlNPUlNbNV0gPSB7IDMsIDMsIDYsIDQsIDUgfTsKIAogLyogRmFuIHN0YXR1cyByZWdpc3RlciBiaXRtYXNrcyAqLwotI2RlZmluZSBGU0NITURfRkFOX0FMQVJNX01BU0sJCTB4MDQgLyogY2FsbGVkIGZhdWx0IGJ5IEZTQyEgKi8KLSNkZWZpbmUgRlNDSE1EX0ZBTl9OT1RfUFJFU0VOVF9NQVNLCTB4MDggLyogbm90IGRvY3VtZW50ZWQgKi8KKyNkZWZpbmUgRlNDSE1EX0ZBTl9BTEFSTQkweDA0IC8qIGNhbGxlZCBmYXVsdCBieSBGU0MhICovCisjZGVmaW5lIEZTQ0hNRF9GQU5fTk9UX1BSRVNFTlQJMHgwOCAvKiBub3QgZG9jdW1lbnRlZCAqLwogCiAKIC8qIGFjdHVhbCB0ZW1wZXJhdHVyZSByZWdpc3RlcnMgKi8KQEAgLTE1OCwxNCArMTc0LDExIEBACiBzdGF0aWMgY29uc3QgaW50IEZTQ0hNRF9OT19URU1QX1NFTlNPUlNbNV0gPSB7IDMsIDMsIDQsIDMsIDUgfTsKIAogLyogdGVtcCBzdGF0dXMgcmVnaXN0ZXIgYml0bWFza3MgKi8KLSNkZWZpbmUgRlNDSE1EX1RFTVBfV09SS0lOR19NQVNLCTB4MDEKLSNkZWZpbmUgRlNDSE1EX1RFTVBfQUxFUlRfTUFTSwkJMHgwMgorI2RlZmluZSBGU0NITURfVEVNUF9XT1JLSU5HCTB4MDEKKyNkZWZpbmUgRlNDSE1EX1RFTVBfQUxFUlQJMHgwMgogLyogdGhlcmUgb25seSByZWFsbHkgaXMgYW4gYWxhcm0gaWYgdGhlIHNlbnNvciBpcyB3b3JraW5nIGFuZCBhbGVydCA9PSAxICovCiAjZGVmaW5lIEZTQ0hNRF9URU1QX0FMQVJNX01BU0sgXAotCShGU0NITURfVEVNUF9XT1JLSU5HX01BU0sgfCBGU0NITURfVEVNUF9BTEVSVF9NQVNLKQotCi0vKiBvdXIgZHJpdmVyIG5hbWUgKi8KLSNkZWZpbmUgRlNDSE1EX05BTUUgImZzY2htZCIKKwkoRlNDSE1EX1RFTVBfV09SS0lORyB8IEZTQ0hNRF9URU1QX0FMRVJUKQogCiAvKgogICogRnVuY3Rpb25zIGRlY2xhcmF0aW9ucwpAQCAtMTk1LDcgKzIwOCw3IEBACiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZnNjaG1kX2RyaXZlciA9IHsKIAkuY2xhc3MJCT0gSTJDX0NMQVNTX0hXTU9OLAogCS5kcml2ZXIgPSB7Ci0JCS5uYW1lCT0gRlNDSE1EX05BTUUsCisJCS5uYW1lCT0gImZzY2htZCIsCiAJfSwKIAkucHJvYmUJCT0gZnNjaG1kX3Byb2JlLAogCS5yZW1vdmUJCT0gZnNjaG1kX3JlbW92ZSwKQEAgLTIwOSwxNCArMjIyLDI2IEBACiAgKi8KIAogc3RydWN0IGZzY2htZF9kYXRhIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwogCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKIAlzdHJ1Y3QgbXV0ZXggdXBkYXRlX2xvY2s7CisJc3RydWN0IG11dGV4IHdhdGNoZG9nX2xvY2s7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OyAvKiBtZW1iZXIgb2YgdGhlIHdhdGNoZG9nX2RhdGFfbGlzdCAqLworCXN0cnVjdCBrcmVmIGtyZWY7CisJc3RydWN0IG1pc2NkZXZpY2Ugd2F0Y2hkb2dfbWlzY2RldjsKIAlpbnQga2luZDsKKwl1bnNpZ25lZCBsb25nIHdhdGNoZG9nX2lzX29wZW47CisJY2hhciB3YXRjaGRvZ19leHBlY3RfY2xvc2U7CisJY2hhciB3YXRjaGRvZ19uYW1lWzEwXTsgLyogbXVzdCBiZSB1bmlxdWUgdG8gYXZvaWQgc3lzZnMgY29uZmxpY3QgKi8KIAljaGFyIHZhbGlkOyAvKiB6ZXJvIHVudGlsIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCiAJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7IC8qIGluIGppZmZpZXMgKi8KIAogCS8qIHJlZ2lzdGVyIHZhbHVlcyAqLworCXU4IHJldmlzaW9uOyAgICAgICAgICAgIC8qIGNoaXAgcmV2aXNpb24gKi8KIAl1OCBnbG9iYWxfY29udHJvbDsJLyogZ2xvYmFsIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwl1OCB3YXRjaGRvZ19jb250cm9sOyAgICAvKiB3YXRjaGRvZyBjb250cm9sIHJlZ2lzdGVyICovCisJdTggd2F0Y2hkb2dfc3RhdGU7ICAgICAgLyogd2F0Y2hkb2cgc3RhdHVzIHJlZ2lzdGVyICovCisJdTggd2F0Y2hkb2dfcHJlc2V0OyAgICAgLyogd2F0Y2hkb2cgY291bnRlciBwcmVzZXQgb24gdHJpZ2dlciB2YWwgKi8KIAl1OCB2b2x0WzNdOwkJLyogMTIsIDUsIGJhdHRlcnkgdm9sdGFnZSAqLwogCXU4IHRlbXBfYWN0WzVdOwkJLyogdGVtcGVyYXR1cmUgKi8KIAl1OCB0ZW1wX3N0YXR1c1s1XTsJLyogc3RhdHVzIG9mIHNlbnNvciAqLwpAQCAtMjI4LDExICsyNTMsMjggQEAKIH07CiAKIC8qIEdsb2JhbCB2YXJpYWJsZXMgdG8gaG9sZCBpbmZvcm1hdGlvbiByZWFkIGZyb20gc3BlY2lhbCBETUkgdGFibGVzLCB3aGljaCBhcmUKLSAgIGF2YWlsYWJsZSBvbiBGU0MgbWFjaGluZXMgd2l0aCBhbiBmc2NoZXIgb3IgbGF0ZXIgY2hpcC4gKi8KKyAgIGF2YWlsYWJsZSBvbiBGU0MgbWFjaGluZXMgd2l0aCBhbiBmc2NoZXIgb3IgbGF0ZXIgY2hpcC4gVGhlcmUgaXMgbm8gbmVlZCB0bworICAgcHJvdGVjdCB0aGVzZSB3aXRoIGEgbG9jayBhcyB0aGV5IGFyZSBvbmx5IG1vZGlmaWVkIGZyb20gb3VyIGF0dGFjaCBmdW5jdGlvbgorICAgd2hpY2ggYWx3YXlzIGdldHMgY2FsbGVkIHdpdGggdGhlIGkyYy1jb3JlIGxvY2sgaGVsZCBhbmQgbmV2ZXIgYWNjZXNzZWQKKyAgIGJlZm9yZSB0aGUgYXR0YWNoIGZ1bmN0aW9uIGlzIGRvbmUgd2l0aCB0aGVtLiAqLwogc3RhdGljIGludCBkbWlfbXVsdFszXSA9IHsgNDkwLCAyMDAsIDEwMCB9Owogc3RhdGljIGludCBkbWlfb2Zmc2V0WzNdID0geyAwLCAwLCAwIH07CiBzdGF0aWMgaW50IGRtaV92cmVmID0gLTE7CiAKKy8qIFNvbWV3aGF0IHVnbHkgOiggZ2xvYmFsIGRhdGEgcG9pbnRlciBsaXN0IHdpdGggYWxsIGZzY2htZCBkZXZpY2VzLCBzbyB0aGF0CisgICB3ZSBjYW4gZmluZCBvdXIgZGV2aWNlIGRhdGEgYXMgd2hlbiB1c2luZyBtaXNjX3JlZ2lzdGVyIHRoZXJlIGlzIG5vIG90aGVyCisgICBtZXRob2QgdG8gZ2V0IHRvIG9uZXMgZGV2aWNlIGRhdGEgZnJvbSB0aGUgb3BlbiBmb3AuICovCitzdGF0aWMgTElTVF9IRUFEKHdhdGNoZG9nX2RhdGFfbGlzdCk7CisvKiBOb3RlIHRoaXMgbG9jayBub3Qgb25seSBwcm90ZWN0IGxpc3QgYWNjZXNzLCBidXQgYWxzbyBkYXRhLmtyZWYgYWNjZXNzICovCitzdGF0aWMgREVGSU5FX01VVEVYKHdhdGNoZG9nX2RhdGFfbXV0ZXgpOworCisvKiBSZWxlYXNlIG91ciBkYXRhIHN0cnVjdCB3aGVuIHdlJ3JlIGRldGFjaGVkIGZyb20gdGhlIGkyYyBjbGllbnQgKmFuZCogYWxsCisgICByZWZlcmVuY2VzIHRvIG91ciB3YXRjaGRvZyBkZXZpY2UgYXJlIHJlbGVhc2VkICovCitzdGF0aWMgdm9pZCBmc2NobWRfcmVsZWFzZV9yZXNvdXJjZXMoc3RydWN0IGtyZWYgKnJlZikKK3sKKwlzdHJ1Y3QgZnNjaG1kX2RhdGEgKmRhdGEgPSBjb250YWluZXJfb2YocmVmLCBzdHJ1Y3QgZnNjaG1kX2RhdGEsIGtyZWYpOworCWtmcmVlKGRhdGEpOworfQogCiAvKgogICogU3lzZnMgYXR0ciBzaG93IC8gc3RvcmUgZnVuY3Rpb25zCkBAIC0zMDAsNyArMzQyLDcgQEAKIAlzdHJ1Y3QgZnNjaG1kX2RhdGEgKmRhdGEgPSBmc2NobWRfdXBkYXRlX2RldmljZShkZXYpOwogCiAJLyogYml0IDAgc2V0IG1lYW5zIHNlbnNvciB3b3JraW5nIG9rLCBzbyBubyBmYXVsdCEgKi8KLQlpZiAoZGF0YS0+dGVtcF9zdGF0dXNbaW5kZXhdICYgRlNDSE1EX1RFTVBfV09SS0lOR19NQVNLKQorCWlmIChkYXRhLT50ZW1wX3N0YXR1c1tpbmRleF0gJiBGU0NITURfVEVNUF9XT1JLSU5HKQogCQlyZXR1cm4gc3ByaW50ZihidWYsICIwXG4iKTsKIAllbHNlCiAJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjFcbiIpOwpAQCAtMzg1LDcgKzQyNyw3IEBACiAJaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKIAlzdHJ1Y3QgZnNjaG1kX2RhdGEgKmRhdGEgPSBmc2NobWRfdXBkYXRlX2RldmljZShkZXYpOwogCi0JaWYgKGRhdGEtPmZhbl9zdGF0dXNbaW5kZXhdICYgRlNDSE1EX0ZBTl9BTEFSTV9NQVNLKQorCWlmIChkYXRhLT5mYW5fc3RhdHVzW2luZGV4XSAmIEZTQ0hNRF9GQU5fQUxBUk0pCiAJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjFcbiIpOwogCWVsc2UKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiMFxuIik7CkBAIC0zOTcsNyArNDM5LDcgQEAKIAlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OwogCXN0cnVjdCBmc2NobWRfZGF0YSAqZGF0YSA9IGZzY2htZF91cGRhdGVfZGV2aWNlKGRldik7CiAKLQlpZiAoZGF0YS0+ZmFuX3N0YXR1c1tpbmRleF0gJiBGU0NITURfRkFOX05PVF9QUkVTRU5UX01BU0spCisJaWYgKGRhdGEtPmZhbl9zdGF0dXNbaW5kZXhdICYgRlNDSE1EX0ZBTl9OT1RfUFJFU0VOVCkKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiMVxuIik7CiAJZWxzZQogCQlyZXR1cm4gc3ByaW50ZihidWYsICIwXG4iKTsKQEAgLTQ0OSw3ICs0OTEsNyBAQAogewogCXN0cnVjdCBmc2NobWRfZGF0YSAqZGF0YSA9IGZzY2htZF91cGRhdGVfZGV2aWNlKGRldik7CiAKLQlpZiAoZGF0YS0+Z2xvYmFsX2NvbnRyb2wgJiBGU0NITURfQ09OVFJPTF9BTEVSVF9MRURfTUFTSykKKwlpZiAoZGF0YS0+Z2xvYmFsX2NvbnRyb2wgJiBGU0NITURfQ09OVFJPTF9BTEVSVF9MRUQpCiAJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjFcbiIpOwogCWVsc2UKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiMFxuIik7CkBAIC00NjcsOSArNTA5LDkgQEAKIAlyZWcgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEodG9faTJjX2NsaWVudChkZXYpLCBGU0NITURfUkVHX0NPTlRST0wpOwogCiAJaWYgKHYpCi0JCXJlZyB8PSBGU0NITURfQ09OVFJPTF9BTEVSVF9MRURfTUFTSzsKKwkJcmVnIHw9IEZTQ0hNRF9DT05UUk9MX0FMRVJUX0xFRDsKIAllbHNlCi0JCXJlZyAmPSB+RlNDSE1EX0NPTlRST0xfQUxFUlRfTEVEX01BU0s7CisJCXJlZyAmPSB+RlNDSE1EX0NPTlRST0xfQUxFUlRfTEVEOwogCiAJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YSh0b19pMmNfY2xpZW50KGRldiksIEZTQ0hNRF9SRUdfQ09OVFJPTCwgcmVnKTsKIApAQCAtNTUxLDcgKzU5MywyNjUgQEAKIAogCiAvKgotICogUmVhbCBjb2RlCisgKiBXYXRjaGRvZyByb3V0aW5lcworICovCisKK3N0YXRpYyBpbnQgd2F0Y2hkb2dfc2V0X3RpbWVvdXQoc3RydWN0IGZzY2htZF9kYXRhICpkYXRhLCBpbnQgdGltZW91dCkKK3sKKwlpbnQgcmV0LCByZXNvbHV0aW9uOworCWludCBraW5kID0gZGF0YS0+a2luZCArIDE7IC8qIDAteCBhcnJheSBpbmRleCAtPiAxLXggbW9kdWxlIHBhcmFtICovCisKKwkvKiAyIHNlY29uZCBvciA2MCBzZWNvbmQgcmVzb2x1dGlvbj8gKi8KKwlpZiAodGltZW91dCA8PSA1MTAgfHwga2luZCA9PSBmc2Nwb3MgfHwga2luZCA9PSBmc2NzY3kpCisJCXJlc29sdXRpb24gPSAyOworCWVsc2UKKwkJcmVzb2x1dGlvbiA9IDYwOworCisJaWYgKHRpbWVvdXQgPCByZXNvbHV0aW9uIHx8IHRpbWVvdXQgPiAocmVzb2x1dGlvbiAqIDI1NSkpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmZGF0YS0+d2F0Y2hkb2dfbG9jayk7CisJaWYgKCFkYXRhLT5jbGllbnQpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBsZWF2ZTsKKwl9CisKKwlpZiAocmVzb2x1dGlvbiA9PSAyKQorCQlkYXRhLT53YXRjaGRvZ19jb250cm9sICY9IH5GU0NITURfV0RPR19DT05UUk9MX1JFU09MVVRJT047CisJZWxzZQorCQlkYXRhLT53YXRjaGRvZ19jb250cm9sIHw9IEZTQ0hNRF9XRE9HX0NPTlRST0xfUkVTT0xVVElPTjsKKworCWRhdGEtPndhdGNoZG9nX3ByZXNldCA9IERJVl9ST1VORF9VUCh0aW1lb3V0LCByZXNvbHV0aW9uKTsKKworCS8qIFdyaXRlIG5ldyB0aW1lb3V0IHZhbHVlICovCisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsIEZTQ0hNRF9SRUdfV0RPR19QUkVTRVQsCisJCWRhdGEtPndhdGNoZG9nX3ByZXNldCk7CisJLyogV3JpdGUgbmV3IGNvbnRyb2wgcmVnaXN0ZXIsIGRvIG5vdCB0cmlnZ2VyISAqLworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LCBGU0NITURfUkVHX1dET0dfQ09OVFJPTCwKKwkJZGF0YS0+d2F0Y2hkb2dfY29udHJvbCAmIH5GU0NITURfV0RPR19DT05UUk9MX1RSSUdHRVIpOworCisJcmV0ID0gZGF0YS0+d2F0Y2hkb2dfcHJlc2V0ICogcmVzb2x1dGlvbjsKKworbGVhdmU6CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT53YXRjaGRvZ19sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdhdGNoZG9nX2dldF90aW1lb3V0KHN0cnVjdCBmc2NobWRfZGF0YSAqZGF0YSkKK3sKKwlpbnQgdGltZW91dDsKKworCW11dGV4X2xvY2soJmRhdGEtPndhdGNoZG9nX2xvY2spOworCWlmIChkYXRhLT53YXRjaGRvZ19jb250cm9sICYgRlNDSE1EX1dET0dfQ09OVFJPTF9SRVNPTFVUSU9OKQorCQl0aW1lb3V0ID0gZGF0YS0+d2F0Y2hkb2dfcHJlc2V0ICogNjA7CisJZWxzZQorCQl0aW1lb3V0ID0gZGF0YS0+d2F0Y2hkb2dfcHJlc2V0ICogMjsKKwltdXRleF91bmxvY2soJmRhdGEtPndhdGNoZG9nX2xvY2spOworCisJcmV0dXJuIHRpbWVvdXQ7Cit9CisKK3N0YXRpYyBpbnQgd2F0Y2hkb2dfdHJpZ2dlcihzdHJ1Y3QgZnNjaG1kX2RhdGEgKmRhdGEpCit7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZkYXRhLT53YXRjaGRvZ19sb2NrKTsKKwlpZiAoIWRhdGEtPmNsaWVudCkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGxlYXZlOworCX0KKworCWRhdGEtPndhdGNoZG9nX2NvbnRyb2wgfD0gRlNDSE1EX1dET0dfQ09OVFJPTF9UUklHR0VSOworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LCBGU0NITURfUkVHX1dET0dfQ09OVFJPTCwKKwkJCQkJZGF0YS0+d2F0Y2hkb2dfY29udHJvbCk7CitsZWF2ZToKKwltdXRleF91bmxvY2soJmRhdGEtPndhdGNoZG9nX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd2F0Y2hkb2dfc3RvcChzdHJ1Y3QgZnNjaG1kX2RhdGEgKmRhdGEpCit7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZkYXRhLT53YXRjaGRvZ19sb2NrKTsKKwlpZiAoIWRhdGEtPmNsaWVudCkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGxlYXZlOworCX0KKworCWRhdGEtPndhdGNoZG9nX2NvbnRyb2wgJj0gfkZTQ0hNRF9XRE9HX0NPTlRST0xfU1RBUlRFRDsKKwkvKiBEb24ndCBzdG9yZSB0aGUgc3RvcCBmbGFnIGluIG91ciB3YXRjaGRvZyBjb250cm9sIHJlZ2lzdGVyIGNvcHksIGFzCisJICAgaXRzIGEgd3JpdGUgb25seSBiaXQgKHJlYWQgYWx3YXlzIHJldHVybnMgMCkgKi8KKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgRlNDSE1EX1JFR19XRE9HX0NPTlRST0wsCisJCWRhdGEtPndhdGNoZG9nX2NvbnRyb2wgfCBGU0NITURfV0RPR19DT05UUk9MX1NUT1ApOworbGVhdmU6CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT53YXRjaGRvZ19sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdhdGNoZG9nX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IGZzY2htZF9kYXRhICpwb3MsICpkYXRhID0gTlVMTDsKKworCS8qIFdlIGdldCBjYWxsZWQgZnJvbSBkcml2ZXJzL2NoYXIvbWlzYy5jIHdpdGggbWlzY19tdHggaG9sZCwgYW5kIHdlCisJICAgY2FsbCBtaXNjX3JlZ2lzdGVyKCkgZnJvbSBmc2NobWRfcHJvYmUoKSB3aXRoIHdhdGNoZG9nX2RhdGFfbXV0ZXgKKwkgICBob2xkLCBhcyBtaXNjX3JlZ2lzdGVyKCkgdGFrZXMgdGhlIG1pc2NfbXR4IGxvY2ssIHRoaXMgaXMgYSBwb3NzaWJsZQorCSAgIGRlYWRsb2NrLCBzbyB3ZSB1c2UgbXV0ZXhfdHJ5bG9jayBoZXJlLiAqLworCWlmICghbXV0ZXhfdHJ5bG9jaygmd2F0Y2hkb2dfZGF0YV9tdXRleCkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsICZ3YXRjaGRvZ19kYXRhX2xpc3QsIGxpc3QpIHsKKwkJaWYgKHBvcy0+d2F0Y2hkb2dfbWlzY2Rldi5taW5vciA9PSBpbWlub3IoaW5vZGUpKSB7CisJCQlkYXRhID0gcG9zOworCQkJYnJlYWs7CisJCX0KKwl9CisJLyogTm90ZSB3ZSBjYW4gbmV2ZXIgbm90IGhhdmUgZm91bmQgZGF0YSwgc28gd2UgZG9uJ3QgY2hlY2sgZm9yIHRoaXMgKi8KKwlrcmVmX2dldCgmZGF0YS0+a3JlZik7CisJbXV0ZXhfdW5sb2NrKCZ3YXRjaGRvZ19kYXRhX211dGV4KTsKKworCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZkYXRhLT53YXRjaGRvZ19pc19vcGVuKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qIFN0YXJ0IHRoZSB3YXRjaGRvZyAqLworCXdhdGNoZG9nX3RyaWdnZXIoZGF0YSk7CisJZmlscC0+cHJpdmF0ZV9kYXRhID0gZGF0YTsKKworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxwKTsKK30KKworc3RhdGljIGludCB3YXRjaGRvZ19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBmc2NobWRfZGF0YSAqZGF0YSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKworCWlmIChkYXRhLT53YXRjaGRvZ19leHBlY3RfY2xvc2UpIHsKKwkJd2F0Y2hkb2dfc3RvcChkYXRhKTsKKwkJZGF0YS0+d2F0Y2hkb2dfZXhwZWN0X2Nsb3NlID0gMDsKKwl9IGVsc2UgeworCQl3YXRjaGRvZ190cmlnZ2VyKGRhdGEpOworCQlkZXZfY3JpdCgmZGF0YS0+Y2xpZW50LT5kZXYsCisJCQkidW5leHBlY3RlZCBjbG9zZSwgbm90IHN0b3BwaW5nIHdhdGNoZG9nIVxuIik7CisJfQorCisJY2xlYXJfYml0KDAsICZkYXRhLT53YXRjaGRvZ19pc19vcGVuKTsKKworCW11dGV4X2xvY2soJndhdGNoZG9nX2RhdGFfbXV0ZXgpOworCWtyZWZfcHV0KCZkYXRhLT5rcmVmLCBmc2NobWRfcmVsZWFzZV9yZXNvdXJjZXMpOworCW11dGV4X3VubG9jaygmd2F0Y2hkb2dfZGF0YV9tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3Qgd2F0Y2hkb2dfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZnNldCkKK3sKKwlzaXplX3QgcmV0OworCXN0cnVjdCBmc2NobWRfZGF0YSAqZGF0YSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKworCWlmIChjb3VudCkgeworCQlpZiAoIW5vd2F5b3V0KSB7CisJCQlzaXplX3QgaTsKKworCQkJLyogQ2xlYXIgaXQgaW4gY2FzZSBpdCB3YXMgc2V0IHdpdGggYSBwcmV2aW91cyB3cml0ZSAqLworCQkJZGF0YS0+d2F0Y2hkb2dfZXhwZWN0X2Nsb3NlID0gMDsKKworCQkJZm9yIChpID0gMDsgaSAhPSBjb3VudDsgaSsrKSB7CisJCQkJY2hhciBjOworCQkJCWlmIChnZXRfdXNlcihjLCBidWYgKyBpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJaWYgKGMgPT0gJ1YnKQorCQkJCQlkYXRhLT53YXRjaGRvZ19leHBlY3RfY2xvc2UgPSAxOworCQkJfQorCQl9CisJCXJldCA9IHdhdGNoZG9nX3RyaWdnZXIoZGF0YSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IHdhdGNoZG9nX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKKwkJLm9wdGlvbnMgPSBXRElPRl9LRUVQQUxJVkVQSU5HIHwgV0RJT0ZfU0VUVElNRU9VVCB8CisJCQkJV0RJT0ZfQ0FSRFJFU0VULAorCQkuaWRlbnRpdHkgPSAiRlNDIHdhdGNoZG9nIgorCX07CisJaW50IGksIHJldCA9IDA7CisJc3RydWN0IGZzY2htZF9kYXRhICpkYXRhID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFdESU9DX0dFVFNVUFBPUlQ6CisJCWlkZW50LmZpcm13YXJlX3ZlcnNpb24gPSBkYXRhLT5yZXZpc2lvbjsKKwkJaWYgKCFub3dheW91dCkKKwkJCWlkZW50Lm9wdGlvbnMgfD0gV0RJT0ZfTUFHSUNDTE9TRTsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZpZGVudCwgc2l6ZW9mKGlkZW50KSkpCisJCQlyZXQgPSAtRUZBVUxUOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCQlyZXQgPSBwdXRfdXNlcigwLCAoaW50IF9fdXNlciAqKWFyZyk7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgorCQlpZiAoZGF0YS0+d2F0Y2hkb2dfc3RhdGUgJiBGU0NITURfV0RPR19TVEFURV9DQVJEUkVTRVQpCisJCQlyZXQgPSBwdXRfdXNlcihXRElPRl9DQVJEUkVTRVQsIChpbnQgX191c2VyICopYXJnKTsKKwkJZWxzZQorCQkJcmV0ID0gcHV0X3VzZXIoMCwgKGludCBfX3VzZXIgKilhcmcpOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQlyZXQgPSB3YXRjaGRvZ190cmlnZ2VyKGRhdGEpOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKKwkJaSA9IHdhdGNoZG9nX2dldF90aW1lb3V0KGRhdGEpOworCQlyZXQgPSBwdXRfdXNlcihpLCAoaW50IF9fdXNlciAqKWFyZyk7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgorCQlpZiAoZ2V0X3VzZXIoaSwgKGludCBfX3VzZXIgKilhcmcpKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJcmV0ID0gd2F0Y2hkb2dfc2V0X3RpbWVvdXQoZGF0YSwgaSk7CisJCWlmIChyZXQgPiAwKQorCQkJcmV0ID0gcHV0X3VzZXIocmV0LCAoaW50IF9fdXNlciAqKWFyZyk7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19TRVRPUFRJT05TOgorCQlpZiAoZ2V0X3VzZXIoaSwgKGludCBfX3VzZXIgKilhcmcpKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaSAmIFdESU9TX0RJU0FCTEVDQVJEKQorCQkJcmV0ID0gd2F0Y2hkb2dfc3RvcChkYXRhKTsKKwkJZWxzZSBpZiAoaSAmIFdESU9TX0VOQUJMRUNBUkQpCisJCQlyZXQgPSB3YXRjaGRvZ190cmlnZ2VyKGRhdGEpOworCQllbHNlCisJCQlyZXQgPSAtRUlOVkFMOworCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9UVFk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgd2F0Y2hkb2dfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubGxzZWVrID0gbm9fbGxzZWVrLAorCS5vcGVuID0gd2F0Y2hkb2dfb3BlbiwKKwkucmVsZWFzZSA9IHdhdGNoZG9nX3JlbGVhc2UsCisJLndyaXRlID0gd2F0Y2hkb2dfd3JpdGUsCisJLmlvY3RsID0gd2F0Y2hkb2dfaW9jdGwsCit9OworCisKKy8qCisgKiBEZXRlY3QsIHJlZ2lzdGVyLCB1bnJlZ2lzdGVyIGFuZCB1cGRhdGUgZGV2aWNlIGZ1bmN0aW9ucwogICovCiAKIC8qIERNSSBkZWNvZGUgcm91dGluZSB0byByZWFkIHZvbHRhZ2Ugc2NhbGluZyBmYWN0b3JzIGZyb20gc3BlY2lhbCBETUkgdGFibGVzLApAQCAtNjYxLDkgKzk2MSw5IEBACiAJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IGZzY2htZF9kYXRhICpkYXRhOwotCXU4IHJldmlzaW9uOwogCWNvbnN0IGNoYXIgKiBjb25zdCBuYW1lc1s1XSA9IHsgIlBvc2VpZG9uIiwgIkhlcm1lcyIsICJTY3lsbGEiLAogCQkJCQkiSGVyYWNsZXMiLCAiSGVpbWRhbGwiIH07CisJY29uc3QgaW50IHdhdGNoZG9nX21pbm9yc1tdID0geyBXQVRDSERPR19NSU5PUiwgMjEyLCAyMTMsIDIxNCwgMjE1IH07CiAJaW50IGksIGVycjsKIAllbnVtIGNoaXBzIGtpbmQgPSBpZC0+ZHJpdmVyX2RhdGE7CiAKQEAgLTY3Myw2ICs5NzMsMTMgQEAKIAogCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGRhdGEpOwogCW11dGV4X2luaXQoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwltdXRleF9pbml0KCZkYXRhLT53YXRjaGRvZ19sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmZGF0YS0+bGlzdCk7CisJa3JlZl9pbml0KCZkYXRhLT5rcmVmKTsKKwkvKiBTdG9yZSBjbGllbnQgcG9pbnRlciBpbiBvdXIgZGF0YSBzdHJ1Y3QgZm9yIHdhdGNoZG9nIHVzYWdlCisJICAgKHdoZXJlIHRoZSBjbGllbnQgaXMgZm91bmQgdGhyb3VnaCBhIGRhdGEgcHRyIGluc3RlYWQgb2YgdGhlCisJICAgb3RoZXJ3YXkgYXJvdW5kKSAqLworCWRhdGEtPmNsaWVudCA9IGNsaWVudDsKIAogCWlmIChraW5kID09IGZzY3BvcykgewogCQkvKiBUaGUgUG9zZWlkb24gaGFzIGhhcmR3aXJlZCB0ZW1wIGxpbWl0cywgZmlsbCB0aGVzZQpAQCAtNjgzLDE2ICs5OTAsMjcgQEAKIAl9CiAKIAkvKiBSZWFkIHRoZSBzcGVjaWFsIERNSSB0YWJsZSBmb3IgZnNjaGVyIGFuZCBuZXdlciBjaGlwcyAqLwotCWlmIChraW5kID09IGZzY2hlciB8fCBraW5kID49IGZzY2hyYykgeworCWlmICgoa2luZCA9PSBmc2NoZXIgfHwga2luZCA+PSBmc2NocmMpICYmIGRtaV92cmVmID09IC0xKSB7CiAJCWRtaV93YWxrKGZzY2htZF9kbWlfZGVjb2RlKTsKIAkJaWYgKGRtaV92cmVmID09IC0xKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HIEZTQ0hNRF9OQU1FCi0JCQkJIjogQ291bGRuJ3QgZ2V0IHZvbHRhZ2Ugc2NhbGluZyBmYWN0b3JzIGZyb20gIgorCQkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LAorCQkJCSJDb3VsZG4ndCBnZXQgdm9sdGFnZSBzY2FsaW5nIGZhY3RvcnMgZnJvbSAiCiAJCQkJIkJJT1MgRE1JIHRhYmxlLCB1c2luZyBidWlsdGluIGRlZmF1bHRzXG4iKTsKIAkJCWRtaV92cmVmID0gMzM7CiAJCX0KIAl9CiAKKwkvKiBSZWFkIGluIHNvbWUgbmV2ZXIgY2hhbmdpbmcgcmVnaXN0ZXJzICovCisJZGF0YS0+cmV2aXNpb24gPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBGU0NITURfUkVHX1JFVklTSU9OKTsKKwlkYXRhLT5nbG9iYWxfY29udHJvbCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCUZTQ0hNRF9SRUdfQ09OVFJPTCk7CisJZGF0YS0+d2F0Y2hkb2dfY29udHJvbCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCUZTQ0hNRF9SRUdfV0RPR19DT05UUk9MKTsKKwlkYXRhLT53YXRjaGRvZ19zdGF0ZSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCUZTQ0hNRF9SRUdfV0RPR19TVEFURSk7CisJZGF0YS0+d2F0Y2hkb2dfcHJlc2V0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJRlNDSE1EX1JFR19XRE9HX1BSRVNFVCk7CisKIAkvKiBpMmMga2luZCBnb2VzIGZyb20gMS01LCB3ZSB3YW50IGZyb20gMC00IHRvIGFkZHJlc3MgYXJyYXlzICovCiAJZGF0YS0+a2luZCA9IGtpbmQgLSAxOwogCkBAIC03MzUsOSArMTA1Myw0MyBAQAogCQlnb3RvIGV4aXRfZGV0YWNoOwogCX0KIAotCXJldmlzaW9uID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgRlNDSE1EX1JFR19SRVZJU0lPTik7Ci0JcHJpbnRrKEtFUk5fSU5GTyBGU0NITURfTkFNRSAiOiBEZXRlY3RlZCBGU0MgJXMgY2hpcCwgcmV2aXNpb246ICVkXG4iLAotCQluYW1lc1tkYXRhLT5raW5kXSwgKGludCkgcmV2aXNpb24pOworCS8qIFdlIHRha2UgdGhlIGRhdGFfbXV0ZXggbG9jayBlYXJseSBzbyB0aGF0IHdhdGNoZG9nX29wZW4oKSBjYW5ub3QKKwkgICBydW4gd2hlbiBtaXNjX3JlZ2lzdGVyKCkgaGFzIGNvbXBsZXRlZCwgYnV0IHdlJ3ZlIG5vdCB5ZXQgYWRkZWQKKwkgICBvdXIgZGF0YSB0byB0aGUgd2F0Y2hkb2dfZGF0YV9saXN0IChhbmQgc2V0IHRoZSBkZWZhdWx0IHRpbWVvdXQpICovCisJbXV0ZXhfbG9jaygmd2F0Y2hkb2dfZGF0YV9tdXRleCk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod2F0Y2hkb2dfbWlub3JzKTsgaSsrKSB7CisJCS8qIFJlZ2lzdGVyIG91ciB3YXRjaGRvZyBwYXJ0ICovCisJCXNucHJpbnRmKGRhdGEtPndhdGNoZG9nX25hbWUsIHNpemVvZihkYXRhLT53YXRjaGRvZ19uYW1lKSwKKwkJCSJ3YXRjaGRvZyVjIiwgKGkgPT0gMCkgPyAnXDAnIDogKCcwJyArIGkpKTsKKwkJZGF0YS0+d2F0Y2hkb2dfbWlzY2Rldi5uYW1lID0gZGF0YS0+d2F0Y2hkb2dfbmFtZTsKKwkJZGF0YS0+d2F0Y2hkb2dfbWlzY2Rldi5mb3BzID0gJndhdGNoZG9nX2ZvcHM7CisJCWRhdGEtPndhdGNoZG9nX21pc2NkZXYubWlub3IgPSB3YXRjaGRvZ19taW5vcnNbaV07CisJCWVyciA9IG1pc2NfcmVnaXN0ZXIoJmRhdGEtPndhdGNoZG9nX21pc2NkZXYpOworCQlpZiAoZXJyID09IC1FQlVTWSkKKwkJCWNvbnRpbnVlOworCQlpZiAoZXJyKSB7CisJCQlkYXRhLT53YXRjaGRvZ19taXNjZGV2Lm1pbm9yID0gMDsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJCSJSZWdpc3RlcmluZyB3YXRjaGRvZyBjaGFyZGV2OiAlZFxuIiwgZXJyKTsKKwkJCWJyZWFrOworCQl9CisKKwkJbGlzdF9hZGQoJmRhdGEtPmxpc3QsICZ3YXRjaGRvZ19kYXRhX2xpc3QpOworCQl3YXRjaGRvZ19zZXRfdGltZW91dChkYXRhLCA2MCk7CisJCWRldl9pbmZvKCZjbGllbnQtPmRldiwKKwkJCSJSZWdpc3RlcmVkIHdhdGNoZG9nIGNoYXJkZXYgbWFqb3IgMTAsIG1pbm9yOiAlZFxuIiwKKwkJCXdhdGNoZG9nX21pbm9yc1tpXSk7CisJCWJyZWFrOworCX0KKwlpZiAoaSA9PSBBUlJBWV9TSVpFKHdhdGNoZG9nX21pbm9ycykpIHsKKwkJZGF0YS0+d2F0Y2hkb2dfbWlzY2Rldi5taW5vciA9IDA7CisJCWRldl93YXJuKCZjbGllbnQtPmRldiwgIkNvdWxkbid0IHJlZ2lzdGVyIHdhdGNoZG9nIGNoYXJkZXYgIgorCQkJIihkdWUgdG8gbm8gZnJlZSBtaW5vcilcbiIpOworCX0KKwltdXRleF91bmxvY2soJndhdGNoZG9nX2RhdGFfbXV0ZXgpOworCisJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiRGV0ZWN0ZWQgRlNDICVzIGNoaXAsIHJldmlzaW9uOiAlZFxuIiwKKwkJbmFtZXNbZGF0YS0+a2luZF0sIChpbnQpIGRhdGEtPnJldmlzaW9uKTsKIAogCXJldHVybiAwOwogCkBAIC03NTEsNiArMTEwMywyNCBAQAogCXN0cnVjdCBmc2NobWRfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCWludCBpOwogCisJLyogVW5yZWdpc3RlciB0aGUgd2F0Y2hkb2cgKGlmIHJlZ2lzdGVyZWQpICovCisJaWYgKGRhdGEtPndhdGNoZG9nX21pc2NkZXYubWlub3IpIHsKKwkJbWlzY19kZXJlZ2lzdGVyKCZkYXRhLT53YXRjaGRvZ19taXNjZGV2KTsKKwkJaWYgKGRhdGEtPndhdGNoZG9nX2lzX29wZW4pIHsKKwkJCWRldl93YXJuKCZjbGllbnQtPmRldiwKKwkJCQkiaTJjIGNsaWVudCBkZXRhY2hlZCB3aXRoIHdhdGNoZG9nIG9wZW4hICIKKwkJCQkiU3RvcHBpbmcgd2F0Y2hkb2cuXG4iKTsKKwkJCXdhdGNoZG9nX3N0b3AoZGF0YSk7CisJCX0KKwkJbXV0ZXhfbG9jaygmd2F0Y2hkb2dfZGF0YV9tdXRleCk7CisJCWxpc3RfZGVsKCZkYXRhLT5saXN0KTsKKwkJbXV0ZXhfdW5sb2NrKCZ3YXRjaGRvZ19kYXRhX211dGV4KTsKKwkJLyogVGVsbCB0aGUgd2F0Y2hkb2cgY29kZSB0aGUgY2xpZW50IGlzIGdvbmUgKi8KKwkJbXV0ZXhfbG9jaygmZGF0YS0+d2F0Y2hkb2dfbG9jayk7CisJCWRhdGEtPmNsaWVudCA9IE5VTEw7CisJCW11dGV4X3VubG9jaygmZGF0YS0+d2F0Y2hkb2dfbG9jayk7CisJfQorCiAJLyogQ2hlY2sgaWYgcmVnaXN0ZXJlZCBpbiBjYXNlIHdlJ3JlIGNhbGxlZCBmcm9tIGZzY2htZF9kZXRlY3QKIAkgICB0byBjbGVhbnVwIGFmdGVyIGFuIGVycm9yICovCiAJaWYgKGRhdGEtPmh3bW9uX2RldikKQEAgLTc2NSw3ICsxMTM1LDEwIEBACiAJCWRldmljZV9yZW1vdmVfZmlsZSgmY2xpZW50LT5kZXYsCiAJCQkJCSZmc2NobWRfZmFuX2F0dHJbaV0uZGV2X2F0dHIpOwogCi0Ja2ZyZWUoZGF0YSk7CisJbXV0ZXhfbG9jaygmd2F0Y2hkb2dfZGF0YV9tdXRleCk7CisJa3JlZl9wdXQoJmRhdGEtPmtyZWYsIGZzY2htZF9yZWxlYXNlX3Jlc291cmNlcyk7CisJbXV0ZXhfdW5sb2NrKCZ3YXRjaGRvZ19kYXRhX211dGV4KTsKKwogCXJldHVybiAwOwogfQogCkBAIC03OTgsNyArMTE3MSw3IEBACiAJCQkJCWRhdGEtPnRlbXBfYWN0W2ldIDwgZGF0YS0+dGVtcF9tYXhbaV0pCiAJCQkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsCiAJCQkJCUZTQ0hNRF9SRUdfVEVNUF9TVEFURVtkYXRhLT5raW5kXVtpXSwKLQkJCQkJRlNDSE1EX1RFTVBfQUxFUlRfTUFTSyk7CisJCQkJCUZTQ0hNRF9URU1QX0FMRVJUKTsKIAkJfQogCiAJCWZvciAoaSA9IDA7IGkgPCBGU0NITURfTk9fRkFOX1NFTlNPUlNbZGF0YS0+a2luZF07IGkrKykgewpAQCAtODE2LDI4ICsxMTg5LDE3IEBACiAJCQkJCUZTQ0hNRF9SRUdfRkFOX01JTltkYXRhLT5raW5kXVtpXSk7CiAKIAkJCS8qIHJlc2V0IGZhbiBzdGF0dXMgaWYgc3BlZWQgaXMgYmFjayB0byA+IDAgKi8KLQkJCWlmICgoZGF0YS0+ZmFuX3N0YXR1c1tpXSAmIEZTQ0hNRF9GQU5fQUxBUk1fTUFTSykgJiYKKwkJCWlmICgoZGF0YS0+ZmFuX3N0YXR1c1tpXSAmIEZTQ0hNRF9GQU5fQUxBUk0pICYmCiAJCQkJCWRhdGEtPmZhbl9hY3RbaV0pCiAJCQkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsCiAJCQkJCUZTQ0hNRF9SRUdfRkFOX1NUQVRFW2RhdGEtPmtpbmRdW2ldLAotCQkJCQlGU0NITURfRkFOX0FMQVJNX01BU0spOworCQkJCQlGU0NITURfRkFOX0FMQVJNKTsKIAkJfQogCiAJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCiAJCQlkYXRhLT52b2x0W2ldID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKIAkJCQkJCUZTQ0hNRF9SRUdfVk9MVFtpXSk7CiAKLQkJZGF0YS0+Z2xvYmFsX2NvbnRyb2wgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAotCQkJCQkJRlNDSE1EX1JFR19DT05UUk9MKTsKLQotCQkvKiBUbyBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgZnV0dXJlCi0JCWRhdGEtPndhdGNoZG9nWzBdID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKLQkJCQkJCUZTQ0hNRF9SRUdfV0RPR19QUkVTRVQpOwotCQlkYXRhLT53YXRjaGRvZ1sxXSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCi0JCQkJCQlGU0NITURfUkVHX1dET0dfU1RBVEUpOwotCQlkYXRhLT53YXRjaGRvZ1syXSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCi0JCQkJCQlGU0NITURfUkVHX1dET0dfQ09OVFJPTCk7ICovCi0KIAkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKIAkJZGF0YS0+dmFsaWQgPSAxOwogCX0KQEAgLTg1Nyw3ICsxMjE5LDcgQEAKIAlpMmNfZGVsX2RyaXZlcigmZnNjaG1kX2RyaXZlcik7CiB9CiAKLU1PRFVMRV9BVVRIT1IoIkhhbnMgZGUgR29lZGUgPGoudy5yLmRlZ29lZGVAaGhzLm5sPiIpOworTU9EVUxFX0FVVEhPUigiSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiRlNDIFBvc2VpZG9uLCBIZXJtZXMsIFNjeWxsYSwgSGVyYWNsZXMgYW5kICIKIAkJCSJIZWltZGFsbCBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vaHdtb24uYyBiL2RyaXZlcnMvaHdtb24vaHdtb24uYwppbmRleCAwNzZhNTljLi5lMTVjM2U3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2h3bW9uLmMKKysrIGIvZHJpdmVycy9od21vbi9od21vbi5jCkBAIC03Niw3ICs3Niw3IEBACiB7CiAJaW50IGlkOwogCi0JaWYgKGxpa2VseShzc2NhbmYoZGV2LT5idXNfaWQsIEhXTU9OX0lEX0ZPUk1BVCwgJmlkKSA9PSAxKSkgeworCWlmIChsaWtlbHkoc3NjYW5mKGRldl9uYW1lKGRldiksIEhXTU9OX0lEX0ZPUk1BVCwgJmlkKSA9PSAxKSkgewogCQlkZXZpY2VfdW5yZWdpc3RlcihkZXYpOwogCQlzcGluX2xvY2soJmlkcl9sb2NrKTsKIAkJaWRyX3JlbW92ZSgmaHdtb25faWRyLCBpZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2k1a19hbWIuYyBiL2RyaXZlcnMvaHdtb24vaTVrX2FtYi5jCmluZGV4IDJlZGU5MzguLjI3ZDdmNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vaTVrX2FtYi5jCisrKyBiL2RyaXZlcnMvaHdtb24vaTVrX2FtYi5jCkBAIC00OTAsNiArNDkwLDEzIEBACiAJMAogfTsKIAorc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGk1a19hbWJfaWRzW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF81MDAwX0VSUikgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF81NDAwX0VSUikgfSwKKwl7IDAsIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaTVrX2FtYl9pZHMpOworCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBpNWtfYW1iX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGk1a19hbWJfZGF0YSAqZGF0YTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vaWJtcGV4LmMgYi9kcml2ZXJzL2h3bW9uL2libXBleC5jCmluZGV4IDUzN2Q5ZmIuLmEzNjM2MzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vaWJtcGV4LmMKKysrIGIvZHJpdmVycy9od21vbi9pYm1wZXguYwpAQCAtNDAsNyArNDAsNyBAQAogCiBzdGF0aWMgaW5saW5lIHUxNiBleHRyYWN0X3ZhbHVlKGNvbnN0IGNoYXIgKmRhdGEsIGludCBvZmZzZXQpCiB7Ci0JcmV0dXJuIGJlMTZfdG9fY3B1cCgodTE2ICopJmRhdGFbb2Zmc2V0XSk7CisJcmV0dXJuIGJlMTZfdG9fY3B1cCgoX19iZTE2ICopJmRhdGFbb2Zmc2V0XSk7CiB9CiAKICNkZWZpbmUgVEVNUF9TRU5TT1IJCTEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vaXQ4Ny5jIGIvZHJpdmVycy9od21vbi9pdDg3LmMKaW5kZXggYjc0Yzk1Ny4uOTVhOTljNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9pdDg3LmMKKysrIGIvZHJpdmVycy9od21vbi9pdDg3LmMKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgICAgICAgICAgSVQ4NzEyRiAgU3VwZXIgSS9PIGNoaXAgdy9MUEMgaW50ZXJmYWNlCiAgICAgICAgICAgICAgIElUODcxNkYgIFN1cGVyIEkvTyBjaGlwIHcvTFBDIGludGVyZmFjZQogICAgICAgICAgICAgICBJVDg3MThGICBTdXBlciBJL08gY2hpcCB3L0xQQyBpbnRlcmZhY2UKKyAgICAgICAgICAgICAgSVQ4NzIwRiAgU3VwZXIgSS9PIGNoaXAgdy9MUEMgaW50ZXJmYWNlCiAgICAgICAgICAgICAgIElUODcyNkYgIFN1cGVyIEkvTyBjaGlwIHcvTFBDIGludGVyZmFjZQogICAgICAgICAgICAgICBTaXM5NTAgICBBIGNsb25lIG9mIHRoZSBJVDg3MDVGCiAKQEAgLTQ4LDExICs0OSwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjZGVmaW5lIERSVk5BTUUgIml0ODciCiAKLWVudW0gY2hpcHMgeyBpdDg3LCBpdDg3MTIsIGl0ODcxNiwgaXQ4NzE4IH07CitlbnVtIGNoaXBzIHsgaXQ4NywgaXQ4NzEyLCBpdDg3MTYsIGl0ODcxOCwgaXQ4NzIwIH07CiAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBmb3JjZV9pZDsKIG1vZHVsZV9wYXJhbShmb3JjZV9pZCwgdXNob3J0LCAwKTsKQEAgLTY0LDcgKzY2LDEwIEBACiAjZGVmaW5lCURFVgkweDA3CS8qIFJlZ2lzdGVyOiBMb2dpY2FsIGRldmljZSBzZWxlY3QgKi8KICNkZWZpbmUJVkFMCTB4MmYJLyogVGhlIHZhbHVlIHRvIHJlYWQvd3JpdGUgKi8KICNkZWZpbmUgUE1FCTB4MDQJLyogVGhlIGRldmljZSB3aXRoIHRoZSBmYW4gcmVnaXN0ZXJzIGluIGl0ICovCi0jZGVmaW5lIEdQSU8JMHgwNwkvKiBUaGUgZGV2aWNlIHdpdGggdGhlIElUODcxOEYgVklEIHZhbHVlIGluIGl0ICovCisKKy8qIFRoZSBkZXZpY2Ugd2l0aCB0aGUgSVQ4NzE4Ri9JVDg3MjBGIFZJRCB2YWx1ZSBpbiBpdCAqLworI2RlZmluZSBHUElPCTB4MDcKKwogI2RlZmluZQlERVZJRAkweDIwCS8qIFJlZ2lzdGVyOiBEZXZpY2UgSUQgKi8KICNkZWZpbmUJREVWUkVWCTB4MjIJLyogUmVnaXN0ZXI6IERldmljZSBSZXZpc2lvbiAqLwogCkBAIC0xMTMsNiArMTE4LDcgQEAKICNkZWZpbmUgSVQ4NzA1Rl9ERVZJRCAweDg3MDUKICNkZWZpbmUgSVQ4NzE2Rl9ERVZJRCAweDg3MTYKICNkZWZpbmUgSVQ4NzE4Rl9ERVZJRCAweDg3MTgKKyNkZWZpbmUgSVQ4NzIwRl9ERVZJRCAweDg3MjAKICNkZWZpbmUgSVQ4NzI2Rl9ERVZJRCAweDg3MjYKICNkZWZpbmUgSVQ4N19BQ1RfUkVHICAweDMwCiAjZGVmaW5lIElUODdfQkFTRV9SRUcgMHg2MApAQCAtMTUwLDggKzE1Niw4IEBACiAjZGVmaW5lIElUODdfUkVHX0FMQVJNMiAgICAgICAgMHgwMgogI2RlZmluZSBJVDg3X1JFR19BTEFSTTMgICAgICAgIDB4MDMKIAotLyogVGhlIElUODcxOEYgaGFzIHRoZSBWSUQgdmFsdWUgaW4gYSBkaWZmZXJlbnQgcmVnaXN0ZXIsIGluIFN1cGVyLUkvTwotICAgY29uZmlndXJhdGlvbiBzcGFjZS4gKi8KKy8qIFRoZSBJVDg3MThGIGFuZCBJVDg3MjBGIGhhdmUgdGhlIFZJRCB2YWx1ZSBpbiBhIGRpZmZlcmVudCByZWdpc3RlciwgaW4KKyAgIFN1cGVyLUkvTyBjb25maWd1cmF0aW9uIHNwYWNlLiAqLwogI2RlZmluZSBJVDg3X1JFR19WSUQgICAgICAgICAgIDB4MGEKIC8qIFRoZSBJVDg3MDVGIGFuZCBJVDg3MTJGIGVhcmxpZXIgdGhhbiByZXZpc2lvbiAweDA4IHVzZSByZWdpc3RlciAweDBiCiAgICBmb3IgZmFuIGRpdmlzb3JzLiBMYXRlciBJVDg3MTJGIHJldmlzaW9ucyBtdXN0IHVzZSAxNi1iaXQgdGFjaG9tZXRlcgpAQCAtMjgyLDcgKzI4OCw4IEBACiAJcmV0dXJuIChkYXRhLT50eXBlID09IGl0ODcgJiYgZGF0YS0+cmV2aXNpb24gPj0gMHgwMykKIAkgICAgfHwgKGRhdGEtPnR5cGUgPT0gaXQ4NzEyICYmIGRhdGEtPnJldmlzaW9uID49IDB4MDgpCiAJICAgIHx8IGRhdGEtPnR5cGUgPT0gaXQ4NzE2Ci0JICAgIHx8IGRhdGEtPnR5cGUgPT0gaXQ4NzE4OworCSAgICB8fCBkYXRhLT50eXBlID09IGl0ODcxOAorCSAgICB8fCBkYXRhLT50eXBlID09IGl0ODcyMDsKIH0KIAogc3RhdGljIGludCBpdDg3X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOwpAQCAtOTkyLDYgKzk5OSw5IEBACiAJY2FzZSBJVDg3MThGX0RFVklEOgogCQlzaW9fZGF0YS0+dHlwZSA9IGl0ODcxODsKIAkJYnJlYWs7CisJY2FzZSBJVDg3MjBGX0RFVklEOgorCQlzaW9fZGF0YS0+dHlwZSA9IGl0ODcyMDsKKwkJYnJlYWs7CiAJY2FzZSAweGZmZmY6CS8qIE5vIGRldmljZSBhdCBhbGwgKi8KIAkJZ290byBleGl0OwogCWRlZmF1bHQ6CkBAIC0xMDIyLDcgKzEwMzIsOCBAQAogCQlpbnQgcmVnOwogCiAJCXN1cGVyaW9fc2VsZWN0KEdQSU8pOwotCQlpZiAoY2hpcF90eXBlID09IGl0ODcxOCkKKwkJaWYgKChjaGlwX3R5cGUgPT0gaXQ4NzE4KSB8fAorCQkgICAgKGNoaXBfdHlwZSA9PSBpdDg3MjApKQogCQkJc2lvX2RhdGEtPnZpZF92YWx1ZSA9IHN1cGVyaW9faW5iKElUODdfU0lPX1ZJRF9SRUcpOwogCiAJCXJlZyA9IHN1cGVyaW9faW5iKElUODdfU0lPX1BJTlgyX1JFRyk7CkBAIC0xMDY4LDYgKzEwNzksNyBAQAogCQkiaXQ4NzEyIiwKIAkJIml0ODcxNiIsCiAJCSJpdDg3MTgiLAorCQkiaXQ4NzIwIiwKIAl9OwogCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSU8sIDApOwpAQCAtMTIyNiw3ICsxMjM4LDcgQEAKIAl9CiAKIAlpZiAoZGF0YS0+dHlwZSA9PSBpdDg3MTIgfHwgZGF0YS0+dHlwZSA9PSBpdDg3MTYKLQkgfHwgZGF0YS0+dHlwZSA9PSBpdDg3MTgpIHsKKwkgfHwgZGF0YS0+dHlwZSA9PSBpdDg3MTggfHwgZGF0YS0+dHlwZSA9PSBpdDg3MjApIHsKIAkJZGF0YS0+dnJtID0gdmlkX3doaWNoX3ZybSgpOwogCQkvKiBWSUQgcmVhZGluZyBmcm9tIFN1cGVyLUkvTyBjb25maWcgc3BhY2UgaWYgYXZhaWxhYmxlICovCiAJCWRhdGEtPnZpZCA9IHNpb19kYXRhLT52aWRfdmFsdWU7CkBAIC0xMzc0LDcgKzEzODYsNyBAQAogCQkJaXQ4N193cml0ZV92YWx1ZShkYXRhLCBJVDg3X1JFR19URU1QX0hJR0goaSksIDEyNyk7CiAJfQogCi0JLyogQ2hlY2sgaWYgdGVtcGVyYXR1cmUgY2hhbm5uZWxzIGFyZSByZXNldCBtYW51YWxseSBvciBieSBzb21lIHJlYXNvbiAqLworCS8qIENoZWNrIGlmIHRlbXBlcmF0dXJlIGNoYW5uZWxzIGFyZSByZXNldCBtYW51YWxseSBvciBieSBzb21lIHJlYXNvbiAqLwogCXRtcCA9IGl0ODdfcmVhZF92YWx1ZShkYXRhLCBJVDg3X1JFR19URU1QX0VOQUJMRSk7CiAJaWYgKCh0bXAgJiAweDNmKSA9PSAwKSB7CiAJCS8qIFRlbXAxLFRlbXAzPXRoZXJtaXN0b3I7IFRlbXAyPXRoZXJtYWwgZGlvZGUgKi8KQEAgLTE1MTMsNyArMTUyNSw4IEBACiAKIAkJZGF0YS0+c2Vuc29yID0gaXQ4N19yZWFkX3ZhbHVlKGRhdGEsIElUODdfUkVHX1RFTVBfRU5BQkxFKTsKIAkJLyogVGhlIDg3MDUgZG9lcyBub3QgaGF2ZSBWSUQgY2FwYWJpbGl0eS4KLQkJICAgVGhlIDg3MTggZG9lcyBub3QgdXNlIElUODdfUkVHX1ZJRCBmb3IgdGhlIHNhbWUgcHVycG9zZS4gKi8KKwkJICAgVGhlIDg3MTggYW5kIHRoZSA4NzIwIGRvbid0IHVzZSBJVDg3X1JFR19WSUQgZm9yIHRoZQorCQkgICBzYW1lIHB1cnBvc2UuICovCiAJCWlmIChkYXRhLT50eXBlID09IGl0ODcxMiB8fCBkYXRhLT50eXBlID09IGl0ODcxNikgewogCQkJZGF0YS0+dmlkID0gaXQ4N19yZWFkX3ZhbHVlKGRhdGEsIElUODdfUkVHX1ZJRCk7CiAJCQkvKiBUaGUgb2xkZXIgSVQ4NzEyRiByZXZpc2lvbnMgaGFkIG9ubHkgNSBWSUQgcGlucywKQEAgLTE1NDAsNiArMTU1MywxMCBAQAogCX07CiAJaW50IGVycjsKIAorCWVyciA9IGFjcGlfY2hlY2tfcmVzb3VyY2VfY29uZmxpY3QoJnJlcyk7CisJaWYgKGVycikKKwkJZ290byBleGl0OworCiAJcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhEUlZOQU1FLCBhZGRyZXNzKTsKIAlpZiAoIXBkZXYpIHsKIAkJZXJyID0gLUVOT01FTTsKQEAgLTE2MDgsNyArMTYyNSw3IEBACiAKIE1PRFVMRV9BVVRIT1IoIkNocmlzIEdhdXRocm9uLCAiCiAJICAgICAgIkplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJJVDg3MDVGLzg3MTJGLzg3MTZGLzg3MThGLzg3MjZGLCBTaVM5NTAgZHJpdmVyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklUODcwNUYvODcxMkYvODcxNkYvODcxOEYvODcyMEYvODcyNkYsIFNpUzk1MCBkcml2ZXIiKTsKIG1vZHVsZV9wYXJhbSh1cGRhdGVfdmJhdCwgYm9vbCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKHVwZGF0ZV92YmF0LCAiVXBkYXRlIHZiYXQgaWYgc2V0IGVsc2UgcmV0dXJuIHBvd2VydXAgdmFsdWUiKTsKIG1vZHVsZV9wYXJhbShmaXhfcHdtX3BvbGFyaXR5LCBib29sLCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbG03MC5jIGIvZHJpdmVycy9od21vbi9sbTcwLmMKaW5kZXggZDQzNWYwMC4uYWU2MjA0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sbTcwLmMKKysrIGIvZHJpdmVycy9od21vbi9sbTcwLmMKQEAgLTM3LDkgKzM3LDEzIEBACiAKICNkZWZpbmUgRFJWTkFNRQkJImxtNzAiCiAKKyNkZWZpbmUgTE03MF9DSElQX0xNNzAJCTAJLyogb3JpZ2luYWwgTlMgTE03MCAqLworI2RlZmluZSBMTTcwX0NISVBfVE1QMTIxCTEJLyogVEkgVE1QMTIxL1RNUDEyMyAqLworCiBzdHJ1Y3QgbG03MCB7CiAJc3RydWN0IGRldmljZSAqaHdtb25fZGV2OwogCXN0cnVjdCBtdXRleCBsb2NrOworCXVuc2lnbmVkIGludCBjaGlwOwogfTsKIAogLyogc3lzZnMgaG9vayBmdW5jdGlvbiAqLwpAQCAtNDcsNyArNTEsNyBAQAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7Ci0JaW50IHN0YXR1cywgdmFsOworCWludCBzdGF0dXMsIHZhbCA9IDA7CiAJdTggcnhidWZbMl07CiAJczE2IHJhdz0wOwogCXN0cnVjdCBsbTcwICpwX2xtNzAgPSBkZXZfZ2V0X2RydmRhdGEoJnNwaS0+ZGV2KTsKQEAgLTY1LDEyICs2OSwxMiBAQAogCQkic3BpX3dyaXRlX3RoZW5fcmVhZCBmYWlsZWQgd2l0aCBzdGF0dXMgJWRcbiIsIHN0YXR1cyk7CiAJCWdvdG8gb3V0OwogCX0KLQlkZXZfZGJnKGRldiwgInJ4YnVmWzFdIDogMHgleCByeGJ1ZlswXSA6IDB4JXhcbiIsIHJ4YnVmWzFdLCByeGJ1ZlswXSk7Ci0KLQlyYXcgPSAocnhidWZbMV0gPDwgOCkgKyByeGJ1ZlswXTsKLQlkZXZfZGJnKGRldiwgInJhdz0weCV4XG4iLCByYXcpOworCXJhdyA9IChyeGJ1ZlswXSA8PCA4KSArIHJ4YnVmWzFdOworCWRldl9kYmcoZGV2LCAicnhidWZbMF0gOiAweCUwMnggcnhidWZbMV0gOiAweCUwMnggcmF3PTB4JTA0eFxuIiwKKwkJcnhidWZbMF0sIHJ4YnVmWzFdLCByYXcpOwogCiAJLyoKKwkgKiBMTTcwOgogCSAqIFRoZSAicmF3IiB0ZW1wZXJhdHVyZSByZWFkIGludG8gcnhidWZbXSBpcyBhIDE2LWJpdCBzaWduZWQgMidzCiAJICogY29tcGxlbWVudCB2YWx1ZS4gT25seSB0aGUgTVNCIDExIGJpdHMgKDEgc2lnbiArIDEwIHRlbXBlcmF0dXJlCiAJICogYml0cykgYXJlIG1lYW5pbmdmdWw7IHRoZSBMU0IgNSBiaXRzIGFyZSB0byBiZSBkaXNjYXJkZWQuCkBAIC04MCw4ICs4NCwyMSBAQAogCSAqIGJ5IDAuMjUuIEFsc28gbXVsdGlwbHkgYnkgMTAwMCB0byByZXByZXNlbnQgaW4gbWlsbGlkZWdyZWVzCiAJICogQ2Vsc2l1cy4KIAkgKiBTbyBpdCdzIGVxdWl2YWxlbnQgdG8gbXVsdGlwbHlpbmcgYnkgMC4yNSAqIDEwMDAgPSAyNTAuCisJICoKKwkgKiBUTVAxMjEvVE1QMTIzOgorCSAqIDEzIGJpdHMgb2YgMidzIGNvbXBsZW1lbnQgZGF0YSwgZGlzY2FyZCBMU0IgMyBiaXRzLAorCSAqIHJlc29sdXRpb24gMC4wNjI1IGRlZ3JlZXMgY2Vsc2l1cy4KIAkgKi8KLQl2YWwgPSAoKGludClyYXcvMzIpICogMjUwOworCXN3aXRjaCAocF9sbTcwLT5jaGlwKSB7CisJY2FzZSBMTTcwX0NISVBfTE03MDoKKwkJdmFsID0gKChpbnQpcmF3IC8gMzIpICogMjUwOworCQlicmVhazsKKworCWNhc2UgTE03MF9DSElQX1RNUDEyMToKKwkJdmFsID0gKChpbnQpcmF3IC8gOCkgKiA2MjUgLyAxMDsKKwkJYnJlYWs7CisJfQorCiAJc3RhdHVzID0gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsKTsgLyogbWlsbGlkZWdyZWVzIENlbHNpdXMgKi8KIG91dDoKIAltdXRleF91bmxvY2soJnBfbG03MC0+bG9jayk7CkBAIC05MywyNyArMTEwLDM5IEBACiBzdGF0aWMgc3NpemVfdCBsbTcwX3Nob3dfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlCiAJCQkgICAgICAqZGV2YXR0ciwgY2hhciAqYnVmKQogewotCXJldHVybiBzcHJpbnRmKGJ1ZiwgImxtNzBcbiIpOworCXN0cnVjdCBsbTcwICpwX2xtNzAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgcmV0OworCisJc3dpdGNoIChwX2xtNzAtPmNoaXApIHsKKwljYXNlIExNNzBfQ0hJUF9MTTcwOgorCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgImxtNzBcbiIpOworCQlicmVhazsKKwljYXNlIExNNzBfQ0hJUF9UTVAxMjE6CisJCXJldCA9IHNwcmludGYoYnVmLCAidG1wMTIxXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIERFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIGxtNzBfc2hvd19uYW1lLCBOVUxMKTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotc3RhdGljIGludCBfX2RldmluaXQgbG03MF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQorc3RhdGljIGludCBfX2RldmluaXQgY29tbW9uX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCBjaGlwKQogewogCXN0cnVjdCBsbTcwICpwX2xtNzA7CiAJaW50IHN0YXR1czsKIAotCS8qIHNpZ25hbGluZyBpcyBTUElfTU9ERV8wIG9uIGEgMy13aXJlIGxpbmsgKHNoYXJlZCBTSS9TTykgKi8KLQlpZiAoKHNwaS0+bW9kZSAmIChTUElfQ1BPTHxTUElfQ1BIQSkpIHx8ICEoc3BpLT5tb2RlICYgU1BJXzNXSVJFKSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJLyogTk9URTogIHdlIGFzc3VtZSA4LWJpdCB3b3JkcywgYW5kIGNvbnZlcnQgdG8gMTYgYml0cyBtYW51YWxseSAqLwogCiAJcF9sbTcwID0ga3phbGxvYyhzaXplb2YgKnBfbG03MCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwX2xtNzApCiAJCXJldHVybiAtRU5PTUVNOwogCiAJbXV0ZXhfaW5pdCgmcF9sbTcwLT5sb2NrKTsKKwlwX2xtNzAtPmNoaXAgPSBjaGlwOwogCiAJLyogc3lzZnMgaG9vayAqLwogCXBfbG03MC0+aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZzcGktPmRldik7CkBAIC0xNDEsNiArMTcwLDI0IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAorc3RhdGljIGludCBfX2RldmluaXQgbG03MF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCS8qIHNpZ25hbGluZyBpcyBTUElfTU9ERV8wIG9uIGEgMy13aXJlIGxpbmsgKHNoYXJlZCBTSS9TTykgKi8KKwlpZiAoKHNwaS0+bW9kZSAmIChTUElfQ1BPTCB8IFNQSV9DUEhBKSkgfHwgIShzcGktPm1vZGUgJiBTUElfM1dJUkUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBjb21tb25fcHJvYmUoc3BpLCBMTTcwX0NISVBfTE03MCk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHRtcDEyMV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCS8qIHNpZ25hbGluZyBpcyBTUElfTU9ERV8wIHdpdGggb25seSBNSVNPIGNvbm5lY3RlZCAqLworCWlmIChzcGktPm1vZGUgJiAoU1BJX0NQT0wgfCBTUElfQ1BIQSkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGNvbW1vbl9wcm9iZShzcGksIExNNzBfQ0hJUF9UTVAxMjEpOworfQorCiBzdGF0aWMgaW50IF9fZGV2ZXhpdCBsbTcwX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewogCXN0cnVjdCBsbTcwICpwX2xtNzAgPSBkZXZfZ2V0X2RydmRhdGEoJnNwaS0+ZGV2KTsKQEAgLTE1NCw2ICsyMDEsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIHRtcDEyMV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAidG1wMTIxIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJPSB0bXAxMjFfcHJvYmUsCisJLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKGxtNzBfcmVtb3ZlKSwKK307CisKIHN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBsbTcwX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZQk9ICJsbTcwIiwKQEAgLTE2NSwxNyArMjIxLDI2IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfbG03MCh2b2lkKQogewotCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZsbTcwX2RyaXZlcik7CisJaW50IHJldCA9IHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmxtNzBfZHJpdmVyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gc3BpX3JlZ2lzdGVyX2RyaXZlcigmdG1wMTIxX2RyaXZlcik7CisJaWYgKHJldCkKKwkJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZsbTcwX2RyaXZlcik7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9sbTcwKHZvaWQpCiB7CiAJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZsbTcwX2RyaXZlcik7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZ0bXAxMjFfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQoaW5pdF9sbTcwKTsKIG1vZHVsZV9leGl0KGNsZWFudXBfbG03MCk7CiAKIE1PRFVMRV9BVVRIT1IoIkthaXdhbiBOIEJpbGxpbW9yaWEiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTcwIExpbnV4IGRyaXZlciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJOUyBMTTcwIC8gVEkgVE1QMTIxL1RNUDEyMyBMaW51eCBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbG03NS5jIGIvZHJpdmVycy9od21vbi9sbTc1LmMKaW5kZXggOGY5NTk1Zi4uNTViZDg3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sbTc1LmMKKysrIGIvZHJpdmVycy9od21vbi9sbTc1LmMKQEAgLTE5MCw3ICsxOTAsNyBAQAogCX0KIAogCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIiVzOiBzZW5zb3IgJyVzJ1xuIiwKLQkJZGF0YS0+aHdtb25fZGV2LT5idXNfaWQsIGNsaWVudC0+bmFtZSk7CisJCSBkZXZfbmFtZShkYXRhLT5od21vbl9kZXYpLCBjbGllbnQtPm5hbWUpOwogCiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbHRjNDI0NS5jIGIvZHJpdmVycy9od21vbi9sdGM0MjQ1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM0YjJjNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaHdtb24vbHRjNDI0NS5jCkBAIC0wLDAgKzEsNTY3IEBACisvKgorICogRHJpdmVyIGZvciBMaW5lYXIgVGVjaG5vbG9neSBMVEM0MjQ1IEkyQyBNdWx0aXBsZSBTdXBwbHkgSG90IFN3YXAgQ29udHJvbGxlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBJcmEgVy4gU255ZGVyIDxpd3NAb3Zyby5jYWx0ZWNoLmVkdT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBUaGlzIGRyaXZlciBpcyBiYXNlZCBvbiB0aGUgZHMxNjIxIGFuZCBpbmEyMDkgZHJpdmVycy4KKyAqCisgKiBEYXRhc2hlZXQ6CisgKiBodHRwOi8vd3d3LmxpbmVhci5jb20vcGMvZG93bmxvYWREb2N1bWVudC5kbz9uYXZJZD1IMCxDMSxDMTAwMyxDMTAwNixDMTE0MCxQMTkzOTIsRDEzNTE3CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgorCisvKiBWYWxpZCBhZGRyZXNzZXMgYXJlIDB4MjAgLSAweDNmCisgKgorICogRm9yIG5vdywgd2UgZG8gbm90IHByb2JlLCBzaW5jZSBzb21lIG9mIHRoZXNlIGFkZHJlc3NlcworICogYXJlIGtub3duIHRvIGJlIHVuZnJpZW5kbHkgdG8gcHJvYmluZyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgSTJDX0NMSUVOVF9FTkQgfTsKKworLyogSW5zbW9kIHBhcmFtZXRlcnMgKi8KK0kyQ19DTElFTlRfSU5TTU9EXzEobHRjNDI0NSk7CisKKy8qIEhlcmUgYXJlIG5hbWVzIG9mIHRoZSBjaGlwJ3MgcmVnaXN0ZXJzIChhLmsuYS4gY29tbWFuZHMpICovCitlbnVtIGx0YzQyNDVfY21kIHsKKwlMVEM0MjQ1X1NUQVRVUwkJCT0gMHgwMCwgLyogcmVhZG9ubHkgKi8KKwlMVEM0MjQ1X0FMRVJUCQkJPSAweDAxLAorCUxUQzQyNDVfQ09OVFJPTAkJCT0gMHgwMiwKKwlMVEM0MjQ1X09OCQkJPSAweDAzLAorCUxUQzQyNDVfRkFVTFQxCQkJPSAweDA0LAorCUxUQzQyNDVfRkFVTFQyCQkJPSAweDA1LAorCUxUQzQyNDVfR1BJTwkJCT0gMHgwNiwKKwlMVEM0MjQ1X0FEQ0FEUgkJCT0gMHgwNywKKworCUxUQzQyNDVfMTJWSU4JCQk9IDB4MTAsCisJTFRDNDI0NV8xMlZTRU5TRQkJPSAweDExLAorCUxUQzQyNDVfMTJWT1VUCQkJPSAweDEyLAorCUxUQzQyNDVfNVZJTgkJCT0gMHgxMywKKwlMVEM0MjQ1XzVWU0VOU0UJCQk9IDB4MTQsCisJTFRDNDI0NV81Vk9VVAkJCT0gMHgxNSwKKwlMVEM0MjQ1XzNWSU4JCQk9IDB4MTYsCisJTFRDNDI0NV8zVlNFTlNFCQkJPSAweDE3LAorCUxUQzQyNDVfM1ZPVVQJCQk9IDB4MTgsCisJTFRDNDI0NV9WRUVJTgkJCT0gMHgxOSwKKwlMVEM0MjQ1X1ZFRVNFTlNFCQk9IDB4MWEsCisJTFRDNDI0NV9WRUVPVVQJCQk9IDB4MWIsCisJTFRDNDI0NV9HUElPQURDMQkJPSAweDFjLAorCUxUQzQyNDVfR1BJT0FEQzIJCT0gMHgxZCwKKwlMVEM0MjQ1X0dQSU9BREMzCQk9IDB4MWUsCit9OworCitzdHJ1Y3QgbHRjNDI0NV9kYXRhIHsKKwlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CisKKwlzdHJ1Y3QgbXV0ZXggdXBkYXRlX2xvY2s7CisJYm9vbCB2YWxpZDsKKwl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsgLyogaW4gamlmZmllcyAqLworCisJLyogQ29udHJvbCByZWdpc3RlcnMgKi8KKwl1OCBjcmVnc1sweDA4XTsKKworCS8qIFZvbHRhZ2UgcmVnaXN0ZXJzICovCisJdTggdnJlZ3NbMHgwZl07Cit9OworCitzdGF0aWMgc3RydWN0IGx0YzQyNDVfZGF0YSAqbHRjNDI0NV91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsdGM0MjQ1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzMzIgdmFsOworCWludCBpOworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgSFopIHx8ICFkYXRhLT52YWxpZCkgeworCisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiU3RhcnRpbmcgbHRjNDI0NSB1cGRhdGVcbiIpOworCisJCS8qIFJlYWQgY29udHJvbCByZWdpc3RlcnMgLS0gMHgwMCB0byAweDA3ICovCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRhdGEtPmNyZWdzKTsgaSsrKSB7CisJCQl2YWwgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBpKTsKKwkJCWlmICh1bmxpa2VseSh2YWwgPCAwKSkKKwkJCQlkYXRhLT5jcmVnc1tpXSA9IDA7CisJCQllbHNlCisJCQkJZGF0YS0+Y3JlZ3NbaV0gPSB2YWw7CisJCX0KKworCQkvKiBSZWFkIHZvbHRhZ2UgcmVnaXN0ZXJzIC0tIDB4MTAgdG8gMHgxZiAqLworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkYXRhLT52cmVncyk7IGkrKykgeworCQkJdmFsID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgaSsweDEwKTsKKwkJCWlmICh1bmxpa2VseSh2YWwgPCAwKSkKKwkJCQlkYXRhLT52cmVnc1tpXSA9IDA7CisJCQllbHNlCisJCQkJZGF0YS0+dnJlZ3NbaV0gPSB2YWw7CisJCX0KKworCQlkYXRhLT5sYXN0X3VwZGF0ZWQgPSBqaWZmaWVzOworCQlkYXRhLT52YWxpZCA9IDE7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworLyogUmV0dXJuIHRoZSB2b2x0YWdlIGZyb20gdGhlIGdpdmVuIHJlZ2lzdGVyIGluIG1pbGxpdm9sdHMgKi8KK3N0YXRpYyBpbnQgbHRjNDI0NV9nZXRfdm9sdGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHU4IHJlZykKK3sKKwlzdHJ1Y3QgbHRjNDI0NV9kYXRhICpkYXRhID0gbHRjNDI0NV91cGRhdGVfZGV2aWNlKGRldik7CisJY29uc3QgdTggcmVndmFsID0gZGF0YS0+dnJlZ3NbcmVnIC0gMHgxMF07CisJdTMyIHZvbHRhZ2UgPSAwOworCisJc3dpdGNoIChyZWcpIHsKKwljYXNlIExUQzQyNDVfMTJWSU46CisJY2FzZSBMVEM0MjQ1XzEyVk9VVDoKKwkJdm9sdGFnZSA9IHJlZ3ZhbCAqIDU1OworCQlicmVhazsKKwljYXNlIExUQzQyNDVfNVZJTjoKKwljYXNlIExUQzQyNDVfNVZPVVQ6CisJCXZvbHRhZ2UgPSByZWd2YWwgKiAyMjsKKwkJYnJlYWs7CisJY2FzZSBMVEM0MjQ1XzNWSU46CisJY2FzZSBMVEM0MjQ1XzNWT1VUOgorCQl2b2x0YWdlID0gcmVndmFsICogMTU7CisJCWJyZWFrOworCWNhc2UgTFRDNDI0NV9WRUVJTjoKKwljYXNlIExUQzQyNDVfVkVFT1VUOgorCQl2b2x0YWdlID0gcmVndmFsICogLTU1OworCQlicmVhazsKKwljYXNlIExUQzQyNDVfR1BJT0FEQzE6CisJY2FzZSBMVEM0MjQ1X0dQSU9BREMyOgorCWNhc2UgTFRDNDI0NV9HUElPQURDMzoKKwkJdm9sdGFnZSA9IHJlZ3ZhbCAqIDEwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBJZiB3ZSBnZXQgaGVyZSwgdGhlIGRldmVsb3BlciBtZXNzZWQgdXAgKi8KKwkJV0FSTl9PTl9PTkNFKDEpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gdm9sdGFnZTsKK30KKworLyogUmV0dXJuIHRoZSBjdXJyZW50IGluIHRoZSBnaXZlbiBzZW5zZSByZWdpc3RlciBpbiBtaWxsaUFtcGVyZXMgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbHRjNDI0NV9nZXRfY3VycmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHU4IHJlZykKK3sKKwlzdHJ1Y3QgbHRjNDI0NV9kYXRhICpkYXRhID0gbHRjNDI0NV91cGRhdGVfZGV2aWNlKGRldik7CisJY29uc3QgdTggcmVndmFsID0gZGF0YS0+dnJlZ3NbcmVnIC0gMHgxMF07CisJdW5zaWduZWQgaW50IHZvbHRhZ2U7CisJdW5zaWduZWQgaW50IGN1cnI7CisKKwkvKiBUaGUgc3RyYW5nZSBsb29raW5nIGNvbnZlcnNpb25zIHRoYXQgZm9sbG93IGFyZSBmaXhlZC1wb2ludAorCSAqIG1hdGgsIHNpbmNlIHdlIGNhbm5vdCBkbyBmbG9hdGluZyBwb2ludCBpbiB0aGUga2VybmVsLgorCSAqCisJICogU3RlcCAxOiBjb252ZXJ0IHNlbnNlIHJlZ2lzdGVyIHRvIG1pY3JvVm9sdHMKKwkgKiBTdGVwIDI6IGNvbnZlcnQgdm9sdGFnZSB0byBtaWxsaUFtcGVyZXMKKwkgKgorCSAqIElmIHlvdSBwbGF5IGFyb3VuZCB3aXRoIHRoZSBWPUlSIGVxdWF0aW9uLCB5b3UgY29tZSB1cCB3aXRoCisJICogdGhlIGZvbGxvd2luZzogWCB1ViAvIFkgbU9obSA9PSBaIG1BCisJICoKKwkgKiBXaXRoIHRoZSByZXNpc3RvcnMgdGhhdCBhcmUgZnJhY3Rpb25zIG9mIGEgbWlsbGlPaG0sIHdlIG11bHRpcGx5CisJICogdGhlIHZvbHRhZ2UgYW5kIHJlc2lzdGFuY2UgYnkgMTAsIHRvIHNoaWZ0IHRoZSBkZWNpbWFsIHBvaW50LgorCSAqIE5vdyB3ZSBjYW4gdXNlIHRoZSBub3JtYWwgZGl2aXNpb24gb3BlcmF0b3IgYWdhaW4uCisJICovCisKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgTFRDNDI0NV8xMlZTRU5TRToKKwkJdm9sdGFnZSA9IHJlZ3ZhbCAqIDI1MDsgLyogdm9sdGFnZSBpbiB1ViAqLworCQljdXJyID0gdm9sdGFnZSAvIDUwOyAvKiBzZW5zZSByZXNpc3RvciA1MCBtT2htICovCisJCWJyZWFrOworCWNhc2UgTFRDNDI0NV81VlNFTlNFOgorCQl2b2x0YWdlID0gcmVndmFsICogMTI1OyAvKiB2b2x0YWdlIGluIHVWICovCisJCWN1cnIgPSAodm9sdGFnZSAqIDEwKSAvIDM1OyAvKiBzZW5zZSByZXNpc3RvciAzLjUgbU9obSAqLworCQlicmVhazsKKwljYXNlIExUQzQyNDVfM1ZTRU5TRToKKwkJdm9sdGFnZSA9IHJlZ3ZhbCAqIDEyNTsgLyogdm9sdGFnZSBpbiB1ViAqLworCQljdXJyID0gKHZvbHRhZ2UgKiAxMCkgLyAyNTsgLyogc2Vuc2UgcmVzaXN0b3IgMi41IG1PaG0gKi8KKwkJYnJlYWs7CisJY2FzZSBMVEM0MjQ1X1ZFRVNFTlNFOgorCQl2b2x0YWdlID0gcmVndmFsICogMjUwOyAvKiB2b2x0YWdlIGluIHVWICovCisJCWN1cnIgPSB2b2x0YWdlIC8gMTAwOyAvKiBzZW5zZSByZXNpc3RvciAxMDAgbU9obSAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBJZiB3ZSBnZXQgaGVyZSwgdGhlIGRldmVsb3BlciBtZXNzZWQgdXAgKi8KKwkJV0FSTl9PTl9PTkNFKDEpOworCQljdXJyID0gMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGN1cnI7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGx0YzQyNDVfc2hvd192b2x0YWdlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLAorCQkJCSAgICBjaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRhKTsKKwljb25zdCBpbnQgdm9sdGFnZSA9IGx0YzQyNDVfZ2V0X3ZvbHRhZ2UoZGV2LCBhdHRyLT5pbmRleCk7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgdm9sdGFnZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGx0YzQyNDVfc2hvd19jdXJyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLAorCQkJCSAgICBjaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRhKTsKKwljb25zdCB1bnNpZ25lZCBpbnQgY3VyciA9IGx0YzQyNDVfZ2V0X2N1cnJlbnQoZGV2LCBhdHRyLT5pbmRleCk7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIldVxuIiwgY3Vycik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGx0YzQyNDVfc2hvd19wb3dlcihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGEsCisJCQkJICBjaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRhKTsKKwljb25zdCB1bnNpZ25lZCBpbnQgY3VyciA9IGx0YzQyNDVfZ2V0X2N1cnJlbnQoZGV2LCBhdHRyLT5pbmRleCk7CisJY29uc3QgaW50IG91dHB1dF92b2x0YWdlID0gbHRjNDI0NV9nZXRfdm9sdGFnZShkZXYsIGF0dHItPmluZGV4KzEpOworCisJLyogY3VycmVudCBpbiBtQSAqIHZvbHRhZ2UgaW4gbVYgPT0gcG93ZXIgaW4gdVcgKi8KKwljb25zdCB1bnNpZ25lZCBpbnQgcG93ZXIgPSBhYnMob3V0cHV0X3ZvbHRhZ2UgKiBjdXJyKTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV1XG4iLCBwb3dlcik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGx0YzQyNDVfc2hvd19hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLAorCQkJCQkgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRhKTsKKwlzdHJ1Y3QgbHRjNDI0NV9kYXRhICpkYXRhID0gbHRjNDI0NV91cGRhdGVfZGV2aWNlKGRldik7CisJY29uc3QgdTggcmVnID0gZGF0YS0+Y3JlZ3NbYXR0ci0+aW5kZXhdOworCWNvbnN0IHUzMiBtYXNrID0gYXR0ci0+bnI7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIldVxuIiwgKHJlZyAmIG1hc2spID8gMSA6IDApOworfQorCisvKiBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgYmVsb3cgaW4gY29uc3RydWN0aW5nIGRldmljZSBhdHRyaWJ1dGUgb2JqZWN0cworICogZm9yIHVzZSB3aXRoIHN5c2ZzX2NyZWF0ZV9ncm91cCgpIHRvIG1ha2UgYSBzeXNmcyBkZXZpY2UgZmlsZQorICogZm9yIGVhY2ggcmVnaXN0ZXIuCisgKi8KKworI2RlZmluZSBMVEM0MjQ1X1ZPTFRBR0UobmFtZSwgbHRjNDI0NV9jbWRfaWR4KSBcCisJc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBcCisJbHRjNDI0NV9zaG93X3ZvbHRhZ2UsIE5VTEwsIGx0YzQyNDVfY21kX2lkeCkKKworI2RlZmluZSBMVEM0MjQ1X0NVUlJFTlQobmFtZSwgbHRjNDI0NV9jbWRfaWR4KSBcCisJc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBcCisJbHRjNDI0NV9zaG93X2N1cnJlbnQsIE5VTEwsIGx0YzQyNDVfY21kX2lkeCkKKworI2RlZmluZSBMVEM0MjQ1X1BPV0VSKG5hbWUsIGx0YzQyNDVfY21kX2lkeCkgXAorCXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgXAorCWx0YzQyNDVfc2hvd19wb3dlciwgTlVMTCwgbHRjNDI0NV9jbWRfaWR4KQorCisjZGVmaW5lIExUQzQyNDVfQUxBUk0obmFtZSwgbWFzaywgcmVnKSBcCisJc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKG5hbWUsIFNfSVJVR08sIFwKKwlsdGM0MjQ1X3Nob3dfYWxhcm0sIE5VTEwsIChtYXNrKSwgcmVnKQorCisvKiBDb25zdHJ1Y3QgYSBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSBzdHJ1Y3R1cmUgZm9yIGVhY2ggcmVnaXN0ZXIgKi8KKworLyogSW5wdXQgdm9sdGFnZXMgKi8KK0xUQzQyNDVfVk9MVEFHRShpbjFfaW5wdXQsCQkJTFRDNDI0NV8xMlZJTik7CitMVEM0MjQ1X1ZPTFRBR0UoaW4yX2lucHV0LAkJCUxUQzQyNDVfNVZJTik7CitMVEM0MjQ1X1ZPTFRBR0UoaW4zX2lucHV0LAkJCUxUQzQyNDVfM1ZJTik7CitMVEM0MjQ1X1ZPTFRBR0UoaW40X2lucHV0LAkJCUxUQzQyNDVfVkVFSU4pOworCisvKiBJbnB1dCB1bmRlcnZvbHRhZ2UgYWxhcm1zICovCitMVEM0MjQ1X0FMQVJNKGluMV9taW5fYWxhcm0sCSgxIDw8IDApLAlMVEM0MjQ1X0ZBVUxUMSk7CitMVEM0MjQ1X0FMQVJNKGluMl9taW5fYWxhcm0sCSgxIDw8IDEpLAlMVEM0MjQ1X0ZBVUxUMSk7CitMVEM0MjQ1X0FMQVJNKGluM19taW5fYWxhcm0sCSgxIDw8IDIpLAlMVEM0MjQ1X0ZBVUxUMSk7CitMVEM0MjQ1X0FMQVJNKGluNF9taW5fYWxhcm0sCSgxIDw8IDMpLAlMVEM0MjQ1X0ZBVUxUMSk7CisKKy8qIEN1cnJlbnRzICh2aWEgc2Vuc2UgcmVzaXN0b3IpICovCitMVEM0MjQ1X0NVUlJFTlQoY3VycjFfaW5wdXQsCQkJTFRDNDI0NV8xMlZTRU5TRSk7CitMVEM0MjQ1X0NVUlJFTlQoY3VycjJfaW5wdXQsCQkJTFRDNDI0NV81VlNFTlNFKTsKK0xUQzQyNDVfQ1VSUkVOVChjdXJyM19pbnB1dCwJCQlMVEM0MjQ1XzNWU0VOU0UpOworTFRDNDI0NV9DVVJSRU5UKGN1cnI0X2lucHV0LAkJCUxUQzQyNDVfVkVFU0VOU0UpOworCisvKiBPdmVyY3VycmVudCBhbGFybXMgKi8KK0xUQzQyNDVfQUxBUk0oY3VycjFfbWF4X2FsYXJtLAkoMSA8PCA0KSwJTFRDNDI0NV9GQVVMVDEpOworTFRDNDI0NV9BTEFSTShjdXJyMl9tYXhfYWxhcm0sCSgxIDw8IDUpLAlMVEM0MjQ1X0ZBVUxUMSk7CitMVEM0MjQ1X0FMQVJNKGN1cnIzX21heF9hbGFybSwJKDEgPDwgNiksCUxUQzQyNDVfRkFVTFQxKTsKK0xUQzQyNDVfQUxBUk0oY3VycjRfbWF4X2FsYXJtLAkoMSA8PCA3KSwJTFRDNDI0NV9GQVVMVDEpOworCisvKiBPdXRwdXQgdm9sdGFnZXMgKi8KK0xUQzQyNDVfVk9MVEFHRShpbjVfaW5wdXQsCQkJTFRDNDI0NV8xMlZPVVQpOworTFRDNDI0NV9WT0xUQUdFKGluNl9pbnB1dCwJCQlMVEM0MjQ1XzVWT1VUKTsKK0xUQzQyNDVfVk9MVEFHRShpbjdfaW5wdXQsCQkJTFRDNDI0NV8zVk9VVCk7CitMVEM0MjQ1X1ZPTFRBR0UoaW44X2lucHV0LAkJCUxUQzQyNDVfVkVFT1VUKTsKKworLyogUG93ZXIgQmFkIGFsYXJtcyAqLworTFRDNDI0NV9BTEFSTShpbjVfbWluX2FsYXJtLAkoMSA8PCAwKSwJTFRDNDI0NV9GQVVMVDIpOworTFRDNDI0NV9BTEFSTShpbjZfbWluX2FsYXJtLAkoMSA8PCAxKSwJTFRDNDI0NV9GQVVMVDIpOworTFRDNDI0NV9BTEFSTShpbjdfbWluX2FsYXJtLAkoMSA8PCAyKSwJTFRDNDI0NV9GQVVMVDIpOworTFRDNDI0NV9BTEFSTShpbjhfbWluX2FsYXJtLAkoMSA8PCAzKSwJTFRDNDI0NV9GQVVMVDIpOworCisvKiBHUElPIHZvbHRhZ2VzICovCitMVEM0MjQ1X1ZPTFRBR0UoaW45X2lucHV0LAkJCUxUQzQyNDVfR1BJT0FEQzEpOworTFRDNDI0NV9WT0xUQUdFKGluMTBfaW5wdXQsCQkJTFRDNDI0NV9HUElPQURDMik7CitMVEM0MjQ1X1ZPTFRBR0UoaW4xMV9pbnB1dCwJCQlMVEM0MjQ1X0dQSU9BREMzKTsKKworLyogUG93ZXIgQ29uc3VtcHRpb24gKHZpcnR1YWwpICovCitMVEM0MjQ1X1BPV0VSKHBvd2VyMV9pbnB1dCwJCQlMVEM0MjQ1XzEyVlNFTlNFKTsKK0xUQzQyNDVfUE9XRVIocG93ZXIyX2lucHV0LAkJCUxUQzQyNDVfNVZTRU5TRSk7CitMVEM0MjQ1X1BPV0VSKHBvd2VyM19pbnB1dCwJCQlMVEM0MjQ1XzNWU0VOU0UpOworTFRDNDI0NV9QT1dFUihwb3dlcjRfaW5wdXQsCQkJTFRDNDI0NV9WRUVTRU5TRSk7CisKKy8qIEZpbmFsbHksIGNvbnN0cnVjdCBhbiBhcnJheSBvZiBwb2ludGVycyB0byBtZW1iZXJzIG9mIHRoZSBhYm92ZSBvYmplY3RzLAorICogYXMgcmVxdWlyZWQgZm9yIHN5c2ZzX2NyZWF0ZV9ncm91cCgpCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpsdGM0MjQ1X2F0dHJpYnV0ZXNbXSA9IHsKKwkmc2Vuc29yX2Rldl9hdHRyX2luMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4yX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNF9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCisJJnNlbnNvcl9kZXZfYXR0cl9pbjFfbWluX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjJfbWluX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjNfbWluX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjRfbWluX2FsYXJtLmRldl9hdHRyLmF0dHIsCisKKwkmc2Vuc29yX2Rldl9hdHRyX2N1cnIxX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9jdXJyMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfY3VycjNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2N1cnI0X2lucHV0LmRldl9hdHRyLmF0dHIsCisKKwkmc2Vuc29yX2Rldl9hdHRyX2N1cnIxX21heF9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfY3VycjJfbWF4X2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9jdXJyM19tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2N1cnI0X21heF9hbGFybS5kZXZfYXR0ci5hdHRyLAorCisJJnNlbnNvcl9kZXZfYXR0cl9pbjVfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNl9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW43X2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjhfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKworCSZzZW5zb3JfZGV2X2F0dHJfaW41X21pbl9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW42X21pbl9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW43X21pbl9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW44X21pbl9hbGFybS5kZXZfYXR0ci5hdHRyLAorCisJJnNlbnNvcl9kZXZfYXR0cl9pbjlfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMTBfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMTFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKworCSZzZW5zb3JfZGV2X2F0dHJfcG93ZXIxX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9wb3dlcjJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3Bvd2VyM19pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfcG93ZXI0X2lucHV0LmRldl9hdHRyLmF0dHIsCisKKwlOVUxMLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbHRjNDI0NV9ncm91cCA9IHsKKwkuYXR0cnMgPSBsdGM0MjQ1X2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgaW50IGx0YzQyNDVfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGx0YzQyNDVfZGF0YSAqZGF0YTsKKwlpbnQgcmV0OworCisJZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2t6YWxsb2M7CisJfQorCisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZGF0YSk7CisJbXV0ZXhfaW5pdCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJLyogSW5pdGlhbGl6ZSB0aGUgTFRDNDI0NSBjaGlwICovCisJLyogVE9ETyAqLworCisJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZsdGM0MjQ1X2dyb3VwKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9zeXNmc19jcmVhdGVfZ3JvdXA7CisKKwlkYXRhLT5od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2KTsKKwlpZiAoSVNfRVJSKGRhdGEtPmh3bW9uX2RldikpIHsKKwkJcmV0ID0gUFRSX0VSUihkYXRhLT5od21vbl9kZXYpOworCQlnb3RvIG91dF9od21vbl9kZXZpY2VfcmVnaXN0ZXI7CisJfQorCisJcmV0dXJuIDA7CisKK291dF9od21vbl9kZXZpY2VfcmVnaXN0ZXI6CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmbHRjNDI0NV9ncm91cCk7CitvdXRfc3lzZnNfY3JlYXRlX2dyb3VwOgorCWtmcmVlKGRhdGEpOworb3V0X2t6YWxsb2M6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBsdGM0MjQ1X3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBsdGM0MjQ1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmh3bW9uX2Rldik7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmbHRjNDI0NV9ncm91cCk7CisKKwlrZnJlZShkYXRhKTsKKworCXJldHVybiAwOworfQorCisvKiBDaGVjayB0aGF0IHNvbWUgYml0cyBpbiBhIGNvbnRyb2wgcmVnaXN0ZXIgYXBwZWFyIGF0IGFsbCBwb3NzaWJsZQorICogbG9jYXRpb25zIHdpdGhvdXQgY2hhbmdpbmcgdmFsdWUKKyAqCisgKiBAY2xpZW50OiB0aGUgaTJjIGNsaWVudCB0byB1c2UKKyAqIEByZWc6IHRoZSByZWdpc3RlciB0byByZWFkCisgKiBAYml0czogdGhlIGJpdHMgdG8gY2hlY2sgKDB4ZmYgY2hlY2tzIGFsbCBiaXRzLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzIGNoZWNrcyBvbmx5IHRoZSBsYXN0IHR3byBiaXRzKQorICoKKyAqIHJldHVybiAtRVJSTk8gaWYgdGhlIHJlZ2lzdGVyIHJlYWQgZmFpbGVkCisgKiByZXR1cm4gLUVOT0RFViBpZiB0aGUgcmVnaXN0ZXIgdmFsdWUgZG9lc24ndCBzdGF5IGNvbnN0YW50IGF0IGFsbAorICogcG9zc2libGUgYWRkcmVzc2VzCisgKgorICogcmV0dXJuIDAgZm9yIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludCBsdGM0MjQ1X2NoZWNrX2NvbnRyb2xfcmVnKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTggYml0cykKK3sKKwlpbnQgaTsKKwlzMzIgdiwgdm9mZjEsIHZvZmYyOworCisJLyogUmVhZCByZWdpc3RlciBhbmQgY2hlY2sgZm9yIGVycm9yICovCisJdiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHJlZyk7CisJaWYgKHYgPCAwKQorCQlyZXR1cm4gdjsKKworCXYgJj0gYml0czsKKworCWZvciAoaSA9IDB4MDA7IGkgPCAweGZmOyBpICs9IDB4MjApIHsKKworCQl2b2ZmMSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHJlZyArIGkpOworCQlpZiAodm9mZjEgPCAwKQorCQkJcmV0dXJuIHZvZmYxOworCisJCXZvZmYyID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnICsgaSArIDB4MDgpOworCQlpZiAodm9mZjIgPCAwKQorCQkJcmV0dXJuIHZvZmYyOworCisJCXZvZmYxICY9IGJpdHM7CisJCXZvZmYyICY9IGJpdHM7CisKKwkJaWYgKHYgIT0gdm9mZjEgfHwgdiAhPSB2b2ZmMikKKwkJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGx0YzQyNDVfZGV0ZWN0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgIGludCBraW5kLAorCQkJICBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmluZm8pCit7CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gY2xpZW50LT5hZGFwdGVyOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChraW5kIDwgMCkgewkJLyogcHJvYmVkIGRldGVjdGlvbiAtIGNoZWNrIHRoZSBjaGlwIHR5cGUgKi8KKwkJczMyIHY7CQkvKiA4IGJpdHMgZnJvbSB0aGUgY2hpcCwgb3IgLUVSUk5PICovCisKKwkJLyogQ2hpcCByZWdpc3RlcnMgMHgwMC0weDA3IGFyZSBjb250cm9sIHJlZ2lzdGVycworCQkgKiBDaGlwIHJlZ2lzdGVycyAweDEwLTB4MWYgYXJlIGRhdGEgcmVnaXN0ZXJzCisJCSAqCisJCSAqIEFkZHJlc3MgYml0cyBiNy1iNSBhcmUgaWdub3JlZC4gVGhpcyBtYWtlcyB0aGUgY2hpcCAicmVwZWF0IgorCQkgKiBpbiBzdGVwcyBvZiAweDIwLiBBbnkgY29udHJvbCByZWdpc3RlcnMgc2hvdWxkIGFwcGVhciB3aXRoCisJCSAqIHRoZSBzYW1lIHZhbHVlcyBhY3Jvc3MgYWxsIGR1cGxpY2F0ZWQgYWRkcmVzc2VzLgorCQkgKgorCQkgKiBSZWdpc3RlciAweDAyIGJpdCBiMiBpcyByZXNlcnZlZCwgZXhwZWN0IDAKKwkJICogUmVnaXN0ZXIgMHgwNyBiaXRzIGI3IHRvIGI0IGFyZSByZXNlcnZlZCwgZXhwZWN0IDAKKwkJICoKKwkJICogUmVnaXN0ZXJzIDB4MDEsIDB4MDIgYXJlIGNvbnRyb2wgcmVnaXN0ZXJzIGFuZCBzaG91bGQgbm90CisJCSAqIGNoYW5nZSBvbiB0aGVpciBvd24uCisJCSAqCisJCSAqIFJlZ2lzdGVyIDB4MDYgYml0cyBiNiBhbmQgYjcgYXJlIGNvbnRyb2wgYml0cywgYW5kIHNob3VsZAorCQkgKiBub3QgY2hhbmdlIG9uIHRoZWlyIG93bi4KKwkJICoKKwkJICogUmVnaXN0ZXIgMHgwNyBiaXRzIGIzIHRvIGIwIGFyZSBjb250cm9sIGJpdHMsIGFuZCBzaG91bGQKKwkJICogbm90IGNoYW5nZSBvbiB0aGVpciBvd24uCisJCSAqLworCisJCS8qIHJlYWQgcmVnaXN0ZXIgMHgwMiByZXNlcnZlZCBiaXQsIGV4cGVjdCAwICovCisJCXYgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBMVEM0MjQ1X0NPTlRST0wpOworCQlpZiAodiA8IDAgfHwgKHYgJiAweDA0KSAhPSAwKQorCQkJcmV0dXJuIC1FTk9ERVY7CisKKwkJLyogcmVhZCByZWdpc3RlciAweDA3IHJlc2VydmVkIGJpdHMsIGV4cGVjdCAwICovCisJCXYgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBMVEM0MjQ1X0FEQ0FEUik7CisJCWlmICh2IDwgMCB8fCAodiAmIDB4ZjApICE9IDApCisJCQlyZXR1cm4gLUVOT0RFVjsKKworCQkvKiBjaGVjayB0aGF0IHRoZSBhbGVydCByZWdpc3RlciBhcHBlYXJzIGF0IGFsbCBsb2NhdGlvbnMgKi8KKwkJaWYgKGx0YzQyNDVfY2hlY2tfY29udHJvbF9yZWcoY2xpZW50LCBMVEM0MjQ1X0FMRVJULCAweGZmKSkKKwkJCXJldHVybiAtRU5PREVWOworCisJCS8qIGNoZWNrIHRoYXQgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgYXBwZWFycyBhdCBhbGwgbG9jYXRpb25zICovCisJCWlmIChsdGM0MjQ1X2NoZWNrX2NvbnRyb2xfcmVnKGNsaWVudCwgTFRDNDI0NV9DT05UUk9MLCAweGZmKSkKKwkJCXJldHVybiAtRU5PREVWOworCisJCS8qIGNoZWNrIHRoYXQgcmVnaXN0ZXIgMHgwNiBiaXRzIGI2IGFuZCBiNyBzdGF5IGNvbnN0YW50ICovCisJCWlmIChsdGM0MjQ1X2NoZWNrX2NvbnRyb2xfcmVnKGNsaWVudCwgTFRDNDI0NV9HUElPLCAweGMwKSkKKwkJCXJldHVybiAtRU5PREVWOworCisJCS8qIGNoZWNrIHRoYXQgcmVnaXN0ZXIgMHgwNyBiaXRzIGIzLWIwIHN0YXkgY29uc3RhbnQgKi8KKwkJaWYgKGx0YzQyNDVfY2hlY2tfY29udHJvbF9yZWcoY2xpZW50LCBMVEM0MjQ1X0FEQ0FEUiwgMHgwZikpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlzdHJsY3B5KGluZm8tPnR5cGUsICJsdGM0MjQ1IiwgSTJDX05BTUVfU0laRSk7CisJZGV2X2luZm8oJmFkYXB0ZXItPmRldiwgImx0YzQyNDUgJXMgYXQgYWRkcmVzcyAweCUwMnhcbiIsCisJCQlraW5kIDwgMCA/ICJwcm9iZWQiIDogImZvcmNlZCIsCisJCQljbGllbnQtPmFkZHIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBsdGM0MjQ1X2lkW10gPSB7CisJeyAibHRjNDI0NSIsIGx0YzQyNDUgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbHRjNDI0NV9pZCk7CisKKy8qIFRoaXMgaXMgdGhlIGRyaXZlciB0aGF0IHdpbGwgYmUgaW5zZXJ0ZWQgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBsdGM0MjQ1X2RyaXZlciA9IHsKKwkuY2xhc3MJCT0gSTJDX0NMQVNTX0hXTU9OLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gImx0YzQyNDUiLAorCX0sCisJLnByb2JlCQk9IGx0YzQyNDVfcHJvYmUsCisJLnJlbW92ZQkJPSBsdGM0MjQ1X3JlbW92ZSwKKwkuaWRfdGFibGUJPSBsdGM0MjQ1X2lkLAorCS5kZXRlY3QJCT0gbHRjNDI0NV9kZXRlY3QsCisJLmFkZHJlc3NfZGF0YQk9ICZhZGRyX2RhdGEsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBsdGM0MjQ1X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmx0YzQyNDVfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGx0YzQyNDVfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZsdGM0MjQ1X2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIklyYSBXLiBTbnlkZXIgPGl3c0BvdnJvLmNhbHRlY2guZWR1PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMVEM0MjQ1IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChsdGM0MjQ1X2luaXQpOworbW9kdWxlX2V4aXQobHRjNDI0NV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vcGM4NzM2MC5jIGIvZHJpdmVycy9od21vbi9wYzg3MzYwLmMKaW5kZXggNWZiZmEzNC4uZmIwNTJmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9wYzg3MzYwLmMKKysrIGIvZHJpdmVycy9od21vbi9wYzg3MzYwLmMKQEAgLTQzLDYgKzQzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9od21vbi12aWQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAogc3RhdGljIHU4IGRldmlkOwpAQCAtMTYyNyw2ICsxNjI4LDExIEBACiAJCQljb250aW51ZTsKIAkJcmVzLnN0YXJ0ID0gZXh0cmFfaXNhW2ldOwogCQlyZXMuZW5kID0gZXh0cmFfaXNhW2ldICsgUEM4NzM2MF9FWFRFTlQgLSAxOworCisJCWVyciA9IGFjcGlfY2hlY2tfcmVzb3VyY2VfY29uZmxpY3QoJnJlcyk7CisJCWlmIChlcnIpCisJCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKKwogCQllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX3Jlc291cmNlcyhwZGV2LCAmcmVzLCAxKTsKIAkJaWYgKGVycikgewogCQkJcHJpbnRrKEtFUk5fRVJSICJwYzg3MzYwOiBEZXZpY2UgcmVzb3VyY2VbJWRdICIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vcGM4NzQyNy5jIGIvZHJpdmVycy9od21vbi9wYzg3NDI3LmMKaW5kZXggNzI2NWYyMi4uM2E4YTBmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9wYzg3NDI3LmMKKysrIGIvZHJpdmVycy9od21vbi9wYzg3NDI3LmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgZm9yY2VfaWQ7CkBAIC01MjQsNiArNTI1LDEwIEBACiAJfTsKIAlpbnQgZXJyOwogCisJZXJyID0gYWNwaV9jaGVja19yZXNvdXJjZV9jb25mbGljdCgmcmVzKTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXQ7CisKIAlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKERSVk5BTUUsIGFkZHJlc3MpOwogCWlmICghcGRldikgewogCQllcnIgPSAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9zaXM1NTk1LmMgYi9kcml2ZXJzL2h3bW9uL3NpczU1OTUuYwppbmRleCBhMjc2ODA2Li5hYTJlODMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3NpczU1OTUuYworKysgYi9kcml2ZXJzL2h3bW9uL3NpczU1OTUuYwpAQCAtNjIsNiArNjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCiAKQEAgLTcyNyw2ICs3MjgsMTAgQEAKIAl9OwogCWludCBlcnI7CiAKKwllcnIgPSBhY3BpX2NoZWNrX3Jlc291cmNlX2NvbmZsaWN0KCZyZXMpOworCWlmIChlcnIpCisJCWdvdG8gZXhpdDsKKwogCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInNpczU1OTUiLCBhZGRyZXNzKTsKIAlpZiAoIXBkZXYpIHsKIAkJZXJyID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vc21zYzQ3YjM5Ny5jIGIvZHJpdmVycy9od21vbi9zbXNjNDdiMzk3LmMKaW5kZXggZWIwMzU0NC4uNmY2ZDUyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9zbXNjNDdiMzk3LmMKKysrIGIvZHJpdmVycy9od21vbi9zbXNjNDdiMzk3LmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBmb3JjZV9pZDsKQEAgLTMwMyw2ICszMDQsMTAgQEAKIAl9OwogCWludCBlcnI7CiAKKwllcnIgPSBhY3BpX2NoZWNrX3Jlc291cmNlX2NvbmZsaWN0KCZyZXMpOworCWlmIChlcnIpCisJCWdvdG8gZXhpdDsKKwogCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoRFJWTkFNRSwgYWRkcmVzcyk7CiAJaWYgKCFwZGV2KSB7CiAJCWVyciA9IC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3Ntc2M0N20xLmMgYi9kcml2ZXJzL2h3bW9uL3Ntc2M0N20xLmMKaW5kZXggZDFiNDk4NS4uYTkyZGJiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9zbXNjNDdtMS5jCisrKyBiL2RyaXZlcnMvaHdtb24vc21zYzQ3bTEuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgZm9yY2VfaWQ7CkBAIC03MDUsNiArNzA2LDEwIEBACiAJfTsKIAlpbnQgZXJyOwogCisJZXJyID0gYWNwaV9jaGVja19yZXNvdXJjZV9jb25mbGljdCgmcmVzKTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXQ7CisKIAlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKERSVk5BTUUsIGFkZHJlc3MpOwogCWlmICghcGRldikgewogCQllcnIgPSAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi92aWE2ODZhLmMgYi9kcml2ZXJzL2h3bW9uL3ZpYTY4NmEuYwppbmRleCBmMWVlNWU3Li5hMDIyYWVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3ZpYTY4NmEuYworKysgYi9kcml2ZXJzL2h3bW9uL3ZpYTY4NmEuYwpAQCAtNDEsNiArNDEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCiAKQEAgLTc4Myw2ICs3ODQsMTAgQEAKIAl9OwogCWludCBlcnI7CiAKKwllcnIgPSBhY3BpX2NoZWNrX3Jlc291cmNlX2NvbmZsaWN0KCZyZXMpOworCWlmIChlcnIpCisJCWdvdG8gZXhpdDsKKwogCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInZpYTY4NmEiLCBhZGRyZXNzKTsKIAlpZiAoIXBkZXYpIHsKIAkJZXJyID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdnQxMjExLmMgYi9kcml2ZXJzL2h3bW9uL3Z0MTIxMS5jCmluZGV4IDEyYjQzNTkuLmIwY2UzNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vdnQxMjExLmMKKysrIGIvZHJpdmVycy9od21vbi92dDEyMTEuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCiBzdGF0aWMgaW50IHVjaF9jb25maWcgPSAtMTsKQEAgLTEyNTksNiArMTI2MCwxMCBAQAogCX0KIAogCXJlcy5uYW1lID0gcGRldi0+bmFtZTsKKwllcnIgPSBhY3BpX2NoZWNrX3Jlc291cmNlX2NvbmZsaWN0KCZyZXMpOworCWlmIChlcnIpCisJCWdvdG8gRVhJVDsKKwogCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKHBkZXYsICZyZXMsIDEpOwogCWlmIChlcnIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogRGV2aWNlIHJlc291cmNlIGFkZGl0aW9uIGZhaWxlZCAiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3Z0ODIzMS5jIGIvZHJpdmVycy9od21vbi92dDgyMzEuYwppbmRleCA1YmM1NzI3Li45OTgyYjQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3Z0ODIzMS5jCisrKyBiL2RyaXZlcnMvaHdtb24vdnQ4MjMxLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9od21vbi12aWQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAogc3RhdGljIGludCBmb3JjZV9hZGRyOwpAQCAtODk0LDYgKzg5NSwxMCBAQAogCX07CiAJaW50IGVycjsKIAorCWVyciA9IGFjcGlfY2hlY2tfcmVzb3VyY2VfY29uZmxpY3QoJnJlcyk7CisJaWYgKGVycikKKwkJZ290byBleGl0OworCiAJcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygidnQ4MjMxIiwgYWRkcmVzcyk7CiAJaWYgKCFwZGV2KSB7CiAJCWVyciA9IC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3c4MzYyN2VoZi5jIGIvZHJpdmVycy9od21vbi93ODM2MjdlaGYuYwppbmRleCAwNzUxNjRkLi5jYjgwOGQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3c4MzYyN2VoZi5jCisrKyBiL2RyaXZlcnMvaHdtb24vdzgzNjI3ZWhmLmMKQEAgLTQ4LDYgKzQ4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9od21vbi12aWQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlICJsbTc1LmgiCiAKQEAgLTUwMiw3ICs1MDMsNyBAQAogCQl9CiAKIAkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotCQkJLyogcHdtY2ZnLCB0b2xhcmFuY2UgbWFwcGVkIGZvciBpPTAsIGk9MSB0byBzYW1lIHJlZyAqLworCQkJLyogcHdtY2ZnLCB0b2xlcmFuY2UgbWFwcGVkIGZvciBpPTAsIGk9MSB0byBzYW1lIHJlZyAqLwogCQkJaWYgKGkgIT0gMSkgewogCQkJCXB3bWNmZyA9IHc4MzYyN2VoZl9yZWFkX3ZhbHVlKGRhdGEsCiAJCQkJCQlXODM2MjdFSEZfUkVHX1BXTV9FTkFCTEVbaV0pOwpAQCAtMTU0NCw2ICsxNTQ1LDExIEBACiAJcmVzLnN0YXJ0ID0gYWRkcmVzcyArIElPUkVHSU9OX09GRlNFVDsKIAlyZXMuZW5kID0gYWRkcmVzcyArIElPUkVHSU9OX09GRlNFVCArIElPUkVHSU9OX0xFTkdUSCAtIDE7CiAJcmVzLmZsYWdzID0gSU9SRVNPVVJDRV9JTzsKKworCWVyciA9IGFjcGlfY2hlY2tfcmVzb3VyY2VfY29uZmxpY3QoJnJlcyk7CisJaWYgKGVycikKKwkJZ290byBleGl0OworCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgJnJlcywgMSk7CiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgcmVzb3VyY2UgYWRkaXRpb24gZmFpbGVkICIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdzgzNjI3aGYuYyBiL2RyaXZlcnMvaHdtb24vdzgzNjI3aGYuYwppbmRleCBiMzBlNTc5Li4zODkxNTBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3c4MzYyN2hmLmMKKysrIGIvZHJpdmVycy9od21vbi93ODM2MjdoZi5jCkBAIC01MCw2ICs1MCw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSAibG03NS5oIgogCkBAIC0xNzkzLDYgKzE3OTQsMTAgQEAKIAl9OwogCWludCBlcnI7CiAKKwllcnIgPSBhY3BpX2NoZWNrX3Jlc291cmNlX2NvbmZsaWN0KCZyZXMpOworCWlmIChlcnIpCisJCWdvdG8gZXhpdDsKKwogCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoRFJWTkFNRSwgYWRkcmVzcyk7CiAJaWYgKCFwZGV2KSB7CiAJCWVyciA9IC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3c4Mzc4MWQuYyBiL2RyaXZlcnMvaHdtb24vdzgzNzgxZC5jCmluZGV4IGZjMTJiZDQuLmRiZmIzMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vdzgzNzgxZC5jCisrKyBiL2RyaXZlcnMvaHdtb24vdzgzNzgxZC5jCkBAIC01OCw3ICs1OCwxMCBAQAogCQkJCQkJMHgyZSwgMHgyZiwgSTJDX0NMSUVOVF9FTkQgfTsKIC8qIEluc21vZCBwYXJhbWV0ZXJzICovCiBJMkNfQ0xJRU5UX0lOU01PRF80KHc4Mzc4MWQsIHc4Mzc4MmQsIHc4Mzc4M3MsIGFzOTkxMjdmKTsKLUkyQ19DTElFTlRfTU9EVUxFX1BBUk0oZm9yY2Vfc3ViY2xpZW50cywgIkxpc3Qgb2Ygc3ViY2xpZW50IGFkZHJlc3NlczogIgorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZm9yY2Vfc3ViY2xpZW50c1s0XTsKK21vZHVsZV9wYXJhbV9hcnJheShmb3JjZV9zdWJjbGllbnRzLCBzaG9ydCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX3N1YmNsaWVudHMsICJMaXN0IG9mIHN1YmNsaWVudCBhZGRyZXNzZXM6ICIKIAkJICAgICJ7YnVzLCBjbGllbnRhZGRyLCBzdWJjbGllbnRhZGRyMSwgc3ViY2xpZW50YWRkcjJ9Iik7CiAKIHN0YXRpYyBpbnQgcmVzZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3c4Mzc5MWQuYyBiL2RyaXZlcnMvaHdtb24vdzgzNzkxZC5jCmluZGV4IDU3NjhkZWYuLjk3ODUxYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vdzgzNzkxZC5jCisrKyBiL2RyaXZlcnMvaHdtb24vdzgzNzkxZC5jCkBAIC01Myw3ICs1MywxMCBAQAogCiAvKiBJbnNtb2QgcGFyYW1ldGVycyAqLwogSTJDX0NMSUVOVF9JTlNNT0RfMSh3ODM3OTFkKTsKLUkyQ19DTElFTlRfTU9EVUxFX1BBUk0oZm9yY2Vfc3ViY2xpZW50cywgIkxpc3Qgb2Ygc3ViY2xpZW50IGFkZHJlc3NlczogIgorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZm9yY2Vfc3ViY2xpZW50c1s0XTsKK21vZHVsZV9wYXJhbV9hcnJheShmb3JjZV9zdWJjbGllbnRzLCBzaG9ydCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX3N1YmNsaWVudHMsICJMaXN0IG9mIHN1YmNsaWVudCBhZGRyZXNzZXM6ICIKIAkJCSJ7YnVzLCBjbGllbnRhZGRyLCBzdWJjbGllbnRhZGRyMSwgc3ViY2xpZW50YWRkcjJ9Iik7CiAKIHN0YXRpYyBpbnQgcmVzZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3c4Mzc5MmQuYyBiL2RyaXZlcnMvaHdtb24vdzgzNzkyZC5jCmluZGV4IGNmOTRjNWIuLjJiZTE2MTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vdzgzNzkyZC5jCisrKyBiL2RyaXZlcnMvaHdtb24vdzgzNzkyZC5jCkBAIC01MSw3ICs1MSwxMCBAQAogCiAvKiBJbnNtb2QgcGFyYW1ldGVycyAqLwogSTJDX0NMSUVOVF9JTlNNT0RfMSh3ODM3OTJkKTsKLUkyQ19DTElFTlRfTU9EVUxFX1BBUk0oZm9yY2Vfc3ViY2xpZW50cywgIkxpc3Qgb2Ygc3ViY2xpZW50IGFkZHJlc3NlczogIgorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZm9yY2Vfc3ViY2xpZW50c1s0XTsKK21vZHVsZV9wYXJhbV9hcnJheShmb3JjZV9zdWJjbGllbnRzLCBzaG9ydCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX3N1YmNsaWVudHMsICJMaXN0IG9mIHN1YmNsaWVudCBhZGRyZXNzZXM6ICIKIAkJCSJ7YnVzLCBjbGllbnRhZGRyLCBzdWJjbGllbnRhZGRyMSwgc3ViY2xpZW50YWRkcjJ9Iik7CiAKIHN0YXRpYyBpbnQgaW5pdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdzgzNzkzLmMgYi9kcml2ZXJzL2h3bW9uL3c4Mzc5My5jCmluZGV4IDBhNzM5ZjEuLjQ3ZGQzOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vdzgzNzkzLmMKKysrIGIvZHJpdmVycy9od21vbi93ODM3OTMuYwpAQCAtNDIsNyArNDIsMTAgQEAKIAogLyogSW5zbW9kIHBhcmFtZXRlcnMgKi8KIEkyQ19DTElFTlRfSU5TTU9EXzEodzgzNzkzKTsKLUkyQ19DTElFTlRfTU9EVUxFX1BBUk0oZm9yY2Vfc3ViY2xpZW50cywgIkxpc3Qgb2Ygc3ViY2xpZW50IGFkZHJlc3NlczogIgorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZm9yY2Vfc3ViY2xpZW50c1s0XTsKK21vZHVsZV9wYXJhbV9hcnJheShmb3JjZV9zdWJjbGllbnRzLCBzaG9ydCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX3N1YmNsaWVudHMsICJMaXN0IG9mIHN1YmNsaWVudCBhZGRyZXNzZXM6ICIKIAkJICAgICAgICJ7YnVzLCBjbGllbnRhZGRyLCBzdWJjbGllbnRhZGRyMSwgc3ViY2xpZW50YWRkcjJ9Iik7CiAKIHN0YXRpYyBpbnQgcmVzZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFsaTE1NjMuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYWxpMTU2My5jCmluZGV4IGZjM2U1YjAuLmRkOWU3OTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYWxpMTU2My5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYWxpMTU2My5jCkBAIC0zOTksOCArMzk5LDggQEAKIAlpZiAoKGVycm9yID0gYWxpMTU2M19zZXR1cChkZXYpKSkKIAkJZ290byBleGl0OwogCWFsaTE1NjNfYWRhcHRlci5kZXYucGFyZW50ID0gJmRldi0+ZGV2OwotCXNwcmludGYoYWxpMTU2M19hZGFwdGVyLm5hbWUsIlNNQnVzIEFMaSAxNTYzIEFkYXB0ZXIgQCAlMDR4IiwKLQkJYWxpMTU2M19zbWJhKTsKKwlzbnByaW50ZihhbGkxNTYzX2FkYXB0ZXIubmFtZSwgc2l6ZW9mKGFsaTE1NjNfYWRhcHRlci5uYW1lKSwKKwkJICJTTUJ1cyBBTGkgMTU2MyBBZGFwdGVyIEAgJTA0eCIsIGFsaTE1NjNfc21iYSk7CiAJaWYgKChlcnJvciA9IGkyY19hZGRfYWRhcHRlcigmYWxpMTU2M19hZGFwdGVyKSkpCiAJCWdvdG8gZXhpdF9zaHV0ZG93bjsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYW1kNzU2LXM0ODgyLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFtZDc1Ni1zNDg4Mi5jCmluZGV4IDhiYTJiY2YuLjM3OGZjYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYW1kNzU2LXM0ODgyLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hbWQ3NTYtczQ4ODIuYwpAQCAtMTk3LDggKzE5Nyw4IEBACiAJZm9yIChpID0gMTsgaSA8IDU7IGkrKykgewogCQlzNDg4Ml9hbGdvW2ldID0gKihhbWQ3NTZfc21idXMuYWxnbyk7CiAJCXM0ODgyX2FkYXB0ZXJbaV0gPSBhbWQ3NTZfc21idXM7Ci0JCXNwcmludGYoczQ4ODJfYWRhcHRlcltpXS5uYW1lLAotCQkJIlNNQnVzIDgxMTEgYWRhcHRlciAoQ1BVJWQpIiwgaS0xKTsKKwkJc25wcmludGYoczQ4ODJfYWRhcHRlcltpXS5uYW1lLCBzaXplb2YoczQ4ODJfYWRhcHRlcltpXS5uYW1lKSwKKwkJCSAiU01CdXMgODExMSBhZGFwdGVyIChDUFUlZCkiLCBpLTEpOwogCQlzNDg4Ml9hZGFwdGVyW2ldLmFsZ28gPSBzNDg4Ml9hbGdvK2k7CiAJCXM0ODgyX2FkYXB0ZXJbaV0uZGV2LnBhcmVudCA9IGFtZDc1Nl9zbWJ1cy5kZXYucGFyZW50OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYW1kNzU2LmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFtZDc1Ni5jCmluZGV4IDQyNGRhZDYuLjM2YmVlNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYW1kNzU2LmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hbWQ3NTYuYwpAQCAtMzgwLDggKzM4MCw5IEBACiAJLyogc2V0IHVwIHRoZSBzeXNmcyBsaW5rYWdlIHRvIG91ciBwYXJlbnQgZGV2aWNlICovCiAJYW1kNzU2X3NtYnVzLmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OwogCi0Jc3ByaW50ZihhbWQ3NTZfc21idXMubmFtZSwgIlNNQnVzICVzIGFkYXB0ZXIgYXQgJTA0eCIsCi0JCWNoaXBuYW1lW2lkLT5kcml2ZXJfZGF0YV0sIGFtZDc1Nl9pb3BvcnQpOworCXNucHJpbnRmKGFtZDc1Nl9zbWJ1cy5uYW1lLCBzaXplb2YoYW1kNzU2X3NtYnVzLm5hbWUpLAorCQkgIlNNQnVzICVzIGFkYXB0ZXIgYXQgJTA0eCIsIGNoaXBuYW1lW2lkLT5kcml2ZXJfZGF0YV0sCisJCSBhbWQ3NTZfaW9wb3J0KTsKIAogCWVycm9yID0gaTJjX2FkZF9hZGFwdGVyKCZhbWQ3NTZfc21idXMpOwogCWlmIChlcnJvcikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hdDkxLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWF0OTEuYwppbmRleCA5ZWZiMDIxLi42N2Q5ZGM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWF0OTEuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWF0OTEuYwpAQCAtMjIyLDcgKzIyMiw3IEBACiAJCXJjID0gLUVOT01FTTsKIAkJZ290byBmYWlsMjsKIAl9Ci0Jc3ByaW50ZihhZGFwdGVyLT5uYW1lLCAiQVQ5MSIpOworCXNucHJpbnRmKGFkYXB0ZXItPm5hbWUsIHNpemVvZihhZGFwdGVyLT5uYW1lKSwgIkFUOTEiKTsKIAlhZGFwdGVyLT5hbGdvID0gJmF0OTFfYWxnb3JpdGhtOwogCWFkYXB0ZXItPmNsYXNzID0gSTJDX0NMQVNTX0hXTU9OOwogCWFkYXB0ZXItPmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1iZmluLXR3aS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1iZmluLXR3aS5jCmluZGV4IDNjODU1ZmYuLjNmZDJjNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYmZpbi10d2kuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWJmaW4tdHdpLmMKQEAgLTY1Niw3ICs2NTYsNyBAQAogCXN0cmxjcHkocF9hZGFwLT5uYW1lLCBwZGV2LT5uYW1lLCBzaXplb2YocF9hZGFwLT5uYW1lKSk7CiAJcF9hZGFwLT5hbGdvID0gJmJmaW5fdHdpX2FsZ29yaXRobTsKIAlwX2FkYXAtPmFsZ29fZGF0YSA9IGlmYWNlOwotCXBfYWRhcC0+Y2xhc3MgPSBJMkNfQ0xBU1NfQUxMOworCXBfYWRhcC0+Y2xhc3MgPSBJMkNfQ0xBU1NfSFdNT04gfCBJMkNfQ0xBU1NfU1BEOwogCXBfYWRhcC0+ZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CiAKIAlyYyA9IHBlcmlwaGVyYWxfcmVxdWVzdF9saXN0KHBpbl9yZXFbcGRldi0+aWRdLCAiaTJjLWJmaW4tdHdpIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWk4MDEuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaTgwMS5jCmluZGV4IDUxMjNlYjYuLjUyNjYyNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaTgwMS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaTgwMS5jCkBAIC02NCw3ICs2NCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAvKiBJODAxIFNNQnVzIGFkZHJlc3Mgb2Zmc2V0cyAqLwogI2RlZmluZSBTTUJIU1RTVFMJKDAgKyBpODAxX3NtYmEpCkBAIC01ODMsNiArNTgzLDQwIEBACiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUgKHBjaSwgaTgwMV9pZHMpOwogCisjaWYgZGVmaW5lZCBDT05GSUdfSU5QVVRfQVBBTkVMIHx8IGRlZmluZWQgQ09ORklHX0lOUFVUX0FQQU5FTF9NT0RVTEUKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGFwYW5lbF9hZGRyOworCisvKiBTY2FuIHRoZSBzeXN0ZW0gUk9NIGZvciB0aGUgc2lnbmF0dXJlICJGSktFWUlORiIgKi8KK3N0YXRpYyBfX2luaXQgY29uc3Qgdm9pZCBfX2lvbWVtICpiaW9zX3NpZ25hdHVyZShjb25zdCB2b2lkIF9faW9tZW0gKmJpb3MpCit7CisJc3NpemVfdCBvZmZzZXQ7CisJY29uc3QgdW5zaWduZWQgY2hhciBzaWduYXR1cmVbXSA9ICJGSktFWUlORiI7CisKKwlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IDB4MTAwMDA7IG9mZnNldCArPSAweDEwKSB7CisJCWlmIChjaGVja19zaWduYXR1cmUoYmlvcyArIG9mZnNldCwgc2lnbmF0dXJlLAorCQkJCSAgICBzaXplb2Yoc2lnbmF0dXJlKS0xKSkKKwkJCXJldHVybiBiaW9zICsgb2Zmc2V0OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGlucHV0X2FwYW5lbF9pbml0KHZvaWQpCit7CisJdm9pZCBfX2lvbWVtICpiaW9zOworCWNvbnN0IHZvaWQgX19pb21lbSAqcDsKKworCWJpb3MgPSBpb3JlbWFwKDB4RjAwMDAsIDB4MTAwMDApOyAvKiBDYW4ndCBmYWlsICovCisJcCA9IGJpb3Nfc2lnbmF0dXJlKGJpb3MpOworCWlmIChwKSB7CisJCS8qIGp1c3QgdXNlIHRoZSBmaXJzdCBhZGRyZXNzICovCisJCWFwYW5lbF9hZGRyID0gcmVhZGIocCArIDggKyAzKSA+PiAxOworCX0KKwlpb3VubWFwKGJpb3MpOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIF9faW5pdCBpbnB1dF9hcGFuZWxfaW5pdCh2b2lkKSB7fQorI2VuZGlmCisKIHN0YXRpYyBpbnQgX19kZXZpbml0IGk4MDFfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogewogCXVuc2lnbmVkIGNoYXIgdGVtcDsKQEAgLTY2Nyw2ICs3MDEsMTkgQEAKIAkJZGV2X2VycigmZGV2LT5kZXYsICJGYWlsZWQgdG8gYWRkIFNNQnVzIGFkYXB0ZXJcbiIpOwogCQlnb3RvIGV4aXRfcmVsZWFzZTsKIAl9CisKKwkvKiBSZWdpc3RlciBvcHRpb25hbCBzbGF2ZXMgKi8KKyNpZiBkZWZpbmVkIENPTkZJR19JTlBVVF9BUEFORUwgfHwgZGVmaW5lZCBDT05GSUdfSU5QVVRfQVBBTkVMX01PRFVMRQorCWlmIChhcGFuZWxfYWRkcikgeworCQlzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gaW5mbzsKKworCQltZW1zZXQoJmluZm8sIDAsIHNpemVvZihzdHJ1Y3QgaTJjX2JvYXJkX2luZm8pKTsKKwkJaW5mby5hZGRyID0gYXBhbmVsX2FkZHI7CisJCXN0cmxjcHkoaW5mby50eXBlLCAiZnVqaXRzdV9hcGFuZWwiLCBJMkNfTkFNRV9TSVpFKTsKKwkJaTJjX25ld19kZXZpY2UoJmk4MDFfYWRhcHRlciwgJmluZm8pOworCX0KKyNlbmRpZgorCiAJcmV0dXJuIDA7CiAKIGV4aXRfcmVsZWFzZToKQEAgLTcxNyw2ICs3NjQsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpMmNfaTgwMV9pbml0KHZvaWQpCiB7CisJaW5wdXRfYXBhbmVsX2luaXQoKTsKIAlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmaTgwMV9kcml2ZXIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW9tYXAuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtb21hcC5jCmluZGV4IDYwODAzOGQuLmJlOGVlMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtb21hcC5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtb21hcC5jCkBAIC0yLDEzICsyLDE2IEBACiAgKiBUSSBPTUFQIEkyQyBtYXN0ZXIgbW9kZSBkcml2ZXIKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDMgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgotICogQ29weXJpZ2h0IChDKSAyMDA0IFRleGFzIEluc3RydW1lbnRzLgotICoKLSAqIFVwZGF0ZWQgdG8gd29yayB3aXRoIG11bHRpcGxlIEkyQyBpbnRlcmZhY2VzIG9uIDI0eHggYnkKLSAqIFRvbnkgTGluZGdyZW4gPHRvbnlAYXRvbWlkZS5jb20+IGFuZCBJbXJlIERlYWsgPGltcmUuZGVha0Bub2tpYS5jb20+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTm9raWEgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAwNCAtIDIwMDcgVGV4YXMgSW5zdHJ1bWVudHMuCiAgKgotICogQ2xlYW5lZCB1cCBieSBKdWhhIFlyasO2bMOkIDxqdWhhLnlyam9sYUBub2tpYS5jb20+CisgKiBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICogQWRkaXRpb25hbCBjb250cmlidXRpb25zIGJ5OgorICoJVG9ueSBMaW5kZ3JlbiA8dG9ueUBhdG9taWRlLmNvbT4KKyAqCUltcmUgRGVhayA8aW1yZS5kZWFrQG5va2lhLmNvbT4KKyAqCUp1aGEgWXJqw7Zsw6QgPGp1aGEueXJqb2xhQHNvbGlkYm9vdC5jb20+CisgKglTeWVkIEtoYXNpbSA8eDBraGFzaW1AdGkuY29tPgorICoJTmlzaGFudCBNZW5vbiA8bm1AdGkuY29tPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMzMsOCArMzYsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAotI2luY2x1ZGUgPGFzbS9pby5oPgorLyogSTJDIGNvbnRyb2xsZXIgcmV2aXNpb25zICovCisjZGVmaW5lIE9NQVBfSTJDX1JFVl8yCQkJMHgyMAorCisvKiBJMkMgY29udHJvbGxlciByZXZpc2lvbnMgcHJlc2VudCBvbiBzcGVjaWZpYyBoYXJkd2FyZSAqLworI2RlZmluZSBPTUFQX0kyQ19SRVZfT05fMjQzMAkJMHgzNgorI2RlZmluZSBPTUFQX0kyQ19SRVZfT05fMzQzMAkJMHgzQwogCiAvKiB0aW1lb3V0IHdhaXRpbmcgZm9yIHRoZSBjb250cm9sbGVyIHRvIHJlc3BvbmQgKi8KICNkZWZpbmUgT01BUF9JMkNfVElNRU9VVCAobXNlY3NfdG9famlmZmllcygxMDAwKSkKQEAgLTQzLDYgKzUyLDggQEAKICNkZWZpbmUgT01BUF9JMkNfSUVfUkVHCQkJMHgwNAogI2RlZmluZSBPTUFQX0kyQ19TVEFUX1JFRwkJMHgwOAogI2RlZmluZSBPTUFQX0kyQ19JVl9SRUcJCQkweDBjCisvKiBGb3IgT01BUDMgSTJDX0lWIGhhcyBjaGFuZ2VkIHRvIEkyQ19XRSAod2FrZXVwIGVuYWJsZSkgKi8KKyNkZWZpbmUgT01BUF9JMkNfV0VfUkVHCQkJMHgwYwogI2RlZmluZSBPTUFQX0kyQ19TWVNTX1JFRwkJMHgxMAogI2RlZmluZSBPTUFQX0kyQ19CVUZfUkVHCQkweDE0CiAjZGVmaW5lIE9NQVBfSTJDX0NOVF9SRUcJCTB4MTgKQEAgLTU1LDggKzY2LDExIEBACiAjZGVmaW5lIE9NQVBfSTJDX1NDTExfUkVHCQkweDM0CiAjZGVmaW5lIE9NQVBfSTJDX1NDTEhfUkVHCQkweDM4CiAjZGVmaW5lIE9NQVBfSTJDX1NZU1RFU1RfUkVHCQkweDNjCisjZGVmaW5lIE9NQVBfSTJDX0JVRlNUQVRfUkVHCQkweDQwCiAKIC8qIEkyQyBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyIChPTUFQX0kyQ19JRSk6ICovCisjZGVmaW5lIE9NQVBfSTJDX0lFX1hEUgkJKDEgPDwgMTQpCS8qIFRYIEJ1ZmZlciBkcmFpbiBpbnQgZW5hYmxlICovCisjZGVmaW5lIE9NQVBfSTJDX0lFX1JEUgkJKDEgPDwgMTMpCS8qIFJYIEJ1ZmZlciBkcmFpbiBpbnQgZW5hYmxlICovCiAjZGVmaW5lIE9NQVBfSTJDX0lFX1hSRFkJKDEgPDwgNCkJLyogVFggZGF0YSByZWFkeSBpbnQgZW5hYmxlICovCiAjZGVmaW5lIE9NQVBfSTJDX0lFX1JSRFkJKDEgPDwgMykJLyogUlggZGF0YSByZWFkeSBpbnQgZW5hYmxlICovCiAjZGVmaW5lIE9NQVBfSTJDX0lFX0FSRFkJKDEgPDwgMikJLyogQWNjZXNzIHJlYWR5IGludCBlbmFibGUgKi8KQEAgLTY0LDcgKzc4LDggQEAKICNkZWZpbmUgT01BUF9JMkNfSUVfQUwJCSgxIDw8IDApCS8qIEFyYml0cmF0aW9uIGxvc3QgaW50IGVuYSAqLwogCiAvKiBJMkMgU3RhdHVzIFJlZ2lzdGVyIChPTUFQX0kyQ19TVEFUKTogKi8KLSNkZWZpbmUgT01BUF9JMkNfU1RBVF9TQkQJKDEgPDwgMTUpCS8qIFNpbmdsZSBieXRlIGRhdGEgKi8KKyNkZWZpbmUgT01BUF9JMkNfU1RBVF9YRFIJKDEgPDwgMTQpCS8qIFRYIEJ1ZmZlciBkcmFpbmluZyAqLworI2RlZmluZSBPTUFQX0kyQ19TVEFUX1JEUgkoMSA8PCAxMykJLyogUlggQnVmZmVyIGRyYWluaW5nICovCiAjZGVmaW5lIE9NQVBfSTJDX1NUQVRfQkIJKDEgPDwgMTIpCS8qIEJ1cyBidXN5ICovCiAjZGVmaW5lIE9NQVBfSTJDX1NUQVRfUk9WUgkoMSA8PCAxMSkJLyogUmVjZWl2ZSBvdmVycnVuICovCiAjZGVmaW5lIE9NQVBfSTJDX1NUQVRfWFVERgkoMSA8PCAxMCkJLyogVHJhbnNtaXQgdW5kZXJmbG93ICovCkBAIC03NiwxMyArOTEsMzQgQEAKICNkZWZpbmUgT01BUF9JMkNfU1RBVF9OQUNLCSgxIDw8IDEpCS8qIE5vIGFjayBpbnRlcnJ1cHQgZW5hYmxlICovCiAjZGVmaW5lIE9NQVBfSTJDX1NUQVRfQUwJKDEgPDwgMCkJLyogQXJiaXRyYXRpb24gbG9zdCBpbnQgZW5hICovCiAKKy8qIEkyQyBXRSB3YWtldXAgZW5hYmxlIHJlZ2lzdGVyICovCisjZGVmaW5lIE9NQVBfSTJDX1dFX1hEUl9XRQkoMSA8PCAxNCkJLyogVFggZHJhaW4gd2FrdXAgKi8KKyNkZWZpbmUgT01BUF9JMkNfV0VfUkRSX1dFCSgxIDw8IDEzKQkvKiBSWCBkcmFpbiB3YWtldXAgKi8KKyNkZWZpbmUgT01BUF9JMkNfV0VfQUFTX1dFCSgxIDw8IDkpCS8qIEFkZHJlc3MgYXMgc2xhdmUgd2FrZXVwKi8KKyNkZWZpbmUgT01BUF9JMkNfV0VfQkZfV0UJKDEgPDwgOCkJLyogQnVzIGZyZWUgd2FrZXVwICovCisjZGVmaW5lIE9NQVBfSTJDX1dFX1NUQ19XRQkoMSA8PCA2KQkvKiBTdGFydCBjb25kaXRpb24gd2FrZXVwICovCisjZGVmaW5lIE9NQVBfSTJDX1dFX0dDX1dFCSgxIDw8IDUpCS8qIEdlbmVyYWwgY2FsbCB3YWtldXAgKi8KKyNkZWZpbmUgT01BUF9JMkNfV0VfRFJEWV9XRQkoMSA8PCAzKQkvKiBUWC9SWCBkYXRhIHJlYWR5IHdha2V1cCAqLworI2RlZmluZSBPTUFQX0kyQ19XRV9BUkRZX1dFCSgxIDw8IDIpCS8qIFJlZyBhY2Nlc3MgcmVhZHkgd2FrZXVwICovCisjZGVmaW5lIE9NQVBfSTJDX1dFX05BQ0tfV0UJKDEgPDwgMSkJLyogTm8gYWNrbm93bGVkZ21lbnQgd2FrZXVwICovCisjZGVmaW5lIE9NQVBfSTJDX1dFX0FMX1dFCSgxIDw8IDApCS8qIEFyYml0cmF0aW9uIGxvc3Qgd2FrZXVwICovCisKKyNkZWZpbmUgT01BUF9JMkNfV0VfQUxMCQkoT01BUF9JMkNfV0VfWERSX1dFIHwgT01BUF9JMkNfV0VfUkRSX1dFIHwgXAorCQkJCU9NQVBfSTJDX1dFX0FBU19XRSB8IE9NQVBfSTJDX1dFX0JGX1dFIHwgXAorCQkJCU9NQVBfSTJDX1dFX1NUQ19XRSB8IE9NQVBfSTJDX1dFX0dDX1dFIHwgXAorCQkJCU9NQVBfSTJDX1dFX0RSRFlfV0UgfCBPTUFQX0kyQ19XRV9BUkRZX1dFIHwgXAorCQkJCU9NQVBfSTJDX1dFX05BQ0tfV0UgfCBPTUFQX0kyQ19XRV9BTF9XRSkKKwogLyogSTJDIEJ1ZmZlciBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIChPTUFQX0kyQ19CVUYpOiAqLwogI2RlZmluZSBPTUFQX0kyQ19CVUZfUkRNQV9FTgkoMSA8PCAxNSkJLyogUlggRE1BIGNoYW5uZWwgZW5hYmxlICovCisjZGVmaW5lIE9NQVBfSTJDX0JVRl9SWEZJRl9DTFIJKDEgPDwgMTQpCS8qIFJYIEZJRk8gQ2xlYXIgKi8KICNkZWZpbmUgT01BUF9JMkNfQlVGX1hETUFfRU4JKDEgPDwgNykJLyogVFggRE1BIGNoYW5uZWwgZW5hYmxlICovCisjZGVmaW5lIE9NQVBfSTJDX0JVRl9UWEZJRl9DTFIJKDEgPDwgNikJLyogVFggRklGTyBDbGVhciAqLwogCiAvKiBJMkMgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAoT01BUF9JMkNfQ09OKTogKi8KICNkZWZpbmUgT01BUF9JMkNfQ09OX0VOCQkoMSA8PCAxNSkJLyogSTJDIG1vZHVsZSBlbmFibGUgKi8KICNkZWZpbmUgT01BUF9JMkNfQ09OX0JFCQkoMSA8PCAxNCkJLyogQmlnIGVuZGlhbiBtb2RlICovCisjZGVmaW5lIE9NQVBfSTJDX0NPTl9PUE1PREVfSFMJKDEgPDwgMTIpCS8qIEhpZ2ggU3BlZWQgc3VwcG9ydCAqLwogI2RlZmluZSBPTUFQX0kyQ19DT05fU1RCCSgxIDw8IDExKQkvKiBTdGFydCBieXRlIG1vZGUgKG1hc3RlcikgKi8KICNkZWZpbmUgT01BUF9JMkNfQ09OX01TVAkoMSA8PCAxMCkJLyogTWFzdGVyL3NsYXZlIG1vZGUgKi8KICNkZWZpbmUgT01BUF9JMkNfQ09OX1RSWAkoMSA8PCA5KQkvKiBUWC9SWCBtb2RlIChtYXN0ZXIgb25seSkgKi8KQEAgLTkxLDYgKzEyNywxMCBAQAogI2RlZmluZSBPTUFQX0kyQ19DT05fU1RQCSgxIDw8IDEpCS8qIFN0b3AgY29uZCAobWFzdGVyIG9ubHkpICovCiAjZGVmaW5lIE9NQVBfSTJDX0NPTl9TVFQJKDEgPDwgMCkJLyogU3RhcnQgY29uZGl0aW9uIChtYXN0ZXIpICovCiAKKy8qIEkyQyBTQ0wgdGltZSB2YWx1ZSB3aGVuIE1hc3RlciAqLworI2RlZmluZSBPTUFQX0kyQ19TQ0xMX0hTU0NMTAk4CisjZGVmaW5lIE9NQVBfSTJDX1NDTEhfSFNTQ0xICTgKKwogLyogSTJDIFN5c3RlbSBUZXN0IFJlZ2lzdGVyIChPTUFQX0kyQ19TWVNURVNUKTogKi8KICNpZmRlZiBERUJVRwogI2RlZmluZSBPTUFQX0kyQ19TWVNURVNUX1NUX0VOCQkoMSA8PCAxNSkJLyogU3lzdGVtIHRlc3QgZW5hYmxlICovCkBAIC0xMDMsMTcgKzE0MywxOSBAQAogI2RlZmluZSBPTUFQX0kyQ19TWVNURVNUX1NEQV9PCQkoMSA8PCAwKQkvKiBTREEgbGluZSBkcml2ZSBvdXQgKi8KICNlbmRpZgogCi0vKiBJMkMgU3lzdGVtIFN0YXR1cyByZWdpc3RlciAoT01BUF9JMkNfU1lTUyk6ICovCi0jZGVmaW5lIE9NQVBfSTJDX1NZU1NfUkRPTkUJCSgxIDw8IDApCS8qIFJlc2V0IERvbmUgKi8KKy8qIE9DUF9TWVNTVEFUVVMgYml0IGRlZmluaXRpb25zICovCisjZGVmaW5lIFNZU1NfUkVTRVRET05FX01BU0sJCSgxIDw8IDApCiAKLS8qIEkyQyBTeXN0ZW0gQ29uZmlndXJhdGlvbiBSZWdpc3RlciAoT01BUF9JMkNfU1lTQyk6ICovCi0jZGVmaW5lIE9NQVBfSTJDX1NZU0NfU1JTVAkJKDEgPDwgMSkJLyogU29mdCBSZXNldCAqLworLyogT0NQX1NZU0NPTkZJRyBiaXQgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgU1lTQ19DTE9DS0FDVElWSVRZX01BU0sJCSgweDMgPDwgOCkKKyNkZWZpbmUgU1lTQ19TSURMRU1PREVfTUFTSwkJKDB4MyA8PCAzKQorI2RlZmluZSBTWVNDX0VOQVdBS0VVUF9NQVNLCQkoMSA8PCAyKQorI2RlZmluZSBTWVNDX1NPRlRSRVNFVF9NQVNLCQkoMSA8PCAxKQorI2RlZmluZSBTWVNDX0FVVE9JRExFX01BU0sJCSgxIDw8IDApCiAKLS8qIFJFVklTSVQ6IFVzZSBwbGF0Zm9ybV9kYXRhIGluc3RlYWQgb2YgbW9kdWxlIHBhcmFtZXRlcnMgKi8KLS8qIEZhc3QgTW9kZSA9IDQwMCBrSHosIFN0YW5kYXJkID0gMTAwIGtIeiAqLwotc3RhdGljIGludCBjbG9jayA9IDEwMDsgLyogRGVmYXVsdDogMTAwIGtIeiAqLwotbW9kdWxlX3BhcmFtKGNsb2NrLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhjbG9jaywgIlNldCBJMkMgY2xvY2sgaW4ga0h6OiA0MDA9ZmFzdCBtb2RlIChkZWZhdWx0ID09IDEwMCkiKTsKKyNkZWZpbmUgU1lTQ19JRExFTU9ERV9TTUFSVAkJMHgyCisjZGVmaW5lIFNZU0NfQ0xPQ0tBQ1RJVklUWV9GQ0xLCQkweDIKKwogCiBzdHJ1Y3Qgb21hcF9pMmNfZGV2IHsKIAlzdHJ1Y3QgZGV2aWNlCQkqZGV2OwpAQCAtMTIzLDExICsxNjUsMTcgQEAKIAlzdHJ1Y3QgY2xrCQkqZmNsazsJCS8qIEZ1bmN0aW9uYWwgY2xvY2sgKi8KIAlzdHJ1Y3QgY29tcGxldGlvbgljbWRfY29tcGxldGU7CiAJc3RydWN0IHJlc291cmNlCQkqaW9hcmVhOworCXUzMgkJCXNwZWVkOwkJLyogU3BlZWQgb2YgYnVzIGluIEtoeiAqLwogCXUxNgkJCWNtZF9lcnI7CiAJdTgJCQkqYnVmOwogCXNpemVfdAkJCWJ1Zl9sZW47CiAJc3RydWN0IGkyY19hZGFwdGVyCWFkYXB0ZXI7Ci0JdW5zaWduZWQJCXJldjE6MTsKKwl1OAkJCWZpZm9fc2l6ZTsJLyogdXNlIGFzIGZsYWcgYW5kIHZhbHVlCisJCQkJCQkgKiBmaWZvX3NpemU9PTAgaW1wbGllcyBubyBmaWZvCisJCQkJCQkgKiBpZiBzZXQsIHNob3VsZCBiZSB0cnNoKzEKKwkJCQkJCSAqLworCXU4CQkJcmV2OworCXVuc2lnbmVkCQliX2h3OjE7CQkvKiBiYWQgaC93IGZpeGVzICovCiAJdW5zaWduZWQJCWlkbGU6MTsKIAl1MTYJCQlpZXN0YXRlOwkvKiBTYXZlZCBpbnRlcnJ1cHQgcmVnaXN0ZXIgKi8KIH07CkBAIC0xNDMsOSArMTkxLDkgQEAKIAlyZXR1cm4gX19yYXdfcmVhZHcoaTJjX2Rldi0+YmFzZSArIHJlZyk7CiB9CiAKLXN0YXRpYyBpbnQgb21hcF9pMmNfZ2V0X2Nsb2NrcyhzdHJ1Y3Qgb21hcF9pMmNfZGV2ICpkZXYpCitzdGF0aWMgaW50IF9faW5pdCBvbWFwX2kyY19nZXRfY2xvY2tzKHN0cnVjdCBvbWFwX2kyY19kZXYgKmRldikKIHsKLQlpZiAoY3B1X2lzX29tYXAxNnh4KCkgfHwgY3B1X2lzX29tYXAyNHh4KCkpIHsKKwlpZiAoY3B1X2lzX29tYXAxNnh4KCkgfHwgY3B1X2NsYXNzX2lzX29tYXAyKCkpIHsKIAkJZGV2LT5pY2xrID0gY2xrX2dldChkZXYtPmRldiwgImkyY19pY2siKTsKIAkJaWYgKElTX0VSUihkZXYtPmljbGspKSB7CiAJCQlkZXYtPmljbGsgPSBOVUxMOwpAQCAtMTc4LDI1ICsyMjYsMzMgQEAKIAogc3RhdGljIHZvaWQgb21hcF9pMmNfdW5pZGxlKHN0cnVjdCBvbWFwX2kyY19kZXYgKmRldikKIHsKKwlXQVJOX09OKCFkZXYtPmlkbGUpOworCiAJaWYgKGRldi0+aWNsayAhPSBOVUxMKQogCQljbGtfZW5hYmxlKGRldi0+aWNsayk7CiAJY2xrX2VuYWJsZShkZXYtPmZjbGspOworCWRldi0+aWRsZSA9IDA7CiAJaWYgKGRldi0+aWVzdGF0ZSkKIAkJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfSUVfUkVHLCBkZXYtPmllc3RhdGUpOwotCWRldi0+aWRsZSA9IDA7CiB9CiAKIHN0YXRpYyB2b2lkIG9tYXBfaTJjX2lkbGUoc3RydWN0IG9tYXBfaTJjX2RldiAqZGV2KQogewogCXUxNiBpdjsKIAotCWRldi0+aWRsZSA9IDE7CisJV0FSTl9PTihkZXYtPmlkbGUpOworCiAJZGV2LT5pZXN0YXRlID0gb21hcF9pMmNfcmVhZF9yZWcoZGV2LCBPTUFQX0kyQ19JRV9SRUcpOwogCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX0lFX1JFRywgMCk7Ci0JaWYgKGRldi0+cmV2MSkKLQkJaXYgPSBvbWFwX2kyY19yZWFkX3JlZyhkZXYsIE9NQVBfSTJDX0lWX1JFRyk7CS8qIFJlYWQgY2xlYXJzICovCi0JZWxzZQorCWlmIChkZXYtPnJldiA8IE9NQVBfSTJDX1JFVl8yKSB7CisJCWl2ID0gb21hcF9pMmNfcmVhZF9yZWcoZGV2LCBPTUFQX0kyQ19JVl9SRUcpOyAvKiBSZWFkIGNsZWFycyAqLworCX0gZWxzZSB7CiAJCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX1NUQVRfUkVHLCBkZXYtPmllc3RhdGUpOworCisJCS8qIEZsdXNoIHBvc3RlZCB3cml0ZSBiZWZvcmUgdGhlIGRldi0+aWRsZSBzdG9yZSBvY2N1cnMgKi8KKwkJb21hcF9pMmNfcmVhZF9yZWcoZGV2LCBPTUFQX0kyQ19TVEFUX1JFRyk7CisJfQorCWRldi0+aWRsZSA9IDE7CiAJY2xrX2Rpc2FibGUoZGV2LT5mY2xrKTsKIAlpZiAoZGV2LT5pY2xrICE9IE5VTEwpCiAJCWNsa19kaXNhYmxlKGRldi0+aWNsayk7CkBAIC0yMDQsMTggKzI2MCwyMCBAQAogCiBzdGF0aWMgaW50IG9tYXBfaTJjX2luaXQoc3RydWN0IG9tYXBfaTJjX2RldiAqZGV2KQogewotCXUxNiBwc2MgPSAwOworCXUxNiBwc2MgPSAwLCBzY2xsID0gMCwgc2NsaCA9IDA7CisJdTE2IGZzc2NsbCA9IDAsIGZzc2NsaCA9IDAsIGhzc2NsbCA9IDAsIGhzc2NsaCA9IDA7CiAJdW5zaWduZWQgbG9uZyBmY2xrX3JhdGUgPSAxMjAwMDAwMDsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJdW5zaWduZWQgbG9uZyBpbnRlcm5hbF9jbGsgPSAwOwogCi0JaWYgKCFkZXYtPnJldjEpIHsKLQkJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfU1lTQ19SRUcsIE9NQVBfSTJDX1NZU0NfU1JTVCk7CisJaWYgKGRldi0+cmV2ID49IE9NQVBfSTJDX1JFVl8yKSB7CisJCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX1NZU0NfUkVHLCBTWVNDX1NPRlRSRVNFVF9NQVNLKTsKIAkJLyogRm9yIHNvbWUgcmVhc29uIHdlIG5lZWQgdG8gc2V0IHRoZSBFTiBiaXQgYmVmb3JlIHRoZQogCQkgKiByZXNldCBkb25lIGJpdCBnZXRzIHNldC4gKi8KIAkJdGltZW91dCA9IGppZmZpZXMgKyBPTUFQX0kyQ19USU1FT1VUOwogCQlvbWFwX2kyY193cml0ZV9yZWcoZGV2LCBPTUFQX0kyQ19DT05fUkVHLCBPTUFQX0kyQ19DT05fRU4pOwogCQl3aGlsZSAoIShvbWFwX2kyY19yZWFkX3JlZyhkZXYsIE9NQVBfSTJDX1NZU1NfUkVHKSAmCi0JCQkgT01BUF9JMkNfU1lTU19SRE9ORSkpIHsKKwkJCSBTWVNTX1JFU0VURE9ORV9NQVNLKSkgewogCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKIAkJCQlkZXZfd2FybihkZXYtPmRldiwgInRpbWVvdXQgd2FpdGluZyAiCiAJCQkJCQkiZm9yIGNvbnRyb2xsZXIgcmVzZXRcbiIpOwpAQCAtMjIzLDYgKzI4MSwzMyBAQAogCQkJfQogCQkJbXNsZWVwKDEpOwogCQl9CisKKwkJLyogU1lTQyByZWdpc3RlciBpcyBjbGVhcmVkIGJ5IHRoZSByZXNldDsgcmV3cml0ZSBpdCAqLworCQlpZiAoZGV2LT5yZXYgPT0gT01BUF9JMkNfUkVWX09OXzI0MzApIHsKKworCQkJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfU1lTQ19SRUcsCisJCQkJCSAgIFNZU0NfQVVUT0lETEVfTUFTSyk7CisKKwkJfSBlbHNlIGlmIChkZXYtPnJldiA+PSBPTUFQX0kyQ19SRVZfT05fMzQzMCkgeworCQkJdTMyIHY7CisKKwkJCXYgPSBTWVNDX0FVVE9JRExFX01BU0s7CisJCQl2IHw9IFNZU0NfRU5BV0FLRVVQX01BU0s7CisJCQl2IHw9IChTWVNDX0lETEVNT0RFX1NNQVJUIDw8CisJCQkgICAgICBfX2ZmcyhTWVNDX1NJRExFTU9ERV9NQVNLKSk7CisJCQl2IHw9IChTWVNDX0NMT0NLQUNUSVZJVFlfRkNMSyA8PAorCQkJICAgICAgX19mZnMoU1lTQ19DTE9DS0FDVElWSVRZX01BU0spKTsKKworCQkJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfU1lTQ19SRUcsIHYpOworCQkJLyoKKwkJCSAqIEVuYWJsaW5nIGFsbCB3YWt1cCBzb3VyY2VzIHRvIHN0b3AgSTJDIGZyZWV6aW5nIG9uCisJCQkgKiBXRkkgaW5zdHJ1Y3Rpb24uCisJCQkgKiBSRVZJU0lUOiBTb21lIHdrdXAgc291cmNlcyBtaWdodCBub3QgYmUgbmVlZGVkLgorCQkJICovCisJCQlvbWFwX2kyY193cml0ZV9yZWcoZGV2LCBPTUFQX0kyQ19XRV9SRUcsCisJCQkJCQkJT01BUF9JMkNfV0VfQUxMKTsKKworCQl9CiAJfQogCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX0NPTl9SRUcsIDApOwogCkBAIC0yNDksMjcgKzMzNCw2NSBAQAogCQkJcHNjID0gZmNsa19yYXRlIC8gMTIwMDAwMDA7CiAJfQogCisJaWYgKGNwdV9pc19vbWFwMjQzMCgpIHx8IGNwdV9pc19vbWFwMzR4eCgpKSB7CisKKwkJLyogSFNJMkMgY29udHJvbGxlciBpbnRlcm5hbCBjbGsgcmF0ZSBzaG91bGQgYmUgMTkuMiBNaHogKi8KKwkJaW50ZXJuYWxfY2xrID0gMTkyMDA7CisJCWZjbGtfcmF0ZSA9IGNsa19nZXRfcmF0ZShkZXYtPmZjbGspIC8gMTAwMDsKKworCQkvKiBDb21wdXRlIHByZXNjYWxlciBkaXZpc29yICovCisJCXBzYyA9IGZjbGtfcmF0ZSAvIGludGVybmFsX2NsazsKKwkJcHNjID0gcHNjIC0gMTsKKworCQkvKiBJZiBjb25maWd1cmVkIGZvciBIaWdoIFNwZWVkICovCisJCWlmIChkZXYtPnNwZWVkID4gNDAwKSB7CisJCQkvKiBGb3IgZmlyc3QgcGhhc2Ugb2YgSFMgbW9kZSAqLworCQkJZnNzY2xsID0gaW50ZXJuYWxfY2xrIC8gKDQwMCAqIDIpIC0gNjsKKwkJCWZzc2NsaCA9IGludGVybmFsX2NsayAvICg0MDAgKiAyKSAtIDY7CisKKwkJCS8qIEZvciBzZWNvbmQgcGhhc2Ugb2YgSFMgbW9kZSAqLworCQkJaHNzY2xsID0gZmNsa19yYXRlIC8gKGRldi0+c3BlZWQgKiAyKSAtIDY7CisJCQloc3NjbGggPSBmY2xrX3JhdGUgLyAoZGV2LT5zcGVlZCAqIDIpIC0gNjsKKwkJfSBlbHNlIHsKKwkJCS8qIFRvIGhhbmRsZSBGL1MgbW9kZXMgKi8KKwkJCWZzc2NsbCA9IGludGVybmFsX2NsayAvIChkZXYtPnNwZWVkICogMikgLSA2OworCQkJZnNzY2xoID0gaW50ZXJuYWxfY2xrIC8gKGRldi0+c3BlZWQgKiAyKSAtIDY7CisJCX0KKwkJc2NsbCA9IChoc3NjbGwgPDwgT01BUF9JMkNfU0NMTF9IU1NDTEwpIHwgZnNzY2xsOworCQlzY2xoID0gKGhzc2NsaCA8PCBPTUFQX0kyQ19TQ0xIX0hTU0NMSCkgfCBmc3NjbGg7CisJfSBlbHNlIHsKKwkJLyogUHJvZ3JhbSBkZXNpcmVkIG9wZXJhdGluZyByYXRlICovCisJCWZjbGtfcmF0ZSAvPSAocHNjICsgMSkgKiAxMDAwOworCQlpZiAocHNjID4gMikKKwkJCXBzYyA9IDI7CisJCXNjbGwgPSBmY2xrX3JhdGUgLyAoZGV2LT5zcGVlZCAqIDIpIC0gNyArIHBzYzsKKwkJc2NsaCA9IGZjbGtfcmF0ZSAvIChkZXYtPnNwZWVkICogMikgLSA3ICsgcHNjOworCX0KKwogCS8qIFNldHVwIGNsb2NrIHByZXNjYWxlciB0byBvYnRhaW4gYXBwcm94IDEyTUh6IEkyQyBtb2R1bGUgY2xvY2s6ICovCiAJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfUFNDX1JFRywgcHNjKTsKIAotCS8qIFByb2dyYW0gZGVzaXJlZCBvcGVyYXRpbmcgcmF0ZSAqLwotCWZjbGtfcmF0ZSAvPSAocHNjICsgMSkgKiAxMDAwOwotCWlmIChwc2MgPiAyKQotCQlwc2MgPSAyOworCS8qIFNDTCBsb3cgYW5kIGhpZ2ggdGltZSB2YWx1ZXMgKi8KKwlvbWFwX2kyY193cml0ZV9yZWcoZGV2LCBPTUFQX0kyQ19TQ0xMX1JFRywgc2NsbCk7CisJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfU0NMSF9SRUcsIHNjbGgpOwogCi0Jb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfU0NMTF9SRUcsCi0JCQkgICBmY2xrX3JhdGUgLyAoY2xvY2sgKiAyKSAtIDcgKyBwc2MpOwotCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX1NDTEhfUkVHLAotCQkJICAgZmNsa19yYXRlIC8gKGNsb2NrICogMikgLSA3ICsgcHNjKTsKKwlpZiAoZGV2LT5maWZvX3NpemUpCisJCS8qIE5vdGU6IHNldHVwIHJlcXVpcmVkIGZpZm8gc2l6ZSAtIDEgKi8KKwkJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfQlVGX1JFRywKKwkJCQkJKGRldi0+Zmlmb19zaXplIC0gMSkgPDwgOCB8IC8qIFJUUlNIICovCisJCQkJCU9NQVBfSTJDX0JVRl9SWEZJRl9DTFIgfAorCQkJCQkoZGV2LT5maWZvX3NpemUgLSAxKSB8IC8qIFhUUlNIICovCisJCQkJCU9NQVBfSTJDX0JVRl9UWEZJRl9DTFIpOwogCiAJLyogVGFrZSB0aGUgSTJDIG1vZHVsZSBvdXQgb2YgcmVzZXQ6ICovCiAJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfQ09OX1JFRywgT01BUF9JMkNfQ09OX0VOKTsKIAogCS8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCiAJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfSUVfUkVHLAotCQkJICAgKE9NQVBfSTJDX0lFX1hSRFkgfCBPTUFQX0kyQ19JRV9SUkRZIHwKLQkJCSAgICBPTUFQX0kyQ19JRV9BUkRZIHwgT01BUF9JMkNfSUVfTkFDSyB8Ci0JCQkgICAgT01BUF9JMkNfSUVfQUwpKTsKKwkJCShPTUFQX0kyQ19JRV9YUkRZIHwgT01BUF9JMkNfSUVfUlJEWSB8CisJCQlPTUFQX0kyQ19JRV9BUkRZIHwgT01BUF9JMkNfSUVfTkFDSyB8CisJCQlPTUFQX0kyQ19JRV9BTCkgIHwgKChkZXYtPmZpZm9fc2l6ZSkgPworCQkJCShPTUFQX0kyQ19JRV9SRFIgfCBPTUFQX0kyQ19JRV9YRFIpIDogMCkpOwogCXJldHVybiAwOwogfQogCkBAIC0zMTYsMjAgKzQzOSw1OSBAQAogCiAJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfQ05UX1JFRywgZGV2LT5idWZfbGVuKTsKIAorCS8qIENsZWFyIHRoZSBGSUZPIEJ1ZmZlcnMgKi8KKwl3ID0gb21hcF9pMmNfcmVhZF9yZWcoZGV2LCBPTUFQX0kyQ19CVUZfUkVHKTsKKwl3IHw9IE9NQVBfSTJDX0JVRl9SWEZJRl9DTFIgfCBPTUFQX0kyQ19CVUZfVFhGSUZfQ0xSOworCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX0JVRl9SRUcsIHcpOworCiAJaW5pdF9jb21wbGV0aW9uKCZkZXYtPmNtZF9jb21wbGV0ZSk7CiAJZGV2LT5jbWRfZXJyID0gMDsKIAogCXcgPSBPTUFQX0kyQ19DT05fRU4gfCBPTUFQX0kyQ19DT05fTVNUIHwgT01BUF9JMkNfQ09OX1NUVDsKKworCS8qIEhpZ2ggc3BlZWQgY29uZmlndXJhdGlvbiAqLworCWlmIChkZXYtPnNwZWVkID4gNDAwKQorCQl3IHw9IE9NQVBfSTJDX0NPTl9PUE1PREVfSFM7CisKIAlpZiAobXNnLT5mbGFncyAmIEkyQ19NX1RFTikKIAkJdyB8PSBPTUFQX0kyQ19DT05fWEE7CiAJaWYgKCEobXNnLT5mbGFncyAmIEkyQ19NX1JEKSkKIAkJdyB8PSBPTUFQX0kyQ19DT05fVFJYOwotCWlmIChzdG9wKQorCisJaWYgKCFkZXYtPmJfaHcgJiYgc3RvcCkKIAkJdyB8PSBPTUFQX0kyQ19DT05fU1RQOworCiAJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfQ09OX1JFRywgdyk7CiAKLQlyID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoJmRldi0+Y21kX2NvbXBsZXRlLAotCQkJCQkJICAgICAgT01BUF9JMkNfVElNRU9VVCk7CisJLyoKKwkgKiBEb24ndCB3cml0ZSBzdHQgYW5kIHN0cCB0b2dldGhlciBvbiBzb21lIGhhcmR3YXJlLgorCSAqLworCWlmIChkZXYtPmJfaHcgJiYgc3RvcCkgeworCQl1bnNpZ25lZCBsb25nIGRlbGF5ID0gamlmZmllcyArIE9NQVBfSTJDX1RJTUVPVVQ7CisJCXUxNiBjb24gPSBvbWFwX2kyY19yZWFkX3JlZyhkZXYsIE9NQVBfSTJDX0NPTl9SRUcpOworCQl3aGlsZSAoY29uICYgT01BUF9JMkNfQ09OX1NUVCkgeworCQkJY29uID0gb21hcF9pMmNfcmVhZF9yZWcoZGV2LCBPTUFQX0kyQ19DT05fUkVHKTsKKworCQkJLyogTGV0IHRoZSB1c2VyIGtub3cgaWYgaTJjIGlzIGluIGEgYmFkIHN0YXRlICovCisJCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkZWxheSkpIHsKKwkJCQlkZXZfZXJyKGRldi0+ZGV2LCAiY29udHJvbGxlciB0aW1lZCBvdXQgIgorCQkJCSJ3YWl0aW5nIGZvciBzdGFydCBjb25kaXRpb24gdG8gZmluaXNoXG4iKTsKKwkJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJCX0KKwkJCWNwdV9yZWxheCgpOworCQl9CisKKwkJdyB8PSBPTUFQX0kyQ19DT05fU1RQOworCQl3ICY9IH5PTUFQX0kyQ19DT05fU1RUOworCQlvbWFwX2kyY193cml0ZV9yZWcoZGV2LCBPTUFQX0kyQ19DT05fUkVHLCB3KTsKKwl9CisKKwkvKgorCSAqIFJFVklTSVQ6IFdlIHNob3VsZCBhYm9ydCB0aGUgdHJhbnNmZXIgb24gc2lnbmFscywgYnV0IHRoZSBidXMgZ29lcworCSAqIGludG8gYXJiaXRyYXRpb24gYW5kIHdlJ3JlIGN1cnJlbnRseSB1bmFibGUgdG8gcmVjb3ZlciBmcm9tIGl0LgorCSAqLworCXIgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmRldi0+Y21kX2NvbXBsZXRlLAorCQkJCQlPTUFQX0kyQ19USU1FT1VUKTsKIAlkZXYtPmJ1Zl9sZW4gPSAwOwogCWlmIChyIDwgMCkKIAkJcmV0dXJuIHI7CkBAIC0zNzYsNyArNTM4LDggQEAKIAogCW9tYXBfaTJjX3VuaWRsZShkZXYpOwogCi0JaWYgKChyID0gb21hcF9pMmNfd2FpdF9mb3JfYmIoZGV2KSkgPCAwKQorCXIgPSBvbWFwX2kyY193YWl0X2Zvcl9iYihkZXYpOworCWlmIChyIDwgMCkKIAkJZ290byBvdXQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKQEAgLTQxMSw2ICs1NzQsOSBAQAogCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX1NUQVRfUkVHLCBzdGF0KTsKIH0KIAorLyogcmV2MSBkZXZpY2VzIGFyZSBhcHBhcmVudGx5IG9ubHkgb24gc29tZSAxNXh4ICovCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1WFgKKwogc3RhdGljIGlycXJldHVybl90CiBvbWFwX2kyY19yZXYxX2lzcihpbnQgdGhpc19pcnEsIHZvaWQgKmRldl9pZCkKIHsKQEAgLTQ2NSw2ICs2MzEsOSBAQAogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQorI2Vsc2UKKyNkZWZpbmUgb21hcF9pMmNfcmV2MV9pc3IJCU5VTEwKKyNlbmRpZgogCiBzdGF0aWMgaXJxcmV0dXJuX3QKIG9tYXBfaTJjX2lzcihpbnQgdGhpc19pcnEsIHZvaWQgKmRldl9pZCkKQEAgLTQ3Miw3ICs2NDEsNyBAQAogCXN0cnVjdCBvbWFwX2kyY19kZXYgKmRldiA9IGRldl9pZDsKIAl1MTYgYml0czsKIAl1MTYgc3RhdCwgdzsKLQlpbnQgY291bnQgPSAwOworCWludCBlcnIsIGNvdW50ID0gMDsKIAogCWlmIChkZXYtPmlkbGUpCiAJCXJldHVybiBJUlFfTk9ORTsKQEAgLTQ4NywzOSArNjU2LDk2IEBACiAKIAkJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfU1RBVF9SRUcsIHN0YXQpOwogCi0JCWlmIChzdGF0ICYgT01BUF9JMkNfU1RBVF9BUkRZKSB7Ci0JCQlvbWFwX2kyY19jb21wbGV0ZV9jbWQoZGV2LCAwKTsKKwkJZXJyID0gMDsKKwkJaWYgKHN0YXQgJiBPTUFQX0kyQ19TVEFUX05BQ0spIHsKKwkJCWVyciB8PSBPTUFQX0kyQ19TVEFUX05BQ0s7CisJCQlvbWFwX2kyY193cml0ZV9yZWcoZGV2LCBPTUFQX0kyQ19DT05fUkVHLAorCQkJCQkgICBPTUFQX0kyQ19DT05fU1RQKTsKKwkJfQorCQlpZiAoc3RhdCAmIE9NQVBfSTJDX1NUQVRfQUwpIHsKKwkJCWRldl9lcnIoZGV2LT5kZXYsICJBcmJpdHJhdGlvbiBsb3N0XG4iKTsKKwkJCWVyciB8PSBPTUFQX0kyQ19TVEFUX0FMOworCQl9CisJCWlmIChzdGF0ICYgKE9NQVBfSTJDX1NUQVRfQVJEWSB8IE9NQVBfSTJDX1NUQVRfTkFDSyB8CisJCQkJCU9NQVBfSTJDX1NUQVRfQUwpKQorCQkJb21hcF9pMmNfY29tcGxldGVfY21kKGRldiwgZXJyKTsKKwkJaWYgKHN0YXQgJiAoT01BUF9JMkNfU1RBVF9SUkRZIHwgT01BUF9JMkNfU1RBVF9SRFIpKSB7CisJCQl1OCBudW1fYnl0ZXMgPSAxOworCQkJaWYgKGRldi0+Zmlmb19zaXplKSB7CisJCQkJaWYgKHN0YXQgJiBPTUFQX0kyQ19TVEFUX1JSRFkpCisJCQkJCW51bV9ieXRlcyA9IGRldi0+Zmlmb19zaXplOworCQkJCWVsc2UKKwkJCQkJbnVtX2J5dGVzID0gb21hcF9pMmNfcmVhZF9yZWcoZGV2LAorCQkJCQkJCU9NQVBfSTJDX0JVRlNUQVRfUkVHKTsKKwkJCX0KKwkJCXdoaWxlIChudW1fYnl0ZXMpIHsKKwkJCQludW1fYnl0ZXMtLTsKKwkJCQl3ID0gb21hcF9pMmNfcmVhZF9yZWcoZGV2LCBPTUFQX0kyQ19EQVRBX1JFRyk7CisJCQkJaWYgKGRldi0+YnVmX2xlbikgeworCQkJCQkqZGV2LT5idWYrKyA9IHc7CisJCQkJCWRldi0+YnVmX2xlbi0tOworCQkJCQkvKiBEYXRhIHJlZyBmcm9tIDI0MzAgaXMgOCBiaXQgd2lkZSAqLworCQkJCQlpZiAoIWNwdV9pc19vbWFwMjQzMCgpICYmCisJCQkJCQkJIWNwdV9pc19vbWFwMzR4eCgpKSB7CisJCQkJCQlpZiAoZGV2LT5idWZfbGVuKSB7CisJCQkJCQkJKmRldi0+YnVmKysgPSB3ID4+IDg7CisJCQkJCQkJZGV2LT5idWZfbGVuLS07CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoc3RhdCAmIE9NQVBfSTJDX1NUQVRfUlJEWSkKKwkJCQkJCWRldl9lcnIoZGV2LT5kZXYsCisJCQkJCQkJIlJSRFkgSVJRIHdoaWxlIG5vIGRhdGEiCisJCQkJCQkJCSIgcmVxdWVzdGVkXG4iKTsKKwkJCQkJaWYgKHN0YXQgJiBPTUFQX0kyQ19TVEFUX1JEUikKKwkJCQkJCWRldl9lcnIoZGV2LT5kZXYsCisJCQkJCQkJIlJEUiBJUlEgd2hpbGUgbm8gZGF0YSIKKwkJCQkJCQkJIiByZXF1ZXN0ZWRcbiIpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlvbWFwX2kyY19hY2tfc3RhdChkZXYsCisJCQkJc3RhdCAmIChPTUFQX0kyQ19TVEFUX1JSRFkgfCBPTUFQX0kyQ19TVEFUX1JEUikpOwogCQkJY29udGludWU7CiAJCX0KLQkJaWYgKHN0YXQgJiBPTUFQX0kyQ19TVEFUX1JSRFkpIHsKLQkJCXcgPSBvbWFwX2kyY19yZWFkX3JlZyhkZXYsIE9NQVBfSTJDX0RBVEFfUkVHKTsKLQkJCWlmIChkZXYtPmJ1Zl9sZW4pIHsKLQkJCQkqZGV2LT5idWYrKyA9IHc7Ci0JCQkJZGV2LT5idWZfbGVuLS07CisJCWlmIChzdGF0ICYgKE9NQVBfSTJDX1NUQVRfWFJEWSB8IE9NQVBfSTJDX1NUQVRfWERSKSkgeworCQkJdTggbnVtX2J5dGVzID0gMTsKKwkJCWlmIChkZXYtPmZpZm9fc2l6ZSkgeworCQkJCWlmIChzdGF0ICYgT01BUF9JMkNfU1RBVF9YUkRZKQorCQkJCQludW1fYnl0ZXMgPSBkZXYtPmZpZm9fc2l6ZTsKKwkJCQllbHNlCisJCQkJCW51bV9ieXRlcyA9IG9tYXBfaTJjX3JlYWRfcmVnKGRldiwKKwkJCQkJCQlPTUFQX0kyQ19CVUZTVEFUX1JFRyk7CisJCQl9CisJCQl3aGlsZSAobnVtX2J5dGVzKSB7CisJCQkJbnVtX2J5dGVzLS07CisJCQkJdyA9IDA7CiAJCQkJaWYgKGRldi0+YnVmX2xlbikgewotCQkJCQkqZGV2LT5idWYrKyA9IHcgPj4gODsKKwkJCQkJdyA9ICpkZXYtPmJ1ZisrOwogCQkJCQlkZXYtPmJ1Zl9sZW4tLTsKKwkJCQkJLyogRGF0YSByZWcgZnJvbSAgMjQzMCBpcyA4IGJpdCB3aWRlICovCisJCQkJCWlmICghY3B1X2lzX29tYXAyNDMwKCkgJiYKKwkJCQkJCQkhY3B1X2lzX29tYXAzNHh4KCkpIHsKKwkJCQkJCWlmIChkZXYtPmJ1Zl9sZW4pIHsKKwkJCQkJCQl3IHw9ICpkZXYtPmJ1ZisrIDw8IDg7CisJCQkJCQkJZGV2LT5idWZfbGVuLS07CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoc3RhdCAmIE9NQVBfSTJDX1NUQVRfWFJEWSkKKwkJCQkJCWRldl9lcnIoZGV2LT5kZXYsCisJCQkJCQkJIlhSRFkgSVJRIHdoaWxlIG5vICIKKwkJCQkJCQkiZGF0YSB0byBzZW5kXG4iKTsKKwkJCQkJaWYgKHN0YXQgJiBPTUFQX0kyQ19TVEFUX1hEUikKKwkJCQkJCWRldl9lcnIoZGV2LT5kZXYsCisJCQkJCQkJIlhEUiBJUlEgd2hpbGUgbm8gIgorCQkJCQkJCSJkYXRhIHRvIHNlbmRcbiIpOworCQkJCQlicmVhazsKIAkJCQl9Ci0JCQl9IGVsc2UKLQkJCQlkZXZfZXJyKGRldi0+ZGV2LCAiUlJEWSBJUlEgd2hpbGUgbm8gZGF0YSAiCi0JCQkJCQkicmVxdWVzdGVkXG4iKTsKLQkJCW9tYXBfaTJjX2Fja19zdGF0KGRldiwgT01BUF9JMkNfU1RBVF9SUkRZKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChzdGF0ICYgT01BUF9JMkNfU1RBVF9YUkRZKSB7Ci0JCQl3ID0gMDsKLQkJCWlmIChkZXYtPmJ1Zl9sZW4pIHsKLQkJCQl3ID0gKmRldi0+YnVmKys7Ci0JCQkJZGV2LT5idWZfbGVuLS07Ci0JCQkJaWYgKGRldi0+YnVmX2xlbikgewotCQkJCQl3IHw9ICpkZXYtPmJ1ZisrIDw8IDg7Ci0JCQkJCWRldi0+YnVmX2xlbi0tOwotCQkJCX0KLQkJCX0gZWxzZQotCQkJCWRldl9lcnIoZGV2LT5kZXYsICJYUkRZIElSUSB3aGlsZSBubyAiCi0JCQkJCSJkYXRhIHRvIHNlbmRcbiIpOwotCQkJb21hcF9pMmNfd3JpdGVfcmVnKGRldiwgT01BUF9JMkNfREFUQV9SRUcsIHcpOwotCQkJb21hcF9pMmNfYWNrX3N0YXQoZGV2LCBPTUFQX0kyQ19TVEFUX1hSRFkpOworCQkJCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX0RBVEFfUkVHLCB3KTsKKwkJCX0KKwkJCW9tYXBfaTJjX2Fja19zdGF0KGRldiwKKwkJCQlzdGF0ICYgKE9NQVBfSTJDX1NUQVRfWFJEWSB8IE9NQVBfSTJDX1NUQVRfWERSKSk7CiAJCQljb250aW51ZTsKIAkJfQogCQlpZiAoc3RhdCAmIE9NQVBfSTJDX1NUQVRfUk9WUikgewpAQCAtNTI3LDE4ICs3NTMsOSBAQAogCQkJZGV2LT5jbWRfZXJyIHw9IE9NQVBfSTJDX1NUQVRfUk9WUjsKIAkJfQogCQlpZiAoc3RhdCAmIE9NQVBfSTJDX1NUQVRfWFVERikgewotCQkJZGV2X2VycihkZXYtPmRldiwgIlRyYW5zbWl0IG92ZXJmbG93XG4iKTsKKwkJCWRldl9lcnIoZGV2LT5kZXYsICJUcmFuc21pdCB1bmRlcmZsb3dcbiIpOwogCQkJZGV2LT5jbWRfZXJyIHw9IE9NQVBfSTJDX1NUQVRfWFVERjsKIAkJfQotCQlpZiAoc3RhdCAmIE9NQVBfSTJDX1NUQVRfTkFDSykgewotCQkJb21hcF9pMmNfY29tcGxldGVfY21kKGRldiwgT01BUF9JMkNfU1RBVF9OQUNLKTsKLQkJCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX0NPTl9SRUcsCi0JCQkJCSAgIE9NQVBfSTJDX0NPTl9TVFApOwotCQl9Ci0JCWlmIChzdGF0ICYgT01BUF9JMkNfU1RBVF9BTCkgewotCQkJZGV2X2VycihkZXYtPmRldiwgIkFyYml0cmF0aW9uIGxvc3RcbiIpOwotCQkJb21hcF9pMmNfY29tcGxldGVfY21kKGRldiwgT01BUF9JMkNfU1RBVF9BTCk7Ci0JCX0KIAl9CiAKIAlyZXR1cm4gY291bnQgPyBJUlFfSEFORExFRCA6IElSUV9OT05FOwpAQCAtNTQ5LDEzICs3NjYsMTUgQEAKIAkuZnVuY3Rpb25hbGl0eQk9IG9tYXBfaTJjX2Z1bmMsCiB9OwogCi1zdGF0aWMgaW50CitzdGF0aWMgaW50IF9faW5pdAogb21hcF9pMmNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3Qgb21hcF9pMmNfZGV2CSpkZXY7CiAJc3RydWN0IGkyY19hZGFwdGVyCSphZGFwOwogCXN0cnVjdCByZXNvdXJjZQkJKm1lbSwgKmlycSwgKmlvYXJlYTsKKwlpcnFfaGFuZGxlcl90IGlzcjsKIAlpbnQgcjsKKwl1MzIgc3BlZWQgPSAwOwogCiAJLyogTk9URTogZHJpdmVyIHVzZXMgdGhlIHN0YXRpYyByZWdpc3RlciBtYXBwaW5nICovCiAJbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKQEAgLTU3NiwxNyArNzk1LDE5IEBACiAJCXJldHVybiAtRUJVU1k7CiAJfQogCi0JaWYgKGNsb2NrID4gMjAwKQotCQljbG9jayA9IDQwMDsJLyogRmFzdCBtb2RlICovCi0JZWxzZQotCQljbG9jayA9IDEwMDsJLyogU3RhbmRhcmQgbW9kZSAqLwotCiAJZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG9tYXBfaTJjX2RldiksIEdGUF9LRVJORUwpOwogCWlmICghZGV2KSB7CiAJCXIgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9yZWxlYXNlX3JlZ2lvbjsKIAl9CiAKKwlpZiAocGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgIT0gTlVMTCkKKwkJc3BlZWQgPSAqKHUzMiAqKXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWVsc2UKKwkJc3BlZWQgPSAxMDA7CS8qIERlZnVhbHQgc3BlZWQgKi8KKworCWRldi0+c3BlZWQgPSBzcGVlZDsKKwlkZXYtPmlkbGUgPSAxOwogCWRldi0+ZGV2ID0gJnBkZXYtPmRldjsKIAlkZXYtPmlycSA9IGlycS0+c3RhcnQ7CiAJZGV2LT5iYXNlID0gaW9yZW1hcChtZW0tPnN0YXJ0LCBtZW0tPmVuZCAtIG1lbS0+c3RhcnQgKyAxKTsKQEAgLTYwMiwyMiArODIzLDM5IEBACiAKIAlvbWFwX2kyY191bmlkbGUoZGV2KTsKIAotCWlmIChjcHVfaXNfb21hcDE1eHgoKSkKLQkJZGV2LT5yZXYxID0gb21hcF9pMmNfcmVhZF9yZWcoZGV2LCBPTUFQX0kyQ19SRVZfUkVHKSA8IDB4MjA7CisJZGV2LT5yZXYgPSBvbWFwX2kyY19yZWFkX3JlZyhkZXYsIE9NQVBfSTJDX1JFVl9SRUcpICYgMHhmZjsKKworCWlmIChjcHVfaXNfb21hcDI0MzAoKSB8fCBjcHVfaXNfb21hcDM0eHgoKSkgeworCQl1MTYgczsKKworCQkvKiBTZXQgdXAgdGhlIGZpZm8gc2l6ZSAtIEdldCB0b3RhbCBzaXplICovCisJCXMgPSAob21hcF9pMmNfcmVhZF9yZWcoZGV2LCBPTUFQX0kyQ19CVUZTVEFUX1JFRykgPj4gMTQpICYgMHgzOworCQlkZXYtPmZpZm9fc2l6ZSA9IDB4OCA8PCBzOworCisJCS8qCisJCSAqIFNldCB1cCBub3RpZmljYXRpb24gdGhyZXNob2xkIGFzIGhhbGYgdGhlIHRvdGFsIGF2YWlsYWJsZQorCQkgKiBzaXplLiBUaGlzIGlzIHRvIGVuc3VyZSB0aGF0IHdlIGNhbiBoYW5kbGUgdGhlIHN0YXR1cyBvbiBpbnQKKwkJICogY2FsbCBiYWNrIGxhdGVuY2llcy4KKwkJICovCisJCWRldi0+Zmlmb19zaXplID0gKGRldi0+Zmlmb19zaXplIC8gMik7CisJCWRldi0+Yl9odyA9IDE7IC8qIEVuYWJsZSBoYXJkd2FyZSBmaXhlcyAqLworCX0KIAogCS8qIHJlc2V0IEFTQVAsIGNsZWFyaW5nIGFueSBJUlFzICovCiAJb21hcF9pMmNfaW5pdChkZXYpOwogCi0JciA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBkZXYtPnJldjEgPyBvbWFwX2kyY19yZXYxX2lzciA6IG9tYXBfaTJjX2lzciwKLQkJCTAsIHBkZXYtPm5hbWUsIGRldik7CisJaXNyID0gKGRldi0+cmV2IDwgT01BUF9JMkNfUkVWXzIpID8gb21hcF9pMmNfcmV2MV9pc3IgOiBvbWFwX2kyY19pc3I7CisJciA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBpc3IsIDAsIHBkZXYtPm5hbWUsIGRldik7CiAKIAlpZiAocikgewogCQlkZXZfZXJyKGRldi0+ZGV2LCAiZmFpbHVyZSByZXF1ZXN0aW5nIGlycSAlaVxuIiwgZGV2LT5pcnEpOwogCQlnb3RvIGVycl91bnVzZV9jbG9ja3M7CiAJfQotCXIgPSBvbWFwX2kyY19yZWFkX3JlZyhkZXYsIE9NQVBfSTJDX1JFVl9SRUcpICYgMHhmZjsKKwogCWRldl9pbmZvKGRldi0+ZGV2LCAiYnVzICVkIHJldiVkLiVkIGF0ICVkIGtIelxuIiwKLQkJIHBkZXYtPmlkLCByID4+IDQsIHIgJiAweGYsIGNsb2NrKTsKKwkJIHBkZXYtPmlkLCBkZXYtPnJldiA+PiA0LCBkZXYtPnJldiAmIDB4ZiwgZGV2LT5zcGVlZCk7CisKKwlvbWFwX2kyY19pZGxlKGRldik7CiAKIAlhZGFwID0gJmRldi0+YWRhcHRlcjsKIAlpMmNfc2V0X2FkYXBkYXRhKGFkYXAsIGRldik7CkBAIC02MzUsOCArODczLDYgQEAKIAkJZ290byBlcnJfZnJlZV9pcnE7CiAJfQogCi0Jb21hcF9pMmNfaWRsZShkZXYpOwotCiAJcmV0dXJuIDA7CiAKIGVycl9mcmVlX2lycToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcHhhLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXB4YS5jCmluZGV4IDU4N2Y1YjIuLjZhZjY4MTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcHhhLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1weGEuYwpAQCAtMTA3NiwxMCArMTA3NiwxMCBAQAogCiAjaWZkZWYgQ09ORklHX0kyQ19QWEFfU0xBVkUKIAlwcmludGsoS0VSTl9JTkZPICJJMkM6ICVzOiBQWEEgSTJDIGFkYXB0ZXIsIHNsYXZlIGFkZHJlc3MgJWRcbiIsCi0JICAgICAgIGkyYy0+YWRhcC5kZXYuYnVzX2lkLCBpMmMtPnNsYXZlX2FkZHIpOworCSAgICAgICBkZXZfbmFtZSgmaTJjLT5hZGFwLmRldiksIGkyYy0+c2xhdmVfYWRkcik7CiAjZWxzZQogCXByaW50ayhLRVJOX0lORk8gIkkyQzogJXM6IFBYQSBJMkMgYWRhcHRlclxuIiwKLQkgICAgICAgaTJjLT5hZGFwLmRldi5idXNfaWQpOworCSAgICAgICBkZXZfbmFtZSgmaTJjLT5hZGFwLmRldikpOwogI2VuZGlmCiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtczNjMjQxMC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zM2MyNDEwLmMKaW5kZXggYzM5MDc5Zi4uNWI3Zjk1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zM2MyNDEwLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zM2MyNDEwLmMKQEAgLTM1LDExICszNSw5IEBACiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgogCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAotI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CiAjaW5jbHVkZSA8cGxhdC9yZWdzLWlpYy5oPgogI2luY2x1ZGUgPHBsYXQvaWljLmg+CiAKQEAgLTY0LDYgKzYyLDcgQEAKIAl1bnNpZ25lZCBpbnQJCW1zZ19wdHI7CiAKIAl1bnNpZ25lZCBpbnQJCXR4X3NldHVwOworCXVuc2lnbmVkIGludAkJaXJxOwogCiAJZW51bSBzM2MyNHh4X2kyY19zdGF0ZQlzdGF0ZTsKIAl1bnNpZ25lZCBsb25nCQljbGtyYXRlOwpAQCAtNzEsNyArNzAsNiBAQAogCXZvaWQgX19pb21lbQkJKnJlZ3M7CiAJc3RydWN0IGNsawkJKmNsazsKIAlzdHJ1Y3QgZGV2aWNlCQkqZGV2OwotCXN0cnVjdCByZXNvdXJjZQkJKmlycTsKIAlzdHJ1Y3QgcmVzb3VyY2UJCSppb2FyZWE7CiAJc3RydWN0IGkyY19hZGFwdGVyCWFkYXA7CiAKQEAgLTgwLDE2ICs3OCw3IEBACiAjZW5kaWYKIH07CiAKLS8qIGRlZmF1bHQgcGxhdGZvcm0gZGF0YSB0byB1c2UgaWYgbm90IHN1cHBsaWVkIGluIHRoZSBwbGF0Zm9ybV9kZXZpY2UKLSovCi0KLXN0YXRpYyBzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgczNjMjR4eF9pMmNfZGVmYXVsdF9wbGF0Zm9ybSA9IHsKLQkuZmxhZ3MJCT0gMCwKLQkuc2xhdmVfYWRkcgk9IDB4MTAsCi0JLmJ1c19mcmVxCT0gMTAwKjEwMDAsCi0JLm1heF9mcmVxCT0gNDAwKjEwMDAsCi0JLnNkYV9kZWxheQk9IFMzQzI0MTBfSUlDTENfU0RBX0RFTEFZNSB8IFMzQzI0MTBfSUlDTENfRklMVEVSX09OLAotfTsKKy8qIGRlZmF1bHQgcGxhdGZvcm0gZGF0YSByZW1vdmVkLCBkZXYgc2hvdWxkIGFsd2F5cyBjYXJyeSBkYXRhLiAqLwogCiAvKiBzM2MyNHh4X2kyY19pczI0NDAoKQogICoKQEAgLTEwMywyMSArOTIsNiBAQAogCXJldHVybiAhc3RyY21wKHBkZXYtPm5hbWUsICJzM2MyNDQwLWkyYyIpOwogfQogCi0KLS8qIHMzYzI0eHhfaTJjX2dldF9wbGF0Zm9ybWRhdGEKLSAqCi0gKiBnZXQgdGhlIHBsYXRmb3JtIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBkZXZpY2UsIG9yIHJldHVybgotICogdGhlIGRlZmF1bHQgaWYgdGhlcmUgaXMgbm9uZQotKi8KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKnMzYzI0eHhfaTJjX2dldF9wbGF0Zm9ybWRhdGEoc3RydWN0IGRldmljZSAqZGV2KQotewotCWlmIChkZXYtPnBsYXRmb3JtX2RhdGEgIT0gTlVMTCkKLQkJcmV0dXJuIChzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKilkZXYtPnBsYXRmb3JtX2RhdGE7Ci0KLQlyZXR1cm4gJnMzYzI0eHhfaTJjX2RlZmF1bHRfcGxhdGZvcm07Ci19Ci0KIC8qIHMzYzI0eHhfaTJjX21hc3Rlcl9jb21wbGV0ZQogICoKICAqIGNvbXBsZXRlIHRoZSBtZXNzYWdlIGFuZCB3YWtlIHVwIHRoZSBjYWxsZXIsIHVzaW5nIHRoZSBnaXZlbiByZXR1cm4gY29kZSwKQEAgLTEzMCw3ICsxMDQsNyBAQAogCiAJaTJjLT5tc2dfcHRyID0gMDsKIAlpMmMtPm1zZyA9IE5VTEw7Ci0JaTJjLT5tc2dfaWR4ICsrOworCWkyYy0+bXNnX2lkeCsrOwogCWkyYy0+bXNnX251bSA9IDA7CiAJaWYgKHJldCkKIAkJaTJjLT5tc2dfaWR4ID0gcmV0OwpAQCAtMTQxLDE5ICsxMTUsMTcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzM2MyNHh4X2kyY19kaXNhYmxlX2FjayhzdHJ1Y3QgczNjMjR4eF9pMmMgKmkyYykKIHsKIAl1bnNpZ25lZCBsb25nIHRtcDsKLQkKKwogCXRtcCA9IHJlYWRsKGkyYy0+cmVncyArIFMzQzI0MTBfSUlDQ09OKTsKIAl3cml0ZWwodG1wICYgflMzQzI0MTBfSUlDQ09OX0FDS0VOLCBpMmMtPnJlZ3MgKyBTM0MyNDEwX0lJQ0NPTik7Ci0KIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHMzYzI0eHhfaTJjX2VuYWJsZV9hY2soc3RydWN0IHMzYzI0eHhfaTJjICppMmMpCiB7CiAJdW5zaWduZWQgbG9uZyB0bXA7Ci0JCisKIAl0bXAgPSByZWFkbChpMmMtPnJlZ3MgKyBTM0MyNDEwX0lJQ0NPTik7CiAJd3JpdGVsKHRtcCB8IFMzQzI0MTBfSUlDQ09OX0FDS0VOLCBpMmMtPnJlZ3MgKyBTM0MyNDEwX0lJQ0NPTik7Ci0KIH0KIAogLyogaXJxIGVuYWJsZS9kaXNhYmxlIGZ1bmN0aW9ucyAqLwpAQCAtMTYxLDcgKzEzMyw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgczNjMjR4eF9pMmNfZGlzYWJsZV9pcnEoc3RydWN0IHMzYzI0eHhfaTJjICppMmMpCiB7CiAJdW5zaWduZWQgbG9uZyB0bXA7Ci0JCisKIAl0bXAgPSByZWFkbChpMmMtPnJlZ3MgKyBTM0MyNDEwX0lJQ0NPTik7CiAJd3JpdGVsKHRtcCAmIH5TM0MyNDEwX0lJQ0NPTl9JUlFFTiwgaTJjLT5yZWdzICsgUzNDMjQxMF9JSUNDT04pOwogfQpAQCAtMTY5LDcgKzE0MSw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgczNjMjR4eF9pMmNfZW5hYmxlX2lycShzdHJ1Y3QgczNjMjR4eF9pMmMgKmkyYykKIHsKIAl1bnNpZ25lZCBsb25nIHRtcDsKLQkKKwogCXRtcCA9IHJlYWRsKGkyYy0+cmVncyArIFMzQzI0MTBfSUlDQ09OKTsKIAl3cml0ZWwodG1wIHwgUzNDMjQxMF9JSUNDT05fSVJRRU4sIGkyYy0+cmVncyArIFMzQzI0MTBfSUlDQ09OKTsKIH0KQEAgLTE3NywxMCArMTQ5LDEwIEBACiAKIC8qIHMzYzI0eHhfaTJjX21lc3NhZ2Vfc3RhcnQKICAqCi0gKiBwdXQgdGhlIHN0YXJ0IG9mIGEgbWVzc2FnZSBvbnRvIHRoZSBidXMgCisgKiBwdXQgdGhlIHN0YXJ0IG9mIGEgbWVzc2FnZSBvbnRvIHRoZSBidXMKICovCiAKLXN0YXRpYyB2b2lkIHMzYzI0eHhfaTJjX21lc3NhZ2Vfc3RhcnQoc3RydWN0IHMzYzI0eHhfaTJjICppMmMsIAorc3RhdGljIHZvaWQgczNjMjR4eF9pMmNfbWVzc2FnZV9zdGFydChzdHJ1Y3QgczNjMjR4eF9pMmMgKmkyYywKIAkJCQkgICAgICBzdHJ1Y3QgaTJjX21zZyAqbXNnKQogewogCXVuc2lnbmVkIGludCBhZGRyID0gKG1zZy0+YWRkciAmIDB4N2YpIDw8IDE7CkBAIC0xOTksMTUgKzE3MSwxNSBAQAogCWlmIChtc2ctPmZsYWdzICYgSTJDX01fUkVWX0RJUl9BRERSKQogCQlhZGRyIF49IDE7CiAKLQkvLyB0b2RvIC0gY2hlY2sgZm9yIHdldGhlciBhY2sgd2FudGVkIG9yIG5vdAorCS8qIHRvZG8gLSBjaGVjayBmb3Igd2V0aGVyIGFjayB3YW50ZWQgb3Igbm90ICovCiAJczNjMjR4eF9pMmNfZW5hYmxlX2FjayhpMmMpOwogCiAJaWljY29uID0gcmVhZGwoaTJjLT5yZWdzICsgUzNDMjQxMF9JSUNDT04pOwogCXdyaXRlbChzdGF0LCBpMmMtPnJlZ3MgKyBTM0MyNDEwX0lJQ1NUQVQpOwotCQorCiAJZGV2X2RiZyhpMmMtPmRldiwgIlNUQVJUOiAlMDhseCB0byBJSUNTVEFULCAlMDJ4IHRvIERTXG4iLCBzdGF0LCBhZGRyKTsKIAl3cml0ZWIoYWRkciwgaTJjLT5yZWdzICsgUzNDMjQxMF9JSUNEUyk7Ci0JCisKIAkvKiBkZWxheSBoZXJlIHRvIGVuc3VyZSB0aGUgZGF0YSBieXRlIGhhcyBnb3R0ZW4gb250byB0aGUgYnVzCiAJICogYmVmb3JlIHRoZSB0cmFuc2FjdGlvbiBpcyBzdGFydGVkICovCiAKQEAgLTIxNSw4ICsxODcsOCBAQAogCiAJZGV2X2RiZyhpMmMtPmRldiwgImlpY2NvbiwgJTA4bHhcbiIsIGlpY2Nvbik7CiAJd3JpdGVsKGlpY2NvbiwgaTJjLT5yZWdzICsgUzNDMjQxMF9JSUNDT04pOwotCQotCXN0YXQgfD0gIFMzQzI0MTBfSUlDU1RBVF9TVEFSVDsKKworCXN0YXQgfD0gUzNDMjQxMF9JSUNTVEFUX1NUQVJUOwogCXdyaXRlbChzdGF0LCBpMmMtPnJlZ3MgKyBTM0MyNDEwX0lJQ1NUQVQpOwogfQogCkBAIC0yMjcsMTEgKzE5OSwxMSBAQAogCWRldl9kYmcoaTJjLT5kZXYsICJTVE9QXG4iKTsKIAogCS8qIHN0b3AgdGhlIHRyYW5zZmVyICovCi0JaWljc3RhdCAmPSB+IFMzQzI0MTBfSUlDU1RBVF9TVEFSVDsKKwlpaWNzdGF0ICY9IH5TM0MyNDEwX0lJQ1NUQVRfU1RBUlQ7CiAJd3JpdGVsKGlpY3N0YXQsIGkyYy0+cmVncyArIFMzQzI0MTBfSUlDU1RBVCk7Ci0JCisKIAlpMmMtPnN0YXRlID0gU1RBVEVfU1RPUDsKLQkKKwogCXMzYzI0eHhfaTJjX21hc3Rlcl9jb21wbGV0ZShpMmMsIHJldCk7CiAJczNjMjR4eF9pMmNfZGlzYWJsZV9pcnEoaTJjKTsKIH0KQEAgLTI0MSw3ICsyMTMsNyBAQAogCiAvKiBpc19sYXN0bXNnKCkKICAqCi0gKiByZXR1cm5zIFRSVUUgaWYgdGhlIGN1cnJlbnQgbWVzc2FnZSBpcyB0aGUgbGFzdCBpbiB0aGUgc2V0IAorICogcmV0dXJucyBUUlVFIGlmIHRoZSBjdXJyZW50IG1lc3NhZ2UgaXMgdGhlIGxhc3QgaW4gdGhlIHNldAogKi8KIAogc3RhdGljIGlubGluZSBpbnQgaXNfbGFzdG1zZyhzdHJ1Y3QgczNjMjR4eF9pMmMgKmkyYykKQEAgLTI4OSwxNCArMjYxLDE0IEBACiAKIAljYXNlIFNUQVRFX1NUT1A6CiAJCWRldl9lcnIoaTJjLT5kZXYsICIlczogY2FsbGVkIGluIFNUQVRFX1NUT1BcbiIsIF9fZnVuY19fKTsKLQkJczNjMjR4eF9pMmNfZGlzYWJsZV9pcnEoaTJjKTsJCQorCQlzM2MyNHh4X2kyY19kaXNhYmxlX2lycShpMmMpOwogCQlnb3RvIG91dF9hY2s7CiAKIAljYXNlIFNUQVRFX1NUQVJUOgogCQkvKiBsYXN0IHRoaW5nIHdlIGRpZCB3YXMgc2VuZCBhIHN0YXJ0IGNvbmRpdGlvbiBvbiB0aGUKIAkJICogYnVzLCBvciBzdGFydGVkIGEgbmV3IGkyYyBtZXNzYWdlCiAJCSAqLwotCQkKKwogCQlpZiAoaWljc3RhdCAmIFMzQzI0MTBfSUlDU1RBVF9MQVNUQklUICYmCiAJCSAgICAhKGkyYy0+bXNnLT5mbGFncyAmIEkyQ19NX0lHTk9SRV9OQUspKSB7CiAJCQkvKiBhY2sgd2FzIG5vdCByZWNlaXZlZC4uLiAqLwpAQCAtMzIyLDcgKzI5NCw3IEBACiAJCWlmIChpMmMtPnN0YXRlID09IFNUQVRFX1JFQUQpCiAJCQlnb3RvIHByZXBhcmVfcmVhZDsKIAotCQkvKiBmYWxsIHRocm91Z2ggdG8gdGhlIHdyaXRlIHN0YXRlLCBhcyB3ZSB3aWxsIG5lZWQgdG8gCisJCS8qIGZhbGwgdGhyb3VnaCB0byB0aGUgd3JpdGUgc3RhdGUsIGFzIHdlIHdpbGwgbmVlZCB0bwogCQkgKiBzZW5kIGEgYnl0ZSBhcyB3ZWxsICovCiAKIAljYXNlIFNUQVRFX1dSSVRFOgpAQCAtMzM5LDcgKzMxMSw3IEBACiAJCQl9CiAJCX0KIAotCXJldHJ5X3dyaXRlOgorIHJldHJ5X3dyaXRlOgogCiAJCWlmICghaXNfbXNnZW5kKGkyYykpIHsKIAkJCWJ5dGUgPSBpMmMtPm1zZy0+YnVmW2kyYy0+bXNnX3B0cisrXTsKQEAgLTM1OSw5ICszMzEsOSBAQAogCQkJZGV2X2RiZyhpMmMtPmRldiwgIldSSVRFOiBOZXh0IE1lc3NhZ2VcbiIpOwogCiAJCQlpMmMtPm1zZ19wdHIgPSAwOwotCQkJaTJjLT5tc2dfaWR4ICsrOworCQkJaTJjLT5tc2dfaWR4Kys7CiAJCQlpMmMtPm1zZysrOwotCQkJCisKIAkJCS8qIGNoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGRvIGFub3RoZXIgbWVzc2FnZSAqLwogCQkJaWYgKGkyYy0+bXNnLT5mbGFncyAmIEkyQ19NX05PU1RBUlQpIHsKIApAQCAtMzc1LDcgKzM0Nyw2IEBACiAKIAkJCQlnb3RvIHJldHJ5X3dyaXRlOwogCQkJfSBlbHNlIHsKLQkJCQogCQkJCS8qIHNlbmQgdGhlIG5ldyBzdGFydCAqLwogCQkJCXMzYzI0eHhfaTJjX21lc3NhZ2Vfc3RhcnQoaTJjLCBpMmMtPm1zZyk7CiAJCQkJaTJjLT5zdGF0ZSA9IFNUQVRFX1NUQVJUOwpAQCAtMzg5LDcgKzM2MCw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBTVEFURV9SRUFEOgotCQkvKiB3ZSBoYXZlIGEgYnl0ZSBvZiBkYXRhIGluIHRoZSBkYXRhIHJlZ2lzdGVyLCBkbyAKKwkJLyogd2UgaGF2ZSBhIGJ5dGUgb2YgZGF0YSBpbiB0aGUgZGF0YSByZWdpc3RlciwgZG8KIAkJICogc29tZXRoaW5nIHdpdGggaXQsIGFuZCB0aGVuIHdvcmsgb3V0IHdldGhlciB3ZSBhcmUKIAkJICogZ29pbmcgdG8gZG8gYW55IG1vcmUgcmVhZC93cml0ZQogCQkgKi8KQEAgLTM5NywxMyArMzY4LDEzIEBACiAJCWJ5dGUgPSByZWFkYihpMmMtPnJlZ3MgKyBTM0MyNDEwX0lJQ0RTKTsKIAkJaTJjLT5tc2ctPmJ1ZltpMmMtPm1zZ19wdHIrK10gPSBieXRlOwogCi0JcHJlcGFyZV9yZWFkOgorIHByZXBhcmVfcmVhZDoKIAkJaWYgKGlzX21zZ2xhc3QoaTJjKSkgewogCQkJLyogbGFzdCBieXRlIG9mIGJ1ZmZlciAqLwogCiAJCQlpZiAoaXNfbGFzdG1zZyhpMmMpKQogCQkJCXMzYzI0eHhfaTJjX2Rpc2FibGVfYWNrKGkyYyk7Ci0JCQkKKwogCQl9IGVsc2UgaWYgKGlzX21zZ2VuZChpMmMpKSB7CiAJCQkvKiBvaywgd2UndmUgcmVhZCB0aGUgZW50aXJlIGJ1ZmZlciwgc2VlIGlmIHRoZXJlCiAJCQkgKiBpcyBhbnl0aGluZyBlbHNlIHdlIG5lZWQgdG8gZG8gKi8KQEAgLTQyOSw3ICs0MDAsNyBAQAogCS8qIGFja25vd2xlZ2RlIHRoZSBJUlEgYW5kIGdldCBiYWNrIG9uIHdpdGggdGhlIHdvcmsgKi8KIAogIG91dF9hY2s6Ci0JdG1wID0gcmVhZGwoaTJjLT5yZWdzICsgUzNDMjQxMF9JSUNDT04pOwkKKwl0bXAgPSByZWFkbChpMmMtPnJlZ3MgKyBTM0MyNDEwX0lJQ0NPTik7CiAJdG1wICY9IH5TM0MyNDEwX0lJQ0NPTl9JUlFQRU5EOwogCXdyaXRlbCh0bXAsIGkyYy0+cmVncyArIFMzQzI0MTBfSUlDQ09OKTsKICBvdXQ6CkBAIC00NTAsMTkgKzQyMSwxOSBAQAogCXN0YXR1cyA9IHJlYWRsKGkyYy0+cmVncyArIFMzQzI0MTBfSUlDU1RBVCk7CiAKIAlpZiAoc3RhdHVzICYgUzNDMjQxMF9JSUNTVEFUX0FSQklUUikgewotCQkvLyBkZWFsIHdpdGggYXJiaXRyYXRpb24gbG9zcworCQkvKiBkZWFsIHdpdGggYXJiaXRyYXRpb24gbG9zcyAqLwogCQlkZXZfZXJyKGkyYy0+ZGV2LCAiZGVhbCB3aXRoIGFyYml0cmF0aW9uIGxvc3NcbiIpOwogCX0KIAogCWlmIChpMmMtPnN0YXRlID09IFNUQVRFX0lETEUpIHsKIAkJZGV2X2RiZyhpMmMtPmRldiwgIklSUTogZXJyb3IgaTJjLT5zdGF0ZSA9PSBJRExFXG4iKTsKIAotCQl0bXAgPSByZWFkbChpMmMtPnJlZ3MgKyBTM0MyNDEwX0lJQ0NPTik7CQorCQl0bXAgPSByZWFkbChpMmMtPnJlZ3MgKyBTM0MyNDEwX0lJQ0NPTik7CiAJCXRtcCAmPSB+UzNDMjQxMF9JSUNDT05fSVJRUEVORDsKIAkJd3JpdGVsKHRtcCwgaTJjLT5yZWdzICsgIFMzQzI0MTBfSUlDQ09OKTsKIAkJZ290byBvdXQ7CiAJfQotCQorCiAJLyogcHJldHR5IG11Y2ggdGhpcyBsZWF2ZXMgdXMgd2l0aCB0aGUgZmFjdCB0aGF0IHdlJ3ZlCiAJICogdHJhbnNtaXR0ZWQgb3IgcmVjZWl2ZWQgd2hhdGV2ZXIgYnl0ZSB3ZSBsYXN0IHNlbnQgKi8KIApAQCAtNDg1LDE2ICs0NTYsMTMgQEAKIAogCXdoaWxlICh0aW1lb3V0LS0gPiAwKSB7CiAJCWlpY3N0YXQgPSByZWFkbChpMmMtPnJlZ3MgKyBTM0MyNDEwX0lJQ1NUQVQpOwotCQkKKwogCQlpZiAoIShpaWNzdGF0ICYgUzNDMjQxMF9JSUNTVEFUX0JVU0JVU1kpKQogCQkJcmV0dXJuIDA7CiAKIAkJbXNsZWVwKDEpOwogCX0KIAotCWRldl9kYmcoaTJjLT5kZXYsICJ0aW1lb3V0OiBHUEVEQVQgaXMgJTA4eFxuIiwKLQkJX19yYXdfcmVhZGwoUzNDMjQxMF9HUEVEQVQpKTsKLQogCXJldHVybiAtRVRJTUVET1VUOwogfQogCkBAIC01MDMsNyArNDcxLDggQEAKICAqIHRoaXMgc3RhcnRzIGFuIGkyYyB0cmFuc2ZlcgogKi8KIAotc3RhdGljIGludCBzM2MyNHh4X2kyY19kb3hmZXIoc3RydWN0IHMzYzI0eHhfaTJjICppMmMsIHN0cnVjdCBpMmNfbXNnICptc2dzLCBpbnQgbnVtKQorc3RhdGljIGludCBzM2MyNHh4X2kyY19kb3hmZXIoc3RydWN0IHMzYzI0eHhfaTJjICppMmMsCisJCQkgICAgICBzdHJ1Y3QgaTJjX21zZyAqbXNncywgaW50IG51bSkKIHsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CiAJaW50IHJldDsKQEAgLTUyOSwxMiArNDk4LDEyIEBACiAJczNjMjR4eF9pMmNfZW5hYmxlX2lycShpMmMpOwogCXMzYzI0eHhfaTJjX21lc3NhZ2Vfc3RhcnQoaTJjLCBtc2dzKTsKIAlzcGluX3VubG9ja19pcnEoJmkyYy0+bG9jayk7Ci0JCisKIAl0aW1lb3V0ID0gd2FpdF9ldmVudF90aW1lb3V0KGkyYy0+d2FpdCwgaTJjLT5tc2dfbnVtID09IDAsIEhaICogNSk7CiAKIAlyZXQgPSBpMmMtPm1zZ19pZHg7CiAKLQkvKiBoYXZpbmcgdGhlc2UgbmV4dCB0d28gYXMgZGV2X2VycigpIG1ha2VzIGxpZmUgdmVyeSAKKwkvKiBoYXZpbmcgdGhlc2UgbmV4dCB0d28gYXMgZGV2X2VycigpIG1ha2VzIGxpZmUgdmVyeQogCSAqIG5vaXN5IHdoZW4gZG9pbmcgYW4gaTJjZGV0ZWN0ICovCiAKIAlpZiAodGltZW91dCA9PSAwKQpAQCAtNTkxLDE5ICs1NjAsNiBAQAogCS5mdW5jdGlvbmFsaXR5CQk9IHMzYzI0eHhfaTJjX2Z1bmMsCiB9OwogCi1zdGF0aWMgc3RydWN0IHMzYzI0eHhfaTJjIHMzYzI0eHhfaTJjID0gewotCS5sb2NrCQk9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKHMzYzI0eHhfaTJjLmxvY2spLAotCS53YWl0CQk9IF9fV0FJVF9RVUVVRV9IRUFEX0lOSVRJQUxJWkVSKHMzYzI0eHhfaTJjLndhaXQpLAotCS50eF9zZXR1cAk9IDUwLAotCS5hZGFwCQk9IHsKLQkJLm5hbWUJCQk9ICJzM2MyNDEwLWkyYyIsCi0JCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCi0JCS5hbGdvCQkJPSAmczNjMjR4eF9pMmNfYWxnb3JpdGhtLAotCQkucmV0cmllcwkJPSAyLAotCQkuY2xhc3MJCQk9IEkyQ19DTEFTU19IV01PTiB8IEkyQ19DTEFTU19TUEQsCi0JfSwKLX07Ci0KIC8qIHMzYzI0eHhfaTJjX2NhbGNkaXZpc29yCiAgKgogICogcmV0dXJuIHRoZSBkaXZpc29yIHNldHRpbmdzIGZvciBhIGdpdmVuIGZyZXF1ZW5jeQpAQCAtNjQzLDcgKzU5OSw3IEBACiB7CiAJaW50IGRpZmYgPSBmcmVxIC0gd2FudGVkOwogCi0JcmV0dXJuIChkaWZmID49IC0yICYmIGRpZmYgPD0gMik7CisJcmV0dXJuIGRpZmYgPj0gLTIgJiYgZGlmZiA8PSAyOwogfQogCiAvKiBzM2MyNHh4X2kyY19jbG9ja3JhdGUKQEAgLTY1NSw3ICs2MTEsNyBAQAogCiBzdGF0aWMgaW50IHMzYzI0eHhfaTJjX2Nsb2NrcmF0ZShzdHJ1Y3QgczNjMjR4eF9pMmMgKmkyYywgdW5zaWduZWQgaW50ICpnb3QpCiB7Ci0Jc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1faTJjICpwZGF0YTsKKwlzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKnBkYXRhID0gaTJjLT5kZXYtPnBsYXRmb3JtX2RhdGE7CiAJdW5zaWduZWQgbG9uZyBjbGtpbiA9IGNsa19nZXRfcmF0ZShpMmMtPmNsayk7CiAJdW5zaWduZWQgaW50IGRpdnMsIGRpdjE7CiAJdTMyIGlpY2NvbjsKQEAgLTY2MywxMCArNjE5LDggQEAKIAlpbnQgc3RhcnQsIGVuZDsKIAogCWkyYy0+Y2xrcmF0ZSA9IGNsa2luOwotCi0JcGRhdGEgPSBzM2MyNHh4X2kyY19nZXRfcGxhdGZvcm1kYXRhKGkyYy0+YWRhcC5kZXYucGFyZW50KTsKIAljbGtpbiAvPSAxMDAwOwkJLyogY2xraW4gbm93IGluIEtIeiAqLwotICAgICAKKwogCWRldl9kYmcoaTJjLT5kZXYsICJwZGF0YSAlcCwgZnJlcSAlbHUgJWx1Li4lbHVcbiIsCiAJCSBwZGF0YSwgcGRhdGEtPmJ1c19mcmVxLCBwZGF0YS0+bWluX2ZyZXEsIHBkYXRhLT5tYXhfZnJlcSk7CiAKQEAgLTc3NCw3ICs3MjgsNyBAQAogCiAvKiBzM2MyNHh4X2kyY19pbml0CiAgKgotICogaW5pdGlhbGlzZSB0aGUgY29udHJvbGxlciwgc2V0IHRoZSBJTyBsaW5lcyBhbmQgZnJlcXVlbmN5IAorICogaW5pdGlhbGlzZSB0aGUgY29udHJvbGxlciwgc2V0IHRoZSBJTyBsaW5lcyBhbmQgZnJlcXVlbmN5CiAqLwogCiBzdGF0aWMgaW50IHMzYzI0eHhfaTJjX2luaXQoc3RydWN0IHMzYzI0eHhfaTJjICppMmMpCkBAIC03ODUsMTUgKzczOSwxNSBAQAogCiAJLyogZ2V0IHRoZSBwbGFmcm9tIGRhdGEgKi8KIAotCXBkYXRhID0gczNjMjR4eF9pMmNfZ2V0X3BsYXRmb3JtZGF0YShpMmMtPmFkYXAuZGV2LnBhcmVudCk7CisJcGRhdGEgPSBpMmMtPmRldi0+cGxhdGZvcm1fZGF0YTsKIAogCS8qIGluaXRpdGFsaXNlIHRoZSBncGlvICovCiAKLQlzM2MyNDEwX2dwaW9fY2ZncGluKFMzQzI0MTBfR1BFMTUsIFMzQzI0MTBfR1BFMTVfSUlDU0RBKTsKLQlzM2MyNDEwX2dwaW9fY2ZncGluKFMzQzI0MTBfR1BFMTQsIFMzQzI0MTBfR1BFMTRfSUlDU0NMKTsKKwlpZiAocGRhdGEtPmNmZ19ncGlvKQorCQlwZGF0YS0+Y2ZnX2dwaW8odG9fcGxhdGZvcm1fZGV2aWNlKGkyYy0+ZGV2KSk7CiAKIAkvKiB3cml0ZSBzbGF2ZSBhZGRyZXNzICovCi0JCisKIAl3cml0ZWIocGRhdGEtPnNsYXZlX2FkZHIsIGkyYy0+cmVncyArIFMzQzI0MTBfSUlDQUREKTsKIAogCWRldl9pbmZvKGkyYy0+ZGV2LCAic2xhdmUgYWRkcmVzcyAweCUwMnhcbiIsIHBkYXRhLT5zbGF2ZV9hZGRyKTsKQEAgLTgzMSwxMiArNzg1LDMyIEBACiAKIHN0YXRpYyBpbnQgczNjMjR4eF9pMmNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3QgczNjMjR4eF9pMmMgKmkyYyA9ICZzM2MyNHh4X2kyYzsKKwlzdHJ1Y3QgczNjMjR4eF9pMmMgKmkyYzsKIAlzdHJ1Y3QgczNjMjQxMF9wbGF0Zm9ybV9pMmMgKnBkYXRhOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCWludCByZXQ7CiAKLQlwZGF0YSA9IHMzYzI0eHhfaTJjX2dldF9wbGF0Zm9ybWRhdGEoJnBkZXYtPmRldik7CisJcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpZiAoIXBkYXRhKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIHBsYXRmb3JtIGRhdGFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpMmMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgczNjMjR4eF9pMmMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWkyYykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBtZW1vcnkgZm9yIHN0YXRlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc3RybGNweShpMmMtPmFkYXAubmFtZSwgInMzYzI0MTAtaTJjIiwgc2l6ZW9mKGkyYy0+YWRhcC5uYW1lKSk7CisJaTJjLT5hZGFwLm93bmVyICAgPSBUSElTX01PRFVMRTsKKwlpMmMtPmFkYXAuYWxnbyAgICA9ICZzM2MyNHh4X2kyY19hbGdvcml0aG07CisJaTJjLT5hZGFwLnJldHJpZXMgPSAyOworCWkyYy0+YWRhcC5jbGFzcyAgID0gSTJDX0NMQVNTX0hXTU9OIHwgSTJDX0NMQVNTX1NQRDsKKwlpMmMtPnR4X3NldHVwICAgICA9IDUwOworCisJc3Bpbl9sb2NrX2luaXQoJmkyYy0+bG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaTJjLT53YWl0KTsKIAogCS8qIGZpbmQgdGhlIGNsb2NrIGFuZCBlbmFibGUgaXQgKi8KIApAQCAtODc4LDcgKzg1Miw4IEBACiAJCWdvdG8gZXJyX2lvYXJlYTsKIAl9CiAKLQlkZXZfZGJnKCZwZGV2LT5kZXYsICJyZWdpc3RlcnMgJXAgKCVwLCAlcClcbiIsIGkyYy0+cmVncywgaTJjLT5pb2FyZWEsIHJlcyk7CisJZGV2X2RiZygmcGRldi0+ZGV2LCAicmVnaXN0ZXJzICVwICglcCwgJXApXG4iLAorCQlpMmMtPnJlZ3MsIGkyYy0+aW9hcmVhLCByZXMpOwogCiAJLyogc2V0dXAgaW5mbyBibG9jayBmb3IgdGhlIGkyYyBjb3JlICovCiAKQEAgLTg5MiwyOSArODY3LDIzIEBACiAJCWdvdG8gZXJyX2lvbWFwOwogCiAJLyogZmluZCB0aGUgSVJRIGZvciB0aGlzIHVuaXQgKG5vdGUsIHRoaXMgcmVsaWVzIG9uIHRoZSBpbml0IGNhbGwgdG8KLQkgKiBlbnN1cmUgbm8gY3VycmVudCBJUlFzIHBlbmRpbmcgCisJICogZW5zdXJlIG5vIGN1cnJlbnQgSVJRcyBwZW5kaW5nCiAJICovCiAKLQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JUlEsIDApOwotCWlmIChyZXMgPT0gTlVMTCkgeworCWkyYy0+aXJxID0gcmV0ID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAocmV0IDw9IDApIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IGZpbmQgSVJRXG4iKTsKLQkJcmV0ID0gLUVOT0VOVDsKIAkJZ290byBlcnJfaW9tYXA7CiAJfQogCi0JcmV0ID0gcmVxdWVzdF9pcnEocmVzLT5zdGFydCwgczNjMjR4eF9pMmNfaXJxLCBJUlFGX0RJU0FCTEVELAotCQkJICBwZGV2LT5uYW1lLCBpMmMpOworCXJldCA9IHJlcXVlc3RfaXJxKGkyYy0+aXJxLCBzM2MyNHh4X2kyY19pcnEsIElSUUZfRElTQUJMRUQsCisJCQkgIGRldl9uYW1lKCZwZGV2LT5kZXYpLCBpMmMpOwogCiAJaWYgKHJldCAhPSAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBjbGFpbSBJUlFcbiIpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgY2xhaW0gSVJRICVkXG4iLCBpMmMtPmlycSk7CiAJCWdvdG8gZXJyX2lvbWFwOwogCX0KIAotCWkyYy0+aXJxID0gcmVzOwotCQkKLQlkZXZfZGJnKCZwZGV2LT5kZXYsICJpcnEgcmVzb3VyY2UgJXAgKCVsdSlcbiIsIHJlcywKLQkJKHVuc2lnbmVkIGxvbmcpcmVzLT5zdGFydCk7Ci0KIAlyZXQgPSBzM2MyNHh4X2kyY19yZWdpc3Rlcl9jcHVmcmVxKGkyYyk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIGNwdWZyZXEgbm90aWZpZXJcbiIpOwpAQCAtOTM3LDE0ICs5MDYsMTQgQEAKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGkyYyk7CiAKLQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiJXM6IFMzQyBJMkMgYWRhcHRlclxuIiwgaTJjLT5hZGFwLmRldi5idXNfaWQpOworCWRldl9pbmZvKCZwZGV2LT5kZXYsICIlczogUzNDIEkyQyBhZGFwdGVyXG4iLCBkZXZfbmFtZSgmaTJjLT5hZGFwLmRldikpOwogCXJldHVybiAwOwogCiAgZXJyX2NwdWZyZXE6CiAJczNjMjR4eF9pMmNfZGVyZWdpc3Rlcl9jcHVmcmVxKGkyYyk7CiAKICBlcnJfaXJxOgotCWZyZWVfaXJxKGkyYy0+aXJxLT5zdGFydCwgaTJjKTsKKwlmcmVlX2lycShpMmMtPmlycSwgaTJjKTsKIAogIGVycl9pb21hcDoKIAlpb3VubWFwKGkyYy0+cmVncyk7CkBAIC05NTgsNiArOTI3LDcgQEAKIAljbGtfcHV0KGkyYy0+Y2xrKTsKIAogIGVycl9ub2NsazoKKwlrZnJlZShpMmMpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTk3Myw3ICs5NDMsNyBAQAogCXMzYzI0eHhfaTJjX2RlcmVnaXN0ZXJfY3B1ZnJlcShpMmMpOwogCiAJaTJjX2RlbF9hZGFwdGVyKCZpMmMtPmFkYXApOwotCWZyZWVfaXJxKGkyYy0+aXJxLT5zdGFydCwgaTJjKTsKKwlmcmVlX2lycShpMmMtPmlycSwgaTJjKTsKIAogCWNsa19kaXNhYmxlKGkyYy0+Y2xrKTsKIAljbGtfcHV0KGkyYy0+Y2xrKTsKQEAgLTk4Miw2ICs5NTIsNyBAQAogCiAJcmVsZWFzZV9yZXNvdXJjZShpMmMtPmlvYXJlYSk7CiAJa2ZyZWUoaTJjLT5pb2FyZWEpOworCWtmcmVlKGkyYyk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2g3NzYwLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNoNzc2MC5jCmluZGV4IDVlMGUyNTQuLmJhYTI4YjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2g3NzYwLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaDc3NjAuYwpAQCAtNDc1LDcgKzQ3NSw3IEBACiAKIAlpZC0+YWRhcC5uciA9IHBkZXYtPmlkOwogCWlkLT5hZGFwLmFsZ28gPSAmc2g3NzYwX2kyY19hbGdvOwotCWlkLT5hZGFwLmNsYXNzID0gSTJDX0NMQVNTX0FMTDsKKwlpZC0+YWRhcC5jbGFzcyA9IEkyQ19DTEFTU19IV01PTiB8IEkyQ19DTEFTU19TUEQ7CiAJaWQtPmFkYXAucmV0cmllcyA9IDM7CiAJaWQtPmFkYXAuYWxnb19kYXRhID0gaWQ7CiAJaWQtPmFkYXAuZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNoX21vYmlsZS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaF9tb2JpbGUuYwppbmRleCA2YzNkNjBiLi4xYzAxMDgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNoX21vYmlsZS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2hfbW9iaWxlLmMKQEAgLTUwMCw3ICs1MDAsNyBAQAogCXdoaWxlICgocmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKGRldiwgSU9SRVNPVVJDRV9JUlEsIGspKSkgewogCQlmb3IgKG4gPSByZXMtPnN0YXJ0OyBob29rICYmIG4gPD0gcmVzLT5lbmQ7IG4rKykgewogCQkJaWYgKHJlcXVlc3RfaXJxKG4sIHNoX21vYmlsZV9pMmNfaXNyLCBJUlFGX0RJU0FCTEVELAotCQkJCQlkZXYtPmRldi5idXNfaWQsIGRldikpCisJCQkJCWRldl9uYW1lKCZkZXYtPmRldiksIGRldikpCiAJCQkJZ290byByb2xsYmFjazsKIAkJfQogCQlrKys7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNpczU1OTUuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2lzNTU5NS5jCmluZGV4IGRmYzJkNWUuLjhjZTJkYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2lzNTU5NS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2lzNTU5NS5jCkBAIC0zODksOCArMzg5LDggQEAKIAkvKiBzZXQgdXAgdGhlIHN5c2ZzIGxpbmthZ2UgdG8gb3VyIHBhcmVudCBkZXZpY2UgKi8KIAlzaXM1NTk1X2FkYXB0ZXIuZGV2LnBhcmVudCA9ICZkZXYtPmRldjsKIAotCXNwcmludGYoc2lzNTU5NV9hZGFwdGVyLm5hbWUsICJTTUJ1cyBTSVM1NTk1IGFkYXB0ZXIgYXQgJTA0eCIsCi0JCXNpczU1OTVfYmFzZSArIFNNQl9JTkRFWCk7CisJc25wcmludGYoc2lzNTU5NV9hZGFwdGVyLm5hbWUsIHNpemVvZihzaXM1NTk1X2FkYXB0ZXIubmFtZSksCisJCSAiU01CdXMgU0lTNTU5NSBhZGFwdGVyIGF0ICUwNHgiLCBzaXM1NTk1X2Jhc2UgKyBTTUJfSU5ERVgpOwogCWVyciA9IGkyY19hZGRfYWRhcHRlcigmc2lzNTU5NV9hZGFwdGVyKTsKIAlpZiAoZXJyKSB7CiAJCXJlbGVhc2VfcmVnaW9uKHNpczU1OTVfYmFzZSArIFNNQl9JTkRFWCwgMik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNpczYzMC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaXM2MzAuYwppbmRleCBlN2M0Yjc5Li45YzljMDE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNpczYzMC5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2lzNjMwLmMKQEAgLTQ4Nyw4ICs0ODcsOCBAQAogCS8qIHNldCB1cCB0aGUgc3lzZnMgbGlua2FnZSB0byBvdXIgcGFyZW50IGRldmljZSAqLwogCXNpczYzMF9hZGFwdGVyLmRldi5wYXJlbnQgPSAmZGV2LT5kZXY7CiAKLQlzcHJpbnRmKHNpczYzMF9hZGFwdGVyLm5hbWUsICJTTUJ1cyBTSVM2MzAgYWRhcHRlciBhdCAlMDR4IiwKLQkJYWNwaV9iYXNlICsgU01CX1NUUyk7CisJc25wcmludGYoc2lzNjMwX2FkYXB0ZXIubmFtZSwgc2l6ZW9mKHNpczYzMF9hZGFwdGVyLm5hbWUpLAorCQkgIlNNQnVzIFNJUzYzMCBhZGFwdGVyIGF0ICUwNHgiLCBhY3BpX2Jhc2UgKyBTTUJfU1RTKTsKIAogCXJldHVybiBpMmNfYWRkX2FkYXB0ZXIoJnNpczYzMF9hZGFwdGVyKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL0tjb25maWcgYi9kcml2ZXJzL2kyYy9jaGlwcy9LY29uZmlnCmluZGV4IDRjMzU3MDIuLjU5YzNkMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2NoaXBzL0tjb25maWcKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvS2NvbmZpZwpAQCAtMTE0LDMxICsxMTQsNiBAQAogCSAgVGhlc2UgZGV2aWNlcyBhcmUgaGFyZCB0byBkZXRlY3QgYW5kIHJhcmVseSBmb3VuZCBvbiBtYWluc3RyZWFtCiAJICBoYXJkd2FyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKLWNvbmZpZyBJU1AxMzAxX09NQVAKLQl0cmlzdGF0ZSAiUGhpbGlwcyBJU1AxMzAxIHdpdGggT01BUCBPVEciCi0JZGVwZW5kcyBvbiBBUkNIX09NQVBfT1RHCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBQaGlsaXBzIElTUDEzMDEKLQkgIFVTQi1Pbi1UaGUtR28gdHJhbnNjZWl2ZXIgd29ya2luZyB3aXRoIHRoZSBPTUFQIE9URyBjb250cm9sbGVyLgotCSAgVGhlIElTUDEzMDEgaXMgdXNlZCBpbiBwcm9kdWN0cyBpbmNsdWRpbmcgSDIgYW5kIEgzIGRldmVsb3BtZW50Ci0JICBib2FyZHMgZm9yIFRleGFzIEluc3RydW1lbnRzIE9NQVAgcHJvY2Vzc29ycy4KLQkgIAotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgaXNwMTMwMV9vbWFwLgotCi1jb25maWcgVFBTNjUwMTAKLQl0cmlzdGF0ZSAiVFBTNjUwMXggUG93ZXIgTWFuYWdlbWVudCBjaGlwcyIKLQlkZXBlbmRzIG9uIEdQSU9MSUIKLQlkZWZhdWx0IHkgaWYgTUFDSF9PTUFQX0gyIHx8IE1BQ0hfT01BUF9IMyB8fCBNQUNIX09NQVBfT1NLCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBUUFM2NTAxeCBzZXJpZXMgb2YKLQkgIFBvd2VyIE1hbmFnZW1lbnQgY2hpcHMuICBUaGVzZSBpbmNsdWRlIHZvbHRhZ2UgcmVndWxhdG9ycywKLQkgIGxpdGhpdW0gaW9uL3BvbHltZXIgYmF0dGVyeSBjaGFyZ2luZywgYW5kIG90aGVyIGZlYXR1cmVzIHRoYXQKLQkgIGFyZSBvZnRlbiB1c2VkIGluIHBvcnRhYmxlIGRldmljZXMgbGlrZSBjZWxsIHBob25lcyBhbmQgY2FtZXJhcy4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgdHBzNjUwMTAuCi0KIGNvbmZpZyBTRU5TT1JTX01BWDY4NzUKIAl0cmlzdGF0ZSAiTWF4aW0gTUFYNjg3NSBQb3dlciBzdXBwbHkgc3VwZXJ2aXNvciIKIAlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTApAQCAtMTY0LDE2ICsxMzksNiBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgdHNsMjU1MC4KIAotY29uZmlnIE1FTkVMQVVTCi0JYm9vbCAiVFdMOTIzMzAvTWVuZWxhdXMgUE0gY2hpcCIKLQlkZXBlbmRzIG9uIEkyQz15ICYmIEFSQ0hfT01BUDI0WFgKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIFRleGFzIEluc3RydW1lbnRzCi0JICBUV0w5MjMzMC9NZW5lbGF1cyBQb3dlciBNYW5hZ2VtZW50IGNoaXAuIFRoaXMgaW5jbHVkZSB2b2x0YWdlCi0JICByZWd1bGF0b3JzLCBEdWFsIHNsb3QgbWVtb3J5IGNhcmQgdHJhbmNlaXZlcnMsIHJlYWwtdGltZSBjbG9jawotCSAgYW5kIG90aGVyIGZlYXR1cmVzIHRoYXQgYXJlIG9mdGVuIHVzZWQgaW4gcG9ydGFibGUgZGV2aWNlcyBsaWtlCi0JICBjZWxsIHBob25lcyBhbmQgUERBcy4KLQogY29uZmlnIE1DVV9NUEM4MzQ5RU1JVFgKIAl0cmlzdGF0ZSAiTVBDODM0OUUtbUlUWCBNQ1UgZHJpdmVyIgogCWRlcGVuZHMgb24gSTJDICYmIFBQQ184M3h4CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9NYWtlZmlsZSBiL2RyaXZlcnMvaTJjL2NoaXBzL01ha2VmaWxlCmluZGV4IDIzZDJhMzEuLjgzYWNjYWFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9jaGlwcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9NYWtlZmlsZQpAQCAtMTgsOSArMTgsNiBAQAogb2JqLSQoQ09ORklHX1NFTlNPUlNfUENGODU3NCkJKz0gcGNmODU3NC5vCiBvYmotJChDT05GSUdfUENGODU3NSkJCSs9IHBjZjg1NzUubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfUENGODU5MSkJKz0gcGNmODU5MS5vCi1vYmotJChDT05GSUdfSVNQMTMwMV9PTUFQKQkrPSBpc3AxMzAxX29tYXAubwotb2JqLSQoQ09ORklHX1RQUzY1MDEwKQkJKz0gdHBzNjUwMTAubwotb2JqLSQoQ09ORklHX01FTkVMQVVTKQkJKz0gbWVuZWxhdXMubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfVFNMMjU1MCkJKz0gdHNsMjU1MC5vCiBvYmotJChDT05GSUdfTUNVX01QQzgzNDlFTUlUWCkJKz0gbWN1X21wYzgzNDllbWl0eC5vCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2kyYy1jb3JlLmMgYi9kcml2ZXJzL2kyYy9pMmMtY29yZS5jCmluZGV4IGM2YTYzZjQuLmIxYzlhYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2kyYy1jb3JlLmMKKysrIGIvZHJpdmVycy9pMmMvaTJjLWNvcmUuYwpAQCAtNDU5LDcgKzQ1OSw3IEBACiAJCXByX2RlYnVnKCJJMkMgYWRhcHRlciBkcml2ZXIgWyVzXSBmb3Jnb3QgdG8gc3BlY2lmeSAiCiAJCQkgInBoeXNpY2FsIGRldmljZVxuIiwgYWRhcC0+bmFtZSk7CiAJfQotCXNwcmludGYoYWRhcC0+ZGV2LmJ1c19pZCwgImkyYy0lZCIsIGFkYXAtPm5yKTsKKwlkZXZfc2V0X25hbWUoJmFkYXAtPmRldiwgImkyYy0lZCIsIGFkYXAtPm5yKTsKIAlhZGFwLT5kZXYucmVsZWFzZSA9ICZpMmNfYWRhcHRlcl9kZXZfcmVsZWFzZTsKIAlhZGFwLT5kZXYuY2xhc3MgPSAmaTJjX2FkYXB0ZXJfY2xhc3M7CiAJcmVzID0gZGV2aWNlX3JlZ2lzdGVyKCZhZGFwLT5kZXYpOwpAQCAtODQ1LDggKzg0NSw4IEBACiAJfSBlbHNlCiAJCWNsaWVudC0+ZGV2LnJlbGVhc2UgPSBpMmNfY2xpZW50X2Rldl9yZWxlYXNlOwogCi0Jc25wcmludGYoJmNsaWVudC0+ZGV2LmJ1c19pZFswXSwgc2l6ZW9mKGNsaWVudC0+ZGV2LmJ1c19pZCksCi0JCSIlZC0lMDR4IiwgaTJjX2FkYXB0ZXJfaWQoYWRhcHRlciksIGNsaWVudC0+YWRkcik7CisJZGV2X3NldF9uYW1lKCZjbGllbnQtPmRldiwgIiVkLSUwNHgiLCBpMmNfYWRhcHRlcl9pZChhZGFwdGVyKSwKKwkJICAgICBjbGllbnQtPmFkZHIpOwogCXJlcyA9IGRldmljZV9yZWdpc3RlcigmY2xpZW50LT5kZXYpOwogCWlmIChyZXMpCiAJCWdvdG8gb3V0X2VycjsKQEAgLTg1Niw3ICs4NTYsNyBAQAogCW11dGV4X3VubG9jaygmYWRhcHRlci0+Y2xpc3RfbG9jayk7CiAKIAlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsICJjbGllbnQgWyVzXSByZWdpc3RlcmVkIHdpdGggYnVzIGlkICVzXG4iLAotCQljbGllbnQtPm5hbWUsIGNsaWVudC0+ZGV2LmJ1c19pZCk7CisJCWNsaWVudC0+bmFtZSwgZGV2X25hbWUoJmNsaWVudC0+ZGV2KSk7CiAKIAlpZiAoYWRhcHRlci0+Y2xpZW50X3JlZ2lzdGVyKSAgewogCQlpZiAoYWRhcHRlci0+Y2xpZW50X3JlZ2lzdGVyKGNsaWVudCkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL0tjb25maWcgYi9kcml2ZXJzL2lkZS9LY29uZmlnCmluZGV4IDRlZTg1ZmMuLjNmOTUwMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL0tjb25maWcKKysrIGIvZHJpdmVycy9pZGUvS2NvbmZpZwpAQCAtNTExLDYgKzUxMSwxMyBAQAogCSAgVGhpcyBhbGxvd3MgdGhlIGtlcm5lbCB0byBjaGFuZ2UgUElPLCBETUEgYW5kIFVETUEgc3BlZWRzIGFuZCB0bwogCSAgY29uZmlndXJlIHRoZSBjaGlwIHRvIG9wdGltdW0gcGVyZm9ybWFuY2UuCiAKK2NvbmZpZyBCTEtfREVWX0lUODE3MgorCXRyaXN0YXRlICJJVDgxNzIgSURFIHN1cHBvcnQiCisJc2VsZWN0IEJMS19ERVZfSURFRE1BX1BDSQorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIGFkZHMgc3VwcG9ydCBmb3IgdGhlIElERSBjb250cm9sbGVyIG9uIHRoZQorCSAgSVQ4MTcyIFN5c3RlbSBDb250cm9sbGVyLgorCiBjb25maWcgQkxLX0RFVl9JVDgyMTMKIAl0cmlzdGF0ZSAiSVQ4MjEzIElERSBzdXBwb3J0IgogCXNlbGVjdCBCTEtfREVWX0lERURNQV9QQ0kKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL01ha2VmaWxlIGIvZHJpdmVycy9pZGUvTWFrZWZpbGUKaW5kZXggNDEwNzI4OS4uYzJiOWM5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9pZGUvTWFrZWZpbGUKQEAgLTQ3LDYgKzQ3LDcgQEAKIG9iai0kKENPTkZJR19CTEtfREVWX0NZODJDNjkzKQkJKz0gY3k4MmM2OTMubwogb2JqLSQoQ09ORklHX0JMS19ERVZfREVMS0lOKQkJKz0gZGVsa2luX2NiLm8KIG9iai0kKENPTkZJR19CTEtfREVWX0hQVDM2NikJCSs9IGhwdDM2Ni5vCitvYmotJChDT05GSUdfQkxLX0RFVl9JVDgxNzIpCQkrPSBpdDgxNzIubwogb2JqLSQoQ09ORklHX0JMS19ERVZfSVQ4MjEzKQkJKz0gaXQ4MjEzLm8KIG9iai0kKENPTkZJR19CTEtfREVWX0lUODIxWCkJCSs9IGl0ODIxeC5vCiBvYmotJChDT05GSUdfQkxLX0RFVl9KTUlDUk9OKQkJKz0gam1pY3Jvbi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9hZWM2Mnh4LmMgYi9kcml2ZXJzL2lkZS9hZWM2Mnh4LmMKaW5kZXggNDE0MmM2OS4uNDQ4NWI5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvYWVjNjJ4eC5jCisrKyBiL2RyaXZlcnMvaWRlL2FlYzYyeHguYwpAQCAtODMsNyArODMsNyBAQAogCiBzdGF0aWMgdm9pZCBhZWM2MjEwX3NldF9tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggc3BlZWQpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXN0cnVjdCBpZGVfaG9zdCAqaG9zdAk9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBjaGlwc2V0X2J1c19jbG9ja19saXN0X2VudHJ5ICpidXNfY2xvY2sgPSBob3N0LT5ob3N0X3ByaXY7CkBAIC0xMTEsNyArMTExLDcgQEAKIAogc3RhdGljIHZvaWQgYWVjNjI2MF9zZXRfbW9kZShpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IHU4IHNwZWVkKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAlzdHJ1Y3QgaWRlX2hvc3QgKmhvc3QJPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgY2hpcHNldF9idXNfY2xvY2tfbGlzdF9lbnRyeSAqYnVzX2Nsb2NrID0gaG9zdC0+aG9zdF9wcml2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvYWxpbTE1eDMuYyBiL2RyaXZlcnMvaWRlL2FsaW0xNXgzLmMKaW5kZXggNDVkMjM1Ni4uNjZmNDMwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvYWxpbTE1eDMuYworKysgYi9kcml2ZXJzL2lkZS9hbGltMTV4My5jCkBAIC02OCw3ICs2OCw3IEBACiAKIHN0YXRpYyB2b2lkIGFsaV9zZXRfcGlvX21vZGUoaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCB1OCBwaW8pCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXN0cnVjdCBpZGVfdGltaW5nICp0ID0gaWRlX3RpbWluZ19maW5kX21vZGUoWEZFUl9QSU9fMCArIHBpbyk7CiAJaW50IHNfdGltZSA9IHQtPnNldHVwLCBhX3RpbWUgPSB0LT5hY3RpdmUsIGNfdGltZSA9IHQtPmN5Y2xlOwpAQCAtMTUwLDcgKzE1MCw3IEBACiAKIHN0YXRpYyB2b2lkIGFsaV9zZXRfZG1hX21vZGUoaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCB1OCBzcGVlZCkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJdTggc3BlZWQxCQk9IHNwZWVkOwogCXU4IHVuaXQJCQk9IGRyaXZlLT5kbiAmIDE7CkBAIC0xOTgsNyArMTk4LDcgQEAKIHN0YXRpYyBpbnQgYWxpMTV4M19kbWFfc2V0dXAoaWRlX2RyaXZlX3QgKmRyaXZlKQogewogCWlmIChtNTIyOV9yZXZpc2lvbiA8IDB4QzIgJiYgZHJpdmUtPm1lZGlhICE9IGlkZV9kaXNrKSB7Ci0JCWlmIChycV9kYXRhX2Rpcihkcml2ZS0+aHdpZi0+aHdncm91cC0+cnEpKQorCQlpZiAocnFfZGF0YV9kaXIoZHJpdmUtPmh3aWYtPnJxKSkKIAkJCXJldHVybiAxOwkvKiB0cnkgUElPIGluc3RlYWQgb2YgRE1BICovCiAJfQogCXJldHVybiBpZGVfZG1hX3NldHVwKGRyaXZlKTsKQEAgLTQ5MCw4ICs0OTAsNiBAQAogCWlmIChpZGVfYWxsb2NhdGVfZG1hX2VuZ2luZShod2lmKSkKIAkJcmV0dXJuIC0xOwogCi0JaHdpZi0+ZG1hX29wcyA9ICZzZmZfZG1hX29wczsKLQogCXJldHVybiAwOwogfQogCkBAIC01MTEsNiArNTA5LDcgQEAKIAkuZG1hX3Rlc3RfaXJxCQk9IGlkZV9kbWFfdGVzdF9pcnEsCiAJLmRtYV9sb3N0X2lycQkJPSBpZGVfZG1hX2xvc3RfaXJxLAogCS5kbWFfdGltZW91dAkJPSBpZGVfZG1hX3RpbWVvdXQsCisJLmRtYV9zZmZfcmVhZF9zdGF0dXMJPSBpZGVfZG1hX3NmZl9yZWFkX3N0YXR1cywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWRlX3BvcnRfaW5mbyBhbGkxNXgzX2NoaXBzZXQgX19kZXZpbml0ZGF0YSA9IHsKQEAgLTUxOSw2ICs1MTgsNyBAQAogCS5pbml0X2h3aWYJPSBpbml0X2h3aWZfYWxpMTV4MywKIAkuaW5pdF9kbWEJPSBpbml0X2RtYV9hbGkxNXgzLAogCS5wb3J0X29wcwk9ICZhbGlfcG9ydF9vcHMsCisJLmRtYV9vcHMJPSAmc2ZmX2RtYV9vcHMsCiAJLnBpb19tYXNrCT0gQVRBX1BJTzUsCiAJLnN3ZG1hX21hc2sJPSBBVEFfU1dETUEyLAogCS5td2RtYV9tYXNrCT0gQVRBX01XRE1BMiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2FtZDc0eHguYyBiL2RyaXZlcnMvaWRlL2FtZDc0eHguYwppbmRleCBjNmJjZDMwLi42OTY2MGE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9hbWQ3NHh4LmMKKysrIGIvZHJpdmVycy9pZGUvYW1kNzR4eC5jCkBAIC04Miw3ICs4Miw3IEBACiB7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSB0b19wY2lfZGV2KGh3aWYtPmRldik7Ci0JaWRlX2RyaXZlX3QgKnBlZXIgPSBod2lmLT5kcml2ZXMgKyAofmRyaXZlLT5kbiAmIDEpOworCWlkZV9kcml2ZV90ICpwZWVyID0gaWRlX2dldF9wYWlyX2Rldihkcml2ZSk7CiAJc3RydWN0IGlkZV90aW1pbmcgdCwgcDsKIAlpbnQgVCwgVVQ7CiAJdTggdWRtYV9tYXNrID0gaHdpZi0+dWx0cmFfbWFzazsKQEAgLTkyLDcgKzkyLDcgQEAKIAogCWlkZV90aW1pbmdfY29tcHV0ZShkcml2ZSwgc3BlZWQsICZ0LCBULCBVVCk7CiAKLQlpZiAocGVlci0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1BSRVNFTlQpIHsKKwlpZiAocGVlcikgewogCQlpZGVfdGltaW5nX2NvbXB1dGUocGVlciwgcGVlci0+Y3VycmVudF9zcGVlZCwgJnAsIFQsIFVUKTsKIAkJaWRlX3RpbWluZ19tZXJnZSgmcCwgJnQsICZ0LCBJREVfVElNSU5HXzhCSVQpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2F1MXh4eC1pZGUuYyBiL2RyaXZlcnMvaWRlL2F1MXh4eC1pZGUuYwppbmRleCAwZWM4ZmQxLi43OWEyZGZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9hdTF4eHgtaWRlLmMKKysrIGIvZHJpdmVycy9pZGUvYXUxeHh4LWlkZS5jCkBAIC0yMTIsOCArMjEyLDggQEAKIHN0YXRpYyBpbnQgYXVpZGVfYnVpbGRfZG1hdGFibGUoaWRlX2RyaXZlX3QgKmRyaXZlKQogewogCWludCBpLCBpc3dyaXRlLCBjb3VudCA9IDA7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOwotCXN0cnVjdCByZXF1ZXN0ICpycSA9IEhXR1JPVVAoZHJpdmUpLT5ycTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+cnE7CiAJX2F1aWRlX2h3aWYgKmFod2lmID0gJmF1aWRlX2h3aWY7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKIApAQCAtMjg2LDcgKzI4Niw3IEBACiAKIHN0YXRpYyBpbnQgYXVpZGVfZG1hX2VuZChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAogCWlmIChod2lmLT5zZ19uZW50cykgewogCQlpZGVfZGVzdHJveV9kbWF0YWJsZShkcml2ZSk7CkBAIC0zMDksOCArMzA5LDggQEAKIH0KIAogc3RhdGljIGludCBhdWlkZV9kbWFfc2V0dXAoaWRlX2RyaXZlX3QgKmRyaXZlKQoteyAgICAgICAJCi0Jc3RydWN0IHJlcXVlc3QgKnJxID0gSFdHUk9VUChkcml2ZSktPnJxOworeworCXN0cnVjdCByZXF1ZXN0ICpycSA9IGRyaXZlLT5od2lmLT5ycTsKIAogCWlmICghYXVpZGVfYnVpbGRfZG1hdGFibGUoZHJpdmUpKSB7CiAJCWlkZV9tYXBfc2coZHJpdmUsIHJxKTsKQEAgLTUwMiw3ICs1MDIsNiBAQAogCS5leGVjX2NvbW1hbmQJCT0gaWRlX2V4ZWNfY29tbWFuZCwKIAkucmVhZF9zdGF0dXMJCT0gaWRlX3JlYWRfc3RhdHVzLAogCS5yZWFkX2FsdHN0YXR1cwkJPSBpZGVfcmVhZF9hbHRzdGF0dXMsCi0JLnJlYWRfc2ZmX2RtYV9zdGF0dXMJPSBpZGVfcmVhZF9zZmZfZG1hX3N0YXR1cywKIAogCS5zZXRfaXJxCQk9IGlkZV9zZXRfaXJxLAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9jbWQ2NDAuYyBiL2RyaXZlcnMvaWRlL2NtZDY0MC5jCmluZGV4IGU0MzA2NjQuLjg4OTAyNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2NtZDY0MC5jCisrKyBiL2RyaXZlcnMvaWRlL2NtZDY0MC5jCkBAIC00NjcsMTEgKzQ2NywxMCBAQAogCSAqIHNvIHdlIG1lcmdlIHRoZSB0aW1pbmdzLCB1c2luZyB0aGUgc2xvd2VzdCB2YWx1ZSBmb3IgZWFjaCB0aW1pbmcuCiAJICovCiAJaWYgKGluZGV4ID4gMSkgewotCQlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0JCWlkZV9kcml2ZV90ICpwZWVyID0gJmh3aWYtPmRyaXZlc1shKGRyaXZlLT5kbiAmIDEpXTsKKwkJaWRlX2RyaXZlX3QgKnBlZXIgPSBpZGVfZ2V0X3BhaXJfZGV2KGRyaXZlKTsKIAkJdW5zaWduZWQgaW50IG1hdGUgPSBpbmRleCBeIDE7CiAKLQkJaWYgKHBlZXItPmRldl9mbGFncyAmIElERV9ERkxBR19QUkVTRU5UKSB7CisJCWlmIChwZWVyKSB7CiAJCQlpZiAoc2V0dXBfY291bnQgPCBzZXR1cF9jb3VudHNbbWF0ZV0pCiAJCQkJc2V0dXBfY291bnQgPSBzZXR1cF9jb3VudHNbbWF0ZV07CiAJCQlpZiAoYWN0aXZlX2NvdW50IDwgYWN0aXZlX2NvdW50c1ttYXRlXSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2NtZDY0eC5jIGIvZHJpdmVycy9pZGUvY21kNjR4LmMKaW5kZXggMzYyM2JmMC4uMmY5Njg4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvY21kNjR4LmMKKysrIGIvZHJpdmVycy9pZGUvY21kNjR4LmMKQEAgLTExNSw3ICsxMTUsNyBAQAogICovCiBzdGF0aWMgdm9pZCBjbWQ2NHhfdHVuZV9waW8oaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCB1OCBwaW8pCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXN0cnVjdCBpZGVfdGltaW5nICp0CT0gaWRlX3RpbWluZ19maW5kX21vZGUoWEZFUl9QSU9fMCArIHBpbyk7CiAJdW5zaWduZWQgaW50IGN5Y2xlX3RpbWU7CkBAIC0xMzgsMTAgKzEzOCwxMiBAQAogCSAqIHRoZSBzbG93ZXN0IGFkZHJlc3Mgc2V0dXAgdGltaW5nIG91cnNlbHZlcy4KIAkgKi8KIAlpZiAoaHdpZi0+Y2hhbm5lbCkgewotCQlpZGVfZHJpdmVfdCAqZHJpdmVzID0gaHdpZi0+ZHJpdmVzOworCQlpZGVfZHJpdmVfdCAqcGFpciA9IGlkZV9nZXRfcGFpcl9kZXYoZHJpdmUpOwogCiAJCWRyaXZlLT5kcml2ZV9kYXRhID0gc2V0dXBfY291bnQ7Ci0JCXNldHVwX2NvdW50ID0gbWF4KGRyaXZlc1swXS5kcml2ZV9kYXRhLCBkcml2ZXNbMV0uZHJpdmVfZGF0YSk7CisKKwkJaWYgKHBhaXIpCisJCQlzZXR1cF9jb3VudCA9IG1heF90KHU4LCBzZXR1cF9jb3VudCwgcGFpci0+ZHJpdmVfZGF0YSk7CiAJfQogCiAJaWYgKHNldHVwX2NvdW50ID4gNSkJCS8qIHNob3VsZG4ndCBhY3R1YWxseSBoYXBwZW4uLi4gKi8KQEAgLTE4MCw3ICsxODIsNyBAQAogCiBzdGF0aWMgdm9pZCBjbWQ2NHhfc2V0X2RtYV9tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggc3BlZWQpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXU4IHVuaXQJCQk9IGRyaXZlLT5kbiAmIDB4MDE7CiAJdTggcmVnVSA9IDAsIHBjaVUJPSBod2lmLT5jaGFubmVsID8gVURJREVUQ1IxIDogVURJREVUQ1IwOwpAQCAtMjI2LDcgKzIyOCw3IEBACiAKIHN0YXRpYyBpbnQgY21kNjQ4X2RtYV9lbmQoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJdW5zaWduZWQgbG9uZyBiYXNlCT0gaHdpZi0+ZG1hX2Jhc2UgLSAoaHdpZi0+Y2hhbm5lbCAqIDgpOwogCWludCBlcnIJCQk9IGlkZV9kbWFfZW5kKGRyaXZlKTsKIAl1OCAgaXJxX21hc2sJCT0gaHdpZi0+Y2hhbm5lbCA/IE1SRE1PREVfSU5UUl9DSDEgOgpAQCAtMjQyLDcgKzI0NCw3IEBACiAKIHN0YXRpYyBpbnQgY21kNjR4X2RtYV9lbmQoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAlpbnQgaXJxX3JlZwkJPSBod2lmLT5jaGFubmVsID8gQVJUVElNMjMgOiBDRlI7CiAJdTggIGlycV9tYXNrCQk9IGh3aWYtPmNoYW5uZWwgPyBBUlRUSU0yM19JTlRSX0NIMSA6CkBAIC0yNTksNyArMjYxLDcgQEAKIAogc3RhdGljIGludCBjbWQ2NDhfZG1hX3Rlc3RfaXJxKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXVuc2lnbmVkIGxvbmcgYmFzZQk9IGh3aWYtPmRtYV9iYXNlIC0gKGh3aWYtPmNoYW5uZWwgKiA4KTsKIAl1OCBpcnFfbWFzawkJPSBod2lmLT5jaGFubmVsID8gTVJETU9ERV9JTlRSX0NIMSA6CiAJCQkJCQkgIE1SRE1PREVfSU5UUl9DSDA7CkBAIC0yODIsNyArMjg0LDcgQEAKIAogc3RhdGljIGludCBjbWQ2NHhfZG1hX3Rlc3RfaXJxKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJaW50IGlycV9yZWcJCT0gaHdpZi0+Y2hhbm5lbCA/IEFSVFRJTTIzIDogQ0ZSOwogCXU4ICBpcnFfbWFzawkJPSBod2lmLT5jaGFubmVsID8gQVJUVElNMjNfSU5UUl9DSDEgOgpAQCAtMzEzLDcgKzMxNSw3IEBACiAKIHN0YXRpYyBpbnQgY21kNjQ2XzFfZG1hX2VuZChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAl1OCBkbWFfc3RhdCA9IDAsIGRtYV9jbWQgPSAwOwogCiAJZHJpdmUtPndhaXRpbmdfZm9yX2RtYSA9IDA7CkBAIC0zODMsNiArMzg1LDcgQEAKIAkuZG1hX3Rlc3RfaXJxCQk9IGNtZDY0eF9kbWFfdGVzdF9pcnEsCiAJLmRtYV9sb3N0X2lycQkJPSBpZGVfZG1hX2xvc3RfaXJxLAogCS5kbWFfdGltZW91dAkJPSBpZGVfZG1hX3RpbWVvdXQsCisJLmRtYV9zZmZfcmVhZF9zdGF0dXMJPSBpZGVfZG1hX3NmZl9yZWFkX3N0YXR1cywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWRlX2RtYV9vcHMgY21kNjQ2X3JldjFfZG1hX29wcyA9IHsKQEAgLTM5NCw2ICszOTcsNyBAQAogCS5kbWFfdGVzdF9pcnEJCT0gaWRlX2RtYV90ZXN0X2lycSwKIAkuZG1hX2xvc3RfaXJxCQk9IGlkZV9kbWFfbG9zdF9pcnEsCiAJLmRtYV90aW1lb3V0CQk9IGlkZV9kbWFfdGltZW91dCwKKwkuZG1hX3NmZl9yZWFkX3N0YXR1cwk9IGlkZV9kbWFfc2ZmX3JlYWRfc3RhdHVzLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpZGVfZG1hX29wcyBjbWQ2NDhfZG1hX29wcyA9IHsKQEAgLTQwNSw2ICs0MDksNyBAQAogCS5kbWFfdGVzdF9pcnEJCT0gY21kNjQ4X2RtYV90ZXN0X2lycSwKIAkuZG1hX2xvc3RfaXJxCQk9IGlkZV9kbWFfbG9zdF9pcnEsCiAJLmRtYV90aW1lb3V0CQk9IGlkZV9kbWFfdGltZW91dCwKKwkuZG1hX3NmZl9yZWFkX3N0YXR1cwk9IGlkZV9kbWFfc2ZmX3JlYWRfc3RhdHVzLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpZGVfcG9ydF9pbmZvIGNtZDY0eF9jaGlwc2V0c1tdIF9fZGV2aW5pdGRhdGEgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9jczU1MjAuYyBiL2RyaXZlcnMvaWRlL2NzNTUyMC5jCmluZGV4IDVlZmI0NjcuLmQwMDNiZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2NzNTUyMC5jCisrKyBiL2RyaXZlcnMvaWRlL2NzNTUyMC5jCkBAIC01OSw3ICs1OSw3IEBACiAKIHN0YXRpYyB2b2lkIGNzNTUyMF9zZXRfcGlvX21vZGUoaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCB1OCBwaW8pCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAlpbnQgY29udHJvbGxlciA9IGRyaXZlLT5kbiA+IDEgPyAxIDogMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvY3k4MmM2OTMuYyBiL2RyaXZlcnMvaWRlL2N5ODJjNjkzLmMKaW5kZXggZDM3YmFmOC4uNzRmYzU0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvY3k4MmM2OTMuYworKysgYi9kcml2ZXJzL2lkZS9jeTgyYzY5My5jCkBAIC0yMDMsNyArMjAzLDcgQEAKIAogc3RhdGljIHZvaWQgY3k4MmM2OTNfc2V0X3Bpb19tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggcGlvKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAlwaW9fY2xvY2tzX3QgcGNsazsKIAl1bnNpZ25lZCBpbnQgYWRkckN0cmw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9mYWxjb25pZGUuYyBiL2RyaXZlcnMvaWRlL2ZhbGNvbmlkZS5jCmluZGV4IDM5ZDUwMGQuLmE1YmE4MjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2ZhbGNvbmlkZS5jCisrKyBiL2RyaXZlcnMvaWRlL2ZhbGNvbmlkZS5jCkBAIC03MCw3ICs3MCw2IEBACiAJLmV4ZWNfY29tbWFuZAkJPSBpZGVfZXhlY19jb21tYW5kLAogCS5yZWFkX3N0YXR1cwkJPSBpZGVfcmVhZF9zdGF0dXMsCiAJLnJlYWRfYWx0c3RhdHVzCQk9IGlkZV9yZWFkX2FsdHN0YXR1cywKLQkucmVhZF9zZmZfZG1hX3N0YXR1cwk9IGlkZV9yZWFkX3NmZl9kbWFfc3RhdHVzLAogCiAJLnNldF9pcnEJCT0gaWRlX3NldF9pcnEsCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2hwdDM2Ni5jIGIvZHJpdmVycy9pZGUvaHB0MzY2LmMKaW5kZXggYjE4ZTEwZC4uM2ViOWI1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaHB0MzY2LmMKKysrIGIvZHJpdmVycy9pZGUvaHB0MzY2LmMKQEAgLTYyNiw3ICs2MjYsNyBAQAogCiBzdGF0aWMgdTggaHB0M3h4X3VkbWFfZmlsdGVyKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBocHRfaW5mbyAqaW5mbwk9IGhwdDN4eF9nZXRfaW5mbyhod2lmLT5kZXYpOwogCXU4IG1hc2sgCQk9IGh3aWYtPnVsdHJhX21hc2s7CiAKQEAgLTY2NSw3ICs2NjUsNyBAQAogCiBzdGF0aWMgdTggaHB0M3h4X21kbWFfZmlsdGVyKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBocHRfaW5mbyAqaW5mbwk9IGhwdDN4eF9nZXRfaW5mbyhod2lmLT5kZXYpOwogCiAJc3dpdGNoIChpbmZvLT5jaGlwX3R5cGUpIHsKQEAgLTc0Myw3ICs3NDMsNyBAQAogCiBzdGF0aWMgdm9pZCBocHQzeHhfbWFza3Byb2MoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgbWFzaykKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2CSpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJc3RydWN0IGhwdF9pbmZvICppbmZvCT0gaHB0M3h4X2dldF9pbmZvKGh3aWYtPmRldik7CiAKQEAgLTc4OCw3ICs3ODgsNyBAQAogCiBzdGF0aWMgdm9pZCBocHQzNzBfY2xlYXJfZW5naW5lKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAKIAlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBod2lmLT5zZWxlY3RfZGF0YSwgMHgzNyk7CkBAIC03OTcsNyArNzk3LDcgQEAKIAogc3RhdGljIHZvaWQgaHB0MzcwX2lycV90aW1lb3V0KGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJdTE2IGJmaWZvCQk9IDA7CiAJdTggIGRtYV9jbWQ7CkBAIC04MjIsNyArODIyLDcgQEAKIAogc3RhdGljIGludCBocHQzNzBfZG1hX2VuZChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAl1OCAgZG1hX3N0YXQJCT0gaW5iKGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9TVEFUVVMpOwogCiAJaWYgKGRtYV9zdGF0ICYgMHgwMSkgewpAQCAtODQ0LDcgKzg0NCw3IEBACiAvKiByZXR1cm5zIDEgaWYgRE1BIElSUSBpc3N1ZWQsIDAgb3RoZXJ3aXNlICovCiBzdGF0aWMgaW50IGhwdDM3NF9kbWFfdGVzdF9pcnEoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAl1MTYgYmZpZm8JCT0gMDsKIAl1OCAgZG1hX3N0YXQ7CkBAIC04NjUsNyArODY1LDcgQEAKIAogc3RhdGljIGludCBocHQzNzRfZG1hX2VuZChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXU4IG1jcgk9IDAsIG1jcl9hZGRyCT0gaHdpZi0+c2VsZWN0X2RhdGE7CiAJdTggYndzciA9IDAsIG1hc2sJPSBod2lmLT5jaGFubmVsID8gMHgwMiA6IDB4MDE7CkBAIC05MjcsNyArOTI3LDcgQEAKIAogc3RhdGljIHZvaWQgaHB0M3h4bl9yd19kaXNrKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxKQogewotCWhwdDN4eG5fc2V0X2Nsb2NrKEhXSUYoZHJpdmUpLCBycV9kYXRhX2RpcihycSkgPyAweDIzIDogMHgyMSk7CisJaHB0M3h4bl9zZXRfY2xvY2soZHJpdmUtPmh3aWYsIHJxX2RhdGFfZGlyKHJxKSA/IDB4MjMgOiAweDIxKTsKIH0KIAogLyoqCkBAIC0xMzQ5LDggKzEzNDksNiBAQAogCWlmIChpZGVfYWxsb2NhdGVfZG1hX2VuZ2luZShod2lmKSkKIAkJcmV0dXJuIC0xOwogCi0JaHdpZi0+ZG1hX29wcyA9ICZzZmZfZG1hX29wczsKLQogCXJldHVybiAwOwogfQogCkBAIC0xNDI2LDYgKzE0MjQsNyBAQAogCS5kbWFfdGVzdF9pcnEJCT0gaHB0Mzc0X2RtYV90ZXN0X2lycSwKIAkuZG1hX2xvc3RfaXJxCQk9IGlkZV9kbWFfbG9zdF9pcnEsCiAJLmRtYV90aW1lb3V0CQk9IGlkZV9kbWFfdGltZW91dCwKKwkuZG1hX3NmZl9yZWFkX3N0YXR1cwk9IGlkZV9kbWFfc2ZmX3JlYWRfc3RhdHVzLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpZGVfZG1hX29wcyBocHQzNzBfZG1hX29wcyA9IHsKQEAgLTE0MzcsNiArMTQzNiw3IEBACiAJLmRtYV90ZXN0X2lycQkJPSBpZGVfZG1hX3Rlc3RfaXJxLAogCS5kbWFfbG9zdF9pcnEJCT0gaWRlX2RtYV9sb3N0X2lycSwKIAkuZG1hX3RpbWVvdXQJCT0gaHB0MzcwX2RtYV90aW1lb3V0LAorCS5kbWFfc2ZmX3JlYWRfc3RhdHVzCT0gaWRlX2RtYV9zZmZfcmVhZF9zdGF0dXMsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlkZV9kbWFfb3BzIGhwdDM2eF9kbWFfb3BzID0gewpAQCAtMTQ0OCw2ICsxNDQ4LDcgQEAKIAkuZG1hX3Rlc3RfaXJxCQk9IGlkZV9kbWFfdGVzdF9pcnEsCiAJLmRtYV9sb3N0X2lycQkJPSBocHQzNjZfZG1hX2xvc3RfaXJxLAogCS5kbWFfdGltZW91dAkJPSBpZGVfZG1hX3RpbWVvdXQsCisJLmRtYV9zZmZfcmVhZF9zdGF0dXMJPSBpZGVfZG1hX3NmZl9yZWFkX3N0YXR1cywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWRlX3BvcnRfaW5mbyBocHQzNjZfY2hpcHNldHNbXSBfX2RldmluaXRkYXRhID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWNzaWRlLmMgYi9kcml2ZXJzL2lkZS9pY3NpZGUuYwppbmRleCA4MWY3MGNhLi45N2EzNWM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pY3NpZGUuYworKysgYi9kcml2ZXJzL2lkZS9pY3NpZGUuYwpAQCAtMTY2LDcgKzE2Niw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIGljc2lkZV9tYXNrcHJvYyhpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBtYXNrKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IGV4cGFuc2lvbl9jYXJkICplYyA9IEVDQVJEX0RFVihod2lmLT5kZXYpOwogCXN0cnVjdCBpY3NpZGVfc3RhdGUgKnN0YXRlID0gZWNhcmRfZ2V0X2RydmRhdGEoZWMpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0yODQsNyArMjg0LDcgQEAKIAogc3RhdGljIGludCBpY3NpZGVfZG1hX2VuZChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjID0gRUNBUkRfREVWKGh3aWYtPmRldik7CiAKIAlkcml2ZS0+d2FpdGluZ19mb3JfZG1hID0gMDsKQEAgLTI5OSw3ICsyOTksNyBAQAogCiBzdGF0aWMgdm9pZCBpY3NpZGVfZG1hX3N0YXJ0KGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBleHBhbnNpb25fY2FyZCAqZWMgPSBFQ0FSRF9ERVYoaHdpZi0+ZGV2KTsKIAogCS8qIFdlIGNhbiBub3QgZW5hYmxlIERNQSBvbiBib3RoIGNoYW5uZWxzIHNpbXVsdGFuZW91c2x5LiAqLwpAQCAtMzA5LDEwICszMDksMTAgQEAKIAogc3RhdGljIGludCBpY3NpZGVfZG1hX3NldHVwKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBleHBhbnNpb25fY2FyZCAqZWMgPSBFQ0FSRF9ERVYoaHdpZi0+ZGV2KTsKIAlzdHJ1Y3QgaWNzaWRlX3N0YXRlICpzdGF0ZSA9IGVjYXJkX2dldF9kcnZkYXRhKGVjKTsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5od2dyb3VwLT5ycTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5ycTsKIAl1bnNpZ25lZCBpbnQgZG1hX21vZGU7CiAKIAlpZiAocnFfZGF0YV9kaXIocnEpKQpAQCAtMzYyLDcgKzM2Miw3IEBACiAKIHN0YXRpYyBpbnQgaWNzaWRlX2RtYV90ZXN0X2lycShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjID0gRUNBUkRfREVWKGh3aWYtPmRldik7CiAJc3RydWN0IGljc2lkZV9zdGF0ZSAqc3RhdGUgPSBlY2FyZF9nZXRfZHJ2ZGF0YShlYyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1hY3BpLmMgYi9kcml2ZXJzL2lkZS9pZGUtYWNwaS5jCmluZGV4IGZkNGEzNjQuLjJmOWU5NDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1hY3BpLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWFjcGkuYwpAQCAtMjE4LDcgKzIxOCw3IEBACiAgKi8KIHN0YXRpYyBhY3BpX2hhbmRsZSBpZGVfYWNwaV9kcml2ZV9nZXRfaGFuZGxlKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90CSpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdAkqaHdpZiA9IGRyaXZlLT5od2lmOwogCWludAkJIHBvcnQ7CiAJYWNwaV9oYW5kbGUJIGRyaXZlX2hhbmRsZTsKIApAQCAtMjYzLDcgKzI2Myw3IEBACiAJYWNwaV9zdGF0dXMJCQlzdGF0dXM7CiAJc3RydWN0IGFjcGlfYnVmZmVyCQlvdXRwdXQ7CiAJdW5pb24gYWNwaV9vYmplY3QgCQkqb3V0X29iajsKLQlpZGVfaHdpZl90CQkJKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90CQkJKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgZGV2aWNlCQkJKmRldiA9IGh3aWYtPmdlbmRldi5wYXJlbnQ7CiAJaW50CQkJCWVyciA9IC1FTk9ERVY7CiAJaW50CQkJCXBvcnQ7CkBAIC02NDEsNyArNjQxLDggQEAKICAqLwogdm9pZCBpZGVfYWNwaV9zZXRfc3RhdGUoaWRlX2h3aWZfdCAqaHdpZiwgaW50IG9uKQogewotCWludCB1bml0OworCWlkZV9kcml2ZV90ICpkcml2ZTsKKwlpbnQgaTsKIAogCWlmIChpZGVfbm9hY3BpIHx8IGlkZV9ub2FjcGlfcHN4KQogCQlyZXR1cm47CkBAIC02NTUsOSArNjU2LDggQEAKIAkvKiBjaGFubmVsIGZpcnN0IGFuZCB0aGVuIGRyaXZlcyBmb3IgcG93ZXIgb24gYW5kIHZlcnNlIHZlcnNhIGZvciBwb3dlciBvZmYgKi8KIAlpZiAob24pCiAJCWFjcGlfYnVzX3NldF9wb3dlcihod2lmLT5hY3BpZGF0YS0+b2JqX2hhbmRsZSwgQUNQSV9TVEFURV9EMCk7Ci0JZm9yICh1bml0ID0gMDsgdW5pdCA8IE1BWF9EUklWRVM7ICsrdW5pdCkgewotCQlpZGVfZHJpdmVfdCAqZHJpdmUgPSAmaHdpZi0+ZHJpdmVzW3VuaXRdOwogCisJaWRlX3BvcnRfZm9yX2VhY2hfZGV2KGksIGRyaXZlLCBod2lmKSB7CiAJCWlmICghZHJpdmUtPmFjcGlkYXRhLT5vYmpfaGFuZGxlKQogCQkJZHJpdmUtPmFjcGlkYXRhLT5vYmpfaGFuZGxlID0gaWRlX2FjcGlfZHJpdmVfZ2V0X2hhbmRsZShkcml2ZSk7CiAKQEAgLTcxMSwxNSArNzExLDEzIEBACiAJICogZm9yIGJvdGggZHJpdmVzLCByZWdhcmRsZXNzIHdoZXRoZXIgdGhleSBhcmUgY29ubmVjdGVkCiAJICogb3Igbm90LgogCSAqLwotCWh3aWYtPmRyaXZlc1swXS5hY3BpZGF0YSA9ICZod2lmLT5hY3BpZGF0YS0+bWFzdGVyOwotCWh3aWYtPmRyaXZlc1sxXS5hY3BpZGF0YSA9ICZod2lmLT5hY3BpZGF0YS0+c2xhdmU7CisJaHdpZi0+ZGV2aWNlc1swXS0+YWNwaWRhdGEgPSAmaHdpZi0+YWNwaWRhdGEtPm1hc3RlcjsKKwlod2lmLT5kZXZpY2VzWzFdLT5hY3BpZGF0YSA9ICZod2lmLT5hY3BpZGF0YS0+c2xhdmU7CiAKIAkvKgogCSAqIFNlbmQgSURFTlRJRlkgZm9yIGVhY2ggZHJpdmUKIAkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0RSSVZFUzsgaSsrKSB7Ci0JCWRyaXZlID0gJmh3aWYtPmRyaXZlc1tpXTsKLQorCWlkZV9wb3J0X2Zvcl9lYWNoX2RldihpLCBkcml2ZSwgaHdpZikgewogCQltZW1zZXQoZHJpdmUtPmFjcGlkYXRhLCAwLCBzaXplb2YoKmRyaXZlLT5hY3BpZGF0YSkpOwogCiAJCWlmICgoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19QUkVTRU5UKSA9PSAwKQpAQCAtNzQ0LDkgKzc0Miw3IEBACiAJaWRlX2FjcGlfZ2V0X3RpbWluZyhod2lmKTsKIAlpZGVfYWNwaV9wdXNoX3RpbWluZyhod2lmKTsKIAotCWZvciAoaSA9IDA7IGkgPCBNQVhfRFJJVkVTOyBpKyspIHsKLQkJZHJpdmUgPSAmaHdpZi0+ZHJpdmVzW2ldOwotCisJaWRlX3BvcnRfZm9yX2VhY2hfZGV2KGksIGRyaXZlLCBod2lmKSB7CiAJCWlmIChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1BSRVNFTlQpCiAJCQkvKiBFeGVjdXRlIEFDUEkgc3RhcnR1cCBjb2RlICovCiAJCQlpZGVfYWNwaV9leGVjX3Rmcyhkcml2ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtYXRhcGkuYyBiL2RyaXZlcnMvaWRlL2lkZS1hdGFwaS5jCmluZGV4IGU4Njg4YzAuLmU5NmMwMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1hdGFwaS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1hdGFwaS5jCkBAIC0yNDMsNyArMjQzLDcgQEAKIAogaW50IGlkZV9jZF9leHBpcnkoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCXN0cnVjdCByZXF1ZXN0ICpycSA9IEhXR1JPVVAoZHJpdmUpLT5ycTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBkcml2ZS0+aHdpZi0+cnE7CiAJdW5zaWduZWQgbG9uZyB3YWl0ID0gMDsKIAogCWRlYnVnX2xvZygiJXM6IHJxLT5jbWRbMF06IDB4JXhcbiIsIF9fZnVuY19fLCBycS0+Y21kWzBdKTsKQEAgLTI5NCw3ICsyOTQsNyBAQAogewogCXN0cnVjdCBpZGVfYXRhcGlfcGMgKnBjID0gZHJpdmUtPnBjOwogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5od2dyb3VwLT5ycTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5ycTsKIAljb25zdCBzdHJ1Y3QgaWRlX3RwX29wcyAqdHBfb3BzID0gaHdpZi0+dHBfb3BzOwogCXhmZXJfZnVuY190ICp4ZmVyZnVuYzsKIAl1bnNpZ25lZCBpbnQgdGltZW91dCwgdGVtcDsKQEAgLTQ5MSw3ICs0OTEsNyBAQAogewogCXN0cnVjdCBpZGVfYXRhcGlfcGMgKnVuaW5pdGlhbGl6ZWRfdmFyKHBjKTsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+aHdncm91cC0+cnE7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+cnE7CiAJaWRlX2V4cGlyeV90ICpleHBpcnk7CiAJdW5zaWduZWQgaW50IHRpbWVvdXQ7CiAJaW50IGNtZF9sZW47CkBAIC01NDksNyArNTQ5LDEwIEBACiAJfQogCiAJLyogU2V0IHRoZSBpbnRlcnJ1cHQgcm91dGluZSAqLwotCWlkZV9zZXRfaGFuZGxlcihkcml2ZSwgaWRlX3BjX2ludHIsIHRpbWVvdXQsIGV4cGlyeSk7CisJaWRlX3NldF9oYW5kbGVyKGRyaXZlLAorCQkJKGRldl9pc19pZGVjZChkcml2ZSkgPyBkcml2ZS0+aXJxX2hhbmRsZXIKKwkJCQkJICAgICA6IGlkZV9wY19pbnRyKSwKKwkJCXRpbWVvdXQsIGV4cGlyeSk7CiAKIAkvKiBCZWdpbiBETUEsIGlmIG5lY2Vzc2FyeSAqLwogCWlmIChkZXZfaXNfaWRlY2QoZHJpdmUpKSB7CkBAIC01ODAsNyArNTgzLDcgQEAKIAogCWlmIChkZXZfaXNfaWRlY2QoZHJpdmUpKSB7CiAJCXRmX2ZsYWdzID0gSURFX1RGTEFHX09VVF9OU0VDVCB8IElERV9URkxBR19PVVRfTEJBTDsKLQkJYmNvdW50ID0gaWRlX2NkX2dldF94ZmVybGVuKGh3aWYtPmh3Z3JvdXAtPnJxKTsKKwkJYmNvdW50ID0gaWRlX2NkX2dldF94ZmVybGVuKGh3aWYtPnJxKTsKIAkJZXhwaXJ5ID0gaWRlX2NkX2V4cGlyeTsKIAkJdGltZW91dCA9IEFUQVBJX1dBSVRfUEM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1jZC5jIGIvZHJpdmVycy9pZGUvaWRlLWNkLmMKaW5kZXggMWE3NDEwZi4uY2FlNjkzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWNkLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWNkLmMKQEAgLTIzOSw3ICsyMzksNyBAQAogCiBzdGF0aWMgdm9pZCBjZHJvbV9lbmRfcmVxdWVzdChpZGVfZHJpdmVfdCAqZHJpdmUsIGludCB1cHRvZGF0ZSkKIHsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBIV0dST1VQKGRyaXZlKS0+cnE7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gZHJpdmUtPmh3aWYtPnJxOwogCWludCBuc2VjdG9ycyA9IHJxLT5oYXJkX2N1cl9zZWN0b3JzOwogCiAJaWRlX2RlYnVnX2xvZyhJREVfREJHX0ZVTkMsICJDYWxsICVzLCBjbWQ6IDB4JXgsIHVwdG9kYXRlOiAweCV4LCAiCkBAIC0zMDYsOCArMzA2LDcgQEAKIHN0YXRpYyBpbnQgY2Ryb21fZGVjb2RlX3N0YXR1cyhpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBnb29kX3N0YXQsIGludCAqc3RhdF9yZXQpCiB7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwotCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXAgPSBod2lmLT5od2dyb3VwOwotCXN0cnVjdCByZXF1ZXN0ICpycSA9IGh3Z3JvdXAtPnJxOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IGh3aWYtPnJxOwogCWludCBzdGF0LCBlcnIsIHNlbnNlX2tleTsKIAogCS8qIGNoZWNrIGZvciBlcnJvcnMgKi8KQEAgLTUwMiw3ICs1MDEsNyBAQAogCQlibGtkZXZfZGVxdWV1ZV9yZXF1ZXN0KHJxKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CiAKLQkJaHdncm91cC0+cnEgPSBOVUxMOworCQlod2lmLT5ycSA9IE5VTEw7CiAKIAkJY2Ryb21fcXVldWVfcmVxdWVzdF9zZW5zZShkcml2ZSwgcnEtPnNlbnNlLCBycSk7CiAJfSBlbHNlCkBAIC01MTEsMTA2ICs1MTAsNiBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaWRlX3N0YXJ0c3RvcF90IGNkcm9tX3RyYW5zZmVyX3BhY2tldF9jb21tYW5kKGlkZV9kcml2ZV90ICopOwotc3RhdGljIGlkZV9zdGFydHN0b3BfdCBjZHJvbV9uZXdwY19pbnRyKGlkZV9kcml2ZV90ICopOwotCi0vKgotICogU2V0IHVwIHRoZSBkZXZpY2UgcmVnaXN0ZXJzIGZvciB0cmFuc2ZlcnJpbmcgYSBwYWNrZXQgY29tbWFuZCBvbiBERVYsCi0gKiBleHBlY3RpbmcgdG8gbGF0ZXIgdHJhbnNmZXIgWEZFUkxFTiBieXRlcy4gIEhBTkRMRVIgaXMgdGhlIHJvdXRpbmUKLSAqIHdoaWNoIGFjdHVhbGx5IHRyYW5zZmVycyB0aGUgY29tbWFuZCB0byB0aGUgZHJpdmUuICBJZiB0aGlzIGlzIGEKLSAqIGRycV9pbnRlcnJ1cHQgZGV2aWNlLCB0aGlzIHJvdXRpbmUgd2lsbCBhcnJhbmdlIGZvciBIQU5ETEVSIHRvIGJlCi0gKiBjYWxsZWQgd2hlbiB0aGUgaW50ZXJydXB0IGZyb20gdGhlIGRyaXZlIGFycml2ZXMuICBPdGhlcndpc2UsIEhBTkRMRVIKLSAqIHdpbGwgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBkcml2ZSBpcyBwcmVwYXJlZCBmb3IgdGhlIHRyYW5zZmVyLgotICovCi1zdGF0aWMgaWRlX3N0YXJ0c3RvcF90IGNkcm9tX3N0YXJ0X3BhY2tldF9jb21tYW5kKGlkZV9kcml2ZV90ICpkcml2ZSkKLXsKLQlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+aHdncm91cC0+cnE7Ci0JaW50IHhmZXJsZW47Ci0KLQl4ZmVybGVuID0gaWRlX2NkX2dldF94ZmVybGVuKHJxKTsKLQotCWlkZV9kZWJ1Z19sb2coSURFX0RCR19QQywgIkNhbGwgJXMsIHhmZXJsZW46ICVkXG4iLCBfX2Z1bmNfXywgeGZlcmxlbik7Ci0KLQkvKiBGSVhNRTogZm9yIFZpcnR1YWwgRE1BIHdlIG11c3QgY2hlY2sgaGFyZGVyICovCi0JaWYgKGRyaXZlLT5kbWEpCi0JCWRyaXZlLT5kbWEgPSAhaHdpZi0+ZG1hX29wcy0+ZG1hX3NldHVwKGRyaXZlKTsKLQotCS8qIHNldCB1cCB0aGUgY29udHJvbGxlciByZWdpc3RlcnMgKi8KLQlpZGVfcGt0Y21kX3RmX2xvYWQoZHJpdmUsIElERV9URkxBR19PVVRfTlNFQ1QgfCBJREVfVEZMQUdfT1VUX0xCQUwsCi0JCQkgICB4ZmVybGVuLCBkcml2ZS0+ZG1hKTsKLQotCWlmIChkcml2ZS0+YXRhcGlfZmxhZ3MgJiBJREVfQUZMQUdfRFJRX0lOVEVSUlVQVCkgewotCQkvKiB3YWl0aW5nIGZvciBDREIgaW50ZXJydXB0LCBub3QgRE1BIHlldC4gKi8KLQkJaWYgKGRyaXZlLT5kbWEpCi0JCQlkcml2ZS0+d2FpdGluZ19mb3JfZG1hID0gMDsKLQotCQkvKiBwYWNrZXQgY29tbWFuZCAqLwotCQlpZGVfZXhlY3V0ZV9jb21tYW5kKGRyaXZlLCBBVEFfQ01EX1BBQ0tFVCwKLQkJCQkgICAgY2Ryb21fdHJhbnNmZXJfcGFja2V0X2NvbW1hbmQsCi0JCQkJICAgIEFUQVBJX1dBSVRfUEMsIGlkZV9jZF9leHBpcnkpOwotCQlyZXR1cm4gaWRlX3N0YXJ0ZWQ7Ci0JfSBlbHNlIHsKLQkJaWRlX2V4ZWN1dGVfcGt0X2NtZChkcml2ZSk7Ci0KLQkJcmV0dXJuIGNkcm9tX3RyYW5zZmVyX3BhY2tldF9jb21tYW5kKGRyaXZlKTsKLQl9Ci19Ci0KLS8qCi0gKiBTZW5kIGEgcGFja2V0IGNvbW1hbmQgdG8gRFJJVkUgZGVzY3JpYmVkIGJ5IENNRF9CVUYgYW5kIENNRF9MRU4uIFRoZSBkZXZpY2UKLSAqIHJlZ2lzdGVycyBtdXN0IGhhdmUgYWxyZWFkeSBiZWVuIHByZXBhcmVkIGJ5IGNkcm9tX3N0YXJ0X3BhY2tldF9jb21tYW5kLgotICogSEFORExFUiBpcyB0aGUgaW50ZXJydXB0IGhhbmRsZXIgdG8gY2FsbCB3aGVuIHRoZSBjb21tYW5kIGNvbXBsZXRlcyBvcgotICogdGhlcmUncyBkYXRhIHJlYWR5LgotICovCi0jZGVmaW5lIEFUQVBJX01JTl9DREJfQllURVMgMTIKLXN0YXRpYyBpZGVfc3RhcnRzdG9wX3QgY2Ryb21fdHJhbnNmZXJfcGFja2V0X2NvbW1hbmQoaWRlX2RyaXZlX3QgKmRyaXZlKQotewotCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5od2dyb3VwLT5ycTsKLQlpbnQgY21kX2xlbjsKLQlpZGVfc3RhcnRzdG9wX3Qgc3RhcnRzdG9wOwotCi0JaWRlX2RlYnVnX2xvZyhJREVfREJHX1BDLCAiQ2FsbCAlc1xuIiwgX19mdW5jX18pOwotCi0JaWYgKGRyaXZlLT5hdGFwaV9mbGFncyAmIElERV9BRkxBR19EUlFfSU5URVJSVVBUKSB7Ci0JCS8qCi0JCSAqIEhlcmUgd2Ugc2hvdWxkIGhhdmUgYmVlbiBjYWxsZWQgYWZ0ZXIgcmVjZWl2aW5nIGFuIGludGVycnVwdAotCQkgKiBmcm9tIHRoZSBkZXZpY2UuICBEUlEgc2hvdWxkIGhvdyBiZSBzZXQuCi0JCSAqLwotCi0JCS8qIGNoZWNrIGZvciBlcnJvcnMgKi8KLQkJaWYgKGNkcm9tX2RlY29kZV9zdGF0dXMoZHJpdmUsIEFUQV9EUlEsIE5VTEwpKQotCQkJcmV0dXJuIGlkZV9zdG9wcGVkOwotCi0JCS8qIG9rLCBuZXh0IGludGVycnVwdCB3aWxsIGJlIERNQSBpbnRlcnJ1cHQgKi8KLQkJaWYgKGRyaXZlLT5kbWEpCi0JCQlkcml2ZS0+d2FpdGluZ19mb3JfZG1hID0gMTsKLQl9IGVsc2UgewotCQkvKiBvdGhlcndpc2UsIHdlIG11c3Qgd2FpdCBmb3IgRFJRIHRvIGdldCBzZXQgKi8KLQkJaWYgKGlkZV93YWl0X3N0YXQoJnN0YXJ0c3RvcCwgZHJpdmUsIEFUQV9EUlEsCi0JCQkJICBBVEFfQlVTWSwgV0FJVF9SRUFEWSkpCi0JCQlyZXR1cm4gc3RhcnRzdG9wOwotCX0KLQotCS8qIGFybSB0aGUgaW50ZXJydXB0IGhhbmRsZXIgKi8KLQlpZGVfc2V0X2hhbmRsZXIoZHJpdmUsIGNkcm9tX25ld3BjX2ludHIsIHJxLT50aW1lb3V0LCBpZGVfY2RfZXhwaXJ5KTsKLQotCS8qIEFUQVBJIGNvbW1hbmRzIGdldCBwYWRkZWQgb3V0IHRvIDEyIGJ5dGVzIG1pbmltdW0gKi8KLQljbWRfbGVuID0gQ09NTUFORF9TSVpFKHJxLT5jbWRbMF0pOwotCWlmIChjbWRfbGVuIDwgQVRBUElfTUlOX0NEQl9CWVRFUykKLQkJY21kX2xlbiA9IEFUQVBJX01JTl9DREJfQllURVM7Ci0KLQkvKiBzZW5kIHRoZSBjb21tYW5kIHRvIHRoZSBkZXZpY2UgKi8KLQlod2lmLT50cF9vcHMtPm91dHB1dF9kYXRhKGRyaXZlLCBOVUxMLCBycS0+Y21kLCBjbWRfbGVuKTsKLQotCS8qIHN0YXJ0IHRoZSBETUEgaWYgbmVlZCBiZSAqLwotCWlmIChkcml2ZS0+ZG1hKQotCQlod2lmLT5kbWFfb3BzLT5kbWFfc3RhcnQoZHJpdmUpOwotCi0JcmV0dXJuIGlkZV9zdGFydGVkOwotfQotCiAvKgogICogQ2hlY2sgdGhlIGNvbnRlbnRzIG9mIHRoZSBpbnRlcnJ1cHQgcmVhc29uIHJlZ2lzdGVyIGZyb20gdGhlIGNkcm9tCiAgKiBhbmQgYXR0ZW1wdCB0byByZWNvdmVyIGlmIHRoZXJlIGFyZSBwcm9ibGVtcy4gIFJldHVybnMgIDAgaWYgZXZlcnl0aGluZydzCkBAIC04NTQsOCArNzUzLDcgQEAKIHN0YXRpYyBpZGVfc3RhcnRzdG9wX3QgY2Ryb21fbmV3cGNfaW50cihpZGVfZHJpdmVfdCAqZHJpdmUpCiB7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwotCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXAgPSBod2lmLT5od2dyb3VwOwotCXN0cnVjdCByZXF1ZXN0ICpycSA9IGh3Z3JvdXAtPnJxOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IGh3aWYtPnJxOwogCXhmZXJfZnVuY190ICp4ZmVyZnVuYzsKIAlpZGVfZXhwaXJ5X3QgKmV4cGlyeSA9IE5VTEw7CiAJaW50IGRtYV9lcnJvciA9IDAsIGRtYSwgc3RhdCwgdGhpc2xlbiwgdXB0b2RhdGUgPSAwOwpAQCAtMTA2MSw3ICs5NTksNyBAQAogCQlpZiAoYmxrX2VuZF9yZXF1ZXN0KHJxLCAwLCBkbGVuKSkKIAkJCUJVRygpOwogCi0JCWh3Z3JvdXAtPnJxID0gTlVMTDsKKwkJaHdpZi0+cnEgPSBOVUxMOwogCX0gZWxzZSB7CiAJCWlmICghdXB0b2RhdGUpCiAJCQlycS0+Y21kX2ZsYWdzIHw9IFJFUV9GQUlMRUQ7CkBAIC0xMTgzLDcgKzEwODEsNyBAQAogCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CiAJfQogCi0JcmV0dXJuIGNkcm9tX3N0YXJ0X3BhY2tldF9jb21tYW5kKGRyaXZlKTsKKwlyZXR1cm4gaWRlX2lzc3VlX3BjKGRyaXZlKTsKIH0KIAogLyoKQEAgLTE5MTYsNyArMTgxNCw3IEBACiAKIHN0YXRpYyBpbnQgaWRlX2NkX3Byb2JlKGlkZV9kcml2ZV90ICopOwogCi1zdGF0aWMgaWRlX2RyaXZlcl90IGlkZV9jZHJvbV9kcml2ZXIgPSB7CitzdGF0aWMgc3RydWN0IGlkZV9kcml2ZXIgaWRlX2Nkcm9tX2RyaXZlciA9IHsKIAkuZ2VuX2RyaXZlciA9IHsKIAkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCQkubmFtZQkJPSAiaWRlLWNkcm9tIiwKQEAgLTE5MjcsNyArMTgyNSw2IEBACiAJLnZlcnNpb24JCT0gSURFQ0RfVkVSU0lPTiwKIAkuZG9fcmVxdWVzdAkJPSBpZGVfY2RfZG9fcmVxdWVzdCwKIAkuZW5kX3JlcXVlc3QJCT0gaWRlX2VuZF9yZXF1ZXN0LAotCS5lcnJvcgkJCT0gX19pZGVfZXJyb3IsCiAjaWZkZWYgQ09ORklHX0lERV9QUk9DX0ZTCiAJLnByb2NfZW50cmllcwkJPSBpZGVfY2RfcHJvY19lbnRyaWVzLAogCS5wcm9jX2RldnNldHMJCT0gaWRlX2NkX3Byb2NfZGV2c2V0cywKQEAgLTIwODIsNiArMTk3OSw3IEBACiAJfQogCiAJZHJpdmUtPmRlYnVnX21hc2sgPSBkZWJ1Z19tYXNrOworCWRyaXZlLT5pcnFfaGFuZGxlciA9IGNkcm9tX25ld3BjX2ludHI7CiAKIAlpbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNkcm9tX2luZm8pLCBHRlBfS0VSTkVMKTsKIAlpZiAoaW5mbyA9PSBOVUxMKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtY2QuaCBiL2RyaXZlcnMvaWRlL2lkZS1jZC5oCmluZGV4IGJmNjc2YjIuLmFjNDBkNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1jZC5oCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1jZC5oCkBAIC0zMywzMyArMzMsMzMgQEAKIAogLyogU3RydWN0dXJlIG9mIGEgTVNGIGNkcm9tIGFkZHJlc3MuICovCiBzdHJ1Y3QgYXRhcGlfbXNmIHsKLQlieXRlIHJlc2VydmVkOwotCWJ5dGUgbWludXRlOwotCWJ5dGUgc2Vjb25kOwotCWJ5dGUgZnJhbWU7CisJdTggcmVzZXJ2ZWQ7CisJdTggbWludXRlOworCXU4IHNlY29uZDsKKwl1OCBmcmFtZTsKIH07CiAKIC8qIFNwYWNlIHRvIGhvbGQgdGhlIGRpc2sgVE9DLiAqLwogI2RlZmluZSBNQVhfVFJBQ0tTIDk5CiBzdHJ1Y3QgYXRhcGlfdG9jX2hlYWRlciB7CiAJdW5zaWduZWQgc2hvcnQgdG9jX2xlbmd0aDsKLQlieXRlIGZpcnN0X3RyYWNrOwotCWJ5dGUgbGFzdF90cmFjazsKKwl1OCBmaXJzdF90cmFjazsKKwl1OCBsYXN0X3RyYWNrOwogfTsKIAogc3RydWN0IGF0YXBpX3RvY19lbnRyeSB7Ci0JYnl0ZSByZXNlcnZlZDE7CisJdTggcmVzZXJ2ZWQxOwogI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQotCV9fdTggYWRyICAgICA6IDQ7Ci0JX191OCBjb250cm9sIDogNDsKKwl1OCBhZHIgICAgIDogNDsKKwl1OCBjb250cm9sIDogNDsKICNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQotCV9fdTggY29udHJvbCA6IDQ7Ci0JX191OCBhZHIgICAgIDogNDsKKwl1OCBjb250cm9sIDogNDsKKwl1OCBhZHIgICAgIDogNDsKICNlbHNlCiAjZXJyb3IgIlBsZWFzZSBmaXggPGFzbS9ieXRlb3JkZXIuaD4iCiAjZW5kaWYKLQlieXRlIHRyYWNrOwotCWJ5dGUgcmVzZXJ2ZWQyOworCXU4IHRyYWNrOworCXU4IHJlc2VydmVkMjsKIAl1bmlvbiB7CiAJCXVuc2lnbmVkIGxiYTsKIAkJc3RydWN0IGF0YXBpX21zZiBtc2Y7CkBAIC03NywxMCArNzcsMTAgQEAKIAogLyogRXh0cmEgcGVyLWRldmljZSBpbmZvIGZvciBjZHJvbSBkcml2ZXMuICovCiBzdHJ1Y3QgY2Ryb21faW5mbyB7Ci0JaWRlX2RyaXZlX3QJKmRyaXZlOwotCWlkZV9kcml2ZXJfdAkqZHJpdmVyOwotCXN0cnVjdCBnZW5kaXNrCSpkaXNrOwotCXN0cnVjdCBrcmVmCWtyZWY7CisJaWRlX2RyaXZlX3QJCSpkcml2ZTsKKwlzdHJ1Y3QgaWRlX2RyaXZlcgkqZHJpdmVyOworCXN0cnVjdCBnZW5kaXNrCQkqZGlzazsKKwlzdHJ1Y3Qga3JlZgkJa3JlZjsKIAogCS8qIEJ1ZmZlciBmb3IgdGFibGUgb2YgY29udGVudHMuICBOVUxMIGlmIHdlIGhhdmVuJ3QgYWxsb2NhdGVkCiAJICAgYSBUT0MgYnVmZmVyIGZvciB0aGlzIGRldmljZSB5ZXQuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtZGlzay5jIGIvZHJpdmVycy9pZGUvaWRlLWRpc2suYwppbmRleCBlYjlmYWM0Li40MDg4YTYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtZGlzay5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1kaXNrLmMKQEAgLTg5LDcgKzg5LDcgQEAKIHN0YXRpYyBpZGVfc3RhcnRzdG9wX3QgX19pZGVfZG9fcndfZGlzayhpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSwKIAkJCQkJc2VjdG9yX3QgYmxvY2spCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAl1MTYgbnNlY3RvcnMJCT0gKHUxNilycS0+bnJfc2VjdG9yczsKIAl1OCBsYmE0OAkJPSAhIShkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX0xCQTQ4KTsKIAl1OCBkbWEJCQk9ICEhKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfVVNJTkdfRE1BKTsKQEAgLTE4Nyw3ICsxODcsNyBAQAogc3RhdGljIGlkZV9zdGFydHN0b3BfdCBpZGVfZG9fcndfZGlzayhpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSwKIAkJCQkgICAgICBzZWN0b3JfdCBibG9jaykKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCiAJQlVHX09OKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfQkxPQ0tFRCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1kbWEtc2ZmLmMgYi9kcml2ZXJzL2lkZS9pZGUtZG1hLXNmZi5jCmluZGV4IGY2ZDJkNDQuLjEyM2QzOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1kbWEtc2ZmLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWRtYS1zZmYuYwpAQCAtNTAsNiArNTAsMjcgQEAKIAlyZXR1cm4gMDsKIH0KIAordTggaWRlX2RtYV9zZmZfcmVhZF9zdGF0dXMoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfU1RBVFVTOworCisJaWYgKGh3aWYtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfTU1JTykKKwkJcmV0dXJuIHJlYWRiKCh2b2lkIF9faW9tZW0gKilhZGRyKTsKKwllbHNlCisJCXJldHVybiBpbmIoYWRkcik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpZGVfZG1hX3NmZl9yZWFkX3N0YXR1cyk7CisKK3N0YXRpYyB2b2lkIGlkZV9kbWFfc2ZmX3dyaXRlX3N0YXR1cyhpZGVfaHdpZl90ICpod2lmLCB1OCB2YWwpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX1NUQVRVUzsKKworCWlmIChod2lmLT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX01NSU8pCisJCXdyaXRlYih2YWwsICh2b2lkIF9faW9tZW0gKilhZGRyKTsKKwllbHNlCisJCW91dGIodmFsLCBhZGRyKTsKK30KKwogLyoqCiAgKglpZGVfZG1hX2hvc3Rfc2V0CS0JRW5hYmxlL2Rpc2FibGUgRE1BIG9uIGEgaG9zdAogICoJQGRyaXZlOiBkcml2ZSB0byBjb250cm9sCkBAIC02MiwxOCArODMsMTQgQEAKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJdTggdW5pdCA9IGRyaXZlLT5kbiAmIDE7Ci0JdTggZG1hX3N0YXQgPSBod2lmLT50cF9vcHMtPnJlYWRfc2ZmX2RtYV9zdGF0dXMoaHdpZik7CisJdTggZG1hX3N0YXQgPSBod2lmLT5kbWFfb3BzLT5kbWFfc2ZmX3JlYWRfc3RhdHVzKGh3aWYpOwogCiAJaWYgKG9uKQogCQlkbWFfc3RhdCB8PSAoMSA8PCAoNSArIHVuaXQpKTsKIAllbHNlCiAJCWRtYV9zdGF0ICY9IH4oMSA8PCAoNSArIHVuaXQpKTsKIAotCWlmIChod2lmLT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX01NSU8pCi0JCXdyaXRlYihkbWFfc3RhdCwKLQkJICAgICAgICh2b2lkIF9faW9tZW0gKikoaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX1NUQVRVUykpOwotCWVsc2UKLQkJb3V0YihkbWFfc3RhdCwgaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX1NUQVRVUyk7CisJaWRlX2RtYV9zZmZfd3JpdGVfc3RhdHVzKGh3aWYsIGRtYV9zdGF0KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlkZV9kbWFfaG9zdF9zZXQpOwogCkBAIC0xNzUsNyArMTkyLDcgQEAKIGludCBpZGVfZG1hX3NldHVwKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+aHdncm91cC0+cnE7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+cnE7CiAJdW5zaWduZWQgaW50IHJlYWRpbmcgPSBycV9kYXRhX2RpcihycSkgPyAwIDogQVRBX0RNQV9XUjsKIAl1OCBtbWlvID0gKGh3aWYtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfTU1JTykgPyAxIDogMDsKIAl1OCBkbWFfc3RhdDsKQEAgLTE4Nyw3ICsyMDQsNyBAQAogCX0KIAogCS8qIFBSRCB0YWJsZSAqLwotCWlmIChod2lmLT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX01NSU8pCisJaWYgKG1taW8pCiAJCXdyaXRlbChod2lmLT5kbWF0YWJsZV9kbWEsCiAJCSAgICAgICAodm9pZCBfX2lvbWVtICopKGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9UQUJMRV9PRlMpKTsKIAllbHNlCkBAIC0yMDAsMTUgKzIxNywxMCBAQAogCQlvdXRiKHJlYWRpbmcsIGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9DTUQpOwogCiAJLyogcmVhZCBETUEgc3RhdHVzIGZvciBJTlRSICYgRVJST1IgZmxhZ3MgKi8KLQlkbWFfc3RhdCA9IGh3aWYtPnRwX29wcy0+cmVhZF9zZmZfZG1hX3N0YXR1cyhod2lmKTsKKwlkbWFfc3RhdCA9IGh3aWYtPmRtYV9vcHMtPmRtYV9zZmZfcmVhZF9zdGF0dXMoaHdpZik7CiAKIAkvKiBjbGVhciBJTlRSICYgRVJST1IgZmxhZ3MgKi8KLQlpZiAobW1pbykKLQkJd3JpdGViKGRtYV9zdGF0IHwgQVRBX0RNQV9FUlIgfCBBVEFfRE1BX0lOVFIsCi0JCSAgICAgICAodm9pZCBfX2lvbWVtICopKGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9TVEFUVVMpKTsKLQllbHNlCi0JCW91dGIoZG1hX3N0YXQgfCBBVEFfRE1BX0VSUiB8IEFUQV9ETUFfSU5UUiwKLQkJICAgICBod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfU1RBVFVTKTsKKwlpZGVfZG1hX3NmZl93cml0ZV9zdGF0dXMoaHdpZiwgZG1hX3N0YXQgfCBBVEFfRE1BX0VSUiB8IEFUQV9ETUFfSU5UUik7CiAKIAlkcml2ZS0+d2FpdGluZ19mb3JfZG1hID0gMTsKIAlyZXR1cm4gMDsKQEAgLTIzMiw3ICsyNDQsNyBAQAogc3RhdGljIGludCBkbWFfdGltZXJfZXhwaXJ5KGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0JdTggZG1hX3N0YXQgPSBod2lmLT50cF9vcHMtPnJlYWRfc2ZmX2RtYV9zdGF0dXMoaHdpZik7CisJdTggZG1hX3N0YXQgPSBod2lmLT5kbWFfb3BzLT5kbWFfc2ZmX3JlYWRfc3RhdHVzKGh3aWYpOwogCiAJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6ICVzOiBETUEgc3RhdHVzICgweCUwMngpXG4iLAogCQlkcml2ZS0+bmFtZSwgX19mdW5jX18sIGRtYV9zdGF0KTsKQEAgLTI0MCw3ICsyNTIsNyBAQAogCWlmICgoZG1hX3N0YXQgJiAweDE4KSA9PSAweDE4KQkvKiBCVVNZIFN0dXBpZCBFYXJseSBUaW1lciAhISAqLwogCQlyZXR1cm4gV0FJVF9DTUQ7CiAKLQlod2lmLT5od2dyb3VwLT5leHBpcnkgPSBOVUxMOwkvKiBvbmUgZnJlZSByaWRlIGZvciBub3cgKi8KKwlod2lmLT5leHBpcnkgPSBOVUxMOwkvKiBvbmUgZnJlZSByaWRlIGZvciBub3cgKi8KIAogCWlmIChkbWFfc3RhdCAmIEFUQV9ETUFfRVJSKQkvKiBFUlJPUiAqLwogCQlyZXR1cm4gLTE7CkBAIC0yODksMTMgKzMwMSwxMiBAQAogaW50IGlkZV9kbWFfZW5kKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0JdTggbW1pbyA9IChod2lmLT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX01NSU8pID8gMSA6IDA7CiAJdTggZG1hX3N0YXQgPSAwLCBkbWFfY21kID0gMCwgbWFzazsKIAogCWRyaXZlLT53YWl0aW5nX2Zvcl9kbWEgPSAwOwogCiAJLyogc3RvcCBETUEgKi8KLQlpZiAobW1pbykgeworCWlmIChod2lmLT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX01NSU8pIHsKIAkJZG1hX2NtZCA9IHJlYWRiKCh2b2lkIF9faW9tZW0gKikoaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX0NNRCkpOwogCQl3cml0ZWIoZG1hX2NtZCAmIH5BVEFfRE1BX1NUQVJULAogCQkgICAgICAgKHZvaWQgX19pb21lbSAqKShod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfQ01EKSk7CkBAIC0zMDUsMTUgKzMxNiwxMCBAQAogCX0KIAogCS8qIGdldCBETUEgc3RhdHVzICovCi0JZG1hX3N0YXQgPSBod2lmLT50cF9vcHMtPnJlYWRfc2ZmX2RtYV9zdGF0dXMoaHdpZik7CisJZG1hX3N0YXQgPSBod2lmLT5kbWFfb3BzLT5kbWFfc2ZmX3JlYWRfc3RhdHVzKGh3aWYpOwogCi0JaWYgKG1taW8pCi0JCS8qIGNsZWFyIHRoZSBJTlRSICYgRVJST1IgYml0cyAqLwotCQl3cml0ZWIoZG1hX3N0YXQgfCBBVEFfRE1BX0VSUiB8IEFUQV9ETUFfSU5UUiwKLQkJICAgICAgICh2b2lkIF9faW9tZW0gKikoaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX1NUQVRVUykpOwotCWVsc2UKLQkJb3V0YihkbWFfc3RhdCB8IEFUQV9ETUFfRVJSIHwgQVRBX0RNQV9JTlRSLAotCQkgICAgIGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9TVEFUVVMpOworCS8qIGNsZWFyIElOVFIgJiBFUlJPUiBiaXRzICovCisJaWRlX2RtYV9zZmZfd3JpdGVfc3RhdHVzKGh3aWYsIGRtYV9zdGF0IHwgQVRBX0RNQV9FUlIgfCBBVEFfRE1BX0lOVFIpOwogCiAJLyogcHVyZ2UgRE1BIG1hcHBpbmdzICovCiAJaWRlX2Rlc3Ryb3lfZG1hdGFibGUoZHJpdmUpOwpAQCAtMzMxLDcgKzMzNyw3IEBACiBpbnQgaWRlX2RtYV90ZXN0X2lycShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwotCXU4IGRtYV9zdGF0ID0gaHdpZi0+dHBfb3BzLT5yZWFkX3NmZl9kbWFfc3RhdHVzKGh3aWYpOworCXU4IGRtYV9zdGF0ID0gaHdpZi0+ZG1hX29wcy0+ZG1hX3NmZl9yZWFkX3N0YXR1cyhod2lmKTsKIAogCXJldHVybiAoZG1hX3N0YXQgJiBBVEFfRE1BX0lOVFIpID8gMSA6IDA7CiB9CkBAIC0zNDYsNSArMzUyLDYgQEAKIAkuZG1hX3Rlc3RfaXJxCQk9IGlkZV9kbWFfdGVzdF9pcnEsCiAJLmRtYV90aW1lb3V0CQk9IGlkZV9kbWFfdGltZW91dCwKIAkuZG1hX2xvc3RfaXJxCQk9IGlkZV9kbWFfbG9zdF9pcnEsCisJLmRtYV9zZmZfcmVhZF9zdGF0dXMJPSBpZGVfZG1hX3NmZl9yZWFkX3N0YXR1cywKIH07CiBFWFBPUlRfU1lNQk9MX0dQTChzZmZfZG1hX29wcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtZG1hLmMgYi9kcml2ZXJzL2lkZS9pZGUtZG1hLmMKaW5kZXggZmZmZDExNy4uNzJlYmFiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWRtYS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1kbWEuYwpAQCAtOTYsNyArOTYsNyBAQAogCiAJaWYgKE9LX1NUQVQoc3RhdCwgRFJJVkVfUkVBRFksIGRyaXZlLT5iYWRfd3N0YXQgfCBBVEFfRFJRKSkgewogCQlpZiAoIWRtYV9zdGF0KSB7Ci0JCQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5od2dyb3VwLT5ycTsKKwkJCXN0cnVjdCByZXF1ZXN0ICpycSA9IGh3aWYtPnJxOwogCiAJCQl0YXNrX2VuZF9yZXF1ZXN0KGRyaXZlLCBycSwgc3RhdCk7CiAJCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtZmxvcHB5LmMgYi9kcml2ZXJzL2lkZS9pZGUtZmxvcHB5LmMKaW5kZXggMGE0OGUyZC4uM2VhYjFjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWZsb3BweS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1mbG9wcHkuYwpAQCAtNzEsNyArNzEsNyBAQAogc3RhdGljIGludCBpZGVfZmxvcHB5X2VuZF9yZXF1ZXN0KGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IHVwdG9kYXRlLCBpbnQgbnNlY3MpCiB7CiAJc3RydWN0IGlkZV9kaXNrX29iaiAqZmxvcHB5ID0gZHJpdmUtPmRyaXZlcl9kYXRhOwotCXN0cnVjdCByZXF1ZXN0ICpycSA9IEhXR1JPVVAoZHJpdmUpLT5ycTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBkcml2ZS0+aHdpZi0+cnE7CiAJaW50IGVycm9yOwogCiAJaWRlX2RlYnVnX2xvZyhJREVfREJHX0ZVTkMsICJDYWxsICVzXG4iLCBfX2Z1bmNfXyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtZ2QuYyBiL2RyaXZlcnMvaWRlL2lkZS1nZC5jCmluZGV4IGI4MDc4YjMuLjc4NTdiMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1nZC5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1nZC5jCkBAIC0xNDksNyArMTQ5LDcgQEAKIAlyZXR1cm4gZHJpdmUtPmRpc2tfb3BzLT5lbmRfcmVxdWVzdChkcml2ZSwgdXB0b2RhdGUsIG5yc2Vjcyk7CiB9CiAKLXN0YXRpYyBpZGVfZHJpdmVyX3QgaWRlX2dkX2RyaXZlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgaWRlX2RyaXZlciBpZGVfZ2RfZHJpdmVyID0gewogCS5nZW5fZHJpdmVyID0gewogCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJCS5uYW1lCQk9ICJpZGUtZ2QiLApAQCAtMTYyLDcgKzE2Miw2IEBACiAJLnZlcnNpb24JCT0gSURFX0dEX1ZFUlNJT04sCiAJLmRvX3JlcXVlc3QJCT0gaWRlX2dkX2RvX3JlcXVlc3QsCiAJLmVuZF9yZXF1ZXN0CQk9IGlkZV9nZF9lbmRfcmVxdWVzdCwKLQkuZXJyb3IJCQk9IF9faWRlX2Vycm9yLAogI2lmZGVmIENPTkZJR19JREVfUFJPQ19GUwogCS5wcm9jX2VudHJpZXMJCT0gaWRlX2Rpc2tfcHJvY19lbnRyaWVzLAogCS5wcm9jX2RldnNldHMJCT0gaWRlX2Rpc2tfcHJvY19kZXZzZXRzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWdkLmggYi9kcml2ZXJzL2lkZS9pZGUtZ2QuaAppbmRleCA3ZDNkMTAxLi5hODY3NzlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtZ2QuaAorKysgYi9kcml2ZXJzL2lkZS9pZGUtZ2QuaApAQCAtMTQsMTEgKzE0LDExIEBACiAjZW5kaWYKIAogc3RydWN0IGlkZV9kaXNrX29iaiB7Ci0JaWRlX2RyaXZlX3QJKmRyaXZlOwotCWlkZV9kcml2ZXJfdAkqZHJpdmVyOwotCXN0cnVjdCBnZW5kaXNrCSpkaXNrOwotCXN0cnVjdCBrcmVmCWtyZWY7Ci0JdW5zaWduZWQgaW50CW9wZW5lcnM7CS8qIHByb3RlY3RlZCBieSBCS0wgZm9yIG5vdyAqLworCWlkZV9kcml2ZV90CQkqZHJpdmU7CisJc3RydWN0IGlkZV9kcml2ZXIJKmRyaXZlcjsKKwlzdHJ1Y3QgZ2VuZGlzawkJKmRpc2s7CisJc3RydWN0IGtyZWYJCWtyZWY7CisJdW5zaWduZWQgaW50CQlvcGVuZXJzOwkvKiBwcm90ZWN0ZWQgYnkgQktMIGZvciBub3cgKi8KIAogCS8qIExhc3QgZmFpbGVkIHBhY2tldCBjb21tYW5kICovCiAJc3RydWN0IGlkZV9hdGFwaV9wYyAqZmFpbGVkX3BjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWg4MzAwLmMgYi9kcml2ZXJzL2lkZS9pZGUtaDgzMDAuYwppbmRleCBlMmNkZDJlLi45MjcwZDMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtaDgzMDAuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtaDgzMDAuYwpAQCAtMTU5LDcgKzE1OSw2IEBACiAJLmV4ZWNfY29tbWFuZAkJPSBpZGVfZXhlY19jb21tYW5kLAogCS5yZWFkX3N0YXR1cwkJPSBpZGVfcmVhZF9zdGF0dXMsCiAJLnJlYWRfYWx0c3RhdHVzCQk9IGlkZV9yZWFkX2FsdHN0YXR1cywKLQkucmVhZF9zZmZfZG1hX3N0YXR1cwk9IGlkZV9yZWFkX3NmZl9kbWFfc3RhdHVzLAogCiAJLnNldF9pcnEJCT0gaWRlX3NldF9pcnEsCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1pby5jIGIvZHJpdmVycy9pZGUvaWRlLWlvLmMKaW5kZXggMWMzNmE4ZS4uY2MxNjMzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWlvLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWlvLmMKQEAgLTg4LDcgKzg4LDcgQEAKIAkJcmV0ID0gMDsKIAogCWlmIChyZXQgPT0gMCAmJiBkZXF1ZXVlKQotCQlkcml2ZS0+aHdpZi0+aHdncm91cC0+cnEgPSBOVUxMOworCQlkcml2ZS0+aHdpZi0+cnEgPSBOVUxMOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTEwNyw3ICsxMDcsNyBAQAogaW50IGlkZV9lbmRfcmVxdWVzdCAoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgdXB0b2RhdGUsIGludCBucl9zZWN0b3JzKQogewogCXVuc2lnbmVkIGludCBucl9ieXRlcyA9IG5yX3NlY3RvcnMgPDwgOTsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBkcml2ZS0+aHdpZi0+aHdncm91cC0+cnE7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gZHJpdmUtPmh3aWYtPnJxOwogCiAJaWYgKCFucl9ieXRlcykgewogCQlpZiAoYmxrX3BjX3JlcXVlc3QocnEpKQpAQCAtMTYwLDggKzE2MCw4IEBACiAgCiB2b2lkIGlkZV9lbmRfZHJpdmVfY21kIChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IHN0YXQsIHU4IGVycikKIHsKLQlpZGVfaHdncm91cF90ICpod2dyb3VwID0gZHJpdmUtPmh3aWYtPmh3Z3JvdXA7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gaHdncm91cC0+cnE7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IGh3aWYtPnJxOwogCiAJaWYgKHJxLT5jbWRfdHlwZSA9PSBSRVFfVFlQRV9BVEFfVEFTS0ZJTEUpIHsKIAkJaWRlX3Rhc2tfdCAqdGFzayA9IChpZGVfdGFza190ICopcnEtPnNwZWNpYWw7CkBAIC0xODYsNyArMTg2LDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCWh3Z3JvdXAtPnJxID0gTlVMTDsKKwlod2lmLT5ycSA9IE5VTEw7CiAKIAlycS0+ZXJyb3JzID0gZXJyOwogCkBAIC0xOTksOSArMTk5LDkgQEAKIHN0YXRpYyB2b2lkIGlkZV9raWxsX3JxKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxKQogewogCWlmIChycS0+cnFfZGlzaykgewotCQlpZGVfZHJpdmVyX3QgKmRydjsKKwkJc3RydWN0IGlkZV9kcml2ZXIgKmRydjsKIAotCQlkcnYgPSAqKGlkZV9kcml2ZXJfdCAqKilycS0+cnFfZGlzay0+cHJpdmF0ZV9kYXRhOworCQlkcnYgPSAqKHN0cnVjdCBpZGVfZHJpdmVyICoqKXJxLT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7CiAJCWRydi0+ZW5kX3JlcXVlc3QoZHJpdmUsIDAsIDApOwogCX0gZWxzZQogCQlpZGVfZW5kX3JlcXVlc3QoZHJpdmUsIDAsIDApOwpAQCAtMjkxLDcgKzI5MSw3IEBACiAJcmV0dXJuIGlkZV9zdG9wcGVkOwogfQogCi1pZGVfc3RhcnRzdG9wX3QKK3N0YXRpYyBpZGVfc3RhcnRzdG9wX3QKIF9faWRlX2Vycm9yKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxLCB1OCBzdGF0LCB1OCBlcnIpCiB7CiAJaWYgKGRyaXZlLT5tZWRpYSA9PSBpZGVfZGlzaykKQEAgLTI5OSw4ICsyOTksNiBAQAogCXJldHVybiBpZGVfYXRhcGlfZXJyb3IoZHJpdmUsIHJxLCBzdGF0LCBlcnIpOwogfQogCi1FWFBPUlRfU1lNQk9MX0dQTChfX2lkZV9lcnJvcik7Ci0KIC8qKgogICoJaWRlX2Vycm9yCS0JaGFuZGxlIGFuIGVycm9yIG9uIHRoZSBJREUKICAqCUBkcml2ZTogZHJpdmUgdGhlIGVycm9yIG9jY3VycmVkIG9uCkBAIC0zMjEsNyArMzE5LDggQEAKIAogCWVyciA9IGlkZV9kdW1wX3N0YXR1cyhkcml2ZSwgbXNnLCBzdGF0KTsKIAotCWlmICgocnEgPSBIV0dST1VQKGRyaXZlKS0+cnEpID09IE5VTEwpCisJcnEgPSBkcml2ZS0+aHdpZi0+cnE7CisJaWYgKHJxID09IE5VTEwpCiAJCXJldHVybiBpZGVfc3RvcHBlZDsKIAogCS8qIHJldHJ5IG9ubHkgIm5vcm1hbCIgSS9POiAqLwpAQCAtMzMxLDE1ICszMzAsOCBAQAogCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CiAJfQogCi0JaWYgKHJxLT5ycV9kaXNrKSB7Ci0JCWlkZV9kcml2ZXJfdCAqZHJ2OwotCi0JCWRydiA9ICooaWRlX2RyaXZlcl90ICoqKXJxLT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7Ci0JCXJldHVybiBkcnYtPmVycm9yKGRyaXZlLCBycSwgc3RhdCwgZXJyKTsKLQl9IGVsc2UKLQkJcmV0dXJuIF9faWRlX2Vycm9yKGRyaXZlLCBycSwgc3RhdCwgZXJyKTsKKwlyZXR1cm4gX19pZGVfZXJyb3IoZHJpdmUsIHJxLCBzdGF0LCBlcnIpOwogfQotCiBFWFBPUlRfU1lNQk9MX0dQTChpZGVfZXJyb3IpOwogCiBzdGF0aWMgdm9pZCBpZGVfdGZfc2V0X3NwZWNpZnlfY21kKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IGlkZV90YXNrZmlsZSAqdGYpCkBAIC00NjIsNyArNDU0LDcgQEAKIHN0YXRpYyBpZGVfc3RhcnRzdG9wX3QgZXhlY3V0ZV9kcml2ZV9jbWQgKGlkZV9kcml2ZV90ICpkcml2ZSwKIAkJc3RydWN0IHJlcXVlc3QgKnJxKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJaWRlX3Rhc2tfdCAqdGFzayA9IHJxLT5zcGVjaWFsOwogCiAJaWYgKHRhc2spIHsKQEAgLTU4Niw3ICs1NzgsNyBAQAogCiAjaWZkZWYgREVCVUcKIAlwcmludGsoIiVzOiBzdGFydF9yZXF1ZXN0OiBjdXJyZW50PTB4JTA4bHhcbiIsCi0JCUhXSUYoZHJpdmUpLT5uYW1lLCAodW5zaWduZWQgbG9uZykgcnEpOworCQlkcml2ZS0+aHdpZi0+bmFtZSwgKHVuc2lnbmVkIGxvbmcpIHJxKTsKICNlbmRpZgogCiAJLyogYmFpbCBlYXJseSBpZiB3ZSd2ZSBleGNlZWRlZCBtYXhfZmFpbHVyZXMgKi8KQEAgLTYwNSw3ICs1OTcsNyBAQAogCQlyZXR1cm4gc3RhcnRzdG9wOwogCX0KIAlpZiAoIWRyaXZlLT5zcGVjaWFsLmFsbCkgewotCQlpZGVfZHJpdmVyX3QgKmRydjsKKwkJc3RydWN0IGlkZV9kcml2ZXIgKmRydjsKIAogCQkvKgogCQkgKiBXZSByZXNldCB0aGUgZHJpdmUgc28gd2UgbmVlZCB0byBpc3N1ZSBhIFNFVEZFQVRVUkVTLgpAQCAtNjM4LDcgKzYzMCw3IEBACiAJCQkgKi8KIAkJCXJldHVybiBpZGVfc3BlY2lhbF9ycShkcml2ZSwgcnEpOwogCi0JCWRydiA9ICooaWRlX2RyaXZlcl90ICoqKXJxLT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7CisJCWRydiA9ICooc3RydWN0IGlkZV9kcml2ZXIgKiopcnEtPnJxX2Rpc2stPnByaXZhdGVfZGF0YTsKIAogCQlyZXR1cm4gZHJ2LT5kb19yZXF1ZXN0KGRyaXZlLCBycSwgcnEtPnNlY3Rvcik7CiAJfQpAQCAtNjU0LDcgKzY0Niw3IEBACiAgKglAdGltZW91dDogdGltZSB0byBzdGFsbCBmb3IgKGppZmZpZXMpCiAgKgogICoJaWRlX3N0YWxsX3F1ZXVlKCkgY2FuIGJlIHVzZWQgYnkgYSBkcml2ZSB0byBnaXZlIGV4Y2VzcyBiYW5kd2lkdGggYmFjawotICoJdG8gdGhlIGh3Z3JvdXAgYnkgc2xlZXBpbmcgZm9yIHRpbWVvdXQgamlmZmllcy4KKyAqCXRvIHRoZSBwb3J0IGJ5IHNsZWVwaW5nIGZvciB0aW1lb3V0IGppZmZpZXMuCiAgKi8KICAKIHZvaWQgaWRlX3N0YWxsX3F1ZXVlIChpZGVfZHJpdmVfdCAqZHJpdmUsIHVuc2lnbmVkIGxvbmcgdGltZW91dCkKQEAgLTY2Niw0NSArNjU4LDUzIEBACiB9CiBFWFBPUlRfU1lNQk9MKGlkZV9zdGFsbF9xdWV1ZSk7CiAKK3N0YXRpYyBpbmxpbmUgaW50IGlkZV9sb2NrX3BvcnQoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwlpZiAoaHdpZi0+YnVzeSkKKwkJcmV0dXJuIDE7CisKKwlod2lmLT5idXN5ID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaWRlX3VubG9ja19wb3J0KGlkZV9od2lmX3QgKmh3aWYpCit7CisJaHdpZi0+YnVzeSA9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlkZV9sb2NrX2hvc3Qoc3RydWN0IGlkZV9ob3N0ICpob3N0LCBpZGVfaHdpZl90ICpod2lmKQoreworCWludCByYyA9IDA7CisKKwlpZiAoaG9zdC0+aG9zdF9mbGFncyAmIElERV9IRkxBR19TRVJJQUxJWkUpIHsKKwkJcmMgPSB0ZXN0X2FuZF9zZXRfYml0X2xvY2soSURFX0hPU1RfQlVTWSwgJmhvc3QtPmhvc3RfYnVzeSk7CisJCWlmIChyYyA9PSAwKSB7CisJCQkvKiBmb3IgYXRhcmkgb25seSAqLworCQkJaWRlX2dldF9sb2NrKGlkZV9pbnRyLCBod2lmKTsKKwkJfQorCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpZGVfdW5sb2NrX2hvc3Qoc3RydWN0IGlkZV9ob3N0ICpob3N0KQoreworCWlmIChob3N0LT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX1NFUklBTElaRSkgeworCQkvKiBmb3IgYXRhcmkgb25seSAqLworCQlpZGVfcmVsZWFzZV9sb2NrKCk7CisJCWNsZWFyX2JpdF91bmxvY2soSURFX0hPU1RfQlVTWSwgJmhvc3QtPmhvc3RfYnVzeSk7CisJfQorfQorCiAvKgotICogSXNzdWUgYSBuZXcgcmVxdWVzdCB0byBhIGRyaXZlIGZyb20gaHdncm91cAotICoKLSAqIEEgaHdncm91cCBpcyBhIHNlcmlhbGl6ZWQgZ3JvdXAgb2YgSURFIGludGVyZmFjZXMuICBVc3VhbGx5IHRoZXJlIGlzCi0gKiBleGFjdGx5IG9uZSBod2lmIChpbnRlcmZhY2UpIHBlciBod2dyb3VwLCBidXQgYnVnZ3kgY29udHJvbGxlcnMgKGVnLiBDTUQ2NDApCi0gKiBtYXkgaGF2ZSBib3RoIGludGVyZmFjZXMgaW4gYSBzaW5nbGUgaHdncm91cCB0byAic2VyaWFsaXplIiBhY2Nlc3MuCi0gKiBPciBwb3NzaWJseSBtdWx0aXBsZSBJU0EgaW50ZXJmYWNlcyBjYW4gc2hhcmUgYSBjb21tb24gSVJRIGJ5IGJlaW5nIGdyb3VwZWQKLSAqIHRvZ2V0aGVyIGludG8gb25lIGh3Z3JvdXAgZm9yIHNlcmlhbGl6ZWQgYWNjZXNzLgotICoKLSAqIE5vdGUgYWxzbyB0aGF0IHNldmVyYWwgaHdncm91cHMgY2FuIGVuZCB1cCBzaGFyaW5nIGEgc2luZ2xlIElSUSwKLSAqIHBvc3NpYmx5IGFsb25nIHdpdGggbWFueSBvdGhlciBkZXZpY2VzLiAgVGhpcyBpcyBlc3BlY2lhbGx5IGNvbW1vbiBpbgotICogUENJLWJhc2VkIHN5c3RlbXMgd2l0aCBvZmYtYm9hcmQgSURFIGNvbnRyb2xsZXIgY2FyZHMuCi0gKgotICogVGhlIElERSBkcml2ZXIgdXNlcyBhIHBlci1od2dyb3VwIGxvY2sgdG8gcHJvdGVjdCB0aGUgaHdncm91cC0+YnVzeSBmbGFnLgotICoKLSAqIFRoZSBmaXJzdCB0aHJlYWQgaW50byB0aGUgZHJpdmVyIGZvciBhIHBhcnRpY3VsYXIgaHdncm91cCBzZXRzIHRoZQotICogaHdncm91cC0+YnVzeSBmbGFnIHRvIGluZGljYXRlIHRoYXQgdGhpcyBod2dyb3VwIGlzIG5vdyBhY3RpdmUsCi0gKiBhbmQgdGhlbiBpbml0aWF0ZXMgcHJvY2Vzc2luZyBvZiB0aGUgdG9wIHJlcXVlc3QgZnJvbSB0aGUgcmVxdWVzdCBxdWV1ZS4KLSAqCi0gKiBPdGhlciB0aHJlYWRzIGF0dGVtcHRpbmcgZW50cnkgbm90aWNlIHRoZSBidXN5IHNldHRpbmcsIGFuZCB3aWxsIHNpbXBseQotICogcXVldWUgdGhlaXIgbmV3IHJlcXVlc3RzIGFuZCBleGl0IGltbWVkaWF0ZWx5LiAgTm90ZSB0aGF0IGh3Z3JvdXAtPmJ1c3kKLSAqIHJlbWFpbnMgc2V0IGV2ZW4gd2hlbiB0aGUgZHJpdmVyIGlzIG1lcmVseSBhd2FpdGluZyB0aGUgbmV4dCBpbnRlcnJ1cHQuCi0gKiBUaHVzLCB0aGUgbWVhbmluZyBpcyAidGhpcyBod2dyb3VwIGlzIGJ1c3kgcHJvY2Vzc2luZyBhIHJlcXVlc3QiLgotICoKLSAqIFdoZW4gcHJvY2Vzc2luZyBvZiBhIHJlcXVlc3QgY29tcGxldGVzLCB0aGUgY29tcGxldGluZyB0aHJlYWQgb3IgSVJRLWhhbmRsZXIKLSAqIHdpbGwgc3RhcnQgdGhlIG5leHQgcmVxdWVzdCBmcm9tIHRoZSBxdWV1ZS4gIElmIG5vIG1vcmUgd29yayByZW1haW5zLAotICogdGhlIGRyaXZlciB3aWxsIGNsZWFyIHRoZSBod2dyb3VwLT5idXN5IGZsYWcgYW5kIGV4aXQuCi0gKgotICogVGhlIHBlci1od2dyb3VwIHNwaW5sb2NrIGlzIHVzZWQgdG8gcHJvdGVjdCBhbGwgYWNjZXNzIHRvIHRoZQotICogaHdncm91cC0+YnVzeSBmbGFnLCBidXQgaXMgb3RoZXJ3aXNlIG5vdCBuZWVkZWQgZm9yIG1vc3QgcHJvY2Vzc2luZyBpbgotICogdGhlIGRyaXZlci4gIFRoaXMgbWFrZXMgdGhlIGRyaXZlciBtdWNoIG1vcmUgZnJpZW5kbGllciB0byBzaGFyZWQgSVJRcwotICogdGhhbiBwcmV2aW91cyBkZXNpZ25zLCB3aGlsZSByZW1haW5pbmcgMTAwJSAoPykgU01QIHNhZmUgYW5kIGNhcGFibGUuCisgKiBJc3N1ZSBhIG5ldyByZXF1ZXN0IHRvIGEgZGV2aWNlLgogICovCiB2b2lkIGRvX2lkZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogewogCWlkZV9kcml2ZV90CSpkcml2ZSA9IHEtPnF1ZXVlZGF0YTsKIAlpZGVfaHdpZl90CSpod2lmID0gZHJpdmUtPmh3aWY7Ci0JaWRlX2h3Z3JvdXBfdAkqaHdncm91cCA9IGh3aWYtPmh3Z3JvdXA7Ci0Jc3RydWN0IHJlcXVlc3QJKnJxOworCXN0cnVjdCBpZGVfaG9zdCAqaG9zdCA9IGh3aWYtPmhvc3Q7CisJc3RydWN0IHJlcXVlc3QJKnJxID0gTlVMTDsKIAlpZGVfc3RhcnRzdG9wX3QJc3RhcnRzdG9wOwogCiAJLyoKQEAgLTcyMSwzMiArNzIxLDQwIEBACiAJCWJsa19yZW1vdmVfcGx1ZyhxKTsKIAogCXNwaW5fdW5sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKLQlzcGluX2xvY2tfaXJxKCZod2dyb3VwLT5sb2NrKTsKIAotCWlmICghaWRlX2xvY2tfaHdncm91cChod2dyb3VwKSkgeworCWlmIChpZGVfbG9ja19ob3N0KGhvc3QsIGh3aWYpKQorCQlnb3RvIHBsdWdfZGV2aWNlXzI7CisKKwlzcGluX2xvY2tfaXJxKCZod2lmLT5sb2NrKTsKKworCWlmICghaWRlX2xvY2tfcG9ydChod2lmKSkgeworCQlpZGVfaHdpZl90ICpwcmV2X3BvcnQ7CiByZXBlYXQ6Ci0JCWh3Z3JvdXAtPnJxID0gTlVMTDsKKwkJcHJldl9wb3J0ID0gaHdpZi0+aG9zdC0+Y3VyX3BvcnQ7CisJCWh3aWYtPnJxID0gTlVMTDsKIAogCQlpZiAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19TTEVFUElORykgewogCQkJaWYgKHRpbWVfYmVmb3JlKGRyaXZlLT5zbGVlcCwgamlmZmllcykpIHsKLQkJCQlpZGVfdW5sb2NrX2h3Z3JvdXAoaHdncm91cCk7CisJCQkJaWRlX3VubG9ja19wb3J0KGh3aWYpOwogCQkJCWdvdG8gcGx1Z19kZXZpY2U7CiAJCQl9CiAJCX0KIAotCQlpZiAoaHdpZiAhPSBod2dyb3VwLT5od2lmKSB7CisJCWlmICgoaHdpZi0+aG9zdC0+aG9zdF9mbGFncyAmIElERV9IRkxBR19TRVJJQUxJWkUpICYmCisJCSAgICBod2lmICE9IHByZXZfcG9ydCkgewogCQkJLyoKLQkJCSAqIHNldCBuSUVOIGZvciBwcmV2aW91cyBod2lmLCBkcml2ZXMgaW4gdGhlCisJCQkgKiBzZXQgbklFTiBmb3IgcHJldmlvdXMgcG9ydCwgZHJpdmVzIGluIHRoZQogCQkJICogcXVpcmtfbGlzdCBtYXkgbm90IGxpa2UgaW50ciBzZXR1cHMvY2xlYW51cHMKIAkJCSAqLwotCQkJaWYgKGRyaXZlLT5xdWlya19saXN0ID09IDApCi0JCQkJaHdpZi0+dHBfb3BzLT5zZXRfaXJxKGh3aWYsIDApOworCQkJaWYgKHByZXZfcG9ydCAmJiBwcmV2X3BvcnQtPmN1cl9kZXYtPnF1aXJrX2xpc3QgPT0gMCkKKwkJCQlwcmV2X3BvcnQtPnRwX29wcy0+c2V0X2lycShwcmV2X3BvcnQsIDApOworCisJCQlod2lmLT5ob3N0LT5jdXJfcG9ydCA9IGh3aWY7CiAJCX0KLQkJaHdncm91cC0+aHdpZiA9IGh3aWY7Ci0JCWh3Z3JvdXAtPmRyaXZlID0gZHJpdmU7CisJCWh3aWYtPmN1cl9kZXYgPSBkcml2ZTsKIAkJZHJpdmUtPmRldl9mbGFncyAmPSB+KElERV9ERkxBR19TTEVFUElORyB8IElERV9ERkxBR19QQVJLRUQpOwogCi0JCXNwaW5fdW5sb2NrX2lycSgmaHdncm91cC0+bG9jayk7CisJCXNwaW5fdW5sb2NrX2lycSgmaHdpZi0+bG9jayk7CiAJCXNwaW5fbG9ja19pcnEocS0+cXVldWVfbG9jayk7CiAJCS8qCiAJCSAqIHdlIGtub3cgdGhhdCB0aGUgcXVldWUgaXNuJ3QgZW1wdHksIGJ1dCB0aGlzIGNhbiBoYXBwZW4KQEAgLTc1NCwxMCArNzYyLDEwIEBACiAJCSAqLwogCQlycSA9IGVsdl9uZXh0X3JlcXVlc3QoZHJpdmUtPnF1ZXVlKTsKIAkJc3Bpbl91bmxvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwotCQlzcGluX2xvY2tfaXJxKCZod2dyb3VwLT5sb2NrKTsKKwkJc3Bpbl9sb2NrX2lycSgmaHdpZi0+bG9jayk7CiAKIAkJaWYgKCFycSkgewotCQkJaWRlX3VubG9ja19od2dyb3VwKGh3Z3JvdXApOworCQkJaWRlX3VubG9ja19wb3J0KGh3aWYpOwogCQkJZ290byBvdXQ7CiAJCX0KIApAQCAtNzc4LDI3ICs3ODYsMzEgQEAKIAkJICAgIGJsa19wbV9yZXF1ZXN0KHJxKSA9PSAwICYmCiAJCSAgICAocnEtPmNtZF9mbGFncyAmIFJFUV9QUkVFTVBUKSA9PSAwKSB7CiAJCQkvKiB0aGVyZSBzaG91bGQgYmUgbm8gcGVuZGluZyBjb21tYW5kIGF0IHRoaXMgcG9pbnQgKi8KLQkJCWlkZV91bmxvY2tfaHdncm91cChod2dyb3VwKTsKKwkJCWlkZV91bmxvY2tfcG9ydChod2lmKTsKIAkJCWdvdG8gcGx1Z19kZXZpY2U7CiAJCX0KIAotCQlod2dyb3VwLT5ycSA9IHJxOworCQlod2lmLT5ycSA9IHJxOwogCi0JCXNwaW5fdW5sb2NrX2lycSgmaHdncm91cC0+bG9jayk7CisJCXNwaW5fdW5sb2NrX2lycSgmaHdpZi0+bG9jayk7CiAJCXN0YXJ0c3RvcCA9IHN0YXJ0X3JlcXVlc3QoZHJpdmUsIHJxKTsKLQkJc3Bpbl9sb2NrX2lycSgmaHdncm91cC0+bG9jayk7CisJCXNwaW5fbG9ja19pcnEoJmh3aWYtPmxvY2spOwogCiAJCWlmIChzdGFydHN0b3AgPT0gaWRlX3N0b3BwZWQpCiAJCQlnb3RvIHJlcGVhdDsKIAl9IGVsc2UKIAkJZ290byBwbHVnX2RldmljZTsKIG91dDoKLQlzcGluX3VubG9ja19pcnEoJmh3Z3JvdXAtPmxvY2spOworCXNwaW5fdW5sb2NrX2lycSgmaHdpZi0+bG9jayk7CisJaWYgKHJxID09IE5VTEwpCisJCWlkZV91bmxvY2tfaG9zdChob3N0KTsKIAlzcGluX2xvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwogCXJldHVybjsKIAogcGx1Z19kZXZpY2U6Ci0Jc3Bpbl91bmxvY2tfaXJxKCZod2dyb3VwLT5sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmh3aWYtPmxvY2spOworCWlkZV91bmxvY2tfaG9zdChob3N0KTsKK3BsdWdfZGV2aWNlXzI6CiAJc3Bpbl9sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKIAogCWlmICghZWx2X3F1ZXVlX2VtcHR5KHEpKQpAQCAtODA2LDEzICs4MTgsMTMgQEAKIH0KIAogLyoKLSAqIHVuLWJ1c3kgdGhlIGh3Z3JvdXAgZXRjLCBhbmQgY2xlYXIgYW55IHBlbmRpbmcgRE1BIHN0YXR1cy4gd2Ugd2FudCB0bworICogdW4tYnVzeSB0aGUgcG9ydCBldGMsIGFuZCBjbGVhciBhbnkgcGVuZGluZyBETUEgc3RhdHVzLiB3ZSB3YW50IHRvCiAgKiByZXRyeSB0aGUgY3VycmVudCByZXF1ZXN0IGluIHBpbyBtb2RlIGluc3RlYWQgb2Ygcmlza2luZyB0b3NzaW5nIGl0CiAgKiBhbGwgYXdheQogICovCiBzdGF0aWMgaWRlX3N0YXJ0c3RvcF90IGlkZV9kbWFfdGltZW91dF9yZXRyeShpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBlcnJvcikKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXN0cnVjdCByZXF1ZXN0ICpycTsKIAlpZGVfc3RhcnRzdG9wX3QgcmV0ID0gaWRlX3N0b3BwZWQ7CiAKQEAgLTg0MCwxNSArODUyLDE0IEBACiAJaWRlX2RtYV9vZmZfcXVpZXRseShkcml2ZSk7CiAKIAkvKgotCSAqIHVuLWJ1c3kgZHJpdmUgZXRjIChod2dyb3VwLT5idXN5IGlzIGNsZWFyZWQgb24gcmV0dXJuKSBhbmQKLQkgKiBtYWtlIHN1cmUgcmVxdWVzdCBpcyBzYW5lCisJICogdW4tYnVzeSBkcml2ZSBldGMgYW5kIG1ha2Ugc3VyZSByZXF1ZXN0IGlzIHNhbmUKIAkgKi8KLQlycSA9IEhXR1JPVVAoZHJpdmUpLT5ycTsKIAorCXJxID0gaHdpZi0+cnE7CiAJaWYgKCFycSkKIAkJZ290byBvdXQ7CiAKLQlIV0dST1VQKGRyaXZlKS0+cnEgPSBOVUxMOworCWh3aWYtPnJxID0gTlVMTDsKIAogCXJxLT5lcnJvcnMgPSAwOwogCkBAIC04NzYsNyArODg3LDcgQEAKIAogLyoqCiAgKglpZGVfdGltZXJfZXhwaXJ5CS0JaGFuZGxlIGxhY2sgb2YgYW4gSURFIGludGVycnVwdAotICoJQGRhdGE6IHRpbWVyIGNhbGxiYWNrIG1hZ2ljIChod2dyb3VwKQorICoJQGRhdGE6IHRpbWVyIGNhbGxiYWNrIG1hZ2ljIChod2lmKQogICoKICAqCUFuIElERSBjb21tYW5kIGhhcyB0aW1lZCBvdXQgYmVmb3JlIHRoZSBleHBlY3RlZCBkcml2ZSByZXR1cm4KICAqCW9jY3VycmVkLiBBdCB0aGlzIHBvaW50IHdlIGF0dGVtcHQgdG8gY2xlYW4gdXAgdGhlIGN1cnJlbnQKQEAgLTg5MCwxOCArOTAxLDE4IEBACiAgCiB2b2lkIGlkZV90aW1lcl9leHBpcnkgKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQlpZGVfaHdncm91cF90CSpod2dyb3VwID0gKGlkZV9od2dyb3VwX3QgKikgZGF0YTsKKwlpZGVfaHdpZl90CSpod2lmID0gKGlkZV9od2lmX3QgKilkYXRhOwogCWlkZV9kcml2ZV90CSp1bmluaXRpYWxpemVkX3Zhcihkcml2ZSk7CiAJaWRlX2hhbmRsZXJfdAkqaGFuZGxlcjsKLQlpZGVfZXhwaXJ5X3QJKmV4cGlyeTsKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwogCXVuc2lnbmVkIGxvbmcJd2FpdCA9IC0xOwogCWludAkJcGx1Z19kZXZpY2UgPSAwOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmh3Z3JvdXAtPmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHdpZi0+bG9jaywgZmxhZ3MpOwogCi0JaWYgKCgoaGFuZGxlciA9IGh3Z3JvdXAtPmhhbmRsZXIpID09IE5VTEwpIHx8Ci0JICAgIChod2dyb3VwLT5yZXFfZ2VuICE9IGh3Z3JvdXAtPnJlcV9nZW5fdGltZXIpKSB7CisJaGFuZGxlciA9IGh3aWYtPmhhbmRsZXI7CisKKwlpZiAoaGFuZGxlciA9PSBOVUxMIHx8IGh3aWYtPnJlcV9nZW4gIT0gaHdpZi0+cmVxX2dlbl90aW1lcikgewogCQkvKgogCQkgKiBFaXRoZXIgYSBtYXJnaW5hbCB0aW1lb3V0IG9jY3VycmVkCiAJCSAqIChnb3QgdGhlIGludGVycnVwdCBqdXN0IGFzIHRpbWVyIGV4cGlyZWQpLApAQCAtOTA5LDcyICs5MjAsNjggQEAKIAkJICogRWl0aGVyIHdheSwgd2UgZG9uJ3QgcmVhbGx5IHdhbnQgdG8gY29tcGxhaW4gYWJvdXQgYW55dGhpbmcuCiAJCSAqLwogCX0gZWxzZSB7Ci0JCWRyaXZlID0gaHdncm91cC0+ZHJpdmU7Ci0JCWlmICghZHJpdmUpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiaWRlX3RpbWVyX2V4cGlyeTogaHdncm91cC0+ZHJpdmUgd2FzIE5VTExcbiIpOwotCQkJaHdncm91cC0+aGFuZGxlciA9IE5VTEw7Ci0JCX0gZWxzZSB7Ci0JCQlpZGVfaHdpZl90ICpod2lmOwotCQkJaWRlX3N0YXJ0c3RvcF90IHN0YXJ0c3RvcCA9IGlkZV9zdG9wcGVkOworCQlpZGVfZXhwaXJ5X3QgKmV4cGlyeSA9IGh3aWYtPmV4cGlyeTsKKwkJaWRlX3N0YXJ0c3RvcF90IHN0YXJ0c3RvcCA9IGlkZV9zdG9wcGVkOwogCi0JCQlpZiAoKGV4cGlyeSA9IGh3Z3JvdXAtPmV4cGlyeSkgIT0gTlVMTCkgewotCQkJCS8qIGNvbnRpbnVlICovCi0JCQkJaWYgKCh3YWl0ID0gZXhwaXJ5KGRyaXZlKSkgPiAwKSB7Ci0JCQkJCS8qIHJlc2V0IHRpbWVyICovCi0JCQkJCWh3Z3JvdXAtPnRpbWVyLmV4cGlyZXMgID0gamlmZmllcyArIHdhaXQ7Ci0JCQkJCWh3Z3JvdXAtPnJlcV9nZW5fdGltZXIgPSBod2dyb3VwLT5yZXFfZ2VuOwotCQkJCQlhZGRfdGltZXIoJmh3Z3JvdXAtPnRpbWVyKTsKLQkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdncm91cC0+bG9jaywgZmxhZ3MpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJaHdncm91cC0+aGFuZGxlciA9IE5VTEw7Ci0JCQkvKgotCQkJICogV2UgbmVlZCB0byBzaW11bGF0ZSBhIHJlYWwgaW50ZXJydXB0IHdoZW4gaW52b2tpbmcKLQkJCSAqIHRoZSBoYW5kbGVyKCkgZnVuY3Rpb24sIHdoaWNoIG1lYW5zIHdlIG5lZWQgdG8KLQkJCSAqIGdsb2JhbGx5IG1hc2sgdGhlIHNwZWNpZmljIElSUToKLQkJCSAqLwotCQkJc3Bpbl91bmxvY2soJmh3Z3JvdXAtPmxvY2spOwotCQkJaHdpZiAgPSBIV0lGKGRyaXZlKTsKLQkJCS8qIGRpc2FibGVfaXJxX25vc3luYyA/PyAqLwotCQkJZGlzYWJsZV9pcnEoaHdpZi0+aXJxKTsKLQkJCS8qIGxvY2FsIENQVSBvbmx5LAotCQkJICogYXMgaWYgd2Ugd2VyZSBoYW5kbGluZyBhbiBpbnRlcnJ1cHQgKi8KLQkJCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JCQlpZiAoaHdncm91cC0+cG9sbGluZykgewotCQkJCXN0YXJ0c3RvcCA9IGhhbmRsZXIoZHJpdmUpOwotCQkJfSBlbHNlIGlmIChkcml2ZV9pc19yZWFkeShkcml2ZSkpIHsKLQkJCQlpZiAoZHJpdmUtPndhaXRpbmdfZm9yX2RtYSkKLQkJCQkJaHdpZi0+ZG1hX29wcy0+ZG1hX2xvc3RfaXJxKGRyaXZlKTsKLQkJCQkodm9pZClpZGVfYWNrX2ludHIoaHdpZik7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGxvc3QgaW50ZXJydXB0XG4iLCBkcml2ZS0+bmFtZSk7Ci0JCQkJc3RhcnRzdG9wID0gaGFuZGxlcihkcml2ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChkcml2ZS0+d2FpdGluZ19mb3JfZG1hKSB7Ci0JCQkJCXN0YXJ0c3RvcCA9IGlkZV9kbWFfdGltZW91dF9yZXRyeShkcml2ZSwgd2FpdCk7Ci0JCQkJfSBlbHNlCi0JCQkJCXN0YXJ0c3RvcCA9Ci0JCQkJCWlkZV9lcnJvcihkcml2ZSwgImlycSB0aW1lb3V0IiwKLQkJCQkJCSAgaHdpZi0+dHBfb3BzLT5yZWFkX3N0YXR1cyhod2lmKSk7Ci0JCQl9Ci0JCQlzcGluX2xvY2tfaXJxKCZod2dyb3VwLT5sb2NrKTsKLQkJCWVuYWJsZV9pcnEoaHdpZi0+aXJxKTsKLQkJCWlmIChzdGFydHN0b3AgPT0gaWRlX3N0b3BwZWQpIHsKLQkJCQlpZGVfdW5sb2NrX2h3Z3JvdXAoaHdncm91cCk7Ci0JCQkJcGx1Z19kZXZpY2UgPSAxOworCQlkcml2ZSA9IGh3aWYtPmN1cl9kZXY7CisKKwkJaWYgKGV4cGlyeSkgeworCQkJd2FpdCA9IGV4cGlyeShkcml2ZSk7CisJCQlpZiAod2FpdCA+IDApIHsgLyogY29udGludWUgKi8KKwkJCQkvKiByZXNldCB0aW1lciAqLworCQkJCWh3aWYtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgd2FpdDsKKwkJCQlod2lmLT5yZXFfZ2VuX3RpbWVyID0gaHdpZi0+cmVxX2dlbjsKKwkJCQlhZGRfdGltZXIoJmh3aWYtPnRpbWVyKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2lmLT5sb2NrLCBmbGFncyk7CisJCQkJcmV0dXJuOwogCQkJfQogCQl9CisJCWh3aWYtPmhhbmRsZXIgPSBOVUxMOworCQkvKgorCQkgKiBXZSBuZWVkIHRvIHNpbXVsYXRlIGEgcmVhbCBpbnRlcnJ1cHQgd2hlbiBpbnZva2luZworCQkgKiB0aGUgaGFuZGxlcigpIGZ1bmN0aW9uLCB3aGljaCBtZWFucyB3ZSBuZWVkIHRvCisJCSAqIGdsb2JhbGx5IG1hc2sgdGhlIHNwZWNpZmljIElSUToKKwkJICovCisJCXNwaW5fdW5sb2NrKCZod2lmLT5sb2NrKTsKKwkJLyogZGlzYWJsZV9pcnFfbm9zeW5jID8/ICovCisJCWRpc2FibGVfaXJxKGh3aWYtPmlycSk7CisJCS8qIGxvY2FsIENQVSBvbmx5LCBhcyBpZiB3ZSB3ZXJlIGhhbmRsaW5nIGFuIGludGVycnVwdCAqLworCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQlpZiAoaHdpZi0+cG9sbGluZykgeworCQkJc3RhcnRzdG9wID0gaGFuZGxlcihkcml2ZSk7CisJCX0gZWxzZSBpZiAoZHJpdmVfaXNfcmVhZHkoZHJpdmUpKSB7CisJCQlpZiAoZHJpdmUtPndhaXRpbmdfZm9yX2RtYSkKKwkJCQlod2lmLT5kbWFfb3BzLT5kbWFfbG9zdF9pcnEoZHJpdmUpOworCQkJKHZvaWQpaWRlX2Fja19pbnRyKGh3aWYpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGxvc3QgaW50ZXJydXB0XG4iLAorCQkJCWRyaXZlLT5uYW1lKTsKKwkJCXN0YXJ0c3RvcCA9IGhhbmRsZXIoZHJpdmUpOworCQl9IGVsc2UgeworCQkJaWYgKGRyaXZlLT53YWl0aW5nX2Zvcl9kbWEpCisJCQkJc3RhcnRzdG9wID0gaWRlX2RtYV90aW1lb3V0X3JldHJ5KGRyaXZlLCB3YWl0KTsKKwkJCWVsc2UKKwkJCQlzdGFydHN0b3AgPSBpZGVfZXJyb3IoZHJpdmUsICJpcnEgdGltZW91dCIsCisJCQkJCWh3aWYtPnRwX29wcy0+cmVhZF9zdGF0dXMoaHdpZikpOworCQl9CisJCXNwaW5fbG9ja19pcnEoJmh3aWYtPmxvY2spOworCQllbmFibGVfaXJxKGh3aWYtPmlycSk7CisJCWlmIChzdGFydHN0b3AgPT0gaWRlX3N0b3BwZWQpIHsKKwkJCWlkZV91bmxvY2tfcG9ydChod2lmKTsKKwkJCXBsdWdfZGV2aWNlID0gMTsKKwkJfQogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2dyb3VwLT5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdpZi0+bG9jaywgZmxhZ3MpOwogCi0JaWYgKHBsdWdfZGV2aWNlKQorCWlmIChwbHVnX2RldmljZSkgeworCQlpZGVfdW5sb2NrX2hvc3QoaHdpZi0+aG9zdCk7CiAJCWlkZV9wbHVnX2RldmljZShkcml2ZSk7CisJfQogfQogCiAvKioKICAqCXVuZXhwZWN0ZWRfaW50cgkJLQloYW5kbGUgYW4gdW5leHBlY3RlZCBJREUgaW50ZXJydXB0CiAgKglAaXJxOiBpbnRlcnJ1cHQgbGluZQotICoJQGh3Z3JvdXA6IGh3Z3JvdXAgYmVpbmcgcHJvY2Vzc2VkCisgKglAaHdpZjogcG9ydCBiZWluZyBwcm9jZXNzZWQKICAqCiAgKglUaGVyZSdzIG5vdGhpbmcgcmVhbGx5IHVzZWZ1bCB3ZSBjYW4gZG8gd2l0aCBhbiB1bmV4cGVjdGVkIGludGVycnVwdCwKICAqCW90aGVyIHRoYW4gcmVhZGluZyB0aGUgc3RhdHVzIHJlZ2lzdGVyICh0byBjbGVhciBpdCksIGFuZCBsb2dnaW5nIGl0LgpAQCAtOTk4LDUyICsxMDA1LDM4IEBACiAgKgliZWZvcmUgY29tcGxldGluZyB0aGUgaXNzdWFuY2Ugb2YgYW55IG5ldyBkcml2ZSBjb21tYW5kLCBzbyB3ZSB3aWxsIG5vdAogICoJYmUgYWNjaWRlbnRhbGx5IGludm9rZWQgYXMgYSByZXN1bHQgb2YgYW55IHZhbGlkIGNvbW1hbmQgY29tcGxldGlvbgogICoJaW50ZXJydXB0LgotICoKLSAqCU5vdGUgdGhhdCB3ZSBtdXN0IHdhbGsgdGhlIGVudGlyZSBod2dyb3VwIGhlcmUuIFdlIGtub3cgd2hpY2ggaHdpZgotICoJaXMgZG9pbmcgdGhlIGN1cnJlbnQgY29tbWFuZCwgYnV0IHdlIGRvbid0IGtub3cgd2hpY2ggaHdpZiBidXJwZWQKLSAqCW15c3RlcmlvdXNseS4KICAqLwotIAotc3RhdGljIHZvaWQgdW5leHBlY3RlZF9pbnRyIChpbnQgaXJxLCBpZGVfaHdncm91cF90ICpod2dyb3VwKQorCitzdGF0aWMgdm9pZCB1bmV4cGVjdGVkX2ludHIoaW50IGlycSwgaWRlX2h3aWZfdCAqaHdpZikKIHsKLQl1OCBzdGF0OwotCWlkZV9od2lmX3QgKmh3aWYgPSBod2dyb3VwLT5od2lmOworCXU4IHN0YXQgPSBod2lmLT50cF9vcHMtPnJlYWRfc3RhdHVzKGh3aWYpOwogCi0JLyoKLQkgKiBoYW5kbGUgdGhlIHVuZXhwZWN0ZWQgaW50ZXJydXB0Ci0JICovCi0JZG8gewotCQlpZiAoaHdpZi0+aXJxID09IGlycSkgewotCQkJc3RhdCA9IGh3aWYtPnRwX29wcy0+cmVhZF9zdGF0dXMoaHdpZik7CisJaWYgKCFPS19TVEFUKHN0YXQsIEFUQV9EUkRZLCBCQURfU1RBVCkpIHsKKwkJLyogVHJ5IHRvIG5vdCBmbG9vZCB0aGUgY29uc29sZSB3aXRoIG1zZ3MgKi8KKwkJc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzdF9tc2d0aW1lLCBjb3VudDsKKwkJKytjb3VudDsKIAotCQkJaWYgKCFPS19TVEFUKHN0YXQsIEFUQV9EUkRZLCBCQURfU1RBVCkpIHsKLQkJCQkvKiBUcnkgdG8gbm90IGZsb29kIHRoZSBjb25zb2xlIHdpdGggbXNncyAqLwotCQkJCXN0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3RfbXNndGltZSwgY291bnQ7Ci0JCQkJKytjb3VudDsKLQkJCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBsYXN0X21zZ3RpbWUgKyBIWikpIHsKLQkJCQkJbGFzdF9tc2d0aW1lID0gamlmZmllczsKLQkJCQkJcHJpbnRrKEtFUk5fRVJSICIlcyVzOiB1bmV4cGVjdGVkIGludGVycnVwdCwgIgotCQkJCQkJInN0YXR1cz0weCUwMngsIGNvdW50PSVsZFxuIiwKLQkJCQkJCWh3aWYtPm5hbWUsCi0JCQkJCQkoaHdpZi0+bmV4dD09aHdncm91cC0+aHdpZikgPyAiIiA6ICIoPykiLCBzdGF0LCBjb3VudCk7Ci0JCQkJfQotCQkJfQorCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBsYXN0X21zZ3RpbWUgKyBIWikpIHsKKwkJCWxhc3RfbXNndGltZSA9IGppZmZpZXM7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmV4cGVjdGVkIGludGVycnVwdCwgIgorCQkJCSJzdGF0dXM9MHglMDJ4LCBjb3VudD0lbGRcbiIsCisJCQkJaHdpZi0+bmFtZSwgc3RhdCwgY291bnQpOwogCQl9Ci0JfSB3aGlsZSAoKGh3aWYgPSBod2lmLT5uZXh0KSAhPSBod2dyb3VwLT5od2lmKTsKKwl9CiB9CiAKIC8qKgogICoJaWRlX2ludHIJLQlkZWZhdWx0IElERSBpbnRlcnJ1cHQgaGFuZGxlcgogICoJQGlycTogaW50ZXJydXB0IG51bWJlcgotICoJQGRldl9pZDogaHdpZiBncm91cAorICoJQGRldl9pZDogaHdpZgogICoJQHJlZ3M6IHVudXNlZCB3ZWlyZG5lc3MgZnJvbSB0aGUga2VybmVsIGlycSBsYXllcgogICoKICAqCVRoaXMgaXMgdGhlIGRlZmF1bHQgSVJRIGhhbmRsZXIgZm9yIHRoZSBJREUgbGF5ZXIuIFlvdSBzaG91bGQKICAqCW5vdCBuZWVkIHRvIG92ZXJyaWRlIGl0LiBJZiB5b3UgZG8gYmUgYXdhcmUgaXQgaXMgc3VidGxlIGluCiAgKglwbGFjZXMKICAqCi0gKglod2dyb3VwLT5od2lmIGlzIHRoZSBpbnRlcmZhY2UgaW4gdGhlIGdyb3VwIGN1cnJlbnRseSBwZXJmb3JtaW5nCi0gKglhIGNvbW1hbmQuIGh3Z3JvdXAtPmRyaXZlIGlzIHRoZSBkcml2ZSBhbmQgaHdncm91cC0+aGFuZGxlciBpcworICoJaHdpZiBpcyB0aGUgaW50ZXJmYWNlIGluIHRoZSBncm91cCBjdXJyZW50bHkgcGVyZm9ybWluZworICoJYSBjb21tYW5kLiBod2lmLT5jdXJfZGV2IGlzIHRoZSBkcml2ZSBhbmQgaHdpZi0+aGFuZGxlciBpcwogICoJdGhlIElSUSBoYW5kbGVyIHRvIGNhbGwuIEFzIHdlIGlzc3VlIGEgY29tbWFuZCB0aGUgaGFuZGxlcnMKICAqCXN0ZXAgdGhyb3VnaCBtdWx0aXBsZSBzdGF0ZXMsIHJlYXNzaWduaW5nIHRoZSBoYW5kbGVyIHRvIHRoZQogICoJbmV4dCBzdGVwIGluIHRoZSBwcm9jZXNzLiBVbmxpa2UgYSBzbWFydCBTQ1NJIGNvbnRyb2xsZXIgSURFCkBAIC0xMDU0LDI2ICsxMDQ3LDMyIEBACiAgKgogICoJVGhlIGhhbmRsZXIgZXZlbnR1YWxseSByZXR1cm5zIGlkZV9zdG9wcGVkIHRvIGluZGljYXRlIHRoZQogICoJcmVxdWVzdCBjb21wbGV0ZWQuIEF0IHRoaXMgcG9pbnQgd2UgaXNzdWUgdGhlIG5leHQgcmVxdWVzdAotICoJb24gdGhlIGh3Z3JvdXAgYW5kIHRoZSBwcm9jZXNzIGJlZ2lucyBhZ2Fpbi4KKyAqCW9uIHRoZSBwb3J0IGFuZCB0aGUgcHJvY2VzcyBiZWdpbnMgYWdhaW4uCiAgKi8KLSAKKwogaXJxcmV0dXJuX3QgaWRlX2ludHIgKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXAgPSAoaWRlX2h3Z3JvdXBfdCAqKWRldl9pZDsKLQlpZGVfaHdpZl90ICpod2lmID0gaHdncm91cC0+aHdpZjsKKwlpZGVfaHdpZl90ICpod2lmID0gKGlkZV9od2lmX3QgKilkZXZfaWQ7CiAJaWRlX2RyaXZlX3QgKnVuaW5pdGlhbGl6ZWRfdmFyKGRyaXZlKTsKIAlpZGVfaGFuZGxlcl90ICpoYW5kbGVyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaWRlX3N0YXJ0c3RvcF90IHN0YXJ0c3RvcDsKIAlpcnFyZXR1cm5fdCBpcnFfcmV0ID0gSVJRX05PTkU7CiAJaW50IHBsdWdfZGV2aWNlID0gMDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZod2dyb3VwLT5sb2NrLCBmbGFncyk7CisJaWYgKGh3aWYtPmhvc3QtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfU0VSSUFMSVpFKSB7CisJCWlmIChod2lmICE9IGh3aWYtPmhvc3QtPmN1cl9wb3J0KQorCQkJZ290byBvdXRfZWFybHk7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh3aWYtPmxvY2ssIGZsYWdzKTsKIAogCWlmICghaWRlX2Fja19pbnRyKGh3aWYpKQogCQlnb3RvIG91dDsKIAotCWlmICgoaGFuZGxlciA9IGh3Z3JvdXAtPmhhbmRsZXIpID09IE5VTEwgfHwgaHdncm91cC0+cG9sbGluZykgeworCWhhbmRsZXIgPSBod2lmLT5oYW5kbGVyOworCisJaWYgKGhhbmRsZXIgPT0gTlVMTCB8fCBod2lmLT5wb2xsaW5nKSB7CiAJCS8qCiAJCSAqIE5vdCBleHBlY3RpbmcgYW4gaW50ZXJydXB0IGZyb20gdGhpcyBkcml2ZS4KIAkJICogVGhhdCBtZWFucyB0aGlzIGNvdWxkIGJlOgpAQCAtMTA5Nyw3ICsxMDk2LDcgQEAKIAkJCSAqIFByb2JhYmx5IG5vdCBhIHNoYXJlZCBQQ0kgaW50ZXJydXB0LAogCQkJICogc28gd2UgY2FuIHNhZmVseSB0cnkgdG8gZG8gc29tZXRoaW5nIGFib3V0IGl0OgogCQkJICovCi0JCQl1bmV4cGVjdGVkX2ludHIoaXJxLCBod2dyb3VwKTsKKwkJCXVuZXhwZWN0ZWRfaW50cihpcnEsIGh3aWYpOwogI2lmZGVmIENPTkZJR19CTEtfREVWX0lERVBDSQogCQl9IGVsc2UgewogCQkJLyoKQEAgLTExMTAsMTYgKzExMDksNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlkcml2ZSA9IGh3Z3JvdXAtPmRyaXZlOwotCWlmICghZHJpdmUpIHsKLQkJLyoKLQkJICogVGhpcyBzaG91bGQgTkVWRVIgaGFwcGVuLCBhbmQgdGhlcmUgaXNuJ3QgbXVjaAotCQkgKiB3ZSBjb3VsZCBkbyBhYm91dCBpdCBoZXJlLgotCQkgKgotCQkgKiBbTm90ZSAtIHRoaXMgY2FuIG9jY3VyIGlmIHRoZSBkcml2ZSBpcyBob3QgdW5wbHVnZ2VkXQotCQkgKi8KLQkJZ290byBvdXRfaGFuZGxlZDsKLQl9CisJZHJpdmUgPSBod2lmLT5jdXJfZGV2OwogCiAJaWYgKCFkcml2ZV9pc19yZWFkeShkcml2ZSkpCiAJCS8qCkBAIC0xMTMxLDEwICsxMTIxLDEwIEBACiAJCSAqLwogCQlnb3RvIG91dDsKIAotCWh3Z3JvdXAtPmhhbmRsZXIgPSBOVUxMOwotCWh3Z3JvdXAtPnJlcV9nZW4rKzsKLQlkZWxfdGltZXIoJmh3Z3JvdXAtPnRpbWVyKTsKLQlzcGluX3VubG9jaygmaHdncm91cC0+bG9jayk7CisJaHdpZi0+aGFuZGxlciA9IE5VTEw7CisJaHdpZi0+cmVxX2dlbisrOworCWRlbF90aW1lcigmaHdpZi0+dGltZXIpOworCXNwaW5fdW5sb2NrKCZod2lmLT5sb2NrKTsKIAogCWlmIChod2lmLT5wb3J0X29wcyAmJiBod2lmLT5wb3J0X29wcy0+Y2xlYXJfaXJxKQogCQlod2lmLT5wb3J0X29wcy0+Y2xlYXJfaXJxKGRyaXZlKTsKQEAgLTExNDUsNyArMTEzNSw3IEBACiAJLyogc2VydmljZSB0aGlzIGludGVycnVwdCwgbWF5IHNldCBoYW5kbGVyIGZvciBuZXh0IGludGVycnVwdCAqLwogCXN0YXJ0c3RvcCA9IGhhbmRsZXIoZHJpdmUpOwogCi0Jc3Bpbl9sb2NrX2lycSgmaHdncm91cC0+bG9jayk7CisJc3Bpbl9sb2NrX2lycSgmaHdpZi0+bG9jayk7CiAJLyoKIAkgKiBOb3RlIHRoYXQgaGFuZGxlcigpIG1heSBoYXZlIHNldCB0aGluZ3MgdXAgZm9yIGFub3RoZXIKIAkgKiBpbnRlcnJ1cHQgdG8gb2NjdXIgc29vbiwgYnV0IGl0IGNhbm5vdCBoYXBwZW4gdW50aWwKQEAgLTExNTQsMjAgKzExNDQsMTggQEAKIAkgKiB3b24ndCBhbGxvdyBhbm90aGVyIG9mIHRoZSBzYW1lIChvbiBhbnkgQ1BVKSB1bnRpbCB3ZSByZXR1cm4uCiAJICovCiAJaWYgKHN0YXJ0c3RvcCA9PSBpZGVfc3RvcHBlZCkgewotCQlpZiAoaHdncm91cC0+aGFuZGxlciA9PSBOVUxMKSB7CS8qIHBhcmFub2lhICovCi0JCQlpZGVfdW5sb2NrX2h3Z3JvdXAoaHdncm91cCk7Ci0JCQlwbHVnX2RldmljZSA9IDE7Ci0JCX0gZWxzZQotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogJXM6IGh1aD8gZXhwZWN0ZWQgTlVMTCBoYW5kbGVyICIKLQkJCQkJIm9uIGV4aXRcbiIsIF9fZnVuY19fLCBkcml2ZS0+bmFtZSk7CisJCUJVR19PTihod2lmLT5oYW5kbGVyKTsKKwkJaWRlX3VubG9ja19wb3J0KGh3aWYpOworCQlwbHVnX2RldmljZSA9IDE7CiAJfQotb3V0X2hhbmRsZWQ6CiAJaXJxX3JldCA9IElSUV9IQU5ETEVEOwogb3V0OgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3Z3JvdXAtPmxvY2ssIGZsYWdzKTsKLQotCWlmIChwbHVnX2RldmljZSkKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2lmLT5sb2NrLCBmbGFncyk7CitvdXRfZWFybHk6CisJaWYgKHBsdWdfZGV2aWNlKSB7CisJCWlkZV91bmxvY2tfaG9zdChod2lmLT5ob3N0KTsKIAkJaWRlX3BsdWdfZGV2aWNlKGRyaXZlKTsKKwl9CiAKIAlyZXR1cm4gaXJxX3JldDsKIH0KQEAgLTExODksMTUgKzExNzcsMTMgQEAKIAogdm9pZCBpZGVfZG9fZHJpdmVfY21kKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxKQogewotCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXAgPSBkcml2ZS0+aHdpZi0+aHdncm91cDsKIAlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGRyaXZlLT5xdWV1ZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaHdncm91cC0+cnEgPSBOVUxMOworCWRyaXZlLT5od2lmLT5ycSA9IE5VTEw7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CiAJX19lbHZfYWRkX3JlcXVlc3QocSwgcnEsIEVMRVZBVE9SX0lOU0VSVF9GUk9OVCwgMCk7Ci0JYmxrX3N0YXJ0X3F1ZXVlaW5nKHEpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOwogfQogRVhQT1JUX1NZTUJPTChpZGVfZG9fZHJpdmVfY21kKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1pb3BzLmMgYi9kcml2ZXJzL2lkZS9pZGUtaW9wcy5jCmluZGV4IGFkOGJkNjUuLmU3MjhjZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1pb3BzLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWlvcHMuYwpAQCAtMTA1LDE1ICsxMDUsNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoaWRlX3JlYWRfYWx0c3RhdHVzKTsKIAotdTggaWRlX3JlYWRfc2ZmX2RtYV9zdGF0dXMoaWRlX2h3aWZfdCAqaHdpZikKLXsKLQlpZiAoaHdpZi0+aG9zdF9mbGFncyAmIElERV9IRkxBR19NTUlPKQotCQlyZXR1cm4gcmVhZGIoKHZvaWQgX19pb21lbSAqKShod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfU1RBVFVTKSk7Ci0JZWxzZQotCQlyZXR1cm4gaW5iKGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9TVEFUVVMpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoaWRlX3JlYWRfc2ZmX2RtYV9zdGF0dXMpOwotCiB2b2lkIGlkZV9zZXRfaXJxKGlkZV9od2lmX3QgKmh3aWYsIGludCBvbikKIHsKIAl1OCBjdGwgPSBBVEFfREVWQ1RMX09CUzsKQEAgLTM4OCw3ICszNzksNiBAQAogCS5leGVjX2NvbW1hbmQJCT0gaWRlX2V4ZWNfY29tbWFuZCwKIAkucmVhZF9zdGF0dXMJCT0gaWRlX3JlYWRfc3RhdHVzLAogCS5yZWFkX2FsdHN0YXR1cwkJPSBpZGVfcmVhZF9hbHRzdGF0dXMsCi0JLnJlYWRfc2ZmX2RtYV9zdGF0dXMJPSBpZGVfcmVhZF9zZmZfZG1hX3N0YXR1cywKIAogCS5zZXRfaXJxCQk9IGlkZV9zZXRfaXJxLAogCkBAIC00NTEsNyArNDQxLDcgQEAKICAqLwogaW50IGRyaXZlX2lzX3JlYWR5IChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAl1OCBzdGF0CQkJPSAwOwogCiAJaWYgKGRyaXZlLT53YWl0aW5nX2Zvcl9kbWEpCkBAIC01MDMsNyArNDkzLDggQEAKIAlzdGF0ID0gdHBfb3BzLT5yZWFkX3N0YXR1cyhod2lmKTsKIAogCWlmIChzdGF0ICYgQVRBX0JVU1kpIHsKLQkJbG9jYWxfaXJxX3NldChmbGFncyk7CisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJbG9jYWxfaXJxX2VuYWJsZV9pbl9oYXJkaXJxKCk7CiAJCXRpbWVvdXQgKz0gamlmZmllczsKIAkJd2hpbGUgKChzdGF0ID0gdHBfb3BzLT5yZWFkX3N0YXR1cyhod2lmKSkgJiBBVEFfQlVTWSkgewogCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKQEAgLTgyMiwyNSArODEzLDI1IEBACiBzdGF0aWMgdm9pZCBfX2lkZV9zZXRfaGFuZGxlciAoaWRlX2RyaXZlX3QgKmRyaXZlLCBpZGVfaGFuZGxlcl90ICpoYW5kbGVyLAogCQkgICAgICB1bnNpZ25lZCBpbnQgdGltZW91dCwgaWRlX2V4cGlyeV90ICpleHBpcnkpCiB7Ci0JaWRlX2h3Z3JvdXBfdCAqaHdncm91cCA9IEhXR1JPVVAoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAotCUJVR19PTihod2dyb3VwLT5oYW5kbGVyKTsKLQlod2dyb3VwLT5oYW5kbGVyCT0gaGFuZGxlcjsKLQlod2dyb3VwLT5leHBpcnkJCT0gZXhwaXJ5OwotCWh3Z3JvdXAtPnRpbWVyLmV4cGlyZXMJPSBqaWZmaWVzICsgdGltZW91dDsKLQlod2dyb3VwLT5yZXFfZ2VuX3RpbWVyCT0gaHdncm91cC0+cmVxX2dlbjsKLQlhZGRfdGltZXIoJmh3Z3JvdXAtPnRpbWVyKTsKKwlCVUdfT04oaHdpZi0+aGFuZGxlcik7CisJaHdpZi0+aGFuZGxlcgkJPSBoYW5kbGVyOworCWh3aWYtPmV4cGlyeQkJPSBleHBpcnk7CisJaHdpZi0+dGltZXIuZXhwaXJlcwk9IGppZmZpZXMgKyB0aW1lb3V0OworCWh3aWYtPnJlcV9nZW5fdGltZXIJPSBod2lmLT5yZXFfZ2VuOworCWFkZF90aW1lcigmaHdpZi0+dGltZXIpOwogfQogCiB2b2lkIGlkZV9zZXRfaGFuZGxlciAoaWRlX2RyaXZlX3QgKmRyaXZlLCBpZGVfaGFuZGxlcl90ICpoYW5kbGVyLAogCQkgICAgICB1bnNpZ25lZCBpbnQgdGltZW91dCwgaWRlX2V4cGlyeV90ICpleHBpcnkpCiB7Ci0JaWRlX2h3Z3JvdXBfdCAqaHdncm91cCA9IGRyaXZlLT5od2lmLT5od2dyb3VwOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmh3Z3JvdXAtPmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHdpZi0+bG9jaywgZmxhZ3MpOwogCV9faWRlX3NldF9oYW5kbGVyKGRyaXZlLCBoYW5kbGVyLCB0aW1lb3V0LCBleHBpcnkpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3Z3JvdXAtPmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2lmLT5sb2NrLCBmbGFncyk7CiB9CiAKIEVYUE9SVF9TWU1CT0woaWRlX3NldF9oYW5kbGVyKTsKQEAgLTg2MywxMCArODU0LDkgQEAKIAkJCSB1bnNpZ25lZCB0aW1lb3V0LCBpZGVfZXhwaXJ5X3QgKmV4cGlyeSkKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0JaWRlX2h3Z3JvdXBfdCAqaHdncm91cCA9IGh3aWYtPmh3Z3JvdXA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZod2dyb3VwLT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmh3aWYtPmxvY2ssIGZsYWdzKTsKIAlfX2lkZV9zZXRfaGFuZGxlcihkcml2ZSwgaGFuZGxlciwgdGltZW91dCwgZXhwaXJ5KTsKIAlod2lmLT50cF9vcHMtPmV4ZWNfY29tbWFuZChod2lmLCBjbWQpOwogCS8qCkBAIC04NzYsMjYgKzg2NiwyNSBAQAogCSAqIEZJWE1FOiB3ZSBjb3VsZCBza2lwIHRoaXMgZGVsYXkgd2l0aCBjYXJlIG9uIG5vbiBzaGFyZWQgZGV2aWNlcwogCSAqLwogCW5kZWxheSg0MDApOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3Z3JvdXAtPmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2lmLT5sb2NrLCBmbGFncyk7CiB9CiBFWFBPUlRfU1lNQk9MKGlkZV9leGVjdXRlX2NvbW1hbmQpOwogCiB2b2lkIGlkZV9leGVjdXRlX3BrdF9jbWQoaWRlX2RyaXZlX3QgKmRyaXZlKQogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKLQlpZGVfaHdncm91cF90ICpod2dyb3VwID0gaHdpZi0+aHdncm91cDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmh3Z3JvdXAtPmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHdpZi0+bG9jaywgZmxhZ3MpOwogCWh3aWYtPnRwX29wcy0+ZXhlY19jb21tYW5kKGh3aWYsIEFUQV9DTURfUEFDS0VUKTsKIAluZGVsYXkoNDAwKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2dyb3VwLT5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdpZi0+bG9jaywgZmxhZ3MpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaWRlX2V4ZWN1dGVfcGt0X2NtZCk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpZGVfY29tcGxldGVfZHJpdmVfcmVzZXQoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgZXJyKQogewotCXN0cnVjdCByZXF1ZXN0ICpycSA9IGRyaXZlLT5od2lmLT5od2dyb3VwLT5ycTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBkcml2ZS0+aHdpZi0+cnE7CiAKIAlpZiAocnEgJiYgYmxrX3NwZWNpYWxfcmVxdWVzdChycSkgJiYgcnEtPmNtZFswXSA9PSBSRVFfRFJJVkVfUkVTRVQpCiAJCWlkZV9lbmRfcmVxdWVzdChkcml2ZSwgZXJyID8gZXJyIDogMSwgMCk7CkBAIC05MTMsNyArOTAyLDYgQEAKIHN0YXRpYyBpZGVfc3RhcnRzdG9wX3QgYXRhcGlfcmVzZXRfcG9sbGZ1bmMgKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0JaWRlX2h3Z3JvdXBfdCAqaHdncm91cCA9IGh3aWYtPmh3Z3JvdXA7CiAJdTggc3RhdDsKIAogCVNFTEVDVF9EUklWRShkcml2ZSk7CkBAIC05MjMsMjAgKzkxMSwyMCBAQAogCWlmIChPS19TVEFUKHN0YXQsIDAsIEFUQV9CVVNZKSkKIAkJcHJpbnRrKCIlczogQVRBUEkgcmVzZXQgY29tcGxldGVcbiIsIGRyaXZlLT5uYW1lKTsKIAllbHNlIHsKLQkJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGh3Z3JvdXAtPnBvbGxfdGltZW91dCkpIHsKKwkJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGh3aWYtPnBvbGxfdGltZW91dCkpIHsKIAkJCWlkZV9zZXRfaGFuZGxlcihkcml2ZSwgJmF0YXBpX3Jlc2V0X3BvbGxmdW5jLCBIWi8yMCwgTlVMTCk7CiAJCQkvKiBjb250aW51ZSBwb2xsaW5nICovCiAJCQlyZXR1cm4gaWRlX3N0YXJ0ZWQ7CiAJCX0KIAkJLyogZW5kIG9mIHBvbGxpbmcgKi8KLQkJaHdncm91cC0+cG9sbGluZyA9IDA7CisJCWh3aWYtPnBvbGxpbmcgPSAwOwogCQlwcmludGsoIiVzOiBBVEFQSSByZXNldCB0aW1lZC1vdXQsIHN0YXR1cz0weCUwMnhcbiIsCiAJCQkJZHJpdmUtPm5hbWUsIHN0YXQpOwogCQkvKiBkbyBpdCB0aGUgb2xkIGZhc2hpb25lZCB3YXkgKi8KIAkJcmV0dXJuIGRvX3Jlc2V0MShkcml2ZSwgMSk7CiAJfQogCS8qIGRvbmUgcG9sbGluZyAqLwotCWh3Z3JvdXAtPnBvbGxpbmcgPSAwOworCWh3aWYtPnBvbGxpbmcgPSAwOwogCWlkZV9jb21wbGV0ZV9kcml2ZV9yZXNldChkcml2ZSwgMCk7CiAJcmV0dXJuIGlkZV9zdG9wcGVkOwogfQpAQCAtOTY4LDggKzk1Niw3IEBACiAgKi8KIHN0YXRpYyBpZGVfc3RhcnRzdG9wX3QgcmVzZXRfcG9sbGZ1bmMgKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdncm91cF90ICpod2dyb3VwCT0gSFdHUk9VUChkcml2ZSk7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAljb25zdCBzdHJ1Y3QgaWRlX3BvcnRfb3BzICpwb3J0X29wcyA9IGh3aWYtPnBvcnRfb3BzOwogCXU4IHRtcDsKIAlpbnQgZXJyID0gMDsKQEAgLTk4Niw3ICs5NzMsNyBAQAogCXRtcCA9IGh3aWYtPnRwX29wcy0+cmVhZF9zdGF0dXMoaHdpZik7CiAKIAlpZiAoIU9LX1NUQVQodG1wLCAwLCBBVEFfQlVTWSkpIHsKLQkJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGh3Z3JvdXAtPnBvbGxfdGltZW91dCkpIHsKKwkJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGh3aWYtPnBvbGxfdGltZW91dCkpIHsKIAkJCWlkZV9zZXRfaGFuZGxlcihkcml2ZSwgJnJlc2V0X3BvbGxmdW5jLCBIWi8yMCwgTlVMTCk7CiAJCQkvKiBjb250aW51ZSBwb2xsaW5nICovCiAJCQlyZXR1cm4gaWRlX3N0YXJ0ZWQ7CkBAIC0xMDA3LDcgKzk5NCw3IEBACiAJCX0KIAl9CiBvdXQ6Ci0JaHdncm91cC0+cG9sbGluZyA9IDA7CS8qIGRvbmUgcG9sbGluZyAqLworCWh3aWYtPnBvbGxpbmcgPSAwOwkvKiBkb25lIHBvbGxpbmcgKi8KIAlpZGVfY29tcGxldGVfZHJpdmVfcmVzZXQoZHJpdmUsIGVycik7CiAJcmV0dXJuIGlkZV9zdG9wcGVkOwogfQpAQCAtMTA4MSwxOCArMTA2OCwxOCBAQAogc3RhdGljIGlkZV9zdGFydHN0b3BfdCBkb19yZXNldDEgKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IGRvX25vdF90cnlfYXRhcGkpCiB7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwotCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXAgPSBod2lmLT5od2dyb3VwOwogCXN0cnVjdCBpZGVfaW9fcG9ydHMgKmlvX3BvcnRzID0gJmh3aWYtPmlvX3BvcnRzOwogCWNvbnN0IHN0cnVjdCBpZGVfdHBfb3BzICp0cF9vcHMgPSBod2lmLT50cF9vcHM7CiAJY29uc3Qgc3RydWN0IGlkZV9wb3J0X29wcyAqcG9ydF9vcHM7CisJaWRlX2RyaXZlX3QgKnRkcml2ZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzLCB0aW1lb3V0OwotCXVuc2lnbmVkIGludCB1bml0OworCWludCBpOwogCURFRklORV9XQUlUKHdhaXQpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmh3Z3JvdXAtPmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHdpZi0+bG9jaywgZmxhZ3MpOwogCiAJLyogV2UgbXVzdCBub3QgcmVzZXQgd2l0aCBydW5uaW5nIGhhbmRsZXJzICovCi0JQlVHX09OKGh3Z3JvdXAtPmhhbmRsZXIgIT0gTlVMTCk7CisJQlVHX09OKGh3aWYtPmhhbmRsZXIgIT0gTlVMTCk7CiAKIAkvKiBGb3IgYW4gQVRBUEkgZGV2aWNlLCBmaXJzdCB0cnkgYW4gQVRBUEkgU1JTVC4gKi8KIAlpZiAoZHJpdmUtPm1lZGlhICE9IGlkZV9kaXNrICYmICFkb19ub3RfdHJ5X2F0YXBpKSB7CkBAIC0xMTAxLDEwICsxMDg4LDEwIEBACiAJCXVkZWxheSAoMjApOwogCQl0cF9vcHMtPmV4ZWNfY29tbWFuZChod2lmLCBBVEFfQ01EX0RFVl9SRVNFVCk7CiAJCW5kZWxheSg0MDApOwotCQlod2dyb3VwLT5wb2xsX3RpbWVvdXQgPSBqaWZmaWVzICsgV0FJVF9XT1JTVENBU0U7Ci0JCWh3Z3JvdXAtPnBvbGxpbmcgPSAxOworCQlod2lmLT5wb2xsX3RpbWVvdXQgPSBqaWZmaWVzICsgV0FJVF9XT1JTVENBU0U7CisJCWh3aWYtPnBvbGxpbmcgPSAxOwogCQlfX2lkZV9zZXRfaGFuZGxlcihkcml2ZSwgJmF0YXBpX3Jlc2V0X3BvbGxmdW5jLCBIWi8yMCwgTlVMTCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3Z3JvdXAtPmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdpZi0+bG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gaWRlX3N0YXJ0ZWQ7CiAJfQogCkBAIC0xMTE0LDkgKzExMDEsNyBAQAogCiAJCXByZXBhcmVfdG9fd2FpdCgmaWRlX3Bhcmtfd3EsICZ3YWl0LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAJCXRpbWVvdXQgPSBqaWZmaWVzOwotCQlmb3IgKHVuaXQgPSAwOyB1bml0IDwgTUFYX0RSSVZFUzsgdW5pdCsrKSB7Ci0JCQlpZGVfZHJpdmVfdCAqdGRyaXZlID0gJmh3aWYtPmRyaXZlc1t1bml0XTsKLQorCQlpZGVfcG9ydF9mb3JfZWFjaF9kZXYoaSwgdGRyaXZlLCBod2lmKSB7CiAJCQlpZiAodGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfUFJFU0VOVCAmJgogCQkJICAgIHRkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1BBUktFRCAmJgogCQkJICAgIHRpbWVfYWZ0ZXIodGRyaXZlLT5zbGVlcCwgdGltZW91dCkpCkBAIC0xMTI3LDkgKzExMTIsOSBAQAogCQlpZiAodGltZV9iZWZvcmVfZXEodGltZW91dCwgbm93KSkKIAkJCWJyZWFrOwogCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3Z3JvdXAtPmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdpZi0+bG9jaywgZmxhZ3MpOwogCQl0aW1lb3V0ID0gc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUodGltZW91dCAtIG5vdyk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZod2dyb3VwLT5sb2NrLCBmbGFncyk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZod2lmLT5sb2NrLCBmbGFncyk7CiAJfSB3aGlsZSAodGltZW91dCk7CiAJZmluaXNoX3dhaXQoJmlkZV9wYXJrX3dxLCAmd2FpdCk7CiAKQEAgLTExMzcsMTEgKzExMjIsMTEgQEAKIAkgKiBGaXJzdCwgcmVzZXQgYW55IGRldmljZSBzdGF0ZSBkYXRhIHdlIHdlcmUgbWFpbnRhaW5pbmcKIAkgKiBmb3IgYW55IG9mIHRoZSBkcml2ZXMgb24gdGhpcyBpbnRlcmZhY2UuCiAJICovCi0JZm9yICh1bml0ID0gMDsgdW5pdCA8IE1BWF9EUklWRVM7ICsrdW5pdCkKLQkJcHJlX3Jlc2V0KCZod2lmLT5kcml2ZXNbdW5pdF0pOworCWlkZV9wb3J0X2Zvcl9lYWNoX2RldihpLCB0ZHJpdmUsIGh3aWYpCisJCXByZV9yZXNldCh0ZHJpdmUpOwogCiAJaWYgKGlvX3BvcnRzLT5jdGxfYWRkciA9PSAwKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3Z3JvdXAtPmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdpZi0+bG9jaywgZmxhZ3MpOwogCQlpZGVfY29tcGxldGVfZHJpdmVfcmVzZXQoZHJpdmUsIC1FTlhJTyk7CiAJCXJldHVybiBpZGVfc3RvcHBlZDsKIAl9CkBAIC0xMTY0LDggKzExNDksOCBAQAogCXRwX29wcy0+c2V0X2lycShod2lmLCBkcml2ZS0+cXVpcmtfbGlzdCA9PSAyKTsKIAkvKiBtb3JlIHRoYW4gZW5vdWdoIHRpbWUgKi8KIAl1ZGVsYXkoMTApOwotCWh3Z3JvdXAtPnBvbGxfdGltZW91dCA9IGppZmZpZXMgKyBXQUlUX1dPUlNUQ0FTRTsKLQlod2dyb3VwLT5wb2xsaW5nID0gMTsKKwlod2lmLT5wb2xsX3RpbWVvdXQgPSBqaWZmaWVzICsgV0FJVF9XT1JTVENBU0U7CisJaHdpZi0+cG9sbGluZyA9IDE7CiAJX19pZGVfc2V0X2hhbmRsZXIoZHJpdmUsICZyZXNldF9wb2xsZnVuYywgSFovMjAsIE5VTEwpOwogCiAJLyoKQEAgLTExNzcsNyArMTE2Miw3IEBACiAJaWYgKHBvcnRfb3BzICYmIHBvcnRfb3BzLT5yZXNldHByb2MpCiAJCXBvcnRfb3BzLT5yZXNldHByb2MoZHJpdmUpOwogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdncm91cC0+bG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3aWYtPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gaWRlX3N0YXJ0ZWQ7CiB9CiAKQEAgLTEyMjEsNiArMTIwNiwzIEBACiAJfQogCXJldHVybiAtRUJVU1k7CiB9Ci0KLUVYUE9SVF9TWU1CT0xfR1BMKGlkZV93YWl0X25vdF9idXN5KTsKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWxpYi5jIGIvZHJpdmVycy9pZGUvaWRlLWxpYi5jCmluZGV4IDlmNmUzM2QuLjA5NTI2YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1saWIuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtbGliLmMKQEAgLTI3Myw3ICsyNzMsNyBAQAogCiBzdGF0aWMgdm9pZCBpZGVfZHVtcF9vcGNvZGUoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCXN0cnVjdCByZXF1ZXN0ICpycSA9IGRyaXZlLT5od2lmLT5od2dyb3VwLT5ycTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBkcml2ZS0+aHdpZi0+cnE7CiAJaWRlX3Rhc2tfdCAqdGFzayA9IE5VTEw7CiAKIAlpZiAoIXJxKQpAQCAtMzQ2LDEwICszNDYsMTMgQEAKIAlwcmludGsoS0VSTl9DT05UICJ9Iik7CiAJaWYgKChlcnIgJiAoQVRBX0JCSyB8IEFUQV9BQk9SVEVEKSkgPT0gQVRBX0JCSyB8fAogCSAgICAoZXJyICYgKEFUQV9VTkMgfCBBVEFfSURORiB8IEFUQV9BTU5GKSkpIHsKKwkJc3RydWN0IHJlcXVlc3QgKnJxID0gZHJpdmUtPmh3aWYtPnJxOworCiAJCWlkZV9kdW1wX3NlY3Rvcihkcml2ZSk7Ci0JCWlmIChIV0dST1VQKGRyaXZlKSAmJiBIV0dST1VQKGRyaXZlKS0+cnEpCisKKwkJaWYgKHJxKQogCQkJcHJpbnRrKEtFUk5fQ09OVCAiLCBzZWN0b3I9JWxsdSIsCi0JCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylIV0dST1VQKGRyaXZlKS0+cnEtPnNlY3Rvcik7CisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylycS0+c2VjdG9yKTsKIAl9CiAJcHJpbnRrKEtFUk5fQ09OVCAiXG4iKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1wYXJrLmMgYi9kcml2ZXJzL2lkZS9pZGUtcGFyay5jCmluZGV4IDY3ODQ1NGEuLmM4NzVhOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1wYXJrLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLXBhcmsuYwpAQCAtNywyMiArNywyMiBAQAogCiBzdGF0aWMgdm9pZCBpc3N1ZV9wYXJrX2NtZChpZGVfZHJpdmVfdCAqZHJpdmUsIHVuc2lnbmVkIGxvbmcgdGltZW91dCkKIHsKLQlpZGVfaHdncm91cF90ICpod2dyb3VwID0gZHJpdmUtPmh3aWYtPmh3Z3JvdXA7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gZHJpdmUtPnF1ZXVlOwogCXN0cnVjdCByZXF1ZXN0ICpycTsKIAlpbnQgcmM7CiAKIAl0aW1lb3V0ICs9IGppZmZpZXM7Ci0Jc3Bpbl9sb2NrX2lycSgmaHdncm91cC0+bG9jayk7CisJc3Bpbl9sb2NrX2lycSgmaHdpZi0+bG9jayk7CiAJaWYgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfUEFSS0VEKSB7CiAJCWludCByZXNldF90aW1lciA9IHRpbWVfYmVmb3JlKHRpbWVvdXQsIGRyaXZlLT5zbGVlcCk7CiAJCWludCBzdGFydF9xdWV1ZSA9IDA7CiAKIAkJZHJpdmUtPnNsZWVwID0gdGltZW91dDsKIAkJd2FrZV91cF9hbGwoJmlkZV9wYXJrX3dxKTsKLQkJaWYgKHJlc2V0X3RpbWVyICYmIGRlbF90aW1lcigmaHdncm91cC0+dGltZXIpKQorCQlpZiAocmVzZXRfdGltZXIgJiYgZGVsX3RpbWVyKCZod2lmLT50aW1lcikpCiAJCQlzdGFydF9xdWV1ZSA9IDE7Ci0JCXNwaW5fdW5sb2NrX2lycSgmaHdncm91cC0+bG9jayk7CisJCXNwaW5fdW5sb2NrX2lycSgmaHdpZi0+bG9jayk7CiAKIAkJaWYgKHN0YXJ0X3F1ZXVlKSB7CiAJCQlzcGluX2xvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwpAQCAtMzEsNyArMzEsNyBAQAogCQl9CiAJCXJldHVybjsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCZod2dyb3VwLT5sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmh3aWYtPmxvY2spOwogCiAJcnEgPSBibGtfZ2V0X3JlcXVlc3QocSwgUkVBRCwgX19HRlBfV0FJVCk7CiAJcnEtPmNtZFswXSA9IFJFUV9QQVJLX0hFQURTOwpAQCAtNjQsMjEgKzY0LDIxIEBACiAJCSAgICAgIGNoYXIgKmJ1ZikKIHsKIAlpZGVfZHJpdmVfdCAqZHJpdmUgPSB0b19pZGVfZGV2aWNlKGRldik7Ci0JaWRlX2h3Z3JvdXBfdCAqaHdncm91cCA9IGRyaXZlLT5od2lmLT5od2dyb3VwOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAl1bnNpZ25lZCBsb25nIG5vdzsKIAl1bnNpZ25lZCBpbnQgbXNlY3M7CiAKIAlpZiAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19OT19VTkxPQUQpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCXNwaW5fbG9ja19pcnEoJmh3Z3JvdXAtPmxvY2spOworCXNwaW5fbG9ja19pcnEoJmh3aWYtPmxvY2spOwogCW5vdyA9IGppZmZpZXM7CiAJaWYgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfUEFSS0VEICYmCiAJICAgIHRpbWVfYWZ0ZXIoZHJpdmUtPnNsZWVwLCBub3cpKQogCQltc2VjcyA9IGppZmZpZXNfdG9fbXNlY3MoZHJpdmUtPnNsZWVwIC0gbm93KTsKIAllbHNlCiAJCW1zZWNzID0gMDsKLQlzcGluX3VubG9ja19pcnEoJmh3Z3JvdXAtPmxvY2spOworCXNwaW5fdW5sb2NrX2lycSgmaHdpZi0+bG9jayk7CiAKIAlyZXR1cm4gc25wcmludGYoYnVmLCAyMCwgIiV1XG4iLCBtc2Vjcyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtcG0uYyBiL2RyaXZlcnMvaWRlL2lkZS1wbS5jCmluZGV4IDgyODJjNjAuLjRiM2JmNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1wbS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1wbS5jCkBAIC01LDcgKzUsNyBAQAogaW50IGdlbmVyaWNfaWRlX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3QgbWVzZykKIHsKIAlpZGVfZHJpdmVfdCAqZHJpdmUgPSBkZXYtPmRyaXZlcl9kYXRhLCAqcGFpciA9IGlkZV9nZXRfcGFpcl9kZXYoZHJpdmUpOwotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHJlcXVlc3QgKnJxOwogCXN0cnVjdCByZXF1ZXN0X3BtX3N0YXRlIHJxcG07CiAJaWRlX3Rhc2tfdCBhcmdzOwpAQCAtMzksNyArMzksNyBAQAogaW50IGdlbmVyaWNfaWRlX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJaWRlX2RyaXZlX3QgKmRyaXZlID0gZGV2LT5kcml2ZXJfZGF0YSwgKnBhaXIgPSBpZGVfZ2V0X3BhaXJfZGV2KGRyaXZlKTsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXN0cnVjdCByZXF1ZXN0ICpycTsKIAlzdHJ1Y3QgcmVxdWVzdF9wbV9zdGF0ZSBycXBtOwogCWlkZV90YXNrX3QgYXJnczsKQEAgLTY3LDcgKzY3LDcgQEAKIAlibGtfcHV0X3JlcXVlc3QocnEpOwogCiAJaWYgKGVyciA9PSAwICYmIGRldi0+ZHJpdmVyKSB7Ci0JCWlkZV9kcml2ZXJfdCAqZHJ2ID0gdG9faWRlX2RyaXZlcihkZXYtPmRyaXZlcik7CisJCXN0cnVjdCBpZGVfZHJpdmVyICpkcnYgPSB0b19pZGVfZHJpdmVyKGRldi0+ZHJpdmVyKTsKIAogCQlpZiAoZHJ2LT5yZXN1bWUpCiAJCQlkcnYtPnJlc3VtZShkcml2ZSk7CkBAIC0xOTQsNyArMTk0LDcgQEAKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CiAKLQlkcml2ZS0+aHdpZi0+aHdncm91cC0+cnEgPSBOVUxMOworCWRyaXZlLT5od2lmLT5ycSA9IE5VTEw7CiAKIAlpZiAoYmxrX2VuZF9yZXF1ZXN0KHJxLCAwLCAwKSkKIAkJQlVHKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtcHJvYmUuYyBiL2RyaXZlcnMvaWRlL2lkZS1wcm9iZS5jCmluZGV4IGM1YWRiN2IuLjBjY2JiNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1wcm9iZS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1wcm9iZS5jCkBAIC0xODksNyArMTg5LDcgQEAKIAogc3RhdGljIHZvaWQgZG9faWRlbnRpZnkoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCBjbWQpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAl1MTYgKmlkID0gZHJpdmUtPmlkOwogCWNoYXIgKm0gPSAoY2hhciAqKSZpZFtBVEFfSURfUFJPRF07CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTI2Niw3ICsyNjYsNyBAQAogCiBzdGF0aWMgaW50IGFjdHVhbF90cnlfdG9faWRlbnRpZnkgKGlkZV9kcml2ZV90ICpkcml2ZSwgdTggY21kKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IGlkZV9pb19wb3J0cyAqaW9fcG9ydHMgPSAmaHdpZi0+aW9fcG9ydHM7CiAJY29uc3Qgc3RydWN0IGlkZV90cF9vcHMgKnRwX29wcyA9IGh3aWYtPnRwX29wczsKIAlpbnQgdXNlX2FsdHN0YXR1cyA9IDAsIHJjOwpAQCAtMzQxLDcgKzM0MSw3IEBACiAgCiBzdGF0aWMgaW50IHRyeV90b19pZGVudGlmeSAoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCBjbWQpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAljb25zdCBzdHJ1Y3QgaWRlX3RwX29wcyAqdHBfb3BzID0gaHdpZi0+dHBfb3BzOwogCWludCByZXR2YWw7CiAJaW50IGF1dG9wcm9iZSA9IDA7CkBAIC00MzgsNyArNDM4LDcgQEAKIAogc3RhdGljIGludCBkb19wcm9iZSAoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCBjbWQpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAljb25zdCBzdHJ1Y3QgaWRlX3RwX29wcyAqdHBfb3BzID0gaHdpZi0+dHBfb3BzOwogCWludCByYzsKIAl1OCBwcmVzZW50ID0gISEoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19QUkVTRU5UKSwgc3RhdDsKQEAgLTQ2Myw3ICs0NjMsNyBAQAogCWlmIChpZGVfcmVhZF9kZXZpY2UoZHJpdmUpICE9IGRyaXZlLT5zZWxlY3QgJiYgcHJlc2VudCA9PSAwKSB7CiAJCWlmIChkcml2ZS0+ZG4gJiAxKSB7CiAJCQkvKiBleGl0IHdpdGggZHJpdmUwIHNlbGVjdGVkICovCi0JCQlTRUxFQ1RfRFJJVkUoJmh3aWYtPmRyaXZlc1swXSk7CisJCQlTRUxFQ1RfRFJJVkUoaHdpZi0+ZGV2aWNlc1swXSk7CiAJCQkvKiBhbGxvdyBBVEFfQlVTWSB0byBhc3NlcnQgJiBjbGVhciAqLwogCQkJbXNsZWVwKDUwKTsKIAkJfQpAQCAtNTA5LDcgKzUwOSw3IEBACiAJfQogCWlmIChkcml2ZS0+ZG4gJiAxKSB7CiAJCS8qIGV4aXQgd2l0aCBkcml2ZTAgc2VsZWN0ZWQgKi8KLQkJU0VMRUNUX0RSSVZFKCZod2lmLT5kcml2ZXNbMF0pOworCQlTRUxFQ1RfRFJJVkUoaHdpZi0+ZGV2aWNlc1swXSk7CiAJCW1zbGVlcCg1MCk7CiAJCS8qIGVuc3VyZSBkcml2ZSBpcnEgaXMgY2xlYXIgKi8KIAkJKHZvaWQpdHBfb3BzLT5yZWFkX3N0YXR1cyhod2lmKTsKQEAgLTUyMiw3ICs1MjIsNyBAQAogICovCiBzdGF0aWMgdm9pZCBlbmFibGVfbmVzdCAoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJY29uc3Qgc3RydWN0IGlkZV90cF9vcHMgKnRwX29wcyA9IGh3aWYtPnRwX29wczsKIAl1OCBzdGF0OwogCkBAIC02OTcsNyArNjk3LDggQEAKIAogc3RhdGljIGludCBpZGVfcG9ydF93YWl0X3JlYWR5KGlkZV9od2lmX3QgKmh3aWYpCiB7Ci0JaW50IHVuaXQsIHJjOworCWlkZV9kcml2ZV90ICpkcml2ZTsKKwlpbnQgaSwgcmM7CiAKIAlwcmludGsoS0VSTl9ERUJVRyAiUHJvYmluZyBJREUgaW50ZXJmYWNlICVzLi4uXG4iLCBod2lmLT5uYW1lKTsKIApAQCAtNzE0LDkgKzcxNSw3IEBACiAJCXJldHVybiByYzsKIAogCS8qIE5vdyBtYWtlIHN1cmUgYm90aCBtYXN0ZXIgJiBzbGF2ZSBhcmUgcmVhZHkgKi8KLQlmb3IgKHVuaXQgPSAwOyB1bml0IDwgTUFYX0RSSVZFUzsgdW5pdCsrKSB7Ci0JCWlkZV9kcml2ZV90ICpkcml2ZSA9ICZod2lmLT5kcml2ZXNbdW5pdF07Ci0KKwlpZGVfcG9ydF9mb3JfZWFjaF9kZXYoaSwgZHJpdmUsIGh3aWYpIHsKIAkJLyogSWdub3JlIGRpc2tzIHRoYXQgd2Ugd2lsbCBub3QgcHJvYmUgZm9yIGxhdGVyLiAqLwogCQlpZiAoKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfTk9QUk9CRSkgPT0gMCB8fAogCQkgICAgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfUFJFU0VOVCkpIHsKQEAgLTczMiw4ICs3MzEsOCBAQAogCX0KIG91dDoKIAkvKiBFeGl0IGZ1bmN0aW9uIHdpdGggbWFzdGVyIHJlc2VsZWN0ZWQgKGxldCdzIGJlIHNhbmUpICovCi0JaWYgKHVuaXQpCi0JCVNFTEVDVF9EUklWRSgmaHdpZi0+ZHJpdmVzWzBdKTsKKwlpZiAoaSkKKwkJU0VMRUNUX0RSSVZFKGh3aWYtPmRldmljZXNbMF0pOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtNzQ5LDcgKzc0OCw3IEBACiAKIHZvaWQgaWRlX3VuZGVjb2RlZF9zbGF2ZShpZGVfZHJpdmVfdCAqZGV2MSkKIHsKLQlpZGVfZHJpdmVfdCAqZGV2MCA9ICZkZXYxLT5od2lmLT5kcml2ZXNbMF07CisJaWRlX2RyaXZlX3QgKmRldjAgPSBkZXYxLT5od2lmLT5kZXZpY2VzWzBdOwogCiAJaWYgKChkZXYxLT5kbiAmIDEpID09IDAgfHwgKGRldjAtPmRldl9mbGFncyAmIElERV9ERkxBR19QUkVTRU5UKSA9PSAwKQogCQlyZXR1cm47CkBAIC03NzgsMTQgKzc3NywxNSBAQAogCiBzdGF0aWMgaW50IGlkZV9wcm9iZV9wb3J0KGlkZV9od2lmX3QgKmh3aWYpCiB7CisJaWRlX2RyaXZlX3QgKmRyaXZlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IGlycWQ7Ci0JaW50IHVuaXQsIHJjID0gLUVOT0RFVjsKKwlpbnQgaSwgcmMgPSAtRU5PREVWOwogCiAJQlVHX09OKGh3aWYtPnByZXNlbnQpOwogCi0JaWYgKChod2lmLT5kcml2ZXNbMF0uZGV2X2ZsYWdzICYgSURFX0RGTEFHX05PUFJPQkUpICYmCi0JICAgIChod2lmLT5kcml2ZXNbMV0uZGV2X2ZsYWdzICYgSURFX0RGTEFHX05PUFJPQkUpKQorCWlmICgoaHdpZi0+ZGV2aWNlc1swXS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX05PUFJPQkUpICYmCisJICAgIChod2lmLT5kZXZpY2VzWzFdLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfTk9QUk9CRSkpCiAJCXJldHVybiAtRUFDQ0VTOwogCiAJLyoKQEAgLTc5Niw3ICs3OTYsOCBAQAogCWlmIChpcnFkKQogCQlkaXNhYmxlX2lycShod2lmLT5pcnEpOwogCi0JbG9jYWxfaXJxX3NldChmbGFncyk7CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWxvY2FsX2lycV9lbmFibGVfaW5faGFyZGlycSgpOwogCiAJaWYgKGlkZV9wb3J0X3dhaXRfcmVhZHkoaHdpZikgPT0gLUVCVVNZKQogCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFdhaXQgZm9yIHJlYWR5IGZhaWxlZCBiZWZvcmUgcHJvYmUgIVxuIiwgaHdpZi0+bmFtZSk7CkBAIC04MDUsOSArODA2LDcgQEAKIAkgKiBTZWNvbmQgZHJpdmUgc2hvdWxkIG9ubHkgZXhpc3QgaWYgZmlyc3QgZHJpdmUgd2FzIGZvdW5kLAogCSAqIGJ1dCBhIGxvdCBvZiBjZHJvbSBkcml2ZXMgYXJlIGNvbmZpZ3VyZWQgYXMgc2luZ2xlIHNsYXZlcy4KIAkgKi8KLQlmb3IgKHVuaXQgPSAwOyB1bml0IDwgTUFYX0RSSVZFUzsgKyt1bml0KSB7Ci0JCWlkZV9kcml2ZV90ICpkcml2ZSA9ICZod2lmLT5kcml2ZXNbdW5pdF07Ci0KKwlpZGVfcG9ydF9mb3JfZWFjaF9kZXYoaSwgZHJpdmUsIGh3aWYpIHsKIAkJKHZvaWQpIHByb2JlX2Zvcl9kcml2ZShkcml2ZSk7CiAJCWlmIChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1BSRVNFTlQpCiAJCQlyYyA9IDA7CkBAIC04MjgsMjAgKzgyNywxNyBAQAogc3RhdGljIHZvaWQgaWRlX3BvcnRfdHVuZV9kZXZpY2VzKGlkZV9od2lmX3QgKmh3aWYpCiB7CiAJY29uc3Qgc3RydWN0IGlkZV9wb3J0X29wcyAqcG9ydF9vcHMgPSBod2lmLT5wb3J0X29wczsKLQlpbnQgdW5pdDsKKwlpZGVfZHJpdmVfdCAqZHJpdmU7CisJaW50IGk7CiAKLQlmb3IgKHVuaXQgPSAwOyB1bml0IDwgTUFYX0RSSVZFUzsgdW5pdCsrKSB7Ci0JCWlkZV9kcml2ZV90ICpkcml2ZSA9ICZod2lmLT5kcml2ZXNbdW5pdF07Ci0KKwlpZGVfcG9ydF9mb3JfZWFjaF9kZXYoaSwgZHJpdmUsIGh3aWYpIHsKIAkJaWYgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfUFJFU0VOVCkgewogCQkJaWYgKHBvcnRfb3BzICYmIHBvcnRfb3BzLT5xdWlya3Byb2MpCiAJCQkJcG9ydF9vcHMtPnF1aXJrcHJvYyhkcml2ZSk7CiAJCX0KIAl9CiAKLQlmb3IgKHVuaXQgPSAwOyB1bml0IDwgTUFYX0RSSVZFUzsgKyt1bml0KSB7Ci0JCWlkZV9kcml2ZV90ICpkcml2ZSA9ICZod2lmLT5kcml2ZXNbdW5pdF07Ci0KKwlpZGVfcG9ydF9mb3JfZWFjaF9kZXYoaSwgZHJpdmUsIGh3aWYpIHsKIAkJaWYgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfUFJFU0VOVCkgewogCQkJaWRlX3NldF9tYXhfcGlvKGRyaXZlKTsKIApAQCAtODUyLDExICs4NDgsOCBAQAogCQl9CiAJfQogCi0JZm9yICh1bml0ID0gMDsgdW5pdCA8IE1BWF9EUklWRVM7ICsrdW5pdCkgewotCQlpZGVfZHJpdmVfdCAqZHJpdmUgPSAmaHdpZi0+ZHJpdmVzW3VuaXRdOwotCi0JCWlmICgoaHdpZi0+aG9zdF9mbGFncyAmIElERV9IRkxBR19OT19JT18zMkJJVCkgfHwKLQkJICAgIGRyaXZlLT5pZFtBVEFfSURfRFdPUkRfSU9dKQorCWlkZV9wb3J0X2Zvcl9lYWNoX2RldihpLCBkcml2ZSwgaHdpZikgeworCQlpZiAoaHdpZi0+aG9zdF9mbGFncyAmIElERV9IRkxBR19OT19JT18zMkJJVCkKIAkJCWRyaXZlLT5kZXZfZmxhZ3MgfD0gSURFX0RGTEFHX05PX0lPXzMyQklUOwogCQllbHNlCiAJCQlkcml2ZS0+ZGV2X2ZsYWdzICY9IH5JREVfREZMQUdfTk9fSU9fMzJCSVQ7CkBAIC04NjksNyArODYyLDcgQEAKIHN0YXRpYyBpbnQgaWRlX2luaXRfcXVldWUoaWRlX2RyaXZlX3QgKmRyaXZlKQogewogCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxOwotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJaW50IG1heF9zZWN0b3JzID0gMjU2OwogCWludCBtYXhfc2dfZW50cmllcyA9IFBSRF9FTlRSSUVTOwogCkBAIC05MTgsMzYgKzkxMSwxOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBpZGVfYWRkX2RyaXZlX3RvX2h3Z3JvdXAoaWRlX2RyaXZlX3QgKmRyaXZlKQotewotCWlkZV9od2dyb3VwX3QgKmh3Z3JvdXAgPSBkcml2ZS0+aHdpZi0+aHdncm91cDsKLQotCXNwaW5fbG9ja19pcnEoJmh3Z3JvdXAtPmxvY2spOwotCWlmICghaHdncm91cC0+ZHJpdmUpIHsKLQkJLyogZmlyc3QgZHJpdmUgZm9yIGh3Z3JvdXAuICovCi0JCWRyaXZlLT5uZXh0ID0gZHJpdmU7Ci0JCWh3Z3JvdXAtPmRyaXZlID0gZHJpdmU7Ci0JCWh3Z3JvdXAtPmh3aWYgPSBIV0lGKGh3Z3JvdXAtPmRyaXZlKTsKLQl9IGVsc2UgewotCQlkcml2ZS0+bmV4dCA9IGh3Z3JvdXAtPmRyaXZlLT5uZXh0OwotCQlod2dyb3VwLT5kcml2ZS0+bmV4dCA9IGRyaXZlOwotCX0KLQlzcGluX3VubG9ja19pcnEoJmh3Z3JvdXAtPmxvY2spOwotfQorc3RhdGljIERFRklORV9NVVRFWChpZGVfY2ZnX210eCk7CiAKIC8qCiAgKiBGb3IgYW55IHByZXNlbnQgZHJpdmU6CiAgKiAtIGFsbG9jYXRlIHRoZSBibG9jayBkZXZpY2UgcXVldWUKLSAqIC0gbGluayBkcml2ZSBpbnRvIHRoZSBod2dyb3VwCiAgKi8KIHN0YXRpYyBpbnQgaWRlX3BvcnRfc2V0dXBfZGV2aWNlcyhpZGVfaHdpZl90ICpod2lmKQogeworCWlkZV9kcml2ZV90ICpkcml2ZTsKIAlpbnQgaSwgaiA9IDA7CiAKIAltdXRleF9sb2NrKCZpZGVfY2ZnX210eCk7Ci0JZm9yIChpID0gMDsgaSA8IE1BWF9EUklWRVM7IGkrKykgewotCQlpZGVfZHJpdmVfdCAqZHJpdmUgPSAmaHdpZi0+ZHJpdmVzW2ldOwotCisJaWRlX3BvcnRfZm9yX2VhY2hfZGV2KGksIGRyaXZlLCBod2lmKSB7CiAJCWlmICgoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19QUkVTRU5UKSA9PSAwKQogCQkJY29udGludWU7CiAKQEAgLTk2MSwxMzkgKzkzNywzOSBAQAogCQl9CiAKIAkJaisrOwotCi0JCWlkZV9hZGRfZHJpdmVfdG9faHdncm91cChkcml2ZSk7CiAJfQogCW11dGV4X3VubG9jaygmaWRlX2NmZ19tdHgpOwogCiAJcmV0dXJuIGo7CiB9CiAKLXN0YXRpYyBpZGVfaHdpZl90ICppZGVfcG9ydHNbTUFYX0hXSUZTXTsKLQotdm9pZCBpZGVfcmVtb3ZlX3BvcnRfZnJvbV9od2dyb3VwKGlkZV9od2lmX3QgKmh3aWYpCi17Ci0JaWRlX2h3Z3JvdXBfdCAqaHdncm91cCA9IGh3aWYtPmh3Z3JvdXA7Ci0KLQlpZGVfcG9ydHNbaHdpZi0+aW5kZXhdID0gTlVMTDsKLQotCXNwaW5fbG9ja19pcnEoJmh3Z3JvdXAtPmxvY2spOwotCS8qCi0JICogUmVtb3ZlIHVzIGZyb20gdGhlIGh3Z3JvdXAsIGFuZCBmcmVlCi0JICogdGhlIGh3Z3JvdXAgaWYgd2Ugd2VyZSB0aGUgb25seSBtZW1iZXIKLQkgKi8KLQlpZiAoaHdpZi0+bmV4dCA9PSBod2lmKSB7Ci0JCUJVR19PTihod2dyb3VwLT5od2lmICE9IGh3aWYpOwotCQlrZnJlZShod2dyb3VwKTsKLQl9IGVsc2UgewotCQkvKiBUaGVyZSBpcyBhbm90aGVyIGludGVyZmFjZSBpbiBod2dyb3VwLgotCQkgKiBVbmxpbmsgdXMsIGFuZCBzZXQgaHdncm91cC0+ZHJpdmUgYW5kIC0+aHdpZiB0bwotCQkgKiBzb21ldGhpbmcgc2FuZS4KLQkJICovCi0JCWlkZV9od2lmX3QgKmcgPSBod2dyb3VwLT5od2lmOwotCi0JCXdoaWxlIChnLT5uZXh0ICE9IGh3aWYpCi0JCQlnID0gZy0+bmV4dDsKLQkJZy0+bmV4dCA9IGh3aWYtPm5leHQ7Ci0JCWlmIChod2dyb3VwLT5od2lmID09IGh3aWYpIHsKLQkJCS8qIENob3NlIGEgcmFuZG9tIGh3aWYgZm9yIGh3Z3JvdXAtPmh3aWYuCi0JCQkgKiBJdCdzIGd1YXJhbnRlZWQgdGhhdCB0aGVyZSBhcmUgbm8gZHJpdmVzCi0JCQkgKiBsZWZ0IGluIHRoZSBod2dyb3VwLgotCQkJICovCi0JCQlCVUdfT04oaHdncm91cC0+ZHJpdmUgIT0gTlVMTCk7Ci0JCQlod2dyb3VwLT5od2lmID0gZzsKLQkJfQotCQlCVUdfT04oaHdncm91cC0+aHdpZiA9PSBod2lmKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCZod2dyb3VwLT5sb2NrKTsKLX0KLQogLyoKLSAqIFRoaXMgcm91dGluZSBzZXRzIHVwIHRoZSBpcnEgZm9yIGFuIGlkZSBpbnRlcmZhY2UsIGFuZCBjcmVhdGVzIGEgbmV3Ci0gKiBod2dyb3VwIGZvciB0aGUgaXJxL2h3aWYgaWYgbm9uZSB3YXMgcHJldmlvdXNseSBhc3NpZ25lZC4KLSAqCi0gKiBNdWNoIG9mIHRoZSBjb2RlIGlzIGZvciBjb3JyZWN0bHkgZGV0ZWN0aW5nL2hhbmRsaW5nIGlycSBzaGFyaW5nCi0gKiBhbmQgaXJxIHNlcmlhbGl6YXRpb24gc2l0dWF0aW9ucy4gIFRoaXMgaXMgc29tZXdoYXQgY29tcGxleCBiZWNhdXNlCi0gKiBpdCBoYW5kbGVzIHN0YXRpYyBhcyB3ZWxsIGFzIGR5bmFtaWMgKFBDTUNJQSkgSURFIGludGVyZmFjZXMuCisgKiBUaGlzIHJvdXRpbmUgc2V0cyB1cCB0aGUgSVJRIGZvciBhbiBJREUgaW50ZXJmYWNlLgogICovCiBzdGF0aWMgaW50IGluaXRfaXJxIChpZGVfaHdpZl90ICpod2lmKQogewogCXN0cnVjdCBpZGVfaW9fcG9ydHMgKmlvX3BvcnRzID0gJmh3aWYtPmlvX3BvcnRzOwotCXVuc2lnbmVkIGludCBpbmRleDsKLQlpZGVfaHdncm91cF90ICpod2dyb3VwOwotCWlkZV9od2lmX3QgKm1hdGNoID0gTlVMTDsKKwlpbnQgc2EgPSAwOwogCiAJbXV0ZXhfbG9jaygmaWRlX2NmZ19tdHgpOwotCWh3aWYtPmh3Z3JvdXAgPSBOVUxMOworCXNwaW5fbG9ja19pbml0KCZod2lmLT5sb2NrKTsKIAotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1BWF9IV0lGUzsgaW5kZXgrKykgewotCQlpZGVfaHdpZl90ICpoID0gaWRlX3BvcnRzW2luZGV4XTsKKwlpbml0X3RpbWVyKCZod2lmLT50aW1lcik7CisJaHdpZi0+dGltZXIuZnVuY3Rpb24gPSAmaWRlX3RpbWVyX2V4cGlyeTsKKwlod2lmLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaHdpZjsKIAotCQlpZiAoaCAmJiBoLT5od2dyb3VwKSB7ICAvKiBzY2FuIG9ubHkgaW5pdGlhbGl6ZWQgcG9ydHMgKi8KLQkJCWlmIChod2lmLT5ob3N0LT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX1NFUklBTElaRSkgewotCQkJCWlmIChod2lmLT5ob3N0ID09IGgtPmhvc3QpCi0JCQkJCW1hdGNoID0gaDsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogSWYgd2UgYXJlIHN0aWxsIHdpdGhvdXQgYSBod2dyb3VwLCB0aGVuIGZvcm0gYSBuZXcgb25lCi0JICovCi0JaWYgKG1hdGNoKSB7Ci0JCWh3Z3JvdXAgPSBtYXRjaC0+aHdncm91cDsKLQkJaHdpZi0+aHdncm91cCA9IGh3Z3JvdXA7Ci0JCS8qCi0JCSAqIExpbmsgdXMgaW50byB0aGUgaHdncm91cC4KLQkJICogVGhpcyBtdXN0IGJlIGRvbmUgZWFybHksIGRvIGVuc3VyZSB0aGF0IHVuZXhwZWN0ZWRfaW50cgotCQkgKiBjYW4gZmluZCB0aGUgaHdpZiBhbmQgcHJldmVudCBpcnEgc3Rvcm1zLgotCQkgKiBObyBkcml2ZXMgYXJlIGF0dGFjaGVkIHRvIHRoZSBuZXcgaHdpZiwgY2hvb3NlX2RyaXZlCi0JCSAqIGNhbid0IGRvIGFueXRoaW5nIHN0dXBpZCAoeWV0KS4KLQkJICogQWRkIG91cnNlbGYgYXMgdGhlIDJuZCBlbnRyeSB0byB0aGUgaHdncm91cC0+aHdpZgotCQkgKiBsaW5rZWQgbGlzdCwgdGhlIGZpcnN0IGVudHJ5IGlzIHRoZSBod2lmIHRoYXQgb3ducwotCQkgKiBod2dyb3VwLT5oYW5kbGVyIC0gZG8gbm90IGNoYW5nZSB0aGF0LgotCQkgKi8KLQkJc3Bpbl9sb2NrX2lycSgmaHdncm91cC0+bG9jayk7Ci0JCWh3aWYtPm5leHQgPSBod2dyb3VwLT5od2lmLT5uZXh0OwotCQlod2dyb3VwLT5od2lmLT5uZXh0ID0gaHdpZjsKLQkJQlVHX09OKGh3aWYtPm5leHQgPT0gaHdpZik7Ci0JCXNwaW5fdW5sb2NrX2lycSgmaHdncm91cC0+bG9jayk7Ci0JfSBlbHNlIHsKLQkJaHdncm91cCA9IGttYWxsb2Nfbm9kZShzaXplb2YoKmh3Z3JvdXApLCBHRlBfS0VSTkVMfF9fR0ZQX1pFUk8sCi0JCQkJICAgICAgIGh3aWZfdG9fbm9kZShod2lmKSk7Ci0JCWlmIChod2dyb3VwID09IE5VTEwpCi0JCQlnb3RvIG91dF91cDsKLQotCQlzcGluX2xvY2tfaW5pdCgmaHdncm91cC0+bG9jayk7Ci0KLQkJaHdpZi0+aHdncm91cCA9IGh3Z3JvdXA7Ci0JCWh3Z3JvdXAtPmh3aWYgPSBod2lmLT5uZXh0ID0gaHdpZjsKLQotCQlpbml0X3RpbWVyKCZod2dyb3VwLT50aW1lcik7Ci0JCWh3Z3JvdXAtPnRpbWVyLmZ1bmN0aW9uID0gJmlkZV90aW1lcl9leHBpcnk7Ci0JCWh3Z3JvdXAtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgaHdncm91cDsKLQl9Ci0KLQlpZGVfcG9ydHNbaHdpZi0+aW5kZXhdID0gaHdpZjsKLQotCS8qCi0JICogQWxsb2NhdGUgdGhlIGlycSwgaWYgbm90IGFscmVhZHkgb2J0YWluZWQgZm9yIGFub3RoZXIgaHdpZgotCSAqLwotCWlmICghbWF0Y2ggfHwgbWF0Y2gtPmlycSAhPSBod2lmLT5pcnEpIHsKLQkJaW50IHNhID0gMDsKICNpZiBkZWZpbmVkKF9fbWM2ODAwMF9fKQotCQlzYSA9IElSUUZfU0hBUkVEOworCXNhID0gSVJRRl9TSEFSRUQ7CiAjZW5kaWYgLyogX19tYzY4MDAwX18gKi8KIAotCQlpZiAoaHdpZi0+Y2hpcHNldCA9PSBpZGVfcGNpKQotCQkJc2EgPSBJUlFGX1NIQVJFRDsKKwlpZiAoaHdpZi0+Y2hpcHNldCA9PSBpZGVfcGNpKQorCQlzYSA9IElSUUZfU0hBUkVEOwogCi0JCWlmIChpb19wb3J0cy0+Y3RsX2FkZHIpCi0JCQlod2lmLT50cF9vcHMtPnNldF9pcnEoaHdpZiwgMSk7CisJaWYgKGlvX3BvcnRzLT5jdGxfYWRkcikKKwkJaHdpZi0+dHBfb3BzLT5zZXRfaXJxKGh3aWYsIDEpOwogCi0JCWlmIChyZXF1ZXN0X2lycShod2lmLT5pcnEsJmlkZV9pbnRyLHNhLGh3aWYtPm5hbWUsaHdncm91cCkpCi0JICAgICAgIAkJZ290byBvdXRfdW5saW5rOwotCX0KKwlpZiAocmVxdWVzdF9pcnEoaHdpZi0+aXJxLCAmaWRlX2ludHIsIHNhLCBod2lmLT5uYW1lLCBod2lmKSkKKwkJZ290byBvdXRfdXA7CiAKIAlpZiAoIWh3aWYtPnJxc2l6ZSkgewogCQlpZiAoKGh3aWYtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfTk9fTEJBNDgpIHx8CkBAIC0xMTExLDE0ICs5ODcsMTIgQEAKIAlwcmludGsoS0VSTl9JTkZPICIlcyBhdCAweCUwOGx4IG9uIGlycSAlZCIsIGh3aWYtPm5hbWUsCiAJCWlvX3BvcnRzLT5kYXRhX2FkZHIsIGh3aWYtPmlycSk7CiAjZW5kaWYgLyogX19tYzY4MDAwX18gKi8KLQlpZiAobWF0Y2gpCi0JCXByaW50ayhLRVJOX0NPTlQgIiAoc2VyaWFsaXplZCB3aXRoICVzKSIsIG1hdGNoLT5uYW1lKTsKKwlpZiAoaHdpZi0+aG9zdC0+aG9zdF9mbGFncyAmIElERV9IRkxBR19TRVJJQUxJWkUpCisJCXByaW50ayhLRVJOX0NPTlQgIiAoc2VyaWFsaXplZCkiKTsKIAlwcmludGsoS0VSTl9DT05UICJcbiIpOwogCiAJbXV0ZXhfdW5sb2NrKCZpZGVfY2ZnX210eCk7CiAJcmV0dXJuIDA7Ci1vdXRfdW5saW5rOgotCWlkZV9yZW1vdmVfcG9ydF9mcm9tX2h3Z3JvdXAoaHdpZik7CiBvdXRfdXA6CiAJbXV0ZXhfdW5sb2NrKCZpZGVfY2ZnX210eCk7CiAJcmV0dXJuIDE7CkBAIC0xMTM0LDcgKzEwMDgsNyBAQAogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkYXRhOwogCWludCB1bml0ID0gKnBhcnQgPj4gUEFSVE5fQklUUzsKLQlpZGVfZHJpdmVfdCAqZHJpdmUgPSAmaHdpZi0+ZHJpdmVzW3VuaXRdOworCWlkZV9kcml2ZV90ICpkcml2ZSA9IGh3aWYtPmRldmljZXNbdW5pdF07CiAKIAlpZiAoKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfUFJFU0VOVCkgPT0gMCkKIAkJcmV0dXJuIE5VTEw7CkBAIC0xMTk2LDQ3ICsxMDcwLDIzIEBACiAKIEVYUE9SVF9TWU1CT0xfR1BMKGlkZV9pbml0X2Rpc2spOwogCi1zdGF0aWMgdm9pZCBpZGVfcmVtb3ZlX2RyaXZlX2Zyb21faHdncm91cChpZGVfZHJpdmVfdCAqZHJpdmUpCi17Ci0JaWRlX2h3Z3JvdXBfdCAqaHdncm91cCA9IGRyaXZlLT5od2lmLT5od2dyb3VwOwotCi0JaWYgKGRyaXZlID09IGRyaXZlLT5uZXh0KSB7Ci0JCS8qIHNwZWNpYWwgY2FzZTogbGFzdCBkcml2ZSBmcm9tIGh3Z3JvdXAuICovCi0JCUJVR19PTihod2dyb3VwLT5kcml2ZSAhPSBkcml2ZSk7Ci0JCWh3Z3JvdXAtPmRyaXZlID0gTlVMTDsKLQl9IGVsc2UgewotCQlpZGVfZHJpdmVfdCAqd2FsazsKLQotCQl3YWxrID0gaHdncm91cC0+ZHJpdmU7Ci0JCXdoaWxlICh3YWxrLT5uZXh0ICE9IGRyaXZlKQotCQkJd2FsayA9IHdhbGstPm5leHQ7Ci0JCXdhbGstPm5leHQgPSBkcml2ZS0+bmV4dDsKLQkJaWYgKGh3Z3JvdXAtPmRyaXZlID09IGRyaXZlKSB7Ci0JCQlod2dyb3VwLT5kcml2ZSA9IGRyaXZlLT5uZXh0OwotCQkJaHdncm91cC0+aHdpZiA9IGh3Z3JvdXAtPmRyaXZlLT5od2lmOwotCQl9Ci0JfQotCUJVR19PTihod2dyb3VwLT5kcml2ZSA9PSBkcml2ZSk7Ci19Ci0KIHN0YXRpYyB2b2lkIGRyaXZlX3JlbGVhc2VfZGV2IChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJaWRlX2RyaXZlX3QgKmRyaXZlID0gY29udGFpbmVyX29mKGRldiwgaWRlX2RyaXZlX3QsIGdlbmRldik7Ci0JaWRlX2h3Z3JvdXBfdCAqaHdncm91cCA9IGRyaXZlLT5od2lmLT5od2dyb3VwOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAogCWlkZV9wcm9jX3VucmVnaXN0ZXJfZGV2aWNlKGRyaXZlKTsKIAotCXNwaW5fbG9ja19pcnEoJmh3Z3JvdXAtPmxvY2spOwotCWlkZV9yZW1vdmVfZHJpdmVfZnJvbV9od2dyb3VwKGRyaXZlKTsKKwlzcGluX2xvY2tfaXJxKCZod2lmLT5sb2NrKTsKIAlrZnJlZShkcml2ZS0+aWQpOwogCWRyaXZlLT5pZCA9IE5VTEw7CiAJZHJpdmUtPmRldl9mbGFncyAmPSB+SURFX0RGTEFHX1BSRVNFTlQ7CiAJLyogTWVzc2VkIHVwIGxvY2tpbmcgLi4uICovCi0Jc3Bpbl91bmxvY2tfaXJxKCZod2dyb3VwLT5sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmh3aWYtPmxvY2spOwogCWJsa19jbGVhbnVwX3F1ZXVlKGRyaXZlLT5xdWV1ZSk7Ci0Jc3Bpbl9sb2NrX2lycSgmaHdncm91cC0+bG9jayk7CisJc3Bpbl9sb2NrX2lycSgmaHdpZi0+bG9jayk7CiAJZHJpdmUtPnF1ZXVlID0gTlVMTDsKLQlzcGluX3VubG9ja19pcnEoJmh3Z3JvdXAtPmxvY2spOworCXNwaW5fdW5sb2NrX2lycSgmaHdpZi0+bG9jayk7CiAKIAljb21wbGV0ZSgmZHJpdmUtPmdlbmRldl9yZWxfY29tcCk7CiB9CkBAIC0xMzAyLDEwICsxMTUyLDEwIEBACiAKIHN0YXRpYyB2b2lkIGh3aWZfcmVnaXN0ZXJfZGV2aWNlcyhpZGVfaHdpZl90ICpod2lmKQogeworCWlkZV9kcml2ZV90ICpkcml2ZTsKIAl1bnNpZ25lZCBpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBNQVhfRFJJVkVTOyBpKyspIHsKLQkJaWRlX2RyaXZlX3QgKmRyaXZlID0gJmh3aWYtPmRyaXZlc1tpXTsKKwlpZGVfcG9ydF9mb3JfZWFjaF9kZXYoaSwgZHJpdmUsIGh3aWYpIHsKIAkJc3RydWN0IGRldmljZSAqZGV2ID0gJmRyaXZlLT5nZW5kZXY7CiAJCWludCByZXQ7CiAKQEAgLTEzMjgsMTEgKzExNzgsMTAgQEAKIHN0YXRpYyB2b2lkIGlkZV9wb3J0X2luaXRfZGV2aWNlcyhpZGVfaHdpZl90ICpod2lmKQogewogCWNvbnN0IHN0cnVjdCBpZGVfcG9ydF9vcHMgKnBvcnRfb3BzID0gaHdpZi0+cG9ydF9vcHM7CisJaWRlX2RyaXZlX3QgKmRyaXZlOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IE1BWF9EUklWRVM7IGkrKykgewotCQlpZGVfZHJpdmVfdCAqZHJpdmUgPSAmaHdpZi0+ZHJpdmVzW2ldOwotCisJaWRlX3BvcnRfZm9yX2VhY2hfZGV2KGksIGRyaXZlLCBod2lmKSB7CiAJCWRyaXZlLT5kbiA9IGkgKyBod2lmLT5jaGFubmVsICogMjsKIAogCQlpZiAoaHdpZi0+aG9zdF9mbGFncyAmIElERV9IRkxBR19JT18zMkJJVCkKQEAgLTEzODAsNiArMTIyOSw4IEBACiAJaWYgKChkLT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX05PX0RNQSkgPT0gMCkgewogCQlpbnQgcmM7CiAKKwkJaHdpZi0+ZG1hX29wcyA9IGQtPmRtYV9vcHM7CisKIAkJaWYgKGQtPmluaXRfZG1hKQogCQkJcmMgPSBkLT5pbml0X2RtYShod2lmLCBkKTsKIAkJZWxzZQpAQCAtMTM4NywxMiArMTIzOCwxMyBAQAogCiAJCWlmIChyYyA8IDApIHsKIAkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBETUEgZGlzYWJsZWRcbiIsIGh3aWYtPm5hbWUpOworCisJCQlod2lmLT5kbWFfb3BzID0gTlVMTDsKIAkJCWh3aWYtPmRtYV9iYXNlID0gMDsKIAkJCWh3aWYtPnN3ZG1hX21hc2sgPSAwOwogCQkJaHdpZi0+bXdkbWFfbWFzayA9IDA7CiAJCQlod2lmLT51bHRyYV9tYXNrID0gMDsKLQkJfSBlbHNlIGlmIChkLT5kbWFfb3BzKQotCQkJaHdpZi0+ZG1hX29wcyA9IGQtPmRtYV9vcHM7CisJCX0KIAl9CiAKIAlpZiAoKGQtPmhvc3RfZmxhZ3MgJiBJREVfSEZMQUdfU0VSSUFMSVpFKSB8fApAQCAtMTQxNyw2ICsxMjY5LDY2IEBACiAJfQogfQogCitzdGF0aWMgY29uc3QgdTggaWRlX2h3aWZfdG9fbWFqb3JbXSA9CisJeyBJREUwX01BSk9SLCBJREUxX01BSk9SLCBJREUyX01BSk9SLCBJREUzX01BSk9SLCBJREU0X01BSk9SLAorCSAgSURFNV9NQUpPUiwgSURFNl9NQUpPUiwgSURFN19NQUpPUiwgSURFOF9NQUpPUiwgSURFOV9NQUpPUiB9OworCitzdGF0aWMgdm9pZCBpZGVfcG9ydF9pbml0X2RldmljZXNfZGF0YShpZGVfaHdpZl90ICpod2lmKQoreworCWlkZV9kcml2ZV90ICpkcml2ZTsKKwlpbnQgaTsKKworCWlkZV9wb3J0X2Zvcl9lYWNoX2RldihpLCBkcml2ZSwgaHdpZikgeworCQl1OCBqID0gKGh3aWYtPmluZGV4ICogTUFYX0RSSVZFUykgKyBpOworCisJCW1lbXNldChkcml2ZSwgMCwgc2l6ZW9mKCpkcml2ZSkpOworCisJCWRyaXZlLT5tZWRpYQkJCT0gaWRlX2Rpc2s7CisJCWRyaXZlLT5zZWxlY3QJCQk9IChpIDw8IDQpIHwgQVRBX0RFVklDRV9PQlM7CisJCWRyaXZlLT5od2lmCQkJPSBod2lmOworCQlkcml2ZS0+cmVhZHlfc3RhdAkJPSBBVEFfRFJEWTsKKwkJZHJpdmUtPmJhZF93c3RhdAkJPSBCQURfV19TVEFUOworCQlkcml2ZS0+c3BlY2lhbC5iLnJlY2FsaWJyYXRlCT0gMTsKKwkJZHJpdmUtPnNwZWNpYWwuYi5zZXRfZ2VvbWV0cnkJPSAxOworCQlkcml2ZS0+bmFtZVswXQkJCT0gJ2gnOworCQlkcml2ZS0+bmFtZVsxXQkJCT0gJ2QnOworCQlkcml2ZS0+bmFtZVsyXQkJCT0gJ2EnICsgajsKKwkJZHJpdmUtPm1heF9mYWlsdXJlcwkJPSBJREVfREVGQVVMVF9NQVhfRkFJTFVSRVM7CisKKwkJSU5JVF9MSVNUX0hFQUQoJmRyaXZlLT5saXN0KTsKKwkJaW5pdF9jb21wbGV0aW9uKCZkcml2ZS0+Z2VuZGV2X3JlbF9jb21wKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGlkZV9pbml0X3BvcnRfZGF0YShpZGVfaHdpZl90ICpod2lmLCB1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJLyogZmlsbCBpbiBhbnkgbm9uLXplcm8gaW5pdGlhbCB2YWx1ZXMgKi8KKwlod2lmLT5pbmRleAk9IGluZGV4OworCWh3aWYtPm1ham9yCT0gaWRlX2h3aWZfdG9fbWFqb3JbaW5kZXhdOworCisJaHdpZi0+bmFtZVswXQk9ICdpJzsKKwlod2lmLT5uYW1lWzFdCT0gJ2QnOworCWh3aWYtPm5hbWVbMl0JPSAnZSc7CisJaHdpZi0+bmFtZVszXQk9ICcwJyArIGluZGV4OworCisJaW5pdF9jb21wbGV0aW9uKCZod2lmLT5nZW5kZXZfcmVsX2NvbXApOworCisJaHdpZi0+dHBfb3BzID0gJmRlZmF1bHRfdHBfb3BzOworCisJaWRlX3BvcnRfaW5pdF9kZXZpY2VzX2RhdGEoaHdpZik7Cit9CisKK3N0YXRpYyB2b2lkIGlkZV9pbml0X3BvcnRfaHcoaWRlX2h3aWZfdCAqaHdpZiwgaHdfcmVnc190ICpodykKK3sKKwltZW1jcHkoJmh3aWYtPmlvX3BvcnRzLCAmaHctPmlvX3BvcnRzLCBzaXplb2YoaHdpZi0+aW9fcG9ydHMpKTsKKwlod2lmLT5pcnEgPSBody0+aXJxOworCWh3aWYtPmNoaXBzZXQgPSBody0+Y2hpcHNldDsKKwlod2lmLT5kZXYgPSBody0+ZGV2OworCWh3aWYtPmdlbmRldi5wYXJlbnQgPSBody0+cGFyZW50ID8gaHctPnBhcmVudCA6IGh3LT5kZXY7CisJaHdpZi0+YWNrX2ludHIgPSBody0+YWNrX2ludHI7CisJaHdpZi0+Y29uZmlnX2RhdGEgPSBody0+Y29uZmlnOworfQorCiBzdGF0aWMgdW5zaWduZWQgaW50IGlkZV9pbmRleGVzOwogCiAvKioKQEAgLTE0NjYsMTIgKzEzNzgsNDMgQEAKIAltdXRleF91bmxvY2soJmlkZV9jZmdfbXR4KTsKIH0KIAorc3RhdGljIHZvaWQgaWRlX3BvcnRfZnJlZV9kZXZpY2VzKGlkZV9od2lmX3QgKmh3aWYpCit7CisJaWRlX2RyaXZlX3QgKmRyaXZlOworCWludCBpOworCisJaWRlX3BvcnRfZm9yX2VhY2hfZGV2KGksIGRyaXZlLCBod2lmKQorCQlrZnJlZShkcml2ZSk7Cit9CisKK3N0YXRpYyBpbnQgaWRlX3BvcnRfYWxsb2NfZGV2aWNlcyhpZGVfaHdpZl90ICpod2lmLCBpbnQgbm9kZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfRFJJVkVTOyBpKyspIHsKKwkJaWRlX2RyaXZlX3QgKmRyaXZlOworCisJCWRyaXZlID0ga3phbGxvY19ub2RlKHNpemVvZigqZHJpdmUpLCBHRlBfS0VSTkVMLCBub2RlKTsKKwkJaWYgKGRyaXZlID09IE5VTEwpCisJCQlnb3RvIG91dF9ub21lbTsKKworCQlod2lmLT5kZXZpY2VzW2ldID0gZHJpdmU7CisJfQorCXJldHVybiAwOworCitvdXRfbm9tZW06CisJaWRlX3BvcnRfZnJlZV9kZXZpY2VzKGh3aWYpOworCXJldHVybiAtRU5PTUVNOworfQorCiBzdHJ1Y3QgaWRlX2hvc3QgKmlkZV9ob3N0X2FsbG9jKGNvbnN0IHN0cnVjdCBpZGVfcG9ydF9pbmZvICpkLCBod19yZWdzX3QgKipod3MpCiB7CiAJc3RydWN0IGlkZV9ob3N0ICpob3N0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGh3c1swXSA/IGh3c1swXS0+ZGV2IDogTlVMTDsKKwlpbnQgbm9kZSA9IGRldiA/IGRldl90b19ub2RlKGRldikgOiAtMTsKIAlpbnQgaTsKIAotCWhvc3QgPSBremFsbG9jKHNpemVvZigqaG9zdCksIEdGUF9LRVJORUwpOworCWhvc3QgPSBremFsbG9jX25vZGUoc2l6ZW9mKCpob3N0KSwgR0ZQX0tFUk5FTCwgbm9kZSk7CiAJaWYgKGhvc3QgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTE0ODIsMTAgKzE0MjUsMTUgQEAKIAkJaWYgKGh3c1tpXSA9PSBOVUxMKQogCQkJY29udGludWU7CiAKLQkJaHdpZiA9IGt6YWxsb2Moc2l6ZW9mKCpod2lmKSwgR0ZQX0tFUk5FTCk7CisJCWh3aWYgPSBremFsbG9jX25vZGUoc2l6ZW9mKCpod2lmKSwgR0ZQX0tFUk5FTCwgbm9kZSk7CiAJCWlmIChod2lmID09IE5VTEwpCiAJCQljb250aW51ZTsKIAorCQlpZiAoaWRlX3BvcnRfYWxsb2NfZGV2aWNlcyhod2lmLCBub2RlKSA8IDApIHsKKwkJCWtmcmVlKGh3aWYpOworCQkJY29udGludWU7CisJCX0KKwogCQlpZHggPSBpZGVfZmluZF9wb3J0X3Nsb3QoZCk7CiAJCWlmIChpZHggPCAwKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBubyBmcmVlIHNsb3QgZm9yIGludGVyZmFjZVxuIiwKQEAgLTE1MDcsOCArMTQ1NSw3IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAotCWlmIChod3NbMF0pCi0JCWhvc3QtPmRldlswXSA9IGh3c1swXS0+ZGV2OworCWhvc3QtPmRldlswXSA9IGRldjsKIAogCWlmIChkKSB7CiAJCWhvc3QtPmluaXRfY2hpcHNldCA9IGQtPmluaXRfY2hpcHNldDsKQEAgLTE1MjUsOSArMTQ3Miw3IEBACiAJaWRlX2h3aWZfdCAqaHdpZiwgKm1hdGUgPSBOVUxMOwogCWludCBpLCBqID0gMDsKIAotCWZvciAoaSA9IDA7IGkgPCBNQVhfSE9TVF9QT1JUUzsgaSsrKSB7Ci0JCWh3aWYgPSBob3N0LT5wb3J0c1tpXTsKLQorCWlkZV9ob3N0X2Zvcl9lYWNoX3BvcnQoaSwgaHdpZiwgaG9zdCkgewogCQlpZiAoaHdpZiA9PSBOVUxMKSB7CiAJCQltYXRlID0gTlVMTDsKIAkJCWNvbnRpbnVlOwpAQCAtMTU1Myw5ICsxNDk4LDcgQEAKIAkJaWRlX3BvcnRfaW5pdF9kZXZpY2VzKGh3aWYpOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBNQVhfSE9TVF9QT1JUUzsgaSsrKSB7Ci0JCWh3aWYgPSBob3N0LT5wb3J0c1tpXTsKLQorCWlkZV9ob3N0X2Zvcl9lYWNoX3BvcnQoaSwgaHdpZiwgaG9zdCkgewogCQlpZiAoaHdpZiA9PSBOVUxMKQogCQkJY29udGludWU7CiAKQEAgLTE1NzAsOSArMTUxMyw3IEBACiAJCQlpZGVfcG9ydF90dW5lX2RldmljZXMoaHdpZik7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IE1BWF9IT1NUX1BPUlRTOyBpKyspIHsKLQkJaHdpZiA9IGhvc3QtPnBvcnRzW2ldOwotCisJaWRlX2hvc3RfZm9yX2VhY2hfcG9ydChpLCBod2lmLCBob3N0KSB7CiAJCWlmIChod2lmID09IE5VTEwpCiAJCQljb250aW51ZTsKIApAQCAtMTU5Nyw5ICsxNTM4LDcgQEAKIAkJCWlkZV9hY3BpX3BvcnRfaW5pdF9kZXZpY2VzKGh3aWYpOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBNQVhfSE9TVF9QT1JUUzsgaSsrKSB7Ci0JCWh3aWYgPSBob3N0LT5wb3J0c1tpXTsKLQorCWlkZV9ob3N0X2Zvcl9lYWNoX3BvcnQoaSwgaHdpZiwgaG9zdCkgewogCQlpZiAoaHdpZiA9PSBOVUxMKQogCQkJY29udGludWU7CiAKQEAgLTE2MDcsOSArMTU0Niw3IEBACiAJCQlod2lmX3JlZ2lzdGVyX2RldmljZXMoaHdpZik7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IE1BWF9IT1NUX1BPUlRTOyBpKyspIHsKLQkJaHdpZiA9IGhvc3QtPnBvcnRzW2ldOwotCisJaWRlX2hvc3RfZm9yX2VhY2hfcG9ydChpLCBod2lmLCBob3N0KSB7CiAJCWlmIChod2lmID09IE5VTEwpCiAJCQljb250aW51ZTsKIApAQCAtMTY0NywxNyArMTU4NCw4NSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoaWRlX2hvc3RfYWRkKTsKIAorc3RhdGljIHZvaWQgX19pZGVfcG9ydF91bnJlZ2lzdGVyX2RldmljZXMoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwlpZGVfZHJpdmVfdCAqZHJpdmU7CisJaW50IGk7CisKKwlpZGVfcG9ydF9mb3JfZWFjaF9kZXYoaSwgZHJpdmUsIGh3aWYpIHsKKwkJaWYgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfUFJFU0VOVCkgeworCQkJZGV2aWNlX3VucmVnaXN0ZXIoJmRyaXZlLT5nZW5kZXYpOworCQkJd2FpdF9mb3JfY29tcGxldGlvbigmZHJpdmUtPmdlbmRldl9yZWxfY29tcCk7CisJCX0KKwl9Cit9CisKK3ZvaWQgaWRlX3BvcnRfdW5yZWdpc3Rlcl9kZXZpY2VzKGlkZV9od2lmX3QgKmh3aWYpCit7CisJbXV0ZXhfbG9jaygmaWRlX2NmZ19tdHgpOworCV9faWRlX3BvcnRfdW5yZWdpc3Rlcl9kZXZpY2VzKGh3aWYpOworCWh3aWYtPnByZXNlbnQgPSAwOworCWlkZV9wb3J0X2luaXRfZGV2aWNlc19kYXRhKGh3aWYpOworCW11dGV4X3VubG9jaygmaWRlX2NmZ19tdHgpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaWRlX3BvcnRfdW5yZWdpc3Rlcl9kZXZpY2VzKTsKKworLyoqCisgKglpZGVfdW5yZWdpc3RlcgkJLQlmcmVlIGFuIElERSBpbnRlcmZhY2UKKyAqCUBod2lmOiBJREUgaW50ZXJmYWNlCisgKgorICoJUGVyZm9ybSB0aGUgZmluYWwgdW5yZWdpc3RlciBvZiBhbiBJREUgaW50ZXJmYWNlLgorICoKKyAqCUxvY2tpbmc6CisgKglUaGUgY2FsbGVyIG11c3Qgbm90IGhvbGQgdGhlIElERSBsb2Nrcy4KKyAqCisgKglJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIGJlIHN1cmUgdGhlcmUgaXMgbm8gcGVuZGluZyBJL08gaGVyZSwKKyAqCWFuZCB0aGF0IHRoZSBpbnRlcmZhY2Ugd2lsbCBub3QgYmUgcmVvcGVuZWQgKHByZXNlbnQvdmFuaXNoaW5nCisgKglsb2NraW5nIGlzbid0IHlldCBkb25lIEJUVykuCisgKi8KKworc3RhdGljIHZvaWQgaWRlX3VucmVnaXN0ZXIoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwlCVUdfT04oaW5faW50ZXJydXB0KCkpOworCUJVR19PTihpcnFzX2Rpc2FibGVkKCkpOworCisJbXV0ZXhfbG9jaygmaWRlX2NmZ19tdHgpOworCisJaWYgKGh3aWYtPnByZXNlbnQpIHsKKwkJX19pZGVfcG9ydF91bnJlZ2lzdGVyX2RldmljZXMoaHdpZik7CisJCWh3aWYtPnByZXNlbnQgPSAwOworCX0KKworCWlkZV9wcm9jX3VucmVnaXN0ZXJfcG9ydChod2lmKTsKKworCWZyZWVfaXJxKGh3aWYtPmlycSwgaHdpZik7CisKKwlkZXZpY2VfdW5yZWdpc3Rlcihod2lmLT5wb3J0ZGV2KTsKKwlkZXZpY2VfdW5yZWdpc3RlcigmaHdpZi0+Z2VuZGV2KTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZod2lmLT5nZW5kZXZfcmVsX2NvbXApOworCisJLyoKKwkgKiBSZW1vdmUgdXMgZnJvbSB0aGUga2VybmVsJ3Mga25vd2xlZGdlCisJICovCisJYmxrX3VucmVnaXN0ZXJfcmVnaW9uKE1LREVWKGh3aWYtPm1ham9yLCAwKSwgTUFYX0RSSVZFUzw8UEFSVE5fQklUUyk7CisJa2ZyZWUoaHdpZi0+c2dfdGFibGUpOworCXVucmVnaXN0ZXJfYmxrZGV2KGh3aWYtPm1ham9yLCBod2lmLT5uYW1lKTsKKworCWlkZV9yZWxlYXNlX2RtYV9lbmdpbmUoaHdpZik7CisKKwltdXRleF91bmxvY2soJmlkZV9jZmdfbXR4KTsKK30KKwogdm9pZCBpZGVfaG9zdF9mcmVlKHN0cnVjdCBpZGVfaG9zdCAqaG9zdCkKIHsKIAlpZGVfaHdpZl90ICpod2lmOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IE1BWF9IT1NUX1BPUlRTOyBpKyspIHsKLQkJaHdpZiA9IGhvc3QtPnBvcnRzW2ldOwotCisJaWRlX2hvc3RfZm9yX2VhY2hfcG9ydChpLCBod2lmLCBob3N0KSB7CiAJCWlmIChod2lmID09IE5VTEwpCiAJCQljb250aW51ZTsKIAorCQlpZGVfcG9ydF9mcmVlX2RldmljZXMoaHdpZik7CiAJCWlkZV9mcmVlX3BvcnRfc2xvdChod2lmLT5pbmRleCk7CiAJCWtmcmVlKGh3aWYpOwogCX0KQEAgLTE2NjgsMTEgKzE2NzMsMTIgQEAKIAogdm9pZCBpZGVfaG9zdF9yZW1vdmUoc3RydWN0IGlkZV9ob3N0ICpob3N0KQogeworCWlkZV9od2lmX3QgKmh3aWY7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0hPU1RfUE9SVFM7IGkrKykgewotCQlpZiAoaG9zdC0+cG9ydHNbaV0pCi0JCQlpZGVfdW5yZWdpc3Rlcihob3N0LT5wb3J0c1tpXSk7CisJaWRlX2hvc3RfZm9yX2VhY2hfcG9ydChpLCBod2lmLCBob3N0KSB7CisJCWlmIChod2lmKQorCQkJaWRlX3VucmVnaXN0ZXIoaHdpZik7CiAJfQogCiAJaWRlX2hvc3RfZnJlZShob3N0KTsKQEAgLTE2OTEsOCArMTY5Nyw4IEBACiAJaHdpZi0+cHJlc2VudCA9IDE7CiAKIAlpZGVfcG9ydF90dW5lX2RldmljZXMoaHdpZik7Ci0JaWRlX2FjcGlfcG9ydF9pbml0X2RldmljZXMoaHdpZik7CiAJaWRlX3BvcnRfc2V0dXBfZGV2aWNlcyhod2lmKTsKKwlpZGVfYWNwaV9wb3J0X2luaXRfZGV2aWNlcyhod2lmKTsKIAlod2lmX3JlZ2lzdGVyX2RldmljZXMoaHdpZik7CiAJaWRlX3Byb2NfcG9ydF9yZWdpc3Rlcl9kZXZpY2VzKGh3aWYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLXByb2MuYyBiL2RyaXZlcnMvaWRlL2lkZS1wcm9jLmMKaW5kZXggYTE0ZTI5My4uMWQ4OTc4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLXByb2MuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtcHJvYy5jCkBAIC00MzksMTMgKzQzOSwxMyBAQAogc3RhdGljIGludCBwcm9jX2lkZV9yZWFkX2RyaXZlcgogCShjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKIHsKLQlpZGVfZHJpdmVfdAkqZHJpdmUgPSAoaWRlX2RyaXZlX3QgKikgZGF0YTsKLQlzdHJ1Y3QgZGV2aWNlCSpkZXYgPSAmZHJpdmUtPmdlbmRldjsKLQlpZGVfZHJpdmVyX3QJKmlkZV9kcnY7Ci0JaW50CQlsZW47CisJaWRlX2RyaXZlX3QJCSpkcml2ZSA9IChpZGVfZHJpdmVfdCAqKWRhdGE7CisJc3RydWN0IGRldmljZQkJKmRldiA9ICZkcml2ZS0+Z2VuZGV2OworCXN0cnVjdCBpZGVfZHJpdmVyCSppZGVfZHJ2OworCWludAkJCWxlbjsKIAogCWlmIChkZXYtPmRyaXZlcikgewotCQlpZGVfZHJ2ID0gY29udGFpbmVyX29mKGRldi0+ZHJpdmVyLCBpZGVfZHJpdmVyX3QsIGdlbl9kcml2ZXIpOworCQlpZGVfZHJ2ID0gdG9faWRlX2RyaXZlcihkZXYtPmRyaXZlcik7CiAJCWxlbiA9IHNwcmludGYocGFnZSwgIiVzIHZlcnNpb24gJXNcbiIsCiAJCQkJZGV2LT5kcml2ZXItPm5hbWUsIGlkZV9kcnYtPnZlcnNpb24pOwogCX0gZWxzZQpAQCAtNTU1LDcgKzU1NSw3IEBACiAJfQogfQogCi12b2lkIGlkZV9wcm9jX3JlZ2lzdGVyX2RyaXZlcihpZGVfZHJpdmVfdCAqZHJpdmUsIGlkZV9kcml2ZXJfdCAqZHJpdmVyKQordm9pZCBpZGVfcHJvY19yZWdpc3Rlcl9kcml2ZXIoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgaWRlX2RyaXZlciAqZHJpdmVyKQogewogCW11dGV4X2xvY2soJmlkZV9zZXR0aW5nX210eCk7CiAJZHJpdmUtPnNldHRpbmdzID0gZHJpdmVyLT5wcm9jX2RldnNldHMoZHJpdmUpOwpAQCAtNTc3LDcgKzU3Nyw3IEBACiAgKglUYWtlcyBpZGVfc2V0dGluZ19tdHguCiAgKi8KIAotdm9pZCBpZGVfcHJvY191bnJlZ2lzdGVyX2RyaXZlcihpZGVfZHJpdmVfdCAqZHJpdmUsIGlkZV9kcml2ZXJfdCAqZHJpdmVyKQordm9pZCBpZGVfcHJvY191bnJlZ2lzdGVyX2RyaXZlcihpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCBpZGVfZHJpdmVyICpkcml2ZXIpCiB7CiAJaWRlX3JlbW92ZV9wcm9jX2VudHJpZXMoZHJpdmUtPnByb2MsIGRyaXZlci0+cHJvY19lbnRyaWVzKGRyaXZlKSk7CiAKQEAgLTU5MywxNCArNTkzLDEzIEBACiAKIHZvaWQgaWRlX3Byb2NfcG9ydF9yZWdpc3Rlcl9kZXZpY2VzKGlkZV9od2lmX3QgKmh3aWYpCiB7Ci0JaW50CWQ7CiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnQ7CiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwYXJlbnQgPSBod2lmLT5wcm9jOworCWlkZV9kcml2ZV90ICpkcml2ZTsKIAljaGFyIG5hbWVbNjRdOworCWludCBpOwogCi0JZm9yIChkID0gMDsgZCA8IE1BWF9EUklWRVM7IGQrKykgewotCQlpZGVfZHJpdmVfdCAqZHJpdmUgPSAmaHdpZi0+ZHJpdmVzW2RdOwotCisJaWRlX3BvcnRfZm9yX2VhY2hfZGV2KGksIGRyaXZlLCBod2lmKSB7CiAJCWlmICgoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19QUkVTRU5UKSA9PSAwIHx8IGRyaXZlLT5wcm9jKQogCQkJY29udGludWU7CiAKQEAgLTY1Myw3ICs2NTIsNyBAQAogCiBzdGF0aWMgaW50IHByb2NfcHJpbnRfZHJpdmVyKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYsIHZvaWQgKmRhdGEpCiB7Ci0JaWRlX2RyaXZlcl90ICppZGVfZHJ2ID0gY29udGFpbmVyX29mKGRydiwgaWRlX2RyaXZlcl90LCBnZW5fZHJpdmVyKTsKKwlzdHJ1Y3QgaWRlX2RyaXZlciAqaWRlX2RydiA9IHRvX2lkZV9kcml2ZXIoZHJ2KTsKIAlzdHJ1Y3Qgc2VxX2ZpbGUgKnMgPSBkYXRhOwogCiAJc2VxX3ByaW50ZihzLCAiJXMgdmVyc2lvbiAlc1xuIiwgZHJ2LT5uYW1lLCBpZGVfZHJ2LT52ZXJzaW9uKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS10YXBlLmMgYi9kcml2ZXJzL2lkZS9pZGUtdGFwZS5jCmluZGV4IDVkMmFhMjIuLmQ3ZWNkM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS10YXBlLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLXRhcGUuYwpAQCAtMTY2LDEwICsxNjYsMTAgQEAKICAqIHRvIGFuIGludGVycnVwdCBvciBhIHRpbWVyIGV2ZW50IGlzIHN0b3JlZCBpbiB0aGUgc3RydWN0IGRlZmluZWQgYmVsb3cuCiAgKi8KIHR5cGVkZWYgc3RydWN0IGlkZV90YXBlX29iaiB7Ci0JaWRlX2RyaXZlX3QJKmRyaXZlOwotCWlkZV9kcml2ZXJfdAkqZHJpdmVyOwotCXN0cnVjdCBnZW5kaXNrCSpkaXNrOwotCXN0cnVjdCBrcmVmCWtyZWY7CisJaWRlX2RyaXZlX3QJCSpkcml2ZTsKKwlzdHJ1Y3QgaWRlX2RyaXZlcgkqZHJpdmVyOworCXN0cnVjdCBnZW5kaXNrCQkqZGlzazsKKwlzdHJ1Y3Qga3JlZgkJa3JlZjsKIAogCS8qCiAJICoJZmFpbGVkX3BjIHBvaW50cyB0byB0aGUgbGFzdCBmYWlsZWQgcGFja2V0IGNvbW1hbmQsIG9yIGNvbnRhaW5zCkBAIC00NzksNyArNDc5LDcgQEAKIAogc3RhdGljIGludCBpZGV0YXBlX2VuZF9yZXF1ZXN0KGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IHVwdG9kYXRlLCBpbnQgbnJfc2VjdHMpCiB7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gSFdHUk9VUChkcml2ZSktPnJxOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IGRyaXZlLT5od2lmLT5ycTsKIAlpZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBlcnJvcjsKQEAgLTUzMSw3ICs1MzEsNyBAQAogCQkJcHJpbnRrKEtFUk5fRVJSICJpZGUtdGFwZTogRXJyb3IgaW4gUkVRVUVTVCBTRU5TRSAiCiAJCQkJCSJpdHNlbGYgLSBBYm9ydGluZyByZXF1ZXN0IVxuIik7CiAJfSBlbHNlIGlmIChwYy0+Y1swXSA9PSBSRUFEXzYgfHwgcGMtPmNbMF0gPT0gV1JJVEVfNikgewotCQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBkcml2ZS0+aHdpZi0+aHdncm91cC0+cnE7CisJCXN0cnVjdCByZXF1ZXN0ICpycSA9IGRyaXZlLT5od2lmLT5ycTsKIAkJaW50IGJsb2NrcyA9IHBjLT54ZmVycmVkIC8gdGFwZS0+YmxrX3NpemU7CiAKIAkJdGFwZS0+YXZnX3NpemUgKz0gYmxvY2tzICogdGFwZS0+YmxrX3NpemU7CkBAIC01NzYsNyArNTc2LDcgQEAKIAogLyoKICAqIFBvc3Rwb25lIHRoZSBjdXJyZW50IHJlcXVlc3Qgc28gdGhhdCBpZGUuYyB3aWxsIGJlIGFibGUgdG8gc2VydmljZSByZXF1ZXN0cwotICogZnJvbSBhbm90aGVyIGRldmljZSBvbiB0aGUgc2FtZSBod2dyb3VwIHdoaWxlIHdlIGFyZSBwb2xsaW5nIGZvciBEU0MuCisgKiBmcm9tIGFub3RoZXIgZGV2aWNlIG9uIHRoZSBzYW1lIHBvcnQgd2hpbGUgd2UgYXJlIHBvbGxpbmcgZm9yIERTQy4KICAqLwogc3RhdGljIHZvaWQgaWRldGFwZV9wb3N0cG9uZV9yZXF1ZXN0KGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKQEAgLTU4NCw3ICs1ODQsOCBAQAogCiAJZGVidWdfbG9nKERCR19QUk9DUywgIkVudGVyICVzXG4iLCBfX2Z1bmNfXyk7CiAKLQl0YXBlLT5wb3N0cG9uZWRfcnEgPSBIV0dST1VQKGRyaXZlKS0+cnE7CisJdGFwZS0+cG9zdHBvbmVkX3JxID0gZHJpdmUtPmh3aWYtPnJxOworCiAJaWRlX3N0YWxsX3F1ZXVlKGRyaXZlLCB0YXBlLT5kc2NfcG9sbF9mcmVxKTsKIH0KIApAQCAtMjMxMiw3ICsyMzEzLDcgQEAKIAogc3RhdGljIGludCBpZGVfdGFwZV9wcm9iZShpZGVfZHJpdmVfdCAqKTsKIAotc3RhdGljIGlkZV9kcml2ZXJfdCBpZGV0YXBlX2RyaXZlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgaWRlX2RyaXZlciBpZGV0YXBlX2RyaXZlciA9IHsKIAkuZ2VuX2RyaXZlciA9IHsKIAkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCQkubmFtZQkJPSAiaWRlLXRhcGUiLApAQCAtMjMyMyw3ICsyMzI0LDYgQEAKIAkudmVyc2lvbgkJPSBJREVUQVBFX1ZFUlNJT04sCiAJLmRvX3JlcXVlc3QJCT0gaWRldGFwZV9kb19yZXF1ZXN0LAogCS5lbmRfcmVxdWVzdAkJPSBpZGV0YXBlX2VuZF9yZXF1ZXN0LAotCS5lcnJvcgkJCT0gX19pZGVfZXJyb3IsCiAjaWZkZWYgQ09ORklHX0lERV9QUk9DX0ZTCiAJLnByb2NfZW50cmllcwkJPSBpZGVfdGFwZV9wcm9jX2VudHJpZXMsCiAJLnByb2NfZGV2c2V0cwkJPSBpZGVfdGFwZV9wcm9jX2RldnNldHMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtdGFza2ZpbGUuYyBiL2RyaXZlcnMvaWRlL2lkZS10YXNrZmlsZS5jCmluZGV4IGJmNGZiOWQuLjE2MTM4YmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS10YXNrZmlsZS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS10YXNrZmlsZS5jCkBAIC01OCw3ICs1OCw3IEBACiAKIGlkZV9zdGFydHN0b3BfdCBkb19yd190YXNrZmlsZSAoaWRlX2RyaXZlX3QgKmRyaXZlLCBpZGVfdGFza190ICp0YXNrKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IGlkZV90YXNrZmlsZSAqdGYgPSAmdGFzay0+dGY7CiAJaWRlX2hhbmRsZXJfdCAqaGFuZGxlciA9IE5VTEw7CiAJY29uc3Qgc3RydWN0IGlkZV90cF9vcHMgKnRwX29wcyA9IGh3aWYtPnRwX29wczsKQEAgLTMwOSw5ICszMDksOSBAQAogCQl9CiAKIAkJaWYgKHNlY3RvcnMgPiAwKSB7Ci0JCQlpZGVfZHJpdmVyX3QgKmRydjsKKwkJCXN0cnVjdCBpZGVfZHJpdmVyICpkcnY7CiAKLQkJCWRydiA9ICooaWRlX2RyaXZlcl90ICoqKXJxLT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7CisJCQlkcnYgPSAqKHN0cnVjdCBpZGVfZHJpdmVyICoqKXJxLT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7CiAJCQlkcnYtPmVuZF9yZXF1ZXN0KGRyaXZlLCAxLCBzZWN0b3JzKTsKIAkJfQogCX0KQEAgLTMyOCw5ICszMjgsOSBAQAogCX0KIAogCWlmIChycS0+cnFfZGlzaykgewotCQlpZGVfZHJpdmVyX3QgKmRydjsKKwkJc3RydWN0IGlkZV9kcml2ZXIgKmRydjsKIAotCQlkcnYgPSAqKGlkZV9kcml2ZXJfdCAqKilycS0+cnFfZGlzay0+cHJpdmF0ZV9kYXRhOzsKKwkJZHJ2ID0gKihzdHJ1Y3QgaWRlX2RyaXZlciAqKilycS0+cnFfZGlzay0+cHJpdmF0ZV9kYXRhOzsKIAkJZHJ2LT5lbmRfcmVxdWVzdChkcml2ZSwgMSwgcnEtPm5yX3NlY3RvcnMpOwogCX0gZWxzZQogCQlpZGVfZW5kX3JlcXVlc3QoZHJpdmUsIDEsIHJxLT5ucl9zZWN0b3JzKTsKQEAgLTM2MSw3ICszNjEsNyBAQAogc3RhdGljIGlkZV9zdGFydHN0b3BfdCB0YXNrX2luX2ludHIoaWRlX2RyaXZlX3QgKmRyaXZlKQogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5od2dyb3VwLT5ycTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5ycTsKIAl1OCBzdGF0ID0gaHdpZi0+dHBfb3BzLT5yZWFkX3N0YXR1cyhod2lmKTsKIAogCS8qIEVycm9yPyAqLwpAQCAtMzk1LDcgKzM5NSw3IEBACiBzdGF0aWMgaWRlX3N0YXJ0c3RvcF90IHRhc2tfb3V0X2ludHIgKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gSFdHUk9VUChkcml2ZSktPnJxOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IGh3aWYtPnJxOwogCXU4IHN0YXQgPSBod2lmLT50cF9vcHMtPnJlYWRfc3RhdHVzKGh3aWYpOwogCiAJaWYgKCFPS19TVEFUKHN0YXQsIERSSVZFX1JFQURZLCBkcml2ZS0+YmFkX3dzdGF0KSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS5jIGIvZHJpdmVycy9pZGUvaWRlLmMKaW5kZXggNDZhMmQ0Yy4uMjU4ODA1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLmMKQEAgLTYwLDE3OSArNjAsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KIAotCi0vKiBkZWZhdWx0IG1heGltdW0gbnVtYmVyIG9mIGZhaWx1cmVzICovCi0jZGVmaW5lIElERV9ERUZBVUxUX01BWF9GQUlMVVJFUyAJMQotCiBzdHJ1Y3QgY2xhc3MgKmlkZV9wb3J0X2NsYXNzOwogCi1zdGF0aWMgY29uc3QgdTggaWRlX2h3aWZfdG9fbWFqb3JbXSA9IHsgSURFMF9NQUpPUiwgSURFMV9NQUpPUiwKLQkJCQkJSURFMl9NQUpPUiwgSURFM19NQUpPUiwKLQkJCQkJSURFNF9NQUpPUiwgSURFNV9NQUpPUiwKLQkJCQkJSURFNl9NQUpPUiwgSURFN19NQUpPUiwKLQkJCQkJSURFOF9NQUpPUiwgSURFOV9NQUpPUiB9OwotCi1ERUZJTkVfTVVURVgoaWRlX2NmZ19tdHgpOwotCi1zdGF0aWMgdm9pZCBpZGVfcG9ydF9pbml0X2RldmljZXNfZGF0YShpZGVfaHdpZl90ICopOwotCi0vKgotICogRG8gbm90IGV2ZW4gKnRoaW5rKiBhYm91dCBjYWxsaW5nIHRoaXMhCi0gKi8KLXZvaWQgaWRlX2luaXRfcG9ydF9kYXRhKGlkZV9od2lmX3QgKmh3aWYsIHVuc2lnbmVkIGludCBpbmRleCkKLXsKLQkvKiBidWxrIGluaXRpYWxpemUgaHdpZiAmIGRyaXZlIGluZm8gd2l0aCB6ZXJvcyAqLwotCW1lbXNldChod2lmLCAwLCBzaXplb2YoaWRlX2h3aWZfdCkpOwotCi0JLyogZmlsbCBpbiBhbnkgbm9uLXplcm8gaW5pdGlhbCB2YWx1ZXMgKi8KLQlod2lmLT5pbmRleAk9IGluZGV4OwotCWh3aWYtPm1ham9yCT0gaWRlX2h3aWZfdG9fbWFqb3JbaW5kZXhdOwotCi0JaHdpZi0+bmFtZVswXQk9ICdpJzsKLQlod2lmLT5uYW1lWzFdCT0gJ2QnOwotCWh3aWYtPm5hbWVbMl0JPSAnZSc7Ci0JaHdpZi0+bmFtZVszXQk9ICcwJyArIGluZGV4OwotCi0JaW5pdF9jb21wbGV0aW9uKCZod2lmLT5nZW5kZXZfcmVsX2NvbXApOwotCi0JaHdpZi0+dHBfb3BzID0gJmRlZmF1bHRfdHBfb3BzOwotCi0JaWRlX3BvcnRfaW5pdF9kZXZpY2VzX2RhdGEoaHdpZik7Ci19Ci0KLXN0YXRpYyB2b2lkIGlkZV9wb3J0X2luaXRfZGV2aWNlc19kYXRhKGlkZV9od2lmX3QgKmh3aWYpCi17Ci0JaW50IHVuaXQ7Ci0KLQlmb3IgKHVuaXQgPSAwOyB1bml0IDwgTUFYX0RSSVZFUzsgKyt1bml0KSB7Ci0JCWlkZV9kcml2ZV90ICpkcml2ZSA9ICZod2lmLT5kcml2ZXNbdW5pdF07Ci0JCXU4IGogPSAoaHdpZi0+aW5kZXggKiBNQVhfRFJJVkVTKSArIHVuaXQ7Ci0KLQkJbWVtc2V0KGRyaXZlLCAwLCBzaXplb2YoKmRyaXZlKSk7Ci0KLQkJZHJpdmUtPm1lZGlhCQkJPSBpZGVfZGlzazsKLQkJZHJpdmUtPnNlbGVjdAkJCT0gKHVuaXQgPDwgNCkgfCBBVEFfREVWSUNFX09CUzsKLQkJZHJpdmUtPmh3aWYJCQk9IGh3aWY7Ci0JCWRyaXZlLT5yZWFkeV9zdGF0CQk9IEFUQV9EUkRZOwotCQlkcml2ZS0+YmFkX3dzdGF0CQk9IEJBRF9XX1NUQVQ7Ci0JCWRyaXZlLT5zcGVjaWFsLmIucmVjYWxpYnJhdGUJPSAxOwotCQlkcml2ZS0+c3BlY2lhbC5iLnNldF9nZW9tZXRyeQk9IDE7Ci0JCWRyaXZlLT5uYW1lWzBdCQkJPSAnaCc7Ci0JCWRyaXZlLT5uYW1lWzFdCQkJPSAnZCc7Ci0JCWRyaXZlLT5uYW1lWzJdCQkJPSAnYScgKyBqOwotCQlkcml2ZS0+bWF4X2ZhaWx1cmVzCQk9IElERV9ERUZBVUxUX01BWF9GQUlMVVJFUzsKLQotCQlJTklUX0xJU1RfSEVBRCgmZHJpdmUtPmxpc3QpOwotCQlpbml0X2NvbXBsZXRpb24oJmRyaXZlLT5nZW5kZXZfcmVsX2NvbXApOwotCX0KLX0KLQotc3RhdGljIHZvaWQgX19pZGVfcG9ydF91bnJlZ2lzdGVyX2RldmljZXMoaWRlX2h3aWZfdCAqaHdpZikKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfRFJJVkVTOyBpKyspIHsKLQkJaWRlX2RyaXZlX3QgKmRyaXZlID0gJmh3aWYtPmRyaXZlc1tpXTsKLQotCQlpZiAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19QUkVTRU5UKSB7Ci0JCQlkZXZpY2VfdW5yZWdpc3RlcigmZHJpdmUtPmdlbmRldik7Ci0JCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZkcml2ZS0+Z2VuZGV2X3JlbF9jb21wKTsKLQkJfQotCX0KLX0KLQotdm9pZCBpZGVfcG9ydF91bnJlZ2lzdGVyX2RldmljZXMoaWRlX2h3aWZfdCAqaHdpZikKLXsKLQltdXRleF9sb2NrKCZpZGVfY2ZnX210eCk7Ci0JX19pZGVfcG9ydF91bnJlZ2lzdGVyX2RldmljZXMoaHdpZik7Ci0JaHdpZi0+cHJlc2VudCA9IDA7Ci0JaWRlX3BvcnRfaW5pdF9kZXZpY2VzX2RhdGEoaHdpZik7Ci0JbXV0ZXhfdW5sb2NrKCZpZGVfY2ZnX210eCk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChpZGVfcG9ydF91bnJlZ2lzdGVyX2RldmljZXMpOwotCi0vKioKLSAqCWlkZV91bnJlZ2lzdGVyCQktCWZyZWUgYW4gSURFIGludGVyZmFjZQotICoJQGh3aWY6IElERSBpbnRlcmZhY2UKLSAqCi0gKglQZXJmb3JtIHRoZSBmaW5hbCB1bnJlZ2lzdGVyIG9mIGFuIElERSBpbnRlcmZhY2UuIEF0IHRoZSBtb21lbnQKLSAqCXdlIGRvbid0IHJlZmNvdW50IGludGVyZmFjZXMgc28gdGhpcyB3aWxsIGFsc28gZ2V0IHNwbGl0IHVwLgotICoKLSAqCUxvY2tpbmc6Ci0gKglUaGUgY2FsbGVyIG11c3Qgbm90IGhvbGQgdGhlIElERSBsb2NrcwotICoJVGhlIGRyaXZlIHByZXNlbnQvdmFuaXNoaW5nIGlzIG5vdCB5ZXQgcHJvcGVybHkgbG9ja2VkCi0gKglUYWtlIGNhcmUgd2l0aCB0aGUgY2FsbGJhY2tzLiBUaGVzZSBoYXZlIGJlZW4gc3BsaXQgdG8gYXZvaWQKLSAqCWRlYWRsb2NraW5nIHRoZSBJREUgbGF5ZXIuIFRoZSBzaHV0ZG93biBjYWxsYmFjayBpcyBjYWxsZWQKLSAqCWJlZm9yZSB3ZSB0YWtlIHRoZSBsb2NrIGFuZCBmcmVlIHJlc291cmNlcy4gSXQgaXMgdXAgdG8gdGhlCi0gKgljYWxsZXIgdG8gYmUgc3VyZSB0aGVyZSBpcyBubyBwZW5kaW5nIEkvTyBoZXJlLCBhbmQgdGhhdAotICoJdGhlIGludGVyZmFjZSB3aWxsIG5vdCBiZSByZW9wZW5lZCAocHJlc2VudC92YW5pc2hpbmcgbG9ja2luZwotICoJaXNuJ3QgeWV0IGRvbmUgQlRXKS4gQWZ0ZXIgd2UgY29tbWl0IHRvIHRoZSBmaW5hbCBraWxsIHdlCi0gKgljYWxsIHRoZSBjbGVhbnVwIGNhbGxiYWNrIHdpdGggdGhlIGlkZSBsb2NrcyBoZWxkLgotICoKLSAqCVVucmVnaXN0ZXIgcmVzdG9yZXMgdGhlIGh3aWYgc3RydWN0dXJlcyB0byB0aGUgZGVmYXVsdCBzdGF0ZS4KLSAqCVRoaXMgaXMgcmF2aW5nIGJvbmtlcnMuCi0gKi8KLQotdm9pZCBpZGVfdW5yZWdpc3RlcihpZGVfaHdpZl90ICpod2lmKQotewotCWlkZV9od2lmX3QgKmc7Ci0JaWRlX2h3Z3JvdXBfdCAqaHdncm91cDsKLQlpbnQgaXJxX2NvdW50ID0gMDsKLQotCUJVR19PTihpbl9pbnRlcnJ1cHQoKSk7Ci0JQlVHX09OKGlycXNfZGlzYWJsZWQoKSk7Ci0KLQltdXRleF9sb2NrKCZpZGVfY2ZnX210eCk7Ci0KLQlpZiAoaHdpZi0+cHJlc2VudCkgewotCQlfX2lkZV9wb3J0X3VucmVnaXN0ZXJfZGV2aWNlcyhod2lmKTsKLQkJaHdpZi0+cHJlc2VudCA9IDA7Ci0JfQotCi0JaWRlX3Byb2NfdW5yZWdpc3Rlcl9wb3J0KGh3aWYpOwotCi0JaHdncm91cCA9IGh3aWYtPmh3Z3JvdXA7Ci0JLyoKLQkgKiBmcmVlIHRoZSBpcnEgaWYgd2Ugd2VyZSB0aGUgb25seSBod2lmIHVzaW5nIGl0Ci0JICovCi0JZyA9IGh3Z3JvdXAtPmh3aWY7Ci0JZG8gewotCQlpZiAoZy0+aXJxID09IGh3aWYtPmlycSkKLQkJCSsraXJxX2NvdW50OwotCQlnID0gZy0+bmV4dDsKLQl9IHdoaWxlIChnICE9IGh3Z3JvdXAtPmh3aWYpOwotCWlmIChpcnFfY291bnQgPT0gMSkKLQkJZnJlZV9pcnEoaHdpZi0+aXJxLCBod2dyb3VwKTsKLQotCWlkZV9yZW1vdmVfcG9ydF9mcm9tX2h3Z3JvdXAoaHdpZik7Ci0KLQlkZXZpY2VfdW5yZWdpc3Rlcihod2lmLT5wb3J0ZGV2KTsKLQlkZXZpY2VfdW5yZWdpc3RlcigmaHdpZi0+Z2VuZGV2KTsKLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZod2lmLT5nZW5kZXZfcmVsX2NvbXApOwotCi0JLyoKLQkgKiBSZW1vdmUgdXMgZnJvbSB0aGUga2VybmVsJ3Mga25vd2xlZGdlCi0JICovCi0JYmxrX3VucmVnaXN0ZXJfcmVnaW9uKE1LREVWKGh3aWYtPm1ham9yLCAwKSwgTUFYX0RSSVZFUzw8UEFSVE5fQklUUyk7Ci0Ja2ZyZWUoaHdpZi0+c2dfdGFibGUpOwotCXVucmVnaXN0ZXJfYmxrZGV2KGh3aWYtPm1ham9yLCBod2lmLT5uYW1lKTsKLQotCWlkZV9yZWxlYXNlX2RtYV9lbmdpbmUoaHdpZik7Ci0KLQltdXRleF91bmxvY2soJmlkZV9jZmdfbXR4KTsKLX0KLQotdm9pZCBpZGVfaW5pdF9wb3J0X2h3KGlkZV9od2lmX3QgKmh3aWYsIGh3X3JlZ3NfdCAqaHcpCi17Ci0JbWVtY3B5KCZod2lmLT5pb19wb3J0cywgJmh3LT5pb19wb3J0cywgc2l6ZW9mKGh3aWYtPmlvX3BvcnRzKSk7Ci0JaHdpZi0+aXJxID0gaHctPmlycTsKLQlod2lmLT5jaGlwc2V0ID0gaHctPmNoaXBzZXQ7Ci0JaHdpZi0+ZGV2ID0gaHctPmRldjsKLQlod2lmLT5nZW5kZXYucGFyZW50ID0gaHctPnBhcmVudCA/IGh3LT5wYXJlbnQgOiBody0+ZGV2OwotCWh3aWYtPmFja19pbnRyID0gaHctPmFja19pbnRyOwotCWh3aWYtPmNvbmZpZ19kYXRhID0gaHctPmNvbmZpZzsKLX0KLQogLyoKICAqCUxvY2tzIGZvciBJREUgc2V0dGluZyBmdW5jdGlvbmFsaXR5CiAgKi8KQEAgLTMzMCw3ICsxNTksNiBAQAogc3RhdGljIGludCBzZXRfcGlvX21vZGUoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgYXJnKQogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKLQlpZGVfaHdncm91cF90ICpod2dyb3VwID0gaHdpZi0+aHdncm91cDsKIAljb25zdCBzdHJ1Y3QgaWRlX3BvcnRfb3BzICpwb3J0X29wcyA9IGh3aWYtPnBvcnRfb3BzOwogCiAJaWYgKGFyZyA8IDAgfHwgYXJnID4gMjU1KQpAQCAtMzQ1LDkgKzE3Myw5IEBACiAJCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJCQkvKiB0YWtlIGxvY2sgZm9yIElERV9ERkxBR19bTk9fXVVOTUFTSy9bTk9fXUlPXzMyQklUICovCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmaHdncm91cC0+bG9jaywgZmxhZ3MpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmh3aWYtPmxvY2ssIGZsYWdzKTsKIAkJCXBvcnRfb3BzLT5zZXRfcGlvX21vZGUoZHJpdmUsIGFyZyk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2dyb3VwLT5sb2NrLCBmbGFncyk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2lmLT5sb2NrLCBmbGFncyk7CiAJCX0gZWxzZQogCQkJcG9ydF9vcHMtPnNldF9waW9fbW9kZShkcml2ZSwgYXJnKTsKIAl9IGVsc2UgewpAQCAtNDUzLDcgKzI4MSw3IEBACiBzdGF0aWMgaW50IGdlbmVyaWNfaWRlX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlpZGVfZHJpdmVfdCAqZHJpdmUgPSB0b19pZGVfZGV2aWNlKGRldik7Ci0JaWRlX2RyaXZlcl90ICpkcnYgPSB0b19pZGVfZHJpdmVyKGRldi0+ZHJpdmVyKTsKKwlzdHJ1Y3QgaWRlX2RyaXZlciAqZHJ2ID0gdG9faWRlX2RyaXZlcihkZXYtPmRyaXZlcik7CiAKIAlyZXR1cm4gZHJ2LT5wcm9iZSA/IGRydi0+cHJvYmUoZHJpdmUpIDogLUVOT0RFVjsKIH0KQEAgLTQ2MSw3ICsyODksNyBAQAogc3RhdGljIGludCBnZW5lcmljX2lkZV9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQogewogCWlkZV9kcml2ZV90ICpkcml2ZSA9IHRvX2lkZV9kZXZpY2UoZGV2KTsKLQlpZGVfZHJpdmVyX3QgKmRydiA9IHRvX2lkZV9kcml2ZXIoZGV2LT5kcml2ZXIpOworCXN0cnVjdCBpZGVfZHJpdmVyICpkcnYgPSB0b19pZGVfZHJpdmVyKGRldi0+ZHJpdmVyKTsKIAogCWlmIChkcnYtPnJlbW92ZSkKIAkJZHJ2LT5yZW1vdmUoZHJpdmUpOwpAQCAtNDcyLDcgKzMwMCw3IEBACiBzdGF0aWMgdm9pZCBnZW5lcmljX2lkZV9zaHV0ZG93bihzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJaWRlX2RyaXZlX3QgKmRyaXZlID0gdG9faWRlX2RldmljZShkZXYpOwotCWlkZV9kcml2ZXJfdCAqZHJ2ID0gdG9faWRlX2RyaXZlcihkZXYtPmRyaXZlcik7CisJc3RydWN0IGlkZV9kcml2ZXIgKmRydiA9IHRvX2lkZV9kcml2ZXIoZGV2LT5kcml2ZXIpOwogCiAJaWYgKGRldi0+ZHJpdmVyICYmIGRydi0+c2h1dGRvd24pCiAJCWRydi0+c2h1dGRvd24oZHJpdmUpOwpAQCAtNjYwLDYgKzQ4OCw3IEBACiAKIHZvaWQgaWRlX3BvcnRfYXBwbHlfcGFyYW1zKGlkZV9od2lmX3QgKmh3aWYpCiB7CisJaWRlX2RyaXZlX3QgKmRyaXZlOwogCWludCBpOwogCiAJaWYgKGlkZV9pZ25vcmVfY2FibGUgJiAoMSA8PCBod2lmLT5pbmRleCkpIHsKQEAgLTY2OCw4ICs0OTcsOCBAQAogCQlod2lmLT5jYmwgPSBBVEFfQ0JMX1BBVEE0MF9TSE9SVDsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0RSSVZFUzsgaSsrKQotCQlpZGVfZGV2X2FwcGx5X3BhcmFtcygmaHdpZi0+ZHJpdmVzW2ldLCBpKTsKKwlpZGVfcG9ydF9mb3JfZWFjaF9kZXYoaSwgZHJpdmUsIGh3aWYpCisJCWlkZV9kZXZfYXBwbHlfcGFyYW1zKGRyaXZlLCBpKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2l0ODE3Mi5jIGIvZHJpdmVycy9pZGUvaXQ4MTcyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAyMTA3OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWRlL2l0ODE3Mi5jCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICoKKyAqIEJSSUVGIE1PRFVMRSBERVNDUklQVElPTgorICogICAgICBJVDgxNzIgSURFIGNvbnRyb2xsZXIgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBTaGFuZSBNY0RvbmFsZAorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUSElTICBTT0ZUV0FSRSAgSVMgUFJPVklERUQgICBgYEFTICBJUycnIEFORCAgIEFOWSAgRVhQUkVTUyBPUiBJTVBMSUVECisgKiAgV0FSUkFOVElFUywgICBJTkNMVURJTkcsIEJVVCBOT1QgIExJTUlURUQgIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOCisgKiAgTk8gIEVWRU5UICBTSEFMTCAgIFRIRSBBVVRIT1IgIEJFICAgIExJQUJMRSBGT1IgQU5ZICAgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCAgIFRPLCBQUk9DVVJFTUVOVCBPRiAgU1VCU1RJVFVURSBHT09EUyAgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqICBVU0UsIERBVEEsICBPUiBQUk9GSVRTOyBPUiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqICBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pZGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNkZWZpbmUgRFJWX05BTUUgIklUODE3MiIKKworc3RhdGljIHZvaWQgaXQ4MTcyX3NldF9waW9fbW9kZShpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IHU4IHBpbykKK3sKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CisJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKKwl1MTYgZHJpdmVfZW5hYmxlczsKKwl1MzIgZHJpdmVfdGltaW5nOworCisJLyoKKwkgKiBUaGUgaGlnaGVzdCB2YWx1ZSBvZiBESU9SL0RJT1cgcHVsc2Ugd2lkdGggYW5kIHJlY292ZXJ5IHRpbWUKKwkgKiB0aGF0IGNhbiBiZSBzZXQgaW4gdGhlIElUODE3MiBpcyA4IFBDSSBjbG9jayBjeWNsZXMuICBBcyBhIHJlc3VsdCwKKwkgKiBpdCBjYW5ub3QgYmUgY29uZmlndXJlZCBmb3IgUElPIG1vZGUgMC4gIFRoaXMgdGFibGUgc2V0cyB0aGVzZQorCSAqIHBhcmFtZXRlcnMgdG8gdGhlIG1heGltdW0gc3VwcG9ydGVkIGJ5IHRoZSBJVDgxNzIuCisJICovCisJc3RhdGljIGNvbnN0IHU4IHRpbWluZ3NbXSA9IHsgMHgzZiwgMHgzYywgMHgxYiwgMHgxMiwgMHgwYSB9OworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCAweDQwLCAmZHJpdmVfZW5hYmxlcyk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMHg0NCwgJmRyaXZlX3RpbWluZyk7CisKKwkvKgorCSAqIEVuYWJsZSBwb3J0IDB4NDQuIFRoZSBJVDgxNzIgc3BlYyBpcyBjb25mdXNlZDsgaXQgY2FsbHMKKwkgKiB0aGlzIHJlZ2lzdGVyIHRoZSAiU2xhdmUgSURFIFRpbWluZyBSZWdpc3RlciIsIGJ1dCBpbiBmYWN0LAorCSAqIGl0IGNvbnRyb2xzIHRpbWluZyBmb3IgYm90aCBtYXN0ZXIgYW5kIHNsYXZlIGRyaXZlcy4KKwkgKi8KKwlkcml2ZV9lbmFibGVzIHw9IDB4NDAwMDsKKworCWRyaXZlX2VuYWJsZXMgJj0gZHJpdmUtPmRuID8gMHhjMDA2IDogMHhjMDYwOworCWlmIChkcml2ZS0+bWVkaWEgPT0gaWRlX2Rpc2spCisJCS8qIGVuYWJsZSBwcmVmZXRjaCAqLworCQlkcml2ZV9lbmFibGVzIHw9IDB4MDAwNCA8PCAoZHJpdmUtPmRuICogNCk7CisJaWYgKGF0YV9pZF9oYXNfaW9yZHkoZHJpdmUtPmlkKSkKKwkJLyogZW5hYmxlIElPUkRZIHNhbXBsZS1wb2ludCAqLworCQlkcml2ZV9lbmFibGVzIHw9IDB4MDAwMiA8PCAoZHJpdmUtPmRuICogNCk7CisKKwlkcml2ZV90aW1pbmcgJj0gZHJpdmUtPmRuID8gMHgwMDAwM2YwMCA6IDB4MDAwZmMwMDA7CisJZHJpdmVfdGltaW5nIHw9IHRpbWluZ3NbcGlvXSA8PCAoZHJpdmUtPmRuICogNiArIDgpOworCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgMHg0MCwgZHJpdmVfZW5hYmxlcyk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIDB4NDQsIGRyaXZlX3RpbWluZyk7Cit9CisKK3N0YXRpYyB2b2lkIGl0ODE3Ml9zZXRfZG1hX21vZGUoaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCB1OCBzcGVlZCkKK3sKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CisJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKKwlpbnQgYV9zcGVlZAkJPSAzIDw8IChkcml2ZS0+ZG4gKiA0KTsKKwlpbnQgdV9mbGFnCQk9IDEgPDwgZHJpdmUtPmRuOworCWludCB1X3NwZWVkCQk9IDA7CisJdTggcmVnNDgsIHJlZzRhOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDQ4LCAmcmVnNDgpOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg0YSwgJnJlZzRhKTsKKworCWlmIChzcGVlZCA+PSBYRkVSX1VETUFfMCkgeworCQl1OCB1ZG1hID0gc3BlZWQgLSBYRkVSX1VETUFfMDsKKwkJdV9zcGVlZCA9IHVkbWEgPDwgKGRyaXZlLT5kbiAqIDQpOworCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NDgsIHJlZzQ4IHwgdV9mbGFnKTsKKwkJcmVnNGEgJj0gfmFfc3BlZWQ7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NGEsIHJlZzRhIHwgdV9zcGVlZCk7CisJfSBlbHNlIHsKKwkJY29uc3QgdTggbXdkbWFfdG9fcGlvW10gPSB7IDAsIDMsIDQgfTsKKwkJdTggcGlvOworCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NDgsIHJlZzQ4ICYgfnVfZmxhZyk7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NGEsIHJlZzRhICYgfmFfc3BlZWQpOworCisJCXBpbyA9IG13ZG1hX3RvX3Bpb1tzcGVlZCAtIFhGRVJfTVdfRE1BXzBdOworCisJCWl0ODE3Ml9zZXRfcGlvX21vZGUoZHJpdmUsIHBpbyk7CisJfQorfQorCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWRlX3BvcnRfb3BzIGl0ODE3Ml9wb3J0X29wcyA9IHsKKwkuc2V0X3Bpb19tb2RlCT0gaXQ4MTcyX3NldF9waW9fbW9kZSwKKwkuc2V0X2RtYV9tb2RlCT0gaXQ4MTcyX3NldF9kbWFfbW9kZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWRlX3BvcnRfaW5mbyBpdDgxNzJfcG9ydF9pbmZvIF9fZGV2aW5pdGRhdGEgPSB7CisJLm5hbWUJCT0gRFJWX05BTUUsCisJLnBvcnRfb3BzCT0gJml0ODE3Ml9wb3J0X29wcywKKwkuZW5hYmxlYml0cwk9IHsgezB4NDEsIDB4ODAsIDB4ODB9LCB7MHgwMCwgMHgwMCwgMHgwMH0gfSwKKwkuaG9zdF9mbGFncwk9IElERV9IRkxBR19TSU5HTEUsCisJLnBpb19tYXNrCT0gQVRBX1BJTzQgJiB+QVRBX1BJTzAsCisJLm13ZG1hX21hc2sJPSBBVEFfTVdETUEyLAorCS51ZG1hX21hc2sJPSBBVEFfVURNQTIsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpdDgxNzJfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCWlmICgoZGV2LT5jbGFzcyA+PiA4KSAhPSBQQ0lfQ0xBU1NfU1RPUkFHRV9JREUpCisJCXJldHVybiAtRU5PREVWOyAvKiBJVDgxNzIgaXMgbW9yZSB0aGFuIGFuIElERSBjb250cm9sbGVyICovCisJcmV0dXJuIGlkZV9wY2lfaW5pdF9vbmUoZGV2LCAmaXQ4MTcyX3BvcnRfaW5mbywgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBpdDgxNzJfcGNpX3RibFtdID0geworCXsgUENJX1ZERVZJQ0UoSVRFLCBQQ0lfREVWSUNFX0lEX0lURV84MTcyKSwgMCB9LAorCXsgMCwgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaXQ4MTcyX3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgaXQ4MTcyX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gIklUODE3Ml9JREUiLAorCS5pZF90YWJsZQk9IGl0ODE3Ml9wY2lfdGJsLAorCS5wcm9iZQkJPSBpdDgxNzJfaW5pdF9vbmUsCisJLnJlbW92ZQkJPSBpZGVfcGNpX3JlbW92ZSwKKwkuc3VzcGVuZAk9IGlkZV9wY2lfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGlkZV9wY2lfcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaXQ4MTcyX2lkZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGlkZV9wY2lfcmVnaXN0ZXJfZHJpdmVyKCZpdDgxNzJfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpdDgxNzJfaWRlX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJml0ODE3Ml9wY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaXQ4MTcyX2lkZV9pbml0KTsKK21vZHVsZV9leGl0KGl0ODE3Ml9pZGVfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlN0ZXZlIExvbmdlcmJlYW0iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUENJIGRyaXZlciBtb2R1bGUgZm9yIElURSA4MTcyIElERSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaXQ4MjEzLmMgYi9kcml2ZXJzL2lkZS9pdDgyMTMuYwppbmRleCA3YzJmZWViLi5kNzk2OWI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pdDgyMTMuYworKysgYi9kcml2ZXJzL2lkZS9pdDgyMTMuYwpAQCAtMjUsNyArMjUsNyBAQAogCiBzdGF0aWMgdm9pZCBpdDgyMTNfc2V0X3Bpb19tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggcGlvKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAlpbnQgaXNfc2xhdmUJCT0gZHJpdmUtPmRuICYgMTsKIAlpbnQgbWFzdGVyX3BvcnQJCT0gMHg0MDsKQEAgLTgyLDcgKzgyLDcgQEAKIAogc3RhdGljIHZvaWQgaXQ4MjEzX3NldF9kbWFfbW9kZShpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IHU4IHNwZWVkKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAl1OCBtYXNsYXZlCQk9IDB4NDA7CiAJaW50IGFfc3BlZWQJCT0gMyA8PCAoZHJpdmUtPmRuICogNCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pdDgyMXguYyBiL2RyaXZlcnMvaWRlL2l0ODIxeC5jCmluZGV4IGVmMDA0MDguLjBiZTI3YWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2l0ODIxeC5jCisrKyBiL2RyaXZlcnMvaWRlL2l0ODIxeC5jCkBAIC0xNjcsMTIgKzE2NywxMCBAQAogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXN0cnVjdCBpdDgyMXhfZGV2ICppdGRldiA9IGlkZV9nZXRfaHdpZmRhdGEoaHdpZik7Ci0JaWRlX2RyaXZlX3QgKnBhaXI7CisJaWRlX2RyaXZlX3QgKnBhaXIgPSBpZGVfZ2V0X3BhaXJfZGV2KGRyaXZlKTsKIAlpbnQgY2xvY2ssIGFsdGNsb2NrLCBzZWwgPSAwOwogCXU4IHVuaXQgPSBkcml2ZS0+ZG4gJiAxLCB2OwogCi0JcGFpciA9ICZod2lmLT5kcml2ZXNbMSAtIHVuaXRdOwotCiAJaWYoaXRkZXYtPndhbnRbMF1bMF0gPiBpdGRldi0+d2FudFsxXVswXSkgewogCQljbG9jayA9IGl0ZGV2LT53YW50WzBdWzFdOwogCQlhbHRjbG9jayA9IGl0ZGV2LT53YW50WzFdWzFdOwpAQCAtMjM5LDE1ICsyMzcsMTMgQEAKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IGl0ODIxeF9kZXYgKml0ZGV2ID0gaWRlX2dldF9od2lmZGF0YShod2lmKTsKLQlpZGVfZHJpdmVfdCAqcGFpcjsKKwlpZGVfZHJpdmVfdCAqcGFpciA9IGlkZV9nZXRfcGFpcl9kZXYoZHJpdmUpOwogCXU4IHVuaXQgPSBkcml2ZS0+ZG4gJiAxLCBzZXRfcGlvID0gcGlvOwogCiAJLyogU3BlYyBzYXlzIDg5IHJlZiBkcml2ZXIgdXNlcyA4OCAqLwogCXN0YXRpYyB1MTYgcGlvX3RpbWluZ3NbXT0geyAweEFBODgsIDB4QTM4MiwgMHhBMTgxLCAweDMzMzIsIDB4MzEyMSB9OwogCXN0YXRpYyB1OCBwaW9fd2FudFtdICAgID0geyBBVEFfNjYsIEFUQV82NiwgQVRBXzY2LCBBVEFfNjYsIEFUQV9BTlkgfTsKIAotCXBhaXIgPSAmaHdpZi0+ZHJpdmVzWzEgLSB1bml0XTsKLQogCS8qCiAJICogQ29tcHV0ZSB0aGUgYmVzdCBQSU8gbW9kZSB3ZSBjYW4gZm9yIGEgZ2l2ZW4gZGV2aWNlLiBXZSBtdXN0CiAJICogcGljayBhIHNwZWVkIHRoYXQgZG9lcyBub3QgY2F1c2UgcHJvYmxlbXMgd2l0aCB0aGUgb3RoZXIgZGV2aWNlCkBAIC0yNzksNyArMjc1LDcgQEAKICAqCXRoZSBzaGFyZWQgTVdETUEvUElPIHRpbWluZyByZWdpc3Rlci4KICAqLwogCi1zdGF0aWMgdm9pZCBpdDgyMXhfdHVuZV9td2RtYSAoaWRlX2RyaXZlX3QgKmRyaXZlLCBieXRlIG1vZGVfd2FudGVkKQorc3RhdGljIHZvaWQgaXQ4MjF4X3R1bmVfbXdkbWEoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCBtb2RlX3dhbnRlZCkKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKQEAgLTMxNiw3ICszMTIsNyBAQAogICoJY29udHJvbGxlciB3aGVuIGRvaW5nIFVETUEgbW9kZXMgaW4gcGFzcyB0aHJvdWdoLgogICovCiAKLXN0YXRpYyB2b2lkIGl0ODIxeF90dW5lX3VkbWEgKGlkZV9kcml2ZV90ICpkcml2ZSwgYnl0ZSBtb2RlX3dhbnRlZCkKK3N0YXRpYyB2b2lkIGl0ODIxeF90dW5lX3VkbWEoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCBtb2RlX3dhbnRlZCkKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKQEAgLTUxNiw2ICs1MTIsNyBAQAogCS5kbWFfdGVzdF9pcnEJCT0gaWRlX2RtYV90ZXN0X2lycSwKIAkuZG1hX3RpbWVvdXQJCT0gaWRlX2RtYV90aW1lb3V0LAogCS5kbWFfbG9zdF9pcnEJCT0gaWRlX2RtYV9sb3N0X2lycSwKKwkuZG1hX3NmZl9yZWFkX3N0YXR1cwk9IGlkZV9kbWFfc2ZmX3JlYWRfc3RhdHVzLAogfTsKIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9uczg3NDE1LmMgYi9kcml2ZXJzL2lkZS9uczg3NDE1LmMKaW5kZXggMTM3ODkwNi4uODM2NDNlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvbnM4NzQxNS5jCisrKyBiL2RyaXZlcnMvaWRlL25zODc0MTUuYwpAQCAtNTYsNyArNTYsNyBAQAogCXJldHVybiBzdXBlcmlvX2lkZV9pbmIoaHdpZi0+aW9fcG9ydHMuc3RhdHVzX2FkZHIpOwogfQogCi1zdGF0aWMgdTggc3VwZXJpb19yZWFkX3NmZl9kbWFfc3RhdHVzKGlkZV9od2lmX3QgKmh3aWYpCitzdGF0aWMgdTggc3VwZXJpb19kbWFfc2ZmX3JlYWRfc3RhdHVzKGlkZV9od2lmX3QgKmh3aWYpCiB7CiAJcmV0dXJuIHN1cGVyaW9faWRlX2luYihod2lmLT5kbWFfYmFzZSArIEFUQV9ETUFfU1RBVFVTKTsKIH0KQEAgLTEwOSw3ICsxMDksNiBAQAogCS5leGVjX2NvbW1hbmQJCT0gaWRlX2V4ZWNfY29tbWFuZCwKIAkucmVhZF9zdGF0dXMJCT0gc3VwZXJpb19yZWFkX3N0YXR1cywKIAkucmVhZF9hbHRzdGF0dXMJCT0gaWRlX3JlYWRfYWx0c3RhdHVzLAotCS5yZWFkX3NmZl9kbWFfc3RhdHVzCT0gc3VwZXJpb19yZWFkX3NmZl9kbWFfc3RhdHVzLAogCiAJLnNldF9pcnEJCT0gaWRlX3NldF9pcnEsCiAKQEAgLTEzMiwxOCArMTMxLDIwIEBACiAJdG1wID0gc3VwZXJpb19pZGVfaW5iKGRtYV9zdGF0KTsKIAlvdXRiKHRtcCB8IDB4NjYsIGRtYV9zdGF0KTsKIH0KKyNlbHNlCisjZGVmaW5lIHN1cGVyaW9fZG1hX3NmZl9yZWFkX3N0YXR1cyBpZGVfZG1hX3NmZl9yZWFkX3N0YXR1cwogI2VuZGlmCiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbnM4NzQxNV9jb3VudCA9IDAsIG5zODc0MTVfY29udHJvbFtNQVhfSFdJRlNdID0geyAwIH07CiAKIC8qCiAgKiBUaGlzIHJvdXRpbmUgZWl0aGVyIGVuYWJsZXMvZGlzYWJsZXMgKGFjY29yZGluZyB0byBJREVfREZMQUdfUFJFU0VOVCkKLSAqIHRoZSBJUlEgYXNzb2NpYXRlZCB3aXRoIHRoZSBwb3J0IChIV0lGKGRyaXZlKSksCisgKiB0aGUgSVJRIGFzc29jaWF0ZWQgd2l0aCB0aGUgcG9ydCwKICAqIGFuZCBzZWxlY3RzIGVpdGhlciBQSU8gb3IgRE1BIGhhbmRzaGFraW5nIGZvciB0aGUgbmV4dCBJL08gb3BlcmF0aW9uLgogICovCiBzdGF0aWMgdm9pZCBuczg3NDE1X3ByZXBhcmVfZHJpdmUgKGlkZV9kcml2ZV90ICpkcml2ZSwgdW5zaWduZWQgaW50IHVzZV9kbWEpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXVuc2lnbmVkIGludCBiaXQsIG90aGVyLCBuZXcsICpvbGQgPSAodW5zaWduZWQgaW50ICopIGh3aWYtPnNlbGVjdF9kYXRhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0xOTcsMTEgKzE5OCwxMSBAQAogCiBzdGF0aWMgaW50IG5zODc0MTVfZG1hX2VuZChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAgICAgICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXU4IGRtYV9zdGF0ID0gMCwgZG1hX2NtZCA9IDA7CiAKIAlkcml2ZS0+d2FpdGluZ19mb3JfZG1hID0gMDsKLQlkbWFfc3RhdCA9IGh3aWYtPnRwX29wcy0+cmVhZF9zZmZfZG1hX3N0YXR1cyhod2lmKTsKKwlkbWFfc3RhdCA9IGh3aWYtPmRtYV9vcHMtPmRtYV9zZmZfcmVhZF9zdGF0dXMoaHdpZik7CiAJLyogZ2V0IERNQSBjb21tYW5kIG1vZGUgKi8KIAlkbWFfY21kID0gaW5iKGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9DTUQpOwogCS8qIHN0b3AgRE1BICovCkBAIC0zMDgsNiArMzA5LDcgQEAKIAkuZG1hX3Rlc3RfaXJxCQk9IGlkZV9kbWFfdGVzdF9pcnEsCiAJLmRtYV9sb3N0X2lycQkJPSBpZGVfZG1hX2xvc3RfaXJxLAogCS5kbWFfdGltZW91dAkJPSBpZGVfZG1hX3RpbWVvdXQsCisJLmRtYV9zZmZfcmVhZF9zdGF0dXMJPSBzdXBlcmlvX2RtYV9zZmZfcmVhZF9zdGF0dXMsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlkZV9wb3J0X2luZm8gbnM4NzQxNV9jaGlwc2V0IF9fZGV2aW5pdGRhdGEgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wYWxtX2JrMzcxMC5jIGIvZHJpdmVycy9pZGUvcGFsbV9iazM3MTAuYwppbmRleCAxMjJlZDNjLi5hN2FjNDkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wYWxtX2JrMzcxMC5jCisrKyBiL2RyaXZlcnMvaWRlL3BhbG1fYmszNzEwLmMKQEAgLTMyNCw4ICszMjQsNiBAQAogCiAJaHdpZi0+ZG1hX2Jhc2UgPSBod2lmLT5pb19wb3J0cy5kYXRhX2FkZHIgLSBJREVfUEFMTV9BVEFfUFJJX1JFR19PRkZTRVQ7CiAKLQlod2lmLT5kbWFfb3BzID0gJnNmZl9kbWFfb3BzOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMzOCw2ICszMzYsNyBAQAogc3RhdGljIHN0cnVjdCBpZGVfcG9ydF9pbmZvIF9fZGV2aW5pdGRhdGEgcGFsbV9iazM3MTBfcG9ydF9pbmZvID0gewogCS5pbml0X2RtYQkJPSBwYWxtX2JrMzcxMF9pbml0X2RtYSwKIAkucG9ydF9vcHMJCT0gJnBhbG1fYmszNzEwX3BvcnRzX29wcywKKwkuZG1hX29wcwkJPSAmc2ZmX2RtYV9vcHMsCiAJLmhvc3RfZmxhZ3MJCT0gSURFX0hGTEFHX01NSU8sCiAJLnBpb19tYXNrCQk9IEFUQV9QSU80LAogCS5td2RtYV9tYXNrCQk9IEFUQV9NV0RNQTIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wZGMyMDJ4eF9uZXcuYyBiL2RyaXZlcnMvaWRlL3BkYzIwMnh4X25ldy5jCmluZGV4IDIxMWFlNDYuLmYyMTI5MGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BkYzIwMnh4X25ldy5jCisrKyBiL2RyaXZlcnMvaWRlL3BkYzIwMnh4X25ldy5jCkBAIC0xNDMsNyArMTQzLDcgQEAKIAogc3RhdGljIHZvaWQgcGRjbmV3X3NldF9kbWFfbW9kZShpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IHU4IHNwZWVkKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAl1OCBhZGoJCQk9IChkcml2ZS0+ZG4gJiAxKSA/IDB4MDggOiAweDAwOwogCkBAIC0yMTksNyArMjE5LDcgQEAKIAkgKiBEZWxldGVkIHRoaXMgYmVjYXVzZSBpdCBpcyByZWR1bmRhbnQgZnJvbSB0aGUgY2FsbGVyLgogCSAqLwogCXByaW50ayhLRVJOX1dBUk5JTkcgInBkYzIwMnh4X25ldzogJXMgY2hhbm5lbCByZXNldC5cbiIsCi0JCUhXSUYoZHJpdmUpLT5jaGFubmVsID8gIlNlY29uZGFyeSIgOiAiUHJpbWFyeSIpOworCQlkcml2ZS0+aHdpZi0+Y2hhbm5lbCA/ICJTZWNvbmRhcnkiIDogIlByaW1hcnkiKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wZGMyMDJ4eF9vbGQuYyBiL2RyaXZlcnMvaWRlL3BkYzIwMnh4X29sZC5jCmluZGV4IDYyNGU2MmUuLjk3MTkzMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BkYzIwMnh4X29sZC5jCisrKyBiL2RyaXZlcnMvaWRlL3BkYzIwMnh4X29sZC5jCkBAIC0zOSw3ICszOSw3IEBACiAKIHN0YXRpYyB2b2lkIHBkYzIwMnh4X3NldF9tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggc3BlZWQpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXU4IGRyaXZlX3BjaQkJPSAweDYwICsgKGRyaXZlLT5kbiA8PCAyKTsKIApAQCAtMTY5LDggKzE2OSw4IEBACiAJaWYgKGRyaXZlLT5jdXJyZW50X3NwZWVkID4gWEZFUl9VRE1BXzIpCiAJCXBkY19vbGRfZW5hYmxlXzY2TUh6X2Nsb2NrKGRyaXZlLT5od2lmKTsKIAlpZiAoZHJpdmUtPm1lZGlhICE9IGlkZV9kaXNrIHx8IChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX0xCQTQ4KSkgewotCQlzdHJ1Y3QgcmVxdWVzdCAqcnEJPSBIV0dST1VQKGRyaXZlKS0+cnE7Ci0JCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwkJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOworCQlzdHJ1Y3QgcmVxdWVzdCAqcnEJPSBod2lmLT5ycTsKIAkJdW5zaWduZWQgbG9uZyBoaWdoXzE2CT0gaHdpZi0+ZXh0cmFfYmFzZSAtIDE2OwogCQl1bnNpZ25lZCBsb25nIGF0YXBpX3JlZwk9IGhpZ2hfMTYgKyAoaHdpZi0+Y2hhbm5lbCA/IDB4MjQgOiAweDIwKTsKIAkJdTMyIHdvcmRfY291bnQJPSAwOwpAQCAtMTg5LDcgKzE4OSw3IEBACiBzdGF0aWMgaW50IHBkYzIwMnh4X2RtYV9lbmQoaWRlX2RyaXZlX3QgKmRyaXZlKQogewogCWlmIChkcml2ZS0+bWVkaWEgIT0gaWRlX2Rpc2sgfHwgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfTEJBNDgpKSB7Ci0JCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwkJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCQl1bnNpZ25lZCBsb25nIGhpZ2hfMTYJPSBod2lmLT5leHRyYV9iYXNlIC0gMTY7CiAJCXVuc2lnbmVkIGxvbmcgYXRhcGlfcmVnCT0gaGlnaF8xNiArIChod2lmLT5jaGFubmVsID8gMHgyNCA6IDB4MjApOwogCQl1OCBjbG9jawkJPSAwOwpAQCAtMjA1LDcgKzIwNSw3IEBACiAKIHN0YXRpYyBpbnQgcGRjMjAyeHhfZG1hX3Rlc3RfaXJxKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXVuc2lnbmVkIGxvbmcgaGlnaF8xNgk9IGh3aWYtPmV4dHJhX2Jhc2UgLSAxNjsKIAl1OCBkbWFfc3RhdAkJPSBpbmIoaHdpZi0+ZG1hX2Jhc2UgKyBBVEFfRE1BX1NUQVRVUyk7CiAJdTggc2MxZAkJCT0gaW5iKGhpZ2hfMTYgKyAweDAwMWQpOwpAQCAtMjQzLDcgKzI0Myw3IEBACiAKIHN0YXRpYyB2b2lkIHBkYzIwMnh4X3Jlc2V0IChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlpZGVfaHdpZl90ICptYXRlCT0gaHdpZi0+bWF0ZTsKIAogCXBkYzIwMnh4X3Jlc2V0X2hvc3QoaHdpZik7CkBAIC0zMzcsNiArMzM3LDcgQEAKIAkuZG1hX3Rlc3RfaXJxCQk9IHBkYzIwMnh4X2RtYV90ZXN0X2lycSwKIAkuZG1hX2xvc3RfaXJxCQk9IHBkYzIwMnh4X2RtYV9sb3N0X2lycSwKIAkuZG1hX3RpbWVvdXQJCT0gcGRjMjAyeHhfZG1hX3RpbWVvdXQsCisJLmRtYV9zZmZfcmVhZF9zdGF0dXMJPSBpZGVfZG1hX3NmZl9yZWFkX3N0YXR1cywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWRlX2RtYV9vcHMgcGRjMjAyNnhfZG1hX29wcyA9IHsKQEAgLTM0OCw2ICszNDksNyBAQAogCS5kbWFfdGVzdF9pcnEJCT0gcGRjMjAyeHhfZG1hX3Rlc3RfaXJxLAogCS5kbWFfbG9zdF9pcnEJCT0gcGRjMjAyeHhfZG1hX2xvc3RfaXJxLAogCS5kbWFfdGltZW91dAkJPSBwZGMyMDJ4eF9kbWFfdGltZW91dCwKKwkuZG1hX3NmZl9yZWFkX3N0YXR1cwk9IGlkZV9kbWFfc2ZmX3JlYWRfc3RhdHVzLAogfTsKIAogI2RlZmluZSBERUNMQVJFX1BEQzIwMjZYX0RFVih1ZG1hLCBzZWN0b3JzKSBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9waWl4LmMgYi9kcml2ZXJzL2lkZS9waWl4LmMKaW5kZXggNjFkMmQ5Mi4uZjFlMmU0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcGlpeC5jCisrKyBiL2RyaXZlcnMvaWRlL3BpaXguYwpAQCAtNjcsNyArNjcsNyBAQAogCiBzdGF0aWMgdm9pZCBwaWl4X3NldF9waW9fbW9kZShpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IHU4IHBpbykKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJaW50IGlzX3NsYXZlCQk9IGRyaXZlLT5kbiAmIDE7CiAJaW50IG1hc3Rlcl9wb3J0CQk9IGh3aWYtPmNoYW5uZWwgPyAweDQyIDogMHg0MDsKQEAgLTEzNiw3ICsxMzYsNyBAQAogCiBzdGF0aWMgdm9pZCBwaWl4X3NldF9kbWFfbW9kZShpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IHU4IHNwZWVkKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAl1OCBtYXNsYXZlCQk9IGh3aWYtPmNoYW5uZWwgPyAweDQyIDogMHg0MDsKIAlpbnQgYV9zcGVlZAkJPSAzIDw8IChkcml2ZS0+ZG4gKiA0KTsKQEAgLTIyNCw3ICsyMjQsNyBAQAogICovCiBzdGF0aWMgdm9pZCBpY2hfY2xlYXJfaXJxKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXU4IGRtYV9zdGF0OwogCiAJLyoKQEAgLTI2MCw2ICsyNjAsOCBAQAogCXsgMHgyN0RGLCAweDEwM0MsIDB4MzBBMSB9LAkvKiBJQ0g3IG9uIEhQIENvbXBhcSBuYzI0MDAgKi8KIAl7IDB4MjdERiwgMHgxMDcxLCAweEQyMjEgfSwJLyogSUNINyBvbiBIZXJjdWxlcyBFQy05MDAgKi8KIAl7IDB4MjRDQSwgMHgxMDI1LCAweDAwNjEgfSwJLyogSUNINCBvbiBBY2VyIEFzcGlyZSAyMDIzV0xNaSAqLworCXsgMHgyNENBLCAweDEwMjUsIDB4MDAzZCB9LAkvKiBJQ0g0IG9uIEFDRVIgVE0yOTAgKi8KKwl7IDB4MjY2RiwgMHgxMDI1LCAweDAwNjYgfSwJLyogSUNINiBvbiBBQ0VSIEFzcGlyZSAxNjk0V0xNaSAqLwogCXsgMHgyNjUzLCAweDEwNDMsIDB4ODJEOCB9LAkvKiBJQ0g2TSBvbiBBc3VzIEVlZSA3MDEgKi8KIAkvKiBlbmQgbWFya2VyICovCiAJeyAwLCB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wbWFjLmMgYi9kcml2ZXJzL2lkZS9wbWFjLmMKaW5kZXggN2M0ODFiYi4uNzQ2MjVlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcG1hYy5jCisrKyBiL2RyaXZlcnMvaWRlL3BtYWMuYwpAQCAtOTU1LDcgKzk1NSw2IEBACiAJLmV4ZWNfY29tbWFuZAkJPSBwbWFjX2V4ZWNfY29tbWFuZCwKIAkucmVhZF9zdGF0dXMJCT0gaWRlX3JlYWRfc3RhdHVzLAogCS5yZWFkX2FsdHN0YXR1cwkJPSBpZGVfcmVhZF9hbHRzdGF0dXMsCi0JLnJlYWRfc2ZmX2RtYV9zdGF0dXMJPSBpZGVfcmVhZF9zZmZfZG1hX3N0YXR1cywKIAogCS5zZXRfaXJxCQk9IHBtYWNfc2V0X2lycSwKIApAQCAtMTUxMywxMCArMTUxMiwxMCBAQAogc3RhdGljIGludAogcG1hY19pZGVfZG1hX3NldHVwKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXBtYWNfaWRlX2h3aWZfdCAqcG1pZiA9CiAJCShwbWFjX2lkZV9od2lmX3QgKilkZXZfZ2V0X2RydmRhdGEoaHdpZi0+Z2VuZGV2LnBhcmVudCk7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gSFdHUk9VUChkcml2ZSktPnJxOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IGh3aWYtPnJxOwogCXU4IHVuaXQgPSBkcml2ZS0+ZG4gJiAxLCBhdGE0ID0gKHBtaWYtPmtpbmQgPT0gY29udHJvbGxlcl9rbF9hdGE0KTsKIAogCWlmICghcG1hY19pZGVfYnVpbGRfZG1hdGFibGUoZHJpdmUsIHJxKSkgewpAQCAtMTYzNyw3ICsxNjM2LDcgQEAKIAkJCWJyZWFrOwogCQlpZiAoKyt0aW1lb3V0ID4gMTAwKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJpZGUlZCwgaWRlX2RtYV90ZXN0X2lycSBcCi0JCQl0aW1lb3V0IGZsdXNoaW5nIGNoYW5uZWxcbiIsIEhXSUYoZHJpdmUpLT5pbmRleCk7CisJCQl0aW1lb3V0IGZsdXNoaW5nIGNoYW5uZWxcbiIsIGh3aWYtPmluZGV4KTsKIAkJCWJyZWFrOwogCQl9CiAJfQkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3E0MGlkZS5jIGIvZHJpdmVycy9pZGUvcTQwaWRlLmMKaW5kZXggNGFmNGE4Yy4uOWY5YzBiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcTQwaWRlLmMKKysrIGIvZHJpdmVycy9pZGUvcTQwaWRlLmMKQEAgLTk5LDcgKzk5LDYgQEAKIAkuZXhlY19jb21tYW5kCQk9IGlkZV9leGVjX2NvbW1hbmQsCiAJLnJlYWRfc3RhdHVzCQk9IGlkZV9yZWFkX3N0YXR1cywKIAkucmVhZF9hbHRzdGF0dXMJCT0gaWRlX3JlYWRfYWx0c3RhdHVzLAotCS5yZWFkX3NmZl9kbWFfc3RhdHVzCT0gaWRlX3JlYWRfc2ZmX2RtYV9zdGF0dXMsCiAKIAkuc2V0X2lycQkJPSBpZGVfc2V0X2lycSwKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcWQ2NXh4LmMgYi9kcml2ZXJzL2lkZS9xZDY1eHguYwppbmRleCBiYzI3YzdhLi41YjJlM2FmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcWQ2NXh4LmMKKysrIGIvZHJpdmVycy9pZGUvcWQ2NXh4LmMKQEAgLTIwMiw3ICsyMDIsOCBAQAogCQlyZWNvdmVyeV90aW1lID0gZHJpdmUtPmlkW0FUQV9JRF9FSURFX1BJT10gLSAxMjA7CiAJfQogCi0JcWRfc2V0X3RpbWluZyhkcml2ZSwgcWQ2NTAwX2NvbXB1dGVfdGltaW5nKEhXSUYoZHJpdmUpLCBhY3RpdmVfdGltZSwgcmVjb3ZlcnlfdGltZSkpOworCXFkX3NldF90aW1pbmcoZHJpdmUsIHFkNjUwMF9jb21wdXRlX3RpbWluZyhkcml2ZS0+aHdpZiwKKwkJCQlhY3RpdmVfdGltZSwgcmVjb3ZlcnlfdGltZSkpOwogfQogCiBzdGF0aWMgdm9pZCBxZDY1ODBfc2V0X3Bpb19tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggcGlvKQpAQCAtMjQ1LDExICsyNDYsMTEgQEAKIAkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFBJTyBtb2RlJWRcbiIsIGRyaXZlLT5uYW1lLHBpbyk7CiAJfQogCi0JaWYgKCFIV0lGKGRyaXZlKS0+Y2hhbm5lbCAmJiBkcml2ZS0+bWVkaWEgIT0gaWRlX2Rpc2spIHsKKwlpZiAoIWh3aWYtPmNoYW5uZWwgJiYgZHJpdmUtPm1lZGlhICE9IGlkZV9kaXNrKSB7CiAJCW91dGIoMHg1ZiwgUURfQ09OVFJPTF9QT1JUKTsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEFUQVBJOiBkaXNhYmxlZCByZWFkLWFoZWFkIEZJRk8gIgogCQkJImFuZCBwb3N0LXdyaXRlIGJ1ZmZlciBvbiAlcy5cbiIsCi0JCQlkcml2ZS0+bmFtZSwgSFdJRihkcml2ZSktPm5hbWUpOworCQkJZHJpdmUtPm5hbWUsIGh3aWYtPm5hbWUpOwogCX0KIAogCXFkX3NldF90aW1pbmcoZHJpdmUsIHFkNjU4MF9jb21wdXRlX3RpbWluZyhhY3RpdmVfdGltZSwgcmVjb3ZlcnlfdGltZSkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcWQ2NXh4LmggYi9kcml2ZXJzL2lkZS9xZDY1eHguaAppbmRleCBjODNkZWE4Li42NjM2Zjk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9xZDY1eHguaAorKysgYi9kcml2ZXJzL2lkZS9xZDY1eHguaApAQCAtMzEsOCArMzEsOCBAQAogCiAjZGVmaW5lIFFEX0NPTkZJRyhod2lmKQkJKChod2lmKS0+Y29uZmlnX2RhdGEgJiAweDAwZmYpCiAKLSNkZWZpbmUgUURfVElNSU5HKGRyaXZlKQkoYnl0ZSkoKChkcml2ZSktPmRyaXZlX2RhdGEpICYgMHgwMGZmKQotI2RlZmluZSBRRF9USU1SRUcoZHJpdmUpCShieXRlKSgoKChkcml2ZSktPmRyaXZlX2RhdGEpICYgMHhmZjAwKSA+PiA4KQorI2RlZmluZSBRRF9USU1JTkcoZHJpdmUpCSh1OCkoKChkcml2ZSktPmRyaXZlX2RhdGEpICYgMHgwMGZmKQorI2RlZmluZSBRRF9USU1SRUcoZHJpdmUpCSh1OCkoKCgoZHJpdmUpLT5kcml2ZV9kYXRhKSAmIDB4ZmYwMCkgPj4gOCkKIAogI2RlZmluZSBRRDY1MDBfREVGX0RBVEEJCSgoUURfVElNMV9QT1JUPDw4KSB8IChRRF9JRDMgPyAweDBjIDogMHgwOCkpCiAjZGVmaW5lIFFENjU4MF9ERUZfREFUQQkJKChRRF9USU0xX1BPUlQ8PDgpIHwgKFFEX0lEMyA/IDB4MGEgOiAweDAwKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3NjMTIwMC5jIGIvZHJpdmVycy9pZGUvc2MxMjAwLmMKaW5kZXggZWM3Zjc2Ni4uZGJkZDI5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvc2MxMjAwLmMKKysrIGIvZHJpdmVycy9pZGUvc2MxMjAwLmMKQEAgLTEyNSw3ICsxMjUsNyBAQAogCiBzdGF0aWMgdm9pZCBzYzEyMDBfc2V0X2RtYV9tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggbW9kZSkKIHsKLQlpZGVfaHdpZl90CQkqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QJCSpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYJCSpkZXYgPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJdW5zaWduZWQgaW50CQlyZWcsIHRpbWluZ3M7CiAJdW5zaWduZWQgc2hvcnQJCXBjaV9jbG9jazsKQEAgLTE3MCw5ICsxNzAsOSBAQAogICovCiBzdGF0aWMgaW50IHNjMTIwMF9kbWFfZW5kKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXVuc2lnbmVkIGxvbmcgZG1hX2Jhc2UgPSBod2lmLT5kbWFfYmFzZTsKLQlieXRlIGRtYV9zdGF0OworCXU4IGRtYV9zdGF0OwogCiAJZG1hX3N0YXQgPSBpbmIoZG1hX2Jhc2UrMik7CQkvKiBnZXQgRE1BIHN0YXR1cyAqLwogCkBAIC0xOTksNyArMTk5LDcgQEAKIAogc3RhdGljIHZvaWQgc2MxMjAwX3NldF9waW9fbW9kZShpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IHU4IHBpbykKIHsKLQlpZGVfaHdpZl90CSpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdAkqaHdpZiA9IGRyaXZlLT5od2lmOwogCWludAkJbW9kZSA9IC0xOwogCiAJLyoKQEAgLTI5Miw2ICsyOTIsNyBAQAogCS5kbWFfdGVzdF9pcnEJCT0gaWRlX2RtYV90ZXN0X2lycSwKIAkuZG1hX2xvc3RfaXJxCQk9IGlkZV9kbWFfbG9zdF9pcnEsCiAJLmRtYV90aW1lb3V0CQk9IGlkZV9kbWFfdGltZW91dCwKKwkuZG1hX3NmZl9yZWFkX3N0YXR1cwk9IGlkZV9kbWFfc2ZmX3JlYWRfc3RhdHVzLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpZGVfcG9ydF9pbmZvIHNjMTIwMF9jaGlwc2V0IF9fZGV2aW5pdGRhdGEgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9zY2NfcGF0YS5jIGIvZHJpdmVycy9pZGUvc2NjX3BhdGEuYwppbmRleCAwZjQ4ZjlkLi44ZDIzMTRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9zY2NfcGF0YS5jCisrKyBiL2RyaXZlcnMvaWRlL3NjY19wYXRhLmMKQEAgLTE0Myw3ICsxNDMsNyBAQAogCXJldHVybiAodTgpaW5fYmUzMigodm9pZCAqKWh3aWYtPmlvX3BvcnRzLmN0bF9hZGRyKTsKIH0KIAotc3RhdGljIHU4IHNjY19yZWFkX3NmZl9kbWFfc3RhdHVzKGlkZV9od2lmX3QgKmh3aWYpCitzdGF0aWMgdTggc2NjX2RtYV9zZmZfcmVhZF9zdGF0dXMoaWRlX2h3aWZfdCAqaHdpZikKIHsKIAlyZXR1cm4gKHU4KWluX2JlMzIoKHZvaWQgKikoaHdpZi0+ZG1hX2Jhc2UgKyA0KSk7CiB9CkBAIC0yMTcsNyArMjE3LDcgQEAKIAogc3RhdGljIHZvaWQgc2NjX3NldF9waW9fbW9kZShpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IHU4IHBpbykKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBzY2NfcG9ydHMgKnBvcnRzID0gaWRlX2dldF9od2lmZGF0YShod2lmKTsKIAl1bnNpZ25lZCBsb25nIGN0bF9iYXNlID0gcG9ydHMtPmN0bDsKIAl1bnNpZ25lZCBsb25nIGNja2N0cmxfcG9ydCA9IGN0bF9iYXNlICsgMHhmZjA7CkBAIC0yNDksNyArMjQ5LDcgQEAKIAogc3RhdGljIHZvaWQgc2NjX3NldF9kbWFfbW9kZShpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IHU4IHNwZWVkKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHNjY19wb3J0cyAqcG9ydHMgPSBpZGVfZ2V0X2h3aWZkYXRhKGh3aWYpOwogCXVuc2lnbmVkIGxvbmcgY3RsX2Jhc2UgPSBwb3J0cy0+Y3RsOwogCXVuc2lnbmVkIGxvbmcgY2NrY3RybF9wb3J0ID0gY3RsX2Jhc2UgKyAweGZmMDsKQEAgLTI1OSw3ICsyNTksNyBAQAogCXVuc2lnbmVkIGxvbmcgc2NyY3N0X3BvcnQgPSBjdGxfYmFzZSArIDB4MDE0OwogCXVuc2lnbmVkIGxvbmcgdWRlbnZ0X3BvcnQgPSBjdGxfYmFzZSArIDB4MDE4OwogCXVuc2lnbmVkIGxvbmcgdGR2aHNlbF9wb3J0ICAgPSBjdGxfYmFzZSArIDB4MDIwOwotCWludCBpc19zbGF2ZSA9ICgmaHdpZi0+ZHJpdmVzWzFdID09IGRyaXZlKTsKKwlpbnQgaXNfc2xhdmUgPSBkcml2ZS0+ZG4gJiAxOwogCWludCBvZmZzZXQsIGlkeDsKIAl1bnNpZ25lZCBsb25nIHJlZzsKIAl1bnNpZ25lZCBsb25nIGpjYWN0c2VsOwpAQCAtMjkyLDcgKzI5Miw3IEBACiB7CiAJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXU4IHVuaXQgPSBkcml2ZS0+ZG4gJiAxOwotCXU4IGRtYV9zdGF0ID0gc2NjX2lkZV9pbmIoaHdpZi0+ZG1hX2Jhc2UgKyA0KTsKKwl1OCBkbWFfc3RhdCA9IHNjY19kbWFfc2ZmX3JlYWRfc3RhdHVzKGh3aWYpOwogCiAJaWYgKG9uKQogCQlkbWFfc3RhdCB8PSAoMSA8PCAoNSArIHVuaXQpKTsKQEAgLTMxNiw3ICszMTYsNyBAQAogc3RhdGljIGludCBzY2NfZG1hX3NldHVwKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gSFdHUk9VUChkcml2ZSktPnJxOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IGh3aWYtPnJxOwogCXVuc2lnbmVkIGludCByZWFkaW5nOwogCXU4IGRtYV9zdGF0OwogCkBAIC0zMzgsNyArMzM4LDcgQEAKIAlvdXRfYmUzMigodm9pZCBfX2lvbWVtICopaHdpZi0+ZG1hX2Jhc2UsIHJlYWRpbmcpOwogCiAJLyogcmVhZCBETUEgc3RhdHVzIGZvciBJTlRSICYgRVJST1IgZmxhZ3MgKi8KLQlkbWFfc3RhdCA9IGluX2JlMzIoKHZvaWQgX19pb21lbSAqKShod2lmLT5kbWFfYmFzZSArIDQpKTsKKwlkbWFfc3RhdCA9IHNjY19kbWFfc2ZmX3JlYWRfc3RhdHVzKGh3aWYpOwogCiAJLyogY2xlYXIgSU5UUiAmIEVSUk9SIGZsYWdzICovCiAJb3V0X2JlMzIoKHZvaWQgX19pb21lbSAqKShod2lmLT5kbWFfYmFzZSArIDQpLCBkbWFfc3RhdCB8IDYpOwpAQCAtMzY3LDcgKzM2Nyw3IEBACiAJLyogc3RvcCBETUEgKi8KIAlzY2NfaWRlX291dGIoZG1hX2NtZCAmIH4xLCBod2lmLT5kbWFfYmFzZSk7CiAJLyogZ2V0IERNQSBzdGF0dXMgKi8KLQlkbWFfc3RhdCA9IHNjY19pZGVfaW5iKGh3aWYtPmRtYV9iYXNlICsgNCk7CisJZG1hX3N0YXQgPSBzY2NfZG1hX3NmZl9yZWFkX3N0YXR1cyhod2lmKTsKIAkvKiBjbGVhciB0aGUgSU5UUiAmIEVSUk9SIGJpdHMgKi8KIAlzY2NfaWRlX291dGIoZG1hX3N0YXQgfCA2LCBod2lmLT5kbWFfYmFzZSArIDQpOwogCS8qIHB1cmdlIERNQSBtYXBwaW5ncyAqLwpAQCAtMzg3LDcgKzM4Nyw3IEBACiAKIHN0YXRpYyBpbnQgc2NjX2RtYV9lbmQoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJdm9pZCBfX2lvbWVtICpkbWFfYmFzZSA9ICh2b2lkIF9faW9tZW0gKilod2lmLT5kbWFfYmFzZTsKIAl1bnNpZ25lZCBsb25nIGludHN0c19wb3J0ID0gaHdpZi0+ZG1hX2Jhc2UgKyAweDAxNDsKIAl1MzIgcmVnOwpAQCAtNDA1LDE3ICs0MDUsMTggQEAKIAkJCSAgICAgICBkcml2ZS0+bmFtZSk7CiAJCQlkYXRhX2xvc3MgPSAxOwogCQkJaWYgKHJldHJ5KyspIHsKLQkJCQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBIV0dST1VQKGRyaXZlKS0+cnE7Ci0JCQkJaW50IHVuaXQ7CisJCQkJc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+cnE7CisJCQkJaWRlX2RyaXZlX3QgKmRyaXZlOworCQkJCWludCBpOworCiAJCQkJLyogRVJST1JfUkVTRVQgYW5kIGRyaXZlLT5jcmNfY291bnQgYXJlIG5lZWRlZAogCQkJCSAqIHRvIHJlZHVjZSBETUEgdHJhbnNmZXIgbW9kZSBpbiByZXRyeSBwcm9jZXNzLgogCQkJCSAqLwogCQkJCWlmIChycSkKIAkJCQkJcnEtPmVycm9ycyB8PSBFUlJPUl9SRVNFVDsKLQkJCQlmb3IgKHVuaXQgPSAwOyB1bml0IDwgTUFYX0RSSVZFUzsgdW5pdCsrKSB7Ci0JCQkJCWlkZV9kcml2ZV90ICpkcml2ZSA9ICZod2lmLT5kcml2ZXNbdW5pdF07CisKKwkJCQlpZGVfcG9ydF9mb3JfZWFjaF9kZXYoaSwgZHJpdmUsIGh3aWYpCiAJCQkJCWRyaXZlLT5jcmNfY291bnQrKzsKLQkJCQl9CiAJCQl9CiAJCX0KIAl9CkBAIC00OTYsNyArNDk3LDcgQEAKIC8qIHJldHVybnMgMSBpZiBkbWEgaXJxIGlzc3VlZCwgMCBvdGhlcndpc2UgKi8KIHN0YXRpYyBpbnQgc2NjX2RtYV90ZXN0X2lycShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAl1MzIgaW50X3N0YXQgPSBpbl9iZTMyKCh2b2lkIF9faW9tZW0gKilod2lmLT5kbWFfYmFzZSArIDB4MDE0KTsKIAogCS8qIFNDQyBlcnJhdGEgQTI1MixBMzA4IHdvcmthcm91bmQ6IFN0ZXA0ICovCkBAIC04NTIsNyArODUzLDYgQEAKIAkuZXhlY19jb21tYW5kCQk9IHNjY19leGVjX2NvbW1hbmQsCiAJLnJlYWRfc3RhdHVzCQk9IHNjY19yZWFkX3N0YXR1cywKIAkucmVhZF9hbHRzdGF0dXMJCT0gc2NjX3JlYWRfYWx0c3RhdHVzLAotCS5yZWFkX3NmZl9kbWFfc3RhdHVzCT0gc2NjX3JlYWRfc2ZmX2RtYV9zdGF0dXMsCiAKIAkuc2V0X2lycQkJPSBzY2Nfc2V0X2lycSwKIApAQCAtODc5LDYgKzg3OSw3IEBACiAJLmRtYV90ZXN0X2lycQkJPSBzY2NfZG1hX3Rlc3RfaXJxLAogCS5kbWFfbG9zdF9pcnEJCT0gaWRlX2RtYV9sb3N0X2lycSwKIAkuZG1hX3RpbWVvdXQJCT0gaWRlX2RtYV90aW1lb3V0LAorCS5kbWFfc2ZmX3JlYWRfc3RhdHVzCT0gc2NjX2RtYV9zZmZfcmVhZF9zdGF0dXMsCiB9OwogCiAjZGVmaW5lIERFQ0xBUkVfU0NDX0RFVihuYW1lX3N0cikJCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9zZXJ2ZXJ3b3Jrcy5jIGIvZHJpdmVycy9pZGUvc2VydmVyd29ya3MuYwppbmRleCA0MzdiYzkxLi4zODIxMDJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9zZXJ2ZXJ3b3Jrcy5jCisrKyBiL2RyaXZlcnMvaWRlL3NlcnZlcndvcmtzLmMKQEAgLTE1MSw3ICsxNTEsNyBAQAogCXN0YXRpYyBjb25zdCB1OCBkbWFfbW9kZXNbXQkJPSB7IDB4NzcsIDB4MjEsIDB4MjAgfTsKIAlzdGF0aWMgY29uc3QgdTggZHJpdmVfcGNpMltdCQk9IHsgMHg0NSwgMHg0NCwgMHg0NywgMHg0NiB9OwogCi0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXU4IHVuaXQJCQk9IGRyaXZlLT5kbiAmIDE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3NldHVwLXBjaS5jIGIvZHJpdmVycy9pZGUvc2V0dXAtcGNpLmMKaW5kZXggOWYxZjkxNi4uZTg1ZDFlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvc2V0dXAtcGNpLmMKKysrIGIvZHJpdmVycy9pZGUvc2V0dXAtcGNpLmMKQEAgLTEzMCw3ICsxMzAsNyBAQAogCSAqIHdlIHR1bmUgdGhlIGRyaXZlIHRoZW4gdHJ5IHRvIGdyYWIgRE1BIG93bmVyc2hpcCBpZiB3ZSB3YW50IHRvIGJlCiAJICogdGhlIERNQSBlbmQuICBUaGlzIGhhcyB0byBiZSBiZWNvbWUgZHluYW1pYyB0byBoYW5kbGUgaG90LXBsdWcuCiAJICovCi0JZG1hX3N0YXQgPSBod2lmLT50cF9vcHMtPnJlYWRfc2ZmX2RtYV9zdGF0dXMoaHdpZik7CisJZG1hX3N0YXQgPSBod2lmLT5kbWFfb3BzLT5kbWFfc2ZmX3JlYWRfc3RhdHVzKGh3aWYpOwogCWlmICgoZG1hX3N0YXQgJiAweDgwKSAmJiBod2lmLT5tYXRlICYmIGh3aWYtPm1hdGUtPmRtYV9iYXNlKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIiVzICVzOiBzaW1wbGV4IGRldmljZTogRE1BIGRpc2FibGVkXG4iLAogCQkJZC0+bmFtZSwgcGNpX25hbWUoZGV2KSk7CkBAIC0zNzcsNiArMzc3LDkgQEAKIAogCQlod2lmLT5kbWFfYmFzZSA9IGJhc2U7CiAKKwkJaWYgKGh3aWYtPmRtYV9vcHMgPT0gTlVMTCkKKwkJCWh3aWYtPmRtYV9vcHMgPSAmc2ZmX2RtYV9vcHM7CisKIAkJaWYgKGlkZV9wY2lfY2hlY2tfc2ltcGxleChod2lmLCBkKSA8IDApCiAJCQlyZXR1cm4gLTE7CiAKQEAgLTM5Myw4ICszOTYsNiBAQAogCiAJCWlmIChpZGVfYWxsb2NhdGVfZG1hX2VuZ2luZShod2lmKSkKIAkJCXJldHVybiAtMTsKLQotCQlod2lmLT5kbWFfb3BzID0gJnNmZl9kbWFfb3BzOwogCX0KIAogCXJldHVybiAwOwpAQCAtNDcxLDcgKzQ3Miw3IEBACiAJICovCiAKIAlmb3IgKHBvcnQgPSAwOyBwb3J0IDwgY2hhbm5lbHM7ICsrcG9ydCkgewotCQljb25zdCBpZGVfcGNpX2VuYWJsZWJpdF90ICplID0gJihkLT5lbmFibGViaXRzW3BvcnRdKTsKKwkJY29uc3Qgc3RydWN0IGlkZV9wY2lfZW5hYmxlYml0ICplID0gJmQtPmVuYWJsZWJpdHNbcG9ydF07CiAKIAkJaWYgKGUtPnJlZyAmJiAocGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBlLT5yZWcsICZ0bXApIHx8CiAJCSAgICAodG1wICYgZS0+bWFzaykgIT0gZS0+dmFsKSkgewpAQCAtNTE5LDggKzUyMCw3IEBACiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCi0JLyogSXMgaXQgYW4gIklERSBzdG9yYWdlIiBkZXZpY2UgaW4gbm9uLVBDSSBtb2RlPyAqLwotCWlmICgoZGV2LT5jbGFzcyA+PiA4KSA9PSBQQ0lfQ0xBU1NfU1RPUkFHRV9JREUgJiYgKGRldi0+Y2xhc3MgJiA1KSAhPSA1KSB7CisJaWYgKGlkZV9wY2lfaXNfaW5fY29tcGF0aWJpbGl0eV9tb2RlKGRldikpIHsKIAkJaWYgKG5vaXN5KQogCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgJXM6IG5vdCAxMDAlJSBuYXRpdmUgbW9kZTogd2lsbCAiCiAJCQkJInByb2JlIGlycXMgbGF0ZXJcbiIsIGQtPm5hbWUsIHBjaV9uYW1lKGRldikpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvc2dpaW9jNC5jIGIvZHJpdmVycy9pZGUvc2dpaW9jNC5jCmluZGV4IGE2ODdhN2QuLmZkYjlkNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3NnaWlvYzQuYworKysgYi9kcml2ZXJzL2lkZS9zZ2lpb2M0LmMKQEAgLTEyMyw3ICsxMjMsNyBAQAogc2dpaW9jNF9jbGVhcmlycShpZGVfZHJpdmVfdCAqIGRyaXZlKQogewogCXUzMiBpbnRyX3JlZzsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBpZGVfaW9fcG9ydHMgKmlvX3BvcnRzID0gJmh3aWYtPmlvX3BvcnRzOwogCXVuc2lnbmVkIGxvbmcgb3RoZXJfaXIgPSBpb19wb3J0cy0+aXJxX2FkZHIgKyAoSU9DNF9JTlRSX1JFRyA8PCAyKTsKIApAQCAtMTgxLDcgKzE4MSw3IEBACiAKIHN0YXRpYyB2b2lkIHNnaWlvYzRfZG1hX3N0YXJ0KGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXVuc2lnbmVkIGxvbmcgaW9jNF9kbWFfYWRkciA9IGh3aWYtPmRtYV9iYXNlICsgSU9DNF9ETUFfQ1RSTCAqIDQ7CiAJdW5zaWduZWQgaW50IHJlZyA9IHJlYWRsKCh2b2lkIF9faW9tZW0gKilpb2M0X2RtYV9hZGRyKTsKIAl1bnNpZ25lZCBpbnQgdGVtcF9yZWcgPSByZWcgfCBJT0M0X1NfRE1BX1NUQVJUOwpAQCAtMjA5LDcgKzIwOSw3IEBACiBzdGF0aWMgaW50IHNnaWlvYzRfZG1hX2VuZChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7CiAJdTMyIGlvYzRfZG1hLCBiY19kZXYsIGJjX21lbSwgbnVtLCB2YWxpZCA9IDAsIGNudCA9IDA7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAl1bnNpZ25lZCBsb25nIGRtYV9iYXNlID0gaHdpZi0+ZG1hX2Jhc2U7CiAJaW50IGRtYV9zdGF0ID0gMDsKIAl1bnNpZ25lZCBsb25nICplbmRpbmdfZG1hID0gaWRlX2dldF9od2lmZGF0YShod2lmKTsKQEAgLTI3MSw3ICsyNzEsNyBAQAogLyogcmV0dXJucyAxIGlmIGRtYSBpcnEgaXNzdWVkLCAwIG90aGVyd2lzZSAqLwogc3RhdGljIGludCBzZ2lpb2M0X2RtYV90ZXN0X2lycShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JcmV0dXJuIHNnaWlvYzRfY2hlY2tpcnEoSFdJRihkcml2ZSkpOworCXJldHVybiBzZ2lpb2M0X2NoZWNraXJxKGRyaXZlLT5od2lmKTsKIH0KIAogc3RhdGljIHZvaWQgc2dpaW9jNF9kbWFfaG9zdF9zZXQoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgb24pCkBAIC0zNjcsNyArMzY3LDcgQEAKIHNnaWlvYzRfY29uZmlndXJlX2Zvcl9kbWEoaW50IGRtYV9kaXJlY3Rpb24sIGlkZV9kcml2ZV90ICogZHJpdmUpCiB7CiAJdTMyIGlvYzRfZG1hOwotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJdW5zaWduZWQgbG9uZyBkbWFfYmFzZSA9IGh3aWYtPmRtYV9iYXNlOwogCXVuc2lnbmVkIGxvbmcgaW9jNF9kbWFfYWRkciA9IGRtYV9iYXNlICsgSU9DNF9ETUFfQ1RSTCAqIDQ7CiAJdTMyIGRtYV9hZGRyLCBlbmRpbmdfZG1hX2FkZHI7CkBAIC00MjcsNyArNDI3LDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKIHNnaWlvYzRfYnVpbGRfZG1hX3RhYmxlKGlkZV9kcml2ZV90ICogZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSwgaW50IGRkaXIpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAl1bnNpZ25lZCBpbnQgKnRhYmxlID0gaHdpZi0+ZG1hdGFibGVfY3B1OwogCXVuc2lnbmVkIGludCBjb3VudCA9IDAsIGkgPSAxOwogCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CkBAIC00OTIsNyArNDkyLDcgQEAKIAogc3RhdGljIGludCBzZ2lpb2M0X2RtYV9zZXR1cChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gSFdHUk9VUChkcml2ZSktPnJxOworCXN0cnVjdCByZXF1ZXN0ICpycSA9IGRyaXZlLT5od2lmLT5ycTsKIAl1bnNpZ25lZCBpbnQgY291bnQgPSAwOwogCWludCBkZGlyOwogCkBAIC01MjMsNyArNTIzLDYgQEAKIAkuZXhlY19jb21tYW5kCQk9IGlkZV9leGVjX2NvbW1hbmQsCiAJLnJlYWRfc3RhdHVzCQk9IHNnaWlvYzRfcmVhZF9zdGF0dXMsCiAJLnJlYWRfYWx0c3RhdHVzCQk9IGlkZV9yZWFkX2FsdHN0YXR1cywKLQkucmVhZF9zZmZfZG1hX3N0YXR1cwk9IGlkZV9yZWFkX3NmZl9kbWFfc3RhdHVzLAogCiAJLnNldF9pcnEJCT0gaWRlX3NldF9pcnEsCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3NpaW1hZ2UuYyBiL2RyaXZlcnMvaWRlL3NpaW1hZ2UuYwppbmRleCA3ZDYyMmQyLi5jYjJiMzUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9zaWltYWdlLmMKKysrIGIvZHJpdmVycy9pZGUvc2lpbWFnZS5jCkBAIC0xMTQsNyArMTE0LDcgQEAKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHNpaW1hZ2Vfc2VsZGV2KGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IHIpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAl1bnNpZ25lZCBsb25nIGJhc2UJPSAodW5zaWduZWQgbG9uZylod2lmLT5od2lmX2RhdGE7CiAJdTggdW5pdAkJCT0gZHJpdmUtPmRuICYgMTsKIApAQCAtMjQzLDcgKzI0Myw3IEBACiAJc3RhdGljIGNvbnN0IHUxNiB0Zl9zcGVlZFtdICAgPSB7IDB4MzI4YSwgMHgyMjgzLCAweDEyODEsIDB4MTBjMywgMHgxMGMxIH07CiAJc3RhdGljIGNvbnN0IHUxNiBkYXRhX3NwZWVkW10gPSB7IDB4MzI4YSwgMHgyMjgzLCAweDExMDQsIDB4MTBjMywgMHgxMGMxIH07CiAKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJaWRlX2RyaXZlX3QgKnBhaXIJPSBpZGVfZ2V0X3BhaXJfZGV2KGRyaXZlKTsKIAl1MzIgc3BlZWR0CQk9IDA7CkBAIC0zMDAsNyArMzAwLDcgQEAKIAlzdGF0aWMgY29uc3QgdTggdWx0cmE1W10gPSB7IDB4MEMsIDB4MDcsIDB4MDUsIDB4MDQsIDB4MDIsIDB4MDEgfTsKIAlzdGF0aWMgY29uc3QgdTE2IGRtYVtdCSA9IHsgMHgyMjA4LCAweDEwQzIsIDB4MTBDMSB9OwogCi0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXVuc2lnbmVkIGxvbmcgYmFzZQk9ICh1bnNpZ25lZCBsb25nKWh3aWYtPmh3aWZfZGF0YTsKIAl1MTYgdWx0cmEgPSAwLCBtdWx0aQk9IDA7CkBAIC0zNDAsNyArMzQwLDcgQEAKIC8qIHJldHVybnMgMSBpZiBkbWEgaXJxIGlzc3VlZCwgMCBvdGhlcndpc2UgKi8KIHN0YXRpYyBpbnQgc2lpbWFnZV9pb19kbWFfdGVzdF9pcnEoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAl1OCBkbWFfYWx0c3RhdAkJPSAwOwogCXVuc2lnbmVkIGxvbmcgYWRkcgk9IHNpaW1hZ2Vfc2VscmVnKGh3aWYsIDEpOwpAQCAtMzY3LDcgKzM2Nyw3IEBACiAKIHN0YXRpYyBpbnQgc2lpbWFnZV9tbWlvX2RtYV90ZXN0X2lycShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAl1bnNpZ25lZCBsb25nIGFkZHIJPSBzaWltYWdlX3NlbHJlZyhod2lmLCAweDEpOwogCXZvaWQgX19pb21lbSAqc2F0YV9lcnJvcl9hZGRyCiAJCT0gKHZvaWQgX19pb21lbSAqKWh3aWYtPnNhdGFfc2NyW1NBVEFfRVJST1JfT0ZGU0VUXTsKQEAgLTcxNyw2ICs3MTcsNyBAQAogCS5kbWFfdGVzdF9pcnEJCT0gc2lpbWFnZV9kbWFfdGVzdF9pcnEsCiAJLmRtYV90aW1lb3V0CQk9IGlkZV9kbWFfdGltZW91dCwKIAkuZG1hX2xvc3RfaXJxCQk9IGlkZV9kbWFfbG9zdF9pcnEsCisJLmRtYV9zZmZfcmVhZF9zdGF0dXMJPSBpZGVfZG1hX3NmZl9yZWFkX3N0YXR1cywKIH07CiAKICNkZWZpbmUgREVDTEFSRV9TSUlfREVWKHBfb3BzKQkJCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9zaXM1NTEzLmMgYi9kcml2ZXJzL2lkZS9zaXM1NTEzLmMKaW5kZXggYWQzMmUxOC4uOWVjMWE0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvc2lzNTUxMy5jCisrKyBiL2RyaXZlcnMvaWRlL3NpczU1MTMuYwpAQCAtMjc0LDcgKzI3NCw3IEBACiAKIHN0YXRpYyB2b2lkIGNvbmZpZ19kcml2ZV9hcnRfcndwKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJdTggcmVnNGJoCQk9IDA7CiAJdTggcndfcHJlZmV0Y2gJCT0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3NsODJjMTA1LmMgYi9kcml2ZXJzL2lkZS9zbDgyYzEwNS5jCmluZGV4IDg0ZGMzMzYuLjQ4Y2M3NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3NsODJjMTA1LmMKKysrIGIvZHJpdmVycy9pZGUvc2w4MmMxMDUuYwpAQCAtMTQwLDcgKzE0MCw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIHNsODJjMTA1X2RtYV9sb3N0X2lycShpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXUzMiB2YWwsIG1hc2sJCT0gaHdpZi0+Y2hhbm5lbCA/IENUUkxfSURFX0lSUUIgOiBDVFJMX0lERV9JUlFBOwogCXU4IGRtYV9jbWQ7CkBAIC0xNzcsNyArMTc3LDcgQEAKICAqLwogc3RhdGljIHZvaWQgc2w4MmMxMDVfZG1hX3N0YXJ0KGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJaW50IHJlZyAJCT0gMHg0NCArIGRyaXZlLT5kbiAqIDQ7CiAKQEAgLTI5OSw2ICsyOTksNyBAQAogCS5kbWFfdGVzdF9pcnEJCT0gaWRlX2RtYV90ZXN0X2lycSwKIAkuZG1hX2xvc3RfaXJxCQk9IHNsODJjMTA1X2RtYV9sb3N0X2lycSwKIAkuZG1hX3RpbWVvdXQJCT0gc2w4MmMxMDVfZG1hX3RpbWVvdXQsCisJLmRtYV9zZmZfcmVhZF9zdGF0dXMJPSBpZGVfZG1hX3NmZl9yZWFkX3N0YXR1cywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWRlX3BvcnRfaW5mbyBzbDgyYzEwNV9jaGlwc2V0IF9fZGV2aW5pdGRhdGEgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9zbGM5MGU2Ni5jIGIvZHJpdmVycy9pZGUvc2xjOTBlNjYuYwppbmRleCAwZjc1OWU0Li40MGI0Yjk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9zbGM5MGU2Ni5jCisrKyBiL2RyaXZlcnMvaWRlL3NsYzkwZTY2LmMKQEAgLTIwLDcgKzIwLDcgQEAKIAogc3RhdGljIHZvaWQgc2xjOTBlNjZfc2V0X3Bpb19tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggcGlvKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAlpbnQgaXNfc2xhdmUJCT0gZHJpdmUtPmRuICYgMTsKIAlpbnQgbWFzdGVyX3BvcnQJCT0gaHdpZi0+Y2hhbm5lbCA/IDB4NDIgOiAweDQwOwpAQCAtNzMsNyArNzMsNyBAQAogCiBzdGF0aWMgdm9pZCBzbGM5MGU2Nl9zZXRfZG1hX21vZGUoaWRlX2RyaXZlX3QgKmRyaXZlLCBjb25zdCB1OCBzcGVlZCkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSB0b19wY2lfZGV2KGh3aWYtPmRldik7CiAJdTggbWFzbGF2ZQkJPSBod2lmLT5jaGFubmVsID8gMHg0MiA6IDB4NDA7CiAJaW50IHNpdHJlID0gMCwgYV9zcGVlZAk9IDcgPDwgKGRyaXZlLT5kbiAqIDQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvdGM4NmMwMDEuYyBiL2RyaXZlcnMvaWRlL3RjODZjMDAxLmMKaW5kZXggOTNlMmNjZS4uODQxMDlmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvdGM4NmMwMDEuYworKysgYi9kcml2ZXJzL2lkZS90Yzg2YzAwMS5jCkBAIC0xNSw3ICsxNSw3IEBACiAKIHN0YXRpYyB2b2lkIHRjODZjMDAxX3NldF9tb2RlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdTggc3BlZWQpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAl1bnNpZ25lZCBsb25nIHNjcl9wb3J0CT0gaHdpZi0+Y29uZmlnX2RhdGEgKyAoZHJpdmUtPmRuID8gMHgwMiA6IDB4MDApOwogCXUxNiBtb2RlLCBzY3IJCT0gaW53KHNjcl9wb3J0KTsKIApAQCAtNjIsMTMgKzYyLDEyIEBACiAgKi8KIHN0YXRpYyBpbnQgdGM4NmMwMDFfdGltZXJfZXhwaXJ5KGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOwogCWlkZV9leHBpcnlfdCAqZXhwaXJ5CT0gaWRlX2dldF9od2lmZGF0YShod2lmKTsKLQlpZGVfaHdncm91cF90ICpod2dyb3VwCT0gSFdHUk9VUChkcml2ZSk7CiAJdTggZG1hX3N0YXQJCT0gaW5iKGh3aWYtPmRtYV9iYXNlICsgQVRBX0RNQV9TVEFUVVMpOwogCiAJLyogUmVzdG9yZSBhIGhpZ2hlciBsZXZlbCBkcml2ZXIncyBleHBpcnkgaGFuZGxlciBmaXJzdC4gKi8KLQlod2dyb3VwLT5leHBpcnkJPSBleHBpcnk7CisJaHdpZi0+ZXhwaXJ5ID0gZXhwaXJ5OwogCiAJaWYgKChkbWFfc3RhdCAmIDUpID09IDEpIHsJLyogRE1BIGFjdGl2ZSBhbmQgbm8gaW50ZXJydXB0ICovCiAJCXVuc2lnbmVkIGxvbmcgc2NfYmFzZQk9IGh3aWYtPmNvbmZpZ19kYXRhOwpAQCAtMTEwLDExICsxMDksMTAgQEAKIAogc3RhdGljIHZvaWQgdGM4NmMwMDFfZG1hX3N0YXJ0KGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQlpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7Ci0JaWRlX2h3Z3JvdXBfdCAqaHdncm91cAk9IEhXR1JPVVAoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAl1bnNpZ25lZCBsb25nIHNjX2Jhc2UJPSBod2lmLT5jb25maWdfZGF0YTsKIAl1bnNpZ25lZCBsb25nIHR3Y3JfcG9ydAk9IHNjX2Jhc2UgKyAoZHJpdmUtPmRuID8gMHgwNiA6IDB4MDQpOwotCXVuc2lnbmVkIGxvbmcgbnNlY3RvcnMJPSBod2dyb3VwLT5ycS0+bnJfc2VjdG9yczsKKwl1bnNpZ25lZCBsb25nIG5zZWN0b3JzCT0gaHdpZi0+cnEtPm5yX3NlY3RvcnM7CiAKIAkvKgogCSAqIFdlIGhhdmUgdG8gbWFudWFsbHkgbG9hZCB0aGUgc2VjdG9yIGNvdW50IGFuZCBzaXplIGludG8KQEAgLTEyNSw4ICsxMjMsOCBAQAogCW91dHcoU0VDVE9SX1NJWkUgLyAyLCB0d2NyX3BvcnQpOyAvKiBUcmFuc2ZlciBXb3JkIENvdW50IDEvMiAqLwogCiAJLyogSW5zdGFsbCBvdXIgdGltZW91dCBleHBpcnkgaG9vaywgc2F2aW5nIHRoZSBjdXJyZW50IGhhbmRsZXIuLi4gKi8KLQlpZGVfc2V0X2h3aWZkYXRhKGh3aWYsIGh3Z3JvdXAtPmV4cGlyeSk7Ci0JaHdncm91cC0+ZXhwaXJ5ID0gJnRjODZjMDAxX3RpbWVyX2V4cGlyeTsKKwlpZGVfc2V0X2h3aWZkYXRhKGh3aWYsIGh3aWYtPmV4cGlyeSk7CisJaHdpZi0+ZXhwaXJ5ID0gJnRjODZjMDAxX3RpbWVyX2V4cGlyeTsKIAogCWlkZV9kbWFfc3RhcnQoZHJpdmUpOwogfQpAQCAtMTkwLDYgKzE4OCw3IEBACiAJLmRtYV90ZXN0X2lycQkJPSBpZGVfZG1hX3Rlc3RfaXJxLAogCS5kbWFfbG9zdF9pcnEJCT0gaWRlX2RtYV9sb3N0X2lycSwKIAkuZG1hX3RpbWVvdXQJCT0gaWRlX2RtYV90aW1lb3V0LAorCS5kbWFfc2ZmX3JlYWRfc3RhdHVzCT0gaWRlX2RtYV9zZmZfcmVhZF9zdGF0dXMsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlkZV9wb3J0X2luZm8gdGM4NmMwMDFfY2hpcHNldCBfX2RldmluaXRkYXRhID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvdHJpZmxleC5jIGIvZHJpdmVycy9pZGUvdHJpZmxleC5jCmluZGV4IGI2ZmY0MDMuLjg3NzNjM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3RyaWZsZXguYworKysgYi9kcml2ZXJzL2lkZS90cmlmbGV4LmMKQEAgLTM2LDcgKzM2LDcgQEAKIAogc3RhdGljIHZvaWQgdHJpZmxleF9zZXRfbW9kZShpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IHU4IHNwZWVkKQogewotCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IHRvX3BjaV9kZXYoaHdpZi0+ZGV2KTsKIAl1MzIgdHJpZmxleF90aW1pbmdzID0gMDsKIAl1MTYgdGltaW5nID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3RybTI5MC5jIGIvZHJpdmVycy9pZGUvdHJtMjkwLmMKaW5kZXggMmE1ZWE5MC4uYjZhMTI4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvdHJtMjkwLmMKKysrIGIvZHJpdmVycy9pZGUvdHJtMjkwLmMKQEAgLTE0NCw3ICsxNDQsNyBAQAogCiBzdGF0aWMgdm9pZCB0cm0yOTBfcHJlcGFyZV9kcml2ZSAoaWRlX2RyaXZlX3QgKmRyaXZlLCB1bnNpZ25lZCBpbnQgdXNlX2RtYSkKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gSFdJRihkcml2ZSk7CisJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOwogCXUxNiByZWcgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTE4NCw3ICsxODQsNyBAQAogc3RhdGljIGludCB0cm0yOTBfZG1hX3NldHVwKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+aHdncm91cC0+cnE7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gaHdpZi0+cnE7CiAJdW5zaWduZWQgaW50IGNvdW50LCBydzsKIAogCWlmIChycV9kYXRhX2RpcihycSkpIHsKQEAgLTIyMiwxNSArMjIyLDE1IEBACiAJZHJpdmUtPndhaXRpbmdfZm9yX2RtYSA9IDA7CiAJLyogcHVyZ2UgRE1BIG1hcHBpbmdzICovCiAJaWRlX2Rlc3Ryb3lfZG1hdGFibGUoZHJpdmUpOwotCXN0YXR1cyA9IGludyhIV0lGKGRyaXZlKS0+ZG1hX2Jhc2UgKyAyKTsKKwlzdGF0dXMgPSBpbncoZHJpdmUtPmh3aWYtPmRtYV9iYXNlICsgMik7CisKIAlyZXR1cm4gc3RhdHVzICE9IDB4MDBmZjsKIH0KIAogc3RhdGljIGludCB0cm0yOTBfZG1hX3Rlc3RfaXJxKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKLQl1MTYgc3RhdHVzOworCXUxNiBzdGF0dXMgPSBpbncoZHJpdmUtPmh3aWYtPmRtYV9iYXNlICsgMik7CiAKLQlzdGF0dXMgPSBpbncoSFdJRihkcml2ZSktPmRtYV9iYXNlICsgMik7CiAJcmV0dXJuIHN0YXR1cyA9PSAweDAwZmY7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3R4NDkzOWlkZS5jIGIvZHJpdmVycy9pZGUvdHg0OTM5aWRlLmMKaW5kZXggNGE4YzVhMi4uODgyZjZmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvdHg0OTM5aWRlLmMKKysrIGIvZHJpdmVycy9pZGUvdHg0OTM5aWRlLmMKQEAgLTI5Myw3ICsyOTMsNyBAQAogewogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAl2b2lkIF9faW9tZW0gKmJhc2UgPSBUWDQ5MzlJREVfQkFTRShod2lmKTsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5od2dyb3VwLT5ycTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5ycTsKIAl1OCByZWFkaW5nOwogCWludCBuZW50OwogCkBAIC0zOTcsNiArMzk3LDE3IEBACiAJcmV0dXJuIGZvdW5kOwogfQogCisjaWZkZWYgX19CSUdfRU5ESUFOCitzdGF0aWMgdTggdHg0OTM5aWRlX2RtYV9zZmZfcmVhZF9zdGF0dXMoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSBUWDQ5MzlJREVfQkFTRShod2lmKTsKKworCXJldHVybiB0eDQ5MzlpZGVfcmVhZGIoYmFzZSwgVFg0OTM5SURFX0RNQV9TdGF0KTsKK30KKyNlbHNlCisjZGVmaW5lIHR4NDkzOWlkZV9kbWFfc2ZmX3JlYWRfc3RhdHVzIGlkZV9kbWFfc2ZmX3JlYWRfc3RhdHVzCisjZW5kaWYKKwogc3RhdGljIHZvaWQgdHg0OTM5aWRlX2luaXRfaHdpZihpZGVfaHdpZl90ICpod2lmKQogewogCXZvaWQgX19pb21lbSAqYmFzZSA9IFRYNDkzOUlERV9CQVNFKGh3aWYpOwpAQCAtNDQzLDEzICs0NTQsNiBAQAogCiAjaWZkZWYgX19CSUdfRU5ESUFOCiAKLXN0YXRpYyB1OCB0eDQ5MzlpZGVfcmVhZF9zZmZfZG1hX3N0YXR1cyhpZGVfaHdpZl90ICpod2lmKQotewotCXZvaWQgX19pb21lbSAqYmFzZSA9IFRYNDkzOUlERV9CQVNFKGh3aWYpOwotCi0JcmV0dXJuIHR4NDkzOWlkZV9yZWFkYihiYXNlLCBUWDQ5MzlJREVfRE1BX1N0YXQpOwotfQotCiAvKiBjdXN0b20gaW9wcyAoaW5kZXBlbmRlbnQgZnJvbSBTV0FQX0lPX1NQQUNFKSAqLwogc3RhdGljIHU4IHR4NDkzOWlkZV9pbmIodW5zaWduZWQgbG9uZyBwb3J0KQogewpAQCAtNTg1LDcgKzU4OSw2IEBACiAJLmV4ZWNfY29tbWFuZAkJPSBpZGVfZXhlY19jb21tYW5kLAogCS5yZWFkX3N0YXR1cwkJPSBpZGVfcmVhZF9zdGF0dXMsCiAJLnJlYWRfYWx0c3RhdHVzCQk9IGlkZV9yZWFkX2FsdHN0YXR1cywKLQkucmVhZF9zZmZfZG1hX3N0YXR1cwk9IHR4NDkzOWlkZV9yZWFkX3NmZl9kbWFfc3RhdHVzLAogCiAJLnNldF9pcnEJCT0gaWRlX3NldF9pcnEsCiAKQEAgLTYwOSw3ICs2MTIsNiBAQAogCS5leGVjX2NvbW1hbmQJCT0gaWRlX2V4ZWNfY29tbWFuZCwKIAkucmVhZF9zdGF0dXMJCT0gaWRlX3JlYWRfc3RhdHVzLAogCS5yZWFkX2FsdHN0YXR1cwkJPSBpZGVfcmVhZF9hbHRzdGF0dXMsCi0JLnJlYWRfc2ZmX2RtYV9zdGF0dXMJPSBpZGVfcmVhZF9zZmZfZG1hX3N0YXR1cywKIAogCS5zZXRfaXJxCQk9IGlkZV9zZXRfaXJxLAogCkBAIC02MzgsNiArNjQwLDcgQEAKIAkuZG1hX3Rlc3RfaXJxCQk9IHR4NDkzOWlkZV9kbWFfdGVzdF9pcnEsCiAJLmRtYV9sb3N0X2lycQkJPSBpZGVfZG1hX2xvc3RfaXJxLAogCS5kbWFfdGltZW91dAkJPSBpZGVfZG1hX3RpbWVvdXQsCisJLmRtYV9zZmZfcmVhZF9zdGF0dXMJPSB0eDQ5MzlpZGVfZG1hX3NmZl9yZWFkX3N0YXR1cywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWRlX3BvcnRfaW5mbyB0eDQ5MzlpZGVfcG9ydF9pbmZvIF9faW5pdGRhdGEgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS91bWM4NjcyLmMgYi9kcml2ZXJzL2lkZS91bWM4NjcyLmMKaW5kZXggZTI5OTc4Yy4uMDYwOGQ0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvdW1jODY3Mi5jCisrKyBiL2RyaXZlcnMvaWRlL3VtYzg2NzIuYwpAQCAtMTA2LDIyICsxMDYsMjEgQEAKIAogc3RhdGljIHZvaWQgdW1jX3NldF9waW9fbW9kZShpZGVfZHJpdmVfdCAqZHJpdmUsIGNvbnN0IHU4IHBpbykKIHsKLQlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7Ci0JaWRlX2h3Z3JvdXBfdCAqbWF0ZV9od2dyb3VwID0gaHdpZi0+bWF0ZSA/IGh3aWYtPm1hdGUtPmh3Z3JvdXAgOiBOVUxMOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZiwgKm1hdGUgPSBod2lmLT5tYXRlOwogCXVuc2lnbmVkIGxvbmcgdW5pbml0aWFsaXplZF92YXIoZmxhZ3MpOwogCiAJcHJpbnRrKCIlczogc2V0dGluZyB1bWM4NjcyIHRvIFBJTyBtb2RlJWQgKHNwZWVkICVkKVxuIiwKIAkJZHJpdmUtPm5hbWUsIHBpbywgcGlvX3RvX3VtY1twaW9dKTsKLQlpZiAobWF0ZV9od2dyb3VwKQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmbWF0ZV9od2dyb3VwLT5sb2NrLCBmbGFncyk7Ci0JaWYgKG1hdGVfaHdncm91cCAmJiBtYXRlX2h3Z3JvdXAtPmhhbmRsZXIpIHsKKwlpZiAobWF0ZSkKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm1hdGUtPmxvY2ssIGZsYWdzKTsKKwlpZiAobWF0ZSAmJiBtYXRlLT5oYW5kbGVyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAidW1jODY3Mjogb3RoZXIgaW50ZXJmYWNlIGlzIGJ1c3k6IGV4aXRpbmcgdHVuZV91bWMoKVxuIik7CiAJfSBlbHNlIHsKIAkJY3VycmVudF9zcGVlZHNbZHJpdmUtPm5hbWVbMl0gLSAnYSddID0gcGlvX3RvX3VtY1twaW9dOwogCQl1bWNfc2V0X3NwZWVkcyhjdXJyZW50X3NwZWVkcyk7CiAJfQotCWlmIChtYXRlX2h3Z3JvdXApCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hdGVfaHdncm91cC0+bG9jaywgZmxhZ3MpOworCWlmIChtYXRlKQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYXRlLT5sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWRlX3BvcnRfb3BzIHVtYzg2NzJfcG9ydF9vcHMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS92aWE4MmN4eHguYyBiL2RyaXZlcnMvaWRlL3ZpYTgyY3h4eC5jCmluZGV4IDJhODEyZDMuLmZlY2MwZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3ZpYTgyY3h4eC5jCisrKyBiL2RyaXZlcnMvaWRlL3ZpYTgyY3h4eC5jCkBAIC0xNzgsNyArMTc4LDcgQEAKIAkJaWRlX3RpbWluZ19tZXJnZSgmcCwgJnQsICZ0LCBJREVfVElNSU5HXzhCSVQpOwogCX0KIAotCXZpYV9zZXRfc3BlZWQoSFdJRihkcml2ZSksIGRyaXZlLT5kbiwgJnQpOworCXZpYV9zZXRfc3BlZWQoaHdpZiwgZHJpdmUtPmRuLCAmdCk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGxlL2k3MzAwX2lkbGUuYyBiL2RyaXZlcnMvaWRsZS9pNzMwMF9pZGxlLmMKaW5kZXggZmIxNzZmNi4uMTdlOGRkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGxlL2k3MzAwX2lkbGUuYworKysgYi9kcml2ZXJzL2lkbGUvaTczMDBfaWRsZS5jCkBAIC0xNzcsNyArMTc3LDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBkZXZpY2UgZHVtbXlfZG1hX2RldiA9IHsKLQkuYnVzX2lkID0gImZhbGxiYWNrIGRldmljZSIsCisJLmluaXRfbmFtZSA9ICJmYWxsYmFjayBkZXZpY2UiLAogCS5jb2hlcmVudF9kbWFfbWFzayA9IERNQV82NEJJVF9NQVNLLAogCS5kbWFfbWFzayA9ICZkdW1teV9kbWFfZGV2LmNvaGVyZW50X2RtYV9tYXNrLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvY3NyLmMgYi9kcml2ZXJzL2llZWUxMzk0L2Nzci5jCmluZGV4IGM5MGJlNDAuLjMxNDAwYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvY3NyLmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9jc3IuYwpAQCAtNjgsMjIgKzY4LDIyIEBACiAJLmhvc3RfcmVzZXQgPQlob3N0X3Jlc2V0LAogfTsKIAotc3RhdGljIHN0cnVjdCBocHNiX2FkZHJlc3Nfb3BzIG1hcF9vcHMgPSB7Citjb25zdCBzdGF0aWMgc3RydWN0IGhwc2JfYWRkcmVzc19vcHMgbWFwX29wcyA9IHsKIAkucmVhZCA9IHJlYWRfbWFwcywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyBmY3Bfb3BzID0geworY29uc3Qgc3RhdGljIHN0cnVjdCBocHNiX2FkZHJlc3Nfb3BzIGZjcF9vcHMgPSB7CiAJLndyaXRlID0gd3JpdGVfZmNwLAogfTsKIAotc3RhdGljIHN0cnVjdCBocHNiX2FkZHJlc3Nfb3BzIHJlZ19vcHMgPSB7Citjb25zdCBzdGF0aWMgc3RydWN0IGhwc2JfYWRkcmVzc19vcHMgcmVnX29wcyA9IHsKIAkucmVhZCA9IHJlYWRfcmVncywKIAkud3JpdGUgPSB3cml0ZV9yZWdzLAogCS5sb2NrID0gbG9ja19yZWdzLAogCS5sb2NrNjQgPSBsb2NrNjRfcmVncywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyBjb25maWdfcm9tX29wcyA9IHsKK2NvbnN0IHN0YXRpYyBzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyBjb25maWdfcm9tX29wcyA9IHsKIAkucmVhZCA9IHJlYWRfY29uZmlnX3JvbSwKIH07CiAKQEAgLTIxNyw3ICsyMTcsNyBAQAogCiAJaG9zdC0+Y3NyLmdlbmVyYXRpb24gPSAyOwogCi0JYnVzX2luZm9bMV0gPSBfX2NvbnN0YW50X2NwdV90b19iZTMyKDB4MzEzMzM5MzQpOworCWJ1c19pbmZvWzFdID0gSUVFRTEzOTRfQlVTSURfTUFHSUM7CiAJYnVzX2luZm9bMl0gPSBjcHVfdG9fYmUzMigoaHBzYl9kaXNhYmxlX2lybSA/IDAgOiAxIDw8IENTUl9JUk1DX1NISUZUKSB8CiAJCQkJICAoMSA8PCBDU1JfQ01DX1NISUZUKSB8CiAJCQkJICAoMSA8PCBDU1JfSVNDX1NISUZUKSB8CkBAIC0yNTAsNyArMjUwLDcgQEAKIHsKIAlxdWFkbGV0X3QgYnVzX2luZm9bQ1NSX0JVU19JTkZPX1NJWkVdOwogCi0JYnVzX2luZm9bMV0gPSBfX2NvbnN0YW50X2NwdV90b19iZTMyKDB4MzEzMzM5MzQpOworCWJ1c19pbmZvWzFdID0gSUVFRTEzOTRfQlVTSURfTUFHSUM7CiAJYnVzX2luZm9bMl0gPSBjcHVfdG9fYmUzMigoMCA8PCBDU1JfSVJNQ19TSElGVCkgfAogCQkJCSAgKDAgPDwgQ1NSX0NNQ19TSElGVCkgfAogCQkJCSAgKDAgPDwgQ1NSX0lTQ19TSElGVCkgfApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9jc3IuaCBiL2RyaXZlcnMvaWVlZTEzOTQvY3NyLmgKaW5kZXggZjExNTQ2NS4uOTBmYjNmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9jc3IuaAorKysgYi9kcml2ZXJzL2llZWUxMzk0L2Nzci5oCkBAIC01MCwxMSArNTAsMTEgQEAKICNkZWZpbmUgQ1NSX01BWF9ST01fU0hJRlQJCTgKICNkZWZpbmUgQ1NSX0dFTkVSQVRJT05fU0hJRlQJCTQKIAotI2RlZmluZSBDU1JfU0VUX0JVU19JTkZPX0dFTkVSQVRJT04oY3NyLCBnZW4pCQkJCVwKLQkoKGNzciktPmJ1c19pbmZvX2RhdGFbMl0gPQkJCQkJXAotCQljcHVfdG9fYmUzMigoYmUzMl90b19jcHUoKGNzciktPmJ1c19pbmZvX2RhdGFbMl0pICYJXAotCQkJICAgICB+KDB4ZiA8PCBDU1JfR0VORVJBVElPTl9TSElGVCkpIHwJCVwKLQkJCSAgICAoZ2VuKSA8PCBDU1JfR0VORVJBVElPTl9TSElGVCkpCitzdGF0aWMgaW5saW5lIHZvaWQgY3NyX3NldF9idXNfaW5mb19nZW5lcmF0aW9uKHN0cnVjdCBjc3IxMjEyX2NzciAqY3NyLCB1OCBnZW4pCit7CisJY3NyLT5idXNfaW5mb19kYXRhWzJdICY9IH5jcHVfdG9fYmUzMigweGYgPDwgQ1NSX0dFTkVSQVRJT05fU0hJRlQpOworCWNzci0+YnVzX2luZm9fZGF0YVsyXSB8PSBjcHVfdG9fYmUzMigodTMyKWdlbiA8PCBDU1JfR0VORVJBVElPTl9TSElGVCk7Cit9CiAKIHN0cnVjdCBjc3JfY29udHJvbCB7CiAJc3BpbmxvY2tfdCBsb2NrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9jc3IxMjEyLmMgYi9kcml2ZXJzL2llZWUxMzk0L2NzcjEyMTIuYwppbmRleCA1ZTM4YTY4Li5hNmRmZWIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L2NzcjEyMTIuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L2NzcjEyMTIuYwpAQCAtMTA3NywxNSArMTA3NywxMCBAQAogCWludCBpOwogCWludCByZXQ7CiAKLQkvKiBJRUVFIDEyMTIgc2F5cyB0aGF0IHRoZSBlbnRpcmUgYnVzIGluZm8gYmxvY2sgc2hvdWxkIGJlIHJlYWRhYmxlIGluCi0JICogYSBzaW5nbGUgdHJhbnNhY3Rpb24gcmVnYXJkbGVzcyBvZiB0aGUgbWF4X3JvbSB2YWx1ZS4KLQkgKiBVbmZvcnR1bmF0ZWx5LCBtYW55IElFRUUgMTM5NCBkZXZpY2VzIGRvIG5vdCBhYmlkZSBieSB0aGF0LCBzbyB0aGUKLQkgKiBidXMgaW5mbyBibG9jayB3aWxsIGJlIHJlYWQgMSBxdWFkbGV0IGF0IGEgdGltZS4gIFRoZSByZXN0IG9mIHRoZQotCSAqIENvbmZpZ1JPTSB3aWxsIGJlIHJlYWQgYWNjb3JkaW5nIHRvIHRoZSBtYXhfcm9tIGZpZWxkLiAqLwogCWZvciAoaSA9IDA7IGkgPCBjc3ItPmJ1c19pbmZvX2xlbjsgaSArPSBzaXplb2YodTMyKSkgewogCQlyZXQgPSBjc3ItPm9wcy0+YnVzX3JlYWQoY3NyLCBDU1IxMjEyX0NPTkZJR19ST01fU1BBQ0VfQkFTRSArIGksCi0JCQlzaXplb2YodTMyKSwgJmNzci0+Y2FjaGVfaGVhZC0+ZGF0YVtieXRlc190b19xdWFkcyhpKV0sCi0JCQljc3ItPnByaXZhdGUpOworCQkJCSZjc3ItPmNhY2hlX2hlYWQtPmRhdGFbYnl0ZXNfdG9fcXVhZHMoaSldLAorCQkJCWNzci0+cHJpdmF0ZSk7CiAJCWlmIChyZXQgIT0gQ1NSMTIxMl9TVUNDRVNTKQogCQkJcmV0dXJuIHJldDsKIApAQCAtMTEwNCw4ICsxMDk5LDggQEAKIAkgKiBhIHRpbWUuICovCiAJZm9yIChpID0gY3NyLT5idXNfaW5mb19sZW47IGkgPD0gY3NyLT5jcmNfbGVuOyBpICs9IHNpemVvZih1MzIpKSB7CiAJCXJldCA9IGNzci0+b3BzLT5idXNfcmVhZChjc3IsIENTUjEyMTJfQ09ORklHX1JPTV9TUEFDRV9CQVNFICsgaSwKLQkJCXNpemVvZih1MzIpLCAmY3NyLT5jYWNoZV9oZWFkLT5kYXRhW2J5dGVzX3RvX3F1YWRzKGkpXSwKLQkJCWNzci0+cHJpdmF0ZSk7CisJCQkJJmNzci0+Y2FjaGVfaGVhZC0+ZGF0YVtieXRlc190b19xdWFkcyhpKV0sCisJCQkJY3NyLT5wcml2YXRlKTsKIAkJaWYgKHJldCAhPSBDU1IxMjEyX1NVQ0NFU1MpCiAJCQlyZXR1cm4gcmV0OwogCX0KQEAgLTEyODksNyArMTI4NCw3IEBACiAKIAkJaWYgKGNzci0+b3BzLT5idXNfcmVhZChjc3IsCiAJCQkJICAgICAgIENTUjEyMTJfUkVHSVNURVJfU1BBQ0VfQkFTRSArIGt2LT5vZmZzZXQsCi0JCQkJICAgICAgIHNpemVvZih1MzIpLCAmcSwgY3NyLT5wcml2YXRlKSkKKwkJCQkgICAgICAgJnEsIGNzci0+cHJpdmF0ZSkpCiAJCQlyZXR1cm4gLUVJTzsKIAogCQlrdi0+dmFsdWUubGVhZi5sZW4gPSBiZTMyX3RvX2NwdShxKSA+PiAxNjsKQEAgLTEzNzIsMTcgKzEzNjcsOCBAQAogCQlhZGRyID0gKENTUjEyMTJfQ1NSX0FSQ0hfUkVHX1NQQUNFX0JBU0UgKyBjYWNoZS0+b2Zmc2V0ICsKIAkJCWNyLT5vZmZzZXRfZW5kKSAmIH4oY3NyLT5tYXhfcm9tIC0gMSk7CiAKLQkJaWYgKGNzci0+b3BzLT5idXNfcmVhZChjc3IsIGFkZHIsIGNzci0+bWF4X3JvbSwgY2FjaGVfcHRyLAotCQkJCSAgICAgICBjc3ItPnByaXZhdGUpKSB7Ci0JCQlpZiAoY3NyLT5tYXhfcm9tID09IDQpCi0JCQkJLyogV2UndmUgZ290IHByb2JsZW1zISAqLwotCQkJCXJldHVybiAtRUlPOwotCi0JCQkvKiBBcHBlcmVudGx5IHRoZSBtYXhfcm9tIHZhbHVlIHdhcyBhIGxpZSwgc2V0IGl0IHRvCi0JCQkgKiBkbyBxdWFkbGV0IHJlYWRzIGFuZCB0cnkgYWdhaW4uICovCi0JCQljc3ItPm1heF9yb20gPSA0OwotCQkJY29udGludWU7Ci0JCX0KKwkJaWYgKGNzci0+b3BzLT5idXNfcmVhZChjc3IsIGFkZHIsIGNhY2hlX3B0ciwgY3NyLT5wcml2YXRlKSkKKwkJCXJldHVybiAtRUlPOwogCiAJCWNyLT5vZmZzZXRfZW5kICs9IGNzci0+bWF4X3JvbSAtIChjci0+b2Zmc2V0X2VuZCAmCiAJCQkJCQkgIChjc3ItPm1heF9yb20gLSAxKSk7CkBAIC0xNDMzLDcgKzE0MTksNiBAQAogCiBpbnQgY3NyMTIxMl9wYXJzZV9jc3Ioc3RydWN0IGNzcjEyMTJfY3NyICpjc3IpCiB7Ci0Jc3RhdGljIGNvbnN0IGludCBtcl9tYXBbXSA9IHsgNCwgNjQsIDEwMjQsIDAgfTsKIAlzdHJ1Y3QgY3NyMTIxMl9kZW50cnkgKmRlbnRyeTsKIAlpbnQgcmV0OwogCkBAIC0xNDQzLDE1ICsxNDI4LDEzIEBACiAJaWYgKHJldCAhPSBDU1IxMjEyX1NVQ0NFU1MpCiAJCXJldHVybiByZXQ7CiAKLQlpZiAoIWNzci0+b3BzLT5nZXRfbWF4X3JvbSkgewotCQljc3ItPm1heF9yb20gPSBtcl9tYXBbMF07CS8qIGRlZmF1bHQgdmFsdWUgKi8KLQl9IGVsc2UgewotCQlpbnQgaSA9IGNzci0+b3BzLT5nZXRfbWF4X3JvbShjc3ItPmJ1c19pbmZvX2RhdGEsCi0JCQkJCSAgICAgIGNzci0+cHJpdmF0ZSk7Ci0JCWlmIChpICYgfjB4MykKLQkJCXJldHVybiAtRUlOVkFMOwotCQljc3ItPm1heF9yb20gPSBtcl9tYXBbaV07Ci0JfQorCS8qCisJICogVGhlcmUgaGFzIGJlZW4gYSBidWdneSBmaXJtd2FyZSB3aXRoIGJ1c19pbmZvX2Jsb2NrLm1heF9yb20gPiAwCisJICogc3BvdHRlZCB3aGljaCBhY3R1YWxseSBvbmx5IHN1cHBvcnRlZCBxdWFkbGV0IHJlYWQgcmVxdWVzdHMgdG8gdGhlCisJICogY29uZmlnIFJPTS4gIFRoZXJlZm9yZSByZWFkIGV2ZXJ5dGhpbmcgcXVhZGxldCBieSBxdWFkbGV0IHJlZ2FyZGxlc3MKKwkgKiBvZiB3aGF0IHRoZSBidXMgaW5mbyBibG9jayBzYXlzLgorCSAqLworCWNzci0+bWF4X3JvbSA9IDQ7CiAKIAljc3ItPmNhY2hlX2hlYWQtPmxheW91dF9oZWFkID0gY3NyLT5yb290X2t2OwogCWNzci0+Y2FjaGVfaGVhZC0+bGF5b3V0X3RhaWwgPSBjc3ItPnJvb3Rfa3Y7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2NzcjEyMTIuaCBiL2RyaXZlcnMvaWVlZTEzOTQvY3NyMTIxMi5oCmluZGV4IDA0MzAzOWYuLmE4OTJkOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvY3NyMTIxMi5oCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvY3NyMTIxMi5oCkBAIC0xODEsNyArMTgxLDcgQEAKIHN0cnVjdCBjc3IxMjEyX2NzciB7CiAJc2l6ZV90IGJ1c19pbmZvX2xlbjsJLyogYnVzIGluZm8gYmxvY2sgbGVuZ3RoIGluIGJ5dGVzICovCiAJc2l6ZV90IGNyY19sZW47CQkvKiBjcmMgbGVuZ3RoIGluIGJ5dGVzICovCi0JdTMyICpidXNfaW5mb19kYXRhOwkvKiBidXMgaW5mbyBkYXRhIGluY2wgYnVzIG5hbWUgYW5kIEVVSSAqLworCV9fYmUzMiAqYnVzX2luZm9fZGF0YTsJLyogYnVzIGluZm8gZGF0YSBpbmNsIGJ1cyBuYW1lIGFuZCBFVUkgKi8KIAogCXZvaWQgKnByaXZhdGU7CQkvKiBwcml2YXRlLCBidXMgc3BlY2lmaWMgZGF0YSAqLwogCXN0cnVjdCBjc3IxMjEyX2J1c19vcHMgKm9wczsKQEAgLTIwMCw3ICsyMDAsNyBAQAogCSAqIGVudHJpZXMgbG9jYXRlZCBpbiB0aGUgVW5pdHMgU3BhY2UuICBNdXN0IHJldHVybiAwIG9uIHN1Y2Nlc3MKIAkgKiBhbnl0aGluZyBlbHNlIGluZGljYXRlcyBhbiBlcnJvci4gKi8KIAlpbnQgKCpidXNfcmVhZCkgKHN0cnVjdCBjc3IxMjEyX2NzciAqY3NyLCB1NjQgYWRkciwKLQkJCSB1MTYgbGVuZ3RoLCB2b2lkICpidWZmZXIsIHZvaWQgKnByaXZhdGUpOworCQkJIHZvaWQgKmJ1ZmZlciwgdm9pZCAqcHJpdmF0ZSk7CiAKIAkvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgY3NyMTIxMiB0byBhbGxvY2F0ZSBhIHJlZ2lvbiBpbiB1bml0cyBzcGFjZQogCSAqIGluIHRoZSBldmVudCB0aGF0IENvbmZpZyBST00gZW50cmllcyBkb24ndCBhbGwgZml0IGluIHRoZSBwcmVkZWZpbmVkCkBAIC0yMTEsMTEgKzIxMSw2IEBACiAJLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IGNzcjEyMTIgdG8gcmVsZWFzZSBhIHJlZ2lvbiBpbiB1bml0cyBzcGFjZQogCSAqIHRoYXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4gKi8KIAl2b2lkICgqcmVsZWFzZV9hZGRyKSAodTY0IGFkZHIsIHZvaWQgKnByaXZhdGUpOwotCi0JLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IGNzcjEyMTIgdG8gZGV0ZXJtaW5lIHRoZSBtYXggcmVhZCByZXF1ZXN0Ci0JICogc3VwcG9ydGVkIGJ5IGEgcmVtb3RlIG5vZGUgd2hlbiByZWFkaW5nIHRoZSBDb25maWdST00gc3BhY2UuICBNdXN0Ci0JICogcmV0dXJuIDAsIDEsIG9yIDIgcGVyIElFRUUgMTIxMi4gICovCi0JaW50ICgqZ2V0X21heF9yb20pICh1MzIgKmJ1c19pbmZvLCB2b2lkICpwcml2YXRlKTsKIH07CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9kdjEzOTQtcHJpdmF0ZS5oIGIvZHJpdmVycy9pZWVlMTM5NC9kdjEzOTQtcHJpdmF0ZS5oCmluZGV4IDdkMWQyODQuLjE4YjkyY2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvZHYxMzk0LXByaXZhdGUuaAorKysgYi9kcml2ZXJzL2llZWUxMzk0L2R2MTM5NC1wcml2YXRlLmgKQEAgLTc3LDExICs3NywxMSBAQAogICAgU2VlIHRoZSBUZXhhcyBJbnN0cnVtZW50cyBPSENJIDEzOTQgY2hpcHNldCBkb2N1bWVudGF0aW9uLgogKi8KIAotc3RydWN0IG91dHB1dF9tb3JlX2ltbWVkaWF0ZSB7IHUzMiBxWzhdOyB9Owotc3RydWN0IG91dHB1dF9tb3JlIHsgdTMyIHFbNF07IH07Ci1zdHJ1Y3Qgb3V0cHV0X2xhc3QgeyB1MzIgcVs0XTsgfTsKLXN0cnVjdCBpbnB1dF9tb3JlIHsgdTMyIHFbNF07IH07Ci1zdHJ1Y3QgaW5wdXRfbGFzdCB7IHUzMiBxWzRdOyB9Oworc3RydWN0IG91dHB1dF9tb3JlX2ltbWVkaWF0ZSB7IF9fbGUzMiBxWzhdOyB9Oworc3RydWN0IG91dHB1dF9tb3JlIHsgX19sZTMyIHFbNF07IH07CitzdHJ1Y3Qgb3V0cHV0X2xhc3QgeyBfX2xlMzIgcVs0XTsgfTsKK3N0cnVjdCBpbnB1dF9tb3JlIHsgX19sZTMyIHFbNF07IH07CitzdHJ1Y3QgaW5wdXRfbGFzdCB7IF9fbGUzMiBxWzRdOyB9OwogCiAvKiBvdXRwdXRzICovCiAKQEAgLTkyLDkgKzkyLDkgQEAKIAkJCQkJICAgICAgdW5zaWduZWQgaW50ICBwYXlsb2FkX3NpemUpCiB7CiAJb21pLT5xWzBdID0gY3B1X3RvX2xlMzIoMHgwMjAwMDAwMCB8IDgpOyAvKiBPVVRQVVRfTU9SRV9JTU1FRElBVEU7IDggaXMgdGhlIHNpemUgb2YgdGhlIElUIGhlYWRlciAqLwotCW9taS0+cVsxXSA9IDA7Ci0Jb21pLT5xWzJdID0gMDsKLQlvbWktPnFbM10gPSAwOworCW9taS0+cVsxXSA9IGNwdV90b19sZTMyKDApOworCW9taS0+cVsyXSA9IGNwdV90b19sZTMyKDApOworCW9taS0+cVszXSA9IGNwdV90b19sZTMyKDApOwogCiAJLyogSVQgcGFja2V0IGhlYWRlciAqLwogCW9taS0+cVs0XSA9IGNwdV90b19sZTMyKCAgKDB4MCA8PCAxNikgIC8qIElFRUUxMzk0X1NQRUVEXzEwMCAqLwpAQCAtMTA2LDggKzEwNiw4IEBACiAJLyogcmVzZXJ2ZWQgZmllbGQ7IG1pbWljIGJlaGF2aW9yIG9mIG15IFNvbnkgRFNSLTQwICovCiAJb21pLT5xWzVdID0gY3B1X3RvX2xlMzIoKHBheWxvYWRfc2l6ZSA8PCAxNikgfCAoMHg3RiA8PCA4KSB8IDB4QTApOwogCi0Jb21pLT5xWzZdID0gMDsKLQlvbWktPnFbN10gPSAwOworCW9taS0+cVs2XSA9IGNwdV90b19sZTMyKDApOworCW9taS0+cVs3XSA9IGNwdV90b19sZTMyKDApOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZmlsbF9vdXRwdXRfbW9yZShzdHJ1Y3Qgb3V0cHV0X21vcmUgKm9tLApAQCAtMTE2LDggKzExNiw4IEBACiB7CiAJb20tPnFbMF0gPSBjcHVfdG9fbGUzMihkYXRhX3NpemUpOwogCW9tLT5xWzFdID0gY3B1X3RvX2xlMzIoZGF0YV9waHlzX2FkZHIpOwotCW9tLT5xWzJdID0gMDsKLQlvbS0+cVszXSA9IDA7CisJb20tPnFbMl0gPSBjcHVfdG9fbGUzMigwKTsKKwlvbS0+cVszXSA9IGNwdV90b19sZTMyKDApOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZmlsbF9vdXRwdXRfbGFzdChzdHJ1Y3Qgb3V0cHV0X2xhc3QgKm9sLApAQCAtMTQwLDggKzE0MCw4IEBACiAKIAlvbC0+cVswXSA9IGNwdV90b19sZTMyKHRlbXApOwogCW9sLT5xWzFdID0gY3B1X3RvX2xlMzIoZGF0YV9waHlzX2FkZHIpOwotCW9sLT5xWzJdID0gMDsKLQlvbC0+cVszXSA9IDA7CisJb2wtPnFbMl0gPSBjcHVfdG9fbGUzMigwKTsKKwlvbC0+cVszXSA9IGNwdV90b19sZTMyKDApOwogfQogCiAvKiBpbnB1dHMgKi8KQEAgLTE2MSw4ICsxNjEsOCBAQAogCiAJaW0tPnFbMF0gPSBjcHVfdG9fbGUzMih0ZW1wKTsKIAlpbS0+cVsxXSA9IGNwdV90b19sZTMyKGRhdGFfcGh5c19hZGRyKTsKLQlpbS0+cVsyXSA9IDA7IC8qIGJyYW5jaEFkZHJlc3MgYW5kIFogbm90IHVzZSBpbiBwYWNrZXQtcGVyLWJ1ZmZlciBtb2RlICovCi0JaW0tPnFbM10gPSAwOyAvKiB4ZmVyU3RhdHVzICYgcmVzQ291bnQsIHJlc0NvdW50IG11c3QgYmUgaW5pdGlhbGl6ZSB0byBkYXRhX3NpemUgKi8KKwlpbS0+cVsyXSA9IGNwdV90b19sZTMyKDApOyAvKiBicmFuY2hBZGRyZXNzIGFuZCBaIG5vdCB1c2UgaW4gcGFja2V0LXBlci1idWZmZXIgbW9kZSAqLworCWltLT5xWzNdID0gY3B1X3RvX2xlMzIoMCk7IC8qIHhmZXJTdGF0dXMgJiByZXNDb3VudCwgcmVzQ291bnQgbXVzdCBiZSBpbml0aWFsaXplIHRvIGRhdGFfc2l6ZSAqLwogfQogIAogc3RhdGljIGlubGluZSB2b2lkIGZpbGxfaW5wdXRfbGFzdChzdHJ1Y3QgaW5wdXRfbGFzdCAqaWwsCkBAIC0zMzEsNyArMzMxLDcgQEAKIAogCS8qIHBvaW50cyB0byBzdGF0dXMvdGltZXN0YW1wIGZpZWxkIG9mIGZpcnN0IERNQSBwYWNrZXQgKi8KIAkvKiAod2UnbGwgY2hlY2sgaXQgbGF0ZXIgdG8gbW9uaXRvciB0aW1lc3RhbXAgYWNjdXJhY3kpICovCi0JdTMyICpmcmFtZV9iZWdpbl90aW1lc3RhbXA7CisJX19sZTMyICpmcmFtZV9iZWdpbl90aW1lc3RhbXA7CiAKIAkvKiB0aGUgdGltZXN0YW1wIHdlIGFzc2lnbmVkIHRvIHRoZSBmaXJzdCBwYWNrZXQgaW4gdGhlIGZyYW1lICovCiAJdTMyIGFzc2lnbmVkX3RpbWVzdGFtcDsKQEAgLTM0OCwxNSArMzQ4LDE1IEBACiAJICAgdGhhdCBjYW4gY2F1c2UgaW50ZXJydXB0cy4gV2UnbGwgY2hlY2sgdGhlc2UgZnJvbSB0aGUKIAkgICBpbnRlcnJ1cHQgaGFuZGxlci4KIAkqLwotCXUzMiAqbWlkX2ZyYW1lX3RpbWVzdGFtcDsKLQl1MzIgKmZyYW1lX2VuZF90aW1lc3RhbXA7CisJX19sZTMyICptaWRfZnJhbWVfdGltZXN0YW1wOworCV9fbGUzMiAqZnJhbWVfZW5kX3RpbWVzdGFtcDsKIAogCS8qIGJyYW5jaCBhZGRyZXNzIGZpZWxkIG9mIGZpbmFsIHBhY2tldC4gVGhpcyBpcyBlZmZlY3RpdmVseQogCSAgIHRoZSAidGFpbCIgaW4gdGhlIGNoYWluIG9mIERNQSBkZXNjcmlwdG9yIGJsb2Nrcy4KIAkgICBXZSB3aWxsIGZpbGwgaXQgd2l0aCB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgRE1BIGRlc2NyaXB0b3IKIAkgICBibG9jayBpbiB0aGUgc3Vic2VxdWVudCBmcmFtZSwgb25jZSBpdCBpcyByZWFkeS4KIAkqLwotCXUzMiAqZnJhbWVfZW5kX2JyYW5jaDsKKwlfX2xlMzIgKmZyYW1lX2VuZF9icmFuY2g7CiAKIAkvKiB0aGUgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIGluIHRoZSBmaXJzdCBkZXNjcmlwdG9yIGJsb2NrCiAJICAgb2YgdGhlIGZyYW1lLiBOZWVkZWQgdG8gc3RhcnQgRE1BICovCkBAIC0zNjUsMTAgKzM2NSwxMCBAQAogCiAKIHN0cnVjdCBwYWNrZXQgewotCXUxNgl0aW1lc3RhbXA7CisJX19sZTE2CXRpbWVzdGFtcDsKIAl1MTYJaW52YWxpZDsKIAl1MTYJaXNvX2hlYWRlcjsKLQl1MTYJZGF0YV9sZW5ndGg7CisJX19sZTE2CWRhdGFfbGVuZ3RoOwogCXUzMgljaXBfaDE7CiAJdTMyCWNpcF9oMjsKIAl1bnNpZ25lZCBjaGFyIGRhdGFbNDgwXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvZHYxMzk0LmMgYi9kcml2ZXJzL2llZWUxMzk0L2R2MTM5NC5jCmluZGV4IGMxOWYyMzIuLmEzMjllNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvZHYxMzk0LmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9kdjEzOTQuYwpAQCAtMjY1LDcgKzI2NSw3IEBACiAJLyogdGhlc2UgZmxhZ3MgZGVub3RlIHBhY2tldHMgdGhhdCBuZWVkIHNwZWNpYWwgYXR0ZW50aW9uICovCiAJaW50IGVtcHR5X3BhY2tldCwgZmlyc3RfcGFja2V0LCBsYXN0X3BhY2tldCwgbWlkX3BhY2tldDsKIAotCXUzMiAqYnJhbmNoX2FkZHJlc3MsICpsYXN0X2JyYW5jaF9hZGRyZXNzID0gTlVMTDsKKwlfX2xlMzIgKmJyYW5jaF9hZGRyZXNzLCAqbGFzdF9icmFuY2hfYWRkcmVzcyA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBkYXRhX3A7CiAJaW50IGZpcnN0X3BhY2tldF9lbXB0eSA9IDA7CiAJdTMyIGN5Y2xlVGltZXIsIGN0X3NlYywgY3RfY3ljLCBjdF9vZmY7CkBAIC04NDgsNyArODQ4LDcgQEAKIAlkbWFfYWRkcl90IGJsb2NrX2RtYSA9IDA7CiAJc3RydWN0IHBhY2tldCAqZGF0YSA9IE5VTEw7CiAJZG1hX2FkZHJfdCBkYXRhX2RtYSA9IDA7Ci0JdTMyICpsYXN0X2JyYW5jaF9hZGRyZXNzID0gTlVMTDsKKwlfX2xlMzIgKmxhc3RfYnJhbmNoX2FkZHJlc3MgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOwogCWludCB3YW50X2ludGVycnVwdCA9IDA7CiAJc3RydWN0IGZyYW1lICpmID0gTlVMTDsKQEAgLTIxMTAsMTcgKzIxMTAsMTcgQEAKIAkJCWYgPSB2aWRlby0+ZnJhbWVzW25leHRfaSAvIE1BWF9QQUNLRVRTXTsKIAkJCW5leHQgPSAmKGYtPmRlc2NyaXB0b3JfcG9vbFtuZXh0X2kgJSBNQVhfUEFDS0VUU10pOwogCQkJbmV4dF9kbWEgPSAoKHVuc2lnbmVkIGxvbmcpIGJsb2NrIC0gKHVuc2lnbmVkIGxvbmcpIGYtPmRlc2NyaXB0b3JfcG9vbCkgKyBmLT5kZXNjcmlwdG9yX3Bvb2xfZG1hOwotCQkJbmV4dC0+dS5pbi5pbC5xWzBdIHw9IDMgPDwgMjA7IC8qIGVuYWJsZSBpbnRlcnJ1cHQgKi8KLQkJCW5leHQtPnUuaW4uaWwucVsyXSA9IDA7IC8qIGRpc2FibGUgYnJhbmNoICovCisJCQluZXh0LT51LmluLmlsLnFbMF0gfD0gY3B1X3RvX2xlMzIoMyA8PCAyMCk7IC8qIGVuYWJsZSBpbnRlcnJ1cHQgKi8KKwkJCW5leHQtPnUuaW4uaWwucVsyXSA9IGNwdV90b19sZTMyKDApOyAvKiBkaXNhYmxlIGJyYW5jaCAqLwogCiAJCQkvKiBsaW5rIHByZXZpb3VzIHRvIG5leHQgKi8KIAkJCXByZXZfaSA9IChuZXh0X2kgPT0gMCkgPyAoTUFYX1BBQ0tFVFMgKiB2aWRlby0+bl9mcmFtZXMgLSAxKSA6IChuZXh0X2kgLSAxKTsKIAkJCWYgPSB2aWRlby0+ZnJhbWVzW3ByZXZfaSAvIE1BWF9QQUNLRVRTXTsKIAkJCXByZXYgPSAmKGYtPmRlc2NyaXB0b3JfcG9vbFtwcmV2X2kgJSBNQVhfUEFDS0VUU10pOwogCQkJaWYgKHByZXZfaSAlIChNQVhfUEFDS0VUUy8yKSkgewotCQkJCXByZXYtPnUuaW4uaWwucVswXSAmPSB+KDMgPDwgMjApOyAvKiBubyBpbnRlcnJ1cHQgKi8KKwkJCQlwcmV2LT51LmluLmlsLnFbMF0gJj0gfmNwdV90b19sZTMyKDMgPDwgMjApOyAvKiBubyBpbnRlcnJ1cHQgKi8KIAkJCX0gZWxzZSB7Ci0JCQkJcHJldi0+dS5pbi5pbC5xWzBdIHw9IDMgPDwgMjA7IC8qIGVuYWJsZSBpbnRlcnJ1cHQgKi8KKwkJCQlwcmV2LT51LmluLmlsLnFbMF0gfD0gY3B1X3RvX2xlMzIoMyA8PCAyMCk7IC8qIGVuYWJsZSBpbnRlcnJ1cHQgKi8KIAkJCX0KIAkJCXByZXYtPnUuaW4uaWwucVsyXSA9IGNwdV90b19sZTMyKG5leHRfZG1hIHwgMSk7IC8qIHNldCBaPTEgKi8KIAkJCXdtYigpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9ldGgxMzk0LmMgYi9kcml2ZXJzL2llZWUxMzk0L2V0aDEzOTQuYwppbmRleCAyMDEyODY5Li4xYTkxOWRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L2V0aDEzOTQuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L2V0aDEzOTQuYwpAQCAtOTIsNyArOTIsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAl1MTYgZGdsOwogCXUxNiBkZ19zaXplOwotCXUxNiBldGhlcl90eXBlOworCV9fYmUxNiBldGhlcl90eXBlOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJY2hhciAqcGJ1ZjsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGZyYWdfaW5mbzsKQEAgLTE4MSw3ICsxODEsNyBAQAogc3RhdGljIHZvaWQgZXRoZXIxMzk0X2hvc3RfcmVzZXQoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCk7CiAKIC8qIEZ1bmN0aW9uIGZvciBpbmNvbWluZyAxMzk0IHBhY2tldHMgKi8KLXN0YXRpYyBzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyBhZGRyX29wcyA9IHsKK2NvbnN0IHN0YXRpYyBzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyBhZGRyX29wcyA9IHsKIAkud3JpdGUgPQlldGhlcjEzOTRfd3JpdGUsCiB9OwogCkBAIC0yNDUsMTIgKzI0NSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIFJldHVybiBzdGF0aXN0aWNzIHRvIHRoZSBjYWxsZXIgKi8KLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZXRoZXIxMzk0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuICYoKChzdHJ1Y3QgZXRoMTM5NF9wcml2ICopbmV0ZGV2X3ByaXYoZGV2KSktPnN0YXRzKTsKLX0KLQogLyogRklYTUU6IFdoYXQgdG8gZG8gaWYgd2UgdGltZW91dD8gSSB0aGluayBhIGhvc3QgcmVzZXQgaXMgcHJvYmFibHkgaW4gb3JkZXIsCiAgKiBzbyB0aGF0J3Mgd2hhdCB3ZSBkby4gU2hvdWxkIHdlIGluY3JlbWVudCB0aGUgc3RhdCBjb3VudGVycyB0b28/ICAqLwogc3RhdGljIHZvaWQgZXRoZXIxMzk0X3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTUxNiwxNiArNTEwLDE5IEBACiAJLnBhcnNlCQk9IGV0aGVyMTM5NF9oZWFkZXJfcGFyc2UsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGV0aGVyMTM5NF9uZXRkZXZfb3BzID0geworCS5uZG9fb3Blbgk9IGV0aGVyMTM5NF9vcGVuLAorCS5uZG9fc3RvcAk9IGV0aGVyMTM5NF9zdG9wLAorCS5uZG9fc3RhcnRfeG1pdAk9IGV0aGVyMTM5NF90eCwKKwkubmRvX3R4X3RpbWVvdXQJPSBldGhlcjEzOTRfdHhfdGltZW91dCwKKwkubmRvX2NoYW5nZV9tdHUJPSBldGhlcjEzOTRfY2hhbmdlX210dSwKK307CisKIHN0YXRpYyB2b2lkIGV0aGVyMTM5NF9pbml0X2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCWRldi0+b3BlbgkJPSBldGhlcjEzOTRfb3BlbjsKLQlkZXYtPnN0b3AJCT0gZXRoZXIxMzk0X3N0b3A7Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSBldGhlcjEzOTRfdHg7Ci0JZGV2LT5nZXRfc3RhdHMJCT0gZXRoZXIxMzk0X3N0YXRzOwotCWRldi0+dHhfdGltZW91dAkJPSBldGhlcjEzOTRfdHhfdGltZW91dDsKLQlkZXYtPmNoYW5nZV9tdHUJCT0gZXRoZXIxMzk0X2NoYW5nZV9tdHU7CiAKIAlkZXYtPmhlYWRlcl9vcHMJCT0gJmV0aGVyMTM5NF9oZWFkZXJfb3BzOworCWRldi0+bmV0ZGV2X29wcwkJPSAmZXRoZXIxMzk0X25ldGRldl9vcHM7CiAKIAlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmZXRodG9vbF9vcHMpOwogCkBAIC03NjcsNyArNzY0LDcgQEAKIHN0YXRpYyBpbnQgZXRoZXIxMzk0X2hlYWRlcl9jYWNoZShjb25zdCBzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwKIAkJCQkgIHN0cnVjdCBoaF9jYWNoZSAqaGgpCiB7Ci0JdW5zaWduZWQgc2hvcnQgdHlwZSA9IGhoLT5oaF90eXBlOworCV9fYmUxNiB0eXBlID0gaGgtPmhoX3R5cGU7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG5laWdoLT5kZXY7CiAJc3RydWN0IGV0aDEzOTRoZHIgKmV0aCA9CiAJCShzdHJ1Y3QgZXRoMTM5NGhkciAqKSgodTggKiloaC0+aGhfZGF0YSArIDE2IC0gRVRIMTM5NF9ITEVOKTsKQEAgLTc5NSw3ICs3OTIsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogQ29waWVkIGZyb20gbmV0L2V0aGVybmV0L2V0aC5jICovCi1zdGF0aWMgdTE2IGV0aGVyMTM5NF90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgX19iZTE2IGV0aGVyMTM5NF90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGV0aDEzOTRoZHIgKmV0aDsKIAl1bnNpZ25lZCBjaGFyICpyYXdwOwpAQCAtODI5LDE3ICs4MjYsMTcgQEAKIAogLyogUGFyc2UgYW4gZW5jYXBzdWxhdGVkIElQMTM5NCBoZWFkZXIgaW50byBhbiBldGhlcm5ldCBmcmFtZSBwYWNrZXQuCiAgKiBXZSBhbHNvIHBlcmZvcm0gQVJQIHRyYW5zbGF0aW9uIGhlcmUsIGlmIG5lZWQgYmUuICAqLwotc3RhdGljIHUxNiBldGhlcjEzOTRfcGFyc2VfZW5jYXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKK3N0YXRpYyBfX2JlMTYgZXRoZXIxMzk0X3BhcnNlX2VuY2FwKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJIG5vZGVpZF90IHNyY2lkLCBub2RlaWRfdCBkZXN0aWQsCi0JCQkJIHUxNiBldGhlcl90eXBlKQorCQkJCSBfX2JlMTYgZXRoZXJfdHlwZSkKIHsKIAlzdHJ1Y3QgZXRoMTM5NF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl1NjQgZGVzdF9odzsKLQl1bnNpZ25lZCBzaG9ydCByZXQgPSAwOworCV9fYmU2NCBkZXN0X2h3OworCV9fYmUxNiByZXQgPSAwOwogCiAJLyogU2V0dXAgb3VyIGh3IGFkZHJlc3Nlcy4gV2UgdXNlIHRoZXNlIHRvIGJ1aWxkIHRoZSBldGhlcm5ldCBoZWFkZXIuICovCiAJaWYgKGRlc3RpZCA9PSAoTE9DQUxfQlVTIHwgQUxMX05PREVTKSkKLQkJZGVzdF9odyA9IH4wVUxMOyAgLyogYnJvYWRjYXN0ICovCisJCWRlc3RfaHcgPSB+Y3B1X3RvX2JlNjQoMCk7ICAvKiBicm9hZGNhc3QgKi8KIAllbHNlCiAJCWRlc3RfaHcgPSBjcHVfdG9fYmU2NCgodTY0KXByaXYtPmhvc3QtPmNzci5ndWlkX2hpIDw8IDMyIHwKIAkJCQkgICAgICBwcml2LT5ob3N0LT5jc3IuZ3VpZF9sbyk7CkBAIC04NzMsNyArODcwLDcgQEAKIAkJbm9kZSA9IGV0aDEzOTRfZmluZF9ub2RlX2d1aWQoJnByaXYtPmlwX25vZGVfbGlzdCwKIAkJCQkJICAgICAgYmU2NF90b19jcHUoZ3VpZCkpOwogCQlpZiAoIW5vZGUpCi0JCQlyZXR1cm4gMDsKKwkJCXJldHVybiBjcHVfdG9fYmUxNigwKTsKIAogCQlub2RlX2luZm8gPQogCQkgICAgKHN0cnVjdCBldGgxMzk0X25vZGVfaW5mbyAqKW5vZGUtPnVkLT5kZXZpY2UuZHJpdmVyX2RhdGE7CkBAIC0xMDYzLDcgKzEwNjAsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGV0aDEzOTRfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJdW5pb24gZXRoMTM5NF9oZHIgKmhkciA9ICh1bmlvbiBldGgxMzk0X2hkciAqKWJ1ZjsKLQl1MTYgZXRoZXJfdHlwZSA9IDA7ICAvKiBpbml0aWFsaXplZCB0byBjbGVhciB3YXJuaW5nICovCisJX19iZTE2IGV0aGVyX3R5cGUgPSBjcHVfdG9fYmUxNigwKTsgIC8qIGluaXRpYWxpemVkIHRvIGNsZWFyIHdhcm5pbmcgKi8KIAlpbnQgaGRyX2xlbjsKIAlzdHJ1Y3QgdW5pdF9kaXJlY3RvcnkgKnVkID0gcHJpdi0+dWRfbGlzdFtOT0RFSURfVE9fTk9ERShzcmNpZCldOwogCXN0cnVjdCBldGgxMzk0X25vZGVfaW5mbyAqbm9kZV9pbmZvOwpAQCAtMTA3NSw3ICsxMDcyLDcgQEAKIAkJCUhQU0JfUFJJTlQoS0VSTl9FUlIsICJldGhlcjEzOTQgcng6IHNlbmRlciBub2RlaWQgIgogCQkJCSAgICJsb29rdXAgZmFpbHVyZTogIiBOT0RFX0JVU19GTVQsCiAJCQkJICAgTk9ERV9CVVNfQVJHUyhwcml2LT5ob3N0LCBzcmNpZCkpOwotCQkJcHJpdi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAkJdWQgPSBub2RlLT51ZDsKQEAgLTEwOTgsNyArMTA5NSw3IEBACiAJCXNrYiA9IGRldl9hbGxvY19za2IobGVuICsgZGV2LT5oYXJkX2hlYWRlcl9sZW4gKyAxNSk7CiAJCWlmICh1bmxpa2VseSghc2tiKSkgewogCQkJRVRIMTM5NF9QUklOVF9HKEtFUk5fRVJSLCAiT3V0IG9mIG1lbW9yeVxuIik7Ci0JCQlwcml2LT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJCXJldHVybiAtMTsKIAkJfQogCQlza2JfcmVzZXJ2ZShza2IsIChkZXYtPmhhcmRfaGVhZGVyX2xlbiArIDE1KSAmIH4xNSk7CkBAIC0xMjE3LDE1ICsxMjE0LDE1IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAogCWlmICghc2tiLT5wcm90b2NvbCkgewotCQlwcml2LT5zdGF0cy5yeF9lcnJvcnMrKzsKLQkJcHJpdi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAl9IGVsc2UgaWYgKG5ldGlmX3J4KHNrYikgPT0gTkVUX1JYX0RST1ApIHsKLQkJcHJpdi0+c3RhdHMucnhfZXJyb3JzKys7Ci0JCXByaXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJfSBlbHNlIHsKLQkJcHJpdi0+c3RhdHMucnhfcGFja2V0cysrOwotCQlwcml2LT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwkJZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCWRldi0+c3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47CiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwpAQCAtMTIzNCw4ICsxMjMxLDYgQEAKIAlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKQogCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CiAKLQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEyNTksNyArMTI1NCw3IEBACiAKIHN0YXRpYyB2b2lkIGV0aGVyMTM5NF9pc28oc3RydWN0IGhwc2JfaXNvICppc28pCiB7Ci0JcXVhZGxldF90ICpkYXRhOworCV9fYmUzMiAqZGF0YTsKIAljaGFyICpidWY7CiAJc3RydWN0IGV0aDEzOTRfaG9zdF9pbmZvICpoaTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwpAQCAtMTI4Myw3ICsxMjc4LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgbnJlYWR5OyBpKyspIHsKIAkJc3RydWN0IGhwc2JfaXNvX3BhY2tldF9pbmZvICppbmZvID0KIAkJCSZpc28tPmluZm9zWyhpc28tPmZpcnN0X3BhY2tldCArIGkpICUgaXNvLT5idWZfcGFja2V0c107Ci0JCWRhdGEgPSAocXVhZGxldF90ICopKGlzby0+ZGF0YV9idWYua3ZpcnQgKyBpbmZvLT5vZmZzZXQpOworCQlkYXRhID0gKF9fYmUzMiAqKShpc28tPmRhdGFfYnVmLmt2aXJ0ICsgaW5mby0+b2Zmc2V0KTsKIAogCQkvKiBza2lwIG92ZXIgR0FTUCBoZWFkZXIgKi8KIAkJYnVmID0gKGNoYXIgKilkYXRhICsgODsKQEAgLTE1MDksMTcgKzE1MDQsMTggQEAKIHN0YXRpYyB2b2lkIGV0aGVyMTM5NF9kZ19jb21wbGV0ZShzdHJ1Y3QgcGFja2V0X3Rhc2sgKnB0YXNrLCBpbnQgZmFpbCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHRhc2stPnNrYjsKLQlzdHJ1Y3QgZXRoMTM5NF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoc2tiLT5kZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBza2ItPmRldjsKKwlzdHJ1Y3QgZXRoMTM5NF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyogU3RhdGlzdGljcyAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJaWYgKGZhaWwpIHsKLQkJcHJpdi0+c3RhdHMudHhfZHJvcHBlZCsrOwotCQlwcml2LT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJZGV2LT5zdGF0cy50eF9kcm9wcGVkKys7CisJCWRldi0+c3RhdHMudHhfZXJyb3JzKys7CiAJfSBlbHNlIHsKLQkJcHJpdi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47Ci0JCXByaXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIApAQCAtMTYxNCw3ICsxNjEwLDcgQEAKIAkJaWYgKG1heF9wYXlsb2FkIDwgZGdfc2l6ZSArIGhkcl90eXBlX2xlbltFVEgxMzk0X0hEUl9MRl9VRl0pCiAJCQlwcml2LT5iY19kZ2wrKzsKIAl9IGVsc2UgewotCQlfX2JlNjQgZ3VpZCA9IGdldF91bmFsaWduZWQoKHU2NCAqKWhkcl9idWYuaF9kZXN0KTsKKwkJX19iZTY0IGd1aWQgPSBnZXRfdW5hbGlnbmVkKChfX2JlNjQgKiloZHJfYnVmLmhfZGVzdCk7CiAKIAkJbm9kZSA9IGV0aDEzOTRfZmluZF9ub2RlX2d1aWQoJnByaXYtPmlwX25vZGVfbGlzdCwKIAkJCQkJICAgICAgYmU2NF90b19jcHUoZ3VpZCkpOwpAQCAtMTY5Niw4ICsxNjkyLDggQEAKIAkJZGV2X2tmcmVlX3NrYihza2IpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQlwcml2LT5zdGF0cy50eF9kcm9wcGVkKys7Ci0JcHJpdi0+c3RhdHMudHhfZXJyb3JzKys7CisJZGV2LT5zdGF0cy50eF9kcm9wcGVkKys7CisJZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9ldGgxMzk0LmggYi9kcml2ZXJzL2llZWUxMzk0L2V0aDEzOTQuaAppbmRleCA0ZjNlMmRkLi5kNTNiYWM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L2V0aDEzOTQuaAorKysgYi9kcml2ZXJzL2llZWUxMzk0L2V0aDEzOTQuaApAQCAtNTQsNyArNTQsNiBAQAogCiAvKiBQcml2YXRlIHN0cnVjdHVyZSBmb3Igb3VyIGV0aGVybmV0IGRyaXZlciAqLwogc3RydWN0IGV0aDEzOTRfcHJpdiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CS8qIERldmljZSBzdGF0cwkJCSAqLwogCXN0cnVjdCBocHNiX2hvc3QgKmhvc3Q7CQkvKiBUaGUgY2FyZCBmb3IgdGhpcyBkZXYJICovCiAJdTE2IGJjX21heHBheWxvYWQ7CQkvKiBNYXggYnJvYWRjYXN0IHBheWxvYWQJICovCiAJdTggYmNfc3NwZDsJCQkvKiBNYXggYnJvYWRjYXN0IHNwZWVkCQkgKi8KQEAgLTgyLDcgKzgxLDcgQEAKIAogc3RydWN0IGV0aDEzOTRoZHIgewogCXVuc2lnbmVkIGNoYXIJaF9kZXN0W0VUSDEzOTRfQUxFTl07CS8qIGRlc3RpbmF0aW9uIGV0aDEzOTQgYWRkcgkqLwotCXVuc2lnbmVkIHNob3J0CWhfcHJvdG87CQkvKiBwYWNrZXQgdHlwZSBJRCBmaWVsZAkqLworCV9fYmUxNgkJaF9wcm90bzsJCS8qIHBhY2tldCB0eXBlIElEIGZpZWxkCSovCiB9ICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgZXRoMTM5NGhkciAqZXRoMTM5NF9oZHIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTk5LDEzICs5OCwxMyBAQAogc3RydWN0IGV0aDEzOTRfdWZfaGRyIHsKIAl1MTYgbGY6MjsKIAl1MTYgcmVzOjE0OwotCXUxNiBldGhlcl90eXBlOwkJLyogRXRoZXJuZXQgcGFja2V0IHR5cGUgKi8KKwlfX2JlMTYgZXRoZXJfdHlwZTsJCS8qIEV0aGVybmV0IHBhY2tldCB0eXBlICovCiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogI2VsaWYgZGVmaW5lZCBfX0xJVFRMRV9FTkRJQU5fQklURklFTEQKIHN0cnVjdCBldGgxMzk0X3VmX2hkciB7CiAJdTE2IHJlczoxNDsKIAl1MTYgbGY6MjsKLQl1MTYgZXRoZXJfdHlwZTsKKwlfX2JlMTYgZXRoZXJfdHlwZTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAjZWxzZQogI2Vycm9yIFVua25vd24gYml0IGZpZWxkIHR5cGUKQEAgLTExNyw3ICsxMTYsNyBAQAogCXUxNiBsZjoyOwogCXUxNiByZXMxOjI7CiAJdTE2IGRnX3NpemU6MTI7CQkvKiBEYXRhZ3JhbSBzaXplICovCi0JdTE2IGV0aGVyX3R5cGU7CQkvKiBFdGhlcm5ldCBwYWNrZXQgdHlwZSAqLworCV9fYmUxNiBldGhlcl90eXBlOwkJLyogRXRoZXJuZXQgcGFja2V0IHR5cGUgKi8KIAl1MTYgZGdsOwkJLyogRGF0YWdyYW0gbGFiZWwgKi8KIAl1MTYgcmVzMjsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CkBAIC0xMjYsNyArMTI1LDcgQEAKIAl1MTYgZGdfc2l6ZToxMjsKIAl1MTYgcmVzMToyOwogCXUxNiBsZjoyOwotCXUxNiBldGhlcl90eXBlOworCV9fYmUxNiBldGhlcl90eXBlOwogCXUxNiBkZ2w7CiAJdTE2IHJlczI7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwpAQCAtMjA3LDExICsyMDYsMTEgQEAKIAl1MTYgb3Bjb2RlOwkJLyogQVJQIE9wY29kZQkqLwogCS8qIEFib3ZlIGlzIGV4YWN0bHkgdGhlIHNhbWUgZm9ybWF0IGFzIHN0cnVjdCBhcnBoZHIgKi8KIAotCXU2NCBzX3VuaXFfaWQ7CQkvKiBTZW5kZXIncyA2NGJpdCBFVUkJCQkqLworCV9fYmU2NCBzX3VuaXFfaWQ7CS8qIFNlbmRlcidzIDY0Yml0IEVVSQkJKi8KIAl1OCBtYXhfcmVjOwkJLyogU2VuZGVyJ3MgbWF4IHBhY2tldCBzaXplCQkqLwogCXU4IHNzcGQ7CQkvKiBTZW5kZXIncyBtYXggc3BlZWQJCQkqLwotCXUxNiBmaWZvX2hpOwkJLyogaGkgMTZiaXRzIG9mIHNlbmRlcidzIEZJRk8gYWRkcgkqLwotCXUzMiBmaWZvX2xvOwkJLyogbG8gMzJiaXRzIG9mIHNlbmRlcidzIEZJRk8gYWRkcgkqLworCV9fYmUxNiBmaWZvX2hpOwkJLyogaGkgMTZiaXRzIG9mIHNlbmRlcidzIEZJRk8gYWRkcgkqLworCV9fYmUzMiBmaWZvX2xvOwkJLyogbG8gMzJiaXRzIG9mIHNlbmRlcidzIEZJRk8gYWRkcgkqLwogCXUzMiBzaXA7CQkvKiBTZW5kZXIncyBJUCBBZGRyZXNzCQkJKi8KIAl1MzIgdGlwOwkJLyogSVAgQWRkcmVzcyBvZiByZXF1ZXN0ZWQgaHcgYWRkcgkqLwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvaGlnaGxldmVsLmMgYi9kcml2ZXJzL2llZWUxMzk0L2hpZ2hsZXZlbC5jCmluZGV4IDI3MjU0M2EuLjYwMGUzOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvaGlnaGxldmVsLmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9oaWdobGV2ZWwuYwpAQCAtMzIwLDcgKzMyMCw3IEBACiAgKi8KIHU2NCBocHNiX2FsbG9jYXRlX2FuZF9yZWdpc3Rlcl9hZGRyc3BhY2Uoc3RydWN0IGhwc2JfaGlnaGxldmVsICpobCwKIAkJCQkJIHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsCi0JCQkJCSBzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyAqb3BzLAorCQkJCQkgY29uc3Qgc3RydWN0IGhwc2JfYWRkcmVzc19vcHMgKm9wcywKIAkJCQkJIHU2NCBzaXplLCB1NjQgYWxpZ25tZW50LAogCQkJCQkgdTY0IHN0YXJ0LCB1NjQgZW5kKQogewpAQCAtNDA3LDcgKzQwNyw4IEBACiAgKiBhcmUgYXV0b21hdGljYWxseSBkZWFsbG9jYXRlZCB0b2dldGhlciB3aXRoIHRoZSBocHNiX2hpZ2hsZXZlbCBAaGwuCiAgKi8KIGludCBocHNiX3JlZ2lzdGVyX2FkZHJzcGFjZShzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgKmhsLCBzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LAotCQkJICAgIHN0cnVjdCBocHNiX2FkZHJlc3Nfb3BzICpvcHMsIHU2NCBzdGFydCwgdTY0IGVuZCkKKwkJCSAgICBjb25zdCBzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyAqb3BzLAorCQkJICAgIHU2NCBzdGFydCwgdTY0IGVuZCkKIHsKIAlzdHJ1Y3QgaHBzYl9hZGRyZXNzX3NlcnZlICphczsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpsaDsKQEAgLTQyMCw3ICs0MjEsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlhcyA9IGttYWxsb2Moc2l6ZW9mKCphcyksIEdGUF9BVE9NSUMpOworCWFzID0ga21hbGxvYyhzaXplb2YoKmFzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFhcykKIAkJcmV0dXJuIDA7CiAKQEAgLTQ3Nyw3ICs0NzgsNyBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyBkdW1teV9vcHM7Citjb25zdCBzdGF0aWMgc3RydWN0IGhwc2JfYWRkcmVzc19vcHMgZHVtbXlfb3BzOwogCiAvKiBkdW1teSBhZGRyZXNzIHNwYWNlcyBhcyBsb3dlciBhbmQgdXBwZXIgYm91bmRzIG9mIHRoZSBob3N0J3MgYS5zLiBsaXN0ICovCiBzdGF0aWMgdm9pZCBpbml0X2hwc2JfaGlnaGxldmVsKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2hpZ2hsZXZlbC5oIGIvZHJpdmVycy9pZWVlMTM5NC9oaWdobGV2ZWwuaAppbmRleCBiYzVkMDg1Li45ZGJhODlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L2hpZ2hsZXZlbC5oCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvaGlnaGxldmVsLmgKQEAgLTE1LDcgKzE1LDcgQEAKIHN0cnVjdCBocHNiX2FkZHJlc3Nfc2VydmUgewogCXN0cnVjdCBsaXN0X2hlYWQgaG9zdF9saXN0OwkvKiBwZXIgaG9zdCBsaXN0ICovCiAJc3RydWN0IGxpc3RfaGVhZCBobF9saXN0OwkvKiBocHNiX2hpZ2hsZXZlbCBsaXN0ICovCi0Jc3RydWN0IGhwc2JfYWRkcmVzc19vcHMgKm9wOworCWNvbnN0IHN0cnVjdCBocHNiX2FkZHJlc3Nfb3BzICpvcDsKIAlzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0OwogCXU2NCBzdGFydDsJLyogZmlyc3QgYWRkcmVzcyBoYW5kbGVkLCBxdWFkbGV0IGFsaWduZWQgKi8KIAl1NjQgZW5kOwkvKiBmaXJzdCBhZGRyZXNzIGJlaGluZCwgcXVhZGxldCBhbGlnbmVkICovCkBAIC0xMTksMTEgKzExOSwxMiBAQAogCiB1NjQgaHBzYl9hbGxvY2F0ZV9hbmRfcmVnaXN0ZXJfYWRkcnNwYWNlKHN0cnVjdCBocHNiX2hpZ2hsZXZlbCAqaGwsCiAJCQkJCSBzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LAotCQkJCQkgc3RydWN0IGhwc2JfYWRkcmVzc19vcHMgKm9wcywKKwkJCQkJIGNvbnN0IHN0cnVjdCBocHNiX2FkZHJlc3Nfb3BzICpvcHMsCiAJCQkJCSB1NjQgc2l6ZSwgdTY0IGFsaWdubWVudCwKIAkJCQkJIHU2NCBzdGFydCwgdTY0IGVuZCk7CiBpbnQgaHBzYl9yZWdpc3Rlcl9hZGRyc3BhY2Uoc3RydWN0IGhwc2JfaGlnaGxldmVsICpobCwgc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwKLQkJCSAgICBzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyAqb3BzLCB1NjQgc3RhcnQsIHU2NCBlbmQpOworCQkJICAgIGNvbnN0IHN0cnVjdCBocHNiX2FkZHJlc3Nfb3BzICpvcHMsCisJCQkgICAgdTY0IHN0YXJ0LCB1NjQgZW5kKTsKIGludCBocHNiX3VucmVnaXN0ZXJfYWRkcnNwYWNlKHN0cnVjdCBocHNiX2hpZ2hsZXZlbCAqaGwsIHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsCiAJCQkgICAgICB1NjQgc3RhcnQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2hvc3RzLmMgYi9kcml2ZXJzL2llZWUxMzk0L2hvc3RzLmMKaW5kZXggMjM3ZDBjOS4uZTk0N2Q4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9ob3N0cy5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvaG9zdHMuYwpAQCAtMzQsMTggKzM0LDE4IEBACiB7CiAJc3RydWN0IGhwc2JfaG9zdCAqaG9zdCA9CiAJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaHBzYl9ob3N0LCBkZWxheWVkX3Jlc2V0LndvcmspOwotCWludCBnZW5lcmF0aW9uID0gaG9zdC0+Y3NyLmdlbmVyYXRpb24gKyAxOworCXU4IGdlbmVyYXRpb24gPSBob3N0LT5jc3IuZ2VuZXJhdGlvbiArIDE7CiAKIAkvKiBUaGUgZ2VuZXJhdGlvbiBmaWVsZCByb2xscyBvdmVyIHRvIDIgcmF0aGVyIHRoYW4gMCBwZXIgSUVFRQogCSAqIDEzOTRhLTIwMDAuICovCiAJaWYgKGdlbmVyYXRpb24gPiAweGYgfHwgZ2VuZXJhdGlvbiA8IDIpCiAJCWdlbmVyYXRpb24gPSAyOwogCi0JQ1NSX1NFVF9CVVNfSU5GT19HRU5FUkFUSU9OKGhvc3QtPmNzci5yb20sIGdlbmVyYXRpb24pOworCWNzcl9zZXRfYnVzX2luZm9fZ2VuZXJhdGlvbihob3N0LT5jc3Iucm9tLCBnZW5lcmF0aW9uKTsKIAlpZiAoY3NyMTIxMl9nZW5lcmF0ZV9jc3JfaW1hZ2UoaG9zdC0+Y3NyLnJvbSkgIT0gQ1NSMTIxMl9TVUNDRVNTKSB7CiAJCS8qIENTUiBpbWFnZSBjcmVhdGlvbiBmYWlsZWQuCiAJCSAqIFJlc2V0IGdlbmVyYXRpb24gZmllbGQgYW5kIGRvIG5vdCBpc3N1ZSBhIGJ1cyByZXNldC4gKi8KLQkJQ1NSX1NFVF9CVVNfSU5GT19HRU5FUkFUSU9OKGhvc3QtPmNzci5yb20sCisJCWNzcl9zZXRfYnVzX2luZm9fZ2VuZXJhdGlvbihob3N0LT5jc3Iucm9tLAogCQkJCQkgICAgaG9zdC0+Y3NyLmdlbmVyYXRpb24pOwogCQlyZXR1cm47CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9ob3N0cy5oIGIvZHJpdmVycy9pZWVlMTM5NC9ob3N0cy5oCmluZGV4IGRkMjI5OTUuLjQ5YzM1OTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvaG9zdHMuaAorKysgYi9kcml2ZXJzL2llZWUxMzk0L2hvc3RzLmgKQEAgLTE1NCw3ICsxNTQsNyBAQAogCSAqIHRvIHNldCB0aGUgaGFyZHdhcmUgQ29uZmlnUk9NIGlmIHRoZSBoYXJkd2FyZSBzdXBwb3J0cyBoYW5kbGluZwogCSAqIHJlYWRzIHRvIHRoZSBDb25maWdST00gb24gaXRzIG93bi4gKi8KIAl2b2lkICgqc2V0X2h3X2NvbmZpZ19yb20pKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsCi0JCQkJICBxdWFkbGV0X3QgKmNvbmZpZ19yb20pOworCQkJCSAgX19iZTMyICpjb25maWdfcm9tKTsKIAogCS8qIFRoaXMgZnVuY3Rpb24gc2hhbGwgaW1wbGVtZW50IHBhY2tldCB0cmFuc21pc3Npb24gYmFzZWQgb24KIAkgKiBwYWNrZXQtPnR5cGUuICBJdCBzaGFsbCBDUkMgYm90aCBwYXJ0cyBvZiB0aGUgcGFja2V0ICh1bmxlc3MKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTQuaCBiL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTQuaAppbmRleCA0MDQ5MjA3Li5lMGFlMGQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L2llZWUxMzk0LmgKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9pZWVlMTM5NC5oCkBAIC0xMjEsNiArMTIxLDkgQEAKIAogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KIAorLyogJzEnICczJyAnOScgJzQnIGluIEFTQ0lJICovCisjZGVmaW5lIElFRUUxMzk0X0JVU0lEX01BR0lDCWNwdV90b19iZTMyKDB4MzEzMzM5MzQpCisKICNpZmRlZiBfX0JJR19FTkRJQU5fQklURklFTEQKIAogc3RydWN0IHNlbGZpZCB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuYyBiL2RyaXZlcnMvaWVlZTEzOTQvbm9kZW1nci5jCmluZGV4IDc5ZWY1ZmQuLjkwNmM1YTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvbm9kZW1nci5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvbm9kZW1nci5jCkBAIC02Nyw3ICs2Nyw3IEBACiAJZm9yIChpID0gSUVFRTEzOTRfU1BFRURfMTAwOyBpIDw9IG9sZF9zcGVlZDsgaSsrKSB7CiAJCSpzcGVlZCA9IGk7CiAJCWVycm9yID0gaHBzYl9yZWFkKGNpLT5ob3N0LCBjaS0+bm9kZWlkLCBjaS0+Z2VuZXJhdGlvbiwgYWRkciwKLQkJCQkgICZxLCBzaXplb2YocXVhZGxldF90KSk7CisJCQkJICAmcSwgNCk7CiAJCWlmIChlcnJvcikKIAkJCWJyZWFrOwogCQkqYnVmZmVyID0gcTsKQEAgLTg1LDcgKzg1LDcgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLXN0YXRpYyBpbnQgbm9kZW1ncl9idXNfcmVhZChzdHJ1Y3QgY3NyMTIxMl9jc3IgKmNzciwgdTY0IGFkZHIsIHUxNiBsZW5ndGgsCitzdGF0aWMgaW50IG5vZGVtZ3JfYnVzX3JlYWQoc3RydWN0IGNzcjEyMTJfY3NyICpjc3IsIHU2NCBhZGRyLAogCQkJICAgIHZvaWQgKmJ1ZmZlciwgdm9pZCAqX19jaSkKIHsKIAlzdHJ1Y3Qgbm9kZW1ncl9jc3JfaW5mbyAqY2kgPSAoc3RydWN0IG5vZGVtZ3JfY3NyX2luZm8qKV9fY2k7CkBAIC05Myw3ICs5Myw3IEBACiAKIAlmb3IgKGkgPSAxOyA7IGkrKykgewogCQllcnJvciA9IGhwc2JfcmVhZChjaS0+aG9zdCwgY2ktPm5vZGVpZCwgY2ktPmdlbmVyYXRpb24sIGFkZHIsCi0JCQkJICBidWZmZXIsIGxlbmd0aCk7CisJCQkJICBidWZmZXIsIDQpOwogCQlpZiAoIWVycm9yKSB7CiAJCQljaS0+c3BlZWRfdW52ZXJpZmllZCA9IDA7CiAJCQlicmVhazsKQEAgLTEwNCw3ICsxMDQsNyBAQAogCiAJCS8qIFRoZSBpZWVlMTM5NF9jb3JlIGd1ZXNzZWQgdGhlIG5vZGUncyBzcGVlZCBjYXBhYmlsaXR5IGZyb20KIAkJICogdGhlIHNlbGYgSUQuICBDaGVjayB3aGV0aGVyIGEgbG93ZXIgc3BlZWQgd29ya3MuICovCi0JCWlmIChjaS0+c3BlZWRfdW52ZXJpZmllZCAmJiBsZW5ndGggPT0gc2l6ZW9mKHF1YWRsZXRfdCkpIHsKKwkJaWYgKGNpLT5zcGVlZF91bnZlcmlmaWVkKSB7CiAJCQllcnJvciA9IG5vZGVtZ3JfY2hlY2tfc3BlZWQoY2ksIGFkZHIsIGJ1ZmZlcik7CiAJCQlpZiAoIWVycm9yKQogCQkJCWJyZWFrOwpAQCAtMTE1LDIwICsxMTUsOCBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotI2RlZmluZSBPVUlfRlJFRUNPTV9URUNITk9MT0dJRVNfR01CSCAweDAwMDFkYgotCi1zdGF0aWMgaW50IG5vZGVtZ3JfZ2V0X21heF9yb20ocXVhZGxldF90ICpidXNfaW5mb19kYXRhLCB2b2lkICpfX2NpKQotewotCS8qIEZyZWVjb20gRmlyZVdpcmUgSGFyZCBEcml2ZSBmaXJtd2FyZSBidWcgKi8KLQlpZiAoYmUzMl90b19jcHUoYnVzX2luZm9fZGF0YVszXSkgPj4gOCA9PSBPVUlfRlJFRUNPTV9URUNITk9MT0dJRVNfR01CSCkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gKGJlMzJfdG9fY3B1KGJ1c19pbmZvX2RhdGFbMl0pID4+IDgpICYgMHgzOwotfQotCiBzdGF0aWMgc3RydWN0IGNzcjEyMTJfYnVzX29wcyBub2RlbWdyX2Nzcl9vcHMgPSB7CiAJLmJ1c19yZWFkID0Jbm9kZW1ncl9idXNfcmVhZCwKLQkuZ2V0X21heF9yb20gPQlub2RlbWdyX2dldF9tYXhfcm9tCiB9OwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvbm9kZW1nci5oIGIvZHJpdmVycy9pZWVlMTM5NC9ub2RlbWdyLmgKaW5kZXggNGYyODdhMy4uMTVlYTA5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9ub2RlbWdyLmgKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9ub2RlbWdyLmgKQEAgLTMxLDkgKzMxLDYgQEAKIHN0cnVjdCBocHNiX2hvc3Q7CiBzdHJ1Y3QgaWVlZTEzOTRfZGV2aWNlX2lkOwogCi0vKiAnMScgJzMnICc5JyAnNCcgaW4gQVNDSUkgKi8KLSNkZWZpbmUgSUVFRTEzOTRfQlVTSURfTUFHSUMJX19jb25zdGFudF9jcHVfdG9fYmUzMigweDMxMzMzOTM0KQotCiAvKiBUaGlzIGlzIHRoZSBzdGFydCBvZiBhIE5vZGUgZW50cnkgc3RydWN0dXJlLiBJdCBzaG91bGQgYmUgYSBzdGFibGUgQVBJCiAgKiBmb3Igd2hpY2ggdG8gZ2F0aGVyIGluZm8gZnJvbSB0aGUgTm9kZSBNYW5hZ2VyIGFib3V0IGRldmljZXMgYXR0YWNoZWQKICAqIHRvIHRoZSBidXMuICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9vaGNpMTM5NC5jIGIvZHJpdmVycy9pZWVlMTM5NC9vaGNpMTM5NC5jCmluZGV4IGU1MDllMTMuLjY1YzE0MjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvb2hjaTEzOTQuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L29oY2kxMzk0LmMKQEAgLTI5NzMsNyArMjk3Myw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIG9oY2lfc2V0X2h3X2NvbmZpZ19yb20oc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgcXVhZGxldF90ICpjb25maWdfcm9tKQorc3RhdGljIHZvaWQgb2hjaV9zZXRfaHdfY29uZmlnX3JvbShzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBfX2JlMzIgKmNvbmZpZ19yb20pCiB7CiAJc3RydWN0IHRpX29oY2kgKm9oY2kgPSBob3N0LT5ob3N0ZGF0YTsKIApAQCAtMzE5OSwxNSArMzE5OSwxNiBAQAogCS8qIE5vdyBlbmFibGUgTFBTLCB3aGljaCB3ZSBuZWVkIGluIG9yZGVyIHRvIHN0YXJ0IGFjY2Vzc2luZwogCSAqIG1vc3Qgb2YgdGhlIHJlZ2lzdGVycy4gIEluIGZhY3QsIG9uIHNvbWUgY2FyZHMgKEFMSSBNNTI1MSksCiAJICogYWNjZXNzaW5nIHJlZ2lzdGVycyBpbiB0aGUgU0NsayBkb21haW4gd2l0aG91dCBMUFMgZW5hYmxlZAotCSAqIHdpbGwgbG9jayB1cCB0aGUgbWFjaGluZS4gIFdhaXQgNTBtc2VjIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlCi0JICogZnVsbCBsaW5rIGVuYWJsZWQuICAqLworCSAqIHdpbGwgbG9jayB1cCB0aGUgbWFjaGluZS4gKi8KIAlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSENDb250cm9sU2V0LCBPSENJMTM5NF9IQ0NvbnRyb2xfTFBTKTsKIAogCS8qIERpc2FibGUgYW5kIGNsZWFyIGludGVycnVwdHMgKi8KIAlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSW50RXZlbnRDbGVhciwgMHhmZmZmZmZmZik7CiAJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0ludE1hc2tDbGVhciwgMHhmZmZmZmZmZik7CiAKLQltZGVsYXkoNTApOworCS8qIEZsdXNoIE1NSU8gd3JpdGVzIGFuZCB3YWl0IHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIGZ1bGwgbGluayBlbmFibGVkLiAqLworCXJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X1ZlcnNpb24pOworCW1zbGVlcCg1MCk7CiAKIAkvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgSVIgYW5kIElUIGNvbnRleHRzLiAqLwogCW9oY2ktPm5iX2lzb19yY3ZfY3R4ID0KQEAgLTMyMzMsOCArMzIzNCw5IEBACiAJICogd2UgbmVlZCB0byBnZXQgdG8gdGhhdCAibm8gZXZlbnQiLCBzbyBlbm91Z2ggc2hvdWxkIGJlIGluaXRpYWxpemVkCiAJICogYnkgdGhhdCBwb2ludC4KIAkgKi8KLQlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIG9oY2lfaXJxX2hhbmRsZXIsIElSUUZfU0hBUkVELAotCQkJIE9IQ0kxMzk0X0RSSVZFUl9OQU1FLCBvaGNpKSkgeworCWVyciA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBvaGNpX2lycV9oYW5kbGVyLCBJUlFGX1NIQVJFRCwKKwkJCSAgT0hDSTEzOTRfRFJJVkVSX05BTUUsIG9oY2kpOworCWlmIChlcnIpIHsKIAkJUFJJTlRfRyhLRVJOX0VSUiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBpbnRlcnJ1cHQgJWQiLCBkZXYtPmlycSk7CiAJCWdvdG8gZXJyOwogCX0KQEAgLTMzODEsNiArMzM4Myw3IEBACiAJb2hjaV9kZXZjdGwob2hjaS0+aG9zdCwgUkVTRVRfQlVTLCBMT05HX1JFU0VUX05PX0ZPUkNFX1JPT1QpOwogCW9oY2lfc29mdF9yZXNldChvaGNpKTsKIAorCWZyZWVfaXJxKGRldi0+aXJxLCBvaGNpKTsKIAllcnIgPSBwY2lfc2F2ZV9zdGF0ZShkZXYpOwogCWlmIChlcnIpIHsKIAkJUFJJTlQoS0VSTl9FUlIsICJwY2lfc2F2ZV9zdGF0ZSBmYWlsZWQgd2l0aCAlZCIsIGVycik7CkBAIC0zNDIwLDcgKzM0MjMsMTYgQEAKIAlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSENDb250cm9sU2V0LCBPSENJMTM5NF9IQ0NvbnRyb2xfTFBTKTsKIAlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSW50RXZlbnRDbGVhciwgMHhmZmZmZmZmZik7CiAJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0ludE1hc2tDbGVhciwgMHhmZmZmZmZmZik7Ci0JbWRlbGF5KDUwKTsKKwlyZWdfcmVhZChvaGNpLCBPSENJMTM5NF9WZXJzaW9uKTsKKwltc2xlZXAoNTApOworCisJZXJyID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIG9oY2lfaXJxX2hhbmRsZXIsIElSUUZfU0hBUkVELAorCQkJICBPSENJMTM5NF9EUklWRVJfTkFNRSwgb2hjaSk7CisJaWYgKGVycikgeworCQlQUklOVF9HKEtFUk5fRVJSLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGludGVycnVwdCAlZCIsIGRldi0+aXJxKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKIAlvaGNpX2luaXRpYWxpemUob2hjaSk7CiAKIAlocHNiX3Jlc3VtZV9ob3N0KG9oY2ktPmhvc3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9wY2lseW54LmMgYi9kcml2ZXJzL2llZWUxMzk0L3BjaWx5bnguYwppbmRleCA3YWVlMWFjLi5kYzE1Y2FkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L3BjaWx5bnguYworKysgYi9kcml2ZXJzL2llZWUxMzk0L3BjaWx5bnguYwpAQCAtMTQ2Myw3ICsxNDYzLDcgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmZvX2xlbmd0aCwgY3JjX2xlbmd0aCBhbmQgMTM5NCBtYWdpYyBudW1iZXIgdG8gY2hlY2ssIGlmIGl0IGlzIHJlYWxseSBhIGJ1cyBpbmZvIGJsb2NrICovCiAJCQkJaWYgKCgoYmUzMl90b19jcHUobHlueC0+YnVzX2luZm9fYmxvY2tbMF0pICYgMHhmZmZmMDAwMCkgPT0gMHgwNDA0MDAwMCkgJiYKLQkJCQkgICAgKGx5bngtPmJ1c19pbmZvX2Jsb2NrWzFdID09IF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoMHgzMTMzMzkzNCkpKQorCQkJCSAgICAobHlueC0+YnVzX2luZm9fYmxvY2tbMV0gPT0gSUVFRTEzOTRfQlVTSURfTUFHSUMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJTlQoS0VSTl9ERUJVRywgbHlueC0+aWQsICJyZWFkIGEgdmFsaWQgYnVzIGluZm8gYmxvY2sgZnJvbSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9wY2lseW54LmggYi9kcml2ZXJzL2llZWUxMzk0L3BjaWx5bnguaAppbmRleCBlYzI3MzIxLi42OTNhMTY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L3BjaWx5bnguaAorKysgYi9kcml2ZXJzL2llZWUxMzk0L3BjaWx5bnguaApAQCAtNTIsNyArNTIsNyBAQAogICAgICAgICB2b2lkIF9faW9tZW0gKmxvY2FsX3JvbTsKICAgICAgICAgdm9pZCBfX2lvbWVtICpsb2NhbF9yYW07CiAgICAgICAgIHZvaWQgX19pb21lbSAqYXV4X3BvcnQ7Ci0JcXVhZGxldF90IGJ1c19pbmZvX2Jsb2NrWzVdOworCV9fYmUzMiBidXNfaW5mb19ibG9ja1s1XTsKIAogICAgICAgICAvKgogICAgICAgICAgKiB1c2UgbG9jYWwgUkFNIG9mIExPQ0FMUkFNX1NJWkUgYnl0ZXMgZm9yIFBDTHMsIHdoaWNoIGFsbG93cyBmb3IKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvcmF3MTM5NC5jIGIvZHJpdmVycy9pZWVlMTM5NC9yYXcxMzk0LmMKaW5kZXggYmY3ZTc2MS4uYmFkNjZjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9yYXcxMzk0LmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9yYXcxMzk0LmMKQEAgLTkwLDcgKzkwLDcgQEAKIHN0YXRpYyBpbnQgYXJtX2xvY2s2NChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBpbnQgbm9kZWlkLCBvY3RsZXRfdCAqIHN0b3JlLAogCQkgICAgICB1NjQgYWRkciwgb2N0bGV0X3QgZGF0YSwgb2N0bGV0X3QgYXJnLCBpbnQgZXh0X3Rjb2RlLAogCQkgICAgICB1MTYgZmxhZ3MpOwotc3RhdGljIHN0cnVjdCBocHNiX2FkZHJlc3Nfb3BzIGFybV9vcHMgPSB7Citjb25zdCBzdGF0aWMgc3RydWN0IGhwc2JfYWRkcmVzc19vcHMgYXJtX29wcyA9IHsKIAkucmVhZCA9IGFybV9yZWFkLAogCS53cml0ZSA9IGFybV93cml0ZSwKIAkubG9jayA9IGFybV9sb2NrLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9zYnAyLmMgYi9kcml2ZXJzL2llZWUxMzk0L3NicDIuYwppbmRleCBhMzczYzE4Li5hYjEwMzRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L3NicDIuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L3NicDIuYwpAQCAtMjY1LDcgKzI2NSw3IEBACiAJLmhvc3RfcmVzZXQJPSBzYnAyX2hvc3RfcmVzZXQsCiB9OwogCi1zdGF0aWMgc3RydWN0IGhwc2JfYWRkcmVzc19vcHMgc2JwMl9vcHMgPSB7Citjb25zdCBzdGF0aWMgc3RydWN0IGhwc2JfYWRkcmVzc19vcHMgc2JwMl9vcHMgPSB7CiAJLndyaXRlCQk9IHNicDJfaGFuZGxlX3N0YXR1c193cml0ZQogfTsKIApAQCAtMjc1LDcgKzI3NSw3IEBACiBzdGF0aWMgaW50IHNicDJfaGFuZGxlX3BoeXNkbWFfcmVhZChzdHJ1Y3QgaHBzYl9ob3N0ICosIGludCwgcXVhZGxldF90ICosIHU2NCwKIAkJCQkgICAgc2l6ZV90LCB1MTYpOwogCi1zdGF0aWMgc3RydWN0IGhwc2JfYWRkcmVzc19vcHMgc2JwMl9waHlzZG1hX29wcyA9IHsKK2NvbnN0IHN0YXRpYyBzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyBzYnAyX3BoeXNkbWFfb3BzID0gewogCS5yZWFkCQk9IHNicDJfaGFuZGxlX3BoeXNkbWFfcmVhZCwKIAkud3JpdGUJCT0gc2JwMl9oYW5kbGVfcGh5c2RtYV93cml0ZSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9zeXNmcy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvc3lzZnMuYwppbmRleCA0ZjRkMWJiLi5iNDNmN2QzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9zeXNmcy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3N5c2ZzLmMKQEAgLTc3OCw3ICs3NzgsNyBAQAogCWNsYXNzX2Rldi0+Y2xhc3MgICAgICA9ICZpYl9jbGFzczsKIAljbGFzc19kZXYtPmRyaXZlcl9kYXRhID0gZGV2aWNlOwogCWNsYXNzX2Rldi0+cGFyZW50ICAgICA9IGRldmljZS0+ZG1hX2RldmljZTsKLQlzdHJsY3B5KGNsYXNzX2Rldi0+YnVzX2lkLCBkZXZpY2UtPm5hbWUsIEJVU19JRF9TSVpFKTsKKwlkZXZfc2V0X25hbWUoY2xhc3NfZGV2LCBkZXZpY2UtPm5hbWUpOwogCiAJSU5JVF9MSVNUX0hFQUQoJmRldmljZS0+cG9ydF9saXN0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdWNtLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91Y20uYwppbmRleCBlNjAzNzM2Li41MWJkOTY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91Y20uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91Y20uYwpAQCAtMTI2Niw4ICsxMjY2LDcgQEAKIAl1Y21fZGV2LT5kZXYucGFyZW50ID0gZGV2aWNlLT5kbWFfZGV2aWNlOwogCXVjbV9kZXYtPmRldi5kZXZ0ID0gdWNtX2Rldi0+Y2Rldi5kZXY7CiAJdWNtX2Rldi0+ZGV2LnJlbGVhc2UgPSBpYl91Y21fcmVsZWFzZV9kZXY7Ci0Jc25wcmludGYodWNtX2Rldi0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsICJ1Y20lZCIsCi0JCSB1Y21fZGV2LT5kZXZudW0pOworCWRldl9zZXRfbmFtZSgmdWNtX2Rldi0+ZGV2LCAidWNtJWQiLCB1Y21fZGV2LT5kZXZudW0pOwogCWlmIChkZXZpY2VfcmVnaXN0ZXIoJnVjbV9kZXYtPmRldikpCiAJCWdvdG8gZXJyX2NkZXY7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9mcy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2ZzLmMKaW5kZXggNTM5MTJjMy4uOGRjMmJiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2ZzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2ZzLmMKQEAgLTU3LDkgKzU3LDYgQEAKIAl9CiAKIAlpbm9kZS0+aV9tb2RlID0gbW9kZTsKLQlpbm9kZS0+aV91aWQgPSAwOwotCWlub2RlLT5pX2dpZCA9IDA7Ci0JaW5vZGUtPmlfYmxvY2tzID0gMDsKIAlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAJaW5vZGUtPmlfcHJpdmF0ZSA9IGRhdGE7CiAJaWYgKChtb2RlICYgU19JRk1UKSA9PSBTX0lGRElSKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9jcS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvY3EuYwppbmRleCBhM2M1YWYxZC4uZGU1MjYzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvY3EuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9jcS5jCkBAIC0zNjcsNyArMzY3LDcgQEAKIAkJaWYgKGVycikKIAkJCWdvdG8gb3V0OwogCX0gZWxzZSB7Ci0JCS8qIENhbid0IGJlIHNtYWxsZXIgdGhlbiB0aGUgbnVtYmVyIG9mIG91dHN0YW5kaW5nIENRRXMgKi8KKwkJLyogQ2FuJ3QgYmUgc21hbGxlciB0aGFuIHRoZSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgQ1FFcyAqLwogCQlvdXRzdF9jcWUgPSBtbHg0X2liX2dldF9vdXRzdGFuZGluZ19jcWVzKGNxKTsKIAkJaWYgKGVudHJpZXMgPCBvdXRzdF9jcWUgKyAxKSB7CiAJCQllcnIgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfY20uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX2NtLmMKaW5kZXggYTgxMmRiMi4uNmJhNTdlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfY20uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19jbS5jCkBAIC0yNzA1LDcgKzI3MDUsNyBAQAogCQkJc2l6ZW9mKHN0cnVjdCBpZXRmX21wYV9mcmFtZSkpOwogCiAKLQkvKiBub3RpZnkgT0YgbGF5ZXIgdGhhdCBhY2NlcHQgZXZlbnQgd2FzIHN1Y2Nlc3NmdWxsICovCisJLyogbm90aWZ5IE9GIGxheWVyIHRoYXQgYWNjZXB0IGV2ZW50IHdhcyBzdWNjZXNzZnVsICovCiAJY21faWQtPmFkZF9yZWYoY21faWQpOwogCiAJY21fZXZlbnQuZXZlbnQgPSBJV19DTV9FVkVOVF9FU1RBQkxJU0hFRDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvc3JwL2liX3NycC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9zcnAvaWJfc3JwLmMKaW5kZXggN2MxM2RiOC4uNTRjOGZlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9zcnAvaWJfc3JwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9zcnAvaWJfc3JwLmMKQEAgLTE5NDksOCArMTk0OSw3IEBACiAKIAlob3N0LT5kZXYuY2xhc3MgPSAmc3JwX2NsYXNzOwogCWhvc3QtPmRldi5wYXJlbnQgPSBkZXZpY2UtPmRldi0+ZG1hX2RldmljZTsKLQlzbnByaW50Zihob3N0LT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgInNycC0lcy0lZCIsCi0JCSBkZXZpY2UtPmRldi0+bmFtZSwgcG9ydCk7CisJZGV2X3NldF9uYW1lKCZob3N0LT5kZXYsICJzcnAtJXMtJWQiLCBkZXZpY2UtPmRldi0+bmFtZSwgcG9ydCk7CiAKIAlpZiAoZGV2aWNlX3JlZ2lzdGVyKCZob3N0LT5kZXYpKQogCQlnb3RvIGZyZWVfaG9zdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvTWFrZWZpbGUgYi9kcml2ZXJzL2lucHV0L01ha2VmaWxlCmluZGV4IDk4YzRmOWEuLjRjOWM3NDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9pbnB1dC9NYWtlZmlsZQpAQCAtNSw3ICs1LDcgQEAKICMgRWFjaCBjb25maWd1cmF0aW9uIG9wdGlvbiBlbmFibGVzIGEgbGlzdCBvZiBmaWxlcy4KIAogb2JqLSQoQ09ORklHX0lOUFVUKQkJKz0gaW5wdXQtY29yZS5vCi1pbnB1dC1jb3JlLW9ianMgOj0gaW5wdXQubyBmZi1jb3JlLm8KK2lucHV0LWNvcmUtb2JqcyA6PSBpbnB1dC5vIGlucHV0LWNvbXBhdC5vIGZmLWNvcmUubwogCiBvYmotJChDT05GSUdfSU5QVVRfRkZfTUVNTEVTUykJKz0gZmYtbWVtbGVzcy5vCiBvYmotJChDT05GSUdfSU5QVVRfUE9MTERFVikJKz0gaW5wdXQtcG9sbGRldi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2V2YnVnLmMgYi9kcml2ZXJzL2lucHV0L2V2YnVnLmMKaW5kZXggMDM1MzYwMS4uZjdjNWMxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9ldmJ1Zy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvZXZidWcuYwpAQCAtMzksNyArMzksNyBAQAogc3RhdGljIHZvaWQgZXZidWdfZXZlbnQoc3RydWN0IGlucHV0X2hhbmRsZSAqaGFuZGxlLCB1bnNpZ25lZCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IGNvZGUsIGludCB2YWx1ZSkKIHsKIAlwcmludGsoS0VSTl9ERUJVRyAiZXZidWcuYzogRXZlbnQuIERldjogJXMsIFR5cGU6ICVkLCBDb2RlOiAlZCwgVmFsdWU6ICVkXG4iLAotCQloYW5kbGUtPmRldi0+ZGV2LmJ1c19pZCwgdHlwZSwgY29kZSwgdmFsdWUpOworCQlkZXZfbmFtZSgmaGFuZGxlLT5kZXYtPmRldiksIHR5cGUsIGNvZGUsIHZhbHVlKTsKIH0KIAogc3RhdGljIGludCBldmJ1Z19jb25uZWN0KHN0cnVjdCBpbnB1dF9oYW5kbGVyICpoYW5kbGVyLCBzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsCkBAIC02NSw3ICs2NSw3IEBACiAJCWdvdG8gZXJyX3VucmVnaXN0ZXJfaGFuZGxlOwogCiAJcHJpbnRrKEtFUk5fREVCVUcgImV2YnVnLmM6IENvbm5lY3RlZCBkZXZpY2U6ICVzICglcyBhdCAlcylcbiIsCi0JCWRldi0+ZGV2LmJ1c19pZCwKKwkJZGV2X25hbWUoJmRldi0+ZGV2KSwKIAkJZGV2LT5uYW1lID86ICJ1bmtub3duIiwKIAkJZGV2LT5waHlzID86ICJ1bmtub3duIik7CiAKQEAgLTgxLDcgKzgxLDcgQEAKIHN0YXRpYyB2b2lkIGV2YnVnX2Rpc2Nvbm5lY3Qoc3RydWN0IGlucHV0X2hhbmRsZSAqaGFuZGxlKQogewogCXByaW50ayhLRVJOX0RFQlVHICJldmJ1Zy5jOiBEaXNjb25uZWN0ZWQgZGV2aWNlOiAlc1xuIiwKLQkJaGFuZGxlLT5kZXYtPmRldi5idXNfaWQpOworCQlkZXZfbmFtZSgmaGFuZGxlLT5kZXYtPmRldikpOwogCiAJaW5wdXRfY2xvc2VfZGV2aWNlKGhhbmRsZSk7CiAJaW5wdXRfdW5yZWdpc3Rlcl9oYW5kbGUoaGFuZGxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvZXZkZXYuYyBiL2RyaXZlcnMvaW5wdXQvZXZkZXYuYwppbmRleCAxMDcwZGIzLi5lZDhiYWEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2V2ZGV2LmMKKysrIGIvZHJpdmVycy9pbnB1dC9ldmRldi5jCkBAIC0xOSw3ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgImlucHV0LWNvbXBhdC5oIgogCiBzdHJ1Y3QgZXZkZXYgewogCWludCBleGlzdDsKQEAgLTI5MCwxODcgKzI5MCw2IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi0jaWZkZWYgQ09ORklHX0NPTVBBVAotCi1zdHJ1Y3QgaW5wdXRfZXZlbnRfY29tcGF0IHsKLQlzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgdGltZTsKLQlfX3UxNiB0eXBlOwotCV9fdTE2IGNvZGU7Ci0JX19zMzIgdmFsdWU7Ci19OwotCi1zdHJ1Y3QgZmZfcGVyaW9kaWNfZWZmZWN0X2NvbXBhdCB7Ci0JX191MTYgd2F2ZWZvcm07Ci0JX191MTYgcGVyaW9kOwotCV9fczE2IG1hZ25pdHVkZTsKLQlfX3MxNiBvZmZzZXQ7Ci0JX191MTYgcGhhc2U7Ci0KLQlzdHJ1Y3QgZmZfZW52ZWxvcGUgZW52ZWxvcGU7Ci0KLQlfX3UzMiBjdXN0b21fbGVuOwotCWNvbXBhdF91cHRyX3QgY3VzdG9tX2RhdGE7Ci19OwotCi1zdHJ1Y3QgZmZfZWZmZWN0X2NvbXBhdCB7Ci0JX191MTYgdHlwZTsKLQlfX3MxNiBpZDsKLQlfX3UxNiBkaXJlY3Rpb247Ci0Jc3RydWN0IGZmX3RyaWdnZXIgdHJpZ2dlcjsKLQlzdHJ1Y3QgZmZfcmVwbGF5IHJlcGxheTsKLQotCXVuaW9uIHsKLQkJc3RydWN0IGZmX2NvbnN0YW50X2VmZmVjdCBjb25zdGFudDsKLQkJc3RydWN0IGZmX3JhbXBfZWZmZWN0IHJhbXA7Ci0JCXN0cnVjdCBmZl9wZXJpb2RpY19lZmZlY3RfY29tcGF0IHBlcmlvZGljOwotCQlzdHJ1Y3QgZmZfY29uZGl0aW9uX2VmZmVjdCBjb25kaXRpb25bMl07IC8qIE9uZSBmb3IgZWFjaCBheGlzICovCi0JCXN0cnVjdCBmZl9ydW1ibGVfZWZmZWN0IHJ1bWJsZTsKLQl9IHU7Ci19OwotCi0vKiBOb3RlIHRvIHRoZSBhdXRob3Igb2YgdGhpcyBjb2RlOiBkaWQgaXQgZXZlciBvY2N1ciB0bwotICAgeW91IHdoeSB0aGUgaWZkZWZzIGFyZSBuZWVkZWQ/IFRoaW5rIGFib3V0IGl0IGFnYWluLiAtQUsgKi8KLSNpZmRlZiBDT05GSUdfWDg2XzY0Ci0jICBkZWZpbmUgQ09NUEFUX1RFU1QgaXNfY29tcGF0X3Rhc2soKQotI2VsaWYgZGVmaW5lZChDT05GSUdfSUE2NCkKLSMgIGRlZmluZSBDT01QQVRfVEVTVCBJU19JQTMyX1BST0NFU1ModGFza19wdF9yZWdzKGN1cnJlbnQpKQotI2VsaWYgZGVmaW5lZChDT05GSUdfUzM5MCkKLSMgIGRlZmluZSBDT01QQVRfVEVTVCB0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMUJJVCkKLSNlbGlmIGRlZmluZWQoQ09ORklHX01JUFMpCi0jICBkZWZpbmUgQ09NUEFUX1RFU1QgdGVzdF90aHJlYWRfZmxhZyhUSUZfMzJCSVRfQUREUikKLSNlbHNlCi0jICBkZWZpbmUgQ09NUEFUX1RFU1QgdGVzdF90aHJlYWRfZmxhZyhUSUZfMzJCSVQpCi0jZW5kaWYKLQotc3RhdGljIGlubGluZSBzaXplX3QgZXZkZXZfZXZlbnRfc2l6ZSh2b2lkKQotewotCXJldHVybiBDT01QQVRfVEVTVCA/Ci0JCXNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnRfY29tcGF0KSA6IHNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnQpOwotfQotCi1zdGF0aWMgaW50IGV2ZGV2X2V2ZW50X2Zyb21fdXNlcihjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAotCQkJCSBzdHJ1Y3QgaW5wdXRfZXZlbnQgKmV2ZW50KQotewotCWlmIChDT01QQVRfVEVTVCkgewotCQlzdHJ1Y3QgaW5wdXRfZXZlbnRfY29tcGF0IGNvbXBhdF9ldmVudDsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNvbXBhdF9ldmVudCwgYnVmZmVyLAotCQkJCSAgIHNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnRfY29tcGF0KSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlldmVudC0+dGltZS50dl9zZWMgPSBjb21wYXRfZXZlbnQudGltZS50dl9zZWM7Ci0JCWV2ZW50LT50aW1lLnR2X3VzZWMgPSBjb21wYXRfZXZlbnQudGltZS50dl91c2VjOwotCQlldmVudC0+dHlwZSA9IGNvbXBhdF9ldmVudC50eXBlOwotCQlldmVudC0+Y29kZSA9IGNvbXBhdF9ldmVudC5jb2RlOwotCQlldmVudC0+dmFsdWUgPSBjb21wYXRfZXZlbnQudmFsdWU7Ci0KLQl9IGVsc2UgewotCQlpZiAoY29weV9mcm9tX3VzZXIoZXZlbnQsIGJ1ZmZlciwgc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudCkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZXZkZXZfZXZlbnRfdG9fdXNlcihjaGFyIF9fdXNlciAqYnVmZmVyLAotCQkJCWNvbnN0IHN0cnVjdCBpbnB1dF9ldmVudCAqZXZlbnQpCi17Ci0JaWYgKENPTVBBVF9URVNUKSB7Ci0JCXN0cnVjdCBpbnB1dF9ldmVudF9jb21wYXQgY29tcGF0X2V2ZW50OwotCi0JCWNvbXBhdF9ldmVudC50aW1lLnR2X3NlYyA9IGV2ZW50LT50aW1lLnR2X3NlYzsKLQkJY29tcGF0X2V2ZW50LnRpbWUudHZfdXNlYyA9IGV2ZW50LT50aW1lLnR2X3VzZWM7Ci0JCWNvbXBhdF9ldmVudC50eXBlID0gZXZlbnQtPnR5cGU7Ci0JCWNvbXBhdF9ldmVudC5jb2RlID0gZXZlbnQtPmNvZGU7Ci0JCWNvbXBhdF9ldmVudC52YWx1ZSA9IGV2ZW50LT52YWx1ZTsKLQotCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgJmNvbXBhdF9ldmVudCwKLQkJCQkgc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudF9jb21wYXQpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JfSBlbHNlIHsKLQkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIGV2ZW50LCBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50KSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBldmRldl9mZl9lZmZlY3RfZnJvbV91c2VyKGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBzaXplLAotCQkJCSAgICAgc3RydWN0IGZmX2VmZmVjdCAqZWZmZWN0KQotewotCWlmIChDT01QQVRfVEVTVCkgewotCQlzdHJ1Y3QgZmZfZWZmZWN0X2NvbXBhdCAqY29tcGF0X2VmZmVjdDsKLQotCQlpZiAoc2l6ZSAhPSBzaXplb2Yoc3RydWN0IGZmX2VmZmVjdF9jb21wYXQpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJLyoKLQkJICogSXQgc28gaGFwcGVucyB0aGF0IHRoZSBwb2ludGVyIHdoaWNoIG5lZWRzIHRvIGJlIGNoYW5nZWQKLQkJICogaXMgdGhlIGxhc3QgZmllbGQgaW4gdGhlIHN0cnVjdHVyZSwgc28gd2UgY2FuIGNvcHkgdGhlCi0JCSAqIHdob2xlIHRoaW5nIGFuZCByZXBsYWNlIGp1c3QgdGhlIHBvaW50ZXIuCi0JCSAqLwotCi0JCWNvbXBhdF9lZmZlY3QgPSAoc3RydWN0IGZmX2VmZmVjdF9jb21wYXQgKillZmZlY3Q7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGNvbXBhdF9lZmZlY3QsIGJ1ZmZlciwKLQkJCQkgICBzaXplb2Yoc3RydWN0IGZmX2VmZmVjdF9jb21wYXQpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWlmIChjb21wYXRfZWZmZWN0LT50eXBlID09IEZGX1BFUklPRElDICYmCi0JCSAgICBjb21wYXRfZWZmZWN0LT51LnBlcmlvZGljLndhdmVmb3JtID09IEZGX0NVU1RPTSkKLQkJCWVmZmVjdC0+dS5wZXJpb2RpYy5jdXN0b21fZGF0YSA9Ci0JCQkJY29tcGF0X3B0cihjb21wYXRfZWZmZWN0LT51LnBlcmlvZGljLmN1c3RvbV9kYXRhKTsKLQl9IGVsc2UgewotCQlpZiAoc2l6ZSAhPSBzaXplb2Yoc3RydWN0IGZmX2VmZmVjdCkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoZWZmZWN0LCBidWZmZXIsIHNpemVvZihzdHJ1Y3QgZmZfZWZmZWN0KSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2Vsc2UKLQotc3RhdGljIGlubGluZSBzaXplX3QgZXZkZXZfZXZlbnRfc2l6ZSh2b2lkKQotewotCXJldHVybiBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50KTsKLX0KLQotc3RhdGljIGludCBldmRldl9ldmVudF9mcm9tX3VzZXIoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKLQkJCQkgc3RydWN0IGlucHV0X2V2ZW50ICpldmVudCkKLXsKLQlpZiAoY29weV9mcm9tX3VzZXIoZXZlbnQsIGJ1ZmZlciwgc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGV2ZGV2X2V2ZW50X3RvX3VzZXIoY2hhciBfX3VzZXIgKmJ1ZmZlciwKLQkJCQljb25zdCBzdHJ1Y3QgaW5wdXRfZXZlbnQgKmV2ZW50KQotewotCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBldmVudCwgc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGV2ZGV2X2ZmX2VmZmVjdF9mcm9tX3VzZXIoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUsCi0JCQkJICAgICBzdHJ1Y3QgZmZfZWZmZWN0ICplZmZlY3QpCi17Ci0JaWYgKHNpemUgIT0gc2l6ZW9mKHN0cnVjdCBmZl9lZmZlY3QpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChjb3B5X2Zyb21fdXNlcihlZmZlY3QsIGJ1ZmZlciwgc2l6ZW9mKHN0cnVjdCBmZl9lZmZlY3QpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2VuZGlmIC8qIENPTkZJR19DT01QQVQgKi8KLQogc3RhdGljIHNzaXplX3QgZXZkZXZfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCiAJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKQEAgLTQ5MCwxNCArMzA5LDE0IEBACiAKIAl3aGlsZSAocmV0dmFsIDwgY291bnQpIHsKIAotCQlpZiAoZXZkZXZfZXZlbnRfZnJvbV91c2VyKGJ1ZmZlciArIHJldHZhbCwgJmV2ZW50KSkgeworCQlpZiAoaW5wdXRfZXZlbnRfZnJvbV91c2VyKGJ1ZmZlciArIHJldHZhbCwgJmV2ZW50KSkgewogCQkJcmV0dmFsID0gLUVGQVVMVDsKIAkJCWdvdG8gb3V0OwogCQl9CiAKIAkJaW5wdXRfaW5qZWN0X2V2ZW50KCZldmRldi0+aGFuZGxlLAogCQkJCSAgIGV2ZW50LnR5cGUsIGV2ZW50LmNvZGUsIGV2ZW50LnZhbHVlKTsKLQkJcmV0dmFsICs9IGV2ZGV2X2V2ZW50X3NpemUoKTsKKwkJcmV0dmFsICs9IGlucHV0X2V2ZW50X3NpemUoKTsKIAl9CiAKICBvdXQ6CkBAIC01MzEsNyArMzUwLDcgQEAKIAlzdHJ1Y3QgaW5wdXRfZXZlbnQgZXZlbnQ7CiAJaW50IHJldHZhbDsKIAotCWlmIChjb3VudCA8IGV2ZGV2X2V2ZW50X3NpemUoKSkKKwlpZiAoY291bnQgPCBpbnB1dF9ldmVudF9zaXplKCkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGNsaWVudC0+aGVhZCA9PSBjbGllbnQtPnRhaWwgJiYgZXZkZXYtPmV4aXN0ICYmCkBAIC01NDYsMTMgKzM2NSwxMyBAQAogCWlmICghZXZkZXYtPmV4aXN0KQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXdoaWxlIChyZXR2YWwgKyBldmRldl9ldmVudF9zaXplKCkgPD0gY291bnQgJiYKKwl3aGlsZSAocmV0dmFsICsgaW5wdXRfZXZlbnRfc2l6ZSgpIDw9IGNvdW50ICYmCiAJICAgICAgIGV2ZGV2X2ZldGNoX25leHRfZXZlbnQoY2xpZW50LCAmZXZlbnQpKSB7CiAKLQkJaWYgKGV2ZGV2X2V2ZW50X3RvX3VzZXIoYnVmZmVyICsgcmV0dmFsLCAmZXZlbnQpKQorCQlpZiAoaW5wdXRfZXZlbnRfdG9fdXNlcihidWZmZXIgKyByZXR2YWwsICZldmVudCkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAotCQlyZXR2YWwgKz0gZXZkZXZfZXZlbnRfc2l6ZSgpOworCQlyZXR2YWwgKz0gaW5wdXRfZXZlbnRfc2l6ZSgpOwogCX0KIAogCXJldHVybiByZXR2YWw7CkBAIC04MjMsNyArNjQyLDcgQEAKIAogCQkJaWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKEVWSU9DU0ZGKSkgewogCi0JCQkJaWYgKGV2ZGV2X2ZmX2VmZmVjdF9mcm9tX3VzZXIocCwgX0lPQ19TSVpFKGNtZCksICZlZmZlY3QpKQorCQkJCWlmIChpbnB1dF9mZl9lZmZlY3RfZnJvbV91c2VyKHAsIF9JT0NfU0laRShjbWQpLCAmZWZmZWN0KSkKIAkJCQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkJCQllcnJvciA9IGlucHV0X2ZmX3VwbG9hZChkZXYsICZlZmZlY3QsIGZpbGUpOwpAQCAtMTAwMCw3ICs4MTksNyBAQAogCWV2ZGV2LT5oYW5kbGUuaGFuZGxlciA9IGhhbmRsZXI7CiAJZXZkZXYtPmhhbmRsZS5wcml2YXRlID0gZXZkZXY7CiAKLQlzdHJsY3B5KGV2ZGV2LT5kZXYuYnVzX2lkLCBldmRldi0+bmFtZSwgc2l6ZW9mKGV2ZGV2LT5kZXYuYnVzX2lkKSk7CisJZGV2X3NldF9uYW1lKCZldmRldi0+ZGV2LCBldmRldi0+bmFtZSk7CiAJZXZkZXYtPmRldi5kZXZ0ID0gTUtERVYoSU5QVVRfTUFKT1IsIEVWREVWX01JTk9SX0JBU0UgKyBtaW5vcik7CiAJZXZkZXYtPmRldi5jbGFzcyA9ICZpbnB1dF9jbGFzczsKIAlldmRldi0+ZGV2LnBhcmVudCA9ICZkZXYtPmRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvZ2FtZXBvcnQuYyBiL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvZ2FtZXBvcnQuYwppbmRleCAyODgwZWFhLi5lYmY0YmU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L2dhbWVwb3J0LmMKKysrIGIvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9nYW1lcG9ydC5jCkBAIC01MzAsOCArNTMwLDcgQEAKIAogCW11dGV4X2luaXQoJmdhbWVwb3J0LT5kcnZfbXV0ZXgpOwogCWRldmljZV9pbml0aWFsaXplKCZnYW1lcG9ydC0+ZGV2KTsKLQlzbnByaW50ZihnYW1lcG9ydC0+ZGV2LmJ1c19pZCwgc2l6ZW9mKGdhbWVwb3J0LT5kZXYuYnVzX2lkKSwKLQkJICJnYW1lcG9ydCVsdSIsICh1bnNpZ25lZCBsb25nKWF0b21pY19pbmNfcmV0dXJuKCZnYW1lcG9ydF9ubykgLSAxKTsKKwlkZXZfc2V0X25hbWUoJmdhbWVwb3J0LT5kZXYsICJnYW1lcG9ydCVsdSIsICh1bnNpZ25lZCBsb25nKWF0b21pY19pbmNfcmV0dXJuKCZnYW1lcG9ydF9ubykgLSAxKTsKIAlnYW1lcG9ydC0+ZGV2LmJ1cyA9ICZnYW1lcG9ydF9idXM7CiAJZ2FtZXBvcnQtPmRldi5yZWxlYXNlID0gZ2FtZXBvcnRfcmVsZWFzZV9wb3J0OwogCWlmIChnYW1lcG9ydC0+cGFyZW50KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9uczU1OC5jIGIvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9uczU1OC5jCmluZGV4IDJiMjgyY2QuLmRiNTU2YjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvbnM1NTguYworKysgYi9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L25zNTU4LmMKQEAgLTIyNiw3ICsyMjYsNyBAQAogCW5zNTU4LT5nYW1lcG9ydCA9IHBvcnQ7CiAKIAlnYW1lcG9ydF9zZXRfbmFtZShwb3J0LCAiTlM1NTggUG5QIEdhbWVwb3J0Iik7Ci0JZ2FtZXBvcnRfc2V0X3BoeXMocG9ydCwgInBucCVzL2dhbWVwb3J0MCIsIGRldi0+ZGV2LmJ1c19pZCk7CisJZ2FtZXBvcnRfc2V0X3BoeXMocG9ydCwgInBucCVzL2dhbWVwb3J0MCIsIGRldl9uYW1lKCZkZXYtPmRldikpOwogCXBvcnQtPmRldi5wYXJlbnQgPSAmZGV2LT5kZXY7CiAJcG9ydC0+aW8gPSBpb3BvcnQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvaW5wdXQtY29tcGF0LmMgYi9kcml2ZXJzL2lucHV0L2lucHV0LWNvbXBhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhY2NiODkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lucHV0L2lucHV0LWNvbXBhdC5jCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogMzJiaXQgY29tcGF0aWJpbGl0eSB3cmFwcGVycyBmb3IgdGhlIGlucHV0IHN1YnN5c3RlbS4KKyAqCisgKiBWZXJ5IGhlYXZpbHkgYmFzZWQgb24gZXZkZXYuYyAtIENvcHlyaWdodCAoYykgMTk5OS0yMDAyIFZvanRlY2ggUGF2bGlrCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlICJpbnB1dC1jb21wYXQuaCIKKworI2lmZGVmIENPTkZJR19DT01QQVQKKworaW50IGlucHV0X2V2ZW50X2Zyb21fdXNlcihjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJICBzdHJ1Y3QgaW5wdXRfZXZlbnQgKmV2ZW50KQoreworCWlmIChJTlBVVF9DT01QQVRfVEVTVCkgeworCQlzdHJ1Y3QgaW5wdXRfZXZlbnRfY29tcGF0IGNvbXBhdF9ldmVudDsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmNvbXBhdF9ldmVudCwgYnVmZmVyLAorCQkJCSAgIHNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnRfY29tcGF0KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlldmVudC0+dGltZS50dl9zZWMgPSBjb21wYXRfZXZlbnQudGltZS50dl9zZWM7CisJCWV2ZW50LT50aW1lLnR2X3VzZWMgPSBjb21wYXRfZXZlbnQudGltZS50dl91c2VjOworCQlldmVudC0+dHlwZSA9IGNvbXBhdF9ldmVudC50eXBlOworCQlldmVudC0+Y29kZSA9IGNvbXBhdF9ldmVudC5jb2RlOworCQlldmVudC0+dmFsdWUgPSBjb21wYXRfZXZlbnQudmFsdWU7CisKKwl9IGVsc2UgeworCQlpZiAoY29weV9mcm9tX3VzZXIoZXZlbnQsIGJ1ZmZlciwgc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBpbnB1dF9ldmVudF90b191c2VyKGNoYXIgX191c2VyICpidWZmZXIsCisJCQljb25zdCBzdHJ1Y3QgaW5wdXRfZXZlbnQgKmV2ZW50KQoreworCWlmIChJTlBVVF9DT01QQVRfVEVTVCkgeworCQlzdHJ1Y3QgaW5wdXRfZXZlbnRfY29tcGF0IGNvbXBhdF9ldmVudDsKKworCQljb21wYXRfZXZlbnQudGltZS50dl9zZWMgPSBldmVudC0+dGltZS50dl9zZWM7CisJCWNvbXBhdF9ldmVudC50aW1lLnR2X3VzZWMgPSBldmVudC0+dGltZS50dl91c2VjOworCQljb21wYXRfZXZlbnQudHlwZSA9IGV2ZW50LT50eXBlOworCQljb21wYXRfZXZlbnQuY29kZSA9IGV2ZW50LT5jb2RlOworCQljb21wYXRfZXZlbnQudmFsdWUgPSBldmVudC0+dmFsdWU7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsICZjb21wYXRfZXZlbnQsCisJCQkJIHNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnRfY29tcGF0KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCX0gZWxzZSB7CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBldmVudCwgc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBpbnB1dF9mZl9lZmZlY3RfZnJvbV91c2VyKGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBzaXplLAorCQkJICAgICAgc3RydWN0IGZmX2VmZmVjdCAqZWZmZWN0KQoreworCWlmIChJTlBVVF9DT01QQVRfVEVTVCkgeworCQlzdHJ1Y3QgZmZfZWZmZWN0X2NvbXBhdCAqY29tcGF0X2VmZmVjdDsKKworCQlpZiAoc2l6ZSAhPSBzaXplb2Yoc3RydWN0IGZmX2VmZmVjdF9jb21wYXQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJLyoKKwkJICogSXQgc28gaGFwcGVucyB0aGF0IHRoZSBwb2ludGVyIHdoaWNoIG5lZWRzIHRvIGJlIGNoYW5nZWQKKwkJICogaXMgdGhlIGxhc3QgZmllbGQgaW4gdGhlIHN0cnVjdHVyZSwgc28gd2UgY2FuIHJldHJpZXZlIHRoZQorCQkgKiB3aG9sZSB0aGluZyBhbmQgcmVwbGFjZSBqdXN0IHRoZSBwb2ludGVyLgorCQkgKi8KKwkJY29tcGF0X2VmZmVjdCA9IChzdHJ1Y3QgZmZfZWZmZWN0X2NvbXBhdCAqKWVmZmVjdDsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoY29tcGF0X2VmZmVjdCwgYnVmZmVyLAorCQkJCSAgIHNpemVvZihzdHJ1Y3QgZmZfZWZmZWN0X2NvbXBhdCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKGNvbXBhdF9lZmZlY3QtPnR5cGUgPT0gRkZfUEVSSU9ESUMgJiYKKwkJICAgIGNvbXBhdF9lZmZlY3QtPnUucGVyaW9kaWMud2F2ZWZvcm0gPT0gRkZfQ1VTVE9NKQorCQkJZWZmZWN0LT51LnBlcmlvZGljLmN1c3RvbV9kYXRhID0KKwkJCQljb21wYXRfcHRyKGNvbXBhdF9lZmZlY3QtPnUucGVyaW9kaWMuY3VzdG9tX2RhdGEpOworCX0gZWxzZSB7CisJCWlmIChzaXplICE9IHNpemVvZihzdHJ1Y3QgZmZfZWZmZWN0KSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChjb3B5X2Zyb21fdXNlcihlZmZlY3QsIGJ1ZmZlciwgc2l6ZW9mKHN0cnVjdCBmZl9lZmZlY3QpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiAwOworfQorCisjZWxzZQorCitpbnQgaW5wdXRfZXZlbnRfZnJvbV91c2VyKGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkgc3RydWN0IGlucHV0X2V2ZW50ICpldmVudCkKK3sKKwlpZiAoY29weV9mcm9tX3VzZXIoZXZlbnQsIGJ1ZmZlciwgc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCitpbnQgaW5wdXRfZXZlbnRfdG9fdXNlcihjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJY29uc3Qgc3RydWN0IGlucHV0X2V2ZW50ICpldmVudCkKK3sKKwlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgZXZlbnQsIHNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGlucHV0X2ZmX2VmZmVjdF9mcm9tX3VzZXIoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUsCisJCQkgICAgICBzdHJ1Y3QgZmZfZWZmZWN0ICplZmZlY3QpCit7CisJaWYgKHNpemUgIT0gc2l6ZW9mKHN0cnVjdCBmZl9lZmZlY3QpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcihlZmZlY3QsIGJ1ZmZlciwgc2l6ZW9mKHN0cnVjdCBmZl9lZmZlY3QpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIENPTkZJR19DT01QQVQgKi8KKworRVhQT1JUX1NZTUJPTF9HUEwoaW5wdXRfZXZlbnRfZnJvbV91c2VyKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGlucHV0X2V2ZW50X3RvX3VzZXIpOworRVhQT1JUX1NZTUJPTF9HUEwoaW5wdXRfZmZfZWZmZWN0X2Zyb21fdXNlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2lucHV0LWNvbXBhdC5oIGIvZHJpdmVycy9pbnB1dC9pbnB1dC1jb21wYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2NkOWVhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbnB1dC9pbnB1dC1jb21wYXQuaApAQCAtMCwwICsxLDk0IEBACisjaWZuZGVmIF9JTlBVVF9DT01QQVRfSAorI2RlZmluZSBfSU5QVVRfQ09NUEFUX0gKKworLyoKKyAqIDMyYml0IGNvbXBhdGliaWxpdHkgd3JhcHBlcnMgZm9yIHRoZSBpbnB1dCBzdWJzeXN0ZW0uCisgKgorICogVmVyeSBoZWF2aWx5IGJhc2VkIG9uIGV2ZGV2LmMgLSBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMiBWb2p0ZWNoIFBhdmxpaworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKworI2lmZGVmIENPTkZJR19DT01QQVQKKworLyogTm90ZSB0byB0aGUgYXV0aG9yIG9mIHRoaXMgY29kZTogZGlkIGl0IGV2ZXIgb2NjdXIgdG8KKyAgIHlvdSB3aHkgdGhlIGlmZGVmcyBhcmUgbmVlZGVkPyBUaGluayBhYm91dCBpdCBhZ2Fpbi4gLUFLICovCisjaWZkZWYgQ09ORklHX1g4Nl82NAorIyAgZGVmaW5lIElOUFVUX0NPTVBBVF9URVNUIGlzX2NvbXBhdF90YXNrKCkKKyNlbGlmIGRlZmluZWQoQ09ORklHX0lBNjQpCisjICBkZWZpbmUgSU5QVVRfQ09NUEFUX1RFU1QgSVNfSUEzMl9QUk9DRVNTKHRhc2tfcHRfcmVncyhjdXJyZW50KSkKKyNlbGlmIGRlZmluZWQoQ09ORklHX1MzOTApCisjICBkZWZpbmUgSU5QVVRfQ09NUEFUX1RFU1QgdGVzdF90aHJlYWRfZmxhZyhUSUZfMzFCSVQpCisjZWxpZiBkZWZpbmVkKENPTkZJR19NSVBTKQorIyAgZGVmaW5lIElOUFVUX0NPTVBBVF9URVNUIHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMyQklUX0FERFIpCisjZWxzZQorIyAgZGVmaW5lIElOUFVUX0NPTVBBVF9URVNUIHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMyQklUKQorI2VuZGlmCisKK3N0cnVjdCBpbnB1dF9ldmVudF9jb21wYXQgeworCXN0cnVjdCBjb21wYXRfdGltZXZhbCB0aW1lOworCV9fdTE2IHR5cGU7CisJX191MTYgY29kZTsKKwlfX3MzMiB2YWx1ZTsKK307CisKK3N0cnVjdCBmZl9wZXJpb2RpY19lZmZlY3RfY29tcGF0IHsKKwlfX3UxNiB3YXZlZm9ybTsKKwlfX3UxNiBwZXJpb2Q7CisJX19zMTYgbWFnbml0dWRlOworCV9fczE2IG9mZnNldDsKKwlfX3UxNiBwaGFzZTsKKworCXN0cnVjdCBmZl9lbnZlbG9wZSBlbnZlbG9wZTsKKworCV9fdTMyIGN1c3RvbV9sZW47CisJY29tcGF0X3VwdHJfdCBjdXN0b21fZGF0YTsKK307CisKK3N0cnVjdCBmZl9lZmZlY3RfY29tcGF0IHsKKwlfX3UxNiB0eXBlOworCV9fczE2IGlkOworCV9fdTE2IGRpcmVjdGlvbjsKKwlzdHJ1Y3QgZmZfdHJpZ2dlciB0cmlnZ2VyOworCXN0cnVjdCBmZl9yZXBsYXkgcmVwbGF5OworCisJdW5pb24geworCQlzdHJ1Y3QgZmZfY29uc3RhbnRfZWZmZWN0IGNvbnN0YW50OworCQlzdHJ1Y3QgZmZfcmFtcF9lZmZlY3QgcmFtcDsKKwkJc3RydWN0IGZmX3BlcmlvZGljX2VmZmVjdF9jb21wYXQgcGVyaW9kaWM7CisJCXN0cnVjdCBmZl9jb25kaXRpb25fZWZmZWN0IGNvbmRpdGlvblsyXTsgLyogT25lIGZvciBlYWNoIGF4aXMgKi8KKwkJc3RydWN0IGZmX3J1bWJsZV9lZmZlY3QgcnVtYmxlOworCX0gdTsKK307CisKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IGlucHV0X2V2ZW50X3NpemUodm9pZCkKK3sKKwlyZXR1cm4gSU5QVVRfQ09NUEFUX1RFU1QgPworCQlzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50X2NvbXBhdCkgOiBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50KTsKK30KKworI2Vsc2UKKworc3RhdGljIGlubGluZSBzaXplX3QgaW5wdXRfZXZlbnRfc2l6ZSh2b2lkKQoreworCXJldHVybiBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50KTsKK30KKworI2VuZGlmIC8qIENPTkZJR19DT01QQVQgKi8KKworaW50IGlucHV0X2V2ZW50X2Zyb21fdXNlcihjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJIHN0cnVjdCBpbnB1dF9ldmVudCAqZXZlbnQpOworCitpbnQgaW5wdXRfZXZlbnRfdG9fdXNlcihjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJY29uc3Qgc3RydWN0IGlucHV0X2V2ZW50ICpldmVudCk7CisKK2ludCBpbnB1dF9mZl9lZmZlY3RfZnJvbV91c2VyKGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBzaXplLAorCQkJICAgICAgc3RydWN0IGZmX2VmZmVjdCAqZWZmZWN0KTsKKworI2VuZGlmIC8qIF9JTlBVVF9DT01QQVRfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9pbnB1dC5jIGIvZHJpdmVycy9pbnB1dC9pbnB1dC5jCmluZGV4IGMxM2NlZDMuLjE3MzBkNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvaW5wdXQuYworKysgYi9kcml2ZXJzL2lucHV0L2lucHV0LmMKQEAgLTEzODksOCArMTM4OSw4IEBACiAJaWYgKCFkZXYtPnNldGtleWNvZGUpCiAJCWRldi0+c2V0a2V5Y29kZSA9IGlucHV0X2RlZmF1bHRfc2V0a2V5Y29kZTsKIAotCXNucHJpbnRmKGRldi0+ZGV2LmJ1c19pZCwgc2l6ZW9mKGRldi0+ZGV2LmJ1c19pZCksCi0JCSAiaW5wdXQlbGQiLCAodW5zaWduZWQgbG9uZykgYXRvbWljX2luY19yZXR1cm4oJmlucHV0X25vKSAtIDEpOworCWRldl9zZXRfbmFtZSgmZGV2LT5kZXYsICJpbnB1dCVsZCIsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcpIGF0b21pY19pbmNfcmV0dXJuKCZpbnB1dF9ubykgLSAxKTsKIAogCWVycm9yID0gZGV2aWNlX2FkZCgmZGV2LT5kZXYpOwogCWlmIChlcnJvcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95ZGV2LmMgYi9kcml2ZXJzL2lucHV0L2pveWRldi5jCmluZGV4IGE4NWIxNDguLjZmMjM2NjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95ZGV2LmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lkZXYuYwpAQCAtODAwLDcgKzgwMCw3IEBACiAJCX0KIAl9CiAKLQlzdHJsY3B5KGpveWRldi0+ZGV2LmJ1c19pZCwgam95ZGV2LT5uYW1lLCBzaXplb2Yoam95ZGV2LT5kZXYuYnVzX2lkKSk7CisJZGV2X3NldF9uYW1lKCZqb3lkZXYtPmRldiwgam95ZGV2LT5uYW1lKTsKIAlqb3lkZXYtPmRldi5kZXZ0ID0gTUtERVYoSU5QVVRfTUFKT1IsIEpPWURFVl9NSU5PUl9CQVNFICsgbWlub3IpOwogCWpveWRldi0+ZGV2LmNsYXNzID0gJmlucHV0X2NsYXNzOwogCWpveWRldi0+ZGV2LnBhcmVudCA9ICZkZXYtPmRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svS2NvbmZpZyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svS2NvbmZpZwppbmRleCBiZTVjMTRhLi5iMTE0MTk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL0tjb25maWcKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9LY29uZmlnCkBAIC0yOTQsNCArMjk0LDI4IEBACiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBMRUQgd2hpY2ggc3Vycm91bmRzIHRoZSBCaWcgWCBvbgogCSAgWEJveCAzNjAgY29udHJvbGxlci4KIAorY29uZmlnIEpPWVNUSUNLX1dBTEtFUkEwNzAxCisJdHJpc3RhdGUgIldhbGtlcmEgV0stMDcwMSBSQyB0cmFuc21pdHRlciIKKwlkZXBlbmRzIG9uIEhJR0hfUkVTX1RJTUVSUyAmJiBQQVJQT1JUCisJaGVscAorCSAgU2F5IFkgb3IgTSBoZXJlIGlmIHlvdSBoYXZlIGEgV2Fsa2VyYSBXSy0wNzAxIHRyYW5zbWl0dGVyIHdoaWNoIGlzCisJICBzdXBwbGllZCB3aXRoIGEgcmVhZHkgdG8gZmx5IFdhbGtlcmEgaGVsaWNvcHRlcnMgc3VjaCBhcyBITTM2LAorCSAgSE0zNywgSE02MCBhbmQgd2FudCB0byB1c2UgaXQgdmlhIHBhcnBvcnQgYXMgYSBqb3lzdGljay4gTW9yZQorCSAgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlOiA8ZmlsZTpEb2N1bWVudGF0aW9uL2lucHV0L3dhbGtlcmEwNzAxLnR4dD4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgd2Fsa2VyYTA3MDEuCisKK2NvbmZpZyBKT1lTVElDS19NQVBMRQorCXRyaXN0YXRlICJEcmVhbWNhc3QgY29udHJvbCBwYWQiCisJZGVwZW5kcyBvbiBNQVBMRQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBTRUdBIERyZWFtY2FzdCBhbmQgd2FudCB0byB1c2UgeW91cgorCSAgY29udHJvbGxlciBhcyBhIGpveXN0aWNrLgorCisJICBNb3N0IERyZWFtY2FzdCB1c2VycyB3aWxsIHNheSBZLgorCisJICBUbyBjb21waWxlIHRoaXMgYXMgYSBtb2R1bGUgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZAorCSAgbWFwbGVjb250cm9sLgorCiBlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9NYWtlZmlsZSBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svTWFrZWZpbGUKaW5kZXggZmRiZjhjNC4uZjNhOGNiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL01ha2VmaWxlCkBAIC0xOSw2ICsxOSw3IEBACiBvYmotJChDT05GSUdfSk9ZU1RJQ0tfSU5URVJBQ1QpCQkrPSBpbnRlcmFjdC5vCiBvYmotJChDT05GSUdfSk9ZU1RJQ0tfSk9ZRFVNUCkJCSs9IGpveWR1bXAubwogb2JqLSQoQ09ORklHX0pPWVNUSUNLX01BR0VMTEFOKQkJKz0gbWFnZWxsYW4ubworb2JqLSQoQ09ORklHX0pPWVNUSUNLX01BUExFKQkJKz0gbWFwbGVjb250cm9sLm8KIG9iai0kKENPTkZJR19KT1lTVElDS19TSURFV0lOREVSKQkrPSBzaWRld2luZGVyLm8KIG9iai0kKENPTkZJR19KT1lTVElDS19TUEFDRUJBTEwpCSs9IHNwYWNlYmFsbC5vCiBvYmotJChDT05GSUdfSk9ZU1RJQ0tfU1BBQ0VPUkIpCQkrPSBzcGFjZW9yYi5vCkBAIC0yOSw0ICszMCw1IEBACiBvYmotJChDT05GSUdfSk9ZU1RJQ0tfV0FSUklPUikJCSs9IHdhcnJpb3Iubwogb2JqLSQoQ09ORklHX0pPWVNUSUNLX1hQQUQpCQkrPSB4cGFkLm8KIG9iai0kKENPTkZJR19KT1lTVElDS19aSEVOSFVBKQkJKz0gemhlbmh1YS5vCitvYmotJChDT05GSUdfSk9ZU1RJQ0tfV0FMS0VSQTA3MDEpCSs9IHdhbGtlcmEwNzAxLm8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9tYXBsZWNvbnRyb2wuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svbWFwbGVjb250cm9sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUwMDQ3YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svbWFwbGVjb250cm9sLmMKQEAgLTAsMCArMSwxOTMgQEAKKy8qCisgKglTRUdBIERyZWFtY2FzdCBjb250cm9sbGVyIGRyaXZlcgorICoJQmFzZWQgb24gZHJpdmVycy91c2IvaWZvcmNlLmMKKyAqCisgKglDb3B5cmlnaHQgWWFlZ2FzaGkgVGFrZXNoaSwgMjAwMQorICoJQWRyaWFuIE1jTWVuYW1pbiwgMjAwOAorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tYXBsZS5oPgorCitNT0RVTEVfQVVUSE9SKCJBZHJpYW4gTWNNZW5hbWluIDxhZHJpYW5AbWNtZW4uZGVtb24uY28udWs+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNFR0EgRHJlYW1jYXN0IGNvbnRyb2xsZXIgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0cnVjdCBkY19wYWQgeworCXN0cnVjdCBpbnB1dF9kZXYgKmRldjsKKwlzdHJ1Y3QgbWFwbGVfZGV2aWNlICptZGV2OworfTsKKworc3RhdGljIHZvaWQgZGNfcGFkX2NhbGxiYWNrKHN0cnVjdCBtYXBsZXEgKm1xKQoreworCXVuc2lnbmVkIHNob3J0IGJ1dHRvbnM7CisJc3RydWN0IG1hcGxlX2RldmljZSAqbWFwbGVkZXYgPSBtcS0+ZGV2OworCXN0cnVjdCBkY19wYWQgKnBhZCA9IG1hcGxlX2dldF9kcnZkYXRhKG1hcGxlZGV2KTsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSBwYWQtPmRldjsKKwl1bnNpZ25lZCBjaGFyICpyZXMgPSBtcS0+cmVjdmJ1ZjsKKworCWJ1dHRvbnMgPSB+bGUxNl90b19jcHVwKChfX2xlMTYgKikocmVzICsgOCkpOworCisJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19IQVQwWSwKKwkJKGJ1dHRvbnMgJiAweDAwMTAgPyAtMSA6IDApICsgKGJ1dHRvbnMgJiAweDAwMjAgPyAxIDogMCkpOworCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfSEFUMFgsCisJCShidXR0b25zICYgMHgwMDQwID8gLTEgOiAwKSArIChidXR0b25zICYgMHgwMDgwID8gMSA6IDApKTsKKwlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX0hBVDFZLAorCQkoYnV0dG9ucyAmIDB4MTAwMCA/IC0xIDogMCkgKyAoYnV0dG9ucyAmIDB4MjAwMCA/IDEgOiAwKSk7CisJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19IQVQxWCwKKwkJKGJ1dHRvbnMgJiAweDQwMDAgPyAtMSA6IDApICsgKGJ1dHRvbnMgJiAweDgwMDAgPyAxIDogMCkpOworCisJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9DLCAgICAgIGJ1dHRvbnMgJiAweDAwMDEpOworCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fQiwgICAgICBidXR0b25zICYgMHgwMDAyKTsKKwlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0EsICAgICAgYnV0dG9ucyAmIDB4MDAwNCk7CisJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9TVEFSVCwgIGJ1dHRvbnMgJiAweDAwMDgpOworCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fWiwgICAgICBidXR0b25zICYgMHgwMTAwKTsKKwlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1ksICAgICAgYnV0dG9ucyAmIDB4MDIwMCk7CisJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9YLCAgICAgIGJ1dHRvbnMgJiAweDA0MDApOworCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fU0VMRUNULCBidXR0b25zICYgMHgwODAwKTsKKworCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfR0FTLCAgICByZXNbMTBdKTsKKwlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX0JSQUtFLCAgcmVzWzExXSk7CisJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19YLCAgICAgIHJlc1sxMl0pOworCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWSwgICAgICByZXNbMTNdKTsKKwlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1JYLCAgICAgcmVzWzE0XSk7CisJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19SWSwgICAgIHJlc1sxNV0pOworfQorCitzdGF0aWMgaW50IGRjX3BhZF9vcGVuKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgZGNfcGFkICpwYWQgPSBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJbWFwbGVfZ2V0Y29uZF9jYWxsYmFjayhwYWQtPm1kZXYsIGRjX3BhZF9jYWxsYmFjaywgSFovMjAsCisJCU1BUExFX0ZVTkNfQ09OVFJPTExFUik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGNfcGFkX2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgZGNfcGFkICpwYWQgPSBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJbWFwbGVfZ2V0Y29uZF9jYWxsYmFjayhwYWQtPm1kZXYsIGRjX3BhZF9jYWxsYmFjaywgMCwKKwkJTUFQTEVfRlVOQ19DT05UUk9MTEVSKTsKK30KKworLyogYWxsb3cgdGhlIGNvbnRyb2xsZXIgdG8gYmUgdXNlZCAqLworc3RhdGljIGludCBfX2RldmluaXQgcHJvYmVfbWFwbGVfY29udHJvbGxlcihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RhdGljIGNvbnN0IHNob3J0IGJ0bl9iaXRbMzJdID0geworCQlCVE5fQywgQlROX0IsIEJUTl9BLCBCVE5fU1RBUlQsIC0xLCAtMSwgLTEsIC0xLAorCQlCVE5fWiwgQlROX1ksIEJUTl9YLCBCVE5fU0VMRUNULCAtMSwgLTEsIC0xLCAtMSwKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJfTsKKworCXN0YXRpYyBjb25zdCBzaG9ydCBhYnNfYml0WzMyXSA9IHsKKwkJLTEsIC0xLCAtMSwgLTEsIEFCU19IQVQwWSwgQUJTX0hBVDBZLCBBQlNfSEFUMFgsIEFCU19IQVQwWCwKKwkJLTEsIC0xLCAtMSwgLTEsIEFCU19IQVQxWSwgQUJTX0hBVDFZLCBBQlNfSEFUMVgsIEFCU19IQVQxWCwKKwkJQUJTX0dBUywgQUJTX0JSQUtFLCBBQlNfWCwgQUJTX1ksIEFCU19SWCwgQUJTX1JZLCAtMSwgLTEsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwl9OworCisJc3RydWN0IG1hcGxlX2RldmljZSAqbWRldiA9IHRvX21hcGxlX2RldihkZXYpOworCXN0cnVjdCBtYXBsZV9kcml2ZXIgKm1kcnYgPSB0b19tYXBsZV9kcml2ZXIoZGV2LT5kcml2ZXIpOworCWludCBpLCBlcnJvcjsKKwlzdHJ1Y3QgZGNfcGFkICpwYWQ7CisJc3RydWN0IGlucHV0X2RldiAqaWRldjsKKwl1bnNpZ25lZCBsb25nIGRhdGEgPSBiZTMyX3RvX2NwdShtZGV2LT5kZXZpbmZvLmZ1bmN0aW9uX2RhdGFbMF0pOworCisJcGFkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRjX3BhZCksIEdGUF9LRVJORUwpOworCWlkZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIXBhZCB8fCAhaWRldikgeworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDsKKwl9CisKKwlwYWQtPmRldiA9IGlkZXY7CisJcGFkLT5tZGV2ID0gbWRldjsKKworCWlkZXYtPm9wZW4gPSBkY19wYWRfb3BlbjsKKwlpZGV2LT5jbG9zZSA9IGRjX3BhZF9jbG9zZTsKKworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCWlmIChkYXRhICYgKDEgPDwgaSkpIHsKKwkJCWlmIChidG5fYml0W2ldID49IDApCisJCQkJX19zZXRfYml0KGJ0bl9iaXRbaV0sIGlkZXYtPmtleWJpdCk7CisJCQllbHNlIGlmIChhYnNfYml0W2ldID49IDApCisJCQkJX19zZXRfYml0KGFic19iaXRbaV0sIGlkZXYtPmFic2JpdCk7CisJCX0KKwl9CisKKwlpZiAoaWRldi0+a2V5Yml0W0JJVF9XT1JEKEJUTl9KT1lTVElDSyldKQorCQlpZGV2LT5ldmJpdFswXSB8PSBCSVRfTUFTSyhFVl9LRVkpOworCisJaWYgKGlkZXYtPmFic2JpdFswXSkKKwkJaWRldi0+ZXZiaXRbMF0gfD0gQklUX01BU0soRVZfQUJTKTsKKworCWZvciAoaSA9IEFCU19YOyBpIDw9IEFCU19CUkFLRTsgaSsrKQorCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpZGV2LCBpLCAwLCAyNTUsIDAsIDApOworCisJZm9yIChpID0gQUJTX0hBVDBYOyBpIDw9IEFCU19IQVQzWTsgaSsrKQorCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpZGV2LCBpLCAxLCAtMSwgMCwgMCk7CisKKwlpZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9IHBhZDsKKwlpZGV2LT5kZXYucGFyZW50ID0gJm1kZXYtPmRldjsKKwlpZGV2LT5uYW1lID0gbWRldi0+cHJvZHVjdF9uYW1lOworCWlkZXYtPmlkLmJ1c3R5cGUgPSBCVVNfSE9TVDsKKwlpbnB1dF9zZXRfZHJ2ZGF0YShpZGV2LCBwYWQpOworCisJZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaWRldik7CisJaWYgKGVycm9yKQorCQlnb3RvIGZhaWw7CisKKwltZGV2LT5kcml2ZXIgPSBtZHJ2OworCW1hcGxlX3NldF9kcnZkYXRhKG1kZXYsIHBhZCk7CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwlpbnB1dF9mcmVlX2RldmljZShpZGV2KTsKKwlrZnJlZShwYWQpOworCW1hcGxlX3NldF9kcnZkYXRhKG1kZXYsIE5VTEwpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgcmVtb3ZlX21hcGxlX2NvbnRyb2xsZXIoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBtYXBsZV9kZXZpY2UgKm1kZXYgPSB0b19tYXBsZV9kZXYoZGV2KTsKKwlzdHJ1Y3QgZGNfcGFkICpwYWQgPSBtYXBsZV9nZXRfZHJ2ZGF0YShtZGV2KTsKKworCW1kZXYtPmNhbGxiYWNrID0gTlVMTDsKKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShwYWQtPmRldik7CisJbWFwbGVfc2V0X2RydmRhdGEobWRldiwgTlVMTCk7CisJa2ZyZWUocGFkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG1hcGxlX2RyaXZlciBkY19wYWRfZHJpdmVyID0geworCS5mdW5jdGlvbiA9CU1BUExFX0ZVTkNfQ09OVFJPTExFUiwKKwkuZHJ2ID0geworCQkubmFtZQk9ICJEcmVhbWNhc3RfY29udHJvbGxlciIsCisJCS5wcm9iZQk9IHByb2JlX21hcGxlX2NvbnRyb2xsZXIsCisJCS5yZW1vdmUJPSBfX2RldmV4aXRfcChyZW1vdmVfbWFwbGVfY29udHJvbGxlciksCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRjX3BhZF9pbml0KHZvaWQpCit7CisJcmV0dXJuIG1hcGxlX2RyaXZlcl9yZWdpc3RlcigmZGNfcGFkX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkY19wYWRfZXhpdCh2b2lkKQoreworCW1hcGxlX2RyaXZlcl91bnJlZ2lzdGVyKCZkY19wYWRfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoZGNfcGFkX2luaXQpOworbW9kdWxlX2V4aXQoZGNfcGFkX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay93YWxrZXJhMDcwMS5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay93YWxrZXJhMDcwMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZmExZWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3dhbGtlcmEwNzAxLmMKQEAgLTAsMCArMSwyOTIgQEAKKy8qCisgKiAgUGFyYWxsZWwgcG9ydCB0byBXYWxrZXJhIFdLLTA3MDEgVFggam95c3RpY2sKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA4IFBldGVyIFBvcG92ZWMKKyAqCisgKiAgTW9yZSBhYm91dCBkcml2ZXI6ICA8ZmlsZTpEb2N1bWVudGF0aW9uL2lucHV0L3dhbGtlcmEwNzAxLnR4dD4KKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKy8qICNkZWZpbmUgV0swNzAxX0RFQlVHICovCisKKyNkZWZpbmUgUkVTRVJWRSAyMDAwMAorI2RlZmluZSBTWU5DX1BVTFNFIDEzMDYwMDAKKyNkZWZpbmUgQklOMF9QVUxTRSAyODgwMDAKKyNkZWZpbmUgQklOMV9QVUxTRSA0MzgwMDAKKworI2RlZmluZSBBTkFMT0dfTUlOX1BVTFNFIDMxODAwMAorI2RlZmluZSBBTkFMT0dfTUFYX1BVTFNFIDg3ODAwMAorI2RlZmluZSBBTkFMT0dfREVMVEEgODAwMDAKKworI2RlZmluZSBCSU5fU0FNUExFICgoQklOMF9QVUxTRSArIEJJTjFfUFVMU0UpIC8gMikKKworI2RlZmluZSBOT19TWU5DIDI1CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+CisKK01PRFVMRV9BVVRIT1IoIlBldGVyIFBvcG92ZWMgPHBvcG92ZWNAZmVpLnR1a2Uuc2s+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIldhbGtlcmEgV0stMDcwMSBUWCBhcyBqb3lzdGljayIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgdW5zaWduZWQgaW50IHdhbGtlcmEwNzAxX3BwX25vOworbW9kdWxlX3BhcmFtX25hbWVkKHBvcnQsIHdhbGtlcmEwNzAxX3BwX25vLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhwb3J0LAorCQkgIlBhcmFsbGVsIHBvcnQgYWRhcHRlciBmb3IgV2Fsa2VyYSBXSy0wNzAxIFRYIChkZWZhdWx0IGlzIDApIik7CisKKy8qCisgKiBGb3Igbm93LCBvbmx5IG9uZSBkZXZpY2UgaXMgc3VwcG9ydGVkLCBpZiBzb21lYm9keSBuZWVkIG1vcmUgZGV2aWNlcywgY29kZQorICogY2FuIGJlIGV4cGFuZGVkLCBvbmUgc3RydWN0IHdhbGtlcmFfZGV2IHBlciBkZXZpY2UgbXVzdCBiZSBhbGxvY2F0ZWQgYW5kCisgKiBzZXQgdXAgYnkgd2Fsa2VyYTA3MDFfY29ubmVjdCAocmVsZWFzZSBvZiBkZXZpY2UgYnkgd2Fsa2VyYTA3MDFfZGlzY29ubmVjdCkKKyAqLworCitzdHJ1Y3Qgd2Fsa2VyYV9kZXYgeworCXVuc2lnbmVkIGNoYXIgYnVmWzI1XTsKKwl1NjQgaXJxX3RpbWUsIGlycV9sYXN0dGltZTsKKwlpbnQgY291bnRlcjsKKwlpbnQgYWNrOworCisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OworCXN0cnVjdCBocnRpbWVyIHRpbWVyOworCisJc3RydWN0IHBhcnBvcnQgKnBhcnBvcnQ7CisJc3RydWN0IHBhcmRldmljZSAqcGFyZGV2aWNlOworfTsKKworc3RhdGljIHN0cnVjdCB3YWxrZXJhX2RldiB3X2RldjsKKworc3RhdGljIGlubGluZSB2b2lkIHdhbGtlcmEwNzAxX3BhcnNlX2ZyYW1lKHN0cnVjdCB3YWxrZXJhX2RldiAqdykKK3sKKwlpbnQgaTsKKwlpbnQgdmFsMSwgdmFsMiwgdmFsMywgdmFsNCwgdmFsNSwgdmFsNiwgdmFsNywgdmFsODsKKwlpbnQgY3JjMSwgY3JjMjsKKworCWZvciAoY3JjMSA9IGNyYzIgPSBpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJY3JjMSArPSB3LT5idWZbaV0gJiA3OworCQljcmMyICs9ICh3LT5idWZbaV0gJiA4KSA+PiAzOworCX0KKwlpZiAoKHctPmJ1ZlsxMF0gJiA3KSAhPSAoY3JjMSAmIDcpKQorCQlyZXR1cm47CisJaWYgKCgody0+YnVmWzEwXSAmIDgpID4+IDMpICE9ICgoKGNyYzEgPj4gMykgKyBjcmMyKSAmIDEpKQorCQlyZXR1cm47CisJZm9yIChjcmMxID0gY3JjMiA9IDAsIGkgPSAxMTsgaSA8IDIzOyBpKyspIHsKKwkJY3JjMSArPSB3LT5idWZbaV0gJiA3OworCQljcmMyICs9ICh3LT5idWZbaV0gJiA4KSA+PiAzOworCX0KKwlpZiAoKHctPmJ1ZlsyM10gJiA3KSAhPSAoY3JjMSAmIDcpKQorCQlyZXR1cm47CisJaWYgKCgody0+YnVmWzIzXSAmIDgpID4+IDMpICE9ICgoKGNyYzEgPj4gMykgKyBjcmMyKSAmIDEpKQorCQlyZXR1cm47CisJdmFsMSA9ICgody0+YnVmWzBdICYgNykgKiAyNTYgKyB3LT5idWZbMV0gKiAxNiArIHctPmJ1ZlsyXSkgPj4gMjsKKwl2YWwxICo9ICgody0+YnVmWzBdID4+IDIpICYgMikgLSAxOwkvKiBzaWduICovCisJdmFsMiA9ICh3LT5idWZbMl0gJiAxKSA8PCA4IHwgKHctPmJ1ZlszXSA8PCA0KSB8IHctPmJ1Zls0XTsKKwl2YWwyICo9ICh3LT5idWZbMl0gJiAyKSAtIDE7CS8qIHNpZ24gKi8KKwl2YWwzID0gKCh3LT5idWZbNV0gJiA3KSAqIDI1NiArIHctPmJ1Zls2XSAqIDE2ICsgdy0+YnVmWzddKSA+PiAyOworCXZhbDMgKj0gKCh3LT5idWZbNV0gPj4gMikgJiAyKSAtIDE7CS8qIHNpZ24gKi8KKwl2YWw0ID0gKHctPmJ1Zls3XSAmIDEpIDw8IDggfCAody0+YnVmWzhdIDw8IDQpIHwgdy0+YnVmWzldOworCXZhbDQgKj0gKHctPmJ1Zls3XSAmIDIpIC0gMTsJLyogc2lnbiAqLworCXZhbDUgPSAoKHctPmJ1ZlsxMV0gJiA3KSAqIDI1NiArIHctPmJ1ZlsxMl0gKiAxNiArIHctPmJ1ZlsxM10pID4+IDI7CisJdmFsNSAqPSAoKHctPmJ1ZlsxMV0gPj4gMikgJiAyKSAtIDE7CS8qIHNpZ24gKi8KKwl2YWw2ID0gKHctPmJ1ZlsxM10gJiAxKSA8PCA4IHwgKHctPmJ1ZlsxNF0gPDwgNCkgfCB3LT5idWZbMTVdOworCXZhbDYgKj0gKHctPmJ1ZlsxM10gJiAyKSAtIDE7CS8qIHNpZ24gKi8KKwl2YWw3ID0gKCh3LT5idWZbMTZdICYgNykgKiAyNTYgKyB3LT5idWZbMTddICogMTYgKyB3LT5idWZbMThdKSA+PiAyOworCXZhbDcgKj0gKCh3LT5idWZbMTZdID4+IDIpICYgMikgLSAxOwkvKnNpZ24gKi8KKwl2YWw4ID0gKHctPmJ1ZlsxOF0gJiAxKSA8PCA4IHwgKHctPmJ1ZlsxOV0gPDwgNCkgfCB3LT5idWZbMjBdOworCXZhbDggKj0gKHctPmJ1ZlsxOF0gJiAyKSAtIDE7CS8qc2lnbiAqLworCisjaWZkZWYgV0swNzAxX0RFQlVHCisJeworCQlpbnQgbWFnaWMsIG1hZ2ljX2JpdDsKKwkJbWFnaWMgPSAody0+YnVmWzIxXSA8PCA0KSB8IHctPmJ1ZlsyMl07CisJCW1hZ2ljX2JpdCA9ICh3LT5idWZbMjRdICYgOCkgPj4gMzsKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICJ3YWxrZXJhMDcwMTogJTRkICU0ZCAlNGQgJTRkICAlNGQgJTRkICU0ZCAlNGQgKG1hZ2ljICUyeCAlZClcbiIsCisJCSAgICAgICB2YWwxLCB2YWwyLCB2YWwzLCB2YWw0LCB2YWw1LCB2YWw2LCB2YWw3LCB2YWw4LCBtYWdpYywKKwkJICAgICAgIG1hZ2ljX2JpdCk7CisJfQorI2VuZGlmCisJaW5wdXRfcmVwb3J0X2Ficyh3LT5pbnB1dF9kZXYsIEFCU19YLCB2YWwyKTsKKwlpbnB1dF9yZXBvcnRfYWJzKHctPmlucHV0X2RldiwgQUJTX1ksIHZhbDEpOworCWlucHV0X3JlcG9ydF9hYnMody0+aW5wdXRfZGV2LCBBQlNfWiwgdmFsNik7CisJaW5wdXRfcmVwb3J0X2Ficyh3LT5pbnB1dF9kZXYsIEFCU19USFJPVFRMRSwgdmFsMyk7CisJaW5wdXRfcmVwb3J0X2Ficyh3LT5pbnB1dF9kZXYsIEFCU19SVURERVIsIHZhbDQpOworCWlucHV0X3JlcG9ydF9hYnMody0+aW5wdXRfZGV2LCBBQlNfTUlTQywgdmFsNyk7CisJaW5wdXRfcmVwb3J0X2tleSh3LT5pbnB1dF9kZXYsIEJUTl9HRUFSX0RPV04sIHZhbDUgPiAwKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcmVhZF9hY2soc3RydWN0IHBhcmRldmljZSAqcCkKK3sKKwlyZXR1cm4gcGFycG9ydF9yZWFkX3N0YXR1cyhwLT5wb3J0KSAmIDB4NDA7Cit9CisKKy8qIGZhbGxpbmcgZWRnZSwgcHJlcGFyZSB0byBCSU4gdmFsdWUgY2FsY3VsYXRpb24gKi8KK3N0YXRpYyB2b2lkIHdhbGtlcmEwNzAxX2lycV9oYW5kbGVyKHZvaWQgKmhhbmRsZXJfZGF0YSkKK3sKKwl1NjQgcHVsc2VfdGltZTsKKwlzdHJ1Y3Qgd2Fsa2VyYV9kZXYgKncgPSBoYW5kbGVyX2RhdGE7CisKKwl3LT5pcnFfdGltZSA9IGt0aW1lX3RvX25zKGt0aW1lX2dldCgpKTsKKwlwdWxzZV90aW1lID0gdy0+aXJxX3RpbWUgLSB3LT5pcnFfbGFzdHRpbWU7CisJdy0+aXJxX2xhc3R0aW1lID0gdy0+aXJxX3RpbWU7CisKKwkvKiBjYW5jZWwgdGltZXIsIGlmIGluIGhhbmRsZXIgb3IgYWN0aXZlIGRvIHJlc3luYyAqLworCWlmICh1bmxpa2VseSgwICE9IGhydGltZXJfdHJ5X3RvX2NhbmNlbCgmdy0+dGltZXIpKSkgeworCQl3LT5jb3VudGVyID0gTk9fU1lOQzsKKwkJcmV0dXJuOworCX0KKworCWlmICh3LT5jb3VudGVyIDwgTk9fU1lOQykgeworCQlpZiAody0+YWNrKSB7CisJCQlwdWxzZV90aW1lIC09IEJJTjFfUFVMU0U7CisJCQl3LT5idWZbdy0+Y291bnRlcl0gPSA4OworCQl9IGVsc2UgeworCQkJcHVsc2VfdGltZSAtPSBCSU4wX1BVTFNFOworCQkJdy0+YnVmW3ctPmNvdW50ZXJdID0gMDsKKwkJfQorCQlpZiAody0+Y291bnRlciA9PSAyNCkgewkvKiBmdWxsIGZyYW1lICovCisJCQl3YWxrZXJhMDcwMV9wYXJzZV9mcmFtZSh3KTsKKwkJCXctPmNvdW50ZXIgPSBOT19TWU5DOworCQkJaWYgKGFicyhwdWxzZV90aW1lIC0gU1lOQ19QVUxTRSkgPCBSRVNFUlZFKQkvKiBuZXcgZnJhbWUgc3luYyAqLworCQkJCXctPmNvdW50ZXIgPSAwOworCQl9IGVsc2UgeworCQkJaWYgKChwdWxzZV90aW1lID4gKEFOQUxPR19NSU5fUFVMU0UgLSBSRVNFUlZFKQorCQkJICAgICAmJiAocHVsc2VfdGltZSA8IChBTkFMT0dfTUFYX1BVTFNFICsgUkVTRVJWRSkpKSkgeworCQkJCXB1bHNlX3RpbWUgLT0gKEFOQUxPR19NSU5fUFVMU0UgLSBSRVNFUlZFKTsKKwkJCQlwdWxzZV90aW1lID0gKHUzMikgcHVsc2VfdGltZSAvIEFOQUxPR19ERUxUQTsJLyogb3ZlcnRpcGluZyBpcyBzYWZlLCBwdWxzZXRpbWUgPCBzMzIuLiAqLworCQkJCXctPmJ1Zlt3LT5jb3VudGVyKytdIHw9IChwdWxzZV90aW1lICYgNyk7CisJCQl9IGVsc2UKKwkJCQl3LT5jb3VudGVyID0gTk9fU1lOQzsKKwkJfQorCX0gZWxzZSBpZiAoYWJzKHB1bHNlX3RpbWUgLSBTWU5DX1BVTFNFIC0gQklOMF9QVUxTRSkgPAorCQkJCVJFU0VSVkUgKyBCSU4xX1BVTFNFIC0gQklOMF9QVUxTRSkJLyogZnJhbWUgc3luYyAuLiAqLworCQl3LT5jb3VudGVyID0gMDsKKworCWhydGltZXJfc3RhcnQoJnctPnRpbWVyLCBrdGltZV9zZXQoMCwgQklOX1NBTVBMRSksIEhSVElNRVJfTU9ERV9SRUwpOworfQorCitzdGF0aWMgZW51bSBocnRpbWVyX3Jlc3RhcnQgdGltZXJfaGFuZGxlcihzdHJ1Y3QgaHJ0aW1lcgorCQkJCQkgICpoYW5kbGUpCit7CisJc3RydWN0IHdhbGtlcmFfZGV2ICp3OworCisJdyA9IGNvbnRhaW5lcl9vZihoYW5kbGUsIHN0cnVjdCB3YWxrZXJhX2RldiwgdGltZXIpOworCXctPmFjayA9IHJlYWRfYWNrKHctPnBhcmRldmljZSk7CisKKwlyZXR1cm4gSFJUSU1FUl9OT1JFU1RBUlQ7Cit9CisKK3N0YXRpYyBpbnQgd2Fsa2VyYTA3MDFfb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCit7CisJc3RydWN0IHdhbGtlcmFfZGV2ICp3ID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKKworCXBhcnBvcnRfZW5hYmxlX2lycSh3LT5wYXJwb3J0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgd2Fsa2VyYTA3MDFfY2xvc2Uoc3RydWN0IGlucHV0X2RldiAqZGV2KQoreworCXN0cnVjdCB3YWxrZXJhX2RldiAqdyA9IGlucHV0X2dldF9kcnZkYXRhKGRldik7CisKKwlwYXJwb3J0X2Rpc2FibGVfaXJxKHctPnBhcnBvcnQpOworfQorCitzdGF0aWMgaW50IHdhbGtlcmEwNzAxX2Nvbm5lY3Qoc3RydWN0IHdhbGtlcmFfZGV2ICp3LCBpbnQgcGFycG9ydCkKK3sKKwlpbnQgZXJyID0gLUVOT0RFVjsKKworCXctPnBhcnBvcnQgPSBwYXJwb3J0X2ZpbmRfbnVtYmVyKHBhcnBvcnQpOworCWlmICh3LT5wYXJwb3J0ID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKHctPnBhcnBvcnQtPmlycSA9PSAtMSkgeworCQlwcmludGsoS0VSTl9FUlIgIndhbGtlcmEwNzAxOiBwYXJwb3J0IHdpdGhvdXQgaW50ZXJydXB0XG4iKTsKKwkJZ290byBpbml0X2VycjsKKwl9CisKKwllcnIgPSAtRUJVU1k7CisJdy0+cGFyZGV2aWNlID0gcGFycG9ydF9yZWdpc3Rlcl9kZXZpY2Uody0+cGFycG9ydCwgIndhbGtlcmEwNzAxIiwKKwkJCQkgICAgTlVMTCwgTlVMTCwgd2Fsa2VyYTA3MDFfaXJxX2hhbmRsZXIsCisJCQkJICAgIFBBUlBPUlRfREVWX0VYQ0wsIHcpOworCWlmICghdy0+cGFyZGV2aWNlKQorCQlnb3RvIGluaXRfZXJyOworCisJaWYgKHBhcnBvcnRfbmVnb3RpYXRlKHctPnBhcmRldmljZS0+cG9ydCwgSUVFRTEyODRfTU9ERV9DT01QQVQpKQorCQlnb3RvIGluaXRfZXJyMTsKKworCWlmIChwYXJwb3J0X2NsYWltKHctPnBhcmRldmljZSkpCisJCWdvdG8gaW5pdF9lcnIxOworCisJdy0+aW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKCF3LT5pbnB1dF9kZXYpCisJCWdvdG8gaW5pdF9lcnIyOworCisJaW5wdXRfc2V0X2RydmRhdGEody0+aW5wdXRfZGV2LCB3KTsKKwl3LT5pbnB1dF9kZXYtPm5hbWUgPSAiV2Fsa2VyYSBXSy0wNzAxIFRYIjsKKwl3LT5pbnB1dF9kZXYtPnBoeXMgPSB3LT5wYXJwb3J0LT5uYW1lOworCXctPmlucHV0X2Rldi0+aWQuYnVzdHlwZSA9IEJVU19QQVJQT1JUOworCisJLyogVE9ETyB3aGF0IGlkIHZlbmRvci9wcm9kdWN0L3ZlcnNpb24gPyAqLworCXctPmlucHV0X2Rldi0+aWQudmVuZG9yID0gMHgwMDAxOworCXctPmlucHV0X2Rldi0+aWQucHJvZHVjdCA9IDB4MDAwMTsKKwl3LT5pbnB1dF9kZXYtPmlkLnZlcnNpb24gPSAweDAxMDA7CisJdy0+aW5wdXRfZGV2LT5vcGVuID0gd2Fsa2VyYTA3MDFfb3BlbjsKKwl3LT5pbnB1dF9kZXYtPmNsb3NlID0gd2Fsa2VyYTA3MDFfY2xvc2U7CisKKwl3LT5pbnB1dF9kZXYtPmV2Yml0WzBdID0gQklUKEVWX0FCUykgfCBCSVRfTUFTSyhFVl9LRVkpOworCXctPmlucHV0X2Rldi0+a2V5Yml0W0JJVF9XT1JEKEJUTl9HRUFSX0RPV04pXSA9IEJJVF9NQVNLKEJUTl9HRUFSX0RPV04pOworCisJaW5wdXRfc2V0X2Fic19wYXJhbXMody0+aW5wdXRfZGV2LCBBQlNfWCwgLTUxMiwgNTEyLCAwLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyh3LT5pbnB1dF9kZXYsIEFCU19ZLCAtNTEyLCA1MTIsIDAsIDApOworCWlucHV0X3NldF9hYnNfcGFyYW1zKHctPmlucHV0X2RldiwgQUJTX1osIC01MTIsIDUxMiwgMCwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMody0+aW5wdXRfZGV2LCBBQlNfVEhST1RUTEUsIC01MTIsIDUxMiwgMCwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMody0+aW5wdXRfZGV2LCBBQlNfUlVEREVSLCAtNTEyLCA1MTIsIDAsIDApOworCWlucHV0X3NldF9hYnNfcGFyYW1zKHctPmlucHV0X2RldiwgQUJTX01JU0MsIC01MTIsIDUxMiwgMCwgMCk7CisKKwllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2Uody0+aW5wdXRfZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGluaXRfZXJyMzsKKworCWhydGltZXJfaW5pdCgmdy0+dGltZXIsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX1JFTCk7CisJdy0+dGltZXIuZnVuY3Rpb24gPSB0aW1lcl9oYW5kbGVyOworCXJldHVybiAwOworCisgaW5pdF9lcnIzOgorCWlucHV0X2ZyZWVfZGV2aWNlKHctPmlucHV0X2Rldik7CisgaW5pdF9lcnIyOgorCXBhcnBvcnRfcmVsZWFzZSh3LT5wYXJkZXZpY2UpOworIGluaXRfZXJyMToKKwlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKHctPnBhcmRldmljZSk7CisgaW5pdF9lcnI6CisJcGFycG9ydF9wdXRfcG9ydCh3LT5wYXJwb3J0KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCB3YWxrZXJhMDcwMV9kaXNjb25uZWN0KHN0cnVjdCB3YWxrZXJhX2RldiAqdykKK3sKKwlocnRpbWVyX2NhbmNlbCgmdy0+dGltZXIpOworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHctPmlucHV0X2Rldik7CisJcGFycG9ydF9yZWxlYXNlKHctPnBhcmRldmljZSk7CisJcGFycG9ydF91bnJlZ2lzdGVyX2RldmljZSh3LT5wYXJkZXZpY2UpOworCXBhcnBvcnRfcHV0X3BvcnQody0+cGFycG9ydCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHdhbGtlcmEwNzAxX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gd2Fsa2VyYTA3MDFfY29ubmVjdCgmd19kZXYsIHdhbGtlcmEwNzAxX3BwX25vKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHdhbGtlcmEwNzAxX2V4aXQodm9pZCkKK3sKKwl3YWxrZXJhMDcwMV9kaXNjb25uZWN0KCZ3X2Rldik7Cit9CisKK21vZHVsZV9pbml0KHdhbGtlcmEwNzAxX2luaXQpOworbW9kdWxlX2V4aXQod2Fsa2VyYTA3MDFfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL0tjb25maWcgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL0tjb25maWcKaW5kZXggZWZkNzBhOS4uMzU1NjE2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvS2NvbmZpZwpAQCAtMjY4LDYgKzI2OCwxNSBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcHhhMjd4X2tleXBhZC4KIAorY29uZmlnIEtFWUJPQVJEX1BYQTkzMF9ST1RBUlkKKwl0cmlzdGF0ZSAiUFhBOTMwL1BYQTkzNSBFbmhhbmNlZCBSb3RhcnkgQ29udHJvbGxlciBTdXBwb3J0IgorCWRlcGVuZHMgb24gQ1BVX1BYQTkzMCB8fCBDUFVfUFhBOTM1CisJaGVscAorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIFBYQTkzMC9QWEE5MzUgRW5oYW5jZWQgUm90YXJ5IENvbnRyb2xsZXIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHB4YTkzMF9yb3RhcnkuCisKIGNvbmZpZyBLRVlCT0FSRF9BQUVEMjAwMAogCXRyaXN0YXRlICJBQUVELTIwMDAga2V5Ym9hcmQiCiAJZGVwZW5kcyBvbiBNQUNIX0FBRUQyMDAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL01ha2VmaWxlIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9NYWtlZmlsZQppbmRleCAwZWRjOGYyLi4zNjM1MWUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvTWFrZWZpbGUKQEAgLTIwLDYgKzIwLDcgQEAKIG9iai0kKENPTkZJR19LRVlCT0FSRF9ISUxfT0xEKQkJKz0gaGlsa2JkLm8KIG9iai0kKENPTkZJR19LRVlCT0FSRF9PTUFQKQkJKz0gb21hcC1rZXlwYWQubwogb2JqLSQoQ09ORklHX0tFWUJPQVJEX1BYQTI3eCkJCSs9IHB4YTI3eF9rZXlwYWQubworb2JqLSQoQ09ORklHX0tFWUJPQVJEX1BYQTkzMF9ST1RBUlkpCSs9IHB4YTkzMF9yb3Rhcnkubwogb2JqLSQoQ09ORklHX0tFWUJPQVJEX0FBRUQyMDAwKQkJKz0gYWFlZDIwMDBfa2JkLm8KIG9iai0kKENPTkZJR19LRVlCT0FSRF9HUElPKQkJKz0gZ3Bpb19rZXlzLm8KIG9iai0kKENPTkZJR19LRVlCT0FSRF9IUDZYWCkJCSs9IGpvcm5hZGE2ODBfa2JkLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYXRrYmQuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYXRrYmQuYwppbmRleCAzNzliN2ZmLi5jM2M4YjliIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2F0a2JkLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hdGtiZC5jCkBAIC02NSw3ICs2NSw3IEBACiAKIC8qCiAgKiBTY2FuY29kZSB0byBrZXljb2RlIHRhYmxlcy4gVGhlc2UgYXJlIGp1c3QgdGhlIGRlZmF1bHQgc2V0dGluZywgYW5kCi0gKiBhcmUgbG9hZGFibGUgdmlhIGFuIHVzZXJsYW5kIHV0aWxpdHkuCisgKiBhcmUgbG9hZGFibGUgdmlhIGEgdXNlcmxhbmQgdXRpbGl0eS4KICAqLwogCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgYXRrYmRfc2V0Ml9rZXljb2RlWzUxMl0gPSB7CkBAIC04ODQsNiArODg0LDM5IEBACiB9CiAKIC8qCisgKiBQZXJmb3JtIGZpeHVwIGZvciBIUCBQYXZpbGlvbiBaVjYxMDAgbGFwdG9wIHRoYXQgZG9lc24ndCBnZW5lcmF0ZSByZWxlYXNlCisgKiBmb3IgaXRzIHZvbHVtZSBidXR0b25zCisgKi8KK3N0YXRpYyB2b2lkIGF0a2JkX2hwX3p2NjEwMF9rZXltYXBfZml4dXAoc3RydWN0IGF0a2JkICphdGtiZCkKK3sKKwljb25zdCB1bnNpZ25lZCBpbnQgZm9yY2VkX3JlbGVhc2Vfa2V5c1tdID0geworCQkweGFlLCAweGIwLAorCX07CisJaW50IGk7CisKKwlpZiAoYXRrYmQtPnNldCA9PSAyKQorCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmb3JjZWRfcmVsZWFzZV9rZXlzKTsgaSsrKQorCQkJX19zZXRfYml0KGZvcmNlZF9yZWxlYXNlX2tleXNbaV0sCisJCQkJCWF0a2JkLT5mb3JjZV9yZWxlYXNlX21hc2spOworfQorCisvKgorICogU2Ftc3VuZyBOQzEwIHdpdGggRm4rRj8ga2V5IHJlbGVhc2Ugbm90IHdvcmtpbmcKKyAqLworc3RhdGljIHZvaWQgYXRrYmRfc2Ftc3VuZ19rZXltYXBfZml4dXAoc3RydWN0IGF0a2JkICphdGtiZCkKK3sKKwljb25zdCB1bnNpZ25lZCBpbnQgZm9yY2VkX3JlbGVhc2Vfa2V5c1tdID0geworCQkweDgyLCAweDgzLCAweDg0LCAweDg2LCAweDg4LCAweDg5LCAweGIzLCAweGY3LCAweGY5LAorCX07CisJaW50IGk7CisKKwlpZiAoYXRrYmQtPnNldCA9PSAyKQorCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmb3JjZWRfcmVsZWFzZV9rZXlzKTsgaSsrKQorCQkJX19zZXRfYml0KGZvcmNlZF9yZWxlYXNlX2tleXNbaV0sCisJCQkJICBhdGtiZC0+Zm9yY2VfcmVsZWFzZV9tYXNrKTsKK30KKworLyoKICAqIGF0a2JkX3NldF9rZXljb2RlX3RhYmxlKCkgaW5pdGlhbGl6ZXMga2V5Ym9hcmQncyBrZXljb2RlIHRhYmxlCiAgKiBhY2NvcmRpbmcgdG8gdGhlIHNlbGVjdGVkIHNjYW5jb2RlIHNldAogICovCkBAIC0xNDc2LDYgKzE1MDksMTUgQEAKIAkJLmRyaXZlcl9kYXRhID0gYXRrYmRfZGVsbF9sYXB0b3Bfa2V5bWFwX2ZpeHVwLAogCX0sCiAJeworCQkuaWRlbnQgPSAiRGVsbCBMYXB0b3AiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgQ29tcHV0ZXIgQ29ycG9yYXRpb24iKSwKKwkJCURNSV9NQVRDSChETUlfQ0hBU1NJU19UWVBFLCAiOCIpLCAvKiBQb3J0YWJsZSAqLworCQl9LAorCQkuY2FsbGJhY2sgPSBhdGtiZF9zZXR1cF9maXh1cCwKKwkJLmRyaXZlcl9kYXRhID0gYXRrYmRfZGVsbF9sYXB0b3Bfa2V5bWFwX2ZpeHVwLAorCX0sCisJewogCQkuaWRlbnQgPSAiSFAgMjEzMyIsCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiSGV3bGV0dC1QYWNrYXJkIiksCkBAIC0xNDg1LDYgKzE1MjcsMTUgQEAKIAkJLmRyaXZlcl9kYXRhID0gYXRrYmRfaHBfa2V5bWFwX2ZpeHVwLAogCX0sCiAJeworCQkuaWRlbnQgPSAiSFAgUGF2aWxpb24gWlY2MTAwIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJIZXdsZXR0LVBhY2thcmQiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUGF2aWxpb24gWlY2MTAwIiksCisJCX0sCisJCS5jYWxsYmFjayA9IGF0a2JkX3NldHVwX2ZpeHVwLAorCQkuZHJpdmVyX2RhdGEgPSBhdGtiZF9ocF96djYxMDBfa2V5bWFwX2ZpeHVwLAorCX0sCisJewogCQkuaWRlbnQgPSAiSW52ZW50ZWMgU3ltcGhvbnkiLAogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIklOVkVOVEVDIiksCkBAIC0xNDkzLDYgKzE1NDQsMTUgQEAKIAkJLmNhbGxiYWNrID0gYXRrYmRfc2V0dXBfZml4dXAsCiAJCS5kcml2ZXJfZGF0YSA9IGF0a2JkX2ludmVudGVjX2tleW1hcF9maXh1cCwKIAl9LAorCXsKKwkJLmlkZW50ID0gIlNhbXN1bmcgTkMxMCIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiU0FNU1VORyBFTEVDVFJPTklDUyBDTy4sIExURC4iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTkMxMCIpLAorCQl9LAorCQkuY2FsbGJhY2sgPSBhdGtiZF9zZXR1cF9maXh1cCwKKwkJLmRyaXZlcl9kYXRhID0gYXRrYmRfc2Ftc3VuZ19rZXltYXBfZml4dXAsCisJfSwKIAl7IH0KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvZ3Bpb19rZXlzLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2dwaW9fa2V5cy5jCmluZGV4IDA1ZjNmNDMuLmFkNjdkNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvZ3Bpb19rZXlzLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9ncGlvX2tleXMuYwpAQCAtOTgsNiArOTgsMTAgQEAKIAlpbnB1dC0+aWQucHJvZHVjdCA9IDB4MDAwMTsKIAlpbnB1dC0+aWQudmVyc2lvbiA9IDB4MDEwMDsKIAorCS8qIEVuYWJsZSBhdXRvIHJlcGVhdCBmZWF0dXJlIG9mIExpbnV4IGlucHV0IHN1YnN5c3RlbSAqLworCWlmIChwZGF0YS0+cmVwKQorCQlfX3NldF9iaXQoRVZfUkVQLCBpbnB1dC0+ZXZiaXQpOworCiAJZGRhdGEtPmlucHV0ID0gaW5wdXQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm5idXR0b25zOyBpKyspIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvaGlsX2tiZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9oaWxfa2JkLmMKaW5kZXggNzFjMTk3MS4uNmYzNTY3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9oaWxfa2JkLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9oaWxfa2JkLmMKQEAgLTQ3LDYgKzQ3LDcgQEAKIE1PRFVMRV9BVVRIT1IoIkJyaWFuIFMuIEp1bGluIDxicmlAY2FseXguY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKEhJTF9HRU5FUklDX05BTUUgIiBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKK01PRFVMRV9BTElBUygic2VyaW86dHkwM3ByMjVpZDAwZXgqIik7CiAKICNkZWZpbmUgSElMX0tCRF9NQVhfTEVOR1RIIDE2CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvb21hcC1rZXlwYWQuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvb21hcC1rZXlwYWQuYwppbmRleCBkYjIyZmQ5Li4zZjNkMTE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL29tYXAta2V5cGFkLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9vbWFwLWtleXBhZC5jCkBAIC0xMjIsMTQgKzEyMiwxMCBAQAogCiAJLyogcmVhZCB0aGUga2V5cGFkIHN0YXR1cyAqLwogCWlmIChjcHVfaXNfb21hcDI0eHgoKSkgewotCQlpbnQgaTsKLQkJZm9yIChpID0gMDsgaSA8IG9tYXBfa3AtPnJvd3M7IGkrKykKLQkJCWRpc2FibGVfaXJxKE9NQVBfR1BJT19JUlEocm93X2dwaW9zW2ldKSk7Ci0KIAkJLyogcmVhZCB0aGUga2V5cGFkIHN0YXR1cyAqLwogCQlmb3IgKGNvbCA9IDA7IGNvbCA8IG9tYXBfa3AtPmNvbHM7IGNvbCsrKSB7CiAJCQlzZXRfY29sX2dwaW9fdmFsKG9tYXBfa3AsIH4oMSA8PCBjb2wpKTsKLQkJCXN0YXRlW2NvbF0gPSB+KGdldF9yb3dfZ3Bpb192YWwob21hcF9rcCkpICYgMHgzZjsKKwkJCXN0YXRlW2NvbF0gPSB+KGdldF9yb3dfZ3Bpb192YWwob21hcF9rcCkpICYgMHhmZjsKIAkJfQogCQlzZXRfY29sX2dwaW9fdmFsKG9tYXBfa3AsIDApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3B4YTkzMF9yb3RhcnkuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvcHhhOTMwX3JvdGFyeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZmJiYTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9weGE5MzBfcm90YXJ5LmMKQEAgLTAsMCArMSwyMTIgQEAKKy8qCisgKiBEcml2ZXIgZm9yIHRoZSBlbmhhbmNlZCByb3RhcnkgY29udHJvbGxlciBvbiBweGE5MzAgYW5kIHB4YTkzNQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxtYWNoL3B4YTkzMF9yb3RhcnkuaD4KKworI2RlZmluZSBTQkNSCSgweDA0KQorI2RlZmluZSBFUkNSCSgweDBjKQorCisjZGVmaW5lIFNCQ1JfRVJTQgkoMSA8PCA1KQorCitzdHJ1Y3QgcHhhOTMwX3JvdGFyeSB7CisJc3RydWN0IGlucHV0X2RldgkqaW5wdXRfZGV2OworCXZvaWQgX19pb21lbQkJKm1taW9fYmFzZTsKKwlpbnQJCQlsYXN0X2VyY3I7CisKKwlzdHJ1Y3QgcHhhOTMwX3JvdGFyeV9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKK307CisKK3N0YXRpYyB2b2lkIGNsZWFyX3NiY3Ioc3RydWN0IHB4YTkzMF9yb3RhcnkgKnIpCit7CisJdWludDMyX3Qgc2JjciA9IF9fcmF3X3JlYWRsKHItPm1taW9fYmFzZSArIFNCQ1IpOworCisJX19yYXdfd3JpdGVsKHNiY3IgfCBTQkNSX0VSU0IsIHItPm1taW9fYmFzZSArIFNCQ1IpOworCV9fcmF3X3dyaXRlbChzYmNyICYgflNCQ1JfRVJTQiwgci0+bW1pb19iYXNlICsgU0JDUik7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCByb3RhcnlfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgcHhhOTMwX3JvdGFyeSAqciA9IGRldl9pZDsKKwlzdHJ1Y3QgcHhhOTMwX3JvdGFyeV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHItPnBkYXRhOworCWludCBlcmNyLCBkZWx0YSwga2V5OworCisJZXJjciA9IF9fcmF3X3JlYWRsKHItPm1taW9fYmFzZSArIEVSQ1IpICYgMHhmOworCWNsZWFyX3NiY3Iocik7CisKKwlkZWx0YSA9IGVyY3IgLSByLT5sYXN0X2VyY3I7CisJaWYgKGRlbHRhID09IDApCisJCXJldHVybiBJUlFfSEFORExFRDsKKworCXItPmxhc3RfZXJjciA9IGVyY3I7CisKKwlpZiAocGRhdGEtPnVwX2tleSAmJiBwZGF0YS0+ZG93bl9rZXkpIHsKKwkJa2V5ID0gKGRlbHRhID4gMCkgPyBwZGF0YS0+dXBfa2V5IDogcGRhdGEtPmRvd25fa2V5OworCQlpbnB1dF9yZXBvcnRfa2V5KHItPmlucHV0X2Rldiwga2V5LCAxKTsKKwkJaW5wdXRfc3luYyhyLT5pbnB1dF9kZXYpOworCQlpbnB1dF9yZXBvcnRfa2V5KHItPmlucHV0X2Rldiwga2V5LCAwKTsKKwl9IGVsc2UKKwkJaW5wdXRfcmVwb3J0X3JlbChyLT5pbnB1dF9kZXYsIHBkYXRhLT5yZWxfY29kZSwgZGVsdGEpOworCisJaW5wdXRfc3luYyhyLT5pbnB1dF9kZXYpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IHB4YTkzMF9yb3Rhcnlfb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCit7CisJc3RydWN0IHB4YTkzMF9yb3RhcnkgKnIgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOworCisJY2xlYXJfc2JjcihyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBweGE5MzBfcm90YXJ5X2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcHhhOTMwX3JvdGFyeSAqciA9IGlucHV0X2dldF9kcnZkYXRhKGRldik7CisKKwljbGVhcl9zYmNyKHIpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBweGE5MzBfcm90YXJ5X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHB4YTkzMF9yb3RhcnlfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgcHhhOTMwX3JvdGFyeSAqcjsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IGlycTsKKwlpbnQgZXJyOworCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBpcnEgZm9yIHJvdGFyeSBjb250cm9sbGVyXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIEkvTyBtZW1vcnkgZGVmaW5lZFxuIik7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJaWYgKCFwZGF0YSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBwbGF0Zm9ybSBkYXRhIGRlZmluZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHB4YTkzMF9yb3RhcnkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXIpCisJCXJldHVybiAtRU5PTUVNOworCisJci0+bW1pb19iYXNlID0gaW9yZW1hcF9ub2NhY2hlKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKHItPm1taW9fYmFzZSA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZW1hcCBJTyBtZW1vcnlcbiIpOworCQllcnIgPSAtRU5YSU87CisJCWdvdG8gZmFpbGVkX2ZyZWU7CisJfQorCisJci0+cGRhdGEgPSBwZGF0YTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCByKTsKKworCS8qIGFsbG9jYXRlIGFuZCByZWdpc3RlciB0aGUgaW5wdXQgZGV2aWNlICovCisJaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKCFpbnB1dF9kZXYpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIGlucHV0IGRldmljZVxuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbGVkX2ZyZWVfaW87CisJfQorCisJaW5wdXRfZGV2LT5uYW1lID0gcGRldi0+bmFtZTsKKwlpbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfSE9TVDsKKwlpbnB1dF9kZXYtPm9wZW4gPSBweGE5MzBfcm90YXJ5X29wZW47CisJaW5wdXRfZGV2LT5jbG9zZSA9IHB4YTkzMF9yb3RhcnlfY2xvc2U7CisJaW5wdXRfZGV2LT5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKKworCWlmIChwZGF0YS0+dXBfa2V5ICYmIHBkYXRhLT5kb3duX2tleSkgeworCQlfX3NldF9iaXQocGRhdGEtPnVwX2tleSwgaW5wdXRfZGV2LT5rZXliaXQpOworCQlfX3NldF9iaXQocGRhdGEtPmRvd25fa2V5LCBpbnB1dF9kZXYtPmtleWJpdCk7CisJCV9fc2V0X2JpdChFVl9LRVksIGlucHV0X2Rldi0+ZXZiaXQpOworCX0gZWxzZSB7CisJCV9fc2V0X2JpdChwZGF0YS0+cmVsX2NvZGUsIGlucHV0X2Rldi0+cmVsYml0KTsKKwkJX19zZXRfYml0KEVWX1JFTCwgaW5wdXRfZGV2LT5ldmJpdCk7CisJfQorCisJci0+aW5wdXRfZGV2ID0gaW5wdXRfZGV2OworCWlucHV0X3NldF9kcnZkYXRhKGlucHV0X2Rldiwgcik7CisKKwllcnIgPSByZXF1ZXN0X2lycShpcnEsIHJvdGFyeV9pcnEsIElSUUZfRElTQUJMRUQsCisJCQkiZW5oYW5jZWQgcm90YXJ5Iiwgcik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBJUlFcbiIpOworCQlnb3RvIGZhaWxlZF9mcmVlX2lucHV0OworCX0KKworCWVyciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpbnB1dF9kZXYpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIGlucHV0IGRldmljZVxuIik7CisJCWdvdG8gZmFpbGVkX2ZyZWVfaXJxOworCX0KKworCXJldHVybiAwOworCitmYWlsZWRfZnJlZV9pcnE6CisJZnJlZV9pcnEoaXJxLCByKTsKK2ZhaWxlZF9mcmVlX2lucHV0OgorCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7CitmYWlsZWRfZnJlZV9pbzoKKwlpb3VubWFwKHItPm1taW9fYmFzZSk7CitmYWlsZWRfZnJlZToKKwlrZnJlZShyKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBweGE5MzBfcm90YXJ5X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBweGE5MzBfcm90YXJ5ICpyID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlmcmVlX2lycShwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApLCByKTsKKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShyLT5pbnB1dF9kZXYpOworCWlvdW5tYXAoci0+bW1pb19iYXNlKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlrZnJlZShyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBweGE5MzBfcm90YXJ5X2RyaXZlciA9IHsKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAicHhhOTMwLXJvdGFyeSIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IHB4YTkzMF9yb3RhcnlfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChweGE5MzBfcm90YXJ5X3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBweGE5MzBfcm90YXJ5X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZweGE5MzBfcm90YXJ5X2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChweGE5MzBfcm90YXJ5X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgcHhhOTMwX3JvdGFyeV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnB4YTkzMF9yb3RhcnlfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHB4YTkzMF9yb3RhcnlfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBQWEE5M3ggRW5oYW5jZWQgUm90YXJ5IENvbnRyb2xsZXIiKTsKK01PRFVMRV9BVVRIT1IoIllhbyBZb25nIDx5YW95b25nQG1hcnZlbGwuY29tPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL2FwYW5lbC5jIGIvZHJpdmVycy9pbnB1dC9taXNjL2FwYW5lbC5jCmluZGV4IGQ4MmY3ZjcuLjcxYjgyNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy9hcGFuZWwuYworKysgYi9kcml2ZXJzL2lucHV0L21pc2MvYXBhbmVsLmMKQEAgLTU3LDcgKzU3LDcgQEAKIAogc3RydWN0IGFwYW5lbCB7CiAJc3RydWN0IGlucHV0X3BvbGxlZF9kZXYgKmlwZGV2OwotCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwogCXVuc2lnbmVkIHNob3J0IGtleW1hcFtNQVhfUEFORUxfS0VZU107CiAJdTE2ICAgIG5rZXlzOwogCXUxNiAgICBsZWRfYml0czsKQEAgLTY2LDE2ICs2Niw3IEBACiB9OwogCiAKLXN0YXRpYyBpbnQgYXBhbmVsX3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqLCBpbnQsIGludCk7Ci0KLS8qIGZvciBub3csIHdlIG9ubHkgc3VwcG9ydCBvbmUgYWRkcmVzcyAqLwotc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHswLCBJMkNfQ0xJRU5UX0VORH07Ci1zdGF0aWMgdW5zaWduZWQgc2hvcnQgaWdub3JlID0gSTJDX0NMSUVOVF9FTkQ7Ci1zdGF0aWMgc3RydWN0IGkyY19jbGllbnRfYWRkcmVzc19kYXRhIGFkZHJfZGF0YSA9IHsKLQkubm9ybWFsX2kyYwk9IG5vcm1hbF9pMmMsCi0JLnByb2JlCQk9ICZpZ25vcmUsCi0JLmlnbm9yZQkJPSAmaWdub3JlLAotfTsKK3N0YXRpYyBpbnQgYXBhbmVsX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICosIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICopOwogCiBzdGF0aWMgdm9pZCByZXBvcnRfa2V5KHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0LCB1bnNpZ25lZCBrZXljb2RlKQogewpAQCAtMTAzLDEyICs5NCwxMiBAQAogCXMzMiBkYXRhOwogCWludCBpOwogCi0JZGF0YSA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YSgmYXAtPmNsaWVudCwgY21kKTsKKwlkYXRhID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGFwLT5jbGllbnQsIGNtZCk7CiAJaWYgKGRhdGEgPCAwKQogCQlyZXR1cm47CS8qIGlnbm9yZSBlcnJvcnMgKGR1ZSB0byBBQ1BJPz8pICovCiAKIAkvKiB3cml0ZSBiYWNrIHRvIGNsZWFyIGxhdGNoICovCi0JaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YSgmYXAtPmNsaWVudCwgY21kLCAwKTsKKwlpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGFwLT5jbGllbnQsIGNtZCwgMCk7CiAKIAlpZiAoIWRhdGEpCiAJCXJldHVybjsKQEAgLTEyNCw3ICsxMTUsNyBAQAogewogCXN0cnVjdCBhcGFuZWwgKmFwID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhcGFuZWwsIGxlZF93b3JrKTsKIAotCWkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoJmFwLT5jbGllbnQsIDB4MTAsIGFwLT5sZWRfYml0cyk7CisJaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShhcC0+Y2xpZW50LCAweDEwLCBhcC0+bGVkX2JpdHMpOwogfQogCiBzdGF0aWMgdm9pZCBtYWlsX2xlZF9zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkLApAQCAtMTQwLDcgKzEzMSw3IEBACiAJc2NoZWR1bGVfd29yaygmYXAtPmxlZF93b3JrKTsKIH0KIAotc3RhdGljIGludCBhcGFuZWxfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQorc3RhdGljIGludCBhcGFuZWxfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJc3RydWN0IGFwYW5lbCAqYXAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIApAQCAtMTQ4LDQzICsxMzksMzMgQEAKIAkJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmFwLT5tYWlsX2xlZCk7CiAKIAlpbnB1dF91bnJlZ2lzdGVyX3BvbGxlZF9kZXZpY2UoYXAtPmlwZGV2KTsKLQlpMmNfZGV0YWNoX2NsaWVudCgmYXAtPmNsaWVudCk7CiAJaW5wdXRfZnJlZV9wb2xsZWRfZGV2aWNlKGFwLT5pcGRldik7CiAKIAlyZXR1cm4gMDsKIH0KIAotLyogRnVuY3Rpb24gaXMgaW52b2tlZCBmb3IgZXZlcnkgaTJjIGFkYXB0ZXIuICovCi1zdGF0aWMgaW50IGFwYW5lbF9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCi17Ci0JZGV2X2RiZygmYWRhcC0+ZGV2LCBBUEFORUwgIjogYXR0YWNoIGFkYXB0ZXIgaWQ9JWRcbiIsIGFkYXAtPmlkKTsKLQotCS8qIE91ciBkZXZpY2UgaXMgY29ubmVjdGVkIG9ubHkgdG8gaTgwMSBvbiBsYXB0b3AgKi8KLQlpZiAoYWRhcC0+aWQgIT0gSTJDX0hXX1NNQlVTX0k4MDEpCi0JCXJldHVybiAtRU5PREVWOwotCi0JcmV0dXJuIGkyY19wcm9iZShhZGFwLCAmYWRkcl9kYXRhLCBhcGFuZWxfcHJvYmUpOwotfQotCiBzdGF0aWMgdm9pZCBhcGFuZWxfc2h1dGRvd24oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKLQlhcGFuZWxfZGV0YWNoX2NsaWVudChjbGllbnQpOworCWFwYW5lbF9yZW1vdmUoY2xpZW50KTsKIH0KIAorc3RhdGljIHN0cnVjdCBpMmNfZGV2aWNlX2lkIGFwYW5lbF9pZFtdID0geworCXsgImZ1aml0c3VfYXBhbmVsIiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBhcGFuZWxfaWQpOworCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYXBhbmVsX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZSA9IEFQQU5FTCwKIAl9LAotCS5hdHRhY2hfYWRhcHRlciA9ICZhcGFuZWxfYXR0YWNoX2FkYXB0ZXIsCi0JLmRldGFjaF9jbGllbnQgID0gJmFwYW5lbF9kZXRhY2hfY2xpZW50LAorCS5wcm9iZQkJPSAmYXBhbmVsX3Byb2JlLAorCS5yZW1vdmUJCT0gJmFwYW5lbF9yZW1vdmUsCiAJLnNodXRkb3duCT0gJmFwYW5lbF9zaHV0ZG93biwKKwkuaWRfdGFibGUJPSBhcGFuZWxfaWQsCiB9OwogCiBzdGF0aWMgc3RydWN0IGFwYW5lbCBhcGFuZWwgPSB7Ci0JLmNsaWVudCA9IHsKLQkJLmRyaXZlciA9ICZhcGFuZWxfZHJpdmVyLAotCQkubmFtZSAgID0gQVBBTkVMLAotCX0sCiAJLmtleW1hcCA9IHsKIAkJWzBdID0gS0VZX01BSUwsCiAJCVsxXSA9IEtFWV9XV1csCkBAIC0yMDQsNyArMTg1LDggQEAKIH07CiAKIC8qIE5COiBPbmx5IG9uZSBwYW5lbCBvbiB0aGUgaTJjLiAqLwotc3RhdGljIGludCBhcGFuZWxfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICpidXMsIGludCBhZGRyZXNzLCBpbnQga2luZCkKK3N0YXRpYyBpbnQgYXBhbmVsX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IGFwYW5lbCAqYXA7CiAJc3RydWN0IGlucHV0X3BvbGxlZF9kZXYgKmlwZGV2OwpAQCAtMjEyLDkgKzE5NCw2IEBACiAJdTggY21kID0gZGV2aWNlX2NoaXBbQVBBTkVMX0RFVl9BUFBCVE5dID09IENISVBfT1o5OTJDID8gMCA6IDg7CiAJaW50IGksIGVyciA9IC1FTk9NRU07CiAKLQlkZXZfZGJnKCZidXMtPmRldiwgQVBBTkVMICI6IHByb2JlIGFkYXB0ZXIgJXAgYWRkciAlZCBraW5kICVkXG4iLAotCQlidXMsIGFkZHJlc3MsIGtpbmQpOwotCiAJYXAgPSAmYXBhbmVsOwogCiAJaXBkZXYgPSBpbnB1dF9hbGxvY2F0ZV9wb2xsZWRfZGV2aWNlKCk7CkBAIC0yMjIsMTggKzIwMSwxMyBAQAogCQlnb3RvIG91dDE7CiAKIAlhcC0+aXBkZXYgPSBpcGRldjsKLQlhcC0+Y2xpZW50LmFkYXB0ZXIgPSBidXM7Ci0JYXAtPmNsaWVudC5hZGRyID0gYWRkcmVzczsKKwlhcC0+Y2xpZW50ID0gY2xpZW50OwogCi0JaTJjX3NldF9jbGllbnRkYXRhKCZhcC0+Y2xpZW50LCBhcCk7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgYXApOwogCi0JZXJyID0gaTJjX2F0dGFjaF9jbGllbnQoJmFwLT5jbGllbnQpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0MjsKLQotCWVyciA9IGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoJmFwLT5jbGllbnQsIGNtZCwgMCk7CisJZXJyID0gaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIGNtZCwgMCk7CiAJaWYgKGVycikgewotCQlkZXZfd2FybigmYXAtPmNsaWVudC5kZXYsIEFQQU5FTCAiOiBzbWJ1cyB3cml0ZSBlcnJvciAlZFxuIiwKKwkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCBBUEFORUwgIjogc21idXMgd3JpdGUgZXJyb3IgJWRcbiIsCiAJCQkgZXJyKTsKIAkJZ290byBvdXQzOwogCX0KQEAgLTI0Niw3ICsyMjAsNyBAQAogCWlkZXYtPm5hbWUgPSBBUEFORUxfTkFNRSAiIGJ1dHRvbnMiOwogCWlkZXYtPnBoeXMgPSAiYXBhbmVsL2lucHV0MCI7CiAJaWRldi0+aWQuYnVzdHlwZSA9IEJVU19IT1NUOwotCWlkZXYtPmRldi5wYXJlbnQgPSAmYXAtPmNsaWVudC5kZXY7CisJaWRldi0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmRldjsKIAogCXNldF9iaXQoRVZfS0VZLCBpZGV2LT5ldmJpdCk7CiAKQEAgLTI2NCw3ICsyMzgsNyBAQAogCiAJSU5JVF9XT1JLKCZhcC0+bGVkX3dvcmssIGxlZF91cGRhdGUpOwogCWlmIChkZXZpY2VfY2hpcFtBUEFORUxfREVWX0xFRF0gIT0gQ0hJUF9OT05FKSB7Ci0JCWVyciA9IGxlZF9jbGFzc2Rldl9yZWdpc3RlcigmYXAtPmNsaWVudC5kZXYsICZhcC0+bWFpbF9sZWQpOworCQllcnIgPSBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCAmYXAtPm1haWxfbGVkKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gb3V0NDsKIAl9CkBAIC0yNzMsOCArMjQ3LDYgQEAKIG91dDQ6CiAJaW5wdXRfdW5yZWdpc3Rlcl9wb2xsZWRfZGV2aWNlKGlwZGV2KTsKIG91dDM6Ci0JaTJjX2RldGFjaF9jbGllbnQoJmFwLT5jbGllbnQpOwotb3V0MjoKIAlpbnB1dF9mcmVlX3BvbGxlZF9kZXZpY2UoaXBkZXYpOwogb3V0MToKIAlyZXR1cm4gZXJyOwpAQCAtMzAxLDYgKzI3Myw3IEBACiAJdm9pZCBfX2lvbWVtICpiaW9zOwogCWNvbnN0IHZvaWQgX19pb21lbSAqcDsKIAl1OCBkZXZubzsKKwl1bnNpZ25lZCBjaGFyIGkyY19hZGRyOwogCWludCBmb3VuZCA9IDA7CiAKIAliaW9zID0gaW9yZW1hcCgweEYwMDAwLCAweDEwMDAwKTsgLyogQ2FuJ3QgZmFpbCAqLwpAQCAtMzEzLDcgKzI4Niw3IEBACiAKIAkvKiBqdXN0IHVzZSB0aGUgZmlyc3QgYWRkcmVzcyAqLwogCXAgKz0gODsKLQlub3JtYWxfaTJjWzBdID0gcmVhZGIocCszKSA+PiAxOworCWkyY19hZGRyID0gcmVhZGIocCArIDMpID4+IDE7CiAKIAlmb3IgKCA7IChkZXZubyA9IHJlYWRiKHApKSAmIDB4N2Y7IHAgKz0gNCkgewogCQl1bnNpZ25lZCBjaGFyIG1ldGhvZCwgc2xhdmUsIGNoaXA7CkBAIC0zMjIsNyArMjk1LDcgQEAKIAkJY2hpcCA9IHJlYWRiKHAgKyAyKTsKIAkJc2xhdmUgPSByZWFkYihwICsgMykgPj4gMTsKIAotCQlpZiAoc2xhdmUgIT0gbm9ybWFsX2kyY1swXSkgeworCQlpZiAoc2xhdmUgIT0gaTJjX2FkZHIpIHsKIAkJCXByX25vdGljZShBUEFORUwgIjogb25seSBvbmUgU01CdXMgc2xhdmUgIgogCQkJCSAgImFkZHJlc3Mgc3VwcG9ydGVkLCBza2lwaW5nIGRldmljZS4uLlxuIik7CiAJCQljb250aW51ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy9wY3Nwa3IuYyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9wY3Nwa3IuYwppbmRleCA0M2FhYTVjLi5kNmEzMGNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21pc2MvcGNzcGtyLmMKKysrIGIvZHJpdmVycy9pbnB1dC9taXNjL3Bjc3Brci5jCkBAIC01MiwxMyArNTIsMTMgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaTgyNTNfbG9jaywgZmxhZ3MpOwogCiAJaWYgKGNvdW50KSB7Ci0JCS8qIGVuYWJsZSBjb3VudGVyIDIgKi8KLQkJb3V0Yl9wKGluYl9wKDB4NjEpIHwgMywgMHg2MSk7CiAJCS8qIHNldCBjb21tYW5kIGZvciBjb3VudGVyIDIsIDIgYnl0ZSB3cml0ZSAqLwogCQlvdXRiX3AoMHhCNiwgMHg0Myk7CiAJCS8qIHNlbGVjdCBkZXNpcmVkIEhaICovCiAJCW91dGJfcChjb3VudCAmIDB4ZmYsIDB4NDIpOwogCQlvdXRiKChjb3VudCA+PiA4KSAmIDB4ZmYsIDB4NDIpOworCQkvKiBlbmFibGUgY291bnRlciAyICovCisJCW91dGJfcChpbmJfcCgweDYxKSB8IDMsIDB4NjEpOwogCX0gZWxzZSB7CiAJCS8qIGRpc2FibGUgY291bnRlciAyICovCiAJCW91dGIoaW5iX3AoMHg2MSkgJiAweEZDLCAweDYxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy91aW5wdXQuYyBiL2RyaXZlcnMvaW5wdXQvbWlzYy91aW5wdXQuYwppbmRleCAyMjNkNTZkLi40NmI3Y2FlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21pc2MvdWlucHV0LmMKKysrIGIvZHJpdmVycy9pbnB1dC9taXNjL3VpbnB1dC5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvdWlucHV0Lmg+CisjaW5jbHVkZSAiLi4vaW5wdXQtY29tcGF0LmgiCiAKIHN0YXRpYyBpbnQgdWlucHV0X2Rldl9ldmVudChzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHVuc2lnbmVkIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgY29kZSwgaW50IHZhbHVlKQogewpAQCAtNzgsNiArNzksNyBAQAogCS8qIEZpbmQgYW4gaW5wdXQgcmVxdWVzdCwgYnkgSUQuIFJldHVybnMgTlVMTCBpZiB0aGUgSUQgaXNuJ3QgdmFsaWQuICovCiAJaWYgKGlkID49IFVJTlBVVF9OVU1fUkVRVUVTVFMgfHwgaWQgPCAwKQogCQlyZXR1cm4gTlVMTDsKKwogCXJldHVybiB1ZGV2LT5yZXF1ZXN0c1tpZF07CiB9CiAKQEAgLTEyNyw2ICsxMjksMTcgQEAKIAlzdHJ1Y3QgdWlucHV0X3JlcXVlc3QgcmVxdWVzdDsKIAlpbnQgcmV0dmFsOwogCisJLyoKKwkgKiB1aW5wdXQgZHJpdmVyIGRvZXMgbm90IGN1cnJlbnRseSBzdXBwb3J0IHBlcmlvZGljIGVmZmVjdHMgd2l0aAorCSAqIGN1c3RvbSB3YXZlZm9ybSBzaW5jZSBpdCBkb2VzIG5vdCBoYXZlIGEgd2F5IHRvIHBhc3MgYnVmZmVyIG9mCisJICogc2FtcGxlcyAoY3VzdG9tX2RhdGEpIHRvIHVzZXJzcGFjZS4gSWYgZXZlciB0aGVyZSBpcyBhIGRldmljZQorCSAqIHN1cHBvcnRpbmcgY3VzdG9tIHdhdmVmb3JtcyB3ZSB3b3VsZCBuZWVkIHRvIGRlZmluZSBhbiBhZGRpdGlvbmFsCisJICogaW9jdGwgKFVJX1VQTE9BRF9TQU1QTEVTKSBidXQgZm9yIG5vdyB3ZSBqdXN0IGJhaWwgb3V0LgorCSAqLworCWlmIChlZmZlY3QtPnR5cGUgPT0gRkZfUEVSSU9ESUMgJiYKKwkJCWVmZmVjdC0+dS5wZXJpb2RpYy53YXZlZm9ybSA9PSBGRl9DVVNUT00pCisJCXJldHVybiAtRUlOVkFMOworCiAJcmVxdWVzdC5pZCA9IC0xOwogCWluaXRfY29tcGxldGlvbigmcmVxdWVzdC5kb25lKTsKIAlyZXF1ZXN0LmNvZGUgPSBVSV9GRl9VUExPQUQ7CkBAIC0zNTMsMTUgKzM2NiwxNSBAQAogewogCXN0cnVjdCBpbnB1dF9ldmVudCBldjsKIAotCWlmIChjb3VudCAhPSBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50KSkKKwlpZiAoY291bnQgPCBpbnB1dF9ldmVudF9zaXplKCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZldiwgYnVmZmVyLCBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50KSkpCisJaWYgKGlucHV0X2V2ZW50X2Zyb21fdXNlcihidWZmZXIsICZldikpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJaW5wdXRfZXZlbnQodWRldi0+ZGV2LCBldi50eXBlLCBldi5jb2RlLCBldi52YWx1ZSk7CiAKLQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudCk7CisJcmV0dXJuIGlucHV0X2V2ZW50X3NpemUoKTsKIH0KIAogc3RhdGljIHNzaXplX3QgdWlucHV0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKQEAgLTQwNywxMyArNDIwLDEzIEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXdoaWxlICh1ZGV2LT5oZWFkICE9IHVkZXYtPnRhaWwgJiYgcmV0dmFsICsgc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudCkgPD0gY291bnQpIHsKLQkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIgKyByZXR2YWwsICZ1ZGV2LT5idWZmW3VkZXYtPnRhaWxdLCBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50KSkpIHsKKwl3aGlsZSAodWRldi0+aGVhZCAhPSB1ZGV2LT50YWlsICYmIHJldHZhbCArIGlucHV0X2V2ZW50X3NpemUoKSA8PSBjb3VudCkgeworCQlpZiAoaW5wdXRfZXZlbnRfdG9fdXNlcihidWZmZXIgKyByZXR2YWwsICZ1ZGV2LT5idWZmW3VkZXYtPnRhaWxdKSkgewogCQkJcmV0dmFsID0gLUVGQVVMVDsKIAkJCWdvdG8gb3V0OwogCQl9CiAJCXVkZXYtPnRhaWwgPSAodWRldi0+dGFpbCArIDEpICUgVUlOUFVUX0JVRkZFUl9TSVpFOwotCQlyZXR2YWwgKz0gc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudCk7CisJCXJldHZhbCArPSBpbnB1dF9ldmVudF9zaXplKCk7CiAJfQogCiAgb3V0OgpAQCAtNDQ0LDYgKzQ1Nyw5MyBAQAogCXJldHVybiAwOwogfQogCisjaWZkZWYgQ09ORklHX0NPTVBBVAorc3RydWN0IHVpbnB1dF9mZl91cGxvYWRfY29tcGF0IHsKKwlpbnQJCQlyZXF1ZXN0X2lkOworCWludAkJCXJldHZhbDsKKwlzdHJ1Y3QgZmZfZWZmZWN0X2NvbXBhdAllZmZlY3Q7CisJc3RydWN0IGZmX2VmZmVjdF9jb21wYXQJb2xkOworfTsKKworc3RhdGljIGludCB1aW5wdXRfZmZfdXBsb2FkX3RvX3VzZXIoY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHVpbnB1dF9mZl91cGxvYWQgKmZmX3VwKQoreworCWlmIChJTlBVVF9DT01QQVRfVEVTVCkgeworCQlzdHJ1Y3QgdWlucHV0X2ZmX3VwbG9hZF9jb21wYXQgZmZfdXBfY29tcGF0OworCisJCWZmX3VwX2NvbXBhdC5yZXF1ZXN0X2lkID0gZmZfdXAtPnJlcXVlc3RfaWQ7CisJCWZmX3VwX2NvbXBhdC5yZXR2YWwgPSBmZl91cC0+cmV0dmFsOworCQkvKgorCQkgKiBJdCBzbyBoYXBwZW5zIHRoYXQgdGhlIHBvaW50ZXIgdGhhdCBnaXZlcyB1cyB0aGUgdHJvdWJsZQorCQkgKiBpcyB0aGUgbGFzdCBmaWVsZCBpbiB0aGUgc3RydWN0dXJlLiBTaW5jZSB3ZSBkb24ndCBzdXBwb3J0CisJCSAqIGN1c3RvbSB3YXZlZm9ybXMgaW4gdWlucHV0IGFueXdheSB3ZSBjYW4ganVzdCBjb3B5IHRoZSB3aG9sZQorCQkgKiB0aGluZyAodG8gdGhlIGNvbXBhdCBzaXplKSBhbmQgaWdub3JlIHRoZSBwb2ludGVyLgorCQkgKi8KKwkJbWVtY3B5KCZmZl91cF9jb21wYXQuZWZmZWN0LCAmZmZfdXAtPmVmZmVjdCwKKwkJCXNpemVvZihzdHJ1Y3QgZmZfZWZmZWN0X2NvbXBhdCkpOworCQltZW1jcHkoJmZmX3VwX2NvbXBhdC5vbGQsICZmZl91cC0+b2xkLAorCQkJc2l6ZW9mKHN0cnVjdCBmZl9lZmZlY3RfY29tcGF0KSk7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsICZmZl91cF9jb21wYXQsCisJCQkJIHNpemVvZihzdHJ1Y3QgdWlucHV0X2ZmX3VwbG9hZF9jb21wYXQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0gZWxzZSB7CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBmZl91cCwKKwkJCQkgc2l6ZW9mKHN0cnVjdCB1aW5wdXRfZmZfdXBsb2FkKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1aW5wdXRfZmZfdXBsb2FkX2Zyb21fdXNlcihjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJCSAgICAgIHN0cnVjdCB1aW5wdXRfZmZfdXBsb2FkICpmZl91cCkKK3sKKwlpZiAoSU5QVVRfQ09NUEFUX1RFU1QpIHsKKwkJc3RydWN0IHVpbnB1dF9mZl91cGxvYWRfY29tcGF0IGZmX3VwX2NvbXBhdDsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmZmX3VwX2NvbXBhdCwgYnVmZmVyLAorCQkJCSAgIHNpemVvZihzdHJ1Y3QgdWlucHV0X2ZmX3VwbG9hZF9jb21wYXQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWZmX3VwLT5yZXF1ZXN0X2lkID0gZmZfdXBfY29tcGF0LnJlcXVlc3RfaWQ7CisJCWZmX3VwLT5yZXR2YWwgPSBmZl91cF9jb21wYXQucmV0dmFsOworCQltZW1jcHkoJmZmX3VwLT5lZmZlY3QsICZmZl91cF9jb21wYXQuZWZmZWN0LAorCQkJc2l6ZW9mKHN0cnVjdCBmZl9lZmZlY3RfY29tcGF0KSk7CisJCW1lbWNweSgmZmZfdXAtPm9sZCwgJmZmX3VwX2NvbXBhdC5vbGQsCisJCQlzaXplb2Yoc3RydWN0IGZmX2VmZmVjdF9jb21wYXQpKTsKKworCX0gZWxzZSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcihmZl91cCwgYnVmZmVyLAorCQkJCSAgIHNpemVvZihzdHJ1Y3QgdWlucHV0X2ZmX3VwbG9hZCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNlbHNlCisKK3N0YXRpYyBpbnQgdWlucHV0X2ZmX3VwbG9hZF90b191c2VyKGNoYXIgX191c2VyICpidWZmZXIsCisJCQkJICAgIGNvbnN0IHN0cnVjdCB1aW5wdXRfZmZfdXBsb2FkICpmZl91cCkKK3sKKwlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgZmZfdXAsIHNpemVvZihzdHJ1Y3QgdWlucHV0X2ZmX3VwbG9hZCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVpbnB1dF9mZl91cGxvYWRfZnJvbV91c2VyKGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkJICAgICAgc3RydWN0IHVpbnB1dF9mZl91cGxvYWQgKmZmX3VwKQoreworCWlmIChjb3B5X2Zyb21fdXNlcihmZl91cCwgYnVmZmVyLCBzaXplb2Yoc3RydWN0IHVpbnB1dF9mZl91cGxvYWQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCisKICNkZWZpbmUgdWlucHV0X3NldF9iaXQoX2FyZywgX2JpdCwgX21heCkJCVwKICh7CQkJCQkJCVwKIAlpbnQgX19yZXQgPSAwOwkJCQkJXApAQCAtNDU1LDE5ICs1NTUsMTcgQEAKIAlfX3JldDsJCQkJCQlcCiB9KQogCi1zdGF0aWMgbG9uZyB1aW5wdXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGxvbmcgdWlucHV0X2lvY3RsX2hhbmRsZXIoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJIHVuc2lnbmVkIGxvbmcgYXJnLCB2b2lkIF9fdXNlciAqcCkKIHsKIAlpbnQJCQlyZXR2YWw7Ci0Jc3RydWN0IHVpbnB1dF9kZXZpY2UJKnVkZXY7Ci0Jdm9pZCBfX3VzZXIgICAgICAgICAgICAgKnAgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJc3RydWN0IHVpbnB1dF9kZXZpY2UJKnVkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHVpbnB1dF9mZl91cGxvYWQgZmZfdXA7CiAJc3RydWN0IHVpbnB1dF9mZl9lcmFzZSAgZmZfZXJhc2U7CiAJc3RydWN0IHVpbnB1dF9yZXF1ZXN0ICAgKnJlcTsKIAlpbnQgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7CiAJY2hhcgkJCSpwaHlzOwogCi0JdWRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQogCXJldHZhbCA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmdWRldi0+bXV0ZXgpOwogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CkBAIC01NDksMjYgKzY0NywyNCBAQAogCQkJYnJlYWs7CiAKIAkJY2FzZSBVSV9CRUdJTl9GRl9VUExPQUQ6Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoJmZmX3VwLCBwLCBzaXplb2YoZmZfdXApKSkgewotCQkJCXJldHZhbCA9IC1FRkFVTFQ7CisJCQlyZXR2YWwgPSB1aW5wdXRfZmZfdXBsb2FkX2Zyb21fdXNlcihwLCAmZmZfdXApOworCQkJaWYgKHJldHZhbCkKIAkJCQlicmVhazsKLQkJCX0KKwogCQkJcmVxID0gdWlucHV0X3JlcXVlc3RfZmluZCh1ZGV2LCBmZl91cC5yZXF1ZXN0X2lkKTsKLQkJCWlmICghKHJlcSAmJiByZXEtPmNvZGUgPT0gVUlfRkZfVVBMT0FEICYmIHJlcS0+dS51cGxvYWQuZWZmZWN0KSkgeworCQkJaWYgKCFyZXEgfHwgcmVxLT5jb2RlICE9IFVJX0ZGX1VQTE9BRCB8fCAhcmVxLT51LnVwbG9hZC5lZmZlY3QpIHsKIAkJCQlyZXR2YWwgPSAtRUlOVkFMOwogCQkJCWJyZWFrOwogCQkJfQorCiAJCQlmZl91cC5yZXR2YWwgPSAwOwotCQkJbWVtY3B5KCZmZl91cC5lZmZlY3QsIHJlcS0+dS51cGxvYWQuZWZmZWN0LCBzaXplb2Yoc3RydWN0IGZmX2VmZmVjdCkpOworCQkJZmZfdXAuZWZmZWN0ID0gKnJlcS0+dS51cGxvYWQuZWZmZWN0OwogCQkJaWYgKHJlcS0+dS51cGxvYWQub2xkKQotCQkJCW1lbWNweSgmZmZfdXAub2xkLCByZXEtPnUudXBsb2FkLm9sZCwgc2l6ZW9mKHN0cnVjdCBmZl9lZmZlY3QpKTsKKwkJCQlmZl91cC5vbGQgPSAqcmVxLT51LnVwbG9hZC5vbGQ7CiAJCQllbHNlCiAJCQkJbWVtc2V0KCZmZl91cC5vbGQsIDAsIHNpemVvZihzdHJ1Y3QgZmZfZWZmZWN0KSk7CiAKLQkJCWlmIChjb3B5X3RvX3VzZXIocCwgJmZmX3VwLCBzaXplb2YoZmZfdXApKSkgewotCQkJCXJldHZhbCA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJCQlyZXR2YWwgPSB1aW5wdXRfZmZfdXBsb2FkX3RvX3VzZXIocCwgJmZmX3VwKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgVUlfQkVHSU5fRkZfRVJBU0U6CkBAIC01NzYsMjkgKzY3MiwzNCBAQAogCQkJCXJldHZhbCA9IC1FRkFVTFQ7CiAJCQkJYnJlYWs7CiAJCQl9CisKIAkJCXJlcSA9IHVpbnB1dF9yZXF1ZXN0X2ZpbmQodWRldiwgZmZfZXJhc2UucmVxdWVzdF9pZCk7Ci0JCQlpZiAoIShyZXEgJiYgcmVxLT5jb2RlID09IFVJX0ZGX0VSQVNFKSkgeworCQkJaWYgKCFyZXEgfHwgcmVxLT5jb2RlICE9IFVJX0ZGX0VSQVNFKSB7CiAJCQkJcmV0dmFsID0gLUVJTlZBTDsKIAkJCQlicmVhazsKIAkJCX0KKwogCQkJZmZfZXJhc2UucmV0dmFsID0gMDsKIAkJCWZmX2VyYXNlLmVmZmVjdF9pZCA9IHJlcS0+dS5lZmZlY3RfaWQ7CiAJCQlpZiAoY29weV90b191c2VyKHAsICZmZl9lcmFzZSwgc2l6ZW9mKGZmX2VyYXNlKSkpIHsKIAkJCQlyZXR2YWwgPSAtRUZBVUxUOwogCQkJCWJyZWFrOwogCQkJfQorCiAJCQlicmVhazsKIAogCQljYXNlIFVJX0VORF9GRl9VUExPQUQ6Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoJmZmX3VwLCBwLCBzaXplb2YoZmZfdXApKSkgewotCQkJCXJldHZhbCA9IC1FRkFVTFQ7CisJCQlyZXR2YWwgPSB1aW5wdXRfZmZfdXBsb2FkX2Zyb21fdXNlcihwLCAmZmZfdXApOworCQkJaWYgKHJldHZhbCkKIAkJCQlicmVhazsKLQkJCX0KKwogCQkJcmVxID0gdWlucHV0X3JlcXVlc3RfZmluZCh1ZGV2LCBmZl91cC5yZXF1ZXN0X2lkKTsKLQkJCWlmICghKHJlcSAmJiByZXEtPmNvZGUgPT0gVUlfRkZfVVBMT0FEICYmIHJlcS0+dS51cGxvYWQuZWZmZWN0KSkgeworCQkJaWYgKCFyZXEgfHwgcmVxLT5jb2RlICE9IFVJX0ZGX1VQTE9BRCB8fAorCQkJICAgICFyZXEtPnUudXBsb2FkLmVmZmVjdCkgewogCQkJCXJldHZhbCA9IC1FSU5WQUw7CiAJCQkJYnJlYWs7CiAJCQl9CisKIAkJCXJlcS0+cmV0dmFsID0gZmZfdXAucmV0dmFsOwogCQkJdWlucHV0X3JlcXVlc3RfZG9uZSh1ZGV2LCByZXEpOwogCQkJYnJlYWs7CkBAIC02MDgsMTEgKzcwOSwxMyBAQAogCQkJCXJldHZhbCA9IC1FRkFVTFQ7CiAJCQkJYnJlYWs7CiAJCQl9CisKIAkJCXJlcSA9IHVpbnB1dF9yZXF1ZXN0X2ZpbmQodWRldiwgZmZfZXJhc2UucmVxdWVzdF9pZCk7Ci0JCQlpZiAoIShyZXEgJiYgcmVxLT5jb2RlID09IFVJX0ZGX0VSQVNFKSkgeworCQkJaWYgKCFyZXEgfHwgcmVxLT5jb2RlICE9IFVJX0ZGX0VSQVNFKSB7CiAJCQkJcmV0dmFsID0gLUVJTlZBTDsKIAkJCQlicmVhazsKIAkJCX0KKwogCQkJcmVxLT5yZXR2YWwgPSBmZl9lcmFzZS5yZXR2YWw7CiAJCQl1aW5wdXRfcmVxdWVzdF9kb25lKHVkZXYsIHJlcSk7CiAJCQlicmVhazsKQEAgLTYyNiw2ICs3MjksMTggQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCitzdGF0aWMgbG9uZyB1aW5wdXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiB1aW5wdXRfaW9jdGxfaGFuZGxlcihmaWxlLCBjbWQsIGFyZywgKHZvaWQgX191c2VyICopYXJnKTsKK30KKworI2lmZGVmIENPTkZJR19DT01QQVQKK3N0YXRpYyBsb25nIHVpbnB1dF9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiB1aW5wdXRfaW9jdGxfaGFuZGxlcihmaWxlLCBjbWQsIGFyZywgY29tcGF0X3B0cihhcmcpKTsKK30KKyNlbmRpZgorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1aW5wdXRfZm9wcyA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm9wZW4JCT0gdWlucHV0X29wZW4sCkBAIC02MzQsNiArNzQ5LDkgQEAKIAkud3JpdGUJCT0gdWlucHV0X3dyaXRlLAogCS5wb2xsCQk9IHVpbnB1dF9wb2xsLAogCS51bmxvY2tlZF9pb2N0bAk9IHVpbnB1dF9pb2N0bCwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9pb2N0bAk9IHVpbnB1dF9jb21wYXRfaW9jdGwsCisjZW5kaWYKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSB1aW5wdXRfbWlzYyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvS2NvbmZpZyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvS2NvbmZpZwppbmRleCA0ZTk5MzQyLi4wOTNjOGMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL0tjb25maWcKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9LY29uZmlnCkBAIC0yODYsNCArMjg2LDEwIEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBncGlvX21vdXNlLgogCitjb25maWcgTU9VU0VfUFhBOTMwX1RSS0JBTEwKKwl0cmlzdGF0ZSAiUFhBOTMwIFRyYWNrYmFsbCBtb3VzZSIKKwlkZXBlbmRzIG9uIENQVV9QWEE5MzAgfHwgQ1BVX1BYQTkzNQorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gc3VwcG9ydCBQWEE5MzAgVHJhY2tiYWxsIG1vdXNlLgorCiBlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9NYWtlZmlsZSBiL2RyaXZlcnMvaW5wdXQvbW91c2UvTWFrZWZpbGUKaW5kZXggOTZmMWRkOC4uOGM4YTFmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL01ha2VmaWxlCkBAIC00LDE5ICs0LDIwIEBACiAKICMgRWFjaCBjb25maWd1cmF0aW9uIG9wdGlvbiBlbmFibGVzIGEgbGlzdCBvZiBmaWxlcy4KIAotb2JqLSQoQ09ORklHX01PVVNFX0FNSUdBKQkrPSBhbWltb3VzZS5vCi1vYmotJChDT05GSUdfTU9VU0VfQVBQTEVUT1VDSCkJKz0gYXBwbGV0b3VjaC5vCi1vYmotJChDT05GSUdfTU9VU0VfQkNNNTk3NCkJKz0gYmNtNTk3NC5vCi1vYmotJChDT05GSUdfTU9VU0VfQVRBUkkpCSs9IGF0YXJpbW91c2Uubwotb2JqLSQoQ09ORklHX01PVVNFX1JJU0NQQykJKz0gcnBjbW91c2Uubwotb2JqLSQoQ09ORklHX01PVVNFX0lOUE9SVCkJKz0gaW5wb3J0Lm8KLW9iai0kKENPTkZJR19NT1VTRV9MT0dJQk0pCSs9IGxvZ2libS5vCi1vYmotJChDT05GSUdfTU9VU0VfUEMxMTBQQUQpCSs9IHBjMTEwcGFkLm8KLW9iai0kKENPTkZJR19NT1VTRV9QUzIpCQkrPSBwc21vdXNlLm8KLW9iai0kKENPTkZJR19NT1VTRV9TRVJJQUwpCSs9IHNlcm1vdXNlLm8KLW9iai0kKENPTkZJR19NT1VTRV9ISUwpCQkrPSBoaWxfcHRyLm8KLW9iai0kKENPTkZJR19NT1VTRV9WU1hYWEFBKQkrPSB2c3h4eGFhLm8KLW9iai0kKENPTkZJR19NT1VTRV9HUElPKQkrPSBncGlvX21vdXNlLm8KK29iai0kKENPTkZJR19NT1VTRV9BTUlHQSkJCSs9IGFtaW1vdXNlLm8KK29iai0kKENPTkZJR19NT1VTRV9BUFBMRVRPVUNIKQkJKz0gYXBwbGV0b3VjaC5vCitvYmotJChDT05GSUdfTU9VU0VfQkNNNTk3NCkJCSs9IGJjbTU5NzQubworb2JqLSQoQ09ORklHX01PVVNFX0FUQVJJKQkJKz0gYXRhcmltb3VzZS5vCitvYmotJChDT05GSUdfTU9VU0VfUklTQ1BDKQkJKz0gcnBjbW91c2Uubworb2JqLSQoQ09ORklHX01PVVNFX0lOUE9SVCkJCSs9IGlucG9ydC5vCitvYmotJChDT05GSUdfTU9VU0VfTE9HSUJNKQkJKz0gbG9naWJtLm8KK29iai0kKENPTkZJR19NT1VTRV9QQzExMFBBRCkJCSs9IHBjMTEwcGFkLm8KK29iai0kKENPTkZJR19NT1VTRV9QUzIpCQkJKz0gcHNtb3VzZS5vCitvYmotJChDT05GSUdfTU9VU0VfUFhBOTMwX1RSS0JBTEwpCSs9IHB4YTkzMF90cmtiYWxsLm8KK29iai0kKENPTkZJR19NT1VTRV9TRVJJQUwpCQkrPSBzZXJtb3VzZS5vCitvYmotJChDT05GSUdfTU9VU0VfSElMKQkJCSs9IGhpbF9wdHIubworb2JqLSQoQ09ORklHX01PVVNFX1ZTWFhYQUEpCQkrPSB2c3h4eGFhLm8KK29iai0kKENPTkZJR19NT1VTRV9HUElPKQkJKz0gZ3Bpb19tb3VzZS5vCiAKIHBzbW91c2Utb2JqcyA6PSBwc21vdXNlLWJhc2UubyBzeW5hcHRpY3MubwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL2FwcGxldG91Y2guYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvYXBwbGV0b3VjaC5jCmluZGV4IDA3OTgxNmUuLjQ1NGI5NjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvYXBwbGV0b3VjaC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvYXBwbGV0b3VjaC5jCkBAIC0zLDcgKzMsNyBAQAogICoKICAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IEdyZWcgS3JvYWgtSGFydG1hbiAoZ3JlZ0Brcm9haC5jb20pCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwOCBKb2hhbm5lcyBCZXJnIChqb2hhbm5lc0BzaXBzb2x1dGlvbnMubmV0KQotICogQ29weXJpZ2h0IChDKSAyMDA1ICAgICAgU3RlbGlhbiBQb3AgKHN0ZWxpYW5AcG9waWVzLm5ldCkKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA4IFN0ZWxpYW4gUG9wIChzdGVsaWFuQHBvcGllcy5uZXQpCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDUgICAgICBGcmFuayBBcm5vbGQgKGZyYW5rQHNjaXJvY2NvLTV2LXR1cmJvLmRlKQogICogQ29weXJpZ2h0IChDKSAyMDA1ICAgICAgUGV0ZXIgT3N0ZXJsdW5kIChwZXRlcm8yQHRlbGlhLmNvbSkKICAqIENvcHlyaWdodCAoQykgMjAwNSAgICAgIE1pY2hhZWwgSGFuc2VsbWFubiAobGludXgta2VybmVsQGhhbnNtaS5jaCkKQEAgLTM1LDE2ICszNSw3NCBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9pbnB1dC5oPgogCi0vKiBUeXBlIG9mIHRvdWNocGFkICovCi1lbnVtIGF0cF90b3VjaHBhZF90eXBlIHsKLQlBVFBfRk9VTlRBSU4sCi0JQVRQX0dFWVNFUjEsCi0JQVRQX0dFWVNFUjIsCi0JQVRQX0dFWVNFUjMsCi0JQVRQX0dFWVNFUjQKKy8qCisgKiBOb3RlOiBXZSB0cnkgdG8ga2VlcCB0aGUgdG91Y2hwYWQgYXNwZWN0IHJhdGlvIHdoaWxlIHN0aWxsIGRvaW5nIG9ubHkKKyAqIHNpbXBsZSBhcml0aG1ldGljczoKKyAqCTAgPD0geCA8PSAoeHNlbnNvcnMgLSAxKSAqIHhmYWN0CisgKgkwIDw9IHkgPD0gKHlzZW5zb3JzIC0gMSkgKiB5ZmFjdAorICovCitzdHJ1Y3QgYXRwX2luZm8geworCWludCB4c2Vuc29yczsJCQkJLyogbnVtYmVyIG9mIFggc2Vuc29ycyAqLworCWludCB4c2Vuc29yc18xNzsJCQkvKiAxNyIgbW9kZWxzIGhhdmUgbW9yZSBzZW5zb3JzICovCisJaW50IHlzZW5zb3JzOwkJCQkvKiBudW1iZXIgb2YgWSBzZW5zb3JzICovCisJaW50IHhmYWN0OwkJCQkvKiBYIG11bHRpcGxpY2F0aW9uIGZhY3RvciAqLworCWludCB5ZmFjdDsJCQkJLyogWSBtdWx0aXBsaWNhdGlvbiBmYWN0b3IgKi8KKwlpbnQgZGF0YWxlbjsJCQkJLyogc2l6ZSBvZiBVU0IgdHJhbnNmZXJzICovCisJdm9pZCAoKmNhbGxiYWNrKShzdHJ1Y3QgdXJiICopOwkJLyogY2FsbGJhY2sgZnVuY3Rpb24gKi8KIH07CiAKLSNkZWZpbmUgQVRQX0RFVklDRShwcm9kLCB0eXBlKQkJCQkJXAorc3RhdGljIHZvaWQgYXRwX2NvbXBsZXRlX2dleXNlcl8xXzIoc3RydWN0IHVyYiAqdXJiKTsKK3N0YXRpYyB2b2lkIGF0cF9jb21wbGV0ZV9nZXlzZXJfM180KHN0cnVjdCB1cmIgKnVyYik7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRwX2luZm8gZm91bnRhaW5faW5mbyA9IHsKKwkueHNlbnNvcnMJPSAxNiwKKwkueHNlbnNvcnNfMTcJPSAyNiwKKwkueXNlbnNvcnMJPSAxNiwKKwkueGZhY3QJCT0gNjQsCisJLnlmYWN0CQk9IDQzLAorCS5kYXRhbGVuCT0gODEsCisJLmNhbGxiYWNrCT0gYXRwX2NvbXBsZXRlX2dleXNlcl8xXzIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0cF9pbmZvIGdleXNlcjFfaW5mbyA9IHsKKwkueHNlbnNvcnMJPSAxNiwKKwkueHNlbnNvcnNfMTcJPSAyNiwKKwkueXNlbnNvcnMJPSAxNiwKKwkueGZhY3QJCT0gNjQsCisJLnlmYWN0CQk9IDQzLAorCS5kYXRhbGVuCT0gODEsCisJLmNhbGxiYWNrCT0gYXRwX2NvbXBsZXRlX2dleXNlcl8xXzIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0cF9pbmZvIGdleXNlcjJfaW5mbyA9IHsKKwkueHNlbnNvcnMJPSAxNSwKKwkueHNlbnNvcnNfMTcJPSAyMCwKKwkueXNlbnNvcnMJPSA5LAorCS54ZmFjdAkJPSA2NCwKKwkueWZhY3QJCT0gNDMsCisJLmRhdGFsZW4JPSA2NCwKKwkuY2FsbGJhY2sJPSBhdHBfY29tcGxldGVfZ2V5c2VyXzFfMiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRwX2luZm8gZ2V5c2VyM19pbmZvID0geworCS54c2Vuc29ycwk9IDIwLAorCS55c2Vuc29ycwk9IDEwLAorCS54ZmFjdAkJPSA2NCwKKwkueWZhY3QJCT0gNjQsCisJLmRhdGFsZW4JPSA2NCwKKwkuY2FsbGJhY2sJPSBhdHBfY29tcGxldGVfZ2V5c2VyXzNfNCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRwX2luZm8gZ2V5c2VyNF9pbmZvID0geworCS54c2Vuc29ycwk9IDIwLAorCS55c2Vuc29ycwk9IDEwLAorCS54ZmFjdAkJPSA2NCwKKwkueWZhY3QJCT0gNjQsCisJLmRhdGFsZW4JPSA2NCwKKwkuY2FsbGJhY2sJPSBhdHBfY29tcGxldGVfZ2V5c2VyXzNfNCwKK307CisKKyNkZWZpbmUgQVRQX0RFVklDRShwcm9kLCBpbmZvKQkJCQkJXAogewkJCQkJCQkJXAogCS5tYXRjaF9mbGFncyA9IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFIHwJCVwKIAkJICAgICAgIFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0NMQVNTIHwJCVwKQEAgLTUzLDcgKzExMSw3IEBACiAJLmlkUHJvZHVjdCA9IChwcm9kKSwJCQkJCVwKIAkuYkludGVyZmFjZUNsYXNzID0gMHgwMywJCQkJXAogCS5iSW50ZXJmYWNlUHJvdG9jb2wgPSAweDAyLAkJCQlcCi0JLmRyaXZlcl9pbmZvID0gQVRQXyAjIyB0eXBlLAkJCQlcCisJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICZpbmZvLAkJCVwKIH0KIAogLyoKQEAgLTYyLDQzICsxMjAsMzkgQEAKICAqICBBY2NvcmRpbmcgdG8gSW5mby5wbGlzdCBHZXlzZXIgSVYgaXMgdGhlIHNhbWUgYXMgR2V5c2VyIElJSS4pCiAgKi8KIAotc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGF0cF90YWJsZSBbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBhdHBfdGFibGVbXSA9IHsKIAkvKiBQb3dlckJvb2tzIEZlYiAyMDA1LCBpQm9va3MgRzQgKi8KLQlBVFBfREVWSUNFKDB4MDIwZSwgRk9VTlRBSU4pLAkvKiBGT1VOVEFJTiBBTlNJICovCi0JQVRQX0RFVklDRSgweDAyMGYsIEZPVU5UQUlOKSwJLyogRk9VTlRBSU4gSVNPICovCi0JQVRQX0RFVklDRSgweDAzMGEsIEZPVU5UQUlOKSwJLyogRk9VTlRBSU4gVFAgT05MWSAqLwotCUFUUF9ERVZJQ0UoMHgwMzBiLCBHRVlTRVIxKSwJLyogR0VZU0VSIDEgVFAgT05MWSAqLworCUFUUF9ERVZJQ0UoMHgwMjBlLCBmb3VudGFpbl9pbmZvKSwJLyogRk9VTlRBSU4gQU5TSSAqLworCUFUUF9ERVZJQ0UoMHgwMjBmLCBmb3VudGFpbl9pbmZvKSwJLyogRk9VTlRBSU4gSVNPICovCisJQVRQX0RFVklDRSgweDAzMGEsIGZvdW50YWluX2luZm8pLAkvKiBGT1VOVEFJTiBUUCBPTkxZICovCisJQVRQX0RFVklDRSgweDAzMGIsIGdleXNlcjFfaW5mbyksCS8qIEdFWVNFUiAxIFRQIE9OTFkgKi8KIAogCS8qIFBvd2VyQm9va3MgT2N0IDIwMDUgKi8KLQlBVFBfREVWSUNFKDB4MDIxNCwgR0VZU0VSMiksCS8qIEdFWVNFUiAyIEFOU0kgKi8KLQlBVFBfREVWSUNFKDB4MDIxNSwgR0VZU0VSMiksCS8qIEdFWVNFUiAyIElTTyAqLwotCUFUUF9ERVZJQ0UoMHgwMjE2LCBHRVlTRVIyKSwJLyogR0VZU0VSIDIgSklTICovCisJQVRQX0RFVklDRSgweDAyMTQsIGdleXNlcjJfaW5mbyksCS8qIEdFWVNFUiAyIEFOU0kgKi8KKwlBVFBfREVWSUNFKDB4MDIxNSwgZ2V5c2VyMl9pbmZvKSwJLyogR0VZU0VSIDIgSVNPICovCisJQVRQX0RFVklDRSgweDAyMTYsIGdleXNlcjJfaW5mbyksCS8qIEdFWVNFUiAyIEpJUyAqLwogCiAJLyogQ29yZSBEdW8gTWFjQm9vayAmIE1hY0Jvb2sgUHJvICovCi0JQVRQX0RFVklDRSgweDAyMTcsIEdFWVNFUjMpLAkvKiBHRVlTRVIgMyBBTlNJICovCi0JQVRQX0RFVklDRSgweDAyMTgsIEdFWVNFUjMpLAkvKiBHRVlTRVIgMyBJU08gKi8KLQlBVFBfREVWSUNFKDB4MDIxOSwgR0VZU0VSMyksCS8qIEdFWVNFUiAzIEpJUyAqLworCUFUUF9ERVZJQ0UoMHgwMjE3LCBnZXlzZXIzX2luZm8pLAkvKiBHRVlTRVIgMyBBTlNJICovCisJQVRQX0RFVklDRSgweDAyMTgsIGdleXNlcjNfaW5mbyksCS8qIEdFWVNFUiAzIElTTyAqLworCUFUUF9ERVZJQ0UoMHgwMjE5LCBnZXlzZXIzX2luZm8pLAkvKiBHRVlTRVIgMyBKSVMgKi8KIAogCS8qIENvcmUyIER1byBNYWNCb29rICYgTWFjQm9vayBQcm8gKi8KLQlBVFBfREVWSUNFKDB4MDIxYSwgR0VZU0VSNCksCS8qIEdFWVNFUiA0IEFOU0kgKi8KLQlBVFBfREVWSUNFKDB4MDIxYiwgR0VZU0VSNCksCS8qIEdFWVNFUiA0IElTTyAqLwotCUFUUF9ERVZJQ0UoMHgwMjFjLCBHRVlTRVI0KSwJLyogR0VZU0VSIDQgSklTICovCisJQVRQX0RFVklDRSgweDAyMWEsIGdleXNlcjRfaW5mbyksCS8qIEdFWVNFUiA0IEFOU0kgKi8KKwlBVFBfREVWSUNFKDB4MDIxYiwgZ2V5c2VyNF9pbmZvKSwJLyogR0VZU0VSIDQgSVNPICovCisJQVRQX0RFVklDRSgweDAyMWMsIGdleXNlcjRfaW5mbyksCS8qIEdFWVNFUiA0IEpJUyAqLwogCiAJLyogQ29yZTIgRHVvIE1hY0Jvb2szLDEgKi8KLQlBVFBfREVWSUNFKDB4MDIyOSwgR0VZU0VSNCksCS8qIEdFWVNFUiA0IEhGIEFOU0kgKi8KLQlBVFBfREVWSUNFKDB4MDIyYSwgR0VZU0VSNCksCS8qIEdFWVNFUiA0IEhGIElTTyAqLwotCUFUUF9ERVZJQ0UoMHgwMjJiLCBHRVlTRVI0KSwJLyogR0VZU0VSIDQgSEYgSklTICovCisJQVRQX0RFVklDRSgweDAyMjksIGdleXNlcjRfaW5mbyksCS8qIEdFWVNFUiA0IEhGIEFOU0kgKi8KKwlBVFBfREVWSUNFKDB4MDIyYSwgZ2V5c2VyNF9pbmZvKSwJLyogR0VZU0VSIDQgSEYgSVNPICovCisJQVRQX0RFVklDRSgweDAyMmIsIGdleXNlcjRfaW5mbyksCS8qIEdFWVNFUiA0IEhGIEpJUyAqLwogCiAJLyogVGVybWluYXRpbmcgZW50cnkgKi8KIAl7IH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgYXRwX3RhYmxlKTsKIAotLyoKLSAqIG51bWJlciBvZiBzZW5zb3JzLiBOb3RlIHRoYXQgb25seSAxNiBpbnN0ZWFkIG9mIDI2IFggKGhvcml6b250YWwpCi0gKiBzZW5zb3JzIGV4aXN0IG9uIDEyIiBhbmQgMTUiIFBvd2VyQm9va3MuIEFsbCBtb2RlbHMgaGF2ZSAxNiBZCi0gKiAodmVydGljYWwpIHNlbnNvcnMuCi0gKi8KKy8qIG1heGltdW0gbnVtYmVyIG9mIHNlbnNvcnMgKi8KICNkZWZpbmUgQVRQX1hTRU5TT1JTCTI2CiAjZGVmaW5lIEFUUF9ZU0VOU09SUwkxNgogCkBAIC0xMDcsMjEgKzE2MSw2IEBACiAKIC8qIG1heGltdW0gcHJlc3N1cmUgdGhpcyBkcml2ZXIgd2lsbCByZXBvcnQgKi8KICNkZWZpbmUgQVRQX1BSRVNTVVJFCTMwMAotLyoKLSAqIG11bHRpcGxpY2F0aW9uIGZhY3RvciBmb3IgdGhlIFggYW5kIFkgY29vcmRpbmF0ZXMuCi0gKiBXZSB0cnkgdG8ga2VlcCB0aGUgdG91Y2hwYWQgYXNwZWN0IHJhdGlvIHdoaWxlIHN0aWxsIGRvaW5nIG9ubHkgc2ltcGxlCi0gKiBhcml0aG1ldGljcy4KLSAqIFRoZSBmYWN0b3JzIGJlbG93IGdpdmUgY29vcmRpbmF0ZXMgbGlrZToKLSAqCi0gKiAgICAgIDAgPD0geCA8ICA5NjAgb24gMTIiIGFuZCAxNSIgUG93ZXJib29rcwotICogICAgICAwIDw9IHggPCAxNjAwIG9uIDE3IiBQb3dlcmJvb2tzIGFuZCAxNyIgTWFjQm9vayBQcm8KLSAqICAgICAgMCA8PSB4IDwgMTIxNiBvbiBNYWNCb29rcyBhbmQgMTUiIE1hY0Jvb2sgUHJvCi0gKgotICogICAgICAwIDw9IHkgPCAgNjQ2IG9uIGFsbCBQb3dlcmJvb2tzCi0gKiAgICAgIDAgPD0geSA8ICA3NzQgb24gYWxsIE1hY0Jvb2tzCi0gKi8KLSNkZWZpbmUgQVRQX1hGQUNUCTY0Ci0jZGVmaW5lIEFUUF9ZRkFDVAk0MwogCiAvKgogICogVGhyZXNob2xkIGZvciB0aGUgdG91Y2hwYWQgc2Vuc29ycy4gQW55IGNoYW5nZSBsZXNzIHRoYW4gQVRQX1RIUkVTSE9MRCBpcwpAQCAtMTU5LDcgKzE5OCw3IEBACiAJc3RydWN0IHVyYgkJKnVyYjsJCS8qIHVzYiByZXF1ZXN0IGJsb2NrICovCiAJdTgJCQkqZGF0YTsJCS8qIHRyYW5zZmVycmVkIGRhdGEgKi8KIAlzdHJ1Y3QgaW5wdXRfZGV2CSppbnB1dDsJCS8qIGlucHV0IGRldiAqLwotCWVudW0gYXRwX3RvdWNocGFkX3R5cGUJdHlwZTsJCS8qIHR5cGUgb2YgdG91Y2hwYWQgKi8KKwljb25zdCBzdHJ1Y3QgYXRwX2luZm8JKmluZm87CQkvKiB0b3VjaHBhZCBtb2RlbCAqLwogCWJvb2wJCQlvcGVuOwogCWJvb2wJCQl2YWxpZDsJCS8qIGFyZSB0aGUgc2FtcGxlcyB2YWxpZD8gKi8KIAlib29sCQkJc2l6ZV9kZXRlY3RfZG9uZTsKQEAgLTE2OSw3ICsyMDgsNiBAQAogCXNpZ25lZCBjaGFyCQl4eV9jdXJbQVRQX1hTRU5TT1JTICsgQVRQX1lTRU5TT1JTXTsKIAlzaWduZWQgY2hhcgkJeHlfb2xkW0FUUF9YU0VOU09SUyArIEFUUF9ZU0VOU09SU107CiAJaW50CQkJeHlfYWNjW0FUUF9YU0VOU09SUyArIEFUUF9ZU0VOU09SU107Ci0JaW50CQkJZGF0YWxlbjsJLyogc2l6ZSBvZiBVU0IgdHJhbnNmZXIgKi8KIAlpbnQJCQlpZGxlY291bnQ7CS8qIG51bWJlciBvZiBlbXB0eSBwYWNrZXRzICovCiAJc3RydWN0IHdvcmtfc3RydWN0CXdvcms7CiB9OwpAQCAtMzU5LDcgKzM5Nyw3IEBACiAJCWlmICghZGV2LT5vdmVyZmxvd193YXJuZWQpIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgImFwcGxldG91Y2g6IE9WRVJGTE9XIHdpdGggZGF0YSAiCiAJCQkJImxlbmd0aCAlZCwgYWN0dWFsIGxlbmd0aCBpcyAlZFxuIiwKLQkJCQlkZXYtPmRhdGFsZW4sIGRldi0+dXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJCQlkZXYtPmluZm8tPmRhdGFsZW4sIGRldi0+dXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAkJCWRldi0+b3ZlcmZsb3dfd2FybmVkID0gdHJ1ZTsKIAkJfQogCWNhc2UgLUVDT05OUkVTRVQ6CkBAIC0zNzcsNyArNDE1LDcgQEAKIAl9CiAKIAkvKiBkcm9wIGluY29tcGxldGUgZGF0YXNldHMgKi8KLQlpZiAoZGV2LT51cmItPmFjdHVhbF9sZW5ndGggIT0gZGV2LT5kYXRhbGVuKSB7CisJaWYgKGRldi0+dXJiLT5hY3R1YWxfbGVuZ3RoICE9IGRldi0+aW5mby0+ZGF0YWxlbikgewogCQlkcHJpbnRrKCJhcHBsZXRvdWNoOiBpbmNvbXBsZXRlIGRhdGEgcGFja2FnZSIKIAkJCSIgKGZpcnN0IGJ5dGU6ICVkLCBsZW5ndGg6ICVkKS5cbiIsCiAJCQlkZXYtPmRhdGFbMF0sIGRldi0+dXJiLT5hY3R1YWxfbGVuZ3RoKTsKQEAgLTM4Nyw2ICs0MjUsMjUgQEAKIAlyZXR1cm4gQVRQX1VSQl9TVEFUVVNfU1VDQ0VTUzsKIH0KIAorc3RhdGljIHZvaWQgYXRwX2RldGVjdF9zaXplKHN0cnVjdCBhdHAgKmRldikKK3sKKwlpbnQgaTsKKworCS8qIDE3IiBQb3dlcmJvb2tzIGhhdmUgZXh0cmEgWCBzZW5zb3JzICovCisJZm9yIChpID0gZGV2LT5pbmZvLT54c2Vuc29yczsgaSA8IEFUUF9YU0VOU09SUzsgaSsrKSB7CisJCWlmIChkZXYtPnh5X2N1cltpXSkgeworCisJCQlwcmludGsoS0VSTl9JTkZPICJhcHBsZXRvdWNoOiAxN1wiIG1vZGVsIGRldGVjdGVkLlxuIik7CisKKwkJCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldi0+aW5wdXQsIEFCU19YLCAwLAorCQkJCQkgICAgIChkZXYtPmluZm8tPnhzZW5zb3JzXzE3IC0gMSkgKgorCQkJCQkJCWRldi0+aW5mby0+eGZhY3QgLSAxLAorCQkJCQkgICAgIEFUUF9GVVpaLCAwKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCiAvKgogICogVVNCIGludGVycnVwdCBjYWxsYmFjayBmdW5jdGlvbnMKICAqLwpAQCAtNDA3LDcgKzQ2NCw3IEBACiAJCWdvdG8gZXhpdDsKIAogCS8qIHJlb3JkZXIgdGhlIHNlbnNvcnMgdmFsdWVzICovCi0JaWYgKGRldi0+dHlwZSA9PSBBVFBfR0VZU0VSMikgeworCWlmIChkZXYtPmluZm8gPT0gJmdleXNlcjJfaW5mbykgewogCQltZW1zZXQoZGV2LT54eV9jdXIsIDAsIHNpemVvZihkZXYtPnh5X2N1cikpOwogCiAJCS8qCkBAIC00MzcsOCArNDk0LDggQEAKIAkJCQlkZXYtPnh5X2N1cltpICsgMjRdID0gZGV2LT5kYXRhWzUgKiBpICsgNDRdOwogCiAJCQkvKiBZIHZhbHVlcyAqLwotCQkJZGV2LT54eV9jdXJbaSArIDI2XSA9IGRldi0+ZGF0YVs1ICogaSArICAxXTsKLQkJCWRldi0+eHlfY3VyW2kgKyAzNF0gPSBkZXYtPmRhdGFbNSAqIGkgKyAgM107CisJCQlkZXYtPnh5X2N1cltBVFBfWFNFTlNPUlMgKyBpXSA9IGRldi0+ZGF0YVs1ICogaSArICAxXTsKKwkJCWRldi0+eHlfY3VyW0FUUF9YU0VOU09SUyArIGkgKyA4XSA9IGRldi0+ZGF0YVs1ICogaSArIDNdOwogCQl9CiAJfQogCkBAIC00NTMsMzIgKzUxMCw4IEBACiAJCW1lbWNweShkZXYtPnh5X29sZCwgZGV2LT54eV9jdXIsIHNpemVvZihkZXYtPnh5X29sZCkpOwogCiAJCS8qIFBlcmZvcm0gc2l6ZSBkZXRlY3Rpb24sIGlmIG5vdCBkb25lIGFscmVhZHkgKi8KLQkJaWYgKCFkZXYtPnNpemVfZGV0ZWN0X2RvbmUpIHsKLQotCQkJLyogMTciIFBvd2VyYm9va3MgaGF2ZSBleHRyYSBYIHNlbnNvcnMgKi8KLQkJCWZvciAoaSA9IChkZXYtPnR5cGUgPT0gQVRQX0dFWVNFUjIgPyAxNSA6IDE2KTsKLQkJCSAgICAgaSA8IEFUUF9YU0VOU09SUzsgaSsrKSB7Ci0JCQkJaWYgKCFkZXYtPnh5X2N1cltpXSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlwcmludGsoS0VSTl9JTkZPCi0JCQkJCSJhcHBsZXRvdWNoOiAxN1wiIG1vZGVsIGRldGVjdGVkLlxuIik7Ci0KLQkJCQlpZiAoZGV2LT50eXBlID09IEFUUF9HRVlTRVIyKQotCQkJCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhkZXYtPmlucHV0LCBBQlNfWCwKLQkJCQkJCQkgICAgIDAsCi0JCQkJCQkJICAgICAoMjAgLSAxKSAqCi0JCQkJCQkJICAgICBBVFBfWEZBQ1QgLSAxLAotCQkJCQkJCSAgICAgQVRQX0ZVWlosIDApOwotCQkJCWVsc2UKLQkJCQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2LT5pbnB1dCwgQUJTX1gsCi0JCQkJCQkJICAgICAwLAotCQkJCQkJCSAgICAgKDI2IC0gMSkgKgotCQkJCQkJCSAgICAgQVRQX1hGQUNUIC0gMSwKLQkJCQkJCQkgICAgIEFUUF9GVVpaLCAwKTsKLQkJCQlicmVhazsKLQkJCX0KLQorCQlpZiAodW5saWtlbHkoIWRldi0+c2l6ZV9kZXRlY3RfZG9uZSkpIHsKKwkJCWF0cF9kZXRlY3Rfc2l6ZShkZXYpOwogCQkJZGV2LT5zaXplX2RldGVjdF9kb25lID0gMTsKIAkJCWdvdG8gZXhpdDsKIAkJfQpAQCAtNDk5LDEwICs1MzIsMTAgQEAKIAlkYmdfZHVtcCgiYWNjdW11bGF0b3IiLCBkZXYtPnh5X2FjYyk7CiAKIAl4ID0gYXRwX2NhbGN1bGF0ZV9hYnMoZGV2LT54eV9hY2MsIEFUUF9YU0VOU09SUywKLQkJCSAgICAgIEFUUF9YRkFDVCwgJnhfeiwgJnhfZik7CisJCQkgICAgICBkZXYtPmluZm8tPnhmYWN0LCAmeF96LCAmeF9mKTsKIAl5ID0gYXRwX2NhbGN1bGF0ZV9hYnMoZGV2LT54eV9hY2MgKyBBVFBfWFNFTlNPUlMsIEFUUF9ZU0VOU09SUywKLQkJCSAgICAgIEFUUF9ZRkFDVCwgJnlfeiwgJnlfZik7Ci0Ja2V5ID0gZGV2LT5kYXRhW2Rldi0+ZGF0YWxlbiAtIDFdICYgQVRQX1NUQVRVU19CVVRUT047CisJCQkgICAgICBkZXYtPmluZm8tPnlmYWN0LCAmeV96LCAmeV9mKTsKKwlrZXkgPSBkZXYtPmRhdGFbZGV2LT5pbmZvLT5kYXRhbGVuIC0gMV0gJiBBVFBfU1RBVFVTX0JVVFRPTjsKIAogCWlmICh4ICYmIHkpIHsKIAkJaWYgKGRldi0+eF9vbGQgIT0gLTEpIHsKQEAgLTU4Myw3ICs2MTYsNyBAQAogCWRiZ19kdW1wKCJzYW1wbGUiLCBkZXYtPnh5X2N1cik7CiAKIAkvKiBKdXN0IHVwZGF0ZSB0aGUgYmFzZSB2YWx1ZXMgKGkuZS4gdG91Y2hwYWQgaW4gdW50b3VjaGVkIHN0YXRlKSAqLwotCWlmIChkZXYtPmRhdGFbZGV2LT5kYXRhbGVuIC0gMV0gJiBBVFBfU1RBVFVTX0JBU0VfVVBEQVRFKSB7CisJaWYgKGRldi0+ZGF0YVtkZXYtPmluZm8tPmRhdGFsZW4gLSAxXSAmIEFUUF9TVEFUVVNfQkFTRV9VUERBVEUpIHsKIAogCQlkcHJpbnRrKEtFUk5fREVCVUcgImFwcGxldG91Y2g6IHVwZGF0ZWQgYmFzZSB2YWx1ZXNcbiIpOwogCkBAIC02MTAsMTAgKzY0MywxMCBAQAogCWRiZ19kdW1wKCJhY2N1bXVsYXRvciIsIGRldi0+eHlfYWNjKTsKIAogCXggPSBhdHBfY2FsY3VsYXRlX2FicyhkZXYtPnh5X2FjYywgQVRQX1hTRU5TT1JTLAotCQkJICAgICAgQVRQX1hGQUNULCAmeF96LCAmeF9mKTsKKwkJCSAgICAgIGRldi0+aW5mby0+eGZhY3QsICZ4X3osICZ4X2YpOwogCXkgPSBhdHBfY2FsY3VsYXRlX2FicyhkZXYtPnh5X2FjYyArIEFUUF9YU0VOU09SUywgQVRQX1lTRU5TT1JTLAotCQkJICAgICAgQVRQX1lGQUNULCAmeV96LCAmeV9mKTsKLQlrZXkgPSBkZXYtPmRhdGFbZGV2LT5kYXRhbGVuIC0gMV0gJiBBVFBfU1RBVFVTX0JVVFRPTjsKKwkJCSAgICAgIGRldi0+aW5mby0+eWZhY3QsICZ5X3osICZ5X2YpOworCWtleSA9IGRldi0+ZGF0YVtkZXYtPmluZm8tPmRhdGFsZW4gLSAxXSAmIEFUUF9TVEFUVVNfQlVUVE9OOwogCiAJaWYgKHggJiYgeSkgewogCQlpZiAoZGV2LT54X29sZCAhPSAtMSkgewpAQCAtNzA1LDcgKzczOCw3IEBACiB7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBkZXYtPnVkZXY7CiAKLQlpZiAoZGV2LT50eXBlICE9IEFUUF9GT1VOVEFJTikgeworCWlmIChkZXYtPmluZm8gIT0gJmZvdW50YWluX2luZm8pIHsKIAkJLyogc3dpdGNoIHRvIHJhdyBzZW5zb3IgbW9kZSAqLwogCQlpZiAoYXRwX2dleXNlcl9pbml0KHVkZXYpKQogCQkJcmV0dXJuIC1FSU87CkBAIC03MjYsNiArNzU5LDcgQEAKIAlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OwogCWludCBpbnRfaW5fZW5kcG9pbnRBZGRyID0gMDsKIAlpbnQgaSwgZXJyb3IgPSAtRU5PTUVNOworCWNvbnN0IHN0cnVjdCBhdHBfaW5mbyAqaW5mbyA9IChjb25zdCBzdHJ1Y3QgYXRwX2luZm8gKilpZC0+ZHJpdmVyX2luZm87CiAKIAkvKiBzZXQgdXAgdGhlIGVuZHBvaW50IGluZm9ybWF0aW9uICovCiAJLyogdXNlIG9ubHkgdGhlIGZpcnN0IGludGVycnVwdC1pbiBlbmRwb2ludCAqLwpAQCAtNzUzLDM1ICs3ODcsMjIgQEAKIAogCWRldi0+dWRldiA9IHVkZXY7CiAJZGV2LT5pbnB1dCA9IGlucHV0X2RldjsKLQlkZXYtPnR5cGUgPSBpZC0+ZHJpdmVyX2luZm87CisJZGV2LT5pbmZvID0gaW5mbzsKIAlkZXYtPm92ZXJmbG93X3dhcm5lZCA9IGZhbHNlOwotCWlmIChkZXYtPnR5cGUgPT0gQVRQX0ZPVU5UQUlOIHx8IGRldi0+dHlwZSA9PSBBVFBfR0VZU0VSMSkKLQkJZGV2LT5kYXRhbGVuID0gODE7Ci0JZWxzZQotCQlkZXYtPmRhdGFsZW4gPSA2NDsKIAogCWRldi0+dXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRldi0+dXJiKQogCQlnb3RvIGVycl9mcmVlX2RldnM7CiAKLQlkZXYtPmRhdGEgPSB1c2JfYnVmZmVyX2FsbG9jKGRldi0+dWRldiwgZGV2LT5kYXRhbGVuLCBHRlBfS0VSTkVMLAorCWRldi0+ZGF0YSA9IHVzYl9idWZmZXJfYWxsb2MoZGV2LT51ZGV2LCBkZXYtPmluZm8tPmRhdGFsZW4sIEdGUF9LRVJORUwsCiAJCQkJICAgICAmZGV2LT51cmItPnRyYW5zZmVyX2RtYSk7CiAJaWYgKCFkZXYtPmRhdGEpCiAJCWdvdG8gZXJyX2ZyZWVfdXJiOwogCi0JLyogU2VsZWN0IHRoZSBVU0IgY29tcGxldGUgKGNhbGxiYWNrKSBmdW5jdGlvbiAqLwotCWlmIChkZXYtPnR5cGUgPT0gQVRQX0ZPVU5UQUlOIHx8Ci0JICAgIGRldi0+dHlwZSA9PSBBVFBfR0VZU0VSMSB8fAotCSAgICBkZXYtPnR5cGUgPT0gQVRQX0dFWVNFUjIpCi0JCXVzYl9maWxsX2ludF91cmIoZGV2LT51cmIsIHVkZXYsCi0JCQkJIHVzYl9yY3ZpbnRwaXBlKHVkZXYsIGludF9pbl9lbmRwb2ludEFkZHIpLAotCQkJCSBkZXYtPmRhdGEsIGRldi0+ZGF0YWxlbiwKLQkJCQkgYXRwX2NvbXBsZXRlX2dleXNlcl8xXzIsIGRldiwgMSk7Ci0JZWxzZQotCQl1c2JfZmlsbF9pbnRfdXJiKGRldi0+dXJiLCB1ZGV2LAotCQkJCSB1c2JfcmN2aW50cGlwZSh1ZGV2LCBpbnRfaW5fZW5kcG9pbnRBZGRyKSwKLQkJCQkgZGV2LT5kYXRhLCBkZXYtPmRhdGFsZW4sCi0JCQkJIGF0cF9jb21wbGV0ZV9nZXlzZXJfM180LCBkZXYsIDEpOworCXVzYl9maWxsX2ludF91cmIoZGV2LT51cmIsIHVkZXYsCisJCQkgdXNiX3JjdmludHBpcGUodWRldiwgaW50X2luX2VuZHBvaW50QWRkciksCisJCQkgZGV2LT5kYXRhLCBkZXYtPmluZm8tPmRhdGFsZW4sCisJCQkgZGV2LT5pbmZvLT5jYWxsYmFjaywgZGV2LCAxKTsKIAogCWVycm9yID0gYXRwX2hhbmRsZV9nZXlzZXIoZGV2KTsKIAlpZiAoZXJyb3IpCkBAIC04MDIsMzUgKzgyMywxMiBAQAogCiAJc2V0X2JpdChFVl9BQlMsIGlucHV0X2Rldi0+ZXZiaXQpOwogCi0JaWYgKGRldi0+dHlwZSA9PSBBVFBfR0VZU0VSMyB8fCBkZXYtPnR5cGUgPT0gQVRQX0dFWVNFUjQpIHsKLQkJLyoKLQkJICogTWFjQm9vayBoYXZlIDIwIFggc2Vuc29ycywgMTAgWSBzZW5zb3JzCi0JCSAqLwotCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19YLCAwLAotCQkJCSAgICAgKCgyMCAtIDEpICogQVRQX1hGQUNUKSAtIDEsIEFUUF9GVVpaLCAwKTsKLQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfWSwgMCwKLQkJCQkgICAgICgoMTAgLSAxKSAqIEFUUF9ZRkFDVCkgLSAxLCBBVFBfRlVaWiwgMCk7Ci0JfSBlbHNlIGlmIChkZXYtPnR5cGUgPT0gQVRQX0dFWVNFUjIpIHsKLQkJLyoKLQkJICogT2N0IDIwMDUgMTUiIFBvd2VyQm9va3MgaGF2ZSAxNSBYIHNlbnNvcnMsIDE3IiBhcmUgZGV0ZWN0ZWQKLQkJICogbGF0ZXIuCi0JCSAqLwotCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19YLCAwLAotCQkJCSAgICAgKCgxNSAtIDEpICogQVRQX1hGQUNUKSAtIDEsIEFUUF9GVVpaLCAwKTsKLQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfWSwgMCwKLQkJCQkgICAgICgoOSAtIDEpICogQVRQX1lGQUNUKSAtIDEsIEFUUF9GVVpaLCAwKTsKLQl9IGVsc2UgewotCQkvKgotCQkgKiAxMiIgYW5kIDE1IiBQb3dlcmJvb2tzIG9ubHkgaGF2ZSAxNiB4IHNlbnNvcnMsCi0JCSAqIDE3IiBtb2RlbHMgYXJlIGRldGVjdGVkIGxhdGVyLgotCQkgKi8KLQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfWCwgMCwKLQkJCQkgICAgICgxNiAtIDEpICogQVRQX1hGQUNUIC0gMSwKLQkJCQkgICAgIEFUUF9GVVpaLCAwKTsKLQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfWSwgMCwKLQkJCQkgICAgIChBVFBfWVNFTlNPUlMgLSAxKSAqIEFUUF9ZRkFDVCAtIDEsCi0JCQkJICAgICBBVFBfRlVaWiwgMCk7Ci0JfQorCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1gsIDAsCisJCQkgICAgIChkZXYtPmluZm8tPnhzZW5zb3JzIC0gMSkgKiBkZXYtPmluZm8tPnhmYWN0IC0gMSwKKwkJCSAgICAgQVRQX0ZVWlosIDApOworCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1ksIDAsCisJCQkgICAgIChkZXYtPmluZm8tPnlzZW5zb3JzIC0gMSkgKiBkZXYtPmluZm8tPnlmYWN0IC0gMSwKKwkJCSAgICAgQVRQX0ZVWlosIDApOwogCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1BSRVNTVVJFLCAwLCBBVFBfUFJFU1NVUkUsIDAsIDApOwogCiAJc2V0X2JpdChFVl9LRVksIGlucHV0X2Rldi0+ZXZiaXQpOwpAQCAtODUyLDcgKzg1MCw3IEBACiAJcmV0dXJuIDA7CiAKICBlcnJfZnJlZV9idWZmZXI6Ci0JdXNiX2J1ZmZlcl9mcmVlKGRldi0+dWRldiwgZGV2LT5kYXRhbGVuLAorCXVzYl9idWZmZXJfZnJlZShkZXYtPnVkZXYsIGRldi0+aW5mby0+ZGF0YWxlbiwKIAkJCWRldi0+ZGF0YSwgZGV2LT51cmItPnRyYW5zZmVyX2RtYSk7CiAgZXJyX2ZyZWVfdXJiOgogCXVzYl9mcmVlX3VyYihkZXYtPnVyYik7CkBAIC04NzEsNyArODY5LDcgQEAKIAlpZiAoZGV2KSB7CiAJCXVzYl9raWxsX3VyYihkZXYtPnVyYik7CiAJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGRldi0+aW5wdXQpOwotCQl1c2JfYnVmZmVyX2ZyZWUoZGV2LT51ZGV2LCBkZXYtPmRhdGFsZW4sCisJCXVzYl9idWZmZXJfZnJlZShkZXYtPnVkZXYsIGRldi0+aW5mby0+ZGF0YWxlbiwKIAkJCQlkZXYtPmRhdGEsIGRldi0+dXJiLT50cmFuc2Zlcl9kbWEpOwogCQl1c2JfZnJlZV91cmIoZGV2LT51cmIpOwogCQlrZnJlZShkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9ncGlvX21vdXNlLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL2dwaW9fbW91c2UuYwppbmRleCA3MmNmNWUzLi4wZGI4ZDE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL2dwaW9fbW91c2UuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL2dwaW9fbW91c2UuYwpAQCAtMTczLDcgKzE3Myw3IEBACiAvKiB3b3JrIHdpdGggaG90cGx1ZyBhbmQgY29sZHBsdWcgKi8KIE1PRFVMRV9BTElBUygicGxhdGZvcm06Z3Bpb19tb3VzZSIpOwogCi1zdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGdwaW9fbW91c2VfZGV2aWNlX2RyaXZlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGdwaW9fbW91c2VfZGV2aWNlX2RyaXZlciA9IHsKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGdwaW9fbW91c2VfcmVtb3ZlKSwKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSAiZ3Bpb19tb3VzZSIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL2hncGsuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvaGdway5jCmluZGV4IDg4ZjA0YmYuLjgxZTZlYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvaGdway5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvaGdway5jCkBAIC00OCw2ICs0OCwzMCBAQAogTU9EVUxFX1BBUk1fREVTQyhyZWNhbGliX2RlbHRhLAogCSJwYWNrZXRzIGNvbnRhaW5pbmcgYSBkZWx0YSB0aGlzIGxhcmdlIHdpbGwgY2F1c2UgYSByZWNhbGlicmF0aW9uLiIpOwogCitzdGF0aWMgaW50IGp1bXB5X2RlbGF5ID0gMTAwMDsKK21vZHVsZV9wYXJhbShqdW1weV9kZWxheSwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoanVtcHlfZGVsYXksCisJImRlbGF5IChtcykgYmVmb3JlIHJlY2FsIGFmdGVyIGp1bXBpbmVzcyBkZXRlY3RlZCIpOworCitzdGF0aWMgaW50IHNwZXdfZGVsYXkgPSAxMDAwOworbW9kdWxlX3BhcmFtKHNwZXdfZGVsYXksIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHNwZXdfZGVsYXksCisJImRlbGF5IChtcykgYmVmb3JlIHJlY2FsIGFmdGVyIHBhY2tldCBzcGV3IGRldGVjdGVkIik7CisKK3N0YXRpYyBpbnQgcmVjYWxfZ3VhcmRfdGltZSA9IDIwMDA7Cittb2R1bGVfcGFyYW0ocmVjYWxfZ3VhcmRfdGltZSwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MocmVjYWxfZ3VhcmRfdGltZSwKKwkiaW50ZXJ2YWwgKG1zKSBkdXJpbmcgd2hpY2ggcmVjYWwgd2lsbCBiZSByZXN0YXJ0ZWQgaWYgcGFja2V0IHJlY2VpdmVkIik7CisKK3N0YXRpYyBpbnQgcG9zdF9pbnRlcnJ1cHRfZGVsYXkgPSAxMDAwOworbW9kdWxlX3BhcmFtKHBvc3RfaW50ZXJydXB0X2RlbGF5LCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhwb3N0X2ludGVycnVwdF9kZWxheSwKKwkiZGVsYXkgKG1zKSBiZWZvcmUgcmVjYWwgYWZ0ZXIgcmVjYWwgaW50ZXJydXB0IGRldGVjdGVkIik7CisKK3N0YXRpYyBpbnQgYXV0b3JlY2FsID0gMTsKK21vZHVsZV9wYXJhbShhdXRvcmVjYWwsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGF1dG9yZWNhbCwgImVuYWJsZSByZWNhbGlicmF0aW9uIGluIHRoZSBkcml2ZXIiKTsKKwogLyoKICAqIFdoZW4gdGhlIHRvdWNocGFkIGdldHMgdWx0cmEtc2Vuc2l0aXZlLCBvbmUgY2FuIGtlZXAgdGhlaXIgZmluZ2VyIDEvMiIKICAqIGFib3ZlIHRoZSBwYWQgYW5kIHN0aWxsIGhhdmUgaXQgc2VuZCBwYWNrZXRzLiAgVGhpcyBjYXVzZXMgYSBqdW1wIGN1cnNvcgpAQCAtNjYsNyArOTAsNyBAQAogCQkvKiBNeSBjYXIgZ2V0cyBmb3J0eSByb2RzIHRvIHRoZSBob2dzaGVhZCBhbmQgdGhhdCdzIHRoZQogCQkgKiB3YXkgSSBsaWtlcyBpdCEgKi8KIAkJcHNtb3VzZV9xdWV1ZV93b3JrKHBzbW91c2UsICZwcml2LT5yZWNhbGliX3dxLAotCQkJCW1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOworCQkJCW1zZWNzX3RvX2ppZmZpZXMoanVtcHlfZGVsYXkpKTsKIAl9CiB9CiAKQEAgLTEwMyw3ICsxMjcsNyBAQAogCQkJaGdwa19kYmcocHNtb3VzZSwgInBhY2tldCBzcGV3IGRldGVjdGVkICglZCwlZClcbiIsCiAJCQkJIHByaXYtPnhfdGFsbHksIHByaXYtPnlfdGFsbHkpOwogCQkJcHNtb3VzZV9xdWV1ZV93b3JrKHBzbW91c2UsICZwcml2LT5yZWNhbGliX3dxLAotCQkJCQkgICBtc2Vjc190b19qaWZmaWVzKDEwMDApKTsKKwkJCQkJICAgbXNlY3NfdG9famlmZmllcyhzcGV3X2RlbGF5KSk7CiAJCX0KIAkJLyogcmVzZXQgZXZlcnkgMTAwIHBhY2tldHMgKi8KIAkJcHJpdi0+Y291bnQgPSAwOwpAQCAtMTgxLDcgKzIwNSw3IEBACiAJCQkJICJwYWNrZXQgaW5zaWRlIGNhbGlicmF0aW9uIHdpbmRvdywgIgogCQkJCSAicXVldWVpbmcgYW5vdGhlciByZWNhbGlicmF0aW9uXG4iKTsKIAkJCXBzbW91c2VfcXVldWVfd29yayhwc21vdXNlLCAmcHJpdi0+cmVjYWxpYl93cSwKLQkJCQkJbXNlY3NfdG9famlmZmllcygxMDAwKSk7CisJCQkJCW1zZWNzX3RvX2ppZmZpZXMocG9zdF9pbnRlcnJ1cHRfZGVsYXkpKTsKIAkJfQogCQlwcml2LT5yZWNhbGliX3dpbmRvdyA9IDA7CiAJfQpAQCAtMjMxLDcgKzI1NSw3IEBACiAJICogSWYgc29tZW9uZSdzIGZpbmdlciAqd2FzKiBvbiB0aGUgdG91Y2hwYWQsIGl0J3MgcHJvYmFibHkKIAkgKiBtaXNjYWxpYnJhdGVkLiAgU28sIHdlIHNob3VsZCBzY2hlZHVsZSBhbm90aGVyIHJlY2FsaWJyYXRpb24KIAkgKi8KLQlwcml2LT5yZWNhbGliX3dpbmRvdyA9IGppZmZpZXMgKyAgbXNlY3NfdG9famlmZmllcygyMDAwKTsKKwlwcml2LT5yZWNhbGliX3dpbmRvdyA9IGppZmZpZXMgKyAgbXNlY3NfdG9famlmZmllcyhyZWNhbF9ndWFyZF90aW1lKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9oaWxfcHRyLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL2hpbF9wdHIuYwppbmRleCBlNTMyYzQ4Li4zMjYzY2UwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL2hpbF9wdHIuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL2hpbF9wdHIuYwpAQCAtNDYsNyArNDYsNyBAQAogTU9EVUxFX0FVVEhPUigiQnJpYW4gUy4gSnVsaW4gPGJyaUBjYWx5eC5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oSElMX0dFTkVSSUNfTkFNRSAiIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwotCitNT0RVTEVfQUxJQVMoInNlcmlvOnR5MDNwcjI1aWQwRmV4KiIpOwogCiAjZGVmaW5lIFRBQkxFVF9TSU1VTEFURVNfTU9VU0UJLyogYWxsb3cgdGFibGV0IHRvIGJlIHVzZWQgYXMgbW91c2UgKi8KICN1bmRlZiAgVEFCTEVUX0FVVE9BREpVU1QJLyogYXV0by1hZGp1c3QgdmFsaWQgdGFibGV0IHJhbmdlcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9weGE5MzBfdHJrYmFsbC5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9weGE5MzBfdHJrYmFsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyOTdhY2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL3B4YTkzMF90cmtiYWxsLmMKQEAgLTAsMCArMSwyNjkgQEAKKy8qCisgKiBQWEE5MzAgdHJhY2sgYmFsbCBtb3VzZSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4KKyAqIDIwMDgtMDItMjg6IFlvbmcgWWFvIDx5YW95b25nQG1hcnZlbGwuY29tPgorICogICAgICAgICAgICAgaW5pdGlhbCB2ZXJzaW9uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL3B4YTkzMF90cmtiYWxsLmg+CisKKy8qIFRyYWNrYmFsbCBDb250cm9sbGVyIFJlZ2lzdGVyIERlZmluaXRpb25zICovCisjZGVmaW5lIFRCQ1IJCSgweDAwMEMpCisjZGVmaW5lIFRCQ05UUgkJKDB4MDAxMCkKKyNkZWZpbmUgVEJTQkMJCSgweDAwMTQpCisKKyNkZWZpbmUgVEJDUl9UQlJTVAkoMSA8PCAxKQorI2RlZmluZSBUQkNSX1RCU0IJKDEgPDwgMTApCisKKyNkZWZpbmUgVEJDUl9ZX0ZMVChuKQkoKChuKSAmIDB4ZikgPDwgNikKKyNkZWZpbmUgVEJDUl9YX0ZMVChuKQkoKChuKSAmIDB4ZikgPDwgMikKKworI2RlZmluZSBUQkNOVFJfWU0obikJKCgobikgPj4gMjQpICYgMHhmZikKKyNkZWZpbmUgVEJDTlRSX1lQKG4pCSgoKG4pID4+IDE2KSAmIDB4ZmYpCisjZGVmaW5lIFRCQ05UUl9YTShuKQkoKChuKSA+PiA4KSAmIDB4ZmYpCisjZGVmaW5lIFRCQ05UUl9YUChuKQkoKG4pICYgMHhmZikKKworI2RlZmluZSBUQlNCQ19UQlNCQwkoMHgxKQorCitzdHJ1Y3QgcHhhOTMwX3Rya2JhbGwgeworCXN0cnVjdCBweGE5MzBfdHJrYmFsbF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKworCS8qIE1lbW9yeSBNYXBwZWQgUmVnaXN0ZXIgKi8KKwlzdHJ1Y3QgcmVzb3VyY2UgKm1lbTsKKwl2b2lkIF9faW9tZW0gKm1taW9fYmFzZTsKKworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0OworfTsKKworc3RhdGljIGlycXJldHVybl90IHB4YTkzMF90cmtiYWxsX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHB4YTkzMF90cmtiYWxsICp0cmtiYWxsID0gZGV2X2lkOworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0ID0gdHJrYmFsbC0+aW5wdXQ7CisJaW50IHRiY250ciwgeCwgeTsKKworCS8qIEFjY29yZGluZyB0byB0aGUgc3BlYyBzb2Z0d2FyZSBtdXN0IHJlYWQgVEJDTlRSIHR3aWNlOgorCSAqIGlmIHRoZSByZWFkIHZhbHVlIGlzIHRoZSBzYW1lLCB0aGUgcmVhZGluZyBpcyB2YWxpZAorCSAqLworCXRiY250ciA9IF9fcmF3X3JlYWRsKHRya2JhbGwtPm1taW9fYmFzZSArIFRCQ05UUik7CisKKwlpZiAodGJjbnRyID09IF9fcmF3X3JlYWRsKHRya2JhbGwtPm1taW9fYmFzZSArIFRCQ05UUikpIHsKKwkJeCA9IChUQkNOVFJfWFAodGJjbnRyKSAtIFRCQ05UUl9YTSh0YmNudHIpKSAvIDI7CisJCXkgPSAoVEJDTlRSX1lQKHRiY250cikgLSBUQkNOVFJfWU0odGJjbnRyKSkgLyAyOworCisJCWlucHV0X3JlcG9ydF9yZWwoaW5wdXQsIFJFTF9YLCB4KTsKKwkJaW5wdXRfcmVwb3J0X3JlbChpbnB1dCwgUkVMX1ksIHkpOworCQlpbnB1dF9zeW5jKGlucHV0KTsKKwl9CisKKwlfX3Jhd193cml0ZWwoVEJTQkNfVEJTQkMsIHRya2JhbGwtPm1taW9fYmFzZSArIFRCU0JDKTsKKwlfX3Jhd193cml0ZWwoMCwgdHJrYmFsbC0+bW1pb19iYXNlICsgVEJTQkMpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiBGb3IgVEJDUiwgd2UgbmVlZCB0byB3YWl0IGZvciBhIHdoaWxlIHRvIG1ha2Ugc3VyZSBpdCBoYXMgYmVlbiBtb2RpZmllZC4gKi8KK3N0YXRpYyBpbnQgd3JpdGVfdGJjcihzdHJ1Y3QgcHhhOTMwX3Rya2JhbGwgKnRya2JhbGwsIGludCB2KQoreworCWludCBpID0gMTAwOworCisJX19yYXdfd3JpdGVsKHYsIHRya2JhbGwtPm1taW9fYmFzZSArIFRCQ1IpOworCisJd2hpbGUgKGktLSkgeworCQlpZiAoX19yYXdfcmVhZGwodHJrYmFsbC0+bW1pb19iYXNlICsgVEJDUikgPT0gdikKKwkJCWJyZWFrOworCQltc2xlZXAoMSk7CisJfQorCisJaWYgKGkgPT0gMCkgeworCQlwcl9lcnIoIiVzOiB0aW1lZCBvdXQgd3JpdGluZyBUQkNSKCV4KSFcbiIsIF9fZnVuY19fLCB2KTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHB4YTkzMF90cmtiYWxsX2NvbmZpZyhzdHJ1Y3QgcHhhOTMwX3Rya2JhbGwgKnRya2JhbGwpCit7CisJdWludDMyX3QgdGJjcjsKKworCS8qIEFjY29yZGluZyB0byBzcGVjLCBuZWVkIHRvIHdyaXRlIHRoZSBmaWx0ZXJzIG9mIHgseSB0byAweGYgZmlyc3QhICovCisJdGJjciA9IF9fcmF3X3JlYWRsKHRya2JhbGwtPm1taW9fYmFzZSArIFRCQ1IpOworCXdyaXRlX3RiY3IodHJrYmFsbCwgdGJjciB8IFRCQ1JfWF9GTFQoMHhmKSB8IFRCQ1JfWV9GTFQoMHhmKSk7CisJd3JpdGVfdGJjcih0cmtiYWxsLCBUQkNSX1hfRkxUKHRya2JhbGwtPnBkYXRhLT54X2ZpbHRlcikgfAorCQkJICAgIFRCQ1JfWV9GTFQodHJrYmFsbC0+cGRhdGEtPnlfZmlsdGVyKSk7CisKKwkvKiBBY2NvcmRpbmcgdG8gc3BlYywgc2V0IFRCQ1JfVEJSU1QgZmlyc3QsIGJlZm9yZSBjbGVhcmluZyBpdCEgKi8KKwl0YmNyID0gX19yYXdfcmVhZGwodHJrYmFsbC0+bW1pb19iYXNlICsgVEJDUik7CisJd3JpdGVfdGJjcih0cmtiYWxsLCB0YmNyIHwgVEJDUl9UQlJTVCk7CisJd3JpdGVfdGJjcih0cmtiYWxsLCB0YmNyICYgflRCQ1JfVEJSU1QpOworCisJX19yYXdfd3JpdGVsKFRCU0JDX1RCU0JDLCB0cmtiYWxsLT5tbWlvX2Jhc2UgKyBUQlNCQyk7CisJX19yYXdfd3JpdGVsKDAsIHRya2JhbGwtPm1taW9fYmFzZSArIFRCU0JDKTsKKworCXByX2RlYnVnKCIlczogZmluYWwgVEJDUj0leCFcbiIsIF9fZnVuY19fLAorCQkgX19yYXdfcmVhZGwodHJrYmFsbC0+bW1pb19iYXNlICsgVEJDUikpOworfQorCitzdGF0aWMgaW50IHB4YTkzMF90cmtiYWxsX29wZW4oc3RydWN0IGlucHV0X2RldiAqZGV2KQoreworCXN0cnVjdCBweGE5MzBfdHJrYmFsbCAqdHJrYmFsbCA9IGlucHV0X2dldF9kcnZkYXRhKGRldik7CisKKwlweGE5MzBfdHJrYmFsbF9jb25maWcodHJrYmFsbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHhhOTMwX3Rya2JhbGxfZGlzYWJsZShzdHJ1Y3QgcHhhOTMwX3Rya2JhbGwgKnRya2JhbGwpCit7CisJdWludDMyX3QgdGJjciA9IF9fcmF3X3JlYWRsKHRya2JhbGwtPm1taW9fYmFzZSArIFRCQ1IpOworCisJLyogSGVsZCBpbiByZXNldCwgZ2F0ZSB0aGUgMzItS0h6IGlucHV0IGNsb2NrIG9mZiAqLworCXdyaXRlX3RiY3IodHJrYmFsbCwgdGJjciB8IFRCQ1JfVEJSU1QpOworfQorCitzdGF0aWMgdm9pZCBweGE5MzBfdHJrYmFsbF9jbG9zZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCit7CisJc3RydWN0IHB4YTkzMF90cmtiYWxsICp0cmtiYWxsID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKKworCXB4YTkzMF90cmtiYWxsX2Rpc2FibGUodHJrYmFsbCk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHB4YTkzMF90cmtiYWxsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHB4YTkzMF90cmtiYWxsICp0cmtiYWxsOworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0OworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCBpcnEsIGVycm9yOworCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IHRya2JhbGwgaXJxXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgcmVnaXN0ZXIgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwl0cmtiYWxsID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHB4YTkzMF90cmtiYWxsKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0cmtiYWxsKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXRya2JhbGwtPnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaWYgKCF0cmtiYWxsLT5wZGF0YSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBwbGF0Zm9ybSBkYXRhIGRlZmluZWRcbiIpOworCQllcnJvciA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbGVkOworCX0KKworCXRya2JhbGwtPm1taW9fYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCWlmICghdHJrYmFsbC0+bW1pb19iYXNlKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBpb3JlbWFwIHJlZ2lzdGVyc1xuIik7CisJCWVycm9yID0gLUVOWElPOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwkvKiBoZWxkIHRoZSBtb2R1bGUgaW4gcmVzZXQsIHdpbGwgYmUgZW5hYmxlZCBpbiBvcGVuKCkgKi8KKwlweGE5MzBfdHJrYmFsbF9kaXNhYmxlKHRya2JhbGwpOworCisJZXJyb3IgPSByZXF1ZXN0X2lycShpcnEsIHB4YTkzMF90cmtiYWxsX2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRCwKKwkJCSAgICBwZGV2LT5uYW1lLCB0cmtiYWxsKTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgaXJxOiAlZFxuIiwgZXJyb3IpOworCQlnb3RvIGZhaWxlZF9mcmVlX2lvOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHRya2JhbGwpOworCisJaW5wdXQgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIWlucHV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBpbnB1dCBkZXZpY2VcbiIpOworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbGVkX2ZyZWVfaXJxOworCX0KKworCWlucHV0LT5uYW1lID0gcGRldi0+bmFtZTsKKwlpbnB1dC0+aWQuYnVzdHlwZSA9IEJVU19IT1NUOworCWlucHV0LT5vcGVuID0gcHhhOTMwX3Rya2JhbGxfb3BlbjsKKwlpbnB1dC0+Y2xvc2UgPSBweGE5MzBfdHJrYmFsbF9jbG9zZTsKKwlpbnB1dC0+ZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CisJaW5wdXRfc2V0X2RydmRhdGEoaW5wdXQsIHRya2JhbGwpOworCisJdHJrYmFsbC0+aW5wdXQgPSBpbnB1dDsKKworCWlucHV0X3NldF9jYXBhYmlsaXR5KGlucHV0LCBFVl9SRUwsIFJFTF9YKTsKKwlpbnB1dF9zZXRfY2FwYWJpbGl0eShpbnB1dCwgRVZfUkVMLCBSRUxfWSk7CisKKwllcnJvciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpbnB1dCk7CisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byByZWdpc3RlciBpbnB1dCBkZXZpY2VcbiIpOworCQlnb3RvIGZhaWxlZF9mcmVlX2lucHV0OworCX0KKworCXJldHVybiAwOworCitmYWlsZWRfZnJlZV9pbnB1dDoKKwlpbnB1dF9mcmVlX2RldmljZShpbnB1dCk7CitmYWlsZWRfZnJlZV9pcnE6CisJZnJlZV9pcnEoaXJxLCB0cmtiYWxsKTsKK2ZhaWxlZF9mcmVlX2lvOgorCWlvdW5tYXAodHJrYmFsbC0+bW1pb19iYXNlKTsKK2ZhaWxlZDoKKwlrZnJlZSh0cmtiYWxsKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHB4YTkzMF90cmtiYWxsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBweGE5MzBfdHJrYmFsbCAqdHJrYmFsbCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWludCBpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UodHJrYmFsbC0+aW5wdXQpOworCWZyZWVfaXJxKGlycSwgdHJrYmFsbCk7CisJaW91bm1hcCh0cmtiYWxsLT5tbWlvX2Jhc2UpOworCWtmcmVlKHRya2JhbGwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHB4YTkzMF90cmtiYWxsX2RyaXZlciA9IHsKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAicHhhOTMwLXRya2JhbGwiLAorCX0sCisJLnByb2JlCQk9IHB4YTkzMF90cmtiYWxsX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AocHhhOTMwX3Rya2JhbGxfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHB4YTkzMF90cmtiYWxsX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZweGE5MzBfdHJrYmFsbF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcHhhOTMwX3Rya2JhbGxfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZweGE5MzBfdHJrYmFsbF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChweGE5MzBfdHJrYmFsbF9pbml0KTsKK21vZHVsZV9leGl0KHB4YTkzMF90cmtiYWxsX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJZb25nIFlhbyA8eWFveW9uZ0BtYXJ2ZWxsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUFhBOTMwIFRyYWNrYmFsbCBNb3VzZSBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2Uvc3luYXB0aWNzLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL3N5bmFwdGljcy5jCmluZGV4IGQzNDljNGE1ZS4uODY1ZmM2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9zeW5hcHRpY3MuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL3N5bmFwdGljcy5jCkBAIC00NDUsMTIgKzQ0NSwxNCBAQAogCiAJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19UT09MX1dJRFRILCBmaW5nZXJfd2lkdGgpOwogCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVE9PTF9GSU5HRVIsIG51bV9maW5nZXJzID09IDEpOwotCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVE9PTF9ET1VCTEVUQVAsIG51bV9maW5nZXJzID09IDIpOwotCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVE9PTF9UUklQTEVUQVAsIG51bV9maW5nZXJzID09IDMpOwotCiAJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9MRUZULCBody5sZWZ0KTsKIAlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1JJR0hULCBody5yaWdodCk7CiAKKwlpZiAoU1lOX0NBUF9NVUxUSUZJTkdFUihwcml2LT5jYXBhYmlsaXRpZXMpKSB7CisJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVE9PTF9ET1VCTEVUQVAsIG51bV9maW5nZXJzID09IDIpOworCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPT0xfVFJJUExFVEFQLCBudW1fZmluZ2VycyA9PSAzKTsKKwl9CisKIAlpZiAoU1lOX0NBUF9NSURETEVfQlVUVE9OKHByaXYtPmNhcGFiaWxpdGllcykpCiAJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTUlERExFLCBody5taWRkbGUpOwogCkBAIC01NDMsMTIgKzU0NSwxNCBAQAogCXNldF9iaXQoRVZfS0VZLCBkZXYtPmV2Yml0KTsKIAlzZXRfYml0KEJUTl9UT1VDSCwgZGV2LT5rZXliaXQpOwogCXNldF9iaXQoQlROX1RPT0xfRklOR0VSLCBkZXYtPmtleWJpdCk7Ci0Jc2V0X2JpdChCVE5fVE9PTF9ET1VCTEVUQVAsIGRldi0+a2V5Yml0KTsKLQlzZXRfYml0KEJUTl9UT09MX1RSSVBMRVRBUCwgZGV2LT5rZXliaXQpOwotCiAJc2V0X2JpdChCVE5fTEVGVCwgZGV2LT5rZXliaXQpOwogCXNldF9iaXQoQlROX1JJR0hULCBkZXYtPmtleWJpdCk7CiAKKwlpZiAoU1lOX0NBUF9NVUxUSUZJTkdFUihwcml2LT5jYXBhYmlsaXRpZXMpKSB7CisJCXNldF9iaXQoQlROX1RPT0xfRE9VQkxFVEFQLCBkZXYtPmtleWJpdCk7CisJCXNldF9iaXQoQlROX1RPT0xfVFJJUExFVEFQLCBkZXYtPmtleWJpdCk7CisJfQorCiAJaWYgKFNZTl9DQVBfTUlERExFX0JVVFRPTihwcml2LT5jYXBhYmlsaXRpZXMpKQogCQlzZXRfYml0KEJUTl9NSURETEUsIGRldi0+a2V5Yml0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZWRldi5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZWRldi5jCmluZGV4IGQ4YzA1NmYuLmVmOTlhN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2VkZXYuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlZGV2LmMKQEAgLTg3OCw4ICs4NzgsNyBAQAogCW1vdXNlZGV2LT5oYW5kbGUuaGFuZGxlciA9IGhhbmRsZXI7CiAJbW91c2VkZXYtPmhhbmRsZS5wcml2YXRlID0gbW91c2VkZXY7CiAKLQlzdHJsY3B5KG1vdXNlZGV2LT5kZXYuYnVzX2lkLCBtb3VzZWRldi0+bmFtZSwKLQkJc2l6ZW9mKG1vdXNlZGV2LT5kZXYuYnVzX2lkKSk7CisJZGV2X3NldF9uYW1lKCZtb3VzZWRldi0+ZGV2LCBtb3VzZWRldi0+bmFtZSk7CiAJbW91c2VkZXYtPmRldi5jbGFzcyA9ICZpbnB1dF9jbGFzczsKIAlpZiAoZGV2KQogCQltb3VzZWRldi0+ZGV2LnBhcmVudCA9ICZkZXYtPmRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaGlsX21sYy5jIGIvZHJpdmVycy9pbnB1dC9zZXJpby9oaWxfbWxjLmMKaW5kZXggMzc1ODZhNi4uN2JhOWYyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby9oaWxfbWxjLmMKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9oaWxfbWxjLmMKQEAgLTkzNCw2ICs5MzQsNyBAQAogCQlzbnByaW50ZihtbGNfc2VyaW8tPm5hbWUsIHNpemVvZihtbGNfc2VyaW8tPm5hbWUpLTEsICJISUxfU0VSSU8lZCIsIGkpOwogCQlzbnByaW50ZihtbGNfc2VyaW8tPnBoeXMsIHNpemVvZihtbGNfc2VyaW8tPnBoeXMpLTEsICJISUwlZCIsIGkpOwogCQltbGNfc2VyaW8tPmlkCQkJPSBoaWxfbWxjX3NlcmlvX2lkOworCQltbGNfc2VyaW8tPmlkLmlkCQk9IGk7IC8qIEhJTCBwb3J0IG5vLiAqLwogCQltbGNfc2VyaW8tPndyaXRlCQk9IGhpbF9tbGNfc2VyaW9fd3JpdGU7CiAJCW1sY19zZXJpby0+b3BlbgkJCT0gaGlsX21sY19zZXJpb19vcGVuOwogCQltbGNfc2VyaW8tPmNsb3NlCQk9IGhpbF9tbGNfc2VyaW9fY2xvc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLXg4NmlhNjRpby5oIGIvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi14ODZpYTY0aW8uaAppbmRleCAyOWU2ODYzLi42ZmEyZGVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLXg4NmlhNjRpby5oCisrKyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDIteDg2aWE2NGlvLmgKQEAgLTE0Myw2ICsxNDMsMTQgQEAKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9WRVJTSU9OLCAiTTYwNiIpLAogCQl9LAogCX0sCisJeworCQkuaWRlbnQgPSAiR2lnYWJ5dGUgTTkxMiIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiR0lHQUJZVEUiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTTkxMiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX1ZFUlNJT04sICIwMSIpLAorCQl9LAorCX0sCiAJeyB9CiB9OwogCkBAIC0zNTEsNiArMzU5LDEzIEBACiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkhFTDgwSSIpLAogCQl9LAogCX0sCisJeworCQkuaWRlbnQgPSAiRGVsbCBWb3N0cm8gMTUxMCIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBJbmMuIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlZvc3RybzE1MTAiKSwKKwkJfSwKKwl9LAogCXsgfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9zZXJpby9saWJwczIuYyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vbGlicHMyLmMKaW5kZXggMmIzMDRjMi4uNjcyNDhjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby9saWJwczIuYworKysgYi9kcml2ZXJzL2lucHV0L3NlcmlvL2xpYnBzMi5jCkBAIC0yNjIsOSArMjYyLDE3IEBACiAJCQlicmVhazsKIAogCQljYXNlIFBTMl9SRVRfTkFLOgotCQkJcHMyZGV2LT5uYWsgPSAxOworCQkJcHMyZGV2LT5mbGFncyB8PSBQUzJfRkxBR19OQUs7CisJCQlwczJkZXYtPm5hayA9IFBTMl9SRVRfTkFLOwogCQkJYnJlYWs7CiAKKwkJY2FzZSBQUzJfUkVUX0VSUjoKKwkJCWlmIChwczJkZXYtPmZsYWdzICYgUFMyX0ZMQUdfTkFLKSB7CisJCQkJcHMyZGV2LT5mbGFncyAmPSB+UFMyX0ZMQUdfTkFLOworCQkJCXBzMmRldi0+bmFrID0gUFMyX1JFVF9FUlI7CisJCQkJYnJlYWs7CisJCQl9CisKIAkJLyoKIAkJICogV29ya2Fyb3VuZCBmb3IgbWljZSB3aGljaCBkb24ndCBBQ0sgdGhlIEdldCBJRCBjb21tYW5kLgogCQkgKiBUaGVzZSBhcmUgdmFsaWQgbW91c2UgSURzIHRoYXQgd2UgcmVjb2duaXplLgpAQCAtMjgyLDggKzI5MCwxMSBAQAogCX0KIAogCi0JaWYgKCFwczJkZXYtPm5hayAmJiBwczJkZXYtPmNtZGNudCkKLQkJcHMyZGV2LT5mbGFncyB8PSBQUzJfRkxBR19DTUQgfCBQUzJfRkxBR19DTUQxOworCWlmICghcHMyZGV2LT5uYWspIHsKKwkJcHMyZGV2LT5mbGFncyAmPSB+UFMyX0ZMQUdfTkFLOworCQlpZiAocHMyZGV2LT5jbWRjbnQpCisJCQlwczJkZXYtPmZsYWdzIHw9IFBTMl9GTEFHX0NNRCB8IFBTMl9GTEFHX0NNRDE7CisJfQogCiAJcHMyZGV2LT5mbGFncyAmPSB+UFMyX0ZMQUdfQUNLOwogCXdha2VfdXAoJnBzMmRldi0+d2FpdCk7CkBAIC0zMjksNiArMzQwLDcgQEAKIAlpZiAocHMyZGV2LT5mbGFncyAmIChQUzJfRkxBR19BQ0sgfCBQUzJfRkxBR19DTUQpKQogCQl3YWtlX3VwKCZwczJkZXYtPndhaXQpOwogCi0JcHMyZGV2LT5mbGFncyA9IDA7CisJLyogcmVzZXQgYWxsIGZsYWdzIGV4Y2VwdCBsYXN0IG5hY2sgKi8KKwlwczJkZXYtPmZsYWdzICY9IFBTMl9GTEFHX05BSzsKIH0KIEVYUE9SVF9TWU1CT0wocHMyX2NtZF9hYm9ydGVkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vcGNpcHMyLmMgYi9kcml2ZXJzL2lucHV0L3NlcmlvL3BjaXBzMi5jCmluZGV4IDFiNDA0ZjkuLjFkYWNiZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vcGNpcHMyLmMKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9wY2lwczIuYwpAQCAtMTUzLDcgKzE1Myw3IEBACiAJc2VyaW8tPm9wZW4JCT0gcGNpcHMyX29wZW47CiAJc2VyaW8tPmNsb3NlCQk9IHBjaXBzMl9jbG9zZTsKIAlzdHJsY3B5KHNlcmlvLT5uYW1lLCBwY2lfbmFtZShkZXYpLCBzaXplb2Yoc2VyaW8tPm5hbWUpKTsKLQlzdHJsY3B5KHNlcmlvLT5waHlzLCBkZXYtPmRldi5idXNfaWQsIHNpemVvZihzZXJpby0+cGh5cykpOworCXN0cmxjcHkoc2VyaW8tPnBoeXMsIGRldl9uYW1lKCZkZXYtPmRldiksIHNpemVvZihzZXJpby0+cGh5cykpOwogCXNlcmlvLT5wb3J0X2RhdGEJPSBwczJpZjsKIAlzZXJpby0+ZGV2LnBhcmVudAk9ICZkZXYtPmRldjsKIAlwczJpZi0+aW8JCT0gc2VyaW87CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3NlcmlvL3NlcmlvLmMgYi9kcml2ZXJzL2lucHV0L3NlcmlvL3NlcmlvLmMKaW5kZXggMmYxMmQ2MC4uYmMwMzMyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJpby5jCisrKyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VyaW8uYwpAQCAtNTQ2LDggKzU0Niw4IEBACiAJc3Bpbl9sb2NrX2luaXQoJnNlcmlvLT5sb2NrKTsKIAltdXRleF9pbml0KCZzZXJpby0+ZHJ2X211dGV4KTsKIAlkZXZpY2VfaW5pdGlhbGl6ZSgmc2VyaW8tPmRldik7Ci0Jc25wcmludGYoc2VyaW8tPmRldi5idXNfaWQsIHNpemVvZihzZXJpby0+ZGV2LmJ1c19pZCksCi0JCSAic2VyaW8lbGQiLCAobG9uZylhdG9taWNfaW5jX3JldHVybigmc2VyaW9fbm8pIC0gMSk7CisJZGV2X3NldF9uYW1lKCZzZXJpby0+ZGV2LCAic2VyaW8lbGQiLAorCQkJKGxvbmcpYXRvbWljX2luY19yZXR1cm4oJnNlcmlvX25vKSAtIDEpOwogCXNlcmlvLT5kZXYuYnVzID0gJnNlcmlvX2J1czsKIAlzZXJpby0+ZGV2LnJlbGVhc2UgPSBzZXJpb19yZWxlYXNlX3BvcnQ7CiAJaWYgKHNlcmlvLT5wYXJlbnQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8veGlsaW54X3BzMi5jIGIvZHJpdmVycy9pbnB1dC9zZXJpby94aWxpbnhfcHMyLmMKaW5kZXggNzY1MDA3OC4uZWJiMjJmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby94aWxpbnhfcHMyLmMKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby94aWxpbnhfcHMyLmMKQEAgLTU4LDIzICs1OCwyMCBAQAogCiAvKiBNYXNrIGZvciBhbGwgdGhlIFJlY2VpdmUgSW50ZXJydXB0cyAqLwogI2RlZmluZSBYUFMyX0lQSVhSX1JYX0FMTAkoWFBTMl9JUElYUl9SWF9PVkYgfCBYUFMyX0lQSVhSX1JYX0VSUiB8ICBcCi0JCQkJCVhQUzJfSVBJWFJfUlhfRlVMTCkKKwkJCQkgWFBTMl9JUElYUl9SWF9GVUxMKQogCiAvKiBNYXNrIGZvciBhbGwgdGhlIEludGVycnVwdHMgKi8KICNkZWZpbmUgWFBTMl9JUElYUl9BTEwJCShYUFMyX0lQSVhSX1RYX0FMTCB8IFhQUzJfSVBJWFJfUlhfQUxMIHwgIFwKLQkJCQkJWFBTMl9JUElYUl9XRFRfVE9VVCkKKwkJCQkgWFBTMl9JUElYUl9XRFRfVE9VVCkKIAogLyogR2xvYmFsIEludGVycnVwdCBFbmFibGUgbWFzayAqLwogI2RlZmluZSBYUFMyX0dJRVJfR0lFX01BU0sJMHg4MDAwMDAwMAogCiBzdHJ1Y3QgeHBzMmRhdGEgewogCWludCBpcnE7Ci0JdTMyIHBoeXNfYWRkcjsKLQl1MzIgcmVtYXBfc2l6ZTsKIAlzcGlubG9ja190IGxvY2s7Ci0JdTggcnhiOwkJCQkvKiBSeCBidWZmZXIgKi8KIAl2b2lkIF9faW9tZW0gKmJhc2VfYWRkcmVzczsJLyogdmlydC4gYWRkcmVzcyBvZiBjb250cm9sIHJlZ2lzdGVycyAqLwotCXVuc2lnbmVkIGludCBkZmw7CisJdW5zaWduZWQgaW50IGZsYWdzOwogCXN0cnVjdCBzZXJpbyBzZXJpbzsJCS8qIHNlcmlvICovCiB9OwogCkBAIC04Miw4ICs3OSwxMyBAQAogLyogWFBTIFBTLzIgZGF0YSB0cmFuc21pc3Npb24gY2FsbHMgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qCi0gKiB4cHMyX3JlY3YoKSB3aWxsIGF0dGVtcHQgdG8gcmVjZWl2ZSBhIGJ5dGUgb2YgZGF0YSBmcm9tIHRoZSBQUy8yIHBvcnQuCisvKioKKyAqIHhwczJfcmVjdigpIC0gYXR0ZW1wdHMgdG8gcmVjZWl2ZSBhIGJ5dGUgZnJvbSB0aGUgUFMvMiBwb3J0LgorICogQGRydmRhdGE6CXBvaW50ZXIgdG8gcHMyIGRldmljZSBwcml2YXRlIGRhdGEgc3RydWN0dXJlCisgKiBAYnl0ZToJYWRkcmVzcyB3aGVyZSB0aGUgcmVhZCBkYXRhIHdpbGwgYmUgY29waWVkCisgKgorICogSWYgdGhlcmUgaXMgYW55IGRhdGEgYXZhaWxhYmxlIGluIHRoZSBQUy8yIHJlY2VpdmVyLCB0aGlzIGZ1bmN0aW9ucyByZWFkcworICogdGhlIGRhdGEsIG90aGVyd2lzZSBpdCByZXR1cm5zIGVycm9yLgogICovCiBzdGF0aWMgaW50IHhwczJfcmVjdihzdHJ1Y3QgeHBzMmRhdGEgKmRydmRhdGEsIHU4ICpieXRlKQogewpAQCAtMTE2LDMzICsxMTgsMjcgQEAKIAogCS8qIENoZWNrIHdoaWNoIGludGVycnVwdCBpcyBhY3RpdmUgKi8KIAlpZiAoaW50cl9zciAmIFhQUzJfSVBJWFJfUlhfT1ZGKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcmVjZWl2ZSBvdmVycnVuIGVycm9yXG4iLAotCQkJZHJ2ZGF0YS0+c2VyaW8ubmFtZSk7CisJCWRldl93YXJuKGRydmRhdGEtPnNlcmlvLmRldi5wYXJlbnQsICJyZWNlaXZlIG92ZXJydW4gZXJyb3JcbiIpOwogCiAJaWYgKGludHJfc3IgJiBYUFMyX0lQSVhSX1JYX0VSUikKLQkJZHJ2ZGF0YS0+ZGZsIHw9IFNFUklPX1BBUklUWTsKKwkJZHJ2ZGF0YS0+ZmxhZ3MgfD0gU0VSSU9fUEFSSVRZOwogCiAJaWYgKGludHJfc3IgJiAoWFBTMl9JUElYUl9UWF9OT0FDSyB8IFhQUzJfSVBJWFJfV0RUX1RPVVQpKQotCQlkcnZkYXRhLT5kZmwgfD0gU0VSSU9fVElNRU9VVDsKKwkJZHJ2ZGF0YS0+ZmxhZ3MgfD0gU0VSSU9fVElNRU9VVDsKIAogCWlmIChpbnRyX3NyICYgWFBTMl9JUElYUl9SWF9GVUxMKSB7Ci0JCXN0YXR1cyA9IHhwczJfcmVjdihkcnZkYXRhLCAmZHJ2ZGF0YS0+cnhiKTsKKwkJc3RhdHVzID0geHBzMl9yZWN2KGRydmRhdGEsICZjKTsKIAogCQkvKiBFcnJvciwgaWYgYSBieXRlIGlzIG5vdCByZWNlaXZlZCAqLwogCQlpZiAoc3RhdHVzKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIKLQkJCQkiJXM6IHdyb25nIHJjdmQgYnl0ZSBjb3VudCAoJWQpXG4iLAotCQkJCWRydmRhdGEtPnNlcmlvLm5hbWUsIHN0YXR1cyk7CisJCQlkZXZfZXJyKGRydmRhdGEtPnNlcmlvLmRldi5wYXJlbnQsCisJCQkJIndyb25nIHJjdmQgYnl0ZSBjb3VudCAoJWQpXG4iLCBzdGF0dXMpOwogCQl9IGVsc2UgewotCQkJYyA9IGRydmRhdGEtPnJ4YjsKLQkJCXNlcmlvX2ludGVycnVwdCgmZHJ2ZGF0YS0+c2VyaW8sIGMsIGRydmRhdGEtPmRmbCk7Ci0JCQlkcnZkYXRhLT5kZmwgPSAwOworCQkJc2VyaW9faW50ZXJydXB0KCZkcnZkYXRhLT5zZXJpbywgYywgZHJ2ZGF0YS0+ZmxhZ3MpOworCQkJZHJ2ZGF0YS0+ZmxhZ3MgPSAwOwogCQl9CiAJfQogCi0JaWYgKGludHJfc3IgJiBYUFMyX0lQSVhSX1RYX0FDSykKLQkJZHJ2ZGF0YS0+ZGZsID0gMDsKLQogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtMTUwLDggKzE0NiwxNSBAQAogLyogc2VyaW8gY2FsbGJhY2tzICovCiAvKioqKioqKioqKioqKioqKioqKi8KIAotLyoKLSAqIHN4cHMyX3dyaXRlKCkgc2VuZHMgYSBieXRlIG91dCB0aHJvdWdoIHRoZSBQUy8yIGludGVyZmFjZS4KKy8qKgorICogc3hwczJfd3JpdGUoKSAtIHNlbmRzIGEgYnl0ZSBvdXQgdGhyb3VnaCB0aGUgUFMvMiBwb3J0LgorICogQHBzZXJpbzoJcG9pbnRlciB0byB0aGUgc2VyaW8gc3RydWN0dXJlIG9mIHRoZSBQUy8yIHBvcnQKKyAqIEBjOgkJZGF0YSB0aGF0IG5lZWRzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIFBTLzIgcG9ydAorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZSBQUy8yIHRyYW5zbWl0dGVyIGlzIGVtcHR5IGFuZCBzZW5kcyBhIGJ5dGUuCisgKiBPdGhlcndpc2UgaXQgcmV0dXJucyBlcnJvci4gVHJhbnNtaXNzaW9uIGZhaWxzIG9ubHkgd2hlbiBub3RoaW5nIGlzIGNvbm5lY3RlZAorICogdG8gdGhlIFBTLzIgcG9ydC4gVGhhdHMgd2h5LCB3ZSBkbyBub3QgdHJ5IHRvIHJlc2VuZCB0aGUgZGF0YSBpbiBjYXNlIG9mIGEKKyAqIGZhaWx1cmUuCiAgKi8KIHN0YXRpYyBpbnQgc3hwczJfd3JpdGUoc3RydWN0IHNlcmlvICpwc2VyaW8sIHVuc2lnbmVkIGNoYXIgYykKIHsKQEAgLTE3NCwzMyArMTc3LDM5IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotLyoKLSAqIHN4cHMyX29wZW4oKSBpcyBjYWxsZWQgd2hlbiBhIHBvcnQgaXMgb3BlbiBieSB0aGUgaGlnaGVyIGxheWVyLgorLyoqCisgKiBzeHBzMl9vcGVuKCkgLSBjYWxsZWQgd2hlbiBhIHBvcnQgaXMgb3BlbmVkIGJ5IHRoZSBoaWdoZXIgbGF5ZXIuCisgKiBAcHNlcmlvOglwb2ludGVyIHRvIHRoZSBzZXJpbyBzdHJ1Y3R1cmUgb2YgdGhlIFBTLzIgZGV2aWNlCisgKgorICogVGhpcyBmdW5jdGlvbiByZXF1ZXN0cyBpcnEgYW5kIGVuYWJsZXMgaW50ZXJydXB0cyBmb3IgdGhlIFBTLzIgZGV2aWNlLgogICovCiBzdGF0aWMgaW50IHN4cHMyX29wZW4oc3RydWN0IHNlcmlvICpwc2VyaW8pCiB7CiAJc3RydWN0IHhwczJkYXRhICpkcnZkYXRhID0gcHNlcmlvLT5wb3J0X2RhdGE7Ci0JaW50IHJldHZhbDsKKwlpbnQgZXJyb3I7CisJdTggYzsKIAotCXJldHZhbCA9IHJlcXVlc3RfaXJxKGRydmRhdGEtPmlycSwgJnhwczJfaW50ZXJydXB0LCAwLAorCWVycm9yID0gcmVxdWVzdF9pcnEoZHJ2ZGF0YS0+aXJxLCAmeHBzMl9pbnRlcnJ1cHQsIDAsCiAJCQkJRFJJVkVSX05BTUUsIGRydmRhdGEpOwotCWlmIChyZXR2YWwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkiJXM6IENvdWxkbid0IGFsbG9jYXRlIGludGVycnVwdCAlZFxuIiwKLQkJCWRydmRhdGEtPnNlcmlvLm5hbWUsIGRydmRhdGEtPmlycSk7Ci0JCXJldHVybiByZXR2YWw7CisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoZHJ2ZGF0YS0+c2VyaW8uZGV2LnBhcmVudCwKKwkJCSJDb3VsZG4ndCBhbGxvY2F0ZSBpbnRlcnJ1cHQgJWRcbiIsIGRydmRhdGEtPmlycSk7CisJCXJldHVybiBlcnJvcjsKIAl9CiAKIAkvKiBzdGFydCByZWNlcHRpb24gYnkgZW5hYmxpbmcgdGhlIGludGVycnVwdHMgKi8KIAlvdXRfYmUzMihkcnZkYXRhLT5iYXNlX2FkZHJlc3MgKyBYUFMyX0dJRVJfT0ZGU0VULCBYUFMyX0dJRVJfR0lFX01BU0spOwogCW91dF9iZTMyKGRydmRhdGEtPmJhc2VfYWRkcmVzcyArIFhQUzJfSVBJRVJfT0ZGU0VULCBYUFMyX0lQSVhSX1JYX0FMTCk7Ci0JKHZvaWQpeHBzMl9yZWN2KGRydmRhdGEsICZkcnZkYXRhLT5yeGIpOworCSh2b2lkKXhwczJfcmVjdihkcnZkYXRhLCAmYyk7CiAKIAlyZXR1cm4gMDsJCS8qIHN1Y2Nlc3MgKi8KIH0KIAotLyoKLSAqIHN4cHMyX2Nsb3NlKCkgZnJlZXMgdGhlIGludGVycnVwdC4KKy8qKgorICogc3hwczJfY2xvc2UoKSAtIGZyZWVzIHRoZSBpbnRlcnJ1cHQuCisgKiBAcHNlcmlvOglwb2ludGVyIHRvIHRoZSBzZXJpbyBzdHJ1Y3R1cmUgb2YgdGhlIFBTLzIgZGV2aWNlCisgKgorICogVGhpcyBmdW5jdGlvbiBmcmVlcyB0aGUgaXJxIGFuZCBkaXNhYmxlcyBpbnRlcnJ1cHRzIGZvciB0aGUgUFMvMiBkZXZpY2UuCiAgKi8KIHN0YXRpYyB2b2lkIHN4cHMyX2Nsb3NlKHN0cnVjdCBzZXJpbyAqcHNlcmlvKQogewpAQCAtMjEyLDI0ICsyMjEsNDEgQEAKIAlmcmVlX2lycShkcnZkYXRhLT5pcnEsIGRydmRhdGEpOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqLwotLyogRGV2aWNlIHNldHVwIGNvZGUgKi8KLS8qKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQgeHBzMl9zZXR1cChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCByZXNvdXJjZSAqcmVnc19yZXMsCi0JCSAgICAgIHN0cnVjdCByZXNvdXJjZSAqaXJxX3JlcykKKy8qKgorICogeHBzMl9vZl9wcm9iZSAtIHByb2JlIG1ldGhvZCBmb3IgdGhlIFBTLzIgZGV2aWNlLgorICogQG9mX2RldjoJcG9pbnRlciB0byBPRiBkZXZpY2Ugc3RydWN0dXJlCisgKiBAbWF0Y2g6CXBvaW50ZXIgdG8gdGhlIHN0dWN0dXJlIHVzZWQgZm9yIG1hdGNoaW5nIGEgZGV2aWNlCisgKgorICogVGhpcyBmdW5jdGlvbiBwcm9iZXMgdGhlIFBTLzIgZGV2aWNlIGluIHRoZSBkZXZpY2UgdHJlZS4KKyAqIEl0IGluaXRpYWxpemVzIHRoZSBkcml2ZXIgZGF0YSBzdHJ1Y3R1cmUgYW5kIHRoZSBoYXJkd2FyZS4KKyAqIEl0IHJldHVybnMgMCwgaWYgdGhlIGRyaXZlciBpcyBib3VuZCB0byB0aGUgUFMvMiBkZXZpY2UsIG9yIGEgbmVnYXRpdmUKKyAqIHZhbHVlIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCB4cHMyX29mX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2LAorCQkJCSAgIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogeworCXN0cnVjdCByZXNvdXJjZSByX2lycTsgLyogSW50ZXJydXB0IHJlc291cmNlcyAqLworCXN0cnVjdCByZXNvdXJjZSByX21lbTsgLyogSU8gbWVtIHJlc291cmNlcyAqLwogCXN0cnVjdCB4cHMyZGF0YSAqZHJ2ZGF0YTsKIAlzdHJ1Y3Qgc2VyaW8gKnNlcmlvOwotCXVuc2lnbmVkIGxvbmcgcmVtYXBfc2l6ZTsKLQlpbnQgcmV0dmFsOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZvZmRldi0+ZGV2OworCXJlc291cmNlX3NpemVfdCByZW1hcF9zaXplLCBwaHlzX2FkZHI7CisJaW50IGVycm9yOwogCi0JaWYgKCFkZXYpCi0JCXJldHVybiAtRUlOVkFMOworCWRldl9pbmZvKGRldiwgIkRldmljZSBUcmVlIFByb2JpbmcgXCclc1wnXG4iLAorCQkJb2ZkZXYtPm5vZGUtPm5hbWUpOwogCi0JaWYgKCFyZWdzX3JlcyB8fCAhaXJxX3JlcykgewotCQlkZXZfZXJyKGRldiwgIklPIHJlc291cmNlKHMpIG5vdCBmb3VuZFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOworCS8qIEdldCBpb3NwYWNlIGZvciB0aGUgZGV2aWNlICovCisJZXJyb3IgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG9mZGV2LT5ub2RlLCAwLCAmcl9tZW0pOworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKGRldiwgImludmFsaWQgYWRkcmVzc1xuIik7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwkvKiBHZXQgSVJRIGZvciB0aGUgZGV2aWNlICovCisJaWYgKG9mX2lycV90b19yZXNvdXJjZShvZmRldi0+bm9kZSwgMCwgJnJfaXJxKSA9PSBOT19JUlEpIHsKKwkJZGV2X2VycihkZXYsICJubyBJUlEgZm91bmRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlkcnZkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHhwczJkYXRhKSwgR0ZQX0tFUk5FTCk7CkBAIC0yNDEsMjQgKzI2NywyMyBAQAogCWRldl9zZXRfZHJ2ZGF0YShkZXYsIGRydmRhdGEpOwogCiAJc3Bpbl9sb2NrX2luaXQoJmRydmRhdGEtPmxvY2spOwotCWRydmRhdGEtPmlycSA9IGlycV9yZXMtPnN0YXJ0OworCWRydmRhdGEtPmlycSA9IHJfaXJxLnN0YXJ0OwogCi0JcmVtYXBfc2l6ZSA9IHJlZ3NfcmVzLT5lbmQgLSByZWdzX3Jlcy0+c3RhcnQgKyAxOwotCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlZ3NfcmVzLT5zdGFydCwgcmVtYXBfc2l6ZSwgRFJJVkVSX05BTUUpKSB7Ci0JCWRldl9lcnIoZGV2LCAiQ291bGRuJ3QgbG9jayBtZW1vcnkgcmVnaW9uIGF0IDB4JTA4WFxuIiwKLQkJCSh1bnNpZ25lZCBpbnQpcmVnc19yZXMtPnN0YXJ0KTsKLQkJcmV0dmFsID0gLUVCVVNZOworCXBoeXNfYWRkciA9IHJfbWVtLnN0YXJ0OworCXJlbWFwX3NpemUgPSByX21lbS5lbmQgLSByX21lbS5zdGFydCArIDE7CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocGh5c19hZGRyLCByZW1hcF9zaXplLCBEUklWRVJfTkFNRSkpIHsKKwkJZGV2X2VycihkZXYsICJDb3VsZG4ndCBsb2NrIG1lbW9yeSByZWdpb24gYXQgMHglMDhsbFhcbiIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKXBoeXNfYWRkcik7CisJCWVycm9yID0gLUVCVVNZOwogCQlnb3RvIGZhaWxlZDE7CiAJfQogCiAJLyogRmlsbCBpbiBjb25maWd1cmF0aW9uIGRhdGEgYW5kIGFkZCB0aGVtIHRvIHRoZSBsaXN0ICovCi0JZHJ2ZGF0YS0+cGh5c19hZGRyID0gcmVnc19yZXMtPnN0YXJ0OwotCWRydmRhdGEtPnJlbWFwX3NpemUgPSByZW1hcF9zaXplOwotCWRydmRhdGEtPmJhc2VfYWRkcmVzcyA9IGlvcmVtYXAocmVnc19yZXMtPnN0YXJ0LCByZW1hcF9zaXplKTsKKwlkcnZkYXRhLT5iYXNlX2FkZHJlc3MgPSBpb3JlbWFwKHBoeXNfYWRkciwgcmVtYXBfc2l6ZSk7CiAJaWYgKGRydmRhdGEtPmJhc2VfYWRkcmVzcyA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoZGV2LCAiQ291bGRuJ3QgaW9yZW1hcCBtZW1vcnkgYXQgMHglMDhYXG4iLAotCQkJKHVuc2lnbmVkIGludClyZWdzX3Jlcy0+c3RhcnQpOwotCQlyZXR2YWwgPSAtRUZBVUxUOworCQlkZXZfZXJyKGRldiwgIkNvdWxkbid0IGlvcmVtYXAgbWVtb3J5IGF0IDB4JTA4bGxYXG4iLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylwaHlzX2FkZHIpOworCQllcnJvciA9IC1FRkFVTFQ7CiAJCWdvdG8gZmFpbGVkMjsKIAl9CiAKQEAgLTI2OSw4ICsyOTQsOSBAQAogCSAqIHdlIGhhdmUgdGhlIFBTMiBpbiBhIGdvb2Qgc3RhdGUgKi8KIAlvdXRfYmUzMihkcnZkYXRhLT5iYXNlX2FkZHJlc3MgKyBYUFMyX1NSU1RfT0ZGU0VULCBYUFMyX1NSU1RfUkVTRVQpOwogCi0JZGV2X2luZm8oZGV2LCAiWGlsaW54IFBTMiBhdCAweCUwOFggbWFwcGVkIHRvIDB4JXAsIGlycT0lZFxuIiwKLQkJZHJ2ZGF0YS0+cGh5c19hZGRyLCBkcnZkYXRhLT5iYXNlX2FkZHJlc3MsIGRydmRhdGEtPmlycSk7CisJZGV2X2luZm8oZGV2LCAiWGlsaW54IFBTMiBhdCAweCUwOGxsWCBtYXBwZWQgdG8gMHglcCwgaXJxPSVkXG4iLAorCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylwaHlzX2FkZHIsIGRydmRhdGEtPmJhc2VfYWRkcmVzcywKKwkJIGRydmRhdGEtPmlycSk7CiAKIAlzZXJpbyA9ICZkcnZkYXRhLT5zZXJpbzsKIAlzZXJpby0+aWQudHlwZSA9IFNFUklPXzgwNDI7CkBAIC0yODAsNzEgKzMwNiw1MSBAQAogCXNlcmlvLT5wb3J0X2RhdGEgPSBkcnZkYXRhOwogCXNlcmlvLT5kZXYucGFyZW50ID0gZGV2OwogCXNucHJpbnRmKHNlcmlvLT5uYW1lLCBzaXplb2Yoc2VyaW8tPm5hbWUpLAotCQkgIlhpbGlueCBYUFMgUFMvMiBhdCAlMDhYIiwgZHJ2ZGF0YS0+cGh5c19hZGRyKTsKKwkJICJYaWxpbnggWFBTIFBTLzIgYXQgJTA4bGxYIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylwaHlzX2FkZHIpOwogCXNucHJpbnRmKHNlcmlvLT5waHlzLCBzaXplb2Yoc2VyaW8tPnBoeXMpLAotCQkgInhpbGlueHBzMi9zZXJpbyBhdCAlMDhYIiwgZHJ2ZGF0YS0+cGh5c19hZGRyKTsKKwkJICJ4aWxpbnhwczIvc2VyaW8gYXQgJTA4bGxYIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylwaHlzX2FkZHIpOworCiAJc2VyaW9fcmVnaXN0ZXJfcG9ydChzZXJpbyk7CiAKIAlyZXR1cm4gMDsJCS8qIHN1Y2Nlc3MgKi8KIAogZmFpbGVkMjoKLQlyZWxlYXNlX21lbV9yZWdpb24ocmVnc19yZXMtPnN0YXJ0LCByZW1hcF9zaXplKTsKKwlyZWxlYXNlX21lbV9yZWdpb24ocGh5c19hZGRyLCByZW1hcF9zaXplKTsKIGZhaWxlZDE6CiAJa2ZyZWUoZHJ2ZGF0YSk7CiAJZGV2X3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CiAKLQlyZXR1cm4gcmV0dmFsOworCXJldHVybiBlcnJvcjsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIE9GIFBsYXRmb3JtIEJ1cyBTdXBwb3J0ICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCB4cHMyX29mX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2LCBjb25zdCBzdHJ1Y3QKLQkJCQkgICBvZl9kZXZpY2VfaWQgKiBtYXRjaCkKLXsKLQlzdHJ1Y3QgcmVzb3VyY2Ugcl9pcnE7IC8qIEludGVycnVwdCByZXNvdXJjZXMgKi8KLQlzdHJ1Y3QgcmVzb3VyY2Ugcl9tZW07IC8qIElPIG1lbSByZXNvdXJjZXMgKi8KLQlpbnQgcmMgPSAwOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiRGV2aWNlIFRyZWUgUHJvYmluZyBcJyVzXCdcbiIsCi0JCQlvZmRldi0+bm9kZS0+bmFtZSk7Ci0KLQkvKiBHZXQgaW9zcGFjZSBmb3IgdGhlIGRldmljZSAqLwotCXJjID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShvZmRldi0+bm9kZSwgMCwgJnJfbWVtKTsKLQlpZiAocmMpIHsKLQkJZGV2X2Vycigmb2ZkZXYtPmRldiwgImludmFsaWQgYWRkcmVzc1xuIik7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQkvKiBHZXQgSVJRIGZvciB0aGUgZGV2aWNlICovCi0JcmMgPSBvZl9pcnFfdG9fcmVzb3VyY2Uob2ZkZXYtPm5vZGUsIDAsICZyX2lycSk7Ci0JaWYgKHJjID09IE5PX0lSUSkgewotCQlkZXZfZXJyKCZvZmRldi0+ZGV2LCAibm8gSVJRIGZvdW5kXG4iKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCXJldHVybiB4cHMyX3NldHVwKCZvZmRldi0+ZGV2LCAmcl9tZW0sICZyX2lycSk7Ci19Ci0KKy8qKgorICogeHBzMl9vZl9yZW1vdmUgLSB1bmJpbmRzIHRoZSBkcml2ZXIgZnJvbSB0aGUgUFMvMiBkZXZpY2UuCisgKiBAb2ZfZGV2Oglwb2ludGVyIHRvIE9GIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpZiBhIGRldmljZSBpcyBwaHlzaWNhbGx5IHJlbW92ZWQgZnJvbSB0aGUgc3lzdGVtIG9yCisgKiBpZiB0aGUgZHJpdmVyIG1vZHVsZSBpcyBiZWluZyB1bmxvYWRlZC4gSXQgZnJlZXMgYW55IHJlc291cmNlcyBhbGxvY2F0ZWQgdG8KKyAqIHRoZSBkZXZpY2UuCisgKi8KIHN0YXRpYyBpbnQgX19kZXZleGl0IHhwczJfb2ZfcmVtb3ZlKHN0cnVjdCBvZl9kZXZpY2UgKm9mX2RldikKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmb2ZfZGV2LT5kZXY7Ci0Jc3RydWN0IHhwczJkYXRhICpkcnZkYXRhOwotCi0JaWYgKCFkZXYpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZHJ2ZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB4cHMyZGF0YSAqZHJ2ZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCByZXNvdXJjZSByX21lbTsgLyogSU8gbWVtIHJlc291cmNlcyAqLwogCiAJc2VyaW9fdW5yZWdpc3Rlcl9wb3J0KCZkcnZkYXRhLT5zZXJpbyk7CiAJaW91bm1hcChkcnZkYXRhLT5iYXNlX2FkZHJlc3MpOwotCXJlbGVhc2VfbWVtX3JlZ2lvbihkcnZkYXRhLT5waHlzX2FkZHIsIGRydmRhdGEtPnJlbWFwX3NpemUpOworCisJLyogR2V0IGlvc3BhY2Ugb2YgdGhlIGRldmljZSAqLworCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG9mX2Rldi0+bm9kZSwgMCwgJnJfbWVtKSkKKwkJZGV2X2VycihkZXYsICJpbnZhbGlkIGFkZHJlc3NcbiIpOworCWVsc2UKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKHJfbWVtLnN0YXJ0LCByX21lbS5lbmQgLSByX21lbS5zdGFydCArIDEpOworCiAJa2ZyZWUoZHJ2ZGF0YSk7CiAKIAlkZXZfc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKIAotCXJldHVybiAwOwkJLyogc3VjY2VzcyAqLworCXJldHVybiAwOwogfQogCiAvKiBNYXRjaCB0YWJsZSBmb3Igb2ZfcGxhdGZvcm0gYmluZGluZyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90YWJsZXQvZ3Rjby5jIGIvZHJpdmVycy9pbnB1dC90YWJsZXQvZ3Rjby5jCmluZGV4IDU1MjRlMDEuLjJlMThhMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdGFibGV0L2d0Y28uYworKysgYi9kcml2ZXJzL2lucHV0L3RhYmxldC9ndGNvLmMKQEAgLTg3Nyw3ICs4NzcsNyBAQAogCWRiZygibnVtIGVuZHBvaW50czogICAgICVkIiwgdXNiaW50ZXJmYWNlLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iTnVtRW5kcG9pbnRzKTsKIAlkYmcoImludGVyZmFjZSBjbGFzczogICAlZCIsIHVzYmludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZUNsYXNzKTsKIAlkYmcoImVuZHBvaW50OiBhdHRyaWJ1dGU6MHgleCB0eXBlOjB4JXgiLCBlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzLCBlbmRwb2ludC0+YkRlc2NyaXB0b3JUeXBlKTsKLQlpZiAoKGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgPT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UKQorCWlmICh1c2JfZW5kcG9pbnRfeGZlcl9pbnQoZW5kcG9pbnQpKQogCQlkYmcoImVuZHBvaW50OiB3ZSBoYXZlIGludGVycnVwdCBlbmRwb2ludFxuIik7CiAKIAlkYmcoImVuZHBvaW50IGV4dHJhIGxlbjolZCAiLCB1c2JpbnRlcmZhY2UtPmFsdHNldHRpbmdbMF0uZXh0cmFsZW4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90YWJsZXQvd2Fjb21fd2FjLmMgYi9kcml2ZXJzL2lucHV0L3RhYmxldC93YWNvbV93YWMuYwppbmRleCA4ZGM4ZDFlLi4yNjM4ODExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RhYmxldC93YWNvbV93YWMuYworKysgYi9kcml2ZXJzL2lucHV0L3RhYmxldC93YWNvbV93YWMuYwpAQCAtNTM1LDcgKzUzNSw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLWludCB3YWNvbV90cGNfaXJxKHN0cnVjdCB3YWNvbV93YWMgKndhY29tLCB2b2lkICp3Y29tYm8pCitzdGF0aWMgaW50IHdhY29tX3RwY19pcnEoc3RydWN0IHdhY29tX3dhYyAqd2Fjb20sIHZvaWQgKndjb21ibykKIHsKIAljaGFyICpkYXRhID0gd2Fjb20tPmRhdGE7CiAJaW50IHByb3ggPSAwLCBwcmVzc3VyZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vS2NvbmZpZyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vS2NvbmZpZwppbmRleCAzZDFhYjhmLi5iYjY0ODZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL0tjb25maWcKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9LY29uZmlnCkBAIC01OCw2ICs1OCwxNCBAQAogCSAgTk9URTogdGhpcyBkcml2ZXIgaXMgZGVwcmVjYXRlZCwgdHJ5IGVuYWJsZSBTUEkgYW5kIGdlbmVyaWMKIAkgIEFEUzc4NDYtYmFzZWQgdG91Y2hzY3JlZW4gZHJpdmVyLgogCitjb25maWcgVE9VQ0hTQ1JFRU5fREE5MDM0CisJdHJpc3RhdGUgIlRvdWNoc2NyZWVuIHN1cHBvcnQgZm9yIERpYWxvZyBTZW1pY29uZHVjdG9yIERBOTAzNCIKKwlkZXBlbmRzIG9uIFBNSUNfREE5MDNYCisJZGVmYXVsdCB5CisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgdGhlIHN1cHBvcnQgZm9yIHRoZSB0b3VjaHNjcmVlbiBmb3VuZAorCSAgb24gRGlhbG9nIFNlbWljb25kdWN0b3IgREE5MDM0IFBNSUMuCisKIGNvbmZpZyBUT1VDSFNDUkVFTl9GVUpJVFNVCiAJdHJpc3RhdGUgIkZ1aml0c3Ugc2VyaWFsIHRvdWNoc2NyZWVuIgogCXNlbGVjdCBTRVJJTwpAQCAtOTUsNiArMTAzLDE5IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBlbG8uCiAKK2NvbmZpZyBUT1VDSFNDUkVFTl9XQUNPTV9XODAwMQorCXRyaXN0YXRlICJXYWNvbSBXODAwMSBwZW5hYmxlZCBzZXJpYWwgdG91Y2hzY3JlZW4iCisJc2VsZWN0IFNFUklPCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhbiBXYWNvbSBXODAwMSBwZW5hYmxlZCBzZXJpYWwgdG91Y2hzY3JlZW4KKwkgIGNvbm5lY3RlZCB0byB5b3VyIHN5c3RlbS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgd2Fjb21fdzgwMDEuCisKKwogY29uZmlnIFRPVUNIU0NSRUVOX01UT1VDSAogCXRyaXN0YXRlICJNaWNyb1RvdWNoIHNlcmlhbCB0b3VjaHNjcmVlbnMiCiAJc2VsZWN0IFNFUklPCkBAIC0zNzYsNCArMzk3LDE1IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB0b3VjaGl0MjEzLgogCitjb25maWcgVE9VQ0hTQ1JFRU5fVFNDMjAwNworCXRyaXN0YXRlICJUU0MyMDA3IGJhc2VkIHRvdWNoc2NyZWVucyIKKwlkZXBlbmRzIG9uIEkyQworCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBUU0MyMDA3IGJhc2VkIHRvdWNoc2NyZWVuLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB0c2MyMDA3LgorCiBlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9NYWtlZmlsZSBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vTWFrZWZpbGUKaW5kZXggMTVjZjI5MC4uZDMzNzVhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL01ha2VmaWxlCkBAIC0yNSw4ICsyNSwxMSBAQAogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX1RPVUNISVQyMTMpCSs9IHRvdWNoaXQyMTMubwogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX1RPVUNIUklHSFQpCSs9IHRvdWNocmlnaHQubwogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX1RPVUNIV0lOKQkrPSB0b3VjaHdpbi5vCitvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fVFNDMjAwNykJKz0gdHNjMjAwNy5vCiBvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fVUNCMTQwMCkJKz0gdWNiMTQwMF90cy5vCitvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fV0FDT01fVzgwMDEpCSs9IHdhY29tX3c4MDAxLm8KIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9XTTk3WFgpCSs9IHdtOTd4eC10cy5vCitvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fREE5MDM0KQkrPSBkYTkwMzQtdHMubwogd205N3h4LXRzLSQoQ09ORklHX1RPVUNIU0NSRUVOX1dNOTcwNSkJKz0gd205NzA1Lm8KIHdtOTd4eC10cy0kKENPTkZJR19UT1VDSFNDUkVFTl9XTTk3MTIpCSs9IHdtOTcxMi5vCiB3bTk3eHgtdHMtJChDT05GSUdfVE9VQ0hTQ1JFRU5fV005NzEzKQkrPSB3bTk3MTMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZHM3ODQ2LmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2Fkczc4NDYuYwppbmRleCBlMWVjZTg5Li43YzI3YzhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2Fkczc4NDYuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2Fkczc4NDYuYwpAQCAtNDcyLDcgKzQ3Miw3IEBACiAJCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgYWRzNzg0NiAqdHMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlsb25nIGk7CisJdW5zaWduZWQgbG9uZyBpOwogCiAJaWYgKHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC01NTksNyArNTU5LDcgQEAKIAlpZiAocGFja2V0LT50Yy5pZ25vcmUgfHwgUnQgPiB0cy0+cHJlc3N1cmVfbWF4KSB7CiAjaWZkZWYgVkVSQk9TRQogCQlwcl9kZWJ1ZygiJXM6IGlnbm9yZWQgJWQgcHJlc3N1cmUgJWRcbiIsCi0JCQl0cy0+c3BpLT5kZXYuYnVzX2lkLCBwYWNrZXQtPnRjLmlnbm9yZSwgUnQpOworCQkJZGV2X25hbWUoJnRzLT5zcGktPmRldiksIHBhY2tldC0+dGMuaWdub3JlLCBSdCk7CiAjZW5kaWYKIAkJaHJ0aW1lcl9zdGFydCgmdHMtPnRpbWVyLCBrdGltZV9zZXQoMCwgVFNfUE9MTF9QRVJJT0QpLAogCQkJICAgICAgSFJUSU1FUl9NT0RFX1JFTCk7CkBAIC05NDcsNyArOTQ3LDcgQEAKIAkJdHMtPnBlbmlycV9yZWNoZWNrX2RlbGF5X3VzZWNzID0KIAkJCQlwZGF0YS0+cGVuaXJxX3JlY2hlY2tfZGVsYXlfdXNlY3M7CiAKLQlzbnByaW50Zih0cy0+cGh5cywgc2l6ZW9mKHRzLT5waHlzKSwgIiVzL2lucHV0MCIsIHNwaS0+ZGV2LmJ1c19pZCk7CisJc25wcmludGYodHMtPnBoeXMsIHNpemVvZih0cy0+cGh5cyksICIlcy9pbnB1dDAiLCBkZXZfbmFtZSgmc3BpLT5kZXYpKTsKIAogCWlucHV0X2Rldi0+bmFtZSA9ICJBRFM3ODR4IFRvdWNoc2NyZWVuIjsKIAlpbnB1dF9kZXYtPnBoeXMgPSB0cy0+cGh5czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vZGE5MDM0LXRzLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2RhOTAzNC10cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNjdkNzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2RhOTAzNC10cy5jCkBAIC0wLDAgKzEsMzkwIEBACisvKgorICogVG91Y2hzY3JlZW4gZHJpdmVyIGZvciBEaWFsb2cgU2VtaWNvbmR1Y3RvciBEQTkwMzQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLgorICoJRmVuZ3dlaSBZaW4gPGZlbmd3ZWkueWluQG1hcnZlbGwuY29tPgorICoJRXJpYyBNaWFvIDxlcmljLm1pYW9AbWFydmVsbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvZGE5MDN4Lmg+CisKKyNkZWZpbmUgREE5MDM0X01BTlVBTF9DVFJMCTB4NTAKKyNkZWZpbmUgREE5MDM0X0xET19BRENfRU4JKDEgPDwgNCkKKworI2RlZmluZSBEQTkwMzRfQVVUT19DVFJMMQkweDUxCisKKyNkZWZpbmUgREE5MDM0X0FVVE9fQ1RSTDIJMHg1MgorI2RlZmluZSBEQTkwMzRfQVVUT19UU0lfRU4JKDEgPDwgMykKKyNkZWZpbmUgREE5MDM0X1BFTl9ERVRFQ1QJKDEgPDwgNCkKKworI2RlZmluZSBEQTkwMzRfVFNJX0NUUkwxCTB4NTMKKyNkZWZpbmUgREE5MDM0X1RTSV9DVFJMMgkweDU0CisjZGVmaW5lIERBOTAzNF9UU0lfWF9NU0IJMHg2YworI2RlZmluZSBEQTkwMzRfVFNJX1lfTVNCCTB4NmQKKyNkZWZpbmUgREE5MDM0X1RTSV9YWV9MU0IJMHg2ZQorCitlbnVtIHsKKwlTVEFURV9JRExFLAkvKiB3YWl0IGZvciBwZW5kb3duICovCisJU1RBVEVfQlVTWSwJLyogVFNJIGJ1c3kgc2FtcGxpbmcgKi8KKwlTVEFURV9TVE9QLAkvKiBzYW1wbGUgYXZhaWxhYmxlICovCisJU1RBVEVfV0FJVCwJLyogV2FpdCB0byBzdGFydCBuZXh0IHNhbXBsZSAqLworfTsKKworZW51bSB7CisJRVZFTlRfUEVOX0RPV04sCisJRVZFTlRfUEVOX1VQLAorCUVWRU5UX1RTSV9SRUFEWSwKKwlFVkVOVF9USU1FRE9VVCwKK307CisKK3N0cnVjdCBkYTkwMzRfdG91Y2ggeworCXN0cnVjdCBkZXZpY2UJCSpkYTkwMzRfZGV2OworCXN0cnVjdCBpbnB1dF9kZXYJKmlucHV0X2RldjsKKworCXN0cnVjdCBkZWxheWVkX3dvcmsJdHNpX3dvcms7CisJc3RydWN0IG5vdGlmaWVyX2Jsb2NrCW5vdGlmaWVyOworCisJaW50CXN0YXRlOworCisJaW50CWludGVydmFsX21zOworCWludAl4X2ludmVydGVkOworCWludAl5X2ludmVydGVkOworCisJaW50CWxhc3RfeDsKKwlpbnQJbGFzdF95OworfTsKKworc3RhdGljIGlubGluZSBpbnQgaXNfcGVuX2Rvd24oc3RydWN0IGRhOTAzNF90b3VjaCAqdG91Y2gpCit7CisJcmV0dXJuIGRhOTAzeF9xdWVyeV9zdGF0dXModG91Y2gtPmRhOTAzNF9kZXYsIERBOTAzNF9TVEFUVVNfUEVOX0RPV04pOworfQorCitzdGF0aWMgaW5saW5lIGludCBkZXRlY3RfcGVuX2Rvd24oc3RydWN0IGRhOTAzNF90b3VjaCAqdG91Y2gsIGludCBvbikKK3sKKwlpZiAob24pCisJCXJldHVybiBkYTkwM3hfc2V0X2JpdHModG91Y2gtPmRhOTAzNF9kZXYsCisJCQkJREE5MDM0X0FVVE9fQ1RSTDIsIERBOTAzNF9QRU5fREVURUNUKTsKKwllbHNlCisJCXJldHVybiBkYTkwM3hfY2xyX2JpdHModG91Y2gtPmRhOTAzNF9kZXYsCisJCQkJREE5MDM0X0FVVE9fQ1RSTDIsIERBOTAzNF9QRU5fREVURUNUKTsKK30KKworc3RhdGljIGludCByZWFkX3RzaShzdHJ1Y3QgZGE5MDM0X3RvdWNoICp0b3VjaCkKK3sKKwl1aW50OF90IF94LCBfeSwgX3Y7CisJaW50IHJldDsKKworCXJldCA9IGRhOTAzeF9yZWFkKHRvdWNoLT5kYTkwMzRfZGV2LCBEQTkwMzRfVFNJX1hfTVNCLCAmX3gpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBkYTkwM3hfcmVhZCh0b3VjaC0+ZGE5MDM0X2RldiwgREE5MDM0X1RTSV9ZX01TQiwgJl95KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZGE5MDN4X3JlYWQodG91Y2gtPmRhOTAzNF9kZXYsIERBOTAzNF9UU0lfWFlfTFNCLCAmX3YpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl0b3VjaC0+bGFzdF94ID0gKChfeCA8PCAyKSAmIDB4M2ZjKSB8IChfdiAmIDB4Myk7CisJdG91Y2gtPmxhc3RfeSA9ICgoX3kgPDwgMikgJiAweDNmYykgfCAoKF92ICYgMHhjKSA+PiAyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBzdGFydF90c2koc3RydWN0IGRhOTAzNF90b3VjaCAqdG91Y2gpCit7CisJcmV0dXJuIGRhOTAzeF9zZXRfYml0cyh0b3VjaC0+ZGE5MDM0X2RldiwKKwkJCURBOTAzNF9BVVRPX0NUUkwyLCBEQTkwMzRfQVVUT19UU0lfRU4pOworfQorCitzdGF0aWMgaW5saW5lIGludCBzdG9wX3RzaShzdHJ1Y3QgZGE5MDM0X3RvdWNoICp0b3VjaCkKK3sKKwlyZXR1cm4gZGE5MDN4X2Nscl9iaXRzKHRvdWNoLT5kYTkwMzRfZGV2LAorCQkJREE5MDM0X0FVVE9fQ1RSTDIsIERBOTAzNF9BVVRPX1RTSV9FTik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXBvcnRfcGVuX2Rvd24oc3RydWN0IGRhOTAzNF90b3VjaCAqdG91Y2gpCit7CisJaW50IHggPSB0b3VjaC0+bGFzdF94OworCWludCB5ID0gdG91Y2gtPmxhc3RfeTsKKworCXggJj0gMHhmZmY7CisJaWYgKHRvdWNoLT54X2ludmVydGVkKQorCQl4ID0gMTAyNCAtIHg7CisJeSAmPSAweGZmZjsKKwlpZiAodG91Y2gtPnlfaW52ZXJ0ZWQpCisJCXkgPSAxMDI0IC0geTsKKworCWlucHV0X3JlcG9ydF9hYnModG91Y2gtPmlucHV0X2RldiwgQUJTX1gsIHgpOworCWlucHV0X3JlcG9ydF9hYnModG91Y2gtPmlucHV0X2RldiwgQUJTX1ksIHkpOworCWlucHV0X3JlcG9ydF9rZXkodG91Y2gtPmlucHV0X2RldiwgQlROX1RPVUNILCAxKTsKKworCWlucHV0X3N5bmModG91Y2gtPmlucHV0X2Rldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXBvcnRfcGVuX3VwKHN0cnVjdCBkYTkwMzRfdG91Y2ggKnRvdWNoKQoreworCWlucHV0X3JlcG9ydF9rZXkodG91Y2gtPmlucHV0X2RldiwgQlROX1RPVUNILCAwKTsKKwlpbnB1dF9zeW5jKHRvdWNoLT5pbnB1dF9kZXYpOworfQorCitzdGF0aWMgdm9pZCBkYTkwMzRfZXZlbnRfaGFuZGxlcihzdHJ1Y3QgZGE5MDM0X3RvdWNoICp0b3VjaCwgaW50IGV2ZW50KQoreworCWludCBlcnI7CisKKwlzd2l0Y2ggKHRvdWNoLT5zdGF0ZSkgeworCWNhc2UgU1RBVEVfSURMRToKKwkJaWYgKGV2ZW50ICE9IEVWRU5UX1BFTl9ET1dOKQorCQkJYnJlYWs7CisKKwkJLyogRW5hYmxlIGF1dG8gbWVhc3VyZW1lbnQgb2YgdGhlIFRTSSwgdGhpcyB3aWxsCisJCSAqIGF1dG9tYXRpY2FsbHkgZGlzYWJsZSBwZW4gZG93biBkZXRlY3Rpb24KKwkJICovCisJCWVyciA9IHN0YXJ0X3RzaSh0b3VjaCk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycl9yZXNldDsKKworCQl0b3VjaC0+c3RhdGUgPSBTVEFURV9CVVNZOworCQlicmVhazsKKworCWNhc2UgU1RBVEVfQlVTWToKKwkJaWYgKGV2ZW50ICE9IEVWRU5UX1RTSV9SRUFEWSkKKwkJCWJyZWFrOworCisJCWVyciA9IHJlYWRfdHNpKHRvdWNoKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyX3Jlc2V0OworCisJCS8qIERpc2FibGUgYXV0byBtZWFzdXJlbWVudCBvZiB0aGUgVFNJLCBzbyB0aGF0CisJCSAqIHBlbiBkb3duIHN0YXR1cyB3aWxsIGJlIGF2YWlsYWJsZQorCQkgKi8KKwkJZXJyID0gc3RvcF90c2kodG91Y2gpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfcmVzZXQ7CisKKwkJdG91Y2gtPnN0YXRlID0gU1RBVEVfU1RPUDsKKwkJYnJlYWs7CisKKwljYXNlIFNUQVRFX1NUT1A6CisJCWlmIChldmVudCA9PSBFVkVOVF9QRU5fRE9XTikgeworCQkJcmVwb3J0X3Blbl9kb3duKHRvdWNoKTsKKwkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdG91Y2gtPnRzaV93b3JrLAorCQkJCW1zZWNzX3RvX2ppZmZpZXModG91Y2gtPmludGVydmFsX21zKSk7CisJCQl0b3VjaC0+c3RhdGUgPSBTVEFURV9XQUlUOworCQl9CisKKwkJaWYgKGV2ZW50ID09IEVWRU5UX1BFTl9VUCkgeworCQkJcmVwb3J0X3Blbl91cCh0b3VjaCk7CisJCQl0b3VjaC0+c3RhdGUgPSBTVEFURV9JRExFOworCQl9CisKKwkJaW5wdXRfc3luYyh0b3VjaC0+aW5wdXRfZGV2KTsKKwkJYnJlYWs7CisKKwljYXNlIFNUQVRFX1dBSVQ6CisJCWlmIChldmVudCAhPSBFVkVOVF9USU1FRE9VVCkKKwkJCWJyZWFrOworCisJCWlmIChpc19wZW5fZG93bih0b3VjaCkpIHsKKwkJCXN0YXJ0X3RzaSh0b3VjaCk7CisJCQl0b3VjaC0+c3RhdGUgPSBTVEFURV9CVVNZOworCQl9IGVsc2UKKwkJCXRvdWNoLT5zdGF0ZSA9IFNUQVRFX0lETEU7CisJCWJyZWFrOworCX0KKwlyZXR1cm47CisKK2Vycl9yZXNldDoKKwl0b3VjaC0+c3RhdGUgPSBTVEFURV9JRExFOworCXN0b3BfdHNpKHRvdWNoKTsKKwlkZXRlY3RfcGVuX2Rvd24odG91Y2gsIDEpOworfQorCitzdGF0aWMgdm9pZCBkYTkwMzRfdHNpX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBkYTkwMzRfdG91Y2ggKnRvdWNoID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkYTkwMzRfdG91Y2gsIHRzaV93b3JrLndvcmspOworCisJZGE5MDM0X2V2ZW50X2hhbmRsZXIodG91Y2gsIEVWRU5UX1RJTUVET1VUKTsKK30KKworc3RhdGljIGludCBkYTkwMzRfdG91Y2hfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCQkgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZGE5MDM0X3RvdWNoICp0b3VjaCA9CisJCWNvbnRhaW5lcl9vZihuYiwgc3RydWN0IGRhOTAzNF90b3VjaCwgbm90aWZpZXIpOworCisJaWYgKGV2ZW50ICYgREE5MDM0X0VWRU5UX1BFTl9ET1dOKSB7CisJCWlmIChpc19wZW5fZG93bih0b3VjaCkpCisJCQlkYTkwMzRfZXZlbnRfaGFuZGxlcih0b3VjaCwgRVZFTlRfUEVOX0RPV04pOworCQllbHNlCisJCQlkYTkwMzRfZXZlbnRfaGFuZGxlcih0b3VjaCwgRVZFTlRfUEVOX1VQKTsKKwl9CisKKwlpZiAoZXZlbnQgJiBEQTkwMzRfRVZFTlRfVFNJX1JFQURZKQorCQlkYTkwMzRfZXZlbnRfaGFuZGxlcih0b3VjaCwgRVZFTlRfVFNJX1JFQURZKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRhOTAzNF90b3VjaF9vcGVuKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgZGE5MDM0X3RvdWNoICp0b3VjaCA9IGlucHV0X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldDsKKworCXJldCA9IGRhOTAzeF9yZWdpc3Rlcl9ub3RpZmllcih0b3VjaC0+ZGE5MDM0X2RldiwgJnRvdWNoLT5ub3RpZmllciwKKwkJCURBOTAzNF9FVkVOVF9QRU5fRE9XTiB8IERBOTAzNF9FVkVOVF9UU0lfUkVBRFkpOworCWlmIChyZXQpCisJCXJldHVybiAtRUJVU1k7CisKKwkvKiBFbmFibGUgQURDIExETyAqLworCXJldCA9IGRhOTAzeF9zZXRfYml0cyh0b3VjaC0+ZGE5MDM0X2RldiwKKwkJCURBOTAzNF9NQU5VQUxfQ1RSTCwgREE5MDM0X0xET19BRENfRU4pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBUU0lfREVMQVk6IDMgc2xvdHMsIFRTSV9TS0lQOiAzIHNsb3RzICovCisJcmV0ID0gZGE5MDN4X3dyaXRlKHRvdWNoLT5kYTkwMzRfZGV2LCBEQTkwMzRfVFNJX0NUUkwxLCAweDFiKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZGE5MDN4X3dyaXRlKHRvdWNoLT5kYTkwMzRfZGV2LCBEQTkwMzRfVFNJX0NUUkwyLCAweDAwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJdG91Y2gtPnN0YXRlID0gU1RBVEVfSURMRTsKKwlkZXRlY3RfcGVuX2Rvd24odG91Y2gsIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRhOTAzNF90b3VjaF9jbG9zZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCit7CisJc3RydWN0IGRhOTAzNF90b3VjaCAqdG91Y2ggPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOworCisJZGE5MDN4X3VucmVnaXN0ZXJfbm90aWZpZXIodG91Y2gtPmRhOTAzNF9kZXYsICZ0b3VjaC0+bm90aWZpZXIsCisJCQlEQTkwMzRfRVZFTlRfUEVOX0RPV04gfCBEQTkwMzRfRVZFTlRfVFNJX1JFQURZKTsKKworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmdG91Y2gtPnRzaV93b3JrKTsKKworCXRvdWNoLT5zdGF0ZSA9IFNUQVRFX0lETEU7CisJc3RvcF90c2kodG91Y2gpOworCWRldGVjdF9wZW5fZG93bih0b3VjaCwgMCk7CisKKwkvKiBEaXNhYmxlIEFEQyBMRE8gKi8KKwlkYTkwM3hfY2xyX2JpdHModG91Y2gtPmRhOTAzNF9kZXYsCisJCQlEQTkwMzRfTUFOVUFMX0NUUkwsIERBOTAzNF9MRE9fQURDX0VOKTsKK30KKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBkYTkwMzRfdG91Y2hfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGE5MDM0X3RvdWNoX3BkYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBkYTkwMzRfdG91Y2ggKnRvdWNoOworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKKwlpbnQgcmV0OworCisJdG91Y2ggPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGE5MDM0X3RvdWNoKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHRvdWNoID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIGRyaXZlciBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJdG91Y2gtPmRhOTAzNF9kZXYgPSBwZGV2LT5kZXYucGFyZW50OworCisJaWYgKHBkYXRhKSB7CisJCXRvdWNoLT5pbnRlcnZhbF9tcwk9IHBkYXRhLT5pbnRlcnZhbF9tczsKKwkJdG91Y2gtPnhfaW52ZXJ0ZWQJPSBwZGF0YS0+eF9pbnZlcnRlZDsKKwkJdG91Y2gtPnlfaW52ZXJ0ZWQJPSBwZGF0YS0+eV9pbnZlcnRlZDsKKwl9IGVsc2UKKwkJLyogZmFsbGJhY2sgaW50byBkZWZhdWx0ICovCisJCXRvdWNoLT5pbnRlcnZhbF9tcwk9IDEwOworCisJSU5JVF9ERUxBWUVEX1dPUksoJnRvdWNoLT50c2lfd29yaywgZGE5MDM0X3RzaV93b3JrKTsKKwl0b3VjaC0+bm90aWZpZXIubm90aWZpZXJfY2FsbCA9IGRhOTAzNF90b3VjaF9ub3RpZmllcjsKKworCWlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmICghaW5wdXRfZGV2KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBpbnB1dCBkZXZpY2VcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9mcmVlX3RvdWNoOworCX0KKworCWlucHV0X2Rldi0+bmFtZQkJPSBwZGV2LT5uYW1lOworCWlucHV0X2Rldi0+b3BlbgkJPSBkYTkwMzRfdG91Y2hfb3BlbjsKKwlpbnB1dF9kZXYtPmNsb3NlCT0gZGE5MDM0X3RvdWNoX2Nsb3NlOworCWlucHV0X2Rldi0+ZGV2LnBhcmVudAk9ICZwZGV2LT5kZXY7CisKKwlfX3NldF9iaXQoRVZfQUJTLCBpbnB1dF9kZXYtPmV2Yml0KTsKKwlfX3NldF9iaXQoQUJTX1gsIGlucHV0X2Rldi0+YWJzYml0KTsKKwlfX3NldF9iaXQoQUJTX1ksIGlucHV0X2Rldi0+YWJzYml0KTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19YLCAwLCAxMDIzLCAwLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19ZLCAwLCAxMDIzLCAwLCAwKTsKKworCV9fc2V0X2JpdChFVl9LRVksIGlucHV0X2Rldi0+ZXZiaXQpOworCV9fc2V0X2JpdChCVE5fVE9VQ0gsIGlucHV0X2Rldi0+a2V5Yml0KTsKKworCXRvdWNoLT5pbnB1dF9kZXYgPSBpbnB1dF9kZXY7CisJaW5wdXRfc2V0X2RydmRhdGEoaW5wdXRfZGV2LCB0b3VjaCk7CisKKwlyZXQgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaW5wdXRfZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9mcmVlX2lucHV0OworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgdG91Y2gpOworCXJldHVybiAwOworCitlcnJfZnJlZV9pbnB1dDoKKwlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOworZXJyX2ZyZWVfdG91Y2g6CisJa2ZyZWUodG91Y2gpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGRhOTAzNF90b3VjaF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGE5MDM0X3RvdWNoICp0b3VjaCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UodG91Y2gtPmlucHV0X2Rldik7CisJa2ZyZWUodG91Y2gpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGRhOTAzNF90b3VjaF9kcml2ZXIgPSB7CisJLmRyaXZlcgk9IHsKKwkJLm5hbWUJPSAiZGE5MDM0LXRvdWNoIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gZGE5MDM0X3RvdWNoX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZGE5MDM0X3RvdWNoX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkYTkwMzRfdG91Y2hfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmRhOTAzNF90b3VjaF9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoZGE5MDM0X3RvdWNoX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgZGE5MDM0X3RvdWNoX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZGE5MDM0X3RvdWNoX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChkYTkwMzRfdG91Y2hfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiVG91Y2hzY3JlZW4gZHJpdmVyIGZvciBEaWFsb2cgU2VtaWNvbmR1Y3RvciBEQTkwMzQiKTsKK01PRFVMRV9BVVRIT1IoIkVyaWMgTWlhbyA8ZXJpYy5taWFvQG1hcnZlbGwuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpkYTkwMzQtdG91Y2giKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdHNjMjAwNy5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi90c2MyMDA3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc1ZGMyOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdHNjMjAwNy5jCkBAIC0wLDAgKzEsMzgxIEBACisvKgorICogZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi90c2MyMDA3LmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTXRla1Zpc2lvbiBDby4sIEx0ZC4KKyAqCUt3YW5nd29vIExlZSA8a3dsZWVAbXRla3Zpc2lvbi5jb20+CisgKgorICogVXNpbmcgY29kZSBmcm9tOgorICogIC0gYWRzNzg0Ni5jCisgKglDb3B5cmlnaHQgKGMpIDIwMDUgRGF2aWQgQnJvd25lbGwKKyAqCUNvcHlyaWdodCAoYykgMjAwNiBOb2tpYSBDb3Jwb3JhdGlvbgorICogIC0gY29yZ2lfdHMuYworICoJQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgUmljaGFyZCBQdXJkaWUKKyAqICAtIG9tYXBfdHMuW2hjXSwgYWRzNzg0Ni5oLCB0c19vc2suYworICoJQ29weXJpZ2h0IChDKSAyMDAyIE1vbnRhVmlzdGEgU29mdHdhcmUKKyAqCUNvcHlyaWdodCAoQykgMjAwNCBUZXhhcyBJbnN0cnVtZW50cworICoJQ29weXJpZ2h0IChDKSAyMDA1IERpcmsgQmVobWUKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjL3RzYzIwMDcuaD4KKworI2RlZmluZSBUU19QT0xMX0RFTEFZCSgxMCAqIDEwMDApCS8qIG5zIGRlbGF5IGJlZm9yZSB0aGUgZmlyc3Qgc2FtcGxlICovCisjZGVmaW5lIFRTX1BPTExfUEVSSU9ECSg1ICogMTAwMCkJLyogbnMgZGVsYXkgYmV0d2VlbiBzYW1wbGVzICovCisKKyNkZWZpbmUgVFNDMjAwN19NRUFTVVJFX1RFTVAwCQkoMHgwIDw8IDQpCisjZGVmaW5lIFRTQzIwMDdfTUVBU1VSRV9BVVgJCSgweDIgPDwgNCkKKyNkZWZpbmUgVFNDMjAwN19NRUFTVVJFX1RFTVAxCQkoMHg0IDw8IDQpCisjZGVmaW5lIFRTQzIwMDdfQUNUSVZBVEVfWE4JCSgweDggPDwgNCkKKyNkZWZpbmUgVFNDMjAwN19BQ1RJVkFURV9ZTgkJKDB4OSA8PCA0KQorI2RlZmluZSBUU0MyMDA3X0FDVElWQVRFX1lQX1hOCQkoMHhhIDw8IDQpCisjZGVmaW5lIFRTQzIwMDdfU0VUVVAJCQkoMHhiIDw8IDQpCisjZGVmaW5lIFRTQzIwMDdfTUVBU1VSRV9YCQkoMHhjIDw8IDQpCisjZGVmaW5lIFRTQzIwMDdfTUVBU1VSRV9ZCQkoMHhkIDw8IDQpCisjZGVmaW5lIFRTQzIwMDdfTUVBU1VSRV9aMQkJKDB4ZSA8PCA0KQorI2RlZmluZSBUU0MyMDA3X01FQVNVUkVfWjIJCSgweGYgPDwgNCkKKworI2RlZmluZSBUU0MyMDA3X1BPV0VSX09GRl9JUlFfRU4JKDB4MCA8PCAyKQorI2RlZmluZSBUU0MyMDA3X0FEQ19PTl9JUlFfRElTMAkJKDB4MSA8PCAyKQorI2RlZmluZSBUU0MyMDA3X0FEQ19PRkZfSVJRX0VOCQkoMHgyIDw8IDIpCisjZGVmaW5lIFRTQzIwMDdfQURDX09OX0lSUV9ESVMxCQkoMHgzIDw8IDIpCisKKyNkZWZpbmUgVFNDMjAwN18xMkJJVAkJCSgweDAgPDwgMSkKKyNkZWZpbmUgVFNDMjAwN184QklUCQkJKDB4MSA8PCAxKQorCisjZGVmaW5lCU1BWF8xMkJJVAkJCSgoMSA8PCAxMikgLSAxKQorCisjZGVmaW5lIEFEQ19PTl8xMkJJVAkoVFNDMjAwN18xMkJJVCB8IFRTQzIwMDdfQURDX09OX0lSUV9ESVMwKQorCisjZGVmaW5lIFJFQURfWQkJKEFEQ19PTl8xMkJJVCB8IFRTQzIwMDdfTUVBU1VSRV9ZKQorI2RlZmluZSBSRUFEX1oxCQkoQURDX09OXzEyQklUIHwgVFNDMjAwN19NRUFTVVJFX1oxKQorI2RlZmluZSBSRUFEX1oyCQkoQURDX09OXzEyQklUIHwgVFNDMjAwN19NRUFTVVJFX1oyKQorI2RlZmluZSBSRUFEX1gJCShBRENfT05fMTJCSVQgfCBUU0MyMDA3X01FQVNVUkVfWCkKKyNkZWZpbmUgUFdSRE9XTgkJKFRTQzIwMDdfMTJCSVQgfCBUU0MyMDA3X1BPV0VSX09GRl9JUlFfRU4pCisKK3N0cnVjdCB0c19ldmVudCB7CisJdTE2CXg7CisJdTE2CXk7CisJdTE2CXoxLCB6MjsKK307CisKK3N0cnVjdCB0c2MyMDA3IHsKKwlzdHJ1Y3QgaW5wdXRfZGV2CSppbnB1dDsKKwljaGFyCQkJcGh5c1szMl07CisJc3RydWN0IGhydGltZXIJCXRpbWVyOworCXN0cnVjdCB0c19ldmVudAkJdGM7CisKKwlzdHJ1Y3QgaTJjX2NsaWVudAkqY2xpZW50OworCisJc3BpbmxvY2tfdAkJbG9jazsKKworCXUxNgkJCW1vZGVsOworCXUxNgkJCXhfcGxhdGVfb2htczsKKworCXVuc2lnbmVkCQlwZW5kb3duOworCWludAkJCWlycTsKKworCWludAkJCSgqZ2V0X3BlbmRvd25fc3RhdGUpKHZvaWQpOworCXZvaWQJCQkoKmNsZWFyX3BlbmlycSkodm9pZCk7Cit9OworCitzdGF0aWMgaW5saW5lIGludCB0c2MyMDA3X3hmZXIoc3RydWN0IHRzYzIwMDcgKnRzYywgdTggY21kKQoreworCXMzMiBkYXRhOworCXUxNiB2YWw7CisKKwlkYXRhID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKHRzYy0+Y2xpZW50LCBjbWQpOworCWlmIChkYXRhIDwgMCkgeworCQlkZXZfZXJyKCZ0c2MtPmNsaWVudC0+ZGV2LCAiaTJjIGlvIGVycm9yOiAlZFxuIiwgZGF0YSk7CisJCXJldHVybiBkYXRhOworCX0KKworCS8qIFRoZSBwcm90b2NvbCBhbmQgcmF3IGRhdGEgZm9ybWF0IGZyb20gaTJjIGludGVyZmFjZToKKwkgKiBTIEFkZHIgV3IgW0FdIENvbW0gW0FdIFMgQWRkciBSZCBbQV0gW0RhdGFMb3ddIEEgW0RhdGFIaWdoXSBOQSBQCisJICogV2hlcmUgRGF0YUxvdyBoYXMgW0QxMS1ENF0sIERhdGFIaWdoIGhhcyBbRDMtRDAgPDwgNCB8IER1bW15IDRiaXRdLgorCSAqLworCXZhbCA9IHN3YWIxNihkYXRhKSA+PiA0OworCisJZGV2X2RiZygmdHNjLT5jbGllbnQtPmRldiwgImRhdGE6IDB4JXgsIHZhbDogMHgleFxuIiwgZGF0YSwgdmFsKTsKKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIHRzYzIwMDdfc2VuZF9ldmVudCh2b2lkICp0c2MpCit7CisJc3RydWN0IHRzYzIwMDcJKnRzID0gdHNjOworCXUzMgkJcnQ7CisJdTE2CQl4LCB5LCB6MSwgejI7CisKKwl4ID0gdHMtPnRjLng7CisJeSA9IHRzLT50Yy55OworCXoxID0gdHMtPnRjLnoxOworCXoyID0gdHMtPnRjLnoyOworCisJLyogcmFuZ2UgZmlsdGVyaW5nICovCisJaWYgKHggPT0gTUFYXzEyQklUKQorCQl4ID0gMDsKKworCWlmIChsaWtlbHkoeCAmJiB6MSkpIHsKKwkJLyogY29tcHV0ZSB0b3VjaCBwcmVzc3VyZSByZXNpc3RhbmNlIHVzaW5nIGVxdWF0aW9uICMxICovCisJCXJ0ID0gejI7CisJCXJ0IC09IHoxOworCQlydCAqPSB4OworCQlydCAqPSB0cy0+eF9wbGF0ZV9vaG1zOworCQlydCAvPSB6MTsKKwkJcnQgPSAocnQgKyAyMDQ3KSA+PiAxMjsKKwl9IGVsc2UKKwkJcnQgPSAwOworCisJLyogU2FtcGxlIGZvdW5kIGluY29uc2lzdGVudCBieSBkZWJvdW5jaW5nIG9yIHByZXNzdXJlIGlzIGJleW9uZAorCSAqIHRoZSBtYXhpbXVtLiBEb24ndCByZXBvcnQgaXQgdG8gdXNlciBzcGFjZSwgcmVwZWF0IGF0IGxlYXN0CisJICogb25jZSBtb3JlIHRoZSBtZWFzdXJlbWVudAorCSAqLworCWlmIChydCA+IE1BWF8xMkJJVCkgeworCQlkZXZfZGJnKCZ0cy0+Y2xpZW50LT5kZXYsICJpZ25vcmVkIHByZXNzdXJlICVkXG4iLCBydCk7CisKKwkJaHJ0aW1lcl9zdGFydCgmdHMtPnRpbWVyLCBrdGltZV9zZXQoMCwgVFNfUE9MTF9QRVJJT0QpLAorCQkJICAgICAgSFJUSU1FUl9NT0RFX1JFTCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBOT1RFOiBXZSBjYW4ndCByZWx5IG9uIHRoZSBwcmVzc3VyZSB0byBkZXRlcm1pbmUgdGhlIHBlbiBkb3duCisJICogc3RhdGUsIGV2ZW4gdGhpcyBjb250cm9sbGVyIGhhcyBhIHByZXNzdXJlIHNlbnNvci4gIFRoZSBwcmVzc3VyZQorCSAqIHZhbHVlIGNhbiBmbHVjdHVhdGUgZm9yIHF1aXRlIGEgd2hpbGUgYWZ0ZXIgbGlmdGluZyB0aGUgcGVuIGFuZAorCSAqIGluIHNvbWUgY2FzZXMgbWF5IG5vdCBldmVuIHNldHRsZSBhdCB0aGUgZXhwZWN0ZWQgdmFsdWUuCisJICoKKwkgKiBUaGUgb25seSBzYWZlIHdheSB0byBjaGVjayBmb3IgdGhlIHBlbiB1cCBjb25kaXRpb24gaXMgaW4gdGhlCisJICogdGltZXIgYnkgcmVhZGluZyB0aGUgcGVuIHNpZ25hbCBzdGF0ZSAoaXQncyBhIEdQSU8gX2FuZF8gSVJRKS4KKwkgKi8KKwlpZiAocnQpIHsKKwkJc3RydWN0IGlucHV0X2RldiAqaW5wdXQgPSB0cy0+aW5wdXQ7CisKKwkJaWYgKCF0cy0+cGVuZG93bikgeworCQkJZGV2X2RiZygmdHMtPmNsaWVudC0+ZGV2LCAiRE9XTlxuIik7CisKKwkJCWlucHV0X3JlcG9ydF9rZXkoaW5wdXQsIEJUTl9UT1VDSCwgMSk7CisJCQl0cy0+cGVuZG93biA9IDE7CisJCX0KKworCQlpbnB1dF9yZXBvcnRfYWJzKGlucHV0LCBBQlNfWCwgeCk7CisJCWlucHV0X3JlcG9ydF9hYnMoaW5wdXQsIEFCU19ZLCB5KTsKKwkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dCwgQUJTX1BSRVNTVVJFLCBydCk7CisKKwkJaW5wdXRfc3luYyhpbnB1dCk7CisKKwkJZGV2X2RiZygmdHMtPmNsaWVudC0+ZGV2LCAicG9pbnQoJTRkLCU0ZCksIHByZXNzdXJlICglNHUpXG4iLAorCQkJeCwgeSwgcnQpOworCX0KKworCWhydGltZXJfc3RhcnQoJnRzLT50aW1lciwga3RpbWVfc2V0KDAsIFRTX1BPTExfUEVSSU9EKSwKKwkJCUhSVElNRVJfTU9ERV9SRUwpOworfQorCitzdGF0aWMgaW50IHRzYzIwMDdfcmVhZF92YWx1ZXMoc3RydWN0IHRzYzIwMDcgKnRzYykKK3sKKwkvKiB5LSBzdGlsbCBvbjsgdHVybiBvbiBvbmx5IHkrIChhbmQgQURDKSAqLworCXRzYy0+dGMueSA9IHRzYzIwMDdfeGZlcih0c2MsIFJFQURfWSk7CisKKwkvKiB0dXJuIHktIG9mZiwgeCsgb24sIHRoZW4gbGVhdmUgaW4gbG93cG93ZXIgKi8KKwl0c2MtPnRjLnggPSB0c2MyMDA3X3hmZXIodHNjLCBSRUFEX1gpOworCisJLyogdHVybiB5KyBvZmYsIHgtIG9uOyB3ZSdsbCB1c2UgZm9ybXVsYSAjMSAqLworCXRzYy0+dGMuejEgPSB0c2MyMDA3X3hmZXIodHNjLCBSRUFEX1oxKTsKKwl0c2MtPnRjLnoyID0gdHNjMjAwN194ZmVyKHRzYywgUkVBRF9aMik7CisKKwkvKiBwb3dlciBkb3duICovCisJdHNjMjAwN194ZmVyKHRzYywgUFdSRE9XTik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IHRzYzIwMDdfdGltZXIoc3RydWN0IGhydGltZXIgKmhhbmRsZSkKK3sKKwlzdHJ1Y3QgdHNjMjAwNyAqdHMgPSBjb250YWluZXJfb2YoaGFuZGxlLCBzdHJ1Y3QgdHNjMjAwNywgdGltZXIpOworCisJc3Bpbl9sb2NrX2lycSgmdHMtPmxvY2spOworCisJaWYgKHVubGlrZWx5KCF0cy0+Z2V0X3BlbmRvd25fc3RhdGUoKSAmJiB0cy0+cGVuZG93bikpIHsKKwkJc3RydWN0IGlucHV0X2RldiAqaW5wdXQgPSB0cy0+aW5wdXQ7CisKKwkJZGV2X2RiZygmdHMtPmNsaWVudC0+ZGV2LCAiVVBcbiIpOworCisJCWlucHV0X3JlcG9ydF9rZXkoaW5wdXQsIEJUTl9UT1VDSCwgMCk7CisJCWlucHV0X3JlcG9ydF9hYnMoaW5wdXQsIEFCU19QUkVTU1VSRSwgMCk7CisJCWlucHV0X3N5bmMoaW5wdXQpOworCisJCXRzLT5wZW5kb3duID0gMDsKKwkJZW5hYmxlX2lycSh0cy0+aXJxKTsKKwl9IGVsc2UgeworCQkvKiBwZW4gaXMgc3RpbGwgZG93biwgY29udGludWUgd2l0aCB0aGUgbWVhc3VyZW1lbnQgKi8KKwkJZGV2X2RiZygmdHMtPmNsaWVudC0+ZGV2LCAicGVuIGlzIHN0aWxsIGRvd25cbiIpOworCisJCXRzYzIwMDdfcmVhZF92YWx1ZXModHMpOworCQl0c2MyMDA3X3NlbmRfZXZlbnQodHMpOworCX0KKworCXNwaW5fdW5sb2NrX2lycSgmdHMtPmxvY2spOworCisJcmV0dXJuIEhSVElNRVJfTk9SRVNUQVJUOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgdHNjMjAwN19pcnEoaW50IGlycSwgdm9pZCAqaGFuZGxlKQoreworCXN0cnVjdCB0c2MyMDA3ICp0cyA9IGhhbmRsZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRzLT5sb2NrLCBmbGFncyk7CisKKwlpZiAobGlrZWx5KHRzLT5nZXRfcGVuZG93bl9zdGF0ZSgpKSkgeworCQlkaXNhYmxlX2lycSh0cy0+aXJxKTsKKwkJaHJ0aW1lcl9zdGFydCgmdHMtPnRpbWVyLCBrdGltZV9zZXQoMCwgVFNfUE9MTF9ERUxBWSksCisJCQkJCUhSVElNRVJfTU9ERV9SRUwpOworCX0KKworCWlmICh0cy0+Y2xlYXJfcGVuaXJxKQorCQl0cy0+Y2xlYXJfcGVuaXJxKCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cy0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IHRzYzIwMDdfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgdHNjMjAwNyAqdHM7CisJc3RydWN0IHRzYzIwMDdfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OworCWludCBlcnI7CisKKwlpZiAoIXBkYXRhKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAicGxhdGZvcm0gZGF0YSBpcyByZXF1aXJlZCFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwKKwkJCQkgICAgIEkyQ19GVU5DX1NNQlVTX1JFQURfV09SRF9EQVRBKSkKKwkJcmV0dXJuIC1FSU87CisKKwl0cyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0c2MyMDA3KSwgR0ZQX0tFUk5FTCk7CisJaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKCF0cyB8fCAhaW5wdXRfZGV2KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2ZyZWVfbWVtOworCX0KKworCXRzLT5jbGllbnQgPSBjbGllbnQ7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgdHMpOworCisJdHMtPmlucHV0ID0gaW5wdXRfZGV2OworCisJaHJ0aW1lcl9pbml0KCZ0cy0+dGltZXIsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX1JFTCk7CisJdHMtPnRpbWVyLmZ1bmN0aW9uID0gdHNjMjAwN190aW1lcjsKKworCXNwaW5fbG9ja19pbml0KCZ0cy0+bG9jayk7CisKKwl0cy0+bW9kZWwgICAgICAgICAgICAgPSBwZGF0YS0+bW9kZWw7CisJdHMtPnhfcGxhdGVfb2htcyAgICAgID0gcGRhdGEtPnhfcGxhdGVfb2htczsKKwl0cy0+Z2V0X3BlbmRvd25fc3RhdGUgPSBwZGF0YS0+Z2V0X3BlbmRvd25fc3RhdGU7CisJdHMtPmNsZWFyX3BlbmlycSAgICAgID0gcGRhdGEtPmNsZWFyX3BlbmlycTsKKworCXBkYXRhLT5pbml0X3BsYXRmb3JtX2h3KCk7CisKKwlzbnByaW50Zih0cy0+cGh5cywgc2l6ZW9mKHRzLT5waHlzKSwgIiVzL2lucHV0MCIsIGNsaWVudC0+ZGV2LmJ1c19pZCk7CisKKwlpbnB1dF9kZXYtPm5hbWUgPSAiVFNDMjAwNyBUb3VjaHNjcmVlbiI7CisJaW5wdXRfZGV2LT5waHlzID0gdHMtPnBoeXM7CisJaW5wdXRfZGV2LT5pZC5idXN0eXBlID0gQlVTX0kyQzsKKworCWlucHV0X2Rldi0+ZXZiaXRbMF0gPSBCSVRfTUFTSyhFVl9LRVkpIHwgQklUX01BU0soRVZfQUJTKTsKKwlpbnB1dF9kZXYtPmtleWJpdFtCSVRfV09SRChCVE5fVE9VQ0gpXSA9IEJJVF9NQVNLKEJUTl9UT1VDSCk7CisKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19YLCAwLCBNQVhfMTJCSVQsIDAsIDApOworCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1ksIDAsIE1BWF8xMkJJVCwgMCwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfUFJFU1NVUkUsIDAsIE1BWF8xMkJJVCwgMCwgMCk7CisKKwl0c2MyMDA3X3JlYWRfdmFsdWVzKHRzKTsKKworCXRzLT5pcnEgPSBjbGllbnQtPmlycTsKKworCWVyciA9IHJlcXVlc3RfaXJxKHRzLT5pcnEsIHRzYzIwMDdfaXJxLCAwLAorCQkJY2xpZW50LT5kZXYuZHJpdmVyLT5uYW1lLCB0cyk7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJpcnEgJWQgYnVzeT9cbiIsIHRzLT5pcnEpOworCQlnb3RvIGVycl9mcmVlX21lbTsKKwl9CisKKwllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaW5wdXRfZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9mcmVlX2lycTsKKworCWRldl9pbmZvKCZjbGllbnQtPmRldiwgInJlZ2lzdGVyZWQgd2l0aCBpcnEgKCVkKVxuIiwgdHMtPmlycSk7CisKKwlyZXR1cm4gMDsKKworIGVycl9mcmVlX2lycToKKwlmcmVlX2lycSh0cy0+aXJxLCB0cyk7CisJaHJ0aW1lcl9jYW5jZWwoJnRzLT50aW1lcik7CisgZXJyX2ZyZWVfbWVtOgorCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7CisJa2ZyZWUodHMpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdHNjMjAwN19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgdHNjMjAwNwkqdHMgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgdHNjMjAwN19wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKworCXBkYXRhID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlwZGF0YS0+ZXhpdF9wbGF0Zm9ybV9odygpOworCisJZnJlZV9pcnEodHMtPmlycSwgdHMpOworCWhydGltZXJfY2FuY2VsKCZ0cy0+dGltZXIpOworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHRzLT5pbnB1dCk7CisJa2ZyZWUodHMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RldmljZV9pZCB0c2MyMDA3X2lkdGFibGVbXSA9IHsKKwl7ICJ0c2MyMDA3IiwgMCB9LAorCXsgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHRzYzIwMDdfaWR0YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB0c2MyMDA3X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLm5hbWUJPSAidHNjMjAwNyIKKwl9LAorCS5pZF90YWJsZQk9IHRzYzIwMDdfaWR0YWJsZSwKKwkucHJvYmUJCT0gdHNjMjAwN19wcm9iZSwKKwkucmVtb3ZlCQk9IHRzYzIwMDdfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdHNjMjAwN19pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZ0c2MyMDA3X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0c2MyMDA3X2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmdHNjMjAwN19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh0c2MyMDA3X2luaXQpOworbW9kdWxlX2V4aXQodHNjMjAwN19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiS3dhbmd3b28gTGVlIDxrd2xlZUBtdGVrdmlzaW9uLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVFNDMjAwNyBUb3VjaFNjcmVlbiBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdXNidG91Y2hzY3JlZW4uYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdXNidG91Y2hzY3JlZW4uYwppbmRleCBmZGQ2NDVjLi41MDgwYjI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3VzYnRvdWNoc2NyZWVuLmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi91c2J0b3VjaHNjcmVlbi5jCkBAIC00MjQsNyArNDI0LDcgQEAKIAkgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgYnVmLCAyLCBVU0JfQ1RSTF9TRVRfVElNRU9VVCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyX291dDsKLQlpZiAoYnVmWzBdICE9IDB4MDYgfHwgYnVmWzFdICE9IDB4MDApIHsKKwlpZiAoYnVmWzBdICE9IDB4MDYpIHsKIAkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byBlcnJfb3V0OwogCX0KQEAgLTQzNyw4ICs0MzcsNyBAQAogCSAgICAgICAgICAgICAgICAgICAgICBUU0MxMF9SQVRFXzE1MCwgMCwgYnVmLCAyLCBVU0JfQ1RSTF9TRVRfVElNRU9VVCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyX291dDsKLQlpZiAoKGJ1ZlswXSAhPSAweDA2IHx8IGJ1ZlsxXSAhPSAweDAwKSAmJgotCSAgICAoYnVmWzBdICE9IDB4MTUgfHwgYnVmWzFdICE9IDB4MDEpKSB7CisJaWYgKChidWZbMF0gIT0gMHgwNikgJiYgKGJ1ZlswXSAhPSAweDE1IHx8IGJ1ZlsxXSAhPSAweDAxKSkgewogCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIGVycl9vdXQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi93YWNvbV93ODAwMS5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi93YWNvbV93ODAwMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMzNhMDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3dhY29tX3c4MDAxLmMKQEAgLTAsMCArMSwzMjUgQEAKKy8qCisgKiBXYWNvbSBXODAwMSBwZW5hYmxlZCBzZXJpYWwgdG91Y2hzY3JlZW4gZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IEpheWEgS3VtYXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBMYXlvdXQgYmFzZWQgb24gRWxvIHNlcmlhbCB0b3VjaHNjcmVlbiBkcml2ZXIgYnkgVm9qdGVjaCBQYXZsaWsKKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorCisjZGVmaW5lIERSSVZFUl9ERVNDCSJXYWNvbSBXODAwMSBzZXJpYWwgdG91Y2hzY3JlZW4gZHJpdmVyIgorCitNT0RVTEVfQVVUSE9SKCJKYXlhIEt1bWFyIDxqYXlha3VtYXIubGttbEBnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKgorICogRGVmaW5pdGlvbnMgJiBnbG9iYWwgYXJyYXlzLgorICovCisKKyNkZWZpbmUgVzgwMDFfTUFYX0xFTkdUSAkxMQorI2RlZmluZSBXODAwMV9QQUNLRVRfTEVOCTExCisjZGVmaW5lIFc4MDAxX0xFQURfTUFTSyAweDgwCisjZGVmaW5lIFc4MDAxX0xFQURfQllURSAweDgwCisjZGVmaW5lIFc4MDAxX1RBQl9NQVNLIDB4NDAKKyNkZWZpbmUgVzgwMDFfVEFCX0JZVEUgMHg0MAorCisjZGVmaW5lIFc4MDAxX1FVRVJZX1BBQ0tFVCAweDIwCisKK3N0cnVjdCB3ODAwMV9jb29yZCB7CisJdTggcmR5OworCXU4IHRzdzsKKwl1OCBmMTsKKwl1OCBmMjsKKwl1MTYgeDsKKwl1MTYgeTsKKwl1MTYgcGVuX3ByZXNzdXJlOworCXU4IHRpbHRfeDsKKwl1OCB0aWx0X3k7Cit9OworCisvKgorICogUGVyLXRvdWNoc2NyZWVuIGRhdGEuCisgKi8KKworc3RydWN0IHc4MDAxIHsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXY7CisJc3RydWN0IHNlcmlvICpzZXJpbzsKKwlzdHJ1Y3QgbXV0ZXggY21kX211dGV4OworCXN0cnVjdCBjb21wbGV0aW9uIGNtZF9kb25lOworCWludCBpZDsKKwlpbnQgaWR4OworCXVuc2lnbmVkIGNoYXIgZXhwZWN0ZWRfcGFja2V0OworCXVuc2lnbmVkIGNoYXIgZGF0YVtXODAwMV9NQVhfTEVOR1RIXTsKKwl1bnNpZ25lZCBjaGFyIHJlc3BvbnNlW1c4MDAxX1BBQ0tFVF9MRU5dOworCWNoYXIgcGh5c1szMl07Cit9OworCitzdGF0aWMgaW50IHBhcnNlX2RhdGEodTggKmRhdGEsIHN0cnVjdCB3ODAwMV9jb29yZCAqY29vcmQpCit7CisJY29vcmQtPnJkeSA9IGRhdGFbMF0gJiAweDIwOworCWNvb3JkLT50c3cgPSBkYXRhWzBdICYgMHgwMTsKKwljb29yZC0+ZjEgPSBkYXRhWzBdICYgMHgwMjsKKwljb29yZC0+ZjIgPSBkYXRhWzBdICYgMHgwNDsKKworCWNvb3JkLT54ID0gKGRhdGFbMV0gJiAweDdGKSA8PCA5OworCWNvb3JkLT54IHw9IChkYXRhWzJdICYgMHg3RikgPDwgMjsKKwljb29yZC0+eCB8PSAoZGF0YVs2XSAmIDB4NjApID4+IDU7CisKKwljb29yZC0+eSA9IChkYXRhWzNdICYgMHg3RikgPDwgOTsKKwljb29yZC0+eSB8PSAoZGF0YVs0XSAmIDB4N0YpIDw8IDI7CisJY29vcmQtPnkgfD0gKGRhdGFbNl0gJiAweDE4KSA+PiAzOworCisJY29vcmQtPnBlbl9wcmVzc3VyZSA9IGRhdGFbNV0gJiAweDdGOworCWNvb3JkLT5wZW5fcHJlc3N1cmUgfD0gKGRhdGFbNl0gJiAweDA3KSA8PCA3IDsKKworCWNvb3JkLT50aWx0X3ggPSBkYXRhWzddICYgMHg3RjsKKwljb29yZC0+dGlsdF95ID0gZGF0YVs4XSAmIDB4N0Y7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdzgwMDFfcHJvY2Vzc19kYXRhKHN0cnVjdCB3ODAwMSAqdzgwMDEsIHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSB3ODAwMS0+ZGV2OworCXU4IHRtcDsKKwlzdHJ1Y3QgdzgwMDFfY29vcmQgY29vcmQ7CisKKwl3ODAwMS0+ZGF0YVt3ODAwMS0+aWR4XSA9IGRhdGE7CisJc3dpdGNoICh3ODAwMS0+aWR4KyspIHsKKwljYXNlIDA6CisJCWlmICgoZGF0YSAmIFc4MDAxX0xFQURfTUFTSykgIT0gVzgwMDFfTEVBRF9CWVRFKSB7CisJCQlwcl9kZWJ1ZygidzgwMDE6IHVuc3luY2hyb25pemVkIGRhdGE6IDB4JTAyeFxuIiwgZGF0YSk7CisJCQl3ODAwMS0+aWR4ID0gMDsKKwkJfQorCQlicmVhazsKKwljYXNlIDg6CisJCXRtcCA9IHc4MDAxLT5kYXRhWzBdICYgVzgwMDFfVEFCX01BU0s7CisJCWlmICh1bmxpa2VseSh0bXAgPT0gVzgwMDFfVEFCX0JZVEUpKQorCQkJYnJlYWs7CisJCXc4MDAxLT5pZHggPSAwOworCQltZW1zZXQoJmNvb3JkLCAwLCBzaXplb2YoY29vcmQpKTsKKwkJcGFyc2VfZGF0YSh3ODAwMS0+ZGF0YSwgJmNvb3JkKTsKKwkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19YLCBjb29yZC54KTsKKwkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19ZLCBjb29yZC55KTsKKwkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19QUkVTU1VSRSwgY29vcmQucGVuX3ByZXNzdXJlKTsKKwkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT1VDSCwgY29vcmQudHN3KTsKKwkJaW5wdXRfc3luYyhkZXYpOworCQlicmVhazsKKwljYXNlIDEwOgorCQl3ODAwMS0+aWR4ID0gMDsKKwkJbWVtY3B5KHc4MDAxLT5yZXNwb25zZSwgJnc4MDAxLT5kYXRhLCBXODAwMV9QQUNLRVRfTEVOKTsKKwkJdzgwMDEtPmV4cGVjdGVkX3BhY2tldCA9IFc4MDAxX1FVRVJZX1BBQ0tFVDsKKwkJY29tcGxldGUoJnc4MDAxLT5jbWRfZG9uZSk7CisJCWJyZWFrOworCX0KK30KKworCitzdGF0aWMgaXJxcmV0dXJuX3QgdzgwMDFfaW50ZXJydXB0KHN0cnVjdCBzZXJpbyAqc2VyaW8sCisJCXVuc2lnbmVkIGNoYXIgZGF0YSwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXN0cnVjdCB3ODAwMSAqdzgwMDEgPSBzZXJpb19nZXRfZHJ2ZGF0YShzZXJpbyk7CisKKwl3ODAwMV9wcm9jZXNzX2RhdGEodzgwMDEsIGRhdGEpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IHc4MDAxX2FzeW5jX2NvbW1hbmQoc3RydWN0IHc4MDAxICp3ODAwMSwgdW5zaWduZWQgY2hhciAqcGFja2V0LAorCQkJCQlpbnQgbGVuKQoreworCWludCByYyA9IC0xOworCWludCBpOworCisJbXV0ZXhfbG9jaygmdzgwMDEtPmNtZF9tdXRleCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJaWYgKHNlcmlvX3dyaXRlKHc4MDAxLT5zZXJpbywgcGFja2V0W2ldKSkKKwkJCWdvdG8gb3V0OworCX0KKwlyYyA9IDA7CisKK291dDoKKwltdXRleF91bmxvY2soJnc4MDAxLT5jbWRfbXV0ZXgpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB3ODAwMV9jb21tYW5kKHN0cnVjdCB3ODAwMSAqdzgwMDEsIHVuc2lnbmVkIGNoYXIgKnBhY2tldCwgaW50IGxlbikKK3sKKwlpbnQgcmMgPSAtMTsKKwlpbnQgaTsKKworCW11dGV4X2xvY2soJnc4MDAxLT5jbWRfbXV0ZXgpOworCisJc2VyaW9fcGF1c2VfcngodzgwMDEtPnNlcmlvKTsKKwlpbml0X2NvbXBsZXRpb24oJnc4MDAxLT5jbWRfZG9uZSk7CisJc2VyaW9fY29udGludWVfcngodzgwMDEtPnNlcmlvKTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlpZiAoc2VyaW9fd3JpdGUodzgwMDEtPnNlcmlvLCBwYWNrZXRbaV0pKQorCQkJZ290byBvdXQ7CisJfQorCisJd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZ3ODAwMS0+Y21kX2RvbmUsIEhaKTsKKworCWlmICh3ODAwMS0+ZXhwZWN0ZWRfcGFja2V0ID09IFc4MDAxX1FVRVJZX1BBQ0tFVCkgeworCQkvKiBXZSBhcmUgYmFjayBpbiByZXBvcnRpbmcgbW9kZSwgdGhlIHF1ZXJ5IHdhcyBBQ0tlZCAqLworCQltZW1jcHkocGFja2V0LCB3ODAwMS0+cmVzcG9uc2UsIFc4MDAxX1BBQ0tFVF9MRU4pOworCQlyYyA9IDA7CisJfQorCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZ3ODAwMS0+Y21kX211dGV4KTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgdzgwMDFfc2V0dXAoc3RydWN0IHc4MDAxICp3ODAwMSkKK3sKKwlzdHJ1Y3QgdzgwMDFfY29vcmQgY29vcmQ7CisJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gdzgwMDEtPmRldjsKKwl1bnNpZ25lZCBjaGFyIHN0YXJ0WzFdID0geyAnMScgfTsKKwl1bnNpZ25lZCBjaGFyIHF1ZXJ5WzExXSA9IHsgJyonIH07CisKKwlpZiAodzgwMDFfY29tbWFuZCh3ODAwMSwgcXVlcnksIDEpKQorCQlyZXR1cm4gLTE7CisKKwltZW1zZXQoJmNvb3JkLCAwLCBzaXplb2YoY29vcmQpKTsKKwlwYXJzZV9kYXRhKHF1ZXJ5LCAmY29vcmQpOworCisJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2LCBBQlNfWCwgMCwgY29vcmQueCwgMCwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2LCBBQlNfWSwgMCwgY29vcmQueSwgMCwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2LCBBQlNfUFJFU1NVUkUsIDAsIGNvb3JkLnBlbl9wcmVzc3VyZSwgMCwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2LCBBQlNfVElMVF9YLCAwLCBjb29yZC50aWx0X3gsIDAsIDApOworCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldiwgQUJTX1RJTFRfWSwgMCwgY29vcmQudGlsdF95LCAwLCAwKTsKKworCWlmICh3ODAwMV9hc3luY19jb21tYW5kKHc4MDAxLCBzdGFydCwgMSkpCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCisvKgorICogdzgwMDFfZGlzY29ubmVjdCgpIGlzIHRoZSBvcHBvc2l0ZSBvZiB3ODAwMV9jb25uZWN0KCkKKyAqLworCitzdGF0aWMgdm9pZCB3ODAwMV9kaXNjb25uZWN0KHN0cnVjdCBzZXJpbyAqc2VyaW8pCit7CisJc3RydWN0IHc4MDAxICp3ODAwMSA9IHNlcmlvX2dldF9kcnZkYXRhKHNlcmlvKTsKKworCWlucHV0X2dldF9kZXZpY2UodzgwMDEtPmRldik7CisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UodzgwMDEtPmRldik7CisJc2VyaW9fY2xvc2Uoc2VyaW8pOworCXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCBOVUxMKTsKKwlpbnB1dF9wdXRfZGV2aWNlKHc4MDAxLT5kZXYpOworCWtmcmVlKHc4MDAxKTsKK30KKworLyoKKyAqIHc4MDAxX2Nvbm5lY3QoKSBpcyB0aGUgcm91dGluZSB0aGF0IGlzIGNhbGxlZCB3aGVuIHNvbWVvbmUgYWRkcyBhCisgKiBuZXcgc2VyaW8gZGV2aWNlIHRoYXQgc3VwcG9ydHMgdGhlIHc4MDAxIHByb3RvY29sIGFuZCByZWdpc3RlcnMgaXQgYXMKKyAqIGFuIGlucHV0IGRldmljZS4KKyAqLworCitzdGF0aWMgaW50IHc4MDAxX2Nvbm5lY3Qoc3RydWN0IHNlcmlvICpzZXJpbywgc3RydWN0IHNlcmlvX2RyaXZlciAqZHJ2KQoreworCXN0cnVjdCB3ODAwMSAqdzgwMDE7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OworCWludCBlcnI7CisKKwl3ODAwMSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB3ODAwMSksIEdGUF9LRVJORUwpOworCWlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmICghdzgwMDEgfHwgIWlucHV0X2RldikgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGZhaWwxOworCX0KKworCXc4MDAxLT5zZXJpbyA9IHNlcmlvOworCXc4MDAxLT5pZCA9IHNlcmlvLT5pZC5pZDsKKwl3ODAwMS0+ZGV2ID0gaW5wdXRfZGV2OworCW11dGV4X2luaXQoJnc4MDAxLT5jbWRfbXV0ZXgpOworCWluaXRfY29tcGxldGlvbigmdzgwMDEtPmNtZF9kb25lKTsKKwlzbnByaW50Zih3ODAwMS0+cGh5cywgc2l6ZW9mKHc4MDAxLT5waHlzKSwgIiVzL2lucHV0MCIsIHNlcmlvLT5waHlzKTsKKworCWlucHV0X2Rldi0+bmFtZSA9ICJXYWNvbSBXODAwMSBQZW5hYmxlZCBTZXJpYWwgVG91Y2hTY3JlZW4iOworCWlucHV0X2Rldi0+cGh5cyA9IHc4MDAxLT5waHlzOworCWlucHV0X2Rldi0+aWQuYnVzdHlwZSA9IEJVU19SUzIzMjsKKwlpbnB1dF9kZXYtPmlkLnZlbmRvciA9IFNFUklPX1c4MDAxOworCWlucHV0X2Rldi0+aWQucHJvZHVjdCA9IHc4MDAxLT5pZDsKKwlpbnB1dF9kZXYtPmlkLnZlcnNpb24gPSAweDAxMDA7CisJaW5wdXRfZGV2LT5kZXYucGFyZW50ID0gJnNlcmlvLT5kZXY7CisKKwlpbnB1dF9kZXYtPmV2Yml0WzBdID0gQklUX01BU0soRVZfS0VZKSB8IEJJVF9NQVNLKEVWX0FCUyk7CisJaW5wdXRfZGV2LT5rZXliaXRbQklUX1dPUkQoQlROX1RPVUNIKV0gPSBCSVRfTUFTSyhCVE5fVE9VQ0gpOworCisJc2VyaW9fc2V0X2RydmRhdGEoc2VyaW8sIHc4MDAxKTsKKwllcnIgPSBzZXJpb19vcGVuKHNlcmlvLCBkcnYpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbDI7CisKKwlpZiAodzgwMDFfc2V0dXAodzgwMDEpKQorCQlnb3RvIGZhaWwzOworCisJZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKHc4MDAxLT5kZXYpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbDM7CisKKwlyZXR1cm4gMDsKKworZmFpbDM6CisJc2VyaW9fY2xvc2Uoc2VyaW8pOworZmFpbDI6CisJc2VyaW9fc2V0X2RydmRhdGEoc2VyaW8sIE5VTEwpOworZmFpbDE6CisJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKKwlrZnJlZSh3ODAwMSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBzZXJpb19kZXZpY2VfaWQgdzgwMDFfc2VyaW9faWRzW10gPSB7CisJeworCQkudHlwZQk9IFNFUklPX1JTMjMyLAorCQkucHJvdG8JPSBTRVJJT19XODAwMSwKKwkJLmlkCT0gU0VSSU9fQU5ZLAorCQkuZXh0cmEJPSBTRVJJT19BTlksCisJfSwKKwl7IDAgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShzZXJpbywgdzgwMDFfc2VyaW9faWRzKTsKKworc3RhdGljIHN0cnVjdCBzZXJpb19kcml2ZXIgdzgwMDFfZHJ2ID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJ3ODAwMSIsCisJfSwKKwkuZGVzY3JpcHRpb24JPSBEUklWRVJfREVTQywKKwkuaWRfdGFibGUJPSB3ODAwMV9zZXJpb19pZHMsCisJLmludGVycnVwdAk9IHc4MDAxX2ludGVycnVwdCwKKwkuY29ubmVjdAk9IHc4MDAxX2Nvbm5lY3QsCisJLmRpc2Nvbm5lY3QJPSB3ODAwMV9kaXNjb25uZWN0LAorfTsKKworc3RhdGljIGludCBfX2luaXQgdzgwMDFfaW5pdCh2b2lkKQoreworCXJldHVybiBzZXJpb19yZWdpc3Rlcl9kcml2ZXIoJnc4MDAxX2Rydik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB3ODAwMV9leGl0KHZvaWQpCit7CisJc2VyaW9fdW5yZWdpc3Rlcl9kcml2ZXIoJnc4MDAxX2Rydik7Cit9CisKK21vZHVsZV9pbml0KHc4MDAxX2luaXQpOworbW9kdWxlX2V4aXQodzgwMDFfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vY2FwaS9jYXBpZHJ2LmMgYi9kcml2ZXJzL2lzZG4vY2FwaS9jYXBpZHJ2LmMKaW5kZXggZDViNGNjMy4uNjUwMTIwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2NhcGkvY2FwaWRydi5jCisrKyBiL2RyaXZlcnMvaXNkbi9jYXBpL2NhcGlkcnYuYwpAQCAtMTUxOSw3ICsxNTE5LDcgQEAKIAkJaW50IGRpZ2l0MiA9IDA7CiAJCWlmICghaXNkaWdpdCgqcykpIHJldHVybiAtMzsKIAkJd2hpbGUgKGlzZGlnaXQoKnMpKSB7IGRpZ2l0MSA9IGRpZ2l0MSoxMCArICgqcyAtICcwJyk7IHMrKzsgfQotCQlpZiAoZGlnaXQxIDw9IDAgJiYgZGlnaXQxID4gMzApIHJldHVybiAtNDsKKwkJaWYgKGRpZ2l0MSA8PSAwIHx8IGRpZ2l0MSA+IDMwKSByZXR1cm4gLTQ7CiAJCWlmICgqcyA9PSAwIHx8ICpzID09ICcsJyB8fCAqcyA9PSAnICcpIHsKIAkJCWJtYXNrIHw9ICgxIDw8IGRpZ2l0MSk7CiAJCQlkaWdpdDEgPSAwOwpAQCAtMTUzMCw3ICsxNTMwLDcgQEAKIAkJcysrOwogCQlpZiAoIWlzZGlnaXQoKnMpKSByZXR1cm4gLTM7CiAJCXdoaWxlIChpc2RpZ2l0KCpzKSkgeyBkaWdpdDIgPSBkaWdpdDIqMTAgKyAoKnMgLSAnMCcpOyBzKys7IH0KLQkJaWYgKGRpZ2l0MiA8PSAwICYmIGRpZ2l0MiA+IDMwKSByZXR1cm4gLTQ7CisJCWlmIChkaWdpdDIgPD0gMCB8fCBkaWdpdDIgPiAzMCkgcmV0dXJuIC00OwogCQlpZiAoKnMgPT0gMCB8fCAqcyA9PSAnLCcgfHwgKnMgPT0gJyAnKSB7CiAJCQlpZiAoZGlnaXQxID4gZGlnaXQyKQogCQkJCWZvciAoaSA9IGRpZ2l0MjsgaSA8PSBkaWdpdDEgOyBpKyspCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vY2FwaS9jYXBpZnMuYyBiL2RyaXZlcnMvaXNkbi9jYXBpL2NhcGlmcy5jCmluZGV4IDBhYTY2ZWMuLmIxMjk0MDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9jYXBpL2NhcGlmcy5jCisrKyBiL2RyaXZlcnMvaXNkbi9jYXBpL2NhcGlmcy5jCkBAIC0xMTEsOCArMTExLDYgQEAKIAkJZ290byBmYWlsOwogCWlub2RlLT5pX2lubyA9IDE7CiAJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwotCWlub2RlLT5pX2Jsb2NrcyA9IDA7Ci0JaW5vZGUtPmlfdWlkID0gaW5vZGUtPmlfZ2lkID0gMDsKIAlpbm9kZS0+aV9tb2RlID0gU19JRkRJUiB8IFNfSVJVR08gfCBTX0lYVUdPIHwgU19JV1VTUjsKIAlpbm9kZS0+aV9vcCA9ICZzaW1wbGVfZGlyX2lub2RlX29wZXJhdGlvbnM7CiAJaW5vZGUtPmlfZm9wID0gJnNpbXBsZV9kaXJfb3BlcmF0aW9uczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9kZWJ1Z2xpYi5oIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL2RlYnVnbGliLmgKaW5kZXggMDE2NDEwYy4uOGVhNTg3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL2RlYnVnbGliLmgKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL2RlYnVnbGliLmgKQEAgLTIzNSw3ICsyMzUsNyBAQAogdHlwZWRlZiB2b2lkICggKiBEYmdFdikgICh1bnNpZ25lZCBzaG9ydCwgdW5zaWduZWQgbG9uZywgdmFfbGlzdCkgOwogdHlwZWRlZiB2b2lkICggKiBEYmdJcnEpICh1bnNpZ25lZCBzaG9ydCwgaW50LCBjaGFyICosIHZhX2xpc3QpIDsKIHR5cGVkZWYgc3RydWN0IF9EYmdIYW5kbGVfCi17IGNoYXIgICAgUmVnaXN0ZXJlZCA7IC8qIGRyaXZlciBzdWNjZXNzZnVsbCByZWdpc3RlcmVkICovCit7IGNoYXIgICAgUmVnaXN0ZXJlZCA7IC8qIGRyaXZlciBzdWNjZXNzZnVsbHkgcmVnaXN0ZXJlZCAqLwogI2RlZmluZSBEQkdfSEFORExFX1JFR19ORVcgMHgwMSAgLyogdGhpcyAobmV3KSBzdHJ1Y3R1cmUgICAgKi8KICNkZWZpbmUgREJHX0hBTkRMRV9SRUdfT0xEIDB4N2YgIC8qIG9sZCBzdHJ1Y3R1cmUgKHNlZSBiZWxvdykgICovCiAgY2hhciAgICBWZXJzaW9uOyAgLyogdmVyc2lvbiBvZiB0aGlzIHN0cnVjdHVyZSAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9vc180YnJpLmMgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vb3NfNGJyaS5jCmluZGV4IDdiNGVjM2YuLmM5NjRiOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9vc180YnJpLmMKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL29zXzRicmkuYwpAQCAtOTk3LDcgKzk5Nyw3IEBACiAJZGl2YV94ZGlfZGlzcGxheV9hZGFwdGVyX2ZlYXR1cmVzKElvQWRhcHRlci0+QU51bSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgSW9BZGFwdGVyLT50YXNrczsgaSsrKSB7Ci0JCURCR19MT0coKCJBKCVkKSAlcyBhZGFwdGVyIHN1Y2Nlc3NmdWxsIHN0YXJ0ZWQiLAorCQlEQkdfTE9HKCgiQSglZCkgJXMgYWRhcHRlciBzdWNjZXNzZnVsbHkgc3RhcnRlZCIsCiAJCQkgSW9BZGFwdGVyLT5RdWFkcm9MaXN0LT5RdWFkcm9BZGFwdGVyW2ldLT5BTnVtLAogCQkJIChJb0FkYXB0ZXItPnRhc2tzID09IDEpID8gIkJSSSAyLjAiIDogIjRCUkkiKSkKIAkJZGl2YV94ZGlfZGlkZF9yZWdpc3Rlcl9hZGFwdGVyKElvQWRhcHRlci0+UXVhZHJvTGlzdC0+UXVhZHJvQWRhcHRlcltpXS0+QU51bSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vb3NfYnJpLmMgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vb3NfYnJpLmMKaW5kZXggZjMxYmJhNS4uMDhmMDE5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL29zX2JyaS5jCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9vc19icmkuYwpAQCAtNzM2LDcgKzczNiw3IEBACiAKIAlJb0FkYXB0ZXItPlByb3BlcnRpZXMuRmVhdHVyZXMgPSAod29yZCkgZmVhdHVyZXM7CiAJZGl2YV94ZGlfZGlzcGxheV9hZGFwdGVyX2ZlYXR1cmVzKElvQWRhcHRlci0+QU51bSk7Ci0JREJHX0xPRygoIkEoJWQpIEJSSSBhZGFwdGVyIHN1Y2Nlc3NmdWxsIHN0YXJ0ZWQiLCBJb0FkYXB0ZXItPkFOdW0pKQorCURCR19MT0coKCJBKCVkKSBCUkkgYWRhcHRlciBzdWNjZXNzZnVsbHkgc3RhcnRlZCIsIElvQWRhcHRlci0+QU51bSkpCiAJICAgIC8qCiAJICAgICAgIFJlZ2lzdGVyIHdpdGggRElERAogCSAgICAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9vc19wcmkuYyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9vc19wcmkuYwppbmRleCA5MDMzNTY1Li41ZDY1NDA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vb3NfcHJpLmMKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL29zX3ByaS5jCkBAIC01MTMsNyArNTEzLDcgQEAKIAogCWRpdmFfeGRpX2Rpc3BsYXlfYWRhcHRlcl9mZWF0dXJlcyhJb0FkYXB0ZXItPkFOdW0pOwogCi0JREJHX0xPRygoIkEoJWQpIFBSSSBhZGFwdGVyIHN1Y2Nlc3NmdWxsIHN0YXJ0ZWQiLCBJb0FkYXB0ZXItPkFOdW0pKQorCURCR19MT0coKCJBKCVkKSBQUkkgYWRhcHRlciBzdWNjZXNzZnVsbHkgc3RhcnRlZCIsIElvQWRhcHRlci0+QU51bSkpCiAJLyoKIAkgICBSZWdpc3RlciB3aXRoIERJREQKIAkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9uZXQuYyBiL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9uZXQuYwppbmRleCA3ZWU1YmQ5Li41Nzk5NzRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5fbmV0LmMKKysrIGIvZHJpdmVycy9pc2RuL2h5c2RuL2h5c2RuX25ldC5jCkBAIC0zOCwxNiArMzgsMTIgQEAKIC8qIGluc2lkZSB0aGUgZGVmaW5pdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdHJ1Y3QgbmV0X2xvY2FsIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSBuZXRkZXY7CS8qIHRoZSBuZXR3b3JrIGRldmljZSAqLwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwotCS8qIGFkZGl0aW9uYWwgdmFycyBtYXkgYmUgYWRkZWQgaGVyZSAqLwotCWNoYXIgZGV2X25hbWVbOV07CS8qIG91ciBvd24gZGV2aWNlIG5hbWUgKi8KLQogCS8qIFR4IGNvbnRyb2wgbG9jay4gIFRoaXMgcHJvdGVjdHMgdGhlIHRyYW5zbWl0IGJ1ZmZlciByaW5nCiAJICogc3RhdGUgYWxvbmcgd2l0aCB0aGUgInR4IGZ1bGwiIHN0YXRlIG9mIHRoZSBkcml2ZXIuICBUaGlzCiAJICogbWVhbnMgYWxsIG5ldGlmX3F1ZXVlIGZsb3cgY29udHJvbCBhY3Rpb25zIGFyZSBwcm90ZWN0ZWQKIAkgKiBieSB0aGlzIGxvY2sgYXMgd2VsbC4KIAkgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCXNwaW5sb2NrX3QgbG9jazsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tic1tNQVhfU0tCX0JVRkZFUlNdOwkvKiBwb2ludGVycyB0byB0eC1za2JzICovCiAJaW50IGluX2lkeCwgb3V0X2lkeDsJLyogaW5kZXhlcyB0byBidWZmZXIgcmluZyAqLwpAQCAtNTUsMTUgKzUxLDYgQEAKIH07CQkJCS8qIG5ldF9sb2NhbCAqLwogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdldCB0aGUgY3VycmVudCBzdGF0aXN0aWNzIGZvciB0aGlzIGNhcmQuICAgICAgICAgKi8KLS8qIFRoaXMgbWF5IGJlIGNhbGxlZCB3aXRoIHRoZSBjYXJkIG9wZW4gb3IgY2xvc2VkICEgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqCi1uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuICgmKChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldiktPnN0YXRzKTsKLX0JCQkJLyogbmV0X2RldmljZV9zdGF0cyAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogT3Blbi9pbml0aWFsaXplIHRoZSBib2FyZC4gVGhpcyBpcyBjYWxsZWQgKGluIHRoZSBjdXJyZW50IGtlcm5lbCkgKi8KQEAgLTE4Miw4ICsxNjksOCBAQAogCWlmICghbHAtPnNrX2NvdW50KQogCQlyZXR1cm47CQkvKiBlcnJvciBjb25kaXRpb24gKi8KIAotCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7Ci0JbHAtPnN0YXRzLnR4X2J5dGVzICs9IGxwLT5za2JzW2xwLT5vdXRfaWR4XS0+bGVuOworCWxwLT5kZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwlscC0+ZGV2LT5zdGF0cy50eF9ieXRlcyArPSBscC0+c2tic1tscC0+b3V0X2lkeF0tPmxlbjsKIAogCWRldl9rZnJlZV9za2IobHAtPnNrYnNbbHAtPm91dF9pZHgrK10pOwkJLyogZnJlZSBza2IgKi8KIAlpZiAobHAtPm91dF9pZHggPj0gTUFYX1NLQl9CVUZGRVJTKQpAQCAtMjAwLDI5ICsxODcsMzAgQEAKIGh5c2RuX3J4X25ldHBrdChoeXNkbl9jYXJkICogY2FyZCwgdW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBzaG9ydCBsZW4pCiB7CiAJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBjYXJkLT5uZXRpZjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbHAtPmRldjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCiAJaWYgKCFscCkKIAkJcmV0dXJuOwkJLyogbm9uIGV4aXN0aW5nIGRldmljZSAqLwogCi0JbHAtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKwlkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKIAogCXNrYiA9IGRldl9hbGxvY19za2IobGVuKTsKIAlpZiAoc2tiID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogTWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldC5cbiIsCi0JCSAgICAgICBscC0+bmV0ZGV2Lm5hbWUpOwotCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCXJldHVybjsKIAl9CiAJLyogY29weSB0aGUgZGF0YSAqLwogCW1lbWNweShza2JfcHV0KHNrYiwgbGVuKSwgYnVmLCBsZW4pOwogCiAJLyogZGV0ZXJtaW5lIHRoZSB1c2VkIHByb3RvY29sICovCi0Jc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgJmxwLT5uZXRkZXYpOworCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisKKwlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsJLyogYWRqdXN0IHBhY2tldCBjb3VudCAqLwogCiAJbmV0aWZfcngoc2tiKTsKLQlscC0+c3RhdHMucnhfcGFja2V0cysrOwkvKiBhZGp1c3QgcGFja2V0IGNvdW50ICovCi0KIH0JCQkJLyogaHlzZG5fcnhfbmV0cGt0ICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTI0MiwyNCArMjMwLDE1IEBACiAJcmV0dXJuIChscC0+c2tic1tscC0+b3V0X2lkeF0pOwkJLyogbmV4dCBwYWNrZXQgdG8gc2VuZCAqLwogfQkJCQkvKiBoeXNkbl90eF9uZXRnZXQgKi8KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBoeXNkbl9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbiAJCT0gbmV0X29wZW4sCisJLm5kb19zdG9wCQk9IG5ldF9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJCT0gbmV0X3NlbmRfcGFja2V0LAorCS5uZG9fY2hhbmdlX210dQkJPSBldGhfY2hhbmdlX210dSwKKwkubmRvX3NldF9tYWNfYWRkcmVzcyAJPSBldGhfbWFjX2FkZHIsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCit9OwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIGluaXQgZnVuY3Rpb24gY2FsbGVkIGJ5IHJlZ2lzdGVyIGRldmljZSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50Ci1uZXRfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCS8qIHNldHVwIHRoZSBmdW5jdGlvbiB0YWJsZSAqLwotCWRldi0+b3BlbiA9IG5ldF9vcGVuOwotCWRldi0+c3RvcCA9IG5ldF9jbG9zZTsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IG5ldF9zZW5kX3BhY2tldDsKLQlkZXYtPmdldF9zdGF0cyA9IG5ldF9nZXRfc3RhdHM7Ci0KLQkvKiBGaWxsIGluIHRoZSBmaWVsZHMgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUgd2l0aCBldGhlcm5ldCB2YWx1ZXMuICovCi0JZXRoZXJfc2V0dXAoZGV2KTsKLQotCXJldHVybiAoMCk7CQkvKiBzdWNjZXNzICovCi19CQkJCS8qIG5ldF9pbml0ICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIGh5c2RuX25ldF9jcmVhdGUgY3JlYXRlcyBhIG5ldyBuZXQgZGV2aWNlIGZvciB0aGUgZ2l2ZW4gY2FyZC4gSWYgYSBkZXZpY2UgKi8KQEAgLTI3MSwyOCArMjUwLDM0IEBACiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlpbnQgaTsKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscDsKKwogCWlmKCFjYXJkKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5vIGNhcmQtcHQgaW4gaHlzZG5fbmV0X2NyZWF0ZSFcbiIpOwogCQlyZXR1cm4gKC1FTk9NRU0pOwogCX0KIAloeXNkbl9uZXRfcmVsZWFzZShjYXJkKTsJLyogcmVsZWFzZSBhbiBleGlzdGluZyBuZXQgZGV2aWNlICovCi0JaWYgKChkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbmV0X2xvY2FsKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgbmV0X2xvY2FsKSk7CisJaWYgKCFkZXYpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiSFlTRE46IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1cbiIpOwogCQlyZXR1cm4gKC1FTk9NRU0pOwogCX0KIAorCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlscC0+ZGV2ID0gZGV2OworCisJZGV2LT5uZXRkZXZfb3BzID0gJmh5c2RuX25ldGRldl9vcHM7CiAJc3Bpbl9sb2NrX2luaXQoJigoc3RydWN0IG5ldF9sb2NhbCAqKSBkZXYpLT5sb2NrKTsKIAogCS8qIGluaXRpYWxpc2UgbmVjZXNzYXJ5IG9yIGluZm9ybWluZyBmaWVsZHMgKi8KIAlkZXYtPmJhc2VfYWRkciA9IGNhcmQtPmlvYmFzZTsJLyogSU8gYWRkcmVzcyAqLwogCWRldi0+aXJxID0gY2FyZC0+aXJxOwkvKiBpcnEgKi8KLQlkZXYtPmluaXQgPSBuZXRfaW5pdDsJLyogdGhlIGluaXQgZnVuY3Rpb24gb2YgdGhlIGRldmljZSAqLwotCWlmKGRldi0+bmFtZSkgewotCQlzdHJjcHkoZGV2LT5uYW1lLCAoKHN0cnVjdCBuZXRfbG9jYWwgKikgZGV2KS0+ZGV2X25hbWUpOwotCX0gCisKKwlkZXYtPm5ldGRldl9vcHMgPSAmaHlzZG5fbmV0ZGV2X29wczsKIAlpZiAoKGkgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KSkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiSFlTRE46IHVuYWJsZSB0byBjcmVhdGUgbmV0d29yayBkZXZpY2VcbiIpOwotCQlrZnJlZShkZXYpOworCQlmcmVlX25ldGRldihkZXYpOwogCQlyZXR1cm4gKGkpOwogCX0KIAlkZXYtPm1sX3ByaXYgPSBjYXJkOwkvKiByZW1lbWJlciBwb2ludGVyIHRvIG93biBkYXRhIHN0cnVjdHVyZSAqLwpAQCAtMzE2LDcgKzMwMSw3IEBACiAJCXJldHVybiAoMCk7CS8qIG5vbiBleGlzdGluZyAqLwogCiAJY2FyZC0+bmV0aWYgPSBOVUxMOwkvKiBjbGVhciBvdXQgcG9pbnRlciAqLwotCWRldi0+c3RvcChkZXYpOwkJLyogY2xvc2UgdGhlIGRldmljZSAqLworCW5ldF9jbG9zZShkZXYpOwogCiAJZmx1c2hfdHhfYnVmZmVycygoc3RydWN0IG5ldF9sb2NhbCAqKSBkZXYpOwkvKiBlbXB0eSBidWZmZXJzICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9uZXQuYyBiL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9uZXQuYwppbmRleCAwMjNlYTExLi43YzVmOTcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fbmV0LmMKKysrIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX25ldC5jCkBAIC0xNDg1LDYgKzE0ODUsMjQgQEAKIAlyZXR1cm4gKHJjKTsKIH0KIAorCitzdGF0aWMgaW50IGlzZG5fbmV0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCWlzZG5fbmV0X2xvY2FsICpscCA9IChpc2RuX25ldF9sb2NhbCAqKSBuZXRkZXZfcHJpdihkZXYpOworCisJc3dpdGNoIChscC0+cF9lbmNhcCkgeworI2lmZGVmIENPTkZJR19JU0ROX1BQUAorCWNhc2UgSVNETl9ORVRfRU5DQVBfU1lOQ1BQUDoKKwkJcmV0dXJuIGlzZG5fcHBwX2Rldl9pb2N0bChkZXYsIGlmciwgY21kKTsKKyNlbmRpZgorCWNhc2UgSVNETl9ORVRfRU5DQVBfQ0lTQ09IRExDSzoKKwkJcmV0dXJuIGlzZG5fY2lzY29oZGxja19kZXZfaW9jdGwoZGV2LCBpZnIsIGNtZCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCiAvKiBjYWxsZWQgdmlhIGNpc2NvX3RpbWVyLmZ1bmN0aW9uICovCiBzdGF0aWMgdm9pZAogaXNkbl9uZXRfY2lzY29oZGxja19zbGFycF9zZW5kX2tlZXBhbGl2ZSh1bnNpZ25lZCBsb25nIGRhdGEpCkBAIC0xOTk4LDIzICsyMDE2LDYgQEAKIAl1c2hvcnQgbWF4X2hsaGRyX2xlbiA9IDA7CiAJaW50IGRydmlkeDsKIAotCWV0aGVyX3NldHVwKG5kZXYpOwotCW5kZXYtPmhlYWRlcl9vcHMgPSBOVUxMOwotCi0JLyogU2V0dXAgdGhlIGdlbmVyaWMgcHJvcGVydGllcyAqLwotCW5kZXYtPm10dSA9IDE1MDA7Ci0JbmRldi0+ZmxhZ3MgPSBJRkZfTk9BUlB8SUZGX1BPSU5UT1BPSU5UOwotCW5kZXYtPnR5cGUgPSBBUlBIUkRfRVRIRVI7Ci0JbmRldi0+YWRkcl9sZW4gPSBFVEhfQUxFTjsKLQluZGV2LT52YWxpZGF0ZV9hZGRyID0gTlVMTDsKLQotCS8qIGZvciBjbGllbnRzIHdpdGggTVBQUCBtYXliZSBoaWdoZXIgdmFsdWVzIGJldHRlciAqLwotCW5kZXYtPnR4X3F1ZXVlX2xlbiA9IDMwOwotCi0JLyogVGhlIElTRE4tc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KLQluZGV2LT5vcGVuID0gJmlzZG5fbmV0X29wZW47Ci0JbmRldi0+aGFyZF9zdGFydF94bWl0ID0gJmlzZG5fbmV0X3N0YXJ0X3htaXQ7Ci0KIAkvKgogCSAqICB1cCB0aWxsIGJpbmRpbmcgd2UgYXNrIHRoZSBwcm90b2NvbCBsYXllciB0byByZXNlcnZlIGFzIG11Y2gKIAkgKiAgYXMgd2UgbWlnaHQgbmVlZCBmb3IgSEwgbGF5ZXIKQEAgLTIwMjYsOSArMjAyNyw2IEBACiAJCQkJbWF4X2hsaGRyX2xlbiA9IGRldi0+ZHJ2W2RydmlkeF0tPmludGVyZmFjZS0+aGxfaGRybGVuOwogCiAJbmRldi0+aGFyZF9oZWFkZXJfbGVuID0gRVRIX0hMRU4gKyBtYXhfaGxoZHJfbGVuOwotCW5kZXYtPnN0b3AgPSAmaXNkbl9uZXRfY2xvc2U7Ci0JbmRldi0+Z2V0X3N0YXRzID0gJmlzZG5fbmV0X2dldF9zdGF0czsKLQluZGV2LT5kb19pb2N0bCA9IE5VTEw7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI1MDgsNiArMjUwNiwxOSBAQAogCXJldHVybiAoaXNkbl9uZXRfZm9yY2VfZGlhbF9scChwLT5sb2NhbCkpOwogfQogCisvKiBUaGUgSVNETi1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBpc2RuX25ldGRldl9vcHMgPSB7CisJLm5kb19pbml0CSAgICAgID0gaXNkbl9uZXRfaW5pdCwKKwkubmRvX29wZW4JICAgICAgPSBpc2RuX25ldF9vcGVuLAorCS5uZG9fc3RvcAkgICAgICA9IGlzZG5fbmV0X2Nsb3NlLAorCS5uZG9fZG9faW9jdGwJICAgICAgPSBpc2RuX25ldF9pb2N0bCwKKworCS5uZG9fdmFsaWRhdGVfYWRkciAgICA9IE5VTEwsCisJLm5kb19zdGFydF94bWl0CSAgICAgID0gaXNkbl9uZXRfc3RhcnRfeG1pdCwKKwkubmRvX2dldF9zdGF0cwkgICAgICA9IGlzZG5fbmV0X2dldF9zdGF0cywKKwkubmRvX3R4X3RpbWVvdXQJICAgICAgPSBpc2RuX25ldF90eF90aW1lb3V0LAorfTsKKwogLyoKICAqIEhlbHBlciBmb3IgYWxsb2NfbmV0ZGV2KCkKICAqLwpAQCAtMjUxNSw3ICsyNTI2LDIwIEBACiB7CiAJaXNkbl9uZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAorCWV0aGVyX3NldHVwKGRldik7CisKIAlkZXYtPmZsYWdzID0gSUZGX05PQVJQIHwgSUZGX1BPSU5UT1BPSU5UOworCS8qIFNldHVwIHRoZSBnZW5lcmljIHByb3BlcnRpZXMgKi8KKwlkZXYtPm10dSA9IDE1MDA7CisJZGV2LT5mbGFncyA9IElGRl9OT0FSUHxJRkZfUE9JTlRPUE9JTlQ7CisJZGV2LT50eXBlID0gQVJQSFJEX0VUSEVSOworCWRldi0+YWRkcl9sZW4gPSBFVEhfQUxFTjsKKwlkZXYtPmhlYWRlcl9vcHMgPSBOVUxMOworCWRldi0+bmV0ZGV2X29wcyA9ICZpc2RuX25ldGRldl9vcHM7CisKKwkvKiBmb3IgY2xpZW50cyB3aXRoIE1QUFAgbWF5YmUgaGlnaGVyIHZhbHVlcyBiZXR0ZXIgKi8KKwlkZXYtPnR4X3F1ZXVlX2xlbiA9IDMwOworCiAJbHAtPnBfZW5jYXAgPSBJU0ROX05FVF9FTkNBUF9SQVdJUDsKIAlscC0+bWFnaWMgPSBJU0ROX05FVF9NQUdJQzsKIAlscC0+bGFzdCA9IGxwOwpAQCAtMjU3MCw3ICsyNTk0LDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCW5ldGRldi0+bG9jYWwgPSBuZXRkZXZfcHJpdihuZXRkZXYtPmRldik7Ci0JbmV0ZGV2LT5kZXYtPmluaXQgPSBpc2RuX25ldF9pbml0OworCiAJaWYgKG1hc3RlcikgewogCQkvKiBEZXZpY2Ugc2hhbGwgYmUgYSBzbGF2ZSAqLwogCQlzdHJ1Y3QgbmV0X2RldmljZSAqcCA9IE1BU1RFUl9UT19TTEFWRShtYXN0ZXIpOwpAQCAtMjU4OCw3ICsyNjEyLDYgQEAKIAkJLyoKIAkJICogV2F0Y2hkb2cgdGltZXIgKGN1cnJlbnRseSkgZm9yIG1hc3RlciBvbmx5LgogCQkgKi8KLQkJbmV0ZGV2LT5kZXYtPnR4X3RpbWVvdXQgPSBpc2RuX25ldF90eF90aW1lb3V0OwogCQluZXRkZXYtPmRldi0+d2F0Y2hkb2dfdGltZW8gPSBJU0ROX05FVF9UWF9USU1FT1VUOwogCQlpZiAocmVnaXN0ZXJfbmV0ZGV2KG5ldGRldi0+ZGV2KSAhPSAwKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJpc2RuX25ldDogQ291bGQgbm90IHJlZ2lzdGVyIG5ldC1kZXZpY2VcbiIpOwpAQCAtMjcwNCw3ICsyNzI3LDYgQEAKICNlbHNlCiAJCQlwLT5kZXYtPnR5cGUgPSBBUlBIUkRfUFBQOwkvKiBjaGFuZ2UgQVJQIHR5cGUgKi8KIAkJCXAtPmRldi0+YWRkcl9sZW4gPSAwOwotCQkJcC0+ZGV2LT5kb19pb2N0bCA9IGlzZG5fcHBwX2Rldl9pb2N0bDsKICNlbmRpZgogCQkJYnJlYWs7CiAJCWNhc2UgSVNETl9ORVRfRU5DQVBfWDI1SUZBQ0U6CkBAIC0yNzE4LDcgKzI3NDAsNiBAQAogI2VuZGlmCiAJCQlicmVhazsKIAkJY2FzZSBJU0ROX05FVF9FTkNBUF9DSVNDT0hETENLOgotCQkJcC0+ZGV2LT5kb19pb2N0bCA9IGlzZG5fY2lzY29oZGxja19kZXZfaW9jdGw7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWlmKCBjZmctPnBfZW5jYXAgPj0gMCAmJgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL21JU0ROL2RzcF9waXBlbGluZS5jIGIvZHJpdmVycy9pc2RuL21JU0ROL2RzcF9waXBlbGluZS5jCmluZGV4IDVlZTY2NTEuLjgzNjM5YmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9tSVNETi9kc3BfcGlwZWxpbmUuYworKysgYi9kcml2ZXJzL2lzZG4vbUlTRE4vZHNwX3BpcGVsaW5lLmMKQEAgLTkxLDcgKzkxLDcgQEAKIAogCWVudHJ5LT5kZXYuY2xhc3MgPSBlbGVtZW50c19jbGFzczsKIAlkZXZfc2V0X2RydmRhdGEoJmVudHJ5LT5kZXYsIGVsZW0pOwotCXNucHJpbnRmKGVudHJ5LT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgZWxlbS0+bmFtZSk7CisJZGV2X3NldF9uYW1lKCZlbnRyeS0+ZGV2LCBlbGVtLT5uYW1lKTsKIAlyZXQgPSBkZXZpY2VfcmVnaXN0ZXIoJmVudHJ5LT5kZXYpOwogCWlmIChyZXQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIHJlZ2lzdGVyICVzXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZ3Vlc3QvbGd1ZXN0X2RldmljZS5jIGIvZHJpdmVycy9sZ3Vlc3QvbGd1ZXN0X2RldmljZS5jCmluZGV4IDkxNWRhNmIuLmI0ZDQ0ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGd1ZXN0L2xndWVzdF9kZXZpY2UuYworKysgYi9kcml2ZXJzL2xndWVzdC9sZ3Vlc3RfZGV2aWNlLmMKQEAgLTMyMSwxMCArMzIxLDcgQEAKIAogLyogVGhlIHJvb3QgZGV2aWNlIGZvciB0aGUgbGd1ZXN0IHZpcnRpbyBkZXZpY2VzLiAgVGhpcyBtYWtlcyB0aGVtIGFwcGVhciBhcwogICogL3N5cy9kZXZpY2VzL2xndWVzdC8wLDEsMiBub3QgL3N5cy9kZXZpY2VzLzAsMSwyLiAqLwotc3RhdGljIHN0cnVjdCBkZXZpY2UgbGd1ZXN0X3Jvb3QgPSB7Ci0JLnBhcmVudCA9IE5VTEwsCi0JLmJ1c19pZCA9ICJsZ3Vlc3QiLAotfTsKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlICpsZ3Vlc3Rfcm9vdDsKIAogLypEOjEyMCBUaGlzIGlzIHRoZSBjb3JlIG9mIHRoZSBsZ3Vlc3QgYnVzOiBhY3R1YWxseSBhZGRpbmcgYSBuZXcgZGV2aWNlLgogICogSXQncyBhIHNlcGFyYXRlIGZ1bmN0aW9uIGJlY2F1c2UgaXQncyBuZWF0ZXIgdGhhdCB3YXksIGFuZCBiZWNhdXNlIGFuCkBAIC0zNTEsNyArMzQ4LDcgQEAKIAl9CiAKIAkvKiBUaGlzIGRldmljZXMnIHBhcmVudCBpcyB0aGUgbGd1ZXN0LyBkaXIuICovCi0JbGRldi0+dmRldi5kZXYucGFyZW50ID0gJmxndWVzdF9yb290OworCWxkZXYtPnZkZXYuZGV2LnBhcmVudCA9IGxndWVzdF9yb290OwogCS8qIFdlIGhhdmUgYSB1bmlxdWUgZGV2aWNlIGluZGV4IHRoYW5rcyB0byB0aGUgZGV2X2luZGV4IGNvdW50ZXIuICovCiAJbGRldi0+dmRldi5pZC5kZXZpY2UgPSBkLT50eXBlOwogCS8qIFdlIGhhdmUgYSBzaW1wbGUgc2V0IG9mIHJvdXRpbmVzIGZvciBxdWVyeWluZyB0aGUgZGV2aWNlJ3MKQEAgLTQwNyw3ICs0MDQsOCBAQAogCWlmIChzdHJjbXAocHZfaW5mby5uYW1lLCAibGd1ZXN0IikgIT0gMCkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoZGV2aWNlX3JlZ2lzdGVyKCZsZ3Vlc3Rfcm9vdCkgIT0gMCkKKwlsZ3Vlc3Rfcm9vdCA9IHJvb3RfZGV2aWNlX3JlZ2lzdGVyKCJsZ3Vlc3QiKTsKKwlpZiAoSVNfRVJSKGxndWVzdF9yb290KSkKIAkJcGFuaWMoIkNvdWxkIG5vdCByZWdpc3RlciBsZ3Vlc3Qgcm9vdCIpOwogCiAJLyogRGV2aWNlcyBhcmUgaW4gYSBzaW5nbGUgcGFnZSBhYm92ZSB0b3Agb2YgIm5vcm1hbCIgbWVtICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC9LY29uZmlnIGIvZHJpdmVycy9tYWNpbnRvc2gvS2NvbmZpZwppbmRleCBiNTI2NTk2Li4xNzNjZjU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL0tjb25maWcKQEAgLTEzOCw3ICsxMzgsNyBAQAogCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgTWFjaW50b3NoIHNwZWNpZmljIGV4dGVuc2lvbnMgb2YgdGhlIGdlbmVyaWMKIAkgIGJhY2tsaWdodCBjb2RlLiBXaXRoIHRoaXMgZW5hYmxlZCwgdGhlIGJyaWdodG5lc3Mga2V5cyBvbiBvbGRlcgogCSAgUG93ZXJCb29rcyB3aWxsIGJlIGVuYWJsZWQgc28geW91IGNhbiBjaGFuZ2UgdGhlIHNjcmVlbiBicmlnaHRuZXNzLgotCSAgTmV3ZXIgbW9kZWxzIHNob3VsZCB1c2UgYW4gdXNlcnNwYWNlIGRhZW1vbiBsaWtlIHBiYnV0dG9uc2QuCisJICBOZXdlciBtb2RlbHMgc2hvdWxkIHVzZSBhIHVzZXJzcGFjZSBkYWVtb24gbGlrZSBwYmJ1dHRvbnNkLgogCiBjb25maWcgUE1BQ19CQUNLTElHSFRfTEVHQUNZCiAJYm9vbCAiUHJvdmlkZSBsZWdhY3kgaW9jdGwncyBvbiAvZGV2L3BtdSBmb3IgdGhlIGJhY2tsaWdodCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL21hY2lvX2FzaWMuYyBiL2RyaXZlcnMvbWFjaW50b3NoL21hY2lvX2FzaWMuYwppbmRleCBlYzllNWYzLi42ZTE0OWY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC9tYWNpb19hc2ljLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvbWFjaW9fYXNpYy5jCkBAIC0zMyw3ICszMyw3IEBACiAKICN1bmRlZiBERUJVRwogCi0jZGVmaW5lIE1BWF9OT0RFX05BTUVfU0laRSAoQlVTX0lEX1NJWkUgLSAxMikKKyNkZWZpbmUgTUFYX05PREVfTkFNRV9TSVpFICgyMCAtIDEyKQogCiBzdGF0aWMgc3RydWN0IG1hY2lvX2NoaXAgICAgICAqbWFjaW9fb25faG9sZDsKIApAQCAtMjQwLDcgKzI0MCw3IEBACiAJaWYgKGlycSAhPSBOT19JUlEpIHsKIAkJZGV2LT5pbnRlcnJ1cHRbaW5kZXhdLnN0YXJ0ID0gaXJxOwogCQlkZXYtPmludGVycnVwdFtpbmRleF0uZmxhZ3MgPSBJT1JFU09VUkNFX0lSUTsKLQkJZGV2LT5pbnRlcnJ1cHRbaW5kZXhdLm5hbWUgPSBkZXYtPm9mZGV2LmRldi5idXNfaWQ7CisJCWRldi0+aW50ZXJydXB0W2luZGV4XS5uYW1lID0gZGV2X25hbWUoJmRldi0+b2ZkZXYuZGV2KTsKIAl9CiAJaWYgKGRldi0+bl9pbnRlcnJ1cHRzIDw9IGluZGV4KQogCQlkZXYtPm5faW50ZXJydXB0cyA9IGluZGV4ICsgMTsKQEAgLTMwMyw3ICszMDMsNyBAQAogCQkJYnJlYWs7CiAJCXJlcy0+c3RhcnQgPSBpcnE7CiAJCXJlcy0+ZmxhZ3MgPSBJT1JFU09VUkNFX0lSUTsKLQkJcmVzLT5uYW1lID0gZGV2LT5vZmRldi5kZXYuYnVzX2lkOworCQlyZXMtPm5hbWUgPSBkZXZfbmFtZSgmZGV2LT5vZmRldi5kZXYpOwogCQlpZiAobWFjaW9fcmVzb3VyY2VfcXVpcmtzKG5wLCByZXMsIGkgLSAxKSkgewogCQkJbWVtc2V0KHJlcywgMCwgc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOwogCQkJY29udGludWU7CkBAIC0zMjUsNyArMzI1LDcgQEAKIAkJaWYgKGluZGV4ID49IE1BQ0lPX0RFVl9DT1VOVF9SRVNPVVJDRVMpCiAJCQlicmVhazsKIAkJKnJlcyA9IHI7Ci0JCXJlcy0+bmFtZSA9IGRldi0+b2ZkZXYuZGV2LmJ1c19pZDsKKwkJcmVzLT5uYW1lID0gZGV2X25hbWUoJmRldi0+b2ZkZXYuZGV2KTsKIAogCQlpZiAobWFjaW9fcmVzb3VyY2VfcXVpcmtzKG5wLCByZXMsIGluZGV4KSkgewogCQkJbWVtc2V0KHJlcywgMCwgc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOwpAQCAtMzM4LDcgKzMzOCw3IEBACiAJCWlmIChpbnNlcnRfcmVzb3VyY2UocGFyZW50X3JlcywgcmVzKSkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2FuJ3QgcmVxdWVzdCByZXNvdXJjZSAiCiAJCQkgICAgICAgIiVkIGZvciBNYWNJTyBkZXZpY2UgJXNcbiIsCi0JCQkgICAgICAgaW5kZXgsIGRldi0+b2ZkZXYuZGV2LmJ1c19pZCk7CisJCQkgICAgICAgaW5kZXgsIGRldl9uYW1lKCZkZXYtPm9mZGV2LmRldikpOwogCQl9CiAJfQogCWRldi0+bl9yZXNvdXJjZXMgPSBpbmRleDsKQEAgLTM4NSw4ICszODUsOCBAQAogCiAJLyogTWFjSU8gaXRzZWxmIGhhcyBhIGRpZmZlcmVudCByZWcsIHdlIHVzZSBpdCdzIFBDSSBiYXNlICovCiAJaWYgKG5wID09IGNoaXAtPm9mX25vZGUpIHsKLQkJc3ByaW50ZihkZXYtPm9mZGV2LmRldi5idXNfaWQsICIlMWQuJTA4eDolLipzIiwKLQkJCWNoaXAtPmxidXMuaW5kZXgsCisJCWRldl9zZXRfbmFtZSgmZGV2LT5vZmRldi5kZXYsICIlMWQuJTA4eDolLipzIiwKKwkJCSAgICAgY2hpcC0+bGJ1cy5pbmRleCwKICNpZmRlZiBDT05GSUdfUENJCiAJCQkodW5zaWduZWQgaW50KXBjaV9yZXNvdXJjZV9zdGFydChjaGlwLT5sYnVzLnBkZXYsIDApLAogI2Vsc2UKQEAgLTM5NSw5ICszOTUsOSBAQAogCQkJTUFYX05PREVfTkFNRV9TSVpFLCBucC0+bmFtZSk7CiAJfSBlbHNlIHsKIAkJcmVnID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAicmVnIiwgTlVMTCk7Ci0JCXNwcmludGYoZGV2LT5vZmRldi5kZXYuYnVzX2lkLCAiJTFkLiUwOHg6JS4qcyIsCi0JCQljaGlwLT5sYnVzLmluZGV4LAotCQkJcmVnID8gKnJlZyA6IDAsIE1BWF9OT0RFX05BTUVfU0laRSwgbnAtPm5hbWUpOworCQlkZXZfc2V0X25hbWUoJmRldi0+b2ZkZXYuZGV2LCAiJTFkLiUwOHg6JS4qcyIsCisJCQkgICAgIGNoaXAtPmxidXMuaW5kZXgsCisJCQkgICAgIHJlZyA/ICpyZWcgOiAwLCBNQVhfTk9ERV9OQU1FX1NJWkUsIG5wLT5uYW1lKTsKIAl9CiAKIAkvKiBTZXR1cCBpbnRlcnJ1cHRzICYgcmVzb3VyY2VzICovCkBAIC00MDgsNyArNDA4LDcgQEAKIAkvKiBSZWdpc3RlciB3aXRoIGNvcmUgKi8KIAlpZiAob2ZfZGV2aWNlX3JlZ2lzdGVyKCZkZXYtPm9mZGV2KSAhPSAwKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHIm1hY2lvOiBkZXZpY2UgcmVnaXN0cmF0aW9uIGVycm9yIGZvciAlcyFcbiIsCi0JCSAgICAgICBkZXYtPm9mZGV2LmRldi5idXNfaWQpOworCQkgICAgICAgZGV2X25hbWUoJmRldi0+b2ZkZXYuZGV2KSk7CiAJCWtmcmVlKGRldik7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTU1OCw3ICs1NTgsNyBAQAogCQlyZXNvdXJjZV9ubywKIAkJbWFjaW9fcmVzb3VyY2VfbGVuKGRldiwgcmVzb3VyY2Vfbm8pLAogCQltYWNpb19yZXNvdXJjZV9zdGFydChkZXYsIHJlc291cmNlX25vKSwKLQkJZGV2LT5vZmRldi5kZXYuYnVzX2lkKTsKKwkJZGV2X25hbWUoJmRldi0+b2ZkZXYuZGV2KSk7CiAJcmV0dXJuIC1FQlVTWTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fYWR0NzQ2eC5jIGIvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fYWR0NzQ2eC5jCmluZGV4IDIyYmY5ODEuLjgyNjA3YWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX2FkdDc0NnguYworKysgYi9kcml2ZXJzL21hY2ludG9zaC90aGVybV9hZHQ3NDZ4LmMKQEAgLTU1NCw3ICs1NTQsNyBAQAogCWNvbnN0IHUzMiAqcHJvcDsKIAlpbnQgaSA9IDAsIG9mZnNldCA9IDA7CiAJaW50IGVycjsKLQkKKwogCW5wID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgImZhbiIpOwogCWlmICghbnApCiAJCXJldHVybiAtRU5PREVWOwpAQCAtNjEzLDEzICs2MTMsMTMgQEAKIAl9CiAKIAlvZl9kZXYgPSBvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlKG5wLCAidGVtcGVyYXR1cmVzIiwgTlVMTCk7Ci0JCisJb2Zfbm9kZV9wdXQobnApOworCiAJaWYgKG9mX2RldiA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgcmVnaXN0ZXIgdGVtcGVyYXR1cmVzIGRldmljZSAhXG4iKTsKLQkJb2Zfbm9kZV9wdXQobnApOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9Ci0JCisKIAllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJm9mX2Rldi0+ZGV2LCAmZGV2X2F0dHJfc2Vuc29yMV90ZW1wZXJhdHVyZSk7CiAJZXJyIHw9IGRldmljZV9jcmVhdGVfZmlsZSgmb2ZfZGV2LT5kZXYsICZkZXZfYXR0cl9zZW5zb3IyX3RlbXBlcmF0dXJlKTsKIAllcnIgfD0gZGV2aWNlX2NyZWF0ZV9maWxlKCZvZl9kZXYtPmRldiwgJmRldl9hdHRyX3NlbnNvcjFfbGltaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9NYWtlZmlsZSBiL2RyaXZlcnMvbWQvTWFrZWZpbGUKaW5kZXggMWM2MTU4MC4uNzI4ODBiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21kL01ha2VmaWxlCkBAIC0zLDkgKzMsMTAgQEAKICMKIAogZG0tbW9kLW9ianMJOj0gZG0ubyBkbS10YWJsZS5vIGRtLXRhcmdldC5vIGRtLWxpbmVhci5vIGRtLXN0cmlwZS5vIFwKLQkJICAgZG0taW9jdGwubyBkbS1pby5vIGRtLWtjb3B5ZC5vCisJCSAgIGRtLWlvY3RsLm8gZG0taW8ubyBkbS1rY29weWQubyBkbS1zeXNmcy5vCiBkbS1tdWx0aXBhdGgtb2JqcyA6PSBkbS1wYXRoLXNlbGVjdG9yLm8gZG0tbXBhdGgubwotZG0tc25hcHNob3Qtb2JqcyA6PSBkbS1zbmFwLm8gZG0tZXhjZXB0aW9uLXN0b3JlLm8KK2RtLXNuYXBzaG90LW9ianMgOj0gZG0tc25hcC5vIGRtLWV4Y2VwdGlvbi1zdG9yZS5vIGRtLXNuYXAtdHJhbnNpZW50Lm8gXAorCQkgICAgZG0tc25hcC1wZXJzaXN0ZW50Lm8KIGRtLW1pcnJvci1vYmpzCTo9IGRtLXJhaWQxLm8KIG1kLW1vZC1vYmpzICAgICA6PSBtZC5vIGJpdG1hcC5vCiByYWlkNDU2LW9ianMJOj0gcmFpZDUubyByYWlkNmFsZ29zLm8gcmFpZDZyZWNvdi5vIHJhaWQ2dGFibGVzLm8gXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iaXRtYXAuYyBiL2RyaXZlcnMvbWQvYml0bWFwLmMKaW5kZXggYWI3YzhlNC4uNzE5OTQzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iaXRtYXAuYworKysgYi9kcml2ZXJzL21kL2JpdG1hcC5jCkBAIC0yMTUsNyArMjE1LDYgQEAKIAkvKiBjaG9vc2UgYSBnb29kIHJkZXYgYW5kIHJlYWQgdGhlIHBhZ2UgZnJvbSB0aGVyZSAqLwogCiAJbWRrX3JkZXZfdCAqcmRldjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAJc2VjdG9yX3QgdGFyZ2V0OwogCiAJaWYgKCFwYWdlKQpAQCAtMjIzLDcgKzIyMiw3IEBACiAJaWYgKCFwYWdlKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAotCXJkZXZfZm9yX2VhY2gocmRldiwgdG1wLCBtZGRldikgeworCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpIHsKIAkJaWYgKCEgdGVzdF9iaXQoSW5fc3luYywgJnJkZXYtPmZsYWdzKQogCQkgICAgfHwgdGVzdF9iaXQoRmF1bHR5LCAmcmRldi0+ZmxhZ3MpKQogCQkJY29udGludWU7CkBAIC05NjQsOSArOTYzLDExIEBACiAJCQkJICovCiAJCQkJcGFnZSA9IGJpdG1hcC0+c2JfcGFnZTsKIAkJCQlvZmZzZXQgPSBzaXplb2YoYml0bWFwX3N1cGVyX3QpOwotCQkJCXJlYWRfc2JfcGFnZShiaXRtYXAtPm1kZGV2LCBiaXRtYXAtPm9mZnNldCwKLQkJCQkJICAgICBwYWdlLAotCQkJCQkgICAgIGluZGV4LCBjb3VudCk7CisJCQkJaWYgKCFmaWxlKQorCQkJCQlyZWFkX3NiX3BhZ2UoYml0bWFwLT5tZGRldiwKKwkJCQkJCSAgICAgYml0bWFwLT5vZmZzZXQsCisJCQkJCQkgICAgIHBhZ2UsCisJCQkJCQkgICAgIGluZGV4LCBjb3VudCk7CiAJCQl9IGVsc2UgaWYgKGZpbGUpIHsKIAkJCQlwYWdlID0gcmVhZF9wYWdlKGZpbGUsIGluZGV4LCBiaXRtYXAsIGNvdW50KTsKIAkJCQlvZmZzZXQgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1jcnlwdC5jIGIvZHJpdmVycy9tZC9kbS1jcnlwdC5jCmluZGV4IDMzMjY3NTAuLjM1YmRhNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tY3J5cHQuYworKysgYi9kcml2ZXJzL21kL2RtLWNyeXB0LmMKQEAgLTEzMjIsMTEgKzEzMjIsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZG1fY3J5cHRfZXhpdCh2b2lkKQogewotCWludCByID0gZG1fdW5yZWdpc3Rlcl90YXJnZXQoJmNyeXB0X3RhcmdldCk7Ci0KLQlpZiAociA8IDApCi0JCURNRVJSKCJ1bnJlZ2lzdGVyIGZhaWxlZCAlZCIsIHIpOwotCisJZG1fdW5yZWdpc3Rlcl90YXJnZXQoJmNyeXB0X3RhcmdldCk7CiAJa21lbV9jYWNoZV9kZXN0cm95KF9jcnlwdF9pb19wb29sKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1kZWxheS5jIGIvZHJpdmVycy9tZC9kbS1kZWxheS5jCmluZGV4IDg0OGIzODEuLjU5ZWUxYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tZGVsYXkuYworKysgYi9kcml2ZXJzL21kL2RtLWRlbGF5LmMKQEAgLTM2NCwxMSArMzY0LDcgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IGRtX2RlbGF5X2V4aXQodm9pZCkKIHsKLQlpbnQgciA9IGRtX3VucmVnaXN0ZXJfdGFyZ2V0KCZkZWxheV90YXJnZXQpOwotCi0JaWYgKHIgPCAwKQotCQlETUVSUigidW5yZWdpc3RlciBmYWlsZWQgJWQiLCByKTsKLQorCWRtX3VucmVnaXN0ZXJfdGFyZ2V0KCZkZWxheV90YXJnZXQpOwogCWttZW1fY2FjaGVfZGVzdHJveShkZWxheWVkX2NhY2hlKTsKIAlkZXN0cm95X3dvcmtxdWV1ZShrZGVsYXlkX3dxKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tZXhjZXB0aW9uLXN0b3JlLmMgYi9kcml2ZXJzL21kL2RtLWV4Y2VwdGlvbi1zdG9yZS5jCmluZGV4IDAxNTkwZjNlLi5kY2NiZmIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWV4Y2VwdGlvbi1zdG9yZS5jCisrKyBiL2RyaXZlcnMvbWQvZG0tZXhjZXB0aW9uLXN0b3JlLmMKQEAgLTEsNzU2ICsxLDQ1IEBACiAvKgotICogZG0tZXhjZXB0aW9uLXN0b3JlLmMKLSAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBTaXN0aW5hIFNvZnR3YXJlIChVSykgTGltaXRlZC4KLSAqIENvcHlyaWdodCAoQykgMjAwNiBSZWQgSGF0IEdtYkgKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IFJlZCBIYXQgR21iSAogICoKICAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgogICovCiAKLSNpbmNsdWRlICJkbS1zbmFwLmgiCisjaW5jbHVkZSAiZG0tZXhjZXB0aW9uLXN0b3JlLmgiCiAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2RtLWlvLmg+Ci0jaW5jbHVkZSA8bGludXgvZG0ta2NvcHlkLmg+CiAKLSNkZWZpbmUgRE1fTVNHX1BSRUZJWCAic25hcHNob3RzIgotI2RlZmluZSBETV9DSFVOS19TSVpFX0RFRkFVTFRfU0VDVE9SUyAzMgkvKiAxNktCICovCisjZGVmaW5lIERNX01TR19QUkVGSVggInNuYXBzaG90IGV4Y2VwdGlvbiBzdG9yZXMiCiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIFBlcnNpc3RlbnQgc25hcHNob3RzLCBieSBwZXJzaXN0ZW50IHdlIG1lYW4gdGhhdCB0aGUgc25hcHNob3QKLSAqIHdpbGwgc3Vydml2ZSBhIHJlYm9vdC4KLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoKLSAqIFdlIG5lZWQgdG8gc3RvcmUgYSByZWNvcmQgb2Ygd2hpY2ggcGFydHMgb2YgdGhlIG9yaWdpbiBoYXZlCi0gKiBiZWVuIGNvcGllZCB0byB0aGUgc25hcHNob3QgZGV2aWNlLiAgVGhlIHNuYXBzaG90IGNvZGUKLSAqIHJlcXVpcmVzIHRoYXQgd2UgY29weSBleGNlcHRpb24gY2h1bmtzIHRvIGNodW5rIGFsaWduZWQgYXJlYXMKLSAqIG9mIHRoZSBDT1cgc3RvcmUuICBJdCBtYWtlcyBzZW5zZSB0aGVyZWZvcmUsIHRvIHN0b3JlIHRoZQotICogbWV0YWRhdGEgaW4gY2h1bmsgc2l6ZSBibG9ja3MuCi0gKgotICogVGhlcmUgaXMgbm8gYmFja3dhcmQgb3IgZm9yd2FyZCBjb21wYXRpYmlsaXR5IGltcGxlbWVudGVkLAotICogc25hcHNob3RzIHdpdGggZGlmZmVyZW50IGRpc2sgdmVyc2lvbnMgdGhhbiB0aGUga2VybmVsIHdpbGwKLSAqIG5vdCBiZSB1c2FibGUuICBJdCBpcyBleHBlY3RlZCB0aGF0ICJsdmNyZWF0ZSIgd2lsbCBibGFuayBvdXQKLSAqIHRoZSBzdGFydCBvZiBhIGZyZXNoIENPVyBkZXZpY2UgYmVmb3JlIGNhbGxpbmcgdGhlIHNuYXBzaG90Ci0gKiBjb25zdHJ1Y3Rvci4KLSAqCi0gKiBUaGUgZmlyc3QgY2h1bmsgb2YgdGhlIENPVyBkZXZpY2UganVzdCBjb250YWlucyB0aGUgaGVhZGVyLgotICogQWZ0ZXIgdGhpcyB0aGVyZSBpcyBhIGNodW5rIGZpbGxlZCB3aXRoIGV4Y2VwdGlvbiBtZXRhZGF0YSwKLSAqIGZvbGxvd2VkIGJ5IGFzIG1hbnkgZXhjZXB0aW9uIGNodW5rcyBhcyBjYW4gZml0IGluIHRoZQotICogbWV0YWRhdGEgYXJlYXMuCi0gKgotICogQWxsIG9uIGRpc2sgc3RydWN0dXJlcyBhcmUgaW4gbGl0dGxlLWVuZGlhbiBmb3JtYXQuICBUaGUgZW5kCi0gKiBvZiB0aGUgZXhjZXB0aW9ucyBpbmZvIGlzIGluZGljYXRlZCBieSBhbiBleGNlcHRpb24gd2l0aCBhCi0gKiBuZXdfY2h1bmsgb2YgMCwgd2hpY2ggaXMgaW52YWxpZCBzaW5jZSBpdCB3b3VsZCBwb2ludCB0byB0aGUKLSAqIGhlYWRlciBjaHVuay4KLSAqLwotCi0vKgotICogTWFnaWMgZm9yIHBlcnNpc3RlbnQgc25hcHNob3RzOiAiU25BcCIgLSBGZWVibGUgaXNuJ3QgaXQuCi0gKi8KLSNkZWZpbmUgU05BUF9NQUdJQyAweDcwNDE2ZTUzCi0KLS8qCi0gKiBUaGUgb24tZGlzayB2ZXJzaW9uIG9mIHRoZSBtZXRhZGF0YS4KLSAqLwotI2RlZmluZSBTTkFQU0hPVF9ESVNLX1ZFUlNJT04gMQotCi1zdHJ1Y3QgZGlza19oZWFkZXIgewotCXVpbnQzMl90IG1hZ2ljOwotCi0JLyoKLQkgKiBJcyB0aGlzIHNuYXBzaG90IHZhbGlkLiAgVGhlcmUgaXMgbm8gd2F5IG9mIHJlY292ZXJpbmcKLQkgKiBhbiBpbnZhbGlkIHNuYXBzaG90LgotCSAqLwotCXVpbnQzMl90IHZhbGlkOwotCi0JLyoKLQkgKiBTaW1wbGUsIGluY3JlbWVudGluZyB2ZXJzaW9uLiBubyBiYWNrd2FyZAotCSAqIGNvbXBhdGliaWxpdHkuCi0JICovCi0JdWludDMyX3QgdmVyc2lvbjsKLQotCS8qIEluIHNlY3RvcnMgKi8KLQl1aW50MzJfdCBjaHVua19zaXplOwotfTsKLQotc3RydWN0IGRpc2tfZXhjZXB0aW9uIHsKLQl1aW50NjRfdCBvbGRfY2h1bms7Ci0JdWludDY0X3QgbmV3X2NodW5rOwotfTsKLQotc3RydWN0IGNvbW1pdF9jYWxsYmFjayB7Ci0Jdm9pZCAoKmNhbGxiYWNrKSh2b2lkICosIGludCBzdWNjZXNzKTsKLQl2b2lkICpjb250ZXh0OwotfTsKLQotLyoKLSAqIFRoZSB0b3AgbGV2ZWwgc3RydWN0dXJlIGZvciBhIHBlcnNpc3RlbnQgZXhjZXB0aW9uIHN0b3JlLgotICovCi1zdHJ1Y3QgcHN0b3JlIHsKLQlzdHJ1Y3QgZG1fc25hcHNob3QgKnNuYXA7CS8qIHVwIHBvaW50ZXIgdG8gbXkgc25hcHNob3QgKi8KLQlpbnQgdmVyc2lvbjsKLQlpbnQgdmFsaWQ7Ci0JdWludDMyX3QgZXhjZXB0aW9uc19wZXJfYXJlYTsKLQotCS8qCi0JICogTm93IHRoYXQgd2UgaGF2ZSBhbiBhc3luY2hyb25vdXMga2NvcHlkIHRoZXJlIGlzIG5vCi0JICogbmVlZCBmb3IgbGFyZ2UgY2h1bmsgc2l6ZXMsIHNvIGl0IHdvbnQgaHVydCB0byBoYXZlIGEKLQkgKiB3aG9sZSBjaHVua3Mgd29ydGggb2YgbWV0YWRhdGEgaW4gbWVtb3J5IGF0IG9uY2UuCi0JICovCi0Jdm9pZCAqYXJlYTsKLQotCS8qCi0JICogQW4gYXJlYSBvZiB6ZXJvcyB1c2VkIHRvIGNsZWFyIHRoZSBuZXh0IGFyZWEuCi0JICovCi0Jdm9pZCAqemVyb19hcmVhOwotCi0JLyoKLQkgKiBVc2VkIHRvIGtlZXAgdHJhY2sgb2Ygd2hpY2ggbWV0YWRhdGEgYXJlYSB0aGUgZGF0YSBpbgotCSAqICdjaHVuaycgcmVmZXJzIHRvLgotCSAqLwotCWNodW5rX3QgY3VycmVudF9hcmVhOwotCi0JLyoKLQkgKiBUaGUgbmV4dCBmcmVlIGNodW5rIGZvciBhbiBleGNlcHRpb24uCi0JICovCi0JY2h1bmtfdCBuZXh0X2ZyZWU7Ci0KLQkvKgotCSAqIFRoZSBpbmRleCBvZiBuZXh0IGZyZWUgZXhjZXB0aW9uIGluIHRoZSBjdXJyZW50Ci0JICogbWV0YWRhdGEgYXJlYS4KLQkgKi8KLQl1aW50MzJfdCBjdXJyZW50X2NvbW1pdHRlZDsKLQotCWF0b21pY190IHBlbmRpbmdfY291bnQ7Ci0JdWludDMyX3QgY2FsbGJhY2tfY291bnQ7Ci0Jc3RydWN0IGNvbW1pdF9jYWxsYmFjayAqY2FsbGJhY2tzOwotCXN0cnVjdCBkbV9pb19jbGllbnQgKmlvX2NsaWVudDsKLQotCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICptZXRhZGF0YV93cTsKLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBzZWN0b3JzX3RvX3BhZ2VzKHVuc2lnbmVkIHNlY3RvcnMpCi17Ci0JcmV0dXJuIERJVl9ST1VORF9VUChzZWN0b3JzLCBQQUdFX1NJWkUgPj4gOSk7Ci19Ci0KLXN0YXRpYyBpbnQgYWxsb2NfYXJlYShzdHJ1Y3QgcHN0b3JlICpwcykKLXsKLQlpbnQgciA9IC1FTk9NRU07Ci0Jc2l6ZV90IGxlbjsKLQotCWxlbiA9IHBzLT5zbmFwLT5jaHVua19zaXplIDw8IFNFQ1RPUl9TSElGVDsKLQotCS8qCi0JICogQWxsb2NhdGUgdGhlIGNodW5rX3NpemUgYmxvY2sgb2YgbWVtb3J5IHRoYXQgd2lsbCBob2xkCi0JICogYSBzaW5nbGUgbWV0YWRhdGEgYXJlYS4KLQkgKi8KLQlwcy0+YXJlYSA9IHZtYWxsb2MobGVuKTsKLQlpZiAoIXBzLT5hcmVhKQotCQlyZXR1cm4gcjsKLQotCXBzLT56ZXJvX2FyZWEgPSB2bWFsbG9jKGxlbik7Ci0JaWYgKCFwcy0+emVyb19hcmVhKSB7Ci0JCXZmcmVlKHBzLT5hcmVhKTsKLQkJcmV0dXJuIHI7Ci0JfQotCW1lbXNldChwcy0+emVyb19hcmVhLCAwLCBsZW4pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGZyZWVfYXJlYShzdHJ1Y3QgcHN0b3JlICpwcykKLXsKLQl2ZnJlZShwcy0+YXJlYSk7Ci0JcHMtPmFyZWEgPSBOVUxMOwotCXZmcmVlKHBzLT56ZXJvX2FyZWEpOwotCXBzLT56ZXJvX2FyZWEgPSBOVUxMOwotfQotCi1zdHJ1Y3QgbWRhdGFfcmVxIHsKLQlzdHJ1Y3QgZG1faW9fcmVnaW9uICp3aGVyZTsKLQlzdHJ1Y3QgZG1faW9fcmVxdWVzdCAqaW9fcmVxOwotCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwotCWludCByZXN1bHQ7Ci19OwotCi1zdGF0aWMgdm9pZCBkb19tZXRhZGF0YShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IG1kYXRhX3JlcSAqcmVxID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBtZGF0YV9yZXEsIHdvcmspOwotCi0JcmVxLT5yZXN1bHQgPSBkbV9pbyhyZXEtPmlvX3JlcSwgMSwgcmVxLT53aGVyZSwgTlVMTCk7Ci19Ci0KLS8qCi0gKiBSZWFkIG9yIHdyaXRlIGEgY2h1bmsgYWxpZ25lZCBhbmQgc2l6ZWQgYmxvY2sgb2YgZGF0YSBmcm9tIGEgZGV2aWNlLgotICovCi1zdGF0aWMgaW50IGNodW5rX2lvKHN0cnVjdCBwc3RvcmUgKnBzLCBjaHVua190IGNodW5rLCBpbnQgcncsIGludCBtZXRhZGF0YSkKLXsKLQlzdHJ1Y3QgZG1faW9fcmVnaW9uIHdoZXJlID0gewotCQkuYmRldiA9IHBzLT5zbmFwLT5jb3ctPmJkZXYsCi0JCS5zZWN0b3IgPSBwcy0+c25hcC0+Y2h1bmtfc2l6ZSAqIGNodW5rLAotCQkuY291bnQgPSBwcy0+c25hcC0+Y2h1bmtfc2l6ZSwKLQl9OwotCXN0cnVjdCBkbV9pb19yZXF1ZXN0IGlvX3JlcSA9IHsKLQkJLmJpX3J3ID0gcncsCi0JCS5tZW0udHlwZSA9IERNX0lPX1ZNQSwKLQkJLm1lbS5wdHIudm1hID0gcHMtPmFyZWEsCi0JCS5jbGllbnQgPSBwcy0+aW9fY2xpZW50LAotCQkubm90aWZ5LmZuID0gTlVMTCwKLQl9OwotCXN0cnVjdCBtZGF0YV9yZXEgcmVxOwotCi0JaWYgKCFtZXRhZGF0YSkKLQkJcmV0dXJuIGRtX2lvKCZpb19yZXEsIDEsICZ3aGVyZSwgTlVMTCk7Ci0KLQlyZXEud2hlcmUgPSAmd2hlcmU7Ci0JcmVxLmlvX3JlcSA9ICZpb19yZXE7Ci0KLQkvKgotCSAqIElzc3VlIHRoZSBzeW5jaHJvbm91cyBJL08gZnJvbSBhIGRpZmZlcmVudCB0aHJlYWQKLQkgKiB0byBhdm9pZCBnZW5lcmljX21ha2VfcmVxdWVzdCByZWN1cnNpb24uCi0JICovCi0JSU5JVF9XT1JLKCZyZXEud29yaywgZG9fbWV0YWRhdGEpOwotCXF1ZXVlX3dvcmsocHMtPm1ldGFkYXRhX3dxLCAmcmVxLndvcmspOwotCWZsdXNoX3dvcmtxdWV1ZShwcy0+bWV0YWRhdGFfd3EpOwotCi0JcmV0dXJuIHJlcS5yZXN1bHQ7Ci19Ci0KLS8qCi0gKiBDb252ZXJ0IGEgbWV0YWRhdGEgYXJlYSBpbmRleCB0byBhIGNodW5rIGluZGV4LgotICovCi1zdGF0aWMgY2h1bmtfdCBhcmVhX2xvY2F0aW9uKHN0cnVjdCBwc3RvcmUgKnBzLCBjaHVua190IGFyZWEpCi17Ci0JcmV0dXJuIDEgKyAoKHBzLT5leGNlcHRpb25zX3Blcl9hcmVhICsgMSkgKiBhcmVhKTsKLX0KLQotLyoKLSAqIFJlYWQgb3Igd3JpdGUgYSBtZXRhZGF0YSBhcmVhLiAgUmVtZW1iZXJpbmcgdG8gc2tpcCB0aGUgZmlyc3QKLSAqIGNodW5rIHdoaWNoIGhvbGRzIHRoZSBoZWFkZXIuCi0gKi8KLXN0YXRpYyBpbnQgYXJlYV9pbyhzdHJ1Y3QgcHN0b3JlICpwcywgaW50IHJ3KQoraW50IGRtX2V4Y2VwdGlvbl9zdG9yZV9pbml0KHZvaWQpCiB7CiAJaW50IHI7Ci0JY2h1bmtfdCBjaHVuazsKIAotCWNodW5rID0gYXJlYV9sb2NhdGlvbihwcywgcHMtPmN1cnJlbnRfYXJlYSk7CisJciA9IGRtX3RyYW5zaWVudF9zbmFwc2hvdF9pbml0KCk7CisJaWYgKHIpIHsKKwkJRE1FUlIoIlVuYWJsZSB0byByZWdpc3RlciB0cmFuc2llbnQgZXhjZXB0aW9uIHN0b3JlIHR5cGUuIik7CisJCWdvdG8gdHJhbnNpZW50X2ZhaWw7CisJfQogCi0JciA9IGNodW5rX2lvKHBzLCBjaHVuaywgcncsIDApOwotCWlmIChyKQotCQlyZXR1cm4gcjsKKwlyID0gZG1fcGVyc2lzdGVudF9zbmFwc2hvdF9pbml0KCk7CisJaWYgKHIpIHsKKwkJRE1FUlIoIlVuYWJsZSB0byByZWdpc3RlciBwZXJzaXN0ZW50IGV4Y2VwdGlvbiBzdG9yZSB0eXBlIik7CisJCWdvdG8gcGVyc2lzdGVudF9mYWlsOworCX0KIAogCXJldHVybiAwOwotfQogCi1zdGF0aWMgdm9pZCB6ZXJvX21lbW9yeV9hcmVhKHN0cnVjdCBwc3RvcmUgKnBzKQotewotCW1lbXNldChwcy0+YXJlYSwgMCwgcHMtPnNuYXAtPmNodW5rX3NpemUgPDwgU0VDVE9SX1NISUZUKTsKLX0KLQotc3RhdGljIGludCB6ZXJvX2Rpc2tfYXJlYShzdHJ1Y3QgcHN0b3JlICpwcywgY2h1bmtfdCBhcmVhKQotewotCXN0cnVjdCBkbV9pb19yZWdpb24gd2hlcmUgPSB7Ci0JCS5iZGV2ID0gcHMtPnNuYXAtPmNvdy0+YmRldiwKLQkJLnNlY3RvciA9IHBzLT5zbmFwLT5jaHVua19zaXplICogYXJlYV9sb2NhdGlvbihwcywgYXJlYSksCi0JCS5jb3VudCA9IHBzLT5zbmFwLT5jaHVua19zaXplLAotCX07Ci0Jc3RydWN0IGRtX2lvX3JlcXVlc3QgaW9fcmVxID0gewotCQkuYmlfcncgPSBXUklURSwKLQkJLm1lbS50eXBlID0gRE1fSU9fVk1BLAotCQkubWVtLnB0ci52bWEgPSBwcy0+emVyb19hcmVhLAotCQkuY2xpZW50ID0gcHMtPmlvX2NsaWVudCwKLQkJLm5vdGlmeS5mbiA9IE5VTEwsCi0JfTsKLQotCXJldHVybiBkbV9pbygmaW9fcmVxLCAxLCAmd2hlcmUsIE5VTEwpOwotfQotCi1zdGF0aWMgaW50IHJlYWRfaGVhZGVyKHN0cnVjdCBwc3RvcmUgKnBzLCBpbnQgKm5ld19zbmFwc2hvdCkKLXsKLQlpbnQgcjsKLQlzdHJ1Y3QgZGlza19oZWFkZXIgKmRoOwotCWNodW5rX3QgY2h1bmtfc2l6ZTsKLQlpbnQgY2h1bmtfc2l6ZV9zdXBwbGllZCA9IDE7Ci0KLQkvKgotCSAqIFVzZSBkZWZhdWx0IGNodW5rIHNpemUgKG9yIGhhcmRzZWN0X3NpemUsIGlmIGxhcmdlcikgaWYgbm9uZSBzdXBwbGllZAotCSAqLwotCWlmICghcHMtPnNuYXAtPmNodW5rX3NpemUpIHsKLSAgICAgICAgCXBzLT5zbmFwLT5jaHVua19zaXplID0gbWF4KERNX0NIVU5LX1NJWkVfREVGQVVMVF9TRUNUT1JTLAotCQkgICAgYmRldl9oYXJkc2VjdF9zaXplKHBzLT5zbmFwLT5jb3ctPmJkZXYpID4+IDkpOwotCQlwcy0+c25hcC0+Y2h1bmtfbWFzayA9IHBzLT5zbmFwLT5jaHVua19zaXplIC0gMTsKLQkJcHMtPnNuYXAtPmNodW5rX3NoaWZ0ID0gZmZzKHBzLT5zbmFwLT5jaHVua19zaXplKSAtIDE7Ci0JCWNodW5rX3NpemVfc3VwcGxpZWQgPSAwOwotCX0KLQotCXBzLT5pb19jbGllbnQgPSBkbV9pb19jbGllbnRfY3JlYXRlKHNlY3RvcnNfdG9fcGFnZXMocHMtPnNuYXAtPgotCQkJCQkJCSAgICAgY2h1bmtfc2l6ZSkpOwotCWlmIChJU19FUlIocHMtPmlvX2NsaWVudCkpCi0JCXJldHVybiBQVFJfRVJSKHBzLT5pb19jbGllbnQpOwotCi0JciA9IGFsbG9jX2FyZWEocHMpOwotCWlmIChyKQotCQlyZXR1cm4gcjsKLQotCXIgPSBjaHVua19pbyhwcywgMCwgUkVBRCwgMSk7Ci0JaWYgKHIpCi0JCWdvdG8gYmFkOwotCi0JZGggPSAoc3RydWN0IGRpc2tfaGVhZGVyICopIHBzLT5hcmVhOwotCi0JaWYgKGxlMzJfdG9fY3B1KGRoLT5tYWdpYykgPT0gMCkgewotCQkqbmV3X3NuYXBzaG90ID0gMTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKGxlMzJfdG9fY3B1KGRoLT5tYWdpYykgIT0gU05BUF9NQUdJQykgewotCQlETVdBUk4oIkludmFsaWQgb3IgY29ycnVwdCBzbmFwc2hvdCIpOwotCQlyID0gLUVOWElPOwotCQlnb3RvIGJhZDsKLQl9Ci0KLQkqbmV3X3NuYXBzaG90ID0gMDsKLQlwcy0+dmFsaWQgPSBsZTMyX3RvX2NwdShkaC0+dmFsaWQpOwotCXBzLT52ZXJzaW9uID0gbGUzMl90b19jcHUoZGgtPnZlcnNpb24pOwotCWNodW5rX3NpemUgPSBsZTMyX3RvX2NwdShkaC0+Y2h1bmtfc2l6ZSk7Ci0KLQlpZiAoIWNodW5rX3NpemVfc3VwcGxpZWQgfHwgcHMtPnNuYXAtPmNodW5rX3NpemUgPT0gY2h1bmtfc2l6ZSkKLQkJcmV0dXJuIDA7Ci0KLQlETVdBUk4oImNodW5rIHNpemUgJWxsdSBpbiBkZXZpY2UgbWV0YWRhdGEgb3ZlcnJpZGVzICIKLQkgICAgICAgInRhYmxlIGNodW5rIHNpemUgb2YgJWxsdS4iLAotCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWNodW5rX3NpemUsCi0JICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcHMtPnNuYXAtPmNodW5rX3NpemUpOwotCi0JLyogV2UgaGFkIGEgYm9ndXMgY2h1bmtfc2l6ZS4gRml4IHN0dWZmIHVwLiAqLwotCWZyZWVfYXJlYShwcyk7Ci0KLQlwcy0+c25hcC0+Y2h1bmtfc2l6ZSA9IGNodW5rX3NpemU7Ci0JcHMtPnNuYXAtPmNodW5rX21hc2sgPSBjaHVua19zaXplIC0gMTsKLQlwcy0+c25hcC0+Y2h1bmtfc2hpZnQgPSBmZnMoY2h1bmtfc2l6ZSkgLSAxOwotCi0JciA9IGRtX2lvX2NsaWVudF9yZXNpemUoc2VjdG9yc190b19wYWdlcyhwcy0+c25hcC0+Y2h1bmtfc2l6ZSksCi0JCQkJcHMtPmlvX2NsaWVudCk7Ci0JaWYgKHIpCi0JCXJldHVybiByOwotCi0JciA9IGFsbG9jX2FyZWEocHMpOwotCXJldHVybiByOwotCi1iYWQ6Ci0JZnJlZV9hcmVhKHBzKTsKK3BlcnNpc3RlbnRfZmFpbDoKKwlkbV9wZXJzaXN0ZW50X3NuYXBzaG90X2V4aXQoKTsKK3RyYW5zaWVudF9mYWlsOgogCXJldHVybiByOwogfQogCi1zdGF0aWMgaW50IHdyaXRlX2hlYWRlcihzdHJ1Y3QgcHN0b3JlICpwcykKK3ZvaWQgZG1fZXhjZXB0aW9uX3N0b3JlX2V4aXQodm9pZCkKIHsKLQlzdHJ1Y3QgZGlza19oZWFkZXIgKmRoOwotCi0JbWVtc2V0KHBzLT5hcmVhLCAwLCBwcy0+c25hcC0+Y2h1bmtfc2l6ZSA8PCBTRUNUT1JfU0hJRlQpOwotCi0JZGggPSAoc3RydWN0IGRpc2tfaGVhZGVyICopIHBzLT5hcmVhOwotCWRoLT5tYWdpYyA9IGNwdV90b19sZTMyKFNOQVBfTUFHSUMpOwotCWRoLT52YWxpZCA9IGNwdV90b19sZTMyKHBzLT52YWxpZCk7Ci0JZGgtPnZlcnNpb24gPSBjcHVfdG9fbGUzMihwcy0+dmVyc2lvbik7Ci0JZGgtPmNodW5rX3NpemUgPSBjcHVfdG9fbGUzMihwcy0+c25hcC0+Y2h1bmtfc2l6ZSk7Ci0KLQlyZXR1cm4gY2h1bmtfaW8ocHMsIDAsIFdSSVRFLCAxKTsKLX0KLQotLyoKLSAqIEFjY2VzcyBmdW5jdGlvbnMgZm9yIHRoZSBkaXNrIGV4Y2VwdGlvbnMsIHRoZXNlIGRvIHRoZSBlbmRpYW4gY29udmVyc2lvbnMuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgZGlza19leGNlcHRpb24gKmdldF9leGNlcHRpb24oc3RydWN0IHBzdG9yZSAqcHMsIHVpbnQzMl90IGluZGV4KQotewotCUJVR19PTihpbmRleCA+PSBwcy0+ZXhjZXB0aW9uc19wZXJfYXJlYSk7Ci0KLQlyZXR1cm4gKChzdHJ1Y3QgZGlza19leGNlcHRpb24gKikgcHMtPmFyZWEpICsgaW5kZXg7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlYWRfZXhjZXB0aW9uKHN0cnVjdCBwc3RvcmUgKnBzLAotCQkJICAgdWludDMyX3QgaW5kZXgsIHN0cnVjdCBkaXNrX2V4Y2VwdGlvbiAqcmVzdWx0KQotewotCXN0cnVjdCBkaXNrX2V4Y2VwdGlvbiAqZSA9IGdldF9leGNlcHRpb24ocHMsIGluZGV4KTsKLQotCS8qIGNvcHkgaXQgKi8KLQlyZXN1bHQtPm9sZF9jaHVuayA9IGxlNjRfdG9fY3B1KGUtPm9sZF9jaHVuayk7Ci0JcmVzdWx0LT5uZXdfY2h1bmsgPSBsZTY0X3RvX2NwdShlLT5uZXdfY2h1bmspOwotfQotCi1zdGF0aWMgdm9pZCB3cml0ZV9leGNlcHRpb24oc3RydWN0IHBzdG9yZSAqcHMsCi0JCQkgICAgdWludDMyX3QgaW5kZXgsIHN0cnVjdCBkaXNrX2V4Y2VwdGlvbiAqZGUpCi17Ci0Jc3RydWN0IGRpc2tfZXhjZXB0aW9uICplID0gZ2V0X2V4Y2VwdGlvbihwcywgaW5kZXgpOwotCi0JLyogY29weSBpdCAqLwotCWUtPm9sZF9jaHVuayA9IGNwdV90b19sZTY0KGRlLT5vbGRfY2h1bmspOwotCWUtPm5ld19jaHVuayA9IGNwdV90b19sZTY0KGRlLT5uZXdfY2h1bmspOwotfQotCi0vKgotICogUmVnaXN0ZXJzIHRoZSBleGNlcHRpb25zIHRoYXQgYXJlIHByZXNlbnQgaW4gdGhlIGN1cnJlbnQgYXJlYS4KLSAqICdmdWxsJyBpcyBmaWxsZWQgaW4gdG8gaW5kaWNhdGUgaWYgdGhlIGFyZWEgaGFzIGJlZW4KLSAqIGZpbGxlZC4KLSAqLwotc3RhdGljIGludCBpbnNlcnRfZXhjZXB0aW9ucyhzdHJ1Y3QgcHN0b3JlICpwcywgaW50ICpmdWxsKQotewotCWludCByOwotCXVuc2lnbmVkIGludCBpOwotCXN0cnVjdCBkaXNrX2V4Y2VwdGlvbiBkZTsKLQotCS8qIHByZXN1bWUgdGhlIGFyZWEgaXMgZnVsbCAqLwotCSpmdWxsID0gMTsKLQotCWZvciAoaSA9IDA7IGkgPCBwcy0+ZXhjZXB0aW9uc19wZXJfYXJlYTsgaSsrKSB7Ci0JCXJlYWRfZXhjZXB0aW9uKHBzLCBpLCAmZGUpOwotCi0JCS8qCi0JCSAqIElmIHRoZSBuZXdfY2h1bmsgaXMgcG9pbnRpbmcgYXQgdGhlIHN0YXJ0IG9mCi0JCSAqIHRoZSBDT1cgZGV2aWNlLCB3aGVyZSB0aGUgZmlyc3QgbWV0YWRhdGEgYXJlYQotCQkgKiBpcyB3ZSBrbm93IHRoYXQgd2UndmUgaGl0IHRoZSBlbmQgb2YgdGhlCi0JCSAqIGV4Y2VwdGlvbnMuICBUaGVyZWZvcmUgdGhlIGFyZWEgaXMgbm90IGZ1bGwuCi0JCSAqLwotCQlpZiAoZGUubmV3X2NodW5rID09IDBMTCkgewotCQkJcHMtPmN1cnJlbnRfY29tbWl0dGVkID0gaTsKLQkJCSpmdWxsID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyoKLQkJICogS2VlcCB0cmFjayBvZiB0aGUgc3RhcnQgb2YgdGhlIGZyZWUgY2h1bmtzLgotCQkgKi8KLQkJaWYgKHBzLT5uZXh0X2ZyZWUgPD0gZGUubmV3X2NodW5rKQotCQkJcHMtPm5leHRfZnJlZSA9IGRlLm5ld19jaHVuayArIDE7Ci0KLQkJLyoKLQkJICogT3RoZXJ3aXNlIHdlIGFkZCB0aGUgZXhjZXB0aW9uIHRvIHRoZSBzbmFwc2hvdC4KLQkJICovCi0JCXIgPSBkbV9hZGRfZXhjZXB0aW9uKHBzLT5zbmFwLCBkZS5vbGRfY2h1bmssIGRlLm5ld19jaHVuayk7Ci0JCWlmIChyKQotCQkJcmV0dXJuIHI7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcmVhZF9leGNlcHRpb25zKHN0cnVjdCBwc3RvcmUgKnBzKQotewotCWludCByLCBmdWxsID0gMTsKLQotCS8qCi0JICogS2VlcGluZyByZWFkaW5nIGNodW5rcyBhbmQgaW5zZXJ0aW5nIGV4Y2VwdGlvbnMgdW50aWwKLQkgKiB3ZSBmaW5kIGEgcGFydGlhbGx5IGZ1bGwgYXJlYS4KLQkgKi8KLQlmb3IgKHBzLT5jdXJyZW50X2FyZWEgPSAwOyBmdWxsOyBwcy0+Y3VycmVudF9hcmVhKyspIHsKLQkJciA9IGFyZWFfaW8ocHMsIFJFQUQpOwotCQlpZiAocikKLQkJCXJldHVybiByOwotCi0JCXIgPSBpbnNlcnRfZXhjZXB0aW9ucyhwcywgJmZ1bGwpOwotCQlpZiAocikKLQkJCXJldHVybiByOwotCX0KLQotCXBzLT5jdXJyZW50X2FyZWEtLTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHBzdG9yZSAqZ2V0X2luZm8oc3RydWN0IGV4Y2VwdGlvbl9zdG9yZSAqc3RvcmUpCi17Ci0JcmV0dXJuIChzdHJ1Y3QgcHN0b3JlICopIHN0b3JlLT5jb250ZXh0OwotfQotCi1zdGF0aWMgdm9pZCBwZXJzaXN0ZW50X2ZyYWN0aW9uX2Z1bGwoc3RydWN0IGV4Y2VwdGlvbl9zdG9yZSAqc3RvcmUsCi0JCQkJICAgICBzZWN0b3JfdCAqbnVtZXJhdG9yLCBzZWN0b3JfdCAqZGVub21pbmF0b3IpCi17Ci0JKm51bWVyYXRvciA9IGdldF9pbmZvKHN0b3JlKS0+bmV4dF9mcmVlICogc3RvcmUtPnNuYXAtPmNodW5rX3NpemU7Ci0JKmRlbm9taW5hdG9yID0gZ2V0X2Rldl9zaXplKHN0b3JlLT5zbmFwLT5jb3ctPmJkZXYpOwotfQotCi1zdGF0aWMgdm9pZCBwZXJzaXN0ZW50X2Rlc3Ryb3koc3RydWN0IGV4Y2VwdGlvbl9zdG9yZSAqc3RvcmUpCi17Ci0Jc3RydWN0IHBzdG9yZSAqcHMgPSBnZXRfaW5mbyhzdG9yZSk7Ci0KLQlkZXN0cm95X3dvcmtxdWV1ZShwcy0+bWV0YWRhdGFfd3EpOwotCWRtX2lvX2NsaWVudF9kZXN0cm95KHBzLT5pb19jbGllbnQpOwotCXZmcmVlKHBzLT5jYWxsYmFja3MpOwotCWZyZWVfYXJlYShwcyk7Ci0Ja2ZyZWUocHMpOwotfQotCi1zdGF0aWMgaW50IHBlcnNpc3RlbnRfcmVhZF9tZXRhZGF0YShzdHJ1Y3QgZXhjZXB0aW9uX3N0b3JlICpzdG9yZSkKLXsKLQlpbnQgciwgdW5pbml0aWFsaXplZF92YXIobmV3X3NuYXBzaG90KTsKLQlzdHJ1Y3QgcHN0b3JlICpwcyA9IGdldF9pbmZvKHN0b3JlKTsKLQotCS8qCi0JICogUmVhZCB0aGUgc25hcHNob3QgaGVhZGVyLgotCSAqLwotCXIgPSByZWFkX2hlYWRlcihwcywgJm5ld19zbmFwc2hvdCk7Ci0JaWYgKHIpCi0JCXJldHVybiByOwotCi0JLyoKLQkgKiBOb3cgd2Uga25vdyBjb3JyZWN0IGNodW5rX3NpemUsIGNvbXBsZXRlIHRoZSBpbml0aWFsaXNhdGlvbi4KLQkgKi8KLQlwcy0+ZXhjZXB0aW9uc19wZXJfYXJlYSA9IChwcy0+c25hcC0+Y2h1bmtfc2l6ZSA8PCBTRUNUT1JfU0hJRlQpIC8KLQkJCQkgIHNpemVvZihzdHJ1Y3QgZGlza19leGNlcHRpb24pOwotCXBzLT5jYWxsYmFja3MgPSBkbV92Y2FsbG9jKHBzLT5leGNlcHRpb25zX3Blcl9hcmVhLAotCQkJc2l6ZW9mKCpwcy0+Y2FsbGJhY2tzKSk7Ci0JaWYgKCFwcy0+Y2FsbGJhY2tzKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCS8qCi0JICogRG8gd2UgbmVlZCB0byBzZXR1cCBhIG5ldyBzbmFwc2hvdCA/Ci0JICovCi0JaWYgKG5ld19zbmFwc2hvdCkgewotCQlyID0gd3JpdGVfaGVhZGVyKHBzKTsKLQkJaWYgKHIpIHsKLQkJCURNV0FSTigid3JpdGVfaGVhZGVyIGZhaWxlZCIpOwotCQkJcmV0dXJuIHI7Ci0JCX0KLQotCQlwcy0+Y3VycmVudF9hcmVhID0gMDsKLQkJemVyb19tZW1vcnlfYXJlYShwcyk7Ci0JCXIgPSB6ZXJvX2Rpc2tfYXJlYShwcywgMCk7Ci0JCWlmIChyKSB7Ci0JCQlETVdBUk4oInplcm9fZGlza19hcmVhKDApIGZhaWxlZCIpOwotCQkJcmV0dXJuIHI7Ci0JCX0KLQl9IGVsc2UgewotCQkvKgotCQkgKiBTYW5pdHkgY2hlY2tzLgotCQkgKi8KLQkJaWYgKHBzLT52ZXJzaW9uICE9IFNOQVBTSE9UX0RJU0tfVkVSU0lPTikgewotCQkJRE1XQVJOKCJ1bmFibGUgdG8gaGFuZGxlIHNuYXBzaG90IGRpc2sgdmVyc2lvbiAlZCIsCi0JCQkgICAgICAgcHMtPnZlcnNpb24pOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQkvKgotCQkgKiBNZXRhZGF0YSBhcmUgdmFsaWQsIGJ1dCBzbmFwc2hvdCBpcyBpbnZhbGlkYXRlZAotCQkgKi8KLQkJaWYgKCFwcy0+dmFsaWQpCi0JCQlyZXR1cm4gMTsKLQotCQkvKgotCQkgKiBSZWFkIHRoZSBtZXRhZGF0YS4KLQkJICovCi0JCXIgPSByZWFkX2V4Y2VwdGlvbnMocHMpOwotCQlpZiAocikKLQkJCXJldHVybiByOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHBlcnNpc3RlbnRfcHJlcGFyZShzdHJ1Y3QgZXhjZXB0aW9uX3N0b3JlICpzdG9yZSwKLQkJCSAgICAgIHN0cnVjdCBkbV9zbmFwX2V4Y2VwdGlvbiAqZSkKLXsKLQlzdHJ1Y3QgcHN0b3JlICpwcyA9IGdldF9pbmZvKHN0b3JlKTsKLQl1aW50MzJfdCBzdHJpZGU7Ci0JY2h1bmtfdCBuZXh0X2ZyZWU7Ci0Jc2VjdG9yX3Qgc2l6ZSA9IGdldF9kZXZfc2l6ZShzdG9yZS0+c25hcC0+Y293LT5iZGV2KTsKLQotCS8qIElzIHRoZXJlIGVub3VnaCByb29tID8gKi8KLQlpZiAoc2l6ZSA8ICgocHMtPm5leHRfZnJlZSArIDEpICogc3RvcmUtPnNuYXAtPmNodW5rX3NpemUpKQotCQlyZXR1cm4gLUVOT1NQQzsKLQotCWUtPm5ld19jaHVuayA9IHBzLT5uZXh0X2ZyZWU7Ci0KLQkvKgotCSAqIE1vdmUgb250byB0aGUgbmV4dCBmcmVlIHBlbmRpbmcsIG1ha2luZyBzdXJlIHRvIHRha2UKLQkgKiBpbnRvIGFjY291bnQgdGhlIGxvY2F0aW9uIG9mIHRoZSBtZXRhZGF0YSBjaHVua3MuCi0JICovCi0Jc3RyaWRlID0gKHBzLT5leGNlcHRpb25zX3Blcl9hcmVhICsgMSk7Ci0JbmV4dF9mcmVlID0gKytwcy0+bmV4dF9mcmVlOwotCWlmIChzZWN0b3JfZGl2KG5leHRfZnJlZSwgc3RyaWRlKSA9PSAxKQotCQlwcy0+bmV4dF9mcmVlKys7Ci0KLQlhdG9taWNfaW5jKCZwcy0+cGVuZGluZ19jb3VudCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHBlcnNpc3RlbnRfY29tbWl0KHN0cnVjdCBleGNlcHRpb25fc3RvcmUgKnN0b3JlLAotCQkJICAgICAgc3RydWN0IGRtX3NuYXBfZXhjZXB0aW9uICplLAotCQkJICAgICAgdm9pZCAoKmNhbGxiYWNrKSAodm9pZCAqLCBpbnQgc3VjY2VzcyksCi0JCQkgICAgICB2b2lkICpjYWxsYmFja19jb250ZXh0KQotewotCXVuc2lnbmVkIGludCBpOwotCXN0cnVjdCBwc3RvcmUgKnBzID0gZ2V0X2luZm8oc3RvcmUpOwotCXN0cnVjdCBkaXNrX2V4Y2VwdGlvbiBkZTsKLQlzdHJ1Y3QgY29tbWl0X2NhbGxiYWNrICpjYjsKLQotCWRlLm9sZF9jaHVuayA9IGUtPm9sZF9jaHVuazsKLQlkZS5uZXdfY2h1bmsgPSBlLT5uZXdfY2h1bms7Ci0Jd3JpdGVfZXhjZXB0aW9uKHBzLCBwcy0+Y3VycmVudF9jb21taXR0ZWQrKywgJmRlKTsKLQotCS8qCi0JICogQWRkIHRoZSBjYWxsYmFjayB0byB0aGUgYmFjayBvZiB0aGUgYXJyYXkuICBUaGlzIGNvZGUKLQkgKiBpcyB0aGUgb25seSBwbGFjZSB3aGVyZSB0aGUgY2FsbGJhY2sgYXJyYXkgaXMKLQkgKiBtYW5pcHVsYXRlZCwgYW5kIHdlIGtub3cgdGhhdCBpdCB3aWxsIG5ldmVyIGJlIGNhbGxlZAotCSAqIG11bHRpcGxlIHRpbWVzIGNvbmN1cnJlbnRseS4KLQkgKi8KLQljYiA9IHBzLT5jYWxsYmFja3MgKyBwcy0+Y2FsbGJhY2tfY291bnQrKzsKLQljYi0+Y2FsbGJhY2sgPSBjYWxsYmFjazsKLQljYi0+Y29udGV4dCA9IGNhbGxiYWNrX2NvbnRleHQ7Ci0KLQkvKgotCSAqIElmIHRoZXJlIGFyZSBleGNlcHRpb25zIGluIGZsaWdodCBhbmQgd2UgaGF2ZSBub3QgeWV0Ci0JICogZmlsbGVkIHRoaXMgbWV0YWRhdGEgYXJlYSB0aGVyZSdzIG5vdGhpbmcgbW9yZSB0byBkby4KLQkgKi8KLQlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJnBzLT5wZW5kaW5nX2NvdW50KSAmJgotCSAgICAocHMtPmN1cnJlbnRfY29tbWl0dGVkICE9IHBzLT5leGNlcHRpb25zX3Blcl9hcmVhKSkKLQkJcmV0dXJuOwotCi0JLyoKLQkgKiBJZiB3ZSBjb21wbGV0ZWx5IGZpbGxlZCB0aGUgY3VycmVudCBhcmVhLCB0aGVuIHdpcGUgdGhlIG5leHQgb25lLgotCSAqLwotCWlmICgocHMtPmN1cnJlbnRfY29tbWl0dGVkID09IHBzLT5leGNlcHRpb25zX3Blcl9hcmVhKSAmJgotCSAgICAgemVyb19kaXNrX2FyZWEocHMsIHBzLT5jdXJyZW50X2FyZWEgKyAxKSkKLQkJcHMtPnZhbGlkID0gMDsKLQotCS8qCi0JICogQ29tbWl0IGV4Y2VwdGlvbnMgdG8gZGlzay4KLQkgKi8KLQlpZiAocHMtPnZhbGlkICYmIGFyZWFfaW8ocHMsIFdSSVRFKSkKLQkJcHMtPnZhbGlkID0gMDsKLQotCS8qCi0JICogQWR2YW5jZSB0byB0aGUgbmV4dCBhcmVhIGlmIHRoaXMgb25lIGlzIGZ1bGwuCi0JICovCi0JaWYgKHBzLT5jdXJyZW50X2NvbW1pdHRlZCA9PSBwcy0+ZXhjZXB0aW9uc19wZXJfYXJlYSkgewotCQlwcy0+Y3VycmVudF9jb21taXR0ZWQgPSAwOwotCQlwcy0+Y3VycmVudF9hcmVhKys7Ci0JCXplcm9fbWVtb3J5X2FyZWEocHMpOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBwcy0+Y2FsbGJhY2tfY291bnQ7IGkrKykgewotCQljYiA9IHBzLT5jYWxsYmFja3MgKyBpOwotCQljYi0+Y2FsbGJhY2soY2ItPmNvbnRleHQsIHBzLT52YWxpZCk7Ci0JfQotCi0JcHMtPmNhbGxiYWNrX2NvdW50ID0gMDsKLX0KLQotc3RhdGljIHZvaWQgcGVyc2lzdGVudF9kcm9wKHN0cnVjdCBleGNlcHRpb25fc3RvcmUgKnN0b3JlKQotewotCXN0cnVjdCBwc3RvcmUgKnBzID0gZ2V0X2luZm8oc3RvcmUpOwotCi0JcHMtPnZhbGlkID0gMDsKLQlpZiAod3JpdGVfaGVhZGVyKHBzKSkKLQkJRE1XQVJOKCJ3cml0ZSBoZWFkZXIgZmFpbGVkIik7Ci19Ci0KLWludCBkbV9jcmVhdGVfcGVyc2lzdGVudChzdHJ1Y3QgZXhjZXB0aW9uX3N0b3JlICpzdG9yZSkKLXsKLQlzdHJ1Y3QgcHN0b3JlICpwczsKLQotCS8qIGFsbG9jYXRlIHRoZSBwc3RvcmUgKi8KLQlwcyA9IGttYWxsb2Moc2l6ZW9mKCpwcyksIEdGUF9LRVJORUwpOwotCWlmICghcHMpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcHMtPnNuYXAgPSBzdG9yZS0+c25hcDsKLQlwcy0+dmFsaWQgPSAxOwotCXBzLT52ZXJzaW9uID0gU05BUFNIT1RfRElTS19WRVJTSU9OOwotCXBzLT5hcmVhID0gTlVMTDsKLQlwcy0+bmV4dF9mcmVlID0gMjsJLyogc2tpcHBpbmcgdGhlIGhlYWRlciBhbmQgZmlyc3QgYXJlYSAqLwotCXBzLT5jdXJyZW50X2NvbW1pdHRlZCA9IDA7Ci0KLQlwcy0+Y2FsbGJhY2tfY291bnQgPSAwOwotCWF0b21pY19zZXQoJnBzLT5wZW5kaW5nX2NvdW50LCAwKTsKLQlwcy0+Y2FsbGJhY2tzID0gTlVMTDsKLQotCXBzLT5tZXRhZGF0YV93cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJrc25hcGhkIik7Ci0JaWYgKCFwcy0+bWV0YWRhdGFfd3EpIHsKLQkJa2ZyZWUocHMpOwotCQlETUVSUigiY291bGRuJ3Qgc3RhcnQgaGVhZGVyIG1ldGFkYXRhIHVwZGF0ZSB0aHJlYWQiKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0Jc3RvcmUtPmRlc3Ryb3kgPSBwZXJzaXN0ZW50X2Rlc3Ryb3k7Ci0Jc3RvcmUtPnJlYWRfbWV0YWRhdGEgPSBwZXJzaXN0ZW50X3JlYWRfbWV0YWRhdGE7Ci0Jc3RvcmUtPnByZXBhcmVfZXhjZXB0aW9uID0gcGVyc2lzdGVudF9wcmVwYXJlOwotCXN0b3JlLT5jb21taXRfZXhjZXB0aW9uID0gcGVyc2lzdGVudF9jb21taXQ7Ci0Jc3RvcmUtPmRyb3Bfc25hcHNob3QgPSBwZXJzaXN0ZW50X2Ryb3A7Ci0Jc3RvcmUtPmZyYWN0aW9uX2Z1bGwgPSBwZXJzaXN0ZW50X2ZyYWN0aW9uX2Z1bGw7Ci0Jc3RvcmUtPmNvbnRleHQgPSBwczsKLQotCXJldHVybiAwOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgc3RvcmUgZm9yIG5vbi1wZXJzaXN0ZW50IHNuYXBzaG90cy4KLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0cnVjdCB0cmFuc2llbnRfYyB7Ci0Jc2VjdG9yX3QgbmV4dF9mcmVlOwotfTsKLQotc3RhdGljIHZvaWQgdHJhbnNpZW50X2Rlc3Ryb3koc3RydWN0IGV4Y2VwdGlvbl9zdG9yZSAqc3RvcmUpCi17Ci0Ja2ZyZWUoc3RvcmUtPmNvbnRleHQpOwotfQotCi1zdGF0aWMgaW50IHRyYW5zaWVudF9yZWFkX21ldGFkYXRhKHN0cnVjdCBleGNlcHRpb25fc3RvcmUgKnN0b3JlKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRyYW5zaWVudF9wcmVwYXJlKHN0cnVjdCBleGNlcHRpb25fc3RvcmUgKnN0b3JlLAotCQkJICAgICBzdHJ1Y3QgZG1fc25hcF9leGNlcHRpb24gKmUpCi17Ci0Jc3RydWN0IHRyYW5zaWVudF9jICp0YyA9IChzdHJ1Y3QgdHJhbnNpZW50X2MgKikgc3RvcmUtPmNvbnRleHQ7Ci0Jc2VjdG9yX3Qgc2l6ZSA9IGdldF9kZXZfc2l6ZShzdG9yZS0+c25hcC0+Y293LT5iZGV2KTsKLQotCWlmIChzaXplIDwgKHRjLT5uZXh0X2ZyZWUgKyBzdG9yZS0+c25hcC0+Y2h1bmtfc2l6ZSkpCi0JCXJldHVybiAtMTsKLQotCWUtPm5ld19jaHVuayA9IHNlY3Rvcl90b19jaHVuayhzdG9yZS0+c25hcCwgdGMtPm5leHRfZnJlZSk7Ci0JdGMtPm5leHRfZnJlZSArPSBzdG9yZS0+c25hcC0+Y2h1bmtfc2l6ZTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCB0cmFuc2llbnRfY29tbWl0KHN0cnVjdCBleGNlcHRpb25fc3RvcmUgKnN0b3JlLAotCQkJICAgICBzdHJ1Y3QgZG1fc25hcF9leGNlcHRpb24gKmUsCi0JCQkgICAgIHZvaWQgKCpjYWxsYmFjaykgKHZvaWQgKiwgaW50IHN1Y2Nlc3MpLAotCQkJICAgICB2b2lkICpjYWxsYmFja19jb250ZXh0KQotewotCS8qIEp1c3Qgc3VjY2VlZCAqLwotCWNhbGxiYWNrKGNhbGxiYWNrX2NvbnRleHQsIDEpOwotfQotCi1zdGF0aWMgdm9pZCB0cmFuc2llbnRfZnJhY3Rpb25fZnVsbChzdHJ1Y3QgZXhjZXB0aW9uX3N0b3JlICpzdG9yZSwKLQkJCQkgICAgc2VjdG9yX3QgKm51bWVyYXRvciwgc2VjdG9yX3QgKmRlbm9taW5hdG9yKQotewotCSpudW1lcmF0b3IgPSAoKHN0cnVjdCB0cmFuc2llbnRfYyAqKSBzdG9yZS0+Y29udGV4dCktPm5leHRfZnJlZTsKLQkqZGVub21pbmF0b3IgPSBnZXRfZGV2X3NpemUoc3RvcmUtPnNuYXAtPmNvdy0+YmRldik7Ci19Ci0KLWludCBkbV9jcmVhdGVfdHJhbnNpZW50KHN0cnVjdCBleGNlcHRpb25fc3RvcmUgKnN0b3JlKQotewotCXN0cnVjdCB0cmFuc2llbnRfYyAqdGM7Ci0KLQlzdG9yZS0+ZGVzdHJveSA9IHRyYW5zaWVudF9kZXN0cm95OwotCXN0b3JlLT5yZWFkX21ldGFkYXRhID0gdHJhbnNpZW50X3JlYWRfbWV0YWRhdGE7Ci0Jc3RvcmUtPnByZXBhcmVfZXhjZXB0aW9uID0gdHJhbnNpZW50X3ByZXBhcmU7Ci0Jc3RvcmUtPmNvbW1pdF9leGNlcHRpb24gPSB0cmFuc2llbnRfY29tbWl0OwotCXN0b3JlLT5kcm9wX3NuYXBzaG90ID0gTlVMTDsKLQlzdG9yZS0+ZnJhY3Rpb25fZnVsbCA9IHRyYW5zaWVudF9mcmFjdGlvbl9mdWxsOwotCi0JdGMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdHJhbnNpZW50X2MpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXRjKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXRjLT5uZXh0X2ZyZWUgPSAwOwotCXN0b3JlLT5jb250ZXh0ID0gdGM7Ci0KLQlyZXR1cm4gMDsKKwlkbV9wZXJzaXN0ZW50X3NuYXBzaG90X2V4aXQoKTsKKwlkbV90cmFuc2llbnRfc25hcHNob3RfZXhpdCgpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1leGNlcHRpb24tc3RvcmUuaCBiL2RyaXZlcnMvbWQvZG0tZXhjZXB0aW9uLXN0b3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI5ZjMzZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWQvZG0tZXhjZXB0aW9uLXN0b3JlLmgKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBTaXN0aW5hIFNvZnR3YXJlIChVSykgTGltaXRlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogRGV2aWNlLW1hcHBlciBzbmFwc2hvdCBleGNlcHRpb24gc3RvcmUuCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCisgKi8KKworI2lmbmRlZiBfTElOVVhfRE1fRVhDRVBUSU9OX1NUT1JFCisjZGVmaW5lIF9MSU5VWF9ETV9FWENFUFRJT05fU1RPUkUKKworI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS1tYXBwZXIuaD4KKworLyoKKyAqIFRoZSBzbmFwc2hvdCBjb2RlIGRlYWxzIHdpdGggbGFyZ2lzaCBjaHVua3Mgb2YgdGhlIGRpc2sgYXQgYQorICogdGltZS4gVHlwaWNhbGx5IDMyayAtIDUxMmsuCisgKi8KK3R5cGVkZWYgc2VjdG9yX3QgY2h1bmtfdDsKKworLyoKKyAqIEFuIGV4Y2VwdGlvbiBpcyB1c2VkIHdoZXJlIGFuIG9sZCBjaHVuayBvZiBkYXRhIGhhcyBiZWVuCisgKiByZXBsYWNlZCBieSBhIG5ldyBvbmUuCisgKiBJZiBjaHVua190IGlzIDY0IGJpdHMgaW4gc2l6ZSwgdGhlIHRvcCA4IGJpdHMgb2YgbmV3X2NodW5rIGhvbGQgdGhlIG51bWJlcgorICogb2YgY2h1bmtzIHRoYXQgZm9sbG93IGNvbnRpZ3VvdXNseS4gIFJlbWFpbmluZyBiaXRzIGhvbGQgdGhlIG51bWJlciBvZiB0aGUKKyAqIGNodW5rIHdpdGhpbiB0aGUgZGV2aWNlLgorICovCitzdHJ1Y3QgZG1fc25hcF9leGNlcHRpb24geworCXN0cnVjdCBsaXN0X2hlYWQgaGFzaF9saXN0OworCisJY2h1bmtfdCBvbGRfY2h1bms7CisJY2h1bmtfdCBuZXdfY2h1bms7Cit9OworCisvKgorICogQWJzdHJhY3Rpb24gdG8gaGFuZGxlIHRoZSBtZXRhL2xheW91dCBvZiBleGNlcHRpb24gc3RvcmVzICh0aGUKKyAqIENPVyBkZXZpY2UpLgorICovCitzdHJ1Y3QgZG1fZXhjZXB0aW9uX3N0b3JlIHsKKwkvKgorCSAqIERlc3Ryb3lzIHRoaXMgb2JqZWN0IHdoZW4geW91J3ZlIGZpbmlzaGVkIHdpdGggaXQuCisJICovCisJdm9pZCAoKmRlc3Ryb3kpIChzdHJ1Y3QgZG1fZXhjZXB0aW9uX3N0b3JlICpzdG9yZSk7CisKKwkvKgorCSAqIFRoZSB0YXJnZXQgc2hvdWxkbid0IHJlYWQgdGhlIENPVyBkZXZpY2UgdW50aWwgdGhpcyBpcworCSAqIGNhbGxlZC4gIEFzIGV4Y2VwdGlvbnMgYXJlIHJlYWQgZnJvbSB0aGUgQ09XLCB0aGV5IGFyZQorCSAqIHJlcG9ydGVkIGJhY2sgdmlhIHRoZSBjYWxsYmFjay4KKwkgKi8KKwlpbnQgKCpyZWFkX21ldGFkYXRhKSAoc3RydWN0IGRtX2V4Y2VwdGlvbl9zdG9yZSAqc3RvcmUsCisJCQkgICAgICBpbnQgKCpjYWxsYmFjaykodm9pZCAqY2FsbGJhY2tfY29udGV4dCwKKwkJCQkJICAgICAgY2h1bmtfdCBvbGQsIGNodW5rX3QgbmV3KSwKKwkJCSAgICAgIHZvaWQgKmNhbGxiYWNrX2NvbnRleHQpOworCisJLyoKKwkgKiBGaW5kIHNvbWV3aGVyZSB0byBzdG9yZSB0aGUgbmV4dCBleGNlcHRpb24uCisJICovCisJaW50ICgqcHJlcGFyZV9leGNlcHRpb24pIChzdHJ1Y3QgZG1fZXhjZXB0aW9uX3N0b3JlICpzdG9yZSwKKwkJCQkgIHN0cnVjdCBkbV9zbmFwX2V4Y2VwdGlvbiAqZSk7CisKKwkvKgorCSAqIFVwZGF0ZSB0aGUgbWV0YWRhdGEgd2l0aCB0aGlzIGV4Y2VwdGlvbi4KKwkgKi8KKwl2b2lkICgqY29tbWl0X2V4Y2VwdGlvbikgKHN0cnVjdCBkbV9leGNlcHRpb25fc3RvcmUgKnN0b3JlLAorCQkJCSAgc3RydWN0IGRtX3NuYXBfZXhjZXB0aW9uICplLAorCQkJCSAgdm9pZCAoKmNhbGxiYWNrKSAodm9pZCAqLCBpbnQgc3VjY2VzcyksCisJCQkJICB2b2lkICpjYWxsYmFja19jb250ZXh0KTsKKworCS8qCisJICogVGhlIHNuYXBzaG90IGlzIGludmFsaWQsIG5vdGUgdGhpcyBpbiB0aGUgbWV0YWRhdGEuCisJICovCisJdm9pZCAoKmRyb3Bfc25hcHNob3QpIChzdHJ1Y3QgZG1fZXhjZXB0aW9uX3N0b3JlICpzdG9yZSk7CisKKwlpbnQgKCpzdGF0dXMpIChzdHJ1Y3QgZG1fZXhjZXB0aW9uX3N0b3JlICpzdG9yZSwgc3RhdHVzX3R5cGVfdCBzdGF0dXMsCisJCSAgICAgICBjaGFyICpyZXN1bHQsIHVuc2lnbmVkIGludCBtYXhsZW4pOworCisJLyoKKwkgKiBSZXR1cm4gaG93IGZ1bGwgdGhlIHNuYXBzaG90IGlzLgorCSAqLworCXZvaWQgKCpmcmFjdGlvbl9mdWxsKSAoc3RydWN0IGRtX2V4Y2VwdGlvbl9zdG9yZSAqc3RvcmUsCisJCQkgICAgICAgc2VjdG9yX3QgKm51bWVyYXRvciwKKwkJCSAgICAgICBzZWN0b3JfdCAqZGVub21pbmF0b3IpOworCisJc3RydWN0IGRtX3NuYXBzaG90ICpzbmFwOworCXZvaWQgKmNvbnRleHQ7Cit9OworCisvKgorICogRnVudGlvbnMgdG8gbWFuaXB1bGF0ZSBjb25zZWN1dGl2ZSBjaHVua3MKKyAqLworIyAgaWYgZGVmaW5lZChDT05GSUdfTEJEKSB8fCAoQklUU19QRVJfTE9ORyA9PSA2NCkKKyMgICAgZGVmaW5lIERNX0NIVU5LX0NPTlNFQ1VUSVZFX0JJVFMgOAorIyAgICBkZWZpbmUgRE1fQ0hVTktfTlVNQkVSX0JJVFMgNTYKKworc3RhdGljIGlubGluZSBjaHVua190IGRtX2NodW5rX251bWJlcihjaHVua190IGNodW5rKQoreworCXJldHVybiBjaHVuayAmIChjaHVua190KSgoMVVMTCA8PCBETV9DSFVOS19OVU1CRVJfQklUUykgLSAxVUxMKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBkbV9jb25zZWN1dGl2ZV9jaHVua19jb3VudChzdHJ1Y3QgZG1fc25hcF9leGNlcHRpb24gKmUpCit7CisJcmV0dXJuIGUtPm5ld19jaHVuayA+PiBETV9DSFVOS19OVU1CRVJfQklUUzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRtX2NvbnNlY3V0aXZlX2NodW5rX2NvdW50X2luYyhzdHJ1Y3QgZG1fc25hcF9leGNlcHRpb24gKmUpCit7CisJZS0+bmV3X2NodW5rICs9ICgxVUxMIDw8IERNX0NIVU5LX05VTUJFUl9CSVRTKTsKKworCUJVR19PTighZG1fY29uc2VjdXRpdmVfY2h1bmtfY291bnQoZSkpOworfQorCisjICBlbHNlCisjICAgIGRlZmluZSBETV9DSFVOS19DT05TRUNVVElWRV9CSVRTIDAKKworc3RhdGljIGlubGluZSBjaHVua190IGRtX2NodW5rX251bWJlcihjaHVua190IGNodW5rKQoreworCXJldHVybiBjaHVuazsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBkbV9jb25zZWN1dGl2ZV9jaHVua19jb3VudChzdHJ1Y3QgZG1fc25hcF9leGNlcHRpb24gKmUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkbV9jb25zZWN1dGl2ZV9jaHVua19jb3VudF9pbmMoc3RydWN0IGRtX3NuYXBfZXhjZXB0aW9uICplKQoreworfQorCisjICBlbmRpZgorCitpbnQgZG1fZXhjZXB0aW9uX3N0b3JlX2luaXQodm9pZCk7Cit2b2lkIGRtX2V4Y2VwdGlvbl9zdG9yZV9leGl0KHZvaWQpOworCisvKgorICogVHdvIGV4Y2VwdGlvbiBzdG9yZSBpbXBsZW1lbnRhdGlvbnMuCisgKi8KK2ludCBkbV9wZXJzaXN0ZW50X3NuYXBzaG90X2luaXQodm9pZCk7Cit2b2lkIGRtX3BlcnNpc3RlbnRfc25hcHNob3RfZXhpdCh2b2lkKTsKKworaW50IGRtX3RyYW5zaWVudF9zbmFwc2hvdF9pbml0KHZvaWQpOwordm9pZCBkbV90cmFuc2llbnRfc25hcHNob3RfZXhpdCh2b2lkKTsKKworaW50IGRtX2NyZWF0ZV9wZXJzaXN0ZW50KHN0cnVjdCBkbV9leGNlcHRpb25fc3RvcmUgKnN0b3JlKTsKKworaW50IGRtX2NyZWF0ZV90cmFuc2llbnQoc3RydWN0IGRtX2V4Y2VwdGlvbl9zdG9yZSAqc3RvcmUpOworCisjZW5kaWYgLyogX0xJTlVYX0RNX0VYQ0VQVElPTl9TVE9SRSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1pb2N0bC5jIGIvZHJpdmVycy9tZC9kbS1pb2N0bC5jCmluZGV4IDc3N2M5NDguLjU0ZDA1ODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0taW9jdGwuYworKysgYi9kcml2ZXJzL21kL2RtLWlvY3RsLmMKQEAgLTIzMyw3ICsyMzMsNyBAQAogCX0KIAogCWlmIChoYy0+bmV3X21hcCkKLQkJZG1fdGFibGVfcHV0KGhjLT5uZXdfbWFwKTsKKwkJZG1fdGFibGVfZGVzdHJveShoYy0+bmV3X21hcCk7CiAJZG1fcHV0KGhjLT5tZCk7CiAJZnJlZV9jZWxsKGhjKTsKIH0KQEAgLTgyNyw4ICs4MjcsOCBAQAogCiAJCXIgPSBkbV9zd2FwX3RhYmxlKG1kLCBuZXdfbWFwKTsKIAkJaWYgKHIpIHsKKwkJCWRtX3RhYmxlX2Rlc3Ryb3kobmV3X21hcCk7CiAJCQlkbV9wdXQobWQpOwotCQkJZG1fdGFibGVfcHV0KG5ld19tYXApOwogCQkJcmV0dXJuIHI7CiAJCX0KIApAQCAtODM2LDggKzgzNiw2IEBACiAJCQlzZXRfZGlza19ybyhkbV9kaXNrKG1kKSwgMCk7CiAJCWVsc2UKIAkJCXNldF9kaXNrX3JvKGRtX2Rpc2sobWQpLCAxKTsKLQotCQlkbV90YWJsZV9wdXQobmV3X21hcCk7CiAJfQogCiAJaWYgKGRtX3N1c3BlbmRlZChtZCkpCkBAIC0xMDgwLDcgKzEwNzgsNyBAQAogCX0KIAogCWlmIChoYy0+bmV3X21hcCkKLQkJZG1fdGFibGVfcHV0KGhjLT5uZXdfbWFwKTsKKwkJZG1fdGFibGVfZGVzdHJveShoYy0+bmV3X21hcCk7CiAJaGMtPm5ld19tYXAgPSB0OwogCXVwX3dyaXRlKCZfaGFzaF9sb2NrKTsKIApAQCAtMTEwOSw3ICsxMTA3LDcgQEAKIAl9CiAKIAlpZiAoaGMtPm5ld19tYXApIHsKLQkJZG1fdGFibGVfcHV0KGhjLT5uZXdfbWFwKTsKKwkJZG1fdGFibGVfZGVzdHJveShoYy0+bmV3X21hcCk7CiAJCWhjLT5uZXdfbWFwID0gTlVMTDsKIAl9CiAKQEAgLTE1NTAsOCArMTU0OCwxMCBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlzdHJjcHkobmFtZSwgaGMtPm5hbWUpOwotCXN0cmNweSh1dWlkLCBoYy0+dXVpZCA/IDogIiIpOworCWlmIChuYW1lKQorCQlzdHJjcHkobmFtZSwgaGMtPm5hbWUpOworCWlmICh1dWlkKQorCQlzdHJjcHkodXVpZCwgaGMtPnV1aWQgPyA6ICIiKTsKIAogb3V0OgogCXVwX3JlYWQoJl9oYXNoX2xvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1saW5lYXIuYyBiL2RyaXZlcnMvbWQvZG0tbGluZWFyLmMKaW5kZXggNDQwNDJiZS4uYmZhMTA3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1saW5lYXIuYworKysgYi9kcml2ZXJzL21kL2RtLWxpbmVhci5jCkBAIC0xNDIsNiArMTQyLDcgQEAKIAkuc3RhdHVzID0gbGluZWFyX3N0YXR1cywKIAkuaW9jdGwgID0gbGluZWFyX2lvY3RsLAogCS5tZXJnZSAgPSBsaW5lYXJfbWVyZ2UsCisJLmZlYXR1cmVzID0gRE1fVEFSR0VUX1NVUFBPUlRTX0JBUlJJRVJTLAogfTsKIAogaW50IF9faW5pdCBkbV9saW5lYXJfaW5pdCh2b2lkKQpAQCAtMTU2LDggKzE1Nyw1IEBACiAKIHZvaWQgZG1fbGluZWFyX2V4aXQodm9pZCkKIHsKLQlpbnQgciA9IGRtX3VucmVnaXN0ZXJfdGFyZ2V0KCZsaW5lYXJfdGFyZ2V0KTsKLQotCWlmIChyIDwgMCkKLQkJRE1FUlIoInVucmVnaXN0ZXIgZmFpbGVkICVkIiwgcik7CisJZG1fdW5yZWdpc3Rlcl90YXJnZXQoJmxpbmVhcl90YXJnZXQpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1sb2cuYyBiL2RyaXZlcnMvbWQvZG0tbG9nLmMKaW5kZXggYThjMGZjNy4uNzM3OTYxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1sb2cuYworKysgYi9kcml2ZXJzL21kL2RtLWxvZy5jCkBAIC0zMjYsOCArMzI2LDYgQEAKIHN0YXRpYyBpbnQgcndfaGVhZGVyKHN0cnVjdCBsb2dfYyAqbGMsIGludCBydykKIHsKIAlsYy0+aW9fcmVxLmJpX3J3ID0gcnc7Ci0JbGMtPmlvX3JlcS5tZW0ucHRyLnZtYSA9IGxjLT5kaXNrX2hlYWRlcjsKLQlsYy0+aW9fcmVxLm5vdGlmeS5mbiA9IE5VTEw7CiAKIAlyZXR1cm4gZG1faW8oJmxjLT5pb19yZXEsIDEsICZsYy0+aGVhZGVyX2xvY2F0aW9uLCBOVUxMKTsKIH0KQEAgLTM2MiwxMCArMzYwLDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHdyaXRlX2hlYWRlcihzdHJ1Y3QgbG9nX2MgKmxvZykKK3N0YXRpYyBpbnQgX2NoZWNrX3JlZ2lvbl9zaXplKHN0cnVjdCBkbV90YXJnZXQgKnRpLCB1aW50MzJfdCByZWdpb25fc2l6ZSkKIHsKLQloZWFkZXJfdG9fZGlzaygmbG9nLT5oZWFkZXIsIGxvZy0+ZGlza19oZWFkZXIpOwotCXJldHVybiByd19oZWFkZXIobG9nLCBXUklURSk7CisJaWYgKHJlZ2lvbl9zaXplIDwgMiB8fCByZWdpb25fc2l6ZSA+IHRpLT5sZW4pCisJCXJldHVybiAwOworCisJaWYgKCFpc19wb3dlcl9vZl8yKHJlZ2lvbl9zaXplKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00MDMsOCArNDA2LDkgQEAKIAkJfQogCX0KIAotCWlmIChzc2NhbmYoYXJndlswXSwgIiV1IiwgJnJlZ2lvbl9zaXplKSAhPSAxKSB7Ci0JCURNV0FSTigiaW52YWxpZCByZWdpb24gc2l6ZSBzdHJpbmciKTsKKwlpZiAoc3NjYW5mKGFyZ3ZbMF0sICIldSIsICZyZWdpb25fc2l6ZSkgIT0gMSB8fAorCSAgICAhX2NoZWNrX3JlZ2lvbl9zaXplKHRpLCByZWdpb25fc2l6ZSkpIHsKKwkJRE1XQVJOKCJpbnZhbGlkIHJlZ2lvbiBzaXplICVzIiwgYXJndlswXSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNDUzLDggKzQ1NywxOCBAQAogCQkgKi8KIAkJYnVmX3NpemUgPSBkbV9yb3VuZF91cCgoTE9HX09GRlNFVCA8PCBTRUNUT1JfU0hJRlQpICsKIAkJCQkgICAgICAgYml0c2V0X3NpemUsIHRpLT5saW1pdHMuaGFyZHNlY3Rfc2l6ZSk7CisKKwkJaWYgKGJ1Zl9zaXplID4gZGV2LT5iZGV2LT5iZF9pbm9kZS0+aV9zaXplKSB7CisJCQlETVdBUk4oImxvZyBkZXZpY2UgJXMgdG9vIHNtYWxsOiBuZWVkICVsbHUgYnl0ZXMiLAorCQkJCWRldi0+bmFtZSwgKHVuc2lnbmVkIGxvbmcgbG9uZylidWZfc2l6ZSk7CisJCQlrZnJlZShsYyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCiAJCWxjLT5oZWFkZXJfbG9jYXRpb24uY291bnQgPSBidWZfc2l6ZSA+PiBTRUNUT1JfU0hJRlQ7CisKIAkJbGMtPmlvX3JlcS5tZW0udHlwZSA9IERNX0lPX1ZNQTsKKwkJbGMtPmlvX3JlcS5ub3RpZnkuZm4gPSBOVUxMOwogCQlsYy0+aW9fcmVxLmNsaWVudCA9IGRtX2lvX2NsaWVudF9jcmVhdGUoZG1fZGl2X3VwKGJ1Zl9zaXplLAogCQkJCQkJCQkgICBQQUdFX1NJWkUpKTsKIAkJaWYgKElTX0VSUihsYy0+aW9fcmVxLmNsaWVudCkpIHsKQEAgLTQ2NywxMCArNDgxLDEyIEBACiAJCWxjLT5kaXNrX2hlYWRlciA9IHZtYWxsb2MoYnVmX3NpemUpOwogCQlpZiAoIWxjLT5kaXNrX2hlYWRlcikgewogCQkJRE1XQVJOKCJjb3VsZG4ndCBhbGxvY2F0ZSBkaXNrIGxvZyBidWZmZXIiKTsKKwkJCWRtX2lvX2NsaWVudF9kZXN0cm95KGxjLT5pb19yZXEuY2xpZW50KTsKIAkJCWtmcmVlKGxjKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAKKwkJbGMtPmlvX3JlcS5tZW0ucHRyLnZtYSA9IGxjLT5kaXNrX2hlYWRlcjsKIAkJbGMtPmNsZWFuX2JpdHMgPSAodm9pZCAqKWxjLT5kaXNrX2hlYWRlciArCiAJCQkJIChMT0dfT0ZGU0VUIDw8IFNFQ1RPUl9TSElGVCk7CiAJfQpAQCAtNDgyLDYgKzQ5OCw4IEBACiAJCURNV0FSTigiY291bGRuJ3QgYWxsb2NhdGUgc3luYyBiaXRzZXQiKTsKIAkJaWYgKCFkZXYpCiAJCQl2ZnJlZShsYy0+Y2xlYW5fYml0cyk7CisJCWVsc2UKKwkJCWRtX2lvX2NsaWVudF9kZXN0cm95KGxjLT5pb19yZXEuY2xpZW50KTsKIAkJdmZyZWUobGMtPmRpc2tfaGVhZGVyKTsKIAkJa2ZyZWUobGMpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTQ5NSw2ICs1MTMsOCBAQAogCQl2ZnJlZShsYy0+c3luY19iaXRzKTsKIAkJaWYgKCFkZXYpCiAJCQl2ZnJlZShsYy0+Y2xlYW5fYml0cyk7CisJCWVsc2UKKwkJCWRtX2lvX2NsaWVudF9kZXN0cm95KGxjLT5pb19yZXEuY2xpZW50KTsKIAkJdmZyZWUobGMtPmRpc2tfaGVhZGVyKTsKIAkJa2ZyZWUobGMpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTYzMSw4ICs2NTEsMTAgQEAKIAkvKiBzZXQgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIHJlZ2lvbnMgaW4gdGhlIGhlYWRlciAqLwogCWxjLT5oZWFkZXIubnJfcmVnaW9ucyA9IGxjLT5yZWdpb25fY291bnQ7CiAKKwloZWFkZXJfdG9fZGlzaygmbGMtPmhlYWRlciwgbGMtPmRpc2tfaGVhZGVyKTsKKwogCS8qIHdyaXRlIHRoZSBuZXcgaGVhZGVyICovCi0JciA9IHdyaXRlX2hlYWRlcihsYyk7CisJciA9IHJ3X2hlYWRlcihsYywgV1JJVEUpOwogCWlmIChyKSB7CiAJCURNV0FSTigiJXM6IEZhaWxlZCB0byB3cml0ZSBoZWFkZXIgb24gZGlydHkgcmVnaW9uIGxvZyBkZXZpY2UiLAogCQkgICAgICAgbGMtPmxvZ19kZXYtPm5hbWUpOwpAQCAtNjgyLDcgKzcwNCw3IEBACiAJaWYgKCFsYy0+dG91Y2hlZCkKIAkJcmV0dXJuIDA7CiAKLQlyID0gd3JpdGVfaGVhZGVyKGxjKTsKKwlyID0gcndfaGVhZGVyKGxjLCBXUklURSk7CiAJaWYgKHIpCiAJCWZhaWxfbG9nX2RldmljZShsYyk7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1tcGF0aC5jIGIvZHJpdmVycy9tZC9kbS1tcGF0aC5jCmluZGV4IDNkN2Y0OTIuLjA5NWY3N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tbXBhdGguYworKysgYi9kcml2ZXJzL21kL2RtLW1wYXRoLmMKQEAgLTg4OSw3ICs4ODksNyBAQAogCWRtX3BhdGhfdWV2ZW50KERNX1VFVkVOVF9QQVRIX0ZBSUxFRCwgbS0+dGksCiAJCSAgICAgIHBncGF0aC0+cGF0aC5kZXYtPm5hbWUsIG0tPm5yX3ZhbGlkX3BhdGhzKTsKIAotCXF1ZXVlX3dvcmsoa211bHRpcGF0aGQsICZtLT50cmlnZ2VyX2V2ZW50KTsKKwlzY2hlZHVsZV93b3JrKCZtLT50cmlnZ2VyX2V2ZW50KTsKIAlxdWV1ZV93b3JrKGttdWx0aXBhdGhkLCAmcGdwYXRoLT5kZWFjdGl2YXRlX3BhdGgpOwogCiBvdXQ6CkBAIC05MzIsNyArOTMyLDcgQEAKIAlkbV9wYXRoX3VldmVudChETV9VRVZFTlRfUEFUSF9SRUlOU1RBVEVELCBtLT50aSwKIAkJICAgICAgcGdwYXRoLT5wYXRoLmRldi0+bmFtZSwgbS0+bnJfdmFsaWRfcGF0aHMpOwogCi0JcXVldWVfd29yayhrbXVsdGlwYXRoZCwgJm0tPnRyaWdnZXJfZXZlbnQpOworCXNjaGVkdWxlX3dvcmsoJm0tPnRyaWdnZXJfZXZlbnQpOwogCiBvdXQ6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbS0+bG9jaywgZmxhZ3MpOwpAQCAtOTc2LDcgKzk3Niw3IEBACiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtLT5sb2NrLCBmbGFncyk7CiAKLQlxdWV1ZV93b3JrKGttdWx0aXBhdGhkLCAmbS0+dHJpZ2dlcl9ldmVudCk7CisJc2NoZWR1bGVfd29yaygmbS0+dHJpZ2dlcl9ldmVudCk7CiB9CiAKIC8qCkBAIC0xMDA2LDcgKzEwMDYsNyBAQAogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtLT5sb2NrLCBmbGFncyk7CiAKLQlxdWV1ZV93b3JrKGttdWx0aXBhdGhkLCAmbS0+dHJpZ2dlcl9ldmVudCk7CisJc2NoZWR1bGVfd29yaygmbS0+dHJpZ2dlcl9ldmVudCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE0OTUsMTQgKzE0OTUsMTAgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IGRtX211bHRpcGF0aF9leGl0KHZvaWQpCiB7Ci0JaW50IHI7Ci0KIAlkZXN0cm95X3dvcmtxdWV1ZShrbXBhdGhfaGFuZGxlcmQpOwogCWRlc3Ryb3lfd29ya3F1ZXVlKGttdWx0aXBhdGhkKTsKIAotCXIgPSBkbV91bnJlZ2lzdGVyX3RhcmdldCgmbXVsdGlwYXRoX3RhcmdldCk7Ci0JaWYgKHIgPCAwKQotCQlETUVSUigidGFyZ2V0IHVucmVnaXN0ZXIgZmFpbGVkICVkIiwgcik7CisJZG1fdW5yZWdpc3Rlcl90YXJnZXQoJm11bHRpcGF0aF90YXJnZXQpOwogCWttZW1fY2FjaGVfZGVzdHJveShfbXBpb19jYWNoZSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tcmFpZDEuYyBiL2RyaXZlcnMvbWQvZG0tcmFpZDEuYwppbmRleCBlYzQzZjlmLi40ZDZiYzEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLXJhaWQxLmMKKysrIGIvZHJpdmVycy9tZC9kbS1yYWlkMS5jCkBAIC0xOTcsOSArMTk3LDYgQEAKIAlzdHJ1Y3QgbWlycm9yX3NldCAqbXMgPSBtLT5tczsKIAlzdHJ1Y3QgbWlycm9yICpuZXc7CiAKLQlpZiAoIWVycm9yc19oYW5kbGVkKG1zKSkKLQkJcmV0dXJuOwotCiAJLyoKIAkgKiBlcnJvcl9jb3VudCBpcyB1c2VkIGZvciBub3RoaW5nIG1vcmUgdGhhbiBhCiAJICogc2ltcGxlIHdheSB0byB0ZWxsIGlmIGEgZGV2aWNlIGhhcyBlbmNvdW50ZXJlZApAQCAtMjEwLDYgKzIwNyw5IEBACiAJaWYgKHRlc3RfYW5kX3NldF9iaXQoZXJyb3JfdHlwZSwgJm0tPmVycm9yX3R5cGUpKQogCQlyZXR1cm47CiAKKwlpZiAoIWVycm9yc19oYW5kbGVkKG1zKSkKKwkJcmV0dXJuOworCiAJaWYgKG0gIT0gZ2V0X2RlZmF1bHRfbWlycm9yKG1zKSkKIAkJZ290byBvdXQ7CiAKQEAgLTgwOCwxMiArODA4LDYgQEAKIAlrZnJlZShtcyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IF9jaGVja19yZWdpb25fc2l6ZShzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgdWludDMyX3Qgc2l6ZSkKLXsKLQlyZXR1cm4gIShzaXplICUgKFBBR0VfU0laRSA+PiA5KSB8fCAhaXNfcG93ZXJfb2ZfMihzaXplKSB8fAotCQkgc2l6ZSA+IHRpLT5sZW4pOwotfQotCiBzdGF0aWMgaW50IGdldF9taXJyb3Ioc3RydWN0IG1pcnJvcl9zZXQgKm1zLCBzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwKIAkJICAgICAgdW5zaWduZWQgaW50IG1pcnJvciwgY2hhciAqKmFyZ3YpCiB7CkBAIC04NzIsMTIgKzg2Niw2IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAotCWlmICghX2NoZWNrX3JlZ2lvbl9zaXplKHRpLCBkbC0+dHlwZS0+Z2V0X3JlZ2lvbl9zaXplKGRsKSkpIHsKLQkJdGktPmVycm9yID0gIkludmFsaWQgcmVnaW9uIHNpemUiOwotCQlkbV9kaXJ0eV9sb2dfZGVzdHJveShkbCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQogCXJldHVybiBkbDsKIH0KIApAQCAtMTMwMCwxMSArMTI4OCw3IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBkbV9taXJyb3JfZXhpdCh2b2lkKQogewotCWludCByOwotCi0JciA9IGRtX3VucmVnaXN0ZXJfdGFyZ2V0KCZtaXJyb3JfdGFyZ2V0KTsKLQlpZiAociA8IDApCi0JCURNRVJSKCJ1bnJlZ2lzdGVyIGZhaWxlZCAlZCIsIHIpOworCWRtX3VucmVnaXN0ZXJfdGFyZ2V0KCZtaXJyb3JfdGFyZ2V0KTsKIH0KIAogLyogTW9kdWxlIGhvb2tzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXNuYXAtcGVyc2lzdGVudC5jIGIvZHJpdmVycy9tZC9kbS1zbmFwLXBlcnNpc3RlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzZiMzRlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZC9kbS1zbmFwLXBlcnNpc3RlbnQuYwpAQCAtMCwwICsxLDcwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIFNpc3RpbmEgU29mdHdhcmUgKFVLKSBMaW1pdGVkLgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggUmVkIEhhdCBHbWJICisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCisgKi8KKworI2luY2x1ZGUgImRtLWV4Y2VwdGlvbi1zdG9yZS5oIgorI2luY2x1ZGUgImRtLXNuYXAuaCIKKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZG0taW8uaD4KKworI2RlZmluZSBETV9NU0dfUFJFRklYICJwZXJzaXN0ZW50IHNuYXBzaG90IgorI2RlZmluZSBETV9DSFVOS19TSVpFX0RFRkFVTFRfU0VDVE9SUyAzMgkvKiAxNktCICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFBlcnNpc3RlbnQgc25hcHNob3RzLCBieSBwZXJzaXN0ZW50IHdlIG1lYW4gdGhhdCB0aGUgc25hcHNob3QKKyAqIHdpbGwgc3Vydml2ZSBhIHJlYm9vdC4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFdlIG5lZWQgdG8gc3RvcmUgYSByZWNvcmQgb2Ygd2hpY2ggcGFydHMgb2YgdGhlIG9yaWdpbiBoYXZlCisgKiBiZWVuIGNvcGllZCB0byB0aGUgc25hcHNob3QgZGV2aWNlLiAgVGhlIHNuYXBzaG90IGNvZGUKKyAqIHJlcXVpcmVzIHRoYXQgd2UgY29weSBleGNlcHRpb24gY2h1bmtzIHRvIGNodW5rIGFsaWduZWQgYXJlYXMKKyAqIG9mIHRoZSBDT1cgc3RvcmUuICBJdCBtYWtlcyBzZW5zZSB0aGVyZWZvcmUsIHRvIHN0b3JlIHRoZQorICogbWV0YWRhdGEgaW4gY2h1bmsgc2l6ZSBibG9ja3MuCisgKgorICogVGhlcmUgaXMgbm8gYmFja3dhcmQgb3IgZm9yd2FyZCBjb21wYXRpYmlsaXR5IGltcGxlbWVudGVkLAorICogc25hcHNob3RzIHdpdGggZGlmZmVyZW50IGRpc2sgdmVyc2lvbnMgdGhhbiB0aGUga2VybmVsIHdpbGwKKyAqIG5vdCBiZSB1c2FibGUuICBJdCBpcyBleHBlY3RlZCB0aGF0ICJsdmNyZWF0ZSIgd2lsbCBibGFuayBvdXQKKyAqIHRoZSBzdGFydCBvZiBhIGZyZXNoIENPVyBkZXZpY2UgYmVmb3JlIGNhbGxpbmcgdGhlIHNuYXBzaG90CisgKiBjb25zdHJ1Y3Rvci4KKyAqCisgKiBUaGUgZmlyc3QgY2h1bmsgb2YgdGhlIENPVyBkZXZpY2UganVzdCBjb250YWlucyB0aGUgaGVhZGVyLgorICogQWZ0ZXIgdGhpcyB0aGVyZSBpcyBhIGNodW5rIGZpbGxlZCB3aXRoIGV4Y2VwdGlvbiBtZXRhZGF0YSwKKyAqIGZvbGxvd2VkIGJ5IGFzIG1hbnkgZXhjZXB0aW9uIGNodW5rcyBhcyBjYW4gZml0IGluIHRoZQorICogbWV0YWRhdGEgYXJlYXMuCisgKgorICogQWxsIG9uIGRpc2sgc3RydWN0dXJlcyBhcmUgaW4gbGl0dGxlLWVuZGlhbiBmb3JtYXQuICBUaGUgZW5kCisgKiBvZiB0aGUgZXhjZXB0aW9ucyBpbmZvIGlzIGluZGljYXRlZCBieSBhbiBleGNlcHRpb24gd2l0aCBhCisgKiBuZXdfY2h1bmsgb2YgMCwgd2hpY2ggaXMgaW52YWxpZCBzaW5jZSBpdCB3b3VsZCBwb2ludCB0byB0aGUKKyAqIGhlYWRlciBjaHVuay4KKyAqLworCisvKgorICogTWFnaWMgZm9yIHBlcnNpc3RlbnQgc25hcHNob3RzOiAiU25BcCIgLSBGZWVibGUgaXNuJ3QgaXQuCisgKi8KKyNkZWZpbmUgU05BUF9NQUdJQyAweDcwNDE2ZTUzCisKKy8qCisgKiBUaGUgb24tZGlzayB2ZXJzaW9uIG9mIHRoZSBtZXRhZGF0YS4KKyAqLworI2RlZmluZSBTTkFQU0hPVF9ESVNLX1ZFUlNJT04gMQorCitzdHJ1Y3QgZGlza19oZWFkZXIgeworCXVpbnQzMl90IG1hZ2ljOworCisJLyoKKwkgKiBJcyB0aGlzIHNuYXBzaG90IHZhbGlkLiAgVGhlcmUgaXMgbm8gd2F5IG9mIHJlY292ZXJpbmcKKwkgKiBhbiBpbnZhbGlkIHNuYXBzaG90LgorCSAqLworCXVpbnQzMl90IHZhbGlkOworCisJLyoKKwkgKiBTaW1wbGUsIGluY3JlbWVudGluZyB2ZXJzaW9uLiBubyBiYWNrd2FyZAorCSAqIGNvbXBhdGliaWxpdHkuCisJICovCisJdWludDMyX3QgdmVyc2lvbjsKKworCS8qIEluIHNlY3RvcnMgKi8KKwl1aW50MzJfdCBjaHVua19zaXplOworfTsKKworc3RydWN0IGRpc2tfZXhjZXB0aW9uIHsKKwl1aW50NjRfdCBvbGRfY2h1bms7CisJdWludDY0X3QgbmV3X2NodW5rOworfTsKKworc3RydWN0IGNvbW1pdF9jYWxsYmFjayB7CisJdm9pZCAoKmNhbGxiYWNrKSh2b2lkICosIGludCBzdWNjZXNzKTsKKwl2b2lkICpjb250ZXh0OworfTsKKworLyoKKyAqIFRoZSB0b3AgbGV2ZWwgc3RydWN0dXJlIGZvciBhIHBlcnNpc3RlbnQgZXhjZXB0aW9uIHN0b3JlLgorICovCitzdHJ1Y3QgcHN0b3JlIHsKKwlzdHJ1Y3QgZG1fc25hcHNob3QgKnNuYXA7CS8qIHVwIHBvaW50ZXIgdG8gbXkgc25hcHNob3QgKi8KKwlpbnQgdmVyc2lvbjsKKwlpbnQgdmFsaWQ7CisJdWludDMyX3QgZXhjZXB0aW9uc19wZXJfYXJlYTsKKworCS8qCisJICogTm93IHRoYXQgd2UgaGF2ZSBhbiBhc3luY2hyb25vdXMga2NvcHlkIHRoZXJlIGlzIG5vCisJICogbmVlZCBmb3IgbGFyZ2UgY2h1bmsgc2l6ZXMsIHNvIGl0IHdvbnQgaHVydCB0byBoYXZlIGEKKwkgKiB3aG9sZSBjaHVua3Mgd29ydGggb2YgbWV0YWRhdGEgaW4gbWVtb3J5IGF0IG9uY2UuCisJICovCisJdm9pZCAqYXJlYTsKKworCS8qCisJICogQW4gYXJlYSBvZiB6ZXJvcyB1c2VkIHRvIGNsZWFyIHRoZSBuZXh0IGFyZWEuCisJICovCisJdm9pZCAqemVyb19hcmVhOworCisJLyoKKwkgKiBVc2VkIHRvIGtlZXAgdHJhY2sgb2Ygd2hpY2ggbWV0YWRhdGEgYXJlYSB0aGUgZGF0YSBpbgorCSAqICdjaHVuaycgcmVmZXJzIHRvLgorCSAqLworCWNodW5rX3QgY3VycmVudF9hcmVhOworCisJLyoKKwkgKiBUaGUgbmV4dCBmcmVlIGNodW5rIGZvciBhbiBleGNlcHRpb24uCisJICovCisJY2h1bmtfdCBuZXh0X2ZyZWU7CisKKwkvKgorCSAqIFRoZSBpbmRleCBvZiBuZXh0IGZyZWUgZXhjZXB0aW9uIGluIHRoZSBjdXJyZW50CisJICogbWV0YWRhdGEgYXJlYS4KKwkgKi8KKwl1aW50MzJfdCBjdXJyZW50X2NvbW1pdHRlZDsKKworCWF0b21pY190IHBlbmRpbmdfY291bnQ7CisJdWludDMyX3QgY2FsbGJhY2tfY291bnQ7CisJc3RydWN0IGNvbW1pdF9jYWxsYmFjayAqY2FsbGJhY2tzOworCXN0cnVjdCBkbV9pb19jbGllbnQgKmlvX2NsaWVudDsKKworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICptZXRhZGF0YV93cTsKK307CisKK3N0YXRpYyB1bnNpZ25lZCBzZWN0b3JzX3RvX3BhZ2VzKHVuc2lnbmVkIHNlY3RvcnMpCit7CisJcmV0dXJuIERJVl9ST1VORF9VUChzZWN0b3JzLCBQQUdFX1NJWkUgPj4gOSk7Cit9CisKK3N0YXRpYyBpbnQgYWxsb2NfYXJlYShzdHJ1Y3QgcHN0b3JlICpwcykKK3sKKwlpbnQgciA9IC1FTk9NRU07CisJc2l6ZV90IGxlbjsKKworCWxlbiA9IHBzLT5zbmFwLT5jaHVua19zaXplIDw8IFNFQ1RPUl9TSElGVDsKKworCS8qCisJICogQWxsb2NhdGUgdGhlIGNodW5rX3NpemUgYmxvY2sgb2YgbWVtb3J5IHRoYXQgd2lsbCBob2xkCisJICogYSBzaW5nbGUgbWV0YWRhdGEgYXJlYS4KKwkgKi8KKwlwcy0+YXJlYSA9IHZtYWxsb2MobGVuKTsKKwlpZiAoIXBzLT5hcmVhKQorCQlyZXR1cm4gcjsKKworCXBzLT56ZXJvX2FyZWEgPSB2bWFsbG9jKGxlbik7CisJaWYgKCFwcy0+emVyb19hcmVhKSB7CisJCXZmcmVlKHBzLT5hcmVhKTsKKwkJcmV0dXJuIHI7CisJfQorCW1lbXNldChwcy0+emVyb19hcmVhLCAwLCBsZW4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfYXJlYShzdHJ1Y3QgcHN0b3JlICpwcykKK3sKKwl2ZnJlZShwcy0+YXJlYSk7CisJcHMtPmFyZWEgPSBOVUxMOworCXZmcmVlKHBzLT56ZXJvX2FyZWEpOworCXBzLT56ZXJvX2FyZWEgPSBOVUxMOworfQorCitzdHJ1Y3QgbWRhdGFfcmVxIHsKKwlzdHJ1Y3QgZG1faW9fcmVnaW9uICp3aGVyZTsKKwlzdHJ1Y3QgZG1faW9fcmVxdWVzdCAqaW9fcmVxOworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCWludCByZXN1bHQ7Cit9OworCitzdGF0aWMgdm9pZCBkb19tZXRhZGF0YShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IG1kYXRhX3JlcSAqcmVxID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBtZGF0YV9yZXEsIHdvcmspOworCisJcmVxLT5yZXN1bHQgPSBkbV9pbyhyZXEtPmlvX3JlcSwgMSwgcmVxLT53aGVyZSwgTlVMTCk7Cit9CisKKy8qCisgKiBSZWFkIG9yIHdyaXRlIGEgY2h1bmsgYWxpZ25lZCBhbmQgc2l6ZWQgYmxvY2sgb2YgZGF0YSBmcm9tIGEgZGV2aWNlLgorICovCitzdGF0aWMgaW50IGNodW5rX2lvKHN0cnVjdCBwc3RvcmUgKnBzLCBjaHVua190IGNodW5rLCBpbnQgcncsIGludCBtZXRhZGF0YSkKK3sKKwlzdHJ1Y3QgZG1faW9fcmVnaW9uIHdoZXJlID0geworCQkuYmRldiA9IHBzLT5zbmFwLT5jb3ctPmJkZXYsCisJCS5zZWN0b3IgPSBwcy0+c25hcC0+Y2h1bmtfc2l6ZSAqIGNodW5rLAorCQkuY291bnQgPSBwcy0+c25hcC0+Y2h1bmtfc2l6ZSwKKwl9OworCXN0cnVjdCBkbV9pb19yZXF1ZXN0IGlvX3JlcSA9IHsKKwkJLmJpX3J3ID0gcncsCisJCS5tZW0udHlwZSA9IERNX0lPX1ZNQSwKKwkJLm1lbS5wdHIudm1hID0gcHMtPmFyZWEsCisJCS5jbGllbnQgPSBwcy0+aW9fY2xpZW50LAorCQkubm90aWZ5LmZuID0gTlVMTCwKKwl9OworCXN0cnVjdCBtZGF0YV9yZXEgcmVxOworCisJaWYgKCFtZXRhZGF0YSkKKwkJcmV0dXJuIGRtX2lvKCZpb19yZXEsIDEsICZ3aGVyZSwgTlVMTCk7CisKKwlyZXEud2hlcmUgPSAmd2hlcmU7CisJcmVxLmlvX3JlcSA9ICZpb19yZXE7CisKKwkvKgorCSAqIElzc3VlIHRoZSBzeW5jaHJvbm91cyBJL08gZnJvbSBhIGRpZmZlcmVudCB0aHJlYWQKKwkgKiB0byBhdm9pZCBnZW5lcmljX21ha2VfcmVxdWVzdCByZWN1cnNpb24uCisJICovCisJSU5JVF9XT1JLKCZyZXEud29yaywgZG9fbWV0YWRhdGEpOworCXF1ZXVlX3dvcmsocHMtPm1ldGFkYXRhX3dxLCAmcmVxLndvcmspOworCWZsdXNoX3dvcmtxdWV1ZShwcy0+bWV0YWRhdGFfd3EpOworCisJcmV0dXJuIHJlcS5yZXN1bHQ7Cit9CisKKy8qCisgKiBDb252ZXJ0IGEgbWV0YWRhdGEgYXJlYSBpbmRleCB0byBhIGNodW5rIGluZGV4LgorICovCitzdGF0aWMgY2h1bmtfdCBhcmVhX2xvY2F0aW9uKHN0cnVjdCBwc3RvcmUgKnBzLCBjaHVua190IGFyZWEpCit7CisJcmV0dXJuIDEgKyAoKHBzLT5leGNlcHRpb25zX3Blcl9hcmVhICsgMSkgKiBhcmVhKTsKK30KKworLyoKKyAqIFJlYWQgb3Igd3JpdGUgYSBtZXRhZGF0YSBhcmVhLiAgUmVtZW1iZXJpbmcgdG8gc2tpcCB0aGUgZmlyc3QKKyAqIGNodW5rIHdoaWNoIGhvbGRzIHRoZSBoZWFkZXIuCisgKi8KK3N0YXRpYyBpbnQgYXJlYV9pbyhzdHJ1Y3QgcHN0b3JlICpwcywgaW50IHJ3KQoreworCWludCByOworCWNodW5rX3QgY2h1bms7CisKKwljaHVuayA9IGFyZWFfbG9jYXRpb24ocHMsIHBzLT5jdXJyZW50X2FyZWEpOworCisJciA9IGNodW5rX2lvKHBzLCBjaHVuaywgcncsIDApOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB6ZXJvX21lbW9yeV9hcmVhKHN0cnVjdCBwc3RvcmUgKnBzKQoreworCW1lbXNldChwcy0+YXJlYSwgMCwgcHMtPnNuYXAtPmNodW5rX3NpemUgPDwgU0VDVE9SX1NISUZUKTsKK30KKworc3RhdGljIGludCB6ZXJvX2Rpc2tfYXJlYShzdHJ1Y3QgcHN0b3JlICpwcywgY2h1bmtfdCBhcmVhKQoreworCXN0cnVjdCBkbV9pb19yZWdpb24gd2hlcmUgPSB7CisJCS5iZGV2ID0gcHMtPnNuYXAtPmNvdy0+YmRldiwKKwkJLnNlY3RvciA9IHBzLT5zbmFwLT5jaHVua19zaXplICogYXJlYV9sb2NhdGlvbihwcywgYXJlYSksCisJCS5jb3VudCA9IHBzLT5zbmFwLT5jaHVua19zaXplLAorCX07CisJc3RydWN0IGRtX2lvX3JlcXVlc3QgaW9fcmVxID0geworCQkuYmlfcncgPSBXUklURSwKKwkJLm1lbS50eXBlID0gRE1fSU9fVk1BLAorCQkubWVtLnB0ci52bWEgPSBwcy0+emVyb19hcmVhLAorCQkuY2xpZW50ID0gcHMtPmlvX2NsaWVudCwKKwkJLm5vdGlmeS5mbiA9IE5VTEwsCisJfTsKKworCXJldHVybiBkbV9pbygmaW9fcmVxLCAxLCAmd2hlcmUsIE5VTEwpOworfQorCitzdGF0aWMgaW50IHJlYWRfaGVhZGVyKHN0cnVjdCBwc3RvcmUgKnBzLCBpbnQgKm5ld19zbmFwc2hvdCkKK3sKKwlpbnQgcjsKKwlzdHJ1Y3QgZGlza19oZWFkZXIgKmRoOworCWNodW5rX3QgY2h1bmtfc2l6ZTsKKwlpbnQgY2h1bmtfc2l6ZV9zdXBwbGllZCA9IDE7CisKKwkvKgorCSAqIFVzZSBkZWZhdWx0IGNodW5rIHNpemUgKG9yIGhhcmRzZWN0X3NpemUsIGlmIGxhcmdlcikgaWYgbm9uZSBzdXBwbGllZAorCSAqLworCWlmICghcHMtPnNuYXAtPmNodW5rX3NpemUpIHsKKwkJcHMtPnNuYXAtPmNodW5rX3NpemUgPSBtYXgoRE1fQ0hVTktfU0laRV9ERUZBVUxUX1NFQ1RPUlMsCisJCSAgICBiZGV2X2hhcmRzZWN0X3NpemUocHMtPnNuYXAtPmNvdy0+YmRldikgPj4gOSk7CisJCXBzLT5zbmFwLT5jaHVua19tYXNrID0gcHMtPnNuYXAtPmNodW5rX3NpemUgLSAxOworCQlwcy0+c25hcC0+Y2h1bmtfc2hpZnQgPSBmZnMocHMtPnNuYXAtPmNodW5rX3NpemUpIC0gMTsKKwkJY2h1bmtfc2l6ZV9zdXBwbGllZCA9IDA7CisJfQorCisJcHMtPmlvX2NsaWVudCA9IGRtX2lvX2NsaWVudF9jcmVhdGUoc2VjdG9yc190b19wYWdlcyhwcy0+c25hcC0+CisJCQkJCQkJICAgICBjaHVua19zaXplKSk7CisJaWYgKElTX0VSUihwcy0+aW9fY2xpZW50KSkKKwkJcmV0dXJuIFBUUl9FUlIocHMtPmlvX2NsaWVudCk7CisKKwlyID0gYWxsb2NfYXJlYShwcyk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJciA9IGNodW5rX2lvKHBzLCAwLCBSRUFELCAxKTsKKwlpZiAocikKKwkJZ290byBiYWQ7CisKKwlkaCA9IChzdHJ1Y3QgZGlza19oZWFkZXIgKikgcHMtPmFyZWE7CisKKwlpZiAobGUzMl90b19jcHUoZGgtPm1hZ2ljKSA9PSAwKSB7CisJCSpuZXdfc25hcHNob3QgPSAxOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobGUzMl90b19jcHUoZGgtPm1hZ2ljKSAhPSBTTkFQX01BR0lDKSB7CisJCURNV0FSTigiSW52YWxpZCBvciBjb3JydXB0IHNuYXBzaG90Iik7CisJCXIgPSAtRU5YSU87CisJCWdvdG8gYmFkOworCX0KKworCSpuZXdfc25hcHNob3QgPSAwOworCXBzLT52YWxpZCA9IGxlMzJfdG9fY3B1KGRoLT52YWxpZCk7CisJcHMtPnZlcnNpb24gPSBsZTMyX3RvX2NwdShkaC0+dmVyc2lvbik7CisJY2h1bmtfc2l6ZSA9IGxlMzJfdG9fY3B1KGRoLT5jaHVua19zaXplKTsKKworCWlmICghY2h1bmtfc2l6ZV9zdXBwbGllZCB8fCBwcy0+c25hcC0+Y2h1bmtfc2l6ZSA9PSBjaHVua19zaXplKQorCQlyZXR1cm4gMDsKKworCURNV0FSTigiY2h1bmsgc2l6ZSAlbGx1IGluIGRldmljZSBtZXRhZGF0YSBvdmVycmlkZXMgIgorCSAgICAgICAidGFibGUgY2h1bmsgc2l6ZSBvZiAlbGx1LiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpY2h1bmtfc2l6ZSwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwcy0+c25hcC0+Y2h1bmtfc2l6ZSk7CisKKwkvKiBXZSBoYWQgYSBib2d1cyBjaHVua19zaXplLiBGaXggc3R1ZmYgdXAuICovCisJZnJlZV9hcmVhKHBzKTsKKworCXBzLT5zbmFwLT5jaHVua19zaXplID0gY2h1bmtfc2l6ZTsKKwlwcy0+c25hcC0+Y2h1bmtfbWFzayA9IGNodW5rX3NpemUgLSAxOworCXBzLT5zbmFwLT5jaHVua19zaGlmdCA9IGZmcyhjaHVua19zaXplKSAtIDE7CisKKwlyID0gZG1faW9fY2xpZW50X3Jlc2l6ZShzZWN0b3JzX3RvX3BhZ2VzKHBzLT5zbmFwLT5jaHVua19zaXplKSwKKwkJCQlwcy0+aW9fY2xpZW50KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyID0gYWxsb2NfYXJlYShwcyk7CisJcmV0dXJuIHI7CisKK2JhZDoKKwlmcmVlX2FyZWEocHMpOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IHdyaXRlX2hlYWRlcihzdHJ1Y3QgcHN0b3JlICpwcykKK3sKKwlzdHJ1Y3QgZGlza19oZWFkZXIgKmRoOworCisJbWVtc2V0KHBzLT5hcmVhLCAwLCBwcy0+c25hcC0+Y2h1bmtfc2l6ZSA8PCBTRUNUT1JfU0hJRlQpOworCisJZGggPSAoc3RydWN0IGRpc2tfaGVhZGVyICopIHBzLT5hcmVhOworCWRoLT5tYWdpYyA9IGNwdV90b19sZTMyKFNOQVBfTUFHSUMpOworCWRoLT52YWxpZCA9IGNwdV90b19sZTMyKHBzLT52YWxpZCk7CisJZGgtPnZlcnNpb24gPSBjcHVfdG9fbGUzMihwcy0+dmVyc2lvbik7CisJZGgtPmNodW5rX3NpemUgPSBjcHVfdG9fbGUzMihwcy0+c25hcC0+Y2h1bmtfc2l6ZSk7CisKKwlyZXR1cm4gY2h1bmtfaW8ocHMsIDAsIFdSSVRFLCAxKTsKK30KKworLyoKKyAqIEFjY2VzcyBmdW5jdGlvbnMgZm9yIHRoZSBkaXNrIGV4Y2VwdGlvbnMsIHRoZXNlIGRvIHRoZSBlbmRpYW4gY29udmVyc2lvbnMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGlza19leGNlcHRpb24gKmdldF9leGNlcHRpb24oc3RydWN0IHBzdG9yZSAqcHMsIHVpbnQzMl90IGluZGV4KQoreworCUJVR19PTihpbmRleCA+PSBwcy0+ZXhjZXB0aW9uc19wZXJfYXJlYSk7CisKKwlyZXR1cm4gKChzdHJ1Y3QgZGlza19leGNlcHRpb24gKikgcHMtPmFyZWEpICsgaW5kZXg7Cit9CisKK3N0YXRpYyB2b2lkIHJlYWRfZXhjZXB0aW9uKHN0cnVjdCBwc3RvcmUgKnBzLAorCQkJICAgdWludDMyX3QgaW5kZXgsIHN0cnVjdCBkaXNrX2V4Y2VwdGlvbiAqcmVzdWx0KQoreworCXN0cnVjdCBkaXNrX2V4Y2VwdGlvbiAqZSA9IGdldF9leGNlcHRpb24ocHMsIGluZGV4KTsKKworCS8qIGNvcHkgaXQgKi8KKwlyZXN1bHQtPm9sZF9jaHVuayA9IGxlNjRfdG9fY3B1KGUtPm9sZF9jaHVuayk7CisJcmVzdWx0LT5uZXdfY2h1bmsgPSBsZTY0X3RvX2NwdShlLT5uZXdfY2h1bmspOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9leGNlcHRpb24oc3RydWN0IHBzdG9yZSAqcHMsCisJCQkgICAgdWludDMyX3QgaW5kZXgsIHN0cnVjdCBkaXNrX2V4Y2VwdGlvbiAqZGUpCit7CisJc3RydWN0IGRpc2tfZXhjZXB0aW9uICplID0gZ2V0X2V4Y2VwdGlvbihwcywgaW5kZXgpOworCisJLyogY29weSBpdCAqLworCWUtPm9sZF9jaHVuayA9IGNwdV90b19sZTY0KGRlLT5vbGRfY2h1bmspOworCWUtPm5ld19jaHVuayA9IGNwdV90b19sZTY0KGRlLT5uZXdfY2h1bmspOworfQorCisvKgorICogUmVnaXN0ZXJzIHRoZSBleGNlcHRpb25zIHRoYXQgYXJlIHByZXNlbnQgaW4gdGhlIGN1cnJlbnQgYXJlYS4KKyAqICdmdWxsJyBpcyBmaWxsZWQgaW4gdG8gaW5kaWNhdGUgaWYgdGhlIGFyZWEgaGFzIGJlZW4KKyAqIGZpbGxlZC4KKyAqLworc3RhdGljIGludCBpbnNlcnRfZXhjZXB0aW9ucyhzdHJ1Y3QgcHN0b3JlICpwcywKKwkJCSAgICAgaW50ICgqY2FsbGJhY2spKHZvaWQgKmNhbGxiYWNrX2NvbnRleHQsCisJCQkJCSAgICAgY2h1bmtfdCBvbGQsIGNodW5rX3QgbmV3KSwKKwkJCSAgICAgdm9pZCAqY2FsbGJhY2tfY29udGV4dCwKKwkJCSAgICAgaW50ICpmdWxsKQoreworCWludCByOworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBkaXNrX2V4Y2VwdGlvbiBkZTsKKworCS8qIHByZXN1bWUgdGhlIGFyZWEgaXMgZnVsbCAqLworCSpmdWxsID0gMTsKKworCWZvciAoaSA9IDA7IGkgPCBwcy0+ZXhjZXB0aW9uc19wZXJfYXJlYTsgaSsrKSB7CisJCXJlYWRfZXhjZXB0aW9uKHBzLCBpLCAmZGUpOworCisJCS8qCisJCSAqIElmIHRoZSBuZXdfY2h1bmsgaXMgcG9pbnRpbmcgYXQgdGhlIHN0YXJ0IG9mCisJCSAqIHRoZSBDT1cgZGV2aWNlLCB3aGVyZSB0aGUgZmlyc3QgbWV0YWRhdGEgYXJlYQorCQkgKiBpcyB3ZSBrbm93IHRoYXQgd2UndmUgaGl0IHRoZSBlbmQgb2YgdGhlCisJCSAqIGV4Y2VwdGlvbnMuICBUaGVyZWZvcmUgdGhlIGFyZWEgaXMgbm90IGZ1bGwuCisJCSAqLworCQlpZiAoZGUubmV3X2NodW5rID09IDBMTCkgeworCQkJcHMtPmN1cnJlbnRfY29tbWl0dGVkID0gaTsKKwkJCSpmdWxsID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogS2VlcCB0cmFjayBvZiB0aGUgc3RhcnQgb2YgdGhlIGZyZWUgY2h1bmtzLgorCQkgKi8KKwkJaWYgKHBzLT5uZXh0X2ZyZWUgPD0gZGUubmV3X2NodW5rKQorCQkJcHMtPm5leHRfZnJlZSA9IGRlLm5ld19jaHVuayArIDE7CisKKwkJLyoKKwkJICogT3RoZXJ3aXNlIHdlIGFkZCB0aGUgZXhjZXB0aW9uIHRvIHRoZSBzbmFwc2hvdC4KKwkJICovCisJCXIgPSBjYWxsYmFjayhjYWxsYmFja19jb250ZXh0LCBkZS5vbGRfY2h1bmssIGRlLm5ld19jaHVuayk7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9leGNlcHRpb25zKHN0cnVjdCBwc3RvcmUgKnBzLAorCQkJICAgaW50ICgqY2FsbGJhY2spKHZvaWQgKmNhbGxiYWNrX2NvbnRleHQsIGNodW5rX3Qgb2xkLAorCQkJCQkgICBjaHVua190IG5ldyksCisJCQkgICB2b2lkICpjYWxsYmFja19jb250ZXh0KQoreworCWludCByLCBmdWxsID0gMTsKKworCS8qCisJICogS2VlcGluZyByZWFkaW5nIGNodW5rcyBhbmQgaW5zZXJ0aW5nIGV4Y2VwdGlvbnMgdW50aWwKKwkgKiB3ZSBmaW5kIGEgcGFydGlhbGx5IGZ1bGwgYXJlYS4KKwkgKi8KKwlmb3IgKHBzLT5jdXJyZW50X2FyZWEgPSAwOyBmdWxsOyBwcy0+Y3VycmVudF9hcmVhKyspIHsKKwkJciA9IGFyZWFfaW8ocHMsIFJFQUQpOworCQlpZiAocikKKwkJCXJldHVybiByOworCisJCXIgPSBpbnNlcnRfZXhjZXB0aW9ucyhwcywgY2FsbGJhY2ssIGNhbGxiYWNrX2NvbnRleHQsICZmdWxsKTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKKwl9CisKKwlwcy0+Y3VycmVudF9hcmVhLS07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwc3RvcmUgKmdldF9pbmZvKHN0cnVjdCBkbV9leGNlcHRpb25fc3RvcmUgKnN0b3JlKQoreworCXJldHVybiAoc3RydWN0IHBzdG9yZSAqKSBzdG9yZS0+Y29udGV4dDsKK30KKworc3RhdGljIHZvaWQgcGVyc2lzdGVudF9mcmFjdGlvbl9mdWxsKHN0cnVjdCBkbV9leGNlcHRpb25fc3RvcmUgKnN0b3JlLAorCQkJCSAgICAgc2VjdG9yX3QgKm51bWVyYXRvciwgc2VjdG9yX3QgKmRlbm9taW5hdG9yKQoreworCSpudW1lcmF0b3IgPSBnZXRfaW5mbyhzdG9yZSktPm5leHRfZnJlZSAqIHN0b3JlLT5zbmFwLT5jaHVua19zaXplOworCSpkZW5vbWluYXRvciA9IGdldF9kZXZfc2l6ZShzdG9yZS0+c25hcC0+Y293LT5iZGV2KTsKK30KKworc3RhdGljIHZvaWQgcGVyc2lzdGVudF9kZXN0cm95KHN0cnVjdCBkbV9leGNlcHRpb25fc3RvcmUgKnN0b3JlKQoreworCXN0cnVjdCBwc3RvcmUgKnBzID0gZ2V0X2luZm8oc3RvcmUpOworCisJZGVzdHJveV93b3JrcXVldWUocHMtPm1ldGFkYXRhX3dxKTsKKwlkbV9pb19jbGllbnRfZGVzdHJveShwcy0+aW9fY2xpZW50KTsKKwl2ZnJlZShwcy0+Y2FsbGJhY2tzKTsKKwlmcmVlX2FyZWEocHMpOworCWtmcmVlKHBzKTsKK30KKworc3RhdGljIGludCBwZXJzaXN0ZW50X3JlYWRfbWV0YWRhdGEoc3RydWN0IGRtX2V4Y2VwdGlvbl9zdG9yZSAqc3RvcmUsCisJCQkJICAgIGludCAoKmNhbGxiYWNrKSh2b2lkICpjYWxsYmFja19jb250ZXh0LAorCQkJCQkJICAgIGNodW5rX3Qgb2xkLCBjaHVua190IG5ldyksCisJCQkJICAgIHZvaWQgKmNhbGxiYWNrX2NvbnRleHQpCit7CisJaW50IHIsIHVuaW5pdGlhbGl6ZWRfdmFyKG5ld19zbmFwc2hvdCk7CisJc3RydWN0IHBzdG9yZSAqcHMgPSBnZXRfaW5mbyhzdG9yZSk7CisKKwkvKgorCSAqIFJlYWQgdGhlIHNuYXBzaG90IGhlYWRlci4KKwkgKi8KKwlyID0gcmVhZF9oZWFkZXIocHMsICZuZXdfc25hcHNob3QpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCS8qCisJICogTm93IHdlIGtub3cgY29ycmVjdCBjaHVua19zaXplLCBjb21wbGV0ZSB0aGUgaW5pdGlhbGlzYXRpb24uCisJICovCisJcHMtPmV4Y2VwdGlvbnNfcGVyX2FyZWEgPSAocHMtPnNuYXAtPmNodW5rX3NpemUgPDwgU0VDVE9SX1NISUZUKSAvCisJCQkJICBzaXplb2Yoc3RydWN0IGRpc2tfZXhjZXB0aW9uKTsKKwlwcy0+Y2FsbGJhY2tzID0gZG1fdmNhbGxvYyhwcy0+ZXhjZXB0aW9uc19wZXJfYXJlYSwKKwkJCXNpemVvZigqcHMtPmNhbGxiYWNrcykpOworCWlmICghcHMtPmNhbGxiYWNrcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKgorCSAqIERvIHdlIG5lZWQgdG8gc2V0dXAgYSBuZXcgc25hcHNob3QgPworCSAqLworCWlmIChuZXdfc25hcHNob3QpIHsKKwkJciA9IHdyaXRlX2hlYWRlcihwcyk7CisJCWlmIChyKSB7CisJCQlETVdBUk4oIndyaXRlX2hlYWRlciBmYWlsZWQiKTsKKwkJCXJldHVybiByOworCQl9CisKKwkJcHMtPmN1cnJlbnRfYXJlYSA9IDA7CisJCXplcm9fbWVtb3J5X2FyZWEocHMpOworCQlyID0gemVyb19kaXNrX2FyZWEocHMsIDApOworCQlpZiAocikgeworCQkJRE1XQVJOKCJ6ZXJvX2Rpc2tfYXJlYSgwKSBmYWlsZWQiKTsKKwkJCXJldHVybiByOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogU2FuaXR5IGNoZWNrcy4KKwkJICovCisJCWlmIChwcy0+dmVyc2lvbiAhPSBTTkFQU0hPVF9ESVNLX1ZFUlNJT04pIHsKKwkJCURNV0FSTigidW5hYmxlIHRvIGhhbmRsZSBzbmFwc2hvdCBkaXNrIHZlcnNpb24gJWQiLAorCQkJICAgICAgIHBzLT52ZXJzaW9uKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJLyoKKwkJICogTWV0YWRhdGEgYXJlIHZhbGlkLCBidXQgc25hcHNob3QgaXMgaW52YWxpZGF0ZWQKKwkJICovCisJCWlmICghcHMtPnZhbGlkKQorCQkJcmV0dXJuIDE7CisKKwkJLyoKKwkJICogUmVhZCB0aGUgbWV0YWRhdGEuCisJCSAqLworCQlyID0gcmVhZF9leGNlcHRpb25zKHBzLCBjYWxsYmFjaywgY2FsbGJhY2tfY29udGV4dCk7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGVyc2lzdGVudF9wcmVwYXJlX2V4Y2VwdGlvbihzdHJ1Y3QgZG1fZXhjZXB0aW9uX3N0b3JlICpzdG9yZSwKKwkJCQkJc3RydWN0IGRtX3NuYXBfZXhjZXB0aW9uICplKQoreworCXN0cnVjdCBwc3RvcmUgKnBzID0gZ2V0X2luZm8oc3RvcmUpOworCXVpbnQzMl90IHN0cmlkZTsKKwljaHVua190IG5leHRfZnJlZTsKKwlzZWN0b3JfdCBzaXplID0gZ2V0X2Rldl9zaXplKHN0b3JlLT5zbmFwLT5jb3ctPmJkZXYpOworCisJLyogSXMgdGhlcmUgZW5vdWdoIHJvb20gPyAqLworCWlmIChzaXplIDwgKChwcy0+bmV4dF9mcmVlICsgMSkgKiBzdG9yZS0+c25hcC0+Y2h1bmtfc2l6ZSkpCisJCXJldHVybiAtRU5PU1BDOworCisJZS0+bmV3X2NodW5rID0gcHMtPm5leHRfZnJlZTsKKworCS8qCisJICogTW92ZSBvbnRvIHRoZSBuZXh0IGZyZWUgcGVuZGluZywgbWFraW5nIHN1cmUgdG8gdGFrZQorCSAqIGludG8gYWNjb3VudCB0aGUgbG9jYXRpb24gb2YgdGhlIG1ldGFkYXRhIGNodW5rcy4KKwkgKi8KKwlzdHJpZGUgPSAocHMtPmV4Y2VwdGlvbnNfcGVyX2FyZWEgKyAxKTsKKwluZXh0X2ZyZWUgPSArK3BzLT5uZXh0X2ZyZWU7CisJaWYgKHNlY3Rvcl9kaXYobmV4dF9mcmVlLCBzdHJpZGUpID09IDEpCisJCXBzLT5uZXh0X2ZyZWUrKzsKKworCWF0b21pY19pbmMoJnBzLT5wZW5kaW5nX2NvdW50KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGVyc2lzdGVudF9jb21taXRfZXhjZXB0aW9uKHN0cnVjdCBkbV9leGNlcHRpb25fc3RvcmUgKnN0b3JlLAorCQkJCQlzdHJ1Y3QgZG1fc25hcF9leGNlcHRpb24gKmUsCisJCQkJCXZvaWQgKCpjYWxsYmFjaykgKHZvaWQgKiwgaW50IHN1Y2Nlc3MpLAorCQkJCQl2b2lkICpjYWxsYmFja19jb250ZXh0KQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBwc3RvcmUgKnBzID0gZ2V0X2luZm8oc3RvcmUpOworCXN0cnVjdCBkaXNrX2V4Y2VwdGlvbiBkZTsKKwlzdHJ1Y3QgY29tbWl0X2NhbGxiYWNrICpjYjsKKworCWRlLm9sZF9jaHVuayA9IGUtPm9sZF9jaHVuazsKKwlkZS5uZXdfY2h1bmsgPSBlLT5uZXdfY2h1bms7CisJd3JpdGVfZXhjZXB0aW9uKHBzLCBwcy0+Y3VycmVudF9jb21taXR0ZWQrKywgJmRlKTsKKworCS8qCisJICogQWRkIHRoZSBjYWxsYmFjayB0byB0aGUgYmFjayBvZiB0aGUgYXJyYXkuICBUaGlzIGNvZGUKKwkgKiBpcyB0aGUgb25seSBwbGFjZSB3aGVyZSB0aGUgY2FsbGJhY2sgYXJyYXkgaXMKKwkgKiBtYW5pcHVsYXRlZCwgYW5kIHdlIGtub3cgdGhhdCBpdCB3aWxsIG5ldmVyIGJlIGNhbGxlZAorCSAqIG11bHRpcGxlIHRpbWVzIGNvbmN1cnJlbnRseS4KKwkgKi8KKwljYiA9IHBzLT5jYWxsYmFja3MgKyBwcy0+Y2FsbGJhY2tfY291bnQrKzsKKwljYi0+Y2FsbGJhY2sgPSBjYWxsYmFjazsKKwljYi0+Y29udGV4dCA9IGNhbGxiYWNrX2NvbnRleHQ7CisKKwkvKgorCSAqIElmIHRoZXJlIGFyZSBleGNlcHRpb25zIGluIGZsaWdodCBhbmQgd2UgaGF2ZSBub3QgeWV0CisJICogZmlsbGVkIHRoaXMgbWV0YWRhdGEgYXJlYSB0aGVyZSdzIG5vdGhpbmcgbW9yZSB0byBkby4KKwkgKi8KKwlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJnBzLT5wZW5kaW5nX2NvdW50KSAmJgorCSAgICAocHMtPmN1cnJlbnRfY29tbWl0dGVkICE9IHBzLT5leGNlcHRpb25zX3Blcl9hcmVhKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBJZiB3ZSBjb21wbGV0ZWx5IGZpbGxlZCB0aGUgY3VycmVudCBhcmVhLCB0aGVuIHdpcGUgdGhlIG5leHQgb25lLgorCSAqLworCWlmICgocHMtPmN1cnJlbnRfY29tbWl0dGVkID09IHBzLT5leGNlcHRpb25zX3Blcl9hcmVhKSAmJgorCSAgICAgemVyb19kaXNrX2FyZWEocHMsIHBzLT5jdXJyZW50X2FyZWEgKyAxKSkKKwkJcHMtPnZhbGlkID0gMDsKKworCS8qCisJICogQ29tbWl0IGV4Y2VwdGlvbnMgdG8gZGlzay4KKwkgKi8KKwlpZiAocHMtPnZhbGlkICYmIGFyZWFfaW8ocHMsIFdSSVRFKSkKKwkJcHMtPnZhbGlkID0gMDsKKworCS8qCisJICogQWR2YW5jZSB0byB0aGUgbmV4dCBhcmVhIGlmIHRoaXMgb25lIGlzIGZ1bGwuCisJICovCisJaWYgKHBzLT5jdXJyZW50X2NvbW1pdHRlZCA9PSBwcy0+ZXhjZXB0aW9uc19wZXJfYXJlYSkgeworCQlwcy0+Y3VycmVudF9jb21taXR0ZWQgPSAwOworCQlwcy0+Y3VycmVudF9hcmVhKys7CisJCXplcm9fbWVtb3J5X2FyZWEocHMpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBwcy0+Y2FsbGJhY2tfY291bnQ7IGkrKykgeworCQljYiA9IHBzLT5jYWxsYmFja3MgKyBpOworCQljYi0+Y2FsbGJhY2soY2ItPmNvbnRleHQsIHBzLT52YWxpZCk7CisJfQorCisJcHMtPmNhbGxiYWNrX2NvdW50ID0gMDsKK30KKworc3RhdGljIHZvaWQgcGVyc2lzdGVudF9kcm9wX3NuYXBzaG90KHN0cnVjdCBkbV9leGNlcHRpb25fc3RvcmUgKnN0b3JlKQoreworCXN0cnVjdCBwc3RvcmUgKnBzID0gZ2V0X2luZm8oc3RvcmUpOworCisJcHMtPnZhbGlkID0gMDsKKwlpZiAod3JpdGVfaGVhZGVyKHBzKSkKKwkJRE1XQVJOKCJ3cml0ZSBoZWFkZXIgZmFpbGVkIik7Cit9CisKK2ludCBkbV9jcmVhdGVfcGVyc2lzdGVudChzdHJ1Y3QgZG1fZXhjZXB0aW9uX3N0b3JlICpzdG9yZSkKK3sKKwlzdHJ1Y3QgcHN0b3JlICpwczsKKworCS8qIGFsbG9jYXRlIHRoZSBwc3RvcmUgKi8KKwlwcyA9IGttYWxsb2Moc2l6ZW9mKCpwcyksIEdGUF9LRVJORUwpOworCWlmICghcHMpCisJCXJldHVybiAtRU5PTUVNOworCisJcHMtPnNuYXAgPSBzdG9yZS0+c25hcDsKKwlwcy0+dmFsaWQgPSAxOworCXBzLT52ZXJzaW9uID0gU05BUFNIT1RfRElTS19WRVJTSU9OOworCXBzLT5hcmVhID0gTlVMTDsKKwlwcy0+bmV4dF9mcmVlID0gMjsJLyogc2tpcHBpbmcgdGhlIGhlYWRlciBhbmQgZmlyc3QgYXJlYSAqLworCXBzLT5jdXJyZW50X2NvbW1pdHRlZCA9IDA7CisKKwlwcy0+Y2FsbGJhY2tfY291bnQgPSAwOworCWF0b21pY19zZXQoJnBzLT5wZW5kaW5nX2NvdW50LCAwKTsKKwlwcy0+Y2FsbGJhY2tzID0gTlVMTDsKKworCXBzLT5tZXRhZGF0YV93cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJrc25hcGhkIik7CisJaWYgKCFwcy0+bWV0YWRhdGFfd3EpIHsKKwkJa2ZyZWUocHMpOworCQlETUVSUigiY291bGRuJ3Qgc3RhcnQgaGVhZGVyIG1ldGFkYXRhIHVwZGF0ZSB0aHJlYWQiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc3RvcmUtPmRlc3Ryb3kgPSBwZXJzaXN0ZW50X2Rlc3Ryb3k7CisJc3RvcmUtPnJlYWRfbWV0YWRhdGEgPSBwZXJzaXN0ZW50X3JlYWRfbWV0YWRhdGE7CisJc3RvcmUtPnByZXBhcmVfZXhjZXB0aW9uID0gcGVyc2lzdGVudF9wcmVwYXJlX2V4Y2VwdGlvbjsKKwlzdG9yZS0+Y29tbWl0X2V4Y2VwdGlvbiA9IHBlcnNpc3RlbnRfY29tbWl0X2V4Y2VwdGlvbjsKKwlzdG9yZS0+ZHJvcF9zbmFwc2hvdCA9IHBlcnNpc3RlbnRfZHJvcF9zbmFwc2hvdDsKKwlzdG9yZS0+ZnJhY3Rpb25fZnVsbCA9IHBlcnNpc3RlbnRfZnJhY3Rpb25fZnVsbDsKKwlzdG9yZS0+Y29udGV4dCA9IHBzOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkbV9wZXJzaXN0ZW50X3NuYXBzaG90X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKwordm9pZCBkbV9wZXJzaXN0ZW50X3NuYXBzaG90X2V4aXQodm9pZCkKK3sKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tc25hcC10cmFuc2llbnQuYyBiL2RyaXZlcnMvbWQvZG0tc25hcC10cmFuc2llbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjZlMmU2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZC9kbS1zbmFwLXRyYW5zaWVudC5jCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBTaXN0aW5hIFNvZnR3YXJlIChVSykgTGltaXRlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IFJlZCBIYXQgR21iSAorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgorICovCisKKyNpbmNsdWRlICJkbS1leGNlcHRpb24tc3RvcmUuaCIKKyNpbmNsdWRlICJkbS1zbmFwLmgiCisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RtLWlvLmg+CisKKyNkZWZpbmUgRE1fTVNHX1BSRUZJWCAidHJhbnNpZW50IHNuYXBzaG90IgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgc3RvcmUgZm9yIG5vbi1wZXJzaXN0ZW50IHNuYXBzaG90cy4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0cnVjdCB0cmFuc2llbnRfYyB7CisJc2VjdG9yX3QgbmV4dF9mcmVlOworfTsKKworc3RhdGljIHZvaWQgdHJhbnNpZW50X2Rlc3Ryb3koc3RydWN0IGRtX2V4Y2VwdGlvbl9zdG9yZSAqc3RvcmUpCit7CisJa2ZyZWUoc3RvcmUtPmNvbnRleHQpOworfQorCitzdGF0aWMgaW50IHRyYW5zaWVudF9yZWFkX21ldGFkYXRhKHN0cnVjdCBkbV9leGNlcHRpb25fc3RvcmUgKnN0b3JlLAorCQkJCSAgIGludCAoKmNhbGxiYWNrKSh2b2lkICpjYWxsYmFja19jb250ZXh0LAorCQkJCQkJICAgY2h1bmtfdCBvbGQsIGNodW5rX3QgbmV3KSwKKwkJCQkgICB2b2lkICpjYWxsYmFja19jb250ZXh0KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRyYW5zaWVudF9wcmVwYXJlX2V4Y2VwdGlvbihzdHJ1Y3QgZG1fZXhjZXB0aW9uX3N0b3JlICpzdG9yZSwKKwkJCQkgICAgICAgc3RydWN0IGRtX3NuYXBfZXhjZXB0aW9uICplKQoreworCXN0cnVjdCB0cmFuc2llbnRfYyAqdGMgPSAoc3RydWN0IHRyYW5zaWVudF9jICopIHN0b3JlLT5jb250ZXh0OworCXNlY3Rvcl90IHNpemUgPSBnZXRfZGV2X3NpemUoc3RvcmUtPnNuYXAtPmNvdy0+YmRldik7CisKKwlpZiAoc2l6ZSA8ICh0Yy0+bmV4dF9mcmVlICsgc3RvcmUtPnNuYXAtPmNodW5rX3NpemUpKQorCQlyZXR1cm4gLTE7CisKKwllLT5uZXdfY2h1bmsgPSBzZWN0b3JfdG9fY2h1bmsoc3RvcmUtPnNuYXAsIHRjLT5uZXh0X2ZyZWUpOworCXRjLT5uZXh0X2ZyZWUgKz0gc3RvcmUtPnNuYXAtPmNodW5rX3NpemU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdHJhbnNpZW50X2NvbW1pdF9leGNlcHRpb24oc3RydWN0IGRtX2V4Y2VwdGlvbl9zdG9yZSAqc3RvcmUsCisJCQkJICAgICAgIHN0cnVjdCBkbV9zbmFwX2V4Y2VwdGlvbiAqZSwKKwkJCQkgICAgICAgdm9pZCAoKmNhbGxiYWNrKSAodm9pZCAqLCBpbnQgc3VjY2VzcyksCisJCQkJICAgICAgIHZvaWQgKmNhbGxiYWNrX2NvbnRleHQpCit7CisJLyogSnVzdCBzdWNjZWVkICovCisJY2FsbGJhY2soY2FsbGJhY2tfY29udGV4dCwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIHRyYW5zaWVudF9mcmFjdGlvbl9mdWxsKHN0cnVjdCBkbV9leGNlcHRpb25fc3RvcmUgKnN0b3JlLAorCQkJCSAgICBzZWN0b3JfdCAqbnVtZXJhdG9yLCBzZWN0b3JfdCAqZGVub21pbmF0b3IpCit7CisJKm51bWVyYXRvciA9ICgoc3RydWN0IHRyYW5zaWVudF9jICopIHN0b3JlLT5jb250ZXh0KS0+bmV4dF9mcmVlOworCSpkZW5vbWluYXRvciA9IGdldF9kZXZfc2l6ZShzdG9yZS0+c25hcC0+Y293LT5iZGV2KTsKK30KKworaW50IGRtX2NyZWF0ZV90cmFuc2llbnQoc3RydWN0IGRtX2V4Y2VwdGlvbl9zdG9yZSAqc3RvcmUpCit7CisJc3RydWN0IHRyYW5zaWVudF9jICp0YzsKKworCXN0b3JlLT5kZXN0cm95ID0gdHJhbnNpZW50X2Rlc3Ryb3k7CisJc3RvcmUtPnJlYWRfbWV0YWRhdGEgPSB0cmFuc2llbnRfcmVhZF9tZXRhZGF0YTsKKwlzdG9yZS0+cHJlcGFyZV9leGNlcHRpb24gPSB0cmFuc2llbnRfcHJlcGFyZV9leGNlcHRpb247CisJc3RvcmUtPmNvbW1pdF9leGNlcHRpb24gPSB0cmFuc2llbnRfY29tbWl0X2V4Y2VwdGlvbjsKKwlzdG9yZS0+ZHJvcF9zbmFwc2hvdCA9IE5VTEw7CisJc3RvcmUtPmZyYWN0aW9uX2Z1bGwgPSB0cmFuc2llbnRfZnJhY3Rpb25fZnVsbDsKKworCXRjID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHRyYW5zaWVudF9jKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0YykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0Yy0+bmV4dF9mcmVlID0gMDsKKwlzdG9yZS0+Y29udGV4dCA9IHRjOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkbV90cmFuc2llbnRfc25hcHNob3RfaW5pdCh2b2lkKQoreworCXJldHVybiAwOworfQorCit2b2lkIGRtX3RyYW5zaWVudF9zbmFwc2hvdF9leGl0KHZvaWQpCit7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXNuYXAuYyBiL2RyaXZlcnMvbWQvZG0tc25hcC5jCmluZGV4IDZjOTZkYjIuLjY1ZmY4MmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tc25hcC5jCisrKyBiL2RyaXZlcnMvbWQvZG0tc25hcC5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLW1hcHBlci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CkBAIC0yMCw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvbG9nMi5oPgogI2luY2x1ZGUgPGxpbnV4L2RtLWtjb3B5ZC5oPgogCisjaW5jbHVkZSAiZG0tZXhjZXB0aW9uLXN0b3JlLmgiCiAjaW5jbHVkZSAiZG0tc25hcC5oIgogI2luY2x1ZGUgImRtLWJpby1saXN0LmgiCiAKQEAgLTQyOCw4ICs0MzAsMTMgQEAKIAlsaXN0X2FkZCgmbmV3X2UtPmhhc2hfbGlzdCwgZSA/ICZlLT5oYXNoX2xpc3QgOiBsKTsKIH0KIAotaW50IGRtX2FkZF9leGNlcHRpb24oc3RydWN0IGRtX3NuYXBzaG90ICpzLCBjaHVua190IG9sZCwgY2h1bmtfdCBuZXcpCisvKgorICogQ2FsbGJhY2sgdXNlZCBieSB0aGUgZXhjZXB0aW9uIHN0b3JlcyB0byBsb2FkIGV4Y2VwdGlvbnMgd2hlbgorICogaW5pdGlhbGlzaW5nLgorICovCitzdGF0aWMgaW50IGRtX2FkZF9leGNlcHRpb24odm9pZCAqY29udGV4dCwgY2h1bmtfdCBvbGQsIGNodW5rX3QgbmV3KQogeworCXN0cnVjdCBkbV9zbmFwc2hvdCAqcyA9IGNvbnRleHQ7CiAJc3RydWN0IGRtX3NuYXBfZXhjZXB0aW9uICplOwogCiAJZSA9IGFsbG9jX2V4Y2VwdGlvbigpOwpAQCAtNjU4LDcgKzY2NSw3IEBACiAJc3Bpbl9sb2NrX2luaXQoJnMtPnRyYWNrZWRfY2h1bmtfbG9jayk7CiAKIAkvKiBNZXRhZGF0YSBtdXN0IG9ubHkgYmUgbG9hZGVkIGludG8gb25lIHRhYmxlIGF0IG9uY2UgKi8KLQlyID0gcy0+c3RvcmUucmVhZF9tZXRhZGF0YSgmcy0+c3RvcmUpOworCXIgPSBzLT5zdG9yZS5yZWFkX21ldGFkYXRhKCZzLT5zdG9yZSwgZG1fYWRkX2V4Y2VwdGlvbiwgKHZvaWQgKilzKTsKIAlpZiAociA8IDApIHsKIAkJdGktPmVycm9yID0gIkZhaWxlZCB0byByZWFkIHNuYXBzaG90IG1ldGFkYXRhIjsKIAkJZ290byBiYWRfbG9hZF9hbmRfcmVnaXN0ZXI7CkBAIC03MzUsNyArNzQyLDcgQEAKIAl1bnJlZ2lzdGVyX3NuYXBzaG90KHMpOwogCiAJd2hpbGUgKGF0b21pY19yZWFkKCZzLT5wZW5kaW5nX2V4Y2VwdGlvbnNfY291bnQpKQotCQl5aWVsZCgpOworCQltc2xlZXAoMSk7CiAJLyoKIAkgKiBFbnN1cmUgaW5zdHJ1Y3Rpb25zIGluIG1lbXBvb2xfZGVzdHJveSBhcmVuJ3QgcmVvcmRlcmVkCiAJICogYmVmb3JlIGF0b21pY19yZWFkLgpAQCAtODg4LDEwICs4OTUsMTAgQEAKIAogCS8qCiAJICogQ2hlY2sgZm9yIGNvbmZsaWN0aW5nIHJlYWRzLiBUaGlzIGlzIGV4dHJlbWVseSBpbXByb2JhYmxlLAotCSAqIHNvIHlpZWxkKCkgaXMgc3VmZmljaWVudCBhbmQgdGhlcmUgaXMgbm8gbmVlZCBmb3IgYSB3YWl0IHF1ZXVlLgorCSAqIHNvIG1zbGVlcCgxKSBpcyBzdWZmaWNpZW50IGFuZCB0aGVyZSBpcyBubyBuZWVkIGZvciBhIHdhaXQgcXVldWUuCiAJICovCiAJd2hpbGUgKF9fY2h1bmtfaXNfdHJhY2tlZChzLCBwZS0+ZS5vbGRfY2h1bmspKQotCQl5aWVsZCgpOworCQltc2xlZXAoMSk7CiAKIAkvKgogCSAqIEFkZCBhIHByb3BlciBleGNlcHRpb24sIGFuZCByZW1vdmUgdGhlCkBAIC0xNDA0LDYgKzE0MTEsMTIgQEAKIHsKIAlpbnQgcjsKIAorCXIgPSBkbV9leGNlcHRpb25fc3RvcmVfaW5pdCgpOworCWlmIChyKSB7CisJCURNRVJSKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBleGNlcHRpb24gc3RvcmVzIik7CisJCXJldHVybiByOworCX0KKwogCXIgPSBkbV9yZWdpc3Rlcl90YXJnZXQoJnNuYXBzaG90X3RhcmdldCk7CiAJaWYgKHIpIHsKIAkJRE1FUlIoInNuYXBzaG90IHRhcmdldCByZWdpc3RlciBmYWlsZWQgJWQiLCByKTsKQEAgLTE0NTIsMzkgKzE0NjUsMzQgQEAKIAogCXJldHVybiAwOwogCi0gICAgICBiYWRfcGVuZGluZ19wb29sOgorYmFkX3BlbmRpbmdfcG9vbDoKIAlrbWVtX2NhY2hlX2Rlc3Ryb3kodHJhY2tlZF9jaHVua19jYWNoZSk7Ci0gICAgICBiYWQ1OgorYmFkNToKIAlrbWVtX2NhY2hlX2Rlc3Ryb3kocGVuZGluZ19jYWNoZSk7Ci0gICAgICBiYWQ0OgorYmFkNDoKIAlrbWVtX2NhY2hlX2Rlc3Ryb3koZXhjZXB0aW9uX2NhY2hlKTsKLSAgICAgIGJhZDM6CitiYWQzOgogCWV4aXRfb3JpZ2luX2hhc2goKTsKLSAgICAgIGJhZDI6CitiYWQyOgogCWRtX3VucmVnaXN0ZXJfdGFyZ2V0KCZvcmlnaW5fdGFyZ2V0KTsKLSAgICAgIGJhZDE6CitiYWQxOgogCWRtX3VucmVnaXN0ZXJfdGFyZ2V0KCZzbmFwc2hvdF90YXJnZXQpOwogCXJldHVybiByOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZG1fc25hcHNob3RfZXhpdCh2b2lkKQogewotCWludCByOwotCiAJZGVzdHJveV93b3JrcXVldWUoa3NuYXBkKTsKIAotCXIgPSBkbV91bnJlZ2lzdGVyX3RhcmdldCgmc25hcHNob3RfdGFyZ2V0KTsKLQlpZiAocikKLQkJRE1FUlIoInNuYXBzaG90IHVucmVnaXN0ZXIgZmFpbGVkICVkIiwgcik7Ci0KLQlyID0gZG1fdW5yZWdpc3Rlcl90YXJnZXQoJm9yaWdpbl90YXJnZXQpOwotCWlmIChyKQotCQlETUVSUigib3JpZ2luIHVucmVnaXN0ZXIgZmFpbGVkICVkIiwgcik7CisJZG1fdW5yZWdpc3Rlcl90YXJnZXQoJnNuYXBzaG90X3RhcmdldCk7CisJZG1fdW5yZWdpc3Rlcl90YXJnZXQoJm9yaWdpbl90YXJnZXQpOwogCiAJZXhpdF9vcmlnaW5faGFzaCgpOwogCWttZW1fY2FjaGVfZGVzdHJveShwZW5kaW5nX2NhY2hlKTsKIAlrbWVtX2NhY2hlX2Rlc3Ryb3koZXhjZXB0aW9uX2NhY2hlKTsKIAlrbWVtX2NhY2hlX2Rlc3Ryb3kodHJhY2tlZF9jaHVua19jYWNoZSk7CisKKwlkbV9leGNlcHRpb25fc3RvcmVfZXhpdCgpOwogfQogCiAvKiBNb2R1bGUgaG9va3MgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tc25hcC5oIGIvZHJpdmVycy9tZC9kbS1zbmFwLmgKaW5kZXggOTljMDEwNi4uZDllNjJiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1zbmFwLmgKKysrIGIvZHJpdmVycy9tZC9kbS1zbmFwLmgKQEAgLTEsNiArMSw0IEBACiAvKgotICogZG0tc25hcHNob3QuYwotICoKICAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIFNpc3RpbmEgU29mdHdhcmUgKFVLKSBMaW1pdGVkLgogICoKICAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgpAQCAtMTAsNiArOCw3IEBACiAjZGVmaW5lIERNX1NOQVBTSE9UX0gKIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS1tYXBwZXIuaD4KKyNpbmNsdWRlICJkbS1leGNlcHRpb24tc3RvcmUuaCIKICNpbmNsdWRlICJkbS1iaW8tbGlzdC5oIgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgpAQCAtMjAsMTE2ICsxOSw2IEBACiAJc3RydWN0IGxpc3RfaGVhZCAqdGFibGU7CiB9OwogCi0vKgotICogVGhlIHNuYXBzaG90IGNvZGUgZGVhbHMgd2l0aCBsYXJnaXNoIGNodW5rcyBvZiB0aGUgZGlzayBhdCBhCi0gKiB0aW1lLiBUeXBpY2FsbHkgMzJrIC0gNTEyay4KLSAqLwotdHlwZWRlZiBzZWN0b3JfdCBjaHVua190OwotCi0vKgotICogQW4gZXhjZXB0aW9uIGlzIHVzZWQgd2hlcmUgYW4gb2xkIGNodW5rIG9mIGRhdGEgaGFzIGJlZW4KLSAqIHJlcGxhY2VkIGJ5IGEgbmV3IG9uZS4KLSAqIElmIGNodW5rX3QgaXMgNjQgYml0cyBpbiBzaXplLCB0aGUgdG9wIDggYml0cyBvZiBuZXdfY2h1bmsgaG9sZCB0aGUgbnVtYmVyCi0gKiBvZiBjaHVua3MgdGhhdCBmb2xsb3cgY29udGlndW91c2x5LiAgUmVtYWluaW5nIGJpdHMgaG9sZCB0aGUgbnVtYmVyIG9mIHRoZQotICogY2h1bmsgd2l0aGluIHRoZSBkZXZpY2UuCi0gKi8KLXN0cnVjdCBkbV9zbmFwX2V4Y2VwdGlvbiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBoYXNoX2xpc3Q7Ci0KLQljaHVua190IG9sZF9jaHVuazsKLQljaHVua190IG5ld19jaHVuazsKLX07Ci0KLS8qCi0gKiBGdW50aW9ucyB0byBtYW5pcHVsYXRlIGNvbnNlY3V0aXZlIGNodW5rcwotICovCi0jICBpZiBkZWZpbmVkKENPTkZJR19MQkQpIHx8IChCSVRTX1BFUl9MT05HID09IDY0KQotIyAgICBkZWZpbmUgRE1fQ0hVTktfQ09OU0VDVVRJVkVfQklUUyA4Ci0jICAgIGRlZmluZSBETV9DSFVOS19OVU1CRVJfQklUUyA1NgotCi1zdGF0aWMgaW5saW5lIGNodW5rX3QgZG1fY2h1bmtfbnVtYmVyKGNodW5rX3QgY2h1bmspCi17Ci0JcmV0dXJuIGNodW5rICYgKGNodW5rX3QpKCgxVUxMIDw8IERNX0NIVU5LX05VTUJFUl9CSVRTKSAtIDFVTEwpOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGRtX2NvbnNlY3V0aXZlX2NodW5rX2NvdW50KHN0cnVjdCBkbV9zbmFwX2V4Y2VwdGlvbiAqZSkKLXsKLQlyZXR1cm4gZS0+bmV3X2NodW5rID4+IERNX0NIVU5LX05VTUJFUl9CSVRTOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZG1fY29uc2VjdXRpdmVfY2h1bmtfY291bnRfaW5jKHN0cnVjdCBkbV9zbmFwX2V4Y2VwdGlvbiAqZSkKLXsKLQllLT5uZXdfY2h1bmsgKz0gKDFVTEwgPDwgRE1fQ0hVTktfTlVNQkVSX0JJVFMpOwotCi0JQlVHX09OKCFkbV9jb25zZWN1dGl2ZV9jaHVua19jb3VudChlKSk7Ci19Ci0KLSMgIGVsc2UKLSMgICAgZGVmaW5lIERNX0NIVU5LX0NPTlNFQ1VUSVZFX0JJVFMgMAotCi1zdGF0aWMgaW5saW5lIGNodW5rX3QgZG1fY2h1bmtfbnVtYmVyKGNodW5rX3QgY2h1bmspCi17Ci0JcmV0dXJuIGNodW5rOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGRtX2NvbnNlY3V0aXZlX2NodW5rX2NvdW50KHN0cnVjdCBkbV9zbmFwX2V4Y2VwdGlvbiAqZSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGRtX2NvbnNlY3V0aXZlX2NodW5rX2NvdW50X2luYyhzdHJ1Y3QgZG1fc25hcF9leGNlcHRpb24gKmUpCi17Ci19Ci0KLSMgIGVuZGlmCi0KLS8qCi0gKiBBYnN0cmFjdGlvbiB0byBoYW5kbGUgdGhlIG1ldGEvbGF5b3V0IG9mIGV4Y2VwdGlvbiBzdG9yZXMgKHRoZQotICogQ09XIGRldmljZSkuCi0gKi8KLXN0cnVjdCBleGNlcHRpb25fc3RvcmUgewotCi0JLyoKLQkgKiBEZXN0cm95cyB0aGlzIG9iamVjdCB3aGVuIHlvdSd2ZSBmaW5pc2hlZCB3aXRoIGl0LgotCSAqLwotCXZvaWQgKCpkZXN0cm95KSAoc3RydWN0IGV4Y2VwdGlvbl9zdG9yZSAqc3RvcmUpOwotCi0JLyoKLQkgKiBUaGUgdGFyZ2V0IHNob3VsZG4ndCByZWFkIHRoZSBDT1cgZGV2aWNlIHVudGlsIHRoaXMgaXMKLQkgKiBjYWxsZWQuCi0JICovCi0JaW50ICgqcmVhZF9tZXRhZGF0YSkgKHN0cnVjdCBleGNlcHRpb25fc3RvcmUgKnN0b3JlKTsKLQotCS8qCi0JICogRmluZCBzb21ld2hlcmUgdG8gc3RvcmUgdGhlIG5leHQgZXhjZXB0aW9uLgotCSAqLwotCWludCAoKnByZXBhcmVfZXhjZXB0aW9uKSAoc3RydWN0IGV4Y2VwdGlvbl9zdG9yZSAqc3RvcmUsCi0JCQkJICBzdHJ1Y3QgZG1fc25hcF9leGNlcHRpb24gKmUpOwotCi0JLyoKLQkgKiBVcGRhdGUgdGhlIG1ldGFkYXRhIHdpdGggdGhpcyBleGNlcHRpb24uCi0JICovCi0Jdm9pZCAoKmNvbW1pdF9leGNlcHRpb24pIChzdHJ1Y3QgZXhjZXB0aW9uX3N0b3JlICpzdG9yZSwKLQkJCQkgIHN0cnVjdCBkbV9zbmFwX2V4Y2VwdGlvbiAqZSwKLQkJCQkgIHZvaWQgKCpjYWxsYmFjaykgKHZvaWQgKiwgaW50IHN1Y2Nlc3MpLAotCQkJCSAgdm9pZCAqY2FsbGJhY2tfY29udGV4dCk7Ci0KLQkvKgotCSAqIFRoZSBzbmFwc2hvdCBpcyBpbnZhbGlkLCBub3RlIHRoaXMgaW4gdGhlIG1ldGFkYXRhLgotCSAqLwotCXZvaWQgKCpkcm9wX3NuYXBzaG90KSAoc3RydWN0IGV4Y2VwdGlvbl9zdG9yZSAqc3RvcmUpOwotCi0JLyoKLQkgKiBSZXR1cm4gaG93IGZ1bGwgdGhlIHNuYXBzaG90IGlzLgotCSAqLwotCXZvaWQgKCpmcmFjdGlvbl9mdWxsKSAoc3RydWN0IGV4Y2VwdGlvbl9zdG9yZSAqc3RvcmUsCi0JCQkgICAgICAgc2VjdG9yX3QgKm51bWVyYXRvciwKLQkJCSAgICAgICBzZWN0b3JfdCAqZGVub21pbmF0b3IpOwotCi0Jc3RydWN0IGRtX3NuYXBzaG90ICpzbmFwOwotCXZvaWQgKmNvbnRleHQ7Ci19OwotCiAjZGVmaW5lIERNX1RSQUNLRURfQ0hVTktfSEFTSF9TSVpFCTE2CiAjZGVmaW5lIERNX1RSQUNLRURfQ0hVTktfSEFTSCh4KQkoKHVuc2lnbmVkIGxvbmcpKHgpICYgXAogCQkJCQkgKERNX1RSQUNLRURfQ0hVTktfSEFTSF9TSVpFIC0gMSkpCkBAIC0xNzIsNyArNjEsNyBAQAogCXNwaW5sb2NrX3QgcGVfbG9jazsKIAogCS8qIFRoZSBvbiBkaXNrIG1ldGFkYXRhIGhhbmRsZXIgKi8KLQlzdHJ1Y3QgZXhjZXB0aW9uX3N0b3JlIHN0b3JlOworCXN0cnVjdCBkbV9leGNlcHRpb25fc3RvcmUgc3RvcmU7CiAKIAlzdHJ1Y3QgZG1fa2NvcHlkX2NsaWVudCAqa2NvcHlkX2NsaWVudDsKIApAQCAtMTg3LDIwICs3Niw2IEBACiB9OwogCiAvKgotICogVXNlZCBieSB0aGUgZXhjZXB0aW9uIHN0b3JlcyB0byBsb2FkIGV4Y2VwdGlvbnMgaGVuCi0gKiBpbml0aWFsaXNpbmcuCi0gKi8KLWludCBkbV9hZGRfZXhjZXB0aW9uKHN0cnVjdCBkbV9zbmFwc2hvdCAqcywgY2h1bmtfdCBvbGQsIGNodW5rX3QgbmV3KTsKLQotLyoKLSAqIENvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIGZvciB0aGUgZGVmYXVsdCBwZXJzaXN0ZW50Ci0gKiBzdG9yZS4KLSAqLwotaW50IGRtX2NyZWF0ZV9wZXJzaXN0ZW50KHN0cnVjdCBleGNlcHRpb25fc3RvcmUgKnN0b3JlKTsKLQotaW50IGRtX2NyZWF0ZV90cmFuc2llbnQoc3RydWN0IGV4Y2VwdGlvbl9zdG9yZSAqc3RvcmUpOwotCi0vKgogICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc2VjdG9ycyBpbiB0aGUgZGV2aWNlLgogICovCiBzdGF0aWMgaW5saW5lIHNlY3Rvcl90IGdldF9kZXZfc2l6ZShzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1zdHJpcGUuYyBiL2RyaXZlcnMvbWQvZG0tc3RyaXBlLmMKaW5kZXggOWU0ZWY4OC4uNDE1NjliYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1zdHJpcGUuYworKysgYi9kcml2ZXJzL21kL2RtLXN0cmlwZS5jCkBAIC0zMzcsOSArMzM3LDcgQEAKIAogdm9pZCBkbV9zdHJpcGVfZXhpdCh2b2lkKQogewotCWlmIChkbV91bnJlZ2lzdGVyX3RhcmdldCgmc3RyaXBlX3RhcmdldCkpCi0JCURNV0FSTigidGFyZ2V0IHVucmVnaXN0cmF0aW9uIGZhaWxlZCIpOwotCisJZG1fdW5yZWdpc3Rlcl90YXJnZXQoJnN0cmlwZV90YXJnZXQpOwogCWRlc3Ryb3lfd29ya3F1ZXVlKGtzdHJpcGVkKTsKIAogCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tc3lzZnMuYyBiL2RyaXZlcnMvbWQvZG0tc3lzZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmE0NWU2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZC9kbS1zeXNmcy5jCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtLWlvY3RsLmg+CisjaW5jbHVkZSAiZG0uaCIKKworc3RydWN0IGRtX3N5c2ZzX2F0dHIgeworCXN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKKwlzc2l6ZV90ICgqc2hvdykoc3RydWN0IG1hcHBlZF9kZXZpY2UgKiwgY2hhciAqKTsKKwlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBtYXBwZWRfZGV2aWNlICosIGNoYXIgKik7Cit9OworCisjZGVmaW5lIERNX0FUVFJfUk8oX25hbWUpIFwKK3N0cnVjdCBkbV9zeXNmc19hdHRyIGRtX2F0dHJfIyNfbmFtZSA9IFwKKwlfX0FUVFIoX25hbWUsIFNfSVJVR08sIGRtX2F0dHJfIyNfbmFtZSMjX3Nob3csIE5VTEwpCisKK3N0YXRpYyBzc2l6ZV90IGRtX2F0dHJfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICBjaGFyICpwYWdlKQoreworCXN0cnVjdCBkbV9zeXNmc19hdHRyICpkbV9hdHRyOworCXN0cnVjdCBtYXBwZWRfZGV2aWNlICptZDsKKwlzc2l6ZV90IHJldDsKKworCWRtX2F0dHIgPSBjb250YWluZXJfb2YoYXR0ciwgc3RydWN0IGRtX3N5c2ZzX2F0dHIsIGF0dHIpOworCWlmICghZG1fYXR0ci0+c2hvdykKKwkJcmV0dXJuIC1FSU87CisKKwltZCA9IGRtX2dldF9mcm9tX2tvYmplY3Qoa29iaik7CisJaWYgKCFtZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBkbV9hdHRyLT5zaG93KG1kLCBwYWdlKTsKKwlkbV9wdXQobWQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgZG1fYXR0cl9uYW1lX3Nob3coc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kLCBjaGFyICpidWYpCit7CisJaWYgKGRtX2NvcHlfbmFtZV9hbmRfdXVpZChtZCwgYnVmLCBOVUxMKSkKKwkJcmV0dXJuIC1FSU87CisKKwlzdHJjYXQoYnVmLCAiXG4iKTsKKwlyZXR1cm4gc3RybGVuKGJ1Zik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRtX2F0dHJfdXVpZF9zaG93KHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCwgY2hhciAqYnVmKQoreworCWlmIChkbV9jb3B5X25hbWVfYW5kX3V1aWQobWQsIE5VTEwsIGJ1ZikpCisJCXJldHVybiAtRUlPOworCisJc3RyY2F0KGJ1ZiwgIlxuIik7CisJcmV0dXJuIHN0cmxlbihidWYpOworfQorCitzdGF0aWMgRE1fQVRUUl9STyhuYW1lKTsKK3N0YXRpYyBETV9BVFRSX1JPKHV1aWQpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZG1fYXR0cnNbXSA9IHsKKwkmZG1fYXR0cl9uYW1lLmF0dHIsCisJJmRtX2F0dHJfdXVpZC5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IHN5c2ZzX29wcyBkbV9zeXNmc19vcHMgPSB7CisJLnNob3cJPSBkbV9hdHRyX3Nob3csCit9OworCisvKgorICogZG0ga29iamVjdCBpcyBlbWJlZGRlZCBpbiBtYXBwZWRfZGV2aWNlIHN0cnVjdHVyZQorICogbm8gbmVlZCB0byBkZWZpbmUgcmVsZWFzZSBmdW5jdGlvbiBoZXJlCisgKi8KK3N0YXRpYyBzdHJ1Y3Qga29ial90eXBlIGRtX2t0eXBlID0geworCS5zeXNmc19vcHMJPSAmZG1fc3lzZnNfb3BzLAorCS5kZWZhdWx0X2F0dHJzCT0gZG1fYXR0cnMsCit9OworCisvKgorICogSW5pdGlhbGl6ZSBrb2JqCisgKiBiZWNhdXNlIG5vYm9keSB1c2luZyBtZCB5ZXQsIG5vIG5lZWQgdG8gY2FsbCBleHBsaWNpdCBkbV9nZXQvcHV0CisgKi8KK2ludCBkbV9zeXNmc19pbml0KHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCkKK3sKKwlyZXR1cm4ga29iamVjdF9pbml0X2FuZF9hZGQoZG1fa29iamVjdChtZCksICZkbV9rdHlwZSwKKwkJCQkgICAgJmRpc2tfdG9fZGV2KGRtX2Rpc2sobWQpKS0+a29iaiwKKwkJCQkgICAgIiVzIiwgImRtIik7Cit9CisKKy8qCisgKiBSZW1vdmUga29iaiwgY2FsbGVkIGFmdGVyIGFsbCByZWZlcmVuY2VzIHJlbW92ZWQKKyAqLwordm9pZCBkbV9zeXNmc19leGl0KHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCkKK3sKKwlrb2JqZWN0X3B1dChkbV9rb2JqZWN0KG1kKSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXRhYmxlLmMgYi9kcml2ZXJzL21kL2RtLXRhYmxlLmMKaW5kZXggMDRlNWZkNy4uMmZkNjZjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS10YWJsZS5jCisrKyBiL2RyaXZlcnMvbWQvZG0tdGFibGUuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEgU2lzdGluYSBTb2Z0d2FyZSAoVUspIExpbWl0ZWQuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDggUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgogICovCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAKICNkZWZpbmUgRE1fTVNHX1BSRUZJWCAidGFibGUiCkBAIC0yNCw2ICsyNSwxOSBAQAogI2RlZmluZSBLRVlTX1BFUl9OT0RFIChOT0RFX1NJWkUgLyBzaXplb2Yoc2VjdG9yX3QpKQogI2RlZmluZSBDSElMRFJFTl9QRVJfTk9ERSAoS0VZU19QRVJfTk9ERSArIDEpCiAKKy8qCisgKiBUaGUgdGFibGUgaGFzIGFsd2F5cyBleGFjdGx5IG9uZSByZWZlcmVuY2UgZnJvbSBlaXRoZXIgbWFwcGVkX2RldmljZS0+bWFwCisgKiBvciBoYXNoX2NlbGwtPm5ld19tYXAuIFRoaXMgcmVmZXJlbmNlIGlzIG5vdCBjb3VudGVkIGluIHRhYmxlLT5ob2xkZXJzLgorICogQSBwYWlyIG9mIGRtX2NyZWF0ZV90YWJsZS9kbV9kZXN0cm95X3RhYmxlIGZ1bmN0aW9ucyBpcyB1c2VkIGZvciB0YWJsZQorICogY3JlYXRpb24vZGVzdHJ1Y3Rpb24uCisgKgorICogVGVtcG9yYXJ5IHJlZmVyZW5jZXMgZnJvbSB0aGUgb3RoZXIgY29kZSBpbmNyZWFzZSB0YWJsZS0+aG9sZGVycy4gQSBwYWlyCisgKiBvZiBkbV90YWJsZV9nZXQvZG1fdGFibGVfcHV0IGZ1bmN0aW9ucyBpcyB1c2VkIHRvIG1hbmlwdWxhdGUgaXQuCisgKgorICogV2hlbiB0aGUgdGFibGUgaXMgYWJvdXQgdG8gYmUgZGVzdHJveWVkLCB3ZSB3YWl0IGZvciB0YWJsZS0+aG9sZGVycyB0bworICogZHJvcCB0byB6ZXJvLgorICovCisKIHN0cnVjdCBkbV90YWJsZSB7CiAJc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kOwogCWF0b21pY190IGhvbGRlcnM7CkBAIC0zOCw2ICs1Miw4IEBACiAJc2VjdG9yX3QgKmhpZ2hzOwogCXN0cnVjdCBkbV90YXJnZXQgKnRhcmdldHM7CiAKKwl1bnNpZ25lZCBiYXJyaWVyc19zdXBwb3J0ZWQ6MTsKKwogCS8qCiAJICogSW5kaWNhdGVzIHRoZSBydyBwZXJtaXNzaW9ucyBmb3IgdGhlIG5ldyBsb2dpY2FsCiAJICogZGV2aWNlLiAgVGhpcyBzaG91bGQgYmUgYSBjb21iaW5hdGlvbiBvZiBGTU9ERV9SRUFECkBAIC0yMjYsNyArMjQyLDggQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlJTklUX0xJU1RfSEVBRCgmdC0+ZGV2aWNlcyk7Ci0JYXRvbWljX3NldCgmdC0+aG9sZGVycywgMSk7CisJYXRvbWljX3NldCgmdC0+aG9sZGVycywgMCk7CisJdC0+YmFycmllcnNfc3VwcG9ydGVkID0gMTsKIAogCWlmICghbnVtX3RhcmdldHMpCiAJCW51bV90YXJnZXRzID0gS0VZU19QRVJfTk9ERTsKQEAgLTI1NiwxMCArMjczLDE0IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCB0YWJsZV9kZXN0cm95KHN0cnVjdCBkbV90YWJsZSAqdCkKK3ZvaWQgZG1fdGFibGVfZGVzdHJveShzdHJ1Y3QgZG1fdGFibGUgKnQpCiB7CiAJdW5zaWduZWQgaW50IGk7CiAKKwl3aGlsZSAoYXRvbWljX3JlYWQoJnQtPmhvbGRlcnMpKQorCQltc2xlZXAoMSk7CisJc21wX21iKCk7CisKIAkvKiBmcmVlIHRoZSBpbmRleGVzIChzZWUgZG1fdGFibGVfY29tcGxldGUpICovCiAJaWYgKHQtPmRlcHRoID49IDIpCiAJCXZmcmVlKHQtPmluZGV4W3QtPmRlcHRoIC0gMl0pOwpAQCAtMjk3LDggKzMxOCw4IEBACiAJaWYgKCF0KQogCQlyZXR1cm47CiAKLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmdC0+aG9sZGVycykpCi0JCXRhYmxlX2Rlc3Ryb3kodCk7CisJc21wX21iX19iZWZvcmVfYXRvbWljX2RlYygpOworCWF0b21pY19kZWMoJnQtPmhvbGRlcnMpOwogfQogCiAvKgpAQCAtNzI4LDYgKzc0OSwxMCBAQAogCS8qIEZJWE1FOiB0aGUgcGxhbiBpcyB0byBjb21iaW5lIGhpZ2ggaGVyZSBhbmQgdGhlbiBoYXZlCiAJICogdGhlIG1lcmdlIGZuIGFwcGx5IHRoZSB0YXJnZXQgbGV2ZWwgcmVzdHJpY3Rpb25zLiAqLwogCWNvbWJpbmVfcmVzdHJpY3Rpb25zX2xvdygmdC0+bGltaXRzLCAmdGd0LT5saW1pdHMpOworCisJaWYgKCEodGd0LT50eXBlLT5mZWF0dXJlcyAmIERNX1RBUkdFVF9TVVBQT1JUU19CQVJSSUVSUykpCisJCXQtPmJhcnJpZXJzX3N1cHBvcnRlZCA9IDA7CisKIAlyZXR1cm4gMDsKIAogIGJhZDoKQEAgLTc3Miw2ICs3OTcsMTIgQEAKIAogCWNoZWNrX2Zvcl92YWxpZF9saW1pdHMoJnQtPmxpbWl0cyk7CiAKKwkvKgorCSAqIFdlIG9ubHkgc3VwcG9ydCBiYXJyaWVycyBpZiB0aGVyZSBpcyBleGFjdGx5IG9uZSB1bmRlcmx5aW5nIGRldmljZS4KKwkgKi8KKwlpZiAoIWxpc3RfaXNfc2luZ3VsYXIoJnQtPmRldmljZXMpKQorCQl0LT5iYXJyaWVyc19zdXBwb3J0ZWQgPSAwOworCiAJLyogaG93IG1hbnkgaW5kZXhlcyB3aWxsIHRoZSBidHJlZSBoYXZlID8gKi8KIAlsZWFmX25vZGVzID0gZG1fZGl2X3VwKHQtPm51bV90YXJnZXRzLCBLRVlTX1BFUl9OT0RFKTsKIAl0LT5kZXB0aCA9IDEgKyBpbnRfbG9nKGxlYWZfbm9kZXMsIENISUxEUkVOX1BFUl9OT0RFKTsKQEAgLTk4Niw2ICsxMDE3LDEyIEBACiAJcmV0dXJuIHQtPm1kOwogfQogCitpbnQgZG1fdGFibGVfYmFycmllcl9vayhzdHJ1Y3QgZG1fdGFibGUgKnQpCit7CisJcmV0dXJuIHQtPmJhcnJpZXJzX3N1cHBvcnRlZDsKK30KK0VYUE9SVF9TWU1CT0woZG1fdGFibGVfYmFycmllcl9vayk7CisKIEVYUE9SVF9TWU1CT0woZG1fdmNhbGxvYyk7CiBFWFBPUlRfU1lNQk9MKGRtX2dldF9kZXZpY2UpOwogRVhQT1JUX1NZTUJPTChkbV9wdXRfZGV2aWNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tdGFyZ2V0LmMgYi9kcml2ZXJzL21kL2RtLXRhcmdldC5jCmluZGV4IDgzNWNmOTUuLjdkZWNmMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tdGFyZ2V0LmMKKysrIGIvZHJpdmVycy9tZC9kbS10YXJnZXQuYwpAQCAtMTMwLDI2ICsxMzAsMjYgQEAKIAlyZXR1cm4gcnY7CiB9CiAKLWludCBkbV91bnJlZ2lzdGVyX3RhcmdldChzdHJ1Y3QgdGFyZ2V0X3R5cGUgKnQpCit2b2lkIGRtX3VucmVnaXN0ZXJfdGFyZ2V0KHN0cnVjdCB0YXJnZXRfdHlwZSAqdCkKIHsKIAlzdHJ1Y3QgdHRfaW50ZXJuYWwgKnRpOwogCiAJZG93bl93cml0ZSgmX2xvY2spOwogCWlmICghKHRpID0gX19maW5kX3RhcmdldF90eXBlKHQtPm5hbWUpKSkgewotCQl1cF93cml0ZSgmX2xvY2spOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJRE1DUklUKCJVbnJlZ2lzdGVyaW5nIHVucmVjb2duaXNlZCB0YXJnZXQ6ICVzIiwgdC0+bmFtZSk7CisJCUJVRygpOwogCX0KIAogCWlmICh0aS0+dXNlKSB7Ci0JCXVwX3dyaXRlKCZfbG9jayk7Ci0JCXJldHVybiAtRVRYVEJTWTsKKwkJRE1DUklUKCJBdHRlbXB0IHRvIHVucmVnaXN0ZXIgdGFyZ2V0IHN0aWxsIGluIHVzZTogJXMiLAorCQkgICAgICAgdC0+bmFtZSk7CisJCUJVRygpOwogCX0KIAogCWxpc3RfZGVsKCZ0aS0+bGlzdCk7CiAJa2ZyZWUodGkpOwogCiAJdXBfd3JpdGUoJl9sb2NrKTsKLQlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTE4Nyw4ICsxODcsNyBAQAogCiB2b2lkIGRtX3RhcmdldF9leGl0KHZvaWQpCiB7Ci0JaWYgKGRtX3VucmVnaXN0ZXJfdGFyZ2V0KCZlcnJvcl90YXJnZXQpKQotCQlETVdBUk4oImVycm9yIHRhcmdldCB1bnJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKKwlkbV91bnJlZ2lzdGVyX3RhcmdldCgmZXJyb3JfdGFyZ2V0KTsKIH0KIAogRVhQT1JUX1NZTUJPTChkbV9yZWdpc3Rlcl90YXJnZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS16ZXJvLmMgYi9kcml2ZXJzL21kL2RtLXplcm8uYwppbmRleCBjZGJmMTI2Li5iYmM5NzAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLXplcm8uYworKysgYi9kcml2ZXJzL21kL2RtLXplcm8uYwpAQCAtNjksMTAgKzY5LDcgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IGRtX3plcm9fZXhpdCh2b2lkKQogewotCWludCByID0gZG1fdW5yZWdpc3Rlcl90YXJnZXQoJnplcm9fdGFyZ2V0KTsKLQotCWlmIChyIDwgMCkKLQkJRE1FUlIoInVucmVnaXN0ZXIgZmFpbGVkICVkIiwgcik7CisJZG1fdW5yZWdpc3Rlcl90YXJnZXQoJnplcm9fdGFyZ2V0KTsKIH0KIAogbW9kdWxlX2luaXQoZG1femVyb19pbml0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS5jIGIvZHJpdmVycy9tZC9kbS5jCmluZGV4IDQyMWM5ZjAuLjUxYmExZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0uYworKysgYi9kcml2ZXJzL21kL2RtLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIFNpc3RpbmEgU29mdHdhcmUgKFVLKSBMaW1pdGVkLgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDggUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgogICovCkBAIC0zMiw2ICszMiw3IEBACiAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soX21pbm9yX2xvY2spOwogLyoKKyAqIEZvciBiaW8tYmFzZWQgZG0uCiAgKiBPbmUgb2YgdGhlc2UgaXMgYWxsb2NhdGVkIHBlciBiaW8uCiAgKi8KIHN0cnVjdCBkbV9pbyB7CkBAIC00Myw2ICs0NCw3IEBACiB9OwogCiAvKgorICogRm9yIGJpby1iYXNlZCBkbS4KICAqIE9uZSBvZiB0aGVzZSBpcyBhbGxvY2F0ZWQgcGVyIHRhcmdldCB3aXRoaW4gYSBiaW8uICBIb3BlZnVsbHkKICAqIHRoaXMgd2lsbCBiZSBzaW1wbGlmaWVkIG91dCBvbmUgZGF5LgogICovCkBAIC01NCw2ICs1NiwyNyBAQAogCiBERUZJTkVfVFJBQ0UoYmxvY2tfYmlvX2NvbXBsZXRlKTsKIAorLyoKKyAqIEZvciByZXF1ZXN0LWJhc2VkIGRtLgorICogT25lIG9mIHRoZXNlIGlzIGFsbG9jYXRlZCBwZXIgcmVxdWVzdC4KKyAqLworc3RydWN0IGRtX3JxX3RhcmdldF9pbyB7CisJc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kOworCXN0cnVjdCBkbV90YXJnZXQgKnRpOworCXN0cnVjdCByZXF1ZXN0ICpvcmlnLCBjbG9uZTsKKwlpbnQgZXJyb3I7CisJdW5pb24gbWFwX2luZm8gaW5mbzsKK307CisKKy8qCisgKiBGb3IgcmVxdWVzdC1iYXNlZCBkbS4KKyAqIE9uZSBvZiB0aGVzZSBpcyBhbGxvY2F0ZWQgcGVyIGJpby4KKyAqLworc3RydWN0IGRtX3JxX2Nsb25lX2Jpb19pbmZvIHsKKwlzdHJ1Y3QgYmlvICpvcmlnOworCXN0cnVjdCByZXF1ZXN0ICpycTsKK307CisKIHVuaW9uIG1hcF9pbmZvICpkbV9nZXRfbWFwaW5mbyhzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJaWYgKGJpbyAmJiBiaW8tPmJpX3ByaXZhdGUpCkBAIC0xNDQsMTEgKzE2NywxNiBAQAogCiAJLyogZm9yY2VkIGdlb21ldHJ5IHNldHRpbmdzICovCiAJc3RydWN0IGhkX2dlb21ldHJ5IGdlb21ldHJ5OworCisJLyogc3lzZnMgaGFuZGxlICovCisJc3RydWN0IGtvYmplY3Qga29iajsKIH07CiAKICNkZWZpbmUgTUlOX0lPUyAyNTYKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqX2lvX2NhY2hlOwogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpfdGlvX2NhY2hlOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpfcnFfdGlvX2NhY2hlOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpfcnFfYmlvX2luZm9fY2FjaGU7CiAKIHN0YXRpYyBpbnQgX19pbml0IGxvY2FsX2luaXQodm9pZCkKIHsKQEAgLTE2NCw5ICsxOTIsMTcgQEAKIAlpZiAoIV90aW9fY2FjaGUpCiAJCWdvdG8gb3V0X2ZyZWVfaW9fY2FjaGU7CiAKKwlfcnFfdGlvX2NhY2hlID0gS01FTV9DQUNIRShkbV9ycV90YXJnZXRfaW8sIDApOworCWlmICghX3JxX3Rpb19jYWNoZSkKKwkJZ290byBvdXRfZnJlZV90aW9fY2FjaGU7CisKKwlfcnFfYmlvX2luZm9fY2FjaGUgPSBLTUVNX0NBQ0hFKGRtX3JxX2Nsb25lX2Jpb19pbmZvLCAwKTsKKwlpZiAoIV9ycV9iaW9faW5mb19jYWNoZSkKKwkJZ290byBvdXRfZnJlZV9ycV90aW9fY2FjaGU7CisKIAlyID0gZG1fdWV2ZW50X2luaXQoKTsKIAlpZiAocikKLQkJZ290byBvdXRfZnJlZV90aW9fY2FjaGU7CisJCWdvdG8gb3V0X2ZyZWVfcnFfYmlvX2luZm9fY2FjaGU7CiAKIAlfbWFqb3IgPSBtYWpvcjsKIAlyID0gcmVnaXN0ZXJfYmxrZGV2KF9tYWpvciwgX25hbWUpOwpAQCAtMTgwLDYgKzIxNiwxMCBAQAogCiBvdXRfdWV2ZW50X2V4aXQ6CiAJZG1fdWV2ZW50X2V4aXQoKTsKK291dF9mcmVlX3JxX2Jpb19pbmZvX2NhY2hlOgorCWttZW1fY2FjaGVfZGVzdHJveShfcnFfYmlvX2luZm9fY2FjaGUpOworb3V0X2ZyZWVfcnFfdGlvX2NhY2hlOgorCWttZW1fY2FjaGVfZGVzdHJveShfcnFfdGlvX2NhY2hlKTsKIG91dF9mcmVlX3Rpb19jYWNoZToKIAlrbWVtX2NhY2hlX2Rlc3Ryb3koX3Rpb19jYWNoZSk7CiBvdXRfZnJlZV9pb19jYWNoZToKQEAgLTE5MCw2ICsyMzAsOCBAQAogCiBzdGF0aWMgdm9pZCBsb2NhbF9leGl0KHZvaWQpCiB7CisJa21lbV9jYWNoZV9kZXN0cm95KF9ycV9iaW9faW5mb19jYWNoZSk7CisJa21lbV9jYWNoZV9kZXN0cm95KF9ycV90aW9fY2FjaGUpOwogCWttZW1fY2FjaGVfZGVzdHJveShfdGlvX2NhY2hlKTsKIAlrbWVtX2NhY2hlX2Rlc3Ryb3koX2lvX2NhY2hlKTsKIAl1bnJlZ2lzdGVyX2Jsa2RldihfbWFqb3IsIF9uYW1lKTsKQEAgLTc5Niw3ICs4MzgsMTEgQEAKIAljaS5tYXAgPSBkbV9nZXRfdGFibGUobWQpOwogCWlmICh1bmxpa2VseSghY2kubWFwKSkKIAkJcmV0dXJuIC1FSU87Ci0KKwlpZiAodW5saWtlbHkoYmlvX2JhcnJpZXIoYmlvKSAmJiAhZG1fdGFibGVfYmFycmllcl9vayhjaS5tYXApKSkgeworCQlkbV90YWJsZV9wdXQoY2kubWFwKTsKKwkJYmlvX2VuZGlvKGJpbywgLUVPUE5PVFNVUFApOworCQlyZXR1cm4gMDsKKwl9CiAJY2kubWQgPSBtZDsKIAljaS5iaW8gPSBiaW87CiAJY2kuaW8gPSBhbGxvY19pbyhtZCk7CkBAIC04ODAsMTUgKzkyNiw2IEBACiAJc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kID0gcS0+cXVldWVkYXRhOwogCWludCBjcHU7CiAKLQkvKgotCSAqIFRoZXJlIGlzIG5vIHVzZSBpbiBmb3J3YXJkaW5nIGFueSBiYXJyaWVyIHJlcXVlc3Qgc2luY2Ugd2UgY2FuJ3QKLQkgKiBndWFyYW50ZWUgaXQgaXMgKG9yIGNhbiBiZSkgaGFuZGxlZCBieSB0aGUgdGFyZ2V0cyBjb3JyZWN0bHkuCi0JICovCi0JaWYgKHVubGlrZWx5KGJpb19iYXJyaWVyKGJpbykpKSB7Ci0JCWJpb19lbmRpbyhiaW8sIC1FT1BOT1RTVVBQKTsKLQkJcmV0dXJuIDA7Ci0JfQotCiAJZG93bl9yZWFkKCZtZC0+aW9fbG9jayk7CiAKIAljcHUgPSBwYXJ0X3N0YXRfbG9jaygpOwpAQCAtOTQzLDggKzk4MCw2IEBACiAJc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kID0gY29uZ2VzdGVkX2RhdGE7CiAJc3RydWN0IGRtX3RhYmxlICptYXA7CiAKLQlhdG9taWNfaW5jKCZtZC0+cGVuZGluZyk7Ci0KIAlpZiAoIXRlc3RfYml0KERNRl9CTE9DS19JTywgJm1kLT5mbGFncykpIHsKIAkJbWFwID0gZG1fZ2V0X3RhYmxlKG1kKTsKIAkJaWYgKG1hcCkgewpAQCAtOTUzLDEwICs5ODgsNiBAQAogCQl9CiAJfQogCi0JaWYgKCFhdG9taWNfZGVjX3JldHVybigmbWQtPnBlbmRpbmcpKQotCQkvKiBudWRnZSBhbnlvbmUgd2FpdGluZyBvbiBzdXNwZW5kIHF1ZXVlICovCi0JCXdha2VfdXAoJm1kLT53YWl0KTsKLQogCXJldHVybiByOwogfQogCkBAIC0xMjE2LDEwICsxMjQ3LDEyIEBACiAKIAlpZiAobWQtPnN1c3BlbmRlZF9iZGV2KQogCQlfX3NldF9zaXplKG1kLCBzaXplKTsKLQlpZiAoc2l6ZSA9PSAwKQotCQlyZXR1cm4gMDsKIAotCWRtX3RhYmxlX2dldCh0KTsKKwlpZiAoIXNpemUpIHsKKwkJZG1fdGFibGVfZGVzdHJveSh0KTsKKwkJcmV0dXJuIDA7CisJfQorCiAJZG1fdGFibGVfZXZlbnRfY2FsbGJhY2sodCwgZXZlbnRfY2FsbGJhY2ssIG1kKTsKIAogCXdyaXRlX2xvY2soJm1kLT5tYXBfbG9jayk7CkBAIC0xMjQxLDcgKzEyNzQsNyBAQAogCXdyaXRlX2xvY2soJm1kLT5tYXBfbG9jayk7CiAJbWQtPm1hcCA9IE5VTEw7CiAJd3JpdGVfdW5sb2NrKCZtZC0+bWFwX2xvY2spOwotCWRtX3RhYmxlX3B1dChtYXApOworCWRtX3RhYmxlX2Rlc3Ryb3kobWFwKTsKIH0KIAogLyoKQEAgLTEyNTUsNiArMTI4OCw4IEBACiAJaWYgKCFtZCkKIAkJcmV0dXJuIC1FTlhJTzsKIAorCWRtX3N5c2ZzX2luaXQobWQpOworCiAJKnJlc3VsdCA9IG1kOwogCXJldHVybiAwOwogfQpAQCAtMTMzMCw4ICsxMzY1LDkgQEAKIAkJCWRtX3RhYmxlX3ByZXN1c3BlbmRfdGFyZ2V0cyhtYXApOwogCQkJZG1fdGFibGVfcG9zdHN1c3BlbmRfdGFyZ2V0cyhtYXApOwogCQl9Ci0JCV9fdW5iaW5kKG1kKTsKKwkJZG1fc3lzZnNfZXhpdChtZCk7CiAJCWRtX3RhYmxlX3B1dChtYXApOworCQlfX3VuYmluZChtZCk7CiAJCWZyZWVfZGV2KG1kKTsKIAl9CiB9CkBAIC0xNjY5LDYgKzE3MDUsMjcgQEAKIAlyZXR1cm4gbWQtPmRpc2s7CiB9CiAKK3N0cnVjdCBrb2JqZWN0ICpkbV9rb2JqZWN0KHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCkKK3sKKwlyZXR1cm4gJm1kLT5rb2JqOworfQorCisvKgorICogc3RydWN0IG1hcHBlZF9kZXZpY2Ugc2hvdWxkIG5vdCBiZSBleHBvcnRlZCBvdXRzaWRlIG9mIGRtLmMKKyAqIHNvIHVzZSB0aGlzIGNoZWNrIHRvIHZlcmlmeSB0aGF0IGtvYmogaXMgcGFydCBvZiBtZCBzdHJ1Y3R1cmUKKyAqLworc3RydWN0IG1hcHBlZF9kZXZpY2UgKmRtX2dldF9mcm9tX2tvYmplY3Qoc3RydWN0IGtvYmplY3QgKmtvYmopCit7CisJc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kOworCisJbWQgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IG1hcHBlZF9kZXZpY2UsIGtvYmopOworCWlmICgmbWQtPmtvYmogIT0ga29iaikKKwkJcmV0dXJuIE5VTEw7CisKKwlkbV9nZXQobWQpOworCXJldHVybiBtZDsKK30KKwogaW50IGRtX3N1c3BlbmRlZChzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpCiB7CiAJcmV0dXJuIHRlc3RfYml0KERNRl9TVVNQRU5ERUQsICZtZC0+ZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS5oIGIvZHJpdmVycy9tZC9kbS5oCmluZGV4IDBhZGU2MGMuLjIwMTk0ZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0uaAorKysgYi9kcml2ZXJzL21kL2RtLmgKQEAgLTM2LDYgKzM2LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIEludGVybmFsIHRhYmxlIGZ1bmN0aW9ucy4KICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgZG1fdGFibGVfZGVzdHJveShzdHJ1Y3QgZG1fdGFibGUgKnQpOwogdm9pZCBkbV90YWJsZV9ldmVudF9jYWxsYmFjayhzdHJ1Y3QgZG1fdGFibGUgKnQsCiAJCQkgICAgIHZvaWQgKCpmbikodm9pZCAqKSwgdm9pZCAqY29udGV4dCk7CiBzdHJ1Y3QgZG1fdGFyZ2V0ICpkbV90YWJsZV9nZXRfdGFyZ2V0KHN0cnVjdCBkbV90YWJsZSAqdCwgdW5zaWduZWQgaW50IGluZGV4KTsKQEAgLTUxLDYgKzUyLDcgQEAKICAqIFRvIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBkbV90YWJsZV9maW5kX3RhcmdldCgpLgogICovCiAjZGVmaW5lIGRtX3RhcmdldF9pc192YWxpZCh0KSAoKHQpLT50YWJsZSkKK2ludCBkbV90YWJsZV9iYXJyaWVyX29rKHN0cnVjdCBkbV90YWJsZSAqdCk7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIEEgcmVnaXN0cnkgb2YgdGFyZ2V0IHR5cGVzLgpAQCAtNzIsNiArNzQsMTQgQEAKIHZvaWQgZG1faW50ZXJmYWNlX2V4aXQodm9pZCk7CiAKIC8qCisgKiBzeXNmcyBpbnRlcmZhY2UKKyAqLworaW50IGRtX3N5c2ZzX2luaXQoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKTsKK3ZvaWQgZG1fc3lzZnNfZXhpdChzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpOworc3RydWN0IGtvYmplY3QgKmRtX2tvYmplY3Qoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKTsKK3N0cnVjdCBtYXBwZWRfZGV2aWNlICpkbV9nZXRfZnJvbV9rb2JqZWN0KHN0cnVjdCBrb2JqZWN0ICprb2JqKTsKKworLyoKICAqIFRhcmdldHMgZm9yIGxpbmVhciBhbmQgc3RyaXBlZCBtYXBwaW5ncwogICovCiBpbnQgZG1fbGluZWFyX2luaXQodm9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2ZhdWx0eS5jIGIvZHJpdmVycy9tZC9mYXVsdHkuYwppbmRleCBmMjZjMWY5Li44NmQ5YWRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2ZhdWx0eS5jCisrKyBiL2RyaXZlcnMvbWQvZmF1bHR5LmMKQEAgLTI4Myw3ICsyODMsNiBAQAogc3RhdGljIGludCBydW4obWRkZXZfdCAqbWRkZXYpCiB7CiAJbWRrX3JkZXZfdCAqcmRldjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAJaW50IGk7CiAKIAljb25mX3QgKmNvbmYgPSBrbWFsbG9jKHNpemVvZigqY29uZiksIEdGUF9LRVJORUwpOwpAQCAtMjk2LDcgKzI5NSw3IEBACiAJfQogCWNvbmYtPm5mYXVsdHMgPSAwOwogCi0JcmRldl9mb3JfZWFjaChyZGV2LCB0bXAsIG1kZGV2KQorCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpCiAJCWNvbmYtPnJkZXYgPSByZGV2OwogCiAJbWRkZXYtPmFycmF5X3NlY3RvcnMgPSBtZGRldi0+c2l6ZSAqIDI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2xpbmVhci5jIGIvZHJpdmVycy9tZC9saW5lYXIuYwppbmRleCAzYjkwYzVjLi4xZTNhZWE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2xpbmVhci5jCisrKyBiL2RyaXZlcnMvbWQvbGluZWFyLmMKQEAgLTEwNSw3ICsxMDUsNiBAQAogCWludCBpLCBuYl96b25lLCBjbnQ7CiAJc2VjdG9yX3QgbWluX3NlY3RvcnM7CiAJc2VjdG9yX3QgY3Vycl9zZWN0b3I7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wOwogCiAJY29uZiA9IGt6YWxsb2MgKHNpemVvZiAoKmNvbmYpICsgcmFpZF9kaXNrcypzaXplb2YoZGV2X2luZm9fdCksCiAJCQlHRlBfS0VSTkVMKTsKQEAgLTExNSw3ICsxMTQsNyBAQAogCWNudCA9IDA7CiAJY29uZi0+YXJyYXlfc2VjdG9ycyA9IDA7CiAKLQlyZGV2X2Zvcl9lYWNoKHJkZXYsIHRtcCwgbWRkZXYpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KSB7CiAJCWludCBqID0gcmRldi0+cmFpZF9kaXNrOwogCQlkZXZfaW5mb190ICpkaXNrID0gY29uZi0+ZGlza3MgKyBqOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL21kLmMgYi9kcml2ZXJzL21kL21kLmMKaW5kZXggMWIxZDMyNi4uNDFlMjUwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9tZC5jCisrKyBiL2RyaXZlcnMvbWQvbWQuYwpAQCAtMjE0LDIwICsyMTQsMzMgQEAKIAlyZXR1cm4gbWRkZXY7CiB9CiAKK3N0YXRpYyB2b2lkIG1kZGV2X2RlbGF5ZWRfZGVsZXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd3MpCit7CisJbWRkZXZfdCAqbWRkZXYgPSBjb250YWluZXJfb2Yod3MsIG1kZGV2X3QsIGRlbF93b3JrKTsKKwlrb2JqZWN0X2RlbCgmbWRkZXYtPmtvYmopOworCWtvYmplY3RfcHV0KCZtZGRldi0+a29iaik7Cit9CisKIHN0YXRpYyB2b2lkIG1kZGV2X3B1dChtZGRldl90ICptZGRldikKIHsKIAlpZiAoIWF0b21pY19kZWNfYW5kX2xvY2soJm1kZGV2LT5hY3RpdmUsICZhbGxfbWRkZXZzX2xvY2spKQogCQlyZXR1cm47Ci0JaWYgKCFtZGRldi0+cmFpZF9kaXNrcyAmJiBsaXN0X2VtcHR5KCZtZGRldi0+ZGlza3MpKSB7CisJaWYgKCFtZGRldi0+cmFpZF9kaXNrcyAmJiBsaXN0X2VtcHR5KCZtZGRldi0+ZGlza3MpICYmCisJICAgICFtZGRldi0+aG9sZF9hY3RpdmUpIHsKIAkJbGlzdF9kZWwoJm1kZGV2LT5hbGxfbWRkZXZzKTsKLQkJc3Bpbl91bmxvY2soJmFsbF9tZGRldnNfbG9jayk7Ci0JCWJsa19jbGVhbnVwX3F1ZXVlKG1kZGV2LT5xdWV1ZSk7Ci0JCWlmIChtZGRldi0+c3lzZnNfc3RhdGUpCi0JCQlzeXNmc19wdXQobWRkZXYtPnN5c2ZzX3N0YXRlKTsKLQkJbWRkZXYtPnN5c2ZzX3N0YXRlID0gTlVMTDsKLQkJa29iamVjdF9wdXQoJm1kZGV2LT5rb2JqKTsKLQl9IGVsc2UKLQkJc3Bpbl91bmxvY2soJmFsbF9tZGRldnNfbG9jayk7CisJCWlmIChtZGRldi0+Z2VuZGlzaykgeworCQkJLyogd2UgZGlkIGEgcHJvYmUgc28gbmVlZCB0byBjbGVhbiB1cC4KKwkJCSAqIENhbGwgc2NoZWR1bGVfd29yayBpbnNpZGUgdGhlIHNwaW5sb2NrCisJCQkgKiBzbyB0aGF0IGZsdXNoX3NjaGVkdWxlZF93b3JrKCkgYWZ0ZXIKKwkJCSAqIG1kZGV2X2ZpbmQgd2lsbCBzdWNjZWVkIGluIHdhaXRpbmcgZm9yIHRoZQorCQkJICogd29yayB0byBiZSBkb25lLgorCQkJICovCisJCQlJTklUX1dPUksoJm1kZGV2LT5kZWxfd29yaywgbWRkZXZfZGVsYXllZF9kZWxldGUpOworCQkJc2NoZWR1bGVfd29yaygmbWRkZXYtPmRlbF93b3JrKTsKKwkJfSBlbHNlCisJCQlrZnJlZShtZGRldik7CisJfQorCXNwaW5fdW5sb2NrKCZhbGxfbWRkZXZzX2xvY2spOwogfQogCiBzdGF0aWMgbWRkZXZfdCAqIG1kZGV2X2ZpbmQoZGV2X3QgdW5pdCkKQEAgLTIzNiwxNSArMjQ5LDUwIEBACiAKICByZXRyeToKIAlzcGluX2xvY2soJmFsbF9tZGRldnNfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShtZGRldiwgJmFsbF9tZGRldnMsIGFsbF9tZGRldnMpCi0JCWlmIChtZGRldi0+dW5pdCA9PSB1bml0KSB7Ci0JCQltZGRldl9nZXQobWRkZXYpOwotCQkJc3Bpbl91bmxvY2soJmFsbF9tZGRldnNfbG9jayk7Ci0JCQlrZnJlZShuZXcpOwotCQkJcmV0dXJuIG1kZGV2OwotCQl9CiAKLQlpZiAobmV3KSB7CisJaWYgKHVuaXQpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShtZGRldiwgJmFsbF9tZGRldnMsIGFsbF9tZGRldnMpCisJCQlpZiAobWRkZXYtPnVuaXQgPT0gdW5pdCkgeworCQkJCW1kZGV2X2dldChtZGRldik7CisJCQkJc3Bpbl91bmxvY2soJmFsbF9tZGRldnNfbG9jayk7CisJCQkJa2ZyZWUobmV3KTsKKwkJCQlyZXR1cm4gbWRkZXY7CisJCQl9CisKKwkJaWYgKG5ldykgeworCQkJbGlzdF9hZGQoJm5ldy0+YWxsX21kZGV2cywgJmFsbF9tZGRldnMpOworCQkJc3Bpbl91bmxvY2soJmFsbF9tZGRldnNfbG9jayk7CisJCQluZXctPmhvbGRfYWN0aXZlID0gVU5USUxfSU9DVEw7CisJCQlyZXR1cm4gbmV3OworCQl9CisJfSBlbHNlIGlmIChuZXcpIHsKKwkJLyogZmluZCBhbiB1bnVzZWQgdW5pdCBudW1iZXIgKi8KKwkJc3RhdGljIGludCBuZXh0X21pbm9yID0gNTEyOworCQlpbnQgc3RhcnQgPSBuZXh0X21pbm9yOworCQlpbnQgaXNfZnJlZSA9IDA7CisJCWludCBkZXYgPSAwOworCQl3aGlsZSAoIWlzX2ZyZWUpIHsKKwkJCWRldiA9IE1LREVWKE1EX01BSk9SLCBuZXh0X21pbm9yKTsKKwkJCW5leHRfbWlub3IrKzsKKwkJCWlmIChuZXh0X21pbm9yID4gTUlOT1JNQVNLKQorCQkJCW5leHRfbWlub3IgPSAwOworCQkJaWYgKG5leHRfbWlub3IgPT0gc3RhcnQpIHsKKwkJCQkvKiBPaCBkZWFyLCBhbGwgaW4gdXNlLiAqLworCQkJCXNwaW5fdW5sb2NrKCZhbGxfbWRkZXZzX2xvY2spOworCQkJCWtmcmVlKG5ldyk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQkJCisJCQlpc19mcmVlID0gMTsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkobWRkZXYsICZhbGxfbWRkZXZzLCBhbGxfbWRkZXZzKQorCQkJCWlmIChtZGRldi0+dW5pdCA9PSBkZXYpIHsKKwkJCQkJaXNfZnJlZSA9IDA7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJfQorCQluZXctPnVuaXQgPSBkZXY7CisJCW5ldy0+bWRfbWlub3IgPSBNSU5PUihkZXYpOworCQluZXctPmhvbGRfYWN0aXZlID0gVU5USUxfU1RPUDsKIAkJbGlzdF9hZGQoJm5ldy0+YWxsX21kZGV2cywgJmFsbF9tZGRldnMpOwogCQlzcGluX3VubG9jaygmYWxsX21kZGV2c19sb2NrKTsKIAkJcmV0dXJuIG5ldzsKQEAgLTI3NSwxNiArMzIzLDYgQEAKIAluZXctPnJlc3luY19tYXggPSBNYXhTZWN0b3I7CiAJbmV3LT5sZXZlbCA9IExFVkVMX05PTkU7CiAKLQluZXctPnF1ZXVlID0gYmxrX2FsbG9jX3F1ZXVlKEdGUF9LRVJORUwpOwotCWlmICghbmV3LT5xdWV1ZSkgewotCQlrZnJlZShuZXcpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogQ2FuIGJlIHVubG9ja2VkIGJlY2F1c2UgdGhlIHF1ZXVlIGlzIG5ldzogbm8gY29uY3VycmVuY3kgKi8KLQlxdWV1ZV9mbGFnX3NldF91bmxvY2tlZChRVUVVRV9GTEFHX0NMVVNURVIsIG5ldy0+cXVldWUpOwotCi0JYmxrX3F1ZXVlX21ha2VfcmVxdWVzdChuZXctPnF1ZXVlLCBtZF9mYWlsX3JlcXVlc3QpOwotCiAJZ290byByZXRyeTsKIH0KIApAQCAtMzA3LDI1ICszNDUsMjMgQEAKIAogc3RhdGljIG1ka19yZGV2X3QgKiBmaW5kX3JkZXZfbnIobWRkZXZfdCAqbWRkZXYsIGludCBucikKIHsKLQltZGtfcmRldl90ICogcmRldjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisJbWRrX3JkZXZfdCAqcmRldjsKIAotCXJkZXZfZm9yX2VhY2gocmRldiwgdG1wLCBtZGRldikgeworCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpCiAJCWlmIChyZGV2LT5kZXNjX25yID09IG5yKQogCQkJcmV0dXJuIHJkZXY7Ci0JfQorCiAJcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBtZGtfcmRldl90ICogZmluZF9yZGV2KG1kZGV2X3QgKiBtZGRldiwgZGV2X3QgZGV2KQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKIAltZGtfcmRldl90ICpyZGV2OwogCi0JcmRldl9mb3JfZWFjaChyZGV2LCB0bXAsIG1kZGV2KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkKIAkJaWYgKHJkZXYtPmJkZXYtPmJkX2RldiA9PSBkZXYpCiAJCQlyZXR1cm4gcmRldjsKLQl9CisKIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtODYxLDcgKzg5Nyw2IEBACiBzdGF0aWMgdm9pZCBzdXBlcl85MF9zeW5jKG1kZGV2X3QgKm1kZGV2LCBtZGtfcmRldl90ICpyZGV2KQogewogCW1kcF9zdXBlcl90ICpzYjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAJbWRrX3JkZXZfdCAqcmRldjI7CiAJaW50IG5leHRfc3BhcmUgPSBtZGRldi0+cmFpZF9kaXNrczsKIApAQCAtOTMzLDcgKzk2OCw3IEBACiAJCXNiLT5zdGF0ZSB8PSAoMTw8TURfU0JfQklUTUFQX1BSRVNFTlQpOwogCiAJc2ItPmRpc2tzWzBdLnN0YXRlID0gKDE8PE1EX0RJU0tfUkVNT1ZFRCk7Ci0JcmRldl9mb3JfZWFjaChyZGV2MiwgdG1wLCBtZGRldikgeworCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldjIsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KSB7CiAJCW1kcF9kaXNrX3QgKmQ7CiAJCWludCBkZXNjX25yOwogCQlpZiAocmRldjItPnJhaWRfZGlzayA+PSAwICYmIHRlc3RfYml0KEluX3N5bmMsICZyZGV2Mi0+ZmxhZ3MpCkBAIC0xMjU5LDcgKzEyOTQsNiBAQAogc3RhdGljIHZvaWQgc3VwZXJfMV9zeW5jKG1kZGV2X3QgKm1kZGV2LCBtZGtfcmRldl90ICpyZGV2KQogewogCXN0cnVjdCBtZHBfc3VwZXJibG9ja18xICpzYjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAJbWRrX3JkZXZfdCAqcmRldjI7CiAJaW50IG1heF9kZXYsIGk7CiAJLyogbWFrZSByZGV2LT5zYiBtYXRjaCBtZGRldiBhbmQgcmRldiBkYXRhLiAqLwpAQCAtMTMwNyw3ICsxMzQxLDcgQEAKIAl9CiAKIAltYXhfZGV2ID0gMDsKLQlyZGV2X2Zvcl9lYWNoKHJkZXYyLCB0bXAsIG1kZGV2KQorCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldjIsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KQogCQlpZiAocmRldjItPmRlc2NfbnIrMSA+IG1heF9kZXYpCiAJCQltYXhfZGV2ID0gcmRldjItPmRlc2NfbnIrMTsKIApAQCAtMTMxNiw3ICsxMzUwLDcgQEAKIAlmb3IgKGk9MDsgaTxtYXhfZGV2O2krKykKIAkJc2ItPmRldl9yb2xlc1tpXSA9IGNwdV90b19sZTE2KDB4ZmZmZSk7CiAJCi0JcmRldl9mb3JfZWFjaChyZGV2MiwgdG1wLCBtZGRldikgeworCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldjIsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KSB7CiAJCWkgPSByZGV2Mi0+ZGVzY19ucjsKIAkJaWYgKHRlc3RfYml0KEZhdWx0eSwgJnJkZXYyLT5mbGFncykpCiAJCQlzYi0+ZGV2X3JvbGVzW2ldID0gY3B1X3RvX2xlMTYoMHhmZmZlKTsKQEAgLTE0NjYsNiArMTUwMCw5IEBACiAKIAlsaXN0X2FkZF9yY3UoJnJkZXYtPnNhbWVfc2V0LCAmbWRkZXYtPmRpc2tzKTsKIAliZF9jbGFpbV9ieV9kaXNrKHJkZXYtPmJkZXYsIHJkZXYtPmJkZXYtPmJkX2hvbGRlciwgbWRkZXYtPmdlbmRpc2spOworCisJLyogTWF5IGFzIHdlbGwgYWxsb3cgcmVjb3ZlcnkgdG8gYmUgcmV0cmllZCBvbmNlICovCisJbWRkZXYtPnJlY292ZXJ5X2Rpc2FibGVkID0gMDsKIAlyZXR1cm4gMDsKIAogIGZhaWw6CkBAIC0xNTcxLDggKzE2MDgsNyBAQAogCiBzdGF0aWMgdm9pZCBleHBvcnRfYXJyYXkobWRkZXZfdCAqbWRkZXYpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wOwotCW1ka19yZGV2X3QgKnJkZXY7CisJbWRrX3JkZXZfdCAqcmRldiwgKnRtcDsKIAogCXJkZXZfZm9yX2VhY2gocmRldiwgdG1wLCBtZGRldikgewogCQlpZiAoIXJkZXYtPm1kZGV2KSB7CkBAIC0xNTkzLDcgKzE2MjksNyBAQAogCQlkZXNjLT5tYWpvcixkZXNjLT5taW5vcixkZXNjLT5yYWlkX2Rpc2ssZGVzYy0+c3RhdGUpOwogfQogCi1zdGF0aWMgdm9pZCBwcmludF9zYihtZHBfc3VwZXJfdCAqc2IpCitzdGF0aWMgdm9pZCBwcmludF9zYl85MChtZHBfc3VwZXJfdCAqc2IpCiB7CiAJaW50IGk7CiAKQEAgLTE2MjQsMTAgKzE2NjAsNTcgQEAKIAl9CiAJcHJpbnRrKEtFUk5fSU5GTyAibWQ6ICAgICBUSElTOiAiKTsKIAlwcmludF9kZXNjKCZzYi0+dGhpc19kaXNrKTsKLQogfQogCi1zdGF0aWMgdm9pZCBwcmludF9yZGV2KG1ka19yZGV2X3QgKnJkZXYpCitzdGF0aWMgdm9pZCBwcmludF9zYl8xKHN0cnVjdCBtZHBfc3VwZXJibG9ja18xICpzYikKK3sKKwlfX3U4ICp1dWlkOworCisJdXVpZCA9IHNiLT5zZXRfdXVpZDsKKwlwcmludGsoS0VSTl9JTkZPICJtZDogIFNCOiAoVjoldSkgKEY6MHglMDh4KSBBcnJheS1JRDo8JTAyeCUwMnglMDJ4JTAyeCIKKwkJCSI6JTAyeCUwMng6JTAyeCUwMng6JTAyeCUwMng6JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4PlxuIgorCSAgICAgICBLRVJOX0lORk8gIm1kOiAgICBOYW1lOiBcIiVzXCIgQ1Q6JWxsdVxuIiwKKwkJbGUzMl90b19jcHUoc2ItPm1ham9yX3ZlcnNpb24pLAorCQlsZTMyX3RvX2NwdShzYi0+ZmVhdHVyZV9tYXApLAorCQl1dWlkWzBdLCB1dWlkWzFdLCB1dWlkWzJdLCB1dWlkWzNdLAorCQl1dWlkWzRdLCB1dWlkWzVdLCB1dWlkWzZdLCB1dWlkWzddLAorCQl1dWlkWzhdLCB1dWlkWzldLCB1dWlkWzEwXSwgdXVpZFsxMV0sCisJCXV1aWRbMTJdLCB1dWlkWzEzXSwgdXVpZFsxNF0sIHV1aWRbMTVdLAorCQlzYi0+c2V0X25hbWUsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoc2ItPmN0aW1lKQorCQkgICAgICAgJiBNRF9TVVBFUkJMT0NLXzFfVElNRV9TRUNfTUFTSyk7CisKKwl1dWlkID0gc2ItPmRldmljZV91dWlkOworCXByaW50ayhLRVJOX0lORk8gIm1kOiAgICAgICBMJXUgU1olbGx1IFJEOiV1IExPOiV1IENTOiV1IERPOiVsbHUgRFM6JWxsdSBTTzolbGx1IgorCQkJIiBSTzolbGx1XG4iCisJICAgICAgIEtFUk5fSU5GTyAibWQ6ICAgICBEZXY6JTA4eCBVVUlEOiAlMDJ4JTAyeCUwMnglMDJ4OiUwMnglMDJ4OiUwMnglMDJ4OiUwMnglMDJ4IgorCQkJIjolMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIKKwkgICAgICAgS0VSTl9JTkZPICJtZDogICAgICAgKEY6MHglMDh4KSBVVDolbGx1IEV2ZW50czolbGx1IFJlc3luY09mZnNldDolbGx1IENTVU06MHglMDh4XG4iCisJICAgICAgIEtFUk5fSU5GTyAibWQ6ICAgICAgICAgKE1heERldjoldSkgXG4iLAorCQlsZTMyX3RvX2NwdShzYi0+bGV2ZWwpLAorCQkodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KHNiLT5zaXplKSwKKwkJbGUzMl90b19jcHUoc2ItPnJhaWRfZGlza3MpLAorCQlsZTMyX3RvX2NwdShzYi0+bGF5b3V0KSwKKwkJbGUzMl90b19jcHUoc2ItPmNodW5rc2l6ZSksCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoc2ItPmRhdGFfb2Zmc2V0KSwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShzYi0+ZGF0YV9zaXplKSwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShzYi0+c3VwZXJfb2Zmc2V0KSwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShzYi0+cmVjb3Zlcnlfb2Zmc2V0KSwKKwkJbGUzMl90b19jcHUoc2ItPmRldl9udW1iZXIpLAorCQl1dWlkWzBdLCB1dWlkWzFdLCB1dWlkWzJdLCB1dWlkWzNdLAorCQl1dWlkWzRdLCB1dWlkWzVdLCB1dWlkWzZdLCB1dWlkWzddLAorCQl1dWlkWzhdLCB1dWlkWzldLCB1dWlkWzEwXSwgdXVpZFsxMV0sCisJCXV1aWRbMTJdLCB1dWlkWzEzXSwgdXVpZFsxNF0sIHV1aWRbMTVdLAorCQlzYi0+ZGV2ZmxhZ3MsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoc2ItPnV0aW1lKSAmIE1EX1NVUEVSQkxPQ0tfMV9USU1FX1NFQ19NQVNLLAorCQkodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KHNiLT5ldmVudHMpLAorCQkodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KHNiLT5yZXN5bmNfb2Zmc2V0KSwKKwkJbGUzMl90b19jcHUoc2ItPnNiX2NzdW0pLAorCQlsZTMyX3RvX2NwdShzYi0+bWF4X2RldikKKwkJKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfcmRldihtZGtfcmRldl90ICpyZGV2LCBpbnQgbWFqb3JfdmVyc2lvbikKIHsKIAljaGFyIGJbQkRFVk5BTUVfU0laRV07CiAJcHJpbnRrKEtFUk5fSU5GTyAibWQ6IHJkZXYgJXMsIFNaOiUwOGxsdSBGOiVkIFM6JWQgRE46JXVcbiIsCkBAIC0xNjM1LDE1ICsxNzE4LDIyIEBACiAJICAgICAgICB0ZXN0X2JpdChGYXVsdHksICZyZGV2LT5mbGFncyksIHRlc3RfYml0KEluX3N5bmMsICZyZGV2LT5mbGFncyksCiAJICAgICAgICByZGV2LT5kZXNjX25yKTsKIAlpZiAocmRldi0+c2JfbG9hZGVkKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIm1kOiByZGV2IHN1cGVyYmxvY2s6XG4iKTsKLQkJcHJpbnRfc2IoKG1kcF9zdXBlcl90KilwYWdlX2FkZHJlc3MocmRldi0+c2JfcGFnZSkpOworCQlwcmludGsoS0VSTl9JTkZPICJtZDogcmRldiBzdXBlcmJsb2NrIChNSjolZCk6XG4iLCBtYWpvcl92ZXJzaW9uKTsKKwkJc3dpdGNoIChtYWpvcl92ZXJzaW9uKSB7CisJCWNhc2UgMDoKKwkJCXByaW50X3NiXzkwKChtZHBfc3VwZXJfdCopcGFnZV9hZGRyZXNzKHJkZXYtPnNiX3BhZ2UpKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlwcmludF9zYl8xKChzdHJ1Y3QgbWRwX3N1cGVyYmxvY2tfMSAqKXBhZ2VfYWRkcmVzcyhyZGV2LT5zYl9wYWdlKSk7CisJCQlicmVhazsKKwkJfQogCX0gZWxzZQogCQlwcmludGsoS0VSTl9JTkZPICJtZDogbm8gcmRldiBzdXBlcmJsb2NrIVxuIik7CiB9CiAKIHN0YXRpYyB2b2lkIG1kX3ByaW50X2RldmljZXModm9pZCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXAsICp0bXAyOworCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKIAltZGtfcmRldl90ICpyZGV2OwogCW1kZGV2X3QgKm1kZGV2OwogCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKQEAgLTE2NTgsMTIgKzE3NDgsMTIgQEAKIAkJCWJpdG1hcF9wcmludF9zYihtZGRldi0+Yml0bWFwKTsKIAkJZWxzZQogCQkJcHJpbnRrKCIlczogIiwgbWRuYW1lKG1kZGV2KSk7Ci0JCXJkZXZfZm9yX2VhY2gocmRldiwgdG1wMiwgbWRkZXYpCisJCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpCiAJCQlwcmludGsoIjwlcz4iLCBiZGV2bmFtZShyZGV2LT5iZGV2LGIpKTsKIAkJcHJpbnRrKCJcbiIpOwogCi0JCXJkZXZfZm9yX2VhY2gocmRldiwgdG1wMiwgbWRkZXYpCi0JCQlwcmludF9yZGV2KHJkZXYpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KQorCQkJcHJpbnRfcmRldihyZGV2LCBtZGRldi0+bWFqb3JfdmVyc2lvbik7CiAJfQogCXByaW50aygibWQ6CSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOwogCXByaW50aygiXG4iKTsKQEAgLTE2NzksOSArMTc2OSw4IEBACiAJICogd2l0aCB0aGUgcmVzdCBvZiB0aGUgYXJyYXkpCiAJICovCiAJbWRrX3JkZXZfdCAqcmRldjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAKLQlyZGV2X2Zvcl9lYWNoKHJkZXYsIHRtcCwgbWRkZXYpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KSB7CiAJCWlmIChyZGV2LT5zYl9ldmVudHMgPT0gbWRkZXYtPmV2ZW50cyB8fAogCQkgICAgKG5vc3BhcmVzICYmCiAJCSAgICAgcmRldi0+cmFpZF9kaXNrIDwgMCAmJgpAQCAtMTY5OSw3ICsxNzg4LDYgQEAKIAogc3RhdGljIHZvaWQgbWRfdXBkYXRlX3NiKG1kZGV2X3QgKiBtZGRldiwgaW50IGZvcmNlX2NoYW5nZSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAJbWRrX3JkZXZfdCAqcmRldjsKIAlpbnQgc3luY19yZXE7CiAJaW50IG5vc3BhcmVzID0gMDsKQEAgLTE3OTAsNyArMTg3OCw3IEBACiAJCW1kbmFtZShtZGRldiksbWRkZXYtPmluX3N5bmMpOwogCiAJYml0bWFwX3VwZGF0ZV9zYihtZGRldi0+Yml0bWFwKTsKLQlyZGV2X2Zvcl9lYWNoKHJkZXYsIHRtcCwgbWRkZXYpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KSB7CiAJCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKIAkJZHByaW50ayhLRVJOX0lORk8gIm1kOiAiKTsKIAkJaWYgKHJkZXYtPnNiX2xvYWRlZCAhPSAxKQpAQCAtMTk5OSw3ICsyMDg3LDYgQEAKIAkJbWRfd2FrZXVwX3RocmVhZChyZGV2LT5tZGRldi0+dGhyZWFkKTsKIAl9IGVsc2UgaWYgKHJkZXYtPm1kZGV2LT5wZXJzKSB7CiAJCW1ka19yZGV2X3QgKnJkZXYyOwotCQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAJCS8qIEFjdGl2YXRpbmcgYSBzcGFyZSAuLiBvciBwb3NzaWJseSByZWFjdGl2YXRpbmcKIAkJICogaWYgd2UgZXZlcnkgZ2V0IGJpdG1hcHMgd29ya2luZyBoZXJlLgogCQkgKi8KQEAgLTIwMTAsNyArMjA5Nyw3IEBACiAJCWlmIChyZGV2LT5tZGRldi0+cGVycy0+aG90X2FkZF9kaXNrID09IE5VTEwpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQlyZGV2X2Zvcl9lYWNoKHJkZXYyLCB0bXAsIHJkZXYtPm1kZGV2KQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYyLCAmcmRldi0+bWRkZXYtPmRpc2tzLCBzYW1lX3NldCkKIAkJCWlmIChyZGV2Mi0+cmFpZF9kaXNrID09IHNsb3QpCiAJCQkJcmV0dXJuIC1FRVhJU1Q7CiAKQEAgLTIxMjUsMTQgKzIyMTIsMTQgQEAKIAkJICovCiAJCW1kZGV2X3QgKm1kZGV2OwogCQlpbnQgb3ZlcmxhcCA9IDA7Ci0JCXN0cnVjdCBsaXN0X2hlYWQgKnRtcCwgKnRtcDI7CisJCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKIAogCQltZGRldl91bmxvY2sobXlfbWRkZXYpOwogCQlmb3JfZWFjaF9tZGRldihtZGRldiwgdG1wKSB7CiAJCQltZGtfcmRldl90ICpyZGV2MjsKIAogCQkJbWRkZXZfbG9jayhtZGRldik7Ci0JCQlyZGV2X2Zvcl9lYWNoKHJkZXYyLCB0bXAyLCBtZGRldikKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldjIsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KQogCQkJCWlmICh0ZXN0X2JpdChBbGxSZXNlcnZlZCwgJnJkZXYyLT5mbGFncykgfHwKIAkJCQkgICAgKHJkZXYtPmJkZXYgPT0gcmRldjItPmJkZXYgJiYKIAkJCQkgICAgIHJkZXYgIT0gcmRldjIgJiYKQEAgLTIzMjgsOCArMjQxNSw3IEBACiBzdGF0aWMgdm9pZCBhbmFseXplX3NicyhtZGRldl90ICogbWRkZXYpCiB7CiAJaW50IGk7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wOwotCW1ka19yZGV2X3QgKnJkZXYsICpmcmVzaGVzdDsKKwltZGtfcmRldl90ICpyZGV2LCAqZnJlc2hlc3QsICp0bXA7CiAJY2hhciBiW0JERVZOQU1FX1NJWkVdOwogCiAJZnJlc2hlc3QgPSBOVUxMOwpAQCAtMzA0Niw3ICszMTMyLDcgQEAKIAl9CiAJc2V0X2JpdChNRF9SRUNPVkVSWV9ORUVERUQsICZtZGRldi0+cmVjb3ZlcnkpOwogCW1kX3dha2V1cF90aHJlYWQobWRkZXYtPnRocmVhZCk7Ci0Jc3lzZnNfbm90aWZ5KCZtZGRldi0+a29iaiwgTlVMTCwgInN5bmNfYWN0aW9uIik7CisJc3lzZnNfbm90aWZ5X2RpcmVudChtZGRldi0+c3lzZnNfYWN0aW9uKTsKIAlyZXR1cm4gbGVuOwogfQogCkBAIC0zNDA0LDYgKzM0OTAsOCBAQAogCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKIAkJcmV0dXJuIC1FQUNDRVM7CiAJcnYgPSBtZGRldl9sb2NrKG1kZGV2KTsKKwlpZiAobWRkZXYtPmhvbGRfYWN0aXZlID09IFVOVElMX0lPQ1RMKQorCQltZGRldi0+aG9sZF9hY3RpdmUgPSAwOwogCWlmICghcnYpIHsKIAkJcnYgPSBlbnRyeS0+c3RvcmUobWRkZXYsIHBhZ2UsIGxlbmd0aCk7CiAJCW1kZGV2X3VubG9jayhtZGRldik7CkBAIC0zNDE0LDYgKzM1MDIsMTcgQEAKIHN0YXRpYyB2b2lkIG1kX2ZyZWUoc3RydWN0IGtvYmplY3QgKmtvKQogewogCW1kZGV2X3QgKm1kZGV2ID0gY29udGFpbmVyX29mKGtvLCBtZGRldl90LCBrb2JqKTsKKworCWlmIChtZGRldi0+c3lzZnNfc3RhdGUpCisJCXN5c2ZzX3B1dChtZGRldi0+c3lzZnNfc3RhdGUpOworCisJaWYgKG1kZGV2LT5nZW5kaXNrKSB7CisJCWRlbF9nZW5kaXNrKG1kZGV2LT5nZW5kaXNrKTsKKwkJcHV0X2Rpc2sobWRkZXYtPmdlbmRpc2spOworCX0KKwlpZiAobWRkZXYtPnF1ZXVlKQorCQlibGtfY2xlYW51cF9xdWV1ZShtZGRldi0+cXVldWUpOworCiAJa2ZyZWUobWRkZXYpOwogfQogCkBAIC0zNDI5LDM0ICszNTI4LDc0IEBACiAKIGludCBtZHBfbWFqb3IgPSAwOwogCi1zdGF0aWMgc3RydWN0IGtvYmplY3QgKm1kX3Byb2JlKGRldl90IGRldiwgaW50ICpwYXJ0LCB2b2lkICpkYXRhKQorc3RhdGljIGludCBtZF9hbGxvYyhkZXZfdCBkZXYsIGNoYXIgKm5hbWUpCiB7CiAJc3RhdGljIERFRklORV9NVVRFWChkaXNrc19tdXRleCk7CiAJbWRkZXZfdCAqbWRkZXYgPSBtZGRldl9maW5kKGRldik7CiAJc3RydWN0IGdlbmRpc2sgKmRpc2s7Ci0JaW50IHBhcnRpdGlvbmVkID0gKE1BSk9SKGRldikgIT0gTURfTUFKT1IpOwotCWludCBzaGlmdCA9IHBhcnRpdGlvbmVkID8gTWRwTWlub3JTaGlmdCA6IDA7Ci0JaW50IHVuaXQgPSBNSU5PUihkZXYpID4+IHNoaWZ0OworCWludCBwYXJ0aXRpb25lZDsKKwlpbnQgc2hpZnQ7CisJaW50IHVuaXQ7CiAJaW50IGVycm9yOwogCiAJaWYgKCFtZGRldikKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiAtRU5PREVWOworCisJcGFydGl0aW9uZWQgPSAoTUFKT1IobWRkZXYtPnVuaXQpICE9IE1EX01BSk9SKTsKKwlzaGlmdCA9IHBhcnRpdGlvbmVkID8gTWRwTWlub3JTaGlmdCA6IDA7CisJdW5pdCA9IE1JTk9SKG1kZGV2LT51bml0KSA+PiBzaGlmdDsKKworCS8qIHdhaXQgZm9yIGFueSBwcmV2aW91cyBpbnN0YW5jZSBpZiB0aGlzIGRldmljZQorCSAqIHRvIGJlIGNvbXBsZXRlZCByZW1vdmVkIChtZGRldl9kZWxheWVkX2RlbGV0ZSkuCisJICovCisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKIAogCW11dGV4X2xvY2soJmRpc2tzX211dGV4KTsKIAlpZiAobWRkZXYtPmdlbmRpc2spIHsKIAkJbXV0ZXhfdW5sb2NrKCZkaXNrc19tdXRleCk7CiAJCW1kZGV2X3B1dChtZGRldik7Ci0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gLUVFWElTVDsKIAl9CisKKwlpZiAobmFtZSkgeworCQkvKiBOZWVkIHRvIGVuc3VyZSB0aGF0ICduYW1lJyBpcyBub3QgYSBkdXBsaWNhdGUuCisJCSAqLworCQltZGRldl90ICptZGRldjI7CisJCXNwaW5fbG9jaygmYWxsX21kZGV2c19sb2NrKTsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1kZGV2MiwgJmFsbF9tZGRldnMsIGFsbF9tZGRldnMpCisJCQlpZiAobWRkZXYyLT5nZW5kaXNrICYmCisJCQkgICAgc3RyY21wKG1kZGV2Mi0+Z2VuZGlzay0+ZGlza19uYW1lLCBuYW1lKSA9PSAwKSB7CisJCQkJc3Bpbl91bmxvY2soJmFsbF9tZGRldnNfbG9jayk7CisJCQkJcmV0dXJuIC1FRVhJU1Q7CisJCQl9CisJCXNwaW5fdW5sb2NrKCZhbGxfbWRkZXZzX2xvY2spOworCX0KKworCW1kZGV2LT5xdWV1ZSA9IGJsa19hbGxvY19xdWV1ZShHRlBfS0VSTkVMKTsKKwlpZiAoIW1kZGV2LT5xdWV1ZSkgeworCQltdXRleF91bmxvY2soJmRpc2tzX211dGV4KTsKKwkJbWRkZXZfcHV0KG1kZGV2KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCS8qIENhbiBiZSB1bmxvY2tlZCBiZWNhdXNlIHRoZSBxdWV1ZSBpcyBuZXc6IG5vIGNvbmN1cnJlbmN5ICovCisJcXVldWVfZmxhZ19zZXRfdW5sb2NrZWQoUVVFVUVfRkxBR19DTFVTVEVSLCBtZGRldi0+cXVldWUpOworCisJYmxrX3F1ZXVlX21ha2VfcmVxdWVzdChtZGRldi0+cXVldWUsIG1kX2ZhaWxfcmVxdWVzdCk7CisKIAlkaXNrID0gYWxsb2NfZGlzaygxIDw8IHNoaWZ0KTsKIAlpZiAoIWRpc2spIHsKIAkJbXV0ZXhfdW5sb2NrKCZkaXNrc19tdXRleCk7CisJCWJsa19jbGVhbnVwX3F1ZXVlKG1kZGV2LT5xdWV1ZSk7CisJCW1kZGV2LT5xdWV1ZSA9IE5VTEw7CiAJCW1kZGV2X3B1dChtZGRldik7Ci0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JZGlzay0+bWFqb3IgPSBNQUpPUihkZXYpOworCWRpc2stPm1ham9yID0gTUFKT1IobWRkZXYtPnVuaXQpOwogCWRpc2stPmZpcnN0X21pbm9yID0gdW5pdCA8PCBzaGlmdDsKLQlpZiAocGFydGl0aW9uZWQpCisJaWYgKG5hbWUpCisJCXN0cmNweShkaXNrLT5kaXNrX25hbWUsIG5hbWUpOworCWVsc2UgaWYgKHBhcnRpdGlvbmVkKQogCQlzcHJpbnRmKGRpc2stPmRpc2tfbmFtZSwgIm1kX2QlZCIsIHVuaXQpOwogCWVsc2UKIAkJc3ByaW50ZihkaXNrLT5kaXNrX25hbWUsICJtZCVkIiwgdW5pdCk7CkBAIC0zNDY0LDcgKzM2MDMsNyBAQAogCWRpc2stPnByaXZhdGVfZGF0YSA9IG1kZGV2OwogCWRpc2stPnF1ZXVlID0gbWRkZXYtPnF1ZXVlOwogCS8qIEFsbG93IGV4dGVuZGVkIHBhcnRpdGlvbnMuICBUaGlzIG1ha2VzIHRoZQotCSAqICdtZHAnIGRldmljZSByZWR1bmRhbnQsIGJ1dCB3ZSBjYW4gcmVhbGx5CisJICogJ21kcCcgZGV2aWNlIHJlZHVuZGFudCwgYnV0IHdlIGNhbid0IHJlYWxseQogCSAqIHJlbW92ZSBpdCBub3cuCiAJICovCiAJZGlzay0+ZmxhZ3MgfD0gR0VOSERfRkxfRVhUX0RFVlQ7CkBAIC0zNDgwLDkgKzM2MTksMzUgQEAKIAkJa29iamVjdF91ZXZlbnQoJm1kZGV2LT5rb2JqLCBLT0JKX0FERCk7CiAJCW1kZGV2LT5zeXNmc19zdGF0ZSA9IHN5c2ZzX2dldF9kaXJlbnQobWRkZXYtPmtvYmouc2QsICJhcnJheV9zdGF0ZSIpOwogCX0KKwltZGRldl9wdXQobWRkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGtvYmplY3QgKm1kX3Byb2JlKGRldl90IGRldiwgaW50ICpwYXJ0LCB2b2lkICpkYXRhKQoreworCW1kX2FsbG9jKGRldiwgTlVMTCk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyBpbnQgYWRkX25hbWVkX2FycmF5KGNvbnN0IGNoYXIgKnZhbCwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApCit7CisJLyogdmFsIG11c3QgYmUgIm1kXyoiIHdoZXJlICogaXMgbm90IGFsbCBkaWdpdHMuCisJICogV2UgYWxsb2NhdGUgYW4gYXJyYXkgd2l0aCBhIGxhcmdlIGZyZWUgbWlub3IgbnVtYmVyLCBhbmQKKwkgKiBzZXQgdGhlIG5hbWUgdG8gdmFsLiAgdmFsIG11c3Qgbm90IGFscmVhZHkgYmUgYW4gYWN0aXZlIG5hbWUuCisJICovCisJaW50IGxlbiA9IHN0cmxlbih2YWwpOworCWNoYXIgYnVmW0RJU0tfTkFNRV9MRU5dOworCisJd2hpbGUgKGxlbiAmJiB2YWxbbGVuLTFdID09ICdcbicpCisJCWxlbi0tOworCWlmIChsZW4gPj0gRElTS19OQU1FX0xFTikKKwkJcmV0dXJuIC1FMkJJRzsKKwlzdHJsY3B5KGJ1ZiwgdmFsLCBsZW4rMSk7CisJaWYgKHN0cm5jbXAoYnVmLCAibWRfIiwgMykgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIG1kX2FsbG9jKDAsIGJ1Zik7Cit9CisKIHN0YXRpYyB2b2lkIG1kX3NhZmVtb2RlX3RpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKQogewogCW1kZGV2X3QgKm1kZGV2ID0gKG1kZGV2X3QgKikgZGF0YTsKQEAgLTM1MDEsNyArMzY2Niw2IEBACiB7CiAJaW50IGVycjsKIAlpbnQgY2h1bmtfc2l6ZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAJbWRrX3JkZXZfdCAqcmRldjsKIAlzdHJ1Y3QgZ2VuZGlzayAqZGlzazsKIAlzdHJ1Y3QgbWRrX3BlcnNvbmFsaXR5ICpwZXJzOwpAQCAtMzU0MCw3ICszNzA0LDcgQEAKIAkJfQogCiAJCS8qIGRldmljZXMgbXVzdCBoYXZlIG1pbmltdW0gc2l6ZSBvZiBvbmUgY2h1bmsgKi8KLQkJcmRldl9mb3JfZWFjaChyZGV2LCB0bXAsIG1kZGV2KSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpIHsKIAkJCWlmICh0ZXN0X2JpdChGYXVsdHksICZyZGV2LT5mbGFncykpCiAJCQkJY29udGludWU7CiAJCQlpZiAocmRldi0+c2l6ZSA8IGNodW5rX3NpemUgLyAxMDI0KSB7CkBAIC0zNTY1LDcgKzM3MjksNyBAQAogCSAqIHRoZSBvbmx5IHZhbGlkIGV4dGVybmFsIGludGVyZmFjZSBpcyB0aHJvdWdoIHRoZSBtZAogCSAqIGRldmljZS4KIAkgKi8KLQlyZGV2X2Zvcl9lYWNoKHJkZXYsIHRtcCwgbWRkZXYpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KSB7CiAJCWlmICh0ZXN0X2JpdChGYXVsdHksICZyZGV2LT5mbGFncykpCiAJCQljb250aW51ZTsKIAkJc3luY19ibG9ja2RldihyZGV2LT5iZGV2KTsKQEAgLTM2MzAsMTAgKzM3OTQsMTAgQEAKIAkJICovCiAJCWNoYXIgYltCREVWTkFNRV9TSVpFXSwgYjJbQkRFVk5BTUVfU0laRV07CiAJCW1ka19yZGV2X3QgKnJkZXYyOwotCQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXAyOwogCQlpbnQgd2FybmVkID0gMDsKLQkJcmRldl9mb3JfZWFjaChyZGV2LCB0bXAsIG1kZGV2KSB7Ci0JCQlyZGV2X2Zvcl9lYWNoKHJkZXYyLCB0bXAyLCBtZGRldikgeworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpCisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYyLCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkgewogCQkJCWlmIChyZGV2IDwgcmRldjIgJiYKIAkJCQkgICAgcmRldi0+YmRldi0+YmRfY29udGFpbnMgPT0KIAkJCQkgICAgcmRldjItPmJkZXYtPmJkX2NvbnRhaW5zKSB7CkBAIC0zNjQ3LDcgKzM4MTEsNyBAQAogCQkJCQl3YXJuZWQgPSAxOwogCQkJCX0KIAkJCX0KLQkJfQorCiAJCWlmICh3YXJuZWQpCiAJCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCQkgICAgICAgIlRydWUgcHJvdGVjdGlvbiBhZ2FpbnN0IHNpbmdsZS1kaXNrIgpAQCAtMzY4NCw2ICszODQ4LDcgQEAKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJCSAgICAgICAibWQ6IGNhbm5vdCByZWdpc3RlciBleHRyYSBhdHRyaWJ1dGVzIGZvciAlc1xuIiwKIAkJCSAgICAgICBtZG5hbWUobWRkZXYpKTsKKwkJbWRkZXYtPnN5c2ZzX2FjdGlvbiA9IHN5c2ZzX2dldF9kaXJlbnQobWRkZXYtPmtvYmouc2QsICJzeW5jX2FjdGlvbiIpOwogCX0gZWxzZSBpZiAobWRkZXYtPnJvID09IDIpIC8qIGF1dG8tcmVhZG9ubHkgbm90IG1lYW5pbmdmdWwgKi8KIAkJbWRkZXYtPnJvID0gMDsKIApAQCAtMzY5NCw3ICszODU5LDcgQEAKIAltZGRldi0+c2FmZW1vZGVfZGVsYXkgPSAoMjAwICogSFopLzEwMDAgKzE7IC8qIDIwMCBtc2VjIGRlbGF5ICovCiAJbWRkZXYtPmluX3N5bmMgPSAxOwogCi0JcmRldl9mb3JfZWFjaChyZGV2LCB0bXAsIG1kZGV2KQorCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpCiAJCWlmIChyZGV2LT5yYWlkX2Rpc2sgPj0gMCkgewogCQkJY2hhciBubVsyMF07CiAJCQlzcHJpbnRmKG5tLCAicmQlZCIsIHJkZXYtPnJhaWRfZGlzayk7CkBAIC0zNzI1LDkgKzM4OTAsOCBAQAogCSAqIGl0IHdpbGwgcmVtb3ZlIHRoZSBkcml2ZXMgYW5kIG5vdCBkbyB0aGUgcmlnaHQgdGhpbmcKIAkgKi8KIAlpZiAobWRkZXYtPmRlZ3JhZGVkICYmICFtZGRldi0+c3luY190aHJlYWQpIHsKLQkJc3RydWN0IGxpc3RfaGVhZCAqcnRtcDsKIAkJaW50IHNwYXJlcyA9IDA7Ci0JCXJkZXZfZm9yX2VhY2gocmRldiwgcnRtcCwgbWRkZXYpCisJCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpCiAJCQlpZiAocmRldi0+cmFpZF9kaXNrID49IDAgJiYKIAkJCSAgICAhdGVzdF9iaXQoSW5fc3luYywgJnJkZXYtPmZsYWdzKSAmJgogCQkJICAgICF0ZXN0X2JpdChGYXVsdHksICZyZGV2LT5mbGFncykpCkBAIC0zNzU0LDcgKzM5MTgsOCBAQAogCW1kZGV2LT5jaGFuZ2VkID0gMTsKIAltZF9uZXdfZXZlbnQobWRkZXYpOwogCXN5c2ZzX25vdGlmeV9kaXJlbnQobWRkZXYtPnN5c2ZzX3N0YXRlKTsKLQlzeXNmc19ub3RpZnkoJm1kZGV2LT5rb2JqLCBOVUxMLCAic3luY19hY3Rpb24iKTsKKwlpZiAobWRkZXYtPnN5c2ZzX2FjdGlvbikKKwkJc3lzZnNfbm90aWZ5X2RpcmVudChtZGRldi0+c3lzZnNfYWN0aW9uKTsKIAlzeXNmc19ub3RpZnkoJm1kZGV2LT5rb2JqLCBOVUxMLCAiZGVncmFkZWQiKTsKIAlrb2JqZWN0X3VldmVudCgmZGlza190b19kZXYobWRkZXYtPmdlbmRpc2spLT5rb2JqLCBLT0JKX0NIQU5HRSk7CiAJcmV0dXJuIDA7CkBAIC0zODU0LDkgKzQwMTksMTIgQEAKIAkJCW1kZGV2LT5xdWV1ZS0+bWVyZ2VfYnZlY19mbiA9IE5VTEw7CiAJCQltZGRldi0+cXVldWUtPnVucGx1Z19mbiA9IE5VTEw7CiAJCQltZGRldi0+cXVldWUtPmJhY2tpbmdfZGV2X2luZm8uY29uZ2VzdGVkX2ZuID0gTlVMTDsKLQkJCWlmIChtZGRldi0+cGVycy0+c3luY19yZXF1ZXN0KQorCQkJaWYgKG1kZGV2LT5wZXJzLT5zeW5jX3JlcXVlc3QpIHsKIAkJCQlzeXNmc19yZW1vdmVfZ3JvdXAoJm1kZGV2LT5rb2JqLCAmbWRfcmVkdW5kYW5jeV9ncm91cCk7Ci0KKwkJCQlpZiAobWRkZXYtPnN5c2ZzX2FjdGlvbikKKwkJCQkJc3lzZnNfcHV0KG1kZGV2LT5zeXNmc19hY3Rpb24pOworCQkJCW1kZGV2LT5zeXNmc19hY3Rpb24gPSBOVUxMOworCQkJfQogCQkJbW9kdWxlX3B1dChtZGRldi0+cGVycy0+b3duZXIpOwogCQkJbWRkZXYtPnBlcnMgPSBOVUxMOwogCQkJLyogdGVsbCB1c2Vyc3BhY2UgdG8gaGFuZGxlICdpbmFjdGl2ZScgKi8KQEAgLTM4ODMsNyArNDA1MSw2IEBACiAJICovCiAJaWYgKG1vZGUgPT0gMCkgewogCQltZGtfcmRldl90ICpyZGV2OwotCQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAKIAkJcHJpbnRrKEtFUk5fSU5GTyAibWQ6ICVzIHN0b3BwZWQuXG4iLCBtZG5hbWUobWRkZXYpKTsKIApAQCAtMzg5NSw3ICs0MDYyLDcgQEAKIAkJfQogCQltZGRldi0+Yml0bWFwX29mZnNldCA9IDA7CiAKLQkJcmRldl9mb3JfZWFjaChyZGV2LCB0bXAsIG1kZGV2KQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KQogCQkJaWYgKHJkZXYtPnJhaWRfZGlzayA+PSAwKSB7CiAJCQkJY2hhciBubVsyMF07CiAJCQkJc3ByaW50ZihubSwgInJkJWQiLCByZGV2LT5yYWlkX2Rpc2spOwpAQCAtMzk0MSw2ICs0MTA4LDggQEAKIAkJbWRkZXYtPmJhcnJpZXJzX3dvcmsgPSAwOwogCQltZGRldi0+c2FmZW1vZGUgPSAwOwogCQlrb2JqZWN0X3VldmVudCgmZGlza190b19kZXYobWRkZXYtPmdlbmRpc2spLT5rb2JqLCBLT0JKX0NIQU5HRSk7CisJCWlmIChtZGRldi0+aG9sZF9hY3RpdmUgPT0gVU5USUxfU1RPUCkKKwkJCW1kZGV2LT5ob2xkX2FjdGl2ZSA9IDA7CiAKIAl9IGVsc2UgaWYgKG1kZGV2LT5wZXJzKQogCQlwcmludGsoS0VSTl9JTkZPICJtZDogJXMgc3dpdGNoZWQgdG8gcmVhZC1vbmx5IG1vZGUuXG4iLApAQCAtMzk1Niw3ICs0MTI1LDYgQEAKIHN0YXRpYyB2b2lkIGF1dG9ydW5fYXJyYXkobWRkZXZfdCAqbWRkZXYpCiB7CiAJbWRrX3JkZXZfdCAqcmRldjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAJaW50IGVycjsKIAogCWlmIChsaXN0X2VtcHR5KCZtZGRldi0+ZGlza3MpKQpAQCAtMzk2NCw3ICs0MTMyLDcgQEAKIAogCXByaW50ayhLRVJOX0lORk8gIm1kOiBydW5uaW5nOiAiKTsKIAotCXJkZXZfZm9yX2VhY2gocmRldiwgdG1wLCBtZGRldikgeworCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpIHsKIAkJY2hhciBiW0JERVZOQU1FX1NJWkVdOwogCQlwcmludGsoIjwlcz4iLCBiZGV2bmFtZShyZGV2LT5iZGV2LGIpKTsKIAl9CkBAIC0zOTkxLDggKzQxNTksNyBAQAogICovCiBzdGF0aWMgdm9pZCBhdXRvcnVuX2RldmljZXMoaW50IHBhcnQpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wOwotCW1ka19yZGV2X3QgKnJkZXYwLCAqcmRldjsKKwltZGtfcmRldl90ICpyZGV2MCwgKnJkZXYsICp0bXA7CiAJbWRkZXZfdCAqbWRkZXY7CiAJY2hhciBiW0JERVZOQU1FX1NJWkVdOwogCkBAIC00MDA3LDcgKzQxNzQsNyBAQAogCQlwcmludGsoS0VSTl9JTkZPICJtZDogY29uc2lkZXJpbmcgJXMgLi4uXG4iLAogCQkJYmRldm5hbWUocmRldjAtPmJkZXYsYikpOwogCQlJTklUX0xJU1RfSEVBRCgmY2FuZGlkYXRlcyk7Ci0JCXJkZXZfZm9yX2VhY2hfbGlzdChyZGV2LCB0bXAsIHBlbmRpbmdfcmFpZF9kaXNrcykKKwkJcmRldl9mb3JfZWFjaF9saXN0KHJkZXYsIHRtcCwgJnBlbmRpbmdfcmFpZF9kaXNrcykKIAkJCWlmIChzdXBlcl85MF9sb2FkKHJkZXYsIHJkZXYwLCAwKSA+PSAwKSB7CiAJCQkJcHJpbnRrKEtFUk5fSU5GTyAibWQ6ICBhZGRpbmcgJXMgLi4uXG4iLAogCQkJCQliZGV2bmFtZShyZGV2LT5iZGV2LGIpKTsKQEAgLTQwNTMsNyArNDIyMCw3IEBACiAJCX0gZWxzZSB7CiAJCQlwcmludGsoS0VSTl9JTkZPICJtZDogY3JlYXRlZCAlc1xuIiwgbWRuYW1lKG1kZGV2KSk7CiAJCQltZGRldi0+cGVyc2lzdGVudCA9IDE7Ci0JCQlyZGV2X2Zvcl9lYWNoX2xpc3QocmRldiwgdG1wLCBjYW5kaWRhdGVzKSB7CisJCQlyZGV2X2Zvcl9lYWNoX2xpc3QocmRldiwgdG1wLCAmY2FuZGlkYXRlcykgewogCQkJCWxpc3RfZGVsX2luaXQoJnJkZXYtPnNhbWVfc2V0KTsKIAkJCQlpZiAoYmluZF9yZGV2X3RvX2FycmF5KHJkZXYsIG1kZGV2KSkKIAkJCQkJZXhwb3J0X3JkZXYocmRldik7CkBAIC00MDY0LDcgKzQyMzEsNyBAQAogCQkvKiBvbiBzdWNjZXNzLCBjYW5kaWRhdGVzIHdpbGwgYmUgZW1wdHksIG9uIGVycm9yCiAJCSAqIGl0IHdvbid0Li4uCiAJCSAqLwotCQlyZGV2X2Zvcl9lYWNoX2xpc3QocmRldiwgdG1wLCBjYW5kaWRhdGVzKSB7CisJCXJkZXZfZm9yX2VhY2hfbGlzdChyZGV2LCB0bXAsICZjYW5kaWRhdGVzKSB7CiAJCQlsaXN0X2RlbF9pbml0KCZyZGV2LT5zYW1lX3NldCk7CiAJCQlleHBvcnRfcmRldihyZGV2KTsKIAkJfQpAQCAtNDA5MywxMCArNDI2MCw5IEBACiAJbWR1X2FycmF5X2luZm9fdCBpbmZvOwogCWludCBucix3b3JraW5nLGFjdGl2ZSxmYWlsZWQsc3BhcmU7CiAJbWRrX3JkZXZfdCAqcmRldjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAKIAlucj13b3JraW5nPWFjdGl2ZT1mYWlsZWQ9c3BhcmU9MDsKLQlyZGV2X2Zvcl9lYWNoKHJkZXYsIHRtcCwgbWRkZXYpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KSB7CiAJCW5yKys7CiAJCWlmICh0ZXN0X2JpdChGYXVsdHksICZyZGV2LT5mbGFncykpCiAJCQlmYWlsZWQrKzsKQEAgLTQ2MTQsOSArNDc4MCw4IEBACiAKIHN0YXRpYyBpbnQgdXBkYXRlX3NpemUobWRkZXZfdCAqbWRkZXYsIHNlY3Rvcl90IG51bV9zZWN0b3JzKQogewotCW1ka19yZGV2X3QgKiByZGV2OworCW1ka19yZGV2X3QgKnJkZXY7CiAJaW50IHJ2OwotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKIAlpbnQgZml0ID0gKG51bV9zZWN0b3JzID09IDApOwogCiAJaWYgKG1kZGV2LT5wZXJzLT5yZXNpemUgPT0gTlVMTCkKQEAgLTQ2MzgsNyArNDgwMyw3IEBACiAJCSAqIGdyb3csIGFuZCByZS1hZGQuCiAJCSAqLwogCQlyZXR1cm4gLUVCVVNZOwotCXJkZXZfZm9yX2VhY2gocmRldiwgdG1wLCBtZGRldikgeworCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpIHsKIAkJc2VjdG9yX3QgYXZhaWw7CiAJCWF2YWlsID0gcmRldi0+c2l6ZSAqIDI7CiAKQEAgLTUwMDAsNiArNTE2NSw5IEBACiAKIGRvbmVfdW5sb2NrOgogYWJvcnRfdW5sb2NrOgorCWlmIChtZGRldi0+aG9sZF9hY3RpdmUgPT0gVU5USUxfSU9DVEwgJiYKKwkgICAgZXJyICE9IC1FSU5WQUwpCisJCW1kZGV2LT5ob2xkX2FjdGl2ZSA9IDA7CiAJbWRkZXZfdW5sb2NrKG1kZGV2KTsKIAogCXJldHVybiBlcnI7CkBAIC01MDE2LDE0ICs1MTg0LDI1IEBACiAJICogU3VjY2VlZCBpZiB3ZSBjYW4gbG9jayB0aGUgbWRkZXYsIHdoaWNoIGNvbmZpcm1zIHRoYXQKIAkgKiBpdCBpc24ndCBiZWluZyBzdG9wcGVkIHJpZ2h0IG5vdy4KIAkgKi8KLQltZGRldl90ICptZGRldiA9IGJkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKKwltZGRldl90ICptZGRldiA9IG1kZGV2X2ZpbmQoYmRldi0+YmRfZGV2KTsKIAlpbnQgZXJyOwogCisJaWYgKG1kZGV2LT5nZW5kaXNrICE9IGJkZXYtPmJkX2Rpc2spIHsKKwkJLyogd2UgYXJlIHJhY2luZyB3aXRoIG1kZGV2X3B1dCB3aGljaCBpcyBkaXNjYXJkaW5nIHRoaXMKKwkJICogYmRfZGlzay4KKwkJICovCisJCW1kZGV2X3B1dChtZGRldik7CisJCS8qIFdhaXQgdW50aWwgYmRldi0+YmRfZGlzayBpcyBkZWZpbml0ZWx5IGdvbmUgKi8KKwkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwkJLyogVGhlbiByZXRyeSB0aGUgb3BlbiBmcm9tIHRoZSB0b3AgKi8KKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwl9CisJQlVHX09OKG1kZGV2ICE9IGJkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YSk7CisKIAlpZiAoKGVyciA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZV9uZXN0ZWQoJm1kZGV2LT5yZWNvbmZpZ19tdXRleCwgMSkpKQogCQlnb3RvIG91dDsKIAogCWVyciA9IDA7Ci0JbWRkZXZfZ2V0KG1kZGV2KTsKIAlhdG9taWNfaW5jKCZtZGRldi0+b3BlbmVycyk7CiAJbWRkZXZfdW5sb2NrKG1kZGV2KTsKIApAQCAtNTE4NywxMSArNTM2NiwxMCBAQAogewogCWludCBpID0gMDsKIAltZGtfcmRldl90ICpyZGV2OwotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKIAogCXNlcV9wcmludGYoc2VxLCAidW51c2VkIGRldmljZXM6ICIpOwogCi0JcmRldl9mb3JfZWFjaF9saXN0KHJkZXYsIHRtcCwgcGVuZGluZ19yYWlkX2Rpc2tzKSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmcGVuZGluZ19yYWlkX2Rpc2tzLCBzYW1lX3NldCkgewogCQljaGFyIGJbQkRFVk5BTUVfU0laRV07CiAJCWkrKzsKIAkJc2VxX3ByaW50ZihzZXEsICIlcyAiLApAQCAtNTM1MCw3ICs1NTI4LDYgQEAKIHsKIAltZGRldl90ICptZGRldiA9IHY7CiAJc2VjdG9yX3Qgc2l6ZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXAyOwogCW1ka19yZGV2X3QgKnJkZXY7CiAJc3RydWN0IG1kc3RhdF9pbmZvICptaSA9IHNlcS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgYml0bWFwICpiaXRtYXA7CkBAIC01Mzg3LDcgKzU1NjQsNyBAQAogCQl9CiAKIAkJc2l6ZSA9IDA7Ci0JCXJkZXZfZm9yX2VhY2gocmRldiwgdG1wMiwgbWRkZXYpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkgewogCQkJY2hhciBiW0JERVZOQU1FX1NJWkVdOwogCQkJc2VxX3ByaW50ZihzZXEsICIgJXNbJWRdIiwKIAkJCQliZGV2bmFtZShyZGV2LT5iZGV2LGIpLCByZGV2LT5kZXNjX25yKTsKQEAgLTU2OTQsNyArNTg3MSw2IEBACiAJc3RydWN0IGxpc3RfaGVhZCAqdG1wOwogCXNlY3Rvcl90IGxhc3RfY2hlY2s7CiAJaW50IHNraXBwZWQgPSAwOwotCXN0cnVjdCBsaXN0X2hlYWQgKnJ0bXA7CiAJbWRrX3JkZXZfdCAqcmRldjsKIAljaGFyICpkZXNjOwogCkBAIC01Nzk5LDcgKzU5NzUsNyBAQAogCQkvKiByZWNvdmVyeSBmb2xsb3dzIHRoZSBwaHlzaWNhbCBzaXplIG9mIGRldmljZXMgKi8KIAkJbWF4X3NlY3RvcnMgPSBtZGRldi0+c2l6ZSA8PCAxOwogCQlqID0gTWF4U2VjdG9yOwotCQlyZGV2X2Zvcl9lYWNoKHJkZXYsIHJ0bXAsIG1kZGV2KQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KQogCQkJaWYgKHJkZXYtPnJhaWRfZGlzayA+PSAwICYmCiAJCQkgICAgIXRlc3RfYml0KEZhdWx0eSwgJnJkZXYtPmZsYWdzKSAmJgogCQkJICAgICF0ZXN0X2JpdChJbl9zeW5jLCAmcmRldi0+ZmxhZ3MpICYmCkBAIC01OTQ5LDcgKzYxMjUsNyBAQAogCQl9IGVsc2UgewogCQkJaWYgKCF0ZXN0X2JpdChNRF9SRUNPVkVSWV9JTlRSLCAmbWRkZXYtPnJlY292ZXJ5KSkKIAkJCQltZGRldi0+Y3Vycl9yZXN5bmMgPSBNYXhTZWN0b3I7Ci0JCQlyZGV2X2Zvcl9lYWNoKHJkZXYsIHJ0bXAsIG1kZGV2KQorCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkKIAkJCQlpZiAocmRldi0+cmFpZF9kaXNrID49IDAgJiYKIAkJCQkgICAgIXRlc3RfYml0KEZhdWx0eSwgJnJkZXYtPmZsYWdzKSAmJgogCQkJCSAgICAhdGVzdF9iaXQoSW5fc3luYywgJnJkZXYtPmZsYWdzKSAmJgpAQCAtNTk4NSwxMCArNjE2MSw5IEBACiBzdGF0aWMgaW50IHJlbW92ZV9hbmRfYWRkX3NwYXJlcyhtZGRldl90ICptZGRldikKIHsKIAltZGtfcmRldl90ICpyZGV2OwotCXN0cnVjdCBsaXN0X2hlYWQgKnJ0bXA7CiAJaW50IHNwYXJlcyA9IDA7CiAKLQlyZGV2X2Zvcl9lYWNoKHJkZXYsIHJ0bXAsIG1kZGV2KQorCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpCiAJCWlmIChyZGV2LT5yYWlkX2Rpc2sgPj0gMCAmJgogCQkgICAgIXRlc3RfYml0KEJsb2NrZWQsICZyZGV2LT5mbGFncykgJiYKIAkJICAgICh0ZXN0X2JpdChGYXVsdHksICZyZGV2LT5mbGFncykgfHwKQEAgLTYwMDMsOCArNjE3OCw4IEBACiAJCQl9CiAJCX0KIAotCWlmIChtZGRldi0+ZGVncmFkZWQgJiYgISBtZGRldi0+cm8pIHsKLQkJcmRldl9mb3JfZWFjaChyZGV2LCBydG1wLCBtZGRldikgeworCWlmIChtZGRldi0+ZGVncmFkZWQgJiYgISBtZGRldi0+cm8gJiYgIW1kZGV2LT5yZWNvdmVyeV9kaXNhYmxlZCkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KSB7CiAJCQlpZiAocmRldi0+cmFpZF9kaXNrID49IDAgJiYKIAkJCSAgICAhdGVzdF9iaXQoSW5fc3luYywgJnJkZXYtPmZsYWdzKSAmJgogCQkJICAgICF0ZXN0X2JpdChCbG9ja2VkLCAmcmRldi0+ZmxhZ3MpKQpAQCAtNjA1Niw3ICs2MjMxLDYgQEAKIHZvaWQgbWRfY2hlY2tfcmVjb3ZlcnkobWRkZXZfdCAqbWRkZXYpCiB7CiAJbWRrX3JkZXZfdCAqcmRldjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpydG1wOwogCiAKIAlpZiAobWRkZXYtPmJpdG1hcCkKQEAgLTYxMjAsNyArNjI5NCw3IEBACiAJCWlmIChtZGRldi0+ZmxhZ3MpCiAJCQltZF91cGRhdGVfc2IobWRkZXYsIDApOwogCi0JCXJkZXZfZm9yX2VhY2gocmRldiwgcnRtcCwgbWRkZXYpCisJCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpCiAJCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFN0YXRlQ2hhbmdlZCwgJnJkZXYtPmZsYWdzKSkKIAkJCQlzeXNmc19ub3RpZnlfZGlyZW50KHJkZXYtPnN5c2ZzX3N0YXRlKTsKIApAQCAtNjE0OSwxMyArNjMyMywxMyBAQAogCQkJICogaW5mb3JtYXRpb24gbXVzdCBiZSBzY3JhcHBlZAogCQkJICovCiAJCQlpZiAoIW1kZGV2LT5kZWdyYWRlZCkKLQkJCQlyZGV2X2Zvcl9lYWNoKHJkZXYsIHJ0bXAsIG1kZGV2KQorCQkJCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpCiAJCQkJCXJkZXYtPnNhdmVkX3JhaWRfZGlzayA9IC0xOwogCiAJCQltZGRldi0+cmVjb3ZlcnkgPSAwOwogCQkJLyogZmxhZyByZWNvdmVyeSBuZWVkZWQganVzdCB0byBkb3VibGUgY2hlY2sgKi8KIAkJCXNldF9iaXQoTURfUkVDT1ZFUllfTkVFREVELCAmbWRkZXYtPnJlY292ZXJ5KTsKLQkJCXN5c2ZzX25vdGlmeSgmbWRkZXYtPmtvYmosIE5VTEwsICJzeW5jX2FjdGlvbiIpOworCQkJc3lzZnNfbm90aWZ5X2RpcmVudChtZGRldi0+c3lzZnNfYWN0aW9uKTsKIAkJCW1kX25ld19ldmVudChtZGRldik7CiAJCQlnb3RvIHVubG9jazsKIAkJfQpAQCAtNjIxNiw3ICs2MzkwLDcgQEAKIAkJCQltZGRldi0+cmVjb3ZlcnkgPSAwOwogCQkJfSBlbHNlCiAJCQkJbWRfd2FrZXVwX3RocmVhZChtZGRldi0+c3luY190aHJlYWQpOwotCQkJc3lzZnNfbm90aWZ5KCZtZGRldi0+a29iaiwgTlVMTCwgInN5bmNfYWN0aW9uIik7CisJCQlzeXNmc19ub3RpZnlfZGlyZW50KG1kZGV2LT5zeXNmc19hY3Rpb24pOwogCQkJbWRfbmV3X2V2ZW50KG1kZGV2KTsKIAkJfQogCXVubG9jazoKQEAgLTYyMjQsNyArNjM5OCw4IEBACiAJCQljbGVhcl9iaXQoTURfUkVDT1ZFUllfUlVOTklORywgJm1kZGV2LT5yZWNvdmVyeSk7CiAJCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KE1EX1JFQ09WRVJZX1JFQ09WRVIsCiAJCQkJCSAgICAgICAmbWRkZXYtPnJlY292ZXJ5KSkKLQkJCQlzeXNmc19ub3RpZnkoJm1kZGV2LT5rb2JqLCBOVUxMLCAic3luY19hY3Rpb24iKTsKKwkJCQlpZiAobWRkZXYtPnN5c2ZzX2FjdGlvbikKKwkJCQkJc3lzZnNfbm90aWZ5X2RpcmVudChtZGRldi0+c3lzZnNfYWN0aW9uKTsKIAkJfQogCQltZGRldl91bmxvY2sobWRkZXYpOwogCX0KQEAgLTYzODYsMTQgKzY1NjEsOCBAQAogCXVucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKHJhaWRfdGFibGVfaGVhZGVyKTsKIAlyZW1vdmVfcHJvY19lbnRyeSgibWRzdGF0IiwgTlVMTCk7CiAJZm9yX2VhY2hfbWRkZXYobWRkZXYsIHRtcCkgewotCQlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IG1kZGV2LT5nZW5kaXNrOwotCQlpZiAoIWRpc2spCi0JCQljb250aW51ZTsKIAkJZXhwb3J0X2FycmF5KG1kZGV2KTsKLQkJZGVsX2dlbmRpc2soZGlzayk7Ci0JCXB1dF9kaXNrKGRpc2spOwotCQltZGRldi0+Z2VuZGlzayA9IE5VTEw7Ci0JCW1kZGV2X3B1dChtZGRldik7CisJCW1kZGV2LT5ob2xkX2FjdGl2ZSA9IDA7CiAJfQogfQogCkBAIC02NDE4LDYgKzY1ODcsNyBAQAogbW9kdWxlX3BhcmFtX2NhbGwoc3RhcnRfcm8sIHNldF9ybywgZ2V0X3JvLCBOVUxMLCBTX0lSVVNSfFNfSVdVU1IpOwogbW9kdWxlX3BhcmFtKHN0YXJ0X2RpcnR5X2RlZ3JhZGVkLCBpbnQsIFNfSVJVR098U19JV1VTUik7CiAKK21vZHVsZV9wYXJhbV9jYWxsKG5ld19hcnJheSwgYWRkX25hbWVkX2FycmF5LCBOVUxMLCBOVUxMLCBTX0lXVVNSKTsKIAogRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9tZF9wZXJzb25hbGl0eSk7CiBFWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfbWRfcGVyc29uYWxpdHkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9tdWx0aXBhdGguYyBiL2RyaXZlcnMvbWQvbXVsdGlwYXRoLmMKaW5kZXggZDRhYzQ3ZC4uZjZkMDhmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9tdWx0aXBhdGguYworKysgYi9kcml2ZXJzL21kL211bHRpcGF0aC5jCkBAIC00MDgsNyArNDA4LDYgQEAKIAlpbnQgZGlza19pZHg7CiAJc3RydWN0IG11bHRpcGF0aF9pbmZvICpkaXNrOwogCW1ka19yZGV2X3QgKnJkZXY7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wOwogCiAJaWYgKG1kZGV2LT5sZXZlbCAhPSBMRVZFTF9NVUxUSVBBVEgpIHsKIAkJcHJpbnRrKCJtdWx0aXBhdGg6ICVzOiByYWlkIGxldmVsIG5vdCBzZXQgdG8gbXVsdGlwYXRoIElPICglZClcbiIsCkBAIC00NDEsNyArNDQwLDcgQEAKIAl9CiAKIAljb25mLT53b3JraW5nX2Rpc2tzID0gMDsKLQlyZGV2X2Zvcl9lYWNoKHJkZXYsIHRtcCwgbWRkZXYpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KSB7CiAJCWRpc2tfaWR4ID0gcmRldi0+cmFpZF9kaXNrOwogCQlpZiAoZGlza19pZHggPCAwIHx8CiAJCSAgICBkaXNrX2lkeCA+PSBtZGRldi0+cmFpZF9kaXNrcykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDAuYyBiL2RyaXZlcnMvbWQvcmFpZDAuYwppbmRleCA4YWM2NDg4Li5jNjA1YmE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL3JhaWQwLmMKKysrIGIvZHJpdmVycy9tZC9yYWlkMC5jCkBAIC01MywxMSArNTMsMTAgQEAKIHN0YXRpYyBpbnQgY3JlYXRlX3N0cmlwX3pvbmVzIChtZGRldl90ICptZGRldikKIHsKIAlpbnQgaSwgYywgajsKLQlzZWN0b3JfdCBjdXJyZW50X29mZnNldCwgY3Vycl96b25lX29mZnNldDsKKwlzZWN0b3JfdCBjdXJyZW50X3N0YXJ0LCBjdXJyX3pvbmVfc3RhcnQ7CiAJc2VjdG9yX3QgbWluX3NwYWNpbmc7CiAJcmFpZDBfY29uZl90ICpjb25mID0gbWRkZXZfdG9fY29uZihtZGRldik7CiAJbWRrX3JkZXZfdCAqc21hbGxlc3QsICpyZGV2MSwgKnJkZXYyLCAqcmRldjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXAxLCAqdG1wMjsKIAlzdHJ1Y3Qgc3RyaXBfem9uZSAqem9uZTsKIAlpbnQgY250OwogCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKQEAgLTY3LDE5ICs2NiwxOSBAQAogCSAqLwogCWNvbmYtPm5yX3N0cmlwX3pvbmVzID0gMDsKICAKLQlyZGV2X2Zvcl9lYWNoKHJkZXYxLCB0bXAxLCBtZGRldikgewotCQlwcmludGsoInJhaWQwOiBsb29raW5nIGF0ICVzXG4iLAorCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldjEsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KSB7CisJCXByaW50ayhLRVJOX0lORk8gInJhaWQwOiBsb29raW5nIGF0ICVzXG4iLAogCQkJYmRldm5hbWUocmRldjEtPmJkZXYsYikpOwogCQljID0gMDsKLQkJcmRldl9mb3JfZWFjaChyZGV2MiwgdG1wMiwgbWRkZXYpIHsKLQkJCXByaW50aygicmFpZDA6ICAgY29tcGFyaW5nICVzKCVsbHUpIiwKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2MiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gInJhaWQwOiAgIGNvbXBhcmluZyAlcyglbGx1KSIsCiAJCQkgICAgICAgYmRldm5hbWUocmRldjEtPmJkZXYsYiksCiAJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylyZGV2MS0+c2l6ZSk7Ci0JCQlwcmludGsoIiB3aXRoICVzKCVsbHUpXG4iLAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiIHdpdGggJXMoJWxsdSlcbiIsCiAJCQkgICAgICAgYmRldm5hbWUocmRldjItPmJkZXYsYiksCiAJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylyZGV2Mi0+c2l6ZSk7CiAJCQlpZiAocmRldjIgPT0gcmRldjEpIHsKLQkJCQlwcmludGsoInJhaWQwOiAgIEVORFxuIik7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAicmFpZDA6ICAgRU5EXG4iKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJCWlmIChyZGV2Mi0+c2l6ZSA9PSByZGV2MS0+c2l6ZSkKQEAgLTg4LDE5ICs4NywyMCBAQAogCQkJCSAqIE5vdCB1bmlxdWUsIGRvbid0IGNvdW50IGl0IGFzIGEgbmV3CiAJCQkJICogZ3JvdXAKIAkJCQkgKi8KLQkJCQlwcmludGsoInJhaWQwOiAgIEVRVUFMXG4iKTsKKwkJCQlwcmludGsoS0VSTl9JTkZPICJyYWlkMDogICBFUVVBTFxuIik7CiAJCQkJYyA9IDE7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQlwcmludGsoInJhaWQwOiAgIE5PVCBFUVVBTFxuIik7CisJCQlwcmludGsoS0VSTl9JTkZPICJyYWlkMDogICBOT1QgRVFVQUxcbiIpOwogCQl9CiAJCWlmICghYykgewotCQkJcHJpbnRrKCJyYWlkMDogICA9PT4gVU5JUVVFXG4iKTsKKwkJCXByaW50ayhLRVJOX0lORk8gInJhaWQwOiAgID09PiBVTklRVUVcbiIpOwogCQkJY29uZi0+bnJfc3RyaXBfem9uZXMrKzsKLQkJCXByaW50aygicmFpZDA6ICVkIHpvbmVzXG4iLCBjb25mLT5ucl9zdHJpcF96b25lcyk7CisJCQlwcmludGsoS0VSTl9JTkZPICJyYWlkMDogJWQgem9uZXNcbiIsCisJCQkJY29uZi0+bnJfc3RyaXBfem9uZXMpOwogCQl9CiAJfQotCXByaW50aygicmFpZDA6IEZJTkFMICVkIHpvbmVzXG4iLCBjb25mLT5ucl9zdHJpcF96b25lcyk7CisJcHJpbnRrKEtFUk5fSU5GTyAicmFpZDA6IEZJTkFMICVkIHpvbmVzXG4iLCBjb25mLT5ucl9zdHJpcF96b25lcyk7CiAKIAljb25mLT5zdHJpcF96b25lID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHN0cmlwX3pvbmUpKgogCQkJCWNvbmYtPm5yX3N0cmlwX3pvbmVzLCBHRlBfS0VSTkVMKTsKQEAgLTExOSwxNiArMTE5LDE3IEBACiAJY250ID0gMDsKIAlzbWFsbGVzdCA9IE5VTEw7CiAJem9uZS0+ZGV2ID0gY29uZi0+ZGV2bGlzdDsKLQlyZGV2X2Zvcl9lYWNoKHJkZXYxLCB0bXAxLCBtZGRldikgeworCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldjEsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KSB7CiAJCWludCBqID0gcmRldjEtPnJhaWRfZGlzazsKIAogCQlpZiAoaiA8IDAgfHwgaiA+PSBtZGRldi0+cmFpZF9kaXNrcykgewotCQkJcHJpbnRrKCJyYWlkMDogYmFkIGRpc2sgbnVtYmVyICVkIC0gYWJvcnRpbmchXG4iLCBqKTsKKwkJCXByaW50ayhLRVJOX0VSUiAicmFpZDA6IGJhZCBkaXNrIG51bWJlciAlZCAtICIKKwkJCQkiYWJvcnRpbmchXG4iLCBqKTsKIAkJCWdvdG8gYWJvcnQ7CiAJCX0KIAkJaWYgKHpvbmUtPmRldltqXSkgewotCQkJcHJpbnRrKCJyYWlkMDogbXVsdGlwbGUgZGV2aWNlcyBmb3IgJWQgLSBhYm9ydGluZyFcbiIsCi0JCQkJaik7CisJCQlwcmludGsoS0VSTl9FUlIgInJhaWQwOiBtdWx0aXBsZSBkZXZpY2VzIGZvciAlZCAtICIKKwkJCQkiYWJvcnRpbmchXG4iLCBqKTsKIAkJCWdvdG8gYWJvcnQ7CiAJCX0KIAkJem9uZS0+ZGV2W2pdID0gcmRldjE7CkBAIC0xNDksMTYgKzE1MCwxNiBAQAogCQljbnQrKzsKIAl9CiAJaWYgKGNudCAhPSBtZGRldi0+cmFpZF9kaXNrcykgewotCQlwcmludGsoInJhaWQwOiB0b28gZmV3IGRpc2tzICglZCBvZiAlZCkgLSBhYm9ydGluZyFcbiIsCi0JCQljbnQsIG1kZGV2LT5yYWlkX2Rpc2tzKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJyYWlkMDogdG9vIGZldyBkaXNrcyAoJWQgb2YgJWQpIC0gIgorCQkJImFib3J0aW5nIVxuIiwgY250LCBtZGRldi0+cmFpZF9kaXNrcyk7CiAJCWdvdG8gYWJvcnQ7CiAJfQogCXpvbmUtPm5iX2RldiA9IGNudDsKLQl6b25lLT5zaXplID0gc21hbGxlc3QtPnNpemUgKiBjbnQ7Ci0Jem9uZS0+em9uZV9vZmZzZXQgPSAwOworCXpvbmUtPnNlY3RvcnMgPSBzbWFsbGVzdC0+c2l6ZSAqIGNudCAqIDI7CisJem9uZS0+em9uZV9zdGFydCA9IDA7CiAKLQljdXJyZW50X29mZnNldCA9IHNtYWxsZXN0LT5zaXplOwotCWN1cnJfem9uZV9vZmZzZXQgPSB6b25lLT5zaXplOworCWN1cnJlbnRfc3RhcnQgPSBzbWFsbGVzdC0+c2l6ZSAqIDI7CisJY3Vycl96b25lX3N0YXJ0ID0gem9uZS0+c2VjdG9yczsKIAogCS8qIG5vdyBkbyB0aGUgb3RoZXIgem9uZXMgKi8KIAlmb3IgKGkgPSAxOyBpIDwgY29uZi0+bnJfc3RyaXBfem9uZXM7IGkrKykKQEAgLTE2Niw0MCArMTY3LDQxIEBACiAJCXpvbmUgPSBjb25mLT5zdHJpcF96b25lICsgaTsKIAkJem9uZS0+ZGV2ID0gY29uZi0+c3RyaXBfem9uZVtpLTFdLmRldiArIG1kZGV2LT5yYWlkX2Rpc2tzOwogCi0JCXByaW50aygicmFpZDA6IHpvbmUgJWRcbiIsIGkpOwotCQl6b25lLT5kZXZfb2Zmc2V0ID0gY3VycmVudF9vZmZzZXQ7CisJCXByaW50ayhLRVJOX0lORk8gInJhaWQwOiB6b25lICVkXG4iLCBpKTsKKwkJem9uZS0+ZGV2X3N0YXJ0ID0gY3VycmVudF9zdGFydDsKIAkJc21hbGxlc3QgPSBOVUxMOwogCQljID0gMDsKIAogCQlmb3IgKGo9MDsgajxjbnQ7IGorKykgewogCQkJY2hhciBiW0JERVZOQU1FX1NJWkVdOwogCQkJcmRldiA9IGNvbmYtPnN0cmlwX3pvbmVbMF0uZGV2W2pdOwotCQkJcHJpbnRrKCJyYWlkMDogY2hlY2tpbmcgJXMgLi4uIiwgYmRldm5hbWUocmRldi0+YmRldixiKSk7Ci0JCQlpZiAocmRldi0+c2l6ZSA+IGN1cnJlbnRfb2Zmc2V0KQotCQkJewotCQkJCXByaW50aygiIGNvbnRhaW5lZCBhcyBkZXZpY2UgJWRcbiIsIGMpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAicmFpZDA6IGNoZWNraW5nICVzIC4uLiIsCisJCQkJYmRldm5hbWUocmRldi0+YmRldiwgYikpOworCQkJaWYgKHJkZXYtPnNpemUgPiBjdXJyZW50X3N0YXJ0IC8gMikgeworCQkJCXByaW50ayhLRVJOX0lORk8gIiBjb250YWluZWQgYXMgZGV2aWNlICVkXG4iLAorCQkJCQljKTsKIAkJCQl6b25lLT5kZXZbY10gPSByZGV2OwogCQkJCWMrKzsKIAkJCQlpZiAoIXNtYWxsZXN0IHx8IChyZGV2LT5zaXplIDxzbWFsbGVzdC0+c2l6ZSkpIHsKIAkJCQkJc21hbGxlc3QgPSByZGV2OwotCQkJCQlwcmludGsoIiAgKCVsbHUpIGlzIHNtYWxsZXN0IS5cbiIsIAorCQkJCQlwcmludGsoS0VSTl9JTkZPICIgICglbGx1KSBpcyBzbWFsbGVzdCEuXG4iLAogCQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylyZGV2LT5zaXplKTsKIAkJCQl9CiAJCQl9IGVsc2UKLQkJCQlwcmludGsoIiBub3BlLlxuIik7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiIG5vcGUuXG4iKTsKIAkJfQogCiAJCXpvbmUtPm5iX2RldiA9IGM7Ci0JCXpvbmUtPnNpemUgPSAoc21hbGxlc3QtPnNpemUgLSBjdXJyZW50X29mZnNldCkgKiBjOwotCQlwcmludGsoInJhaWQwOiB6b25lLT5uYl9kZXY6ICVkLCBzaXplOiAlbGx1XG4iLAotCQkJem9uZS0+bmJfZGV2LCAodW5zaWduZWQgbG9uZyBsb25nKXpvbmUtPnNpemUpOworCQl6b25lLT5zZWN0b3JzID0gKHNtYWxsZXN0LT5zaXplICogMiAtIGN1cnJlbnRfc3RhcnQpICogYzsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicmFpZDA6IHpvbmUtPm5iX2RldjogJWQsIHNlY3RvcnM6ICVsbHVcbiIsCisJCQl6b25lLT5uYl9kZXYsICh1bnNpZ25lZCBsb25nIGxvbmcpem9uZS0+c2VjdG9ycyk7CiAKLQkJem9uZS0+em9uZV9vZmZzZXQgPSBjdXJyX3pvbmVfb2Zmc2V0OwotCQljdXJyX3pvbmVfb2Zmc2V0ICs9IHpvbmUtPnNpemU7CisJCXpvbmUtPnpvbmVfc3RhcnQgPSBjdXJyX3pvbmVfc3RhcnQ7CisJCWN1cnJfem9uZV9zdGFydCArPSB6b25lLT5zZWN0b3JzOwogCi0JCWN1cnJlbnRfb2Zmc2V0ID0gc21hbGxlc3QtPnNpemU7Ci0JCXByaW50aygicmFpZDA6IGN1cnJlbnQgem9uZSBvZmZzZXQ6ICVsbHVcbiIsCi0JCQkodW5zaWduZWQgbG9uZyBsb25nKWN1cnJlbnRfb2Zmc2V0KTsKKwkJY3VycmVudF9zdGFydCA9IHNtYWxsZXN0LT5zaXplICogMjsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicmFpZDA6IGN1cnJlbnQgem9uZSBzdGFydDogJWxsdVxuIiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpY3VycmVudF9zdGFydCk7CiAJfQogCiAJLyogTm93IGZpbmQgYXBwcm9wcmlhdGUgaGFzaCBzcGFjaW5nLgpAQCAtMjEwLDE2ICsyMTIsMTYgQEAKIAkgKiBzdHJpcCB0aG91Z2ggYXMgaXQncyBzaXplIGhhcyBubyBiZWFyaW5nIG9uIHRoZSBlZmZpY2FjeSBvZiB0aGUgaGFzaAogCSAqIHRhYmxlLgogCSAqLwotCWNvbmYtPmhhc2hfc3BhY2luZyA9IGN1cnJfem9uZV9vZmZzZXQ7Ci0JbWluX3NwYWNpbmcgPSBjdXJyX3pvbmVfb2Zmc2V0OworCWNvbmYtPnNwYWNpbmcgPSBjdXJyX3pvbmVfc3RhcnQ7CisJbWluX3NwYWNpbmcgPSBjdXJyX3pvbmVfc3RhcnQ7CiAJc2VjdG9yX2RpdihtaW5fc3BhY2luZywgUEFHRV9TSVpFL3NpemVvZihzdHJ1Y3Qgc3RyaXBfem9uZSopKTsKIAlmb3IgKGk9MDsgaSA8IGNvbmYtPm5yX3N0cmlwX3pvbmVzLTE7IGkrKykgewotCQlzZWN0b3JfdCBzeiA9IDA7Ci0JCWZvciAoaj1pOyBqPGNvbmYtPm5yX3N0cmlwX3pvbmVzLTEgJiYKLQkJCSAgICAgc3ogPCBtaW5fc3BhY2luZyA7IGorKykKLQkJCXN6ICs9IGNvbmYtPnN0cmlwX3pvbmVbal0uc2l6ZTsKLQkJaWYgKHN6ID49IG1pbl9zcGFjaW5nICYmIHN6IDwgY29uZi0+aGFzaF9zcGFjaW5nKQotCQkJY29uZi0+aGFzaF9zcGFjaW5nID0gc3o7CisJCXNlY3Rvcl90IHMgPSAwOworCQlmb3IgKGogPSBpOyBqIDwgY29uZi0+bnJfc3RyaXBfem9uZXMgLSAxICYmCisJCQkJcyA8IG1pbl9zcGFjaW5nOyBqKyspCisJCQlzICs9IGNvbmYtPnN0cmlwX3pvbmVbal0uc2VjdG9yczsKKwkJaWYgKHMgPj0gbWluX3NwYWNpbmcgJiYgcyA8IGNvbmYtPnNwYWNpbmcpCisJCQljb25mLT5zcGFjaW5nID0gczsKIAl9CiAKIAltZGRldi0+cXVldWUtPnVucGx1Z19mbiA9IHJhaWQwX3VucGx1ZzsKQEAgLTIyNyw3ICsyMjksNyBAQAogCW1kZGV2LT5xdWV1ZS0+YmFja2luZ19kZXZfaW5mby5jb25nZXN0ZWRfZm4gPSByYWlkMF9jb25nZXN0ZWQ7CiAJbWRkZXYtPnF1ZXVlLT5iYWNraW5nX2Rldl9pbmZvLmNvbmdlc3RlZF9kYXRhID0gbWRkZXY7CiAKLQlwcmludGsoInJhaWQwOiBkb25lLlxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAicmFpZDA6IGRvbmUuXG4iKTsKIAlyZXR1cm4gMDsKICBhYm9ydDoKIAlyZXR1cm4gMTsKQEAgLTI2MiwxMCArMjY0LDkgQEAKIHN0YXRpYyBpbnQgcmFpZDBfcnVuIChtZGRldl90ICptZGRldikKIHsKIAl1bnNpZ25lZCAgY3VyPTAsIGk9MCwgbmJfem9uZTsKLQlzNjQgc2l6ZTsKKwlzNjQgc2VjdG9yczsKIAlyYWlkMF9jb25mX3QgKmNvbmY7CiAJbWRrX3JkZXZfdCAqcmRldjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAKIAlpZiAobWRkZXYtPmNodW5rX3NpemUgPT0gMCkgewogCQlwcmludGsoS0VSTl9FUlIgIm1kL3JhaWQwOiBub24temVybyBjaHVuayBzaXplIHJlcXVpcmVkLlxuIik7CkBAIC0yOTEsNTQgKzI5Miw1NCBAQAogCiAJLyogY2FsY3VsYXRlIGFycmF5IGRldmljZSBzaXplICovCiAJbWRkZXYtPmFycmF5X3NlY3RvcnMgPSAwOwotCXJkZXZfZm9yX2VhY2gocmRldiwgdG1wLCBtZGRldikKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KQogCQltZGRldi0+YXJyYXlfc2VjdG9ycyArPSByZGV2LT5zaXplICogMjsKIAotCXByaW50aygicmFpZDAgOiBtZF9zaXplIGlzICVsbHUgYmxvY2tzLlxuIiwgCi0JCSh1bnNpZ25lZCBsb25nIGxvbmcpbWRkZXYtPmFycmF5X3NlY3RvcnMgLyAyKTsKLQlwcmludGsoInJhaWQwIDogY29uZi0+aGFzaF9zcGFjaW5nIGlzICVsbHUgYmxvY2tzLlxuIiwKLQkJKHVuc2lnbmVkIGxvbmcgbG9uZyljb25mLT5oYXNoX3NwYWNpbmcpOworCXByaW50ayhLRVJOX0lORk8gInJhaWQwIDogbWRfc2l6ZSBpcyAlbGx1IHNlY3RvcnMuXG4iLAorCQkodW5zaWduZWQgbG9uZyBsb25nKW1kZGV2LT5hcnJheV9zZWN0b3JzKTsKKwlwcmludGsoS0VSTl9JTkZPICJyYWlkMCA6IGNvbmYtPnNwYWNpbmcgaXMgJWxsdSBzZWN0b3JzLlxuIiwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZyljb25mLT5zcGFjaW5nKTsKIAl7Ci0JCXNlY3Rvcl90IHMgPSBtZGRldi0+YXJyYXlfc2VjdG9ycyAvIDI7Ci0JCXNlY3Rvcl90IHNwYWNlID0gY29uZi0+aGFzaF9zcGFjaW5nOworCQlzZWN0b3JfdCBzID0gbWRkZXYtPmFycmF5X3NlY3RvcnM7CisJCXNlY3Rvcl90IHNwYWNlID0gY29uZi0+c3BhY2luZzsKIAkJaW50IHJvdW5kOwotCQljb25mLT5wcmVzaGlmdCA9IDA7CisJCWNvbmYtPnNlY3Rvcl9zaGlmdCA9IDA7CiAJCWlmIChzaXplb2Yoc2VjdG9yX3QpID4gc2l6ZW9mKHUzMikpIHsKIAkJCS8qc2hpZnQgZG93biBzcGFjZSBhbmQgcyBzbyB0aGF0IHNlY3Rvcl9kaXYgd2lsbCB3b3JrICovCiAJCQl3aGlsZSAoc3BhY2UgPiAoc2VjdG9yX3QpICh+KHUzMikwKSkgewogCQkJCXMgPj49IDE7CiAJCQkJc3BhY2UgPj49IDE7CiAJCQkJcyArPSAxOyAvKiBmb3JjZSByb3VuZC11cCAqLwotCQkJCWNvbmYtPnByZXNoaWZ0Kys7CisJCQkJY29uZi0+c2VjdG9yX3NoaWZ0Kys7CiAJCQl9CiAJCX0KIAkJcm91bmQgPSBzZWN0b3JfZGl2KHMsICh1MzIpc3BhY2UpID8gMSA6IDA7CiAJCW5iX3pvbmUgPSBzICsgcm91bmQ7CiAJfQotCXByaW50aygicmFpZDAgOiBuYl96b25lIGlzICVkLlxuIiwgbmJfem9uZSk7CisJcHJpbnRrKEtFUk5fSU5GTyAicmFpZDAgOiBuYl96b25lIGlzICVkLlxuIiwgbmJfem9uZSk7CiAKLQlwcmludGsoInJhaWQwIDogQWxsb2NhdGluZyAlWmQgYnl0ZXMgZm9yIGhhc2guXG4iLAorCXByaW50ayhLRVJOX0lORk8gInJhaWQwIDogQWxsb2NhdGluZyAlenUgYnl0ZXMgZm9yIGhhc2guXG4iLAogCQkJCW5iX3pvbmUqc2l6ZW9mKHN0cnVjdCBzdHJpcF96b25lKikpOwogCWNvbmYtPmhhc2hfdGFibGUgPSBrbWFsbG9jIChzaXplb2YgKHN0cnVjdCBzdHJpcF96b25lICopKm5iX3pvbmUsIEdGUF9LRVJORUwpOwogCWlmICghY29uZi0+aGFzaF90YWJsZSkKIAkJZ290byBvdXRfZnJlZV9jb25mOwotCXNpemUgPSBjb25mLT5zdHJpcF96b25lW2N1cl0uc2l6ZTsKKwlzZWN0b3JzID0gY29uZi0+c3RyaXBfem9uZVtjdXJdLnNlY3RvcnM7CiAKIAljb25mLT5oYXNoX3RhYmxlWzBdID0gY29uZi0+c3RyaXBfem9uZSArIGN1cjsKIAlmb3IgKGk9MTsgaTwgbmJfem9uZTsgaSsrKSB7Ci0JCXdoaWxlIChzaXplIDw9IGNvbmYtPmhhc2hfc3BhY2luZykgeworCQl3aGlsZSAoc2VjdG9ycyA8PSBjb25mLT5zcGFjaW5nKSB7CiAJCQljdXIrKzsKLQkJCXNpemUgKz0gY29uZi0+c3RyaXBfem9uZVtjdXJdLnNpemU7CisJCQlzZWN0b3JzICs9IGNvbmYtPnN0cmlwX3pvbmVbY3VyXS5zZWN0b3JzOwogCQl9Ci0JCXNpemUgLT0gY29uZi0+aGFzaF9zcGFjaW5nOworCQlzZWN0b3JzIC09IGNvbmYtPnNwYWNpbmc7CiAJCWNvbmYtPmhhc2hfdGFibGVbaV0gPSBjb25mLT5zdHJpcF96b25lICsgY3VyOwogCX0KLQlpZiAoY29uZi0+cHJlc2hpZnQpIHsKLQkJY29uZi0+aGFzaF9zcGFjaW5nID4+PSBjb25mLT5wcmVzaGlmdDsKLQkJLyogcm91bmQgaGFzaF9zcGFjaW5nIHVwIHNvIHdoZW4gd2UgZGl2aWRlIGJ5IGl0LCB3ZQorCWlmIChjb25mLT5zZWN0b3Jfc2hpZnQpIHsKKwkJY29uZi0+c3BhY2luZyA+Pj0gY29uZi0+c2VjdG9yX3NoaWZ0OworCQkvKiByb3VuZCBzcGFjaW5nIHVwIHNvIHdoZW4gd2UgZGl2aWRlIGJ5IGl0LCB3ZQogCQkgKiBlcnIgb24gdGhlIHNpZGUgb2YgdG9vLWxvdywgd2hpY2ggaXMgc2FmZXN0CiAJCSAqLwotCQljb25mLT5oYXNoX3NwYWNpbmcrKzsKKwkJY29uZi0+c3BhY2luZysrOwogCX0KIAogCS8qIGNhbGN1bGF0ZSB0aGUgbWF4IHJlYWQtYWhlYWQgc2l6ZS4KQEAgLTM4NywxMiArMzg4LDEyIEBACiBzdGF0aWMgaW50IHJhaWQwX21ha2VfcmVxdWVzdCAoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbykKIHsKIAltZGRldl90ICptZGRldiA9IHEtPnF1ZXVlZGF0YTsKLQl1bnNpZ25lZCBpbnQgc2VjdF9pbl9jaHVuaywgY2h1bmtzaXplX2JpdHMsICBjaHVua19zaXplLCBjaHVua19zZWN0czsKKwl1bnNpZ25lZCBpbnQgc2VjdF9pbl9jaHVuaywgY2h1bmtzZWN0X2JpdHMsIGNodW5rX3NlY3RzOwogCXJhaWQwX2NvbmZfdCAqY29uZiA9IG1kZGV2X3RvX2NvbmYobWRkZXYpOwogCXN0cnVjdCBzdHJpcF96b25lICp6b25lOwogCW1ka19yZGV2X3QgKnRtcF9kZXY7CiAJc2VjdG9yX3QgY2h1bms7Ci0Jc2VjdG9yX3QgYmxvY2ssIHJzZWN0OworCXNlY3Rvcl90IHNlY3RvciwgcnNlY3Q7CiAJY29uc3QgaW50IHJ3ID0gYmlvX2RhdGFfZGlyKGJpbyk7CiAJaW50IGNwdTsKIApAQCAtNDA3LDExICs0MDgsOSBAQAogCQkgICAgICBiaW9fc2VjdG9ycyhiaW8pKTsKIAlwYXJ0X3N0YXRfdW5sb2NrKCk7CiAKLQljaHVua19zaXplID0gbWRkZXYtPmNodW5rX3NpemUgPj4gMTA7CiAJY2h1bmtfc2VjdHMgPSBtZGRldi0+Y2h1bmtfc2l6ZSA+PiA5OwotCWNodW5rc2l6ZV9iaXRzID0gZmZ6KH5jaHVua19zaXplKTsKLQlibG9jayA9IGJpby0+Ymlfc2VjdG9yID4+IDE7Ci0JCisJY2h1bmtzZWN0X2JpdHMgPSBmZnoofmNodW5rX3NlY3RzKTsKKwlzZWN0b3IgPSBiaW8tPmJpX3NlY3RvcjsKIAogCWlmICh1bmxpa2VseShjaHVua19zZWN0cyA8IChiaW8tPmJpX3NlY3RvciAmIChjaHVua19zZWN0cyAtIDEpKSArIChiaW8tPmJpX3NpemUgPj4gOSkpKSB7CiAJCXN0cnVjdCBiaW9fcGFpciAqYnA7CkBAIC00MzQsMjggKzQzMywyNyBAQAogIAogCiAJewotCQlzZWN0b3JfdCB4ID0gYmxvY2sgPj4gY29uZi0+cHJlc2hpZnQ7Ci0JCXNlY3Rvcl9kaXYoeCwgKHUzMiljb25mLT5oYXNoX3NwYWNpbmcpOworCQlzZWN0b3JfdCB4ID0gc2VjdG9yID4+IGNvbmYtPnNlY3Rvcl9zaGlmdDsKKwkJc2VjdG9yX2Rpdih4LCAodTMyKWNvbmYtPnNwYWNpbmcpOwogCQl6b25lID0gY29uZi0+aGFzaF90YWJsZVt4XTsKIAl9Ci0gCi0Jd2hpbGUgKGJsb2NrID49ICh6b25lLT56b25lX29mZnNldCArIHpvbmUtPnNpemUpKSAKKworCXdoaWxlIChzZWN0b3IgPj0gem9uZS0+em9uZV9zdGFydCArIHpvbmUtPnNlY3RvcnMpCiAJCXpvbmUrKzsKLSAgICAKLQlzZWN0X2luX2NodW5rID0gYmlvLT5iaV9zZWN0b3IgJiAoKGNodW5rX3NpemU8PDEpIC0xKTsKKworCXNlY3RfaW5fY2h1bmsgPSBiaW8tPmJpX3NlY3RvciAmIChjaHVua19zZWN0cyAtIDEpOwogCiAKIAl7Ci0JCXNlY3Rvcl90IHggPSAgKGJsb2NrIC0gem9uZS0+em9uZV9vZmZzZXQpID4+IGNodW5rc2l6ZV9iaXRzOworCQlzZWN0b3JfdCB4ID0gKHNlY3RvciAtIHpvbmUtPnpvbmVfc3RhcnQpID4+IGNodW5rc2VjdF9iaXRzOwogCiAJCXNlY3Rvcl9kaXYoeCwgem9uZS0+bmJfZGV2KTsKIAkJY2h1bmsgPSB4OwogCi0JCXggPSBibG9jayA+PiBjaHVua3NpemVfYml0czsKKwkJeCA9IHNlY3RvciA+PiBjaHVua3NlY3RfYml0czsKIAkJdG1wX2RldiA9IHpvbmUtPmRldltzZWN0b3JfZGl2KHgsIHpvbmUtPm5iX2RldildOwogCX0KLQlyc2VjdCA9ICgoKGNodW5rIDw8IGNodW5rc2l6ZV9iaXRzKSArIHpvbmUtPmRldl9vZmZzZXQpPDwxKQotCQkrIHNlY3RfaW5fY2h1bms7CisJcnNlY3QgPSAoY2h1bmsgPDwgY2h1bmtzZWN0X2JpdHMpICsgem9uZS0+ZGV2X3N0YXJ0ICsgc2VjdF9pbl9jaHVuazsKICAKIAliaW8tPmJpX2JkZXYgPSB0bXBfZGV2LT5iZGV2OwogCWJpby0+Ymlfc2VjdG9yID0gcnNlY3QgKyB0bXBfZGV2LT5kYXRhX29mZnNldDsKQEAgLTQ2Nyw3ICs0NjUsNyBAQAogCiBiYWRfbWFwOgogCXByaW50aygicmFpZDBfbWFrZV9yZXF1ZXN0IGJ1ZzogY2FuJ3QgY29udmVydCBibG9jayBhY3Jvc3MgY2h1bmtzIgotCQkiIG9yIGJpZ2dlciB0aGFuICVkayAlbGx1ICVkXG4iLCBjaHVua19zaXplLCAKKwkJIiBvciBiaWdnZXIgdGhhbiAlZGsgJWxsdSAlZFxuIiwgY2h1bmtfc2VjdHMgLyAyLAogCQkodW5zaWduZWQgbG9uZyBsb25nKWJpby0+Ymlfc2VjdG9yLCBiaW8tPmJpX3NpemUgPj4gMTApOwogCiAJYmlvX2lvX2Vycm9yKGJpbyk7CkBAIC00OTIsMTAgKzQ5MCwxMCBAQAogCQkJc2VxX3ByaW50ZihzZXEsICIlcy8iLCBiZGV2bmFtZSgKIAkJCQljb25mLT5zdHJpcF96b25lW2pdLmRldltrXS0+YmRldixiKSk7CiAKLQkJc2VxX3ByaW50ZihzZXEsICJdIHpvPSVkIGRvPSVkIHM9JWRcbiIsCi0JCQkJY29uZi0+c3RyaXBfem9uZVtqXS56b25lX29mZnNldCwKLQkJCQljb25mLT5zdHJpcF96b25lW2pdLmRldl9vZmZzZXQsCi0JCQkJY29uZi0+c3RyaXBfem9uZVtqXS5zaXplKTsKKwkJc2VxX3ByaW50ZihzZXEsICJdIHpzPSVkIGRzPSVkIHM9JWRcbiIsCisJCQkJY29uZi0+c3RyaXBfem9uZVtqXS56b25lX3N0YXJ0LAorCQkJCWNvbmYtPnN0cmlwX3pvbmVbal0uZGV2X3N0YXJ0LAorCQkJCWNvbmYtPnN0cmlwX3pvbmVbal0uc2VjdG9ycyk7CiAJfQogI2VuZGlmCiAJc2VxX3ByaW50ZihzZXEsICIgJWRrIGNodW5rcyIsIG1kZGV2LT5jaHVua19zaXplLzEwMjQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkMS5jIGIvZHJpdmVycy9tZC9yYWlkMS5jCmluZGV4IDljNzg4ZTIuLjdiNGY1ZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvcmFpZDEuYworKysgYi9kcml2ZXJzL21kL3JhaWQxLmMKQEAgLTEwMTYsMTIgKzEwMTYsMTYgQEAKIAkgKiBlbHNlIG1hcmsgdGhlIGRyaXZlIGFzIGZhaWxlZAogCSAqLwogCWlmICh0ZXN0X2JpdChJbl9zeW5jLCAmcmRldi0+ZmxhZ3MpCi0JICAgICYmIChjb25mLT5yYWlkX2Rpc2tzIC0gbWRkZXYtPmRlZ3JhZGVkKSA9PSAxKQorCSAgICAmJiAoY29uZi0+cmFpZF9kaXNrcyAtIG1kZGV2LT5kZWdyYWRlZCkgPT0gMSkgewogCQkvKgogCQkgKiBEb24ndCBmYWlsIHRoZSBkcml2ZSwgYWN0IGFzIHRob3VnaCB3ZSB3ZXJlIGp1c3QgYQotCQkgKiBub3JtYWwgc2luZ2xlIGRyaXZlCisJCSAqIG5vcm1hbCBzaW5nbGUgZHJpdmUuCisJCSAqIEhvd2V2ZXIgZG9uJ3QgdHJ5IGEgcmVjb3ZlcnkgZnJvbSB0aGlzIGRyaXZlIGFzCisJCSAqIGl0IGlzIHZlcnkgbGlrZWx5IHRvIGZhaWwuCiAJCSAqLworCQltZGRldi0+cmVjb3ZlcnlfZGlzYWJsZWQgPSAxOwogCQlyZXR1cm47CisJfQogCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSW5fc3luYywgJnJkZXYtPmZsYWdzKSkgewogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmY29uZi0+ZGV2aWNlX2xvY2ssIGZsYWdzKTsKQEAgLTE5MTksNyArMTkyMyw2IEBACiAJaW50IGksIGosIGRpc2tfaWR4OwogCW1pcnJvcl9pbmZvX3QgKmRpc2s7CiAJbWRrX3JkZXZfdCAqcmRldjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAKIAlpZiAobWRkZXYtPmxldmVsICE9IDEpIHsKIAkJcHJpbnRrKCJyYWlkMTogJXM6IHJhaWQgbGV2ZWwgbm90IHNldCB0byBtaXJyb3JpbmcgKCVkKVxuIiwKQEAgLTE5NjQsNyArMTk2Nyw3IEBACiAJc3Bpbl9sb2NrX2luaXQoJmNvbmYtPmRldmljZV9sb2NrKTsKIAltZGRldi0+cXVldWUtPnF1ZXVlX2xvY2sgPSAmY29uZi0+ZGV2aWNlX2xvY2s7CiAKLQlyZGV2X2Zvcl9lYWNoKHJkZXYsIHRtcCwgbWRkZXYpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KSB7CiAJCWRpc2tfaWR4ID0gcmRldi0+cmFpZF9kaXNrOwogCQlpZiAoZGlza19pZHggPj0gbWRkZXYtPnJhaWRfZGlza3MKIAkJICAgIHx8IGRpc2tfaWR4IDwgMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDEwLmMgYi9kcml2ZXJzL21kL3JhaWQxMC5jCmluZGV4IDk3MGE5NmUuLjY3MzZkNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvcmFpZDEwLmMKKysrIGIvZHJpdmVycy9tZC9yYWlkMTAuYwpAQCAtMjAyNSw3ICsyMDI1LDYgQEAKIAlpbnQgaSwgZGlza19pZHg7CiAJbWlycm9yX2luZm9fdCAqZGlzazsKIAltZGtfcmRldl90ICpyZGV2OwotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKIAlpbnQgbmMsIGZjLCBmbzsKIAlzZWN0b3JfdCBzdHJpZGUsIHNpemU7CiAKQEAgLTIxMDgsNyArMjEwNyw3IEBACiAJc3Bpbl9sb2NrX2luaXQoJmNvbmYtPmRldmljZV9sb2NrKTsKIAltZGRldi0+cXVldWUtPnF1ZXVlX2xvY2sgPSAmY29uZi0+ZGV2aWNlX2xvY2s7CiAKLQlyZGV2X2Zvcl9lYWNoKHJkZXYsIHRtcCwgbWRkZXYpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KSB7CiAJCWRpc2tfaWR4ID0gcmRldi0+cmFpZF9kaXNrOwogCQlpZiAoZGlza19pZHggPj0gbWRkZXYtPnJhaWRfZGlza3MKIAkJICAgIHx8IGRpc2tfaWR4IDwgMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDUuYyBiL2RyaXZlcnMvbWQvcmFpZDUuYwppbmRleCBhMzZhNzQzLi5hNWJhMDgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL3JhaWQ1LmMKKysrIGIvZHJpdmVycy9tZC9yYWlkNS5jCkBAIC0zOTk4LDcgKzM5OTgsNiBAQAogCWludCByYWlkX2Rpc2ssIG1lbW9yeTsKIAltZGtfcmRldl90ICpyZGV2OwogCXN0cnVjdCBkaXNrX2luZm8gKmRpc2s7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wOwogCWludCB3b3JraW5nX2Rpc2tzID0gMDsKIAogCWlmIChtZGRldi0+bGV2ZWwgIT0gNSAmJiBtZGRldi0+bGV2ZWwgIT0gNCAmJiBtZGRldi0+bGV2ZWwgIT0gNikgewpAQCAtNDEwOCw3ICs0MTA3LDcgQEAKIAogCXByX2RlYnVnKCJyYWlkNTogcnVuKCVzKSBjYWxsZWQuXG4iLCBtZG5hbWUobWRkZXYpKTsKIAotCXJkZXZfZm9yX2VhY2gocmRldiwgdG1wLCBtZGRldikgeworCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpIHsKIAkJcmFpZF9kaXNrID0gcmRldi0+cmFpZF9kaXNrOwogCQlpZiAocmFpZF9kaXNrID49IGNvbmYtPnJhaWRfZGlza3MKIAkJICAgIHx8IHJhaWRfZGlzayA8IDApCkBAIC00NTMzLDcgKzQ1MzIsNiBAQAogewogCXJhaWQ1X2NvbmZfdCAqY29uZiA9IG1kZGV2X3RvX2NvbmYobWRkZXYpOwogCW1ka19yZGV2X3QgKnJkZXY7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcnRtcDsKIAlpbnQgc3BhcmVzID0gMDsKIAlpbnQgYWRkZWRfZGV2aWNlcyA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTQ1NDEsNyArNDUzOSw3IEBACiAJaWYgKHRlc3RfYml0KE1EX1JFQ09WRVJZX1JVTk5JTkcsICZtZGRldi0+cmVjb3ZlcnkpKQogCQlyZXR1cm4gLUVCVVNZOwogCi0JcmRldl9mb3JfZWFjaChyZGV2LCBydG1wLCBtZGRldikKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KQogCQlpZiAocmRldi0+cmFpZF9kaXNrIDwgMCAmJgogCQkgICAgIXRlc3RfYml0KEZhdWx0eSwgJnJkZXYtPmZsYWdzKSkKIAkJCXNwYXJlcysrOwpAQCAtNDU2Myw3ICs0NTYxLDcgQEAKIAkvKiBBZGQgc29tZSBuZXcgZHJpdmVzLCBhcyBtYW55IGFzIHdpbGwgZml0LgogCSAqIFdlIGtub3cgdGhlcmUgYXJlIGVub3VnaCB0byBtYWtlIHRoZSBuZXdseSBzaXplZCBhcnJheSB3b3JrLgogCSAqLwotCXJkZXZfZm9yX2VhY2gocmRldiwgcnRtcCwgbWRkZXYpCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkKIAkJaWYgKHJkZXYtPnJhaWRfZGlzayA8IDAgJiYKIAkJICAgICF0ZXN0X2JpdChGYXVsdHksICZyZGV2LT5mbGFncykpIHsKIAkJCWlmIChyYWlkNV9hZGRfZGlzayhtZGRldiwgcmRldikgPT0gMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTgyOTAuYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGE4MjkwLmMKaW5kZXggMGVlNzlmZC4uNGI4NjYyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTgyOTAuYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhODI5MC5jCkBAIC0xNTAsNyArMTUwLDcgQEAKIAl9CiB9CiAKLXN0cnVjdCB7CitzdGF0aWMgc3RydWN0IHsKIAl1bnNpZ25lZCBjaGFyIHNlcVsyXTsKIH0gZm1fbW9kZVtdID0gewogCXsgeyAweDAxLCAweDgxfSB9LAkvKiBQdXQgZGV2aWNlIGludG8gZXhwZXJ0IG1vZGUgKi8KQEAgLTIwNyw3ICsyMDcsNiBAQAogCW1zbGVlcCgxKTsKIAogCWlmIChwYXJhbXMtPm1vZGUgPT0gVjRMMl9UVU5FUl9SQURJTykgewotCQlpbnQgaTsKIAkJdW5zaWduZWQgY2hhciBkZWVtcGhhc2lzW10gID0geyAweDEzLCAxIH07CiAKIAkJLyogRklYTUU6IGFsbG93IHVzaW5nIGEgZGlmZmVyZW50IGRlZW1waGFzaXMgKi8KQEAgLTc2Nyw3ICs3NjYsOCBAQAogCWZlLT5vcHMuYW5hbG9nX29wcy5pbmZvLm5hbWUgPSBuYW1lOwogCiAJaWYgKHByaXYtPnZlciAmIFREQTgyOTApIHsKLQkJdGRhODI5MF9pbml0X3R1bmVyKGZlKTsKKwkJaWYgKHByaXYtPnZlciAmIChUREE4Mjc1IHwgVERBODI3NUEpKQorCQkJdGRhODI5MF9pbml0X3R1bmVyKGZlKTsKIAkJdGRhODI5MF9pbml0X2lmKGZlKTsKIAl9IGVsc2UgaWYgKHByaXYtPnZlciAmIFREQTgyOTUpCiAJCXRkYTgyOTVfaW5pdF9pZihmZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kbTExMDUvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvZHZiL2RtMTEwNS9LY29uZmlnCmluZGV4IDEzMzIzMDEuLjQzZjRkNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2RtMTEwNS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2RtMTEwNS9LY29uZmlnCkBAIC0xLDYgKzEsNyBAQAogY29uZmlnIERWQl9ETTExMDUKIAl0cmlzdGF0ZSAiU0RNQyBETTExMDUgYmFzZWQgUENJIGNhcmRzIgogCWRlcGVuZHMgb24gRFZCX0NPUkUgJiYgUENJICYmIEkyQworCWRlcGVuZHMgb24gSU5QVVQKIAlzZWxlY3QgRFZCX1BMTCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBEVkJfU1RWMDI5OSBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBEVkJfU1RWMDI4OCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuYwppbmRleCAxNzFmOWNhLi44NDM0MDc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuYwpAQCAtODI0LDcgKzgyNCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0cnVjdCBkdHZfY21kc19oIGR0dl9jbWRzW10gPSB7CitzdGF0aWMgc3RydWN0IGR0dl9jbWRzX2ggZHR2X2NtZHNbXSA9IHsKIAlbRFRWX1RVTkVdID0gewogCQkubmFtZQk9ICJEVFZfVFVORSIsCiAJCS5jbWQJPSBEVFZfVFVORSwKQEAgLTk2Miw3ICs5NjIsNyBAQAogCX0sCiB9OwogCi12b2lkIGR0dl9wcm9wZXJ0eV9kdW1wKHN0cnVjdCBkdHZfcHJvcGVydHkgKnR2cCkKK3N0YXRpYyB2b2lkIGR0dl9wcm9wZXJ0eV9kdW1wKHN0cnVjdCBkdHZfcHJvcGVydHkgKnR2cCkKIHsKIAlpbnQgaTsKIApAQCAtOTkzLDcgKzk5Myw3IEBACiAJCWRwcmludGsoIiVzKCkgdHZwLnUuZGF0YSA9IDB4JTA4eFxuIiwgX19mdW5jX18sIHR2cC0+dS5kYXRhKTsKIH0KIAotaW50IGlzX2xlZ2FjeV9kZWxpdmVyeV9zeXN0ZW0oZmVfZGVsaXZlcnlfc3lzdGVtX3QgcykKK3N0YXRpYyBpbnQgaXNfbGVnYWN5X2RlbGl2ZXJ5X3N5c3RlbShmZV9kZWxpdmVyeV9zeXN0ZW1fdCBzKQogewogCWlmKChzID09IFNZU19VTkRFRklORUQpIHx8IChzID09IFNZU19EVkJDX0FOTkVYX0FDKSB8fAogCSAgIChzID09IFNZU19EVkJDX0FOTkVYX0IpIHx8IChzID09IFNZU19EVkJUKSB8fCAocyA9PSBTWVNfRFZCUykgfHwKQEAgLTEwMDcsNyArMTAwNyw4IEBACiAgKiBkcml2ZXJzIGNhbiB1c2UgYSBzaW5nbGUgc2V0X2Zyb250ZW5kIHR1bmluZyBmdW5jdGlvbiwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyCiAgKiBpdCdzIGJlaW5nIHVzZWQgZm9yIHRoZSBsZWdhY3kgb3IgbmV3IEFQSSwgcmVkdWNpbmcgY29kZSBhbmQgY29tcGxleGl0eS4KICAqLwotdm9pZCBkdHZfcHJvcGVydHlfY2FjaGVfc3luYyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQorc3RhdGljIHZvaWQgZHR2X3Byb3BlcnR5X2NhY2hlX3N5bmMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJICAgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKIHsKIAlzdHJ1Y3QgZHR2X2Zyb250ZW5kX3Byb3BlcnRpZXMgKmMgPSAmZmUtPmR0dl9wcm9wZXJ0eV9jYWNoZTsKIApAQCAtMTA1OSw3ICsxMDYwLDcgQEAKIC8qIEVuc3VyZSB0aGUgY2FjaGVkIHZhbHVlcyBhcmUgc2V0IGNvcnJlY3RseSBpbiB0aGUgZnJvbnRlbmQKICAqIGxlZ2FjeSB0dW5pbmcgc3RydWN0dXJlcywgZm9yIHRoZSBhZHZhbmNlZCB0dW5pbmcgQVBJLgogICovCi12b2lkIGR0dl9wcm9wZXJ0eV9sZWdhY3lfcGFyYW1zX3N5bmMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCitzdGF0aWMgdm9pZCBkdHZfcHJvcGVydHlfbGVnYWN5X3BhcmFtc19zeW5jKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogewogCXN0cnVjdCBkdHZfZnJvbnRlbmRfcHJvcGVydGllcyAqYyA9ICZmZS0+ZHR2X3Byb3BlcnR5X2NhY2hlOwogCXN0cnVjdCBkdmJfZnJvbnRlbmRfcHJpdmF0ZSAqZmVwcml2ID0gZmUtPmZyb250ZW5kX3ByaXY7CkBAIC0xMTE0LDcgKzExMTUsNyBAQAogLyogRW5zdXJlIHRoZSBjYWNoZWQgdmFsdWVzIGFyZSBzZXQgY29ycmVjdGx5IGluIHRoZSBmcm9udGVuZAogICogbGVnYWN5IHR1bmluZyBzdHJ1Y3R1cmVzLCBmb3IgdGhlIGxlZ2FjeSB0dW5pbmcgQVBJLgogICovCi12b2lkIGR0dl9wcm9wZXJ0eV9hZHZfcGFyYW1zX3N5bmMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCitzdGF0aWMgdm9pZCBkdHZfcHJvcGVydHlfYWR2X3BhcmFtc19zeW5jKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogewogCXN0cnVjdCBkdHZfZnJvbnRlbmRfcHJvcGVydGllcyAqYyA9ICZmZS0+ZHR2X3Byb3BlcnR5X2NhY2hlOwogCXN0cnVjdCBkdmJfZnJvbnRlbmRfcHJpdmF0ZSAqZmVwcml2ID0gZmUtPmZyb250ZW5kX3ByaXY7CkBAIC0xMTQ5LDcgKzExNTAsNyBAQAogCX0KIH0KIAotdm9pZCBkdHZfcHJvcGVydHlfY2FjaGVfc3VibWl0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQorc3RhdGljIHZvaWQgZHR2X3Byb3BlcnR5X2NhY2hlX3N1Ym1pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKIHsKIAlzdHJ1Y3QgZHR2X2Zyb250ZW5kX3Byb3BlcnRpZXMgKmMgPSAmZmUtPmR0dl9wcm9wZXJ0eV9jYWNoZTsKIApAQCAtMTE4MCw4ICsxMTgxLDkgQEAKIHN0YXRpYyBpbnQgZHZiX2Zyb250ZW5kX2lvY3RsX3Byb3BlcnRpZXMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCQl1bnNpZ25lZCBpbnQgY21kLCB2b2lkICpwYXJnKTsKIAotaW50IGR0dl9wcm9wZXJ0eV9wcm9jZXNzX2dldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR0dl9wcm9wZXJ0eSAqdHZwLAotCXN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQorc3RhdGljIGludCBkdHZfcHJvcGVydHlfcHJvY2Vzc19nZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJICAgIHN0cnVjdCBkdHZfcHJvcGVydHkgKnR2cCwKKwkJCQkgICAgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJaW50IHIgPSAwOwogCkBAIC0xMjUzLDggKzEyNTUsMTAgQEAKIAlyZXR1cm4gcjsKIH0KIAotaW50IGR0dl9wcm9wZXJ0eV9wcm9jZXNzX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR0dl9wcm9wZXJ0eSAqdHZwLAotCXN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQorc3RhdGljIGludCBkdHZfcHJvcGVydHlfcHJvY2Vzc19zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJICAgIHN0cnVjdCBkdHZfcHJvcGVydHkgKnR2cCwKKwkJCQkgICAgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJaW50IHIgPSAwOwogCXN0cnVjdCBkdmJfZnJvbnRlbmRfcHJpdmF0ZSAqZmVwcml2ID0gZmUtPmZyb250ZW5kX3ByaXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfbmV0LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfbmV0LmMKaW5kZXggMDNmZDlkZC4uZjZiYTg0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX25ldC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9uZXQuYwpAQCAtMTI1LDcgKzEyNSw2IEBACiAKIHN0cnVjdCBkdmJfbmV0X3ByaXYgewogCWludCBpbl91c2U7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CiAJdTE2IHBpZDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0OwogCXN0cnVjdCBkdmJfbmV0ICpob3N0OwpAQCAtMzg0LDggKzM4Myw4IEBACiAJCQkJaWYgKHByaXYtPnVsZV9za2IpIHsKIAkJCQkJZGV2X2tmcmVlX3NrYiggcHJpdi0+dWxlX3NrYiApOwogCQkJCQkvKiBQcmVwYXJlIGZvciBuZXh0IFNORFUuICovCi0JCQkJCXByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOwotCQkJCQlwcml2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCQkJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQkJZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKIAkJCQl9CiAJCQkJcmVzZXRfdWxlKHByaXYpOwogCQkJCXByaXYtPm5lZWRfcHVzaSA9IDE7CkBAIC00MzgsOCArNDM3LDggQEAKIAkJCQkJZGV2X2tmcmVlX3NrYiggcHJpdi0+dWxlX3NrYiApOwogCQkJCQkvKiBQcmVwYXJlIGZvciBuZXh0IFNORFUuICovCiAJCQkJCS8vIHJlc2V0X3VsZShwcml2KTsgIG1vdmVkIHRvIGJlbG93LgotCQkJCQlwcml2LT5zdGF0cy5yeF9lcnJvcnMrKzsKLQkJCQkJcHJpdi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQkJCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJCWRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CiAJCQkJfQogCQkJCXJlc2V0X3VsZShwcml2KTsKIAkJCQkvKiBza2lwIHRvIG5leHQgUFVTSS4gKi8KQEAgLTQ2MCw4ICs0NTksOCBAQAogCQkJCQkJLyogRHJvcCBwYXJ0bHkgZGVjb2RlZCBTTkRVLCByZXNldCBzdGF0ZSwgcmVzeW5jIG9uIFBVU0kuICovCiAJCQkJCQlpZiAocHJpdi0+dWxlX3NrYikgewogCQkJCQkJCWRldl9rZnJlZV9za2IoIHByaXYtPnVsZV9za2IgKTsKLQkJCQkJCQlwcml2LT5zdGF0cy5yeF9lcnJvcnMrKzsKLQkJCQkJCQlwcml2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCQkJCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCQkJCWRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CiAJCQkJCQl9CiAJCQkJCQlyZXNldF91bGUocHJpdik7CiAJCQkJCQlwcml2LT5uZWVkX3B1c2kgPSAxOwpAQCAtNDc3LDggKzQ3Niw4IEBACiAJCQkJaWYgKHByaXYtPnVsZV9zbmR1X3JlbWFpbiA+IDE4MykgewogCQkJCQkvKiBDdXJyZW50IFNORFUgbGFja3MgbW9yZSBkYXRhIHRoYW4gdGhlcmUgY291bGQgYmUgYXZhaWxhYmxlIGluIHRoZQogCQkJCQkgKiBjdXJyZW50IFRTIGNlbGwuICovCi0JCQkJCXByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOwotCQkJCQlwcml2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQkJCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJCWRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOwogCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlbHU6IEV4cGVjdGVkICVkIG1vcmUgU05EVSBieXRlcywgYnV0ICIKIAkJCQkJICAgICAgICJnb3QgUFVTSSAocGYgJWQsIHRzX3JlbWFpbiAlZCkuICBGbHVzaGluZyBpbmNvbXBsZXRlIHBheWxvYWQuXG4iLAogCQkJCQkgICAgICAgcHJpdi0+dHNfY291bnQsIHByaXYtPnVsZV9zbmR1X3JlbWFpbiwgdHNbNF0sIHRzX3JlbWFpbik7CkBAIC01MjAsOCArNTE5LDggQEAKIAkJCQlpZiAocHJpdi0+dWxlX3NuZHVfbGVuIDwgNSkgewogCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlbHU6IEludmFsaWQgVUxFIFNORFUgbGVuZ3RoICV1LiAiCiAJCQkJCSAgICAgICAiUmVzeW5jaW5nLlxuIiwgcHJpdi0+dHNfY291bnQsIHByaXYtPnVsZV9zbmR1X2xlbik7Ci0JCQkJCXByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOwotCQkJCQlwcml2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQkJCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJCWRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOwogCQkJCQlwcml2LT51bGVfc25kdV9sZW4gPSAwOwogCQkJCQlwcml2LT5uZWVkX3B1c2kgPSAxOwogCQkJCQluZXdfdHMgPSAxOwpAQCAtNTczLDcgKzU3Miw3IEBACiAJCQlpZiAocHJpdi0+dWxlX3NrYiA9PSBOVUxMKSB7CiAJCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogTWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldC5cbiIsCiAJCQkJICAgICAgIGRldi0+bmFtZSk7Ci0JCQkJcHJpdi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCWRldi0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQkJCXJldHVybjsKIAkJCX0KIApAQCAtNjM3LDggKzYzNiw4IEBACiAJCQkJdWxlX2R1bXAgPSAxOwogI2VuZGlmCiAKLQkJCQlwcml2LT5zdGF0cy5yeF9lcnJvcnMrKzsKLQkJCQlwcml2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQkJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQlkZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKIAkJCQlkZXZfa2ZyZWVfc2tiKHByaXYtPnVsZV9za2IpOwogCQkJfSBlbHNlIHsKIAkJCQkvKiBDUkMzMiB2ZXJpZmllZCBPSy4gKi8KQEAgLTc0NCw4ICs3NDMsOCBAQAogCQkJCSAqIHJlY2VpdmUgdGhlIHBhY2tldCBhbnlob3cuICovCiAJCQkJLyogaWYgKHByaXYtPnVsZV9kYml0ICYmIHNrYi0+cGt0X3R5cGUgPT0gUEFDS0VUX09USEVSSE9TVCkKIAkJCQkJcHJpdi0+dWxlX3NrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsgKi8KLQkJCQlwcml2LT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0JCQkJcHJpdi0+c3RhdHMucnhfYnl0ZXMgKz0gcHJpdi0+dWxlX3NrYi0+bGVuOworCQkJCWRldi0+c3RhdHMucnhfcGFja2V0cysrOworCQkJCWRldi0+c3RhdHMucnhfYnl0ZXMgKz0gcHJpdi0+dWxlX3NrYi0+bGVuOwogCQkJCW5ldGlmX3J4KHByaXYtPnVsZV9za2IpOwogCQkJfQogCQkJc25kdV9kb25lOgpAQCAtODAwLDggKzc5OSw3IEBACiB7CiAJdTggKmV0aDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9Ci0JCSYoKHN0cnVjdCBkdmJfbmV0X3ByaXYgKikgbmV0ZGV2X3ByaXYoZGV2KSktPnN0YXRzOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZkZXYtPnN0YXRzOwogCWludCBzbmFwID0gMDsKIAogCS8qIG5vdGU6IHBrdF9sZW4gaW5jbHVkZXMgYSAzMmJpdCBjaGVja3N1bSAqLwpAQCAtMTIxNiwyOCArMTIxNCwyOSBAQAogCXJldHVybiBkdmJfbmV0X2ZlZWRfc3RvcChkZXYpOwogfQogCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKiBkdmJfbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXJldHVybiAmKChzdHJ1Y3QgZHZiX25ldF9wcml2ICopIG5ldGRldl9wcml2KGRldikpLT5zdGF0czsKLX0KLQogc3RhdGljIGNvbnN0IHN0cnVjdCBoZWFkZXJfb3BzIGR2Yl9oZWFkZXJfb3BzID0gewogCS5jcmVhdGUJCT0gZXRoX2hlYWRlciwKIAkucGFyc2UJCT0gZXRoX2hlYWRlcl9wYXJzZSwKIAkucmVidWlsZAk9IGV0aF9yZWJ1aWxkX2hlYWRlciwKIH07CiAKKworc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBkdmJfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gZHZiX25ldF9vcGVuLAorCS5uZG9fc3RvcAkJPSBkdmJfbmV0X3N0b3AsCisJLm5kb19zdGFydF94bWl0CQk9IGR2Yl9uZXRfdHgsCisJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBkdmJfbmV0X3NldF9tdWx0aWNhc3RfbGlzdCwKKwkubmRvX3NldF9tYWNfYWRkcmVzcyAgICA9IGR2Yl9uZXRfc2V0X21hYywKKwkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCit9OworCiBzdGF0aWMgdm9pZCBkdmJfbmV0X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJZXRoZXJfc2V0dXAoZGV2KTsKIAogCWRldi0+aGVhZGVyX29wcwkJPSAmZHZiX2hlYWRlcl9vcHM7Ci0JZGV2LT5vcGVuCQk9IGR2Yl9uZXRfb3BlbjsKLQlkZXYtPnN0b3AJCT0gZHZiX25ldF9zdG9wOwotCWRldi0+aGFyZF9zdGFydF94bWl0CT0gZHZiX25ldF90eDsKLQlkZXYtPmdldF9zdGF0cwkJPSBkdmJfbmV0X2dldF9zdGF0czsKLQlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IGR2Yl9uZXRfc2V0X211bHRpY2FzdF9saXN0OwotCWRldi0+c2V0X21hY19hZGRyZXNzICAgID0gZHZiX25ldF9zZXRfbWFjOworCWRldi0+bmV0ZGV2X29wcwkJPSAmZHZiX25ldGRldl9vcHM7CiAJZGV2LT5tdHUJCT0gNDA5NjsKIAlkZXYtPm1jX2NvdW50ICAgICAgICAgICA9IDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2YmRldi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiZGV2LmMKaW5kZXggNjVkNjk2Ni4uNmEzMjY4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiZGV2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiZGV2LmMKQEAgLTc5LDYgKzc5LDEwIEBACiAJCWZpbGUtPnByaXZhdGVfZGF0YSA9IGR2YmRldjsKIAkJb2xkX2ZvcHMgPSBmaWxlLT5mX29wOwogCQlmaWxlLT5mX29wID0gZm9wc19nZXQoZHZiZGV2LT5mb3BzKTsKKwkJaWYgKGZpbGUtPmZfb3AgPT0gTlVMTCkgeworCQkJZmlsZS0+Zl9vcCA9IG9sZF9mb3BzOworCQkJZ290byBmYWlsOworCQl9CiAJCWlmKGZpbGUtPmZfb3AtPm9wZW4pCiAJCQllcnIgPSBmaWxlLT5mX29wLT5vcGVuKGlub2RlLGZpbGUpOwogCQlpZiAoZXJyKSB7CkBAIC05MCw2ICs5NCw3IEBACiAJCXVubG9ja19rZXJuZWwoKTsKIAkJcmV0dXJuIGVycjsKIAl9CitmYWlsOgogCXVwX3JlYWQoJm1pbm9yX3J3c2VtKTsKIAl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FueXNlZS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hbnlzZWUuYwppbmRleCA1MDE3ZjA4Li5jNmU3YjQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FueXNlZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYW55c2VlLmMKQEAgLTQxLDcgKzQxLDcgQEAKIHN0YXRpYyBpbnQgZHZiX3VzYl9hbnlzZWVfZGVidWc7CiBtb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIGR2Yl91c2JfYW55c2VlX2RlYnVnLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgInNldCBkZWJ1Z2dpbmcgbGV2ZWwiIERWQl9VU0JfREVCVUdfU1RBVFVTKTsKLWludCBkdmJfdXNiX2FueXNlZV9kZWxzeXM7CitzdGF0aWMgaW50IGR2Yl91c2JfYW55c2VlX2RlbHN5czsKIG1vZHVsZV9wYXJhbV9uYW1lZChkZWxzeXMsIGR2Yl91c2JfYW55c2VlX2RlbHN5cywgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZGVsc3lzLCAic2VsZWN0IGRlbGl2ZXJ5IG1vZGUgKDA9RFZCLUMsIDE9RFZCLVQpIik7CiBEVkJfREVGSU5FX01PRF9PUFRfQURBUFRFUl9OUihhZGFwdGVyX25yKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTE2LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDExNi5jCmluZGV4IDRmNTE0ZDMuLjI4YWQ2MDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTE2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTYuYwpAQCAtMzY5LDcgKzM2OSw3IEBACiAgKiBOb3QgYWxsIFMyIG1tb2R1bGF0aW9uIHNjaGVtZXMgYXJlIHN1cHBvcnQgYW5kIG5vdCBhbGwgcmF0ZXMgd2l0aAogICogYSBzY2hlbWUgYXJlIHN1cHBvcnQuIEVzcGVjaWFsbHksIG5vIGF1dG8gZGV0ZWN0IHdoZW4gaW4gUzIgbW9kZS4KICAqLwotc3RydWN0IGN4MjQxMTZfbW9kZmVjIHsKK3N0YXRpYyBzdHJ1Y3QgY3gyNDExNl9tb2RmZWMgewogCWZlX2RlbGl2ZXJ5X3N5c3RlbV90IGRlbGl2ZXJ5X3N5c3RlbTsKIAlmZV9tb2R1bGF0aW9uX3QgbW9kdWxhdGlvbjsKIAlmZV9jb2RlX3JhdGVfdCBmZWM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdkdDMzMDQuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ2R0MzMwNC5jCmluZGV4IDQ2OWFjZTUuLjNiYjBjNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ2R0MzMwNC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ2R0MzMwNC5jCkBAIC00Miw3ICs0Miw3IEBACiAKIAlmb3IgKGk9MDsgaTxsZW4tMTsgaSs9Myl7CiAJCWlmKChlcnIgPSBpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYywgJmkyY21zZ3MsIDEpKTwwKSB7Ci0JCQlwcmludGsoIiVzIGkyY190cmFuc2ZlciBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCBlcnIpOworCQkJcHJpbnRrKCIlcyBpMmNfdHJhbnNmZXIgZXJyb3IgJWRcbiIsIF9fZnVuY19fLCBlcnIpOwogCQkJaWYgKGVyciA8IDApCiAJCQkJcmV0dXJuIGVycjsKIAkJCWVsc2UKQEAgLTczLDcgKzczLDcgQEAKIAlpMmNtc2dzWzFdLmJ1ZiA9ICZidWY7CiAKIAlpZigocmV0ID0gaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsIGkyY21zZ3MsIDIpKTwwKSB7Ci0JCXByaW50aygiJXMgaTJjX3RyYW5zZmVyIGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJldCk7CisJCXByaW50aygiJXMgaTJjX3RyYW5zZmVyIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTk0LDcgKzk0LDcgQEAKIAl9OwogCXJldCA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCAmaTJjbXNncywgMSk7CiAJaWYgKHJldCAhPSAxKSB7Ci0JCXByaW50aygiJXMgaTJjX3RyYW5zZmVyIGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJldCk7CisJCXByaW50aygiJXMgaTJjX3RyYW5zZmVyIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTIzOCw3ICsyMzgsNyBAQAogCQl9CiAKIAkJaWYgKGVycikgewotCQkJcHJpbnRrKCIlcyBlcnJvciBzZXR0aW5nIG1vZHVsYXRpb25cbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlwcmludGsoIiVzIGVycm9yIHNldHRpbmcgbW9kdWxhdGlvblxuIiwgX19mdW5jX18pOwogCQl9IGVsc2UgewogCQkJc3RhdGUtPmN1cnJlbnRfbW9kdWxhdGlvbiA9IHBhcmFtLT51LnZzYi5tb2R1bGF0aW9uOwogCQl9CkBAIC0zMDUsNyArMzA1LDcgQEAKIAkJfQogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoIiVzIHVuaGFuZGxlZCBtb2R1bGF0aW9uXG4iLCBfX0ZVTkNUSU9OX18pOworCQlwcmludGsoIiVzIHVuaGFuZGxlZCBtb2R1bGF0aW9uXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zOTIxX21vZHVsZS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M5MjFfbW9kdWxlLmMKaW5kZXggM2NiYjljYi4uODkyYWY4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M5MjFfbW9kdWxlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M5MjFfbW9kdWxlLmMKQEAgLTEzNiw3ICsxMzYsNyBAQAogCX07CiAKIAlpZigoZXJyID0gaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsICZpMmNtc2dzLCAxKSk8MCkgewotCQlwcmludGsoIiVzIGkyY190cmFuc2ZlciBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCBlcnIpOworCQlwcmludGsoIiVzIGkyY190cmFuc2ZlciBlcnJvciAlZFxuIiwgX19mdW5jX18sIGVycik7CiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKIAkJZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0YjA4OTlfYWxnby5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0YjA4OTlfYWxnby5jCmluZGV4IGNlZDliN2EuLjgzZGM3ZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdGIwODk5X2FsZ28uYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3RiMDg5OV9hbGdvLmMKQEAgLTU0LDcgKzU0LDcgQEAKICAqIHN0YjA4OTlfZ2V0X3NyYXRlCiAgKiBHZXQgdGhlIGN1cnJlbnQgc3ltYm9sIHJhdGUKICAqLwotdTMyIHN0YjA4OTlfZ2V0X3NyYXRlKHN0cnVjdCBzdGIwODk5X3N0YXRlICpzdGF0ZSkKK3N0YXRpYyB1MzIgc3RiMDg5OV9nZXRfc3JhdGUoc3RydWN0IHN0YjA4OTlfc3RhdGUgKnN0YXRlKQogewogCXN0cnVjdCBzdGIwODk5X2ludGVybmFsICppbnRlcm5hbCA9ICZzdGF0ZS0+aW50ZXJuYWw7CiAJdTggc2ZyWzNdOwpAQCAtNzYzLDcgKzc2Myw3IEBACiAJc3RiMDg5OV93cml0ZV9zMnJlZyhzdGF0ZSwgU1RCMDg5OV9TMkRFTU9ELCBTVEIwODk5X0JBU0VfQ1NNX0NOVFJMMSwgU1RCMDg5OV9PRkYwX0NTTV9DTlRSTDEsIHJlZyk7CiB9CiAKLWxvbmcgTG9nMkludChpbnQgbnVtYmVyKQorc3RhdGljIGxvbmcgTG9nMkludChpbnQgbnVtYmVyKQogewogCWludCBpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3RiMDg5OV9kcnYuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdGIwODk5X2Rydi5jCmluZGV4IGJlZTI4ZjcuLjEwNjEzYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdGIwODk5X2Rydi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdGIwODk5X2Rydi5jCkBAIC0xMzQsNyArMTM0LDcgQEAKIH07CiAKIC8qIERWQi1TMiBFcy9OMCBxdWFudCBpbiBkQi8xMDAgdnMgcmVhZCB2YWx1ZSAqIDEwMCovCi1zdHJ1Y3Qgc3RiMDg5OV90YWIgc3RiMDg5OV9xdWFudF90YWJbXSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc3RiMDg5OV90YWIgc3RiMDg5OV9xdWFudF90YWJbXSA9IHsKIAl7ICAgIDAsCSAgICAwIH0sCiAJeyAgICAwLAkgIDEwMCB9LAogCXsgIDYwMCwJICAyMDAgfSwKQEAgLTE3Nyw3ICsxNzcsNyBAQAogfTsKIAogLyogRFZCLVMyIEVzL04wIGVzdGltYXRlIGluIGRCLzEwMCB2cyByZWFkIHZhbHVlICovCi1zdHJ1Y3Qgc3RiMDg5OV90YWIgc3RiMDg5OV9lc3RfdGFiW10gPSB7CitzdGF0aWMgc3RydWN0IHN0YjA4OTlfdGFiIHN0YjA4OTlfZXN0X3RhYltdID0gewogCXsgICAgMCwJICAgICAwIH0sCiAJeyAgICAwLAkgICAgIDEgfSwKIAl7ICAzMDEsCSAgICAgMiB9LApAQCAtMjE3LDcgKzIxNyw3IEBACiAJeyA1NzIxLAk1MjYwMTcgfSwKIH07CiAKLWludCBfc3RiMDg5OV9yZWFkX3JlZyhzdHJ1Y3Qgc3RiMDg5OV9zdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIGludCByZWcpCitzdGF0aWMgaW50IF9zdGIwODk5X3JlYWRfcmVnKHN0cnVjdCBzdGIwODk5X3N0YXRlICpzdGF0ZSwgdW5zaWduZWQgaW50IHJlZykKIHsKIAlpbnQgcmV0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY2kuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1jaS5jCmluZGV4IDM1MDc0NjMuLmJjYmM1ZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1jaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1jaS5jCkBAIC0xMzM3LDcgKzEzMzcsNyBAQAogCS50dW5lcl9zZXRfcmZzaWdnYWluCT0gTlVMTAogfTsKIAotc3RydWN0IHN0YjYxMDBfY29uZmlnIHR0MzIwMF9zdGI2MTAwX2NvbmZpZyA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc3RiNjEwMF9jb25maWcgdHQzMjAwX3N0YjYxMDBfY29uZmlnID0gewogCS50dW5lcl9hZGRyZXNzCT0gMHg2MCwKIAkucmVmY2xvY2sJPSAyNzAwMDAwMCwKIH07CkBAIC0xNDUwLDcgKzE0NTAsNyBAQAogCQlpZiAoYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kKSB7CiAJCQlpZiAoZHZiX2F0dGFjaChzdGI2MTAwX2F0dGFjaCwgYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kLCAmdHQzMjAwX3N0YjYxMDBfY29uZmlnLCAmYnVkZ2V0X2NpLT5idWRnZXQuaTJjX2FkYXApKSB7CiAJCQkJaWYgKCFkdmJfYXR0YWNoKGxuYnAyMV9hdHRhY2gsIGJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCwgJmJ1ZGdldF9jaS0+YnVkZ2V0LmkyY19hZGFwLCAwLCAwKSkgewotCQkJCQlwcmludGsoIiVzOiBObyBMTkJQMjEgZm91bmQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJCQlwcmludGsoIiVzOiBObyBMTkJQMjEgZm91bmQhXG4iLCBfX2Z1bmNfXyk7CiAJCQkJCWR2Yl9mcm9udGVuZF9kZXRhY2goYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kKTsKIAkJCQkJYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kID0gTlVMTDsKIAkJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NhZmVfY2NpYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jYWZlX2NjaWMuYwppbmRleCAzNGEzOWQyLi40NmZkNTczIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NhZmVfY2NpYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY2FmZV9jY2ljLmMKQEAgLTU2OSw3ICs1NjksNiBAQAogCiAJY2FmZV9zbWJ1c19lbmFibGVfaXJxKGNhbSk7CiAJYWRhcC0+aWQgPSBJMkNfSFdfU01CVVNfQ0FGRTsKLQlhZGFwLT5jbGFzcyA9IEkyQ19DTEFTU19DQU1fRElHSVRBTDsKIAlhZGFwLT5vd25lciA9IFRISVNfTU9EVUxFOwogCWFkYXAtPmNsaWVudF9yZWdpc3RlciA9IGNhZmVfc21idXNfYXR0YWNoOwogCWFkYXAtPmNsaWVudF91bnJlZ2lzdGVyID0gY2FmZV9zbWJ1c19kZXRhY2g7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9LY29uZmlnCmluZGV4IGIwZjgzNzUuLjJkMjUwYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9LY29uZmlnCkBAIC02OSw2ICs2OSwxMSBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgY3g4OC1kdmIuCiAKK2NvbmZpZyBWSURFT19DWDg4X01QRUcKKwl0cmlzdGF0ZQorCWRlcGVuZHMgb24gVklERU9fQ1g4OF9EVkIgfHwgVklERU9fQ1g4OF9CTEFDS0JJUkQKKwlkZWZhdWx0IHkKKwogY29uZmlnIFZJREVPX0NYODhfVlAzMDU0CiAJdHJpc3RhdGUgIlZQLTMwNTQgU2Vjb25kYXJ5IEkyQyBCdXMgU3VwcG9ydCIKIAlkZWZhdWx0IG0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9NYWtlZmlsZQppbmRleCA2ZWMzMGYyLi5iMDZiMTI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L01ha2VmaWxlCkBAIC0zLDcgKzMsOCBAQAogY3g4ODAwLW9ianMJOj0gY3g4OC12aWRlby5vIGN4ODgtdmJpLm8KIGN4ODgwMi1vYmpzCTo9IGN4ODgtbXBlZy5vCiAKLW9iai0kKENPTkZJR19WSURFT19DWDg4KSArPSBjeDg4eHgubyBjeDg4MDAubyBjeDg4MDIubworb2JqLSQoQ09ORklHX1ZJREVPX0NYODgpICs9IGN4ODh4eC5vIGN4ODgwMC5vCitvYmotJChDT05GSUdfVklERU9fQ1g4OF9NUEVHKSArPSBjeDg4MDIubwogb2JqLSQoQ09ORklHX1ZJREVPX0NYODhfQUxTQSkgKz0gY3g4OC1hbHNhLm8KIG9iai0kKENPTkZJR19WSURFT19DWDg4X0JMQUNLQklSRCkgKz0gY3g4OC1ibGFja2JpcmQubwogb2JqLSQoQ09ORklHX1ZJREVPX0NYODhfRFZCKSArPSBjeDg4LWR2Yi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1kdmIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jCmluZGV4IGRhNGRkNDkuLjYxM2RmZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jCkBAIC0xMzgsNiArMTM4LDI4IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgY3g4OF9kdmJfZ2F0ZV9jdHJsKHN0cnVjdCBjeDg4X2NvcmUgICpjb3JlLCBpbnQgb3BlbikKK3sKKwlzdHJ1Y3QgdmlkZW9idWZfZHZiX2Zyb250ZW5kcyAqZjsKKwlzdHJ1Y3QgdmlkZW9idWZfZHZiX2Zyb250ZW5kICpmZTsKKworCWlmICghY29yZS0+ZHZiZGV2KQorCQlyZXR1cm47CisKKwlmID0gJmNvcmUtPmR2YmRldi0+ZnJvbnRlbmRzOworCisJaWYgKCFmKQorCQlyZXR1cm47CisKKwlpZiAoZi0+Z2F0ZSA8PSAxKSAvKiB1bmRlZmluZWQgb3IgZmUwICovCisJCWZlID0gdmlkZW9idWZfZHZiX2dldF9mcm9udGVuZChmLCAxKTsKKwllbHNlCisJCWZlID0gdmlkZW9idWZfZHZiX2dldF9mcm9udGVuZChmLCBmLT5nYXRlKTsKKworCWlmIChmZSAmJiBmZS0+ZHZiLmZyb250ZW5kICYmIGZlLT5kdmIuZnJvbnRlbmQtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+ZHZiLmZyb250ZW5kLT5vcHMuaTJjX2dhdGVfY3RybChmZS0+ZHZiLmZyb250ZW5kLCBvcGVuKTsKK30KKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIHN0YXRpYyBpbnQgZHZpY29fZnVzaW9uaGR0dl9kZW1vZF9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQpAQCAtNTk3LDEyICs2MTksMzAgQEAKIAlzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlID0gZGV2LT5jb3JlOwogCXN0cnVjdCB2aWRlb2J1Zl9kdmJfZnJvbnRlbmQgKmZlMCwgKmZlMSA9IE5VTEw7CiAJaW50IG1mZV9zaGFyZWQgPSAwOyAvKiBidXMgbm90IHNoYXJlZCBieSBkZWZhdWx0ICovCisJaW50IGk7CiAKIAlpZiAoMCAhPSBjb3JlLT5pMmNfcmMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlcy8yOiBubyBpMmMtYnVzIGF2YWlsYWJsZSwgY2Fubm90IGF0dGFjaCBkdmIgZHJpdmVyc1xuIiwgY29yZS0+bmFtZSk7CiAJCWdvdG8gZnJvbnRlbmRfZGV0YWNoOwogCX0KIAorCWlmICghY29yZS0+Ym9hcmQubnVtX2Zyb250ZW5kcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9pbml0KCZkZXYtPmZyb250ZW5kcy5sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmZGV2LT5mcm9udGVuZHMuZmVsaXN0KTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzKCkgYWxsb2NhdGluZyAlZCBmcm9udGVuZChzKVxuIiwgX19mdW5jX18sCisJCQkgY29yZS0+Ym9hcmQubnVtX2Zyb250ZW5kcyk7CisJZm9yIChpID0gMTsgaSA8PSBjb3JlLT5ib2FyZC5udW1fZnJvbnRlbmRzOyBpKyspIHsKKwkJZmUwID0gdmlkZW9idWZfZHZiX2FsbG9jX2Zyb250ZW5kKCZkZXYtPmZyb250ZW5kcywgaSk7CisJCWlmICghZmUwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzKCkgZmFpbGVkIHRvIGFsbG9jXG4iLCBfX2Z1bmNfXyk7CisJCQl2aWRlb2J1Zl9kdmJfZGVhbGxvY19mcm9udGVuZHMoJmRldi0+ZnJvbnRlbmRzKTsKKwkJCWdvdG8gZnJvbnRlbmRfZGV0YWNoOworCQl9CisJfQorCiAJLyogR2V0IHRoZSBmaXJzdCBmcm9udGVuZCAqLwogCWZlMCA9IHZpZGVvYnVmX2R2Yl9nZXRfZnJvbnRlbmQoJmRldi0+ZnJvbnRlbmRzLCAxKTsKIAlpZiAoIWZlMCkKQEAgLTYxMSw2ICs2NTEsOSBAQAogCS8qIG11bHRpLWZyb250ZW5kIGdhdGUgY29udHJvbCBpcyB1bmRlZmluZWQgb3IgZGVmYXVsdHMgdG8gZmUwICovCiAJZGV2LT5mcm9udGVuZHMuZ2F0ZSA9IDA7CiAKKwkvKiBTZXRzIHRoZSBnYXRlIGNvbnRyb2wgY2FsbGJhY2sgdG8gYmUgdXNlZCBieSBpMmMgY29tbWFuZCBjYWxscyAqLworCWNvcmUtPmdhdGVfY3RybCA9IGN4ODhfZHZiX2dhdGVfY3RybDsKKwogCS8qIGluaXQgZnJvbnRlbmQocykgKi8KIAlzd2l0Y2ggKGNvcmUtPmJvYXJkbnIpIHsKIAljYXNlIENYODhfQk9BUkRfSEFVUFBBVUdFX0RWQl9UMToKQEAgLTExMDksNiArMTE1Miw3IEBACiAJCSZkZXYtPnBjaS0+ZGV2LCBhZGFwdGVyX25yLCBtZmVfc2hhcmVkKTsKIAogZnJvbnRlbmRfZGV0YWNoOgorCWNvcmUtPmdhdGVfY3RybCA9IE5VTEw7CiAJdmlkZW9idWZfZHZiX2RlYWxsb2NfZnJvbnRlbmRzKCZkZXYtPmZyb250ZW5kcyk7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CkBAIC0xMjcwLDYgKzEzMTQsOCBAQAogCiAJdnAzMDU0X2kyY19yZW1vdmUoZGV2KTsKIAorCWNvcmUtPmdhdGVfY3RybCA9IE5VTEw7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pMmMuYwppbmRleCAxYWI2OTFkLi5jMGZmMjMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pMmMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pMmMuYwpAQCAtMTE2LDMwICsxMTYsMTYgQEAKIAogdm9pZCBjeDg4X2NhbGxfaTJjX2NsaWVudHMoc3RydWN0IGN4ODhfY29yZSAqY29yZSwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQogewotI2lmIGRlZmluZWQoQ09ORklHX1ZJREVPX0NYODhfRFZCKSB8fCBkZWZpbmVkKENPTkZJR19WSURFT19DWDg4X0RWQl9NT0RVTEUpCi0Jc3RydWN0IHZpZGVvYnVmX2R2Yl9mcm9udGVuZHMgKmYgPSAmY29yZS0+ZHZiZGV2LT5mcm9udGVuZHM7Ci0Jc3RydWN0IHZpZGVvYnVmX2R2Yl9mcm9udGVuZCAqZmUgPSBOVUxMOwotI2VuZGlmCiAJaWYgKDAgIT0gY29yZS0+aTJjX3JjKQogCQlyZXR1cm47CiAKLSNpZiBkZWZpbmVkKENPTkZJR19WSURFT19DWDg4X0RWQikgfHwgZGVmaW5lZChDT05GSUdfVklERU9fQ1g4OF9EVkJfTU9EVUxFKQotCWlmIChjb3JlLT5kdmJkZXYgJiYgZikgewotCQlpZihmLT5nYXRlIDw9IDEpIC8qIHVuZGVmaW5lZCBvciBmZTAgKi8KLQkJCWZlID0gdmlkZW9idWZfZHZiX2dldF9mcm9udGVuZChmLCAxKTsKLQkJZWxzZQotCQkJZmUgPSB2aWRlb2J1Zl9kdmJfZ2V0X2Zyb250ZW5kKGYsIGYtPmdhdGUpOworCWlmIChjb3JlLT5nYXRlX2N0cmwpCisJCWNvcmUtPmdhdGVfY3RybChjb3JlLCAxKTsKIAotCQlpZiAoZmUgJiYgZmUtPmR2Yi5mcm9udGVuZCAmJiBmZS0+ZHZiLmZyb250ZW5kLT5vcHMuaTJjX2dhdGVfY3RybCkKLQkJCWZlLT5kdmIuZnJvbnRlbmQtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLT5kdmIuZnJvbnRlbmQsIDEpOworCWkyY19jbGllbnRzX2NvbW1hbmQoJmNvcmUtPmkyY19hZGFwLCBjbWQsIGFyZyk7CiAKLQkJaTJjX2NsaWVudHNfY29tbWFuZCgmY29yZS0+aTJjX2FkYXAsIGNtZCwgYXJnKTsKLQotCQlpZiAoZmUgJiYgZmUtPmR2Yi5mcm9udGVuZCAmJiBmZS0+ZHZiLmZyb250ZW5kLT5vcHMuaTJjX2dhdGVfY3RybCkKLQkJCWZlLT5kdmIuZnJvbnRlbmQtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLT5kdmIuZnJvbnRlbmQsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JCWkyY19jbGllbnRzX2NvbW1hbmQoJmNvcmUtPmkyY19hZGFwLCBjbWQsIGFyZyk7CisJaWYgKGNvcmUtPmdhdGVfY3RybCkKKwkJY29yZS0+Z2F0ZV9jdHJsKGNvcmUsIDApOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhIGN4ODgwMF9pMmNfYWxnb190ZW1wbGF0ZSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LW1wZWcuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LW1wZWcuYwppbmRleCA1OTE2NGZjLi5iMjk1Yjc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1tcGVnLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtbXBlZy5jCkBAIC03ODcsNiArNzg3LDkgQEAKIAlkZXYtPnBjaSA9IHBjaV9kZXY7CiAJZGV2LT5jb3JlID0gY29yZTsKIAorCS8qIE1haW50YWluIGEgcmVmZXJlbmNlIHNvIGN4ODgtdmlkZW8gY2FuIHF1ZXJ5IHRoZSA4ODAyIGRldmljZS4gKi8KKwljb3JlLT5kdmJkZXYgPSBkZXY7CisKIAllcnIgPSBjeDg4MDJfaW5pdF9jb21tb24oZGV2KTsKIAlpZiAoZXJyICE9IDApCiAJCWdvdG8gZmFpbF9mcmVlOwpAQCAtNzk0LDMyICs3OTcsNiBAQAogCUlOSVRfTElTVF9IRUFEKCZkZXYtPmRydmxpc3QpOwogCWxpc3RfYWRkX3RhaWwoJmRldi0+ZGV2bGlzdCwmY3g4ODAyX2Rldmxpc3QpOwogCi0jaWYgZGVmaW5lZChDT05GSUdfVklERU9fQ1g4OF9EVkIpIHx8IGRlZmluZWQoQ09ORklHX1ZJREVPX0NYODhfRFZCX01PRFVMRSkKLQltdXRleF9pbml0KCZkZXYtPmZyb250ZW5kcy5sb2NrKTsKLQlJTklUX0xJU1RfSEVBRCgmZGV2LT5mcm9udGVuZHMuZmVsaXN0KTsKLQotCWlmIChjb3JlLT5ib2FyZC5udW1fZnJvbnRlbmRzKSB7Ci0JCXN0cnVjdCB2aWRlb2J1Zl9kdmJfZnJvbnRlbmQgKmZlOwotCQlpbnQgaTsKLQotCQlwcmludGsoS0VSTl9JTkZPICIlcygpIGFsbG9jYXRpbmcgJWQgZnJvbnRlbmQocylcbiIsIF9fZnVuY19fLAotCQkJY29yZS0+Ym9hcmQubnVtX2Zyb250ZW5kcyk7Ci0JCWZvciAoaSA9IDE7IGkgPD0gY29yZS0+Ym9hcmQubnVtX2Zyb250ZW5kczsgaSsrKSB7Ci0JCQlmZSA9IHZpZGVvYnVmX2R2Yl9hbGxvY19mcm9udGVuZCgmZGV2LT5mcm9udGVuZHMsIGkpOwotCQkJaWYoZmUgPT0gTlVMTCkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiJXMoKSBmYWlsZWQgdG8gYWxsb2NcbiIsCi0JCQkJCV9fZnVuY19fKTsKLQkJCQl2aWRlb2J1Zl9kdmJfZGVhbGxvY19mcm9udGVuZHMoJmRldi0+ZnJvbnRlbmRzKTsKLQkJCQllcnIgPSAtRU5PTUVNOwotCQkJCWdvdG8gZmFpbF9mcmVlOwotCQkJfQotCQl9Ci0JfQotI2VuZGlmCi0KLQkvKiBNYWludGFpbiBhIHJlZmVyZW5jZSBzbyBjeDg4LXZpZGVvIGNhbiBxdWVyeSB0aGUgODgwMiBkZXZpY2UuICovCi0JY29yZS0+ZHZiZGV2ID0gZGV2OwotCiAJLyogbm93IGF1dG9sb2FkIGN4ODgtZHZiIG9yIGN4ODgtYmxhY2tiaXJkICovCiAJcmVxdWVzdF9tb2R1bGVzKGRldik7CiAJcmV0dXJuIDA7CkBAIC04MjcsNiArODA0LDcgQEAKICBmYWlsX2ZyZWU6CiAJa2ZyZWUoZGV2KTsKICBmYWlsX2NvcmU6CisJY29yZS0+ZHZiZGV2ID0gTlVMTDsKIAljeDg4X2NvcmVfcHV0KGNvcmUscGNpX2Rldik7CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC5oCmluZGV4IGViOWNlMzAuLjYwYThiMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODguaApAQCAtMzAyLDYgKzMwMiw3IEBACiAJc3RydWN0IGJ0Y3hfcmlzY21lbSAgICBzdG9wcGVyOwogCXUzMiAgICAgICAgICAgICAgICAgICAgY291bnQ7CiB9Oworc3RydWN0IGN4ODhfY29yZTsKIAogc3RydWN0IGN4ODhfY29yZSB7CiAJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgICAgZGV2bGlzdDsKQEAgLTMzNCw3ICszMzUsOCBAQAogCiAJLyogY29uZmlnIGluZm8gLS0gZHZiICovCiAjaWYgZGVmaW5lZChDT05GSUdfVklERU9fQ1g4OF9EVkIpIHx8IGRlZmluZWQoQ09ORklHX1ZJREVPX0NYODhfRFZCX01PRFVMRSkKLQlpbnQgCQkJICAgKCpwcmV2X3NldF92b2x0YWdlKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc2VjX3ZvbHRhZ2VfdCB2b2x0YWdlKTsKKwlpbnQgCQkJICAgKCpwcmV2X3NldF92b2x0YWdlKShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgZmVfc2VjX3ZvbHRhZ2VfdCB2b2x0YWdlKTsKKwl2b2lkCQkJICAgKCpnYXRlX2N0cmwpKHN0cnVjdCBjeDg4X2NvcmUgICpjb3JlLCBpbnQgb3Blbik7CiAjZW5kaWYKIAogCS8qIHN0YXRlIGluZm8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWNhcmRzLmMKaW5kZXggZTc3NjY5OS4uZWY5YmYwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWNhcmRzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWNhcmRzLmMKQEAgLTE4NDIsNyArMTg0Miw3IEBACiAgKiBlbTI4eHhfaW5pdF9kZXYoKQogICogYWxsb2NhdGVzIGFuZCBpbml0cyB0aGUgZGV2aWNlIHN0cnVjdHMsIHJlZ2lzdGVycyBpMmMgYnVzIGFuZCB2NGwgZGV2aWNlCiAgKi8KLWludCBlbTI4eHhfaW5pdF9kZXYoc3RydWN0IGVtMjh4eCAqKmRldmhhbmRsZSwgc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsCitzdGF0aWMgaW50IGVtMjh4eF9pbml0X2RldihzdHJ1Y3QgZW0yOHh4ICoqZGV2aGFuZGxlLCBzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwKIAkJCSAgIGludCBtaW5vcikKIHsKIAlzdHJ1Y3QgZW0yOHh4ICpkZXYgPSAqZGV2aGFuZGxlOwpAQCAtMTk5MCw4ICsxOTkwLDcgQEAKIAkJaW50IGNoZWNrX2ludGVyZmFjZSA9IDE7CiAJCWlzb2NfcGlwZSA9IDE7CiAJCWVuZHBvaW50ID0gJmludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmctPmVuZHBvaW50WzFdLmRlc2M7Ci0JCWlmICh1c2JfZW5kcG9pbnRfdHlwZShlbmRwb2ludCkgIT0KLQkJICAgIFVTQl9FTkRQT0lOVF9YRkVSX0lTT0MpCisJCWlmICghdXNiX2VuZHBvaW50X3hmZXJfaXNvYyhlbmRwb2ludCkpCiAJCQljaGVja19pbnRlcmZhY2UgPSAwOwogCiAJCWlmICh1c2JfZW5kcG9pbnRfZGlyX291dChlbmRwb2ludCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWNvcmUuYwppbmRleCA4MTljY2VhLi5lYjVmYjA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1jb3JlLmMKQEAgLTM5Myw3ICszOTMsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0cnVjdCBlbTI4eHhfdm9sX3RhYmxlIG91dHB1dHNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZW0yOHh4X3ZvbF90YWJsZSBvdXRwdXRzW10gPSB7CiAJeyBFTTI4WFhfQU9VVF9NQVNURVIsIEFDOTdfTUFTVEVSX1ZPTCAgICAgIH0sCiAJeyBFTTI4WFhfQU9VVF9MSU5FLCAgIEFDOTdfTElORV9MRVZFTF9WT0wgIH0sCiAJeyBFTTI4WFhfQU9VVF9NT05PLCAgIEFDOTdfTUFTVEVSX01PTk9fVk9MIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtaW5wdXQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pbnB1dC5jCmluZGV4IDQyYmJhZjYuLjA0NDNhZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pbnB1dC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pbnB1dC5jCkBAIC0zMDcsNyArMzA3LDcgQEAKIAltb2RfdGltZXIoJmlyLT50aW1lciwgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoaXItPnBvbGxpbmcpKTsKIH0KIAotdm9pZCBlbTI4eHhfaXJfc3RhcnQoc3RydWN0IGVtMjh4eF9JUiAqaXIpCitzdGF0aWMgdm9pZCBlbTI4eHhfaXJfc3RhcnQoc3RydWN0IGVtMjh4eF9JUiAqaXIpCiB7CiAJc2V0dXBfdGltZXIoJmlyLT50aW1lciwgaXJfdGltZXIsICh1bnNpZ25lZCBsb25nKWlyKTsKIAlJTklUX1dPUksoJmlyLT53b3JrLCBlbTI4eHhfaXJfd29yayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX3M1azgzYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9zNWs4M2EuYwppbmRleCBhZjNmMmRjLi5jY2VhNGE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX3M1azgzYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfczVrODNhLmMKQEAgLTExMyw3ICsxMTMsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIHM1azgzYV9kdW1wX3JlZ2lzdGVycyhzdHJ1Y3Qgc2QgKnNkKQorc3RhdGljIHZvaWQgczVrODNhX2R1bXBfcmVnaXN0ZXJzKHN0cnVjdCBzZCAqc2QpCiB7CiAJaW50IGFkZHJlc3M7CiAJdTggcGFnZSwgb2xkX3BhZ2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292NzY3MC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjc2NzAuYwppbmRleCBjYTI2YjBjLi4wNWMxNGEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292NzY3MC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y3NjcwLmMKQEAgLTEzNDcsNyArMTM0Nyw2IEBACiAJCS5uYW1lID0gIm92NzY3MCIsCiAJfSwKIAkuaWQgCQk9IEkyQ19EUklWRVJJRF9PVjc2NzAsCi0JLmNsYXNzIAkJPSBJMkNfQ0xBU1NfQ0FNX0RJR0lUQUwsCiAJLmF0dGFjaF9hZGFwdGVyID0gb3Y3NjcwX2F0dGFjaCwKIAkuZGV0YWNoX2NsaWVudAk9IG92NzY3MF9kZXRhY2gsCiAJLmNvbW1hbmQJPSBvdjc2NzBfY29tbWFuZCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL292Y2FtY2hpcF9jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292Y2FtY2hpcC9vdmNhbWNoaXBfY29yZS5jCmluZGV4IDJjNGFjYmYuLmM4NDFmNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL292Y2FtY2hpcF9jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdmNhbWNoaXAvb3ZjYW1jaGlwX2NvcmUuYwpAQCAtNDA1LDcgKzQwNSw2IEBACiAJCS5uYW1lID0JCSJvdmNhbWNoaXAiLAogCX0sCiAJLmlkID0JCQlJMkNfRFJJVkVSSURfT1ZDQU1DSElQLAotCS5jbGFzcyA9CQlJMkNfQ0xBU1NfQ0FNX0RJR0lUQUwsCiAJLmF0dGFjaF9hZGFwdGVyID0Jb3ZjYW1jaGlwX2F0dGFjaCwKIAkuZGV0YWNoX2NsaWVudCA9CW92Y2FtY2hpcF9kZXRhY2gsCiAJLmNvbW1hbmQgPQkJb3ZjYW1jaGlwX2NvbW1hbmQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1oZHcuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy5jCmluZGV4IDhmYjkyYWMuLmZhMzA0ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy5jCkBAIC0zNjU1LDcgKzM2NTUsNyBAQAogCWludCByZXQ7CiAJcHZyMl90cmFjZShQVlIyX1RSQUNFX0lOSVQsIlBlcmZvcm1pbmcgYSBkZXZpY2UgcmVzZXQuLi4iKTsKIAlyZXQgPSB1c2JfbG9ja19kZXZpY2VfZm9yX3Jlc2V0KGhkdy0+dXNiX2RldixOVUxMKTsKLQlpZiAocmV0ID09IDEpIHsKKwlpZiAocmV0ID09IDApIHsKIAkJcmV0ID0gdXNiX3Jlc2V0X2RldmljZShoZHctPnVzYl9kZXYpOwogCQl1c2JfdW5sb2NrX2RldmljZShoZHctPnVzYl9kZXYpOwogCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B4YV9jYW1lcmEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHhhX2NhbWVyYS5jCmluZGV4IDlkMzNkZTIuLmExZDYwMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHhhX2NhbWVyYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHhhX2NhbWVyYS5jCkBAIC0zNCwxMiArMzQsMTAgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogCi0jaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPG1hY2gvZG1hLmg+CiAjaW5jbHVkZSA8bWFjaC9weGEtcmVncy5oPgogI2luY2x1ZGUgPG1hY2gvY2FtZXJhLmg+CiAKLSNpbmNsdWRlICJweGFfY2FtZXJhLmgiCi0KICNkZWZpbmUgUFhBX0NBTV9WRVJTSU9OX0NPREUgS0VSTkVMX1ZFUlNJT04oMCwgMCwgNSkKICNkZWZpbmUgUFhBX0NBTV9EUlZfTkFNRSAicHhhMjd4LWNhbWVyYSIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9weGFfY2FtZXJhLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B4YV9jYW1lcmEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODljYmZjOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B4YV9jYW1lcmEuaAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qIENhbWVyYSBJbnRlcmZhY2UgKi8KLSNkZWZpbmUgQ0lDUjAJCV9fUkVHKDB4NTAwMDAwMDApCi0jZGVmaW5lIENJQ1IxCQlfX1JFRygweDUwMDAwMDA0KQotI2RlZmluZSBDSUNSMgkJX19SRUcoMHg1MDAwMDAwOCkKLSNkZWZpbmUgQ0lDUjMJCV9fUkVHKDB4NTAwMDAwMEMpCi0jZGVmaW5lIENJQ1I0CQlfX1JFRygweDUwMDAwMDEwKQotI2RlZmluZSBDSVNSCQlfX1JFRygweDUwMDAwMDE0KQotI2RlZmluZSBDSUZSCQlfX1JFRygweDUwMDAwMDE4KQotI2RlZmluZSBDSVRPUgkJX19SRUcoMHg1MDAwMDAxQykKLSNkZWZpbmUgQ0lCUjAJCV9fUkVHKDB4NTAwMDAwMjgpCi0jZGVmaW5lIENJQlIxCQlfX1JFRygweDUwMDAwMDMwKQotI2RlZmluZSBDSUJSMgkJX19SRUcoMHg1MDAwMDAzOCkKLQotI2RlZmluZSBDSUNSMF9ETUFFTgkoMSA8PCAzMSkJLyogRE1BIHJlcXVlc3QgZW5hYmxlICovCi0jZGVmaW5lIENJQ1IwX1BBUl9FTgkoMSA8PCAzMCkJLyogUGFyaXR5IGVuYWJsZSAqLwotI2RlZmluZSBDSUNSMF9TTF9DQVBfRU4JKDEgPDwgMjkpCS8qIENhcHR1cmUgZW5hYmxlIGZvciBzbGF2ZSBtb2RlICovCi0jZGVmaW5lIENJQ1IwX0VOQgkoMSA8PCAyOCkJLyogQ2FtZXJhIGludGVyZmFjZSBlbmFibGUgKi8KLSNkZWZpbmUgQ0lDUjBfRElTCSgxIDw8IDI3KQkvKiBDYW1lcmEgaW50ZXJmYWNlIGRpc2FibGUgKi8KLSNkZWZpbmUgQ0lDUjBfU0lNCSgweDcgPDwgMjQpCS8qIFNlbnNvciBpbnRlcmZhY2UgbW9kZSBtYXNrICovCi0jZGVmaW5lIENJQ1IwX1RPTQkoMSA8PCA5KQkvKiBUaW1lLW91dCBtYXNrICovCi0jZGVmaW5lIENJQ1IwX1JEQVZNCSgxIDw8IDgpCS8qIFJlY2VpdmUtZGF0YS1hdmFpbGFibGUgbWFzayAqLwotI2RlZmluZSBDSUNSMF9GRU0JKDEgPDwgNykJLyogRklGTy1lbXB0eSBtYXNrICovCi0jZGVmaW5lIENJQ1IwX0VPTE0JKDEgPDwgNikJLyogRW5kLW9mLWxpbmUgbWFzayAqLwotI2RlZmluZSBDSUNSMF9QRVJSTQkoMSA8PCA1KQkvKiBQYXJpdHktZXJyb3IgbWFzayAqLwotI2RlZmluZSBDSUNSMF9RRE0JKDEgPDwgNCkJLyogUXVpY2stZGlzYWJsZSBtYXNrICovCi0jZGVmaW5lIENJQ1IwX0NETQkoMSA8PCAzKQkvKiBEaXNhYmxlLWRvbmUgbWFzayAqLwotI2RlZmluZSBDSUNSMF9TT0ZNCSgxIDw8IDIpCS8qIFN0YXJ0LW9mLWZyYW1lIG1hc2sgKi8KLSNkZWZpbmUgQ0lDUjBfRU9GTQkoMSA8PCAxKQkvKiBFbmQtb2YtZnJhbWUgbWFzayAqLwotI2RlZmluZSBDSUNSMF9GT00JKDEgPDwgMCkJLyogRklGTy1vdmVycnVuIG1hc2sgKi8KLQotI2RlZmluZSBDSUNSMV9UQklUCSgxIDw8IDMxKQkvKiBUcmFuc3BhcmVuY3kgYml0ICovCi0jZGVmaW5lIENJQ1IxX1JHQlRfQ09OVgkoMHgzIDw8IDI5KQkvKiBSR0JUIGNvbnZlcnNpb24gbWFzayAqLwotI2RlZmluZSBDSUNSMV9QUEwJKDB4N2ZmIDw8IDE1KQkvKiBQaXhlbHMgcGVyIGxpbmUgbWFzayAqLwotI2RlZmluZSBDSUNSMV9SR0JfQ09OVgkoMHg3IDw8IDEyKQkvKiBSR0IgY29udmVyc2lvbiBtYXNrICovCi0jZGVmaW5lIENJQ1IxX1JHQl9GCSgxIDw8IDExKQkvKiBSR0IgZm9ybWF0ICovCi0jZGVmaW5lIENJQ1IxX1lDQkNSX0YJKDEgPDwgMTApCS8qIFlDYkNyIGZvcm1hdCAqLwotI2RlZmluZSBDSUNSMV9SR0JfQlBQCSgweDcgPDwgNykJLyogUkdCIGJpcyBwZXIgcGl4ZWwgbWFzayAqLwotI2RlZmluZSBDSUNSMV9SQVdfQlBQCSgweDMgPDwgNSkJLyogUmF3IGJpcyBwZXIgcGl4ZWwgbWFzayAqLwotI2RlZmluZSBDSUNSMV9DT0xPUl9TUAkoMHgzIDw8IDMpCS8qIENvbG9yIHNwYWNlIG1hc2sgKi8KLSNkZWZpbmUgQ0lDUjFfRFcJKDB4NyA8PCAwKQkvKiBEYXRhIHdpZHRoIG1hc2sgKi8KLQotI2RlZmluZSBDSUNSMl9CTFcJKDB4ZmYgPDwgMjQpCS8qIEJlZ2lubmluZy1vZi1saW5lIHBpeGVsIGNsb2NrCi0JCQkJCSAgIHdhaXQgY291bnQgbWFzayAqLwotI2RlZmluZSBDSUNSMl9FTFcJKDB4ZmYgPDwgMTYpCS8qIEVuZC1vZi1saW5lIHBpeGVsIGNsb2NrCi0JCQkJCSAgIHdhaXQgY291bnQgbWFzayAqLwotI2RlZmluZSBDSUNSMl9IU1cJKDB4M2YgPDwgMTApCS8qIEhvcml6b250YWwgc3luYyBwdWxzZSB3aWR0aCBtYXNrICovCi0jZGVmaW5lIENJQ1IyX0JGUFcJKDB4M2YgPDwgMykJLyogQmVnaW5uaW5nLW9mLWZyYW1lIHBpeGVsIGNsb2NrCi0JCQkJCSAgIHdhaXQgY291bnQgbWFzayAqLwotI2RlZmluZSBDSUNSMl9GU1cJKDB4NyA8PCAwKQkvKiBGcmFtZSBzdGFiaWxpemF0aW9uCi0JCQkJCSAgIHdhaXQgY291bnQgbWFzayAqLwotCi0jZGVmaW5lIENJQ1IzX0JGVwkoMHhmZiA8PCAyNCkJLyogQmVnaW5uaW5nLW9mLWZyYW1lIGxpbmUgY2xvY2sKLQkJCQkJICAgd2FpdCBjb3VudCBtYXNrICovCi0jZGVmaW5lIENJQ1IzX0VGVwkoMHhmZiA8PCAxNikJLyogRW5kLW9mLWZyYW1lIGxpbmUgY2xvY2sKLQkJCQkJICAgd2FpdCBjb3VudCBtYXNrICovCi0jZGVmaW5lIENJQ1IzX1ZTVwkoMHgzZiA8PCAxMCkJLyogVmVydGljYWwgc3luYyBwdWxzZSB3aWR0aCBtYXNrICovCi0jZGVmaW5lIENJQ1IzX0JGUFcJKDB4M2YgPDwgMykJLyogQmVnaW5uaW5nLW9mLWZyYW1lIHBpeGVsIGNsb2NrCi0JCQkJCSAgIHdhaXQgY291bnQgbWFzayAqLwotI2RlZmluZSBDSUNSM19MUEYJKDB4N2ZmIDw8IDApCS8qIExpbmVzIHBlciBmcmFtZSBtYXNrICovCi0KLSNkZWZpbmUgQ0lDUjRfTUNMS19ETFkJKDB4MyA8PCAyNCkJLyogTUNMSyBEYXRhIENhcHR1cmUgRGVsYXkgbWFzayAqLwotI2RlZmluZSBDSUNSNF9QQ0xLX0VOCSgxIDw8IDIzKQkvKiBQaXhlbCBjbG9jayBlbmFibGUgKi8KLSNkZWZpbmUgQ0lDUjRfUENQCSgxIDw8IDIyKQkvKiBQaXhlbCBjbG9jayBwb2xhcml0eSAqLwotI2RlZmluZSBDSUNSNF9IU1AJKDEgPDwgMjEpCS8qIEhvcml6b250YWwgc3luYyBwb2xhcml0eSAqLwotI2RlZmluZSBDSUNSNF9WU1AJKDEgPDwgMjApCS8qIFZlcnRpY2FsIHN5bmMgcG9sYXJpdHkgKi8KLSNkZWZpbmUgQ0lDUjRfTUNMS19FTgkoMSA8PCAxOSkJLyogTUNMSyBlbmFibGUgKi8KLSNkZWZpbmUgQ0lDUjRfRlJfUkFURQkoMHg3IDw8IDgpCS8qIEZyYW1lIHJhdGUgbWFzayAqLwotI2RlZmluZSBDSUNSNF9ESVYJKDB4ZmYgPDwgMCkJLyogQ2xvY2sgZGl2aXNvciBtYXNrICovCi0KLSNkZWZpbmUgQ0lTUl9GVE8JKDEgPDwgMTUpCS8qIEZJRk8gdGltZS1vdXQgKi8KLSNkZWZpbmUgQ0lTUl9SREFWXzIJKDEgPDwgMTQpCS8qIENoYW5uZWwgMiByZWNlaXZlIGRhdGEgYXZhaWxhYmxlICovCi0jZGVmaW5lIENJU1JfUkRBVl8xCSgxIDw8IDEzKQkvKiBDaGFubmVsIDEgcmVjZWl2ZSBkYXRhIGF2YWlsYWJsZSAqLwotI2RlZmluZSBDSVNSX1JEQVZfMAkoMSA8PCAxMikJLyogQ2hhbm5lbCAwIHJlY2VpdmUgZGF0YSBhdmFpbGFibGUgKi8KLSNkZWZpbmUgQ0lTUl9GRU1QVFlfMgkoMSA8PCAxMSkJLyogQ2hhbm5lbCAyIEZJRk8gZW1wdHkgKi8KLSNkZWZpbmUgQ0lTUl9GRU1QVFlfMQkoMSA8PCAxMCkJLyogQ2hhbm5lbCAxIEZJRk8gZW1wdHkgKi8KLSNkZWZpbmUgQ0lTUl9GRU1QVFlfMAkoMSA8PCA5KQkvKiBDaGFubmVsIDAgRklGTyBlbXB0eSAqLwotI2RlZmluZSBDSVNSX0VPTAkoMSA8PCA4KQkvKiBFbmQgb2YgbGluZSAqLwotI2RlZmluZSBDSVNSX1BBUl9FUlIJKDEgPDwgNykJLyogUGFyaXR5IGVycm9yICovCi0jZGVmaW5lIENJU1JfQ1FECSgxIDw8IDYpCS8qIENhbWVyYSBpbnRlcmZhY2UgcXVpY2sgZGlzYWJsZSAqLwotI2RlZmluZSBDSVNSX0NERAkoMSA8PCA1KQkvKiBDYW1lcmEgaW50ZXJmYWNlIGRpc2FibGUgZG9uZSAqLwotI2RlZmluZSBDSVNSX1NPRgkoMSA8PCA0KQkvKiBTdGFydCBvZiBmcmFtZSAqLwotI2RlZmluZSBDSVNSX0VPRgkoMSA8PCAzKQkvKiBFbmQgb2YgZnJhbWUgKi8KLSNkZWZpbmUgQ0lTUl9JRk9fMgkoMSA8PCAyKQkvKiBGSUZPIG92ZXJydW4gZm9yIENoYW5uZWwgMiAqLwotI2RlZmluZSBDSVNSX0lGT18xCSgxIDw8IDEpCS8qIEZJRk8gb3ZlcnJ1biBmb3IgQ2hhbm5lbCAxICovCi0jZGVmaW5lIENJU1JfSUZPXzAJKDEgPDwgMCkJLyogRklGTyBvdmVycnVuIGZvciBDaGFubmVsIDAgKi8KLQotI2RlZmluZSBDSUZSX0ZMVkwyCSgweDdmIDw8IDIzKQkvKiBGSUZPIDIgbGV2ZWwgbWFzayAqLwotI2RlZmluZSBDSUZSX0ZMVkwxCSgweDdmIDw8IDE2KQkvKiBGSUZPIDEgbGV2ZWwgbWFzayAqLwotI2RlZmluZSBDSUZSX0ZMVkwwCSgweGZmIDw8IDgpCS8qIEZJRk8gMCBsZXZlbCBtYXNrICovCi0jZGVmaW5lIENJRlJfVEhMXzAJKDB4MyA8PCA0KQkvKiBUaHJlc2hvbGQgTGV2ZWwgZm9yIENoYW5uZWwgMCBGSUZPICovCi0jZGVmaW5lIENJRlJfUkVTRVRfRgkoMSA8PCAzKQkvKiBSZXNldCBpbnB1dCBGSUZPcyAqLwotI2RlZmluZSBDSUZSX0ZFTjIJKDEgPDwgMikJLyogRklGTyBlbmFibGUgZm9yIGNoYW5uZWwgMiAqLwotI2RlZmluZSBDSUZSX0ZFTjEJKDEgPDwgMSkJLyogRklGTyBlbmFibGUgZm9yIGNoYW5uZWwgMSAqLwotI2RlZmluZSBDSUZSX0ZFTjAJKDEgPDwgMCkJLyogRklGTyBlbmFibGUgZm9yIGNoYW5uZWwgMCAqLwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL2libWNhbS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby9pYm1jYW0uYwppbmRleCBmOGQ4NWRkLi5iMDg1NDk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL2libWNhbS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vaWJtY2FtLmMKQEAgLTM3NzksNyArMzc3OSw3IEBACiAJCQllcnIoIkFsdGVybmF0ZSBzZXR0aW5ncyBoYXZlIGRpZmZlcmVudCBlbmRwb2ludCBhZGRyZXNzZXMhIik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQotCQlpZiAodXNiX2VuZHBvaW50X3R5cGUoZW5kcG9pbnQpICE9IFVTQl9FTkRQT0lOVF9YRkVSX0lTT0MpIHsKKwkJaWYgKCF1c2JfZW5kcG9pbnRfeGZlcl9pc29jKGVuZHBvaW50KSkgewogCQkJZXJyKCJJbnRlcmZhY2UgJWQuIGhhcyBub24tSVNPIGVuZHBvaW50ISIsIGlmbnVtKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL2tvbmljYXdjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL2tvbmljYXdjLmMKaW5kZXggOTBmMGNlNi4uOTAwZWMyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby9rb25pY2F3Yy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8va29uaWNhd2MuYwpAQCAtODIzLDcgKzgyMyw3IEBACiAJCQllcnIoIkFsdGVybmF0ZSBzZXR0aW5ncyBoYXZlIGRpZmZlcmVudCBlbmRwb2ludCBhZGRyZXNzZXMhIik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQotCQlpZiAodXNiX2VuZHBvaW50X3R5cGUoZW5kcG9pbnQpICE9IFVTQl9FTkRQT0lOVF9YRkVSX0lTT0MpIHsKKwkJaWYgKCF1c2JfZW5kcG9pbnRfeGZlcl9pc29jKGVuZHBvaW50KSkgewogCQkJZXJyKCJJbnRlcmZhY2UgJWQuIGhhcyBub24tSVNPIGVuZHBvaW50ISIsCiAJCQkgICAgaW50ZXJmYWNlLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIpOwogCQkJcmV0dXJuIC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL3VsdHJhY2FtLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL3VsdHJhY2FtLmMKaW5kZXggODM5YTA4Mi4uZmJkMWI2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby91bHRyYWNhbS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vdWx0cmFjYW0uYwpAQCAtNTU2LDcgKzU1Niw3IEBACiAJCQllcnIoIkFsdGVybmF0ZSBzZXR0aW5ncyBoYXZlIGRpZmZlcmVudCBlbmRwb2ludCBhZGRyZXNzZXMhIik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQotCQlpZiAodXNiX2VuZHBvaW50X3R5cGUoZW5kcG9pbnQpICE9IFVTQl9FTkRQT0lOVF9YRkVSX0lTT0MpIHsKKwkJaWYgKCF1c2JfZW5kcG9pbnRfeGZlcl9pc29jKGVuZHBvaW50KSkgewogCQkJZXJyKCJJbnRlcmZhY2UgJWQuIGhhcyBub24tSVNPIGVuZHBvaW50ISIsCiAJCQkgICAgaW50ZXJmYWNlLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIpOwogCQkJcmV0dXJuIC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi91c2J2aXNpb24tdmlkZW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL3VzYnZpc2lvbi12aWRlby5jCmluZGV4IDJiZTVlNDcuLjI2MjJkZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL3VzYnZpc2lvbi12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL3VzYnZpc2lvbi12aWRlby5jCkBAIC0xNjc0LDggKzE2NzQsNyBAQAogCQlpbnRlcmZhY2UgPSAmZGV2LT5hY3Rjb25maWctPmludGVyZmFjZVtpZm51bV0tPmFsdHNldHRpbmdbMF07CiAJfQogCWVuZHBvaW50ID0gJmludGVyZmFjZS0+ZW5kcG9pbnRbMV0uZGVzYzsKLQlpZiAodXNiX2VuZHBvaW50X3R5cGUoZW5kcG9pbnQpICE9Ci0JICAgIFVTQl9FTkRQT0lOVF9YRkVSX0lTT0MpIHsKKwlpZiAoIXVzYl9lbmRwb2ludF94ZmVyX2lzb2MoZW5kcG9pbnQpKSB7CiAJCWVycigiJXM6IGludGVyZmFjZSAlZC4gaGFzIG5vbi1JU08gZW5kcG9pbnQhIiwKIAkJICAgIF9fZnVuY19fLCBpZm51bSk7CiAJCWVycigiJXM6IEVuZHBvaW50IGF0dHJpYnV0ZXMgJWQiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwxLWNvbXBhdC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwxLWNvbXBhdC5jCmluZGV4IGQ0NTBjYWIuLmI2MTdiZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMS1jb21wYXQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDEtY29tcGF0LmMKQEAgLTIwMyw3ICsyMDMsNiBAQAogCXRhYmxlID0gJnB3cS0+cHQ7CiAJZm9yICg7OykgewogCQlpbnQgbWFzazsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJbWFzayA9IGZpbGUtPmZfb3AtPnBvbGwoZmlsZSwgdGFibGUpOwogCQlpZiAobWFzayAmIFBPTExJTikKIAkJCWJyZWFrOwpAQCAtMjEyLDkgKzIxMSw4IEBACiAJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CiAJCQlicmVhazsKIAkJfQotCQlzY2hlZHVsZSgpOworCQlwb2xsX3NjaGVkdWxlKHB3cSwgVEFTS19JTlRFUlJVUFRJQkxFKTsKIAl9Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIAlwb2xsX2ZyZWV3YWl0KHB3cSk7CiAJcmV0dXJuIHJldHZhbDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1kZXZpY2UuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1kZXZpY2UuYwppbmRleCA5ZWVmZGUwLi5jZjlkNGM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItZGV2aWNlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWRldmljZS5jCkBAIC0yOSw3ICsyOSw3IEBACiAJaWYgKGRldiA9PSBOVUxMIHx8IHY0bDJfZGV2ID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCS8qIFdhcm4gaWYgd2UgYXBwYXJlbnRseSByZS1yZWdpc3RlciBhIGRldmljZSAqLwotCVdBUk5fT04oZGV2X2dldF9kcnZkYXRhKGRldikpOworCVdBUk5fT04oZGV2X2dldF9kcnZkYXRhKGRldikgIT0gTlVMTCk7CiAJSU5JVF9MSVNUX0hFQUQoJnY0bDJfZGV2LT5zdWJkZXZzKTsKIAlzcGluX2xvY2tfaW5pdCgmdjRsMl9kZXYtPmxvY2spOwogCXY0bDJfZGV2LT5kZXYgPSBkZXY7CkBAIC02MSw3ICs2MSw3IEBACiAJaWYgKGRldiA9PSBOVUxMIHx8IHNkID09IE5VTEwgfHwgIXNkLT5uYW1lWzBdKQogCQlyZXR1cm4gLUVJTlZBTDsKIAkvKiBXYXJuIGlmIHdlIGFwcGFyZW50bHkgcmUtcmVnaXN0ZXIgYSBzdWJkZXYgKi8KLQlXQVJOX09OKHNkLT5kZXYpOworCVdBUk5fT04oc2QtPmRldiAhPSBOVUxMKTsKIAlpZiAoIXRyeV9tb2R1bGVfZ2V0KHNkLT5vd25lcikpCiAJCXJldHVybiAtRU5PREVWOwogCXNkLT5kZXYgPSBkZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmLWRtYS1zZy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1Zi1kbWEtc2cuYwppbmRleCBiYzZkNWFiLi5kYTE3OTBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmLWRtYS1zZy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYtZG1hLXNnLmMKQEAgLTM4OCw4ICszODgsNyBAQAogCXBhZ2UgPSBhbGxvY19wYWdlKEdGUF9VU0VSIHwgX19HRlBfRE1BMzIpOwogCWlmICghcGFnZSkKIAkJcmV0dXJuIFZNX0ZBVUxUX09PTTsKLQljbGVhcl91c2VyX3BhZ2UocGFnZV9hZGRyZXNzKHBhZ2UpLCAodW5zaWduZWQgbG9uZyl2bWYtPnZpcnR1YWxfYWRkcmVzcywKLQkJCXBhZ2UpOworCWNsZWFyX3VzZXJfaGlnaHBhZ2UocGFnZSwgKHVuc2lnbmVkIGxvbmcpdm1mLT52aXJ0dWFsX2FkZHJlc3MpOwogCXZtZi0+cGFnZSA9IHBhZ2U7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3c5OTY4Y2YuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdzk5NjhjZi5jCmluZGV4IGEzOTk3YjcuLjEwNWE4MzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdzk5NjhjZi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdzk5NjhjZi5jCkBAIC0xNTUzLDcgKzE1NTMsNiBAQAogCiAJc3RhdGljIHN0cnVjdCBpMmNfYWRhcHRlciBhZGFwID0gewogCQkuaWQgPSAgICAgICAgICAgICAgICBJMkNfSFdfU01CVVNfVzk5NjhDRiwKLQkJLmNsYXNzID0gICAgICAgICAgICAgSTJDX0NMQVNTX0NBTV9ESUdJVEFMLAogCQkub3duZXIgPSAgICAgICAgICAgICBUSElTX01PRFVMRSwKIAkJLmNsaWVudF9yZWdpc3RlciA9ICAgdzk5NjhjZl9pMmNfYXR0YWNoX2luZm9ybSwKIAkJLmNsaWVudF91bnJlZ2lzdGVyID0gdzk5NjhjZl9pMmNfZGV0YWNoX2luZm9ybSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVtc3RpY2svY29yZS9tZW1zdGljay5jIGIvZHJpdmVycy9tZW1zdGljay9jb3JlL21lbXN0aWNrLmMKaW5kZXggY2VhNDY5MC4uYTViNDQ4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZW1zdGljay9jb3JlL21lbXN0aWNrLmMKKysrIGIvZHJpdmVycy9tZW1zdGljay9jb3JlL21lbXN0aWNrLmMKQEAgLTM4NSw4ICszODUsNyBAQAogCiAJaWYgKGNhcmQpIHsKIAkJY2FyZC0+aG9zdCA9IGhvc3Q7Ci0JCXNucHJpbnRmKGNhcmQtPmRldi5idXNfaWQsIHNpemVvZihjYXJkLT5kZXYuYnVzX2lkKSwKLQkJCSAiJXMiLCBob3N0LT5kZXYuYnVzX2lkKTsKKwkJZGV2X3NldF9uYW1lKCZjYXJkLT5kZXYsICIlcyIsIGRldl9uYW1lKCZob3N0LT5kZXYpKTsKIAkJY2FyZC0+ZGV2LnBhcmVudCA9ICZob3N0LT5kZXY7CiAJCWNhcmQtPmRldi5idXMgPSAmbWVtc3RpY2tfYnVzX3R5cGU7CiAJCWNhcmQtPmRldi5yZWxlYXNlID0gbWVtc3RpY2tfZnJlZV9jYXJkOwpAQCAtNTE5LDcgKzUxOCw3IEBACiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKLQlzbnByaW50Zihob3N0LT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgIm1lbXN0aWNrJXUiLCBob3N0LT5pZCk7CisJZGV2X3NldF9uYW1lKCZob3N0LT5kZXYsICJtZW1zdGljayV1IiwgaG9zdC0+aWQpOwogCiAJcmMgPSBkZXZpY2VfYWRkKCZob3N0LT5kZXYpOwogCWlmIChyYykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZW1zdGljay9jb3JlL21zcHJvX2Jsb2NrLmMgYi9kcml2ZXJzL21lbXN0aWNrL2NvcmUvbXNwcm9fYmxvY2suYwppbmRleCA3OTExMTUxLi4xZjFlMzk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lbXN0aWNrL2NvcmUvbXNwcm9fYmxvY2suYworKysgYi9kcml2ZXJzL21lbXN0aWNrL2NvcmUvbXNwcm9fYmxvY2suYwpAQCAtODg3LDE0ICs4ODcsMTQgQEAKIAlpZiAocmMpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkgICAgICAgIiVzOiBjb3VsZCBub3Qgc3dpdGNoIHRvIDQtYml0IG1vZGUsIGVycm9yICVkXG4iLAotCQkgICAgICAgY2FyZC0+ZGV2LmJ1c19pZCwgcmMpOworCQkgICAgICAgZGV2X25hbWUoJmNhcmQtPmRldiksIHJjKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJbXNiLT5zeXN0ZW0gPSBNRU1TVElDS19TWVNfUEFSNDsKIAlob3N0LT5zZXRfcGFyYW0oaG9zdCwgTUVNU1RJQ0tfSU5URVJGQUNFLCBNRU1TVElDS19QQVI0KTsKIAlwcmludGsoS0VSTl9JTkZPICIlczogc3dpdGNoaW5nIHRvIDQtYml0IHBhcmFsbGVsIG1vZGVcbiIsCi0JICAgICAgIGNhcmQtPmRldi5idXNfaWQpOworCSAgICAgICBkZXZfbmFtZSgmY2FyZC0+ZGV2KSk7CiAKIAlpZiAobXNiLT5jYXBzICYgTUVNU1RJQ0tfQ0FQX1BBUjgpIHsKIAkJcmMgPSBtc3Byb19ibG9ja19zZXRfaW50ZXJmYWNlKGNhcmQsIE1FTVNUSUNLX1NZU19QQVI4KTsKQEAgLTkwNSwxMSArOTA1LDExIEBACiAJCQkJCU1FTVNUSUNLX1BBUjgpOwogCQkJcHJpbnRrKEtFUk5fSU5GTwogCQkJICAgICAgICIlczogc3dpdGNoaW5nIHRvIDgtYml0IHBhcmFsbGVsIG1vZGVcbiIsCi0JCQkgICAgICAgY2FyZC0+ZGV2LmJ1c19pZCk7CisJCQkgICAgICAgZGV2X25hbWUoJmNhcmQtPmRldikpOwogCQl9IGVsc2UKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJCSAgICAgICAiJXM6IGNvdWxkIG5vdCBzd2l0Y2ggdG8gOC1iaXQgbW9kZSwgZXJyb3IgJWRcbiIsCi0JCQkgICAgICAgY2FyZC0+ZGV2LmJ1c19pZCwgcmMpOworCQkJICAgICAgIGRldl9uYW1lKCZjYXJkLT5kZXYpLCByYyk7CiAJfQogCiAJY2FyZC0+bmV4dF9yZXF1ZXN0ID0gaF9tc3Byb19ibG9ja19yZXFfaW5pdDsKQEAgLTkyMiw3ICs5MjIsNyBAQAogCWlmIChyYykgewogCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCSAgICAgICAiJXM6IGludGVyZmFjZSBlcnJvciwgdHJ5aW5nIHRvIGZhbGwgYmFjayB0byBzZXJpYWxcbiIsCi0JCSAgICAgICBjYXJkLT5kZXYuYnVzX2lkKTsKKwkJICAgICAgIGRldl9uYW1lKCZjYXJkLT5kZXYpKTsKIAkJbXNiLT5zeXN0ZW0gPSBNRU1TVElDS19TWVNfU0VSSUFMOwogCQlob3N0LT5zZXRfcGFyYW0oaG9zdCwgTUVNU1RJQ0tfUE9XRVIsIE1FTVNUSUNLX1BPV0VSX09GRik7CiAJCW1zbGVlcCgxMCk7CkBAIC05OTIsMTQgKzk5MiwxNCBAQAogCiAJaWYgKGJlMTZfdG9fY3B1KGF0dHItPnNpZ25hdHVyZSkgIT0gTVNQUk9fQkxPQ0tfU0lHTkFUVVJFKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVucmVjb2duaXplZCBkZXZpY2Ugc2lnbmF0dXJlICV4XG4iLAotCQkgICAgICAgY2FyZC0+ZGV2LmJ1c19pZCwgYmUxNl90b19jcHUoYXR0ci0+c2lnbmF0dXJlKSk7CisJCSAgICAgICBkZXZfbmFtZSgmY2FyZC0+ZGV2KSwgYmUxNl90b19jcHUoYXR0ci0+c2lnbmF0dXJlKSk7CiAJCXJjID0gLUVOT0RFVjsKIAkJZ290byBvdXRfZnJlZV9hdHRyOwogCX0KIAogCWlmIChhdHRyLT5jb3VudCA+IE1TUFJPX0JMT0NLX01BWF9BVFRSSUJVVEVTKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB3YXkgdG9vIG1hbnkgYXR0cmlidXRlIGVudHJpZXNcbiIsCi0JCSAgICAgICBjYXJkLT5kZXYuYnVzX2lkKTsKKwkJICAgICAgIGRldl9uYW1lKCZjYXJkLT5kZXYpKTsKIAkJYXR0cl9jb3VudCA9IE1TUFJPX0JMT0NLX01BWF9BVFRSSUJVVEVTOwogCX0gZWxzZQogCQlhdHRyX2NvdW50ID0gYXR0ci0+Y291bnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lbXN0aWNrL2hvc3QvdGlmbV9tcy5jIGIvZHJpdmVycy9tZW1zdGljay9ob3N0L3RpZm1fbXMuYwppbmRleCBkMzJkNmFkLi4wM2Y3MWE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lbXN0aWNrL2hvc3QvdGlmbV9tcy5jCisrKyBiL2RyaXZlcnMvbWVtc3RpY2svaG9zdC90aWZtX21zLmMKQEAgLTU0Niw3ICs1NDYsNyBAQAogCXByaW50ayhLRVJOX0VSUgogCSAgICAgICAiJXMgOiBjYXJkIGZhaWxlZCB0byByZXNwb25kIGZvciBhIGxvbmcgcGVyaW9kIG9mIHRpbWUgIgogCSAgICAgICAiKCV4LCAleClcbiIsCi0JICAgICAgIGhvc3QtPmRldi0+ZGV2LmJ1c19pZCwgaG9zdC0+cmVxID8gaG9zdC0+cmVxLT50cGMgOiAwLAorCSAgICAgICBkZXZfbmFtZSgmaG9zdC0+ZGV2LT5kZXYpLCBob3N0LT5yZXEgPyBob3N0LT5yZXEtPnRwYyA6IDAsCiAJICAgICAgIGhvc3QtPmNtZF9mbGFncyk7CiAKIAl0aWZtX2VqZWN0KGhvc3QtPmRldik7CkBAIC01NjEsNyArNTYxLDcgQEAKIAlpZiAoIShUSUZNX1NPQ0tfU1RBVEVfT0NDVVBJRUQKIAkgICAgICAmIHJlYWRsKHNvY2stPmFkZHIgKyBTT0NLX1BSRVNFTlRfU1RBVEUpKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcyA6IGNhcmQgZ29uZSwgdW5leHBlY3RlZGx5XG4iLAotCQkgICAgICAgc29jay0+ZGV2LmJ1c19pZCk7CisJCSAgICAgICBkZXZfbmFtZSgmc29jay0+ZGV2KSk7CiAJCXJldHVybiByYzsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0Y3RsLmMgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGN0bC5jCmluZGV4IGI4OWY0NzYuLmM2MzgxNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0Y3RsLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRjdGwuYwpAQCAtMzA4LDEwICszMDgsMTEgQEAKIHsKIAlpbnQgcmMgPSAxOwogCi0JZGN0bHByaW50ayhpb2N0bC0+aW9jLCBwcmludGsoTVlJT0Nfc19ERUJVR19GTVQgIjogVGltZW91dCBFeHBpcmVkISBIb3N0ICVkXG4iLAotCQkJCWlvY3RsLT5pb2MtPm5hbWUsIGlvY3RsLT5pb2MtPmlkKSk7CiAJaWYgKGlvY3RsID09IE5VTEwpCiAJCXJldHVybjsKKwlkY3RscHJpbnRrKGlvY3RsLT5pb2MsCisJCSAgIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiOiBUaW1lb3V0IEV4cGlyZWQhIEhvc3QgJWRcbiIsCisJCSAgIGlvY3RsLT5pb2MtPm5hbWUsIGlvY3RsLT5pb2MtPmlkKSk7CiAKIAlpb2N0bC0+d2FpdF9kb25lID0gMDsKIAlpZiAoaW9jdGwtPnJlc2V0ICYgTVBUQ1RMX1JFU0VUX09LKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRsYW4uYyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0bGFuLmMKaW5kZXggYTEzZjZlZS4uYzI4MDRmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRsYW4uYworKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGxhbi5jCkBAIC0xMDYsNyArMTA2LDYgQEAKIAogCXUzMiB0b3RhbF9wb3N0ZWQ7CiAJdTMyIHRvdGFsX3JlY2VpdmVkOwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwkvKiBQZXIgZGV2aWNlIHN0YXRpc3RpY3MgKi8KIAogCXN0cnVjdCBkZWxheWVkX3dvcmsgcG9zdF9idWNrZXRzX3Rhc2s7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKQEAgLTU0OCwxNSArNTQ3LDYgQEAKIH0KIAogLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICoKLW1wdF9sYW5fZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IG1wdF9sYW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0KLQlyZXR1cm4gKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICopICZwcml2LT5zdGF0czsKLX0KLQotLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLwogc3RhdGljIGludAogbXB0X2xhbl9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQogewpAQCAtNTk0LDggKzU4NCw4IEBACiAJY3R4ID0gR0VUX0xBTl9CVUZGRVJfQ09OVEVYVCh0bXNnKTsKIAlzZW50ID0gcHJpdi0+U2VuZEN0bFtjdHhdLnNrYjsKIAotCXByaXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKLQlwcml2LT5zdGF0cy50eF9ieXRlcyArPSBzZW50LT5sZW47CisJZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBzZW50LT5sZW47CiAKIAlkaW9wcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiAlcy8lczogQCVzLCBza2IgJXAgc2VudC5cbiIsCiAJCQlJT0NfQU5EX05FVERFVl9OQU1FU19zX3MoZGV2KSwKQEAgLTYzNiw3ICs2MjYsNyBAQAogCiAJc3dpdGNoIChsZTE2X3RvX2NwdShwU2VuZFJlcC0+SU9DU3RhdHVzKSAmIE1QSV9JT0NTVEFUVVNfTUFTSykgewogCWNhc2UgTVBJX0lPQ1NUQVRVU19TVUNDRVNTOgotCQlwcml2LT5zdGF0cy50eF9wYWNrZXRzICs9IGNvdW50OworCQlkZXYtPnN0YXRzLnR4X3BhY2tldHMgKz0gY291bnQ7CiAJCWJyZWFrOwogCiAJY2FzZSBNUElfSU9DU1RBVFVTX0xBTl9DQU5DRUxFRDoKQEAgLTY0NCwxMyArNjM0LDEzIEBACiAJCWJyZWFrOwogCiAJY2FzZSBNUElfSU9DU1RBVFVTX0lOVkFMSURfU0dMOgotCQlwcml2LT5zdGF0cy50eF9lcnJvcnMgKz0gY291bnQ7CisJCWRldi0+c3RhdHMudHhfZXJyb3JzICs9IGNvdW50OwogCQlwcmludGsgKEtFUk5fRVJSIE1ZTkFNICI6ICVzLyVzOiBFUlJPUiAtIEludmFsaWQgU0dMIHNlbnQgdG8gSU9DIVxuIiwKIAkJCQlJT0NfQU5EX05FVERFVl9OQU1FU19zX3MoZGV2KSk7CiAJCWdvdG8gb3V0OwogCiAJZGVmYXVsdDoKLQkJcHJpdi0+c3RhdHMudHhfZXJyb3JzICs9IGNvdW50OworCQlkZXYtPnN0YXRzLnR4X2Vycm9ycyArPSBjb3VudDsKIAkJYnJlYWs7CiAJfQogCkBAIC02NjEsNyArNjUxLDcgQEAKIAkJY3R4ID0gR0VUX0xBTl9CVUZGRVJfQ09OVEVYVChsZTMyX3RvX2NwdSgqcENvbnRleHQpKTsKIAogCQlzZW50ID0gcHJpdi0+U2VuZEN0bFtjdHhdLnNrYjsKLQkJcHJpdi0+c3RhdHMudHhfYnl0ZXMgKz0gc2VudC0+bGVuOworCQlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNlbnQtPmxlbjsKIAogCQlkaW9wcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiAlcy8lczogQCVzLCBza2IgJXAgc2VudC5cbiIsCiAJCQkJSU9DX0FORF9ORVRERVZfTkFNRVNfc19zKGRldiksCkBAIC04NDIsOCArODMyLDggQEAKIAkJICJkZWxpdmVyZWQgdG8gdXBwZXIgbGV2ZWwuXG4iLAogCQkJSU9DX0FORF9ORVRERVZfTkFNRVNfc19zKGRldiksIHNrYi0+bGVuKSk7CiAKLQlwcml2LT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKLQlwcml2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKIAogCXNrYi0+ZGV2ID0gZGV2OwogCW5ldGlmX3J4KHNrYik7CkBAIC0xMzA4LDYgKzEyOTgsMTQgQEAKIAkJCQkJCSAgcG9zdF9idWNrZXRzX3Rhc2sud29yaykpOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIG1wdF9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbiAgICAgICA9IG1wdF9sYW5fb3BlbiwKKwkubmRvX3N0b3AgICAgICAgPSBtcHRfbGFuX2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdCA9IG1wdF9sYW5fc2R1X3NlbmQsCisJLm5kb19jaGFuZ2VfbXR1ID0gbXB0X2xhbl9jaGFuZ2VfbXR1LAorCS5uZG9fdHhfdGltZW91dCA9IG1wdF9sYW5fdHhfdGltZW91dCwKK307CisKIC8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqCiBtcHRfcmVnaXN0ZXJfbGFuX2RldmljZSAoTVBUX0FEQVBURVIgKm1wdF9kZXYsIGludCBwbnVtKQpAQCAtMTM3MiwxNSArMTM3MCw3IEBACiAJcHJpdi0+dHhfbWF4X291dCA9ICh0eF9tYXhfb3V0X3AgPD0gTVBUX1RYX01BWF9PVVRfTElNKSA/CiAJCQkgICAgdHhfbWF4X291dF9wIDogTVBUX1RYX01BWF9PVVRfTElNOwogCi0JZGV2LT5vcGVuID0gbXB0X2xhbl9vcGVuOwotCWRldi0+c3RvcCA9IG1wdF9sYW5fY2xvc2U7Ci0JZGV2LT5nZXRfc3RhdHMgPSBtcHRfbGFuX2dldF9zdGF0czsKLQlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IE5VTEw7Ci0JZGV2LT5jaGFuZ2VfbXR1ID0gbXB0X2xhbl9jaGFuZ2VfbXR1OwotCWRldi0+aGFyZF9zdGFydF94bWl0ID0gbXB0X2xhbl9zZHVfc2VuZDsKLQotLyogTm90IGluIDIuMy40Mi4gTmVlZCAyLjMuNDUrICovCi0JZGV2LT50eF90aW1lb3V0ID0gbXB0X2xhbl90eF90aW1lb3V0OworCWRldi0+bmV0ZGV2X29wcyA9ICZtcHRfbmV0ZGV2X29wczsKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gTVBUX0xBTl9UWF9USU1FT1VUOwogCiAJZGxwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiBGaW5pc2hlZCByZWdpc3RlcmluZyBkZXYgIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9kZXZpY2UuYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vZGV2aWNlLmMKaW5kZXggNTRjMmU5YS4uMGVlNDI2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2kyby9kZXZpY2UuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2RldmljZS5jCkBAIC01Miw3ICs1Miw2IEBACiAvKioKICAqCWkyb19kZXZpY2VfY2xhaW0gLSBjbGFpbSBhIGRldmljZSBmb3IgdXNlIGJ5IGFuIE9TTQogICoJQGRldjogSTJPIGRldmljZSB0byBjbGFpbQotICoJQGRydjogSTJPIGRyaXZlciB3aGljaCB3YW50cyB0byBjbGFpbSB0aGUgZGV2aWNlCiAgKgogICoJRG8gdGhlIGxlZyB3b3JrIHRvIGFzc2lnbiBhIGRldmljZSB0byBhIGdpdmVuIE9TTS4gSWYgdGhlIGNsYWltIHN1Y2NlZWRzLAogICoJdGhlIG93bmVyIGlzIHRoZSBwcmltYXJ5LiBJZiB0aGUgYXR0ZW1wdCBmYWlscyBhIG5lZ2F0aXZlIGVycm5vIGNvZGUKQEAgLTgwLDcgKzc5LDYgQEAKIC8qKgogICoJaTJvX2RldmljZV9jbGFpbV9yZWxlYXNlIC0gcmVsZWFzZSBhIGRldmljZSB0aGF0IHRoZSBPU00gaXMgdXNpbmcKICAqCUBkZXY6IGRldmljZSB0byByZWxlYXNlCi0gKglAZHJ2OiBkcml2ZXIgd2hpY2ggY2xhaW1lZCB0aGUgZGV2aWNlCiAgKgogICoJRHJvcCBhIGNsYWltIGJ5IGFuIE9TTSBvbiBhIGdpdmVuIEkyTyBkZXZpY2UuCiAgKgpAQCAtMTM0LDcgKzEzMiw3IEBACiB7CiAJc3RydWN0IGkyb19kZXZpY2UgKmkyb19kZXYgPSB0b19pMm9fZGV2aWNlKGRldik7CiAKLQlwcl9kZWJ1ZygiaTJvOiBkZXZpY2UgJXMgcmVsZWFzZWRcbiIsIGRldi0+YnVzX2lkKTsKKwlwcl9kZWJ1ZygiaTJvOiBkZXZpY2UgJXMgcmVsZWFzZWRcbiIsIGRldl9uYW1lKGRldikpOwogCiAJa2ZyZWUoaTJvX2Rldik7CiB9CkBAIC0yMjksOCArMjI3LDggQEAKIAogCWkyb19kZXYtPmxjdF9kYXRhID0gKmVudHJ5OwogCi0Jc25wcmludGYoaTJvX2Rldi0+ZGV2aWNlLmJ1c19pZCwgQlVTX0lEX1NJWkUsICIlZDolMDN4IiwgYy0+dW5pdCwKLQkJIGkyb19kZXYtPmxjdF9kYXRhLnRpZCk7CisJZGV2X3NldF9uYW1lKCZpMm9fZGV2LT5kZXZpY2UsICIlZDolMDN4IiwgYy0+dW5pdCwKKwkJICAgICBpMm9fZGV2LT5sY3RfZGF0YS50aWQpOwogCiAJaTJvX2Rldi0+aW9wID0gYzsKIAlpMm9fZGV2LT5kZXZpY2UucGFyZW50ID0gJmMtPmRldmljZTsKQEAgLTI4MSw3ICsyNzksNyBAQAogCiAJaTJvX2RyaXZlcl9ub3RpZnlfZGV2aWNlX2FkZF9hbGwoaTJvX2Rldik7CiAKLQlwcl9kZWJ1ZygiaTJvOiBkZXZpY2UgJXMgYWRkZWRcbiIsIGkyb19kZXYtPmRldmljZS5idXNfaWQpOworCXByX2RlYnVnKCJpMm86IGRldmljZSAlcyBhZGRlZFxuIiwgZGV2X25hbWUoJmkyb19kZXYtPmRldmljZSkpOwogCiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vZHJpdmVyLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2RyaXZlci5jCmluZGV4IGUwZDQ3NGIuLmEwNDIxZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vZHJpdmVyLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9kcml2ZXIuYwpAQCAtMTczLDcgKzE3Myw2IEBACiAgKglpMm9fZHJpdmVyX2Rpc3BhdGNoIC0gZGlzcGF0Y2ggYW4gSTJPIHJlcGx5IG1lc3NhZ2UKICAqCUBjOiBJMk8gY29udHJvbGxlciBvZiB0aGUgbWVzc2FnZQogICoJQG06IEkyTyBtZXNzYWdlIG51bWJlcgotICoJQG1zZzogSTJPIG1lc3NhZ2UgdG8gYmUgZGVsaXZlcmVkCiAgKgogICoJVGhlIHJlcGx5IGlzIGRlbGl2ZXJlZCB0byB0aGUgZHJpdmVyIGZyb20gd2hpY2ggdGhlIG9yaWdpbmFsIG1lc3NhZ2UKICAqCXdhcy4gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBmcm9tIGludGVycnVwdCBjb250ZXh0LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9leGVjLW9zbS5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9leGVjLW9zbS5jCmluZGV4IDU2ZmFlZjEuLjA2YzY1NWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vZXhlYy1vc20uYworKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2V4ZWMtb3NtLmMKQEAgLTE5LDcgKzE5LDcgQEAKICAqCQlBdXZvIEjDpGtraW5lbiA8QXV2by5IYWtraW5lbkBjcy5IZWxzaW5raS5GST4KICAqCQlEZWVwYWsgU2F4ZW5hIDxkZWVwYWtAcGxleGl0eS5uZXQ+CiAgKgkJQm9qaSBUIEthbm5hbnRoYW5hbSA8Ym9qaS50Lmthbm5hbnRoYW5hbUBpbnRlbC5jb20+Ci0gKgkJQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT46CisgKgkJQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az46CiAgKgkJCVBvcnRlZCB0byBMaW51eCAyLjUuCiAgKgkJTWFya3VzIExpZGVsIDxNYXJrdXMuTGlkZWxAc2hhZG93Y29ubmVjdC5jb20+OgogICoJCQlNaW5vciBmaXhlcyBmb3IgMi42LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fY29uZmlnLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19jb25maWcuYwppbmRleCBmMzM4NGMzLi5lZmJhNzAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19jb25maWcuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19jb25maWcuYwpAQCAtMTksNyArMTksNyBAQAogICoJCUNoYW5nZWQgaW9jdGxfc3dkbCgpLCBpbXBsZW1lbnRlZCBpb2N0bF9zd3VsKCkgYW5kIGlvY3RsX3N3ZGVsKCkKICAqCURlZXBhayBTYXhlbmEgKDExLzE4LzE5OTkpOgogICoJCUFkZGVkIGV2ZW50IG1hbmFnbWVuZXQgc3VwcG9ydAotICoJQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT46CisgKglBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPjoKICAqCQkyLjQgcmV3cml0ZSBwb3J0ZWQgdG8gMi41CiAgKglNYXJrdXMgTGlkZWwgPE1hcmt1cy5MaWRlbEBzaGFkb3djb25uZWN0LmNvbT46CiAgKgkJQWRkZWQgcGFzcy10aHJ1IHN1cHBvcnQgZm9yIEFkYXB0ZWMncyByYWlkdXRpbHMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX3Byb2MuYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX3Byb2MuYwppbmRleCA1NGEzMDE2Li45YTM2YjVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19wcm9jLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fcHJvYy5jCkBAIC0xMzAwLDcgKzEzMDAsNyBAQAogewogCXN0cnVjdCBpMm9fZGV2aWNlICpkID0gKHN0cnVjdCBpMm9fZGV2aWNlICopc2VxLT5wcml2YXRlOwogCi0Jc2VxX3ByaW50ZihzZXEsICIlc1xuIiwgZC0+ZGV2aWNlLmJ1c19pZCk7CisJc2VxX3ByaW50ZihzZXEsICIlc1xuIiwgZGV2X25hbWUoJmQtPmRldmljZSkpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19zY3NpLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19zY3NpLmMKaW5kZXggMWJjZGJiYi4uM2Q0NTgxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fc2NzaS5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX3Njc2kuYwpAQCAtMzkwLDcgKzM5MCw3IEBACiAgKglAaTJvX2RldjogdGhlIEkyTyBkZXZpY2Ugd2hpY2ggd2FzIGFkZGVkCiAgKgogICoJSWYgYSBJMk8gZGV2aWNlIGlzIGFkZGVkIHdlIGNhdGNoIHRoZSBub3RpZmljYXRpb24sIGJlY2F1c2UgSTJPIGNsYXNzZXMKLSAqCW90aGVyIHRoZW4gU0NTSSBwZXJpcGhlcmFsIHdpbGwgbm90IGJlIHJlY2VpdmVkIHRocm91Z2gKKyAqCW90aGVyIHRoYW4gU0NTSSBwZXJpcGhlcmFsIHdpbGwgbm90IGJlIHJlY2VpdmVkIHRocm91Z2gKICAqCWkyb19zY3NpX3Byb2JlKCkuCiAgKi8KIHN0YXRpYyB2b2lkIGkyb19zY3NpX25vdGlmeV9kZXZpY2VfYWRkKHN0cnVjdCBpMm9fZGV2aWNlICppMm9fZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9pb3AuYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vaW9wLmMKaW5kZXggNmU1M2EzMC4uMjdjZjRhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2kyby9pb3AuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2lvcC5jCkBAIC0xOSw3ICsxOSw3IEBACiAgKgkJQXV2byBIw6Rra2luZW4gPEF1dm8uSGFra2luZW5AY3MuSGVsc2lua2kuRkk+CiAgKgkJRGVlcGFrIFNheGVuYSA8ZGVlcGFrQHBsZXhpdHkubmV0PgogICoJCUJvamkgVCBLYW5uYW50aGFuYW0gPGJvamkudC5rYW5uYW50aGFuYW1AaW50ZWwuY29tPgotICoJCUFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+OgorICoJCUFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+OgogICoJCQlQb3J0ZWQgdG8gTGludXggMi41LgogICoJCU1hcmt1cyBMaWRlbCA8TWFya3VzLkxpZGVsQHNoYWRvd2Nvbm5lY3QuY29tPjoKICAqCQkJTWlub3IgZml4ZXMgZm9yIDIuNi4KQEAgLTEwNzIsNyArMTA3Miw3IEBACiAKIAljLT5kZXZpY2UucmVsZWFzZSA9ICZpMm9faW9wX3JlbGVhc2U7CiAKLQlzbnByaW50ZihjLT5kZXZpY2UuYnVzX2lkLCBCVVNfSURfU0laRSwgImlvcCVkIiwgYy0+dW5pdCk7CisJZGV2X3NldF9uYW1lKCZjLT5kZXZpY2UsICJpb3AlZCIsIGMtPnVuaXQpOwogCiAjaWYgQklUU19QRVJfTE9ORyA9PSA2NAogCXNwaW5fbG9ja19pbml0KCZjLT5jb250ZXh0X2xpc3RfbG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvaTJvL3BjaS5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9wY2kuYwppbmRleCA2MTBlZjEyLi4yNWQ2ZjIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvaTJvL3BjaS5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vcGNpLmMKQEAgLTE5LDcgKzE5LDcgQEAKICAqCQlBdXZvIEjDpGtraW5lbiA8QXV2by5IYWtraW5lbkBjcy5IZWxzaW5raS5GST4KICAqCQlEZWVwYWsgU2F4ZW5hIDxkZWVwYWtAcGxleGl0eS5uZXQ+CiAgKgkJQm9qaSBUIEthbm5hbnRoYW5hbSA8Ym9qaS50Lmthbm5hbnRoYW5hbUBpbnRlbC5jb20+Ci0gKgkJQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT46CisgKgkJQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az46CiAgKgkJCVBvcnRlZCB0byBMaW51eCAyLjUuCiAgKgkJTWFya3VzIExpZGVsIDxNYXJrdXMuTGlkZWxAc2hhZG93Y29ubmVjdC5jb20+OgogICoJCQlNaW5vciBmaXhlcyBmb3IgMi42LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvS2NvbmZpZyBiL2RyaXZlcnMvbWZkL0tjb25maWcKaW5kZXggMjU3Mjc3My4uNDE2ZjllNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvS2NvbmZpZworKysgYi9kcml2ZXJzL21mZC9LY29uZmlnCkBAIC0zNCw2ICszNCwxNCBAQAogCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIEFTSUMzIG11bHRpZnVuY3Rpb24gY2hpcCBmb3VuZCBvbiBtYW55CiAJICBQREFzIChtYWlubHkgaVBBUSBhbmQgSFRDIGJhc2VkIG9uZXMpCiAKK2NvbmZpZyBNRkRfRE0zNTVFVk1fTVNQCisJYm9vbCAiRGFWaW5jaSBETTM1NSBFVk0gbWljcm9jb250cm9sbGVyIgorCWRlcGVuZHMgb24gSTJDICYmIE1BQ0hfREFWSU5DSV9ETTM1NV9FVk0KKwloZWxwCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgTVNQNDMwIG1pY3JvY29udHJvbGxlciB1c2VkIG9uIHRoZXNlCisJICBib2FyZHMuICBNU1A0MzAgZmlybXdhcmUgbWFuYWdlcyByZXNldHMgYW5kIHBvd2VyIHNlcXVlbmNpbmcsCisJICBpbnB1dHMgZnJvbSBidXR0b25zIGFuZCB0aGUgSVIgcmVtb3RlLCBMRURzLCBhbiBSVEMsIGFuZCBtb3JlLgorCiBjb25maWcgSFRDX0VHUElPCiAJYm9vbCAiSFRDIEVHUElPIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBHRU5FUklDX0hBUkRJUlFTICYmIEdQSU9MSUIgJiYgQVJNCkBAIC02MSw5ICs2OSwzMiBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdWNiMTQwMF9jb3JlLgogCitjb25maWcgVFBTNjUwMTAKKwl0cmlzdGF0ZSAiVFBTNjUwMXggUG93ZXIgTWFuYWdlbWVudCBjaGlwcyIKKwlkZXBlbmRzIG9uIEkyQyAmJiBHUElPTElCCisJZGVmYXVsdCB5IGlmIE1BQ0hfT01BUF9IMiB8fCBNQUNIX09NQVBfSDMgfHwgTUFDSF9PTUFQX09TSworCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgVFBTNjUwMXggc2VyaWVzIG9mCisJICBQb3dlciBNYW5hZ2VtZW50IGNoaXBzLiAgVGhlc2UgaW5jbHVkZSB2b2x0YWdlIHJlZ3VsYXRvcnMsCisJICBsaXRoaXVtIGlvbi9wb2x5bWVyIGJhdHRlcnkgY2hhcmdpbmcsIGFuZCBvdGhlciBmZWF0dXJlcyB0aGF0CisJICBhcmUgb2Z0ZW4gdXNlZCBpbiBwb3J0YWJsZSBkZXZpY2VzIGxpa2UgY2VsbCBwaG9uZXMgYW5kIGNhbWVyYXMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHRwczY1MDEwLgorCitjb25maWcgTUVORUxBVVMKKwlib29sICJUZXhhcyBJbnN0cnVtZW50cyBUV0w5MjMzMC9NZW5lbGF1cyBQTSBjaGlwIgorCWRlcGVuZHMgb24gSTJDPXkgJiYgQVJDSF9PTUFQMjRYWAorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgVGV4YXMgSW5zdHJ1bWVudHMKKwkgIFRXTDkyMzMwL01lbmVsYXVzIFBvd2VyIE1hbmFnZW1lbnQgY2hpcC4gVGhpcyBpbmNsdWRlIHZvbHRhZ2UKKwkgIHJlZ3VsYXRvcnMsIER1YWwgc2xvdCBtZW1vcnkgY2FyZCB0cmFuY2VpdmVycywgcmVhbC10aW1lIGNsb2NrCisJICBhbmQgb3RoZXIgZmVhdHVyZXMgdGhhdCBhcmUgb2Z0ZW4gdXNlZCBpbiBwb3J0YWJsZSBkZXZpY2VzIGxpa2UKKwkgIGNlbGwgcGhvbmVzIGFuZCBQREFzLgorCiBjb25maWcgVFdMNDAzMF9DT1JFCiAJYm9vbCAiVGV4YXMgSW5zdHJ1bWVudHMgVFdMNDAzMC9UUFM2NTl4MCBTdXBwb3J0IgotCWRlcGVuZHMgb24gSTJDPXkgJiYgR0VORVJJQ19IQVJESVJRUyAmJiAoQVJDSF9PTUFQMiB8fCBBUkNIX09NQVAzKQorCWRlcGVuZHMgb24gSTJDPXkgJiYgR0VORVJJQ19IQVJESVJRUwogCWhlbHAKIAkgIFNheSB5ZXMgaGVyZSBpZiB5b3UgaGF2ZSBUV0w0MDMwIGZhbWlseSBjaGlwIG9uIHlvdXIgYm9hcmQuCiAJICBUaGlzIGNvcmUgZHJpdmVyIHByb3ZpZGVzIHJlZ2lzdGVyIGFjY2VzcyBhbmQgSVJRIGhhbmRsaW5nCkBAIC0xMTYsNiArMTQ3LDcgQEAKIAogY29uZmlnIE1GRF9XTTg0MDAKIAl0cmlzdGF0ZSAiU3VwcG9ydCBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgV004NDAwIgorCXNlbGVjdCBNRkRfQ09SRQogCWRlcGVuZHMgb24gSTJDCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgdGhlIFdvbGZzb24gTWljcm9lbGVjcm9uaWNzIFdNODQwMCBQTUlDIGFuZCBhdWRpbwpAQCAtMTQyLDYgKzE3NCwzOCBAQAogCWJvb2wKIAlkZXBlbmRzIG9uIE1GRF9XTTgzNTAKIAorY29uZmlnIE1GRF9XTTgzNTFfQ09ORklHX01PREVfMAorCWJvb2wKKwlkZXBlbmRzIG9uIE1GRF9XTTgzNTAKKworY29uZmlnIE1GRF9XTTgzNTFfQ09ORklHX01PREVfMQorCWJvb2wKKwlkZXBlbmRzIG9uIE1GRF9XTTgzNTAKKworY29uZmlnIE1GRF9XTTgzNTFfQ09ORklHX01PREVfMgorCWJvb2wKKwlkZXBlbmRzIG9uIE1GRF9XTTgzNTAKKworY29uZmlnIE1GRF9XTTgzNTFfQ09ORklHX01PREVfMworCWJvb2wKKwlkZXBlbmRzIG9uIE1GRF9XTTgzNTAKKworY29uZmlnIE1GRF9XTTgzNTJfQ09ORklHX01PREVfMAorCWJvb2wKKwlkZXBlbmRzIG9uIE1GRF9XTTgzNTAKKworY29uZmlnIE1GRF9XTTgzNTJfQ09ORklHX01PREVfMQorCWJvb2wKKwlkZXBlbmRzIG9uIE1GRF9XTTgzNTAKKworY29uZmlnIE1GRF9XTTgzNTJfQ09ORklHX01PREVfMgorCWJvb2wKKwlkZXBlbmRzIG9uIE1GRF9XTTgzNTAKKworY29uZmlnIE1GRF9XTTgzNTJfQ09ORklHX01PREVfMworCWJvb2wKKwlkZXBlbmRzIG9uIE1GRF9XTTgzNTAKKwogY29uZmlnIE1GRF9XTTgzNTBfSTJDCiAJdHJpc3RhdGUgIlN1cHBvcnQgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFdNODM1MCB3aXRoIEkyQyIKIAlzZWxlY3QgTUZEX1dNODM1MApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvTWFrZWZpbGUgYi9kcml2ZXJzL21mZC9NYWtlZmlsZQppbmRleCA5YTVhZDhhLi4wYzk0MThiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21mZC9NYWtlZmlsZQpAQCAtOCw2ICs4LDggQEAKIG9iai0kKENPTkZJR19IVENfRUdQSU8pCQkrPSBodGMtZWdwaW8ubwogb2JqLSQoQ09ORklHX0hUQ19QQVNJQzMpCSs9IGh0Yy1wYXNpYzMubwogCitvYmotJChDT05GSUdfTUZEX0RNMzU1RVZNX01TUCkJKz0gZG0zNTVldm1fbXNwLm8KKwogb2JqLSQoQ09ORklHX01GRF9UN0w2NlhCKQkrPSB0N2w2NnhiLm8KIG9iai0kKENPTkZJR19NRkRfVEM2Mzg3WEIpCSs9IHRjNjM4N3hiLm8KIG9iai0kKENPTkZJR19NRkRfVEM2MzkzWEIpCSs9IHRjNjM5M3hiLm8KQEAgLTE3LDYgKzE5LDkgQEAKIG9iai0kKENPTkZJR19NRkRfV004MzUwKQkrPSB3bTgzNTAubwogb2JqLSQoQ09ORklHX01GRF9XTTgzNTBfSTJDKQkrPSB3bTgzNTAtaTJjLm8KIAorb2JqLSQoQ09ORklHX1RQUzY1MDEwKQkJKz0gdHBzNjUwMTAubworb2JqLSQoQ09ORklHX01FTkVMQVVTKQkJKz0gbWVuZWxhdXMubworCiBvYmotJChDT05GSUdfVFdMNDAzMF9DT1JFKQkrPSB0d2w0MDMwLWNvcmUubyB0d2w0MDMwLWlycS5vCiAKIG9iai0kKENPTkZJR19NRkRfQ09SRSkJCSs9IG1mZC1jb3JlLm8KQEAgLTMxLDQgKzM2LDQgQEAKIGVuZGlmCiBvYmotJChDT05GSUdfVUNCMTQwMF9DT1JFKQkrPSB1Y2IxNDAwX2NvcmUubwogCi1vYmotJChDT05GSUdfUE1JQ19EQTkwM1gpCSs9IGRhOTAzeC5vClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorb2JqLSQoQ09ORklHX1BNSUNfREE5MDNYKQkrPSBkYTkwM3gubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvZGE5MDN4LmMgYi9kcml2ZXJzL21mZC9kYTkwM3guYwppbmRleCAwYjViZDg1Li45OWY4ZGNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9kYTkwM3guYworKysgYi9kcml2ZXJzL21mZC9kYTkwM3guYwpAQCAtMTUxLDEyICsxNTEsMjQgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGRhOTAzeF93cml0ZSk7CiAKK2ludCBkYTkwM3hfd3JpdGVzKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHJlZywgaW50IGxlbiwgdWludDhfdCAqdmFsKQoreworCXJldHVybiBfX2RhOTAzeF93cml0ZXModG9faTJjX2NsaWVudChkZXYpLCByZWcsIGxlbiwgdmFsKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRhOTAzeF93cml0ZXMpOworCiBpbnQgZGE5MDN4X3JlYWQoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgcmVnLCB1aW50OF90ICp2YWwpCiB7CiAJcmV0dXJuIF9fZGE5MDN4X3JlYWQodG9faTJjX2NsaWVudChkZXYpLCByZWcsIHZhbCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChkYTkwM3hfcmVhZCk7CiAKK2ludCBkYTkwM3hfcmVhZHMoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgcmVnLCBpbnQgbGVuLCB1aW50OF90ICp2YWwpCit7CisJcmV0dXJuIF9fZGE5MDN4X3JlYWRzKHRvX2kyY19jbGllbnQoZGV2KSwgcmVnLCBsZW4sIHZhbCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkYTkwM3hfcmVhZHMpOworCiBpbnQgZGE5MDN4X3NldF9iaXRzKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHJlZywgdWludDhfdCBiaXRfbWFzaykKIHsKIAlzdHJ1Y3QgZGE5MDN4X2NoaXAgKmNoaXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKQEAgLTQzNSwxMyArNDQ3LDEzIEBACiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGRhOTAzeF9pZF90YWJsZSk7CiAKLXN0YXRpYyBpbnQgX19kZXZleGl0IF9fcmVtb3ZlX3N1YmRldihzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnVudXNlZCkKK3N0YXRpYyBpbnQgX19yZW1vdmVfc3ViZGV2KHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqdW51c2VkKQogewogCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHRvX3BsYXRmb3JtX2RldmljZShkZXYpKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2RldmV4aXQgZGE5MDN4X3JlbW92ZV9zdWJkZXZzKHN0cnVjdCBkYTkwM3hfY2hpcCAqY2hpcCkKK3N0YXRpYyBpbnQgZGE5MDN4X3JlbW92ZV9zdWJkZXZzKHN0cnVjdCBkYTkwM3hfY2hpcCAqY2hpcCkKIHsKIAlyZXR1cm4gZGV2aWNlX2Zvcl9lYWNoX2NoaWxkKGNoaXAtPmRldiwgTlVMTCwgX19yZW1vdmVfc3ViZGV2KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2RtMzU1ZXZtX21zcC5jIGIvZHJpdmVycy9tZmQvZG0zNTVldm1fbXNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIxNGIzZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWZkL2RtMzU1ZXZtX21zcC5jCkBAIC0wLDAgKzEsNDIwIEBACisvKgorICogZG0zNTVldm1fbXNwLmMgLSBkcml2ZXIgZm9yIE1TUDQzMCBmaXJtd2FyZSBvbiBETTM1NUVWTSBib2FyZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBEYXZpZCBCcm93bmVsbAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjL2RtMzU1ZXZtX21zcC5oPgorCisKKy8qCisgKiBUaGUgRE0zNTUgaXMgYSBEYVZpbmNpIGNoaXAgd2l0aCB2aWRlbyBzdXBwb3J0IGJ1dCBubyBDNjQrIERTUC4gIEl0cworICogRVZNIGJvYXJkIGhhcyBhbiBNU1A0MzAgcHJvZ3JhbW1lZCB3aXRoIGZpcm13YXJlIGZvciB2YXJpb3VzIGJvYXJkCisgKiBzdXBwb3J0IGZ1bmN0aW9ucy4gIFRoaXMgZHJpdmVyIGV4cG9zZXMgc29tZSBvZiB0aGVtIGRpcmVjdGx5LCBhbmQKKyAqIHN1cHBvcnRzIG90aGVyIGRyaXZlcnMgKGUuZy4gUlRDLCBpbnB1dCkgZm9yIG1vcmUgY29tcGxleCBhY2Nlc3MuCisgKgorICogQmVjYXVzZSB0aGlzIGZpcm13YXJlIGlzIGVudGlyZWx5IGJvYXJkLXNwZWNpZmljLCB0aGlzIGZpbGUgZW1iZWRzCisgKiBrbm93bGVkZ2UgdGhhdCB3b3VsZCBiZSBwYXNzZWQgYXMgcGxhdGZvcm1fZGF0YSBpbiBhIGdlbmVyaWMgZHJpdmVyLgorICoKKyAqIFRoaXMgZHJpdmVyIHdhcyB0ZXN0ZWQgd2l0aCBmaXJtd2FyZSByZXZpc2lvbiBBNC4KKyAqLworCisjaWYgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfRE0zNTVFVk0pIFwKKwkJfHwgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfRE0zNTVFVk1fTU9EVUxFKQorI2RlZmluZSBtc3BfaGFzX2tleWJvYXJkKCkJdHJ1ZQorI2Vsc2UKKyNkZWZpbmUgbXNwX2hhc19rZXlib2FyZCgpCWZhbHNlCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0xFRFNfR1BJTykgfHwgZGVmaW5lZChDT05GSUdfTEVEU19HUElPX01PRFVMRSkKKyNkZWZpbmUgbXNwX2hhc19sZWRzKCkJCXRydWUKKyNlbHNlCisjZGVmaW5lIG1zcF9oYXNfbGVkcygpCQlmYWxzZQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19SVENfRFJWX0RNMzU1RVZNKSB8fCBkZWZpbmVkKENPTkZJR19SVENfRFJWX0RNMzU1RVZNX01PRFVMRSkKKyNkZWZpbmUgbXNwX2hhc19ydGMoKQkJdHJ1ZQorI2Vsc2UKKyNkZWZpbmUgbXNwX2hhc19ydGMoKQkJZmFsc2UKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfVklERU9fVFZQNTE0WCkgfHwgZGVmaW5lZChDT05GSUdfVklERU9fVFZQNTE0WF9NT0RVTEUpCisjZGVmaW5lIG1zcF9oYXNfdHZwKCkJCXRydWUKKyNlbHNlCisjZGVmaW5lIG1zcF9oYXNfdHZwKCkJCWZhbHNlCisjZW5kaWYKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBSRVZJU0lUIGZvciBwYXJhbm9pYSdzIHNha2UsIHJldHJ5IHJlYWRzL3dyaXRlcyBvbiBlcnJvciAqLworCitzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgKm1zcDQzMDsKKworLyoqCisgKiBkbTM1NWV2bV9tc3Bfd3JpdGUgLSBXcml0ZXMgYSByZWdpc3RlciBpbiBkbTM1NWV2bV9tc3AKKyAqIEB2YWx1ZTogdGhlIHZhbHVlIHRvIGJlIHdyaXR0ZW4KKyAqIEByZWc6IHJlZ2lzdGVyIGFkZHJlc3MKKyAqCisgKiBSZXR1cm5zIHJlc3VsdCBvZiBvcGVyYXRpb24gLSAwIGlzIHN1Y2Nlc3MsIGVsc2UgbmVnYXRpdmUgZXJybm8KKyAqLworaW50IGRtMzU1ZXZtX21zcF93cml0ZSh1OCB2YWx1ZSwgdTggcmVnKQoreworCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKG1zcDQzMCwgcmVnLCB2YWx1ZSk7Cit9CitFWFBPUlRfU1lNQk9MKGRtMzU1ZXZtX21zcF93cml0ZSk7CisKKy8qKgorICogZG0zNTVldm1fbXNwX3JlYWQgLSBSZWFkcyBhIHJlZ2lzdGVyIGZyb20gZG0zNTVldm1fbXNwCisgKiBAcmVnOiByZWdpc3RlciBhZGRyZXNzCisgKgorICogUmV0dXJucyByZXN1bHQgb2Ygb3BlcmF0aW9uIC0gdmFsdWUsIG9yIG5lZ2F0aXZlIGVycm5vCisgKi8KK2ludCBkbTM1NWV2bV9tc3BfcmVhZCh1OCByZWcpCit7CisJcmV0dXJuIGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShtc3A0MzAsIHJlZyk7Cit9CitFWFBPUlRfU1lNQk9MKGRtMzU1ZXZtX21zcF9yZWFkKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIE1hbnkgb2YgdGhlIG1zcDQzMCBwaW5zIGFyZSBqdXN0IHVzZWQgYXMgZml4ZWQtZGlyZWN0aW9uIEdQSU9zLgorICogV2UgY291bGQgZXhwb3J0IGEgZmV3IG1vcmUgb2YgdGhlbSB0aGlzIHdheSwgaWYgd2Ugd2FudGVkLgorICovCisjZGVmaW5lIE1TUF9HUElPKGJpdCxyZWcpCSgoRE0zNTVFVk1fTVNQXyAjIyByZWcpIDw8IDMgfCAoYml0KSkKKworc3RhdGljIGNvbnN0IHU4IG1zcF9ncGlvc1tdID0geworCS8qIGVpZ2h0IGxlZHMgKi8KKwlNU1BfR1BJTygwLCBMRUQpLCBNU1BfR1BJTygxLCBMRUQpLAorCU1TUF9HUElPKDIsIExFRCksIE1TUF9HUElPKDMsIExFRCksCisJTVNQX0dQSU8oNCwgTEVEKSwgTVNQX0dQSU8oNSwgTEVEKSwKKwlNU1BfR1BJTyg2LCBMRUQpLCBNU1BfR1BJTyg3LCBMRUQpLAorCS8qIFNXNiBhbmQgdGhlIE5UU0MvblBBTCBqdW1wZXIgKi8KKwlNU1BfR1BJTygwLCBTV0lUQ0gxKSwgTVNQX0dQSU8oMSwgU1dJVENIMSksCisJTVNQX0dQSU8oMiwgU1dJVENIMSksIE1TUF9HUElPKDMsIFNXSVRDSDEpLAorCU1TUF9HUElPKDQsIFNXSVRDSDEpLAorfTsKKworI2RlZmluZSBNU1BfR1BJT19SRUcob2Zmc2V0KQkobXNwX2dwaW9zWyhvZmZzZXQpXSA+PiAzKQorI2RlZmluZSBNU1BfR1BJT19NQVNLKG9mZnNldCkJQklUKG1zcF9ncGlvc1sob2Zmc2V0KV0gJiAweDA3KQorCitzdGF0aWMgaW50IG1zcF9ncGlvX2luKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzd2l0Y2ggKE1TUF9HUElPX1JFRyhvZmZzZXQpKSB7CisJY2FzZSBETTM1NUVWTV9NU1BfU1dJVENIMToKKwljYXNlIERNMzU1RVZNX01TUF9TV0lUQ0gyOgorCWNhc2UgRE0zNTVFVk1fTVNQX1NETU1DOgorCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyB1OCBtc3BfbGVkX2NhY2hlOworCitzdGF0aWMgaW50IG1zcF9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJaW50IHJlZywgc3RhdHVzOworCisJcmVnID0gTVNQX0dQSU9fUkVHKG9mZnNldCk7CisJc3RhdHVzID0gZG0zNTVldm1fbXNwX3JlYWQocmVnKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKwlpZiAocmVnID09IERNMzU1RVZNX01TUF9MRUQpCisJCW1zcF9sZWRfY2FjaGUgPSBzdGF0dXM7CisJcmV0dXJuIHN0YXR1cyAmIE1TUF9HUElPX01BU0sob2Zmc2V0KTsKK30KKworc3RhdGljIGludCBtc3BfZ3Bpb19vdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCit7CisJaW50IG1hc2ssIGJpdHM7CisKKwkvKiBOT1RFOiAgdGhlcmUgYXJlIHNvbWUgb3RoZXIgc2lnbmFscyB0aGF0IGNvdWxkIGJlCisJICogcGFja2FnZWQgYXMgb3V0cHV0IEdQSU9zLCBidXQgdGhleSBhcmVuJ3QgYXMgdXNlZnVsCisJICogYXMgdGhlIExFRHMgLi4uIHNvIGZvciBub3cgd2UgZG9uJ3QuCisJICovCisJaWYgKE1TUF9HUElPX1JFRyhvZmZzZXQpICE9IERNMzU1RVZNX01TUF9MRUQpCisJCXJldHVybiAtRUlOVkFMOworCisJbWFzayA9IE1TUF9HUElPX01BU0sob2Zmc2V0KTsKKwliaXRzID0gbXNwX2xlZF9jYWNoZTsKKworCWJpdHMgJj0gfm1hc2s7CisJaWYgKHZhbHVlKQorCQliaXRzIHw9IG1hc2s7CisJbXNwX2xlZF9jYWNoZSA9IGJpdHM7CisKKwlyZXR1cm4gZG0zNTVldm1fbXNwX3dyaXRlKGJpdHMsIERNMzU1RVZNX01TUF9MRUQpOworfQorCitzdGF0aWMgdm9pZCBtc3BfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCit7CisJbXNwX2dwaW9fb3V0KGNoaXAsIG9mZnNldCwgdmFsdWUpOworfQorCitzdGF0aWMgc3RydWN0IGdwaW9fY2hpcCBkbTM1NWV2bV9tc3BfZ3BpbyA9IHsKKwkubGFiZWwJCQk9ICJkbTM1NWV2bV9tc3AiLAorCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLmRpcmVjdGlvbl9pbnB1dAk9IG1zcF9ncGlvX2luLAorCS5nZXQJCQk9IG1zcF9ncGlvX2dldCwKKwkuZGlyZWN0aW9uX291dHB1dAk9IG1zcF9ncGlvX291dCwKKwkuc2V0CQkJPSBtc3BfZ3Bpb19zZXQsCisJLmJhc2UJCQk9IC1FSU5WQUwsCQkvKiBkeW5hbWljIGFzc2lnbm1lbnQgKi8KKwkubmdwaW8JCQk9IEFSUkFZX1NJWkUobXNwX2dwaW9zKSwKKwkuY2FuX3NsZWVwCQk9IHRydWUsCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgc3RydWN0IGRldmljZSAqYWRkX2NoaWxkKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGNvbnN0IGNoYXIgKm5hbWUsCisJCXZvaWQgKnBkYXRhLCB1bnNpZ25lZCBwZGF0YV9sZW4sCisJCWJvb2wgY2FuX3dha2V1cCwgaW50IGlycSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpwZGV2OworCWludAkJCXN0YXR1czsKKworCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MobmFtZSwgLTEpOworCWlmICghcGRldikgeworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgImNhbid0IGFsbG9jIGRldlxuIik7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKworCWRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2LCBjYW5fd2FrZXVwKTsKKwlwZGV2LT5kZXYucGFyZW50ID0gJmNsaWVudC0+ZGV2OworCisJaWYgKHBkYXRhKSB7CisJCXN0YXR1cyA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShwZGV2LCBwZGF0YSwgcGRhdGFfbGVuKTsKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCWRldl9kYmcoJnBkZXYtPmRldiwgImNhbid0IGFkZCBwbGF0Zm9ybV9kYXRhXG4iKTsKKwkJCWdvdG8gZXJyOworCQl9CisJfQorCisJaWYgKGlycSkgeworCQlzdHJ1Y3QgcmVzb3VyY2UgciA9IHsKKwkJCS5zdGFydCA9IGlycSwKKwkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQl9OworCisJCXN0YXR1cyA9IHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKHBkZXYsICZyLCAxKTsKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCWRldl9kYmcoJnBkZXYtPmRldiwgImNhbid0IGFkZCBpcnFcbiIpOworCQkJZ290byBlcnI7CisJCX0KKwl9CisKKwlzdGF0dXMgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOworCitlcnI6CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJcGxhdGZvcm1fZGV2aWNlX3B1dChwZGV2KTsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJjYW4ndCBhZGQgJXMgZGV2XG4iLCBuYW1lKTsKKwkJcmV0dXJuIEVSUl9QVFIoc3RhdHVzKTsKKwl9CisJcmV0dXJuICZwZGV2LT5kZXY7Cit9CisKK3N0YXRpYyBpbnQgYWRkX2NoaWxkcmVuKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJCWludCBvZmZzZXQ7CisJCWNoYXIgKmxhYmVsOworCX0gY29uZmlnX2lucHV0c1tdID0geworCQkvKiA4ID09IHJpZ2h0IGFmdGVyIHRoZSBMRURzICovCisJCXsgOCArIDAsICJzdzZfMSIsIH0sCisJCXsgOCArIDEsICJzdzZfMiIsIH0sCisJCXsgOCArIDIsICJzdzZfMyIsIH0sCisJCXsgOCArIDMsICJzdzZfNCIsIH0sCisJCXsgOCArIDQsICJOVFNDL25QQUwiLCB9LAorCX07CisKKwlzdHJ1Y3QgZGV2aWNlCSpjaGlsZDsKKwlpbnQJCXN0YXR1czsKKwlpbnQJCWk7CisKKwkvKiBHUElPLWlzaCBzdHVmZiAqLworCWRtMzU1ZXZtX21zcF9ncGlvLmRldiA9ICZjbGllbnQtPmRldjsKKwlzdGF0dXMgPSBncGlvY2hpcF9hZGQoJmRtMzU1ZXZtX21zcF9ncGlvKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKworCS8qIExFRCBvdXRwdXQgKi8KKwlpZiAobXNwX2hhc19sZWRzKCkpIHsKKyNkZWZpbmUgR1BJT19MRUQobCkJLm5hbWUgPSBsLCAuYWN0aXZlX2xvdyA9IHRydWUKKwkJc3RhdGljIHN0cnVjdCBncGlvX2xlZCBldm1fbGVkc1tdID0geworCQkJeyBHUElPX0xFRCgiZG0zNTVldm06OmRzMTQiKSwKKwkJCQkuZGVmYXVsdF90cmlnZ2VyID0gImhlYXJ0YmVhdCIsIH0sCisJCQl7IEdQSU9fTEVEKCJkbTM1NWV2bTo6ZHMxNSIpLAorCQkJCS5kZWZhdWx0X3RyaWdnZXIgPSAibW1jMCIsIH0sCisJCQl7IEdQSU9fTEVEKCJkbTM1NWV2bTo6ZHMxNiIpLAorCQkJCS8qIGNvdWxkIGFsc28gYmUgYSBDRS1BVEEgZHJpdmUgKi8KKwkJCQkuZGVmYXVsdF90cmlnZ2VyID0gIm1tYzEiLCB9LAorCQkJeyBHUElPX0xFRCgiZG0zNTVldm06OmRzMTciKSwKKwkJCQkuZGVmYXVsdF90cmlnZ2VyID0gIm5hbmQtZGlzayIsIH0sCisJCQl7IEdQSU9fTEVEKCJkbTM1NWV2bTo6ZHMxOCIpLCB9LAorCQkJeyBHUElPX0xFRCgiZG0zNTVldm06OmRzMTkiKSwgfSwKKwkJCXsgR1BJT19MRUQoImRtMzU1ZXZtOjpkczIwIiksIH0sCisJCQl7IEdQSU9fTEVEKCJkbTM1NWV2bTo6ZHMyMSIpLCB9LAorCQl9OworI3VuZGVmIEdQSU9fTEVECisKKwkJc3RydWN0IGdwaW9fbGVkX3BsYXRmb3JtX2RhdGEgZXZtX2xlZF9kYXRhID0geworCQkJLm51bV9sZWRzCT0gQVJSQVlfU0laRShldm1fbGVkcyksCisJCQkubGVkcwkJPSBldm1fbGVkcywKKwkJfTsKKworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShldm1fbGVkcyk7IGkrKykKKwkJCWV2bV9sZWRzW2ldLmdwaW8gPSBpICsgZG0zNTVldm1fbXNwX2dwaW8uYmFzZTsKKworCQkvKiBOT1RFOiAgdGhlc2UgYXJlIHRoZSBvbmx5IGZ1bGx5IHByb2dyYW1tYWJsZSBMRURzCisJCSAqIG9uIHRoZSBib2FyZCwgc2luY2UgR1BJTy02MS9kczIyIChhbmQgbWFueSBzaWduYWxzCisJCSAqIGdvaW5nIHRvIERDNykgbXVzdCBiZSB1c2VkIGZvciBBRU1JRiBhZGRyZXNzIGxpbmVzCisJCSAqIHVubGVzcyB0aGUgdG9wIDEgR0Igb2YgTkFORCBpcyB1bnVzZWQuLi4KKwkJICovCisJCWNoaWxkID0gYWRkX2NoaWxkKGNsaWVudCwgImxlZHMtZ3BpbyIsCisJCQkJJmV2bV9sZWRfZGF0YSwgc2l6ZW9mKGV2bV9sZWRfZGF0YSksCisJCQkJZmFsc2UsIDApOworCQlpZiAoSVNfRVJSKGNoaWxkKSkKKwkJCXJldHVybiBQVFJfRVJSKGNoaWxkKTsKKwl9CisKKwkvKiBjb25maWd1cmF0aW9uIGlucHV0cyAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvbmZpZ19pbnB1dHMpOyBpKyspIHsKKwkJaW50IGdwaW8gPSBkbTM1NWV2bV9tc3BfZ3Bpby5iYXNlICsgY29uZmlnX2lucHV0c1tpXS5vZmZzZXQ7CisKKwkJZ3Bpb19yZXF1ZXN0KGdwaW8sIGNvbmZpZ19pbnB1dHNbaV0ubGFiZWwpOworCQlncGlvX2RpcmVjdGlvbl9pbnB1dChncGlvKTsKKworCQkvKiBtYWtlIGl0IGVhc3kgZm9yIHVzZXJzcGFjZSB0byBzZWUgdGhlc2UgKi8KKwkJZ3Bpb19leHBvcnQoZ3BpbywgZmFsc2UpOworCX0KKworCS8qIFJUQyBpcyBhIDMyIGJpdCBjb3VudGVyLCBubyBhbGFybSAqLworCWlmIChtc3BfaGFzX3J0YygpKSB7CisJCWNoaWxkID0gYWRkX2NoaWxkKGNsaWVudCwgInJ0Yy1kbTM1NWV2bSIsCisJCQkJTlVMTCwgMCwgZmFsc2UsIDApOworCQlpZiAoSVNfRVJSKGNoaWxkKSkKKwkJCXJldHVybiBQVFJfRVJSKGNoaWxkKTsKKwl9CisKKwkvKiBpbnB1dCBmcm9tIGJ1dHRvbnMgYW5kIElSIHJlbW90ZSAodXNlcyB0aGUgSVJRKSAqLworCWlmIChtc3BfaGFzX2tleWJvYXJkKCkpIHsKKwkJY2hpbGQgPSBhZGRfY2hpbGQoY2xpZW50LCAiZG0zNTVldm1fa2V5cyIsCisJCQkJTlVMTCwgMCwgdHJ1ZSwgY2xpZW50LT5pcnEpOworCQlpZiAoSVNfRVJSKGNoaWxkKSkKKwkJCXJldHVybiBQVFJfRVJSKGNoaWxkKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgZG0zNTVldm1fY29tbWFuZCh1bnNpZ25lZCBjb21tYW5kKQoreworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBkbTM1NWV2bV9tc3Bfd3JpdGUoY29tbWFuZCwgRE0zNTVFVk1fTVNQX0NPTU1BTkQpOworCWlmIChzdGF0dXMgPCAwKQorCQlkZXZfZXJyKCZtc3A0MzAtPmRldiwgImNvbW1hbmQgJWQgZmFpbHVyZSAlZFxuIiwKKwkJCQljb21tYW5kLCBzdGF0dXMpOworfQorCitzdGF0aWMgdm9pZCBkbTM1NWV2bV9wb3dlcl9vZmYodm9pZCkKK3sKKwlkbTM1NWV2bV9jb21tYW5kKE1TUF9DT01NQU5EX1BPV0VST0ZGKTsKK30KKworc3RhdGljIGludCBkbTM1NWV2bV9tc3BfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJcG1fcG93ZXJfb2ZmID0gTlVMTDsKKwltc3A0MzAgPSBOVUxMOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitkbTM1NWV2bV9tc3BfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCWludAkJc3RhdHVzOworCWNvbnN0IGNoYXIJKnZpZGVvID0gbXNwX2hhc190dnAoKSA/ICJUVlA1MTQ2IiA6ICJpbWFnZXIiOworCisJaWYgKG1zcDQzMCkKKwkJcmV0dXJuIC1FQlVTWTsKKwltc3A0MzAgPSBjbGllbnQ7CisKKwkvKiBkaXNwbGF5IHJldmlzaW9uIHN0YXR1czsgZG91YmxlcyBhcyBzYW5pdHkgY2hlY2sgKi8KKwlzdGF0dXMgPSBkbTM1NWV2bV9tc3BfcmVhZChETTM1NUVWTV9NU1BfRklSTVJFVik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZmFpbDsKKwlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJmaXJtd2FyZSB2LiUwMlgsICVzIGFzIHZpZGVvLWluXG4iLAorCQkJc3RhdHVzLCB2aWRlbyk7CisKKwkvKiBtdXggdmlkZW8gaW5wdXQ6ICBlaXRoZXIgdHZwNTE0NiBvciBzb21lIGV4dGVybmFsIGltYWdlciAqLworCXN0YXR1cyA9IGRtMzU1ZXZtX21zcF93cml0ZShtc3BfaGFzX3R2cCgpID8gMCA6IE1TUF9WSURFT19JTUFHRVIsCisJCQlETTM1NUVWTV9NU1BfVklERU9fSU4pOworCWlmIChzdGF0dXMgPCAwKQorCQlkZXZfd2FybigmY2xpZW50LT5kZXYsICJlcnJvciAlZCBtdXhpbmcgJXMgYXMgdmlkZW8taW5cbiIsCisJCQlzdGF0dXMsIHZpZGVvKTsKKworCS8qIGluaXQgTEVEIGNhY2hlLCBhbmQgdHVybiBvZmYgdGhlIExFRHMgKi8KKwltc3BfbGVkX2NhY2hlID0gMHhmZjsKKwlkbTM1NWV2bV9tc3Bfd3JpdGUobXNwX2xlZF9jYWNoZSwgRE0zNTVFVk1fTVNQX0xFRCk7CisKKwkvKiBleHBvcnQgY2FwYWJpbGl0aWVzIHdlIHN1cHBvcnQgKi8KKwlzdGF0dXMgPSBhZGRfY2hpbGRyZW4oY2xpZW50KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBmYWlsOworCisJLyogUE0gaG9va3VwICovCisJcG1fcG93ZXJfb2ZmID0gZG0zNTVldm1fcG93ZXJfb2ZmOworCisJcmV0dXJuIDA7CisKK2ZhaWw6CisJLyogRklYTUUgcmVtb3ZlIGNoaWxkcmVuIC4uLiAqLworCWRtMzU1ZXZtX21zcF9yZW1vdmUoY2xpZW50KTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgZG0zNTVldm1fbXNwX2lkc1tdID0geworCXsgImRtMzU1ZXZtX21zcCIsIDAgfSwKKwl7IC8qIGVuZCBvZiBsaXN0ICovIH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGRtMzU1ZXZtX21zcF9pZHMpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZG0zNTVldm1fbXNwX2RyaXZlciA9IHsKKwkuZHJpdmVyLm5hbWUJPSAiZG0zNTVldm1fbXNwIiwKKwkuaWRfdGFibGUJPSBkbTM1NWV2bV9tc3BfaWRzLAorCS5wcm9iZQkJPSBkbTM1NWV2bV9tc3BfcHJvYmUsCisJLnJlbW92ZQkJPSBkbTM1NWV2bV9tc3BfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZG0zNTVldm1fbXNwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmRtMzU1ZXZtX21zcF9kcml2ZXIpOworfQorc3Vic3lzX2luaXRjYWxsKGRtMzU1ZXZtX21zcF9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGRtMzU1ZXZtX21zcF9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmRtMzU1ZXZtX21zcF9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoZG0zNTVldm1fbXNwX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkludGVyZmFjZSB0byBNU1A0MzAgZmlybXdhcmUgb24gRE0zNTVFVk0iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL21lbmVsYXVzLmMgYi9kcml2ZXJzL21mZC9tZW5lbGF1cy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2kyYy9jaGlwcy9tZW5lbGF1cy5jCnJlbmFtZSB0byBkcml2ZXJzL21mZC9tZW5lbGF1cy5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9tZmQtY29yZS5jIGIvZHJpdmVycy9tZmQvbWZkLWNvcmUuYwppbmRleCA2YzBkMWJlLi41NGRkZjM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9tZmQtY29yZS5jCisrKyBiL2RyaXZlcnMvbWZkL21mZC1jb3JlLmMKQEAgLTM0LDYgKzM0LDcgQEAKIAkJZ290byBmYWlsX2RldmljZTsKIAogCXBkZXYtPmRldi5wYXJlbnQgPSBwYXJlbnQ7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY2VsbC0+ZHJpdmVyX2RhdGEpOwogCiAJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKHBkZXYsCiAJCQljZWxsLT5wbGF0Zm9ybV9kYXRhLCBjZWxsLT5kYXRhX3NpemUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvdHBzNjUwMTAuYyBiL2RyaXZlcnMvbWZkL3RwczY1MDEwLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaTJjL2NoaXBzL3RwczY1MDEwLmMKcmVuYW1lIHRvIGRyaXZlcnMvbWZkL3RwczY1MDEwLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3R3bDQwMzAtY29yZS5jIGIvZHJpdmVycy9tZmQvdHdsNDAzMC1jb3JlLmMKaW5kZXggZGQ4NDNjNC4uYjU5YzM4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvdHdsNDAzMC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZmQvdHdsNDAzMC1jb3JlLmMKQEAgLTMzLDYgKzMzLDggQEAKICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KIAorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+CisKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMvdHdsNDAzMC5oPgogCkBAIC03MSw2ICs3MywxMyBAQAogI2RlZmluZSB0d2xfaGFzX2dwaW8oKQlmYWxzZQogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19SRUdVTEFUT1JfVFdMNDAzMCkgXAorCXx8IGRlZmluZWQoQ09ORklHX1JFR1VMQVRPUl9UV0w0MDMwX01PRFVMRSkKKyNkZWZpbmUgdHdsX2hhc19yZWd1bGF0b3IoKQl0cnVlCisjZWxzZQorI2RlZmluZSB0d2xfaGFzX3JlZ3VsYXRvcigpCWZhbHNlCisjZW5kaWYKKwogI2lmIGRlZmluZWQoQ09ORklHX1RXTDQwMzBfTUFEQykgfHwgZGVmaW5lZChDT05GSUdfVFdMNDAzMF9NQURDX01PRFVMRSkKICNkZWZpbmUgdHdsX2hhc19tYWRjKCkJdHJ1ZQogI2Vsc2UKQEAgLTE0OSw2ICsxNTgsMTAgQEAKICNkZWZpbmUgSElHSF9QRVJGX1NRCQkJKDEgPDwgMykKIAogCisvKiBjaGlwLXNwZWNpZmljIGZlYXR1cmUgZmxhZ3MsIGZvciBpMmNfZGV2aWNlX2lkLmRyaXZlcl9kYXRhICovCisjZGVmaW5lIFRXTDQwMzBfVkFVWDIJCUJJVCgwKQkvKiBwcmUtNTAzMCB2b2x0YWdlIHJhbmdlcyAqLworI2RlZmluZSBUUFNfU1VCU0VUCQlCSVQoMSkJLyogdHBzNjU5WzIzXTAgaGF2ZSBmZXdlciBMRE9zICovCisKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qIGlzIGRyaXZlciBhY3RpdmUsIGJvdW5kIHRvIGEgY2hpcD8gKi8KQEAgLTIyNSw3ICsyMzgsNyBAQAogICoKICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBvcGVyYXRpb24gLSAwIGlzIHN1Y2Nlc3MKICAqLwotaW50IHR3bDQwMzBfaTJjX3dyaXRlKHU4IG1vZF9ubywgdTggKnZhbHVlLCB1OCByZWcsIHU4IG51bV9ieXRlcykKK2ludCB0d2w0MDMwX2kyY193cml0ZSh1OCBtb2Rfbm8sIHU4ICp2YWx1ZSwgdTggcmVnLCB1bnNpZ25lZCBudW1fYnl0ZXMpCiB7CiAJaW50IHJldDsKIAlpbnQgc2lkOwpAQCAtMjc0LDcgKzI4Nyw3IEBACiAgKgogICogUmV0dXJucyByZXN1bHQgb2Ygb3BlcmF0aW9uIC0gbnVtX2J5dGVzIGlzIHN1Y2Nlc3MgZWxzZSBmYWlsdXJlLgogICovCi1pbnQgdHdsNDAzMF9pMmNfcmVhZCh1OCBtb2Rfbm8sIHU4ICp2YWx1ZSwgdTggcmVnLCB1OCBudW1fYnl0ZXMpCitpbnQgdHdsNDAzMF9pMmNfcmVhZCh1OCBtb2Rfbm8sIHU4ICp2YWx1ZSwgdTggcmVnLCB1bnNpZ25lZCBudW1fYnl0ZXMpCiB7CiAJaW50IHJldDsKIAl1OCB2YWw7CkBAIC0zNTIsMjU4ICszNjUsMjU4IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlICoKK2FkZF9udW1iZXJlZF9jaGlsZCh1bnNpZ25lZCBjaGlwLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbnVtLAorCQl2b2lkICpwZGF0YSwgdW5zaWduZWQgcGRhdGFfbGVuLAorCQlib29sIGNhbl93YWtldXAsIGludCBpcnEwLCBpbnQgaXJxMSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpwZGV2OworCXN0cnVjdCB0d2w0MDMwX2NsaWVudAkqdHdsID0gJnR3bDQwMzBfbW9kdWxlc1tjaGlwXTsKKwlpbnQJCQlzdGF0dXM7CisKKwlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKG5hbWUsIG51bSk7CisJaWYgKCFwZGV2KSB7CisJCWRldl9kYmcoJnR3bC0+Y2xpZW50LT5kZXYsICJjYW4ndCBhbGxvYyBkZXZcbiIpOworCQlzdGF0dXMgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKKwl9CisKKwlkZXZpY2VfaW5pdF93YWtldXAoJnBkZXYtPmRldiwgY2FuX3dha2V1cCk7CisJcGRldi0+ZGV2LnBhcmVudCA9ICZ0d2wtPmNsaWVudC0+ZGV2OworCisJaWYgKHBkYXRhKSB7CisJCXN0YXR1cyA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShwZGV2LCBwZGF0YSwgcGRhdGFfbGVuKTsKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCWRldl9kYmcoJnBkZXYtPmRldiwgImNhbid0IGFkZCBwbGF0Zm9ybV9kYXRhXG4iKTsKKwkJCWdvdG8gZXJyOworCQl9CisJfQorCisJaWYgKGlycTApIHsKKwkJc3RydWN0IHJlc291cmNlIHJbMl0gPSB7CisJCQl7IC5zdGFydCA9IGlycTAsIC5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLCB9LAorCQkJeyAuc3RhcnQgPSBpcnExLCAuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwgfSwKKwkJfTsKKworCQlzdGF0dXMgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX3Jlc291cmNlcyhwZGV2LCByLCBpcnExID8gMiA6IDEpOworCQlpZiAoc3RhdHVzIDwgMCkgeworCQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiY2FuJ3QgYWRkIGlycXNcbiIpOworCQkJZ290byBlcnI7CisJCX0KKwl9CisKKwlzdGF0dXMgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOworCitlcnI6CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJcGxhdGZvcm1fZGV2aWNlX3B1dChwZGV2KTsKKwkJZGV2X2VycigmdHdsLT5jbGllbnQtPmRldiwgImNhbid0IGFkZCAlcyBkZXZcbiIsIG5hbWUpOworCQlyZXR1cm4gRVJSX1BUUihzdGF0dXMpOworCX0KKwlyZXR1cm4gJnBkZXYtPmRldjsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlICphZGRfY2hpbGQodW5zaWduZWQgY2hpcCwgY29uc3QgY2hhciAqbmFtZSwKKwkJdm9pZCAqcGRhdGEsIHVuc2lnbmVkIHBkYXRhX2xlbiwKKwkJYm9vbCBjYW5fd2FrZXVwLCBpbnQgaXJxMCwgaW50IGlycTEpCit7CisJcmV0dXJuIGFkZF9udW1iZXJlZF9jaGlsZChjaGlwLCBuYW1lLCAtMSwgcGRhdGEsIHBkYXRhX2xlbiwKKwkJY2FuX3dha2V1cCwgaXJxMCwgaXJxMSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlICoKK2FkZF9yZWd1bGF0b3JfbGlua2VkKGludCBudW0sIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhICpwZGF0YSwKKwkJc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgKmNvbnN1bWVycywKKwkJdW5zaWduZWQgbnVtX2NvbnN1bWVycykKK3sKKwkvKiByZWd1bGF0b3IgZnJhbWV3b3JrIGRlbWFuZHMgaW5pdF9kYXRhIC4uLiAqLworCWlmICghcGRhdGEpCisJCXJldHVybiBOVUxMOworCisJaWYgKGNvbnN1bWVycykgeworCQlwZGF0YS0+Y29uc3VtZXJfc3VwcGxpZXMgPSBjb25zdW1lcnM7CisJCXBkYXRhLT5udW1fY29uc3VtZXJfc3VwcGxpZXMgPSBudW1fY29uc3VtZXJzOworCX0KKworCS8qIE5PVEU6ICB3ZSBjdXJyZW50bHkgaWdub3JlIHJlZ3VsYXRvciBJUlFzLCBlLmcuIGZvciBzaG9ydCBjaXJjdWl0cyAqLworCXJldHVybiBhZGRfbnVtYmVyZWRfY2hpbGQoMywgInR3bDQwMzBfcmVnIiwgbnVtLAorCQlwZGF0YSwgc2l6ZW9mKCpwZGF0YSksIGZhbHNlLCAwLCAwKTsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2UgKgorYWRkX3JlZ3VsYXRvcihpbnQgbnVtLCBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSAqcGRhdGEpCit7CisJcmV0dXJuIGFkZF9yZWd1bGF0b3JfbGlua2VkKG51bSwgcGRhdGEsIE5VTEwsIDApOworfQorCiAvKgogICogTk9URTogIFdlIGtub3cgdGhlIGZpcnN0IDggSVJRcyBhZnRlciBwZGF0YS0+YmFzZV9pcnEgYXJlCiAgKiBmb3IgdGhlIFBJSCwgYW5kIHRoZSBuZXh0IGFyZSBmb3IgdGhlIFBXUl9JTlQgU0lILCBzaW5jZQogICogdGhhdCdzIGhvdyB0d2xfaW5pdF9pcnEoKSBzZXRzIHRoaW5ncyB1cC4KICAqLwogCi1zdGF0aWMgaW50IGFkZF9jaGlsZHJlbihzdHJ1Y3QgdHdsNDAzMF9wbGF0Zm9ybV9kYXRhICpwZGF0YSkKK3N0YXRpYyBpbnQKK2FkZF9jaGlsZHJlbihzdHJ1Y3QgdHdsNDAzMF9wbGF0Zm9ybV9kYXRhICpwZGF0YSwgdW5zaWduZWQgbG9uZyBmZWF0dXJlcykKIHsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpwZGV2ID0gTlVMTDsKLQlzdHJ1Y3QgdHdsNDAzMF9jbGllbnQJKnR3bCA9IE5VTEw7Ci0JaW50CQkJc3RhdHVzID0gMDsKKwlzdHJ1Y3QgZGV2aWNlCSpjaGlsZDsKKwlzdHJ1Y3QgZGV2aWNlCSp1c2JfdHJhbnNjZWl2ZXIgPSBOVUxMOwogCi0JaWYgKHR3bF9oYXNfYmNpKCkgJiYgcGRhdGEtPmJjaSkgewotCQl0d2wgPSAmdHdsNDAzMF9tb2R1bGVzWzNdOwotCi0JCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInR3bDQwMzBfYmNpIiwgLTEpOwotCQlpZiAoIXBkZXYpIHsKLQkJCXByX2RlYnVnKCIlczogY2FuJ3QgYWxsb2MgYmNpIGRldlxuIiwgRFJJVkVSX05BTUUpOwotCQkJc3RhdHVzID0gLUVOT01FTTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0KLQkJaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCQlwZGV2LT5kZXYucGFyZW50ID0gJnR3bC0+Y2xpZW50LT5kZXY7Ci0JCQlzdGF0dXMgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEocGRldiwgcGRhdGEtPmJjaSwKLQkJCQkJc2l6ZW9mKCpwZGF0YS0+YmNpKSk7Ci0JCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJCWRldl9kYmcoJnR3bC0+Y2xpZW50LT5kZXYsCi0JCQkJCSJjYW4ndCBhZGQgYmNpIGRhdGEsICVkXG4iLAotCQkJCQlzdGF0dXMpOwotCQkJCWdvdG8gZXJyOwotCQkJfQotCQl9Ci0KLQkJaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCQlzdHJ1Y3QgcmVzb3VyY2UgciA9IHsKLQkJCQkuc3RhcnQgPSBwZGF0YS0+aXJxX2Jhc2UgKyA4ICsgMSwKLQkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQkJCX07Ci0KLQkJCXN0YXR1cyA9IHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKHBkZXYsICZyLCAxKTsKLQkJfQotCi0JCWlmIChzdGF0dXMgPT0gMCkKLQkJCXN0YXR1cyA9IHBsYXRmb3JtX2RldmljZV9hZGQocGRldik7Ci0KLQkJaWYgKHN0YXR1cyA8IDApIHsKLQkJCXBsYXRmb3JtX2RldmljZV9wdXQocGRldik7Ci0JCQlkZXZfZGJnKCZ0d2wtPmNsaWVudC0+ZGV2LAotCQkJCQkiY2FuJ3QgY3JlYXRlIGJjaSBkZXYsICVkXG4iLAotCQkJCQlzdGF0dXMpOwotCQkJZ290byBlcnI7Ci0JCX0KKwlpZiAodHdsX2hhc19iY2koKSAmJiBwZGF0YS0+YmNpICYmICEoZmVhdHVyZXMgJiBUUFNfU1VCU0VUKSkgeworCQljaGlsZCA9IGFkZF9jaGlsZCgzLCAidHdsNDAzMF9iY2kiLAorCQkJCXBkYXRhLT5iY2ksIHNpemVvZigqcGRhdGEtPmJjaSksCisJCQkJZmFsc2UsCisJCQkJLyogaXJxMCA9IENIR19QUkVTLCBpcnExID0gQkNJICovCisJCQkJcGRhdGEtPmlycV9iYXNlICsgOCArIDEsIHBkYXRhLT5pcnFfYmFzZSArIDIpOworCQlpZiAoSVNfRVJSKGNoaWxkKSkKKwkJCXJldHVybiBQVFJfRVJSKGNoaWxkKTsKIAl9CiAKIAlpZiAodHdsX2hhc19ncGlvKCkgJiYgcGRhdGEtPmdwaW8pIHsKLQkJdHdsID0gJnR3bDQwMzBfbW9kdWxlc1sxXTsKLQotCQlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJ0d2w0MDMwX2dwaW8iLCAtMSk7Ci0JCWlmICghcGRldikgewotCQkJcHJfZGVidWcoIiVzOiBjYW4ndCBhbGxvYyBncGlvIGRldlxuIiwgRFJJVkVSX05BTUUpOwotCQkJc3RhdHVzID0gLUVOT01FTTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0KLQkJLyogbW9yZSBkcml2ZXIgbW9kZWwgaW5pdCAqLwotCQlpZiAoc3RhdHVzID09IDApIHsKLQkJCXBkZXYtPmRldi5wYXJlbnQgPSAmdHdsLT5jbGllbnQtPmRldjsKLQkJCS8qIGRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2LCAxKTsgKi8KLQotCQkJc3RhdHVzID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKHBkZXYsIHBkYXRhLT5ncGlvLAotCQkJCQlzaXplb2YoKnBkYXRhLT5ncGlvKSk7Ci0JCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJCWRldl9kYmcoJnR3bC0+Y2xpZW50LT5kZXYsCi0JCQkJCSJjYW4ndCBhZGQgZ3BpbyBkYXRhLCAlZFxuIiwKLQkJCQkJc3RhdHVzKTsKLQkJCQlnb3RvIGVycjsKLQkJCX0KLQkJfQotCi0JCS8qIEdQSU8gbW9kdWxlIElSUSAqLwotCQlpZiAoc3RhdHVzID09IDApIHsKLQkJCXN0cnVjdCByZXNvdXJjZQlyID0gewotCQkJCS5zdGFydCA9IHBkYXRhLT5pcnFfYmFzZSArIDAsCi0JCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JCQl9OwotCi0JCQlzdGF0dXMgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX3Jlc291cmNlcyhwZGV2LCAmciwgMSk7Ci0JCX0KLQotCQlpZiAoc3RhdHVzID09IDApCi0JCQlzdGF0dXMgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOwotCi0JCWlmIChzdGF0dXMgPCAwKSB7Ci0JCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KHBkZXYpOwotCQkJZGV2X2RiZygmdHdsLT5jbGllbnQtPmRldiwKLQkJCQkJImNhbid0IGNyZWF0ZSBncGlvIGRldiwgJWRcbiIsCi0JCQkJCXN0YXR1cyk7Ci0JCQlnb3RvIGVycjsKLQkJfQorCQljaGlsZCA9IGFkZF9jaGlsZCgxLCAidHdsNDAzMF9ncGlvIiwKKwkJCQlwZGF0YS0+Z3Bpbywgc2l6ZW9mKCpwZGF0YS0+Z3BpbyksCisJCQkJZmFsc2UsIHBkYXRhLT5pcnFfYmFzZSArIDAsIDApOworCQlpZiAoSVNfRVJSKGNoaWxkKSkKKwkJCXJldHVybiBQVFJfRVJSKGNoaWxkKTsKIAl9CiAKIAlpZiAodHdsX2hhc19rZXlwYWQoKSAmJiBwZGF0YS0+a2V5cGFkKSB7Ci0JCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInR3bDQwMzBfa2V5cGFkIiwgLTEpOwotCQlpZiAocGRldikgewotCQkJdHdsID0gJnR3bDQwMzBfbW9kdWxlc1syXTsKLQkJCXBkZXYtPmRldi5wYXJlbnQgPSAmdHdsLT5jbGllbnQtPmRldjsKLQkJCWRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2LCAxKTsKLQkJCXN0YXR1cyA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShwZGV2LCBwZGF0YS0+a2V5cGFkLAotCQkJCQlzaXplb2YoKnBkYXRhLT5rZXlwYWQpKTsKLQkJCWlmIChzdGF0dXMgPCAwKSB7Ci0JCQkJZGV2X2RiZygmdHdsLT5jbGllbnQtPmRldiwKLQkJCQkJImNhbid0IGFkZCBrZXlwYWQgZGF0YSwgJWRcbiIsCi0JCQkJCXN0YXR1cyk7Ci0JCQkJcGxhdGZvcm1fZGV2aWNlX3B1dChwZGV2KTsKLQkJCQlnb3RvIGVycjsKLQkJCX0KLQkJCXN0YXR1cyA9IHBsYXRmb3JtX2RldmljZV9hZGQocGRldik7Ci0JCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJCXBsYXRmb3JtX2RldmljZV9wdXQocGRldik7Ci0JCQkJZGV2X2RiZygmdHdsLT5jbGllbnQtPmRldiwKLQkJCQkJCSJjYW4ndCBjcmVhdGUga2V5cGFkIGRldiwgJWRcbiIsCi0JCQkJCQlzdGF0dXMpOwotCQkJCWdvdG8gZXJyOwotCQkJfQotCQl9IGVsc2UgewotCQkJcHJfZGVidWcoIiVzOiBjYW4ndCBhbGxvYyBrZXlwYWQgZGV2XG4iLCBEUklWRVJfTkFNRSk7Ci0JCQlzdGF0dXMgPSAtRU5PTUVNOwotCQkJZ290byBlcnI7Ci0JCX0KKwkJY2hpbGQgPSBhZGRfY2hpbGQoMiwgInR3bDQwMzBfa2V5cGFkIiwKKwkJCQlwZGF0YS0+a2V5cGFkLCBzaXplb2YoKnBkYXRhLT5rZXlwYWQpLAorCQkJCXRydWUsIHBkYXRhLT5pcnFfYmFzZSArIDEsIDApOworCQlpZiAoSVNfRVJSKGNoaWxkKSkKKwkJCXJldHVybiBQVFJfRVJSKGNoaWxkKTsKIAl9CiAKIAlpZiAodHdsX2hhc19tYWRjKCkgJiYgcGRhdGEtPm1hZGMpIHsKLQkJcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygidHdsNDAzMF9tYWRjIiwgLTEpOwotCQlpZiAocGRldikgewotCQkJdHdsID0gJnR3bDQwMzBfbW9kdWxlc1syXTsKLQkJCXBkZXYtPmRldi5wYXJlbnQgPSAmdHdsLT5jbGllbnQtPmRldjsKLQkJCWRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2LCAxKTsKLQkJCXN0YXR1cyA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShwZGV2LCBwZGF0YS0+bWFkYywKLQkJCQkJc2l6ZW9mKCpwZGF0YS0+bWFkYykpOwotCQkJaWYgKHN0YXR1cyA8IDApIHsKLQkJCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KHBkZXYpOwotCQkJCWRldl9kYmcoJnR3bC0+Y2xpZW50LT5kZXYsCi0JCQkJCSJjYW4ndCBhZGQgbWFkYyBkYXRhLCAlZFxuIiwKLQkJCQkJc3RhdHVzKTsKLQkJCQlnb3RvIGVycjsKLQkJCX0KLQkJCXN0YXR1cyA9IHBsYXRmb3JtX2RldmljZV9hZGQocGRldik7Ci0JCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJCXBsYXRmb3JtX2RldmljZV9wdXQocGRldik7Ci0JCQkJZGV2X2RiZygmdHdsLT5jbGllbnQtPmRldiwKLQkJCQkJCSJjYW4ndCBjcmVhdGUgbWFkYyBkZXYsICVkXG4iLAotCQkJCQkJc3RhdHVzKTsKLQkJCQlnb3RvIGVycjsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXByX2RlYnVnKCIlczogY2FuJ3QgYWxsb2MgbWFkYyBkZXZcbiIsIERSSVZFUl9OQU1FKTsKLQkJCXN0YXR1cyA9IC1FTk9NRU07Ci0JCQlnb3RvIGVycjsKLQkJfQorCQljaGlsZCA9IGFkZF9jaGlsZCgyLCAidHdsNDAzMF9tYWRjIiwKKwkJCQlwZGF0YS0+bWFkYywgc2l6ZW9mKCpwZGF0YS0+bWFkYyksCisJCQkJdHJ1ZSwgcGRhdGEtPmlycV9iYXNlICsgMywgMCk7CisJCWlmIChJU19FUlIoY2hpbGQpKQorCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOwogCX0KIAogCWlmICh0d2xfaGFzX3J0YygpKSB7Ci0JCXR3bCA9ICZ0d2w0MDMwX21vZHVsZXNbM107Ci0KLQkJcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygidHdsNDAzMF9ydGMiLCAtMSk7Ci0JCWlmICghcGRldikgewotCQkJcHJfZGVidWcoIiVzOiBjYW4ndCBhbGxvYyBydGMgZGV2XG4iLCBEUklWRVJfTkFNRSk7Ci0JCQlzdGF0dXMgPSAtRU5PTUVNOwotCQl9IGVsc2UgewotCQkJcGRldi0+ZGV2LnBhcmVudCA9ICZ0d2wtPmNsaWVudC0+ZGV2OwotCQkJZGV2aWNlX2luaXRfd2FrZXVwKCZwZGV2LT5kZXYsIDEpOwotCQl9Ci0KIAkJLyoKLQkJICogUkVWSVNJVCBwbGF0Zm9ybV9kYXRhIGhlcmUgY3VycmVudGx5IG1pZ2h0IHVzZSBvZgorCQkgKiBSRVZJU0lUIHBsYXRmb3JtX2RhdGEgaGVyZSBjdXJyZW50bHkgbWlnaHQgZXhwb3NlIHRoZQogCQkgKiAibXNlY3VyZSIgbGluZSAuLi4gYnV0IGZvciBub3cgd2UganVzdCBleHBlY3QgYm9hcmQKLQkJICogc2V0dXAgdG8gdGVsbCB0aGUgY2hpcCAid2UgYXJlIHNlY3VyZSIgYXQgYWxsIHRpbWVzLgorCQkgKiBzZXR1cCB0byB0ZWxsIHRoZSBjaGlwICJpdCdzIGFsd2F5cyBvayB0byBTRVRfVElNRSIuCiAJCSAqIEV2ZW50dWFsbHksIExpbnV4IG1pZ2h0IGJlY29tZSBtb3JlIGF3YXJlIG9mIHN1Y2gKIAkJICogSFcgc2VjdXJpdHkgY29uY2VybnMsIGFuZCAibGVhc3QgcHJpdmlsZWdlIi4KIAkJICovCi0KLQkJLyogUlRDIG1vZHVsZSBJUlEgKi8KLQkJaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCQlzdHJ1Y3QgcmVzb3VyY2UJciA9IHsKLQkJCQkuc3RhcnQgPSBwZGF0YS0+aXJxX2Jhc2UgKyA4ICsgMywKLQkJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQkJCX07Ci0KLQkJCXN0YXR1cyA9IHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKHBkZXYsICZyLCAxKTsKLQkJfQotCi0JCWlmIChzdGF0dXMgPT0gMCkKLQkJCXN0YXR1cyA9IHBsYXRmb3JtX2RldmljZV9hZGQocGRldik7Ci0KLQkJaWYgKHN0YXR1cyA8IDApIHsKLQkJCXBsYXRmb3JtX2RldmljZV9wdXQocGRldik7Ci0JCQlkZXZfZGJnKCZ0d2wtPmNsaWVudC0+ZGV2LAotCQkJCQkiY2FuJ3QgY3JlYXRlIHJ0YyBkZXYsICVkXG4iLAotCQkJCQlzdGF0dXMpOwotCQkJZ290byBlcnI7Ci0JCX0KKwkJY2hpbGQgPSBhZGRfY2hpbGQoMywgInR3bDQwMzBfcnRjIiwKKwkJCQlOVUxMLCAwLAorCQkJCXRydWUsIHBkYXRhLT5pcnFfYmFzZSArIDggKyAzLCAwKTsKKwkJaWYgKElTX0VSUihjaGlsZCkpCisJCQlyZXR1cm4gUFRSX0VSUihjaGlsZCk7CiAJfQogCiAJaWYgKHR3bF9oYXNfdXNiKCkgJiYgcGRhdGEtPnVzYikgewotCQl0d2wgPSAmdHdsNDAzMF9tb2R1bGVzWzBdOworCQljaGlsZCA9IGFkZF9jaGlsZCgwLCAidHdsNDAzMF91c2IiLAorCQkJCXBkYXRhLT51c2IsIHNpemVvZigqcGRhdGEtPnVzYiksCisJCQkJdHJ1ZSwKKwkJCQkvKiBpcnEwID0gVVNCX1BSRVMsIGlycTEgPSBVU0IgKi8KKwkJCQlwZGF0YS0+aXJxX2Jhc2UgKyA4ICsgMiwgcGRhdGEtPmlycV9iYXNlICsgNCk7CisJCWlmIChJU19FUlIoY2hpbGQpKQorCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOwogCi0JCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInR3bDQwMzBfdXNiIiwgLTEpOwotCQlpZiAoIXBkZXYpIHsKLQkJCXByX2RlYnVnKCIlczogY2FuJ3QgYWxsb2MgdXNiIGRldlxuIiwgRFJJVkVSX05BTUUpOwotCQkJc3RhdHVzID0gLUVOT01FTTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0KLQkJaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCQlwZGV2LT5kZXYucGFyZW50ID0gJnR3bC0+Y2xpZW50LT5kZXY7Ci0JCQlkZXZpY2VfaW5pdF93YWtldXAoJnBkZXYtPmRldiwgMSk7Ci0JCQlzdGF0dXMgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEocGRldiwgcGRhdGEtPnVzYiwKLQkJCQkJc2l6ZW9mKCpwZGF0YS0+dXNiKSk7Ci0JCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJCXBsYXRmb3JtX2RldmljZV9wdXQocGRldik7Ci0JCQkJZGV2X2RiZygmdHdsLT5jbGllbnQtPmRldiwKLQkJCQkJImNhbid0IGFkZCB1c2IgZGF0YSwgJWRcbiIsCi0JCQkJCXN0YXR1cyk7Ci0JCQkJZ290byBlcnI7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoc3RhdHVzID09IDApIHsKLQkJCXN0cnVjdCByZXNvdXJjZSByID0gewotCQkJCS5zdGFydCA9IHBkYXRhLT5pcnFfYmFzZSArIDggKyAyLAotCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCQkJfTsKLQotCQkJc3RhdHVzID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgJnIsIDEpOwotCQl9Ci0KLQkJaWYgKHN0YXR1cyA9PSAwKQotCQkJc3RhdHVzID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwZGV2KTsKLQotCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJcGxhdGZvcm1fZGV2aWNlX3B1dChwZGV2KTsKLQkJCWRldl9kYmcoJnR3bC0+Y2xpZW50LT5kZXYsCi0JCQkJCSJjYW4ndCBjcmVhdGUgdXNiIGRldiwgJWRcbiIsCi0JCQkJCXN0YXR1cyk7Ci0JCX0KKwkJLyogd2UgbmVlZCB0byBjb25uZWN0IHJlZ3VsYXRvcnMgdG8gdGhpcyB0cmFuc2NlaXZlciAqLworCQl1c2JfdHJhbnNjZWl2ZXIgPSBjaGlsZDsKIAl9CiAKLWVycjoKLQlpZiAoc3RhdHVzKQotCQlwcl9lcnIoImZhaWxlZCB0byBhZGQgdHdsNDAzMCdzIGNoaWxkcmVuIChzdGF0dXMgJWQpXG4iLCBzdGF0dXMpOwotCXJldHVybiBzdGF0dXM7CisJaWYgKHR3bF9oYXNfcmVndWxhdG9yKCkpIHsKKwkJLyoKKwkJY2hpbGQgPSBhZGRfcmVndWxhdG9yKFRXTDQwMzBfUkVHX1ZQTEwxLCBwZGF0YS0+dnBsbDEpOworCQlpZiAoSVNfRVJSKGNoaWxkKSkKKwkJCXJldHVybiBQVFJfRVJSKGNoaWxkKTsKKwkJKi8KKworCQljaGlsZCA9IGFkZF9yZWd1bGF0b3IoVFdMNDAzMF9SRUdfVk1NQzEsIHBkYXRhLT52bW1jMSk7CisJCWlmIChJU19FUlIoY2hpbGQpKQorCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOworCisJCWNoaWxkID0gYWRkX3JlZ3VsYXRvcihUV0w0MDMwX1JFR19WREFDLCBwZGF0YS0+dmRhYyk7CisJCWlmIChJU19FUlIoY2hpbGQpKQorCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOworCisJCWNoaWxkID0gYWRkX3JlZ3VsYXRvcigoZmVhdHVyZXMgJiBUV0w0MDMwX1ZBVVgyKQorCQkJCQk/IFRXTDQwMzBfUkVHX1ZBVVgyXzQwMzAKKwkJCQkJOiBUV0w0MDMwX1JFR19WQVVYMiwKKwkJCQlwZGF0YS0+dmF1eDIpOworCQlpZiAoSVNfRVJSKGNoaWxkKSkKKwkJCXJldHVybiBQVFJfRVJSKGNoaWxkKTsKKwl9CisKKwlpZiAodHdsX2hhc19yZWd1bGF0b3IoKSAmJiB1c2JfdHJhbnNjZWl2ZXIpIHsKKwkJc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHVzYjF2NSA9IHsKKwkJCS5zdXBwbHkgPQkidXNiMXY1IiwKKwkJfTsKKwkJc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHVzYjF2OCA9IHsKKwkJCS5zdXBwbHkgPQkidXNiMXY4IiwKKwkJfTsKKwkJc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHVzYjN2MSA9IHsKKwkJCS5zdXBwbHkgPQkidXNiM3YxIiwKKwkJfTsKKworCQkvKiB0aGlzIGlzIGEgdGVtcGxhdGUgdGhhdCBnZXRzIGNvcGllZCAqLworCQlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSB1c2JfZml4ZWQgPSB7CisJCQkuY29uc3RyYWludHMudmFsaWRfbW9kZXNfbWFzayA9CisJCQkJICBSRUdVTEFUT1JfTU9ERV9OT1JNQUwKKwkJCQl8IFJFR1VMQVRPUl9NT0RFX1NUQU5EQlksCisJCQkuY29uc3RyYWludHMudmFsaWRfb3BzX21hc2sgPQorCQkJCSAgUkVHVUxBVE9SX0NIQU5HRV9NT0RFCisJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJfTsKKworCQl1c2IxdjUuZGV2ID0gdXNiX3RyYW5zY2VpdmVyOworCQl1c2IxdjguZGV2ID0gdXNiX3RyYW5zY2VpdmVyOworCQl1c2IzdjEuZGV2ID0gdXNiX3RyYW5zY2VpdmVyOworCisJCWNoaWxkID0gYWRkX3JlZ3VsYXRvcl9saW5rZWQoVFdMNDAzMF9SRUdfVlVTQjFWNSwgJnVzYl9maXhlZCwKKwkJCQkmdXNiMXY1LCAxKTsKKwkJaWYgKElTX0VSUihjaGlsZCkpCisJCQlyZXR1cm4gUFRSX0VSUihjaGlsZCk7CisKKwkJY2hpbGQgPSBhZGRfcmVndWxhdG9yX2xpbmtlZChUV0w0MDMwX1JFR19WVVNCMVY4LCAmdXNiX2ZpeGVkLAorCQkJCSZ1c2IxdjgsIDEpOworCQlpZiAoSVNfRVJSKGNoaWxkKSkKKwkJCXJldHVybiBQVFJfRVJSKGNoaWxkKTsKKworCQljaGlsZCA9IGFkZF9yZWd1bGF0b3JfbGlua2VkKFRXTDQwMzBfUkVHX1ZVU0IzVjEsICZ1c2JfZml4ZWQsCisJCQkJJnVzYjN2MSwgMSk7CisJCWlmIChJU19FUlIoY2hpbGQpKQorCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOworCX0KKworCS8qIG1heWJlIGFkZCBMRE9zIHRoYXQgYXJlIG9taXR0ZWQgb24gY29zdC1yZWR1Y2VkIHBhcnRzICovCisJaWYgKHR3bF9oYXNfcmVndWxhdG9yKCkgJiYgIShmZWF0dXJlcyAmIFRQU19TVUJTRVQpKSB7CisJCS8qCisJCWNoaWxkID0gYWRkX3JlZ3VsYXRvcihUV0w0MDMwX1JFR19WUExMMiwgcGRhdGEtPnZwbGwyKTsKKwkJaWYgKElTX0VSUihjaGlsZCkpCisJCQlyZXR1cm4gUFRSX0VSUihjaGlsZCk7CisJCSovCisKKwkJY2hpbGQgPSBhZGRfcmVndWxhdG9yKFRXTDQwMzBfUkVHX1ZNTUMyLCBwZGF0YS0+dm1tYzIpOworCQlpZiAoSVNfRVJSKGNoaWxkKSkKKwkJCXJldHVybiBQVFJfRVJSKGNoaWxkKTsKKworCQljaGlsZCA9IGFkZF9yZWd1bGF0b3IoVFdMNDAzMF9SRUdfVlNJTSwgcGRhdGEtPnZzaW0pOworCQlpZiAoSVNfRVJSKGNoaWxkKSkKKwkJCXJldHVybiBQVFJfRVJSKGNoaWxkKTsKKworCQljaGlsZCA9IGFkZF9yZWd1bGF0b3IoVFdMNDAzMF9SRUdfVkFVWDEsIHBkYXRhLT52YXV4MSk7CisJCWlmIChJU19FUlIoY2hpbGQpKQorCQkJcmV0dXJuIFBUUl9FUlIoY2hpbGQpOworCisJCWNoaWxkID0gYWRkX3JlZ3VsYXRvcihUV0w0MDMwX1JFR19WQVVYMywgcGRhdGEtPnZhdXgzKTsKKwkJaWYgKElTX0VSUihjaGlsZCkpCisJCQlyZXR1cm4gUFRSX0VSUihjaGlsZCk7CisKKwkJY2hpbGQgPSBhZGRfcmVndWxhdG9yKFRXTDQwMzBfUkVHX1ZBVVg0LCBwZGF0YS0+dmF1eDQpOworCQlpZiAoSVNfRVJSKGNoaWxkKSkKKwkJCXJldHVybiBQVFJfRVJSKGNoaWxkKTsKKwl9CisKKwlyZXR1cm4gMDsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTY0NSwxMiArNjU4LDcgQEAKIAkJb3NjID0gY2xrX2dldChOVUxMLCAib3NjX2NrIik7CiAJZWxzZQogCQlvc2MgPSBjbGtfZ2V0KE5VTEwsICJvc2Nfc3lzX2NrIik7Ci0jZWxzZQotCS8qIFJFVklTSVQgZm9yIG5vbi1PTUFQIHN5c3RlbXMsIHBhc3MgdGhlIGNsb2NrIHJhdGUgZnJvbQotCSAqIGJvYXJkIGluaXQgY29kZSwgdXNpbmcgcGxhdGZvcm1fZGF0YS4KLQkgKi8KLQlvc2MgPSBFUlJfUFRSKC1FSU8pOwotI2VuZGlmCisKIAlpZiAoSVNfRVJSKG9zYykpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiU2tpcHBpbmcgdHdsNDAzMCBpbnRlcm5hbCBjbG9jayBpbml0IGFuZCAiCiAJCQkJInVzaW5nIGJvb3Rsb2FkZXIgdmFsdWUgKHVua25vd24gb3NjIHJhdGUpXG4iKTsKQEAgLTY2MCw2ICs2NjgsMTggQEAKIAlyYXRlID0gY2xrX2dldF9yYXRlKG9zYyk7CiAJY2xrX3B1dChvc2MpOwogCisjZWxzZQorCS8qIFJFVklTSVQgZm9yIG5vbi1PTUFQIHN5c3RlbXMsIHBhc3MgdGhlIGNsb2NrIHJhdGUgZnJvbQorCSAqIGJvYXJkIGluaXQgY29kZSwgdXNpbmcgcGxhdGZvcm1fZGF0YS4KKwkgKi8KKwlvc2MgPSBFUlJfUFRSKC1FSU8pOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAiU2tpcHBpbmcgdHdsNDAzMCBpbnRlcm5hbCBjbG9jayBpbml0IGFuZCAiCisJICAgICAgICJ1c2luZyBib290bG9hZGVyIHZhbHVlICh1bmtub3duIG9zYyByYXRlKVxuIik7CisKKwlyZXR1cm47CisjZW5kaWYKKwogCXN3aXRjaCAocmF0ZSkgewogCWNhc2UgMTkyMDAwMDA6CiAJCWN0cmwgPSBIRkNMS19GUkVRXzE5cDJfTUhaOwpAQCAtNzY0LDcgKzc4NCw3IEBACiAJCQlnb3RvIGZhaWw7CiAJfQogCi0Jc3RhdHVzID0gYWRkX2NoaWxkcmVuKHBkYXRhKTsKKwlzdGF0dXMgPSBhZGRfY2hpbGRyZW4ocGRhdGEsIGlkLT5kcml2ZXJfZGF0YSk7CiBmYWlsOgogCWlmIChzdGF0dXMgPCAwKQogCQl0d2w0MDMwX3JlbW92ZShjbGllbnQpOwpAQCAtNzcyLDExICs3OTIsMTEgQEAKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHR3bDQwMzBfaWRzW10gPSB7Ci0JeyAidHdsNDAzMCIsIDAgfSwJLyogIlRyaXRvbiAyIiAqLwotCXsgInRwczY1OTUwIiwgMCB9LAkvKiBjYXRhbG9nIHZlcnNpb24gb2YgdHdsNDAzMCAqLwotCXsgInRwczY1OTMwIiwgMCB9LAkvKiBmZXdlciBMRE9zIGFuZCBEQUNzOyBubyBjaGFyZ2VyICovCi0JeyAidHBzNjU5MjAiLCAwIH0sCS8qIGZld2VyIExET3M7IG5vIGNvZGVjIG9yIGNoYXJnZXIgKi8KLQl7ICJ0d2w1MDMwIiwgMCB9LAkvKiBUMiB1cGRhdGVkICovCisJeyAidHdsNDAzMCIsIFRXTDQwMzBfVkFVWDIgfSwJLyogIlRyaXRvbiAyIiAqLworCXsgInR3bDUwMzAiLCAwIH0sCQkvKiBUMiB1cGRhdGVkICovCisJeyAidHBzNjU5NTAiLCAwIH0sCQkvKiBjYXRhbG9nIHZlcnNpb24gb2YgdHdsNTAzMCAqLworCXsgInRwczY1OTMwIiwgVFBTX1NVQlNFVCB9LAkvKiBmZXdlciBMRE9zIGFuZCBEQUNzOyBubyBjaGFyZ2VyICovCisJeyAidHBzNjU5MjAiLCBUUFNfU1VCU0VUIH0sCS8qIGZld2VyIExET3M7IG5vIGNvZGVjIG9yIGNoYXJnZXIgKi8KIAl7IC8qIGVuZCBvZiBsaXN0ICovIH0sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHR3bDQwMzBfaWRzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3R3bDQwMzAtaXJxLmMgYi9kcml2ZXJzL21mZC90d2w0MDMwLWlycS5jCmluZGV4IGZhZTg2OGEuLmIxMDg3NjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3R3bDQwMzAtaXJxLmMKKysrIGIvZHJpdmVycy9tZmQvdHdsNDAzMC1pcnEuYwpAQCAtMTgwLDEwICsxODAsMTUgQEAKIHN0YXRpYyBpbnQgdHdsNDAzMF9pcnFfdGhyZWFkKHZvaWQgKmRhdGEpCiB7CiAJbG9uZyBpcnEgPSAobG9uZylkYXRhOwotCWlycV9kZXNjX3QgKmRlc2MgPSBpcnFfZGVzYyArIGlycTsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwogCXN0YXRpYyB1bnNpZ25lZCBpMmNfZXJyb3JzOwogCWNvbnN0IHN0YXRpYyB1bnNpZ25lZCBtYXhfaTJjX2Vycm9ycyA9IDEwMDsKIAorCWlmICghZGVzYykgeworCQlwcl9lcnIoInR3bDQwMzA6IEludmFsaWQgSVJROiAlbGRcbiIsIGlycSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOwogCiAJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKQEAgLTIxNSw3ICsyMjAsMTMgQEAKIAkJCQlwaWhfaXNyOwogCQkJCXBpaF9pc3IgPj49IDEsIG1vZHVsZV9pcnErKykgewogCQkJaWYgKHBpaF9pc3IgJiAweDEpIHsKLQkJCQlpcnFfZGVzY190ICpkID0gaXJxX2Rlc2MgKyBtb2R1bGVfaXJxOworCQkJCXN0cnVjdCBpcnFfZGVzYyAqZCA9IGlycV90b19kZXNjKG1vZHVsZV9pcnEpOworCisJCQkJaWYgKCFkKSB7CisJCQkJCXByX2VycigidHdsNDAzMDogSW52YWxpZCBTSUggSVJROiAlZFxuIiwKKwkJCQkJICAgICAgIG1vZHVsZV9pcnEpOworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CiAKIAkJCQkvKiBUaGVzZSBjYW4ndCBiZSBtYXNrZWQgLi4uIGFsd2F5cyB3YXJuCiAJCQkJICogaWYgd2UgZ2V0IGFueSBzdXJwcmlzZXMuCkBAIC00NTIsMTAgKzQ2MywxNiBAQAogCS8qIE1vZGlmeSBvbmx5IHRoZSBiaXRzIHdlIGtub3cgbXVzdCBjaGFuZ2UgKi8KIAl3aGlsZSAoZWRnZV9jaGFuZ2UpIHsKIAkJaW50CQlpID0gZmxzKGVkZ2VfY2hhbmdlKSAtIDE7Ci0JCXN0cnVjdCBpcnFfZGVzYwkqZCA9IGlycV9kZXNjICsgaSArIGFnZW50LT5pcnFfYmFzZTsKKwkJc3RydWN0IGlycV9kZXNjCSpkID0gaXJxX3RvX2Rlc2MoaSArIGFnZW50LT5pcnFfYmFzZSk7CiAJCWludAkJYnl0ZSA9IDEgKyAoaSA+PiAyKTsKIAkJaW50CQlvZmYgPSAoaSAmIDB4MykgKiAyOwogCisJCWlmICghZCkgeworCQkJcHJfZXJyKCJ0d2w0MDMwOiBJbnZhbGlkIElSUTogJWRcbiIsCisJCQkgICAgICAgaSArIGFnZW50LT5pcnFfYmFzZSk7CisJCQlyZXR1cm47CisJCX0KKwogCQlieXRlc1tieXRlXSAmPSB+KDB4MDMgPDwgb2ZmKTsKIAogCQlzcGluX2xvY2tfaXJxKCZkLT5sb2NrKTsKQEAgLTUxMiw5ICs1MjksMTQgQEAKIHN0YXRpYyBpbnQgdHdsNDAzMF9zaWhfc2V0X3R5cGUodW5zaWduZWQgaXJxLCB1bnNpZ25lZCB0cmlnZ2VyKQogewogCXN0cnVjdCBzaWhfYWdlbnQgKnNpaCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7Ci0Jc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJaWYgKCFkZXNjKSB7CisJCXByX2VycigidHdsNDAzMDogSW52YWxpZCBJUlE6ICVkXG4iLCBpcnEpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlpZiAodHJpZ2dlciAmIH4oSVJRX1RZUEVfRURHRV9GQUxMSU5HIHwgSVJRX1RZUEVfRURHRV9SSVNJTkcpKQogCQlyZXR1cm4gLUVJTlZBTDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvd204MzUwLWNvcmUuYyBiL2RyaXZlcnMvbWZkL3dtODM1MC1jb3JlLmMKaW5kZXggMGQ0N2ZiOS4uM2EyNzNjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvd204MzUwLWNvcmUuYworKysgYi9kcml2ZXJzL21mZC93bTgzNTAtY29yZS5jCkBAIC02Myw3ICs2Myw2IEBACiAgKi8KIHN0YXRpYyBERUZJTkVfTVVURVgoaW9fbXV0ZXgpOwogc3RhdGljIERFRklORV9NVVRFWChyZWdfbG9ja19tdXRleCk7Ci1zdGF0aWMgREVGSU5FX01VVEVYKGF1eGFkY19tdXRleCk7CiAKIC8qIFBlcmZvcm0gYSBwaHlzaWNhbCByZWFkIGZyb20gdGhlIGRldmljZS4KICAqLwpAQCAtMjk5LDYgKzI5OCwxMyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwod204MzUwX2Jsb2NrX3dyaXRlKTsKIAorLyoqCisgKiB3bTgzNTBfcmVnX2xvY2soKQorICoKKyAqIFRoZSBXTTgzNTAgaGFzIGEgaGFyZHdhcmUgbG9jayB3aGljaCBjYW4gYmUgdXNlZCB0byBwcmV2ZW50IHdyaXRlcyB0bworICogc29tZSByZWdpc3RlcnMgKGdlbmVyYWxseSB0aG9zZSB3aGljaCBjYW4gY2F1c2UgcGFydGljdWxhcmx5IHNlcmlvdXMKKyAqIHByb2JsZW1zIGlmIG1pc3VzZWQpLiAgVGhpcyBmdW5jdGlvbiBlbmFibGVzIHRoYXQgbG9jay4KKyAqLwogaW50IHdtODM1MF9yZWdfbG9jayhzdHJ1Y3Qgd204MzUwICp3bTgzNTApCiB7CiAJdTE2IGtleSA9IFdNODM1MF9MT0NLX0tFWTsKQEAgLTMxNCw2ICszMjAsMTUgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHdtODM1MF9yZWdfbG9jayk7CiAKKy8qKgorICogd204MzUwX3JlZ191bmxvY2soKQorICoKKyAqIFRoZSBXTTgzNTAgaGFzIGEgaGFyZHdhcmUgbG9jayB3aGljaCBjYW4gYmUgdXNlZCB0byBwcmV2ZW50IHdyaXRlcyB0bworICogc29tZSByZWdpc3RlcnMgKGdlbmVyYWxseSB0aG9zZSB3aGljaCBjYW4gY2F1c2UgcGFydGljdWxhcmx5IHNlcmlvdXMKKyAqIHByb2JsZW1zIGlmIG1pc3VzZWQpLiAgVGhpcyBmdW5jdGlvbiBkaXNhYmxlcyB0aGF0IGxvY2sgc28gdXBkYXRlcworICogY2FuIGJlIHBlcmZvcm1lZC4gIEZvciBtYXhpbXVtIHNhZmV0eSB0aGlzIHNob3VsZCBiZSBkb25lIG9ubHkgd2hlbgorICogcmVxdWlyZWQuCisgKi8KIGludCB3bTgzNTBfcmVnX3VubG9jayhzdHJ1Y3Qgd204MzUwICp3bTgzNTApCiB7CiAJdTE2IGtleSA9IFdNODM1MF9VTkxPQ0tfS0VZOwpAQCAtMTA2NiwzOCArMTA4MSwxNTggQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHdtODM1MF91bm1hc2tfaXJxKTsKIAoraW50IHdtODM1MF9yZWFkX2F1eGFkYyhzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGludCBjaGFubmVsLCBpbnQgc2NhbGUsIGludCB2cmVmKQoreworCXUxNiByZWcsIHJlc3VsdCA9IDA7CisJaW50IHRyaWVzID0gNTsKKworCWlmIChjaGFubmVsIDwgV004MzUwX0FVWEFEQ19BVVgxIHx8IGNoYW5uZWwgPiBXTTgzNTBfQVVYQURDX1RFTVApCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjaGFubmVsID49IFdNODM1MF9BVVhBRENfVVNCICYmIGNoYW5uZWwgPD0gV004MzUwX0FVWEFEQ19URU1QCisJICAgICYmIChzY2FsZSAhPSAwIHx8IHZyZWYgIT0gMCkpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmd204MzUwLT5hdXhhZGNfbXV0ZXgpOworCisJLyogVHVybiBvbiB0aGUgQURDICovCisJcmVnID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX1BPV0VSX01HTVRfNSk7CisJd204MzUwX3JlZ193cml0ZSh3bTgzNTAsIFdNODM1MF9QT1dFUl9NR01UXzUsIHJlZyB8IFdNODM1MF9BVVhBRENfRU5BKTsKKworCWlmIChzY2FsZSB8fCB2cmVmKSB7CisJCXJlZyA9IHNjYWxlIDw8IDEzOworCQlyZWcgfD0gdnJlZiA8PCAxMjsKKwkJd204MzUwX3JlZ193cml0ZSh3bTgzNTAsIFdNODM1MF9BVVgxX1JFQURCQUNLICsgY2hhbm5lbCwgcmVnKTsKKwl9CisKKwlyZWcgPSB3bTgzNTBfcmVnX3JlYWQod204MzUwLCBXTTgzNTBfRElHSVRJU0VSX0NPTlRST0xfMSk7CisJcmVnIHw9IDEgPDwgY2hhbm5lbCB8IFdNODM1MF9BVVhBRENfUE9MTDsKKwl3bTgzNTBfcmVnX3dyaXRlKHdtODM1MCwgV004MzUwX0RJR0lUSVNFUl9DT05UUk9MXzEsIHJlZyk7CisKKwlkbyB7CisJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgxKTsKKwkJcmVnID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX0RJR0lUSVNFUl9DT05UUk9MXzEpOworCX0gd2hpbGUgKHRyaWVzLS0gJiYgKHJlZyAmIFdNODM1MF9BVVhBRENfUE9MTCkpOworCisJaWYgKCF0cmllcykKKwkJZGV2X2Vycih3bTgzNTAtPmRldiwgImFkYyBjaG4gJWQgcmVhZCB0aW1lb3V0XG4iLCBjaGFubmVsKTsKKwllbHNlCisJCXJlc3VsdCA9IHdtODM1MF9yZWdfcmVhZCh3bTgzNTAsCisJCQkJCSBXTTgzNTBfQVVYMV9SRUFEQkFDSyArIGNoYW5uZWwpOworCisJLyogVHVybiBvZmYgdGhlIEFEQyAqLworCXJlZyA9IHdtODM1MF9yZWdfcmVhZCh3bTgzNTAsIFdNODM1MF9QT1dFUl9NR01UXzUpOworCXdtODM1MF9yZWdfd3JpdGUod204MzUwLCBXTTgzNTBfUE9XRVJfTUdNVF81LAorCQkJIHJlZyAmIH5XTTgzNTBfQVVYQURDX0VOQSk7CisKKwltdXRleF91bmxvY2soJndtODM1MC0+YXV4YWRjX211dGV4KTsKKworCXJldHVybiByZXN1bHQgJiBXTTgzNTBfQVVYQURDX0RBVEExX01BU0s7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh3bTgzNTBfcmVhZF9hdXhhZGMpOworCiAvKgogICogQ2FjaGUgaXMgYWx3YXlzIGhvc3QgZW5kaWFuLgogICovCi1zdGF0aWMgaW50IHdtODM1MF9jcmVhdGVfY2FjaGUoc3RydWN0IHdtODM1MCAqd204MzUwLCBpbnQgbW9kZSkKK3N0YXRpYyBpbnQgd204MzUwX2NyZWF0ZV9jYWNoZShzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGludCB0eXBlLCBpbnQgbW9kZSkKIHsKIAlpbnQgaSwgcmV0ID0gMDsKIAl1MTYgdmFsdWU7CiAJY29uc3QgdTE2ICpyZWdfbWFwOwogCi0Jc3dpdGNoIChtb2RlKSB7Ci0jaWZkZWYgQ09ORklHX01GRF9XTTgzNTBfQ09ORklHX01PREVfMAorCXN3aXRjaCAodHlwZSkgewogCWNhc2UgMDoKLQkJcmVnX21hcCA9IHdtODM1MF9tb2RlMF9kZWZhdWx0czsKLQkJYnJlYWs7CisJCXN3aXRjaCAobW9kZSkgeworI2lmZGVmIENPTkZJR19NRkRfV004MzUwX0NPTkZJR19NT0RFXzAKKwkJY2FzZSAwOgorCQkJcmVnX21hcCA9IHdtODM1MF9tb2RlMF9kZWZhdWx0czsKKwkJCWJyZWFrOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX01GRF9XTTgzNTBfQ09ORklHX01PREVfMQotCWNhc2UgMToKLQkJcmVnX21hcCA9IHdtODM1MF9tb2RlMV9kZWZhdWx0czsKLQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXJlZ19tYXAgPSB3bTgzNTBfbW9kZTFfZGVmYXVsdHM7CisJCQlicmVhazsKICNlbmRpZgogI2lmZGVmIENPTkZJR19NRkRfV004MzUwX0NPTkZJR19NT0RFXzIKLQljYXNlIDI6Ci0JCXJlZ19tYXAgPSB3bTgzNTBfbW9kZTJfZGVmYXVsdHM7Ci0JCWJyZWFrOworCQljYXNlIDI6CisJCQlyZWdfbWFwID0gd204MzUwX21vZGUyX2RlZmF1bHRzOworCQkJYnJlYWs7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfTUZEX1dNODM1MF9DT05GSUdfTU9ERV8zCi0JY2FzZSAzOgotCQlyZWdfbWFwID0gd204MzUwX21vZGUzX2RlZmF1bHRzOwotCQlicmVhazsKKwkJY2FzZSAzOgorCQkJcmVnX21hcCA9IHdtODM1MF9tb2RlM19kZWZhdWx0czsKKwkJCWJyZWFrOwogI2VuZGlmCisJCWRlZmF1bHQ6CisJCQlkZXZfZXJyKHdtODM1MC0+ZGV2LAorCQkJCSJXTTgzNTAgY29uZmlndXJhdGlvbiBtb2RlICVkIG5vdCBzdXBwb3J0ZWRcbiIsCisJCQkJbW9kZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgMToKKwkJc3dpdGNoIChtb2RlKSB7CisjaWZkZWYgQ09ORklHX01GRF9XTTgzNTFfQ09ORklHX01PREVfMAorCQljYXNlIDA6CisJCQlyZWdfbWFwID0gd204MzUxX21vZGUwX2RlZmF1bHRzOworCQkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTUZEX1dNODM1MV9DT05GSUdfTU9ERV8xCisJCWNhc2UgMToKKwkJCXJlZ19tYXAgPSB3bTgzNTFfbW9kZTFfZGVmYXVsdHM7CisJCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19NRkRfV004MzUxX0NPTkZJR19NT0RFXzIKKwkJY2FzZSAyOgorCQkJcmVnX21hcCA9IHdtODM1MV9tb2RlMl9kZWZhdWx0czsKKwkJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgQ09ORklHX01GRF9XTTgzNTFfQ09ORklHX01PREVfMworCQljYXNlIDM6CisJCQlyZWdfbWFwID0gd204MzUxX21vZGUzX2RlZmF1bHRzOworCQkJYnJlYWs7CisjZW5kaWYKKwkJZGVmYXVsdDoKKwkJCWRldl9lcnIod204MzUwLT5kZXYsCisJCQkJIldNODM1MSBjb25maWd1cmF0aW9uIG1vZGUgJWQgbm90IHN1cHBvcnRlZFxuIiwKKwkJCQltb2RlKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCisJY2FzZSAyOgorCQlzd2l0Y2ggKG1vZGUpIHsKKyNpZmRlZiBDT05GSUdfTUZEX1dNODM1Ml9DT05GSUdfTU9ERV8wCisJCWNhc2UgMDoKKwkJCXJlZ19tYXAgPSB3bTgzNTJfbW9kZTBfZGVmYXVsdHM7CisJCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19NRkRfV004MzUyX0NPTkZJR19NT0RFXzEKKwkJY2FzZSAxOgorCQkJcmVnX21hcCA9IHdtODM1Ml9tb2RlMV9kZWZhdWx0czsKKwkJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgQ09ORklHX01GRF9XTTgzNTJfQ09ORklHX01PREVfMgorCQljYXNlIDI6CisJCQlyZWdfbWFwID0gd204MzUyX21vZGUyX2RlZmF1bHRzOworCQkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTUZEX1dNODM1Ml9DT05GSUdfTU9ERV8zCisJCWNhc2UgMzoKKwkJCXJlZ19tYXAgPSB3bTgzNTJfbW9kZTNfZGVmYXVsdHM7CisJCQlicmVhazsKKyNlbmRpZgorCQlkZWZhdWx0OgorCQkJZGV2X2Vycih3bTgzNTAtPmRldiwKKwkJCQkiV004MzUyIGNvbmZpZ3VyYXRpb24gbW9kZSAlZCBub3Qgc3VwcG9ydGVkXG4iLAorCQkJCW1vZGUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisKIAlkZWZhdWx0OgotCQlkZXZfZXJyKHdtODM1MC0+ZGV2LCAiQ29uZmlndXJhdGlvbiBtb2RlICVkIG5vdCBzdXBwb3J0ZWRcbiIsCisJCWRldl9lcnIod204MzUwLT5kZXYsCisJCQkiV004MzV4IGNvbmZpZ3VyYXRpb24gbW9kZSAlZCBub3Qgc3VwcG9ydGVkXG4iLAogCQkJbW9kZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTExNjMsNTMgKzEyOTgsMTEzIEBACiAJCSAgICAgICBzdHJ1Y3Qgd204MzUwX3BsYXRmb3JtX2RhdGEgKnBkYXRhKQogewogCWludCByZXQgPSAtRUlOVkFMOwotCXUxNiBpZDEsIGlkMiwgbWFzaywgbW9kZTsKKwl1MTYgaWQxLCBpZDIsIG1hc2tfcmV2OworCXUxNiBjdXN0X2lkLCBtb2RlLCBjaGlwX3JldjsKIAogCS8qIGdldCBXTTgzNTAgcmV2aXNpb24gYW5kIGNvbmZpZyBtb2RlICovCiAJd204MzUwLT5yZWFkX2Rldih3bTgzNTAsIFdNODM1MF9SRVNFVF9JRCwgc2l6ZW9mKGlkMSksICZpZDEpOwogCXdtODM1MC0+cmVhZF9kZXYod204MzUwLCBXTTgzNTBfSUQsIHNpemVvZihpZDIpLCAmaWQyKTsKKwl3bTgzNTAtPnJlYWRfZGV2KHdtODM1MCwgV004MzUwX1JFVklTSU9OLCBzaXplb2YobWFza19yZXYpLCAmbWFza19yZXYpOwogCiAJaWQxID0gYmUxNl90b19jcHUoaWQxKTsKIAlpZDIgPSBiZTE2X3RvX2NwdShpZDIpOworCW1hc2tfcmV2ID0gYmUxNl90b19jcHUobWFza19yZXYpOwogCi0JaWYgKGlkMSA9PSAweDYxNDMpIHsKLQkJc3dpdGNoICgoaWQyICYgV004MzUwX0NISVBfUkVWX01BU0spID4+IDEyKSB7Ci0JCWNhc2UgV004MzUwX1JFVl9FOgotCQkJZGV2X2luZm8od204MzUwLT5kZXYsICJGb3VuZCBSZXYgRSBkZXZpY2VcbiIpOwotCQkJd204MzUwLT5yZXYgPSBXTTgzNTBfUkVWX0U7Ci0JCQlicmVhazsKLQkJY2FzZSBXTTgzNTBfUkVWX0Y6Ci0JCQlkZXZfaW5mbyh3bTgzNTAtPmRldiwgIkZvdW5kIFJldiBGIGRldmljZVxuIik7Ci0JCQl3bTgzNTAtPnJldiA9IFdNODM1MF9SRVZfRjsKLQkJCWJyZWFrOwotCQljYXNlIFdNODM1MF9SRVZfRzoKLQkJCWRldl9pbmZvKHdtODM1MC0+ZGV2LCAiRm91bmQgUmV2IEcgZGV2aWNlXG4iKTsKLQkJCXdtODM1MC0+cmV2ID0gV004MzUwX1JFVl9HOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQkvKiBGb3Igc2FmZXR5IHdlIHJlZnVzZSB0byBydW4gb24gdW5rbm93biBoYXJkd2FyZSAqLwotCQkJZGV2X2luZm8od204MzUwLT5kZXYsICJGb3VuZCB1bmtub3duIHJldlxuIik7Ci0JCQlyZXQgPSAtRU5PREVWOwotCQkJZ290byBlcnI7Ci0JCX0KLQl9IGVsc2UgewotCQlkZXZfaW5mbyh3bTgzNTAtPmRldiwgIkRldmljZSB3aXRoIElEICV4IGlzIG5vdCBhIFdNODM1MFxuIiwKLQkJCSBpZDEpOworCWlmIChpZDEgIT0gMHg2MTQzKSB7CisJCWRldl9lcnIod204MzUwLT5kZXYsCisJCQkiRGV2aWNlIHdpdGggSUQgJXggaXMgbm90IGEgV004MzUwXG4iLCBpZDEpOwogCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIGVycjsKIAl9CiAKIAltb2RlID0gaWQyICYgV004MzUwX0NPTkZfU1RTX01BU0sgPj4gMTA7Ci0JbWFzayA9IGlkMiAmIFdNODM1MF9DVVNUX0lEX01BU0s7Ci0JZGV2X2luZm8od204MzUwLT5kZXYsICJDb25maWcgbW9kZSAlZCwgUk9NIG1hc2sgJWRcbiIsIG1vZGUsIG1hc2spOworCWN1c3RfaWQgPSBpZDIgJiBXTTgzNTBfQ1VTVF9JRF9NQVNLOworCWNoaXBfcmV2ID0gKGlkMiAmIFdNODM1MF9DSElQX1JFVl9NQVNLKSA+PiAxMjsKKwlkZXZfaW5mbyh3bTgzNTAtPmRldiwKKwkJICJDT05GX1NUUyAlZCwgQ1VTVF9JRCAlZCwgTUFTS19SRVYgJWQsIENISVBfUkVWICVkXG4iLAorCQkgbW9kZSwgY3VzdF9pZCwgbWFza19yZXYsIGNoaXBfcmV2KTsKIAotCXJldCA9IHdtODM1MF9jcmVhdGVfY2FjaGUod204MzUwLCBtb2RlKTsKKwlpZiAoY3VzdF9pZCAhPSAwKSB7CisJCWRldl9lcnIod204MzUwLT5kZXYsICJVbnN1cHBvcnRlZCBDVVNUX0lEXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnI7CisJfQorCisJc3dpdGNoIChtYXNrX3JldikgeworCWNhc2UgMDoKKwkJd204MzUwLT5wbWljLm1heF9kY2RjID0gV004MzUwX0RDRENfNjsKKwkJd204MzUwLT5wbWljLm1heF9pc2luayA9IFdNODM1MF9JU0lOS19COworCisJCXN3aXRjaCAoY2hpcF9yZXYpIHsKKwkJY2FzZSBXTTgzNTBfUkVWX0U6CisJCQlkZXZfaW5mbyh3bTgzNTAtPmRldiwgIldNODM1MCBSZXYgRVxuIik7CisJCQlicmVhazsKKwkJY2FzZSBXTTgzNTBfUkVWX0Y6CisJCQlkZXZfaW5mbyh3bTgzNTAtPmRldiwgIldNODM1MCBSZXYgRlxuIik7CisJCQlicmVhazsKKwkJY2FzZSBXTTgzNTBfUkVWX0c6CisJCQlkZXZfaW5mbyh3bTgzNTAtPmRldiwgIldNODM1MCBSZXYgR1xuIik7CisJCQl3bTgzNTAtPnBvd2VyLnJldl9nX2NvZWZmID0gMTsKKwkJCWJyZWFrOworCQljYXNlIFdNODM1MF9SRVZfSDoKKwkJCWRldl9pbmZvKHdtODM1MC0+ZGV2LCAiV004MzUwIFJldiBIXG4iKTsKKwkJCXdtODM1MC0+cG93ZXIucmV2X2dfY29lZmYgPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBGb3Igc2FmZXR5IHdlIHJlZnVzZSB0byBydW4gb24gdW5rbm93biBoYXJkd2FyZSAqLworCQkJZGV2X2Vycih3bTgzNTAtPmRldiwgIlVua25vd24gV004MzUwIENISVBfUkVWXG4iKTsKKwkJCXJldCA9IC1FTk9ERVY7CisJCQlnb3RvIGVycjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgMToKKwkJd204MzUwLT5wbWljLm1heF9kY2RjID0gV004MzUwX0RDRENfNDsKKwkJd204MzUwLT5wbWljLm1heF9pc2luayA9IFdNODM1MF9JU0lOS19BOworCisJCXN3aXRjaCAoY2hpcF9yZXYpIHsKKwkJY2FzZSAwOgorCQkJZGV2X2luZm8od204MzUwLT5kZXYsICJXTTgzNTEgUmV2IEFcbiIpOworCQkJd204MzUwLT5wb3dlci5yZXZfZ19jb2VmZiA9IDE7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJZGV2X2Vycih3bTgzNTAtPmRldiwgIlVua25vd24gV004MzUxIENISVBfUkVWXG4iKTsKKwkJCXJldCA9IC1FTk9ERVY7CisJCQlnb3RvIGVycjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgMjoKKwkJd204MzUwLT5wbWljLm1heF9kY2RjID0gV004MzUwX0RDRENfNjsKKwkJd204MzUwLT5wbWljLm1heF9pc2luayA9IFdNODM1MF9JU0lOS19COworCisJCXN3aXRjaCAoY2hpcF9yZXYpIHsKKwkJY2FzZSAwOgorCQkJZGV2X2luZm8od204MzUwLT5kZXYsICJXTTgzNTIgUmV2IEFcbiIpOworCQkJd204MzUwLT5wb3dlci5yZXZfZ19jb2VmZiA9IDE7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJZGV2X2Vycih3bTgzNTAtPmRldiwgIlVua25vd24gV004MzUyIENISVBfUkVWXG4iKTsKKwkJCXJldCA9IC1FTk9ERVY7CisJCQlnb3RvIGVycjsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldl9lcnIod204MzUwLT5kZXYsICJVbmtub3duIE1BU0tfUkVWXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gd204MzUwX2NyZWF0ZV9jYWNoZSh3bTgzNTAsIG1hc2tfcmV2LCBtb2RlKTsKIAlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIndtODM1MDogZmFpbGVkIHRvIGNyZWF0ZSByZWdpc3RlciBjYWNoZVxuIik7CisJCWRldl9lcnIod204MzUwLT5kZXYsICJGYWlsZWQgdG8gY3JlYXRlIHJlZ2lzdGVyIGNhY2hlXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlpZiAocGRhdGEtPmluaXQpIHsKKwlpZiAocGRhdGEgJiYgcGRhdGEtPmluaXQpIHsKIAkJcmV0ID0gcGRhdGEtPmluaXQod204MzUwKTsKIAkJaWYgKHJldCAhPSAwKSB7CiAJCQlkZXZfZXJyKHdtODM1MC0+ZGV2LCAiUGxhdGZvcm0gaW5pdCgpIGZhaWxlZDogJWRcbiIsCkBAIC0xMjE4LDYgKzE0MTMsNyBAQAogCQl9CiAJfQogCisJbXV0ZXhfaW5pdCgmd204MzUwLT5hdXhhZGNfbXV0ZXgpOwogCW11dGV4X2luaXQoJndtODM1MC0+aXJxX211dGV4KTsKIAlJTklUX1dPUksoJndtODM1MC0+aXJxX3dvcmssIHdtODM1MF9pcnFfd29ya2VyKTsKIAlpZiAoaXJxKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC93bTgzNTAtaTJjLmMgYi9kcml2ZXJzL21mZC93bTgzNTAtaTJjLmMKaW5kZXggM2UwY2UwZS4uOGQ4YzkzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvd204MzUwLWkyYy5jCisrKyBiL2RyaXZlcnMvbWZkL3dtODM1MC1pMmMuYwpAQCAtMSw4ICsxLDYgQEAKIC8qCiAgKiB3bTgzNTAtaTJjLmMgIC0tICBHZW5lcmljIEkyQyBkcml2ZXIgZm9yIFdvbGZzb24gV004MzUwIFBNSUMKICAqCi0gKiBUaGlzIGRyaXZlciBkZWZpbmVzIGFuZCBjb25maWd1cmVzIHRoZSBXTTgzNTAgZm9yIHRoZSBGcmVlc2NhbGUgaS5NWDMyQURTLgotICoKICAqIENvcHlyaWdodCAyMDA3LCAyMDA4IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMuCiAgKgogICogQXV0aG9yOiBMaWFtIEdpcmR3b29kCkBAIC05OSw2ICs5Nyw4IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCB3bTgzNTBfaTJjX2lkW10gPSB7CiAgICAgICAgeyAid204MzUwIiwgMCB9LAorICAgICAgIHsgIndtODM1MSIsIDAgfSwKKyAgICAgICB7ICJ3bTgzNTIiLCAwIH0sCiAgICAgICAgeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHdtODM1MF9pMmNfaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvd204MzUwLXJlZ21hcC5jIGIvZHJpdmVycy9tZmQvd204MzUwLXJlZ21hcC5jCmluZGV4IDk3NDY3OGQuLjY4ODg3YjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3dtODM1MC1yZWdtYXAuYworKysgYi9kcml2ZXJzL21mZC93bTgzNTAtcmVnbWFwLmMKQEAgLTEwNzQsNiArMTA3NCwyMTAyIEBACiB9OwogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfTUZEX1dNODM1MV9DT05GSUdfTU9ERV8wCisKKyN1bmRlZiBXTTgzNTBfSEFWRV9DT05GSUdfTU9ERQorI2RlZmluZSBXTTgzNTBfSEFWRV9DT05GSUdfTU9ERQorCitjb25zdCB1MTYgd204MzUxX21vZGUwX2RlZmF1bHRzW10gPSB7CisJMHg2MTQzLCAgICAgLyogUjAgICAtIFJlc2V0L0lEICovCisJMHgwMDAwLCAgICAgLyogUjEgICAtIElEICovCisJMHgwMDAxLCAgICAgLyogUjIgICAtIFJldmlzaW9uICovCisJMHgxQzAyLCAgICAgLyogUjMgICAtIFN5c3RlbSBDb250cm9sIDEgKi8KKwkweDAwMDQsICAgICAvKiBSNCAgIC0gU3lzdGVtIENvbnRyb2wgMiAqLworCTB4MDAwMCwgICAgIC8qIFI1ICAgLSBTeXN0ZW0gSGliZXJuYXRlICovCisJMHg4QTAwLCAgICAgLyogUjYgICAtIEludGVyZmFjZSBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjcgKi8KKwkweDgwMDAsICAgICAvKiBSOCAgIC0gUG93ZXIgbWdtdCAoMSkgKi8KKwkweDAwMDAsICAgICAvKiBSOSAgIC0gUG93ZXIgbWdtdCAoMikgKi8KKwkweDAwMDAsICAgICAvKiBSMTAgIC0gUG93ZXIgbWdtdCAoMykgKi8KKwkweDIwMDAsICAgICAvKiBSMTEgIC0gUG93ZXIgbWdtdCAoNCkgKi8KKwkweDBFMDAsICAgICAvKiBSMTIgIC0gUG93ZXIgbWdtdCAoNSkgKi8KKwkweDAwMDAsICAgICAvKiBSMTMgIC0gUG93ZXIgbWdtdCAoNikgKi8KKwkweDAwMDAsICAgICAvKiBSMTQgIC0gUG93ZXIgbWdtdCAoNykgKi8KKwkweDAwMDAsICAgICAvKiBSMTUgKi8KKwkweDAwMDAsICAgICAvKiBSMTYgIC0gUlRDIFNlY29uZHMvTWludXRlcyAqLworCTB4MDEwMCwgICAgIC8qIFIxNyAgLSBSVEMgSG91cnMvRGF5ICovCisJMHgwMTAxLCAgICAgLyogUjE4ICAtIFJUQyBEYXRlL01vbnRoICovCisJMHgxNDAwLCAgICAgLyogUjE5ICAtIFJUQyBZZWFyICovCisJMHgwMDAwLCAgICAgLyogUjIwICAtIEFsYXJtIFNlY29uZHMvTWludXRlcyAqLworCTB4MDAwMCwgICAgIC8qIFIyMSAgLSBBbGFybSBIb3Vycy9EYXkgKi8KKwkweDAwMDAsICAgICAvKiBSMjIgIC0gQWxhcm0gRGF0ZS9Nb250aCAqLworCTB4MDMyMCwgICAgIC8qIFIyMyAgLSBSVEMgVGltZSBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjI0ICAtIFN5c3RlbSBJbnRlcnJ1cHRzICovCisJMHgwMDAwLCAgICAgLyogUjI1ICAtIEludGVycnVwdCBTdGF0dXMgMSAqLworCTB4MDAwMCwgICAgIC8qIFIyNiAgLSBJbnRlcnJ1cHQgU3RhdHVzIDIgKi8KKwkweDAwMDAsICAgICAvKiBSMjcgKi8KKwkweDAwMDAsICAgICAvKiBSMjggIC0gVW5kZXIgVm9sdGFnZSBJbnRlcnJ1cHQgc3RhdHVzICovCisJMHgwMDAwLCAgICAgLyogUjI5ICAtIE92ZXIgQ3VycmVudCBJbnRlcnJ1cHQgc3RhdHVzICovCisJMHgwMDAwLCAgICAgLyogUjMwICAtIEdQSU8gSW50ZXJydXB0IFN0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIzMSAgLSBDb21wYXJhdG9yIEludGVycnVwdCBTdGF0dXMgKi8KKwkweDNGRkYsICAgICAvKiBSMzIgIC0gU3lzdGVtIEludGVycnVwdHMgTWFzayAqLworCTB4MDAwMCwgICAgIC8qIFIzMyAgLSBJbnRlcnJ1cHQgU3RhdHVzIDEgTWFzayAqLworCTB4MDAwMCwgICAgIC8qIFIzNCAgLSBJbnRlcnJ1cHQgU3RhdHVzIDIgTWFzayAqLworCTB4MDAwMCwgICAgIC8qIFIzNSAqLworCTB4MDAwMCwgICAgIC8qIFIzNiAgLSBVbmRlciBWb2x0YWdlIEludGVycnVwdCBzdGF0dXMgTWFzayAqLworCTB4MDAwMCwgICAgIC8qIFIzNyAgLSBPdmVyIEN1cnJlbnQgSW50ZXJydXB0IHN0YXR1cyBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjM4ICAtIEdQSU8gSW50ZXJydXB0IFN0YXR1cyBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjM5ICAtIENvbXBhcmF0b3IgSW50ZXJydXB0IFN0YXR1cyBNYXNrICovCisJMHgwMDQwLCAgICAgLyogUjQwICAtIENsb2NrIENvbnRyb2wgMSAqLworCTB4MDAwMCwgICAgIC8qIFI0MSAgLSBDbG9jayBDb250cm9sIDIgKi8KKwkweDNBMDAsICAgICAvKiBSNDIgIC0gRkxMIENvbnRyb2wgMSAqLworCTB4NzA4NiwgICAgIC8qIFI0MyAgLSBGTEwgQ29udHJvbCAyICovCisJMHhDMjI2LCAgICAgLyogUjQ0ICAtIEZMTCBDb250cm9sIDMgKi8KKwkweDAwMDAsICAgICAvKiBSNDUgIC0gRkxMIENvbnRyb2wgNCAqLworCTB4MDAwMCwgICAgIC8qIFI0NiAqLworCTB4MDAwMCwgICAgIC8qIFI0NyAqLworCTB4MDAwMCwgICAgIC8qIFI0OCAgLSBEQUMgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI0OSAqLworCTB4MDBDMCwgICAgIC8qIFI1MCAgLSBEQUMgRGlnaXRhbCBWb2x1bWUgTCAqLworCTB4MDBDMCwgICAgIC8qIFI1MSAgLSBEQUMgRGlnaXRhbCBWb2x1bWUgUiAqLworCTB4MDAwMCwgICAgIC8qIFI1MiAqLworCTB4MDA0MCwgICAgIC8qIFI1MyAgLSBEQUMgTFIgUmF0ZSAqLworCTB4MDAwMCwgICAgIC8qIFI1NCAgLSBEQUMgQ2xvY2sgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI1NSAqLworCTB4MDAwMCwgICAgIC8qIFI1NiAqLworCTB4MDAwMCwgICAgIC8qIFI1NyAqLworCTB4NDAwMCwgICAgIC8qIFI1OCAgLSBEQUMgTXV0ZSAqLworCTB4MDAwMCwgICAgIC8qIFI1OSAgLSBEQUMgTXV0ZSBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSNjAgIC0gREFDIFNpZGUgKi8KKwkweDAwMDAsICAgICAvKiBSNjEgKi8KKwkweDAwMDAsICAgICAvKiBSNjIgKi8KKwkweDAwMDAsICAgICAvKiBSNjMgKi8KKwkweDgwMDAsICAgICAvKiBSNjQgIC0gQURDIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNjUgKi8KKwkweDAwQzAsICAgICAvKiBSNjYgIC0gQURDIERpZ2l0YWwgVm9sdW1lIEwgKi8KKwkweDAwQzAsICAgICAvKiBSNjcgIC0gQURDIERpZ2l0YWwgVm9sdW1lIFIgKi8KKwkweDAwMDAsICAgICAvKiBSNjggIC0gQURDIERpdmlkZXIgKi8KKwkweDAwMDAsICAgICAvKiBSNjkgKi8KKwkweDAwNDAsICAgICAvKiBSNzAgIC0gQURDIExSIFJhdGUgKi8KKwkweDAwMDAsICAgICAvKiBSNzEgKi8KKwkweDAzMDMsICAgICAvKiBSNzIgIC0gSW5wdXQgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3MyAgLSBJTjMgSW5wdXQgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3NCAgLSBNaWMgQmlhcyBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjc1ICovCisJMHgwMDAwLCAgICAgLyogUjc2ICAtIE91dHB1dCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjc3ICAtIEphY2sgRGV0ZWN0ICovCisJMHgwMDAwLCAgICAgLyogUjc4ICAtIEFudGkgUG9wIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNzkgKi8KKwkweDAwNDAsICAgICAvKiBSODAgIC0gTGVmdCBJbnB1dCBWb2x1bWUgKi8KKwkweDAwNDAsICAgICAvKiBSODEgIC0gUmlnaHQgSW5wdXQgVm9sdW1lICovCisJMHgwMDAwLCAgICAgLyogUjgyICovCisJMHgwMDAwLCAgICAgLyogUjgzICovCisJMHgwMDAwLCAgICAgLyogUjg0ICovCisJMHgwMDAwLCAgICAgLyogUjg1ICovCisJMHgwMDAwLCAgICAgLyogUjg2ICovCisJMHgwMDAwLCAgICAgLyogUjg3ICovCisJMHgwODAwLCAgICAgLyogUjg4ICAtIExlZnQgTWl4ZXIgQ29udHJvbCAqLworCTB4MTAwMCwgICAgIC8qIFI4OSAgLSBSaWdodCBNaXhlciBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjkwICovCisJMHgwMDAwLCAgICAgLyogUjkxICovCisJMHgwMDAwLCAgICAgLyogUjkyICAtIE9VVDMgTWl4ZXIgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI5MyAgLSBPVVQ0IE1peGVyIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSOTQgKi8KKwkweDAwMDAsICAgICAvKiBSOTUgKi8KKwkweDAwMDAsICAgICAvKiBSOTYgIC0gT3V0cHV0IExlZnQgTWl4ZXIgVm9sdW1lICovCisJMHgwMDAwLCAgICAgLyogUjk3ICAtIE91dHB1dCBSaWdodCBNaXhlciBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSOTggIC0gSW5wdXQgTWl4ZXIgVm9sdW1lIEwgKi8KKwkweDAwMDAsICAgICAvKiBSOTkgIC0gSW5wdXQgTWl4ZXIgVm9sdW1lIFIgKi8KKwkweDAwMDAsICAgICAvKiBSMTAwIC0gSW5wdXQgTWl4ZXIgVm9sdW1lICovCisJMHgwMDAwLCAgICAgLyogUjEwMSAqLworCTB4MDAwMCwgICAgIC8qIFIxMDIgKi8KKwkweDAwMDAsICAgICAvKiBSMTAzICovCisJMHgwMEU0LCAgICAgLyogUjEwNCAtIE9VVDFMIFZvbHVtZSAqLworCTB4MDBFNCwgICAgIC8qIFIxMDUgLSBPVVQxUiBWb2x1bWUgKi8KKwkweDAwRTQsICAgICAvKiBSMTA2IC0gT1VUMkwgVm9sdW1lICovCisJMHgwMkU0LCAgICAgLyogUjEwNyAtIE9VVDJSIFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFIxMDggKi8KKwkweDAwMDAsICAgICAvKiBSMTA5ICovCisJMHgwMDAwLCAgICAgLyogUjExMCAqLworCTB4MDAwMCwgICAgIC8qIFIxMTEgLSBCRUVQIFZvbHVtZSAqLworCTB4MEEwMCwgICAgIC8qIFIxMTIgLSBBSSBGb3JtYXRpbmcgKi8KKwkweDAwMDAsICAgICAvKiBSMTEzIC0gQURDIERBQyBDT01QICovCisJMHgwMDIwLCAgICAgLyogUjExNCAtIEFJIEFEQyBDb250cm9sICovCisJMHgwMDIwLCAgICAgLyogUjExNSAtIEFJIERBQyBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjExNiAqLworCTB4MDAwMCwgICAgIC8qIFIxMTcgKi8KKwkweDAwMDAsICAgICAvKiBSMTE4ICovCisJMHgwMDAwLCAgICAgLyogUjExOSAqLworCTB4MDAwMCwgICAgIC8qIFIxMjAgKi8KKwkweDAwMDAsICAgICAvKiBSMTIxICovCisJMHgwMDAwLCAgICAgLyogUjEyMiAqLworCTB4MDAwMCwgICAgIC8qIFIxMjMgKi8KKwkweDAwMDAsICAgICAvKiBSMTI0ICovCisJMHgwMDAwLCAgICAgLyogUjEyNSAqLworCTB4MDAwMCwgICAgIC8qIFIxMjYgKi8KKwkweDAwMDAsICAgICAvKiBSMTI3ICovCisJMHgxRkZGLCAgICAgLyogUjEyOCAtIEdQSU8gRGVib3VuY2UgKi8KKwkweDAwMDAsICAgICAvKiBSMTI5IC0gR1BJTyBQaW4gcHVsbCB1cCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjEzMCAtIEdQSU8gUHVsbCBkb3duIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTMxIC0gR1BJTyBJbnRlcnJ1cHQgTW9kZSAqLworCTB4MDAwMCwgICAgIC8qIFIxMzIgKi8KKwkweDAwMDAsICAgICAvKiBSMTMzIC0gR1BJTyBDb250cm9sICovCisJMHgwRkZDLCAgICAgLyogUjEzNCAtIEdQSU8gQ29uZmlndXJhdGlvbiAoaS9vKSAqLworCTB4MEZGQywgICAgIC8qIFIxMzUgLSBHUElPIFBpbiBQb2xhcml0eSAvIFR5cGUgKi8KKwkweDAwMDAsICAgICAvKiBSMTM2ICovCisJMHgwMDAwLCAgICAgLyogUjEzNyAqLworCTB4MDAwMCwgICAgIC8qIFIxMzggKi8KKwkweDAwMDAsICAgICAvKiBSMTM5ICovCisJMHgwMDEzLCAgICAgLyogUjE0MCAtIEdQSU8gRnVuY3Rpb24gU2VsZWN0IDEgKi8KKwkweDAwMDAsICAgICAvKiBSMTQxIC0gR1BJTyBGdW5jdGlvbiBTZWxlY3QgMiAqLworCTB4MDAwMCwgICAgIC8qIFIxNDIgLSBHUElPIEZ1bmN0aW9uIFNlbGVjdCAzICovCisJMHgwMDAzLCAgICAgLyogUjE0MyAtIEdQSU8gRnVuY3Rpb24gU2VsZWN0IDQgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ0IC0gRGlnaXRpc2VyIENvbnRyb2wgKDEpICovCisJMHgwMDAyLCAgICAgLyogUjE0NSAtIERpZ2l0aXNlciBDb250cm9sICgyKSAqLworCTB4MDAwMCwgICAgIC8qIFIxNDYgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ3ICovCisJMHgwMDAwLCAgICAgLyogUjE0OCAqLworCTB4MDAwMCwgICAgIC8qIFIxNDkgKi8KKwkweDAwMDAsICAgICAvKiBSMTUwICovCisJMHgwMDAwLCAgICAgLyogUjE1MSAqLworCTB4NzAwMCwgICAgIC8qIFIxNTIgLSBBVVgxIFJlYWRiYWNrICovCisJMHg3MDAwLCAgICAgLyogUjE1MyAtIEFVWDIgUmVhZGJhY2sgKi8KKwkweDcwMDAsICAgICAvKiBSMTU0IC0gQVVYMyBSZWFkYmFjayAqLworCTB4NzAwMCwgICAgIC8qIFIxNTUgLSBBVVg0IFJlYWRiYWNrICovCisJMHgwMDAwLCAgICAgLyogUjE1NiAtIFVTQiBWb2x0YWdlIFJlYWRiYWNrICovCisJMHgwMDAwLCAgICAgLyogUjE1NyAtIExJTkUgVm9sdGFnZSBSZWFkYmFjayAqLworCTB4MDAwMCwgICAgIC8qIFIxNTggLSBCQVRUIFZvbHRhZ2UgUmVhZGJhY2sgKi8KKwkweDAwMDAsICAgICAvKiBSMTU5IC0gQ2hpcCBUZW1wIFJlYWRiYWNrICovCisJMHgwMDAwLCAgICAgLyogUjE2MCAqLworCTB4MDAwMCwgICAgIC8qIFIxNjEgKi8KKwkweDAwMDAsICAgICAvKiBSMTYyICovCisJMHgwMDAwLCAgICAgLyogUjE2MyAtIEdlbmVyaWMgQ29tcGFyYXRvciBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjE2NCAtIEdlbmVyaWMgY29tcGFyYXRvciAxICovCisJMHgwMDAwLCAgICAgLyogUjE2NSAtIEdlbmVyaWMgY29tcGFyYXRvciAyICovCisJMHgwMDAwLCAgICAgLyogUjE2NiAtIEdlbmVyaWMgY29tcGFyYXRvciAzICovCisJMHgwMDAwLCAgICAgLyogUjE2NyAtIEdlbmVyaWMgY29tcGFyYXRvciA0ICovCisJMHhBMDBGLCAgICAgLyogUjE2OCAtIEJhdHRlcnkgQ2hhcmdlciBDb250cm9sIDEgKi8KKwkweDBCMDYsICAgICAvKiBSMTY5IC0gQmF0dGVyeSBDaGFyZ2VyIENvbnRyb2wgMiAqLworCTB4MDAwMCwgICAgIC8qIFIxNzAgLSBCYXR0ZXJ5IENoYXJnZXIgQ29udHJvbCAzICovCisJMHgwMDAwLCAgICAgLyogUjE3MSAqLworCTB4MDAwMCwgICAgIC8qIFIxNzIgLSBDdXJyZW50IFNpbmsgRHJpdmVyIEEgKi8KKwkweDAwMDAsICAgICAvKiBSMTczIC0gQ1NBIEZsYXNoIGNvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTc0ICovCisJMHgwMDAwLCAgICAgLyogUjE3NSAqLworCTB4MDAwMCwgICAgIC8qIFIxNzYgLSBEQ0RDL0xETyByZXF1ZXN0ZWQgKi8KKwkweDAzMkQsICAgICAvKiBSMTc3IC0gRENEQyBBY3RpdmUgb3B0aW9ucyAqLworCTB4MDAwMCwgICAgIC8qIFIxNzggLSBEQ0RDIFNsZWVwIG9wdGlvbnMgKi8KKwkweDAwMjUsICAgICAvKiBSMTc5IC0gUG93ZXItY2hlY2sgY29tcGFyYXRvciAqLworCTB4MDAwRSwgICAgIC8qIFIxODAgLSBEQ0RDMSBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjE4MSAtIERDREMxIFRpbWVvdXRzICovCisJMHgxMDA2LCAgICAgLyogUjE4MiAtIERDREMxIExvdyBQb3dlciAqLworCTB4MDAxOCwgICAgIC8qIFIxODMgLSBEQ0RDMiBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjE4NCAtIERDREMyIFRpbWVvdXRzICovCisJMHgwMDAwLCAgICAgLyogUjE4NSAqLworCTB4MDAwMCwgICAgIC8qIFIxODYgLSBEQ0RDMyBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjE4NyAtIERDREMzIFRpbWVvdXRzICovCisJMHgwMDA2LCAgICAgLyogUjE4OCAtIERDREMzIExvdyBQb3dlciAqLworCTB4MDAwMCwgICAgIC8qIFIxODkgLSBEQ0RDNCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjE5MCAtIERDREM0IFRpbWVvdXRzICovCisJMHgwMDA2LCAgICAgLyogUjE5MSAtIERDREM0IExvdyBQb3dlciAqLworCTB4MDAwOCwgICAgIC8qIFIxOTIgKi8KKwkweDAwMDAsICAgICAvKiBSMTkzICovCisJMHgwMDAwLCAgICAgLyogUjE5NCAqLworCTB4MDAwMCwgICAgIC8qIFIxOTUgKi8KKwkweDAwMDAsICAgICAvKiBSMTk2ICovCisJMHgwMDA2LCAgICAgLyogUjE5NyAqLworCTB4MDAwMCwgICAgIC8qIFIxOTggKi8KKwkweDAwMDMsICAgICAvKiBSMTk5IC0gTGltaXQgU3dpdGNoIENvbnRyb2wgKi8KKwkweDAwMUMsICAgICAvKiBSMjAwIC0gTERPMSBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjIwMSAtIExETzEgVGltZW91dHMgKi8KKwkweDAwMUMsICAgICAvKiBSMjAyIC0gTERPMSBMb3cgUG93ZXIgKi8KKwkweDAwMUIsICAgICAvKiBSMjAzIC0gTERPMiBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjIwNCAtIExETzIgVGltZW91dHMgKi8KKwkweDAwMUMsICAgICAvKiBSMjA1IC0gTERPMiBMb3cgUG93ZXIgKi8KKwkweDAwMUIsICAgICAvKiBSMjA2IC0gTERPMyBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjIwNyAtIExETzMgVGltZW91dHMgKi8KKwkweDAwMUMsICAgICAvKiBSMjA4IC0gTERPMyBMb3cgUG93ZXIgKi8KKwkweDAwMUIsICAgICAvKiBSMjA5IC0gTERPNCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjIxMCAtIExETzQgVGltZW91dHMgKi8KKwkweDAwMUMsICAgICAvKiBSMjExIC0gTERPNCBMb3cgUG93ZXIgKi8KKwkweDAwMDAsICAgICAvKiBSMjEyICovCisJMHgwMDAwLCAgICAgLyogUjIxMyAqLworCTB4MDAwMCwgICAgIC8qIFIyMTQgKi8KKwkweDAwMDAsICAgICAvKiBSMjE1IC0gVkNDX0ZBVUxUIE1hc2tzICovCisJMHgwMDFGLCAgICAgLyogUjIxNiAtIE1haW4gQmFuZGdhcCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjIxNyAtIE9TQyBDb250cm9sICovCisJMHg5MDAwLCAgICAgLyogUjIxOCAtIFJUQyBUaWNrIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMjE5IC0gU2VjdXJpdHkxICovCisJMHg0MDAwLCAgICAgLyogUjIyMCAqLworCTB4MDAwMCwgICAgIC8qIFIyMjEgKi8KKwkweDAwMDAsICAgICAvKiBSMjIyICovCisJMHgwMDAwLCAgICAgLyogUjIyMyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjQgLSBTaWduYWwgb3ZlcnJpZGVzICovCisJMHgwMDAwLCAgICAgLyogUjIyNSAtIERDREMvTERPIHN0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjYgLSBDaGFyZ2VyIE92ZXJpZGVzL3N0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjcgLSBtaXNjIG92ZXJyaWRlcyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjggLSBTdXBwbHkgb3ZlcnJpZGVzL3N0YXR1cyAxICovCisJMHgwMDAwLCAgICAgLyogUjIyOSAtIFN1cHBseSBvdmVycmlkZXMvc3RhdHVzIDIgKi8KKwkweEUwMDAsICAgICAvKiBSMjMwIC0gR1BJTyBQaW4gU3RhdHVzICovCisJMHgwMDAwLCAgICAgLyogUjIzMSAtIGNvbXBhcm90b3Igb3ZlcnJpZGVzICovCisJMHgwMDAwLCAgICAgLyogUjIzMiAqLworCTB4MDAwMCwgICAgIC8qIFIyMzMgLSBTdGF0ZSBNYWNoaW5lIHN0YXR1cyAqLworCTB4MTIwMCwgICAgIC8qIFIyMzQgLSBGTEwgVGVzdCAxICovCisJMHgwMDAwLCAgICAgLyogUjIzNSAqLworCTB4ODAwMCwgICAgIC8qIFIyMzYgKi8KKwkweDAwMDAsICAgICAvKiBSMjM3ICovCisJMHgwMDAwLCAgICAgLyogUjIzOCAqLworCTB4MDAwMCwgICAgIC8qIFIyMzkgKi8KKwkweDAwMDMsICAgICAvKiBSMjQwICovCisJMHgwMDAwLCAgICAgLyogUjI0MSAqLworCTB4MDAwMCwgICAgIC8qIFIyNDIgKi8KKwkweDAwMDQsICAgICAvKiBSMjQzICovCisJMHgwMzAwLCAgICAgLyogUjI0NCAqLworCTB4MDAwMCwgICAgIC8qIFIyNDUgKi8KKwkweDAyMDAsICAgICAvKiBSMjQ2ICovCisJMHgwMDAwLCAgICAgLyogUjI0NyAqLworCTB4MTAwMCwgICAgIC8qIFIyNDggLSBEQ0RDMSBUZXN0IENvbnRyb2xzICovCisJMHgxMDAwLCAgICAgLyogUjI0OSAqLworCTB4MTAwMCwgICAgIC8qIFIyNTAgLSBEQ0RDMyBUZXN0IENvbnRyb2xzICovCisJMHgxMDAwLCAgICAgLyogUjI1MSAtIERDREM0IFRlc3QgQ29udHJvbHMgKi8KK307CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NRkRfV004MzUxX0NPTkZJR19NT0RFXzEKKworI3VuZGVmIFdNODM1MF9IQVZFX0NPTkZJR19NT0RFCisjZGVmaW5lIFdNODM1MF9IQVZFX0NPTkZJR19NT0RFCisKK2NvbnN0IHUxNiB3bTgzNTFfbW9kZTFfZGVmYXVsdHNbXSA9IHsKKwkweDYxNDMsICAgICAvKiBSMCAgIC0gUmVzZXQvSUQgKi8KKwkweDAwMDAsICAgICAvKiBSMSAgIC0gSUQgKi8KKwkweDAwMDEsICAgICAvKiBSMiAgIC0gUmV2aXNpb24gKi8KKwkweDFDMDIsICAgICAvKiBSMyAgIC0gU3lzdGVtIENvbnRyb2wgMSAqLworCTB4MDIwNCwgICAgIC8qIFI0ICAgLSBTeXN0ZW0gQ29udHJvbCAyICovCisJMHgwMDAwLCAgICAgLyogUjUgICAtIFN5c3RlbSBIaWJlcm5hdGUgKi8KKwkweDhBMDAsICAgICAvKiBSNiAgIC0gSW50ZXJmYWNlIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNyAqLworCTB4ODAwMCwgICAgIC8qIFI4ICAgLSBQb3dlciBtZ210ICgxKSAqLworCTB4MDAwMCwgICAgIC8qIFI5ICAgLSBQb3dlciBtZ210ICgyKSAqLworCTB4MDAwMCwgICAgIC8qIFIxMCAgLSBQb3dlciBtZ210ICgzKSAqLworCTB4MjAwMCwgICAgIC8qIFIxMSAgLSBQb3dlciBtZ210ICg0KSAqLworCTB4MEUwMCwgICAgIC8qIFIxMiAgLSBQb3dlciBtZ210ICg1KSAqLworCTB4MDAwMCwgICAgIC8qIFIxMyAgLSBQb3dlciBtZ210ICg2KSAqLworCTB4MDAwMCwgICAgIC8qIFIxNCAgLSBQb3dlciBtZ210ICg3KSAqLworCTB4MDAwMCwgICAgIC8qIFIxNSAqLworCTB4MDAwMCwgICAgIC8qIFIxNiAgLSBSVEMgU2Vjb25kcy9NaW51dGVzICovCisJMHgwMTAwLCAgICAgLyogUjE3ICAtIFJUQyBIb3Vycy9EYXkgKi8KKwkweDAxMDEsICAgICAvKiBSMTggIC0gUlRDIERhdGUvTW9udGggKi8KKwkweDE0MDAsICAgICAvKiBSMTkgIC0gUlRDIFllYXIgKi8KKwkweDAwMDAsICAgICAvKiBSMjAgIC0gQWxhcm0gU2Vjb25kcy9NaW51dGVzICovCisJMHgwMDAwLCAgICAgLyogUjIxICAtIEFsYXJtIEhvdXJzL0RheSAqLworCTB4MDAwMCwgICAgIC8qIFIyMiAgLSBBbGFybSBEYXRlL01vbnRoICovCisJMHgwMzIwLCAgICAgLyogUjIzICAtIFJUQyBUaW1lIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMjQgIC0gU3lzdGVtIEludGVycnVwdHMgKi8KKwkweDAwMDAsICAgICAvKiBSMjUgIC0gSW50ZXJydXB0IFN0YXR1cyAxICovCisJMHgwMDAwLCAgICAgLyogUjI2ICAtIEludGVycnVwdCBTdGF0dXMgMiAqLworCTB4MDAwMCwgICAgIC8qIFIyNyAqLworCTB4MDAwMCwgICAgIC8qIFIyOCAgLSBVbmRlciBWb2x0YWdlIEludGVycnVwdCBzdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjkgIC0gT3ZlciBDdXJyZW50IEludGVycnVwdCBzdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMzAgIC0gR1BJTyBJbnRlcnJ1cHQgU3RhdHVzICovCisJMHgwMDAwLCAgICAgLyogUjMxICAtIENvbXBhcmF0b3IgSW50ZXJydXB0IFN0YXR1cyAqLworCTB4M0ZGRiwgICAgIC8qIFIzMiAgLSBTeXN0ZW0gSW50ZXJydXB0cyBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjMzICAtIEludGVycnVwdCBTdGF0dXMgMSBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjM0ICAtIEludGVycnVwdCBTdGF0dXMgMiBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjM1ICovCisJMHgwMDAwLCAgICAgLyogUjM2ICAtIFVuZGVyIFZvbHRhZ2UgSW50ZXJydXB0IHN0YXR1cyBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjM3ICAtIE92ZXIgQ3VycmVudCBJbnRlcnJ1cHQgc3RhdHVzIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzggIC0gR1BJTyBJbnRlcnJ1cHQgU3RhdHVzIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzkgIC0gQ29tcGFyYXRvciBJbnRlcnJ1cHQgU3RhdHVzIE1hc2sgKi8KKwkweDAwNDAsICAgICAvKiBSNDAgIC0gQ2xvY2sgQ29udHJvbCAxICovCisJMHgwMDAwLCAgICAgLyogUjQxICAtIENsb2NrIENvbnRyb2wgMiAqLworCTB4M0EwMCwgICAgIC8qIFI0MiAgLSBGTEwgQ29udHJvbCAxICovCisJMHg3MDg2LCAgICAgLyogUjQzICAtIEZMTCBDb250cm9sIDIgKi8KKwkweEMyMjYsICAgICAvKiBSNDQgIC0gRkxMIENvbnRyb2wgMyAqLworCTB4MDAwMCwgICAgIC8qIFI0NSAgLSBGTEwgQ29udHJvbCA0ICovCisJMHgwMDAwLCAgICAgLyogUjQ2ICovCisJMHgwMDAwLCAgICAgLyogUjQ3ICovCisJMHgwMDAwLCAgICAgLyogUjQ4ICAtIERBQyBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjQ5ICovCisJMHgwMEMwLCAgICAgLyogUjUwICAtIERBQyBEaWdpdGFsIFZvbHVtZSBMICovCisJMHgwMEMwLCAgICAgLyogUjUxICAtIERBQyBEaWdpdGFsIFZvbHVtZSBSICovCisJMHgwMDAwLCAgICAgLyogUjUyICovCisJMHgwMDQwLCAgICAgLyogUjUzICAtIERBQyBMUiBSYXRlICovCisJMHgwMDAwLCAgICAgLyogUjU0ICAtIERBQyBDbG9jayBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjU1ICovCisJMHgwMDAwLCAgICAgLyogUjU2ICovCisJMHgwMDAwLCAgICAgLyogUjU3ICovCisJMHg0MDAwLCAgICAgLyogUjU4ICAtIERBQyBNdXRlICovCisJMHgwMDAwLCAgICAgLyogUjU5ICAtIERBQyBNdXRlIFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFI2MCAgLSBEQUMgU2lkZSAqLworCTB4MDAwMCwgICAgIC8qIFI2MSAqLworCTB4MDAwMCwgICAgIC8qIFI2MiAqLworCTB4MDAwMCwgICAgIC8qIFI2MyAqLworCTB4ODAwMCwgICAgIC8qIFI2NCAgLSBBREMgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI2NSAqLworCTB4MDBDMCwgICAgIC8qIFI2NiAgLSBBREMgRGlnaXRhbCBWb2x1bWUgTCAqLworCTB4MDBDMCwgICAgIC8qIFI2NyAgLSBBREMgRGlnaXRhbCBWb2x1bWUgUiAqLworCTB4MDAwMCwgICAgIC8qIFI2OCAgLSBBREMgRGl2aWRlciAqLworCTB4MDAwMCwgICAgIC8qIFI2OSAqLworCTB4MDA0MCwgICAgIC8qIFI3MCAgLSBBREMgTFIgUmF0ZSAqLworCTB4MDAwMCwgICAgIC8qIFI3MSAqLworCTB4MDMwMywgICAgIC8qIFI3MiAgLSBJbnB1dCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjczICAtIElOMyBJbnB1dCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjc0ICAtIE1pYyBCaWFzIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNzUgKi8KKwkweDAwMDAsICAgICAvKiBSNzYgIC0gT3V0cHV0IENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNzcgIC0gSmFjayBEZXRlY3QgKi8KKwkweDAwMDAsICAgICAvKiBSNzggIC0gQW50aSBQb3AgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3OSAqLworCTB4MDA0MCwgICAgIC8qIFI4MCAgLSBMZWZ0IElucHV0IFZvbHVtZSAqLworCTB4MDA0MCwgICAgIC8qIFI4MSAgLSBSaWdodCBJbnB1dCBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSODIgKi8KKwkweDAwMDAsICAgICAvKiBSODMgKi8KKwkweDAwMDAsICAgICAvKiBSODQgKi8KKwkweDAwMDAsICAgICAvKiBSODUgKi8KKwkweDAwMDAsICAgICAvKiBSODYgKi8KKwkweDAwMDAsICAgICAvKiBSODcgKi8KKwkweDA4MDAsICAgICAvKiBSODggIC0gTGVmdCBNaXhlciBDb250cm9sICovCisJMHgxMDAwLCAgICAgLyogUjg5ICAtIFJpZ2h0IE1peGVyIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSOTAgKi8KKwkweDAwMDAsICAgICAvKiBSOTEgKi8KKwkweDAwMDAsICAgICAvKiBSOTIgIC0gT1VUMyBNaXhlciBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjkzICAtIE9VVDQgTWl4ZXIgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI5NCAqLworCTB4MDAwMCwgICAgIC8qIFI5NSAqLworCTB4MDAwMCwgICAgIC8qIFI5NiAgLSBPdXRwdXQgTGVmdCBNaXhlciBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSOTcgIC0gT3V0cHV0IFJpZ2h0IE1peGVyIFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFI5OCAgLSBJbnB1dCBNaXhlciBWb2x1bWUgTCAqLworCTB4MDAwMCwgICAgIC8qIFI5OSAgLSBJbnB1dCBNaXhlciBWb2x1bWUgUiAqLworCTB4MDAwMCwgICAgIC8qIFIxMDAgLSBJbnB1dCBNaXhlciBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSMTAxICovCisJMHgwMDAwLCAgICAgLyogUjEwMiAqLworCTB4MDAwMCwgICAgIC8qIFIxMDMgKi8KKwkweDAwRTQsICAgICAvKiBSMTA0IC0gT1VUMUwgVm9sdW1lICovCisJMHgwMEU0LCAgICAgLyogUjEwNSAtIE9VVDFSIFZvbHVtZSAqLworCTB4MDBFNCwgICAgIC8qIFIxMDYgLSBPVVQyTCBWb2x1bWUgKi8KKwkweDAyRTQsICAgICAvKiBSMTA3IC0gT1VUMlIgVm9sdW1lICovCisJMHgwMDAwLCAgICAgLyogUjEwOCAqLworCTB4MDAwMCwgICAgIC8qIFIxMDkgKi8KKwkweDAwMDAsICAgICAvKiBSMTEwICovCisJMHgwMDAwLCAgICAgLyogUjExMSAtIEJFRVAgVm9sdW1lICovCisJMHgwQTAwLCAgICAgLyogUjExMiAtIEFJIEZvcm1hdGluZyAqLworCTB4MDAwMCwgICAgIC8qIFIxMTMgLSBBREMgREFDIENPTVAgKi8KKwkweDAwMjAsICAgICAvKiBSMTE0IC0gQUkgQURDIENvbnRyb2wgKi8KKwkweDAwMjAsICAgICAvKiBSMTE1IC0gQUkgREFDIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTE2ICovCisJMHgwMDAwLCAgICAgLyogUjExNyAqLworCTB4MDAwMCwgICAgIC8qIFIxMTggKi8KKwkweDAwMDAsICAgICAvKiBSMTE5ICovCisJMHgwMDAwLCAgICAgLyogUjEyMCAqLworCTB4MDAwMCwgICAgIC8qIFIxMjEgKi8KKwkweDAwMDAsICAgICAvKiBSMTIyICovCisJMHgwMDAwLCAgICAgLyogUjEyMyAqLworCTB4MDAwMCwgICAgIC8qIFIxMjQgKi8KKwkweDAwMDAsICAgICAvKiBSMTI1ICovCisJMHgwMDAwLCAgICAgLyogUjEyNiAqLworCTB4MDAwMCwgICAgIC8qIFIxMjcgKi8KKwkweDFGRkYsICAgICAvKiBSMTI4IC0gR1BJTyBEZWJvdW5jZSAqLworCTB4MDAwMCwgICAgIC8qIFIxMjkgLSBHUElPIFBpbiBwdWxsIHVwIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTMwIC0gR1BJTyBQdWxsIGRvd24gQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxMzEgLSBHUElPIEludGVycnVwdCBNb2RlICovCisJMHgwMDAwLCAgICAgLyogUjEzMiAqLworCTB4MDAwMCwgICAgIC8qIFIxMzMgLSBHUElPIENvbnRyb2wgKi8KKwkweDBDRkIsICAgICAvKiBSMTM0IC0gR1BJTyBDb25maWd1cmF0aW9uIChpL28pICovCisJMHgwQzFGLCAgICAgLyogUjEzNSAtIEdQSU8gUGluIFBvbGFyaXR5IC8gVHlwZSAqLworCTB4MDAwMCwgICAgIC8qIFIxMzYgKi8KKwkweDAwMDAsICAgICAvKiBSMTM3ICovCisJMHgwMDAwLCAgICAgLyogUjEzOCAqLworCTB4MDAwMCwgICAgIC8qIFIxMzkgKi8KKwkweDAzMDAsICAgICAvKiBSMTQwIC0gR1BJTyBGdW5jdGlvbiBTZWxlY3QgMSAqLworCTB4MTExMCwgICAgIC8qIFIxNDEgLSBHUElPIEZ1bmN0aW9uIFNlbGVjdCAyICovCisJMHgwMDEzLCAgICAgLyogUjE0MiAtIEdQSU8gRnVuY3Rpb24gU2VsZWN0IDMgKi8KKwkweDAwMDMsICAgICAvKiBSMTQzIC0gR1BJTyBGdW5jdGlvbiBTZWxlY3QgNCAqLworCTB4MDAwMCwgICAgIC8qIFIxNDQgLSBEaWdpdGlzZXIgQ29udHJvbCAoMSkgKi8KKwkweDAwMDIsICAgICAvKiBSMTQ1IC0gRGlnaXRpc2VyIENvbnRyb2wgKDIpICovCisJMHgwMDAwLCAgICAgLyogUjE0NiAqLworCTB4MDAwMCwgICAgIC8qIFIxNDcgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ4ICovCisJMHgwMDAwLCAgICAgLyogUjE0OSAqLworCTB4MDAwMCwgICAgIC8qIFIxNTAgKi8KKwkweDAwMDAsICAgICAvKiBSMTUxICovCisJMHg3MDAwLCAgICAgLyogUjE1MiAtIEFVWDEgUmVhZGJhY2sgKi8KKwkweDcwMDAsICAgICAvKiBSMTUzIC0gQVVYMiBSZWFkYmFjayAqLworCTB4NzAwMCwgICAgIC8qIFIxNTQgLSBBVVgzIFJlYWRiYWNrICovCisJMHg3MDAwLCAgICAgLyogUjE1NSAtIEFVWDQgUmVhZGJhY2sgKi8KKwkweDAwMDAsICAgICAvKiBSMTU2IC0gVVNCIFZvbHRhZ2UgUmVhZGJhY2sgKi8KKwkweDAwMDAsICAgICAvKiBSMTU3IC0gTElORSBWb2x0YWdlIFJlYWRiYWNrICovCisJMHgwMDAwLCAgICAgLyogUjE1OCAtIEJBVFQgVm9sdGFnZSBSZWFkYmFjayAqLworCTB4MDAwMCwgICAgIC8qIFIxNTkgLSBDaGlwIFRlbXAgUmVhZGJhY2sgKi8KKwkweDAwMDAsICAgICAvKiBSMTYwICovCisJMHgwMDAwLCAgICAgLyogUjE2MSAqLworCTB4MDAwMCwgICAgIC8qIFIxNjIgKi8KKwkweDAwMDAsICAgICAvKiBSMTYzIC0gR2VuZXJpYyBDb21wYXJhdG9yIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTY0IC0gR2VuZXJpYyBjb21wYXJhdG9yIDEgKi8KKwkweDAwMDAsICAgICAvKiBSMTY1IC0gR2VuZXJpYyBjb21wYXJhdG9yIDIgKi8KKwkweDAwMDAsICAgICAvKiBSMTY2IC0gR2VuZXJpYyBjb21wYXJhdG9yIDMgKi8KKwkweDAwMDAsICAgICAvKiBSMTY3IC0gR2VuZXJpYyBjb21wYXJhdG9yIDQgKi8KKwkweEEwMEYsICAgICAvKiBSMTY4IC0gQmF0dGVyeSBDaGFyZ2VyIENvbnRyb2wgMSAqLworCTB4MEIwNiwgICAgIC8qIFIxNjkgLSBCYXR0ZXJ5IENoYXJnZXIgQ29udHJvbCAyICovCisJMHgwMDAwLCAgICAgLyogUjE3MCAtIEJhdHRlcnkgQ2hhcmdlciBDb250cm9sIDMgKi8KKwkweDAwMDAsICAgICAvKiBSMTcxICovCisJMHgwMDAwLCAgICAgLyogUjE3MiAtIEN1cnJlbnQgU2luayBEcml2ZXIgQSAqLworCTB4MDAwMCwgICAgIC8qIFIxNzMgLSBDU0EgRmxhc2ggY29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxNzQgKi8KKwkweDAwMDAsICAgICAvKiBSMTc1ICovCisJMHgwMDAwLCAgICAgLyogUjE3NiAtIERDREMvTERPIHJlcXVlc3RlZCAqLworCTB4MDMyRCwgICAgIC8qIFIxNzcgLSBEQ0RDIEFjdGl2ZSBvcHRpb25zICovCisJMHgwMDAwLCAgICAgLyogUjE3OCAtIERDREMgU2xlZXAgb3B0aW9ucyAqLworCTB4MDAyNSwgICAgIC8qIFIxNzkgLSBQb3dlci1jaGVjayBjb21wYXJhdG9yICovCisJMHgwMDBFLCAgICAgLyogUjE4MCAtIERDREMxIENvbnRyb2wgKi8KKwkweDBDMDAsICAgICAvKiBSMTgxIC0gRENEQzEgVGltZW91dHMgKi8KKwkweDEwMDYsICAgICAvKiBSMTgyIC0gRENEQzEgTG93IFBvd2VyICovCisJMHgwMDE4LCAgICAgLyogUjE4MyAtIERDREMyIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTg0IC0gRENEQzIgVGltZW91dHMgKi8KKwkweDAwMDAsICAgICAvKiBSMTg1ICovCisJMHgwMDI2LCAgICAgLyogUjE4NiAtIERDREMzIENvbnRyb2wgKi8KKwkweDA0MDAsICAgICAvKiBSMTg3IC0gRENEQzMgVGltZW91dHMgKi8KKwkweDAwMDYsICAgICAvKiBSMTg4IC0gRENEQzMgTG93IFBvd2VyICovCisJMHgwMDYyLCAgICAgLyogUjE4OSAtIERDREM0IENvbnRyb2wgKi8KKwkweDA4MDAsICAgICAvKiBSMTkwIC0gRENEQzQgVGltZW91dHMgKi8KKwkweDAwMDYsICAgICAvKiBSMTkxIC0gRENEQzQgTG93IFBvd2VyICovCisJMHgwMDA4LCAgICAgLyogUjE5MiAqLworCTB4MDAwMCwgICAgIC8qIFIxOTMgKi8KKwkweDAwMDAsICAgICAvKiBSMTk0ICovCisJMHgwMDBBLCAgICAgLyogUjE5NSAqLworCTB4MTAwMCwgICAgIC8qIFIxOTYgKi8KKwkweDAwMDYsICAgICAvKiBSMTk3ICovCisJMHgwMDAwLCAgICAgLyogUjE5OCAqLworCTB4MDAwMywgICAgIC8qIFIxOTkgLSBMaW1pdCBTd2l0Y2ggQ29udHJvbCAqLworCTB4MDAwNiwgICAgIC8qIFIyMDAgLSBMRE8xIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMjAxIC0gTERPMSBUaW1lb3V0cyAqLworCTB4MDAxQywgICAgIC8qIFIyMDIgLSBMRE8xIExvdyBQb3dlciAqLworCTB4MDAxMCwgICAgIC8qIFIyMDMgLSBMRE8yIENvbnRyb2wgKi8KKwkweDBDMDAsICAgICAvKiBSMjA0IC0gTERPMiBUaW1lb3V0cyAqLworCTB4MDAxQywgICAgIC8qIFIyMDUgLSBMRE8yIExvdyBQb3dlciAqLworCTB4MDAxRiwgICAgIC8qIFIyMDYgLSBMRE8zIENvbnRyb2wgKi8KKwkweDA4MDAsICAgICAvKiBSMjA3IC0gTERPMyBUaW1lb3V0cyAqLworCTB4MDAxQywgICAgIC8qIFIyMDggLSBMRE8zIExvdyBQb3dlciAqLworCTB4MDAwQSwgICAgIC8qIFIyMDkgLSBMRE80IENvbnRyb2wgKi8KKwkweDA4MDAsICAgICAvKiBSMjEwIC0gTERPNCBUaW1lb3V0cyAqLworCTB4MDAxQywgICAgIC8qIFIyMTEgLSBMRE80IExvdyBQb3dlciAqLworCTB4MDAwMCwgICAgIC8qIFIyMTIgKi8KKwkweDAwMDAsICAgICAvKiBSMjEzICovCisJMHgwMDAwLCAgICAgLyogUjIxNCAqLworCTB4MDAwMCwgICAgIC8qIFIyMTUgLSBWQ0NfRkFVTFQgTWFza3MgKi8KKwkweDAwMUYsICAgICAvKiBSMjE2IC0gTWFpbiBCYW5kZ2FwIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMjE3IC0gT1NDIENvbnRyb2wgKi8KKwkweDkwMDAsICAgICAvKiBSMjE4IC0gUlRDIFRpY2sgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIyMTkgLSBTZWN1cml0eTEgKi8KKwkweDQwMDAsICAgICAvKiBSMjIwICovCisJMHgwMDAwLCAgICAgLyogUjIyMSAqLworCTB4MDAwMCwgICAgIC8qIFIyMjIgKi8KKwkweDAwMDAsICAgICAvKiBSMjIzICovCisJMHgwMDAwLCAgICAgLyogUjIyNCAtIFNpZ25hbCBvdmVycmlkZXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjI1IC0gRENEQy9MRE8gc3RhdHVzICovCisJMHgwMDAwLCAgICAgLyogUjIyNiAtIENoYXJnZXIgT3ZlcmlkZXMvc3RhdHVzICovCisJMHgwMDAwLCAgICAgLyogUjIyNyAtIG1pc2Mgb3ZlcnJpZGVzICovCisJMHgwMDAwLCAgICAgLyogUjIyOCAtIFN1cHBseSBvdmVycmlkZXMvc3RhdHVzIDEgKi8KKwkweDAwMDAsICAgICAvKiBSMjI5IC0gU3VwcGx5IG92ZXJyaWRlcy9zdGF0dXMgMiAqLworCTB4RTAwMCwgICAgIC8qIFIyMzAgLSBHUElPIFBpbiBTdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjMxIC0gY29tcGFyb3RvciBvdmVycmlkZXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjMyICovCisJMHgwMDAwLCAgICAgLyogUjIzMyAtIFN0YXRlIE1hY2hpbmUgc3RhdHVzICovCisJMHgxMjAwLCAgICAgLyogUjIzNCAtIEZMTCBUZXN0IDEgKi8KKwkweDAwMDAsICAgICAvKiBSMjM1ICovCisJMHg4MDAwLCAgICAgLyogUjIzNiAqLworCTB4MDAwMCwgICAgIC8qIFIyMzcgKi8KKwkweDAwMDAsICAgICAvKiBSMjM4ICovCisJMHgwMDAwLCAgICAgLyogUjIzOSAqLworCTB4MDAwMywgICAgIC8qIFIyNDAgKi8KKwkweDAwMDAsICAgICAvKiBSMjQxICovCisJMHgwMDAwLCAgICAgLyogUjI0MiAqLworCTB4MDAwNCwgICAgIC8qIFIyNDMgKi8KKwkweDAzMDAsICAgICAvKiBSMjQ0ICovCisJMHgwMDAwLCAgICAgLyogUjI0NSAqLworCTB4MDIwMCwgICAgIC8qIFIyNDYgKi8KKwkweDEwMDAsICAgICAvKiBSMjQ3ICovCisJMHgxMDAwLCAgICAgLyogUjI0OCAtIERDREMxIFRlc3QgQ29udHJvbHMgKi8KKwkweDEwMDAsICAgICAvKiBSMjQ5ICovCisJMHgxMDAwLCAgICAgLyogUjI1MCAtIERDREMzIFRlc3QgQ29udHJvbHMgKi8KKwkweDEwMDAsICAgICAvKiBSMjUxIC0gRENEQzQgVGVzdCBDb250cm9scyAqLworfTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01GRF9XTTgzNTFfQ09ORklHX01PREVfMgorCisjdW5kZWYgV004MzUwX0hBVkVfQ09ORklHX01PREUKKyNkZWZpbmUgV004MzUwX0hBVkVfQ09ORklHX01PREUKKworY29uc3QgdTE2IHdtODM1MV9tb2RlMl9kZWZhdWx0c1tdID0geworCTB4NjE0MywgICAgIC8qIFIwICAgLSBSZXNldC9JRCAqLworCTB4MDAwMCwgICAgIC8qIFIxICAgLSBJRCAqLworCTB4MDAwMSwgICAgIC8qIFIyICAgLSBSZXZpc2lvbiAqLworCTB4MUMwMiwgICAgIC8qIFIzICAgLSBTeXN0ZW0gQ29udHJvbCAxICovCisJMHgwMjE0LCAgICAgLyogUjQgICAtIFN5c3RlbSBDb250cm9sIDIgKi8KKwkweDAwMDAsICAgICAvKiBSNSAgIC0gU3lzdGVtIEhpYmVybmF0ZSAqLworCTB4OEEwMCwgICAgIC8qIFI2ICAgLSBJbnRlcmZhY2UgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3ICovCisJMHg4MDAwLCAgICAgLyogUjggICAtIFBvd2VyIG1nbXQgKDEpICovCisJMHgwMDAwLCAgICAgLyogUjkgICAtIFBvd2VyIG1nbXQgKDIpICovCisJMHgwMDAwLCAgICAgLyogUjEwICAtIFBvd2VyIG1nbXQgKDMpICovCisJMHgyMDAwLCAgICAgLyogUjExICAtIFBvd2VyIG1nbXQgKDQpICovCisJMHgwRTAwLCAgICAgLyogUjEyICAtIFBvd2VyIG1nbXQgKDUpICovCisJMHgwMDAwLCAgICAgLyogUjEzICAtIFBvd2VyIG1nbXQgKDYpICovCisJMHgwMDAwLCAgICAgLyogUjE0ICAtIFBvd2VyIG1nbXQgKDcpICovCisJMHgwMDAwLCAgICAgLyogUjE1ICovCisJMHgwMDAwLCAgICAgLyogUjE2ICAtIFJUQyBTZWNvbmRzL01pbnV0ZXMgKi8KKwkweDAxMDAsICAgICAvKiBSMTcgIC0gUlRDIEhvdXJzL0RheSAqLworCTB4MDEwMSwgICAgIC8qIFIxOCAgLSBSVEMgRGF0ZS9Nb250aCAqLworCTB4MTQwMCwgICAgIC8qIFIxOSAgLSBSVEMgWWVhciAqLworCTB4MDAwMCwgICAgIC8qIFIyMCAgLSBBbGFybSBTZWNvbmRzL01pbnV0ZXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjEgIC0gQWxhcm0gSG91cnMvRGF5ICovCisJMHgwMDAwLCAgICAgLyogUjIyICAtIEFsYXJtIERhdGUvTW9udGggKi8KKwkweDAzMjAsICAgICAvKiBSMjMgIC0gUlRDIFRpbWUgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIyNCAgLSBTeXN0ZW0gSW50ZXJydXB0cyAqLworCTB4MDAwMCwgICAgIC8qIFIyNSAgLSBJbnRlcnJ1cHQgU3RhdHVzIDEgKi8KKwkweDAwMDAsICAgICAvKiBSMjYgIC0gSW50ZXJydXB0IFN0YXR1cyAyICovCisJMHgwMDAwLCAgICAgLyogUjI3ICovCisJMHgwMDAwLCAgICAgLyogUjI4ICAtIFVuZGVyIFZvbHRhZ2UgSW50ZXJydXB0IHN0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIyOSAgLSBPdmVyIEN1cnJlbnQgSW50ZXJydXB0IHN0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIzMCAgLSBHUElPIEludGVycnVwdCBTdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMzEgIC0gQ29tcGFyYXRvciBJbnRlcnJ1cHQgU3RhdHVzICovCisJMHgzRkZGLCAgICAgLyogUjMyICAtIFN5c3RlbSBJbnRlcnJ1cHRzIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzMgIC0gSW50ZXJydXB0IFN0YXR1cyAxIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzQgIC0gSW50ZXJydXB0IFN0YXR1cyAyIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzUgKi8KKwkweDAwMDAsICAgICAvKiBSMzYgIC0gVW5kZXIgVm9sdGFnZSBJbnRlcnJ1cHQgc3RhdHVzIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzcgIC0gT3ZlciBDdXJyZW50IEludGVycnVwdCBzdGF0dXMgTWFzayAqLworCTB4MDAwMCwgICAgIC8qIFIzOCAgLSBHUElPIEludGVycnVwdCBTdGF0dXMgTWFzayAqLworCTB4MDAwMCwgICAgIC8qIFIzOSAgLSBDb21wYXJhdG9yIEludGVycnVwdCBTdGF0dXMgTWFzayAqLworCTB4MDA0MCwgICAgIC8qIFI0MCAgLSBDbG9jayBDb250cm9sIDEgKi8KKwkweDAwMDAsICAgICAvKiBSNDEgIC0gQ2xvY2sgQ29udHJvbCAyICovCisJMHgzQTAwLCAgICAgLyogUjQyICAtIEZMTCBDb250cm9sIDEgKi8KKwkweDcwODYsICAgICAvKiBSNDMgIC0gRkxMIENvbnRyb2wgMiAqLworCTB4QzIyNiwgICAgIC8qIFI0NCAgLSBGTEwgQ29udHJvbCAzICovCisJMHgwMDAwLCAgICAgLyogUjQ1ICAtIEZMTCBDb250cm9sIDQgKi8KKwkweDAwMDAsICAgICAvKiBSNDYgKi8KKwkweDAwMDAsICAgICAvKiBSNDcgKi8KKwkweDAwMDAsICAgICAvKiBSNDggIC0gREFDIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNDkgKi8KKwkweDAwQzAsICAgICAvKiBSNTAgIC0gREFDIERpZ2l0YWwgVm9sdW1lIEwgKi8KKwkweDAwQzAsICAgICAvKiBSNTEgIC0gREFDIERpZ2l0YWwgVm9sdW1lIFIgKi8KKwkweDAwMDAsICAgICAvKiBSNTIgKi8KKwkweDAwNDAsICAgICAvKiBSNTMgIC0gREFDIExSIFJhdGUgKi8KKwkweDAwMDAsICAgICAvKiBSNTQgIC0gREFDIENsb2NrIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNTUgKi8KKwkweDAwMDAsICAgICAvKiBSNTYgKi8KKwkweDAwMDAsICAgICAvKiBSNTcgKi8KKwkweDQwMDAsICAgICAvKiBSNTggIC0gREFDIE11dGUgKi8KKwkweDAwMDAsICAgICAvKiBSNTkgIC0gREFDIE11dGUgVm9sdW1lICovCisJMHgwMDAwLCAgICAgLyogUjYwICAtIERBQyBTaWRlICovCisJMHgwMDAwLCAgICAgLyogUjYxICovCisJMHgwMDAwLCAgICAgLyogUjYyICovCisJMHgwMDAwLCAgICAgLyogUjYzICovCisJMHg4MDAwLCAgICAgLyogUjY0ICAtIEFEQyBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjY1ICovCisJMHgwMEMwLCAgICAgLyogUjY2ICAtIEFEQyBEaWdpdGFsIFZvbHVtZSBMICovCisJMHgwMEMwLCAgICAgLyogUjY3ICAtIEFEQyBEaWdpdGFsIFZvbHVtZSBSICovCisJMHgwMDAwLCAgICAgLyogUjY4ICAtIEFEQyBEaXZpZGVyICovCisJMHgwMDAwLCAgICAgLyogUjY5ICovCisJMHgwMDQwLCAgICAgLyogUjcwICAtIEFEQyBMUiBSYXRlICovCisJMHgwMDAwLCAgICAgLyogUjcxICovCisJMHgwMzAzLCAgICAgLyogUjcyICAtIElucHV0IENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNzMgIC0gSU4zIElucHV0IENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNzQgIC0gTWljIEJpYXMgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3NSAqLworCTB4MDAwMCwgICAgIC8qIFI3NiAgLSBPdXRwdXQgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3NyAgLSBKYWNrIERldGVjdCAqLworCTB4MDAwMCwgICAgIC8qIFI3OCAgLSBBbnRpIFBvcCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjc5ICovCisJMHgwMDQwLCAgICAgLyogUjgwICAtIExlZnQgSW5wdXQgVm9sdW1lICovCisJMHgwMDQwLCAgICAgLyogUjgxICAtIFJpZ2h0IElucHV0IFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFI4MiAqLworCTB4MDAwMCwgICAgIC8qIFI4MyAqLworCTB4MDAwMCwgICAgIC8qIFI4NCAqLworCTB4MDAwMCwgICAgIC8qIFI4NSAqLworCTB4MDAwMCwgICAgIC8qIFI4NiAqLworCTB4MDAwMCwgICAgIC8qIFI4NyAqLworCTB4MDgwMCwgICAgIC8qIFI4OCAgLSBMZWZ0IE1peGVyIENvbnRyb2wgKi8KKwkweDEwMDAsICAgICAvKiBSODkgIC0gUmlnaHQgTWl4ZXIgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI5MCAqLworCTB4MDAwMCwgICAgIC8qIFI5MSAqLworCTB4MDAwMCwgICAgIC8qIFI5MiAgLSBPVVQzIE1peGVyIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSOTMgIC0gT1VUNCBNaXhlciBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjk0ICovCisJMHgwMDAwLCAgICAgLyogUjk1ICovCisJMHgwMDAwLCAgICAgLyogUjk2ICAtIE91dHB1dCBMZWZ0IE1peGVyIFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFI5NyAgLSBPdXRwdXQgUmlnaHQgTWl4ZXIgVm9sdW1lICovCisJMHgwMDAwLCAgICAgLyogUjk4ICAtIElucHV0IE1peGVyIFZvbHVtZSBMICovCisJMHgwMDAwLCAgICAgLyogUjk5ICAtIElucHV0IE1peGVyIFZvbHVtZSBSICovCisJMHgwMDAwLCAgICAgLyogUjEwMCAtIElucHV0IE1peGVyIFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFIxMDEgKi8KKwkweDAwMDAsICAgICAvKiBSMTAyICovCisJMHgwMDAwLCAgICAgLyogUjEwMyAqLworCTB4MDBFNCwgICAgIC8qIFIxMDQgLSBPVVQxTCBWb2x1bWUgKi8KKwkweDAwRTQsICAgICAvKiBSMTA1IC0gT1VUMVIgVm9sdW1lICovCisJMHgwMEU0LCAgICAgLyogUjEwNiAtIE9VVDJMIFZvbHVtZSAqLworCTB4MDJFNCwgICAgIC8qIFIxMDcgLSBPVVQyUiBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSMTA4ICovCisJMHgwMDAwLCAgICAgLyogUjEwOSAqLworCTB4MDAwMCwgICAgIC8qIFIxMTAgKi8KKwkweDAwMDAsICAgICAvKiBSMTExIC0gQkVFUCBWb2x1bWUgKi8KKwkweDBBMDAsICAgICAvKiBSMTEyIC0gQUkgRm9ybWF0aW5nICovCisJMHgwMDAwLCAgICAgLyogUjExMyAtIEFEQyBEQUMgQ09NUCAqLworCTB4MDAyMCwgICAgIC8qIFIxMTQgLSBBSSBBREMgQ29udHJvbCAqLworCTB4MDAyMCwgICAgIC8qIFIxMTUgLSBBSSBEQUMgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxMTYgKi8KKwkweDAwMDAsICAgICAvKiBSMTE3ICovCisJMHgwMDAwLCAgICAgLyogUjExOCAqLworCTB4MDAwMCwgICAgIC8qIFIxMTkgKi8KKwkweDAwMDAsICAgICAvKiBSMTIwICovCisJMHgwMDAwLCAgICAgLyogUjEyMSAqLworCTB4MDAwMCwgICAgIC8qIFIxMjIgKi8KKwkweDAwMDAsICAgICAvKiBSMTIzICovCisJMHgwMDAwLCAgICAgLyogUjEyNCAqLworCTB4MDAwMCwgICAgIC8qIFIxMjUgKi8KKwkweDAwMDAsICAgICAvKiBSMTI2ICovCisJMHgwMDAwLCAgICAgLyogUjEyNyAqLworCTB4MUZGRiwgICAgIC8qIFIxMjggLSBHUElPIERlYm91bmNlICovCisJMHgwMDAwLCAgICAgLyogUjEyOSAtIEdQSU8gUGluIHB1bGwgdXAgQ29udHJvbCAqLworCTB4MDExMCwgICAgIC8qIFIxMzAgLSBHUElPIFB1bGwgZG93biBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjEzMSAtIEdQSU8gSW50ZXJydXB0IE1vZGUgKi8KKwkweDAwMDAsICAgICAvKiBSMTMyICovCisJMHgwMDAwLCAgICAgLyogUjEzMyAtIEdQSU8gQ29udHJvbCAqLworCTB4MDlGQSwgICAgIC8qIFIxMzQgLSBHUElPIENvbmZpZ3VyYXRpb24gKGkvbykgKi8KKwkweDBERjYsICAgICAvKiBSMTM1IC0gR1BJTyBQaW4gUG9sYXJpdHkgLyBUeXBlICovCisJMHgwMDAwLCAgICAgLyogUjEzNiAqLworCTB4MDAwMCwgICAgIC8qIFIxMzcgKi8KKwkweDAwMDAsICAgICAvKiBSMTM4ICovCisJMHgwMDAwLCAgICAgLyogUjEzOSAqLworCTB4MTMxMCwgICAgIC8qIFIxNDAgLSBHUElPIEZ1bmN0aW9uIFNlbGVjdCAxICovCisJMHgwMDAzLCAgICAgLyogUjE0MSAtIEdQSU8gRnVuY3Rpb24gU2VsZWN0IDIgKi8KKwkweDIwMDAsICAgICAvKiBSMTQyIC0gR1BJTyBGdW5jdGlvbiBTZWxlY3QgMyAqLworCTB4MDAwMCwgICAgIC8qIFIxNDMgLSBHUElPIEZ1bmN0aW9uIFNlbGVjdCA0ICovCisJMHgwMDAwLCAgICAgLyogUjE0NCAtIERpZ2l0aXNlciBDb250cm9sICgxKSAqLworCTB4MDAwMiwgICAgIC8qIFIxNDUgLSBEaWdpdGlzZXIgQ29udHJvbCAoMikgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ2ICovCisJMHgwMDAwLCAgICAgLyogUjE0NyAqLworCTB4MDAwMCwgICAgIC8qIFIxNDggKi8KKwkweDAwMDAsICAgICAvKiBSMTQ5ICovCisJMHgwMDAwLCAgICAgLyogUjE1MCAqLworCTB4MDAwMCwgICAgIC8qIFIxNTEgKi8KKwkweDcwMDAsICAgICAvKiBSMTUyIC0gQVVYMSBSZWFkYmFjayAqLworCTB4NzAwMCwgICAgIC8qIFIxNTMgLSBBVVgyIFJlYWRiYWNrICovCisJMHg3MDAwLCAgICAgLyogUjE1NCAtIEFVWDMgUmVhZGJhY2sgKi8KKwkweDcwMDAsICAgICAvKiBSMTU1IC0gQVVYNCBSZWFkYmFjayAqLworCTB4MDAwMCwgICAgIC8qIFIxNTYgLSBVU0IgVm9sdGFnZSBSZWFkYmFjayAqLworCTB4MDAwMCwgICAgIC8qIFIxNTcgLSBMSU5FIFZvbHRhZ2UgUmVhZGJhY2sgKi8KKwkweDAwMDAsICAgICAvKiBSMTU4IC0gQkFUVCBWb2x0YWdlIFJlYWRiYWNrICovCisJMHgwMDAwLCAgICAgLyogUjE1OSAtIENoaXAgVGVtcCBSZWFkYmFjayAqLworCTB4MDAwMCwgICAgIC8qIFIxNjAgKi8KKwkweDAwMDAsICAgICAvKiBSMTYxICovCisJMHgwMDAwLCAgICAgLyogUjE2MiAqLworCTB4MDAwMCwgICAgIC8qIFIxNjMgLSBHZW5lcmljIENvbXBhcmF0b3IgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxNjQgLSBHZW5lcmljIGNvbXBhcmF0b3IgMSAqLworCTB4MDAwMCwgICAgIC8qIFIxNjUgLSBHZW5lcmljIGNvbXBhcmF0b3IgMiAqLworCTB4MDAwMCwgICAgIC8qIFIxNjYgLSBHZW5lcmljIGNvbXBhcmF0b3IgMyAqLworCTB4MDAwMCwgICAgIC8qIFIxNjcgLSBHZW5lcmljIGNvbXBhcmF0b3IgNCAqLworCTB4QTAwRiwgICAgIC8qIFIxNjggLSBCYXR0ZXJ5IENoYXJnZXIgQ29udHJvbCAxICovCisJMHgwQjA2LCAgICAgLyogUjE2OSAtIEJhdHRlcnkgQ2hhcmdlciBDb250cm9sIDIgKi8KKwkweDAwMDAsICAgICAvKiBSMTcwIC0gQmF0dGVyeSBDaGFyZ2VyIENvbnRyb2wgMyAqLworCTB4MDAwMCwgICAgIC8qIFIxNzEgKi8KKwkweDAwMDAsICAgICAvKiBSMTcyIC0gQ3VycmVudCBTaW5rIERyaXZlciBBICovCisJMHgwMDAwLCAgICAgLyogUjE3MyAtIENTQSBGbGFzaCBjb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjE3NCAqLworCTB4MDAwMCwgICAgIC8qIFIxNzUgKi8KKwkweDAwMDAsICAgICAvKiBSMTc2IC0gRENEQy9MRE8gcmVxdWVzdGVkICovCisJMHgwMzJELCAgICAgLyogUjE3NyAtIERDREMgQWN0aXZlIG9wdGlvbnMgKi8KKwkweDAwMDAsICAgICAvKiBSMTc4IC0gRENEQyBTbGVlcCBvcHRpb25zICovCisJMHgwMDI1LCAgICAgLyogUjE3OSAtIFBvd2VyLWNoZWNrIGNvbXBhcmF0b3IgKi8KKwkweDAwMUEsICAgICAvKiBSMTgwIC0gRENEQzEgQ29udHJvbCAqLworCTB4MDgwMCwgICAgIC8qIFIxODEgLSBEQ0RDMSBUaW1lb3V0cyAqLworCTB4MTAwNiwgICAgIC8qIFIxODIgLSBEQ0RDMSBMb3cgUG93ZXIgKi8KKwkweDAwMTgsICAgICAvKiBSMTgzIC0gRENEQzIgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxODQgLSBEQ0RDMiBUaW1lb3V0cyAqLworCTB4MDAwMCwgICAgIC8qIFIxODUgKi8KKwkweDAwNTYsICAgICAvKiBSMTg2IC0gRENEQzMgQ29udHJvbCAqLworCTB4MDQwMCwgICAgIC8qIFIxODcgLSBEQ0RDMyBUaW1lb3V0cyAqLworCTB4MDAwNiwgICAgIC8qIFIxODggLSBEQ0RDMyBMb3cgUG93ZXIgKi8KKwkweDAwMjYsICAgICAvKiBSMTg5IC0gRENEQzQgQ29udHJvbCAqLworCTB4MEMwMCwgICAgIC8qIFIxOTAgLSBEQ0RDNCBUaW1lb3V0cyAqLworCTB4MDAwNiwgICAgIC8qIFIxOTEgLSBEQ0RDNCBMb3cgUG93ZXIgKi8KKwkweDAwMDgsICAgICAvKiBSMTkyICovCisJMHgwMDAwLCAgICAgLyogUjE5MyAqLworCTB4MDAwMCwgICAgIC8qIFIxOTQgKi8KKwkweDAwMjYsICAgICAvKiBSMTk1ICovCisJMHgwQzAwLCAgICAgLyogUjE5NiAqLworCTB4MDAwNiwgICAgIC8qIFIxOTcgKi8KKwkweDAwMDAsICAgICAvKiBSMTk4ICovCisJMHgwMDAzLCAgICAgLyogUjE5OSAtIExpbWl0IFN3aXRjaCBDb250cm9sICovCisJMHgwMDFDLCAgICAgLyogUjIwMCAtIExETzEgQ29udHJvbCAqLworCTB4MDQwMCwgICAgIC8qIFIyMDEgLSBMRE8xIFRpbWVvdXRzICovCisJMHgwMDFDLCAgICAgLyogUjIwMiAtIExETzEgTG93IFBvd2VyICovCisJMHgwMDEwLCAgICAgLyogUjIwMyAtIExETzIgQ29udHJvbCAqLworCTB4MEMwMCwgICAgIC8qIFIyMDQgLSBMRE8yIFRpbWVvdXRzICovCisJMHgwMDFDLCAgICAgLyogUjIwNSAtIExETzIgTG93IFBvd2VyICovCisJMHgwMDE1LCAgICAgLyogUjIwNiAtIExETzMgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIyMDcgLSBMRE8zIFRpbWVvdXRzICovCisJMHgwMDFDLCAgICAgLyogUjIwOCAtIExETzMgTG93IFBvd2VyICovCisJMHgwMDFBLCAgICAgLyogUjIwOSAtIExETzQgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIyMTAgLSBMRE80IFRpbWVvdXRzICovCisJMHgwMDFDLCAgICAgLyogUjIxMSAtIExETzQgTG93IFBvd2VyICovCisJMHgwMDAwLCAgICAgLyogUjIxMiAqLworCTB4MDAwMCwgICAgIC8qIFIyMTMgKi8KKwkweDAwMDAsICAgICAvKiBSMjE0ICovCisJMHgwMDAwLCAgICAgLyogUjIxNSAtIFZDQ19GQVVMVCBNYXNrcyAqLworCTB4MDAxRiwgICAgIC8qIFIyMTYgLSBNYWluIEJhbmRnYXAgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIyMTcgLSBPU0MgQ29udHJvbCAqLworCTB4OTAwMCwgICAgIC8qIFIyMTggLSBSVEMgVGljayBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjIxOSAtIFNlY3VyaXR5MSAqLworCTB4NDAwMCwgICAgIC8qIFIyMjAgKi8KKwkweDAwMDAsICAgICAvKiBSMjIxICovCisJMHgwMDAwLCAgICAgLyogUjIyMiAqLworCTB4MDAwMCwgICAgIC8qIFIyMjMgKi8KKwkweDAwMDAsICAgICAvKiBSMjI0IC0gU2lnbmFsIG92ZXJyaWRlcyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjUgLSBEQ0RDL0xETyBzdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjI2IC0gQ2hhcmdlciBPdmVyaWRlcy9zdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjI3IC0gbWlzYyBvdmVycmlkZXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjI4IC0gU3VwcGx5IG92ZXJyaWRlcy9zdGF0dXMgMSAqLworCTB4MDAwMCwgICAgIC8qIFIyMjkgLSBTdXBwbHkgb3ZlcnJpZGVzL3N0YXR1cyAyICovCisJMHhFMDAwLCAgICAgLyogUjIzMCAtIEdQSU8gUGluIFN0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIyMzEgLSBjb21wYXJvdG9yIG92ZXJyaWRlcyAqLworCTB4MDAwMCwgICAgIC8qIFIyMzIgKi8KKwkweDAwMDAsICAgICAvKiBSMjMzIC0gU3RhdGUgTWFjaGluZSBzdGF0dXMgKi8KKwkweDEyMDAsICAgICAvKiBSMjM0IC0gRkxMIFRlc3QgMSAqLworCTB4MDAwMCwgICAgIC8qIFIyMzUgKi8KKwkweDgwMDAsICAgICAvKiBSMjM2ICovCisJMHgwMDAwLCAgICAgLyogUjIzNyAqLworCTB4MDAwMCwgICAgIC8qIFIyMzggKi8KKwkweDAwMDAsICAgICAvKiBSMjM5ICovCisJMHgwMDAzLCAgICAgLyogUjI0MCAqLworCTB4MDAwMCwgICAgIC8qIFIyNDEgKi8KKwkweDAwMDAsICAgICAvKiBSMjQyICovCisJMHgwMDA0LCAgICAgLyogUjI0MyAqLworCTB4MDMwMCwgICAgIC8qIFIyNDQgKi8KKwkweDAwMDAsICAgICAvKiBSMjQ1ICovCisJMHgwMjAwLCAgICAgLyogUjI0NiAqLworCTB4MDAwMCwgICAgIC8qIFIyNDcgKi8KKwkweDEwMDAsICAgICAvKiBSMjQ4IC0gRENEQzEgVGVzdCBDb250cm9scyAqLworCTB4MTAwMCwgICAgIC8qIFIyNDkgKi8KKwkweDEwMDAsICAgICAvKiBSMjUwIC0gRENEQzMgVGVzdCBDb250cm9scyAqLworCTB4MTAwMCwgICAgIC8qIFIyNTEgLSBEQ0RDNCBUZXN0IENvbnRyb2xzICovCit9OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUZEX1dNODM1MV9DT05GSUdfTU9ERV8zCisKKyN1bmRlZiBXTTgzNTBfSEFWRV9DT05GSUdfTU9ERQorI2RlZmluZSBXTTgzNTBfSEFWRV9DT05GSUdfTU9ERQorCitjb25zdCB1MTYgd204MzUxX21vZGUzX2RlZmF1bHRzW10gPSB7CisJMHg2MTQzLCAgICAgLyogUjAgICAtIFJlc2V0L0lEICovCisJMHgwMDAwLCAgICAgLyogUjEgICAtIElEICovCisJMHgwMDAxLCAgICAgLyogUjIgICAtIFJldmlzaW9uICovCisJMHgxQzAyLCAgICAgLyogUjMgICAtIFN5c3RlbSBDb250cm9sIDEgKi8KKwkweDAyMDQsICAgICAvKiBSNCAgIC0gU3lzdGVtIENvbnRyb2wgMiAqLworCTB4MDAwMCwgICAgIC8qIFI1ICAgLSBTeXN0ZW0gSGliZXJuYXRlICovCisJMHg4QTAwLCAgICAgLyogUjYgICAtIEludGVyZmFjZSBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjcgKi8KKwkweDgwMDAsICAgICAvKiBSOCAgIC0gUG93ZXIgbWdtdCAoMSkgKi8KKwkweDAwMDAsICAgICAvKiBSOSAgIC0gUG93ZXIgbWdtdCAoMikgKi8KKwkweDAwMDAsICAgICAvKiBSMTAgIC0gUG93ZXIgbWdtdCAoMykgKi8KKwkweDIwMDAsICAgICAvKiBSMTEgIC0gUG93ZXIgbWdtdCAoNCkgKi8KKwkweDBFMDAsICAgICAvKiBSMTIgIC0gUG93ZXIgbWdtdCAoNSkgKi8KKwkweDAwMDAsICAgICAvKiBSMTMgIC0gUG93ZXIgbWdtdCAoNikgKi8KKwkweDAwMDAsICAgICAvKiBSMTQgIC0gUG93ZXIgbWdtdCAoNykgKi8KKwkweDAwMDAsICAgICAvKiBSMTUgKi8KKwkweDAwMDAsICAgICAvKiBSMTYgIC0gUlRDIFNlY29uZHMvTWludXRlcyAqLworCTB4MDEwMCwgICAgIC8qIFIxNyAgLSBSVEMgSG91cnMvRGF5ICovCisJMHgwMTAxLCAgICAgLyogUjE4ICAtIFJUQyBEYXRlL01vbnRoICovCisJMHgxNDAwLCAgICAgLyogUjE5ICAtIFJUQyBZZWFyICovCisJMHgwMDAwLCAgICAgLyogUjIwICAtIEFsYXJtIFNlY29uZHMvTWludXRlcyAqLworCTB4MDAwMCwgICAgIC8qIFIyMSAgLSBBbGFybSBIb3Vycy9EYXkgKi8KKwkweDAwMDAsICAgICAvKiBSMjIgIC0gQWxhcm0gRGF0ZS9Nb250aCAqLworCTB4MDMyMCwgICAgIC8qIFIyMyAgLSBSVEMgVGltZSBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjI0ICAtIFN5c3RlbSBJbnRlcnJ1cHRzICovCisJMHgwMDAwLCAgICAgLyogUjI1ICAtIEludGVycnVwdCBTdGF0dXMgMSAqLworCTB4MDAwMCwgICAgIC8qIFIyNiAgLSBJbnRlcnJ1cHQgU3RhdHVzIDIgKi8KKwkweDAwMDAsICAgICAvKiBSMjcgKi8KKwkweDAwMDAsICAgICAvKiBSMjggIC0gVW5kZXIgVm9sdGFnZSBJbnRlcnJ1cHQgc3RhdHVzICovCisJMHgwMDAwLCAgICAgLyogUjI5ICAtIE92ZXIgQ3VycmVudCBJbnRlcnJ1cHQgc3RhdHVzICovCisJMHgwMDAwLCAgICAgLyogUjMwICAtIEdQSU8gSW50ZXJydXB0IFN0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIzMSAgLSBDb21wYXJhdG9yIEludGVycnVwdCBTdGF0dXMgKi8KKwkweDNGRkYsICAgICAvKiBSMzIgIC0gU3lzdGVtIEludGVycnVwdHMgTWFzayAqLworCTB4MDAwMCwgICAgIC8qIFIzMyAgLSBJbnRlcnJ1cHQgU3RhdHVzIDEgTWFzayAqLworCTB4MDAwMCwgICAgIC8qIFIzNCAgLSBJbnRlcnJ1cHQgU3RhdHVzIDIgTWFzayAqLworCTB4MDAwMCwgICAgIC8qIFIzNSAqLworCTB4MDAwMCwgICAgIC8qIFIzNiAgLSBVbmRlciBWb2x0YWdlIEludGVycnVwdCBzdGF0dXMgTWFzayAqLworCTB4MDAwMCwgICAgIC8qIFIzNyAgLSBPdmVyIEN1cnJlbnQgSW50ZXJydXB0IHN0YXR1cyBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjM4ICAtIEdQSU8gSW50ZXJydXB0IFN0YXR1cyBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjM5ICAtIENvbXBhcmF0b3IgSW50ZXJydXB0IFN0YXR1cyBNYXNrICovCisJMHgwMDQwLCAgICAgLyogUjQwICAtIENsb2NrIENvbnRyb2wgMSAqLworCTB4MDAwMCwgICAgIC8qIFI0MSAgLSBDbG9jayBDb250cm9sIDIgKi8KKwkweDNBMDAsICAgICAvKiBSNDIgIC0gRkxMIENvbnRyb2wgMSAqLworCTB4NzA4NiwgICAgIC8qIFI0MyAgLSBGTEwgQ29udHJvbCAyICovCisJMHhDMjI2LCAgICAgLyogUjQ0ICAtIEZMTCBDb250cm9sIDMgKi8KKwkweDAwMDAsICAgICAvKiBSNDUgIC0gRkxMIENvbnRyb2wgNCAqLworCTB4MDAwMCwgICAgIC8qIFI0NiAqLworCTB4MDAwMCwgICAgIC8qIFI0NyAqLworCTB4MDAwMCwgICAgIC8qIFI0OCAgLSBEQUMgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI0OSAqLworCTB4MDBDMCwgICAgIC8qIFI1MCAgLSBEQUMgRGlnaXRhbCBWb2x1bWUgTCAqLworCTB4MDBDMCwgICAgIC8qIFI1MSAgLSBEQUMgRGlnaXRhbCBWb2x1bWUgUiAqLworCTB4MDAwMCwgICAgIC8qIFI1MiAqLworCTB4MDA0MCwgICAgIC8qIFI1MyAgLSBEQUMgTFIgUmF0ZSAqLworCTB4MDAwMCwgICAgIC8qIFI1NCAgLSBEQUMgQ2xvY2sgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI1NSAqLworCTB4MDAwMCwgICAgIC8qIFI1NiAqLworCTB4MDAwMCwgICAgIC8qIFI1NyAqLworCTB4NDAwMCwgICAgIC8qIFI1OCAgLSBEQUMgTXV0ZSAqLworCTB4MDAwMCwgICAgIC8qIFI1OSAgLSBEQUMgTXV0ZSBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSNjAgIC0gREFDIFNpZGUgKi8KKwkweDAwMDAsICAgICAvKiBSNjEgKi8KKwkweDAwMDAsICAgICAvKiBSNjIgKi8KKwkweDAwMDAsICAgICAvKiBSNjMgKi8KKwkweDgwMDAsICAgICAvKiBSNjQgIC0gQURDIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNjUgKi8KKwkweDAwQzAsICAgICAvKiBSNjYgIC0gQURDIERpZ2l0YWwgVm9sdW1lIEwgKi8KKwkweDAwQzAsICAgICAvKiBSNjcgIC0gQURDIERpZ2l0YWwgVm9sdW1lIFIgKi8KKwkweDAwMDAsICAgICAvKiBSNjggIC0gQURDIERpdmlkZXIgKi8KKwkweDAwMDAsICAgICAvKiBSNjkgKi8KKwkweDAwNDAsICAgICAvKiBSNzAgIC0gQURDIExSIFJhdGUgKi8KKwkweDAwMDAsICAgICAvKiBSNzEgKi8KKwkweDAzMDMsICAgICAvKiBSNzIgIC0gSW5wdXQgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3MyAgLSBJTjMgSW5wdXQgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3NCAgLSBNaWMgQmlhcyBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjc1ICovCisJMHgwMDAwLCAgICAgLyogUjc2ICAtIE91dHB1dCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjc3ICAtIEphY2sgRGV0ZWN0ICovCisJMHgwMDAwLCAgICAgLyogUjc4ICAtIEFudGkgUG9wIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNzkgKi8KKwkweDAwNDAsICAgICAvKiBSODAgIC0gTGVmdCBJbnB1dCBWb2x1bWUgKi8KKwkweDAwNDAsICAgICAvKiBSODEgIC0gUmlnaHQgSW5wdXQgVm9sdW1lICovCisJMHgwMDAwLCAgICAgLyogUjgyICovCisJMHgwMDAwLCAgICAgLyogUjgzICovCisJMHgwMDAwLCAgICAgLyogUjg0ICovCisJMHgwMDAwLCAgICAgLyogUjg1ICovCisJMHgwMDAwLCAgICAgLyogUjg2ICovCisJMHgwMDAwLCAgICAgLyogUjg3ICovCisJMHgwODAwLCAgICAgLyogUjg4ICAtIExlZnQgTWl4ZXIgQ29udHJvbCAqLworCTB4MTAwMCwgICAgIC8qIFI4OSAgLSBSaWdodCBNaXhlciBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjkwICovCisJMHgwMDAwLCAgICAgLyogUjkxICovCisJMHgwMDAwLCAgICAgLyogUjkyICAtIE9VVDMgTWl4ZXIgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI5MyAgLSBPVVQ0IE1peGVyIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSOTQgKi8KKwkweDAwMDAsICAgICAvKiBSOTUgKi8KKwkweDAwMDAsICAgICAvKiBSOTYgIC0gT3V0cHV0IExlZnQgTWl4ZXIgVm9sdW1lICovCisJMHgwMDAwLCAgICAgLyogUjk3ICAtIE91dHB1dCBSaWdodCBNaXhlciBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSOTggIC0gSW5wdXQgTWl4ZXIgVm9sdW1lIEwgKi8KKwkweDAwMDAsICAgICAvKiBSOTkgIC0gSW5wdXQgTWl4ZXIgVm9sdW1lIFIgKi8KKwkweDAwMDAsICAgICAvKiBSMTAwIC0gSW5wdXQgTWl4ZXIgVm9sdW1lICovCisJMHgwMDAwLCAgICAgLyogUjEwMSAqLworCTB4MDAwMCwgICAgIC8qIFIxMDIgKi8KKwkweDAwMDAsICAgICAvKiBSMTAzICovCisJMHgwMEU0LCAgICAgLyogUjEwNCAtIE9VVDFMIFZvbHVtZSAqLworCTB4MDBFNCwgICAgIC8qIFIxMDUgLSBPVVQxUiBWb2x1bWUgKi8KKwkweDAwRTQsICAgICAvKiBSMTA2IC0gT1VUMkwgVm9sdW1lICovCisJMHgwMkU0LCAgICAgLyogUjEwNyAtIE9VVDJSIFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFIxMDggKi8KKwkweDAwMDAsICAgICAvKiBSMTA5ICovCisJMHgwMDAwLCAgICAgLyogUjExMCAqLworCTB4MDAwMCwgICAgIC8qIFIxMTEgLSBCRUVQIFZvbHVtZSAqLworCTB4MEEwMCwgICAgIC8qIFIxMTIgLSBBSSBGb3JtYXRpbmcgKi8KKwkweDAwMDAsICAgICAvKiBSMTEzIC0gQURDIERBQyBDT01QICovCisJMHgwMDIwLCAgICAgLyogUjExNCAtIEFJIEFEQyBDb250cm9sICovCisJMHgwMDIwLCAgICAgLyogUjExNSAtIEFJIERBQyBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjExNiAqLworCTB4MDAwMCwgICAgIC8qIFIxMTcgKi8KKwkweDAwMDAsICAgICAvKiBSMTE4ICovCisJMHgwMDAwLCAgICAgLyogUjExOSAqLworCTB4MDAwMCwgICAgIC8qIFIxMjAgKi8KKwkweDAwMDAsICAgICAvKiBSMTIxICovCisJMHgwMDAwLCAgICAgLyogUjEyMiAqLworCTB4MDAwMCwgICAgIC8qIFIxMjMgKi8KKwkweDAwMDAsICAgICAvKiBSMTI0ICovCisJMHgwMDAwLCAgICAgLyogUjEyNSAqLworCTB4MDAwMCwgICAgIC8qIFIxMjYgKi8KKwkweDAwMDAsICAgICAvKiBSMTI3ICovCisJMHgxRkZGLCAgICAgLyogUjEyOCAtIEdQSU8gRGVib3VuY2UgKi8KKwkweDAwMTAsICAgICAvKiBSMTI5IC0gR1BJTyBQaW4gcHVsbCB1cCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjEzMCAtIEdQSU8gUHVsbCBkb3duIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTMxIC0gR1BJTyBJbnRlcnJ1cHQgTW9kZSAqLworCTB4MDAwMCwgICAgIC8qIFIxMzIgKi8KKwkweDAwMDAsICAgICAvKiBSMTMzIC0gR1BJTyBDb250cm9sICovCisJMHgwQkZCLCAgICAgLyogUjEzNCAtIEdQSU8gQ29uZmlndXJhdGlvbiAoaS9vKSAqLworCTB4MEZGRCwgICAgIC8qIFIxMzUgLSBHUElPIFBpbiBQb2xhcml0eSAvIFR5cGUgKi8KKwkweDAwMDAsICAgICAvKiBSMTM2ICovCisJMHgwMDAwLCAgICAgLyogUjEzNyAqLworCTB4MDAwMCwgICAgIC8qIFIxMzggKi8KKwkweDAwMDAsICAgICAvKiBSMTM5ICovCisJMHgwMzEwLCAgICAgLyogUjE0MCAtIEdQSU8gRnVuY3Rpb24gU2VsZWN0IDEgKi8KKwkweDAwMDEsICAgICAvKiBSMTQxIC0gR1BJTyBGdW5jdGlvbiBTZWxlY3QgMiAqLworCTB4MjMwMCwgICAgIC8qIFIxNDIgLSBHUElPIEZ1bmN0aW9uIFNlbGVjdCAzICovCisJMHgwMDAzLCAgICAgLyogUjE0MyAtIEdQSU8gRnVuY3Rpb24gU2VsZWN0IDQgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ0IC0gRGlnaXRpc2VyIENvbnRyb2wgKDEpICovCisJMHgwMDAyLCAgICAgLyogUjE0NSAtIERpZ2l0aXNlciBDb250cm9sICgyKSAqLworCTB4MDAwMCwgICAgIC8qIFIxNDYgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ3ICovCisJMHgwMDAwLCAgICAgLyogUjE0OCAqLworCTB4MDAwMCwgICAgIC8qIFIxNDkgKi8KKwkweDAwMDAsICAgICAvKiBSMTUwICovCisJMHgwMDAwLCAgICAgLyogUjE1MSAqLworCTB4NzAwMCwgICAgIC8qIFIxNTIgLSBBVVgxIFJlYWRiYWNrICovCisJMHg3MDAwLCAgICAgLyogUjE1MyAtIEFVWDIgUmVhZGJhY2sgKi8KKwkweDcwMDAsICAgICAvKiBSMTU0IC0gQVVYMyBSZWFkYmFjayAqLworCTB4NzAwMCwgICAgIC8qIFIxNTUgLSBBVVg0IFJlYWRiYWNrICovCisJMHgwMDAwLCAgICAgLyogUjE1NiAtIFVTQiBWb2x0YWdlIFJlYWRiYWNrICovCisJMHgwMDAwLCAgICAgLyogUjE1NyAtIExJTkUgVm9sdGFnZSBSZWFkYmFjayAqLworCTB4MDAwMCwgICAgIC8qIFIxNTggLSBCQVRUIFZvbHRhZ2UgUmVhZGJhY2sgKi8KKwkweDAwMDAsICAgICAvKiBSMTU5IC0gQ2hpcCBUZW1wIFJlYWRiYWNrICovCisJMHgwMDAwLCAgICAgLyogUjE2MCAqLworCTB4MDAwMCwgICAgIC8qIFIxNjEgKi8KKwkweDAwMDAsICAgICAvKiBSMTYyICovCisJMHgwMDAwLCAgICAgLyogUjE2MyAtIEdlbmVyaWMgQ29tcGFyYXRvciBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjE2NCAtIEdlbmVyaWMgY29tcGFyYXRvciAxICovCisJMHgwMDAwLCAgICAgLyogUjE2NSAtIEdlbmVyaWMgY29tcGFyYXRvciAyICovCisJMHgwMDAwLCAgICAgLyogUjE2NiAtIEdlbmVyaWMgY29tcGFyYXRvciAzICovCisJMHgwMDAwLCAgICAgLyogUjE2NyAtIEdlbmVyaWMgY29tcGFyYXRvciA0ICovCisJMHhBMDBGLCAgICAgLyogUjE2OCAtIEJhdHRlcnkgQ2hhcmdlciBDb250cm9sIDEgKi8KKwkweDBCMDYsICAgICAvKiBSMTY5IC0gQmF0dGVyeSBDaGFyZ2VyIENvbnRyb2wgMiAqLworCTB4MDAwMCwgICAgIC8qIFIxNzAgLSBCYXR0ZXJ5IENoYXJnZXIgQ29udHJvbCAzICovCisJMHgwMDAwLCAgICAgLyogUjE3MSAqLworCTB4MDAwMCwgICAgIC8qIFIxNzIgLSBDdXJyZW50IFNpbmsgRHJpdmVyIEEgKi8KKwkweDAwMDAsICAgICAvKiBSMTczIC0gQ1NBIEZsYXNoIGNvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTc0ICovCisJMHgwMDAwLCAgICAgLyogUjE3NSAqLworCTB4MDAwMCwgICAgIC8qIFIxNzYgLSBEQ0RDL0xETyByZXF1ZXN0ZWQgKi8KKwkweDAzMkQsICAgICAvKiBSMTc3IC0gRENEQyBBY3RpdmUgb3B0aW9ucyAqLworCTB4MDAwMCwgICAgIC8qIFIxNzggLSBEQ0RDIFNsZWVwIG9wdGlvbnMgKi8KKwkweDAwMjUsICAgICAvKiBSMTc5IC0gUG93ZXItY2hlY2sgY29tcGFyYXRvciAqLworCTB4MDAwRSwgICAgIC8qIFIxODAgLSBEQ0RDMSBDb250cm9sICovCisJMHgwNDAwLCAgICAgLyogUjE4MSAtIERDREMxIFRpbWVvdXRzICovCisJMHgxMDA2LCAgICAgLyogUjE4MiAtIERDREMxIExvdyBQb3dlciAqLworCTB4MDAxOCwgICAgIC8qIFIxODMgLSBEQ0RDMiBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjE4NCAtIERDREMyIFRpbWVvdXRzICovCisJMHgwMDAwLCAgICAgLyogUjE4NSAqLworCTB4MDAyNiwgICAgIC8qIFIxODYgLSBEQ0RDMyBDb250cm9sICovCisJMHgwODAwLCAgICAgLyogUjE4NyAtIERDREMzIFRpbWVvdXRzICovCisJMHgwMDA2LCAgICAgLyogUjE4OCAtIERDREMzIExvdyBQb3dlciAqLworCTB4MDA2MiwgICAgIC8qIFIxODkgLSBEQ0RDNCBDb250cm9sICovCisJMHgxNDAwLCAgICAgLyogUjE5MCAtIERDREM0IFRpbWVvdXRzICovCisJMHgwMDA2LCAgICAgLyogUjE5MSAtIERDREM0IExvdyBQb3dlciAqLworCTB4MDAwOCwgICAgIC8qIFIxOTIgKi8KKwkweDAwMDAsICAgICAvKiBSMTkzICovCisJMHgwMDAwLCAgICAgLyogUjE5NCAqLworCTB4MDAyNiwgICAgIC8qIFIxOTUgKi8KKwkweDA0MDAsICAgICAvKiBSMTk2ICovCisJMHgwMDA2LCAgICAgLyogUjE5NyAqLworCTB4MDAwMCwgICAgIC8qIFIxOTggKi8KKwkweDAwMDMsICAgICAvKiBSMTk5IC0gTGltaXQgU3dpdGNoIENvbnRyb2wgKi8KKwkweDAwMDYsICAgICAvKiBSMjAwIC0gTERPMSBDb250cm9sICovCisJMHgwQzAwLCAgICAgLyogUjIwMSAtIExETzEgVGltZW91dHMgKi8KKwkweDAwMUMsICAgICAvKiBSMjAyIC0gTERPMSBMb3cgUG93ZXIgKi8KKwkweDAwMTYsICAgICAvKiBSMjAzIC0gTERPMiBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjIwNCAtIExETzIgVGltZW91dHMgKi8KKwkweDAwMUMsICAgICAvKiBSMjA1IC0gTERPMiBMb3cgUG93ZXIgKi8KKwkweDAwMTksICAgICAvKiBSMjA2IC0gTERPMyBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjIwNyAtIExETzMgVGltZW91dHMgKi8KKwkweDAwMUMsICAgICAvKiBSMjA4IC0gTERPMyBMb3cgUG93ZXIgKi8KKwkweDAwMUEsICAgICAvKiBSMjA5IC0gTERPNCBDb250cm9sICovCisJMHgxMDAwLCAgICAgLyogUjIxMCAtIExETzQgVGltZW91dHMgKi8KKwkweDAwMUMsICAgICAvKiBSMjExIC0gTERPNCBMb3cgUG93ZXIgKi8KKwkweDAwMDAsICAgICAvKiBSMjEyICovCisJMHgwMDAwLCAgICAgLyogUjIxMyAqLworCTB4MDAwMCwgICAgIC8qIFIyMTQgKi8KKwkweDAwMDAsICAgICAvKiBSMjE1IC0gVkNDX0ZBVUxUIE1hc2tzICovCisJMHgwMDFGLCAgICAgLyogUjIxNiAtIE1haW4gQmFuZGdhcCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjIxNyAtIE9TQyBDb250cm9sICovCisJMHg5MDAwLCAgICAgLyogUjIxOCAtIFJUQyBUaWNrIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMjE5IC0gU2VjdXJpdHkxICovCisJMHg0MDAwLCAgICAgLyogUjIyMCAqLworCTB4MDAwMCwgICAgIC8qIFIyMjEgKi8KKwkweDAwMDAsICAgICAvKiBSMjIyICovCisJMHgwMDAwLCAgICAgLyogUjIyMyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjQgLSBTaWduYWwgb3ZlcnJpZGVzICovCisJMHgwMDAwLCAgICAgLyogUjIyNSAtIERDREMvTERPIHN0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjYgLSBDaGFyZ2VyIE92ZXJpZGVzL3N0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjcgLSBtaXNjIG92ZXJyaWRlcyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjggLSBTdXBwbHkgb3ZlcnJpZGVzL3N0YXR1cyAxICovCisJMHgwMDAwLCAgICAgLyogUjIyOSAtIFN1cHBseSBvdmVycmlkZXMvc3RhdHVzIDIgKi8KKwkweEUwMDAsICAgICAvKiBSMjMwIC0gR1BJTyBQaW4gU3RhdHVzICovCisJMHgwMDAwLCAgICAgLyogUjIzMSAtIGNvbXBhcm90b3Igb3ZlcnJpZGVzICovCisJMHgwMDAwLCAgICAgLyogUjIzMiAqLworCTB4MDAwMCwgICAgIC8qIFIyMzMgLSBTdGF0ZSBNYWNoaW5lIHN0YXR1cyAqLworCTB4MTIwMCwgICAgIC8qIFIyMzQgLSBGTEwgVGVzdCAxICovCisJMHgwMDAwLCAgICAgLyogUjIzNSAqLworCTB4ODAwMCwgICAgIC8qIFIyMzYgKi8KKwkweDAwMDAsICAgICAvKiBSMjM3ICovCisJMHgwMDAwLCAgICAgLyogUjIzOCAqLworCTB4MDAwMCwgICAgIC8qIFIyMzkgKi8KKwkweDAwMDMsICAgICAvKiBSMjQwICovCisJMHgwMDAwLCAgICAgLyogUjI0MSAqLworCTB4MDAwMCwgICAgIC8qIFIyNDIgKi8KKwkweDAwMDQsICAgICAvKiBSMjQzICovCisJMHgwMzAwLCAgICAgLyogUjI0NCAqLworCTB4MDAwMCwgICAgIC8qIFIyNDUgKi8KKwkweDAyMDAsICAgICAvKiBSMjQ2ICovCisJMHgwMDAwLCAgICAgLyogUjI0NyAqLworCTB4MTAwMCwgICAgIC8qIFIyNDggLSBEQ0RDMSBUZXN0IENvbnRyb2xzICovCisJMHgxMDAwLCAgICAgLyogUjI0OSAqLworCTB4MTAwMCwgICAgIC8qIFIyNTAgLSBEQ0RDMyBUZXN0IENvbnRyb2xzICovCisJMHgxMDAwLCAgICAgLyogUjI1MSAtIERDREM0IFRlc3QgQ29udHJvbHMgKi8KK307CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NRkRfV004MzUyX0NPTkZJR19NT0RFXzAKKworI3VuZGVmIFdNODM1MF9IQVZFX0NPTkZJR19NT0RFCisjZGVmaW5lIFdNODM1MF9IQVZFX0NPTkZJR19NT0RFCisKK2NvbnN0IHUxNiB3bTgzNTJfbW9kZTBfZGVmYXVsdHNbXSA9IHsKKwkweDYxNDMsICAgICAvKiBSMCAgIC0gUmVzZXQvSUQgKi8KKwkweDAwMDAsICAgICAvKiBSMSAgIC0gSUQgKi8KKwkweDAwMDIsICAgICAvKiBSMiAgIC0gUmV2aXNpb24gKi8KKwkweDFDMDIsICAgICAvKiBSMyAgIC0gU3lzdGVtIENvbnRyb2wgMSAqLworCTB4MDAwNCwgICAgIC8qIFI0ICAgLSBTeXN0ZW0gQ29udHJvbCAyICovCisJMHgwMDAwLCAgICAgLyogUjUgICAtIFN5c3RlbSBIaWJlcm5hdGUgKi8KKwkweDhBMDAsICAgICAvKiBSNiAgIC0gSW50ZXJmYWNlIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNyAqLworCTB4ODAwMCwgICAgIC8qIFI4ICAgLSBQb3dlciBtZ210ICgxKSAqLworCTB4MDAwMCwgICAgIC8qIFI5ICAgLSBQb3dlciBtZ210ICgyKSAqLworCTB4MDAwMCwgICAgIC8qIFIxMCAgLSBQb3dlciBtZ210ICgzKSAqLworCTB4MjAwMCwgICAgIC8qIFIxMSAgLSBQb3dlciBtZ210ICg0KSAqLworCTB4MEUwMCwgICAgIC8qIFIxMiAgLSBQb3dlciBtZ210ICg1KSAqLworCTB4MDAwMCwgICAgIC8qIFIxMyAgLSBQb3dlciBtZ210ICg2KSAqLworCTB4MDAwMCwgICAgIC8qIFIxNCAgLSBQb3dlciBtZ210ICg3KSAqLworCTB4MDAwMCwgICAgIC8qIFIxNSAqLworCTB4MDAwMCwgICAgIC8qIFIxNiAgLSBSVEMgU2Vjb25kcy9NaW51dGVzICovCisJMHgwMTAwLCAgICAgLyogUjE3ICAtIFJUQyBIb3Vycy9EYXkgKi8KKwkweDAxMDEsICAgICAvKiBSMTggIC0gUlRDIERhdGUvTW9udGggKi8KKwkweDE0MDAsICAgICAvKiBSMTkgIC0gUlRDIFllYXIgKi8KKwkweDAwMDAsICAgICAvKiBSMjAgIC0gQWxhcm0gU2Vjb25kcy9NaW51dGVzICovCisJMHgwMDAwLCAgICAgLyogUjIxICAtIEFsYXJtIEhvdXJzL0RheSAqLworCTB4MDAwMCwgICAgIC8qIFIyMiAgLSBBbGFybSBEYXRlL01vbnRoICovCisJMHgwMzIwLCAgICAgLyogUjIzICAtIFJUQyBUaW1lIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMjQgIC0gU3lzdGVtIEludGVycnVwdHMgKi8KKwkweDAwMDAsICAgICAvKiBSMjUgIC0gSW50ZXJydXB0IFN0YXR1cyAxICovCisJMHgwMDAwLCAgICAgLyogUjI2ICAtIEludGVycnVwdCBTdGF0dXMgMiAqLworCTB4MDAwMCwgICAgIC8qIFIyNyAqLworCTB4MDAwMCwgICAgIC8qIFIyOCAgLSBVbmRlciBWb2x0YWdlIEludGVycnVwdCBzdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjkgIC0gT3ZlciBDdXJyZW50IEludGVycnVwdCBzdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMzAgIC0gR1BJTyBJbnRlcnJ1cHQgU3RhdHVzICovCisJMHgwMDAwLCAgICAgLyogUjMxICAtIENvbXBhcmF0b3IgSW50ZXJydXB0IFN0YXR1cyAqLworCTB4M0ZGRiwgICAgIC8qIFIzMiAgLSBTeXN0ZW0gSW50ZXJydXB0cyBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjMzICAtIEludGVycnVwdCBTdGF0dXMgMSBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjM0ICAtIEludGVycnVwdCBTdGF0dXMgMiBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjM1ICovCisJMHgwMDAwLCAgICAgLyogUjM2ICAtIFVuZGVyIFZvbHRhZ2UgSW50ZXJydXB0IHN0YXR1cyBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjM3ICAtIE92ZXIgQ3VycmVudCBJbnRlcnJ1cHQgc3RhdHVzIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzggIC0gR1BJTyBJbnRlcnJ1cHQgU3RhdHVzIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzkgIC0gQ29tcGFyYXRvciBJbnRlcnJ1cHQgU3RhdHVzIE1hc2sgKi8KKwkweDAwNDAsICAgICAvKiBSNDAgIC0gQ2xvY2sgQ29udHJvbCAxICovCisJMHgwMDAwLCAgICAgLyogUjQxICAtIENsb2NrIENvbnRyb2wgMiAqLworCTB4M0EwMCwgICAgIC8qIFI0MiAgLSBGTEwgQ29udHJvbCAxICovCisJMHg3MDg2LCAgICAgLyogUjQzICAtIEZMTCBDb250cm9sIDIgKi8KKwkweEMyMjYsICAgICAvKiBSNDQgIC0gRkxMIENvbnRyb2wgMyAqLworCTB4MDAwMCwgICAgIC8qIFI0NSAgLSBGTEwgQ29udHJvbCA0ICovCisJMHgwMDAwLCAgICAgLyogUjQ2ICovCisJMHgwMDAwLCAgICAgLyogUjQ3ICovCisJMHgwMDAwLCAgICAgLyogUjQ4ICAtIERBQyBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjQ5ICovCisJMHgwMEMwLCAgICAgLyogUjUwICAtIERBQyBEaWdpdGFsIFZvbHVtZSBMICovCisJMHgwMEMwLCAgICAgLyogUjUxICAtIERBQyBEaWdpdGFsIFZvbHVtZSBSICovCisJMHgwMDAwLCAgICAgLyogUjUyICovCisJMHgwMDQwLCAgICAgLyogUjUzICAtIERBQyBMUiBSYXRlICovCisJMHgwMDAwLCAgICAgLyogUjU0ICAtIERBQyBDbG9jayBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjU1ICovCisJMHgwMDAwLCAgICAgLyogUjU2ICovCisJMHgwMDAwLCAgICAgLyogUjU3ICovCisJMHg0MDAwLCAgICAgLyogUjU4ICAtIERBQyBNdXRlICovCisJMHgwMDAwLCAgICAgLyogUjU5ICAtIERBQyBNdXRlIFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFI2MCAgLSBEQUMgU2lkZSAqLworCTB4MDAwMCwgICAgIC8qIFI2MSAqLworCTB4MDAwMCwgICAgIC8qIFI2MiAqLworCTB4MDAwMCwgICAgIC8qIFI2MyAqLworCTB4ODAwMCwgICAgIC8qIFI2NCAgLSBBREMgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI2NSAqLworCTB4MDBDMCwgICAgIC8qIFI2NiAgLSBBREMgRGlnaXRhbCBWb2x1bWUgTCAqLworCTB4MDBDMCwgICAgIC8qIFI2NyAgLSBBREMgRGlnaXRhbCBWb2x1bWUgUiAqLworCTB4MDAwMCwgICAgIC8qIFI2OCAgLSBBREMgRGl2aWRlciAqLworCTB4MDAwMCwgICAgIC8qIFI2OSAqLworCTB4MDA0MCwgICAgIC8qIFI3MCAgLSBBREMgTFIgUmF0ZSAqLworCTB4MDAwMCwgICAgIC8qIFI3MSAqLworCTB4MDMwMywgICAgIC8qIFI3MiAgLSBJbnB1dCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjczICAtIElOMyBJbnB1dCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjc0ICAtIE1pYyBCaWFzIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNzUgKi8KKwkweDAwMDAsICAgICAvKiBSNzYgIC0gT3V0cHV0IENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNzcgIC0gSmFjayBEZXRlY3QgKi8KKwkweDAwMDAsICAgICAvKiBSNzggIC0gQW50aSBQb3AgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3OSAqLworCTB4MDA0MCwgICAgIC8qIFI4MCAgLSBMZWZ0IElucHV0IFZvbHVtZSAqLworCTB4MDA0MCwgICAgIC8qIFI4MSAgLSBSaWdodCBJbnB1dCBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSODIgKi8KKwkweDAwMDAsICAgICAvKiBSODMgKi8KKwkweDAwMDAsICAgICAvKiBSODQgKi8KKwkweDAwMDAsICAgICAvKiBSODUgKi8KKwkweDAwMDAsICAgICAvKiBSODYgKi8KKwkweDAwMDAsICAgICAvKiBSODcgKi8KKwkweDA4MDAsICAgICAvKiBSODggIC0gTGVmdCBNaXhlciBDb250cm9sICovCisJMHgxMDAwLCAgICAgLyogUjg5ICAtIFJpZ2h0IE1peGVyIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSOTAgKi8KKwkweDAwMDAsICAgICAvKiBSOTEgKi8KKwkweDAwMDAsICAgICAvKiBSOTIgIC0gT1VUMyBNaXhlciBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjkzICAtIE9VVDQgTWl4ZXIgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI5NCAqLworCTB4MDAwMCwgICAgIC8qIFI5NSAqLworCTB4MDAwMCwgICAgIC8qIFI5NiAgLSBPdXRwdXQgTGVmdCBNaXhlciBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSOTcgIC0gT3V0cHV0IFJpZ2h0IE1peGVyIFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFI5OCAgLSBJbnB1dCBNaXhlciBWb2x1bWUgTCAqLworCTB4MDAwMCwgICAgIC8qIFI5OSAgLSBJbnB1dCBNaXhlciBWb2x1bWUgUiAqLworCTB4MDAwMCwgICAgIC8qIFIxMDAgLSBJbnB1dCBNaXhlciBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSMTAxICovCisJMHgwMDAwLCAgICAgLyogUjEwMiAqLworCTB4MDAwMCwgICAgIC8qIFIxMDMgKi8KKwkweDAwRTQsICAgICAvKiBSMTA0IC0gT1VUMUwgVm9sdW1lICovCisJMHgwMEU0LCAgICAgLyogUjEwNSAtIE9VVDFSIFZvbHVtZSAqLworCTB4MDBFNCwgICAgIC8qIFIxMDYgLSBPVVQyTCBWb2x1bWUgKi8KKwkweDAyRTQsICAgICAvKiBSMTA3IC0gT1VUMlIgVm9sdW1lICovCisJMHgwMDAwLCAgICAgLyogUjEwOCAqLworCTB4MDAwMCwgICAgIC8qIFIxMDkgKi8KKwkweDAwMDAsICAgICAvKiBSMTEwICovCisJMHgwMDAwLCAgICAgLyogUjExMSAtIEJFRVAgVm9sdW1lICovCisJMHgwQTAwLCAgICAgLyogUjExMiAtIEFJIEZvcm1hdGluZyAqLworCTB4MDAwMCwgICAgIC8qIFIxMTMgLSBBREMgREFDIENPTVAgKi8KKwkweDAwMjAsICAgICAvKiBSMTE0IC0gQUkgQURDIENvbnRyb2wgKi8KKwkweDAwMjAsICAgICAvKiBSMTE1IC0gQUkgREFDIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTE2ICovCisJMHgwMDAwLCAgICAgLyogUjExNyAqLworCTB4MDAwMCwgICAgIC8qIFIxMTggKi8KKwkweDAwMDAsICAgICAvKiBSMTE5ICovCisJMHgwMDAwLCAgICAgLyogUjEyMCAqLworCTB4MDAwMCwgICAgIC8qIFIxMjEgKi8KKwkweDAwMDAsICAgICAvKiBSMTIyICovCisJMHgwMDAwLCAgICAgLyogUjEyMyAqLworCTB4MDAwMCwgICAgIC8qIFIxMjQgKi8KKwkweDAwMDAsICAgICAvKiBSMTI1ICovCisJMHgwMDAwLCAgICAgLyogUjEyNiAqLworCTB4MDAwMCwgICAgIC8qIFIxMjcgKi8KKwkweDFGRkYsICAgICAvKiBSMTI4IC0gR1BJTyBEZWJvdW5jZSAqLworCTB4MDAwMCwgICAgIC8qIFIxMjkgLSBHUElPIFBpbiBwdWxsIHVwIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTMwIC0gR1BJTyBQdWxsIGRvd24gQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxMzEgLSBHUElPIEludGVycnVwdCBNb2RlICovCisJMHgwMDAwLCAgICAgLyogUjEzMiAqLworCTB4MDAwMCwgICAgIC8qIFIxMzMgLSBHUElPIENvbnRyb2wgKi8KKwkweDBGRkMsICAgICAvKiBSMTM0IC0gR1BJTyBDb25maWd1cmF0aW9uIChpL28pICovCisJMHgwRkZDLCAgICAgLyogUjEzNSAtIEdQSU8gUGluIFBvbGFyaXR5IC8gVHlwZSAqLworCTB4MDAwMCwgICAgIC8qIFIxMzYgKi8KKwkweDAwMDAsICAgICAvKiBSMTM3ICovCisJMHgwMDAwLCAgICAgLyogUjEzOCAqLworCTB4MDAwMCwgICAgIC8qIFIxMzkgKi8KKwkweDAwMTMsICAgICAvKiBSMTQwIC0gR1BJTyBGdW5jdGlvbiBTZWxlY3QgMSAqLworCTB4MDAwMCwgICAgIC8qIFIxNDEgLSBHUElPIEZ1bmN0aW9uIFNlbGVjdCAyICovCisJMHgwMDAwLCAgICAgLyogUjE0MiAtIEdQSU8gRnVuY3Rpb24gU2VsZWN0IDMgKi8KKwkweDAwMDMsICAgICAvKiBSMTQzIC0gR1BJTyBGdW5jdGlvbiBTZWxlY3QgNCAqLworCTB4MDAwMCwgICAgIC8qIFIxNDQgLSBEaWdpdGlzZXIgQ29udHJvbCAoMSkgKi8KKwkweDAwMDIsICAgICAvKiBSMTQ1IC0gRGlnaXRpc2VyIENvbnRyb2wgKDIpICovCisJMHgwMDAwLCAgICAgLyogUjE0NiAqLworCTB4MDAwMCwgICAgIC8qIFIxNDcgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ4ICovCisJMHgwMDAwLCAgICAgLyogUjE0OSAqLworCTB4MDAwMCwgICAgIC8qIFIxNTAgKi8KKwkweDAwMDAsICAgICAvKiBSMTUxICovCisJMHg3MDAwLCAgICAgLyogUjE1MiAtIEFVWDEgUmVhZGJhY2sgKi8KKwkweDcwMDAsICAgICAvKiBSMTUzIC0gQVVYMiBSZWFkYmFjayAqLworCTB4NzAwMCwgICAgIC8qIFIxNTQgLSBBVVgzIFJlYWRiYWNrICovCisJMHg3MDAwLCAgICAgLyogUjE1NSAtIEFVWDQgUmVhZGJhY2sgKi8KKwkweDAwMDAsICAgICAvKiBSMTU2IC0gVVNCIFZvbHRhZ2UgUmVhZGJhY2sgKi8KKwkweDAwMDAsICAgICAvKiBSMTU3IC0gTElORSBWb2x0YWdlIFJlYWRiYWNrICovCisJMHgwMDAwLCAgICAgLyogUjE1OCAtIEJBVFQgVm9sdGFnZSBSZWFkYmFjayAqLworCTB4MDAwMCwgICAgIC8qIFIxNTkgLSBDaGlwIFRlbXAgUmVhZGJhY2sgKi8KKwkweDAwMDAsICAgICAvKiBSMTYwICovCisJMHgwMDAwLCAgICAgLyogUjE2MSAqLworCTB4MDAwMCwgICAgIC8qIFIxNjIgKi8KKwkweDAwMDAsICAgICAvKiBSMTYzIC0gR2VuZXJpYyBDb21wYXJhdG9yIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTY0IC0gR2VuZXJpYyBjb21wYXJhdG9yIDEgKi8KKwkweDAwMDAsICAgICAvKiBSMTY1IC0gR2VuZXJpYyBjb21wYXJhdG9yIDIgKi8KKwkweDAwMDAsICAgICAvKiBSMTY2IC0gR2VuZXJpYyBjb21wYXJhdG9yIDMgKi8KKwkweDAwMDAsICAgICAvKiBSMTY3IC0gR2VuZXJpYyBjb21wYXJhdG9yIDQgKi8KKwkweEEwMEYsICAgICAvKiBSMTY4IC0gQmF0dGVyeSBDaGFyZ2VyIENvbnRyb2wgMSAqLworCTB4MEIwNiwgICAgIC8qIFIxNjkgLSBCYXR0ZXJ5IENoYXJnZXIgQ29udHJvbCAyICovCisJMHgwMDAwLCAgICAgLyogUjE3MCAtIEJhdHRlcnkgQ2hhcmdlciBDb250cm9sIDMgKi8KKwkweDAwMDAsICAgICAvKiBSMTcxICovCisJMHgwMDAwLCAgICAgLyogUjE3MiAtIEN1cnJlbnQgU2luayBEcml2ZXIgQSAqLworCTB4MDAwMCwgICAgIC8qIFIxNzMgLSBDU0EgRmxhc2ggY29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxNzQgLSBDdXJyZW50IFNpbmsgRHJpdmVyIEIgKi8KKwkweDAwMDAsICAgICAvKiBSMTc1IC0gQ1NCIEZsYXNoIGNvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTc2IC0gRENEQy9MRE8gcmVxdWVzdGVkICovCisJMHgwMzJELCAgICAgLyogUjE3NyAtIERDREMgQWN0aXZlIG9wdGlvbnMgKi8KKwkweDAwMDAsICAgICAvKiBSMTc4IC0gRENEQyBTbGVlcCBvcHRpb25zICovCisJMHgwMDI1LCAgICAgLyogUjE3OSAtIFBvd2VyLWNoZWNrIGNvbXBhcmF0b3IgKi8KKwkweDAwMEUsICAgICAvKiBSMTgwIC0gRENEQzEgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxODEgLSBEQ0RDMSBUaW1lb3V0cyAqLworCTB4MTAwNiwgICAgIC8qIFIxODIgLSBEQ0RDMSBMb3cgUG93ZXIgKi8KKwkweDAwMTgsICAgICAvKiBSMTgzIC0gRENEQzIgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxODQgLSBEQ0RDMiBUaW1lb3V0cyAqLworCTB4MDAwMCwgICAgIC8qIFIxODUgKi8KKwkweDAwMDAsICAgICAvKiBSMTg2IC0gRENEQzMgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxODcgLSBEQ0RDMyBUaW1lb3V0cyAqLworCTB4MDAwNiwgICAgIC8qIFIxODggLSBEQ0RDMyBMb3cgUG93ZXIgKi8KKwkweDAwMDAsICAgICAvKiBSMTg5IC0gRENEQzQgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxOTAgLSBEQ0RDNCBUaW1lb3V0cyAqLworCTB4MDAwNiwgICAgIC8qIFIxOTEgLSBEQ0RDNCBMb3cgUG93ZXIgKi8KKwkweDAwMDgsICAgICAvKiBSMTkyIC0gRENEQzUgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxOTMgLSBEQ0RDNSBUaW1lb3V0cyAqLworCTB4MDAwMCwgICAgIC8qIFIxOTQgKi8KKwkweDAwMDAsICAgICAvKiBSMTk1IC0gRENEQzYgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxOTYgLSBEQ0RDNiBUaW1lb3V0cyAqLworCTB4MDAwNiwgICAgIC8qIFIxOTcgLSBEQ0RDNiBMb3cgUG93ZXIgKi8KKwkweDAwMDAsICAgICAvKiBSMTk4ICovCisJMHgwMDAzLCAgICAgLyogUjE5OSAtIExpbWl0IFN3aXRjaCBDb250cm9sICovCisJMHgwMDFDLCAgICAgLyogUjIwMCAtIExETzEgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIyMDEgLSBMRE8xIFRpbWVvdXRzICovCisJMHgwMDFDLCAgICAgLyogUjIwMiAtIExETzEgTG93IFBvd2VyICovCisJMHgwMDFCLCAgICAgLyogUjIwMyAtIExETzIgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIyMDQgLSBMRE8yIFRpbWVvdXRzICovCisJMHgwMDFDLCAgICAgLyogUjIwNSAtIExETzIgTG93IFBvd2VyICovCisJMHgwMDFCLCAgICAgLyogUjIwNiAtIExETzMgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIyMDcgLSBMRE8zIFRpbWVvdXRzICovCisJMHgwMDFDLCAgICAgLyogUjIwOCAtIExETzMgTG93IFBvd2VyICovCisJMHgwMDFCLCAgICAgLyogUjIwOSAtIExETzQgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIyMTAgLSBMRE80IFRpbWVvdXRzICovCisJMHgwMDFDLCAgICAgLyogUjIxMSAtIExETzQgTG93IFBvd2VyICovCisJMHgwMDAwLCAgICAgLyogUjIxMiAqLworCTB4MDAwMCwgICAgIC8qIFIyMTMgKi8KKwkweDAwMDAsICAgICAvKiBSMjE0ICovCisJMHgwMDAwLCAgICAgLyogUjIxNSAtIFZDQ19GQVVMVCBNYXNrcyAqLworCTB4MDAxRiwgICAgIC8qIFIyMTYgLSBNYWluIEJhbmRnYXAgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIyMTcgLSBPU0MgQ29udHJvbCAqLworCTB4OTAwMCwgICAgIC8qIFIyMTggLSBSVEMgVGljayBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjIxOSAtIFNlY3VyaXR5MSAqLworCTB4NDAwMCwgICAgIC8qIFIyMjAgKi8KKwkweDAwMDAsICAgICAvKiBSMjIxICovCisJMHgwMDAwLCAgICAgLyogUjIyMiAqLworCTB4MDAwMCwgICAgIC8qIFIyMjMgKi8KKwkweDAwMDAsICAgICAvKiBSMjI0IC0gU2lnbmFsIG92ZXJyaWRlcyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjUgLSBEQ0RDL0xETyBzdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjI2IC0gQ2hhcmdlciBPdmVyaWRlcy9zdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjI3IC0gbWlzYyBvdmVycmlkZXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjI4IC0gU3VwcGx5IG92ZXJyaWRlcy9zdGF0dXMgMSAqLworCTB4MDAwMCwgICAgIC8qIFIyMjkgLSBTdXBwbHkgb3ZlcnJpZGVzL3N0YXR1cyAyICovCisJMHhFMDAwLCAgICAgLyogUjIzMCAtIEdQSU8gUGluIFN0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIyMzEgLSBjb21wYXJvdG9yIG92ZXJyaWRlcyAqLworCTB4MDAwMCwgICAgIC8qIFIyMzIgKi8KKwkweDAwMDAsICAgICAvKiBSMjMzIC0gU3RhdGUgTWFjaGluZSBzdGF0dXMgKi8KKwkweDEyMDAsICAgICAvKiBSMjM0ICovCisJMHgwMDAwLCAgICAgLyogUjIzNSAqLworCTB4ODAwMCwgICAgIC8qIFIyMzYgKi8KKwkweDAwMDAsICAgICAvKiBSMjM3ICovCisJMHgwMDAwLCAgICAgLyogUjIzOCAqLworCTB4MDAwMCwgICAgIC8qIFIyMzkgKi8KKwkweDAwMDMsICAgICAvKiBSMjQwICovCisJMHgwMDAwLCAgICAgLyogUjI0MSAqLworCTB4MDAwMCwgICAgIC8qIFIyNDIgKi8KKwkweDAwMDQsICAgICAvKiBSMjQzICovCisJMHgwMzAwLCAgICAgLyogUjI0NCAqLworCTB4MDAwMCwgICAgIC8qIFIyNDUgKi8KKwkweDAyMDAsICAgICAvKiBSMjQ2ICovCisJMHgwMDAwLCAgICAgLyogUjI0NyAqLworCTB4MTAwMCwgICAgIC8qIFIyNDggLSBEQ0RDMSBUZXN0IENvbnRyb2xzICovCisJMHg1MDAwLCAgICAgLyogUjI0OSAqLworCTB4MTAwMCwgICAgIC8qIFIyNTAgLSBEQ0RDMyBUZXN0IENvbnRyb2xzICovCisJMHgxMDAwLCAgICAgLyogUjI1MSAtIERDREM0IFRlc3QgQ29udHJvbHMgKi8KKwkweDUxMDAsICAgICAvKiBSMjUyICovCisJMHgxMDAwLCAgICAgLyogUjI1MyAtIERDREM2IFRlc3QgQ29udHJvbHMgKi8KK307CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NRkRfV004MzUyX0NPTkZJR19NT0RFXzEKKworI3VuZGVmIFdNODM1MF9IQVZFX0NPTkZJR19NT0RFCisjZGVmaW5lIFdNODM1MF9IQVZFX0NPTkZJR19NT0RFCisKK2NvbnN0IHUxNiB3bTgzNTJfbW9kZTFfZGVmYXVsdHNbXSA9IHsKKwkweDYxNDMsICAgICAvKiBSMCAgIC0gUmVzZXQvSUQgKi8KKwkweDAwMDAsICAgICAvKiBSMSAgIC0gSUQgKi8KKwkweDAwMDIsICAgICAvKiBSMiAgIC0gUmV2aXNpb24gKi8KKwkweDFDMDIsICAgICAvKiBSMyAgIC0gU3lzdGVtIENvbnRyb2wgMSAqLworCTB4MDIwNCwgICAgIC8qIFI0ICAgLSBTeXN0ZW0gQ29udHJvbCAyICovCisJMHgwMDAwLCAgICAgLyogUjUgICAtIFN5c3RlbSBIaWJlcm5hdGUgKi8KKwkweDhBMDAsICAgICAvKiBSNiAgIC0gSW50ZXJmYWNlIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNyAqLworCTB4ODAwMCwgICAgIC8qIFI4ICAgLSBQb3dlciBtZ210ICgxKSAqLworCTB4MDAwMCwgICAgIC8qIFI5ICAgLSBQb3dlciBtZ210ICgyKSAqLworCTB4MDAwMCwgICAgIC8qIFIxMCAgLSBQb3dlciBtZ210ICgzKSAqLworCTB4MjAwMCwgICAgIC8qIFIxMSAgLSBQb3dlciBtZ210ICg0KSAqLworCTB4MEUwMCwgICAgIC8qIFIxMiAgLSBQb3dlciBtZ210ICg1KSAqLworCTB4MDAwMCwgICAgIC8qIFIxMyAgLSBQb3dlciBtZ210ICg2KSAqLworCTB4MDAwMCwgICAgIC8qIFIxNCAgLSBQb3dlciBtZ210ICg3KSAqLworCTB4MDAwMCwgICAgIC8qIFIxNSAqLworCTB4MDAwMCwgICAgIC8qIFIxNiAgLSBSVEMgU2Vjb25kcy9NaW51dGVzICovCisJMHgwMTAwLCAgICAgLyogUjE3ICAtIFJUQyBIb3Vycy9EYXkgKi8KKwkweDAxMDEsICAgICAvKiBSMTggIC0gUlRDIERhdGUvTW9udGggKi8KKwkweDE0MDAsICAgICAvKiBSMTkgIC0gUlRDIFllYXIgKi8KKwkweDAwMDAsICAgICAvKiBSMjAgIC0gQWxhcm0gU2Vjb25kcy9NaW51dGVzICovCisJMHgwMDAwLCAgICAgLyogUjIxICAtIEFsYXJtIEhvdXJzL0RheSAqLworCTB4MDAwMCwgICAgIC8qIFIyMiAgLSBBbGFybSBEYXRlL01vbnRoICovCisJMHgwMzIwLCAgICAgLyogUjIzICAtIFJUQyBUaW1lIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMjQgIC0gU3lzdGVtIEludGVycnVwdHMgKi8KKwkweDAwMDAsICAgICAvKiBSMjUgIC0gSW50ZXJydXB0IFN0YXR1cyAxICovCisJMHgwMDAwLCAgICAgLyogUjI2ICAtIEludGVycnVwdCBTdGF0dXMgMiAqLworCTB4MDAwMCwgICAgIC8qIFIyNyAqLworCTB4MDAwMCwgICAgIC8qIFIyOCAgLSBVbmRlciBWb2x0YWdlIEludGVycnVwdCBzdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjkgIC0gT3ZlciBDdXJyZW50IEludGVycnVwdCBzdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMzAgIC0gR1BJTyBJbnRlcnJ1cHQgU3RhdHVzICovCisJMHgwMDAwLCAgICAgLyogUjMxICAtIENvbXBhcmF0b3IgSW50ZXJydXB0IFN0YXR1cyAqLworCTB4M0ZGRiwgICAgIC8qIFIzMiAgLSBTeXN0ZW0gSW50ZXJydXB0cyBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjMzICAtIEludGVycnVwdCBTdGF0dXMgMSBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjM0ICAtIEludGVycnVwdCBTdGF0dXMgMiBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjM1ICovCisJMHgwMDAwLCAgICAgLyogUjM2ICAtIFVuZGVyIFZvbHRhZ2UgSW50ZXJydXB0IHN0YXR1cyBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjM3ICAtIE92ZXIgQ3VycmVudCBJbnRlcnJ1cHQgc3RhdHVzIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzggIC0gR1BJTyBJbnRlcnJ1cHQgU3RhdHVzIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzkgIC0gQ29tcGFyYXRvciBJbnRlcnJ1cHQgU3RhdHVzIE1hc2sgKi8KKwkweDAwNDAsICAgICAvKiBSNDAgIC0gQ2xvY2sgQ29udHJvbCAxICovCisJMHgwMDAwLCAgICAgLyogUjQxICAtIENsb2NrIENvbnRyb2wgMiAqLworCTB4M0EwMCwgICAgIC8qIFI0MiAgLSBGTEwgQ29udHJvbCAxICovCisJMHg3MDg2LCAgICAgLyogUjQzICAtIEZMTCBDb250cm9sIDIgKi8KKwkweEMyMjYsICAgICAvKiBSNDQgIC0gRkxMIENvbnRyb2wgMyAqLworCTB4MDAwMCwgICAgIC8qIFI0NSAgLSBGTEwgQ29udHJvbCA0ICovCisJMHgwMDAwLCAgICAgLyogUjQ2ICovCisJMHgwMDAwLCAgICAgLyogUjQ3ICovCisJMHgwMDAwLCAgICAgLyogUjQ4ICAtIERBQyBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjQ5ICovCisJMHgwMEMwLCAgICAgLyogUjUwICAtIERBQyBEaWdpdGFsIFZvbHVtZSBMICovCisJMHgwMEMwLCAgICAgLyogUjUxICAtIERBQyBEaWdpdGFsIFZvbHVtZSBSICovCisJMHgwMDAwLCAgICAgLyogUjUyICovCisJMHgwMDQwLCAgICAgLyogUjUzICAtIERBQyBMUiBSYXRlICovCisJMHgwMDAwLCAgICAgLyogUjU0ICAtIERBQyBDbG9jayBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjU1ICovCisJMHgwMDAwLCAgICAgLyogUjU2ICovCisJMHgwMDAwLCAgICAgLyogUjU3ICovCisJMHg0MDAwLCAgICAgLyogUjU4ICAtIERBQyBNdXRlICovCisJMHgwMDAwLCAgICAgLyogUjU5ICAtIERBQyBNdXRlIFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFI2MCAgLSBEQUMgU2lkZSAqLworCTB4MDAwMCwgICAgIC8qIFI2MSAqLworCTB4MDAwMCwgICAgIC8qIFI2MiAqLworCTB4MDAwMCwgICAgIC8qIFI2MyAqLworCTB4ODAwMCwgICAgIC8qIFI2NCAgLSBBREMgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI2NSAqLworCTB4MDBDMCwgICAgIC8qIFI2NiAgLSBBREMgRGlnaXRhbCBWb2x1bWUgTCAqLworCTB4MDBDMCwgICAgIC8qIFI2NyAgLSBBREMgRGlnaXRhbCBWb2x1bWUgUiAqLworCTB4MDAwMCwgICAgIC8qIFI2OCAgLSBBREMgRGl2aWRlciAqLworCTB4MDAwMCwgICAgIC8qIFI2OSAqLworCTB4MDA0MCwgICAgIC8qIFI3MCAgLSBBREMgTFIgUmF0ZSAqLworCTB4MDAwMCwgICAgIC8qIFI3MSAqLworCTB4MDMwMywgICAgIC8qIFI3MiAgLSBJbnB1dCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjczICAtIElOMyBJbnB1dCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjc0ICAtIE1pYyBCaWFzIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNzUgKi8KKwkweDAwMDAsICAgICAvKiBSNzYgIC0gT3V0cHV0IENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNzcgIC0gSmFjayBEZXRlY3QgKi8KKwkweDAwMDAsICAgICAvKiBSNzggIC0gQW50aSBQb3AgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3OSAqLworCTB4MDA0MCwgICAgIC8qIFI4MCAgLSBMZWZ0IElucHV0IFZvbHVtZSAqLworCTB4MDA0MCwgICAgIC8qIFI4MSAgLSBSaWdodCBJbnB1dCBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSODIgKi8KKwkweDAwMDAsICAgICAvKiBSODMgKi8KKwkweDAwMDAsICAgICAvKiBSODQgKi8KKwkweDAwMDAsICAgICAvKiBSODUgKi8KKwkweDAwMDAsICAgICAvKiBSODYgKi8KKwkweDAwMDAsICAgICAvKiBSODcgKi8KKwkweDA4MDAsICAgICAvKiBSODggIC0gTGVmdCBNaXhlciBDb250cm9sICovCisJMHgxMDAwLCAgICAgLyogUjg5ICAtIFJpZ2h0IE1peGVyIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSOTAgKi8KKwkweDAwMDAsICAgICAvKiBSOTEgKi8KKwkweDAwMDAsICAgICAvKiBSOTIgIC0gT1VUMyBNaXhlciBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjkzICAtIE9VVDQgTWl4ZXIgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI5NCAqLworCTB4MDAwMCwgICAgIC8qIFI5NSAqLworCTB4MDAwMCwgICAgIC8qIFI5NiAgLSBPdXRwdXQgTGVmdCBNaXhlciBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSOTcgIC0gT3V0cHV0IFJpZ2h0IE1peGVyIFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFI5OCAgLSBJbnB1dCBNaXhlciBWb2x1bWUgTCAqLworCTB4MDAwMCwgICAgIC8qIFI5OSAgLSBJbnB1dCBNaXhlciBWb2x1bWUgUiAqLworCTB4MDAwMCwgICAgIC8qIFIxMDAgLSBJbnB1dCBNaXhlciBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSMTAxICovCisJMHgwMDAwLCAgICAgLyogUjEwMiAqLworCTB4MDAwMCwgICAgIC8qIFIxMDMgKi8KKwkweDAwRTQsICAgICAvKiBSMTA0IC0gT1VUMUwgVm9sdW1lICovCisJMHgwMEU0LCAgICAgLyogUjEwNSAtIE9VVDFSIFZvbHVtZSAqLworCTB4MDBFNCwgICAgIC8qIFIxMDYgLSBPVVQyTCBWb2x1bWUgKi8KKwkweDAyRTQsICAgICAvKiBSMTA3IC0gT1VUMlIgVm9sdW1lICovCisJMHgwMDAwLCAgICAgLyogUjEwOCAqLworCTB4MDAwMCwgICAgIC8qIFIxMDkgKi8KKwkweDAwMDAsICAgICAvKiBSMTEwICovCisJMHgwMDAwLCAgICAgLyogUjExMSAtIEJFRVAgVm9sdW1lICovCisJMHgwQTAwLCAgICAgLyogUjExMiAtIEFJIEZvcm1hdGluZyAqLworCTB4MDAwMCwgICAgIC8qIFIxMTMgLSBBREMgREFDIENPTVAgKi8KKwkweDAwMjAsICAgICAvKiBSMTE0IC0gQUkgQURDIENvbnRyb2wgKi8KKwkweDAwMjAsICAgICAvKiBSMTE1IC0gQUkgREFDIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTE2ICovCisJMHgwMDAwLCAgICAgLyogUjExNyAqLworCTB4MDAwMCwgICAgIC8qIFIxMTggKi8KKwkweDAwMDAsICAgICAvKiBSMTE5ICovCisJMHgwMDAwLCAgICAgLyogUjEyMCAqLworCTB4MDAwMCwgICAgIC8qIFIxMjEgKi8KKwkweDAwMDAsICAgICAvKiBSMTIyICovCisJMHgwMDAwLCAgICAgLyogUjEyMyAqLworCTB4MDAwMCwgICAgIC8qIFIxMjQgKi8KKwkweDAwMDAsICAgICAvKiBSMTI1ICovCisJMHgwMDAwLCAgICAgLyogUjEyNiAqLworCTB4MDAwMCwgICAgIC8qIFIxMjcgKi8KKwkweDFGRkYsICAgICAvKiBSMTI4IC0gR1BJTyBEZWJvdW5jZSAqLworCTB4MDAwMCwgICAgIC8qIFIxMjkgLSBHUElPIFBpbiBwdWxsIHVwIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTMwIC0gR1BJTyBQdWxsIGRvd24gQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxMzEgLSBHUElPIEludGVycnVwdCBNb2RlICovCisJMHgwMDAwLCAgICAgLyogUjEzMiAqLworCTB4MDAwMCwgICAgIC8qIFIxMzMgLSBHUElPIENvbnRyb2wgKi8KKwkweDBCRkIsICAgICAvKiBSMTM0IC0gR1BJTyBDb25maWd1cmF0aW9uIChpL28pICovCisJMHgwRkZGLCAgICAgLyogUjEzNSAtIEdQSU8gUGluIFBvbGFyaXR5IC8gVHlwZSAqLworCTB4MDAwMCwgICAgIC8qIFIxMzYgKi8KKwkweDAwMDAsICAgICAvKiBSMTM3ICovCisJMHgwMDAwLCAgICAgLyogUjEzOCAqLworCTB4MDAwMCwgICAgIC8qIFIxMzkgKi8KKwkweDAzMDAsICAgICAvKiBSMTQwIC0gR1BJTyBGdW5jdGlvbiBTZWxlY3QgMSAqLworCTB4MDAwMCwgICAgIC8qIFIxNDEgLSBHUElPIEZ1bmN0aW9uIFNlbGVjdCAyICovCisJMHgyMzAwLCAgICAgLyogUjE0MiAtIEdQSU8gRnVuY3Rpb24gU2VsZWN0IDMgKi8KKwkweDAwMDMsICAgICAvKiBSMTQzIC0gR1BJTyBGdW5jdGlvbiBTZWxlY3QgNCAqLworCTB4MDAwMCwgICAgIC8qIFIxNDQgLSBEaWdpdGlzZXIgQ29udHJvbCAoMSkgKi8KKwkweDAwMDIsICAgICAvKiBSMTQ1IC0gRGlnaXRpc2VyIENvbnRyb2wgKDIpICovCisJMHgwMDAwLCAgICAgLyogUjE0NiAqLworCTB4MDAwMCwgICAgIC8qIFIxNDcgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ4ICovCisJMHgwMDAwLCAgICAgLyogUjE0OSAqLworCTB4MDAwMCwgICAgIC8qIFIxNTAgKi8KKwkweDAwMDAsICAgICAvKiBSMTUxICovCisJMHg3MDAwLCAgICAgLyogUjE1MiAtIEFVWDEgUmVhZGJhY2sgKi8KKwkweDcwMDAsICAgICAvKiBSMTUzIC0gQVVYMiBSZWFkYmFjayAqLworCTB4NzAwMCwgICAgIC8qIFIxNTQgLSBBVVgzIFJlYWRiYWNrICovCisJMHg3MDAwLCAgICAgLyogUjE1NSAtIEFVWDQgUmVhZGJhY2sgKi8KKwkweDAwMDAsICAgICAvKiBSMTU2IC0gVVNCIFZvbHRhZ2UgUmVhZGJhY2sgKi8KKwkweDAwMDAsICAgICAvKiBSMTU3IC0gTElORSBWb2x0YWdlIFJlYWRiYWNrICovCisJMHgwMDAwLCAgICAgLyogUjE1OCAtIEJBVFQgVm9sdGFnZSBSZWFkYmFjayAqLworCTB4MDAwMCwgICAgIC8qIFIxNTkgLSBDaGlwIFRlbXAgUmVhZGJhY2sgKi8KKwkweDAwMDAsICAgICAvKiBSMTYwICovCisJMHgwMDAwLCAgICAgLyogUjE2MSAqLworCTB4MDAwMCwgICAgIC8qIFIxNjIgKi8KKwkweDAwMDAsICAgICAvKiBSMTYzIC0gR2VuZXJpYyBDb21wYXJhdG9yIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTY0IC0gR2VuZXJpYyBjb21wYXJhdG9yIDEgKi8KKwkweDAwMDAsICAgICAvKiBSMTY1IC0gR2VuZXJpYyBjb21wYXJhdG9yIDIgKi8KKwkweDAwMDAsICAgICAvKiBSMTY2IC0gR2VuZXJpYyBjb21wYXJhdG9yIDMgKi8KKwkweDAwMDAsICAgICAvKiBSMTY3IC0gR2VuZXJpYyBjb21wYXJhdG9yIDQgKi8KKwkweEEwMEYsICAgICAvKiBSMTY4IC0gQmF0dGVyeSBDaGFyZ2VyIENvbnRyb2wgMSAqLworCTB4MEIwNiwgICAgIC8qIFIxNjkgLSBCYXR0ZXJ5IENoYXJnZXIgQ29udHJvbCAyICovCisJMHgwMDAwLCAgICAgLyogUjE3MCAtIEJhdHRlcnkgQ2hhcmdlciBDb250cm9sIDMgKi8KKwkweDAwMDAsICAgICAvKiBSMTcxICovCisJMHgwMDAwLCAgICAgLyogUjE3MiAtIEN1cnJlbnQgU2luayBEcml2ZXIgQSAqLworCTB4MDAwMCwgICAgIC8qIFIxNzMgLSBDU0EgRmxhc2ggY29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxNzQgLSBDdXJyZW50IFNpbmsgRHJpdmVyIEIgKi8KKwkweDAwMDAsICAgICAvKiBSMTc1IC0gQ1NCIEZsYXNoIGNvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTc2IC0gRENEQy9MRE8gcmVxdWVzdGVkICovCisJMHgwMzJELCAgICAgLyogUjE3NyAtIERDREMgQWN0aXZlIG9wdGlvbnMgKi8KKwkweDAwMDAsICAgICAvKiBSMTc4IC0gRENEQyBTbGVlcCBvcHRpb25zICovCisJMHgwMDI1LCAgICAgLyogUjE3OSAtIFBvd2VyLWNoZWNrIGNvbXBhcmF0b3IgKi8KKwkweDAwNjIsICAgICAvKiBSMTgwIC0gRENEQzEgQ29udHJvbCAqLworCTB4MDQwMCwgICAgIC8qIFIxODEgLSBEQ0RDMSBUaW1lb3V0cyAqLworCTB4MTAwNiwgICAgIC8qIFIxODIgLSBEQ0RDMSBMb3cgUG93ZXIgKi8KKwkweDAwMTgsICAgICAvKiBSMTgzIC0gRENEQzIgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxODQgLSBEQ0RDMiBUaW1lb3V0cyAqLworCTB4MDAwMCwgICAgIC8qIFIxODUgKi8KKwkweDAwMDYsICAgICAvKiBSMTg2IC0gRENEQzMgQ29udHJvbCAqLworCTB4MDgwMCwgICAgIC8qIFIxODcgLSBEQ0RDMyBUaW1lb3V0cyAqLworCTB4MDAwNiwgICAgIC8qIFIxODggLSBEQ0RDMyBMb3cgUG93ZXIgKi8KKwkweDAwMDYsICAgICAvKiBSMTg5IC0gRENEQzQgQ29udHJvbCAqLworCTB4MEMwMCwgICAgIC8qIFIxOTAgLSBEQ0RDNCBUaW1lb3V0cyAqLworCTB4MDAwNiwgICAgIC8qIFIxOTEgLSBEQ0RDNCBMb3cgUG93ZXIgKi8KKwkweDAwMDgsICAgICAvKiBSMTkyIC0gRENEQzUgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxOTMgLSBEQ0RDNSBUaW1lb3V0cyAqLworCTB4MDAwMCwgICAgIC8qIFIxOTQgKi8KKwkweDAwMjYsICAgICAvKiBSMTk1IC0gRENEQzYgQ29udHJvbCAqLworCTB4MTAwMCwgICAgIC8qIFIxOTYgLSBEQ0RDNiBUaW1lb3V0cyAqLworCTB4MDAwNiwgICAgIC8qIFIxOTcgLSBEQ0RDNiBMb3cgUG93ZXIgKi8KKwkweDAwMDAsICAgICAvKiBSMTk4ICovCisJMHgwMDAzLCAgICAgLyogUjE5OSAtIExpbWl0IFN3aXRjaCBDb250cm9sICovCisJMHgwMDAyLCAgICAgLyogUjIwMCAtIExETzEgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIyMDEgLSBMRE8xIFRpbWVvdXRzICovCisJMHgwMDFDLCAgICAgLyogUjIwMiAtIExETzEgTG93IFBvd2VyICovCisJMHgwMDFBLCAgICAgLyogUjIwMyAtIExETzIgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIyMDQgLSBMRE8yIFRpbWVvdXRzICovCisJMHgwMDFDLCAgICAgLyogUjIwNSAtIExETzIgTG93IFBvd2VyICovCisJMHgwMDFGLCAgICAgLyogUjIwNiAtIExETzMgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIyMDcgLSBMRE8zIFRpbWVvdXRzICovCisJMHgwMDFDLCAgICAgLyogUjIwOCAtIExETzMgTG93IFBvd2VyICovCisJMHgwMDFGLCAgICAgLyogUjIwOSAtIExETzQgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIyMTAgLSBMRE80IFRpbWVvdXRzICovCisJMHgwMDFDLCAgICAgLyogUjIxMSAtIExETzQgTG93IFBvd2VyICovCisJMHgwMDAwLCAgICAgLyogUjIxMiAqLworCTB4MDAwMCwgICAgIC8qIFIyMTMgKi8KKwkweDAwMDAsICAgICAvKiBSMjE0ICovCisJMHgwMDAwLCAgICAgLyogUjIxNSAtIFZDQ19GQVVMVCBNYXNrcyAqLworCTB4MDAxRiwgICAgIC8qIFIyMTYgLSBNYWluIEJhbmRnYXAgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIyMTcgLSBPU0MgQ29udHJvbCAqLworCTB4OTAwMCwgICAgIC8qIFIyMTggLSBSVEMgVGljayBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjIxOSAtIFNlY3VyaXR5MSAqLworCTB4NDAwMCwgICAgIC8qIFIyMjAgKi8KKwkweDAwMDAsICAgICAvKiBSMjIxICovCisJMHgwMDAwLCAgICAgLyogUjIyMiAqLworCTB4MDAwMCwgICAgIC8qIFIyMjMgKi8KKwkweDAwMDAsICAgICAvKiBSMjI0IC0gU2lnbmFsIG92ZXJyaWRlcyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjUgLSBEQ0RDL0xETyBzdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjI2IC0gQ2hhcmdlciBPdmVyaWRlcy9zdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjI3IC0gbWlzYyBvdmVycmlkZXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjI4IC0gU3VwcGx5IG92ZXJyaWRlcy9zdGF0dXMgMSAqLworCTB4MDAwMCwgICAgIC8qIFIyMjkgLSBTdXBwbHkgb3ZlcnJpZGVzL3N0YXR1cyAyICovCisJMHhFMDAwLCAgICAgLyogUjIzMCAtIEdQSU8gUGluIFN0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIyMzEgLSBjb21wYXJvdG9yIG92ZXJyaWRlcyAqLworCTB4MDAwMCwgICAgIC8qIFIyMzIgKi8KKwkweDAwMDAsICAgICAvKiBSMjMzIC0gU3RhdGUgTWFjaGluZSBzdGF0dXMgKi8KKwkweDEyMDAsICAgICAvKiBSMjM0ICovCisJMHgwMDAwLCAgICAgLyogUjIzNSAqLworCTB4ODAwMCwgICAgIC8qIFIyMzYgKi8KKwkweDAwMDAsICAgICAvKiBSMjM3ICovCisJMHgwMDAwLCAgICAgLyogUjIzOCAqLworCTB4MDAwMCwgICAgIC8qIFIyMzkgKi8KKwkweDAwMDMsICAgICAvKiBSMjQwICovCisJMHgwMDAwLCAgICAgLyogUjI0MSAqLworCTB4MDAwMCwgICAgIC8qIFIyNDIgKi8KKwkweDAwMDQsICAgICAvKiBSMjQzICovCisJMHgwMzAwLCAgICAgLyogUjI0NCAqLworCTB4MDAwMCwgICAgIC8qIFIyNDUgKi8KKwkweDAyMDAsICAgICAvKiBSMjQ2ICovCisJMHgwMDAwLCAgICAgLyogUjI0NyAqLworCTB4MTAwMCwgICAgIC8qIFIyNDggLSBEQ0RDMSBUZXN0IENvbnRyb2xzICovCisJMHg1MDAwLCAgICAgLyogUjI0OSAqLworCTB4MTAwMCwgICAgIC8qIFIyNTAgLSBEQ0RDMyBUZXN0IENvbnRyb2xzICovCisJMHgxMDAwLCAgICAgLyogUjI1MSAtIERDREM0IFRlc3QgQ29udHJvbHMgKi8KKwkweDUxMDAsICAgICAvKiBSMjUyICovCisJMHgxMDAwLCAgICAgLyogUjI1MyAtIERDREM2IFRlc3QgQ29udHJvbHMgKi8KK307CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NRkRfV004MzUyX0NPTkZJR19NT0RFXzIKKworI3VuZGVmIFdNODM1MF9IQVZFX0NPTkZJR19NT0RFCisjZGVmaW5lIFdNODM1MF9IQVZFX0NPTkZJR19NT0RFCisKK2NvbnN0IHUxNiB3bTgzNTJfbW9kZTJfZGVmYXVsdHNbXSA9IHsKKwkweDYxNDMsICAgICAvKiBSMCAgIC0gUmVzZXQvSUQgKi8KKwkweDAwMDAsICAgICAvKiBSMSAgIC0gSUQgKi8KKwkweDAwMDIsICAgICAvKiBSMiAgIC0gUmV2aXNpb24gKi8KKwkweDFDMDIsICAgICAvKiBSMyAgIC0gU3lzdGVtIENvbnRyb2wgMSAqLworCTB4MDIwNCwgICAgIC8qIFI0ICAgLSBTeXN0ZW0gQ29udHJvbCAyICovCisJMHgwMDAwLCAgICAgLyogUjUgICAtIFN5c3RlbSBIaWJlcm5hdGUgKi8KKwkweDhBMDAsICAgICAvKiBSNiAgIC0gSW50ZXJmYWNlIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNyAqLworCTB4ODAwMCwgICAgIC8qIFI4ICAgLSBQb3dlciBtZ210ICgxKSAqLworCTB4MDAwMCwgICAgIC8qIFI5ICAgLSBQb3dlciBtZ210ICgyKSAqLworCTB4MDAwMCwgICAgIC8qIFIxMCAgLSBQb3dlciBtZ210ICgzKSAqLworCTB4MjAwMCwgICAgIC8qIFIxMSAgLSBQb3dlciBtZ210ICg0KSAqLworCTB4MEUwMCwgICAgIC8qIFIxMiAgLSBQb3dlciBtZ210ICg1KSAqLworCTB4MDAwMCwgICAgIC8qIFIxMyAgLSBQb3dlciBtZ210ICg2KSAqLworCTB4MDAwMCwgICAgIC8qIFIxNCAgLSBQb3dlciBtZ210ICg3KSAqLworCTB4MDAwMCwgICAgIC8qIFIxNSAqLworCTB4MDAwMCwgICAgIC8qIFIxNiAgLSBSVEMgU2Vjb25kcy9NaW51dGVzICovCisJMHgwMTAwLCAgICAgLyogUjE3ICAtIFJUQyBIb3Vycy9EYXkgKi8KKwkweDAxMDEsICAgICAvKiBSMTggIC0gUlRDIERhdGUvTW9udGggKi8KKwkweDE0MDAsICAgICAvKiBSMTkgIC0gUlRDIFllYXIgKi8KKwkweDAwMDAsICAgICAvKiBSMjAgIC0gQWxhcm0gU2Vjb25kcy9NaW51dGVzICovCisJMHgwMDAwLCAgICAgLyogUjIxICAtIEFsYXJtIEhvdXJzL0RheSAqLworCTB4MDAwMCwgICAgIC8qIFIyMiAgLSBBbGFybSBEYXRlL01vbnRoICovCisJMHgwMzIwLCAgICAgLyogUjIzICAtIFJUQyBUaW1lIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMjQgIC0gU3lzdGVtIEludGVycnVwdHMgKi8KKwkweDAwMDAsICAgICAvKiBSMjUgIC0gSW50ZXJydXB0IFN0YXR1cyAxICovCisJMHgwMDAwLCAgICAgLyogUjI2ICAtIEludGVycnVwdCBTdGF0dXMgMiAqLworCTB4MDAwMCwgICAgIC8qIFIyNyAqLworCTB4MDAwMCwgICAgIC8qIFIyOCAgLSBVbmRlciBWb2x0YWdlIEludGVycnVwdCBzdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjkgIC0gT3ZlciBDdXJyZW50IEludGVycnVwdCBzdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMzAgIC0gR1BJTyBJbnRlcnJ1cHQgU3RhdHVzICovCisJMHgwMDAwLCAgICAgLyogUjMxICAtIENvbXBhcmF0b3IgSW50ZXJydXB0IFN0YXR1cyAqLworCTB4M0ZGRiwgICAgIC8qIFIzMiAgLSBTeXN0ZW0gSW50ZXJydXB0cyBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjMzICAtIEludGVycnVwdCBTdGF0dXMgMSBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjM0ICAtIEludGVycnVwdCBTdGF0dXMgMiBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjM1ICovCisJMHgwMDAwLCAgICAgLyogUjM2ICAtIFVuZGVyIFZvbHRhZ2UgSW50ZXJydXB0IHN0YXR1cyBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjM3ICAtIE92ZXIgQ3VycmVudCBJbnRlcnJ1cHQgc3RhdHVzIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzggIC0gR1BJTyBJbnRlcnJ1cHQgU3RhdHVzIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzkgIC0gQ29tcGFyYXRvciBJbnRlcnJ1cHQgU3RhdHVzIE1hc2sgKi8KKwkweDAwNDAsICAgICAvKiBSNDAgIC0gQ2xvY2sgQ29udHJvbCAxICovCisJMHgwMDAwLCAgICAgLyogUjQxICAtIENsb2NrIENvbnRyb2wgMiAqLworCTB4M0EwMCwgICAgIC8qIFI0MiAgLSBGTEwgQ29udHJvbCAxICovCisJMHg3MDg2LCAgICAgLyogUjQzICAtIEZMTCBDb250cm9sIDIgKi8KKwkweEMyMjYsICAgICAvKiBSNDQgIC0gRkxMIENvbnRyb2wgMyAqLworCTB4MDAwMCwgICAgIC8qIFI0NSAgLSBGTEwgQ29udHJvbCA0ICovCisJMHgwMDAwLCAgICAgLyogUjQ2ICovCisJMHgwMDAwLCAgICAgLyogUjQ3ICovCisJMHgwMDAwLCAgICAgLyogUjQ4ICAtIERBQyBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjQ5ICovCisJMHgwMEMwLCAgICAgLyogUjUwICAtIERBQyBEaWdpdGFsIFZvbHVtZSBMICovCisJMHgwMEMwLCAgICAgLyogUjUxICAtIERBQyBEaWdpdGFsIFZvbHVtZSBSICovCisJMHgwMDAwLCAgICAgLyogUjUyICovCisJMHgwMDQwLCAgICAgLyogUjUzICAtIERBQyBMUiBSYXRlICovCisJMHgwMDAwLCAgICAgLyogUjU0ICAtIERBQyBDbG9jayBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjU1ICovCisJMHgwMDAwLCAgICAgLyogUjU2ICovCisJMHgwMDAwLCAgICAgLyogUjU3ICovCisJMHg0MDAwLCAgICAgLyogUjU4ICAtIERBQyBNdXRlICovCisJMHgwMDAwLCAgICAgLyogUjU5ICAtIERBQyBNdXRlIFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFI2MCAgLSBEQUMgU2lkZSAqLworCTB4MDAwMCwgICAgIC8qIFI2MSAqLworCTB4MDAwMCwgICAgIC8qIFI2MiAqLworCTB4MDAwMCwgICAgIC8qIFI2MyAqLworCTB4ODAwMCwgICAgIC8qIFI2NCAgLSBBREMgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI2NSAqLworCTB4MDBDMCwgICAgIC8qIFI2NiAgLSBBREMgRGlnaXRhbCBWb2x1bWUgTCAqLworCTB4MDBDMCwgICAgIC8qIFI2NyAgLSBBREMgRGlnaXRhbCBWb2x1bWUgUiAqLworCTB4MDAwMCwgICAgIC8qIFI2OCAgLSBBREMgRGl2aWRlciAqLworCTB4MDAwMCwgICAgIC8qIFI2OSAqLworCTB4MDA0MCwgICAgIC8qIFI3MCAgLSBBREMgTFIgUmF0ZSAqLworCTB4MDAwMCwgICAgIC8qIFI3MSAqLworCTB4MDMwMywgICAgIC8qIFI3MiAgLSBJbnB1dCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjczICAtIElOMyBJbnB1dCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjc0ICAtIE1pYyBCaWFzIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNzUgKi8KKwkweDAwMDAsICAgICAvKiBSNzYgIC0gT3V0cHV0IENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNzcgIC0gSmFjayBEZXRlY3QgKi8KKwkweDAwMDAsICAgICAvKiBSNzggIC0gQW50aSBQb3AgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3OSAqLworCTB4MDA0MCwgICAgIC8qIFI4MCAgLSBMZWZ0IElucHV0IFZvbHVtZSAqLworCTB4MDA0MCwgICAgIC8qIFI4MSAgLSBSaWdodCBJbnB1dCBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSODIgKi8KKwkweDAwMDAsICAgICAvKiBSODMgKi8KKwkweDAwMDAsICAgICAvKiBSODQgKi8KKwkweDAwMDAsICAgICAvKiBSODUgKi8KKwkweDAwMDAsICAgICAvKiBSODYgKi8KKwkweDAwMDAsICAgICAvKiBSODcgKi8KKwkweDA4MDAsICAgICAvKiBSODggIC0gTGVmdCBNaXhlciBDb250cm9sICovCisJMHgxMDAwLCAgICAgLyogUjg5ICAtIFJpZ2h0IE1peGVyIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSOTAgKi8KKwkweDAwMDAsICAgICAvKiBSOTEgKi8KKwkweDAwMDAsICAgICAvKiBSOTIgIC0gT1VUMyBNaXhlciBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjkzICAtIE9VVDQgTWl4ZXIgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI5NCAqLworCTB4MDAwMCwgICAgIC8qIFI5NSAqLworCTB4MDAwMCwgICAgIC8qIFI5NiAgLSBPdXRwdXQgTGVmdCBNaXhlciBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSOTcgIC0gT3V0cHV0IFJpZ2h0IE1peGVyIFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFI5OCAgLSBJbnB1dCBNaXhlciBWb2x1bWUgTCAqLworCTB4MDAwMCwgICAgIC8qIFI5OSAgLSBJbnB1dCBNaXhlciBWb2x1bWUgUiAqLworCTB4MDAwMCwgICAgIC8qIFIxMDAgLSBJbnB1dCBNaXhlciBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSMTAxICovCisJMHgwMDAwLCAgICAgLyogUjEwMiAqLworCTB4MDAwMCwgICAgIC8qIFIxMDMgKi8KKwkweDAwRTQsICAgICAvKiBSMTA0IC0gT1VUMUwgVm9sdW1lICovCisJMHgwMEU0LCAgICAgLyogUjEwNSAtIE9VVDFSIFZvbHVtZSAqLworCTB4MDBFNCwgICAgIC8qIFIxMDYgLSBPVVQyTCBWb2x1bWUgKi8KKwkweDAyRTQsICAgICAvKiBSMTA3IC0gT1VUMlIgVm9sdW1lICovCisJMHgwMDAwLCAgICAgLyogUjEwOCAqLworCTB4MDAwMCwgICAgIC8qIFIxMDkgKi8KKwkweDAwMDAsICAgICAvKiBSMTEwICovCisJMHgwMDAwLCAgICAgLyogUjExMSAtIEJFRVAgVm9sdW1lICovCisJMHgwQTAwLCAgICAgLyogUjExMiAtIEFJIEZvcm1hdGluZyAqLworCTB4MDAwMCwgICAgIC8qIFIxMTMgLSBBREMgREFDIENPTVAgKi8KKwkweDAwMjAsICAgICAvKiBSMTE0IC0gQUkgQURDIENvbnRyb2wgKi8KKwkweDAwMjAsICAgICAvKiBSMTE1IC0gQUkgREFDIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTE2ICovCisJMHgwMDAwLCAgICAgLyogUjExNyAqLworCTB4MDAwMCwgICAgIC8qIFIxMTggKi8KKwkweDAwMDAsICAgICAvKiBSMTE5ICovCisJMHgwMDAwLCAgICAgLyogUjEyMCAqLworCTB4MDAwMCwgICAgIC8qIFIxMjEgKi8KKwkweDAwMDAsICAgICAvKiBSMTIyICovCisJMHgwMDAwLCAgICAgLyogUjEyMyAqLworCTB4MDAwMCwgICAgIC8qIFIxMjQgKi8KKwkweDAwMDAsICAgICAvKiBSMTI1ICovCisJMHgwMDAwLCAgICAgLyogUjEyNiAqLworCTB4MDAwMCwgICAgIC8qIFIxMjcgKi8KKwkweDFGRkYsICAgICAvKiBSMTI4IC0gR1BJTyBEZWJvdW5jZSAqLworCTB4MDAwMCwgICAgIC8qIFIxMjkgLSBHUElPIFBpbiBwdWxsIHVwIENvbnRyb2wgKi8KKwkweDAxMTAsICAgICAvKiBSMTMwIC0gR1BJTyBQdWxsIGRvd24gQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxMzEgLSBHUElPIEludGVycnVwdCBNb2RlICovCisJMHgwMDAwLCAgICAgLyogUjEzMiAqLworCTB4MDAwMCwgICAgIC8qIFIxMzMgLSBHUElPIENvbnRyb2wgKi8KKwkweDA5REEsICAgICAvKiBSMTM0IC0gR1BJTyBDb25maWd1cmF0aW9uIChpL28pICovCisJMHgwREQ2LCAgICAgLyogUjEzNSAtIEdQSU8gUGluIFBvbGFyaXR5IC8gVHlwZSAqLworCTB4MDAwMCwgICAgIC8qIFIxMzYgKi8KKwkweDAwMDAsICAgICAvKiBSMTM3ICovCisJMHgwMDAwLCAgICAgLyogUjEzOCAqLworCTB4MDAwMCwgICAgIC8qIFIxMzkgKi8KKwkweDEzMTAsICAgICAvKiBSMTQwIC0gR1BJTyBGdW5jdGlvbiBTZWxlY3QgMSAqLworCTB4MDAzMywgICAgIC8qIFIxNDEgLSBHUElPIEZ1bmN0aW9uIFNlbGVjdCAyICovCisJMHgyMDAwLCAgICAgLyogUjE0MiAtIEdQSU8gRnVuY3Rpb24gU2VsZWN0IDMgKi8KKwkweDAwMDAsICAgICAvKiBSMTQzIC0gR1BJTyBGdW5jdGlvbiBTZWxlY3QgNCAqLworCTB4MDAwMCwgICAgIC8qIFIxNDQgLSBEaWdpdGlzZXIgQ29udHJvbCAoMSkgKi8KKwkweDAwMDIsICAgICAvKiBSMTQ1IC0gRGlnaXRpc2VyIENvbnRyb2wgKDIpICovCisJMHgwMDAwLCAgICAgLyogUjE0NiAqLworCTB4MDAwMCwgICAgIC8qIFIxNDcgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ4ICovCisJMHgwMDAwLCAgICAgLyogUjE0OSAqLworCTB4MDAwMCwgICAgIC8qIFIxNTAgKi8KKwkweDAwMDAsICAgICAvKiBSMTUxICovCisJMHg3MDAwLCAgICAgLyogUjE1MiAtIEFVWDEgUmVhZGJhY2sgKi8KKwkweDcwMDAsICAgICAvKiBSMTUzIC0gQVVYMiBSZWFkYmFjayAqLworCTB4NzAwMCwgICAgIC8qIFIxNTQgLSBBVVgzIFJlYWRiYWNrICovCisJMHg3MDAwLCAgICAgLyogUjE1NSAtIEFVWDQgUmVhZGJhY2sgKi8KKwkweDAwMDAsICAgICAvKiBSMTU2IC0gVVNCIFZvbHRhZ2UgUmVhZGJhY2sgKi8KKwkweDAwMDAsICAgICAvKiBSMTU3IC0gTElORSBWb2x0YWdlIFJlYWRiYWNrICovCisJMHgwMDAwLCAgICAgLyogUjE1OCAtIEJBVFQgVm9sdGFnZSBSZWFkYmFjayAqLworCTB4MDAwMCwgICAgIC8qIFIxNTkgLSBDaGlwIFRlbXAgUmVhZGJhY2sgKi8KKwkweDAwMDAsICAgICAvKiBSMTYwICovCisJMHgwMDAwLCAgICAgLyogUjE2MSAqLworCTB4MDAwMCwgICAgIC8qIFIxNjIgKi8KKwkweDAwMDAsICAgICAvKiBSMTYzIC0gR2VuZXJpYyBDb21wYXJhdG9yIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTY0IC0gR2VuZXJpYyBjb21wYXJhdG9yIDEgKi8KKwkweDAwMDAsICAgICAvKiBSMTY1IC0gR2VuZXJpYyBjb21wYXJhdG9yIDIgKi8KKwkweDAwMDAsICAgICAvKiBSMTY2IC0gR2VuZXJpYyBjb21wYXJhdG9yIDMgKi8KKwkweDAwMDAsICAgICAvKiBSMTY3IC0gR2VuZXJpYyBjb21wYXJhdG9yIDQgKi8KKwkweEEwMEYsICAgICAvKiBSMTY4IC0gQmF0dGVyeSBDaGFyZ2VyIENvbnRyb2wgMSAqLworCTB4MEIwNiwgICAgIC8qIFIxNjkgLSBCYXR0ZXJ5IENoYXJnZXIgQ29udHJvbCAyICovCisJMHgwMDAwLCAgICAgLyogUjE3MCAtIEJhdHRlcnkgQ2hhcmdlciBDb250cm9sIDMgKi8KKwkweDAwMDAsICAgICAvKiBSMTcxICovCisJMHgwMDAwLCAgICAgLyogUjE3MiAtIEN1cnJlbnQgU2luayBEcml2ZXIgQSAqLworCTB4MDAwMCwgICAgIC8qIFIxNzMgLSBDU0EgRmxhc2ggY29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxNzQgLSBDdXJyZW50IFNpbmsgRHJpdmVyIEIgKi8KKwkweDAwMDAsICAgICAvKiBSMTc1IC0gQ1NCIEZsYXNoIGNvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTc2IC0gRENEQy9MRE8gcmVxdWVzdGVkICovCisJMHgwMzJELCAgICAgLyogUjE3NyAtIERDREMgQWN0aXZlIG9wdGlvbnMgKi8KKwkweDAwMDAsICAgICAvKiBSMTc4IC0gRENEQyBTbGVlcCBvcHRpb25zICovCisJMHgwMDI1LCAgICAgLyogUjE3OSAtIFBvd2VyLWNoZWNrIGNvbXBhcmF0b3IgKi8KKwkweDAwMEUsICAgICAvKiBSMTgwIC0gRENEQzEgQ29udHJvbCAqLworCTB4MDgwMCwgICAgIC8qIFIxODEgLSBEQ0RDMSBUaW1lb3V0cyAqLworCTB4MTAwNiwgICAgIC8qIFIxODIgLSBEQ0RDMSBMb3cgUG93ZXIgKi8KKwkweDAwMTgsICAgICAvKiBSMTgzIC0gRENEQzIgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxODQgLSBEQ0RDMiBUaW1lb3V0cyAqLworCTB4MDAwMCwgICAgIC8qIFIxODUgKi8KKwkweDAwNTYsICAgICAvKiBSMTg2IC0gRENEQzMgQ29udHJvbCAqLworCTB4MTgwMCwgICAgIC8qIFIxODcgLSBEQ0RDMyBUaW1lb3V0cyAqLworCTB4MDAwNiwgICAgIC8qIFIxODggLSBEQ0RDMyBMb3cgUG93ZXIgKi8KKwkweDAwMEUsICAgICAvKiBSMTg5IC0gRENEQzQgQ29udHJvbCAqLworCTB4MTAwMCwgICAgIC8qIFIxOTAgLSBEQ0RDNCBUaW1lb3V0cyAqLworCTB4MDAwNiwgICAgIC8qIFIxOTEgLSBEQ0RDNCBMb3cgUG93ZXIgKi8KKwkweDAwMDgsICAgICAvKiBSMTkyIC0gRENEQzUgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxOTMgLSBEQ0RDNSBUaW1lb3V0cyAqLworCTB4MDAwMCwgICAgIC8qIFIxOTQgKi8KKwkweDAwMjYsICAgICAvKiBSMTk1IC0gRENEQzYgQ29udHJvbCAqLworCTB4MEMwMCwgICAgIC8qIFIxOTYgLSBEQ0RDNiBUaW1lb3V0cyAqLworCTB4MDAwNiwgICAgIC8qIFIxOTcgLSBEQ0RDNiBMb3cgUG93ZXIgKi8KKwkweDAwMDAsICAgICAvKiBSMTk4ICovCisJMHgwMDAzLCAgICAgLyogUjE5OSAtIExpbWl0IFN3aXRjaCBDb250cm9sICovCisJMHgwMDFDLCAgICAgLyogUjIwMCAtIExETzEgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIyMDEgLSBMRE8xIFRpbWVvdXRzICovCisJMHgwMDFDLCAgICAgLyogUjIwMiAtIExETzEgTG93IFBvd2VyICovCisJMHgwMDA2LCAgICAgLyogUjIwMyAtIExETzIgQ29udHJvbCAqLworCTB4MDQwMCwgICAgIC8qIFIyMDQgLSBMRE8yIFRpbWVvdXRzICovCisJMHgwMDFDLCAgICAgLyogUjIwNSAtIExETzIgTG93IFBvd2VyICovCisJMHgwMDFDLCAgICAgLyogUjIwNiAtIExETzMgQ29udHJvbCAqLworCTB4MTQwMCwgICAgIC8qIFIyMDcgLSBMRE8zIFRpbWVvdXRzICovCisJMHgwMDFDLCAgICAgLyogUjIwOCAtIExETzMgTG93IFBvd2VyICovCisJMHgwMDFBLCAgICAgLyogUjIwOSAtIExETzQgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIyMTAgLSBMRE80IFRpbWVvdXRzICovCisJMHgwMDFDLCAgICAgLyogUjIxMSAtIExETzQgTG93IFBvd2VyICovCisJMHgwMDAwLCAgICAgLyogUjIxMiAqLworCTB4MDAwMCwgICAgIC8qIFIyMTMgKi8KKwkweDAwMDAsICAgICAvKiBSMjE0ICovCisJMHgwMDAwLCAgICAgLyogUjIxNSAtIFZDQ19GQVVMVCBNYXNrcyAqLworCTB4MDAxRiwgICAgIC8qIFIyMTYgLSBNYWluIEJhbmRnYXAgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIyMTcgLSBPU0MgQ29udHJvbCAqLworCTB4OTAwMCwgICAgIC8qIFIyMTggLSBSVEMgVGljayBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjIxOSAtIFNlY3VyaXR5MSAqLworCTB4NDAwMCwgICAgIC8qIFIyMjAgKi8KKwkweDAwMDAsICAgICAvKiBSMjIxICovCisJMHgwMDAwLCAgICAgLyogUjIyMiAqLworCTB4MDAwMCwgICAgIC8qIFIyMjMgKi8KKwkweDAwMDAsICAgICAvKiBSMjI0IC0gU2lnbmFsIG92ZXJyaWRlcyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjUgLSBEQ0RDL0xETyBzdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjI2IC0gQ2hhcmdlciBPdmVyaWRlcy9zdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjI3IC0gbWlzYyBvdmVycmlkZXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjI4IC0gU3VwcGx5IG92ZXJyaWRlcy9zdGF0dXMgMSAqLworCTB4MDAwMCwgICAgIC8qIFIyMjkgLSBTdXBwbHkgb3ZlcnJpZGVzL3N0YXR1cyAyICovCisJMHhFMDAwLCAgICAgLyogUjIzMCAtIEdQSU8gUGluIFN0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIyMzEgLSBjb21wYXJvdG9yIG92ZXJyaWRlcyAqLworCTB4MDAwMCwgICAgIC8qIFIyMzIgKi8KKwkweDAwMDAsICAgICAvKiBSMjMzIC0gU3RhdGUgTWFjaGluZSBzdGF0dXMgKi8KKwkweDEyMDAsICAgICAvKiBSMjM0ICovCisJMHgwMDAwLCAgICAgLyogUjIzNSAqLworCTB4ODAwMCwgICAgIC8qIFIyMzYgKi8KKwkweDAwMDAsICAgICAvKiBSMjM3ICovCisJMHgwMDAwLCAgICAgLyogUjIzOCAqLworCTB4MDAwMCwgICAgIC8qIFIyMzkgKi8KKwkweDAwMDMsICAgICAvKiBSMjQwICovCisJMHgwMDAwLCAgICAgLyogUjI0MSAqLworCTB4MDAwMCwgICAgIC8qIFIyNDIgKi8KKwkweDAwMDQsICAgICAvKiBSMjQzICovCisJMHgwMzAwLCAgICAgLyogUjI0NCAqLworCTB4MDAwMCwgICAgIC8qIFIyNDUgKi8KKwkweDAyMDAsICAgICAvKiBSMjQ2ICovCisJMHgwMDAwLCAgICAgLyogUjI0NyAqLworCTB4MTAwMCwgICAgIC8qIFIyNDggLSBEQ0RDMSBUZXN0IENvbnRyb2xzICovCisJMHg1MDAwLCAgICAgLyogUjI0OSAqLworCTB4MTAwMCwgICAgIC8qIFIyNTAgLSBEQ0RDMyBUZXN0IENvbnRyb2xzICovCisJMHgxMDAwLCAgICAgLyogUjI1MSAtIERDREM0IFRlc3QgQ29udHJvbHMgKi8KKwkweDUxMDAsICAgICAvKiBSMjUyICovCisJMHgxMDAwLCAgICAgLyogUjI1MyAtIERDREM2IFRlc3QgQ29udHJvbHMgKi8KK307CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NRkRfV004MzUyX0NPTkZJR19NT0RFXzMKKworI3VuZGVmIFdNODM1MF9IQVZFX0NPTkZJR19NT0RFCisjZGVmaW5lIFdNODM1MF9IQVZFX0NPTkZJR19NT0RFCisKK2NvbnN0IHUxNiB3bTgzNTJfbW9kZTNfZGVmYXVsdHNbXSA9IHsKKwkweDYxNDMsICAgICAvKiBSMCAgIC0gUmVzZXQvSUQgKi8KKwkweDAwMDAsICAgICAvKiBSMSAgIC0gSUQgKi8KKwkweDAwMDIsICAgICAvKiBSMiAgIC0gUmV2aXNpb24gKi8KKwkweDFDMDIsICAgICAvKiBSMyAgIC0gU3lzdGVtIENvbnRyb2wgMSAqLworCTB4MDIwNCwgICAgIC8qIFI0ICAgLSBTeXN0ZW0gQ29udHJvbCAyICovCisJMHgwMDAwLCAgICAgLyogUjUgICAtIFN5c3RlbSBIaWJlcm5hdGUgKi8KKwkweDhBMDAsICAgICAvKiBSNiAgIC0gSW50ZXJmYWNlIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNyAqLworCTB4ODAwMCwgICAgIC8qIFI4ICAgLSBQb3dlciBtZ210ICgxKSAqLworCTB4MDAwMCwgICAgIC8qIFI5ICAgLSBQb3dlciBtZ210ICgyKSAqLworCTB4MDAwMCwgICAgIC8qIFIxMCAgLSBQb3dlciBtZ210ICgzKSAqLworCTB4MjAwMCwgICAgIC8qIFIxMSAgLSBQb3dlciBtZ210ICg0KSAqLworCTB4MEUwMCwgICAgIC8qIFIxMiAgLSBQb3dlciBtZ210ICg1KSAqLworCTB4MDAwMCwgICAgIC8qIFIxMyAgLSBQb3dlciBtZ210ICg2KSAqLworCTB4MDAwMCwgICAgIC8qIFIxNCAgLSBQb3dlciBtZ210ICg3KSAqLworCTB4MDAwMCwgICAgIC8qIFIxNSAqLworCTB4MDAwMCwgICAgIC8qIFIxNiAgLSBSVEMgU2Vjb25kcy9NaW51dGVzICovCisJMHgwMTAwLCAgICAgLyogUjE3ICAtIFJUQyBIb3Vycy9EYXkgKi8KKwkweDAxMDEsICAgICAvKiBSMTggIC0gUlRDIERhdGUvTW9udGggKi8KKwkweDE0MDAsICAgICAvKiBSMTkgIC0gUlRDIFllYXIgKi8KKwkweDAwMDAsICAgICAvKiBSMjAgIC0gQWxhcm0gU2Vjb25kcy9NaW51dGVzICovCisJMHgwMDAwLCAgICAgLyogUjIxICAtIEFsYXJtIEhvdXJzL0RheSAqLworCTB4MDAwMCwgICAgIC8qIFIyMiAgLSBBbGFybSBEYXRlL01vbnRoICovCisJMHgwMzIwLCAgICAgLyogUjIzICAtIFJUQyBUaW1lIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMjQgIC0gU3lzdGVtIEludGVycnVwdHMgKi8KKwkweDAwMDAsICAgICAvKiBSMjUgIC0gSW50ZXJydXB0IFN0YXR1cyAxICovCisJMHgwMDAwLCAgICAgLyogUjI2ICAtIEludGVycnVwdCBTdGF0dXMgMiAqLworCTB4MDAwMCwgICAgIC8qIFIyNyAqLworCTB4MDAwMCwgICAgIC8qIFIyOCAgLSBVbmRlciBWb2x0YWdlIEludGVycnVwdCBzdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjkgIC0gT3ZlciBDdXJyZW50IEludGVycnVwdCBzdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMzAgIC0gR1BJTyBJbnRlcnJ1cHQgU3RhdHVzICovCisJMHgwMDAwLCAgICAgLyogUjMxICAtIENvbXBhcmF0b3IgSW50ZXJydXB0IFN0YXR1cyAqLworCTB4M0ZGRiwgICAgIC8qIFIzMiAgLSBTeXN0ZW0gSW50ZXJydXB0cyBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjMzICAtIEludGVycnVwdCBTdGF0dXMgMSBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjM0ICAtIEludGVycnVwdCBTdGF0dXMgMiBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjM1ICovCisJMHgwMDAwLCAgICAgLyogUjM2ICAtIFVuZGVyIFZvbHRhZ2UgSW50ZXJydXB0IHN0YXR1cyBNYXNrICovCisJMHgwMDAwLCAgICAgLyogUjM3ICAtIE92ZXIgQ3VycmVudCBJbnRlcnJ1cHQgc3RhdHVzIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzggIC0gR1BJTyBJbnRlcnJ1cHQgU3RhdHVzIE1hc2sgKi8KKwkweDAwMDAsICAgICAvKiBSMzkgIC0gQ29tcGFyYXRvciBJbnRlcnJ1cHQgU3RhdHVzIE1hc2sgKi8KKwkweDAwNDAsICAgICAvKiBSNDAgIC0gQ2xvY2sgQ29udHJvbCAxICovCisJMHgwMDAwLCAgICAgLyogUjQxICAtIENsb2NrIENvbnRyb2wgMiAqLworCTB4M0EwMCwgICAgIC8qIFI0MiAgLSBGTEwgQ29udHJvbCAxICovCisJMHg3MDg2LCAgICAgLyogUjQzICAtIEZMTCBDb250cm9sIDIgKi8KKwkweEMyMjYsICAgICAvKiBSNDQgIC0gRkxMIENvbnRyb2wgMyAqLworCTB4MDAwMCwgICAgIC8qIFI0NSAgLSBGTEwgQ29udHJvbCA0ICovCisJMHgwMDAwLCAgICAgLyogUjQ2ICovCisJMHgwMDAwLCAgICAgLyogUjQ3ICovCisJMHgwMDAwLCAgICAgLyogUjQ4ICAtIERBQyBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjQ5ICovCisJMHgwMEMwLCAgICAgLyogUjUwICAtIERBQyBEaWdpdGFsIFZvbHVtZSBMICovCisJMHgwMEMwLCAgICAgLyogUjUxICAtIERBQyBEaWdpdGFsIFZvbHVtZSBSICovCisJMHgwMDAwLCAgICAgLyogUjUyICovCisJMHgwMDQwLCAgICAgLyogUjUzICAtIERBQyBMUiBSYXRlICovCisJMHgwMDAwLCAgICAgLyogUjU0ICAtIERBQyBDbG9jayBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjU1ICovCisJMHgwMDAwLCAgICAgLyogUjU2ICovCisJMHgwMDAwLCAgICAgLyogUjU3ICovCisJMHg0MDAwLCAgICAgLyogUjU4ICAtIERBQyBNdXRlICovCisJMHgwMDAwLCAgICAgLyogUjU5ICAtIERBQyBNdXRlIFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFI2MCAgLSBEQUMgU2lkZSAqLworCTB4MDAwMCwgICAgIC8qIFI2MSAqLworCTB4MDAwMCwgICAgIC8qIFI2MiAqLworCTB4MDAwMCwgICAgIC8qIFI2MyAqLworCTB4ODAwMCwgICAgIC8qIFI2NCAgLSBBREMgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI2NSAqLworCTB4MDBDMCwgICAgIC8qIFI2NiAgLSBBREMgRGlnaXRhbCBWb2x1bWUgTCAqLworCTB4MDBDMCwgICAgIC8qIFI2NyAgLSBBREMgRGlnaXRhbCBWb2x1bWUgUiAqLworCTB4MDAwMCwgICAgIC8qIFI2OCAgLSBBREMgRGl2aWRlciAqLworCTB4MDAwMCwgICAgIC8qIFI2OSAqLworCTB4MDA0MCwgICAgIC8qIFI3MCAgLSBBREMgTFIgUmF0ZSAqLworCTB4MDAwMCwgICAgIC8qIFI3MSAqLworCTB4MDMwMywgICAgIC8qIFI3MiAgLSBJbnB1dCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjczICAtIElOMyBJbnB1dCBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjc0ICAtIE1pYyBCaWFzIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNzUgKi8KKwkweDAwMDAsICAgICAvKiBSNzYgIC0gT3V0cHV0IENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSNzcgIC0gSmFjayBEZXRlY3QgKi8KKwkweDAwMDAsICAgICAvKiBSNzggIC0gQW50aSBQb3AgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI3OSAqLworCTB4MDA0MCwgICAgIC8qIFI4MCAgLSBMZWZ0IElucHV0IFZvbHVtZSAqLworCTB4MDA0MCwgICAgIC8qIFI4MSAgLSBSaWdodCBJbnB1dCBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSODIgKi8KKwkweDAwMDAsICAgICAvKiBSODMgKi8KKwkweDAwMDAsICAgICAvKiBSODQgKi8KKwkweDAwMDAsICAgICAvKiBSODUgKi8KKwkweDAwMDAsICAgICAvKiBSODYgKi8KKwkweDAwMDAsICAgICAvKiBSODcgKi8KKwkweDA4MDAsICAgICAvKiBSODggIC0gTGVmdCBNaXhlciBDb250cm9sICovCisJMHgxMDAwLCAgICAgLyogUjg5ICAtIFJpZ2h0IE1peGVyIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSOTAgKi8KKwkweDAwMDAsICAgICAvKiBSOTEgKi8KKwkweDAwMDAsICAgICAvKiBSOTIgIC0gT1VUMyBNaXhlciBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjkzICAtIE9VVDQgTWl4ZXIgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI5NCAqLworCTB4MDAwMCwgICAgIC8qIFI5NSAqLworCTB4MDAwMCwgICAgIC8qIFI5NiAgLSBPdXRwdXQgTGVmdCBNaXhlciBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSOTcgIC0gT3V0cHV0IFJpZ2h0IE1peGVyIFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFI5OCAgLSBJbnB1dCBNaXhlciBWb2x1bWUgTCAqLworCTB4MDAwMCwgICAgIC8qIFI5OSAgLSBJbnB1dCBNaXhlciBWb2x1bWUgUiAqLworCTB4MDAwMCwgICAgIC8qIFIxMDAgLSBJbnB1dCBNaXhlciBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSMTAxICovCisJMHgwMDAwLCAgICAgLyogUjEwMiAqLworCTB4MDAwMCwgICAgIC8qIFIxMDMgKi8KKwkweDAwRTQsICAgICAvKiBSMTA0IC0gT1VUMUwgVm9sdW1lICovCisJMHgwMEU0LCAgICAgLyogUjEwNSAtIE9VVDFSIFZvbHVtZSAqLworCTB4MDBFNCwgICAgIC8qIFIxMDYgLSBPVVQyTCBWb2x1bWUgKi8KKwkweDAyRTQsICAgICAvKiBSMTA3IC0gT1VUMlIgVm9sdW1lICovCisJMHgwMDAwLCAgICAgLyogUjEwOCAqLworCTB4MDAwMCwgICAgIC8qIFIxMDkgKi8KKwkweDAwMDAsICAgICAvKiBSMTEwICovCisJMHgwMDAwLCAgICAgLyogUjExMSAtIEJFRVAgVm9sdW1lICovCisJMHgwQTAwLCAgICAgLyogUjExMiAtIEFJIEZvcm1hdGluZyAqLworCTB4MDAwMCwgICAgIC8qIFIxMTMgLSBBREMgREFDIENPTVAgKi8KKwkweDAwMjAsICAgICAvKiBSMTE0IC0gQUkgQURDIENvbnRyb2wgKi8KKwkweDAwMjAsICAgICAvKiBSMTE1IC0gQUkgREFDIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTE2ICovCisJMHgwMDAwLCAgICAgLyogUjExNyAqLworCTB4MDAwMCwgICAgIC8qIFIxMTggKi8KKwkweDAwMDAsICAgICAvKiBSMTE5ICovCisJMHgwMDAwLCAgICAgLyogUjEyMCAqLworCTB4MDAwMCwgICAgIC8qIFIxMjEgKi8KKwkweDAwMDAsICAgICAvKiBSMTIyICovCisJMHgwMDAwLCAgICAgLyogUjEyMyAqLworCTB4MDAwMCwgICAgIC8qIFIxMjQgKi8KKwkweDAwMDAsICAgICAvKiBSMTI1ICovCisJMHgwMDAwLCAgICAgLyogUjEyNiAqLworCTB4MDAwMCwgICAgIC8qIFIxMjcgKi8KKwkweDFGRkYsICAgICAvKiBSMTI4IC0gR1BJTyBEZWJvdW5jZSAqLworCTB4MDAxMCwgICAgIC8qIFIxMjkgLSBHUElPIFBpbiBwdWxsIHVwIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTMwIC0gR1BJTyBQdWxsIGRvd24gQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxMzEgLSBHUElPIEludGVycnVwdCBNb2RlICovCisJMHgwMDAwLCAgICAgLyogUjEzMiAqLworCTB4MDAwMCwgICAgIC8qIFIxMzMgLSBHUElPIENvbnRyb2wgKi8KKwkweDBCRkIsICAgICAvKiBSMTM0IC0gR1BJTyBDb25maWd1cmF0aW9uIChpL28pICovCisJMHgwRkZELCAgICAgLyogUjEzNSAtIEdQSU8gUGluIFBvbGFyaXR5IC8gVHlwZSAqLworCTB4MDAwMCwgICAgIC8qIFIxMzYgKi8KKwkweDAwMDAsICAgICAvKiBSMTM3ICovCisJMHgwMDAwLCAgICAgLyogUjEzOCAqLworCTB4MDAwMCwgICAgIC8qIFIxMzkgKi8KKwkweDAzMTAsICAgICAvKiBSMTQwIC0gR1BJTyBGdW5jdGlvbiBTZWxlY3QgMSAqLworCTB4MDAwMSwgICAgIC8qIFIxNDEgLSBHUElPIEZ1bmN0aW9uIFNlbGVjdCAyICovCisJMHgyMzAwLCAgICAgLyogUjE0MiAtIEdQSU8gRnVuY3Rpb24gU2VsZWN0IDMgKi8KKwkweDAwMDMsICAgICAvKiBSMTQzIC0gR1BJTyBGdW5jdGlvbiBTZWxlY3QgNCAqLworCTB4MDAwMCwgICAgIC8qIFIxNDQgLSBEaWdpdGlzZXIgQ29udHJvbCAoMSkgKi8KKwkweDAwMDIsICAgICAvKiBSMTQ1IC0gRGlnaXRpc2VyIENvbnRyb2wgKDIpICovCisJMHgwMDAwLCAgICAgLyogUjE0NiAqLworCTB4MDAwMCwgICAgIC8qIFIxNDcgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ4ICovCisJMHgwMDAwLCAgICAgLyogUjE0OSAqLworCTB4MDAwMCwgICAgIC8qIFIxNTAgKi8KKwkweDAwMDAsICAgICAvKiBSMTUxICovCisJMHg3MDAwLCAgICAgLyogUjE1MiAtIEFVWDEgUmVhZGJhY2sgKi8KKwkweDcwMDAsICAgICAvKiBSMTUzIC0gQVVYMiBSZWFkYmFjayAqLworCTB4NzAwMCwgICAgIC8qIFIxNTQgLSBBVVgzIFJlYWRiYWNrICovCisJMHg3MDAwLCAgICAgLyogUjE1NSAtIEFVWDQgUmVhZGJhY2sgKi8KKwkweDAwMDAsICAgICAvKiBSMTU2IC0gVVNCIFZvbHRhZ2UgUmVhZGJhY2sgKi8KKwkweDAwMDAsICAgICAvKiBSMTU3IC0gTElORSBWb2x0YWdlIFJlYWRiYWNrICovCisJMHgwMDAwLCAgICAgLyogUjE1OCAtIEJBVFQgVm9sdGFnZSBSZWFkYmFjayAqLworCTB4MDAwMCwgICAgIC8qIFIxNTkgLSBDaGlwIFRlbXAgUmVhZGJhY2sgKi8KKwkweDAwMDAsICAgICAvKiBSMTYwICovCisJMHgwMDAwLCAgICAgLyogUjE2MSAqLworCTB4MDAwMCwgICAgIC8qIFIxNjIgKi8KKwkweDAwMDAsICAgICAvKiBSMTYzIC0gR2VuZXJpYyBDb21wYXJhdG9yIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTY0IC0gR2VuZXJpYyBjb21wYXJhdG9yIDEgKi8KKwkweDAwMDAsICAgICAvKiBSMTY1IC0gR2VuZXJpYyBjb21wYXJhdG9yIDIgKi8KKwkweDAwMDAsICAgICAvKiBSMTY2IC0gR2VuZXJpYyBjb21wYXJhdG9yIDMgKi8KKwkweDAwMDAsICAgICAvKiBSMTY3IC0gR2VuZXJpYyBjb21wYXJhdG9yIDQgKi8KKwkweEEwMEYsICAgICAvKiBSMTY4IC0gQmF0dGVyeSBDaGFyZ2VyIENvbnRyb2wgMSAqLworCTB4MEIwNiwgICAgIC8qIFIxNjkgLSBCYXR0ZXJ5IENoYXJnZXIgQ29udHJvbCAyICovCisJMHgwMDAwLCAgICAgLyogUjE3MCAtIEJhdHRlcnkgQ2hhcmdlciBDb250cm9sIDMgKi8KKwkweDAwMDAsICAgICAvKiBSMTcxICovCisJMHgwMDAwLCAgICAgLyogUjE3MiAtIEN1cnJlbnQgU2luayBEcml2ZXIgQSAqLworCTB4MDAwMCwgICAgIC8qIFIxNzMgLSBDU0EgRmxhc2ggY29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxNzQgLSBDdXJyZW50IFNpbmsgRHJpdmVyIEIgKi8KKwkweDAwMDAsICAgICAvKiBSMTc1IC0gQ1NCIEZsYXNoIGNvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTc2IC0gRENEQy9MRE8gcmVxdWVzdGVkICovCisJMHgwMzJELCAgICAgLyogUjE3NyAtIERDREMgQWN0aXZlIG9wdGlvbnMgKi8KKwkweDAwMDAsICAgICAvKiBSMTc4IC0gRENEQyBTbGVlcCBvcHRpb25zICovCisJMHgwMDI1LCAgICAgLyogUjE3OSAtIFBvd2VyLWNoZWNrIGNvbXBhcmF0b3IgKi8KKwkweDAwMDYsICAgICAvKiBSMTgwIC0gRENEQzEgQ29udHJvbCAqLworCTB4MDQwMCwgICAgIC8qIFIxODEgLSBEQ0RDMSBUaW1lb3V0cyAqLworCTB4MTAwNiwgICAgIC8qIFIxODIgLSBEQ0RDMSBMb3cgUG93ZXIgKi8KKwkweDAwMTgsICAgICAvKiBSMTgzIC0gRENEQzIgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxODQgLSBEQ0RDMiBUaW1lb3V0cyAqLworCTB4MDAwMCwgICAgIC8qIFIxODUgKi8KKwkweDAwNTAsICAgICAvKiBSMTg2IC0gRENEQzMgQ29udHJvbCAqLworCTB4MEMwMCwgICAgIC8qIFIxODcgLSBEQ0RDMyBUaW1lb3V0cyAqLworCTB4MDAwNiwgICAgIC8qIFIxODggLSBEQ0RDMyBMb3cgUG93ZXIgKi8KKwkweDAwMEUsICAgICAvKiBSMTg5IC0gRENEQzQgQ29udHJvbCAqLworCTB4MDQwMCwgICAgIC8qIFIxOTAgLSBEQ0RDNCBUaW1lb3V0cyAqLworCTB4MDAwNiwgICAgIC8qIFIxOTEgLSBEQ0RDNCBMb3cgUG93ZXIgKi8KKwkweDAwMDgsICAgICAvKiBSMTkyIC0gRENEQzUgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIxOTMgLSBEQ0RDNSBUaW1lb3V0cyAqLworCTB4MDAwMCwgICAgIC8qIFIxOTQgKi8KKwkweDAwMjksICAgICAvKiBSMTk1IC0gRENEQzYgQ29udHJvbCAqLworCTB4MDgwMCwgICAgIC8qIFIxOTYgLSBEQ0RDNiBUaW1lb3V0cyAqLworCTB4MDAwNiwgICAgIC8qIFIxOTcgLSBEQ0RDNiBMb3cgUG93ZXIgKi8KKwkweDAwMDAsICAgICAvKiBSMTk4ICovCisJMHgwMDAzLCAgICAgLyogUjE5OSAtIExpbWl0IFN3aXRjaCBDb250cm9sICovCisJMHgwMDFELCAgICAgLyogUjIwMCAtIExETzEgQ29udHJvbCAqLworCTB4MTAwMCwgICAgIC8qIFIyMDEgLSBMRE8xIFRpbWVvdXRzICovCisJMHgwMDFDLCAgICAgLyogUjIwMiAtIExETzEgTG93IFBvd2VyICovCisJMHgwMDE3LCAgICAgLyogUjIwMyAtIExETzIgQ29udHJvbCAqLworCTB4MTAwMCwgICAgIC8qIFIyMDQgLSBMRE8yIFRpbWVvdXRzICovCisJMHgwMDFDLCAgICAgLyogUjIwNSAtIExETzIgTG93IFBvd2VyICovCisJMHgwMDA2LCAgICAgLyogUjIwNiAtIExETzMgQ29udHJvbCAqLworCTB4MTAwMCwgICAgIC8qIFIyMDcgLSBMRE8zIFRpbWVvdXRzICovCisJMHgwMDFDLCAgICAgLyogUjIwOCAtIExETzMgTG93IFBvd2VyICovCisJMHgwMDEwLCAgICAgLyogUjIwOSAtIExETzQgQ29udHJvbCAqLworCTB4MTAwMCwgICAgIC8qIFIyMTAgLSBMRE80IFRpbWVvdXRzICovCisJMHgwMDFDLCAgICAgLyogUjIxMSAtIExETzQgTG93IFBvd2VyICovCisJMHgwMDAwLCAgICAgLyogUjIxMiAqLworCTB4MDAwMCwgICAgIC8qIFIyMTMgKi8KKwkweDAwMDAsICAgICAvKiBSMjE0ICovCisJMHgwMDAwLCAgICAgLyogUjIxNSAtIFZDQ19GQVVMVCBNYXNrcyAqLworCTB4MDAxRiwgICAgIC8qIFIyMTYgLSBNYWluIEJhbmRnYXAgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFIyMTcgLSBPU0MgQ29udHJvbCAqLworCTB4OTAwMCwgICAgIC8qIFIyMTggLSBSVEMgVGljayBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjIxOSAtIFNlY3VyaXR5MSAqLworCTB4NDAwMCwgICAgIC8qIFIyMjAgKi8KKwkweDAwMDAsICAgICAvKiBSMjIxICovCisJMHgwMDAwLCAgICAgLyogUjIyMiAqLworCTB4MDAwMCwgICAgIC8qIFIyMjMgKi8KKwkweDAwMDAsICAgICAvKiBSMjI0IC0gU2lnbmFsIG92ZXJyaWRlcyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjUgLSBEQ0RDL0xETyBzdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjI2IC0gQ2hhcmdlciBPdmVyaWRlcy9zdGF0dXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjI3IC0gbWlzYyBvdmVycmlkZXMgKi8KKwkweDAwMDAsICAgICAvKiBSMjI4IC0gU3VwcGx5IG92ZXJyaWRlcy9zdGF0dXMgMSAqLworCTB4MDAwMCwgICAgIC8qIFIyMjkgLSBTdXBwbHkgb3ZlcnJpZGVzL3N0YXR1cyAyICovCisJMHhFMDAwLCAgICAgLyogUjIzMCAtIEdQSU8gUGluIFN0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFIyMzEgLSBjb21wYXJvdG9yIG92ZXJyaWRlcyAqLworCTB4MDAwMCwgICAgIC8qIFIyMzIgKi8KKwkweDAwMDAsICAgICAvKiBSMjMzIC0gU3RhdGUgTWFjaGluZSBzdGF0dXMgKi8KKwkweDEyMDAsICAgICAvKiBSMjM0ICovCisJMHgwMDAwLCAgICAgLyogUjIzNSAqLworCTB4ODAwMCwgICAgIC8qIFIyMzYgKi8KKwkweDAwMDAsICAgICAvKiBSMjM3ICovCisJMHgwMDAwLCAgICAgLyogUjIzOCAqLworCTB4MDAwMCwgICAgIC8qIFIyMzkgKi8KKwkweDAwMDMsICAgICAvKiBSMjQwICovCisJMHgwMDAwLCAgICAgLyogUjI0MSAqLworCTB4MDAwMCwgICAgIC8qIFIyNDIgKi8KKwkweDAwMDQsICAgICAvKiBSMjQzICovCisJMHgwMzAwLCAgICAgLyogUjI0NCAqLworCTB4MDAwMCwgICAgIC8qIFIyNDUgKi8KKwkweDAyMDAsICAgICAvKiBSMjQ2ICovCisJMHgwMDAwLCAgICAgLyogUjI0NyAqLworCTB4MTAwMCwgICAgIC8qIFIyNDggLSBEQ0RDMSBUZXN0IENvbnRyb2xzICovCisJMHg1MDAwLCAgICAgLyogUjI0OSAqLworCTB4MTAwMCwgICAgIC8qIFIyNTAgLSBEQ0RDMyBUZXN0IENvbnRyb2xzICovCisJMHgxMDAwLCAgICAgLyogUjI1MSAtIERDREM0IFRlc3QgQ29udHJvbHMgKi8KKwkweDUxMDAsICAgICAvKiBSMjUyICovCisJMHgxMDAwLCAgICAgLyogUjI1MyAtIERDREM2IFRlc3QgQ29udHJvbHMgKi8KK307CisjZW5kaWYKKwogLyogVGhlIHJlZ2lzdGVyIGRlZmF1bHRzIGZvciB0aGUgY29uZmlnIG1vZGUgdXNlZCBtdXN0IGJlIGNvbXBpbGVkIGluIGJ1dAogICogZHVlIHRvIHRoZSBpbXBhY3Qgb24ga2VybmVsIHNpemUgaXQgaXMgcG9zc2libGUgdG8gZGlzYWJsZQogICovCkBAIC0xMzA3LDE0ICszNDAzLDE0IEBACiAJeyAweEZGM0YsIDB4RTAzRiwgMHgwMDAwIH0sIC8qIFIyMTYgLSBNYWluIEJhbmRnYXAgQ29udHJvbCAqLwogCXsgMHhFRjJGLCAweEUwMkYsIDB4MDAwMCB9LCAvKiBSMjE3IC0gT1NDIENvbnRyb2wgKi8KIAl7IDB4RjNGRiwgMHhCM0ZGLCAweGMwMDAgfSwgLyogUjIxOCAtIFJUQyBUaWNrIENvbnRyb2wgKi8KLQl7IDB4RkZGRiwgMHhGRkZGLCAweEZGRkYgfSwgLyogUjIxOSAqLworCXsgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCB9LCAvKiBSMjE5IC0gU2VjdXJpdHkgKi8KIAl7IDB4MDlGRiwgMHgwMUZGLCAweDAwMDAgfSwgLyogUjIyMCAtIFJBTSBCSVNUIDEgKi8KIAl7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIyMSAqLwogCXsgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMjIyICovCiAJeyAweEZGRkYsIDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIyMjMgKi8KIAl7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIyNCAqLwogCXsgMHg4RjNGLCAweDAwMDAsIDB4RkZGRiB9LCAvKiBSMjI1IC0gRENEQy9MRE8gc3RhdHVzICovCi0JeyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyMjYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwLCAweEZGRkYgfSwgLyogUjIyNiAtIENoYXJnZXIgc3RhdHVzICovCiAJeyAweDAwMDAsIDB4MDAwMCwgMHhGRkZGIH0sIC8qIFIyMjcgKi8KIAl7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIyOCAqLwogCXsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjI5ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC93bTg0MDAtY29yZS5jIGIvZHJpdmVycy9tZmQvd204NDAwLWNvcmUuYwppbmRleCA2YTBjZWRiLi5jZjMwZDA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC93bTg0MDAtY29yZS5jCisrKyBiL2RyaXZlcnMvbWZkL3dtODQwMC1jb3JlLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9idWcuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC93bTg0MDAtcHJpdmF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC93bTg0MDAtYXVkaW8uaD4KIApAQCAtMjM5LDYgKzI0MCwxNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwod204NDAwX3Jlc2V0X2NvZGVjX3JlZ19jYWNoZSk7CiAKK3N0YXRpYyBpbnQgd204NDAwX3JlZ2lzdGVyX2NvZGVjKHN0cnVjdCB3bTg0MDAgKndtODQwMCkKK3sKKwlzdHJ1Y3QgbWZkX2NlbGwgY2VsbCA9IHsKKwkJLm5hbWUgPSAid204NDAwLWNvZGVjIiwKKwkJLmRyaXZlcl9kYXRhID0gd204NDAwLAorCX07CisKKwlyZXR1cm4gbWZkX2FkZF9kZXZpY2VzKHdtODQwMC0+ZGV2LCAtMSwgJmNlbGwsIDEsIE5VTEwsIDApOworfQorCiAvKgogICogd204NDAwX2luaXQgLSBHZW5lcmljIGluaXRpYWxpc2F0aW9uCiAgKgpAQCAtMjk2LDI0ICszMDcsMzIgQEAKIAlyZWcgPSAocmVnICYgV004NDAwX0NISVBfUkVWX01BU0spID4+IFdNODQwMF9DSElQX1JFVl9TSElGVDsKIAlkZXZfaW5mbyh3bTg0MDAtPmRldiwgIldNODQwMCByZXZpc2lvbiAleFxuIiwgcmVnKTsKIAorCXJldCA9IHdtODQwMF9yZWdpc3Rlcl9jb2RlYyh3bTg0MDApOworCWlmIChyZXQgIT0gMCkgeworCQlkZXZfZXJyKHdtODQwMC0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIGNvZGVjXG4iKTsKKwkJZ290byBlcnJfY2hpbGRyZW47CisJfQorCiAJaWYgKHBkYXRhICYmIHBkYXRhLT5wbGF0Zm9ybV9pbml0KSB7CiAJCXJldCA9IHBkYXRhLT5wbGF0Zm9ybV9pbml0KHdtODQwMC0+ZGV2KTsKLQkJaWYgKHJldCAhPSAwKQorCQlpZiAocmV0ICE9IDApIHsKIAkJCWRldl9lcnIod204NDAwLT5kZXYsICJQbGF0Zm9ybSBpbml0IGZhaWxlZDogJWRcbiIsCiAJCQkJcmV0KTsKKwkJCWdvdG8gZXJyX2NoaWxkcmVuOworCQl9CiAJfSBlbHNlCiAJCWRldl93YXJuKHdtODQwMC0+ZGV2LCAiTm8gcGxhdGZvcm0gaW5pdGlhbGlzYXRpb24gc3VwcGxpZWRcbiIpOwogCisJcmV0dXJuIDA7CisKK2Vycl9jaGlsZHJlbjoKKwltZmRfcmVtb3ZlX2RldmljZXMod204NDAwLT5kZXYpOwogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIHdtODQwMF9yZWxlYXNlKHN0cnVjdCB3bTg0MDAgKndtODQwMCkKIHsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODQwMC0+cmVndWxhdG9ycyk7IGkrKykKLQkJaWYgKHdtODQwMC0+cmVndWxhdG9yc1tpXS5uYW1lKQotCQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoJndtODQwMC0+cmVndWxhdG9yc1tpXSk7CisJbWZkX3JlbW92ZV9kZXZpY2VzKHdtODQwMC0+ZGV2KTsKIH0KIAogI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgZGVmaW5lZChDT05GSUdfSTJDX01PRFVMRSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9LY29uZmlnIGIvZHJpdmVycy9taXNjL0tjb25maWcKaW5kZXggZmVlNzMwNC4uMzk0OWExYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL0tjb25maWcKKysrIGIvZHJpdmVycy9taXNjL0tjb25maWcKQEAgLTQ5OCw2ICs0OTgsMTggQEAKIAlUaGlzIG9wdGlvbiBlbmFibGVzIGFkZGl0aW9uIGRlYnVnZ2luZyBjb2RlIGZvciB0aGUgU0dJIEdSVSBkcml2ZXIuIElmCiAJeW91IGFyZSB1bnN1cmUsIHNheSBOLgogCitjb25maWcgREVMTF9MQVBUT1AKKwl0cmlzdGF0ZSAiRGVsbCBMYXB0b3AgRXh0cmFzIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gWDg2CisJZGVwZW5kcyBvbiBEQ0RCQVMKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gQkFDS0xJR0hUX0NMQVNTX0RFVklDRQorCWRlcGVuZHMgb24gUkZLSUxMCisJZGVmYXVsdCBuCisJLS0taGVscC0tLQorCVRoaXMgZHJpdmVyIGFkZHMgc3VwcG9ydCBmb3IgcmZraWxsIGFuZCBiYWNrbGlnaHQgY29udHJvbCB0byBEZWxsCisJbGFwdG9wcy4KKwogc291cmNlICJkcml2ZXJzL21pc2MvYzJwb3J0L0tjb25maWciCiAKIGVuZGlmICMgTUlTQ19ERVZJQ0VTCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvTWFrZWZpbGUgYi9kcml2ZXJzL21pc2MvTWFrZWZpbGUKaW5kZXggODE3ZjdmNS4uNWRlODYzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWlzYy9NYWtlZmlsZQpAQCAtMTgsNiArMTgsNyBAQAogb2JqLSQoQ09ORklHX1RDMTEwMF9XTUkpCSs9IHRjMTEwMC13bWkubwogb2JqLSQoQ09ORklHX0xLRFRNKQkJKz0gbGtkdG0ubwogb2JqLSQoQ09ORklHX1RJRk1fQ09SRSkgICAgICAgCSs9IHRpZm1fY29yZS5vCitvYmotJChDT05GSUdfREVMTF9MQVBUT1ApCSs9IGRlbGwtbGFwdG9wLm8KIG9iai0kKENPTkZJR19USUZNXzdYWDEpICAgICAgIAkrPSB0aWZtXzd4eDEubwogb2JqLSQoQ09ORklHX1BIQU5UT00pCQkrPSBwaGFudG9tLm8KIG9iai0kKENPTkZJR19TR0lfSU9DNCkJCSs9IGlvYzQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2RlbGwtbGFwdG9wLmMgYi9kcml2ZXJzL21pc2MvZGVsbC1sYXB0b3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDMzYTIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9taXNjL2RlbGwtbGFwdG9wLmMKQEAgLTAsMCArMSw0MzYgQEAKKy8qCisgKiAgRHJpdmVyIGZvciBEZWxsIGxhcHRvcCBleHRyYXMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSBSZWQgSGF0IDxtamdAcmVkaGF0LmNvbT4KKyAqCisgKiAgQmFzZWQgb24gZG9jdW1lbnRhdGlvbiBpbiB0aGUgbGlic21iaW9zIHBhY2thZ2UsIENvcHlyaWdodCAoQykgMjAwNSBEZWxsCisgKiAgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3Jma2lsbC5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlICIuLi9maXJtd2FyZS9kY2RiYXMuaCIKKworI2RlZmluZSBCUklHSFRORVNTX1RPS0VOIDB4N2QKKworLyogVGhpcyBzdHJ1Y3R1cmUgd2lsbCBiZSBtb2RpZmllZCBieSB0aGUgZmlybXdhcmUgd2hlbiB3ZSBlbnRlcgorICogc3lzdGVtIG1hbmFnZW1lbnQgbW9kZSwgaGVuY2UgdGhlIHZvbGF0aWxlcyAqLworCitzdHJ1Y3QgY2FsbGluZ19pbnRlcmZhY2VfYnVmZmVyIHsKKwl1MTYgY2xhc3M7CisJdTE2IHNlbGVjdDsKKwl2b2xhdGlsZSB1MzIgaW5wdXRbNF07CisJdm9sYXRpbGUgdTMyIG91dHB1dFs0XTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBjYWxsaW5nX2ludGVyZmFjZV90b2tlbiB7CisJdTE2IHRva2VuSUQ7CisJdTE2IGxvY2F0aW9uOworCXVuaW9uIHsKKwkJdTE2IHZhbHVlOworCQl1MTYgc3RyaW5nbGVuZ3RoOworCX07Cit9OworCitzdHJ1Y3QgY2FsbGluZ19pbnRlcmZhY2Vfc3RydWN0dXJlIHsKKwlzdHJ1Y3QgZG1pX2hlYWRlciBoZWFkZXI7CisJdTE2IGNtZElPQWRkcmVzczsKKwl1OCBjbWRJT0NvZGU7CisJdTMyIHN1cHBvcnRlZENtZHM7CisJc3RydWN0IGNhbGxpbmdfaW50ZXJmYWNlX3Rva2VuIHRva2Vuc1tdOworfSBfX3BhY2tlZDsKKworc3RhdGljIGludCBkYV9jb21tYW5kX2FkZHJlc3M7CitzdGF0aWMgaW50IGRhX2NvbW1hbmRfY29kZTsKK3N0YXRpYyBpbnQgZGFfbnVtX3Rva2VuczsKK3N0YXRpYyBzdHJ1Y3QgY2FsbGluZ19pbnRlcmZhY2VfdG9rZW4gKmRhX3Rva2VuczsKKworc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpkZWxsX2JhY2tsaWdodF9kZXZpY2U7CitzdGF0aWMgc3RydWN0IHJma2lsbCAqd2lmaV9yZmtpbGw7CitzdGF0aWMgc3RydWN0IHJma2lsbCAqYmx1ZXRvb3RoX3Jma2lsbDsKK3N0YXRpYyBzdHJ1Y3QgcmZraWxsICp3d2FuX3Jma2lsbDsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkIF9faW5pdGRhdGEgZGVsbF9kZXZpY2VfdGFibGVbXSA9IHsKKwl7CisJCS5pZGVudCA9ICJEZWxsIGxhcHRvcCIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBJbmMuIiksCisJCQlETUlfTUFUQ0goRE1JX0NIQVNTSVNfVFlQRSwgIjgiKSwKKwkJfSwKKwl9LAorCXsgfQorfTsKKworc3RhdGljIHZvaWQgcGFyc2VfZGFfdGFibGUoY29uc3Qgc3RydWN0IGRtaV9oZWFkZXIgKmRtKQoreworCS8qIEZpbmFsIHRva2VuIGlzIGEgdGVybWluYXRvciwgc28gd2UgZG9uJ3Qgd2FudCB0byBjb3B5IGl0ICovCisJaW50IHRva2VucyA9IChkbS0+bGVuZ3RoLTExKS9zaXplb2Yoc3RydWN0IGNhbGxpbmdfaW50ZXJmYWNlX3Rva2VuKS0xOworCXN0cnVjdCBjYWxsaW5nX2ludGVyZmFjZV9zdHJ1Y3R1cmUgKnRhYmxlID0KKwkJY29udGFpbmVyX29mKGRtLCBzdHJ1Y3QgY2FsbGluZ19pbnRlcmZhY2Vfc3RydWN0dXJlLCBoZWFkZXIpOworCisJLyogNCBieXRlcyBvZiB0YWJsZSBoZWFkZXIsIHBsdXMgNyBieXRlcyBvZiBEZWxsIGhlYWRlciwgcGx1cyBhdCBsZWFzdAorCSAgIDYgYnl0ZXMgb2YgZW50cnkgKi8KKworCWlmIChkbS0+bGVuZ3RoIDwgMTcpCisJCXJldHVybjsKKworCWRhX2NvbW1hbmRfYWRkcmVzcyA9IHRhYmxlLT5jbWRJT0FkZHJlc3M7CisJZGFfY29tbWFuZF9jb2RlID0gdGFibGUtPmNtZElPQ29kZTsKKworCWRhX3Rva2VucyA9IGtyZWFsbG9jKGRhX3Rva2VucywgKGRhX251bV90b2tlbnMgKyB0b2tlbnMpICoKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBjYWxsaW5nX2ludGVyZmFjZV90b2tlbiksCisJCQkgICAgIEdGUF9LRVJORUwpOworCisJaWYgKCFkYV90b2tlbnMpCisJCXJldHVybjsKKworCW1lbWNweShkYV90b2tlbnMrZGFfbnVtX3Rva2VucywgdGFibGUtPnRva2VucywKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBjYWxsaW5nX2ludGVyZmFjZV90b2tlbikgKiB0b2tlbnMpOworCisJZGFfbnVtX3Rva2VucyArPSB0b2tlbnM7Cit9CisKK3N0YXRpYyB2b2lkIGZpbmRfdG9rZW5zKGNvbnN0IHN0cnVjdCBkbWlfaGVhZGVyICpkbSkKK3sKKwlzd2l0Y2ggKGRtLT50eXBlKSB7CisJY2FzZSAweGQ0OiAvKiBJbmRleGVkIElPICovCisJCWJyZWFrOworCWNhc2UgMHhkNTogLyogUHJvdGVjdGVkIEFyZWEgVHlwZSAxICovCisJCWJyZWFrOworCWNhc2UgMHhkNjogLyogUHJvdGVjdGVkIEFyZWEgVHlwZSAyICovCisJCWJyZWFrOworCWNhc2UgMHhkYTogLyogQ2FsbGluZyBpbnRlcmZhY2UgKi8KKwkJcGFyc2VfZGFfdGFibGUoZG0pOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZmluZF90b2tlbl9sb2NhdGlvbihpbnQgdG9rZW5pZCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgZGFfbnVtX3Rva2VuczsgaSsrKSB7CisJCWlmIChkYV90b2tlbnNbaV0udG9rZW5JRCA9PSB0b2tlbmlkKQorCQkJcmV0dXJuIGRhX3Rva2Vuc1tpXS5sb2NhdGlvbjsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2FsbGluZ19pbnRlcmZhY2VfYnVmZmVyICoKK2RlbGxfc2VuZF9yZXF1ZXN0KHN0cnVjdCBjYWxsaW5nX2ludGVyZmFjZV9idWZmZXIgKmJ1ZmZlciwgaW50IGNsYXNzLAorCQkgIGludCBzZWxlY3QpCit7CisJc3RydWN0IHNtaV9jbWQgY29tbWFuZDsKKworCWNvbW1hbmQubWFnaWMgPSBTTUlfQ01EX01BR0lDOworCWNvbW1hbmQuY29tbWFuZF9hZGRyZXNzID0gZGFfY29tbWFuZF9hZGRyZXNzOworCWNvbW1hbmQuY29tbWFuZF9jb2RlID0gZGFfY29tbWFuZF9jb2RlOworCWNvbW1hbmQuZWJ4ID0gdmlydF90b19waHlzKGJ1ZmZlcik7CisJY29tbWFuZC5lY3ggPSAweDQyNTM0OTMxOworCisJYnVmZmVyLT5jbGFzcyA9IGNsYXNzOworCWJ1ZmZlci0+c2VsZWN0ID0gc2VsZWN0OworCisJZGNkYmFzX3NtaV9yZXF1ZXN0KCZjb21tYW5kKTsKKworCXJldHVybiBidWZmZXI7Cit9CisKKy8qIERlcml2ZWQgZnJvbSBpbmZvcm1hdGlvbiBpbiBEZWxsV2lyZWxlc3NDdGwuY3BwOgorICAgQ2xhc3MgMTcsIHNlbGVjdCAxMSBpcyByYWRpbyBjb250cm9sLiBJdCByZXR1cm5zIGFuIGFycmF5IG9mIDMyLWJpdCB2YWx1ZXMuCisKKyAgIHJlc3VsdFswXTogcmV0dXJuIGNvZGUKKyAgIHJlc3VsdFsxXToKKyAgICAgQml0IDA6ICAgICAgSGFyZHdhcmUgc3dpdGNoIHN1cHBvcnRlZAorICAgICBCaXQgMTogICAgICBXaWZpIGxvY2F0b3Igc3VwcG9ydGVkCisgICAgIEJpdCAyOiAgICAgIFdpZmkgaXMgc3VwcG9ydGVkCisgICAgIEJpdCAzOiAgICAgIEJsdWV0b290aCBpcyBzdXBwb3J0ZWQKKyAgICAgQml0IDQ6ICAgICAgV1dBTiBpcyBzdXBwb3J0ZWQKKyAgICAgQml0IDU6ICAgICAgV2lyZWxlc3Mga2V5Ym9hcmQgc3VwcG9ydGVkCisgICAgIEJpdHMgNi03OiAgIFJlc2VydmVkCisgICAgIEJpdCA4OiAgICAgIFdpZmkgaXMgaW5zdGFsbGVkCisgICAgIEJpdCA5OiAgICAgIEJsdWV0b290aCBpcyBpbnN0YWxsZWQKKyAgICAgQml0IDEwOiAgICAgV1dBTiBpcyBpbnN0YWxsZWQKKyAgICAgQml0cyAxMS0xNTogUmVzZXJ2ZWQKKyAgICAgQml0IDE2OiAgICAgSGFyZHdhcmUgc3dpdGNoIGlzIG9uCisgICAgIEJpdCAxNzogICAgIFdpZmkgaXMgYmxvY2tlZAorICAgICBCaXQgMTg6ICAgICBCbHVldG9vdGggaXMgYmxvY2tlZAorICAgICBCaXQgMTk6ICAgICBXV0FOIGlzIGJsb2NrZWQKKyAgICAgQml0cyAyMC0zMTogUmVzZXJ2ZWQKKyAgIHJlc3VsdFsyXTogTlZSQU0gc2l6ZSBpbiBieXRlcworICAgcmVzdWx0WzNdOiBOVlJBTSBmb3JtYXQgdmVyc2lvbiBudW1iZXIKKyovCisKK3N0YXRpYyBpbnQgZGVsbF9yZmtpbGxfc2V0KGludCByYWRpbywgZW51bSByZmtpbGxfc3RhdGUgc3RhdGUpCit7CisJc3RydWN0IGNhbGxpbmdfaW50ZXJmYWNlX2J1ZmZlciBidWZmZXI7CisJaW50IGRpc2FibGUgPSAoc3RhdGUgPT0gUkZLSUxMX1NUQVRFX1VOQkxPQ0tFRCkgPyAwIDogMTsKKworCW1lbXNldCgmYnVmZmVyLCAwLCBzaXplb2Yoc3RydWN0IGNhbGxpbmdfaW50ZXJmYWNlX2J1ZmZlcikpOworCWJ1ZmZlci5pbnB1dFswXSA9ICgxIHwgKHJhZGlvPDw4KSB8IChkaXNhYmxlIDw8IDE2KSk7CisJZGVsbF9zZW5kX3JlcXVlc3QoJmJ1ZmZlciwgMTcsIDExKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlbGxfd2lmaV9zZXQodm9pZCAqZGF0YSwgZW51bSByZmtpbGxfc3RhdGUgc3RhdGUpCit7CisJcmV0dXJuIGRlbGxfcmZraWxsX3NldCgxLCBzdGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgZGVsbF9ibHVldG9vdGhfc2V0KHZvaWQgKmRhdGEsIGVudW0gcmZraWxsX3N0YXRlIHN0YXRlKQoreworCXJldHVybiBkZWxsX3Jma2lsbF9zZXQoMiwgc3RhdGUpOworfQorCitzdGF0aWMgaW50IGRlbGxfd3dhbl9zZXQodm9pZCAqZGF0YSwgZW51bSByZmtpbGxfc3RhdGUgc3RhdGUpCit7CisJcmV0dXJuIGRlbGxfcmZraWxsX3NldCgzLCBzdGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgZGVsbF9yZmtpbGxfZ2V0KGludCBiaXQsIGVudW0gcmZraWxsX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgY2FsbGluZ19pbnRlcmZhY2VfYnVmZmVyIGJ1ZmZlcjsKKwlpbnQgc3RhdHVzOworCWludCBuZXdfc3RhdGUgPSBSRktJTExfU1RBVEVfSEFSRF9CTE9DS0VEOworCisJbWVtc2V0KCZidWZmZXIsIDAsIHNpemVvZihzdHJ1Y3QgY2FsbGluZ19pbnRlcmZhY2VfYnVmZmVyKSk7CisJZGVsbF9zZW5kX3JlcXVlc3QoJmJ1ZmZlciwgMTcsIDExKTsKKwlzdGF0dXMgPSBidWZmZXIub3V0cHV0WzFdOworCisJaWYgKHN0YXR1cyAmICgxPDwxNikpCisJCW5ld19zdGF0ZSA9IFJGS0lMTF9TVEFURV9TT0ZUX0JMT0NLRUQ7CisKKwlpZiAoc3RhdHVzICYgKDE8PGJpdCkpCisJCSpzdGF0ZSA9IG5ld19zdGF0ZTsKKwllbHNlCisJCSpzdGF0ZSA9IFJGS0lMTF9TVEFURV9VTkJMT0NLRUQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWxsX3dpZmlfZ2V0KHZvaWQgKmRhdGEsIGVudW0gcmZraWxsX3N0YXRlICpzdGF0ZSkKK3sKKwlyZXR1cm4gZGVsbF9yZmtpbGxfZ2V0KDE3LCBzdGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgZGVsbF9ibHVldG9vdGhfZ2V0KHZvaWQgKmRhdGEsIGVudW0gcmZraWxsX3N0YXRlICpzdGF0ZSkKK3sKKwlyZXR1cm4gZGVsbF9yZmtpbGxfZ2V0KDE4LCBzdGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgZGVsbF93d2FuX2dldCh2b2lkICpkYXRhLCBlbnVtIHJma2lsbF9zdGF0ZSAqc3RhdGUpCit7CisJcmV0dXJuIGRlbGxfcmZraWxsX2dldCgxOSwgc3RhdGUpOworfQorCitzdGF0aWMgaW50IGRlbGxfc2V0dXBfcmZraWxsKHZvaWQpCit7CisJc3RydWN0IGNhbGxpbmdfaW50ZXJmYWNlX2J1ZmZlciBidWZmZXI7CisJaW50IHN0YXR1czsKKwlpbnQgcmV0OworCisJbWVtc2V0KCZidWZmZXIsIDAsIHNpemVvZihzdHJ1Y3QgY2FsbGluZ19pbnRlcmZhY2VfYnVmZmVyKSk7CisJZGVsbF9zZW5kX3JlcXVlc3QoJmJ1ZmZlciwgMTcsIDExKTsKKwlzdGF0dXMgPSBidWZmZXIub3V0cHV0WzFdOworCisJaWYgKChzdGF0dXMgJiAoMTw8MnwxPDw4KSkgPT0gKDE8PDJ8MTw8OCkpIHsKKwkJd2lmaV9yZmtpbGwgPSByZmtpbGxfYWxsb2NhdGUoTlVMTCwgUkZLSUxMX1RZUEVfV0xBTik7CisJCWlmICghd2lmaV9yZmtpbGwpCisJCQlnb3RvIGVycl93aWZpOworCQl3aWZpX3Jma2lsbC0+bmFtZSA9ICJkZWxsLXdpZmkiOworCQl3aWZpX3Jma2lsbC0+dG9nZ2xlX3JhZGlvID0gZGVsbF93aWZpX3NldDsKKwkJd2lmaV9yZmtpbGwtPmdldF9zdGF0ZSA9IGRlbGxfd2lmaV9nZXQ7CisJCXJldCA9IHJma2lsbF9yZWdpc3Rlcih3aWZpX3Jma2lsbCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl93aWZpOworCX0KKworCWlmICgoc3RhdHVzICYgKDE8PDN8MTw8OSkpID09ICgxPDwzfDE8PDkpKSB7CisJCWJsdWV0b290aF9yZmtpbGwgPSByZmtpbGxfYWxsb2NhdGUoTlVMTCwgUkZLSUxMX1RZUEVfQkxVRVRPT1RIKTsKKwkJaWYgKCFibHVldG9vdGhfcmZraWxsKQorCQkJZ290byBlcnJfYmx1ZXRvb3RoOworCQlibHVldG9vdGhfcmZraWxsLT5uYW1lID0gImRlbGwtYmx1ZXRvb3RoIjsKKwkJYmx1ZXRvb3RoX3Jma2lsbC0+dG9nZ2xlX3JhZGlvID0gZGVsbF9ibHVldG9vdGhfc2V0OworCQlibHVldG9vdGhfcmZraWxsLT5nZXRfc3RhdGUgPSBkZWxsX2JsdWV0b290aF9nZXQ7CisJCXJldCA9IHJma2lsbF9yZWdpc3RlcihibHVldG9vdGhfcmZraWxsKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX2JsdWV0b290aDsKKwl9CisKKwlpZiAoKHN0YXR1cyAmICgxPDw0fDE8PDEwKSkgPT0gKDE8PDR8MTw8MTApKSB7CisJCXd3YW5fcmZraWxsID0gcmZraWxsX2FsbG9jYXRlKE5VTEwsIFJGS0lMTF9UWVBFX1dXQU4pOworCQlpZiAoIXd3YW5fcmZraWxsKQorCQkJZ290byBlcnJfd3dhbjsKKwkJd3dhbl9yZmtpbGwtPm5hbWUgPSAiZGVsbC13d2FuIjsKKwkJd3dhbl9yZmtpbGwtPnRvZ2dsZV9yYWRpbyA9IGRlbGxfd3dhbl9zZXQ7CisJCXd3YW5fcmZraWxsLT5nZXRfc3RhdGUgPSBkZWxsX3d3YW5fZ2V0OworCQlyZXQgPSByZmtpbGxfcmVnaXN0ZXIod3dhbl9yZmtpbGwpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfd3dhbjsKKwl9CisKKwlyZXR1cm4gMDsKK2Vycl93d2FuOgorCWlmICh3d2FuX3Jma2lsbCkKKwkJcmZraWxsX2ZyZWUod3dhbl9yZmtpbGwpOworCWlmIChibHVldG9vdGhfcmZraWxsKSB7CisJCXJma2lsbF91bnJlZ2lzdGVyKGJsdWV0b290aF9yZmtpbGwpOworCQlibHVldG9vdGhfcmZraWxsID0gTlVMTDsKKwl9CitlcnJfYmx1ZXRvb3RoOgorCWlmIChibHVldG9vdGhfcmZraWxsKQorCQlyZmtpbGxfZnJlZShibHVldG9vdGhfcmZraWxsKTsKKwlpZiAod2lmaV9yZmtpbGwpIHsKKwkJcmZraWxsX3VucmVnaXN0ZXIod2lmaV9yZmtpbGwpOworCQl3aWZpX3Jma2lsbCA9IE5VTEw7CisJfQorZXJyX3dpZmk6CisJaWYgKHdpZmlfcmZraWxsKQorCQlyZmtpbGxfZnJlZSh3aWZpX3Jma2lsbCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRlbGxfc2VuZF9pbnRlbnNpdHkoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQoreworCXN0cnVjdCBjYWxsaW5nX2ludGVyZmFjZV9idWZmZXIgYnVmZmVyOworCisJbWVtc2V0KCZidWZmZXIsIDAsIHNpemVvZihzdHJ1Y3QgY2FsbGluZ19pbnRlcmZhY2VfYnVmZmVyKSk7CisJYnVmZmVyLmlucHV0WzBdID0gZmluZF90b2tlbl9sb2NhdGlvbihCUklHSFRORVNTX1RPS0VOKTsKKwlidWZmZXIuaW5wdXRbMV0gPSBiZC0+cHJvcHMuYnJpZ2h0bmVzczsKKworCWlmIChidWZmZXIuaW5wdXRbMF0gPT0gLTEpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKHBvd2VyX3N1cHBseV9pc19zeXN0ZW1fc3VwcGxpZWQoKSA+IDApCisJCWRlbGxfc2VuZF9yZXF1ZXN0KCZidWZmZXIsIDEsIDIpOworCWVsc2UKKwkJZGVsbF9zZW5kX3JlcXVlc3QoJmJ1ZmZlciwgMSwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWxsX2dldF9pbnRlbnNpdHkoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQoreworCXN0cnVjdCBjYWxsaW5nX2ludGVyZmFjZV9idWZmZXIgYnVmZmVyOworCisJbWVtc2V0KCZidWZmZXIsIDAsIHNpemVvZihzdHJ1Y3QgY2FsbGluZ19pbnRlcmZhY2VfYnVmZmVyKSk7CisJYnVmZmVyLmlucHV0WzBdID0gZmluZF90b2tlbl9sb2NhdGlvbihCUklHSFRORVNTX1RPS0VOKTsKKworCWlmIChidWZmZXIuaW5wdXRbMF0gPT0gLTEpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKHBvd2VyX3N1cHBseV9pc19zeXN0ZW1fc3VwcGxpZWQoKSA+IDApCisJCWRlbGxfc2VuZF9yZXF1ZXN0KCZidWZmZXIsIDAsIDIpOworCWVsc2UKKwkJZGVsbF9zZW5kX3JlcXVlc3QoJmJ1ZmZlciwgMCwgMSk7CisKKwlyZXR1cm4gYnVmZmVyLm91dHB1dFsxXTsKK30KKworc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfb3BzIGRlbGxfb3BzID0geworCS5nZXRfYnJpZ2h0bmVzcyA9IGRlbGxfZ2V0X2ludGVuc2l0eSwKKwkudXBkYXRlX3N0YXR1cyAgPSBkZWxsX3NlbmRfaW50ZW5zaXR5LAorfTsKKworc3RhdGljIGludCBfX2luaXQgZGVsbF9pbml0KHZvaWQpCit7CisJc3RydWN0IGNhbGxpbmdfaW50ZXJmYWNlX2J1ZmZlciBidWZmZXI7CisJaW50IG1heF9pbnRlbnNpdHkgPSAwOworCWludCByZXQ7CisKKwlpZiAoIWRtaV9jaGVja19zeXN0ZW0oZGVsbF9kZXZpY2VfdGFibGUpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRtaV93YWxrKGZpbmRfdG9rZW5zKTsKKworCWlmICghZGFfdG9rZW5zKSAgeworCQlwcmludGsoS0VSTl9JTkZPICJkZWxsLWxhcHRvcDogVW5hYmxlIHRvIGZpbmQgZG1pIHRva2Vuc1xuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldCA9IGRlbGxfc2V0dXBfcmZraWxsKCk7CisKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImRlbGwtbGFwdG9wOiBVbmFibGUgdG8gc2V0dXAgcmZraWxsXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisjaWZkZWYgQ09ORklHX0FDUEkKKwkvKiBJbiB0aGUgZXZlbnQgb2YgYW4gQUNQSSBiYWNrbGlnaHQgYmVpbmcgYXZhaWxhYmxlLCBkb24ndAorCSAqIHJlZ2lzdGVyIHRoZSBwbGF0Zm9ybSBjb250cm9sbGVyLgorCSAqLworCWlmIChhY3BpX3ZpZGVvX2JhY2tsaWdodF9zdXBwb3J0KCkpCisJCXJldHVybiAwOworI2VuZGlmCisKKwltZW1zZXQoJmJ1ZmZlciwgMCwgc2l6ZW9mKHN0cnVjdCBjYWxsaW5nX2ludGVyZmFjZV9idWZmZXIpKTsKKwlidWZmZXIuaW5wdXRbMF0gPSBmaW5kX3Rva2VuX2xvY2F0aW9uKEJSSUdIVE5FU1NfVE9LRU4pOworCisJaWYgKGJ1ZmZlci5pbnB1dFswXSAhPSAtMSkgeworCQlkZWxsX3NlbmRfcmVxdWVzdCgmYnVmZmVyLCAwLCAyKTsKKwkJbWF4X2ludGVuc2l0eSA9IGJ1ZmZlci5vdXRwdXRbM107CisJfQorCisJaWYgKG1heF9pbnRlbnNpdHkpIHsKKwkJZGVsbF9iYWNrbGlnaHRfZGV2aWNlID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlcigKKwkJCSJkZWxsX2JhY2tsaWdodCIsCisJCQlOVUxMLCBOVUxMLAorCQkJJmRlbGxfb3BzKTsKKworCQlpZiAoSVNfRVJSKGRlbGxfYmFja2xpZ2h0X2RldmljZSkpIHsKKwkJCXJldCA9IFBUUl9FUlIoZGVsbF9iYWNrbGlnaHRfZGV2aWNlKTsKKwkJCWRlbGxfYmFja2xpZ2h0X2RldmljZSA9IE5VTEw7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWRlbGxfYmFja2xpZ2h0X2RldmljZS0+cHJvcHMubWF4X2JyaWdodG5lc3MgPSBtYXhfaW50ZW5zaXR5OworCQlkZWxsX2JhY2tsaWdodF9kZXZpY2UtPnByb3BzLmJyaWdodG5lc3MgPQorCQkJZGVsbF9nZXRfaW50ZW5zaXR5KGRlbGxfYmFja2xpZ2h0X2RldmljZSk7CisJCWJhY2tsaWdodF91cGRhdGVfc3RhdHVzKGRlbGxfYmFja2xpZ2h0X2RldmljZSk7CisJfQorCisJcmV0dXJuIDA7CitvdXQ6CisJaWYgKHdpZmlfcmZraWxsKQorCQlyZmtpbGxfdW5yZWdpc3Rlcih3aWZpX3Jma2lsbCk7CisJaWYgKGJsdWV0b290aF9yZmtpbGwpCisJCXJma2lsbF91bnJlZ2lzdGVyKGJsdWV0b290aF9yZmtpbGwpOworCWlmICh3d2FuX3Jma2lsbCkKKwkJcmZraWxsX3VucmVnaXN0ZXIod3dhbl9yZmtpbGwpOworCWtmcmVlKGRhX3Rva2Vucyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRlbGxfZXhpdCh2b2lkKQoreworCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihkZWxsX2JhY2tsaWdodF9kZXZpY2UpOworCWlmICh3aWZpX3Jma2lsbCkKKwkJcmZraWxsX3VucmVnaXN0ZXIod2lmaV9yZmtpbGwpOworCWlmIChibHVldG9vdGhfcmZraWxsKQorCQlyZmtpbGxfdW5yZWdpc3RlcihibHVldG9vdGhfcmZraWxsKTsKKwlpZiAod3dhbl9yZmtpbGwpCisJCXJma2lsbF91bnJlZ2lzdGVyKHd3YW5fcmZraWxsKTsKK30KKworbW9kdWxlX2luaXQoZGVsbF9pbml0KTsKK21vZHVsZV9leGl0KGRlbGxfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk1hdHRoZXcgR2FycmV0dCA8bWpnQHJlZGhhdC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRlbGwgbGFwdG9wIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJkbWk6KnN2bkRlbGxJbmMuOio6Y3Q4OioiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9lbmNsb3N1cmUuYyBiL2RyaXZlcnMvbWlzYy9lbmNsb3N1cmUuYwppbmRleCAwNzM2Y2ZmLi4zY2Y2MWVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvZW5jbG9zdXJlLmMKKysrIGIvZHJpdmVycy9taXNjL2VuY2xvc3VyZS5jCkBAIC0xMTksNyArMTE5LDcgQEAKIAllZGV2LT5lZGV2LmNsYXNzID0gJmVuY2xvc3VyZV9jbGFzczsKIAllZGV2LT5lZGV2LnBhcmVudCA9IGdldF9kZXZpY2UoZGV2KTsKIAllZGV2LT5jYiA9IGNiOwotCXNucHJpbnRmKGVkZXYtPmVkZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgIiVzIiwgbmFtZSk7CisJZGV2X3NldF9uYW1lKCZlZGV2LT5lZGV2LCBuYW1lKTsKIAllcnIgPSBkZXZpY2VfcmVnaXN0ZXIoJmVkZXYtPmVkZXYpOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyOwpAQCAtMTcwLDcgKzE3MCw3IEBACiBzdGF0aWMgdm9pZCBlbmNsb3N1cmVfbGlua19uYW1lKHN0cnVjdCBlbmNsb3N1cmVfY29tcG9uZW50ICpjZGV2LCBjaGFyICpuYW1lKQogewogCXN0cmNweShuYW1lLCAiZW5jbG9zdXJlX2RldmljZToiKTsKLQlzdHJjYXQobmFtZSwgY2Rldi0+Y2Rldi5idXNfaWQpOworCXN0cmNhdChuYW1lLCBkZXZfbmFtZSgmY2Rldi0+Y2RldikpOwogfQogCiBzdGF0aWMgdm9pZCBlbmNsb3N1cmVfcmVtb3ZlX2xpbmtzKHN0cnVjdCBlbmNsb3N1cmVfY29tcG9uZW50ICpjZGV2KQpAQCAtMjU2LDkgKzI1Niw5IEBACiAJY2RldiA9ICZlY29tcC0+Y2RldjsKIAljZGV2LT5wYXJlbnQgPSBnZXRfZGV2aWNlKCZlZGV2LT5lZGV2KTsKIAlpZiAobmFtZSkKLQkJc25wcmludGYoY2Rldi0+YnVzX2lkLCBCVVNfSURfU0laRSwgIiVzIiwgbmFtZSk7CisJCWRldl9zZXRfbmFtZShjZGV2LCBuYW1lKTsKIAllbHNlCi0JCXNucHJpbnRmKGNkZXYtPmJ1c19pZCwgQlVTX0lEX1NJWkUsICIldSIsIG51bWJlcik7CisJCWRldl9zZXRfbmFtZShjZGV2LCAiJXUiLCBudW1iZXIpOwogCiAJY2Rldi0+cmVsZWFzZSA9IGVuY2xvc3VyZV9jb21wb25lbnRfcmVsZWFzZTsKIAljZGV2LT5ncm91cHMgPSBlbmNsb3N1cmVfZ3JvdXBzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2libWFzbS9ldmVudC5jIGIvZHJpdmVycy9taXNjL2libWFzbS9ldmVudC5jCmluZGV4IGZkYTZhNGQuLjY4YTBhNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9pYm1hc20vZXZlbnQuYworKysgYi9kcml2ZXJzL21pc2MvaWJtYXNtL2V2ZW50LmMKQEAgLTUwLDcgKzUwLDcgQEAKICAqIFN0b3JlIHRoZSBldmVudCBpbiB0aGUgY2lyY3VsYXIgZXZlbnQgYnVmZmVyLCB3YWtlIHVwIGFueSBzbGVlcGluZwogICogZXZlbnQgcmVhZGVycy4KICAqIFRoZXJlIGlzIG5vIHJlYWRlciBtYXJrZXIgaW4gdGhlIGJ1ZmZlciwgdGhlcmVmb3JlIHJlYWRlcnMgYXJlCi0gKiByZXNwb25zaWJsZSBmb3Iga2VlcGluZyB1cCB3aXRoIHRoZSB3cml0ZXIsIG9yIHRoZXkgd2lsbCBsb29zZSBldmVudHMuCisgKiByZXNwb25zaWJsZSBmb3Iga2VlcGluZyB1cCB3aXRoIHRoZSB3cml0ZXIsIG9yIHRoZXkgd2lsbCBsb3NlIGV2ZW50cy4KICAqLwogdm9pZCBpYm1hc21fcmVjZWl2ZV9ldmVudChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgZGF0YV9zaXplKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2libWFzbS9pYm1hc21mcy5jIGIvZHJpdmVycy9taXNjL2libWFzbS9pYm1hc21mcy5jCmluZGV4IDIyYTdlOGIuLmRlOTY2YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9pYm1hc20vaWJtYXNtZnMuYworKysgYi9kcml2ZXJzL21pc2MvaWJtYXNtL2libWFzbWZzLmMKQEAgLTE0Niw4ICsxNDYsNiBAQAogCiAJaWYgKHJldCkgewogCQlyZXQtPmlfbW9kZSA9IG1vZGU7Ci0JCXJldC0+aV91aWQgPSByZXQtPmlfZ2lkID0gMDsKLQkJcmV0LT5pX2Jsb2NrcyA9IDA7CiAJCXJldC0+aV9hdGltZSA9IHJldC0+aV9tdGltZSA9IHJldC0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKIAl9CiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9pYm1hc20vbW9kdWxlLmMgYi9kcml2ZXJzL21pc2MvaWJtYXNtL21vZHVsZS5jCmluZGV4IGI1ZjZhZGQuLmRjMTRiMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9pYm1hc20vbW9kdWxlLmMKKysrIGIvZHJpdmVycy9taXNjL2libWFzbS9tb2R1bGUuYwpAQCAtMTA0LDggKzEwNCw3IEBACiAJfQogCiAJc3AtPmlycSA9IHBkZXYtPmlycTsKLQlzcC0+YmFzZV9hZGRyZXNzID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCksCi0JCQkJCXBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkpOworCXNwLT5iYXNlX2FkZHJlc3MgPSBwY2lfaW9yZW1hcF9iYXIocGRldiwgMCk7CiAJaWYgKCFzcC0+YmFzZV9hZGRyZXNzKSB7CiAJCWRldl9lcnIoc3AtPmRldiwgIkZhaWxlZCB0byBpb3JlbWFwIHBjaSBtZW1vcnlcbiIpOwogCQlyZXN1bHQgPSAgLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9pb2M0LmMgYi9kcml2ZXJzL21pc2MvaW9jNC5jCmluZGV4IDZmNzY1NzMuLjYwYjBiMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9pb2M0LmMKKysrIGIvZHJpdmVycy9taXNjL2lvYzQuYwpAQCAtMjY5LDYgKzI2OSwxNiBAQAogCXJldHVybiBJT0M0X1ZBUklBTlRfUENJX1JUOwogfQogCitzdGF0aWMgdm9pZAoraW9jNF9sb2FkX21vZHVsZXMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCS8qIGFyZyBqdXN0IGhhcyB0byBiZSBmcmVlZCAqLworCisJcmVxdWVzdF9tb2R1bGUoInNnaWlvYzQiKTsKKworCWtmcmVlKHdvcmspOworfQorCiAvKiBBZGRzIGEgbmV3IGluc3RhbmNlIG9mIGFuIElPQzQgY2FyZCAqLwogc3RhdGljIGludAogaW9jNF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKQEAgLTM3OCw2ICszODgsMzAgQEAKIAl9CiAJbXV0ZXhfdW5sb2NrKCZpb2M0X211dGV4KTsKIAorCS8qIFJlcXVlc3Qgc2dpaW9jNCBJREUgZHJpdmVyIG9uIGJvYXJkcyB0aGF0IGJyaW5nIHRoYXQgZnVuY3Rpb25hbGl0eQorCSAqIG9mZiBvZiBJT0M0LiAgVGhlIHJvb3QgZmlsZXN5c3RlbSBtYXkgYmUgaG9zdGVkIG9uIGEgZHJpdmUgY29ubmVjdGVkCisJICogdG8gSU9DNCwgc28gd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIHNnaWlvYzQgZHJpdmVyIGlzIGxvYWRlZCBhcyBpdAorCSAqIHdvbid0IGJlIHBpY2tlZCB1cCBieSBtb2Rwcm9iZXMgZHVlIHRvIHRoZSBpb2M0IG1vZHVsZSBvd25pbmcgdGhlCisJICogUENJIGRldmljZS4KKwkgKi8KKwlpZiAoaWRkLT5pZGRfdmFyaWFudCAhPSBJT0M0X1ZBUklBTlRfUENJX1JUKSB7CisJCXN0cnVjdCB3b3JrX3N0cnVjdCAqd29yazsKKwkJd29yayA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB3b3JrX3N0cnVjdCksIEdGUF9LRVJORUwpOworCQlpZiAoIXdvcmspIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiJXM6IElPQzQgdW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgIgorCQkJICAgICAgICJsb2FkIG9mIHN1Yi1tb2R1bGVzLlxuIiwgX19mdW5jX18pOworCQl9IGVsc2UgeworCQkJLyogUmVxdWVzdCB0aGUgbW9kdWxlIGZyb20gYSB3b3JrIHByb2NlZHVyZSBhcyB0aGUKKwkJCSAqIG1vZHByb2JlIGdvZXMgb3V0IHRvIGEgdXNlcmxhbmQgaGVscGVyIGFuZCB0aGF0CisJCQkgKiB3aWxsIGhhbmcgaWYgZG9uZSBkaXJlY3RseSBmcm9tIGlvYzRfcHJvYmUoKS4KKwkJCSAqLworCQkJcHJpbnRrKEtFUk5fSU5GTyAiSU9DNCBsb2FkaW5nIHNnaWlvYzQgc3VibW9kdWxlXG4iKTsKKwkJCUlOSVRfV09SSyh3b3JrLCBpb2M0X2xvYWRfbW9kdWxlcyk7CisJCQlzY2hlZHVsZV93b3JrKHdvcmspOworCQl9CisJfQorCiAJcmV0dXJuIDA7CiAKIG91dF9taXNjX3JlZ2lvbjoKQEAgLTQ2Miw2ICs0OTYsOCBAQAogc3RhdGljIHZvaWQgX19kZXZleGl0CiBpb2M0X2V4aXQodm9pZCkKIHsKKwkvKiBFbnN1cmUgaW9jNF9sb2FkX21vZHVsZXMoKSBoYXMgY29tcGxldGVkIGJlZm9yZSBleGl0aW5nICovCisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmlvYzRfZHJpdmVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3BoYW50b20uYyBiL2RyaXZlcnMvbWlzYy9waGFudG9tLmMKaW5kZXggYWJkZWJlMy4uZmE1N2I2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL3BoYW50b20uYworKysgYi9kcml2ZXJzL21pc2MvcGhhbnRvbS5jCkBAIC02LDcgKzYsNyBAQAogICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqCi0gKiAgWW91IG5lZWQgYW4gdXNlcnNwYWNlIGxpYnJhcnkgdG8gY29vcGVyYXRlIHdpdGggdGhpcyBkcml2ZXIuIEl0IChhbmQgb3RoZXIKKyAqICBZb3UgbmVlZCBhIHVzZXJzcGFjZSBsaWJyYXJ5IHRvIGNvb3BlcmF0ZSB3aXRoIHRoaXMgZHJpdmVyLiBJdCAoYW5kIG90aGVyCiAgKiAgaW5mbykgbWF5IGJlIG9idGFpbmVkIGhlcmU6CiAgKiAgaHR0cDovL3d3dy5maS5tdW5pLmN6L354c2xhYnkvcGhhbnRvbS5odG1sCiAgKiAgb3IgYWx0ZXJuYXRpdmVseSwgeW91IG1pZ2h0IHVzZSBPcGVuSGFwdGljcyBwcm92aWRlZCBieSBTZW5zYWJsZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9zZ2ktZ3J1L2dydW1haW4uYyBiL2RyaXZlcnMvbWlzYy9zZ2ktZ3J1L2dydW1haW4uYwppbmRleCBlMTFlMWFjLi4zZDJmYzIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2Mvc2dpLWdydS9ncnVtYWluLmMKKysrIGIvZHJpdmVycy9taXNjL3NnaS1ncnUvZ3J1bWFpbi5jCkBAIC0yOSw3ICsyOSw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGRldmljZSBncnVfZGV2aWNlID0gewotCS5idXNfaWQgPSB7MH0sCisJLmluaXRfbmFtZSA9ICIiLAogCS5kcml2ZXIgPSAmZ3J1X2RyaXZlciwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9zZ2kteHAveHBfbWFpbi5jIGIvZHJpdmVycy9taXNjL3NnaS14cC94cF9tYWluLmMKaW5kZXggOWEyZTc3MS4uMTZmOGRjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL3NnaS14cC94cF9tYWluLmMKKysrIGIvZHJpdmVycy9taXNjL3NnaS14cC94cF9tYWluLmMKQEAgLTI1LDcgKzI1LDcgQEAKIH07CiAKIHN0cnVjdCBkZXZpY2UgeHBfZGJnX3N1Ym5hbWUgPSB7Ci0JLmJ1c19pZCA9IHswfSwJCS8qIHNldCB0byAiIiAqLworCS5pbml0X25hbWUgPSAiIiwJCS8qIHNldCB0byAiIiAqLwogCS5kcml2ZXIgPSAmeHBfZGJnX25hbWUKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9zZ2kteHAveHBjX21haW4uYyBiL2RyaXZlcnMvbWlzYy9zZ2kteHAveHBjX21haW4uYwppbmRleCBlOGQ1Y2ZiLi44OTIxOGY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2Mvc2dpLXhwL3hwY19tYWluLmMKKysrIGIvZHJpdmVycy9taXNjL3NnaS14cC94cGNfbWFpbi5jCkBAIC01OSwxMiArNTksMTIgQEAKIH07CiAKIHN0cnVjdCBkZXZpY2UgeHBjX3BhcnRfZGJnX3N1Ym5hbWUgPSB7Ci0JLmJ1c19pZCA9IHswfSwJCS8qIHNldCB0byAicGFydCIgYXQgeHBjX2luaXQoKSB0aW1lICovCisJLmluaXRfbmFtZSA9ICIiLAkvKiBzZXQgdG8gInBhcnQiIGF0IHhwY19pbml0KCkgdGltZSAqLwogCS5kcml2ZXIgPSAmeHBjX2RiZ19uYW1lCiB9OwogCiBzdHJ1Y3QgZGV2aWNlIHhwY19jaGFuX2RiZ19zdWJuYW1lID0gewotCS5idXNfaWQgPSB7MH0sCQkvKiBzZXQgdG8gImNoYW4iIGF0IHhwY19pbml0KCkgdGltZSAqLworCS5pbml0X25hbWUgPSAiIiwJLyogc2V0IHRvICJjaGFuIiBhdCB4cGNfaW5pdCgpIHRpbWUgKi8KIAkuZHJpdmVyID0gJnhwY19kYmdfbmFtZQogfTsKIApAQCAtMTI1OCw4ICsxMjU4LDggQEAKIAlpbnQgcmV0OwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqa3RocmVhZDsKIAotCXNucHJpbnRmKHhwY19wYXJ0LT5idXNfaWQsIEJVU19JRF9TSVpFLCAicGFydCIpOwotCXNucHJpbnRmKHhwY19jaGFuLT5idXNfaWQsIEJVU19JRF9TSVpFLCAiY2hhbiIpOworCWRldl9zZXRfbmFtZSh4cGNfcGFydCwgInBhcnQiKTsKKwlkZXZfc2V0X25hbWUoeHBjX2NoYW4sICJjaGFuIik7CiAKIAlpZiAoaXNfc2h1YigpKSB7CiAJCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2Mvc2dpLXhwL3hwbmV0LmMgYi9kcml2ZXJzL21pc2Mvc2dpLXhwL3hwbmV0LmMKaW5kZXggOGU2YWE5NS4uNzk1N2Y1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL3NnaS14cC94cG5ldC5jCisrKyBiL2RyaXZlcnMvbWlzYy9zZ2kteHAveHBuZXQuYwpAQCAtOTUsMTEgKzk1LDYgQEAKIAlhdG9taWNfdCB1c2VfY291bnQ7CiB9OwogCi0vKiBkcml2ZXIgc3BlY2lmaWMgc3RydWN0dXJlIHBvaW50ZWQgdG8gYnkgdGhlIGRldmljZSBzdHJ1Y3R1cmUgKi8KLXN0cnVjdCB4cG5ldF9kZXZfcHJpdmF0ZSB7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7Ci19OwotCiBzdHJ1Y3QgbmV0X2RldmljZSAqeHBuZXRfZGV2aWNlOwogCiAvKgpAQCAtMTM4LDcgKzEzMyw3IEBACiB9OwogCiBzdHJ1Y3QgZGV2aWNlIHhwbmV0X2RiZ19zdWJuYW1lID0gewotCS5idXNfaWQgPSB7MH0sCQkvKiBzZXQgdG8gIiIgKi8KKwkuaW5pdF9uYW1lID0gIiIsCS8qIHNldCB0byAiIiAqLwogCS5kcml2ZXIgPSAmeHBuZXRfZGJnX25hbWUKIH07CiAKQEAgLTE1Myw3ICsxNDgsNiBAQAogCXN0cnVjdCBza19idWZmICpza2I7CiAJdm9pZCAqZHN0OwogCWVudW0geHBfcmV0dmFsIHJldDsKLQlzdHJ1Y3QgeHBuZXRfZGV2X3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdih4cG5ldF9kZXZpY2UpOwogCiAJaWYgKCFYUE5FVF9WQUxJRF9NU0cobXNnKSkgewogCQkvKgpAQCAtMTYxLDcgKzE1NSw3IEBACiAJCSAqLwogCQl4cGNfcmVjZWl2ZWQocGFydGlkLCBjaGFubmVsLCAodm9pZCAqKW1zZyk7CiAKLQkJcHJpdi0+c3RhdHMucnhfZXJyb3JzKys7CisJCXhwbmV0X2RldmljZS0+c3RhdHMucnhfZXJyb3JzKys7CiAKIAkJcmV0dXJuOwogCX0KQEAgLTE3Niw3ICsxNzAsNyBAQAogCiAJCXhwY19yZWNlaXZlZChwYXJ0aWQsIGNoYW5uZWwsICh2b2lkICopbXNnKTsKIAotCQlwcml2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJeHBuZXRfZGV2aWNlLT5zdGF0cy5yeF9lcnJvcnMrKzsKIAogCQlyZXR1cm47CiAJfQpAQCAtMjI2LDcgKzIyMCw3IEBACiAKIAkJCXhwY19yZWNlaXZlZChwYXJ0aWQsIGNoYW5uZWwsICh2b2lkICopbXNnKTsKIAotCQkJcHJpdi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQl4cG5ldF9kZXZpY2UtPnN0YXRzLnJ4X2Vycm9ycysrOwogCiAJCQlyZXR1cm47CiAJCX0KQEAgLTI0Nyw4ICsyNDEsOCBAQAogCQlza2JfZW5kX3BvaW50ZXIoc2tiKSwgc2tiLT5sZW4pOwogCiAJeHBuZXRfZGV2aWNlLT5sYXN0X3J4ID0gamlmZmllczsKLQlwcml2LT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0JcHJpdi0+c3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW4gKyBFVEhfSExFTjsKKwl4cG5ldF9kZXZpY2UtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwl4cG5ldF9kZXZpY2UtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuICsgRVRIX0hMRU47CiAKIAluZXRpZl9yeF9uaShza2IpOwogCXhwY19yZWNlaXZlZChwYXJ0aWQsIGNoYW5uZWwsICh2b2lkICopbXNnKTsKQEAgLTM1MywyNiArMzQ3LDYgQEAKIH0KIAogLyoKLSAqIFJlcXVpcmVkIGZvciB0aGUgbmV0X2RldmljZSBzdHJ1Y3R1cmUuCi0gKi8KLXN0YXRpYyBpbnQKLXhwbmV0X2Rldl9zZXRfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZm1hcCAqbmV3X21hcCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFJldHVybiBzdGF0aXN0aWNzIHRvIHRoZSBjYWxsZXIuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqCi14cG5ldF9kZXZfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHhwbmV0X2Rldl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCXJldHVybiAmcHJpdi0+c3RhdHM7Ci19Ci0KLS8qCiAgKiBOb3RpZmljYXRpb24gdGhhdCB0aGUgb3RoZXIgZW5kIGhhcyByZWNlaXZlZCB0aGUgbWVzc2FnZSBhbmQKICAqIERNQSdkIHRoZSBza2IgaW5mb3JtYXRpb24uICBBdCB0aGlzIHBvaW50LCB0aGV5IGFyZSBkb25lIHdpdGgKICAqIG91ciBzaWRlLiAgV2hlbiBhbGwgcmVjaXBpZW50cyBhcmUgZG9uZSBwcm9jZXNzaW5nLCB3ZQpAQCAtNDUzLDcgKzQyNyw2IEBACiAJc3RydWN0IHhwbmV0X3BlbmRpbmdfbXNnICpxdWV1ZWRfbXNnOwogCXU2NCBzdGFydF9hZGRyLCBlbmRfYWRkcjsKIAlzaG9ydCBkZXN0X3BhcnRpZDsKLQlzdHJ1Y3QgeHBuZXRfZGV2X3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXUxNiBlbWJlZGRlZF9ieXRlcyA9IDA7CiAKIAlkZXZfZGJnKHhwbmV0LCAiPnNrYi0+aGVhZD0weCVwIHNrYi0+ZGF0YT0weCVwIHNrYi0+dGFpbD0weCVwICIKQEAgLTQ3Niw3ICs0NDksNyBAQAogCQlkZXZfd2Fybih4cG5ldCwgImZhaWxlZCB0byBrbWFsbG9jICVsZCBieXRlczsgZHJvcHBpbmcgIgogCQkJICJwYWNrZXRcbiIsIHNpemVvZihzdHJ1Y3QgeHBuZXRfcGVuZGluZ19tc2cpKTsKIAotCQlwcml2LT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC01MjYsOCArNDk5LDggQEAKIAkJa2ZyZWUocXVldWVkX21zZyk7CiAJfQogCi0JcHJpdi0+c3RhdHMudHhfcGFja2V0cysrOwotCXByaXYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCWRldi0+c3RhdHMudHhfcGFja2V0cysrOworCWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTUzOCwxMiArNTExLDE5IEBACiBzdGF0aWMgdm9pZAogeHBuZXRfZGV2X3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgeHBuZXRfZGV2X3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JcHJpdi0+c3RhdHMudHhfZXJyb3JzKys7Ci0JcmV0dXJuOworCWRldi0+c3RhdHMudHhfZXJyb3JzKys7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgeHBuZXRfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0geHBuZXRfZGV2X29wZW4sCisJLm5kb19zdG9wCQk9IHhwbmV0X2Rldl9zdG9wLAorCS5uZG9fc3RhcnRfeG1pdAkJPSB4cG5ldF9kZXZfaGFyZF9zdGFydF94bWl0LAorCS5uZG9fY2hhbmdlX210dQkJPSB4cG5ldF9kZXZfY2hhbmdlX210dSwKKwkubmRvX3R4X3RpbWVvdXQJCT0geHBuZXRfZGV2X3R4X3RpbWVvdXQsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgCT0gZXRoX21hY19hZGRyLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorfTsKKwogc3RhdGljIGludCBfX2luaXQKIHhwbmV0X2luaXQodm9pZCkKIHsKQEAgLTU2Myw4ICs1NDMsNyBAQAogCSAqIHVzZSBldGhlcl9zZXR1cCgpIHRvIGluaXQgdGhlIG1ham9yaXR5IG9mIG91ciBkZXZpY2UKIAkgKiBzdHJ1Y3R1cmUgYW5kIHRoZW4gb3ZlcnJpZGUgdGhlIG5lY2Vzc2FyeSBwaWVjZXMuCiAJICovCi0JeHBuZXRfZGV2aWNlID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3QgeHBuZXRfZGV2X3ByaXZhdGUpLAotCQkJCSAgICBYUE5FVF9ERVZJQ0VfTkFNRSwgZXRoZXJfc2V0dXApOworCXhwbmV0X2RldmljZSA9IGFsbG9jX25ldGRldigwLCBYUE5FVF9ERVZJQ0VfTkFNRSwgZXRoZXJfc2V0dXApOwogCWlmICh4cG5ldF9kZXZpY2UgPT0gTlVMTCkgewogCQlrZnJlZSh4cG5ldF9icm9hZGNhc3RfcGFydGl0aW9ucyk7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtNTczLDEzICs1NTIsNiBAQAogCW5ldGlmX2NhcnJpZXJfb2ZmKHhwbmV0X2RldmljZSk7CiAKIAl4cG5ldF9kZXZpY2UtPm10dSA9IFhQTkVUX0RFRl9NVFU7Ci0JeHBuZXRfZGV2aWNlLT5jaGFuZ2VfbXR1ID0geHBuZXRfZGV2X2NoYW5nZV9tdHU7Ci0JeHBuZXRfZGV2aWNlLT5vcGVuID0geHBuZXRfZGV2X29wZW47Ci0JeHBuZXRfZGV2aWNlLT5nZXRfc3RhdHMgPSB4cG5ldF9kZXZfZ2V0X3N0YXRzOwotCXhwbmV0X2RldmljZS0+c3RvcCA9IHhwbmV0X2Rldl9zdG9wOwotCXhwbmV0X2RldmljZS0+aGFyZF9zdGFydF94bWl0ID0geHBuZXRfZGV2X2hhcmRfc3RhcnRfeG1pdDsKLQl4cG5ldF9kZXZpY2UtPnR4X3RpbWVvdXQgPSB4cG5ldF9kZXZfdHhfdGltZW91dDsKLQl4cG5ldF9kZXZpY2UtPnNldF9jb25maWcgPSB4cG5ldF9kZXZfc2V0X2NvbmZpZzsKIAogCS8qCiAJICogTXVsdGljYXN0IGFzc3VtZXMgdGhlIExTQiBvZiB0aGUgZmlyc3Qgb2N0ZXQgaXMgc2V0IGZvciBtdWx0aWNhc3QKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy90aWZtXzd4eDEuYyBiL2RyaXZlcnMvbWlzYy90aWZtXzd4eDEuYwppbmRleCA2NzUwM2VhLi5iZTU2NzJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvdGlmbV83eHgxLmMKKysrIGIvZHJpdmVycy9taXNjL3RpZm1fN3h4MS5jCkBAIC0xNjQsNyArMTY0LDcgQEAKIAkJaWYgKHNvY2spIHsKIAkJCXByaW50ayhLRVJOX0lORk8KIAkJCSAgICAgICAiJXMgOiBkZW1hbmQgcmVtb3ZpbmcgY2FyZCBmcm9tIHNvY2tldCAldToldVxuIiwKLQkJCSAgICAgICBmbS0+ZGV2LmJ1c19pZCwgZm0tPmlkLCBjbnQpOworCQkJICAgICAgIGRldl9uYW1lKCZmbS0+ZGV2KSwgZm0tPmlkLCBjbnQpOwogCQkJZm0tPnNvY2tldHNbY250XSA9IE5VTEw7CiAJCQlzb2NrX2FkZHIgPSBzb2NrLT5hZGRyOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZm0tPmxvY2ssIGZsYWdzKTsKQEAgLTM1NCw4ICszNTQsNyBAQAogCWZtLT5oYXNfbXNfcGlmID0gdGlmbV83eHgxX2hhc19tc19waWY7CiAJcGNpX3NldF9kcnZkYXRhKGRldiwgZm0pOwogCi0JZm0tPmFkZHIgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApLAotCQkJICAgcGNpX3Jlc291cmNlX2xlbihkZXYsIDApKTsKKwlmbS0+YWRkciA9IHBjaV9pb3JlbWFwX2JhcihkZXYsIDApOwogCWlmICghZm0tPmFkZHIpCiAJCWdvdG8gZXJyX291dF9mcmVlOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvdGlmbV9jb3JlLmMgYi9kcml2ZXJzL21pc2MvdGlmbV9jb3JlLmMKaW5kZXggODJkYzcyYS4uOThiY2JhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL3RpZm1fY29yZS5jCisrKyBiL2RyaXZlcnMvbWlzYy90aWZtX2NvcmUuYwpAQCAtMjAzLDcgKzIwMyw3IEBACiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKLQlzbnByaW50ZihmbS0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsICJ0aWZtJXUiLCBmbS0+aWQpOworCWRldl9zZXRfbmFtZSgmZm0tPmRldiwgInRpZm0ldSIsIGZtLT5pZCk7CiAJcmMgPSBkZXZpY2VfYWRkKCZmbS0+ZGV2KTsKIAlpZiAocmMpIHsKIAkJc3Bpbl9sb2NrKCZ0aWZtX2FkYXB0ZXJfbG9jayk7CkBAIC0yNjYsOSArMjY2LDggQEAKIAkJc29jay0+ZGV2LmRtYV9tYXNrID0gZm0tPmRldi5wYXJlbnQtPmRtYV9tYXNrOwogCQlzb2NrLT5kZXYucmVsZWFzZSA9IHRpZm1fZnJlZV9kZXZpY2U7CiAKLQkJc25wcmludGYoc29jay0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsCi0JCQkgInRpZm1fJXMldToldSIsIHRpZm1fbWVkaWFfdHlwZV9uYW1lKHR5cGUsIDIpLAotCQkJIGZtLT5pZCwgaWQpOworCQlkZXZfc2V0X25hbWUoJnNvY2stPmRldiwgInRpZm1fJXMldToldSIsCisJCQkgICAgIHRpZm1fbWVkaWFfdHlwZV9uYW1lKHR5cGUsIDIpLCBmbS0+aWQsIGlkKTsKIAkJcHJpbnRrKEtFUk5fSU5GTyBEUklWRVJfTkFNRQogCQkgICAgICAgIjogJXMgY2FyZCBkZXRlY3RlZCBpbiBzb2NrZXQgJXU6JXVcbiIsCiAJCSAgICAgICB0aWZtX21lZGlhX3R5cGVfbmFtZSh0eXBlLCAwKSwgZm0tPmlkLCBpZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L2F0bWVsLW1jaS5jIGIvZHJpdmVycy9tbWMvaG9zdC9hdG1lbC1tY2kuYwppbmRleCA3YTNmMjQzLi43NmJmZTE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L2F0bWVsLW1jaS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvYXRtZWwtbWNpLmMKQEAgLTI1LDggKzI1LDggQEAKICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAKICNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bWVsLW1jaS5oPgogCi0jaW5jbHVkZSA8YXNtL2F0bWVsLW1jaS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KIApAQCAtNTUsNyArNTUsNiBAQAogCiBzdHJ1Y3QgYXRtZWxfbWNpX2RtYSB7CiAjaWZkZWYgQ09ORklHX01NQ19BVE1FTE1DSV9ETUEKLQlzdHJ1Y3QgZG1hX2NsaWVudAkJY2xpZW50OwogCXN0cnVjdCBkbWFfY2hhbgkJCSpjaGFuOwogCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvcgkqZGF0YV9kZXNjOwogI2VuZGlmCkBAIC01OTMsMTAgKzU5Miw4IEBACiAKIAkvKiBJZiB3ZSBkb24ndCBoYXZlIGEgY2hhbm5lbCwgd2UgY2FuJ3QgZG8gRE1BICovCiAJY2hhbiA9IGhvc3QtPmRtYS5jaGFuOwotCWlmIChjaGFuKSB7Ci0JCWRtYV9jaGFuX2dldChjaGFuKTsKKwlpZiAoY2hhbikKIAkJaG9zdC0+ZGF0YV9jaGFuID0gY2hhbjsKLQl9CiAKIAlpZiAoIWNoYW4pCiAJCXJldHVybiAtRU5PREVWOwpAQCAtMTQ0Myw2MCArMTQ0MCw2IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi0jaWZkZWYgQ09ORklHX01NQ19BVE1FTE1DSV9ETUEKLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgYXRtZWxfbWNpICoKLWRtYV9jbGllbnRfdG9fYXRtZWxfbWNpKHN0cnVjdCBkbWFfY2xpZW50ICpjbGllbnQpCi17Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZihjbGllbnQsIHN0cnVjdCBhdG1lbF9tY2ksIGRtYS5jbGllbnQpOwotfQotCi1zdGF0aWMgZW51bSBkbWFfc3RhdGVfY2xpZW50IGF0bWNpX2RtYV9ldmVudChzdHJ1Y3QgZG1hX2NsaWVudCAqY2xpZW50LAotCQlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIGVudW0gZG1hX3N0YXRlIHN0YXRlKQotewotCXN0cnVjdCBhdG1lbF9tY2kJKmhvc3Q7Ci0JZW51bSBkbWFfc3RhdGVfY2xpZW50CXJldCA9IERNQV9OQUs7Ci0KLQlob3N0ID0gZG1hX2NsaWVudF90b19hdG1lbF9tY2koY2xpZW50KTsKLQotCXN3aXRjaCAoc3RhdGUpIHsKLQljYXNlIERNQV9SRVNPVVJDRV9BVkFJTEFCTEU6Ci0JCXNwaW5fbG9ja19iaCgmaG9zdC0+bG9jayk7Ci0JCWlmICghaG9zdC0+ZG1hLmNoYW4pIHsKLQkJCWhvc3QtPmRtYS5jaGFuID0gY2hhbjsKLQkJCXJldCA9IERNQV9BQ0s7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfYmgoJmhvc3QtPmxvY2spOwotCi0JCWlmIChyZXQgPT0gRE1BX0FDSykKLQkJCWRldl9pbmZvKCZob3N0LT5wZGV2LT5kZXYsCi0JCQkJCSJVc2luZyAlcyBmb3IgRE1BIHRyYW5zZmVyc1xuIiwKLQkJCQkJY2hhbi0+ZGV2LmJ1c19pZCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBETUFfUkVTT1VSQ0VfUkVNT1ZFRDoKLQkJc3Bpbl9sb2NrX2JoKCZob3N0LT5sb2NrKTsKLQkJaWYgKGhvc3QtPmRtYS5jaGFuID09IGNoYW4pIHsKLQkJCWhvc3QtPmRtYS5jaGFuID0gTlVMTDsKLQkJCXJldCA9IERNQV9BQ0s7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfYmgoJmhvc3QtPmxvY2spOwotCi0JCWlmIChyZXQgPT0gRE1BX0FDSykKLQkJCWRldl9pbmZvKCZob3N0LT5wZGV2LT5kZXYsCi0JCQkJCSJMb3N0ICVzLCBmYWxsaW5nIGJhY2sgdG8gUElPXG4iLAotCQkJCQljaGFuLT5kZXYuYnVzX2lkKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQotCXJldHVybiByZXQ7Ci19Ci0jZW5kaWYgLyogQ09ORklHX01NQ19BVE1FTE1DSV9ETUEgKi8KLQogc3RhdGljIGludCBfX2luaXQgYXRtY2lfaW5pdF9zbG90KHN0cnVjdCBhdG1lbF9tY2kgKmhvc3QsCiAJCXN0cnVjdCBtY2lfc2xvdF9wZGF0YSAqc2xvdF9kYXRhLCB1bnNpZ25lZCBpbnQgaWQsCiAJCXUzMiBzZGNfcmVnKQpAQCAtMTYwMCw2ICsxNTQzLDE4IEBACiAJbW1jX2ZyZWVfaG9zdChzbG90LT5tbWMpOwogfQogCisjaWZkZWYgQ09ORklHX01NQ19BVE1FTE1DSV9ETUEKK3N0YXRpYyBib29sIGZpbHRlcihzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIHZvaWQgKnNsYXZlKQoreworCXN0cnVjdCBkd19kbWFfc2xhdmUgKmR3cyA9IHNsYXZlOworCisJaWYgKGR3cy0+ZG1hX2RldiA9PSBjaGFuLT5kZXZpY2UtPmRldikKKwkJcmV0dXJuIHRydWU7CisJZWxzZQorCQlyZXR1cm4gZmFsc2U7Cit9CisjZW5kaWYKKwogc3RhdGljIGludCBfX2luaXQgYXRtY2lfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgbWNpX3BsYXRmb3JtX2RhdGEJKnBkYXRhOwpAQCAtMTY1MiwyMiArMTYwNywyMCBAQAogCQlnb3RvIGVycl9yZXF1ZXN0X2lycTsKIAogI2lmZGVmIENPTkZJR19NTUNfQVRNRUxNQ0lfRE1BCi0JaWYgKHBkYXRhLT5kbWFfc2xhdmUpIHsKLQkJc3RydWN0IGRtYV9zbGF2ZSAqc2xhdmUgPSBwZGF0YS0+ZG1hX3NsYXZlOworCWlmIChwZGF0YS0+ZG1hX3NsYXZlLmRtYV9kZXYpIHsKKwkJc3RydWN0IGR3X2RtYV9zbGF2ZSAqZHdzID0gJnBkYXRhLT5kbWFfc2xhdmU7CisJCWRtYV9jYXBfbWFza190IG1hc2s7CiAKLQkJc2xhdmUtPnR4X3JlZyA9IHJlZ3MtPnN0YXJ0ICsgTUNJX1REUjsKLQkJc2xhdmUtPnJ4X3JlZyA9IHJlZ3MtPnN0YXJ0ICsgTUNJX1JEUjsKKwkJZHdzLT50eF9yZWcgPSByZWdzLT5zdGFydCArIE1DSV9URFI7CisJCWR3cy0+cnhfcmVnID0gcmVncy0+c3RhcnQgKyBNQ0lfUkRSOwogCiAJCS8qIFRyeSB0byBncmFiIGEgRE1BIGNoYW5uZWwgKi8KLQkJaG9zdC0+ZG1hLmNsaWVudC5ldmVudF9jYWxsYmFjayA9IGF0bWNpX2RtYV9ldmVudDsKLQkJZG1hX2NhcF9zZXQoRE1BX1NMQVZFLCBob3N0LT5kbWEuY2xpZW50LmNhcF9tYXNrKTsKLQkJaG9zdC0+ZG1hLmNsaWVudC5zbGF2ZSA9IHNsYXZlOwotCi0JCWRtYV9hc3luY19jbGllbnRfcmVnaXN0ZXIoJmhvc3QtPmRtYS5jbGllbnQpOwotCQlkbWFfYXN5bmNfY2xpZW50X2NoYW5fcmVxdWVzdCgmaG9zdC0+ZG1hLmNsaWVudCk7Ci0JfSBlbHNlIHsKLQkJZGV2X25vdGljZSgmcGRldi0+ZGV2LCAiRE1BIG5vdCBhdmFpbGFibGUsIHVzaW5nIFBJT1xuIik7CisJCWRtYV9jYXBfemVybyhtYXNrKTsKKwkJZG1hX2NhcF9zZXQoRE1BX1NMQVZFLCBtYXNrKTsKKwkJaG9zdC0+ZG1hLmNoYW4gPSBkbWFfcmVxdWVzdF9jaGFubmVsKG1hc2ssIGZpbHRlciwgZHdzKTsKIAl9CisJaWYgKCFob3N0LT5kbWEuY2hhbikKKwkJZGV2X25vdGljZSgmcGRldi0+ZGV2LCAiRE1BIG5vdCBhdmFpbGFibGUsIHVzaW5nIFBJT1xuIik7CiAjZW5kaWYgLyogQ09ORklHX01NQ19BVE1FTE1DSV9ETUEgKi8KIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGhvc3QpOwpAQCAtMTY5OSw4ICsxNjUyLDggQEAKIAogZXJyX2luaXRfc2xvdDoKICNpZmRlZiBDT05GSUdfTU1DX0FUTUVMTUNJX0RNQQotCWlmIChwZGF0YS0+ZG1hX3NsYXZlKQotCQlkbWFfYXN5bmNfY2xpZW50X3VucmVnaXN0ZXIoJmhvc3QtPmRtYS5jbGllbnQpOworCWlmIChob3N0LT5kbWEuY2hhbikKKwkJZG1hX3JlbGVhc2VfY2hhbm5lbChob3N0LT5kbWEuY2hhbik7CiAjZW5kaWYKIAlmcmVlX2lycShpcnEsIGhvc3QpOwogZXJyX3JlcXVlc3RfaXJxOgpAQCAtMTczMSw4ICsxNjg0LDggQEAKIAljbGtfZGlzYWJsZShob3N0LT5tY2spOwogCiAjaWZkZWYgQ09ORklHX01NQ19BVE1FTE1DSV9ETUEKLQlpZiAoaG9zdC0+ZG1hLmNsaWVudC5zbGF2ZSkKLQkJZG1hX2FzeW5jX2NsaWVudF91bnJlZ2lzdGVyKCZob3N0LT5kbWEuY2xpZW50KTsKKwlpZiAoaG9zdC0+ZG1hLmNoYW4pCisJCWRtYV9yZWxlYXNlX2NoYW5uZWwoaG9zdC0+ZG1hLmNoYW4pOwogI2VuZGlmCiAKIAlmcmVlX2lycShwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApLCBob3N0KTsKQEAgLTE3NjEsNyArMTcxNCw3IEBACiAJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmF0bWNpX2RyaXZlcik7CiB9CiAKLW1vZHVsZV9pbml0KGF0bWNpX2luaXQpOworbGF0ZV9pbml0Y2FsbChhdG1jaV9pbml0KTsgLyogdHJ5IHRvIGxvYWQgYWZ0ZXIgZG1hIGRyaXZlciB3aGVuIGJ1aWx0LWluICovCiBtb2R1bGVfZXhpdChhdG1jaV9leGl0KTsKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJBdG1lbCBNdWx0aW1lZGlhIENhcmQgSW50ZXJmYWNlIGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvZGV2aWNlcy9LY29uZmlnIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9LY29uZmlnCmluZGV4IDZmZGUwYTIuLmJjMzMyMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2RldmljZXMvS2NvbmZpZworKysgYi9kcml2ZXJzL210ZC9kZXZpY2VzL0tjb25maWcKQEAgLTEyMCw2ICsxMjAsMTMgQEAKIAkgIGRvZXNuJ3QgaGF2ZSBhY2Nlc3MgdG8sIG1lbW9yeSBiZXlvbmQgdGhlIG1lbT14eHggbGltaXQsIG52cmFtLAogCSAgbWVtb3J5IG9uIHRoZSB2aWRlbyBjYXJkLCBldGMuLi4KIAorY29uZmlnIE1URF9QUzNWUkFNCisJdHJpc3RhdGUgIlBTMyB2aWRlbyBSQU0iCisJZGVwZW5kcyBvbiBGQl9QUzMKKwloZWxwCisJICBUaGlzIGRyaXZlciBhbGxvd3MgeW91IHRvIHVzZSBleGNlc3MgUFMzIHZpZGVvIFJBTSBhcyB2b2xhdGlsZQorCSAgc3RvcmFnZSBvciBzeXN0ZW0gc3dhcC4KKwogY29uZmlnIE1URF9MQVJUCiAJdHJpc3RhdGUgIjI4RjE2MHh4IGZsYXNoIGRyaXZlciBmb3IgTEFSVCIKIAlkZXBlbmRzIG9uIFNBMTEwMF9MQVJUCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9kZXZpY2VzL01ha2VmaWxlIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9NYWtlZmlsZQppbmRleCAwOTkzZDVjLi5lNTE1MjFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9kZXZpY2VzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbXRkL2RldmljZXMvTWFrZWZpbGUKQEAgLTE2LDMgKzE2LDQgQEAKIG9iai0kKENPTkZJR19NVERfQkxPQ0syTVREKQkrPSBibG9jazJtdGQubwogb2JqLSQoQ09ORklHX01URF9EQVRBRkxBU0gpCSs9IG10ZF9kYXRhZmxhc2gubwogb2JqLSQoQ09ORklHX01URF9NMjVQODApCSs9IG0yNXA4MC5vCitvYmotJChDT05GSUdfTVREX1BTM1ZSQU0pCSs9IHBzM3ZyYW0ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvZGV2aWNlcy9tMjVwODAuYyBiL2RyaXZlcnMvbXRkL2RldmljZXMvbTI1cDgwLmMKaW5kZXggNjY1OWIyMi4uNTczM2YwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvZGV2aWNlcy9tMjVwODAuYworKysgYi9kcml2ZXJzL210ZC9kZXZpY2VzL20yNXA4MC5jCkBAIC0xNzAsNyArMTcwLDcgQEAKIHN0YXRpYyBpbnQgZXJhc2VfY2hpcChzdHJ1Y3QgbTI1cCAqZmxhc2gpCiB7CiAJREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIiVzOiAlcyAlZEtpQlxuIiwKLQkJCWZsYXNoLT5zcGktPmRldi5idXNfaWQsIF9fZnVuY19fLAorCQkJZGV2X25hbWUoJmZsYXNoLT5zcGktPmRldiksIF9fZnVuY19fLAogCQkJZmxhc2gtPm10ZC5zaXplIC8gMTAyNCk7CiAKIAkvKiBXYWl0IHVudGlsIGZpbmlzaGVkIHByZXZpb3VzIHdyaXRlIGNvbW1hbmQuICovCkBAIC0xOTcsNyArMTk3LDcgQEAKIHN0YXRpYyBpbnQgZXJhc2Vfc2VjdG9yKHN0cnVjdCBtMjVwICpmbGFzaCwgdTMyIG9mZnNldCkKIHsKIAlERUJVRyhNVERfREVCVUdfTEVWRUwzLCAiJXM6ICVzICVkS2lCIGF0IDB4JTA4eFxuIiwKLQkJCWZsYXNoLT5zcGktPmRldi5idXNfaWQsIF9fZnVuY19fLAorCQkJZGV2X25hbWUoJmZsYXNoLT5zcGktPmRldiksIF9fZnVuY19fLAogCQkJZmxhc2gtPm10ZC5lcmFzZXNpemUgLyAxMDI0LCBvZmZzZXQpOwogCiAJLyogV2FpdCB1bnRpbCBmaW5pc2hlZCBwcmV2aW91cyB3cml0ZSBjb21tYW5kLiAqLwpAQCAtMjM0LDcgKzIzNCw3IEBACiAJdTMyIGFkZHIsbGVuOwogCiAJREVCVUcoTVREX0RFQlVHX0xFVkVMMiwgIiVzOiAlcyAlcyAweCUwOHgsIGxlbiAlZFxuIiwKLQkJCWZsYXNoLT5zcGktPmRldi5idXNfaWQsIF9fZnVuY19fLCAiYXQiLAorCQkJZGV2X25hbWUoJmZsYXNoLT5zcGktPmRldiksIF9fZnVuY19fLCAiYXQiLAogCQkJKHUzMilpbnN0ci0+YWRkciwgaW5zdHItPmxlbik7CiAKIAkvKiBzYW5pdHkgY2hlY2tzICovCkBAIC0yOTUsNyArMjk1LDcgQEAKIAlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbTsKIAogCURFQlVHKE1URF9ERUJVR19MRVZFTDIsICIlczogJXMgJXMgMHglMDh4LCBsZW4gJXpkXG4iLAotCQkJZmxhc2gtPnNwaS0+ZGV2LmJ1c19pZCwgX19mdW5jX18sICJmcm9tIiwKKwkJCWRldl9uYW1lKCZmbGFzaC0+c3BpLT5kZXYpLCBfX2Z1bmNfXywgImZyb20iLAogCQkJKHUzMilmcm9tLCBsZW4pOwogCiAJLyogc2FuaXR5IGNoZWNrcyAqLwpAQCAtMzY3LDcgKzM2Nyw3IEBACiAJc3RydWN0IHNwaV9tZXNzYWdlIG07CiAKIAlERUJVRyhNVERfREVCVUdfTEVWRUwyLCAiJXM6ICVzICVzIDB4JTA4eCwgbGVuICV6ZFxuIiwKLQkJCWZsYXNoLT5zcGktPmRldi5idXNfaWQsIF9fZnVuY19fLCAidG8iLAorCQkJZGV2X25hbWUoJmZsYXNoLT5zcGktPmRldiksIF9fZnVuY19fLCAidG8iLAogCQkJKHUzMil0bywgbGVuKTsKIAogCWlmIChyZXRsZW4pCkBAIC01NjMsNyArNTYzLDcgQEAKIAl0bXAgPSBzcGlfd3JpdGVfdGhlbl9yZWFkKHNwaSwgJmNvZGUsIDEsIGlkLCA1KTsKIAlpZiAodG1wIDwgMCkgewogCQlERUJVRyhNVERfREVCVUdfTEVWRUwwLCAiJXM6IGVycm9yICVkIHJlYWRpbmcgSkVERUMgSURcbiIsCi0JCQlzcGktPmRldi5idXNfaWQsIHRtcCk7CisJCQlkZXZfbmFtZSgmc3BpLT5kZXYpLCB0bXApOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJamVkZWMgPSBpZFswXTsKQEAgLTYxNyw3ICs2MTcsNyBAQAogCQkvKiB1bnJlY29nbml6ZWQgY2hpcD8gKi8KIAkJaWYgKGkgPT0gQVJSQVlfU0laRShtMjVwX2RhdGEpKSB7CiAJCQlERUJVRyhNVERfREVCVUdfTEVWRUwwLCAiJXM6IHVucmVjb2duaXplZCBpZCAlc1xuIiwKLQkJCQkJc3BpLT5kZXYuYnVzX2lkLCBkYXRhLT50eXBlKTsKKwkJCQkJZGV2X25hbWUoJnNwaS0+ZGV2KSwgZGF0YS0+dHlwZSk7CiAJCQlpbmZvID0gTlVMTDsKIAogCQkvKiByZWNvZ25pemVkOyBpcyB0aGF0IGNoaXAgcmVhbGx5IHdoYXQncyB0aGVyZT8gKi8KQEAgLTY1OCw3ICs2NTgsNyBAQAogCWlmIChkYXRhICYmIGRhdGEtPm5hbWUpCiAJCWZsYXNoLT5tdGQubmFtZSA9IGRhdGEtPm5hbWU7CiAJZWxzZQotCQlmbGFzaC0+bXRkLm5hbWUgPSBzcGktPmRldi5idXNfaWQ7CisJCWZsYXNoLT5tdGQubmFtZSA9IGRldl9uYW1lKCZzcGktPmRldik7CiAKIAlmbGFzaC0+bXRkLnR5cGUgPSBNVERfTk9SRkxBU0g7CiAJZmxhc2gtPm10ZC53cml0ZXNpemUgPSAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvZGV2aWNlcy9tdGRfZGF0YWZsYXNoLmMgYi9kcml2ZXJzL210ZC9kZXZpY2VzL210ZF9kYXRhZmxhc2guYwppbmRleCA2ZGQ5YWZmLi42NTEyNmNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9kZXZpY2VzL210ZF9kYXRhZmxhc2guYworKysgYi9kcml2ZXJzL210ZC9kZXZpY2VzL210ZF9kYXRhZmxhc2guYwpAQCAtMTI4LDcgKzEyOCw3IEBACiAJCXN0YXR1cyA9IGRhdGFmbGFzaF9zdGF0dXMoc3BpKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKIAkJCURFQlVHKE1URF9ERUJVR19MRVZFTDEsICIlczogc3RhdHVzICVkP1xuIiwKLQkJCQkJc3BpLT5kZXYuYnVzX2lkLCBzdGF0dXMpOworCQkJCQlkZXZfbmFtZSgmc3BpLT5kZXYpLCBzdGF0dXMpOwogCQkJc3RhdHVzID0gMDsKIAkJfQogCkBAIC0xNTQsNyArMTU0LDcgQEAKIAl1aW50OF90CQkJKmNvbW1hbmQ7CiAKIAlERUJVRyhNVERfREVCVUdfTEVWRUwyLCAiJXM6IGVyYXNlIGFkZHI9MHgleCBsZW4gMHgleFxuIiwKLQkJCXNwaS0+ZGV2LmJ1c19pZCwKKwkJCWRldl9uYW1lKCZzcGktPmRldiksCiAJCQlpbnN0ci0+YWRkciwgaW5zdHItPmxlbik7CiAKIAkvKiBTYW5pdHkgY2hlY2tzICovCkBAIC0xOTcsNyArMTk3LDcgQEAKIAogCQlpZiAoc3RhdHVzIDwgMCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJhc2UgJXgsIGVyciAlZFxuIiwKLQkJCQlzcGktPmRldi5idXNfaWQsIHBhZ2VhZGRyLCBzdGF0dXMpOworCQkJCWRldl9uYW1lKCZzcGktPmRldiksIHBhZ2VhZGRyLCBzdGF0dXMpOwogCQkJLyogUkVWSVNJVDogIGNhbiByZXRyeSBpbnN0ci0+cmV0cmllcyB0aW1lczsgb3IKIAkJCSAqIGdpdmV1cCBhbmQgaW5zdHItPmZhaWxfYWRkciA9IGluc3RyLT5hZGRyOwogCQkJICovCkBAIC0yMzksNyArMjM5LDcgQEAKIAlpbnQJCQlzdGF0dXM7CiAKIAlERUJVRyhNVERfREVCVUdfTEVWRUwyLCAiJXM6IHJlYWQgMHgleC4uMHgleFxuIiwKLQkJcHJpdi0+c3BpLT5kZXYuYnVzX2lkLCAodW5zaWduZWQpZnJvbSwgKHVuc2lnbmVkKShmcm9tICsgbGVuKSk7CisJCWRldl9uYW1lKCZwcml2LT5zcGktPmRldiksICh1bnNpZ25lZClmcm9tLCAodW5zaWduZWQpKGZyb20gKyBsZW4pKTsKIAogCSpyZXRsZW4gPSAwOwogCkBAIC0yODgsNyArMjg4LDcgQEAKIAkJc3RhdHVzID0gMDsKIAl9IGVsc2UKIAkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiByZWFkICV4Li4leCAtLT4gJWRcbiIsCi0JCQlwcml2LT5zcGktPmRldi5idXNfaWQsCisJCQlkZXZfbmFtZSgmcHJpdi0+c3BpLT5kZXYpLAogCQkJKHVuc2lnbmVkKWZyb20sICh1bnNpZ25lZCkoZnJvbSArIGxlbiksCiAJCQlzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CkBAIC0zMTUsNyArMzE1LDcgQEAKIAl1aW50OF90CQkJKmNvbW1hbmQ7CiAKIAlERUJVRyhNVERfREVCVUdfTEVWRUwyLCAiJXM6IHdyaXRlIDB4JXguLjB4JXhcbiIsCi0JCXNwaS0+ZGV2LmJ1c19pZCwgKHVuc2lnbmVkKXRvLCAodW5zaWduZWQpKHRvICsgbGVuKSk7CisJCWRldl9uYW1lKCZzcGktPmRldiksICh1bnNpZ25lZCl0bywgKHVuc2lnbmVkKSh0byArIGxlbikpOwogCiAJKnJldGxlbiA9IDA7CiAKQEAgLTM3NCw3ICszNzQsNyBAQAogCQkJc3RhdHVzID0gc3BpX3N5bmMoc3BpLCAmbXNnKTsKIAkJCWlmIChzdGF0dXMgPCAwKQogCQkJCURFQlVHKE1URF9ERUJVR19MRVZFTDEsICIlczogeGZlciAldSAtPiAlZCBcbiIsCi0JCQkJCXNwaS0+ZGV2LmJ1c19pZCwgYWRkciwgc3RhdHVzKTsKKwkJCQkJZGV2X25hbWUoJnNwaS0+ZGV2KSwgYWRkciwgc3RhdHVzKTsKIAogCQkJKHZvaWQpIGRhdGFmbGFzaF93YWl0cmVhZHkocHJpdi0+c3BpKTsKIAkJfQpAQCAtMzk2LDcgKzM5Niw3IEBACiAJCXNwaV90cmFuc2Zlcl9kZWwoeCArIDEpOwogCQlpZiAoc3RhdHVzIDwgMCkKIAkJCURFQlVHKE1URF9ERUJVR19MRVZFTDEsICIlczogcGdtICV1LyV1IC0+ICVkIFxuIiwKLQkJCQlzcGktPmRldi5idXNfaWQsIGFkZHIsIHdyaXRlbGVuLCBzdGF0dXMpOworCQkJCWRldl9uYW1lKCZzcGktPmRldiksIGFkZHIsIHdyaXRlbGVuLCBzdGF0dXMpOwogCiAJCSh2b2lkKSBkYXRhZmxhc2hfd2FpdHJlYWR5KHByaXYtPnNwaSk7CiAKQEAgLTQxNiwxNCArNDE2LDE0IEBACiAJCXN0YXR1cyA9IHNwaV9zeW5jKHNwaSwgJm1zZyk7CiAJCWlmIChzdGF0dXMgPCAwKQogCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiBjb21wYXJlICV1IC0+ICVkIFxuIiwKLQkJCQlzcGktPmRldi5idXNfaWQsIGFkZHIsIHN0YXR1cyk7CisJCQkJZGV2X25hbWUoJnNwaS0+ZGV2KSwgYWRkciwgc3RhdHVzKTsKIAogCQlzdGF0dXMgPSBkYXRhZmxhc2hfd2FpdHJlYWR5KHByaXYtPnNwaSk7CiAKIAkJLyogQ2hlY2sgcmVzdWx0IG9mIHRoZSBjb21wYXJlIG9wZXJhdGlvbiAqLwogCQlpZiAoc3RhdHVzICYgKDEgPDwgNikpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvbXBhcmUgcGFnZSAldSwgZXJyICVkXG4iLAotCQkJCXNwaS0+ZGV2LmJ1c19pZCwgcGFnZWFkZHIsIHN0YXR1cyk7CisJCQkJZGV2X25hbWUoJnNwaS0+ZGV2KSwgcGFnZWFkZHIsIHN0YXR1cyk7CiAJCQlyZW1haW5pbmcgPSAwOwogCQkJc3RhdHVzID0gLUVJTzsKIAkJCWJyZWFrOwpAQCAtNzc5LDcgKzc3OSw3IEBACiAJdG1wID0gc3BpX3dyaXRlX3RoZW5fcmVhZChzcGksICZjb2RlLCAxLCBpZCwgMyk7CiAJaWYgKHRtcCA8IDApIHsKIAkJREVCVUcoTVREX0RFQlVHX0xFVkVMMCwgIiVzOiBlcnJvciAlZCByZWFkaW5nIEpFREVDIElEXG4iLAotCQkJc3BpLT5kZXYuYnVzX2lkLCB0bXApOworCQkJZGV2X25hbWUoJnNwaS0+ZGV2KSwgdG1wKTsKIAkJcmV0dXJuIEVSUl9QVFIodG1wKTsKIAl9CiAJaWYgKGlkWzBdICE9IDB4MWYpCkBAIC04NjksNyArODY5LDcgQEAKIAlzdGF0dXMgPSBkYXRhZmxhc2hfc3RhdHVzKHNwaSk7CiAJaWYgKHN0YXR1cyA8PSAwIHx8IHN0YXR1cyA9PSAweGZmKSB7CiAJCURFQlVHKE1URF9ERUJVR19MRVZFTDEsICIlczogc3RhdHVzIGVycm9yICVkXG4iLAotCQkJCXNwaS0+ZGV2LmJ1c19pZCwgc3RhdHVzKTsKKwkJCQlkZXZfbmFtZSgmc3BpLT5kZXYpLCBzdGF0dXMpOwogCQlpZiAoc3RhdHVzID09IDAgfHwgc3RhdHVzID09IDB4ZmYpCiAJCQlzdGF0dXMgPSAtRU5PREVWOwogCQlyZXR1cm4gc3RhdHVzOwpAQCAtOTA1LDEzICs5MDUsMTMgQEAKIAkvKiBvYnNvbGV0ZSBBVDQ1REIxMjgyIG5vdCAoeWV0Pykgc3VwcG9ydGVkICovCiAJZGVmYXVsdDoKIAkJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiB1bnN1cHBvcnRlZCBkZXZpY2UgKCV4KVxuIiwKLQkJCQlzcGktPmRldi5idXNfaWQsIHN0YXR1cyAmIDB4M2MpOworCQkJCWRldl9uYW1lKCZzcGktPmRldiksIHN0YXR1cyAmIDB4M2MpOwogCQlzdGF0dXMgPSAtRU5PREVWOwogCX0KIAogCWlmIChzdGF0dXMgPCAwKQogCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiJXM6IGFkZF9kYXRhZmxhc2ggLS0+ICVkXG4iLAotCQkJCXNwaS0+ZGV2LmJ1c19pZCwgc3RhdHVzKTsKKwkJCQlkZXZfbmFtZSgmc3BpLT5kZXYpLCBzdGF0dXMpOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTkyMSw3ICs5MjEsNyBAQAogCXN0cnVjdCBkYXRhZmxhc2gJKmZsYXNoID0gZGV2X2dldF9kcnZkYXRhKCZzcGktPmRldik7CiAJaW50CQkJc3RhdHVzOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiByZW1vdmVcbiIsIHNwaS0+ZGV2LmJ1c19pZCk7CisJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIiVzOiByZW1vdmVcbiIsIGRldl9uYW1lKCZzcGktPmRldikpOwogCiAJaWYgKG10ZF9oYXNfcGFydGl0aW9ucygpICYmIGZsYXNoLT5wYXJ0aXRpb25lZCkKIAkJc3RhdHVzID0gZGVsX210ZF9wYXJ0aXRpb25zKCZmbGFzaC0+bXRkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2RldmljZXMvcG1jNTUxLmMgYi9kcml2ZXJzL210ZC9kZXZpY2VzL3BtYzU1MS5jCmluZGV4IGQzOGJjYTYuLmQyZmQ1NTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2RldmljZXMvcG1jNTUxLmMKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9wbWM1NTEuYwpAQCAtMzQsNyArMzQsNyBAQAogICoJYXBlcnR1cmUgc2l6ZSwgbm90IHRoZSBkcmFtIHNpemUsIGFuZCB0aGUgVjM3MFBEQyBzdXBwbGllcyBubwogICoJb3RoZXIgbWV0aG9kIGZvciBtZW1vcnkgc2l6ZSBkaXNjb3ZlcnkuICBUaGlzIHByb2JsZW0gaXMKICAqCW1vc3RseSBvbmx5IHJlbGV2YW50IHdoZW4gY29tcGlsZWQgYXMgYSBtb2R1bGUsIGFzIHRoZQotICoJdW5sb2FkaW5nIG9mIHRoZSBtb2R1bGUgd2l0aCBhbiBhcGVydHVyZSBzaXplIHNtYWxsZXIgdGhlbgorICoJdW5sb2FkaW5nIG9mIHRoZSBtb2R1bGUgd2l0aCBhbiBhcGVydHVyZSBzaXplIHNtYWxsZXIgdGhhbgogICoJdGhlIHJhbSB3aWxsIGNhdXNlIHRoZSBkcml2ZXIgdG8gZGV0ZWN0IHRoZSBvbmJvYXJkIG1lbW9yeQogICoJc2l6ZSB0byBiZSBlcXVhbCB0byB0aGUgYXBlcnR1cmUgc2l6ZSB3aGVuIHRoZSBtb2R1bGUgaXMKICAqCXJlbG9hZGVkLiAgU29vb28sIHRvIGhlbHAsIHRoZSBtb2R1bGUgc3VwcG9ydHMgYW4gbXNpemUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2RldmljZXMvcHMzdnJhbS5jIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9wczN2cmFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIxZTliZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbXRkL2RldmljZXMvcHMzdnJhbS5jCkBAIC0wLDAgKzEsNzY4IEBACisvKioKKyAqIHBzM3ZyYW0gLSBVc2UgZXh0cmEgUFMzIHZpZGVvIHJhbSBhcyBNVEQgYmxvY2sgZGV2aWNlLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEppbSBQYXJpcyA8amltQGp0YW4uY29tPgorICogQWRkZWQgc3VwcG9ydCBSU1ggRE1BIFZpdmllbiBDaGFwcGVsaWVyIDx2aXZpZW4uY2hhcHBlbGllckBmcmVlLmZyPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisKKyNpbmNsdWRlIDxhc20vbHYxY2FsbC5oPgorI2luY2x1ZGUgPGFzbS9wczMuaD4KKworI2RlZmluZSBERVZJQ0VfTkFNRQkJInBzM3ZyYW0iCisKKyNkZWZpbmUgWERSX0JVRl9TSVpFICgyICogMTAyNCAqIDEwMjQpIC8qIFhEUiBidWZmZXIgKG11c3QgYmUgMU1pQiBhbGlnbmVkKSAqLworI2RlZmluZSBYRFJfSU9JRiAweDBjMDAwMDAwCisKKyNkZWZpbmUgRklGT19CQVNFIFhEUl9JT0lGCisjZGVmaW5lIEZJRk9fU0laRSAoNjQgKiAxMDI0KQorCisjZGVmaW5lIERNQV9QQUdFX1NJWkUgKDQgKiAxMDI0KQorCisjZGVmaW5lIENBQ0hFX1BBR0VfU0laRSAoMjU2ICogMTAyNCkKKyNkZWZpbmUgQ0FDSEVfUEFHRV9DT1VOVCAoKFhEUl9CVUZfU0laRSAtIEZJRk9fU0laRSkgLyBDQUNIRV9QQUdFX1NJWkUpCisKKyNkZWZpbmUgQ0FDSEVfT0ZGU0VUIENBQ0hFX1BBR0VfU0laRQorI2RlZmluZSBGSUZPX09GRlNFVCAwCisKKyNkZWZpbmUgQ1RSTF9QVVQgMHgxMAorI2RlZmluZSBDVFJMX0dFVCAweDExCisjZGVmaW5lIENUUkxfVE9QIDB4MTUKKworI2RlZmluZSBVUExPQURfU1VCQ0gJMQorI2RlZmluZSBET1dOTE9BRF9TVUJDSAkyCisKKyNkZWZpbmUgTlZfTUVNT1JZX1RPX01FTU9SWV9GT1JNQVRfT0ZGU0VUX0lOCTB4MDAwMDAzMGMKKyNkZWZpbmUgTlZfTUVNT1JZX1RPX01FTU9SWV9GT1JNQVRfTk9USUZZCTB4MDAwMDAxMDQKKworI2RlZmluZSBMMUdQVV9DT05URVhUX0FUVFJJQlVURV9GQl9CTElUIDB4NjAxCisKK3N0cnVjdCBtdGRfaW5mbyBwczN2cmFtX210ZDsKKworI2RlZmluZSBDQUNIRV9QQUdFX1BSRVNFTlQgMQorI2RlZmluZSBDQUNIRV9QQUdFX0RJUlRZICAgMgorCitzdHJ1Y3QgcHMzdnJhbV90YWcgeworCXVuc2lnbmVkIGludCBhZGRyZXNzOworCXVuc2lnbmVkIGludCBmbGFnczsKK307CisKK3N0cnVjdCBwczN2cmFtX2NhY2hlIHsKKwl1bnNpZ25lZCBpbnQgcGFnZV9jb3VudDsKKwl1bnNpZ25lZCBpbnQgcGFnZV9zaXplOworCXN0cnVjdCBwczN2cmFtX3RhZyAqdGFnczsKK307CisKK3N0cnVjdCBwczN2cmFtX3ByaXYgeworCXU2NCBtZW1vcnlfaGFuZGxlOworCXU2NCBjb250ZXh0X2hhbmRsZTsKKwl1MzIgKmN0cmw7CisJdTMyICpyZXBvcnRzOworCXU4IF9faW9tZW0gKmRkcl9iYXNlOworCXU4ICp4ZHJfYnVmOworCisJdTMyICpmaWZvX2Jhc2U7CisJdTMyICpmaWZvX3B0cjsKKworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgcHMzdnJhbV9jYWNoZSBjYWNoZTsKKworCS8qIFVzZWQgdG8gc2VyaWFsaXplIGNhY2hlL0RNQSBvcGVyYXRpb25zICovCisJc3RydWN0IG11dGV4IGxvY2s7Cit9OworCisjZGVmaW5lIERNQV9OT1RJRklFUl9IQU5ETEVfQkFTRSAweDY2NjA0MjAwIC8qIGZpcnN0IERNQSBub3RpZmllciBoYW5kbGUgKi8KKyNkZWZpbmUgRE1BX05PVElGSUVSX09GRlNFVF9CQVNFIDB4MTAwMCAgICAgLyogZmlyc3QgRE1BIG5vdGlmaWVyIG9mZnNldCAqLworI2RlZmluZSBETUFfTk9USUZJRVJfU0laRSAgICAgICAgMHg0MAorI2RlZmluZSBOT1RJRklFUiA3CS8qIG5vdGlmaWVyIHVzZWQgZm9yIGNvbXBsZXRpb24gcmVwb3J0ICovCisKKy8qIEEgdHJhaWxpbmcgJy0nIG1lYW5zIHRvIHN1YnRyYWN0IG9mZiBwczNmYl92aWRlb21lbW9yeS5zaXplICovCitjaGFyICpzaXplID0gIjI1Nk0tIjsKK21vZHVsZV9wYXJhbShzaXplLCBjaGFycCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHNpemUsICJtZW1vcnkgc2l6ZSIpOworCitzdGF0aWMgdTMyICpwczN2cmFtX2dldF9ub3RpZmllcih1MzIgKnJlcG9ydHMsIGludCBub3RpZmllcikKK3sKKwlyZXR1cm4gKHZvaWQgKikgcmVwb3J0cyArCisJCURNQV9OT1RJRklFUl9PRkZTRVRfQkFTRSArCisJCURNQV9OT1RJRklFUl9TSVpFICogbm90aWZpZXI7Cit9CisKK3N0YXRpYyB2b2lkIHBzM3ZyYW1fbm90aWZpZXJfcmVzZXQoc3RydWN0IG10ZF9pbmZvICptdGQpCit7CisJaW50IGk7CisKKwlzdHJ1Y3QgcHMzdnJhbV9wcml2ICpwcml2ID0gbXRkLT5wcml2OworCXUzMiAqbm90aWZ5ID0gcHMzdnJhbV9nZXRfbm90aWZpZXIocHJpdi0+cmVwb3J0cywgTk9USUZJRVIpOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCW5vdGlmeVtpXSA9IDB4ZmZmZmZmZmY7Cit9CisKK3N0YXRpYyBpbnQgcHMzdnJhbV9ub3RpZmllcl93YWl0KHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1bnNpZ25lZCBpbnQgdGltZW91dF9tcykKK3sKKwlzdHJ1Y3QgcHMzdnJhbV9wcml2ICpwcml2ID0gbXRkLT5wcml2OworCXUzMiAqbm90aWZ5ID0gcHMzdnJhbV9nZXRfbm90aWZpZXIocHJpdi0+cmVwb3J0cywgTk9USUZJRVIpOworCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKHRpbWVvdXRfbXMpOworCisJZG8geworCQlpZiAoIW5vdGlmeVszXSkKKwkJCXJldHVybiAwOworCQltc2xlZXAoMSk7CisJfSB3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpOworCisJcmV0dXJuIC1FVElNRURPVVQ7Cit9CisKK3N0YXRpYyB2b2lkIHBzM3ZyYW1faW5pdF9yaW5nKHN0cnVjdCBtdGRfaW5mbyAqbXRkKQoreworCXN0cnVjdCBwczN2cmFtX3ByaXYgKnByaXYgPSBtdGQtPnByaXY7CisKKwlwcml2LT5jdHJsW0NUUkxfUFVUXSA9IEZJRk9fQkFTRSArIEZJRk9fT0ZGU0VUOworCXByaXYtPmN0cmxbQ1RSTF9HRVRdID0gRklGT19CQVNFICsgRklGT19PRkZTRVQ7Cit9CisKK3N0YXRpYyBpbnQgcHMzdnJhbV93YWl0X3Jpbmcoc3RydWN0IG10ZF9pbmZvICptdGQsIHVuc2lnbmVkIGludCB0aW1lb3V0X21zKQoreworCXN0cnVjdCBwczN2cmFtX3ByaXYgKnByaXYgPSBtdGQtPnByaXY7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXModGltZW91dF9tcyk7CisKKwlkbyB7CisJCWlmIChwcml2LT5jdHJsW0NUUkxfUFVUXSA9PSBwcml2LT5jdHJsW0NUUkxfR0VUXSkKKwkJCXJldHVybiAwOworCQltc2xlZXAoMSk7CisJfSB3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpOworCisJZGV2X2RiZyhwcml2LT5kZXYsICIlczolZDogRklGTyB0aW1lb3V0ICglMDh4LyUwOHgvJTA4eClcbiIsIF9fZnVuY19fLAorCQlfX0xJTkVfXywgcHJpdi0+Y3RybFtDVFJMX1BVVF0sIHByaXYtPmN0cmxbQ1RSTF9HRVRdLAorCQlwcml2LT5jdHJsW0NUUkxfVE9QXSk7CisKKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KKworc3RhdGljIHZvaWQgcHMzdnJhbV9vdXRfcmluZyhzdHJ1Y3QgcHMzdnJhbV9wcml2ICpwcml2LCB1MzIgZGF0YSkKK3sKKwkqKHByaXYtPmZpZm9fcHRyKSsrID0gZGF0YTsKK30KKworc3RhdGljIHZvaWQgcHMzdnJhbV9iZWdpbl9yaW5nKHN0cnVjdCBwczN2cmFtX3ByaXYgKnByaXYsIHUzMiBjaGFuLAorCQkJCSAgICAgIHUzMiB0YWcsIHUzMiBzaXplKQoreworCXBzM3ZyYW1fb3V0X3JpbmcocHJpdiwgKHNpemUgPDwgMTgpIHwgKGNoYW4gPDwgMTMpIHwgdGFnKTsKK30KKworc3RhdGljIHZvaWQgcHMzdnJhbV9yZXdpbmRfcmluZyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKK3sKKwlzdHJ1Y3QgcHMzdnJhbV9wcml2ICpwcml2ID0gbXRkLT5wcml2OworCXU2NCBzdGF0dXM7CisKKwlwczN2cmFtX291dF9yaW5nKHByaXYsIDB4MjAwMDAwMDAgfCAoRklGT19CQVNFICsgRklGT19PRkZTRVQpKTsKKworCXByaXYtPmN0cmxbQ1RSTF9QVVRdID0gRklGT19CQVNFICsgRklGT19PRkZTRVQ7CisKKwkvKiBhc2tpbmcgdGhlIEhWIGZvciBhIGJsaXQgd2lsbCBraWNrIHRoZSBmaWZvICovCisJc3RhdHVzID0gbHYxX2dwdV9jb250ZXh0X2F0dHJpYnV0ZShwcml2LT5jb250ZXh0X2hhbmRsZSwKKwkJCQkJICAgTDFHUFVfQ09OVEVYVF9BVFRSSUJVVEVfRkJfQkxJVCwKKwkJCQkJICAgMCwgMCwgMCwgMCk7CisJaWYgKHN0YXR1cykKKwkJZGV2X2Vycihwcml2LT5kZXYsICIlczolZDogbHYxX2dwdV9jb250ZXh0X2F0dHJpYnV0ZSBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCisJcHJpdi0+Zmlmb19wdHIgPSBwcml2LT5maWZvX2Jhc2U7Cit9CisKK3N0YXRpYyB2b2lkIHBzM3ZyYW1fZmlyZV9yaW5nKHN0cnVjdCBtdGRfaW5mbyAqbXRkKQoreworCXN0cnVjdCBwczN2cmFtX3ByaXYgKnByaXYgPSBtdGQtPnByaXY7CisJdTY0IHN0YXR1czsKKworCW11dGV4X2xvY2soJnBzM19ncHVfbXV0ZXgpOworCisJcHJpdi0+Y3RybFtDVFJMX1BVVF0gPSBGSUZPX0JBU0UgKyBGSUZPX09GRlNFVCArCisJCShwcml2LT5maWZvX3B0ciAtIHByaXYtPmZpZm9fYmFzZSkgKiBzaXplb2YodTMyKTsKKworCS8qIGFza2luZyB0aGUgSFYgZm9yIGEgYmxpdCB3aWxsIGtpY2sgdGhlIGZpZm8gKi8KKwlzdGF0dXMgPSBsdjFfZ3B1X2NvbnRleHRfYXR0cmlidXRlKHByaXYtPmNvbnRleHRfaGFuZGxlLAorCQkJCQkgICBMMUdQVV9DT05URVhUX0FUVFJJQlVURV9GQl9CTElULAorCQkJCQkgICAwLCAwLCAwLCAwKTsKKwlpZiAoc3RhdHVzKQorCQlkZXZfZXJyKHByaXYtPmRldiwgIiVzOiVkOiBsdjFfZ3B1X2NvbnRleHRfYXR0cmlidXRlIGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlpZiAoKHByaXYtPmZpZm9fcHRyIC0gcHJpdi0+Zmlmb19iYXNlKSAqIHNpemVvZih1MzIpID4KKwkJRklGT19TSVpFIC0gMTAyNCkgeworCQlkZXZfZGJnKHByaXYtPmRldiwgIiVzOiVkOiBmaWZvIGZ1bGwsIHJld2luZGluZ1xuIiwgX19mdW5jX18sCisJCQlfX0xJTkVfXyk7CisJCXBzM3ZyYW1fd2FpdF9yaW5nKG10ZCwgMjAwKTsKKwkJcHMzdnJhbV9yZXdpbmRfcmluZyhtdGQpOworCX0KKworCW11dGV4X3VubG9jaygmcHMzX2dwdV9tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIHBzM3ZyYW1fYmluZChzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKK3sKKwlzdHJ1Y3QgcHMzdnJhbV9wcml2ICpwcml2ID0gbXRkLT5wcml2OworCisJcHMzdnJhbV9iZWdpbl9yaW5nKHByaXYsIFVQTE9BRF9TVUJDSCwgMCwgMSk7CisJcHMzdnJhbV9vdXRfcmluZyhwcml2LCAweDMxMzM3MzAzKTsKKwlwczN2cmFtX2JlZ2luX3JpbmcocHJpdiwgVVBMT0FEX1NVQkNILCAweDE4MCwgMyk7CisJcHMzdnJhbV9vdXRfcmluZyhwcml2LCBETUFfTk9USUZJRVJfSEFORExFX0JBU0UgKyBOT1RJRklFUik7CisJcHMzdnJhbV9vdXRfcmluZyhwcml2LCAweGZlZWQwMDAxKTsJLyogRE1BIHN5c3RlbSBSQU0gaW5zdGFuY2UgKi8KKwlwczN2cmFtX291dF9yaW5nKHByaXYsIDB4ZmVlZDAwMDApOyAgICAgLyogRE1BIHZpZGVvIFJBTSBpbnN0YW5jZSAqLworCisJcHMzdnJhbV9iZWdpbl9yaW5nKHByaXYsIERPV05MT0FEX1NVQkNILCAwLCAxKTsKKwlwczN2cmFtX291dF9yaW5nKHByaXYsIDB4MzEzN2MwZGUpOworCXBzM3ZyYW1fYmVnaW5fcmluZyhwcml2LCBET1dOTE9BRF9TVUJDSCwgMHgxODAsIDMpOworCXBzM3ZyYW1fb3V0X3JpbmcocHJpdiwgRE1BX05PVElGSUVSX0hBTkRMRV9CQVNFICsgTk9USUZJRVIpOworCXBzM3ZyYW1fb3V0X3JpbmcocHJpdiwgMHhmZWVkMDAwMCk7CS8qIERNQSB2aWRlbyBSQU0gaW5zdGFuY2UgKi8KKwlwczN2cmFtX291dF9yaW5nKHByaXYsIDB4ZmVlZDAwMDEpOwkvKiBETUEgc3lzdGVtIFJBTSBpbnN0YW5jZSAqLworCisJcHMzdnJhbV9maXJlX3JpbmcobXRkKTsKK30KKworc3RhdGljIGludCBwczN2cmFtX3VwbG9hZChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdW5zaWduZWQgaW50IHNyY19vZmZzZXQsCisJCQkgIHVuc2lnbmVkIGludCBkc3Rfb2Zmc2V0LCBpbnQgbGVuLCBpbnQgY291bnQpCit7CisJc3RydWN0IHBzM3ZyYW1fcHJpdiAqcHJpdiA9IG10ZC0+cHJpdjsKKworCXBzM3ZyYW1fYmVnaW5fcmluZyhwcml2LCBVUExPQURfU1VCQ0gsCisJCQkgICBOVl9NRU1PUllfVE9fTUVNT1JZX0ZPUk1BVF9PRkZTRVRfSU4sIDgpOworCXBzM3ZyYW1fb3V0X3JpbmcocHJpdiwgWERSX0lPSUYgKyBzcmNfb2Zmc2V0KTsKKwlwczN2cmFtX291dF9yaW5nKHByaXYsIGRzdF9vZmZzZXQpOworCXBzM3ZyYW1fb3V0X3JpbmcocHJpdiwgbGVuKTsKKwlwczN2cmFtX291dF9yaW5nKHByaXYsIGxlbik7CisJcHMzdnJhbV9vdXRfcmluZyhwcml2LCBsZW4pOworCXBzM3ZyYW1fb3V0X3JpbmcocHJpdiwgY291bnQpOworCXBzM3ZyYW1fb3V0X3JpbmcocHJpdiwgKDEgPDwgOCkgfCAxKTsKKwlwczN2cmFtX291dF9yaW5nKHByaXYsIDApOworCisJcHMzdnJhbV9ub3RpZmllcl9yZXNldChtdGQpOworCXBzM3ZyYW1fYmVnaW5fcmluZyhwcml2LCBVUExPQURfU1VCQ0gsCisJCQkgICBOVl9NRU1PUllfVE9fTUVNT1JZX0ZPUk1BVF9OT1RJRlksIDEpOworCXBzM3ZyYW1fb3V0X3JpbmcocHJpdiwgMCk7CisJcHMzdnJhbV9iZWdpbl9yaW5nKHByaXYsIFVQTE9BRF9TVUJDSCwgMHgxMDAsIDEpOworCXBzM3ZyYW1fb3V0X3JpbmcocHJpdiwgMCk7CisJcHMzdnJhbV9maXJlX3JpbmcobXRkKTsKKwlpZiAocHMzdnJhbV9ub3RpZmllcl93YWl0KG10ZCwgMjAwKSA8IDApIHsKKwkJZGV2X2RiZyhwcml2LT5kZXYsICIlczolZDogbm90aWZpZXIgdGltZW91dFxuIiwgX19mdW5jX18sCisJCQlfX0xJTkVfXyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwczN2cmFtX2Rvd25sb2FkKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1bnNpZ25lZCBpbnQgc3JjX29mZnNldCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgZHN0X29mZnNldCwgaW50IGxlbiwgaW50IGNvdW50KQoreworCXN0cnVjdCBwczN2cmFtX3ByaXYgKnByaXYgPSBtdGQtPnByaXY7CisKKwlwczN2cmFtX2JlZ2luX3JpbmcocHJpdiwgRE9XTkxPQURfU1VCQ0gsCisJCQkgICBOVl9NRU1PUllfVE9fTUVNT1JZX0ZPUk1BVF9PRkZTRVRfSU4sIDgpOworCXBzM3ZyYW1fb3V0X3JpbmcocHJpdiwgc3JjX29mZnNldCk7CisJcHMzdnJhbV9vdXRfcmluZyhwcml2LCBYRFJfSU9JRiArIGRzdF9vZmZzZXQpOworCXBzM3ZyYW1fb3V0X3JpbmcocHJpdiwgbGVuKTsKKwlwczN2cmFtX291dF9yaW5nKHByaXYsIGxlbik7CisJcHMzdnJhbV9vdXRfcmluZyhwcml2LCBsZW4pOworCXBzM3ZyYW1fb3V0X3JpbmcocHJpdiwgY291bnQpOworCXBzM3ZyYW1fb3V0X3JpbmcocHJpdiwgKDEgPDwgOCkgfCAxKTsKKwlwczN2cmFtX291dF9yaW5nKHByaXYsIDApOworCisJcHMzdnJhbV9ub3RpZmllcl9yZXNldChtdGQpOworCXBzM3ZyYW1fYmVnaW5fcmluZyhwcml2LCBET1dOTE9BRF9TVUJDSCwKKwkJCSAgIE5WX01FTU9SWV9UT19NRU1PUllfRk9STUFUX05PVElGWSwgMSk7CisJcHMzdnJhbV9vdXRfcmluZyhwcml2LCAwKTsKKwlwczN2cmFtX2JlZ2luX3JpbmcocHJpdiwgRE9XTkxPQURfU1VCQ0gsIDB4MTAwLCAxKTsKKwlwczN2cmFtX291dF9yaW5nKHByaXYsIDApOworCXBzM3ZyYW1fZmlyZV9yaW5nKG10ZCk7CisJaWYgKHBzM3ZyYW1fbm90aWZpZXJfd2FpdChtdGQsIDIwMCkgPCAwKSB7CisJCWRldl9kYmcocHJpdi0+ZGV2LCAiJXM6JWQ6IG5vdGlmaWVyIHRpbWVvdXRcbiIsIF9fZnVuY19fLAorCQkJX19MSU5FX18pOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBzM3ZyYW1fY2FjaGVfZXZpY3Qoc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBlbnRyeSkKK3sKKwlzdHJ1Y3QgcHMzdnJhbV9wcml2ICpwcml2ID0gbXRkLT5wcml2OworCXN0cnVjdCBwczN2cmFtX2NhY2hlICpjYWNoZSA9ICZwcml2LT5jYWNoZTsKKworCWlmIChjYWNoZS0+dGFnc1tlbnRyeV0uZmxhZ3MgJiBDQUNIRV9QQUdFX0RJUlRZKSB7CisJCWRldl9kYmcocHJpdi0+ZGV2LCAiJXM6JWQ6IGZsdXNoaW5nICVkIDogMHglMDh4XG4iLCBfX2Z1bmNfXywKKwkJCV9fTElORV9fLCBlbnRyeSwgY2FjaGUtPnRhZ3NbZW50cnldLmFkZHJlc3MpOworCQlpZiAocHMzdnJhbV91cGxvYWQobXRkLAorCQkJCSAgIENBQ0hFX09GRlNFVCArIGVudHJ5ICogY2FjaGUtPnBhZ2Vfc2l6ZSwKKwkJCQkgICBjYWNoZS0+dGFnc1tlbnRyeV0uYWRkcmVzcywKKwkJCQkgICBETUFfUEFHRV9TSVpFLAorCQkJCSAgIGNhY2hlLT5wYWdlX3NpemUgLyBETUFfUEFHRV9TSVpFKSA8IDApIHsKKwkJCWRldl9kYmcocHJpdi0+ZGV2LCAiJXM6JWQ6IGZhaWxlZCB0byB1cGxvYWQgZnJvbSAiCisJCQkJIjB4JXggdG8gMHgleCBzaXplIDB4JXhcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCQllbnRyeSAqIGNhY2hlLT5wYWdlX3NpemUsCisJCQkJY2FjaGUtPnRhZ3NbZW50cnldLmFkZHJlc3MsIGNhY2hlLT5wYWdlX3NpemUpOworCQl9CisJCWNhY2hlLT50YWdzW2VudHJ5XS5mbGFncyAmPSB+Q0FDSEVfUEFHRV9ESVJUWTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBzM3ZyYW1fY2FjaGVfbG9hZChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IGVudHJ5LAorCQkJICAgICAgIHVuc2lnbmVkIGludCBhZGRyZXNzKQoreworCXN0cnVjdCBwczN2cmFtX3ByaXYgKnByaXYgPSBtdGQtPnByaXY7CisJc3RydWN0IHBzM3ZyYW1fY2FjaGUgKmNhY2hlID0gJnByaXYtPmNhY2hlOworCisJZGV2X2RiZyhwcml2LT5kZXYsICIlczolZDogZmV0Y2hpbmcgJWQgOiAweCUwOHhcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJZW50cnksIGFkZHJlc3MpOworCWlmIChwczN2cmFtX2Rvd25sb2FkKG10ZCwKKwkJCSAgICAgYWRkcmVzcywKKwkJCSAgICAgQ0FDSEVfT0ZGU0VUICsgZW50cnkgKiBjYWNoZS0+cGFnZV9zaXplLAorCQkJICAgICBETUFfUEFHRV9TSVpFLAorCQkJICAgICBjYWNoZS0+cGFnZV9zaXplIC8gRE1BX1BBR0VfU0laRSkgPCAwKSB7CisJCWRldl9lcnIocHJpdi0+ZGV2LCAiJXM6JWQ6IGZhaWxlZCB0byBkb3dubG9hZCBmcm9tICIKKwkJCSIweCV4IHRvIDB4JXggc2l6ZSAweCV4XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGFkZHJlc3MsCisJCQllbnRyeSAqIGNhY2hlLT5wYWdlX3NpemUsIGNhY2hlLT5wYWdlX3NpemUpOworCX0KKworCWNhY2hlLT50YWdzW2VudHJ5XS5hZGRyZXNzID0gYWRkcmVzczsKKwljYWNoZS0+dGFnc1tlbnRyeV0uZmxhZ3MgfD0gQ0FDSEVfUEFHRV9QUkVTRU5UOworfQorCisKK3N0YXRpYyB2b2lkIHBzM3ZyYW1fY2FjaGVfZmx1c2goc3RydWN0IG10ZF9pbmZvICptdGQpCit7CisJc3RydWN0IHBzM3ZyYW1fcHJpdiAqcHJpdiA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgcHMzdnJhbV9jYWNoZSAqY2FjaGUgPSAmcHJpdi0+Y2FjaGU7CisJaW50IGk7CisKKwlkZXZfZGJnKHByaXYtPmRldiwgIiVzOiVkOiBGTFVTSFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlmb3IgKGkgPSAwOyBpIDwgY2FjaGUtPnBhZ2VfY291bnQ7IGkrKykgeworCQlwczN2cmFtX2NhY2hlX2V2aWN0KG10ZCwgaSk7CisJCWNhY2hlLT50YWdzW2ldLmZsYWdzID0gMDsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcHMzdnJhbV9jYWNoZV9tYXRjaChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGFkZHJlc3MpCit7CisJc3RydWN0IHBzM3ZyYW1fcHJpdiAqcHJpdiA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgcHMzdnJhbV9jYWNoZSAqY2FjaGUgPSAmcHJpdi0+Y2FjaGU7CisJdW5zaWduZWQgaW50IGJhc2U7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwlpbnQgaTsKKwlzdGF0aWMgaW50IGNvdW50ZXI7CisKKwlvZmZzZXQgPSAodW5zaWduZWQgaW50KSAoYWRkcmVzcyAmIChjYWNoZS0+cGFnZV9zaXplIC0gMSkpOworCWJhc2UgPSAodW5zaWduZWQgaW50KSAoYWRkcmVzcyAtIG9mZnNldCk7CisKKwkvKiBmdWxseSBhc3NvY2lhdGl2ZSBjaGVjayAqLworCWZvciAoaSA9IDA7IGkgPCBjYWNoZS0+cGFnZV9jb3VudDsgaSsrKSB7CisJCWlmICgoY2FjaGUtPnRhZ3NbaV0uZmxhZ3MgJiBDQUNIRV9QQUdFX1BSRVNFTlQpICYmCisJCSAgICBjYWNoZS0+dGFnc1tpXS5hZGRyZXNzID09IGJhc2UpIHsKKwkJCWRldl9kYmcocHJpdi0+ZGV2LCAiJXM6JWQ6IGZvdW5kIGVudHJ5ICVkIDogMHglMDh4XG4iLAorCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgaSwgY2FjaGUtPnRhZ3NbaV0uYWRkcmVzcyk7CisJCQlyZXR1cm4gaTsKKwkJfQorCX0KKworCS8qIGNob29zZSBhIHJhbmRvbSBlbnRyeSAqLworCWkgPSAoamlmZmllcyArIChjb3VudGVyKyspKSAlIGNhY2hlLT5wYWdlX2NvdW50OworCWRldl9kYmcocHJpdi0+ZGV2LCAiJXM6JWQ6IHVzaW5nIGVudHJ5ICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGkpOworCisJcHMzdnJhbV9jYWNoZV9ldmljdChtdGQsIGkpOworCXBzM3ZyYW1fY2FjaGVfbG9hZChtdGQsIGksIGJhc2UpOworCisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQgcHMzdnJhbV9jYWNoZV9pbml0KHN0cnVjdCBtdGRfaW5mbyAqbXRkKQoreworCXN0cnVjdCBwczN2cmFtX3ByaXYgKnByaXYgPSBtdGQtPnByaXY7CisKKwlwcml2LT5jYWNoZS5wYWdlX2NvdW50ID0gQ0FDSEVfUEFHRV9DT1VOVDsKKwlwcml2LT5jYWNoZS5wYWdlX3NpemUgPSBDQUNIRV9QQUdFX1NJWkU7CisJcHJpdi0+Y2FjaGUudGFncyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwczN2cmFtX3RhZykgKgorCQkJCSAgIENBQ0hFX1BBR0VfQ09VTlQsIEdGUF9LRVJORUwpOworCWlmIChwcml2LT5jYWNoZS50YWdzID09IE5VTEwpIHsKKwkJZGV2X2Vycihwcml2LT5kZXYsICIlczolZDogY291bGQgbm90IGFsbG9jYXRlIGNhY2hlIHRhZ3NcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkZXZfaW5mbyhwcml2LT5kZXYsICJjcmVhdGVkIHJhbSBjYWNoZTogJWQgZW50cmllcywgJWQgS2lCIGVhY2hcbiIsCisJCUNBQ0hFX1BBR0VfQ09VTlQsIENBQ0hFX1BBR0VfU0laRSAvIDEwMjQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBzM3ZyYW1fY2FjaGVfY2xlYW51cChzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKK3sKKwlzdHJ1Y3QgcHMzdnJhbV9wcml2ICpwcml2ID0gbXRkLT5wcml2OworCisJcHMzdnJhbV9jYWNoZV9mbHVzaChtdGQpOworCWtmcmVlKHByaXYtPmNhY2hlLnRhZ3MpOworfQorCitzdGF0aWMgaW50IHBzM3ZyYW1fZXJhc2Uoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBlcmFzZV9pbmZvICppbnN0cikKK3sKKwlzdHJ1Y3QgcHMzdnJhbV9wcml2ICpwcml2ID0gbXRkLT5wcml2OworCisJaWYgKGluc3RyLT5hZGRyICsgaW5zdHItPmxlbiA+IG10ZC0+c2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZwcml2LT5sb2NrKTsKKworCXBzM3ZyYW1fY2FjaGVfZmx1c2gobXRkKTsKKworCS8qIFNldCBieXRlcyB0byAweEZGICovCisJbWVtc2V0X2lvKHByaXYtPmRkcl9iYXNlICsgaW5zdHItPmFkZHIsIDB4RkYsIGluc3RyLT5sZW4pOworCisJbXV0ZXhfdW5sb2NrKCZwcml2LT5sb2NrKTsKKworCWluc3RyLT5zdGF0ZSA9IE1URF9FUkFTRV9ET05FOworCW10ZF9lcmFzZV9jYWxsYmFjayhpbnN0cik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwczN2cmFtX3JlYWQoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLAorCQkJc2l6ZV90ICpyZXRsZW4sIHVfY2hhciAqYnVmKQoreworCXN0cnVjdCBwczN2cmFtX3ByaXYgKnByaXYgPSBtdGQtPnByaXY7CisJdW5zaWduZWQgaW50IGNhY2hlZCwgY291bnQ7CisKKwlkZXZfZGJnKHByaXYtPmRldiwgIiVzOiVkOiBmcm9tPTB4JTA4eCBsZW49MHglenhcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJKHVuc2lnbmVkIGludClmcm9tLCBsZW4pOworCisJaWYgKGZyb20gPj0gbXRkLT5zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChsZW4gPiBtdGQtPnNpemUgLSBmcm9tKQorCQlsZW4gPSBtdGQtPnNpemUgLSBmcm9tOworCisJLyogQ29weSBmcm9tIHZyYW0gdG8gYnVmICovCisJY291bnQgPSBsZW47CisJd2hpbGUgKGNvdW50KSB7CisJCXVuc2lnbmVkIGludCBvZmZzZXQsIGF2YWlsOworCQl1bnNpZ25lZCBpbnQgZW50cnk7CisKKwkJb2Zmc2V0ID0gKHVuc2lnbmVkIGludCkgKGZyb20gJiAocHJpdi0+Y2FjaGUucGFnZV9zaXplIC0gMSkpOworCQlhdmFpbCAgPSBwcml2LT5jYWNoZS5wYWdlX3NpemUgLSBvZmZzZXQ7CisKKwkJbXV0ZXhfbG9jaygmcHJpdi0+bG9jayk7CisKKwkJZW50cnkgPSBwczN2cmFtX2NhY2hlX21hdGNoKG10ZCwgZnJvbSk7CisJCWNhY2hlZCA9IENBQ0hFX09GRlNFVCArIGVudHJ5ICogcHJpdi0+Y2FjaGUucGFnZV9zaXplICsgb2Zmc2V0OworCisJCWRldl9kYmcocHJpdi0+ZGV2LCAiJXM6JWQ6IGZyb209JTA4eCBjYWNoZWQ9JTA4eCBvZmZzZXQ9JTA4eCAiCisJCQkiYXZhaWw9JTA4eCBjb3VudD0lMDh4XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCQkodW5zaWduZWQgaW50KWZyb20sIGNhY2hlZCwgb2Zmc2V0LCBhdmFpbCwgY291bnQpOworCisJCWlmIChhdmFpbCA+IGNvdW50KQorCQkJYXZhaWwgPSBjb3VudDsKKwkJbWVtY3B5KGJ1ZiwgcHJpdi0+eGRyX2J1ZiArIGNhY2hlZCwgYXZhaWwpOworCisJCW11dGV4X3VubG9jaygmcHJpdi0+bG9jayk7CisKKwkJYnVmICs9IGF2YWlsOworCQljb3VudCAtPSBhdmFpbDsKKwkJZnJvbSArPSBhdmFpbDsKKwl9CisKKwkqcmV0bGVuID0gbGVuOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBzM3ZyYW1fd3JpdGUoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCB0bywgc2l6ZV90IGxlbiwKKwkJCSBzaXplX3QgKnJldGxlbiwgY29uc3QgdV9jaGFyICpidWYpCit7CisJc3RydWN0IHBzM3ZyYW1fcHJpdiAqcHJpdiA9IG10ZC0+cHJpdjsKKwl1bnNpZ25lZCBpbnQgY2FjaGVkLCBjb3VudDsKKworCWlmICh0byA+PSBtdGQtPnNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGxlbiA+IG10ZC0+c2l6ZSAtIHRvKQorCQlsZW4gPSBtdGQtPnNpemUgLSB0bzsKKworCS8qIENvcHkgZnJvbSBidWYgdG8gdnJhbSAqLworCWNvdW50ID0gbGVuOworCXdoaWxlIChjb3VudCkgeworCQl1bnNpZ25lZCBpbnQgb2Zmc2V0LCBhdmFpbDsKKwkJdW5zaWduZWQgaW50IGVudHJ5OworCisJCW9mZnNldCA9ICh1bnNpZ25lZCBpbnQpICh0byAmIChwcml2LT5jYWNoZS5wYWdlX3NpemUgLSAxKSk7CisJCWF2YWlsICA9IHByaXYtPmNhY2hlLnBhZ2Vfc2l6ZSAtIG9mZnNldDsKKworCQltdXRleF9sb2NrKCZwcml2LT5sb2NrKTsKKworCQllbnRyeSA9IHBzM3ZyYW1fY2FjaGVfbWF0Y2gobXRkLCB0byk7CisJCWNhY2hlZCA9IENBQ0hFX09GRlNFVCArIGVudHJ5ICogcHJpdi0+Y2FjaGUucGFnZV9zaXplICsgb2Zmc2V0OworCisJCWRldl9kYmcocHJpdi0+ZGV2LCAiJXM6JWQ6IHRvPSUwOHggY2FjaGVkPSUwOHggb2Zmc2V0PSUwOHggIgorCQkJImF2YWlsPSUwOHggY291bnQ9JTA4eFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkJKHVuc2lnbmVkIGludCl0bywgY2FjaGVkLCBvZmZzZXQsIGF2YWlsLCBjb3VudCk7CisKKwkJaWYgKGF2YWlsID4gY291bnQpCisJCQlhdmFpbCA9IGNvdW50OworCQltZW1jcHkocHJpdi0+eGRyX2J1ZiArIGNhY2hlZCwgYnVmLCBhdmFpbCk7CisKKwkJcHJpdi0+Y2FjaGUudGFnc1tlbnRyeV0uZmxhZ3MgfD0gQ0FDSEVfUEFHRV9ESVJUWTsKKworCQltdXRleF91bmxvY2soJnByaXYtPmxvY2spOworCisJCWJ1ZiArPSBhdmFpbDsKKwkJY291bnQgLT0gYXZhaWw7CisJCXRvICs9IGF2YWlsOworCX0KKworCSpyZXRsZW4gPSBsZW47CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHBzM3ZyYW1fcHJvYmUoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBwczN2cmFtX3ByaXYgKnByaXY7CisJaW50IHN0YXR1czsKKwl1NjQgZGRyX2xwYXI7CisJdTY0IGN0cmxfbHBhcjsKKwl1NjQgaW5mb19scGFyOworCXU2NCByZXBvcnRzX2xwYXI7CisJdTY0IGRkcl9zaXplOworCXU2NCByZXBvcnRzX3NpemU7CisJaW50IHJldCA9IC1FTk9NRU07CisJY2hhciAqcmVzdDsKKworCXJldCA9IC1FSU87CisJcHMzdnJhbV9tdGQucHJpdiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwczN2cmFtX3ByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBzM3ZyYW1fbXRkLnByaXYpCisJCWdvdG8gb3V0OworCXByaXYgPSBwczN2cmFtX210ZC5wcml2OworCisJbXV0ZXhfaW5pdCgmcHJpdi0+bG9jayk7CisJcHJpdi0+ZGV2ID0gJmRldi0+Y29yZTsKKworCS8qIEFsbG9jYXRlIFhEUiBidWZmZXIgKDFNaUIgYWxpZ25lZCkgKi8KKwlwcml2LT54ZHJfYnVmID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsCisJCWdldF9vcmRlcihYRFJfQlVGX1NJWkUpKTsKKwlpZiAocHJpdi0+eGRyX2J1ZiA9PSBOVUxMKSB7CisJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBjb3VsZCBub3QgYWxsb2NhdGUgWERSIGJ1ZmZlclxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2ZyZWVfcHJpdjsKKwl9CisKKwkvKiBQdXQgRklGTyBhdCBiZWdnaW5uaW5nIG9mIFhEUiBidWZmZXIgKi8KKwlwcml2LT5maWZvX2Jhc2UgPSAodTMyICopIChwcml2LT54ZHJfYnVmICsgRklGT19PRkZTRVQpOworCXByaXYtPmZpZm9fcHRyID0gcHJpdi0+Zmlmb19iYXNlOworCisJLyogWFhYOiBOZWVkIHRvIG9wZW4gR1BVLCBpbiBjYXNlIHBzM2ZiIG9yIHNuZF9wczMgYXJlbid0IGxvYWRlZCAqLworCWlmIChwczNfb3Blbl9odl9kZXZpY2UoZGV2KSkgeworCQlkZXZfZXJyKCZkZXYtPmNvcmUsICIlczolZDogcHMzX29wZW5faHZfZGV2aWNlIGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCXJldCA9IC1FQUdBSU47CisJCWdvdG8gb3V0X2Nsb3NlX2dwdTsKKwl9CisKKwkvKiBSZXF1ZXN0IG1lbW9yeSAqLworCXN0YXR1cyA9IC0xOworCWRkcl9zaXplID0gbWVtcGFyc2Uoc2l6ZSwgJnJlc3QpOworCWlmICgqcmVzdCA9PSAnLScpCisJCWRkcl9zaXplIC09IHBzM2ZiX3ZpZGVvbWVtb3J5LnNpemU7CisJZGRyX3NpemUgPSBBTElHTihkZHJfc2l6ZSwgMTAyNCoxMDI0KTsKKwlpZiAoZGRyX3NpemUgPD0gMCkgeworCQlkZXZfZXJyKCZkZXYtPmNvcmUsICIlczolZDogc3BlY2lmaWVkIHNpemUgaXMgdG9vIHNtYWxsXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXRfY2xvc2VfZ3B1OworCX0KKworCXdoaWxlIChkZHJfc2l6ZSA+IDApIHsKKwkJc3RhdHVzID0gbHYxX2dwdV9tZW1vcnlfYWxsb2NhdGUoZGRyX3NpemUsIDAsIDAsIDAsIDAsCisJCQkJCQkgJnByaXYtPm1lbW9yeV9oYW5kbGUsCisJCQkJCQkgJmRkcl9scGFyKTsKKwkJaWYgKCFzdGF0dXMpCisJCQlicmVhazsKKwkJZGRyX3NpemUgLT0gMTAyNCoxMDI0OworCX0KKwlpZiAoc3RhdHVzIHx8IGRkcl9zaXplIDw9IDApIHsKKwkJZGV2X2VycigmZGV2LT5jb3JlLCAiJXM6JWQ6IGx2MV9ncHVfbWVtb3J5X2FsbG9jYXRlIGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2ZyZWVfeGRyX2J1ZjsKKwl9CisKKwkvKiBSZXF1ZXN0IGNvbnRleHQgKi8KKwlzdGF0dXMgPSBsdjFfZ3B1X2NvbnRleHRfYWxsb2NhdGUocHJpdi0+bWVtb3J5X2hhbmRsZSwKKwkJCQkJICAwLAorCQkJCQkgICZwcml2LT5jb250ZXh0X2hhbmRsZSwKKwkJCQkJICAmY3RybF9scGFyLAorCQkJCQkgICZpbmZvX2xwYXIsCisJCQkJCSAgJnJlcG9ydHNfbHBhciwKKwkJCQkJICAmcmVwb3J0c19zaXplKTsKKwlpZiAoc3RhdHVzKSB7CisJCWRldl9lcnIoJmRldi0+Y29yZSwgIiVzOiVkOiBsdjFfZ3B1X2NvbnRleHRfYWxsb2NhdGUgZmFpbGVkXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfZnJlZV9tZW1vcnk7CisJfQorCisJLyogTWFwIFhEUiBidWZmZXIgdG8gUlNYICovCisJc3RhdHVzID0gbHYxX2dwdV9jb250ZXh0X2lvbWFwKHByaXYtPmNvbnRleHRfaGFuZGxlLCBYRFJfSU9JRiwKKwkJCQkgICAgICAgcHMzX21tX3BoeXNfdG9fbHBhcihfX3BhKHByaXYtPnhkcl9idWYpKSwKKwkJCQkgICAgICAgWERSX0JVRl9TSVpFLCAwKTsKKwlpZiAoc3RhdHVzKSB7CisJCWRldl9lcnIoJmRldi0+Y29yZSwgIiVzOiVkOiBsdjFfZ3B1X2NvbnRleHRfaW9tYXAgZmFpbGVkXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfZnJlZV9jb250ZXh0OworCX0KKworCXByaXYtPmRkcl9iYXNlID0gaW9yZW1hcF9mbGFncyhkZHJfbHBhciwgZGRyX3NpemUsIF9QQUdFX05PX0NBQ0hFKTsKKworCWlmICghcHJpdi0+ZGRyX2Jhc2UpIHsKKwkJZGV2X2VycigmZGV2LT5jb3JlLCAiJXM6JWQ6IGlvcmVtYXAgZmFpbGVkXG4iLCBfX2Z1bmNfXywKKwkJCV9fTElORV9fKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfZnJlZV9jb250ZXh0OworCX0KKworCXByaXYtPmN0cmwgPSBpb3JlbWFwKGN0cmxfbHBhciwgNjQgKiAxMDI0KTsKKwlpZiAoIXByaXYtPmN0cmwpIHsKKwkJZGV2X2VycigmZGV2LT5jb3JlLCAiJXM6JWQ6IGlvcmVtYXAgZmFpbGVkXG4iLCBfX2Z1bmNfXywKKwkJCV9fTElORV9fKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfdW5tYXBfdnJhbTsKKwl9CisKKwlwcml2LT5yZXBvcnRzID0gaW9yZW1hcChyZXBvcnRzX2xwYXIsIHJlcG9ydHNfc2l6ZSk7CisJaWYgKCFwcml2LT5yZXBvcnRzKSB7CisJCWRldl9lcnIoJmRldi0+Y29yZSwgIiVzOiVkOiBpb3JlbWFwIGZhaWxlZFxuIiwgX19mdW5jX18sCisJCQlfX0xJTkVfXyk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X3VubWFwX2N0cmw7CisJfQorCisJbXV0ZXhfbG9jaygmcHMzX2dwdV9tdXRleCk7CisJcHMzdnJhbV9pbml0X3JpbmcoJnBzM3ZyYW1fbXRkKTsKKwltdXRleF91bmxvY2soJnBzM19ncHVfbXV0ZXgpOworCisJcHMzdnJhbV9tdGQubmFtZSA9ICJwczN2cmFtIjsKKwlwczN2cmFtX210ZC5zaXplID0gZGRyX3NpemU7CisJcHMzdnJhbV9tdGQuZmxhZ3MgPSBNVERfQ0FQX1JBTTsKKwlwczN2cmFtX210ZC5lcmFzZSA9IHBzM3ZyYW1fZXJhc2U7CisJcHMzdnJhbV9tdGQucG9pbnQgPSBOVUxMOworCXBzM3ZyYW1fbXRkLnVucG9pbnQgPSBOVUxMOworCXBzM3ZyYW1fbXRkLnJlYWQgPSBwczN2cmFtX3JlYWQ7CisJcHMzdnJhbV9tdGQud3JpdGUgPSBwczN2cmFtX3dyaXRlOworCXBzM3ZyYW1fbXRkLm93bmVyID0gVEhJU19NT0RVTEU7CisJcHMzdnJhbV9tdGQudHlwZSA9IE1URF9SQU07CisJcHMzdnJhbV9tdGQuZXJhc2VzaXplID0gQ0FDSEVfUEFHRV9TSVpFOworCXBzM3ZyYW1fbXRkLndyaXRlc2l6ZSA9IDE7CisKKwlwczN2cmFtX2JpbmQoJnBzM3ZyYW1fbXRkKTsKKworCW11dGV4X2xvY2soJnBzM19ncHVfbXV0ZXgpOworCXJldCA9IHBzM3ZyYW1fd2FpdF9yaW5nKCZwczN2cmFtX210ZCwgMTAwKTsKKwltdXRleF91bmxvY2soJnBzM19ncHVfbXV0ZXgpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmRldi0+Y29yZSwgIiVzOiVkOiBmYWlsZWQgdG8gaW5pdGlhbGl6ZSBjaGFubmVsc1xuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCXJldCA9IC1FVElNRURPVVQ7CisJCWdvdG8gb3V0X3VubWFwX3JlcG9ydHM7CisJfQorCisJcHMzdnJhbV9jYWNoZV9pbml0KCZwczN2cmFtX210ZCk7CisKKwlpZiAoYWRkX210ZF9kZXZpY2UoJnBzM3ZyYW1fbXRkKSkgeworCQlkZXZfZXJyKCZkZXYtPmNvcmUsICIlczolZDogYWRkX210ZF9kZXZpY2UgZmFpbGVkXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJcmV0ID0gLUVBR0FJTjsKKwkJZ290byBvdXRfY2FjaGVfY2xlYW51cDsKKwl9CisKKwlkZXZfaW5mbygmZGV2LT5jb3JlLCAicmVzZXJ2ZWQgJXUgTWlCIG9mIGdwdSBtZW1vcnlcbiIsCisJCSh1bnNpZ25lZCBpbnQpKGRkcl9zaXplIC8gMTAyNCAvIDEwMjQpKTsKKworCXJldHVybiAwOworCitvdXRfY2FjaGVfY2xlYW51cDoKKwlwczN2cmFtX2NhY2hlX2NsZWFudXAoJnBzM3ZyYW1fbXRkKTsKK291dF91bm1hcF9yZXBvcnRzOgorCWlvdW5tYXAocHJpdi0+cmVwb3J0cyk7CitvdXRfdW5tYXBfY3RybDoKKwlpb3VubWFwKHByaXYtPmN0cmwpOworb3V0X3VubWFwX3ZyYW06CisJaW91bm1hcChwcml2LT5kZHJfYmFzZSk7CitvdXRfZnJlZV9jb250ZXh0OgorCWx2MV9ncHVfY29udGV4dF9mcmVlKHByaXYtPmNvbnRleHRfaGFuZGxlKTsKK291dF9mcmVlX21lbW9yeToKKwlsdjFfZ3B1X21lbW9yeV9mcmVlKHByaXYtPm1lbW9yeV9oYW5kbGUpOworb3V0X2Nsb3NlX2dwdToKKwlwczNfY2xvc2VfaHZfZGV2aWNlKGRldik7CitvdXRfZnJlZV94ZHJfYnVmOgorCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIHByaXYtPnhkcl9idWYsIGdldF9vcmRlcihYRFJfQlVGX1NJWkUpKTsKK291dF9mcmVlX3ByaXY6CisJa2ZyZWUocHMzdnJhbV9tdGQucHJpdik7CisJcHMzdnJhbV9tdGQucHJpdiA9IE5VTEw7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwczN2cmFtX3NodXRkb3duKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcHMzdnJhbV9wcml2ICpwcml2OworCisJcHJpdiA9IHBzM3ZyYW1fbXRkLnByaXY7CisKKwlkZWxfbXRkX2RldmljZSgmcHMzdnJhbV9tdGQpOworCXBzM3ZyYW1fY2FjaGVfY2xlYW51cCgmcHMzdnJhbV9tdGQpOworCWlvdW5tYXAocHJpdi0+cmVwb3J0cyk7CisJaW91bm1hcChwcml2LT5jdHJsKTsKKwlpb3VubWFwKHByaXYtPmRkcl9iYXNlKTsKKwlsdjFfZ3B1X2NvbnRleHRfZnJlZShwcml2LT5jb250ZXh0X2hhbmRsZSk7CisJbHYxX2dwdV9tZW1vcnlfZnJlZShwcml2LT5tZW1vcnlfaGFuZGxlKTsKKwlwczNfY2xvc2VfaHZfZGV2aWNlKGRldik7CisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgcHJpdi0+eGRyX2J1ZiwgZ2V0X29yZGVyKFhEUl9CVUZfU0laRSkpOworCWtmcmVlKHByaXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RyaXZlciBwczN2cmFtX2RyaXZlciA9IHsKKwkubWF0Y2hfaWQJPSBQUzNfTUFUQ0hfSURfR1BVLAorCS5tYXRjaF9zdWJfaWQJPSBQUzNfTUFUQ0hfU1VCX0lEX0dQVV9SQU1ESVNLLAorCS5jb3JlLm5hbWUJPSBERVZJQ0VfTkFNRSwKKwkuY29yZS5vd25lcgk9IFRISVNfTU9EVUxFLAorCS5wcm9iZQkJPSBwczN2cmFtX3Byb2JlLAorCS5yZW1vdmUJCT0gcHMzdnJhbV9zaHV0ZG93biwKKwkuc2h1dGRvd24JPSBwczN2cmFtX3NodXRkb3duLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcHMzdnJhbV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBzM19zeXN0ZW1fYnVzX2RyaXZlcl9yZWdpc3RlcigmcHMzdnJhbV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcHMzdnJhbV9leGl0KHZvaWQpCit7CisJcHMzX3N5c3RlbV9idXNfZHJpdmVyX3VucmVnaXN0ZXIoJnBzM3ZyYW1fZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocHMzdnJhbV9pbml0KTsKK21vZHVsZV9leGl0KHBzM3ZyYW1fZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkppbSBQYXJpcyA8amltQGp0YW4uY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNVEQgZHJpdmVyIGZvciBQUzMgdmlkZW8gUkFNIik7CitNT0RVTEVfQUxJQVMoUFMzX01PRFVMRV9BTElBU19HUFVfUkFNRElTSyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL2ludGVncmF0b3ItZmxhc2guYyBiL2RyaXZlcnMvbXRkL21hcHMvaW50ZWdyYXRvci1mbGFzaC5jCmluZGV4IDcxMDBlZTMuLmQyZWMyNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvaW50ZWdyYXRvci1mbGFzaC5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvaW50ZWdyYXRvci1mbGFzaC5jCkBAIC0xMDUsNyArMTA1LDcgQEAKIAlpbmZvLT5tYXAuYmFua3dpZHRoCT0gcGxhdC0+d2lkdGg7CiAJaW5mby0+bWFwLnBoeXMJCT0gcmVzLT5zdGFydDsKIAlpbmZvLT5tYXAudmlydAkJPSBiYXNlOwotCWluZm8tPm1hcC5uYW1lCQk9IGRldi0+ZGV2LmJ1c19pZDsKKwlpbmZvLT5tYXAubmFtZQkJPSBkZXZfbmFtZSgmZGV2LT5kZXYpOwogCWluZm8tPm1hcC5zZXRfdnBwCT0gYXJtZmxhc2hfc2V0X3ZwcDsKIAogCXNpbXBsZV9tYXBfaW5pdCgmaW5mby0+bWFwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvaXhwMjAwMC5jIGIvZHJpdmVycy9tdGQvbWFwcy9peHAyMDAwLmMKaW5kZXggM2VhMWRlOS4uZDRmYjlhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9peHAyMDAwLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9peHAyMDAwLmMKQEAgLTE4OCw3ICsxODgsNyBAQAogIAkgKi8KIAlpbmZvLT5tYXAubWFwX3ByaXZfMiA9ICh1bnNpZ25lZCBsb25nKSBpeHBfZGF0YS0+YmFua19zZXR1cDsKIAotCWluZm8tPm1hcC5uYW1lID0gZGV2LT5kZXYuYnVzX2lkOworCWluZm8tPm1hcC5uYW1lID0gZGV2X25hbWUoJmRldi0+ZGV2KTsKIAlpbmZvLT5tYXAucmVhZCA9IGl4cDIwMDBfZmxhc2hfcmVhZDg7CiAJaW5mby0+bWFwLndyaXRlID0gaXhwMjAwMF9mbGFzaF93cml0ZTg7CiAJaW5mby0+bWFwLmNvcHlfZnJvbSA9IGl4cDIwMDBfZmxhc2hfY29weV9mcm9tOwpAQCAtMTk2LDcgKzE5Niw3IEBACiAKIAlpbmZvLT5yZXMgPSByZXF1ZXN0X21lbV9yZWdpb24oZGV2LT5yZXNvdXJjZS0+c3RhcnQsCiAJCQlkZXYtPnJlc291cmNlLT5lbmQgLSBkZXYtPnJlc291cmNlLT5zdGFydCArIDEsCi0JCQlkZXYtPmRldi5idXNfaWQpOworCQkJZGV2X25hbWUoJmRldi0+ZGV2KSk7CiAJaWYgKCFpbmZvLT5yZXMpIHsKIAkJZGV2X2VycigmZGV2LT5kZXYsICJDb3VsZCBub3QgcmVzZXJ2ZSBtZW1vcnkgcmVnaW9uXG4iKTsKIAkJZXJyID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvaXhwNHh4LmMgYi9kcml2ZXJzL210ZC9tYXBzL2l4cDR4eC5jCmluZGV4IDE2NTU1Y2IuLjcyMTRiODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvaXhwNHh4LmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9peHA0eHguYwpAQCAtMjE4LDcgKzIxOCw3IEBACiAJICogaGFuZGxlIHRoYXQuCiAJICovCiAJaW5mby0+bWFwLmJhbmt3aWR0aCA9IDI7Ci0JaW5mby0+bWFwLm5hbWUgPSBkZXYtPmRldi5idXNfaWQ7CisJaW5mby0+bWFwLm5hbWUgPSBkZXZfbmFtZSgmZGV2LT5kZXYpOwogCWluZm8tPm1hcC5yZWFkID0gaXhwNHh4X3JlYWQxNiwKIAlpbmZvLT5tYXAud3JpdGUgPSBpeHA0eHhfcHJvYmVfd3JpdGUxNiwKIAlpbmZvLT5tYXAuY29weV9mcm9tID0gaXhwNHh4X2NvcHlfZnJvbSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvb21hcF9ub3IuYyBiL2RyaXZlcnMvbXRkL21hcHMvb21hcF9ub3IuYwppbmRleCAwNWYyNzZhLi43ZTUwZTliIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL29tYXBfbm9yLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9vbWFwX25vci5jCkBAIC0xMDEsNyArMTAxLDcgQEAKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBvdXRfcmVsZWFzZV9tZW1fcmVnaW9uOwogCX0KLQlpbmZvLT5tYXAubmFtZQkJPSBwZGV2LT5kZXYuYnVzX2lkOworCWluZm8tPm1hcC5uYW1lCQk9IGRldl9uYW1lKCZwZGV2LT5kZXYpOwogCWluZm8tPm1hcC5waHlzCQk9IHJlcy0+c3RhcnQ7CiAJaW5mby0+bWFwLnNpemUJCT0gc2l6ZTsKIAlpbmZvLT5tYXAuYmFua3dpZHRoCT0gcGRhdGEtPndpZHRoOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9waHlzbWFwLmMgYi9kcml2ZXJzL210ZC9tYXBzL3BoeXNtYXAuYwppbmRleCBkZmJmM2YyLi4xZGIxNmU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL3BoeXNtYXAuYworKysgYi9kcml2ZXJzL210ZC9tYXBzL3BoeXNtYXAuYwpAQCAtMTA4LDEzICsxMDgsMTMgQEAKIAkJaWYgKCFkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbigmZGV2LT5kZXYsCiAJCQlkZXYtPnJlc291cmNlW2ldLnN0YXJ0LAogCQkJZGV2LT5yZXNvdXJjZVtpXS5lbmQgLSBkZXYtPnJlc291cmNlW2ldLnN0YXJ0ICsgMSwKLQkJCWRldi0+ZGV2LmJ1c19pZCkpIHsKKwkJCWRldl9uYW1lKCZkZXYtPmRldikpKSB7CiAJCQlkZXZfZXJyKCZkZXYtPmRldiwgIkNvdWxkIG5vdCByZXNlcnZlIG1lbW9yeSByZWdpb25cbiIpOwogCQkJZXJyID0gLUVOT01FTTsKIAkJCWdvdG8gZXJyX291dDsKIAkJfQogCi0JCWluZm8tPm1hcFtpXS5uYW1lID0gZGV2LT5kZXYuYnVzX2lkOworCQlpbmZvLT5tYXBbaV0ubmFtZSA9IGRldl9uYW1lKCZkZXYtPmRldik7CiAJCWluZm8tPm1hcFtpXS5waHlzID0gZGV2LT5yZXNvdXJjZVtpXS5zdGFydDsKIAkJaW5mby0+bWFwW2ldLnNpemUgPSBkZXYtPnJlc291cmNlW2ldLmVuZCAtIGRldi0+cmVzb3VyY2VbaV0uc3RhcnQgKyAxOwogCQlpbmZvLT5tYXBbaV0uYmFua3dpZHRoID0gcGh5c21hcF9kYXRhLT53aWR0aDsKQEAgLTE1MCw3ICsxNTAsNyBAQAogCQkgKiBXZSBkZXRlY3RlZCBtdWx0aXBsZSBkZXZpY2VzLiBDb25jYXRlbmF0ZSB0aGVtIHRvZ2V0aGVyLgogCQkgKi8KICNpZmRlZiBDT05GSUdfTVREX0NPTkNBVAotCQlpbmZvLT5jbXRkID0gbXRkX2NvbmNhdF9jcmVhdGUoaW5mby0+bXRkLCBkZXZpY2VzX2ZvdW5kLCBkZXYtPmRldi5idXNfaWQpOworCQlpbmZvLT5jbXRkID0gbXRkX2NvbmNhdF9jcmVhdGUoaW5mby0+bXRkLCBkZXZpY2VzX2ZvdW5kLCBkZXZfbmFtZSgmZGV2LT5kZXYpKTsKIAkJaWYgKGluZm8tPmNtdGQgPT0gTlVMTCkKIAkJCWVyciA9IC1FTlhJTzsKICNlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL3BoeXNtYXBfb2YuYyBiL2RyaXZlcnMvbXRkL21hcHMvcGh5c21hcF9vZi5jCmluZGV4IDVmY2ZlYzAuLmZiZjBjYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvcGh5c21hcF9vZi5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvcGh5c21hcF9vZi5jCkBAIC0xODMsNyArMTgzLDcgQEAKIAogCWVyciA9IC1FQlVTWTsKIAlpbmZvLT5yZXMgPSByZXF1ZXN0X21lbV9yZWdpb24ocmVzLnN0YXJ0LCByZXMuZW5kIC0gcmVzLnN0YXJ0ICsgMSwKLQkJCQkgICAgICAgZGV2LT5kZXYuYnVzX2lkKTsKKwkJCQkgICAgICAgZGV2X25hbWUoJmRldi0+ZGV2KSk7CiAJaWYgKCFpbmZvLT5yZXMpCiAJCWdvdG8gZXJyX291dDsKIApAQCAtMTk0LDcgKzE5NCw3IEBACiAJCWdvdG8gZXJyX291dDsKIAl9CiAKLQlpbmZvLT5tYXAubmFtZSA9IGRldi0+ZGV2LmJ1c19pZDsKKwlpbmZvLT5tYXAubmFtZSA9IGRldl9uYW1lKCZkZXYtPmRldik7CiAJaW5mby0+bWFwLnBoeXMgPSByZXMuc3RhcnQ7CiAJaW5mby0+bWFwLnNpemUgPSByZXMuZW5kIC0gcmVzLnN0YXJ0ICsgMTsKIAlpbmZvLT5tYXAuYmFua3dpZHRoID0gKndpZHRoOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbXRkY29uY2F0LmMgYi9kcml2ZXJzL210ZC9tdGRjb25jYXQuYwppbmRleCA3ODk4NDJkLi4xYTA1Y2YzIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tdGRjb25jYXQuYworKysgYi9kcml2ZXJzL210ZC9tdGRjb25jYXQuYwpAQCAtNjkxLDcgKzY5MSw3IEBACiAgKi8KIHN0cnVjdCBtdGRfaW5mbyAqbXRkX2NvbmNhdF9jcmVhdGUoc3RydWN0IG10ZF9pbmZvICpzdWJkZXZbXSwJLyogc3ViZGV2aWNlcyB0byBjb25jYXRlbmF0ZSAqLwogCQkJCSAgIGludCBudW1fZGV2cywJLyogbnVtYmVyIG9mIHN1YmRldmljZXMgICAgICAqLwotCQkJCSAgIGNoYXIgKm5hbWUpCisJCQkJICAgY29uc3QgY2hhciAqbmFtZSkKIHsJCQkJLyogbmFtZSBmb3IgdGhlIG5ldyBkZXZpY2UgICAqLwogCWludCBpOwogCXNpemVfdCBzaXplOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9mc2xfdXBtLmMgYi9kcml2ZXJzL210ZC9uYW5kL2ZzbF91cG0uYwppbmRleCBhODMxOTJmLi43ODE1YTQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL2ZzbF91cG0uYworKysgYi9kcml2ZXJzL210ZC9uYW5kL2ZzbF91cG0uYwpAQCAtMjIyLDcgKzIyMiw3IEBACiAKIAlmdW4tPnJuYl9ncGlvID0gb2ZfZ2V0X2dwaW8ob2ZkZXYtPm5vZGUsIDApOwogCWlmIChmdW4tPnJuYl9ncGlvID49IDApIHsKLQkJcmV0ID0gZ3Bpb19yZXF1ZXN0KGZ1bi0+cm5iX2dwaW8sIG9mZGV2LT5kZXYuYnVzX2lkKTsKKwkJcmV0ID0gZ3Bpb19yZXF1ZXN0KGZ1bi0+cm5iX2dwaW8sIGRldl9uYW1lKCZvZmRldi0+ZGV2KSk7CiAJCWlmIChyZXQpIHsKIAkJCWRldl9lcnIoJm9mZGV2LT5kZXYsICJjYW4ndCByZXF1ZXN0IFJOQiBncGlvXG4iKTsKIAkJCWdvdG8gZXJyMjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvcGxhdF9uYW5kLmMgYi9kcml2ZXJzL210ZC9uYW5kL3BsYXRfbmFuZC5jCmluZGV4IGY2NzRjNTQuLjc1ZjlmNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvcGxhdF9uYW5kLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9wbGF0X25hbmQuYwpAQCAtNTQsNyArNTQsNyBAQAogCWRhdGEtPmNoaXAucHJpdiA9ICZkYXRhOwogCWRhdGEtPm10ZC5wcml2ID0gJmRhdGEtPmNoaXA7CiAJZGF0YS0+bXRkLm93bmVyID0gVEhJU19NT0RVTEU7Ci0JZGF0YS0+bXRkLm5hbWUgPSBwZGV2LT5kZXYuYnVzX2lkOworCWRhdGEtPm10ZC5uYW1lID0gZGV2X25hbWUoJnBkZXYtPmRldik7CiAKIAlkYXRhLT5jaGlwLklPX0FERFJfUiA9IGRhdGEtPmlvX2Jhc2U7CiAJZGF0YS0+Y2hpcC5JT19BRERSX1cgPSBkYXRhLT5pb19iYXNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC90bWlvX25hbmQuYyBiL2RyaXZlcnMvbXRkL25hbmQvdG1pb19uYW5kLmMKaW5kZXggZWRiMWUzMi4uZGFhNmE0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC90bWlvX25hbmQuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL3RtaW9fbmFuZC5jCkBAIC00MzMsNyArNDMzLDcgQEAKIAluYW5kX2NoaXAtPmNoaXBfZGVsYXkgPSAxNTsKIAogCXJldHZhbCA9IHJlcXVlc3RfaXJxKGlycSwgJnRtaW9faXJxLAotCQkJCUlSUUZfRElTQUJMRUQsIGRldi0+ZGV2LmJ1c19pZCwgdG1pbyk7CisJCQkJSVJRRl9ESVNBQkxFRCwgZGV2X25hbWUoJmRldi0+ZGV2KSwgdG1pbyk7CiAJaWYgKHJldHZhbCkgewogCQlkZXZfZXJyKCZkZXYtPmRldiwgInJlcXVlc3RfaXJxIGVycm9yICVkXG4iLCByZXR2YWwpOwogCQlnb3RvIGVycl9pcnE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9vbmVuYW5kL2dlbmVyaWMuYyBiL2RyaXZlcnMvbXRkL29uZW5hbmQvZ2VuZXJpYy5jCmluZGV4IGFkODFhYjguLjViNjllNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL29uZW5hbmQvZ2VuZXJpYy5jCisrKyBiL2RyaXZlcnMvbXRkL29uZW5hbmQvZ2VuZXJpYy5jCkBAIC02Myw3ICs2Myw3IEBACiAJaW5mby0+b25lbmFuZC5tbWNvbnRyb2wgPSBwZGF0YS0+bW1jb250cm9sOwogCWluZm8tPm9uZW5hbmQuaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKIAotCWluZm8tPm10ZC5uYW1lID0gcGRldi0+ZGV2LmJ1c19pZDsKKwlpbmZvLT5tdGQubmFtZSA9IGRldl9uYW1lKCZwZGV2LT5kZXYpOwogCWluZm8tPm10ZC5wcml2ID0gJmluZm8tPm9uZW5hbmQ7CiAJaW5mby0+bXRkLm93bmVyID0gVEhJU19NT0RVTEU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL29uZW5hbmQvb21hcDIuYyBiL2RyaXZlcnMvbXRkL29uZW5hbmQvb21hcDIuYwppbmRleCBkMWUwYjhlLi45NmVjYzE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9vbmVuYW5kL29tYXAyLmMKKysrIGIvZHJpdmVycy9tdGQvb25lbmFuZC9vbWFwMi5jCkBAIC02NjgsNyArNjY4LDcgQEAKIAkJIGMtPm9uZW5hbmQuYmFzZSk7CiAKIAljLT5wZGV2ID0gcGRldjsKLQljLT5tdGQubmFtZSA9IHBkZXYtPmRldi5idXNfaWQ7CisJYy0+bXRkLm5hbWUgPSBkZXZfbmFtZSgmcGRldi0+ZGV2KTsKIAljLT5tdGQucHJpdiA9ICZjLT5vbmVuYW5kOwogCWMtPm10ZC5vd25lciA9IFRISVNfTU9EVUxFOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC91YmkvYnVpbGQuYyBiL2RyaXZlcnMvbXRkL3ViaS9idWlsZC5jCmluZGV4IGJhMGJkM2QuLjdjYWYyMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3ViaS9idWlsZC5jCisrKyBiL2RyaXZlcnMvbXRkL3ViaS9idWlsZC5jCkBAIC0yODAsNyArMjgwLDcgQEAKIAl1YmktPmRldi5yZWxlYXNlID0gZGV2X3JlbGVhc2U7CiAJdWJpLT5kZXYuZGV2dCA9IHViaS0+Y2Rldi5kZXY7CiAJdWJpLT5kZXYuY2xhc3MgPSB1YmlfY2xhc3M7Ci0Jc3ByaW50ZigmdWJpLT5kZXYuYnVzX2lkWzBdLCBVQklfTkFNRV9TVFIiJWQiLCB1YmktPnViaV9udW0pOworCWRldl9zZXRfbmFtZSgmdWJpLT5kZXYsIFVCSV9OQU1FX1NUUiIlZCIsIHViaS0+dWJpX251bSk7CiAJZXJyID0gZGV2aWNlX3JlZ2lzdGVyKCZ1YmktPmRldik7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS9lYmEuYyBiL2RyaXZlcnMvbXRkL3ViaS9lYmEuYwppbmRleCAwNDhhNjA2Li4yNWRlZjM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC91YmkvZWJhLmMKKysrIGIvZHJpdmVycy9tdGQvdWJpL2ViYS5jCkBAIC03MTcsNyArNzE3LDcgQEAKICAqIHRvIHRoZSByZWFsIGRhdGEgc2l6ZSwgYWx0aG91Z2ggdGhlIEBidWYgYnVmZmVyIGhhcyB0byBjb250YWluIHRoZQogICogYWxpZ25tZW50LiBJbiBhbGwgb3RoZXIgY2FzZXMsIEBsZW4gaGFzIHRvIGJlIGFsaWduZWQuCiAgKgotICogSXQgaXMgcHJvaGliaXRlZCB0byB3cml0ZSBtb3JlIHRoZW4gb25jZSB0byBsb2dpY2FsIGVyYXNlYmxvY2tzIG9mIHN0YXRpYworICogSXQgaXMgcHJvaGliaXRlZCB0byB3cml0ZSBtb3JlIHRoYW4gb25jZSB0byBsb2dpY2FsIGVyYXNlYmxvY2tzIG9mIHN0YXRpYwogICogdm9sdW1lcy4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHplcm8gaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm9yCiAgKiBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZS4KICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL2lvLmMgYi9kcml2ZXJzL210ZC91YmkvaW8uYwppbmRleCBhNzQxMThjLi5mZTgxMDM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC91YmkvaW8uYworKysgYi9kcml2ZXJzL210ZC91YmkvaW8uYwpAQCAtNDY1LDcgKzQ2NSw3IEBACiAgKiBUaGlzIGZ1bmN0aW9uIHN5bmNocm9ub3VzbHkgZXJhc2VzIHBoeXNpY2FsIGVyYXNlYmxvY2sgQHBudW0uIElmIEB0b3J0dXJlCiAgKiBmbGFnIGlzIG5vdCB6ZXJvLCB0aGUgcGh5c2ljYWwgZXJhc2VibG9jayBpcyBjaGVja2VkIGJ5IG1lYW5zIG9mIHdyaXRpbmcKICAqIGRpZmZlcmVudCBwYXR0ZXJucyB0byBpdCBhbmQgcmVhZGluZyB0aGVtIGJhY2suIElmIHRoZSB0b3J0dXJpbmcgaXMgZW5hYmxlZCwKLSAqIHRoZSBwaHlzaWNhbCBlcmFzZWJsb2NrIGlzIGVyYXNlZCBtb3JlIHRoZW4gb25jZS4KKyAqIHRoZSBwaHlzaWNhbCBlcmFzZWJsb2NrIGlzIGVyYXNlZCBtb3JlIHRoYW4gb25jZS4KICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBlcmFzdXJlcyBtYWRlIGluIGNhc2Ugb2Ygc3VjY2VzcywgJS1FSU8KICAqIGlmIHRoZSBlcmFzdXJlIGZhaWxlZCBvciB0aGUgdG9ydHVyaW5nIHRlc3QgZmFpbGVkLCBhbmQgb3RoZXIgbmVnYXRpdmUgZXJyb3IKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS9rYXBpLmMgYi9kcml2ZXJzL210ZC91Ymkva2FwaS5jCmluZGV4IDVkOWJjZjEuLjRhYmJlNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3ViaS9rYXBpLmMKKysrIGIvZHJpdmVycy9tdGQvdWJpL2thcGkuYwpAQCAtNTY0LDcgKzU2NCw3IEBACiAgKiBAZHR5cGU6IGV4cGVjdGVkIGRhdGEgdHlwZQogICoKICAqIFRoaXMgZnVuY3Rpb24gbWFwcyBhbiB1bi1tYXBwZWQgbG9naWNhbCBlcmFzZWJsb2NrIEBsbnVtIHRvIGEgcGh5c2ljYWwKLSAqIGVyYXNlYmxvY2suIFRoaXMgbWVhbnMsIHRoYXQgYWZ0ZXIgYSBzdWNjZXNzZnVsbCBpbnZvY2F0aW9uIG9mIHRoaXMKKyAqIGVyYXNlYmxvY2suIFRoaXMgbWVhbnMsIHRoYXQgYWZ0ZXIgYSBzdWNjZXNzZnVsIGludm9jYXRpb24gb2YgdGhpcwogICogZnVuY3Rpb24gdGhlIGxvZ2ljYWwgZXJhc2VibG9jayBAbG51bSB3aWxsIGJlIGVtcHR5IChjb250YWluIG9ubHkgJTB4RkYKICAqIGJ5dGVzKSBhbmQgYmUgbWFwcGVkIHRvIGEgcGh5c2ljYWwgZXJhc2VibG9jaywgZXZlbiBpZiBhbiB1bmNsZWFuIHJlYm9vdAogICogaGFwcGVucy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS9zY2FuLmMgYi9kcml2ZXJzL210ZC91Ymkvc2Nhbi5jCmluZGV4IDQxZDQ3ZTEuLmVjZGUyMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3ViaS9zY2FuLmMKKysrIGIvZHJpdmVycy9tdGQvdWJpL3NjYW4uYwpAQCAtNDc4LDcgKzQ3OCw3IEBACiAJCQlyZXR1cm4gMDsKIAkJfSBlbHNlIHsKIAkJCS8qCi0JCQkgKiBUaGlzIGxvZ2ljYWwgZXJhc2VibG9jayBpcyBvbGRlciB0aGVuIHRoZSBvbmUgZm91bmQKKwkJCSAqIFRoaXMgbG9naWNhbCBlcmFzZWJsb2NrIGlzIG9sZGVyIHRoYW4gdGhlIG9uZSBmb3VuZAogCQkJICogcHJldmlvdXNseS4KIAkJCSAqLwogCQkJaWYgKGNtcF9yZXMgJiA0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL3ViaS1tZWRpYS5oIGIvZHJpdmVycy9tdGQvdWJpL3ViaS1tZWRpYS5oCmluZGV4IDJhZDk0MDQuLjg0MTlmZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3ViaS91YmktbWVkaWEuaAorKysgYi9kcml2ZXJzL210ZC91YmkvdWJpLW1lZGlhLmgKQEAgLTEzNSw3ICsxMzUsNyBAQAogICogVGhlIGVyYXNlIGNvdW50ZXIgaGVhZGVyIHRha2VzIDY0IGJ5dGVzIGFuZCBoYXMgYSBwbGVudHkgb2YgdW51c2VkIHNwYWNlIGZvcgogICogZnV0dXJlIHVzYWdlLiBUaGUgdW51c2VkIGZpZWxkcyBhcmUgemVyb2VkLiBUaGUgQHZlcnNpb24gZmllbGQgaXMgdXNlZCB0bwogICogaW5kaWNhdGUgdGhlIHZlcnNpb24gb2YgVUJJIGltcGxlbWVudGF0aW9uIHdoaWNoIGlzIHN1cHBvc2VkIHRvIGJlIGFibGUgdG8KLSAqIHdvcmsgd2l0aCB0aGlzIFVCSSBpbWFnZS4gSWYgQHZlcnNpb24gaXMgZ3JlYXRlciB0aGVuIHRoZSBjdXJyZW50IFVCSQorICogd29yayB3aXRoIHRoaXMgVUJJIGltYWdlLiBJZiBAdmVyc2lvbiBpcyBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgVUJJCiAgKiB2ZXJzaW9uLCB0aGUgaW1hZ2UgaXMgcmVqZWN0ZWQuIFRoaXMgbWF5IGJlIHVzZWZ1bCBpbiBmdXR1cmUgaWYgc29tZXRoaW5nCiAgKiBpcyBjaGFuZ2VkIHJhZGljYWxseS4gVGhpcyBmaWVsZCBpcyBkdXBsaWNhdGVkIGluIHRoZSB2b2x1bWUgaWRlbnRpZmllcgogICogaGVhZGVyLgpAQCAtMTg3LDcgKzE4Nyw3IEBACiAgKiAoc2VxdWVuY2UgbnVtYmVyKSBpcyB1c2VkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gb2xkZXIgYW5kIG5ld2VyIHZlcnNpb25zIG9mCiAgKiBsb2dpY2FsIGVyYXNlYmxvY2tzLgogICoKLSAqIFRoZXJlIGFyZSAyIHNpdHVhdGlvbnMgd2hlbiB0aGVyZSBtYXkgYmUgbW9yZSB0aGVuIG9uZSBwaHlzaWNhbCBlcmFzZWJsb2NrCisgKiBUaGVyZSBhcmUgMiBzaXR1YXRpb25zIHdoZW4gdGhlcmUgbWF5IGJlIG1vcmUgdGhhbiBvbmUgcGh5c2ljYWwgZXJhc2VibG9jawogICogY29ycmVzcG9uZGluZyB0byB0aGUgc2FtZSBsb2dpY2FsIGVyYXNlYmxvY2ssIGkuZS4sIGhhdmluZyB0aGUgc2FtZSBAdm9sX2lkCiAgKiBhbmQgQGxudW0gdmFsdWVzIGluIHRoZSB2b2x1bWUgaWRlbnRpZmllciBoZWFkZXIuIFN1cHBvc2Ugd2UgaGF2ZSBhIGxvZ2ljYWwKICAqIGVyYXNlYmxvY2sgTCBhbmQgaXQgaXMgbWFwcGVkIHRvIHRoZSBwaHlzaWNhbCBlcmFzZWJsb2NrIFAuCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC91Ymkvdm10LmMgYi9kcml2ZXJzL210ZC91Ymkvdm10LmMKaW5kZXggMzUzMWNhOS4uMjJlMWQ3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdWJpL3ZtdC5jCisrKyBiL2RyaXZlcnMvbXRkL3ViaS92bXQuYwpAQCAtMzI5LDcgKzMyOSw3IEBACiAJdm9sLT5kZXYuZGV2dCA9IGRldjsKIAl2b2wtPmRldi5jbGFzcyA9IHViaV9jbGFzczsKIAotCXNwcmludGYoJnZvbC0+ZGV2LmJ1c19pZFswXSwgIiVzXyVkIiwgdWJpLT51YmlfbmFtZSwgdm9sLT52b2xfaWQpOworCWRldl9zZXRfbmFtZSgmdm9sLT5kZXYsICIlc18lZCIsIHViaS0+dWJpX25hbWUsIHZvbC0+dm9sX2lkKTsKIAllcnIgPSBkZXZpY2VfcmVnaXN0ZXIoJnZvbC0+ZGV2KTsKIAlpZiAoZXJyKSB7CiAJCXViaV9lcnIoImNhbm5vdCByZWdpc3RlciBkZXZpY2UiKTsKQEAgLTY3OCw3ICs2NzgsNyBAQAogCXZvbC0+ZGV2LnBhcmVudCA9ICZ1YmktPmRldjsKIAl2b2wtPmRldi5kZXZ0ID0gZGV2OwogCXZvbC0+ZGV2LmNsYXNzID0gdWJpX2NsYXNzOwotCXNwcmludGYoJnZvbC0+ZGV2LmJ1c19pZFswXSwgIiVzXyVkIiwgdWJpLT51YmlfbmFtZSwgdm9sLT52b2xfaWQpOworCWRldl9zZXRfbmFtZSgmdm9sLT5kZXYsICIlc18lZCIsIHViaS0+dWJpX25hbWUsIHZvbC0+dm9sX2lkKTsKIAllcnIgPSBkZXZpY2VfcmVnaXN0ZXIoJnZvbC0+ZGV2KTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dF9nbHVlYmk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC91YmkvdnRibC5jIGIvZHJpdmVycy9tdGQvdWJpL3Z0YmwuYwppbmRleCAzMzNjODk0Li4xYWZjNjFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC91YmkvdnRibC5jCisrKyBiL2RyaXZlcnMvbXRkL3ViaS92dGJsLmMKQEAgLTU3Nyw3ICs1NzcsNyBAQAogCQlpZiAodnRibFtpXS5mbGFncyAmIFVCSV9WVEJMX0FVVE9SRVNJWkVfRkxHKSB7CiAJCQkvKiBBdXRvIHJlLXNpemUgZmxhZyBtYXkgYmUgc2V0IG9ubHkgZm9yIG9uZSB2b2x1bWUgKi8KIAkJCWlmICh1YmktPmF1dG9yZXNpemVfdm9sX2lkICE9IC0xKSB7Ci0JCQkJdWJpX2VycigibW9yZSB0aGVuIG9uZSBhdXRvLXJlc2l6ZSB2b2x1bWUgKCVkICIKKwkJCQl1YmlfZXJyKCJtb3JlIHRoYW4gb25lIGF1dG8tcmVzaXplIHZvbHVtZSAoJWQgIgogCQkJCQkiYW5kICVkKSIsIHViaS0+YXV0b3Jlc2l6ZV92b2xfaWQsIGkpOwogCQkJCWtmcmVlKHZvbCk7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC91Ymkvd2wuYyBiL2RyaXZlcnMvbXRkL3ViaS93bC5jCmluZGV4IDE0OTAxY2IuLjg5MTUzNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3ViaS93bC5jCisrKyBiL2RyaXZlcnMvbXRkL3ViaS93bC5jCkBAIC0xMjgsNyArMTI4LDcgQEAKICAqIHNpdHVhdGlvbiB3aGVuIHRoZSBwaWNrZWQgcGh5c2ljYWwgZXJhc2VibG9jayBpcyBjb25zdGFudGx5IGVyYXNlZCBhZnRlciB0aGUKICAqIGRhdGEgaXMgd3JpdHRlbiB0byBpdC4gU28sIHdlIGhhdmUgYSBjb25zdGFudCB3aGljaCBsaW1pdHMgdGhlIGhpZ2hlc3QgZXJhc2UKICAqIGNvdW50ZXIgb2YgdGhlIGZyZWUgcGh5c2ljYWwgZXJhc2VibG9jayB0byBwaWNrLiBOYW1lbHksIHRoZSBXTCBzdWItc3lzdGVtCi0gKiBkb2VzIG5vdCBwaWNrIGVyYXNlYmxvY2tzIHdpdGggZXJhc2UgY291bnRlciBncmVhdGVyIHRoZW4gdGhlIGxvd2VzdCBlcmFzZQorICogZG9lcyBub3QgcGljayBlcmFzZWJsb2NrcyB3aXRoIGVyYXNlIGNvdW50ZXIgZ3JlYXRlciB0aGFuIHRoZSBsb3dlc3QgZXJhc2UKICAqIGNvdW50ZXIgcGx1cyAlV0xfRlJFRV9NQVhfRElGRi4KICAqLwogI2RlZmluZSBXTF9GUkVFX01BWF9ESUZGICgyKlVCSV9XTF9USFJFU0hPTEQpCkBAIC05MTcsNyArOTE3LDcgQEAKIAkJLyoKIAkJICogV2Ugc2NoZWR1bGUgd2Vhci1sZXZlbGluZyBvbmx5IGlmIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlCiAJCSAqIGxvd2VzdCBlcmFzZSBjb3VudGVyIG9mIHVzZWQgcGh5c2ljYWwgZXJhc2VibG9ja3MgYW5kIGEgaGlnaAotCQkgKiBlcmFzZSBjb3VudGVyIG9mIGZyZWUgcGh5c2ljYWwgZXJhc2VibG9ja3MgaXMgZ3JlYXRlciB0aGVuCisJCSAqIGVyYXNlIGNvdW50ZXIgb2YgZnJlZSBwaHlzaWNhbCBlcmFzZWJsb2NrcyBpcyBncmVhdGVyIHRoYW4KIAkJICogJVVCSV9XTF9USFJFU0hPTEQuCiAJCSAqLwogCQllMSA9IHJiX2VudHJ5KHJiX2ZpcnN0KCZ1YmktPnVzZWQpLCBzdHJ1Y3QgdWJpX3dsX2VudHJ5LCB1LnJiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L0tjb25maWcgYi9kcml2ZXJzL25ldC9LY29uZmlnCmluZGV4IDlhMTgyNzAuLjY1YWZkYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvS2NvbmZpZwpAQCAtODMwLDcgKzgzMCw3IEBACiAKIGNvbmZpZyBCRklOX01BQwogCXRyaXN0YXRlICJCbGFja2ZpbiBvbi1jaGlwIE1BQyBzdXBwb3J0IgotCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIChCRjUyNiB8fCBCRjUyNyB8fCBCRjUzNiB8fCBCRjUzNykKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiAoQkY1MTYgfHwgQkY1MTggfHwgQkY1MjYgfHwgQkY1MjcgfHwgQkY1MzYgfHwgQkY1MzcpCiAJc2VsZWN0IENSQzMyCiAJc2VsZWN0IE1JSQogCXNlbGVjdCBQSFlMSUIKQEAgLTI2MTQsNiArMjYxNCw4IEBACiAKIHNvdXJjZSAiZHJpdmVycy9uZXQvd2lyZWxlc3MvS2NvbmZpZyIKIAorc291cmNlICJkcml2ZXJzL25ldC93aW1heC9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMvbmV0L3VzYi9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvbmV0L3BjbWNpYS9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9NYWtlZmlsZQppbmRleCBlNWMzNGI0Li5hM2M1YzAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC9NYWtlZmlsZQpAQCAtMjYzLDMgKzI2Myw0IEBACiBvYmotJChDT05GSUdfVklSVElPX05FVCkgKz0gdmlydGlvX25ldC5vCiBvYmotJChDT05GSUdfU0ZDKSArPSBzZmMvCiAKK29iai0kKENPTkZJR19XSU1BWCkgKz0gd2ltYXgvCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hY2VuaWMuYyBiL2RyaXZlcnMvbmV0L2FjZW5pYy5jCmluZGV4IDUxN2ZjZTQuLjViMzk2ZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FjZW5pYy5jCisrKyBiL2RyaXZlcnMvbmV0L2FjZW5pYy5jCkBAIC02Niw2ICs2Niw3IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAKICNpZiBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRKSB8fCBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRX01PRFVMRSkKICNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CkBAIC0xODYsOCArMTg3LDYgQEAKICNkZWZpbmUgTUFYX1JPREFUQV9MRU4JOCoxMDI0CiAjZGVmaW5lIE1BWF9EQVRBX0xFTgkyKjEwMjQKIAotI2luY2x1ZGUgImFjZW5pY19maXJtd2FyZS5oIgotCiAjaWZuZGVmIHRpZ29uMkZ3UmVsZWFzZUxvY2FsCiAjZGVmaW5lIHRpZ29uMkZ3UmVsZWFzZUxvY2FsIDAKICNlbmRpZgpAQCAtNDE3LDYgKzQxNiwxMCBAQAogTU9EVUxFX0FVVEhPUigiSmVzIFNvcmVuc2VuIDxqZXNAdHJhaW5lZC1tb25rZXkub3JnPiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJBY2VOSUMvM0M5ODUvR0E2MjAgR2lnYWJpdCBFdGhlcm5ldCBkcml2ZXIiKTsKKyNpZm5kZWYgQ09ORklHX0FDRU5JQ19PTUlUX1RJR09OX0kKK01PRFVMRV9GSVJNV0FSRSgiYWNlbmljL3RnMS5iaW4iKTsKKyNlbmRpZgorTU9EVUxFX0ZJUk1XQVJFKCJhY2VuaWMvdGcyLmJpbiIpOwogCiBtb2R1bGVfcGFyYW1fYXJyYXlfbmFtZWQobGluaywgbGlua19zdGF0ZSwgaW50LCBOVUxMLCAwKTsKIG1vZHVsZV9wYXJhbV9hcnJheSh0cmFjZSwgaW50LCBOVUxMLCAwKTsKQEAgLTk0Myw4ICs5NDYsOCBAQAogCWNhc2UgNDoKIAljYXNlIDU6CiAJCXByaW50ayhLRVJOX0lORk8gIiAgVGlnb24gSSAgKFJldi4gJWkpLCBGaXJtd2FyZTogJWkuJWkuJWksICIsCi0JCSAgICAgICB0aWdfdmVyLCB0aWdvbkZ3UmVsZWFzZU1ham9yLCB0aWdvbkZ3UmVsZWFzZU1pbm9yLAotCQkgICAgICAgdGlnb25Gd1JlbGVhc2VGaXgpOworCQkgICAgICAgdGlnX3ZlciwgYXAtPmZpcm13YXJlX21ham9yLCBhcC0+ZmlybXdhcmVfbWlub3IsCisJCSAgICAgICBhcC0+ZmlybXdhcmVfZml4KTsKIAkJd3JpdGVsKDAsICZyZWdzLT5Mb2NhbEN0cmwpOwogCQlhcC0+dmVyc2lvbiA9IDE7CiAJCWFwLT50eF9yaW5nX2VudHJpZXMgPSBUSUdPTl9JX1RYX1JJTkdfRU5UUklFUzsKQEAgLTk1Miw4ICs5NTUsOCBAQAogI2VuZGlmCiAJY2FzZSA2OgogCQlwcmludGsoS0VSTl9JTkZPICIgIFRpZ29uIElJIChSZXYuICVpKSwgRmlybXdhcmU6ICVpLiVpLiVpLCAiLAotCQkgICAgICAgdGlnX3ZlciwgdGlnb24yRndSZWxlYXNlTWFqb3IsIHRpZ29uMkZ3UmVsZWFzZU1pbm9yLAotCQkgICAgICAgdGlnb24yRndSZWxlYXNlRml4KTsKKwkJICAgICAgIHRpZ192ZXIsIGFwLT5maXJtd2FyZV9tYWpvciwgYXAtPmZpcm13YXJlX21pbm9yLAorCQkgICAgICAgYXAtPmZpcm13YXJlX2ZpeCk7CiAJCXdyaXRlbChyZWFkbCgmcmVncy0+Q3B1QkN0cmwpIHwgQ1BVX0hBTFQsICZyZWdzLT5DcHVCQ3RybCk7CiAJCXJlYWRsKCZyZWdzLT5DcHVCQ3RybCk7CQkvKiBQQ0kgd3JpdGUgcG9zdGluZyAqLwogCQkvKgpAQCAtMTIwNSw3ICsxMjA4LDkgQEAKIAltZW1zZXQoYXAtPmluZm8sIDAsIHNpemVvZihzdHJ1Y3QgYWNlX2luZm8pKTsKIAltZW1zZXQoYXAtPnNrYiwgMCwgc2l6ZW9mKHN0cnVjdCBhY2Vfc2tiKSk7CiAKLQlhY2VfbG9hZF9maXJtd2FyZShkZXYpOworCWlmIChhY2VfbG9hZF9maXJtd2FyZShkZXYpKQorCQlnb3RvIGluaXRfZXJyb3I7CisKIAlhcC0+ZndfcnVubmluZyA9IDA7CiAKIAl0bXBfcHRyID0gYXAtPmluZm9fZG1hOwpAQCAtMTQ0MSwxMCArMTQ0Niw3IEBACiAJaWYgKGFwLT52ZXJzaW9uID49IDIpCiAJCXdyaXRlbCh0bXAsICZyZWdzLT5UdW5lRmFzdExpbmspOwogCi0JaWYgKEFDRV9JU19USUdPTl9JKGFwKSkKLQkJd3JpdGVsKHRpZ29uRndTdGFydEFkZHIsICZyZWdzLT5QYyk7Ci0JaWYgKGFwLT52ZXJzaW9uID09IDIpCi0JCXdyaXRlbCh0aWdvbjJGd1N0YXJ0QWRkciwgJnJlZ3MtPlBjKTsKKwl3cml0ZWwoYXAtPmZpcm13YXJlX3N0YXJ0LCAmcmVncy0+UGMpOwogCiAJd3JpdGVsKDAsICZyZWdzLT5NYjBMbyk7CiAKQEAgLTI3NjEsOCArMjc2Myw4IEBACiAKIAlzdHJsY3B5KGluZm8tPmRyaXZlciwgImFjZW5pYyIsIHNpemVvZihpbmZvLT5kcml2ZXIpKTsKIAlzbnByaW50ZihpbmZvLT52ZXJzaW9uLCBzaXplb2YoaW5mby0+dmVyc2lvbiksICIlaS4laS4laSIsCi0JCXRpZ29uRndSZWxlYXNlTWFqb3IsIHRpZ29uRndSZWxlYXNlTWlub3IsCi0JCXRpZ29uRndSZWxlYXNlRml4KTsKKwkJIGFwLT5maXJtd2FyZV9tYWpvciwgYXAtPmZpcm13YXJlX21pbm9yLAorCQkgYXAtPmZpcm13YXJlX2ZpeCk7CiAKIAlpZiAoYXAtPnBkZXYpCiAJCXN0cmxjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKGFwLT5wZGV2KSwKQEAgLTI4NjksMTEgKzI4NzEsMTAgQEAKIH0KIAogCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgYWNlX2NvcHkoc3RydWN0IGFjZV9yZWdzIF9faW9tZW0gKnJlZ3MsIHZvaWQgKnNyYywKLQkJCSAgICB1MzIgZGVzdCwgaW50IHNpemUpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgYWNlX2NvcHkoc3RydWN0IGFjZV9yZWdzIF9faW9tZW0gKnJlZ3MsIGNvbnN0IF9fYmUzMiAqc3JjLAorCQkJICAgICAgIHUzMiBkZXN0LCBpbnQgc2l6ZSkKIHsKIAl2b2lkIF9faW9tZW0gKnRkZXN0OwotCXUzMiAqd3NyYzsKIAlzaG9ydCB0c2l6ZSwgaTsKIAogCWlmIChzaXplIDw9IDApCkBAIC0yODg1LDIwICsyODg2LDE1IEBACiAJCXRkZXN0ID0gKHZvaWQgX19pb21lbSAqKSAmcmVncy0+V2luZG93ICsKIAkJCShkZXN0ICYgKEFDRV9XSU5ET1dfU0laRSAtIDEpKTsKIAkJd3JpdGVsKGRlc3QgJiB+KEFDRV9XSU5ET1dfU0laRSAtIDEpLCAmcmVncy0+V2luQmFzZSk7Ci0JCS8qCi0JCSAqIFRoaXMgcmVxdWlyZXMgYnl0ZSBzd2FwcGluZyBvbiBiaWcgZW5kaWFuLCBob3dldmVyCi0JCSAqIHdyaXRlbCBkb2VzIHRoYXQgZm9yIHVzCi0JCSAqLwotCQl3c3JjID0gc3JjOwogCQlmb3IgKGkgPSAwOyBpIDwgKHRzaXplIC8gNCk7IGkrKykgewotCQkJd3JpdGVsKHdzcmNbaV0sIHRkZXN0ICsgaSo0KTsKKwkJCS8qIEZpcm13YXJlIGlzIGJpZy1lbmRpYW4gKi8KKwkJCXdyaXRlbChiZTMyX3RvX2NwdXAoc3JjKSwgdGRlc3QpOworCQkJc3JjKys7CisJCQl0ZGVzdCArPSA0OworCQkJZGVzdCArPSA0OworCQkJc2l6ZSAtPSA0OwogCQl9Ci0JCWRlc3QgKz0gdHNpemU7Ci0JCXNyYyArPSB0c2l6ZTsKLQkJc2l6ZSAtPSB0c2l6ZTsKIAl9Ci0KLQlyZXR1cm47CiB9CiAKIApAQCAtMjkzNyw4ICsyOTMzLDEzIEBACiAgKi8KIHN0YXRpYyBpbnQgX19kZXZpbml0IGFjZV9sb2FkX2Zpcm13YXJlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKKwljb25zdCBjaGFyICpmd19uYW1lID0gImFjZW5pYy90ZzIuYmluIjsKIAlzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgYWNlX3JlZ3MgX19pb21lbSAqcmVncyA9IGFwLT5yZWdzOworCWNvbnN0IF9fYmUzMiAqZndfZGF0YTsKKwl1MzIgbG9hZF9hZGRyOworCWludCByZXQ7CiAKIAlpZiAoIShyZWFkbCgmcmVncy0+Q3B1Q3RybCkgJiBDUFVfSEFMVEVEKSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiB0cnlpbmcgdG8gZG93bmxvYWQgZmlybXdhcmUgd2hpbGUgdGhlICIKQEAgLTI5NDYsMjggKzI5NDcsNTIgQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCi0JLyoKLQkgKiBEbyBub3QgdHJ5IHRvIGNsZWFyIG1vcmUgdGhhbiA1MTJLQiBvciB3ZSBlbmQgdXAgc2VlaW5nCi0JICogZnVubnkgdGhpbmdzIG9uIE5JQ3Mgd2l0aCBvbmx5IDUxMktCIFNSQU0KLQkgKi8KLQlhY2VfY2xlYXIocmVncywgMHgyMDAwLCAweDgwMDAwLTB4MjAwMCk7Ci0JaWYgKEFDRV9JU19USUdPTl9JKGFwKSkgewotCQlhY2VfY29weShyZWdzLCB0aWdvbkZ3VGV4dCwgdGlnb25Gd1RleHRBZGRyLCB0aWdvbkZ3VGV4dExlbik7Ci0JCWFjZV9jb3B5KHJlZ3MsIHRpZ29uRndEYXRhLCB0aWdvbkZ3RGF0YUFkZHIsIHRpZ29uRndEYXRhTGVuKTsKLQkJYWNlX2NvcHkocmVncywgdGlnb25Gd1JvZGF0YSwgdGlnb25Gd1JvZGF0YUFkZHIsCi0JCQkgdGlnb25Gd1JvZGF0YUxlbik7Ci0JCWFjZV9jbGVhcihyZWdzLCB0aWdvbkZ3QnNzQWRkciwgdGlnb25Gd0Jzc0xlbik7Ci0JCWFjZV9jbGVhcihyZWdzLCB0aWdvbkZ3U2Jzc0FkZHIsIHRpZ29uRndTYnNzTGVuKTsKLQl9ZWxzZSBpZiAoYXAtPnZlcnNpb24gPT0gMikgewotCQlhY2VfY2xlYXIocmVncywgdGlnb24yRndCc3NBZGRyLCB0aWdvbjJGd0Jzc0xlbik7Ci0JCWFjZV9jbGVhcihyZWdzLCB0aWdvbjJGd1Nic3NBZGRyLCB0aWdvbjJGd1Nic3NMZW4pOwotCQlhY2VfY29weShyZWdzLCB0aWdvbjJGd1RleHQsIHRpZ29uMkZ3VGV4dEFkZHIsdGlnb24yRndUZXh0TGVuKTsKLQkJYWNlX2NvcHkocmVncywgdGlnb24yRndSb2RhdGEsIHRpZ29uMkZ3Um9kYXRhQWRkciwKLQkJCSB0aWdvbjJGd1JvZGF0YUxlbik7Ci0JCWFjZV9jb3B5KHJlZ3MsIHRpZ29uMkZ3RGF0YSwgdGlnb24yRndEYXRhQWRkcix0aWdvbjJGd0RhdGFMZW4pOworCWlmIChBQ0VfSVNfVElHT05fSShhcCkpCisJCWZ3X25hbWUgPSAiYWNlbmljL3RnMS5iaW4iOworCisJcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIGZ3X25hbWUsICZhcC0+cGRldi0+ZGV2KTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEZhaWxlZCB0byBsb2FkIGZpcm13YXJlIFwiJXNcIlxuIiwKKwkJICAgICAgIGFwLT5uYW1lLCBmd19uYW1lKTsKKwkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXR1cm4gMDsKKwlmd19kYXRhID0gKHZvaWQgKilmdy0+ZGF0YTsKKworCS8qIEZpcm13YXJlIGJsb2Igc3RhcnRzIHdpdGggdmVyc2lvbiBudW1iZXJzLCBmb2xsb3dlZCBieQorCSAgIGxvYWQgYW5kIHN0YXJ0IGFkZHJlc3MuIFJlbWFpbmRlciBpcyB0aGUgYmxvYiB0byBiZSBsb2FkZWQKKwkgICBjb250aWd1b3VzbHkgZnJvbSBsb2FkIGFkZHJlc3MuIFdlIGRvbid0IGJvdGhlciB0byByZXByZXNlbnQKKwkgICB0aGUgQlNTL1NCU1Mgc2VjdGlvbnMgYW55IG1vcmUsIHNpbmNlIHdlIHdlcmUgY2xlYXJpbmcgdGhlCisJICAgd2hvbGUgdGhpbmcgYW55d2F5LiAqLworCWFwLT5maXJtd2FyZV9tYWpvciA9IGZ3LT5kYXRhWzBdOworCWFwLT5maXJtd2FyZV9taW5vciA9IGZ3LT5kYXRhWzFdOworCWFwLT5maXJtd2FyZV9maXggPSBmdy0+ZGF0YVsyXTsKKworCWFwLT5maXJtd2FyZV9zdGFydCA9IGJlMzJfdG9fY3B1KGZ3X2RhdGFbMV0pOworCWlmIChhcC0+ZmlybXdhcmVfc3RhcnQgPCAweDQwMDAgfHwgYXAtPmZpcm13YXJlX3N0YXJ0ID49IDB4ODAwMDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogYm9ndXMgbG9hZCBhZGRyZXNzICUwOHggaW4gXCIlc1wiXG4iLAorCQkgICAgICAgYXAtPm5hbWUsIGFwLT5maXJtd2FyZV9zdGFydCwgZndfbmFtZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWxvYWRfYWRkciA9IGJlMzJfdG9fY3B1KGZ3X2RhdGFbMl0pOworCWlmIChsb2FkX2FkZHIgPCAweDQwMDAgfHwgbG9hZF9hZGRyID49IDB4ODAwMDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogYm9ndXMgbG9hZCBhZGRyZXNzICUwOHggaW4gXCIlc1wiXG4iLAorCQkgICAgICAgYXAtPm5hbWUsIGxvYWRfYWRkciwgZndfbmFtZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogRG8gbm90IHRyeSB0byBjbGVhciBtb3JlIHRoYW4gNTEyS2lCIG9yIHdlIGVuZCB1cCBzZWVpbmcKKwkgKiBmdW5ueSB0aGluZ3Mgb24gTklDcyB3aXRoIG9ubHkgNTEyS2lCIFNSQU0KKwkgKi8KKwlhY2VfY2xlYXIocmVncywgMHgyMDAwLCAweDgwMDAwLTB4MjAwMCk7CisJYWNlX2NvcHkocmVncywgJmZ3X2RhdGFbM10sIGxvYWRfYWRkciwgZnctPnNpemUtMTIpOworIG91dDoKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwlyZXR1cm4gcmV0OwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FjZW5pYy5oIGIvZHJpdmVycy9uZXQvYWNlbmljLmgKaW5kZXggNDQ4N2YzMjcuLmM5ODdjOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FjZW5pYy5oCisrKyBiL2RyaXZlcnMvbmV0L2FjZW5pYy5oCkBAIC02OTQsNiArNjk0LDEwIEBACiAJdTMyCQkJbGFzdF90eCwgbGFzdF9zdGRfcngsIGxhc3RfbWluaV9yeDsKICNlbmRpZgogCWludAkJCXBjaV91c2luZ19kYWM7CisJdTgJCQlmaXJtd2FyZV9tYWpvcjsKKwl1OAkJCWZpcm13YXJlX21pbm9yOworCXU4CQkJZmlybXdhcmVfZml4OworCXUzMgkJCWZpcm13YXJlX3N0YXJ0OwogfTsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hY2VuaWNfZmlybXdhcmUuaCBiL2RyaXZlcnMvbmV0L2FjZW5pY19maXJtd2FyZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDQxZjc4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L2FjZW5pY19maXJtd2FyZS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTQ1NiArMCwwIEBACi0vKgotICogRGVjbGFyZSB0aGVzZSBoZXJlIGV2ZW4gaWYgVGlnb24gSSBzdXBwb3J0IGlzIGRpc2FibGVkIHRvIGF2b2lkCi0gKiB0aGUgY29tcGlsZXIgY29tcGxhaW5pbmcgYWJvdXQgdW5kZWZpbmVkIHN5bWJvbHMuCi0gKi8KLSNkZWZpbmUgdGlnb25Gd1JlbGVhc2VNYWpvciAweGMKLSNkZWZpbmUgdGlnb25Gd1JlbGVhc2VNaW5vciAweDQKLSNkZWZpbmUgdGlnb25Gd1JlbGVhc2VGaXggMHhiCi0jZGVmaW5lIHRpZ29uRndTdGFydEFkZHIgMHgwMDAwNDAwMAotI2RlZmluZSB0aWdvbkZ3VGV4dEFkZHIgMHgwMDAwNDAwMAotI2RlZmluZSB0aWdvbkZ3VGV4dExlbiAweDExMTQwCi0jZGVmaW5lIHRpZ29uRndSb2RhdGFBZGRyIDB4MDAwMTUxNDAKLSNkZWZpbmUgdGlnb25Gd1JvZGF0YUxlbiAweGFjMAotI2RlZmluZSB0aWdvbkZ3RGF0YUFkZHIgMHgwMDAxNWMyMAotI2RlZmluZSB0aWdvbkZ3RGF0YUxlbiAweDE3MAotI2RlZmluZSB0aWdvbkZ3U2Jzc0FkZHIgMHgwMDAxNWQ5MAotI2RlZmluZSB0aWdvbkZ3U2Jzc0xlbiAweDM4Ci0jZGVmaW5lIHRpZ29uRndCc3NBZGRyIDB4MDAwMTVkZDAKLSNkZWZpbmUgdGlnb25Gd0Jzc0xlbiAweDIwODAKLSNpZmRlZiBDT05GSUdfQUNFTklDX09NSVRfVElHT05fSQotI2RlZmluZSB0aWdvbkZ3VGV4dCBOVUxMCi0jZGVmaW5lIHRpZ29uRndEYXRhIE5VTEwKLSNkZWZpbmUgdGlnb25Gd1JvZGF0YSBOVUxMCi0jZWxzZQotLyogR2VuZXJhdGVkIGJ5IGdlbmZ3LmMgKi8KLXN0YXRpYyB1MzIgdGlnb25Gd1RleHRbKE1BWF9URVhUX0xFTi80KSArIDFdIF9fZGV2aW5pdGRhdGEgPSB7Ci0weDEwMDAwMDAzLAotMHgwLCAweGQsIDB4ZCwgMHgzYzFkMDAwMSwKLTB4OGZiZDVjNTQsIDB4M2EwZjAyMSwgMHgzYzEwMDAwMCwgMHgyNjEwNDAwMCwKLTB4YzAwMTAwYywgMHgwLCAweGQsIDB4MjdiZGZmZDgsCi0weDNjMWNjMDAwLCAweDNjMWIwMDEzLCAweDM3N2JkODAwLCAweGQwMjEsCi0weDNjMTcwMDEzLCAweDM2Zjc1NDE4LCAweDJlMDIwMjEsIDB4MzQwNTgzZTgsCi0weGFmYmYwMDI0LCAweGMwMDI0ODgsIDB4YWZiMDAwMjAsIDB4YzAwMjNlOCwKLTB4MCwgMHgzYzA0MDAwMSwgMHgyNDg0NTFhNCwgMHgyNDA1MDAwMSwKLTB4MmUwMzAyMSwgMHgzODIxLCAweDNjMTAwMDAxLCAweDI2MTA3ZTUwLAotMHhhZmIwMDAxMCwgMHhjMDAyNDAzLCAweGFmYmIwMDE0LCAweDNjMDIwMDBmLAotMHgzNDQyZmZmZiwgMHgyMDIxMDI0LCAweDM2MjEwMmIsIDB4MTA0MDAwMDksCi0weDI0MDUwMDAzLCAweDNjMDQwMDAxLCAweDI0ODQ1MWIwLCAweDIwMDMwMjEsCi0weDM2MDM4MjEsIDB4M2MwMjAwMTAsIDB4YWZhMjAwMTAsIDB4YzAwMjQwMywKLTB4YWZhMDAwMTQsIDB4MjAyMSwgMHgzNDA1YzAwMCwgMHgzYzAxMDAwMSwKLTB4MzcwODIxLCAweGEwMjA4M2IwLCAweDNjMDEwMDAxLCAweDM3MDgyMSwKLTB4YTAyMDgzYjIsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMjA4M2IzLAotMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YWMyMDgzYjQsIDB4YTJlMDA0ZDgsCi0weDQxOGMwLCAweDI0ODQwMDAxLCAweDc3MTAyMSwgMHhhYzQwNzI3YywKLTB4NzcxMDIxLCAweGFjNDA3MjgwLCAweDJlMzEwMjEsIDB4YTQ0NTcyN2MsCi0weDJjODIwMDIwLCAweDE0NDBmZmY3LCAweDQxOGMwLCAweDIwMjEsCi0weDM0MDVjMDAwLCAweDQxOGMwLCAweDI0ODQwMDAxLCAweDc3MTAyMSwKLTB4YWM0MDczN2MsIDB4NzcxMDIxLCAweGFjNDA3MzgwLCAweDJlMzEwMjEsCi0weGE0NDU3MzdjLCAweDJjODIwMDgwLCAweDU0NDBmZmY3LCAweDQxOGMwLAotMHhhZjgwMDA1NCwgMHhhZjgwMDExYywgMHg4ZjgyMDA0NCwgMHgzNDQyMDA0MCwKLTB4YWY4MjAwNDQsIDB4OGY4MjAwNDQsIDB4MzQ0MjAwMjAsIDB4YWY4MjAwNDQsCi0weDhmNDIwMjE4LCAweDMwNDIwMDAyLCAweDEwNDAwMDA5LCAweDAsCi0weDhmNDIwMjIwLCAweDNjMDMwMDAyLCAweDM0NjMwMDA0LCAweDQzMTAyNSwKLTB4YWVlMjA0YzQsIDB4OGY0MjAyMWMsIDB4ODAwMTA3NCwgMHgzNDQyMDAwNCwKLTB4OGY0MjAyMjAsIDB4M2MwMzAwMDIsIDB4MzQ2MzAwMDYsIDB4NDMxMDI1LAotMHhhZWUyMDRjNCwgMHg4ZjQyMDIxYywgMHgzNDQyMDAwNiwgMHhhZWUyMDRjYywKLTB4OGY0MjAyMTgsIDB4MzA0MjAwMTAsIDB4MTA0MDAwMGEsIDB4MCwKLTB4OGY0MjAyMWMsIDB4MzQ0MjAwMDQsIDB4YWVlMjA0YzgsIDB4OGY0MjAyMjAsCi0weDNjMDMwMDBhLCAweDM0NjMwMDA0LCAweDQzMTAyNSwgMHg4MDAxMDhhLAotMHhhZWUyMDRjMCwgMHg4ZjQyMDIyMCwgMHgzYzAzMDAwYSwgMHgzNDYzMDAwNiwKLTB4NDMxMDI1LCAweGFlZTIwNGMwLCAweDhmNDIwMjFjLCAweDM0NDIwMDA2LAotMHhhZWUyMDRjOCwgMHg4ZjQyMDIxOCwgMHgzMDQyMDIwMCwgMHgxMDQwMDAwMywKLTB4MjQwMjAwMDEsIDB4ODAwMTA5MSwgMHhhMmUyNzI0OCwgMHhhMmUwNzI0OCwKLTB4MjQwMjAwMDEsIDB4YWY4MjAwYTAsIDB4YWY4MjAwYjAsIDB4OGY4MzAwNTQsCi0weDhmODIwMDU0LCAweDgwMDEwOTksIDB4MjQ2MzAwNjQsIDB4OGY4MjAwNTQsCi0weDYyMTAyMywgMHgyYzQyMDA2NSwgMHgxNDQwZmZmYywgMHgwLAotMHhhZjgwMDA0NCwgMHg4ZjQyMDIwOCwgMHg4ZjQzMDIwYywgMHhhZWUyMDAxMCwKLTB4YWVlMzAwMTQsIDB4OGVlNDAwMTAsIDB4OGVlNTAwMTQsIDB4MjZlMjAwMzAsCi0weGFlZTIwMDI4LCAweDI0MDIwNDkwLCAweGFlZTIwMDE4LCAweGFmODQwMDkwLAotMHhhZjg1MDA5NCwgMHg4ZWUyMDAyOCwgMHhhZjgyMDBiNCwgMHg5NmUyMDAxYSwKLTB4YWY4MjAwOWMsIDB4OGY4MjAwYjAsIDB4OGVlMzA0Y2MsIDB4NDMxMDI1LAotMHhhZjgyMDBiMCwgMHg4ZjgyMDBiMCwgMHgzMDQyMDAwNCwgMHgxNDQwZmZmZCwKLTB4MCwgMHg4ZWUyMDQ1MCwgMHg4ZWUzMDQ1NCwgMHhhZWUzMDRmYywKLTB4OGVlMjA0ZmMsIDB4MjQ0MmUwMDAsIDB4MmM0MjIwMDEsIDB4MTQ0MDAwMGQsCi0weDI2ZTQwMDMwLCAweDhlZTIwNDUwLCAweDhlZTMwNDU0LCAweDNjMDQwMDAxLAotMHgyNDg0NTFiYywgMHgzYzA1MDAwMSwgMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwKLTB4OGVlNzA0ZmMsIDB4MzRhNWYwMDAsIDB4YzAwMjQwMywgMHg2MDMwMjEsCi0weDI2ZTQwMDMwLCAweGMwMDI0ODgsIDB4MjQwNTA0MDAsIDB4Mjc0NDAwODAsCi0weGMwMDI0ODgsIDB4MjQwNTAwODAsIDB4MjZlNDc3N2MsIDB4YzAwMjQ4OCwKLTB4MjQwNTA0MDAsIDB4OGY0MjAyNWMsIDB4MjZlNDAwOTQsIDB4YWVlMjAwNjAsCi0weDhmNDIwMjYwLCAweDI3NDUwMjAwLCAweDI0MDYwMDA4LCAweGFlZTIwMDY4LAotMHgyNDAyMDAwNiwgMHhjMDAyNDlhLCAweGFlZTIwMDY0LCAweDNjMDIzYjlhLAotMHgzNDQyY2EwMCwgMHgyMDIxLCAweDI0MDMwMDAyLCAweGFlZTMwMDc0LAotMHhhZWUzMDA3MCwgMHhhZWUyMDA2YywgMHgyNDAyMDNlOCwgMHhhZWUyMDEwNCwKLTB4MjQwMjAwMDEsIDB4YWVlMzAxMDAsIDB4YWVlMjAxMGMsIDB4M2MwMzAwMDEsCi0weDY0MTgyMSwgMHg5MDYzNWMyMCwgMHgyZTQxMDIxLCAweDI0ODQwMDAxLAotMHhhMDQzMDA5YywgMHgyYzgyMDAwZiwgMHgxNDQwZmZmOCwgMHgwLAotMHg4ZjgyMDA0MCwgMHgyZTQxODIxLCAweDI0ODQwMDAxLCAweDIxNzAyLAotMHgyNDQyMDAzMCwgMHhhMDYyMDA5YywgMHgyZTQxMDIxLCAweGEwNDAwMDljLAotMHg5NmUyMDQ2YSwgMHgzMDQyMDAwMywgMHgxNDQwMDAwOSwgMHgwLAotMHg5NmUyMDQ3YSwgMHgzMDQyMDAwMywgMHg1MDQwMDEzMSwgMHgzYzAzMDgwMCwKLTB4OTZlMjA0NmEsIDB4MzA0MjAwMDMsIDB4MTA0MDAwMmEsIDB4M2MwMjA3MDAsCi0weDk2ZTIwNDdhLCAweDMwNDIwMDAzLCAweDEwNDAwMDI2LCAweDNjMDIwNzAwLAotMHg5NmUzMDQ3YSwgMHg5NmUyMDQ2YSwgMHgxNDYyMDAyMiwgMHgzYzAyMDcwMCwKLTB4OGVlMjA0YzAsIDB4MjQwMzAwMDEsIDB4YTJlMzRlMjAsIDB4MzQ0MjBlMDAsCi0weGFlZTIwNGMwLCAweDhmNDIwMjE4LCAweDMwNDIwMTAwLCAweDEwNDAwMDA1LAotMHgwLCAweDNjMDIwMDAxLCAweDI0NDJlMTY4LCAweDgwMDExMWQsCi0weDIxMTAwLCAweDNjMDIwMDAxLCAweDI0NDJkMzVjLCAweDIxMTAwLAotMHgyMTE4MiwgMHgzYzAzMDgwMCwgMHg0MzEwMjUsIDB4M2MwMTAwMDEsCi0weGFjMjIxMjM4LCAweDNjMDIwMDAxLCAweDI0NDJmNjgwLCAweDIxMTAwLAotMHgyMTE4MiwgMHgzYzAzMDgwMCwgMHg0MzEwMjUsIDB4M2MwMTAwMDEsCi0weGFjMjIxMjc4LCAweDhlZTIwMDAwLCAweDM0NDI0MDAwLCAweDgwMDEyMzgsCi0weGFlZTIwMDAwLCAweDM0NDIzMDAwLCAweGFmYTIwMDE4LCAweDhlZTIwNjA4LAotMHg4ZjQzMDIyOCwgMHgyNDQyMDAwMSwgMHgzMDQ5MDBmZiwgMHg1MTIzMDBlMiwKLTB4YWZhMDAwMTAsIDB4OGVlMjA2MDgsIDB4MjEwYzAsIDB4NTcxMDIxLAotMHg4ZmEzMDAxOCwgMHg4ZmE0MDAxYywgMHhhYzQzMDYwYywgMHhhYzQ0MDYxMCwKLTB4OGY4NzAxMjAsIDB4Mjc2MjM4MDAsIDB4MjRlODAwMjAsIDB4MTAyMTAyYiwKLTB4NTA0MDAwMDEsIDB4Mjc2ODMwMDAsIDB4OGY4MjAxMjgsIDB4MTEwMjAwMDQsCi0weDAsIDB4OGY4MjAxMjQsIDB4MTUwMjAwMDcsIDB4MTAyMSwKLTB4OGVlMjAxYTQsIDB4MzAyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwKLTB4ODAwMTFhMCwgMHg4ZWUyMDFhNCwgMHg4ZWU0MDYwOCwgMHg0MjBjMCwKLTB4ODAxODIxLCAweDhlZTQwNDMwLCAweDhlZTUwNDM0LCAweGEzMjgyMSwKLTB4YTMzMDJiLCAweDgyMjAyMSwgMHg4NjIwMjEsIDB4YWNlNDAwMDAsCi0weGFjZTUwMDA0LCAweDhlZTMwNjA4LCAweDI0MDIwMDA4LCAweGE0ZTIwMDBlLAotMHgyNDAyMDAwZCwgMHhhY2UyMDAxOCwgMHhhY2U5MDAxYywgMHgzMThjMCwKLTB4MjQ2MzA2MGMsIDB4MmUzMTAyMSwgMHhhY2UyMDAwOCwgMHg4ZWUyMDRjNCwKLTB4YWNlMjAwMTAsIDB4YWY4ODAxMjAsIDB4OTJlMjRlMjAsIDB4MTQ0MDAwMzcsCi0weDI0MDYwMDAxLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LAotMHgyZTIyMDIxLCAweDhjODMwMDAwLCAweDI0MDIwMDA3LCAweDE0NjIwMDFmLAotMHgwLCAweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAweDEwNjIwMDFiLAotMHgyNDAzMDA0MCwgMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwKLTB4OGVlMjRlMzQsIDB4OGVlNTRlMzAsIDB4MjQ0MjAwMDEsIDB4MTA0MzAwMDcsCi0weDAsIDB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIDB4MTBhMjAwMDUsCi0weDAsIDB4ODAwMTE4YSwgMHgwLCAweDE0YTAwMDA1LAotMHgwLCAweDhmODIwMTI4LCAweDI0NDIwMDIwLCAweGFmODIwMTI4LAotMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMywKLTB4YWM4MDAwMDAsIDB4ODAwMTFhMCwgMHgwLCAweDhlZTI0ZTMwLAotMHgyNDAzMDA0MCwgMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywgMHgxMDIxLAotMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwKLTB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHgyNDAyMDAwNywKLTB4YWM4MjAwMDAsIDB4MjQwMjAwMDEsIDB4YWM4MjAwMDQsIDB4NTRjMDAwMGMsCi0weGFlZTkwNjA4LCAweDNjMDQwMDAxLCAweDI0ODQ1MWM4LCAweGFmYTAwMDEwLAotMHhhZmEwMDAxNCwgMHg4ZWU2MDYwOCwgMHg4ZjQ3MDIyOCwgMHgzYzA1MDAwOSwKLTB4YzAwMjQwMywgMHgzNGE1ZjAwMCwgMHg4MDAxMjIzLCAweDAsCi0weDhmODMwMTIwLCAweDI3NjIzODAwLCAweDI0NjYwMDIwLCAweGMyMTAyYiwKLTB4NTA0MDAwMDEsIDB4Mjc2NjMwMDAsIDB4OGY4MjAxMjgsIDB4MTBjMjAwMDQsCi0weDAsIDB4OGY4MjAxMjQsIDB4MTRjMjAwMDcsIDB4MCwKLTB4OGVlMjAxYTQsIDB4MzAyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwKLTB4ODAwMTIwNywgMHg4ZWUyMDFhNCwgMHg4ZWUyMDYwOCwgMHhhYzYyMDAxYywKLTB4OGVlNDA0YTAsIDB4OGVlNTA0YTQsIDB4MjQ2MjAwMWMsIDB4YWM2MjAwMDgsCi0weDI0MDIwMDA4LCAweGE0NjIwMDBlLCAweDI0MDIwMDExLCAweGFjNjIwMDE4LAotMHhhYzY0MDAwMCwgMHhhYzY1MDAwNCwgMHg4ZWUyMDRjNCwgMHhhYzYyMDAxMCwKLTB4YWY4NjAxMjAsIDB4OTJlMjRlMjAsIDB4MTQ0MDAwMzcsIDB4MjQwNjAwMDEsCi0weDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsCi0weDhjODMwMDAwLCAweDI0MDIwMDEyLCAweDE0NjIwMDFmLCAweDAsCi0weDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAweDI0MDMwMDQwLAotMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwKLTB4OGVlNTRlMzAsIDB4MjQ0MjAwMDEsIDB4MTA0MzAwMDcsIDB4MCwKLTB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIDB4MTBhMjAwMDUsIDB4MCwKLTB4ODAwMTFmMSwgMHgwLCAweDE0YTAwMDA1LCAweDAsCi0weDhmODIwMTI4LCAweDI0NDIwMDIwLCAweGFmODIwMTI4LCAweDhmODIwMTI4LAotMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwKLTB4ODAwMTIwNywgMHgwLCAweDhlZTI0ZTMwLCAweDI0MDMwMDQwLAotMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywgMHgxMDIxLCAweDhlZTI0ZTMwLAotMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwKLTB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHgyNDAyMDAxMiwgMHhhYzgyMDAwMCwKLTB4MjQwMjAwMDEsIDB4YWM4MjAwMDQsIDB4MTRjMDAwMWIsIDB4MCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDUxZDAsIDB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsCi0weDhlZTYwNjA4LCAweDhmNDcwMjI4LCAweDNjMDUwMDA5LCAweGMwMDI0MDMsCi0weDM0YTVmMDAxLCAweDhlZTIwMWIwLCAweDI0NDIwMDAxLCAweGFlZTIwMWIwLAotMHg4MDAxMjIzLCAweDhlZTIwMWIwLCAweDNjMDQwMDAxLCAweDI0ODQ1MWRjLAotMHhhZmEwMDAxNCwgMHg4ZWU2MDYwOCwgMHg4ZjQ3MDIyOCwgMHgzYzA1MDAwOSwKLTB4YzAwMjQwMywgMHgzNGE1ZjAwNSwgMHg4ZWUyMDFhYywgMHgyNDQyMDAwMSwKLTB4YWVlMjAxYWMsIDB4OGVlMjAxYWMsIDB4OGVlMjAxNjAsIDB4M2MwNDAwMDEsCi0weDI0ODQ1MWU4LCAweDM0MDVmMDAxLCAweDI0NDIwMDAxLCAweGFlZTIwMTYwLAotMHg4ZWUyMDE2MCwgMHgzMDIxLCAweDM4MjEsIDB4YWZhMDAwMTAsCi0weGMwMDI0MDMsIDB4YWZhMDAwMTQsIDB4ODAwMTIzOCwgMHgwLAotMHgzYzAyMDAwMSwgMHgyNDQyZjVhOCwgMHgyMTEwMCwgMHgyMTE4MiwKLTB4NDMxMDI1LCAweDNjMDEwMDAxLCAweGFjMjIxMjc4LCAweDk2ZTIwNDVhLAotMHgzMDQyMDAwMywgMHgxMDQwMDAyNSwgMHgzYzA1MGZmZiwgMHg4ZWUyMDRjOCwKLTB4MzRhNWZmZmYsIDB4MzQ0MjBhMDAsIDB4YWVlMjA0YzgsIDB4OGVlMzA0YzgsCi0weDNjMDQwMDAxLCAweDI0ODQ1MWY0LCAweDI0MDIwMDAxLCAweGEyZTIwNGVjLAotMHhhMmUyMDRlZCwgMHgzYzAyMDAwMiwgMHg2MjE4MjUsIDB4M2MwMjAwMDEsCi0weDI0NDJhMzkwLCAweDQ1MTAyNCwgMHgyMTA4MiwgMHhhZWUzMDRjOCwKLTB4M2MwMzA4MDAsIDB4NDMxMDI1LCAweDNjMDEwMDAxLCAweGFjMjIxMjIwLAotMHgzYzAyMDAwMSwgMHgyNDQyYWRkNCwgMHg0NTEwMjQsIDB4MjEwODIsCi0weDQzMTAyNSwgMHgzYzAxMDAwMSwgMHhhYzIyMTI4MCwgMHg5NmU2MDQ1YSwKLTB4MzgyMSwgMHgyNDA1MDAxMSwgMHhhZmEwMDAxMCwgMHhjMDAyNDAzLAotMHhhZmEwMDAxNCwgMHg4MDAxMjY4LCAweDAsIDB4M2MwMjAwMDEsCi0weDI0NDJhOWQ0LCAweDIxMTAwLCAweDIxMTgyLCAweDNjMDMwODAwLAotMHg0MzEwMjUsIDB4M2MwMTAwMDEsIDB4YWMyMjEyODAsIDB4OTZlMjA0NmEsCi0weDMwNDIwMDEwLCAweDE0NDAwMDA5LCAweDAsIDB4OTZlMjA0N2EsCi0weDMwNDIwMDEwLCAweDEwNDAwMTEyLCAweDAsIDB4OTZlMjA0NmEsCi0weDMwNDIwMDEwLCAweDEwNDAwMDA1LCAweDNjMDIwNzAwLCAweDk2ZTIwNDdhLAotMHgzMDQyMDAxMCwgMHgxNDQwMDEwMiwgMHgzYzAyMDcwMCwgMHgzNDQyMzAwMCwKLTB4YWZhMjAwMTgsIDB4OGVlMjA2MDgsIDB4OGY0MzAyMjgsIDB4MjQ0MjAwMDEsCi0weDMwNDkwMGZmLCAweDUxMjMwMGUyLCAweGFmYTAwMDEwLCAweDhlZTIwNjA4LAotMHgyMTBjMCwgMHg1NzEwMjEsIDB4OGZhMzAwMTgsIDB4OGZhNDAwMWMsCi0weGFjNDMwNjBjLCAweGFjNDQwNjEwLCAweDhmODcwMTIwLCAweDI3NjIzODAwLAotMHgyNGU4MDAyMCwgMHgxMDIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjgzMDAwLAotMHg4ZjgyMDEyOCwgMHgxMTAyMDAwNCwgMHgwLCAweDhmODIwMTI0LAotMHgxNTAyMDAwNywgMHgxMDIxLCAweDhlZTIwMWE0LCAweDMwMjEsCi0weDI0NDIwMDAxLCAweGFlZTIwMWE0LCAweDgwMDEyZWEsIDB4OGVlMjAxYTQsCi0weDhlZTQwNjA4LCAweDQyMGMwLCAweDgwMTgyMSwgMHg4ZWU0MDQzMCwKLTB4OGVlNTA0MzQsIDB4YTMyODIxLCAweGEzMzAyYiwgMHg4MjIwMjEsCi0weDg2MjAyMSwgMHhhY2U0MDAwMCwgMHhhY2U1MDAwNCwgMHg4ZWUzMDYwOCwKLTB4MjQwMjAwMDgsIDB4YTRlMjAwMGUsIDB4MjQwMjAwMGQsIDB4YWNlMjAwMTgsCi0weGFjZTkwMDFjLCAweDMxOGMwLCAweDI0NjMwNjBjLCAweDJlMzEwMjEsCi0weGFjZTIwMDA4LCAweDhlZTIwNGM0LCAweGFjZTIwMDEwLCAweGFmODgwMTIwLAotMHg5MmUyNGUyMCwgMHgxNDQwMDAzNywgMHgyNDA2MDAwMSwgMHg4ZWUyNGUzMCwKLTB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHg4YzgzMDAwMCwKLTB4MjQwMjAwMDcsIDB4MTQ2MjAwMWYsIDB4MCwgMHg4ZWUzNGUzMCwKLTB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIDB4MjQwMzAwNDAsIDB4OGM4MjAwMDQsCi0weDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTM0LCAweDhlZTU0ZTMwLAotMHgyNDQyMDAwMSwgMHgxMDQzMDAwNywgMHgwLCAweDhlZTI0ZTM0LAotMHgyNDQyMDAwMSwgMHgxMGEyMDAwNSwgMHgwLCAweDgwMDEyZDQsCi0weDAsIDB4MTRhMDAwMDUsIDB4MCwgMHg4ZjgyMDEyOCwKLTB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsCi0weDJjNDIwMDExLCAweDUwNDAwMDEzLCAweGFjODAwMDAwLCAweDgwMDEyZWEsCi0weDAsIDB4OGVlMjRlMzAsIDB4MjQwMzAwNDAsIDB4MjQ0MjAwMDEsCi0weDUwNDMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsCi0weGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LAotMHgyZTIyMDIxLCAweDI0MDIwMDA3LCAweGFjODIwMDAwLCAweDI0MDIwMDAxLAotMHhhYzgyMDAwNCwgMHg1NGMwMDAwYywgMHhhZWU5MDYwOCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDUxYzgsIDB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsIDB4OGVlNjA2MDgsCi0weDhmNDcwMjI4LCAweDNjMDUwMDA5LCAweGMwMDI0MDMsIDB4MzRhNWYwMDAsCi0weDgwMDEzNmQsIDB4MCwgMHg4ZjgzMDEyMCwgMHgyNzYyMzgwMCwKLTB4MjQ2NjAwMjAsIDB4YzIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjYzMDAwLAotMHg4ZjgyMDEyOCwgMHgxMGMyMDAwNCwgMHgwLCAweDhmODIwMTI0LAotMHgxNGMyMDAwNywgMHgwLCAweDhlZTIwMWE0LCAweDMwMjEsCi0weDI0NDIwMDAxLCAweGFlZTIwMWE0LCAweDgwMDEzNTEsIDB4OGVlMjAxYTQsCi0weDhlZTIwNjA4LCAweGFjNjIwMDFjLCAweDhlZTQwNGEwLCAweDhlZTUwNGE0LAotMHgyNDYyMDAxYywgMHhhYzYyMDAwOCwgMHgyNDAyMDAwOCwgMHhhNDYyMDAwZSwKLTB4MjQwMjAwMTEsIDB4YWM2MjAwMTgsIDB4YWM2NDAwMDAsIDB4YWM2NTAwMDQsCi0weDhlZTIwNGM0LCAweGFjNjIwMDEwLCAweGFmODYwMTIwLCAweDkyZTI0ZTIwLAotMHgxNDQwMDAzNywgMHgyNDA2MDAwMSwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwKLTB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHg4YzgzMDAwMCwgMHgyNDAyMDAxMiwKLTB4MTQ2MjAwMWYsIDB4MCwgMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwKLTB4MTA2MjAwMWIsIDB4MjQwMzAwNDAsIDB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsCi0weGFjODIwMDA0LCAweDhlZTI0ZTM0LCAweDhlZTU0ZTMwLCAweDI0NDIwMDAxLAotMHgxMDQzMDAwNywgMHgwLCAweDhlZTI0ZTM0LCAweDI0NDIwMDAxLAotMHgxMGEyMDAwNSwgMHgwLCAweDgwMDEzM2IsIDB4MCwKLTB4MTRhMDAwMDUsIDB4MCwgMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwKLTB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsCi0weDUwNDAwMDEzLCAweGFjODAwMDAwLCAweDgwMDEzNTEsIDB4MCwKLTB4OGVlMjRlMzAsIDB4MjQwMzAwNDAsIDB4MjQ0MjAwMDEsIDB4NTA0MzAwMDMsCi0weDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsCi0weDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsCi0weDI0MDIwMDEyLCAweGFjODIwMDAwLCAweDI0MDIwMDAxLCAweGFjODIwMDA0LAotMHgxNGMwMDAxYiwgMHgwLCAweDNjMDQwMDAxLCAweDI0ODQ1MWQwLAotMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgMHg4ZWU2MDYwOCwgMHg4ZjQ3MDIyOCwKLTB4M2MwNTAwMDksIDB4YzAwMjQwMywgMHgzNGE1ZjAwMSwgMHg4ZWUyMDFiMCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxYjAsIDB4ODAwMTM2ZCwgMHg4ZWUyMDFiMCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDUxZGMsIDB4YWZhMDAwMTQsIDB4OGVlNjA2MDgsCi0weDhmNDcwMjI4LCAweDNjMDUwMDA5LCAweGMwMDI0MDMsIDB4MzRhNWYwMDUsCi0weDhlZTIwMWFjLCAweDI0NDIwMDAxLCAweGFlZTIwMWFjLCAweDhlZTIwMWFjLAotMHg4ZWUyMDE2MCwgMHgzYzA0MDAwMSwgMHgyNDg0NTFlOCwgMHgzNDA1ZjAwMiwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxNjAsIDB4OGVlMjAxNjAsIDB4MzAyMSwKLTB4MzgyMSwgMHhhZmEwMDAxMCwgMHhjMDAyNDAzLCAweGFmYTAwMDE0LAotMHg5NmU2MDQ3YSwgMHg5NmU3MDQ2YSwgMHgzYzA0MDAwMSwgMHgyNDg0NTIwMCwKLTB4MjQwNTAwMTIsIDB4YWZhMDAwMTAsIDB4YzAwMjQwMywgMHhhZmEwMDAxNCwKLTB4YzAwNDUwMCwgMHgwLCAweGMwMDIzMTgsIDB4MCwKLTB4M2MwNjAwMDEsIDB4MzRjNjM4MDAsIDB4YWVlMDA2MDgsIDB4YWY0MDAyMjgsCi0weGFmNDAwMjJjLCAweDk2ZTMwNDU4LCAweDhlZTQwMDAwLCAweDNjMDUxMmQ4LAotMHgzNGE1YzM1OCwgMHgyNzYyMzgwMCwgMHhhZWUyNzI1OCwgMHgyNzYyMzgwMCwKLTB4YWVlMjcyNjAsIDB4Mjc2MjM4MDAsIDB4YWVlMjcyNjQsIDB4MzY2MTAyMSwKLTB4YWVlMjcyNzAsIDB4MjQwMmZmZmYsIDB4YWVlMDA0ZDQsIDB4YWVlMDA0ZTAsCi0weGFlZTAwNGU0LCAweGFlZTAwNGYwLCAweGEyZTAwNGY0LCAweGFlZTAwZTBjLAotMHhhZWUwMGUxOCwgMHhhZWUwMGUxMCwgMHhhZWUwMGUxNCwgMHhhZWUwMGUxYywKLTB4YWVlMDcyNGMsIDB4YWVlMDUyNDQsIDB4YWVlMDUyNDAsIDB4YWVlMDUyM2MsCi0weGFlZTA3MjUwLCAweGFlZTA3MjU0LCAweGFlZTA3MjVjLCAweGFlZTA3MjY4LAotMHhhZWUwMDRkMCwgMHgyNDYzZmZmZiwgMHg4NTIwMjUsIDB4YWVlMzA0ZjgsCi0weGFlZTQwMDAwLCAweGFmODAwMDYwLCAweGFmODIwMDY0LCAweDNjMDIwMTAwLAotMHhhZmEyMDAxOCwgMHg4ZWUyMDYwOCwgMHg4ZjQzMDIyOCwgMHgyNDQyMDAwMSwKLTB4MzA0OTAwZmYsIDB4NTEyMzAwZTIsIDB4YWZhMDAwMTAsIDB4OGVlMjA2MDgsCi0weDIxMGMwLCAweDU3MTAyMSwgMHg4ZmEzMDAxOCwgMHg4ZmE0MDAxYywKLTB4YWM0MzA2MGMsIDB4YWM0NDA2MTAsIDB4OGY4NzAxMjAsIDB4Mjc2MjM4MDAsCi0weDI0ZTgwMDIwLCAweDEwMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2ODMwMDAsCi0weDhmODIwMTI4LCAweDExMDIwMDA0LCAweDAsIDB4OGY4MjAxMjQsCi0weDE1MDIwMDA3LCAweDEwMjEsIDB4OGVlMjAxYTQsIDB4MzAyMSwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsIDB4ODAwMTQyMiwgMHg4ZWUyMDFhNCwKLTB4OGVlNDA2MDgsIDB4NDIwYzAsIDB4ODAxODIxLCAweDhlZTQwNDMwLAotMHg4ZWU1MDQzNCwgMHhhMzI4MjEsIDB4YTMzMDJiLCAweDgyMjAyMSwKLTB4ODYyMDIxLCAweGFjZTQwMDAwLCAweGFjZTUwMDA0LCAweDhlZTMwNjA4LAotMHgyNDAyMDAwOCwgMHhhNGUyMDAwZSwgMHgyNDAyMDAwZCwgMHhhY2UyMDAxOCwKLTB4YWNlOTAwMWMsIDB4MzE4YzAsIDB4MjQ2MzA2MGMsIDB4MmUzMTAyMSwKLTB4YWNlMjAwMDgsIDB4OGVlMjA0YzQsIDB4YWNlMjAwMTAsIDB4YWY4ODAxMjAsCi0weDkyZTI0ZTIwLCAweDE0NDAwMDM3LCAweDI0MDYwMDAxLCAweDhlZTI0ZTMwLAotMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDhjODMwMDAwLAotMHgyNDAyMDAwNywgMHgxNDYyMDAxZiwgMHgwLCAweDhlZTM0ZTMwLAotMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgMHgyNDAzMDA0MCwgMHg4YzgyMDAwNCwKLTB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIDB4OGVlNTRlMzAsCi0weDI0NDIwMDAxLCAweDEwNDMwMDA3LCAweDAsIDB4OGVlMjRlMzQsCi0weDI0NDIwMDAxLCAweDEwYTIwMDA1LCAweDAsIDB4ODAwMTQwYywKLTB4MCwgMHgxNGEwMDAwNSwgMHgwLCAweDhmODIwMTI4LAotMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwKLTB4MmM0MjAwMTEsIDB4NTA0MDAwMTMsIDB4YWM4MDAwMDAsIDB4ODAwMTQyMiwKLTB4MCwgMHg4ZWUyNGUzMCwgMHgyNDAzMDA0MCwgMHgyNDQyMDAwMSwKLTB4NTA0MzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwKLTB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsCi0weDJlMjIwMjEsIDB4MjQwMjAwMDcsIDB4YWM4MjAwMDAsIDB4MjQwMjAwMDEsCi0weGFjODIwMDA0LCAweDU0YzAwMDBjLCAweGFlZTkwNjA4LCAweDNjMDQwMDAxLAotMHgyNDg0NTFjOCwgMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgMHg4ZWU2MDYwOCwKLTB4OGY0NzAyMjgsIDB4M2MwNTAwMDksIDB4YzAwMjQwMywgMHgzNGE1ZjAwMCwKLTB4ODAwMTRhNSwgMHgwLCAweDhmODMwMTIwLCAweDI3NjIzODAwLAotMHgyNDY2MDAyMCwgMHhjMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2NjMwMDAsCi0weDhmODIwMTI4LCAweDEwYzIwMDA0LCAweDAsIDB4OGY4MjAxMjQsCi0weDE0YzIwMDA3LCAweDAsIDB4OGVlMjAxYTQsIDB4MzAyMSwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsIDB4ODAwMTQ4OSwgMHg4ZWUyMDFhNCwKLTB4OGVlMjA2MDgsIDB4YWM2MjAwMWMsIDB4OGVlNDA0YTAsIDB4OGVlNTA0YTQsCi0weDI0NjIwMDFjLCAweGFjNjIwMDA4LCAweDI0MDIwMDA4LCAweGE0NjIwMDBlLAotMHgyNDAyMDAxMSwgMHhhYzYyMDAxOCwgMHhhYzY0MDAwMCwgMHhhYzY1MDAwNCwKLTB4OGVlMjA0YzQsIDB4YWM2MjAwMTAsIDB4YWY4NjAxMjAsIDB4OTJlMjRlMjAsCi0weDE0NDAwMDM3LCAweDI0MDYwMDAxLCAweDhlZTI0ZTMwLCAweDIxMGMwLAotMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDhjODMwMDAwLCAweDI0MDIwMDEyLAotMHgxNDYyMDAxZiwgMHgwLCAweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LAotMHgxMDYyMDAxYiwgMHgyNDAzMDA0MCwgMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwKLTB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIDB4OGVlNTRlMzAsIDB4MjQ0MjAwMDEsCi0weDEwNDMwMDA3LCAweDAsIDB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsCi0weDEwYTIwMDA1LCAweDAsIDB4ODAwMTQ3MywgMHgwLAotMHgxNGEwMDAwNSwgMHgwLCAweDhmODIwMTI4LCAweDI0NDIwMDIwLAotMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwKLTB4NTA0MDAwMTMsIDB4YWM4MDAwMDAsIDB4ODAwMTQ4OSwgMHgwLAotMHg4ZWUyNGUzMCwgMHgyNDAzMDA0MCwgMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywKLTB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwKLTB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwKLTB4MjQwMjAwMTIsIDB4YWM4MjAwMDAsIDB4MjQwMjAwMDEsIDB4YWM4MjAwMDQsCi0weDE0YzAwMDFiLCAweDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDUxZDAsCi0weGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhlZTYwNjA4LCAweDhmNDcwMjI4LAotMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAweDM0YTVmMDAxLCAweDhlZTIwMWIwLAotMHgyNDQyMDAwMSwgMHhhZWUyMDFiMCwgMHg4MDAxNGE1LCAweDhlZTIwMWIwLAotMHgzYzA0MDAwMSwgMHgyNDg0NTFkYywgMHhhZmEwMDAxNCwgMHg4ZWU2MDYwOCwKLTB4OGY0NzAyMjgsIDB4M2MwNTAwMDksIDB4YzAwMjQwMywgMHgzNGE1ZjAwNSwKLTB4OGVlMjAxYWMsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYWMsIDB4OGVlMjAxYWMsCi0weDhlZTIwMTU0LCAweDI0NDIwMDAxLCAweGFlZTIwMTU0LCAweGMwMDE0ZGMsCi0weDhlZTIwMTU0LCAweDhmODIwMGEwLCAweDMwNDIwMDA0LCAweDE0NDBmZmZkLAotMHgwLCAweDhmODIwMDQwLCAweDMwNDIwMDAxLCAweDE0NDAwMDA4LAotMHgwLCAweDhmNDMwMTA0LCAweDI0MDIwMDAxLCAweDEwNjIwMDA0LAotMHgwLCAweDhmNDIwMjY0LCAweDEwNDAwMDA2LCAweDAsCi0weDhlZTIwMTdjLCAweDI0NDIwMDAxLCAweGFlZTIwMTdjLCAweDgwMDE0YzUsCi0weDhlZTIwMTdjLCAweDhmODIwMDQ0LCAweDM0NDIwMDA0LCAweGFmODIwMDQ0LAotMHg4ZWUyMDE3OCwgMHgyNDQyMDAwMSwgMHhhZWUyMDE3OCwgMHg4ZWUyMDE3OCwKLTB4OGY4MjAwZDgsIDB4OGY4MzAwZDQsIDB4NDMxMDIzLCAweGFlZTI3MjZjLAotMHg4ZWUyNzI2YywgMHgxYzQwMDAwMywgMHgzYzAzMDAwMSwgMHg0MzEwMjEsCi0weGFlZTI3MjZjLCAweGMwMDQwNjQsIDB4MCwgMHhjMDA0NDQwLAotMHhhZjgwMDIyOCwgMHg4ZmJmMDAyNCwgMHg4ZmIwMDAyMCwgMHgzZTAwMDA4LAotMHgyN2JkMDAyOCwgMHgzZTAwMDA4LCAweDAsIDB4M2UwMDAwOCwKLTB4MCwgMHgwLCAweDAsIDB4MjQwMjAwMmMsCi0weGFmODIwMDUwLCAweGFlZTA3Mjc0LCAweDhmNDIwMjM4LCAweGFlZTI3Mjc4LAotMHg4ZjgyMDA1NCwgMHgyNDQyMDA2NywgMHhhZjgyMDA1OCwgMHhhZWUwN2I4OCwKLTB4YWVlMDdiOGMsIDB4YWVlMDdiODQsIDB4M2MwMTAwMDEsIDB4MzcwODIxLAotMHhhYzIwODNiYywgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4M2UwMDAwOCwKLTB4YTAyMDgzYjksIDB4MjdiZGZmZDgsIDB4YWZiZjAwMjQsIDB4YWZiMDAwMjAsCi0weDhmODIwMDU0LCAweDNjMDMwMDAxLCAweDhjNjM1Y2Q4LCAweDI0NDIwMDY3LAotMHgxMDYwMDAwZCwgMHhhZjgyMDA1OCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsCi0weDkwNDI4M2I4LCAweDEwNDAwMDA1LCAweDNjMDMwMjAwLCAweDNjMDEwMDAxLAotMHgzNzA4MjEsIDB4ODAwMTUwMywgMHhhMDIwODNiOCwgMHg4ZWUyMDAwMCwKLTB4NDMxMDI1LCAweGFlZTIwMDAwLCAweDhmNDIwMjE4LCAweDMwNDIwMTAwLAotMHgxMDQwMDBjNiwgMHgwLCAweDhmODIwMGIwLCAweDMwNDIwMDA0LAotMHgxMDQwMDBjMiwgMHgwLCAweDNjMDMwMDAxLCAweDc3MTgyMSwKLTB4OGM2MzgzZDAsIDB4OGY4MjAxMDQsIDB4MTQ2MjAwYjQsIDB4MCwKLTB4M2MwMzAwMDEsIDB4NzcxODIxLCAweDhjNjM4M2Q0LCAweDhmODIwMGI0LAotMHgxNDYyMDBhZSwgMHgwLCAweDhmODIwMGIwLCAweDNjMDMwMDgwLAotMHg0MzEwMjQsIDB4MTA0MDAwMGQsIDB4MCwgMHg4ZjgyMDExYywKLTB4MzQ0MjAwMDIsIDB4YWY4MjAxMWMsIDB4OGY4MjAwYjAsIDB4MjQwM2ZmZmIsCi0weDQzMTAyNCwgMHhhZjgyMDBiMCwgMHg4ZjgyMDExYywgMHgyNDAzZmZmZCwKLTB4NDMxMDI0LCAweDgwMDE1Y2MsIDB4YWY4MjAxMWMsIDB4M2MwMzAwMDEsCi0weDc3MTgyMSwgMHg4YzYzODNkMCwgMHg4ZjgyMDEwNCwgMHgxNDYyMDA4MiwKLTB4MCwgMHgzYzAzMDAwMSwgMHg3NzE4MjEsIDB4OGM2MzgzZDQsCi0weDhmODIwMGI0LCAweDE0NjIwMDdjLCAweDAsIDB4M2MwNzAwMDEsCi0weGY3MzgyMSwgMHg4Y2U3ODNkMCwgMHg4ZjgyMDBiMCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDUyNzAsIDB4YWZhMDAwMTQsIDB4YWZhMjAwMTAsIDB4OGY4NjAwYjAsCi0weDNjMDUwMDA1LCAweGMwMDI0MDMsIDB4MzRhNTA5MDAsIDB4OGY4MjAxMWMsCi0weDM0NDIwMDAyLCAweGFmODIwMTFjLCAweDhmODMwMTA0LCAweDhmODIwMGIwLAotMHgzNDQyMDAwMSwgMHhhZjgyMDBiMCwgMHhhZjgzMDEwNCwgMHg4ZjgzMDEyMCwKLTB4Mjc2MjM4MDAsIDB4MjQ2NjAwMjAsIDB4YzIxMDJiLCAweDUwNDAwMDAxLAotMHgyNzY2MzAwMCwgMHg4ZjgyMDEyOCwgMHgxMGMyMDAwNCwgMHgwLAotMHg4ZjgyMDEyNCwgMHgxNGMyMDAwNiwgMHgwLCAweDhlZTIwMWE0LAotMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgMHg4MDAxNWEwLCAweDhlZTIwMWE0LAotMHg4ZjQ0MDIwOCwgMHg4ZjQ1MDIwYywgMHgyNmUyMDAzMCwgMHhhYzYyMDAwOCwKLTB4MjQwMjA0MDAsIDB4YTQ2MjAwMGUsIDB4MjQwMjAwMGYsIDB4YWM2MjAwMTgsCi0weGFjNjAwMDFjLCAweGFjNjQwMDAwLCAweGFjNjUwMDA0LCAweDhlZTIwNGM0LAotMHhhYzYyMDAxMCwgMHhhZjg2MDEyMCwgMHg5MmUyNGUyMCwgMHgxNDQwMDAzNywKLTB4MCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwKLTB4MmUyMjAyMSwgMHg4YzgzMDAwMCwgMHgyNDAyMDAwNywgMHgxNDYyMDAxZiwKLTB4MCwgMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwKLTB4MjQwMzAwNDAsIDB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsCi0weDhlZTI0ZTM0LCAweDhlZTU0ZTMwLCAweDI0NDIwMDAxLCAweDEwNDMwMDA3LAotMHgwLCAweDhlZTI0ZTM0LCAweDI0NDIwMDAxLCAweDEwYTIwMDA1LAotMHgwLCAweDgwMDE1OGEsIDB4MCwgMHgxNGEwMDAwNSwKLTB4MCwgMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwKLTB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIDB4NTA0MDAwMTMsCi0weGFjODAwMDAwLCAweDgwMDE1YTAsIDB4MCwgMHg4ZWUyNGUzMCwKLTB4MjQwMzAwNDAsIDB4MjQ0MjAwMDEsIDB4NTA0MzAwMDMsIDB4MTAyMSwKLTB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsCi0weDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4MjQwMjAwMDcsCi0weGFjODIwMDAwLCAweDI0MDIwMDAxLCAweGFjODIwMDA0LCAweDhmODIwMTFjLAotMHgyNDAzZmZmZCwgMHg0MzEwMjQsIDB4YWY4MjAxMWMsIDB4OGVlMjAxZTQsCi0weDNjMDcwMDAxLCAweGY3MzgyMSwgMHg4Y2U3ODNkMCwgMHgyNDQyMDAwMSwKLTB4YWVlMjAxZTQsIDB4OGVlMjAxZTQsIDB4M2MwNDAwMDEsIDB4MjQ4NDUyN2MsCi0weDgwMDE1YmQsIDB4YWZhMDAwMTAsIDB4OGY4MjAxMDQsIDB4M2MwMTAwMDEsCi0weDM3MDgyMSwgMHhhYzIyODNkMCwgMHg4ZjgyMDBiNCwgMHgzYzA3MDAwMSwKLTB4ZjczODIxLCAweDhjZTc4M2QwLCAweDNjMDQwMDAxLCAweDI0ODQ1Mjg0LAotMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YWMyMjgzZDQsIDB4YWZhMDAwMTAsCi0weGFmYTAwMDE0LCAweDhmODYwMGIwLCAweDNjMDUwMDA1LCAweGMwMDI0MDMsCi0weDM0YTUwOTAwLCAweDgwMDE1Y2MsIDB4MCwgMHg4ZjgyMDEwNCwKLTB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjI4M2QwLCAweDhmODIwMGI0LAotMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YWMyMjgzZDQsIDB4OGVlMjcyNzQsCi0weDkyZTMwNGY0LCAweDI0NDIwMDY3LCAweDE0NjAwMDA2LCAweGFlZTI3Mjc0LAotMHg4ZWUyNzI3NCwgMHg4ZjQzMDIzNCwgMHg0MzEwMmIsIDB4MTQ0MDAwN2IsCi0weDAsIDB4OGVlMzA0ZTQsIDB4OGVlMjA0ZjgsIDB4MTQ2MjAwMDQsCi0weDAsIDB4OTJlMjA0ZjQsIDB4NTA0MDAwNzQsIDB4YTJlMDA0ZjQsCi0weDhmODMwMTIwLCAweDI3NjIzODAwLCAweDI0NjYwMDIwLCAweGMyMTAyYiwKLTB4NTA0MDAwMDEsIDB4Mjc2NjMwMDAsIDB4OGY4MjAxMjgsIDB4MTBjMjAwMDQsCi0weDAsIDB4OGY4MjAxMjQsIDB4MTRjMjAwMDcsIDB4MCwKLTB4OGVlMjAxYTQsIDB4ODAyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwKLTB4ODAwMTYzNywgMHg4ZWUyMDFhNCwgMHg4ZWUyMDRlNCwgMHhhYzYyMDAxYywKLTB4OGVlNDA0YjAsIDB4OGVlNTA0YjQsIDB4MjQ2MjAwMWMsIDB4YWM2MjAwMDgsCi0weDI0MDIwMDA4LCAweGE0NjIwMDBlLCAweDI0MDIwMDExLCAweGFjNjIwMDE4LAotMHhhYzY0MDAwMCwgMHhhYzY1MDAwNCwgMHg4ZWUyMDRjNCwgMHhhYzYyMDAxMCwKLTB4YWY4NjAxMjAsIDB4OTJlMjRlMjAsIDB4MTQ0MDAwMzcsIDB4MjQxMDAwMDEsCi0weDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsCi0weDhjODMwMDAwLCAweDI0MDIwMDEyLCAweDE0NjIwMDFmLCAweDAsCi0weDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAweDI0MDMwMDQwLAotMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwKLTB4OGVlNTRlMzAsIDB4MjQ0MjAwMDEsIDB4MTA0MzAwMDcsIDB4MCwKLTB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIDB4MTBhMjAwMDUsIDB4MCwKLTB4ODAwMTYyMSwgMHgwLCAweDE0YTAwMDA1LCAweDAsCi0weDhmODIwMTI4LCAweDI0NDIwMDIwLCAweGFmODIwMTI4LCAweDhmODIwMTI4LAotMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwKLTB4ODAwMTYzNywgMHgwLCAweDhlZTI0ZTMwLCAweDI0MDMwMDQwLAotMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywgMHgxMDIxLCAweDhlZTI0ZTMwLAotMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwKLTB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHgyNDAyMDAxMiwgMHhhYzgyMDAwMCwKLTB4MjQwMjAwMDEsIDB4YWM4MjAwMDQsIDB4NTYwMDAwMGIsIDB4MjQxMDAwMDEsCi0weDhlZTIwNGU0LCAweDNjMDQwMDAxLCAweDI0ODQ1MjhjLCAweGFmYTAwMDE0LAotMHhhZmEyMDAxMCwgMHg4ZWU2MDYwOCwgMHg4ZjQ3MDIyOCwgMHgzYzA1MDAwOSwKLTB4YzAwMjQwMywgMHgzNGE1ZjAwNiwgMHgxNjAwMDAwMywgMHgyNDAyMDAwMSwKLTB4ODAwMTY1MCwgMHhhMmUyMDRmNCwgMHg4ZWUyMDE3MCwgMHgyNDQyMDAwMSwKLTB4YWVlMjAxNzAsIDB4OGVlMjAxNzAsIDB4OGVlMjA0ZTQsIDB4YTJlMDA0ZjQsCi0weGFlZTAwNGYwLCAweGFlZTA3Mjc0LCAweGFlZTIwNGY4LCAweDhlZTIwZTFjLAotMHgxMDQwMDA2ZCwgMHgwLCAweDhmODMwMTIwLCAweDI3NjIzODAwLAotMHgyNDY2MDAyMCwgMHhjMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2NjMwMDAsCi0weDhmODIwMTI4LCAweDEwYzIwMDA0LCAweDAsIDB4OGY4MjAxMjQsCi0weDE0YzIwMDA3LCAweDAsIDB4OGVlMjAxYTQsIDB4ODAyMSwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsIDB4ODAwMTZhZCwgMHg4ZWUyMDFhNCwKLTB4OGVlMjcyNGMsIDB4YWM2MjAwMWMsIDB4OGVlNDA0YTgsIDB4OGVlNTA0YWMsCi0weDI0NjIwMDFjLCAweGFjNjIwMDA4LCAweDI0MDIwMDA4LCAweGE0NjIwMDBlLAotMHgyNDAyMDAxMSwgMHhhYzYyMDAxOCwgMHhhYzY0MDAwMCwgMHhhYzY1MDAwNCwKLTB4OGVlMjA0YzQsIDB4YWM2MjAwMTAsIDB4YWY4NjAxMjAsIDB4OTJlMjRlMjAsCi0weDE0NDAwMDM3LCAweDI0MTAwMDAxLCAweDhlZTI0ZTMwLCAweDIxMGMwLAotMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDhjODMwMDAwLCAweDI0MDIwMDEyLAotMHgxNDYyMDAxZiwgMHgwLCAweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LAotMHgxMDYyMDAxYiwgMHgyNDAzMDA0MCwgMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwKLTB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIDB4OGVlNTRlMzAsIDB4MjQ0MjAwMDEsCi0weDEwNDMwMDA3LCAweDAsIDB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsCi0weDEwYTIwMDA1LCAweDAsIDB4ODAwMTY5NywgMHgwLAotMHgxNGEwMDAwNSwgMHgwLCAweDhmODIwMTI4LCAweDI0NDIwMDIwLAotMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwKLTB4NTA0MDAwMTMsIDB4YWM4MDAwMDAsIDB4ODAwMTZhZCwgMHgwLAotMHg4ZWUyNGUzMCwgMHgyNDAzMDA0MCwgMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywKLTB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwKLTB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwKLTB4MjQwMjAwMTIsIDB4YWM4MjAwMDAsIDB4MjQwMjAwMDEsIDB4YWM4MjAwMDQsCi0weDU2MDAwMDBiLCAweDI0MTAwMDAxLCAweDhlZTI3MjRjLCAweDNjMDQwMDAxLAotMHgyNDg0NTI5OCwgMHhhZmEwMDAxNCwgMHhhZmEyMDAxMCwgMHg4ZWU2NzI0YywKLTB4OGY0NzAyODAsIDB4M2MwNTAwMDksIDB4YzAwMjQwMywgMHgzNGE1ZjAwOCwKLTB4NTYwMDAwMDEsIDB4YWVlMDBlMWMsIDB4OGVlMjAxNzQsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMTc0LCAweDhlZTIwMTc0LCAweDhlZTI0ZTI0LCAweDEwNDAwMDE5LAotMHgwLCAweGFlZTA0ZTI0LCAweDhmODIwMDQwLCAweDMwNDIwMDAxLAotMHgxNDQwMDAwOCwgMHgwLCAweDhmNDMwMTA0LCAweDI0MDIwMDAxLAotMHgxMDYyMDAwNCwgMHgwLCAweDhmNDIwMjY0LCAweDEwNDAwMDA2LAotMHgwLCAweDhlZTIwMTdjLCAweDI0NDIwMDAxLCAweGFlZTIwMTdjLAotMHg4MDAxNmRhLCAweDhlZTIwMTdjLCAweDhmODIwMDQ0LCAweDM0NDIwMDA0LAotMHhhZjgyMDA0NCwgMHg4ZWUyMDE3OCwgMHgyNDQyMDAwMSwgMHhhZWUyMDE3OCwKLTB4OGVlMjAxNzgsIDB4OGVlMjcyNzgsIDB4MjQ0MmZmOTksIDB4YWVlMjcyNzgsCi0weDhlZTI3Mjc4LCAweDFjNDAwMmFkLCAweDAsIDB4OGY0MjAyMzgsCi0weDEwNDAwMmFhLCAweDAsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLAotMHg5MDQyODNlMCwgMHgxNDQwMDJhNSwgMHgwLCAweDhmNDIwMDgwLAotMHhhZWUyMDA0YywgMHg4ZjQyMDBjMCwgMHhhZWUyMDA0OCwgMHg4ZjQyMDA4NCwKLTB4YWVlMjAwMzgsIDB4OGY0MjAwODQsIDB4YWVlMjAyNDQsIDB4OGY0MjAwODgsCi0weGFlZTIwMjQ4LCAweDhmNDIwMDhjLCAweGFlZTIwMjRjLCAweDhmNDIwMDkwLAotMHhhZWUyMDI1MCwgMHg4ZjQyMDA5NCwgMHhhZWUyMDI1NCwgMHg4ZjQyMDA5OCwKLTB4YWVlMjAyNTgsIDB4OGY0MjAwOWMsIDB4YWVlMjAyNWMsIDB4OGY0MjAwYTAsCi0weGFlZTIwMjYwLCAweDhmNDIwMGE0LCAweGFlZTIwMjY0LCAweDhmNDIwMGE4LAotMHhhZWUyMDI2OCwgMHg4ZjQyMDBhYywgMHhhZWUyMDI2YywgMHg4ZjQyMDBiMCwKLTB4YWVlMjAyNzAsIDB4OGY0MjAwYjQsIDB4YWVlMjAyNzQsIDB4OGY0MjAwYjgsCi0weGFlZTIwMjc4LCAweDhmNDIwMGJjLCAweDI0MDQwMDAxLCAweGFlZTIwMjdjLAotMHhhZWUwMDAzYywgMHg0MTA4MCwgMHg1NzEwMjEsIDB4OGVlMzAwM2MsCi0weDhjNDIwMjQ0LCAweDI0ODQwMDAxLCAweDYyMTgyMSwgMHgyYzgyMDAwZiwKLTB4YWVlMzAwM2MsIDB4MTQ0MGZmZjgsIDB4NDEwODAsIDB4OGY0MjAwY2MsCi0weGFlZTIwMDUwLCAweDhmNDIwMGQwLCAweGFlZTIwMDU0LCAweDhmODMwMTIwLAotMHgyNzYyMzgwMCwgMHgyNDY2MDAyMCwgMHhjMjEwMmIsIDB4NTA0MDAwMDEsCi0weDI3NjYzMDAwLCAweDhmODIwMTI4LCAweDEwYzIwMDA0LCAweDAsCi0weDhmODIwMTI0LCAweDE0YzIwMDA3LCAweDAsIDB4OGVlMjAxYTQsCi0weDgwMjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsIDB4ODAwMTc3NSwKLTB4OGVlMjAxYTQsIDB4OGY0NDAyMDgsIDB4OGY0NTAyMGMsIDB4MjZlMjAwMzAsCi0weGFjNjIwMDA4LCAweDI0MDIwNDAwLCAweGE0NjIwMDBlLCAweDI0MDIwMDBmLAotMHhhYzYyMDAxOCwgMHhhYzYwMDAxYywgMHhhYzY0MDAwMCwgMHhhYzY1MDAwNCwKLTB4OGVlMjA0YzQsIDB4YWM2MjAwMTAsIDB4YWY4NjAxMjAsIDB4OTJlMjRlMjAsCi0weDE0NDAwMDM3LCAweDI0MTAwMDAxLCAweDhlZTI0ZTMwLCAweDIxMGMwLAotMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDhjODMwMDAwLCAweDI0MDIwMDA3LAotMHgxNDYyMDAxZiwgMHgwLCAweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LAotMHgxMDYyMDAxYiwgMHgyNDAzMDA0MCwgMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwKLTB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIDB4OGVlNTRlMzAsIDB4MjQ0MjAwMDEsCi0weDEwNDMwMDA3LCAweDAsIDB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsCi0weDEwYTIwMDA1LCAweDAsIDB4ODAwMTc1ZiwgMHgwLAotMHgxNGEwMDAwNSwgMHgwLCAweDhmODIwMTI4LCAweDI0NDIwMDIwLAotMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwKLTB4NTA0MDAwMTMsIDB4YWM4MDAwMDAsIDB4ODAwMTc3NSwgMHgwLAotMHg4ZWUyNGUzMCwgMHgyNDAzMDA0MCwgMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywKLTB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwKLTB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwKLTB4MjQwMjAwMDcsIDB4YWM4MjAwMDAsIDB4MjQwMjAwMDEsIDB4YWM4MjAwMDQsCi0weDEyMDAwMjEyLCAweDNjMDIwNDAwLCAweGFmYTIwMDE4LCAweDNjMDIwMDAxLAotMHg1NzEwMjEsIDB4OTA0MjgzYjAsIDB4MTA0MDAxMGIsIDB4MCwKLTB4OGVlMjA2MDgsIDB4OGY0MzAyMjgsIDB4MjQ0MjAwMDEsIDB4MzA0YTAwZmYsCi0weDUxNDMwMGZkLCAweGFmYTAwMDEwLCAweDhlZTIwNjA4LCAweDIxMGMwLAotMHg1NzEwMjEsIDB4OGZhMzAwMTgsIDB4OGZhNDAwMWMsIDB4YWM0MzA2MGMsCi0weGFjNDQwNjEwLCAweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDI0NjkwMDMyLAotMHgxMjIxMDIzLCAweDJjNDIwMDMzLCAweDEwNDAwMDZhLCAweDU4MjEsCi0weDI0MTgwMDA4LCAweDI0MGYwMDBkLCAweDI0MGQwMDA3LCAweDI0MGMwMDQwLAotMHgyNDBlMDAwMSwgMHg4Zjg3MDEyMCwgMHgyNzYyMzgwMCwgMHgyNGU4MDAyMCwKLTB4MTAyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY4MzAwMCwgMHg4ZjgyMDEyOCwKLTB4MTEwMjAwMDQsIDB4MCwgMHg4ZjgyMDEyNCwgMHgxNTAyMDAwNywKLTB4MTAyMSwgMHg4ZWUyMDFhNCwgMHg4MDIxLCAweDI0NDIwMDAxLAotMHhhZWUyMDFhNCwgMHg4MDAxN2YzLCAweDhlZTIwMWE0LCAweDhlZTQwNjA4LAotMHg0MjBjMCwgMHg4MDE4MjEsIDB4OGVlNDA0MzAsIDB4OGVlNTA0MzQsCi0weGEzMjgyMSwgMHhhMzMwMmIsIDB4ODIyMDIxLCAweDg2MjAyMSwKLTB4YWNlNDAwMDAsIDB4YWNlNTAwMDQsIDB4OGVlMjA2MDgsIDB4YTRmODAwMGUsCi0weGFjZWYwMDE4LCAweGFjZWEwMDFjLCAweDIxMGMwLCAweDI0NDIwNjBjLAotMHgyZTIxMDIxLCAweGFjZTIwMDA4LCAweDhlZTIwNGM0LCAweGFjZTIwMDEwLAotMHhhZjg4MDEyMCwgMHg5MmUyNGUyMCwgMHgxNDQwMDAzMywgMHgyNDEwMDAwMSwKLTB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwKLTB4OGM4MjAwMDAsIDB4MTQ0ZDAwMWYsIDB4MCwgMHg4ZWUzNGUzMCwKLTB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIDB4MCwgMHg4YzgyMDAwNCwKLTB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIDB4OGVlMzRlMzAsCi0weDI0NDIwMDAxLCAweDEwNGMwMDA3LCAweDAsIDB4OGVlMjRlMzQsCi0weDI0NDIwMDAxLCAweDEwNjIwMDA1LCAweDAsIDB4ODAwMTdlMCwKLTB4MCwgMHgxNDYwMDAwNSwgMHgwLCAweDhmODIwMTI4LAotMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwKLTB4MmM0MjAwMTEsIDB4NTA0MDAwMTAsIDB4YWM4MDAwMDAsIDB4ODAwMTdmMywKLTB4MCwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHg1MDRjMDAwMywKLTB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwKLTB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwKLTB4YWM4ZDAwMDAsIDB4YWM4ZTAwMDQsIDB4NTYwMDAwMDYsIDB4MjQwYjAwMDEsCi0weDhmODIwMDU0LCAweDEyMjEwMjMsIDB4MmM0MjAwMzMsIDB4MTQ0MGZmOWQsCi0weDAsIDB4MzE2MzAwZmYsIDB4MjQwMjAwMDEsIDB4MTQ2MjAwNzcsCi0weDNjMDUwMDA5LCAweGFlZWEwNjA4LCAweDhmODMwMDU0LCAweDhmODIwMDU0LAotMHgyNDY5MDAzMiwgMHgxMjIxMDIzLCAweDJjNDIwMDMzLCAweDEwNDAwMDYxLAotMHg1ODIxLCAweDI0MGQwMDA4LCAweDI0MGMwMDExLCAweDI0MDgwMDEyLAotMHgyNDA3MDA0MCwgMHgyNDBhMDAwMSwgMHg4ZjgzMDEyMCwgMHgyNzYyMzgwMCwKLTB4MjQ2NjAwMjAsIDB4YzIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjYzMDAwLAotMHg4ZjgyMDEyOCwgMHgxMGMyMDAwNCwgMHgwLCAweDhmODIwMTI0LAotMHgxNGMyMDAwNywgMHgwLCAweDhlZTIwMWE0LCAweDgwMjEsCi0weDI0NDIwMDAxLCAweGFlZTIwMWE0LCAweDgwMDE4NWYsIDB4OGVlMjAxYTQsCi0weDhlZTIwNjA4LCAweGFjNjIwMDFjLCAweDhlZTQwNGEwLCAweDhlZTUwNGE0LAotMHgyNDYyMDAxYywgMHhhYzYyMDAwOCwgMHhhNDZkMDAwZSwgMHhhYzZjMDAxOCwKLTB4YWM2NDAwMDAsIDB4YWM2NTAwMDQsIDB4OGVlMjA0YzQsIDB4YWM2MjAwMTAsCi0weGFmODYwMTIwLCAweDkyZTI0ZTIwLCAweDE0NDAwMDMzLCAweDI0MTAwMDAxLAotMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLAotMHg4YzgyMDAwMCwgMHgxNDQ4MDAxZiwgMHgwLCAweDhlZTM0ZTMwLAotMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgMHgwLCAweDhjODIwMDA0LAotMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgMHg4ZWUzNGUzMCwKLTB4MjQ0MjAwMDEsIDB4MTA0NzAwMDcsIDB4MCwgMHg4ZWUyNGUzNCwKLTB4MjQ0MjAwMDEsIDB4MTA2MjAwMDUsIDB4MCwgMHg4MDAxODRjLAotMHgwLCAweDE0NjAwMDA1LCAweDAsIDB4OGY4MjAxMjgsCi0weDI0NDIwMDIwLCAweGFmODIwMTI4LCAweDhmODIwMTI4LCAweDhjODIwMDA0LAotMHgyYzQyMDAxMSwgMHg1MDQwMDAxMCwgMHhhYzgwMDAwMCwgMHg4MDAxODVmLAotMHgwLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweDUwNDcwMDAzLAotMHgxMDIxLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweGFlZTI0ZTMwLAotMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLAotMHhhYzg4MDAwMCwgMHhhYzhhMDAwNCwgMHg1NjAwMDAwNiwgMHgyNDBiMDAwMSwKLTB4OGY4MjAwNTQsIDB4MTIyMTAyMywgMHgyYzQyMDAzMywgMHgxNDQwZmZhNiwKLTB4MCwgMHgzMTYzMDBmZiwgMHgyNDAyMDAwMSwgMHgxNDYyMDAwMywKLTB4M2MwNTAwMDksIDB4ODAwMTk3YywgMHgyNDEwMDAwMSwgMHgzYzA0MDAwMSwKLTB4MjQ4NDUyYTQsIDB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsIDB4OGY4NjAxMjAsCi0weDhmODcwMTI0LCAweDgwMDE4N2IsIDB4MzRhNWYwMTEsIDB4M2MwNDAwMDEsCi0weDI0ODQ1MmIwLCAweGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhmODYwMTIwLAotMHg4Zjg3MDEyNCwgMHgzNGE1ZjAxMCwgMHhjMDAyNDAzLCAweDgwMjEsCi0weDgwMDE5N2MsIDB4MCwgMHgzYzA0MDAwMSwgMHgyNDg0NTJiYywKLTB4YWZhMDAwMTQsIDB4OGVlNjA2MDgsIDB4OGY0NzAyMjgsIDB4M2MwNTAwMDksCi0weDgwMDE5NzUsIDB4MzRhNWYwMGYsIDB4OGVlMjA2MDgsIDB4OGY0MzAyMjgsCi0weDI0NDIwMDAxLCAweDMwNDkwMGZmLCAweDUxMjMwMGUyLCAweGFmYTAwMDEwLAotMHg4ZWUyMDYwOCwgMHgyMTBjMCwgMHg1NzEwMjEsIDB4OGZhMzAwMTgsCi0weDhmYTQwMDFjLCAweGFjNDMwNjBjLCAweGFjNDQwNjEwLCAweDhmODcwMTIwLAotMHgyNzYyMzgwMCwgMHgyNGU4MDAyMCwgMHgxMDIxMDJiLCAweDUwNDAwMDAxLAotMHgyNzY4MzAwMCwgMHg4ZjgyMDEyOCwgMHgxMTAyMDAwNCwgMHgwLAotMHg4ZjgyMDEyNCwgMHgxNTAyMDAwNywgMHgxMDIxLCAweDhlZTIwMWE0LAotMHg4MDIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWE0LCAweDgwMDE4ZjcsCi0weDhlZTIwMWE0LCAweDhlZTQwNjA4LCAweDQyMGMwLCAweDgwMTgyMSwKLTB4OGVlNDA0MzAsIDB4OGVlNTA0MzQsIDB4YTMyODIxLCAweGEzMzAyYiwKLTB4ODIyMDIxLCAweDg2MjAyMSwgMHhhY2U0MDAwMCwgMHhhY2U1MDAwNCwKLTB4OGVlMzA2MDgsIDB4MjQwMjAwMDgsIDB4YTRlMjAwMGUsIDB4MjQwMjAwMGQsCi0weGFjZTIwMDE4LCAweGFjZTkwMDFjLCAweDMxOGMwLCAweDI0NjMwNjBjLAotMHgyZTMxMDIxLCAweGFjZTIwMDA4LCAweDhlZTIwNGM0LCAweGFjZTIwMDEwLAotMHhhZjg4MDEyMCwgMHg5MmUyNGUyMCwgMHgxNDQwMDAzNywgMHgyNDEwMDAwMSwKLTB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwKLTB4OGM4MzAwMDAsIDB4MjQwMjAwMDcsIDB4MTQ2MjAwMWYsIDB4MCwKLTB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIDB4MjQwMzAwNDAsCi0weDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTM0LAotMHg4ZWU1NGUzMCwgMHgyNDQyMDAwMSwgMHgxMDQzMDAwNywgMHgwLAotMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwgMHgxMGEyMDAwNSwgMHgwLAotMHg4MDAxOGUxLCAweDAsIDB4MTRhMDAwMDUsIDB4MCwKLTB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsCi0weDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEzLCAweGFjODAwMDAwLAotMHg4MDAxOGY3LCAweDAsIDB4OGVlMjRlMzAsIDB4MjQwMzAwNDAsCi0weDI0NDIwMDAxLCAweDUwNDMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsCi0weDI0NDIwMDAxLCAweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLAotMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDI0MDIwMDA3LCAweGFjODIwMDAwLAotMHgyNDAyMDAwMSwgMHhhYzgyMDAwNCwgMHg1NjAwMDAwYywgMHhhZWU5MDYwOCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDUyYzgsIDB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsCi0weDhlZTYwNjA4LCAweDhmNDcwMjI4LCAweDNjMDUwMDA5LCAweGMwMDI0MDMsCi0weDM0YTVmMDAwLCAweDgwMDE5N2MsIDB4MCwgMHg4ZjgzMDEyMCwKLTB4Mjc2MjM4MDAsIDB4MjQ2NjAwMjAsIDB4YzIxMDJiLCAweDUwNDAwMDAxLAotMHgyNzY2MzAwMCwgMHg4ZjgyMDEyOCwgMHgxMGMyMDAwNCwgMHgwLAotMHg4ZjgyMDEyNCwgMHgxNGMyMDAwNywgMHgwLCAweDhlZTIwMWE0LAotMHg4MDIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWE0LCAweDgwMDE5NWUsCi0weDhlZTIwMWE0LCAweDhlZTIwNjA4LCAweGFjNjIwMDFjLCAweDhlZTQwNGEwLAotMHg4ZWU1MDRhNCwgMHgyNDYyMDAxYywgMHhhYzYyMDAwOCwgMHgyNDAyMDAwOCwKLTB4YTQ2MjAwMGUsIDB4MjQwMjAwMTEsIDB4YWM2MjAwMTgsIDB4YWM2NDAwMDAsCi0weGFjNjUwMDA0LCAweDhlZTIwNGM0LCAweGFjNjIwMDEwLCAweGFmODYwMTIwLAotMHg5MmUyNGUyMCwgMHgxNDQwMDAzNywgMHgyNDEwMDAwMSwgMHg4ZWUyNGUzMCwKLTB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHg4YzgzMDAwMCwKLTB4MjQwMjAwMTIsIDB4MTQ2MjAwMWYsIDB4MCwgMHg4ZWUzNGUzMCwKLTB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIDB4MjQwMzAwNDAsIDB4OGM4MjAwMDQsCi0weDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTM0LCAweDhlZTU0ZTMwLAotMHgyNDQyMDAwMSwgMHgxMDQzMDAwNywgMHgwLCAweDhlZTI0ZTM0LAotMHgyNDQyMDAwMSwgMHgxMGEyMDAwNSwgMHgwLCAweDgwMDE5NDgsCi0weDAsIDB4MTRhMDAwMDUsIDB4MCwgMHg4ZjgyMDEyOCwKLTB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsCi0weDJjNDIwMDExLCAweDUwNDAwMDEzLCAweGFjODAwMDAwLCAweDgwMDE5NWUsCi0weDAsIDB4OGVlMjRlMzAsIDB4MjQwMzAwNDAsIDB4MjQ0MjAwMDEsCi0weDUwNDMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsCi0weGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LAotMHgyZTIyMDIxLCAweDI0MDIwMDEyLCAweGFjODIwMDAwLCAweDI0MDIwMDAxLAotMHhhYzgyMDAwNCwgMHg1NjAwMDAxZCwgMHgyNDEwMDAwMSwgMHgzYzA0MDAwMSwKLTB4MjQ4NDUyZDAsIDB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsIDB4OGVlNjA2MDgsCi0weDhmNDcwMjI4LCAweDNjMDUwMDA5LCAweGMwMDI0MDMsIDB4MzRhNWYwMDEsCi0weDhlZTIwMWIwLCAweDI0NDIwMDAxLCAweGFlZTIwMWIwLCAweDgwMDE5N2MsCi0weDhlZTIwMWIwLCAweDNjMDQwMDAxLCAweDI0ODQ1MmRjLCAweGFmYTAwMDE0LAotMHg4ZWU2MDYwOCwgMHg4ZjQ3MDIyOCwgMHgzYzA1MDAwOSwgMHgzNGE1ZjAwNSwKLTB4YzAwMjQwMywgMHgwLCAweDhlZTIwMWFjLCAweDgwMjEsCi0weDI0NDIwMDAxLCAweGFlZTIwMWFjLCAweDhlZTIwMWFjLCAweDEyMDAwMDBjLAotMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YTAyMDgzYjAsCi0weDhmNDIwMjM4LCAweDhlZTMwMTU4LCAweDI0NjMwMDAxLCAweGFlZTMwMTU4LAotMHg4ZWUzMDE1OCwgMHg4MDAxOThjLCAweGFlZTI3Mjc4LCAweDI0MDIwMDAxLAotMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YTAyMjgzYjAsIDB4M2MwMjAwMDEsCi0weDhjNDI1Y2Q4LCAweDEwNDAwMTg3LCAweDAsIDB4OGVlMjdiODQsCi0weDI0NDMwMDAxLCAweDI4NDIwMGM5LCAweDE0NDAwMWE0LCAweGFlZTM3Yjg0LAotMHg4ZWUyMDRkNCwgMHgzMDQyMDAwMiwgMHgxNDQwMDExOSwgMHhhZWUwN2I4NCwKLTB4OGVlMjA0ZDQsIDB4M2MwMzA2MDAsIDB4MzQ2MzEwMDAsIDB4MzQ0MjAwMDIsCi0weGFlZTIwNGQ0LCAweGFmYTMwMDE4LCAweDhlZTIwNjA4LCAweDhmNDMwMjI4LAotMHgyNDQyMDAwMSwgMHgzMDRhMDBmZiwgMHg1MTQzMDBmZCwgMHhhZmEwMDAxMCwKLTB4OGVlMjA2MDgsIDB4MjEwYzAsIDB4NTcxMDIxLCAweDhmYTMwMDE4LAotMHg4ZmE0MDAxYywgMHhhYzQzMDYwYywgMHhhYzQ0MDYxMCwgMHg4ZjgzMDA1NCwKLTB4OGY4MjAwNTQsIDB4MjQ2OTAwMzIsIDB4MTIyMTAyMywgMHgyYzQyMDAzMywKLTB4MTA0MDAwNmEsIDB4NTgyMSwgMHgyNDE4MDAwOCwgMHgyNDBmMDAwZCwKLTB4MjQwZDAwMDcsIDB4MjQwYzAwNDAsIDB4MjQwZTAwMDEsIDB4OGY4NzAxMjAsCi0weDI3NjIzODAwLCAweDI0ZTgwMDIwLCAweDEwMjEwMmIsIDB4NTA0MDAwMDEsCi0weDI3NjgzMDAwLCAweDhmODIwMTI4LCAweDExMDIwMDA0LCAweDAsCi0weDhmODIwMTI0LCAweDE1MDIwMDA3LCAweDEwMjEsIDB4OGVlMjAxYTQsCi0weDgwMjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsIDB4ODAwMWExNSwKLTB4OGVlMjAxYTQsIDB4OGVlNDA2MDgsIDB4NDIwYzAsIDB4ODAxODIxLAotMHg4ZWU0MDQzMCwgMHg4ZWU1MDQzNCwgMHhhMzI4MjEsIDB4YTMzMDJiLAotMHg4MjIwMjEsIDB4ODYyMDIxLCAweGFjZTQwMDAwLCAweGFjZTUwMDA0LAotMHg4ZWUyMDYwOCwgMHhhNGY4MDAwZSwgMHhhY2VmMDAxOCwgMHhhY2VhMDAxYywKLTB4MjEwYzAsIDB4MjQ0MjA2MGMsIDB4MmUyMTAyMSwgMHhhY2UyMDAwOCwKLTB4OGVlMjA0YzQsIDB4YWNlMjAwMTAsIDB4YWY4ODAxMjAsIDB4OTJlMjRlMjAsCi0weDE0NDAwMDMzLCAweDI0MTAwMDAxLCAweDhlZTI0ZTMwLCAweDIxMGMwLAotMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDhjODIwMDAwLCAweDE0NGQwMDFmLAotMHgwLCAweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAweDEwNjIwMDFiLAotMHgwLCAweDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LAotMHg4ZWUyNGUzNCwgMHg4ZWUzNGUzMCwgMHgyNDQyMDAwMSwgMHgxMDRjMDAwNywKLTB4MCwgMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwgMHgxMDYyMDAwNSwKLTB4MCwgMHg4MDAxYTAyLCAweDAsIDB4MTQ2MDAwMDUsCi0weDAsIDB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsCi0weDhmODIwMTI4LCAweDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEwLAotMHhhYzgwMDAwMCwgMHg4MDAxYTE1LCAweDAsIDB4OGVlMjRlMzAsCi0weDI0NDIwMDAxLCAweDUwNGMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsCi0weDI0NDIwMDAxLCAweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLAotMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweGFjOGQwMDAwLCAweGFjOGUwMDA0LAotMHg1NjAwMDAwNiwgMHgyNDBiMDAwMSwgMHg4ZjgyMDA1NCwgMHgxMjIxMDIzLAotMHgyYzQyMDAzMywgMHgxNDQwZmY5ZCwgMHgwLCAweDMxNjMwMGZmLAotMHgyNDAyMDAwMSwgMHg1NDYyMDA3OCwgMHhhZmEwMDAxMCwgMHhhZWVhMDYwOCwKLTB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MjQ2OTAwMzIsIDB4MTIyMTAyMywKLTB4MmM0MjAwMzMsIDB4MTA0MDAwNjEsIDB4NTgyMSwgMHgyNDBkMDAwOCwKLTB4MjQwYzAwMTEsIDB4MjQwODAwMTIsIDB4MjQwNzAwNDAsIDB4MjQwYTAwMDEsCi0weDhmODMwMTIwLCAweDI3NjIzODAwLCAweDI0NjYwMDIwLCAweGMyMTAyYiwKLTB4NTA0MDAwMDEsIDB4Mjc2NjMwMDAsIDB4OGY4MjAxMjgsIDB4MTBjMjAwMDQsCi0weDAsIDB4OGY4MjAxMjQsIDB4MTRjMjAwMDcsIDB4MCwKLTB4OGVlMjAxYTQsIDB4ODAyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwKLTB4ODAwMWE4MSwgMHg4ZWUyMDFhNCwgMHg4ZWUyMDYwOCwgMHhhYzYyMDAxYywKLTB4OGVlNDA0YTAsIDB4OGVlNTA0YTQsIDB4MjQ2MjAwMWMsIDB4YWM2MjAwMDgsCi0weGE0NmQwMDBlLCAweGFjNmMwMDE4LCAweGFjNjQwMDAwLCAweGFjNjUwMDA0LAotMHg4ZWUyMDRjNCwgMHhhYzYyMDAxMCwgMHhhZjg2MDEyMCwgMHg5MmUyNGUyMCwKLTB4MTQ0MDAwMzMsIDB4MjQxMDAwMDEsIDB4OGVlMjRlMzAsIDB4MjEwYzAsCi0weDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MjAwMDAsIDB4MTQ0ODAwMWYsCi0weDAsIDB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsCi0weDAsIDB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsCi0weDhlZTI0ZTM0LCAweDhlZTM0ZTMwLCAweDI0NDIwMDAxLCAweDEwNDcwMDA3LAotMHgwLCAweDhlZTI0ZTM0LCAweDI0NDIwMDAxLCAweDEwNjIwMDA1LAotMHgwLCAweDgwMDFhNmUsIDB4MCwgMHgxNDYwMDAwNSwKLTB4MCwgMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwKLTB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIDB4NTA0MDAwMTAsCi0weGFjODAwMDAwLCAweDgwMDFhODEsIDB4MCwgMHg4ZWUyNGUzMCwKLTB4MjQ0MjAwMDEsIDB4NTA0NzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsCi0weDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4YWM4ODAwMDAsIDB4YWM4YTAwMDQsCi0weDU2MDAwMDA2LCAweDI0MGIwMDAxLCAweDhmODIwMDU0LCAweDEyMjEwMjMsCi0weDJjNDIwMDMzLCAweDE0NDBmZmE2LCAweDAsIDB4MzE2MzAwZmYsCi0weDI0MDIwMDAxLCAweDEwNjIwMDIyLCAweDAsIDB4M2MwNDAwMDEsCi0weDI0ODQ1MmE0LCAweGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhmODYwMTIwLAotMHg4Zjg3MDEyNCwgMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAweDM0YTVmMDExLAotMHg4MDAxYWFkLCAweDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDUyYjAsCi0weGFmYTAwMDE0LCAweDhmODYwMTIwLCAweDhmODcwMTI0LCAweDNjMDUwMDA5LAotMHhjMDAyNDAzLCAweDM0YTVmMDEwLCAweDgwMDFhYWQsIDB4MCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDUyYmMsIDB4YWZhMDAwMTQsIDB4OGVlNjA2MDgsCi0weDhmNDcwMjI4LCAweDNjMDUwMDA5LCAweGMwMDI0MDMsIDB4MzRhNWYwMGYsCi0weDhlZTIwMWFjLCAweDI0NDIwMDAxLCAweGFlZTIwMWFjLCAweDhlZTIwMWFjLAotMHg4ZWUyMDE1YywgMHgyNDQyMDAwMSwgMHhhZWUyMDE1YywgMHg4ZWUyMDE1YywKLTB4OGVlMjA0ZDQsIDB4MzA0MjAwMDEsIDB4MTA0MDAwNTUsIDB4MCwKLTB4OGY0MjAyMTgsIDB4MzA0MjAwODAsIDB4MTA0MDAwMjksIDB4MCwKLTB4OGY4MjAwNDQsIDB4MzQ0MjAwNDAsIDB4YWY4MjAwNDQsIDB4OGVlMjdiN2MsCi0weDQwMjgyMSwgMHg4ZWUyMDBjMCwgMHg4ZWUzMDBjNCwgMHgyNDA2MDAwMCwKLTB4MjQwN2ZmZmYsIDB4MjAyMSwgMHg0NjEwMjQsIDB4MTQ0NDAwMGQsCi0weDY3MTgyNCwgMHgxNDY1MDAwYiwgMHgwLCAweDhlZTI3YjgwLAotMHg0MDI4MjEsIDB4OGVlMjAwZTAsIDB4OGVlMzAwZTQsIDB4MjAyMSwKLTB4NDYxMDI0LCAweDE0NDQwMDAzLCAweDY3MTgyNCwgMHgxMDY1MDAwYiwKLTB4MCwgMHg4ZWUyMDBjMCwgMHg4ZWUzMDBjNCwgMHg4ZWU0MDBlMCwKLTB4OGVlNTAwZTQsIDB4YWVlMzdiN2MsIDB4YWVlNTdiODAsIDB4OGY4MjAwNDQsCi0weDM4NDIwMDIwLCAweDgwMDFiMzgsIDB4YWY4MjAwNDQsIDB4OGY4MjAwNDQsCi0weDI0MDNmZmRmLCAweDQzMTAyNCwgMHg4MDAxYjM4LCAweGFmODIwMDQ0LAotMHg4ZjgyMDA0NCwgMHgyNDAzZmZkZiwgMHg0MzEwMjQsIDB4YWY4MjAwNDQsCi0weDhlZTI3YjdjLCAweDQwMjgyMSwgMHg4ZWUyMDBjMCwgMHg4ZWUzMDBjNCwKLTB4MjQwNjAwMDAsIDB4MjQwN2ZmZmYsIDB4MjAyMSwgMHg0NjEwMjQsCi0weDE0NDQwMDBkLCAweDY3MTgyNCwgMHgxNDY1MDAwYiwgMHgwLAotMHg4ZWUyN2I4MCwgMHg0MDI4MjEsIDB4OGVlMjAwZTAsIDB4OGVlMzAwZTQsCi0weDIwMjEsIDB4NDYxMDI0LCAweDE0NDQwMDAzLCAweDY3MTgyNCwKLTB4MTA2NTAwMGIsIDB4MCwgMHg4ZWUyMDBjMCwgMHg4ZWUzMDBjNCwKLTB4OGVlNDAwZTAsIDB4OGVlNTAwZTQsIDB4YWVlMzdiN2MsIDB4YWVlNTdiODAsCi0weDhmODIwMDQ0LCAweDM4NDIwMDQwLCAweDgwMDFiMzgsIDB4YWY4MjAwNDQsCi0weDhmODIwMDQ0LCAweDM0NDIwMDQwLCAweDgwMDFiMzgsIDB4YWY4MjAwNDQsCi0weDhmODIwMDQ0LCAweDM0NDIwMDQwLCAweGFmODIwMDQ0LCAweDhlZTI3YjhjLAotMHgyNDQzMDAwMSwgMHgyODQyMDAxNSwgMHgxNDQwMDAyOCwgMHhhZWUzN2I4YywKLTB4OGY4MjAwNDQsIDB4Mzg0MjAwMjAsIDB4YWY4MjAwNDQsIDB4ODAwMWIzOCwKLTB4YWVlMDdiOGMsIDB4OGVlMjA0ZDQsIDB4MzA0MjAwMDEsIDB4MTA0MDAwMTEsCi0weDAsIDB4OGY0MjAyMTgsIDB4MzA0MjAwODAsIDB4MTA0MDAwMDksCi0weDAsIDB4OGY4MjAwNDQsIDB4MzQ0MjAwMjAsIDB4YWY4MjAwNDQsCi0weDhmODIwMDQ0LCAweDI0MDNmZmJmLCAweDQzMTAyNCwgMHg4MDAxYjM2LAotMHhhZjgyMDA0NCwgMHg4ZjgyMDA0NCwgMHgzNDQyMDA2MCwgMHg4MDAxYjM2LAotMHhhZjgyMDA0NCwgMHg4ZjgyMDA0NCwgMHgzNDQyMDA0MCwgMHhhZjgyMDA0NCwKLTB4OGVlMjdiODgsIDB4MjQ0MzAwMDEsIDB4Mjg0MjEzODksIDB4MTQ0MDAwMDUsCi0weGFlZTM3Yjg4LCAweDhmODIwMDQ0LCAweDM4NDIwMDIwLCAweGFmODIwMDQ0LAotMHhhZWUwN2I4OCwgMHhjMDA0NjAzLCAweDAsIDB4OGZiZjAwMjQsCi0weDhmYjAwMDIwLCAweDNlMDAwMDgsIDB4MjdiZDAwMjgsIDB4MjdiZGZmYjgsCi0weGFmYmYwMDQ0LCAweGFmYjYwMDQwLCAweGFmYjUwMDNjLCAweGFmYjQwMDM4LAotMHhhZmIzMDAzNCwgMHhhZmIyMDAzMCwgMHhhZmIxMDAyYywgMHhhZmIwMDAyOCwKLTB4OGY5NjAwNjQsIDB4MzJjMjAwMDQsIDB4MTA0MDAwMGMsIDB4MjQwMjAwMDQsCi0weGFmODIwMDY0LCAweDhmNDIwMTE0LCAweGFlZTIwNGUwLCAweDhmODIwMDYwLAotMHgzNDQyMDAwOCwgMHhhZjgyMDA2MCwgMHg4ZWUyMDE2YywgMHgyNDQyMDAwMSwKLTB4YWVlMjAxNmMsIDB4ODAwMjJmNCwgMHg4ZWUyMDE2YywgMHgzMmMyMDAwMSwKLTB4MTA0MDAwMDQsIDB4MjQwMjAwMDEsIDB4YWY4MjAwNjQsIDB4ODAwMjJmNCwKLTB4MCwgMHgzMmMyMDAwMiwgMHgxNDQwMDAwYywgMHgzYzA1MDAwMywKLTB4M2MwNDAwMDEsIDB4MjQ4NDUzNTQsIDB4MzRhNTAwMDEsIDB4MmMwMzAyMSwKLTB4MzgyMSwgMHhhZmEwMDAxMCwgMHhjMDAyNDAzLCAweGFmYTAwMDE0LAotMHgyNDAyZmZmOCwgMHg4MDAyMmY0LCAweGFmODIwMDY0LCAweDhmNDMwMjJjLAotMHg4ZjQyMDEwYywgMHg1MDYyMDAwYywgMHhhZmEwMDAxMCwgMHg4ZjQyMDIyYywKLTB4MjEwODAsIDB4NWExMDIxLCAweDhjNDIwMzAwLCAweGFmYTIwMDIwLAotMHg4ZjQyMDIyYywgMHgyNDA3MDAwMSwgMHgyNDQyMDAwMSwgMHgzMDQyMDAzZiwKLTB4ODAwMWI4MCwgMHhhZjQyMDIyYywgMHgzYzA0MDAwMSwgMHgyNDg0NTM2MCwKLTB4YWZhMDAwMTQsIDB4OGY0NjAyMmMsIDB4OGY0NzAxMGMsIDB4M2MwNTAwMDMsCi0weGMwMDI0MDMsIDB4MzRhNWYwMWYsIDB4MzgyMSwgMHgxNGUwMDAwMywKLTB4MCwgMHg4MDAyMmVkLCAweGFmOTYwMDY0LCAweDkzYTIwMDIwLAotMHgyNDQzZmZmZiwgMHgyYzYyMDAxMSwgMHgxMDQwMDY1OCwgMHgzMTA4MCwKLTB4M2MwMTAwMDEsIDB4MjIwODIxLCAweDhjMjI1NDE4LCAweDQwMDAwOCwKLTB4MCwgMHg4ZmEyMDAyMCwgMHgzMDQyMGZmZiwgMHhhZWUyMGUwYywKLTB4OGY4MjAwNjAsIDB4MzQ0MjAyMDAsIDB4YWY4MjAwNjAsIDB4OGVlMjAxMTgsCi0weDI0NDIwMDAxLCAweGFlZTIwMTE4LCAweDgwMDIyZTgsIDB4OGVlMjAxMTgsCi0weDhmYTIwMDIwLCAweDI0MDMwMDAxLCAweDNjMDEwMDAxLCAweDM3MDgyMSwKLTB4YTAyMzgzYjEsIDB4MzA0MjBmZmYsIDB4YWVlMjUyMzgsIDB4OGY4MjAwNjAsCi0weDM0NDIwMTAwLCAweGFmODIwMDYwLCAweDhlZTIwMTQ0LCAweDI0NDIwMDAxLAotMHhhZWUyMDE0NCwgMHg4MDAyMmU4LCAweDhlZTIwMTQ0LCAweDhmYTIwMDIwLAotMHgyMTIwMCwgMHgyMjUwMiwgMHgyNDAyMDAwMSwgMHgxMDgyMDAwNSwKLTB4MjQwMjAwMDIsIDB4MTA4MjAwMDksIDB4MjQwMmZmZmUsIDB4ODAwMWJjOSwKLTB4YWZhMDAwMTAsIDB4OGVlMjA0ZDQsIDB4YWVlNDAwNzAsIDB4YWVlNDAwNzQsCi0weDM0NDIwMDAxLCAweDgwMDFiYmQsIDB4YWVlMjA0ZDQsIDB4OGVlMzA0ZDQsCi0weGFlZTQwMDcwLCAweGFlZTQwMDc0LCAweDYyMTgyNCwgMHhhZWUzMDRkNCwKLTB4OGY4NDAwNTQsIDB4NDE0NDIsIDB4NDFjODIsIDB4NDMxMDIxLAotMHg0MWNjMiwgMHg0MzEwMjMsIDB4NDFkMDIsIDB4NDMxMDIxLAotMHg0MWQ0MiwgMHg0MzEwMjMsIDB4ODAwMWJkMCwgMHhhZWUyMDA3OCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDUzNmMsIDB4YWZhMDAwMTQsIDB4OGZhNjAwMjAsCi0weDNjMDUwMDAzLCAweGMwMDI0MDMsIDB4MzRhNTAwMDQsIDB4OGVlMjAxMTAsCi0weDI0NDIwMDAxLCAweGFlZTIwMTEwLCAweDgwMDIyZTgsIDB4OGVlMjAxMTAsCi0weDI3NDQwMjEyLCAweGMwMDIyZmUsIDB4MjQwNTAwMDYsIDB4MzA0OTAwMWYsCi0weDkyMGMwLCAweDJlNDEwMjEsIDB4OTQ0MjcyN2MsIDB4MzA0MjQwMDAsCi0weDEwNDAwMDBhLCAweDk3MTAyMSwgMHg5NzQzMDIxMiwgMHhhNDQzNzI3ZSwKLTB4OGY0MzAyMTQsIDB4OTcxMDIxLCAweGFjNDM3MjgwLCAweDJlNDE4MjEsCi0weDM0MDI4MDAwLCAweDgwMDFjNzksIDB4YTQ2MjcyN2MsIDB4OTQ0MzcyN2UsCi0weDk3NDIwMjEyLCAweDE0NjIwMDA2LCAweDJlNDEwMjEsIDB4OTcxMDIxLAotMHg4YzQzNzI4MCwgMHg4ZjQyMDIxNCwgMHgxMDYyMDA5ZiwgMHgyZTQxMDIxLAotMHg5NDQyNzI3YywgMHgzMDQyODAwMCwgMHgxMDQwMDAyYSwgMHgyNDA2ZmZmZiwKLTB4MjAyMSwgMHg0MTBjMCwgMHgyZTIxMDIxLCAweDk0NDI3MzdjLAotMHgzMDQyNDAwMCwgMHg1NDQwMDAwNSwgMHg4MDMwMjEsIDB4MjQ4NDAwMDEsCi0weDJjODIwMDgwLCAweDE0NDBmZmY4LCAweDQxMGMwLCAweDRjMTAwMTAsCi0weDYxOGMwLCAweDYxMGMwLCAweDU3MTgyMSwgMHg4YzYzNzM3YywKLTB4NTcxMDIxLCAweGFmYTMwMDEwLCAweDhjNDI3MzgwLCAweDNjMDQwMDAxLAotMHgyNDg0NTM3OCwgMHhhZmEyMDAxNCwgMHg4ZjQ3MDIxNCwgMHgzYzA1MDAwMywKLTB4YzAwMjQwMywgMHgzNGE1MDAxMywgMHg4MDAxYzkwLCAweDNjMDIwODAwLAotMHg5NzQ0MDIxMiwgMHg3NzEwMjEsIDB4YTQ0NDczN2UsIDB4OGY0NDAyMTQsCi0weDc3MTAyMSwgMHgyZTMxODIxLCAweGFjNDQ3MzgwLCAweDM0MDI4MDAwLAotMHhhNDYyNzM3YywgMHg5MTBjMCwgMHgyZTIxMDIxLCAweDgwMDFjNzksCi0weGE0NDY3MjdjLCAweDJlNDEwMjEsIDB4OTQ0NTcyN2MsIDB4ODAwMWMyZSwKLTB4NTEwYzAsIDB4OTQ0MzczN2UsIDB4OTc0MjAyMTIsIDB4MTQ2MjAwMDYsCi0weDUxMGMwLCAweDk3MTAyMSwgMHg4YzQzNzM4MCwgMHg4ZjQyMDIxNCwKLTB4MTA2MjAwNjUsIDB4NTEwYzAsIDB4MmUyMTAyMSwgMHg5NDQ1NzM3YywKLTB4NTEwYzAsIDB4MmUyMTAyMSwgMHg5NDQyNzM3YywgMHgzMDQyODAwMCwKLTB4MTA0MGZmZjAsIDB4OTcxMDIxLCAweDUyMGMwLCAweDk3MTAyMSwKLTB4OTQ0MzczN2UsIDB4OTc0MjAyMTIsIDB4MTQ2MjAwMDYsIDB4MjQwNmZmZmYsCi0weDk3MTAyMSwgMHg4YzQzNzM4MCwgMHg4ZjQyMDIxNCwgMHgxMDYyMDA1MywKLTB4M2MwMjA4MDAsIDB4MjAyMSwgMHg0MTBjMCwgMHgyZTIxMDIxLAotMHg5NDQyNzM3YywgMHgzMDQyNDAwMCwgMHg1NDQwMDAwNSwgMHg4MDMwMjEsCi0weDI0ODQwMDAxLCAweDJjODIwMDgwLCAweDE0NDBmZmY4LCAweDQxMGMwLAotMHg0YzEwMDIzLCAweDYxOGMwLCAweDkxMGMwLCAweDU3MTgyMSwKLTB4OGM2MzcyN2MsIDB4NTcxMDIxLCAweGFmYTMwMDEwLCAweDhjNDI3MjgwLAotMHgzYzA0MDAwMSwgMHgyNDg0NTM4NCwgMHhhZmEyMDAxNCwgMHg4ZjQ3MDIxNCwKLTB4M2MwNTAwMDMsIDB4YzAwMjQwMywgMHgzNGE1ZjAxNywgMHg4MDAxYzkwLAotMHgzYzAyMDgwMCwgMHg4ZjQzMDIxMCwgMHhiNzEwMjEsIDB4YWM0Mzc3N2MsCi0weDhmNDMwMjE0LCAweGI3MTAyMSwgMHhhYzQzNzc4MCwgMHgzYzAyMDAwMSwKLTB4NTcxMDIxLCAweDhjNDI4M2I0LCAweDI0NDIwMDAxLCAweDNjMDEwMDAxLAotMHgzNzA4MjEsIDB4YWMyMjgzYjQsIDB4M2MwMzAwMDEsIDB4NzcxODIxLAotMHg4YzYzODNiNCwgMHgyZTUxMDIxLCAweDgwMDFjODIsIDB4YTQ0Mzc3N2MsCi0weDk3NDQwMjEyLCAweDc3MTAyMSwgMHhhNDQ0NzM3ZSwgMHg4ZjQ0MDIxNCwKLTB4NzcxMDIxLCAweDJlMzE4MjEsIDB4YWM0NDczODAsIDB4MzQwMjgwMDAsCi0weGE0NjI3MzdjLCAweDUxMGMwLCAweDJlMjEwMjEsIDB4YTQ0NjczN2MsCi0weDIwMjEsIDB4NDI4YzAsIDB4MmU1MTAyMSwgMHg5NDQyNzc3YywKLTB4MTA0MGZmZGMsIDB4MjQ4NDAwMDEsIDB4MmM4MjAwODAsIDB4NTQ0MGZmZmEsCi0weDQyOGMwLCAweDkyZTIwNGQ4LCAweDEwNDAwMDA2LCAweDI0MDIwMDAxLAotMHg4ZWUzMDRkYywgMHgxMjIxMDA0LCAweDYyMTgyNSwgMHg4MDAxYzhmLAotMHhhZWUzMDRkYywgMHg4ZjgzMDIyOCwgMHgyNDAyMDAwMSwgMHgxMjIxMDA0LAotMHg2MjE4MjUsIDB4YWY4MzAyMjgsIDB4M2MwMjA4MDAsIDB4MzQ0MjEwMDAsCi0weGFmYTIwMDE4LCAweDhlZTIwNjA4LCAweDhmNDMwMjI4LCAweDI0NDIwMDAxLAotMHgzMDRhMDBmZiwgMHg1MTQzMDBmZCwgMHhhZmEwMDAxMCwgMHg4ZWUyMDYwOCwKLTB4MjEwYzAsIDB4NTcxMDIxLCAweDhmYTMwMDE4LCAweDhmYTQwMDFjLAotMHhhYzQzMDYwYywgMHhhYzQ0MDYxMCwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwKLTB4MjQ2OTAwMzIsIDB4MTIyMTAyMywgMHgyYzQyMDAzMywgMHgxMDQwMDA2YSwKLTB4NTgyMSwgMHgyNDEwMDAwOCwgMHgyNDBmMDAwZCwgMHgyNDBkMDAwNywKLTB4MjQwYzAwNDAsIDB4MjQwZTAwMDEsIDB4OGY4NzAxMjAsIDB4Mjc2MjM4MDAsCi0weDI0ZTgwMDIwLCAweDEwMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2ODMwMDAsCi0weDhmODIwMTI4LCAweDExMDIwMDA0LCAweDAsIDB4OGY4MjAxMjQsCi0weDE1MDIwMDA3LCAweDEwMjEsIDB4OGVlMjAxYTQsIDB4MzgyMSwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsIDB4ODAwMWQwOCwgMHg4ZWUyMDFhNCwKLTB4OGVlNDA2MDgsIDB4NDIwYzAsIDB4ODAxODIxLCAweDhlZTQwNDMwLAotMHg4ZWU1MDQzNCwgMHhhMzI4MjEsIDB4YTMzMDJiLCAweDgyMjAyMSwKLTB4ODYyMDIxLCAweGFjZTQwMDAwLCAweGFjZTUwMDA0LCAweDhlZTIwNjA4LAotMHhhNGYwMDAwZSwgMHhhY2VmMDAxOCwgMHhhY2VhMDAxYywgMHgyMTBjMCwKLTB4MjQ0MjA2MGMsIDB4MmUyMTAyMSwgMHhhY2UyMDAwOCwgMHg4ZWUyMDRjNCwKLTB4YWNlMjAwMTAsIDB4YWY4ODAxMjAsIDB4OTJlMjRlMjAsIDB4MTQ0MDAwMzMsCi0weDI0MDcwMDAxLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LAotMHgyZTIyMDIxLCAweDhjODIwMDAwLCAweDE0NGQwMDFmLCAweDAsCi0weDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAweDAsCi0weDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTM0LAotMHg4ZWUzNGUzMCwgMHgyNDQyMDAwMSwgMHgxMDRjMDAwNywgMHgwLAotMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwgMHgxMDYyMDAwNSwgMHgwLAotMHg4MDAxY2Y1LCAweDAsIDB4MTQ2MDAwMDUsIDB4MCwKLTB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsCi0weDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEwLCAweGFjODAwMDAwLAotMHg4MDAxZDA4LCAweDAsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsCi0weDUwNGMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsCi0weGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LAotMHgyZTIyMDIxLCAweGFjOGQwMDAwLCAweGFjOGUwMDA0LCAweDU0ZTAwMDA2LAotMHgyNDBiMDAwMSwgMHg4ZjgyMDA1NCwgMHgxMjIxMDIzLCAweDJjNDIwMDMzLAotMHgxNDQwZmY5ZCwgMHgwLCAweDMxNjMwMGZmLCAweDI0MDIwMDAxLAotMHg1NDYyMDA3OCwgMHhhZmEwMDAxMCwgMHhhZWVhMDYwOCwgMHg4ZjgzMDA1NCwKLTB4OGY4MjAwNTQsIDB4MjQ2OTAwMzIsIDB4MTIyMTAyMywgMHgyYzQyMDAzMywKLTB4MTA0MDAwNjEsIDB4NTgyMSwgMHgyNDBlMDAwOCwgMHgyNDBkMDAxMSwKLTB4MjQwYTAwMTIsIDB4MjQwODAwNDAsIDB4MjQwYzAwMDEsIDB4OGY4MzAxMjAsCi0weDI3NjIzODAwLCAweDI0NjYwMDIwLCAweGMyMTAyYiwgMHg1MDQwMDAwMSwKLTB4Mjc2NjMwMDAsIDB4OGY4MjAxMjgsIDB4MTBjMjAwMDQsIDB4MCwKLTB4OGY4MjAxMjQsIDB4MTRjMjAwMDcsIDB4MCwgMHg4ZWUyMDFhNCwKLTB4MzgyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgMHg4MDAxZDc0LAotMHg4ZWUyMDFhNCwgMHg4ZWUyMDYwOCwgMHhhYzYyMDAxYywgMHg4ZWU0MDRhMCwKLTB4OGVlNTA0YTQsIDB4MjQ2MjAwMWMsIDB4YWM2MjAwMDgsIDB4YTQ2ZTAwMGUsCi0weGFjNmQwMDE4LCAweGFjNjQwMDAwLCAweGFjNjUwMDA0LCAweDhlZTIwNGM0LAotMHhhYzYyMDAxMCwgMHhhZjg2MDEyMCwgMHg5MmUyNGUyMCwgMHgxNDQwMDAzMywKLTB4MjQwNzAwMDEsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsCi0weDJlMjIwMjEsIDB4OGM4MjAwMDAsIDB4MTQ0YTAwMWYsIDB4MCwKLTB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIDB4MCwKLTB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsCi0weDhlZTM0ZTMwLCAweDI0NDIwMDAxLCAweDEwNDgwMDA3LCAweDAsCi0weDhlZTI0ZTM0LCAweDI0NDIwMDAxLCAweDEwNjIwMDA1LCAweDAsCi0weDgwMDFkNjEsIDB4MCwgMHgxNDYwMDAwNSwgMHgwLAotMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwKLTB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIDB4NTA0MDAwMTAsIDB4YWM4MDAwMDAsCi0weDgwMDFkNzQsIDB4MCwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwKLTB4NTA0ODAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwKLTB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsCi0weDJlMjIwMjEsIDB4YWM4YTAwMDAsIDB4YWM4YzAwMDQsIDB4NTRlMDAwMDYsCi0weDI0MGIwMDAxLCAweDhmODIwMDU0LCAweDEyMjEwMjMsIDB4MmM0MjAwMzMsCi0weDE0NDBmZmE2LCAweDAsIDB4MzE2MzAwZmYsIDB4MjQwMjAwMDEsCi0weDEwNjIwMDIyLCAweDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDUzOTAsCi0weGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhmODYwMTIwLCAweDhmODcwMTI0LAotMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAweDM0YTVmMDExLCAweDgwMDFkYTAsCi0weDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDUzOWMsIDB4YWZhMDAwMTQsCi0weDhmODYwMTIwLCAweDhmODcwMTI0LCAweDNjMDUwMDA5LCAweGMwMDI0MDMsCi0weDM0YTVmMDEwLCAweDgwMDFkYTAsIDB4MCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDUzYTgsIDB4YWZhMDAwMTQsIDB4OGVlNjA2MDgsIDB4OGY0NzAyMjgsCi0weDNjMDUwMDA5LCAweGMwMDI0MDMsIDB4MzRhNWYwMGYsIDB4OGVlMjAxYWMsCi0weDI0NDIwMDAxLCAweGFlZTIwMWFjLCAweDhlZTIwMWFjLCAweDhlZTIwMTI0LAotMHgyNDQyMDAwMSwgMHhhZWUyMDEyNCwgMHg4MDAxZjk3LCAweDhlZTIwMTI0LAotMHgyNzQ0MDIxMiwgMHhjMDAyMmZlLCAweDI0MDUwMDA2LCAweDMwNDkwMDFmLAotMHg5MjhjMCwgMHgyZTUxMDIxLCAweDk0NDI3MjdjLCAweDMwNDI4MDAwLAotMHgxMDQwMDAyZiwgMHgyZTUxMDIxLCAweDk0NDI3MjdjLCAweDMwNDI0MDAwLAotMHgxNDQwMDAxYywgMHhiNzEwMjEsIDB4OTQ0MzcyN2UsIDB4OTc0MjAyMTIsCi0weDE0NjIwMDE4LCAweGI3MTAyMSwgMHg4YzQzNzI4MCwgMHg4ZjQyMDIxNCwKLTB4NTQ2MjAwMTYsIDB4YWZhMjAwMTAsIDB4OTJlMjA0ZDgsIDB4MTA0MDAwMDcsCi0weDI0MDIwMDAxLCAweDhlZTMwNGRjLCAweDEyMjEwMDQsIDB4MjEwMjcsCi0weDYyMTgyNCwgMHg4MDAxZGM5LCAweGFlZTMwNGRjLCAweDhmODMwMjI4LAotMHgxMjIxMDA0LCAweDIxMDI3LCAweDYyMTgyNCwgMHhhZjgzMDIyOCwKLTB4OTEwYzAsIDB4MmUyMTgyMSwgMHgzNDAyYzAwMCwgMHg4MDAxZTRlLAotMHhhNDYyNzI3YywgMHg4ZjQyMDIxNCwgMHhhZmEyMDAxMCwgMHg5MTBjMCwKLTB4NTcxMDIxLCAweDhjNDI3MjdjLCAweDNjMDQwMDAxLCAweDI0ODQ1M2I0LAotMHgzYzA1MDAwMywgMHhhZmEyMDAxNCwgMHg4ZjQ3MDIxMCwgMHgzNGE1ZjAxYywKLTB4YzAwMjQwMywgMHgxMjAzMDIxLCAweDgwMDFlODMsIDB4M2MwMjA4MDAsCi0weGI3MTAyMSwgMHg5NDQzNzI3ZSwgMHg5NzQyMDIxMiwgMHgxNDYyMDAxOSwKLTB4OTE4YzAsIDB4YjcxMDIxLCAweDhjNDM3MjgwLCAweDhmNDIwMjE0LAotMHgxNDYyMDAxNCwgMHg5MThjMCwgMHgyZTUxMDIxLCAweDk0NDc3MjdjLAotMHg3MjBjMCwgMHg5NzEwMjEsIDB4OTQ0MzczN2UsIDB4YjcxMDIxLAotMHhhNDQzNzI3ZSwgMHg5NzEwMjEsIDB4OGM0MzczODAsIDB4YjcxMDIxLAotMHhhYzQzNzI4MCwgMHgyZTQxMDIxLCAweDk0NDM3MzdjLCAweDJlNTEwMjEsCi0weGE0NDM3MjdjLCAweDJlNDE4MjEsIDB4MzQwMmMwMDAsIDB4ODAwMWU0ZSwKLTB4YTQ2MjczN2MsIDB4MmUzMTAyMSwgMHg5NDQ3NzI3YywgMHgzMDIxLAotMHg3MjBjMCwgMHgyZTQxMDIxLCAweDk0NDI3MzdjLCAweDQwMjEsCi0weDMwNDI4MDAwLCAweDE0NDAwMDI1LCAweGUwMjgyMSwgMHg2MDUwMjEsCi0weDM0MGJjMDAwLCAweDk3MTAyMSwgMHg5NDQzNzM3ZSwgMHg5NzQyMDIxMiwKLTB4NTQ2MjAwMTUsIDB4ZTAyODIxLCAweDk3MTAyMSwgMHg4YzQzNzM4MCwKLTB4OGY0MjAyMTQsIDB4NTQ2MjAwMTAsIDB4ZTAyODIxLCAweDExMDAwMDA2LAotMHgyZTQxMDIxLCAweDk0NDM3MzdjLCAweDUxMGMwLCAweDJlMjEwMjEsCi0weDgwMDFlMWEsIDB4YTQ0MzczN2MsIDB4OTQ0MzczN2MsIDB4MmVhMTAyMSwKLTB4YTQ0MzcyN2MsIDB4NzEwYzAsIDB4MmUyMTAyMSwgMHhhNDRiNzM3YywKLTB4ODAwMWUyOCwgMHgyNDA2MDAwMSwgMHg1MTBjMCwgMHgyZTIxMDIxLAotMHg5NDQ3NzM3YywgMHg3MjBjMCwgMHgyZTQxMDIxLCAweDk0NDI3MzdjLAotMHgzMDQyODAwMCwgMHgxMDQwZmZkZiwgMHgyNTA4MDAwMSwgMHgzMGMyMDBmZiwKLTB4MTQ0MDAwMjUsIDB4MjAyMSwgMHg3MjBjMCwgMHg5NzEwMjEsCi0weDk0NDM3MzdlLCAweDk3NDIwMjEyLCAweDE0NjIwMDBmLCAweDkxMGMwLAotMHg5NzEwMjEsIDB4OGM0MzczODAsIDB4OGY0MjAyMTQsIDB4MTQ2MjAwMGEsCi0weDkxMGMwLCAweDJlNDE4MjEsIDB4MzQwMmMwMDAsIDB4MTUwMDAwMTUsCi0weGE0NjI3MzdjLCAweDkxMGMwLCAweDJlMjE4MjEsIDB4MzQwMjgwMDAsCi0weDgwMDFlNGUsIDB4YTQ2MjcyN2MsIDB4NTcxMDIxLCAweDhjNDI3MjdjLAotMHgzYzA0MDAwMSwgMHgyNDg0NTNjMCwgMHgzYzA1MDAwMywgMHhhZmEyMDAxMCwKLTB4NzEwYzAsIDB4NTcxMDIxLCAweDhjNDI3MzdjLCAweDM0YTUwMDFlLAotMHgxMjAzMDIxLCAweGMwMDI0MDMsIDB4YWZhMjAwMTQsIDB4ODAwMWU4MywKLTB4M2MwMjA4MDAsIDB4MjAyMSwgMHg0MjhjMCwgMHhiNzEwMjEsCi0weDk0NDM3NzdlLCAweDk3NDIwMjEyLCAweDU0NjIwMDJiLCAweDI0ODQwMDAxLAotMHhiNzEwMjEsIDB4OGM0Mzc3ODAsIDB4OGY0MjAyMTQsIDB4NTQ2MjAwMjYsCi0weDI0ODQwMDAxLCAweDNjMDIwMDAxLCAweDU3MTAyMSwgMHg4YzQyODNiNCwKLTB4MjQ0MmZmZmYsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjI4M2I0LAotMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OGM0MjgzYjQsIDB4ODA5MDIxLAotMHgyNDIxMDJiLCAweDEwNDAwMDBlLCAweDI0YjE3NzdjLCAweDI0YjA3Nzg0LAotMHgyZjAyMDIxLCAweDJmMTI4MjEsIDB4YzAwMjQ5MCwgMHgyNDA2MDAwOCwKLTB4MjYzMTAwMDgsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDhjNDI4M2I0LAotMHgyNjUyMDAwMSwgMHgyNDIxMDJiLCAweDE0NDBmZmY1LCAweDI2MTAwMDA4LAotMHgzYzA0MDAwMSwgMHg5NzIwMjEsIDB4OGM4NDgzYjQsIDB4MjQwNTAwMDgsCi0weDQyMGMwLCAweDI0ODQ3NzdjLCAweGMwMDI0ODgsIDB4MmU0MjAyMSwKLTB4ODAwMWU4MywgMHgzYzAyMDgwMCwgMHgyYzgyMDA4MCwgMHgxNDQwZmZjZiwKLTB4NDI4YzAsIDB4M2MwMjA4MDAsIDB4MzQ0MjIwMDAsIDB4YWZhMjAwMTgsCi0weDhlZTIwNjA4LCAweDhmNDMwMjI4LCAweDI0NDIwMDAxLCAweDMwNGEwMGZmLAotMHg1MTQzMDBmZCwgMHhhZmEwMDAxMCwgMHg4ZWUyMDYwOCwgMHgyMTBjMCwKLTB4NTcxMDIxLCAweDhmYTMwMDE4LCAweDhmYTQwMDFjLCAweGFjNDMwNjBjLAotMHhhYzQ0MDYxMCwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgyNDY5MDAzMiwKLTB4MTIyMTAyMywgMHgyYzQyMDAzMywgMHgxMDQwMDA2YSwgMHg1ODIxLAotMHgyNDEwMDAwOCwgMHgyNDBmMDAwZCwgMHgyNDBkMDAwNywgMHgyNDBjMDA0MCwKLTB4MjQwZTAwMDEsIDB4OGY4NzAxMjAsIDB4Mjc2MjM4MDAsIDB4MjRlODAwMjAsCi0weDEwMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2ODMwMDAsIDB4OGY4MjAxMjgsCi0weDExMDIwMDA0LCAweDAsIDB4OGY4MjAxMjQsIDB4MTUwMjAwMDcsCi0weDEwMjEsIDB4OGVlMjAxYTQsIDB4MzgyMSwgMHgyNDQyMDAwMSwKLTB4YWVlMjAxYTQsIDB4ODAwMWVmYiwgMHg4ZWUyMDFhNCwgMHg4ZWU0MDYwOCwKLTB4NDIwYzAsIDB4ODAxODIxLCAweDhlZTQwNDMwLCAweDhlZTUwNDM0LAotMHhhMzI4MjEsIDB4YTMzMDJiLCAweDgyMjAyMSwgMHg4NjIwMjEsCi0weGFjZTQwMDAwLCAweGFjZTUwMDA0LCAweDhlZTIwNjA4LCAweGE0ZjAwMDBlLAotMHhhY2VmMDAxOCwgMHhhY2VhMDAxYywgMHgyMTBjMCwgMHgyNDQyMDYwYywKLTB4MmUyMTAyMSwgMHhhY2UyMDAwOCwgMHg4ZWUyMDRjNCwgMHhhY2UyMDAxMCwKLTB4YWY4ODAxMjAsIDB4OTJlMjRlMjAsIDB4MTQ0MDAwMzMsIDB4MjQwNzAwMDEsCi0weDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsCi0weDhjODIwMDAwLCAweDE0NGQwMDFmLCAweDAsIDB4OGVlMzRlMzAsCi0weDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAweDAsIDB4OGM4MjAwMDQsCi0weDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTM0LCAweDhlZTM0ZTMwLAotMHgyNDQyMDAwMSwgMHgxMDRjMDAwNywgMHgwLCAweDhlZTI0ZTM0LAotMHgyNDQyMDAwMSwgMHgxMDYyMDAwNSwgMHgwLCAweDgwMDFlZTgsCi0weDAsIDB4MTQ2MDAwMDUsIDB4MCwgMHg4ZjgyMDEyOCwKLTB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsCi0weDJjNDIwMDExLCAweDUwNDAwMDEwLCAweGFjODAwMDAwLCAweDgwMDFlZmIsCi0weDAsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4NTA0YzAwMDMsCi0weDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsCi0weDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsCi0weGFjOGQwMDAwLCAweGFjOGUwMDA0LCAweDU0ZTAwMDA2LCAweDI0MGIwMDAxLAotMHg4ZjgyMDA1NCwgMHgxMjIxMDIzLCAweDJjNDIwMDMzLCAweDE0NDBmZjlkLAotMHgwLCAweDMxNjMwMGZmLCAweDI0MDIwMDAxLCAweDU0NjIwMDc4LAotMHhhZmEwMDAxMCwgMHhhZWVhMDYwOCwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwKLTB4MjQ2OTAwMzIsIDB4MTIyMTAyMywgMHgyYzQyMDAzMywgMHgxMDQwMDA2MSwKLTB4NTgyMSwgMHgyNDBlMDAwOCwgMHgyNDBkMDAxMSwgMHgyNDBhMDAxMiwKLTB4MjQwODAwNDAsIDB4MjQwYzAwMDEsIDB4OGY4MzAxMjAsIDB4Mjc2MjM4MDAsCi0weDI0NjYwMDIwLCAweGMyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY2MzAwMCwKLTB4OGY4MjAxMjgsIDB4MTBjMjAwMDQsIDB4MCwgMHg4ZjgyMDEyNCwKLTB4MTRjMjAwMDcsIDB4MCwgMHg4ZWUyMDFhNCwgMHgzODIxLAotMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgMHg4MDAxZjY3LCAweDhlZTIwMWE0LAotMHg4ZWUyMDYwOCwgMHhhYzYyMDAxYywgMHg4ZWU0MDRhMCwgMHg4ZWU1MDRhNCwKLTB4MjQ2MjAwMWMsIDB4YWM2MjAwMDgsIDB4YTQ2ZTAwMGUsIDB4YWM2ZDAwMTgsCi0weGFjNjQwMDAwLCAweGFjNjUwMDA0LCAweDhlZTIwNGM0LCAweGFjNjIwMDEwLAotMHhhZjg2MDEyMCwgMHg5MmUyNGUyMCwgMHgxNDQwMDAzMywgMHgyNDA3MDAwMSwKLTB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwKLTB4OGM4MjAwMDAsIDB4MTQ0YTAwMWYsIDB4MCwgMHg4ZWUzNGUzMCwKLTB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIDB4MCwgMHg4YzgyMDAwNCwKLTB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIDB4OGVlMzRlMzAsCi0weDI0NDIwMDAxLCAweDEwNDgwMDA3LCAweDAsIDB4OGVlMjRlMzQsCi0weDI0NDIwMDAxLCAweDEwNjIwMDA1LCAweDAsIDB4ODAwMWY1NCwKLTB4MCwgMHgxNDYwMDAwNSwgMHgwLCAweDhmODIwMTI4LAotMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwKLTB4MmM0MjAwMTEsIDB4NTA0MDAwMTAsIDB4YWM4MDAwMDAsIDB4ODAwMWY2NywKLTB4MCwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHg1MDQ4MDAwMywKLTB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwKLTB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwKLTB4YWM4YTAwMDAsIDB4YWM4YzAwMDQsIDB4NTRlMDAwMDYsIDB4MjQwYjAwMDEsCi0weDhmODIwMDU0LCAweDEyMjEwMjMsIDB4MmM0MjAwMzMsIDB4MTQ0MGZmYTYsCi0weDAsIDB4MzE2MzAwZmYsIDB4MjQwMjAwMDEsIDB4MTA2MjAwMjIsCi0weDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDUzOTAsIDB4YWZhMDAwMTAsCi0weGFmYTAwMDE0LCAweDhmODYwMTIwLCAweDhmODcwMTI0LCAweDNjMDUwMDA5LAotMHhjMDAyNDAzLCAweDM0YTVmMDExLCAweDgwMDFmOTMsIDB4MCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDUzOWMsIDB4YWZhMDAwMTQsIDB4OGY4NjAxMjAsCi0weDhmODcwMTI0LCAweDNjMDUwMDA5LCAweGMwMDI0MDMsIDB4MzRhNWYwMTAsCi0weDgwMDFmOTMsIDB4MCwgMHgzYzA0MDAwMSwgMHgyNDg0NTNhOCwKLTB4YWZhMDAwMTQsIDB4OGVlNjA2MDgsIDB4OGY0NzAyMjgsIDB4M2MwNTAwMDksCi0weGMwMDI0MDMsIDB4MzRhNWYwMGYsIDB4OGVlMjAxYWMsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMWFjLCAweDhlZTIwMWFjLCAweDhlZTIwMTI4LCAweDI0NDIwMDAxLAotMHhhZWUyMDEyOCwgMHg4ZWUyMDEyOCwgMHg4ZWUyMDE2NCwgMHgyNDQyMDAwMSwKLTB4YWVlMjAxNjQsIDB4ODAwMjJlOCwgMHg4ZWUyMDE2NCwgMHg4ZmEyMDAyMCwKLTB4MjEyMDAsIDB4MjFkMDIsIDB4MjQwMjAwMDEsIDB4MTA2MjAwMDUsCi0weDI0MDIwMDAyLCAweDEwNjIwMDBkLCAweDAsIDB4ODAwMWZiNywKLTB4YWZhMDAwMTAsIDB4OTJlMjA0ZDgsIDB4MTQ0MDAwMDYsIDB4MjQwMjAwMDEsCi0weDhmODIwMjI4LCAweGFlZTIwNGRjLCAweDI0MDJmZmZmLCAweGFmODIwMjI4LAotMHgyNDAyMDAwMSwgMHg4MDAxZmJlLCAweGEyZTIwNGQ4LCAweDkyZTIwNGQ4LAotMHg1MDQwMDAwYywgMHhhMmUwMDRkOCwgMHg4ZWUyMDRkYywgMHhhZjgyMDIyOCwKLTB4ODAwMWZiZSwgMHhhMmUwMDRkOCwgMHgzYzA0MDAwMSwgMHgyNDg0NTNjOCwKLTB4YWZhMDAwMTQsIDB4OGZhNjAwMjAsIDB4M2MwNTAwMDMsIDB4YzAwMjQwMywKLTB4MzRhNWYwMDksIDB4OGVlMjAxM2MsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxM2MsCi0weDgwMDIyZTgsIDB4OGVlMjAxM2MsIDB4OGZhMjAwMjAsIDB4MjEyMDAsCi0weDIyNTAyLCAweDI0MDIwMDAxLCAweDEwODIwMDA1LCAweDI0MDIwMDAyLAotMHgxMDgyMDAwZiwgMHgwLCAweDgwMDFmZTMsIDB4YWZhMDAwMTAsCi0weDhmODIwMjIwLCAweDNjMDMwOGZmLCAweDM0NjNmZmZmLCAweDQzMTAyNCwKLTB4MzQ0MjAwMDgsIDB4YWY4MjAyMjAsIDB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsCi0weDM3MDgyMSwgMHhhMDIyODNiMiwgMHg4MDAxZmVhLCAweGFlZTQwMTA4LAotMHg4ZjgyMDIyMCwgMHgzYzAzMDhmZiwgMHgzNDYzZmZmNywgMHg0MzEwMjQsCi0weGFmODIwMjIwLCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDIwODNiMiwKLTB4ODAwMWZlYSwgMHhhZWU0MDEwOCwgMHgzYzA0MDAwMSwgMHgyNDg0NTNkNCwKLTB4YWZhMDAwMTQsIDB4OGZhNjAwMjAsIDB4M2MwNTAwMDMsIDB4YzAwMjQwMywKLTB4MzRhNWYwMGEsIDB4OGVlMjAxMmMsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxMmMsCi0weDgwMDIyZTgsIDB4OGVlMjAxMmMsIDB4OGZhMjAwMjAsIDB4MjEyMDAsCi0weDIxZDAyLCAweDI0MDIwMDAxLCAweDEwNjIwMDA1LCAweDI0MDIwMDAyLAotMHgxMDYyMDAwZSwgMHgwLCAweDgwMDIwMTEsIDB4YWZhMDAwMTAsCi0weDhmODIwMjIwLCAweDNjMDMwOGZmLCAweDM0NjNmZmZmLCAweDQzMTAyNCwKLTB4MzQ0MjAwMDgsIDB4YWY4MjAyMjAsIDB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsCi0weDM3MDgyMSwgMHg4MDAyMDE4LCAweGEwMjI4M2IzLCAweDNjMDIwMDAxLAotMHg1NzEwMjEsIDB4OTA0MjgzYjIsIDB4M2MwMTAwMDEsIDB4MzcwODIxLAotMHgxNDQwMDAwZSwgMHhhMDIwODNiMywgMHg4ZjgyMDIyMCwgMHgzYzAzMDhmZiwKLTB4MzQ2M2ZmZjcsIDB4NDMxMDI0LCAweDgwMDIwMTgsIDB4YWY4MjAyMjAsCi0weDNjMDQwMDAxLCAweDI0ODQ1M2UwLCAweGFmYTAwMDE0LCAweDhmYTYwMDIwLAotMHgzYzA1MDAwMywgMHhjMDAyNDAzLCAweDM0YTVmMDBiLCAweDhlZTIwMTE0LAotMHgyNDQyMDAwMSwgMHhhZWUyMDExNCwgMHg4MDAyMmU4LCAweDhlZTIwMTE0LAotMHgyNzg0MDIwOCwgMHgyNzQ1MDIwMCwgMHhjMDAyNDlhLCAweDI0MDYwMDA4LAotMHgyNmU0MDA5NCwgMHgyNzQ1MDIwMCwgMHhjMDAyNDlhLCAweDI0MDYwMDA4LAotMHg4ZWUyMDEzNCwgMHgyNDQyMDAwMSwgMHhhZWUyMDEzNCwgMHg4MDAyMmU4LAotMHg4ZWUyMDEzNCwgMHg4ZjQ2MDI0OCwgMHgyMDIxLCAweGMwMDUxMDgsCi0weDI0MDUwMDA0LCAweDhlZTIwMTMwLCAweDI0NDIwMDAxLCAweGFlZTIwMTMwLAotMHg4MDAyMmU4LCAweDhlZTIwMTMwLCAweDhlZjMwMWNjLCAweDhlZjQwMWQwLAotMHg4ZWY1MDFkOCwgMHg4ZWUyMDE0MCwgMHgyNmU0MDAzMCwgMHgyNDQyMDAwMSwKLTB4YWVlMjAxNDAsIDB4OGVmMDAxNDAsIDB4OGVmMTAwNzQsIDB4OGVmMjAwNzAsCi0weGMwMDI0ODgsIDB4MjQwNTA0MDAsIDB4YWVmMzAxY2MsIDB4YWVmNDAxZDAsCi0weGFlZjUwMWQ4LCAweGFlZjAwMTQwLCAweGFlZjEwMDc0LCAweGFlZjIwMDcwLAotMHg4ZjQyMDI1YywgMHgyNmU0MDA5NCwgMHhhZWUyMDA2MCwgMHg4ZjQyMDI2MCwKLTB4Mjc0NTAyMDAsIDB4MjQwNjAwMDgsIDB4YWVlMjAwNjgsIDB4MjQwMjAwMDYsCi0weGMwMDI0OWEsIDB4YWVlMjAwNjQsIDB4M2MwMjNiOWEsIDB4MzQ0MmNhMDAsCi0weGFlZTIwMDZjLCAweDI0MDIwM2U4LCAweDI0MDQwMDAyLCAweDI0MDMwMDAxLAotMHhhZWUyMDEwNCwgMHhhZWU0MDEwMCwgMHhhZWUzMDEwYywgMHg4ZjgyMDIyMCwKLTB4MzA0MjAwMDgsIDB4MTA0MDAwMDQsIDB4MCwgMHhhZWUzMDEwOCwKLTB4ODAwMjA2MSwgMHgyMDIxLCAweGFlZTQwMTA4LCAweDIwMjEsCi0weDNjMDMwMDAxLCAweDY0MTgyMSwgMHg5MDYzNWMzMCwgMHgyZTQxMDIxLAotMHgyNDg0MDAwMSwgMHhhMDQzMDA5YywgMHgyYzgyMDAwZiwgMHgxNDQwZmZmOCwKLTB4MCwgMHg4ZjgyMDA0MCwgMHgyZTQxODIxLCAweDI0ODQwMDAxLAotMHgyMTcwMiwgMHgyNDQyMDAzMCwgMHhhMDYyMDA5YywgMHgyZTQxMDIxLAotMHg4MDAyMmU4LCAweGEwNDAwMDljLCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLAotMHgzNzA4MjEsIDB4YTAyMjgzZTAsIDB4MjQwYjA0MDAsIDB4MjQwODAwMTQsCi0weDI0MGEwMDQwLCAweDI0MDkwMDAxLCAweDhmODMwMTAwLCAweDI3NjIzMDAwLAotMHgyNDY2MDAyMCwgMHhjMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2NjI4MDAsCi0weDhmODIwMTA4LCAweDEwYzIwMDA0LCAweDAsIDB4OGY4MjAxMDQsCi0weDE0YzIwMDA3LCAweDI2ZTIwMDMwLCAweDhlZTIwMWE4LCAweDM4MjEsCi0weDI0NDIwMDAxLCAweGFlZTIwMWE4LCAweDgwMDIwYTgsIDB4OGVlMjAxYTgsCi0weDhlZTQwNGI4LCAweDhlZTUwNGJjLCAweGFjNjIwMDA4LCAweGE0NmIwMDBlLAotMHhhYzY4MDAxOCwgMHhhYzYwMDAxYywgMHhhYzY0MDAwMCwgMHhhYzY1MDAwNCwKLTB4OGVlMjA0Y2MsIDB4YWM2MjAwMTAsIDB4YWY4NjAxMDAsIDB4OTJlMjA0ZWMsCi0weDE0NDAwMDBlLCAweDI0MDcwMDAxLCAweDhlZTI0ZTI4LCAweDI0NDIwMDAxLAotMHg1MDRhMDAwMywgMHgxMDIxLCAweDhlZTI0ZTI4LCAweDI0NDIwMDAxLAotMHhhZWUyNGUyOCwgMHg4ZWUyNGUyOCwgMHgyMTBjMCwgMHgyNDQyNGUzOCwKLTB4MmUyMTAyMSwgMHhhYzQ4MDAwMCwgMHhhYzQ5MDAwNCwgMHgxMGUwZmZkMiwKLTB4MCwgMHg4MDAyMmU4LCAweDAsIDB4M2MwMjA5MDAsCi0weGFlZTA1MjM4LCAweGFlZTA1MjNjLCAweGFlZTA1MjQwLCAweGFlZTA1MjQ0LAotMHhhZWUwMDFkMCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YTAyMDgzYjEsCi0weGFmYTIwMDE4LCAweDhlZTIwNjA4LCAweDhmNDMwMjI4LCAweDI0NDIwMDAxLAotMHgzMDRhMDBmZiwgMHg1MTQzMDBmZCwgMHhhZmEwMDAxMCwgMHg4ZWUyMDYwOCwKLTB4MjEwYzAsIDB4NTcxMDIxLCAweDhmYTMwMDE4LCAweDhmYTQwMDFjLAotMHhhYzQzMDYwYywgMHhhYzQ0MDYxMCwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwKLTB4MjQ2OTAwMzIsIDB4MTIyMTAyMywgMHgyYzQyMDAzMywgMHgxMDQwMDA2YSwKLTB4NTgyMSwgMHgyNDEwMDAwOCwgMHgyNDBmMDAwZCwgMHgyNDBkMDAwNywKLTB4MjQwYzAwNDAsIDB4MjQwZTAwMDEsIDB4OGY4NzAxMjAsIDB4Mjc2MjM4MDAsCi0weDI0ZTgwMDIwLCAweDEwMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2ODMwMDAsCi0weDhmODIwMTI4LCAweDExMDIwMDA0LCAweDAsIDB4OGY4MjAxMjQsCi0weDE1MDIwMDA3LCAweDEwMjEsIDB4OGVlMjAxYTQsIDB4MzgyMSwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsIDB4ODAwMjEyYywgMHg4ZWUyMDFhNCwKLTB4OGVlNDA2MDgsIDB4NDIwYzAsIDB4ODAxODIxLCAweDhlZTQwNDMwLAotMHg4ZWU1MDQzNCwgMHhhMzI4MjEsIDB4YTMzMDJiLCAweDgyMjAyMSwKLTB4ODYyMDIxLCAweGFjZTQwMDAwLCAweGFjZTUwMDA0LCAweDhlZTIwNjA4LAotMHhhNGYwMDAwZSwgMHhhY2VmMDAxOCwgMHhhY2VhMDAxYywgMHgyMTBjMCwKLTB4MjQ0MjA2MGMsIDB4MmUyMTAyMSwgMHhhY2UyMDAwOCwgMHg4ZWUyMDRjNCwKLTB4YWNlMjAwMTAsIDB4YWY4ODAxMjAsIDB4OTJlMjRlMjAsIDB4MTQ0MDAwMzMsCi0weDI0MDcwMDAxLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LAotMHgyZTIyMDIxLCAweDhjODIwMDAwLCAweDE0NGQwMDFmLCAweDAsCi0weDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAweDAsCi0weDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTM0LAotMHg4ZWUzNGUzMCwgMHgyNDQyMDAwMSwgMHgxMDRjMDAwNywgMHgwLAotMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwgMHgxMDYyMDAwNSwgMHgwLAotMHg4MDAyMTE5LCAweDAsIDB4MTQ2MDAwMDUsIDB4MCwKLTB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsCi0weDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEwLCAweGFjODAwMDAwLAotMHg4MDAyMTJjLCAweDAsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsCi0weDUwNGMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsCi0weGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LAotMHgyZTIyMDIxLCAweGFjOGQwMDAwLCAweGFjOGUwMDA0LCAweDU0ZTAwMDA2LAotMHgyNDBiMDAwMSwgMHg4ZjgyMDA1NCwgMHgxMjIxMDIzLCAweDJjNDIwMDMzLAotMHgxNDQwZmY5ZCwgMHgwLCAweDMxNjMwMGZmLCAweDI0MDIwMDAxLAotMHg1NDYyMDA3OCwgMHhhZmEwMDAxMCwgMHhhZWVhMDYwOCwgMHg4ZjgzMDA1NCwKLTB4OGY4MjAwNTQsIDB4MjQ2OTAwMzIsIDB4MTIyMTAyMywgMHgyYzQyMDAzMywKLTB4MTA0MDAwNjEsIDB4NTgyMSwgMHgyNDBlMDAwOCwgMHgyNDBkMDAxMSwKLTB4MjQwYTAwMTIsIDB4MjQwODAwNDAsIDB4MjQwYzAwMDEsIDB4OGY4MzAxMjAsCi0weDI3NjIzODAwLCAweDI0NjYwMDIwLCAweGMyMTAyYiwgMHg1MDQwMDAwMSwKLTB4Mjc2NjMwMDAsIDB4OGY4MjAxMjgsIDB4MTBjMjAwMDQsIDB4MCwKLTB4OGY4MjAxMjQsIDB4MTRjMjAwMDcsIDB4MCwgMHg4ZWUyMDFhNCwKLTB4MzgyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgMHg4MDAyMTk4LAotMHg4ZWUyMDFhNCwgMHg4ZWUyMDYwOCwgMHhhYzYyMDAxYywgMHg4ZWU0MDRhMCwKLTB4OGVlNTA0YTQsIDB4MjQ2MjAwMWMsIDB4YWM2MjAwMDgsIDB4YTQ2ZTAwMGUsCi0weGFjNmQwMDE4LCAweGFjNjQwMDAwLCAweGFjNjUwMDA0LCAweDhlZTIwNGM0LAotMHhhYzYyMDAxMCwgMHhhZjg2MDEyMCwgMHg5MmUyNGUyMCwgMHgxNDQwMDAzMywKLTB4MjQwNzAwMDEsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsCi0weDJlMjIwMjEsIDB4OGM4MjAwMDAsIDB4MTQ0YTAwMWYsIDB4MCwKLTB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIDB4MCwKLTB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsCi0weDhlZTM0ZTMwLCAweDI0NDIwMDAxLCAweDEwNDgwMDA3LCAweDAsCi0weDhlZTI0ZTM0LCAweDI0NDIwMDAxLCAweDEwNjIwMDA1LCAweDAsCi0weDgwMDIxODUsIDB4MCwgMHgxNDYwMDAwNSwgMHgwLAotMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwKLTB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIDB4NTA0MDAwMTAsIDB4YWM4MDAwMDAsCi0weDgwMDIxOTgsIDB4MCwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwKLTB4NTA0ODAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwKLTB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsCi0weDJlMjIwMjEsIDB4YWM4YTAwMDAsIDB4YWM4YzAwMDQsIDB4NTRlMDAwMDYsCi0weDI0MGIwMDAxLCAweDhmODIwMDU0LCAweDEyMjEwMjMsIDB4MmM0MjAwMzMsCi0weDE0NDBmZmE2LCAweDAsIDB4MzE2MzAwZmYsIDB4MjQwMjAwMDEsCi0weDEwNjIwMDIyLCAweDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDUzOTAsCi0weGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhmODYwMTIwLCAweDhmODcwMTI0LAotMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAweDM0YTVmMDExLCAweDgwMDIxYzQsCi0weDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDUzOWMsIDB4YWZhMDAwMTQsCi0weDhmODYwMTIwLCAweDhmODcwMTI0LCAweDNjMDUwMDA5LCAweGMwMDI0MDMsCi0weDM0YTVmMDEwLCAweDgwMDIxYzQsIDB4MCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDUzYTgsIDB4YWZhMDAwMTQsIDB4OGVlNjA2MDgsIDB4OGY0NzAyMjgsCi0weDNjMDUwMDA5LCAweGMwMDI0MDMsIDB4MzRhNWYwMGYsIDB4OGVlMjAxYWMsCi0weDI0NDIwMDAxLCAweGFlZTIwMWFjLCAweDhlZTIwMWFjLCAweDhlZTIwMTIwLAotMHgyNDQyMDAwMSwgMHhhZWUyMDEyMCwgMHg4ZWUyMDEyMCwgMHg4ZWUyMDE2OCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxNjgsIDB4ODAwMjJlOCwgMHg4ZWUyMDE2OCwKLTB4OGY0MjAyNWMsIDB4MjZlNDAwOTQsIDB4YWVlMjAwNjAsIDB4OGY0MjAyNjAsCi0weDI3NDUwMjAwLCAweDI0MDYwMDA4LCAweGMwMDI0OWEsIDB4YWVlMjAwNjgsCi0weDhmODIwMjIwLCAweDMwNDIwMDA4LCAweDE0NDAwMDAyLCAweDI0MDIwMDAxLAotMHgyNDAyMDAwMiwgMHhhZWUyMDEwOCwgMHg4ZWUyMDExYywgMHgyNDQyMDAwMSwKLTB4YWVlMjAxMWMsIDB4ODAwMjJlOCwgMHg4ZWUyMDExYywgMHgzYzA0MDAwMSwKLTB4MjQ4NDUzZWMsIDB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsIDB4OGZhNjAwMjAsCi0weDNjMDUwMDAzLCAweGMwMDI0MDMsIDB4MzRhNWYwMGYsIDB4OTNhMjAwMjAsCi0weDNjMDMwNzAwLCAweDM0NjMxMDAwLCAweDQzMTAyNSwgMHhhZmEyMDAxOCwKLTB4OGVlMjA2MDgsIDB4OGY0MzAyMjgsIDB4MjQ0MjAwMDEsIDB4MzA0OTAwZmYsCi0weDUxMjMwMGUyLCAweGFmYTAwMDEwLCAweDhlZTIwNjA4LCAweDIxMGMwLAotMHg1NzEwMjEsIDB4OGZhMzAwMTgsIDB4OGZhNDAwMWMsIDB4YWM0MzA2MGMsCi0weGFjNDQwNjEwLCAweDhmODcwMTIwLCAweDI3NjIzODAwLCAweDI0ZTgwMDIwLAotMHgxMDIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjgzMDAwLCAweDhmODIwMTI4LAotMHgxMTAyMDAwNCwgMHgwLCAweDhmODIwMTI0LCAweDE1MDIwMDA3LAotMHgxMDIxLCAweDhlZTIwMWE0LCAweDM4MjEsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMWE0LCAweDgwMDIyNWQsIDB4OGVlMjAxYTQsIDB4OGVlNDA2MDgsCi0weDQyMGMwLCAweDgwMTgyMSwgMHg4ZWU0MDQzMCwgMHg4ZWU1MDQzNCwKLTB4YTMyODIxLCAweGEzMzAyYiwgMHg4MjIwMjEsIDB4ODYyMDIxLAotMHhhY2U0MDAwMCwgMHhhY2U1MDAwNCwgMHg4ZWUzMDYwOCwgMHgyNDAyMDAwOCwKLTB4YTRlMjAwMGUsIDB4MjQwMjAwMGQsIDB4YWNlMjAwMTgsIDB4YWNlOTAwMWMsCi0weDMxOGMwLCAweDI0NjMwNjBjLCAweDJlMzEwMjEsIDB4YWNlMjAwMDgsCi0weDhlZTIwNGM0LCAweGFjZTIwMDEwLCAweGFmODgwMTIwLCAweDkyZTI0ZTIwLAotMHgxNDQwMDAzNywgMHgyNDA3MDAwMSwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwKLTB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHg4YzgzMDAwMCwgMHgyNDAyMDAwNywKLTB4MTQ2MjAwMWYsIDB4MCwgMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwKLTB4MTA2MjAwMWIsIDB4MjQwMzAwNDAsIDB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsCi0weGFjODIwMDA0LCAweDhlZTI0ZTM0LCAweDhlZTU0ZTMwLCAweDI0NDIwMDAxLAotMHgxMDQzMDAwNywgMHgwLCAweDhlZTI0ZTM0LCAweDI0NDIwMDAxLAotMHgxMGEyMDAwNSwgMHgwLCAweDgwMDIyNDcsIDB4MCwKLTB4MTRhMDAwMDUsIDB4MCwgMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwKLTB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsCi0weDUwNDAwMDEzLCAweGFjODAwMDAwLCAweDgwMDIyNWQsIDB4MCwKLTB4OGVlMjRlMzAsIDB4MjQwMzAwNDAsIDB4MjQ0MjAwMDEsIDB4NTA0MzAwMDMsCi0weDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsCi0weDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsCi0weDI0MDIwMDA3LCAweGFjODIwMDAwLCAweDI0MDIwMDAxLCAweGFjODIwMDA0LAotMHg1NGUwMDAwYywgMHhhZWU5MDYwOCwgMHgzYzA0MDAwMSwgMHgyNDg0NTNmNCwKLTB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsIDB4OGVlNjA2MDgsIDB4OGY0NzAyMjgsCi0weDNjMDUwMDA5LCAweGMwMDI0MDMsIDB4MzRhNWYwMDAsIDB4ODAwMjJlMCwKLTB4MCwgMHg4ZjgzMDEyMCwgMHgyNzYyMzgwMCwgMHgyNDY2MDAyMCwKLTB4YzIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjYzMDAwLCAweDhmODIwMTI4LAotMHgxMGMyMDAwNCwgMHgwLCAweDhmODIwMTI0LCAweDE0YzIwMDA3LAotMHgwLCAweDhlZTIwMWE0LCAweDM4MjEsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMWE0LCAweDgwMDIyYzQsIDB4OGVlMjAxYTQsIDB4OGVlMjA2MDgsCi0weGFjNjIwMDFjLCAweDhlZTQwNGEwLCAweDhlZTUwNGE0LCAweDI0NjIwMDFjLAotMHhhYzYyMDAwOCwgMHgyNDAyMDAwOCwgMHhhNDYyMDAwZSwgMHgyNDAyMDAxMSwKLTB4YWM2MjAwMTgsIDB4YWM2NDAwMDAsIDB4YWM2NTAwMDQsIDB4OGVlMjA0YzQsCi0weGFjNjIwMDEwLCAweGFmODYwMTIwLCAweDkyZTI0ZTIwLCAweDE0NDAwMDM3LAotMHgyNDA3MDAwMSwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwKLTB4MmUyMjAyMSwgMHg4YzgzMDAwMCwgMHgyNDAyMDAxMiwgMHgxNDYyMDAxZiwKLTB4MCwgMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwKLTB4MjQwMzAwNDAsIDB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsCi0weDhlZTI0ZTM0LCAweDhlZTU0ZTMwLCAweDI0NDIwMDAxLCAweDEwNDMwMDA3LAotMHgwLCAweDhlZTI0ZTM0LCAweDI0NDIwMDAxLCAweDEwYTIwMDA1LAotMHgwLCAweDgwMDIyYWUsIDB4MCwgMHgxNGEwMDAwNSwKLTB4MCwgMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwKLTB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIDB4NTA0MDAwMTMsCi0weGFjODAwMDAwLCAweDgwMDIyYzQsIDB4MCwgMHg4ZWUyNGUzMCwKLTB4MjQwMzAwNDAsIDB4MjQ0MjAwMDEsIDB4NTA0MzAwMDMsIDB4MTAyMSwKLTB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsCi0weDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4MjQwMjAwMTIsCi0weGFjODIwMDAwLCAweDI0MDIwMDAxLCAweGFjODIwMDA0LCAweDE0ZTAwMDFiLAotMHgwLCAweDNjMDQwMDAxLCAweDI0ODQ1M2ZjLCAweGFmYTAwMDEwLAotMHhhZmEwMDAxNCwgMHg4ZWU2MDYwOCwgMHg4ZjQ3MDIyOCwgMHgzYzA1MDAwOSwKLTB4YzAwMjQwMywgMHgzNGE1ZjAwMSwgMHg4ZWUyMDFiMCwgMHgyNDQyMDAwMSwKLTB4YWVlMjAxYjAsIDB4ODAwMjJlMCwgMHg4ZWUyMDFiMCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDU0MDgsIDB4YWZhMDAwMTQsIDB4OGVlNjA2MDgsIDB4OGY0NzAyMjgsCi0weDNjMDUwMDA5LCAweGMwMDI0MDMsIDB4MzRhNWYwMDUsIDB4OGVlMjAxYWMsCi0weDI0NDIwMDAxLCAweGFlZTIwMWFjLCAweDhlZTIwMWFjLCAweDhlZTIwMTUwLAotMHgyNDQyMDAwMSwgMHhhZWUyMDE1MCwgMHg4ZWUyMDE1MCwgMHg4ZWUyMDE2MCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxNjAsIDB4OGVlMjAxNjAsIDB4OGY0MzAyMmMsCi0weDhmNDIwMTBjLCAweDE0NjIwMDA5LCAweDI0MDIwMDAyLCAweGFmODIwMDY0LAotMHg4ZjgyMDA2NCwgMHgxNDQwMDAwNSwgMHgwLCAweDhmNDMwMjJjLAotMHg4ZjQyMDEwYywgMHgxNDYyZjg3NSwgMHgwLCAweDhmYmYwMDQ0LAotMHg4ZmI2MDA0MCwgMHg4ZmI1MDAzYywgMHg4ZmI0MDAzOCwgMHg4ZmIzMDAzNCwKLTB4OGZiMjAwMzAsIDB4OGZiMTAwMmMsIDB4OGZiMDAwMjgsIDB4M2UwMDAwOCwKLTB4MjdiZDAwNDgsIDB4MjdiZGZmZjgsIDB4MjQwOGZmZmYsIDB4MTBhMDAwMTQsCi0weDQ4MjEsIDB4M2MwYWVkYjgsIDB4MzU0YTgzMjAsIDB4OTA4NzAwMDAsCi0weDI0ODQwMDAxLCAweDMwMjEsIDB4MTA3MTAyNiwgMHgzMDQyMDAwMSwKLTB4MTA0MDAwMDIsIDB4ODE4NDIsIDB4NmExODI2LCAweDYwNDAyMSwKLTB4MjRjNjAwMDEsIDB4MmNjMjAwMDgsIDB4MTQ0MGZmZjcsIDB4NzM4NDIsCi0weDI1MjkwMDAxLCAweDEyNTEwMmIsIDB4MTQ0MGZmZjAsIDB4MCwKLTB4MTAwMTAyMSwgMHgzZTAwMDA4LCAweDI3YmQwMDA4LCAweDI3YmRmZmU4LAotMHgyNzY0MjgwMCwgMHhhZmJmMDAxMCwgMHhjMDAyNDg4LCAweDI0MDUxMDAwLAotMHgyNDAyMDAyMSwgMHhhZjgwMDEwMCwgMHhhZjgwMDEwNCwgMHhhZjgwMDEwOCwKLTB4YWY4MDAxMTAsIDB4YWY4MDAxMTQsIDB4YWY4MDAxMTgsIDB4YWY4MDAxMjAsCi0weGFmODAwMTI0LCAweGFmODAwMTI4LCAweGFmODAwMTMwLCAweGFmODAwMTM0LAotMHhhZjgwMDEzOCwgMHhhZWUwNGUyOCwgMHhhZWUwNGUyYywgMHhhZWUwNGUzMCwKLTB4YWVlMDRlMzQsIDB4YWY4MjAxMWMsIDB4OGY0MjAyMTgsIDB4MzA0MjAwNDAsCi0weDEwNDAwMDA0LCAweDAsIDB4OGY4MjAxMWMsIDB4MzQ0MjAwMDQsCi0weGFmODIwMTFjLCAweDhmYmYwMDEwLCAweDNlMDAwMDgsIDB4MjdiZDAwMTgsCi0weDI3YmRmZmUwLCAweGFmYmYwMDE4LCAweDhmODIwMTA0LCAweGFmYTIwMDEwLAotMHg4ZjgyMDEwMCwgMHgzYzA1MDAwMiwgMHhhZmEyMDAxNCwgMHg4Zjg2MDBiMCwKLTB4OGY4NzAxMWMsIDB4M2MwNDAwMDEsIDB4MjQ4NDU0YzAsIDB4YzAwMjQwMywKLTB4MzRhNWYwMDAsIDB4OGY4MzAwYjAsIDB4M2MwMjdmMDAsIDB4NjIxODI0LAotMHgzYzAyMDQwMCwgMHgxMDYyMDAyOSwgMHg0MzEwMmIsIDB4MTQ0MDAwMDgsCi0weDNjMDIyMDAwLCAweDNjMDIwMTAwLCAweDEwNjIwMDI0LCAweDNjMDIwMjAwLAotMHgxMDYyMDAxMSwgMHgwLCAweDgwMDIzNzQsIDB4MCwKLTB4MTA2MjAwMDgsIDB4M2MwMjQwMDAsIDB4MTQ2MjAwMWMsIDB4MCwKLTB4OGVlMjAxOTAsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxOTAsIDB4ODAwMjM3NCwKLTB4OGVlMjAxOTAsIDB4OGVlMjAxOGMsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxOGMsCi0weDgwMDIzNzQsIDB4OGVlMjAxOGMsIDB4OGY4MjAxMWMsIDB4MzQ0MjAwMDIsCi0weGFmODIwMTFjLCAweDhmODMwMTA0LCAweDhmODIwMGIwLCAweDM0NDIwMDAxLAotMHhhZjgyMDBiMCwgMHhhZjgzMDEwNCwgMHg4ZjgyMDExYywgMHgyNDAzZmZmZCwKLTB4NDMxMDI0LCAweGFmODIwMTFjLCAweDhlZTIwMWEwLCAweDI0NDIwMDAxLAotMHhhZWUyMDFhMCwgMHg4MDAyMzc3LCAweDhlZTIwMWEwLCAweDhmODIwMGIwLAotMHgzNDQyMDAwMSwgMHhhZjgyMDBiMCwgMHg4ZmJmMDAxOCwgMHgzZTAwMDA4LAotMHgyN2JkMDAyMCwgMHgyN2JkZmZlMCwgMHhhZmJmMDAxYywgMHhhZmIwMDAxOCwKLTB4OGY4MjAxMjAsIDB4YWZhMjAwMTAsIDB4OGY4MjAxMjQsIDB4M2MwNTAwMDEsCi0weGFmYTIwMDE0LCAweDhmODYwMGEwLCAweDhmODcwMTFjLCAweDNjMDQwMDAxLAotMHgyNDg0NTRjYywgMHhjMDAyNDAzLCAweDM0YTVmMDAwLCAweDhmODMwMGEwLAotMHgzYzAyN2YwMCwgMHg2MjE4MjQsIDB4M2MwMjA0MDAsIDB4MTA2MjAwNTMsCi0weDgwMjEsIDB4NDMxMDJiLCAweDE0NDAwMDA4LCAweDNjMDQyMDAwLAotMHgzYzAyMDEwMCwgMHgxMDYyMDA0ZCwgMHgzYzAyMDIwMCwgMHgxMDYyMDAzYSwKLTB4MCwgMHg4MDAyM2UwLCAweDAsIDB4MTA2NDAwMDMsCi0weDNjMDI0MDAwLCAweDE0NjIwMDQ1LCAweDAsIDB4OGY4MjAwYTAsCi0weDQ0MTAyNCwgMHgxMDQwMDAwNiwgMHgwLCAweDhlZTIwMTk0LAotMHgyNDQyMDAwMSwgMHhhZWUyMDE5NCwgMHg4MDAyM2E5LCAweDhlZTIwMTk0LAotMHg4ZWUyMDE5OCwgMHgyNDQyMDAwMSwgMHhhZWUyMDE5OCwgMHg4ZWUyMDE5OCwKLTB4OGY4MjAxMWMsIDB4MzQ0MjAwMDIsIDB4YWY4MjAxMWMsIDB4OGY4MjAxMWMsCi0weDMwNDIwMjAwLCAweDEwNDAwMDFiLCAweDAsIDB4OGY4MzAwYTAsCi0weDhmODQwMTI0LCAweDhmODIwMGFjLCAweDE0NDAwMDA3LCAweDI0MDIwMDAxLAotMHgzYzAyMDAwMSwgMHgzNDQyZjAwMCwgMHg2MjEwMjQsIDB4NTA0MDAwMDEsCi0weDI0MTAwMDAxLCAweDI0MDIwMDAxLCAweDEyMDAwMDBkLCAweGFmODIwMGEwLAotMHg4ZjgyMDEyNCwgMHgyNDQyZmZlMCwgMHhhZjgyMDEyNCwgMHg4ZjgyMDEyNCwKLTB4OGY4MjAxMjQsIDB4Mjc2MzMwMDAsIDB4NDMxMDJiLCAweDEwNDAwMDA1LAotMHgyNzYyMzdlMCwgMHhhZjgyMDEyNCwgMHg4MDAyM2NhLCAweDAsCi0weGFmODQwMTI0LCAweDhmODIwMTFjLCAweDI0MDNmZmZkLCAweDQzMTAyNCwKLTB4ODAwMjNlMywgMHhhZjgyMDExYywgMHg4ZjgyMDExYywgMHgzNDQyMDAwMiwKLTB4YWY4MjAxMWMsIDB4OGY4MzAxMjQsIDB4OGY4MjAwYTAsIDB4MzQ0MjAwMDEsCi0weGFmODIwMGEwLCAweGFmODMwMTI0LCAweDhmODIwMTFjLCAweDI0MDNmZmZkLAotMHg0MzEwMjQsIDB4YWY4MjAxMWMsIDB4OGVlMjAxOWMsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMTljLCAweDgwMDIzZTMsIDB4OGVlMjAxOWMsIDB4OGY4MjAwYTAsCi0weDM0NDIwMDAxLCAweGFmODIwMGEwLCAweDhmYmYwMDFjLCAweDhmYjAwMDE4LAotMHgzZTAwMDA4LCAweDI3YmQwMDIwLCAweDAsIDB4M2MwMjAwMDEsCi0weDhjNDI1YzU4LCAweDI3YmRmZmU4LCAweGFmYmYwMDE0LCAweDE0NDAwMDEyLAotMHhhZmIwMDAxMCwgMHgzYzEwMDAwMSwgMHgyNjEwNWRkMCwgMHgyMDAyMDIxLAotMHhjMDAyNDg4LCAweDI0MDUyMDAwLCAweDI2MDIxZmUwLCAweDNjMDEwMDAxLAotMHhhYzIyNWQ5NCwgMHgzYzAxMDAwMSwgMHhhYzIyNWQ5MCwgMHhhZjQyMDI1MCwKLTB4MjQwMjIwMDAsIDB4YWY1MDAyNTQsIDB4YWY0MjAyNTgsIDB4MjQwMjAwMDEsCi0weDNjMDEwMDAxLCAweGFjMjI1YzU4LCAweDhmYmYwMDE0LCAweDhmYjAwMDEwLAotMHgzZTAwMDA4LCAweDI3YmQwMDE4LCAweDNjMDMwMDAxLCAweDhjNjM1ZDk0LAotMHg4YzgyMDAwMCwgMHg4ZmE4MDAxMCwgMHg4ZmE5MDAxNCwgMHhhYzYyMDAwMCwKLTB4M2MwMjAwMDEsIDB4OGM0MjVkOTQsIDB4OGM4MzAwMDQsIDB4YWM0MzAwMDQsCi0weGFjNDUwMDA4LCAweDhmODQwMDU0LCAweDI0NDNmZmUwLCAweGFjNDYwMDEwLAotMHhhYzQ3MDAxNCwgMHhhYzQ4MDAxOCwgMHhhYzQ5MDAxYywgMHgzYzAxMDAwMSwKLTB4YWMyMzVkOTQsIDB4YWM0NDAwMGMsIDB4M2MwMjAwMDEsIDB4MjQ0MjVkZDAsCi0weDYyMTgyYiwgMHgxMDYwMDAwNSwgMHgwLCAweDNjMDIwMDAxLAotMHg4YzQyNWQ5MCwgMHgzYzAxMDAwMSwgMHhhYzIyNWQ5NCwgMHgzYzAzMDAwMSwKLTB4OGM2MzVkOTQsIDB4M2MwMjAwMDEsIDB4OGM0MjVjNDAsIDB4YWM2MjAwMDAsCi0weDNjMDMwMDAxLCAweDhjNjM1ZDk0LCAweDNjMDIwMDAxLCAweDhjNDI1YzQwLAotMHhhYzYyMDAwNCwgMHgzZTAwMDA4LCAweGFmNDMwMjUwLCAweDNjMDMwMDAxLAotMHg4YzYzNWQ5NCwgMHgzYzAyMDAwMSwgMHg4YzQyNWM0MCwgMHgyN2JkZmZkMCwKLTB4YWZiNDAwMjAsIDB4OGZiNDAwNDAsIDB4YWZiMDAwMTAsIDB4ODA4MDIxLAotMHhhZmI1MDAyNCwgMHg4ZmI1MDA0NCwgMHg4ZmE0MDA0OCwgMHhhZmIxMDAxNCwKLTB4YTA4ODIxLCAweGFmYmYwMDI4LCAweGFmYjMwMDFjLCAweGFmYjIwMDE4LAotMHhhYzYyMDAwMCwgMHgzYzA1MDAwMSwgMHg4Y2E1NWQ5NCwgMHgzYzAyMDAwMSwKLTB4OGM0MjVjNDAsIDB4YzA5MDIxLCAweGUwOTgyMSwgMHgxMDgwMDAwNiwKLTB4YWNhMjAwMDQsIDB4MjRhNTAwMDgsIDB4YzAwMjQ5MCwgMHgyNDA2MDAxOCwKLTB4ODAwMjQ0ZSwgMHgwLCAweDI0YTQwMDA4LCAweGMwMDI0ODgsCi0weDI0MDUwMDE4LCAweDNjMDIwMDAxLCAweDhjNDI1ZDk0LCAweDNjMDUwMDAxLAotMHgyNGE1NWRkMCwgMHgyNDQyZmZlMCwgMHgzYzAxMDAwMSwgMHhhYzIyNWQ5NCwKLTB4NDUxMDJiLCAweDEwNDAwMDA1LCAweDAsIDB4M2MwMjAwMDEsCi0weDhjNDI1ZDkwLCAweDNjMDEwMDAxLCAweGFjMjI1ZDk0LCAweDNjMDMwMDAxLAotMHg4YzYzNWQ5NCwgMHg4ZTAyMDAwMCwgMHhhYzYyMDAwMCwgMHgzYzAzMDAwMSwKLTB4OGM2MzVkOTQsIDB4OGUwMjAwMDQsIDB4YWM2MjAwMDQsIDB4YWM3MTAwMDgsCi0weDhmODQwMDU0LCAweDI0NjJmZmUwLCAweDNjMDEwMDAxLCAweGFjMjI1ZDk0LAotMHg0NTEwMmIsIDB4YWM3MjAwMTAsIDB4YWM3MzAwMTQsIDB4YWM3NDAwMTgsCi0weGFjNzUwMDFjLCAweDEwNDAwMDA1LCAweGFjNjQwMDBjLCAweDNjMDIwMDAxLAotMHg4YzQyNWQ5MCwgMHgzYzAxMDAwMSwgMHhhYzIyNWQ5NCwgMHgzYzAzMDAwMSwKLTB4OGM2MzVkOTQsIDB4M2MwMjAwMDEsIDB4OGM0MjVjNDAsIDB4YWM2MjAwMDAsCi0weDNjMDMwMDAxLCAweDhjNjM1ZDk0LCAweDNjMDIwMDAxLCAweDhjNDI1YzQwLAotMHhhYzYyMDAwNCwgMHhhZjQzMDI1MCwgMHg4ZmJmMDAyOCwgMHg4ZmI1MDAyNCwKLTB4OGZiNDAwMjAsIDB4OGZiMzAwMWMsIDB4OGZiMjAwMTgsIDB4OGZiMTAwMTQsCi0weDhmYjAwMDEwLCAweDNlMDAwMDgsIDB4MjdiZDAwMzAsIDB4MTBhMDAwMDUsCi0weDAsIDB4YWM4MDAwMDAsIDB4MjRhNWZmZmMsIDB4MTRhMGZmZmQsCi0weDI0ODQwMDA0LCAweDNlMDAwMDgsIDB4MCwgMHgxMGMwMDAwNywKLTB4MCwgMHg4YzgyMDAwMCwgMHgyNDg0MDAwNCwgMHgyNGM2ZmZmYywKLTB4YWNhMjAwMDAsIDB4MTRjMGZmZmIsIDB4MjRhNTAwMDQsIDB4M2UwMDAwOCwKLTB4MCwgMHgxMGMwMDAwNywgMHgwLCAweDhjYTIwMDAwLAotMHgyNGE1MDAwNCwgMHgyNGM2ZmZmYywgMHhhYzgyMDAwMCwgMHgxNGMwZmZmYiwKLTB4MjQ4NDAwMDQsIDB4M2UwMDAwOCwgMHgwLCAweDNlMDAwMDgsCi0weDAsIDB4MjdiZGZmZDgsIDB4YWZiZjAwMjAsIDB4OGVlMzA0ZTQsCi0weDhlZTIwNGUwLCAweDEwNjIwNDM2LCAweDAsIDB4OGVlMjA0ZTQsCi0weDhlZTMwNGZjLCAweDIxMTAwLCAweDYyNjAyMSwgMHg5NTg3MDAwOCwKLTB4OGQ4YTAwMDAsIDB4OGQ4YjAwMDQsIDB4OTU4ZDAwMGEsIDB4OGVlMjcyNWMsCi0weDhlZTM3MjZjLCAweDMwZTRmZmZmLCAweDQ0MTAyMSwgMHg2MjE4MmIsCi0weDEwNjAwMDE1LCAweDMxYTIwMDA0LCAweDhmODIwMGQ4LCAweDhlZTM3MjU4LAotMHg0MzEwMjMsIDB4YWVlMjcyNmMsIDB4OGVlMjcyNmMsIDB4MWM0MDAwMDMsCi0weDNjMDMwMDAxLCAweDQzMTAyMSwgMHhhZWUyNzI2YywgMHg4ZWUyNzI1YywKLTB4OGVlMzcyNmMsIDB4NDQxMDIxLCAweDYyMTgyYiwgMHgxMDYwMDAwNiwKLTB4MzFhMjAwMDQsIDB4OGVlMjAxYjgsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYjgsCi0weDgwMDI4ZTEsIDB4OGVlMjAxYjgsIDB4MTA0MDAyNDAsIDB4MzFhMjAyMDAsCi0weDEwNDAwMTRkLCAweDQ4MjEsIDB4OTZlMjA0NWEsIDB4MzA0MjAwMTAsCi0weDEwNDAwMTQ5LCAweDAsIDB4OGY4NDAxMDAsIDB4Mjc2MjMwMDAsCi0weDI0ODUwMDIwLCAweGEyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY1MjgwMCwKLTB4OGY4MjAxMDgsIDB4MTBhMjAwMDQsIDB4MCwgMHg4ZjgyMDEwNCwKLTB4MTRhMjAwMDYsIDB4MjQwMjAwMGMsIDB4OGVlMjAxYTgsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMWE4LCAweDgwMDI1MmMsIDB4OGVlMjAxYTgsIDB4YWM4YTAwMDAsCi0weGFjOGIwMDA0LCAweDhlZTM3MjY0LCAweDI0MDYwMDA1LCAweGE0ODIwMDBlLAotMHhhYzg2MDAxOCwgMHhhYzgzMDAwOCwgMHg4ZWUyMDRlNCwgMHhhYzgyMDAxYywKLTB4OGVlMjA0YzgsIDB4YWM4MjAwMTAsIDB4YWY4NTAxMDAsIDB4OTJlMjA0ZWMsCi0weDE0NDAwMDM2LCAweDI0MDkwMDAxLCAweDhlZTI0ZTI4LCAweDIxMGMwLAotMHgyNDQyNGUzOCwgMHgyZTIyMDIxLCAweDhjODIwMDAwLCAweDE0NDYwMDFmLAotMHgwLCAweDhlZTM0ZTI4LCAweDhlZTI0ZTJjLCAweDEwNjIwMDFiLAotMHgyNDAzMDA0MCwgMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwKLTB4OGVlMjRlMmMsIDB4OGVlNTRlMjgsIDB4MjQ0MjAwMDEsIDB4MTA0MzAwMDcsCi0weDAsIDB4OGVlMjRlMmMsIDB4MjQ0MjAwMDEsIDB4MTBhMjAwMDUsCi0weDAsIDB4ODAwMjUxNiwgMHgwLCAweDE0YTAwMDA1LAotMHgwLCAweDhmODIwMTA4LCAweDI0NDIwMDIwLCAweGFmODIwMTA4LAotMHg4ZjgyMDEwOCwgMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMywKLTB4YWM4MDAwMDAsIDB4ODAwMjUyYywgMHgwLCAweDhlZTI0ZTI4LAotMHgyNDAzMDA0MCwgMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywgMHgxMDIxLAotMHg4ZWUyNGUyOCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUyOCwgMHg4ZWUyNGUyOCwKLTB4MjEwYzAsIDB4MjQ0MjRlMzgsIDB4MmUyMjAyMSwgMHgyNDAyMDAwNSwKLTB4YWM4MjAwMDAsIDB4MjQwMjAwMDEsIDB4YWM4MjAwMDQsIDB4MTUyMDAwMGEsCi0weDNjMDQwMDAxLCAweGFmYWIwMDEwLCAweDhlZTI3MjY0LCAweDNjMDQwMDAxLAotMHgyNDg0NTczMCwgMHgzYzA1MDAwNCwgMHhhZmEyMDAxNCwgMHg4ZWU2MDRlNCwKLTB4ODAwMjhiZSwgMHgzNGE1ZjExNCwgMHg4ZWUyNzI2NCwgMHgzNDg0MzgwMCwKLTB4MzY0MTgyMSwgMHgyNDQyMDAxMCwgMHg0MzEwMmIsIDB4MTQ0MDAwNzMsCi0weDAsIDB4OGVlMjcyNjQsIDB4MjQ0ODAwMTAsIDB4MzY0MTAyMSwKLTB4MTAyMTAyYiwgMHgxNDQwMDAwMiwgMHgzYzAyZmZmZiwgMHgxMDI0MDIxLAotMHg4Zjg1MDEwMCwgMHgyNzYyMzAwMCwgMHgyNGE2MDAyMCwgMHhjMjEwMmIsCi0weDUwNDAwMDAxLCAweDI3NjYyODAwLCAweDhmODIwMTA4LCAweDEwYzIwMDA0LAotMHgwLCAweDhmODIwMTA0LCAweDE0YzIwMDA3LCAweDI1NjMwMDBjLAotMHg4ZWUyMDFhOCwgMHg0ODIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWE4LAotMHg4MDAyNWEwLCAweDhlZTIwMWE4LCAweDJjNjQwMDBjLCAweDE0NDEwMjEsCi0weGFjYTIwMDAwLCAweGFjYTMwMDA0LCAweDI0ZTJmZmY0LCAweGE0YTIwMDBlLAotMHgyNDAyMDAwNiwgMHhhY2E4MDAwOCwgMHhhY2EyMDAxOCwgMHg4ZWUyMDRlNCwKLTB4YWNhMjAwMWMsIDB4OGVlMjA0YzgsIDB4M2MwMzAwMDIsIDB4NDMxMDI1LAotMHhhY2EyMDAxMCwgMHhhZjg2MDEwMCwgMHg5MmUyMDRlYywgMHgxNDQwMDAzNywKLTB4MjQwOTAwMDEsIDB4OGVlMjRlMjgsIDB4MjEwYzAsIDB4MjQ0MjRlMzgsCi0weDJlMjIwMjEsIDB4OGM4MzAwMDAsIDB4MjQwMjAwMDUsIDB4MTQ2MjAwMWYsCi0weDAsIDB4OGVlMzRlMjgsIDB4OGVlMjRlMmMsIDB4MTA2MjAwMWIsCi0weDI0MDMwMDQwLCAweDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LAotMHg4ZWUyNGUyYywgMHg4ZWU1NGUyOCwgMHgyNDQyMDAwMSwgMHgxMDQzMDAwNywKLTB4MCwgMHg4ZWUyNGUyYywgMHgyNDQyMDAwMSwgMHgxMGEyMDAwNSwKLTB4MCwgMHg4MDAyNThhLCAweDAsIDB4MTRhMDAwMDUsCi0weDAsIDB4OGY4MjAxMDgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMDgsCi0weDhmODIwMTA4LCAweDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEzLAotMHhhYzgwMDAwMCwgMHg4MDAyNWEwLCAweDAsIDB4OGVlMjRlMjgsCi0weDI0MDMwMDQwLCAweDI0NDIwMDAxLCAweDUwNDMwMDAzLCAweDEwMjEsCi0weDhlZTI0ZTI4LCAweDI0NDIwMDAxLCAweGFlZTI0ZTI4LCAweDhlZTI0ZTI4LAotMHgyMTBjMCwgMHgyNDQyNGUzOCwgMHgyZTIyMDIxLCAweDI0MDIwMDA1LAotMHhhYzgyMDAwMCwgMHgyNDAyMDAwMSwgMHhhYzgyMDAwNCwgMHgxNTIwMDAwYSwKLTB4MjUwOGZmZmMsIDB4YWZhYjAwMTAsIDB4OGVlMjcyNjQsIDB4M2MwNDAwMDEsCi0weDI0ODQ1NzMwLCAweDNjMDUwMDA0LCAweGFmYTIwMDE0LCAweDhlZTYwNGU0LAotMHg4MDAyOGJlLCAweDM0YTVmMTI1LCAweDM0MDI4MTAwLCAweGE1MDIwMDAwLAotMHg5NTgyMDAwZSwgMHg4MDAyNjFkLCAweGE1MDIwMDAyLCAweDhmODUwMTAwLAotMHgyNzYyMzAwMCwgMHgyNGE2MDAyMCwgMHhjMjEwMmIsIDB4NTA0MDAwMDEsCi0weDI3NjYyODAwLCAweDhmODIwMTA4LCAweDEwYzIwMDA0LCAweDAsCi0weDhmODIwMTA0LCAweDE0YzIwMDA3LCAweDI1NjMwMDBjLCAweDhlZTIwMWE4LAotMHg0ODIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWE4LCAweDgwMDI2MGQsCi0weDhlZTIwMWE4LCAweDJjNjQwMDBjLCAweDE0NDEwMjEsIDB4YWNhMjAwMDAsCi0weGFjYTMwMDA0LCAweDhlZTM3MjY0LCAweDI0ZTJmZmY0LCAweGE0YTIwMDBlLAotMHgyNDAyMDAwNiwgMHhhY2EyMDAxOCwgMHgyNDYzMDAxMCwgMHhhY2EzMDAwOCwKLTB4OGVlMjA0ZTQsIDB4YWNhMjAwMWMsIDB4OGVlMjA0YzgsIDB4M2MwMzAwMDIsCi0weDQzMTAyNSwgMHhhY2EyMDAxMCwgMHhhZjg2MDEwMCwgMHg5MmUyMDRlYywKLTB4MTQ0MDAwMzcsIDB4MjQwOTAwMDEsIDB4OGVlMjRlMjgsIDB4MjEwYzAsCi0weDI0NDI0ZTM4LCAweDJlMjIwMjEsIDB4OGM4MzAwMDAsIDB4MjQwMjAwMDUsCi0weDE0NjIwMDFmLCAweDAsIDB4OGVlMzRlMjgsIDB4OGVlMjRlMmMsCi0weDEwNjIwMDFiLCAweDI0MDMwMDQwLCAweDhjODIwMDA0LCAweDI0NDIwMDAxLAotMHhhYzgyMDAwNCwgMHg4ZWUyNGUyYywgMHg4ZWU1NGUyOCwgMHgyNDQyMDAwMSwKLTB4MTA0MzAwMDcsIDB4MCwgMHg4ZWUyNGUyYywgMHgyNDQyMDAwMSwKLTB4MTBhMjAwMDUsIDB4MCwgMHg4MDAyNWY3LCAweDAsCi0weDE0YTAwMDA1LCAweDAsIDB4OGY4MjAxMDgsIDB4MjQ0MjAwMjAsCi0weGFmODIwMTA4LCAweDhmODIwMTA4LCAweDhjODIwMDA0LCAweDJjNDIwMDExLAotMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwgMHg4MDAyNjBkLCAweDAsCi0weDhlZTI0ZTI4LCAweDI0MDMwMDQwLCAweDI0NDIwMDAxLCAweDUwNDMwMDAzLAotMHgxMDIxLCAweDhlZTI0ZTI4LCAweDI0NDIwMDAxLCAweGFlZTI0ZTI4LAotMHg4ZWUyNGUyOCwgMHgyMTBjMCwgMHgyNDQyNGUzOCwgMHgyZTIyMDIxLAotMHgyNDAyMDAwNSwgMHhhYzgyMDAwMCwgMHgyNDAyMDAwMSwgMHhhYzgyMDAwNCwKLTB4MTUyMDAwMGEsIDB4MzQwMjgxMDAsIDB4YWZhYjAwMTAsIDB4OGVlMjcyNjQsCi0weDNjMDQwMDAxLCAweDI0ODQ1NzMwLCAweDNjMDUwMDA0LCAweGFmYTIwMDE0LAotMHg4ZWU2MDRlNCwgMHg4MDAyOGJlLCAweDM0YTVmMDE1LCAweDhlZTM3MjY0LAotMHhhNDYyMDAwYywgMHg4ZWUzNzI2NCwgMHg5NTgyMDAwZSwgMHhhNDYyMDAwZSwKLTB4ODAwMjY4MSwgMHgyNGU3MDAwNCwgMHg4Zjg0MDEwMCwgMHgyNzYyMzAwMCwKLTB4MjQ4NTAwMjAsIDB4YTIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjUyODAwLAotMHg4ZjgyMDEwOCwgMHgxMGEyMDAwNCwgMHgwLCAweDhmODIwMTA0LAotMHgxNGEyMDAwNywgMHgyNDAyMDAwNiwgMHg4ZWUyMDFhOCwgMHg0ODIxLAotMHgyNDQyMDAwMSwgMHhhZWUyMDFhOCwgMHg4MDAyNjc3LCAweDhlZTIwMWE4LAotMHhhYzhhMDAwMCwgMHhhYzhiMDAwNCwgMHg4ZWUzNzI2NCwgMHhhNDg3MDAwZSwKLTB4YWM4MjAwMTgsIDB4YWM4MzAwMDgsIDB4OGVlMjA0ZTQsIDB4YWM4MjAwMWMsCi0weDhlZTIwNGM4LCAweDNjMDMwMDAyLCAweDQzMTAyNSwgMHhhYzgyMDAxMCwKLTB4YWY4NTAxMDAsIDB4OTJlMjA0ZWMsIDB4MTQ0MDAwMzcsIDB4MjQwOTAwMDEsCi0weDhlZTI0ZTI4LCAweDIxMGMwLCAweDI0NDI0ZTM4LCAweDJlMjIwMjEsCi0weDhjODMwMDAwLCAweDI0MDIwMDA1LCAweDE0NjIwMDFmLCAweDAsCi0weDhlZTM0ZTI4LCAweDhlZTI0ZTJjLCAweDEwNjIwMDFiLCAweDI0MDMwMDQwLAotMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUyYywKLTB4OGVlNTRlMjgsIDB4MjQ0MjAwMDEsIDB4MTA0MzAwMDcsIDB4MCwKLTB4OGVlMjRlMmMsIDB4MjQ0MjAwMDEsIDB4MTBhMjAwMDUsIDB4MCwKLTB4ODAwMjY2MSwgMHgwLCAweDE0YTAwMDA1LCAweDAsCi0weDhmODIwMTA4LCAweDI0NDIwMDIwLCAweGFmODIwMTA4LCAweDhmODIwMTA4LAotMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwKLTB4ODAwMjY3NywgMHgwLCAweDhlZTI0ZTI4LCAweDI0MDMwMDQwLAotMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywgMHgxMDIxLCAweDhlZTI0ZTI4LAotMHgyNDQyMDAwMSwgMHhhZWUyNGUyOCwgMHg4ZWUyNGUyOCwgMHgyMTBjMCwKLTB4MjQ0MjRlMzgsIDB4MmUyMjAyMSwgMHgyNDAyMDAwNSwgMHhhYzgyMDAwMCwKLTB4MjQwMjAwMDEsIDB4YWM4MjAwMDQsIDB4MTUyMDAwMDksIDB4M2MwNTAwMDQsCi0weGFmYWIwMDEwLCAweDhlZTI3MjY0LCAweDNjMDQwMDAxLCAweDI0ODQ1NzMwLAotMHhhZmEyMDAxNCwgMHg4ZWU2MDRlNCwgMHg4MDAyOGJlLCAweDM0YTVmMDA0LAotMHg4ZWUyNzI1YywgMHgzMGU3ZmZmZiwgMHg0NzEwMjEsIDB4YWVlMjcyNWMsCi0weDhlZTIwNGU0LCAweDhlZTMwNGZjLCAweDhlZTQ3MjU4LCAweDIxMTAwLAotMHg0MzEwMjEsIDB4YWM0NDAwMGMsIDB4OGVlMjcyNTgsIDB4YWZhMjAwMTgsCi0weDhlZTM3MjVjLCAweGFmYTMwMDFjLCAweDhlZTI3MjVjLCAweDJjNDIwMDNjLAotMHgxMDQwMDAwNCwgMHgyNDYyMDAwMSwgMHgyNDAzZmZmZSwgMHg0MzEwMjQsCi0weGFmYTIwMDFjLCAweDhlZTI3MjY0LCAweDNjMDYwMDAxLCAweDM0YzYzODAwLAotMHg4ZWUzNzI1YywgMHgyNDA1ZmZmOCwgMHg0NzEwMjEsIDB4MjQ0MjAwMDcsCi0weDQ1MTAyNCwgMHgyNDYzMDAwNywgMHhhZWUyNzI1OCwgMHg4ZWUyNzI2YywKLTB4OGVlNDcyNTgsIDB4NjUxODI0LCAweDQzMTAyMywgMHhhZWUyNzI2YywKLTB4MzY2MTAyMSwgMHg4MjIwMmIsIDB4MTQ4MDAwMDQsIDB4M2MwM2ZmZmYsCi0weDhlZTI3MjU4LCAweDQzMTAyMSwgMHhhZWUyNzI1OCwgMHg4ZWUyNzI1OCwKLTB4YWVlMjcyNjQsIDB4OGY4MjAwZjAsIDB4MjQ0NzAwMDgsIDB4Mjc2MjE4MDAsCi0weGUyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY3MTAwMCwgMHg4ZjgyMDBmNCwKLTB4MTRlMjAwMDcsIDB4MCwgMHg4ZWUyMDFiNCwgMHg0ODIxLAotMHgyNDQyMDAwMSwgMHhhZWUyMDFiNCwgMHg4MDAyNmM0LCAweDhlZTIwMWI0LAotMHg4ZjgyMDBmMCwgMHgyNDA5MDAwMSwgMHg4ZmEzMDAxOCwgMHg4ZmE0MDAxYywKLTB4YWM0MzAwMDAsIDB4YWM0NDAwMDQsIDB4YWY4NzAwZjAsIDB4MTUyMDAwMTIsCi0weGQxMTQyLCAweDhmODIwMGYwLCAweGFmYTIwMDEwLCAweDhmODIwMGY0LAotMHgzYzA0MDAwMSwgMHgyNDg0NTczYywgMHhhZmEyMDAxNCwgMHg4ZmE2MDAxOCwKLTB4OGZhNzAwMWMsIDB4M2MwNTAwMDQsIDB4YzAwMjQwMywgMHgzNGE1ZjAwNSwKLTB4OGVlMjAwODgsIDB4MjQ0MjAwMDEsIDB4YWVlMjAwODgsIDB4OGVlMjAwODgsCi0weDgwMDI4ZDMsIDB4YWVlMDcyNWMsIDB4MzA0MzAwMDMsIDB4MjQwMjAwMDIsCi0weDEwNjIwMDE2LCAweDI4NjIwMDAzLCAweDEwNDAwMDA1LCAweDI0MDIwMDAxLAotMHgxMDYyMDAwOCwgMHgwLCAweDgwMDI3MDMsIDB4MCwKLTB4MjQwMjAwMDMsIDB4MTA2MjAwMTcsIDB4MCwgMHg4MDAyNzAzLAotMHgwLCAweDhlZTIwMGU4LCAweDhlZTMwMGVjLCAweDI0NjMwMDAxLAotMHgyYzY0MDAwMSwgMHg0NDEwMjEsIDB4YWVlMjAwZTgsIDB4YWVlMzAwZWMsCi0weDhlZTIwMGU4LCAweDgwMDI3MDMsIDB4OGVlMzAwZWMsIDB4OGVlMjAwZjAsCi0weDhlZTMwMGY0LCAweDI0NjMwMDAxLCAweDJjNjQwMDAxLCAweDQ0MTAyMSwKLTB4YWVlMjAwZjAsIDB4YWVlMzAwZjQsIDB4OGVlMjAwZjAsIDB4ODAwMjcwMywKLTB4OGVlMzAwZjQsIDB4OGVlMjAwZjgsIDB4OGVlMzAwZmMsIDB4MjQ2MzAwMDEsCi0weDJjNjQwMDAxLCAweDQ0MTAyMSwgMHhhZWUyMDBmOCwgMHhhZWUzMDBmYywKLTB4OGVlMjAwZjgsIDB4OGVlMzAwZmMsIDB4OGVlMjcyNWMsIDB4OGVlNDAwZTAsCi0weDhlZTUwMGU0LCAweDQwMTgyMSwgMHgxMDIxLCAweGEzMjgyMSwKLTB4YTMzMDJiLCAweDgyMjAyMSwgMHg4NjIwMjEsIDB4YWVlNDAwZTAsCi0weGFlZTUwMGU0LCAweDgwMDI4ZDMsIDB4YWVlMDcyNWMsIDB4MzBlMmZmZmYsCi0weDEwNDAwMWMxLCAweDMxYTIwMjAwLCAweDEwNDAwMTRkLCAweDQ4MjEsCi0weDk2ZTIwNDVhLCAweDMwNDIwMDEwLCAweDEwNDAwMTQ5LCAweDAsCi0weDhmODQwMTAwLCAweDI3NjIzMDAwLCAweDI0ODUwMDIwLCAweGEyMTAyYiwKLTB4NTA0MDAwMDEsIDB4Mjc2NTI4MDAsIDB4OGY4MjAxMDgsIDB4MTBhMjAwMDQsCi0weDAsIDB4OGY4MjAxMDQsIDB4MTRhMjAwMDYsIDB4MjQwMjAwMGMsCi0weDhlZTIwMWE4LCAweDI0NDIwMDAxLCAweGFlZTIwMWE4LCAweDgwMDI3NmUsCi0weDhlZTIwMWE4LCAweGFjOGEwMDAwLCAweGFjOGIwMDA0LCAweDhlZTM3MjY0LAotMHgyNDA2MDAwNSwgMHhhNDgyMDAwZSwgMHhhYzg2MDAxOCwgMHhhYzgzMDAwOCwKLTB4OGVlMjA0ZTQsIDB4YWM4MjAwMWMsIDB4OGVlMjA0YzgsIDB4YWM4MjAwMTAsCi0weGFmODUwMTAwLCAweDkyZTIwNGVjLCAweDE0NDAwMDM2LCAweDI0MDkwMDAxLAotMHg4ZWUyNGUyOCwgMHgyMTBjMCwgMHgyNDQyNGUzOCwgMHgyZTIyMDIxLAotMHg4YzgyMDAwMCwgMHgxNDQ2MDAxZiwgMHgwLCAweDhlZTM0ZTI4LAotMHg4ZWUyNGUyYywgMHgxMDYyMDAxYiwgMHgyNDAzMDA0MCwgMHg4YzgyMDAwNCwKLTB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMmMsIDB4OGVlNTRlMjgsCi0weDI0NDIwMDAxLCAweDEwNDMwMDA3LCAweDAsIDB4OGVlMjRlMmMsCi0weDI0NDIwMDAxLCAweDEwYTIwMDA1LCAweDAsIDB4ODAwMjc1OCwKLTB4MCwgMHgxNGEwMDAwNSwgMHgwLCAweDhmODIwMTA4LAotMHgyNDQyMDAyMCwgMHhhZjgyMDEwOCwgMHg4ZjgyMDEwOCwgMHg4YzgyMDAwNCwKLTB4MmM0MjAwMTEsIDB4NTA0MDAwMTMsIDB4YWM4MDAwMDAsIDB4ODAwMjc2ZSwKLTB4MCwgMHg4ZWUyNGUyOCwgMHgyNDAzMDA0MCwgMHgyNDQyMDAwMSwKLTB4NTA0MzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUyOCwgMHgyNDQyMDAwMSwKLTB4YWVlMjRlMjgsIDB4OGVlMjRlMjgsIDB4MjEwYzAsIDB4MjQ0MjRlMzgsCi0weDJlMjIwMjEsIDB4MjQwMjAwMDUsIDB4YWM4MjAwMDAsIDB4MjQwMjAwMDEsCi0weGFjODIwMDA0LCAweDE1MjAwMDBhLCAweDNjMDQwMDAxLCAweGFmYWIwMDEwLAotMHg4ZWUyNzI2NCwgMHgzYzA0MDAwMSwgMHgyNDg0NTczMCwgMHgzYzA1MDAwNCwKLTB4YWZhMjAwMTQsIDB4OGVlNjA0ZTQsIDB4ODAwMjhiZSwgMHgzNGE1ZjAxNCwKLTB4OGVlMjcyNjQsIDB4MzQ4NDM4MDAsIDB4MzY0MTgyMSwgMHgyNDQyMDAxMCwKLTB4NDMxMDJiLCAweDE0NDAwMDczLCAweDAsIDB4OGVlMjcyNjQsCi0weDI0NDgwMDEwLCAweDM2NDEwMjEsIDB4MTAyMTAyYiwgMHgxNDQwMDAwMiwKLTB4M2MwMmZmZmYsIDB4MTAyNDAyMSwgMHg4Zjg1MDEwMCwgMHgyNzYyMzAwMCwKLTB4MjRhNjAwMjAsIDB4YzIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjYyODAwLAotMHg4ZjgyMDEwOCwgMHgxMGMyMDAwNCwgMHgwLCAweDhmODIwMTA0LAotMHgxNGMyMDAwNywgMHgyNTYzMDAwYywgMHg4ZWUyMDFhOCwgMHg0ODIxLAotMHgyNDQyMDAwMSwgMHhhZWUyMDFhOCwgMHg4MDAyN2UyLCAweDhlZTIwMWE4LAotMHgyYzY0MDAwYywgMHgxNDQxMDIxLCAweGFjYTIwMDAwLCAweGFjYTMwMDA0LAotMHgyNGUyZmZmNCwgMHhhNGEyMDAwZSwgMHgyNDAyMDAwNiwgMHhhY2E4MDAwOCwKLTB4YWNhMjAwMTgsIDB4OGVlMjA0ZTQsIDB4YWNhMjAwMWMsIDB4OGVlMjA0YzgsCi0weDNjMDMwMDAyLCAweDQzMTAyNSwgMHhhY2EyMDAxMCwgMHhhZjg2MDEwMCwKLTB4OTJlMjA0ZWMsIDB4MTQ0MDAwMzcsIDB4MjQwOTAwMDEsIDB4OGVlMjRlMjgsCi0weDIxMGMwLCAweDI0NDI0ZTM4LCAweDJlMjIwMjEsIDB4OGM4MzAwMDAsCi0weDI0MDIwMDA1LCAweDE0NjIwMDFmLCAweDAsIDB4OGVlMzRlMjgsCi0weDhlZTI0ZTJjLCAweDEwNjIwMDFiLCAweDI0MDMwMDQwLCAweDhjODIwMDA0LAotMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUyYywgMHg4ZWU1NGUyOCwKLTB4MjQ0MjAwMDEsIDB4MTA0MzAwMDcsIDB4MCwgMHg4ZWUyNGUyYywKLTB4MjQ0MjAwMDEsIDB4MTBhMjAwMDUsIDB4MCwgMHg4MDAyN2NjLAotMHgwLCAweDE0YTAwMDA1LCAweDAsIDB4OGY4MjAxMDgsCi0weDI0NDIwMDIwLCAweGFmODIwMTA4LCAweDhmODIwMTA4LCAweDhjODIwMDA0LAotMHgyYzQyMDAxMSwgMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwgMHg4MDAyN2UyLAotMHgwLCAweDhlZTI0ZTI4LCAweDI0MDMwMDQwLCAweDI0NDIwMDAxLAotMHg1MDQzMDAwMywgMHgxMDIxLCAweDhlZTI0ZTI4LCAweDI0NDIwMDAxLAotMHhhZWUyNGUyOCwgMHg4ZWUyNGUyOCwgMHgyMTBjMCwgMHgyNDQyNGUzOCwKLTB4MmUyMjAyMSwgMHgyNDAyMDAwNSwgMHhhYzgyMDAwMCwgMHgyNDAyMDAwMSwKLTB4YWM4MjAwMDQsIDB4MTUyMDAwMGEsIDB4MjUwOGZmZmMsIDB4YWZhYjAwMTAsCi0weDhlZTI3MjY0LCAweDNjMDQwMDAxLCAweDI0ODQ1NzMwLCAweDNjMDUwMDA0LAotMHhhZmEyMDAxNCwgMHg4ZWU2MDRlNCwgMHg4MDAyOGJlLCAweDM0YTVmMDE1LAotMHgzNDAyODEwMCwgMHhhNTAyMDAwMCwgMHg5NTgyMDAwZSwgMHg4MDAyODVmLAotMHhhNTAyMDAwMiwgMHg4Zjg1MDEwMCwgMHgyNzYyMzAwMCwgMHgyNGE2MDAyMCwKLTB4YzIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjYyODAwLCAweDhmODIwMTA4LAotMHgxMGMyMDAwNCwgMHgwLCAweDhmODIwMTA0LCAweDE0YzIwMDA3LAotMHgyNTYzMDAwYywgMHg4ZWUyMDFhOCwgMHg0ODIxLCAweDI0NDIwMDAxLAotMHhhZWUyMDFhOCwgMHg4MDAyODRmLCAweDhlZTIwMWE4LCAweDJjNjQwMDBjLAotMHgxNDQxMDIxLCAweGFjYTIwMDAwLCAweGFjYTMwMDA0LCAweDhlZTM3MjY0LAotMHgyNGUyZmZmNCwgMHhhNGEyMDAwZSwgMHgyNDAyMDAwNiwgMHhhY2EyMDAxOCwKLTB4MjQ2MzAwMTAsIDB4YWNhMzAwMDgsIDB4OGVlMjA0ZTQsIDB4YWNhMjAwMWMsCi0weDhlZTIwNGM4LCAweDNjMDMwMDAyLCAweDQzMTAyNSwgMHhhY2EyMDAxMCwKLTB4YWY4NjAxMDAsIDB4OTJlMjA0ZWMsIDB4MTQ0MDAwMzcsIDB4MjQwOTAwMDEsCi0weDhlZTI0ZTI4LCAweDIxMGMwLCAweDI0NDI0ZTM4LCAweDJlMjIwMjEsCi0weDhjODMwMDAwLCAweDI0MDIwMDA1LCAweDE0NjIwMDFmLCAweDAsCi0weDhlZTM0ZTI4LCAweDhlZTI0ZTJjLCAweDEwNjIwMDFiLCAweDI0MDMwMDQwLAotMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUyYywKLTB4OGVlNTRlMjgsIDB4MjQ0MjAwMDEsIDB4MTA0MzAwMDcsIDB4MCwKLTB4OGVlMjRlMmMsIDB4MjQ0MjAwMDEsIDB4MTBhMjAwMDUsIDB4MCwKLTB4ODAwMjgzOSwgMHgwLCAweDE0YTAwMDA1LCAweDAsCi0weDhmODIwMTA4LCAweDI0NDIwMDIwLCAweGFmODIwMTA4LCAweDhmODIwMTA4LAotMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwKLTB4ODAwMjg0ZiwgMHgwLCAweDhlZTI0ZTI4LCAweDI0MDMwMDQwLAotMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywgMHgxMDIxLCAweDhlZTI0ZTI4LAotMHgyNDQyMDAwMSwgMHhhZWUyNGUyOCwgMHg4ZWUyNGUyOCwgMHgyMTBjMCwKLTB4MjQ0MjRlMzgsIDB4MmUyMjAyMSwgMHgyNDAyMDAwNSwgMHhhYzgyMDAwMCwKLTB4MjQwMjAwMDEsIDB4YWM4MjAwMDQsIDB4MTUyMDAwMGEsIDB4MzQwMjgxMDAsCi0weGFmYWIwMDEwLCAweDhlZTI3MjY0LCAweDNjMDQwMDAxLCAweDI0ODQ1NzMwLAotMHgzYzA1MDAwNCwgMHhhZmEyMDAxNCwgMHg4ZWU2MDRlNCwgMHg4MDAyOGJlLAotMHgzNGE1ZjAxNiwgMHg4ZWUzNzI2NCwgMHhhNDYyMDAwYywgMHg4ZWUzNzI2NCwKLTB4OTU4MjAwMGUsIDB4YTQ2MjAwMGUsIDB4ODAwMjhjMiwgMHgyNGU3MDAwNCwKLTB4OGY4MzAxMDAsIDB4Mjc2MjMwMDAsIDB4MjQ2NDAwMjAsIDB4ODIxMDJiLAotMHg1MDQwMDAwMSwgMHgyNzY0MjgwMCwgMHg4ZjgyMDEwOCwgMHgxMDgyMDAwNCwKLTB4MCwgMHg4ZjgyMDEwNCwgMHgxNDgyMDAwNywgMHgyNDA1MDAwNSwKLTB4OGVlMjAxYTgsIDB4NDgyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhOCwKLTB4ODAwMjhiNiwgMHg4ZWUyMDFhOCwgMHhhYzZhMDAwMCwgMHhhYzZiMDAwNCwKLTB4OGVlMjcyNjQsIDB4YTQ2NzAwMGUsIDB4YWM2NTAwMTgsIDB4YWM2MjAwMDgsCi0weDhlZTIwNGU0LCAweGFjNjIwMDFjLCAweDhlZTIwNGM4LCAweGFjNjIwMDEwLAotMHhhZjg0MDEwMCwgMHg5MmUyMDRlYywgMHgxNDQwMDAzNiwgMHgyNDA5MDAwMSwKLTB4OGVlMjRlMjgsIDB4MjEwYzAsIDB4MjQ0MjRlMzgsIDB4MmUyMjAyMSwKLTB4OGM4MjAwMDAsIDB4MTQ0NTAwMWYsIDB4MCwgMHg4ZWUzNGUyOCwKLTB4OGVlMjRlMmMsIDB4MTA2MjAwMWIsIDB4MjQwMzAwNDAsIDB4OGM4MjAwMDQsCi0weDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTJjLCAweDhlZTU0ZTI4LAotMHgyNDQyMDAwMSwgMHgxMDQzMDAwNywgMHgwLCAweDhlZTI0ZTJjLAotMHgyNDQyMDAwMSwgMHgxMGEyMDAwNSwgMHgwLCAweDgwMDI4YTAsCi0weDAsIDB4MTRhMDAwMDUsIDB4MCwgMHg4ZjgyMDEwOCwKLTB4MjQ0MjAwMjAsIDB4YWY4MjAxMDgsIDB4OGY4MjAxMDgsIDB4OGM4MjAwMDQsCi0weDJjNDIwMDExLCAweDUwNDAwMDEzLCAweGFjODAwMDAwLCAweDgwMDI4YjYsCi0weDAsIDB4OGVlMjRlMjgsIDB4MjQwMzAwNDAsIDB4MjQ0MjAwMDEsCi0weDUwNDMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMjgsIDB4MjQ0MjAwMDEsCi0weGFlZTI0ZTI4LCAweDhlZTI0ZTI4LCAweDIxMGMwLCAweDI0NDI0ZTM4LAotMHgyZTIyMDIxLCAweDI0MDIwMDA1LCAweGFjODIwMDAwLCAweDI0MDIwMDAxLAotMHhhYzgyMDAwNCwgMHgxNTIwMDAwYiwgMHgzYzA1MDAwNCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDU3NDgsIDB4YWZhYjAwMTAsIDB4YWZhMDAwMTQsIDB4OGVlNjA0ZTQsCi0weDM0YTVmMDE3LCAweGMwMDI0MDMsIDB4MzBlN2ZmZmYsIDB4ODAwMjhlMSwKLTB4MCwgMHg4ZWUyNzI2NCwgMHgzYzA1MDAwMSwgMHgzMGU0ZmZmZiwKLTB4NDQxMDIxLCAweGFlZTI3MjY0LCAweDhlZTI3MjVjLCAweDhlZTM3MjY0LAotMHgzNGE1MzgwMCwgMHg0NDEwMjEsIDB4YWVlMjcyNWMsIDB4MzY1MTAyMSwKLTB4NjIxODJiLCAweDE0NjAwMDA0LCAweDNjMDNmZmZmLCAweDhlZTI3MjY0LAotMHg0MzEwMjEsIDB4YWVlMjcyNjQsIDB4OGVlMzA0ZTQsIDB4OTZlMjA0NTgsCi0weDI0NjMwMDAxLCAweDI0NDJmZmZmLCAweDYyMTgyNCwgMHhhZWUzMDRlNCwKLTB4OGVlMzA0ZTQsIDB4OGVlMjA0ZTAsIDB4MTQ2MjAwMDUsIDB4MCwKLTB4OGY4MjAwNjAsIDB4MjQwM2ZmZjcsIDB4NDMxMDI0LCAweGFmODIwMDYwLAotMHg4ZmJmMDAyMCwgMHgzZTAwMDA4LCAweDI3YmQwMDI4LCAweDI3YmRmZmUwLAotMHhhZmJmMDAxOCwgMHg4ZWUzMDRlOCwgMHg4ZWUyMDRlMCwgMHgxMDYyMDE4OSwKLTB4MCwgMHg4ZWUyMDRlOCwgMHg4ZWUzMDRmYywgMHgyMTEwMCwKLTB4NjIxODIxLCAweDk0NjcwMDA4LCAweDkyZTIwNGVkLCAweDhjNjgwMDAwLAotMHg4YzY5MDAwNCwgMHgxMDQwMDAyMywgMHg5NDZhMDAwYSwgMHg4ZWUyMDRjOCwKLTB4MzQ0NjA0MDAsIDB4MzE0MjAyMDAsIDB4MTA0MDAwMWYsIDB4MCwKLTB4OTZlMjA0NWEsIDB4MzA0MjAwMTAsIDB4MTA0MDAwMWIsIDB4M2MwMjgwMDAsCi0weDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhYzIyODNkOCwgMHg4ZWUyNzI2NCwKLTB4OTQ2NDAwMGUsIDB4M2MwNTAwMDEsIDB4MzRhNTM4MDAsIDB4MjQ0MjAwMDQsCi0weGFlZTI3MjY0LCAweDhlZTM3MjY0LCAweDQyNDAwLCAweDM2NTEwMjEsCi0weDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhYzI0ODNkYywgMHg2MjE4MmIsCi0weDE0NjAwMDA1LCAweDI0ZTcwMDA0LCAweDhlZTI3MjY0LCAweDNjMDNmZmZmLAotMHg0MzEwMjEsIDB4YWVlMjcyNjQsIDB4OGVlMjcyNjQsIDB4ODAwMjkxNywKLTB4YWVlMjcyNTgsIDB4OGVlNjA0YzgsIDB4OGVlMjcyNmMsIDB4MzBlNGZmZmYsCi0weDQ0MTAyYSwgMHgxMDQwMDAxNSwgMHgwLCAweDhmODIwMGQ4LAotMHg4ZWUzNzI1OCwgMHg0MzEwMjMsIDB4YWVlMjcyNmMsIDB4OGVlMjcyNmMsCi0weDFjNDAwMDA3LCAweDQ0MTAyYSwgMHg4ZWUyNzI2YywgMHgzYzAzMDAwMSwKLTB4NDMxMDIxLCAweGFlZTI3MjZjLCAweDhlZTI3MjZjLCAweDQ0MTAyYSwKLTB4MTA0MDAwMDYsIDB4MCwgMHg4ZWUyMDFiOCwgMHgyNDQyMDAwMSwKLTB4YWVlMjAxYjgsIDB4ODAwMmE3MiwgMHg4ZWUyMDFiOCwgMHgzYzAyMDAwMSwKLTB4NTcxMDIxLCAweDhjNDI4M2Q4LCAweDU0NDAwMDAxLCAweDI0ZTdmZmZjLAotMHgzMTQyMDAwNCwgMHgxMDQwMDBiOSwgMHgzMGUyZmZmZiwgMHgzYzAyMDAwMSwKLTB4NTcxMDIxLCAweDhjNDI4M2Q4LCAweDEwNDAwMDJmLCAweDUwMjEsCi0weDhmODQwMTAwLCAweDI3NjIzMDAwLCAweDI0ODUwMDIwLCAweGEyMTAyYiwKLTB4NTA0MDAwMDEsIDB4Mjc2NTI4MDAsIDB4OGY4MjAxMDgsIDB4MTBhMjAwMzIsCi0weDAsIDB4OGY4MjAxMDQsIDB4MTBhMjAwMmYsIDB4MjQwMjAwMTUsCi0weGFjODgwMDAwLCAweGFjODkwMDA0LCAweDhlZTM3MjY0LCAweGE0ODcwMDBlLAotMHhhYzgyMDAxOCwgMHhhYzgzMDAwOCwgMHg4ZWUyMDRlOCwgMHgzYzAzMDAwMSwKLTB4NzcxODIxLCAweDhjNjM4M2RjLCAweGFjODYwMDEwLCAweDQzMTAyNSwKLTB4YWM4MjAwMWMsIDB4YWY4NTAxMDAsIDB4OTJlMjA0ZWMsIDB4MTQ0MDAwNjYsCi0weDI0MGEwMDAxLCAweDhlZTI0ZTI4LCAweDI0MDMwMDQwLCAweDI0NDIwMDAxLAotMHg1MDQzMDAwMywgMHgxMDIxLCAweDhlZTI0ZTI4LCAweDI0NDIwMDAxLAotMHhhZWUyNGUyOCwgMHg4ZWUyNGUyOCwgMHgyMTBjMCwgMHgyNDQyNGUzOCwKLTB4MmUyMTgyMSwgMHgyNDAyMDAxNSwgMHhhYzYyMDAwMCwgMHgyNDAyMDAwMSwKLTB4ODAwMjliZiwgMHhhYzYyMDAwNCwgMHg4Zjg0MDEwMCwgMHgyNzYyMzAwMCwKLTB4MjQ4NTAwMjAsIDB4YTIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjUyODAwLAotMHg4ZjgyMDEwOCwgMHgxMGEyMDAwNCwgMHgwLCAweDhmODIwMTA0LAotMHgxNGEyMDAwNiwgMHgyNDAyMDAwNiwgMHg4ZWUyMDFhOCwgMHgyNDQyMDAwMSwKLTB4YWVlMjAxYTgsIDB4ODAwMjliZiwgMHg4ZWUyMDFhOCwgMHhhYzg4MDAwMCwKLTB4YWM4OTAwMDQsIDB4OGVlMzcyNjQsIDB4YTQ4NzAwMGUsIDB4YWM4MjAwMTgsCi0weGFjODMwMDA4LCAweDhlZTIwNGU4LCAweGFjODYwMDEwLCAweGFjODIwMDFjLAotMHhhZjg1MDEwMCwgMHg5MmUyMDRlYywgMHgxNDQwMDAzNywgMHgyNDBhMDAwMSwKLTB4OGVlMjRlMjgsIDB4MjEwYzAsIDB4MjQ0MjRlMzgsIDB4MmUyMjAyMSwKLTB4OGM4MzAwMDAsIDB4MjQwMjAwMDUsIDB4MTQ2MjAwMWYsIDB4MCwKLTB4OGVlMzRlMjgsIDB4OGVlMjRlMmMsIDB4MTA2MjAwMWIsIDB4MjQwMzAwNDAsCi0weDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTJjLAotMHg4ZWU1NGUyOCwgMHgyNDQyMDAwMSwgMHgxMDQzMDAwNywgMHgwLAotMHg4ZWUyNGUyYywgMHgyNDQyMDAwMSwgMHgxMGEyMDAwNSwgMHgwLAotMHg4MDAyOWE5LCAweDAsIDB4MTRhMDAwMDUsIDB4MCwKLTB4OGY4MjAxMDgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMDgsIDB4OGY4MjAxMDgsCi0weDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEzLCAweGFjODAwMDAwLAotMHg4MDAyOWJmLCAweDAsIDB4OGVlMjRlMjgsIDB4MjQwMzAwNDAsCi0weDI0NDIwMDAxLCAweDUwNDMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMjgsCi0weDI0NDIwMDAxLCAweGFlZTI0ZTI4LCAweDhlZTI0ZTI4LCAweDIxMGMwLAotMHgyNDQyNGUzOCwgMHgyZTIyMDIxLCAweDI0MDIwMDA1LCAweGFjODIwMDAwLAotMHgyNDAyMDAwMSwgMHhhYzgyMDAwNCwgMHgxNTQwMDAwYSwgMHgyNDAyMDAwMSwKLTB4YWZhOTAwMTAsIDB4OGVlMjcyNjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDU3MzAsCi0weDNjMDUwMDA0LCAweGFmYTIwMDE0LCAweDhlZTYwNGU0LCAweDgwMDJhNGYsCi0weDM0YTVmMjA0LCAweGEyZTIwNGVkLCAweDhlZTIwNGU4LCAweDhlZTMwNGZjLAotMHg4ZWU0NzI1OCwgMHgzYzA2MDAwMSwgMHgzNGM2MzgwMCwgMHgzYzAxMDAwMSwKLTB4MzcwODIxLCAweGFjMjA4M2Q4LCAweDNjMDEwMDAxLCAweDM3MDgyMSwKLTB4YWMyMDgzZGMsIDB4MjExMDAsIDB4NDMxMDIxLCAweGFjNDQwMDBjLAotMHg4ZWUyNzI2NCwgMHgyNDA1ZmZmOCwgMHgzMGUzZmZmZiwgMHg0MzEwMjEsCi0weDI0NDIwMDA3LCAweDQ1MTAyNCwgMHgyNDYzMDAwNywgMHhhZWUyNzI1OCwKLTB4OGVlMjcyNmMsIDB4OGVlNDcyNTgsIDB4NjUxODI0LCAweDQzMTAyMywKLTB4YWVlMjcyNmMsIDB4MzY2MTAyMSwgMHg4MjIwMmIsIDB4MTQ4MDAwMDQsCi0weDNjMDNmZmZmLCAweDhlZTI3MjU4LCAweDQzMTAyMSwgMHhhZWUyNzI1OCwKLTB4OGVlMjcyNTgsIDB4ODAwMmE2NCwgMHhhZWUyNzI2NCwgMHgxMDQwMDA3MywKLTB4MCwgMHg4ZjgzMDEwMCwgMHgyNzYyMzAwMCwgMHgyNDY0MDAyMCwKLTB4ODIxMDJiLCAweDE0NDAwMDAyLCAweDUwMjEsIDB4Mjc2NDI4MDAsCi0weDhmODIwMTA4LCAweDEwODIwMDA0LCAweDAsIDB4OGY4MjAxMDQsCi0weDE0ODIwMDA2LCAweDI0MDUwMDA1LCAweDhlZTIwMWE4LCAweDI0NDIwMDAxLAotMHhhZWUyMDFhOCwgMHg4MDAyYTQ2LCAweDhlZTIwMWE4LCAweGFjNjgwMDAwLAotMHhhYzY5MDAwNCwgMHg4ZWUyNzI2NCwgMHhhNDY3MDAwZSwgMHhhYzY1MDAxOCwKLTB4YWM2MjAwMDgsIDB4OGVlMjA0ZTgsIDB4YWM2NjAwMTAsIDB4YWM2MjAwMWMsCi0weGFmODQwMTAwLCAweDkyZTIwNGVjLCAweDE0NDAwMDM2LCAweDI0MGEwMDAxLAotMHg4ZWUyNGUyOCwgMHgyMTBjMCwgMHgyNDQyNGUzOCwgMHgyZTIyMDIxLAotMHg4YzgyMDAwMCwgMHgxNDQ1MDAxZiwgMHgwLCAweDhlZTM0ZTI4LAotMHg4ZWUyNGUyYywgMHgxMDYyMDAxYiwgMHgyNDAzMDA0MCwgMHg4YzgyMDAwNCwKLTB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMmMsIDB4OGVlNTRlMjgsCi0weDI0NDIwMDAxLCAweDEwNDMwMDA3LCAweDAsIDB4OGVlMjRlMmMsCi0weDI0NDIwMDAxLCAweDEwYTIwMDA1LCAweDAsIDB4ODAwMmEzMCwKLTB4MCwgMHgxNGEwMDAwNSwgMHgwLCAweDhmODIwMTA4LAotMHgyNDQyMDAyMCwgMHhhZjgyMDEwOCwgMHg4ZjgyMDEwOCwgMHg4YzgyMDAwNCwKLTB4MmM0MjAwMTEsIDB4NTA0MDAwMTMsIDB4YWM4MDAwMDAsIDB4ODAwMmE0NiwKLTB4MCwgMHg4ZWUyNGUyOCwgMHgyNDAzMDA0MCwgMHgyNDQyMDAwMSwKLTB4NTA0MzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUyOCwgMHgyNDQyMDAwMSwKLTB4YWVlMjRlMjgsIDB4OGVlMjRlMjgsIDB4MjEwYzAsIDB4MjQ0MjRlMzgsCi0weDJlMjIwMjEsIDB4MjQwMjAwMDUsIDB4YWM4MjAwMDAsIDB4MjQwMjAwMDEsCi0weGFjODIwMDA0LCAweDE1NDAwMDBjLCAweDMwZTVmZmZmLCAweDNjMDQwMDAxLAotMHgyNDg0NTc0OCwgMHgzYzA1MDAwNCwgMHhhZmE5MDAxMCwgMHhhZmEwMDAxNCwKLTB4OGVlNjA0ZTQsIDB4MzRhNWYyMzcsIDB4YzAwMjQwMywgMHgzMGU3ZmZmZiwKLTB4ODAwMmE3MiwgMHgwLCAweDhlZTI3MjY0LCAweDQ1MTAyMSwKLTB4YWVlMjcyNjQsIDB4OGVlMjcyNmMsIDB4OGVlMzcyNjQsIDB4M2MwNDAwMDEsCi0weDM0ODQzODAwLCAweGEyZTAwNGVkLCAweDQ1MTAyMywgMHhhZWUyNzI2YywKLTB4MzY0MTAyMSwgMHg2MjE4MmIsIDB4MTQ2MDAwMDQsIDB4M2MwM2ZmZmYsCi0weDhlZTI3MjY0LCAweDQzMTAyMSwgMHhhZWUyNzI2NCwgMHg4ZWUzMDRlOCwKLTB4OTZlMjA0NTgsIDB4MjQ2MzAwMDEsIDB4MjQ0MmZmZmYsIDB4NjIxODI0LAotMHhhZWUzMDRlOCwgMHg4ZWUzMDRlOCwgMHg4ZWUyMDRlMCwgMHgxNDYyMDAwNSwKLTB4MCwgMHg4ZjgyMDA2MCwgMHgyNDAzZmZmNywgMHg0MzEwMjQsCi0weGFmODIwMDYwLCAweDhmYmYwMDE4LCAweDNlMDAwMDgsIDB4MjdiZDAwMjAsCi0weDI3YmRmZmUwLCAweGFmYmYwMDFjLCAweGFmYjAwMDE4LCAweDhmODIwMTAwLAotMHg4ZWUzNGUyYywgMHg4ZjgyMDEwNCwgMHg4Zjg1MDEwOCwgMHgyNDAyMDA0MCwKLTB4MjQ2MzAwMDEsIDB4NTA2MjAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUyYywKLTB4MjQ0MjAwMDEsIDB4YWVlMjRlMmMsIDB4OGVlMjRlMmMsIDB4OGVlMzRlMmMsCi0weDIxMGMwLCAweDI0NDI0ZTM4LCAweDJlMjIwMjEsIDB4OGVlMjRlMjgsCi0weDhjODcwMDA0LCAweDE0NjIwMDA3LCAweGEwMzAyMSwgMHg4ZjgyMDEwOCwKLTB4MjQ0MjAwMjAsIDB4YWY4MjAxMDgsIDB4OGY4MjAxMDgsIDB4ODAwMmFhMiwKLTB4YWM4MDAwMDAsIDB4OGVlMjRlMmMsIDB4MjQwMzAwNDAsIDB4MjQ0MjAwMDEsCi0weDUwNDMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMmMsIDB4MjQ0MjAwMDEsCi0weDIxMGMwLCAweDI0NDI0ZTM4LCAweDJlMjIwMjEsIDB4OGM4MjAwMDQsCi0weDhmODMwMTA4LCAweDIxMTQwLCAweDYyMTgyMSwgMHhhZjgzMDEwOCwKLTB4YWM4MDAwMDAsIDB4OGNjMjAwMTgsIDB4MjQ0M2ZmZmUsIDB4MmM2MjAwMTMsCi0weDEwNDAwMGMxLCAweDMxMDgwLCAweDNjMDEwMDAxLCAweDIyMDgyMSwKLTB4OGMyMjU3NzAsIDB4NDAwMDA4LCAweDAsIDB4OGVlMjA0ZjAsCi0weDQ3MTAyMSwgMHhhZWUyMDRmMCwgMHg4ZWUyMDRmMCwgMHg4ZjQzMDIzYywKLTB4NDMxMDJiLCAweDE0NDAwMGJlLCAweDAsIDB4OGVlMzA0ZTQsCi0weDhlZTIwNGY4LCAweDUwNjIwMGJhLCAweGEyZTAwNGY0LCAweDhmODMwMTIwLAotMHgyNzYyMzgwMCwgMHgyNDY2MDAyMCwgMHhjMjEwMmIsIDB4NTA0MDAwMDEsCi0weDI3NjYzMDAwLCAweDhmODIwMTI4LCAweDEwYzIwMDA0LCAweDAsCi0weDhmODIwMTI0LCAweDE0YzIwMDA3LCAweDAsIDB4OGVlMjAxYTQsCi0weDgwMjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsIDB4ODAwMmIxMiwKLTB4OGVlMjAxYTQsIDB4OGVlMjA0ZTQsIDB4YWM2MjAwMWMsIDB4OGVlNDA0YjAsCi0weDhlZTUwNGI0LCAweDI0NjIwMDFjLCAweGFjNjIwMDA4LCAweDI0MDIwMDA4LAotMHhhNDYyMDAwZSwgMHgyNDAyMDAxMSwgMHhhYzYyMDAxOCwgMHhhYzY0MDAwMCwKLTB4YWM2NTAwMDQsIDB4OGVlMjA0YzQsIDB4YWM2MjAwMTAsIDB4YWY4NjAxMjAsCi0weDkyZTI0ZTIwLCAweDE0NDAwMDM3LCAweDI0MTAwMDAxLCAweDhlZTI0ZTMwLAotMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDhjODMwMDAwLAotMHgyNDAyMDAxMiwgMHgxNDYyMDAxZiwgMHgwLCAweDhlZTM0ZTMwLAotMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgMHgyNDAzMDA0MCwgMHg4YzgyMDAwNCwKLTB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIDB4OGVlNTRlMzAsCi0weDI0NDIwMDAxLCAweDEwNDMwMDA3LCAweDAsIDB4OGVlMjRlMzQsCi0weDI0NDIwMDAxLCAweDEwYTIwMDA1LCAweDAsIDB4ODAwMmFmYywKLTB4MCwgMHgxNGEwMDAwNSwgMHgwLCAweDhmODIwMTI4LAotMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwKLTB4MmM0MjAwMTEsIDB4NTA0MDAwMTMsIDB4YWM4MDAwMDAsIDB4ODAwMmIxMiwKLTB4MCwgMHg4ZWUyNGUzMCwgMHgyNDAzMDA0MCwgMHgyNDQyMDAwMSwKLTB4NTA0MzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwKLTB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsCi0weDJlMjIwMjEsIDB4MjQwMjAwMTIsIDB4YWM4MjAwMDAsIDB4MjQwMjAwMDEsCi0weGFjODIwMDA0LCAweDU2MDAwMDBiLCAweDI0MTAwMDAxLCAweDhlZTIwNGU0LAotMHgzYzA0MDAwMSwgMHgyNDg0NTc1NCwgMHhhZmEwMDAxNCwgMHhhZmEyMDAxMCwKLTB4OGVlNjA2MDgsIDB4OGY0NzAyMjgsIDB4M2MwNTAwMDksIDB4YzAwMjQwMywKLTB4MzRhNWYwMDYsIDB4MTYwMDAwMDMsIDB4MjQwMjAwMDEsIDB4ODAwMmI3MSwKLTB4YTJlMjA0ZjQsIDB4OGVlMjAxNzAsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxNzAsCi0weDhlZTIwMTcwLCAweDhlZTIwNGU0LCAweGEyZTAwNGY0LCAweGFlZTAwNGYwLAotMHhhZWUyMDRmOCwgMHg4ZjQyMDIzYywgMHg1MDQwMDA0NSwgMHhhZWUwNzI3NCwKLTB4OGVlMjAxODQsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxODQsIDB4OGVlMjAxODQsCi0weDgwMDJiNzEsIDB4YWVlMDcyNzQsIDB4OGVlMjA1MDQsIDB4MjQwMzAwNDAsCi0weDI0NDIwMDAxLCAweDUwNDMwMDAzLCAweDEwMjEsIDB4OGVlMjA1MDQsCi0weDI0NDIwMDAxLCAweGFlZTIwNTA0LCAweDhlZTIwNTA0LCAweDhjYzMwMDE4LAotMHgyMTA4MCwgMHg1NzEwMjEsIDB4OGM0NDA1MDgsIDB4MjQwMjAwMDMsCi0weDE0NjIwMDBmLCAweDAsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLAotMHg5MDQyODNiMSwgMHgxMDQwMDAxNCwgMHgwLCAweDhlZTIwMWQwLAotMHg4ZWUzNTI0MCwgMHg0NDEwMjEsIDB4YWVlMjAxZDAsIDB4OGVlMjAxZDgsCi0weDY0MTgyMSwgMHgzMDYzMDBmZiwgMHg4MDAyYjU5LCAweGFlZTM1MjQwLAotMHg4ZWUyMDFjYywgMHg4ZWUzMGUxMCwgMHg0NDEwMjEsIDB4YWVlMjAxY2MsCi0weDhlZTIwMWQ4LCAweDY0MTgyMSwgMHgzMDYzMDFmZiwgMHhhZWUzMGUxMCwKLTB4NDQxMDIxLCAweGFlZTIwMWQ4LCAweDhlZTIwMDAwLCAweDM0NDIwMDQwLAotMHg4MDAyYjcxLCAweGFlZTIwMDAwLCAweDhlZTIwMTRjLCAweDNjMDEwMDAxLAotMHgzNzA4MjEsIDB4YTAyMDgzZTAsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxNGMsCi0weDgwMDJiNzEsIDB4OGVlMjAxNGMsIDB4OTRjNzAwMGUsIDB4OGNjMjAwMWMsCi0weDNjMDQwMDAxLCAweDI0ODQ1NzYwLCAweGFmYTYwMDE0LCAweGFmYTIwMDEwLAotMHg4Y2M2MDAxOCwgMHgzYzA1MDAwOCwgMHhjMDAyNDAzLCAweDM0YTUwOTEwLAotMHg4ZmJmMDAxYywgMHg4ZmIwMDAxOCwgMHgzZTAwMDA4LCAweDI3YmQwMDIwLAotMHgyN2JkZmY5OCwgMHhhZmJmMDA2MCwgMHhhZmJlMDA1YywgMHhhZmI2MDA1OCwKLTB4YWZiNTAwNTQsIDB4YWZiNDAwNTAsIDB4YWZiMzAwNGMsIDB4YWZiMjAwNDgsCi0weGFmYjEwMDQ0LCAweGFmYjAwMDQwLCAweDhmODMwMTA4LCAweDhmODIwMTA0LAotMHhhZmEwMDAyNCwgMHgxMDYyMDNlNywgMHhhZmEwMDAyYywgMHgzYzFlMDAwMSwKLTB4MzdkZTM4MDAsIDB4M2MwYmZmZmYsIDB4OGY5MzAxMDgsIDB4OGU2MjAwMTgsCi0weDhmODMwMTA0LCAweDI0NDNmZmZlLCAweDJjNjIwMDE0LCAweDEwNDAwM2NmLAotMHgzMTA4MCwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4OGMyMjU3YzAsCi0weDQwMDAwOCwgMHgwLCAweDk2NjMwMDBlLCAweDhlZTI3MjVjLAotMHg4ZWU0MDRmMCwgMHg0MzEwMjEsIDB4YWVlMjcyNWMsIDB4OGU2MzAwMWMsCi0weDk2ZTIwNDU4LCAweDI0ODQwMDAxLCAweGFlZTQwNGYwLCAweDI0NjMwMDAxLAotMHgyNDQyZmZmZiwgMHg2MjE4MjQsIDB4YWVlMzA0ZTQsIDB4OGY0MjAyM2MsCi0weDgyMjAyYiwgMHgxNDgwMDNiOSwgMHgwLCAweDhmODMwMTIwLAotMHgyNzYyMzgwMCwgMHgyNDY2MDAyMCwgMHhjMjEwMmIsIDB4NTA0MDAwMDEsCi0weDI3NjYzMDAwLCAweDhmODIwMTI4LCAweDEwYzIwMDA0LCAweDAsCi0weDhmODIwMTI0LCAweDE0YzIwMDA3LCAweDAsIDB4OGVlMjAxYTQsCi0weDgwMjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsIDB4ODAwMmJmZSwKLTB4OGVlMjAxYTQsIDB4OGVlMjA0ZTQsIDB4YWM2MjAwMWMsIDB4OGVlNDA0YjAsCi0weDhlZTUwNGI0LCAweDI0NjIwMDFjLCAweGFjNjIwMDA4LCAweDI0MDIwMDA4LAotMHhhNDYyMDAwZSwgMHgyNDAyMDAxMSwgMHhhYzYyMDAxOCwgMHhhYzY0MDAwMCwKLTB4YWM2NTAwMDQsIDB4OGVlMjA0YzQsIDB4YWM2MjAwMTAsIDB4YWY4NjAxMjAsCi0weDkyZTI0ZTIwLCAweDE0NDAwMDM3LCAweDI0MTAwMDAxLCAweDhlZTI0ZTMwLAotMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDhjODMwMDAwLAotMHgyNDAyMDAxMiwgMHgxNDYyMDAxZiwgMHgwLCAweDhlZTM0ZTMwLAotMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgMHgyNDBjMDA0MCwgMHg4YzgyMDAwNCwKLTB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIDB4OGVlMzRlMzAsCi0weDI0NDIwMDAxLCAweDEwNGMwMDA3LCAweDAsIDB4OGVlMjRlMzQsCi0weDI0NDIwMDAxLCAweDEwNjIwMDA1LCAweDAsIDB4ODAwMmJlOCwKLTB4MCwgMHgxNDYwMDAwNSwgMHgwLCAweDhmODIwMTI4LAotMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwKLTB4MmM0MjAwMTEsIDB4NTA0MDAwMTMsIDB4YWM4MDAwMDAsIDB4ODAwMmJmZSwKLTB4MCwgMHg4ZWUyNGUzMCwgMHgyNDBjMDA0MCwgMHgyNDQyMDAwMSwKLTB4NTA0YzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwKLTB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsCi0weDJlMjIwMjEsIDB4MjQwMjAwMTIsIDB4MjQwYzAwMDEsIDB4YWM4MjAwMDAsCi0weGFjOGMwMDA0LCAweDU2MDAwMDBkLCAweDI0MTAwMDAxLCAweDhlZTIwNGU0LAotMHgzYzA0MDAwMSwgMHgyNDg0NTc1NCwgMHhhZmEwMDAxNCwgMHhhZmEyMDAxMCwKLTB4OGVlNjA2MDgsIDB4OGY0NzAyMjgsIDB4M2MwNTAwMDksIDB4MzRhNWYwMDYsCi0weGMwMDI0MDMsIDB4YWZhYjAwMzgsIDB4OGZhYjAwMzgsIDB4MTIwMDAzMGEsCi0weDI0MGMwMDAxLCAweDgwMDJmMTksIDB4MCwgMHg5NjZjMDAxYywKLTB4YWZhYzAwMmMsIDB4OTY2MjAwMWUsIDB4M2MwYzgwMDAsIDB4YWZhYzAwMjQsCi0weGFlNjIwMDFjLCAweDhlNzUwMDFjLCAweDhlZTIwNGZjLCAweDhlZTQwNGZjLAotMHgxNTE5MDAsIDB4NjIxMDIxLCAweDhjNTIwMDBjLCAweDkyZTI3Yjk4LAotMHg2NDE4MjEsIDB4OTQ3NjAwMGEsIDB4MTQ0MDAwMDMsIDB4MzJjMjAwMDIsCi0weGFlZjI3YmE0LCAweGFlZjU3YjljLCAweDEwNDAwMDRiLCAweDgwMjEsCi0weDk2ZTIwNDVhLCAweDMwNDIwMDAyLCAweDEwNDAwMDQ3LCAweDAsCi0weDhlNjMwMDFjLCAweDhlZTIwNGZjLCAweDMyMTAwLCAweDgyMTAyMSwKLTB4OGM0MjAwMGMsIDB4MzdlMTgyMSwgMHgyNDQyMDAyMiwgMHg0MzEwMmIsCi0weDE0NDAwMDBhLCAweDI0MDUwMDE0LCAweDhlZTIwNGZjLCAweDgyMTAyMSwKLTB4OGM0NDAwMGMsIDB4YWZhYjAwMzgsIDB4YzAwMmY3NSwgMHgyNDg0MDAwZSwKLTB4OGZhYjAwMzgsIDB4ODAwMmM1MiwgMHgzMDUwZmZmZiwgMHg4ZWUyMDRmYywKLTB4ODIxMDIxLCAweDhjNDIwMDBjLCAweDk0NTAwMDBlLCAweDk0NDMwMDEwLAotMHg5NDQ0MDAxMiwgMHg5NDQ1MDAxNCwgMHgyMDM4MDIxLCAweDIwNDgwMjEsCi0weDIwNTgwMjEsIDB4OTQ0MzAwMTYsIDB4OTQ0NDAwMTgsIDB4OTQ0NTAwMWEsCi0weDIwMzgwMjEsIDB4MjA0ODAyMSwgMHgyMDU4MDIxLCAweDk0NDMwMDFjLAotMHg5NDQ0MDAxZSwgMHg5NDQyMDAyMCwgMHgyMDM4MDIxLCAweDIwNDgwMjEsCi0weDIwMjgwMjEsIDB4MTAxYzAyLCAweDMyMDJmZmZmLCAweDYyODAyMSwKLTB4OGU2MzAwMWMsIDB4OGVlMjA0ZmMsIDB4MTAyNDAyLCAweDMyOTAwLAotMHhhMjEwMjEsIDB4OGM0MzAwMGMsIDB4MzIwMmZmZmYsIDB4ODI4MDIxLAotMHgzN2UxMDIxLCAweDI0NjMwMDE4LCAweDYyMTgyYiwgMHgxNDYwMDAwOSwKLTB4MCwgMHg4ZWUyMDRmYywgMHhhMjEwMjEsIDB4OGM0MzAwMGMsCi0weDEwMTAyNywgMHgzYzAxZmZmZiwgMHgyMzA4MjEsIDB4ODAwMmM2ZiwKLTB4YTQyMjAwMTgsIDB4OGVlMjA0ZmMsIDB4YTIxMDIxLCAweDhjNDMwMDBjLAotMHgxMDEwMjcsIDB4YTQ2MjAwMTgsIDB4OTZlMjA0NWEsIDB4ODgyMSwKLTB4MzA0MjAwMDgsIDB4MTQ0MDAwNjMsIDB4YTAyMSwgMHg4ZTYzMDAxYywKLTB4OGVlMjA0ZmMsIDB4MzMxMDAsIDB4YzIxMDIxLCAweDhjNDIwMDBjLAotMHgzN2UxODIxLCAweDI0NDIwMDIyLCAweDQzMTAyYiwgMHgxNDQwMDAzNSwKLTB4MCwgMHg4ZWUyMDRmYywgMHhjMjEwMjEsIDB4OGM0MjAwMGMsCi0weDI0NDcwMDEwLCAweDM3ZTEwMjEsIDB4ZTIxMDJiLCAweDUwNDAwMDAxLAotMHhlYjM4MjEsIDB4OGVlMjA0ZmMsIDB4OTRmMTAwMDAsIDB4YzIxMDIxLAotMHg4YzQyMDAwYywgMHgyNDQ3MDAxNiwgMHgzN2UxMDIxLCAweGUyMTAyYiwKLTB4MTQ0MDAwMDIsIDB4MjYzNGZmZWMsIDB4ZWIzODIxLCAweDhlZTIwNGZjLAotMHg5MGUzMDAwMSwgMHhjMjEwMjEsIDB4OGM0MjAwMGMsIDB4MjQ0NzAwMWEsCi0weDM3ZTEwMjEsIDB4ZTIxMDJiLCAweDE0NDAwMDAyLCAweDI4Mzg4MjEsCi0weGViMzgyMSwgMHg5NGUyMDAwMCwgMHgyNGU3MDAwMiwgMHgyMjI4ODIxLAotMHgzN2UxMDIxLCAweGUyMTAyYiwgMHg1MDQwMDAwMSwgMHhlYjM4MjEsCi0weDk0ZTIwMDAwLCAweDI0ZTcwMDAyLCAweDIyMjg4MjEsIDB4MzdlMTAyMSwKLTB4ZTIxMDJiLCAweDUwNDAwMDAxLCAweGViMzgyMSwgMHg5NGUyMDAwMCwKLTB4MjRlNzAwMDIsIDB4MjIyODgyMSwgMHgzN2UxMDIxLCAweGUyMTAyYiwKLTB4NTA0MDAwMDEsIDB4ZWIzODIxLCAweDk0ZTIwMDAwLCAweDgwMDJjZDAsCi0weDIyMjg4MjEsIDB4OGVlMjA0ZmMsIDB4YzIxMDIxLCAweDhjNDMwMDBjLAotMHg4ZWUyMDRmYywgMHg5NDcxMDAxMCwgMHg4ZWUzMDRmYywgMHhjMjEwMjEsCi0weDhjNDQwMDBjLCAweGMzMTgyMSwgMHg4YzYyMDAwYywgMHgyNjM0ZmZlYywKLTB4OTA4NDAwMTcsIDB4OGVlMzA0ZmMsIDB4OTQ0MjAwMWEsIDB4Mjg0ODgyMSwKLTB4YzMxODIxLCAweDhjNjUwMDBjLCAweDhlZTMwNGZjLCAweDIyMjg4MjEsCi0weDhlZTIwNGZjLCAweGMzMTgyMSwgMHhjMjEwMjEsIDB4OGM0NDAwMGMsCi0weDhjNjIwMDBjLCAweDk0YTMwMDFjLCAweDk0ODQwMDFlLCAweDk0NDIwMDIwLAotMHgyMjM4ODIxLCAweDIyNDg4MjEsIDB4MjIyODgyMSwgMHgxMTFjMDIsCi0weDMyMjJmZmZmLCAweDYyODgyMSwgMHgxMTFjMDIsIDB4MzIyMmZmZmYsCi0weDYyODgyMSwgMHgzMmMyMDAwMSwgMHgxMDQwMDBiMiwgMHgwLAotMHg5NmUyMDQ1YSwgMHgzMDQyMDAwMSwgMHgxMDQwMDBhZSwgMHgzMmMyMDA4MCwKLTB4MTA0MDAwMDgsIDB4MCwgMHg5MmUyN2I5OCwgMHgxNDQwMDAwNSwKLTB4MCwgMHgyNDBjMDAwMSwgMHhhMmVjN2I5OCwgMHhhZWY1N2I5YywKLTB4YWVmMjdiYTQsIDB4OGVlMzA0ZmMsIDB4MTUxMTAwLCAweDQzMTAyMSwKLTB4OGM0NzAwMGMsIDB4MzdlMTgyMSwgMHgyNGUyMDAwZSwgMHg0MzEwMmIsCi0weDE0NDAwMDA4LCAweGUwMjAyMSwgMHgyNDA1MDAwZSwgMHhjMDAyZjc1LAotMHhhZmFiMDAzOCwgMHgzMDQyZmZmZiwgMHg4ZmFiMDAzOCwgMHg4MDAyZDA5LAotMHgyMDI4MDIxLCAweDk0ZTYwMDAwLCAweDI0ZTcwMDAyLCAweDk0ZTUwMDAwLAotMHgyNGU3MDAwMiwgMHg5NGUzMDAwMCwgMHgyNGU3MDAwMiwgMHg5NGUyMDAwMCwKLTB4MjRlNzAwMDIsIDB4OTRlNDAwMDAsIDB4MjRlNzAwMDIsIDB4MjA2ODAyMSwKLTB4MjA1ODAyMSwgMHgyMDM4MDIxLCAweDIwMjgwMjEsIDB4OTRlMjAwMDAsCi0weDk0ZTMwMDAyLCAweDIwNDgwMjEsIDB4MjAyODAyMSwgMHgyMDM4MDIxLAotMHgxMDFjMDIsIDB4MzIwMmZmZmYsIDB4NjI4MDIxLCAweDEwMWMwMiwKLTB4MzIwMmZmZmYsIDB4OGVlNDdiOWMsIDB4NjI4MDIxLCAweDE0OTUwMDA0LAotMHgzMjA1ZmZmZiwgMHg5NjYyMDAxNiwgMHg4MDAyZDE3LCAweDUxMjAyMSwKLTB4OTY2MjAwMTYsIDB4NTQyMDIxLCAweDQxNDAyLCAweDMwODNmZmZmLAotMHg0MzIwMjEsIDB4ODUyMDIzLCAweDQxNDAyLCAweDgyMjAyMSwKLTB4MzA4NGZmZmYsIDB4NTA4MDAwMDEsIDB4MzQwNGZmZmYsIDB4OGVlMjdiYTQsCi0weDI0NDMwMDE3LCAweDM3ZTEwMjEsIDB4NjIxMDJiLCAweDUwNDAwMDAxLAotMHg2YjE4MjEsIDB4OTA2MzAwMDAsIDB4MjQwMjAwMTEsIDB4MTQ2MjAwMzEsCi0weDI0MDIwMDA2LCAweDhlZTI3YmE0LCAweDM3ZTE4MjEsIDB4MjQ0MjAwMjgsCi0weDQzMTAyYiwgMHgxNDQwMDAxOCwgMHgwLCAweDhlZTI3YjljLAotMHgxMmEyMDAwYSwgMHgzMmMyMDEwMCwgMHg4ZWUyN2JhNCwgMHgzYzAxZmZmZiwKLTB4MjIwODIxLCAweDk0MjIwMDI4LCAweDgyMjAyMSwgMHg0MWMwMiwKLTB4MzA4MmZmZmYsIDB4NjIyMDIxLCAweDMyYzIwMTAwLCAweDE0NDAwMDA0LAotMHg0MTAyNywgMHg5MmUyN2I5OCwgMHgxNDQwMDAwMiwgMHg0MTAyNywKLTB4MzA0NGZmZmYsIDB4OGVlMjdiYTQsIDB4M2MwMWZmZmYsIDB4MjIwODIxLAotMHg4MDAyZDhhLCAweGE0MjQwMDI4LCAweDhlZTI3YjljLCAweDEyYTIwMDA4LAotMHgzMmMyMDEwMCwgMHg4ZWUyN2JhNCwgMHg5NDQyMDAyOCwgMHg4MjIwMjEsCi0weDQxYzAyLCAweDMwODJmZmZmLCAweDYyMjAyMSwgMHgzMmMyMDEwMCwKLTB4MTQ0MDAwMDQsIDB4NDEwMjcsIDB4OTJlMjdiOTgsIDB4MTQ0MDAwMDIsCi0weDQxMDI3LCAweDMwNDRmZmZmLCAweDhlZTI3YmE0LCAweDgwMDJkOGEsCi0weGE0NDQwMDI4LCAweDE0NjIwMDJmLCAweDM3ZTE4MjEsIDB4OGVlMjdiYTQsCi0weDI0NDIwMDMyLCAweDQzMTAyYiwgMHgxNDQwMDAxOCwgMHgwLAotMHg4ZWUyN2I5YywgMHgxMmEyMDAwYSwgMHgzMmMyMDEwMCwgMHg4ZWUyN2JhNCwKLTB4M2MwMWZmZmYsIDB4MjIwODIxLCAweDk0MjIwMDMyLCAweDgyMjAyMSwKLTB4NDFjMDIsIDB4MzA4MmZmZmYsIDB4NjIyMDIxLCAweDMyYzIwMTAwLAotMHgxNDQwMDAwNCwgMHg0MTAyNywgMHg5MmUyN2I5OCwgMHgxNDQwMDAwMiwKLTB4NDEwMjcsIDB4MzA0NGZmZmYsIDB4OGVlMjdiYTQsIDB4M2MwMWZmZmYsCi0weDIyMDgyMSwgMHg4MDAyZDhhLCAweGE0MjQwMDMyLCAweDhlZTI3YjljLAotMHgxMmEyMDAwOCwgMHgzMmMyMDEwMCwgMHg4ZWUyN2JhNCwgMHg5NDQyMDAzMiwKLTB4ODIyMDIxLCAweDQxYzAyLCAweDMwODJmZmZmLCAweDYyMjAyMSwKLTB4MzJjMjAxMDAsIDB4MTQ0MDAwMDQsIDB4NDEwMjcsIDB4OTJlMjdiOTgsCi0weDE0NDAwMDAyLCAweDQxMDI3LCAweDMwNDRmZmZmLCAweDhlZTI3YmE0LAotMHhhNDQ0MDAzMiwgMHg4ZmFjMDAyNCwgMHgxMTgwMDAyYywgMHgzN2UxODIxLAotMHg4ZTQyMDAwMCwgMHhhZTQyZmZmYywgMHgyNjQyMDAwYSwgMHg0MzEwMmIsCi0weDE0NDAwMDFiLCAweDM0MDM4MTAwLCAweDI2NDMwMDA0LCAweDM3ZTEwMjEsCi0weDYyMTAyYiwgMHgxNDQwMDAwMywgMHg2MDIwMjEsIDB4NmIxODIxLAotMHg2MDIwMjEsIDB4OGM2MjAwMDAsIDB4MjQ2MzAwMDQsIDB4YWU0MjAwMDAsCi0weDM3ZTEwMjEsIDB4NjIxMDJiLCAweDUwNDAwMDAxLCAweDZiMTgyMSwKLTB4OGM2MjAwMDAsIDB4YWM4MjAwMDAsIDB4MzQwMjgxMDAsIDB4YTQ2MjAwMDAsCi0weDI0NjMwMDAyLCAweDM3ZTEwMjEsIDB4NjIxMDJiLCAweDUwNDAwMDAxLAotMHg2YjE4MjEsIDB4OTdhYzAwMmUsIDB4ODAwMmRiNCwgMHhhNDZjMDAwMCwKLTB4OGU0MjAwMDQsIDB4OGU0NDAwMDgsIDB4YTY0MzAwMDgsIDB4OTdhYzAwMmUsCi0weGE2NGMwMDBhLCAweGFlNDIwMDAwLCAweGFlNDQwMDA0LCAweDk2NjIwMDBlLAotMHgyNjUyZmZmYywgMHgyNDQyMDAwNCwgMHhhNjYyMDAwZSwgMHg5NjYyMDAwZSwKLTB4OGVlMzcyNWMsIDB4NjIxODIxLCAweGFlZTM3MjVjLCAweGFmYjIwMDE4LAotMHg4ZWUzNzI1YywgMHhhZmEzMDAxYywgMHg4ZWUyNzI1YywgMHgyYzQyMDAzYywKLTB4MTA0MDAwMDQsIDB4MjQ2MjAwMDEsIDB4MjQwM2ZmZmUsIDB4NDMxMDI0LAotMHhhZmEyMDAxYywgMHgzMmMyMDA4MCwgMHgxMDQwMDAwYywgMHgzMmMyMDEwMCwKLTB4OGVlMjdiYTgsIDB4MjQ0MzAwMDEsIDB4MjEwYzAsIDB4NTcxMDIxLAotMHhhZWUzN2JhOCwgMHg4ZmEzMDAxOCwgMHg4ZmE0MDAxYywgMHhhYzQzN2JhYywKLTB4YWM0NDdiYjAsIDB4ODAwMmVhMCwgMHhhZWUwNzI1YywgMHgxMDQwMDA3MiwKLTB4MCwgMHg4ZWUyN2JhOCwgMHgyNDQzMDAwMSwgMHgyMTBjMCwKLTB4NTcxMDIxLCAweGFlZTM3YmE4LCAweDhmYTMwMDE4LCAweDhmYTQwMDFjLAotMHhhYzQzN2JhYywgMHhhYzQ0N2JiMCwgMHg4ZWUyN2JhOCwgMHgxMDQwMDA2MywKLTB4NDgyMSwgMHg1MDIxLCAweDhmODIwMGYwLCAweDI0NDgwMDA4LAotMHgyNzYyMTgwMCwgMHgxMDIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjgxMDAwLAotMHg4ZjgyMDBmNCwgMHgxNTAyMDAwNywgMHgwLCAweDhlZTIwMWI0LAotMHg4MDIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWI0LCAweDgwMDJkZmEsCi0weDhlZTIwMWI0LCAweDhmODMwMGYwLCAweDI0MTAwMDAxLCAweDE1NzEwMjEsCi0weDhjNDQ3YmFjLCAweDhjNDU3YmIwLCAweGFjNjQwMDAwLCAweGFjNjUwMDA0LAotMHhhZjg4MDBmMCwgMHgxNjAwMDAwNiwgMHgyZWExMDIxLCAweDhlZTIwMDg4LAotMHgyNDQyMDAwMSwgMHhhZWUyMDA4OCwgMHg4MDAyZTNmLCAweDhlZTIwMDg4LAotMHg4YzQyN2JiMCwgMHg4ZWU0MDBlMCwgMHg4ZWU1MDBlNCwgMHg4ZWU2N2I5YywKLTB4NDAxODIxLCAweDEwMjEsIDB4YTMyODIxLCAweGEzMzgyYiwKLTB4ODIyMDIxLCAweDg3MjAyMSwgMHg4ZWUyMDRmYywgMHhjOTMwMjEsCi0weDYzMTAwLCAweGFlZTQwMGUwLCAweGFlZTUwMGU0LCAweGMyMzAyMSwKLTB4OTRjMjAwMGEsIDB4MjQwYzAwMDIsIDB4MjExNDIsIDB4MzA0MzAwMDMsCi0weDEwNmMwMDE2LCAweDI4NjIwMDAzLCAweDEwNDAwMDA1LCAweDI0MGMwMDAxLAotMHgxMDZjMDAwOCwgMHgwLCAweDgwMDJlM2YsIDB4MCwKLTB4MjQwYzAwMDMsIDB4MTA2YzAwMTcsIDB4MCwgMHg4MDAyZTNmLAotMHgwLCAweDhlZTIwMGU4LCAweDhlZTMwMGVjLCAweDI0NjMwMDAxLAotMHgyYzY0MDAwMSwgMHg0NDEwMjEsIDB4YWVlMjAwZTgsIDB4YWVlMzAwZWMsCi0weDhlZTIwMGU4LCAweDgwMDJlM2YsIDB4OGVlMzAwZWMsIDB4OGVlMjAwZjAsCi0weDhlZTMwMGY0LCAweDI0NjMwMDAxLCAweDJjNjQwMDAxLCAweDQ0MTAyMSwKLTB4YWVlMjAwZjAsIDB4YWVlMzAwZjQsIDB4OGVlMjAwZjAsIDB4ODAwMmUzZiwKLTB4OGVlMzAwZjQsIDB4OGVlMjAwZjgsIDB4OGVlMzAwZmMsIDB4MjQ2MzAwMDEsCi0weDJjNjQwMDAxLCAweDQ0MTAyMSwgMHhhZWUyMDBmOCwgMHhhZWUzMDBmYywKLTB4OGVlMjAwZjgsIDB4OGVlMzAwZmMsIDB4OGVlMjdiYTgsIDB4MjUyOTAwMDEsCi0weDEyMjEwMmIsIDB4MTQ0MGZmYTAsIDB4MjU0YTAwMDgsIDB4YTJlMDdiOTgsCi0weDgwMDJlOWYsIDB4YWVlMDdiYTgsIDB4OGY4MjAwZjAsIDB4MjQ0NzAwMDgsCi0weDI3NjIxODAwLCAweGUyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY3MTAwMCwKLTB4OGY4MjAwZjQsIDB4MTRlMjAwMDcsIDB4MCwgMHg4ZWUyMDFiNCwKLTB4ODAyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFiNCwgMHg4MDAyZTVkLAotMHg4ZWUyMDFiNCwgMHg4ZjgyMDBmMCwgMHgyNDEwMDAwMSwgMHg4ZmEzMDAxOCwKLTB4OGZhNDAwMWMsIDB4YWM0MzAwMDAsIDB4YWM0NDAwMDQsIDB4YWY4NzAwZjAsCi0weDE2MDAwMDA3LCAweDAsIDB4OGVlMjAwODgsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMDg4LCAweDhlZTIwMDg4LCAweDgwMDJlYTAsIDB4YWVlMDcyNWMsCi0weDhlZTI3MjVjLCAweDhlZTQwMGUwLCAweDhlZTUwMGU0LCAweDI0MGMwMDAyLAotMHg0MDE4MjEsIDB4MTAyMSwgMHhhMzI4MjEsIDB4YTMzMDJiLAotMHg4MjIwMjEsIDB4ODYyMDIxLCAweDE2MTE0MiwgMHgzMDQzMDAwMywKLTB4YWVlNDAwZTAsIDB4YWVlNTAwZTQsIDB4MTA2YzAwMTcsIDB4MmM2MjAwMDMsCi0weDEwNDAwMDA1LCAweDI0MGMwMDAxLCAweDEwNmMwMDA4LCAweDAsCi0weDgwMDJlYTAsIDB4YWVlMDcyNWMsIDB4MjQwYzAwMDMsIDB4MTA2YzAwMTksCi0weDAsIDB4ODAwMmVhMCwgMHhhZWUwNzI1YywgMHg4ZWUyMDBlOCwKLTB4OGVlMzAwZWMsIDB4MjQ2MzAwMDEsIDB4MmM2NDAwMDEsIDB4NDQxMDIxLAotMHhhZWUyMDBlOCwgMHhhZWUzMDBlYywgMHg4ZWUyMDBlOCwgMHg4ZWUzMDBlYywKLTB4ODAwMmVhMCwgMHhhZWUwNzI1YywgMHg4ZWUyMDBmMCwgMHg4ZWUzMDBmNCwKLTB4MjQ2MzAwMDEsIDB4MmM2NDAwMDEsIDB4NDQxMDIxLCAweGFlZTIwMGYwLAotMHhhZWUzMDBmNCwgMHg4ZWUyMDBmMCwgMHg4ZWUzMDBmNCwgMHg4MDAyZWEwLAotMHhhZWUwNzI1YywgMHg4ZWUyMDBmOCwgMHg4ZWUzMDBmYywgMHgyNDYzMDAwMSwKLTB4MmM2NDAwMDEsIDB4NDQxMDIxLCAweGFlZTIwMGY4LCAweGFlZTMwMGZjLAotMHg4ZWUyMDBmOCwgMHg4ZWUzMDBmYywgMHhhZWUwNzI1YywgMHg4ZTYyMDAxYywKLTB4OTZlMzA0NTgsIDB4OGVlNDA0ZjAsIDB4MjQ0MjAwMDEsIDB4MjQ2M2ZmZmYsCi0weDQzMTAyNCwgMHgyNDg0MDAwMSwgMHhhZWUyMDRlNCwgMHhhZWU0MDRmMCwKLTB4OGY0MjAyM2MsIDB4ODIyMDJiLCAweDE0ODAwMGIwLCAweDAsCi0weDhmODMwMTIwLCAweDI3NjIzODAwLCAweDI0NjYwMDIwLCAweGMyMTAyYiwKLTB4NTA0MDAwMDEsIDB4Mjc2NjMwMDAsIDB4OGY4MjAxMjgsIDB4MTBjMjAwMDQsCi0weDAsIDB4OGY4MjAxMjQsIDB4MTRjMjAwMDcsIDB4MCwKLTB4OGVlMjAxYTQsIDB4ODAyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwKLTB4ODAwMmYwNywgMHg4ZWUyMDFhNCwgMHg4ZWUyMDRlNCwgMHhhYzYyMDAxYywKLTB4OGVlNDA0YjAsIDB4OGVlNTA0YjQsIDB4MjQ2MjAwMWMsIDB4YWM2MjAwMDgsCi0weDI0MDIwMDA4LCAweGE0NjIwMDBlLCAweDI0MDIwMDExLCAweGFjNjIwMDE4LAotMHhhYzY0MDAwMCwgMHhhYzY1MDAwNCwgMHg4ZWUyMDRjNCwgMHhhYzYyMDAxMCwKLTB4YWY4NjAxMjAsIDB4OTJlMjRlMjAsIDB4MTQ0MDAwMzcsIDB4MjQxMDAwMDEsCi0weDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsCi0weDhjODMwMDAwLCAweDI0MDIwMDEyLCAweDE0NjIwMDFmLCAweDAsCi0weDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAweDI0MGMwMDQwLAotMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwKLTB4OGVlMzRlMzAsIDB4MjQ0MjAwMDEsIDB4MTA0YzAwMDcsIDB4MCwKLTB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIDB4MTA2MjAwMDUsIDB4MCwKLTB4ODAwMmVmMSwgMHgwLCAweDE0NjAwMDA1LCAweDAsCi0weDhmODIwMTI4LCAweDI0NDIwMDIwLCAweGFmODIwMTI4LCAweDhmODIwMTI4LAotMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwKLTB4ODAwMmYwNywgMHgwLCAweDhlZTI0ZTMwLCAweDI0MGMwMDQwLAotMHgyNDQyMDAwMSwgMHg1MDRjMDAwMywgMHgxMDIxLCAweDhlZTI0ZTMwLAotMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwKLTB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHgyNDAyMDAxMiwgMHgyNDBjMDAwMSwKLTB4YWM4MjAwMDAsIDB4YWM4YzAwMDQsIDB4NTYwMDAwMGQsIDB4MjQxMDAwMDEsCi0weDhlZTIwNGU0LCAweDNjMDQwMDAxLCAweDI0ODQ1NzU0LCAweGFmYTAwMDE0LAotMHhhZmEyMDAxMCwgMHg4ZWU2MDYwOCwgMHg4ZjQ3MDIyOCwgMHgzYzA1MDAwOSwKLTB4MzRhNWYwMDYsIDB4YzAwMjQwMywgMHhhZmFiMDAzOCwgMHg4ZmFiMDAzOCwKLTB4MTYwMDAwMDMsIDB4MjQwYzAwMDEsIDB4ODAwMmY1YywgMHhhMmVjMDRmNCwKLTB4OGVlMjAxNzAsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxNzAsIDB4OGVlMjAxNzAsCi0weDhlZTIwNGU0LCAweGEyZTAwNGY0LCAweGFlZTAwNGYwLCAweGFlZTA3Mjc0LAotMHhhZWUyMDRmOCwgMHg4ZjQyMDIzYywgMHgxMDQwMDAzOCwgMHgwLAotMHg4ZWUyMDE4NCwgMHgyNDQyMDAwMSwgMHhhZWUyMDE4NCwgMHg4MDAyZjVjLAotMHg4ZWUyMDE4NCwgMHg4ZWUyMDUwNCwgMHgyNDBjMDA0MCwgMHgyNDQyMDAwMSwKLTB4NTA0YzAwMDMsIDB4MTAyMSwgMHg4ZWUyMDUwNCwgMHgyNDQyMDAwMSwKLTB4YWVlMjA1MDQsIDB4OGVlMjA1MDQsIDB4OGU2MzAwMTgsIDB4MjQwYzAwMDMsCi0weDIxMDgwLCAweDU3MTAyMSwgMHgxNDZjMDAwZiwgMHg4YzQ0MDUwOCwKLTB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDkwNDI4M2IxLCAweDEwNDAwMDE0LAotMHgwLCAweDhlZTIwMWQwLCAweDhlZTM1MjQwLCAweDQ0MTAyMSwKLTB4YWVlMjAxZDAsIDB4OGVlMjAxZDgsIDB4NjQxODIxLCAweDMwNjMwMGZmLAotMHg4MDAyZjRmLCAweGFlZTM1MjQwLCAweDhlZTIwMWNjLCAweDhlZTMwZTEwLAotMHg0NDEwMjEsIDB4YWVlMjAxY2MsIDB4OGVlMjAxZDgsIDB4NjQxODIxLAotMHgzMDYzMDFmZiwgMHhhZWUzMGUxMCwgMHg0NDEwMjEsIDB4YWVlMjAxZDgsCi0weDhlZTIwMDAwLCAweDM0NDIwMDQwLCAweDgwMDJmNWMsIDB4YWVlMjAwMDAsCi0weDhlZTIwMTRjLCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDIwODNlMCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxNGMsIDB4OGVlMjAxNGMsIDB4OGY4MjAxMDgsCi0weDI0NDIwMDIwLCAweGFmODIwMTA4LCAweDhmODIwMTA4LCAweDhmODIwMTA4LAotMHgyNzYzMzAwMCwgMHg0MzEwMmIsIDB4MTQ0MDAwMDIsIDB4Mjc2MjI4MDAsCi0weGFmODIwMTA4LCAweDhmODMwMTA4LCAweDhmODIwMTA0LCAweDE0NjJmYzFlLAotMHgwLCAweDhmYmYwMDYwLCAweDhmYmUwMDVjLCAweDhmYjYwMDU4LAotMHg4ZmI1MDA1NCwgMHg4ZmI0MDA1MCwgMHg4ZmIzMDA0YywgMHg4ZmIyMDA0OCwKLTB4OGZiMTAwNDQsIDB4OGZiMDAwNDAsIDB4M2UwMDAwOCwgMHgyN2JkMDA2OCwKLTB4NTI4NDMsIDB4MTBhMDAwMGQsIDB4MzAyMSwgMHgzYzAzMDAwMSwKLTB4MzQ2MzM4MDAsIDB4M2MwN2ZmZmYsIDB4MzYzMTAyMSwgMHg4MjEwMmIsCi0weDUwNDAwMDAxLCAweDg3MjAyMSwgMHg5NDgyMDAwMCwgMHgyNDg0MDAwMiwKLTB4MjRhNWZmZmYsIDB4MTRhMGZmZjgsIDB4YzIzMDIxLCAweDYxYzAyLAotMHgzMGMyZmZmZiwgMHg2MjMwMjEsIDB4NjFjMDIsIDB4MzBjMmZmZmYsCi0weDYyMzAyMSwgMHgzZTAwMDA4LCAweDMwYzJmZmZmLCAweDI3YmRmZjg4LAotMHgyNDBmMDAwMSwgMHhhZmJmMDA3MCwgMHhhZmJlMDA2YywgMHhhZmI2MDA2OCwKLTB4YWZiNTAwNjQsIDB4YWZiNDAwNjAsIDB4YWZiMzAwNWMsIDB4YWZiMjAwNTgsCi0weGFmYjEwMDU0LCAweGFmYjAwMDUwLCAweGEzYTAwMDI3LCAweGFmYWYwMDJjLAotMHg4ZWUyMDRkNCwgMHg4MDIxLCAweDMwNDIwMDAxLCAweDE0NDAwMDJhLAotMHhhM2EwMDAzNywgMHg4Zjg3MDBlMCwgMHg4Zjg4MDBjNCwgMHg4ZjgyMDBlOCwKLTB4ZTIyMDIzLCAweDJjODIxMDAwLCAweDUwNDAwMDAxLCAweDI0ODQxMDAwLAotMHg0MjBjMiwgMHg4MDE4MjEsIDB4OGVlNDAwYzgsIDB4OGVlNTAwY2MsCi0weDEwMjEsIDB4YTMyODIxLCAweGEzMzAyYiwgMHg4MjIwMjEsCi0weDg2MjAyMSwgMHhhZWU0MDBjOCwgMHhhZWU1MDBjYywgMHg4ZjgzMDBjOCwKLTB4M2MwMjAwMGEsIDB4MzQ0MmVmZmYsIDB4MTAzMjAyMywgMHg0NDEwMmIsCi0weDEwNDAwMDAzLCAweDNjMDIwMDBhLCAweDM0NDJmMDAwLCAweDgyMjAyMSwKLTB4ODAxODIxLCAweDhlZTQwMGMwLCAweDhlZTUwMGM0LCAweDEwMjEsCi0weGEzMjgyMSwgMHhhMzMwMmIsIDB4ODIyMDIxLCAweDg2MjAyMSwKLTB4YWVlNDAwYzAsIDB4YWVlNTAwYzQsIDB4YWY4ODAwYzgsIDB4YWY4NzAwZTQsCi0weDgwMDM0Y2MsIDB4YWY4NzAwZTgsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLAotMHg5MDQyODNjMCwgMHgxMDQwMDAwYiwgMHgwLCAweDNjMTQwMDAxLAotMHgyOTdhMDIxLCAweDhlOTQ4M2M0LCAweDNjMTMwMDAxLCAweDI3Nzk4MjEsCi0weDhlNzM4M2M4LCAweDNjMTIwMDAxLCAweDI1NzkwMjEsIDB4ODAwMzE5MywKLTB4OGU1MjgzY2MsIDB4OGY4MzAwZTAsIDB4OGY4MjAwZTQsIDB4MTA0MzAwMDcsCi0weDg4MjEsIDB4OGY4MjAwZTQsIDB4MjQxMTAwMDEsIDB4OGM0MzAwMDAsCi0weDhjNDQwMDA0LCAweGFmYTMwMDE4LCAweGFmYTQwMDFjLCAweDE2MjAwMDBlLAotMHgzYzAyZmZmZiwgMHg4ZjgyMDBjNCwgMHhhZmEyMDAxMCwgMHg4ZjgyMDBjOCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDU4NzAsIDB4YWZhMjAwMTQsIDB4OGY4NjAwZTAsCi0weDhmODcwMGU0LCAweDNjMDUwMDA2LCAweGMwMDI0MDMsIDB4MzRhNWYwMDAsCi0weDgwMDM0Y2MsIDB4MCwgMHg4ZmEzMDAxYywgMHg4ZmIyMDAxOCwKLTB4MzA3NGZmZmYsIDB4MjY5NGZmZmMsIDB4NjIxMDI0LCAweDEwNDAwMDU4LAotMHgyNDA5ODIxLCAweDNjMDIwMDgwLCAweDYyMTAyNCwgMHgxMDQwMDAwYSwKLTB4M2MwNDAwNDAsIDB4OGVlMjAwN2MsIDB4MjQ0MjAwMDEsIDB4YWVlMjAwN2MsCi0weDhlZTIwMDdjLCAweDhlZTIwMWZjLCAweDI0NDIwMDAxLCAweGFlZTIwMWZjLAotMHg4MDAzNGM2LCAweDhlZTIwMWZjLCAweDNjMDYwMDA0LCAweDNjMGIwMDAxLAotMHgzYzBhMDAwMiwgMHgzYzA1MDAxMCwgMHgzYzA5MDAwOCwgMHg4ZWUyMDA4MCwKLTB4M2MwODAwMjAsIDB4MzQwNzgwMDAsIDB4MjQ0MjAwMDEsIDB4YWVlMjAwODAsCi0weDhlZTIwMDgwLCAweDhmYTIwMDFjLCAweDQ0MTgyNCwgMHgxMDY2MDAyMSwKLTB4YzMxMDJiLCAweDE0NDAwMDA3LCAweDAsIDB4MTA2YjAwMTEsCi0weDAsIDB4MTA2YTAwMTUsIDB4MCwgMHg4MDAzMDQ5LAotMHg0MjA0MiwgMHgxMDY1MDAyMywgMHhhMzEwMmIsIDB4MTQ0MDAwMDUsCi0weDAsIDB4MTA2OTAwMTksIDB4MCwgMHg4MDAzMDQ5LAotMHg0MjA0MiwgMHgxMDY4MDAyMSwgMHgwLCAweDgwMDMwNDksCi0weDQyMDQyLCAweDhlZTIwMDM0LCAweDI0NDIwMDAxLCAweGFlZTIwMDM0LAotMHg4ZWUyMDAzNCwgMHg4MDAzMDQ5LCAweDQyMDQyLCAweDhlZTIwMWVjLAotMHgyNDQyMDAwMSwgMHhhZWUyMDFlYywgMHg4ZWUyMDFlYywgMHg4MDAzMDQ5LAotMHg0MjA0MiwgMHg4ZWUyMDFmMCwgMHgyNDQyMDAwMSwgMHhhZWUyMDFmMCwKLTB4OGVlMjAxZjAsIDB4ODAwMzA0OSwgMHg0MjA0MiwgMHg4ZWUyMDFmNCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxZjQsIDB4OGVlMjAxZjQsIDB4ODAwMzA0OSwKLTB4NDIwNDIsIDB4OGVlMjAwMzAsIDB4MjQ0MjAwMDEsIDB4YWVlMjAwMzAsCi0weDhlZTIwMDMwLCAweDgwMDMwNDksIDB4NDIwNDIsIDB4OGVlMjAxZjgsCi0weDI0NDIwMDAxLCAweGFlZTIwMWY4LCAweDhlZTIwMWY4LCAweDQyMDQyLAotMHgxMDg3MDQ3YywgMHgwLCAweDgwMDMwMGUsIDB4MCwKLTB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDkwNDI4M2IyLCAweDE0NDAwMDg0LAotMHgyNDAyMDAwMSwgMHgzYzAzMDAwMSwgMHg3NzE4MjEsIDB4OTA2MzgzYjMsCi0weDE0NjIwMDdmLCAweDNjMDIwMTAwLCAweDhlNDMwMDAwLCAweDYyMTAyNCwKLTB4MTA0MDAwNmYsIDB4MjQwMmZmZmYsIDB4MTQ2MjAwMDUsIDB4MjQxMDAwMDEsCi0weDk2NDMwMDA0LCAweDM0MDJmZmZmLCAweDEwNjIwMDc1LCAweDAsCi0weDkyZTIwNGQ4LCAweDE0NDAwMDcyLCAweDAsIDB4M2MwMjAwMDEsCi0weDU3MTAyMSwgMHg4YzQyODNiNCwgMHgyODQyMDAwNSwgMHgxMDQwMDAyMCwKLTB4MzgyMSwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OGM0MjgzYjQsCi0weDE4NDAwMDE2LCAweDI4MjEsIDB4OTY2NjAwMDAsIDB4NTIwYzAsCi0weDk3MTAyMSwgMHg5NDQyNzc3ZSwgMHgxNDQ2MDAwOSwgMHg5NzEwMjEsCi0weDk0NDM3NzgwLCAweDk2NjIwMDAyLCAweDE0NjIwMDA1LCAweDk3MTAyMSwKLTB4OTQ0Mzc3ODIsIDB4OTY2MjAwMDQsIDB4NTA2MjAwMDgsIDB4MjQwNzAwMDEsCi0weDNjMDIwMDAxLCAweDU3MTAyMSwgMHg4YzQyODNiNCwgMHgyNGE1MDAwMSwKLTB4YTIxMDJhLCAweDU0NDBmZmVlLCAweDUyMGMwLCAweDMwZTIwMGZmLAotMHgxMDQwMDQ0MCwgMHgwLCAweDgwMDMwZDUsIDB4MCwKLTB4MjQwMjAyMSwgMHhjMDAyMmZlLCAweDI0MDUwMDA2LCAweDMwNDQwMDFmLAotMHg0MjhjMCwgMHgyZTUxMDIxLCAweDk0NDI3MjdjLCAweDMwNDI0MDAwLAotMHgxNDQwMDQzNCwgMHhiNzEwMjEsIDB4OTQ0MzcyN2UsIDB4OTY2MjAwMDAsCi0weDE0NjIwMDBiLCAweDQxOGMwLCAweGI3MTAyMSwgMHg5NDQzNzI4MCwKLTB4OTY2MjAwMDIsIDB4MTQ2MjAwMDYsIDB4NDE4YzAsIDB4YjcxMDIxLAotMHg5NDQzNzI4MiwgMHg5NjYyMDAwNCwgMHgxMDYyMDAzNSwgMHg0MThjMCwKLTB4MmUzMTAyMSwgMHg5NDQyNzI3YywgMHgzMDQyODAwMCwgMHgxNDQwMDQyMSwKLTB4MmUzMTAyMSwgMHg5NDRiNzI3YywgMHg5NjY3MDAwMCwgMHhiMjhjMCwKLTB4YjcxMDIxLCAweDk0NDI3MzdlLCAweDgwMDMwYjcsIDB4MzAyMSwKLTB4NDIwYzAsIDB4MmU0MTAyMSwgMHg5NDQzNzM3YywgMHgyZTQxMDIxLAotMHg5NDRiNzM3YywgMHgzMDYzODAwMCwgMHgxNDYwMDAxMCwgMHhiMjhjMCwKLTB4YjcxMDIxLCAweDk0NDI3MzdlLCAweDE0NDdmZmY1LCAweDE2MDIwMjEsCi0weGI3MTAyMSwgMHg5NDQzNzM4MCwgMHg5NjYyMDAwMiwgMHg1NDYyZmZmMSwKLTB4NDIwYzAsIDB4YjcxMDIxLCAweDk0NDM3MzgyLCAweDk2NjIwMDA0LAotMHg1NDYyZmZlYywgMHg0MjBjMCwgMHgyNDA2MDAwMSwgMHgzMGMyMDBmZiwKLTB4MTA0MDA0MDAsIDB4MCwgMHg4MDAzMGQ1LCAweDAsCi0weDk3NDMwMjAyLCAweDk2NDIwMDAwLCAweDE0NjIwM2ZhLCAweDAsCi0weDk3NDMwMjA0LCAweDk2NDIwMDAyLCAweDE0NjIwM2Y2LCAweDAsCi0weDk3NDMwMjA2LCAweDk2NDIwMDA0LCAweDE0NjIwM2YyLCAweDAsCi0weDkyNDIwMDAwLCAweDNhMDMwMDAxLCAweDMwNDIwMDAxLCAweDQzMTAyNCwKLTB4MTA0MDAwNzQsIDB4MjQwMmZmZmYsIDB4OGU2MzAwMDAsIDB4MTQ2MjAwMDQsCi0weDM0MDJmZmZmLCAweDk2NjMwMDA0LCAweDEwNjIwMDZmLCAweDI0MGYwMDAyLAotMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OTA0MjgzYjIsIDB4MTQ0MDAwNmEsCi0weDI0MGYwMDAzLCAweDkyZTIwNGQ4LCAweDU0NDAwMDY4LCAweGFmYWYwMDJjLAotMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OGM0MjgzYjQsIDB4Mjg0MjAwMDUsCi0weDEwNDAwMDIwLCAweDM4MjEsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLAotMHg4YzQyODNiNCwgMHgxODQwMDAxNiwgMHgyODIxLCAweDk2NjYwMDAwLAotMHg1MjBjMCwgMHg5NzEwMjEsIDB4OTQ0Mjc3N2UsIDB4MTQ0NjAwMDksCi0weDk3MTAyMSwgMHg5NDQzNzc4MCwgMHg5NjYyMDAwMiwgMHgxNDYyMDAwNSwKLTB4OTcxMDIxLCAweDk0NDM3NzgyLCAweDk2NjIwMDA0LCAweDUwNjIwMDA4LAotMHgyNDA3MDAwMSwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OGM0MjgzYjQsCi0weDI0YTUwMDAxLCAweGEyMTAyYSwgMHg1NDQwZmZlZSwgMHg1MjBjMCwKLTB4MzBlMjAwZmYsIDB4MTQ0MDAwNDQsIDB4MjQwZjAwMDMsIDB4ODAwMzRjNiwKLTB4MCwgMHgyNDAyMDIxLCAweGMwMDIyZmUsIDB4MjQwNTAwMDYsCi0weDMwNDQwMDFmLCAweDQyOGMwLCAweDJlNTEwMjEsIDB4OTQ0MjcyN2MsCi0weDMwNDI0MDAwLCAweDE0NDAwM2FmLCAweGI3MTAyMSwgMHg5NDQzNzI3ZSwKLTB4OTY2MjAwMDAsIDB4MTQ2MjAwMGIsIDB4NDE4YzAsIDB4YjcxMDIxLAotMHg5NDQzNzI4MCwgMHg5NjYyMDAwMiwgMHgxNDYyMDAwNiwgMHg0MThjMCwKLTB4YjcxMDIxLCAweDk0NDM3MjgyLCAweDk2NjIwMDA0LCAweDEwNjIwMDI3LAotMHg0MThjMCwgMHgyZTMxMDIxLCAweDk0NDI3MjdjLCAweDMwNDI4MDAwLAotMHgxNDQwMDM5YywgMHgyZTMxMDIxLCAweDk0NGI3MjdjLCAweDk2NjcwMDAwLAotMHhiMjhjMCwgMHhiNzEwMjEsIDB4OTQ0MjczN2UsIDB4ODAwMzEzYywKLTB4MzAyMSwgMHg0MjBjMCwgMHgyZTQxMDIxLCAweDk0NDM3MzdjLAotMHgyZTQxMDIxLCAweDk0NGI3MzdjLCAweDMwNjM4MDAwLCAweDE0NjAwMDEwLAotMHhiMjhjMCwgMHhiNzEwMjEsIDB4OTQ0MjczN2UsIDB4MTQ0N2ZmZjUsCi0weDE2MDIwMjEsIDB4YjcxMDIxLCAweDk0NDM3MzgwLCAweDk2NjIwMDAyLAotMHg1NDYyZmZmMSwgMHg0MjBjMCwgMHhiNzEwMjEsIDB4OTQ0MzczODIsCi0weDk2NjIwMDA0LCAweDU0NjJmZmVjLCAweDQyMGMwLCAweDI0MDYwMDAxLAotMHgzMGMyMDBmZiwgMHgxMDQwMDM3YiwgMHgwLCAweDgwMDMxNGYsCi0weDI0MGYwMDAzLCAweDI0MGYwMDAxLCAweGFmYWYwMDJjLCAweDhmNDIwMjYwLAotMHg1NDEwMmIsIDB4MTA0MDAwM2EsIDB4MCwgMHg4ZjgzMDBlNCwKLTB4OGY4MjAwZTAsIDB4MTA2MjAwMDMsIDB4MjQ2MzAwMDgsIDB4YWY4MzAwZTQsCi0weGFmODMwMGU4LCAweDhlZTQwMGMwLCAweDhlZTUwMGM0LCAweDI4MDE4MjEsCi0weDEwMjEsIDB4YTMyODIxLCAweGEzMzAyYiwgMHg4MjIwMjEsCi0weDg2MjAyMSwgMHhhZWU0MDBjMCwgMHhhZWU1MDBjNCwgMHg4ZWUyMDA1OCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAwNTgsIDB4OGVlMjAwNTgsIDB4OGVlMjAwN2MsCi0weDI0NDIwMDAxLCAweGFlZTIwMDdjLCAweDhlZTIwMDdjLCAweDhmODIwMGUwLAotMHhhZmEyMDAxMCwgMHg4ZjgyMDBlNCwgMHgzYzA0MDAwMSwgMHgyNDg0NTg3OCwKLTB4YWZhMjAwMTQsIDB4OGZhNjAwMTgsIDB4OGZhNzAwMWMsIDB4M2MwNTAwMDYsCi0weGMwMDI0MDMsIDB4MzRhNWYwMDMsIDB4ODAwMzRjYywgMHgwLAotMHg4ZWUyNTI0MCwgMHhhZmEyMDAxMCwgMHg4ZWUyNTI0NCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDU4ODQsIDB4YWZhMjAwMTQsIDB4OGVlNjBlMTAsIDB4OGVlNzBlMTgsCi0weDNjMDUwMDA2LCAweGMwMDI0MDMsIDB4MzRhNWYwMDIsIDB4OGVlMjAxYzAsCi0weDI0NDIwMDAxLCAweGFlZTIwMWMwLCAweDhlZTIwMDAwLCAweDhlZTMwMWMwLAotMHgyNDAzZmZiZiwgMHg0MzEwMjQsIDB4ODAwMzQ3MCwgMHhhZWUyMDAwMCwKLTB4OTZlMjA0NjgsIDB4NTQxMDJiLCAweDEwNDAwMDAzLCAweDAsCi0weDI0MGYwMDAxLCAweGEzYWYwMDI3LCAweDEyODAwMzAxLCAweDI0MTYwMDA3LAotMHgyNDE1MDA0MCwgMHgyNDFlMDAwMSwgMHgyNDBlMDAxMiwgMHg4ZWUyNzI0YywKLTB4OGY0MzAyODAsIDB4MjQ0MjAwMDEsIDB4MzA0MjA3ZmYsIDB4MTA2MjAyZDMsCi0weDAsIDB4OTNhMjAwMjcsIDB4MTA0MDAwMTQsIDB4MCwKLTB4OGVlMzUyNDAsIDB4OGVlMjUyNDQsIDB4MTA2MjAwMDksIDB4MjZlZDUyNDQsCi0weDhlZTY1MjQ0LCAweDhlZTM1MjQ0LCAweDIxMTQwLCAweDI0NDI1MjQ4LAotMHgyZTI4MDIxLCAweDI0NjMwMDAxLCAweDgwMDMxYmYsIDB4MzA2YjAwZmYsCi0weDkyZTI3MjQ4LCAweDE0NDBmZmNhLCAweDAsIDB4OGVlMjAxZTAsCi0weDI0NDIwMDAxLCAweGFlZTIwMWUwLCAweDhlZTIwMWUwLCAweDhlZTMwZTEwLAotMHg4ZWUyMGUxOCwgMHgxMDYyZmZjMiwgMHgyNmVkMGUxOCwgMHg4ZWU2MGUxOCwKLTB4OGVlMzBlMTgsIDB4MjExNDAsIDB4MjQ0MjBlMjAsIDB4MmUyODAyMSwKLTB4MjQ2MzAwMDEsIDB4MzA2YjAxZmYsIDB4OTZlMjA0NmEsIDB4MzA0MjAwMTAsCi0weDEwNDAwMDE5LCAweDAsIDB4OTY0MjAwMGMsIDB4MzQwZjgxMDAsCi0weDE0NGYwMDE1LCAweDAsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLAotMHg5MDQyODNjMCwgMHgxNDQwMDAxMCwgMHgwLCAweDk2NDIwMDBlLAotMHhhNjAyMDAxNiwgMHg4ZTQyMDAwOCwgMHg4ZTQzMDAwNCwgMHg4ZTQ0MDAwMCwKLTB4MjY5NGZmZmMsIDB4YWU0MjAwMGMsIDB4YWU0MzAwMDgsIDB4YWU0NDAwMDQsCi0weDk2MDIwMDBlLCAweDI2NzMwMDA0LCAweDI0MGYwMDAxLCAweGEzYWYwMDM3LAotMHgzNDQyMDIwMCwgMHhhNjAyMDAwZSwgMHg4ZTAyMDAwMCwgMHg4ZTAzMDAwNCwKLTB4M2MwNDAwMDEsIDB4MzQ4NDM4MDAsIDB4MzA2YTAwMDcsIDB4MjZhOTgyMywKLTB4MzY0MTAyMSwgMHgyNjIxMDJiLCAweDEwNDAwMDA1LCAweDI4YWEwMjEsCi0weDI2NDEwMjMsIDB4MzYyMTgyMywgMHgzYzAyMDAyMCwgMHg0Mzk4MjMsCi0weDI2ODIwMDA3LCAweDI0MDRmZmY4LCAweDk2MDMwMDBhLCAweDQ0NjAyNCwKLTB4NmExODIxLCAweDZjMTAyYiwgMHgxMDQwMDAwMiwgMHgxODAzODIxLAotMHg2MDM4MjEsIDB4YWUxMzAwMTgsIDB4OGY4ODAxMjAsIDB4MjRlMjAwMDcsCi0weDQ0MzgyNCwgMHgyNzYyMzgwMCwgMHgyNTA5MDAyMCwgMHgxMjIxMDJiLAotMHg1MDQwMDAwMSwgMHgyNzY5MzAwMCwgMHg4ZjgyMDEyOCwgMHgxMTIyMDAwNCwKLTB4MCwgMHg4ZjgyMDEyNCwgMHgxNTIyMDAwNywgMHgxNDAxODIxLAotMHg4ZWUyMDFhNCwgMHg4ODIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWE0LAotMHg4MDAzMjRjLCAweDhlZTIwMWE0LCAweDhlMDQwMDAwLCAweDhlMDUwMDA0LAotMHgxMDIxLCAweGFkMTMwMDA4LCAweGE1MDcwMDBlLCAweGFkMTYwMDE4LAotMHhhZDA2MDAxYywgMHhhMzMwMmIsIDB4YTMyODIzLCAweDgyMjAyMywKLTB4ODYyMDIzLCAweGFkMDQwMDAwLCAweGFkMDUwMDA0LCAweDhlZTIwNGMwLAotMHhhZDAyMDAxMCwgMHhhZjg5MDEyMCwgMHg5MmUyNGUyMCwgMHgxNDQwMDAzMywKLTB4MjQxMTAwMDEsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsCi0weDJlMjIwMjEsIDB4OGM4MjAwMDAsIDB4MTQ1NjAwMWYsIDB4MCwKLTB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIDB4MCwKLTB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsCi0weDhlZTM0ZTMwLCAweDI0NDIwMDAxLCAweDEwNTUwMDA3LCAweDAsCi0weDhlZTI0ZTM0LCAweDI0NDIwMDAxLCAweDEwNjIwMDA1LCAweDAsCi0weDgwMDMyMzksIDB4MCwgMHgxNDYwMDAwNSwgMHgwLAotMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwKLTB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIDB4NTA0MDAwMTAsIDB4YWM4MDAwMDAsCi0weDgwMDMyNGMsIDB4MCwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwKLTB4NTA1NTAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwKLTB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsCi0weDJlMjIwMjEsIDB4YWM5NjAwMDAsIDB4YWM5ZTAwMDQsIDB4MTYyMDAwMTgsCi0weDNjMDUwMDA2LCAweDhlMDIwMDE4LCAweDNjMDQwMDAxLCAweDI0ODQ1ODkwLAotMHhhZmEyMDAxMCwgMHg4ZTAyMDAwMCwgMHg4ZTAzMDAwNCwgMHgzNGE1ZjAwOSwKLTB4MjAwMzAyMSwgMHhjMDAyNDAzLCAweGFmYTMwMDE0LCAweDkzYTIwMDM3LAotMHgxMDQwMDIxNiwgMHgzNDBmODEwMCwgMHg4ZTQyMDAwNCwgMHg4ZTQzMDAwOCwKLTB4OGU0NDAwMGMsIDB4YTY0ZjAwMGMsIDB4YWU0MjAwMDAsIDB4YWU0MzAwMDQsCi0weGFlNDQwMDA4LCAweDk2MDIwMDE2LCAweDgwMDM0NzAsIDB4YTY0MjAwMGUsCi0weDE0ZWMwMTY4LCAweDI4YTE4MjMsIDB4OTYwYzAwMGEsIDB4OTYwMzAwMGUsCi0weDI4YTEwMjMsIDB4YTYwMjAwMGEsIDB4MzQ2MjAwMDQsIDB4YTYwMjAwMGUsCi0weDhmODgwMTIwLCAweDI3NjIzODAwLCAweDI1MDkwMDIwLCAweDEyMjEwMmIsCi0weDE0NDAwMDAyLCAweDMwNmFmZmZmLCAweDI3NjkzMDAwLCAweDhmODIwMTI4LAotMHgxMTIyMDAwNCwgMHgwLCAweDhmODIwMTI0LCAweDE1MjIwMDA3LAotMHgyNDA0MDAyMCwgMHg4ZWUyMDFhNCwgMHg4ODIxLCAweDI0NDIwMDAxLAotMHhhZWUyMDFhNCwgMHg4MDAzMmNhLCAweDhlZTIwMWE0LCAweDhlZTU3MjRjLAotMHg4ZWU2MDQ5MCwgMHg4ZWU3MDQ5NCwgMHhhNTA0MDAwZSwgMHgyNDA0MDAwNCwKLTB4YWQxMDAwMDgsIDB4YWQwNDAwMTgsIDB4NTI5NDAsIDB4YTAxODIxLAotMHgxMDIxLCAweGUzMzgyMSwgMHhlMzIwMmIsIDB4YzIzMDIxLAotMHhjNDMwMjEsIDB4YWQwNjAwMDAsIDB4YWQwNzAwMDQsIDB4OGVlMjcyNGMsCi0weGFkMDIwMDFjLCAweDhlZTIwNGM0LCAweGFkMDIwMDEwLCAweGFmODkwMTIwLAotMHg5MmUyNGUyMCwgMHgxNDQwMDAzMywgMHgyNDExMDAwMSwgMHg4ZWUyNGUzMCwKLTB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHg4YzgyMDAwMCwKLTB4MTQ1NjAwMWYsIDB4MCwgMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwKLTB4MTA2MjAwMWIsIDB4MCwgMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwKLTB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIDB4OGVlMzRlMzAsIDB4MjQ0MjAwMDEsCi0weDEwNTUwMDA3LCAweDAsIDB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsCi0weDEwNjIwMDA1LCAweDAsIDB4ODAwMzJiNywgMHgwLAotMHgxNDYwMDAwNSwgMHgwLCAweDhmODIwMTI4LCAweDI0NDIwMDIwLAotMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwKLTB4NTA0MDAwMTAsIDB4YWM4MDAwMDAsIDB4ODAwMzJjYSwgMHgwLAotMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHg1MDU1MDAwMywgMHgxMDIxLAotMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwKLTB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHhhYzk2MDAwMCwKLTB4YWM5ZTAwMDQsIDB4MTYyMDAwMGQsIDB4MCwgMHhhNjBjMDAwYSwKLTB4YTYwYTAwMGUsIDB4OGY4MjAxMDAsIDB4YWZhMjAwMTAsIDB4OGY4MjAxMDQsCi0weDNjMDQwMDAxLCAweDI0ODQ1ODljLCAweDNjMDUwMDA2LCAweGFmYTIwMDE0LAotMHg4ZWU2NzI0YywgMHg4MDAzNDNiLCAweDM0YTVmMDBiLCAweDNjMDEwMDAxLAotMHgzNzA4MjEsIDB4YTAyMDgzYzAsIDB4YWRhYjAwMDAsIDB4OGVlMjAxZDgsCi0weDhlZTM3MjRjLCAweDI0NDJmZmZmLCAweGFlZTIwMWQ4LCAweDhlZTIwMWQ4LAotMHgyNDYzMDAwMSwgMHgzMDYzMDdmZiwgMHgyNmUyNTI0NCwgMHgxNWEyMDAwNiwKLTB4YWVlMzcyNGMsIDB4OGVlMjAxZDAsIDB4MjQ0MmZmZmYsIDB4YWVlMjAxZDAsCi0weDgwMDMyZWYsIDB4OGVlMjAxZDAsIDB4OGVlMjAxY2MsIDB4MjQ0MmZmZmYsCi0weGFlZTIwMWNjLCAweDhlZTIwMWNjLCAweDhmNDIwMjQwLCAweDEwNDAwMDczLAotMHgwLCAweDhlZTIwZTFjLCAweDI0NDIwMDAxLCAweGFlZTIwZTFjLAotMHg4ZjQzMDI0MCwgMHg0MzEwMmIsIDB4MTQ0MDAxNzYsIDB4YTAyMSwKLTB4OGY4MzAxMjAsIDB4Mjc2MjM4MDAsIDB4MjQ2NjAwMjAsIDB4YzIxMDJiLAotMHg1MDQwMDAwMSwgMHgyNzY2MzAwMCwgMHg4ZjgyMDEyOCwgMHgxMGMyMDAwNCwKLTB4MCwgMHg4ZjgyMDEyNCwgMHgxNGMyMDAwNywgMHgwLAotMHg4ZWUyMDFhNCwgMHg4ODIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWE0LAotMHg4MDAzMzRmLCAweDhlZTIwMWE0LCAweDhlZTI3MjRjLCAweGFjNjIwMDFjLAotMHg4ZWU0MDRhOCwgMHg4ZWU1MDRhYywgMHgyNDYyMDAxYywgMHhhYzYyMDAwOCwKLTB4MjQwMjAwMDgsIDB4YTQ2MjAwMGUsIDB4MjQwMjAwMTEsIDB4YWM2MjAwMTgsCi0weGFjNjQwMDAwLCAweGFjNjUwMDA0LCAweDhlZTIwNGM0LCAweGFjNjIwMDEwLAotMHhhZjg2MDEyMCwgMHg5MmUyNGUyMCwgMHgxNDQwMDAzMywgMHgyNDExMDAwMSwKLTB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwKLTB4OGM4MjAwMDAsIDB4MTQ0ZTAwMWYsIDB4MCwgMHg4ZWUzNGUzMCwKLTB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIDB4MCwgMHg4YzgyMDAwNCwKLTB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIDB4OGVlMzRlMzAsCi0weDI0NDIwMDAxLCAweDEwNTUwMDA3LCAweDAsIDB4OGVlMjRlMzQsCi0weDI0NDIwMDAxLCAweDEwNjIwMDA1LCAweDAsIDB4ODAwMzMzYywKLTB4MCwgMHgxNDYwMDAwNSwgMHgwLCAweDhmODIwMTI4LAotMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwKLTB4MmM0MjAwMTEsIDB4NTA0MDAwMTAsIDB4YWM4MDAwMDAsIDB4ODAwMzM0ZiwKLTB4MCwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHg1MDU1MDAwMywKLTB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwKLTB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwKLTB4YWM4ZTAwMDAsIDB4YWM5ZTAwMDQsIDB4NTYyMDAwMGQsIDB4MjQxMTAwMDEsCi0weDhlZTI3MjRjLCAweDNjMDQwMDAxLCAweDI0ODQ1OGE4LCAweGFmYTAwMDE0LAotMHhhZmEyMDAxMCwgMHg4ZWU2NzI0YywgMHg4ZjQ3MDI4MCwgMHgzYzA1MDAwOSwKLTB4MzRhNWYwMDgsIDB4YzAwMjQwMywgMHhhZmFlMDA0OCwgMHg4ZmFlMDA0OCwKLTB4NTYyMDAwMDEsIDB4YWVlMDBlMWMsIDB4OGVlMjAxODgsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMTg4LCAweDgwMDMzYzgsIDB4OGVlMjAxODgsIDB4OGY4MzAxMjAsCi0weDI3NjIzODAwLCAweDI0NjYwMDIwLCAweGMyMTAyYiwgMHg1MDQwMDAwMSwKLTB4Mjc2NjMwMDAsIDB4OGY4MjAxMjgsIDB4MTBjMjAwMDQsIDB4MCwKLTB4OGY4MjAxMjQsIDB4MTRjMjAwMDcsIDB4MCwgMHg4ZWUyMDFhNCwKLTB4ODgyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgMHg4MDAzM2JhLAotMHg4ZWUyMDFhNCwgMHg4ZWUyNzI0YywgMHhhYzYyMDAxYywgMHg4ZWU0MDRhOCwKLTB4OGVlNTA0YWMsIDB4MjQ2MjAwMWMsIDB4YWM2MjAwMDgsIDB4MjQwMjAwMDgsCi0weGE0NjIwMDBlLCAweDI0MDIwMDExLCAweGFjNjIwMDE4LCAweGFjNjQwMDAwLAotMHhhYzY1MDAwNCwgMHg4ZWUyMDRjNCwgMHhhYzYyMDAxMCwgMHhhZjg2MDEyMCwKLTB4OTJlMjRlMjAsIDB4MTQ0MDAwMzMsIDB4MjQxMTAwMDEsIDB4OGVlMjRlMzAsCi0weDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MjAwMDAsCi0weDE0NGUwMDFmLCAweDAsIDB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsCi0weDEwNjIwMDFiLCAweDAsIDB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsCi0weGFjODIwMDA0LCAweDhlZTI0ZTM0LCAweDhlZTM0ZTMwLCAweDI0NDIwMDAxLAotMHgxMDU1MDAwNywgMHgwLCAweDhlZTI0ZTM0LCAweDI0NDIwMDAxLAotMHgxMDYyMDAwNSwgMHgwLCAweDgwMDMzYTcsIDB4MCwKLTB4MTQ2MDAwMDUsIDB4MCwgMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwKLTB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsCi0weDUwNDAwMDEwLCAweGFjODAwMDAwLCAweDgwMDMzYmEsIDB4MCwKLTB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4NTA1NTAwMDMsIDB4MTAyMSwKLTB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsCi0weDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4YWM4ZTAwMDAsCi0weGFjOWUwMDA0LCAweDE2MjAwMDBkLCAweDAsIDB4OGVlMjcyNGMsCi0weDNjMDQwMDAxLCAweDI0ODQ1OGE4LCAweGFmYTAwMDE0LCAweGFmYTIwMDEwLAotMHg4ZWU2NzI0YywgMHg4ZjQ3MDI4MCwgMHgzYzA1MDAwOSwgMHgzNGE1ZjAwOCwKLTB4YzAwMjQwMywgMHhhZmFlMDA0OCwgMHg4ZmFlMDA0OCwgMHg4ZWUyMDE3NCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxNzQsIDB4OGVlMjAxNzQsIDB4ODAwMzQ2ZSwKLTB4YTAyMSwgMHg5NjBjMDAwYSwgMHgxODMxMDJiLCAweDU0NDAwMDAxLAotMHgxODAxODIxLCAweGE2MDMwMDBhLCAweDhmODgwMTIwLCAweDI3NjIzODAwLAotMHgyNTA5MDAyMCwgMHgxMjIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjkzMDAwLAotMHg4ZjgyMDEyOCwgMHgxMTIyMDAwNCwgMHgwLCAweDhmODIwMTI0LAotMHgxNTIyMDAwNywgMHgyNDA0MDAyMCwgMHg4ZWUyMDFhNCwgMHg4ODIxLAotMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgMHg4MDAzNDJmLCAweDhlZTIwMWE0LAotMHg4ZWU1NzI0YywgMHg4ZWU2MDQ5MCwgMHg4ZWU3MDQ5NCwgMHhhNTA0MDAwZSwKLTB4MjQwNDAwMDQsIDB4YWQxMDAwMDgsIDB4YWQwNDAwMTgsIDB4NTI5NDAsCi0weGEwMTgyMSwgMHgxMDIxLCAweGUzMzgyMSwgMHhlMzIwMmIsCi0weGMyMzAyMSwgMHhjNDMwMjEsIDB4YWQwNjAwMDAsIDB4YWQwNzAwMDQsCi0weDhlZTI3MjRjLCAweGFkMDIwMDFjLCAweDhlZTIwNGM0LCAweGFkMDIwMDEwLAotMHhhZjg5MDEyMCwgMHg5MmUyNGUyMCwgMHgxNDQwMDAzMywgMHgyNDExMDAwMSwKLTB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwKLTB4OGM4MjAwMDAsIDB4MTQ1NjAwMWYsIDB4MCwgMHg4ZWUzNGUzMCwKLTB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIDB4MCwgMHg4YzgyMDAwNCwKLTB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIDB4OGVlMzRlMzAsCi0weDI0NDIwMDAxLCAweDEwNTUwMDA3LCAweDAsIDB4OGVlMjRlMzQsCi0weDI0NDIwMDAxLCAweDEwNjIwMDA1LCAweDAsIDB4ODAwMzQxYywKLTB4MCwgMHgxNDYwMDAwNSwgMHgwLCAweDhmODIwMTI4LAotMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwKLTB4MmM0MjAwMTEsIDB4NTA0MDAwMTAsIDB4YWM4MDAwMDAsIDB4ODAwMzQyZiwKLTB4MCwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHg1MDU1MDAwMywKLTB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwKLTB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwKLTB4YWM5NjAwMDAsIDB4YWM5ZTAwMDQsIDB4MTYyMDAwMWQsIDB4MCwKLTB4YTYwYzAwMGEsIDB4OGY4MjAxMDAsIDB4YWZhMjAwMTAsIDB4OGY4MjAxMDQsCi0weDNjMDQwMDAxLCAweDI0ODQ1ODljLCAweDNjMDUwMDA2LCAweGFmYTIwMDE0LAotMHg4ZWU2NzI0YywgMHgzNGE1ZjAwZCwgMHhjMDAyNDAzLCAweDIwMDM4MjEsCi0weDkzYTIwMDM3LCAweDEwNDAwMDMxLCAweDM0MGY4MTAwLCAweDhlNDIwMDA0LAotMHg4ZTQzMDAwOCwgMHg4ZTQ0MDAwYywgMHhhNjRmMDAwYywgMHhhZTQyMDAwMCwKLTB4YWU0MzAwMDQsIDB4YWU0NDAwMDgsIDB4OTYwMjAwMTYsIDB4YTY0MjAwMGUsCi0weDk2MDIwMDBlLCAweDMwNDJmZGZmLCAweDgwMDM0NzAsIDB4YTYwMjAwMGUsCi0weDhlZTIwMWQ4LCAweDI0NDJmZmZmLCAweGFlZTIwMWQ4LCAweDhlZTIwMWQ4LAotMHg4ZWUyMDFjYywgMHgzYzA0MDAxZiwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsCi0weGEwM2U4M2MwLCAweDI0NDJmZmZmLCAweGFlZTIwMWNjLCAweDk2MDMwMDBhLAotMHgzNDg0ZmZmZiwgMHg4ZWUyMDFjYywgMHg2YTE4MjEsIDB4MjYzOTgyMSwKLTB4OTMyMDJiLCAweDEwODAwMDAzLCAweDNjMDJmZmY1LCAweDM0NDIxMDAwLAotMHgyNjI5ODIxLCAweGFkYWIwMDAwLCAweDhlZTI3MjRjLCAweDI0NDIwMDAxLAotMHgzMDQyMDdmZiwgMHhhZWUyNzI0YywgMHg4ZjQyMDI0MCwgMHgxMDQwMDAwNCwKLTB4MjgzYTAyMywgMHg4ZWUyMGUxYywgMHgyNDQyMDAwMSwgMHhhZWUyMGUxYywKLTB4YTNhMDAwMjcsIDB4MTY4MGZkMjksIDB4MCwgMHgxMjgwMDAyNCwKLTB4MCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YWMzNDgzYzQsCi0weDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhYzMzODNjOCwgMHgzYzAxMDAwMSwKLTB4MzcwODIxLCAweGFjMzI4M2NjLCAweDkzYTIwMDM3LCAweDEwNDAwMDA4LAotMHgwLCAweDNjMDIwMDAxLCAweDU3MTAyMSwgMHg4YzQyODNjYywKLTB4MjQ0MjAwMDQsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjI4M2NjLAotMHg4ZWUyNzI0YywgMHg4ZjQzMDI4MCwgMHgyNDQyMDAwMSwgMHgzMDQyMDdmZiwKLTB4MTQ2MjAwMDYsIDB4MCwgMHg4ZWUyMDFjNCwgMHgyNDQyMDAwMSwKLTB4YWVlMjAxYzQsIDB4ODAwMzRjYywgMHg4ZWUyMDFjNCwgMHg4ZWUyMDFiYywKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxYmMsIDB4ODAwMzRjYywgMHg4ZWUyMDFiYywKLTB4OTdhNDAwMWUsIDB4MjQ4NGZmZmMsIDB4ODAxODIxLCAweDhlZTQwMGMwLAotMHg4ZWU1MDBjNCwgMHgxMDIxLCAweGEzMjgyMSwgMHhhMzMwMmIsCi0weDgyMjAyMSwgMHg4NjIwMjEsIDB4YWVlNDAwYzAsIDB4YWVlNTAwYzQsCi0weDhmYWYwMDJjLCAweDI0MDIwMDAyLCAweDExZTIwMDBmLCAweDI5ZTIwMDAzLAotMHgxNDQwMDAxNywgMHgyNDAyMDAwMywgMHgxNWUyMDAxNSwgMHgwLAotMHg4ZWUyMDBkMCwgMHg4ZWUzMDBkNCwgMHgyNDYzMDAwMSwgMHgyYzY0MDAwMSwKLTB4NDQxMDIxLCAweGFlZTIwMGQwLCAweGFlZTMwMGQ0LCAweDhlZTIwMGQwLAotMHg4MDAzNGM2LCAweDhlZTMwMGQ0LCAweDhlZTIwMGQ4LCAweDhlZTMwMGRjLAotMHgyNDYzMDAwMSwgMHgyYzY0MDAwMSwgMHg0NDEwMjEsIDB4YWVlMjAwZDgsCi0weGFlZTMwMGRjLCAweDhlZTIwMGQ4LCAweDgwMDM0YzYsIDB4OGVlMzAwZGMsCi0weDhlZTIwMGM4LCAweDhlZTMwMGNjLCAweDI0NjMwMDAxLCAweDJjNjQwMDAxLAotMHg0NDEwMjEsIDB4YWVlMjAwYzgsIDB4YWVlMzAwY2MsIDB4OGVlMjAwYzgsCi0weDhlZTMwMGNjLCAweDhmODMwMGU0LCAweDhmODIwMGUwLCAweDEwNjIwMDAzLAotMHgyNDYzMDAwOCwgMHhhZjgzMDBlNCwgMHhhZjgzMDBlOCwgMHg4ZmJmMDA3MCwKLTB4OGZiZTAwNmMsIDB4OGZiNjAwNjgsIDB4OGZiNTAwNjQsIDB4OGZiNDAwNjAsCi0weDhmYjMwMDVjLCAweDhmYjIwMDU4LCAweDhmYjEwMDU0LCAweDhmYjAwMDUwLAotMHgzZTAwMDA4LCAweDI3YmQwMDc4LCAweDI3YmRmZmIwLCAweGFmYjUwMDQ0LAotMHhhODIxLCAweGFmYjAwMDMwLCAweDgwMjEsIDB4YWZiZjAwNGMsCi0weGFmYjYwMDQ4LCAweGFmYjQwMDQwLCAweGFmYjMwMDNjLCAweGFmYjIwMDM4LAotMHhhZmIxMDAzNCwgMHg4ZWUyMDRkNCwgMHgyNDE0MDAwMSwgMHgzMDQyMDAwMSwKLTB4MTQ0MDAwMmEsIDB4YjAyMSwgMHg4Zjg3MDBlMCwgMHg4Zjg4MDBjNCwKLTB4OGY4MjAwZTgsIDB4ZTIyMDIzLCAweDJjODIxMDAwLCAweDUwNDAwMDAxLAotMHgyNDg0MTAwMCwgMHg0MjBjMiwgMHg4MDE4MjEsIDB4OGVlNDAwYzgsCi0weDhlZTUwMGNjLCAweDEwMjEsIDB4YTMyODIxLCAweGEzMzAyYiwKLTB4ODIyMDIxLCAweDg2MjAyMSwgMHhhZWU0MDBjOCwgMHhhZWU1MDBjYywKLTB4OGY4MzAwYzgsIDB4M2MwMjAwMGEsIDB4MzQ0MmVmZmYsIDB4MTAzMjAyMywKLTB4NDQxMDJiLCAweDEwNDAwMDAzLCAweDNjMDIwMDBhLCAweDM0NDJmMDAwLAotMHg4MjIwMjEsIDB4ODAxODIxLCAweDhlZTQwMGMwLCAweDhlZTUwMGM0LAotMHgxMDIxLCAweGEzMjgyMSwgMHhhMzMwMmIsIDB4ODIyMDIxLAotMHg4NjIwMjEsIDB4YWVlNDAwYzAsIDB4YWVlNTAwYzQsIDB4YWY4ODAwYzgsCi0weGFmODcwMGU0LCAweDgwMDM4NTAsIDB4YWY4NzAwZTgsIDB4M2MwMjAwMDEsCi0weDU3MTAyMSwgMHg5MDQyODNjMCwgMHgxMDQwMDAwYiwgMHgwLAotMHgzYzEzMDAwMSwgMHgyNzc5ODIxLCAweDhlNzM4M2M0LCAweDNjMTEwMDAxLAotMHgyMzc4ODIxLCAweDhlMzE4M2M4LCAweDNjMTIwMDAxLCAweDI1NzkwMjEsCi0weDgwMDM2ZTgsIDB4OGU1MjgzY2MsIDB4OGY4MzAwZTAsIDB4OGY4MjAwZTQsCi0weDEwNDMwMDA3LCAweDQ4MjEsIDB4OGY4MjAwZTQsIDB4MjQwOTAwMDEsCi0weDhjNDMwMDAwLCAweDhjNDQwMDA0LCAweGFmYTMwMDE4LCAweGFmYTQwMDFjLAotMHgxNTIwMDAwZSwgMHgzYzAyZmZmZiwgMHg4ZjgyMDBjNCwgMHhhZmEyMDAxMCwKLTB4OGY4MjAwYzgsIDB4M2MwNDAwMDEsIDB4MjQ4NDU4NzAsIDB4YWZhMjAwMTQsCi0weDhmODYwMGUwLCAweDhmODcwMGU0LCAweDNjMDUwMDA2LCAweGMwMDI0MDMsCi0weDM0YTVmMDAwLCAweDgwMDM4NTAsIDB4MCwgMHg4ZmEzMDAxYywKLTB4OGZiMjAwMTgsIDB4MzA3M2ZmZmYsIDB4MjY3M2ZmZmMsIDB4NjIxMDI0LAotMHgxMDQwMDA1OCwgMHgyNDA4ODIxLCAweDNjMDIwMDgwLCAweDYyMTAyNCwKLTB4MTA0MDAwMGEsIDB4M2MwNDAwNDAsIDB4OGVlMjAwN2MsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMDdjLCAweDhlZTIwMDdjLCAweDhlZTIwMWZjLCAweDI0NDIwMDAxLAotMHhhZWUyMDFmYywgMHg4MDAzODRhLCAweDhlZTIwMWZjLCAweDNjMDYwMDA0LAotMHgzYzBiMDAwMSwgMHgzYzBhMDAwMiwgMHgzYzA1MDAxMCwgMHgzYzA5MDAwOCwKLTB4OGVlMjAwODAsIDB4M2MwODAwMjAsIDB4MzQwNzgwMDAsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMDgwLCAweDhlZTIwMDgwLCAweDhmYTIwMDFjLCAweDQ0MTgyNCwKLTB4MTA2NjAwMjEsIDB4YzMxMDJiLCAweDE0NDAwMDA3LCAweDAsCi0weDEwNmIwMDExLCAweDAsIDB4MTA2YTAwMTUsIDB4MCwKLTB4ODAwMzU5MiwgMHg0MjA0MiwgMHgxMDY1MDAyMywgMHhhMzEwMmIsCi0weDE0NDAwMDA1LCAweDAsIDB4MTA2OTAwMTksIDB4MCwKLTB4ODAwMzU5MiwgMHg0MjA0MiwgMHgxMDY4MDAyMSwgMHgwLAotMHg4MDAzNTkyLCAweDQyMDQyLCAweDhlZTIwMDM0LCAweDI0NDIwMDAxLAotMHhhZWUyMDAzNCwgMHg4ZWUyMDAzNCwgMHg4MDAzNTkyLCAweDQyMDQyLAotMHg4ZWUyMDFlYywgMHgyNDQyMDAwMSwgMHhhZWUyMDFlYywgMHg4ZWUyMDFlYywKLTB4ODAwMzU5MiwgMHg0MjA0MiwgMHg4ZWUyMDFmMCwgMHgyNDQyMDAwMSwKLTB4YWVlMjAxZjAsIDB4OGVlMjAxZjAsIDB4ODAwMzU5MiwgMHg0MjA0MiwKLTB4OGVlMjAxZjQsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxZjQsIDB4OGVlMjAxZjQsCi0weDgwMDM1OTIsIDB4NDIwNDIsIDB4OGVlMjAwMzAsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMDMwLCAweDhlZTIwMDMwLCAweDgwMDM1OTIsIDB4NDIwNDIsCi0weDhlZTIwMWY4LCAweDI0NDIwMDAxLCAweGFlZTIwMWY4LCAweDhlZTIwMWY4LAotMHg0MjA0MiwgMHgxMDg3MDJiNywgMHgwLCAweDgwMDM1NTcsCi0weDAsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDkwNDI4M2IyLAotMHgxNDQwMDA4NCwgMHgyNDAyMDAwMSwgMHgzYzAzMDAwMSwgMHg3NzE4MjEsCi0weDkwNjM4M2IzLCAweDE0NjIwMDdmLCAweDNjMDIwMTAwLCAweDhlNDMwMDAwLAotMHg2MjEwMjQsIDB4MTA0MDAwNmYsIDB4MjQwMmZmZmYsIDB4MTQ2MjAwMDUsCi0weDI0MTAwMDAxLCAweDk2NDMwMDA0LCAweDM0MDJmZmZmLCAweDEwNjIwMDc1LAotMHgwLCAweDkyZTIwNGQ4LCAweDE0NDAwMDcyLCAweDAsCi0weDNjMDIwMDAxLCAweDU3MTAyMSwgMHg4YzQyODNiNCwgMHgyODQyMDAwNSwKLTB4MTA0MDAwMjAsIDB4MzgyMSwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsCi0weDhjNDI4M2I0LCAweDE4NDAwMDE2LCAweDI4MjEsIDB4OTYyNjAwMDAsCi0weDUyMGMwLCAweDk3MTAyMSwgMHg5NDQyNzc3ZSwgMHgxNDQ2MDAwOSwKLTB4OTcxMDIxLCAweDk0NDM3NzgwLCAweDk2MjIwMDAyLCAweDE0NjIwMDA1LAotMHg5NzEwMjEsIDB4OTQ0Mzc3ODIsIDB4OTYyMjAwMDQsIDB4NTA2MjAwMDgsCi0weDI0MDcwMDAxLCAweDNjMDIwMDAxLCAweDU3MTAyMSwgMHg4YzQyODNiNCwKLTB4MjRhNTAwMDEsIDB4YTIxMDJhLCAweDU0NDBmZmVlLCAweDUyMGMwLAotMHgzMGUyMDBmZiwgMHgxMDQwMDI3YiwgMHgwLCAweDgwMDM2MWUsCi0weDAsIDB4MjQwMjAyMSwgMHhjMDAyMmZlLCAweDI0MDUwMDA2LAotMHgzMDQ0MDAxZiwgMHg0MjhjMCwgMHgyZTUxMDIxLCAweDk0NDI3MjdjLAotMHgzMDQyNDAwMCwgMHgxNDQwMDI2ZiwgMHhiNzEwMjEsIDB4OTQ0MzcyN2UsCi0weDk2MjIwMDAwLCAweDE0NjIwMDBiLCAweDQxOGMwLCAweGI3MTAyMSwKLTB4OTQ0MzcyODAsIDB4OTYyMjAwMDIsIDB4MTQ2MjAwMDYsIDB4NDE4YzAsCi0weGI3MTAyMSwgMHg5NDQzNzI4MiwgMHg5NjIyMDAwNCwgMHgxMDYyMDAzNSwKLTB4NDE4YzAsIDB4MmUzMTAyMSwgMHg5NDQyNzI3YywgMHgzMDQyODAwMCwKLTB4MTQ0MDAyNWMsIDB4MmUzMTAyMSwgMHg5NDQ4NzI3YywgMHg5NjI3MDAwMCwKLTB4ODI4YzAsIDB4YjcxMDIxLCAweDk0NDI3MzdlLCAweDgwMDM2MDAsCi0weDMwMjEsIDB4NDIwYzAsIDB4MmU0MTAyMSwgMHg5NDQzNzM3YywKLTB4MmU0MTAyMSwgMHg5NDQ4NzM3YywgMHgzMDYzODAwMCwgMHgxNDYwMDAxMCwKLTB4ODI4YzAsIDB4YjcxMDIxLCAweDk0NDI3MzdlLCAweDE0NDdmZmY1LAotMHgxMDAyMDIxLCAweGI3MTAyMSwgMHg5NDQzNzM4MCwgMHg5NjIyMDAwMiwKLTB4NTQ2MmZmZjEsIDB4NDIwYzAsIDB4YjcxMDIxLCAweDk0NDM3MzgyLAotMHg5NjIyMDAwNCwgMHg1NDYyZmZlYywgMHg0MjBjMCwgMHgyNDA2MDAwMSwKLTB4MzBjMjAwZmYsIDB4MTA0MDAyM2IsIDB4MCwgMHg4MDAzNjFlLAotMHgwLCAweDk3NDMwMjAyLCAweDk2NDIwMDAwLCAweDE0NjIwMjM1LAotMHgwLCAweDk3NDMwMjA0LCAweDk2NDIwMDAyLCAweDE0NjIwMjMxLAotMHgwLCAweDk3NDMwMjA2LCAweDk2NDIwMDA0LCAweDE0NjIwMjJkLAotMHgwLCAweDkyNDIwMDAwLCAweDNhMDMwMDAxLCAweDMwNDIwMDAxLAotMHg0MzEwMjQsIDB4MTA0MDAwNzQsIDB4MjQwMmZmZmYsIDB4OGUyMzAwMDAsCi0weDE0NjIwMDA0LCAweDM0MDJmZmZmLCAweDk2MjMwMDA0LCAweDEwNjIwMDZmLAotMHgyNDE0MDAwMiwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OTA0MjgzYjIsCi0weDE0NDAwMDZhLCAweDI0MTQwMDAzLCAweDkyZTIwNGQ4LCAweDE0NDAwMDY3LAotMHgwLCAweDNjMDIwMDAxLCAweDU3MTAyMSwgMHg4YzQyODNiNCwKLTB4Mjg0MjAwMDUsIDB4MTA0MDAwMjAsIDB4MzgyMSwgMHgzYzAyMDAwMSwKLTB4NTcxMDIxLCAweDhjNDI4M2I0LCAweDE4NDAwMDE2LCAweDI4MjEsCi0weDk2MjYwMDAwLCAweDUyMGMwLCAweDk3MTAyMSwgMHg5NDQyNzc3ZSwKLTB4MTQ0NjAwMDksIDB4OTcxMDIxLCAweDk0NDM3NzgwLCAweDk2MjIwMDAyLAotMHgxNDYyMDAwNSwgMHg5NzEwMjEsIDB4OTQ0Mzc3ODIsIDB4OTYyMjAwMDQsCi0weDUwNjIwMDA4LCAweDI0MDcwMDAxLCAweDNjMDIwMDAxLCAweDU3MTAyMSwKLTB4OGM0MjgzYjQsIDB4MjRhNTAwMDEsIDB4YTIxMDJhLCAweDU0NDBmZmVlLAotMHg1MjBjMCwgMHgzMGUyMDBmZiwgMHgxNDQwMDA0NCwgMHgyNDE0MDAwMywKLTB4ODAwMzg0YSwgMHgwLCAweDI0MDIwMjEsIDB4YzAwMjJmZSwKLTB4MjQwNTAwMDYsIDB4MzA0NDAwMWYsIDB4NDI4YzAsIDB4MmU1MTAyMSwKLTB4OTQ0MjcyN2MsIDB4MzA0MjQwMDAsIDB4MTQ0MDAxZWEsIDB4YjcxMDIxLAotMHg5NDQzNzI3ZSwgMHg5NjIyMDAwMCwgMHgxNDYyMDAwYiwgMHg0MThjMCwKLTB4YjcxMDIxLCAweDk0NDM3MjgwLCAweDk2MjIwMDAyLCAweDE0NjIwMDA2LAotMHg0MThjMCwgMHhiNzEwMjEsIDB4OTQ0MzcyODIsIDB4OTYyMjAwMDQsCi0weDEwNjIwMDI3LCAweDQxOGMwLCAweDJlMzEwMjEsIDB4OTQ0MjcyN2MsCi0weDMwNDI4MDAwLCAweDE0NDAwMWQ3LCAweDJlMzEwMjEsIDB4OTQ0ODcyN2MsCi0weDk2MjcwMDAwLCAweDgyOGMwLCAweGI3MTAyMSwgMHg5NDQyNzM3ZSwKLTB4ODAwMzY4NSwgMHgzMDIxLCAweDQyMGMwLCAweDJlNDEwMjEsCi0weDk0NDM3MzdjLCAweDJlNDEwMjEsIDB4OTQ0ODczN2MsIDB4MzA2MzgwMDAsCi0weDE0NjAwMDEwLCAweDgyOGMwLCAweGI3MTAyMSwgMHg5NDQyNzM3ZSwKLTB4MTQ0N2ZmZjUsIDB4MTAwMjAyMSwgMHhiNzEwMjEsIDB4OTQ0MzczODAsCi0weDk2MjIwMDAyLCAweDU0NjJmZmYxLCAweDQyMGMwLCAweGI3MTAyMSwKLTB4OTQ0MzczODIsIDB4OTYyMjAwMDQsIDB4NTQ2MmZmZWMsIDB4NDIwYzAsCi0weDI0MDYwMDAxLCAweDMwYzIwMGZmLCAweDEwNDAwMWI2LCAweDAsCi0weDgwMDM2OTgsIDB4MjQxNDAwMDMsIDB4MjQxNDAwMDEsIDB4OGY0MjAyNjAsCi0weDUzMTAyYiwgMHgxMDQwMDA0OSwgMHgwLCAweDhmODMwMGU0LAotMHg4ZjgyMDBlMCwgMHgxMDYyMDAwMywgMHgyNDYzMDAwOCwgMHhhZjgzMDBlNCwKLTB4YWY4MzAwZTgsIDB4OGVlNDAwYzAsIDB4OGVlNTAwYzQsIDB4MjYwMTgyMSwKLTB4MTAyMSwgMHhhMzI4MjEsIDB4YTMzMDJiLCAweDgyMjAyMSwKLTB4ODYyMDIxLCAweGFlZTQwMGMwLCAweGFlZTUwMGM0LCAweDhlZTIwMDU4LAotMHgyNDQyMDAwMSwgMHhhZWUyMDA1OCwgMHg4ZWUyMDA1OCwgMHg4ZWUyMDA3YywKLTB4MjQ0MjAwMDEsIDB4YWVlMjAwN2MsIDB4OGVlMjAwN2MsIDB4OGY4MjAwZTAsCi0weGFmYTIwMDEwLCAweDhmODIwMGU0LCAweDNjMDQwMDAxLCAweDI0ODQ1ODc4LAotMHhhZmEyMDAxNCwgMHg4ZmE2MDAxOCwgMHg4ZmE3MDAxYywgMHgzYzA1MDAwNiwKLTB4YzAwMjQwMywgMHgzNGE1ZjAwMywgMHg4MDAzODUwLCAweDAsCi0weDhlZTI1MjQwLCAweGFmYTIwMDEwLCAweDhlZTI1MjQ0LCAweDNjMDQwMDAxLAotMHgyNDg0NTg4NCwgMHhhZmEyMDAxNCwgMHg4ZWU2MGUxMCwgMHg4ZWU3MGUxOCwKLTB4YzAwMjQwMywgMHgzNGE1ZjAwMiwgMHg4ZWUyMDFjMCwgMHgyNDQyMDAwMSwKLTB4YWVlMjAxYzAsIDB4OGVlMjAwMDAsIDB4OGVlMzAxYzAsIDB4MjQwM2ZmYmYsCi0weDQzMTAyNCwgMHg4MDAzN2Y4LCAweGFlZTIwMDAwLCAweDhlZTI1MjQwLAotMHhhZmEyMDAxMCwgMHg4ZWUyNTI0NCwgMHgzYzA0MDAwMSwgMHgyNDg0NTg4NCwKLTB4YWZhMjAwMTQsIDB4OGVlNjBlMTAsIDB4OGVlNzBlMTgsIDB4M2MwNTAwMDYsCi0weGMwMDI0MDMsIDB4MzRhNWYwMDIsIDB4OGVlMjAxYzAsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMWMwLCAweDgwMDM3ZjgsIDB4OGVlMjAxYzAsIDB4OTZlMjA0NjgsCi0weDUzMTAyYiwgMHg1NDQwMDAwMSwgMHgzYzE1ODAwMCwgMHgxMjYwMDEzMSwKLTB4M2MwYzAwMWYsIDB4MzU4Y2ZmZmYsIDB4OGVlMjcyNGMsIDB4OGY0MzAyODAsCi0weDI0NDIwMDAxLCAweDMwNDIwN2ZmLCAweDEwNjIwMTA4LCAweDAsCi0weDEyYTAwMDE0LCAweDAsIDB4OGVlMzUyNDAsIDB4OGVlMjUyNDQsCi0weDEwNjIwMDA5LCAweDI2ZWU1MjQ0LCAweDhlZWI1MjQ0LCAweDhlZTM1MjQ0LAotMHgyMTE0MCwgMHgyNDQyNTI0OCwgMHgyZTI4MDIxLCAweDI0NjMwMDAxLAotMHg4MDAzNzEyLCAweDMwNjgwMGZmLCAweDkyZTI3MjQ4LCAweDE0NDBmZmMwLAotMHgzYzA1MDAwNiwgMHg4ZWUyMDFlMCwgMHgyNDQyMDAwMSwgMHhhZWUyMDFlMCwKLTB4OGVlMjAxZTAsIDB4OGVlMzBlMTAsIDB4OGVlMjBlMTgsIDB4MTA2MmZmY2IsCi0weDI2ZWUwZTE4LCAweDhlZWIwZTE4LCAweGE4MjEsIDB4OGVlMzBlMTgsCi0weDIxMTQwLCAweDI0NDIwZTIwLCAweDJlMjgwMjEsIDB4MjQ2MzAwMDEsCi0weDMwNjgwMWZmLCAweDk2ZTIwNDZhLCAweDMwNDIwMDEwLCAweDEwNDAwMDE3LAotMHgzNDAyODEwMCwgMHg5NjQzMDAwYywgMHgxNDYyMDAxNCwgMHgwLAotMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OTA0MjgzYzAsIDB4MTQ0MDAwMGYsCi0weDAsIDB4OTY0MjAwMGUsIDB4YTYwMjAwMTYsIDB4OGU0MjAwMDgsCi0weDhlNDMwMDA0LCAweDhlNDQwMDAwLCAweDI2NzNmZmZjLCAweGFlNDIwMDBjLAotMHhhZTQzMDAwOCwgMHhhZTQ0MDAwNCwgMHg5NjAyMDAwZSwgMHgyNjMxMDAwNCwKLTB4MjQxNjAwMDEsIDB4MzQ0MjAyMDAsIDB4YTYwMjAwMGUsIDB4OTYwMzAwMGEsCi0weDI2MDUwMjEsIDB4NzMxMDJiLCAweDEwNDAwMDAyLCAweDI2MDY4MjEsCi0weDYwNTAyMSwgMHgyZDQyMDAzZCwgMHgxMDQwMDAyYSwgMHgzODIxLAotMHg5NjIzMDAwYywgMHgyNDAyMDgwMCwgMHg1NDYyMDAyNywgMHhhZTExMDAxOCwKLTB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDkwNDI4M2MwLCAweDU0NDAwMDIyLAotMHhhZTExMDAxOCwgMHgyNjIyMDAxNywgMHgxODIxMDJiLCAweDEwNDAwMDEzLAotMHgwLCAweDNjMDJmZmY1LCAweDUxMTAyMSwgMHg5MDQyMTAxNywKLTB4Mzg0MzAwMDYsIDB4MmM2MzAwMDEsIDB4Mzg0MjAwMTEsIDB4MmM0MjAwMDEsCi0weDYyMTgyNSwgMHgxMDYwMDAxMywgMHgyNjIyMDAxMCwgMHgxODIxMDJiLAotMHgxMDQwMDAwZSwgMHgwLCAweDNjMDdmZmY1LCAweGYxMzgyMSwKLTB4OTRlNzEwMTAsIDB4ODAwMzc1ZSwgMHgyNGU3MDAwZSwgMHg5MjIyMDAxNywKLTB4Mzg0MzAwMDYsIDB4MmM2MzAwMDEsIDB4Mzg0MjAwMTEsIDB4MmM0MjAwMDEsCi0weDYyMTgyNSwgMHg1MDYwMDAwNCwgMHhhZTExMDAxOCwgMHg5NjI3MDAxMCwKLTB4MjRlNzAwMGUsIDB4YWUxMTAwMTgsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLAotMHg5MDQyODNjMCwgMHgyMTAyYiwgMHgxNGUwMDAwMiwgMHgyNGVjMCwKLTB4MTQwMzgyMSwgMHg4ZjgzMDEyMCwgMHgyNzYyMzgwMCwgMHgyNDY2MDAyMCwKLTB4YzIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjYzMDAwLCAweDhmODIwMTI4LAotMHgxMGMyMDAwNCwgMHgwLCAweDhmODIwMTI0LCAweDE0YzIwMDA3LAotMHgyNDAyMDAwYiwgMHg4ZWUyMDFhNCwgMHg0ODIxLCAweDI0NDIwMDAxLAotMHhhZWUyMDFhNCwgMHg4MDAzN2JmLCAweDhlZTIwMWE0LCAweDhlMDQwMDAwLAotMHg4ZTA1MDAwNCwgMHhhYzYyMDAxOCwgMHgxNzUxMDI1LCAweDQ5MTAyNSwKLTB4YWM3MTAwMDgsIDB4YTQ2NzAwMGUsIDB4YWM2MjAwMWMsIDB4YWM2NDAwMDAsCi0weGFjNjUwMDA0LCAweDhlZTIwNGMwLCAweGFjNjIwMDEwLCAweGFmODYwMTIwLAotMHg5MmUyNGUyMCwgMHgxNDQwMDAzOCwgMHgyNDA5MDAwMSwgMHg4ZWUyNGUzMCwKLTB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHg4YzgzMDAwMCwKLTB4MjQwMjAwMDcsIDB4MTQ2MjAwMjAsIDB4MCwgMHg4ZWUzNGUzMCwKLTB4OGVlMjRlMzQsIDB4MTA2MjAwMWMsIDB4MCwgMHg4YzgyMDAwNCwKLTB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMzRlMzQsIDB4OGVlNTRlMzAsCi0weDI0MDIwMDQwLCAweDI0NjMwMDAxLCAweDEwNjIwMDA3LCAweDAsCi0weDhlZTI0ZTM0LCAweDI0NDIwMDAxLCAweDEwYTIwMDA1LCAweDAsCi0weDgwMDM3YTksIDB4MCwgMHgxNGEwMDAwNSwgMHgwLAotMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwKLTB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIDB4NTA0MDAwMTMsIDB4YWM4MDAwMDAsCi0weDgwMDM3YmYsIDB4MCwgMHg4ZWUyNGUzMCwgMHgyNDAzMDA0MCwKLTB4MjQ0MjAwMDEsIDB4NTA0MzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsCi0weDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4MjQwMjAwMDcsIDB4YWM4MjAwMDAsCi0weDI0MDIwMDAxLCAweGFjODIwMDA0LCAweDE1MjAwMDE4LCAweDNjMDUwMDA2LAotMHg4ZTAyMDAxOCwgMHgzYzA0MDAwMSwgMHgyNDg0NTg5MCwgMHhhZmEyMDAxMCwKLTB4OGUwMjAwMDAsIDB4OGUwMzAwMDQsIDB4MzRhNWYwMDksIDB4MjAwMzAyMSwKLTB4YzAwMjQwMywgMHhhZmEzMDAxNCwgMHgzMmMyMDBmZiwgMHgxMDQwMDAyYiwKLTB4MzQwMjgxMDAsIDB4OGU0MzAwMDQsIDB4OGU0NDAwMDgsIDB4OGU0NTAwMGMsCi0weGE2NDIwMDBjLCAweGFlNDMwMDAwLCAweGFlNDQwMDA0LCAweGFlNDUwMDA4LAotMHg5NjAyMDAxNiwgMHg4MDAzN2Y4LCAweGE2NDIwMDBlLCAweDE1NGQwMDBhLAotMHgwLCAweDk2MDIwMDBlLCAweGE2MTMwMDBhLCAweDM0NDIwMDA0LAotMHhhNjAyMDAwZSwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YTAyMDgzYzAsCi0weDgwMDM3ZjYsIDB4OTgyMSwgMHg5NjA0MDAwYSwgMHg5MzEwMmIsCi0weDEwNDAwMDAyLCAweDI2MDE4MjEsIDB4ODAxODIxLCAweDI0MDIwMDAxLAotMHhhNjAzMDAwYSwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YTAyMjgzYzAsCi0weDk2MDQwMDBhLCAweDIyNDg4MjEsIDB4MTkxMTAyYiwgMHgxMDQwMDAwMywKLTB4M2MwMmZmZjUsIDB4MzQ0MjEwMDAsIDB4MjIyODgyMSwgMHgyNjQ5ODIzLAotMHhhODIxLCAweDE2NjBmZWY0LCAweGFkYzgwMDAwLCAweDEyNjAwMDIxLAotMHgzMmMyMDBmZiwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YWMzMzgzYzQsCi0weDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhYzMxODNjOCwgMHgzYzAxMDAwMSwKLTB4MzcwODIxLCAweDEwNDAwMDA4LCAweGFjMzI4M2NjLCAweDNjMDIwMDAxLAotMHg1NzEwMjEsIDB4OGM0MjgzY2MsIDB4MjQ0MjAwMDQsIDB4M2MwMTAwMDEsCi0weDM3MDgyMSwgMHhhYzIyODNjYywgMHg4ZWUyNzI0YywgMHg4ZjQzMDI4MCwKLTB4MjQ0MjAwMDEsIDB4MTQ2MjAwMDYsIDB4MCwgMHg4ZWUyMDFjNCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxYzQsIDB4ODAwMzg1MCwgMHg4ZWUyMDFjNCwKLTB4OGVlMjAxYmMsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYmMsIDB4ODAwMzg1MCwKLTB4OGVlMjAxYmMsIDB4OTdhNDAwMWUsIDB4MjQ4NGZmZmMsIDB4ODAxODIxLAotMHg4ZWU0MDBjMCwgMHg4ZWU1MDBjNCwgMHgxMDIxLCAweGEzMjgyMSwKLTB4YTMzMDJiLCAweDgyMjAyMSwgMHg4NjIwMjEsIDB4MjQwMjAwMDIsCi0weGFlZTQwMGMwLCAweGFlZTUwMGM0LCAweDEyODIwMDBmLCAweDJhODIwMDAzLAotMHgxNDQwMDAxNywgMHgyNDAyMDAwMywgMHgxNjgyMDAxNSwgMHgwLAotMHg4ZWUyMDBkMCwgMHg4ZWUzMDBkNCwgMHgyNDYzMDAwMSwgMHgyYzY0MDAwMSwKLTB4NDQxMDIxLCAweGFlZTIwMGQwLCAweGFlZTMwMGQ0LCAweDhlZTIwMGQwLAotMHg4MDAzODRhLCAweDhlZTMwMGQ0LCAweDhlZTIwMGQ4LCAweDhlZTMwMGRjLAotMHgyNDYzMDAwMSwgMHgyYzY0MDAwMSwgMHg0NDEwMjEsIDB4YWVlMjAwZDgsCi0weGFlZTMwMGRjLCAweDhlZTIwMGQ4LCAweDgwMDM4NGEsIDB4OGVlMzAwZGMsCi0weDhlZTIwMGM4LCAweDhlZTMwMGNjLCAweDI0NjMwMDAxLCAweDJjNjQwMDAxLAotMHg0NDEwMjEsIDB4YWVlMjAwYzgsIDB4YWVlMzAwY2MsIDB4OGVlMjAwYzgsCi0weDhlZTMwMGNjLCAweDhmODMwMGU0LCAweDhmODIwMGUwLCAweDEwNjIwMDAzLAotMHgyNDYzMDAwOCwgMHhhZjgzMDBlNCwgMHhhZjgzMDBlOCwgMHg4ZmJmMDA0YywKLTB4OGZiNjAwNDgsIDB4OGZiNTAwNDQsIDB4OGZiNDAwNDAsIDB4OGZiMzAwM2MsCi0weDhmYjIwMDM4LCAweDhmYjEwMDM0LCAweDhmYjAwMDMwLCAweDNlMDAwMDgsCi0weDI3YmQwMDUwLCAweDI3YmRmZjkwLCAweGFmYjYwMDYwLCAweGIwMjEsCi0weGFmYmYwMDY4LCAweGFmYmUwMDY0LCAweGFmYjUwMDVjLCAweGFmYjQwMDU4LAotMHhhZmIzMDA1NCwgMHhhZmIyMDA1MCwgMHhhZmIxMDA0YywgMHhhZmIwMDA0OCwKLTB4OGVlMjA0ZDQsIDB4ODgyMSwgMHgyNDE1MDAwMSwgMHgzMDQyMDAwMSwKLTB4MTQ0MDAwMmEsIDB4YTNhMDAwMmYsIDB4OGY4NzAwZTAsIDB4OGY4ODAwYzQsCi0weDhmODIwMGU4LCAweGUyMjAyMywgMHgyYzgyMTAwMCwgMHg1MDQwMDAwMSwKLTB4MjQ4NDEwMDAsIDB4NDIwYzIsIDB4ODAxODIxLCAweDhlZTQwMGM4LAotMHg4ZWU1MDBjYywgMHgxMDIxLCAweGEzMjgyMSwgMHhhMzMwMmIsCi0weDgyMjAyMSwgMHg4NjIwMjEsIDB4YWVlNDAwYzgsIDB4YWVlNTAwY2MsCi0weDhmODMwMGM4LCAweDNjMDIwMDBhLCAweDM0NDJlZmZmLCAweDEwMzIwMjMsCi0weDQ0MTAyYiwgMHgxMDQwMDAwMywgMHgzYzAyMDAwYSwgMHgzNDQyZjAwMCwKLTB4ODIyMDIxLCAweDgwMTgyMSwgMHg4ZWU0MDBjMCwgMHg4ZWU1MDBjNCwKLTB4MTAyMSwgMHhhMzI4MjEsIDB4YTMzMDJiLCAweDgyMjAyMSwKLTB4ODYyMDIxLCAweGFlZTQwMGMwLCAweGFlZTUwMGM0LCAweGFmODgwMGM4LAotMHhhZjg3MDBlNCwgMHg4MDAzYzViLCAweGFmODcwMGU4LCAweDNjMDIwMDAxLAotMHg1NzEwMjEsIDB4OTA0MjgzYzAsIDB4MTA0MDAwMGIsIDB4MCwKLTB4M2MxMzAwMDEsIDB4Mjc3OTgyMSwgMHg4ZTczODNjNCwgMHgzYzEwMDAwMSwKLTB4MjE3ODAyMSwgMHg4ZTEwODNjOCwgMHgzYzEyMDAwMSwgMHgyNTc5MDIxLAotMHg4MDAzYTU5LCAweDhlNTI4M2NjLCAweDhmODMwMGUwLCAweDhmODIwMGU0LAotMHgxMDQzMDAwNywgMHgzODIxLCAweDhmODIwMGU0LCAweDI0MDcwMDAxLAotMHg4YzQzMDAwMCwgMHg4YzQ0MDAwNCwgMHhhZmEzMDAxOCwgMHhhZmE0MDAxYywKLTB4MTRlMDAwMGUsIDB4M2MwMmZmZmYsIDB4OGY4MjAwYzQsIDB4YWZhMjAwMTAsCi0weDhmODIwMGM4LCAweDNjMDQwMDAxLCAweDI0ODQ1OGI0LCAweGFmYTIwMDE0LAotMHg4Zjg2MDBlMCwgMHg4Zjg3MDBlNCwgMHgzYzA1MDAwNiwgMHhjMDAyNDAzLAotMHgzNGE1ZjIwMCwgMHg4MDAzYzViLCAweDAsIDB4OGZhMzAwMWMsCi0weDhmYjIwMDE4LCAweDMwNzNmZmZmLCAweDI2NzNmZmZjLCAweDYyMTAyNCwKLTB4MTA0MDAwNTgsIDB4MjQwODAyMSwgMHgzYzAyMDA4MCwgMHg2MjEwMjQsCi0weDEwNDAwMDBhLCAweDNjMDQwMDQwLCAweDhlZTIwMDdjLCAweDI0NDIwMDAxLAotMHhhZWUyMDA3YywgMHg4ZWUyMDA3YywgMHg4ZWUyMDFmYywgMHgyNDQyMDAwMSwKLTB4YWVlMjAxZmMsIDB4ODAwM2M1NSwgMHg4ZWUyMDFmYywgMHgzYzA2MDAwNCwKLTB4M2MwYjAwMDEsIDB4M2MwYTAwMDIsIDB4M2MwNTAwMTAsIDB4M2MwOTAwMDgsCi0weDhlZTIwMDgwLCAweDNjMDgwMDIwLCAweDM0MDc4MDAwLCAweDI0NDIwMDAxLAotMHhhZWUyMDA4MCwgMHg4ZWUyMDA4MCwgMHg4ZmEyMDAxYywgMHg0NDE4MjQsCi0weDEwNjYwMDIxLCAweGMzMTAyYiwgMHgxNDQwMDAwNywgMHgwLAotMHgxMDZiMDAxMSwgMHgwLCAweDEwNmEwMDE1LCAweDAsCi0weDgwMDM5MTYsIDB4NDIwNDIsIDB4MTA2NTAwMjMsIDB4YTMxMDJiLAotMHgxNDQwMDAwNSwgMHgwLCAweDEwNjkwMDE5LCAweDAsCi0weDgwMDM5MTYsIDB4NDIwNDIsIDB4MTA2ODAwMjEsIDB4MCwKLTB4ODAwMzkxNiwgMHg0MjA0MiwgMHg4ZWUyMDAzNCwgMHgyNDQyMDAwMSwKLTB4YWVlMjAwMzQsIDB4OGVlMjAwMzQsIDB4ODAwMzkxNiwgMHg0MjA0MiwKLTB4OGVlMjAxZWMsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxZWMsIDB4OGVlMjAxZWMsCi0weDgwMDM5MTYsIDB4NDIwNDIsIDB4OGVlMjAxZjAsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMWYwLCAweDhlZTIwMWYwLCAweDgwMDM5MTYsIDB4NDIwNDIsCi0weDhlZTIwMWY0LCAweDI0NDIwMDAxLCAweGFlZTIwMWY0LCAweDhlZTIwMWY0LAotMHg4MDAzOTE2LCAweDQyMDQyLCAweDhlZTIwMDMwLCAweDI0NDIwMDAxLAotMHhhZWUyMDAzMCwgMHg4ZWUyMDAzMCwgMHg4MDAzOTE2LCAweDQyMDQyLAotMHg4ZWUyMDFmOCwgMHgyNDQyMDAwMSwgMHhhZWUyMDFmOCwgMHg4ZWUyMDFmOCwKLTB4NDIwNDIsIDB4MTA4NzAzM2UsIDB4MCwgMHg4MDAzOGRiLAotMHgwLCAweDNjMDIwMDAxLCAweDU3MTAyMSwgMHg5MDQyODNiMiwKLTB4MTQ0MDAwODQsIDB4MjQwMjAwMDEsIDB4M2MwMzAwMDEsIDB4NzcxODIxLAotMHg5MDYzODNiMywgMHgxNDYyMDA3ZiwgMHgzYzAyMDEwMCwgMHg4ZTQzMDAwMCwKLTB4NjIxMDI0LCAweDEwNDAwMDZmLCAweDI0MDJmZmZmLCAweDE0NjIwMDA1LAotMHgyNDExMDAwMSwgMHg5NjQzMDAwNCwgMHgzNDAyZmZmZiwgMHgxMDYyMDA3NSwKLTB4MCwgMHg5MmUyMDRkOCwgMHgxNDQwMDA3MiwgMHgwLAotMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OGM0MjgzYjQsIDB4Mjg0MjAwMDUsCi0weDEwNDAwMDIwLCAweDM4MjEsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLAotMHg4YzQyODNiNCwgMHgxODQwMDAxNiwgMHgyODIxLCAweDk2MDYwMDAwLAotMHg1MjBjMCwgMHg5NzEwMjEsIDB4OTQ0Mjc3N2UsIDB4MTQ0NjAwMDksCi0weDk3MTAyMSwgMHg5NDQzNzc4MCwgMHg5NjAyMDAwMiwgMHgxNDYyMDAwNSwKLTB4OTcxMDIxLCAweDk0NDM3NzgyLCAweDk2MDIwMDA0LCAweDUwNjIwMDA4LAotMHgyNDA3MDAwMSwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OGM0MjgzYjQsCi0weDI0YTUwMDAxLCAweGEyMTAyYSwgMHg1NDQwZmZlZSwgMHg1MjBjMCwKLTB4MzBlMjAwZmYsIDB4MTA0MDAzMDIsIDB4MCwgMHg4MDAzOWEyLAotMHgwLCAweDI0MDIwMjEsIDB4YzAwMjJmZSwgMHgyNDA1MDAwNiwKLTB4MzA0NDAwMWYsIDB4NDI4YzAsIDB4MmU1MTAyMSwgMHg5NDQyNzI3YywKLTB4MzA0MjQwMDAsIDB4MTQ0MDAyZjYsIDB4YjcxMDIxLCAweDk0NDM3MjdlLAotMHg5NjAyMDAwMCwgMHgxNDYyMDAwYiwgMHg0MThjMCwgMHhiNzEwMjEsCi0weDk0NDM3MjgwLCAweDk2MDIwMDAyLCAweDE0NjIwMDA2LCAweDQxOGMwLAotMHhiNzEwMjEsIDB4OTQ0MzcyODIsIDB4OTYwMjAwMDQsIDB4MTA2MjAwMzUsCi0weDQxOGMwLCAweDJlMzEwMjEsIDB4OTQ0MjcyN2MsIDB4MzA0MjgwMDAsCi0weDE0NDAwMmUzLCAweDJlMzEwMjEsIDB4OTQ0ZDcyN2MsIDB4OTYwNzAwMDAsCi0weGQyOGMwLCAweGI3MTAyMSwgMHg5NDQyNzM3ZSwgMHg4MDAzOTg0LAotMHgzMDIxLCAweDQyMGMwLCAweDJlNDEwMjEsIDB4OTQ0MzczN2MsCi0weDJlNDEwMjEsIDB4OTQ0ZDczN2MsIDB4MzA2MzgwMDAsIDB4MTQ2MDAwMTAsCi0weGQyOGMwLCAweGI3MTAyMSwgMHg5NDQyNzM3ZSwgMHgxNDQ3ZmZmNSwKLTB4MWEwMjAyMSwgMHhiNzEwMjEsIDB4OTQ0MzczODAsIDB4OTYwMjAwMDIsCi0weDU0NjJmZmYxLCAweDQyMGMwLCAweGI3MTAyMSwgMHg5NDQzNzM4MiwKLTB4OTYwMjAwMDQsIDB4NTQ2MmZmZWMsIDB4NDIwYzAsIDB4MjQwNjAwMDEsCi0weDMwYzIwMGZmLCAweDEwNDAwMmMyLCAweDAsIDB4ODAwMzlhMiwKLTB4MCwgMHg5NzQzMDIwMiwgMHg5NjQyMDAwMCwgMHgxNDYyMDJiYywKLTB4MCwgMHg5NzQzMDIwNCwgMHg5NjQyMDAwMiwgMHgxNDYyMDJiOCwKLTB4MCwgMHg5NzQzMDIwNiwgMHg5NjQyMDAwNCwgMHgxNDYyMDJiNCwKLTB4MCwgMHg5MjQyMDAwMCwgMHgzYTIzMDAwMSwgMHgzMDQyMDAwMSwKLTB4NDMxMDI0LCAweDEwNDAwMDc0LCAweDI0MDJmZmZmLCAweDhlMDMwMDAwLAotMHgxNDYyMDAwNCwgMHgzNDAyZmZmZiwgMHg5NjAzMDAwNCwgMHgxMDYyMDA2ZiwKLTB4MjQxNTAwMDIsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDkwNDI4M2IyLAotMHgxNDQwMDA2YSwgMHgyNDE1MDAwMywgMHg5MmUyMDRkOCwgMHgxNDQwMDA2NywKLTB4MCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OGM0MjgzYjQsCi0weDI4NDIwMDA1LCAweDEwNDAwMDIwLCAweDM4MjEsIDB4M2MwMjAwMDEsCi0weDU3MTAyMSwgMHg4YzQyODNiNCwgMHgxODQwMDAxNiwgMHgyODIxLAotMHg5NjA2MDAwMCwgMHg1MjBjMCwgMHg5NzEwMjEsIDB4OTQ0Mjc3N2UsCi0weDE0NDYwMDA5LCAweDk3MTAyMSwgMHg5NDQzNzc4MCwgMHg5NjAyMDAwMiwKLTB4MTQ2MjAwMDUsIDB4OTcxMDIxLCAweDk0NDM3NzgyLCAweDk2MDIwMDA0LAotMHg1MDYyMDAwOCwgMHgyNDA3MDAwMSwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsCi0weDhjNDI4M2I0LCAweDI0YTUwMDAxLCAweGEyMTAyYSwgMHg1NDQwZmZlZSwKLTB4NTIwYzAsIDB4MzBlMjAwZmYsIDB4MTQ0MDAwNDQsIDB4MjQxNTAwMDMsCi0weDgwMDNjNTUsIDB4MCwgMHgyNDAyMDIxLCAweGMwMDIyZmUsCi0weDI0MDUwMDA2LCAweDMwNDQwMDFmLCAweDQyOGMwLCAweDJlNTEwMjEsCi0weDk0NDI3MjdjLCAweDMwNDI0MDAwLCAweDE0NDAwMjcxLCAweGI3MTAyMSwKLTB4OTQ0MzcyN2UsIDB4OTYwMjAwMDAsIDB4MTQ2MjAwMGIsIDB4NDE4YzAsCi0weGI3MTAyMSwgMHg5NDQzNzI4MCwgMHg5NjAyMDAwMiwgMHgxNDYyMDAwNiwKLTB4NDE4YzAsIDB4YjcxMDIxLCAweDk0NDM3MjgyLCAweDk2MDIwMDA0LAotMHgxMDYyMDAyNywgMHg0MThjMCwgMHgyZTMxMDIxLCAweDk0NDI3MjdjLAotMHgzMDQyODAwMCwgMHgxNDQwMDI1ZSwgMHgyZTMxMDIxLCAweDk0NGQ3MjdjLAotMHg5NjA3MDAwMCwgMHhkMjhjMCwgMHhiNzEwMjEsIDB4OTQ0MjczN2UsCi0weDgwMDNhMDksIDB4MzAyMSwgMHg0MjBjMCwgMHgyZTQxMDIxLAotMHg5NDQzNzM3YywgMHgyZTQxMDIxLCAweDk0NGQ3MzdjLCAweDMwNjM4MDAwLAotMHgxNDYwMDAxMCwgMHhkMjhjMCwgMHhiNzEwMjEsIDB4OTQ0MjczN2UsCi0weDE0NDdmZmY1LCAweDFhMDIwMjEsIDB4YjcxMDIxLCAweDk0NDM3MzgwLAotMHg5NjAyMDAwMiwgMHg1NDYyZmZmMSwgMHg0MjBjMCwgMHhiNzEwMjEsCi0weDk0NDM3MzgyLCAweDk2MDIwMDA0LCAweDU0NjJmZmVjLCAweDQyMGMwLAotMHgyNDA2MDAwMSwgMHgzMGMyMDBmZiwgMHgxMDQwMDIzZCwgMHgwLAotMHg4MDAzYTFjLCAweDI0MTUwMDAzLCAweDI0MTUwMDAxLCAweDhmNDIwMjYwLAotMHg1MzEwMmIsIDB4MTA0MDAwMzYsIDB4MCwgMHg4ZjgzMDBlNCwKLTB4OGY4MjAwZTAsIDB4MTA2MjAwMDMsIDB4MjQ2MzAwMDgsIDB4YWY4MzAwZTQsCi0weGFmODMwMGU4LCAweDhlZTQwMGMwLCAweDhlZTUwMGM0LCAweDI2MDE4MjEsCi0weDEwMjEsIDB4YTMyODIxLCAweGEzMzAyYiwgMHg4MjIwMjEsCi0weDg2MjAyMSwgMHhhZWU0MDBjMCwgMHhhZWU1MDBjNCwgMHg4ZWUyMDA1OCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAwNTgsIDB4OGVlMjAwNTgsIDB4OGVlMjAwN2MsCi0weDI0NDIwMDAxLCAweGFlZTIwMDdjLCAweDhlZTIwMDdjLCAweDhmODIwMGUwLAotMHhhZmEyMDAxMCwgMHg4ZjgyMDBlNCwgMHgzYzA0MDAwMSwgMHgyNDg0NThjMCwKLTB4YWZhMjAwMTQsIDB4OGZhNjAwMTgsIDB4OGZhNzAwMWMsIDB4M2MwNTAwMDYsCi0weGMwMDI0MDMsIDB4MzRhNWYyMDMsIDB4ODAwM2M1YiwgMHgwLAotMHg4ZWUyNTI0MCwgMHhhZmEyMDAxMCwgMHg4ZWUyNTI0NCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDU4Y2MsIDB4YWZhMjAwMTQsIDB4OGVlNjBlMTAsIDB4OGVlNzBlMTgsCi0weDNjMDUwMDA2LCAweGMwMDI0MDMsIDB4MzRhNWYyMDIsIDB4OGVlMjAxYzAsCi0weDI0NDIwMDAxLCAweGFlZTIwMWMwLCAweDgwMDNjMDIsIDB4OGVlMjAxYzAsCi0weDk2ZTIwNDY4LCAweDUzMTAyYiwgMHg1NDQwMDAwMSwgMHgzYzE2ODAwMCwKLTB4MTI2MDAxY2IsIDB4M2MwZTAwMWYsIDB4MzVjZWZmZmYsIDB4M2MwZmZmZjUsCi0weDM1ZWYxMDAwLCAweDI0MWUwMDQwLCAweDhlZTI3MjRjLCAweDhmNDMwMjgwLAotMHgyNDQyMDAwMSwgMHgzMDQyMDdmZiwgMHgxMDYyMDE5ZSwgMHgwLAotMHgxMmMwMDAxMiwgMHgwLCAweDhlZTM1MjQwLCAweDhlZTI1MjQ0LAotMHgxMDYyMDAwYSwgMHgyNmY4NTI0NCwgMHg4ZWY0NTI0NCwgMHhhZmI4MDAyNCwKLTB4OGVlMzUyNDQsIDB4MjExNDAsIDB4MjQ0MjUyNDgsIDB4MmUyODgyMSwKLTB4MjQ2MzAwMDEsIDB4ODAwM2E4NSwgMHgzMDZkMDBmZiwgMHg4ZWUyMDFlMCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxZTAsIDB4OGVlMjAxZTAsIDB4OGVlMzBlMTAsCi0weDhlZTIwZTE4LCAweDEwNjJmZmNhLCAweDI2ZjgwZTE4LCAweDhlZjQwZTE4LAotMHhiMDIxLCAweGFmYjgwMDI0LCAweDhlZTMwZTE4LCAweDIxMTQwLAotMHgyNDQyMGUyMCwgMHgyZTI4ODIxLCAweDI0NjMwMDAxLCAweDMwNmQwMWZmLAotMHg5NmUyMDQ2YSwgMHgzMDQyMDAxMCwgMHgxMDQwMDAxOCwgMHgzNDAyODEwMCwKLTB4OTY0MzAwMGMsIDB4MTQ2MjAwMTUsIDB4MCwgMHgzYzAyMDAwMSwKLTB4NTcxMDIxLCAweDkwNDI4M2MwLCAweDE0NDAwMDEwLCAweDAsCi0weDk2NDIwMDBlLCAweGE2MjIwMDE2LCAweDhlNDIwMDA4LCAweDhlNDMwMDA0LAotMHg4ZTQ0MDAwMCwgMHgyNjczZmZmYywgMHhhZTQyMDAwYywgMHhhZTQzMDAwOCwKLTB4YWU0NDAwMDQsIDB4OTYyMjAwMGUsIDB4MjYxMDAwMDQsIDB4MjQxODAwMDEsCi0weGEzYjgwMDJmLCAweDM0NDIwMjAwLCAweGE2MjIwMDBlLCAweDhlMjIwMDAwLAotMHg4ZTIzMDAwNCwgMHgzYzA0MDAwMSwgMHgzNDg0MzgwMCwgMHgyMDAzMDIxLAotMHgzMDZhMDAwNywgMHgyMGE4MDIzLCAweDM2NDEwMjEsIDB4MjAyMTAyYiwKLTB4MTA0MDAwMDUsIDB4MjZhOTgyMSwgMHgyMDQxMDIzLCAweDM2MjE4MjMsCi0weDNjMDIwMDIwLCAweDQzODAyMywgMHgyNjYyMDAwNywgMHg5NjIzMDAwYSwKLTB4MjQxOGZmZjgsIDB4NThjODI0LCAweDZhMTgyMSwgMHg3OTEwMmIsCi0weDEwNDAwMDAyLCAweDMyMDYwMjEsIDB4NjA2MDIxLCAweDE4MDE4MjEsCi0weDI0NjIwMDA3LCAweDI0MThmZmY4LCAweDU4NjAyNCwgMHgyNmMxMDJiLAotMHgxNDQwMDAwNCwgMHgxOTMyODIzLCAweDE4MzI4MjMsIDB4ODAwM2FjMywKLTB4YzMxMDIxLCAweGQzMTAyMSwgMHg0YTIwMjMsIDB4MWM0MTAyYiwKLTB4NTQ0MDAwMDEsIDB4OGYyMDIxLCAweDI1NDIwMDQwLCAweDRjMTAyYiwKLTB4MTQ0MDAwMzUsIDB4NTgyMSwgMHg5NGMzMDAwYywgMHgyNDAyMDgwMCwKLTB4NTQ2MjAwMzIsIDB4YWUyNjAwMTgsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLAotMHg5MDQyODNjMCwgMHg1NDQwMDAyZCwgMHhhZTI2MDAxOCwgMHgyNGMyMDAxNywKLTB4MWMyMTAyYiwgMHgxMDQwMDAxMywgMHgwLCAweDNjMDJmZmY1LAotMHg0NjEwMjEsIDB4OTA0MjEwMTcsIDB4Mzg0MzAwMDYsIDB4MmM2MzAwMDEsCi0weDM4NDIwMDExLCAweDJjNDIwMDAxLCAweDYyMTgyNSwgMHgxMDYwMDAxNCwKLTB4MjRjMjAwMTAsIDB4MWMyMTAyYiwgMHgxMDQwMDAwZSwgMHgwLAotMHgzYzBiZmZmNSwgMHgxNjY1ODIxLCAweDk1NmIxMDEwLCAweDgwMDNhZjQsCi0weDI1NjIwMDBlLCAweDkwYzIwMDE3LCAweDM4NDMwMDA2LCAweDJjNjMwMDAxLAotMHgzODQyMDAxMSwgMHgyYzQyMDAwMSwgMHg2MjE4MjUsIDB4MTA2MDAwMDUsCi0weDE2MDE4MjEsIDB4OTRjYjAwMTAsIDB4MjU2MjAwMGUsIDB4NGE1ODIxLAotMHgxNjAxODIxLCAweDI0NjIwMDA3LCAweDI0MThmZmY4LCAweDU4NTgyNCwKLTB4YzMxMDIxLCAweDRhMjAyMywgMHgxYzQxMDJiLCAweDEwNDAwMDAyLAotMHgxNjMyODIzLCAweDhmMjAyMSwgMHhhZTI2MDAxOCwgMHgzYzAyMDAwMSwKLTB4NTcxMDIxLCAweDkwNDI4M2MwLCAweDIxMDJiLCAweDIxNmMwLAotMHgxNTYwMDAwMiwgMHhhZmEyMDA0NCwgMHgxODA1ODIxLCAweDMwODIwMDAxLAotMHgxMDQwMDAwNywgMHg0MDIxLCAweDkwODgwMDAwLCAweDI0ODQwMDAxLAotMHgxYzQxMDJiLCAweDEwNDAwMDAyLCAweDI0YTVmZmZmLCAweDhmMjAyMSwKLTB4NTBhMDAwMTIsIDB4ODFjMDIsIDB4MmNhMjAwMDIsIDB4NTQ0MDAwMDksCi0weDI0YTVmZmZmLCAweDk0ODIwMDAwLCAweDI0ODQwMDAyLCAweDEwMjQwMjEsCi0weDFjNDEwMmIsIDB4MTA0MDAwMDYsIDB4MjRhNWZmZmUsIDB4ODAwM2IyMSwKLTB4OGYyMDIxLCAweDkwODIwMDAwLCAweDIxMjAwLCAweDEwMjQwMjEsCi0weDE0YTBmZmYyLCAweDJjYTIwMDAyLCAweDgxYzAyLCAweDMxMDJmZmZmLAotMHg2MjQwMjEsIDB4MzEwOGZmZmYsIDB4MTQwMjgyMSwgMHgxMTQwMDAxMSwKLTB4MjAwMjAyMSwgMHgyY2EyMDAwMiwgMHg1NDQwMDAwOSwgMHgyNGE1ZmZmZiwKLTB4OTQ4MjAwMDAsIDB4MjQ4NDAwMDIsIDB4MTAyNDAyMSwgMHgxYzQxMDJiLAotMHgxMDQwMDAwNiwgMHgyNGE1ZmZmZSwgMHg4MDAzYjM4LCAweDhmMjAyMSwKLTB4OTA4MjAwMDAsIDB4MjEyMDAsIDB4MTAyNDAyMSwgMHgxNGEwZmZmMiwKLTB4MmNhMjAwMDIsIDB4ODFjMDIsIDB4MzEwMmZmZmYsIDB4NjI0MDIxLAotMHg4MWMwMiwgMHgzMTAyZmZmZiwgMHg4Zjg5MDEyMCwgMHg2MjQwMjEsCi0weDI3NjIzODAwLCAweDI1MjMwMDIwLCAweDYyMTAyYiwgMHgxNDQwMDAwMiwKLTB4MzEwOGZmZmYsIDB4Mjc2MzMwMDAsIDB4OGY4MjAxMjgsIDB4MTA2MjAwMDQsCi0weDAsIDB4OGY4MjAxMjQsIDB4MTQ2MjAwMDcsIDB4MTQwMjgyMSwKLTB4OGVlMjAxYTQsIDB4MzgyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwKLTB4ODAwM2JjOSwgMHg4ZWUyMDFhNCwgMHg4ZTI2MDAwMCwgMHg4ZTI3MDAwNCwKLTB4ODE0MDAsIDB4MzQ0ODAwMGIsIDB4YWQzMDAwMDgsIDB4YTUyYjAwMGUsCi0weGFkMjgwMDE4LCAweDhmYjgwMDQ0LCAweDIwMjEsIDB4Mjk2MTAyNSwKLTB4NTgxMDI1LCAweGFkMjIwMDFjLCAweGU1MTAyYiwgMHhlNTM4MjMsCi0weGM0MzAyMywgMHhjMjMwMjMsIDB4YWQyNjAwMDAsIDB4YWQyNzAwMDQsCi0weDhlZTIwNGMwLCAweGFkMjIwMDEwLCAweGFmODMwMTIwLCAweDkyZTI0ZTIwLAotMHgxNDQwMDA1ZiwgMHgyNDA3MDAwMSwgMHgyNTAyZmZlZSwgMHgyYzQyMDAwMiwKLTB4MTQ0MDAwMDMsIDB4MjQwMjAwMTEsIDB4MTUwMjAwMjQsIDB4MCwKLTB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwKLTB4OGM4MzAwMDAsIDB4MjQwMjAwMTIsIDB4MTQ2MjAwMGYsIDB4MCwKLTB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsIDB4MTA2MjAwMGIsIDB4MCwKLTB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsCi0weDhlZTM0ZTMwLCAweDI0NDIwMDAxLCAweDEwNWUwMDJhLCAweDAsCi0weDgwMDNiYTgsIDB4MCwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwKLTB4NTA1ZTAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwKLTB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsCi0weDJlMjIwMjEsIDB4ODAwM2JjNiwgMHgyNDAyMDAxMiwgMHg4ZWUyNGUzMCwKLTB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHg4YzgzMDAwMCwKLTB4MjQwMjAwMDcsIDB4MTQ2MjAwMWYsIDB4MCwgMHg4ZWUzNGUzMCwKLTB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIDB4MCwgMHg4YzgyMDAwNCwKLTB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIDB4OGVlMzRlMzAsCi0weDI0NDIwMDAxLCAweDEwNWUwMDA3LCAweDAsIDB4OGVlMjRlMzQsCi0weDI0NDIwMDAxLCAweDEwNjIwMDA1LCAweDAsIDB4ODAwM2JiNCwKLTB4MCwgMHgxNDYwMDAwNSwgMHgwLCAweDhmODIwMTI4LAotMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwKLTB4MmM0MjAwMTEsIDB4NTA0MDAwMTIsIDB4YWM4MDAwMDAsIDB4ODAwM2JjOSwKLTB4MCwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHg1MDVlMDAwMywKLTB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwKLTB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwKLTB4MjQwMjAwMDcsIDB4YWM4MjAwMDAsIDB4MjQwMjAwMDEsIDB4YWM4MjAwMDQsCi0weDE0ZTAwMDE5LCAweDNjMDUwMDA2LCAweDNjMDQwMDAxLCAweDI0ODQ1ODkwLAotMHg4ZTIyMDAxOCwgMHgzNGE1ZjIwOSwgMHhhZmEyMDAxMCwgMHg4ZTIyMDAwMCwKLTB4OGUyMzAwMDQsIDB4MjIwMzAyMSwgMHgxNjAzODIxLCAweGMwMDI0MDMsCi0weGFmYTMwMDE0LCAweDkzYTIwMDJmLCAweDEwNDAwMDJhLCAweDM0MDI4MTAwLAotMHg4ZTQzMDAwNCwgMHg4ZTQ0MDAwOCwgMHg4ZTQ1MDAwYywgMHhhNjQyMDAwYywKLTB4YWU0MzAwMDAsIDB4YWU0NDAwMDQsIDB4YWU0NTAwMDgsIDB4OTYyMjAwMTYsCi0weDgwMDNjMDIsIDB4YTY0MjAwMGUsIDB4MTU5OTAwMGEsIDB4MjZhMTgyMywKLTB4OTYyMjAwMGUsIDB4YTYyMzAwMGEsIDB4MzQ0MjAwMDQsIDB4YTYyMjAwMGUsCi0weDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDIwODNjMCwgMHg4MDAzYmZmLAotMHg5ODIxLCAweDk2MjQwMDBhLCAweDgzMTAyYiwgMHg1NDQwMDAwMSwKLTB4ODAxODIxLCAweDI0MDIwMDAxLCAweGE2MjMwMDBhLCAweDNjMDEwMDAxLAotMHgzNzA4MjEsIDB4YTAyMjgzYzAsIDB4OTYyMjAwMGEsIDB4NGExODIxLAotMHgyMDM4MDIxLCAweDFkMDEwMmIsIDB4NTQ0MDAwMDEsIDB4MjBmODAyMSwKLTB4MjYzOTgyMywgMHhiMDIxLCAweDhmYjgwMDI0LCAweDE2NjBmZTVlLAotMHhhZjBkMDAwMCwgMHgxMjYwMDAyMiwgMHgwLCAweDNjMDEwMDAxLAotMHgzNzA4MjEsIDB4YWMzMzgzYzQsIDB4M2MwMTAwMDEsIDB4MzcwODIxLAotMHhhYzMwODNjOCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YWMzMjgzY2MsCi0weDkzYTIwMDJmLCAweDEwNDAwMDA4LCAweDAsIDB4M2MwMjAwMDEsCi0weDU3MTAyMSwgMHg4YzQyODNjYywgMHgyNDQyMDAwNCwgMHgzYzAxMDAwMSwKLTB4MzcwODIxLCAweGFjMjI4M2NjLCAweDhmNDMwMjgwLCAweDhlZTI3MjRjLAotMHgxNDYyMDAwNiwgMHgwLCAweDhlZTIwMWM0LCAweDI0NDIwMDAxLAotMHhhZWUyMDFjNCwgMHg4MDAzYzViLCAweDhlZTIwMWM0LCAweDhlZTIwMWJjLAotMHgyNDQyMDAwMSwgMHhhZWUyMDFiYywgMHg4MDAzYzViLCAweDhlZTIwMWJjLAotMHg5N2E0MDAxZSwgMHgyNDg0ZmZmYywgMHg4MDE4MjEsIDB4OGVlNDAwYzAsCi0weDhlZTUwMGM0LCAweDEwMjEsIDB4YTMyODIxLCAweGEzMzAyYiwKLTB4ODIyMDIxLCAweDg2MjAyMSwgMHgyNDAyMDAwMiwgMHhhZWU0MDBjMCwKLTB4YWVlNTAwYzQsIDB4MTJhMjAwMGYsIDB4MmFhMjAwMDMsIDB4MTQ0MDAwMTcsCi0weDI0MDIwMDAzLCAweDE2YTIwMDE1LCAweDAsIDB4OGVlMjAwZDAsCi0weDhlZTMwMGQ0LCAweDI0NjMwMDAxLCAweDJjNjQwMDAxLCAweDQ0MTAyMSwKLTB4YWVlMjAwZDAsIDB4YWVlMzAwZDQsIDB4OGVlMjAwZDAsIDB4ODAwM2M1NSwKLTB4OGVlMzAwZDQsIDB4OGVlMjAwZDgsIDB4OGVlMzAwZGMsIDB4MjQ2MzAwMDEsCi0weDJjNjQwMDAxLCAweDQ0MTAyMSwgMHhhZWUyMDBkOCwgMHhhZWUzMDBkYywKLTB4OGVlMjAwZDgsIDB4ODAwM2M1NSwgMHg4ZWUzMDBkYywgMHg4ZWUyMDBjOCwKLTB4OGVlMzAwY2MsIDB4MjQ2MzAwMDEsIDB4MmM2NDAwMDEsIDB4NDQxMDIxLAotMHhhZWUyMDBjOCwgMHhhZWUzMDBjYywgMHg4ZWUyMDBjOCwgMHg4ZWUzMDBjYywKLTB4OGY4MzAwZTQsIDB4OGY4MjAwZTAsIDB4MTA2MjAwMDMsIDB4MjQ2MzAwMDgsCi0weGFmODMwMGU0LCAweGFmODMwMGU4LCAweDhmYmYwMDY4LCAweDhmYmUwMDY0LAotMHg4ZmI2MDA2MCwgMHg4ZmI1MDA1YywgMHg4ZmI0MDA1OCwgMHg4ZmIzMDA1NCwKLTB4OGZiMjAwNTAsIDB4OGZiMTAwNGMsIDB4OGZiMDAwNDgsIDB4M2UwMDAwOCwKLTB4MjdiZDAwNzAsIDB4MjdiZGZmZTAsIDB4YWZiZjAwMTgsIDB4OGVlMzBlMTQsCi0weDhlZTIwZTBjLCAweDEwNjIwMDc0LCAweDAsIDB4OGVlMzBlMGMsCi0weDhlZTIwZTE0LCAweDYyMjAyMywgMHg0ODIwMDAxLCAweDI0ODQwMjAwLAotMHg4ZWUzMGUxOCwgMHg4ZWUyMGUxNCwgMHg0MzEwMmIsIDB4MTQ0MDAwMDQsCi0weDI0MDIwMjAwLCAweDhlZTMwZTE0LCAweDgwMDNjN2QsIDB4NDMxODIzLAotMHg4ZWUyMGUxOCwgMHg4ZWUzMGUxNCwgMHg0MzEwMjMsIDB4MjQ0M2ZmZmYsCi0weDgwNDgyMSwgMHg2OTEwMmEsIDB4NTQ0MDAwMDEsIDB4NjA0ODIxLAotMHg4Zjg3MDEwMCwgMHgyNzYyMzAwMCwgMHgyNGU4MDAyMCwgMHgxMDIxMDJiLAotMHg1MDQwMDAwMSwgMHgyNzY4MjgwMCwgMHg4ZjgyMDEwOCwgMHgxMTAyMDAwNCwKLTB4MCwgMHg4ZjgyMDEwNCwgMHgxNTAyMDAwNywgMHgxMDIxLAotMHg4ZWUyMDFhOCwgMHgyMDIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWE4LAotMHg4MDAzY2JmLCAweDhlZTIwMWE4LCAweDhlZTQwZTE0LCAweDQyMTQwLAotMHg4MDE4MjEsIDB4OGVlNDA0NjAsIDB4OGVlNTA0NjQsIDB4YTMyODIxLAotMHhhMzMwMmIsIDB4ODIyMDIxLCAweDg2MjAyMSwgMHhhY2U0MDAwMCwKLTB4YWNlNTAwMDQsIDB4OGVlMzBlMTQsIDB4OTExNDAsIDB4YTRlMjAwMGUsCi0weDI0MDIwMDAyLCAweGFjZTIwMDE4LCAweDMxOTQwLCAweDI0NjMwZTIwLAotMHgyZTMxMDIxLCAweGFjZTIwMDA4LCAweDhlZTIwZTE0LCAweGFjZTIwMDFjLAotMHg4ZWUyMDRjYywgMHhhY2UyMDAxMCwgMHhhZjg4MDEwMCwgMHg5MmUyMDRlYywKLTB4MTQ0MDAwMTEsIDB4MjQwNDAwMDEsIDB4OGVlMjRlMjgsIDB4MjQwMzAwNDAsCi0weDI0NDIwMDAxLCAweDUwNDMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMjgsCi0weDI0NDIwMDAxLCAweGFlZTI0ZTI4LCAweDhlZTI0ZTI4LCAweDIxMGMwLAotMHgyNDQyNGUzOCwgMHgyZTIxODIxLCAweDI0MDIwMDAyLCAweGFjNjIwMDAwLAotMHgyNDAyMDAwMSwgMHhhYzYyMDAwNCwgMHgxNDgwMDAwZSwgMHgyNDAzMDA0MCwKLTB4OGVlMjBlMTQsIDB4YWZhMjAwMTAsIDB4OGVlMjBlMTgsIDB4M2MwNTAwMDcsCi0weGFmYTIwMDE0LCAweDhlZTYwZTBjLCAweDhlZTcwZTEwLCAweDNjMDQwMDAxLAotMHgyNDg0NThkNCwgMHhjMDAyNDAzLCAweDM0YTVmMDAxLCAweDgwMDNjZGQsCi0weDAsIDB4OGVlMjA1MDAsIDB4MjQ0MjAwMDEsIDB4NTA0MzAwMDMsCi0weDEwMjEsIDB4OGVlMjA1MDAsIDB4MjQ0MjAwMDEsIDB4YWVlMjA1MDAsCi0weDhlZTIwNTAwLCAweDIxMDgwLCAweDU3MTAyMSwgMHhhYzQ5MDUwOCwKLTB4OGVlMjBlMTQsIDB4NDkxMDIxLCAweDMwNDIwMWZmLCAweGFlZTIwZTE0LAotMHg4ZWUzMGUxNCwgMHg4ZWUyMGUwYywgMHgxNDYyMDAwNSwgMHgwLAotMHg4ZjgyMDA2MCwgMHgyNDAzZmRmZiwgMHg0MzEwMjQsIDB4YWY4MjAwNjAsCi0weDhmYmYwMDE4LCAweDNlMDAwMDgsIDB4MjdiZDAwMjAsIDB4MjdiZGZmZTAsCi0weGFmYmYwMDE4LCAweDhlZTM1MjNjLCAweDhlZTI1MjM4LCAweDEwNjIwMDc0LAotMHgwLCAweDhlZTM1MjM4LCAweDhlZTI1MjNjLCAweDYyMjAyMywKLTB4NDgyMDAwMSwgMHgyNDg0MDEwMCwgMHg4ZWUzNTI0NCwgMHg4ZWUyNTIzYywKLTB4NDMxMDJiLCAweDE0NDAwMDA0LCAweDI0MDIwMTAwLCAweDhlZTM1MjNjLAotMHg4MDAzY2ZmLCAweDQzMTgyMywgMHg4ZWUyNTI0NCwgMHg4ZWUzNTIzYywKLTB4NDMxMDIzLCAweDI0NDNmZmZmLCAweDgwNDgyMSwgMHg2OTEwMmEsCi0weDU0NDAwMDAxLCAweDYwNDgyMSwgMHg4Zjg3MDEwMCwgMHgyNzYyMzAwMCwKLTB4MjRlODAwMjAsIDB4MTAyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY4MjgwMCwKLTB4OGY4MjAxMDgsIDB4MTEwMjAwMDQsIDB4MCwgMHg4ZjgyMDEwNCwKLTB4MTUwMjAwMDcsIDB4MTAyMSwgMHg4ZWUyMDFhOCwgMHgyMDIxLAotMHgyNDQyMDAwMSwgMHhhZWUyMDFhOCwgMHg4MDAzZDQxLCAweDhlZTIwMWE4LAotMHg4ZWU0NTIzYywgMHg0MjE0MCwgMHg4MDE4MjEsIDB4OGVlNDA0NzAsCi0weDhlZTUwNDc0LCAweGEzMjgyMSwgMHhhMzMwMmIsIDB4ODIyMDIxLAotMHg4NjIwMjEsIDB4YWNlNDAwMDAsIDB4YWNlNTAwMDQsIDB4OGVlMzUyM2MsCi0weDkxMTQwLCAweGE0ZTIwMDBlLCAweDI0MDIwMDAzLCAweGFjZTIwMDE4LAotMHgzMTk0MCwgMHgyNDYzNTI0OCwgMHgyZTMxMDIxLCAweGFjZTIwMDA4LAotMHg4ZWUyNTIzYywgMHhhY2UyMDAxYywgMHg4ZWUyMDRjYywgMHhhY2UyMDAxMCwKLTB4YWY4ODAxMDAsIDB4OTJlMjA0ZWMsIDB4MTQ0MDAwMTEsIDB4MjQwNDAwMDEsCi0weDhlZTI0ZTI4LCAweDI0MDMwMDQwLCAweDI0NDIwMDAxLCAweDUwNDMwMDAzLAotMHgxMDIxLCAweDhlZTI0ZTI4LCAweDI0NDIwMDAxLCAweGFlZTI0ZTI4LAotMHg4ZWUyNGUyOCwgMHgyMTBjMCwgMHgyNDQyNGUzOCwgMHgyZTIxODIxLAotMHgyNDAyMDAwMywgMHhhYzYyMDAwMCwgMHgyNDAyMDAwMSwgMHhhYzYyMDAwNCwKLTB4MTQ4MDAwMGUsIDB4MjQwMzAwNDAsIDB4OGVlMjUyM2MsIDB4YWZhMjAwMTAsCi0weDhlZTI1MjQ0LCAweDNjMDUwMDA3LCAweGFmYTIwMDE0LCAweDhlZTY1MjM4LAotMHg4ZWU3NTI0MCwgMHgzYzA0MDAwMSwgMHgyNDg0NThlMCwgMHhjMDAyNDAzLAotMHgzNGE1ZjAxMCwgMHg4MDAzZDVmLCAweDAsIDB4OGVlMjA1MDAsCi0weDI0NDIwMDAxLCAweDUwNDMwMDAzLCAweDEwMjEsIDB4OGVlMjA1MDAsCi0weDI0NDIwMDAxLCAweGFlZTIwNTAwLCAweDhlZTIwNTAwLCAweDIxMDgwLAotMHg1NzEwMjEsIDB4YWM0OTA1MDgsIDB4OGVlMjUyM2MsIDB4NDkxMDIxLAotMHgzMDQyMDBmZiwgMHhhZWUyNTIzYywgMHg4ZWUzNTIzYywgMHg4ZWUyNTIzOCwKLTB4MTQ2MjAwMDUsIDB4MCwgMHg4ZjgyMDA2MCwgMHgyNDAzZmVmZiwKLTB4NDMxMDI0LCAweGFmODIwMDYwLCAweDhmYmYwMDE4LCAweDNlMDAwMDgsCi0weDI3YmQwMDIwLCAweDhmODIwMTIwLCAweDhlZTM0ZTM0LCAweDhmODIwMTI0LAotMHg4Zjg2MDEyOCwgMHgyNDAyMDA0MCwgMHgyNDYzMDAwMSwgMHg1MDYyMDAwMywKLTB4MTAyMSwgMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUzNCwKLTB4OGVlMjRlMzQsIDB4OGVlNDRlMzQsIDB4OGVlMzRlMzAsIDB4MjEwYzAsCi0weDI0NDI1MDM4LCAweDE0ODMwMDA3LCAweDJlMjI4MjEsIDB4OGY4MjAxMjgsCi0weDI0NDIwMDIwLCAweGFmODIwMTI4LCAweDhmODIwMTI4LCAweDgwMDNkOTIsCi0weGFjYTAwMDAwLCAweDhlZTI0ZTM0LCAweDI0MDMwMDQwLCAweDI0NDIwMDAxLAotMHg1MDQzMDAwMywgMHgxMDIxLCAweDhlZTI0ZTM0LCAweDI0NDIwMDAxLAotMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyODIxLCAweDhjYTIwMDA0LAotMHg4ZjgzMDEyOCwgMHgyMTE0MCwgMHg2MjE4MjEsIDB4YWY4MzAxMjgsCi0weGFjYTAwMDAwLCAweDhjYzIwMDE4LCAweDI0NDNmZmZlLCAweDJjNjIwMDEyLAotMHgxMDQwMDAwOCwgMHgzMTA4MCwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsCi0weDhjMjI1OGYwLCAweDQwMDAwOCwgMHgwLCAweDI0MDIwMDAxLAotMHhhZWUyNGUyNCwgMHgzZTAwMDA4LCAweDAsIDB4MjdiZGZmYzgsCi0weGFmYmYwMDMwLCAweGFmYjUwMDJjLCAweGFmYjQwMDI4LCAweGFmYjMwMDI0LAotMHhhZmIyMDAyMCwgMHhhZmIxMDAxYywgMHhhZmIwMDAxOCwgMHg4ZjgzMDEyOCwKLTB4OGY4MjAxMjQsIDB4MTA2MjAyYjAsIDB4OTgyMSwgMHgzYzExMDAxZiwKLTB4MzYzMWZmZmYsIDB4M2MxMmZmZjUsIDB4MzY1MjEwMDAsIDB4MjQxNTAwMTIsCi0weDI0MTQwMDQwLCAweDhmOGMwMTI4LCAweDhmODIwMTI4LCAweDI0NDIwMDIwLAotMHhhZjgyMDEyOCwgMHg5MTgyMDAxYiwgMHg4ZjgzMDEyOCwgMHgyNDQzZmZmZSwKLTB4MmM2MjAwMTIsIDB4MTA0MDAyOWMsIDB4MzEwODAsIDB4M2MwMTAwMDEsCi0weDIyMDgyMSwgMHg4YzIyNTk0OCwgMHg0MDAwMDgsIDB4MCwKLTB4OGY0MjAyMTgsIDB4MzA0MjAxMDAsIDB4MTA0MDAwMDcsIDB4MCwKLTB4OTU4MzAwMTYsIDB4OTU4MjAwMTgsIDB4NjIxODIzLCAweDMxNDAyLAotMHg0MzEwMjEsIDB4YTU4MjAwMTYsIDB4OGQ4MjAwMWMsIDB4M2MwMzgwMDAsCi0weDMwNDRmZmZmLCAweDQzNjgyNCwgMHgzYzAzMDgwMCwgMHg0MzE4MjQsCi0weDExYTAwMDA0LCAweGFkODQwMDFjLCAweDQxMTQwLCAweDgwMDNkZDgsCi0weDI0NDI1MjQ4LCAweDQxMTQwLCAweDI0NDIwZTIwLCAweDJlMjU4MjEsCi0weDk1NjIwMDBlLCAweDMwNDJmZmZjLCAweDEwNjAwMDA0LCAweGE1NjIwMDBlLAotMHg5NTg0MDAxNiwgMHg4MDAzZWMwLCAweDAsIDB4OGQ2OTAwMTgsCi0weDQwMjEsIDB4OTUyYTAwMDAsIDB4MjUyOTAwMDIsIDB4OTUyNzAwMDAsCi0weDI1MjkwMDAyLCAweDk1MjYwMDAwLCAweDI1MjkwMDAyLCAweDk1MjUwMDAwLAotMHgyNTI5MDAwMiwgMHg5NTI0MDAwMCwgMHgyNTI5MDAwMiwgMHg5NTIzMDAwMCwKLTB4MjUyOTAwMDIsIDB4OTUyMjAwMDAsIDB4MjUyOTAwMDIsIDB4MTQ3NTAyMSwKLTB4MTQ2NTAyMSwgMHgxNDU1MDIxLCAweDE0NDUwMjEsIDB4MTQzNTAyMSwKLTB4MTQyNTAyMSwgMHhhMWMwMiwgMHgzMTQyZmZmZiwgMHg2MjUwMjEsCi0weGExYzAyLCAweDMxNDJmZmZmLCAweDYyNTAyMSwgMHg5NmUyMDQ2YSwKLTB4MzE0ZWZmZmYsIDB4MzA0MjAwMDIsIDB4MTA0MDAwNDQsIDB4NTAyMSwKLTB4MjUyMjAwMTQsIDB4MjIyMTAyYiwgMHgxMDQwMDAxNCwgMHgxMjAxODIxLAotMHgyNDA1MDAwYSwgMHgyMDIxLCAweDIyMzEwMmIsIDB4NTQ0MDAwMDEsCi0weDcyMTgyMSwgMHg5NDYyMDAwMCwgMHgyNDYzMDAwMiwgMHgyNGE1ZmZmZiwKLTB4MTRhMGZmZjksIDB4ODIyMDIxLCAweDQxYzAyLCAweDMwODJmZmZmLAotMHg2MjIwMjEsIDB4NDE0MDIsIDB4MzA4M2ZmZmYsIDB4NDMxMDIxLAotMHgzMDQyZmZmZiwgMHg4MDAzZTMzLCAweDE0MjUwMjEsIDB4OTUyYTAwMDAsCi0weDI1MjkwMDAyLCAweDk1MjgwMDAwLCAweDI1MjkwMDAyLCAweDk1MjcwMDAwLAotMHgyNTI5MDAwMiwgMHg5NTI2MDAwMCwgMHgyNTI5MDAwMiwgMHg5NTI1MDAwMCwKLTB4MjUyOTAwMDIsIDB4OTUyMzAwMDAsIDB4MjUyOTAwMDIsIDB4OTUyMjAwMDAsCi0weDI1MjkwMDAyLCAweDk1MjQwMDAwLCAweDI1MjkwMDAyLCAweDE0ODUwMjEsCi0weDE0NzUwMjEsIDB4MTQ2NTAyMSwgMHgxNDU1MDIxLCAweDE0MzUwMjEsCi0weDE0MjUwMjEsIDB4OTUyMjAwMDAsIDB4OTUyMzAwMDIsIDB4MTQ0NTAyMSwKLTB4MTQyNTAyMSwgMHgxNDM1MDIxLCAweGExYzAyLCAweDMxNDJmZmZmLAotMHg2MjUwMjEsIDB4YTFjMDIsIDB4MzE0MmZmZmYsIDB4NjI1MDIxLAotMHgzMTQ4ZmZmZiwgMHg1MTAwMDAwMSwgMHgzNDA4ZmZmZiwgMHg4ZDYyMDAxOCwKLTB4OTQ0MzAwMGMsIDB4MjQwMjA4MDAsIDB4NTQ2MjAwMDUsIDB4YTU2ODAwMTAsCi0weDk1NjIwMDBlLCAweDM0NDIwMDAyLCAweGE1NjIwMDBlLCAweGE1NjgwMDEwLAotMHg5NmUyMDQ2YSwgMHgyODIxLCAweDMwNDIwMDA4LCAweDE0NDAwMDU2LAotMHgzMDIxLCAweDhkNjMwMDE4LCAweDI0NjIwMDI0LCAweDIyMjEwMmIsCi0weDEwNDAwMDM0LCAweDI0NjkwMDEwLCAweDIyOTEwMmIsIDB4NTQ0MDAwMDEsCi0weDEzMjQ4MjEsIDB4OTUyNTAwMDAsIDB4MjQ2OTAwMTQsIDB4MjI5MTAyYiwKLTB4MTA0MDAwMDIsIDB4MjRhNWZmZWMsIDB4MTMyNDgyMSwgMHg5NTIyMDAwMCwKLTB4MzA0MjBmZmYsIDB4MTQ0MDAwMDMsIDB4MjUyOTAwMDIsIDB4ODAwM2U2MCwKLTB4MjQxMzAwMDEsIDB4OTgyMSwgMHhhMDMwMjEsIDB4MjI5MTAyYiwKLTB4NTQ0MDAwMDEsIDB4MTMyNDgyMSwgMHg5MTIyMDAwMSwgMHgyNTI5MDAwMiwKLTB4YTIyODIxLCAweDIyOTEwMmIsIDB4NTQ0MDAwMDEsIDB4MTMyNDgyMSwKLTB4MjUyOTAwMDIsIDB4MjI5MTAyYiwgMHg1NDQwMDAwMSwgMHgxMzI0ODIxLAotMHg5NTIyMDAwMCwgMHgyNTI5MDAwMiwgMHhhMjI4MjEsIDB4MjI5MTAyYiwKLTB4NTQ0MDAwMDEsIDB4MTMyNDgyMSwgMHg5NTIyMDAwMCwgMHgyNTI5MDAwMiwKLTB4YTIyODIxLCAweDIyOTEwMmIsIDB4NTQ0MDAwMDEsIDB4MTMyNDgyMSwKLTB4OTUyMjAwMDAsIDB4MjUyOTAwMDIsIDB4YTIyODIxLCAweDIyOTEwMmIsCi0weDU0NDAwMDAxLCAweDEzMjQ4MjEsIDB4OTUyMjAwMDAsIDB4ODAwM2U5OSwKLTB4YTIyODIxLCAweDk0NjUwMDEwLCAweDk0NjIwMDE0LCAweDI0NjkwMDE2LAotMHgzMDQyMGZmZiwgMHgxNDQwMDAwMywgMHgyNGE1ZmZlYywgMHg4MDAzZThjLAotMHgyNDEzMDAwMSwgMHg5ODIxLCAweGEwMzAyMSwgMHg5MTIzMDAwMSwKLTB4MjUyOTAwMDQsIDB4OTUyMjAwMDAsIDB4MjUyOTAwMDIsIDB4OTUyNDAwMDAsCi0weDI1MjkwMDAyLCAweGEzMjgyMSwgMHhhMjI4MjEsIDB4OTUyMjAwMDAsCi0weDk1MjMwMDAyLCAweGE0MjgyMSwgMHhhMjI4MjEsIDB4YTMyODIxLAotMHg1MWMwMiwgMHgzMGEyZmZmZiwgMHg2MjI4MjEsIDB4NTFjMDIsCi0weDMwYTJmZmZmLCAweDYyMjgyMSwgMHg5NmUyMDQ2YSwgMHgzMDQyMDAwMSwKLTB4MTA0MDAwMWUsIDB4MjAyMSwgMHg5NTgyMDAxNiwgMHg0ZTIwMjMsCi0weDQxNDAyLCAweDgyMjAyMSwgMHgzMjYyMDBmZiwgMHg1MDQwMDAwMiwKLTB4ODYyMDIxLCAweDg1MjAyMSwgMHg0MTQwMiwgMHg4MjIwMjEsCi0weDMwODRmZmZmLCAweDUwODAwMDAxLCAweDM0MDRmZmZmLCAweDhkNjIwMDE4LAotMHgyNDQzMDAxNywgMHgyMjMxMDJiLCAweDU0NDAwMDAxLCAweDcyMTgyMSwKLTB4OTA2MjAwMDAsIDB4Mzg0MzAwMTEsIDB4MmM2MzAwMDEsIDB4Mzg0MjAwMDYsCi0weDJjNDIwMDAxLCAweDYyMTgyNSwgMHgxMDYwMDAwNCwgMHgwLAotMHg5NTYyMDAwZSwgMHgzNDQyMDAwMSwgMHhhNTYyMDAwZSwgMHg5NTYyMDAwZSwKLTB4MjQwYTAwMDIsIDB4MzA0MjAwMDQsIDB4MTA0MDAwMDIsIDB4YTU2NDAwMTIsCi0weDI0MGEwMDA0LCAweDhmODgwMTIwLCAweDI3NjIzODAwLCAweDI1MDkwMDIwLAotMHgxMjIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjkzMDAwLCAweDhmODIwMTI4LAotMHgxMTIyMDAwNCwgMHgwLCAweDhmODIwMTI0LCAweDE1MjIwMDA3LAotMHgyNDA0MDAyMCwgMHg4ZWUyMDFhNCwgMHg4MDIxLCAweDI0NDIwMDAxLAotMHhhZWUyMDFhNCwgMHg4MDAzZjRmLCAweDhlZTIwMWE0LCAweDhlZTU3MjRjLAotMHg4ZWU2MDQ5MCwgMHg4ZWU3MDQ5NCwgMHhhZDBiMDAwOCwgMHhhNTA0MDAwZSwKLTB4YWQwYTAwMTgsIDB4NTI5NDAsIDB4YTAxODIxLCAweDEwMjEsCi0weGUzMzgyMSwgMHhlMzIwMmIsIDB4YzIzMDIxLCAweGM0MzAyMSwKLTB4YWQwNjAwMDAsIDB4YWQwNzAwMDQsIDB4OGVlMjcyNGMsIDB4NGQxMDI1LAotMHhhZDAyMDAxYywgMHg4ZWUyMDRjNCwgMHhhZDAyMDAxMCwgMHhhZjg5MDEyMCwKLTB4OTJlMjRlMjAsIDB4MTQ0MDAwNjAsIDB4MjQxMDAwMDEsIDB4MjU0M2ZmZWUsCi0weDJjNjMwMDAyLCAweDM5NDIwMDExLCAweDJjNDIwMDAxLCAweDYyMTgyNSwKLTB4MTA2MDAwMjQsIDB4MCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwKLTB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHg4YzgyMDAwMCwgMHgxNDU1MDAwZiwKLTB4MCwgMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwgMHgxMDYyMDAwYiwKLTB4MCwgMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwKLTB4OGVlMjRlMzQsIDB4OGVlMzRlMzAsIDB4MjQ0MjAwMDEsIDB4MTA1NDAwMmIsCi0weDAsIDB4ODAwM2YyZSwgMHgwLCAweDhlZTI0ZTMwLAotMHgyNDQyMDAwMSwgMHg1MDU0MDAwMywgMHgxMDIxLCAweDhlZTI0ZTMwLAotMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwKLTB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHgyNDAyMDAwMSwgMHg4MDAzZjRlLAotMHhhYzk1MDAwMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwKLTB4MmUyMjAyMSwgMHg4YzgzMDAwMCwgMHgyNDAyMDAwNywgMHgxNDYyMDAxZiwKLTB4MCwgMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwKLTB4MCwgMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwKLTB4OGVlMjRlMzQsIDB4OGVlMzRlMzAsIDB4MjQ0MjAwMDEsIDB4MTA1NDAwMDcsCi0weDAsIDB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIDB4MTA2MjAwMDUsCi0weDAsIDB4ODAwM2YzYSwgMHgwLCAweDE0NjAwMDA1LAotMHgwLCAweDhmODIwMTI4LCAweDI0NDIwMDIwLCAweGFmODIwMTI4LAotMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMiwKLTB4YWM4MDAwMDAsIDB4ODAwM2Y0ZiwgMHgwLCAweDhlZTI0ZTMwLAotMHgyNDQyMDAwMSwgMHg1MDU0MDAwMywgMHgxMDIxLCAweDhlZTI0ZTMwLAotMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwKLTB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHgyNDAyMDAwNywgMHhhYzgyMDAwMCwKLTB4MjQwMjAwMDEsIDB4YWM4MjAwMDQsIDB4MTYwMDAwMGQsIDB4MCwKLTB4OGY4MjAxMjAsIDB4M2MwNDAwMDEsIDB4MjQ4NDU5MzgsIDB4YWZhMDAwMTQsCi0weGFmYTIwMDEwLCAweDhkODYwMDFjLCAweDhmODcwMTI0LCAweDNjMDUwMDA4LAotMHhjMDAyNDAzLCAweDM0YTUwMDAxLCAweDgwMDQwNTcsIDB4MCwKLTB4OGVlMjcyNGMsIDB4MjQ0MjAwMDEsIDB4MzA0MjA3ZmYsIDB4MTFhMDAwMDYsCi0weGFlZTI3MjRjLCAweDhlZTIwMWQwLCAweDI0NDJmZmZmLCAweGFlZTIwMWQwLAotMHg4MDAzZjZiLCAweDhlZTIwMWQwLCAweDhlZTIwMWNjLCAweDI0NDJmZmZmLAotMHhhZWUyMDFjYywgMHg4ZWUyMDFjYywgMHg4ZWUyMDFkOCwgMHgyNDQyZmZmZiwKLTB4YWVlMjAxZDgsIDB4ODAwNDA1NywgMHg4ZWUyMDFkOCwgMHg4ZjQyMDI0MCwKLTB4MTA0MDAwZTUsIDB4MCwgMHg4ZWUyMGUxYywgMHgyNDQyMDAwMSwKLTB4ODAwNDA1NywgMHhhZWUyMGUxYywgMHg5NTgyMDAxZSwgMHhhZDgyMDAxYywKLTB4OGY0MjAyNDAsIDB4MTA0MDAwNzIsIDB4MCwgMHg4ZWUyMGUxYywKLTB4MjQ0MjAwMDEsIDB4YWVlMjBlMWMsIDB4OGY0MzAyNDAsIDB4NDMxMDJiLAotMHgxNDQwMDBkNSwgMHgwLCAweDhmODMwMTIwLCAweDI3NjIzODAwLAotMHgyNDY2MDAyMCwgMHhjMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2NjMwMDAsCi0weDhmODIwMTI4LCAweDEwYzIwMDA0LCAweDAsIDB4OGY4MjAxMjQsCi0weDE0YzIwMDA3LCAweDAsIDB4OGVlMjAxYTQsIDB4ODAyMSwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsIDB4ODAwM2ZkYSwgMHg4ZWUyMDFhNCwKLTB4OGVlMjcyNGMsIDB4YWM2MjAwMWMsIDB4OGVlNDA0YTgsIDB4OGVlNTA0YWMsCi0weDI0NjIwMDFjLCAweGFjNjIwMDA4LCAweDI0MDIwMDA4LCAweGE0NjIwMDBlLAotMHgyNDAyMDAxMSwgMHhhYzYyMDAxOCwgMHhhYzY0MDAwMCwgMHhhYzY1MDAwNCwKLTB4OGVlMjA0YzQsIDB4YWM2MjAwMTAsIDB4YWY4NjAxMjAsIDB4OTJlMjRlMjAsCi0weDE0NDAwMDM0LCAweDI0MTAwMDAxLCAweDhlZTI0ZTMwLCAweDIxMGMwLAotMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDhjODIwMDAwLCAweDE0NTUwMDFmLAotMHgwLCAweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAweDEwNjIwMDFiLAotMHgwLCAweDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LAotMHg4ZWUyNGUzNCwgMHg4ZWUzNGUzMCwgMHgyNDQyMDAwMSwgMHgxMDU0MDAwNywKLTB4MCwgMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwgMHgxMDYyMDAwNSwKLTB4MCwgMHg4MDAzZmM2LCAweDAsIDB4MTQ2MDAwMDUsCi0weDAsIDB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsCi0weDhmODIwMTI4LCAweDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDExLAotMHhhYzgwMDAwMCwgMHg4MDAzZmRhLCAweDAsIDB4OGVlMjRlMzAsCi0weDI0NDIwMDAxLCAweDUwNTQwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsCi0weDI0NDIwMDAxLCAweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLAotMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDI0MDIwMDAxLCAweGFjOTUwMDAwLAotMHhhYzgyMDAwNCwgMHg1NjAwMDAwYiwgMHgyNDEwMDAwMSwgMHg4ZWUyNzI0YywKLTB4M2MwNDAwMDEsIDB4MjQ4NDU4YTgsIDB4YWZhMDAwMTQsIDB4YWZhMjAwMTAsCi0weDhlZTY3MjRjLCAweDhmNDcwMjgwLCAweDNjMDUwMDA5LCAweGMwMDI0MDMsCi0weDM0YTVmMDA4LCAweDU2MDAwMDAxLCAweGFlZTAwZTFjLCAweDhlZTIwMTg4LAotMHgyNDQyMDAwMSwgMHhhZWUyMDE4OCwgMHg4MDA0MDUwLCAweDhlZTIwMTg4LAotMHg4ZjgzMDEyMCwgMHgyNzYyMzgwMCwgMHgyNDY2MDAyMCwgMHhjMjEwMmIsCi0weDUwNDAwMDAxLCAweDI3NjYzMDAwLCAweDhmODIwMTI4LCAweDEwYzIwMDA0LAotMHgwLCAweDhmODIwMTI0LCAweDE0YzIwMDA3LCAweDAsCi0weDhlZTIwMWE0LCAweDgwMjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsCi0weDgwMDQwNDQsIDB4OGVlMjAxYTQsIDB4OGVlMjcyNGMsIDB4YWM2MjAwMWMsCi0weDhlZTQwNGE4LCAweDhlZTUwNGFjLCAweDI0NjIwMDFjLCAweGFjNjIwMDA4LAotMHgyNDAyMDAwOCwgMHhhNDYyMDAwZSwgMHgyNDAyMDAxMSwgMHhhYzYyMDAxOCwKLTB4YWM2NDAwMDAsIDB4YWM2NTAwMDQsIDB4OGVlMjA0YzQsIDB4YWM2MjAwMTAsCi0weGFmODYwMTIwLCAweDkyZTI0ZTIwLCAweDE0NDAwMDM0LCAweDI0MTAwMDAxLAotMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLAotMHg4YzgyMDAwMCwgMHgxNDU1MDAxZiwgMHgwLCAweDhlZTM0ZTMwLAotMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgMHgwLCAweDhjODIwMDA0LAotMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgMHg4ZWUzNGUzMCwKLTB4MjQ0MjAwMDEsIDB4MTA1NDAwMDcsIDB4MCwgMHg4ZWUyNGUzNCwKLTB4MjQ0MjAwMDEsIDB4MTA2MjAwMDUsIDB4MCwgMHg4MDA0MDMwLAotMHgwLCAweDE0NjAwMDA1LCAweDAsIDB4OGY4MjAxMjgsCi0weDI0NDIwMDIwLCAweGFmODIwMTI4LCAweDhmODIwMTI4LCAweDhjODIwMDA0LAotMHgyYzQyMDAxMSwgMHg1MDQwMDAxMSwgMHhhYzgwMDAwMCwgMHg4MDA0MDQ0LAotMHgwLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweDUwNTQwMDAzLAotMHgxMDIxLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweGFlZTI0ZTMwLAotMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLAotMHgyNDAyMDAwMSwgMHhhYzk1MDAwMCwgMHhhYzgyMDAwNCwgMHgxNjAwMDAwYiwKLTB4MCwgMHg4ZWUyNzI0YywgMHgzYzA0MDAwMSwgMHgyNDg0NThhOCwKLTB4YWZhMDAwMTQsIDB4YWZhMjAwMTAsIDB4OGVlNjcyNGMsIDB4OGY0NzAyODAsCi0weDNjMDUwMDA5LCAweGMwMDI0MDMsIDB4MzRhNWYwMDgsIDB4OGVlMjAxNzQsCi0weDI0NDIwMDAxLCAweGFlZTIwMTc0LCAweDgwMDQwNTcsIDB4OGVlMjAxNzQsCi0weDI0MDIwMDAxLCAweGFlZTI0ZTI0LCAweDhmODMwMTI4LCAweDhmODIwMTI0LAotMHgxNDYyZmQ1OCwgMHgwLCAweDhmYmYwMDMwLCAweDhmYjUwMDJjLAotMHg4ZmI0MDAyOCwgMHg4ZmIzMDAyNCwgMHg4ZmIyMDAyMCwgMHg4ZmIxMDAxYywKLTB4OGZiMDAwMTgsIDB4M2UwMDAwOCwgMHgyN2JkMDAzOCwgMHgyN2JkZmZlOCwKLTB4Mjc4NDAyMDgsIDB4Mjc0NTAyMDAsIDB4MjQwNjAwMDgsIDB4YWZiZjAwMTQsCi0weGMwMDI0OWEsIDB4YWZiMDAwMTAsIDB4MjAyMSwgMHgyNDEwMDAwMSwKLTB4MjQwMjI0MWYsIDB4YWY5MDAyMTAsIDB4YWY5MDAyMDAsIDB4YWY4MDAyMDQsCi0weGFmODIwMjE0LCAweDhmNDYwMjQ4LCAweDI0MDMwMDA0LCAweDNjMDIwMDQwLAotMHgzYzAxMDAwMSwgMHhhYzIzNWNjNCwgMHgzYzAxMDAwMSwgMHhhYzIzNWNjOCwKLTB4M2MwMTAwMDEsIDB4YWMyMDVkOWMsIDB4M2MwMTAwMDEsIDB4YWMyMjVjYzAsCi0weDNjMDEwMDAxLCAweGFjMjM1Y2M4LCAweGMwMDUxMDgsIDB4MjQwNTAwMDQsCi0weGMwMDQ4MjIsIDB4MCwgMHg4ZWUyMDAwMCwgMHgzYzAzZmVmZiwKLTB4MzQ2M2ZmZmQsIDB4NDMxMDI0LCAweGFlZTIwMDAwLCAweDNjMDIzYzAwLAotMHhhZjgyMDIxYywgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YWMzMDgzYWMsCi0weDhmYmYwMDE0LCAweDhmYjAwMDEwLCAweDNlMDAwMDgsIDB4MjdiZDAwMTgsCi0weDI3YmRmZmUwLCAweDNjMDUwMDA4LCAweDM0YTUwNDAwLCAweGFmYmYwMDE4LAotMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgMHg4Zjg2MDIwMCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDU5ZjAsIDB4YzAwMjQwMywgMHgzODIxLCAweDhlZTIwMjgwLAotMHgyNDQyMDAwMSwgMHhhZWUyMDI4MCwgMHg4ZWUyMDI4MCwgMHg4ZjgzMDIwMCwKLTB4M2MwMjNmMDAsIDB4NjIxODI0LCAweDhmYmYwMDE4LCAweDNjMDIwNDAwLAotMHgzZTAwMDA4LCAweDI3YmQwMDIwLCAweDI3YmRmZmQ4LCAweGFmYmYwMDIwLAotMHhhZmIxMDAxYywgMHhhZmIwMDAxOCwgMHg4ZjkwMDIyMCwgMHg4ZWUyMDIxNCwKLTB4MzgyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDIxNCwgMHg4ZWUyMDIxNCwKLTB4M2MwMjAzMDAsIDB4MjAyMTAyNCwgMHgxMDQwMDAyNywgMHgzYzExMDQwMCwKLTB4YzAwNDI5YiwgMHgwLCAweDNjMDIwMTAwLCAweDIwMjEwMjQsCi0weDEwNDAwMDA3LCAweDAsIDB4OGVlMjAyMTgsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMjE4LCAweDhlZTIwMjE4LCAweDgwMDQwYzYsIDB4M2MwM2ZkZmYsCi0weDhlZTIwMjFjLCAweDI0NDIwMDAxLCAweGFlZTIwMjFjLCAweDhlZTIwMjFjLAotMHgzYzAzZmRmZiwgMHgzNDYzZmZmZiwgMHgzYzA4MDhmZiwgMHgzNTA4ZmZmZiwKLTB4OGVlMjAwMDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDU5ZmMsIDB4M2MwNTAwMDgsCi0weDIwMDMwMjEsIDB4NDMxMDI0LCAweGFlZTIwMDAwLCAweDhmODIwMjIwLAotMHgzODIxLCAweDNjMDMwMzAwLCAweDQ4MTAyNCwgMHg0MzEwMjUsCi0weGFmODIwMjIwLCAweGFmYTAwMDEwLCAweGMwMDI0MDMsIDB4YWZhMDAwMTQsCi0weDgwMDQyOTYsIDB4MCwgMHgyMTExMDI0LCAweDEwNDAwMDFmLAotMHgzYzAyNDAwMCwgMHg4ZjgzMDIyNCwgMHgyNDAyMTQwMiwgMHgxNDYyMDAwYiwKLTB4M2MwM2ZkZmYsIDB4M2MwNDAwMDEsIDB4MjQ4NDVhMDgsIDB4M2MwNTAwMDgsCi0weGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhmODYwMjI0LCAweDM0YTVmZmZmLAotMHhjMDAyNDAzLCAweDM4MjEsIDB4M2MwM2ZkZmYsIDB4OGVlMjAwMDAsCi0weDM0NjNmZmZmLCAweDIwMDIwMjEsIDB4NDMxMDI0LCAweGMwMDRlNTQsCi0weGFlZTIwMDAwLCAweDhlZTIwMjIwLCAweDI0NDIwMDAxLCAweGFlZTIwMjIwLAotMHg4ZWUyMDIyMCwgMHg4ZjgyMDIyMCwgMHgzYzAzMDhmZiwgMHgzNDYzZmZmZiwKLTB4NDMxMDI0LCAweDgwMDQyOTUsIDB4NTExMDI1LCAweDIwMjEwMjQsCi0weDEwNDAwMTQyLCAweDAsIDB4OGVlMjAyMmMsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMjJjLCAweDhlZTIwMjJjLCAweDhmODIwMjIwLCAweDNjMDMwOGZmLAotMHgzNDYzZmZmZiwgMHg0MzEwMjQsIDB4MzQ0MjAwMDQsIDB4YWY4MjAyMjAsCi0weDhmODMwMDU0LCAweDhmODIwMDU0LCAweDgwMDQxMGUsIDB4MjQ2MzAwMDIsCi0weDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDAwMywgMHgxNDQwZmZmYywKLTB4MCwgMHg4Zjg2MDBlMCwgMHg4Zjg0MDBlNCwgMHgzMGMyMDAwNywKLTB4MTA0MDAwMTIsIDB4MCwgMHg4ZjgzMDBlNCwgMHgyNDAyZmZmOCwKLTB4YzIxMDI0LCAweDEwNDMwMDBkLCAweDAsIDB4OGY4MjAwNTQsCi0weDhmODMwMGUwLCAweDE0YzMwMDA5LCAweDI0NDQwMDUwLCAweDhmODIwMDU0LAotMHg4MjEwMjMsIDB4MmM0MjAwNTEsIDB4MTA0MDAwMDQsIDB4MCwKLTB4OGY4MjAwZTAsIDB4MTBjMmZmZjksIDB4MCwgMHg4ZjgyMDIyMCwKLTB4M2MwMzA4ZmYsIDB4MzQ2M2ZmZmQsIDB4NDMxMDI0LCAweGFmODIwMjIwLAotMHg4Zjg2MDBlMCwgMHgzMGMyMDAwNywgMHgxMDQwMDAwMywgMHgyNDAyZmZmOCwKLTB4YzIzMDI0LCAweGFmODYwMGUwLCAweDhmODMwMGM0LCAweDNjMDIwMDFmLAotMHgzNDQyZmZmZiwgMHgyNDY4MDAwOCwgMHg0ODEwMmIsIDB4MTA0MDAwMDMsCi0weDNjMDJmZmY1LCAweDM0NDIxMDAwLCAweDEwMjQwMjEsIDB4OGY4YjAwYzgsCi0weDhmODUwMTIwLCAweDhmODQwMTI0LCAweDgwMDQxNDUsIDB4NjAyMSwKLTB4Mjc2MjM4MDAsIDB4ODIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjQzMDAwLAotMHgxMGE0MDAxMCwgMHgzMTgyMDBmZiwgMHg4YzgyMDAxOCwgMHgzODQzMDAwNywKLTB4MmM2MzAwMDEsIDB4Mzg0MjAwMGIsIDB4MmM0MjAwMDEsIDB4NjIxODI1LAotMHg1MDYwZmZmMywgMHgyNDg0MDAyMCwgMHg4ZWUyMDI0MCwgMHgyNDBjMDAwMSwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAyNDAsIDB4OGVlMjAyNDAsIDB4OGM4YjAwMDgsCi0weDMxODIwMGZmLCAweDE0NDAwMDY1LCAweDAsIDB4M2MwMjAwMDEsCi0weDU3MTAyMSwgMHg5MDQyODNjMCwgMHgxNDQwMDA2MCwgMHgwLAotMHg4Zjg0MDBlNCwgMHhjNDEwMjMsIDB4MjE4YzMsIDB4NDYyMDAwMSwKLTB4MjQ2MzAyMDAsIDB4OGY4OTAwYzQsIDB4MTA2MDAwMDUsIDB4MjQwMjAwMDEsCi0weDEwNjIwMDA5LCAweDAsIDB4ODAwNDE4NywgMHgwLAotMHg4ZWUyMDIzMCwgMHgxMjA1ODIxLCAweDI0NDIwMDAxLCAweGFlZTIwMjMwLAotMHg4MDA0MWJjLCAweDhlZTIwMjMwLCAweDhlZTIwMjM0LCAweDNjMDUwMDBhLAotMHgyNDQyMDAwMSwgMHhhZWUyMDIzNCwgMHg4YzhiMDAwMCwgMHgzNGE1ZjAwMCwKLTB4OGVlMjAyMzQsIDB4MTJiMTgyMywgMHhhMzEwMmIsIDB4NTQ0MDAwMDEsCi0weDY1MTgyMSwgMHgyYzYyMjMzZiwgMHgxNDQwMDA0MCwgMHgwLAotMHg4ZjgyMDBlOCwgMHgyNDQyMDAwOCwgMHhhZjgyMDBlOCwgMHg4ZjgyMDBlOCwKLTB4OGY4MjAwZTQsIDB4MTIwNTgyMSwgMHgyNDQyMDAwOCwgMHhhZjgyMDBlNCwKLTB4ODAwNDFiYywgMHg4ZjgyMDBlNCwgMHg4ZWUyMDIzOCwgMHgzYzAzMDAwYSwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAyMzgsIDB4OGM4NDAwMDAsIDB4MzQ2M2YwMDAsCi0weDhlZTIwMjM4LCAweDg4MzgyMywgMHg2NzEwMmIsIDB4NTQ0MDAwMDEsCi0weGUzMzgyMSwgMHgzYzAyMDAwMywgMHgzNDQyMGQ0MCwgMHg0NzEwMmIsCi0weDEwNDAwMDAzLCAweDAsIDB4ODAwNDFiYywgMHg4MDU4MjEsCi0weDhmODIwMGU0LCAweDI0NDQwMDA4LCAweGFmODQwMGU0LCAweDhmODQwMGU0LAotMHgxMDg2MDAxOCwgMHgzYzA1MDAwYSwgMHgzNGE1ZjAwMCwgMHgzYzBhMDAwMywKLTB4MzU0YTBkNDAsIDB4OGVlMjAwN2MsIDB4MjQ0MjAwMDEsIDB4YWVlMjAwN2MsCi0weDhjODMwMDAwLCAweDhlZTIwMDdjLCAweDY4MzgyMywgMHhhNzEwMmIsCi0weDU0NDAwMDAxLCAweGU1MzgyMSwgMHgxNDcxMDJiLCAweDU0NDAwMDA3LAotMHg2MDU4MjEsIDB4OGY4MjAwZTQsIDB4MjQ0NDAwMDgsIDB4YWY4NDAwZTQsCi0weDhmODQwMGU0LCAweDE0ODZmZmVmLCAweDAsIDB4MTQ4NjAwMDUsCi0weDAsIDB4MTIwNTgyMSwgMHhhZjg2MDBlNCwgMHg4MDA0MWJjLAotMHhhZjg2MDBlOCwgMHhhZjg0MDBlNCwgMHhhZjg0MDBlOCwgMHg4ZjgyMDBjOCwKLTB4M2MwMzAwMGEsIDB4MzQ2M2YwMDAsIDB4NDgzODIzLCAweDY3MTAyYiwKLTB4NTQ0MDAwMDEsIDB4ZTMzODIxLCAweDNjMDIwMDAzLCAweDM0NDIwZDNmLAotMHg0NzEwMmIsIDB4NTQ0MDAwMDcsIDB4NjAyMSwgMHgxNjgzODIzLAotMHg2NzEwMmIsIDB4NTQ0MDAwMDMsIDB4ZTMzODIxLCAweDgwMDQxY2YsCi0weDNjMDIwMDAzLCAweDNjMDIwMDAzLCAweDM0NDIwZDNmLCAweDQ3MTAyYiwKLTB4MTQ0MDAwMTYsIDB4MzE4MjAwZmYsIDB4MTQ0MDAwMDYsIDB4MCwKLTB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDkwNDI4M2MwLCAweDEwNDAwMDBmLAotMHgwLCAweDhlZTIwMjNjLCAweDNjMDRmZGZmLCAweDhlZTMwMDAwLAotMHgzNDg0ZmZmZiwgMHgyNDQyMDAwMSwgMHhhZWUyMDIzYywgMHg4ZWUyMDIzYywKLTB4MjQwMjAwMDEsIDB4NjQxODI0LCAweDNjMDEwMDAxLCAweDM3MDgyMSwKLTB4YTAyMjgzYjgsIDB4ODAwNDIyYywgMHhhZWUzMDAwMCwgMHhhZjhiMDBjOCwKLTB4OGY4MzAwYzgsIDB4OGY4MjAwYzQsIDB4M2MwNDAwMGEsIDB4MzQ4NGYwMDAsCi0weDYyMzgyMywgMHg4NzEwMmIsIDB4NTQ0MDAwMDEsIDB4ZTQzODIxLAotMHgzYzAyMDAwMywgMHgzNDQyMGQ0MCwgMHg0NzEwMmIsIDB4MmNlMzAwMDEsCi0weDQzMTAyNSwgMHgxMDQwMDAwOCwgMHgwLCAweDhmODIwMjIwLAotMHgzYzAzMDhmZiwgMHgzNDYzZmZmZiwgMHg0MzEwMjQsIDB4M2MwMzQwMDAsCi0weDQzMTAyNSwgMHhhZjgyMDIyMCwgMHg4Zjg2MDBlMCwgMHg4Zjg0MDBlNCwKLTB4MTBjNDAwMmEsIDB4MCwgMHg4ZWUyMDA3YywgMHgyNDQyMDAwMSwKLTB4YWVlMjAwN2MsIDB4OGVlMjAwN2MsIDB4MjRjMmZmZjgsIDB4YWY4MjAwZTAsCi0weDNjMDIwMDAxLCAweDhjNDI3ZTMwLCAweDNjMDMwMDA4LCAweDhmODYwMGUwLAotMHg0MzEwMjQsIDB4MTA0MDAwMWQsIDB4MCwgMHgxMGM0MDAxYiwKLTB4MjQwZGZmZjgsIDB4M2MwYTAwMGEsIDB4MzU0YWYwMDAsIDB4M2MwYzAwODAsCi0weDI0ODUwMDA4LCAweDI3NjIyODAwLCAweDUwYTIwMDAxLCAweDI3NjUxODAwLAotMHg4Yzg4MDAwNCwgMHg4YzgyMDAwMCwgMHg4Y2E5MDAwMCwgMHgzMTAzZmZmZiwKLTB4NDMxMDIxLCAweDRkMTAyNCwgMHgyNDQzMDAxMCwgMHg2YjEwMmIsCi0weDU0NDAwMDAxLCAweDZhMTgyMSwgMHgxMmIxMDJiLCAweDU0NDAwMDAxLAotMHgxMmE0ODIxLCAweDEwNjkwMDAyLCAweDEwYzEwMjUsIDB4YWM4MjAwMDQsCi0weGEwMjAyMSwgMHgxNGM0ZmZlYiwgMHgyNDg1MDAwOCwgMHg4ZjgyMDIyMCwKLTB4M2MwMzA4ZmYsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAweDM0NDIwMDAyLAotMHhhZjgyMDIyMCwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHg4MDA0MjM3LAotMHgyNDYzMDAwMSwgMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwMDIsCi0weDE0NDBmZmZjLCAweDAsIDB4OGY4MjAyMjAsIDB4M2MwMzA4ZmYsCi0weDM0NjNmZmZiLCAweDQzMTAyNCwgMHhhZjgyMDIyMCwgMHg2MDEwMDU1LAotMHgwLCAweDhlZTIwMjI4LCAweDI0NDIwMDAxLCAweGFlZTIwMjI4LAotMHg4ZWUyMDIyOCwgMHg4ZjgyMDIyMCwgMHgzYzAzMDhmZiwgMHgzNDYzZmZmZiwKLTB4NDMxMDI0LCAweDM0NDIwMDA0LCAweGFmODIwMjIwLCAweDhmODMwMDU0LAotMHg4ZjgyMDA1NCwgMHg4MDA0MjUxLCAweDI0NjMwMDAyLCAweDhmODIwMDU0LAotMHg2MjEwMjMsIDB4MmM0MjAwMDMsIDB4MTQ0MGZmZmMsIDB4MCwKLTB4OGY4NjAwZTAsIDB4MzBjMjAwMDcsIDB4MTA0MDAwMTIsIDB4MCwKLTB4OGY4MzAwZTQsIDB4MjQwMmZmZjgsIDB4YzIxMDI0LCAweDEwNDMwMDBkLAotMHgwLCAweDhmODIwMDU0LCAweDhmODMwMGUwLCAweDE0YzMwMDA5LAotMHgyNDQ0MDAzMiwgMHg4ZjgyMDA1NCwgMHg4MjEwMjMsIDB4MmM0MjAwMzMsCi0weDEwNDAwMDA0LCAweDAsIDB4OGY4MjAwZTAsIDB4MTBjMmZmZjksCi0weDAsIDB4OGY4MjAyMjAsIDB4M2MwMzA4ZmYsIDB4MzQ2M2ZmZmQsCi0weDQzMTAyNCwgMHhhZjgyMDIyMCwgMHg4Zjg2MDBlMCwgMHgzMGMyMDAwNywKLTB4MTA0MDAwMDMsIDB4MjQwMmZmZjgsIDB4YzIzMDI0LCAweGFmODYwMGUwLAotMHgyNDAzMDFmNSwgMHg4ZjgyMDBlOCwgMHg2NzM4MjMsIDB4NzE4YzAsCi0weDQzMTAyMSwgMHhhZjgyMDBlOCwgMHg4ZjgyMDBlOCwgMHhhZjgyMDBlNCwKLTB4OGVlMjAwN2MsIDB4M2MwNDA4ZmYsIDB4MzQ4NGZmZmYsIDB4NDcxMDIxLAotMHhhZWUyMDA3YywgMHg4ZjgyMDIyMCwgMHgzYzAzODAwMCwgMHgzNDYzMDAwMiwKLTB4NDQxMDI0LCAweDQzMTAyNSwgMHhhZjgyMDIyMCwgMHg4ZjgzMDA1NCwKLTB4OGY4MjAwNTQsIDB4ODAwNDI4ZCwgMHgyNDYzMDAwMSwgMHg4ZjgyMDA1NCwKLTB4NjIxMDIzLCAweDJjNDIwMDAyLCAweDE0NDBmZmZjLCAweDAsCi0weDhmODIwMjIwLCAweDNjMDMwOGZmLCAweDM0NjNmZmZiLCAweDQzMTAyNCwKLTB4YWY4MjAyMjAsIDB4OGZiZjAwMjAsIDB4OGZiMTAwMWMsIDB4OGZiMDAwMTgsCi0weDNlMDAwMDgsIDB4MjdiZDAwMjgsIDB4M2MwMjAwMDEsIDB4OGM0MjVjZDgsCi0weDI3YmRmZmQ4LCAweDEwNDAwMDEyLCAweGFmYmYwMDIwLCAweDNjMDQwMDAxLAotMHgyNDg0NWExNCwgMHgzYzA1MDAwOCwgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwKLTB4MzcwODIxLCAweGFjMjI4M2FjLCAweGFmYTAwMDEwLCAweGFmYTAwMDE0LAotMHg4Zjg2MDIyMCwgMHgzNGE1MDQ5OCwgMHgzYzAxMDAwMSwgMHhhYzIwNWNkOCwKLTB4M2MwMTAwMDEsIDB4YWMyMjVjY2MsIDB4YzAwMjQwMywgMHgzODIxLAotMHg4ZjQyMDI2OCwgMHgzYzAzN2ZmZiwgMHgzNDYzZmZmZiwgMHg0MzEwMjQsCi0weGFmNDIwMjY4LCAweDhlZTIwNGQwLCAweDhlZTQwNGQ0LCAweDI0MDNmZmZlLAotMHg0MzEwMjQsIDB4MzA4NDAwMDIsIDB4MTA4MDAxMWUsIDB4YWVlMjA0ZDAsCi0weDhlZTIwNGQ0LCAweDI0MDNmZmZkLCAweDQzMTAyNCwgMHhhZWUyMDRkNCwKLTB4OGY4MjAwNDQsIDB4M2MwMzA2MDAsIDB4MzQ2MzIwMDAsIDB4MzQ0MjAwMjAsCi0weGFmODIwMDQ0LCAweGFmYTMwMDE4LCAweDhlZTIwNjA4LCAweDhmNDMwMjI4LAotMHgyNDQyMDAwMSwgMHgzMDRhMDBmZiwgMHg1MTQzMDBmZSwgMHhhZmEwMDAxMCwKLTB4OGVlMjA2MDgsIDB4MjEwYzAsIDB4NTcxMDIxLCAweDhmYTMwMDE4LAotMHg4ZmE0MDAxYywgMHhhYzQzMDYwYywgMHhhYzQ0MDYxMCwgMHg4ZjgzMDA1NCwKLTB4OGY4MjAwNTQsIDB4MjQ2OTAwMzIsIDB4MTIyMTAyMywgMHgyYzQyMDAzMywKLTB4MTA0MDAwNmEsIDB4NTgyMSwgMHgyNDE4MDAwOCwgMHgyNDBmMDAwZCwKLTB4MjQwZDAwMDcsIDB4MjQwYzAwNDAsIDB4MjQwZTAwMDEsIDB4OGY4NzAxMjAsCi0weDI3NjIzODAwLCAweDI0ZTgwMDIwLCAweDEwMjEwMmIsIDB4NTA0MDAwMDEsCi0weDI3NjgzMDAwLCAweDhmODIwMTI4LCAweDExMDIwMDA0LCAweDAsCi0weDhmODIwMTI0LCAweDE1MDIwMDA3LCAweDEwMjEsIDB4OGVlMjAxYTQsCi0weDI4MjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsIDB4ODAwNDMzZCwKLTB4OGVlMjAxYTQsIDB4OGVlNDA2MDgsIDB4NDIwYzAsIDB4ODAxODIxLAotMHg4ZWU0MDQzMCwgMHg4ZWU1MDQzNCwgMHhhMzI4MjEsIDB4YTMzMDJiLAotMHg4MjIwMjEsIDB4ODYyMDIxLCAweGFjZTQwMDAwLCAweGFjZTUwMDA0LAotMHg4ZWUyMDYwOCwgMHhhNGY4MDAwZSwgMHhhY2VmMDAxOCwgMHhhY2VhMDAxYywKLTB4MjEwYzAsIDB4MjQ0MjA2MGMsIDB4MmUyMTAyMSwgMHhhY2UyMDAwOCwKLTB4OGVlMjA0YzQsIDB4YWNlMjAwMTAsIDB4YWY4ODAxMjAsIDB4OTJlMjRlMjAsCi0weDE0NDAwMDMzLCAweDI0MDUwMDAxLCAweDhlZTI0ZTMwLCAweDIxMGMwLAotMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDhjODIwMDAwLCAweDE0NGQwMDFmLAotMHgwLCAweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAweDEwNjIwMDFiLAotMHgwLCAweDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LAotMHg4ZWUyNGUzNCwgMHg4ZWUzNGUzMCwgMHgyNDQyMDAwMSwgMHgxMDRjMDAwNywKLTB4MCwgMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwgMHgxMDYyMDAwNSwKLTB4MCwgMHg4MDA0MzJhLCAweDAsIDB4MTQ2MDAwMDUsCi0weDAsIDB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsCi0weDhmODIwMTI4LCAweDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEwLAotMHhhYzgwMDAwMCwgMHg4MDA0MzNkLCAweDAsIDB4OGVlMjRlMzAsCi0weDI0NDIwMDAxLCAweDUwNGMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsCi0weDI0NDIwMDAxLCAweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLAotMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweGFjOGQwMDAwLCAweGFjOGUwMDA0LAotMHg1NGEwMDAwNiwgMHgyNDBiMDAwMSwgMHg4ZjgyMDA1NCwgMHgxMjIxMDIzLAotMHgyYzQyMDAzMywgMHgxNDQwZmY5ZCwgMHgwLCAweDMxNjMwMGZmLAotMHgyNDAyMDAwMSwgMHg1NDYyMDA3OSwgMHhhZmEwMDAxMCwgMHhhZWVhMDYwOCwKLTB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MjQ2OTAwMzIsIDB4MTIyMTAyMywKLTB4MmM0MjAwMzMsIDB4MTA0MDAwNjEsIDB4NTgyMSwgMHgyNDBkMDAwOCwKLTB4MjQwYzAwMTEsIDB4MjQwODAwMTIsIDB4MjQwNzAwNDAsIDB4MjQwYTAwMDEsCi0weDhmODMwMTIwLCAweDI3NjIzODAwLCAweDI0NjYwMDIwLCAweGMyMTAyYiwKLTB4NTA0MDAwMDEsIDB4Mjc2NjMwMDAsIDB4OGY4MjAxMjgsIDB4MTBjMjAwMDQsCi0weDAsIDB4OGY4MjAxMjQsIDB4MTRjMjAwMDcsIDB4MCwKLTB4OGVlMjAxYTQsIDB4MjgyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwKLTB4ODAwNDNhOSwgMHg4ZWUyMDFhNCwgMHg4ZWUyMDYwOCwgMHhhYzYyMDAxYywKLTB4OGVlNDA0YTAsIDB4OGVlNTA0YTQsIDB4MjQ2MjAwMWMsIDB4YWM2MjAwMDgsCi0weGE0NmQwMDBlLCAweGFjNmMwMDE4LCAweGFjNjQwMDAwLCAweGFjNjUwMDA0LAotMHg4ZWUyMDRjNCwgMHhhYzYyMDAxMCwgMHhhZjg2MDEyMCwgMHg5MmUyNGUyMCwKLTB4MTQ0MDAwMzMsIDB4MjQwNTAwMDEsIDB4OGVlMjRlMzAsIDB4MjEwYzAsCi0weDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MjAwMDAsIDB4MTQ0ODAwMWYsCi0weDAsIDB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsCi0weDAsIDB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsCi0weDhlZTI0ZTM0LCAweDhlZTM0ZTMwLCAweDI0NDIwMDAxLCAweDEwNDcwMDA3LAotMHgwLCAweDhlZTI0ZTM0LCAweDI0NDIwMDAxLCAweDEwNjIwMDA1LAotMHgwLCAweDgwMDQzOTYsIDB4MCwgMHgxNDYwMDAwNSwKLTB4MCwgMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwKLTB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIDB4NTA0MDAwMTAsCi0weGFjODAwMDAwLCAweDgwMDQzYTksIDB4MCwgMHg4ZWUyNGUzMCwKLTB4MjQ0MjAwMDEsIDB4NTA0NzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsCi0weDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4YWM4ODAwMDAsIDB4YWM4YTAwMDQsCi0weDU0YTAwMDA2LCAweDI0MGIwMDAxLCAweDhmODIwMDU0LCAweDEyMjEwMjMsCi0weDJjNDIwMDMzLCAweDE0NDBmZmE2LCAweDAsIDB4MzE2MzAwZmYsCi0weDI0MDIwMDAxLCAweDU0NjIwMDAzLCAweGFmYTAwMDEwLCAweDgwMDQzZDYsCi0weDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVhMjAsIDB4YWZhMDAwMTQsCi0weDhmODYwMTIwLCAweDhmODcwMTI0LCAweDNjMDUwMDA5LCAweGMwMDI0MDMsCi0weDM0YTVmMDExLCAweDgwMDQzZDYsIDB4MCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDVhMmMsIDB4YWZhMDAwMTQsIDB4OGY4NjAxMjAsIDB4OGY4NzAxMjQsCi0weDNjMDUwMDA5LCAweGMwMDI0MDMsIDB4MzRhNWYwMTAsIDB4ODAwNDNkNiwKLTB4MCwgMHgzYzA0MDAwMSwgMHgyNDg0NWEzOCwgMHhhZmEwMDAxNCwKLTB4OGVlNjA2MDgsIDB4OGY0NzAyMjgsIDB4M2MwNTAwMDksIDB4YzAwMjQwMywKLTB4MzRhNWYwMGYsIDB4OGVlMjAxYWMsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYWMsCi0weDhlZTIwMWFjLCAweDhlZTIwMTVjLCAweDI0NDIwMDAxLCAweGFlZTIwMTVjLAotMHg4ZWUyMDE1YywgMHg4ZmJmMDAyMCwgMHgzZTAwMDA4LCAweDI3YmQwMDI4LAotMHgzYzAyMDAwMSwgMHg4YzQyNWNkOCwgMHgyN2JkZmZlMCwgMHgxNDQwMDAwZCwKLTB4YWZiZjAwMTgsIDB4M2MwNDAwMDEsIDB4MjQ4NDVhNDQsIDB4M2MwNTAwMDgsCi0weGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhmODYwMjIwLCAweDM0YTUwNDk5LAotMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzIyNWNkOCwgMHhjMDAyNDAzLAotMHgzODIxLCAweDhlZTIwNGQwLCAweDNjMDMwMDAxLCAweDc3MTgyMSwKLTB4OTQ2MzgzYjIsIDB4MzQ0MjAwMDEsIDB4MTA2MDAwMDcsIDB4YWVlMjA0ZDAsCi0weDhmODIwMjIwLCAweDNjMDMwOGZmLCAweDM0NjNmZmZmLCAweDQzMTAyNCwKLTB4MzQ0MjAwMDgsIDB4YWY4MjAyMjAsIDB4MjAyMSwgMHhjMDA1MmEyLAotMHgyNDA1MDAwNCwgMHhhZjQyMDI2OCwgMHg4ZmJmMDAxOCwgMHgzZTAwMDA4LAotMHgyN2JkMDAyMCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4M2MxMjAwMDEsCi0weDI2NTIxMjAwLCAweDNjMTQwMDAxLCAweDhlOTQ1YzUwLCAweDNjMTAwMDAxLAotMHgyNjEwMTEyMCwgMHgzYzE1YzAwMCwgMHgzNmI1MDA2MCwgMHg4ZThhMDAwMCwKLTB4OGViMzAwMDAsIDB4MjZhNDAwYiwgMHgyNDgwMDBhLCAweDIwMGY4MjEsCi0weDAsIDB4ZCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDgwMDE0ZDYsCi0weDAsIDB4ODAwMTRkOCwgMHgzYzBhMDAwMSwgMHg4MDAxNGQ4LAotMHgzYzBhMDAwMiwgMHg4MDAxNGQ4LCAweDAsIDB4ODAwMjRhNiwKLTB4MCwgMHg4MDAxNGQ4LCAweDNjMGEwMDAzLCAweDgwMDE0ZDgsCi0weDNjMGEwMDA0LCAweDgwMDJmOGMsIDB4MCwgMHg4MDAxNGQ4LAotMHgzYzBhMDAwNSwgMHg4MDAzY2U4LCAweDAsIDB4ODAwM2M2NiwKLTB4MCwgMHg4MDAxNGQ4LCAweDNjMGEwMDA2LCAweDgwMDE0ZDgsCi0weDNjMGEwMDA3LCAweDgwMDE0ZDgsIDB4MCwgMHg4MDAxNGQ4LAotMHgwLCAweDgwMDE0ZDgsIDB4MCwgMHg4MDAyYTc1LAotMHgwLCAweDgwMDE0ZDgsIDB4M2MwYTAwMGIsIDB4ODAwMTRkOCwKLTB4M2MwYTAwMGMsIDB4ODAwMTRkOCwgMHgzYzBhMDAwZCwgMHg4MDAyMzdhLAotMHgwLCAweDgwMDIzMzksIDB4MCwgMHg4MDAxNGQ4LAotMHgzYzBhMDAwZSwgMHg4MDAxYjNjLCAweDAsIDB4ODAwMjRhNCwKLTB4MCwgMHg4MDAxNGQ4LCAweDNjMGEwMDBmLCAweDgwMDQwYTcsCi0weDAsIDB4ODAwNDA5MSwgMHgwLCAweDgwMDE0ZDgsCi0weDNjMGEwMDEwLCAweDgwMDE0ZWUsIDB4MCwgMHg4MDAxNGQ4LAotMHgzYzBhMDAxMSwgMHg4MDAxNGQ4LCAweDNjMGEwMDEyLCAweDgwMDE0ZDgsCi0weDNjMGEwMDEzLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgzYzAzMDAwMSwKLTB4MzQ2MzM4MDAsIDB4MjQwNTAwODAsIDB4MjQwNDAwMWYsIDB4MjQwNmZmZmYsCi0weDI0MDIwMDAxLCAweGFmODAwMjFjLCAweGFmODIwMjAwLCAweGFmODIwMjIwLAotMHgzNjMxMDIxLCAweGFmODIwMGMwLCAweDM2MzEwMjEsIDB4YWY4MjAwYzQsCi0weDM2MzEwMjEsIDB4YWY4MjAwYzgsIDB4Mjc2MjM4MDAsIDB4YWY4MjAwZDAsCi0weDI3NjIzODAwLCAweGFmODIwMGQ0LCAweDI3NjIzODAwLCAweGFmODIwMGQ4LAotMHgyNzYyMTgwMCwgMHhhZjgyMDBlMCwgMHgyNzYyMTgwMCwgMHhhZjgyMDBlNCwKLTB4Mjc2MjE4MDAsIDB4YWY4MjAwZTgsIDB4Mjc2MjEwMDAsIDB4YWY4MjAwZjAsCi0weDI3NjIxMDAwLCAweGFmODIwMGY0LCAweDI3NjIxMDAwLCAweGFmODIwMGY4LAotMHhhY2EwMDAwMCwgMHgyNDg0ZmZmZiwgMHgxNDg2ZmZmZCwgMHgyNGE1MDAwNCwKLTB4OGY4MzAwNDAsIDB4M2MwMmYwMDAsIDB4NjIxODI0LCAweDNjMDI1MDAwLAotMHgxMDYyMDAwYywgMHg0MzEwMmIsIDB4MTQ0MDAwMDYsIDB4M2MwMjYwMDAsCi0weDNjMDI0MDAwLCAweDEwNjIwMDA4LCAweDI0MDIwODAwLCAweDgwMDQ1MzksCi0weDAsIDB4MTA2MjAwMDQsIDB4MjQwMjA4MDAsIDB4ODAwNDUzOSwKLTB4MCwgMHgyNDAyMDcwMCwgMHgzYzAxMDAwMSwgMHhhYzIyNWNkYywKLTB4M2UwMDAwOCwgMHgwLCAweDI3YmRmZmQ4LCAweGFmYmYwMDI0LAotMHhhZmIwMDAyMCwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgzYzAxMDAwMSwKLTB4YWMyMDVjYzQsIDB4ODAwNDU0NSwgMHgyNDYzMDA2NCwgMHg4ZjgyMDA1NCwKLTB4NjIxMDIzLCAweDJjNDIwMDY1LCAweDE0NDBmZmZjLCAweDAsCi0weGMwMDRkNzEsIDB4MCwgMHgyNDA0MDAwMSwgMHgyODIxLAotMHgyN2E2MDAxOCwgMHgzNDAyODAwMCwgMHhjMDA0OThlLCAweGE3YTIwMDE4LAotMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHg4MDA0NTU2LCAweDI0NjMwMDY0LAotMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwNjUsIDB4MTQ0MGZmZmMsCi0weDI0MDQwMDAxLCAweDI0MDUwMDAxLCAweGMwMDQ5NGMsIDB4MjdhNjAwMTgsCi0weDhmODMwMDU0LCAweDhmODIwMDU0LCAweDgwMDQ1NjIsIDB4MjQ2MzAwNjQsCi0weDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDA2NSwgMHgxNDQwZmZmYywKLTB4MjQwNDAwMDEsIDB4MjQwNTAwMDEsIDB4YzAwNDk0YywgMHgyN2E2MDAxOCwKLTB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4ODAwNDU2ZSwgMHgyNDYzMDA2NCwKLTB4OGY4MjAwNTQsIDB4NjIxMDIzLCAweDJjNDIwMDY1LCAweDE0NDBmZmZjLAotMHgyNDA0MDAwMSwgMHgzYzA2MDAwMSwgMHgyNGM2NWRhMCwgMHhjMDA0OTRjLAotMHgyNDA1MDAwMiwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHg4MDA0NTdiLAotMHgyNDYzMDA2NCwgMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwNjUsCi0weDE0NDBmZmZjLCAweDI0MDQwMDAxLCAweDI0MDUwMDAzLCAweDNjMTAwMDAxLAotMHgyNjEwNWRhMiwgMHhjMDA0OTRjLCAweDIwMDMwMjEsIDB4OTdhNjAwMTgsCi0weDNjMDcwMDAxLCAweDk0ZTc1ZGEwLCAweDNjMDQwMDAxLCAweDI0ODQ1YWIwLAotMHhhZmEwMDAxNCwgMHg5NjAyMDAwMCwgMHgzYzA1MDAwZCwgMHgzNGE1MDEwMCwKLTB4YzAwMjQwMywgMHhhZmEyMDAxMCwgMHg5N2EyMDAxOCwgMHgxMDQwMDA0YywKLTB4MjQwMzYwNDAsIDB4OTYwMjAwMDAsIDB4MzA0MmZmZjAsIDB4MTQ0MzAwMGEsCi0weDI0MDIwMDIwLCAweDNjMDMwMDAxLCAweDk0NjM1ZGEwLCAweDU0NjIwMDA5LAotMHgyNDAyNzgzMCwgMHgyNDAyMDAwMywgMHgzYzAxMDAwMSwgMHhhYzIyNWNjNCwKLTB4ODAwNDVhYywgMHgyNDAyMDAwNSwgMHgzYzAzMDAwMSwgMHg5NDYzNWRhMCwKLTB4MjQwMjc4MzAsIDB4MTQ2MjAwMGYsIDB4MjQwMzAwMTAsIDB4M2MwMjAwMDEsCi0weDk0NDI1ZGEyLCAweDMwNDJmZmYwLCAweDE0NDMwMDBhLCAweDI0MDIwMDAzLAotMHgzYzAxMDAwMSwgMHhhYzIyNWNjNCwgMHgyNDAyMDAwNiwgMHgzYzAxMDAwMSwKLTB4YWMyMjVkYjAsIDB4M2MwMTAwMDEsIDB4YWMyMjVkYmMsIDB4ODAwNDVlNiwKLTB4M2MwOWZmZjAsIDB4M2MwMjAwMDEsIDB4OGM0MjVjYzQsIDB4M2MwMzAwMDEsCi0weDk0NjM1ZGEwLCAweDM0NDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjI1Y2M0LAotMHgyNDAyMDAxNSwgMHgxNDYyMDAwZiwgMHgwLCAweDNjMDIwMDAxLAotMHg5NDQyNWRhMiwgMHgzMDQyZmZmMCwgMHgzODQzZjQyMCwgMHgyYzYzMDAwMSwKLTB4Mzg0MmY0MzAsIDB4MmM0MjAwMDEsIDB4NjIxODI1LCAweDEwNjAwMDA1LAotMHgyNDAyMDAwMywgMHgzYzAxMDAwMSwgMHhhYzIyNWRiYywgMHg4MDA0NWU2LAotMHgzYzA5ZmZmMCwgMHgzYzAzMDAwMSwgMHg5NDYzNWRhMCwgMHgyNDAyNzgxMCwKLTB4MTQ2MjAwMGIsIDB4MjQwMjAwMDIsIDB4M2MwMjAwMDEsIDB4OTQ0MjVkYTIsCi0weDMwNDJmZmYwLCAweDE0NDAwMDA2LCAweDI0MDIwMDAyLCAweDI0MDIwMDA0LAotMHgzYzAxMDAwMSwgMHhhYzIyNWRiYywgMHg4MDA0NWU2LCAweDNjMDlmZmYwLAotMHgzYzAxMDAwMSwgMHhhYzIyNWRiYywgMHg4MDA0NWU2LCAweDNjMDlmZmYwLAotMHgzYzAyMDAwMSwgMHg4YzQyNWNjNCwgMHgyNDAzMDAwMSwgMHgzYzAxMDAwMSwKLTB4YWMyMzVkYmMsIDB4MzQ0MjAwMDQsIDB4M2MwMTAwMDEsIDB4YWMyMjVjYzQsCi0weDNjMDlmZmYwLCAweDM1MjliZGMwLCAweDNjMDYwMDAxLCAweDhjYzY1Y2M0LAotMHgzYzA0MDAwMSwgMHgyNDg0NWFiMCwgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwKLTB4YWMyMjVjY2MsIDB4OGY4MjAwNTQsIDB4M2MwNzAwMDEsIDB4OGNlNzVkYmMsCi0weDNjMDMwMDAxLCAweDk0NjM1ZGEwLCAweDNjMDgwMDAxLCAweDk1MDg1ZGEyLAotMHgzYzA1MDAwZCwgMHgzNGE1MDEwMCwgMHgzYzAxMDAwMSwgMHhhYzIwNWNjOCwKLTB4NDkxMDIxLCAweDNjMDEwMDAxLCAweGFjMjI1ZGFjLCAweGFmYTMwMDEwLAotMHhjMDAyNDAzLCAweGFmYTgwMDE0LCAweDhmYmYwMDI0LCAweDhmYjAwMDIwLAotMHgzZTAwMDA4LCAweDI3YmQwMDI4LCAweDI3YmRmZmU4LCAweDNjMDUwMDAxLAotMHg4Y2E1NWNjOCwgMHgyNDA2MDAwNCwgMHgyNDAyMDAwMSwgMHgxNGEyMDAxNCwKLTB4YWZiZjAwMTAsIDB4M2MwMjAwMDEsIDB4OGM0MjdlM2MsIDB4MzA0MjgwMDAsCi0weDEwNDAwMDA1LCAweDNjMDQwMDBmLCAweDNjMDMwMDAxLCAweDhjNjM1ZGJjLAotMHg4MDA0NjE3LCAweDM0ODQ0MjQwLCAweDNjMDQwMDA0LCAweDNjMDMwMDAxLAotMHg4YzYzNWRiYywgMHgzNDg0OTNlMCwgMHgyNDAyMDAwNSwgMHgxNDYyMDAxNiwKLTB4MCwgMHgzYzA0MDAzZCwgMHg4MDA0NjJmLCAweDM0ODQwOTAwLAotMHgzYzAyMDAwMSwgMHg4YzQyN2UzOCwgMHgzMDQyODAwMCwgMHgxMDQwMDAwNSwKLTB4M2MwNDAwMWUsIDB4M2MwMzAwMDEsIDB4OGM2MzVkYmMsIDB4ODAwNDYyYSwKLTB4MzQ4NDg0ODAsIDB4M2MwNDAwMGYsIDB4M2MwMzAwMDEsIDB4OGM2MzVkYmMsCi0weDM0ODQ0MjQwLCAweDI0MDIwMDA1LCAweDE0NjIwMDAzLCAweDAsCi0weDNjMDQwMDdhLCAweDM0ODQxMjAwLCAweDNjMDIwMDAxLCAweDhjNDI1ZGFjLAotMHg4ZjgzMDA1NCwgMHg0NDEwMjEsIDB4NDMxMDIzLCAweDQ0MTAyYiwKLTB4MTQ0MDAwMzcsIDB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNWNkMCwKLTB4MTQ0MDAwMzMsIDB4MCwgMHgzYzAxMDAwMSwgMHgxMGMwMDAyNSwKLTB4YWMyMDVjZTAsIDB4M2MwOTAwMDEsIDB4OGQyOTVjYzQsIDB4MjQwNzAwMDEsCi0weDNjMDQ0MDAwLCAweDNjMDgwMDAxLCAweDI1MDg3ZTNjLCAweDI1MGFmZmZjLAotMHg1Mjg0MiwgMHgxNGEwMDAwMiwgMHgyNGM2ZmZmZiwgMHgyNDA1MDAwOCwKLTB4YTkxMDI0LCAweDEwNDAwMDEwLCAweDAsIDB4MTRhNzAwMDgsCi0weDAsIDB4OGQwMjAwMDAsIDB4NDQxMDI0LCAweDEwNDAwMDBhLAotMHgwLCAweDNjMDEwMDAxLCAweDgwMDQ2NWIsIDB4YWMyNTVjZTAsCi0weDhkNDIwMDAwLCAweDQ0MTAyNCwgMHgxMDQwMDAwMywgMHgwLAotMHgzYzAxMDAwMSwgMHhhYzI3NWNlMCwgMHgzYzAyMDAwMSwgMHg4YzQyNWNlMCwKLTB4NjE4MmIsIDB4MmM0MjAwMDEsIDB4NDMxMDI0LCAweDU0NDBmZmU1LAotMHg1Mjg0MiwgMHg4ZjgyMDA1NCwgMHgzYzAzMDAwMSwgMHg4YzYzNWNlMCwKLTB4M2MwMTAwMDEsIDB4YWMyMjVkYWMsIDB4MTA2MDAwMmEsIDB4MjQwMjAwMDEsCi0weDNjMDEwMDAxLCAweGFjMjU1Y2M4LCAweDNjMDEwMDAxLCAweGFjMjI1Y2NjLAotMHgzYzAyMDAwMSwgMHg4YzQyNWNlMCwgMHgxMDQwMDAyMiwgMHgwLAotMHgzYzAyMDAwMSwgMHg4YzQyNWNjYywgMHgxMDQwMDAwYSwgMHgyNDAyMDAwMSwKLTB4M2MwMTAwMDEsIDB4YWMyMDVjY2MsIDB4M2MwMTAwMDEsIDB4MzcwODIxLAotMHhhYzIyODNhYywgMHgzYzAxMDAwMSwgMHhhYzIwNWQ0YywgMHgzYzAxMDAwMSwKLTB4YWMyMjVkMDQsIDB4M2MwMzAwMDEsIDB4NzcxODIxLCAweDhjNjM4M2FjLAotMHgyNDAyMDAwOCwgMHgxMDYyMDAwNSwgMHgyNDAyMDAwMSwgMHhjMDA0Njk1LAotMHgwLCAweDgwMDQ2OTIsIDB4MCwgMHgzYzAzMDAwMSwKLTB4OGM2MzVjYzgsIDB4MTA2MjAwMDcsIDB4MjQwMjAwMGUsIDB4M2MwMzAwMDEsCi0weDhjNjM3ZGQwLCAweDEwNjIwMDAzLCAweDAsIDB4YzAwNGU1NCwKLTB4OGY4NDAyMjAsIDB4OGZiZjAwMTAsIDB4M2UwMDAwOCwgMHgyN2JkMDAxOCwKLTB4MjdiZGZmZTAsIDB4M2MwMmZkZmYsIDB4YWZiZjAwMTgsIDB4OGVlMzAwMDAsCi0weDNjMDUwMDAxLCAweDhjYTU1Y2M4LCAweDNjMDQwMDAxLCAweDhjODQ1Y2YwLAotMHgzNDQyZmZmZiwgMHg2MjE4MjQsIDB4MTRhNDAwMDgsIDB4YWVlMzAwMDAsCi0weDNjMDMwMDAxLCAweDc3MTgyMSwgMHg4YzYzODNhYywgMHgzYzAyMDAwMSwKLTB4OGM0MjVjZjQsIDB4MTA2MjAwMDgsIDB4MCwgMHgzYzAyMDAwMSwKLTB4NTcxMDIxLCAweDhjNDI4M2FjLCAweDNjMDEwMDAxLCAweGFjMjU1Y2YwLAotMHgzYzAxMDAwMSwgMHhhYzIyNWNmNCwgMHgzYzAzMDAwMSwgMHg4YzYzNWNjOCwKLTB4MjQwMjAwMDIsIDB4MTA2MjAxNjksIDB4MmM2MjAwMDMsIDB4MTA0MDAwMDUsCi0weDI0MDIwMDAxLCAweDEwNjIwMDA4LCAweDAsIDB4ODAwNDgxYywKLTB4MCwgMHgyNDAyMDAwNCwgMHgxMDYyMDBiMSwgMHgyNDAyMDAwMSwKLTB4ODAwNDgxZCwgMHgwLCAweDNjMDIwMDAxLCAweDU3MTAyMSwKLTB4OGM0MjgzYWMsIDB4MjQ0M2ZmZmYsIDB4MmM2MjAwMDgsIDB4MTA0MDAxNWEsCi0weDMxMDgwLCAweDNjMDEwMDAxLCAweDIyMDgyMSwgMHg4YzIyNWFjOCwKLTB4NDAwMDA4LCAweDAsIDB4M2MwMzAwMDEsIDB4OGM2MzVkYmMsCi0weDI0MDIwMDA1LCAweDE0NjIwMDE0LCAweDAsIDB4M2MwMjAwMDEsCi0weDhjNDI1Y2Q0LCAweDEwNDAwMDBhLCAweDI0MDIwMDAzLCAweGMwMDQ4MjIsCi0weDAsIDB4MjQwMjAwMDIsIDB4M2MwMTAwMDEsIDB4MzcwODIxLAotMHhhYzIyODNhYywgMHgzYzAxMDAwMSwgMHg4MDA0NmUwLCAweGFjMjA1Y2Q0LAotMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YWMyMjgzYWMsIDB4M2MwMTAwMDEsCi0weDgwMDQ4MWYsIDB4YWMyMDVjNjAsIDB4YzAwNDgyMiwgMHgwLAotMHgzYzAyMDAwMSwgMHg4YzQyNWNkNCwgMHgzYzAxMDAwMSwgMHhhYzIwNWM2MCwKLTB4MTA0MDAwZGQsIDB4MjQwMjAwMDIsIDB4M2MwMTAwMDEsIDB4MzcwODIxLAotMHhhYzIyODNhYywgMHgzYzAxMDAwMSwgMHg4MDA0ODFmLCAweGFjMjA1Y2Q0LAotMHgzYzAzMDAwMSwgMHg4YzYzNWRiYywgMHgyNDAyMDAwNSwgMHgxNDYyMDAwMywKLTB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMjVkMDAsIDB4YzAwNDljZiwKLTB4MCwgMHgzYzAzMDAwMSwgMHg4YzYzNWQwMCwgMHg4MDA0NzhlLAotMHgyNDAyMDAxMSwgMHgzYzA1MDAwMSwgMHg4Y2E1NWNjOCwgMHgzYzA2MDAwMSwKLTB4OGNjNjdlM2MsIDB4YzAwNTEwOCwgMHgyMDIxLCAweDI0MDIwMDA1LAotMHgzYzAxMDAwMSwgMHhhYzIwNWNkNCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsCi0weDgwMDQ4MWYsIDB4YWMyMjgzYWMsIDB4M2MwNDAwMDEsIDB4MjQ4NDVhYmMsCi0weDNjMDUwMDBmLCAweDM0YTUwMTAwLCAweDMwMjEsIDB4MzgyMSwKLTB4YWZhMDAwMTAsIDB4YzAwMjQwMywgMHhhZmEwMDAxNCwgMHg4MDA0ODFmLAotMHgwLCAweDhmODIwMjIwLCAweDNjMDNmNzAwLCAweDQzMTAyNSwKLTB4ODAwNDdiNywgMHhhZjgyMDIyMCwgMHg4ZjgyMDIyMCwgMHgzYzAzMDAwNCwKLTB4NDMxMDI0LCAweDE0NDAwMGE5LCAweDI0MDIwMDA3LCAweDhmODMwMDU0LAotMHgzYzAyMDAwMSwgMHg4YzQyNWRhNCwgMHgyNDYzZDhmMCwgMHg0MzEwMjMsCi0weDJjNDIyNzEwLCAweDE0NDAwMGY4LCAweDI0MDIwMDAxLCAweDgwMDQ4MWQsCi0weDAsIDB4M2MwNTAwMDEsIDB4OGNhNTVjYzgsIDB4YzAwNTJhMiwKLTB4MjAyMSwgMHhjMDA1Mzg2LCAweDIwMjEsIDB4M2MwMzAwMDEsCi0weDhjNjM3ZTM0LCAweDQ2MTAwZWEsIDB4MjQwMjAwMDEsIDB4M2MwMjAwMDgsCi0weDYyMTAyNCwgMHgxMDQwMDAwNiwgMHgwLCAweDhmODIwMjE0LAotMHgzYzAzZmZmZiwgMHg0MzEwMjQsIDB4ODAwNDc0MSwgMHgzNDQyMjUxZiwKLTB4OGY4MjAyMTQsIDB4M2MwM2ZmZmYsIDB4NDMxMDI0LCAweDM0NDIyNDFmLAotMHhhZjgyMDIxNCwgMHg4ZWUyMDAwMCwgMHgzYzAzMDIwMCwgMHg0MzEwMjUsCi0weGFlZTIwMDAwLCAweDhmODIwMjIwLCAweDI0MDNmZmZiLCAweDQzMTAyNCwKLTB4YWY4MjAyMjAsIDB4OGY4MjAyMjAsIDB4MzQ0MjAwMDIsIDB4YWY4MjAyMjAsCi0weDI0MDIwMDA4LCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhYzIyODNhYywKLTB4OGY4MjAyMjAsIDB4M2MwMzAwMDQsIDB4NDMxMDI0LCAweDE0NDAwMDA1LAotMHgwLCAweDhmODIwMjIwLCAweDNjMDNmNzAwLCAweDQzMTAyNSwKLTB4YWY4MjAyMjAsIDB4M2MwMzAwMDEsIDB4OGM2MzVkYmMsIDB4MjQwMjAwMDUsCi0weDE0NjIwMDBhLCAweDAsIDB4M2MwMjAwMDEsIDB4OTQ0MjVkYTIsCi0weDI0NDI5ZmJjLCAweDJjNDIwMDA0LCAweDEwNDAwMDA0LCAweDI0MDQwMDE4LAotMHgyNDA1MDAwMiwgMHhjMDA0ZDkzLCAweDI0MDYwMDIwLCAweGMwMDQzZGQsCi0weDAsIDB4M2MwMTAwMDEsIDB4ODAwNDgxZiwgMHhhYzIwNWQ1MCwKLTB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDhjNDI4M2FjLCAweDI0NDNmZmZmLAotMHgyYzYyMDAwOCwgMHgxMDQwMDBhYywgMHgzMTA4MCwgMHgzYzAxMDAwMSwKLTB4MjIwODIxLCAweDhjMjI1YWU4LCAweDQwMDAwOCwgMHgwLAotMHhjMDA0MjliLCAweDAsIDB4M2MwMTAwMDEsIDB4YWMyMDVjY2MsCi0weGFmODAwMjA0LCAweDNjMDEwMDAxLCAweGMwMDQ4MjIsIDB4YWMyMDdlMjAsCi0weDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjI1Y2U0LCAweDI0MDIwMDAyLAotMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4ODAwNDgxZiwgMHhhYzIyODNhYywKLTB4YzAwNDg5ZiwgMHgwLCAweDNjMDMwMDAxLCAweDhjNjM1Y2U0LAotMHgyNDAyMDAwOSwgMHgxNDYyMDA5MCwgMHgyNDAyMDAwMywgMHgzYzAxMDAwMSwKLTB4MzcwODIxLCAweDgwMDQ4MWYsIDB4YWMyMjgzYWMsIDB4M2MwMjAwMDEsCi0weDhjNDI3ZTM4LCAweDMwNDI0MDAwLCAweDEwNDAwMDA1LCAweDAsCi0weDhmODIwMDQ0LCAweDNjMDNmZmZmLCAweDgwMDQ3OWYsIDB4MzQ2MzdmZmYsCi0weDhmODIwMDQ0LCAweDI0MDNmZjdmLCAweDQzMTAyNCwgMHhhZjgyMDA0NCwKLTB4OGY4MzAwNTQsIDB4ODAwNDdiOSwgMHgyNDAyMDAwNCwgMHg4ZjgzMDA1NCwKLTB4M2MwMjAwMDEsIDB4OGM0MjVkYTQsIDB4MjQ2M2Q4ZjAsIDB4NDMxMDIzLAotMHgyYzQyMjcxMCwgMHgxNDQwMDA3NCwgMHgyNDAyMDAwNSwgMHgzYzAxMDAwMSwKLTB4MzcwODIxLCAweDgwMDQ4MWYsIDB4YWMyMjgzYWMsIDB4OGY4MjAyMjAsCi0weDNjMDNmNzAwLCAweDQzMTAyNSwgMHhhZjgyMDIyMCwgMHhhZjgwMDIwNCwKLTB4M2MwMTAwMDEsIDB4YWMyMDdlMjAsIDB4OGY4MzAwNTQsIDB4MjQwMjAwMDYsCi0weDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhYzIyODNhYywgMHgzYzAxMDAwMSwKLTB4ODAwNDgxZiwgMHhhYzIzNWRhNCwgMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMSwKLTB4OGM0MjVkYTQsIDB4MjQ2M2ZmZjYsIDB4NDMxMDIzLCAweDJjNDIwMDBhLAotMHgxNDQwMDA1OSwgMHgwLCAweDI0MDIwMDA3LCAweDNjMDEwMDAxLAotMHgzNzA4MjEsIDB4ODAwNDgxZiwgMHhhYzIyODNhYywgMHg4ZjgyMDIyMCwKLTB4M2MwNGY3MDAsIDB4NDQxMDI1LCAweGFmODIwMjIwLCAweDhmODIwMjIwLAotMHgzYzAzMDMwMCwgMHg0MzEwMjQsIDB4MTQ0MDAwMDUsIDB4MTgyMSwKLTB4OGY4MjAyMjAsIDB4MjQwMzAwMDEsIDB4NDQxMDI1LCAweGFmODIwMjIwLAotMHgxMDYwMDA0MywgMHgyNDAyMDAwMSwgMHg4ZjgyMDIxNCwgMHgzYzAzZmZmZiwKLTB4M2MwNDAwMDEsIDB4OGM4NDVkOTgsIDB4NDMxMDI0LCAweDM0NDIyNTFmLAotMHhhZjgyMDIxNCwgMHgyNDAyMDAwOCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsCi0weDEwODAwMDBiLCAweGFjMjI4M2FjLCAweDNjMDIwMDAxLCAweDhjNDI1ZDc0LAotMHgxNDQwMDAwNywgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzIyN2RkMCwKLTB4YzAwNGU1NCwgMHg4Zjg0MDIyMCwgMHg4MDA0ODBjLCAweDAsCi0weDhmODIwMjIwLCAweDNjMDMwMDA4LCAweDQzMTAyNCwgMHgxNDQwMDAxNywKLTB4MjQwMjAwMGUsIDB4M2MwMTAwMDEsIDB4YWMyMjdkZDAsIDB4OGVlMjAwMDAsCi0weDIwMjEsIDB4M2MwMzAyMDAsIDB4NDMxMDI1LCAweGMwMDUzODYsCi0weGFlZTIwMDAwLCAweDhmODIwMjIwLCAweDI0MDNmZmZiLCAweDQzMTAyNCwKLTB4YWY4MjAyMjAsIDB4OGY4MjAyMjAsIDB4MzQ0MjAwMDIsIDB4YzAwNDNkZCwKLTB4YWY4MjAyMjAsIDB4M2MwNTAwMDEsIDB4OGNhNTVjYzgsIDB4YzAwNTJhMiwKLTB4MjAyMSwgMHg4MDA0ODFmLCAweDAsIDB4M2MwMjAwMDEsCi0weDhjNDI1ZDc0LCAweDEwNDAwMDEwLCAweDAsIDB4M2MwMjAwMDEsCi0weDhjNDI1ZDcwLCAweDI0NDJmZmZmLCAweDNjMDEwMDAxLCAweGFjMjI1ZDcwLAotMHgxNDQwMDAwOSwgMHgyNDAyMDAwMiwgMHgzYzAxMDAwMSwgMHhhYzIwNWQ3NCwKLTB4M2MwMTAwMDEsIDB4ODAwNDgxZiwgMHhhYzIyNWQ3MCwgMHgyNDAyMDAwMSwKLTB4M2MwMTAwMDEsIDB4YWMyMjVjY2MsIDB4OGZiZjAwMTgsIDB4M2UwMDAwOCwKLTB4MjdiZDAwMjAsIDB4OGY4MjAyMDAsIDB4OGY4MjAyMjAsIDB4OGY4MjAyMjAsCi0weDM0NDIwMDA0LCAweGFmODIwMjIwLCAweDhmODIwMjAwLCAweDNjMDYwMDAxLAotMHg4Y2M2NWNjOCwgMHgzNDQyMDAwNCwgMHhhZjgyMDIwMCwgMHgyNDAyMDAwMiwKLTB4MTBjMjAwM2EsIDB4MmNjMjAwMDMsIDB4MTA0MDAwMDUsIDB4MjQwMjAwMDEsCi0weDEwYzIwMDA4LCAweDAsIDB4ODAwNDg2OCwgMHgwLAotMHgyNDAyMDAwNCwgMHgxMGMyMDAxMywgMHgyNDAyMDAwMSwgMHg4MDA0ODY4LAotMHgwLCAweDNjMDMwMDAxLCAweDhjNjM1Y2I4LCAweDNjMDIwMDAxLAotMHg4YzQyNWNjMCwgMHgzYzA0MDAwMSwgMHg4Yzg0NWNkYywgMHgzYzA1MDAwMSwKLTB4OGNhNTVjYmMsIDB4YWY4NjAyMDAsIDB4YWY4NjAyMjAsIDB4MzQ2MzAwMjIsCi0weDQ0MTAyNSwgMHg0NTEwMjUsIDB4MzQ0MjAwMDIsIDB4ODAwNDg2NywKLTB4YWY4MzAyMDAsIDB4M2MwMzAwMDEsIDB4OGM2MzVkOTgsIDB4YWY4MjAyMDAsCi0weDEwNjAwMDA5LCAweGFmODIwMjIwLCAweDNjMDIwMDAxLCAweDhjNDI1ZDc0LAotMHgxNDQwMDAwNSwgMHgzYzAzM2YwMCwgMHgzYzAyMDAwMSwgMHg4YzQyNWNiMCwKLTB4ODAwNDg1YiwgMHgzNDYzMDBlMCwgMHgzYzAyMDAwMSwgMHg4YzQyNWNiMCwKLTB4M2MwMzNmMDAsIDB4MzQ2MzAwZTIsIDB4NDMxMDI1LCAweGFmODIwMjAwLAotMHgzYzAzMDAwMSwgMHg4YzYzNWNiNCwgMHgzYzA0ZjcwMCwgMHgzYzAyMDAwMSwKLTB4OGM0MjVjYzAsIDB4M2MwNTAwMDEsIDB4OGNhNTVjZGMsIDB4NjQxODI1LAotMHg0MzEwMjUsIDB4NDUxMDI1LCAweGFmODIwMjIwLCAweDNlMDAwMDgsCi0weDAsIDB4OGY4MjAyMjAsIDB4M2MwMzAwMDEsIDB4OGM2MzVjYzgsCi0weDM0NDIwMDA0LCAweGFmODIwMjIwLCAweDI0MDIwMDAxLCAweDEwNjIwMDBmLAotMHgwLCAweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDI0NjMwMDAyLAotMHg2MjEwMjMsIDB4MmM0MjAwMDMsIDB4MTA0MDAwMTEsIDB4MCwKLTB4OGY4MjAwNTQsIDB4NjIxMDIzLCAweDJjNDIwMDAzLCAweDEwNDAwMDBjLAotMHgwLCAweDgwMDQ4NzksIDB4MCwgMHg4ZjgzMDA1NCwKLTB4OGY4MjAwNTQsIDB4ODAwNDg4NSwgMHgyNDYzMDAwNywgMHg4ZjgyMDA1NCwKLTB4NjIxMDIzLCAweDJjNDIwMDA4LCAweDE0NDBmZmZjLCAweDAsCi0weDhmODQwMGUwLCAweDMwODIwMDA3LCAweDEwNDAwMDBkLCAweDAsCi0weDhmODIwMDU0LCAweDhmODMwMGUwLCAweDE0ODMwMDA5LCAweDI0NDUwMDMyLAotMHg4ZjgyMDA1NCwgMHhhMjEwMjMsIDB4MmM0MjAwMzMsIDB4MTA0MDAwMDQsCi0weDAsIDB4OGY4MjAwZTAsIDB4MTA4MmZmZjksIDB4MCwKLTB4OGY4MjAyMjAsIDB4MjQwM2ZmZmQsIDB4NDMxMDI0LCAweGFmODIwMjIwLAotMHgzZTAwMDA4LCAweDAsIDB4M2MwMzAwMDEsIDB4OGM2MzVjZTQsCi0weDNjMDIwMDAxLCAweDhjNDI1Y2U4LCAweDUwNjIwMDA0LCAweDI0NjNmZmZmLAotMHgzYzAxMDAwMSwgMHhhYzIzNWNlOCwgMHgyNDYzZmZmZiwgMHgyYzYyMDAwOSwKLTB4MTA0MDAwOWQsIDB4MzEwODAsIDB4M2MwMTAwMDEsIDB4MjIwODIxLAotMHg4YzIyNWIwOCwgMHg0MDAwMDgsIDB4MCwgMHg4ZjgyMDA0NCwKLTB4MzQ0MjgwODAsIDB4YWY4MjAwNDQsIDB4OGY4MzAwNTQsIDB4ODAwNDkzOCwKLTB4MjQwMjAwMDIsIDB4OGY4MzAwNTQsIDB4M2MwMjAwMDEsIDB4OGM0MjVkYTgsCi0weDI0NjNkOGYwLCAweDQzMTAyMywgMHgyYzQyMjcxMCwgMHgxNDQwMDA4YSwKLTB4MjQwMjAwMDMsIDB4ODAwNDk0NSwgMHgwLCAweDhmODIwMDQ0LAotMHgzYzAzZmZmZiwgMHgzNDYzN2ZmZiwgMHg0MzEwMjQsIDB4YWY4MjAwNDQsCi0weDhmODMwMDU0LCAweDgwMDQ5MzgsIDB4MjQwMjAwMDQsIDB4OGY4MzAwNTQsCi0weDNjMDIwMDAxLCAweDhjNDI1ZGE4LCAweDI0NjNmZmY2LCAweDQzMTAyMywKLTB4MmM0MjAwMGEsIDB4MTQ0MDAwNzgsIDB4MjQwMjAwMDUsIDB4ODAwNDk0NSwKLTB4MCwgMHg4ZjgyMDIyMCwgMHgzYzAzZjcwMCwgMHg0MzEwMjUsCi0weGFmODIwMjIwLCAweDhmODIwMjIwLCAweDI0MDNmZmZiLCAweDQzMTAyNCwKLTB4YWY4MjAyMjAsIDB4OGY4MjAyMjAsIDB4MzQ0MjAwMDIsIDB4YWY4MjAyMjAsCi0weDNjMDIzZjAwLCAweDM0NDIwMGUwLCAweGFmODIwMjAwLCAweDhmODIwMjAwLAotMHgyNDAzZmZmZCwgMHg0MzEwMjQsIDB4YWY4MjAyMDAsIDB4MjQwNDAwMDEsCi0weDM0MDVmZmZmLCAweGFmODQwMjA0LCAweDhmODMwMDU0LCAweDhmODIwMDU0LAotMHg4MDA0OGVjLCAweDI0NjMwMDAxLCAweDhmODIwMDU0LCAweDYyMTAyMywKLTB4MmM0MjAwMDIsIDB4MTQ0MGZmZmMsIDB4MCwgMHg4ZjgyMDIyNCwKLTB4NDIwNDAsIDB4YTQxMDJiLCAweDEwNDBmZmYyLCAweDAsCi0weDhmODIwMjIwLCAweDNjMDNmNzAwLCAweDQzMTAyNSwgMHhhZjgyMDIyMCwKLTB4OGY4MjAyMTQsIDB4M2MwM2ZmZmYsIDB4NDMxMDI0LCAweDM0NDIyNTFmLAotMHhhZjgyMDIxNCwgMHg4ZjgyMDIyMCwgMHgyNDAzZmZmYiwgMHg0MzEwMjQsCi0weGFmODIwMjIwLCAweDhmODIwMjIwLCAweDNjMDRmNzAwLCAweDM0ODQwMDA4LAotMHgzNDQyMDAwMiwgMHhhZjgyMDIyMCwgMHg4ZjgyMDIyMCwgMHgzYzAzM2YwMCwKLTB4MzQ2MzAwZTIsIDB4NDQxMDI1LCAweGFmODIwMjIwLCAweGFmODMwMjAwLAotMHg4Zjg0MDBmMCwgMHgyNzYyMTdmOCwgMHgxNDgyMDAwMiwgMHgyNDg1MDAwOCwKLTB4Mjc2NTEwMDAsIDB4OGY4MjAwZjQsIDB4MTBhMjAwMDcsIDB4M2MwMzgwMDAsCi0weDM0NjMwMDQwLCAweDNjMDIwMDAxLCAweDI0NDI1YzcwLCAweGFjODIwMDAwLAotMHhhYzgzMDAwNCwgMHhhZjg1MDBmMCwgMHg4ZjgzMDA1NCwgMHg4MDA0OTM4LAotMHgyNDAyMDAwNiwgMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMSwgMHg4YzQyNWRhOCwKLTB4MjQ2M2ZmZjYsIDB4NDMxMDIzLCAweDJjNDIwMDBhLCAweDE0NDAwMDIyLAotMHgyNDAyMDAwNywgMHg4MDA0OTQ1LCAweDAsIDB4OGY4MjAwZTAsCi0weGFmODIwMGU0LCAweDhmODIwMGUwLCAweGFmODIwMGU4LCAweDhmODIwMjIwLAotMHgzNDQyMDAwNCwgMHhhZjgyMDIyMCwgMHg4ZjgyMDIyMCwgMHgyNDAzZmZmNywKLTB4NDMxMDI0LCAweGFmODIwMjIwLCAweDhmODIwMDQ0LCAweDM0NDI4MDgwLAotMHhhZjgyMDA0NCwgMHg4ZjgzMDA1NCwgMHgyNDAyMDAwOCwgMHgzYzAxMDAwMSwKLTB4YWMyMjVjZTQsIDB4M2MwMTAwMDEsIDB4ODAwNDk0NywgMHhhYzIzNWRhOCwKLTB4OGY4MzAwNTQsIDB4M2MwMjAwMDEsIDB4OGM0MjVkYTgsIDB4MjQ2M2Q4ZjAsCi0weDQzMTAyMywgMHgyYzQyMjcxMCwgMHgxNDQwMDAwMywgMHgyNDAyMDAwOSwKLTB4M2MwMTAwMDEsIDB4YWMyMjVjZTQsIDB4M2UwMDAwOCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgyN2JkZmZkOCwKLTB4YWZiMjAwMTgsIDB4ODA5MDIxLCAweGFmYjMwMDFjLCAweGEwOTgyMSwKLTB4YWZiMTAwMTQsIDB4YzA4ODIxLCAweGFmYjAwMDEwLCAweDgwMjEsCi0weGFmYmYwMDIwLCAweGE2MjAwMDAwLCAweGMwMDRkNGIsIDB4MjQwNDAwMDEsCi0weDI2MTAwMDAxLCAweDJlMDIwMDIwLCAweDE0NDBmZmZiLCAweDAsCi0weGMwMDRkNGIsIDB4MjAyMSwgMHhjMDA0ZDRiLCAweDI0MDQwMDAxLAotMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwKLTB4MjQxMDAwMTAsIDB4MjUwMTAyNCwgMHgxMDQwMDAwMiwgMHgyMDIxLAotMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDEwODA0MiwgMHgxNjAwZmZmYSwKLTB4MjUwMTAyNCwgMHgyNDEwMDAxMCwgMHgyNzAxMDI0LCAweDEwNDAwMDAyLAotMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MTA4MDQyLAotMHgxNjAwZmZmYSwgMHgyNzAxMDI0LCAweGMwMDRkNzEsIDB4MzQxMDgwMDAsCi0weGMwMDRkNzEsIDB4MCwgMHhjMDA0ZDJiLCAweDAsCi0weDUwNDAwMDA1LCAweDEwODA0MiwgMHg5NjIyMDAwMCwgMHg1MDEwMjUsCi0weGE2MjIwMDAwLCAweDEwODA0MiwgMHgxNjAwZmZmNywgMHgwLAotMHhjMDA0ZDcxLCAweDAsIDB4OGZiZjAwMjAsIDB4OGZiMzAwMWMsCi0weDhmYjIwMDE4LCAweDhmYjEwMDE0LCAweDhmYjAwMDEwLCAweDNlMDAwMDgsCi0weDI3YmQwMDI4LCAweDI3YmRmZmQ4LCAweGFmYjEwMDE0LCAweDgwODgyMSwKLTB4YWZiMjAwMTgsIDB4YTA5MDIxLCAweGFmYjMwMDFjLCAweGMwOTgyMSwKLTB4YWZiMDAwMTAsIDB4ODAyMSwgMHhhZmJmMDAyMCwgMHhjMDA0ZDRiLAotMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwKLTB4MCwgMHhjMDA0ZDRiLCAweDIwMjEsIDB4YzAwNGQ0YiwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyMDIxLCAweGMwMDRkNGIsCi0weDI0MDQwMDAxLCAweDI0MTAwMDEwLCAweDIzMDEwMjQsIDB4MTA0MDAwMDIsCi0weDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgxMDgwNDIsCi0weDE2MDBmZmZhLCAweDIzMDEwMjQsIDB4MjQxMDAwMTAsIDB4MjUwMTAyNCwKLTB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLAotMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MjUwMTAyNCwgMHhjMDA0ZDRiLAotMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDIwMjEsIDB4MzQxMDgwMDAsCi0weDk2NjIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwgMHgyMDIxLAotMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDEwODA0MiwgMHgxNjAwZmZmOCwKLTB4MCwgMHhjMDA0ZDcxLCAweDAsIDB4OGZiZjAwMjAsCi0weDhmYjMwMDFjLCAweDhmYjIwMDE4LCAweDhmYjEwMDE0LCAweDhmYjAwMDEwLAotMHgzZTAwMDA4LCAweDI3YmQwMDI4LCAweDNjMDMwMDAxLCAweDhjNjM1ZDAwLAotMHgzYzAyMDAwMSwgMHg4YzQyNWQ0OCwgMHgyN2JkZmZkOCwgMHhhZmJmMDAyMCwKLTB4YWZiMTAwMWMsIDB4MTA2MjAwMDMsIDB4YWZiMDAwMTgsIDB4M2MwMTAwMDEsCi0weGFjMjM1ZDQ4LCAweDI0NjNmZmZmLCAweDJjNjIwMDEzLCAweDEwNDAwMzQ5LAotMHgzMTA4MCwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4OGMyMjViMzAsCi0weDQwMDAwOCwgMHgwLCAweGMwMDRkNzEsIDB4ODAyMSwKLTB4MzQwMjgwMDAsIDB4YTdhMjAwMTAsIDB4MjdiMTAwMTAsIDB4YzAwNGQ0YiwKLTB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsCi0weDAsIDB4YzAwNGQ0YiwgMHgyMDIxLCAweGMwMDRkNGIsCi0weDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgMHhjMDA0ZDRiLAotMHgyNDA0MDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwgMHgxMDQwMDAwMiwKLTB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDEwODA0MiwKLTB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIDB4YzAwNGQ0YiwKLTB4MjAyMSwgMHgxMDgwNDIsIDB4MTYwMGZmZmMsIDB4MCwKLTB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDIwMjEsCi0weDM0MTA4MDAwLCAweDk2MjIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwKLTB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDEwODA0MiwKLTB4MTYwMGZmZjgsIDB4MCwgMHhjMDA0ZDcxLCAweDAsCi0weDgwMDRkMjQsIDB4MjQwMjAwMDIsIDB4MjdiMTAwMTAsIDB4YTdhMDAwMTAsCi0weDgwMjEsIDB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwKLTB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDRiLAotMHgyMDIxLCAweGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyMDIxLCAweDI0MTAwMDEwLAotMHgzMjAyMDAwMSwgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLAotMHhjMDA0ZDRiLCAweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwKLTB4MjQxMDAwMTAsIDB4YzAwNGQ0YiwgMHgyMDIxLCAweDEwODA0MiwKLTB4MTYwMGZmZmMsIDB4MCwgMHhjMDA0ZDcxLCAweDM0MTA4MDAwLAotMHhjMDA0ZDcxLCAweDAsIDB4YzAwNGQyYiwgMHgwLAotMHg1MDQwMDAwNSwgMHgxMDgwNDIsIDB4OTYyMjAwMDAsIDB4NTAxMDI1LAotMHhhNjIyMDAwMCwgMHgxMDgwNDIsIDB4MTYwMGZmZjcsIDB4MCwKLTB4YzAwNGQ3MSwgMHgwLCAweDk3YTIwMDEwLCAweDMwNDI4MDAwLAotMHgxNDQwMDJkYywgMHgyNDAyMDAwMywgMHg4MDA0ZDI0LCAweDAsCi0weDI0MDIxMjAwLCAweGE3YTIwMDEwLCAweDI3YjEwMDEwLCAweDgwMjEsCi0weGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsCi0weDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ0YiwgMHgyMDIxLAotMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwKLTB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwKLTB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLAotMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsCi0weGMwMDRkNGIsIDB4MjAyMSwgMHgxMDgwNDIsIDB4MTYwMGZmZmMsCi0weDAsIDB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLAotMHgyMDIxLCAweDM0MTA4MDAwLCAweDk2MjIwMDAwLCAweDUwMTAyNCwKLTB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLAotMHgxMDgwNDIsIDB4MTYwMGZmZjgsIDB4MCwgMHhjMDA0ZDcxLAotMHgwLCAweDhmODMwMDU0LCAweDgwMDRkMTYsIDB4MjQwMjAwMDQsCi0weDhmODMwMDU0LCAweDNjMDIwMDAxLCAweDhjNDI1ZGI4LCAweDI0NjNmZjljLAotMHg0MzEwMjMsIDB4MmM0MjAwNjQsIDB4MTQ0MDAyOWUsIDB4MjQwMjAwMDIsCi0weDNjMDMwMDAxLCAweDhjNjM1ZGJjLCAweDEwNjIwMjk3LCAweDJjNjIwMDAzLAotMHgxNDQwMDI5NiwgMHgyNDAyMDAxMSwgMHgyNDAyMDAwMywgMHgxMDYyMDAwNSwKLTB4MjQwMjAwMDQsIDB4MTA2MjAyOTEsIDB4MjQwMjAwMGYsIDB4ODAwNGQyNCwKLTB4MjQwMjAwMTEsIDB4ODAwNGQyNCwgMHgyNDAyMDAwNSwgMHgyNDAyMDAxNCwKLTB4YTdhMjAwMTAsIDB4MjdiMTAwMTAsIDB4ODAyMSwgMHhjMDA0ZDRiLAotMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwKLTB4MCwgMHhjMDA0ZDRiLCAweDIwMjEsIDB4YzAwNGQ0YiwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyMDIxLCAweGMwMDRkNGIsCi0weDI0MDQwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLCAweDEwNDAwMDAyLAotMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MTA4MDQyLAotMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAxMiwKLTB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLAotMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTIsIDB4YzAwNGQ0YiwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyMDIxLCAweDM0MTA4MDAwLAotMHg5NjIyMDAwMCwgMHg1MDEwMjQsIDB4MTA0MDAwMDIsIDB4MjAyMSwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgxMDgwNDIsIDB4MTYwMGZmZjgsCi0weDAsIDB4YzAwNGQ3MSwgMHgwLCAweDhmODMwMDU0LAotMHg4MDA0ZDE2LCAweDI0MDIwMDA2LCAweDhmODMwMDU0LCAweDNjMDIwMDAxLAotMHg4YzQyNWRiOCwgMHgyNDYzZmY5YywgMHg0MzEwMjMsIDB4MmM0MjAwNjQsCi0weDE0NDAwMjUwLCAweDI0MDIwMDA3LCAweDgwMDRkMjQsIDB4MCwKLTB4MjQwMjAwMDYsIDB4YTdhMjAwMTAsIDB4MjdiMTAwMTAsIDB4ODAyMSwKLTB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwKLTB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDRiLCAweDIwMjEsCi0weGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyMDIxLAotMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLAotMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsCi0weDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwKLTB4MzIwMjAwMTMsIDB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ0YiwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTMsCi0weGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyMDIxLAotMHgzNDEwODAwMCwgMHg5NjIyMDAwMCwgMHg1MDEwMjQsIDB4MTA0MDAwMDIsCi0weDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgxMDgwNDIsCi0weDE2MDBmZmY4LCAweDAsIDB4YzAwNGQ3MSwgMHgwLAotMHg4ZjgzMDA1NCwgMHg4MDA0ZDE2LCAweDI0MDIwMDA4LCAweDhmODMwMDU0LAotMHgzYzAyMDAwMSwgMHg4YzQyNWRiOCwgMHgyNDYzZmY5YywgMHg0MzEwMjMsCi0weDJjNDIwMDY0LCAweDE0NDAwMjBmLCAweDI0MDIwMDA5LCAweDgwMDRkMjQsCi0weDAsIDB4MjdiMTAwMTAsIDB4YTdhMDAwMTAsIDB4ODAyMSwKLTB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwKLTB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDRiLCAweDIwMjEsCi0weGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ0YiwgMHgyMDIxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLAotMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsCi0weDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwKLTB4MzIwMjAwMTgsIDB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ0YiwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTgsCi0weGMwMDRkNzEsIDB4MzQxMDgwMDAsIDB4YzAwNGQ3MSwgMHgwLAotMHhjMDA0ZDJiLCAweDAsIDB4NTA0MDAwMDUsIDB4MTA4MDQyLAotMHg5NjIyMDAwMCwgMHg1MDEwMjUsIDB4YTYyMjAwMDAsIDB4MTA4MDQyLAotMHgxNjAwZmZmNywgMHgwLCAweGMwMDRkNzEsIDB4ODAyMSwKLTB4OTdhMjAwMTAsIDB4MjdiMTAwMTAsIDB4MzQ0MjAwMDEsIDB4YTdhMjAwMTAsCi0weGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsCi0weDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ0YiwgMHgyMDIxLAotMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwKLTB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwKLTB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLAotMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsCi0weDMyMDIwMDE4LCAweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsCi0weGMwMDRkNGIsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDE4LAotMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwKLTB4MzQxMDgwMDAsIDB4OTYyMjAwMDAsIDB4NTAxMDI0LCAweDEwNDAwMDAyLAotMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MTA4MDQyLAotMHgxNjAwZmZmOCwgMHgwLCAweGMwMDRkNzEsIDB4MCwKLTB4OGY4MzAwNTQsIDB4ODAwNGQxNiwgMHgyNDAyMDAwYSwgMHg4ZjgzMDA1NCwKLTB4M2MwMjAwMDEsIDB4OGM0MjVkYjgsIDB4MjQ2M2ZmOWMsIDB4NDMxMDIzLAotMHgyYzQyMDA2NCwgMHgxNDQwMDE5YiwgMHgyNDAyMDAwYiwgMHg4MDA0ZDI0LAotMHgwLCAweDI3YjEwMDEwLCAweGE3YTAwMDEwLCAweDgwMjEsCi0weGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsCi0weDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ0YiwgMHgyMDIxLAotMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjQwNDAwMDEsCi0weGMwMDRkNGIsIDB4MjAyMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwKLTB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLAotMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsCi0weDMyMDIwMDE3LCAweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsCi0weGMwMDRkNGIsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDE3LAotMHhjMDA0ZDcxLCAweDM0MTA4MDAwLCAweGMwMDRkNzEsIDB4MCwKLTB4YzAwNGQyYiwgMHgwLCAweDUwNDAwMDA1LCAweDEwODA0MiwKLTB4OTYyMjAwMDAsIDB4NTAxMDI1LCAweGE2MjIwMDAwLCAweDEwODA0MiwKLTB4MTYwMGZmZjcsIDB4MCwgMHhjMDA0ZDcxLCAweDgwMjEsCi0weDk3YTIwMDEwLCAweDI3YjEwMDEwLCAweDM0NDIwNzAwLCAweGE3YTIwMDEwLAotMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLAotMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNGIsIDB4MjAyMSwKLTB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDIwMjEsCi0weGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsCi0weDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwKLTB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLAotMHgzMjAyMDAxNywgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLAotMHhjMDA0ZDRiLCAweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAxNywKLTB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDIwMjEsCi0weDM0MTA4MDAwLCAweDk2MjIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwKLTB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDEwODA0MiwKLTB4MTYwMGZmZjgsIDB4MCwgMHhjMDA0ZDcxLCAweDAsCi0weDhmODMwMDU0LCAweDgwMDRkMTYsIDB4MjQwMjAwMGMsIDB4OGY4MzAwNTQsCi0weDNjMDIwMDAxLCAweDhjNDI1ZGI4LCAweDI0NjNmZjljLCAweDQzMTAyMywKLTB4MmM0MjAwNjQsIDB4MTQ0MDAxMjcsIDB4MjQwMjAwMTIsIDB4ODAwNGQyNCwKLTB4MCwgMHgyN2IxMDAxMCwgMHhhN2EwMDAxMCwgMHg4MDIxLAotMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLAotMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNGIsIDB4MjAyMSwKLTB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDI0MDQwMDAxLAotMHhjMDA0ZDRiLCAweDIwMjEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsCi0weDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwKLTB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLAotMHgzMjAyMDAxNCwgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLAotMHhjMDA0ZDRiLCAweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAxNCwKLTB4YzAwNGQ3MSwgMHgzNDEwODAwMCwgMHhjMDA0ZDcxLCAweDAsCi0weGMwMDRkMmIsIDB4MCwgMHg1MDQwMDAwNSwgMHgxMDgwNDIsCi0weDk2MjIwMDAwLCAweDUwMTAyNSwgMHhhNjIyMDAwMCwgMHgxMDgwNDIsCi0weDE2MDBmZmY3LCAweDAsIDB4YzAwNGQ3MSwgMHg4MDIxLAotMHg5N2EyMDAxMCwgMHgyN2IxMDAxMCwgMHgzNDQyMDAxMCwgMHhhN2EyMDAxMCwKLTB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwKLTB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDRiLCAweDIwMjEsCi0weGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyMDIxLAotMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLAotMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsCi0weDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwKLTB4MzIwMjAwMTQsIDB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ0YiwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTQsCi0weGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyMDIxLAotMHgzNDEwODAwMCwgMHg5NjIyMDAwMCwgMHg1MDEwMjQsIDB4MTA0MDAwMDIsCi0weDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgxMDgwNDIsCi0weDE2MDBmZmY4LCAweDAsIDB4YzAwNGQ3MSwgMHgwLAotMHg4ZjgzMDA1NCwgMHg4MDA0ZDE2LCAweDI0MDIwMDEzLCAweDhmODMwMDU0LAotMHgzYzAyMDAwMSwgMHg4YzQyNWRiOCwgMHgyNDYzZmY5YywgMHg0MzEwMjMsCi0weDJjNDIwMDY0LCAweDE0NDAwMGIzLCAweDI0MDIwMDBkLCAweDgwMDRkMjQsCi0weDAsIDB4MjdiMTAwMTAsIDB4YTdhMDAwMTAsIDB4ODAyMSwKLTB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwKLTB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDRiLCAweDIwMjEsCi0weGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ0YiwgMHgyMDIxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLAotMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsCi0weDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwKLTB4MzIwMjAwMTgsIDB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ0YiwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTgsCi0weGMwMDRkNzEsIDB4MzQxMDgwMDAsIDB4YzAwNGQ3MSwgMHgwLAotMHhjMDA0ZDJiLCAweDAsIDB4NTA0MDAwMDUsIDB4MTA4MDQyLAotMHg5NjIyMDAwMCwgMHg1MDEwMjUsIDB4YTYyMjAwMDAsIDB4MTA4MDQyLAotMHgxNjAwZmZmNywgMHgwLCAweGMwMDRkNzEsIDB4ODAyMSwKLTB4OTdhMjAwMTAsIDB4MjdiMTAwMTAsIDB4MzA0MmZmZmUsIDB4YTdhMjAwMTAsCi0weGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsCi0weDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ0YiwgMHgyMDIxLAotMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwKLTB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwKLTB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLAotMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsCi0weDMyMDIwMDE4LCAweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsCi0weGMwMDRkNGIsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDE4LAotMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwKLTB4MzQxMDgwMDAsIDB4OTYyMjAwMDAsIDB4NTAxMDI0LCAweDEwNDAwMDAyLAotMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MTA4MDQyLAotMHgxNjAwZmZmOCwgMHgwLCAweGMwMDRkNzEsIDB4MCwKLTB4OGY4MzAwNTQsIDB4ODAwNGQxNiwgMHgyNDAyMDAwZSwgMHgyNDAyMDg0MCwKLTB4YTdhMjAwMTAsIDB4MjdiMTAwMTAsIDB4ODAyMSwgMHhjMDA0ZDRiLAotMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwKLTB4MCwgMHhjMDA0ZDRiLCAweDIwMjEsIDB4YzAwNGQ0YiwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyMDIxLCAweGMwMDRkNGIsCi0weDI0MDQwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLCAweDEwNDAwMDAyLAotMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MTA4MDQyLAotMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAxMywKLTB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLAotMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTMsIDB4YzAwNGQ0YiwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyMDIxLCAweDM0MTA4MDAwLAotMHg5NjIyMDAwMCwgMHg1MDEwMjQsIDB4MTA0MDAwMDIsIDB4MjAyMSwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgxMDgwNDIsIDB4MTYwMGZmZjgsCi0weDAsIDB4YzAwNGQ3MSwgMHgwLCAweDhmODMwMDU0LAotMHgyNDAyMDAxMCwgMHgzYzAxMDAwMSwgMHhhYzIyNWQwMCwgMHgzYzAxMDAwMSwKLTB4ODAwNGQyNiwgMHhhYzIzNWRiOCwgMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMSwKLTB4OGM0MjVkYjgsIDB4MjQ2M2ZmOWMsIDB4NDMxMDIzLCAweDJjNDIwMDY0LAotMHgxNDQwMDAwNCwgMHgwLCAweDI0MDIwMDExLCAweDNjMDEwMDAxLAotMHhhYzIyNWQwMCwgMHg4ZmJmMDAyMCwgMHg4ZmIxMDAxYywgMHg4ZmIwMDAxOCwKLTB4M2UwMDAwOCwgMHgyN2JkMDAyOCwgMHg4Zjg1MDA0NCwgMHg4ZjgyMDA0NCwKLTB4M2MwMzAwMDEsIDB4NDMxMDI1LCAweDNjMDMwMDA4LCAweGFmODIwMDQ0LAotMHg4Zjg0MDA1NCwgMHg4ZjgyMDA1NCwgMHhhMzI4MjQsIDB4ODAwNGQzNywKLTB4MjQ4NDAwMDEsIDB4OGY4MjAwNTQsIDB4ODIxMDIzLCAweDJjNDIwMDAyLAotMHgxNDQwZmZmYywgMHgwLCAweDhmODIwMDQ0LCAweDNjMDNmZmZlLAotMHgzNDYzZmZmZiwgMHg0MzEwMjQsIDB4YWY4MjAwNDQsIDB4OGY4MzAwNTQsCi0weDhmODIwMDU0LCAweDgwMDRkNDUsIDB4MjQ2MzAwMDEsIDB4OGY4MjAwNTQsCi0weDYyMTAyMywgMHgyYzQyMDAwMiwgMHgxNDQwZmZmYywgMHgwLAotMHgzZTAwMDA4LCAweGEwMTAyMSwgMHg4ZjgzMDA0NCwgMHgzYzAyZmZmMCwKLTB4MzQ0MmZmZmYsIDB4NDI0ODAsIDB4NjIxODI0LCAweDNjMDIwMDAyLAotMHg4MjIwMjUsIDB4NjQxODI1LCAweGFmODMwMDQ0LCAweDhmODIwMDQ0LAotMHgzYzAzZmZmZSwgMHgzNDYzZmZmZiwgMHg0MzEwMjQsIDB4YWY4MjAwNDQsCi0weDhmODMwMDU0LCAweDhmODIwMDU0LCAweDgwMDRkNWUsIDB4MjQ2MzAwMDEsCi0weDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDAwMiwgMHgxNDQwZmZmYywKLTB4MCwgMHg4ZjgyMDA0NCwgMHgzYzAzMDAwMSwgMHg0MzEwMjUsCi0weGFmODIwMDQ0LCAweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDgwMDRkNmIsCi0weDI0NjMwMDAxLCAweDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDAwMiwKLTB4MTQ0MGZmZmMsIDB4MCwgMHgzZTAwMDA4LCAweDAsCi0weDhmODIwMDQ0LCAweDNjMDNmZmYwLCAweDM0NjNmZmZmLCAweDQzMTAyNCwKLTB4YWY4MjAwNDQsIDB4OGY4MjAwNDQsIDB4M2MwMzAwMDEsIDB4NDMxMDI1LAotMHhhZjgyMDA0NCwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHg4MDA0ZDdmLAotMHgyNDYzMDAwMSwgMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwMDIsCi0weDE0NDBmZmZjLCAweDAsIDB4OGY4MjAwNDQsIDB4M2MwM2ZmZmUsCi0weDM0NjNmZmZmLCAweDQzMTAyNCwgMHhhZjgyMDA0NCwgMHg4ZjgzMDA1NCwKLTB4OGY4MjAwNTQsIDB4ODAwNGQ4ZCwgMHgyNDYzMDAwMSwgMHg4ZjgyMDA1NCwKLTB4NjIxMDIzLCAweDJjNDIwMDAyLCAweDE0NDBmZmZjLCAweDAsCi0weDNlMDAwMDgsIDB4MCwgMHgyN2JkZmZjOCwgMHhhZmIzMDAyNCwKLTB4ODA5ODIxLCAweGFmYjUwMDJjLCAweGEwYTgyMSwgMHhhZmIyMDAyMCwKLTB4YzA5MDIxLCAweDMyYTJmZmZmLCAweGFmYmYwMDMwLCAweGFmYjQwMDI4LAotMHhhZmIxMDAxYywgMHhhZmIwMDAxOCwgMHgxNDQwMDAzNCwgMHhhN2IyMDAxMCwKLTB4MzI3MWZmZmYsIDB4MjdiMjAwMTAsIDB4ODAyMSwgMHhjMDA0ZDRiLAotMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwKLTB4MCwgMHhjMDA0ZDRiLCAweDIwMjEsIDB4YzAwNGQ0YiwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyMDIxLCAweGMwMDRkNGIsCi0weDI0MDQwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLCAweDEwNDAwMDAyLAotMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MTA4MDQyLAotMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwgMHgyMzAxMDI0LAotMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsCi0weDEwODA0MiwgMHgxNjAwZmZmYSwgMHgyMzAxMDI0LCAweGMwMDRkNGIsCi0weDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgMHgzNDEwODAwMCwKLTB4OTY0MjAwMDAsIDB4NTAxMDI0LCAweDEwNDAwMDAyLCAweDIwMjEsCi0weDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MTA4MDQyLCAweDEyMDAwMDc1LAotMHgwLCAweDgwMDRkYzksIDB4MCwgMHgzMjc0ZmZmZiwKLTB4MjdiMTAwMTAsIDB4YTdhMDAwMTAsIDB4ODAyMSwgMHhjMDA0ZDRiLAotMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwKLTB4MCwgMHhjMDA0ZDRiLCAweDIwMjEsIDB4YzAwNGQ0YiwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLAotMHgyMDIxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLCAweDEwNDAwMDAyLAotMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MTA4MDQyLAotMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwgMHgyOTAxMDI0LAotMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsCi0weDEwODA0MiwgMHgxNjAwZmZmYSwgMHgyOTAxMDI0LCAweGMwMDRkNzEsCi0weDM0MTA4MDAwLCAweGMwMDRkNzEsIDB4MCwgMHhjMDA0ZDJiLAotMHgwLCAweDUwNDAwMDA1LCAweDEwODA0MiwgMHg5NjIyMDAwMCwKLTB4NTAxMDI1LCAweGE2MjIwMDAwLCAweDEwODA0MiwgMHgxNjAwZmZmNywKLTB4MCwgMHhjMDA0ZDcxLCAweDAsIDB4MzJhNWZmZmYsCi0weDI0MDIwMDAxLCAweDU0YTIwMDA0LCAweDI0MDIwMDAyLCAweDk3YTIwMDEwLAotMHg4MDA0ZTE0LCAweDUyMTAyNSwgMHgxNGEyMDAwNiwgMHgzMjcxZmZmZiwKLTB4OTdhMjAwMTAsIDB4MTIxODI3LCAweDQzMTAyNCwgMHhhN2EyMDAxMCwKLTB4MzI3MWZmZmYsIDB4MjdiMjAwMTAsIDB4ODAyMSwgMHhjMDA0ZDRiLAotMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwKLTB4MCwgMHhjMDA0ZDRiLCAweDIwMjEsIDB4YzAwNGQ0YiwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyMDIxLCAweGMwMDRkNGIsCi0weDI0MDQwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLCAweDEwNDAwMDAyLAotMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MTA4MDQyLAotMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwgMHgyMzAxMDI0LAotMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsCi0weDEwODA0MiwgMHgxNjAwZmZmYSwgMHgyMzAxMDI0LCAweGMwMDRkNGIsCi0weDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgMHgzNDEwODAwMCwKLTB4OTY0MjAwMDAsIDB4NTAxMDI0LCAweDEwNDAwMDAyLCAweDIwMjEsCi0weDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MTA4MDQyLCAweDE2MDBmZmY4LAotMHgwLCAweGMwMDRkNzEsIDB4MCwgMHg4ZmJmMDAzMCwKLTB4OGZiNTAwMmMsIDB4OGZiNDAwMjgsIDB4OGZiMzAwMjQsIDB4OGZiMjAwMjAsCi0weDhmYjEwMDFjLCAweDhmYjAwMDE4LCAweDNlMDAwMDgsIDB4MjdiZDAwMzgsCi0weDAsIDB4MCwgMHgwLCAweDI3YmRmZmU4LAotMHhhZmJmMDAxMCwgMHgzYzAzMDAwMSwgMHg3NzE4MjEsIDB4OGM2MzgzYWMsCi0weDI0MDIwMDA4LCAweDE0NjIwMjJjLCAweDgwMzAyMSwgMHgzYzAyMDAwMSwKLTB4OGM0MjVkOTgsIDB4MTQ0MDAwMzMsIDB4MCwgMHg4Zjg1MDIyNCwKLTB4MzhhMzAwMjAsIDB4MmM2MzAwMDEsIDB4MzhhMjAwMTAsIDB4MmM0MjAwMDEsCi0weDYyMTgyNSwgMHgxNDYwMDAwZCwgMHgzOGEzMDAzMCwgMHgyYzYzMDAwMSwKLTB4MzhhMjA0MDAsIDB4MmM0MjAwMDEsIDB4NjIxODI1LCAweDE0NjAwMDA3LAotMHgzOGEzMDQwMiwgMHgyYzYzMDAwMSwgMHgzOGEyMDQwNCwgMHgyYzQyMDAwMSwKLTB4NjIxODI1LCAweDEwNjAwMDA1LCAweDAsIDB4YzAwNDI5YiwKLTB4MCwgMHg4MDA0ZThkLCAweDI0MDIwMDBlLCAweGMwMDQzZGQsCi0weDAsIDB4M2MwNTAwMDEsIDB4OGNhNTVjYzgsIDB4YzAwNTJhMiwKLTB4MjAyMSwgMHgzYzAzMDAwMSwgMHg4YzYzNWNjOCwgMHgyNDAyMDAwNCwKLTB4MTQ2MjAwMDUsIDB4MjQwM2ZmZmIsIDB4M2MwMjAwMDEsIDB4OGM0MjVjYzQsCi0weDgwMDRlODksIDB4MjQwM2ZmZjcsIDB4M2MwMjAwMDEsIDB4OGM0MjVjYzQsCi0weDQzMTAyNCwgMHgzYzAxMDAwMSwgMHhhYzIyNWNjNCwgMHgyNDAyMDAwZSwKLTB4M2MwMTAwMDEsIDB4YzAwNDI5YiwgMHhhYzIyN2RkMCwgMHg4MDA1MDg3LAotMHgwLCAweDhmODIwMjIwLCAweDNjMDMwNDAwLCAweDQzMTAyNCwKLTB4MTA0MDAwMjcsIDB4MjQwM2ZmYmYsIDB4OGY4NTAyMjQsIDB4M2MwMjAwMDEsCi0weDhjNDI3ZGRjLCAweGEzMjAyNCwgMHg0MzEwMjQsIDB4MTQ4MjAwMGMsCi0weDAsIDB4M2MwMjAwMDEsIDB4OGM0MjdkZTAsIDB4MjQ0MjAwMDEsCi0weDNjMDEwMDAxLCAweGFjMjI3ZGUwLCAweDJjNDIwMDAyLCAweDE0NDAwMDA4LAotMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHg4MDA0ZWFkLCAweGFjMjI3ZTAwLAotMHgzYzAxMDAwMSwgMHhhYzIwN2RlMCwgMHgzYzAxMDAwMSwgMHhhYzIwN2UwMCwKLTB4M2MwMjAwMDEsIDB4OGM0MjdlMDAsIDB4MTA0MDAwMDYsIDB4MzBhMjAwNDAsCi0weDEwNDAwMDA0LCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweDgwMDRlYjgsCi0weGFjMjI3ZTA0LCAweDNjMDEwMDAxLCAweGFjMjA3ZTA0LCAweDNjMDEwMDAxLAotMHhhYzI1N2RkYywgMHgzYzAxMDAwMSwgMHg4MDA0ZWM4LCAweGFjMjA3ZTEwLAotMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzIyN2UxMCwgMHgzYzAxMDAwMSwKLTB4YWMyMDdlMDAsIDB4M2MwMTAwMDEsIDB4YWMyMDdkZTAsIDB4M2MwMTAwMDEsCi0weGFjMjA3ZTA0LCAweDNjMDEwMDAxLCAweGFjMjA3ZGRjLCAweDNjMDMwMDAxLAotMHg4YzYzN2RkMCwgMHgzYzAyMDAwMSwgMHg4YzQyN2RkNCwgMHgxMDYyMDAwMywKLTB4M2MwMjAyMDAsIDB4M2MwMTAwMDEsIDB4YWMyMzdkZDQsIDB4YzIxMDI0LAotMHgxMDQwMDAwNywgMHgyNDYzZmZmZiwgMHg4ZjgyMDIyMCwgMHgyNDAzMDAwMSwKLTB4M2MwMTAwMDEsIDB4YWMyMzVjY2MsIDB4ODAwNTA4NSwgMHgzYzAzZjcwMCwKLTB4MmM2MjAwMGUsIDB4MTA0MDAxYTgsIDB4MzEwODAsIDB4M2MwMTAwMDEsCi0weDIyMDgyMSwgMHg4YzIyNWI4MCwgMHg0MDAwMDgsIDB4MCwKLTB4M2MwMTAwMDEsIDB4YWMyMDdlMDAsIDB4M2MwMTAwMDEsIDB4YWMyMDdkZTAsCi0weDNjMDEwMDAxLCAweGFjMjA3ZGRjLCAweDNjMDEwMDAxLCAweGFjMjA3ZTA0LAotMHgzYzAxMDAwMSwgMHhhYzIwN2RmOCwgMHgzYzAxMDAwMSwgMHhhYzIwN2RmMCwKLTB4YzAwNDg2YSwgMHhhZjgwMDIyNCwgMHgyNDAyMDAwMiwgMHgzYzAxMDAwMSwKLTB4YWMyMjdkZDAsIDB4M2MwMjAwMDEsIDB4OGM0MjdlMTAsIDB4MTQ0MDAwNTYsCi0weDNjMDNmZGZmLCAweDhlZTIwMDAwLCAweDM0NjNmZmZmLCAweDQzMTAyNCwKLTB4YzAwNDI5YiwgMHhhZWUyMDAwMCwgMHhhZjgwMDIwNCwgMHg4ZjgyMDIwMCwKLTB4MjQwM2ZmZmQsIDB4NDMxMDI0LCAweGFmODIwMjAwLCAweDNjMDEwMDAxLAotMHhhYzIwN2UyMCwgMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMSwgMHg4YzQyN2RmOCwKLTB4MjQwNDAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyNDdlMGMsIDB4MjQ0MjAwMDEsCi0weDNjMDEwMDAxLCAweGFjMjI3ZGY4LCAweDJjNDIwMDA0LCAweDNjMDEwMDAxLAotMHhhYzIzN2RmNCwgMHgxNDQwMDAwNiwgMHgyNDAyMDAwMywgMHgzYzAxMDAwMSwKLTB4YWMyNDVjY2MsIDB4M2MwMTAwMDEsIDB4ODAwNTA4MywgMHhhYzIwN2RmOCwKLTB4M2MwMTAwMDEsIDB4ODAwNTA4MywgMHhhYzIyN2RkMCwgMHg4ZjgzMDA1NCwKLTB4M2MwMjAwMDEsIDB4OGM0MjdkZjQsIDB4MjQ2M2Q4ZjAsIDB4NDMxMDIzLAotMHgyYzQyMjcxMCwgMHgxNDQwMDAwMywgMHgyNDAyMDAwNCwgMHgzYzAxMDAwMSwKLTB4YWMyMjdkZDAsIDB4M2MwMjAwMDEsIDB4OGM0MjdlMTAsIDB4MTQ0MDAwMjYsCi0weDNjMDNmZGZmLCAweDhlZTIwMDAwLCAweDM0NjNmZmZmLCAweDQzMTAyNCwKLTB4ODAwNTA4MywgMHhhZWUyMDAwMCwgMHgzYzA0MDAwMSwgMHg4Yzg0NWQ5YywKLTB4M2MwMTAwMDEsIDB4YzAwNTA4YSwgMHhhYzIwN2RlOCwgMHgzYzAyMDAwMSwKLTB4OGM0MjdlMWMsIDB4YWY4MjAyMDQsIDB4M2MwMjAwMDEsIDB4OGM0MjdlMTAsCi0weDE0NDAwMDE1LCAweDNjMDNmZGZmLCAweDhlZTIwMDAwLCAweDM0NjNmZmZmLAotMHg0MzEwMjQsIDB4YWVlMjAwMDAsIDB4OGY4MjAyMDQsIDB4MzA0MjAwMzAsCi0weDE0NDAwMTNjLCAweDI0MDIwMDAyLCAweDNjMDMwMDAxLCAweDhjNjM3ZTFjLAotMHgyNDAyMDAwNSwgMHgzYzAxMDAwMSwgMHhhYzIyN2RkMCwgMHgzYzAxMDAwMSwKLTB4ODAwNTA4MywgMHhhYzIzN2UyMCwgMHgzYzAyMDAwMSwgMHg4YzQyN2UxMCwKLTB4MTA0MDAwMTAsIDB4M2MwM2ZkZmYsIDB4M2MwMjAwMDEsIDB4OGM0MjVkNmMsCi0weDI0NDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjI1ZDZjLCAweDJjNDIwMDAyLAotMHgxNDQwMDEzMSwgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzIyNWQ3NCwKLTB4M2MwMTAwMDEsIDB4YWMyMDVkNmMsIDB4M2MwMTAwMDEsIDB4ODAwNTA4MywKLTB4YWMyMjVjY2MsIDB4OGVlMjAwMDAsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LAotMHhhZWUyMDAwMCwgMHgzYzAyMDAwMSwgMHg4YzQyN2UwMCwgMHgxMDQwMDEyMiwKLTB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyN2RkYywgMHgxMDQwMDExZSwKLTB4MCwgMHgzYzAxMDAwMSwgMHhhYzIyN2UwOCwgMHgyNDAyMDAwMywKLTB4M2MwMTAwMDEsIDB4YWMyMjdkZTAsIDB4ODAwNTAyNCwgMHgyNDAyMDAwNiwKLTB4M2MwMTAwMDEsIDB4YWMyMDdkZTgsIDB4OGY4MjAyMDQsIDB4MzQ0MjAwNDAsCi0weGFmODIwMjA0LCAweDNjMDIwMDAxLCAweDhjNDI3ZTIwLCAweDI0MDMwMDA3LAotMHgzYzAxMDAwMSwgMHhhYzIzN2RkMCwgMHgzNDQyMDA0MCwgMHgzYzAxMDAwMSwKLTB4YWMyMjdlMjAsIDB4M2MwMjAwMDEsIDB4OGM0MjdlMDAsIDB4MTA0MDAwMDUsCi0weDAsIDB4M2MwMjAwMDEsIDB4OGM0MjdkZGMsIDB4MTA0MDAwZjksCi0weDI0MDIwMDAyLCAweDNjMDUwMDAxLCAweDI0YTU3ZGUwLCAweDhjYTIwMDAwLAotMHgyYzQyNGUyMSwgMHgxMDQwMDBmMywgMHgyNDAyMDAwMiwgMHgzYzAyMDAwMSwKLTB4OGM0MjdlMDQsIDB4MTA0MDAwZjgsIDB4MjQwNGZmYmYsIDB4M2MwMjAwMDEsCi0weDhjNDI3ZGRjLCAweDNjMDMwMDAxLCAweDhjNjM3ZTA4LCAweDQ0MTAyNCwKLTB4NjQxODI0LCAweDEwNDMwMDA0LCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLAotMHg4MDA1MDgzLCAweGFjMjI3ZGQwLCAweDI0MDIwMDAzLCAweGFjYTIwMDAwLAotMHgyNDAyMDAwOCwgMHgzYzAxMDAwMSwgMHhhYzIyN2RkMCwgMHgzYzAyMDAwMSwKLTB4OGM0MjdlMGMsIDB4MTA0MDAwMGMsIDB4MjQwMjAwMDEsIDB4M2MwNDAwMDEsCi0weGMwMDUwOTcsIDB4OGM4NDdkZGMsIDB4M2MwMjAwMDEsIDB4OGM0MjdlMjgsCi0weDE0NDAwMDA1LCAweDI0MDIwMDAxLCAweDNjMDIwMDAxLCAweDhjNDI3ZTI0LAotMHgxMDQwMDAwNiwgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzIyNWNjYywKLTB4M2MwMTAwMDEsIDB4ODAwNTA4MywgMHhhYzIwN2RmOCwgMHgzYzAyMDAwMSwKLTB4OGM0MjdkZjAsIDB4M2MwMzAwMDEsIDB4OGM2MzdkZGMsIDB4MmM0MjAwMDEsCi0weDIxMGMwLCAweDMwNjMwMDA4LCAweDNjMDEwMDAxLCAweGFjMjI3ZGYwLAotMHgzYzAxMDAwMSwgMHhhYzIzN2RlYywgMHg4ZjgzMDA1NCwgMHgyNDAyMDAwOSwKLTB4M2MwMTAwMDEsIDB4YWMyMjdkZDAsIDB4M2MwMTAwMDEsIDB4ODAwNTA4MywKLTB4YWMyMzdkZjQsIDB4OGY4MzAwNTQsIDB4M2MwMjAwMDEsIDB4OGM0MjdkZjQsCi0weDI0NjNkOGYwLCAweDQzMTAyMywgMHgyYzQyMjcxMCwgMHgxNDQwMDBhOCwKLTB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyN2UwMCwgMHgxMDQwMDAwNSwKLTB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyN2RkYywgMHgxMDQwMDBhOSwKLTB4MjQwMjAwMDIsIDB4M2MwMzAwMDEsIDB4MjQ2MzdkZTAsIDB4OGM2MjAwMDAsCi0weDJjNDI0ZTIxLCAweDEwNDAwMGEzLCAweDI0MDIwMDAyLCAweDNjMDIwMDAxLAotMHg4YzQyN2UwYywgMHgxMDQwMDAwZSwgMHgwLCAweDNjMDIwMDAxLAotMHg4YzQyN2RkYywgMHgzYzAxMDAwMSwgMHhhYzIwN2UwYywgMHgzMDQyMDA4MCwKLTB4MTA0MDAwMmYsIDB4MjQwMjAwMGMsIDB4OGY4MjAyMDQsIDB4MzA0MjAwODAsCi0weDE0NDAwMDBjLCAweDI0MDIwMDAzLCAweDgwMDUwMTEsIDB4MjQwMjAwMGMsCi0weDNjMDIwMDAxLCAweDhjNDI3ZGRjLCAweDMwNDIwMDgwLCAweDE0NDAwMDA1LAotMHgyNDAyMDAwMywgMHg4ZjgyMDIwNCwgMHgzMDQyMDA4MCwgMHgxMDQwMDAxZiwKLTB4MjQwMjAwMDMsIDB4YWM2MjAwMDAsIDB4MjQwMjAwMGEsIDB4M2MwMTAwMDEsCi0weGFjMjI3ZGQwLCAweDNjMDQwMDAxLCAweDI0ODQ3ZTE4LCAweDhjODIwMDAwLAotMHgzYzAzMDAwMSwgMHg4YzYzN2RmMCwgMHg0MzEwMjUsIDB4YWY4MjAyMDQsCi0weDhjODMwMDAwLCAweDNjMDQwMDAxLCAweDhjODQ3ZGYwLCAweDI0MDIwMDBiLAotMHgzYzAxMDAwMSwgMHhhYzIyN2RkMCwgMHg2NDE4MjUsIDB4M2MwMTAwMDEsCi0weGFjMjM3ZTIwLCAweDNjMDUwMDAxLCAweDI0YTU3ZGUwLCAweDhjYTIwMDAwLAotMHgyYzQyNGUyMSwgMHgxMDQwMDA2ZiwgMHgyNDAyMDAwMiwgMHgzYzAyMDAwMSwKLTB4OGM0MjdlMTAsIDB4MTA0MDAwMDUsIDB4MCwgMHgyNDAyMDAwYywKLTB4M2MwMTAwMDEsIDB4ODAwNTA4MywgMHhhYzIyN2RkMCwgMHgzYzAyMDAwMSwKLTB4OGM0MjdlMDAsIDB4MTA0MDAwNmMsIDB4MCwgMHgzYzA0MDAwMSwKLTB4OGM4NDdkZGMsIDB4MTA4MDAwNWUsIDB4MzA4MjAwMDgsIDB4M2MwMzAwMDEsCi0weDhjNjM3ZGVjLCAweDEwNjIwMDY0LCAweDI0MDIwMDAzLCAweDNjMDEwMDAxLAotMHhhYzI0N2UwOCwgMHhhY2EyMDAwMCwgMHgyNDAyMDAwNiwgMHgzYzAxMDAwMSwKLTB4ODAwNTA4MywgMHhhYzIyN2RkMCwgMHg4ZjgyMDIwMCwgMHgzNDQyMDAwMiwKLTB4YWY4MjAyMDAsIDB4OGY4MzAwNTQsIDB4MjQwMjAwMGQsIDB4M2MwMTAwMDEsCi0weGFjMjI3ZGQwLCAweDNjMDEwMDAxLCAweGFjMjM3ZGY0LCAweDhmODMwMDU0LAotMHgzYzAyMDAwMSwgMHg4YzQyN2RmNCwgMHgyNDYzZDhmMCwgMHg0MzEwMjMsCi0weDJjNDIyNzEwLCAweDE0NDAwMDNhLCAweDAsIDB4M2MwMjAwMDEsCi0weDhjNDI3ZTEwLCAweDEwNDAwMDI5LCAweDI0MDIwMDBlLCAweDNjMDMwMDAxLAotMHg4YzYzN2UyNCwgMHgzYzAxMDAwMSwgMHgxNDYwMDAxNSwgMHhhYzIyN2RkMCwKLTB4YzAwNDNkZCwgMHgwLCAweDNjMDUwMDAxLCAweDhjYTU1Y2M4LAotMHhjMDA1MmEyLCAweDIwMjEsIDB4M2MwMzAwMDEsIDB4OGM2MzVjYzgsCi0weDI0MDIwMDA0LCAweDE0NjIwMDA1LCAweDI0MDNmZmZiLCAweDNjMDIwMDAxLAotMHg4YzQyNWNjNCwgMHg4MDA1MDUyLCAweDI0MDNmZmY3LCAweDNjMDIwMDAxLAotMHg4YzQyNWNjNCwgMHg0MzEwMjQsIDB4M2MwMTAwMDEsIDB4YWMyMjVjYzQsCi0weDhlZTIwMDAwLCAweDNjMDMwMjAwLCAweDQzMTAyNSwgMHhhZWUyMDAwMCwKLTB4OGY4MjAyMjQsIDB4M2MwMTAwMDEsIDB4YWMyMjdlMmMsIDB4OGY4MjAyMjAsCi0weDI0MDNmZmZiLCAweDQzMTAyNCwgMHhhZjgyMDIyMCwgMHg4ZjgyMDIyMCwKLTB4MzQ0MjAwMDIsIDB4ODAwNTA4MywgMHhhZjgyMDIyMCwgMHgzYzAyMDAwMSwKLTB4OGM0MjdlMDAsIDB4MTA0MDAwMDUsIDB4MCwgMHgzYzAyMDAwMSwKLTB4OGM0MjdkZGMsIDB4MTA0MDAwMGYsIDB4MjQwMjAwMDIsIDB4M2MwMjAwMDEsCi0weDhjNDI3ZGUwLCAweDJjNDI0ZTIxLCAweDEwNDAwMDBhLCAweDI0MDIwMDAyLAotMHgzYzAyMDAwMSwgMHg4YzQyN2UwMCwgMHgxMDQwMDAwZiwgMHgwLAotMHgzYzAyMDAwMSwgMHg4YzQyN2RkYywgMHgxNDQwMDAwYiwgMHgwLAotMHgyNDAyMDAwMiwgMHgzYzAxMDAwMSwgMHg4MDA1MDgzLCAweGFjMjI3ZGQwLAotMHgzYzAyMDAwMSwgMHg4YzQyN2UwMCwgMHgxMDQwMDAwMywgMHgwLAotMHhjMDA0MjliLCAweDAsIDB4OGY4MjAyMjAsIDB4M2MwM2Y3MDAsCi0weDQzMTAyNSwgMHhhZjgyMDIyMCwgMHg4ZmJmMDAxMCwgMHgzZTAwMDA4LAotMHgyN2JkMDAxOCwgMHgzYzAzMDAwMSwgMHgyNDYzN2UyOCwgMHg4YzYyMDAwMCwKLTB4MTA0MDAwMDUsIDB4MzQ0MjIwMDAsIDB4M2MwMTAwMDEsIDB4YWMyMjdlMWMsCi0weDgwMDUwOTUsIDB4YWM2MDAwMDAsIDB4M2MwMTAwMDEsIDB4YWMyNDdlMWMsCi0weDNlMDAwMDgsIDB4MCwgMHgyN2JkZmZlMCwgMHgzMDgyMDAzMCwKLTB4YWZiZjAwMTgsIDB4M2MwMTAwMDEsIDB4YWMyMjdlMjQsIDB4MTQ0MDAwNjcsCi0weDNjMDJmZmZmLCAweDM0NDIxZjBlLCAweDgyMTAyNCwgMHgxNDQwMDA2MSwKLTB4MjQwMjAwMzAsIDB4MzA4MjIwMDAsIDB4MTA0MDAwNWQsIDB4MzA4MzgwMDAsCi0weDMxYTAyLCAweDMwODIwMDAxLCAweDIxMjAwLCAweDNjMDQwMDAxLAotMHg4Yzg0NWQ5YywgMHg2MjE4MjUsIDB4MzMxYzIsIDB4M2MwMzAwMDEsCi0weDI0NjM1ZDc4LCAweDMwODI4MDAwLCAweDIxMjAyLCAweDMwODQwMDAxLAotMHg0MjIwMCwgMHg0NDEwMjUsIDB4MjM5YzIsIDB4NjEwODAsCi0weDQzMTAyMSwgMHg0NzEwMjEsIDB4OTA0MzAwMDAsIDB4MjQwMjAwMDEsCi0weDEwNjIwMDI1LCAweDAsIDB4MTA2MDAwMDcsIDB4MjQwMjAwMDIsCi0weDEwNjIwMDEzLCAweDI0MDIwMDAzLCAweDEwNjIwMDJjLCAweDNjMDUwMDBmLAotMHg4MDA1MGY5LCAweDAsIDB4OGY4MjAyMDAsIDB4MjQwM2ZlZmYsCi0weDQzMTAyNCwgMHhhZjgyMDIwMCwgMHg4ZjgyMDIyMCwgMHgzYzAzZmZmZSwKLTB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAweGFmODIwMjIwLCAweDNjMDEwMDAxLAotMHhhYzIwN2U0NCwgMHgzYzAxMDAwMSwgMHg4MDA1MTA0LCAweGFjMjA3ZTRjLAotMHg4ZjgyMDIwMCwgMHgzNDQyMDEwMCwgMHhhZjgyMDIwMCwgMHg4ZjgyMDIyMCwKLTB4M2MwM2ZmZmUsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAweGFmODIwMjIwLAotMHgyNDAyMDEwMCwgMHgzYzAxMDAwMSwgMHhhYzIyN2U0NCwgMHgzYzAxMDAwMSwKLTB4ODAwNTEwNCwgMHhhYzIwN2U0YywgMHg4ZjgyMDIwMCwgMHgyNDAzZmVmZiwKLTB4NDMxMDI0LCAweGFmODIwMjAwLCAweDhmODIwMjIwLCAweDNjMDMwMDAxLAotMHg0MzEwMjUsIDB4YWY4MjAyMjAsIDB4M2MwMTAwMDEsIDB4YWMyMDdlNDQsCi0weDNjMDEwMDAxLCAweDgwMDUxMDQsIDB4YWMyMzdlNGMsIDB4OGY4MjAyMDAsCi0weDM0NDIwMTAwLCAweGFmODIwMjAwLCAweDhmODIwMjIwLCAweDNjMDMwMDAxLAotMHg0MzEwMjUsIDB4YWY4MjAyMjAsIDB4MjQwMjAxMDAsIDB4M2MwMTAwMDEsCi0weGFjMjI3ZTQ0LCAweDNjMDEwMDAxLCAweDgwMDUxMDQsIDB4YWMyMzdlNGMsCi0weDM0YTVmZmZmLCAweDNjMDQwMDAxLCAweDI0ODQ1YmI4LCAweGFmYTMwMDEwLAotMHhjMDAyNDAzLCAweGFmYTAwMDE0LCAweDgwMDUxMDQsIDB4MCwKLTB4MjQwMjAwMzAsIDB4M2MwMTAwMDEsIDB4YWMyMjdlMjgsIDB4OGZiZjAwMTgsCi0weDNlMDAwMDgsIDB4MjdiZDAwMjAsIDB4MCwgMHgyN2JkZmZjOCwKLTB4YWZiMjAwMjgsIDB4ODA5MDIxLCAweGFmYjMwMDJjLCAweGEwOTgyMSwKLTB4YWZiMDAwMjAsIDB4YzA4MDIxLCAweDNjMDQwMDAxLCAweDI0ODQ1YmQwLAotMHgzYzA1MDAwOSwgMHgzYzAyMDAwMSwgMHg4YzQyNWNjOCwgMHgzNGE1OTAwMSwKLTB4MjQwMzAyMSwgMHgyNjAzODIxLCAweGFmYmYwMDMwLCAweGFmYjEwMDI0LAotMHhhN2EwMDAxYSwgMHhhZmIwMDAxNCwgMHhjMDAyNDAzLCAweGFmYTIwMDEwLAotMHgyNDAyMDAwMiwgMHgxMjYyMDA4MywgMHgyZTYyMDAwMywgMHgxMDQwMDAwNSwKLTB4MjQwMjAwMDEsIDB4MTI2MjAwMGEsIDB4MCwgMHg4MDA1MjliLAotMHgwLCAweDI0MDIwMDA0LCAweDEyNjIwMGZhLCAweDI0MDIwMDA4LAotMHgxMjYyMDBmOSwgMHgzYzAyZmZlYywgMHg4MDA1MjliLCAweDAsCi0weDNjMDIwMDAxLCAweDhjNDI1Y2M0LCAweDMwNDIwMDAyLCAweDE0NDAwMDA0LAotMHgxMjg5NDAsIDB4M2MwMmZmZmIsIDB4MzQ0MmZmZmYsIDB4MjAyODAyNCwKLTB4M2MwMTAwMDEsIDB4MzEwODIxLCAweGFjMzA3ZTNjLCAweDNjMDI0MDAwLAotMHgyMDIxMDI0LCAweDEwNDAwMDRlLCAweDEwMjNjMiwgMHgzMDg0MDAzMCwKLTB4MTAxMzgyLCAweDMwNDIwMDFjLCAweDNjMDMwMDAxLCAweDI0NjM1ZDA4LAotMHg0MzEwMjEsIDB4ODIzODIxLCAweDNjMDIwMDIwLCAweDIwMjEwMjQsCi0weDEwNDAwMDA2LCAweDI0MDIwMTAwLCAweDNjMDEwMDAxLCAweDMxMDgyMSwKLTB4YWMyMjdlNDAsIDB4ODAwNTE1MCwgMHgzYzAyMDA4MCwgMHgzYzAxMDAwMSwKLTB4MzEwODIxLCAweGFjMjA3ZTQwLCAweDNjMDIwMDgwLCAweDIwMjEwMjQsCi0weDEwNDAwMDA2LCAweDEyMTk0MCwgMHgzYzAyMDAwMSwgMHgzYzAxMDAwMSwKLTB4MjMwODIxLCAweDgwMDUxNWMsIDB4YWMyMjdlNDgsIDB4MTIxMTQwLAotMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4YWMyMDdlNDgsIDB4OTRlNDAwMDAsCi0weDNjMDMwMDAxLCAweDhjNjM1ZGJjLCAweDI0MDIwMDA1LCAweDEwNjIwMDEwLAotMHhhN2E0MDAxOCwgMHgzMjAyNDAwMCwgMHgxMDQwMDAwMiwgMHgzNDgyNDAwMCwKLTB4YTdhMjAwMTgsIDB4MjQwNDAwMDEsIDB4OTRlMjAwMDIsIDB4MjQwNTAwMDQsCi0weDI0ZTYwMDAyLCAweDM0NDIwMDAxLCAweGMwMDQ5OGUsIDB4YTRlMjAwMDIsCi0weDI0MDQwMDAxLCAweDI4MjEsIDB4YzAwNDk4ZSwgMHgyN2E2MDAxOCwKLTB4M2MwMjAwMDEsIDB4OGM0MjVjYzgsIDB4MjQxMTAwMDEsIDB4M2MwMTAwMDEsCi0weGFjMzE1Y2Q0LCAweDE0NTMwMDA0LCAweDMyMDI4MDAwLCAweGMwMDQyOWIsCi0weDAsIDB4MzIwMjgwMDAsIDB4MTA0MDAxMWYsIDB4MCwKLTB4YzAwNDI5YiwgMHgwLCAweDNjMDMwMDAxLCAweDhjNjM1ZGJjLAotMHgyNDAyMDAwNSwgMHgxMDYyMDExOCwgMHgyNDAyMDAwMiwgMHgzYzAxMDAwMSwKLTB4YWMzMTVjY2MsIDB4M2MwMTAwMDEsIDB4ODAwNTI5YiwgMHhhYzIyNWNjOCwKLTB4MjQwNDAwMDEsIDB4MjQwNTAwMDQsIDB4MjdiMDAwMWEsIDB4YzAwNDk4ZSwKLTB4MjAwMzAyMSwgMHgyNDA0MDAwMSwgMHgyODIxLCAweGMwMDQ5OGUsCi0weDIwMDMwMjEsIDB4M2MwMjAwMDEsIDB4NTExMDIxLCAweDhjNDI3ZTM0LAotMHgzYzA0MDAwMSwgMHg4Yzg0NWNjOCwgMHgzYzAzYmZmZiwgMHgzNDYzZmZmZiwKLTB4M2MwMTAwMDEsIDB4YWMzMzVjZDQsIDB4NDMxMDI0LCAweDNjMDEwMDAxLAotMHgzMTA4MjEsIDB4MTA5MzAwZmEsIDB4YWMyMjdlMzQsIDB4ODAwNTI5YiwKLTB4MCwgMHgzYzAyMjAwMCwgMHgyMDIxMDI0LCAweDEwNDAwMDA1LAotMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzIyNWQ5OCwgMHg4MDA1MWFkLAotMHgxMjg5NDAsIDB4M2MwMTAwMDEsIDB4YWMyMDVkOTgsIDB4MTI4OTQwLAotMHgzYzAxMDAwMSwgMHgzMTA4MjEsIDB4YWMzMDdlMzgsIDB4M2MwMjQwMDAsCi0weDIwMjEwMjQsIDB4MTQ0MDAwMTYsIDB4MCwgMHgzYzAyMDAwMSwKLTB4OGM0MjVkOTgsIDB4MTA0MDAwMDgsIDB4MjQwNDAwMDQsIDB4MjQwNTAwMDEsCi0weGMwMDRkOTMsIDB4MjQwNjIwMDAsIDB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsCi0weDM3MDgyMSwgMHhhYzIyODNhYywgMHgzYzAyMDAwMSwgMHg1MTEwMjEsCi0weDhjNDI3ZTMwLCAweDNjMDNiZmZmLCAweDM0NjNmZmZmLCAweDQzMTAyNCwKLTB4M2MwMTAwMDEsIDB4MzEwODIxLCAweDgwMDUyOTksIDB4YWMyMjdlMzAsCi0weDNjMDIwMDAxLCAweDhjNDI1ZDk4LCAweDEwNDAwMDI4LCAweDNjMDMwMGEwLAotMHgyMDMxMDI0LCAweDU0NDMwMDBkLCAweDNjMDIwMDIwLCAweDNjMDIwMDAxLAotMHg4YzQyNWQ5YywgMHgyNDAzMDEwMCwgMHgzYzAxMDAwMSwgMHgzMTA4MjEsCi0weGFjMjM3ZTQ0LCAweDNjMDMwMDAxLCAweDNjMDEwMDAxLCAweDMxMDgyMSwKLTB4YWMyMzdlNGMsIDB4ODAwNTFmMCwgMHgzNDQyMDQwMCwgMHgyMDIxMDI0LAotMHgxMDQwMDAwOCwgMHgyNDAzMDEwMCwgMHgzYzAyMDAwMSwgMHg4YzQyNWQ5YywKLTB4M2MwMTAwMDEsIDB4MzEwODIxLCAweGFjMjM3ZTQ0LCAweDgwMDUxZjAsCi0weDM0NDIwODAwLCAweDNjMDIwMDgwLCAweDIwMjEwMjQsIDB4MTA0MDAwMmUsCi0weDNjMDMwMDAxLCAweDNjMDIwMDAxLCAweDhjNDI1ZDljLCAweDNjMDEwMDAxLAotMHgzMTA4MjEsIDB4YWMyMzdlNGMsIDB4MzQ0MjBjMDAsIDB4M2MwMTAwMDEsCi0weGFjMjI1ZDljLCAweDgwMDUyMTgsIDB4MjQwNDAwMDEsIDB4M2MwMjAwMjAsCi0weDIwMjEwMjQsIDB4MTA0MDAwMDYsIDB4MjQwMjAxMDAsIDB4M2MwMTAwMDEsCi0weDMxMDgyMSwgMHhhYzIyN2U0NCwgMHg4MDA1MjAxLCAweDNjMDIwMDgwLAotMHgzYzAxMDAwMSwgMHgzMTA4MjEsIDB4YWMyMDdlNDQsIDB4M2MwMjAwODAsCi0weDIwMjEwMjQsIDB4MTA0MDAwMDcsIDB4MTIxOTQwLCAweDNjMDIwMDAxLAotMHgzYzAxMDAwMSwgMHgyMzA4MjEsIDB4YWMyMjdlNGMsIDB4ODAwNTIwZiwKLTB4MjQwNDAwMDEsIDB4MTIxMTQwLCAweDNjMDEwMDAxLCAweDIyMDgyMSwKLTB4YWMyMDdlNGMsIDB4MjQwNDAwMDEsIDB4MjgyMSwgMHgyN2IwMDAxZSwKLTB4YzAwNDk0YywgMHgyMDAzMDIxLCAweDI0MDQwMDAxLCAweDI4MjEsCi0weGMwMDQ5NGMsIDB4MjAwMzAyMSwgMHgyNDA0MDAwMSwgMHgyNDA1MDAwMSwKLTB4MjdiMDAwMWMsIDB4YzAwNDk0YywgMHgyMDAzMDIxLCAweDI0MDQwMDAxLAotMHgyNDA1MDAwMSwgMHhjMDA0OTRjLCAweDIwMDMwMjEsIDB4ODAwNTI5OSwKLTB4MCwgMHgzYzAyZmZlYywgMHgzNDQyZmZmZiwgMHgyMDI4MDI0LAotMHgzYzAyMDAwOCwgMHgyMDI4MDI1LCAweDEyMTE0MCwgMHgzYzAxMDAwMSwKLTB4MjIwODIxLCAweGFjMzA3ZTM4LCAweDNjMDIyMDAwLCAweDIwMjEwMjQsCi0weDEwNDAwMDA5LCAweDAsIDB4M2MwMjAwMDEsIDB4OGM0MjVkNzQsCi0weDE0NDAwMDA1LCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjI1ZDk4LAotMHg4MDA1MjNhLCAweDNjMDI0MDAwLCAweDNjMDEwMDAxLCAweGFjMjA1ZDk4LAotMHgzYzAyNDAwMCwgMHgyMDIxMDI0LCAweDE0NDAwMDFlLCAweDAsCi0weDNjMDIwMDAxLCAweDhjNDI1ZDk4LCAweDNjMDEwMDAxLCAweGFjMjA1Y2UwLAotMHgxMDQwMDAwNywgMHgyNDAyMjAyMCwgMHgzYzAxMDAwMSwgMHhhYzIyNWQ5YywKLTB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjI4M2FjLAotMHgzYzA0YmZmZiwgMHgxMjE5NDAsIDB4M2MwMjAwMDEsIDB4NDMxMDIxLAotMHg4YzQyN2UzMCwgMHgzYzA1MDAwMSwgMHg4Y2E1NWNjOCwgMHgzNDg0ZmZmZiwKLTB4NDQxMDI0LCAweDNjMDEwMDAxLCAweDIzMDgyMSwgMHhhYzIyN2UzMCwKLTB4MjQwMjAwMDEsIDB4MTBhMjAwNDQsIDB4MCwgMHg4MDA1Mjk5LAotMHgwLCAweDNjMDIwMDAxLCAweDhjNDI1ZDk4LCAweDEwNDAwMDFjLAotMHgyNDAyMjAwMCwgMHgzYzAxMDAwMSwgMHhhYzIyNWQ5YywgMHgzYzAzMDBhMCwKLTB4MjAzMTAyNCwgMHgxNDQzMDAwNSwgMHgxMjExNDAsIDB4MzQwMmEwMDAsCi0weDNjMDEwMDAxLCAweDgwMDUyOTQsIDB4YWMyMjVkOWMsIDB4M2MwMzAwMDEsCi0weDYyMTgyMSwgMHg4YzYzN2UzOCwgMHgzYzAyMDAyMCwgMHg2MjEwMjQsCi0weDEwNDAwMDA0LCAweDI0MDIyMDAxLCAweDNjMDEwMDAxLCAweDgwMDUyOTQsCi0weGFjMjI1ZDljLCAweDNjMDIwMDgwLCAweDYyMTAyNCwgMHgxMDQwMDAxZiwKLTB4MzQwMmEwMDEsIDB4M2MwMTAwMDEsIDB4ODAwNTI5NCwgMHhhYzIyNWQ5YywKLTB4M2MwMjAwMjAsIDB4MjAyMTAyNCwgMHgxMDQwMDAwNywgMHgxMjE5NDAsCi0weDI0MDIwMTAwLCAweDNjMDEwMDAxLCAweDIzMDgyMSwgMHhhYzIyN2U0NCwKLTB4ODAwNTI4OCwgMHgzYzAyMDA4MCwgMHgxMjExNDAsIDB4M2MwMTAwMDEsCi0weDIyMDgyMSwgMHhhYzIwN2U0NCwgMHgzYzAyMDA4MCwgMHgyMDIxMDI0LAotMHgxMDQwMDAwNiwgMHgxMjE5NDAsIDB4M2MwMjAwMDEsIDB4M2MwMTAwMDEsCi0weDIzMDgyMSwgMHg4MDA1Mjk0LCAweGFjMjI3ZTRjLCAweDEyMTE0MCwKLTB4M2MwMTAwMDEsIDB4MjIwODIxLCAweGFjMjA3ZTRjLCAweDNjMDMwMDAxLAotMHg4YzYzNWNjOCwgMHgyNDAyMDAwMSwgMHgxMDYyMDAwMywgMHgwLAotMHhjMDA0MjliLCAweDAsIDB4OGZiZjAwMzAsIDB4OGZiMzAwMmMsCi0weDhmYjIwMDI4LCAweDhmYjEwMDI0LCAweDhmYjAwMDIwLCAweDNlMDAwMDgsCi0weDI3YmQwMDM4LCAweDI3YmRmZmQ4LCAweGFmYjIwMDIwLCAweDgwOTAyMSwKLTB4YWZiMTAwMWMsIDB4ODgyMSwgMHgyNDAyMDAwMiwgMHhhZmJmMDAyNCwKLTB4YWZiMDAwMTgsIDB4YTdhMDAwMTIsIDB4MTBhMjAwZDMsIDB4YTdhMDAwMTAsCi0weDJjYTIwMDAzLCAweDEwNDAwMDA1LCAweDI0MDIwMDAxLCAweDEwYTIwMDBhLAotMHgxMjgxNDAsIDB4ODAwNTM4MCwgMHgyMjAxMDIxLCAweDI0MDIwMDA0LAotMHgxMGEyMDA3ZCwgMHgyNDAyMDAwOCwgMHgxMGEyMDA3YywgMHgxMjI5NDAsCi0weDgwMDUzODAsIDB4MjIwMTAyMSwgMHgzYzAzMDAwMSwgMHg3MDE4MjEsCi0weDhjNjM3ZTNjLCAweDNjMDI0MDAwLCAweDYyMTAyNCwgMHgxNDQwMDAwOSwKLTB4MjQwNDAwMDEsIDB4M2MwMjdmZmYsIDB4MzQ0MmZmZmYsIDB4NjI4ODI0LAotMHgzYzAxMDAwMSwgMHgzMDA4MjEsIDB4YWMzMTdlMzQsIDB4ODAwNTM4MCwKLTB4MjIwMTAyMSwgMHgyNDA1MDAwMSwgMHhjMDA0OTRjLCAweDI3YTYwMDEwLAotMHgyNDA0MDAwMSwgMHgyNDA1MDAwMSwgMHhjMDA0OTRjLCAweDI3YTYwMDEwLAotMHg5N2EyMDAxMCwgMHgzMDQyMDAwNCwgMHgxMDQwMDAzNCwgMHgzYzExNDAwMCwKLTB4M2MwMjAwMDEsIDB4OGM0MjVkYmMsIDB4MjQ0M2ZmZmYsIDB4MmM2MjAwMDYsCi0weDEwNDAwMDM0LCAweDMxMDgwLCAweDNjMDEwMDAxLCAweDIyMDgyMSwKLTB4OGMyMjViZTAsIDB4NDAwMDA4LCAweDAsIDB4MjQwNDAwMDEsCi0weDI0MDUwMDExLCAweDI3YjAwMDEyLCAweGMwMDQ5NGMsIDB4MjAwMzAyMSwKLTB4MjQwNDAwMDEsIDB4MjQwNTAwMTEsIDB4YzAwNDk0YywgMHgyMDAzMDIxLAotMHg5N2E1MDAxMiwgMHgzMGEyNDAwMCwgMHgxMDQwMDAwMiwgMHgzYzA0MDAxMCwKLTB4M2MwNDAwMDgsIDB4M2MwMzAwMDEsIDB4ODAwNTMwMSwgMHgzMGEyODAwMCwKLTB4MjQwNDAwMDEsIDB4MjQwNTAwMTQsIDB4MjdiMDAwMTIsIDB4YzAwNDk0YywKLTB4MjAwMzAyMSwgMHgyNDA0MDAwMSwgMHgyNDA1MDAxNCwgMHhjMDA0OTRjLAotMHgyMDAzMDIxLCAweDk3YTUwMDEyLCAweDMwYTIxMDAwLCAweDEwNDAwMDAyLAotMHgzYzA0MDAxMCwgMHgzYzA0MDAwOCwgMHgzYzAzMDAwMSwgMHgzMGEyMDgwMCwKLTB4NTQ0MDAwMDEsIDB4M2MwMzAwMDIsIDB4M2MwMjgwMDAsIDB4MjIyMTAyNSwKLTB4NjQxODI1LCAweDgwMDUzMGUsIDB4NDM4ODI1LCAweDNjMTEwMDAxLAotMHgyMzA4ODIxLCAweDhlMzE3ZTNjLCAweDNjMDI3ZmZmLCAweDM0NDJmZmZmLAotMHgyMjI4ODI0LCAweDNjMDIwMDAxLCAweDhjNDI1Y2Q4LCAweDEwNDAwMDFkLAotMHgxMjExNDAsIDB4M2MwMjAwMDEsIDB4OGM0MjVkOTgsIDB4MTA0MDAwMDIsCi0weDNjMDIyMDAwLCAweDIyMjg4MjUsIDB4MTIxMTQwLCAweDNjMDEwMDAxLAotMHgyMjA4MjEsIDB4OGMyMjdlNDAsIDB4MTA0MDAwMDMsIDB4M2MwMjAwMjAsCi0weDgwMDUzMjIsIDB4MjIyODgyNSwgMHgzYzAyZmZkZiwgMHgzNDQyZmZmZiwKLTB4MjIyODgyNCwgMHgxMjExNDAsIDB4M2MwMTAwMDEsIDB4MjIwODIxLAotMHg4YzIyN2U0OCwgMHgxMDQwMDAwMywgMHgzYzAyMDA4MCwgMHg4MDA1MzJkLAotMHgyMjI4ODI1LCAweDNjMDJmZjdmLCAweDM0NDJmZmZmLCAweDIyMjg4MjQsCi0weDEyMTE0MCwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4YWMzMTdlMzQsCi0weDgwMDUzODAsIDB4MjIwMTAyMSwgMHgxMjI5NDAsIDB4M2MwMzAwMDEsCi0weDY1MTgyMSwgMHg4YzYzN2UzOCwgMHgzYzAyNDAwMCwgMHg2MjEwMjQsCi0weDE0NDAwMDA4LCAweDNjMDI3ZmZmLCAweDM0NDJmZmZmLCAweDYyODgyNCwKLTB4M2MwMTAwMDEsIDB4MjUwODIxLCAweGFjMzE3ZTMwLCAweDgwMDUzODAsCi0weDIyMDEwMjEsIDB4M2MwMjAwMDEsIDB4OGM0MjVjZDgsIDB4MTA0MDAwMzMsCi0weDNjMTFjMDBjLCAweDNjMDIwMDAxLCAweDhjNDI1ZDc0LCAweDNjMDRjMDBjLAotMHgzNDg0MjAwMCwgMHgzYzAzMDAwMSwgMHg4YzYzNWQ5OCwgMHgyMTAyYiwKLTB4MjEwMjMsIDB4NDQxMDI0LCAweDEwNjAwMDAzLCAweDUxODgyNSwKLTB4M2MwMjIwMDAsIDB4MjIyODgyNSwgMHgzYzAyMDAwMSwgMHg0NTEwMjEsCi0weDhjNDI3ZTQ0LCAweDEwNDAwMDAzLCAweDNjMDIwMDIwLCAweDgwMDUzNWQsCi0weDIyMjg4MjUsIDB4M2MwMmZmZGYsIDB4MzQ0MmZmZmYsIDB4MjIyODgyNCwKLTB4MTIxMTQwLCAweDNjMDEwMDAxLCAweDIyMDgyMSwgMHg4YzIyN2U0YywKLTB4MTA0MDAwMDMsIDB4M2MwMjAwODAsIDB4ODAwNTM2OCwgMHgyMjI4ODI1LAotMHgzYzAyZmY3ZiwgMHgzNDQyZmZmZiwgMHgyMjI4ODI0LCAweDNjMDIwMDAxLAotMHg4YzQyNWQ2MCwgMHgxMDQwMDAwMiwgMHgzYzAyMDgwMCwgMHgyMjI4ODI1LAotMHgzYzAyMDAwMSwgMHg4YzQyNWQ2NCwgMHgxMDQwMDAwMiwgMHgzYzAyMDQwMCwKLTB4MjIyODgyNSwgMHgzYzAyMDAwMSwgMHg4YzQyNWQ2OCwgMHgxMDQwMDAwNiwKLTB4M2MwMjAxMDAsIDB4ODAwNTM3YiwgMHgyMjI4ODI1LCAweDNjMDI3ZmZmLAotMHgzNDQyZmZmZiwgMHg2Mjg4MjQsIDB4MTIxMTQwLCAweDNjMDEwMDAxLAotMHgyMjA4MjEsIDB4YWMzMTdlMzAsIDB4MjIwMTAyMSwgMHg4ZmJmMDAyNCwKLTB4OGZiMjAwMjAsIDB4OGZiMTAwMWMsIDB4OGZiMDAwMTgsIDB4M2UwMDAwOCwKLTB4MjdiZDAwMjgsIDB4MjdiZGZmZDgsIDB4YWZiNDAwMjAsIDB4ODBhMDIxLAotMHhhZmJmMDAyNCwgMHhhZmIzMDAxYywgMHhhZmIyMDAxOCwgMHhhZmIxMDAxNCwKLTB4YWZiMDAwMTAsIDB4OGY5MDAyMDAsIDB4M2MwMzAwMDEsIDB4OGM2MzVjYzgsCi0weDhmOTMwMjIwLCAweDI0MDIwMDAyLCAweDEwNjIwMDYzLCAweDJjNjIwMDAzLAotMHgxMDQwMDAwNSwgMHgyNDAyMDAwMSwgMHgxMDYyMDAwYSwgMHgxNDE5NDAsCi0weDgwMDU0NDgsIDB4MCwgMHgyNDAyMDAwNCwgMHgxMDYyMDA1YSwKLTB4MjQwMjAwMDgsIDB4MTA2MjAwNTksIDB4MTQ5MTQwLCAweDgwMDU0NDgsCi0weDAsIDB4M2MwNDAwMDEsIDB4ODMyMDIxLCAweDhjODQ3ZTNjLAotMHgzYzExMDAwMSwgMHgyMjM4ODIxLCAweDhlMzE3ZTM0LCAweDNjMDI0MDAwLAotMHg4MjEwMjQsIDB4MTA0MDAwM2UsIDB4M2MwMjAwMDgsIDB4MjIyMTAyNCwKLTB4MTA0MDAwMjAsIDB4MzYxMDAwMDIsIDB4M2MwMjAwMDEsIDB4NDMxMDIxLAotMHg4YzQyN2U0MCwgMHgxMDQwMDAwNSwgMHgzNjEwMDAyMCwgMHgzNjEwMDEwMCwKLTB4M2MwMjAwMjAsIDB4ODAwNTNiZCwgMHgyMjI4ODI1LCAweDI0MDJmZWZmLAotMHgyMDI4MDI0LCAweDNjMDJmZmRmLCAweDM0NDJmZmZmLCAweDIyMjg4MjQsCi0weDE0MTE0MCwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4OGMyMjdlNDgsCi0weDEwNDAwMDA1LCAweDNjMDIwMDAxLCAweDI2Mjk4MjUsIDB4M2MwMjAwODAsCi0weDgwMDUzZGMsIDB4MjIyODgyNSwgMHgzYzAyZmZmZSwgMHgzNDQyZmZmZiwKLTB4MjYyOTgyNCwgMHgzYzAyZmY3ZiwgMHgzNDQyZmZmZiwgMHg4MDA1M2RjLAotMHgyMjI4ODI0LCAweDI0MDJmZWRmLCAweDIwMjgwMjQsIDB4M2MwMmZmZmUsCi0weDM0NDJmZmZmLCAweDI2Mjk4MjQsIDB4M2MwMmZmNWYsIDB4MzQ0MmZmZmYsCi0weDIyMjg4MjQsIDB4M2MwMTAwMDEsIDB4MjMwODIxLCAweGFjMjA3ZTQwLAotMHgzYzAxMDAwMSwgMHgyMzA4MjEsIDB4YWMyMDdlNDgsIDB4YzAwNDg2YSwKLTB4MCwgMHhhZjkwMDIwMCwgMHhhZjkzMDIyMCwgMHg4ZjgyMDIyMCwKLTB4MjQwM2ZmZmIsIDB4NDMxMDI0LCAweGFmODIwMjIwLCAweDhmODIwMjIwLAotMHgzNDQyMDAwMiwgMHhhZjgyMDIyMCwgMHg4MDA1M2YzLCAweDE0MTE0MCwKLTB4OGY4MjAyMDAsIDB4MjQwM2ZmZmQsIDB4NDMxMDI0LCAweGMwMDQ4NmEsCi0weGFmODIwMjAwLCAweDNjMDJiZmZmLCAweDM0NDJmZmZmLCAweGMwMDQyOWIsCi0weDIyMjg4MjQsIDB4MTQxMTQwLCAweDNjMDEwMDAxLCAweDIyMDgyMSwKLTB4ODAwNTQ0OCwgMHhhYzMxN2UzNCwgMHgxNDkxNDAsIDB4M2MwNDAwMDEsCi0weDkyMjAyMSwgMHg4Yzg0N2UzOCwgMHgzYzExMDAwMSwgMHgyMzI4ODIxLAotMHg4ZTMxN2UzMCwgMHgzYzAyNDAwMCwgMHg4MjEwMjQsIDB4MTQ0MDAwMTEsCi0weDAsIDB4M2MwMjAwMDEsIDB4OGM0MjVkOTgsIDB4MTQ0MDAwMDYsCi0weDNjMDJiZmZmLCAweDhmODIwMjAwLCAweDM0NDIwMDAyLCAweGMwMDQ4NmEsCi0weGFmODIwMjAwLCAweDNjMDJiZmZmLCAweDM0NDJmZmZmLCAweGMwMDQyOWIsCi0weDIyMjg4MjQsIDB4M2MwMTAwMDEsIDB4MzIwODIxLCAweDgwMDU0NDgsCi0weGFjMzE3ZTMwLCAweDNjMDIwMDAxLCAweDhjNDI1ZDk4LCAweDEwNDAwMDA1LAotMHgzYzAyMDAyMCwgMHgzYzAyMDAwMSwgMHg4YzQyNWQ3NCwgMHgxMDQwMDAyYiwKLTB4M2MwMjAwMjAsIDB4ODIxMDI0LCAweDEwNDAwMDA3LCAweDM2MTAwMDIwLAotMHgyNDAyMDEwMCwgMHgzYzAxMDAwMSwgMHgzMjA4MjEsIDB4YWMyMjdlNDQsCi0weDgwMDU0MjgsIDB4MzYxMDAxMDAsIDB4M2MwMTAwMDEsIDB4MzIwODIxLAotMHhhYzIwN2U0NCwgMHgyNDAyZmVmZiwgMHgyMDI4MDI0LCAweDNjMDIwMDgwLAotMHg4MjEwMjQsIDB4MTA0MDAwMDcsIDB4MTQxOTQwLCAweDNjMDIwMDAxLAotMHgzYzAxMDAwMSwgMHgyMzA4MjEsIDB4YWMyMjdlNGMsIDB4ODAwNTQzOSwKLTB4MjYyOTgyNSwgMHgxNDExNDAsIDB4M2MwMTAwMDEsIDB4MjIwODIxLAotMHhhYzIwN2U0YywgMHgzYzAyZmZmZSwgMHgzNDQyZmZmZiwgMHgyNjI5ODI0LAotMHhjMDA0ODZhLCAweDAsIDB4YWY5MDAyMDAsIDB4YWY5MzAyMjAsCi0weDhmODIwMjIwLCAweDI0MDNmZmZiLCAweDQzMTAyNCwgMHhhZjgyMDIyMCwKLTB4OGY4MjAyMjAsIDB4MzQ0MjAwMDIsIDB4YWY4MjAyMjAsIDB4MTQxMTQwLAotMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4YWMzMTdlMzAsIDB4OGZiZjAwMjQsCi0weDhmYjQwMDIwLCAweDhmYjMwMDFjLCAweDhmYjIwMDE4LCAweDhmYjEwMDE0LAotMHg4ZmIwMDAxMCwgMHgzZTAwMDA4LCAweDI3YmQwMDI4LCAweDAgfTsKLXN0YXRpYyB1MzIgdGlnb25Gd1JvZGF0YVsoTUFYX1JPREFUQV9MRU4vNCkgKyAxXSBfX2RldmluaXRkYXRhID0gewotMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwKLTB4NmY2YTY1NjMsIDB4NzQ3MzJmNzIsIDB4NjM3MzJmNzMsIDB4NzcyZjY3NjUsCi0weDJmMmUyZjZlLCAweDY5NjMyZjY2LCAweDc3MmY2MzZmLCAweDZkNmQ2ZjZlLAotMHgyZjY2Nzc2ZCwgMHg2MTY5NmUyZSwgMHg2MzJjNzYyMCwgMHgzMTJlMzEyZSwKLTB4MzIyZTMxMzEsIDB4MjAzMTM5MzksIDB4MzgyZjMwMzQsIDB4MmYzMjM3MjAsCi0weDMyMzIzYTMxLCAweDMzM2EzNDMyLCAweDIwNzM2ODc1LCAweDYxNmU2NzIwLAotMHg0NTc4NzAyMCwgMHgyNDAwMDAwMCwgMHg3NDY4NjU1ZiwgMHg0NDQxNTc0ZSwKLTB4MCwgMHg1MzU0NDE0MywgMHg0YjVmMzEyMCwgMHgwLAotMHg0MjYxNjQ1MywgMHg2ZTY0NTI2ZSwgMHg2NzAwMDAwMCwgMHgzZjQ1NmU3MSwKLTB4NDU3Njc0MDAsIDB4M2Y2ZTZmNTEsIDB4NjQ0NTc2NTAsIDB4MCwKLTB4NjU3NjUyNmUsIDB4Njc0Njc1NmMsIDB4NmMwMDAwMDAsIDB4NDk2YzZjNDMsCi0weDZmNmU2NjUyLCAweDc4MDAwMDAwLCAweDUzNjU2ZTY0LCAweDQzNmI1Mzc1LAotMHg2ZDAwMDAwMCwgMHg1MjY1NjM3NiwgMHg1NjZjNjE2ZSwgMHgwLAotMHgwLCAweDI0NDg2NTYxLCAweDY0NjU3MjNhLCAweDIwMmY3MDcyLAotMHg2ZjZhNjU2MywgMHg3NDczMmY3MiwgMHg2MzczMmY3MywgMHg3NzJmNjc2NSwKLTB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzcyZjYzNmYsIDB4NmQ2ZDZmNmUsCi0weDJmNzQ2OTZkLCAweDY1NzIyZTYzLCAweDJjNzYyMDMxLCAweDJlMzEyZTMyLAotMHgyZTM4MjAzMSwgMHgzOTM5MzgyZiwgMHgzMDM3MmYzMywgMHgzMTIwMzEzNywKLTB4M2EzNTM4M2EsIDB4MzQzNTIwNzMsIDB4Njg3NTYxNmUsIDB4NjcyMDQ1NzgsCi0weDcwMjAyNDAwLCAweDU0MmQ0NDZkLCAweDYxNTI2NDMxLCAweDAsCi0weDU0MmQ0NDZkLCAweDYxNDI0MjAwLCAweDU0MmQ0NDZkLCAweDYxMzIwMDAwLAotMHgzZjZlNmY1MSwgMHg2NDU0Nzg0NSwgMHgwLCAweDNmNmU2ZjUxLAotMHg2NDUyNzg0NSwgMHgwLCAweDY1NmU3MTRkLCAweDQ1NzY1MDQ2LAotMHg2MTY5NmMwMCwgMHg2NTZlNzE0ZCwgMHg0NTc2NDY2MSwgMHg2OTZjMDAwMCwKLTB4NjY2MTY5NmMsIDB4NDU2ZTQ1NGQsIDB4MCwgMHgzZjQ1NmU3MSwKLTB4NDU3Njc0MDAsIDB4M2Y2ZTZmNTEsIDB4NjQ0NTc2NTAsIDB4MCwKLTB4NjU3NjUyNmUsIDB4Njc0Njc1NmMsIDB4NmMwMDAwMDAsIDB4MCwKLTB4MCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwKLTB4NmY2YTY1NjMsIDB4NzQ3MzJmNzIsIDB4NjM3MzJmNzMsIDB4NzcyZjY3NjUsCi0weDJmMmUyZjZlLCAweDY5NjMyZjY2LCAweDc3MmY2MzZmLCAweDZkNmQ2ZjZlLAotMHgyZjYzNmY2ZCwgMHg2ZDYxNmU2NCwgMHgyZTYzMmM3NiwgMHgyMDMxMmUzMSwKLTB4MmUzMjJlMzEsIDB4MzAyMDMxMzksIDB4MzkzODJmMzEsIDB4MzEyZjMxMzgsCi0weDIwMzEzNzNhLCAweDMxMzEzYTMxLCAweDM4MjA3MzY4LCAweDc1NjE2ZTY3LAotMHgyMDQ1Nzg3MCwgMHgyMDI0MDAwMCwgMHgzZjRkNjI2ZiwgMHg3ODQ1NzY3NCwKLTB4MCwgMHg0ZTRmNjM2ZiwgMHg2ZDYxNmU2NCwgMHgwLAotMHg2ODczNzQ2NSwgMHg1ZjQ1NTI1MiwgMHgwLCAweDQxMmQ0NTcyLAotMHg3MjQyNzU2MywgMHgwLCAweDQ1NTI1MjRmLCAweDUyMmQ0MTY0LAotMHg2NDAwMDAwMCwgMHg2NTZlNzE0ZCwgMHg0NTc2NTA0NiwgMHg2MTY5NmMwMCwKLTB4NjU2ZTcxNGQsIDB4NDU3NjQ2NjEsIDB4Njk2YzAwMDAsIDB4NjY2MTY5NmMsCi0weDQ1NmU0NTRkLCAweDAsIDB4NDQyZDQ1NzIsIDB4NzI0YzYxNzMsCi0weDc0MDAwMDAwLCAweDQ0MmQ0NTcyLCAweDcyMzIwMDAwLCAweDZkNDM3Mzc0LAotMHg0ZDY0NDU1MiwgMHg1MjAwMDAwMCwgMHg3MDcyNmY2ZCwgMHg0ZDY0NDU1MiwKLTB4NTIwMDAwMDAsIDB4NDY2OTZjNzQsIDB4NGQ2NDQ1NTIsIDB4NTIwMDAwMDAsCi0weDYzNmQ2NDVmLCAweDQ1NTI1MjAwLCAweDNmNDU2ZTcxLCAweDQ1NzY3NDAwLAotMHgzZjZlNmY1MSwgMHg2NDQ1NzY1MCwgMHgwLCAweDY1NzY1MjZlLAotMHg2NzQ2NzU2YywgMHg2YzAwMDAwMCwgMHgwLCAweDZlYTAsCi0weDdmYmMsIDB4NmUzOCwgMHg4NzM0LCAweDgyYjAsCi0weDg3ODAsIDB4ODc4MCwgMHg2ZjU0LCAweDc2OTQsCi0weDdmMGMsIDB4ODBhOCwgMHg4MDc0LCAweDg3ODAsCi0weDdlNzAsIDB4ODBjYywgMHg2ZTY0LCAweDgxY2MsCi0weDAsIDB4MjQ0ODY1NjEsIDB4NjQ2NTcyM2EsIDB4MjAyZjcwNzIsCi0weDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LAotMHgyZjJlMmY2ZSwgMHg2OTYzMmY2NiwgMHg3NzJmNjM2ZiwgMHg2ZDZkNmY2ZSwKLTB4MmY2NDZkNjEsIDB4MmU2MzJjNzYsIDB4MjAzMTJlMzEsIDB4MmUzMjJlMzMsCi0weDIwMzEzOTM5LCAweDM4MmYzMDM0LCAweDJmMzIzNzIwLCAweDMyMzIzYTMxLAotMHgzMzNhMzQzMSwgMHgyMDczNjg3NSwgMHg2MTZlNjcyMCwgMHg0NTc4NzAyMCwKLTB4MjQwMDAwMDAsIDB4NjQ2ZDYxNzIsIDB4NjQ0MTU0NGUsIDB4MCwKLTB4NjQ2ZDYxNzcsIDB4NzI0MTU0NGUsIDB4MCwgMHgwLAotMHgwLCAweDI0NDg2NTYxLCAweDY0NjU3MjNhLCAweDIwMmY3MDcyLAotMHg2ZjZhNjU2MywgMHg3NDczMmY3MiwgMHg2MzczMmY3MywgMHg3NzJmNjc2NSwKLTB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzcyZjYzNmYsIDB4NmQ2ZDZmNmUsCi0weDJmNzQ3MjYxLCAweDYzNjUyZTYzLCAweDJjNzYyMDMxLCAweDJlMzEyZTMyLAotMHgyZTMyMjAzMSwgMHgzOTM5MzgyZiwgMHgzMDM0MmYzMiwgMHgzNzIwMzIzMiwKLTB4M2EzMTMzM2EsIDB4MzUzMDIwNzMsIDB4Njg3NTYxNmUsIDB4NjcyMDQ1NzgsCi0weDcwMjAyNDAwLCAweDI0NDg2NTYxLCAweDY0NjU3MjNhLCAweDIwMmY3MDcyLAotMHg2ZjZhNjU2MywgMHg3NDczMmY3MiwgMHg2MzczMmY3MywgMHg3NzJmNjc2NSwKLTB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzcyZjYzNmYsIDB4NmQ2ZDZmNmUsCi0weDJmNjQ2MTc0LCAweDYxMmU2MzJjLCAweDc2MjAzMTJlLCAweDMxMmUzMjJlLAotMHgzMjIwMzEzOSwgMHgzOTM4MmYzMCwgMHgzNDJmMzIzNywgMHgyMDMyMzIzYSwKLTB4MzEzMzNhMzQsIDB4MzAyMDczNjgsIDB4NzU2MTZlNjcsIDB4MjA0NTc4NzAsCi0weDIwMjQwMDAwLCAweDQ2NTc1ZjU2LCAweDQ1NTI1MzQ5LCAweDRmNGUzYTIwLAotMHgyMzMxMjA0NiwgMHg3MjY5MjA0MSwgMHg3MDcyMjAzNywgMHgyMDMxMzczYSwKLTB4MzUzNTNhMzQsIDB4MzgyMDUwNDQsIDB4NTQyMDMyMzAsIDB4MzAzMDAwMDAsCi0weDQ2NTc1ZjQzLCAweDRmNGQ1MDQ5LCAweDRjNDU1ZjU0LCAweDQ5NGQ0NTNhLAotMHgyMDMxMzczYSwgMHgzNTM1M2EzNCwgMHgzODAwMDAwMCwgMHg0NjU3NWY0MywKLTB4NGY0ZDUwNDksIDB4NGM0NTVmNDIsIDB4NTkzYTIwNjQsIDB4NjU3NjcyNjMsCi0weDczMDAwMDAwLCAweDQ2NTc1ZjQzLCAweDRmNGQ1MDQ5LCAweDRjNDU1ZjQ4LAotMHg0ZjUzNTQzYSwgMHgyMDYzNmY2ZCwgMHg3MDc1NzQ2NSwgMHgwLAotMHg0NjU3NWY0MywgMHg0ZjRkNTA0OSwgMHg0YzQ1NWY0NCwgMHg0ZjRkNDE0OSwKLTB4NGUzYTIwNjUsIDB4NmU2NzJlNjEsIDB4NjM3NDY1NmYsIDB4NmUyZTYzNmYsCi0weDZkMDAwMDAwLCAweDQ2NTc1ZjQzLCAweDRmNGQ1MDQ5LCAweDRjNDU1MjNhLAotMHgyMDY3NjM2MywgMHgyMDc2NjU3MiwgMHg3MzY5NmY2ZSwgMHgyMDMyMmUzNywKLTB4MmUzMjAwMDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MjQ0ODY1NjEsIDB4NjQ2NTcyM2EsIDB4MjAyZjcwNzIsCi0weDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LAotMHgyZjJlMmY2ZSwgMHg2OTYzMmY2NiwgMHg3NzJmNjM2ZiwgMHg2ZDZkNmY2ZSwKLTB4MmY2ZDY1NmQsIDB4MmU2MzJjNzYsIDB4MjAzMTJlMzEsIDB4MmUzMjJlMzIsCi0weDIwMzEzOTM5LCAweDM4MmYzMDM0LCAweDJmMzIzNzIwLCAweDMyMzIzYTMxLAotMHgzMzNhMzQzNCwgMHgyMDczNjg3NSwgMHg2MTZlNjcyMCwgMHg0NTc4NzAyMCwKLTB4MjQwMDAwMDAsIDB4MjQ0ODY1NjEsIDB4NjQ2NTcyM2EsIDB4MjAyZjcwNzIsCi0weDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LAotMHgyZjJlMmY2ZSwgMHg2OTYzMmY2NiwgMHg3NzJmNjM2ZiwgMHg2ZDZkNmY2ZSwKLTB4MmY3MzY1NmUsIDB4NjQyZTYzMmMsIDB4NzYyMDMxMmUsIDB4MzEyZTMyMmUsCi0weDMxMzEyMDMxLCAweDM5MzkzODJmLCAweDMxMzIyZjMyLCAweDMyMjAzMTM3LAotMHgzYTMxMzczYSwgMHgzNTM1MjA3MywgMHg2ODc1NjE2ZSwgMHg2NzIwNDU3OCwKLTB4NzAyMDI0MDAsIDB4NzM2ZTY0NjQsIDB4NjU0ZTZmNTEsIDB4MjAwMDAwMDAsCi0weDZlNmY0NTRlLCAweDUxNWY1NDU4LCAweDAsIDB4NzM2ZTY0NjQsCi0weDc0NGU2ZjUxLCAweDIwMDAwMDAwLCAweDNmNmU2ZjUxLCAweDY0NTQ3ODQ1LAotMHgwLCAweDc1NmU2YjcyLCAweDY0NzQ3OTcwLCAweDY1MDAwMDAwLAotMHgwLCAweGFjY2MsIDB4YWNjYywgMHhhZDljLAotMHhhYWIwLCAweGFhYjAsIDB4YWQ5YywgMHhhZDljLAotMHhhZDljLCAweGFkOWMsIDB4YWQ5YywgMHhhZDljLAotMHhhZDljLCAweGFkOWMsIDB4YWQ5YywgMHhhZDljLAotMHhhZDljLCAweGFkOWMsIDB4YWQ5YywgMHhhZDdjLAotMHgwLCAweGJjYTgsIDB4YmNhOCwgMHhiZDcwLAotMHhhZTRjLCAweGIwNTgsIDB4YmQ3MCwgMHhiZDcwLAotMHhiZDcwLCAweGJkNzAsIDB4YmQ3MCwgMHhiZDcwLAotMHhiZDcwLCAweGJkNzAsIDB4YmQ3MCwgMHhiZDcwLAotMHhiZDcwLCAweGJkNzAsIDB4YmQ3MCwgMHhiZDU0LAotMHhiMDQwLCAweDI0NDg2NTYxLCAweDY0NjU3MjNhLCAweDIwMmY3MDcyLAotMHg2ZjZhNjU2MywgMHg3NDczMmY3MiwgMHg2MzczMmY3MywgMHg3NzJmNjc2NSwKLTB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzcyZjYzNmYsIDB4NmQ2ZDZmNmUsCi0weDJmNzI2NTYzLCAweDc2MmU2MzJjLCAweDc2MjAzMTJlLCAweDMxMmUzMjJlLAotMHgzMTM5MjAzMSwgMHgzOTM5MzgyZiwgMHgzMDM3MmYzMiwgMHgzNDIwMzIzMSwKLTB4M2EzMzMwM2EsIDB4MzAzNTIwNzMsIDB4Njg3NTYxNmUsIDB4NjcyMDQ1NzgsCi0weDcwMjAyNDAwLCAweDcwNmI1Mjc4LCAweDQ1NTI1MjAwLCAweDY2NzI2ZDMyLAotMHg0YzYxNzI2NywgMHg2NTAwMDAwMCwgMHg3Mjc4NGU2ZiwgMHg1Mjc4NDI2NCwKLTB4MCwgMHg3Mjc4NTE0NCwgMHg2ZDYxNDQ0NiwgMHgwLAotMHg3Mjc4NTE0NCwgMHg2ZDYxNDI0NiwgMHgwLCAweDNmNmU2ZjUxLAotMHg2NDUyNzg0NSwgMHgwLCAweDcwNmI1Mjc4LCAweDQ1NTI1MjczLAotMHgwLCAweDY2NzI2ZDMyLCAweDRjNzI2NzUzLCAweDAsCi0weDcyNzg0ZTZmLCAweDQyNjQ1MzAwLCAweDNmNzI0MjY0LCAweDQ0NmQ2MTQ2LAotMHgwLCAweDNmNzI0YTQyLCAweDY0NDQ2ZDQ2LCAweDAsCi0weDAsIDB4ZjY3OCwgMHhmNjc4LCAweGY2NzgsCi0weGY2NzgsIDB4ZjY3OCwgMHhmNjc4LCAweGY2NzgsCi0weGY2NzgsIDB4ZjY3OCwgMHhmNjc4LCAweGY2NzgsCi0weGY2NzgsIDB4ZjY3OCwgMHhmNjc4LCAweGY2NzgsCi0weGY2NzAsIDB4ZjY3MCwgMHhmNjcwLCAweDU3MmQ0NDRkLAotMHg0MTQ1NmU0NiwgMHgwLCAweDAsIDB4ZmRjMCwKLTB4MTAxNWMsIDB4ZmRkYywgMHgxMDE1YywgMHgxMDE1YywKLTB4MTAxNWMsIDB4MTAxNWMsIDB4MTAxNWMsIDB4MTAxNWMsCi0weGY3MDQsIDB4MTAxNWMsIDB4MTAxNWMsIDB4MTAxNWMsCi0weDEwMTVjLCAweDEwMTVjLCAweDEwMTU0LCAweDEwMTU0LAotMHgxMDE1NCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwKLTB4NmY2YTY1NjMsIDB4NzQ3MzJmNzIsIDB4NjM3MzJmNzMsIDB4NzcyZjY3NjUsCi0weDJmMmUyZjZlLCAweDY5NjMyZjY2LCAweDc3MmY2MzZmLCAweDZkNmQ2ZjZlLAotMHgyZjZkNjE2MywgMHgyZTYzMmM3NiwgMHgyMDMxMmUzMSwgMHgyZTMyMmUzMSwKLTB4MzIyMDMxMzksIDB4MzkzODJmMzAsIDB4MzQyZjMyMzcsIDB4MjAzMjMyM2EsCi0weDMxMzMzYTM0LCAweDMyMjA3MzY4LCAweDc1NjE2ZTY3LCAweDIwNDU3ODcwLAotMHgyMDI0MDAwMCwgMHg2ZDYxNjM3NCwgMHg3ODQxNTQ0ZSwgMHgwLAotMHg0ZTc0NTM3OSwgMHg2ZTI2NGM2YiwgMHgwLCAweDcyNjU2ZDYxLAotMHg3MzczNzI3NCwgMHgwLCAweDZjNjk2ZTZiLCAweDQ0NGY1NzRlLAotMHgwLCAweDY1NmU3MTRkLCAweDQ1NzY1MDQ2LCAweDYxNjk2YzAwLAotMHg2NTZlNzE0ZCwgMHg0NTc2NDY2MSwgMHg2OTZjMDAwMCwgMHg2NjYxNjk2YywKLTB4NDU2ZTQ1NGQsIDB4MCwgMHg2YzY5NmU2YiwgMHg1NTUwMDAwMCwKLTB4MCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwKLTB4NmY2YTY1NjMsIDB4NzQ3MzJmNzIsIDB4NjM3MzJmNzMsIDB4NzcyZjY3NjUsCi0weDJmMmUyZjZlLCAweDY5NjMyZjY2LCAweDc3MmY2MzZmLCAweDZkNmQ2ZjZlLAotMHgyZjYzNmI3MywgMHg3NTZkMmU2MywgMHgyYzc2MjAzMSwgMHgyZTMxMmUzMiwKLTB4MmUzMjIwMzEsIDB4MzkzOTM4MmYsIDB4MzAzNDJmMzIsIDB4MzcyMDMyMzIsCi0weDNhMzEzMzNhLCAweDMzMzkyMDczLCAweDY4NzU2MTZlLCAweDY3MjA0NTc4LAotMHg3MDIwMjQwMCwgMHg1MDcyNmY2MiwgMHg2NTUwNjg3OSwgMHgwLAotMHg2YzZlNmI0MSwgMHg1MzUzNTI1NCwgMHgwLCAweDExYjJjLAotMHgxMWJjNCwgMHgxMWJmOCwgMHgxMWMyYywgMHgxMWM1OCwKLTB4MTFjNmMsIDB4MTFjYTgsIDB4MTIwN2MsIDB4MTFkZTQsCi0weDExZTI0LCAweDExZTUwLCAweDExZTkwLCAweDExZWMwLAotMHgxMWVmYywgMHgxMWYzMCwgMHgxMjA3YywgMHgxMjJjMCwKLTB4MTIyZDgsIDB4MTIzMDAsIDB4MTIzMjAsIDB4MTIzNDgsCi0weDEyNDc4LCAweDEyNGEwLCAweDEyNGY0LCAweDEyNTFjLAotMHgwLCAweDEyNzhjLCAweDEyODVjLCAweDEyOTM0LAotMHgxMmEwNCwgMHgxMmE2MCwgMHgxMmIzYywgMHgxMmI2NCwKLTB4MTJjNDAsIDB4MTJjNjgsIDB4MTJlMTAsIDB4MTJlMzgsCi0weDEyZmUwLCAweDEzMWQ4LCAweDEzNDZjLCAweDEzMzgwLAotMHgxMzQ2YywgMHgxMzQ5OCwgMHgxMzAwOCwgMHgxMzFiMCwKLTB4MCwgMHgxM2I4NCwgMHgxM2JjOCwgMHgxM2M2MCwKLTB4MTNjYWMsIDB4MTNkMWMsIDB4MTNkYjQsIDB4MTNkZTgsCi0weDEzZTcwLCAweDEzZjA4LCAweDEzZmQ4LCAweDE0MDE4LAotMHgxNDA5YywgMHgxNDBjMCwgMHgxNDFmNCwgMHg2NDZmNDI2MSwKLTB4NzM2NTUwNjcsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4NzM3NDZkNjEsIDB4NjM0YzRlNGIsIDB4MCwKLTB4MCwgMHgxNGMzOCwgMHgxNGMzOCwgMHgxNGI4MCwKLTB4MTRiYzQsIDB4MTRjMzgsIDB4MTRjMzgsIDB4MCwKLTB4MCwgMHgwIH07Ci1zdGF0aWMgdTMyIHRpZ29uRndEYXRhWyhNQVhfREFUQV9MRU4vNCkgKyAxXSBfX2RldmluaXRkYXRhID0gewotMHg0MTZjNzQ2NSwKLTB4NmY2ZTIwNDEsIDB4NjM2NTRlNDksIDB4NDMyMDU2MDAsIDB4NDE2Yzc0NjUsCi0weDZmNmUyMDQxLCAweDYzNjU0ZTQ5LCAweDQzMjA1NjAwLCAweDQyNDI0MjQyLAotMHgwLCAweDAsIDB4MCwgMHgxMzU0MTgsCi0weDEzZTdmYywgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4NjBjZjAwLAotMHg2MCwgMHhjZjAwMDAwMCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgzLCAweDAsCi0weDEsIDB4MCwgMHgwLCAweDAsCi0weDEsIDB4MCwgMHgxLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDEsCi0weDEsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgxMDAwMDAwLCAweDIxMDAwMDAwLAotMHgxMjAwMDE0MCwgMHgwLCAweDAsIDB4MjAwMDAwMDAsCi0weDEyMDAwMGEwLCAweDAsIDB4MTIwMDAwNjAsIDB4MTIwMDAxODAsCi0weDEyMDAwMWUwLCAweDAsIDB4MCwgMHgwLAotMHgxLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgyLAotMHgwLCAweDAsIDB4MzAwMDEsIDB4MSwKLTB4MzAyMDEsIDB4MCwgMHgwLCAweDAgfTsKLSNlbmRpZgotLyogR2VuZXJhdGVkIGJ5IGdlbmZ3LmMgKi8KLSNkZWZpbmUgdGlnb24yRndSZWxlYXNlTWFqb3IgMHhjCi0jZGVmaW5lIHRpZ29uMkZ3UmVsZWFzZU1pbm9yIDB4NAotI2RlZmluZSB0aWdvbjJGd1JlbGVhc2VGaXggMHhiCi0jZGVmaW5lIHRpZ29uMkZ3U3RhcnRBZGRyIDB4MDAwMDQwMDAKLSNkZWZpbmUgdGlnb24yRndUZXh0QWRkciAweDAwMDA0MDAwCi0jZGVmaW5lIHRpZ29uMkZ3VGV4dExlbiAweDExYmMwCi0jZGVmaW5lIHRpZ29uMkZ3Um9kYXRhQWRkciAweDAwMDE1YmMwCi0jZGVmaW5lIHRpZ29uMkZ3Um9kYXRhTGVuIDB4MTBkMAotI2RlZmluZSB0aWdvbjJGd0RhdGFBZGRyIDB4MDAwMTZjYzAKLSNkZWZpbmUgdGlnb24yRndEYXRhTGVuIDB4MWMwCi0jZGVmaW5lIHRpZ29uMkZ3U2Jzc0FkZHIgMHgwMDAxNmU4MAotI2RlZmluZSB0aWdvbjJGd1Nic3NMZW4gMHhjYwotI2RlZmluZSB0aWdvbjJGd0Jzc0FkZHIgMHgwMDAxNmY1MAotI2RlZmluZSB0aWdvbjJGd0Jzc0xlbiAweDIwYzAKLXN0YXRpYyB1MzIgdGlnb24yRndUZXh0WyhNQVhfVEVYVF9MRU4vNCkgKyAxXSBfX2RldmluaXRkYXRhID0gewotMHgwLAotMHgxMDAwMDAwMywgMHgwLCAweGQsIDB4ZCwKLTB4M2MxZDAwMDEsIDB4OGZiZDZkMjAsIDB4M2EwZjAyMSwgMHgzYzEwMDAwMCwKLTB4MjYxMDQwMDAsIDB4YzAwMTBjMCwgMHgwLCAweGQsCi0weDNjMWQwMDAxLCAweDhmYmQ2ZDI0LCAweDNhMGYwMjEsIDB4M2MxMDAwMDAsCi0weDI2MTA0MDAwLCAweGMwMDE3ZTAsIDB4MCwgMHhkLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgyMDAwMDA4LAotMHgwLCAweDgwMDE3MmYsIDB4M2MwYTAwMDEsIDB4ODAwMTcyZiwKLTB4M2MwYTAwMDIsIDB4ODAwMTcyZiwgMHgwLCAweDgwMDJjYWMsCi0weDAsIDB4ODAwMmM0ZiwgMHgwLCAweDgwMDE3MmYsCi0weDNjMGEwMDA0LCAweDgwMDMyOGEsIDB4MCwgMHg4MDAxYTUyLAotMHgwLCAweDgwMDM5NGQsIDB4MCwgMHg4MDAzOGY0LAotMHgwLCAweDgwMDE3MmYsIDB4M2MwYTAwMDYsIDB4ODAwMzliYiwKLTB4M2MwYTAwMDcsIDB4ODAwMTcyZiwgMHgzYzBhMDAwOCwgMHg4MDAxNzJmLAotMHgzYzBhMDAwOSwgMHg4MDAzYTEzLCAweDAsIDB4ODAwMmVhNiwKLTB4MCwgMHg4MDAxNzJmLCAweDNjMGEwMDBiLCAweDgwMDE3MmYsCi0weDNjMGEwMDBjLCAweDgwMDE3MmYsIDB4M2MwYTAwMGQsIDB4ODAwMjhmYiwKLTB4MCwgMHg4MDAyODkwLCAweDAsIDB4ODAwMTcyZiwKLTB4M2MwYTAwMGUsIDB4ODAwMjA4YywgMHgwLCAweDgwMDE5NjQsCi0weDAsIDB4ODAwMWEwNCwgMHgwLCAweDgwMDNjYTYsCi0weDAsIDB4ODAwM2M5NCwgMHgwLCAweDgwMDE3MmYsCi0weDAsIDB4ODAwMTkxYSwgMHgwLCAweDgwMDE3MmYsCi0weDAsIDB4ODAwMTcyZiwgMHgzYzBhMDAxMywgMHg4MDAxNzJmLAotMHgzYzBhMDAxNCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MjdiZGZmZTAsCi0weDNjMWNjMDAwLCAweGFmYmYwMDFjLCAweGFmYjAwMDE4LCAweDhmODIwMTQwLAotMHgyNDAzMDAwMywgMHhhZjgzMDBlYywgMHgzNDQyMDAwNCwgMHhjMDAyYjIwLAotMHhhZjgyMDE0MCwgMHgzYzAxMDBjMCwgMHhjMDAxNzYzLCAweGFjMjAzZmZjLAotMHg0MDE4MjEsIDB4M2MwMjAwMTAsIDB4M2MwMTAwMDEsIDB4YWMyMzZlOWMsCi0weDEwNjIwMDExLCAweDQzMTAyYiwgMHgxNDQwMDAwMiwgMHgzYzAyMDAyMCwKLTB4M2MwMjAwMDgsIDB4MTA2MjAwMGMsIDB4MjQwNTAxMDAsIDB4M2MwNjAwMDEsCi0weDhjYzY2ZTljLCAweDNjMDQwMDAxLCAweDI0ODQ1Yzc0LCAweDM4MjEsCi0weGFmYTAwMDEwLCAweGMwMDJiM2IsIDB4YWZhMDAwMTQsIDB4M2MwMjAwMjAsCi0weDNjMDEwMDAxLCAweGFjMjI2ZTljLCAweDI0MDIwMDA4LCAweDNjMDEwMDAxLAotMHhhYzIyNmViNCwgMHgyNDAyMDAxZiwgMHgzYzAxMDAwMSwgMHhhYzIyNmVjNCwKLTB4MjQwMjAwMTYsIDB4M2MwMTAwMDEsIDB4YWMyMjZlOTgsIDB4M2MwNWZmZmUsCi0weDM0YTU2ZjA4LCAweDNjMDIwMDAxLCAweDhjNDI2ZTljLCAweDNjMDMwMDAyLAotMHgyNDYzOTAxMCwgMHgzYzA0MDAwMSwgMHg4Yzg0NmNjNCwgMHg0MzEwMjMsCi0weDE0ODAwMDAyLCAweDQ1ODAyMSwgMHgyNjEwZmEzOCwgMHgyNDAyZjAwMCwKLTB4MjAyODAyNCwgMHhjMDAxNzg1LCAweDIwMDIwMjEsIDB4MjAyMjgyMywKLTB4M2MwNDAwMjAsIDB4ODIxODIzLCAweDY1MTgyMywgMHgyNDdiYjAwMCwKLTB4M2MwM2ZmZmUsIDB4MzQ2M2JmMDgsIDB4MzYzYjgyMSwgMHgzYzA2MDBiZiwKLTB4MzRjNmYwMDAsIDB4M2MwNzAwMDEsIDB4OGNlNzZjYzAsIDB4M2MwMzAwYmYsCi0weDM0NjNlMDAwLCAweDg1MjAyMywgMHgzYzAxMDAwMSwgMHhhYzI0NmVhOCwKLTB4ODIyMDIzLCAweDNjMDEwMDAxLCAweGFjMjU2ZTkwLCAweDUyODQyLAotMHgzYzAxMDAwMSwgMHhhYzIyNmU4NCwgMHgyNzYyMGZmYywgMHgzYzAxMDAwMSwKLTB4YWMyMjZkMjAsIDB4Mjc2MjFmZmMsIDB4ZGIzMDIzLCAweDdiMTgyMywKLTB4M2MwMTAwMDEsIDB4YWMyNDZlODgsIDB4M2MwMTAwMDEsIDB4YWMyNTZlYWMsCi0weDNjMDEwMDAxLCAweGFjMjI2ZDI0LCAweGFmODYwMTUwLCAweDEwZTAwMDExLAotMHhhZjgzMDI1MCwgMHgzYzFkMDAwMSwgMHg4ZmJkNmNjYywgMHgzYTBmMDIxLAotMHhjMDAxNzQ5LCAweDAsIDB4M2MwMjAwMDEsIDB4OGM0MjZjZDAsCi0weDNjMDMwMDAxLCAweDhjNjM2Y2Q0LCAweDI0NDJmZTAwLCAweDI0NjMwMjAwLAotMHgzYzAxMDAwMSwgMHhhYzIyNmNkMCwgMHgzYzAxMDAwMSwgMHgxMDAwMDAwNCwKLTB4YWMyMzZjZDQsIDB4M2MxZDAwMDEsIDB4OGZiZDZkMjAsIDB4M2EwZjAyMSwKLTB4M2MwMjAwMDEsIDB4OGM0MjZjYzQsIDB4MTA0MDAwMGQsIDB4MjZmYWZhMzgsCi0weDNjMDIwMDAxLCAweDhjNDI2Y2QwLCAweDNjMDMwMDAxLCAweDhjNjM2Y2Q0LAotMHgzYzFhMDAwMSwgMHg4ZjVhNmNkNCwgMHgyNDQyZmEzOCwgMHgyNDYzMDVjOCwKLTB4M2MwMTAwMDEsIDB4YWMyMjZjZDAsIDB4M2MwMTAwMDEsIDB4YWMyMzZjZDQsCi0weDNjMDIwMDAxLCAweDhjNDI2Y2M4LCAweDE0NDAwMDAzLCAweDAsCi0weDNjMDEwMDAxLCAweGFjMjA2Y2QwLCAweGMwMDExNTEsIDB4MCwKLTB4OGZiZjAwMWMsIDB4OGZiMDAwMTgsIDB4M2UwMDAwOCwgMHgyN2JkMDAyMCwKLTB4M2MwMjAwMDEsIDB4OGM0MjZjZDAsIDB4M2MwMzAwMDEsIDB4OGM2MzZjZDQsCi0weDI3YmRmZjk4LCAweGFmYjAwMDQ4LCAweDNjMTAwMDAxLCAweDhlMTA2NmI4LAotMHhhZmIyMDA1MCwgMHgzYzEyMDAwMCwgMHgyNjUyNDEwMCwgMHhhZmJmMDA2MCwKLTB4YWZiZTAwNWMsIDB4YWZiNTAwNTgsIDB4YWZiMzAwNTQsIDB4YWZiMTAwNGMsCi0weGFmYTIwMDM0LCAweGFmYTMwMDMwLCAweGFmYTAwMDEwLCAweGFmYTAwMDE0LAotMHg4Zjg2MDA0MCwgMHgzYzA0MDAwMSwgMHgyNDg0NWM4MCwgMHgyNDA1MDIwMCwKLTB4M2MwMTAwMDEsIDB4YWMzMjZlODAsIDB4YzAwMmIzYiwgMHgyMDAzODIxLAotMHg4ZjgzMDA0MCwgMHgzYzAyZjAwMCwgMHg2MjE4MjQsIDB4M2MwMjYwMDAsCi0weDEwNjIwMDBiLCAweGEzYTAwMDNmLCAweDI0MGUwMDAxLCAweDNjMDQwMDAxLAotMHgyNDg0NWM4OCwgMHhhM2FlMDAzZiwgMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwKLTB4OGY4NjAwNDAsIDB4MjQwNTAzMDAsIDB4YzAwMmIzYiwgMHgyMDAzODIxLAotMHg4ZjgyMDI0MCwgMHgzYzAzMDAwMSwgMHg0MzEwMjUsIDB4YWY4MjAyNDAsCi0weGFmODAwMDQ4LCAweDhmODIwMDQ4LCAweDE0NDAwMDA1LCAweDAsCi0weGFmODAwMDQ4LCAweDhmODIwMDQ4LCAweDEwNDAwMDA0LCAweDAsCi0weGFmODAwMDQ4LCAweDEwMDAwMDAzLCAweDJlMDIwMjEsIDB4YWY4MDAwNGMsCi0weDJlMDIwMjEsIDB4M2MwNTAwMDEsIDB4YzAwMmJhOCwgMHgzNGE1NDBmOCwKLTB4MzQwMjAyMSwgMHhjMDAyYmE4LCAweDI0MDUwNWM4LCAweDNjMDIwMDAxLAotMHg4YzQyNmVhOCwgMHgzYzBkMDAwMSwgMHg4ZGFkNmU4OCwgMHgzYzAzMDAwMSwKLTB4OGM2MzZlODQsIDB4M2MwODAwMDEsIDB4OGQwODZlOTAsIDB4M2MwOTAwMDEsCi0weDhkMjk2ZWFjLCAweDNjMGEwMDAxLCAweDhkNGE2ZWI0LCAweDNjMGIwMDAxLAotMHg4ZDZiNmVjNCwgMHgzYzBjMDAwMSwgMHg4ZDhjNmU5OCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDVjOTQsIDB4MjQwNTA0MDAsIDB4YWY0MjAxM2MsIDB4OGY0MjAxM2MsCi0weDI0MDYwMDAxLCAweDI0MDcwMDAxLCAweGFmNDAwMDAwLCAweGFmNGQwMTM4LAotMHhhZjQzMDE0NCwgMHhhZjQ4MDE0OCwgMHhhZjQ5MDE0YywgMHhhZjRhMDE1MCwKLTB4YWY0YjAxNTQsIDB4YWY0YzAxNTgsIDB4MjQ0MmZmODAsIDB4YWY0MjAxNDAsCi0weDI0MDIwMDAxLCAweGFmYTIwMDEwLCAweGMwMDJiM2IsIDB4YWZhMDAwMTQsCi0weDhmNDIwMTM4LCAweGFmYTIwMDEwLCAweDhmNDIwMTNjLCAweGFmYTIwMDE0LAotMHg4ZjQ2MDE0NCwgMHg4ZjQ3MDE0OCwgMHgzYzA0MDAwMSwgMHgyNDg0NWNhMCwKLTB4YzAwMmIzYiwgMHgyNDA1MDUwMCwgMHhhZmI3MDAxMCwgMHhhZmJhMDAxNCwKLTB4OGY0NjAxNGMsIDB4OGY0NzAxNTAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVjYWMsCi0weGMwMDJiM2IsIDB4MjQwNTA2MDAsIDB4M2MwMjAwMDEsIDB4OGM0MjZlOWMsCi0weDM2MDM4MjEsIDB4M2MwNjAwMDIsIDB4MjRjNjkwMTAsIDB4MjQ0OGZmZmYsCi0weDEwNjE4MjQsIDB4ZTgxMDI0LCAweDQzMTAyYiwgMHgxMDQwMDAwNiwKLTB4MjQwNTA5MDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVjYjgsIDB4YWZhODAwMTAsCi0weGMwMDJiM2IsIDB4YWZhMDAwMTQsIDB4OGY4MjAwMGMsIDB4YWZhMjAwMTAsCi0weDhmODIwMDNjLCAweGFmYTIwMDE0LCAweDhmODYwMDAwLCAweDhmODcwMDA0LAotMHgzYzA0MDAwMSwgMHgyNDg0NWNjNCwgMHhjMDAyYjNiLCAweDI0MDUxMDAwLAotMHg4YzAyMDIyMCwgMHg4YzAzMDIyNCwgMHg4YzA2MDIxOCwgMHg4YzA3MDIxYywKLTB4M2MwNDAwMDEsIDB4MjQ4NDVjY2MsIDB4MjQwNTExMDAsIDB4YWZhMjAwMTAsCi0weGMwMDJiM2IsIDB4YWZhMzAwMTQsIDB4YWY4MDAwNTQsIDB4YWY4MDAxMWMsCi0weDhjMDIwMjE4LCAweDMwNDIwMDAyLCAweDEwNDAwMDA5LCAweDAsCi0weDhjMDIwMjIwLCAweDNjMDMwMDAyLCAweDM0NjMwMDA0LCAweDQzMTAyNSwKLTB4YWY0MjAwMGMsIDB4OGMwMjAyMWMsIDB4MTAwMDAwMDgsIDB4MzQ0MjAwMDQsCi0weDhjMDIwMjIwLCAweDNjMDMwMDAyLCAweDM0NjMwMDA2LCAweDQzMTAyNSwKLTB4YWY0MjAwMGMsIDB4OGMwMjAyMWMsIDB4MzQ0MjAwMDYsIDB4YWY0MjAwMTQsCi0weDhjMDIwMjE4LCAweDMwNDIwMDEwLCAweDEwNDAwMDBhLCAweDAsCi0weDhjMDIwMjFjLCAweDM0NDIwMDA0LCAweGFmNDIwMDEwLCAweDhjMDIwMjIwLAotMHgzYzAzMDAwYSwgMHgzNDYzMDAwNCwgMHg0MzEwMjUsIDB4MTAwMDAwMDksCi0weGFmNDIwMDA4LCAweDhjMDIwMjIwLCAweDNjMDMwMDBhLCAweDM0NjMwMDA2LAotMHg0MzEwMjUsIDB4YWY0MjAwMDgsIDB4OGMwMjAyMWMsIDB4MzQ0MjAwMDYsCi0weGFmNDIwMDEwLCAweDI0MDIwMDAxLCAweGFmODIwMGEwLCAweGFmODIwMGIwLAotMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHhhZjgwMDBkMCwgMHhhZjgwMDBjMCwKLTB4MTAwMDAwMDIsIDB4MjQ2MzAwNjQsIDB4OGY4MjAwNTQsIDB4NjIxMDIzLAotMHgyYzQyMDA2NSwgMHgxNDQwZmZmYywgMHgwLCAweDhjMDQwMjA4LAotMHg4YzA1MDIwYywgMHgyNmUyMDAyOCwgMHhhZWUyMDAyMCwgMHgyNDAyMDQ5MCwKLTB4YWVlMjAwMTAsIDB4YWVlNDAwMDgsIDB4YWVlNTAwMGMsIDB4MjZlNDAwMDgsCi0weDhjODIwMDAwLCAweDhjODMwMDA0LCAweGFmODIwMDkwLCAweGFmODMwMDk0LAotMHg4YzgyMDAxOCwgMHhhZjgyMDBiNCwgMHg5NDgyMDAwYSwgMHhhZjgyMDA5YywKLTB4OGY0MjAwMTQsIDB4YWY4MjAwYjAsIDB4OGY4MjAwYjAsIDB4MzA0MjAwMDQsCi0weDE0NDBmZmZkLCAweDAsIDB4OGY4MjAwYjAsIDB4M2MwM2VmMDAsCi0weDQzMTAyNCwgMHgxMDQwMDAyMSwgMHgwLCAweDhmODIwMGI0LAotMHhhZmEyMDAxMCwgMHg4ZjgyMDA5MCwgMHg4ZjgzMDA5NCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDVjZDQsIDB4YWZhMzAwMTQsIDB4OGY4NjAwYjAsIDB4OGY4NzAwOWMsCi0weDNjMDUwMDAxLCAweGMwMDJiM2IsIDB4MzRhNTIwMGQsIDB4M2MwNDAwMDEsCi0weDI0ODQ1Y2UwLCAweDI0MDIwM2MwLCAweGFmYTIwMDEwLCAweGFmYTAwMDE0LAotMHg4Zjg2MDE0NCwgMHgzYzA3MDAwMSwgMHgyNGU3NWNlOCwgMHhjMDAyYjNiLAotMHgzNDA1ZGVhZCwgMHg4ZjgyMDExYywgMHgzNDQyMDAwMiwgMHhhZjgyMDExYywKLTB4OGY4MjAyMjAsIDB4MzQ0MjAwMDQsIDB4YWY4MjAyMjAsIDB4OGY4MjAxNDAsCi0weDNjMDMwMDAxLCAweDQzMTAyNSwgMHhhZjgyMDE0MCwgMHg5NmUyMDQ3MiwKLTB4OTZlNjA0NTIsIDB4OTZlNzA0NjIsIDB4YWZhMjAwMTAsIDB4OTZlMjA0ODIsCi0weDNjMDQwMDAxLCAweDI0ODQ1ZDE0LCAweDI0MDUxMjAwLCAweGMwMDJiM2IsCi0weGFmYTIwMDE0LCAweDk2ZjAwNDUyLCAweDMyMDIwMDAxLCAweDEwNDAwMDAyLAotMHhiMDIxLCAweDI0MTYwMDAxLCAweDMyMDIwMDAyLCAweDU0NDAwMDAxLAotMHgzNmQ2MDAwMiwgMHgzMjAyMDAwOCwgMHg1NDQwMDAwMSwgMHgzNmQ2MDAwNCwKLTB4MzIwMjAwMTAsIDB4NTQ0MDAwMDEsIDB4MzZkNjAwMDgsIDB4MzIwMjAwMjAsCi0weDU0NDAwMDAxLCAweDM2ZDYwMDEwLCAweDMyMDIwMDQwLCAweDU0NDAwMDAxLAotMHgzNmQ2MDAyMCwgMHgzMjAyMDA4MCwgMHg1NDQwMDAwMSwgMHgzNmQ2MDA0MCwKLTB4OTZlNjA0ODIsIDB4MzBjMjAyMDAsIDB4NTQ0MDAwMDEsIDB4MzZkNjQwMDAsCi0weDk2ZTMwNDcyLCAweDMwNjIwMjAwLCAweDEwNDAwMDAzLCAweDMwNjIwMTAwLAotMHgxMDAwMDAwMywgMHgzNmQ2MjAwMCwgMHg1NDQwMDAwMSwgMHgzNmQ2MTAwMCwKLTB4OTZmMDA0NjIsIDB4MzJjMjQwMDAsIDB4MTQ0MDAwMDQsIDB4MzIwNzAwOWIsCi0weDMwYzIwMDliLCAweDE0ZTIwMDA3LCAweDI0MGUwMDAxLCAweDMyYzIyMDAwLAotMHgxNDQwMDAwZCwgMHgzMjAyMDAwMSwgMHgzMDYyMDA5YiwgMHgxMGUyMDAwOSwKLTB4MjQwZTAwMDEsIDB4M2MwNDAwMDEsIDB4MjQ4NDVkMjAsIDB4MjQwNTEzMDAsCi0weDIwMDM4MjEsIDB4YTNhZTAwM2YsIDB4YWZhMzAwMTAsIDB4YzAwMmIzYiwKLTB4YWZhMDAwMTQsIDB4MzIwMjAwMDEsIDB4NTQ0MDAwMDEsIDB4MzZkNjAwODAsCi0weDMyMDIwMDAyLCAweDU0NDAwMDAxLCAweDM2ZDYwMTAwLCAweDMyMDIwMDA4LAotMHg1NDQwMDAwMSwgMHgzNmQ2MDIwMCwgMHgzMjAyMDAxMCwgMHg1NDQwMDAwMSwKLTB4MzZkNjA0MDAsIDB4MzIwMjAwODAsIDB4NTQ0MDAwMDEsIDB4MzZkNjA4MDAsCi0weDhjMDIwMjE4LCAweDMwNDIwMjAwLCAweDEwNDAwMDAyLCAweDNjMDIwMDA4LAotMHgyYzJiMDI1LCAweDhjMDIwMjE4LCAweDMwNDIwODAwLCAweDEwNDAwMDAyLAotMHgzYzAyMDA4MCwgMHgyYzJiMDI1LCAweDhjMDIwMjE4LCAweDMwNDIwNDAwLAotMHgxMDQwMDAwMiwgMHgzYzAyMDEwMCwgMHgyYzJiMDI1LCAweDhjMDIwMjE4LAotMHgzMDQyMDEwMCwgMHgxMDQwMDAwMiwgMHgzYzAyMDIwMCwgMHgyYzJiMDI1LAotMHg4YzAyMDIxOCwgMHgzMDQyMDA4MCwgMHgxMDQwMDAwMiwgMHgzYzAyMDQwMCwKLTB4MmMyYjAyNSwgMHg4YzAyMDIxOCwgMHgzMDQyMjAwMCwgMHgxMDQwMDAwMiwKLTB4M2MwMjAwMTAsIDB4MmMyYjAyNSwgMHg4YzAyMDIxOCwgMHgzMDQyNDAwMCwKLTB4MTA0MDAwMDIsIDB4M2MwMjAwMjAsIDB4MmMyYjAyNSwgMHg4YzAyMDIxOCwKLTB4MzA0MjEwMDAsIDB4MTA0MDAwMDIsIDB4M2MwMjAwNDAsIDB4MmMyYjAyNSwKLTB4OGVlMjA0OTgsIDB4OGVlMzA0OWMsIDB4YWY0MjAxNjAsIDB4YWY0MzAxNjQsCi0weDhlZTIwNGEwLCAweDhlZTMwNGE0LCAweGFmNDIwMTY4LCAweGFmNDMwMTZjLAotMHg4ZWUyMDRhOCwgMHg4ZWUzMDRhYywgMHhhZjQyMDE3MCwgMHhhZjQzMDE3NCwKLTB4OGVlMjA0MjgsIDB4OGVlMzA0MmMsIDB4YWY0MjAxNzgsIDB4YWY0MzAxN2MsCi0weDhlZTIwNDQ4LCAweDhlZTMwNDRjLCAweGFmNDIwMTgwLCAweGFmNDMwMTg0LAotMHg4ZWUyMDQ1OCwgMHg4ZWUzMDQ1YywgMHhhZjQyMDE4OCwgMHhhZjQzMDE4YywKLTB4OGVlMjA0NjgsIDB4OGVlMzA0NmMsIDB4YWY0MjAxOTAsIDB4YWY0MzAxOTQsCi0weDhlZTIwNDc4LCAweDhlZTMwNDdjLCAweGFmNDIwMTk4LCAweGFmNDMwMTljLAotMHg4ZWUyMDQ4OCwgMHg4ZWUzMDQ4YywgMHhhZjQyMDFhMCwgMHhhZjQzMDFhNCwKLTB4OGVlMjA0YjAsIDB4OGVlMzA0YjQsIDB4MjQwNDAwODAsIDB4YWY0MjAxYTgsCi0weGFmNDMwMWFjLCAweGMwMDJiYTgsIDB4MjQwNTAwODAsIDB4OGMwMjAyNWMsCi0weDI3NDQwMjI0LCAweGFmNDIwMWYwLCAweDhjMDIwMjYwLCAweDI0MDUwMjAwLAotMHgyNDA2MDAwOCwgMHhjMDAyYmJmLCAweGFmNDIwMWY4LCAweDNjMDQzYjlhLAotMHgzNDg0Y2EwMCwgMHgzODIxLCAweDI0MDIwMDA2LCAweDI0MDMwMDAyLAotMHhhZjQyMDFmNCwgMHgyNDAyMDNlOCwgMHhhZjQzMDIwNCwgMHhhZjQzMDIwMCwKLTB4YWY0NDAxZmMsIDB4YWY0MjAyOTQsIDB4MjQwMjAwMDEsIDB4YWY0MzAyOTAsCi0weGFmNDIwMjljLCAweDNjMDMwMDAxLCAweDY3MTgyMSwgMHg5MDYzNmNkOCwKLTB4MzQ3MTAyMSwgMHgyNGU3MDAwMSwgMHhhMDQzMDIyYywgMHgyY2UyMDAwZiwKLTB4MTQ0MGZmZjgsIDB4MzQ3MTgyMSwgMHgyNGU3MDAwMSwgMHgzYzA4MDAwMSwKLTB4MzUwODQwZjgsIDB4OGY4MjAwNDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVkMmMsCi0weDI0MDUxNDAwLCAweDIxNzAyLCAweDI0NDIwMDMwLCAweGEwNjIwMjJjLAotMHgzNDcxMDIxLCAweGEwNDAwMjJjLCAweDhjMDcwMjE4LCAweDJjMDMwMjEsCi0weDI0MDIwNWM4LCAweGFmYTIwMDEwLCAweGMwMDJiM2IsIDB4YWZhODAwMTQsCi0weDNjMDQwMDAxLCAweDI0ODQ1ZDM4LCAweDNjMDUwMDAwLCAweDI0YTU1YzgwLAotMHgyNDA2MDAxMCwgMHgyN2IxMDAzMCwgMHgyMjAzODIxLCAweDI3YjMwMDM0LAotMHhjMDAxN2EzLCAweGFmYjMwMDEwLCAweDNjMDMwMDAxLCAweDhjNjM2Y2M4LAotMHgxMDYwMDAwYSwgMHg0MDgwMjEsIDB4OGZhMzAwMzAsIDB4MjQwNWZmMDAsCi0weDhmYTIwMDM0LCAweDI0NjQwMGZmLCAweDg1MjAyNCwgMHg4MzE4MjMsCi0weDQzMTAyMywgMHhhZmEyMDAzNCwgMHhhZmE0MDAzMCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDVkNDQsIDB4M2MwNTAwMDAsIDB4MjRhNTQxMDAsIDB4MjQwNjAxMDgsCi0weDIyMDM4MjEsIDB4YzAwMTdhMywgMHhhZmIzMDAxMCwgMHg0MDkwMjEsCi0weDMyYzIwMDAzLCAweDNjMDEwMDAxLCAweGFjMzI2ZTgwLCAweDEwNDAwMDQ1LAotMHgyMjAzODIxLCAweDhmODIwMDUwLCAweDNjMDMwMDEwLCAweDQzMTAyNCwKLTB4MTA0MDAwMTYsIDB4MCwgMHg4YzAyMDIxOCwgMHgzMDQyMDA0MCwKLTB4MTA0MDAwMGYsIDB4MjQwMjAwMDEsIDB4OGY4MjAwNTAsIDB4OGMwMzAyMTgsCi0weDI0MGUwMDAxLCAweDNjMDQwMDAxLCAweDI0ODQ1ZDUwLCAweGEzYWUwMDNmLAotMHhhZmEyMDAxMCwgMHhhZmEzMDAxNCwgMHg4Zjg3MDA0MCwgMHgyNDA1MTUwMCwKLTB4YzAwMmIzYiwgMHgyYzAzMDIxLCAweDEwMDAwMDA0LCAweDAsCi0weDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDIyNDBmNCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDVkNWMsIDB4M2MwNTAwMDEsIDB4MjRhNTViNDAsIDB4M2MwNjAwMDEsCi0weDI0YzY1YmFjLCAweGM1MzAyMywgMHg4ZjQyMDAxMCwgMHgyN2IzMDAzMCwKLTB4MjYwMzgyMSwgMHgyN2IxMDAzNCwgMHgzNDQyMGEwMCwgMHhhZjQyMDAxMCwKLTB4YzAwMTdhMywgMHhhZmIxMDAxMCwgMHgzYzA0MDAwMSwgMHgyNDg0NWQ3MCwKLTB4M2MwNTAwMDEsIDB4MjRhNWI3MTQsIDB4M2MwNjAwMDEsIDB4MjRjNmJhOTAsCi0weGM1MzAyMywgMHgyNjAzODIxLCAweGFmNDIwMTA4LCAweGMwMDE3YTMsCi0weGFmYjEwMDEwLCAweDNjMDQwMDAxLCAweDI0ODQ1ZDhjLCAweDNjMDUwMDAxLAotMHgyNGE1YmU1OCwgMHgzYzA2MDAwMSwgMHgyNGM2YzkwMCwgMHhjNTMwMjMsCi0weDI2MDM4MjEsIDB4M2MwMTAwMDEsIDB4YWMyMjZlZjQsIDB4YzAwMTdhMywKLTB4YWZiMTAwMTAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVkYTQsIDB4MTAwMDAwMjQsCi0weDI0MDUxNjAwLCAweDNjMDQwMDAxLCAweDI0ODQ1ZGFjLCAweDNjMDUwMDAxLAotMHgyNGE1YTEwYywgMHgzYzA2MDAwMSwgMHgyNGM2YTIzOCwgMHhjNTMwMjMsCi0weGMwMDE3YTMsIDB4YWZiMzAwMTAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVkYmMsCi0weDNjMDUwMDAxLCAweDI0YTViMmIwLCAweDNjMDYwMDAxLCAweDI0YzZiNzBjLAotMHhjNTMwMjMsIDB4MjIwMzgyMSwgMHhhZjQyMDEwOCwgMHhjMDAxN2EzLAotMHhhZmIzMDAxMCwgMHgzYzA0MDAwMSwgMHgyNDg0NWRkMCwgMHgzYzA1MDAwMSwKLTB4MjRhNWJhOTgsIDB4M2MwNjAwMDEsIDB4MjRjNmJlNTAsIDB4YzUzMDIzLAotMHgyMjAzODIxLCAweDNjMDEwMDAxLCAweGFjMjI2ZWY0LCAweGMwMDE3YTMsCi0weGFmYjMwMDEwLCAweDNjMDQwMDAxLCAweDI0ODQ1ZGU0LCAweDI0MDUxNjUwLAotMHgyYzAzMDIxLCAweDM4MjEsIDB4M2MwMTAwMDEsIDB4YWMyMjZlZjgsCi0weGFmYTAwMDEwLCAweGMwMDJiM2IsIDB4YWZhMDAwMTQsIDB4MzJjMjAwMjAsCi0weDEwNDAwMDIxLCAweDI3YTcwMDMwLCAweDNjMDQwMDAxLCAweDI0ODQ1ZGYwLAotMHgzYzA1MDAwMSwgMHgyNGE1YjEzYywgMHgzYzA2MDAwMSwgMHgyNGM2YjJhOCwKLTB4YzUzMDIzLCAweDI0MDIyMDAwLCAweGFmNDIwMDFjLCAweDI3YTIwMDM0LAotMHhjMDAxN2EzLCAweGFmYTIwMDEwLCAweDIxOTAwLCAweDMxOTgyLAotMHgzYzA0MDgwMCwgMHg2NDE4MjUsIDB4YWU0MzAwMjgsIDB4MjQwMzAwMTAsCi0weGFmNDMwMDNjLCAweDk2ZTMwNDUwLCAweGFmNDMwMDQwLCAweDhmNDMwMDQwLAotMHgzYzA0MDAwMSwgMHgyNDg0NWUwNCwgMHhhZmEwMDAxNCwgMHhhZmEzMDAxMCwKLTB4OGY0NzAwMWMsIDB4MjQwNTE2NjAsIDB4M2MwMTAwMDEsIDB4YWMyMjZlZjAsCi0weDEwMDAwMDI1LCAweDMyYzYwMDIwLCAweDhlZTIwNDQ4LCAweDhlZTMwNDRjLAotMHhhZjQzMDAxYywgMHg4ZjQyMDAxYywgMHgyNDQyZTAwMCwgMHgyYzQyMjAwMSwKLTB4MTQ0MDAwMGEsIDB4MjQwZTAwMDEsIDB4M2MwNDAwMDEsIDB4MjQ4NDVlMTAsCi0weGEzYWUwMDNmLCAweGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhmNDYwMDFjLAotMHgyNDA1MTcwMCwgMHhjMDAyYjNiLCAweDM4MjEsIDB4M2MwMjAwMDAsCi0weDI0NDI1Y2JjLCAweDIxMTAwLCAweDIxMTgyLCAweDNjMDMwODAwLAotMHg0MzEwMjUsIDB4YWU0MjAwMjgsIDB4MjQwMjAwMDgsIDB4YWY0MjAwM2MsCi0weDk2ZTIwNDUwLCAweGFmNDIwMDQwLCAweDhmNDIwMDQwLCAweDNjMDQwMDAxLAotMHgyNDg0NWUxYywgMHhhZmEwMDAxNCwgMHhhZmEyMDAxMCwgMHg4ZjQ3MDAxYywKLTB4MjQwNTE4MDAsIDB4MzJjNjAwMjAsIDB4YzAwMmIzYiwgMHgwLAotMHgzYzA1MGZmZiwgMHgzYzAzMDAwMSwgMHg4YzYzNmVmNCwgMHgzNGE1ZmZmZiwKLTB4MjQwMzAyMSwgMHgzYzAyMDAwMSwgMHg4YzQyNmVmOCwgMHgzYzA0MDgwMCwKLTB4NjUxODI0LCAweDMxODgyLCAweDY0MTgyNSwgMHg0NTEwMjQsCi0weDIxMDgyLCAweDQ0MTAyNSwgMHhhY2MyMDA4MCwgMHgzMmMyMDE4MCwKLTB4MTA0MDAwNTYsIDB4YWNjMzAwMjAsIDB4OGY4MjAwNWMsIDB4M2MwMzAwODAsCi0weDQzMTAyNCwgMHgxMDQwMDAwZCwgMHgwLCAweDhmODIwMDUwLAotMHhhZmEyMDAxMCwgMHg4ZjgyMDA1YywgMHgyNDBlMDAwMSwgMHgzYzA0MDAwMSwKLTB4MjQ4NDVlMjgsIDB4YTNhZTAwM2YsIDB4YWZhMjAwMTQsIDB4OGY4NzAwNDAsCi0weDI0MDUxOTAwLCAweGMwMDJiM2IsIDB4MmMwMzAyMSwgMHg4ZjgyMDA1MCwKLTB4M2MwMzAwMTAsIDB4NDMxMDI0LCAweDEwNDAwMDE2LCAweDAsCi0weDhjMDIwMjE4LCAweDMwNDIwMDQwLCAweDEwNDAwMDBmLCAweDI0MDIwMDAxLAotMHg4ZjgyMDA1MCwgMHg4YzAzMDIxOCwgMHgyNDBlMDAwMSwgMHgzYzA0MDAwMSwKLTB4MjQ4NDVkNTAsIDB4YTNhZTAwM2YsIDB4YWZhMjAwMTAsIDB4YWZhMzAwMTQsCi0weDhmODcwMDQwLCAweDI0MDUyMDAwLCAweGMwMDJiM2IsIDB4MmMwMzAyMSwKLTB4MTAwMDAwMDQsIDB4MCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsCi0weGEwMjI0MGY0LCAweDNjMDQwMDAxLCAweDI0ODQ1ZTM0LCAweDNjMDUwMDAxLAotMHgyNGE1NWFjMCwgMHgzYzA2MDAwMSwgMHgyNGM2NWIzOCwgMHhjNTMwMjMsCi0weDhmNDIwMDA4LCAweDI3YjMwMDMwLCAweDI2MDM4MjEsIDB4MjdiMTAwMzQsCi0weDM0NDIwZTAwLCAweGFmNDIwMDA4LCAweGMwMDE3YTMsIDB4YWZiMTAwMTAsCi0weDNjMDQwMDAxLCAweDI0ODQ1ZTRjLCAweDNjMDUwMDAxLCAweDI0YTVkOGI0LAotMHgzYzA2MDAwMSwgMHgyNGM2ZTNjOCwgMHhjNTMwMjMsIDB4MjYwMzgyMSwKLTB4YWY0MjAxMGMsIDB4YzAwMTdhMywgMHhhZmIxMDAxMCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDVlNjQsIDB4M2MwNTAwMDEsIDB4MjRhNWU5YWMsIDB4M2MwNjAwMDEsCi0weDI0YzZmMGYwLCAweGM1MzAyMywgMHgyNjAzODIxLCAweDNjMDEwMDAxLAotMHhhYzIyNmYwNCwgMHhjMDAxN2EzLCAweGFmYjEwMDEwLCAweDNjMDQwMDAxLAotMHgyNDg0NWU3YywgMHgxMDAwMDAyNywgMHgyNDA1MjEwMCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDVlODQsIDB4M2MwNTAwMDEsIDB4MjRhNTlmYzgsIDB4M2MwNjAwMDEsCi0weDI0YzZhMTA0LCAweGM1MzAyMywgMHgyN2IxMDAzMCwgMHgyMjAzODIxLAotMHgyN2IzMDAzNCwgMHhjMDAxN2EzLCAweGFmYjMwMDEwLCAweDNjMDQwMDAxLAotMHgyNDg0NWU5NCwgMHgzYzA1MDAwMSwgMHgyNGE1Y2FkNCwgMHgzYzA2MDAwMSwKLTB4MjRjNmQ4YWMsIDB4YzUzMDIzLCAweDIyMDM4MjEsIDB4YWY0MjAxMGMsCi0weGMwMDE3YTMsIDB4YWZiMzAwMTAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVlYTQsCi0weDNjMDUwMDAxLCAweDI0YTVlODRjLCAweDNjMDYwMDAxLCAweDI0YzZlOWE0LAotMHhjNTMwMjMsIDB4MjIwMzgyMSwgMHgzYzAxMDAwMSwgMHhhYzIyNmYwNCwKLTB4YzAwMTdhMywgMHhhZmIzMDAxMCwgMHgzYzA0MDAwMSwgMHgyNDg0NWViOCwKLTB4MjQwNTIxNTAsIDB4MmMwMzAyMSwgMHgzODIxLCAweDNjMDEwMDAxLAotMHhhYzIyNmYxMCwgMHhhZmEwMDAxMCwgMHhjMDAyYjNiLCAweGFmYTAwMDE0LAotMHgzYzExMGZmZiwgMHgzYzAzMDAwMSwgMHg4YzYzNmYwNCwgMHgzNjMxZmZmZiwKLTB4MjQwOTgyMSwgMHgzYzAyMDAwMSwgMHg4YzQyNmYxMCwgMHgzYzBlMDgwMCwKLTB4NzExODI0LCAweDMxODgyLCAweDZlMTgyNSwgMHg1MTEwMjQsCi0weDIxMDgyLCAweDRlMTAyNSwgMHhhZTYzMDAzOCwgMHhhZTYyMDA3OCwKLTB4OGMwMjAyMTgsIDB4MzA0MjAwNDAsIDB4MTQ0MDAwMDQsIDB4MjQwMjAwMDEsCi0weDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDIyNDBmNCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDVlYzQsIDB4M2MwNTAwMDEsIDB4MjRhNWUzZDAsIDB4M2MwNjAwMDEsCi0weDI0YzZlNTJjLCAweGM1MzAyMywgMHgyN2JlMDAzMCwgMHgzYzAzODIxLAotMHgyN2I1MDAzNCwgMHhjMDAxN2EzLCAweGFmYjUwMDEwLCAweDNjMDEwMDAxLAotMHhhYzIyNmVmYywgMHg1MTEwMjQsIDB4MjEwODIsIDB4M2MwZTA4MDAsCi0weDRlMTAyNSwgMHhhZTYyMDA1MCwgMHgzMmMyMjAwMCwgMHgxMDQwMDAwNiwKLTB4M2MwMzgyMSwgMHgzYzAyMDAwMCwgMHgyNDQyNWNiYywgMHgyMjIxMDI0LAotMHgxMDAwMDAwZiwgMHgyMTA4MiwgMHgzYzA0MDAwMSwgMHgyNDg0NWVkOCwKLTB4M2MwNTAwMDEsIDB4MjRhNWU1MzQsIDB4M2MwNjAwMDEsIDB4MjRjNmU2ZTQsCi0weGM1MzAyMywgMHhjMDAxN2EzLCAweGFmYjUwMDEwLCAweDNjMDEwMDAxLAotMHhhYzIyNmYxNCwgMHg1MTEwMjQsIDB4MjEwODIsIDB4M2MwZTA4MDAsCi0weDRlMTAyNSwgMHhhZTYyMDA0OCwgMHgzMmMyNDAwMCwgMHgxMDQwMDAwNSwKLTB4MjdhNzAwMzAsIDB4M2MwMjAwMDAsIDB4MjQ0MjVjYmMsIDB4MTAwMDAwMGUsCi0weDIxMTAwLCAweDNjMDQwMDAxLCAweDI0ODQ1ZWYwLCAweDNjMDUwMDAxLAotMHgyNGE1ZTZlYywgMHgzYzA2MDAwMSwgMHgyNGM2ZTg0NCwgMHhjNTMwMjMsCi0weDI3YTIwMDM0LCAweGMwMDE3YTMsIDB4YWZhMjAwMTAsIDB4M2MwMTAwMDEsCi0weGFjMjI2ZjA4LCAweDIxMTAwLCAweDIxMTgyLCAweDNjMDMwODAwLAotMHg0MzEwMjUsIDB4YWU0MjAwNjAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVmMDgsCi0weDNjMDUwMDAxLCAweDI0YTU4MjMwLCAweDNjMDYwMDAxLCAweDI0YzY4NjUwLAotMHhjNTMwMjMsIDB4MjdiMTAwMzAsIDB4MjIwMzgyMSwgMHgyN2IzMDAzNCwKLTB4YzAwMTdhMywgMHhhZmIzMDAxMCwgMHgzYzBlMGZmZiwgMHgzNWNlZmZmZiwKLTB4M2MwNDAwMDEsIDB4MjQ4NDVmMTQsIDB4M2MwNTAwMDAsIDB4MjRhNTY0NjgsCi0weDNjMDYwMDAwLCAweDI0YzY2NTg4LCAweGM1MzAyMywgMHgyMjAzODIxLAotMHgyNDBmMDIxLCAweDNjMDEwMDAxLCAweGFjMjI2ZWRjLCAweDRlMTAyNCwKLTB4MjEwODIsIDB4M2MxNTA4MDAsIDB4NTUxMDI1LCAweGFmYWUwMDQ0LAotMHhhZmMyMDBiOCwgMHhjMDAxN2EzLCAweGFmYjMwMDEwLCAweDNjMDQwMDAxLAotMHgyNDg0NWYyMCwgMHgzYzA1MDAwMCwgMHgyNGE1NjU5MCwgMHgzYzA2MDAwMCwKLTB4MjRjNjY4MDgsIDB4OGZhZTAwNDQsIDB4YzUzMDIzLCAweDIyMDM4MjEsCi0weDNjMDEwMDAxLCAweGFjMjI2ZWQwLCAweDRlMTAyNCwgMHgyMTA4MiwKLTB4NTUxMDI1LCAweGFmYzIwMGU4LCAweGMwMDE3YTMsIDB4YWZiMzAwMTAsCi0weDNjMDQwMDAxLCAweDI0ODQ1ZjM4LCAweDNjMDUwMDAwLCAweDI0YTU2ODEwLAotMHgzYzA2MDAwMCwgMHgyNGM2Njk0MCwgMHg4ZmFlMDA0NCwgMHhjNTMwMjMsCi0weDIyMDM4MjEsIDB4M2MwMTAwMDEsIDB4YWMyMjZlYzgsIDB4NGUxMDI0LAotMHgyMTA4MiwgMHg1NTEwMjUsIDB4YWZjMjAwYzAsIDB4YzAwMTdhMywKLTB4YWZiMzAwMTAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVmNTAsIDB4M2MwNTAwMDEsCi0weDI0YTVmYWQwLCAweDNjMDYwMDAxLCAweDI0YzZmYmE4LCAweDhmYWUwMDQ0LAotMHhjNTMwMjMsIDB4MjIwMzgyMSwgMHgzYzAxMDAwMSwgMHhhYzIyNmVkNCwKLTB4NGUxMDI0LCAweDIxMDgyLCAweDU1MTAyNSwgMHhhZmMyMDBjOCwKLTB4YzAwMTdhMywgMHhhZmIzMDAxMCwgMHgzYzA0MDAwMSwgMHgyNDg0NWY1YywKLTB4M2MwNTAwMDEsIDB4MjRhNWM5M2MsIDB4M2MwNjAwMDEsIDB4MjRjNmNhMjAsCi0weGM1MzAyMywgMHgyMjAzODIxLCAweGFmNDIwMTEwLCAweGMwMDE3YTMsCi0weGFmYjMwMDEwLCAweDNjMDQwMDAxLCAweDI0ODQ1ZjZjLCAweDNjMDUwMDAxLAotMHgyNGE1YzkxMCwgMHgzYzA2MDAwMSwgMHgyNGM2YzkzNCwgMHhjNTMwMjMsCi0weDIyMDM4MjEsIDB4YWY0MjAxMjQsIDB4YzAwMTdhMywgMHhhZmIzMDAxMCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDVmN2MsIDB4M2MwNTAwMDEsIDB4MjRhNTVhODAsCi0weDNjMDYwMDAxLCAweDI0YzY1YWFjLCAweGM1MzAyMywgMHgyMjAzODIxLAotMHhhZjQyMDEyMCwgMHhhZjQyMDExNCwgMHhjMDAxN2EzLCAweGFmYjMwMDEwLAotMHgzYzA0MDAwMSwgMHgyNDg0NWY4OCwgMHgzYzA1MDAwMSwgMHgyNGE1ZjI5OCwKLTB4M2MwNjAwMDEsIDB4MjRjNmY2YjQsIDB4YzUzMDIzLCAweDIyMDM4MjEsCi0weGFmNDIwMTE4LCAweGMwMDE3YTMsIDB4YWZiMzAwMTAsIDB4OGZhZTAwNDQsCi0weDNjMDEwMDAxLCAweGFjMjI2ZjE4LCAweDRlMTAyNCwgMHgyMTA4MiwKLTB4NTUxMDI1LCAweGMwMDNmYzMsIDB4YWZjMjAwZDAsIDB4YzAwM2M0MCwKLTB4MCwgMHhjMDAyN2E4LCAweDAsIDB4YWMwMDAyMjgsCi0weGFjMDAwMjJjLCAweDk2ZTIwNDUwLCAweDI0NDJmZmZmLCAweGFmNDIwMDM4LAotMHg5NmUyMDQ2MCwgMHhhZjQyMDA4MCwgMHgzMmMyNDAwMCwgMHgxNDQwMDAwMywKLTB4MCwgMHg5NmUyMDQ4MCwgMHhhZjQyMDA4NCwgMHg5NmU3MDQ5MCwKLTB4NTBlMDAwMDEsIDB4MjQwNzA4MDAsIDB4MjRlMmZmZmYsIDB4YWY0MjAwODgsCi0weGFmNDIwMDdjLCAweDI0MDIwODAwLCAweDEwZTIwMDBmLCAweDMyYzI0MDAwLAotMHgxMDQwMDAwMywgMHgyNDAyMDQwMCwgMHgxMGUyMDAwYiwgMHgwLAotMHgyNDBlMDAwMSwgMHgzYzA0MDAwMSwgMHgyNDg0NWY5OCwgMHhhM2FlMDAzZiwKLTB4OTZlNjA0OTAsIDB4MjQwNTIxNzAsIDB4MmMwMzgyMSwgMHhhZmEwMDAxMCwKLTB4YzAwMmIzYiwgMHhhZmEwMDAxNCwgMHg4ZjQzMDEzOCwgMHg4ZjQ0MDEzOCwKLTB4MjQwMjAwMDEsIDB4YTM0MjA1YzIsIDB4YWY0MzAwOTQsIDB4YWY0NDAwOTgsCi0weGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhmNDYwMDgwLCAweDhmNDcwMDg0LAotMHgzYzA0MDAwMSwgMHgyNDg0NWZhNCwgMHhjMDAyYjNiLCAweDI0MDUyMjAwLAotMHhjMDAyNGE0LCAweDNjMTEwODAwLCAweDNjMTQzM2Q4LCAweDM2OTRjYjU4LAotMHgzYzAyMDgwMCwgMHgzNDQyMDA4MCwgMHgzYzA0MDAwMSwgMHgyNDg0NWZiMCwKLTB4M2MwNTAwMDAsIDB4MjRhNTVkMDAsIDB4M2MwNjAwMDAsIDB4MjRjNjVkMWMsCi0weGM1MzAyMywgMHgyN2E3MDAzMCwgMHhhZjgyMDA2MCwgMHgyNDAyZmZmZiwKLTB4YWY4MjAwNjQsIDB4MjdhMjAwMzQsIDB4YzAwMTdhMywgMHhhZmEyMDAxMCwKLTB4M2MwMTAwMDEsIDB4YWMyMjZlYjgsIDB4MjExMDAsIDB4MjExODIsCi0weDUxMTAyNSwgMHhjMDAxOGZjLCAweGFlNDIwMDAwLCAweDhmODIwMjQwLAotMHgzYzAzMDAwMSwgMHg0MzEwMjUsIDB4YWY4MjAyNDAsIDB4M2MwMjAwMDAsCi0weDI0NDI0MDM0LCAweGFmODIwMjQ0LCAweGFmODAwMjQwLCAweDhmODIwMDYwLAotMHg1MTEwMjQsIDB4MTQ0MDAwMDUsIDB4M2MwMzA4MDAsIDB4OGY4MjAwNjAsCi0weDQzMTAyNCwgMHgxMDQwZmZmZCwgMHgwLCAweGMwMDNjNGQsCi0weDg4MjEsIDB4M2MwMjAxMDAsIDB4YWZhMjAwMjAsIDB4OGY1MzAwMTgsCi0weDI0MDIwMGZmLCAweDU2NjIwMDAxLCAweDI2NzEwMDAxLCAweDhjMDIwMjI4LAotMHgxNjIyMDAwZSwgMHgxMzMwYzAsIDB4OGY0MjAzM2MsIDB4MjQ0MjAwMDEsCi0weGFmNDIwMzNjLCAweDhmNDIwMzNjLCAweDhjMDIwMjI4LCAweDNjMDQwMDAxLAotMHgyNDg0NWMyNCwgMHgzYzA1MDAwOSwgMHhhZmEwMDAxNCwgMHhhZmEyMDAxMCwKLTB4OGZhNjAwMjAsIDB4MTAwMDAwM2YsIDB4MzRhNTAxMDAsIDB4ZDcxMDIxLAotMHg4ZmEzMDAyMCwgMHg4ZmE0MDAyNCwgMHhhYzQzMDRjMCwgMHhhYzQ0MDRjNCwKLTB4YzAxODIxLCAweDhmNDQwMTc4LCAweDhmNDUwMTdjLCAweDEwMjEsCi0weDI0MDcwMDA0LCAweGFmYTcwMDEwLCAweGFmYjEwMDE0LCAweDhmNDgwMDBjLAotMHgyNGM2MDRjMCwgMHgyZTYzMDIxLCAweGFmYTgwMDE4LCAweDhmNDgwMTBjLAotMHgyNDA3MDAwOCwgMHhhMzI4MjEsIDB4YTM0ODJiLCAweDgyMjAyMSwKLTB4MTAwZjgwOSwgMHg4OTIwMjEsIDB4MTQ0MDAwMGIsIDB4MjQwNzAwMDgsCi0weDhmODIwMTIwLCAweGFmYTIwMDEwLCAweDhmODIwMTI0LCAweDNjMDQwMDAxLAotMHgyNDg0NWMyYywgMHgzYzA1MDAwOSwgMHhhZmEyMDAxNCwgMHg4ZmE2MDAyMCwKLTB4MTAwMDAwMWMsIDB4MzRhNTAyMDAsIDB4OGY0NDAxNjAsIDB4OGY0NTAxNjQsCi0weDhmNDMwMDBjLCAweGFmNTEwMDE4LCAweDhmODYwMTIwLCAweDI0MDIwMDEwLAotMHhhZmEyMDAxMCwgMHhhZmIxMDAxNCwgMHhhZmEzMDAxOCwgMHg4ZjQyMDEwYywKLTB4NDBmODA5LCAweDI0YzYwMDFjLCAweDE0NDAwMDEwLCAweDAsCi0weDhmNDIwMzQwLCAweDI0NDIwMDAxLCAweGFmNDIwMzQwLCAweDhmNDIwMzQwLAotMHg4ZjgyMDEyMCwgMHhhZmEyMDAxMCwgMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDVjMzQsIDB4M2MwNTAwMDksIDB4YWZhMjAwMTQsIDB4OGZhNjAwMjAsCi0weDM0YTUwMzAwLCAweGMwMDJiM2IsIDB4MjYwMzgyMSwgMHg4ZjQyMDJlNCwKLTB4MjQ0MjAwMDEsIDB4YWY0MjAyZTQsIDB4OGY0MjAyZTQsIDB4OTNhMjAwM2YsCi0weDEwNDAwMDY5LCAweDNjMDIwNzAwLCAweDM0NDIzMDAwLCAweGFmYTIwMDI4LAotMHg4ZjUzMDAxOCwgMHgyNDAyMDBmZiwgMHgxMjYyMDAwMiwgMHg4ODIxLAotMHgyNjcxMDAwMSwgMHg4YzAyMDIyOCwgMHgxNjIyMDAwZSwgMHgxMzMwYzAsCi0weDhmNDIwMzNjLCAweDI0NDIwMDAxLCAweGFmNDIwMzNjLCAweDhmNDIwMzNjLAotMHg4YzAyMDIyOCwgMHgzYzA0MDAwMSwgMHgyNDg0NWMyNCwgMHgzYzA1MDAwOSwKLTB4YWZhMDAwMTQsIDB4YWZhMjAwMTAsIDB4OGZhNjAwMjgsIDB4MTAwMDAwM2YsCi0weDM0YTUwMTAwLCAweGQ3MTAyMSwgMHg4ZmEzMDAyOCwgMHg4ZmE0MDAyYywKLTB4YWM0MzA0YzAsIDB4YWM0NDA0YzQsIDB4YzAxODIxLCAweDhmNDQwMTc4LAotMHg4ZjQ1MDE3YywgMHgxMDIxLCAweDI0MDcwMDA0LCAweGFmYTcwMDEwLAotMHhhZmIxMDAxNCwgMHg4ZjQ4MDAwYywgMHgyNGM2MDRjMCwgMHgyZTYzMDIxLAotMHhhZmE4MDAxOCwgMHg4ZjQ4MDEwYywgMHgyNDA3MDAwOCwgMHhhMzI4MjEsCi0weGEzNDgyYiwgMHg4MjIwMjEsIDB4MTAwZjgwOSwgMHg4OTIwMjEsCi0weDE0NDAwMDBiLCAweDI0MDcwMDA4LCAweDhmODIwMTIwLCAweGFmYTIwMDEwLAotMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwgMHgyNDg0NWMyYywgMHgzYzA1MDAwOSwKLTB4YWZhMjAwMTQsIDB4OGZhNjAwMjgsIDB4MTAwMDAwMWMsIDB4MzRhNTAyMDAsCi0weDhmNDQwMTYwLCAweDhmNDUwMTY0LCAweDhmNDMwMDBjLCAweGFmNTEwMDE4LAotMHg4Zjg2MDEyMCwgMHgyNDAyMDAxMCwgMHhhZmEyMDAxMCwgMHhhZmIxMDAxNCwKLTB4YWZhMzAwMTgsIDB4OGY0MjAxMGMsIDB4NDBmODA5LCAweDI0YzYwMDFjLAotMHgxNDQwMDAxMCwgMHgwLCAweDhmNDIwMzQwLCAweDI0NDIwMDAxLAotMHhhZjQyMDM0MCwgMHg4ZjQyMDM0MCwgMHg4ZjgyMDEyMCwgMHhhZmEyMDAxMCwKLTB4OGY4MjAxMjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDVjMzQsIDB4M2MwNTAwMDksCi0weGFmYTIwMDE0LCAweDhmYTYwMDI4LCAweDM0YTUwMzAwLCAweGMwMDJiM2IsCi0weDI2MDM4MjEsIDB4OGY0MjAyZjAsIDB4MjQ0MjAwMDEsIDB4YWY0MjAyZjAsCi0weDhmNDIwMmYwLCAweDNjMDQwMDAxLCAweDI0ODQ1ZmMwLCAweGFmYTAwMDEwLAotMHhhZmEwMDAxNCwgMHg4ZmE2MDAyOCwgMHgyNDA1MjMwMCwgMHhjMDAyYjNiLAotMHgzODIxLCAweDEwMDAwMDA0LCAweDAsIDB4OGMwMjAyNjQsCi0weDEwNDAwMDA1LCAweDAsIDB4OGY4MjAwYTAsIDB4MzA0MjAwMDQsCi0weDE0NDBmZmZhLCAweDAsIDB4OGY4MjAwNDQsIDB4MzQ0MjAwMDQsCi0weGFmODIwMDQ0LCAweDhmNDIwMzA4LCAweDI0NDIwMDAxLCAweGFmNDIwMzA4LAotMHg4ZjQyMDMwOCwgMHg4ZjgyMDBkOCwgMHg4ZjgzMDBkNCwgMHg0MzEwMjMsCi0weDI0NDJmZjgwLCAweGFmNDIwMDkwLCAweDhmNDIwMDkwLCAweDI4NDJmZjgxLAotMHgxMDQwMDAwNiwgMHgyNDAyMDAwMSwgMHg4ZjQyMDA5MCwgMHg4ZjQzMDE0NCwKLTB4NDMxMDIxLCAweGFmNDIwMDkwLCAweDI0MDIwMDAxLCAweGFmNDIwMDhjLAotMHgzMmMyMDAwOCwgMHgxMDQwMDAwNiwgMHgwLCAweDhmODIwMjE0LAotMHgzYzAzODEwMCwgMHgzMDQyZmZmZiwgMHg0MzEwMjUsIDB4YWY4MjAyMTQsCi0weDNjMDMwMDAxLCAweDhjNjM2ZDk0LCAweDMwNjIwMDAyLCAweDEwNDAwMDA5LAotMHgzMDYyMDAwMSwgMHgzYzA0MDAwMSwgMHgyNDg0NWZjYywgMHgzYzA1MDAwMCwKLTB4MjRhNTZkNTAsIDB4M2MwNjAwMDAsIDB4MjRjNjcxYzgsIDB4MTAwMDAwMTIsCi0weGM1MzAyMywgMHgxMDQwMDAwOSwgMHgwLCAweDNjMDQwMDAxLAotMHgyNDg0NWZkYywgMHgzYzA1MDAwMCwgMHgyNGE1NzFkMCwgMHgzYzA2MDAwMCwKLTB4MjRjNjc2NzgsIDB4MTAwMDAwMDgsIDB4YzUzMDIzLCAweDNjMDQwMDAxLAotMHgyNDg0NWZlYywgMHgzYzA1MDAwMCwgMHgyNGE1Njk0OCwgMHgzYzA2MDAwMCwKLTB4MjRjNjZkNDgsIDB4YzUzMDIzLCAweDI3YTcwMDMwLCAweDI3YTIwMDM0LAotMHhjMDAxN2EzLCAweGFmYTIwMDEwLCAweDNjMDEwMDAxLCAweGFjMjI2ZWNjLAotMHgzYzAyMDAwMSwgMHg4YzQyNmVjYywgMHgzYzAzMDgwMCwgMHgyMTEwMCwKLTB4MjExODIsIDB4NDMxMDI1LCAweGFlNDIwMDQwLCAweDhmODIwMGEwLAotMHhhZmEyMDAxMCwgMHg4ZjgyMDBiMCwgMHhhZmEyMDAxNCwgMHg4Zjg2MDA1YywKLTB4OGY4NzAxMWMsIDB4M2MwNDAwMDEsIDB4MjQ4NDVmZmMsIDB4M2MwMTAwMDEsCi0weGFjMzY2ZWE0LCAweDNjMDEwMDAxLCAweGFjMjA2ZTk0LCAweDNjMDEwMDAxLAotMHhhYzNjNmU4YywgMHgzYzAxMDAwMSwgMHhhYzNiNmViYywgMHgzYzAxMDAwMSwKLTB4YWMzNzZlYzAsIDB4M2MwMTAwMDEsIDB4YWMzYTZlYTAsIDB4YzAwMmIzYiwKLTB4MjQwNTI0MDAsIDB4OGY4MjAyMDAsIDB4YWZhMjAwMTAsIDB4OGY4MjAyMjAsCi0weGFmYTIwMDE0LCAweDhmODYwMDQ0LCAweDhmODcwMDUwLCAweDNjMDQwMDAxLAotMHgyNDg0NjAwOCwgMHhjMDAyYjNiLCAweDI0MDUyNTAwLCAweDhmODMwMDYwLAotMHg3NDEwMGIsIDB4MjQyMDAwYSwgMHgyMDBmODIxLCAweDAsCi0weGQsIDB4OGZiZjAwNjAsIDB4OGZiZTAwNWMsIDB4OGZiNTAwNTgsCi0weDhmYjMwMDU0LCAweDhmYjIwMDUwLCAweDhmYjEwMDRjLCAweDhmYjAwMDQ4LAotMHgzZTAwMDA4LCAweDI3YmQwMDY4LCAweDI3YmRmZmUwLCAweDNjMDQwMDAxLAotMHgyNDg0NjAxNCwgMHgyNDA1MjYwMCwgMHgzMDIxLCAweDM4MjEsCi0weGFmYmYwMDE4LCAweGFmYTAwMDEwLCAweGMwMDJiM2IsIDB4YWZhMDAwMTQsCi0weDhmYmYwMDE4LCAweDNlMDAwMDgsIDB4MjdiZDAwMjAsIDB4M2UwMDAwOCwKLTB4MCwgMHgzZTAwMDA4LCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4M2UwMDAwOCwgMHgwLCAweDNlMDAwMDgsIDB4MCwKLTB4MjdiZGZkZTAsIDB4MjdhNTAwMTgsIDB4M2MwNGRlYWQsIDB4MzQ4NGJlZWYsCi0weGFmYmYwMjE4LCAweDhmODIwMTUwLCAweDNjMDMwMDFmLCAweDM0NjNmZmZmLAotMHhhZmE0MDAxOCwgMHhhMjI4MjMsIDB4YTMyODI0LCAweDhjYTIwMDAwLAotMHgxMDQ0MDAwYSwgMHgwLCAweGFmYTUwMDEwLCAweDhjYTIwMDAwLAotMHhhZmEyMDAxNCwgMHg4Zjg2MDE1MCwgMHg4Zjg3MDI1MCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDYwMWMsIDB4YzAwMmIzYiwgMHgyNDA1MjcwMCwgMHg4ZmJmMDIxOCwKLTB4M2UwMDAwOCwgMHgyN2JkMDIyMCwgMHgyN2JkZmZlMCwgMHgzYzA2YWJiYSwKLTB4MzRjNmJhYmUsIDB4YWZiMDAwMTgsIDB4M2MxMDAwMDQsIDB4M2MwNzAwN2YsCi0weDM0ZTdmZmZmLCAweGFmYmYwMDFjLCAweDEwMjg0MCwgMHg4ZTA0MDAwMCwKLTB4OGNhMzAwMDAsIDB4YWNhMDAwMDAsIDB4YWUwNjAwMDAsIDB4OGNhMjAwMDAsCi0weGFjYTMwMDAwLCAweDEwNDYwMDA1LCAweGFlMDQwMDAwLCAweGEwODAyMSwKLTB4ZjAxMDJiLCAweDEwNDBmZmY1LCAweDEwMjg0MCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDYwMjgsIDB4MjQwNTI4MDAsIDB4MjAwMzAyMSwgMHgzODIxLAotMHhhZmEwMDAxMCwgMHhjMDAyYjNiLCAweGFmYTAwMDE0LCAweDIwMDEwMjEsCi0weDhmYmYwMDFjLCAweDhmYjAwMDE4LCAweDNlMDAwMDgsIDB4MjdiZDAwMjAsCi0weDhjMDIwMjI0LCAweDMwNDcwMDNmLCAweDEwZTAwMDEwLCAweDgwMzAyMSwKLTB4MjgyMSwgMHgyNDAzMDAyMCwgMHhlMzEwMjQsIDB4MTA0MDAwMDIsCi0weDYzMDQyLCAweGE2MjgyMSwgMHgzMTg0MiwgMHgxNDYwZmZmYiwKLTB4ZTMxMDI0LCAweDI0MDJmMDAwLCAweGEyMjgyNCwgMHgzNDAyZmZmZiwKLTB4NDUxMDJiLCAweDE0NDAwMDAzLCAweDNjMDIwMDAxLCAweDEwMDAwMDA4LAotMHgzYzAyMDAwMSwgMHgzNDQyZmZmZiwgMHg4NTE4MjMsIDB4NDMxMDJiLAotMHgxNDQwMDAwMywgMHhhMDEwMjEsIDB4M2MwMmZmZmUsIDB4ODIxMDIxLAotMHgzZTAwMDA4LCAweDAsIDB4MjdiZGZmZDAsIDB4YWZiNTAwMjgsCi0weDhmYjUwMDQwLCAweGFmYjIwMDIwLCAweGEwOTAyMSwgMHhhZmIxMDAxYywKLTB4MjRjNjAwMDMsIDB4YWZiZjAwMmMsIDB4YWZiMzAwMjQsIDB4YWZiMDAwMTgsCi0weDhlYTIwMDAwLCAweDI0MDNmZmZjLCAweGMzODAyNCwgMHg1MDEwMmIsCi0weDE0NDAwMDFiLCAweGUwODgyMSwgMHg4ZTMzMDAwMCwgMHhhZmIwMDAxMCwKLTB4OGVhMjAwMDAsIDB4YWZhMjAwMTQsIDB4OGUyNzAwMDAsIDB4MjQwNTMwMDAsCi0weGMwMDJiM2IsIDB4MjQwMzAyMSwgMHg4ZTIzMDAwMCwgMHg3MDIwMjEsCi0weDY0MTAyYiwgMHgxMDQwMDAwNywgMHgyNDAyODIxLCAweDhjYTIwMDAwLAotMHhhYzYyMDAwMCwgMHgyNDYzMDAwNCwgMHg2NDEwMmIsIDB4MTQ0MGZmZmIsCi0weDI0YTUwMDA0LCAweDhlYTIwMDAwLCAweDUwMTAyMywgMHhhZWEyMDAwMCwKLTB4OGUyMjAwMDAsIDB4NTAxMDIxLCAweDEwMDAwMDBiLCAweGFlMjIwMDAwLAotMHgyNDAyMDAyZCwgMHhhMDgyMDAwMCwgMHhhZmIwMDAxMCwgMHg4ZWEyMDAwMCwKLTB4MjQwOTgyMSwgMHhhZmEyMDAxNCwgMHg4ZTI3MDAwMCwgMHgyNDA1MzEwMCwKLTB4YzAwMmIzYiwgMHgyNjAzMDIxLCAweDI2MDEwMjEsIDB4OGZiZjAwMmMsCi0weDhmYjUwMDI4LCAweDhmYjMwMDI0LCAweDhmYjIwMDIwLCAweDhmYjEwMDFjLAotMHg4ZmIwMDAxOCwgMHgzZTAwMDA4LCAweDI3YmQwMDMwLCAweDI3YmRmZmU4LAotMHgzYzFjYzAwMCwgMHgzYzA1ZmZmZSwgMHgzYzAzMDAwMSwgMHg4YzYzNmU4NCwKLTB4M2MwNDAwMDEsIDB4OGM4NDZlOTAsIDB4MzRhNWJmMDgsIDB4MjQwMjFmZmMsCi0weDNjMDEwMDAxLCAweGFjMjI2Y2QwLCAweDNjMDIwMGMwLCAweDNjMDEwMDAxLAotMHhhYzIyNmNkNCwgMHgzYzAyMDAyMCwgMHhhZmJmMDAxMCwgMHgzYzAxMDBjMCwKLTB4YWMyMDFmZmMsIDB4NDMxMDIzLCAweDQ0MTAyMywgMHgyNDViYjAwMCwKLTB4MzY1YjgyMSwgMHgzYzFkMDAwMSwgMHg4ZmJkNmNjYywgMHgzYTBmMDIxLAotMHgzYzA0MDBjMCwgMHgzNDg0MDIwMCwgMHgzYzFhMDBjMCwgMHgzYzAzMDBjMCwKLTB4MzQ2MzA3YzgsIDB4MjQwMjFkZmMsIDB4M2MwMTAwMDEsIDB4YWMyMjZjZDAsCi0weDI0MDIxODM0LCAweDNjMDEwMDAxLCAweGFjMjQ2Y2Q0LCAweDNjMDEwMDAxLAotMHhhYzIyNmNkMCwgMHgzYzAxMDAwMSwgMHhhYzIzNmNkNCwgMHhjMDAxODBkLAotMHgzNzVhMDIwMCwgMHg4ZmJmMDAxMCwgMHgzZTAwMDA4LCAweDI3YmQwMDE4LAotMHgyN2JkZmZjOCwgMHgzYzA0MDAwMSwgMHgyNDg0NjAzNCwgMHgyNDA1MzIwMCwKLTB4M2MwMjAwMDEsIDB4OGM0MjZjZDAsIDB4M2MwMzAwMDEsIDB4OGM2MzZjZDQsCi0weDMwMjEsIDB4MzYwMzgyMSwgMHhhZmJmMDAzMCwgMHhhZmIzMDAyYywKLTB4YWZiMjAwMjgsIDB4YWZiMTAwMjQsIDB4YWZiMDAwMjAsIDB4YWZhMjAwMWMsCi0weGFmYTMwMDE4LCAweGFmYjcwMDEwLCAweGMwMDJiM2IsIDB4YWZiYTAwMTQsCi0weGMwMDE5MTYsIDB4MCwgMHg4ZjgyMDI0MCwgMHgzNDQyMDAwNCwKLTB4YWY4MjAyNDAsIDB4MjQwMjAwMDEsIDB4YWY0MjAwMDAsIDB4M2MwMjAwMDEsCi0weDU3MTAyMSwgMHg5MDQyNDBmNCwgMHgxMDQwMDA5MiwgMHgyNDAzZmZmYywKLTB4M2MxMDAwMDEsIDB4MjYxMGFjNzMsIDB4M2MxMjAwMDEsIDB4MjY1MmE4NGMsCi0weDIxMjEwMjMsIDB4NDM4MDI0LCAweDhmYTMwMDFjLCAweDNjMDQwMDAxLAotMHgyNDg0NjA0MCwgMHg3MDEwMmIsIDB4MTQ0MDAwMWEsIDB4MjdiMzAwMTgsCi0weDhmYjEwMDE4LCAweDI0MDUzMDAwLCAweDI0MDMwMjEsIDB4YWZiMDAwMTAsCi0weGFmYTMwMDE0LCAweGMwMDJiM2IsIDB4MjIwMzgyMSwgMHg4ZmEzMDAxOCwKLTB4NzAyMDIxLCAweDY0MTAyYiwgMHgxMDQwMDAwNywgMHgyNDAzMDIxLAotMHg4Y2MyMDAwMCwgMHhhYzYyMDAwMCwgMHgyNDYzMDAwNCwgMHg2NDEwMmIsCi0weDE0NDBmZmZiLCAweDI0YzYwMDA0LCAweDhmYTIwMDFjLCAweDUwMTAyMywKLTB4YWZhMjAwMWMsIDB4OGU2MjAwMDAsIDB4NTAxMDIxLCAweDEwMDAwMDBhLAotMHhhZTYyMDAwMCwgMHgyNDA4ODIxLCAweDI0MDUzMTAwLCAweGFmYjAwMDEwLAotMHhhZmEzMDAxNCwgMHg4ZmE3MDAxOCwgMHgyMjAzMDIxLCAweDI0MDIwMDJkLAotMHhjMDAyYjNiLCAweGEwODIwMDAwLCAweDI0MDcwMDIwLCAweDhmYTMwMDFjLAotMHgzYzA0MDAwMSwgMHgyNDg0NjA1YywgMHgyNDEyMDAyMCwgMHgzYzAxMDAwMSwKLTB4YWMzMTZlYjAsIDB4MmM2MjAwMjAsIDB4MTQ0MDAwMWQsIDB4MjdiMTAwMTgsCi0weDhmYjAwMDE4LCAweDI0MDUzMDAwLCAweDNjMDYwMDAxLCAweDI0YzY2ZjUwLAotMHhhZmE3MDAxMCwgMHhhZmEzMDAxNCwgMHhjMDAyYjNiLCAweDIwMDM4MjEsCi0weDhmYTMwMDE4LCAweDNjMDQwMDAxLCAweDI0ODQ2ZjUwLCAweDI0NjUwMDIwLAotMHg2NTEwMmIsIDB4MTA0MDAwMDcsIDB4MCwgMHg4YzgyMDAwMCwKLTB4YWM2MjAwMDAsIDB4MjQ2MzAwMDQsIDB4NjUxMDJiLCAweDE0NDBmZmZiLAotMHgyNDg0MDAwNCwgMHg4ZmEyMDAxYywgMHg1MjEwMjMsIDB4YWZhMjAwMWMsCi0weDhlMjIwMDAwLCAweDUyMTAyMSwgMHgxMDAwMDAwYiwgMHhhZTIyMDAwMCwKLTB4M2MxMDAwMDEsIDB4MjYxMDZmNTAsIDB4MjQwNTMxMDAsIDB4YWZhNzAwMTAsCi0weGFmYTMwMDE0LCAweDhmYTcwMDE4LCAweDIwMDMwMjEsIDB4MjQwMjAwMmQsCi0weGMwMDJiM2IsIDB4YTA4MjAwMDAsIDB4MjQwNzAwMjAsIDB4M2MwNDAwMDEsCi0weDI0ODQ2MDcwLCAweDhmYTMwMDFjLCAweDI0MTIwMDIwLCAweDNjMDEwMDAxLAotMHhhYzMwNmVlNCwgMHgyYzYyMDAyMCwgMHgxNDQwMDAxZCwgMHgyN2IxMDAxOCwKLTB4OGZiMDAwMTgsIDB4MjQwNTMwMDAsIDB4M2MwNjAwMDEsIDB4MjRjNjZmNzAsCi0weGFmYTcwMDEwLCAweGFmYTMwMDE0LCAweGMwMDJiM2IsIDB4MjAwMzgyMSwKLTB4OGZhMzAwMTgsIDB4M2MwNDAwMDEsIDB4MjQ4NDZmNzAsIDB4MjQ2NTAwMjAsCi0weDY1MTAyYiwgMHgxMDQwMDAwNywgMHgwLCAweDhjODIwMDAwLAotMHhhYzYyMDAwMCwgMHgyNDYzMDAwNCwgMHg2NTEwMmIsIDB4MTQ0MGZmZmIsCi0weDI0ODQwMDA0LCAweDhmYTIwMDFjLCAweDUyMTAyMywgMHhhZmEyMDAxYywKLTB4OGUyMjAwMDAsIDB4NTIxMDIxLCAweDEwMDAwMDBiLCAweGFlMjIwMDAwLAotMHgzYzEwMDAwMSwgMHgyNjEwNmY3MCwgMHgyNDA1MzEwMCwgMHhhZmE3MDAxMCwKLTB4YWZhMzAwMTQsIDB4OGZhNzAwMTgsIDB4MjAwMzAyMSwgMHgyNDAyMDAyZCwKLTB4YzAwMmIzYiwgMHhhMDgyMDAwMCwgMHgzYzAxMDAwMSwgMHgxMDAwMDAzMSwKLTB4YWMzMDZlZTAsIDB4M2MxMDAwMDEsIDB4MjYxMDgyMWYsIDB4M2MxMjAwMDEsCi0weDI2NTI4MDljLCAweDIxMjEwMjMsIDB4NDM4MDI0LCAweDhmYTMwMDFjLAotMHgzYzA0MDAwMSwgMHgyNDg0NjA4NCwgMHg3MDEwMmIsIDB4MTQ0MDAwMWEsCi0weDI3YjMwMDE4LCAweDhmYjEwMDE4LCAweDI0MDUzMDAwLCAweDI0MDMwMjEsCi0weGFmYjAwMDEwLCAweGFmYTMwMDE0LCAweGMwMDJiM2IsIDB4MjIwMzgyMSwKLTB4OGZhMzAwMTgsIDB4NzAyMDIxLCAweDY0MTAyYiwgMHgxMDQwMDAwNywKLTB4MjQwMzAyMSwgMHg4Y2MyMDAwMCwgMHhhYzYyMDAwMCwgMHgyNDYzMDAwNCwKLTB4NjQxMDJiLCAweDE0NDBmZmZiLCAweDI0YzYwMDA0LCAweDhmYTIwMDFjLAotMHg1MDEwMjMsIDB4YWZhMjAwMWMsIDB4OGU2MjAwMDAsIDB4NTAxMDIxLAotMHgxMDAwMDAwYSwgMHhhZTYyMDAwMCwgMHgyNDA4ODIxLCAweDI0MDUzMTAwLAotMHhhZmIwMDAxMCwgMHhhZmEzMDAxNCwgMHg4ZmE3MDAxOCwgMHgyMjAzMDIxLAotMHgyNDAyMDAyZCwgMHhjMDAyYjNiLCAweGEwODIwMDAwLCAweDNjMDEwMDAxLAotMHhhYzMxNmViMCwgMHgzYzAzMDAwMSwgMHg4YzYzNmViMCwgMHgyNDAyMDQwMCwKLTB4NjBmODA5LCAweGFmODIwMDcwLCAweDhmYmYwMDMwLCAweDhmYjMwMDJjLAotMHg4ZmIyMDAyOCwgMHg4ZmIxMDAyNCwgMHg4ZmIwMDAyMCwgMHgzZTAwMDA4LAotMHgyN2JkMDAzOCwgMHgwLCAweDAsIDB4OGY4MjAwNDAsCi0weDNjMDNmMDAwLCAweDQzMTAyNCwgMHgzYzAzNjAwMCwgMHgxNDQzMDAwNiwKLTB4MCwgMHg4ZjgyMDA1MCwgMHgyNDAzZmY4MCwgMHg0MzEwMjQsCi0weDM0NDIwMDU1LCAweGFmODIwMDUwLCAweDhmODIwMDU0LCAweDI0NDIwM2U4LAotMHhhZjgyMDA1OCwgMHgyNDAyMDFmNCwgMHhhZjQyMDBlMCwgMHgyNDAyMDAwNCwKLTB4YWY0MjAwZTgsIDB4MjQwMjAwMDIsIDB4YWY0MDAxYjAsIDB4YWY0MDAwZTQsCi0weGFmNDIwMGRjLCAweGFmNDAwMGQ4LCAweGFmNDAwMGQ0LCAweDNlMDAwMDgsCi0weGFmNDAwMGQwLCAweDhmODIwMDU0LCAweDI0NDIwMDA1LCAweDNlMDAwMDgsCi0weGFmODIwMDc4LCAweDI3YmRmZmU4LCAweGFmYmYwMDEwLCAweDhmODIwMDU0LAotMHgyNDQyMDNlOCwgMHhhZjgyMDA1OCwgMHgzYzAyMDgwMCwgMHgyYzIxMDI0LAotMHgxMDQwMDAwNCwgMHgzYzAyZjdmZiwgMHgzNDQyZmZmZiwgMHgyYzJiMDI0LAotMHgzNjk0MDA0MCwgMHgzYzAyMDAwMSwgMHg4YzQyNmRhOCwgMHgxMDQwMDAxNywKLTB4M2MwMjAyMDAsIDB4M2MwMzAwMDEsIDB4OGM2MzZmMWMsIDB4MTA2MDAwMTYsCi0weDI4MmEwMjUsIDB4M2MwMjAwMDEsIDB4OGM0MjZlNDQsIDB4MTQ0MDAwMTIsCi0weDNjMDIwMjAwLCAweDNjMDIwMDAxLCAweDhjNDI2ZDk0LCAweDMwNDIwMDAzLAotMHgxNDQwMDAwZCwgMHgzYzAyMDIwMCwgMHg4ZjgzMDIyNCwgMHgzYzAyMDAwMiwKLTB4OGM0MjhmZWMsIDB4MTA2MjAwMDgsIDB4M2MwMjAyMDAsIDB4YzAwM2RhZiwKLTB4MCwgMHgxMDAwMDAwNCwgMHgzYzAyMDIwMCwgMHhjMDA0MTk2LAotMHgwLCAweDNjMDIwMjAwLCAweDJjMjEwMjQsIDB4MTA0MDAwMDMsCi0weDAsIDB4YzAwMWY0YiwgMHgwLCAweDhmNDIwMGQ4LAotMHg4ZjQzMDBkYywgMHgyNDQyMDAwMSwgMHhhZjQyMDBkOCwgMHg0MzEwMmIsCi0weDE0NDAwMDAzLCAweDAsIDB4YWY0MDAwZDgsIDB4MzY5NDAwODAsCi0weDhjMDMwMjM4LCAweDEwNjAwMDBjLCAweDAsIDB4OGY0MjAxYjAsCi0weDI0NDIwM2U4LCAweGFmNDIwMWIwLCAweDQzMTAyYiwgMHgxNDQwMDAwNiwKLTB4MCwgMHg5MzQyMDVjNSwgMHgxNDQwMDAwMywgMHgwLAotMHhjMDAxZGEwLCAweDAsIDB4OGZiZjAwMTAsIDB4M2UwMDAwOCwKLTB4MjdiZDAwMTgsIDB4M2UwMDAwOCwgMHgwLCAweDI3YmRmZmQ4LAotMHhhZmJmMDAyMCwgMHg4ZjQzMDAyYywgMHg4ZjQyMDAzOCwgMHgxMDYyMDA1OSwKLTB4MCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OTA0MjQwZjAsCi0weDEwNDAwMDI2LCAweDI0MDcwMDA4LCAweDhmNDQwMTcwLCAweDhmNDUwMTc0LAotMHg4ZjQ4MDAwYywgMHg4Zjg2MDEyMCwgMHgyNDAyMDAyMCwgMHhhZmEyMDAxMCwKLTB4YWZhMzAwMTQsIDB4YWZhODAwMTgsIDB4OGY0MjAxMGMsIDB4NDBmODA5LAotMHgyNGM2MDAxYywgMHgxNDQwMDAxMSwgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwKLTB4MzcwODIxLCAweGEwMjI0MGYwLCAweDhmODIwMTI0LCAweGFmYTIwMDEwLAotMHg4ZjgyMDEyOCwgMHgzYzA0MDAwMSwgMHgyNDg0NjEyOCwgMHhhZmEyMDAxNCwKLTB4OGY0NjAwMmMsIDB4OGY4NzAxMjAsIDB4M2MwNTAwMDksIDB4YzAwMmIzYiwKLTB4MzRhNTA5MDAsIDB4MTAwMDAwNWMsIDB4MCwgMHg4ZjQyMDMwMCwKLTB4MjQ0MjAwMDEsIDB4YWY0MjAzMDAsIDB4OGY0MjAzMDAsIDB4OGY0MjAwMmMsCi0weGEzNDAwNWMxLCAweDEwMDAwMDI3LCAweGFmNDIwMDM4LCAweDhmNDQwMTcwLAotMHg4ZjQ1MDE3NCwgMHg4ZjQzMDAyYywgMHg4ZjQ4MDAwYywgMHg4Zjg2MDEyMCwKLTB4MjQwMjAwODAsIDB4YWZhMjAwMTAsIDB4YWZhMzAwMTQsIDB4YWZhODAwMTgsCi0weDhmNDIwMTBjLCAweDQwZjgwOSwgMHgyNGM2MDAxYywgMHgxNDQwMDAxMSwKLTB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMjI0MGYxLAotMHg4ZjgyMDEyNCwgMHhhZmEyMDAxMCwgMHg4ZjgyMDEyOCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDYxMzQsIDB4YWZhMjAwMTQsIDB4OGY0NjAwMmMsIDB4OGY4NzAxMjAsCi0weDNjMDUwMDA5LCAweGMwMDJiM2IsIDB4MzRhNTExMDAsIDB4MTAwMDAwMzYsCi0weDAsIDB4OGY0MjAzMDAsIDB4OGY0MzAwMmMsIDB4MjQ0MjAwMDEsCi0weGFmNDIwMzAwLCAweDhmNDIwMzAwLCAweDI0MDIwMDAxLCAweGEzNDIwNWMxLAotMHhhZjQzMDAzOCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YTAyMDQwZjEsCi0weDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDIwNDBmMCwgMHgxMDAwMDAyNiwKLTB4YWY0MDAwMzQsIDB4OTM0MjA1YzEsIDB4MTA0MDAwMWQsIDB4MCwKLTB4YTM0MDA1YzEsIDB4OGY4MjAwNDAsIDB4MzA0MjAwMDEsIDB4MTQ0MDAwMDgsCi0weDIwMjEsIDB4OGMwMzAxMDQsIDB4MjQwMjAwMDEsIDB4NTA2MjAwMDUsCi0weDI0MDQwMDAxLCAweDhjMDIwMjY0LCAweDEwNDAwMDAzLCAweDgwMTAyMSwKLTB4MjQwNDAwMDEsIDB4ODAxMDIxLCAweDEwNDAwMDA2LCAweDAsCi0weDhmNDIwMzBjLCAweDI0NDIwMDAxLCAweGFmNDIwMzBjLCAweDEwMDAwMDA4LAotMHg4ZjQyMDMwYywgMHg4ZjgyMDA0NCwgMHgzNDQyMDAwNCwgMHhhZjgyMDA0NCwKLTB4OGY0MjAzMDgsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzMDgsIDB4OGY0MjAzMDgsCi0weDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDIwNDBmMCwgMHgzYzAxMDAwMSwKLTB4MzcwODIxLCAweGEwMjA0MGYxLCAweDhmNDIwMDAwLCAweDEwNDAwMDA3LAotMHgwLCAweGFmODAwMDRjLCAweDhmODIwMDRjLCAweDEwNDBmZmZkLAotMHgwLCAweDEwMDAwMDA1LCAweDAsIDB4YWY4MDAwNDgsCi0weDhmODIwMDQ4LCAweDEwNDBmZmZkLCAweDAsIDB4OGY4MjAwNjAsCi0weDNjMDNmZjdmLCAweDM0NjNmZmZmLCAweDQzMTAyNCwgMHhhZjgyMDA2MCwKLTB4OGY0MjAwMDAsIDB4MTA0MDAwMDMsIDB4MCwgMHgxMDAwMDAwMiwKLTB4YWY4MDAwNGMsIDB4YWY4MDAwNDgsIDB4OGZiZjAwMjAsIDB4M2UwMDAwOCwKLTB4MjdiZDAwMjgsIDB4M2UwMDAwOCwgMHgwLCAweDI3YmRmZmQ4LAotMHhhZmJmMDAyMCwgMHg4ZjQzMDA0NCwgMHg4ZjQyMDA3YywgMHgxMDYyMDAyOSwKLTB4MjQwNzAwMDgsIDB4OGY0NDAxNjgsIDB4OGY0NTAxNmMsIDB4OGY0ODAwMGMsCi0weDhmODYwMTIwLCAweDI0MDIwMDQwLCAweGFmYTIwMDEwLCAweGFmYTMwMDE0LAotMHhhZmE4MDAxOCwgMHg4ZjQyMDEwYywgMHg0MGY4MDksIDB4MjRjNjAwMWMsCi0weDE0NDAwMDExLCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweDM3MDgyMSwKLTB4YTAyMjQwZjIsIDB4OGY4MjAxMjQsIDB4YWZhMjAwMTAsIDB4OGY4MjAxMjgsCi0weDNjMDQwMDAxLCAweDI0ODQ2MTNjLCAweGFmYTIwMDE0LCAweDhmNDYwMDQ0LAotMHg4Zjg3MDEyMCwgMHgzYzA1MDAwOSwgMHhjMDAyYjNiLCAweDM0YTUxMzAwLAotMHgxMDAwMDAwZiwgMHgwLCAweDhmNDIwMzA0LCAweDI0NDIwMDAxLAotMHhhZjQyMDMwNCwgMHg4ZjQyMDMwNCwgMHg4ZjQyMDA0NCwgMHhhZjQyMDA3YywKLTB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMjA0MGYyLCAweDEwMDAwMDA0LAotMHhhZjQwMDA3OCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YTAyMDQwZjIsCi0weDhmNDIwMDAwLCAweDEwNDAwMDA3LCAweDAsIDB4YWY4MDAwNGMsCi0weDhmODIwMDRjLCAweDEwNDBmZmZkLCAweDAsIDB4MTAwMDAwMDUsCi0weDAsIDB4YWY4MDAwNDgsIDB4OGY4MjAwNDgsIDB4MTA0MGZmZmQsCi0weDAsIDB4OGY4MjAwNjAsIDB4M2MwM2ZlZmYsIDB4MzQ2M2ZmZmYsCi0weDQzMTAyNCwgMHhhZjgyMDA2MCwgMHg4ZjQyMDAwMCwgMHgxMDQwMDAwMywKLTB4MCwgMHgxMDAwMDAwMiwgMHhhZjgwMDA0YywgMHhhZjgwMDA0OCwKLTB4OGZiZjAwMjAsIDB4M2UwMDAwOCwgMHgyN2JkMDAyOCwgMHgzZTAwMDA4LAotMHgwLCAweDNjMDIwMDAxLCAweDhjNDI2ZGE4LCAweDI3YmRmZmE4LAotMHhhZmJmMDA1MCwgMHhhZmJlMDA0YywgMHhhZmI1MDA0OCwgMHhhZmIzMDA0NCwKLTB4YWZiMjAwNDAsIDB4YWZiMTAwM2MsIDB4YWZiMDAwMzgsIDB4MTA0MDAwZDUsCi0weDhmOTAwMDQ0LCAweDhmNDIwMGQwLCAweDI0NDMwMDAxLCAweDI4NDIwMDBiLAotMHgxNDQwMDBlNCwgMHhhZjQzMDBkMCwgMHg4ZjQyMDAwNCwgMHgzMDQyMDAwMiwKLTB4MTQ0MDAwOWMsIDB4YWY0MDAwZDAsIDB4OGY0MjAwMDQsIDB4M2MwMzAwMDEsCi0weDhjNjM2ZDk4LCAweDM0NDIwMDAyLCAweGFmNDIwMDA0LCAweDI0MDIwMDAxLAotMHgxNDYyMDAwMywgMHgzYzAyMDYwMCwgMHgxMDAwMDAwMiwgMHgzNDQyMzAwMCwKLTB4MzQ0MjEwMDAsIDB4YWZhMjAwMjAsIDB4OGY0YTAwMTgsIDB4YWZhYTAwMzQsCi0weDI3YWEwMDIwLCAweGFmYWEwMDJjLCAweDhmYWEwMDM0LCAweDI0MDIwMGZmLAotMHgxMTQyMDAwMiwgMHgxODIxLCAweDI1NDMwMDAxLCAweDhjMDIwMjI4LAotMHg2MDk4MjEsIDB4MTY2MjAwMGUsIDB4M2MwNTAwMDksIDB4OGY0MjAzM2MsCi0weDI0NDIwMDAxLCAweGFmNDIwMzNjLCAweDhmNDIwMzNjLCAweDhjMDIwMjI4LAotMHg4ZmE3MDAzNCwgMHgzYzA0MDAwMSwgMHgyNDg0NjEwYywgMHhhZmEwMDAxNCwKLTB4YWZhMjAwMTAsIDB4OGZhNjAwMjAsIDB4MTAwMDAwNzAsIDB4MzRhNTA1MDAsCi0weDhmYWEwMDM0LCAweGEzOGMwLCAweGY3MTAyMSwgMHg4ZmEzMDAyMCwKLTB4OGZhNDAwMjQsIDB4YWM0MzA0YzAsIDB4YWM0NDA0YzQsIDB4OGY4MzAwNTQsCi0weDhmODIwMDU0LCAweDI0NzEwM2U4LCAweDIyMjEwMjMsIDB4MmM0MjAzZTksCi0weDEwNDAwMDFiLCAweGE4MjEsIDB4ZTA5MDIxLCAweDI2NWUwNGMwLAotMHg4ZjQ0MDE3OCwgMHg4ZjQ1MDE3YywgMHgyNDAxODIxLCAweDI0MGEwMDA0LAotMHhhZmFhMDAxMCwgMHhhZmIzMDAxNCwgMHg4ZjQ4MDAwYywgMHgxMDIxLAotMHgyZmUzMDIxLCAweGFmYTgwMDE4LCAweDhmNDgwMTBjLCAweDI0MDcwMDA4LAotMHhhMzI4MjEsIDB4YTM0ODJiLCAweDgyMjAyMSwgMHgxMDBmODA5LAotMHg4OTIwMjEsIDB4NTQ0MDAwMDYsIDB4MjQxNTAwMDEsIDB4OGY4MjAwNTQsCi0weDIyMjEwMjMsIDB4MmM0MjAzZTksIDB4MTQ0MGZmZTksIDB4MCwKLTB4MzJhMjAwZmYsIDB4NTQ0MDAwMTgsIDB4YWY1MzAwMTgsIDB4OGY0MjAzNzgsCi0weDI0NDIwMDAxLCAweGFmNDIwMzc4LCAweDhmNDIwMzc4LCAweDhmODIwMTIwLAotMHg4ZmFhMDAyYywgMHg4ZmE3MDAzNCwgMHhhZmEyMDAxMCwgMHg4ZjgyMDEyNCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDYxMTgsIDB4YWZhMjAwMTQsIDB4OGQ0NjAwMDAsCi0weDNjMDUwMDA5LCAweDEwMDAwMDM1LCAweDM0YTUwNjAwLCAweDhmNDIwMzA4LAotMHgyNDE1MDAwMSwgMHgyNDQyMDAwMSwgMHhhZjQyMDMwOCwgMHg4ZjQyMDMwOCwKLTB4MTAwMDAwMWUsIDB4MzJhMjAwZmYsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsCi0weDI0NzEwM2U4LCAweDIyMjEwMjMsIDB4MmM0MjAzZTksIDB4MTA0MDAwMTYsCi0weGE4MjEsIDB4M2MxZTAwMjAsIDB4MjQxMjAwMTAsIDB4OGY0MjAwMGMsCi0weDhmNDQwMTYwLCAweDhmNDUwMTY0LCAweDhmODYwMTIwLCAweGFmYjIwMDEwLAotMHhhZmIzMDAxNCwgMHg1ZTEwMjUsIDB4YWZhMjAwMTgsIDB4OGY0MjAxMGMsCi0weDI0MDcwMDA4LCAweDQwZjgwOSwgMHgyNGM2MDAxYywgMHgxNDQwZmZlMywKLTB4MCwgMHg4ZjgyMDA1NCwgMHgyMjIxMDIzLCAweDJjNDIwM2U5LAotMHgxNDQwZmZlZSwgMHgwLCAweDMyYTIwMGZmLCAweDE0NDAwMDExLAotMHgzYzA1MDAwOSwgMHg4ZjQyMDM3OCwgMHgyNDQyMDAwMSwgMHhhZjQyMDM3OCwKLTB4OGY0MjAzNzgsIDB4OGY4MjAxMjAsIDB4OGZhYTAwMmMsIDB4OGZhNzAwMzQsCi0weGFmYTIwMDEwLCAweDhmODIwMTI0LCAweDNjMDQwMDAxLCAweDI0ODQ2MTIwLAotMHhhZmEyMDAxNCwgMHg4ZDQ2MDAwMCwgMHgzNGE1MDcwMCwgMHhjMDAyYjNiLAotMHgwLCAweDhmNDIwMmVjLCAweDI0NDIwMDAxLCAweGFmNDIwMmVjLAotMHg4ZjQyMDJlYywgMHg4ZjQyMDAwNCwgMHgzMDQyMDAwMSwgMHg1MDQwMDAyOSwKLTB4MzYxMDAwNDAsIDB4M2MwMjA0MDAsIDB4MmMyMTAyNCwgMHgxMDQwMDAxMywKLTB4MjQwNGZmZGYsIDB4OGY0MjAyNTAsIDB4OGY0MzAyNTQsIDB4OGY0NDAxYjQsCi0weDE0NjQwMDA2LCAweDM2MTAwMDQwLCAweDhmNDIwMjcwLCAweDhmNDMwMjc0LAotMHg4ZjQ0MDFiOCwgMHgxMDY0MDAwNywgMHgyNDAyZmZkZiwgMHg4ZjQyMDI1MCwKLTB4OGY0MzAyNTQsIDB4OGY0NDAyNzAsIDB4OGY0NTAyNzQsIDB4MTAwMDAwMTIsCi0weDNhMTAwMDIwLCAweDEwMDAwMDJiLCAweDIwMjgwMjQsIDB4OGY0MjAyNTAsCi0weDhmNDMwMjU0LCAweDhmNDUwMWI0LCAweDE0NjUwMDA2LCAweDIwNDgwMjQsCi0weDhmNDIwMjcwLCAweDhmNDMwMjc0LCAweDhmNDQwMWI4LCAweDUwNjQwMDIxLAotMHgzNjEwMDA0MCwgMHg4ZjQyMDI1MCwgMHg4ZjQzMDI1NCwgMHg4ZjQ0MDI3MCwKLTB4OGY0NTAyNzQsIDB4M2ExMDAwNDAsIDB4YWY0MzAxYjQsIDB4MTAwMDAwMTksCi0weGFmNDUwMWI4LCAweDhmNDIwMGQ0LCAweDI0NDMwMDAxLCAweDEwMDAwMDExLAotMHgyODQyMDAzMywgMHg4ZjQyMDAwNCwgMHgzMDQyMDAwMSwgMHgxMDQwMDAwOSwKLTB4M2MwMjA0MDAsIDB4MmMyMTAyNCwgMHgxMDQwMDAwNCwgMHgyNDAyZmZkZiwKLTB4MjAyODAyNCwgMHgxMDAwMDAwYiwgMHgzNjEwMDA0MCwgMHgxMDAwMDAwOSwKLTB4MzYxMDAwNjAsIDB4OGY0MjAwZDQsIDB4MzYxMDAwNDAsIDB4MjQ0MzAwMDEsCi0weDI4NDIwMWY1LCAweDE0NDAwMDAzLCAweGFmNDMwMGQ0LCAweGFmNDAwMGQ0LAotMHgzYTEwMDAyMCwgMHhhZjkwMDA0NCwgMHgyNDAyZmY3ZiwgMHgyODJhMDI0LAotMHg4ZmJmMDA1MCwgMHg4ZmJlMDA0YywgMHg4ZmI1MDA0OCwgMHg4ZmIzMDA0NCwKLTB4OGZiMjAwNDAsIDB4OGZiMTAwM2MsIDB4OGZiMDAwMzgsIDB4M2UwMDAwOCwKLTB4MjdiZDAwNTgsIDB4M2UwMDAwOCwgMHgwLCAweDNjMDIwMDAxLAotMHg4YzQyNmRhOCwgMHgyN2JkZmZiMCwgMHhhZmJmMDA0OCwgMHhhZmJlMDA0NCwKLTB4YWZiNTAwNDAsIDB4YWZiMzAwM2MsIDB4YWZiMjAwMzgsIDB4YWZiMTAwMzQsCi0weDEwNDAwMGM3LCAweGFmYjAwMDMwLCAweDhmNDIwMGQwLCAweDI0NDMwMDAxLAotMHgyODQyMDAwYiwgMHgxNDQwMDBkYSwgMHhhZjQzMDBkMCwgMHg4ZjQyMDAwNCwKLTB4MzA0MjAwMDIsIDB4MTQ0MDAwOTcsIDB4YWY0MDAwZDAsIDB4OGY0MjAwMDQsCi0weDNjMDMwMDAxLCAweDhjNjM2ZDk4LCAweDM0NDIwMDAyLCAweGFmNDIwMDA0LAotMHgyNDAyMDAwMSwgMHgxNDYyMDAwMywgMHgzYzAyMDYwMCwgMHgxMDAwMDAwMiwKLTB4MzQ0MjMwMDAsIDB4MzQ0MjEwMDAsIDB4YWZhMjAwMjAsIDB4MTgyMSwKLTB4OGY1ZTAwMTgsIDB4MjdhYTAwMjAsIDB4MjQwMjAwZmYsIDB4MTNjMjAwMDIsCi0weGFmYWEwMDJjLCAweDI3YzMwMDAxLCAweDhjMDIwMjI4LCAweDYwOTAyMSwKLTB4MTY0MjAwMGUsIDB4MWUzOGMwLCAweDhmNDIwMzNjLCAweDI0NDIwMDAxLAotMHhhZjQyMDMzYywgMHg4ZjQyMDMzYywgMHg4YzAyMDIyOCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDYxMGMsIDB4M2MwNTAwMDksIDB4YWZhMDAwMTQsIDB4YWZhMjAwMTAsCi0weDhmYTYwMDIwLCAweDEwMDAwMDZkLCAweDM0YTUwNTAwLCAweGY3MTAyMSwKLTB4OGZhMzAwMjAsIDB4OGZhNDAwMjQsIDB4YWM0MzA0YzAsIDB4YWM0NDA0YzQsCi0weDhmODMwMDU0LCAweDhmODIwMDU0LCAweDI0NzAwM2U4LCAweDIwMjEwMjMsCi0weDJjNDIwM2U5LCAweDEwNDAwMDFiLCAweDk4MjEsIDB4ZTA4ODIxLAotMHgyNjM1MDRjMCwgMHg4ZjQ0MDE3OCwgMHg4ZjQ1MDE3YywgMHgyMjAxODIxLAotMHgyNDBhMDAwNCwgMHhhZmFhMDAxMCwgMHhhZmIyMDAxNCwgMHg4ZjQ4MDAwYywKLTB4MTAyMSwgMHgyZjUzMDIxLCAweGFmYTgwMDE4LCAweDhmNDgwMTBjLAotMHgyNDA3MDAwOCwgMHhhMzI4MjEsIDB4YTM0ODJiLCAweDgyMjAyMSwKLTB4MTAwZjgwOSwgMHg4OTIwMjEsIDB4NTQ0MDAwMDYsIDB4MjQxMzAwMDEsCi0weDhmODIwMDU0LCAweDIwMjEwMjMsIDB4MmM0MjAzZTksIDB4MTQ0MGZmZTksCi0weDAsIDB4MzI2MjAwZmYsIDB4NTQ0MDAwMTcsIDB4YWY1MjAwMTgsCi0weDhmNDIwMzc4LCAweDI0NDIwMDAxLCAweGFmNDIwMzc4LCAweDhmNDIwMzc4LAotMHg4ZjgyMDEyMCwgMHg4ZmFhMDAyYywgMHhhZmEyMDAxMCwgMHg4ZjgyMDEyNCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDYxMTgsIDB4M2MwNTAwMDksIDB4YWZhMjAwMTQsCi0weDhkNDYwMDAwLCAweDEwMDAwMDM1LCAweDM0YTUwNjAwLCAweDhmNDIwMzA4LAotMHgyNDEzMDAwMSwgMHgyNDQyMDAwMSwgMHhhZjQyMDMwOCwgMHg4ZjQyMDMwOCwKLTB4MTAwMDAwMWUsIDB4MzI2MjAwZmYsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsCi0weDI0NzAwM2U4LCAweDIwMjEwMjMsIDB4MmM0MjAzZTksIDB4MTA0MDAwMTYsCi0weDk4MjEsIDB4M2MxNTAwMjAsIDB4MjQxMTAwMTAsIDB4OGY0MjAwMGMsCi0weDhmNDQwMTYwLCAweDhmNDUwMTY0LCAweDhmODYwMTIwLCAweGFmYjEwMDEwLAotMHhhZmIyMDAxNCwgMHg1NTEwMjUsIDB4YWZhMjAwMTgsIDB4OGY0MjAxMGMsCi0weDI0MDcwMDA4LCAweDQwZjgwOSwgMHgyNGM2MDAxYywgMHgxNDQwZmZlMywKLTB4MCwgMHg4ZjgyMDA1NCwgMHgyMDIxMDIzLCAweDJjNDIwM2U5LAotMHgxNDQwZmZlZSwgMHgwLCAweDMyNjIwMGZmLCAweDE0NDAwMDExLAotMHgwLCAweDhmNDIwMzc4LCAweDI0NDIwMDAxLCAweGFmNDIwMzc4LAotMHg4ZjQyMDM3OCwgMHg4ZjgyMDEyMCwgMHg4ZmFhMDAyYywgMHhhZmEyMDAxMCwKLTB4OGY4MjAxMjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDYxMjAsIDB4M2MwNTAwMDksCi0weGFmYTIwMDE0LCAweDhkNDYwMDAwLCAweDM0YTUwNzAwLCAweGMwMDJiM2IsCi0weDNjMDM4MjEsIDB4OGY0MjAyZWMsIDB4MjQ0MjAwMDEsIDB4YWY0MjAyZWMsCi0weDhmNDIwMmVjLCAweDhmNDIwMDA0LCAweDMwNDIwMDAxLCAweDEwNDAwMDE4LAotMHgyNDA0MDAwMSwgMHg4ZjQyMDI1MCwgMHg4ZjQzMDI1NCwgMHg4ZjQ1MDFiNCwKLTB4M2MwMTAwMDEsIDB4MTQ2NTAwMDYsIDB4YTAyNDZjZjEsIDB4OGY0MjAyNzAsCi0weDhmNDMwMjc0LCAweDhmNDQwMWI4LCAweDEwNjQwMDIxLCAweDAsCi0weDhmNDIwMjUwLCAweDhmNDMwMjU0LCAweDNjMDQwMDAxLCAweDkwODQ2Y2YwLAotMHg4ZjQ2MDI3MCwgMHg4ZjQ3MDI3NCwgMHgzODg0MDAwMSwgMHhhZjQzMDFiNCwKLTB4YWY0NzAxYjgsIDB4M2MwMTAwMDEsIDB4MTAwMDAwMjUsIDB4YTAyNDZjZjAsCi0weDhmNDIwMGQ0LCAweDNjMDEwMDAxLCAweGEwMjA2Y2YwLCAweDI0NDMwMDAxLAotMHgyODQyMDAzMywgMHgxNDQwMDAxZSwgMHhhZjQzMDBkNCwgMHgzYzAyMDAwMSwKLTB4OTA0MjZjZjEsIDB4YWY0MDAwZDQsIDB4MTAwMDAwMTcsIDB4Mzg0MjAwMDEsCi0weDhmNDIwMDA0LCAweDMwNDIwMDAxLCAweDEwNDAwMDA4LCAweDAsCi0weGMwMDU2NWEsIDB4MjAyMSwgMHgzYzAxMDAwMSwgMHhhMDIwNmNmMSwKLTB4M2MwMTAwMDEsIDB4MTAwMDAwMGUsIDB4YTAyMDZjZjAsIDB4OGY0MjAwZDQsCi0weDNjMDEwMDAxLCAweGEwMjA2Y2YwLCAweDI0NDMwMDAxLCAweDI4NDIwMWY1LAotMHgxNDQwMDAwNywgMHhhZjQzMDBkNCwgMHgzYzAyMDAwMSwgMHg5MDQyNmNmMSwKLTB4YWY0MDAwZDQsIDB4NDIxMDI2LCAweDNjMDEwMDAxLCAweGEwMjI2Y2YxLAotMHgzYzAzMDAwMSwgMHg4YzYzNmQ5OCwgMHgyNDAyMDAwMiwgMHgxNDYyMDAwYywKLTB4M2MwMzAwMDIsIDB4M2MwMzAwMDEsIDB4OTA2MzZjZjEsIDB4MjQwMjAwMDEsCi0weDU0NjIwMDFmLCAweDIwMjEsIDB4M2MwMjAwMDEsIDB4OTA0MjZjZjAsCi0weDE0NDMwMDFiLCAweDI0MDQwMDA1LCAweDEwMDAwMDE5LCAweDI0MDQwMDA2LAotMHgzYzAyMDAwMiwgMHg4YzQyOGZmNCwgMHg0MzEwMjQsIDB4MTA0MDAwMGIsCi0weDI0MDIwMDAxLCAweDNjMDMwMDAxLCAweDkwNjM2Y2YxLCAweDU0NjIwMDEwLAotMHgyMDIxLCAweDNjMDIwMDAxLCAweDkwNDI2Y2YwLCAweDE0NDMwMDBjLAotMHgyNDA0MDAwMywgMHgxMDAwMDAwYSwgMHgyNDA0MDAwNCwgMHgzYzAzMDAwMSwKLTB4OTA2MzZjZjEsIDB4MTQ2MjAwMDYsIDB4MjAyMSwgMHgzYzAyMDAwMSwKLTB4OTA0MjZjZjAsIDB4MjQwNDAwMDEsIDB4NTA0NDAwMDEsIDB4MjQwNDAwMDIsCi0weGMwMDU2NWEsIDB4MCwgMHgyNDAyZmY3ZiwgMHgyODJhMDI0LAotMHg4ZmJmMDA0OCwgMHg4ZmJlMDA0NCwgMHg4ZmI1MDA0MCwgMHg4ZmIzMDAzYywKLTB4OGZiMjAwMzgsIDB4OGZiMTAwMzQsIDB4OGZiMDAwMzAsIDB4M2UwMDAwOCwKLTB4MjdiZDAwNTAsIDB4M2UwMDAwOCwgMHgwLCAweDNjMDIwMDAxLAotMHg4YzQyNmRhOCwgMHgyN2JkZmZiMCwgMHhhZmJmMDA0OCwgMHhhZmJlMDA0NCwKLTB4YWZiNTAwNDAsIDB4YWZiMzAwM2MsIDB4YWZiMjAwMzgsIDB4YWZiMTAwMzQsCi0weDEwNDAwMGRlLCAweGFmYjAwMDMwLCAweDhmNDIwMGQwLCAweDNjMDQwMDAxLAotMHg4Yzg0NmQ5OCwgMHgyNDQzMDAwMSwgMHgyODQyMDAwYiwgMHhhZjQ0MDBlOCwKLTB4MTQ0MDAwZmUsIDB4YWY0MzAwZDAsIDB4OGY0MjAwMDQsIDB4MzA0MjAwMDIsCi0weDE0NDAwMDk1LCAweGFmNDAwMGQwLCAweDhmNDIwMDA0LCAweDM0NDIwMDAyLAotMHhhZjQyMDAwNCwgMHgyNDAyMDAwMSwgMHgxNDgyMDAwMywgMHgzYzAyMDYwMCwKLTB4MTAwMDAwMDIsIDB4MzQ0MjMwMDAsIDB4MzQ0MjEwMDAsIDB4YWZhMjAwMjAsCi0weDE4MjEsIDB4OGY1ZTAwMTgsIDB4MjdhYTAwMjAsIDB4MjQwMjAwZmYsCi0weDEzYzIwMDAyLCAweGFmYWEwMDJjLCAweDI3YzMwMDAxLCAweDhjMDIwMjI4LAotMHg2MDkwMjEsIDB4MTY0MjAwMGUsIDB4MWUzOGMwLCAweDhmNDIwMzNjLAotMHgyNDQyMDAwMSwgMHhhZjQyMDMzYywgMHg4ZjQyMDMzYywgMHg4YzAyMDIyOCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDYxMGMsIDB4M2MwNTAwMDksIDB4YWZhMDAwMTQsCi0weGFmYTIwMDEwLCAweDhmYTYwMDIwLCAweDEwMDAwMDZkLCAweDM0YTUwNTAwLAotMHhmNzEwMjEsIDB4OGZhMzAwMjAsIDB4OGZhNDAwMjQsIDB4YWM0MzA0YzAsCi0weGFjNDQwNGM0LCAweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDI0NzAwM2U4LAotMHgyMDIxMDIzLCAweDJjNDIwM2U5LCAweDEwNDAwMDFiLCAweDk4MjEsCi0weGUwODgyMSwgMHgyNjM1MDRjMCwgMHg4ZjQ0MDE3OCwgMHg4ZjQ1MDE3YywKLTB4MjIwMTgyMSwgMHgyNDBhMDAwNCwgMHhhZmFhMDAxMCwgMHhhZmIyMDAxNCwKLTB4OGY0ODAwMGMsIDB4MTAyMSwgMHgyZjUzMDIxLCAweGFmYTgwMDE4LAotMHg4ZjQ4MDEwYywgMHgyNDA3MDAwOCwgMHhhMzI4MjEsIDB4YTM0ODJiLAotMHg4MjIwMjEsIDB4MTAwZjgwOSwgMHg4OTIwMjEsIDB4NTQ0MDAwMDYsCi0weDI0MTMwMDAxLCAweDhmODIwMDU0LCAweDIwMjEwMjMsIDB4MmM0MjAzZTksCi0weDE0NDBmZmU5LCAweDAsIDB4MzI2MjAwZmYsIDB4NTQ0MDAwMTcsCi0weGFmNTIwMDE4LCAweDhmNDIwMzc4LCAweDI0NDIwMDAxLCAweGFmNDIwMzc4LAotMHg4ZjQyMDM3OCwgMHg4ZjgyMDEyMCwgMHg4ZmFhMDAyYywgMHhhZmEyMDAxMCwKLTB4OGY4MjAxMjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDYxMTgsIDB4M2MwNTAwMDksCi0weGFmYTIwMDE0LCAweDhkNDYwMDAwLCAweDEwMDAwMDM1LCAweDM0YTUwNjAwLAotMHg4ZjQyMDMwOCwgMHgyNDEzMDAwMSwgMHgyNDQyMDAwMSwgMHhhZjQyMDMwOCwKLTB4OGY0MjAzMDgsIDB4MTAwMDAwMWUsIDB4MzI2MjAwZmYsIDB4OGY4MzAwNTQsCi0weDhmODIwMDU0LCAweDI0NzAwM2U4LCAweDIwMjEwMjMsIDB4MmM0MjAzZTksCi0weDEwNDAwMDE2LCAweDk4MjEsIDB4M2MxNTAwMjAsIDB4MjQxMTAwMTAsCi0weDhmNDIwMDBjLCAweDhmNDQwMTYwLCAweDhmNDUwMTY0LCAweDhmODYwMTIwLAotMHhhZmIxMDAxMCwgMHhhZmIyMDAxNCwgMHg1NTEwMjUsIDB4YWZhMjAwMTgsCi0weDhmNDIwMTBjLCAweDI0MDcwMDA4LCAweDQwZjgwOSwgMHgyNGM2MDAxYywKLTB4MTQ0MGZmZTMsIDB4MCwgMHg4ZjgyMDA1NCwgMHgyMDIxMDIzLAotMHgyYzQyMDNlOSwgMHgxNDQwZmZlZSwgMHgwLCAweDMyNjIwMGZmLAotMHgxNDQwMDAxMSwgMHgwLCAweDhmNDIwMzc4LCAweDI0NDIwMDAxLAotMHhhZjQyMDM3OCwgMHg4ZjQyMDM3OCwgMHg4ZjgyMDEyMCwgMHg4ZmFhMDAyYywKLTB4YWZhMjAwMTAsIDB4OGY4MjAxMjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDYxMjAsCi0weDNjMDUwMDA5LCAweGFmYTIwMDE0LCAweDhkNDYwMDAwLCAweDM0YTUwNzAwLAotMHhjMDAyYjNiLCAweDNjMDM4MjEsIDB4OGY0MjAyZWMsIDB4MjQ0MjAwMDEsCi0weGFmNDIwMmVjLCAweDhmNDIwMmVjLCAweDhmNDIwMDA0LCAweDMwNDIwMDAxLAotMHgxMDQwMDAzMywgMHgzYzAyMDQwMCwgMHgyYzIxMDI0LCAweDEwNDAwMDE3LAotMHgwLCAweDkzNDIwNWMwLCAweDhmNDQwMjUwLCAweDhmNDUwMjU0LAotMHg4ZjQzMDFiNCwgMHgzNDQyMDAyMCwgMHgxNGEzMDAwNiwgMHhhMzQyMDVjMCwKLTB4OGY0MjAyNzAsIDB4OGY0MzAyNzQsIDB4OGY0NDAxYjgsIDB4MTA2NDAwMDgsCi0weDAsIDB4OGY0MjAyNTAsIDB4OGY0MzAyNTQsIDB4OTM0NDA1YzAsCi0weDhmNDYwMjcwLCAweDhmNDcwMjc0LCAweDEwMDAwMDE2LCAweDM4ODQwMDQwLAotMHg5MzQyMDVjMCwgMHgxMDAwMDA0OCwgMHgzMDQyMDBiZiwgMHg5MzQyMDVjMCwKLTB4OGY0NDAyNTAsIDB4OGY0NTAyNTQsIDB4OGY0MzAxYjQsIDB4MzA0MjAwYmYsCi0weDE0YTMwMDA2LCAweGEzNDIwNWMwLCAweDhmNDIwMjcwLCAweDhmNDMwMjc0LAotMHg4ZjQ0MDFiOCwgMHgxMDY0MDAwYiwgMHgwLCAweDhmNDIwMjUwLAotMHg4ZjQzMDI1NCwgMHg5MzQ0MDVjMCwgMHg4ZjQ2MDI3MCwgMHg4ZjQ3MDI3NCwKLTB4Mzg4NDAwMjAsIDB4YWY0MzAxYjQsIDB4YWY0NzAxYjgsIDB4MTAwMDAwMzMsCi0weGEzNDQwNWMwLCAweDkzNDIwNWMwLCAweDEwMDAwMDJmLCAweDM0NDIwMDIwLAotMHg5MzQyMDVjMCwgMHg4ZjQzMDBkNCwgMHgzNDQyMDAyMCwgMHhhMzQyMDVjMCwKLTB4MjQ2MjAwMDEsIDB4MTAwMDAwMjMsIDB4Mjg2MzAwMzMsIDB4OGY0MjAwZTQsCi0weDhmNDMwMGUwLCAweDI0NDIwMDAxLCAweGFmNDIwMGU0LCAweDQzMTAyYSwKLTB4MTQ0MDAwMDYsIDB4MjQwMzAwMDEsIDB4OGY0MjAwZTgsIDB4MTQ0MzAwMDIsCi0weGFmNDAwMGU0LCAweDI0MDMwMDA0LCAweGFmNDMwMGU4LCAweDhmNDIwMDA0LAotMHgzMDQyMDAwMSwgMHgxMDQwMDAwZCwgMHgzYzAyMDQwMCwgMHgyYzIxMDI0LAotMHgxMDQwMDAwNywgMHgwLCAweDkzNDIwNWMwLCAweDM0NDIwMDQwLAotMHhhMzQyMDVjMCwgMHg5MzQyMDVjMCwgMHgxMDAwMDAwZiwgMHgzMDQyMDBkZiwKLTB4OTM0MjA1YzAsIDB4MTAwMDAwMGMsIDB4MzQ0MjAwNjAsIDB4OTM0MjA1YzAsCi0weDhmNDMwMGQ0LCAweDM0NDIwMDIwLCAweGEzNDIwNWMwLCAweDI0NjIwMDAxLAotMHgyODYzMDBmYiwgMHgxNDYwMDAwNSwgMHhhZjQyMDBkNCwgMHg5MzQyMDVjMCwKLTB4YWY0MDAwZDQsIDB4Mzg0MjAwNDAsIDB4YTM0MjA1YzAsIDB4OTM0MjA1YzAsCi0weDhmNDMwMGU4LCAweDMwNDIwMDdmLCAweGEzNDIwNWMwLCAweDI0MDIwMDAxLAotMHgxNDYyMDAwNSwgMHgwLCAweDkzNDQwNWMwLCAweDQyMTAyLAotMHgxMDAwMDAwMywgMHgzNDg0MDBmMCwgMHg5MzQ0MDVjMCwgMHgzNDg0MDAwZiwKLTB4YzAwNTY0MCwgMHgwLCAweDI0MDJmZjdmLCAweDI4MmEwMjQsCi0weDhmYmYwMDQ4LCAweDhmYmUwMDQ0LCAweDhmYjUwMDQwLCAweDhmYjMwMDNjLAotMHg4ZmIyMDAzOCwgMHg4ZmIxMDAzNCwgMHg4ZmIwMDAzMCwgMHgzZTAwMDA4LAotMHgyN2JkMDA1MCwgMHgzZTAwMDA4LCAweDAsIDB4MjdiZGZmYjAsCi0weDI3NDQwMWMwLCAweDI2ZTMwMDI4LCAweDI0NjUwNDAwLCAweDY1MTAyYiwKLTB4YWZiZjAwNDgsIDB4YWZiZTAwNDQsIDB4YWZiNTAwNDAsIDB4YWZiMzAwM2MsCi0weGFmYjIwMDM4LCAweGFmYjEwMDM0LCAweDEwNDAwMDA3LCAweGFmYjAwMDMwLAotMHg4YzgyMDAwMCwgMHhhYzYyMDAwMCwgMHgyNDYzMDAwNCwgMHg2NTEwMmIsCi0weDE0NDBmZmZiLCAweDI0ODQwMDA0LCAweDhjMDIwMDgwLCAweGFlZTIwMDQ0LAotMHg4YzAyMDBjMCwgMHhhZWUyMDA0MCwgMHg4YzAyMDA4NCwgMHhhZWUyMDAzMCwKLTB4OGMwMjAwODQsIDB4YWVlMjAyM2MsIDB4OGMwMjAwODgsIDB4YWVlMjAyNDAsCi0weDhjMDIwMDhjLCAweGFlZTIwMjQ0LCAweDhjMDIwMDkwLCAweGFlZTIwMjQ4LAotMHg4YzAyMDA5NCwgMHhhZWUyMDI0YywgMHg4YzAyMDA5OCwgMHhhZWUyMDI1MCwKLTB4OGMwMjAwOWMsIDB4YWVlMjAyNTQsIDB4OGMwMjAwYTAsIDB4YWVlMjAyNTgsCi0weDhjMDIwMGE0LCAweGFlZTIwMjVjLCAweDhjMDIwMGE4LCAweGFlZTIwMjYwLAotMHg4YzAyMDBhYywgMHhhZWUyMDI2NCwgMHg4YzAyMDBiMCwgMHhhZWUyMDI2OCwKLTB4OGMwMjAwYjQsIDB4YWVlMjAyNmMsIDB4OGMwMjAwYjgsIDB4YWVlMjAyNzAsCi0weDhjMDIwMGJjLCAweDI0MDQwMDAxLCAweGFlZTIwMjc0LCAweGFlZTAwMDM0LAotMHg0MTA4MCwgMHg1NzEwMjEsIDB4OGVlMzAwMzQsIDB4OGM0MjAyM2MsCi0weDI0ODQwMDAxLCAweDYyMTgyMSwgMHgyYzgyMDAwZiwgMHhhZWUzMDAzNCwKLTB4MTQ0MGZmZjgsIDB4NDEwODAsIDB4OGMwMjAwY2MsIDB4YWVlMjAwNDgsCi0weDhjMDIwMGQwLCAweGFlZTIwMDRjLCAweDhjMDIwMGUwLCAweGFlZTIwMWY4LAotMHg4YzAyMDBlNCwgMHhhZWUyMDFmYywgMHg4YzAyMDBlOCwgMHhhZWUyMDIwMCwKLTB4OGMwMjAwZWMsIDB4YWVlMjAyMDQsIDB4OGMwMjAwZjAsIDB4YWVlMjAyMDgsCi0weDhlZTQwMGMwLCAweDhlZTUwMGM0LCAweDhjMDIwMGZjLCAweDQ1MTAyYiwKLTB4MTA0MDAwMGIsIDB4MCwgMHg4ZWUyMDBjMCwgMHg4ZWUzMDBjNCwKLTB4MjQwNDAwMDEsIDB4MjQwNTAwMDAsIDB4NjUxODIxLCAweDY1MzAyYiwKLTB4NDQxMDIxLCAweDQ2MTAyMSwgMHhhZWUyMDBjMCwgMHhhZWUzMDBjNCwKLTB4OGMwMjAwZmMsIDB4OGVlNDAwYzAsIDB4OGVlNTAwYzQsIDB4MjQwOGZmZmYsCi0weDI0MDkwMDAwLCAweDQwMTgyMSwgMHgxMDIxLCAweDg4MjAyNCwKLTB4YTkyODI0LCAweDgyMjAyNSwgMHhhMzI4MjUsIDB4YWVlNDAwYzAsCi0weGFlZTUwMGM0LCAweDhlZTQwMGQwLCAweDhlZTUwMGQ0LCAweDhjMDIwMGY0LAotMHg0NTEwMmIsIDB4MTA0MDAwMGIsIDB4MCwgMHg4ZWUyMDBkMCwKLTB4OGVlMzAwZDQsIDB4MjQwNDAwMDEsIDB4MjQwNTAwMDAsIDB4NjUxODIxLAotMHg2NTMwMmIsIDB4NDQxMDIxLCAweDQ2MTAyMSwgMHhhZWUyMDBkMCwKLTB4YWVlMzAwZDQsIDB4OGMwMjAwZjQsIDB4OGVlNDAwZDAsIDB4OGVlNTAwZDQsCi0weDQwMTgyMSwgMHgxMDIxLCAweDg4MjAyNCwgMHhhOTI4MjQsCi0weDgyMjAyNSwgMHhhMzI4MjUsIDB4YWVlNDAwZDAsIDB4YWVlNTAwZDQsCi0weDhlZTQwMGM4LCAweDhlZTUwMGNjLCAweDhjMDIwMGY4LCAweDQ1MTAyYiwKLTB4MTA0MDAwMGIsIDB4MCwgMHg4ZWUyMDBjOCwgMHg4ZWUzMDBjYywKLTB4MjQwNDAwMDEsIDB4MjQwNTAwMDAsIDB4NjUxODIxLCAweDY1MzAyYiwKLTB4NDQxMDIxLCAweDQ2MTAyMSwgMHhhZWUyMDBjOCwgMHhhZWUzMDBjYywKLTB4OGMwMjAwZjgsIDB4OGVlNDAwYzgsIDB4OGVlNTAwY2MsIDB4NDAxODIxLAotMHgxMDIxLCAweDg4MjAyNCwgMHhhOTI4MjQsIDB4ODIyMDI1LAotMHhhMzI4MjUsIDB4MjQwMjAwMDgsIDB4YWVlNDAwYzgsIDB4YWVlNTAwY2MsCi0weGFmYTIwMDEwLCAweGFmYTAwMDE0LCAweDhmNDIwMDBjLCAweDhjMDQwMjA4LAotMHg4YzA1MDIwYywgMHhhZmEyMDAxOCwgMHg4ZjQyMDEwYywgMHgyNmU2MDAyOCwKLTB4NDBmODA5LCAweDI0MDcwNDAwLCAweDEwNDAwMGYwLCAweDNjMDIwNDAwLAotMHhhZmEyMDAyMCwgMHg5MzQyMDVjNiwgMHgxMDQwMDA4OSwgMHgxODIxLAotMHg4ZjVlMDAxOCwgMHgyN2FhMDAyMCwgMHgyNDAyMDBmZiwgMHgxM2MyMDAwMiwKLTB4YWZhYTAwMmMsIDB4MjdjMzAwMDEsIDB4OGMwMjAyMjgsIDB4NjA5MDIxLAotMHgxNjQyMDAwZSwgMHgxZTM4YzAsIDB4OGY0MjAzM2MsIDB4MjQ0MjAwMDEsCi0weGFmNDIwMzNjLCAweDhmNDIwMzNjLCAweDhjMDIwMjI4LCAweDNjMDQwMDAxLAotMHgyNDg0NjEwYywgMHgzYzA1MDAwOSwgMHhhZmEwMDAxNCwgMHhhZmEyMDAxMCwKLTB4OGZhNjAwMjAsIDB4MTAwMDAwNmIsIDB4MzRhNTA1MDAsIDB4ZjcxMDIxLAotMHg4ZmEzMDAyMCwgMHg4ZmE0MDAyNCwgMHhhYzQzMDRjMCwgMHhhYzQ0MDRjNCwKLTB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MjQ3MDAzZTgsIDB4MjAyMTAyMywKLTB4MmM0MjAzZTksIDB4MTA0MDAwMWIsIDB4OTgyMSwgMHhlMDg4MjEsCi0weDI2MzUwNGMwLCAweDhmNDQwMTc4LCAweDhmNDUwMTdjLCAweDIyMDE4MjEsCi0weDI0MGEwMDA0LCAweGFmYWEwMDEwLCAweGFmYjIwMDE0LCAweDhmNDgwMDBjLAotMHgxMDIxLCAweDJmNTMwMjEsIDB4YWZhODAwMTgsIDB4OGY0ODAxMGMsCi0weDI0MDcwMDA4LCAweGEzMjgyMSwgMHhhMzQ4MmIsIDB4ODIyMDIxLAotMHgxMDBmODA5LCAweDg5MjAyMSwgMHg1NDQwMDAwNiwgMHgyNDEzMDAwMSwKLTB4OGY4MjAwNTQsIDB4MjAyMTAyMywgMHgyYzQyMDNlOSwgMHgxNDQwZmZlOSwKLTB4MCwgMHgzMjYyMDBmZiwgMHg1NDQwMDAxNywgMHhhZjUyMDAxOCwKLTB4OGY0MjAzNzgsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzNzgsIDB4OGY0MjAzNzgsCi0weDhmODIwMTIwLCAweDhmYWEwMDJjLCAweGFmYTIwMDEwLCAweDhmODIwMTI0LAotMHgzYzA0MDAwMSwgMHgyNDg0NjExOCwgMHgzYzA1MDAwOSwgMHhhZmEyMDAxNCwKLTB4OGQ0NjAwMDAsIDB4MTAwMDAwMzMsIDB4MzRhNTA2MDAsIDB4OGY0MjAzMDgsCi0weDI0MTMwMDAxLCAweDI0NDIwMDAxLCAweGFmNDIwMzA4LCAweDhmNDIwMzA4LAotMHgxMDAwMDAxYywgMHgzMjYyMDBmZiwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwKLTB4MjQ3MDAzZTgsIDB4MjAyMTAyMywgMHgyYzQyMDNlOSwgMHgxMDQwMDAxNCwKLTB4OTgyMSwgMHgyNDExMDAxMCwgMHg4ZjQyMDAwYywgMHg4ZjQ0MDE2MCwKLTB4OGY0NTAxNjQsIDB4OGY4NjAxMjAsIDB4YWZiMTAwMTAsIDB4YWZiMjAwMTQsCi0weGFmYTIwMDE4LCAweDhmNDIwMTBjLCAweDI0MDcwMDA4LCAweDQwZjgwOSwKLTB4MjRjNjAwMWMsIDB4MTQ0MGZmZTUsIDB4MCwgMHg4ZjgyMDA1NCwKLTB4MjAyMTAyMywgMHgyYzQyMDNlOSwgMHgxNDQwZmZlZiwgMHgwLAotMHgzMjYyMDBmZiwgMHg1NDQwMDAxMiwgMHgyNDAyMDAwMSwgMHg4ZjQyMDM3OCwKLTB4MjQ0MjAwMDEsIDB4YWY0MjAzNzgsIDB4OGY0MjAzNzgsIDB4OGY4MjAxMjAsCi0weDhmYWEwMDJjLCAweGFmYTIwMDEwLCAweDhmODIwMTI0LCAweDNjMDQwMDAxLAotMHgyNDg0NjEyMCwgMHgzYzA1MDAwOSwgMHhhZmEyMDAxNCwgMHg4ZDQ2MDAwMCwKLTB4MzRhNTA3MDAsIDB4YzAwMmIzYiwgMHgzYzAzODIxLCAweDEwMjEsCi0weDE0NDAwMDViLCAweDI0MDIwMDAxLCAweDEwMDAwMDY1LCAweDAsCi0weDhmNTEwMDE4LCAweDI0MDIwMGZmLCAweDEyMjIwMDAyLCAweDgwMjEsCi0weDI2MzAwMDAxLCAweDhjMDIwMjI4LCAweDE2MDIwMDBlLCAweDExMzBjMCwKLTB4OGY0MjAzM2MsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzM2MsIDB4OGY0MjAzM2MsCi0weDhjMDIwMjI4LCAweDNjMDQwMDAxLCAweDI0ODQ2MGY0LCAweDNjMDUwMDA5LAotMHhhZmEwMDAxNCwgMHhhZmEyMDAxMCwgMHg4ZmE2MDAyMCwgMHgxMDAwMDAzZiwKLTB4MzRhNTAxMDAsIDB4ZDcxMDIxLCAweDhmYTMwMDIwLCAweDhmYTQwMDI0LAotMHhhYzQzMDRjMCwgMHhhYzQ0MDRjNCwgMHhjMDE4MjEsIDB4OGY0NDAxNzgsCi0weDhmNDUwMTdjLCAweDEwMjEsIDB4MjQwNzAwMDQsIDB4YWZhNzAwMTAsCi0weGFmYjAwMDE0LCAweDhmNDgwMDBjLCAweDI0YzYwNGMwLCAweDJlNjMwMjEsCi0weGFmYTgwMDE4LCAweDhmNDgwMTBjLCAweDI0MDcwMDA4LCAweGEzMjgyMSwKLTB4YTM0ODJiLCAweDgyMjAyMSwgMHgxMDBmODA5LCAweDg5MjAyMSwKLTB4MTQ0MDAwMGIsIDB4MjQwNzAwMDgsIDB4OGY4MjAxMjAsIDB4YWZhMjAwMTAsCi0weDhmODIwMTI0LCAweDNjMDQwMDAxLCAweDI0ODQ2MGZjLCAweDNjMDUwMDA5LAotMHhhZmEyMDAxNCwgMHg4ZmE2MDAyMCwgMHgxMDAwMDAxYywgMHgzNGE1MDIwMCwKLTB4OGY0NDAxNjAsIDB4OGY0NTAxNjQsIDB4OGY0MzAwMGMsIDB4YWY1MDAwMTgsCi0weDhmODYwMTIwLCAweDI0MDIwMDEwLCAweGFmYTIwMDEwLCAweGFmYjAwMDE0LAotMHhhZmEzMDAxOCwgMHg4ZjQyMDEwYywgMHg0MGY4MDksIDB4MjRjNjAwMWMsCi0weDU0NDAwMDExLCAweDI0MDIwMDAxLCAweDhmNDIwMzQwLCAweDI0NDIwMDAxLAotMHhhZjQyMDM0MCwgMHg4ZjQyMDM0MCwgMHg4ZjgyMDEyMCwgMHhhZmEyMDAxMCwKLTB4OGY4MjAxMjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDYxMDQsIDB4M2MwNTAwMDksCi0weGFmYTIwMDE0LCAweDhmYTYwMDIwLCAweDM0YTUwMzAwLCAweGMwMDJiM2IsCi0weDIyMDM4MjEsIDB4MTAyMSwgMHgxMDQwMDAwZCwgMHgyNDAyMDAwMSwKLTB4OGY0MjAyZTgsIDB4YTM0MDA1YzYsIDB4YWY0MDAxYjAsIDB4MjQ0MjAwMDEsCi0weGFmNDIwMmU4LCAweDhmNDIwMmU4LCAweDhlZTIwMTUwLCAweDI0NDIwMDAxLAotMHhhZWUyMDE1MCwgMHgxMDAwMDAwMywgMHg4ZWUyMDE1MCwgMHgyNDAyMDAwMSwKLTB4YTM0MjA1YzYsIDB4OGZiZjAwNDgsIDB4OGZiZTAwNDQsIDB4OGZiNTAwNDAsCi0weDhmYjMwMDNjLCAweDhmYjIwMDM4LCAweDhmYjEwMDM0LCAweDhmYjAwMDMwLAotMHgzZTAwMDA4LCAweDI3YmQwMDUwLCAweDI3YmRmZmQ4LCAweGFmYmYwMDIwLAotMHg4ZjgyMDBiMCwgMHgzMDQyMDAwNCwgMHgxMDQwMDA2OCwgMHgwLAotMHg4ZjQzMDEyOCwgMHg4ZjgyMDEwNCwgMHgxNDYyMDAwNSwgMHgwLAotMHg4ZjQzMDEzMCwgMHg4ZjgyMDBiNCwgMHgxMDYyMDAwNiwgMHgwLAotMHg4ZjgyMDEwNCwgMHhhZjQyMDEyOCwgMHg4ZjgyMDBiNCwgMHgxMDAwMDA1YiwKLTB4YWY0MjAxMzAsIDB4OGY4MjAwYjAsIDB4M2MwMzAwODAsIDB4NDMxMDI0LAotMHgxMDQwMDAwZCwgMHgwLCAweDhmODIwMTFjLCAweDM0NDIwMDAyLAotMHhhZjgyMDExYywgMHg4ZjgyMDBiMCwgMHgyNDAzZmZmYiwgMHg0MzEwMjQsCi0weGFmODIwMGIwLCAweDhmODIwMTFjLCAweDI0MDNmZmZkLCAweDQzMTAyNCwKLTB4MTAwMDAwNGEsIDB4YWY4MjAxMWMsIDB4OGY0MzAxMjgsIDB4OGY4MjAxMDQsCi0weDE0NjIwMDA1LCAweDAsIDB4OGY0MzAxMzAsIDB4OGY4MjAwYjQsCi0weDEwNjIwMDEwLCAweDAsIDB4OGY4MjAxMDQsIDB4YWY0MjAxMjgsCi0weDhmODIwMGI0LCAweDhmNDMwMTI4LCAweGFmNDIwMTMwLCAweGFmYTMwMDEwLAotMHg4ZjQyMDEzMCwgMHgzYzA0MDAwMSwgMHgyNDg0NjE0NCwgMHhhZmEyMDAxNCwKLTB4OGY4NjAxMWMsIDB4OGY4NzAwYjAsIDB4M2MwNTAwMDUsIDB4MTAwMDAwMzEsCi0weDM0YTUwOTAwLCAweDhmNDIwMTI4LCAweGFmYTIwMDEwLCAweDhmNDIwMTMwLAotMHgzYzA0MDAwMSwgMHgyNDg0NjE1MCwgMHhhZmEyMDAxNCwgMHg4Zjg2MDExYywKLTB4OGY4NzAwYjAsIDB4M2MwNTAwMDUsIDB4YzAwMmIzYiwgMHgzNGE1MTAwMCwKLTB4OGY4MjAxMWMsIDB4MzQ0MjAwMDIsIDB4YWY4MjAxMWMsIDB4OGY4MzAxMDQsCi0weDhmODIwMGIwLCAweDM0NDIwMDAxLCAweGFmODIwMGIwLCAweDI0MDIwMDA4LAotMHhhZjgzMDEwNCwgMHhhZmEyMDAxMCwgMHhhZmEwMDAxNCwgMHg4ZjQyMDAwYywKLTB4OGMwNDAyMDgsIDB4OGMwNTAyMGMsIDB4YWZhMjAwMTgsIDB4OGY0MjAxMGMsCi0weDI2ZTYwMDI4LCAweDQwZjgwOSwgMHgyNDA3MDQwMCwgMHg4ZjgyMDExYywKLTB4MjQwM2ZmZmQsIDB4NDMxMDI0LCAweGFmODIwMTFjLCAweDhlZTIwMWRjLAotMHgyNDQyMDAwMSwgMHhhZWUyMDFkYywgMHg4ZWUyMDFkYywgMHg4ZjQyMDEyOCwKLTB4YWZhMjAwMTAsIDB4OGY0MjAxMzAsIDB4M2MwNDAwMDEsIDB4MjQ4NDYxNWMsCi0weGFmYTIwMDE0LCAweDhmODYwMTFjLCAweDhmODcwMGIwLCAweDNjMDUwMDA1LAotMHgzNGE1MTEwMCwgMHhjMDAyYjNiLCAweDAsIDB4OGY4MjAwYTAsCi0weDMwNDIwMDA0LCAweDEwNDAwMDY5LCAweDAsIDB4OGY0MzAxMmMsCi0weDhmODIwMTI0LCAweDE0NjIwMDA1LCAweDAsIDB4OGY0MzAxMzQsCi0weDhmODIwMGE0LCAweDEwNjIwMDA2LCAweDAsIDB4OGY4MjAxMjQsCi0weGFmNDIwMTJjLCAweDhmODIwMGE0LCAweDEwMDAwMDVjLCAweGFmNDIwMTM0LAotMHg4ZjgyMDBhMCwgMHgzYzAzMDA4MCwgMHg0MzEwMjQsIDB4MTA0MDAwMGQsCi0weDAsIDB4OGY4MjAxMWMsIDB4MzQ0MjAwMDIsIDB4YWY4MjAxMWMsCi0weDhmODIwMGEwLCAweDI0MDNmZmZiLCAweDQzMTAyNCwgMHhhZjgyMDBhMCwKLTB4OGY4MjAxMWMsIDB4MjQwM2ZmZmQsIDB4NDMxMDI0LCAweDEwMDAwMDRiLAotMHhhZjgyMDExYywgMHg4ZjQzMDEyYywgMHg4ZjgyMDEyNCwgMHgxNDYyMDAwNSwKLTB4MCwgMHg4ZjQzMDEzNCwgMHg4ZjgyMDBhNCwgMHgxMDYyMDAxMCwKLTB4MCwgMHg4ZjgyMDEyNCwgMHhhZjQyMDEyYywgMHg4ZjgyMDBhNCwKLTB4OGY0MzAxMmMsIDB4YWY0MjAxMzQsIDB4YWZhMzAwMTAsIDB4OGY0MjAxMzQsCi0weDNjMDQwMDAxLCAweDI0ODQ2MTY4LCAweGFmYTIwMDE0LCAweDhmODYwMTFjLAotMHg4Zjg3MDBhMCwgMHgzYzA1MDAwNSwgMHgxMDAwMDAzMiwgMHgzNGE1MTIwMCwKLTB4OGY0MjAxMmMsIDB4YWZhMjAwMTAsIDB4OGY0MjAxMzQsIDB4M2MwNDAwMDEsCi0weDI0ODQ2MTc0LCAweGFmYTIwMDE0LCAweDhmODYwMTFjLCAweDhmODcwMGEwLAotMHgzYzA1MDAwNSwgMHhjMDAyYjNiLCAweDM0YTUxMzAwLCAweDhmODIwMTFjLAotMHgzNDQyMDAwMiwgMHhhZjgyMDExYywgMHg4ZjgzMDEyNCwgMHg4ZjgyMDBhMCwKLTB4MzQ0MjAwMDEsIDB4YWY4MjAwYTAsIDB4MjQwMjAwODAsIDB4YWY4MzAxMjQsCi0weGFmYTIwMDEwLCAweGFmYTAwMDE0LCAweDhmNDIwMDE0LCAweDhjMDQwMjA4LAotMHg4YzA1MDIwYywgMHhhZmEyMDAxOCwgMHg4ZjQyMDEwOCwgMHgzYzA2MDAwMSwKLTB4MjRjNjZlZDgsIDB4NDBmODA5LCAweDI0MDcwMDA0LCAweDhmODIwMTFjLAotMHgyNDAzZmZmZCwgMHg0MzEwMjQsIDB4YWY4MjAxMWMsIDB4OGVlMjAxZGMsCi0weDI0NDIwMDAxLCAweGFlZTIwMWRjLCAweDhlZTIwMWRjLCAweDhmNDIwMTJjLAotMHhhZmEyMDAxMCwgMHg4ZjQyMDEzNCwgMHgzYzA0MDAwMSwgMHgyNDg0NjE4MCwKLTB4YWZhMjAwMTQsIDB4OGY4NjAxMWMsIDB4OGY4NzAwYTAsIDB4M2MwNTAwMDUsCi0weDM0YTUxNDAwLCAweGMwMDJiM2IsIDB4MCwgMHg4ZmJmMDAyMCwKLTB4M2UwMDAwOCwgMHgyN2JkMDAyOCwgMHgzYzA4MTAwMCwgMHgyNDA3MDAwMSwKLTB4M2MwNjAwODAsIDB4M2MwNTAxMDAsIDB4OGY4MjAwNzAsIDB4NDgxMDI0LAotMHgxMDQwZmZmZCwgMHgwLCAweDhmODIwMDU0LCAweDI0NDIwMDA1LAotMHhhZjgyMDA3OCwgMHg4YzA0MDIzNCwgMHgxMDgwMDAxNiwgMHgxODIxLAotMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OGM0MjQwZTgsIDB4MjQ0MjAwMDUsCi0weDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhYzIyNDBlOCwgMHgzYzAyMDAwMSwKLTB4NTcxMDIxLCAweDhjNDI0MGU4LCAweDQ0MTAyYiwgMHgxNDQwMDAwOSwKLTB4MCwgMHgzYzAzMDA4MCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsCi0weGFjMjA0MGU4LCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHgxMDAwMDAwYiwKLTB4YTAyNzQwZjAsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDkwNDI0MGYwLAotMHg1NDQwMDAwNiwgMHg2NjE4MjUsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLAotMHg5MDQyNDBmMSwgMHg1NDQwMDAwMSwgMHg2NjE4MjUsIDB4OGMwNDAyMzAsCi0weDEwODAwMDEzLCAweDAsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLAotMHg4YzQyNDBlYywgMHgyNDQyMDAwNSwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsCi0weGFjMjI0MGVjLCAweDNjMDIwMDAxLCAweDU3MTAyMSwgMHg4YzQyNDBlYywKLTB4NDQxMDJiLCAweDE0NDAwMDA2LCAweDAsIDB4M2MwMTAwMDEsCi0weDM3MDgyMSwgMHhhYzIwNDBlYywgMHgxMDAwMDAwNiwgMHg2NTE4MjUsCi0weDNjMDIwMDAxLCAweDU3MTAyMSwgMHg5MDQyNDBmMiwgMHg1NDQwMDAwMSwKLTB4NjUxODI1LCAweDEwNjBmZmJjLCAweDAsIDB4OGY0MjAwMDAsCi0weDEwNDAwMDA3LCAweDAsIDB4YWY4MDAwNGMsIDB4OGY4MjAwNGMsCi0weDEwNDBmZmZkLCAweDAsIDB4MTAwMDAwMDUsIDB4MCwKLTB4YWY4MDAwNDgsIDB4OGY4MjAwNDgsIDB4MTA0MGZmZmQsIDB4MCwKLTB4OGY4MjAwNjAsIDB4NDMxMDI1LCAweGFmODIwMDYwLCAweDhmNDIwMDAwLAotMHgxMDQwMDAwMywgMHgwLCAweDEwMDBmZmE3LCAweGFmODAwMDRjLAotMHgxMDAwZmZhNSwgMHhhZjgwMDA0OCwgMHgzZTAwMDA4LCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDI3YmRmZmUwLAotMHhhZmJmMDAxOCwgMHg4Zjg2MDA2NCwgMHgzMGMyMDAwNCwgMHgxMDQwMDAyNSwKLTB4MjQwNDAwMDQsIDB4OGMwMjAxMTQsIDB4YWY0MjAwMjAsIDB4YWY4NDAwNjQsCi0weDhmNDIwMmZjLCAweDI0NDIwMDAxLCAweGFmNDIwMmZjLCAweDhmNDIwMmZjLAotMHg4ZjgyMDA2NCwgMHgzMDQyMDAwNCwgMHgxNDQwMDAwNSwgMHgwLAotMHg4YzAzMDExNCwgMHg4ZjQyMDAyMCwgMHgxNDYyZmZmMiwgMHgwLAotMHg4ZjQyMDAwMCwgMHgxMDQwMDAwNywgMHg4ZjQzMDAzYywgMHhhZjgwMDA0YywKLTB4OGY4MjAwNGMsIDB4MTA0MGZmZmQsIDB4MCwgMHgxMDAwMDAwNSwKLTB4MCwgMHhhZjgwMDA0OCwgMHg4ZjgyMDA0OCwgMHgxMDQwZmZmZCwKLTB4MCwgMHg4ZjgyMDA2MCwgMHg0MzEwMjUsIDB4YWY4MjAwNjAsCi0weDhmNDIwMDAwLCAweDEwNDAwMDczLCAweDAsIDB4MTAwMDAwNmYsCi0weDAsIDB4MzBjMjAwMDgsIDB4MTA0MDAwMjAsIDB4MjQwNDAwMDgsCi0weDhjMDIwMTFjLCAweGFmNDIwMDQ4LCAweGFmODQwMDY0LCAweDhmNDIwMmE4LAotMHgyNDQyMDAwMSwgMHhhZjQyMDJhOCwgMHg4ZjQyMDJhOCwgMHg4ZjgyMDA2NCwKLTB4MzA0MjAwMDgsIDB4MTQ0MDAwMDUsIDB4MCwgMHg4YzAzMDExYywKLTB4OGY0MjAwNDgsIDB4MTQ2MmZmZjIsIDB4MCwgMHg4ZjQyMDAwMCwKLTB4MTA0MDAwMDcsIDB4MCwgMHhhZjgwMDA0YywgMHg4ZjgyMDA0YywKLTB4MTA0MGZmZmQsIDB4MCwgMHgxMDAwMDAwNSwgMHgwLAotMHhhZjgwMDA0OCwgMHg4ZjgyMDA0OCwgMHgxMDQwZmZmZCwgMHgwLAotMHg4ZjgyMDA2MCwgMHgxMDAwZmZkOSwgMHgzNDQyMDIwMCwgMHgzMGMyMDAyMCwKLTB4MTA0MDAwMjMsIDB4MjQwNDAwMjAsIDB4OGMwMjAxMmMsIDB4YWY0MjAwNjgsCi0weGFmODQwMDY0LCAweDhmNDIwMmQ4LCAweDI0NDIwMDAxLCAweGFmNDIwMmQ4LAotMHg4ZjQyMDJkOCwgMHg4ZjgyMDA2NCwgMHgzMDQyMDAyMCwgMHgxNDQwMDAwNSwKLTB4MzJjMjQwMDAsIDB4OGMwMzAxMmMsIDB4OGY0MjAwNjgsIDB4MTQ2MmZmZjIsCi0weDMyYzI0MDAwLCAweDE0NDAwMDAyLCAweDNjMDIwMDAxLCAweDJjMmIwMjUsCi0weDhmNDIwMDAwLCAweDEwNDAwMDA3LCAweDAsIDB4YWY4MDAwNGMsCi0weDhmODIwMDRjLCAweDEwNDBmZmZkLCAweDAsIDB4MTAwMDAwMDUsCi0weDAsIDB4YWY4MDAwNDgsIDB4OGY4MjAwNDgsIDB4MTA0MGZmZmQsCi0weDAsIDB4OGY4MjAwNjAsIDB4MTAwMGZmYjQsIDB4MzQ0MjA4MDAsCi0weDMwYzIwMDEwLCAweDEwNDAwMDI5LCAweDI0MDQwMDEwLCAweDhjMDIwMTI0LAotMHhhZjQyMDA1OCwgMHhhZjg0MDA2NCwgMHg4ZjQyMDJkNCwgMHgyNDQyMDAwMSwKLTB4YWY0MjAyZDQsIDB4OGY0MjAyZDQsIDB4OGY4MjAwNjQsIDB4MzA0MjAwMTAsCi0weDE0NDAwMDA1LCAweDMyYzIyMDAwLCAweDhjMDMwMTI0LCAweDhmNDIwMDU4LAotMHgxNDYyZmZmMiwgMHgzMmMyMjAwMCwgMHg1MDQwMDAwMSwgMHgzNmQ2ODAwMCwKLTB4OGY0MjAwMDAsIDB4MTA0MDAwMDcsIDB4MCwgMHhhZjgwMDA0YywKLTB4OGY4MjAwNGMsIDB4MTA0MGZmZmQsIDB4MCwgMHgxMDAwMDAwNSwKLTB4MCwgMHhhZjgwMDA0OCwgMHg4ZjgyMDA0OCwgMHgxMDQwZmZmZCwKLTB4MCwgMHg4ZjgyMDA2MCwgMHgzNDQyMDEwMCwgMHhhZjgyMDA2MCwKLTB4OGY0MjAwMDAsIDB4MTA0MDAwMDMsIDB4MCwgMHgxMDAwMDA2YywKLTB4YWY4MDAwNGMsIDB4MTAwMDAwNmEsIDB4YWY4MDAwNDgsIDB4MzBjMjAwMDEsCi0weDEwNDAwMDA0LCAweDI0MDIwMDAxLCAweGFmODIwMDY0LCAweDEwMDAwMDY0LAotMHgwLCAweDMwYzIwMDAyLCAweDE0NDAwMDBiLCAweDNjMDUwMDAzLAotMHgzYzA0MDAwMSwgMHgyNDg0NjI0NCwgMHgzNGE1MDUwMCwgMHgzODIxLAotMHhhZmEwMDAxMCwgMHhjMDAyYjNiLCAweGFmYTAwMDE0LCAweDI0MDJmZmMwLAotMHgxMDAwMDA1NywgMHhhZjgyMDA2NCwgMHg4YzA1MDIyYywgMHg4YzAyMDEwYywKLTB4MTBhMjAwNDgsIDB4NTEwODAsIDB4OGM0NjAzMDAsIDB4MjRhMjAwMDEsCi0weDMwNDUwMDNmLCAweDI0MDIwMDAzLCAweGFjMDUwMjJjLCAweDYxZTAyLAotMHgxMDYyMDAwNSwgMHgyNDAyMDAxMCwgMHgxMDYyMDAxZCwgMHgzMGMyMGZmZiwKLTB4MTAwMDAwMzksIDB4MCwgMHg4ZjQzMDJhOCwgMHg4ZjQ0MDAwMCwKLTB4MzBjMjBmZmYsIDB4YWY0MjAwNDgsIDB4MjQ2MzAwMDEsIDB4YWY0MzAyYTgsCi0weDEwODAwMDA3LCAweDhmNDIwMmE4LCAweGFmODAwMDRjLCAweDhmODIwMDRjLAotMHgxMDQwZmZmZCwgMHgwLCAweDEwMDAwMDA1LCAweDAsCi0weGFmODAwMDQ4LCAweDhmODIwMDQ4LCAweDEwNDBmZmZkLCAweDAsCi0weDhmODIwMDYwLCAweDM0NDIwMjAwLCAweGFmODIwMDYwLCAweDhmNDIwMDAwLAotMHgxMDQwMDAxZiwgMHgwLCAweDEwMDAwMDFiLCAweDAsCi0weGFmNDIwMDU4LCAweDMyYzIyMDAwLCAweDUwNDAwMDAxLCAweDM2ZDY4MDAwLAotMHg4ZjQyMDJkNCwgMHg4ZjQzMDAwMCwgMHgyNDQyMDAwMSwgMHhhZjQyMDJkNCwKLTB4MTA2MDAwMDcsIDB4OGY0MjAyZDQsIDB4YWY4MDAwNGMsIDB4OGY4MjAwNGMsCi0weDEwNDBmZmZkLCAweDAsIDB4MTAwMDAwMDUsIDB4MCwKLTB4YWY4MDAwNDgsIDB4OGY4MjAwNDgsIDB4MTA0MGZmZmQsIDB4MCwKLTB4OGY4MjAwNjAsIDB4MzQ0MjAxMDAsIDB4YWY4MjAwNjAsIDB4OGY0MjAwMDAsCi0weDEwNDAwMDAzLCAweDAsIDB4MTAwMDAwMDYsIDB4YWY4MDAwNGMsCi0weDEwMDAwMDA0LCAweGFmODAwMDQ4LCAweGMwMDIxOTYsIDB4YzAyMDIxLAotMHg0MDI4MjEsIDB4OGMwMjAxMGMsIDB4MTRhMjAwMDIsIDB4MjQwMjAwMDIsCi0weGFmODIwMDY0LCAweDhmODIwMDY0LCAweDMwNDIwMDAyLCAweDE0NDAwMDA0LAotMHgwLCAweDhjMDIwMTBjLCAweDE0YTJmZmFjLCAweDAsCi0weDhmYmYwMDE4LCAweDNlMDAwMDgsIDB4MjdiZDAwMjAsIDB4M2UwMDAwOCwKLTB4MCwgMHgyN2JkZmZhMCwgMHhhZmIwMDA0MCwgMHg4MDgwMjEsCi0weDEwMTYwMiwgMHgyNDQyZmZmZiwgMHgzMDQzMDBmZiwgMHgyYzYyMDAxMywKLTB4YWZiZjAwNTgsIDB4YWZiZTAwNTQsIDB4YWZiNTAwNTAsIDB4YWZiMzAwNGMsCi0weGFmYjIwMDQ4LCAweGFmYjEwMDQ0LCAweDEwNDAwMWYzLCAweGFmYTUwMDM0LAotMHgzMTA4MCwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4OGMyMjYyODgsCi0weDQwMDAwOCwgMHgwLCAweDEwMTMwMiwgMHgzMDQ0MGZmZiwKLTB4MjQwMjAwMDEsIDB4MTA4MjAwMDUsIDB4MjQwMjAwMDIsIDB4MTA4MjAwMGMsCi0weDI0MDJmZmZlLCAweDEwMDAwMDI0LCAweDNjMDUwMDAzLCAweDhmNDMwMDA0LAotMHgzYzAyMDAwMSwgMHg4YzQyNmYwNCwgMHhhZjQ0MDIwMCwgMHhhZjQ0MDIwNCwKLTB4M2MwNDAwMDEsIDB4OGM4NDZlODAsIDB4MTAwMDAwMDksIDB4MzQ2MzAwMDEsCi0weDhmNDMwMDA0LCAweGFmNDQwMjAwLCAweGFmNDQwMjA0LCAweDNjMDQwMDAxLAotMHg4Yzg0NmU4MCwgMHg2MjE4MjQsIDB4M2MwMjAwMDEsIDB4MjQ0MmNhMjgsCi0weDIxMTAwLCAweDIxMTgyLCAweGFmNDMwMDA0LCAweDNjMDMwODAwLAotMHg0MzEwMjUsIDB4YWM4MjAwMzgsIDB4OGY4NDAwNTQsIDB4NDE0NDIsCi0weDQxYzgyLCAweDQzMTAyMSwgMHg0MWNjMiwgMHg0MzEwMjMsCi0weDQxZDAyLCAweDQzMTAyMSwgMHg0MWQ0MiwgMHg0MzEwMjMsCi0weDEwMDAwMDA5LCAweGFmNDIwMjA4LCAweDNjMDQwMDAxLCAweDI0ODQ2MjUwLAotMHgzNGE1MTAwMCwgMHgyMDAzMDIxLCAweDM4MjEsIDB4YWZhMDAwMTAsCi0weGMwMDJiM2IsIDB4YWZhMDAwMTQsIDB4OGY0MjAyYTAsIDB4MjQ0MjAwMDEsCi0weGFmNDIwMmEwLCAweDEwMDAwMjFmLCAweDhmNDIwMmEwLCAweDI3YjAwMDI4LAotMHgyMDAyMDIxLCAweDI0MDUwMjEwLCAweGMwMDJiYmYsIDB4MjQwNjAwMDgsCi0weGMwMDI1MTgsIDB4MjAwMjAyMSwgMHgxMDAwMDIxNiwgMHgwLAotMHg4ZmFhMDAzNCwgMHgyN2E0MDAyOCwgMHhhMTg4MCwgMHgyNTQyMDAwMSwKLTB4MzA0MjAwM2YsIDB4YWZhMjAwMzQsIDB4OGM2NTAzMDAsIDB4OGZhYTAwMzQsCi0weDIxMDgwLCAweDhjNDMwMzAwLCAweDI1NDIwMDAxLCAweDMwNDIwMDNmLAotMHhhZmEyMDAzNCwgMHhhYzAyMDIyYywgMHhhZmE1MDAyOCwgMHhjMDAyNTE4LAotMHhhZmEzMDAyYywgMHgxMDAwMDIwMywgMHgwLCAweDI3YjAwMDI4LAotMHgyMDAyMDIxLCAweDI0MDUwMjEwLCAweGMwMDJiYmYsIDB4MjQwNjAwMDgsCi0weGMwMDI2NTcsIDB4MjAwMjAyMSwgMHgxMDAwMDFmYSwgMHgwLAotMHg4ZmFhMDAzNCwgMHgyN2E0MDAyOCwgMHhhMTg4MCwgMHgyNTQyMDAwMSwKLTB4MzA0MjAwM2YsIDB4YWZhMjAwMzQsIDB4OGM2NTAzMDAsIDB4OGZhYTAwMzQsCi0weDIxMDgwLCAweDhjNDMwMzAwLCAweDI1NDIwMDAxLCAweDMwNDIwMDNmLAotMHhhZmEyMDAzNCwgMHhhYzAyMDIyYywgMHhhZmE1MDAyOCwgMHhjMDAyNjU3LAotMHhhZmEzMDAyYywgMHgxMDAwMDFlNywgMHgwLCAweDEwMTMwMiwKLTB4MzA0MzBmZmYsIDB4MjQwMjAwMDEsIDB4MTA2MjAwMDUsIDB4MjQwMjAwMDIsCi0weDEwNjIwMDFlLCAweDNjMDIwMDAyLCAweDEwMDAwMDMzLCAweDNjMDUwMDAzLAotMHgzYzAzMDAwMiwgMHgyYzMxMDI0LCAweDU0NDAwMDM3LCAweDJjM2IwMjUsCi0weDhmODIwMjI4LCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhYzIyMzhkOCwKLTB4OGY4MjAyMmMsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjIzOGRjLAotMHg4ZjgyMDIzMCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YWMyMjM4ZTAsCi0weDhmODIwMjM0LCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhYzIyMzhlNCwKLTB4MjQwMmZmZmYsIDB4YWY4MjAyMjgsIDB4YWY4MjAyMmMsIDB4YWY4MjAyMzAsCi0weGFmODIwMjM0LCAweDEwMDAwMDIwLCAweDJjM2IwMjUsIDB4MmMyMTAyNCwKLTB4MTA0MDAwMTIsIDB4M2MwMmZmZmQsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLAotMHg4YzQyMzhkOCwgMHhhZjgyMDIyOCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsCi0weDhjNDIzOGRjLCAweGFmODIwMjJjLCAweDNjMDIwMDAxLCAweDU3MTAyMSwKLTB4OGM0MjM4ZTAsIDB4YWY4MjAyMzAsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLAotMHg4YzQyMzhlNCwgMHhhZjgyMDIzNCwgMHgzYzAyZmZmZCwgMHgzNDQyZmZmZiwKLTB4MTAwMDAwMDksIDB4MmMyYjAyNCwgMHgzYzA0MDAwMSwgMHgyNDg0NjI1YywKLTB4MzRhNTExMDAsIDB4MjAwMzAyMSwgMHgzODIxLCAweGFmYTAwMDEwLAotMHhjMDAyYjNiLCAweGFmYTAwMDE0LCAweDhmNDIwMmNjLCAweDI0NDIwMDAxLAotMHhhZjQyMDJjYywgMHgxMDAwMDE5ZiwgMHg4ZjQyMDJjYywgMHgxMDEzMDIsCi0weDMwNDUwZmZmLCAweDI0MDIwMDAxLCAweDEwYTIwMDA1LCAweDI0MDIwMDAyLAotMHgxMGEyMDAwZCwgMHgzYzA0MDhmZiwgMHgxMDAwMDAxNCwgMHgzYzA1MDAwMywKLTB4M2MwMjA4ZmYsIDB4MzQ0MmZmZmYsIDB4OGY4MzAyMjAsIDB4M2MwNDAwMDQsCi0weDJjNGIwMjUsIDB4NjIxODI0LCAweDM0NjMwMDA4LCAweGFmODMwMjIwLAotMHgxMDAwMDAxMiwgMHhhZjQ1MDI5OCwgMHgzNDg0ZmZmNywgMHgzYzAzZmZmYiwKLTB4OGY4MjAyMjAsIDB4MzQ2M2ZmZmYsIDB4MmMzYjAyNCwgMHg0NDEwMjQsCi0weGFmODIwMjIwLCAweDEwMDAwMDA5LCAweGFmNDUwMjk4LCAweDNjMDQwMDAxLAotMHgyNDg0NjI2OCwgMHgzNGE1MTIwMCwgMHgyMDAzMDIxLCAweDM4MjEsCi0weGFmYTAwMDEwLCAweGMwMDJiM2IsIDB4YWZhMDAwMTQsIDB4OGY0MjAyYmMsCi0weDI0NDIwMDAxLCAweGFmNDIwMmJjLCAweDEwMDAwMTc2LCAweDhmNDIwMmJjLAotMHgyNzg0MDIwOCwgMHgyNDA1MDIwMCwgMHhjMDAyYmJmLCAweDI0MDYwMDA4LAotMHgyNzQ0MDIyNCwgMHgyNDA1MDIwMCwgMHhjMDAyYmJmLCAweDI0MDYwMDA4LAotMHg4ZjQyMDJjNCwgMHgyNDQyMDAwMSwgMHhhZjQyMDJjNCwgMHgxMDAwMDE2OSwKLTB4OGY0MjAyYzQsIDB4MTAxMzAyLCAweDMwNDMwZmZmLCAweDI0MDIwMDAxLAotMHgxMDYyMDAxMSwgMHgyODYyMDAwMiwgMHg1MDQwMDAwNSwgMHgyNDAyMDAwMiwKLTB4MTA2MDAwMDcsIDB4MCwgMHgxMDAwMDAxNywgMHgwLAotMHgxMDYyMDAwZiwgMHgwLCAweDEwMDAwMDEzLCAweDAsCi0weDhjMDYwMjQ4LCAweDIwMjEsIDB4YzAwNTEwNCwgMHgyNDA1MDAwNCwKLTB4MTAwMDAwMDcsIDB4MCwgMHg4YzA2MDI0OCwgMHgyMDIxLAotMHhjMDA1MTA0LCAweDI0MDUwMDA0LCAweDEwMDAwMDEwLCAweDAsCi0weDhjMDYwMjRjLCAweDIwMjEsIDB4YzAwNTEwNCwgMHgyNDA1MDAwMSwKLTB4MTAwMDAwMGEsIDB4MCwgMHgzYzA0MDAwMSwgMHgyNDg0NjI3NCwKLTB4M2MwNTAwMDMsIDB4MzRhNTEzMDAsIDB4MjAwMzAyMSwgMHgzODIxLAotMHhhZmEwMDAxMCwgMHhjMDAyYjNiLCAweGFmYTAwMDE0LCAweDhmNDIwMmMwLAotMHgyNDQyMDAwMSwgMHhhZjQyMDJjMCwgMHgxMDAwMDEzYSwgMHg4ZjQyMDJjMCwKLTB4YzAwMjQyNiwgMHgwLCAweDEwMDAwMTM2LCAweDAsCi0weDI0MDIwMDAxLCAweGEzNDIwNWM1LCAweDI0MTAwMTAwLCAweDhmNDQwMWE4LAotMHg4ZjQ1MDFhYywgMHhhZmIwMDAxMCwgMHhhZmEwMDAxNCwgMHg4ZjQyMDAxNCwKLTB4YWZhMjAwMTgsIDB4OGY0MjAxMDgsIDB4MjZlNjAwMjgsIDB4NDBmODA5LAotMHgyNDA3MDQwMCwgMHgxMDQwZmZmNSwgMHgwLCAweDEwMDAwMTI1LAotMHgwLCAweDNjMDNmZmZmLCAweDM0NjM3ZmZmLCAweDhmNDIwMzY4LAotMHg4ZjQ0MDM2MCwgMHgyYzNiMDI0LCAweDE4MjEsIDB4YWY0MDAwNTgsCi0weGFmNDAwMDVjLCAweGFmNDAwMDYwLCAweGFmNDAwMDY0LCAweDQ0MTAyMywKLTB4YWY0MjAzNjgsIDB4M2MwMjA5MDAsIDB4YWY0MDAzNjAsIDB4YWZhMjAwMjAsCi0weDhmNWUwMDE4LCAweDI3YWEwMDIwLCAweDI0MDIwMGZmLCAweDEzYzIwMDAyLAotMHhhZmFhMDAzYywgMHgyN2MzMDAwMSwgMHg4YzAyMDIyOCwgMHg2MDkwMjEsCi0weDE2NDIwMDBlLCAweDFlMzhjMCwgMHg4ZjQyMDMzYywgMHgyNDQyMDAwMSwKLTB4YWY0MjAzM2MsIDB4OGY0MjAzM2MsIDB4OGMwMjAyMjgsIDB4M2MwNDAwMDEsCi0weDI0ODQ2MjBjLCAweDNjMDUwMDA5LCAweGFmYTAwMDE0LCAweGFmYTIwMDEwLAotMHg4ZmE2MDAyMCwgMHgxMDAwMDA2YiwgMHgzNGE1MDUwMCwgMHhmNzEwMjEsCi0weDhmYTMwMDIwLCAweDhmYTQwMDI0LCAweGFjNDMwNGMwLCAweGFjNDQwNGM0LAotMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgyNDcwMDNlOCwgMHgyMDIxMDIzLAotMHgyYzQyMDNlOSwgMHgxMDQwMDAxYiwgMHg5ODIxLCAweGUwODgyMSwKLTB4MjYzNTA0YzAsIDB4OGY0NDAxNzgsIDB4OGY0NTAxN2MsIDB4MjIwMTgyMSwKLTB4MjQwYTAwMDQsIDB4YWZhYTAwMTAsIDB4YWZiMjAwMTQsIDB4OGY0ODAwMGMsCi0weDEwMjEsIDB4MmY1MzAyMSwgMHhhZmE4MDAxOCwgMHg4ZjQ4MDEwYywKLTB4MjQwNzAwMDgsIDB4YTMyODIxLCAweGEzNDgyYiwgMHg4MjIwMjEsCi0weDEwMGY4MDksIDB4ODkyMDIxLCAweDU0NDAwMDA2LCAweDI0MTMwMDAxLAotMHg4ZjgyMDA1NCwgMHgyMDIxMDIzLCAweDJjNDIwM2U5LCAweDE0NDBmZmU5LAotMHgwLCAweDMyNjIwMGZmLCAweDU0NDAwMDE3LCAweGFmNTIwMDE4LAotMHg4ZjQyMDM3OCwgMHgyNDQyMDAwMSwgMHhhZjQyMDM3OCwgMHg4ZjQyMDM3OCwKLTB4OGY4MjAxMjAsIDB4OGZhYTAwM2MsIDB4YWZhMjAwMTAsIDB4OGY4MjAxMjQsCi0weDNjMDQwMDAxLCAweDI0ODQ2MjE4LCAweDNjMDUwMDA5LCAweGFmYTIwMDE0LAotMHg4ZDQ2MDAwMCwgMHgxMDAwMDAzMywgMHgzNGE1MDYwMCwgMHg4ZjQyMDMwOCwKLTB4MjQxMzAwMDEsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzMDgsIDB4OGY0MjAzMDgsCi0weDEwMDAwMDFjLCAweDMyNjIwMGZmLCAweDhmODMwMDU0LCAweDhmODIwMDU0LAotMHgyNDcwMDNlOCwgMHgyMDIxMDIzLCAweDJjNDIwM2U5LCAweDEwNDAwMDE0LAotMHg5ODIxLCAweDI0MTEwMDEwLCAweDhmNDIwMDBjLCAweDhmNDQwMTYwLAotMHg4ZjQ1MDE2NCwgMHg4Zjg2MDEyMCwgMHhhZmIxMDAxMCwgMHhhZmIyMDAxNCwKLTB4YWZhMjAwMTgsIDB4OGY0MjAxMGMsIDB4MjQwNzAwMDgsIDB4NDBmODA5LAotMHgyNGM2MDAxYywgMHgxNDQwZmZlNSwgMHgwLCAweDhmODIwMDU0LAotMHgyMDIxMDIzLCAweDJjNDIwM2U5LCAweDE0NDBmZmVmLCAweDAsCi0weDMyNjIwMGZmLCAweDE0NDAwMDExLCAweDAsIDB4OGY0MjAzNzgsCi0weDI0NDIwMDAxLCAweGFmNDIwMzc4LCAweDhmNDIwMzc4LCAweDhmODIwMTIwLAotMHg4ZmFhMDAzYywgMHhhZmEyMDAxMCwgMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDYyMjAsIDB4M2MwNTAwMDksIDB4YWZhMjAwMTQsIDB4OGQ0NjAwMDAsCi0weDM0YTUwNzAwLCAweGMwMDJiM2IsIDB4M2MwMzgyMSwgMHg4ZjQyMDJiMCwKLTB4MjQ0MjAwMDEsIDB4YWY0MjAyYjAsIDB4OGY0MjAyYjAsIDB4OGY0MjAyZjgsCi0weDI0NDIwMDAxLCAweGFmNDIwMmY4LCAweDEwMDAwMDhhLCAweDhmNDIwMmY4LAotMHg4YzAyMDI1YywgMHgyNzQ0MDIyNCwgMHhhZjQyMDFmMCwgMHg4YzAyMDI2MCwKLTB4MjQwNTAyMDAsIDB4MjQwNjAwMDgsIDB4YzAwMmJiZiwgMHhhZjQyMDFmOCwKLTB4OGY4MjAyMjAsIDB4MzA0MjAwMDgsIDB4MTQ0MDAwMDIsIDB4MjQwMjAwMDEsCi0weDI0MDIwMDAyLCAweGFmNDIwMjk4LCAweDhmNDIwMmFjLCAweDI0NDIwMDAxLAotMHhhZjQyMDJhYywgMHgxMDAwMDA3NywgMHg4ZjQyMDJhYywgMHgzYzAyMDBmZiwKLTB4MzQ0MmZmZmYsIDB4MjAyMTgyNCwgMHgzMmMyMDE4MCwgMHgxNDQwMDAwNiwKLTB4MzQwMmZmZmIsIDB4NDMxMDJiLCAweDE0NDAwMDAzLCAweDAsCi0weDEwMDAwMDZjLCAweGFmNDMwMGJjLCAweDNjMDQwMDAxLCAweDI0ODQ2MjgwLAotMHgzYzA1MDAwMywgMHgzNGE1MTUwMCwgMHgyMDAzMDIxLCAweDM4MjEsCi0weGFmYTAwMDEwLCAweGMwMDJiM2IsIDB4YWZhMDAwMTQsIDB4M2MwMjA3MDAsCi0weDM0NDIxMDAwLCAweDEwMWUwMiwgMHg2MjE4MjUsIDB4YWZhMzAwMjAsCi0weDhmNTEwMDE4LCAweDI0MDIwMGZmLCAweDEyMjIwMDAyLCAweDgwMjEsCi0weDI2MzAwMDAxLCAweDhjMDIwMjI4LCAweDE2MDIwMDBlLCAweDExMzBjMCwKLTB4OGY0MjAzM2MsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzM2MsIDB4OGY0MjAzM2MsCi0weDhjMDIwMjI4LCAweDNjMDQwMDAxLCAweDI0ODQ2MWY0LCAweDNjMDUwMDA5LAotMHhhZmEwMDAxNCwgMHhhZmEyMDAxMCwgMHg4ZmE2MDAyMCwgMHgxMDAwMDAzZiwKLTB4MzRhNTAxMDAsIDB4ZDcxMDIxLCAweDhmYTMwMDIwLCAweDhmYTQwMDI0LAotMHhhYzQzMDRjMCwgMHhhYzQ0MDRjNCwgMHhjMDE4MjEsIDB4OGY0NDAxNzgsCi0weDhmNDUwMTdjLCAweDEwMjEsIDB4MjQwNzAwMDQsIDB4YWZhNzAwMTAsCi0weGFmYjAwMDE0LCAweDhmNDgwMDBjLCAweDI0YzYwNGMwLCAweDJlNjMwMjEsCi0weGFmYTgwMDE4LCAweDhmNDgwMTBjLCAweDI0MDcwMDA4LCAweGEzMjgyMSwKLTB4YTM0ODJiLCAweDgyMjAyMSwgMHgxMDBmODA5LCAweDg5MjAyMSwKLTB4MTQ0MDAwMGIsIDB4MjQwNzAwMDgsIDB4OGY4MjAxMjAsIDB4YWZhMjAwMTAsCi0weDhmODIwMTI0LCAweDNjMDQwMDAxLCAweDI0ODQ2MWZjLCAweDNjMDUwMDA5LAotMHhhZmEyMDAxNCwgMHg4ZmE2MDAyMCwgMHgxMDAwMDAxYywgMHgzNGE1MDIwMCwKLTB4OGY0NDAxNjAsIDB4OGY0NTAxNjQsIDB4OGY0MzAwMGMsIDB4YWY1MDAwMTgsCi0weDhmODYwMTIwLCAweDI0MDIwMDEwLCAweGFmYTIwMDEwLCAweGFmYjAwMDE0LAotMHhhZmEzMDAxOCwgMHg4ZjQyMDEwYywgMHg0MGY4MDksIDB4MjRjNjAwMWMsCi0weDE0NDAwMDEwLCAweDAsIDB4OGY0MjAzNDAsIDB4MjQ0MjAwMDEsCi0weGFmNDIwMzQwLCAweDhmNDIwMzQwLCAweDhmODIwMTIwLCAweGFmYTIwMDEwLAotMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwgMHgyNDg0NjIwNCwgMHgzYzA1MDAwOSwKLTB4YWZhMjAwMTQsIDB4OGZhNjAwMjAsIDB4MzRhNTAzMDAsIDB4YzAwMmIzYiwKLTB4MjIwMzgyMSwgMHg4ZjQyMDJlMCwgMHgyNDQyMDAwMSwgMHhhZjQyMDJlMCwKLTB4OGY0MjAyZTAsIDB4OGY0MjAyZjAsIDB4MjQ0MjAwMDEsIDB4YWY0MjAyZjAsCi0weDhmNDIwMmYwLCAweDhmYTIwMDM0LCAweDhmYmYwMDU4LCAweDhmYmUwMDU0LAotMHg4ZmI1MDA1MCwgMHg4ZmIzMDA0YywgMHg4ZmIyMDA0OCwgMHg4ZmIxMDA0NCwKLTB4OGZiMDAwNDAsIDB4M2UwMDAwOCwgMHgyN2JkMDA2MCwgMHgyN2JkZmZmOCwKLTB4MjQwOGZmZmYsIDB4MTBhMDAwMTQsIDB4NDgyMSwgMHgzYzBhZWRiOCwKLTB4MzU0YTgzMjAsIDB4OTA4NzAwMDAsIDB4MjQ4NDAwMDEsIDB4MzAyMSwKLTB4MTA3MTAyNiwgMHgzMDQyMDAwMSwgMHgxMDQwMDAwMiwgMHg4MTg0MiwKLTB4NmExODI2LCAweDYwNDAyMSwgMHgyNGM2MDAwMSwgMHgyY2MyMDAwOCwKLTB4MTQ0MGZmZjcsIDB4NzM4NDIsIDB4MjUyOTAwMDEsIDB4MTI1MTAyYiwKLTB4MTQ0MGZmZjAsIDB4MCwgMHgxMDAxMDIxLCAweDNlMDAwMDgsCi0weDI3YmQwMDA4LCAweDI3YmRmZmIwLCAweGFmYmYwMDQ4LCAweGFmYmUwMDQ0LAotMHhhZmI1MDA0MCwgMHhhZmIzMDAzYywgMHhhZmIyMDAzOCwgMHhhZmIxMDAzNCwKLTB4YWZiMDAwMzAsIDB4OGY4NzAyMjAsIDB4YWZhNzAwMjQsIDB4OGY4NzAyMDAsCi0weGFmYTcwMDJjLCAweDhmODIwMjIwLCAweDNjMDMwOGZmLCAweDM0NjNmZmZmLAotMHg0MzEwMjQsIDB4MzQ0MjAwMDQsIDB4YWY4MjAyMjAsIDB4OGY4MjAyMDAsCi0weDNjMDNjMGZmLCAweDM0NjNmZmZmLCAweDQzMTAyNCwgMHgzNDQyMDAwNCwKLTB4YWY4MjAyMDAsIDB4OGY1MzAzNTgsIDB4OGY1NTAzNWMsIDB4OGY1ZTAzNjAsCi0weDhmNDcwMzY0LCAweGFmYTcwMDE0LCAweDhmNDcwMzY4LCAweGFmYTcwMDFjLAotMHg4ZjQyMDJkMCwgMHgyNzQ0MDFjMCwgMHgyNDQyMDAwMSwgMHhhZjQyMDJkMCwKLTB4OGY1MDAyZDAsIDB4OGY1MTAyMDQsIDB4OGY1MjAyMDAsIDB4YzAwMmJhOCwKLTB4MjQwNTA0MDAsIDB4YWY1MzAzNTgsIDB4YWY1NTAzNWMsIDB4YWY1ZTAzNjAsCi0weDhmYTcwMDE0LCAweGFmNDcwMzY0LCAweDhmYTcwMDFjLCAweGFmNDcwMzY4LAotMHhhZjUwMDJkMCwgMHhhZjUxMDIwNCwgMHhhZjUyMDIwMCwgMHg4YzAyMDI1YywKLTB4Mjc0NDAyMjQsIDB4YWY0MjAxZjAsIDB4OGMwMjAyNjAsIDB4MjQwNTAyMDAsCi0weDI0MDYwMDA4LCAweGFmNDIwMWY4LCAweDI0MDIwMDA2LCAweGMwMDJiYmYsCi0weGFmNDIwMWY0LCAweDNjMDIzYjlhLCAweDM0NDJjYTAwLCAweGFmNDIwMWZjLAotMHgyNDAyMDNlOCwgMHgyNDA0MDAwMiwgMHgyNDAzMDAwMSwgMHhhZjQyMDI5NCwKLTB4YWY0NDAyOTAsIDB4YWY0MzAyOWMsIDB4OGY4MjAyMjAsIDB4MzA0MjAwMDgsCi0weDEwNDAwMDA0LCAweDAsIDB4YWY0MzAyOTgsIDB4MTAwMDAwMDMsCi0weDMwMjEsIDB4YWY0NDAyOTgsIDB4MzAyMSwgMHgzYzAzMDAwMSwKLTB4NjYxODIxLCAweDkwNjM2ZDAwLCAweDM0NjEwMjEsIDB4MjRjNjAwMDEsCi0weGEwNDMwMjJjLCAweDJjYzIwMDBmLCAweDE0NDBmZmY4LCAweDM0NjE4MjEsCi0weDI0YzYwMDAxLCAweDhmODIwMDQwLCAweDI0MDQwMDgwLCAweDI0MDUwMDgwLAotMHgyMTcwMiwgMHgyNDQyMDAzMCwgMHhhMDYyMDIyYywgMHgzNDYxMDIxLAotMHhjMDAyYmE4LCAweGEwNDAwMjJjLCAweDhmYTcwMDI0LCAweDMwZTIwMDA0LAotMHgxNDQwMDAwNiwgMHgwLCAweDhmODIwMjIwLCAweDNjMDMwOGZmLAotMHgzNDYzZmZmYiwgMHg0MzEwMjQsIDB4YWY4MjAyMjAsIDB4OGZhNzAwMmMsCi0weDMwZTIwMDA0LCAweDE0NDAwMDA2LCAweDAsIDB4OGY4MjAyMDAsCi0weDNjMDNjMGZmLCAweDM0NjNmZmZiLCAweDQzMTAyNCwgMHhhZjgyMDIwMCwKLTB4OGZiZjAwNDgsIDB4OGZiZTAwNDQsIDB4OGZiNTAwNDAsIDB4OGZiMzAwM2MsCi0weDhmYjIwMDM4LCAweDhmYjEwMDM0LCAweDhmYjAwMDMwLCAweDNlMDAwMDgsCi0weDI3YmQwMDUwLCAweDAsIDB4MCwgMHhhZjQwMDEwNCwKLTB4MjQwNDAwMDEsIDB4NDEwYzAsIDB4MmUyMTgyMSwgMHgyNDgyMDAwMSwKLTB4M2MwMTAwMDEsIDB4MjMwODIxLCAweGE0MjIzNGQwLCAweDQwMjAyMSwKLTB4MmM4MjAwODAsIDB4MTQ0MGZmZjgsIDB4NDEwYzAsIDB4MjQwMjAwMDEsCi0weDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhNDIwMzhkMCwgMHhhZjQyMDEwMCwKLTB4YWY4MDAyMjgsIDB4YWY4MDAyMmMsIDB4YWY4MDAyMzAsIDB4YWY4MDAyMzQsCi0weDNlMDAwMDgsIDB4MCwgMHgyN2JkZmZlOCwgMHhhZmJmMDAxNCwKLTB4YWZiMDAwMTAsIDB4OGY0MjAxMDQsIDB4Mjg0MjAwMDUsIDB4MTA0MDAwMjYsCi0weDgwODAyMSwgMHgzYzAyMDAwMSwgMHg4ZjQzMDEwNCwgMHgzNDQyMzBkMCwKLTB4MmUyMjAyMSwgMHgzMThjMCwgMHg2MjE4MjEsIDB4MmUzMTgyMSwKLTB4ODMxMDJiLCAweDEwNDAwMDE1LCAweDEwMjEsIDB4OTYwNzAwMDAsCi0weDI0ODQwMDA2LCAweDI0NjYwMDA2LCAweDk0ODJmZmZjLCAweDE0NDcwMDA5LAotMHgyODIxLCAweDk0ODNmZmZlLCAweDk2MDIwMDAyLCAweDE0NjIwMDA2LAotMHhhMDEwMjEsIDB4OTQ4MjAwMDAsIDB4OTYwMzAwMDQsIDB4NDMxMDI2LAotMHgyYzQ1MDAwMSwgMHhhMDEwMjEsIDB4MTQ0MDAwMDksIDB4MjQ4NDAwMDgsCi0weDg2MTAyYiwgMHgxNDQwZmZmMCwgMHgxMDIxLCAweDMwNDIwMGZmLAotMHgxNDQwMDAzMCwgMHgyNDAyMDAwMSwgMHgxMDAwMDAyZSwgMHgxMDIxLAotMHgxMDAwZmZmYSwgMHgyNDAyMDAwMSwgMHgyMDAyMDIxLCAweGMwMDI0MGMsCi0weDI0MDUwMDA2LCAweDMwNDIwMDdmLCAweDIxOGMwLCAweDJlMzEwMjEsCi0weDNjMDEwMDAxLCAweDIyMDgyMSwgMHg5NDIyMzBkMCwgMHgxMDQwZmZmMiwKLTB4MmUzMTAyMSwgMHgzYzA2MDAwMSwgMHhjMjMwMjEsIDB4OTRjNjMwZDAsCi0weDEwYzBmZmVkLCAweDNjMDgwMDAxLCAweDM1MDgzNGQyLCAweDk2MDcwMDAwLAotMHg2MTBjMCwgMHg1NzIwMjEsIDB4ODgyMDIxLCAweDk0ODIwMDAwLAotMHgxNDQ3MDAwOSwgMHgyODIxLCAweDk0ODMwMDAyLCAweDk2MDIwMDAyLAotMHgxNDYyMDAwNiwgMHhhMDEwMjEsIDB4OTQ4MjAwMDQsIDB4OTYwMzAwMDQsCi0weDQzMTAyNiwgMHgyYzQ1MDAwMSwgMHhhMDEwMjEsIDB4MTQ0MDAwMDcsCi0weDYxMGMwLCAweDJlMjEwMjEsIDB4M2MwNjAwMDEsIDB4YzIzMDIxLAotMHg5NGM2MzRkMCwgMHgxNGMwZmZlYiwgMHg2MTBjMCwgMHgxMGMwZmZkMiwKLTB4MjQwMjAwMDEsIDB4OGZiZjAwMTQsIDB4OGZiMDAwMTAsIDB4M2UwMDAwOCwKLTB4MjdiZDAwMTgsIDB4M2UwMDAwOCwgMHgwLCAweDI3YmRmZmIwLAotMHg4MDEwMjEsIDB4YWZiMDAwMzAsIDB4MjQ1MDAwMDIsIDB4MjAwMjAyMSwKLTB4MjQwNTAwMDYsIDB4YWZiMTAwMzQsIDB4NDA4ODIxLCAweGFmYmYwMDQ4LAotMHhhZmJlMDA0NCwgMHhhZmI1MDA0MCwgMHhhZmIzMDAzYywgMHhjMDAyNDBjLAotMHhhZmIyMDAzOCwgMHgzMDQ3MDA3ZiwgMHg3MTBjMCwgMHgyZTIxMDIxLAotMHgzYzA1MDAwMSwgMHhhMjI4MjEsIDB4OTRhNTMwZDAsIDB4NTBhMDAwMWMsCi0weGEwMzAyMSwgMHgzYzA5MDAwMSwgMHgzNTI5MzRkMiwgMHg5NjI4MDAwMiwKLTB4NTEwYzAsIDB4NTcyMDIxLCAweDg5MjAyMSwgMHg5NDgyMDAwMCwKLTB4MTQ0ODAwMDksIDB4MzAyMSwgMHg5NDgzMDAwMiwgMHg5NjAyMDAwMiwKLTB4MTQ2MjAwMDYsIDB4YzAxMDIxLCAweDk0ODIwMDA0LCAweDk2MDMwMDA0LAotMHg0MzEwMjYsIDB4MmM0NjAwMDEsIDB4YzAxMDIxLCAweDE0NDAwMDA3LAotMHg1MTBjMCwgMHgyZTIxMDIxLCAweDNjMDUwMDAxLCAweGEyMjgyMSwKLTB4OTRhNTM0ZDAsIDB4MTRhMGZmZWIsIDB4NTEwYzAsIDB4YTAzMDIxLAotMHgxMGMwMDAxNCwgMHg2MTBjMCwgMHg1NzE4MjEsIDB4M2MwMTAwMDEsCi0weDIzMDgyMSwgMHg4YzIzMzRkMCwgMHg1NzEwMjEsIDB4YWZhMzAwMTAsCi0weDNjMDEwMDAxLCAweDIyMDgyMSwgMHg4YzIyMzRkNCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDYzOTQsIDB4YWZhMjAwMTQsIDB4OGUyNjAwMDAsIDB4OGUyNzAwMDQsCi0weDNjMDUwMDA0LCAweGMwMDJiM2IsIDB4MzRhNTA0MDAsIDB4MTAwMDAwNjMsCi0weDNjMDIwODAwLCAweDhmNDUwMTAwLCAweDEwYTAwMDA2LCAweDUxMGMwLAotMHgyZTIxMDIxLCAweDNjMDEwMDAxLCAweDIyMDgyMSwgMHg5NDIyMzRkMCwKLTB4YWY0MjAxMDAsIDB4YTAzMDIxLCAweDE0YzAwMDExLCAweDYyOGMwLAotMHg3MTBjMCwgMHgyZTIxMDIxLCAweGFmYTcwMDEwLCAweDNjMDEwMDAxLAotMHgyMjA4MjEsIDB4OTQyMjMwZDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDYzYTAsCi0weGFmYTIwMDE0LCAweDhlMjYwMDAwLCAweDhlMjcwMDA0LCAweDNjMDUwMDA0LAotMHhjMDAyYjNiLCAweDM0YTUwNTAwLCAweDEwMDAwMDQ4LCAweDNjMDIwODAwLAotMHhiNzE4MjEsIDB4M2MwMjAwMDEsIDB4OTYwNDAwMDAsIDB4MzQ0MjM0ZDIsCi0weDYyMTgyMSwgMHhhNDY0MDAwMCwgMHg4ZTAyMDAwMiwgMHg3MjBjMCwKLTB4YWM2MjAwMDIsIDB4MmU0MTAyMSwgMHgzYzAzMDAwMSwgMHg2MjE4MjEsCi0weDk0NjMzMGQwLCAweDJlNTEwMjEsIDB4M2MwMTAwMDEsIDB4MjIwODIxLAotMHhhNDIzMzRkMCwgMHgyZTQxMDIxLCAweDNjMDEwMDAxLCAweDIyMDgyMSwKLTB4YTQyNjMwZDAsIDB4OGY0MjAxMDQsIDB4MjQ0MjAwMDEsIDB4Mjg0MjAwODAsCi0weDEwNDAwMDBmLCAweDNjMDIwMDAyLCAweDhmNDIwMTA0LCAweDNjMDQwMDAxLAotMHgzNDg0MzBkMiwgMHg5NjAzMDAwMCwgMHgyMTBjMCwgMHg1NzEwMjEsCi0weDQ0MTAyMSwgMHhhNDQzMDAwMCwgMHg4ZTAzMDAwMiwgMHhhYzQzMDAwMiwKLTB4OGY0MjAxMDQsIDB4MjQ0MjAwMDEsIDB4YWY0MjAxMDQsIDB4M2MwMjAwMDIsCi0weDJjMjEwMjQsIDB4MTA0MDAwMTEsIDB4NzIxNDIsIDB4M2MwMzAwMDEsCi0weDM0NjMzOGQ4LCAweDI0MDIwMDAzLCAweDQ0MTAyMywgMHgyMTA4MCwKLTB4NTcyMDIxLCAweDgzMjAyMSwgMHg1NzEwMjEsIDB4NDMxMDIxLAotMHgzMGU1MDAxZiwgMHg4YzQzMDAwMCwgMHgyNDAyMDAwMSwgMHhhMjEwMDQsCi0weDYyMTgyNSwgMHgxMDAwMDAwYywgMHhhYzgzMDAwMCwgMHgyNDAyMDAwMywKLTB4NDQxMDIzLCAweDIxMDgwLCAweDVjMjgyMSwgMHg1YzEwMjEsCi0weDMwZTQwMDFmLCAweDhjNDMwMjI4LCAweDI0MDIwMDAxLCAweDgyMTAwNCwKLTB4NjIxODI1LCAweGFjYTMwMjI4LCAweDNjMDIwODAwLCAweDM0NDIxMDAwLAotMHgxODIxLCAweGFmYTIwMDIwLCAweDhmNWUwMDE4LCAweDI3YWEwMDIwLAotMHgyNDAyMDBmZiwgMHgxM2MyMDAwMiwgMHhhZmFhMDAyYywgMHgyN2MzMDAwMSwKLTB4OGMwMjAyMjgsIDB4NjA5MDIxLCAweDE2NDIwMDBlLCAweDFlMzhjMCwKLTB4OGY0MjAzM2MsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzM2MsIDB4OGY0MjAzM2MsCi0weDhjMDIwMjI4LCAweDNjMDQwMDAxLCAweDI0ODQ2MzVjLCAweDNjMDUwMDA5LAotMHhhZmEwMDAxNCwgMHhhZmEyMDAxMCwgMHg4ZmE2MDAyMCwgMHgxMDAwMDA2YiwKLTB4MzRhNTA1MDAsIDB4ZjcxMDIxLCAweDhmYTMwMDIwLCAweDhmYTQwMDI0LAotMHhhYzQzMDRjMCwgMHhhYzQ0MDRjNCwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwKLTB4MjQ3MDAzZTgsIDB4MjAyMTAyMywgMHgyYzQyMDNlOSwgMHgxMDQwMDAxYiwKLTB4OTgyMSwgMHhlMDg4MjEsIDB4MjYzNTA0YzAsIDB4OGY0NDAxNzgsCi0weDhmNDUwMTdjLCAweDIyMDE4MjEsIDB4MjQwYTAwMDQsIDB4YWZhYTAwMTAsCi0weGFmYjIwMDE0LCAweDhmNDgwMDBjLCAweDEwMjEsIDB4MmY1MzAyMSwKLTB4YWZhODAwMTgsIDB4OGY0ODAxMGMsIDB4MjQwNzAwMDgsIDB4YTMyODIxLAotMHhhMzQ4MmIsIDB4ODIyMDIxLCAweDEwMGY4MDksIDB4ODkyMDIxLAotMHg1NDQwMDAwNiwgMHgyNDEzMDAwMSwgMHg4ZjgyMDA1NCwgMHgyMDIxMDIzLAotMHgyYzQyMDNlOSwgMHgxNDQwZmZlOSwgMHgwLCAweDMyNjIwMGZmLAotMHg1NDQwMDAxNywgMHhhZjUyMDAxOCwgMHg4ZjQyMDM3OCwgMHgyNDQyMDAwMSwKLTB4YWY0MjAzNzgsIDB4OGY0MjAzNzgsIDB4OGY4MjAxMjAsIDB4OGZhYTAwMmMsCi0weGFmYTIwMDEwLCAweDhmODIwMTI0LCAweDNjMDQwMDAxLCAweDI0ODQ2MzY4LAotMHgzYzA1MDAwOSwgMHhhZmEyMDAxNCwgMHg4ZDQ2MDAwMCwgMHgxMDAwMDAzMywKLTB4MzRhNTA2MDAsIDB4OGY0MjAzMDgsIDB4MjQxMzAwMDEsIDB4MjQ0MjAwMDEsCi0weGFmNDIwMzA4LCAweDhmNDIwMzA4LCAweDEwMDAwMDFjLCAweDMyNjIwMGZmLAotMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgyNDcwMDNlOCwgMHgyMDIxMDIzLAotMHgyYzQyMDNlOSwgMHgxMDQwMDAxNCwgMHg5ODIxLCAweDI0MTEwMDEwLAotMHg4ZjQyMDAwYywgMHg4ZjQ0MDE2MCwgMHg4ZjQ1MDE2NCwgMHg4Zjg2MDEyMCwKLTB4YWZiMTAwMTAsIDB4YWZiMjAwMTQsIDB4YWZhMjAwMTgsIDB4OGY0MjAxMGMsCi0weDI0MDcwMDA4LCAweDQwZjgwOSwgMHgyNGM2MDAxYywgMHgxNDQwZmZlNSwKLTB4MCwgMHg4ZjgyMDA1NCwgMHgyMDIxMDIzLCAweDJjNDIwM2U5LAotMHgxNDQwZmZlZiwgMHgwLCAweDMyNjIwMGZmLCAweDE0NDAwMDExLAotMHgwLCAweDhmNDIwMzc4LCAweDI0NDIwMDAxLCAweGFmNDIwMzc4LAotMHg4ZjQyMDM3OCwgMHg4ZjgyMDEyMCwgMHg4ZmFhMDAyYywgMHhhZmEyMDAxMCwKLTB4OGY4MjAxMjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDYzNzAsIDB4M2MwNTAwMDksCi0weGFmYTIwMDE0LCAweDhkNDYwMDAwLCAweDM0YTUwNzAwLCAweGMwMDJiM2IsCi0weDNjMDM4MjEsIDB4OGY0MjAyYjQsIDB4MjQ0MjAwMDEsIDB4YWY0MjAyYjQsCi0weDhmNDIwMmI0LCAweDhmNDIwMmY0LCAweDI0NDIwMDAxLCAweGFmNDIwMmY0LAotMHg4ZjQyMDJmNCwgMHg4ZmJmMDA0OCwgMHg4ZmJlMDA0NCwgMHg4ZmI1MDA0MCwKLTB4OGZiMzAwM2MsIDB4OGZiMjAwMzgsIDB4OGZiMTAwMzQsIDB4OGZiMDAwMzAsCi0weDNlMDAwMDgsIDB4MjdiZDAwNTAsIDB4MjdiZGZmYTAsIDB4ODAxMDIxLAotMHhhZmIwMDA0MCwgMHgyNDUwMDAwMiwgMHgyMDAyMDIxLCAweDI0MDUwMDA2LAotMHhhZmIxMDA0NCwgMHg0MDg4MjEsIDB4YWZiZjAwNTgsIDB4YWZiZTAwNTQsCi0weGFmYjUwMDUwLCAweGFmYjMwMDRjLCAweGMwMDI0MGMsIDB4YWZiMjAwNDgsCi0weDMwNDgwMDdmLCAweDgxMGMwLCAweDJlMjEwMjEsIDB4M2MwNjAwMDEsCi0weGMyMzAyMSwgMHg5NGM2MzBkMCwgMHgxMGMwMDAxYywgMHgzODIxLAotMHgzYzBhMDAwMSwgMHgzNTRhMzRkMiwgMHg5NjI5MDAwMiwgMHg2MTBjMCwKLTB4NTcyMDIxLCAweDhhMjAyMSwgMHg5NDgyMDAwMCwgMHgxNDQ5MDAwOSwKLTB4MjgyMSwgMHg5NDgzMDAwMiwgMHg5NjAyMDAwMiwgMHgxNDYyMDAwNiwKLTB4YTAxMDIxLCAweDk0ODIwMDA0LCAweDk2MDMwMDA0LCAweDQzMTAyNiwKLTB4MmM0NTAwMDEsIDB4YTAxMDIxLCAweDE0NDAwMDA4LCAweDYxMGMwLAotMHhjMDM4MjEsIDB4MmUyMTAyMSwgMHgzYzA2MDAwMSwgMHhjMjMwMjEsCi0weDk0YzYzNGQwLCAweDE0YzBmZmVhLCAweDYxMGMwLCAweDE0YzAwMDExLAotMHhhZmE3MDAyOCwgMHg4MTBjMCwgMHgyZTIxMDIxLCAweGFmYTgwMDEwLAotMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4OTQyMjMwZDAsIDB4M2MwNDAwMDEsCi0weDI0ODQ2M2FjLCAweGFmYTIwMDE0LCAweDhlMjYwMDAwLCAweDhlMjcwMDA0LAotMHgzYzA1MDAwNCwgMHhjMDAyYjNiLCAweDM0YTUwOTAwLCAweDEwMDAwMDc1LAotMHgzYzAyMDgwMCwgMHgxMGUwMDAwYywgMHg2MTBjMCwgMHgyZTIxMDIxLAotMHgzYzAzMDAwMSwgMHg2MjE4MjEsIDB4OTQ2MzM0ZDAsIDB4NzEwYzAsCi0weDJlMjEwMjEsIDB4M2MwMTAwMDEsIDB4MjIwODIxLCAweGE0MjMzNGQwLAotMHgxMDAwMDAwYiwgMHgzYzA0MDAwMSwgMHgyZTIxMDIxLCAweDNjMDMwMDAxLAotMHg2MjE4MjEsIDB4OTQ2MzM0ZDAsIDB4ODEwYzAsIDB4MmUyMTAyMSwKLTB4M2MwMTAwMDEsIDB4MjIwODIxLCAweGE0MjMzMGQwLCAweDNjMDQwMDAxLAotMHgzNDg0MzBkMCwgMHg4ZjQzMDEwMCwgMHg2MTBjMCwgMHgyZTIxMDIxLAotMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4YTQyMzM0ZDAsIDB4OGY0MjAxMDQsCi0weDJlNDM4MjEsIDB4MjgyMSwgMHgxODQwMDAyOSwgMHhhZjQ2MDEwMCwKLTB4MjRlNjAwMDYsIDB4OTRjM2ZmZmMsIDB4OTYwMjAwMDAsIDB4MTQ2MjAwMDksCi0weDIwMjEsIDB4OTRjM2ZmZmUsIDB4OTYwMjAwMDIsIDB4MTQ2MjAwMDYsCi0weDgwMTAyMSwgMHg5NGMyMDAwMCwgMHg5NjAzMDAwNCwgMHg0MzEwMjYsCi0weDJjNDQwMDAxLCAweDgwMTAyMSwgMHg1MDQwMDAxNCwgMHgyNGE1MDAwMSwKLTB4OGY0MjAxMDQsIDB4MjQ0MmZmZmYsIDB4YTIxMDJhLCAweDEwNDAwMDBiLAotMHgyNGU0MDAwNCwgMHg5NDgyMDAwNiwgMHg4YzgzMDAwOCwgMHhhNDgyZmZmZSwKLTB4YWM4MzAwMDAsIDB4OGY0MjAxMDQsIDB4MjRhNTAwMDEsIDB4MjQ0MmZmZmYsCi0weGEyMTAyYSwgMHgxNDQwZmZmNywgMHgyNDg0MDAwOCwgMHg4ZjQyMDEwNCwKLTB4MjQ0MmZmZmYsIDB4MTAwMDAwMDYsIDB4YWY0MjAxMDQsIDB4OGY0MjAxMDQsCi0weDI0YzYwMDA4LCAweGEyMTAyYSwgMHgxNDQwZmZkYSwgMHgyNGU3MDAwOCwKLTB4ODEwYzAsIDB4MmUyMTAyMSwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsCi0weDk0MjIzMGQwLCAweDE0NDAwMDIzLCAweDNjMDIwODAwLCAweDNjMDIwMDAyLAotMHgyYzIxMDI0LCAweDEwNDAwMDEyLCAweDgyMTQyLCAweDNjMDMwMDAxLAotMHgzNDYzMzhkOCwgMHgyNDAyMDAwMywgMHg0NDEwMjMsIDB4MjEwODAsCi0weDU3MjAyMSwgMHg4MzIwMjEsIDB4NTcxMDIxLCAweDQzMTAyMSwKLTB4MzEwNTAwMWYsIDB4MjQwMzAwMDEsIDB4OGM0MjAwMDAsIDB4YTMxODA0LAotMHgzMTgyNywgMHg0MzEwMjQsIDB4MTAwMDAwMGQsIDB4YWM4MjAwMDAsCi0weDI0MDIwMDAzLCAweDQ0MTAyMywgMHgyMTA4MCwgMHg1YzI4MjEsCi0weDVjMTAyMSwgMHgzMTA0MDAxZiwgMHgyNDAzMDAwMSwgMHg4YzQyMDIyOCwKLTB4ODMxODA0LCAweDMxODI3LCAweDQzMTAyNCwgMHhhY2EyMDIyOCwKLTB4M2MwMjA4MDAsIDB4MzQ0MjIwMDAsIDB4MTgyMSwgMHhhZmEyMDAyMCwKLTB4OGY1ZTAwMTgsIDB4MjdhYjAwMjAsIDB4MjQwMjAwZmYsIDB4MTNjMjAwMDIsCi0weGFmYWIwMDM0LCAweDI3YzMwMDAxLCAweDhjMDIwMjI4LCAweDYwOTAyMSwKLTB4MTY0MjAwMGUsIDB4MWUzOGMwLCAweDhmNDIwMzNjLCAweDI0NDIwMDAxLAotMHhhZjQyMDMzYywgMHg4ZjQyMDMzYywgMHg4YzAyMDIyOCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDYzNWMsIDB4M2MwNTAwMDksIDB4YWZhMDAwMTQsIDB4YWZhMjAwMTAsCi0weDhmYTYwMDIwLCAweDEwMDAwMDZiLCAweDM0YTUwNTAwLCAweGY3MTAyMSwKLTB4OGZhMzAwMjAsIDB4OGZhNDAwMjQsIDB4YWM0MzA0YzAsIDB4YWM0NDA0YzQsCi0weDhmODMwMDU0LCAweDhmODIwMDU0LCAweDI0NzAwM2U4LCAweDIwMjEwMjMsCi0weDJjNDIwM2U5LCAweDEwNDAwMDFiLCAweDk4MjEsIDB4ZTA4ODIxLAotMHgyNjM1MDRjMCwgMHg4ZjQ0MDE3OCwgMHg4ZjQ1MDE3YywgMHgyMjAxODIxLAotMHgyNDBiMDAwNCwgMHhhZmFiMDAxMCwgMHhhZmIyMDAxNCwgMHg4ZjQ4MDAwYywKLTB4MTAyMSwgMHgyZjUzMDIxLCAweGFmYTgwMDE4LCAweDhmNDgwMTBjLAotMHgyNDA3MDAwOCwgMHhhMzI4MjEsIDB4YTM0ODJiLCAweDgyMjAyMSwKLTB4MTAwZjgwOSwgMHg4OTIwMjEsIDB4NTQ0MDAwMDYsIDB4MjQxMzAwMDEsCi0weDhmODIwMDU0LCAweDIwMjEwMjMsIDB4MmM0MjAzZTksIDB4MTQ0MGZmZTksCi0weDAsIDB4MzI2MjAwZmYsIDB4NTQ0MDAwMTcsIDB4YWY1MjAwMTgsCi0weDhmNDIwMzc4LCAweDI0NDIwMDAxLCAweGFmNDIwMzc4LCAweDhmNDIwMzc4LAotMHg4ZjgyMDEyMCwgMHg4ZmFiMDAzNCwgMHhhZmEyMDAxMCwgMHg4ZjgyMDEyNCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDYzNjgsIDB4M2MwNTAwMDksIDB4YWZhMjAwMTQsCi0weDhkNjYwMDAwLCAweDEwMDAwMDMzLCAweDM0YTUwNjAwLCAweDhmNDIwMzA4LAotMHgyNDEzMDAwMSwgMHgyNDQyMDAwMSwgMHhhZjQyMDMwOCwgMHg4ZjQyMDMwOCwKLTB4MTAwMDAwMWMsIDB4MzI2MjAwZmYsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsCi0weDI0NzAwM2U4LCAweDIwMjEwMjMsIDB4MmM0MjAzZTksIDB4MTA0MDAwMTQsCi0weDk4MjEsIDB4MjQxMTAwMTAsIDB4OGY0MjAwMGMsIDB4OGY0NDAxNjAsCi0weDhmNDUwMTY0LCAweDhmODYwMTIwLCAweGFmYjEwMDEwLCAweGFmYjIwMDE0LAotMHhhZmEyMDAxOCwgMHg4ZjQyMDEwYywgMHgyNDA3MDAwOCwgMHg0MGY4MDksCi0weDI0YzYwMDFjLCAweDE0NDBmZmU1LCAweDAsIDB4OGY4MjAwNTQsCi0weDIwMjEwMjMsIDB4MmM0MjAzZTksIDB4MTQ0MGZmZWYsIDB4MCwKLTB4MzI2MjAwZmYsIDB4MTQ0MDAwMTEsIDB4MCwgMHg4ZjQyMDM3OCwKLTB4MjQ0MjAwMDEsIDB4YWY0MjAzNzgsIDB4OGY0MjAzNzgsIDB4OGY4MjAxMjAsCi0weDhmYWIwMDM0LCAweGFmYTIwMDEwLCAweDhmODIwMTI0LCAweDNjMDQwMDAxLAotMHgyNDg0NjM3MCwgMHgzYzA1MDAwOSwgMHhhZmEyMDAxNCwgMHg4ZDY2MDAwMCwKLTB4MzRhNTA3MDAsIDB4YzAwMmIzYiwgMHgzYzAzODIxLCAweDhmNDIwMmI4LAotMHgyNDQyMDAwMSwgMHhhZjQyMDJiOCwgMHg4ZjQyMDJiOCwgMHg4ZjQyMDJmNCwKLTB4MjQ0MjAwMDEsIDB4YWY0MjAyZjQsIDB4OGY0MjAyZjQsIDB4OGZiZjAwNTgsCi0weDhmYmUwMDU0LCAweDhmYjUwMDUwLCAweDhmYjMwMDRjLCAweDhmYjIwMDQ4LAotMHg4ZmIxMDA0NCwgMHg4ZmIwMDA0MCwgMHgzZTAwMDA4LCAweDI3YmQwMDYwLAotMHgwLCAweDAsIDB4MCwgMHgyN2JkZmZlMCwKLTB4Mjc2NDQwMDAsIDB4YWZiZjAwMTgsIDB4YzAwMmJhOCwgMHgyNDA1MTAwMCwKLTB4M2MwMzAwMDEsIDB4MzQ2MzJjYzAsIDB4M2MwNDAwMDEsIDB4MzQ4NDJlYzgsCi0weDI0MDIwMDIwLCAweGFmODIwMTFjLCAweDJlMzEwMjEsIDB4YWY4MDAxMDAsCi0weGFmODAwMTA0LCAweGFmODAwMTA4LCAweGFmODAwMTEwLCAweGFmODAwMTE0LAotMHhhZjgwMDExOCwgMHhhZjgwMDEyMCwgMHhhZjgwMDEyNCwgMHhhZjgwMDEyOCwKLTB4YWY4MDAxMzAsIDB4YWY4MDAxMzQsIDB4YWY4MDAxMzgsIDB4YWY0MjAwZWMsCi0weDJlMzEwMjEsIDB4YWY0MjAwZjAsIDB4MmU0MTAyMSwgMHhhZjQyMDBmNCwKLTB4MmU0MTAyMSwgMHhhZjQyMDBmOCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsCi0weDkwNDI0MGY0LCAweDE0NDAwMDFjLCAweDNjMDUwMDAxLCAweDhmODIwMTFjLAotMHgzYzA0MDAwMSwgMHgyNDg0NjQ3MCwgMHgzYzA1MDAwMSwgMHgzNDQyMDAwMSwKLTB4YWY4MjAxMWMsIDB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsIDB4OGY4NjAxMWMsCi0weDM0YTUwMTAwLCAweGMwMDJiM2IsIDB4MzgyMSwgMHg4YzAyMDIxOCwKLTB4MzA0MjAwNDAsIDB4MTA0MDAwMTQsIDB4MCwgMHg4ZjgyMDExYywKLTB4M2MwNDAwMDEsIDB4MjQ4NDY0N2MsIDB4M2MwNTAwMDEsIDB4MzQ0MjAwMDQsCi0weGFmODIwMTFjLCAweGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhmODYwMTFjLAotMHgxMDAwMDAwNywgMHgzNGE1MDIwMCwgMHgzYzA0MDAwMSwgMHgyNDg0NjQ4NCwKLTB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsIDB4OGY4NjAxMWMsIDB4MzRhNTAzMDAsCi0weGMwMDJiM2IsIDB4MzgyMSwgMHg4ZmJmMDAxOCwgMHgzZTAwMDA4LAotMHgyN2JkMDAyMCwgMHg4ZmE5MDAxMCwgMHg4ZjgzMDEyYywgMHg4ZmFhMDAxNCwKLTB4OGZhYjAwMTgsIDB4MTA2MDAwMGEsIDB4Mjc2MjRmZTAsIDB4MTQ2MjAwMDIsCi0weDI0NjgwMDIwLCAweDI3Njg0ODAwLCAweDhmODIwMTI4LCAweDExMDIwMDA0LAotMHgwLCAweDhmODIwMTI0LCAweDE1MDIwMDA3LCAweDAsCi0weDhmNDMwMzM0LCAweDEwMjEsIDB4MjQ2MzAwMDEsIDB4YWY0MzAzMzQsCi0weDEwMDAwMDM5LCAweDhmNDMwMzM0LCAweGFjNjQwMDAwLCAweGFjNjUwMDA0LAotMHhhYzY2MDAwOCwgMHhhNDY3MDAwZSwgMHhhYzY5MDAxOCwgMHhhYzZhMDAxYywKLTB4YWM2YjAwMTAsIDB4YWM2MjAwMTQsIDB4YWY4ODAxMjAsIDB4OGY0MjAwZmMsCi0weDhmNDQwMGY0LCAweDI0NDJmZmZmLCAweGFmNDIwMGZjLCAweDhjODIwMDAwLAotMHgxMDQ5MDAwNSwgMHgzMDQyZmY4ZiwgMHgxMDQwMDAxOSwgMHgzMTIyZmY4ZiwKLTB4MTA0MDAwMTgsIDB4M2MwMjAwMDEsIDB4OGM4MzAwMDQsIDB4MmM2MjAwMTAsCi0weDEwNDAwMDEzLCAweDNjMDIwMDAxLCAweDI0NjMwMDAxLCAweGFjODMwMDA0LAotMHg4ZjQzMDBmOCwgMHgzNDQyMzBjOCwgMHgyZTIxMDIxLCAweDU0NjIwMDA0LAotMHgyNDYyMDAwOCwgMHgzYzAyMDAwMSwgMHgzNDQyMmVjOCwgMHgyZTIxMDIxLAotMHgxNDQ0MDAxNSwgMHgyNDAyMDAwMSwgMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwKLTB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIDB4MTAwMDAwMGYsIDB4MjQwMjAwMDEsCi0weDNjMDIwMDAxLCAweDM0NDIzMGM4LCAweDJlMjEwMjEsIDB4NTQ4MjAwMDQsCi0weDI0ODIwMDA4LCAweDNjMDIwMDAxLCAweDM0NDIyZWM4LCAweDJlMjEwMjEsCi0weDQwMjAyMSwgMHgyNDAyMDAwMSwgMHhhZjQ0MDBmNCwgMHhhYzg5MDAwMCwKLTB4YWM4MjAwMDQsIDB4MjQwMjAwMDEsIDB4M2UwMDAwOCwgMHgwLAotMHgzZTAwMDA4LCAweDAsIDB4OGZhOTAwMTAsIDB4OGY4MzAxMGMsCi0weDhmYWEwMDE0LCAweDhmYWIwMDE4LCAweDEwNjAwMDBhLCAweDI3NjI0N2UwLAotMHgxNDYyMDAwMiwgMHgyNDY4MDAyMCwgMHgyNzY4NDAwMCwgMHg4ZjgyMDEwOCwKLTB4MTEwMjAwMDQsIDB4MCwgMHg4ZjgyMDEwNCwgMHgxNTAyMDAwNywKLTB4MCwgMHg4ZjQzMDMzOCwgMHgxMDIxLCAweDI0NjMwMDAxLAotMHhhZjQzMDMzOCwgMHgxMDAwMDAzNSwgMHg4ZjQzMDMzOCwgMHhhYzY0MDAwMCwKLTB4YWM2NTAwMDQsIDB4YWM2NjAwMDgsIDB4YTQ2NzAwMGUsIDB4YWM2OTAwMTgsCi0weGFjNmEwMDFjLCAweGFjNmIwMDEwLCAweGFjNjIwMDE0LCAweGFmODgwMTAwLAotMHg4ZjQ0MDBlYywgMHg4YzgyMDAwMCwgMHgzMDQyMDAwNiwgMHgxMDQwMDAxOSwKLTB4MzEyMjAwMDYsIDB4MTA0MDAwMTgsIDB4M2MwMjAwMDEsIDB4OGM4MzAwMDQsCi0weDJjNjIwMDEwLCAweDEwNDAwMDEzLCAweDNjMDIwMDAxLCAweDI0NjMwMDAxLAotMHhhYzgzMDAwNCwgMHg4ZjQzMDBmMCwgMHgzNDQyMmVjMCwgMHgyZTIxMDIxLAotMHg1NDYyMDAwNCwgMHgyNDYyMDAwOCwgMHgzYzAyMDAwMSwgMHgzNDQyMmNjMCwKLTB4MmUyMTAyMSwgMHgxNDQ0MDAxNSwgMHgyNDAyMDAwMSwgMHg4ZjgyMDEwOCwKLTB4MjQ0MjAwMjAsIDB4YWY4MjAxMDgsIDB4OGY4MjAxMDgsIDB4MTAwMDAwMGYsCi0weDI0MDIwMDAxLCAweDNjMDIwMDAxLCAweDM0NDIyZWMwLCAweDJlMjEwMjEsCi0weDU0ODIwMDA0LCAweDI0ODIwMDA4LCAweDNjMDIwMDAxLCAweDM0NDIyY2MwLAotMHgyZTIxMDIxLCAweDQwMjAyMSwgMHgyNDAyMDAwMSwgMHhhZjQ0MDBlYywKLTB4YWM4OTAwMDAsIDB4YWM4MjAwMDQsIDB4MjQwMjAwMDEsIDB4M2UwMDAwOCwKLTB4MCwgMHgzZTAwMDA4LCAweDAsIDB4MjdiZGZmZDgsCi0weDNjMDQwMDAxLCAweDI0ODQ2NDhjLCAweDNjMDUwMDAxLCAweGFmYmYwMDI0LAotMHhhZmIyMDAyMCwgMHhhZmIxMDAxYywgMHhhZmIwMDAxOCwgMHg4ZjkwMDEwNCwKLTB4OGY5MTAwYjAsIDB4OGY5MjAxMWMsIDB4MzRhNTI1MDAsIDB4OGY4MjAxMDAsCi0weDI0MDMwMjEsIDB4MjIwMzgyMSwgMHhhZmEyMDAxMCwgMHhjMDAyYjNiLAotMHhhZmIwMDAxNCwgMHg4ZTAyMDAwOCwgMHhhZmEyMDAxMCwgMHg4ZTAyMDAwYywKLTB4M2MwNDAwMDEsIDB4MjQ4NDY0OTgsIDB4YWZhMjAwMTQsIDB4OGUwNjAwMDAsCi0weDhlMDcwMDA0LCAweDNjMDUwMDAxLCAweGMwMDJiM2IsIDB4MzRhNTI1MTAsCi0weDhlMDIwMDE4LCAweGFmYTIwMDEwLCAweDhlMDIwMDFjLCAweDNjMDQwMDAxLAotMHgyNDg0NjRhNCwgMHhhZmEyMDAxNCwgMHg4ZTA2MDAxMCwgMHg4ZTA3MDAxNCwKLTB4M2MwNTAwMDEsIDB4YzAwMmIzYiwgMHgzNGE1MjUyMCwgMHgzYzAyN2YwMCwKLTB4MjIyMTAyNCwgMHgzYzAzMDgwMCwgMHg1NDQzMDAxNiwgMHgzYzAzMDIwMCwKLTB4OGY4MjAwOWMsIDB4MzA0MmZmZmYsIDB4MTQ0MDAwMTIsIDB4M2MwMzAyMDAsCi0weDNjMDQwMDAxLCAweDI0ODQ2NGIwLCAweDNjMDUwMDAyLCAweDM0YTVmMDMwLAotMHgzMDIxLCAweDM4MjEsIDB4MzY0MjAwMDIsIDB4YWY4MjAxMWMsCi0weDM2MjIwMDAxLCAweGFmODIwMGIwLCAweGFmOTAwMTA0LCAweGFmOTIwMTFjLAotMHhhZmEwMDAxMCwgMHhjMDAyYjNiLCAweGFmYTAwMDE0LCAweDEwMDAwMDI0LAotMHgwLCAweDJjMzEwMjQsIDB4MTA0MDAwMGQsIDB4MjIzMTAyNCwKLTB4MTA0MDAwMGIsIDB4MzY0MjAwMDIsIDB4YWY4MjAxMWMsIDB4MzYyMjAwMDEsCi0weGFmODIwMGIwLCAweGFmOTAwMTA0LCAweGFmOTIwMTFjLCAweDhmNDIwMzMwLAotMHgyNDQyMDAwMSwgMHhhZjQyMDMzMCwgMHgxMDAwMDAxNSwgMHg4ZjQyMDMzMCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDY0YjgsIDB4MjQwMjAyYTksIDB4YWZhMjAwMTAsCi0weGFmYTAwMDE0LCAweDhmODYwMTQ0LCAweDNjMDcwMDAxLCAweDI0ZTc2NGMwLAotMHhjMDAyYjNiLCAweDM0MDVkZWFkLCAweDhmODIwMTFjLCAweDM0NDIwMDAyLAotMHhhZjgyMDExYywgMHg4ZjgyMDIyMCwgMHgzNDQyMDAwNCwgMHhhZjgyMDIyMCwKLTB4OGY4MjAxNDAsIDB4M2MwMzAwMDEsIDB4NDMxMDI1LCAweGFmODIwMTQwLAotMHg4ZmJmMDAyNCwgMHg4ZmIyMDAyMCwgMHg4ZmIxMDAxYywgMHg4ZmIwMDAxOCwKLTB4M2UwMDAwOCwgMHgyN2JkMDAyOCwgMHgyN2JkZmZkOCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDY0ZTgsIDB4M2MwNTAwMDEsIDB4YWZiZjAwMjQsIDB4YWZiMjAwMjAsCi0weGFmYjEwMDFjLCAweGFmYjAwMDE4LCAweDhmOTAwMTI0LCAweDhmOTEwMGEwLAotMHg4ZjkyMDExYywgMHgzNGE1MjYwMCwgMHg4ZjgyMDEyMCwgMHgyNDAzMDIxLAotMHgyMjAzODIxLCAweGFmYTIwMDEwLCAweGMwMDJiM2IsIDB4YWZiMDAwMTQsCi0weDhlMDIwMDA4LCAweGFmYTIwMDEwLCAweDhlMDIwMDBjLCAweDNjMDQwMDAxLAotMHgyNDg0NjRmNCwgMHhhZmEyMDAxNCwgMHg4ZTA2MDAwMCwgMHg4ZTA3MDAwNCwKLTB4M2MwNTAwMDEsIDB4YzAwMmIzYiwgMHgzNGE1MjYxMCwgMHg4ZTAyMDAxOCwKLTB4YWZhMjAwMTAsIDB4OGUwMjAwMWMsIDB4M2MwNDAwMDEsIDB4MjQ4NDY1MDAsCi0weGFmYTIwMDE0LCAweDhlMDYwMDEwLCAweDhlMDcwMDE0LCAweDNjMDUwMDAxLAotMHhjMDAyYjNiLCAweDM0YTUyNjIwLCAweDNjMDI3ZjAwLCAweDIyMjEwMjQsCi0weDNjMDMwODAwLCAweDU0NDMwMDE2LCAweDNjMDMwMjAwLCAweDhmODIwMGFjLAotMHgzMDQyZmZmZiwgMHgxNDQwMDAxMiwgMHgzYzAzMDIwMCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDY1MGMsIDB4M2MwNTAwMDEsIDB4MzRhNWYwMzAsIDB4MzAyMSwKLTB4MzgyMSwgMHgzNjQyMDAwMiwgMHhhZjgyMDExYywgMHgzNjIyMDAwMSwKLTB4YWY4MjAwYTAsIDB4YWY5MDAxMjQsIDB4YWY5MjAxMWMsIDB4YWZhMDAwMTAsCi0weGMwMDJiM2IsIDB4YWZhMDAwMTQsIDB4MTAwMDAwMjQsIDB4MCwKLTB4MmMzMTAyNCwgMHgxMDQwMDAwZCwgMHgyMjMxMDI0LCAweDEwNDAwMDBiLAotMHgzNjQyMDAwMiwgMHhhZjgyMDExYywgMHgzNjIyMDAwMSwgMHhhZjgyMDBhMCwKLTB4YWY5MDAxMjQsIDB4YWY5MjAxMWMsIDB4OGY0MjAzMmMsIDB4MjQ0MjAwMDEsCi0weGFmNDIwMzJjLCAweDEwMDAwMDE1LCAweDhmNDIwMzJjLCAweDNjMDQwMDAxLAotMHgyNDg0NjRiOCwgMHgyNDAyMDJlMiwgMHhhZmEyMDAxMCwgMHhhZmEwMDAxNCwKLTB4OGY4NjAxNDQsIDB4M2MwNzAwMDEsIDB4MjRlNzY0YzAsIDB4YzAwMmIzYiwKLTB4MzQwNWRlYWQsIDB4OGY4MjAxMWMsIDB4MzQ0MjAwMDIsIDB4YWY4MjAxMWMsCi0weDhmODIwMjIwLCAweDM0NDIwMDA0LCAweGFmODIwMjIwLCAweDhmODIwMTQwLAotMHgzYzAzMDAwMSwgMHg0MzEwMjUsIDB4YWY4MjAxNDAsIDB4OGZiZjAwMjQsCi0weDhmYjIwMDIwLCAweDhmYjEwMDFjLCAweDhmYjAwMDE4LCAweDNlMDAwMDgsCi0weDI3YmQwMDI4LCAweDYwMjEsIDB4NTAyMSwgMHgzMDIxLAotMHgyODIxLCAweDY4MjEsIDB4NDgyMSwgMHg3ODIxLAotMHg3MDIxLCAweDhmODgwMTI0LCAweDhmODcwMTA0LCAweDE1ODAwMDJlLAotMHg4ZjhiMDExYywgMHgxMWEwMDAxNCwgMHgzMTYyMDgwMCwgMHg4ZjgyMDEyMCwKLTB4MTA0NjAwMjksIDB4MCwgMHgzYzA0MDAwMSwgMHg4Yzg0NmVlNCwKLTB4OGNjMjAwMDAsIDB4OGNjMzAwMDQsIDB4YWM4MjAwMDAsIDB4YWM4MzAwMDQsCi0weDhjYzIwMDA4LCAweGFjODIwMDA4LCAweDk0YzIwMDBlLCAweGE0ODIwMDBlLAotMHg4Y2MyMDAxMCwgMHgyNDBjMDAwMSwgMHhhYzgyMDAxMCwgMHg4Y2MyMDAxNCwKLTB4MTAwMDAwMTIsIDB4MjRjNjAwMjAsIDB4MTA0MDAwMTcsIDB4MCwKLTB4M2MwNDAwMDEsIDB4OGM4NDZlZTQsIDB4OGQwMjAwMDAsIDB4OGQwMzAwMDQsCi0weGFjODIwMDAwLCAweGFjODMwMDA0LCAweDhkMDIwMDA4LCAweGFjODIwMDA4LAotMHg5NTAyMDAwZSwgMHhhNDgyMDAwZSwgMHg4ZDAyMDAxMCwgMHgyNTA2MDAyMCwKLTB4YWM4MjAwMTAsIDB4OGQwMjAwMTQsIDB4MjQwYzAwMDEsIDB4YzAxODIxLAotMHhhYzgyMDAxNCwgMHgyNzYyNGZlMCwgMHg0MzEwMmIsIDB4NTQ0MDAwMDEsCi0weDI3NjM0ODAwLCAweDYwMzAyMSwgMHgxNTQwMDAyZiwgMHgzMTYyMDEwMCwKLTB4MTEyMDAwMTQsIDB4MzE2MjgwMDAsIDB4OGY4MjAxMDAsIDB4MTA0NTAwMmEsCi0weDMxNjIwMTAwLCAweDNjMDQwMDAxLCAweDhjODQ2ZWUwLCAweDhjYTIwMDAwLAotMHg4Y2EzMDAwNCwgMHhhYzgyMDAwMCwgMHhhYzgzMDAwNCwgMHg4Y2EyMDAwOCwKLTB4YWM4MjAwMDgsIDB4OTRhMjAwMGUsIDB4YTQ4MjAwMGUsIDB4OGNhMjAwMTAsCi0weDI0MGEwMDAxLCAweGFjODIwMDEwLCAweDhjYTIwMDE0LCAweDEwMDAwMDEyLAotMHgyNGE1MDAyMCwgMHgxMDQwMDAxOCwgMHgzMTYyMDEwMCwgMHgzYzA0MDAwMSwKLTB4OGM4NDZlZTAsIDB4OGNlMjAwMDAsIDB4OGNlMzAwMDQsIDB4YWM4MjAwMDAsCi0weGFjODMwMDA0LCAweDhjZTIwMDA4LCAweGFjODIwMDA4LCAweDk0ZTIwMDBlLAotMHhhNDgyMDAwZSwgMHg4Y2UyMDAxMCwgMHgyNGU1MDAyMCwgMHhhYzgyMDAxMCwKLTB4OGNlMjAwMTQsIDB4MjQwYTAwMDEsIDB4YTAxODIxLCAweGFjODIwMDE0LAotMHgyNzYyNDdlMCwgMHg0MzEwMmIsIDB4NTQ0MDAwMDEsIDB4Mjc2MzQwMDAsCi0weDYwMjgyMSwgMHgzMTYyMDEwMCwgMHg1NDQwMDAxZCwgMHgzMTYyMTAwMCwKLTB4MTFhMDAwMDksIDB4MzFhMjA4MDAsIDB4MTA0MDAwMDQsIDB4MjUwMjAwMjAsCi0weDhmODIwMGE4LCAweGE1ZTIwMDAwLCAweDI1MDIwMDIwLCAweGFmODIwMTI0LAotMHg4Zjg4MDEyNCwgMHg2ODIxLCAweDExODAwMDExLCAweDMxNjIxMDAwLAotMHgzYzA0MDAwMSwgMHg4Yzg0NmVlNCwgMHg4YzgyMDAwMCwgMHg4YzgzMDAwNCwKLTB4YWY4MjAwODAsIDB4YWY4MzAwODQsIDB4OGM4MjAwMDgsIDB4YWY4MjAwYTQsCi0weDk0ODIwMDBlLCAweGFmODIwMGFjLCAweDhjODIwMDEwLCAweDYwMjEsCi0weGFmODIwMGEwLCAweDhjOGQwMDEwLCAweDhjOGYwMDE0LCAweDMxNjIxMDAwLAotMHgxNDQwZmY4MiwgMHgwLCAweDExMjAwMDBmLCAweDMxMjIwODAwLAotMHgxMDQwMDAwNCwgMHgzYzAyMDAwMiwgMHg4ZjgyMDBiOCwgMHhhNWMyMDAwMCwKLTB4M2MwMjAwMDIsIDB4MTIyMTAyNCwgMHgxMDQwMDAwNCwgMHgyNGUyMDAyMCwKLTB4OGY4MjAwYjQsIDB4YWY4MjAwZDQsIDB4MjRlMjAwMjAsIDB4YWY4MjAxMDQsCi0weDhmODcwMTA0LCAweDQ4MjEsIDB4MTE0MGZmNzAsIDB4MCwKLTB4M2MwNDAwMDEsIDB4OGM4NDZlZTAsIDB4OGM4MjAwMDAsIDB4OGM4MzAwMDQsCi0weGFmODIwMDkwLCAweGFmODMwMDk0LCAweDhjODIwMDA4LCAweGFmODIwMGI0LAotMHg5NDgyMDAwZSwgMHhhZjgyMDA5YywgMHg4YzgyMDAxMCwgMHg1MDIxLAotMHhhZjgyMDBiMCwgMHg4Yzg5MDAxMCwgMHgxMDAwZmY2MCwgMHg4YzhlMDAxNCwKLTB4M2UwMDAwOCwgMHgwLCAweDYwMjEsIDB4NTgyMSwKLTB4MzAyMSwgMHgyODIxLCAweDY4MjEsIDB4NTAyMSwKLTB4NzgyMSwgMHg3MDIxLCAweDhmODgwMTI0LCAweDhmODcwMTA0LAotMHgzYzE4MDEwMCwgMHgxNTgwMDAyZSwgMHg4Zjg5MDExYywgMHgxMWEwMDAxNCwKLTB4MzEyMjA4MDAsIDB4OGY4MjAxMjAsIDB4MTA0NjAwMjksIDB4MCwKLTB4M2MwNDAwMDEsIDB4OGM4NDZlZTQsIDB4OGNjMjAwMDAsIDB4OGNjMzAwMDQsCi0weGFjODIwMDAwLCAweGFjODMwMDA0LCAweDhjYzIwMDA4LCAweGFjODIwMDA4LAotMHg5NGMyMDAwZSwgMHhhNDgyMDAwZSwgMHg4Y2MyMDAxMCwgMHgyNDBjMDAwMSwKLTB4YWM4MjAwMTAsIDB4OGNjMjAwMTQsIDB4MTAwMDAwMTIsIDB4MjRjNjAwMjAsCi0weDEwNDAwMDE3LCAweDAsIDB4M2MwNDAwMDEsIDB4OGM4NDZlZTQsCi0weDhkMDIwMDAwLCAweDhkMDMwMDA0LCAweGFjODIwMDAwLCAweGFjODMwMDA0LAotMHg4ZDAyMDAwOCwgMHhhYzgyMDAwOCwgMHg5NTAyMDAwZSwgMHhhNDgyMDAwZSwKLTB4OGQwMjAwMTAsIDB4MjUwNjAwMjAsIDB4YWM4MjAwMTAsIDB4OGQwMjAwMTQsCi0weDI0MGMwMDAxLCAweGMwMTgyMSwgMHhhYzgyMDAxNCwgMHgyNzYyNGZlMCwKLTB4NDMxMDJiLCAweDU0NDAwMDAxLCAweDI3NjM0ODAwLCAweDYwMzAyMSwKLTB4MTU2MDAwMmYsIDB4MzEyMjAxMDAsIDB4MTE0MDAwMTQsIDB4MzEyMjgwMDAsCi0weDhmODIwMTAwLCAweDEwNDUwMDJhLCAweDMxMjIwMTAwLCAweDNjMDQwMDAxLAotMHg4Yzg0NmVlMCwgMHg4Y2EyMDAwMCwgMHg4Y2EzMDAwNCwgMHhhYzgyMDAwMCwKLTB4YWM4MzAwMDQsIDB4OGNhMjAwMDgsIDB4YWM4MjAwMDgsIDB4OTRhMjAwMGUsCi0weGE0ODIwMDBlLCAweDhjYTIwMDEwLCAweDI0MGIwMDAxLCAweGFjODIwMDEwLAotMHg4Y2EyMDAxNCwgMHgxMDAwMDAxMiwgMHgyNGE1MDAyMCwgMHgxMDQwMDAxOCwKLTB4MzEyMjAxMDAsIDB4M2MwNDAwMDEsIDB4OGM4NDZlZTAsIDB4OGNlMjAwMDAsCi0weDhjZTMwMDA0LCAweGFjODIwMDAwLCAweGFjODMwMDA0LCAweDhjZTIwMDA4LAotMHhhYzgyMDAwOCwgMHg5NGUyMDAwZSwgMHhhNDgyMDAwZSwgMHg4Y2UyMDAxMCwKLTB4MjRlNTAwMjAsIDB4YWM4MjAwMTAsIDB4OGNlMjAwMTQsIDB4MjQwYjAwMDEsCi0weGEwMTgyMSwgMHhhYzgyMDAxNCwgMHgyNzYyNDdlMCwgMHg0MzEwMmIsCi0weDU0NDAwMDAxLCAweDI3NjM0MDAwLCAweDYwMjgyMSwgMHgzMTIyMDEwMCwKLTB4NTQ0MDAwMWQsIDB4MzEyMjEwMDAsIDB4MTFhMDAwMDksIDB4MzFhMjA4MDAsCi0weDEwNDAwMDA0LCAweDI1MDIwMDIwLCAweDhmODIwMGE4LCAweGE1ZTIwMDAwLAotMHgyNTAyMDAyMCwgMHhhZjgyMDEyNCwgMHg4Zjg4MDEyNCwgMHg2ODIxLAotMHgxMTgwMDAxMSwgMHgzMTIyMTAwMCwgMHgzYzA0MDAwMSwgMHg4Yzg0NmVlNCwKLTB4OGM4MjAwMDAsIDB4OGM4MzAwMDQsIDB4YWY4MjAwODAsIDB4YWY4MzAwODQsCi0weDhjODIwMDA4LCAweGFmODIwMGE0LCAweDk0ODIwMDBlLCAweGFmODIwMGFjLAotMHg4YzgyMDAxMCwgMHg2MDIxLCAweGFmODIwMGEwLCAweDhjOGQwMDEwLAotMHg4YzhmMDAxNCwgMHgzMTIyMTAwMCwgMHgxNDQwMDAyMiwgMHgwLAotMHgxMTQwMDAwZiwgMHgzMTQyMDgwMCwgMHgxMDQwMDAwNCwgMHgzYzAyMDAwMiwKLTB4OGY4MjAwYjgsIDB4YTVjMjAwMDAsIDB4M2MwMjAwMDIsIDB4MTQyMTAyNCwKLTB4MTA0MDAwMDQsIDB4MjRlMjAwMjAsIDB4OGY4MjAwYjQsIDB4YWY4MjAwZDQsCi0weDI0ZTIwMDIwLCAweGFmODIwMTA0LCAweDhmODcwMTA0LCAweDUwMjEsCi0weDExNjAwMDEwLCAweDAsIDB4M2MwNDAwMDEsIDB4OGM4NDZlZTAsCi0weDhjODIwMDAwLCAweDhjODMwMDA0LCAweGFmODIwMDkwLCAweGFmODMwMDk0LAotMHg4YzgyMDAwOCwgMHhhZjgyMDBiNCwgMHg5NDgyMDAwZSwgMHhhZjgyMDA5YywKLTB4OGM4MjAwMTAsIDB4NTgyMSwgMHhhZjgyMDBiMCwgMHg4YzhhMDAxMCwKLTB4OGM4ZTAwMTQsIDB4OGY4MjAwNzAsIDB4M2MwMzEwMDAsIDB4NDMxMDI0LAotMHgxMDQwZmY1YywgMHgwLCAweDhmODIwMDU0LCAweDI0NDIwMDA1LAotMHhhZjgyMDA3OCwgMHg4YzA0MDIzNCwgMHgxMDgwMDAxNiwgMHgxODIxLAotMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OGM0MjQwZTgsIDB4MjQ0MjAwMDUsCi0weDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhYzIyNDBlOCwgMHgzYzAyMDAwMSwKLTB4NTcxMDIxLCAweDhjNDI0MGU4LCAweDQ0MTAyYiwgMHgxNDQwMDAwOSwKLTB4MjQwMjAwMDEsIDB4M2MwMzAwODAsIDB4M2MwMTAwMDEsIDB4MzcwODIxLAotMHhhYzIwNDBlOCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4MTAwMDAwMGMsCi0weGEwMjI0MGYwLCAweDNjMDIwMDAxLCAweDU3MTAyMSwgMHg5MDQyNDBmMCwKLTB4MTQ0MDAwMDYsIDB4M2MwMjAwODAsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLAotMHg5MDQyNDBmMSwgMHgxMDQwMDAwMiwgMHgzYzAyMDA4MCwgMHg2MjE4MjUsCi0weDhjMDQwMjMwLCAweDEwODAwMDEzLCAweDAsIDB4M2MwMjAwMDEsCi0weDU3MTAyMSwgMHg4YzQyNDBlYywgMHgyNDQyMDAwNSwgMHgzYzAxMDAwMSwKLTB4MzcwODIxLCAweGFjMjI0MGVjLCAweDNjMDIwMDAxLCAweDU3MTAyMSwKLTB4OGM0MjQwZWMsIDB4NDQxMDJiLCAweDE0NDAwMDA2LCAweDAsCi0weDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhYzIwNDBlYywgMHgxMDAwMDAwNiwKLTB4NzgxODI1LCAweDNjMDIwMDAxLCAweDU3MTAyMSwgMHg5MDQyNDBmMiwKLTB4NTQ0MDAwMDEsIDB4NzgxODI1LCAweDEwNjBmZjFhLCAweDAsCi0weDhmNDIwMDAwLCAweDEwNDAwMDA3LCAweDAsIDB4YWY4MDAwNGMsCi0weDhmODIwMDRjLCAweDEwNDBmZmZkLCAweDAsIDB4MTAwMDAwMDUsCi0weDAsIDB4YWY4MDAwNDgsIDB4OGY4MjAwNDgsIDB4MTA0MGZmZmQsCi0weDAsIDB4OGY4MjAwNjAsIDB4NDMxMDI1LCAweGFmODIwMDYwLAotMHg4ZjQyMDAwMCwgMHgxMDQwMDAwMywgMHgwLCAweDEwMDBmZjA1LAotMHhhZjgwMDA0YywgMHgxMDAwZmYwMywgMHhhZjgwMDA0OCwgMHgzZTAwMDA4LAotMHgwLCAweDAsIDB4MCwgMHgzYzAyMDAwMSwKLTB4OGM0MjZkMjgsIDB4MjdiZGZmZTgsIDB4YWZiZjAwMTQsIDB4MTQ0MDAwMTIsCi0weGFmYjAwMDEwLCAweDNjMTAwMDAxLCAweDI2MTA2ZjkwLCAweDIwMDIwMjEsCi0weGMwMDJiYTgsIDB4MjQwNTIwMDAsIDB4MjYwMjFmZTAsIDB4M2MwMTAwMDEsCi0weGFjMjI2ZWVjLCAweDNjMDEwMDAxLCAweGFjMjI2ZWU4LCAweGFjMDIwMjUwLAotMHgyNDAyMjAwMCwgMHhhYzEwMDI1NCwgMHhhYzAyMDI1OCwgMHgyNDAyMDAwMSwKLTB4M2MwMTAwMDEsIDB4YWMyMjZkMjgsIDB4OGZiZjAwMTQsIDB4OGZiMDAwMTAsCi0weDNlMDAwMDgsIDB4MjdiZDAwMTgsIDB4M2MwOTAwMDEsIDB4OGQyOTZlZWMsCi0weDhjODIwMDAwLCAweDhmYTMwMDEwLCAweDhmYTgwMDE0LCAweGFkMjIwMDAwLAotMHg4YzgyMDAwNCwgMHhhZDI1MDAwOCwgMHhhZDIyMDAwNCwgMHg4ZjgyMDA1NCwKLTB4YWQyNjAwMTAsIDB4YWQyNzAwMTQsIDB4YWQyMzAwMTgsIDB4YWQyODAwMWMsCi0weGFkMjIwMDBjLCAweDI1MjlmZmUwLCAweDNjMDIwMDAxLCAweDI0NDI2ZjkwLAotMHgxMjIxMDJiLCAweDEwNDAwMDAzLCAweDAsIDB4M2MwOTAwMDEsCi0weDhkMjk2ZWU4LCAweDNjMDIwMDAxLCAweDhjNDI2ZDEwLCAweGFkMjIwMDAwLAotMHgzYzAyMDAwMSwgMHg4YzQyNmQxMCwgMHgzYzAxMDAwMSwgMHhhYzI5NmVlYywKLTB4YWQyMjAwMDQsIDB4YWMwOTAyNTAsIDB4M2UwMDAwOCwgMHgwLAotMHgyN2JkZmZkMCwgMHhhZmIwMDAxMCwgMHgzYzEwMDAwMSwgMHg4ZTEwNmVlYywKLTB4M2MwMjAwMDEsIDB4OGM0MjZkMTAsIDB4YWZiMTAwMTQsIDB4ODA4ODIxLAotMHhhZmJlMDAyNCwgMHg4ZmJlMDA0MCwgMHg4ZmE0MDA0OCwgMHhhZmIyMDAxOCwKLTB4YTA5MDIxLCAweGFmYmYwMDI4LCAweGFmYjUwMDIwLCAweGFmYjMwMDFjLAotMHhhZTAyMDAwMCwgMHgzYzAyMDAwMSwgMHg4YzQyNmQxMCwgMHhjMDk4MjEsCi0weGUwYTgyMSwgMHgxMDgwMDAwNiwgMHhhZTAyMDAwNCwgMHgyNjA1MDAwOCwKLTB4YzAwMmJiMywgMHgyNDA2MDAxOCwgMHgxMDAwMDAwNSwgMHgyNjEwZmZlMCwKLTB4MjYwNDAwMDgsIDB4YzAwMmJhOCwgMHgyNDA1MDAxOCwgMHgyNjEwZmZlMCwKLTB4M2MwMzAwMDEsIDB4MjQ2MzZmOTAsIDB4MjAzMTAyYiwgMHgxMDQwMDAwMywKLTB4MCwgMHgzYzEwMDAwMSwgMHg4ZTEwNmVlOCwgMHg4ZTIyMDAwMCwKLTB4YWUwMjAwMDAsIDB4OGUyMjAwMDQsIDB4YWUxMjAwMDgsIDB4YWUwMjAwMDQsCi0weDhmODIwMDU0LCAweGFlMTMwMDEwLCAweGFlMTUwMDE0LCAweGFlMWUwMDE4LAotMHg4ZmE4MDA0NCwgMHhhZTA4MDAxYywgMHhhZTAyMDAwYywgMHgyNjEwZmZlMCwKLTB4MjAzMTAyYiwgMHgxMDQwMDAwMywgMHgwLCAweDNjMTAwMDAxLAotMHg4ZTEwNmVlOCwgMHgzYzAyMDAwMSwgMHg4YzQyNmQxMCwgMHhhZTAyMDAwMCwKLTB4M2MwMjAwMDEsIDB4OGM0MjZkMTAsIDB4M2MwMTAwMDEsIDB4YWMzMDZlZWMsCi0weGFlMDIwMDA0LCAweGFjMTAwMjUwLCAweDhmYmYwMDI4LCAweDhmYmUwMDI0LAotMHg4ZmI1MDAyMCwgMHg4ZmIzMDAxYywgMHg4ZmIyMDAxOCwgMHg4ZmIxMDAxNCwKLTB4OGZiMDAwMTAsIDB4M2UwMDAwOCwgMHgyN2JkMDAzMCwgMHg4NTE4MjEsCi0weDgzMTAyYiwgMHgxMDQwMDAwNiwgMHgwLCAweGFjODAwMDAwLAotMHgyNDg0MDAwNCwgMHg4MzEwMmIsIDB4NTQ0MGZmZmQsIDB4YWM4MDAwMDAsCi0weDNlMDAwMDgsIDB4MCwgMHhhNjE4MjEsIDB4YTMxMDJiLAotMHgxMDQwMDAwNywgMHgwLCAweDhjODIwMDAwLCAweGFjYTIwMDAwLAotMHgyNGE1MDAwNCwgMHhhMzEwMmIsIDB4MTQ0MGZmZmIsIDB4MjQ4NDAwMDQsCi0weDNlMDAwMDgsIDB4MCwgMHg4NjE4MjEsIDB4ODMxMDJiLAotMHgxMDQwMDAwNywgMHgwLCAweDhjYTIwMDAwLCAweGFjODIwMDAwLAotMHgyNDg0MDAwNCwgMHg4MzEwMmIsIDB4MTQ0MGZmZmIsIDB4MjRhNTAwMDQsCi0weDNlMDAwMDgsIDB4MCwgMHg2MzA4MCwgMHg4NjE4MjEsCi0weDgzMTAyYiwgMHgxMDQwMDAwNiwgMHgwLCAweGFjODUwMDAwLAotMHgyNDg0MDAwNCwgMHg4MzEwMmIsIDB4NTQ0MGZmZmQsIDB4YWM4NTAwMDAsCi0weDNlMDAwMDgsIDB4MCwgMHgwLCAweDI2ZTUwMDI4LAotMHhhMDMwMjEsIDB4Mjc0MzAxYzAsIDB4OGY0ZDAzNTgsIDB4OGY0NzAzNWMsCi0weDhmNDgwMzYwLCAweDhmNDkwMzY0LCAweDhmNGEwMzY4LCAweDhmNGIwMjA0LAotMHg4ZjRjMDIwMCwgMHgyNDY0MDQwMCwgMHg2NDEwMmIsIDB4MTA0MDAwMDgsCi0weDNjMDIwOGZmLCAweDhjYzIwMDAwLCAweGFjNjIwMDAwLCAweDI0NjMwMDA0LAotMHg2NDEwMmIsIDB4MTQ0MGZmZmIsIDB4MjRjNjAwMDQsIDB4M2MwMjA4ZmYsCi0weDM0NDJmZmZmLCAweDNjMDNjMGZmLCAweGFmNGQwMzU4LCAweGFmNDcwMzVjLAotMHhhZjQ4MDM2MCwgMHhhZjQ5MDM2NCwgMHhhZjRhMDM2OCwgMHhhZjRiMDIwNCwKLTB4YWY0YzAyMDAsIDB4OGY4NDAyMjAsIDB4MzQ2M2ZmZmYsIDB4OGY4NjAyMDAsCi0weDgyMTAyNCwgMHgzNDQyMDAwNCwgMHhjMzE4MjQsIDB4MzQ2MzAwMDQsCi0weGFmODIwMjIwLCAweGFmODMwMjAwLCAweDhjYTIwMjE0LCAweGFjMDIwMDg0LAotMHg4Y2EyMDIxOCwgMHhhYzAyMDA4OCwgMHg4Y2EyMDIxYywgMHhhYzAyMDA4YywKLTB4OGNhMjAyMjAsIDB4YWMwMjAwOTAsIDB4OGNhMjAyMjQsIDB4YWMwMjAwOTQsCi0weDhjYTIwMjI4LCAweGFjMDIwMDk4LCAweDhjYTIwMjJjLCAweGFjMDIwMDljLAotMHg4Y2EyMDIzMCwgMHhhYzAyMDBhMCwgMHg4Y2EyMDIzNCwgMHhhYzAyMDBhNCwKLTB4OGNhMjAyMzgsIDB4YWMwMjAwYTgsIDB4OGNhMjAyM2MsIDB4YWMwMjAwYWMsCi0weDhjYTIwMjQwLCAweGFjMDIwMGIwLCAweDhjYTIwMjQ0LCAweGFjMDIwMGI0LAotMHg4Y2EyMDI0OCwgMHhhYzAyMDBiOCwgMHg4Y2EyMDI0YywgMHhhYzAyMDBiYywKLTB4OGNhMjAwMWMsIDB4YWMwMjAwODAsIDB4OGNhMjAwMTgsIDB4YWMwMjAwYzAsCi0weDhjYTIwMDIwLCAweGFjMDIwMGNjLCAweDhjYTIwMDI0LCAweGFjMDIwMGQwLAotMHg4Y2EyMDFkMCwgMHhhYzAyMDBlMCwgMHg4Y2EyMDFkNCwgMHhhYzAyMDBlNCwKLTB4OGNhMjAxZDgsIDB4YWMwMjAwZTgsIDB4OGNhMjAxZGMsIDB4YWMwMjAwZWMsCi0weDhjYTIwMWUwLCAweGFjMDIwMGYwLCAweDhjYTIwMDk4LCAweDhjYTMwMDljLAotMHhhYzAzMDBmYywgMHg4Y2EyMDBhOCwgMHg4Y2EzMDBhYywgMHhhYzAzMDBmNCwKLTB4OGNhMjAwYTAsIDB4OGNhMzAwYTQsIDB4MzA4NDAwMDQsIDB4YWMwMzAwZjgsCi0weDE0ODAwMDA3LCAweDMwYzIwMDA0LCAweDhmODIwMjIwLCAweDNjMDMwOGZmLAotMHgzNDYzZmZmYiwgMHg0MzEwMjQsIDB4YWY4MjAyMjAsIDB4MzBjMjAwMDQsCi0weDE0NDAwMDA2LCAweDAsIDB4OGY4MjAyMDAsIDB4M2MwM2MwZmYsCi0weDM0NjNmZmZiLCAweDQzMTAyNCwgMHhhZjgyMDIwMCwgMHg4ZjQyMDJkYywKLTB4YTM0MDA1YzUsIDB4MjQ0MjAwMDEsIDB4YWY0MjAyZGMsIDB4OGY0MjAyZGMsCi0weDNlMDAwMDgsIDB4MCwgMHgyN2JkZmZkOCwgMHhhZmJmMDAyNCwKLTB4YWZiMDAwMjAsIDB4OGY0MzAwMjQsIDB4OGY0MjAwMjAsIDB4MTA2MjAwMzgsCi0weDAsIDB4OGY0MzAwMjAsIDB4OGY0MjAwMjQsIDB4NjIyMDIzLAotMHg0ODEwMDAzLCAweDAsIDB4OGY0MjAwNDAsIDB4ODIyMDIxLAotMHg4ZjQzMDAzMCwgMHg4ZjQyMDAyNCwgMHg0MzEwMmIsIDB4MTQ0MDAwMDUsCi0weDAsIDB4OGY0MzAwNDAsIDB4OGY0MjAwMjQsIDB4MTAwMDAwMDUsCi0weDYyMTAyMywgMHg4ZjQyMDAzMCwgMHg4ZjQzMDAyNCwgMHg0MzEwMjMsCi0weDI0NDJmZmZmLCAweDQwNjAyMSwgMHg4YzEwMmEsIDB4NTQ0MDAwMDEsCi0weDgwNjAyMSwgMHg4ZjRhMDAyNCwgMHg4ZjQ5MDA0MCwgMHg4ZjQ4MDAyNCwKLTB4OGY0NDAxODAsIDB4OGY0NTAxODQsIDB4OGY0NjAwMjQsIDB4OGY0YjAwMWMsCi0weDI0MDcwMDAxLCAweGFmYTcwMDEwLCAweDg0MTAwLCAweDEwMDE4MjEsCi0weDE0YzUwMjEsIDB4MjUyOWZmZmYsIDB4MTQ5ODAyNCwgMHhhZmIwMDAxNCwKLTB4OGY0NzAwMTQsIDB4MTAyMSwgMHg2MzEwMCwgMHhhZmE3MDAxOCwKLTB4YTMyODIxLCAweGEzMzgyYiwgMHg4MjIwMjEsIDB4ODcyMDIxLAotMHg4ZjQyMDEwOCwgMHgxNjYzMDIxLCAweDQwZjgwOSwgMHhjMzkwMCwKLTB4NTQ0MDAwMDEsIDB4YWY1MDAwMjQsIDB4OGY0MzAwMjQsIDB4OGY0MjAwMjAsCi0weDE0NjIwMDE4LCAweDAsIDB4OGY0MjAwMDAsIDB4MTA0MDAwMDcsCi0weDAsIDB4YWY4MDAwNGMsIDB4OGY4MjAwNGMsIDB4MTA0MGZmZmQsCi0weDAsIDB4MTAwMDAwMDUsIDB4MCwgMHhhZjgwMDA0OCwKLTB4OGY4MjAwNDgsIDB4MTA0MGZmZmQsIDB4MCwgMHg4ZjgyMDA2MCwKLTB4MjQwM2ZmZWYsIDB4NDMxMDI0LCAweGFmODIwMDYwLCAweDhmNDIwMDAwLAotMHgxMDQwMDAwMywgMHgwLCAweDEwMDAwMDAyLCAweGFmODAwMDRjLAotMHhhZjgwMDA0OCwgMHg4ZmJmMDAyNCwgMHg4ZmIwMDAyMCwgMHgzZTAwMDA4LAotMHgyN2JkMDAyOCwgMHgzZTAwMDA4LCAweDAsIDB4MjdiZGZmYzAsCi0weDMyYzIwMDIwLCAweGFmYmYwMDM4LCAweGFmYjMwMDM0LCAweGFmYjIwMDMwLAotMHhhZmIxMDAyYywgMHgxMDQwMDAwNCwgMHhhZmIwMDAyOCwgMHg4ZjUzMDAyOCwKLTB4MTAwMDAwMDIsIDB4MCwgMHg4ZjUzMDAyMCwgMHg4ZjQyMDAzMCwKLTB4MTA1MzAwZWIsIDB4MjExMDAsIDB4OGY0MzAwMWMsIDB4NjI4MDIxLAotMHg4ZTA0MDAwMCwgMHg4ZTA1MDAwNCwgMHg5NjEyMDAwOCwgMHg4ZjQyMDA5MCwKLTB4OTYxMTAwMGEsIDB4MzI0NmZmZmYsIDB4NDYxMDJhLCAweDEwNDAwMDE3LAotMHgwLCAweDhmODIwMGQ4LCAweDhmNDMwMDk4LCAweDQzMTAyMywKLTB4MjQ0MmRjYmUsIDB4YWY0MjAwOTAsIDB4OGY0MjAwOTAsIDB4Mjg0MmRjYmYsCi0weDEwNDAwMDA1LCAweDAsIDB4OGY0MjAwOTAsIDB4OGY0MzAxNDQsCi0weDQzMTAyMSwgMHhhZjQyMDA5MCwgMHg4ZjQyMDA5MCwgMHg0NjEwMmEsCi0weDEwNDAwMDA2LCAweDAsIDB4OGY0MjAzNDgsIDB4MjQ0MjAwMDEsCi0weGFmNDIwMzQ4LCAweDEwMDAwMGUxLCAweDhmNDIwMzQ4LCAweDhmODIwMGZjLAotMHgxNDQwMDAwNiwgMHgwLCAweDhmNDIwMzQ0LCAweDI0NDIwMDAxLAotMHhhZjQyMDM0NCwgMHgxMDAwMDBkOSwgMHg4ZjQyMDM0NCwgMHg5MzQyMDVjMiwKLTB4MTA0MDAwMGIsIDB4MzJjMjAwMDgsIDB4MTA0MDAwMDgsIDB4MzIyMjAyMDAsCi0weDEwNDAwMDA2LCAweDNjMDM0MDAwLCAweDk2MDIwMDBlLCAweGFmNDMwMGFjLAotMHgyMTQwMCwgMHgxMDAwMDAwMiwgMHhhZjQyMDBiMCwgMHhhZjQwMDBhYywKLTB4MzIyMjAwMDQsIDB4MTA0MDAwN2YsIDB4MzIyMjA4MDAsIDB4MTA0MDAwMDMsCi0weDMyNDdmZmZmLCAweDEwMDAwMDAyLCAweDI0MDIwMDIwLCAweDI0MDIwMDA0LAotMHhhZmEyMDAxMCwgMHg4ZjQyMDAzMCwgMHhhZmEyMDAxNCwgMHg4ZjQyMDAxMCwKLTB4M2MwMzAwMDIsIDB4NDMxMDI1LCAweGFmYTIwMDE4LCAweDhmNDYwMDk4LAotMHg4ZjQyMDEwOCwgMHg0MGY4MDksIDB4MCwgMHgxMDQwMDBiNywKLTB4MCwgMHg4ZjQyMDA5YywgMHg4ZjQzMDA5NCwgMHgyNDIxMDIxLAotMHhhZjQyMDA5YywgMHhhZTAzMDAwYywgMHg4ZjQyMDBhYywgMHgxMDQwMDAwOCwKLTB4M2MwMzQwMDAsIDB4OGY0MjAwOTQsIDB4NDMxMDI1LCAweGFmYTIwMDIwLAotMHg4ZjQyMDA5YywgMHg4ZjQzMDBiMCwgMHgxMDAwMDAwNCwgMHg0MzEwMjUsCi0weDhmNDIwMDk0LCAweGFmYTIwMDIwLCAweDhmNDIwMDljLCAweGFmYTIwMDI0LAotMHg4ZjgyMDBmYywgMHg4ZmEzMDAyMCwgMHg4ZmE0MDAyNCwgMHhhYzQzMDAwMCwKLTB4YWM0NDAwMDQsIDB4MjQ0MjAwMDgsIDB4YWY4MjAwZjAsIDB4OGY0MjAwOWMsCi0weDhmNDQwMjcwLCAweDhmNDUwMjc0LCAweDQwMTgyMSwgMHgxMDIxLAotMHhhMzI4MjEsIDB4YTMzMDJiLCAweDgyMjAyMSwgMHg4NjIwMjEsCi0weDMyMjMwMDYwLCAweDI0MDIwMDQwLCAweGFmNDQwMjcwLCAweGFmNDUwMjc0LAotMHgxMDYyMDAxNywgMHgyYzYyMDA0MSwgMHgxMDQwMDAwNSwgMHgyNDAyMDAyMCwKLTB4MTA2MjAwMDgsIDB4MjQwMjAwMDEsIDB4MTAwMDAwMjYsIDB4MCwKLTB4MjQwMjAwNjAsIDB4MTA2MjAwMTksIDB4MjQwMjAwMDEsIDB4MTAwMDAwMjEsCi0weDAsIDB4OGY0MjAyNzgsIDB4OGY0MzAyN2MsIDB4MjQ2MzAwMDEsCi0weDJjNjQwMDAxLCAweDQ0MTAyMSwgMHhhZjQyMDI3OCwgMHhhZjQzMDI3YywKLTB4OGY0MjAyNzgsIDB4OGY0MzAyN2MsIDB4MTAwMDAwMTYsIDB4MjQwMjAwMDEsCi0weDhmNDIwMjgwLCAweDhmNDMwMjg0LCAweDI0NjMwMDAxLCAweDJjNjQwMDAxLAotMHg0NDEwMjEsIDB4YWY0MjAyODAsIDB4YWY0MzAyODQsIDB4OGY0MjAyODAsCi0weDhmNDMwMjg0LCAweDEwMDAwMDBiLCAweDI0MDIwMDAxLCAweDhmNDIwMjg4LAotMHg4ZjQzMDI4YywgMHgyNDYzMDAwMSwgMHgyYzY0MDAwMSwgMHg0NDEwMjEsCi0weGFmNDIwMjg4LCAweGFmNDMwMjhjLCAweDhmNDIwMjg4LCAweDhmNDMwMjhjLAotMHgyNDAyMDAwMSwgMHhhMzQyMDVjMiwgMHg4ZjQyMDA5OCwgMHgzMjQ0ZmZmZiwKLTB4MjQwNmZmZjgsIDB4OGY0NTAxM2MsIDB4NDQxMDIxLCAweDI0NDIwMDA3LAotMHg0NjEwMjQsIDB4MjQ4NDAwMDcsIDB4YWY0MjAwOTQsIDB4OGY0MjAwOTAsCi0weDhmNDMwMDk0LCAweDg2MjAyNCwgMHg0NDEwMjMsIDB4NjUxODJiLAotMHgxNDYwMDAwNSwgMHhhZjQyMDA5MCwgMHg4ZjQyMDA5NCwgMHg4ZjQzMDE0NCwKLTB4NDMxMDIzLCAweGFmNDIwMDk0LCAweDhmNDIwMDk0LCAweDEwMDAwMDIzLAotMHhhZjQwMDA5YywgMHgzMjQ3ZmZmZiwgMHg1MGUwMDAyMiwgMHgzMmMyMDAyMCwKLTB4MTQ0MDAwMDIsIDB4MjQwMjAwMTAsIDB4MjQwMjAwMDIsIDB4YWZhMjAwMTAsCi0weDhmNDIwMDMwLCAweGFmYTIwMDE0LCAweDhmNDIwMDEwLCAweGFmYTIwMDE4LAotMHg4ZjQ2MDA5OCwgMHg4ZjQyMDEwOCwgMHg0MGY4MDksIDB4MCwKLTB4MTA0MDAwM2EsIDB4MzI0NWZmZmYsIDB4OGY0MjAwOTgsIDB4OGY0MzAwOTAsCi0weDhmNDYwMTNjLCAweDQ1MTAyMSwgMHhhZjQyMDA5OCwgMHg4ZjQyMDA5YywKLTB4OGY0NDAwOTgsIDB4YTM0MDA1YzIsIDB4NjUxODIzLCAweGFmNDMwMDkwLAotMHg0NTEwMjEsIDB4ODYyMDJiLCAweDE0ODAwMDA1LCAweGFmNDIwMDljLAotMHg4ZjQyMDA5OCwgMHg4ZjQzMDE0NCwgMHg0MzEwMjMsIDB4YWY0MjAwOTgsCi0weDMyYzIwMDIwLCAweDEwNDAwMDA1LCAweDAsIDB4OGY0MjAzNTgsCi0weDI0NDJmZmZmLCAweGFmNDIwMzU4LCAweDhmNDIwMzU4LCAweDhmNDIwMDMwLAotMHg4ZjQzMDA0MCwgMHgyNDQyMDAwMSwgMHgyNDYzZmZmZiwgMHg0MzEwMjQsCi0weGFmNDIwMDMwLCAweDhmNDIwMDMwLCAweDE0NTMwMDE4LCAweDAsCi0weDhmNDIwMDAwLCAweDEwNDAwMDA3LCAweDAsIDB4YWY4MDAwNGMsCi0weDhmODIwMDRjLCAweDEwNDBmZmZkLCAweDAsIDB4MTAwMDAwMDUsCi0weDAsIDB4YWY4MDAwNDgsIDB4OGY4MjAwNDgsIDB4MTA0MGZmZmQsCi0weDAsIDB4OGY4MjAwNjAsIDB4MjQwM2ZmZjcsIDB4NDMxMDI0LAotMHhhZjgyMDA2MCwgMHg4ZjQyMDAwMCwgMHgxMDQwMDAwMywgMHgwLAotMHgxMDAwMDAwMiwgMHhhZjgwMDA0YywgMHhhZjgwMDA0OCwgMHg4ZmJmMDAzOCwKLTB4OGZiMzAwMzQsIDB4OGZiMjAwMzAsIDB4OGZiMTAwMmMsIDB4OGZiMDAwMjgsCi0weDNlMDAwMDgsIDB4MjdiZDAwNDAsIDB4M2UwMDAwOCwgMHgwLAotMHgyN2JkZmZkMCwgMHgzMmMyMDAyMCwgMHhhZmJmMDAyYywgMHhhZmIyMDAyOCwKLTB4YWZiMTAwMjQsIDB4MTA0MDAwMDQsIDB4YWZiMDAwMjAsIDB4OGY1MjAwMjgsCi0weDEwMDAwMDAyLCAweDAsIDB4OGY1MjAwMjAsIDB4OGY0MjAwMzAsCi0weDEwNTIwMGI1LCAweDIxMTAwLCAweDhmNDMwMDFjLCAweDYyODAyMSwKLTB4OGUwNDAwMDAsIDB4OGUwNTAwMDQsIDB4OTYxMTAwMDgsIDB4OGY0MjAwOTAsCi0weDk2MDcwMDBhLCAweDMyMjZmZmZmLCAweDQ2MTAyYSwgMHgxMDQwMDAxNywKLTB4MCwgMHg4ZjgyMDBkOCwgMHg4ZjQzMDA5OCwgMHg0MzEwMjMsCi0weDI0NDJkYzQ2LCAweGFmNDIwMDkwLCAweDhmNDIwMDkwLCAweDI4NDJkYzQ3LAotMHgxMDQwMDAwNSwgMHgwLCAweDhmNDIwMDkwLCAweDhmNDMwMTQ0LAotMHg0MzEwMjEsIDB4YWY0MjAwOTAsIDB4OGY0MjAwOTAsIDB4NDYxMDJhLAotMHgxMDQwMDAwNiwgMHgwLCAweDhmNDIwMzQ4LCAweDI0NDIwMDAxLAotMHhhZjQyMDM0OCwgMHgxMDAwMDBhYiwgMHg4ZjQyMDM0OCwgMHg4Zjg2MDBmYywKLTB4MTBjMDAwMGMsIDB4MCwgMHg4ZjgyMDBmNCwgMHgyNDAzZmZmOCwKLTB4NDMxMDI0LCAweDQ2MTAyMywgMHgyMThjMywgMHg1ODYwMDAwMSwKLTB4MjQ2MzAxMDAsIDB4OGY0MjAwOGMsIDB4NDMxMDJiLCAweDE0NDAwMDA2LAotMHg3MTJjMiwgMHg4ZjQyMDM0NCwgMHgyNDQyMDAwMSwgMHhhZjQyMDM0NCwKLTB4MTAwMDAwOTgsIDB4OGY0MjAzNDQsIDB4OTM0MzA1YzIsIDB4MTA2MDAwMGYsCi0weDMwNDYwMDAxLCAweDhmNDIwMDEwLCAweDM0NDgwNDAwLCAweDMyYzIwMDA4LAotMHgxMDQwMDAwOCwgMHgzMGUyMDIwMCwgMHgxMDQwMDAwNiwgMHgzYzAzNDAwMCwKLTB4OTYwMjAwMGUsIDB4YWY0MzAwYWMsIDB4MjE0MDAsIDB4MTAwMDAwMDQsCi0weGFmNDIwMGIwLCAweDEwMDAwMDAyLCAweGFmNDAwMGFjLCAweDhmNDgwMDEwLAotMHgzMGUyMDAwNCwgMHgxMDQwMDA0NSwgMHgzMjI3ZmZmZiwgMHg4ZjQ5MDBhYywKLTB4MTEyMDAwMDUsIDB4MzBjMjAwZmYsIDB4MTQ0MDAwMDYsIDB4MjQwMjAwNDAsCi0weDEwMDAwMDA0LCAweDI0MDIwMDA4LCAweDE0NDAwMDAyLCAweDI0MDIwMDIwLAotMHgyNDAyMDAwNCwgMHhhZmEyMDAxMCwgMHg4ZjQzMDAzMCwgMHgxMTIwMDAwNCwKLTB4YWZhMzAwMTQsIDB4OGY0MjAwYjAsIDB4NjIxMDI1LCAweGFmYTIwMDE0LAotMHgzYzAyMDAwMiwgMHgxMDIxMDI1LCAweGFmYTIwMDE4LCAweDhmNDYwMDk4LAotMHg4ZjQyMDEwOCwgMHg0MGY4MDksIDB4MCwgMHgxMDQwMDA2OSwKLTB4MzIyNGZmZmYsIDB4OGY0MjAwOGMsIDB4OGY0MzAwOTQsIDB4MjQ0MjAwMDEsCi0weGFmNDIwMDhjLCAweDI0MDIwMDAxLCAweGFlMDMwMDBjLCAweGEzNDIwNWMyLAotMHg4ZjQyMDA5OCwgMHgyNDA2ZmZmOCwgMHg4ZjQ1MDEzYywgMHg0NDEwMjEsCi0weDI0NDIwMDA3LCAweDQ2MTAyNCwgMHgyNDg0MDAwNywgMHhhZjQyMDA5NCwKLTB4OGY0MjAwOTAsIDB4OGY0MzAwOTQsIDB4ODYyMDI0LCAweDQ0MTAyMywKLTB4NjUxODJiLCAweDE0NjAwMDA1LCAweGFmNDIwMDkwLCAweDhmNDIwMDk0LAotMHg4ZjQzMDE0NCwgMHg0MzEwMjMsIDB4YWY0MjAwOTQsIDB4OGY0MzAwOTQsCi0weDhmNDIwMTQwLCAweDQzMTAyYiwgMHgxMDQwMDAwOSwgMHgwLAotMHg4ZjQzMDEzYywgMHg4ZjQ0MDA5NCwgMHg4ZjQyMDA5MCwgMHg4ZjQ1MDEzOCwKLTB4NjQxODIzLCAweDQzMTAyMywgMHhhZjQyMDA5MCwgMHhhZjQ1MDA5NCwKLTB4OGY0MjAwOTQsIDB4MTAwMDAwMWYsIDB4YWY0MjAwOTgsIDB4MTBlMDAwMWQsCi0weDMwYzIwMGZmLCAweDE0NDAwMDAyLCAweDI0MDIwMDEwLCAweDI0MDIwMDAyLAotMHhhZmEyMDAxMCwgMHg4ZjQyMDAzMCwgMHhhZmE4MDAxOCwgMHhhZmEyMDAxNCwKLTB4OGY0NjAwOTgsIDB4OGY0MjAxMDgsIDB4NDBmODA5LCAweDAsCi0weDEwNDAwMDMwLCAweDMyMjVmZmZmLCAweDhmNDIwMDk4LCAweDhmNDQwMTNjLAotMHg0NTEwMjEsIDB4YWY0MjAwOTgsIDB4OGY0MjAwOTAsIDB4OGY0MzAwOTgsCi0weGEzNDAwNWMyLCAweDQ1MTAyMywgMHg2NDE4MmIsIDB4MTQ2MDAwMDUsCi0weGFmNDIwMDkwLCAweDhmNDIwMDk4LCAweDhmNDMwMTQ0LCAweDQzMTAyMywKLTB4YWY0MjAwOTgsIDB4OGY0MjAwMzAsIDB4OGY0MzAwNDAsIDB4MjQ0MjAwMDEsCi0weDI0NjNmZmZmLCAweDQzMTAyNCwgMHhhZjQyMDAzMCwgMHg4ZjQyMDAzMCwKLTB4MTQ1MjAwMTgsIDB4MCwgMHg4ZjQyMDAwMCwgMHgxMDQwMDAwNywKLTB4MCwgMHhhZjgwMDA0YywgMHg4ZjgyMDA0YywgMHgxMDQwZmZmZCwKLTB4MCwgMHgxMDAwMDAwNSwgMHgwLCAweGFmODAwMDQ4LAotMHg4ZjgyMDA0OCwgMHgxMDQwZmZmZCwgMHgwLCAweDhmODIwMDYwLAotMHgyNDAzZmZmNywgMHg0MzEwMjQsIDB4YWY4MjAwNjAsIDB4OGY0MjAwMDAsCi0weDEwNDAwMDAzLCAweDAsIDB4MTAwMDAwMDIsIDB4YWY4MDAwNGMsCi0weGFmODAwMDQ4LCAweDhmYmYwMDJjLCAweDhmYjIwMDI4LCAweDhmYjEwMDI0LAotMHg4ZmIwMDAyMCwgMHgzZTAwMDA4LCAweDI3YmQwMDMwLCAweDNlMDAwMDgsCi0weDAsIDB4MjdiZGZmZDgsIDB4M2MwMjAwMDEsIDB4MzQ0MjJlYzAsCi0weGFmYmYwMDIwLCAweDhmNDMwMGYwLCAweDhmODQwMTA4LCAweDJlMjEwMjEsCi0weDU0NjIwMDA0LCAweDI0NjIwMDA4LCAweDNjMDIwMDAxLCAweDM0NDIyY2MwLAotMHgyZTIxMDIxLCAweDQwMTgyMSwgMHhhZjQzMDBmMCwgMHhhYzYwMDAwMCwKLTB4OGY0MjAwZWMsIDB4OGM2NjAwMDQsIDB4MTQ2MjAwMDQsIDB4M2MwMjAwMDEsCi0weDI0ODIwMDIwLCAweDEwMDAwMDBmLCAweGFmODIwMTA4LCAweDhmNDMwMGYwLAotMHgzNDQyMmVjMCwgMHgyZTIxMDIxLCAweDU0NjIwMDA0LCAweDI0NjIwMDA4LAotMHgzYzAyMDAwMSwgMHgzNDQyMmNjMCwgMHgyZTIxMDIxLCAweDQwMTgyMSwKLTB4OGM2MjAwMDQsIDB4MjExNDAsIDB4ODIxMDIxLCAweGFmODIwMTA4LAotMHhhYzYwMDAwMCwgMHg4Yzg1MDAxOCwgMHgzMGEyMDAzNiwgMHgxMDQwMDA2YywKLTB4MzBhMjAwMDEsIDB4OGM4MjAwMWMsIDB4OGY0MzAwNDAsIDB4OGY0NDAwMzQsCi0weDI0NDIwMDAxLCAweDI0NjNmZmZmLCAweDQzMTAyNCwgMHg4NjIwMjEsCi0weGFmNDIwMDJjLCAweDMwYTIwMDMwLCAweDE0NDAwMDA2LCAweGFmNDQwMDM0LAotMHg4ZjQyMDAzNCwgMHg4YzAzMDIzYywgMHg0MzEwMmIsIDB4MTQ0MDAwYjQsCi0weDAsIDB4MzJjMjAwMTAsIDB4MTA0MDAwMjgsIDB4MjQwNzAwMDgsCi0weDhmNDQwMTcwLCAweDhmNDUwMTc0LCAweDhmNDMwMDJjLCAweDhmNDgwMDBjLAotMHg4Zjg2MDEyMCwgMHgyNDAyMDA4MCwgMHhhZmEyMDAxMCwgMHhhZmEzMDAxNCwKLTB4YWZhODAwMTgsIDB4OGY0MjAxMGMsIDB4NDBmODA5LCAweDI0YzYwMDFjLAotMHgxNDQwMDAxMSwgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsCi0weGEwMjI0MGYxLCAweDhmODIwMTI0LCAweGFmYTIwMDEwLCAweDhmODIwMTI4LAotMHgzYzA0MDAwMSwgMHgyNDg0NjdjNCwgMHhhZmEyMDAxNCwgMHg4ZjQ2MDAyYywKLTB4OGY4NzAxMjAsIDB4M2MwNTAwMDksIDB4YzAwMmIzYiwgMHgzNGE1MTEwMCwKLTB4MTAwMDAwMzYsIDB4MCwgMHg4ZjQyMDMwMCwgMHg4ZjQzMDAyYywKLTB4MjQ0MjAwMDEsIDB4YWY0MjAzMDAsIDB4OGY0MjAzMDAsIDB4MjQwMjAwMDEsCi0weGEzNDIwNWMxLCAweDEwMDAwMDI2LCAweGFmNDMwMDM4LCAweDhmNDQwMTcwLAotMHg4ZjQ1MDE3NCwgMHg4ZjQzMDAyYywgMHg4ZjQ4MDAwYywgMHg4Zjg2MDEyMCwKLTB4MjQwMjAwMjAsIDB4YWZhMjAwMTAsIDB4YWZhMzAwMTQsIDB4YWZhODAwMTgsCi0weDhmNDIwMTBjLCAweDQwZjgwOSwgMHgyNGM2MDAxYywgMHgxNDQwMDAxMSwKLTB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMjI0MGYwLAotMHg4ZjgyMDEyNCwgMHhhZmEyMDAxMCwgMHg4ZjgyMDEyOCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDY3YjgsIDB4YWZhMjAwMTQsIDB4OGY0NjAwMmMsIDB4OGY4NzAxMjAsCi0weDNjMDUwMDA5LCAweGMwMDJiM2IsIDB4MzRhNTA5MDAsIDB4MTAwMDAwMGYsCi0weDAsIDB4OGY0MjAzMDAsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzMDAsCi0weDhmNDIwMzAwLCAweDhmNDIwMDJjLCAweGEzNDAwNWMxLCAweGFmNDIwMDM4LAotMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YTAyMDQwZjEsIDB4M2MwMTAwMDEsCi0weDM3MDgyMSwgMHhhMDIwNDBmMCwgMHhhZjQwMDAzNCwgMHg4ZjQyMDMxNCwKLTB4MjQ0MjAwMDEsIDB4YWY0MjAzMTQsIDB4MTAwMDAwNTksIDB4OGY0MjAzMTQsCi0weDEwNDAwMDIyLCAweDMwYTI3MDAwLCAweDhjODUwMDFjLCAweDhmNDIwMDI4LAotMHhhMjIwMjMsIDB4NDgxMDAwMywgMHgwLCAweDhmNDIwMDQwLAotMHg4MjIwMjEsIDB4OGY0MjAzNTgsIDB4OGY0MzAwMDAsIDB4YWY0NTAwMjgsCi0weDQ0MTAyMSwgMHgxMDYwMDAwNywgMHhhZjQyMDM1OCwgMHhhZjgwMDA0YywKLTB4OGY4MjAwNGMsIDB4MTA0MGZmZmQsIDB4MCwgMHgxMDAwMDAwNSwKLTB4MCwgMHhhZjgwMDA0OCwgMHg4ZjgyMDA0OCwgMHgxMDQwZmZmZCwKLTB4MCwgMHg4ZjgyMDA2MCwgMHgzNDQyMDAwOCwgMHhhZjgyMDA2MCwKLTB4OGY0MjAwMDAsIDB4MTA0MDAwMDMsIDB4MCwgMHgxMDAwMDAzOCwKLTB4YWY4MDAwNGMsIDB4MTAwMDAwMzYsIDB4YWY4MDAwNDgsIDB4MTA0MDAwMmYsCi0weDMwYTIxMDAwLCAweDEwNDAwMDBjLCAweDMwYTI0MDAwLCAweDhjODMwMDFjLAotMHg4ZjQyMDA1MCwgMHg2MjIwMjMsIDB4NDgyMDAwMSwgMHgyNDg0MDIwMCwKLTB4OGY0MjAzNWMsIDB4NDQxMDIxLCAweGFmNDIwMzVjLCAweDhmNDIwMzY4LAotMHgxMDAwMDAxYSwgMHhhZjQzMDA1MCwgMHgxMDQwMDAwYywgMHgzMmMyODAwMCwKLTB4OGM4MzAwMWMsIDB4OGY0MjAwNzAsIDB4NjIyMDIzLCAweDQ4MjAwMDEsCi0weDI0ODQwNDAwLCAweDhmNDIwMzY0LCAweDQ0MTAyMSwgMHhhZjQyMDM2NCwKLTB4OGY0MjAzNjgsIDB4MTAwMDAwMGQsIDB4YWY0MzAwNzAsIDB4MTA0MDAwMGUsCi0weDNjMDIwODAwLCAweDhjODMwMDFjLCAweDhmNDIwMDYwLCAweDYyMjAyMywKLTB4NDgyMDAwMSwgMHgyNDg0MDEwMCwgMHg4ZjQyMDM2MCwgMHg0NDEwMjEsCi0weGFmNDIwMzYwLCAweDhmNDIwMzY4LCAweGFmNDMwMDYwLCAweDQ0MTAyMSwKLTB4YWY0MjAzNjgsIDB4M2MwMjA4MDAsIDB4MmMyMTAyNCwgMHg1MDQwMDAwOCwKLTB4MzY5NDAwNDAsIDB4MTAwMDAwMDYsIDB4MCwgMHgzMGEyMDEwMCwKLTB4MTA0MDAwMDMsIDB4MCwgMHhjMDAyYmQ4LCAweDAsCi0weDhmYmYwMDIwLCAweDNlMDAwMDgsIDB4MjdiZDAwMjgsIDB4M2UwMDAwOCwKLTB4MCwgMHgyN2JkZmZhOCwgMHhhZmJmMDA1MCwgMHhhZmJlMDA0YywKLTB4YWZiNTAwNDgsIDB4YWZiMzAwNDQsIDB4YWZiMjAwNDAsIDB4YWZiMTAwM2MsCi0weGFmYjAwMDM4LCAweDhmOTEwMTA4LCAweDI2MjIwMDIwLCAweGFmODIwMTA4LAotMHg4ZTMyMDAxOCwgMHhhODIxLCAweDMyNDIwMDI0LCAweDEwNDAwMWJhLAotMHhmMDIxLCAweDhlMjYwMDFjLCAweDhmNDMwMDFjLCAweDYxMTAwLAotMHg2MjE4MjEsIDB4OGM3MDAwMGMsIDB4OTYwNDAwMGMsIDB4OTYyZDAwMTYsCi0weDk0NzMwMDBhLCAweDJjODMwNWRkLCAweDM4ODI4ODcwLCAweDJjNDIwMDAxLAotMHg2MjE4MjUsIDB4MTA2MDAwMTUsIDB4MjgyMSwgMHgzMmMyMDA0MCwKLTB4MTA0MDAwMTUsIDB4MjQwMjA4MDAsIDB4OTYwMzAwMTQsIDB4MTQ2MjAwMTIsCi0weDM0MDJhYWFhLCAweDk2MDMwMDBlLCAweDE0NjIwMDA3LCAweDIwMjEsCi0weDk2MDMwMDEwLCAweDI0MDIwMzAwLCAweDE0NjIwMDA0LCAweDgwMTAyMSwKLTB4OTYwMjAwMTIsIDB4MmM0NDAwMDEsIDB4ODAxMDIxLCAweDU0NDAwMDA2LAotMHgyNDA1MDAxNiwgMHgxMDAwMDAwNCwgMHgwLCAweDI0MDIwODAwLAotMHg1MDgyMDAwMSwgMHgyNDA1MDAwZSwgMHg5MzQyMDVjMywgMHgxNDQwMDAwOCwKLTB4NTgyMSwgMHgyNDBiMDAwMSwgMHgzMjYyMDE4MCwgMHhhZjQ1MDBhOCwKLTB4YWY1MDAwYTAsIDB4MTA0MDAwMDIsIDB4YWY0NjAwYTQsIDB4YTM0YjA1YzMsCi0weDEwYTAwMDg1LCAweDIwNTQwMjEsIDB4OTEwMjAwMDAsIDB4MzgyMSwKLTB4MzA0MjAwMGYsIDB4MjUwODAsIDB4MzJjMjAwMDIsIDB4MTA0MDAwMTIsCi0weDEwYTE4MjEsIDB4MzI2MjAwMDIsIDB4MTA0MDAwMTAsIDB4MzJjMjAwMDEsCi0weDEwMDIwMjEsIDB4OTQ4MjAwMDAsIDB4MjQ4NDAwMDIsIDB4ZTIzODIxLAotMHg4MzEwMmIsIDB4MTQ0MGZmZmIsIDB4MzBlMmZmZmYsIDB4NzFjMDIsCi0weDYyMzgyMSwgMHg3MWMwMiwgMHgzMGUyZmZmZiwgMHg2MjM4MjEsCi0weDcxMDI3LCAweGE1MDIwMDBhLCAweDMyYzIwMDAxLCAweDEwNDAwMDZhLAotMHgzMjYyMDAwMSwgMHgxMDQwMDA2OCwgMHgwLCAweDhmNDIwMGE4LAotMHgxMDQwMDA2NSwgMHgwLCAweDhmNDIwMGEwLCAweDhmNDMwMGE4LAotMHg0MzEwMjEsIDB4OTA0YzAwMDksIDB4MzE4OTAwZmYsIDB4MzkyMzAwMDYsCi0weDMxODJiLCAweDM5MjIwMDExLCAweDIxMDJiLCAweDYyMTgyNCwKLTB4MTA2MDAwMGMsIDB4M2MwNTAwMDYsIDB4OGY0MjAwYTQsIDB4M2MwNDAwMDEsCi0weDI0ODQ2N2Q0LCAweGFmYTIwMDEwLCAweDhmNDIwMGEwLCAweDM0YTU0NjAwLAotMHgxMjAzODIxLCAweGMwMDJiM2IsIDB4YWZhMjAwMTQsIDB4MTAwMDAwNGUsCi0weDAsIDB4MzJjMjAwMDQsIDB4MTQ0MDAwMTMsIDB4MjgyMSwKLTB4MzE2MjAwZmYsIDB4MTQ0MDAwMDQsIDB4MCwgMHg5NTAyMDAwMiwKLTB4MTAwMDAwMGQsIDB4NGEyODIzLCAweDk1MDUwMDBjLCAweDk1MDIwMDBlLAotMHg5NTAzMDAxMCwgMHhhMjI4MjEsIDB4YTMyODIxLCAweDk1MDMwMDEyLAotMHg5MTA0MDAwOSwgMHg5NTAyMDAwMiwgMHhhMzI4MjEsIDB4YTQyODIxLAotMHg0YTEwMjMsIDB4YTIyODIxLCAweDIwMDIwMjEsIDB4OTQ4MjAwMDAsCi0weDI0ODQwMDAyLCAweGUyMzgyMSwgMHg4ODEwMmIsIDB4MTQ0MGZmZmIsCi0weDcxYzAyLCAweDMwZTJmZmZmLCAweDYyMzgyMSwgMHg3MWMwMiwKLTB4MzBlMmZmZmYsIDB4NjIzODIxLCAweDFhNTI4MjEsIDB4NTFjMDIsCi0weDMwYTJmZmZmLCAweDYyMjgyMSwgMHg1MWMwMiwgMHgzMGEyZmZmZiwKLTB4NjIyODIxLCAweGE3MjgyMywgMHg1MTQwMiwgMHhhMjI4MjEsCi0weDMwYTVmZmZmLCAweDUwYTAwMDAxLCAweDM0MDVmZmZmLCAweDMxNjIwMGZmLAotMHgxNDQwMDAwOCwgMHgzMTgzMDBmZiwgMHg4ZjQzMDBhMCwgMHg4ZjQyMDBhOCwKLTB4NjI0MDIxLCAweDkxMDIwMDAwLCAweDMwNDIwMDBmLCAweDI1MDgwLAotMHgzMTgzMDBmZiwgMHgyNDAyMDAwNiwgMHgxNDYyMDAwMywgMHgxMGExMDIxLAotMHgxMDAwMDAwMiwgMHgyNDQ0MDAxMCwgMHgyNDQ0MDAwNiwgMHgzMTYyMDBmZiwKLTB4MTQ0MDAwMDYsIDB4MCwgMHg5NDgyMDAwMCwgMHhhMjI4MjEsCi0weDUxYzAyLCAweDMwYTJmZmZmLCAweDYyMjgyMSwgMHg5MzQyMDVjMywKLTB4MTA0MDAwMDMsIDB4MzI2MjAxMDAsIDB4NTA0MDAwMDMsIDB4YTQ4NTAwMDAsCi0weDUyODI3LCAweGE0ODUwMDAwLCAweDk2MjIwMDBlLCAweDhmNDMwMDljLAotMHg2MjE4MjEsIDB4MzJhMjAwZmYsIDB4MTA0MDAwMDcsIDB4YWY0MzAwOWMsCi0weDNjMDI0MDAwLCAweDIwMjEwMjUsIDB4YWZhMjAwMjAsIDB4OGY0MjAwOWMsCi0weDEwMDAwMDAzLCAweDVlMTAyNSwgMHhhZmIwMDAyMCwgMHg4ZjQyMDA5YywKLTB4YWZhMjAwMjQsIDB4MzI2MjAwODAsIDB4MTA0MDAwMTAsIDB4MzI2MjAxMDAsCi0weDhmNDIwMGI0LCAweDI0NDMwMDAxLCAweDIxMGMwLCAweDU3MTAyMSwKLTB4YWY0MzAwYjQsIDB4OGZhMzAwMjAsIDB4OGZhNDAwMjQsIDB4M2MwMTAwMDEsCi0weDIyMDgyMSwgMHhhYzIzMzhlOCwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsCi0weGFjMjQzOGVjLCAweDEwMDAwMGE1LCAweDMyYzIwMDIwLCAweDEwNDAwMDY0LAotMHgwLCAweDhmNDIwMGI0LCAweDI0NDMwMDAxLCAweDIxMGMwLAotMHg1NzEwMjEsIDB4YWY0MzAwYjQsIDB4OGZhMzAwMjAsIDB4OGZhNDAwMjQsCi0weDNjMDEwMDAxLCAweDIyMDgyMSwgMHhhYzIzMzhlOCwgMHgzYzAxMDAwMSwKLTB4MjIwODIxLCAweGFjMjQzOGVjLCAweDhmNDIwMGI0LCAweDEwNDAwMDUxLAotMHgzODIxLCAweDNjMDkwMDAxLCAweDM1MjkzOGU4LCAweDNjMDgwMDFmLAotMHgzNTA4ZmZmZiwgMHgyNDBiZmZmZiwgMHgzNDBhZmZmZiwgMHg3MTBjMCwKLTB4NTcxMDIxLCAweDQ5MTAyMSwgMHg4YzQzMDAwMCwgMHg4YzQ0MDAwNCwKLTB4YWZhMzAwMjgsIDB4YWZhNDAwMmMsIDB4OGY4MjAwZmMsIDB4OGZhMzAwMjgsCi0weDhmYTQwMDJjLCAweGFjNDMwMDAwLCAweGFjNDQwMDA0LCAweDI0NDIwMDA4LAotMHhhZjgyMDBmMCwgMHg4ZjQyMDA4YywgMHgyNDQyZmZmZiwgMHhhZjQyMDA4YywKLTB4OTdhMjAwMmUsIDB4OGY0NDAyNzAsIDB4OGY0NTAyNzQsIDB4NDAxODIxLAotMHgxMDIxLCAweGEzMjgyMSwgMHhhMzMwMmIsIDB4ODIyMDIxLAotMHg4NjIwMjEsIDB4YWY0NDAyNzAsIDB4YWY0NTAyNzQsIDB4OGZhMjAwMjgsCi0weDQ4MTAyNCwgMHg5MDQzMDAwMCwgMHgzMDYzMDAwMSwgMHgxNDYwMDAwYiwKLTB4NDAyMDIxLCAweDhmNDIwMjc4LCAweDhmNDMwMjdjLCAweDI0NjMwMDAxLAotMHgyYzY0MDAwMSwgMHg0NDEwMjEsIDB4YWY0MjAyNzgsIDB4YWY0MzAyN2MsCi0weDhmNDIwMjc4LCAweDEwMDAwMDFhLCAweDhmNDMwMjdjLCAweDhjODIwMDAwLAotMHgxNDRiMDAwZSwgMHgwLCAweDk0ODIwMDA0LCAweDE0NGEwMDBiLAotMHgwLCAweDhmNDIwMjg4LCAweDhmNDMwMjhjLCAweDI0NjMwMDAxLAotMHgyYzY0MDAwMSwgMHg0NDEwMjEsIDB4YWY0MjAyODgsIDB4YWY0MzAyOGMsCi0weDhmNDIwMjg4LCAweDEwMDAwMDBhLCAweDhmNDMwMjhjLCAweDhmNDIwMjgwLAotMHg4ZjQzMDI4NCwgMHgyNDYzMDAwMSwgMHgyYzY0MDAwMSwgMHg0NDEwMjEsCi0weGFmNDIwMjgwLCAweGFmNDMwMjg0LCAweDhmNDIwMjgwLCAweDhmNDMwMjg0LAotMHg4ZjQyMDBiNCwgMHgyNGU3MDAwMSwgMHhlMjEwMmIsIDB4MTQ0MGZmYjgsCi0weDcxMGMwLCAweGEzNDAwNWMzLCAweDEwMDAwMDNmLCAweGFmNDAwMGI0LAotMHg4ZjgyMDBmYywgMHg4ZmEzMDAyMCwgMHg4ZmE0MDAyNCwgMHhhYzQzMDAwMCwKLTB4YWM0NDAwMDQsIDB4MjQ0MjAwMDgsIDB4YWY4MjAwZjAsIDB4OGY0MjAwOWMsCi0weDhmNDYwMDhjLCAweDhmNDQwMjcwLCAweDhmNDUwMjc0LCAweDQwMTgyMSwKLTB4MTAyMSwgMHgyNGM2ZmZmZiwgMHhhZjQ2MDA4YywgMHhhMzI4MjEsCi0weGEzMzAyYiwgMHg4MjIwMjEsIDB4ODYyMDIxLCAweGFmNDQwMjcwLAotMHhhZjQ1MDI3NCwgMHg5MjAyMDAwMCwgMHgzMDQyMDAwMSwgMHgxNDQwMDAwYywKLTB4MjQwMmZmZmYsIDB4OGY0MjAyNzgsIDB4OGY0MzAyN2MsIDB4MjQ2MzAwMDEsCi0weDJjNjQwMDAxLCAweDQ0MTAyMSwgMHhhZjQyMDI3OCwgMHhhZjQzMDI3YywKLTB4OGY0MjAyNzgsIDB4OGY0MzAyN2MsIDB4MTAwMDAwMWMsIDB4MzJjMjAwMjAsCi0weDhlMDMwMDAwLCAweDE0NjIwMDBmLCAweDM0MDJmZmZmLCAweDk2MDMwMDA0LAotMHgxNDYyMDAwYywgMHgwLCAweDhmNDIwMjg4LCAweDhmNDMwMjhjLAotMHgyNDYzMDAwMSwgMHgyYzY0MDAwMSwgMHg0NDEwMjEsIDB4YWY0MjAyODgsCi0weGFmNDMwMjhjLCAweDhmNDIwMjg4LCAweDhmNDMwMjhjLCAweDEwMDAwMDBiLAotMHgzMmMyMDAyMCwgMHg4ZjQyMDI4MCwgMHg4ZjQzMDI4NCwgMHgyNDYzMDAwMSwKLTB4MmM2NDAwMDEsIDB4NDQxMDIxLCAweGFmNDIwMjgwLCAweGFmNDMwMjg0LAotMHg4ZjQyMDI4MCwgMHg4ZjQzMDI4NCwgMHgzMmMyMDAyMCwgMHgxMDQwMDAwNSwKLTB4YWY0MDAwOWMsIDB4OGY0MjAzNTgsIDB4MjQ0MmZmZmYsIDB4YWY0MjAzNTgsCi0weDhmNDIwMzU4LCAweDhlMjIwMDFjLCAweDhmNDMwMDQwLCAweDI0NDIwMDAxLAotMHgyNDYzZmZmZiwgMHg0MzEwMjQsIDB4YWY0MjAwMmMsIDB4MzI0MjAwNjAsCi0weDE0NDAwMDA4LCAweDMyYzIwMDEwLCAweDhmNDIwMDM0LCAweDI0NDIwMDAxLAotMHhhZjQyMDAzNCwgMHg4YzAzMDIzYywgMHg0MzEwMmIsIDB4MTQ0MDAxMDIsCi0weDMyYzIwMDEwLCAweDEwNDAwMDE4LCAweDI0MDcwMDA4LCAweDhmNDQwMTcwLAotMHg4ZjQ1MDE3NCwgMHg4ZjQzMDAyYywgMHg4ZjQ4MDAwYywgMHg4Zjg2MDEyMCwKLTB4MjQwMjAwODAsIDB4YWZhMjAwMTAsIDB4YWZhMzAwMTQsIDB4YWZhODAwMTgsCi0weDhmNDIwMTBjLCAweDQwZjgwOSwgMHgyNGM2MDAxYywgMHgxMDQwMDA0NywKLTB4MjQwMjAwMDEsIDB4OGY0MjAzMDAsIDB4OGY0MzAwMmMsIDB4MjQ0MjAwMDEsCi0weGFmNDIwMzAwLCAweDhmNDIwMzAwLCAweDI0MDIwMDAxLCAweGEzNDIwNWMxLAotMHgxMDAwMDA3YywgMHhhZjQzMDAzOCwgMHg4ZjQ0MDE3MCwgMHg4ZjQ1MDE3NCwKLTB4OGY0MzAwMmMsIDB4OGY0ODAwMGMsIDB4OGY4NjAxMjAsIDB4MjQwMjAwMjAsCi0weGFmYTIwMDEwLCAweGFmYTMwMDE0LCAweGFmYTgwMDE4LCAweDhmNDIwMTBjLAotMHg0MGY4MDksIDB4MjRjNjAwMWMsIDB4MTA0MDAwNTcsIDB4MjQwMjAwMDEsCi0weDEwMDAwMDY1LCAweDAsIDB4MzI0MjAwMTIsIDB4MTA0MDAwNzUsCi0weDMyNDIwMDAxLCAweDk2MjIwMDBlLCAweDhmNDMwMDljLCAweDYyMTgyMSwKLTB4MzJjMjAwMjAsIDB4MTA0MDAwMDUsIDB4YWY0MzAwOWMsIDB4OGY0MjAzNTgsCi0weDI0NDJmZmZmLCAweGFmNDIwMzU4LCAweDhmNDIwMzU4LCAweDhlMjIwMDFjLAotMHg4ZjQzMDA0MCwgMHgyNDQyMDAwMSwgMHgyNDYzZmZmZiwgMHg0MzEwMjQsCi0weGFmNDIwMDJjLCAweDMyNDIwMDEwLCAweDE0NDAwMDA4LCAweDMyYzIwMDEwLAotMHg4ZjQyMDAzNCwgMHgyNDQyMDAwMSwgMHhhZjQyMDAzNCwgMHg4YzAzMDIzYywKLTB4NDMxMDJiLCAweDE0NDAwMGJjLCAweDMyYzIwMDEwLCAweDEwNDAwMDI4LAotMHgyNDA3MDAwOCwgMHg4ZjQ0MDE3MCwgMHg4ZjQ1MDE3NCwgMHg4ZjQzMDAyYywKLTB4OGY0ODAwMGMsIDB4OGY4NjAxMjAsIDB4MjQwMjAwODAsIDB4YWZhMjAwMTAsCi0weGFmYTMwMDE0LCAweGFmYTgwMDE4LCAweDhmNDIwMTBjLCAweDQwZjgwOSwKLTB4MjRjNjAwMWMsIDB4MTQ0MDAwMTEsIDB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsCi0weDM3MDgyMSwgMHhhMDIyNDBmMSwgMHg4ZjgyMDEyNCwgMHhhZmEyMDAxMCwKLTB4OGY4MjAxMjgsIDB4M2MwNDAwMDEsIDB4MjQ4NDY3YzQsIDB4YWZhMjAwMTQsCi0weDhmNDYwMDJjLCAweDhmODcwMTIwLCAweDNjMDUwMDA5LCAweGMwMDJiM2IsCi0weDM0YTUxMTAwLCAweDEwMDAwMDM2LCAweDAsIDB4OGY0MjAzMDAsCi0weDhmNDMwMDJjLCAweDI0NDIwMDAxLCAweGFmNDIwMzAwLCAweDhmNDIwMzAwLAotMHgyNDAyMDAwMSwgMHhhMzQyMDVjMSwgMHgxMDAwMDAyNiwgMHhhZjQzMDAzOCwKLTB4OGY0NDAxNzAsIDB4OGY0NTAxNzQsIDB4OGY0MzAwMmMsIDB4OGY0ODAwMGMsCi0weDhmODYwMTIwLCAweDI0MDIwMDIwLCAweGFmYTIwMDEwLCAweGFmYTMwMDE0LAotMHhhZmE4MDAxOCwgMHg4ZjQyMDEwYywgMHg0MGY4MDksIDB4MjRjNjAwMWMsCi0weDE0NDAwMDExLCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweDM3MDgyMSwKLTB4YTAyMjQwZjAsIDB4OGY4MjAxMjQsIDB4YWZhMjAwMTAsIDB4OGY4MjAxMjgsCi0weDNjMDQwMDAxLCAweDI0ODQ2N2I4LCAweGFmYTIwMDE0LCAweDhmNDYwMDJjLAotMHg4Zjg3MDEyMCwgMHgzYzA1MDAwOSwgMHhjMDAyYjNiLCAweDM0YTUwOTAwLAotMHgxMDAwMDAwZiwgMHgwLCAweDhmNDIwMzAwLCAweDI0NDIwMDAxLAotMHhhZjQyMDMwMCwgMHg4ZjQyMDMwMCwgMHg4ZjQyMDAyYywgMHhhMzQwMDVjMSwKLTB4YWY0MjAwMzgsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMjA0MGYxLAotMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YTAyMDQwZjAsIDB4YWY0MDAwMzQsCi0weDhmNDIwMzE0LCAweDI0NDIwMDAxLCAweGFmNDIwMzE0LCAweDEwMDAwMDYyLAotMHg4ZjQyMDMxNCwgMHgxMDQwMDAyMiwgMHgzMjQyNzAwMCwgMHg4ZTI1MDAxYywKLTB4OGY0MjAwMjgsIDB4YTIyMDIzLCAweDQ4MTAwMDMsIDB4MCwKLTB4OGY0MjAwNDAsIDB4ODIyMDIxLCAweDhmNDIwMzU4LCAweDhmNDMwMDAwLAotMHhhZjQ1MDAyOCwgMHg0NDEwMjEsIDB4MTA2MDAwMDcsIDB4YWY0MjAzNTgsCi0weGFmODAwMDRjLCAweDhmODIwMDRjLCAweDEwNDBmZmZkLCAweDAsCi0weDEwMDAwMDA1LCAweDAsIDB4YWY4MDAwNDgsIDB4OGY4MjAwNDgsCi0weDEwNDBmZmZkLCAweDAsIDB4OGY4MjAwNjAsIDB4MzQ0MjAwMDgsCi0weGFmODIwMDYwLCAweDhmNDIwMDAwLCAweDEwNDAwMDAzLCAweDAsCi0weDEwMDAwMDQxLCAweGFmODAwMDRjLCAweDEwMDAwMDNmLCAweGFmODAwMDQ4LAotMHgxMDQwMDAyZiwgMHgzMjQyMTAwMCwgMHgxMDQwMDAwYywgMHgzMjQyNDAwMCwKLTB4OGUyMzAwMWMsIDB4OGY0MjAwNTAsIDB4NjIyMDIzLCAweDQ4MjAwMDEsCi0weDI0ODQwMjAwLCAweDhmNDIwMzVjLCAweDQ0MTAyMSwgMHhhZjQyMDM1YywKLTB4OGY0MjAzNjgsIDB4MTAwMDAwMWEsIDB4YWY0MzAwNTAsIDB4MTA0MDAwMGMsCi0weDMyYzI4MDAwLCAweDhlMjMwMDFjLCAweDhmNDIwMDcwLCAweDYyMjAyMywKLTB4NDgyMDAwMSwgMHgyNDg0MDQwMCwgMHg4ZjQyMDM2NCwgMHg0NDEwMjEsCi0weGFmNDIwMzY0LCAweDhmNDIwMzY4LCAweDEwMDAwMDBkLCAweGFmNDMwMDcwLAotMHgxMDQwMDAwZSwgMHgzYzAyMDgwMCwgMHg4ZTIzMDAxYywgMHg4ZjQyMDA2MCwKLTB4NjIyMDIzLCAweDQ4MjAwMDEsIDB4MjQ4NDAxMDAsIDB4OGY0MjAzNjAsCi0weDQ0MTAyMSwgMHhhZjQyMDM2MCwgMHg4ZjQyMDM2OCwgMHhhZjQzMDA2MCwKLTB4NDQxMDIxLCAweGFmNDIwMzY4LCAweDNjMDIwODAwLCAweDJjMjEwMjQsCi0weDUwNDAwMDExLCAweDM2OTQwMDQwLCAweDEwMDAwMDBmLCAweDAsCi0weDMyNDIwMDQ4LCAweDEwNDAwMDA3LCAweDI0MTUwMDAxLCAweDhlMjIwMDFjLAotMHgzYzAzZmZmZiwgMHg0M2YwMjQsIDB4MzA0MmZmZmYsIDB4MTAwMGZkNzUsCi0weGFlMjIwMDFjLCAweDMyNDIwMTAwLCAweDEwNDAwMDAzLCAweDAsCi0weGMwMDJiZDgsIDB4MCwgMHg4ZmJmMDA1MCwgMHg4ZmJlMDA0YywKLTB4OGZiNTAwNDgsIDB4OGZiMzAwNDQsIDB4OGZiMjAwNDAsIDB4OGZiMTAwM2MsCi0weDhmYjAwMDM4LCAweDNlMDAwMDgsIDB4MjdiZDAwNTgsIDB4M2UwMDAwOCwKLTB4MCwgMHgwLCAweDAsIDB4OGY4MzAwZTQsCi0weDhmODIwMGUwLCAweDI0MDRmZmY4LCAweDQ0MTAyNCwgMHg2MjEwMjYsCi0weDIxMDJiLCAweDIxMDIzLCAweDNlMDAwMDgsIDB4NjIxMDI0LAotMHgzZTAwMDA4LCAweDAsIDB4MjdiZGZmZTAsIDB4YWZiZjAwMWMsCi0weGFmYjAwMDE4LCAweDhmODYwMGM0LCAweDhmODQwMGUwLCAweDhmODUwMGU0LAotMHgyNDAyZmZmOCwgMHg4MjE4MjQsIDB4MTBhMzAwMDksIDB4Mjc2MjNmZjgsCi0weDE0YTIwMDAyLCAweDI0YTIwMDA4LCAweDI3NjIzMDAwLCAweDQwODAyMSwKLTB4MTYwMzAwMDUsIDB4MzA4MjAwMDQsIDB4MTA0MDAwMDQsIDB4YzAyMDIxLAotMHgxMDAwMDAyMiwgMHgxMDIxLCAweDhlMDQwMDAwLCAweDhmNDIwMTFjLAotMHgxNGEyMDAwMywgMHgwLCAweDhmNDIwMTIwLCAweGFmNDIwMTE0LAotMHg4Y2EzMDAwMCwgMHg4ZjQyMDE0OCwgMHg4MzE4MjMsIDB4NDMxMDJiLAotMHgxMDQwMDAwMywgMHgwLCAweDhmNDIwMTQ4LCAweDYyMTgyMSwKLTB4OTRhMjAwMDYsIDB4MjQ0MjAwNTAsIDB4NjIxMDJiLCAweDE0NDAwMDBmLAotMHhhMDEwMjEsIDB4YWZhNDAwMTAsIDB4YWZhMzAwMTQsIDB4OGNhNjAwMDAsCi0weDhjYTcwMDA0LCAweDNjMDQwMDAxLCAweGMwMDJiM2IsIDB4MjQ4NDY4OTQsCi0weDhmNDIwMjBjLCAweDI0NDIwMDAxLCAweGFmNDIwMjBjLCAweDhmNDIwMjBjLAotMHgxMDIxLCAweGFmOTAwMGU4LCAweGFmOTAwMGU0LCAweDhmYmYwMDFjLAotMHg4ZmIwMDAxOCwgMHgzZTAwMDA4LCAweDI3YmQwMDIwLCAweDNlMDAwMDgsCi0weDAsIDB4OGY4NDAwZTAsIDB4OGY4ODAwYzQsIDB4OGY4MzAwZTgsCi0weDI0MDJmZmY4LCAweDgyMzgyNCwgMHhlMzIwMjMsIDB4MmM4MjEwMDAsCi0weDUwNDAwMDAxLCAweDI0ODQxMDAwLCAweDQyMGMyLCAweDgwMTgyMSwKLTB4OGY0NDAyNTgsIDB4OGY0NTAyNWMsIDB4MTAyMSwgMHhhMzI4MjEsCi0weGEzMzAyYiwgMHg4MjIwMjEsIDB4ODYyMDIxLCAweGFmNDQwMjU4LAotMHhhZjQ1MDI1YywgMHg4ZjgzMDBjOCwgMHg4ZjQyMDE0OCwgMHgxMDMyMDIzLAotMHg4MjEwMmIsIDB4MTQ0MDAwMDQsIDB4ODAxODIxLCAweDhmNDIwMTQ4LAotMHg4MjIwMjEsIDB4ODAxODIxLCAweDhmNDQwMjUwLCAweDhmNDUwMjU0LAotMHgxMDIxLCAweGEzMjgyMSwgMHhhMzMwMmIsIDB4ODIyMDIxLAotMHg4NjIwMjEsIDB4YWY0NDAyNTAsIDB4YWY0NTAyNTQsIDB4YWY4ODAwYzgsCi0weGFmODcwMGU0LCAweGFmODcwMGU4LCAweDNlMDAwMDgsIDB4MCwKLTB4MjdiZGZmMzAsIDB4MjQwYTAwMDEsIDB4YWZiZjAwYzgsIDB4YWZiZTAwYzQsCi0weGFmYjUwMGMwLCAweGFmYjMwMGJjLCAweGFmYjIwMGI4LCAweGFmYjEwMGI0LAotMHhhZmIwMDBiMCwgMHhhM2EwMDA5NywgMHhhZmEwMDA0NCwgMHhhZmFhMDA1YywKLTB4OTM0MjA1YzQsIDB4YTdhMDAwOGUsIDB4MTA0MDAwMGEsIDB4YTdhMDAwODYsCi0weDhmNGIwMGM0LCAweGFmYWIwMDY0LCAweDhmNGEwMGMwLCAweGFmYWEwMDZjLAotMHg4ZjRiMDBjYywgMHhhZmFiMDA3NCwgMHg4ZjRhMDBjOCwgMHgxMDAwMDEyOSwKLTB4YWZhYTAwN2MsIDB4OGY0MjAxMTQsIDB4NDBmODA5LCAweDAsCi0weDQwMzAyMSwgMHgxMGMwMDM0ZiwgMHgwLCAweDhjYzIwMDAwLAotMHg4Y2MzMDAwNCwgMHhhZmEyMDAyMCwgMHhhZmEzMDAyNCwgMHg4ZmFiMDAyNCwKLTB4OGZhYTAwMjAsIDB4MzE2MmZmZmYsIDB4MjQ0MmZmZmMsIDB4YWZhMjAwNmMsCi0weDNjMDIwMDA2LCAweDJjMjEwMjQsIDB4YWZhYjAwN2MsIDB4MTQ0MDAwMTUsCi0weGFmYWEwMDY0LCAweDkxNDIwMDAwLCAweDMwNDIwMDAxLCAweDEwNDAwMDExLAotMHgyNDAyZmZmZiwgMHg4ZDQzMDAwMCwgMHgxNDYyMDAwNCwgMHgzNDAyZmZmZiwKLTB4OTU0MzAwMDQsIDB4MTA2MjAwMGIsIDB4MCwgMHhjMDAyNGJiLAotMHg4ZmE0MDA2NCwgMHgzMDQyMDBmZiwgMHgxNDQwMDAwNiwgMHgwLAotMHg4ZjQyMDExOCwgMHg0MGY4MDksIDB4MCwgMHgxMDAwMDMyZCwKLTB4MCwgMHg4ZmEyMDAyNCwgMHgzYzAzZmZiZiwgMHgzNDYzZmZmZiwKLTB4NDMxMDI0LCAweDNjMDNmZmZmLCAweDQzMTgyNCwgMHgxNDYwMDAwMywKLTB4YWZhMjAwMjQsIDB4MTAwMDAwNDAsIDB4MTgyMSwgMHgzYzAyMDA4MCwKLTB4NjIxMDI0LCAweDEwNDAwMDA3LCAweDAsIDB4OGY0MjAzOGMsCi0weDI0NDIwMDAxLCAweGFmNDIwMzhjLCAweDhmNDIwMzhjLCAweDEwMDAwMDM2LAotMHgyNDAzMDAwMSwgMHg4ZjQyMDIxMCwgMHgyNDQyMDAwMSwgMHhhZjQyMDIxMCwKLTB4OGY0MjAyMTAsIDB4M2MwMjAwMDEsIDB4NjIxMDI0LCAweDEwNDAwMDA2LAotMHgzYzAyMDAwMiwgMHg4ZjQyMDFjNCwgMHgyNDQyMDAwMSwgMHhhZjQyMDFjNCwKLTB4OGY0MjAxYzQsIDB4M2MwMjAwMDIsIDB4NjIxMDI0LCAweDEwNDAwMDA2LAotMHgzYzAyMDAwNCwgMHg4ZjQyMDM3YywgMHgyNDQyMDAwMSwgMHhhZjQyMDM3YywKLTB4OGY0MjAzN2MsIDB4M2MwMjAwMDQsIDB4NjIxMDI0LCAweDEwNDAwMDA2LAotMHgzYzAyMDAwOCwgMHg4ZjQyMDM4MCwgMHgyNDQyMDAwMSwgMHhhZjQyMDM4MCwKLTB4OGY0MjAzODAsIDB4M2MwMjAwMDgsIDB4NjIxMDI0LCAweDEwNDAwMDA2LAotMHgzYzAyMDAxMCwgMHg4ZjQyMDM4NCwgMHgyNDQyMDAwMSwgMHhhZjQyMDM4NCwKLTB4OGY0MjAzODQsIDB4M2MwMjAwMTAsIDB4NjIxMDI0LCAweDEwNDAwMDA2LAotMHgzYzAyMDAyMCwgMHg4ZjQyMDFjMCwgMHgyNDQyMDAwMSwgMHhhZjQyMDFjMCwKLTB4OGY0MjAxYzAsIDB4M2MwMjAwMjAsIDB4NjIxMDI0LCAweDEwNDAwMDA2LAotMHgyNDAzMDAwMSwgMHg4ZjQyMDM4OCwgMHgyNDQyMDAwMSwgMHhhZjQyMDM4OCwKLTB4OGY0MjAzODgsIDB4MjQwMzAwMDEsIDB4OGMwMjAyNjAsIDB4OGZhYjAwNmMsCi0weDRiMTAyYiwgMHgxMDQwMDAxNCwgMHgzMDcwMDBmZiwgMHg4ZjQyMDFlOCwKLTB4MjQ0MjAwMDEsIDB4YWY0MjAxZTgsIDB4OGY0MjAxZTgsIDB4OGZhYTAwN2MsCi0weDhmODIwMGUwLCAweDM1NGEwMTAwLCAweGFmYWEwMDdjLCAweGFmYTIwMDEwLAotMHg4ZjgyMDBlNCwgMHgyNDEwMDAwMSwgMHgzYzA0MDAwMSwgMHgyNDg0NjhhMCwKLTB4YWZhMjAwMTQsIDB4OGZhNjAwMjAsIDB4OGZhNzAwMjQsIDB4M2MwNTAwMDcsCi0weGMwMDJiM2IsIDB4MzRhNTA4MDAsIDB4MTIwMDAwMTAsIDB4M2MwMjAwODAsCi0weDJjMjEwMjQsIDB4MTQ0MDAwMGUsIDB4MzJjMjA0MDAsIDB4OGZhYjAwN2MsCi0weDNjMDIwMDgwLCAweDM0NDIwMTAwLCAweDE2MjEwMjQsIDB4MTA0MDAwMDUsCi0weDAsIDB4OGY0MjAyMGMsIDB4MjQ0MjAwMDEsIDB4YWY0MjAyMGMsCi0weDhmNDIwMjBjLCAweDEwMDAwMmIwLCAweDhmYTMwMDZjLCAweDMyYzIwNDAwLAotMHgxMDQwMDAxNSwgMHgzNDAyODEwMCwgMHg4ZmFhMDA2NCwgMHg5NTQzMDAwYywKLTB4MTQ2MjAwMTIsIDB4M2MwMjAxMDAsIDB4MjQwYjAyMDAsIDB4YTdhYjAwOGUsCi0weDk1NDIwMDBlLCAweDhkNDMwMDA4LCAweDhkNDQwMDA0LCAweDhkNDUwMDAwLAotMHg4ZmFhMDA2YywgMHg4ZmFiMDA2NCwgMHgyNTRhZmZmYywgMHhhZmFhMDA2YywKLTB4YTdhMjAwODYsIDB4YWQ2MzAwMGMsIDB4YWQ2NDAwMDgsIDB4YWQ2NTAwMDQsCi0weDI1NmIwMDA0LCAweGFmYWIwMDY0LCAweDNjMDIwMTAwLCAweDJjMjEwMjQsCi0weDEwNDAwMDA0LCAweDAsIDB4OGZhYTAwNmMsIDB4MjU0YTAwMDQsCi0weGFmYWEwMDZjLCAweDhmNDIwMGJjLCAweDUwNDAwMDBhLCAweGFmYTAwMDc0LAotMHg4ZmFiMDA2YywgMHg0YjEwMmIsIDB4NTA0MDAwMDYsIDB4YWZhMDAwNzQsCi0weDhmNDIwMGJjLCAweDE2MjEwMjMsIDB4YWZhMjAwNzQsIDB4OGY0YTAwYmMsCi0weGFmYWEwMDZjLCAweDhmNDIwMDgwLCAweDhmYWIwMDZjLCAweDRiMTAyYiwKLTB4MTA0MDAwNTYsIDB4MzJjMjgwMDAsIDB4MTA0MDAwNWUsIDB4MjQwYTAwMDMsCi0weDMyYzIxMDAwLCAweDEwNDAwMDViLCAweGFmYWEwMDVjLCAweDEwMDAwMDU4LAotMHgyNDBiMDAwNCwgMHg4ZjQyMDM1MCwgMHgyNDAzZmZiZiwgMHgyODNhMDI0LAotMHgyNDQyMDAwMSwgMHhhZjQyMDM1MCwgMHgxMDAwMDI0ZiwgMHg4ZjQyMDM1MCwKLTB4MmMyYjAyNSwgMHgyNDAyZmZiZiwgMHgyODJhMDI0LCAweDhmODMwMTI4LAotMHgzYzA0MDAwMSwgMHgyNDg0NjhkMCwgMHgyNjYyMDAwMSwgMHhhZmEyMDAxNCwKLTB4YWZhMzAwMTAsIDB4OGY4NjAxMjAsIDB4OGY4NzAxMjQsIDB4M2MwNTAwMDcsCi0weGMwMDJiM2IsIDB4MzRhNTIyNTAsIDB4MTAwMDAyM2YsIDB4MCwKLTB4MmMyYjAyNSwgMHgyNDAyZmZiZiwgMHgyODJhMDI0LCAweDhmODMwMTI4LAotMHgzYzA0MDAwMSwgMHgyNDg0NjhkMCwgMHgyNDAyMDAwMiwgMHhhZmEyMDAxNCwKLTB4YWZhMzAwMTAsIDB4OGY4NjAxMjAsIDB4OGY4NzAxMjQsIDB4M2MwNTAwMDcsCi0weGMwMDJiM2IsIDB4MzRhNTI0NTAsIDB4MTAwMDAyMmYsIDB4MCwKLTB4OGVhMjAwMDAsIDB4OGVhMzAwMDQsIDB4M2MwNDAwMDEsIDB4MjQ4NDY4ZTgsCi0weGFmYjAwMDEwLCAweGFmYmUwMDE0LCAweDhlYTcwMDE4LCAweDM0YTUyODAwLAotMHhjMDAyYjNiLCAweDYwMzAyMSwgMHgxMDAwMDIyMywgMHgwLAotMHhhNmIxMDAwYSwgMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwgMHgyNDg0NjhmMCwKLTB4YWZiZTAwMTQsIDB4YWZhMjAwMTAsIDB4OGY0NjAwNDQsIDB4OGY4NzAxMjAsCi0weDNjMDUwMDA3LCAweGMwMDJiM2IsIDB4MzRhNTMwMDAsIDB4MTAwMDAyMTYsCi0weDAsIDB4YTZiMTAwMGEsIDB4YTZiMjAwMGUsIDB4OGY4MjAxMjQsCi0weDNjMDQwMDAxLCAweDI0ODQ2OGZjLCAweGFmYmUwMDE0LCAweGFmYTIwMDEwLAotMHg4ZjQ2MDA0NCwgMHg4Zjg3MDEyMCwgMHgzYzA1MDAwNywgMHhjMDAyYjNiLAotMHgzNGE1MzIwMCwgMHgxMDAwMDIwOCwgMHgwLCAweDhmNDIwMDg0LAotMHg4ZmFhMDA2YywgMHg0YTEwMmIsIDB4MTQ0MDAwMDcsIDB4M2MwMjAwMDEsCi0weDJjMjEwMjQsIDB4MTA0MDAwMDQsIDB4MCwgMHgyNDBiMDAwMiwKLTB4YWZhYjAwNWMsIDB4OGZhYTAwNmMsIDB4MTE0MDAyMWIsIDB4MjdhYjAwMjAsCi0weGFmYWIwMGE0LCAweDNjMGEwMDFmLCAweDM1NGFmZmZmLCAweGFmYWEwMDljLAotMHg4ZmFiMDA1YywgMHgyNDBhMDAwMSwgMHg1NTZhMDAyMSwgMHgyNDBhMDAwMiwKLTB4OGY0MzAwNTQsIDB4OGY0MjAwNTAsIDB4MTA2MjAwMGIsIDB4Mjc0YjAwNTQsCi0weDhmNWUwMDU0LCAweDM0MDNlY2MwLCAweGFmYWIwMDRjLCAweDI3YzIwMDAxLAotMHgzMDQyMDFmZiwgMHhhZmEyMDA1NCwgMHgxZTExNDAsIDB4NDMxMDIxLAotMHgxMDAwMDA2YiwgMHgyZTJhODIxLCAweDhmNDIwMDQ0LCAweDhmYWEwMDZjLAotMHgzYzA0MDAwMSwgMHgyNDg0NjhhYywgMHhhZmFhMDAxNCwgMHhhZmEyMDAxMCwKLTB4OGY0NjAwNTQsIDB4OGY0NzAwNTAsIDB4M2MwNTAwMDcsIDB4YzAwMmIzYiwKLTB4MzRhNTEzMDAsIDB4OGY0MzAzNTAsIDB4MjQwMmZmYmYsIDB4MjgyYTAyNCwKLTB4MjQ2MzAwMDEsIDB4YWY0MzAzNTAsIDB4MTAwMDAxZDMsIDB4OGY0MjAzNTAsCi0weDE1NmEwMDFkLCAweDAsIDB4OGY0MzAwNzQsIDB4OGY0MjAwNzAsCi0weDEwNjIwMDBhLCAweDI3NGIwMDc0LCAweDhmNWUwMDc0LCAweGFmYWIwMDRjLAotMHgyN2MyMDAwMSwgMHgzMDQyMDNmZiwgMHhhZmEyMDA1NCwgMHgxZTExNDAsCi0weDI0NDI2Y2MwLCAweDEwMDAwMDRhLCAweDJlMmE4MjEsIDB4OGY0MjAwNDQsCi0weDhmYWEwMDZjLCAweDNjMDQwMDAxLCAweDI0ODQ2OGI4LCAweDNjMDUwMDA3LAotMHhhZmFhMDAxNCwgMHhhZmEyMDAxMCwgMHg4ZjQ2MDA3NCwgMHg4ZjQ3MDA3MCwKLTB4MzRhNTE1MDAsIDB4MjQwYjAwMDEsIDB4YzAwMmIzYiwgMHhhZmFiMDA1YywKLTB4MTAwMGZmYzMsIDB4MCwgMHg4ZjQzMDA2NCwgMHg4ZjQyMDA2MCwKLTB4MTA2MjAwMWEsIDB4Mjc0YTAwNjQsIDB4OGY1ZTAwNjQsIDB4OGZhYjAwNWMsCi0weGFmYWEwMDRjLCAweDI3YzIwMDAxLCAweDMwNDIwMGZmLCAweGFmYTIwMDU0LAotMHgyNDAyMDAwNCwgMHgxNTYyMDAwZSwgMHgxZTExNDAsIDB4MWUxMTgwLAotMHgyNDQyMGNjMCwgMHgyZTIxMDIxLCAweGFmYTIwMDQ0LCAweDk0NDIwMDJhLAotMHg4ZmFhMDA0NCwgMHg4ZmFiMDA2YywgMHg0YjEwMmIsIDB4MTA0MDAwMjQsCi0weDI1NTUwMDIwLCAweDI0MGEwMDAxLCAweDEwMDAwMDIxLCAweGEzYWEwMDk3LAotMHgyNDQyNGNjMCwgMHgxMDAwMDAxZSwgMHgyZTJhODIxLCAweDhmNDIwMDQ0LAotMHg4ZmFiMDA2YywgMHgzYzA0MDAwMSwgMHgyNDg0NjhjNCwgMHhhZmFiMDAxNCwKLTB4YWZhMjAwMTAsIDB4OGY0NjAwNjQsIDB4OGY0NzAwNjAsIDB4M2MwNTAwMDcsCi0weGMwMDJiM2IsIDB4MzRhNTE4MDAsIDB4M2MwMjAwMDgsIDB4MmMyMTAyNCwKLTB4MTQ0MGZmMzQsIDB4MCwgMHg4ZjQyMDM3MCwgMHgyNDBhMDAwMSwKLTB4YWZhYTAwNWMsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzNzAsIDB4MTAwMGZmOTAsCi0weDhmNDIwMzcwLCAweDI3YTMwMDM2LCAweDEzMTA0MCwgMHg2MjE4MjEsCi0weDk0NjIwMDAwLCAweDQ0MTAyMSwgMHgxMDAwMDAyMCwgMHhhNDYyMDAwMCwKLTB4OGZhYjAwNjQsIDB4YWVhYjAwMTgsIDB4OTNhMjAwOTcsIDB4MTA0MDAwNzIsCi0weDk4MjEsIDB4OGZhYTAwNDQsIDB4OGZhNDAwNmMsIDB4OGZhMzAwYTQsCi0weDI1NDIwMDIwLCAweGFmYTIwMDI4LCAweDI1NDIwMDA4LCAweGFmYTIwMDMwLAotMHgyNTQyMDAxMCwgMHhhZmFhMDAyYywgMHhhZmEyMDAzNCwgMHg5NTQyMDAyYSwKLTB4YTdhMjAwMzgsIDB4OTU0MjAwMTgsIDB4YTdhMjAwM2EsIDB4OTU0MjAwMWEsCi0weGE3YTIwMDNjLCAweDk1NDIwMDFjLCAweGE3YTIwMDNlLCAweDk0NjIwMDE4LAotMHgyNDYzMDAwMiwgMHg4MjIwMjMsIDB4MTg4MGZmZGUsIDB4MjY3MzAwMDEsCi0weDJlNjIwMDA0LCAweDE0NDBmZmY5LCAweDAsIDB4OGY0MjAwZmMsCi0weDI2NjUwMDAxLCAweGEyMTAyYSwgMHgxNDQwMDAyYiwgMHgyNDAzMDAwMSwKLTB4OGY4MzAxMmMsIDB4MTA2MDAwMjMsIDB4MCwgMHg4ZjgyMDEyNCwKLTB4NDMxMDIzLCAweDIyMTQzLCAweDU4ODAwMDAxLCAweDI0ODQwMDQwLAotMHg4ZjgyMDEyOCwgMHg0MzEwMjMsIDB4MjE5NDMsIDB4NTg2MDAwMDEsCi0weDI0NjMwMDQwLCAweDY0MTAyYSwgMHg1NDQwMDAwMSwgMHg2MDIwMjEsCi0weGFmNDQwMGZjLCAweDhmNDIwMGZjLCAweGEyMTAyYSwgMHgxMDQwMDAxMSwKLTB4MjQwMzAwMDEsIDB4MTAwMDAwMTUsIDB4MzA2MjAwZmYsIDB4OGZhYjAwNjQsCi0weDk2MDcwMDE4LCAweGFmYWIwMDEwLCAweDhlMjIwMDA4LCAweDNjMDQwMDAxLAotMHgyNDg0NjhkYywgMHg4YzQzMDAwNCwgMHg4YzQyMDAwMCwgMHgzNGE1MjQwMCwKLTB4MjQwMzAyMSwgMHhjMDAyYjNiLCAweGFmYTMwMDE0LCAweDEwMDAwMDJiLAotMHgwLCAweDhmNDIwMzM0LCAweDE4MjEsIDB4MjQ0MjAwMDEsCi0weGFmNDIwMzM0LCAweDhmNDIwMzM0LCAweDMwNjIwMGZmLCAweDUwNDBmZWRjLAotMHgzYzAyMDgwMCwgMHgxMjYwMDAyMSwgMHg5MDIxLCAweDhmYjEwMGE0LAotMHgyMjA4MDIxLCAweDhlMjIwMDA4LCAweDk2MDcwMDE4LCAweDhmYTYwMDY0LAotMHg4YzQ0MDAwMCwgMHg4YzQ1MDAwNCwgMHgyNDBhMDAwMSwgMHhhZmFhMDAxMCwKLTB4YWZiZTAwMTQsIDB4OGY0MjAwMDgsIDB4YWZhMjAwMTgsIDB4OGY0MjAxMGMsCi0weDQwZjgwOSwgMHgwLCAweDEwNDBmZmQ4LCAweDNjMDUwMDA3LAotMHg5NjAyMDAxOCwgMHg4ZmFiMDA2NCwgMHg4ZmFhMDA5YywgMHgxNjI1ODIxLAotMHgxNGIxMDJiLCAweDEwNDAwMDA0LCAweGFmYWIwMDY0LCAweDhmNDIwMTQ4LAotMHgxNjI1ODIzLCAweGFmYWIwMDY0LCAweDI2MTAwMDAyLCAweDI2NTIwMDAxLAotMHgyNTMxMDJiLCAweDE0NDBmZmUzLCAweDI2MzEwMDA0LCAweDhmYjAwMDZjLAotMHgxMDAwMDAzNiwgMHg5N2IxMDAzOCwgMHg4ZjQyMDBmYywgMHgyNDA1MDAwMiwKLTB4YTIxMDJhLCAweDE0NDAwMDFiLCAweDI0MDMwMDAxLCAweDhmODMwMTJjLAotMHgxMDYwMDAxMywgMHgwLCAweDhmODIwMTI0LCAweDQzMTAyMywKLTB4MjIxNDMsIDB4NTg4MDAwMDEsIDB4MjQ4NDAwNDAsIDB4OGY4MjAxMjgsCi0weDQzMTAyMywgMHgyMTk0MywgMHg1ODYwMDAwMSwgMHgyNDYzMDA0MCwKLTB4NjQxMDJhLCAweDU0NDAwMDAxLCAweDYwMjAyMSwgMHhhZjQ0MDBmYywKLTB4OGY0MjAwZmMsIDB4YTIxMDJhLCAweDE0NDAwMDA2LCAweDI0MDMwMDAxLAotMHg4ZjQyMDMzNCwgMHgxODIxLCAweDI0NDIwMDAxLCAweGFmNDIwMzM0LAotMHg4ZjQyMDMzNCwgMHgzMDYyMDBmZiwgMHgxMDQwZmVhNSwgMHgzYzAyMDgwMCwKLTB4OTZiMTAwMGEsIDB4OGZiMDAwNmMsIDB4MzIyM2ZmZmYsIDB4NzAxMDJiLAotMHg1NDQwMDAwMSwgMHg2MDgwMjEsIDB4OGVhNDAwMDAsIDB4OGVhNTAwMDQsCi0weDI0MGIwMDAxLCAweGFmYWIwMDEwLCAweGFmYmUwMDE0LCAweDhmNDIwMDA4LAotMHg4ZmE2MDA2NCwgMHhhZmEyMDAxOCwgMHg4ZjQyMDEwYywgMHg0MGY4MDksCi0weDIwMDM4MjEsIDB4MTA0MGZlYTIsIDB4M2MwNTAwMDcsIDB4OTZhMzAwMGUsCi0weDk3YWEwMDhlLCAweDExNDAwMDA3LCAweDYwOTAyMSwgMHg5MzQyMDVjNCwKLTB4MTQ0MDAwMDQsIDB4MCwgMHg5N2FiMDA4NiwgMHg2YTE4MjUsCi0weGE2YWIwMDE2LCAweDhmYWEwMDdjLCAweDNjMDJmZmZmLCAweDE0MjEwMjQsCi0weDEwNDAwMDAzLCAweGExNDAyLCAweDM0NjMwNDAwLCAweGE2YTIwMDE0LAotMHg4ZmFiMDA2YywgMHg1NjBiMDA3MiwgMHhhNmEzMDAwZSwgMHgzNDYyMDAwNCwKLTB4YTZhMjAwMGUsIDB4OGZhYTAwNzQsIDB4MTZhMTAyMSwgMHhhNmEyMDAwYSwKLTB4OGY0MzAwNDQsIDB4OGY0NDAxYTAsIDB4OGY0NTAxYTQsIDB4MzQwMjgwMDAsCi0weGFmYTIwMDEwLCAweDhmNDIwMDQ0LCAweDJhMDMwMjEsIDB4MjQwNzAwMjAsCi0weGFmYTIwMDE0LCAweDhmNDIwMDBjLCAweDMxOTQwLCAweDYwNDgyMSwKLTB4YWZhMjAwMTgsIDB4OGY0MjAxMGMsIDB4NDAyMSwgMHhhOTI4MjEsCi0weGE5MTgyYiwgMHg4ODIwMjEsIDB4NDBmODA5LCAweDgzMjAyMSwKLTB4NTA0MGZlN2YsIDB4YTZiMjAwMGUsIDB4OGY0MjAzNjgsIDB4YWZhMDAwNmMsCi0weGEzNDAwNWM0LCAweDI0NDJmZmZmLCAweGFmNDIwMzY4LCAweDhmYWIwMDVjLAotMHgyNDBhMDAwMSwgMHg4ZjQyMDM2OCwgMHgxNTZhMDAwNiwgMHgyNDBhMDAwMiwKLTB4OGY0MjAzNWMsIDB4MjQ0MmZmZmYsIDB4YWY0MjAzNWMsIDB4MTAwMDAwMGMsCi0weDhmNDIwMzVjLCAweDE1NmEwMDA2LCAweDAsIDB4OGY0MjAzNjQsCi0weDI0NDJmZmZmLCAweGFmNDIwMzY0LCAweDEwMDAwMDA1LCAweDhmNDIwMzY0LAotMHg4ZjQyMDM2MCwgMHgyNDQyZmZmZiwgMHhhZjQyMDM2MCwgMHg4ZjQyMDM2MCwKLTB4OGZhYTAwNTQsIDB4OGZhYjAwNGMsIDB4YWQ2YTAwMDAsIDB4OGY0MjAwNDQsCi0weDhmNDQwMDg4LCAweDhmNDMwMDc4LCAweDI0NDIwMDAxLCAweDQ0MTAyNCwKLTB4MjQ2MzAwMDEsIDB4YWY0MjAwNDQsIDB4YWY0MzAwNzgsIDB4OGMwMjAyNDAsCi0weDYyMTgyYiwgMHgxNDYwMDA3NSwgMHgyNDA3MDAwOCwgMHg4ZjQ0MDE2OCwKLTB4OGY0NTAxNmMsIDB4OGY0MzAwNDQsIDB4OGY0ODAwMGMsIDB4OGY4NjAxMjAsCi0weDI0MDIwMDQwLCAweGFmYTIwMDEwLCAweGFmYTMwMDE0LCAweGFmYTgwMDE4LAotMHg4ZjQyMDEwYywgMHg0MGY4MDksIDB4MjRjNjAwMWMsIDB4MTQ0MDAwMTEsCi0weDI0MGIwMDAxLCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDJiNDBmMiwKLTB4OGY4MjAxMjQsIDB4YWZhMjAwMTAsIDB4OGY4MjAxMjgsIDB4M2MwNDAwMDEsCi0weDI0ODQ2ODhjLCAweGFmYTIwMDE0LCAweDhmNDYwMDQ0LCAweDhmODcwMTIwLAotMHgzYzA1MDAwOSwgMHhjMDAyYjNiLCAweDM0YTUxMzAwLCAweDEwMDAwMDBiLAotMHgwLCAweDhmNDIwMzA0LCAweDI0NDIwMDAxLCAweGFmNDIwMzA0LAotMHg4ZjQyMDMwNCwgMHg4ZjQyMDA0NCwgMHhhZjQyMDA3YywgMHgzYzAxMDAwMSwKLTB4MzcwODIxLCAweGEwMjA0MGYyLCAweGFmNDAwMDc4LCAweDhmNDIwMzE4LAotMHgyNDQyMDAwMSwgMHhhZjQyMDMxOCwgMHgxMDAwMDA0OCwgMHg4ZjQyMDMxOCwKLTB4YTZiMDAwMGEsIDB4OGY0MzAwNDQsIDB4OGY0NDAxYTAsIDB4OGY0NTAxYTQsCi0weDM0MDI4MDAwLCAweGFmYTIwMDEwLCAweDhmNDIwMDQ0LCAweDJhMDMwMjEsCi0weDI0MDcwMDIwLCAweGFmYTIwMDE0LCAweDhmNDIwMDBjLCAweDMxOTQwLAotMHg2MDQ4MjEsIDB4YWZhMjAwMTgsIDB4OGY0MjAxMGMsIDB4NDAyMSwKLTB4YTkyODIxLCAweGE5MTgyYiwgMHg4ODIwMjEsIDB4NDBmODA5LAotMHg4MzIwMjEsIDB4MTA0MGZlMWYsIDB4MjQwYTAwMDEsIDB4YTM0YTA1YzQsCi0weDhmYWIwMDZjLCAweDhmYWEwMDY0LCAweDE3MDU4MjMsIDB4YWZhYjAwNmMsCi0weDhmYWIwMDljLCAweDE1MDUwMjEsIDB4MTZhMTAyYiwgMHgxMDQwMDAwNCwKLTB4YWZhYTAwNjQsIDB4OGY0MjAxNDgsIDB4MTQyNTAyMywgMHhhZmFhMDA2NCwKLTB4OGY0MjAzNjgsIDB4MjQ0MmZmZmYsIDB4YWY0MjAzNjgsIDB4OGZhYTAwNWMsCi0weDI0MGIwMDAxLCAweDhmNDIwMzY4LCAweDE1NGIwMDA2LCAweDI0MGIwMDAyLAotMHg4ZjQyMDM1YywgMHgyNDQyZmZmZiwgMHhhZjQyMDM1YywgMHgxMDAwMDAwYywKLTB4OGY0MjAzNWMsIDB4MTE0YjAwMDYsIDB4MCwgMHg4ZjQyMDM2MCwKLTB4MjQ0MmZmZmYsIDB4YWY0MjAzNjAsIDB4MTAwMDAwMDUsIDB4OGY0MjAzNjAsCi0weDhmNDIwMzY0LCAweDI0NDJmZmZmLCAweGFmNDIwMzY0LCAweDhmNDIwMzY0LAotMHg4ZmFiMDA1NCwgMHg4ZmFhMDA0YywgMHhhZDRiMDAwMCwgMHg4ZjQyMDA0NCwKLTB4OGY0NDAwODgsIDB4OGY0MzAwNzgsIDB4MjQ0MjAwMDEsIDB4NDQxMDI0LAotMHgyNDYzMDAwMSwgMHhhZjQyMDA0NCwgMHhhZjQzMDA3OCwgMHg4ZmFhMDA2YywKLTB4MTU0MGZlMGIsIDB4MCwgMHg4ZmFiMDA2YywgMHgxMTYwMDAxZSwKLTB4MCwgMHg5MzQyMDVjNCwgMHgxMDQwMDAwOSwgMHgwLAotMHg4ZmFhMDA2NCwgMHhhZjRhMDBjNCwgMHhhZjRiMDBjMCwgMHg4ZmFiMDA3YywKLTB4YWY0YjAwYzgsIDB4OGZhYTAwNzQsIDB4MTAwMDAwMGUsIDB4YWY0YTAwY2MsCi0weDk3YWIwMDhlLCAweDExNjAwMDBiLCAweDM0MDM4MTAwLCAweDhmYTIwMDIwLAotMHg4YzQ2MDAwYywgMHhhNDQzMDAwYywgMHg5N2FhMDA4NiwgMHg4YzQ0MDAwNCwKLTB4OGM0NTAwMDgsIDB4YTQ0YTAwMGUsIDB4YWM0NDAwMDAsIDB4YWM0NTAwMDQsCi0weGFjNDYwMDA4LCAweDhmNDIwMzRjLCAweDI0NDIwMDAxLCAweGFmNDIwMzRjLAotMHgxMDAwMDAxMCwgMHg4ZjQyMDM0YywgMHg4ZmFiMDA3YywgMHgzMTY0ZmZmZiwKLTB4MjQ4NGZmZmMsIDB4ODAxODIxLCAweDhmNDQwMjUwLCAweDhmNDUwMjU0LAotMHg4ZjQ2MDExOCwgMHgxMDIxLCAweGEzMjgyMSwgMHhhMzM4MmIsCi0weDgyMjAyMSwgMHg4NzIwMjEsIDB4YWY0NDAyNTAsIDB4YzBmODA5LAotMHhhZjQ1MDI1NCwgMHg4ZmJmMDBjOCwgMHg4ZmJlMDBjNCwgMHg4ZmI1MDBjMCwKLTB4OGZiMzAwYmMsIDB4OGZiMjAwYjgsIDB4OGZiMTAwYjQsIDB4OGZiMDAwYjAsCi0weDNlMDAwMDgsIDB4MjdiZDAwZDAsIDB4M2UwMDAwOCwgMHgwLAotMHgyN2JkZmYzOCwgMHgyNDBiMDAwMSwgMHhhZmJmMDBjMCwgMHhhZmJlMDBiYywKLTB4YWZiNTAwYjgsIDB4YWZiMzAwYjQsIDB4YWZiMjAwYjAsIDB4YWZiMTAwYWMsCi0weGFmYjAwMGE4LCAweGEzYTAwMDg3LCAweGFmYTAwMDQ0LCAweGFmYWIwMDVjLAotMHg5MzQyMDVjNCwgMHhhN2EwMDA3NiwgMHgxMDQwMDAwNywgMHhhN2EwMDA3ZSwKLTB4OGY0YzAwYzAsIDB4YWZhYzAwNjQsIDB4OGY0YjAwYzgsIDB4OGY1ZTAwYzQsCi0weDEwMDAwMTMwLCAweGFmYWIwMDZjLCAweDhmNDIwMTE0LCAweDQwZjgwOSwKLTB4MCwgMHg0MDMwMjEsIDB4MTBjMDAyYTEsIDB4MCwKLTB4OGNjMjAwMDAsIDB4OGNjMzAwMDQsIDB4YWZhMjAwMjAsIDB4YWZhMzAwMjQsCi0weDhmYWMwMDI0LCAweDhmYmUwMDIwLCAweDMxODJmZmZmLCAweDI0NDJmZmZjLAotMHhhZmEyMDA2NCwgMHgzYzAyMDAwNiwgMHgyYzIxMDI0LCAweDE0NDAwMDE1LAotMHhhZmFjMDA2YywgMHg5M2MyMDAwMCwgMHgzMDQyMDAwMSwgMHgxMDQwMDAxMSwKLTB4MjQwMmZmZmYsIDB4OGZjMzAwMDAsIDB4MTQ2MjAwMDQsIDB4MzQwMmZmZmYsCi0weDk3YzMwMDA0LCAweDEwNjIwMDBiLCAweDAsIDB4YzAwMjRiYiwKLTB4M2MwMjAyMSwgMHgzMDQyMDBmZiwgMHgxNDQwMDAwNiwgMHgwLAotMHg4ZjQyMDExOCwgMHg0MGY4MDksIDB4MCwgMHgxMDAwMDI4MCwKLTB4MCwgMHg4ZmEyMDAyNCwgMHgzYzAzZmZiZiwgMHgzNDYzZmZmZiwKLTB4NDMxMDI0LCAweDNjMDNmZmZmLCAweDQzMTgyNCwgMHgxNDYwMDAwMywKLTB4YWZhMjAwMjQsIDB4MTAwMDAwNDAsIDB4ODAyMSwgMHgzYzAyMDA4MCwKLTB4NjIxMDI0LCAweDEwNDAwMDA3LCAweDAsIDB4OGY0MjAzOGMsCi0weDI0NDIwMDAxLCAweGFmNDIwMzhjLCAweDhmNDIwMzhjLCAweDEwMDAwMDM2LAotMHgyNDEwMDAwMSwgMHg4ZjQyMDIxMCwgMHgyNDQyMDAwMSwgMHhhZjQyMDIxMCwKLTB4OGY0MjAyMTAsIDB4M2MwMjAwMDEsIDB4NjIxMDI0LCAweDEwNDAwMDA2LAotMHgzYzAyMDAwMiwgMHg4ZjQyMDFjNCwgMHgyNDQyMDAwMSwgMHhhZjQyMDFjNCwKLTB4OGY0MjAxYzQsIDB4M2MwMjAwMDIsIDB4NjIxMDI0LCAweDEwNDAwMDA2LAotMHgzYzAyMDAwNCwgMHg4ZjQyMDM3YywgMHgyNDQyMDAwMSwgMHhhZjQyMDM3YywKLTB4OGY0MjAzN2MsIDB4M2MwMjAwMDQsIDB4NjIxMDI0LCAweDEwNDAwMDA2LAotMHgzYzAyMDAwOCwgMHg4ZjQyMDM4MCwgMHgyNDQyMDAwMSwgMHhhZjQyMDM4MCwKLTB4OGY0MjAzODAsIDB4M2MwMjAwMDgsIDB4NjIxMDI0LCAweDEwNDAwMDA2LAotMHgzYzAyMDAxMCwgMHg4ZjQyMDM4NCwgMHgyNDQyMDAwMSwgMHhhZjQyMDM4NCwKLTB4OGY0MjAzODQsIDB4M2MwMjAwMTAsIDB4NjIxMDI0LCAweDEwNDAwMDA2LAotMHgzYzAyMDAyMCwgMHg4ZjQyMDFjMCwgMHgyNDQyMDAwMSwgMHhhZjQyMDFjMCwKLTB4OGY0MjAxYzAsIDB4M2MwMjAwMjAsIDB4NjIxMDI0LCAweDEwNDAwMDA2LAotMHgyNDEwMDAwMSwgMHg4ZjQyMDM4OCwgMHgyNDQyMDAwMSwgMHhhZjQyMDM4OCwKLTB4OGY0MjAzODgsIDB4MjQxMDAwMDEsIDB4OGMwMjAyNjAsIDB4OGZhYjAwNjQsCi0weDRiMTAyYiwgMHgxMDQwMDAxNSwgMHgzMjAyMDBmZiwgMHg4ZjQyMDFlOCwKLTB4MjQ0MjAwMDEsIDB4YWY0MjAxZTgsIDB4OGY0MjAxZTgsIDB4OGZhYzAwNmMsCi0weDhmODIwMGUwLCAweDM1OGMwMTAwLCAweGFmYWMwMDZjLCAweGFmYTIwMDEwLAotMHg4ZjgyMDBlNCwgMHgyNDEwMDAwMSwgMHgzYzA0MDAwMSwgMHgyNDg0NjhhMCwKLTB4YWZhMjAwMTQsIDB4OGZhNjAwMjAsIDB4OGZhNzAwMjQsIDB4M2MwNTAwMDcsCi0weGMwMDJiM2IsIDB4MzRhNTM2MDAsIDB4MzIwMjAwZmYsIDB4MTA0MDAwMTAsCi0weDNjMDIwMDgwLCAweDJjMjEwMjQsIDB4MTQ0MDAwMGUsIDB4MzJjMjA0MDAsCi0weDhmYWIwMDZjLCAweDNjMDIwMDgwLCAweDM0NDIwMTAwLCAweDE2MjEwMjQsCi0weDEwNDAwMDA1LCAweDAsIDB4OGY0MjAyMGMsIDB4MjQ0MjAwMDEsCi0weGFmNDIwMjBjLCAweDhmNDIwMjBjLCAweDEwMDAwMjAyLCAweDhmYTMwMDY0LAotMHgzMmMyMDQwMCwgMHgxMDQwMDAxMiwgMHgzNDAyODEwMCwgMHg5N2MzMDAwYywKLTB4MTQ2MjAwMGYsIDB4MCwgMHgyNDBjMDIwMCwgMHhhN2FjMDA3NiwKLTB4OTdjMjAwMGUsIDB4OGZjMzAwMDgsIDB4OGZjNDAwMDQsIDB4OGZhYjAwNjQsCi0weDhmYzUwMDAwLCAweDI1NmJmZmZjLCAweGFmYWIwMDY0LCAweGE3YTIwMDdlLAotMHhhZmMzMDAwYywgMHhhZmM0MDAwOCwgMHhhZmM1MDAwNCwgMHgyN2RlMDAwNCwKLTB4OGZhNzAwNjQsIDB4MzIwMjAwZmYsIDB4MTQ0MDAwMzQsIDB4M2MwMjAxMDAsCi0weDk3YzQwMDBjLCAweDJjODMwNWRkLCAweDM4ODI4ODcwLCAweDJjNDIwMDAxLAotMHg2MjE4MjUsIDB4MTA2MDAwMTUsIDB4MjgyMSwgMHgzMmMyMDgwMCwKLTB4MTA0MDAwMTUsIDB4MjQwMjA4MDAsIDB4OTdjMzAwMTQsIDB4MTQ2MjAwMTIsCi0weDM0MDJhYWFhLCAweDk3YzMwMDBlLCAweDE0NjIwMDA3LCAweDIwMjEsCi0weDk3YzMwMDEwLCAweDI0MDIwMzAwLCAweDE0NjIwMDA0LCAweDgwMTAyMSwKLTB4OTdjMjAwMTIsIDB4MmM0NDAwMDEsIDB4ODAxMDIxLCAweDU0NDAwMDA2LAotMHgyNDA1MDAxNiwgMHgxMDAwMDAwNCwgMHgwLCAweDI0MDIwODAwLAotMHg1MDgyMDAwMSwgMHgyNDA1MDAwZSwgMHgxMGEwMDAxMywgMHgzYzUyMDIxLAotMHgyNDgzMDAwOSwgMHgzYzAyMDAxZiwgMHgzNDQyZmZmZiwgMHg0MzEwMmIsCi0weDEwNDAwMDAzLCAweDAsIDB4OGY0MjAxNDgsIDB4NjIxODIzLAotMHg5MDYyMDAwMCwgMHgzODQzMDAwNiwgMHgyYzYzMDAwMSwgMHgzODQyMDAxMSwKLTB4MmM0MjAwMDEsIDB4NjIxODI1LCAweDEwNjAwMDA0LCAweDNjMDIwMTAwLAotMHg5NDgyMDAwMiwgMHg0NTM4MjEsIDB4M2MwMjAxMDAsIDB4MmMyMTAyNCwKLTB4NTA0MDAwMGUsIDB4YWZhNzAwNjQsIDB4OGZhYzAwNjQsIDB4MTBlYzAwMDgsCi0weDNjMDUwMDA3LCAweDNjMDQwMDAxLCAweDI0ODQ2OTA4LCAweDhmYTYwMDY0LAotMHgzNGE1NDAwMCwgMHhhZmEwMDAxMCwgMHhjMDAyYjNiLCAweGFmYTAwMDE0LAotMHg4ZmFiMDA2NCwgMHgyNTZiMDAwNCwgMHhhZmFiMDA2NCwgMHg4ZjQyMDA4MCwKLTB4OGZhYzAwNjQsIDB4NGMxMDJiLCAweDEwNDAwMDJjLCAweDMyYzI4MDAwLAotMHgxMDQwMDAzNCwgMHgyNDBiMDAwMywgMHgzMmMyMTAwMCwgMHgxMDQwMDAzMSwKLTB4YWZhYjAwNWMsIDB4MTAwMDAwMmUsIDB4MjQwYzAwMDQsIDB4OGY0MjAzNTAsCi0weDI0MDNmZmJmLCAweDI4M2EwMjQsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzNTAsCi0weDEwMDAwMTczLCAweDhmNDIwMzUwLCAweDNjMDIwODAwLCAweDJjMmIwMjUsCi0weDI0MDJmZmJmLCAweDI4MmEwMjQsIDB4OGY4MzAxMjgsIDB4M2MwNDAwMDEsCi0weDI0ODQ2OGQwLCAweDI2NjIwMDAxLCAweGFmYTIwMDE0LCAweGFmYTMwMDEwLAotMHg4Zjg2MDEyMCwgMHg4Zjg3MDEyNCwgMHgzYzA1MDAwNywgMHhjMDAyYjNiLAotMHgzNGE1NTMwMCwgMHgxMDAwMDE2MiwgMHgwLCAweDhlYTIwMDAwLAotMHg4ZWEzMDAwNCwgMHgzYzA0MDAwMSwgMHgyNDg0NjhlOCwgMHhhZmIwMDAxMCwKLTB4YWZiMTAwMTQsIDB4OGVhNzAwMTgsIDB4MzRhNTU5MDAsIDB4YzAwMmIzYiwKLTB4NjAzMDIxLCAweDEwMDAwMTU2LCAweDAsIDB4OGY0MjAwODQsCi0weDhmYWIwMDY0LCAweDRiMTAyYiwgMHgxNDQwMDAwNywgMHgzYzAyMDAwMSwKLTB4MmMyMTAyNCwgMHgxMDQwMDAwNCwgMHgwLCAweDI0MGMwMDAyLAotMHhhZmFjMDA1YywgMHg4ZmFiMDA2NCwgMHgxMTYwMDE2NiwgMHgyN2FjMDAyMCwKLTB4YWZhYzAwOGMsIDB4OGZhYjAwNWMsIDB4MjQwYzAwMDEsIDB4NTU2YzAwMjEsCi0weDI0MGMwMDAyLCAweDhmNDMwMDU0LCAweDhmNDIwMDUwLCAweDEwNjIwMDBiLAotMHgyNzRiMDA1NCwgMHg4ZjUxMDA1NCwgMHgzNDAzZWNjMCwgMHhhZmFiMDA0YywKLTB4MjYyMjAwMDEsIDB4MzA0MjAxZmYsIDB4YWZhMjAwNTQsIDB4MTExMTQwLAotMHg0MzEwMjEsIDB4MTAwMDAwNmIsIDB4MmUyYTgyMSwgMHg4ZjQyMDA0NCwKLTB4OGZhYzAwNjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDY4YWMsIDB4YWZhYzAwMTQsCi0weGFmYTIwMDEwLCAweDhmNDYwMDU0LCAweDhmNDcwMDUwLCAweDNjMDUwMDA3LAotMHhjMDAyYjNiLCAweDM0YTU0MzAwLCAweDhmNDMwMzUwLCAweDI0MDJmZmJmLAotMHgyODJhMDI0LCAweDI0NjMwMDAxLCAweGFmNDMwMzUwLCAweDEwMDAwMTI0LAotMHg4ZjQyMDM1MCwgMHgxNTZjMDAxZCwgMHgwLCAweDhmNDMwMDc0LAotMHg4ZjQyMDA3MCwgMHgxMDYyMDAwYSwgMHgyNzRiMDA3NCwgMHg4ZjUxMDA3NCwKLTB4YWZhYjAwNGMsIDB4MjYyMjAwMDEsIDB4MzA0MjAzZmYsIDB4YWZhMjAwNTQsCi0weDExMTE0MCwgMHgyNDQyNmNjMCwgMHgxMDAwMDA0YSwgMHgyZTJhODIxLAotMHg4ZjQyMDA0NCwgMHg4ZmFjMDA2NCwgMHgzYzA0MDAwMSwgMHgyNDg0NjhiOCwKLTB4M2MwNTAwMDcsIDB4YWZhYzAwMTQsIDB4YWZhMjAwMTAsIDB4OGY0NjAwNzQsCi0weDhmNDcwMDcwLCAweDM0YTU0NTAwLCAweDI0MGIwMDAxLCAweGMwMDJiM2IsCi0weGFmYWIwMDVjLCAweDEwMDBmZmMzLCAweDAsIDB4OGY0MzAwNjQsCi0weDhmNDIwMDYwLCAweDEwNjIwMDFhLCAweDI3NGMwMDY0LCAweDhmNTEwMDY0LAotMHg4ZmFiMDA1YywgMHhhZmFjMDA0YywgMHgyNjIyMDAwMSwgMHgzMDQyMDBmZiwKLTB4YWZhMjAwNTQsIDB4MjQwMjAwMDQsIDB4MTU2MjAwMGUsIDB4MTExMTQwLAotMHgxMTExODAsIDB4MjQ0MjBjYzAsIDB4MmUyMTAyMSwgMHhhZmEyMDA0NCwKLTB4OTQ0MjAwMmEsIDB4OGZhYzAwNDQsIDB4OGZhYjAwNjQsIDB4NGIxMDJiLAotMHgxMDQwMDAyNCwgMHgyNTk1MDAyMCwgMHgyNDBjMDAwMSwgMHgxMDAwMDAyMSwKLTB4YTNhYzAwODcsIDB4MjQ0MjRjYzAsIDB4MTAwMDAwMWUsIDB4MmUyYTgyMSwKLTB4OGY0MjAwNDQsIDB4OGZhYjAwNjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDY4YzQsCi0weGFmYWIwMDE0LCAweGFmYTIwMDEwLCAweDhmNDYwMDY0LCAweDhmNDcwMDYwLAotMHgzYzA1MDAwNywgMHhjMDAyYjNiLCAweDM0YTU0ODAwLCAweDNjMDIwMDA4LAotMHgyYzIxMDI0LCAweDE0NDBmZjYxLCAweDAsIDB4OGY0MjAzNzAsCi0weDI0MGMwMDAxLCAweGFmYWMwMDVjLCAweDI0NDIwMDAxLCAweGFmNDIwMzcwLAotMHgxMDAwZmY5MCwgMHg4ZjQyMDM3MCwgMHgyN2EzMDAzNiwgMHgxMzEwNDAsCi0weDYyMTgyMSwgMHg5NDYyMDAwMCwgMHg0NDEwMjEsIDB4MTAwMDAwMWYsCi0weGE0NjIwMDAwLCAweGFlYmUwMDE4LCAweDkzYTIwMDg3LCAweDEwNDAwMDg0LAotMHg5ODIxLCAweDhmYWIwMDQ0LCAweDhmYTQwMDY0LCAweDhmYTMwMDhjLAotMHgyNTYyMDAyMCwgMHhhZmEyMDAyOCwgMHgyNTYyMDAwOCwgMHhhZmEyMDAzMCwKLTB4MjU2MjAwMTAsIDB4YWZhYjAwMmMsIDB4YWZhMjAwMzQsIDB4OTU2MjAwMmEsCi0weGE3YTIwMDM4LCAweDk1NjIwMDE4LCAweGE3YTIwMDNhLCAweDk1NjIwMDFhLAotMHhhN2EyMDAzYywgMHg5NTYyMDAxYywgMHhhN2EyMDAzZSwgMHg5NDYyMDAxOCwKLTB4MjQ2MzAwMDIsIDB4ODIyMDIzLCAweDE4ODBmZmRmLCAweDI2NzMwMDAxLAotMHgyZTYyMDAwNCwgMHgxNDQwZmZmOSwgMHgwLCAweDhmNDIwMGZjLAotMHgyNjIxMDJhLCAweDE0NDAwMDMwLCAweDI0MDMwMDAxLCAweDhmODMwMTJjLAotMHgxMDYwMDAyOCwgMHgwLCAweDhmODIwMTI0LCAweDQzMTAyMywKLTB4MjIxNDMsIDB4NTg4MDAwMDEsIDB4MjQ4NDAwNDAsIDB4OGY4MjAxMjgsCi0weDQzMTAyMywgMHgyMTk0MywgMHg1ODYwMDAwMSwgMHgyNDYzMDA0MCwKLTB4NjQxMDJhLCAweDU0NDAwMDAxLCAweDYwMjAyMSwgMHhhZjQ0MDBmYywKLTB4OGY0MjAwZmMsIDB4MjYyMTAyYSwgMHgxMDQwMDAxNiwgMHgyNDAzMDAwMSwKLTB4MTAwMDAwMWEsIDB4MzA2MjAwZmYsIDB4OGZhYzAwOGMsIDB4MTAxMDQwLAotMHg0YzEwMjEsIDB4OTQ0NzAwMTgsIDB4MTAxMDgwLCAweDRjMTAyMSwKLTB4YWZiZTAwMTAsIDB4OGM0MjAwMDgsIDB4M2MwNDAwMDEsIDB4MjQ4NDY4ZGMsCi0weDNjMDUwMDA3LCAweDhjNDMwMDA0LCAweDhjNDIwMDAwLCAweDM0YTU1NTAwLAotMHgyMDAzMDIxLCAweGMwMDJiM2IsIDB4YWZhMzAwMTQsIDB4MTAwMDAwMzksCi0weDAsIDB4OGY0MjAzMzQsIDB4MTgyMSwgMHgyNDQyMDAwMSwKLTB4YWY0MjAzMzQsIDB4OGY0MjAzMzQsIDB4MzA2MjAwZmYsIDB4MTA0MGZmMDYsCi0weDgwMjEsIDB4OGY0MzAwMDgsIDB4MjQwMmZiZmYsIDB4MTI2MDAwMmQsCi0weDYyNTAyNCwgMHgzYzBiNDAwMCwgMHgyMmI0MDI1LCAweDhmYjEwMDhjLAotMHgyNjY5ZmZmZiwgMHgyMjA5MDIxLCAweDhlNDIwMDA4LCAweDk2MjcwMDE4LAotMHg4YzQ0MDAwMCwgMHg4YzQ1MDAwNCwgMHg1NjA5MDAwNCwgMHgyNDBiMDAwMSwKLTB4MjQwYzAwMDIsIDB4MTAwMDAwMDIsIDB4YWZhYzAwMTAsIDB4YWZhYjAwMTAsCi0weDE2MDAwMDA0LCAweGFmYTgwMDE0LCAweDhmNDIwMDA4LCAweDEwMDAwMDAyLAotMHhhZmEyMDAxOCwgMHhhZmFhMDAxOCwgMHg4ZjQyMDEwYywgMHgzYzAzMDIxLAotMHhhZmE4MDA5OCwgMHhhZmE5MDA5YywgMHg0MGY4MDksIDB4YWZhYTAwYTAsCi0weDhmYTgwMDk4LCAweDhmYTkwMDljLCAweDhmYWEwMGEwLCAweDEwNDBmZmMyLAotMHgzYzAyMDAxZiwgMHg5NjIzMDAxOCwgMHgzNDQyZmZmZiwgMHgzYzNmMDIxLAotMHg1ZTEwMmIsIDB4MTA0MDAwMDMsIDB4MjYzMTAwMDIsIDB4OGY0MjAxNDgsCi0weDNjMmYwMjMsIDB4MjYxMDAwMDEsIDB4MjEzMTAyYiwgMHgxNDQwZmZkYSwKLTB4MjY1MjAwMDQsIDB4OGZiMDAwNjQsIDB4MTAwMDAwMWEsIDB4MCwKLTB4OTZhMzAwMGEsIDB4OGZiMDAwNjQsIDB4NzAxMDJiLCAweDU0NDAwMDAxLAotMHg2MDgwMjEsIDB4OGVhNDAwMDAsIDB4OGVhNTAwMDQsIDB4OGZhYjAwNWMsCi0weDI0MGMwMDAyLCAweGFmYWMwMDEwLCAweDkzNDMwNWM0LCAweGIxNzAwLAotMHgxMDYwMDAwMywgMHgyMjIzMDI1LCAweDNjMDIwODAwLCAweGMyMzAyNSwKLTB4YWZhNjAwMTQsIDB4OGY0MjAwMDgsIDB4YWZhMjAwMTgsIDB4OGY0MjAxMGMsCi0weDNjMDMwMjEsIDB4NDBmODA5LCAweDIwMDM4MjEsIDB4MTA0MGZlY2IsCi0weDNjMDUwMDA3LCAweDk3YWMwMDc2LCAweDExODAwMDA3LCAweDk2YTMwMDBlLAotMHg5MzQyMDVjNCwgMHgxNDQwMDAwNCwgMHgwLCAweDk3YWIwMDdlLAotMHg2YzE4MjUsIDB4YTZhYjAwMTYsIDB4OGZhYzAwNmMsIDB4M2MwMmZmZmYsCi0weDE4MjEwMjQsIDB4MTA0MDAwMDMsIDB4YzE0MDIsIDB4MzQ2MzA0MDAsCi0weGE2YTIwMDE0LCAweGE2YjAwMDBhLCAweDhmYWIwMDY0LCAweDU2MGIwMDA2LAotMHgzZDBmMDIxLCAweDM0NjIwMDA0LCAweGFmYTAwMDY0LCAweGE2YTIwMDBlLAotMHgxMDAwMDAwZCwgMHhhMzQwMDVjNCwgMHg4ZmFjMDA2NCwgMHgzYzAyMDAxZiwKLTB4MzQ0MmZmZmYsIDB4NWUxMDJiLCAweDE5MDYwMjMsIDB4YWZhYzAwNjQsCi0weGE2YTMwMDBlLCAweDI0MGIwMDAxLCAweDEwNDAwMDAzLCAweGEzNGIwNWM0LAotMHg4ZjQyMDE0OCwgMHgzYzJmMDIzLCAweDhmYWIwMDU0LCAweDhmYWMwMDRjLAotMHhhZDhiMDAwMCwgMHg4ZmFjMDA2NCwgMHgxNTgwZmViYSwgMHgwLAotMHg4ZmFiMDA2NCwgMHgxMTYwMDAxYiwgMHgwLCAweDkzNDIwNWM0LAotMHgxMDQwMDAwNiwgMHgwLCAweGFmNWUwMGM0LCAweGFmNGIwMGMwLAotMHg4ZmFjMDA2YywgMHgxMDAwMDAwZSwgMHhhZjRjMDBjOCwgMHg5N2FiMDA3NiwKLTB4MTE2MDAwMGIsIDB4MzQwMzgxMDAsIDB4OGZhMjAwMjAsIDB4OGM0NjAwMGMsCi0weGE0NDMwMDBjLCAweDk3YWMwMDdlLCAweDhjNDQwMDA0LCAweDhjNDUwMDA4LAotMHhhNDRjMDAwZSwgMHhhYzQ0MDAwMCwgMHhhYzQ1MDAwNCwgMHhhYzQ2MDAwOCwKLTB4OGY0MjAzNGMsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzNGMsIDB4MTAwMDAwMTAsCi0weDhmNDIwMzRjLCAweDhmYWIwMDZjLCAweDMxNjRmZmZmLCAweDI0ODRmZmZjLAotMHg4MDE4MjEsIDB4OGY0NDAyNTAsIDB4OGY0NTAyNTQsIDB4OGY0NjAxMTgsCi0weDEwMjEsIDB4YTMyODIxLCAweGEzMzgyYiwgMHg4MjIwMjEsCi0weDg3MjAyMSwgMHhhZjQ0MDI1MCwgMHhjMGY4MDksIDB4YWY0NTAyNTQsCi0weDhmYmYwMGMwLCAweDhmYmUwMGJjLCAweDhmYjUwMGI4LCAweDhmYjMwMGI0LAotMHg4ZmIyMDBiMCwgMHg4ZmIxMDBhYywgMHg4ZmIwMDBhOCwgMHgzZTAwMDA4LAotMHgyN2JkMDBjOCwgMHgzZTAwMDA4LCAweDAsIDB4MjdiZGZmZDgsCi0weGFmYmYwMDI0LCAweGFmYjAwMDIwLCAweDhmNDMwMDRjLCAweDhmNDIwMDQ4LAotMHgxMDYyMDAzNCwgMHgwLCAweDhmNDMwMDQ4LCAweDhmNDIwMDRjLAotMHg2MjIwMjMsIDB4NDgyMDAwMSwgMHgyNDg0MDIwMCwgMHg4ZjQzMDA1NCwKLTB4OGY0MjAwNGMsIDB4NDMxMDJiLCAweDE0NDAwMDA0LCAweDI0MDIwMjAwLAotMHg4ZjQzMDA0YywgMHgxMDAwMDAwNSwgMHg0MzEwMjMsIDB4OGY0MjAwNTQsCi0weDhmNDMwMDRjLCAweDQzMTAyMywgMHgyNDQyZmZmZiwgMHg0MDUwMjEsCi0weDhhMTAyYSwgMHg1NDQwMDAwMSwgMHg4MDUwMjEsIDB4OGY0OTAwNGMsCi0weDhmNDgwMDRjLCAweDhmNDQwMTg4LCAweDhmNDUwMThjLCAweDhmNDYwMDRjLAotMHgyNDA3MTAwMCwgMHhhZmE3MDAxMCwgMHg4NDE0MCwgMHgxMDAxODIxLAotMHgxMmE0ODIxLCAweDMxMzAwMWZmLCAweGFmYjAwMDE0LCAweDhmNDcwMDE0LAotMHgxMDIxLCAweDYzMTQwLCAweGFmYTcwMDE4LCAweGEzMjgyMSwKLTB4YTMzODJiLCAweDgyMjAyMSwgMHg4NzIwMjEsIDB4MzQwMmVjYzAsCi0weGMyMzAyMSwgMHg4ZjQyMDEwOCwgMHgyZTYzMDIxLCAweDQwZjgwOSwKLTB4YTM5NDAsIDB4NTQ0MDAwMDEsIDB4YWY1MDAwNGMsIDB4OGY0MzAwNGMsCi0weDhmNDIwMDQ4LCAweDE0NjIwMDE4LCAweDAsIDB4OGY0MjAwMDAsCi0weDEwNDAwMDA3LCAweDAsIDB4YWY4MDAwNGMsIDB4OGY4MjAwNGMsCi0weDEwNDBmZmZkLCAweDAsIDB4MTAwMDAwMDUsIDB4MCwKLTB4YWY4MDAwNDgsIDB4OGY4MjAwNDgsIDB4MTA0MGZmZmQsIDB4MCwKLTB4OGY4MjAwNjAsIDB4MjQwM2ZkZmYsIDB4NDMxMDI0LCAweGFmODIwMDYwLAotMHg4ZjQyMDAwMCwgMHgxMDQwMDAwMywgMHgwLCAweDEwMDAwMDAyLAotMHhhZjgwMDA0YywgMHhhZjgwMDA0OCwgMHg4ZmJmMDAyNCwgMHg4ZmIwMDAyMCwKLTB4M2UwMDAwOCwgMHgyN2JkMDAyOCwgMHgzZTAwMDA4LCAweDAsCi0weDI3YmRmZmQ4LCAweGFmYmYwMDI0LCAweGFmYjAwMDIwLCAweDhmNDMwMDVjLAotMHg4ZjQyMDA1OCwgMHgxMDYyMDA0OSwgMHgwLCAweDhmNDMwMDU4LAotMHg4ZjQyMDA1YywgMHg2MjIwMjMsIDB4NDgyMDAwMSwgMHgyNDg0MDEwMCwKLTB4OGY0MzAwNjQsIDB4OGY0MjAwNWMsIDB4NDMxMDJiLCAweDE0NDAwMDA0LAotMHgyNDAyMDEwMCwgMHg4ZjQzMDA1YywgMHgxMDAwMDAwNSwgMHg0MzEwMjMsCi0weDhmNDIwMDY0LCAweDhmNDMwMDVjLCAweDQzMTAyMywgMHgyNDQyZmZmZiwKLTB4NDAzODIxLCAweDg3MTAyYSwgMHg1NDQwMDAwMSwgMHg4MDM4MjEsCi0weDhmNDIwMDVjLCAweDQ3MTAyMSwgMHgzMDUwMDBmZiwgMHgzMmMyMTAwMCwKLTB4MTA0MDAwMTUsIDB4MjQwODIwMDAsIDB4OGY0OTAwNWMsIDB4OGY0NDAxOTAsCi0weDhmNDUwMTk0LCAweDhmNDYwMDVjLCAweDczOTgwLCAweGFmYTgwMDEwLAotMHhhZmIwMDAxNCwgMHg4ZjQ4MDAxNCwgMHg5NDk4MCwgMHgxMjAxODIxLAotMHgxMDIxLCAweGEzMjgyMSwgMHhhMzQ4MmIsIDB4ODIyMDIxLAotMHg4OTIwMjEsIDB4NjMxODAsIDB4YWZhODAwMTgsIDB4OGY0MjAxMDgsCi0weDEwMDAwMDE0LCAweDI0YzYwY2MwLCAweDhmNDkwMDVjLCAweDhmNDQwMTkwLAotMHg4ZjQ1MDE5NCwgMHg4ZjQ2MDA1YywgMHg3Mzk0MCwgMHhhZmE4MDAxMCwKLTB4YWZiMDAwMTQsIDB4OGY0ODAwMTQsIDB4OTQ5NDAsIDB4MTIwMTgyMSwKLTB4MTAyMSwgMHhhMzI4MjEsIDB4YTM0ODJiLCAweDgyMjAyMSwKLTB4ODkyMDIxLCAweDYzMTQwLCAweGFmYTgwMDE4LCAweDhmNDIwMTA4LAotMHgyNGM2NGNjMCwgMHg0MGY4MDksIDB4MmU2MzAyMSwgMHg1NDQwMDAwMSwKLTB4YWY1MDAwNWMsIDB4OGY0MzAwNWMsIDB4OGY0MjAwNTgsIDB4MTQ2MjAwMTgsCi0weDAsIDB4OGY0MjAwMDAsIDB4MTA0MDAwMDcsIDB4MCwKLTB4YWY4MDAwNGMsIDB4OGY4MjAwNGMsIDB4MTA0MGZmZmQsIDB4MCwKLTB4MTAwMDAwMDUsIDB4MCwgMHhhZjgwMDA0OCwgMHg4ZjgyMDA0OCwKLTB4MTA0MGZmZmQsIDB4MCwgMHg4ZjgyMDA2MCwgMHgyNDAzZmVmZiwKLTB4NDMxMDI0LCAweGFmODIwMDYwLCAweDhmNDIwMDAwLCAweDEwNDAwMDAzLAotMHgwLCAweDEwMDAwMDAyLCAweGFmODAwMDRjLCAweGFmODAwMDQ4LAotMHg4ZmJmMDAyNCwgMHg4ZmIwMDAyMCwgMHgzZTAwMDA4LCAweDI3YmQwMDI4LAotMHgzZTAwMDA4LCAweDAsIDB4MjdiZGZmZDgsIDB4YWZiZjAwMjQsCi0weGFmYjAwMDIwLCAweDhmNDMwMDZjLCAweDhmNDIwMDY4LCAweDEwNjIwMDMzLAotMHgwLCAweDhmNDMwMDY4LCAweDhmNDIwMDZjLCAweDYyMjAyMywKLTB4NDgyMDAwMSwgMHgyNDg0MDQwMCwgMHg4ZjQzMDA3NCwgMHg4ZjQyMDA2YywKLTB4NDMxMDJiLCAweDE0NDAwMDA0LCAweDI0MDIwNDAwLCAweDhmNDMwMDZjLAotMHgxMDAwMDAwNSwgMHg0MzEwMjMsIDB4OGY0MjAwNzQsIDB4OGY0MzAwNmMsCi0weDQzMTAyMywgMHgyNDQyZmZmZiwgMHg0MDUwMjEsIDB4OGExMDJhLAotMHg1NDQwMDAwMSwgMHg4MDUwMjEsIDB4OGY0OTAwNmMsIDB4OGY0ODAwNmMsCi0weDhmNDQwMTk4LCAweDhmNDUwMTljLCAweDhmNDYwMDZjLCAweDI0MDc0MDAwLAotMHhhZmE3MDAxMCwgMHg4NDE0MCwgMHgxMDAxODIxLCAweDEyYTQ4MjEsCi0weDMxMzAwM2ZmLCAweGFmYjAwMDE0LCAweDhmNDcwMDE0LCAweDEwMjEsCi0weDYzMTQwLCAweDI0YzY2Y2MwLCAweGFmYTcwMDE4LCAweGEzMjgyMSwKLTB4YTMzODJiLCAweDgyMjAyMSwgMHg4NzIwMjEsIDB4OGY0MjAxMDgsCi0weDJlNjMwMjEsIDB4NDBmODA5LCAweGEzOTQwLCAweDU0NDAwMDAxLAotMHhhZjUwMDA2YywgMHg4ZjQzMDA2YywgMHg4ZjQyMDA2OCwgMHgxNDYyMDAxOCwKLTB4MCwgMHg4ZjQyMDAwMCwgMHgxMDQwMDAwNywgMHgwLAotMHhhZjgwMDA0YywgMHg4ZjgyMDA0YywgMHgxMDQwZmZmZCwgMHgwLAotMHgxMDAwMDAwNSwgMHgwLCAweGFmODAwMDQ4LCAweDhmODIwMDQ4LAotMHgxMDQwZmZmZCwgMHgwLCAweDhmODIwMDYwLCAweDI0MDNmN2ZmLAotMHg0MzEwMjQsIDB4YWY4MjAwNjAsIDB4OGY0MjAwMDAsIDB4MTA0MDAwMDMsCi0weDAsIDB4MTAwMDAwMDIsIDB4YWY4MDAwNGMsIDB4YWY4MDAwNDgsCi0weDhmYmYwMDI0LCAweDhmYjAwMDIwLCAweDNlMDAwMDgsIDB4MjdiZDAwMjgsCi0weDNlMDAwMDgsIDB4MCwgMHg4ZjQyMDBmYywgMHgzYzAzMDAwMSwKLTB4OGY0NDAwZjgsIDB4MzQ2MzMwYzgsIDB4MjQ0MjAwMDEsIDB4YWY0MjAwZmMsCi0weDhmODUwMTI4LCAweDJlMzEwMjEsIDB4NTQ4MjAwMDQsIDB4MjQ4MjAwMDgsCi0weDNjMDIwMDAxLCAweDM0NDIyZWM4LCAweDJlMjEwMjEsIDB4NDAxODIxLAotMHhhZjQzMDBmOCwgMHhhYzYwMDAwMCwgMHg4ZjQyMDBmNCwgMHgxNDYyMDAwNCwKLTB4M2MwMjAwMDEsIDB4MjRhMjAwMjAsIDB4MTAwMDAwMGYsIDB4YWY4MjAxMjgsCi0weDhmNDMwMGY4LCAweDM0NDIzMGM4LCAweDJlMjEwMjEsIDB4NTQ2MjAwMDQsCi0weDI0NjIwMDA4LCAweDNjMDIwMDAxLCAweDM0NDIyZWM4LCAweDJlMjEwMjEsCi0weDQwMTgyMSwgMHg4YzYyMDAwNCwgMHgyMTE0MCwgMHhhMjEwMjEsCi0weGFmODIwMTI4LCAweGFjNjAwMDAwLCAweDhjYTMwMDE4LCAweDMwNjIwMDcwLAotMHgxMDQwMDAyZCwgMHgzMDYyMDAyMCwgMHgxMDQwMDAwNCwgMHgzYzAyMDAxMCwKLTB4MmMyMTAyNCwgMHgxMDQwMDAwZCwgMHgwLCAweDMwNjIwMDQwLAotMHgxMDQwMDAwNCwgMHgzYzAyMDAyMCwgMHgyYzIxMDI0LCAweDEwNDAwMDA3LAotMHgwLCAweDMwNjIwMDEwLCAweDEwNDAwMDFmLCAweDNjMDIwMDQwLAotMHgyYzIxMDI0LCAweDE0NDAwMDFjLCAweDAsIDB4OGY4MjAwNDAsCi0weDMwNDIwMDAxLCAweDE0NDAwMDA4LCAweDIwMjEsIDB4OGMwMzAxMDQsCi0weDI0MDIwMDAxLCAweDUwNjIwMDA1LCAweDI0MDQwMDAxLCAweDhjMDIwMjY0LAotMHgxMDQwMDAwMywgMHg4MDEwMjEsIDB4MjQwNDAwMDEsIDB4ODAxMDIxLAotMHgxMDQwMDAwNiwgMHgwLCAweDhmNDIwMzBjLCAweDI0NDIwMDAxLAotMHhhZjQyMDMwYywgMHgxMDAwMDAwOCwgMHg4ZjQyMDMwYywgMHg4ZjgyMDA0NCwKLTB4MzQ0MjAwMDQsIDB4YWY4MjAwNDQsIDB4OGY0MjAzMDgsIDB4MjQ0MjAwMDEsCi0weGFmNDIwMzA4LCAweDhmNDIwMzA4LCAweDNlMDAwMDgsIDB4MCwKLTB4M2UwMDAwOCwgMHgwLCAweDI3YmRmZjk4LCAweGFmYmYwMDYwLAotMHhhZmJlMDA1YywgMHhhZmI1MDA1OCwgMHhhZmIzMDA1NCwgMHhhZmIyMDA1MCwKLTB4YWZiMTAwNGMsIDB4YWZiMDAwNDgsIDB4OGY0MjAwZmMsIDB4MjQ0MjAwMDEsCi0weGFmNDIwMGZjLCAweDhmODgwMTI4LCAweDI1MDIwMDIwLCAweGFmODIwMTI4LAotMHg4ZDAzMDAxOCwgMHgzMDYyMDA3MCwgMHgxMDQwMDAyZSwgMHgzMDYyMDAyMCwKLTB4MTA0MDAwMDQsIDB4M2MwMjAwMTAsIDB4MmMyMTAyNCwgMHgxMDQwMDAwZCwKLTB4MCwgMHgzMDYyMDA0MCwgMHgxMDQwMDAwNCwgMHgzYzAyMDAyMCwKLTB4MmMyMTAyNCwgMHgxMDQwMDAwNywgMHgwLCAweDMwNjIwMDEwLAotMHgxMDQwMDFhOSwgMHgzYzAyMDA0MCwgMHgyYzIxMDI0LCAweDE0NDAwMWE2LAotMHgwLCAweDhmODIwMDQwLCAweDMwNDIwMDAxLCAweDE0NDAwMDA4LAotMHgyMDIxLCAweDhjMDMwMTA0LCAweDI0MDIwMDAxLCAweDUwNjIwMDA1LAotMHgyNDA0MDAwMSwgMHg4YzAyMDI2NCwgMHgxMDQwMDAwMywgMHg4MDEwMjEsCi0weDI0MDQwMDAxLCAweDgwMTAyMSwgMHgxMDQwMDAwNiwgMHgwLAotMHg4ZjQyMDMwYywgMHgyNDQyMDAwMSwgMHhhZjQyMDMwYywgMHgxMDAwMDE5MiwKLTB4OGY0MjAzMGMsIDB4OGY4MjAwNDQsIDB4MzQ0MjAwMDQsIDB4YWY4MjAwNDQsCi0weDhmNDIwMzA4LCAweDI0NDIwMDAxLCAweGFmNDIwMzA4LCAweDEwMDAwMThhLAotMHg4ZjQyMDMwOCwgMHgzMDYyMDAwMiwgMHgxMDQwMDE0YiwgMHgzYzAyMDgwMCwKLTB4OGQxZTAwMWMsIDB4MWU1NzAyLCAweGFmYWEwMDM0LCAweDk1MGEwMDE2LAotMHgzYzIyMDI0LCAweGFmYWEwMDI0LCAweDhmYWEwMDM0LCAweDI0MDIwMDAxLAotMHgxNTQyMDAwNiwgMHgzM2RlZmZmZiwgMHgxZTExNDAsIDB4MzQwM2VjYzAsCi0weDQzMTAyMSwgMHgxMDAwMDAxMCwgMHgyZTJhODIxLCAweDI0MDIwMDAyLAotMHgxNTQyMDAwNSwgMHgyNDAyMDAwMywgMHgxZTExNDAsIDB4MjQ0MjZjYzAsCi0weDEwMDAwMDA5LCAweDJlMmE4MjEsIDB4MTU0MjAwMDUsIDB4MWUxMTgwLAotMHgxZTExNDAsIDB4MjQ0MjRjYzAsIDB4MTAwMDAwMDMsIDB4MmUyYTgyMSwKLTB4NTcxMDIxLCAweDI0NTUwY2UwLCAweDk2YTIwMDBlLCAweDMwNGFmZmZjLAotMHgzMDQyMDQwMCwgMHgxMDQwMDAwMywgMHhhZmFhMDAyYywgMHgxMDAwMDBlMSwKLTB4ODgyMSwgMHgxMDgwMDAwNCwgMHg4ODIxLCAweDk3YjEwMDI2LAotMHgxMDAwMDBkZCwgMHhhNmIxMDAxMiwgMHg4ZWIzMDAxOCwgMHg5NjZhMDAwYywKLTB4YTdhYTAwM2UsIDB4OTdhNTAwM2UsIDB4MmNhMzA1ZGQsIDB4MzhhMjg4NzAsCi0weDJjNDIwMDAxLCAweDYyMTgyNSwgMHgxMDYwMDAxNSwgMHgyMDIxLAotMHgzMmMyMDgwMCwgMHgxMDQwMDAxNSwgMHgyNDAyMDgwMCwgMHg5NjYzMDAxNCwKLTB4MTQ2MjAwMTIsIDB4MzQwMmFhYWEsIDB4OTY2MzAwMGUsIDB4MTQ2MjAwMDcsCi0weDI4MjEsIDB4OTY2MzAwMTAsIDB4MjQwMjAzMDAsIDB4MTQ2MjAwMDQsCi0weGEwMTAyMSwgMHg5NjYyMDAxMiwgMHgyYzQ1MDAwMSwgMHhhMDEwMjEsCi0weDU0NDAwMDA2LCAweDI0MDQwMDE2LCAweDEwMDAwMDA0LCAweDAsCi0weDI0MDIwODAwLCAweDUwYTIwMDAxLCAweDI0MDQwMDBlLCAweDEwODAwMGI5LAotMHgyNjQ5MDIxLCAweDkyNDIwMDAwLCAweDMwNDIwMDBmLCAweDI4MDgwLAotMHgzMmMyMDEwMCwgMHgxMDQwMDAyMCwgMHgyNTAxODIxLCAweDNjMDIwMDIwLAotMHg0MzEwMmIsIDB4MTQ0MDAwMGUsIDB4MjQwMjAyMSwgMHgyODIxLAotMHg5NDgyMDAwMCwgMHgyNDg0MDAwMiwgMHhhMjI4MjEsIDB4ODMxMDJiLAotMHgxNDQwZmZmYiwgMHgzMGEyZmZmZiwgMHg1MWMwMiwgMHg2MjI4MjEsCi0weDUxYzAyLCAweDMwYTJmZmZmLCAweDEwMDAwMDA5LCAweDYyMjgyMSwKLTB4OGY0NzAxNDgsIDB4OGY0MjAxMTAsIDB4MTAyODQyLCAweDNjMDYwMDIwLAotMHg0MGY4MDksIDB4YWZhODAwNDAsIDB4MzA0NWZmZmYsIDB4OGZhODAwNDAsCi0weDUwYTAwMDAxLCAweDM0MDVmZmZmLCAweDhmYWEwMDJjLCAweDM1NGEwMDAyLAotMHgxMDAwMDAwMiwgMHhhZmFhMDAyYywgMHgyODIxLCAweDMyYzIwMDgwLAotMHgxMDQwMDA5MCwgMHhhNmE1MDAxMCwgMHgyNjQzMDAwOSwgMHgzYzAyMDAxZiwKLTB4MzQ0MmZmZmYsIDB4NDMxMDJiLCAweDEwNDAwMDAzLCAweDAsCi0weDhmNDIwMTQ4LCAweDYyMTgyMywgMHg5MDY2MDAwMCwgMHgzMGMyMDBmZiwKLTB4Mzg0MzAwMDYsIDB4MmM2MzAwMDEsIDB4Mzg0MjAwMTEsIDB4MmM0MjAwMDEsCi0weDYyMTgyNSwgMHgxMDYwMDA3ZiwgMHgyNDAyMDgwMCwgMHg4ODIxLAotMHg5N2EzMDAzZSwgMHgxNDYyMDAwZiwgMHgyNjAyMDIxLCAweDk2NzEwMDAwLAotMHg5NjYyMDAwMiwgMHg5NjYzMDAwNCwgMHg5NjY0MDAwNiwgMHgyMjI4ODIxLAotMHgyMjM4ODIxLCAweDIyNDg4MjEsIDB4OTY2MjAwMDgsIDB4OTY2MzAwMGEsCi0weDk2NjQwMDBjLCAweDIyMjg4MjEsIDB4MjIzODgyMSwgMHgxMDAwMDAwNywKLTB4MjI0ODgyMSwgMHg5NDgyMDAwMCwgMHgyNDg0MDAwMiwgMHgyMjI4ODIxLAotMHg5MjEwMmIsIDB4MTQ0MGZmZmIsIDB4MCwgMHgxMTFjMDIsCi0weDMyMjJmZmZmLCAweDYyODgyMSwgMHgxMTFjMDIsIDB4MzIyMmZmZmYsCi0weDYyODgyMSwgMHgzMmMyMDIwMCwgMHgxMDQwMDAwMywgMHgyNjQ0MDAwNiwKLTB4MTAwMDAwM2UsIDB4ODAyMSwgMHgzYzA1MDAxZiwgMHgzNGE1ZmZmZiwKLTB4YTQxMDJiLCAweDEwNDAwMDAzLCAweDAsIDB4OGY0MjAxNDgsCi0weDgyMjAyMywgMHg5NDgyMDAwMCwgMHgzMDQyMWZmZiwgMHgxMDQwMDAwNCwKLTB4MjY0NDAwMGMsIDB4OTY0MjAwMDIsIDB4MTAwMDAwMzAsIDB4NTA4MDIzLAotMHg5NjQyMDAwMiwgMHgyNjQzMDAxNCwgMHg1MDgwMjMsIDB4M2MwMjAwMjAsCi0weDQzMTAyYiwgMHgxNDQwMDAwYSwgMHhkMDgwMjEsIDB4OTY0MjAwMGMsCi0weDIwMjgwMjEsIDB4OTY0MjAwMGUsIDB4OTY0MzAwMTAsIDB4OTY0NDAwMTIsCi0weDIwMjgwMjEsIDB4MjAzODAyMSwgMHgxMDAwMDAyMCwgMHgyMDQ4MDIxLAotMHhhNDEwMmIsIDB4MTA0MDAwMDMsIDB4MCwgMHg4ZjQyMDE0OCwKLTB4ODIyMDIzLCAweDk0ODIwMDAwLCAweDI0ODQwMDAyLCAweDIwMjgwMjEsCi0weGE0MTAyYiwgMHgxMDQwMDAwMywgMHgwLCAweDhmNDIwMTQ4LAotMHg4MjIwMjMsIDB4OTQ4MjAwMDAsIDB4MjQ4NDAwMDIsIDB4MjAyODAyMSwKLTB4YTQxMDJiLCAweDEwNDAwMDAzLCAweDAsIDB4OGY0MjAxNDgsCi0weDgyMjAyMywgMHg5NDgyMDAwMCwgMHgyNDg0MDAwMiwgMHgyMDI4MDIxLAotMHhhNDEwMmIsIDB4MTA0MDAwMDMsIDB4MCwgMHg4ZjQyMDE0OCwKLTB4ODIyMDIzLCAweDk0ODIwMDAwLCAweDIwMjgwMjEsIDB4M2MwMjAxMDAsCi0weDJjMjEwMjQsIDB4MTA0MDAwMGUsIDB4MCwgMHg4ZmFhMDAyYywKLTB4MzE0MjAwMDQsIDB4MTA0MDAwMGEsIDB4MCwgMHg5NTA0MDAwZSwKLTB4MjY0MjAyMSwgMHhjMDAzZWVjLCAweDI0ODRmZmZjLCAweDMwNDJmZmZmLAotMHgyMjI4ODIxLCAweDExMWMwMiwgMHgzMjIyZmZmZiwgMHg2Mjg4MjEsCi0weDhmYWEwMDI0LCAweDE1MTg4MjMsIDB4MTExNDAyLCAweDIyMjg4MjEsCi0weDIzMDg4MjEsIDB4MTExNDAyLCAweDIyMjg4MjEsIDB4MzIzMWZmZmYsCi0weDUyMjAwMDAxLCAweDM0MTFmZmZmLCAweDhmYWEwMDJjLCAweDM1NGEwMDAxLAotMHhhZmFhMDAyYywgMHhhNmIxMDAxMiwgMHg5N2FhMDAyZSwgMHhhNmFhMDAwZSwKLTB4OGZhYTAwMmMsIDB4MzE0MjAwMDQsIDB4MTA0MDAwMDIsIDB4MjQwOTEwMDAsCi0weDM0MDk4MDAwLCAweDhmNDgwMDQ0LCAweDhmNDQwMWEwLCAweDhmNDUwMWE0LAotMHhhZmE5MDAxMCwgMHg4ZjQ5MDA0NCwgMHg4NDE0MCwgMHgxMDAxODIxLAotMHhhZmE5MDAxNCwgMHg4ZjQ4MDAwYywgMHgyYTAzMDIxLCAweDI0MDcwMDIwLAotMHhhZmE4MDAxOCwgMHg4ZjQ4MDEwYywgMHgxMDIxLCAweGEzMjgyMSwKLTB4YTM0ODJiLCAweDgyMjAyMSwgMHgxMDBmODA5LCAweDg5MjAyMSwKLTB4MTQ0MDAwMGIsIDB4MCwgMHg4ZjgyMDEyOCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDY5MTQsIDB4YWZiZTAwMTQsIDB4YWZhMjAwMTAsIDB4OGY4NjAxMjQsCi0weDhmODcwMTIwLCAweDNjMDUwMDA3LCAweGMwMDJiM2IsIDB4MzRhNTk5MjAsCi0weDhmNDIwMzY4LCAweDI0NDJmZmZmLCAweGFmNDIwMzY4LCAweDhmNDIwMDQ0LAotMHg4ZjQzMDA4OCwgMHgyNDQyMDAwMSwgMHg0MzEwMjQsIDB4YWY0MjAwNDQsCi0weDhmYWEwMDM0LCAweDhmNDQwMzY4LCAweDI0MDIwMDAxLCAweDE1NDIwMDA2LAotMHgyNDAyMDAwMiwgMHg4ZjQyMDM1YywgMHgyNDQyZmZmZiwgMHhhZjQyMDM1YywKLTB4MTAwMDAwNDksIDB4OGY0MjAzNWMsIDB4MTU0MjAwMDYsIDB4MCwKLTB4OGY0MjAzNjQsIDB4MjQ0MmZmZmYsIDB4YWY0MjAzNjQsIDB4MTAwMDAwNDIsCi0weDhmNDIwMzY0LCAweDhmNDIwMzYwLCAweDI0NDJmZmZmLCAweGFmNDIwMzYwLAotMHgxMDAwMDAzZCwgMHg4ZjQyMDM2MCwgMHgzMDYyMTAwMCwgMHgxMDQwMDAwNSwKLTB4MzA2MjgwMDAsIDB4OGY0MjAwNzgsIDB4MjQ0MjAwMDEsIDB4MTAwMDAwMzYsCi0weGFmNDIwMDc4LCAweDEwNDAwMDM0LCAweDAsIDB4OGY0MjAwNzgsCi0weDI0NDIwMDAxLCAweGFmNDIwMDc4LCAweDhjMDMwMjQwLCAweDQzMTAyYiwKLTB4MTQ0MDAwMmQsIDB4MjQwNzAwMDgsIDB4OGY0NDAxNjgsIDB4OGY0NTAxNmMsCi0weDhmNDMwMDQ0LCAweDhmNDgwMDBjLCAweDhmODYwMTIwLCAweDI0MDIwMDQwLAotMHhhZmEyMDAxMCwgMHhhZmEzMDAxNCwgMHhhZmE4MDAxOCwgMHg4ZjQyMDEwYywKLTB4NDBmODA5LCAweDI0YzYwMDFjLCAweDE0NDAwMDExLCAweDI0MDIwMDAxLAotMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YTAyMjQwZjIsIDB4OGY4MjAxMjQsCi0weGFmYTIwMDEwLCAweDhmODIwMTI4LCAweDNjMDQwMDAxLCAweDI0ODQ2ODhjLAotMHhhZmEyMDAxNCwgMHg4ZjQ2MDA0NCwgMHg4Zjg3MDEyMCwgMHgzYzA1MDAwOSwKLTB4YzAwMmIzYiwgMHgzNGE1MTMwMCwgMHgxMDAwMDAwYiwgMHgwLAotMHg4ZjQyMDMwNCwgMHgyNDQyMDAwMSwgMHhhZjQyMDMwNCwgMHg4ZjQyMDMwNCwKLTB4OGY0MjAwNDQsIDB4YWY0MjAwN2MsIDB4M2MwMTAwMDEsIDB4MzcwODIxLAotMHhhMDIwNDBmMiwgMHhhZjQwMDA3OCwgMHg4ZjQyMDMxOCwgMHgyNDQyMDAwMSwKLTB4YWY0MjAzMTgsIDB4OGY0MjAzMTgsIDB4OGZiZjAwNjAsIDB4OGZiZTAwNWMsCi0weDhmYjUwMDU4LCAweDhmYjMwMDU0LCAweDhmYjIwMDUwLCAweDhmYjEwMDRjLAotMHg4ZmIwMDA0OCwgMHgzZTAwMDA4LCAweDI3YmQwMDY4LCAweDNlMDAwMDgsCi0weDAsIDB4MCwgMHgwLCAweDhmNDIwMTNjLAotMHhhZjgyMDBjMCwgMHg4ZjQyMDEzYywgMHhhZjgyMDBjNCwgMHg4ZjQyMDEzYywKLTB4YWY4MjAwYzgsIDB4OGY0MjAxMzgsIDB4YWY4MjAwZDAsIDB4OGY0MjAxMzgsCi0weGFmODIwMGQ0LCAweDhmNDIwMTM4LCAweDNlMDAwMDgsIDB4YWY4MjAwZDgsCi0weDI3YmRmZmUwLCAweDI3ODQwMjA4LCAweDI0MDUwMjAwLCAweGFmYmYwMDE4LAotMHhjMDAyYmJmLCAweDI0MDYwMDA4LCAweDhjMDIwMjA0LCAweGMwMDQwMTIsCi0weGFmODIwMjEwLCAweDNjMDIwMDAxLCAweDhjNDI2ZDk0LCAweDMwNDIwMDAyLAotMHgxMDQwMDAwZSwgMHgyMDIxLCAweDhjMDYwMjQ4LCAweDI0MDIwMDAyLAotMHgzYzAxMDAwMSwgMHhhYzIyNmQ5OCwgMHhjMDA1MTA0LCAweDI0MDUwMDAyLAotMHgyMDIxLCAweDhjMDYwMjQ4LCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLAotMHhhYzIyNmQ5OCwgMHgxMDAwMDAxMSwgMHgyNDA1MDAwMSwgMHg4YzA2MDI0OCwKLTB4MjQwMjAwMDQsIDB4M2MwMTAwMDEsIDB4YWMyMjZkOTgsIDB4YzAwNTEwNCwKLTB4MjQwNTAwMDQsIDB4M2MwMjAwMDEsIDB4OGM0MjZkOTQsIDB4MzA0MjAwMDEsCi0weDEwNDAwMDA4LCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjI2ZDk4LAotMHgyMDIxLCAweDI0MDUwMDAxLCAweDNjMDY2MDFiLCAweGMwMDUxMDQsCi0weDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDY5ZDAsIDB4OGY0MjAxNTAsCi0weDhmNDMwMTU0LCAweDNjMDUwMDA4LCAweDhmNDYwMTU4LCAweDIxNjQwLAotMHgzMTk0MCwgMHgzNDYzMDQwMywgMHg0MzEwMjUsIDB4NjMzYzAsCi0weDQ2MTAyNSwgMHhhZjgyMDIxYywgMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwKLTB4OGY4NjAyMWMsIDB4MzRhNTAyMDAsIDB4YzAwMmIzYiwgMHgzODIxLAotMHgzYzAxMDAwMSwgMHhhYzIwNmQ5MCwgMHgzYzAxMDAwMSwgMHhhYzIwNmRhOCwKLTB4OGZiZjAwMTgsIDB4M2UwMDAwOCwgMHgyN2JkMDAyMCwgMHgyN2JkZmZlMCwKLTB4M2MwNTAwMDgsIDB4MzRhNTAzMDAsIDB4YWZiZjAwMTgsIDB4YWZhMDAwMTAsCi0weGFmYTAwMDE0LCAweDhmODYwMjAwLCAweDNjMDQwMDAxLCAweDI0ODQ2OWRjLAotMHhjMDAyYjNiLCAweDM4MjEsIDB4OGY0MjA0MTAsIDB4MjQ0MjAwMDEsCi0weGFmNDIwNDEwLCAweDhmNDIwNDEwLCAweDhmYmYwMDE4LCAweDNlMDAwMDgsCi0weDI3YmQwMDIwLCAweDI3YmRmZmQ4LCAweGFmYmYwMDIwLCAweGFmYjEwMDFjLAotMHhhZmIwMDAxOCwgMHg4ZjQyMDNhNCwgMHgyNDQyMDAwMSwgMHhhZjQyMDNhNCwKLTB4OGY0MjAzYTQsIDB4OGY5MDAyMjAsIDB4OGY4MjAwZTAsIDB4YWZhMjAwMTAsCi0weDhmODIwMGU0LCAweGFmYTIwMDE0LCAweDhmODYwMGM0LCAweDhmODcwMGM4LAotMHgzYzA0MDAwMSwgMHgyNDg0NjllOCwgMHhjMDAyYjNiLCAweDIwMDI4MjEsCi0weDNjMDQ0MDAwLCAweDIwNDEwMjQsIDB4NTA0MDAwYjQsIDB4M2MwNDAxMDAsCi0weDhmNDIwM2JjLCAweDI0NDIwMDAxLCAweGFmNDIwM2JjLCAweDhmNDIwM2JjLAotMHg4Zjg3MDBjNCwgMHg4ZjgzMDBjOCwgMHg4ZjQyMDE0OCwgMHg2NzE4MjMsCi0weDQzMTAyYiwgMHgxMDQwMDAwMywgMHgwLCAweDhmNDIwMTQ4LAotMHg2MjE4MjEsIDB4MTA2MDAwMDUsIDB4MCwgMHg4ZjQyMDE0YywKLTB4NDMxMDJiLCAweDEwNDAwMDBiLCAweDAsIDB4OGY4MjAwZTAsCi0weDhmNDMwMTI0LCAweGFmNDIwMTFjLCAweGFmNDMwMTE0LCAweDhmODIwMjIwLAotMHgzYzAzMDhmZiwgMHgzNDYzZmZmYiwgMHg0MzEwMjQsIDB4MTAwMDAwY2UsCi0weDQ0MTAyNSwgMHg4ZjgyMDIyMCwgMHgzYzAzMDhmZiwgMHgzNDYzZmZmZiwKLTB4NDMxMDI0LCAweDM0NDIwMDA0LCAweGFmODIwMjIwLCAweDhmODIwMGUwLAotMHg4ZjQzMDEyNCwgMHhhZjQyMDExYywgMHhhZjQzMDExNCwgMHg4Zjg2MDBjOCwKLTB4OGY4NDAxMjAsIDB4OGY4MzAxMjQsIDB4MTAwMDAwMDUsIDB4MjgyMSwKLTB4MTQ2MjAwMDIsIDB4MjQ2MjAwMjAsIDB4Mjc2MjQ4MDAsIDB4NDAxODIxLAotMHgxMDY0MDAwYywgMHgzMGEyMDBmZiwgMHg4YzYyMDAxOCwgMHgzMDQyMDAwMywKLTB4MTA0MGZmZjcsIDB4Mjc2MjRmZTAsIDB4OGY0MjAzZDAsIDB4MjQwNTAwMDEsCi0weDI0NDIwMDAxLCAweGFmNDIwM2QwLCAweDhmNDIwM2QwLCAweDhjNjYwMDA4LAotMHgzMGEyMDBmZiwgMHgxNDQwMDA1OCwgMHgwLCAweDkzNDIwNWM0LAotMHgxNDQwMDA1NSwgMHgwLCAweDhmODcwMGM0LCAweDhmODgwMGUwLAotMHg4Zjg0MDBlNCwgMHgyNDAyZmZmOCwgMHgxMDI0MDI0LCAweDEwNDEwMjMsCi0weDIxOGMzLCAweDQ2MjAwMDEsIDB4MjQ2MzAyMDAsIDB4MTA2MDAwMDUsCi0weDI0MDIwMDAxLCAweDEwNjIwMDA5LCAweDAsIDB4MTAwMDAwMWYsCi0weDAsIDB4OGY0MjAzYzAsIDB4ZTAzMDIxLCAweDI0NDIwMDAxLAotMHhhZjQyMDNjMCwgMHgxMDAwMDA0MCwgMHg4ZjQyMDNjMCwgMHg4ZjQyMDNjNCwKLTB4MjQ0MjAwMDEsIDB4YWY0MjAzYzQsIDB4OGM4NjAwMDAsIDB4OGY0MjAxNDgsCi0weDhmNDMwM2M0LCAweGU2MTgyMywgMHg0MzEwMmIsIDB4MTA0MDAwMDQsCi0weDJjNjIyMzNmLCAweDhmNDIwMTQ4LCAweDYyMTgyMSwgMHgyYzYyMjMzZiwKLTB4MTQ0MDAwMzEsIDB4MCwgMHg4ZjQyMDIwYywgMHgyNDQyMDAwMSwKLTB4YWY0MjAyMGMsIDB4OGY0MjAyMGMsIDB4ZTAzMDIxLCAweDI0ODIwMDA4LAotMHhhZjgyMDBlNCwgMHgxMDAwMDAyOCwgMHhhZjgyMDBlOCwgMHg4ZjQyMDNjOCwKLTB4MjQ0MjAwMDEsIDB4YWY0MjAzYzgsIDB4OGY0MjAzYzgsIDB4OGM4NTAwMDAsCi0weDhmNDIwMTQ4LCAweGE3MTgyMywgMHg0MzEwMmIsIDB4MTA0MDAwMDMsCi0weDAsIDB4OGY0MjAxNDgsIDB4NjIxODIxLCAweDhmNDIwMTRjLAotMHg0MzEwMmIsIDB4NTQ0MDAwMGEsIDB4YTAzMDIxLCAweDhmNDIwMjBjLAotMHgyNDQyMDAwMSwgMHhhZjQyMDIwYywgMHg4ZjQyMDIwYywgMHgyNDgyMDAwOCwKLTB4YWY4MjAwZTQsIDB4OGY4NDAwZTQsIDB4MTQ4OGZmZWMsIDB4YWY4NDAwZTgsCi0weDE0ODgwMDBkLCAweDI3NjIzMDAwLCAweDE0ODIwMDAyLCAweDI0ODJmZmY4LAotMHgyNzYyM2ZmOCwgMHg5NDQzMDAwNiwgMHgzYzAyMDAxZiwgMHgzNDQyZmZmZiwKLTB4YzMzMDIxLCAweDQ2MTAyYiwgMHgxMDQwMDAwMywgMHgwLAotMHg4ZjQyMDE0OCwgMHhjMjMwMjMsIDB4YWY4NjAwYzgsIDB4OGY4MzAwYzQsCi0weDhmNDIwMTQ4LCAweGMzMTgyMywgMHg0MzEwMmIsIDB4MTA0MDAwMDMsCi0weDAsIDB4OGY0MjAxNDgsIDB4NjIxODIxLCAweDEwNjAwMDA1LAotMHgwLCAweDhmNDIwMTRjLCAweDQzMTAyYiwgMHg1MDQwMDAwOCwKLTB4M2MwMmZkZmYsIDB4OGY4MjAyMjAsIDB4M2MwMzA4ZmYsIDB4MzQ2M2ZmZmIsCi0weDQzMTAyNCwgMHgzYzAzNDAwMCwgMHgxMDAwMDAzZiwgMHg0MzEwMjUsCi0weDhmNDMwM2NjLCAweDM0NDJmZmZmLCAweDI4MmEwMjQsIDB4MjQ2MzAwMDEsCi0weGFmNDMwM2NjLCAweDEwMDAwMDM5LCAweDhmNDIwM2NjLCAweDIwNDEwMjQsCi0weDEwNDAwMDBlLCAweDNjMTEwMjAwLCAweDhmNDIwM2E4LCAweDI0NDIwMDAxLAotMHhhZjQyMDNhOCwgMHg4ZjQyMDNhOCwgMHg4ZjgyMDIyMCwgMHgzYzAzMDhmZiwKLTB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAweDQ0MTAyNSwgMHhjMDAzZGFmLAotMHhhZjgyMDIyMCwgMHgxMDAwMDAyOSwgMHgwLCAweDIxMTEwMjQsCi0weDUwNDAwMDA4LCAweDNjMTEwNDAwLCAweDhmNDIwM2FjLCAweDI0NDIwMDAxLAotMHhhZjQyMDNhYywgMHhjMDAzZGFmLCAweDhmNDIwM2FjLCAweDEwMDAwMDE5LAotMHgwLCAweDIxMTEwMjQsIDB4MTA0MDAwMWMsIDB4MCwKLTB4OGY4MzAyMjQsIDB4MjQwMjE0MDIsIDB4MTQ2MjAwMDksIDB4M2MwNTAwMDgsCi0weDNjMDQwMDAxLCAweDI0ODQ2OWY0LCAweGFmYTAwMDEwLCAweGFmYTAwMDE0LAotMHg4Zjg2MDIyNCwgMHgzNGE1MDUwMCwgMHhjMDAyYjNiLCAweDM4MjEsCi0weDhmNDIwM2IwLCAweDI0NDIwMDAxLCAweGFmNDIwM2IwLCAweDhmNDIwM2IwLAotMHg4ZjgyMDIyMCwgMHgyMDAyMDIxLCAweDM0NDIwMDAyLCAweGMwMDRlOWMsCi0weGFmODIwMjIwLCAweDhmODIwMjIwLCAweDNjMDMwOGZmLCAweDM0NjNmZmZmLAotMHg0MzEwMjQsIDB4NTExMDI1LCAweGFmODIwMjIwLCAweDhmYmYwMDIwLAotMHg4ZmIxMDAxYywgMHg4ZmIwMDAxOCwgMHgzZTAwMDA4LCAweDI3YmQwMDI4LAotMHgzZTAwMDA4LCAweDAsIDB4M2MwMjAwMDEsIDB4OGM0MjZkYTgsCi0weDI3YmRmZmIwLCAweGFmYmYwMDQ4LCAweGFmYmUwMDQ0LCAweGFmYjUwMDQwLAotMHhhZmIzMDAzYywgMHhhZmIyMDAzOCwgMHhhZmIxMDAzNCwgMHgxMDQwMDAwZiwKLTB4YWZiMDAwMzAsIDB4M2MwNDAwMDEsIDB4MjQ4NDZhMDAsIDB4M2MwNTAwMDgsCi0weGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhmODYwMjIwLCAweDM0YTUwNjAwLAotMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzIwNmRhOCwgMHgzYzAxMDAwMSwKLTB4YWMyMjZkOWMsIDB4YzAwMmIzYiwgMHgzODIxLCAweDNjMDM3ZmZmLAotMHg4YzAyMDI2OCwgMHgzNDYzZmZmZiwgMHgzYzA0ZmRmZiwgMHg0MzEwMjQsCi0weGFjMDIwMjY4LCAweDhmNDIwMDA0LCAweDM0ODRmZmZmLCAweDMwNDIwMDAyLAotMHgxMDQwMDA5MiwgMHgyODRhMDI0LCAweDNjMDQwNjAwLCAweDM0ODQyMDAwLAotMHg4ZjQyMDAwNCwgMHgyODIxLCAweDI0MDNmZmZkLCAweDQzMTAyNCwKLTB4YWY0MjAwMDQsIDB4YWZhNDAwMjAsIDB4OGY1ZTAwMTgsIDB4MjdhYTAwMjAsCi0weDI0MDIwMGZmLCAweDEzYzIwMDAyLCAweGFmYWEwMDJjLCAweDI3YzUwMDAxLAotMHg4YzAyMDIyOCwgMHhhMDkwMjEsIDB4MTY0MjAwMGUsIDB4MWUzOGMwLAotMHg4ZjQyMDMzYywgMHgyNDQyMDAwMSwgMHhhZjQyMDMzYywgMHg4ZjQyMDMzYywKLTB4OGMwMjAyMjgsIDB4M2MwNDAwMDEsIDB4MjQ4NDY5OTgsIDB4M2MwNTAwMDksCi0weGFmYTAwMDE0LCAweGFmYTIwMDEwLCAweDhmYTYwMDIwLCAweDEwMDAwMDZkLAotMHgzNGE1MDUwMCwgMHhmNzEwMjEsIDB4OGZhMzAwMjAsIDB4OGZhNDAwMjQsCi0weGFjNDMwNGMwLCAweGFjNDQwNGM0LCAweDhmODMwMDU0LCAweDhmODIwMDU0LAotMHgyNDcwMDNlOCwgMHgyMDIxMDIzLCAweDJjNDIwM2U5LCAweDEwNDAwMDFiLAotMHg5ODIxLCAweGUwODgyMSwgMHgyNjM1MDRjMCwgMHg4ZjQ0MDE3OCwKLTB4OGY0NTAxN2MsIDB4MjIwMTgyMSwgMHgyNDBhMDAwNCwgMHhhZmFhMDAxMCwKLTB4YWZiMjAwMTQsIDB4OGY0ODAwMGMsIDB4MTAyMSwgMHgyZjUzMDIxLAotMHhhZmE4MDAxOCwgMHg4ZjQ4MDEwYywgMHgyNDA3MDAwOCwgMHhhMzI4MjEsCi0weGEzNDgyYiwgMHg4MjIwMjEsIDB4MTAwZjgwOSwgMHg4OTIwMjEsCi0weDU0NDAwMDA2LCAweDI0MTMwMDAxLCAweDhmODIwMDU0LCAweDIwMjEwMjMsCi0weDJjNDIwM2U5LCAweDE0NDBmZmU5LCAweDAsIDB4MzI2MjAwZmYsCi0weDU0NDAwMDE3LCAweGFmNTIwMDE4LCAweDhmNDIwMzc4LCAweDI0NDIwMDAxLAotMHhhZjQyMDM3OCwgMHg4ZjQyMDM3OCwgMHg4ZjgyMDEyMCwgMHg4ZmFhMDAyYywKLTB4YWZhMjAwMTAsIDB4OGY4MjAxMjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDY5YTQsCi0weDNjMDUwMDA5LCAweGFmYTIwMDE0LCAweDhkNDYwMDAwLCAweDEwMDAwMDM1LAotMHgzNGE1MDYwMCwgMHg4ZjQyMDMwOCwgMHgyNDEzMDAwMSwgMHgyNDQyMDAwMSwKLTB4YWY0MjAzMDgsIDB4OGY0MjAzMDgsIDB4MTAwMDAwMWUsIDB4MzI2MjAwZmYsCi0weDhmODMwMDU0LCAweDhmODIwMDU0LCAweDI0NzAwM2U4LCAweDIwMjEwMjMsCi0weDJjNDIwM2U5LCAweDEwNDAwMDE2LCAweDk4MjEsIDB4M2MxNTAwMjAsCi0weDI0MTEwMDEwLCAweDhmNDIwMDBjLCAweDhmNDQwMTYwLCAweDhmNDUwMTY0LAotMHg4Zjg2MDEyMCwgMHhhZmIxMDAxMCwgMHhhZmIyMDAxNCwgMHg1NTEwMjUsCi0weGFmYTIwMDE4LCAweDhmNDIwMTBjLCAweDI0MDcwMDA4LCAweDQwZjgwOSwKLTB4MjRjNjAwMWMsIDB4MTQ0MGZmZTMsIDB4MCwgMHg4ZjgyMDA1NCwKLTB4MjAyMTAyMywgMHgyYzQyMDNlOSwgMHgxNDQwZmZlZSwgMHgwLAotMHgzMjYyMDBmZiwgMHgxNDQwMDAxMSwgMHgwLCAweDhmNDIwMzc4LAotMHgyNDQyMDAwMSwgMHhhZjQyMDM3OCwgMHg4ZjQyMDM3OCwgMHg4ZjgyMDEyMCwKLTB4OGZhYTAwMmMsIDB4YWZhMjAwMTAsIDB4OGY4MjAxMjQsIDB4M2MwNDAwMDEsCi0weDI0ODQ2OWFjLCAweDNjMDUwMDA5LCAweGFmYTIwMDE0LCAweDhkNDYwMDAwLAotMHgzNGE1MDcwMCwgMHhjMDAyYjNiLCAweDNjMDM4MjEsIDB4OGY0MjAyZWMsCi0weDI0NDIwMDAxLCAweGFmNDIwMmVjLCAweDhmNDIwMmVjLCAweDhmYmYwMDQ4LAotMHg4ZmJlMDA0NCwgMHg4ZmI1MDA0MCwgMHg4ZmIzMDAzYywgMHg4ZmIyMDAzOCwKLTB4OGZiMTAwMzQsIDB4OGZiMDAwMzAsIDB4M2UwMDAwOCwgMHgyN2JkMDA1MCwKLTB4M2MwMjAwMDEsIDB4OGM0MjZkYTgsIDB4MjdiZGZmZTAsIDB4MTQ0MDAwMGQsCi0weGFmYmYwMDE4LCAweDNjMDQwMDAxLCAweDI0ODQ2YTBjLCAweDNjMDUwMDA4LAotMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgMHg4Zjg2MDIyMCwgMHgzNGE1MDcwMCwKLTB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMjZkYTgsIDB4YzAwMmIzYiwKLTB4MzgyMSwgMHgzYzAyMDAwNCwgMHgyYzIxMDI0LCAweDEwNDAwMDA3LAotMHgwLCAweDhmODIwMjIwLCAweDNjMDMwOGZmLCAweDM0NjNmZmZmLAotMHg0MzEwMjQsIDB4MzQ0MjAwMDgsIDB4YWY4MjAyMjAsIDB4M2MwNTAwMDEsCi0weDhjYTU2ZDk4LCAweDI0MDIwMDAxLCAweDE0YTIwMDA3LCAweDIwMjEsCi0weGMwMDUyOWIsIDB4MjQwNTAwMDEsIDB4YWMwMjAyNmMsIDB4OGMwMzAyNmMsCi0weDEwMDAwMDA2LCAweDNjMDIwMDA3LCAweGMwMDUyOWIsIDB4MjAyMSwKLTB4YWMwMjAyNjgsIDB4OGMwMzAyNjgsIDB4M2MwMjAwMDcsIDB4NjIxODI0LAotMHgzYzAyMDAwMiwgMHg1MDYyMDAwZCwgMHgzYzAyMDVmNSwgMHg0MzEwMmIsCi0weDE0NDAwMDA2LCAweDNjMDIwMDA0LCAweDNjMDIwMDAxLCAweDEwNjIwMDA5LAotMHgzYzAyMDA5OCwgMHgxMDAwMDAwYiwgMHgwLCAweDE0NjIwMDA5LAotMHgzYzAyM2I5YSwgMHgxMDAwMDAwNCwgMHgzNDQyY2EwMCwgMHgxMDAwMDAwMiwKLTB4MzQ0MmUxMDAsIDB4MzQ0Mjk2ODAsIDB4YWY0MjAxZmMsIDB4OGY0MjAxZmMsCi0weGFlZTIwMDY0LCAweDhmYmYwMDE4LCAweDNlMDAwMDgsIDB4MjdiZDAwMjAsCi0weDAsIDB4MCwgMHgwLCAweDg2MTAyYiwKLTB4NTA0MDAwMDEsIDB4ODcyMDIzLCAweGM0MTAyMywgMHgyNDg0MywKLTB4MTI1MTAyYiwgMHgxMDQwMDAxYiwgMHg5MTA0MCwgMHg4MjQwMjEsCi0weDg4MTAyYiwgMHgxMDQwMDAwNywgMHgxODIxLCAweDk0ODIwMDAwLAotMHgyNDg0MDAwMiwgMHg2MjE4MjEsIDB4ODgxMDJiLCAweDE0NDBmZmZiLAotMHgwLCAweDYwMjAyMSwgMHhjNzMwMjMsIDB4YTkxMDIzLAotMHgyMTA0MCwgMHhjMjI4MjEsIDB4YzUxMDJiLCAweDEwNDAwMDA3LAotMHgxODIxLCAweDk0YzIwMDAwLCAweDI0YzYwMDAyLCAweDYyMTgyMSwKLTB4YzUxMDJiLCAweDE0NDBmZmZiLCAweDAsIDB4MTAwMDAwMGQsCi0weDgzMjAyMSwgMHg1MTA0MCwgMHg4MjI4MjEsIDB4ODUxMDJiLAotMHgxMDQwMDAwNywgMHgxODIxLCAweDk0ODIwMDAwLCAweDI0ODQwMDAyLAotMHg2MjE4MjEsIDB4ODUxMDJiLCAweDE0NDBmZmZiLCAweDAsCi0weDYwMjAyMSwgMHg0MWMwMiwgMHgzMDgyZmZmZiwgMHg2MjIwMjEsCi0weDQxYzAyLCAweDMwODJmZmZmLCAweDYyMjAyMSwgMHgzZTAwMDA4LAotMHgzMDgyZmZmZiwgMHgzZTAwMDA4LCAweDAsIDB4ODAyODIxLAotMHgzMGEyMDAwMSwgMHgxMDQwMDAyYiwgMHgzYzAzMDAxZiwgMHgzNDYzZmZmZiwKLTB4MjRhMjAwMDQsIDB4NjIxMDJiLCAweDU0NDAwMDA3LCAweDY1MTAyYiwKLTB4OTBhMjAwMDEsIDB4OTBhNDAwMDMsIDB4OTBhMzAwMDAsIDB4OTBhNTAwMDIsCi0weDEwMDAwMDJhLCAweDQ0MTAyMSwgMHgxMDQwMDAwMywgMHgwLAotMHg4ZjQyMDE0OCwgMHhhMjI4MjMsIDB4OTBhNDAwMDAsIDB4MjRhNTAwMDEsCi0weDY1MTAyYiwgMHgxMDQwMDAwMywgMHgwLCAweDhmNDIwMTQ4LAotMHhhMjI4MjMsIDB4OTBhMjAwMDAsIDB4MjRhNTAwMDEsIDB4MjEyMDAsCi0weDgyMjAyMSwgMHg2NTEwMmIsIDB4MTA0MDAwMDMsIDB4MCwKLTB4OGY0MjAxNDgsIDB4YTIyODIzLCAweDkwYTIwMDAwLCAweDI0YTUwMDAxLAotMHg4MjIwMjEsIDB4NjUxMDJiLCAweDEwNDAwMDAzLCAweDAsCi0weDhmNDIwMTQ4LCAweGEyMjgyMywgMHg5MGEyMDAwMCwgMHgxMDAwMDAyZCwKLTB4MjEyMDAsIDB4MzQ2M2ZmZmYsIDB4MjRhMjAwMDQsIDB4NjIxMDJiLAotMHg1NDQwMDAwYSwgMHg2NTEwMmIsIDB4OTBhMjAwMDAsIDB4OTBhNDAwMDIsCi0weDkwYTMwMDAxLCAweDkwYTUwMDAzLCAweDQ0MTAyMSwgMHgyMTIwMCwKLTB4NjUxODIxLCAweDEwMDAwMDIwLCAweDQzMjAyMSwgMHgxMDQwMDAwMywKLTB4MCwgMHg4ZjQyMDE0OCwgMHhhMjI4MjMsIDB4OTBhMjAwMDAsCi0weDI0YTUwMDAxLCAweDIyMjAwLCAweDY1MTAyYiwgMHgxMDQwMDAwMywKLTB4MCwgMHg4ZjQyMDE0OCwgMHhhMjI4MjMsIDB4OTBhMjAwMDAsCi0weDI0YTUwMDAxLCAweDgyMjAyMSwgMHg2NTEwMmIsIDB4MTA0MDAwMDMsCi0weDAsIDB4OGY0MjAxNDgsIDB4YTIyODIzLCAweDkwYTIwMDAwLAotMHgyNGE1MDAwMSwgMHgyMTIwMCwgMHg4MjIwMjEsIDB4NjUxMDJiLAotMHgxMDQwMDAwMywgMHgwLCAweDhmNDIwMTQ4LCAweGEyMjgyMywKLTB4OTBhMjAwMDAsIDB4ODIyMDIxLCAweDQxYzAyLCAweDMwODJmZmZmLAotMHg2MjIwMjEsIDB4NDFjMDIsIDB4MzA4MmZmZmYsIDB4NjIyMDIxLAotMHgzZTAwMDA4LCAweDMwODJmZmZmLCAweDAsIDB4OGY4MjAyMjAsCi0weDM0NDIwMDAyLCAweGFmODIwMjIwLCAweDNjMDIwMDAyLCAweDhjNDI4ZmY4LAotMHgzMDQyNDAwMCwgMHgxMDQwMDA1NCwgMHgyNDA0MDAwMSwgMHg4ZjgyMDIwMCwKLTB4MjQwNjdmZmYsIDB4OGY4MzAyMDAsIDB4MzA0NTAwMDIsIDB4MjQwMmZmZmQsCi0weDYyMTgyNCwgMHhhZjgzMDIwMCwgMHhhZjg0MDIwNCwgMHg4ZjgzMDA1NCwKLTB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsIDB4MjQ2MzAwMDEsIDB4OGY4MjAwNTQsCi0weDYyMTAyMywgMHgyYzQyMDAwMiwgMHgxNDQwZmZmYywgMHgwLAotMHg4ZjgyMDIyNCwgMHgxNDQ0MDA0ZCwgMHg0MjA0MCwgMHhjNDEwMmIsCi0weDEwNDBmZmYxLCAweDAsIDB4OGY4MjAyMDAsIDB4NDUxMDI1LAotMHhhZjgyMDIwMCwgMHg4ZjgyMDIyMCwgMHgzNDQyODAwMCwgMHhhZjgyMDIyMCwKLTB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsIDB4MjQ2MzAwMDEsCi0weDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDAwMiwgMHgxNDQwZmZmYywKLTB4MCwgMHg4ZjgyMDIyMCwgMHgzYzAzMDAwNCwgMHg0MzEwMjQsCi0weDE0NDAwMDBmLCAweDAsIDB4OGY4MjAyMjAsIDB4M2MwM2ZmZmYsCi0weDM0NjM3ZmZmLCAweDQzMTAyNCwgMHhhZjgyMDIyMCwgMHg4ZjgzMDA1NCwKLTB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsIDB4MjQ2MzAwMDEsIDB4OGY4MjAwNTQsCi0weDYyMTAyMywgMHgyYzQyMDAwMiwgMHgxNDQwZmZmYywgMHgwLAotMHg4ZjgyMDIyMCwgMHgzYzAzMDAwNCwgMHg0MzEwMjQsIDB4MTQ0MDAwMGQsCi0weDAsIDB4OGY4MjAyMjAsIDB4MzQ0MjgwMDAsIDB4YWY4MjAyMjAsCi0weDhmODMwMDU0LCAweDhmODIwMDU0LCAweDEwMDAwMDAyLCAweDI0NjMwMDAxLAotMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwMDIsIDB4MTQ0MGZmZmMsCi0weDAsIDB4OGY4MjAyMjAsIDB4M2MwMzAwMDQsIDB4NDMxMDI0LAotMHgxMDQwMDAxYiwgMHgxMDIxLCAweDhmODMwMjIwLCAweDI0MDIwMDAxLAotMHgxMDAwMDAxNSwgMHgzYzA0ZjcwMCwgMHg4ZjgyMDIyMCwgMHgzYzA0ZjcwMCwKLTB4NDQxMDI1LCAweGFmODIwMjIwLCAweDhmODIwMjIwLCAweDI0MDNmZmZkLAotMHg0MzEwMjQsIDB4YWY4MjAyMjAsIDB4OGY4MjAyMjAsIDB4M2MwMzAzMDAsCi0weDQzMTAyNCwgMHgxNDQwMDAwMywgMHgwLCAweDEwMDAwMDA4LAotMHgxMDIxLCAweDhmODIwMjIwLCAweDM0NDIwMDAyLCAweGFmODIwMjIwLAotMHg4ZjgzMDIyMCwgMHgyNDAyMDAwMSwgMHg2NDE4MjUsIDB4YWY4MzAyMjAsCi0weDNlMDAwMDgsIDB4MCwgMHgyMDIxLCAweDNjMDUwMTAwLAotMHgyNDAyMDAwMSwgMHhhZjgwMDIxYywgMHhhZjgyMDIwMCwgMHhhZjgyMDIyMCwKLTB4Mjc2MjUwMDAsIDB4YWY4MjAwYzAsIDB4Mjc2MjUwMDAsIDB4YWY4MjAwYzQsCi0weDI3NjI1MDAwLCAweGFmODIwMGM4LCAweDI3NjI1MDAwLCAweGFmODIwMGQwLAotMHgyNzYyNTAwMCwgMHhhZjgyMDBkNCwgMHgyNzYyNTAwMCwgMHhhZjgyMDBkOCwKLTB4Mjc2MjMwMDAsIDB4YWY4MjAwZTAsIDB4Mjc2MjMwMDAsIDB4YWY4MjAwZTQsCi0weDI3NjIzMDAwLCAweGFmODIwMGU4LCAweDI3NjIyODAwLCAweGFmODIwMGYwLAotMHgyNzYyMjgwMCwgMHhhZjgyMDBmNCwgMHgyNzYyMjgwMCwgMHhhZjgyMDBmOCwKLTB4NDE4YzAsIDB4MjQ4NDAwMDEsIDB4MzYzMTAyMSwgMHhhYzQ1MzAwNCwKLTB4MzYzMTAyMSwgMHhhYzQwMzAwMCwgMHgyODgyMDIwMCwgMHgxNDQwZmZmOSwKLTB4NDE4YzAsIDB4MjAyMSwgMHg0MThjMCwgMHgyNDg0MDAwMSwKLTB4MzYzMTAyMSwgMHhhYzQwMjgwNCwgMHgzNjMxMDIxLCAweGFjNDAyODAwLAotMHgyODgyMDEwMCwgMHgxNDQwZmZmOSwgMHg0MThjMCwgMHhhZjgwMDIzYywKLTB4MjQwMzAwODAsIDB4MjQwNDAxMDAsIDB4YWM2MDAwMDAsIDB4MjQ2MzAwMDQsCi0weDY0MTAyYiwgMHg1NDQwZmZmZCwgMHhhYzYwMDAwMCwgMHg4ZjgzMDA0MCwKLTB4M2MwMmYwMDAsIDB4NjIxODI0LCAweDNjMDI1MDAwLCAweDEwNjIwMDBjLAotMHg0MzEwMmIsIDB4MTQ0MDAwMDYsIDB4M2MwMjYwMDAsIDB4M2MwMjQwMDAsCi0weDEwNjIwMDA4LCAweDI0MDIwODAwLCAweDEwMDAwMDA4LCAweDAsCi0weDEwNjIwMDA0LCAweDI0MDIwODAwLCAweDEwMDAwMDA0LCAweDAsCi0weDI0MDIwNzAwLCAweDNjMDEwMDAxLCAweGFjMjI2ZGFjLCAweDNlMDAwMDgsCi0weDAsIDB4M2MwMjAwMDEsIDB4OGM0MjZkYmMsIDB4MjdiZGZmZDAsCi0weGFmYmYwMDJjLCAweGFmYjIwMDI4LCAweGFmYjEwMDI0LCAweGFmYjAwMDIwLAotMHgzYzAxMDAwMSwgMHgxMDQwMDAwNSwgMHhhYzIwNmQ5NCwgMHhjMDA0ZDllLAotMHgwLCAweDNjMDEwMDAxLCAweGFjMjA2ZGJjLCAweDhmODMwMDU0LAotMHg4ZjgyMDA1NCwgMHgxMDAwMDAwMiwgMHgyNDYzMDA2NCwgMHg4ZjgyMDA1NCwKLTB4NjIxMDIzLCAweDJjNDIwMDY1LCAweDE0NDBmZmZjLCAweDAsCi0weGMwMDRkYjksIDB4MCwgMHgyNDA0MDAwMSwgMHgyODIxLAotMHgyN2E2MDAxOCwgMHgzNDAyODAwMCwgMHhjMDA0NWJlLCAweGE3YTIwMDE4LAotMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgxMDAwMDAwMiwgMHgyNDYzMDA2NCwKLTB4OGY4MjAwNTQsIDB4NjIxMDIzLCAweDJjNDIwMDY1LCAweDE0NDBmZmZjLAotMHgyNDA0MDAwMSwgMHgyNDA1MDAwMSwgMHhjMDA0NTdjLCAweDI3YTYwMDE4LAotMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgxMDAwMDAwMiwgMHgyNDYzMDA2NCwKLTB4OGY4MjAwNTQsIDB4NjIxMDIzLCAweDJjNDIwMDY1LCAweDE0NDBmZmZjLAotMHgyNDA0MDAwMSwgMHgyNDA1MDAwMSwgMHhjMDA0NTdjLCAweDI3YTYwMDE4LAotMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgxMDAwMDAwMiwgMHgyNDYzMDA2NCwKLTB4OGY4MjAwNTQsIDB4NjIxMDIzLCAweDJjNDIwMDY1LCAweDE0NDBmZmZjLAotMHgyNDA0MDAwMSwgMHgzYzA2MDAwMSwgMHgyNGM2NmYyNCwgMHhjMDA0NTdjLAotMHgyNDA1MDAwMiwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgxMDAwMDAwMiwKLTB4MjQ2MzAwNjQsIDB4OGY4MjAwNTQsIDB4NjIxMDIzLCAweDJjNDIwMDY1LAotMHgxNDQwZmZmYywgMHgyNDA0MDAwMSwgMHgyNDA1MDAwMywgMHgzYzEwMDAwMSwKLTB4MjYxMDZmMjYsIDB4YzAwNDU3YywgMHgyMDAzMDIxLCAweDk3YTYwMDE4LAotMHgzYzA3MDAwMSwgMHg5NGU3NmYyNCwgMHgzYzA0MDAwMSwgMHgyNDg0NmFlMCwKLTB4YWZhMDAwMTQsIDB4OTYwMjAwMDAsIDB4M2MwNTAwMGQsIDB4MzRhNTAxMDAsCi0weGMwMDJiM2IsIDB4YWZhMjAwMTAsIDB4OTdhMjAwMTgsIDB4MTA0MDAwNGQsCi0weDI0MDM2MDQwLCAweDk2MDIwMDAwLCAweDMwNDJmZmYwLCAweDE0NDMwMDBjLAotMHgyNDAyMDAyMCwgMHgzYzAzMDAwMSwgMHg5NDYzNmYyNCwgMHgxNDYyMDAwYiwKLTB4MjQwMjc4MzAsIDB4MjQwMjAwMDMsIDB4M2MwMTAwMDEsIDB4YWMyMjZkOTQsCi0weDI0MDIwMDA1LCAweDNjMDEwMDAxLCAweDEwMDAwMDNmLCAweGFjMjI2ZjM0LAotMHgzYzAzMDAwMSwgMHg5NDYzNmYyNCwgMHgyNDAyNzgzMCwgMHgxNDYyMDAwYywKLTB4MjQwMzAwMTAsIDB4M2MwMjAwMDEsIDB4OTQ0MjZmMjYsIDB4MzA0MmZmZjAsCi0weDE0NDMwMDA3LCAweDI0MDIwMDAzLCAweDNjMDEwMDAxLCAweGFjMjI2ZDk0LAotMHgyNDAyMDAwNiwgMHgzYzAxMDAwMSwgMHgxMDAwMDAyZiwgMHhhYzIyNmYzNCwKLTB4M2MwMjAwMDEsIDB4OGM0MjZkOTQsIDB4M2MwMzAwMDEsIDB4OTQ2MzZmMjQsCi0weDM0NDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjI2ZDk0LCAweDI0MDIwMDE1LAotMHgxNDYyMDAwYiwgMHgwLCAweDNjMDIwMDAxLCAweDk0NDI2ZjI2LAotMHgzMDQyZmZmMCwgMHgzODQzZjQyMCwgMHgyYzYzMDAwMSwgMHgzODQyZjQzMCwKLTB4MmM0MjAwMDEsIDB4NjIxODI1LCAweDE0NjAwMDFiLCAweDI0MDIwMDAzLAotMHgzYzAzMDAwMSwgMHg5NDYzNmYyNCwgMHgyNDAyNzgxMCwgMHgxNDYyMDAxNiwKLTB4MjQwMjAwMDIsIDB4M2MwMjAwMDEsIDB4OTQ0MjZmMjYsIDB4MzA0MmZmZjAsCi0weDE0NDAwMDExLCAweDI0MDIwMDAyLCAweDEwMDAwMDBmLCAweDI0MDIwMDA0LAotMHgzYzAyMDAwMSwgMHg4YzQyNmQ5NCwgMHgzNDQyMDAwOCwgMHgzYzAxMDAwMSwKLTB4YWMyMjZkOTQsIDB4MTAwMDAwNWUsIDB4MjQwMjAwMDQsIDB4M2MwMjAwMDEsCi0weDhjNDI2ZDk0LCAweDM0NDIwMDA0LCAweDNjMDEwMDAxLCAweDEwMDAwMGFmLAotMHhhYzIyNmQ5NCwgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzIyNmY0MCwKLTB4M2MwMjAwMDEsIDB4OGM0MjZkOTQsIDB4MzA0MjAwMDIsIDB4MTQ0MDAwYjIsCi0weDNjMDlmZmYwLCAweDI0MDIwZTAwLCAweGFmODIwMjM4LCAweDhmODQwMDU0LAotMHg4ZjgyMDA1NCwgMHgyNDAzMDAwOCwgMHgzYzAxMDAwMSwgMHhhYzIzNmQ5OCwKLTB4MTAwMDAwMDIsIDB4MjQ4NDAxZjQsIDB4OGY4MjAwNTQsIDB4ODIxMDIzLAotMHgyYzQyMDFmNSwgMHgxNDQwZmZmYywgMHgzYzAyMDBjOCwgMHgzNDQyMDFmYiwKLTB4YWY4MjAyMzgsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsCi0weDI0NjMwMWY0LCAweDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDFmNSwKLTB4MTQ0MGZmZmMsIDB4ODAyMSwgMHgyNDEyMDAwMSwgMHgyNDExMDAwOSwKLTB4YzAwNDQ4MiwgMHgwLCAweDNjMDEwMDAxLCAweGFjMzI2ZGI0LAotMHhjMDA0NTQ3LCAweDAsIDB4M2MwMjAwMDEsIDB4OGM0MjZkYjQsCi0weDE0NTFmZmZiLCAweDNjMDIwMGM4LCAweDM0NDIwMWY2LCAweGFmODIwMjM4LAotMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgxMDAwMDAwMiwgMHgyNDYzMDAwYSwKLTB4OGY4MjAwNTQsIDB4NjIxMDIzLCAweDJjNDIwMDBiLCAweDE0NDBmZmZjLAotMHgwLCAweDhmODIwMjIwLCAweDI0MDQwMDAxLCAweDM0NDIwMDAyLAotMHhhZjgyMDIyMCwgMHg4ZjgzMDIwMCwgMHgyNDA1N2ZmZiwgMHgyNDAyZmZmZCwKLTB4NjIxODI0LCAweGFmODMwMjAwLCAweGFmODQwMjA0LCAweDhmODMwMDU0LAotMHg4ZjgyMDA1NCwgMHgxMDAwMDAwMiwgMHgyNDYzMDAwMSwgMHg4ZjgyMDA1NCwKLTB4NjIxMDIzLCAweDJjNDIwMDAyLCAweDE0NDBmZmZjLCAweDAsCi0weDhmODIwMjI0LCAweDE0NDQwMDA1LCAweDM0MDI4MDAwLCAweDQyMDQwLAotMHhhNDEwMmIsIDB4MTA0MGZmZjAsIDB4MzQwMjgwMDAsIDB4MTA4MmZmYTAsCi0weDI2MTAwMDAxLCAweDJlMDIwMDE0LCAweDE0NDBmZmNkLCAweDI0MDIwMDA0LAotMHgzYzAxMDAwMSwgMHhhYzIyNmQ5OCwgMHg4MDIxLCAweDI0MTIwMDA5LAotMHgzYzExZmZmZiwgMHgzNjMxM2Y3ZiwgMHhjMDA0NDgyLCAweDAsCi0weDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjI2ZGI0LCAweGMwMDQ1NDcsCi0weDAsIDB4M2MwMjAwMDEsIDB4OGM0MjZkYjQsIDB4MTQ1MmZmZmIsCi0weDAsIDB4OGY4MjAwNDQsIDB4NTExMDI0LCAweDM0NDI1MDgwLAotMHhhZjgyMDA0NCwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgxMDAwMDAwMiwKLTB4MjQ2MzAwMGEsIDB4OGY4MjAwNTQsIDB4NjIxMDIzLCAweDJjNDIwMDBiLAotMHgxNDQwZmZmYywgMHgwLCAweDhmODIwMDQ0LCAweDUxMTAyNCwKLTB4MzQ0MmYwODAsIDB4YWY4MjAwNDQsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsCi0weDEwMDAwMDAyLCAweDI0NjMwMDBhLCAweDhmODIwMDU0LCAweDYyMTAyMywKLTB4MmM0MjAwMGIsIDB4MTQ0MGZmZmMsIDB4MCwgMHg4ZjgyMDIyMCwKLTB4M2MwM2Y3MDAsIDB4NDMxMDI1LCAweGFmODIwMjIwLCAweDhmODMwMDU0LAotMHg4ZjgyMDA1NCwgMHgxMDAwMDAwMiwgMHgyNDYzMDA2NCwgMHg4ZjgyMDA1NCwKLTB4NjIxMDIzLCAweDJjNDIwMDY1LCAweDE0NDBmZmZjLCAweDAsCi0weDhmODIwMjIwLCAweDI0MDQwMDAxLCAweDM0NDIwMDAyLCAweGFmODIwMjIwLAotMHg4ZjgzMDIwMCwgMHgyNDA1N2ZmZiwgMHgyNDAyZmZmZCwgMHg2MjE4MjQsCi0weGFmODMwMjAwLCAweGFmODQwMjA0LCAweDhmODMwMDU0LCAweDhmODIwMDU0LAotMHgxMDAwMDAwMiwgMHgyNDYzMDAwMSwgMHg4ZjgyMDA1NCwgMHg2MjEwMjMsCi0weDJjNDIwMDAyLCAweDE0NDBmZmZjLCAweDAsIDB4OGY4MjAyMjQsCi0weDE0NDQwMDA1LCAweDM0MDI4MDAwLCAweDQyMDQwLCAweGE0MTAyYiwKLTB4MTA0MGZmZjAsIDB4MzQwMjgwMDAsIDB4MTA4MmZmNTAsIDB4MjYxMDAwMDEsCi0weDJlMDIwMDY0LCAweDE0NDBmZmIwLCAweDAsIDB4M2MwMjAwMDEsCi0weDhjNDI2ZDk0LCAweDMwNDIwMDA0LCAweDE0NDAwMDA3LCAweDNjMDlmZmYwLAotMHg4ZjgyMDA0NCwgMHgzYzAzZmZmZiwgMHgzNDYzM2Y3ZiwgMHg0MzEwMjQsCi0weGFmODIwMDQ0LCAweDNjMDlmZmYwLCAweDM1MjliZGMwLCAweDNjMDYwMDAxLAotMHg4Y2M2NmQ5NCwgMHgzYzA0MDAwMSwgMHgyNDg0NmFlMCwgMHgyNDAyMDAwMSwKLTB4M2MwMTAwMDEsIDB4YWMyMjZkOWMsIDB4OGY4MjAwNTQsIDB4M2MwNzAwMDEsCi0weDhjZTc2ZjQwLCAweDNjMDMwMDAxLCAweDk0NjM2ZjI0LCAweDNjMDgwMDAxLAotMHg5NTA4NmYyNiwgMHgzYzA1MDAwZCwgMHgzNGE1MDEwMCwgMHgzYzAxMDAwMSwKLTB4YWMyMDZkOTgsIDB4NDkxMDIxLCAweDNjMDEwMDAxLCAweGFjMjI2ZjMwLAotMHhhZmEzMDAxMCwgMHhjMDAyYjNiLCAweGFmYTgwMDE0LCAweDhmYmYwMDJjLAotMHg4ZmIyMDAyOCwgMHg4ZmIxMDAyNCwgMHg4ZmIwMDAyMCwgMHgzZTAwMDA4LAotMHgyN2JkMDAzMCwgMHgyN2JkZmZlOCwgMHgzYzA1MDAwMSwgMHg4Y2E1NmQ5OCwKLTB4MjQwNjAwMDQsIDB4MjQwMjAwMDEsIDB4MTRhMjAwMTQsIDB4YWZiZjAwMTAsCi0weDNjMDIwMDAyLCAweDhjNDI4ZmZjLCAweDMwNDI4MDAwLCAweDEwNDAwMDA1LAotMHgzYzA0MDAwZiwgMHgzYzAzMDAwMSwgMHg4YzYzNmY0MCwgMHgxMDAwMDAwNSwKLTB4MzQ4NDQyNDAsIDB4M2MwNDAwMDQsIDB4M2MwMzAwMDEsIDB4OGM2MzZmNDAsCi0weDM0ODQ5M2UwLCAweDI0MDIwMDA1LCAweDE0NjIwMDE2LCAweDAsCi0weDNjMDQwMDNkLCAweDEwMDAwMDEzLCAweDM0ODQwOTAwLCAweDNjMDIwMDAyLAotMHg4YzQyOGZmOCwgMHgzMDQyODAwMCwgMHgxMDQwMDAwNSwgMHgzYzA0MDAxZSwKLTB4M2MwMzAwMDEsIDB4OGM2MzZmNDAsIDB4MTAwMDAwMDUsIDB4MzQ4NDg0ODAsCi0weDNjMDQwMDBmLCAweDNjMDMwMDAxLCAweDhjNjM2ZjQwLCAweDM0ODQ0MjQwLAotMHgyNDAyMDAwNSwgMHgxNDYyMDAwMywgMHgwLCAweDNjMDQwMDdhLAotMHgzNDg0MTIwMCwgMHgzYzAyMDAwMSwgMHg4YzQyNmYzMCwgMHg4ZjgzMDA1NCwKLTB4NDQxMDIxLCAweDQzMTAyMywgMHg0NDEwMmIsIDB4MTQ0MDAwNGMsCi0weDAsIDB4M2MwMjAwMDEsIDB4OGM0MjZkYTAsIDB4MTQ0MDAwNDgsCi0weDAsIDB4M2MwMTAwMDEsIDB4MTBjMDAwMjUsIDB4YWMyMDZkYjAsCi0weDNjMDkwMDAxLCAweDhkMjk2ZDk0LCAweDI0MDcwMDAxLCAweDNjMDQ0MDAwLAotMHgzYzA4MDAwMiwgMHgyNTA4OGZmYywgMHgyNTBhZmZmYywgMHg1Mjg0MiwKLTB4MTRhMDAwMDIsIDB4MjRjNmZmZmYsIDB4MjQwNTAwMDgsIDB4YTkxMDI0LAotMHgxMDQwMDAxMCwgMHgwLCAweDE0YTcwMDA4LCAweDAsCi0weDhkMDIwMDAwLCAweDQ0MTAyNCwgMHgxMDQwMDAwYSwgMHgwLAotMHgzYzAxMDAwMSwgMHgxMDAwMDAwNywgMHhhYzI1NmRiMCwgMHg4ZDQyMDAwMCwKLTB4NDQxMDI0LCAweDEwNDAwMDAzLCAweDAsIDB4M2MwMTAwMDEsCi0weGFjMjc2ZGIwLCAweDNjMDIwMDAxLCAweDhjNDI2ZGIwLCAweDYxODJiLAotMHgyYzQyMDAwMSwgMHg0MzEwMjQsIDB4NTQ0MGZmZTUsIDB4NTI4NDIsCi0weDhmODIwMDU0LCAweDNjMDMwMDAxLCAweDhjNjM2ZGIwLCAweDNjMDEwMDAxLAotMHhhYzIyNmYzMCwgMHgxMDYwMDAzYiwgMHgyNDAyMDAwNSwgMHgzYzAzMDAwMSwKLTB4OGM2MzZmNDAsIDB4M2MwMTAwMDEsIDB4YWMyNTZkOTgsIDB4MTQ2MjAwMTIsCi0weDI0MDIwMDAxLCAweDNjMDIwMDAyLCAweDhjNDI4ZmY4LCAweDNjMDMyMDAwLAotMHgzNDYzNTAwMCwgMHg0MzEwMjQsIDB4MTQ0MDAwMDYsIDB4MjQwMjAwMDEsCi0weDNjMDEwMDAxLCAweGFjMjA2ZjFjLCAweDNjMDEwMDAxLCAweGFjMjI2ZDk4LAotMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzIyNmUyNCwgMHgzYzAxMDAwMSwKLTB4YWMyMjZkYTQsIDB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMjZkOWMsCi0weDNjMDIwMDAxLCAweDhjNDI2ZGIwLCAweDEwNDAwMDFlLCAweDAsCi0weDNjMDIwMDAxLCAweDhjNDI2ZDljLCAweDEwNDAwMDA4LCAweDI0MDIwMDAxLAotMHgzYzAxMDAwMSwgMHhhYzIwNmQ5YywgMHhhZWUyMDRiOCwgMHgzYzAxMDAwMSwKLTB4YWMyMDZlMWMsIDB4M2MwMTAwMDEsIDB4YWMyMjZkZDQsIDB4OGVlMzA0YjgsCi0weDI0MDIwMDA4LCAweDEwNjIwMDA1LCAweDI0MDIwMDAxLCAweGMwMDQyMzksCi0weDAsIDB4MTAwMDAwMGIsIDB4MCwgMHgzYzAzMDAwMSwKLTB4OGM2MzZkOTgsIDB4MTA2MjAwMDcsIDB4MjQwMjAwMGUsIDB4M2MwMzAwMDIsCi0weDhjNjM4ZjkwLCAweDEwNjIwMDAzLCAweDAsIDB4YzAwNGU5YywKLTB4OGY4NDAyMjAsIDB4OGZiZjAwMTAsIDB4M2UwMDAwOCwgMHgyN2JkMDAxOCwKLTB4MjdiZGZmZTAsIDB4M2MwM2ZkZmYsIDB4M2MwNDAwMDEsIDB4OGM4NDZkOTgsCi0weDNjMDIwMDAxLCAweDhjNDI2ZGMwLCAweDM0NjNmZmZmLCAweDI4M2EwMjQsCi0weDE0ODIwMDA2LCAweGFmYmYwMDE4LCAweDhlZTMwNGI4LCAweDNjMDIwMDAxLAotMHg4YzQyNmRjNCwgMHgxMDYyMDAwNiwgMHgwLCAweDhlZTIwNGI4LAotMHgzYzAxMDAwMSwgMHhhYzI0NmRjMCwgMHgzYzAxMDAwMSwgMHhhYzIyNmRjNCwKLTB4M2MwMzAwMDEsIDB4OGM2MzZkOTgsIDB4MjQwMjAwMDIsIDB4MTA2MjAxOWMsCi0weDJjNjIwMDAzLCAweDEwNDAwMDA1LCAweDI0MDIwMDAxLCAweDEwNjIwMDBhLAotMHgwLCAweDEwMDAwMjI2LCAweDAsIDB4MjQwMjAwMDQsCi0weDEwNjIwMGI2LCAweDI0MDIwMDA4LCAweDEwNjIwMTBhLCAweDI0MDIwMDAxLAotMHgxMDAwMDIxZiwgMHgwLCAweDhlZTIwNGI4LCAweDI0NDNmZmZmLAotMHgyYzYyMDAwOCwgMHgxMDQwMDIxYywgMHgzMTA4MCwgMHgzYzAxMDAwMSwKLTB4MjIwODIxLCAweDhjMjI2YWY4LCAweDQwMDAwOCwgMHgwLAotMHgzYzAzMDAwMSwgMHg4YzYzNmY0MCwgMHgyNDAyMDAwNSwgMHgxNDYyMDAxMCwKLTB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNmRhNCwgMHgxMDQwMDAwOCwKLTB4MjQwMjAwMDMsIDB4YzAwNDQ4MiwgMHgwLCAweDI0MDIwMDAyLAotMHhhZWUyMDRiOCwgMHgzYzAxMDAwMSwgMHgxMDAwMDAwMiwgMHhhYzIwNmRhNCwKLTB4YWVlMjA0YjgsIDB4M2MwMTAwMDEsIDB4MTAwMDAyMDMsIDB4YWMyMDZkMzAsCi0weGMwMDQ0ODIsIDB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNmRhNCwKLTB4M2MwMTAwMDEsIDB4YWMyMDZkMzAsIDB4MTQ0MDAxN2EsIDB4MjQwMjAwMDIsCi0weDEwMDAwMTlkLCAweDI0MDIwMDA3LCAweDNjMDMwMDAxLCAweDhjNjM2ZjQwLAotMHgyNDAyMDAwNSwgMHgxNDYyMDAwMywgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwKLTB4YWMyMjZkZDAsIDB4YzAwNDVmZiwgMHgwLCAweDNjMDMwMDAxLAotMHg4YzYzNmRkMCwgMHgxMDAwMDE3NCwgMHgyNDAyMDAxMSwgMHgzYzA1MDAwMSwKLTB4OGNhNTZkOTgsIDB4M2MwNjAwMDIsIDB4OGNjNjhmZmMsIDB4YzAwNTEwNCwKLTB4MjAyMSwgMHgyNDAyMDAwNSwgMHgzYzAxMDAwMSwgMHhhYzIwNmRhNCwKLTB4MTAwMDAxZTEsIDB4YWVlMjA0YjgsIDB4M2MwNDAwMDEsIDB4MjQ4NDZhZWMsCi0weDNjMDUwMDBmLCAweDM0YTUwMTAwLCAweDMwMjEsIDB4MzgyMSwKLTB4YWZhMDAwMTAsIDB4YzAwMmIzYiwgMHhhZmEwMDAxNCwgMHgxMDAwMDFkNiwKLTB4MCwgMHg4ZjgyMDIyMCwgMHgzYzAzMDAwNCwgMHg0MzEwMjQsCi0weDE0NDAwMTc1LCAweDI0MDIwMDA3LCAweDhmODMwMDU0LCAweDNjMDIwMDAxLAotMHg4YzQyNmYyOCwgMHgyNDYzZDhmMCwgMHg0MzEwMjMsIDB4MmM0MjI3MTAsCi0weDE0NDAwMDAzLCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjI2ZDljLAotMHgzYzAyMDAwMiwgMHg4YzQyOGZmYywgMHgzMDQyNTAwMCwgMHgxMDQwMDFjMiwKLTB4MCwgMHg4ZjgyMDIyMCwgMHgzMDQyODAwMCwgMHgxMDQwMDE3ZCwKLTB4MCwgMHgxMDAwMDE3NSwgMHgwLCAweDNjMDUwMDAxLAotMHg4Y2E1NmQ5OCwgMHhjMDA1MjliLCAweDIwMjEsIDB4YzAwNTUxYiwKLTB4MjAyMSwgMHgzYzAzMDAwMiwgMHg4YzYzOGZmNCwgMHg0NjEwMWIwLAotMHgyNDAyMDAwMSwgMHgzYzAyMDAwOCwgMHg2MjEwMjQsIDB4MTA0MDAwMDYsCi0weDAsIDB4OGY4MjAyMTQsIDB4M2MwM2ZmZmYsIDB4NDMxMDI0LAotMHgxMDAwMDAwNSwgMHgzNDQyMjUxZiwgMHg4ZjgyMDIxNCwgMHgzYzAzZmZmZiwKLTB4NDMxMDI0LCAweDM0NDIyNDFmLCAweGFmODIwMjE0LCAweDhmODIwMjIwLAotMHgzYzAzMDIwMCwgMHgzNDQyMDAwMiwgMHhhZjgyMDIyMCwgMHgyNDAyMDAwOCwKLTB4YWVlMjA0YjgsIDB4OGY4MjAyMjAsIDB4MjgzYTAyNSwgMHgzYzAzMDAwNCwKLTB4NDMxMDI0LCAweDE0NDAwMDE2LCAweDAsIDB4M2MwMjAwMDIsCi0weDhjNDI4ZmZjLCAweDMwNDI1MDAwLCAweDEwNDAwMDBkLCAweDAsCi0weDhmODIwMjIwLCAweDMwNDI4MDAwLCAweDEwNDAwMDA2LCAweDAsCi0weDhmODIwMjIwLCAweDNjMDNmZmZmLCAweDM0NjM3ZmZmLCAweDEwMDAwMDAzLAotMHg0MzEwMjQsIDB4OGY4MjAyMjAsIDB4MzQ0MjgwMDAsIDB4YWY4MjAyMjAsCi0weDhmODIwMjIwLCAweDNjMDNmNzAwLCAweDQzMTAyNSwgMHhhZjgyMDIyMCwKLTB4M2MwMzAwMDEsIDB4OGM2MzZmNDAsIDB4MjQwMjAwMDUsIDB4MTQ2MjAwMGEsCi0weDAsIDB4M2MwMjAwMDEsIDB4OTQ0MjZmMjYsIDB4MjQ0MjlmYmMsCi0weDJjNDIwMDA0LCAweDEwNDAwMDA0LCAweDI0MDQwMDE4LCAweDI0MDUwMDAyLAotMHhjMDA0ZGRiLCAweDI0MDYwMDIwLCAweGMwMDNlNmQsIDB4MCwKLTB4M2MwMTAwMDEsIDB4MTAwMDAxNzAsIDB4YWMyMDZlMjAsIDB4OGVlMjA0YjgsCi0weDI0NDNmZmZmLCAweDJjNjIwMDA4LCAweDEwNDAwMTZiLCAweDMxMDgwLAotMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4OGMyMjZiMTgsIDB4NDAwMDA4LAotMHgwLCAweGMwMDQ1NDcsIDB4MCwgMHgzYzAzMDAwMSwKLTB4OGM2MzZkYjQsIDB4MTAwMDAwZTgsIDB4MjQwMjAwMDksIDB4M2MwMjAwMDIsCi0weDhjNDI4ZmY4LCAweDMwNDI0MDAwLCAweDEwNDAwMDA0LCAweDAsCi0weDhmODIwMDQ0LCAweDEwMDAwMDA2LCAweDM0NDJmMDgwLCAweDhmODIwMDQ0LAotMHgzYzAzZmZmZiwgMHgzNDYzM2Y3ZiwgMHg0MzEwMjQsIDB4MzQ0MmEwODAsCi0weGFmODIwMDQ0LCAweDhmODMwMDU0LCAweDEwMDAwMGVhLCAweDI0MDIwMDA0LAotMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMSwgMHg4YzQyNmYyOCwgMHgyNDYzZDhmMCwKLTB4NDMxMDIzLCAweDJjNDIyNzEwLCAweDE0NDAwMTQ3LCAweDI0MDIwMDA1LAotMHgxMDAwMDBkOCwgMHgwLCAweDhmODIwMjIwLCAweDNjMDNmNzAwLAotMHg0MzEwMjUsIDB4YWY4MjAyMjAsIDB4YWY4MDAyMDQsIDB4M2MwMTAwMDIsCi0weDEwMDAwMGQ2LCAweGFjMjA4ZmUwLCAweDhmODMwMDU0LCAweDNjMDIwMDAxLAotMHg4YzQyNmYyOCwgMHgyNDYzZmZmNiwgMHg0MzEwMjMsIDB4MmM0MjAwMGEsCi0weDE0NDAwMTM1LCAweDI0MDIwMDA3LCAweDEwMDAwMGQ3LCAweDAsCi0weGMwMDNmNTAsIDB4MCwgMHgxMDQwMDEyZCwgMHgyNDAyMDAwMSwKLTB4OGY4MjAyMTQsIDB4M2MwM2ZmZmYsIDB4M2MwNDAwMDEsIDB4OGM4NDZmMWMsCi0weDQzMTAyNCwgMHgzNDQyMjUxZiwgMHhhZjgyMDIxNCwgMHgyNDAyMDAwOCwKLTB4MTA4MDAwMDUsIDB4YWVlMjA0YjgsIDB4M2MwMjAwMDEsIDB4OGM0MjZlNDQsCi0weDEwNDAwMDY0LCAweDI0MDIwMDAxLCAweDhmODIwMjIwLCAweDNjMDMwMDA4LAotMHg0MzEwMjQsIDB4MTA0MDAwNmEsIDB4M2MwMjAyMDAsIDB4MTAwMDAwNzgsCi0weDAsIDB4OGVlMjA0YjgsIDB4MjQ0M2ZmZmYsIDB4MmM2MjAwMDcsCi0weDEwNDAwMTE1LCAweDMxMDgwLCAweDNjMDEwMDAxLCAweDIyMDgyMSwKLTB4OGMyMjZiMzgsIDB4NDAwMDA4LCAweDAsIDB4YzAwM2RhZiwKLTB4MCwgMHgzYzAxMDAwMSwgMHhhYzIwNmQ5YywgMHhhZjgwMDIwNCwKLTB4M2MwMTAwMDIsIDB4YzAwNDQ4MiwgMHhhYzIwOGZlMCwgMHgyNDAyMDAwMSwKLTB4M2MwMTAwMDEsIDB4YWMyMjZkYjQsIDB4MjQwMjAwMDIsIDB4MTAwMDAxMDIsCi0weGFlZTIwNGI4LCAweGMwMDQ1NDcsIDB4MCwgMHgzYzAzMDAwMSwKLTB4OGM2MzZkYjQsIDB4MTAwMDAwODQsIDB4MjQwMjAwMDksIDB4M2MwMjAwMDIsCi0weDhjNDI4ZmY4LCAweDMwNDI0MDAwLCAweDEwNDAwMDAzLCAweDNjMDIwMGM4LAotMHgxMDAwMDAwMiwgMHgzNDQyMDFmNiwgMHgzNDQyMDFmZSwgMHhhZjgyMDIzOCwKLTB4OGY4MzAwNTQsIDB4MTAwMDAwOGIsIDB4MjQwMjAwMDQsIDB4OGY4MzAwNTQsCi0weDNjMDIwMDAxLCAweDhjNDI2ZjI4LCAweDI0NjNkOGYwLCAweDQzMTAyMywKLTB4MmM0MjI3MTAsIDB4MTQ0MDAwZTgsIDB4MjQwMjAwMDUsIDB4MTAwMDAwNzksCi0weDAsIDB4OGY4MjAyMjAsIDB4M2MwM2Y3MDAsIDB4NDMxMDI1LAotMHhhZjgyMDIyMCwgMHhhZjgwMDIwNCwgMHgzYzAxMDAwMiwgMHgxMDAwMDA3NywKLTB4YWMyMDhmZTAsIDB4OGY4MzAwNTQsIDB4M2MwMjAwMDEsIDB4OGM0MjZmMjgsCi0weDI0NjNmZmY2LCAweDQzMTAyMywgMHgyYzQyMDAwYSwgMHgxNDQwMDBkNiwKLTB4MjQwMjAwMDcsIDB4MTAwMDAwNzgsIDB4MCwgMHhjMDAzZjUwLAotMHgwLCAweDEwNDAwMGNlLCAweDI0MDIwMDAxLCAweDhmODIwMjE0LAotMHgzYzAzZmZmZiwgMHgzYzA0MDAwMSwgMHg4Yzg0NmYxYywgMHg0MzEwMjQsCi0weDM0NDIyNTFmLCAweGFmODIwMjE0LCAweDI0MDIwMDA4LCAweDEwODAwMDBmLAotMHhhZWUyMDRiOCwgMHgzYzAyMDAwMSwgMHg4YzQyNmU0NCwgMHgxNDQwMDAwYiwKLTB4MCwgMHg4ZjgyMDIyMCwgMHgzNDQyMDAwMiwgMHhhZjgyMDIyMCwKLTB4MjQwMjAwMDEsIDB4M2MwMTAwMDIsIDB4YWMyMjhmOTAsIDB4YzAwNGU5YywKLTB4OGY4NDAyMjAsIDB4MTAwMDAwMTYsIDB4MCwgMHg4ZjgyMDIyMCwKLTB4M2MwMzAwMDgsIDB4NDMxMDI0LCAweDE0NDAwMDExLCAweDNjMDIwMjAwLAotMHgyODJhMDI1LCAweDI0MDIwMDBlLCAweDNjMDEwMDAyLCAweGFjMjI4ZjkwLAotMHhjMDA1NTFiLCAweDIwMjEsIDB4OGY4MjAyMjAsIDB4MzQ0MjAwMDIsCi0weGMwMDNlNmQsIDB4YWY4MjAyMjAsIDB4M2MwNTAwMDEsIDB4OGNhNTZkOTgsCi0weGMwMDUyOWIsIDB4MjAyMSwgMHgxMDAwMDBhMywgMHgwLAotMHgzYzAyMDAwMSwgMHg4YzQyNmU0NCwgMHgxMDQwMDA5ZiwgMHgwLAotMHgzYzAyMDAwMSwgMHg4YzQyNmU0MCwgMHgyNDQyZmZmZiwgMHgzYzAxMDAwMSwKLTB4YWMyMjZlNDAsIDB4MTQ0MDAwOTgsIDB4MjQwMjAwMDIsIDB4M2MwMTAwMDEsCi0weGFjMjA2ZTQ0LCAweDNjMDEwMDAxLCAweDEwMDAwMDkzLCAweGFjMjI2ZTQwLAotMHg4ZWUyMDRiOCwgMHgyNDQzZmZmZiwgMHgyYzYyMDAwNywgMHgxMDQwMDA4ZSwKLTB4MzEwODAsIDB4M2MwMTAwMDEsIDB4MjIwODIxLCAweDhjMjI2YjU4LAotMHg0MDAwMDgsIDB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNmRhNCwKLTB4MTA0MDAwMTgsIDB4MjQwMjAwMDUsIDB4YzAwNDQ4MiwgMHgwLAotMHgyNDAyMDAwMiwgMHhhZWUyMDRiOCwgMHgzYzAxMDAwMSwgMHgxMDAwMDA3ZSwKLTB4YWMyMDZkYTQsIDB4YzAwNDk2MywgMHgwLCAweDNjMDMwMDAxLAotMHg4YzYzNmRkNCwgMHgyNDAyMDAwNiwgMHgxNDYyMDA3NywgMHgyNDAyMDAwMywKLTB4MTAwMDAwNzUsIDB4YWVlMjA0YjgsIDB4M2MwNTAwMDEsIDB4OGNhNTZkOTgsCi0weDNjMDYwMDAyLCAweDhjYzY4ZmY4LCAweGMwMDUxMDQsIDB4MjAyMSwKLTB4MjQwMjAwMDUsIDB4MTAwMDAwNmMsIDB4YWVlMjA0YjgsIDB4OGY4MjAyMjAsCi0weDNjMDNmNzAwLCAweDQzMTAyNSwgMHhhZjgyMDIyMCwgMHg4ZjgzMDA1NCwKLTB4MjQwMjAwMDYsIDB4YWVlMjA0YjgsIDB4M2MwMTAwMDEsIDB4MTAwMDAwNjIsCi0weGFjMjM2ZjI4LCAweDhmODIwMjIwLCAweDNjMDMwMDA0LCAweDQzMTAyNCwKLTB4MTA0MDAwMDMsIDB4MjQwMjAwMDcsIDB4MTAwMDAwNWIsIDB4YWVlMjA0YjgsCi0weDhmODMwMDU0LCAweDNjMDIwMDAxLCAweDhjNDI2ZjI4LCAweDI0NjNkOGYwLAotMHg0MzEwMjMsIDB4MmM0MjI3MTAsIDB4MTQ0MDAwMDMsIDB4MjQwMjAwMDEsCi0weDNjMDEwMDAxLCAweGFjMjI2ZDljLCAweDNjMDIwMDAyLCAweDhjNDI4ZmY4LAotMHgzMDQyNTAwMCwgMHgxMDQwMDA0YywgMHgwLCAweDhmODIwMjIwLAotMHgzMDQyODAwMCwgMHgxMDQwMDAwNywgMHgwLCAweDhmODIwMjIwLAotMHgzYzAzZmZmZiwgMHgzNDYzN2ZmZiwgMHg0MzEwMjQsIDB4MTAwMDAwNDIsCi0weGFmODIwMjIwLCAweDhmODIwMjIwLCAweDM0NDI4MDAwLCAweDEwMDAwMDNlLAotMHhhZjgyMDIyMCwgMHgzYzA1MDAwMSwgMHg4Y2E1NmQ5OCwgMHhjMDA1MjliLAotMHgyMDIxLCAweGMwMDU1MWIsIDB4MjAyMSwgMHgzYzAyMDAwMiwKLTB4OGM0MjhmZjAsIDB4NDQxMDAzMiwgMHgyNDAyMDAwMSwgMHg4ZjgyMDIxNCwKLTB4M2MwM2ZmZmYsIDB4NDMxMDI0LCAweDM0NDIyNTFmLCAweGFmODIwMjE0LAotMHgyNDAyMDAwOCwgMHhhZWUyMDRiOCwgMHg4ZjgyMDIyMCwgMHgzNDQyMDAwMiwKLTB4YWY4MjAyMjAsIDB4OGY4MjAyMjAsIDB4M2MwMzAwMDQsIDB4NDMxMDI0LAotMHgxNDQwMDAxNiwgMHgwLCAweDNjMDIwMDAyLCAweDhjNDI4ZmY4LAotMHgzMDQyNTAwMCwgMHgxMDQwMDAwZCwgMHgwLCAweDhmODIwMjIwLAotMHgzMDQyODAwMCwgMHgxMDQwMDAwNiwgMHgwLCAweDhmODIwMjIwLAotMHgzYzAzZmZmZiwgMHgzNDYzN2ZmZiwgMHgxMDAwMDAwMywgMHg0MzEwMjQsCi0weDhmODIwMjIwLCAweDM0NDI4MDAwLCAweGFmODIwMjIwLCAweDhmODIwMjIwLAotMHgzYzAzZjcwMCwgMHg0MzEwMjUsIDB4YWY4MjAyMjAsIDB4M2MwMjAwMDEsCi0weDk0NDI2ZjI2LCAweDI0NDI5ZmJjLCAweDJjNDIwMDA0LCAweDEwNDAwMDA0LAotMHgyNDA0MDAxOCwgMHgyNDA1MDAwMiwgMHhjMDA0ZGRiLCAweDI0MDYwMDIwLAotMHhjMDAzZTZkLCAweDAsIDB4MTAwMDAwMDMsIDB4MCwKLTB4M2MwMTAwMDEsIDB4YWMyMjZkOWMsIDB4OGZiZjAwMTgsIDB4M2UwMDAwOCwKLTB4MjdiZDAwMjAsIDB4OGY4MjAyMDAsIDB4OGY4MjAyMjAsIDB4OGY4MjAyMjAsCi0weDM0NDIwMDA0LCAweGFmODIwMjIwLCAweDhmODIwMjAwLCAweDNjMDUwMDAxLAotMHg4Y2E1NmQ5OCwgMHgzNDQyMDAwNCwgMHhhZjgyMDIwMCwgMHgyNDAyMDAwMiwKLTB4MTBhMjAwNGIsIDB4MmNhMjAwMDMsIDB4MTA0MDAwMDUsIDB4MjQwMjAwMDEsCi0weDEwYTIwMDBhLCAweDAsIDB4MTAwMDAwYjEsIDB4MCwKLTB4MjQwMjAwMDQsIDB4MTBhMjAwNzIsIDB4MjQwMjAwMDgsIDB4MTBhMjAwODUsCi0weDNjMDJmMGZmLCAweDEwMDAwMGFhLCAweDAsIDB4OGY4MzAwNTAsCi0weDNjMDJmMGZmLCAweDM0NDJmZmZmLCAweDNjMDQwMDAxLCAweDhjODQ2ZjQwLAotMHg2MjE4MjQsIDB4M2MwMjA3MDAsIDB4NjIxODI1LCAweDI0MDIwZTAwLAotMHgyNDg0ZmZmYiwgMHgyYzg0MDAwMiwgMHhhZjgzMDA1MCwgMHhhZjg1MDIwMCwKLTB4YWY4NTAyMjAsIDB4MTQ4MDAwMDYsIDB4YWY4MjAyMzgsIDB4OGY4MjAwNDQsCi0weDNjMDNmZmZmLCAweDM0NjMzZjdmLCAweDQzMTAyNCwgMHhhZjgyMDA0NCwKLTB4M2MwMzAwMDEsIDB4OGM2MzZmNDAsIDB4MjQwMjAwMDUsIDB4MTQ2MjAwMDQsCi0weDAsIDB4OGY4MjAwNDQsIDB4MzQ0MjUwMDAsIDB4YWY4MjAwNDQsCi0weDNjMDIwMDAxLCAweDhjNDI2ZDg4LCAweDNjMDMwMDAxLCAweDhjNjM2ZjQwLAotMHgzNDQyMDAyMiwgMHgyNDYzZmZmYywgMHgyYzYzMDAwMiwgMHgxNDYwMDAwYywKLTB4YWY4MjAyMDAsIDB4M2MwMjAwMDEsIDB4OGM0MjZkYWMsIDB4M2MwMzAwMDEsCi0weDhjNjM2ZDkwLCAweDNjMDQwMDAxLCAweDhjODQ2ZDhjLCAweDM0NDI4MDAwLAotMHg2MjE4MjUsIDB4NjQxODI1LCAweDEwMDAwMDBhLCAweDM0NjIwMDAyLAotMHgzYzAyMDAwMSwgMHg4YzQyNmQ5MCwgMHgzYzAzMDAwMSwgMHg4YzYzNmRhYywKLTB4M2MwNDAwMDEsIDB4OGM4NDZkOGMsIDB4NDMxMDI1LCAweDQ0MTAyNSwKLTB4MzQ0MjAwMDIsIDB4YWY4MjAyMjAsIDB4MTAwMDAwMmYsIDB4MjQwMjAwMDEsCi0weDI0MDIwZTAxLCAweGFmODIwMjM4LCAweDhmODMwMDUwLCAweDNjMDJmMGZmLAotMHgzNDQyZmZmZiwgMHgzYzA0MDAwMSwgMHg4Yzg0NmYxYywgMHg2MjE4MjQsCi0weDNjMDIwZDAwLCAweDYyMTgyNSwgMHgyNDAyMDAwMSwgMHhhZjgzMDA1MCwKLTB4YWY4MjAyMDAsIDB4YWY4MjAyMjAsIDB4MTA4MDAwMDUsIDB4M2MwMzNmMDAsCi0weDNjMDIwMDAxLCAweDhjNDI2ZDgwLCAweDEwMDAwMDA0LCAweDM0NjMwMDcwLAotMHgzYzAyMDAwMSwgMHg4YzQyNmQ4MCwgMHgzNDYzMDA3MiwgMHg0MzEwMjUsCi0weGFmODIwMjAwLCAweDNjMDMwMDAxLCAweDhjNjM2ZDg0LCAweDNjMDJmNzAwLAotMHg2MjE4MjUsIDB4M2MwMjAwMDEsIDB4OGM0MjZkOTAsIDB4M2MwNDAwMDEsCi0weDhjODQ2ZGFjLCAweDNjMDUwMDAxLCAweDhjYTU2ZjQwLCAweDQzMTAyNSwKLTB4NDQxMDI1LCAweGFmODIwMjIwLCAweDI0MDIwMDA1LCAweDE0YTIwMDA2LAotMHgyNDAyMDAwMSwgMHg4ZjgyMDA0NCwgMHgyNDAzYWZmZiwgMHg0MzEwMjQsCi0weGFmODIwMDQ0LCAweDI0MDIwMDAxLCAweDEwMDAwMDNkLCAweGFmODIwMjM4LAotMHg4ZjgzMDA1MCwgMHgzYzAyZjBmZiwgMHgzNDQyZmZmZiwgMHgzYzA0MDAwMSwKLTB4OGM4NDZmMWMsIDB4NjIxODI0LCAweDNjMDIwYTAwLCAweDYyMTgyNSwKLTB4MjQwMjAwMDEsIDB4YWY4MzAwNTAsIDB4YWY4MjAyMDAsIDB4MTA4MDAwMWUsCi0weGFmODIwMjIwLCAweDNjMDIwMDAxLCAweDhjNDI2ZTQ0LCAweDE0NDAwMDFhLAotMHgzYzAzM2YwMCwgMHgzYzAyMDAwMSwgMHg4YzQyNmQ4MCwgMHgxMDAwMDAxYSwKLTB4MzQ2MzAwZTAsIDB4OGY4MzAwNTAsIDB4M2MwNDAwMDEsIDB4OGM4NDZmMWMsCi0weDM0NDJmZmZmLCAweDYyMTgyNCwgMHgxMDgwMDAwZiwgMHhhZjgzMDA1MCwKLTB4M2MwMjAwMDEsIDB4OGM0MjZlNDQsIDB4MTQ0MDAwMGIsIDB4M2MwNDNmMDAsCi0weDNjMDMwMDAxLCAweDhjNjM2ZDgwLCAweDM0ODQwMGUwLCAweDI0MDIwMDAxLAotMHhhZjgyMDIwMCwgMHhhZjgyMDIyMCwgMHg2NDE4MjUsIDB4YWY4MzAyMDAsCi0weDEwMDAwMDA4LCAweDNjMDVmNzAwLCAweDNjMDIwMDAxLCAweDhjNDI2ZDgwLAotMHgzYzAzM2YwMCwgMHgzNDYzMDBlMiwgMHg0MzEwMjUsIDB4YWY4MjAyMDAsCi0weDNjMDVmNzAwLCAweDM0YTU4MDAwLCAweDNjMDMwMDAxLCAweDhjNjM2ZDg0LAotMHgzYzAyMDAwMSwgMHg4YzQyNmQ5MCwgMHgzYzA0MDAwMSwgMHg4Yzg0NmRhYywKLTB4NjUxODI1LCAweDQzMTAyNSwgMHg0NDEwMjUsIDB4YWY4MjAyMjAsCi0weDNlMDAwMDgsIDB4MCwgMHgzYzAzMDAwMSwgMHg4YzYzNmRiNCwKLTB4M2MwMjAwMDEsIDB4OGM0MjZkYjgsIDB4MTA2MjAwMDMsIDB4MjQwMjAwMDIsCi0weDNjMDEwMDAxLCAweGFjMjM2ZGI4LCAweDEwNjIwMDFkLCAweDJjNjIwMDAzLAotMHgxMDQwMDAyNSwgMHgyNDAyMDAwMSwgMHgxNDYyMDAyMywgMHgyNDAyMDAwNCwKLTB4M2MwMzAwMDEsIDB4OGM2MzZkOTgsIDB4MTA2MjAwMDYsIDB4MjQwMjAwMDgsCi0weDE0NjIwMDBjLCAweDNjMDIwMGM4LCAweDM0NDIwMWZiLCAweDEwMDAwMDA5LAotMHhhZjgyMDIzOCwgMHgyNDAyMGUwMSwgMHhhZjgyMDIzOCwgMHg4ZjgyMDA0NCwKLTB4M2MwM2ZmZmYsIDB4MzQ2MzNmN2YsIDB4NDMxMDI0LCAweDM0NDIwMDgwLAotMHhhZjgyMDA0NCwgMHg4ZjgzMDA1NCwgMHgyNDAyMDAwMiwgMHgzYzAxMDAwMSwKLTB4YWMyMjZkYjQsIDB4M2MwMTAwMDEsIDB4MTAwMDAwMGIsIDB4YWMyMzZmMmMsCi0weDhmODMwMDU0LCAweDNjMDIwMDAxLCAweDhjNDI2ZjJjLCAweDI0NjNkOGYwLAotMHg0MzEwMjMsIDB4MmM0MjI3MTAsIDB4MTQ0MDAwMDMsIDB4MjQwMjAwMDksCi0weDNjMDEwMDAxLCAweGFjMjI2ZGI0LCAweDNlMDAwMDgsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MjdiZGZmZDgsCi0weGFmYjIwMDE4LCAweDgwOTAyMSwgMHhhZmIzMDAxYywgMHhhMDk4MjEsCi0weGFmYjEwMDE0LCAweGMwODgyMSwgMHhhZmIwMDAxMCwgMHg4MDIxLAotMHhhZmJmMDAyMCwgMHhhNjIwMDAwMCwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLAotMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwgMHgwLAotMHhjMDA0ZDc4LCAweDIwMjEsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsCi0weDI0MTAwMDEwLCAweDI1MDEwMjQsIDB4MTA0MDAwMDIsIDB4MjAyMSwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsCi0weDI1MDEwMjQsIDB4MjQxMDAwMTAsIDB4MjcwMTAyNCwgMHgxMDQwMDAwMiwKLTB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwKLTB4MTYwMGZmZmEsIDB4MjcwMTAyNCwgMHhjMDA0ZGI5LCAweDM0MTA4MDAwLAotMHhjMDA0ZGI5LCAweDAsIDB4YzAwNGQ1OCwgMHgwLAotMHg1MDQwMDAwNSwgMHgxMDgwNDIsIDB4OTYyMjAwMDAsIDB4NTAxMDI1LAotMHhhNjIyMDAwMCwgMHgxMDgwNDIsIDB4MTYwMGZmZjcsIDB4MCwKLTB4YzAwNGRiOSwgMHgwLCAweDhmYmYwMDIwLCAweDhmYjMwMDFjLAotMHg4ZmIyMDAxOCwgMHg4ZmIxMDAxNCwgMHg4ZmIwMDAxMCwgMHgzZTAwMDA4LAotMHgyN2JkMDAyOCwgMHgyN2JkZmZkOCwgMHhhZmIxMDAxNCwgMHg4MDg4MjEsCi0weGFmYjIwMDE4LCAweGEwOTAyMSwgMHhhZmIzMDAxYywgMHhjMDk4MjEsCi0weGFmYjAwMDEwLCAweDgwMjEsIDB4YWZiZjAwMjAsIDB4YzAwNGQ3OCwKLTB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsCi0weDAsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweGMwMDRkNzgsCi0weDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgMHhjMDA0ZDc4LAotMHgyNDA0MDAwMSwgMHgyNDEwMDAxMCwgMHgyMzAxMDI0LCAweDEwNDAwMDAyLAotMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLAotMHgxNjAwZmZmYSwgMHgyMzAxMDI0LCAweDI0MTAwMDEwLCAweDI1MDEwMjQsCi0weDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwKLTB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDI1MDEwMjQsIDB4YzAwNGQ3OCwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweDM0MTA4MDAwLAotMHg5NjYyMDAwMCwgMHg1MDEwMjQsIDB4MTA0MDAwMDIsIDB4MjAyMSwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZjgsCi0weDAsIDB4YzAwNGRiOSwgMHgwLCAweDhmYmYwMDIwLAotMHg4ZmIzMDAxYywgMHg4ZmIyMDAxOCwgMHg4ZmIxMDAxNCwgMHg4ZmIwMDAxMCwKLTB4M2UwMDAwOCwgMHgyN2JkMDAyOCwgMHgzYzA0MDAwMSwgMHg4Yzg0NmRkMCwKLTB4M2MwMjAwMDEsIDB4OGM0MjZlMTgsIDB4MjdiZGZmZDgsIDB4YWZiZjAwMjAsCi0weGFmYjEwMDFjLCAweDEwODIwMDAzLCAweGFmYjAwMDE4LCAweDNjMDEwMDAxLAotMHhhYzI0NmUxOCwgMHgzYzAzMDAwMSwgMHg4YzYzNmY0MCwgMHgyNDAyMDAwNSwKLTB4MTQ2MjAwMDUsIDB4MjQ4M2ZmZmYsIDB4YzAwNDk2MywgMHgwLAotMHgxMDAwMDM0YywgMHgwLCAweDJjNjIwMDEzLCAweDEwNDAwMzQ5LAotMHgzMTA4MCwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4OGMyMjZiODAsCi0weDQwMDAwOCwgMHgwLCAweGMwMDRkYjksIDB4ODAyMSwKLTB4MzQwMjgwMDAsIDB4YTdhMjAwMTAsIDB4MjdiMTAwMTAsIDB4YzAwNGQ3OCwKLTB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsCi0weDAsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweGMwMDRkNzgsCi0weDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgMHhjMDA0ZDc4LAotMHgyNDA0MDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwgMHgxMDQwMDAwMiwKLTB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwKLTB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIDB4YzAwNGQ3OCwKLTB4MjAyMSwgMHgxMDgwNDIsIDB4MTYwMGZmZmMsIDB4MCwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsCi0weDM0MTA4MDAwLCAweDk2MjIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwKLTB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwKLTB4MTYwMGZmZjgsIDB4MCwgMHhjMDA0ZGI5LCAweDAsCi0weDEwMDAwMzBlLCAweDI0MDIwMDAyLCAweDI3YjEwMDEwLCAweGE3YTAwMDEwLAotMHg4MDIxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsCi0weDJlMDIwMDIwLCAweDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ3OCwKLTB4MjAyMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsCi0weDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgMHgyNDEwMDAxMCwKLTB4MzIwMjAwMDEsIDB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsCi0weDI0MTAwMDEwLCAweGMwMDRkNzgsIDB4MjAyMSwgMHgxMDgwNDIsCi0weDE2MDBmZmZjLCAweDAsIDB4YzAwNGRiOSwgMHgzNDEwODAwMCwKLTB4YzAwNGRiOSwgMHgwLCAweGMwMDRkNTgsIDB4MCwKLTB4NTA0MDAwMDUsIDB4MTA4MDQyLCAweDk2MjIwMDAwLCAweDUwMTAyNSwKLTB4YTYyMjAwMDAsIDB4MTA4MDQyLCAweDE2MDBmZmY3LCAweDAsCi0weGMwMDRkYjksIDB4MCwgMHg5N2EyMDAxMCwgMHgzMDQyODAwMCwKLTB4MTQ0MDAyZGMsIDB4MjQwMjAwMDMsIDB4MTAwMDAyZDgsIDB4MCwKLTB4MjQwMjEyMDAsIDB4YTdhMjAwMTAsIDB4MjdiMTAwMTAsIDB4ODAyMSwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwKLTB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDc4LCAweDIwMjEsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLAotMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsCi0weDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwKLTB4YzAwNGQ3OCwgMHgyMDIxLCAweDEwODA0MiwgMHgxNjAwZmZmYywKLTB4MCwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsCi0weDIwMjEsIDB4MzQxMDgwMDAsIDB4OTYyMjAwMDAsIDB4NTAxMDI0LAotMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsCi0weDEwODA0MiwgMHgxNjAwZmZmOCwgMHgwLCAweGMwMDRkYjksCi0weDAsIDB4OGY4MzAwNTQsIDB4MTAwMDAyOTYsIDB4MjQwMjAwMDQsCi0weDhmODMwMDU0LCAweDNjMDIwMDAxLCAweDhjNDI2ZjNjLCAweDI0NjNmZjljLAotMHg0MzEwMjMsIDB4MmM0MjAwNjQsIDB4MTQ0MDAyOWUsIDB4MjQwMjAwMDIsCi0weDNjMDMwMDAxLCAweDhjNjM2ZjQwLCAweDEwNjIwMjk3LCAweDJjNjIwMDAzLAotMHgxNDQwMDI5NiwgMHgyNDAyMDAxMSwgMHgyNDAyMDAwMywgMHgxMDYyMDAwNSwKLTB4MjQwMjAwMDQsIDB4MTA2MjAyOTEsIDB4MjQwMjAwMGYsIDB4MTAwMDAyOGYsCi0weDI0MDIwMDExLCAweDEwMDAwMjhkLCAweDI0MDIwMDA1LCAweDI0MDIwMDE0LAotMHhhN2EyMDAxMCwgMHgyN2IxMDAxMCwgMHg4MDIxLCAweGMwMDRkNzgsCi0weDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAweDE0NDBmZmZiLAotMHgwLCAweGMwMDRkNzgsIDB4MjAyMSwgMHhjMDA0ZDc4LAotMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4YzAwNGQ3OCwKLTB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIDB4MTA0MDAwMDIsCi0weDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsCi0weDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDEyLAotMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsCi0weDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAxMiwgMHhjMDA0ZDc4LAotMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4MzQxMDgwMDAsCi0weDk2MjIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwgMHgyMDIxLAotMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmOCwKLTB4MCwgMHhjMDA0ZGI5LCAweDAsIDB4OGY4MzAwNTQsCi0weDEwMDAwMjQ4LCAweDI0MDIwMDA2LCAweDhmODMwMDU0LCAweDNjMDIwMDAxLAotMHg4YzQyNmYzYywgMHgyNDYzZmY5YywgMHg0MzEwMjMsIDB4MmM0MjAwNjQsCi0weDE0NDAwMjUwLCAweDI0MDIwMDA3LCAweDEwMDAwMjRjLCAweDAsCi0weDI0MDIwMDA2LCAweGE3YTIwMDEwLCAweDI3YjEwMDEwLCAweDgwMjEsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsCi0weDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ3OCwgMHgyMDIxLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwKLTB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LAotMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsCi0weDMyMDIwMDEzLCAweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsCi0weGMwMDRkNzgsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDEzLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwKLTB4MzQxMDgwMDAsIDB4OTYyMjAwMDAsIDB4NTAxMDI0LCAweDEwNDAwMDAyLAotMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLAotMHgxNjAwZmZmOCwgMHgwLCAweGMwMDRkYjksIDB4MCwKLTB4OGY4MzAwNTQsIDB4MTAwMDAyMDcsIDB4MjQwMjAwMDgsIDB4OGY4MzAwNTQsCi0weDNjMDIwMDAxLCAweDhjNDI2ZjNjLCAweDI0NjNmZjljLCAweDQzMTAyMywKLTB4MmM0MjAwNjQsIDB4MTQ0MDAyMGYsIDB4MjQwMjAwMDksIDB4MTAwMDAyMGIsCi0weDAsIDB4MjdiMTAwMTAsIDB4YTdhMDAwMTAsIDB4ODAyMSwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwKLTB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDc4LCAweDIwMjEsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ3OCwgMHgyMDIxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLAotMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsCi0weDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwKLTB4MzIwMjAwMTgsIDB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTgsCi0weGMwMDRkYjksIDB4MzQxMDgwMDAsIDB4YzAwNGRiOSwgMHgwLAotMHhjMDA0ZDU4LCAweDAsIDB4NTA0MDAwMDUsIDB4MTA4MDQyLAotMHg5NjIyMDAwMCwgMHg1MDEwMjUsIDB4YTYyMjAwMDAsIDB4MTA4MDQyLAotMHgxNjAwZmZmNywgMHgwLCAweGMwMDRkYjksIDB4ODAyMSwKLTB4OTdhMjAwMTAsIDB4MjdiMTAwMTAsIDB4MzQ0MjAwMDEsIDB4YTdhMjAwMTAsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsCi0weDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ3OCwgMHgyMDIxLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwKLTB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LAotMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsCi0weDMyMDIwMDE4LCAweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsCi0weGMwMDRkNzgsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDE4LAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwKLTB4MzQxMDgwMDAsIDB4OTYyMjAwMDAsIDB4NTAxMDI0LCAweDEwNDAwMDAyLAotMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLAotMHgxNjAwZmZmOCwgMHgwLCAweGMwMDRkYjksIDB4MCwKLTB4OGY4MzAwNTQsIDB4MTAwMDAxOTMsIDB4MjQwMjAwMGEsIDB4OGY4MzAwNTQsCi0weDNjMDIwMDAxLCAweDhjNDI2ZjNjLCAweDI0NjNmZjljLCAweDQzMTAyMywKLTB4MmM0MjAwNjQsIDB4MTQ0MDAxOWIsIDB4MjQwMjAwMGIsIDB4MTAwMDAxOTcsCi0weDAsIDB4MjdiMTAwMTAsIDB4YTdhMDAwMTAsIDB4ODAyMSwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwKLTB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDc4LCAweDIwMjEsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ3OCwgMHgyMDIxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLAotMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsCi0weDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwKLTB4MzIwMjAwMTcsIDB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTcsCi0weGMwMDRkYjksIDB4MzQxMDgwMDAsIDB4YzAwNGRiOSwgMHgwLAotMHhjMDA0ZDU4LCAweDAsIDB4NTA0MDAwMDUsIDB4MTA4MDQyLAotMHg5NjIyMDAwMCwgMHg1MDEwMjUsIDB4YTYyMjAwMDAsIDB4MTA4MDQyLAotMHgxNjAwZmZmNywgMHgwLCAweGMwMDRkYjksIDB4ODAyMSwKLTB4OTdhMjAwMTAsIDB4MjdiMTAwMTAsIDB4MzQ0MjA3MDAsIDB4YTdhMjAwMTAsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsCi0weDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ3OCwgMHgyMDIxLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwKLTB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LAotMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsCi0weDMyMDIwMDE3LCAweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsCi0weGMwMDRkNzgsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDE3LAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwKLTB4MzQxMDgwMDAsIDB4OTYyMjAwMDAsIDB4NTAxMDI0LCAweDEwNDAwMDAyLAotMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLAotMHgxNjAwZmZmOCwgMHgwLCAweGMwMDRkYjksIDB4MCwKLTB4OGY4MzAwNTQsIDB4MTAwMDAxMWYsIDB4MjQwMjAwMGMsIDB4OGY4MzAwNTQsCi0weDNjMDIwMDAxLCAweDhjNDI2ZjNjLCAweDI0NjNmZjljLCAweDQzMTAyMywKLTB4MmM0MjAwNjQsIDB4MTQ0MDAxMjcsIDB4MjQwMjAwMTIsIDB4MTAwMDAxMjMsCi0weDAsIDB4MjdiMTAwMTAsIDB4YTdhMDAwMTAsIDB4ODAyMSwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwKLTB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDc4LCAweDIwMjEsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ3OCwgMHgyMDIxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLAotMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsCi0weDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwKLTB4MzIwMjAwMTQsIDB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTQsCi0weGMwMDRkYjksIDB4MzQxMDgwMDAsIDB4YzAwNGRiOSwgMHgwLAotMHhjMDA0ZDU4LCAweDAsIDB4NTA0MDAwMDUsIDB4MTA4MDQyLAotMHg5NjIyMDAwMCwgMHg1MDEwMjUsIDB4YTYyMjAwMDAsIDB4MTA4MDQyLAotMHgxNjAwZmZmNywgMHgwLCAweGMwMDRkYjksIDB4ODAyMSwKLTB4OTdhMjAwMTAsIDB4MjdiMTAwMTAsIDB4MzQ0MjAwMTAsIDB4YTdhMjAwMTAsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsCi0weDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ3OCwgMHgyMDIxLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwKLTB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LAotMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsCi0weDMyMDIwMDE0LCAweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsCi0weGMwMDRkNzgsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDE0LAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwKLTB4MzQxMDgwMDAsIDB4OTYyMjAwMDAsIDB4NTAxMDI0LCAweDEwNDAwMDAyLAotMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLAotMHgxNjAwZmZmOCwgMHgwLCAweGMwMDRkYjksIDB4MCwKLTB4OGY4MzAwNTQsIDB4MTAwMDAwYWIsIDB4MjQwMjAwMTMsIDB4OGY4MzAwNTQsCi0weDNjMDIwMDAxLCAweDhjNDI2ZjNjLCAweDI0NjNmZjljLCAweDQzMTAyMywKLTB4MmM0MjAwNjQsIDB4MTQ0MDAwYjMsIDB4MjQwMjAwMGQsIDB4MTAwMDAwYWYsCi0weDAsIDB4MjdiMTAwMTAsIDB4YTdhMDAwMTAsIDB4ODAyMSwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwKLTB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDc4LCAweDIwMjEsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ3OCwgMHgyMDIxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLAotMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsCi0weDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwKLTB4MzIwMjAwMTgsIDB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTgsCi0weGMwMDRkYjksIDB4MzQxMDgwMDAsIDB4YzAwNGRiOSwgMHgwLAotMHhjMDA0ZDU4LCAweDAsIDB4NTA0MDAwMDUsIDB4MTA4MDQyLAotMHg5NjIyMDAwMCwgMHg1MDEwMjUsIDB4YTYyMjAwMDAsIDB4MTA4MDQyLAotMHgxNjAwZmZmNywgMHgwLCAweGMwMDRkYjksIDB4ODAyMSwKLTB4OTdhMjAwMTAsIDB4MjdiMTAwMTAsIDB4MzA0MmZmZmUsIDB4YTdhMjAwMTAsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsCi0weDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ3OCwgMHgyMDIxLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwKLTB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LAotMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsCi0weDMyMDIwMDE4LCAweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsCi0weGMwMDRkNzgsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDE4LAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwKLTB4MzQxMDgwMDAsIDB4OTYyMjAwMDAsIDB4NTAxMDI0LCAweDEwNDAwMDAyLAotMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLAotMHgxNjAwZmZmOCwgMHgwLCAweGMwMDRkYjksIDB4MCwKLTB4OGY4MzAwNTQsIDB4MTAwMDAwMzcsIDB4MjQwMjAwMGUsIDB4MjQwMjA4NDAsCi0weGE3YTIwMDEwLCAweDI3YjEwMDEwLCAweDgwMjEsIDB4YzAwNGQ3OCwKLTB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsCi0weDAsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweGMwMDRkNzgsCi0weDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgMHhjMDA0ZDc4LAotMHgyNDA0MDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwgMHgxMDQwMDAwMiwKLTB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwKLTB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMTMsCi0weDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwKLTB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDEzLCAweGMwMDRkNzgsCi0weDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgMHgzNDEwODAwMCwKLTB4OTYyMjAwMDAsIDB4NTAxMDI0LCAweDEwNDAwMDAyLCAweDIwMjEsCi0weDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLCAweDE2MDBmZmY4LAotMHgwLCAweGMwMDRkYjksIDB4MCwgMHg4ZjgzMDA1NCwKLTB4MjQwMjAwMTAsIDB4M2MwMTAwMDEsIDB4YWMyMjZkZDAsIDB4M2MwMTAwMDEsCi0weDEwMDAwMDBjLCAweGFjMjM2ZjNjLCAweDhmODMwMDU0LCAweDNjMDIwMDAxLAotMHg4YzQyNmYzYywgMHgyNDYzZmY5YywgMHg0MzEwMjMsIDB4MmM0MjAwNjQsCi0weDE0NDAwMDA0LCAweDAsIDB4MjQwMjAwMTEsIDB4M2MwMTAwMDEsCi0weGFjMjI2ZGQwLCAweDhmYmYwMDIwLCAweDhmYjEwMDFjLCAweDhmYjAwMDE4LAotMHgzZTAwMDA4LCAweDI3YmQwMDI4LCAweDNjMDMwMDAxLCAweDhjNjM2ZDk4LAotMHgyN2JkZmZjOCwgMHgyNDAyMDAwMiwgMHhhZmJmMDAzNCwgMHhhZmIyMDAzMCwKLTB4YWZiMTAwMmMsIDB4MTQ2MjAwMDQsIDB4YWZiMDAwMjgsIDB4M2MxMjAwMDIsCi0weDEwMDAwMDAzLCAweDhlNTI4ZmY4LCAweDNjMTIwMDAyLCAweDhlNTI4ZmZjLAotMHgzYzAzMDAwMSwgMHg4YzYzNmRkNCwgMHgzYzAyMDAwMSwgMHg4YzQyNmUxYywKLTB4NTA2MjAwMDQsIDB4MjQ2M2ZmZmYsIDB4M2MwMTAwMDEsIDB4YWMyMzZlMWMsCi0weDI0NjNmZmZmLCAweDJjNjIwMDA2LCAweDEwNDAwMzc3LCAweDMxMDgwLAotMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4OGMyMjZiZDgsIDB4NDAwMDA4LAotMHgwLCAweDIwMjEsIDB4MjgyMSwgMHhjMDA0ZGRiLAotMHgzNDA2ODAwMCwgMHgyNDA0MDAxMCwgMHgyNDA1MDAwMiwgMHgyNDA2MDAwMiwKLTB4MjQwMjAwMDIsIDB4YzAwNGRkYiwgMHhhN2EyMDAxOCwgMHgyNDAyMDAwMiwKLTB4M2MwMTAwMDEsIDB4MTAwMDAzNjQsIDB4YWMyMjZkZDQsIDB4MjdiMTAwMTgsCi0weGE3YTAwMDE4LCAweDgwMjEsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwKLTB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsIDB4MCwKLTB4YzAwNGQ3OCwgMHgyMDIxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLAotMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwgMHgxMDQwMDAwMiwgMHgyMDIxLAotMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwKLTB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIDB4YzAwNGQ3OCwgMHgyMDIxLAotMHgxMDgwNDIsIDB4MTYwMGZmZmMsIDB4MCwgMHhjMDA0ZGI5LAotMHgzNDEwODAwMCwgMHhjMDA0ZGI5LCAweDAsIDB4YzAwNGQ1OCwKLTB4MCwgMHg1MDQwMDAwNSwgMHgxMDgwNDIsIDB4OTYyMjAwMDAsCi0weDUwMTAyNSwgMHhhNjIyMDAwMCwgMHgxMDgwNDIsIDB4MTYwMGZmZjcsCi0weDAsIDB4YzAwNGRiOSwgMHgwLCAweDk3YTIwMDE4LAotMHgzMDQyODAwMCwgMHgxNDQwMDAwNCwgMHgyNDAyMDAwMywgMHgzYzAxMDAwMSwKLTB4YWMyMjZkZDQsIDB4MjQwMjAwMDMsIDB4M2MwMTAwMDEsIDB4MTAwMDAzMmEsCi0weGFjMjI2ZGQ0LCAweDI0MDQwMDEwLCAweDI0MDUwMDAyLCAweDI0MDYwMDAyLAotMHgyNDAyMDAwMiwgMHhjMDA0ZGRiLCAweGE3YTIwMDE4LCAweDNjMDMwMDAxLAotMHg4YzYzNmUyMCwgMHgyNDAyMDAwMSwgMHgxNDYyMDFlMSwgMHg4MDIxLAotMHgyN2IxMDAxOCwgMHhhN2EwMDAxOCwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLAotMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwgMHgwLAotMHhjMDA0ZDc4LCAweDIwMjEsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsCi0weDI0MTAwMDEwLCAweDMyMDIwMDAxLCAweDEwNDAwMDAyLCAweDIwMjEsCi0weDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLCAweDE2MDBmZmZhLAotMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAxOCwgMHgxMDQwMDAwMiwKLTB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwKLTB4MTYwMGZmZmEsIDB4MzIwMjAwMTgsIDB4YzAwNGRiOSwgMHgzNDEwODAwMCwKLTB4YzAwNGRiOSwgMHgwLCAweGMwMDRkNTgsIDB4MCwKLTB4NTA0MDAwMDUsIDB4MTA4MDQyLCAweDk2MjIwMDAwLCAweDUwMTAyNSwKLTB4YTYyMjAwMDAsIDB4MTA4MDQyLCAweDE2MDBmZmY3LCAweDAsCi0weGMwMDRkYjksIDB4ODAyMSwgMHgyN2IxMDAxOCwgMHhhN2EwMDAxOCwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwKLTB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDc4LCAweDIwMjEsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ3OCwgMHgyMDIxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLAotMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsCi0weDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwKLTB4MzIwMjAwMTgsIDB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTgsCi0weGMwMDRkYjksIDB4MzQxMDgwMDAsIDB4YzAwNGRiOSwgMHgwLAotMHhjMDA0ZDU4LCAweDAsIDB4NTA0MDAwMDUsIDB4MTA4MDQyLAotMHg5NjIyMDAwMCwgMHg1MDEwMjUsIDB4YTYyMjAwMDAsIDB4MTA4MDQyLAotMHgxNjAwZmZmNywgMHgwLCAweGMwMDRkYjksIDB4ODAyMSwKLTB4MjQwNDAwMTgsIDB4MjgyMSwgMHhjMDA0ZGRiLCAweDI0MDYwNDA0LAotMHhhN2EwMDAxYSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLAotMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNzgsCi0weDIwMjEsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LAotMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4MjQxMDAwMTAsCi0weDMyMDIwMDAxLCAweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsCi0weGMwMDRkNzgsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDAxLAotMHgyNDEwMDAxMCwgMHgzMjAyMDAxOCwgMHgxMDQwMDAwMiwgMHgyMDIxLAotMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwKLTB4MzIwMjAwMTgsIDB4YzAwNGRiOSwgMHgzNDEwODAwMCwgMHhjMDA0ZGI5LAotMHgwLCAweGMwMDRkNTgsIDB4MCwgMHg1MDQwMDAwNSwKLTB4MTA4MDQyLCAweDk3YTIwMDFhLCAweDUwMTAyNSwgMHhhN2EyMDAxYSwKLTB4MTA4MDQyLCAweDE2MDBmZmY3LCAweDAsIDB4YzAwNGRiOSwKLTB4ODAyMSwgMHhhN2EwMDAxYSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLAotMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwgMHgwLAotMHhjMDA0ZDc4LCAweDIwMjEsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsCi0weDI0MTAwMDEwLCAweDMyMDIwMDAxLCAweDEwNDAwMDAyLCAweDIwMjEsCi0weDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLCAweDE2MDBmZmZhLAotMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAxOCwgMHgxMDQwMDAwMiwKLTB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwKLTB4MTYwMGZmZmEsIDB4MzIwMjAwMTgsIDB4YzAwNGRiOSwgMHgzNDEwODAwMCwKLTB4YzAwNGRiOSwgMHgwLCAweGMwMDRkNTgsIDB4MCwKLTB4NTA0MDAwMDUsIDB4MTA4MDQyLCAweDk3YTIwMDFhLCAweDUwMTAyNSwKLTB4YTdhMjAwMWEsIDB4MTA4MDQyLCAweDE2MDBmZmY3LCAweDAsCi0weGMwMDRkYjksIDB4ODAyMSwgMHhhN2EwMDAxYywgMHhjMDA0ZDc4LAotMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwKLTB4MCwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4YzAwNGQ3OCwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LAotMHgyMDIxLCAweDI0MTAwMDEwLCAweGMwMDRkNzgsIDB4MjAyMSwKLTB4MTA4MDQyLCAweDE2MDBmZmZjLCAweDAsIDB4MjQxMDAwMTAsCi0weDMyMDIwMDFlLCAweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsCi0weGMwMDRkNzgsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDFlLAotMHhjMDA0ZGI5LCAweDM0MTA4MDAwLCAweGMwMDRkYjksIDB4MCwKLTB4YzAwNGQ1OCwgMHgwLCAweDUwNDAwMDA1LCAweDEwODA0MiwKLTB4OTdhMjAwMWMsIDB4NTAxMDI1LCAweGE3YTIwMDFjLCAweDEwODA0MiwKLTB4MTYwMGZmZjcsIDB4MCwgMHhjMDA0ZGI5LCAweDgwMjEsCi0weGE3YTAwMDFjLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsCi0weDJlMDIwMDIwLCAweDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ3OCwKLTB4MjAyMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsCi0weDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgMHgyNDEwMDAxMCwKLTB4YzAwNGQ3OCwgMHgyMDIxLCAweDEwODA0MiwgMHgxNjAwZmZmYywKLTB4MCwgMHgyNDEwMDAxMCwgMHgzMjAyMDAxZSwgMHgxMDQwMDAwMiwKLTB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwKLTB4MTYwMGZmZmEsIDB4MzIwMjAwMWUsIDB4YzAwNGRiOSwgMHgzNDEwODAwMCwKLTB4YzAwNGRiOSwgMHgwLCAweGMwMDRkNTgsIDB4MCwKLTB4NTA0MDAwMDUsIDB4MTA4MDQyLCAweDk3YTIwMDFjLCAweDUwMTAyNSwKLTB4YTdhMjAwMWMsIDB4MTA4MDQyLCAweDE2MDBmZmY3LCAweDAsCi0weGMwMDRkYjksIDB4ODAyMSwgMHgyNDAyMDAwMiwgMHhhN2EyMDAxZSwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwKLTB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDc4LCAweDIwMjEsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI0MTAwMDEwLCAweGMwMDRkNzgsCi0weDIwMjEsIDB4MTA4MDQyLCAweDE2MDBmZmZjLCAweDAsCi0weDI0MTAwMDEwLCAweDMyMDIwMDFlLCAweDEwNDAwMDAyLCAweDIwMjEsCi0weDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLCAweDE2MDBmZmZhLAotMHgzMjAyMDAxZSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsCi0weDIwMjEsIDB4MzQxMDgwMDAsIDB4OTdhMjAwMWUsIDB4NTAxMDI0LAotMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsCi0weDEwODA0MiwgMHgxNjAwZmZmOCwgMHgwLCAweGMwMDRkYjksCi0weDgwMjEsIDB4YTdhMDAwMjAsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwKLTB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsIDB4MCwKLTB4YzAwNGQ3OCwgMHgyMDIxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLAotMHgyNDEwMDAxMCwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4MTA4MDQyLAotMHgxNjAwZmZmYywgMHgwLCAweDI0MTAwMDEwLCAweDMyMDIwMDFlLAotMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsCi0weDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAxZSwgMHhjMDA0ZGI5LAotMHgzNDEwODAwMCwgMHhjMDA0ZGI5LCAweDAsIDB4YzAwNGQ1OCwKLTB4MCwgMHg1MDQwMDAwNSwgMHgxMDgwNDIsIDB4OTdhMjAwMjAsCi0weDUwMTAyNSwgMHhhN2EyMDAyMCwgMHgxMDgwNDIsIDB4MTYwMGZmZjcsCi0weDAsIDB4YzAwNGRiOSwgMHg4MDIxLCAweGE3YTAwMDIwLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLAotMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNzgsIDB4MjAyMSwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLAotMHhjMDA0ZDc4LCAweDIwMjEsIDB4MjQxMDAwMTAsIDB4YzAwNGQ3OCwKLTB4MjAyMSwgMHgxMDgwNDIsIDB4MTYwMGZmZmMsIDB4MCwKLTB4MjQxMDAwMTAsIDB4MzIwMjAwMWUsIDB4MTA0MDAwMDIsIDB4MjAyMSwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsCi0weDMyMDIwMDFlLCAweGMwMDRkYjksIDB4MzQxMDgwMDAsIDB4YzAwNGRiOSwKLTB4MCwgMHhjMDA0ZDU4LCAweDAsIDB4NTA0MDAwMDUsCi0weDEwODA0MiwgMHg5N2EyMDAyMCwgMHg1MDEwMjUsIDB4YTdhMjAwMjAsCi0weDEwODA0MiwgMHgxNjAwZmZmNywgMHgwLCAweGMwMDRkYjksCi0weDgwMjEsIDB4YTdhMDAwMjIsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwKLTB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsIDB4MCwKLTB4YzAwNGQ3OCwgMHgyMDIxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsCi0weGMwMDRkNzgsIDB4MjAyMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLAotMHgyNDEwMDAxMCwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4MTA4MDQyLAotMHgxNjAwZmZmYywgMHgwLCAweDI0MTAwMDEwLCAweGMwMDRkNzgsCi0weDIwMjEsIDB4MTA4MDQyLCAweDE2MDBmZmZjLCAweDAsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLAotMHgzNDEwODAwMCwgMHg5N2EyMDAyMiwgMHg1MDEwMjQsIDB4MTA0MDAwMDIsCi0weDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsCi0weDE2MDBmZmY4LCAweDAsIDB4YzAwNGRiOSwgMHgwLAotMHgyNDA0MDAxOCwgMHgyNDA1MDAwMiwgMHhjMDA0ZGRiLCAweDI0MDYwMDA0LAotMHgzYzEwMDAwMSwgMHg4ZTEwNmUyNCwgMHgyNDAyMDAwMSwgMHgxNjAyMDExZCwKLTB4MCwgMHgzYzAyMDAwMSwgMHg5NDQyNmYyNiwgMHgzYzAxMDAwMSwKLTB4YWMyMDZlMjQsIDB4MjQ0MjlmYmMsIDB4MmM0MjAwMDQsIDB4MTA0MDAwMGMsCi0weDI0MDQwMDA5LCAweDI0MDUwMDAxLCAweGMwMDRkZGIsIDB4MjQwNjA0MDAsCi0weDI0MDQwMDE4LCAweDI0MDUwMDAxLCAweGMwMDRkZGIsIDB4MjQwNjAwMjAsCi0weDI0MDQwMDE4LCAweDI0MDUwMDAxLCAweGMwMDRkZGIsIDB4MjQwNjIwMDAsCi0weDNjMDI0MDAwLCAweDI0MjEwMjQsIDB4MTA0MDAxMjMsIDB4M2MwMjIwMDAsCi0weDI0MjEwMjQsIDB4MTA0MDAwMDQsIDB4MCwgMHgzYzAxMDAwMSwKLTB4MTAwMDAwMDMsIDB4YWMzMDZmMWMsIDB4M2MwMTAwMDEsIDB4YWMyMDZmMWMsCi0weDNjMDMwMDAxLCAweDhjNjM2ZjM0LCAweDI0MDIwMDA1LCAweDE0NjIwMGY5LAotMHgwLCAweDNjMDIwMDAxLCAweDhjNDI2ZjFjLCAweDEwNDAwMDY3LAotMHgzYzAyMDAwNCwgMHgyNDIxMDI0LCAweDEwNDAwMDExLCAweGE3YTAwMDE4LAotMHgzYzAyMDAwOCwgMHgyNDIxMDI0LCAweDEwNDAwMDAyLCAweDI0MDIwMjAwLAotMHhhN2EyMDAxOCwgMHgzYzAyMDAxMCwgMHgyNDIxMDI0LCAweDEwNDAwMDA0LAotMHgwLCAweDk3YTIwMDE4LCAweDM0NDIwMTAwLCAweGE3YTIwMDE4LAotMHg5N2E2MDAxOCwgMHgyNDA0MDAwOSwgMHgxMDAwMDAwNCwgMHgyODIxLAotMHgyNDA0MDAwOSwgMHgyODIxLCAweDMwMjEsIDB4YzAwNGRkYiwKLTB4MCwgMHgyNDAyMDAwMSwgMHhhN2EyMDAxYSwgMHgzYzAyMDAwOCwKLTB4MjQyMTAyNCwgMHgxMDQwMDAwYywgMHgzYzAyMDAwMiwgMHgyNDIxMDI0LAotMHgxMDQwMDAwMiwgMHgyNDAyMDEwMSwgMHhhN2EyMDAxYSwgMHgzYzAyMDAwMSwKLTB4MjQyMTAyNCwgMHgxMDQwMDAwNSwgMHgzYzAyMDAxMCwgMHg5N2EyMDAxYSwKLTB4MzQ0MjAwNDAsIDB4YTdhMjAwMWEsIDB4M2MwMjAwMTAsIDB4MjQyMTAyNCwKLTB4MTA0MDAwMGUsIDB4M2MwMjAwMDIsIDB4MjQyMTAyNCwgMHgxMDQwMDAwNSwKLTB4M2MwMjAwMDEsIDB4OTdhMjAwMWEsIDB4MzQ0MjAwODAsIDB4YTdhMjAwMWEsCi0weDNjMDIwMDAxLCAweDI0MjEwMjQsIDB4MTA0MDAwMDUsIDB4M2MwMzAwYTAsCi0weDk3YTIwMDFhLCAweDM0NDIwMDIwLCAweGE3YTIwMDFhLCAweDNjMDMwMGEwLAotMHgyNDMxMDI0LCAweDU0NDMwMDA0LCAweDNjMDIwMDIwLCAweDk3YTIwMDFhLAotMHgxMDAwMDAwYywgMHgzNDQyMDQwMCwgMHgyNDIxMDI0LCAweDUwNDAwMDA0LAotMHgzYzAyMDA4MCwgMHg5N2EyMDAxYSwgMHgxMDAwMDAwNiwgMHgzNDQyMDgwMCwKLTB4MjQyMTAyNCwgMHgxMDQwMDAwNCwgMHgwLCAweDk3YTIwMDFhLAotMHgzNDQyMGMwMCwgMHhhN2EyMDAxYSwgMHg5N2E2MDAxYSwgMHgyNDA0MDAwNCwKLTB4YzAwNGRkYiwgMHgyODIxLCAweDNjMDIwMDA0LCAweDI0MjEwMjQsCi0weDEwNDAwMDA0LCAweGE3YTAwMDFjLCAweDMyNDI1MDAwLCAweDE0NDAwMDA0LAotMHgwLCAweDMyNDI0MDAwLCAweDEwNDAwMDA1LCAweDIwMjEsCi0weGMwMDRjZjksIDB4MjQwMjAyMSwgMHgxMDAwMDA5NiwgMHgwLAotMHg5N2E2MDAxYywgMHgyODIxLCAweDM0YzYxMjAwLCAweGMwMDRkZGIsCi0weGE3YTYwMDFjLCAweDEwMDAwMDhmLCAweDAsIDB4MjQyMTAyNCwKLTB4MTA0MDAwMDQsIDB4YTdhMDAwMTgsIDB4MzI0MjUwMDAsIDB4MTQ0MDAwMDQsCi0weDAsIDB4MzI0MjQwMDAsIDB4MTA0MDAwMDUsIDB4M2MwMjAwMTAsCi0weGMwMDRjZjksIDB4MjQwMjAyMSwgMHgxMDAwMDAxOSwgMHhhN2EwMDAxYSwKLTB4MjQyMTAyNCwgMHgxMDQwMDAwNCwgMHgwLCAweDk3YTIwMDE4LAotMHgxMDAwMDAwNCwgMHhhN2EyMDAxOCwgMHg5N2EyMDAxOCwgMHgzNDQyMDEwMCwKLTB4YTdhMjAwMTgsIDB4M2MwMjAwMDEsIDB4MjQyMTAyNCwgMHgxMDQwMDAwNCwKLTB4MCwgMHg5N2EyMDAxOCwgMHgxMDAwMDAwNCwgMHhhN2EyMDAxOCwKLTB4OTdhMjAwMTgsIDB4MzQ0MjIwMDAsIDB4YTdhMjAwMTgsIDB4OTdhNjAwMTgsCi0weDIwMjEsIDB4YzAwNGRkYiwgMHgyODIxLCAweGE3YTAwMDFhLAotMHg4MDIxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsCi0weDJlMDIwMDIwLCAweDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ3OCwKLTB4MjAyMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsCi0weDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgMHgyNDEwMDAxMCwKLTB4MzIwMjAwMDEsIDB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsCi0weDI0MTAwMDEwLCAweGMwMDRkNzgsIDB4MjAyMSwgMHgxMDgwNDIsCi0weDE2MDBmZmZjLCAweDAsIDB4YzAwNGRiOSwgMHgzNDEwODAwMCwKLTB4YzAwNGRiOSwgMHgwLCAweGMwMDRkNTgsIDB4MCwKLTB4NTA0MDAwMDUsIDB4MTA4MDQyLCAweDk3YTIwMDFhLCAweDUwMTAyNSwKLTB4YTdhMjAwMWEsIDB4MTA4MDQyLCAweDE2MDBmZmY3LCAweDAsCi0weGMwMDRkYjksIDB4ODAyMSwgMHhhN2EwMDAxYSwgMHhjMDA0ZDc4LAotMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwKLTB4MCwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4YzAwNGQ3OCwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LAotMHgyMDIxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLCAweDEwNDAwMDAyLAotMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLAotMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwgMHhjMDA0ZDc4LAotMHgyMDIxLCAweDEwODA0MiwgMHgxNjAwZmZmYywgMHgwLAotMHhjMDA0ZGI5LCAweDM0MTA4MDAwLCAweGMwMDRkYjksIDB4MCwKLTB4YzAwNGQ1OCwgMHgwLCAweDUwNDAwMDA1LCAweDEwODA0MiwKLTB4OTdhMjAwMWEsIDB4NTAxMDI1LCAweGE3YTIwMDFhLCAweDEwODA0MiwKLTB4MTYwMGZmZjcsIDB4MCwgMHhjMDA0ZGI5LCAweDAsCi0weDNjMDQwMDAxLCAweDI0ODQ2YmNjLCAweDk3YTYwMDE4LCAweDk3YTcwMDFhLAotMHgzYzAyMDAwMSwgMHg4YzQyNmQ5OCwgMHgzYzAzMDAwMSwgMHg4YzYzNmYxYywKLTB4M2MwNTAwMGQsIDB4MzRhNTAyMDUsIDB4YWZhMjAwMTAsIDB4YzAwMmIzYiwKLTB4YWZhMzAwMTQsIDB4OGY4MzAwNTQsIDB4MjQwMjAwMDQsIDB4M2MwMTAwMDEsCi0weGFjMjI2ZGQ0LCAweDNjMDEwMDAxLCAweDEwMDAwMDE3LCAweGFjMjM2ZjM4LAotMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMSwgMHg4YzQyNmYzOCwgMHgyNDYzZmY5YywKLTB4NDMxMDIzLCAweDJjNDIwMDY0LCAweDE0NDAwMDBmLCAweDAsCi0weDhmODIwMjIwLCAweDI0MDMwMDA1LCAweDNjMDEwMDAxLCAweGFjMjM2ZGQ0LAotMHgzYzAzZjcwMCwgMHg0MzEwMjUsIDB4MTAwMDAwMDcsIDB4YWY4MjAyMjAsCi0weDI0MDIwMDA2LCAweDNjMDEwMDAxLCAweGFjMjI2ZGQ0LCAweDI0MDIwMDExLAotMHgzYzAxMDAwMSwgMHhhYzIyNmRkMCwgMHg4ZmJmMDAzNCwgMHg4ZmIyMDAzMCwKLTB4OGZiMTAwMmMsIDB4OGZiMDAwMjgsIDB4M2UwMDAwOCwgMHgyN2JkMDAzOCwKLTB4MjdiZGZmZDgsIDB4YWZiMDAwMTgsIDB4ODA4MDIxLCAweGFmYjEwMDFjLAotMHg4ODIxLCAweDMyMDI0MDAwLCAweDEwNDAwMDEzLCAweGFmYmYwMDIwLAotMHgzYzAyMDAxMCwgMHgyMDIxMDI0LCAweDJjNDIwMDAxLCAweDIxMDIzLAotMHgzMDQzNDEwMCwgMHgzYzAyMDAwMSwgMHgyMDIxMDI0LCAweDE0NDAwMDA2LAotMHgzNDcxNDAwMCwgMHgzYzAyMDAwMiwgMHgyMDIxMDI0LCAweDE0NDAwMDAyLAotMHgzNDcxNjAwMCwgMHgzNDcxNDA0MCwgMHgyMDIxLCAweDI4MjEsCi0weDEwMDAwMDM2LCAweDIyMDMwMjEsIDB4MzIwMjEwMDAsIDB4MTA0MDAwMzUsCi0weDIwMjEsIDB4MjgyMSwgMHhjMDA0ZGRiLCAweDI0MDYwMDQwLAotMHgyNDA0MDAxOCwgMHgyODIxLCAweGMwMDRkZGIsIDB4MjQwNjBjMDAsCi0weDI0MDQwMDE3LCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2MDQwMCwKLTB4MjQwNDAwMTYsIDB4MjgyMSwgMHhjMDA0ZGRiLCAweDI0MDYwMDA2LAotMHgyNDA0MDAxNywgMHgyODIxLCAweGMwMDRkZGIsIDB4MjQwNjI1MDAsCi0weDI0MDQwMDE2LCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2MDAwNiwKLTB4MjQwNDAwMTcsIDB4MjgyMSwgMHhjMDA0ZGRiLCAweDI0MDY0NjAwLAotMHgyNDA0MDAxNiwgMHgyODIxLCAweGMwMDRkZGIsIDB4MjQwNjAwMDYsCi0weDI0MDQwMDE3LCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2NjcwMCwKLTB4MjQwNDAwMTYsIDB4MjgyMSwgMHhjMDA0ZGRiLCAweDI0MDYwMDA2LAotMHgyNDA0MDAxZiwgMHgyODIxLCAweGMwMDRkZGIsIDB4MjQwNjAwMTAsCi0weDI0MDQwMDA5LCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2MTUwMCwKLTB4MjQwNDAwMDksIDB4MjgyMSwgMHgyNDA2MWQwMCwgMHhjMDA0ZGRiLAotMHgwLCAweDNjMDQwMDAxLCAweDI0ODQ2YmYwLCAweDNjMDUwMDBlLAotMHgzNGE1MDEwMCwgMHgyMDAzMDIxLCAweDIyMDM4MjEsIDB4YWZhMDAwMTAsCi0weGMwMDJiM2IsIDB4YWZhMDAwMTQsIDB4OGZiZjAwMjAsIDB4OGZiMTAwMWMsCi0weDhmYjAwMDE4LCAweDNlMDAwMDgsIDB4MjdiZDAwMjgsIDB4OGY4NTAwNDQsCi0weDhmODIwMDQ0LCAweDNjMDMwMDAxLCAweDQzMTAyNSwgMHgzYzAzMDAwOCwKLTB4YWY4MjAwNDQsIDB4OGY4NDAwNTQsIDB4OGY4MjAwNTQsIDB4YTMyODI0LAotMHgxMDAwMDAwMiwgMHgyNDg0MDAwMSwgMHg4ZjgyMDA1NCwgMHg4MjEwMjMsCi0weDJjNDIwMDAyLCAweDE0NDBmZmZjLCAweDAsIDB4OGY4MjAwNDQsCi0weDNjMDNmZmZlLCAweDM0NjNmZmZmLCAweDQzMTAyNCwgMHhhZjgyMDA0NCwKLTB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsIDB4MjQ2MzAwMDEsCi0weDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDAwMiwgMHgxNDQwZmZmYywKLTB4MCwgMHgzZTAwMDA4LCAweGEwMTAyMSwgMHg4ZjgzMDA0NCwKLTB4M2MwMmZmZjAsIDB4MzQ0MmZmZmYsIDB4NDI0ODAsIDB4NjIxODI0LAotMHgzYzAyMDAwMiwgMHg4MjIwMjUsIDB4NjQxODI1LCAweGFmODMwMDQ0LAotMHg4ZjgyMDA0NCwgMHgzYzAzZmZmZSwgMHgzNDYzZmZmZiwgMHg0MzEwMjQsCi0weGFmODIwMDQ0LCAweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDEwMDAwMDAyLAotMHgyNDYzMDAwMSwgMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwMDIsCi0weDE0NDBmZmZjLCAweDAsIDB4OGY4MjAwNDQsIDB4M2MwMzAwMDEsCi0weDQzMTAyNSwgMHhhZjgyMDA0NCwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwKLTB4MTAwMDAwMDIsIDB4MjQ2MzAwMDEsIDB4OGY4MjAwNTQsIDB4NjIxMDIzLAotMHgyYzQyMDAwMiwgMHgxNDQwZmZmYywgMHgwLCAweDNlMDAwMDgsCi0weDAsIDB4OGY4MjAwNDQsIDB4MjQwM2ZmN2YsIDB4NDMxMDI0LAotMHhhZjgyMDA0NCwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgxMDAwMDAwMiwKLTB4MjQ2MzAwMDEsIDB4OGY4MjAwNTQsIDB4NjIxMDIzLCAweDJjNDIwMDAyLAotMHgxNDQwZmZmYywgMHgwLCAweDhmODIwMDQ0LCAweDM0NDIwMDgwLAotMHhhZjgyMDA0NCwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgxMDAwMDAwMiwKLTB4MjQ2MzAwMDEsIDB4OGY4MjAwNTQsIDB4NjIxMDIzLCAweDJjNDIwMDAyLAotMHgxNDQwZmZmYywgMHgwLCAweDNlMDAwMDgsIDB4MCwKLTB4OGY4MjAwNDQsIDB4M2MwM2ZmZjAsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LAotMHhhZjgyMDA0NCwgMHg4ZjgyMDA0NCwgMHgzYzAzMDAwMSwgMHg0MzEwMjUsCi0weGFmODIwMDQ0LCAweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDEwMDAwMDAyLAotMHgyNDYzMDAwMSwgMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwMDIsCi0weDE0NDBmZmZjLCAweDAsIDB4OGY4MjAwNDQsIDB4M2MwM2ZmZmUsCi0weDM0NjNmZmZmLCAweDQzMTAyNCwgMHhhZjgyMDA0NCwgMHg4ZjgzMDA1NCwKLTB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsIDB4MjQ2MzAwMDEsIDB4OGY4MjAwNTQsCi0weDYyMTAyMywgMHgyYzQyMDAwMiwgMHgxNDQwZmZmYywgMHgwLAotMHgzZTAwMDA4LCAweDAsIDB4MjdiZGZmYzgsIDB4YWZiMzAwMjQsCi0weDgwOTgyMSwgMHhhZmJlMDAyYywgMHhhMGYwMjEsIDB4YWZiMjAwMjAsCi0weGMwOTAyMSwgMHgzM2MyZmZmZiwgMHhhZmJmMDAzMCwgMHhhZmI1MDAyOCwKLTB4YWZiMTAwMWMsIDB4YWZiMDAwMTgsIDB4MTQ0MDAwMzQsIDB4YTdiMjAwMTAsCi0weDMyNzFmZmZmLCAweDI3YjIwMDEwLCAweDgwMjEsIDB4YzAwNGQ3OCwKLTB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsCi0weDAsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweGMwMDRkNzgsCi0weDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgMHhjMDA0ZDc4LAotMHgyNDA0MDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwgMHgxMDQwMDAwMiwKLTB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwKLTB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIDB4MjMwMTAyNCwKLTB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LAotMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MjMwMTAyNCwgMHhjMDA0ZDc4LAotMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4MzQxMDgwMDAsCi0weDk2NDIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwgMHgyMDIxLAotMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxMjAwMDA3NSwKLTB4MCwgMHgxMDAwZmZmNiwgMHgwLCAweDMyNzVmZmZmLAotMHgyN2IxMDAxMCwgMHhhN2EwMDAxMCwgMHg4MDIxLCAweGMwMDRkNzgsCi0weDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAweDE0NDBmZmZiLAotMHgwLCAweGMwMDRkNzgsIDB4MjAyMSwgMHhjMDA0ZDc4LAotMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsCi0weDIwMjEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIDB4MTA0MDAwMDIsCi0weDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsCi0weDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLCAweDJiMDEwMjQsCi0weDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwKLTB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDJiMDEwMjQsIDB4YzAwNGRiOSwKLTB4MzQxMDgwMDAsIDB4YzAwNGRiOSwgMHgwLCAweGMwMDRkNTgsCi0weDAsIDB4NTA0MDAwMDUsIDB4MTA4MDQyLCAweDk2MjIwMDAwLAotMHg1MDEwMjUsIDB4YTYyMjAwMDAsIDB4MTA4MDQyLCAweDE2MDBmZmY3LAotMHgwLCAweGMwMDRkYjksIDB4MCwgMHgzM2M1ZmZmZiwKLTB4MjQwMjAwMDEsIDB4NTRhMjAwMDQsIDB4MjQwMjAwMDIsIDB4OTdhMjAwMTAsCi0weDEwMDAwMDA2LCAweDUyMTAyNSwgMHgxNGEyMDAwNiwgMHgzMjcxZmZmZiwKLTB4OTdhMjAwMTAsIDB4MTIxODI3LCAweDQzMTAyNCwgMHhhN2EyMDAxMCwKLTB4MzI3MWZmZmYsIDB4MjdiMjAwMTAsIDB4ODAyMSwgMHhjMDA0ZDc4LAotMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwKLTB4MCwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4YzAwNGQ3OCwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweGMwMDRkNzgsCi0weDI0MDQwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLCAweDEwNDAwMDAyLAotMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLAotMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwgMHgyMzAxMDI0LAotMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsCi0weDEwODA0MiwgMHgxNjAwZmZmYSwgMHgyMzAxMDI0LCAweGMwMDRkNzgsCi0weDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgMHgzNDEwODAwMCwKLTB4OTY0MjAwMDAsIDB4NTAxMDI0LCAweDEwNDAwMDAyLCAweDIwMjEsCi0weDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLCAweDE2MDBmZmY4LAotMHgwLCAweGMwMDRkYjksIDB4MCwgMHg4ZmJmMDAzMCwKLTB4OGZiZTAwMmMsIDB4OGZiNTAwMjgsIDB4OGZiMzAwMjQsIDB4OGZiMjAwMjAsCi0weDhmYjEwMDFjLCAweDhmYjAwMDE4LCAweDNlMDAwMDgsIDB4MjdiZDAwMzgsCi0weDAsIDB4MCwgMHgwLCAweDI3YmRmZmU4LAotMHhhZmJmMDAxMCwgMHg4ZWUzMDRiOCwgMHgyNDAyMDAwOCwgMHgxNDYyMDFlMCwKLTB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNmYxYywgMHgxNDQwMDAwNSwKLTB4MCwgMHhjMDAzZGFmLCAweDhmODQwMjI0LCAweDEwMDAwMWQ4LAotMHgwLCAweDhmODIwMjIwLCAweDNjMDMwMDA4LCAweDQzMTAyNCwKLTB4MTA0MDAwMjYsIDB4MjQwMjAwMDEsIDB4OGY4NDAyMjQsIDB4OGY4MjAyMjAsCi0weDNjMDMwNDAwLCAweDQzMTAyNCwgMHgxMDQwMDAwNiwgMHgwLAotMHgzYzAxMDAwMiwgMHhhYzIwOGZhMCwgMHgzYzAxMDAwMiwgMHgxMDAwMDAwYiwKLTB4YWMyMDhmYzAsIDB4M2MwMzAwMDIsIDB4MjQ2MzhmYTAsIDB4OGM2MjAwMDAsCi0weDI0NDIwMDAxLCAweGFjNjIwMDAwLCAweDJjNDIwMDAyLCAweDE0NDAwMDAzLAotMHgyNDAyMDAwMSwgMHgzYzAxMDAwMiwgMHhhYzIyOGZjMCwgMHgzYzAyMDAwMiwKLTB4OGM0MjhmYzAsIDB4MTA0MDAwMDYsIDB4MzA4MjAwNDAsIDB4MTA0MDAwMDQsCi0weDI0MDIwMDAxLCAweDNjMDEwMDAyLCAweDEwMDAwMDAzLCAweGFjMjI4ZmM0LAotMHgzYzAxMDAwMiwgMHhhYzIwOGZjNCwgMHgzYzAxMDAwMiwgMHhhYzI0OGY5YywKLTB4M2MwMTAwMDIsIDB4MTAwMDAwMGIsIDB4YWMyMDhmZDAsIDB4M2MwMTAwMDIsCi0weGFjMjI4ZmQwLCAweDNjMDEwMDAyLCAweGFjMjA4ZmMwLCAweDNjMDEwMDAyLAotMHhhYzIwOGZhMCwgMHgzYzAxMDAwMiwgMHhhYzIwOGZjNCwgMHgzYzAxMDAwMiwKLTB4YWMyMDhmOWMsIDB4M2MwMzAwMDIsIDB4OGM2MzhmOTAsIDB4M2MwMjAwMDIsCi0weDhjNDI4Zjk0LCAweDUwNjIwMDA0LCAweDI0NjNmZmZmLCAweDNjMDEwMDAyLAotMHhhYzIzOGY5NCwgMHgyNDYzZmZmZiwgMHgyYzYyMDAwZSwgMHgxMDQwMDE5NCwKLTB4MzEwODAsIDB4M2MwMTAwMDEsIDB4MjIwODIxLCAweDhjMjI2YzAwLAotMHg0MDAwMDgsIDB4MCwgMHgyNDAyMDAwMiwgMHgzYzAxMDAwMiwKLTB4YWMyMDhmYzAsIDB4M2MwMTAwMDIsIDB4YWMyMDhmYTAsIDB4M2MwMTAwMDIsCi0weGFjMjA4ZjljLCAweDNjMDEwMDAyLCAweGFjMjA4ZmM0LCAweDNjMDEwMDAyLAotMHhhYzIwOGZiOCwgMHgzYzAxMDAwMiwgMHhhYzIwOGZiMCwgMHhhZjgwMDIyNCwKLTB4M2MwMTAwMDIsIDB4YWMyMjhmOTAsIDB4M2MwMjAwMDIsIDB4OGM0MjhmZDAsCi0weDE0NDAwMDRmLCAweDNjMDJmZGZmLCAweDM0NDJmZmZmLCAweGMwMDNkYWYsCi0weDI4MmEwMjQsIDB4YWY4MDAyMDQsIDB4OGY4MjAyMDAsIDB4MjQwM2ZmZmQsCi0weDQzMTAyNCwgMHhhZjgyMDIwMCwgMHgzYzAxMDAwMiwgMHhhYzIwOGZlMCwKLTB4OGY4MzAwNTQsIDB4M2MwMjAwMDIsIDB4OGM0MjhmYjgsIDB4MjQwNDAwMDEsCi0weDNjMDEwMDAyLCAweGFjMjQ4ZmNjLCAweDI0NDIwMDAxLCAweDNjMDEwMDAyLAotMHhhYzIyOGZiOCwgMHgyYzQyMDAwNCwgMHgzYzAxMDAwMiwgMHhhYzIzOGZiNCwKLTB4MTQ0MDAwMDYsIDB4MjQwMjAwMDMsIDB4M2MwMTAwMDEsIDB4YWMyNDZkOWMsCi0weDNjMDEwMDAyLCAweDEwMDAwMTVlLCAweGFjMjA4ZmI4LCAweDNjMDEwMDAyLAotMHgxMDAwMDE1YiwgMHhhYzIyOGY5MCwgMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMiwKLTB4OGM0MjhmYjQsIDB4MjQ2M2Q4ZjAsIDB4NDMxMDIzLCAweDJjNDIyNzEwLAotMHgxNDQwMDAwMywgMHgyNDAyMDAwNCwgMHgzYzAxMDAwMiwgMHhhYzIyOGY5MCwKLTB4M2MwMjAwMDIsIDB4OGM0MjhmZDAsIDB4MTQ0MDAwMjEsIDB4M2MwMmZkZmYsCi0weDM0NDJmZmZmLCAweDEwMDAwMTRhLCAweDI4MmEwMjQsIDB4M2MwNDAwMDEsCi0weDhjODQ2ZjIwLCAweDNjMDEwMDAyLCAweGMwMDUwODQsIDB4YWMyMDhmYTgsCi0weDNjMDIwMDAyLCAweDhjNDI4ZmRjLCAweGFmODIwMjA0LCAweDNjMDIwMDAyLAotMHg4YzQyOGZkMCwgMHgxNDQwMDAxMiwgMHgzYzAzZmRmZiwgMHg4ZjgyMDIwNCwKLTB4MzQ2M2ZmZmYsIDB4MzA0MjAwMzAsIDB4MTQ0MDAxMmYsIDB4MjgzYTAyNCwKLTB4M2MwMzAwMDIsIDB4OGM2MzhmZGMsIDB4MjQwMjAwMDUsIDB4M2MwMTAwMDIsCi0weGFjMjI4ZjkwLCAweDNjMDEwMDAyLCAweDEwMDAwMTMxLCAweGFjMjM4ZmUwLAotMHgzYzAyMDAwMiwgMHg4YzQyOGZkMCwgMHgxMDQwMDAxMCwgMHgzYzAyZmRmZiwKLTB4M2MwMjAwMDEsIDB4OGM0MjZlM2MsIDB4MjQ0MjAwMDEsIDB4M2MwMTAwMDEsCi0weGFjMjI2ZTNjLCAweDJjNDIwMDAyLCAweDE0NDAwMTI1LCAweDI0MDIwMDAxLAotMHgzYzAxMDAwMSwgMHhhYzIyNmU0NCwgMHgzYzAxMDAwMSwgMHhhYzIwNmUzYywKLTB4M2MwMTAwMDEsIDB4MTAwMDAxMWUsIDB4YWMyMjZkOWMsIDB4M2MwMzAwMDIsCi0weDhjNjM4ZmMwLCAweDM0NDJmZmZmLCAweDEwNjAwMTE5LCAweDI4MmEwMjQsCi0weDNjMDIwMDAyLCAweDhjNDI4ZjljLCAweDEwNDAwMTE1LCAweDAsCi0weDNjMDEwMDAyLCAweGFjMjI4ZmM4LCAweDI0MDIwMDAzLCAweDNjMDEwMDAyLAotMHhhYzIyOGZhMCwgMHgxMDAwMDBiOCwgMHgyNDAyMDAwNiwgMHgzYzAxMDAwMiwKLTB4YWMyMDhmYTgsIDB4OGY4MjAyMDQsIDB4MzQ0MjAwNDAsIDB4YWY4MjAyMDQsCi0weDNjMDIwMDAyLCAweDhjNDI4ZmUwLCAweDI0MDMwMDA3LCAweDNjMDEwMDAyLAotMHhhYzIzOGY5MCwgMHgzNDQyMDA0MCwgMHgzYzAxMDAwMiwgMHhhYzIyOGZlMCwKLTB4M2MwMjAwMDIsIDB4OGM0MjhmYzAsIDB4MTA0MDAwMDUsIDB4MCwKLTB4M2MwMjAwMDIsIDB4OGM0MjhmOWMsIDB4MTA0MDAwZjAsIDB4MjQwMjAwMDIsCi0weDNjMDUwMDAyLCAweDI0YTU4ZmEwLCAweDhjYTIwMDAwLCAweDJjNDI0ZTIxLAotMHgxMDQwMDBlYSwgMHgyNDAyMDAwMiwgMHgzYzAyMDAwMiwgMHg4YzQyOGZjNCwKLTB4MTA0MDAwZWYsIDB4MjQwNGZmYmYsIDB4M2MwMjAwMDIsIDB4OGM0MjhmOWMsCi0weDNjMDMwMDAyLCAweDhjNjM4ZmM4LCAweDQ0MTAyNCwgMHg2NDE4MjQsCi0weDEwNDMwMDA0LCAweDI0MDIwMDAxLCAweDNjMDEwMDAyLCAweDEwMDAwMGU0LAotMHhhYzIyOGY5MCwgMHgyNDAyMDAwMywgMHhhY2EyMDAwMCwgMHgyNDAyMDAwOCwKLTB4M2MwMTAwMDIsIDB4YWMyMjhmOTAsIDB4M2MwMjAwMDIsIDB4OGM0MjhmY2MsCi0weDEwNDAwMDBjLCAweDI0MDIwMDAxLCAweDNjMDQwMDAyLCAweGMwMDUwOTEsCi0weDhjODQ4ZjljLCAweDNjMDIwMDAyLCAweDhjNDI4ZmU4LCAweDE0NDAwMDA1LAotMHgyNDAyMDAwMSwgMHgzYzAyMDAwMiwgMHg4YzQyOGZlNCwgMHgxMDQwMDAwNiwKLTB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMjZkOWMsIDB4M2MwMTAwMDIsCi0weDEwMDAwMGNiLCAweGFjMjA4ZmI4LCAweDNjMDIwMDAyLCAweDhjNDI4ZmIwLAotMHgzYzAzMDAwMiwgMHg4YzYzOGY5YywgMHgyYzQyMDAwMSwgMHgyMTBjMCwKLTB4MzA2MzAwMDgsIDB4M2MwMTAwMDIsIDB4YWMyMjhmYjAsIDB4M2MwMTAwMDIsCi0weGFjMjM4ZmFjLCAweDhmODMwMDU0LCAweDI0MDIwMDA5LCAweDNjMDEwMDAyLAotMHhhYzIyOGY5MCwgMHgzYzAxMDAwMiwgMHgxMDAwMDBiOSwgMHhhYzIzOGZiNCwKLTB4OGY4MzAwNTQsIDB4M2MwMjAwMDIsIDB4OGM0MjhmYjQsIDB4MjQ2M2Q4ZjAsCi0weDQzMTAyMywgMHgyYzQyMjcxMCwgMHgxNDQwMDA5ZiwgMHgwLAotMHgzYzAyMDAwMiwgMHg4YzQyOGZjMCwgMHgxMDQwMDAwNSwgMHgwLAotMHgzYzAyMDAwMiwgMHg4YzQyOGY5YywgMHgxMDQwMDBhMCwgMHgyNDAyMDAwMiwKLTB4M2MwMzAwMDIsIDB4MjQ2MzhmYTAsIDB4OGM2MjAwMDAsIDB4MmM0MjRlMjEsCi0weDEwNDAwMDlhLCAweDI0MDIwMDAyLCAweDNjMDIwMDAyLCAweDhjNDI4ZmNjLAotMHgxMDQwMDAwZSwgMHgwLCAweDNjMDIwMDAyLCAweDhjNDI4ZjljLAotMHgzYzAxMDAwMiwgMHhhYzIwOGZjYywgMHgzMDQyMDA4MCwgMHgxMDQwMDAyZiwKLTB4MjQwMjAwMGMsIDB4OGY4MjAyMDQsIDB4MzA0MjAwODAsIDB4MTQ0MDAwMGMsCi0weDI0MDIwMDAzLCAweDEwMDAwMDI5LCAweDI0MDIwMDBjLCAweDNjMDIwMDAyLAotMHg4YzQyOGY5YywgMHgzMDQyMDA4MCwgMHgxNDQwMDAwNSwgMHgyNDAyMDAwMywKLTB4OGY4MjAyMDQsIDB4MzA0MjAwODAsIDB4MTA0MDAwMWYsIDB4MjQwMjAwMDMsCi0weGFjNjIwMDAwLCAweDI0MDIwMDBhLCAweDNjMDEwMDAyLCAweGFjMjI4ZjkwLAotMHgzYzA0MDAwMiwgMHgyNDg0OGZkOCwgMHg4YzgyMDAwMCwgMHgzYzAzMDAwMiwKLTB4OGM2MzhmYjAsIDB4NDMxMDI1LCAweGFmODIwMjA0LCAweDhjODMwMDAwLAotMHgzYzA0MDAwMiwgMHg4Yzg0OGZiMCwgMHgyNDAyMDAwYiwgMHgzYzAxMDAwMiwKLTB4YWMyMjhmOTAsIDB4NjQxODI1LCAweDNjMDEwMDAyLCAweGFjMjM4ZmUwLAotMHgzYzA1MDAwMiwgMHgyNGE1OGZhMCwgMHg4Y2EyMDAwMCwgMHgyYzQyNGUyMSwKLTB4MTA0MDAwNjYsIDB4MjQwMjAwMDIsIDB4M2MwMjAwMDIsIDB4OGM0MjhmZDAsCi0weDEwNDAwMDA1LCAweDAsIDB4MjQwMjAwMGMsIDB4M2MwMTAwMDIsCi0weDEwMDAwMDY3LCAweGFjMjI4ZjkwLCAweDNjMDIwMDAyLCAweDhjNDI4ZmMwLAotMHgxMDQwMDA2MywgMHgwLCAweDNjMDQwMDAyLCAweDhjODQ4ZjljLAotMHgxMDgwMDA1NSwgMHgzMDgyMDAwOCwgMHgzYzAzMDAwMiwgMHg4YzYzOGZhYywKLTB4MTA2MjAwNWIsIDB4MjQwMjAwMDMsIDB4M2MwMTAwMDIsIDB4YWMyNDhmYzgsCi0weGFjYTIwMDAwLCAweDI0MDIwMDA2LCAweDNjMDEwMDAyLCAweDEwMDAwMDU0LAotMHhhYzIyOGY5MCwgMHg4ZjgyMDIwMCwgMHgzNDQyMDAwMiwgMHhhZjgyMDIwMCwKLTB4OGY4MzAwNTQsIDB4MjQwMjAwMGQsIDB4M2MwMTAwMDIsIDB4YWMyMjhmOTAsCi0weDNjMDEwMDAyLCAweGFjMjM4ZmI0LCAweDhmODMwMDU0LCAweDNjMDIwMDAyLAotMHg4YzQyOGZiNCwgMHgyNDYzZDhmMCwgMHg0MzEwMjMsIDB4MmM0MjI3MTAsCi0weDE0NDAwMDMxLCAweDAsIDB4M2MwMjAwMDIsIDB4OGM0MjhmZDAsCi0weDEwNDAwMDIwLCAweDI0MDIwMDBlLCAweDNjMDMwMDAyLCAweDhjNjM4ZmU0LAotMHgzYzAxMDAwMiwgMHgxNDYwMDAxNSwgMHhhYzIyOGY5MCwgMHhjMDAzZTZkLAotMHgwLCAweDNjMDUwMDAxLCAweDhjYTU2ZDk4LCAweGMwMDUyOWIsCi0weDIwMjEsIDB4M2MwMzAwMDEsIDB4OGM2MzZkOTgsIDB4MjQwMjAwMDQsCi0weDE0NjIwMDA1LCAweDI0MDNmZmZiLCAweDNjMDIwMDAxLCAweDhjNDI2ZDk0LAotMHgxMDAwMDAwMywgMHgyNDAzZmZmNywgMHgzYzAyMDAwMSwgMHg4YzQyNmQ5NCwKLTB4NDMxMDI0LCAweDNjMDEwMDAxLCAweGFjMjI2ZDk0LCAweDhmODMwMjI0LAotMHgzYzAyMDIwMCwgMHgzYzAxMDAwMiwgMHhhYzIzOGZlYywgMHgxMDAwMDAyMCwKLTB4MjgyYTAyNSwgMHgzYzAyMDAwMiwgMHg4YzQyOGZjMCwgMHgxMDQwMDAwNSwKLTB4MCwgMHgzYzAyMDAwMiwgMHg4YzQyOGY5YywgMHgxMDQwMDAwZiwKLTB4MjQwMjAwMDIsIDB4M2MwMjAwMDIsIDB4OGM0MjhmYTAsIDB4MmM0MjRlMjEsCi0weDEwNDAwMDBhLCAweDI0MDIwMDAyLCAweDNjMDIwMDAyLCAweDhjNDI4ZmMwLAotMHgxMDQwMDAwZiwgMHgwLCAweDNjMDIwMDAyLCAweDhjNDI4ZjljLAotMHgxNDQwMDAwYiwgMHgwLCAweDI0MDIwMDAyLCAweDNjMDEwMDAyLAotMHgxMDAwMDAwNywgMHhhYzIyOGY5MCwgMHgzYzAyMDAwMiwgMHg4YzQyOGZjMCwKLTB4MTA0MDAwMDMsIDB4MCwgMHhjMDAzZGFmLCAweDAsCi0weDhmODIwMjIwLCAweDNjMDNmNzAwLCAweDQzMTAyNSwgMHhhZjgyMDIyMCwKLTB4OGZiZjAwMTAsIDB4M2UwMDAwOCwgMHgyN2JkMDAxOCwgMHgzYzAzMDAwMiwKLTB4MjQ2MzhmZTgsIDB4OGM2MjAwMDAsIDB4MTA0MDAwMDUsIDB4MzQ0MjIwMDAsCi0weDNjMDEwMDAyLCAweGFjMjI4ZmRjLCAweDEwMDAwMDAzLCAweGFjNjAwMDAwLAotMHgzYzAxMDAwMiwgMHhhYzI0OGZkYywgMHgzZTAwMDA4LCAweDAsCi0weDI3YmRmZmUwLCAweDMwODIwMDMwLCAweGFmYmYwMDE4LCAweDNjMDEwMDAyLAotMHhhYzIyOGZlNCwgMHgxNDQwMDA2NywgMHgzYzAyZmZmZiwgMHgzNDQyMWYwZSwKLTB4ODIxMDI0LCAweDE0NDAwMDYxLCAweDI0MDIwMDMwLCAweDMwODIyMDAwLAotMHgxMDQwMDA1ZCwgMHgzMDgzODAwMCwgMHgzMWEwMiwgMHgzMDgyMDAwMSwKLTB4MjEyMDAsIDB4M2MwNDAwMDEsIDB4OGM4NDZmMjAsIDB4NjIxODI1LAotMHgzMzFjMiwgMHgzYzAzMDAwMSwgMHgyNDYzNmU0OCwgMHgzMDgyODAwMCwKLTB4MjEyMDIsIDB4MzA4NDAwMDEsIDB4NDIyMDAsIDB4NDQxMDI1LAotMHgyMzljMiwgMHg2MTA4MCwgMHg0MzEwMjEsIDB4NDcxMDIxLAotMHg5MDQzMDAwMCwgMHgyNDAyMDAwMSwgMHgxMDYyMDAyNSwgMHgwLAotMHgxMDYwMDAwNywgMHgyNDAyMDAwMiwgMHgxMDYyMDAxMywgMHgyNDAyMDAwMywKLTB4MTA2MjAwMmMsIDB4M2MwNTAwMGYsIDB4MTAwMDAwMzcsIDB4MCwKLTB4OGY4MjAyMDAsIDB4MjQwM2ZlZmYsIDB4NDMxMDI0LCAweGFmODIwMjAwLAotMHg4ZjgyMDIyMCwgMHgzYzAzZmZmZSwgMHgzNDYzZmZmZiwgMHg0MzEwMjQsCi0weGFmODIwMjIwLCAweDNjMDEwMDAyLCAweGFjMjA5MDA0LCAweDNjMDEwMDAyLAotMHgxMDAwMDAzNCwgMHhhYzIwOTAwYywgMHg4ZjgyMDIwMCwgMHgzNDQyMDEwMCwKLTB4YWY4MjAyMDAsIDB4OGY4MjAyMjAsIDB4M2MwM2ZmZmUsIDB4MzQ2M2ZmZmYsCi0weDQzMTAyNCwgMHhhZjgyMDIyMCwgMHgyNDAyMDEwMCwgMHgzYzAxMDAwMiwKLTB4YWMyMjkwMDQsIDB4M2MwMTAwMDIsIDB4MTAwMDAwMjYsIDB4YWMyMDkwMGMsCi0weDhmODIwMjAwLCAweDI0MDNmZWZmLCAweDQzMTAyNCwgMHhhZjgyMDIwMCwKLTB4OGY4MjAyMjAsIDB4M2MwMzAwMDEsIDB4NDMxMDI1LCAweGFmODIwMjIwLAotMHgzYzAxMDAwMiwgMHhhYzIwOTAwNCwgMHgzYzAxMDAwMiwgMHgxMDAwMDAxOSwKLTB4YWMyMzkwMGMsIDB4OGY4MjAyMDAsIDB4MzQ0MjAxMDAsIDB4YWY4MjAyMDAsCi0weDhmODIwMjIwLCAweDNjMDMwMDAxLCAweDQzMTAyNSwgMHhhZjgyMDIyMCwKLTB4MjQwMjAxMDAsIDB4M2MwMTAwMDIsIDB4YWMyMjkwMDQsIDB4M2MwMTAwMDIsCi0weDEwMDAwMDBjLCAweGFjMjM5MDBjLCAweDM0YTVmZmZmLCAweDNjMDQwMDAxLAotMHgyNDg0NmMzOCwgMHhhZmEzMDAxMCwgMHhjMDAyYjNiLCAweGFmYTAwMDE0LAotMHgxMDAwMDAwNCwgMHgwLCAweDI0MDIwMDMwLCAweDNjMDEwMDAyLAotMHhhYzIyOGZlOCwgMHg4ZmJmMDAxOCwgMHgzZTAwMDA4LCAweDI3YmQwMDIwLAotMHgwLCAweDAsIDB4MCwgMHgyN2JkZmZjOCwKLTB4YWZiMjAwMjgsIDB4ODA5MDIxLCAweGFmYjMwMDJjLCAweGEwOTgyMSwKLTB4YWZiMDAwMjAsIDB4YzA4MDIxLCAweDNjMDQwMDAxLCAweDI0ODQ2YzUwLAotMHgzYzA1MDAwOSwgMHgzYzAyMDAwMSwgMHg4YzQyNmQ5OCwgMHgzNGE1OTAwMSwKLTB4MjQwMzAyMSwgMHgyNjAzODIxLCAweGFmYmYwMDMwLCAweGFmYjEwMDI0LAotMHhhN2EwMDAxYSwgMHhhZmIwMDAxNCwgMHhjMDAyYjNiLCAweGFmYTIwMDEwLAotMHgyNDAyMDAwMiwgMHgxMjYyMDA4MywgMHgyZTYyMDAwMywgMHgxMDQwMDAwNSwKLTB4MjQwMjAwMDEsIDB4MTI2MjAwMGEsIDB4MCwgMHgxMDAwMDE3MywKLTB4MCwgMHgyNDAyMDAwNCwgMHgxMjYyMDBmOCwgMHgyNDAyMDAwOCwKLTB4MTI2MjAwZjcsIDB4M2MwMmZmZWMsIDB4MTAwMDAxNmMsIDB4MCwKLTB4M2MwMjAwMDEsIDB4OGM0MjZkOTQsIDB4MzA0MjAwMDIsIDB4MTQ0MDAwMDQsCi0weDEyODk0MCwgMHgzYzAyZmZmYiwgMHgzNDQyZmZmZiwgMHgyMDI4MDI0LAotMHgzYzAxMDAwMiwgMHgzMTA4MjEsIDB4YWMzMDhmZmMsIDB4M2MwMjQwMDAsCi0weDIwMjEwMjQsIDB4MTA0MDAwNGUsIDB4MTAyM2MyLCAweDMwODQwMDMwLAotMHgxMDEzODIsIDB4MzA0MjAwMWMsIDB4M2MwMzAwMDEsIDB4MjQ2MzZkZDgsCi0weDQzMTAyMSwgMHg4MjM4MjEsIDB4M2MwMjAwMjAsIDB4MjAyMTAyNCwKLTB4MTA0MDAwMDYsIDB4MjQwMjAxMDAsIDB4M2MwMTAwMDIsIDB4MzEwODIxLAotMHhhYzIyOTAwMCwgMHgxMDAwMDAwNSwgMHgzYzAyMDA4MCwgMHgzYzAxMDAwMiwKLTB4MzEwODIxLCAweGFjMjA5MDAwLCAweDNjMDIwMDgwLCAweDIwMjEwMjQsCi0weDEwNDAwMDA2LCAweDEyMTk0MCwgMHgzYzAyMDAwMSwgMHgzYzAxMDAwMiwKLTB4MjMwODIxLCAweDEwMDAwMDA1LCAweGFjMjI5MDA4LCAweDEyMTE0MCwKLTB4M2MwMTAwMDIsIDB4MjIwODIxLCAweGFjMjA5MDA4LCAweDk0ZTQwMDAwLAotMHgzYzAzMDAwMSwgMHg4YzYzNmY0MCwgMHgyNDAyMDAwNSwgMHgxMDYyMDAxMCwKLTB4YTdhNDAwMTgsIDB4MzIwMjQwMDAsIDB4MTA0MDAwMDIsIDB4MzQ4MjQwMDAsCi0weGE3YTIwMDE4LCAweDI0MDQwMDAxLCAweDk0ZTIwMDAyLCAweDI0MDUwMDA0LAotMHgyNGU2MDAwMiwgMHgzNDQyMDAwMSwgMHhjMDA0NWJlLCAweGE0ZTIwMDAyLAotMHgyNDA0MDAwMSwgMHgyODIxLCAweGMwMDQ1YmUsIDB4MjdhNjAwMTgsCi0weDNjMDIwMDAxLCAweDhjNDI2ZDk4LCAweDI0MTEwMDAxLCAweDNjMDEwMDAxLAotMHhhYzMxNmRhNCwgMHgxNDUzMDAwNCwgMHgzMjAyODAwMCwgMHhjMDAzZGFmLAotMHgwLCAweDMyMDI4MDAwLCAweDEwNDAwMTFjLCAweDAsCi0weGMwMDNkYWYsIDB4MCwgMHgzYzAzMDAwMSwgMHg4YzYzNmY0MCwKLTB4MjQwMjAwMDUsIDB4MTA2MjAxMTUsIDB4MjQwMjAwMDIsIDB4M2MwMTAwMDEsCi0weGFjMzE2ZDljLCAweDNjMDEwMDAxLCAweDEwMDAwMTEwLCAweGFjMjI2ZDk4LAotMHgyNDA0MDAwMSwgMHgyNDA1MDAwNCwgMHgyN2IwMDAxYSwgMHhjMDA0NWJlLAotMHgyMDAzMDIxLCAweDI0MDQwMDAxLCAweDI4MjEsIDB4YzAwNDViZSwKLTB4MjAwMzAyMSwgMHgzYzAyMDAwMiwgMHg1MTEwMjEsIDB4OGM0MjhmZjQsCi0weDNjMDQwMDAxLCAweDhjODQ2ZDk4LCAweDNjMDNiZmZmLCAweDM0NjNmZmZmLAotMHgzYzAxMDAwMSwgMHhhYzMzNmRhNCwgMHg0MzEwMjQsIDB4M2MwMTAwMDIsCi0weDMxMDgyMSwgMHgxMDkzMDBmNywgMHhhYzIyOGZmNCwgMHgxMDAwMDBmNywKLTB4MCwgMHgzYzAyMjAwMCwgMHgyMDIxMDI0LCAweDEwNDAwMDA1LAotMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzIyNmYxYywgMHgxMDAwMDAwNCwKLTB4MTI4OTQwLCAweDNjMDEwMDAxLCAweGFjMjA2ZjFjLCAweDEyODk0MCwKLTB4M2MwMTAwMDIsIDB4MzEwODIxLCAweGFjMzA4ZmY4LCAweDNjMDI0MDAwLAotMHgyMDIxMDI0LCAweDE0NDAwMDE0LCAweDAsIDB4M2MwMjAwMDEsCi0weDhjNDI2ZjFjLCAweDEwNDAwMDA2LCAweDI0MDQwMDA0LCAweDI0MDUwMDAxLAotMHhjMDA0ZGRiLCAweDI0MDYyMDAwLCAweDI0MDIwMDAxLCAweGFlZTIwNGI4LAotMHgzYzAyMDAwMiwgMHg1MTEwMjEsIDB4OGM0MjhmZjAsIDB4M2MwM2JmZmYsCi0weDM0NjNmZmZmLCAweDQzMTAyNCwgMHgzYzAxMDAwMiwgMHgzMTA4MjEsCi0weDEwMDAwMGQwLCAweGFjMjI4ZmYwLCAweDNjMDIwMDAxLCAweDhjNDI2ZjFjLAotMHgxMDQwMDAyOCwgMHgzYzAzMDBhMCwgMHgyMDMxMDI0LCAweDU0NDMwMDBkLAotMHgzYzAyMDAyMCwgMHgzYzAyMDAwMSwgMHg4YzQyNmYyMCwgMHgyNDAzMDEwMCwKLTB4M2MwMTAwMDIsIDB4MzEwODIxLCAweGFjMjM5MDA0LCAweDNjMDMwMDAxLAotMHgzYzAxMDAwMiwgMHgzMTA4MjEsIDB4YWMyMzkwMGMsIDB4MTAwMDAwMTUsCi0weDM0NDIwNDAwLCAweDIwMjEwMjQsIDB4MTA0MDAwMDgsIDB4MjQwMzAxMDAsCi0weDNjMDIwMDAxLCAweDhjNDI2ZjIwLCAweDNjMDEwMDAyLCAweDMxMDgyMSwKLTB4YWMyMzkwMDQsIDB4MTAwMDAwMGIsIDB4MzQ0MjA4MDAsIDB4M2MwMjAwODAsCi0weDIwMjEwMjQsIDB4MTA0MDAwMmUsIDB4M2MwMzAwMDEsIDB4M2MwMjAwMDEsCi0weDhjNDI2ZjIwLCAweDNjMDEwMDAyLCAweDMxMDgyMSwgMHhhYzIzOTAwYywKLTB4MzQ0MjBjMDAsIDB4M2MwMTAwMDEsIDB4YWMyMjZmMjAsIDB4MTAwMDAwMjUsCi0weDI0MDQwMDAxLCAweDNjMDIwMDIwLCAweDIwMjEwMjQsIDB4MTA0MDAwMDYsCi0weDI0MDIwMTAwLCAweDNjMDEwMDAyLCAweDMxMDgyMSwgMHhhYzIyOTAwNCwKLTB4MTAwMDAwMDUsIDB4M2MwMjAwODAsIDB4M2MwMTAwMDIsIDB4MzEwODIxLAotMHhhYzIwOTAwNCwgMHgzYzAyMDA4MCwgMHgyMDIxMDI0LCAweDEwNDAwMDA3LAotMHgxMjE5NDAsIDB4M2MwMjAwMDEsIDB4M2MwMTAwMDIsIDB4MjMwODIxLAotMHhhYzIyOTAwYywgMHgxMDAwMDAwNiwgMHgyNDA0MDAwMSwgMHgxMjExNDAsCi0weDNjMDEwMDAyLCAweDIyMDgyMSwgMHhhYzIwOTAwYywgMHgyNDA0MDAwMSwKLTB4MjgyMSwgMHgyN2IwMDAxZSwgMHhjMDA0NTdjLCAweDIwMDMwMjEsCi0weDI0MDQwMDAxLCAweDI4MjEsIDB4YzAwNDU3YywgMHgyMDAzMDIxLAotMHgyNDA0MDAwMSwgMHgyNDA1MDAwMSwgMHgyN2IwMDAxYywgMHhjMDA0NTdjLAotMHgyMDAzMDIxLCAweDI0MDQwMDAxLCAweDI0MDUwMDAxLCAweGMwMDQ1N2MsCi0weDIwMDMwMjEsIDB4MTAwMDAwNzcsIDB4MCwgMHgzYzAyZmZlYywKLTB4MzQ0MmZmZmYsIDB4MjAyODAyNCwgMHgzYzAyMDAwOCwgMHgyMDI4MDI1LAotMHgxMjExNDAsIDB4M2MwMTAwMDIsIDB4MjIwODIxLCAweGFjMzA4ZmY4LAotMHgzYzAyMjAwMCwgMHgyMDIxMDI0LCAweDEwNDAwMDA5LCAweDAsCi0weDNjMDIwMDAxLCAweDhjNDI2ZTQ0LCAweDE0NDAwMDA1LCAweDI0MDIwMDAxLAotMHgzYzAxMDAwMSwgMHhhYzIyNmYxYywgMHgxMDAwMDAwNCwgMHgzYzAyNDAwMCwKLTB4M2MwMTAwMDEsIDB4YWMyMDZmMWMsIDB4M2MwMjQwMDAsIDB4MjAyMTAyNCwKLTB4MTQ0MDAwMWQsIDB4MjQwMjBlMDEsIDB4M2MwMzAwMDEsIDB4OGM2MzZmMWMsCi0weGFmODIwMjM4LCAweDNjMDEwMDAxLCAweGFjMjA2ZGIwLCAweDEwNjAwMDA1LAotMHgyNDAyMjAyMCwgMHgzYzAxMDAwMSwgMHhhYzIyNmYyMCwgMHgyNDAyMDAwMSwKLTB4YWVlMjA0YjgsIDB4M2MwNGJmZmYsIDB4MTIxOTQwLCAweDNjMDIwMDAyLAotMHg0MzEwMjEsIDB4OGM0MjhmZjAsIDB4M2MwNTAwMDEsIDB4OGNhNTZkOTgsCi0weDM0ODRmZmZmLCAweDQ0MTAyNCwgMHgzYzAxMDAwMiwgMHgyMzA4MjEsCi0weGFjMjI4ZmYwLCAweDI0MDIwMDAxLCAweDEwYTIwMDQ0LCAweDAsCi0weDEwMDAwMDQwLCAweDAsIDB4M2MwMjAwMDEsIDB4OGM0MjZmMWMsCi0weDEwNDAwMDFjLCAweDI0MDIyMDAwLCAweDNjMDEwMDAxLCAweGFjMjI2ZjIwLAotMHgzYzAzMDBhMCwgMHgyMDMxMDI0LCAweDE0NDMwMDA1LCAweDEyMTE0MCwKLTB4MzQwMmEwMDAsIDB4M2MwMTAwMDEsIDB4MTAwMDAwMmQsIDB4YWMyMjZmMjAsCi0weDNjMDMwMDAyLCAweDYyMTgyMSwgMHg4YzYzOGZmOCwgMHgzYzAyMDAyMCwKLTB4NjIxMDI0LCAweDEwNDAwMDA0LCAweDI0MDIyMDAxLCAweDNjMDEwMDAxLAotMHgxMDAwMDAyMywgMHhhYzIyNmYyMCwgMHgzYzAyMDA4MCwgMHg2MjEwMjQsCi0weDEwNDAwMDFmLCAweDM0MDJhMDAxLCAweDNjMDEwMDAxLCAweDEwMDAwMDFjLAotMHhhYzIyNmYyMCwgMHgzYzAyMDAyMCwgMHgyMDIxMDI0LCAweDEwNDAwMDA3LAotMHgxMjE5NDAsIDB4MjQwMjAxMDAsIDB4M2MwMTAwMDIsIDB4MjMwODIxLAotMHhhYzIyOTAwNCwgMHgxMDAwMDAwNiwgMHgzYzAyMDA4MCwgMHgxMjExNDAsCi0weDNjMDEwMDAyLCAweDIyMDgyMSwgMHhhYzIwOTAwNCwgMHgzYzAyMDA4MCwKLTB4MjAyMTAyNCwgMHgxMDQwMDAwNiwgMHgxMjE5NDAsIDB4M2MwMjAwMDEsCi0weDNjMDEwMDAyLCAweDIzMDgyMSwgMHgxMDAwMDAwNSwgMHhhYzIyOTAwYywKLTB4MTIxMTQwLCAweDNjMDEwMDAyLCAweDIyMDgyMSwgMHhhYzIwOTAwYywKLTB4M2MwMzAwMDEsIDB4OGM2MzZkOTgsIDB4MjQwMjAwMDEsIDB4MTA2MjAwMDMsCi0weDAsIDB4YzAwM2RhZiwgMHgwLCAweDhmYmYwMDMwLAotMHg4ZmIzMDAyYywgMHg4ZmIyMDAyOCwgMHg4ZmIxMDAyNCwgMHg4ZmIwMDAyMCwKLTB4M2UwMDAwOCwgMHgyN2JkMDAzOCwgMHgyN2JkZmZiMCwgMHhhZmIzMDAzYywKLTB4OTgyMSwgMHhhZmI1MDA0MCwgMHhhODIxLCAweGFmYjEwMDM0LAotMHg4ODIxLCAweDI0MDIwMDAyLCAweGFmYmYwMDQ4LCAweGFmYmUwMDQ0LAotMHhhZmIyMDAzOCwgMHhhZmIwMDAzMCwgMHhhZmE0MDAyYywgMHhhN2EwMDAxYSwKLTB4YTdhMDAwMTgsIDB4YTdhMDAwMjAsIDB4YTdhMDAwMWUsIDB4YTdhMDAwMjIsCi0weDEwYTIwMTMwLCAweGE3YTAwMDFjLCAweDJjYTIwMDAzLCAweDEwNDAwMDA1LAotMHgyNDAyMDAwMSwgMHgxMGEyMDAwYSwgMHgzYzAyNDAwMCwgMHgxMDAwMDI1ZCwKLTB4MjIwMTAyMSwgMHgyNDAyMDAwNCwgMHgxMGEyMDIwYSwgMHgyNDAyMDAwOCwKLTB4MTBhMjAyMDgsIDB4MjIwMTAyMSwgMHgxMDAwMDI1NiwgMHgwLAotMHg4ZmE4MDAyYywgMHg4ODE0MCwgMHgzYzAzMDAwMiwgMHg3MDE4MjEsCi0weDhjNjM4ZmZjLCAweDYyMTAyNCwgMHgxNDQwMDAwOSwgMHgyNDA0MDAwMSwKLTB4M2MwMjdmZmYsIDB4MzQ0MmZmZmYsIDB4NjI4ODI0LCAweDNjMDEwMDAyLAotMHgzMDA4MjEsIDB4YWMzMThmZjQsIDB4MTAwMDAyNDYsIDB4MjIwMTAyMSwKLTB4MjQwNTAwMDEsIDB4YzAwNDU3YywgMHgyN2E2MDAxOCwgMHgyNDA0MDAwMSwKLTB4MjQwNTAwMDEsIDB4YzAwNDU3YywgMHgyN2E2MDAxOCwgMHg5N2EyMDAxOCwKLTB4MzA0MjAwMDQsIDB4MTA0MDAwZDksIDB4M2MxMTQwMDAsIDB4M2MwMjAwMDEsCi0weDhjNDI2ZjQwLCAweDI0NDNmZmZmLCAweDJjNjIwMDA2LCAweDEwNDAwMGQ5LAotMHgzMTA4MCwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4OGMyMjZjNjgsCi0weDQwMDAwOCwgMHgwLCAweDI0MDQwMDAxLCAweDI0MDUwMDExLAotMHgyN2IwMDAxYSwgMHhjMDA0NTdjLCAweDIwMDMwMjEsIDB4MjQwNDAwMDEsCi0weDI0MDUwMDExLCAweGMwMDQ1N2MsIDB4MjAwMzAyMSwgMHg5N2EzMDAxYSwKLTB4MzA2MjQwMDAsIDB4MTA0MDAwMDIsIDB4M2MxNTAwMTAsIDB4M2MxNTAwMDgsCi0weDMwNjI4MDAwLCAweDEwNDAwMGFhLCAweDNjMTMwMDAxLCAweDEwMDAwMGE4LAotMHgzYzEzMDAwMiwgMHgyNDA0MDAwMSwgMHgyNDA1MDAxNCwgMHgyN2IwMDAxYSwKLTB4YzAwNDU3YywgMHgyMDAzMDIxLCAweDI0MDQwMDAxLCAweDI0MDUwMDE0LAotMHhjMDA0NTdjLCAweDIwMDMwMjEsIDB4OTdhMzAwMWEsIDB4MzA2MjEwMDAsCi0weDEwNDAwMDAyLCAweDNjMTUwMDEwLCAweDNjMTUwMDA4LCAweDMwNjIwODAwLAotMHgxMDQwMDA5NywgMHgzYzEzMDAwMSwgMHgxMDAwMDA5NSwgMHgzYzEzMDAwMiwKLTB4MjQwNDAwMDEsIDB4MjQwNTAwMTksIDB4MjdiMDAwMWMsIDB4YzAwNDU3YywKLTB4MjAwMzAyMSwgMHgyNDA0MDAwMSwgMHgyNDA1MDAxOSwgMHhjMDA0NTdjLAotMHgyMDAzMDIxLCAweDk3YTIwMDFjLCAweDMwNDMwNzAwLCAweDI0MDIwNDAwLAotMHgxMDYyMDAyNywgMHgyODYyMDQwMSwgMHgxMDQwMDAwZSwgMHgyNDAyMDIwMCwKLTB4MTA2MjAwMWYsIDB4Mjg2MjAyMDEsIDB4MTA0MDAwMDUsIDB4MjQwMjAxMDAsCi0weDUwNjIwMDFlLCAweDNjMTMwMDAxLCAweDEwMDAwMDFlLCAweDI0MDQwMDAxLAotMHgyNDAyMDMwMCwgMHg1MDYyMDAxOSwgMHgzYzEzMDAwMiwgMHgxMDAwMDAxOSwKLTB4MjQwNDAwMDEsIDB4MjQwMjA2MDAsIDB4MTA2MjAwMGQsIDB4Mjg2MjA2MDEsCi0weDEwNDAwMDA1LCAweDI0MDIwNTAwLCAweDUwNjIwMDBiLCAweDNjMTMwMDAyLAotMHgxMDAwMDAxMCwgMHgyNDA0MDAwMSwgMHgyNDAyMDcwMCwgMHgxNDYyMDAwZCwKLTB4MjQwNDAwMDEsIDB4M2MxMzAwMDQsIDB4MTAwMDAwMGEsIDB4M2MxNTAwMDgsCi0weDEwMDAwMDA2LCAweDNjMTMwMDA0LCAweDEwMDAwMDA1LCAweDNjMTUwMDA4LAotMHgzYzEzMDAwMSwgMHgxMDAwMDAwMiwgMHgzYzE1MDAwOCwgMHgzYzE1MDAxMCwKLTB4MjQwNDAwMDEsIDB4MjQwNTAwMTgsIDB4MjdiMDAwMWUsIDB4YzAwNDU3YywKLTB4MjAwMzAyMSwgMHgyNDA0MDAwMSwgMHgyNDA1MDAxOCwgMHhjMDA0NTdjLAotMHgyMDAzMDIxLCAweDhmYTgwMDJjLCAweDk3YTcwMDFlLCAweDgxMTQwLAotMHgzYzA2MDAwMiwgMHhjMjMwMjEsIDB4OGNjNjhmZjQsIDB4OTdhMjAwMjIsCi0weDNjMTAwMDAxLCAweDI2MTA2YzVjLCAweDIwMDIwMjEsIDB4YWZhMjAwMTAsCi0weDk3YTIwMDFjLCAweDNjMDUwMDBjLCAweDM0YTUwMzAzLCAweGMwMDJiM2IsCi0weGFmYTIwMDE0LCAweDNjMDIwMDA0LCAweDE2NjIwMDEwLCAweDNjMDIwMDAxLAotMHg4Zjg0MDA1NCwgMHgyNDAzMDAwMSwgMHgyNDAyMDAwMiwgMHgzYzAxMDAwMSwKLTB4YWMyMzZkOWMsIDB4M2MwMTAwMDEsIDB4YWMyMjZkOTgsIDB4M2MwMTAwMDEsCi0weGFjMjM2ZGE0LCAweDNjMDEwMDAxLCAweGFjMjM2ZTI0LCAweDNjMDEwMDAxLAotMHhhYzI0NmYzMCwgMHgxMDAwMDA0ZiwgMHgyYjM4ODI1LCAweDE2NjIwMDM5LAotMHgzYzAyODAwMCwgMHgzYzAyMDAwMSwgMHg4YzQyNmUyMCwgMHgxNDQwMDAxZSwKLTB4MjQwNDAwMTgsIDB4MjAyMSwgMHgyODIxLCAweGMwMDRkZGIsCi0weDM0MDY4MDAwLCAweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDJiMzg4MjUsCi0weDEwMDAwMDAyLCAweDI0NjMwMDMyLCAweDhmODIwMDU0LCAweDYyMTAyMywKLTB4MmM0MjAwMzMsIDB4MTQ0MGZmZmMsIDB4MCwgMHg4ZjgzMDA1NCwKLTB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMjZlMjAsIDB4M2MwMTAwMDEsCi0weGFjMjI2ZDljLCAweDNjMDEwMDAxLCAweGFjMjI2ZDk4LCAweDNjMDEwMDAxLAotMHhhYzIyNmRhNCwgMHgzYzAxMDAwMSwgMHhhYzIyNmUyNCwgMHgzYzAxMDAwMSwKLTB4MTAwMDAwMmMsIDB4YWMyMzZmMzAsIDB4MjgyMSwgMHhjMDA0ZGRiLAotMHgyNDA2MDQwNCwgMHgyMDIxLCAweDI0MDUwMDFlLCAweDI3YTYwMDE4LAotMHgyNDAyMDAwMiwgMHhjMDA0NWJlLCAweGE3YTIwMDE4LCAweDIwMjEsCi0weDI4MjEsIDB4MjdhNjAwMTgsIDB4YzAwNDViZSwgMHhhN2EwMDAxOCwKLTB4MjQwNDAwMTgsIDB4MjQwNTAwMDIsIDB4YzAwNGRkYiwgMHgyNDA2MDAwNCwKLTB4M2MwMjgwMDAsIDB4MjIyMTAyNSwgMHgyYjMxODI1LCAweDEwMDAwMDE1LAotMHg0Mzg4MjUsIDB4MjIyMTAyNSwgMHgyNzUxODI1LCAweDQzODgyNSwKLTB4MjAwMjAyMSwgMHg5N2E2MDAxYywgMHgzYzA3MDAwMSwgMHg4Y2U3NmQ5OCwKLTB4M2MwNTAwMGMsIDB4MzRhNTAzMjYsIDB4YWZiMzAwMTAsIDB4YzAwMmIzYiwKLTB4YWZiMTAwMTQsIDB4MTAwMDAwMDcsIDB4MCwgMHgzYzExMDAwMiwKLTB4MjMwODgyMSwgMHg4ZTMxOGZmYywgMHgzYzAyN2ZmZiwgMHgzNDQyZmZmZiwKLTB4MjIyODgyNCwgMHgzYzAyMDAwMSwgMHg4YzQyNmRhOCwgMHgxMDQwMDAxZSwKLTB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNmYxYywgMHgxMDQwMDAwMiwKLTB4M2MwMjIwMDAsIDB4MjIyODgyNSwgMHg4ZmE4MDAyYywgMHg4MTE0MCwKLTB4M2MwMTAwMDIsIDB4MjIwODIxLCAweDhjMjI5MDAwLCAweDEwNDAwMDAzLAotMHgzYzAyMDAyMCwgMHgxMDAwMDAwNSwgMHgyMjI4ODI1LCAweDNjMDJmZmRmLAotMHgzNDQyZmZmZiwgMHgyMjI4ODI0LCAweDhmYTgwMDJjLCAweDgxMTQwLAotMHgzYzAxMDAwMiwgMHgyMjA4MjEsIDB4OGMyMjkwMDgsIDB4MTA0MDAwMDMsCi0weDNjMDIwMDgwLCAweDEwMDAwMDA0LCAweDIyMjg4MjUsIDB4M2MwMmZmN2YsCi0weDM0NDJmZmZmLCAweDIyMjg4MjQsIDB4OGZhODAwMmMsIDB4ODExNDAsCi0weDNjMDEwMDAyLCAweDIyMDgyMSwgMHhhYzMxOGZmNCwgMHgxMDAwMDEzNSwKLTB4MjIwMTAyMSwgMHg4ZmE4MDAyYywgMHg4ZjE0MCwgMHgzYzAzMDAwMiwKLTB4N2UxODIxLCAweDhjNjM4ZmY4LCAweDNjMDI0MDAwLCAweDYyMTAyNCwKLTB4MTQ0MDAwMDksIDB4MjQwNDAwMDEsIDB4M2MwMjdmZmYsIDB4MzQ0MmZmZmYsCi0weDYyODgyNCwgMHgzYzAxMDAwMiwgMHgzZTA4MjEsIDB4YWMzMThmZjAsCi0weDEwMDAwMTI0LCAweDIyMDEwMjEsIDB4MjgyMSwgMHhjMDA0NTdjLAotMHgyN2E2MDAxOCwgMHgyNDA0MDAwMSwgMHgyODIxLCAweGMwMDQ1N2MsCi0weDI3YTYwMDE4LCAweDI0MDQwMDAxLCAweDI0MDUwMDAxLCAweDI3YjIwMDIwLAotMHhjMDA0NTdjLCAweDI0MDMwMjEsIDB4MjQwNDAwMDEsIDB4MjQwNTAwMDEsCi0weGMwMDQ1N2MsIDB4MjQwMzAyMSwgMHgyNDA0MDAwMSwgMHgyNDA1MDAwNCwKLTB4MjdiMTAwMWUsIDB4YzAwNDU3YywgMHgyMjAzMDIxLCAweDI0MDQwMDAxLAotMHgyNDA1MDAwNCwgMHhjMDA0NTdjLCAweDIyMDMwMjEsIDB4MjQwNDAwMDEsCi0weDI0MDUwMDA1LCAweDI3YjAwMDIyLCAweGMwMDQ1N2MsIDB4MjAwMzAyMSwKLTB4MjQwNDAwMDEsIDB4MjQwNTAwMDUsIDB4YzAwNDU3YywgMHgyMDAzMDIxLAotMHgyNDA0MDAwMSwgMHgyNDA1MDAxMCwgMHhjMDA0NTdjLCAweDI3YTYwMDE4LAotMHgyNDA0MDAwMSwgMHgyNDA1MDAxMCwgMHhjMDA0NTdjLCAweDI3YTYwMDE4LAotMHgyNDA0MDAwMSwgMHgyNDA1MDAwYSwgMHhjMDA0NTdjLCAweDI0MDMwMjEsCi0weDI0MDQwMDAxLCAweDI0MDUwMDBhLCAweGMwMDQ1N2MsIDB4MjQwMzAyMSwKLTB4MjQwNDAwMDEsIDB4MjQwNTAwMTgsIDB4YzAwNDU3YywgMHgyMjAzMDIxLAotMHgyNDA0MDAwMSwgMHgyNDA1MDAxOCwgMHhjMDA0NTdjLCAweDIyMDMwMjEsCi0weDI0MDQwMDAxLCAweDI0MDUwMDAxLCAweGMwMDQ1N2MsIDB4MjdhNjAwMTgsCi0weDI0MDQwMDAxLCAweDI0MDUwMDAxLCAweGMwMDQ1N2MsIDB4MjdhNjAwMTgsCi0weDk3YTIwMDE4LCAweDMwNDIwMDA0LCAweDEwNDAwMDY2LCAweDNjMTE0MDAwLAotMHgzYzAzMDAwMSwgMHg4YzYzNmYzNCwgMHgyNDAyMDAwNSwgMHgxNDYyMDA2NywKLTB4MjQwNDAwMDEsIDB4MjQwNTAwMTksIDB4MjdiMDAwMWMsIDB4YzAwNDU3YywKLTB4MjAwMzAyMSwgMHgyNDA0MDAwMSwgMHgyNDA1MDAxOSwgMHhjMDA0NTdjLAotMHgyMDAzMDIxLCAweDk3YTIwMDFjLCAweDMwNDMwNzAwLCAweDI0MDIwNDAwLAotMHgxMDYyMDAyNywgMHgyODYyMDQwMSwgMHgxMDQwMDAwZSwgMHgyNDAyMDIwMCwKLTB4MTA2MjAwMWYsIDB4Mjg2MjAyMDEsIDB4MTA0MDAwMDUsIDB4MjQwMjAxMDAsCi0weDUwNjIwMDFlLCAweDNjMTMwMDAxLCAweDEwMDAwMDFlLCAweDNjMDIwMDA0LAotMHgyNDAyMDMwMCwgMHg1MDYyMDAxOSwgMHgzYzEzMDAwMiwgMHgxMDAwMDAxOSwKLTB4M2MwMjAwMDQsIDB4MjQwMjA2MDAsIDB4MTA2MjAwMGQsIDB4Mjg2MjA2MDEsCi0weDEwNDAwMDA1LCAweDI0MDIwNTAwLCAweDUwNjIwMDBiLCAweDNjMTMwMDAyLAotMHgxMDAwMDAxMCwgMHgzYzAyMDAwNCwgMHgyNDAyMDcwMCwgMHgxNDYyMDAwZCwKLTB4M2MwMjAwMDQsIDB4M2MxMzAwMDQsIDB4MTAwMDAwMGEsIDB4M2MxNTAwMDgsCi0weDEwMDAwMDA2LCAweDNjMTMwMDA0LCAweDEwMDAwMDA1LCAweDNjMTUwMDA4LAotMHgzYzEzMDAwMSwgMHgxMDAwMDAwMiwgMHgzYzE1MDAwOCwgMHgzYzE1MDAxMCwKLTB4M2MwMjAwMDQsIDB4MTI2MjAwMTcsIDB4M2MwMjgwMDAsIDB4OGY4MjAwNTQsCi0weDI0MTAwMDAxLCAweDNjMDEwMDAxLCAweGFjMzA2ZDljLCAweDNjMDEwMDAxLAotMHhhYzMwNmQ5OCwgMHgzYzAxMDAwMSwgMHhhYzMwNmRhNCwgMHgzYzAxMDAwMSwKLTB4YWMzMDZlMjQsIDB4M2MwMTAwMDEsIDB4YWMyMjZmMzAsIDB4M2MwMjAwMDEsCi0weDE2NjIwMDIyLCAweDI3NTg4MjUsIDB4MjAyMSwgMHgyODIxLAotMHhjMDA0ZGRiLCAweDM0MDY4MDAwLCAweDNjMDEwMDAxLCAweDEwMDAwMDFiLAotMHhhYzMwNmUyMCwgMHgyMjIxMDI1LCAweDJiMzE4MjUsIDB4NDM4ODI1LAotMHg5N2E2MDAxYywgMHgzYzAyMDAwMSwgMHg4YzQyNmYxYywgMHgzYzA3MDAwMSwKLTB4OGNlNzZkOTgsIDB4M2MwNDAwMDEsIDB4MjQ4NDZjNWMsIDB4YWZhMjAwMTAsCi0weDk3YTIwMDFlLCAweDNjMDUwMDBjLCAweDM0YTUwMzIzLCAweDNjMDEwMDAxLAotMHhhYzIwNmUyMCwgMHhjMDAyYjNiLCAweGFmYTIwMDE0LCAweDEwMDAwMDA3LAotMHgwLCAweDNjMTEwMDAyLCAweDIzZTg4MjEsIDB4OGUzMThmZjAsCi0weDNjMDI3ZmZmLCAweDM0NDJmZmZmLCAweDIyMjg4MjQsIDB4M2MwMjAwMDEsCi0weDhjNDI2ZGE4LCAweDEwNDAwMDY5LCAweDAsIDB4M2MwMjAwMDEsCi0weDhjNDI2ZjFjLCAweDEwNDAwMDAyLCAweDNjMDIyMDAwLCAweDIyMjg4MjUsCi0weDhmYTgwMDJjLCAweDgxMTQwLCAweDNjMDEwMDAyLCAweDIyMDgyMSwKLTB4OGMyMjkwMDQsIDB4MTA0MDAwMDMsIDB4M2MwMjAwMjAsIDB4MTAwMDAwMDUsCi0weDIyMjg4MjUsIDB4M2MwMmZmZGYsIDB4MzQ0MmZmZmYsIDB4MjIyODgyNCwKLTB4OGZhODAwMmMsIDB4ODExNDAsIDB4M2MwMTAwMDIsIDB4MjIwODIxLAotMHg4YzIyOTAwYywgMHgxMDQwMDAwMywgMHgzYzAyMDA4MCwgMHgxMDAwMDA0ZiwKLTB4MjIyODgyNSwgMHgzYzAyZmY3ZiwgMHgzNDQyZmZmZiwgMHgxMDAwMDA0YiwKLTB4MjIyODgyNCwgMHg4ZmE4MDAyYywgMHg4Mjk0MCwgMHgzYzAzMDAwMiwKLTB4NjUxODIxLCAweDhjNjM4ZmY4LCAweDNjMDI0MDAwLCAweDYyMTAyNCwKLTB4MTQ0MDAwMDgsIDB4M2MwMjdmZmYsIDB4MzQ0MmZmZmYsIDB4NjI4ODI0LAotMHgzYzAxMDAwMiwgMHgyNTA4MjEsIDB4YWMzMThmZjAsIDB4MTAwMDAwNDEsCi0weDIyMDEwMjEsIDB4M2MwMjAwMDEsIDB4OGM0MjZkYTgsIDB4MTA0MDAwMzQsCi0weDNjMTFjMDBjLCAweDNjMDIwMDAxLCAweDhjNDI2ZTQ0LCAweDNjMDRjMDBjLAotMHgzNDg0MjAwMCwgMHgzYzAzMDAwMSwgMHg4YzYzNmYxYywgMHgyMTAyYiwKLTB4MjEwMjMsIDB4NDQxMDI0LCAweDEwNjAwMDAzLCAweDUxODgyNSwKLTB4M2MwMjIwMDAsIDB4MjIyODgyNSwgMHgzYzAyMDAwMiwgMHg0NTEwMjEsCi0weDhjNDI5MDA0LCAweDEwNDAwMDAzLCAweDNjMDIwMDIwLCAweDEwMDAwMDA0LAotMHgyMjI4ODI1LCAweDNjMDJmZmRmLCAweDM0NDJmZmZmLCAweDIyMjg4MjQsCi0weDhmYTgwMDJjLCAweDgxMTQwLCAweDNjMDEwMDAyLCAweDIyMDgyMSwKLTB4OGMyMjkwMGMsIDB4MTA0MDAwMDMsIDB4M2MwMjAwODAsIDB4MTAwMDAwMDQsCi0weDIyMjg4MjUsIDB4M2MwMmZmN2YsIDB4MzQ0MmZmZmYsIDB4MjIyODgyNCwKLTB4M2MwMjAwMDEsIDB4OGM0MjZlMzAsIDB4MTA0MDAwMDIsIDB4M2MwMjA4MDAsCi0weDIyMjg4MjUsIDB4M2MwMjAwMDEsIDB4OGM0MjZlMzQsIDB4MTA0MDAwMDIsCi0weDNjMDIwNDAwLCAweDIyMjg4MjUsIDB4M2MwMjAwMDEsIDB4OGM0MjZlMzgsCi0weDEwNDAwMDA2LCAweDNjMDIwMTAwLCAweDEwMDAwMDA0LCAweDIyMjg4MjUsCi0weDNjMDI3ZmZmLCAweDM0NDJmZmZmLCAweDYyODgyNCwgMHg4ZmE4MDAyYywKLTB4ODExNDAsIDB4M2MwMTAwMDIsIDB4MjIwODIxLCAweGFjMzE4ZmYwLAotMHgyMjAxMDIxLCAweDhmYmYwMDQ4LCAweDhmYmUwMDQ0LCAweDhmYjUwMDQwLAotMHg4ZmIzMDAzYywgMHg4ZmIyMDAzOCwgMHg4ZmIxMDAzNCwgMHg4ZmIwMDAzMCwKLTB4M2UwMDAwOCwgMHgyN2JkMDA1MCwgMHgyN2JkZmZkMCwgMHhhZmIyMDAyOCwKLTB4ODA5MDIxLCAweGFmYmYwMDJjLCAweGFmYjEwMDI0LCAweGFmYjAwMDIwLAotMHg4Zjg0MDIwMCwgMHgzYzEwMDAwMSwgMHg4ZTEwNmQ5OCwgMHg4Zjg2MDIyMCwKLTB4MjQwMjAwMDIsIDB4MTIwMjAwNWMsIDB4MmUwMjAwMDMsIDB4MTA0MDAwMDUsCi0weDI0MDIwMDAxLCAweDEyMDIwMDBhLCAweDEyMTk0MCwgMHgxMDAwMDEwYywKLTB4MCwgMHgyNDAyMDAwNCwgMHgxMjAyMDBiZiwgMHgyNDAyMDAwOCwKLTB4MTIwMjAwYmUsIDB4MTI4OTQwLCAweDEwMDAwMTA1LCAweDAsCi0weDNjMDUwMDAyLCAweGEzMjgyMSwgMHg4Y2E1OGZmYywgMHgzYzEwMDAwMiwKLTB4MjAzODAyMSwgMHg4ZTEwOGZmNCwgMHgzYzAyNDAwMCwgMHhhMjEwMjQsCi0weDEwNDAwMDM4LCAweDNjMDIwMDA4LCAweDIwMjEwMjQsIDB4MTA0MDAwMjAsCi0weDM0ODQwMDAyLCAweDNjMDIwMDAyLCAweDQzMTAyMSwgMHg4YzQyOTAwMCwKLTB4MTA0MDAwMDUsIDB4MzQ4NDAwMjAsIDB4MzQ4NDAxMDAsIDB4M2MwMjAwMjAsCi0weDEwMDAwMDA2LCAweDIwMjgwMjUsIDB4MjQwMmZlZmYsIDB4ODIyMDI0LAotMHgzYzAyZmZkZiwgMHgzNDQyZmZmZiwgMHgyMDI4MDI0LCAweDEyMTE0MCwKLTB4M2MwMTAwMDIsIDB4MjIwODIxLCAweDhjMjI5MDA4LCAweDEwNDAwMDA1LAotMHgzYzAyMDAwMSwgMHhjMjMwMjUsIDB4M2MwMjAwODAsIDB4MTAwMDAwMTYsCi0weDIwMjgwMjUsIDB4M2MwMmZmZmUsIDB4MzQ0MmZmZmYsIDB4YzIzMDI0LAotMHgzYzAyZmY3ZiwgMHgzNDQyZmZmZiwgMHgxMDAwMDAwZiwgMHgyMDI4MDI0LAotMHgyNDAyZmVkZiwgMHg4MjIwMjQsIDB4M2MwMmZmZmUsIDB4MzQ0MmZmZmYsCi0weGMyMzAyNCwgMHgzYzAyZmY1ZiwgMHgzNDQyZmZmZiwgMHgyMDI4MDI0LAotMHgzYzAxMDAwMiwgMHgyMzA4MjEsIDB4YWMyMDkwMDAsIDB4M2MwMTAwMDIsCi0weDIzMDgyMSwgMHhhYzIwOTAwOCwgMHhhZjg0MDIwMCwgMHhhZjg2MDIyMCwKLTB4OGY4MjAyMjAsIDB4MzQ0MjAwMDIsIDB4YWY4MjAyMjAsIDB4MTAwMDAwMGEsCi0weDEyMTE0MCwgMHgzYzAyYmZmZiwgMHgzNDQyZmZmZiwgMHg4ZjgzMDIwMCwKLTB4MjAyODAyNCwgMHgyNDAyZmZmZCwgMHg2MjE4MjQsIDB4YzAwM2RhZiwKLTB4YWY4MzAyMDAsIDB4MTIxMTQwLCAweDNjMDEwMDAyLCAweDIyMDgyMSwKLTB4MTAwMDAwYjcsIDB4YWMzMDhmZjQsIDB4M2MwMjAwMDEsIDB4OGM0MjZmMWMsCi0weDEwNDAwMDY5LCAweDI0MDUwMDA0LCAweDI0MDQwMDAxLCAweGMwMDQ1N2MsCi0weDI3YTYwMDE4LCAweDI0MDQwMDAxLCAweDI0MDUwMDA1LCAweGMwMDQ1N2MsCi0weDI3YTYwMDFhLCAweDk3YTMwMDE4LCAweDk3YTIwMDFhLCAweDNjMDQwMDAxLAotMHgyNDg0NmU0OCwgMHgzMDYzMGMwMCwgMHgzMWE4MiwgMHgzMDQyMGMwMCwKLTB4MjEyODIsIDB4YTdhMjAwMWEsIDB4MjEwODAsIDB4NDQxMDIxLAotMHg0MzEwMjEsIDB4YTdhMzAwMTgsIDB4OTA0ODAwMDAsIDB4MjQwMjAwMDEsCi0weDMxMDNmZmZmLCAweDEwNjIwMDI5LCAweDI4NjIwMDAyLCAweDEwNDAwMDA1LAotMHgwLCAweDEwNjAwMDA5LCAweDAsIDB4MTAwMDAwM2QsCi0weDAsIDB4MTA3MDAwMTMsIDB4MjQwMjAwMDMsIDB4MTA2MjAwMmMsCi0weDAsIDB4MTAwMDAwMzcsIDB4MCwgMHg4ZjgyMDIwMCwKLTB4MjQwM2ZlZmYsIDB4NDMxMDI0LCAweGFmODIwMjAwLCAweDhmODIwMjIwLAotMHgzYzAzZmZmZSwgMHgzNDYzZmZmZiwgMHg0MzEwMjQsIDB4YWY4MjAyMjAsCi0weDNjMDEwMDAyLCAweGFjMjA5MDA0LCAweDNjMDEwMDAyLCAweDEwMDAwMDMyLAotMHhhYzIwOTAwYywgMHg4ZjgyMDIwMCwgMHgzNDQyMDEwMCwgMHhhZjgyMDIwMCwKLTB4OGY4MjAyMjAsIDB4M2MwM2ZmZmUsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LAotMHhhZjgyMDIyMCwgMHgyNDAyMDEwMCwgMHgzYzAxMDAwMiwgMHhhYzIyOTAwNCwKLTB4M2MwMTAwMDIsIDB4MTAwMDAwMjQsIDB4YWMyMDkwMGMsIDB4OGY4MjAyMDAsCi0weDI0MDNmZWZmLCAweDQzMTAyNCwgMHhhZjgyMDIwMCwgMHg4ZjgyMDIyMCwKLTB4M2MwMzAwMDEsIDB4NDMxMDI1LCAweGFmODIwMjIwLCAweDNjMDEwMDAyLAotMHhhYzIwOTAwNCwgMHgzYzAxMDAwMiwgMHgxMDAwMDAxNywgMHhhYzIzOTAwYywKLTB4OGY4MjAyMDAsIDB4MzQ0MjAxMDAsIDB4YWY4MjAyMDAsIDB4OGY4MjAyMjAsCi0weDNjMDMwMDAxLCAweDQzMTAyNSwgMHhhZjgyMDIyMCwgMHgyNDAyMDEwMCwKLTB4M2MwMTAwMDIsIDB4YWMyMjkwMDQsIDB4M2MwMTAwMDIsIDB4MTAwMDAwMGEsCi0weGFjMjM5MDBjLCAweDNjMDQwMDAxLCAweDI0ODQ2YzgwLCAweDk3YTYwMDFhLAotMHg5N2E3MDAxOCwgMHgzYzA1MDAwMSwgMHgzNGE1ZmZmZiwgMHhhZmE4MDAxMCwKLTB4YzAwMmIzYiwgMHhhZmEwMDAxNCwgMHg4ZjgyMDIwMCwgMHgzNDQyMDAwMiwKLTB4MTAwMDAwNGIsIDB4YWY4MjAyMDAsIDB4MTI4OTQwLCAweDNjMDUwMDAyLAotMHhiMTI4MjEsIDB4OGNhNThmZjgsIDB4M2MxMDAwMDIsIDB4MjExODAyMSwKLTB4OGUxMDhmZjAsIDB4M2MwMjQwMDAsIDB4YTIxMDI0LCAweDE0NDAwMDEwLAotMHgwLCAweDNjMDIwMDAxLCAweDhjNDI2ZjFjLCAweDE0NDAwMDA1LAotMHgzYzAyYmZmZiwgMHg4ZjgyMDIwMCwgMHgzNDQyMDAwMiwgMHhhZjgyMDIwMCwKLTB4M2MwMmJmZmYsIDB4MzQ0MmZmZmYsIDB4YzAwM2RhZiwgMHgyMDI4MDI0LAotMHgzYzAxMDAwMiwgMHgzMTA4MjEsIDB4MTAwMDAwMzEsIDB4YWMzMDhmZjAsCi0weDNjMDIwMDAxLCAweDhjNDI2ZjFjLCAweDEwNDAwMDA1LCAweDNjMDIwMDIwLAotMHgzYzAyMDAwMSwgMHg4YzQyNmU0NCwgMHgxMDQwMDAyNSwgMHgzYzAyMDAyMCwKLTB4YTIxMDI0LCAweDEwNDAwMDA3LCAweDM0ODQwMDIwLCAweDI0MDIwMTAwLAotMHgzYzAxMDAwMiwgMHgzMTA4MjEsIDB4YWMyMjkwMDQsIDB4MTAwMDAwMDYsCi0weDM0ODQwMTAwLCAweDNjMDEwMDAyLCAweDMxMDgyMSwgMHhhYzIwOTAwNCwKLTB4MjQwMmZlZmYsIDB4ODIyMDI0LCAweDNjMDIwMDgwLCAweGEyMTAyNCwKLTB4MTA0MDAwMDcsIDB4MTIxOTQwLCAweDNjMDIwMDAxLCAweDNjMDEwMDAyLAotMHgyMzA4MjEsIDB4YWMyMjkwMGMsIDB4MTAwMDAwMDgsIDB4YzIzMDI1LAotMHgxMjExNDAsIDB4M2MwMTAwMDIsIDB4MjIwODIxLCAweGFjMjA5MDBjLAotMHgzYzAyZmZmZSwgMHgzNDQyZmZmZiwgMHhjMjMwMjQsIDB4YWY4NDAyMDAsCi0weGFmODYwMjIwLCAweDhmODIwMjIwLCAweDM0NDIwMDAyLCAweGFmODIwMjIwLAotMHgxMjExNDAsIDB4M2MwMTAwMDIsIDB4MjIwODIxLCAweGFjMzA4ZmYwLAotMHg4ZmJmMDAyYywgMHg4ZmIyMDAyOCwgMHg4ZmIxMDAyNCwgMHg4ZmIwMDAyMCwKLTB4M2UwMDAwOCwgMHgyN2JkMDAzMCwgMHgwLCAweDE4MjEsCi0weDMwODQwMGZmLCAweDI0MDVmZmRmLCAweDI0MDZmZmJmLCAweDY0MTAwNywKLTB4MzA0MjAwMDEsIDB4MTA0MDAwMDQsIDB4MCwgMHg4ZjgyMDA0NCwKLTB4MTAwMDAwMDMsIDB4MzQ0MjAwNDAsIDB4OGY4MjAwNDQsIDB4NDYxMDI0LAotMHhhZjgyMDA0NCwgMHg4ZjgyMDA0NCwgMHgzNDQyMDAyMCwgMHhhZjgyMDA0NCwKLTB4OGY4MjAwNDQsIDB4NDUxMDI0LCAweGFmODIwMDQ0LCAweDI0NjMwMDAxLAotMHgyODYyMDAwOCwgMHg1NDQwZmZlZSwgMHg2NDEwMDcsIDB4M2UwMDAwOCwKLTB4MCwgMHgyYzgyMDAwOCwgMHgxMDQwMDAxYiwgMHgwLAotMHgyNDA1ZmZkZiwgMHgyNDA2ZmZiZiwgMHg0MTg4MCwgMHgzYzAyMDAwMSwKLTB4MjQ0MjZlNjAsIDB4NjIxODIxLCAweDI0NjQwMDA0LCAweDkwNjIwMDAwLAotMHgxMDQwMDAwNCwgMHgwLCAweDhmODIwMDQ0LCAweDEwMDAwMDAzLAotMHgzNDQyMDA0MCwgMHg4ZjgyMDA0NCwgMHg0NjEwMjQsIDB4YWY4MjAwNDQsCi0weDhmODIwMDQ0LCAweDM0NDIwMDIwLCAweGFmODIwMDQ0LCAweDhmODIwMDQ0LAotMHg0NTEwMjQsIDB4YWY4MjAwNDQsIDB4MjQ2MzAwMDEsIDB4NjQxMDJiLAotMHgxNDQwZmZlZSwgMHgwLCAweDNlMDAwMDgsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4OGY4NDAwYzQsCi0weDhmODYwMGUwLCAweDhmODcwMGU0LCAweDI0MDJmZmY4LCAweGMyMjgyNCwKLTB4MTBlNTAwMWEsIDB4Mjc2MjNmZjgsIDB4MTRlMjAwMDIsIDB4MjRlODAwMDgsCi0weDI3NjgzMDAwLCAweDU1MDUwMDA0LCAweDhkMGEwMDAwLCAweDMwYzIwMDA0LAotMHgxNDQwMDAxMiwgMHg4MDUwMjEsIDB4OGNlOTAwMDAsIDB4OGY0MjAxM2MsCi0weDE0OTQ4MjMsIDB4NDkxODJiLCAweDk0ZWIwMDA2LCAweDEwNjAwMDAyLAotMHgyNTYzMDA1MCwgMHg0OTQ4MjEsIDB4MTIzMTgyYiwgMHg1MDQwMDAwMywKLTB4OGY0MjAxZmMsIDB4M2UwMDAwOCwgMHhlMDEwMjEsIDB4YWY4ODAwZTgsCi0weDI0NDIwMDAxLCAweGFmNDIwMWZjLCAweGFmODgwMGU0LCAweDNlMDAwMDgsCi0weDEwMjEsIDB4M2UwMDAwOCwgMHgwLCAweDhmODMwMGU0LAotMHgyNzYyM2ZmOCwgMHgxMDYyMDAwNCwgMHgyNDYyMDAwOCwgMHhhZjgyMDBlOCwKLTB4M2UwMDAwOCwgMHhhZjgyMDBlNCwgMHgyNzYyMzAwMCwgMHhhZjgyMDBlOCwKLTB4M2UwMDAwOCwgMHhhZjgyMDBlNCwgMHgzZTAwMDA4LCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDhmODgwMTIwLAotMHgyNzYyNGZlMCwgMHg4ZjgzMDEyOCwgMHgxNTAyMDAwMiwgMHgyNTA5MDAyMCwKLTB4Mjc2OTQ4MDAsIDB4MTEyMzAwMTIsIDB4OGZhMjAwMTAsIDB4YWQwNDAwMDAsCi0weGFkMDUwMDA0LCAweGFkMDYwMDA4LCAweGE1MDcwMDBlLCAweDhmYTMwMDE0LAotMHhhZDAyMDAxOCwgMHg4ZmEyMDAxOCwgMHhhZDAzMDAxYywgMHgyNTAzMDAxNiwKLTB4YWQwMjAwMTAsIDB4YWQwMzAwMTQsIDB4YWY4OTAxMjAsIDB4OGY0MzAwZmMsCi0weDI0MDIwMDAxLCAweDI0NjNmZmZmLCAweDNlMDAwMDgsIDB4YWY0MzAwZmMsCi0weDhmNDMwMzI0LCAweDEwMjEsIDB4MjQ2MzAwMDEsIDB4M2UwMDAwOCwKLTB4YWY0MzAzMjQsIDB4M2UwMDAwOCwgMHgwLCAweDhmODgwMTAwLAotMHgyNzYyNDdlMCwgMHg4ZjgzMDEwOCwgMHgxNTAyMDAwMiwgMHgyNTA5MDAyMCwKLTB4Mjc2OTQwMDAsIDB4MTEyMzAwMGYsIDB4OGZhMjAwMTAsIDB4YWQwNDAwMDAsCi0weGFkMDUwMDA0LCAweGFkMDYwMDA4LCAweGE1MDcwMDBlLCAweDhmYTMwMDE0LAotMHhhZDAyMDAxOCwgMHg4ZmEyMDAxOCwgMHhhZDAzMDAxYywgMHgyNTAzMDAxNiwKLTB4YWQwMjAwMTAsIDB4YWQwMzAwMTQsIDB4YWY4OTAxMDAsIDB4M2UwMDAwOCwKLTB4MjQwMjAwMDEsIDB4OGY0MzAzMjgsIDB4MTAyMSwgMHgyNDYzMDAwMSwKLTB4M2UwMDAwOCwgMHhhZjQzMDMyOCwgMHgzZTAwMDA4LCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAgfTsKLXN0YXRpYyB1MzIgdGlnb24yRndSb2RhdGFbKE1BWF9ST0RBVEFfTEVOLzQpICsgMV0gX19kZXZpbml0ZGF0YSA9IHsKLTB4MjQ0ODY1NjEsIDB4NjQ2NTcyM2EsIDB4MjAyZjcwNzIsCi0weDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LAotMHgyZjJlMmY2ZSwgMHg2OTYzMmY2NiwgMHg3NzMyMmY2MywgMHg2ZjZkNmQ2ZiwKLTB4NmUyZjY2NzcsIDB4NmQ2MTY5NmUsIDB4MmU2MzJjNzYsIDB4MjAzMTJlMzEsCi0weDJlMzIyZTM0LCAweDM1MjAzMTM5LCAweDM5MzkyZjMwLCAweDMxMmYzMjM0LAotMHgyMDMwMzAzYSwgMHgzMTMwM2EzNSwgMHgzNTIwNzM2OCwgMHg3NTYxNmU2NywKLTB4MjA0NTc4NzAsIDB4MjAyNDAwMDAsIDB4NjU3Njc0NTIsIDB4NmU2NzQ2MDAsCi0weDUxNjU3Njc0LCAweDQ2MDAwMDAwLCAweDUxNjU3Njc0LCAweDUwNWY0NjAwLAotMHg0ZDY1NzY3NCwgMHg1MjZlNjc0NiwgMHgwLCAweDRkNTE2NTc2LAotMHg3NDQ2MDAwMCwgMHg0ZDUxNjU3NiwgMHg1MDVmNDYwMCwgMHg1MTczNDM2ZiwKLTB4NmU0OTVmNDYsIDB4MCwgMHg1MTczNDM2ZiwgMHg2ZTczNDYwMCwKLTB4NTE3MjUwNzIsIDB4NmY2NDQ2MDAsIDB4NjI2MTY0NGQsIDB4NjU2ZDUzN2EsCi0weDAsIDB4Njg3NzU2NjUsIDB4NzIwMDAwMDAsIDB4NjI2MTY0NDgsCi0weDc3NTY2NTcyLCAweDAsIDB4MmEyYTQ0NDEsIDB4NTc0ZTVmNDEsCi0weDAsIDB4NzQ3ODUyNzgsIDB4NDI2NjUzN2EsIDB4MCwKLTB4NjI2NjQxNzQsIDB4NmU0ZDcyNmIsIDB4MCwgMHg3MjY1NjQ1YSwKLTB4NmY2ZTY1MzEsIDB4MCwgMHg3MDYzNjk0MywgMHg2ZjZlNjYwMCwKLTB4Njc2NTZlNDMsIDB4NmY2ZTY2MDAsIDB4MmE2NDZkNjEsIDB4NTI0NDY2NmMsCi0weDAsIDB4MmE1MDQxNGUsIDB4NDk0MzJhMDAsIDB4MmUyZTJmMmUsCi0weDJlMmYyZTJlLCAweDJmMmUyZTJmLCAweDJlMmUyZjczLCAweDcyNjMyZjZlLAotMHg2OTYzMmY2NiwgMHg3NzMyMmY2MywgMHg2ZjZkNmQ2ZiwgMHg2ZTJmNjY3NywKLTB4NmQ2MTY5NmUsIDB4MmU2MzAwMDAsIDB4NzI2MzYyNDYsIDB4NmM2MTY3NzMsCi0weDAsIDB4NjI2MTY0NTIsIDB4Nzg1MjYzNjIsIDB4MCwKLTB4Njc2YzZmNjIsIDB4NDY2YzY3NzMsIDB4MCwgMHgyYjVmNjQ2OSwKLTB4NzM3MDVmNmMsIDB4NmY2ZjcwMDAsIDB4MmI2NTc2NWYsIDB4Njg2MTZlNjQsCi0weDZjNjU3MjAwLCAweDYzNjE2ZTc0LCAweDMxNDQ2ZDYxLCAweDAsCi0weDJiNzE1ZjY0LCAweDZkNjE1Zjc0LCAweDZmNWY2ZTY5LCAweDYzNWY2MzZiLAotMHg3Mzc1NmQwMCwgMHgyYjY4NWY3MywgMHg2NTZlNjQ1ZiwgMHg2NDYxNzQ2MSwKLTB4NWY3MjY1NjEsIDB4NjQ3OTVmNjMsIDB4NmI3Mzc1NmQsIDB4MCwKLTB4MmI2ODVmNjQsIDB4NmQ2MTVmNzIsIDB4NjQ1ZjYxNzMsIDB4NzM2OTczNzQsCi0weDVmNjM2YjczLCAweDc1NmQwMDAwLCAweDc0NDM2YjczLCAweDZkNGY2ZTAwLAotMHgyYjcxNWY2NCwgMHg2ZDYxNWY3NCwgMHg2ZjVmNmU2OSwgMHg2MzAwMDAwMCwKLTB4MmI2ODVmNzMsIDB4NjU2ZTY0NWYsIDB4NjQ2MTc0NjEsIDB4NWY3MjY1NjEsCi0weDY0NzkwMDAwLCAweDJiNjg1ZjY0LCAweDZkNjE1ZjcyLCAweDY0NWY2MTczLAotMHg3MzY5NzM3NCwgMHgwLCAweDc0NDM2YjczLCAweDZkNGY2NjY2LAotMHgwLCAweDJiNjg1ZjczLCAweDY1NmU2NDVmLCAweDYyNjQ1ZjcyLAotMHg2NTYxNjQ3OSwgMHgwLCAweDY4NzM3NDUzLCAweDUyNjk2ZTY3LAotMHgwLCAweDYyNjE2NDUzLCAweDUyNjk2ZTY3LCAweDAsCi0weDZlNjk2MzUzLCAweDUyNjk2ZTY3LCAweDAsIDB4Nzc0NDZkNjEsCi0weDQxNmM2YzQxLCAweDAsIDB4MmI3MTVmNjQsIDB4NmQ2MTVmNzQsCi0weDZmNWY2ODZmLCAweDczNzQ1ZjYzLCAweDZiNzM3NTZkLCAweDAsCi0weDJiNjg1ZjZkLCAweDYxNjM1ZjcyLCAweDc4NWY2MzZmLCAweDZkNzA1ZjYzLAotMHg2YjczNzU2ZCwgMHgwLCAweDJiNjg1ZjY0LCAweDZkNjE1Zjc3LAotMHg3MjVmNjE3MywgMHg3MzY5NzM3NCwgMHg1ZjYzNmI3MywgMHg3NTZkMDAwMCwKLTB4NzI0MzZiNzMsIDB4NmQ0ZjZlMDAsIDB4MmI3MTVmNjQsIDB4NmQ2MTVmNzQsCi0weDZmNWY2ODZmLCAweDczNzQwMDAwLCAweDJiNjg1ZjZkLCAweDYxNjM1ZjcyLAotMHg3ODVmNjM2ZiwgMHg2ZDcwMDAwMCwgMHgyYjY4NWY2NCwgMHg2ZDYxNWY3NywKLTB4NzI1ZjYxNzMsIDB4NzM2OTczNzQsIDB4MCwgMHg3MjQzNmI3MywKLTB4NmQ0ZjY2NjYsIDB4MCwgMHgyYjY4NWY3MiwgMHg2NTYzNzY1ZiwKLTB4NjI2NDVmNzIsIDB4NjU2MTY0NzksIDB4MCwgMHgyYjY4NWY3MiwKLTB4NjU2Mzc2NWYsIDB4NmE3NTZkNjIsIDB4NmY1ZjYyNjQsIDB4NWY3MjY1NjEsCi0weDY0NzkwMDAwLCAweDJiNjg1ZjcyLCAweDY1NjM3NjVmLCAweDZkNjk2ZTY5LAotMHg1ZjYyNjQ1ZiwgMHg3MjY1NjE2NCwgMHg3OTAwMDAwMCwgMHgyYjZkNjg1ZiwKLTB4NjM2ZjZkNmQsIDB4NjE2ZTY0MDAsIDB4MmI2ODVmNzQsIDB4Njk2ZDY1NzIsCi0weDAsIDB4MmI2ODVmNjQsIDB4NmY1Zjc1NzAsIDB4NjQ2MTc0NjUsCi0weDVmNzQ3ODVmLCAweDYzNmY2ZTczLCAweDAsIDB4MmI2ODVmNjQsCi0weDZmNWY3NTcwLCAweDY0NjE3NDY1LCAweDVmNzI3ODVmLCAweDcwNzI2ZjY0LAotMHgwLCAweDJiNjM2YjczLCAweDc1NmQzMTM2LCAweDAsCi0weDJiNzA2NTY1LCAweDZiNWY2ZDYxLCAweDYzNWY3Mjc4LCAweDVmNzc2MTAwLAotMHgyYjcwNjU2NSwgMHg2YjVmNmQ2MSwgMHg2MzVmNzI3OCwgMHgwLAotMHgyYjY0NjU3MSwgMHg1ZjZkNjE2MywgMHg1ZjcyNzgwMCwgMHgyYjY4NWY2ZCwKLTB4NjE2MzVmNzIsIDB4Nzg1ZjYxNzQsIDB4NzQ2ZTAwMDAsIDB4NjI2MTY0NTIsCi0weDY1NzQ1MzdhLCAweDAsIDB4NzI3ODQyNjQsIDB4NDI2NjUzN2EsCi0weDAsIDB4MmI2ZTc1NmMsIDB4NmM1ZjY4NjEsIDB4NmU2NDZjNjUsCi0weDcyMDAwMDAwLCAweDY2Nzc0ZjcwLCAweDQ2NjE2OTZjLCAweDAsCi0weDJiNjg1Zjc1LCAweDcwNjQ2MTc0LCAweDY1NWY2YzY1LCAweDY0MzQwMDAwLAotMHgyYjY4NWY3NSwgMHg3MDY0NjE3NCwgMHg2NTVmNmM2NSwgMHg2NDM2MDAwMCwKLTB4MmI2ODVmNzUsIDB4NzA2NDYxNzQsIDB4NjU1ZjZjNjUsIDB4NjQzMjAwMDAsCi0weDY5NmU3NDUzLCAweDc0NjE3NDY1LCAweDAsIDB4MmEyYTY5NmUsCi0weDY5NzQ0MzcwLCAweDAsIDB4MjM3MzYzNzIsIDB4NjU2MTZkMDAsCi0weDY5NTM3NDYxLCAweDYzNmI0NTcyLCAweDAsIDB4NzA3MjZmNjIsCi0weDY1NGQ2NTZkLCAweDAsIDB4MmEyYTQ0NDEsIDB4NTc0ZTVmNDIsCi0weDAsIDB4MmI3Mzc3NWYsIDB4NjQ2ZDYxNWYsIDB4NjE3MzczNjksCi0weDczNzQ1ZjcwLCAweDZjNzU3MzVmLCAweDc0Njk2ZDY1LCAweDcyMDAwMDAwLAotMHgyYjI2NzA3MiwgMHg2NTZjNmY2MSwgMHg2NDVmNzc3MiwgMHg1ZjY0NjU3MywKLTB4NjM3MjAwMDAsIDB4MmIyNjcwNzIsIDB4NjU2YzZmNjEsIDB4NjQ1ZjcyNjQsCi0weDVmNjQ2NTczLCAweDYzNzIwMDAwLCAweDJiNjg1ZjY4LCAweDY2NWY3NDY5LAotMHg2ZDY1NzIwMCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwKLTB4NmY2YTY1NjMsIDB4NzQ3MzJmNzIsIDB4NjM3MzJmNzMsIDB4NzcyZjY3NjUsCi0weDJmMmUyZjZlLCAweDY5NjMyZjY2LCAweDc3MzIyZjYzLCAweDZmNmQ2ZDZmLAotMHg2ZTJmNzQ2OSwgMHg2ZDY1NzIyZSwgMHg2MzJjNzYyMCwgMHgzMTJlMzEyZSwKLTB4MzIyZTMzMzUsIDB4MjAzMTM5MzksIDB4MzkyZjMwMzEsIDB4MmYzMjM3MjAsCi0weDMxMzkzYTMwLCAweDM5M2EzNTMwLCAweDIwNjg2MTc5LCAweDY1NzMyMDQ1LAotMHg3ODcwMjAyNCwgMHgwLCAweDY1NzY3NDUyLCAweDZlNjc0NjAwLAotMHg1MTY1NzY3NCwgMHg0NjAwMDAwMCwgMHg1MTY1NzY3NCwgMHg1MDVmNDYwMCwKLTB4NGQ2NTc2NzQsIDB4NTI2ZTY3NDYsIDB4MCwgMHg0ZDUxNjU3NiwKLTB4NzQ0NjAwMDAsIDB4NGQ1MTY1NzYsIDB4NTA1ZjQ2MDAsIDB4NTE3MzQzNmYsCi0weDZlNDk1ZjQ2LCAweDAsIDB4NTE3MzQzNmYsIDB4NmU3MzQ2MDAsCi0weDUxNzI1MDcyLCAweDZmNjQ0NjAwLCAweDU0MmQ0NDZkLCAweDYxNTI2NDMyLAotMHgwLCAweDU0MmQ0NDZkLCAweDYxNTI2NDMxLCAweDAsCi0weDU0MmQ0NDZkLCAweDYxNTI2NDQyLCAweDAsIDB4NTQyZDQ0NmQsCi0weDYxNTc3MjMyLCAweDAsIDB4NTQyZDQ0NmQsIDB4NjE1NzcyMzEsCi0weDAsIDB4NTQyZDQ0NmQsIDB4NjE1NzcyNDIsIDB4MCwKLTB4MCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwKLTB4NmY2YTY1NjMsIDB4NzQ3MzJmNzIsIDB4NjM3MzJmNzMsIDB4NzcyZjY3NjUsCi0weDJmMmUyZjZlLCAweDY5NjMyZjY2LCAweDc3MzIyZjYzLCAweDZmNmQ2ZDZmLAotMHg2ZTJmNjM2ZiwgMHg2ZDZkNjE2ZSwgMHg2NDJlNjMyYywgMHg3NjIwMzEyZSwKLTB4MzEyZTMyMmUsIDB4MzIzODIwMzEsIDB4MzkzOTM5MmYsIDB4MzAzMTJmMzIsCi0weDMwMjAzMTM5LCAweDNhMzQzOTNhLCAweDM0MzkyMDczLCAweDY4NzU2MTZlLAotMHg2NzIwNDU3OCwgMHg3MDIwMjQwMCwgMHg2NTc2NzQ1MiwgMHg2ZTY3NDYwMCwKLTB4NTE2NTc2NzQsIDB4NDYwMDAwMDAsIDB4NTE2NTc2NzQsIDB4NTA1ZjQ2MDAsCi0weDRkNjU3Njc0LCAweDUyNmU2NzQ2LCAweDAsIDB4NGQ1MTY1NzYsCi0weDc0NDYwMDAwLCAweDRkNTE2NTc2LCAweDUwNWY0NjAwLCAweDUxNzM0MzZmLAotMHg2ZTQ5NWY0NiwgMHgwLCAweDUxNzM0MzZmLCAweDZlNzM0NjAwLAotMHg1MTcyNTA3MiwgMHg2ZjY0NDYwMCwgMHgzZjQ4NjM2ZCwgMHg2NDRkNjI3OCwKLTB4MCwgMHgzZjYzNmQ2NCwgMHg0ODczNzQ1MywgMHgwLAotMHgzZjYzNmQ2NCwgMHg0ZDYzNGQ2NCwgMHgwLCAweDNmNjM2ZDY0LAotMHg1MDcyNmY2ZCwgMHgwLCAweDNmNjM2ZDY0LCAweDRjNjk2ZTZiLAotMHgwLCAweDNmNjM2ZDY0LCAweDQ1NzI3MjAwLCAweDg2YWMsCi0weDhlNWMsIDB4OGU1YywgMHg4ZGU0LCAweDhiNzgsCi0weDhlMzAsIDB4OGU1YywgMHg4NzkwLCAweDg4MDAsCi0weDg5OTAsIDB4OGE2OCwgMHg4YTM0LCAweDhlNWMsCi0weDg4NzAsIDB4OGIyNCwgMHg4ZTVjLCAweDhiMzQsCi0weDg3YjQsIDB4ODgyNCwgMHgwLCAweDAsCi0weDAsIDB4MjQ0ODY1NjEsIDB4NjQ2NTcyM2EsIDB4MjAyZjcwNzIsCi0weDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LAotMHgyZjJlMmY2ZSwgMHg2OTYzMmY2NiwgMHg3NzMyMmY2MywgMHg2ZjZkNmQ2ZiwKLTB4NmUyZjZkNjMsIDB4NjE3Mzc0MmUsIDB4NjMyYzc2MjAsIDB4MzEyZTMxMmUsCi0weDMyMmUzODIwLCAweDMxMzkzOTM4LCAweDJmMzEzMjJmLCAweDMwMzgyMDMwLAotMHgzMjNhMzMzNiwgMHgzYTMzMzYyMCwgMHg3MzY4NzU2MSwgMHg2ZTY3MjA0NSwKLTB4Nzg3MDIwMjQsIDB4MCwgMHg2NTc2NzQ1MiwgMHg2ZTY3NDYwMCwKLTB4NTE2NTc2NzQsIDB4NDYwMDAwMDAsIDB4NTE2NTc2NzQsIDB4NTA1ZjQ2MDAsCi0weDRkNjU3Njc0LCAweDUyNmU2NzQ2LCAweDAsIDB4NGQ1MTY1NzYsCi0weDc0NDYwMDAwLCAweDRkNTE2NTc2LCAweDUwNWY0NjAwLCAweDUxNzM0MzZmLAotMHg2ZTQ5NWY0NiwgMHgwLCAweDUxNzM0MzZmLCAweDZlNzM0NjAwLAotMHg1MTcyNTA3MiwgMHg2ZjY0NDYwMCwgMHg2MTY0NjQ0ZCwgMHg2MzQ0NzU3MCwKLTB4MCwgMHg2MTY0NjQ0ZCwgMHg2MzQ2NzU2YywgMHgwLAotMHg2NDY1NmM0ZCwgMHg2MzRlNmY0NSwgMHgwLCAweDAsCi0weDAsIDB4MjQ0ODY1NjEsIDB4NjQ2NTcyM2EsIDB4MjAyZjcwNzIsCi0weDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LAotMHgyZjJlMmY2ZSwgMHg2OTYzMmY2NiwgMHg3NzMyMmY2MywgMHg2ZjZkNmQ2ZiwKLTB4NmUyZjY0NmQsIDB4NjEyZTYzMmMsIDB4NzYyMDMxMmUsIDB4MzEyZTMyMmUsCi0weDMyMzQyMDMxLCAweDM5MzkzODJmLCAweDMxMzIyZjMyLCAweDMxMjAzMDMwLAotMHgzYTMzMzMzYSwgMHgzMDM5MjA3MywgMHg2ODc1NjE2ZSwgMHg2NzIwNDU3OCwKLTB4NzAyMDI0MDAsIDB4NjU3Njc0NTIsIDB4NmU2NzQ2MDAsIDB4NTE2NTc2NzQsCi0weDQ2MDAwMDAwLCAweDUxNjU3Njc0LCAweDUwNWY0NjAwLCAweDRkNjU3Njc0LAotMHg1MjZlNjc0NiwgMHgwLCAweDRkNTE2NTc2LCAweDc0NDYwMDAwLAotMHg0ZDUxNjU3NiwgMHg1MDVmNDYwMCwgMHg1MTczNDM2ZiwgMHg2ZTQ5NWY0NiwKLTB4MCwgMHg1MTczNDM2ZiwgMHg2ZTczNDYwMCwgMHg1MTcyNTA3MiwKLTB4NmY2NDQ2MDAsIDB4NzM3NzQ0NmQsIDB4NjE0ZjY2NjYsIDB4MCwKLTB4MzE0NDZkNjEsIDB4NGY2ZTAwMDAsIDB4NzM3NzQ0NmQsIDB4NjE0ZjZlMDAsCi0weDIzNzI0NDZkLCAweDYxNDE1NDRlLCAweDAsIDB4NzI0NDZkNjEsCi0weDQxNTQ0ZTMwLCAweDAsIDB4NzI0NDZkNjEsIDB4NDE1NDRlMzEsCi0weDAsIDB4NzI0NDZkNjEsIDB4MzQ0NzYyMDAsIDB4MmE1MDQxNGUsCi0weDQ5NDMyYTAwLCAweDJlMmUyZjJlLCAweDJlMmYyZTJlLCAweDJmMmUyZTJmLAotMHgyZTJlMmY3MywgMHg3MjYzMmY2ZSwgMHg2OTYzMmY2NiwgMHg3NzMyMmY2MywKLTB4NmY2ZDZkNmYsIDB4NmUyZjY0NmQsIDB4NjEyZTYzMDAsIDB4MjM3NzQ0NmQsCi0weDYxNDE1NDRlLCAweDAsIDB4Nzc0NDZkNjEsIDB4NDE1NDRlMzAsCi0weDAsIDB4Nzc0NDZkNjEsIDB4NDE1NDRlMzEsIDB4MCwKLTB4Nzc0NDZkNjEsIDB4MzQ0NzYyMDAsIDB4MCwgMHgwLAotMHgwLCAweDI0NDg2NTYxLCAweDY0NjU3MjNhLCAweDIwMmY3MDcyLAotMHg2ZjZhNjU2MywgMHg3NDczMmY3MiwgMHg2MzczMmY3MywgMHg3NzJmNjc2NSwKLTB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzczMjJmNjMsIDB4NmY2ZDZkNmYsCi0weDZlMmY3NDcyLCAweDYxNjM2NTJlLCAweDYzMmM3NjIwLCAweDMxMmUzMTJlLAotMHgzMjJlMzUyMCwgMHgzMTM5MzkzOCwgMHgyZjMwMzkyZiwgMHgzMzMwMjAzMSwKLTB4MzgzYTM1MzAsIDB4M2EzMjM4MjAsIDB4NzM2ODc1NjEsIDB4NmU2NzIwNDUsCi0weDc4NzAyMDI0LCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDI0NDg2NTYxLCAweDY0NjU3MjNhLCAweDIwMmY3MDcyLAotMHg2ZjZhNjU2MywgMHg3NDczMmY3MiwgMHg2MzczMmY3MywgMHg3NzJmNjc2NSwKLTB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzczMjJmNjMsIDB4NmY2ZDZkNmYsCi0weDZlMmY2NDYxLCAweDc0NjEyZTYzLCAweDJjNzYyMDMxLCAweDJlMzEyZTMyLAotMHgyZTMxMzIyMCwgMHgzMTM5MzkzOSwgMHgyZjMwMzEyZiwgMHgzMjMwMjAzMSwKLTB4MzkzYTM0MzksIDB4M2EzNTMxMjAsIDB4NzM2ODc1NjEsIDB4NmU2NzIwNDUsCi0weDc4NzAyMDI0LCAweDAsIDB4NDY1NzVmNTYsIDB4NDU1MjUzNDksCi0weDRmNGUzYTIwLCAweDIzMzEyMDQ2LCAweDcyNjkyMDQxLCAweDcwNzIyMDM3LAotMHgyMDMxMzczYSwgMHgzNTM3M2EzNSwgMHgzMjIwNTA0NCwgMHg1NDIwMzIzMCwKLTB4MzAzMDAwMDAsIDB4NDY1NzVmNDMsIDB4NGY0ZDUwNDksIDB4NGM0NTVmNTQsCi0weDQ5NGQ0NTNhLCAweDIwMzEzNzNhLCAweDM1MzczYTM1LCAweDMyMDAwMDAwLAotMHg0NjU3NWY0MywgMHg0ZjRkNTA0OSwgMHg0YzQ1NWY0MiwgMHg1OTNhMjA2NCwKLTB4NjU3NjcyNjMsIDB4NzMwMDAwMDAsIDB4NDY1NzVmNDMsIDB4NGY0ZDUwNDksCi0weDRjNDU1ZjQ4LCAweDRmNTM1NDNhLCAweDIwNjM2ZjZkLCAweDcwNzU3NDY1LAotMHgwLCAweDQ2NTc1ZjQzLCAweDRmNGQ1MDQ5LCAweDRjNDU1ZjQ0LAotMHg0ZjRkNDE0OSwgMHg0ZTNhMjA2NSwgMHg2ZTY3MmU2MSwgMHg2Mzc0NjU2ZiwKLTB4NmUyZTYzNmYsIDB4NmQwMDAwMDAsIDB4NDY1NzVmNDMsIDB4NGY0ZDUwNDksCi0weDRjNDU1MjNhLCAweDIwNjc2MzYzLCAweDIwNzY2NTcyLCAweDczNjk2ZjZlLAotMHgyMDMyMmUzNywgMHgyZTMyMDAwMCwgMHgwLCAweDEyMDQxMTAwLAotMHgwLCAweDI0NDg2NTYxLCAweDY0NjU3MjNhLCAweDIwMmY3MDcyLAotMHg2ZjZhNjU2MywgMHg3NDczMmY3MiwgMHg2MzczMmY3MywgMHg3NzJmNjc2NSwKLTB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzczMjJmNjMsIDB4NmY2ZDZkNmYsCi0weDZlMmY2ZDY1LCAweDZkMmU2MzJjLCAweDc2MjAzMTJlLCAweDMxMmUzMjJlLAotMHgzNTIwMzEzOSwgMHgzOTM4MmYzMCwgMHgzOTJmMzMzMCwgMHgyMDMxMzgzYSwKLTB4MzUzMDNhMzAsIDB4MzgyMDczNjgsIDB4NzU2MTZlNjcsIDB4MjA0NTc4NzAsCi0weDIwMjQwMDAwLCAweDI0NDg2NTYxLCAweDY0NjU3MjNhLCAweDIwMmY3MDcyLAotMHg2ZjZhNjU2MywgMHg3NDczMmY3MiwgMHg2MzczMmY3MywgMHg3NzJmNjc2NSwKLTB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzczMjJmNjMsIDB4NmY2ZDZkNmYsCi0weDZlMmY3MzY1LCAweDZlNjQyZTYzLCAweDJjNzYyMDMxLCAweDJlMzEyZTMyLAotMHgyZTM0MzQyMCwgMHgzMTM5MzkzOCwgMHgyZjMxMzIyZiwgMHgzMjMxMjAzMCwKLTB4MzAzYTMzMzMsIDB4M2EzMTM4MjAsIDB4NzM2ODc1NjEsIDB4NmU2NzIwNDUsCi0weDc4NzAyMDI0LCAweDAsIDB4NjU3Njc0NTIsIDB4NmU2NzQ2MDAsCi0weDUxNjU3Njc0LCAweDQ2MDAwMDAwLCAweDUxNjU3Njc0LCAweDUwNWY0NjAwLAotMHg0ZDY1NzY3NCwgMHg1MjZlNjc0NiwgMHgwLCAweDRkNTE2NTc2LAotMHg3NDQ2MDAwMCwgMHg0ZDUxNjU3NiwgMHg1MDVmNDYwMCwgMHg1MTczNDM2ZiwKLTB4NmU0OTVmNDYsIDB4MCwgMHg1MTczNDM2ZiwgMHg2ZTczNDYwMCwKLTB4NTE3MjUwNzIsIDB4NmY2NDQ2MDAsIDB4Njk3MzZlNzQsIDB4NTQ2MzcwNTUsCi0weDAsIDB4MjQ0ODY1NjEsIDB4NjQ2NTcyM2EsIDB4MjAyZjcwNzIsCi0weDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LAotMHgyZjJlMmY2ZSwgMHg2OTYzMmY2NiwgMHg3NzMyMmY2MywgMHg2ZjZkNmQ2ZiwKLTB4NmUyZjcyNjUsIDB4NjM3NjJlNjMsIDB4MmM3NjIwMzEsIDB4MmUzMTJlMzIsCi0weDJlMzUzMzIwLCAweDMxMzkzOTM5LCAweDJmMzAzMTJmLCAweDMxMzYyMDMwLAotMHgzMjNhMzUzNSwgMHgzYTM0MzMyMCwgMHg3MzY4NzU2MSwgMHg2ZTY3MjA0NSwKLTB4Nzg3MDIwMjQsIDB4MCwgMHg2NTc2NzQ1MiwgMHg2ZTY3NDYwMCwKLTB4NTE2NTc2NzQsIDB4NDYwMDAwMDAsIDB4NTE2NTc2NzQsIDB4NTA1ZjQ2MDAsCi0weDRkNjU3Njc0LCAweDUyNmU2NzQ2LCAweDAsIDB4NGQ1MTY1NzYsCi0weDc0NDYwMDAwLCAweDRkNTE2NTc2LCAweDUwNWY0NjAwLCAweDUxNzM0MzZmLAotMHg2ZTQ5NWY0NiwgMHgwLCAweDUxNzM0MzZmLCAweDZlNzM0NjAwLAotMHg1MTcyNTA3MiwgMHg2ZjY0NDYwMCwgMHg3MjRkNjE2MywgMHg0MzY4NmIzMCwKLTB4MCwgMHg3Mjc4NDY3MiwgMHg2ZDMyNGM2NywgMHgwLAotMHg3Mjc4NGU2ZiwgMHg1Mzc0NDI2NCwgMHgwLCAweDcyNzg0ZTZmLAotMHg0ZDY5NDI2NCwgMHgwLCAweDcyNzg0ZTZmLCAweDRhNmQ0MjY0LAotMHgwLCAweDcyNzg0MzZiLCAweDQ0NmQ2MTQ2LCAweDAsCi0weDcyNzg1MTQ0LCAweDZkNDU3ODQ2LCAweDAsIDB4NzI3ODUxNDQsCi0weDZkNjE0NjAwLCAweDcyNzg1MTQ0LCAweDRjNDI2NDQ2LCAweDAsCi0weDcyNzg1MTQ0LCAweDZkNDI2NDQ2LCAweDAsIDB4NzI3ODQzNzIsCi0weDYzNTA2MTY0LCAweDAsIDB4NzI1MzZkNTEsIDB4NDQ2ZDYxNDYsCi0weDAsIDB4MjQ0ODY1NjEsIDB4NjQ2NTcyM2EsIDB4MjAyZjcwNzIsCi0weDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LAotMHgyZjJlMmY2ZSwgMHg2OTYzMmY2NiwgMHg3NzMyMmY2MywgMHg2ZjZkNmQ2ZiwKLTB4NmUyZjZkNjEsIDB4NjMyZTYzMmMsIDB4NzYyMDMxMmUsIDB4MzEyZTMyMmUsCi0weDMyMzIyMDMxLCAweDM5MzkzODJmLCAweDMxMzIyZjMwLCAweDM4MjAzMDMyLAotMHgzYTMzMzYzYSwgMHgzMzMwMjA3MywgMHg2ODc1NjE2ZSwgMHg2NzIwNDU3OCwKLTB4NzAyMDI0MDAsIDB4NjU3Njc0NTIsIDB4NmU2NzQ2MDAsIDB4NTE2NTc2NzQsCi0weDQ2MDAwMDAwLCAweDUxNjU3Njc0LCAweDUwNWY0NjAwLCAweDRkNjU3Njc0LAotMHg1MjZlNjc0NiwgMHgwLCAweDRkNTE2NTc2LCAweDc0NDYwMDAwLAotMHg0ZDUxNjU3NiwgMHg1MDVmNDYwMCwgMHg1MTczNDM2ZiwgMHg2ZTQ5NWY0NiwKLTB4MCwgMHg1MTczNDM2ZiwgMHg2ZTczNDYwMCwgMHg1MTcyNTA3MiwKLTB4NmY2NDQ2MDAsIDB4NmQ2MTYzNTQsIDB4Njg3MjY1NzMsIDB4MCwKLTB4MjM3NDRkNjEsIDB4NjM0MTU0NGUsIDB4MCwgMHgyMzcyNGQ2MSwKLTB4NjM0MTU0NGUsIDB4MCwgMHg3MjY1NmQ0MSwgMHg3MzczNzI3NCwKLTB4MCwgMHg2YzY5NmU2YiwgMHg0NDRmNTc0ZSwgMHgwLAotMHg2YzY5NmU2YiwgMHg1NTUwMDAwMCwgMHgwLCAweDAsCi0weDAsIDB4MjQ0ODY1NjEsIDB4NjQ2NTcyM2EsIDB4MjAyZjcwNzIsCi0weDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LAotMHgyZjJlMmY2ZSwgMHg2OTYzMmY2NiwgMHg3NzMyMmY2MywgMHg2ZjZkNmQ2ZiwKLTB4NmUyZjYzNmIsIDB4NzM3NTZkMmUsIDB4NjMyYzc2MjAsIDB4MzEyZTMxMmUsCi0weDMyMmUzOTIwLCAweDMxMzkzOTM5LCAweDJmMzAzMTJmLCAweDMxMzQyMDMwLAotMHgzMDNhMzAzMywgMHgzYTM0MzgyMCwgMHg3MzY4NzU2MSwgMHg2ZTY3MjA0NSwKLTB4Nzg3MDIwMjQsIDB4MCwgMHg2NTc2NzQ1MiwgMHg2ZTY3NDYwMCwKLTB4NTE2NTc2NzQsIDB4NDYwMDAwMDAsIDB4NTE2NTc2NzQsIDB4NTA1ZjQ2MDAsCi0weDRkNjU3Njc0LCAweDUyNmU2NzQ2LCAweDAsIDB4NGQ1MTY1NzYsCi0weDc0NDYwMDAwLCAweDRkNTE2NTc2LCAweDUwNWY0NjAwLCAweDUxNzM0MzZmLAotMHg2ZTQ5NWY0NiwgMHgwLCAweDUxNzM0MzZmLCAweDZlNzM0NjAwLAotMHg1MTcyNTA3MiwgMHg2ZjY0NDYwMCwgMHgwLCAweDAsCi0weDAsIDB4NTA3MjZmNjIsIDB4NjU1MDY4NzksIDB4MCwKLTB4NmM2ZTZiNDEsIDB4NTM1MzUyNTQsIDB4MCwgMHgxMDlhNCwKLTB4MTBhMWMsIDB4MTBhNTAsIDB4MTBhN2MsIDB4MTEwNTAsCi0weDEwYWE4LCAweDEwYjEwLCAweDExMWZjLCAweDEwZGMwLAotMHgxMGM2OCwgMHgxMGM4MCwgMHgxMGNjNCwgMHgxMGNlYywKLTB4MTBkMGMsIDB4MTBkMzQsIDB4MTExZmMsIDB4MTBkYzAsCi0weDEwZGY4LCAweDEwZTEwLCAweDEwZTQwLCAweDEwZTY4LAotMHgxMGU4OCwgMHgxMGViMCwgMHgwLCAweDEwZmRjLAotMHgxMTAwOCwgMHgxMTAyYywgMHgxMTFmYywgMHgxMTA1MCwKLTB4MTEwNzgsIDB4MTExMDgsIDB4MCwgMHgwLAotMHgwLCAweDExODZjLCAweDExOTNjLCAweDExYTE0LAotMHgxMWFlNCwgMHgxMWI0MCwgMHgxMWMxYywgMHgxMWM0NCwKLTB4MTFkMjAsIDB4MTFkNDgsIDB4MTFlZjAsIDB4MTFmMTgsCi0weDEyMGMwLCAweDEyMmI4LCAweDEyNTRjLCAweDEyNDYwLAotMHgxMjU0YywgMHgxMjU3OCwgMHgxMjBlOCwgMHgxMjI5MCwKLTB4NzI3Mzc0NWYsIDB4Njc2ZDY5NjksIDB4MCwgMHgxMjYwOCwKLTB4MTI2NDAsIDB4MTI3MjgsIDB4MTMzNzQsIDB4MTMzYjQsCi0weDEzM2NjLCAweDczNjU3NDZjLCAweDZmNmY3MDAwLCAweDAsCi0weDAsIDB4MTNiYmMsIDB4MTNiZmMsIDB4MTNjOGMsCi0weDEzY2QwLCAweDEzZDM0LCAweDEzZGMwLCAweDEzZGY0LAotMHgxM2U3YywgMHgxM2YxNCwgMHgxM2ZlNCwgMHgxNDAyNCwKLTB4MTQwYTgsIDB4MTQwY2MsIDB4MTQxZGMsIDB4NjQ2ZjQyNjEsCi0weDczNjU1MDY3LCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDczNzQ2ZDYxLCAweDYzNGM0ZTRiLCAweDAsCi0weDY3NjU3NDZkLCAweDYzNmM2ZTZiLCAweDAsIDB4MTRlZDgsCi0weDE0ZWQ4LCAweDE0YjhjLCAweDE0YmQ4LCAweDE0YzI0LAotMHgxNGVkOCwgMHg3MzY1NzQ2ZCwgMHg2MTYzNjE2MywgMHg3NDAwMDAwMCwKLTB4MCwgMHgwIH07Ci1zdGF0aWMgdTMyIHRpZ29uMkZ3RGF0YVsoTUFYX0RBVEFfTEVOLzQpICsgMV0gX19kZXZpbml0ZGF0YSA9IHsKLTB4MSwKLTB4MSwgMHgxLCAweGMwMDFmYywgMHgzZmZjLAotMHhjMDAwMDAsIDB4NDE2Yzc0NjUsIDB4NmY2ZTIwNDEsIDB4NjM2NTRlNDksCi0weDQzMjA1NjAwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHg0MTZjNzQ2NSwKLTB4NmY2ZTIwNDEsIDB4NjM2NTRlNDksIDB4NDMyMDU2MDAsIDB4NDI0MjQyNDIsCi0weDAsIDB4MCwgMHgwLCAweDFmZmZmYywKLTB4MWZmZjdjLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHg2MGNmMDAsCi0weDYwLCAweGNmMDAwMDAwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDMsIDB4MCwKLTB4MSwgMHgwLCAweDAsIDB4MCwKLTB4MSwgMHgwLCAweDEsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MSwKLTB4MSwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDEwMDAwMDAsIDB4MjEwMDAwMDAsCi0weDEyMDAwMTQwLCAweDAsIDB4MCwgMHgyMDAwMDAwMCwKLTB4MTIwMDAwYTAsIDB4MCwgMHgxMjAwMDA2MCwgMHgxMjAwMDE4MCwKLTB4MTIwMDAxZTAsIDB4MCwgMHgwLCAweDAsCi0weDEsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDIsCi0weDAsIDB4MCwgMHgzMDAwMSwgMHgxLAotMHgzMDIwMSwgMHgwLCAweDAsIDB4MTAxMDEwMSwKLTB4MTAxMDEwMCwgMHgxMDEwMCwgMHgxMDEwMDAxLCAweDEwMDAxLAotMHgxMDAwMTAxLCAweDEwMSwgMHgwLCAweDAgfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FtZDgxMTFlLmMgYi9kcml2ZXJzL25ldC9hbWQ4MTExZS5jCmluZGV4IDE4N2FjNmUuLjc3MDk5OTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FtZDgxMTFlLmMKKysrIGIvZHJpdmVycy9uZXQvYW1kODExMWUuYwpAQCAtMTgxMyw2ICsxODEzLDI1IEBACiAJbHAtPmV4dF9waHlfYWRkciA9IDE7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgYW1kODExMWVfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gYW1kODExMWVfb3BlbiwKKwkubmRvX3N0b3AJCT0gYW1kODExMWVfY2xvc2UsCisJLm5kb19zdGFydF94bWl0CQk9IGFtZDgxMTFlX3N0YXJ0X3htaXQsCisJLm5kb190eF90aW1lb3V0CQk9IGFtZDgxMTFlX3R4X3RpbWVvdXQsCisJLm5kb19nZXRfc3RhdHMJCT0gYW1kODExMWVfZ2V0X3N0YXRzLAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gYW1kODExMWVfc2V0X211bHRpY2FzdF9saXN0LAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gYW1kODExMWVfc2V0X21hY19hZGRyZXNzLAorCS5uZG9fZG9faW9jdGwJCT0gYW1kODExMWVfaW9jdGwsCisJLm5kb19jaGFuZ2VfbXR1CQk9IGFtZDgxMTFlX2NoYW5nZV9tdHUsCisjaWYgQU1EODExMUVfVkxBTl9UQUdfVVNFRAorCS5uZG9fdmxhbl9yeF9yZWdpc3Rlcgk9IGFtZDgxMTFlX3ZsYW5fcnhfcmVnaXN0ZXIsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCS5uZG9fcG9sbF9jb250cm9sbGVyCSA9IGFtZDgxMTFlX3BvbGwsCisjZW5kaWYKK307CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IGFtZDgxMTFlX3Byb2JlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJCQkgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CkBAIC0xODcyLDcgKzE4OTEsNiBAQAogCiAjaWYgQU1EODExMUVfVkxBTl9UQUdfVVNFRAogCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX1RYIHwgTkVUSUZfRl9IV19WTEFOX1JYIDsKLQlkZXYtPnZsYW5fcnhfcmVnaXN0ZXIgPWFtZDgxMTFlX3ZsYW5fcnhfcmVnaXN0ZXI7CiAjZW5kaWYKIAogCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTE5MDEsMjcgKzE5MTksMTYgQEAKIAlpZihkeW5hbWljX2lwZ1tjYXJkX2lkeCsrXSkKIAkJbHAtPm9wdGlvbnMgfD0gT1BUSU9OX0RZTl9JUEdfRU5BQkxFOwogCisKIAkvKiBJbml0aWFsaXplIGRyaXZlciBlbnRyeSBwb2ludHMgKi8KLQlkZXYtPm9wZW4gPSBhbWQ4MTExZV9vcGVuOwotCWRldi0+aGFyZF9zdGFydF94bWl0ID0gYW1kODExMWVfc3RhcnRfeG1pdDsKLQlkZXYtPnN0b3AgPSBhbWQ4MTExZV9jbG9zZTsKLQlkZXYtPmdldF9zdGF0cyA9IGFtZDgxMTFlX2dldF9zdGF0czsKLQlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IGFtZDgxMTFlX3NldF9tdWx0aWNhc3RfbGlzdDsKLQlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IGFtZDgxMTFlX3NldF9tYWNfYWRkcmVzczsKLQlkZXYtPmRvX2lvY3RsID0gYW1kODExMWVfaW9jdGw7Ci0JZGV2LT5jaGFuZ2VfbXR1ID0gYW1kODExMWVfY2hhbmdlX210dTsKKwlkZXYtPm5ldGRldl9vcHMgPSAmYW1kODExMWVfbmV0ZGV2X29wczsKIAlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmb3BzKTsKIAlkZXYtPmlycSA9cGRldi0+aXJxOwotCWRldi0+dHhfdGltZW91dCA9IGFtZDgxMTFlX3R4X3RpbWVvdXQ7CiAJZGV2LT53YXRjaGRvZ190aW1lbyA9IEFNRDgxMTFFX1RYX1RJTUVPVVQ7CiAJbmV0aWZfbmFwaV9hZGQoZGV2LCAmbHAtPm5hcGksIGFtZDgxMTFlX3J4X3BvbGwsIDMyKTsKLSNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgotCWRldi0+cG9sbF9jb250cm9sbGVyID0gYW1kODExMWVfcG9sbDsKLSNlbmRpZgogCiAjaWYgQU1EODExMUVfVkxBTl9UQUdfVVNFRAogCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX1RYIHwgTkVUSUZfRl9IV19WTEFOX1JYOwotCWRldi0+dmxhbl9yeF9yZWdpc3RlciA9YW1kODExMWVfdmxhbl9yeF9yZWdpc3RlcjsKICNlbmRpZgogCS8qIFByb2JlIHRoZSBleHRlcm5hbCBQSFkgKi8KIAlhbWQ4MTExZV9wcm9iZV9leHRfcGh5KGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcHBsZXRhbGsvaXBkZHAuYyBiL2RyaXZlcnMvbmV0L2FwcGxldGFsay9pcGRkcC5jCmluZGV4IDlhMGJlOWIuLmRhNjRiYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FwcGxldGFsay9pcGRkcC5jCisrKyBiL2RyaXZlcnMvbmV0L2FwcGxldGFsay9pcGRkcC5jCkBAIC00OCwxMiArNDgsMTggQEAKIAogLyogSW5kZXggdG8gZnVuY3Rpb25zLCBhcyBmdW5jdGlvbiBwcm90b3R5cGVzLiAqLwogc3RhdGljIGludCBpcGRkcF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppcGRkcF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgaW50IGlwZGRwX2NyZWF0ZShzdHJ1Y3QgaXBkZHBfcm91dGUgKm5ld19ydCk7CiBzdGF0aWMgaW50IGlwZGRwX2RlbGV0ZShzdHJ1Y3QgaXBkZHBfcm91dGUgKnJ0KTsKIHN0YXRpYyBzdHJ1Y3QgaXBkZHBfcm91dGUqIGlwZGRwX2ZpbmRfcm91dGUoc3RydWN0IGlwZGRwX3JvdXRlICpydCk7CiBzdGF0aWMgaW50IGlwZGRwX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBpcGRkcF9uZXRkZXZfb3BzID0geworCS5uZG9fc3RhcnRfeG1pdAkJPSBpcGRkcF94bWl0LAorCS5uZG9fZG9faW9jdGwgICAJPSBpcGRkcF9pb2N0bCwKKwkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgCT0gZXRoX21hY19hZGRyLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorfTsKIAogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IGlwZGRwX2luaXQodm9pZCkKIHsKQEAgLTYxLDcgKzY3LDcgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCWludCBlcnI7CiAKLQlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMpKTsKKwlkZXYgPSBhbGxvY19ldGhlcmRldigwKTsKIAlpZiAoIWRldikKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKQEAgLTcxLDkgKzc3LDcgQEAKICAgICAgICAgICAgICAgICBwcmludGsodmVyc2lvbik7CiAKIAkvKiBJbml0YWxpemUgdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCi0gICAgICAgIGRldi0+aGFyZF9zdGFydF94bWl0ID0gaXBkZHBfeG1pdDsKLSAgICAgICAgZGV2LT5nZXRfc3RhdHMgICAgICA9IGlwZGRwX2dldF9zdGF0czsKLSAgICAgICAgZGV2LT5kb19pb2N0bCAgICAgICA9IGlwZGRwX2lvY3RsOworCWRldi0+bmV0ZGV2X29wcyA9ICZpcGRkcF9uZXRkZXZfb3BzOwogCiAgICAgICAgIGRldi0+dHlwZSA9IEFSUEhSRF9JUEREUDsgICAgICAgCS8qIElQIG92ZXIgRERQIHR1bm5lbCAqLwogICAgICAgICBkZXYtPm10dSA9IDU4NTsKQEAgLTEwMywxMyArMTA3LDYgQEAKICAgICAgICAgcmV0dXJuIGRldjsKIH0KIAotLyoKLSAqIEdldCB0aGUgY3VycmVudCBzdGF0aXN0aWNzLiBUaGlzIG1heSBiZSBjYWxsZWQgd2l0aCB0aGUgY2FyZCBvcGVuIG9yIGNsb3NlZC4KLSAqLwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppcGRkcF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlyZXR1cm4gbmV0ZGV2X3ByaXYoZGV2KTsKLX0KIAogLyoKICAqIFRyYW5zbWl0IExMQVAvRUxBUCBmcmFtZSB1c2luZyBhYXJwX3NlbmRfZGRwLgpAQCAtMTcwLDggKzE2Nyw4IEBACiAKICAgICAgICAgc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0FUQUxLKTsgICAgIC8qIFByb3RvY29sIGhhcyBjaGFuZ2VkICovCiAKLQkoKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICopIG5ldGRldl9wcml2KGRldikpLT50eF9wYWNrZXRzKys7Ci0JKChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqKSBuZXRkZXZfcHJpdihkZXYpKS0+dHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKIAogICAgICAgICBpZihhYXJwX3NlbmRfZGRwKHJ0LT5kZXYsIHNrYiwgJnJ0LT5hdCwgTlVMTCkgPCAwKQogICAgICAgICAgICAgICAgIGRldl9rZnJlZV9za2Ioc2tiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F0cC5jIGIvZHJpdmVycy9uZXQvYXRwLmMKaW5kZXggZWE0OTNjZS4uNDMxN2IzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXRwLmMKKysrIGIvZHJpdmVycy9uZXQvYXRwLmMKQEAgLTIwNCw4ICsyMDQsNyBAQAogc3RhdGljIHZvaWQgbmV0X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIHZvaWQgcmVhZF9ibG9jayhsb25nIGlvYWRkciwgaW50IGxlbmd0aCwgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBpbnQgZGF0YV9tb2RlKTsKIHN0YXRpYyBpbnQgbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RhdGljIHZvaWQgc2V0X3J4X21vZGVfODAwMihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyB2b2lkIHNldF9yeF9tb2RlXzgwMTIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyB2b2lkIHR4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKIApAQCAtMjQyLDYgKzI0MSwxNyBAQAogCXJldHVybiAtRU5PREVWOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGF0cF9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbgkJPSBuZXRfb3BlbiwKKwkubmRvX3N0b3AJCT0gbmV0X2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdAkJPSBhdHBfc2VuZF9wYWNrZXQsCisJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBzZXRfcnhfbW9kZSwKKwkubmRvX3R4X3RpbWVvdXQJCT0gdHhfdGltZW91dCwKKwkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgCT0gZXRoX21hY19hZGRyLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorfTsKKwogc3RhdGljIGludCBfX2luaXQgYXRwX3Byb2JlMShsb25nIGlvYWRkcikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKQEAgLTM0MiwxMiArMzUyLDcgQEAKIAlpZiAoZGV2LT5tZW1fZW5kICYgMHhmKQogCQluZXRfZGVidWcgPSBkZXYtPm1lbV9lbmQgJiA3OwogCi0JZGV2LT5vcGVuCQk9IG5ldF9vcGVuOwotCWRldi0+c3RvcAkJPSBuZXRfY2xvc2U7Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSBhdHBfc2VuZF9wYWNrZXQ7Ci0JZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPQotCSAgbHAtPmNoaXBfdHlwZSA9PSBSVEw4MDAyID8gJnNldF9yeF9tb2RlXzgwMDIgOiAmc2V0X3J4X21vZGVfODAxMjsKLQlkZXYtPnR4X3RpbWVvdXQJCT0gdHhfdGltZW91dDsKKwlkZXYtPm5ldGRldl9vcHMgCT0gJmF0cF9uZXRkZXZfb3BzOwogCWRldi0+d2F0Y2hkb2dfdGltZW8JPSBUWF9USU1FT1VUOwogCiAJcmVzID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CkBAIC05MDMsNiArOTA4LDE3IEBACiAgICAgd3JpdGVfcmVnKGlvYWRkciwgQ01SMiwgQ01SMl9JUlFPVVQpOyAvKiBTd2l0Y2ggYmFjayB0byBwYWdlIDAgKi8KIH0KIAorc3RhdGljIHZvaWQgc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAobHAtPmNoaXBfdHlwZSA9PSBSVEw4MDAyKQorCQlyZXR1cm4gc2V0X3J4X21vZGVfODAwMihkZXYpOworCWVsc2UKKwkJcmV0dXJuIHNldF9yeF9tb2RlXzgwMTIoZGV2KTsKK30KKworCiBzdGF0aWMgaW50IF9faW5pdCBhdHBfaW5pdF9tb2R1bGUodm9pZCkgewogCWlmIChkZWJ1ZykJCQkJCS8qIEVtaXQgdmVyc2lvbiBldmVuIGlmIG5vIGNhcmRzIGRldGVjdGVkLiAqLwogCQlwcmludGsoS0VSTl9JTkZPICIlcyIsIHZlcnNpb24pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYjQ0LmMgYi9kcml2ZXJzL25ldC9iNDQuYwppbmRleCAwZTc0NzBhLi42OTI2ZWJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9iNDQuYworKysgYi9kcml2ZXJzL25ldC9iNDQuYwpAQCAtMjEwOCw2ICsyMTA4LDIyIEBACiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBiNDRfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gYjQ0X29wZW4sCisJLm5kb19zdG9wCQk9IGI0NF9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJCT0gYjQ0X3N0YXJ0X3htaXQsCisJLm5kb19nZXRfc3RhdHMJCT0gYjQ0X2dldF9zdGF0cywKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IGI0NF9zZXRfcnhfbW9kZSwKKwkubmRvX3NldF9tYWNfYWRkcmVzcwk9IGI0NF9zZXRfbWFjX2FkZHIsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCisJLm5kb19kb19pb2N0bAkJPSBiNDRfaW9jdGwsCisJLm5kb190eF90aW1lb3V0CQk9IGI0NF90eF90aW1lb3V0LAorCS5uZG9fY2hhbmdlX210dQkJPSBiNDRfY2hhbmdlX210dSwKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCS5uZG9fcG9sbF9jb250cm9sbGVyCT0gYjQ0X3BvbGxfY29udHJvbGxlciwKKyNlbmRpZgorfTsKKwogc3RhdGljIGludCBfX2RldmluaXQgYjQ0X2luaXRfb25lKHN0cnVjdCBzc2JfZGV2aWNlICpzZGV2LAogCQkJCSAgY29uc3Qgc3RydWN0IHNzYl9kZXZpY2VfaWQgKmVudCkKIHsKQEAgLTIxNDUsMjAgKzIxNjEsOSBAQAogCWJwLT5yeF9wZW5kaW5nID0gQjQ0X0RFRl9SWF9SSU5HX1BFTkRJTkc7CiAJYnAtPnR4X3BlbmRpbmcgPSBCNDRfREVGX1RYX1JJTkdfUEVORElORzsKIAotCWRldi0+b3BlbiA9IGI0NF9vcGVuOwotCWRldi0+c3RvcCA9IGI0NF9jbG9zZTsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGI0NF9zdGFydF94bWl0OwotCWRldi0+Z2V0X3N0YXRzID0gYjQ0X2dldF9zdGF0czsKLQlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IGI0NF9zZXRfcnhfbW9kZTsKLQlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IGI0NF9zZXRfbWFjX2FkZHI7Ci0JZGV2LT5kb19pb2N0bCA9IGI0NF9pb2N0bDsKLQlkZXYtPnR4X3RpbWVvdXQgPSBiNDRfdHhfdGltZW91dDsKKwlkZXYtPm5ldGRldl9vcHMgPSAmYjQ0X25ldGRldl9vcHM7CiAJbmV0aWZfbmFwaV9hZGQoZGV2LCAmYnAtPm5hcGksIGI0NF9wb2xsLCA2NCk7CiAJZGV2LT53YXRjaGRvZ190aW1lbyA9IEI0NF9UWF9USU1FT1VUOwotI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCi0JZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBiNDRfcG9sbF9jb250cm9sbGVyOwotI2VuZGlmCi0JZGV2LT5jaGFuZ2VfbXR1ID0gYjQ0X2NoYW5nZV9tdHU7CiAJZGV2LT5pcnEgPSBzZGV2LT5pcnE7CiAJU0VUX0VUSFRPT0xfT1BTKGRldiwgJmI0NF9ldGh0b29sX29wcyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JueDJ4X2xpbmsuYyBiL2RyaXZlcnMvbmV0L2JueDJ4X2xpbmsuYwppbmRleCA2N2RlOTRmLi5mZWZhNmFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ibngyeF9saW5rLmMKKysrIGIvZHJpdmVycy9uZXQvYm54MnhfbGluay5jCkBAIC0zMzU5LDcgKzMzNTksNyBAQAogCXU4IHNoaWZ0ID0gOCo0OwogCXU4IGRpZ2l0OwogCWlmIChsZW4gPCAxMCkgewotCQkvKiBOZWVkIG1vcmUgdGhlbiAxMGNoYXJzIGZvciB0aGlzIGZvcm1hdCAqLworCQkvKiBOZWVkIG1vcmUgdGhhbiAxMGNoYXJzIGZvciB0aGlzIGZvcm1hdCAqLwogCQkqc3RyX3B0ciA9ICdcMCc7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JueDJ4X21haW4uYyBiL2RyaXZlcnMvbmV0L2JueDJ4X21haW4uYwppbmRleCBlZjgxMDNiLi40YmUwNTg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ibngyeF9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvYm54MnhfbWFpbi5jCkBAIC04MjQzLDYgKzgyNDMsOSBAQAogCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCByYzsKIAorCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gLUVBR0FJTjsKKwogCURQKEJOWDJYX01TR19OVk0sICJldGh0b29sX2VlcHJvbTogY21kICVkXG4iCiAJICAgRFBfTEVWRUwgIiAgbWFnaWMgMHgleCAgb2Zmc2V0IDB4JXggKCVkKSAgbGVuIDB4JXggKCVkKVxuIiwKIAkgICBlZXByb20tPmNtZCwgZWVwcm9tLT5tYWdpYywgZWVwcm9tLT5vZmZzZXQsIGVlcHJvbS0+b2Zmc2V0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9tYWluLmMKaW5kZXggNDYwYzJjYS4uOWZiMzg4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jCkBAIC00MTQ4LDcgKzQxNDgsNyBAQAogCiAJYm9uZF9mb3JfZWFjaF9zbGF2ZShib25kLCBzbGF2ZSwgaSkgewogCQlwcl9kZWJ1ZygicyAlcCBzLT5wICVwIGNfbSAlcFxuIiwgc2xhdmUsCi0JCQlzbGF2ZS0+cHJldiwgc2xhdmUtPmRldi0+Y2hhbmdlX210dSk7CisJCQlzbGF2ZS0+cHJldiwgc2xhdmUtPmRldi0+bmV0ZGV2X29wcy0+bmRvX2NoYW5nZV9tdHUpOwogCiAJCXJlcyA9IGRldl9zZXRfbXR1KHNsYXZlLT5kZXYsIG5ld19tdHUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYXNzaW5pLmMgYi9kcml2ZXJzL25ldC9jYXNzaW5pLmMKaW5kZXggMzIxZjQzZC4uODQwYjNkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2Fzc2luaS5jCisrKyBiL2RyaXZlcnMvbmV0L2Nhc3NpbmkuYwpAQCAtNDk3Nyw2ICs0OTc3LDIyIEBACiAJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAweGZmKTsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBjYXNfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gY2FzX29wZW4sCisJLm5kb19zdG9wCQk9IGNhc19jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJCT0gY2FzX3N0YXJ0X3htaXQsCisJLm5kb19nZXRfc3RhdHMgCQk9IGNhc19nZXRfc3RhdHMsCisJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBjYXNfc2V0X211bHRpY2FzdCwKKwkubmRvX2RvX2lvY3RsCQk9IGNhc19pb2N0bCwKKwkubmRvX3R4X3RpbWVvdXQJCT0gY2FzX3R4X3RpbWVvdXQsCisJLm5kb19jaGFuZ2VfbXR1CQk9IGNhc19jaGFuZ2VfbXR1LAorCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gZXRoX21hY19hZGRyLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJLm5kb19wb2xsX2NvbnRyb2xsZXIJPSBjYXNfbmV0cG9sbCwKKyNlbmRpZgorfTsKKwogc3RhdGljIGludCBfX2RldmluaXQgY2FzX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKQEAgLTUxNjYsMjIgKzUxODIsMTMgQEAKIAlmb3IgKGkgPSAwOyBpIDwgTl9SWF9GTE9XUzsgaSsrKQogCQlza2JfcXVldWVfaGVhZF9pbml0KCZjcC0+cnhfZmxvd3NbaV0pOwogCi0JZGV2LT5vcGVuID0gY2FzX29wZW47Ci0JZGV2LT5zdG9wID0gY2FzX2Nsb3NlOwotCWRldi0+aGFyZF9zdGFydF94bWl0ID0gY2FzX3N0YXJ0X3htaXQ7Ci0JZGV2LT5nZXRfc3RhdHMgPSBjYXNfZ2V0X3N0YXRzOwotCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gY2FzX3NldF9tdWx0aWNhc3Q7Ci0JZGV2LT5kb19pb2N0bCA9IGNhc19pb2N0bDsKKwlkZXYtPm5ldGRldl9vcHMgPSAmY2FzX25ldGRldl9vcHM7CiAJZGV2LT5ldGh0b29sX29wcyA9ICZjYXNfZXRodG9vbF9vcHM7Ci0JZGV2LT50eF90aW1lb3V0ID0gY2FzX3R4X3RpbWVvdXQ7CiAJZGV2LT53YXRjaGRvZ190aW1lbyA9IENBU19UWF9USU1FT1VUOwotCWRldi0+Y2hhbmdlX210dSA9IGNhc19jaGFuZ2VfbXR1OworCiAjaWZkZWYgVVNFX05BUEkKIAluZXRpZl9uYXBpX2FkZChkZXYsICZjcC0+bmFwaSwgY2FzX3BvbGwsIDY0KTsKICNlbmRpZgotI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCi0JZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBjYXNfbmV0cG9sbDsKLSNlbmRpZgogCWRldi0+aXJxID0gcGRldi0+aXJxOwogCWRldi0+ZG1hID0gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZGU2MDAuYyBiL2RyaXZlcnMvbmV0L2RlNjAwLmMKaW5kZXggOTcwZjgyMC4uZGU2M2YxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZGU2MDAuYworKysgYi9kcml2ZXJzL25ldC9kZTYwMC5jCkBAIC0zNzgsNiArMzc4LDE2IEBACiAJICovCiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgZGU2MDBfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gZGU2MDBfb3BlbiwKKwkubmRvX3N0b3AJCT0gZGU2MDBfY2xvc2UsCisJLm5kb19zdGFydF94bWl0CQk9IGRlNjAwX3N0YXJ0X3htaXQsCisJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAorCS5uZG9fc2V0X21hY19hZGRyZXNzIAk9IGV0aF9tYWNfYWRkciwKKwkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKK307CisKKwogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IGRlNjAwX3Byb2JlKHZvaWQpCiB7CiAJaW50CWk7CkBAIC00MzksOSArNDQ5LDcgQEAKIAogCXByaW50aygiLCBFdGhlcm5ldCBBZGRyZXNzOiAlcE1cbiIsIGRldi0+ZGV2X2FkZHIpOwogCi0JZGV2LT5vcGVuID0gZGU2MDBfb3BlbjsKLQlkZXYtPnN0b3AgPSBkZTYwMF9jbG9zZTsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZkZTYwMF9zdGFydF94bWl0OworCWRldi0+bmV0ZGV2X29wcyA9ICZkZTYwMF9uZXRkZXZfb3BzOwogCiAJZGV2LT5mbGFncyY9fklGRl9NVUxUSUNBU1Q7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RlNjIwLmMgYi9kcml2ZXJzL25ldC9kZTYyMC5jCmluZGV4IGJkZmE4OTQuLmQ1MmYzNGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RlNjIwLmMKKysrIGIvZHJpdmVycy9uZXQvZGU2MjAuYwpAQCAtNzg0LDYgKzc4NCwxNyBAQAogCXJldHVybiAwOyAvKiBhbGwgb2sgKi8KIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBkZTYyMF9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbiAJCT0gZGU2MjBfb3BlbiwKKwkubmRvX3N0b3AgCQk9IGRlNjIwX2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdCAJPSBkZTYyMF9zdGFydF94bWl0LAorCS5uZG9fdHhfdGltZW91dCAJPSBkZTYyMF90aW1lb3V0LAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gZGU2MjBfc2V0X211bHRpY2FzdF9saXN0LAorCS5uZG9fY2hhbmdlX210dQkJPSBldGhfY2hhbmdlX210dSwKKwkubmRvX3NldF9tYWNfYWRkcmVzcyAJPSBldGhfbWFjX2FkZHIsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCit9OworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogT25seSBzdGFydC11cCBjb2RlIGJlbG93CkBAIC04NjEsMTIgKzg3Miw4IEBACiAJZWxzZQogCQlwcmludGsoIiBVVFApXG4iKTsKIAotCWRldi0+b3BlbiAJCT0gZGU2MjBfb3BlbjsKLQlkZXYtPnN0b3AgCQk9IGRlNjIwX2Nsb3NlOwotCWRldi0+aGFyZF9zdGFydF94bWl0IAk9IGRlNjIwX3N0YXJ0X3htaXQ7Ci0JZGV2LT50eF90aW1lb3V0IAk9IGRlNjIwX3RpbWVvdXQ7CisJZGV2LT5uZXRkZXZfb3BzID0gJmRlNjIwX25ldGRldl9vcHM7CiAJZGV2LT53YXRjaGRvZ190aW1lbwk9IEhaKjI7Ci0JZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBkZTYyMF9zZXRfbXVsdGljYXN0X2xpc3Q7CiAKIAkvKiBiYXNlX2FkZHIgYW5kIGlycSBhcmUgYWxyZWFkeSBzZXQsIHNlZSBhYm92ZSEgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMC5jIGIvZHJpdmVycy9uZXQvZTEwMC5jCmluZGV4IDlmMzhiMTYuLjg2YmI4NzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAuYworKysgYi9kcml2ZXJzL25ldC9lMTAwLmMKQEAgLTE2MSw2ICsxNjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KIAogCkBAIC0xNzQsMTAgKzE3NSwxNyBAQAogI2RlZmluZSBFMTAwX1dBVENIRE9HX1BFUklPRAkoMiAqIEhaKQogI2RlZmluZSBFMTAwX05BUElfV0VJR0hUCTE2CiAKKyNkZWZpbmUgRklSTVdBUkVfRDEwMU0JCSJlMTAwL2QxMDFtX3Vjb2RlLmJpbiIKKyNkZWZpbmUgRklSTVdBUkVfRDEwMVMJCSJlMTAwL2QxMDFzX3Vjb2RlLmJpbiIKKyNkZWZpbmUgRklSTVdBUkVfRDEwMkUJCSJlMTAwL2QxMDJlX3Vjb2RlLmJpbiIKKwogTU9EVUxFX0RFU0NSSVBUSU9OKERSVl9ERVNDUklQVElPTik7CiBNT0RVTEVfQVVUSE9SKERSVl9DT1BZUklHSFQpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworTU9EVUxFX0ZJUk1XQVJFKEZJUk1XQVJFX0QxMDFNKTsKK01PRFVMRV9GSVJNV0FSRShGSVJNV0FSRV9EMTAxUyk7CitNT0RVTEVfRklSTVdBUkUoRklSTVdBUkVfRDEwMkUpOwogCiBzdGF0aWMgaW50IGRlYnVnID0gMzsKIHN0YXRpYyBpbnQgZWVwcm9tX2JhZF9jc3VtX2FsbG93ID0gMDsKQEAgLTY1OCwxMiArNjY2LDEyIEBACiAJZTEwMF9kaXNhYmxlX2lycShuaWMpOwogCiAJLyogQ2hlY2sgcmVzdWx0cyBvZiBzZWxmLXRlc3QgKi8KLQlpZihuaWMtPm1lbS0+c2VsZnRlc3QucmVzdWx0ICE9IDApIHsKKwlpZiAobmljLT5tZW0tPnNlbGZ0ZXN0LnJlc3VsdCAhPSAwKSB7CiAJCURQUklOVEsoSFcsIEVSUiwgIlNlbGYtdGVzdCBmYWlsZWQ6IHJlc3VsdD0weCUwOFhcbiIsCiAJCQluaWMtPm1lbS0+c2VsZnRlc3QucmVzdWx0KTsKIAkJcmV0dXJuIC1FVElNRURPVVQ7CiAJfQotCWlmKG5pYy0+bWVtLT5zZWxmdGVzdC5zaWduYXR1cmUgPT0gMCkgeworCWlmIChuaWMtPm1lbS0+c2VsZnRlc3Quc2lnbmF0dXJlID09IDApIHsKIAkJRFBSSU5USyhIVywgRVJSLCAiU2VsZi10ZXN0IGZhaWxlZDogdGltZWQgb3V0XG4iKTsKIAkJcmV0dXJuIC1FVElNRURPVVQ7CiAJfQpAQCAtNjg0LDEzICs2OTIsMTMgQEAKIAljbWRfYWRkcl9kYXRhWzJdID0gb3BfZXdkcyA8PCAoYWRkcl9sZW4gLSAyKTsKIAogCS8qIEJpdC1iYW5nIGNtZHMgdG8gd3JpdGUgd29yZCB0byBlZXByb20gKi8KLQlmb3IoaiA9IDA7IGogPCAzOyBqKyspIHsKKwlmb3IgKGogPSAwOyBqIDwgMzsgaisrKSB7CiAKIAkJLyogQ2hpcCBzZWxlY3QgKi8KIAkJaW93cml0ZTgoZWVjcyB8IGVlc2ssICZuaWMtPmNzci0+ZWVwcm9tX2N0cmxfbG8pOwogCQllMTAwX3dyaXRlX2ZsdXNoKG5pYyk7IHVkZWxheSg0KTsKIAotCQlmb3IoaSA9IDMxOyBpID49IDA7IGktLSkgeworCQlmb3IgKGkgPSAzMTsgaSA+PSAwOyBpLS0pIHsKIAkJCWN0cmwgPSAoY21kX2FkZHJfZGF0YVtqXSAmICgxIDw8IGkpKSA/CiAJCQkJZWVjcyB8IGVlZGkgOiBlZWNzOwogCQkJaW93cml0ZTgoY3RybCwgJm5pYy0+Y3NyLT5lZXByb21fY3RybF9sbyk7CkBAIC03MjMsNyArNzMxLDcgQEAKIAllMTAwX3dyaXRlX2ZsdXNoKG5pYyk7IHVkZWxheSg0KTsKIAogCS8qIEJpdC1iYW5nIHRvIHJlYWQgd29yZCBmcm9tIGVlcHJvbSAqLwotCWZvcihpID0gMzE7IGkgPj0gMDsgaS0tKSB7CisJZm9yIChpID0gMzE7IGkgPj0gMDsgaS0tKSB7CiAJCWN0cmwgPSAoY21kX2FkZHJfZGF0YSAmICgxIDw8IGkpKSA/IGVlY3MgfCBlZWRpIDogZWVjczsKIAkJaW93cml0ZTgoY3RybCwgJm5pYy0+Y3NyLT5lZXByb21fY3RybF9sbyk7CiAJCWUxMDBfd3JpdGVfZmx1c2gobmljKTsgdWRlbGF5KDQpOwpAQCAtNzM0LDcgKzc0Miw3IEBACiAJCS8qIEVlcHJvbSBkcml2ZXMgYSBkdW1teSB6ZXJvIHRvIEVFRE8gYWZ0ZXIgcmVjZWl2aW5nCiAJCSAqIGNvbXBsZXRlIGFkZHJlc3MuICBVc2UgdGhpcyB0byBhZGp1c3QgYWRkcl9sZW4uICovCiAJCWN0cmwgPSBpb3JlYWQ4KCZuaWMtPmNzci0+ZWVwcm9tX2N0cmxfbG8pOwotCQlpZighKGN0cmwgJiBlZWRvKSAmJiBpID4gMTYpIHsKKwkJaWYgKCEoY3RybCAmIGVlZG8pICYmIGkgPiAxNikgewogCQkJKmFkZHJfbGVuIC09IChpIC0gMTYpOwogCQkJaSA9IDE3OwogCQl9CkBAIC03NTgsOSArNzY2LDkgQEAKIAllMTAwX2VlcHJvbV9yZWFkKG5pYywgJmFkZHJfbGVuLCAwKTsKIAluaWMtPmVlcHJvbV93YyA9IDEgPDwgYWRkcl9sZW47CiAKLQlmb3IoYWRkciA9IDA7IGFkZHIgPCBuaWMtPmVlcHJvbV93YzsgYWRkcisrKSB7CisJZm9yIChhZGRyID0gMDsgYWRkciA8IG5pYy0+ZWVwcm9tX3djOyBhZGRyKyspIHsKIAkJbmljLT5lZXByb21bYWRkcl0gPSBlMTAwX2VlcHJvbV9yZWFkKG5pYywgJmFkZHJfbGVuLCBhZGRyKTsKLQkJaWYoYWRkciA8IG5pYy0+ZWVwcm9tX3djIC0gMSkKKwkJaWYgKGFkZHIgPCBuaWMtPmVlcHJvbV93YyAtIDEpCiAJCQljaGVja3N1bSArPSBsZTE2X3RvX2NwdShuaWMtPmVlcHJvbVthZGRyXSk7CiAJfQogCkBAIC03ODQsMTUgKzc5MiwxNSBAQAogCWUxMDBfZWVwcm9tX3JlYWQobmljLCAmYWRkcl9sZW4sIDApOwogCW5pYy0+ZWVwcm9tX3djID0gMSA8PCBhZGRyX2xlbjsKIAotCWlmKHN0YXJ0ICsgY291bnQgPj0gbmljLT5lZXByb21fd2MpCisJaWYgKHN0YXJ0ICsgY291bnQgPj0gbmljLT5lZXByb21fd2MpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZm9yKGFkZHIgPSBzdGFydDsgYWRkciA8IHN0YXJ0ICsgY291bnQ7IGFkZHIrKykKKwlmb3IgKGFkZHIgPSBzdGFydDsgYWRkciA8IHN0YXJ0ICsgY291bnQ7IGFkZHIrKykKIAkJZTEwMF9lZXByb21fd3JpdGUobmljLCBhZGRyX2xlbiwgYWRkciwgbmljLT5lZXByb21bYWRkcl0pOwogCiAJLyogVGhlIGNoZWNrc3VtLCBzdG9yZWQgaW4gdGhlIGxhc3Qgd29yZCwgaXMgY2FsY3VsYXRlZCBzdWNoIHRoYXQKIAkgKiB0aGUgc3VtIG9mIHdvcmRzIHNob3VsZCBiZSAweEJBQkEgKi8KLQlmb3IoYWRkciA9IDA7IGFkZHIgPCBuaWMtPmVlcHJvbV93YyAtIDE7IGFkZHIrKykKKwlmb3IgKGFkZHIgPSAwOyBhZGRyIDwgbmljLT5lZXByb21fd2MgLSAxOyBhZGRyKyspCiAJCWNoZWNrc3VtICs9IGxlMTZfdG9fY3B1KG5pYy0+ZWVwcm9tW2FkZHJdKTsKIAluaWMtPmVlcHJvbVtuaWMtPmVlcHJvbV93YyAtIDFdID0gY3B1X3RvX2xlMTYoMHhCQUJBIC0gY2hlY2tzdW0pOwogCWUxMDBfZWVwcm9tX3dyaXRlKG5pYywgYWRkcl9sZW4sIG5pYy0+ZWVwcm9tX3djIC0gMSwKQEAgLTgxMiwxOSArODIwLDE5IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJm5pYy0+Y21kX2xvY2ssIGZsYWdzKTsKIAogCS8qIFByZXZpb3VzIGNvbW1hbmQgaXMgYWNjZXB0ZWQgd2hlbiBTQ0IgY2xlYXJzICovCi0JZm9yKGkgPSAwOyBpIDwgRTEwMF9XQUlUX1NDQl9USU1FT1VUOyBpKyspIHsKLQkJaWYobGlrZWx5KCFpb3JlYWQ4KCZuaWMtPmNzci0+c2NiLmNtZF9sbykpKQorCWZvciAoaSA9IDA7IGkgPCBFMTAwX1dBSVRfU0NCX1RJTUVPVVQ7IGkrKykgeworCQlpZiAobGlrZWx5KCFpb3JlYWQ4KCZuaWMtPmNzci0+c2NiLmNtZF9sbykpKQogCQkJYnJlYWs7CiAJCWNwdV9yZWxheCgpOwotCQlpZih1bmxpa2VseShpID4gRTEwMF9XQUlUX1NDQl9GQVNUKSkKKwkJaWYgKHVubGlrZWx5KGkgPiBFMTAwX1dBSVRfU0NCX0ZBU1QpKQogCQkJdWRlbGF5KDUpOwogCX0KLQlpZih1bmxpa2VseShpID09IEUxMDBfV0FJVF9TQ0JfVElNRU9VVCkpIHsKKwlpZiAodW5saWtlbHkoaSA9PSBFMTAwX1dBSVRfU0NCX1RJTUVPVVQpKSB7CiAJCWVyciA9IC1FQUdBSU47CiAJCWdvdG8gZXJyX3VubG9jazsKIAl9CiAKLQlpZih1bmxpa2VseShjbWQgIT0gY3VjX3Jlc3VtZSkpCisJaWYgKHVubGlrZWx5KGNtZCAhPSBjdWNfcmVzdW1lKSkKIAkJaW93cml0ZTMyKGRtYV9hZGRyLCAmbmljLT5jc3ItPnNjYi5nZW5fcHRyKTsKIAlpb3dyaXRlOChjbWQsICZuaWMtPmNzci0+c2NiLmNtZF9sbyk7CiAKQEAgLTg0Myw3ICs4NTEsNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm5pYy0+Y2JfbG9jaywgZmxhZ3MpOwogCi0JaWYodW5saWtlbHkoIW5pYy0+Y2JzX2F2YWlsKSkgeworCWlmICh1bmxpa2VseSghbmljLT5jYnNfYXZhaWwpKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX3VubG9jazsKIAl9CkBAIC04NTMsNyArODYxLDcgQEAKIAluaWMtPmNic19hdmFpbC0tOwogCWNiLT5za2IgPSBza2I7CiAKLQlpZih1bmxpa2VseSghbmljLT5jYnNfYXZhaWwpKQorCWlmICh1bmxpa2VseSghbmljLT5jYnNfYXZhaWwpKQogCQllcnIgPSAtRU5PU1BDOwogCiAJY2JfcHJlcGFyZShuaWMsIGNiLCBza2IpOwpAQCAtODY0LDE1ICs4NzIsMTUgQEAKIAl3bWIoKTsKIAljYi0+cHJldi0+Y29tbWFuZCAmPSBjcHVfdG9fbGUxNih+Y2Jfcyk7CiAKLQl3aGlsZShuaWMtPmNiX3RvX3NlbmQgIT0gbmljLT5jYl90b191c2UpIHsKLQkJaWYodW5saWtlbHkoZTEwMF9leGVjX2NtZChuaWMsIG5pYy0+Y3VjX2NtZCwKKwl3aGlsZSAobmljLT5jYl90b19zZW5kICE9IG5pYy0+Y2JfdG9fdXNlKSB7CisJCWlmICh1bmxpa2VseShlMTAwX2V4ZWNfY21kKG5pYywgbmljLT5jdWNfY21kLAogCQkJbmljLT5jYl90b19zZW5kLT5kbWFfYWRkcikpKSB7CiAJCQkvKiBPaywgaGVyZSdzIHdoZXJlIHRoaW5ncyBnZXQgc3RpY2t5LiAgSXQncwogCQkJICogcG9zc2libGUgdGhhdCB3ZSBjYW4ndCBzY2hlZHVsZSB0aGUgY29tbWFuZAogCQkJICogYmVjYXVzZSB0aGUgY29udHJvbGxlciBpcyB0b28gYnVzeSwgc28KIAkJCSAqIGxldCdzIGp1c3QgcXVldWUgdGhlIGNvbW1hbmQgYW5kIHRyeSBhZ2FpbgogCQkJICogd2hlbiBhbm90aGVyIGNvbW1hbmQgaXMgc2NoZWR1bGVkLiAqLwotCQkJaWYoZXJyID09IC1FTk9TUEMpIHsKKwkJCWlmIChlcnIgPT0gLUVOT1NQQykgewogCQkJCS8vcmVxdWVzdCBhIHJlc2V0CiAJCQkJc2NoZWR1bGVfd29yaygmbmljLT50eF90aW1lb3V0X3Rhc2spOwogCQkJfQpAQCAtOTQ1LDcgKzk1Myw3IEBACiAKIAkvKiBNQUMgdHlwZSBpcyBlbmNvZGVkIGFzIHJldiBJRDsgZXhjZXB0aW9uOiBJQ0ggaXMgdHJlYXRlZCBhcyA4MjU1OSAqLwogCW5pYy0+bWFjID0gKG5pYy0+ZmxhZ3MgJiBpY2gpID8gbWFjXzgyNTU5X0QxMDFNIDogbmljLT5wZGV2LT5yZXZpc2lvbjsKLQlpZihuaWMtPm1hYyA9PSBtYWNfdW5rbm93bikKKwlpZiAobmljLT5tYWMgPT0gbWFjX3Vua25vd24pCiAJCW5pYy0+bWFjID0gbWFjXzgyNTU3X0QxMDBfQTsKIAogCW5pYy0+cGFyYW1zLnJmZHMgPSByZmRzOwpAQCAtMTAwOCwyMyArMTAxNiwyMyBAQAogCWNvbmZpZy0+YWRhcHRpdmVfaWZzID0gbmljLT5hZGFwdGl2ZV9pZnM7CiAJY29uZmlnLT5sb29wYmFjayA9IG5pYy0+bG9vcGJhY2s7CiAKLQlpZihuaWMtPm1paS5mb3JjZV9tZWRpYSAmJiBuaWMtPm1paS5mdWxsX2R1cGxleCkKKwlpZiAobmljLT5taWkuZm9yY2VfbWVkaWEgJiYgbmljLT5taWkuZnVsbF9kdXBsZXgpCiAJCWNvbmZpZy0+ZnVsbF9kdXBsZXhfZm9yY2UgPSAweDE7CS8qIDE9Zm9yY2UsIDA9YXV0byAqLwogCi0JaWYobmljLT5mbGFncyAmIHByb21pc2N1b3VzIHx8IG5pYy0+bG9vcGJhY2spIHsKKwlpZiAobmljLT5mbGFncyAmIHByb21pc2N1b3VzIHx8IG5pYy0+bG9vcGJhY2spIHsKIAkJY29uZmlnLT5yeF9zYXZlX2JhZF9mcmFtZXMgPSAweDE7CS8qIDE9c2F2ZSwgMD1kaXNjYXJkICovCiAJCWNvbmZpZy0+cnhfZGlzY2FyZF9zaG9ydF9mcmFtZXMgPSAweDA7CS8qIDE9ZGlzY2FyZCwgMD1zYXZlICovCiAJCWNvbmZpZy0+cHJvbWlzY3VvdXNfbW9kZSA9IDB4MTsJCS8qIDE9b24sIDA9b2ZmICovCiAJfQogCi0JaWYobmljLT5mbGFncyAmIG11bHRpY2FzdF9hbGwpCisJaWYgKG5pYy0+ZmxhZ3MgJiBtdWx0aWNhc3RfYWxsKQogCQljb25maWctPm11bHRpY2FzdF9hbGwgPSAweDE7CQkvKiAxPWFjY2VwdCwgMD1ubyAqLwogCiAJLyogZGlzYWJsZSBXb0wgd2hlbiB1cCAqLwotCWlmKG5ldGlmX3J1bm5pbmcobmljLT5uZXRkZXYpIHx8ICEobmljLT5mbGFncyAmIHdvbF9tYWdpYykpCisJaWYgKG5ldGlmX3J1bm5pbmcobmljLT5uZXRkZXYpIHx8ICEobmljLT5mbGFncyAmIHdvbF9tYWdpYykpCiAJCWNvbmZpZy0+bWFnaWNfcGFja2V0X2Rpc2FibGUgPSAweDE7CS8qIDE9b2ZmLCAwPW9uICovCiAKLQlpZihuaWMtPm1hYyA+PSBtYWNfODI1NThfRDEwMV9BNCkgeworCWlmIChuaWMtPm1hYyA+PSBtYWNfODI1NThfRDEwMV9BNCkgewogCQljb25maWctPmZjX2Rpc2FibGUgPSAweDE7CS8qIDE9VHggZmMgb2ZmLCAwPVR4IGZjIG9uICovCiAJCWNvbmZpZy0+bXdpX2VuYWJsZSA9IDB4MTsJLyogMT1lbmFibGUsIDA9ZGlzYWJsZSAqLwogCQljb25maWctPnN0YW5kYXJkX3RjYiA9IDB4MDsJLyogMT1zdGFuZGFyZCwgMD1leHRlbmRlZCAqLwpAQCAtMTA0OSwxNzggKzEwNTcsNiBAQAogCQljWzE2XSwgY1sxN10sIGNbMThdLCBjWzE5XSwgY1syMF0sIGNbMjFdLCBjWzIyXSwgY1syM10pOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgTWljcm8gY29kZSBmb3IgODA4NjoxMjI5IFJldiA4ICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qICBQYXJhbWV0ZXIgdmFsdWVzIGZvciB0aGUgRDEwMU0gQi1zdGVwICAqLwotI2RlZmluZSBEMTAxTV9DUFVTQVZFUl9USU1FUl9EV09SRAkJNzgKLSNkZWZpbmUgRDEwMU1fQ1BVU0FWRVJfQlVORExFX0RXT1JECQk2NQotI2RlZmluZSBEMTAxTV9DUFVTQVZFUl9NSU5fU0laRV9EV09SRAkJMTI2Ci0KLSNkZWZpbmUgRDEwMU1fQl9SQ1ZCVU5ETEVfVUNPREUgXAote1wKLTB4MDA1NTAyMTUsIDB4RkZGRjA0MzcsIDB4RkZGRkZGRkYsIDB4MDZBNzA3ODksIDB4RkZGRkZGRkYsIDB4MDU1OEZGRkYsIFwKLTB4MDAwQzAwMDEsIDB4MDAxMDEzMTIsIDB4MDAwQzAwMDgsIDB4MDAzODAyMTYsIFwKLTB4MDAxMDAwOUMsIDB4MDAyMDQwNTYsIDB4MDAyMzgwQ0MsIDB4MDAzODAwNTYsIFwKLTB4MDAxMDAwOUMsIDB4MDAyNDRDMEIsIDB4MDAwMDA4MDAsIDB4MDAxMjQ4MTgsIFwKLTB4MDAzODA0MzgsIDB4MDAwMDAwMDAsIDB4MDAxNDAwMDAsIDB4MDAzODA1NTUsIFwKLTB4MDAzMDgwMDAsIDB4MDAxMDA2NjIsIDB4MDAxMDA1NjEsIDB4MDAwRTA0MDgsIFwKLTB4MDAxMzQ4NjEsIDB4MDAwQzAwMDIsIDB4MDAxMDMwOTMsIDB4MDAzMDgwMDAsIFwKLTB4MDAxMDA2MjQsIDB4MDAxMDA1NjEsIDB4MDAwRTA0MDgsIDB4MDAxMDA4NjEsIFwKLTB4MDAwQzAwN0UsIDB4MDAyMjJDMjEsIDB4MDAwQzAwMDIsIDB4MDAxMDMwOTMsIFwKLTB4MDAzODBDN0EsIDB4MDAwODAwMDAsIDB4MDAxMDMwOTAsIDB4MDAzODBDN0EsIFwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDAxMDAwOUMsIDB4MDAyNDRDMkQsIDB4MDAwMTAwMDQsIDB4MDAwNDEwMDAsIFwKLTB4MDAzQTA0MzcsIDB4MDAwNDQwMTAsIDB4MDAzODA3OEEsIDB4MDAwMDAwMDAsIFwKLTB4MDAxMDAwOTksIDB4MDAyMDZDN0EsIDB4MDAxMDAwOUMsIDB4MDAyNDRDNDgsIFwKLTB4MDAxMzA4MjQsIDB4MDAwQzAwMDEsIDB4MDAxMDEyMTMsIDB4MDAyNjBDNzUsIFwKLTB4MDAwNDEwMDAsIDB4MDAwMTAwMDQsIDB4MDAxMzA4MjYsIDB4MDAwQzAwMDYsIFwKLTB4MDAyMjA2QTgsIDB4MDAxM0M5MjYsIDB4MDAxMDEzMTMsIDB4MDAzODA2QTgsIFwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDAwODA2MDAsIDB4MDAxMDFCMTAsIDB4MDAwNTAwMDQsIDB4MDAxMDA4MjYsIFwKLTB4MDAxMDEyMTAsIDB4MDAzODBDMzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDAyMTE1NUIsIDB4MDAxMDAwOTksIDB4MDAyMDY1NTksIDB4MDAxMDAwOUMsIFwKLTB4MDAyNDQ1NTksIDB4MDAxMzA4MzYsIDB4MDAwQzAwMDAsIDB4MDAyMjBDNjIsIFwKLTB4MDAwQzAwMDEsIDB4MDAxMDFCMTMsIDB4MDAyMjlDMEUsIDB4MDAyMTBDMEUsIFwKLTB4MDAyMjZDMEUsIDB4MDAyMTZDMEUsIDB4MDAyMkZDMEUsIDB4MDAyMTVDMEUsIFwKLTB4MDAyMTRDMEUsIDB4MDAzODA1NTUsIDB4MDAwMTAwMDQsIDB4MDAwNDEwMDAsIFwKLTB4MDAyNzhDNjcsIDB4MDAwNDA4MDAsIDB4MDAwMTgxMDAsIDB4MDAzQTA0MzcsIFwKLTB4MDAxMzA4MjYsIDB4MDAwQzAwMDEsIDB4MDAyMjA1NTksIDB4MDAxMDEzMTMsIFwKLTB4MDAzODA1NTksIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDAwMDAwMDAsIDB4MDAxMzA4MzEsIDB4MDAxMDA5MEIsIDB4MDAxMjQ4MTMsIFwKLTB4MDAwQ0ZGODAsIDB4MDAyNjA2QUIsIDB4MDAwNDEwMDAsIDB4MDAwMTAwMDQsIFwKLTB4MDAzODA2QTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogIE1pY3JvIGNvZGUgZm9yIDgwODY6MTIyOSBSZXYgOSAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAgUGFyYW1ldGVyIHZhbHVlcyBmb3IgdGhlIEQxMDFTICAqLwotI2RlZmluZSBEMTAxU19DUFVTQVZFUl9USU1FUl9EV09SRAkJNzgKLSNkZWZpbmUgRDEwMVNfQ1BVU0FWRVJfQlVORExFX0RXT1JECQk2NwotI2RlZmluZSBEMTAxU19DUFVTQVZFUl9NSU5fU0laRV9EV09SRAkJMTI4Ci0KLSNkZWZpbmUgRDEwMVNfUkNWQlVORExFX1VDT0RFIFwKLXtcCi0weDAwNTUwMjQyLCAweEZGRkYwNDdFLCAweEZGRkZGRkZGLCAweDA2RkYwODE4LCAweEZGRkZGRkZGLCAweDA1QTZGRkZGLCBcCi0weDAwMEMwMDAxLCAweDAwMTAxMzEyLCAweDAwMEMwMDA4LCAweDAwMzgwMjQzLCBcCi0weDAwMTAwMDlDLCAweDAwMjA0MDU2LCAweDAwMjM4MEQwLCAweDAwMzgwMDU2LCBcCi0weDAwMTAwMDlDLCAweDAwMjQ0RjhCLCAweDAwMDAwODAwLCAweDAwMTI0ODE4LCBcCi0weDAwMzgwNDdGLCAweDAwMDAwMDAwLCAweDAwMTQwMDAwLCAweDAwMzgwNUEzLCBcCi0weDAwMzA4MDAwLCAweDAwMTAwNjEwLCAweDAwMTAwNTYxLCAweDAwMEUwNDA4LCBcCi0weDAwMTM0ODYxLCAweDAwMEMwMDAyLCAweDAwMTAzMDkzLCAweDAwMzA4MDAwLCBcCi0weDAwMTAwNjI0LCAweDAwMTAwNTYxLCAweDAwMEUwNDA4LCAweDAwMTAwODYxLCBcCi0weDAwMEMwMDdFLCAweDAwMjIyRkExLCAweDAwMEMwMDAyLCAweDAwMTAzMDkzLCBcCi0weDAwMzgwRjkwLCAweDAwMDgwMDAwLCAweDAwMTAzMDkwLCAweDAwMzgwRjkwLCBcCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwMTAwMDlDLCAweDAwMjQ0RkFELCAweDAwMDEwMDA0LCAweDAwMDQxMDAwLCBcCi0weDAwM0EwNDdFLCAweDAwMDQ0MDEwLCAweDAwMzgwODE5LCAweDAwMDAwMDAwLCBcCi0weDAwMTAwMDk5LCAweDAwMjA2RkZELCAweDAwMTAwMDlBLCAweDAwMjBBRkZELCBcCi0weDAwMTAwMDlDLCAweDAwMjQ0RkM4LCAweDAwMTMwODI0LCAweDAwMEMwMDAxLCBcCi0weDAwMTAxMjEzLCAweDAwMjYwRkY3LCAweDAwMDQxMDAwLCAweDAwMDEwMDA0LCBcCi0weDAwMTMwODI2LCAweDAwMEMwMDA2LCAweDAwMjIwNzAwLCAweDAwMTNDOTI2LCBcCi0weDAwMTAxMzEzLCAweDAwMzgwNzAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwMDgwNjAwLCAweDAwMTAxQjEwLCAweDAwMDUwMDA0LCAweDAwMTAwODI2LCBcCi0weDAwMTAxMjEwLCAweDAwMzgwRkI2LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwMjExNUE5LCAweDAwMTAwMDk5LCAweDAwMjA2NUE3LCAweDAwMTAwMDlBLCBcCi0weDAwMjBBNUE3LCAweDAwMTAwMDlDLCAweDAwMjQ0NUE3LCAweDAwMTMwODM2LCBcCi0weDAwMEMwMDAwLCAweDAwMjIwRkU0LCAweDAwMEMwMDAxLCAweDAwMTAxQjEzLCBcCi0weDAwMjI5RjhFLCAweDAwMjEwRjhFLCAweDAwMjI2RjhFLCAweDAwMjE2RjhFLCBcCi0weDAwMjJGRjhFLCAweDAwMjE1RjhFLCAweDAwMjE0RjhFLCAweDAwMzgwNUEzLCBcCi0weDAwMDEwMDA0LCAweDAwMDQxMDAwLCAweDAwMjc4RkU5LCAweDAwMDQwODAwLCBcCi0weDAwMDE4MTAwLCAweDAwM0EwNDdFLCAweDAwMTMwODI2LCAweDAwMEMwMDAxLCBcCi0weDAwMjIwNUE3LCAweDAwMTAxMzEzLCAweDAwMzgwNUE3LCAweDAwMDAwMDAwLCBcCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMTMwODMxLCBcCi0weDAwMTAwOTBCLCAweDAwMTI0ODEzLCAweDAwMENGRjgwLCAweDAwMjYwNzAzLCBcCi0weDAwMDQxMDAwLCAweDAwMDEwMDA0LCAweDAwMzgwNzAwICBcCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICBNaWNybyBjb2RlIGZvciB0aGUgODA4NjoxMjI5IFJldiBGLzEwICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogIFBhcmFtZXRlciB2YWx1ZXMgZm9yIHRoZSBEMTAyIEUtc3RlcCAgKi8KLSNkZWZpbmUgRDEwMl9FX0NQVVNBVkVSX1RJTUVSX0RXT1JECQk0MgotI2RlZmluZSBEMTAyX0VfQ1BVU0FWRVJfQlVORExFX0RXT1JECQk1NAotI2RlZmluZSBEMTAyX0VfQ1BVU0FWRVJfTUlOX1NJWkVfRFdPUkQJCTQ2Ci0KLSNkZWZpbmUgICAgIEQxMDJfRV9SQ1ZCVU5ETEVfVUNPREUgXAote1wKLTB4MDA3RDAyOEYsIDB4MEU0MjA0RjksIDB4MTRFRDBDODUsIDB4MTRGQTE0RTksIDB4MEVGNzBFMzYsIDB4MUZGRjFGRkYsIFwKLTB4MDBFMDE0QjksIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDBFMDE0QkQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDBFMDE0RDUsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDBFMDE0QzEsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDBFMDE0QzgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDAyMDA2MDAsIDB4MDBFMDE0RUUsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDAzMEZGODAsIDB4MDA5NDBFNDYsIDB4MDAwMzgyMDAsIDB4MDAxMDIwMDAsIFwKLTB4MDBFMDBFNDMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDAzMDAwMDYsIDB4MDBFMDE0RkIsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDA5MDZFNDEsIDB4MDA4MDBFM0MsIDB4MDBFMDBFMzksIDB4MDAwMDAwMDAsIFwKLTB4MDA5MDZFRkQsIDB4MDA5MDBFRkQsIDB4MDBFMDBFRjgsIDB4MDAwMDAwMDAsIFwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIFwKLX0KLQotc3RhdGljIHZvaWQgZTEwMF9zZXR1cF91Y29kZShzdHJ1Y3QgbmljICpuaWMsIHN0cnVjdCBjYiAqY2IsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0vKiAqSU5ERU5ULU9GRiogKi8KLQlzdGF0aWMgc3RydWN0IHsKLQkJdTMyIHVjb2RlW1VDT0RFX1NJWkUgKyAxXTsKLQkJdTggbWFjOwotCQl1OCB0aW1lcl9kd29yZDsKLQkJdTggYnVuZGxlX2R3b3JkOwotCQl1OCBtaW5fc2l6ZV9kd29yZDsKLQl9IHVjb2RlX29wdHNbXSA9IHsKLQkJeyBEMTAxTV9CX1JDVkJVTkRMRV9VQ09ERSwKLQkJICBtYWNfODI1NTlfRDEwMU0sCi0JCSAgRDEwMU1fQ1BVU0FWRVJfVElNRVJfRFdPUkQsCi0JCSAgRDEwMU1fQ1BVU0FWRVJfQlVORExFX0RXT1JELAotCQkgIEQxMDFNX0NQVVNBVkVSX01JTl9TSVpFX0RXT1JEIH0sCi0JCXsgRDEwMVNfUkNWQlVORExFX1VDT0RFLAotCQkgIG1hY184MjU1OV9EMTAxUywKLQkJICBEMTAxU19DUFVTQVZFUl9USU1FUl9EV09SRCwKLQkJICBEMTAxU19DUFVTQVZFUl9CVU5ETEVfRFdPUkQsCi0JCSAgRDEwMVNfQ1BVU0FWRVJfTUlOX1NJWkVfRFdPUkQgfSwKLQkJeyBEMTAyX0VfUkNWQlVORExFX1VDT0RFLAotCQkgIG1hY184MjU1MV9GLAotCQkgIEQxMDJfRV9DUFVTQVZFUl9USU1FUl9EV09SRCwKLQkJICBEMTAyX0VfQ1BVU0FWRVJfQlVORExFX0RXT1JELAotCQkgIEQxMDJfRV9DUFVTQVZFUl9NSU5fU0laRV9EV09SRCB9LAotCQl7IEQxMDJfRV9SQ1ZCVU5ETEVfVUNPREUsCi0JCSAgbWFjXzgyNTUxXzEwLAotCQkgIEQxMDJfRV9DUFVTQVZFUl9USU1FUl9EV09SRCwKLQkJICBEMTAyX0VfQ1BVU0FWRVJfQlVORExFX0RXT1JELAotCQkgIEQxMDJfRV9DUFVTQVZFUl9NSU5fU0laRV9EV09SRCB9LAotCQl7IHswfSwgMCwgMCwgMCwgMH0KLQl9LCAqb3B0czsKLS8qICpJTkRFTlQtT04qICovCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBDUFVTYXZlciBwYXJhbWV0ZXJzCiAqCkBAIC0xMjgwLDQyICsxMTE2LDEwMSBAQAogI2RlZmluZSBCVU5ETEVNQVggKHUxNik2CiAjZGVmaW5lIElOVERFTEFZICh1MTYpMTUzNiAvKiAweDYwMCAqLwogCisvKiBJbml0aWFsaXplIGZpcm13YXJlICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpcm13YXJlICplMTAwX3JlcXVlc3RfZmlybXdhcmUoc3RydWN0IG5pYyAqbmljKQoreworCWNvbnN0IGNoYXIgKmZ3X25hbWU7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKKwl1OCB0aW1lciwgYnVuZGxlLCBtaW5fc2l6ZTsKKwlpbnQgZXJyOworCiAJLyogZG8gbm90IGxvYWQgdS1jb2RlIGZvciBJQ0ggZGV2aWNlcyAqLwogCWlmIChuaWMtPmZsYWdzICYgaWNoKQotCQlnb3RvIG5vbG9hZHVjb2RlOworCQlyZXR1cm4gTlVMTDsKIAogCS8qIFNlYXJjaCBmb3IgdWNvZGUgbWF0Y2ggYWdhaW5zdCBoL3cgcmV2aXNpb24gKi8KLQlmb3IgKG9wdHMgPSB1Y29kZV9vcHRzOyBvcHRzLT5tYWM7IG9wdHMrKykgewotCQlpbnQgaTsKLQkJdTMyICp1Y29kZSA9IG9wdHMtPnVjb2RlOwotCQlpZiAobmljLT5tYWMgIT0gb3B0cy0+bWFjKQotCQkJY29udGludWU7CisJaWYgKG5pYy0+bWFjID09IG1hY184MjU1OV9EMTAxTSkKKwkJZndfbmFtZSA9IEZJUk1XQVJFX0QxMDFNOworCWVsc2UgaWYgKG5pYy0+bWFjID09IG1hY184MjU1OV9EMTAxUykKKwkJZndfbmFtZSA9IEZJUk1XQVJFX0QxMDFTOworCWVsc2UgaWYgKG5pYy0+bWFjID09IG1hY184MjU1MV9GIHx8IG5pYy0+bWFjID09IG1hY184MjU1MV8xMCkKKwkJZndfbmFtZSA9IEZJUk1XQVJFX0QxMDJFOworCWVsc2UgLyogTm8gdWNvZGUgb24gb3RoZXIgZGV2aWNlcyAqLworCQlyZXR1cm4gTlVMTDsKIAotCQkvKiBJbnNlcnQgdXNlci10dW5hYmxlIHNldHRpbmdzICovCi0JCXVjb2RlW29wdHMtPnRpbWVyX2R3b3JkXSAmPSAweEZGRkYwMDAwOwotCQl1Y29kZVtvcHRzLT50aW1lcl9kd29yZF0gfD0gSU5UREVMQVk7Ci0JCXVjb2RlW29wdHMtPmJ1bmRsZV9kd29yZF0gJj0gMHhGRkZGMDAwMDsKLQkJdWNvZGVbb3B0cy0+YnVuZGxlX2R3b3JkXSB8PSBCVU5ETEVNQVg7Ci0JCXVjb2RlW29wdHMtPm1pbl9zaXplX2R3b3JkXSAmPSAweEZGRkYwMDAwOwotCQl1Y29kZVtvcHRzLT5taW5fc2l6ZV9kd29yZF0gfD0gKEJVTkRMRVNNQUxMKSA/IDB4RkZGRiA6IDB4RkY4MDsKLQotCQlmb3IgKGkgPSAwOyBpIDwgVUNPREVfU0laRTsgaSsrKQotCQkJY2ItPnUudWNvZGVbaV0gPSBjcHVfdG9fbGUzMih1Y29kZVtpXSk7Ci0JCWNiLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY2JfdWNvZGUgfCBjYl9lbCk7Ci0JCXJldHVybjsKKwllcnIgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZndfbmFtZSwgJm5pYy0+cGRldi0+ZGV2KTsKKwlpZiAoZXJyKSB7CisJCURQUklOVEsoUFJPQkUsIEVSUiwgIkZhaWxlZCB0byBsb2FkIGZpcm13YXJlIFwiJXNcIjogJWRcbiIsCisJCQlmd19uYW1lLCBlcnIpOworCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCX0KKwkvKiBGaXJtd2FyZSBzaG91bGQgYmUgcHJlY2lzZWx5IFVDT0RFX1NJWkUgKHdvcmRzKSBwbHVzIHRocmVlIGJ5dGVzCisJICAgaW5kaWNhdGluZyB0aGUgb2Zmc2V0cyBmb3IgQlVORExFU01BTEwsIEJVTkRMRU1BWCwgSU5UREVMQVkgKi8KKwlpZiAoZnctPnNpemUgIT0gVUNPREVfU0laRSAqIDQgKyAzKSB7CisJCURQUklOVEsoUFJPQkUsIEVSUiwgIkZpcm13YXJlIFwiJXNcIiBoYXMgd3Jvbmcgc2l6ZSAlenVcbiIsCisJCQlmd19uYW1lLCBmdy0+c2l6ZSk7CisJCXJlbGVhc2VfZmlybXdhcmUoZncpOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAl9CiAKLW5vbG9hZHVjb2RlOgotCWNiLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY2Jfbm9wIHwgY2JfZWwpOworCS8qIFJlYWQgdGltZXIsIGJ1bmRsZSBhbmQgbWluX3NpemUgZnJvbSBlbmQgb2YgZmlybXdhcmUgYmxvYiAqLworCXRpbWVyID0gZnctPmRhdGFbVUNPREVfU0laRSAqIDRdOworCWJ1bmRsZSA9IGZ3LT5kYXRhW1VDT0RFX1NJWkUgKiA0ICsgMV07CisJbWluX3NpemUgPSBmdy0+ZGF0YVtVQ09ERV9TSVpFICogNCArIDJdOworCisJaWYgKHRpbWVyID49IFVDT0RFX1NJWkUgfHwgYnVuZGxlID49IFVDT0RFX1NJWkUgfHwKKwkgICAgbWluX3NpemUgPj0gVUNPREVfU0laRSkgeworCQlEUFJJTlRLKFBST0JFLCBFUlIsCisJCQkiXCIlc1wiIGhhcyBib2d1cyBvZmZzZXQgdmFsdWVzICgweCV4LDB4JXgsMHgleClcbiIsCisJCQlmd19uYW1lLCB0aW1lciwgYnVuZGxlLCBtaW5fc2l6ZSk7CisJCXJlbGVhc2VfZmlybXdhcmUoZncpOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisJLyogT0ssIGZpcm13YXJlIGlzIHZhbGlkYXRlZCBhbmQgcmVhZHkgdG8gdXNlLi4uICovCisJcmV0dXJuIGZ3OwogfQogCi1zdGF0aWMgaW5saW5lIGludCBlMTAwX2V4ZWNfY2Jfd2FpdChzdHJ1Y3QgbmljICpuaWMsIHN0cnVjdCBza19idWZmICpza2IsCi0Jdm9pZCAoKmNiX3ByZXBhcmUpKHN0cnVjdCBuaWMgKiwgc3RydWN0IGNiICosIHN0cnVjdCBza19idWZmICopKQorc3RhdGljIHZvaWQgZTEwMF9zZXR1cF91Y29kZShzdHJ1Y3QgbmljICpuaWMsIHN0cnVjdCBjYiAqY2IsCisJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpCiB7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdyA9ICh2b2lkICopc2tiOworCXU4IHRpbWVyLCBidW5kbGUsIG1pbl9zaXplOworCisJLyogSXQncyBub3QgYSByZWFsIHNrYjsgd2UganVzdCBhYnVzZWQgdGhlIGZhY3QgdGhhdCBlMTAwX2V4ZWNfY2IKKwkgICB3aWxsIHBhc3MgaXQgdGhyb3VnaCB0byBoZXJlLi4uICovCisJY2ItPnNrYiA9IE5VTEw7CisKKwkvKiBmaXJtd2FyZSBpcyBzdG9yZWQgYXMgbGl0dGxlIGVuZGlhbiBhbHJlYWR5ICovCisJbWVtY3B5KGNiLT51LnVjb2RlLCBmdy0+ZGF0YSwgVUNPREVfU0laRSAqIDQpOworCisJLyogUmVhZCB0aW1lciwgYnVuZGxlIGFuZCBtaW5fc2l6ZSBmcm9tIGVuZCBvZiBmaXJtd2FyZSBibG9iICovCisJdGltZXIgPSBmdy0+ZGF0YVtVQ09ERV9TSVpFICogNF07CisJYnVuZGxlID0gZnctPmRhdGFbVUNPREVfU0laRSAqIDQgKyAxXTsKKwltaW5fc2l6ZSA9IGZ3LT5kYXRhW1VDT0RFX1NJWkUgKiA0ICsgMl07CisKKwkvKiBJbnNlcnQgdXNlci10dW5hYmxlIHNldHRpbmdzIGluIGNiLT51LnVjb2RlICovCisJY2ItPnUudWNvZGVbdGltZXJdICY9IGNwdV90b19sZTMyKDB4RkZGRjAwMDApOworCWNiLT51LnVjb2RlW3RpbWVyXSB8PSBjcHVfdG9fbGUzMihJTlRERUxBWSk7CisJY2ItPnUudWNvZGVbYnVuZGxlXSAmPSBjcHVfdG9fbGUzMigweEZGRkYwMDAwKTsKKwljYi0+dS51Y29kZVtidW5kbGVdIHw9IGNwdV90b19sZTMyKEJVTkRMRU1BWCk7CisJY2ItPnUudWNvZGVbbWluX3NpemVdICY9IGNwdV90b19sZTMyKDB4RkZGRjAwMDApOworCWNiLT51LnVjb2RlW21pbl9zaXplXSB8PSBjcHVfdG9fbGUzMigoQlVORExFU01BTEwpID8gMHhGRkZGIDogMHhGRjgwKTsKKworCWNiLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY2JfdWNvZGUgfCBjYl9lbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGUxMDBfbG9hZF91Y29kZV93YWl0KHN0cnVjdCBuaWMgKm5pYykKK3sKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OwogCWludCBlcnIgPSAwLCBjb3VudGVyID0gNTA7CiAJc3RydWN0IGNiICpjYiA9IG5pYy0+Y2JfdG9fY2xlYW47CiAKLQlpZiAoKGVyciA9IGUxMDBfZXhlY19jYihuaWMsIE5VTEwsIGUxMDBfc2V0dXBfdWNvZGUpKSkKKwlmdyA9IGUxMDBfcmVxdWVzdF9maXJtd2FyZShuaWMpOworCS8qIElmIGl0J3MgTlVMTCwgdGhlbiBubyB1Y29kZSBpcyByZXF1aXJlZCAqLworCWlmICghZncgfHwgSVNfRVJSKGZ3KSkKKwkJcmV0dXJuIFBUUl9FUlIoZncpOworCisJaWYgKChlcnIgPSBlMTAwX2V4ZWNfY2IobmljLCAodm9pZCAqKWZ3LCBlMTAwX3NldHVwX3Vjb2RlKSkpCiAJCURQUklOVEsoUFJPQkUsRVJSLCAidWNvZGUgY21kIGZhaWxlZCB3aXRoIGVycm9yICVkXG4iLCBlcnIpOwogCiAJLyogbXVzdCByZXN0YXJ0IGN1YyAqLwpAQCAtMTM2OSwyMSArMTI2NCwyMSBAQAogCXUxNiBibWNyLCBzdGF0LCBpZF9sbywgaWRfaGksIGNvbmc7CiAKIAkvKiBEaXNjb3ZlciBwaHkgYWRkciBieSBzZWFyY2hpbmcgYWRkcnMgaW4gb3JkZXIgezEsMCwyLC4uLiwgMzF9ICovCi0JZm9yKGFkZHIgPSAwOyBhZGRyIDwgMzI7IGFkZHIrKykgeworCWZvciAoYWRkciA9IDA7IGFkZHIgPCAzMjsgYWRkcisrKSB7CiAJCW5pYy0+bWlpLnBoeV9pZCA9IChhZGRyID09IDApID8gMSA6IChhZGRyID09IDEpID8gMCA6IGFkZHI7CiAJCWJtY3IgPSBtZGlvX3JlYWQobmV0ZGV2LCBuaWMtPm1paS5waHlfaWQsIE1JSV9CTUNSKTsKIAkJc3RhdCA9IG1kaW9fcmVhZChuZXRkZXYsIG5pYy0+bWlpLnBoeV9pZCwgTUlJX0JNU1IpOwogCQlzdGF0ID0gbWRpb19yZWFkKG5ldGRldiwgbmljLT5taWkucGh5X2lkLCBNSUlfQk1TUik7Ci0JCWlmKCEoKGJtY3IgPT0gMHhGRkZGKSB8fCAoKHN0YXQgPT0gMCkgJiYgKGJtY3IgPT0gMCkpKSkKKwkJaWYgKCEoKGJtY3IgPT0gMHhGRkZGKSB8fCAoKHN0YXQgPT0gMCkgJiYgKGJtY3IgPT0gMCkpKSkKIAkJCWJyZWFrOwogCX0KIAlEUFJJTlRLKEhXLCBERUJVRywgInBoeV9hZGRyID0gJWRcbiIsIG5pYy0+bWlpLnBoeV9pZCk7Ci0JaWYoYWRkciA9PSAzMikKKwlpZiAoYWRkciA9PSAzMikKIAkJcmV0dXJuIC1FQUdBSU47CiAKIAkvKiBTZWxlY3RlZCB0aGUgcGh5IGFuZCBpc29sYXRlIHRoZSByZXN0ICovCi0JZm9yKGFkZHIgPSAwOyBhZGRyIDwgMzI7IGFkZHIrKykgewotCQlpZihhZGRyICE9IG5pYy0+bWlpLnBoeV9pZCkgeworCWZvciAoYWRkciA9IDA7IGFkZHIgPCAzMjsgYWRkcisrKSB7CisJCWlmIChhZGRyICE9IG5pYy0+bWlpLnBoeV9pZCkgewogCQkJbWRpb193cml0ZShuZXRkZXYsIGFkZHIsIE1JSV9CTUNSLCBCTUNSX0lTT0xBVEUpOwogCQl9IGVsc2UgewogCQkJYm1jciA9IG1kaW9fcmVhZChuZXRkZXYsIGFkZHIsIE1JSV9CTUNSKTsKQEAgLTE0MDAsNyArMTI5NSw3IEBACiAKIAkvKiBIYW5kbGUgTmF0aW9uYWwgdHggcGh5cyAqLwogI2RlZmluZSBOQ1NfUEhZX01PREVMX01BU0sJMHhGRkYwRkZGRgotCWlmKChuaWMtPnBoeSAmIE5DU19QSFlfTU9ERUxfTUFTSykgPT0gcGh5X25zY190eCkgeworCWlmICgobmljLT5waHkgJiBOQ1NfUEhZX01PREVMX01BU0spID09IHBoeV9uc2NfdHgpIHsKIAkJLyogRGlzYWJsZSBjb25nZXN0aW9uIGNvbnRyb2wgKi8KIAkJY29uZyA9IG1kaW9fcmVhZChuZXRkZXYsIG5pYy0+bWlpLnBoeV9pZCwgTUlJX05TQ19DT05HKTsKIAkJY29uZyB8PSBOU0NfQ09OR19UWFJFQURZOwpAQCAtMTQwOCw3ICsxMzAzLDcgQEAKIAkJbWRpb193cml0ZShuZXRkZXYsIG5pYy0+bWlpLnBoeV9pZCwgTUlJX05TQ19DT05HLCBjb25nKTsKIAl9CiAKLQlpZigobmljLT5tYWMgPj0gbWFjXzgyNTUwX0QxMDIpIHx8ICgobmljLT5mbGFncyAmIGljaCkgJiYKKwlpZiAoKG5pYy0+bWFjID49IG1hY184MjU1MF9EMTAyKSB8fCAoKG5pYy0+ZmxhZ3MgJiBpY2gpICYmCiAJICAgKG1kaW9fcmVhZChuZXRkZXYsIG5pYy0+bWlpLnBoeV9pZCwgTUlJX1RQSVNUQVRVUykgJiAweDgwMDApICYmCiAJCSEobmljLT5lZXByb21bZWVwcm9tX2NuZmdfbWRpeF0gJiBlZXByb21fbWRpeF9lbmFibGVkKSkpIHsKIAkJLyogZW5hYmxlL2Rpc2FibGUgTURJL01ESS1YIGF1dG8tc3dpdGNoaW5nLiAqLwpAQCAtMTQyNiwyNSArMTMyMSwyNSBAQAogCWUxMDBfaHdfcmVzZXQobmljKTsKIAogCURQUklOVEsoSFcsIEVSUiwgImUxMDBfaHdfaW5pdFxuIik7Ci0JaWYoIWluX2ludGVycnVwdCgpICYmIChlcnIgPSBlMTAwX3NlbGZfdGVzdChuaWMpKSkKKwlpZiAoIWluX2ludGVycnVwdCgpICYmIChlcnIgPSBlMTAwX3NlbGZfdGVzdChuaWMpKSkKIAkJcmV0dXJuIGVycjsKIAotCWlmKChlcnIgPSBlMTAwX3BoeV9pbml0KG5pYykpKQorCWlmICgoZXJyID0gZTEwMF9waHlfaW5pdChuaWMpKSkKIAkJcmV0dXJuIGVycjsKLQlpZigoZXJyID0gZTEwMF9leGVjX2NtZChuaWMsIGN1Y19sb2FkX2Jhc2UsIDApKSkKKwlpZiAoKGVyciA9IGUxMDBfZXhlY19jbWQobmljLCBjdWNfbG9hZF9iYXNlLCAwKSkpCiAJCXJldHVybiBlcnI7Ci0JaWYoKGVyciA9IGUxMDBfZXhlY19jbWQobmljLCBydWNfbG9hZF9iYXNlLCAwKSkpCisJaWYgKChlcnIgPSBlMTAwX2V4ZWNfY21kKG5pYywgcnVjX2xvYWRfYmFzZSwgMCkpKQogCQlyZXR1cm4gZXJyOwotCWlmICgoZXJyID0gZTEwMF9leGVjX2NiX3dhaXQobmljLCBOVUxMLCBlMTAwX3NldHVwX3Vjb2RlKSkpCisJaWYgKChlcnIgPSBlMTAwX2xvYWRfdWNvZGVfd2FpdChuaWMpKSkKIAkJcmV0dXJuIGVycjsKLQlpZigoZXJyID0gZTEwMF9leGVjX2NiKG5pYywgTlVMTCwgZTEwMF9jb25maWd1cmUpKSkKKwlpZiAoKGVyciA9IGUxMDBfZXhlY19jYihuaWMsIE5VTEwsIGUxMDBfY29uZmlndXJlKSkpCiAJCXJldHVybiBlcnI7Ci0JaWYoKGVyciA9IGUxMDBfZXhlY19jYihuaWMsIE5VTEwsIGUxMDBfc2V0dXBfaWFhZGRyKSkpCisJaWYgKChlcnIgPSBlMTAwX2V4ZWNfY2IobmljLCBOVUxMLCBlMTAwX3NldHVwX2lhYWRkcikpKQogCQlyZXR1cm4gZXJyOwotCWlmKChlcnIgPSBlMTAwX2V4ZWNfY21kKG5pYywgY3VjX2R1bXBfYWRkciwKKwlpZiAoKGVyciA9IGUxMDBfZXhlY19jbWQobmljLCBjdWNfZHVtcF9hZGRyLAogCQluaWMtPmRtYV9hZGRyICsgb2Zmc2V0b2Yoc3RydWN0IG1lbSwgc3RhdHMpKSkpCiAJCXJldHVybiBlcnI7Ci0JaWYoKGVyciA9IGUxMDBfZXhlY19jbWQobmljLCBjdWNfZHVtcF9yZXNldCwgMCkpKQorCWlmICgoZXJyID0gZTEwMF9leGVjX2NtZChuaWMsIGN1Y19kdW1wX3Jlc2V0LCAwKSkpCiAJCXJldHVybiBlcnI7CiAKIAllMTAwX2Rpc2FibGVfaXJxKG5pYyk7CkBAIC0xNDYwLDcgKzEzNTUsNyBAQAogCiAJY2ItPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjYl9tdWx0aSk7CiAJY2ItPnUubXVsdGkuY291bnQgPSBjcHVfdG9fbGUxNihjb3VudCAqIEVUSF9BTEVOKTsKLQlmb3IoaSA9IDA7IGxpc3QgJiYgaSA8IGNvdW50OyBpKyssIGxpc3QgPSBsaXN0LT5uZXh0KQorCWZvciAoaSA9IDA7IGxpc3QgJiYgaSA8IGNvdW50OyBpKyssIGxpc3QgPSBsaXN0LT5uZXh0KQogCQltZW1jcHkoJmNiLT51Lm11bHRpLmFkZHJbaSpFVEhfQUxFTl0sICZsaXN0LT5kbWlfYWRkciwKIAkJCUVUSF9BTEVOKTsKIH0KQEAgLTE0NzIsMTIgKzEzNjcsMTIgQEAKIAlEUFJJTlRLKEhXLCBERUJVRywgIm1jX2NvdW50PSVkLCBmbGFncz0weCUwNFhcbiIsCiAJCW5ldGRldi0+bWNfY291bnQsIG5ldGRldi0+ZmxhZ3MpOwogCi0JaWYobmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQorCWlmIChuZXRkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCiAJCW5pYy0+ZmxhZ3MgfD0gcHJvbWlzY3VvdXM7CiAJZWxzZQogCQluaWMtPmZsYWdzICY9IH5wcm9taXNjdW91czsKIAotCWlmKG5ldGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkgfHwKKwlpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSB8fAogCQluZXRkZXYtPm1jX2NvdW50ID4gRTEwMF9NQVhfTVVMVElDQVNUX0FERFJTKQogCQluaWMtPmZsYWdzIHw9IG11bHRpY2FzdF9hbGw7CiAJZWxzZQpAQCAtMTUwMCw3ICsxMzk1LDcgQEAKIAkgKiBjb21wbGV0ZSwgc28gd2UncmUgYWx3YXlzIHdhaXRpbmcgZm9yIHJlc3VsdHMgb2YgdGhlCiAJICogcHJldmlvdXMgY29tbWFuZC4gKi8KIAotCWlmKCpjb21wbGV0ZSA9PSBjcHVfdG9fbGUzMihjdWNfZHVtcF9yZXNldF9jb21wbGV0ZSkpIHsKKwlpZiAoKmNvbXBsZXRlID09IGNwdV90b19sZTMyKGN1Y19kdW1wX3Jlc2V0X2NvbXBsZXRlKSkgewogCQkqY29tcGxldGUgPSAwOwogCQluaWMtPnR4X2ZyYW1lcyA9IGxlMzJfdG9fY3B1KHMtPnR4X2dvb2RfZnJhbWVzKTsKIAkJbmljLT50eF9jb2xsaXNpb25zID0gbGUzMl90b19jcHUocy0+dHhfdG90YWxfY29sbGlzaW9ucyk7CkBAIC0xNTI3LDEyICsxNDIyLDEyIEBACiAJCQlsZTMyX3RvX2NwdShzLT50eF9zaW5nbGVfY29sbGlzaW9ucyk7CiAJCW5pYy0+dHhfbXVsdGlwbGVfY29sbGlzaW9ucyArPQogCQkJbGUzMl90b19jcHUocy0+dHhfbXVsdGlwbGVfY29sbGlzaW9ucyk7Ci0JCWlmKG5pYy0+bWFjID49IG1hY184MjU1OF9EMTAxX0E0KSB7CisJCWlmIChuaWMtPm1hYyA+PSBtYWNfODI1NThfRDEwMV9BNCkgewogCQkJbmljLT50eF9mY19wYXVzZSArPSBsZTMyX3RvX2NwdShzLT5mY194bXRfcGF1c2UpOwogCQkJbmljLT5yeF9mY19wYXVzZSArPSBsZTMyX3RvX2NwdShzLT5mY19yY3ZfcGF1c2UpOwogCQkJbmljLT5yeF9mY191bnN1cHBvcnRlZCArPQogCQkJCWxlMzJfdG9fY3B1KHMtPmZjX3Jjdl91bnN1cHBvcnRlZCk7Ci0JCQlpZihuaWMtPm1hYyA+PSBtYWNfODI1NTlfRDEwMU0pIHsKKwkJCWlmIChuaWMtPm1hYyA+PSBtYWNfODI1NTlfRDEwMU0pIHsKIAkJCQluaWMtPnR4X3Rjb19mcmFtZXMgKz0KIAkJCQkJbGUxNl90b19jcHUocy0+eG10X3Rjb19mcmFtZXMpOwogCQkJCW5pYy0+cnhfdGNvX2ZyYW1lcyArPQpAQCAtMTU0Miw3ICsxNDM3LDcgQEAKIAl9CiAKIAotCWlmKGUxMDBfZXhlY19jbWQobmljLCBjdWNfZHVtcF9yZXNldCwgMCkpCisJaWYgKGUxMDBfZXhlY19jbWQobmljLCBjdWNfZHVtcF9yZXNldCwgMCkpCiAJCURQUklOVEsoVFhfRVJSLCBERUJVRywgImV4ZWMgY3VjX2R1bXBfcmVzZXQgZmFpbGVkXG4iKTsKIH0KIApAQCAtMTU1MSwxOSArMTQ0NiwxOSBAQAogCS8qIEFkanVzdCBpbnRlci1mcmFtZS1zcGFjaW5nIChJRlMpIGJldHdlZW4gdHdvIHRyYW5zbWl0cyBpZgogCSAqIHdlJ3JlIGdldHRpbmcgY29sbGlzaW9ucyBvbiBhIGhhbGYtZHVwbGV4IGNvbm5lY3Rpb24uICovCiAKLQlpZihkdXBsZXggPT0gRFVQTEVYX0hBTEYpIHsKKwlpZiAoZHVwbGV4ID09IERVUExFWF9IQUxGKSB7CiAJCXUzMiBwcmV2ID0gbmljLT5hZGFwdGl2ZV9pZnM7CiAJCXUzMiBtaW5fZnJhbWVzID0gKHNwZWVkID09IFNQRUVEXzEwMCkgPyAxMDAwIDogMTAwOwogCi0JCWlmKChuaWMtPnR4X2ZyYW1lcyAvIDMyIDwgbmljLT50eF9jb2xsaXNpb25zKSAmJgorCQlpZiAoKG5pYy0+dHhfZnJhbWVzIC8gMzIgPCBuaWMtPnR4X2NvbGxpc2lvbnMpICYmCiAJCSAgIChuaWMtPnR4X2ZyYW1lcyA+IG1pbl9mcmFtZXMpKSB7Ci0JCQlpZihuaWMtPmFkYXB0aXZlX2lmcyA8IDYwKQorCQkJaWYgKG5pYy0+YWRhcHRpdmVfaWZzIDwgNjApCiAJCQkJbmljLT5hZGFwdGl2ZV9pZnMgKz0gNTsKIAkJfSBlbHNlIGlmIChuaWMtPnR4X2ZyYW1lcyA8IG1pbl9mcmFtZXMpIHsKLQkJCWlmKG5pYy0+YWRhcHRpdmVfaWZzID49IDUpCisJCQlpZiAobmljLT5hZGFwdGl2ZV9pZnMgPj0gNSkKIAkJCQluaWMtPmFkYXB0aXZlX2lmcyAtPSA1OwogCQl9Ci0JCWlmKG5pYy0+YWRhcHRpdmVfaWZzICE9IHByZXYpCisJCWlmIChuaWMtPmFkYXB0aXZlX2lmcyAhPSBwcmV2KQogCQkJZTEwMF9leGVjX2NiKG5pYywgTlVMTCwgZTEwMF9jb25maWd1cmUpOwogCX0KIH0KQEAgLTE1NzksMTIgKzE0NzQsMTIgQEAKIAogCW1paV9ldGh0b29sX2dzZXQoJm5pYy0+bWlpLCAmY21kKTsKIAotCWlmKG1paV9saW5rX29rKCZuaWMtPm1paSkgJiYgIW5ldGlmX2NhcnJpZXJfb2sobmljLT5uZXRkZXYpKSB7CisJaWYgKG1paV9saW5rX29rKCZuaWMtPm1paSkgJiYgIW5ldGlmX2NhcnJpZXJfb2sobmljLT5uZXRkZXYpKSB7CiAJCXByaW50ayhLRVJOX0lORk8gImUxMDA6ICVzIE5JQyBMaW5rIGlzIFVwICVzIE1icHMgJXMgRHVwbGV4XG4iLAogCQkgICAgICAgbmljLT5uZXRkZXYtPm5hbWUsCiAJCSAgICAgICBjbWQuc3BlZWQgPT0gU1BFRURfMTAwID8gIjEwMCIgOiAiMTAiLAogCQkgICAgICAgY21kLmR1cGxleCA9PSBEVVBMRVhfRlVMTCA/ICJGdWxsIiA6ICJIYWxmIik7Ci0JfSBlbHNlIGlmKCFtaWlfbGlua19vaygmbmljLT5taWkpICYmIG5ldGlmX2NhcnJpZXJfb2sobmljLT5uZXRkZXYpKSB7CisJfSBlbHNlIGlmICghbWlpX2xpbmtfb2soJm5pYy0+bWlpKSAmJiBuZXRpZl9jYXJyaWVyX29rKG5pYy0+bmV0ZGV2KSkgewogCQlwcmludGsoS0VSTl9JTkZPICJlMTAwOiAlcyBOSUMgTGluayBpcyBEb3duXG4iLAogCQkgICAgICAgbmljLT5uZXRkZXYtPm5hbWUpOwogCX0KQEAgLTE2MDQsMTEgKzE0OTksMTEgQEAKIAllMTAwX3VwZGF0ZV9zdGF0cyhuaWMpOwogCWUxMDBfYWRqdXN0X2FkYXB0aXZlX2lmcyhuaWMsIGNtZC5zcGVlZCwgY21kLmR1cGxleCk7CiAKLQlpZihuaWMtPm1hYyA8PSBtYWNfODI1NTdfRDEwMF9DKQorCWlmIChuaWMtPm1hYyA8PSBtYWNfODI1NTdfRDEwMF9DKQogCQkvKiBJc3N1ZSBhIG11bHRpY2FzdCBjb21tYW5kIHRvIHdvcmthcm91bmQgYSA1NTcgbG9jayB1cCAqLwogCQllMTAwX3NldF9tdWx0aWNhc3RfbGlzdChuaWMtPm5ldGRldik7CiAKLQlpZihuaWMtPmZsYWdzICYgaWNoICYmIGNtZC5zcGVlZD09U1BFRURfMTAgJiYgY21kLmR1cGxleD09RFVQTEVYX0hBTEYpCisJaWYgKG5pYy0+ZmxhZ3MgJiBpY2ggJiYgY21kLnNwZWVkPT1TUEVFRF8xMCAmJiBjbWQuZHVwbGV4PT1EVVBMRVhfSEFMRikKIAkJLyogTmVlZCBTVyB3b3JrYXJvdW5kIGZvciBJQ0hbeF0gMTBNYnBzL2hhbGYgZHVwbGV4IFR4IGhhbmcuICovCiAJCW5pYy0+ZmxhZ3MgfD0gaWNoXzEwaF93b3JrYXJvdW5kOwogCWVsc2UKQEAgLTE2MjMsNyArMTUxOCw3IEBACiB7CiAJY2ItPmNvbW1hbmQgPSBuaWMtPnR4X2NvbW1hbmQ7CiAJLyogaW50ZXJydXB0IGV2ZXJ5IDE2IHBhY2tldHMgcmVnYXJkbGVzcyBvZiBkZWxheSAqLwotCWlmKChuaWMtPmNic19hdmFpbCAmIH4xNSkgPT0gbmljLT5jYnNfYXZhaWwpCisJaWYgKChuaWMtPmNic19hdmFpbCAmIH4xNSkgPT0gbmljLT5jYnNfYXZhaWwpCiAJCWNiLT5jb21tYW5kIHw9IGNwdV90b19sZTE2KGNiX2kpOwogCWNiLT51LnRjYi50YmRfYXJyYXkgPSBjYi0+ZG1hX2FkZHIgKyBvZmZzZXRvZihzdHJ1Y3QgY2IsIHUudGNiLnRiZCk7CiAJY2ItPnUudGNiLnRjYl9ieXRlX2NvdW50ID0gMDsKQEAgLTE2NDAsMTggKzE1MzUsMTggQEAKIAlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCWludCBlcnI7CiAKLQlpZihuaWMtPmZsYWdzICYgaWNoXzEwaF93b3JrYXJvdW5kKSB7CisJaWYgKG5pYy0+ZmxhZ3MgJiBpY2hfMTBoX3dvcmthcm91bmQpIHsKIAkJLyogU1cgd29ya2Fyb3VuZCBmb3IgSUNIW3hdIDEwTWJwcy9oYWxmIGR1cGxleCBUeCBoYW5nLgogCQkgICBJc3N1ZSBhIE5PUCBjb21tYW5kIGZvbGxvd2VkIGJ5IGEgMXVzIGRlbGF5IGJlZm9yZQogCQkgICBpc3N1aW5nIHRoZSBUeCBjb21tYW5kLiAqLwotCQlpZihlMTAwX2V4ZWNfY21kKG5pYywgY3VjX25vcCwgMCkpCisJCWlmIChlMTAwX2V4ZWNfY21kKG5pYywgY3VjX25vcCwgMCkpCiAJCQlEUFJJTlRLKFRYX0VSUiwgREVCVUcsICJleGVjIGN1Y19ub3AgZmFpbGVkXG4iKTsKIAkJdWRlbGF5KDEpOwogCX0KIAogCWVyciA9IGUxMDBfZXhlY19jYihuaWMsIHNrYiwgZTEwMF94bWl0X3ByZXBhcmUpOwogCi0Jc3dpdGNoKGVycikgeworCXN3aXRjaCAoZXJyKSB7CiAJY2FzZSAtRU5PU1BDOgogCQkvKiBXZSBxdWV1ZWQgdGhlIHNrYiwgYnV0IG5vdyB3ZSdyZSBvdXQgb2Ygc3BhY2UuICovCiAJCURQUklOVEsoVFhfRVJSLCBERUJVRywgIk5vIHNwYWNlIGZvciBDQlxuIik7CkBAIC0xNjc3LDE0ICsxNTcyLDE0IEBACiAJc3Bpbl9sb2NrKCZuaWMtPmNiX2xvY2spOwogCiAJLyogQ2xlYW4gQ0JzIG1hcmtlZCBjb21wbGV0ZSAqLwotCWZvcihjYiA9IG5pYy0+Y2JfdG9fY2xlYW47CisJZm9yIChjYiA9IG5pYy0+Y2JfdG9fY2xlYW47CiAJICAgIGNiLT5zdGF0dXMgJiBjcHVfdG9fbGUxNihjYl9jb21wbGV0ZSk7CiAJICAgIGNiID0gbmljLT5jYl90b19jbGVhbiA9IGNiLT5uZXh0KSB7CiAJCURQUklOVEsoVFhfRE9ORSwgREVCVUcsICJjYlslZF0tPnN0YXR1cyA9IDB4JTA0WFxuIiwKIAkJICAgICAgICAoaW50KSgoKHZvaWQqKWNiIC0gKHZvaWQqKW5pYy0+Y2JzKS9zaXplb2Yoc3RydWN0IGNiKSksCiAJCSAgICAgICAgY2ItPnN0YXR1cyk7CiAKLQkJaWYobGlrZWx5KGNiLT5za2IgIT0gTlVMTCkpIHsKKwkJaWYgKGxpa2VseShjYi0+c2tiICE9IE5VTEwpKSB7CiAJCQlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKIAkJCWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gY2ItPnNrYi0+bGVuOwogCkBAIC0xNzAzLDcgKzE1OTgsNyBAQAogCXNwaW5fdW5sb2NrKCZuaWMtPmNiX2xvY2spOwogCiAJLyogUmVjb3ZlciBmcm9tIHJ1bm5pbmcgb3V0IG9mIFR4IHJlc291cmNlcyBpbiB4bWl0X2ZyYW1lICovCi0JaWYodW5saWtlbHkodHhfY2xlYW5lZCAmJiBuZXRpZl9xdWV1ZV9zdG9wcGVkKG5pYy0+bmV0ZGV2KSkpCisJaWYgKHVubGlrZWx5KHR4X2NsZWFuZWQgJiYgbmV0aWZfcXVldWVfc3RvcHBlZChuaWMtPm5ldGRldikpKQogCQluZXRpZl93YWtlX3F1ZXVlKG5pYy0+bmV0ZGV2KTsKIAogCXJldHVybiB0eF9jbGVhbmVkOwpAQCAtMTcxMSwxMCArMTYwNiwxMCBAQAogCiBzdGF0aWMgdm9pZCBlMTAwX2NsZWFuX2NicyhzdHJ1Y3QgbmljICpuaWMpCiB7Ci0JaWYobmljLT5jYnMpIHsKLQkJd2hpbGUobmljLT5jYnNfYXZhaWwgIT0gbmljLT5wYXJhbXMuY2JzLmNvdW50KSB7CisJaWYgKG5pYy0+Y2JzKSB7CisJCXdoaWxlIChuaWMtPmNic19hdmFpbCAhPSBuaWMtPnBhcmFtcy5jYnMuY291bnQpIHsKIAkJCXN0cnVjdCBjYiAqY2IgPSBuaWMtPmNiX3RvX2NsZWFuOwotCQkJaWYoY2ItPnNrYikgeworCQkJaWYgKGNiLT5za2IpIHsKIAkJCQlwY2lfdW5tYXBfc2luZ2xlKG5pYy0+cGRldiwKIAkJCQkJbGUzMl90b19jcHUoY2ItPnUudGNiLnRiZC5idWZfYWRkciksCiAJCQkJCWxlMTZfdG9fY3B1KGNiLT51LnRjYi50YmQuc2l6ZSksCkBAIC0xNzQ2LDEwICsxNjQxLDEwIEBACiAKIAluaWMtPmNicyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KG5pYy0+cGRldiwKIAkJc2l6ZW9mKHN0cnVjdCBjYikgKiBjb3VudCwgJm5pYy0+Y2JzX2RtYV9hZGRyKTsKLQlpZighbmljLT5jYnMpCisJaWYgKCFuaWMtPmNicykKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlmb3IoY2IgPSBuaWMtPmNicywgaSA9IDA7IGkgPCBjb3VudDsgY2IrKywgaSsrKSB7CisJZm9yIChjYiA9IG5pYy0+Y2JzLCBpID0gMDsgaSA8IGNvdW50OyBjYisrLCBpKyspIHsKIAkJY2ItPm5leHQgPSAoaSArIDEgPCBjb3VudCkgPyBjYiArIDEgOiBuaWMtPmNiczsKIAkJY2ItPnByZXYgPSAoaSA9PSAwKSA/IG5pYy0+Y2JzICsgY291bnQgLSAxIDogY2IgLSAxOwogCkBAIC0xNzY3LDE0ICsxNjYyLDE0IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBlMTAwX3N0YXJ0X3JlY2VpdmVyKHN0cnVjdCBuaWMgKm5pYywgc3RydWN0IHJ4ICpyeCkKIHsKLQlpZighbmljLT5yeHMpIHJldHVybjsKLQlpZihSVV9TVVNQRU5ERUQgIT0gbmljLT5ydV9ydW5uaW5nKSByZXR1cm47CisJaWYgKCFuaWMtPnJ4cykgcmV0dXJuOworCWlmIChSVV9TVVNQRU5ERUQgIT0gbmljLT5ydV9ydW5uaW5nKSByZXR1cm47CiAKIAkvKiBoYW5kbGUgaW5pdCB0aW1lIHN0YXJ0cyAqLwotCWlmKCFyeCkgcnggPSBuaWMtPnJ4czsKKwlpZiAoIXJ4KSByeCA9IG5pYy0+cnhzOwogCiAJLyogKFJlKXN0YXJ0IFJVIGlmIHN1c3BlbmRlZCBvciBpZGxlIGFuZCBSRkEgaXMgbm9uLU5VTEwgKi8KLQlpZihyeC0+c2tiKSB7CisJaWYgKHJ4LT5za2IpIHsKIAkJZTEwMF9leGVjX2NtZChuaWMsIHJ1Y19zdGFydCwgcngtPmRtYV9hZGRyKTsKIAkJbmljLT5ydV9ydW5uaW5nID0gUlVfUlVOTklORzsKIAl9CkBAIC0xNzgzLDcgKzE2NzgsNyBAQAogI2RlZmluZSBSRkRfQlVGX0xFTiAoc2l6ZW9mKHN0cnVjdCByZmQpICsgVkxBTl9FVEhfRlJBTUVfTEVOKQogc3RhdGljIGludCBlMTAwX3J4X2FsbG9jX3NrYihzdHJ1Y3QgbmljICpuaWMsIHN0cnVjdCByeCAqcngpCiB7Ci0JaWYoIShyeC0+c2tiID0gbmV0ZGV2X2FsbG9jX3NrYihuaWMtPm5ldGRldiwgUkZEX0JVRl9MRU4gKyBORVRfSVBfQUxJR04pKSkKKwlpZiAoIShyeC0+c2tiID0gbmV0ZGV2X2FsbG9jX3NrYihuaWMtPm5ldGRldiwgUkZEX0JVRl9MRU4gKyBORVRfSVBfQUxJR04pKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAkvKiBBbGlnbiwgaW5pdCwgYW5kIG1hcCB0aGUgUkZELiAqLwpAQCAtMTgyMCw3ICsxNzE1LDcgQEAKIAlzdHJ1Y3QgcmZkICpyZmQgPSAoc3RydWN0IHJmZCAqKXNrYi0+ZGF0YTsKIAl1MTYgcmZkX3N0YXR1cywgYWN0dWFsX3NpemU7CiAKLQlpZih1bmxpa2VseSh3b3JrX2RvbmUgJiYgKndvcmtfZG9uZSA+PSB3b3JrX3RvX2RvKSkKKwlpZiAodW5saWtlbHkod29ya19kb25lICYmICp3b3JrX2RvbmUgPj0gd29ya190b19kbykpCiAJCXJldHVybiAtRUFHQUlOOwogCiAJLyogTmVlZCB0byBzeW5jIGJlZm9yZSB0YWtpbmcgYSBwZWVrIGF0IGNiX2NvbXBsZXRlIGJpdCAqLwpAQCAtMTg0Nyw3ICsxNzQyLDcgQEAKIAogCS8qIEdldCBhY3R1YWwgZGF0YSBzaXplICovCiAJYWN0dWFsX3NpemUgPSBsZTE2X3RvX2NwdShyZmQtPmFjdHVhbF9zaXplKSAmIDB4M0ZGRjsKLQlpZih1bmxpa2VseShhY3R1YWxfc2l6ZSA+IFJGRF9CVUZfTEVOIC0gc2l6ZW9mKHN0cnVjdCByZmQpKSkKKwlpZiAodW5saWtlbHkoYWN0dWFsX3NpemUgPiBSRkRfQlVGX0xFTiAtIHNpemVvZihzdHJ1Y3QgcmZkKSkpCiAJCWFjdHVhbF9zaXplID0gUkZEX0JVRl9MRU4gLSBzaXplb2Yoc3RydWN0IHJmZCk7CiAKIAkvKiBHZXQgZGF0YSAqLwpAQCAtMTg3MiwxMCArMTc2NywxMCBAQAogCXNrYl9wdXQoc2tiLCBhY3R1YWxfc2l6ZSk7CiAJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgbmljLT5uZXRkZXYpOwogCi0JaWYodW5saWtlbHkoIShyZmRfc3RhdHVzICYgY2Jfb2spKSkgeworCWlmICh1bmxpa2VseSghKHJmZF9zdGF0dXMgJiBjYl9vaykpKSB7CiAJCS8qIERvbid0IGluZGljYXRlIGlmIGhhcmR3YXJlIGluZGljYXRlcyBlcnJvcnMgKi8KIAkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLQl9IGVsc2UgaWYoYWN0dWFsX3NpemUgPiBFVEhfREFUQV9MRU4gKyBWTEFOX0VUSF9ITEVOKSB7CisJfSBlbHNlIGlmIChhY3R1YWxfc2l6ZSA+IEVUSF9EQVRBX0xFTiArIFZMQU5fRVRIX0hMRU4pIHsKIAkJLyogRG9uJ3QgaW5kaWNhdGUgb3ZlcnNpemVkIGZyYW1lcyAqLwogCQluaWMtPnJ4X292ZXJfbGVuZ3RoX2Vycm9ycysrOwogCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwpAQCAtMTg4Myw3ICsxNzc4LDcgQEAKIAkJZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CiAJCWRldi0+c3RhdHMucnhfYnl0ZXMgKz0gYWN0dWFsX3NpemU7CiAJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7Ci0JCWlmKHdvcmtfZG9uZSkKKwkJaWYgKHdvcmtfZG9uZSkKIAkJCSgqd29ya19kb25lKSsrOwogCX0KIApAQCAtMTkwMSw3ICsxNzk2LDcgQEAKIAlzdHJ1Y3QgcmZkICpvbGRfYmVmb3JlX2xhc3RfcmZkLCAqbmV3X2JlZm9yZV9sYXN0X3JmZDsKIAogCS8qIEluZGljYXRlIG5ld2x5IGFycml2ZWQgcGFja2V0cyAqLwotCWZvcihyeCA9IG5pYy0+cnhfdG9fY2xlYW47IHJ4LT5za2I7IHJ4ID0gbmljLT5yeF90b19jbGVhbiA9IHJ4LT5uZXh0KSB7CisJZm9yIChyeCA9IG5pYy0+cnhfdG9fY2xlYW47IHJ4LT5za2I7IHJ4ID0gbmljLT5yeF90b19jbGVhbiA9IHJ4LT5uZXh0KSB7CiAJCWVyciA9IGUxMDBfcnhfaW5kaWNhdGUobmljLCByeCwgd29ya19kb25lLCB3b3JrX3RvX2RvKTsKIAkJLyogSGl0IHF1b3RhIG9yIG5vIG1vcmUgdG8gY2xlYW4gKi8KIAkJaWYgKC1FQUdBSU4gPT0gZXJyIHx8IC1FTk9EQVRBID09IGVycikKQEAgLTE5MjIsOCArMTgxNyw4IEBACiAJb2xkX2JlZm9yZV9sYXN0X3JmZCA9IChzdHJ1Y3QgcmZkICopb2xkX2JlZm9yZV9sYXN0X3J4LT5za2ItPmRhdGE7CiAKIAkvKiBBbGxvYyBuZXcgc2ticyB0byByZWZpbGwgbGlzdCAqLwotCWZvcihyeCA9IG5pYy0+cnhfdG9fdXNlOyAhcngtPnNrYjsgcnggPSBuaWMtPnJ4X3RvX3VzZSA9IHJ4LT5uZXh0KSB7Ci0JCWlmKHVubGlrZWx5KGUxMDBfcnhfYWxsb2Nfc2tiKG5pYywgcngpKSkKKwlmb3IgKHJ4ID0gbmljLT5yeF90b191c2U7ICFyeC0+c2tiOyByeCA9IG5pYy0+cnhfdG9fdXNlID0gcngtPm5leHQpIHsKKwkJaWYgKHVubGlrZWx5KGUxMDBfcnhfYWxsb2Nfc2tiKG5pYywgcngpKSkKIAkJCWJyZWFrOyAvKiBCZXR0ZXIgbHVjayBuZXh0IHRpbWUgKHNlZSB3YXRjaGRvZykgKi8KIAl9CiAKQEAgLTE5NTksMTEgKzE4NTQsMTEgQEAKIAkJCVBDSV9ETUFfQklESVJFQ1RJT05BTCk7CiAJfQogCi0JaWYocmVzdGFydF9yZXF1aXJlZCkgeworCWlmIChyZXN0YXJ0X3JlcXVpcmVkKSB7CiAJCS8vIGFjayB0aGUgcm5yPwogCQlpb3dyaXRlOChzdGF0X2Fja19ybnIsICZuaWMtPmNzci0+c2NiLnN0YXRfYWNrKTsKIAkJZTEwMF9zdGFydF9yZWNlaXZlcihuaWMsIG5pYy0+cnhfdG9fY2xlYW4pOwotCQlpZih3b3JrX2RvbmUpCisJCWlmICh3b3JrX2RvbmUpCiAJCQkoKndvcmtfZG9uZSkrKzsKIAl9CiB9CkBAIC0xOTc1LDkgKzE4NzAsOSBAQAogCiAJbmljLT5ydV9ydW5uaW5nID0gUlVfVU5JTklUSUFMSVpFRDsKIAotCWlmKG5pYy0+cnhzKSB7Ci0JCWZvcihyeCA9IG5pYy0+cnhzLCBpID0gMDsgaSA8IGNvdW50OyByeCsrLCBpKyspIHsKLQkJCWlmKHJ4LT5za2IpIHsKKwlpZiAobmljLT5yeHMpIHsKKwkJZm9yIChyeCA9IG5pYy0+cnhzLCBpID0gMDsgaSA8IGNvdW50OyByeCsrLCBpKyspIHsKKwkJCWlmIChyeC0+c2tiKSB7CiAJCQkJcGNpX3VubWFwX3NpbmdsZShuaWMtPnBkZXYsIHJ4LT5kbWFfYWRkciwKIAkJCQkJUkZEX0JVRl9MRU4sIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CiAJCQkJZGV2X2tmcmVlX3NrYihyeC0+c2tiKTsKQEAgLTE5OTksMTMgKzE4OTQsMTMgQEAKIAluaWMtPnJ4X3RvX3VzZSA9IG5pYy0+cnhfdG9fY2xlYW4gPSBOVUxMOwogCW5pYy0+cnVfcnVubmluZyA9IFJVX1VOSU5JVElBTElaRUQ7CiAKLQlpZighKG5pYy0+cnhzID0ga2NhbGxvYyhjb3VudCwgc2l6ZW9mKHN0cnVjdCByeCksIEdGUF9BVE9NSUMpKSkKKwlpZiAoIShuaWMtPnJ4cyA9IGtjYWxsb2MoY291bnQsIHNpemVvZihzdHJ1Y3QgcngpLCBHRlBfQVRPTUlDKSkpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZm9yKHJ4ID0gbmljLT5yeHMsIGkgPSAwOyBpIDwgY291bnQ7IHJ4KyssIGkrKykgeworCWZvciAocnggPSBuaWMtPnJ4cywgaSA9IDA7IGkgPCBjb3VudDsgcngrKywgaSsrKSB7CiAJCXJ4LT5uZXh0ID0gKGkgKyAxIDwgY291bnQpID8gcnggKyAxIDogbmljLT5yeHM7CiAJCXJ4LT5wcmV2ID0gKGkgPT0gMCkgPyBuaWMtPnJ4cyArIGNvdW50IC0gMSA6IHJ4IC0gMTsKLQkJaWYoZTEwMF9yeF9hbGxvY19za2IobmljLCByeCkpIHsKKwkJaWYgKGUxMDBfcnhfYWxsb2Nfc2tiKG5pYywgcngpKSB7CiAJCQllMTAwX3J4X2NsZWFuX2xpc3QobmljKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CkBAIC0yMDM4LDcgKzE5MzMsNyBAQAogCiAJRFBSSU5USyhJTlRSLCBERUJVRywgInN0YXRfYWNrID0gMHglMDJYXG4iLCBzdGF0X2Fjayk7CiAKLQlpZihzdGF0X2FjayA9PSBzdGF0X2Fja19ub3Rfb3VycyB8fAkvKiBOb3Qgb3VyIGludGVycnVwdCAqLworCWlmIChzdGF0X2FjayA9PSBzdGF0X2Fja19ub3Rfb3VycyB8fAkvKiBOb3Qgb3VyIGludGVycnVwdCAqLwogCSAgIHN0YXRfYWNrID09IHN0YXRfYWNrX25vdF9wcmVzZW50KQkvKiBIYXJkd2FyZSBpcyBlamVjdGVkICovCiAJCXJldHVybiBJUlFfTk9ORTsKIApAQCAtMjA0NiwxMCArMTk0MSwxMCBAQAogCWlvd3JpdGU4KHN0YXRfYWNrLCAmbmljLT5jc3ItPnNjYi5zdGF0X2Fjayk7CiAKIAkvKiBXZSBoaXQgUmVjZWl2ZSBObyBSZXNvdXJjZSAoUk5SKTsgcmVzdGFydCBSVSBhZnRlciBjbGVhbmluZyAqLwotCWlmKHN0YXRfYWNrICYgc3RhdF9hY2tfcm5yKQorCWlmIChzdGF0X2FjayAmIHN0YXRfYWNrX3JucikKIAkJbmljLT5ydV9ydW5uaW5nID0gUlVfU1VTUEVOREVEOwogCi0JaWYobGlrZWx5KG5ldGlmX3J4X3NjaGVkdWxlX3ByZXAoJm5pYy0+bmFwaSkpKSB7CisJaWYgKGxpa2VseShuZXRpZl9yeF9zY2hlZHVsZV9wcmVwKCZuaWMtPm5hcGkpKSkgewogCQllMTAwX2Rpc2FibGVfaXJxKG5pYyk7CiAJCV9fbmV0aWZfcnhfc2NoZWR1bGUoJm5pYy0+bmFwaSk7CiAJfQpAQCAtMjEwMiw3ICsxOTk3LDcgQEAKIAogc3RhdGljIGludCBlMTAwX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IG5ld19tdHUpCiB7Ci0JaWYobmV3X210dSA8IEVUSF9aTEVOIHx8IG5ld19tdHUgPiBFVEhfREFUQV9MRU4pCisJaWYgKG5ld19tdHUgPCBFVEhfWkxFTiB8fCBuZXdfbXR1ID4gRVRIX0RBVEFfTEVOKQogCQlyZXR1cm4gLUVJTlZBTDsKIAluZXRkZXYtPm10dSA9IG5ld19tdHU7CiAJcmV0dXJuIDA7CkBAIC0yMTIxLDE2ICsyMDE2LDE2IEBACiB7CiAJaW50IGVycjsKIAotCWlmKChlcnIgPSBlMTAwX3J4X2FsbG9jX2xpc3QobmljKSkpCisJaWYgKChlcnIgPSBlMTAwX3J4X2FsbG9jX2xpc3QobmljKSkpCiAJCXJldHVybiBlcnI7Ci0JaWYoKGVyciA9IGUxMDBfYWxsb2NfY2JzKG5pYykpKQorCWlmICgoZXJyID0gZTEwMF9hbGxvY19jYnMobmljKSkpCiAJCWdvdG8gZXJyX3J4X2NsZWFuX2xpc3Q7Ci0JaWYoKGVyciA9IGUxMDBfaHdfaW5pdChuaWMpKSkKKwlpZiAoKGVyciA9IGUxMDBfaHdfaW5pdChuaWMpKSkKIAkJZ290byBlcnJfY2xlYW5fY2JzOwogCWUxMDBfc2V0X211bHRpY2FzdF9saXN0KG5pYy0+bmV0ZGV2KTsKIAllMTAwX3N0YXJ0X3JlY2VpdmVyKG5pYywgTlVMTCk7CiAJbW9kX3RpbWVyKCZuaWMtPndhdGNoZG9nLCBqaWZmaWVzKTsKLQlpZigoZXJyID0gcmVxdWVzdF9pcnEobmljLT5wZGV2LT5pcnEsIGUxMDBfaW50ciwgSVJRRl9TSEFSRUQsCisJaWYgKChlcnIgPSByZXF1ZXN0X2lycShuaWMtPnBkZXYtPmlycSwgZTEwMF9pbnRyLCBJUlFGX1NIQVJFRCwKIAkJbmljLT5uZXRkZXYtPm5hbWUsIG5pYy0+bmV0ZGV2KSkpCiAJCWdvdG8gZXJyX25vX2lycTsKIAluZXRpZl93YWtlX3F1ZXVlKG5pYy0+bmV0ZGV2KTsKQEAgLTIxOTIsMjYgKzIwODcsMjYgQEAKIAkgKiBpbiBsb29wYmFjayBtb2RlLCBhbmQgdGhlIHRlc3QgcGFzc2VzIGlmIHRoZSByZWNlaXZlZAogCSAqIHBhY2tldCBjb21wYXJlcyBieXRlLWZvci1ieXRlIHRvIHRoZSB0cmFuc21pdHRlZCBwYWNrZXQuICovCiAKLQlpZigoZXJyID0gZTEwMF9yeF9hbGxvY19saXN0KG5pYykpKQorCWlmICgoZXJyID0gZTEwMF9yeF9hbGxvY19saXN0KG5pYykpKQogCQlyZXR1cm4gZXJyOwotCWlmKChlcnIgPSBlMTAwX2FsbG9jX2NicyhuaWMpKSkKKwlpZiAoKGVyciA9IGUxMDBfYWxsb2NfY2JzKG5pYykpKQogCQlnb3RvIGVycl9jbGVhbl9yeDsKIAogCS8qIElDSCBQSFkgbG9vcGJhY2sgaXMgYnJva2VuIHNvIGRvIE1BQyBsb29wYmFjayBpbnN0ZWFkICovCi0JaWYobmljLT5mbGFncyAmIGljaCAmJiBsb29wYmFja19tb2RlID09IGxiX3BoeSkKKwlpZiAobmljLT5mbGFncyAmIGljaCAmJiBsb29wYmFja19tb2RlID09IGxiX3BoeSkKIAkJbG9vcGJhY2tfbW9kZSA9IGxiX21hYzsKIAogCW5pYy0+bG9vcGJhY2sgPSBsb29wYmFja19tb2RlOwotCWlmKChlcnIgPSBlMTAwX2h3X2luaXQobmljKSkpCisJaWYgKChlcnIgPSBlMTAwX2h3X2luaXQobmljKSkpCiAJCWdvdG8gZXJyX2xvb3BiYWNrX25vbmU7CiAKLQlpZihsb29wYmFja19tb2RlID09IGxiX3BoeSkKKwlpZiAobG9vcGJhY2tfbW9kZSA9PSBsYl9waHkpCiAJCW1kaW9fd3JpdGUobmljLT5uZXRkZXYsIG5pYy0+bWlpLnBoeV9pZCwgTUlJX0JNQ1IsCiAJCQlCTUNSX0xPT1BCQUNLKTsKIAogCWUxMDBfc3RhcnRfcmVjZWl2ZXIobmljLCBOVUxMKTsKIAotCWlmKCEoc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihuaWMtPm5ldGRldiwgRVRIX0RBVEFfTEVOKSkpIHsKKwlpZiAoIShza2IgPSBuZXRkZXZfYWxsb2Nfc2tiKG5pYy0+bmV0ZGV2LCBFVEhfREFUQV9MRU4pKSkgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9sb29wYmFja19ub25lOwogCX0KQEAgLTIyMjQsNyArMjExOSw3IEBACiAJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KG5pYy0+cGRldiwgbmljLT5yeF90b19jbGVhbi0+ZG1hX2FkZHIsCiAJCQlSRkRfQlVGX0xFTiwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKIAotCWlmKG1lbWNtcChuaWMtPnJ4X3RvX2NsZWFuLT5za2ItPmRhdGEgKyBzaXplb2Yoc3RydWN0IHJmZCksCisJaWYgKG1lbWNtcChuaWMtPnJ4X3RvX2NsZWFuLT5za2ItPmRhdGEgKyBzaXplb2Yoc3RydWN0IHJmZCksCiAJICAgc2tiLT5kYXRhLCBFVEhfREFUQV9MRU4pKQogCQllcnIgPSAtRUFHQUlOOwogCkBAIC0yMzAxLDcgKzIxOTYsNyBAQAogCWJ1ZmZbMF0gPSBpb3JlYWQ4KCZuaWMtPmNzci0+c2NiLmNtZF9oaSkgPDwgMjQgfAogCQlpb3JlYWQ4KCZuaWMtPmNzci0+c2NiLmNtZF9sbykgPDwgMTYgfAogCQlpb3JlYWQxNigmbmljLT5jc3ItPnNjYi5zdGF0dXMpOwotCWZvcihpID0gRTEwMF9QSFlfUkVHUzsgaSA+PSAwOyBpLS0pCisJZm9yIChpID0gRTEwMF9QSFlfUkVHUzsgaSA+PSAwOyBpLS0pCiAJCWJ1ZmZbMSArIEUxMDBfUEhZX1JFR1MgLSBpXSA9CiAJCQltZGlvX3JlYWQobmV0ZGV2LCBuaWMtPm1paS5waHlfaWQsIGkpOwogCW1lbXNldChuaWMtPm1lbS0+ZHVtcF9idWYsIDAsIHNpemVvZihuaWMtPm1lbS0+ZHVtcF9idWYpKTsKQEAgLTIzMjYsNyArMjIyMSw3IEBACiAJICAgICFkZXZpY2VfY2FuX3dha2V1cCgmbmljLT5wZGV2LT5kZXYpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQlpZih3b2wtPndvbG9wdHMpCisJaWYgKHdvbC0+d29sb3B0cykKIAkJbmljLT5mbGFncyB8PSB3b2xfbWFnaWM7CiAJZWxzZQogCQluaWMtPmZsYWdzICY9IH53b2xfbWFnaWM7CkBAIC0yMzg1LDcgKzIyODAsNyBAQAogewogCXN0cnVjdCBuaWMgKm5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKLQlpZihlZXByb20tPm1hZ2ljICE9IEUxMDBfRUVQUk9NX01BR0lDKQorCWlmIChlZXByb20tPm1hZ2ljICE9IEUxMDBfRUVQUk9NX01BR0lDKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCW1lbWNweSgmKCh1OCAqKW5pYy0+ZWVwcm9tKVtlZXByb20tPm9mZnNldF0sIGJ5dGVzLCBlZXByb20tPmxlbik7CkBAIC0yNDIxLDcgKzIzMTYsNyBAQAogCWlmICgocmluZy0+cnhfbWluaV9wZW5kaW5nKSB8fCAocmluZy0+cnhfanVtYm9fcGVuZGluZykpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYobmV0aWZfcnVubmluZyhuZXRkZXYpKQorCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpCiAJCWUxMDBfZG93bihuaWMpOwogCXJmZHMtPmNvdW50ID0gbWF4KHJpbmctPnJ4X3BlbmRpbmcsIHJmZHMtPm1pbik7CiAJcmZkcy0+Y291bnQgPSBtaW4ocmZkcy0+Y291bnQsIHJmZHMtPm1heCk7CkBAIC0yNDI5LDcgKzIzMjQsNyBAQAogCWNicy0+Y291bnQgPSBtaW4oY2JzLT5jb3VudCwgY2JzLT5tYXgpOwogCURQUklOVEsoRFJWLCBJTkZPLCAiUmluZyBQYXJhbSBzZXR0aW5nczogcng6ICVkLCB0eCAlZFxuIiwKIAkgICAgICAgIHJmZHMtPmNvdW50LCBjYnMtPmNvdW50KTsKLQlpZihuZXRpZl9ydW5uaW5nKG5ldGRldikpCisJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKIAkJZTEwMF91cChuaWMpOwogCiAJcmV0dXJuIDA7CkBAIC0yNDU0LDEyICsyMzQ5LDEyIEBACiAJbWVtc2V0KGRhdGEsIDAsIEUxMDBfVEVTVF9MRU4gKiBzaXplb2YodTY0KSk7CiAJZGF0YVswXSA9ICFtaWlfbGlua19vaygmbmljLT5taWkpOwogCWRhdGFbMV0gPSBlMTAwX2VlcHJvbV9sb2FkKG5pYyk7Ci0JaWYodGVzdC0+ZmxhZ3MgJiBFVEhfVEVTVF9GTF9PRkZMSU5FKSB7CisJaWYgKHRlc3QtPmZsYWdzICYgRVRIX1RFU1RfRkxfT0ZGTElORSkgewogCiAJCS8qIHNhdmUgc3BlZWQsIGR1cGxleCAmIGF1dG9uZWcgc2V0dGluZ3MgKi8KIAkJZXJyID0gbWlpX2V0aHRvb2xfZ3NldCgmbmljLT5taWksICZjbWQpOwogCi0JCWlmKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKIAkJCWUxMDBfZG93bihuaWMpOwogCQlkYXRhWzJdID0gZTEwMF9zZWxmX3Rlc3QobmljKTsKIAkJZGF0YVszXSA9IGUxMDBfbG9vcGJhY2tfdGVzdChuaWMsIGxiX21hYyk7CkBAIC0yNDY4LDEwICsyMzYzLDEwIEBACiAJCS8qIHJlc3RvcmUgc3BlZWQsIGR1cGxleCAmIGF1dG9uZWcgc2V0dGluZ3MgKi8KIAkJZXJyID0gbWlpX2V0aHRvb2xfc3NldCgmbmljLT5taWksICZjbWQpOwogCi0JCWlmKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKIAkJCWUxMDBfdXAobmljKTsKIAl9Ci0JZm9yKGkgPSAwOyBpIDwgRTEwMF9URVNUX0xFTjsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBFMTAwX1RFU1RfTEVOOyBpKyspCiAJCXRlc3QtPmZsYWdzIHw9IGRhdGFbaV0gPyBFVEhfVEVTVF9GTF9GQUlMRUQgOiAwOwogCiAJbXNsZWVwX2ludGVycnVwdGlibGUoNCAqIDEwMDApOwpAQCAtMjQ4MSw3ICsyMzc2LDcgQEAKIHsKIAlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCi0JaWYoIWRhdGEgfHwgZGF0YSA+ICh1MzIpKE1BWF9TQ0hFRFVMRV9USU1FT1VUIC8gSFopKQorCWlmICghZGF0YSB8fCBkYXRhID4gKHUzMikoTUFYX1NDSEVEVUxFX1RJTUVPVVQgLyBIWikpCiAJCWRhdGEgPSAodTMyKShNQVhfU0NIRURVTEVfVElNRU9VVCAvIEhaKTsKIAltb2RfdGltZXIoJm5pYy0+YmxpbmtfdGltZXIsIGppZmZpZXMpOwogCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGRhdGEgKiAxMDAwKTsKQEAgLTI1MjQsNyArMjQxOSw3IEBACiAJc3RydWN0IG5pYyAqbmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlpbnQgaTsKIAotCWZvcihpID0gMDsgaSA8IEUxMDBfTkVUX1NUQVRTX0xFTjsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBFMTAwX05FVF9TVEFUU19MRU47IGkrKykKIAkJZGF0YVtpXSA9ICgodW5zaWduZWQgbG9uZyAqKSZuZXRkZXYtPnN0YXRzKVtpXTsKIAogCWRhdGFbaSsrXSA9IG5pYy0+dHhfZGVmZXJyZWQ7CkBAIC0yNTM5LDcgKzI0MzQsNyBAQAogCiBzdGF0aWMgdm9pZCBlMTAwX2dldF9zdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBzdHJpbmdzZXQsIHU4ICpkYXRhKQogewotCXN3aXRjaChzdHJpbmdzZXQpIHsKKwlzd2l0Y2ggKHN0cmluZ3NldCkgewogCWNhc2UgRVRIX1NTX1RFU1Q6CiAJCW1lbWNweShkYXRhLCAqZTEwMF9nc3RyaW5nc190ZXN0LCBzaXplb2YoZTEwMF9nc3RyaW5nc190ZXN0KSk7CiAJCWJyZWFrOwpAQCAtMjU4OSw3ICsyNDg0LDcgQEAKIAogc3RhdGljIHZvaWQgZTEwMF9mcmVlKHN0cnVjdCBuaWMgKm5pYykKIHsKLQlpZihuaWMtPm1lbSkgeworCWlmIChuaWMtPm1lbSkgewogCQlwY2lfZnJlZV9jb25zaXN0ZW50KG5pYy0+cGRldiwgc2l6ZW9mKHN0cnVjdCBtZW0pLAogCQkJbmljLT5tZW0sIG5pYy0+ZG1hX2FkZHIpOwogCQluaWMtPm1lbSA9IE5VTEw7CkBAIC0yNjAyLDcgKzI0OTcsNyBAQAogCWludCBlcnIgPSAwOwogCiAJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKLQlpZigoZXJyID0gZTEwMF91cChuaWMpKSkKKwlpZiAoKGVyciA9IGUxMDBfdXAobmljKSkpCiAJCURQUklOVEsoSUZVUCwgRVJSLCAiQ2Fubm90IG9wZW4gaW50ZXJmYWNlLCBhYm9ydGluZy5cbiIpOwogCXJldHVybiBlcnI7CiB9CkBAIC0yNjM1LDggKzI1MzAsOCBAQAogCXN0cnVjdCBuaWMgKm5pYzsKIAlpbnQgZXJyOwogCi0JaWYoIShuZXRkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IG5pYykpKSkgewotCQlpZigoKDEgPDwgZGVidWcpIC0gMSkgJiBORVRJRl9NU0dfUFJPQkUpCisJaWYgKCEobmV0ZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBuaWMpKSkpIHsKKwkJaWYgKCgoMSA8PCBkZWJ1ZykgLSAxKSAmIE5FVElGX01TR19QUk9CRSkKIAkJCXByaW50ayhLRVJOX0VSUiBQRlggIkV0aGVyZGV2IGFsbG9jIGZhaWxlZCwgYWJvcnQuXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMjY1MywyNCArMjU0OCwyNCBAQAogCW5pYy0+bXNnX2VuYWJsZSA9ICgxIDw8IGRlYnVnKSAtIDE7CiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIG5ldGRldik7CiAKLQlpZigoZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldikpKSB7CisJaWYgKChlcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KSkpIHsKIAkJRFBSSU5USyhQUk9CRSwgRVJSLCAiQ2Fubm90IGVuYWJsZSBQQ0kgZGV2aWNlLCBhYm9ydGluZy5cbiIpOwogCQlnb3RvIGVycl9vdXRfZnJlZV9kZXY7CiAJfQogCi0JaWYoIShwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMCkgJiBJT1JFU09VUkNFX01FTSkpIHsKKwlpZiAoIShwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMCkgJiBJT1JFU09VUkNFX01FTSkpIHsKIAkJRFBSSU5USyhQUk9CRSwgRVJSLCAiQ2Fubm90IGZpbmQgcHJvcGVyIFBDSSBkZXZpY2UgIgogCQkJImJhc2UgYWRkcmVzcywgYWJvcnRpbmcuXG4iKTsKIAkJZXJyID0gLUVOT0RFVjsKIAkJZ290byBlcnJfb3V0X2Rpc2FibGVfcGRldjsKIAl9CiAKLQlpZigoZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTkFNRSkpKSB7CisJaWYgKChlcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKSkpIHsKIAkJRFBSSU5USyhQUk9CRSwgRVJSLCAiQ2Fubm90IG9idGFpbiBQQ0kgcmVzb3VyY2VzLCBhYm9ydGluZy5cbiIpOwogCQlnb3RvIGVycl9vdXRfZGlzYWJsZV9wZGV2OwogCX0KIAotCWlmKChlcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKSkpIHsKKwlpZiAoKGVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spKSkgewogCQlEUFJJTlRLKFBST0JFLCBFUlIsICJObyB1c2FibGUgRE1BIGNvbmZpZ3VyYXRpb24sIGFib3J0aW5nLlxuIik7CiAJCWdvdG8gZXJyX291dF9mcmVlX3JlczsKIAl9CkBAIC0yNjgxLDEzICsyNTc2LDEzIEBACiAJCURQUklOVEsoUFJPQkUsIElORk8sICJ1c2luZyBpL28gYWNjZXNzIG1vZGVcbiIpOwogCiAJbmljLT5jc3IgPSBwY2lfaW9tYXAocGRldiwgKHVzZV9pbyA/IDEgOiAwKSwgc2l6ZW9mKHN0cnVjdCBjc3IpKTsKLQlpZighbmljLT5jc3IpIHsKKwlpZiAoIW5pYy0+Y3NyKSB7CiAJCURQUklOVEsoUFJPQkUsIEVSUiwgIkNhbm5vdCBtYXAgZGV2aWNlIHJlZ2lzdGVycywgYWJvcnRpbmcuXG4iKTsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBlcnJfb3V0X2ZyZWVfcmVzOwogCX0KIAotCWlmKGVudC0+ZHJpdmVyX2RhdGEpCisJaWYgKGVudC0+ZHJpdmVyX2RhdGEpCiAJCW5pYy0+ZmxhZ3MgfD0gaWNoOwogCWVsc2UKIAkJbmljLT5mbGFncyAmPSB+aWNoOwpAQCAtMjcxNSwxMiArMjYxMCwxMiBAQAogCiAJSU5JVF9XT1JLKCZuaWMtPnR4X3RpbWVvdXRfdGFzaywgZTEwMF90eF90aW1lb3V0X3Rhc2spOwogCi0JaWYoKGVyciA9IGUxMDBfYWxsb2MobmljKSkpIHsKKwlpZiAoKGVyciA9IGUxMDBfYWxsb2MobmljKSkpIHsKIAkJRFBSSU5USyhQUk9CRSwgRVJSLCAiQ2Fubm90IGFsbG9jIGRyaXZlciBtZW1vcnksIGFib3J0aW5nLlxuIik7CiAJCWdvdG8gZXJyX291dF9pb3VubWFwOwogCX0KIAotCWlmKChlcnIgPSBlMTAwX2VlcHJvbV9sb2FkKG5pYykpKQorCWlmICgoZXJyID0gZTEwMF9lZXByb21fbG9hZChuaWMpKSkKIAkJZ290byBlcnJfb3V0X2ZyZWU7CiAKIAllMTAwX3BoeV9pbml0KG5pYyk7CkBAIC0yNzQwLDcgKzI2MzUsNyBAQAogCX0KIAogCS8qIFdvbCBtYWdpYyBwYWNrZXQgY2FuIGJlIGVuYWJsZWQgZnJvbSBlZXByb20gKi8KLQlpZigobmljLT5tYWMgPj0gbWFjXzgyNTU4X0QxMDFfQTQpICYmCisJaWYgKChuaWMtPm1hYyA+PSBtYWNfODI1NThfRDEwMV9BNCkgJiYKIAkgICAobmljLT5lZXByb21bZWVwcm9tX2lkXSAmIGVlcHJvbV9pZF93b2wpKSB7CiAJCW5pYy0+ZmxhZ3MgfD0gd29sX21hZ2ljOwogCQlkZXZpY2Vfc2V0X3dha2V1cF9lbmFibGUoJnBkZXYtPmRldiwgdHJ1ZSk7CkBAIC0yNzUwLDcgKzI2NDUsNyBAQAogCXBjaV9wbWVfYWN0aXZlKHBkZXYsIGZhbHNlKTsKIAogCXN0cmNweShuZXRkZXYtPm5hbWUsICJldGglZCIpOwotCWlmKChlcnIgPSByZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KSkpIHsKKwlpZiAoKGVyciA9IHJlZ2lzdGVyX25ldGRldihuZXRkZXYpKSkgewogCQlEUFJJTlRLKFBST0JFLCBFUlIsICJDYW5ub3QgcmVnaXN0ZXIgbmV0IGRldmljZSwgYWJvcnRpbmcuXG4iKTsKIAkJZ290byBlcnJfb3V0X2ZyZWU7CiAJfQpAQCAtMjc3OSw3ICsyNjc0LDcgQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCi0JaWYobmV0ZGV2KSB7CisJaWYgKG5ldGRldikgewogCQlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCQl1bnJlZ2lzdGVyX25ldGRldihuZXRkZXYpOwogCQllMTAwX2ZyZWUobmljKTsKQEAgLTI5MzIsNyArMjgyNyw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGUxMDBfaW5pdF9tb2R1bGUodm9pZCkKIHsKLQlpZigoKDEgPDwgZGVidWcpIC0gMSkgJiBORVRJRl9NU0dfRFJWKSB7CisJaWYgKCgoMSA8PCBkZWJ1ZykgLSAxKSAmIE5FVElGX01TR19EUlYpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVzLCAlc1xuIiwgRFJWX0RFU0NSSVBUSU9OLCBEUlZfVkVSU0lPTik7CiAJCXByaW50ayhLRVJOX0lORk8gUEZYICIlc1xuIiwgRFJWX0NPUFlSSUdIVCk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfaHcuYyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2h3LmMKaW5kZXggZDA0ZWVmNS4uZTFhM2ZjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfaHcuYworKysgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5jCkBAIC02NzU4LDcgKzY3NTgsNyBAQAogICogcmV0dXJuczogLSBFMTAwMF9FUlJfWFhYCiAgKiAgICAgICAgICAgIEUxMDAwX1NVQ0NFU1MKICAqCi0gKiBGb3IgcGh5J3Mgb2xkZXIgdGhlbiBJR1AsIHRoaXMgZnVuY3Rpb24gc2ltcGx5IHJlYWRzIHRoZSBwb2xhcml0eSBiaXQgaW4gdGhlCisgKiBGb3IgcGh5J3Mgb2xkZXIgdGhhbiBJR1AsIHRoaXMgZnVuY3Rpb24gc2ltcGx5IHJlYWRzIHRoZSBwb2xhcml0eSBiaXQgaW4gdGhlCiAgKiBQaHkgU3RhdHVzIHJlZ2lzdGVyLiAgRm9yIElHUCBwaHkncywgdGhpcyBiaXQgaXMgdmFsaWQgb25seSBpZiBsaW5rIHNwZWVkIGlzCiAgKiAxMCBNYnBzLiAgSWYgdGhlIGxpbmsgc3BlZWQgaXMgMTAwIE1icHMgdGhlcmUgaXMgbm8gcG9sYXJpdHkgc28gdGhpcyBiaXQgd2lsbAogICogcmV0dXJuIDAuICBJZiB0aGUgbGluayBzcGVlZCBpcyAxMDAwIE1icHMgdGhlIHBvbGFyaXR5IHN0YXR1cyBpcyBpbiB0aGUKQEAgLTY4MzQsNyArNjgzNCw3IEBACiAgKiByZXR1cm5zOiAtIEUxMDAwX0VSUl9YWFgKICAqICAgICAgICAgICAgRTEwMDBfU1VDQ0VTUwogICoKLSAqIEZvciBwaHkncyBvbGRlciB0aGVuIElHUCwgdGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgRG93bnNoaWZ0IGJpdCBpbiB0aGUgUGh5CisgKiBGb3IgcGh5J3Mgb2xkZXIgdGhhbiBJR1AsIHRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIERvd25zaGlmdCBiaXQgaW4gdGhlIFBoeQogICogU3BlY2lmaWMgU3RhdHVzIHJlZ2lzdGVyLiAgRm9yIElHUCBwaHkncywgaXQgcmVhZHMgdGhlIERvd25ncmFkZSBiaXQgaW4gdGhlCiAgKiBMaW5rIEhlYWx0aCByZWdpc3Rlci4gIEluIElHUCB0aGlzIGJpdCBpcyBsYXRjaGVkIGhpZ2gsIHNvIHRoZSBkcml2ZXIgbXVzdAogICogcmVhZCBpdCBpbW1lZGlhdGVseSBhZnRlciBsaW5rIGlzIGVzdGFibGlzaGVkLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDBlL25ldGRldi5jIGIvZHJpdmVycy9uZXQvZTEwMDBlL25ldGRldi5jCmluZGV4IGQ0NjM5ZmEuLjkxODE3ZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwZS9uZXRkZXYuYworKysgYi9kcml2ZXJzL25ldC9lMTAwMGUvbmV0ZGV2LmMKQEAgLTQ4MDcsNyArNDgwNyw3IEBACiAJCX0KIAl9CiAKLQllcnIgPSBwY2lfcmVxdWVzdF9zZWxlY3RlZF9yZWdpb25zKHBkZXYsCisJZXJyID0gcGNpX3JlcXVlc3Rfc2VsZWN0ZWRfcmVnaW9uc19leGNsdXNpdmUocGRldiwKIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNpX3NlbGVjdF9iYXJzKHBkZXYsIElPUkVTT1VSQ0VfTUVNKSwKIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTEwMDBlX2RyaXZlcl9uYW1lKTsKIAlpZiAoZXJyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZWhlYS9laGVhLmggYi9kcml2ZXJzL25ldC9laGVhL2VoZWEuaAppbmRleCA5OTMwZDVmLi42MjcxYjk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9laGVhL2VoZWEuaAorKysgYi9kcml2ZXJzL25ldC9laGVhL2VoZWEuaApAQCAtNDc4LDcgKzQ3OCw3IEBACiAJaW50IG51bV9hZGRfdHhfcXBzOwogCWludCBudW1fbWNzOwogCWludCByZXNldHM7Ci0JdTY0IGZsYWdzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTY0IG1hY19hZGRyOwogCXUzMiBsb2dpY2FsX3BvcnRfaWQ7CiAJdTMyIHBvcnRfc3BlZWQ7CkBAIC01MTAsNyArNTEwLDYgQEAKIGludCBlaGVhX3NlbnNlX3BvcnRfYXR0cihzdHJ1Y3QgZWhlYV9wb3J0ICpwb3J0KTsKIGludCBlaGVhX3NldF9wb3J0c3BlZWQoc3RydWN0IGVoZWFfcG9ydCAqcG9ydCwgdTMyIHBvcnRfc3BlZWQpOwogCi1leHRlcm4gdTY0IGVoZWFfZHJpdmVyX2ZsYWdzOwogZXh0ZXJuIHN0cnVjdCB3b3JrX3N0cnVjdCBlaGVhX3JlcmVnX21yX3Rhc2s7CiAKICNlbmRpZgkvKiBfX0VIRUFfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9laGVhL2VoZWFfbWFpbi5jIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX21haW4uYwppbmRleCBhMmYxOTA1Li5lMzEzMWVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9laGVhL2VoZWFfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9tYWluLmMKQEAgLTk5LDcgKzk5LDcgQEAKIAogc3RhdGljIGludCBwb3J0X25hbWVfY250Owogc3RhdGljIExJU1RfSEVBRChhZGFwdGVyX2xpc3QpOwotdTY0IGVoZWFfZHJpdmVyX2ZsYWdzOworc3RhdGljIHVuc2lnbmVkIGxvbmcgZWhlYV9kcml2ZXJfZmxhZ3M7CiBzdHJ1Y3Qgd29ya19zdHJ1Y3QgZWhlYV9yZXJlZ19tcl90YXNrOwogc3RhdGljIERFRklORV9NVVRFWChkbHBhcl9tZW1fbG9jayk7CiBzdHJ1Y3QgZWhlYV9md19oYW5kbGVfYXJyYXkgZWhlYV9md19oYW5kbGVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZWhlYS9laGVhX3BoeXAuYyBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9waHlwLmMKaW5kZXggMmEzM2E2MS4uOGZlOWRjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZWhlYS9laGVhX3BoeXAuYworKysgYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfcGh5cC5jCkBAIC0yMTQsNyArMjE0LDcgQEAKIAkJCSAgICAgdTY0ICpxcF9oYW5kbGUsIHN0cnVjdCBoX2VwYXMgKmhfZXBhcykKIHsKIAl1NjQgaHJldDsKLQl1NjQgb3V0c1tQTFBBUl9IQ0FMTDlfQlVGU0laRV07CisJdW5zaWduZWQgbG9uZyBvdXRzW1BMUEFSX0hDQUxMOV9CVUZTSVpFXTsKIAogCXU2NCBhbGxvY2F0ZV9jb250cm9scyA9CiAJICAgIEVIRUFfQk1BU0tfU0VUKEhfQUxMX1JFU19RUF9FUVBPLCBpbml0X2F0dHItPmxvd19sYXRfcnExID8gMSA6IDApCkBAIC0zMTIsNyArMzEyLDcgQEAKIAkJCSAgICAgdTY0ICpjcV9oYW5kbGUsIHN0cnVjdCBoX2VwYXMgKmVwYXMpCiB7CiAJdTY0IGhyZXQ7Ci0JdTY0IG91dHNbUExQQVJfSENBTEw5X0JVRlNJWkVdOworCXVuc2lnbmVkIGxvbmcgb3V0c1tQTFBBUl9IQ0FMTDlfQlVGU0laRV07CiAKIAlocmV0ID0gZWhlYV9wbHBhcl9oY2FsbDkoSF9BTExPQ19IRUFfUkVTT1VSQ0UsCiAJCQkJIG91dHMsCkBAIC0zNzQsNyArMzc0LDcgQEAKIAkJCSAgICAgc3RydWN0IGVoZWFfZXFfYXR0ciAqZXFfYXR0ciwgdTY0ICplcV9oYW5kbGUpCiB7CiAJdTY0IGhyZXQsIGFsbG9jYXRlX2NvbnRyb2xzOwotCXU2NCBvdXRzW1BMUEFSX0hDQUxMOV9CVUZTSVpFXTsKKwl1bnNpZ25lZCBsb25nIG91dHNbUExQQVJfSENBTEw5X0JVRlNJWkVdOwogCiAJLyogcmVzb3VyY2UgdHlwZSAqLwogCWFsbG9jYXRlX2NvbnRyb2xzID0KQEAgLTQwNyw3ICs0MDcsNyBAQAogCQkJICB1MTYgKm91dF9zd3IsIHUxNiAqb3V0X3J3cikKIHsKIAl1NjQgaHJldDsKLQl1NjQgb3V0c1tQTFBBUl9IQ0FMTDlfQlVGU0laRV07CisJdW5zaWduZWQgbG9uZyBvdXRzW1BMUEFSX0hDQUxMOV9CVUZTSVpFXTsKIAogCWhyZXQgPSBlaGVhX3BscGFyX2hjYWxsOShIX01PRElGWV9IRUFfUVAsCiAJCQkJIG91dHMsCkBAIC00NDksNyArNDQ5LDcgQEAKIAkJCXN0cnVjdCBlaGVhX21yICptcikKIHsKIAl1NjQgaHJldDsKLQl1NjQgb3V0c1tQTFBBUl9IQ0FMTDlfQlVGU0laRV07CisJdW5zaWduZWQgbG9uZyBvdXRzW1BMUEFSX0hDQUxMOV9CVUZTSVpFXTsKIAogCWhyZXQgPSBlaGVhX3BscGFyX2hjYWxsOShIX1JFR0lTVEVSX1NNUiwKIAkJCQkgb3V0cywKQEAgLTQ2OCw3ICs0NjgsNyBAQAogCiB1NjQgZWhlYV9oX2Rpc2FibGVfYW5kX2dldF9oZWEoY29uc3QgdTY0IGFkYXB0ZXJfaGFuZGxlLCBjb25zdCB1NjQgcXBfaGFuZGxlKQogewotCXU2NCBvdXRzW1BMUEFSX0hDQUxMOV9CVUZTSVpFXTsKKwl1bnNpZ25lZCBsb25nIG91dHNbUExQQVJfSENBTEw5X0JVRlNJWkVdOwogCiAJcmV0dXJuIGVoZWFfcGxwYXJfaGNhbGw5KEhfRElTQUJMRV9BTkRfR0VUX0hFQSwKIAkJCQkgb3V0cywKQEAgLTQ5Myw3ICs0OTMsNyBAQAogCQkJICAgICBjb25zdCB1MzIgcGQsIHU2NCAqbXJfaGFuZGxlLCB1MzIgKmxrZXkpCiB7CiAJdTY0IGhyZXQ7Ci0JdTY0IG91dHNbUExQQVJfSENBTEw5X0JVRlNJWkVdOworCXVuc2lnbmVkIGxvbmcgb3V0c1tQTFBBUl9IQ0FMTDlfQlVGU0laRV07CiAKIAlocmV0ID0gZWhlYV9wbHBhcl9oY2FsbDkoSF9BTExPQ19IRUFfUkVTT1VSQ0UsCiAJCQkJIG91dHMsCkBAIC01NjQsNyArNTY0LDcgQEAKIAkJCSAgICBjb25zdCB1OCBjYl9jYXQsIGNvbnN0IHU2NCBzZWxlY3RfbWFzaywKIAkJCSAgICB2b2lkICpjYl9hZGRyKQogewotCXU2NCBvdXRzW1BMUEFSX0hDQUxMOV9CVUZTSVpFXTsKKwl1bnNpZ25lZCBsb25nIG91dHNbUExQQVJfSENBTEw5X0JVRlNJWkVdOwogCXU2NCBwb3J0X2luZm87CiAJdTY0IGFycl9pbmRleCA9IDA7CiAJdTY0IGNiX2xvZ2FkZHIgPSB2aXJ0X3RvX2FicyhjYl9hZGRyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VuYzI4ajYwLmMgYi9kcml2ZXJzL25ldC9lbmMyOGo2MC5jCmluZGV4IGIwZWY0NmMuLmZjNmNjMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VuYzI4ajYwLmMKKysrIGIvZHJpdmVycy9uZXQvZW5jMjhqNjAuYwpAQCAtOTQ0LDcgKzk0NCw3IEBACiAJaWYgKG5ldGlmX21zZ19yeF9zdGF0dXMocHJpdikpCiAJCWVuYzI4ajYwX2R1bXBfcnN2KHByaXYsIF9fZnVuY19fLCBuZXh0X3BhY2tldCwgbGVuLCByeHN0YXQpOwogCi0JaWYgKCFSU1ZfR0VUQklUKHJ4c3RhdCwgUlNWX1JYT0spKSB7CisJaWYgKCFSU1ZfR0VUQklUKHJ4c3RhdCwgUlNWX1JYT0spIHx8IGxlbiA+IE1BWF9GUkFNRUxFTikgewogCQlpZiAobmV0aWZfbXNnX3J4X2Vycihwcml2KSkKIAkJCWRldl9lcnIoJm5kZXYtPmRldiwgIlJ4IEVycm9yICglMDR4KVxuIiwgcnhzdGF0KTsKIAkJbmRldi0+c3RhdHMucnhfZXJyb3JzKys7CkBAIC05NTIsNiArOTUyLDggQEAKIAkJCW5kZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKIAkJaWYgKFJTVl9HRVRCSVQocnhzdGF0LCBSU1ZfTEVOQ0hFQ0tFUlIpKQogCQkJbmRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCWlmIChsZW4gPiBNQVhfRlJBTUVMRU4pCisJCQluZGV2LT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOwogCX0gZWxzZSB7CiAJCXNrYiA9IGRldl9hbGxvY19za2IobGVuICsgTkVUX0lQX0FMSUdOKTsKIAkJaWYgKCFza2IpIHsKQEAgLTE1MjksNiArMTUzMSwxNyBAQAogCXJldHVybiBlbmMyOGo2MF9od19pbml0KHByaXYpOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGVuYzI4ajYwX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCQk9IGVuYzI4ajYwX25ldF9vcGVuLAorCS5uZG9fc3RvcAkJPSBlbmMyOGo2MF9uZXRfY2xvc2UsCisJLm5kb19zdGFydF94bWl0CQk9IGVuYzI4ajYwX3NlbmRfcGFja2V0LAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gZW5jMjhqNjBfc2V0X211bHRpY2FzdF9saXN0LAorCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gZW5jMjhqNjBfc2V0X21hY19hZGRyZXNzLAorCS5uZG9fdHhfdGltZW91dAkJPSBlbmMyOGo2MF90eF90aW1lb3V0LAorCS5uZG9fY2hhbmdlX210dQkJPSBldGhfY2hhbmdlX210dSwKKwkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKK307CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IGVuYzI4ajYwX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKQEAgLTE1ODMsMTIgKzE1OTYsNyBAQAogCiAJZGV2LT5pZl9wb3J0ID0gSUZfUE9SVF8xMEJBU0VUOwogCWRldi0+aXJxID0gc3BpLT5pcnE7Ci0JZGV2LT5vcGVuID0gZW5jMjhqNjBfbmV0X29wZW47Ci0JZGV2LT5zdG9wID0gZW5jMjhqNjBfbmV0X2Nsb3NlOwotCWRldi0+aGFyZF9zdGFydF94bWl0ID0gZW5jMjhqNjBfc2VuZF9wYWNrZXQ7Ci0JZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmZW5jMjhqNjBfc2V0X211bHRpY2FzdF9saXN0OwotCWRldi0+c2V0X21hY19hZGRyZXNzID0gZW5jMjhqNjBfc2V0X21hY19hZGRyZXNzOwotCWRldi0+dHhfdGltZW91dCA9ICZlbmMyOGo2MF90eF90aW1lb3V0OworCWRldi0+bmV0ZGV2X29wcyA9ICZlbmMyOGo2MF9uZXRkZXZfb3BzOwogCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOwogCVNFVF9FVEhUT09MX09QUyhkZXYsICZlbmMyOGo2MF9ldGh0b29sX29wcyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VwaWMxMDAuYyBiL2RyaXZlcnMvbmV0L2VwaWMxMDAuYwppbmRleCBmOWIzN2M4Li5hNTM5YmMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lcGljMTAwLmMKKysrIGIvZHJpdmVycy9uZXQvZXBpYzEwMC5jCkBAIC0zMDgsNyArMzA4LDE4IEBACiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmVwaWNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIHZvaWQgc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKLQorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBlcGljX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCQk9IGVwaWNfb3BlbiwKKwkubmRvX3N0b3AJCT0gZXBpY19jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJCT0gZXBpY19zdGFydF94bWl0LAorCS5uZG9fdHhfdGltZW91dCAJPSBlcGljX3R4X3RpbWVvdXQsCisJLm5kb19nZXRfc3RhdHMJCT0gZXBpY19nZXRfc3RhdHMsCisJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBzZXRfcnhfbW9kZSwKKwkubmRvX2RvX2lvY3RsIAkJPSBuZXRkZXZfaW9jdGwsCisJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAorCS5uZG9fc2V0X21hY19hZGRyZXNzIAk9IGV0aF9tYWNfYWRkciwKKwkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKK307CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGVwaWNfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJCSAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQpAQCAtNDgzLDE1ICs0OTQsOSBAQAogCWRldi0+aWZfcG9ydCA9IGVwLT5kZWZhdWx0X3BvcnQgPSBvcHRpb247CiAKIAkvKiBUaGUgRXBpYy1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLwotCWRldi0+b3BlbiA9ICZlcGljX29wZW47Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmZXBpY19zdGFydF94bWl0OwotCWRldi0+c3RvcCA9ICZlcGljX2Nsb3NlOwotCWRldi0+Z2V0X3N0YXRzID0gJmVwaWNfZ2V0X3N0YXRzOwotCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9yeF9tb2RlOwotCWRldi0+ZG9faW9jdGwgPSAmbmV0ZGV2X2lvY3RsOworCWRldi0+bmV0ZGV2X29wcyA9ICZlcGljX25ldGRldl9vcHM7CiAJZGV2LT5ldGh0b29sX29wcyA9ICZuZXRkZXZfZXRodG9vbF9vcHM7CiAJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7Ci0JZGV2LT50eF90aW1lb3V0ID0gJmVwaWNfdHhfdGltZW91dDsKIAluZXRpZl9uYXBpX2FkZChkZXYsICZlcC0+bmFwaSwgZXBpY19wb2xsLCA2NCk7CiAKIAlyZXQgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ZlYWxueC5jIGIvZHJpdmVycy9uZXQvZmVhbG54LmMKaW5kZXggMzFhYjFmZi4uZGFmNzI3MmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2ZlYWxueC5jCisrKyBiL2RyaXZlcnMvbmV0L2ZlYWxueC5jCkBAIC00NjcsNiArNDY3LDE4IEBACiAJfQogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIG5ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCQk9IG5ldGRldl9vcGVuLAorCS5uZG9fc3RvcAkJPSBuZXRkZXZfY2xvc2UsCisJLm5kb19zdGFydF94bWl0CQk9IHN0YXJ0X3R4LAorCS5uZG9fZ2V0X3N0YXRzIAkJPSBnZXRfc3RhdHMsCisJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBzZXRfcnhfbW9kZSwKKwkubmRvX2RvX2lvY3RsCQk9IG1paV9pb2N0bCwKKwkubmRvX3R4X3RpbWVvdXQJCT0gZmVhbG54X3R4X3RpbWVvdXQsCisJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAorCS5uZG9fc2V0X21hY19hZGRyZXNzIAk9IGV0aF9tYWNfYWRkciwKKwkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKK307CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGZlYWxueF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJCQkgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCkBAIC02NDksMTUgKzY2MSw4IEBACiAJCW5wLT5taWkuZm9yY2VfbWVkaWEgPSAxOwogCX0KIAotCS8qIFRoZSBjaGlwLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCi0JZGV2LT5vcGVuID0gJm5ldGRldl9vcGVuOwotCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJnN0YXJ0X3R4OwotCWRldi0+c3RvcCA9ICZuZXRkZXZfY2xvc2U7Ci0JZGV2LT5nZXRfc3RhdHMgPSAmZ2V0X3N0YXRzOwotCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9yeF9tb2RlOwotCWRldi0+ZG9faW9jdGwgPSAmbWlpX2lvY3RsOworCWRldi0+bmV0ZGV2X29wcyA9ICZuZXRkZXZfb3BzOwogCWRldi0+ZXRodG9vbF9vcHMgPSAmbmV0ZGV2X2V0aHRvb2xfb3BzOwotCWRldi0+dHhfdGltZW91dCA9ICZmZWFsbnhfdHhfdGltZW91dDsKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKIAogCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZ2lhbmZhci5jIGIvZHJpdmVycy9uZXQvZ2lhbmZhci5jCmluZGV4IGM2NzJlY2YuLjFiOGRlY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2dpYW5mYXIuYworKysgYi9kcml2ZXJzL25ldC9naWFuZmFyLmMKQEAgLTIzOCw4ICsyMzgsOCBAQAogCQkJZ290byBlcnJfb3V0OwogCQl9CiAKLQkJc25wcmludGYocHJpdi0+cGh5X2J1c19pZCwgQlVTX0lEX1NJWkUsIFBIWV9JRF9GTVQsICIwIiwKLQkJCQlmaXhlZF9saW5rWzBdKTsKKwkJc25wcmludGYocHJpdi0+cGh5X2J1c19pZCwgc2l6ZW9mKHByaXYtPnBoeV9idXNfaWQpLAorCQkJCVBIWV9JRF9GTVQsICIwIiwgZml4ZWRfbGlua1swXSk7CiAJfSBlbHNlIHsKIAkJcGh5ID0gb2ZfZmluZF9ub2RlX2J5X3BoYW5kbGUoKnBoKTsKIApAQCAtMjU2LDcgKzI1Niw3IEBACiAJCW9mX25vZGVfcHV0KG1kaW8pOwogCiAJCWdmYXJfbWRpb19idXNfbmFtZShidXNfbmFtZSwgbWRpbyk7Ci0JCXNucHJpbnRmKHByaXYtPnBoeV9idXNfaWQsIEJVU19JRF9TSVpFLCAiJXM6JTAyeCIsCisJCXNucHJpbnRmKHByaXYtPnBoeV9idXNfaWQsIHNpemVvZihwcml2LT5waHlfYnVzX2lkKSwgIiVzOiUwMngiLAogCQkJCWJ1c19uYW1lLCAqaWQpOwogCX0KIApAQCAtMTk3Myw2ICsxOTczLDggQEAKIAkJCWNhc2UgMTAwMDoKIAkJCQl0ZW1wdmFsID0KIAkJCQkgICAgKCh0ZW1wdmFsICYgfihNQUNDRkcyX0lGKSkgfCBNQUNDRkcyX0dNSUkpOworCisJCQkJZWNudHJsICY9IH4oRUNOVFJMX1IxMDApOwogCQkJCWJyZWFrOwogCQkJY2FzZSAxMDA6CiAJCQljYXNlIDEwOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaHAxMDAuYyBiL2RyaXZlcnMvbmV0L2hwMTAwLmMKaW5kZXggZWJlNzY1MS4uYWQ4YmU3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaHAxMDAuYworKysgYi9kcml2ZXJzL25ldC9ocDEwMC5jCkBAIC00MjUsNiArNDI1LDI4IEBACiB9CiAjZW5kaWYgLyogIU1PRFVMRSAmJiBDT05GSUdfSVNBICovCiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgaHAxMDBfYm1fbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gaHAxMDBfb3BlbiwKKwkubmRvX3N0b3AJCT0gaHAxMDBfY2xvc2UsCisJLm5kb19zdGFydF94bWl0CQk9IGhwMTAwX3N0YXJ0X3htaXRfYm0sCisJLm5kb19nZXRfc3RhdHMgCQk9IGhwMTAwX2dldF9zdGF0cywKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IGhwMTAwX3NldF9tdWx0aWNhc3RfbGlzdCwKKwkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgCT0gZXRoX21hY19hZGRyLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBocDEwMF9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbgkJPSBocDEwMF9vcGVuLAorCS5uZG9fc3RvcAkJPSBocDEwMF9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJCT0gaHAxMDBfc3RhcnRfeG1pdCwKKwkubmRvX2dldF9zdGF0cyAJCT0gaHAxMDBfZ2V0X3N0YXRzLAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gaHAxMDBfc2V0X211bHRpY2FzdF9saXN0LAorCS5uZG9fY2hhbmdlX210dQkJPSBldGhfY2hhbmdlX210dSwKKwkubmRvX3NldF9tYWNfYWRkcmVzcyAJPSBldGhfbWFjX2FkZHIsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCit9OworCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBocDEwMF9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkciwKIAkJCQkgIHVfY2hhciBidXMsIHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQogewpAQCAtNjU3LDE2ICs2NzksMTAgQEAKIAlscC0+dmlydF9tZW1vcnlfc2l6ZSA9IHZpcnRfbWVtb3J5X3NpemU7CiAJbHAtPnJ4X3JhdGlvID0gaHAxMDBfcnhfcmF0aW87CS8qIGNhbiBiZSBjb25mJ2Qgd2l0aCBpbnNtb2QgKi8KIAotCWRldi0+b3BlbiA9IGhwMTAwX29wZW47Ci0JZGV2LT5zdG9wID0gaHAxMDBfY2xvc2U7Ci0KIAlpZiAobHAtPm1vZGUgPT0gMSkJLyogYnVzbWFzdGVyICovCi0JCWRldi0+aGFyZF9zdGFydF94bWl0ID0gaHAxMDBfc3RhcnRfeG1pdF9ibTsKKwkJZGV2LT5uZXRkZXZfb3BzID0gJmhwMTAwX2JtX25ldGRldl9vcHM7CiAJZWxzZQotCQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGhwMTAwX3N0YXJ0X3htaXQ7Ci0KLQlkZXYtPmdldF9zdGF0cyA9IGhwMTAwX2dldF9zdGF0czsKLQlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZocDEwMF9zZXRfbXVsdGljYXN0X2xpc3Q7CisJCWRldi0+bmV0ZGV2X29wcyA9ICZocDEwMF9uZXRkZXZfb3BzOwogCiAJLyogQXNrIHRoZSBjYXJkIGZvciB3aGljaCBJUlEgbGluZSBpdCBpcyBjb25maWd1cmVkICovCiAJaWYgKGJ1cyA9PSBIUDEwMF9CVVNfUENJKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pYm12ZXRoLmMgYi9kcml2ZXJzL25ldC9pYm12ZXRoLmMKaW5kZXggOWJjMGYxNy4uY2EzYmI5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWJtdmV0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2libXZldGguYwpAQCAtNzU0LDcgKzc1NCw3IEBACiAJCQkJICAgIHZvaWQgKCpkb25lKSAoc3RydWN0IG5ldF9kZXZpY2UgKiwgdTMyKSkKIHsKIAlzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl1NjQgc2V0X2F0dHIsIGNscl9hdHRyLCByZXRfYXR0cjsKKwl1bnNpZ25lZCBsb25nIHNldF9hdHRyLCBjbHJfYXR0ciwgcmV0X2F0dHI7CiAJbG9uZyByZXQ7CiAJaW50IHJjMSA9IDAsIHJjMiA9IDA7CiAJaW50IHJlc3RhcnQgPSAwOwpAQCAtMTIwOSw3ICsxMjA5LDcgQEAKIAlsb25nIHJldDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwogCXN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXI7Ci0JdTY0IHNldF9hdHRyLCByZXRfYXR0cjsKKwl1bnNpZ25lZCBsb25nIHNldF9hdHRyLCByZXRfYXR0cjsKIAogCXVuc2lnbmVkIGNoYXIgKm1hY19hZGRyX3A7CiAJdW5zaWduZWQgaW50ICptY2FzdEZpbHRlclNpemVfcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2libXZldGguaCBiL2RyaXZlcnMvbmV0L2libXZldGguaAppbmRleCBkMjgxODY5Li5lYzc2YWNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pYm12ZXRoLmgKKysrIGIvZHJpdmVycy9uZXQvaWJtdmV0aC5oCkBAIC0zOSwxMSArMzksMTEgQEAKICNkZWZpbmUgSWJtVmV0aE1jYXN0UmVtb3ZlRmlsdGVyICAgICAweDJVTAogI2RlZmluZSBJYm1WZXRoTWNhc3RDbGVhckZpbHRlclRhYmxlIDB4M1VMCiAKLSNkZWZpbmUgSUJNVkVUSF9JTExBTl9QQURERURfUEtUX0NTVU0JMHgwMDAwMDAwMDAwMDAyMDAwVUxMCi0jZGVmaW5lIElCTVZFVEhfSUxMQU5fVFJVTktfUFJJX01BU0sJMHgwMDAwMDAwMDAwMDAwRjAwVUxMCi0jZGVmaW5lIElCTVZFVEhfSUxMQU5fSVBWNl9UQ1BfQ1NVTQkJMHgwMDAwMDAwMDAwMDAwMDA0VUxMCi0jZGVmaW5lIElCTVZFVEhfSUxMQU5fSVBWNF9UQ1BfQ1NVTQkJMHgwMDAwMDAwMDAwMDAwMDAyVUxMCi0jZGVmaW5lIElCTVZFVEhfSUxMQU5fQUNUSVZFX1RSVU5LCQkweDAwMDAwMDAwMDAwMDAwMDFVTEwKKyNkZWZpbmUgSUJNVkVUSF9JTExBTl9QQURERURfUEtUX0NTVU0JMHgwMDAwMDAwMDAwMDAyMDAwVUwKKyNkZWZpbmUgSUJNVkVUSF9JTExBTl9UUlVOS19QUklfTUFTSwkweDAwMDAwMDAwMDAwMDBGMDBVTAorI2RlZmluZSBJQk1WRVRIX0lMTEFOX0lQVjZfVENQX0NTVU0JCTB4MDAwMDAwMDAwMDAwMDAwNFVMCisjZGVmaW5lIElCTVZFVEhfSUxMQU5fSVBWNF9UQ1BfQ1NVTQkJMHgwMDAwMDAwMDAwMDAwMDAyVUwKKyNkZWZpbmUgSUJNVkVUSF9JTExBTl9BQ1RJVkVfVFJVTksJCTB4MDAwMDAwMDAwMDAwMDAwMVVMCiAKIC8qIGhjYWxsIG1hY3JvcyAqLwogI2RlZmluZSBoX3JlZ2lzdGVyX2xvZ2ljYWxfbGFuKHVhLCBidWZsc3QsIHJ4cSwgZmx0bHN0LCBtYWMpIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lnYi9pZ2JfbWFpbi5jIGIvZHJpdmVycy9uZXQvaWdiL2lnYl9tYWluLmMKaW5kZXggMDIyNzk0ZS4uYjgyYjBmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWdiL2lnYl9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvaWdiL2lnYl9tYWluLmMKQEAgLTE0NTcsOCArMTQ1Nyw4IEBACiAKIAkvKiBOdW1iZXIgb2Ygc3VwcG9ydGVkIHF1ZXVlcy4gKi8KIAkvKiBIYXZpbmcgbW9yZSBxdWV1ZXMgdGhhbiBDUFVzIGRvZXNuJ3QgbWFrZSBzZW5zZS4gKi8KLQlhZGFwdGVyLT5udW1fcnhfcXVldWVzID0gbWluKCh1MzIpSUdCX01BWF9SWF9RVUVVRVMsICh1MzIpbnVtX29ubGluZV9jcHVzKCkpOwotCWFkYXB0ZXItPm51bV90eF9xdWV1ZXMgPSBtaW4oSUdCX01BWF9UWF9RVUVVRVMsIG51bV9vbmxpbmVfY3B1cygpKTsKKwlhZGFwdGVyLT5udW1fcnhfcXVldWVzID0gbWluX3QodTMyLCBJR0JfTUFYX1JYX1FVRVVFUywgbnVtX29ubGluZV9jcHVzKCkpOworCWFkYXB0ZXItPm51bV90eF9xdWV1ZXMgPSBtaW5fdCh1MzIsIElHQl9NQVhfVFhfUVVFVUVTLCBudW1fb25saW5lX2NwdXMoKSk7CiAKIAkvKiBUaGlzIGNhbGwgbWF5IGRlY3JlYXNlIHRoZSBudW1iZXIgb2YgcXVldWVzIGRlcGVuZGluZyBvbgogCSAqIGludGVycnVwdCBtb2RlLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXBnLmMgYi9kcml2ZXJzL25ldC9pcGcuYwppbmRleCA3YjZkNDM1Li4zNjBhYTVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcGcuYworKysgYi9kcml2ZXJzL25ldC9pcGcuYwpAQCAtMjIxMCw2ICsyMjEwLDE5IEBACiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGlwZ19uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbgkJPSBpcGdfbmljX29wZW4sCisJLm5kb19zdG9wCQk9IGlwZ19uaWNfc3RvcCwKKwkubmRvX3N0YXJ0X3htaXQJCT0gaXBnX25pY19oYXJkX3N0YXJ0X3htaXQsCisJLm5kb19nZXRfc3RhdHMJCT0gaXBnX25pY19nZXRfc3RhdHMsCisJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBpcGdfbmljX3NldF9tdWx0aWNhc3RfbGlzdCwKKwkubmRvX2RvX2lvY3RsCQk9IGlwZ19pb2N0bCwKKwkubmRvX3R4X3RpbWVvdXQgCT0gaXBnX3R4X3RpbWVvdXQsCisJLm5kb19jaGFuZ2VfbXR1IAk9IGlwZ19uaWNfY2hhbmdlX210dSwKKwkubmRvX3NldF9tYWNfYWRkcmVzcwk9IGV0aF9tYWNfYWRkciwKKwkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKK307CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IGlwZ19wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7CkBAIC0yMjU4LDE1ICsyMjcxLDcgQEAKIAogCS8qIERlY2xhcmUgSVBHIE5JQyBmdW5jdGlvbnMgZm9yIEV0aGVybmV0IGRldmljZSBtZXRob2RzLgogCSAqLwotCWRldi0+b3BlbiA9ICZpcGdfbmljX29wZW47Ci0JZGV2LT5zdG9wID0gJmlwZ19uaWNfc3RvcDsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZpcGdfbmljX2hhcmRfc3RhcnRfeG1pdDsKLQlkZXYtPmdldF9zdGF0cyA9ICZpcGdfbmljX2dldF9zdGF0czsKLQlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZpcGdfbmljX3NldF9tdWx0aWNhc3RfbGlzdDsKLQlkZXYtPmRvX2lvY3RsID0gaXBnX2lvY3RsOwotCWRldi0+dHhfdGltZW91dCA9IGlwZ190eF90aW1lb3V0OwotCWRldi0+Y2hhbmdlX210dSA9ICZpcGdfbmljX2NoYW5nZV9tdHU7Ci0KKwlkZXYtPm5ldGRldl9vcHMgPSAmaXBnX25ldGRldl9vcHM7CiAJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKIAlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmaXBnX2V0aHRvb2xfb3BzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9hbGktaXJjYy5jIGIvZHJpdmVycy9uZXQvaXJkYS9hbGktaXJjYy5jCmluZGV4IDNjNThlNjcuLjE3Nzc5ZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvYWxpLWlyY2MuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL2FsaS1pcmNjLmMKQEAgLTEwOSw3ICsxMDksNiBAQAogc3RhdGljIGludCAgYWxpX2lyY2NfbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIGludCAgYWxpX2lyY2NfbmV0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOwogc3RhdGljIHZvaWQgYWxpX2lyY2NfY2hhbmdlX3NwZWVkKHN0cnVjdCBhbGlfaXJjY19jYiAqc2VsZiwgX191MzIgYmF1ZCk7Ci1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmFsaV9pcmNjX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKIC8qIFNJUiBmdW5jdGlvbiAqLwogc3RhdGljIGludCAgYWxpX2lyY2Nfc2lyX2hhcmRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKQEAgLTM2Niw3ICszNjUsNiBAQAogCWRldi0+b3BlbiAgICAgICAgICAgID0gYWxpX2lyY2NfbmV0X29wZW47CiAJZGV2LT5zdG9wICAgICAgICAgICAgPSBhbGlfaXJjY19uZXRfY2xvc2U7CiAJZGV2LT5kb19pb2N0bCAgICAgICAgPSBhbGlfaXJjY19uZXRfaW9jdGw7Ci0JZGV2LT5nZXRfc3RhdHMJICAgICA9IGFsaV9pcmNjX25ldF9nZXRfc3RhdHM7CiAKIAllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKIAlpZiAoZXJyKSB7CkBAIC04NzYsNyArODc0LDcgQEAKICAgICAgICAgICogYXN5bmNfdW53cmFwX2NoYXIgd2lsbCBkZWxpdmVyIGFsbCBmb3VuZCBmcmFtZXMgIAogCSAqLwogCWRvIHsKLQkJYXN5bmNfdW53cmFwX2NoYXIoc2VsZi0+bmV0ZGV2LCAmc2VsZi0+c3RhdHMsICZzZWxmLT5yeF9idWZmLCAKKwkJYXN5bmNfdW53cmFwX2NoYXIoc2VsZi0+bmV0ZGV2LCAmc2VsZi0+bmV0ZGV2LT5zdGF0cywgJnNlbGYtPnJ4X2J1ZmYsCiAJCQkJICBpbmIoaW9iYXNlK1VBUlRfUlgpKTsKIAogCQkvKiBNYWtlIHN1cmUgd2UgZG9uJ3Qgc3RheSBoZXJlIHRvbyBsb25nICovCkBAIC05NDMsNyArOTQxLDcgQEAKIAkJCW5ldGlmX3dha2VfcXVldWUoc2VsZi0+bmV0ZGV2KTsJCiAJCX0KIAkJCQotCQlzZWxmLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCXNlbGYtPm5ldGRldi0+c3RhdHMudHhfcGFja2V0cysrOwogCQkKIAkJLyogVHVybiBvbiByZWNlaXZlIGludGVycnVwdHMgKi8KIAkJb3V0YihVQVJUX0lFUl9SREksIGlvYmFzZStVQVJUX0lFUik7CkBAIC0xNDY3LDcgKzE0NjUsNyBAQAogCXNlbGYtPnR4X2ZpZm8ucXVldWVbc2VsZi0+dHhfZmlmby5mcmVlXS5sZW4gPSBza2ItPmxlbjsKIAlzZWxmLT50eF9maWZvLnRhaWwgKz0gc2tiLT5sZW47CiAKLQlzZWxmLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOwogCiAJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHNlbGYtPnR4X2ZpZm8ucXVldWVbc2VsZi0+dHhfZmlmby5mcmVlXS5zdGFydCwKIAkJICAgICAgc2tiLT5sZW4pOwpAQCAtMTY2MSwxMiArMTY1OSwxMiBAQAogCQogCXsKIAkJSVJEQV9FUlJPUigiJXMoKSwgKioqKioqKioqIExTUl9GUkFNRV9BQk9SVCAqKioqKioqKipcbiIsIF9fZnVuY19fKTsKLQkJc2VsZi0+c3RhdHMudHhfZXJyb3JzKys7Ci0JCXNlbGYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CQkKKwkJc2VsZi0+bmV0ZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJc2VsZi0+bmV0ZGV2LT5zdGF0cy50eF9maWZvX2Vycm9ycysrOwogCX0KIAllbHNlIAogCXsKLQkJc2VsZi0+c3RhdHMudHhfcGFja2V0cysrOworCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKIAl9CiAKIAkvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgc3BlZWQgKi8KQEAgLTE4MzEsMzUgKzE4MjksMzUgQEAKIAkJCUlSREFfREVCVUcoMCwiJXMoKSwgKioqKioqKioqKioqKiBSWCBFcnJvcnMgKioqKioqKioqKioqIFxuIiwgX19mdW5jX18gKTsKIAkJCQogCQkJLyogU2tpcCBmcmFtZSAqLwotCQkJc2VsZi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOwogCQkJCiAJCQlzZWxmLT5yeF9idWZmLmRhdGEgKz0gbGVuOwogCQkJCiAJCQlpZiAoc3RhdHVzICYgTFNSX0ZJRk9fVVIpIAogCQkJewotCQkJCXNlbGYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CiAJCQkJSVJEQV9ERUJVRygwLCIlcygpLCAqKioqKioqKioqKioqIEZJRk8gRXJyb3JzICoqKioqKioqKioqKiBcbiIsIF9fZnVuY19fICk7CiAJCQl9CQogCQkJaWYgKHN0YXR1cyAmIExTUl9GUkFNRV9FUlJPUikKIAkJCXsKLQkJCQlzZWxmLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwogCQkJCUlSREFfREVCVUcoMCwiJXMoKSwgKioqKioqKioqKioqKiBGUkFNRSBFcnJvcnMgKioqKioqKioqKioqIFxuIiwgX19mdW5jX18gKTsKIAkJCX0KIAkJCQkJCQkKIAkJCWlmIChzdGF0dXMgJiBMU1JfQ1JDX0VSUk9SKSAKIAkJCXsKLQkJCQlzZWxmLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CiAJCQkJSVJEQV9ERUJVRygwLCIlcygpLCAqKioqKioqKioqKioqIENSQyBFcnJvcnMgKioqKioqKioqKioqIFxuIiwgX19mdW5jX18gKTsKIAkJCX0KIAkJCQogCQkJaWYoc2VsZi0+cmN2RnJhbWVzT3ZlcmZsb3cpCiAJCQl7Ci0JCQkJc2VsZi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKIAkJCQlJUkRBX0RFQlVHKDAsIiVzKCksICoqKioqKioqKioqKiogT3ZlcnJhbiBETUEgYnVmZmVyICoqKioqKioqKioqKiBcbiIsIF9fZnVuY19fICk7CiAJCQl9CiAJCQlpZihsZW4gPT0gMCkKIAkJCXsKLQkJCQlzZWxmLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwogCQkJCUlSREFfREVCVUcoMCwiJXMoKSwgKioqKioqKioqKiBSZWNlaXZlIEZyYW1lIFNpemUgPSAwICoqKioqKioqKiBcbiIsIF9fZnVuY19fICk7CiAJCQl9CiAJCX0JIApAQCAtMTkxMCw3ICsxOTA4LDcgQEAKIAkJCQlJUkRBX1dBUk5JTkcoIiVzKCksIG1lbW9yeSBzcXVlZXplLCAiCiAJCQkJCSAgICAgImRyb3BwaW5nIGZyYW1lLlxuIiwKIAkJCQkJICAgICBfX2Z1bmNfXyk7Ci0JCQkJc2VsZi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfZHJvcHBlZCsrOwogCiAJCQkJcmV0dXJuIEZBTFNFOwogCQkJfQpAQCAtMTkyNCw4ICsxOTIyLDggQEAKIAogCQkJLyogTW92ZSB0byBuZXh0IGZyYW1lICovCiAJCQlzZWxmLT5yeF9idWZmLmRhdGEgKz0gbGVuOwotCQkJc2VsZi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOwotCQkJc2VsZi0+c3RhdHMucnhfcGFja2V0cysrOworCQkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CisJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKIAogCQkJc2tiLT5kZXYgPSBzZWxmLT5uZXRkZXY7CiAJCQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwpAQCAtMTk5NCw3ICsxOTkyLDcgQEAKIAlzZWxmLT50eF9idWZmLmxlbiA9IGFzeW5jX3dyYXBfc2tiKHNrYiwgc2VsZi0+dHhfYnVmZi5kYXRhLCAKIAkJCQkJICAgc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSk7CiAJCi0Jc2VsZi0+c3RhdHMudHhfYnl0ZXMgKz0gc2VsZi0+dHhfYnVmZi5sZW47CisJc2VsZi0+bmV0ZGV2LT5zdGF0cy50eF9ieXRlcyArPSBzZWxmLT50eF9idWZmLmxlbjsKIAogCS8qIFR1cm4gb24gdHJhbnNtaXQgZmluaXNoZWQgaW50ZXJydXB0LiBXaWxsIGZpcmUgaW1tZWRpYXRlbHkhICAqLwogCW91dGIoVUFSVF9JRVJfVEhSSSwgaW9iYXNlK1VBUlRfSUVSKTsgCkBAIC0yMTExLDE3ICsyMTA5LDYgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmFsaV9pcmNjX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGYgPSBuZXRkZXZfcHJpdihkZXYpOwotCQotCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19mdW5jX18gKTsKLQkJCi0JSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19mdW5jX18gKTsKLQkKLQlyZXR1cm4gJnNlbGYtPnN0YXRzOwotfQotCiBzdGF0aWMgaW50IGFsaV9pcmNjX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CiAJc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvYWxpLWlyY2MuaCBiL2RyaXZlcnMvbmV0L2lyZGEvYWxpLWlyY2MuaAppbmRleCBlZDM1ZDk5Li4wYzhlZGI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL2FsaS1pcmNjLmgKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9hbGktaXJjYy5oCkBAIC0xOTEsNyArMTkxLDYgQEAKIAlzdHJ1Y3QgdHhfZmlmbyB0eF9maWZvOyAgICAvKiBJbmZvIGFib3V0IGZyYW1lcyB0byBiZSB0cmFuc21pdHRlZCAqLwogCiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsgICAgIC8qIFllcyEgd2UgYXJlIHNvbWUga2luZCBvZiBuZXRkZXZpY2UgKi8KLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKIAkKIAlzdHJ1Y3QgaXJsYXBfY2IgKmlybGFwOyAgICAvKiBUaGUgbGluayBsYXllciB3ZSBhcmUgYmluZGVkIHRvICovCiAJc3RydWN0IHFvc19pbmZvIHFvczsgICAgICAgLyogUW9TIGNhcGFiaWxpdGllcyBmb3IgdGhpcyBkZXZpY2UgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvYXUxMDAwX2lyY2MuaCBiL2RyaXZlcnMvbmV0L2lyZGEvYXUxMDAwX2lyY2MuaAppbmRleCBiNDc2M2YyLi5jMDcyYzA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL2F1MTAwMF9pcmNjLmgKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9hdTEwMDBfaXJjYy5oCkBAIC0xMDcsNyArMTA3LDYgQEAKIAlpb2J1ZmZfdCByeF9idWZmOwogCiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKIAkKIAlzdHJ1Y3QgdGltZXZhbCBzdGFtcDsKIAlzdHJ1Y3QgdGltZXZhbCBub3c7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2F1MWtfaXIuYyBiL2RyaXZlcnMvbmV0L2lyZGEvYXUxa19pci5jCmluZGV4IDZjNGI1M2YuLjc1YTFkMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvYXUxa19pci5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvYXUxa19pci5jCkBAIC01Myw3ICs1Myw2IEBACiBzdGF0aWMgaW50IGF1MWtfaXJkYV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKIHN0YXRpYyB2b2lkIGF1MWtfaXJkYV9pbnRlcnJ1cHQoaW50LCB2b2lkICopOwogc3RhdGljIHZvaWQgYXUxa190eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICopOwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICphdTFrX2lyZGFfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKik7CiBzdGF0aWMgaW50IGF1MWtfaXJkYV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgaWZyZXEgKiwgaW50KTsKIHN0YXRpYyBpbnQgYXUxa19pcmRhX3NldF9zcGVlZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3BlZWQpOwogCkBAIC0yMTMsNyArMjEyLDYgQEAKIAlkZXYtPm9wZW4gPSBhdTFrX2lyZGFfc3RhcnQ7CiAJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBhdTFrX2lyZGFfaGFyZF94bWl0OwogCWRldi0+c3RvcCA9IGF1MWtfaXJkYV9zdG9wOwotCWRldi0+Z2V0X3N0YXRzID0gYXUxa19pcmRhX3N0YXRzOwogCWRldi0+ZG9faW9jdGwgPSBhdTFrX2lyZGFfaW9jdGw7CiAJZGV2LT50eF90aW1lb3V0ID0gYXUxa190eF90aW1lb3V0OwogCkBAIC04MzIsMTMgKzgzMCw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmF1MWtfaXJkYV9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBhdTFrX3ByaXZhdGUgKmF1cCA9IG5ldGRldl9wcml2KGRldik7Ci0JcmV0dXJuICZhdXAtPnN0YXRzOwotfQotCiBNT0RVTEVfQVVUSE9SKCJQZXRlIFBvcG92IDxwcG9wb3ZAbXZpc3RhLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQXUxMDAwIElyREEgRGV2aWNlIERyaXZlciIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2RvbmF1Ym9lLmggYi9kcml2ZXJzL25ldC9pcmRhL2RvbmF1Ym9lLmgKaW5kZXggMWU2NzcyMC4uMGRiZDE5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9kb25hdWJvZS5oCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvZG9uYXVib2UuaApAQCAtMzA4LDcgKzMwOCw2IEBACiBzdHJ1Y3QgdG9zaG9ib2VfY2IKIHsKICAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsgICAgLyogWWVzISB3ZSBhcmUgc29tZSBraW5kIG9mIG5ldGRldmljZSAqLwotICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKICAgc3RydWN0IHR0eV9kcml2ZXIgdHR5ZGV2OwogCiAgIHN0cnVjdCBpcmxhcF9jYiAqaXJsYXA7ICAgICAgIC8qIFRoZSBsaW5rIGxheWVyIHdlIGFyZSBiaW5kZWQgdG8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvaXJkYS11c2IuYyBiL2RyaXZlcnMvbmV0L2lyZGEvaXJkYS11c2IuYwppbmRleCAyMDVlNGU4Li4yOTExOGY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL2lyZGEtdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9pcmRhLXVzYi5jCkBAIC0xMjIsNyArMTIyLDYgQEAKIHN0YXRpYyBpbnQgaXJkYV91c2JfbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIGludCBpcmRhX3VzYl9uZXRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CiBzdGF0aWMgdm9pZCBpcmRhX3VzYl9uZXRfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaXJkYV91c2JfbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKiBUUkFOU01JVCBST1VUSU5FUyAqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgpAQCAtNTI1LDEzICs1MjQsMTMgQEAKIAkvKiBBc2sgVVNCIHRvIHNlbmQgdGhlIHBhY2tldCAtIElycSBkaXNhYmxlZCAtPiBHRlBfQVRPTUlDICovCiAJaWYgKChyZXMgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpKSkgewogCQlJUkRBX1dBUk5JTkcoIiVzKCksIGZhaWxlZCBUeCBVUkJcbiIsIF9fZnVuY19fKTsKLQkJc2VsZi0+c3RhdHMudHhfZXJyb3JzKys7CisJCW5ldGRldi0+c3RhdHMudHhfZXJyb3JzKys7CiAJCS8qIExldCBVU0IgcmVjb3ZlciA6IFdlIHdpbGwgY2F0Y2ggdGhhdCBpbiB0aGUgd2F0Y2hkb2cgKi8KIAkJLypuZXRpZl9zdGFydF9xdWV1ZShuZXRkZXYpOyovCiAJfSBlbHNlIHsKIAkJLyogSW5jcmVtZW50IHBhY2tldCBzdGF0cyAqLwotCQlzZWxmLT5zdGF0cy50eF9wYWNrZXRzKys7Ci0gICAgICAgICAgICAgICAgc2VsZi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCW5ldGRldi0+c3RhdHMudHhfcGFja2V0cysrOworICAgICAgICAgICAgICAgIG5ldGRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CiAJCQogCQluZXRkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKIAl9CkBAIC02NzcsNyArNjc2LDcgQEAKIAkJSVJEQV9ERUJVRygwLCAiJXM6IFR4IHRpbWVkIG91dCwgdXJiLT5zdGF0dXM9JWQsIHVyYi0+dHJhbnNmZXJfZmxhZ3M9MHglMDRYXG4iLCBuZXRkZXYtPm5hbWUsIHVyYi0+c3RhdHVzLCB1cmItPnRyYW5zZmVyX2ZsYWdzKTsKIAogCQkvKiBJbmNyZWFzZSBlcnJvciBjb3VudCAqLwotCQlzZWxmLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJbmV0ZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKIAogI2lmZGVmIElVX0JVR19LSUNLX1RJTUVPVVQKIAkJLyogQ2FuJ3QgYmUgYSBiYWQgaWRlYSB0byByZXNldCB0aGUgc3BlZWQgOy0pIC0gSmVhbiBJSSAqLwpAQCAtODI2LDcgKzgyNSw3IEBACiAJaWYgKHVyYi0+c3RhdHVzICE9IDApIHsKIAkJc3dpdGNoICh1cmItPnN0YXR1cykgewogCQljYXNlIC1FSUxTRVE6Ci0JCQlzZWxmLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CQorCQkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CiAJCQkvKiBBbHNvIHByZWN1cnNvciB0byBhIGhvdC11bnBsdWcgb24gVUhDSS4gKi8KIAkJCS8qIEZhbGx0aHJvdWdoLi4uICovCiAJCWNhc2UgLUVDT05OUkVTRVQ6CkBAIC04MzksNyArODM4LDcgQEAKIAkJY2FzZSAtRVRJTUU6CiAJCQkvKiBVc3VhbGx5IHByZWN1cnNvciB0byBhIGhvdC11bnBsdWcgb24gT0hDSS4gKi8KIAkJZGVmYXVsdDoKLQkJCXNlbGYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJCUlSREFfREVCVUcoMCwgIiVzKCksIFJYIHN0YXR1cyAlZCwgdHJhbnNmZXJfZmxhZ3MgMHglMDRYIFxuIiwgX19mdW5jX18sIHVyYi0+c3RhdHVzLCB1cmItPnRyYW5zZmVyX2ZsYWdzKTsKIAkJCWJyZWFrOwogCQl9CkBAIC04OTAsNyArODg5LDcgQEAKIAkJCQkgICAgICAgSVJEQV9TS0JfTUFYX01UVSk7CiAKIAlpZiAoIW5ld3NrYikgIHsKLQkJc2VsZi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJLyogV2UgY291bGQgZGVsaXZlciB0aGUgY3VycmVudCBza2IsIGJ1dCB0aGlzIHdvdWxkIHN0YWxsCiAJCSAqIHRoZSBSeCBwYXRoLiBCZXR0ZXIgZHJvcCB0aGUgcGFja2V0Li4uIEplYW4gSUkgKi8KIAkJZ290byBkb25lOyAgCkBAIC05MjcsOCArOTI2LDggQEAKIAluZXRpZl9yeChkYXRhc2tiKTsKIAogCS8qIEtlZXAgc3RhdHMgdXAgdG8gZGF0ZSAqLwotCXNlbGYtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKLQlzZWxmLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CisJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CiAKIGRvbmU6CiAJLyogTm90ZSA6IGF0IHRoaXMgcG9pbnQsIHRoZSBVUkIgd2UndmUganVzdCByZWNlaXZlZCAodXJiKQpAQCAtMTM0MiwxNCArMTM0MSw2IEBACiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qCi0gKiBHZXQgZGV2aWNlIHN0YXRzIChmb3IgL3Byb2MvbmV0L2RldiBhbmQgaWZjb25maWcpCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaXJkYV91c2JfbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBpcmRhX3VzYl9jYiAqc2VsZiA9IG5ldGRldl9wcml2KGRldik7Ci0JcmV0dXJuICZzZWxmLT5zdGF0czsKLX0KIAogLyoqKioqKioqKioqKioqKioqKioqKiBJUkRBIENPTkZJRyBTVUJST1VUSU5FUyAqKioqKioqKioqKioqKioqKioqKiovCiAvKgpAQCAtMTQyOCw3ICsxNDE5LDYgQEAKIAluZXRkZXYtPndhdGNoZG9nX3RpbWVvICA9IDI1MCpIWi8xMDAwOwkvKiAyNTAgbXMgPiBVU0IgdGltZW91dCAqLwogCW5ldGRldi0+b3BlbiAgICAgICAgICAgID0gaXJkYV91c2JfbmV0X29wZW47CiAJbmV0ZGV2LT5zdG9wICAgICAgICAgICAgPSBpcmRhX3VzYl9uZXRfY2xvc2U7Ci0JbmV0ZGV2LT5nZXRfc3RhdHMJPSBpcmRhX3VzYl9uZXRfZ2V0X3N0YXRzOwogCW5ldGRldi0+ZG9faW9jdGwgICAgICAgID0gaXJkYV91c2JfbmV0X2lvY3RsOwogCiAJcmV0dXJuIHJlZ2lzdGVyX25ldGRldihuZXRkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9pcmRhLXVzYi5oIGIvZHJpdmVycy9uZXQvaXJkYS9pcmRhLXVzYi5oCmluZGV4IGEwY2E5YzEuLmFjMDQ0M2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvaXJkYS11c2IuaAorKysgYi9kcml2ZXJzL25ldC9pcmRhL2lyZGEtdXNiLmgKQEAgLTE1Miw3ICsxNTIsNiBAQAogCXN0cnVjdCB1cmIgKnNwZWVkX3VyYjsJCS8qIFVSQiB1c2VkIHRvIHNlbmQgc3BlZWQgY29tbWFuZHMgKi8KIAkKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwkvKiBZZXMhIHdlIGFyZSBzb21lIGtpbmQgb2YgbmV0ZGV2LiAqLwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwogCXN0cnVjdCBpcmxhcF9jYiAgICppcmxhcDsJLyogVGhlIGxpbmsgbGF5ZXIgd2UgYXJlIGJpbmRlZCB0byAqLwogCXN0cnVjdCBxb3NfaW5mbyBxb3M7CiAJY2hhciAqc3BlZWRfYnVmZjsJCS8qIEJ1ZmZlciBmb3Igc3BlZWQgY2hhbmdlcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9raW5nc3VuLXNpci5jIGIvZHJpdmVycy9uZXQvaXJkYS9raW5nc3VuLXNpci5jCmluZGV4IGM3NDdjODcuLmI0YTYxNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEva2luZ3N1bi1zaXIuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL2tpbmdzdW4tc2lyLmMKQEAgLTEwNSw3ICsxMDUsNyBAQAogCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXY7ICAgICAgLyogaW5pdDogcHJvYmVfaXJkYSAqLwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7ICAgICAgLyogbmV0d29yayBsYXllciAqLwogCXN0cnVjdCBpcmxhcF9jYiAgICppcmxhcDsgICAgICAgLyogVGhlIGxpbmsgbGF5ZXIgd2UgYXJlIGJpbmRlZCB0byAqLwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwkvKiBuZXR3b3JrIHN0YXRpc3RpY3MgKi8KKwogCXN0cnVjdCBxb3NfaW5mbyAgIHFvczsKIAogCV9fdTgJCSAgKmluX2J1ZjsJLyogcmVjZWl2ZSBidWZmZXIgKi8KQEAgLTE4NiwxMiArMTg2LDEyIEBACiAJCWNhc2UgLUVQSVBFOgogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlraW5nc3VuLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCW5ldGRldi0+c3RhdHMudHhfZXJyb3JzKys7CiAJCQluZXRpZl9zdGFydF9xdWV1ZShuZXRkZXYpOwogCQl9CiAJfSBlbHNlIHsKLQkJa2luZ3N1bi0+c3RhdHMudHhfcGFja2V0cysrOwotCQlraW5nc3VuLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJbmV0ZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJCW5ldGRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CiAJfQogCiAJZGV2X2tmcmVlX3NrYihza2IpOwpAQCAtMjMyLDcgKzIzMiw3IEBACiAJCWlmIChieXRlc1swXSA+PSAxICYmIGJ5dGVzWzBdIDwga2luZ3N1bi0+bWF4X3J4KSB7CiAJCQlmb3IgKGkgPSAxOyBpIDw9IGJ5dGVzWzBdOyBpKyspIHsKIAkJCQlhc3luY191bndyYXBfY2hhcihraW5nc3VuLT5uZXRkZXYsCi0JCQkJCQkgICZraW5nc3VuLT5zdGF0cywKKwkJCQkJCSAgJmtpbmdzdW4tPm5ldGRldi0+c3RhdHMsCiAJCQkJCQkgICZraW5nc3VuLT5yeF9idWZmLCBieXRlc1tpXSk7CiAJCQl9CiAJCQlkb19nZXR0aW1lb2ZkYXkoJmtpbmdzdW4tPnJ4X3RpbWUpOwpAQCAtNDE4LDE1ICs0MTgsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qCi0gKiBHZXQgZGV2aWNlIHN0YXRzIChmb3IgL3Byb2MvbmV0L2RldiBhbmQgaWZjb25maWcpCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqCi1raW5nc3VuX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKLXsKLQlzdHJ1Y3Qga2luZ3N1bl9jYiAqa2luZ3N1biA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JcmV0dXJuICZraW5nc3VuLT5zdGF0czsKLX0KIAogLyoKICAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIFVTQiBzdWJzeXN0ZW0gZm9yIGVhY2ggbmV3IGRldmljZQpAQCAtNTMyLDcgKzUyMyw2IEBACiAJbmV0LT5oYXJkX3N0YXJ0X3htaXQgPSBraW5nc3VuX2hhcmRfeG1pdDsKIAluZXQtPm9wZW4gICAgICAgICAgICA9IGtpbmdzdW5fbmV0X29wZW47CiAJbmV0LT5zdG9wICAgICAgICAgICAgPSBraW5nc3VuX25ldF9jbG9zZTsKLQluZXQtPmdldF9zdGF0cwkgICAgID0ga2luZ3N1bl9uZXRfZ2V0X3N0YXRzOwogCW5ldC0+ZG9faW9jdGwgICAgICAgID0ga2luZ3N1bl9uZXRfaW9jdGw7CiAKIAlyZXQgPSByZWdpc3Rlcl9uZXRkZXYobmV0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEva3M5NTktc2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL2tzOTU5LXNpci5jCmluZGV4IDYwMGQ5NmYuLjU1MzIyZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEva3M5NTktc2lyLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9rczk1OS1zaXIuYwpAQCAtMTc0LDcgKzE3NCw3IEBACiAJc3RydWN0IHVzYl9kZXZpY2UgKnVzYmRldjsJLyogaW5pdDogcHJvYmVfaXJkYSAqLwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CS8qIG5ldHdvcmsgbGF5ZXIgKi8KIAlzdHJ1Y3QgaXJsYXBfY2IgKmlybGFwOwkvKiBUaGUgbGluayBsYXllciB3ZSBhcmUgYmluZGVkIHRvICovCi0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CS8qIG5ldHdvcmsgc3RhdGlzdGljcyAqLworCiAJc3RydWN0IHFvc19pbmZvIHFvczsKIAogCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKnR4X3NldHVwcmVxdWVzdDsKQEAgLTM2Niw3ICszNjYsNyBAQAogCQkJCWNhc2UgLUVQSVBFOgogCQkJCQlicmVhazsKIAkJCQlkZWZhdWx0OgotCQkJCQlraW5nc3VuLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCQkJbmV0ZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKIAkJCQkJbmV0aWZfc3RhcnRfcXVldWUobmV0ZGV2KTsKIAkJCQl9CiAJCQl9CkBAIC00MTYsMTIgKzQxNiwxMiBAQAogCQljYXNlIC1FUElQRToKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJa2luZ3N1bi0+c3RhdHMudHhfZXJyb3JzKys7CisJCQluZXRkZXYtPnN0YXRzLnR4X2Vycm9ycysrOwogCQkJbmV0aWZfc3RhcnRfcXVldWUobmV0ZGV2KTsKIAkJfQogCX0gZWxzZSB7Ci0JCWtpbmdzdW4tPnN0YXRzLnR4X3BhY2tldHMrKzsKLQkJa2luZ3N1bi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCW5ldGRldi0+c3RhdHMudHhfcGFja2V0cysrOworCQluZXRkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOwogCiAJfQogCkBAIC00NjksNyArNDY5LDcgQEAKIAkJCSAqLwogCQkJaWYgKGtpbmdzdW4tPnJ4X3ZhcmlhYmxlX3hvcm1hc2sgIT0gMCkgewogCQkJCWFzeW5jX3Vud3JhcF9jaGFyKGtpbmdzdW4tPm5ldGRldiwKLQkJCQkJCSAgJmtpbmdzdW4tPnN0YXRzLAorCQkJCQkJICAma2luZ3N1bi0+bmV0ZGV2LT5zdGF0cywKIAkJCQkJCSAgJmtpbmdzdW4tPnJ4X3Vud3JhcF9idWZmLAogCQkJCQkJICBieXRlc1tpXSk7CiAJCQl9CkBAIC02NjksMTUgKzY2OSw2IEBACiB9CiAKIC8qCi0gKiBHZXQgZGV2aWNlIHN0YXRzIChmb3IgL3Byb2MvbmV0L2RldiBhbmQgaWZjb25maWcpCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqa3M5NTlfbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQotewotCXN0cnVjdCBrczk1OV9jYiAqa2luZ3N1biA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JcmV0dXJuICZraW5nc3VuLT5zdGF0czsKLX0KLQotLyoKICAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIFVTQiBzdWJzeXN0ZW0gZm9yIGVhY2ggbmV3IGRldmljZQogICogaW4gdGhlIHN5c3RlbS4gV2UgbmVlZCB0byBjaGVjayBpZiB0aGUgZGV2aWNlIGlzIG91cnMsIGFuZCBpbgogICogdGhpcyBjYXNlIHN0YXJ0IGhhbmRsaW5nIGl0LgpAQCAtNzkyLDcgKzc4Myw2IEBACiAJbmV0LT5oYXJkX3N0YXJ0X3htaXQgPSBrczk1OV9oYXJkX3htaXQ7CiAJbmV0LT5vcGVuID0ga3M5NTlfbmV0X29wZW47CiAJbmV0LT5zdG9wID0ga3M5NTlfbmV0X2Nsb3NlOwotCW5ldC0+Z2V0X3N0YXRzID0ga3M5NTlfbmV0X2dldF9zdGF0czsKIAluZXQtPmRvX2lvY3RsID0ga3M5NTlfbmV0X2lvY3RsOwogCiAJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2tzZGF6emxlLXNpci5jIGIvZHJpdmVycy9uZXQvaXJkYS9rc2RhenpsZS1zaXIuYwppbmRleCAwZTdmODkzLi41YjMyN2IwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL2tzZGF6emxlLXNpci5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEva3NkYXp6bGUtc2lyLmMKQEAgLTE0MCw3ICsxNDAsNyBAQAogCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXY7CS8qIGluaXQ6IHByb2JlX2lyZGEgKi8KIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwkvKiBuZXR3b3JrIGxheWVyICovCiAJc3RydWN0IGlybGFwX2NiICppcmxhcDsJLyogVGhlIGxpbmsgbGF5ZXIgd2UgYXJlIGJpbmRlZCB0byAqLwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwkvKiBuZXR3b3JrIHN0YXRpc3RpY3MgKi8KKwogCXN0cnVjdCBxb3NfaW5mbyBxb3M7CiAKIAlzdHJ1Y3QgdXJiICp0eF91cmI7CkBAIC0yNzgsNyArMjc4LDcgQEAKIAkJCQljYXNlIC1FUElQRToKIAkJCQkJYnJlYWs7CiAJCQkJZGVmYXVsdDoKLQkJCQkJa2luZ3N1bi0+c3RhdHMudHhfZXJyb3JzKys7CisJCQkJCW5ldGRldi0+c3RhdHMudHhfZXJyb3JzKys7CiAJCQkJCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldGRldik7CiAJCQkJfQogCQkJfQpAQCAtMzI5LDEyICszMjksMTIgQEAKIAkJY2FzZSAtRVBJUEU6CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCWtpbmdzdW4tPnN0YXRzLnR4X2Vycm9ycysrOworCQkJbmV0ZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKIAkJCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldGRldik7CiAJCX0KIAl9IGVsc2UgewotCQlraW5nc3VuLT5zdGF0cy50eF9wYWNrZXRzKys7Ci0JCWtpbmdzdW4tPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCQluZXRkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJbmV0ZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKIAogCX0KIApAQCAtMzQ4LDkgKzM0OCwxMCBAQAogc3RhdGljIHZvaWQga3NkYXp6bGVfcmN2X2lycShzdHJ1Y3QgdXJiICp1cmIpCiB7CiAJc3RydWN0IGtzZGF6emxlX2NiICpraW5nc3VuID0gdXJiLT5jb250ZXh0OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBraW5nc3VuLT5uZXRkZXY7CiAKIAkvKiBpbiBwcm9jZXNzIG9mIHN0b3BwaW5nLCBqdXN0IGRyb3AgZGF0YSAqLwotCWlmICghbmV0aWZfcnVubmluZyhraW5nc3VuLT5uZXRkZXYpKSB7CisJaWYgKCFuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKIAkJa2luZ3N1bi0+cmVjZWl2aW5nID0gMDsKIAkJcmV0dXJuOwogCX0KQEAgLTM2OCw3ICszNjksNyBAQAogCQl1bnNpZ25lZCBpbnQgaTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgdXJiLT5hY3R1YWxfbGVuZ3RoOyBpKyspIHsKLQkJCWFzeW5jX3Vud3JhcF9jaGFyKGtpbmdzdW4tPm5ldGRldiwgJmtpbmdzdW4tPnN0YXRzLAorCQkJYXN5bmNfdW53cmFwX2NoYXIobmV0ZGV2LCAmbmV0ZGV2LT5zdGF0cywKIAkJCQkJICAma2luZ3N1bi0+cnhfdW53cmFwX2J1ZmYsIGJ5dGVzW2ldKTsKIAkJfQogCQlraW5nc3VuLT5yZWNlaXZpbmcgPQpAQCAtNTYyLDE2ICs1NjMsNiBAQAogfQogCiAvKgotICogR2V0IGRldmljZSBzdGF0cyAoZm9yIC9wcm9jL25ldC9kZXYgYW5kIGlmY29uZmlnKQotICovCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmtzZGF6emxlX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UKLQkJCQkJCSAgICAgICAqbmV0ZGV2KQotewotCXN0cnVjdCBrc2RhenpsZV9jYiAqa2luZ3N1biA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JcmV0dXJuICZraW5nc3VuLT5zdGF0czsKLX0KLQotLyoKICAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIFVTQiBzdWJzeXN0ZW0gZm9yIGVhY2ggbmV3IGRldmljZQogICogaW4gdGhlIHN5c3RlbS4gV2UgbmVlZCB0byBjaGVjayBpZiB0aGUgZGV2aWNlIGlzIG91cnMsIGFuZCBpbgogICogdGhpcyBjYXNlIHN0YXJ0IGhhbmRsaW5nIGl0LgpAQCAtNjk2LDcgKzY4Nyw2IEBACiAJbmV0LT5oYXJkX3N0YXJ0X3htaXQgPSBrc2RhenpsZV9oYXJkX3htaXQ7CiAJbmV0LT5vcGVuID0ga3NkYXp6bGVfbmV0X29wZW47CiAJbmV0LT5zdG9wID0ga3NkYXp6bGVfbmV0X2Nsb3NlOwotCW5ldC0+Z2V0X3N0YXRzID0ga3NkYXp6bGVfbmV0X2dldF9zdGF0czsKIAluZXQtPmRvX2lvY3RsID0ga3NkYXp6bGVfbmV0X2lvY3RsOwogCiAJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL21jczc3ODAuYyBiL2RyaXZlcnMvbmV0L2lyZGEvbWNzNzc4MC5jCmluZGV4IDkwNGM5NjEuLjdlYWZkY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvbWNzNzc4MC5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvbWNzNzc4MC5jCkBAIC00MDMsOCArNDAzLDggQEAKIAlpZih1bmxpa2VseShuZXdfbGVuIDw9IDApKSB7CiAJCUlSREFfRVJST1IoIiVzIHNob3J0IGZyYW1lIGxlbmd0aCAlZFxuIiwKIAkJCSAgICAgbWNzLT5uZXRkZXYtPm5hbWUsIG5ld19sZW4pOwotCQkrK21jcy0+c3RhdHMucnhfZXJyb3JzOwotCQkrK21jcy0+c3RhdHMucnhfbGVuZ3RoX2Vycm9yczsKKwkJKyttY3MtPm5ldGRldi0+c3RhdHMucnhfZXJyb3JzOworCQkrK21jcy0+bmV0ZGV2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzOwogCQlyZXR1cm47CiAJfQogCWZjcyA9IDA7CkBAIC00MTMsMTQgKzQxMywxNCBAQAogCWlmKGZjcyAhPSBHT09EX0ZDUykgewogCQlJUkRBX0VSUk9SKCJjcmMgZXJyb3IgY2FsYyAweCV4IGxlbiAlZFxuIiwKIAkJCSAgIGZjcywgbmV3X2xlbik7Ci0JCW1jcy0+c3RhdHMucnhfZXJyb3JzKys7Ci0JCW1jcy0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQltY3MtPm5ldGRldi0+c3RhdHMucnhfZXJyb3JzKys7CisJCW1jcy0+bmV0ZGV2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CiAJCXJldHVybjsKIAl9CiAKIAlza2IgPSBkZXZfYWxsb2Nfc2tiKG5ld19sZW4gKyAxKTsKIAlpZih1bmxpa2VseSghc2tiKSkgewotCQkrK21jcy0+c3RhdHMucnhfZHJvcHBlZDsKKwkJKyttY3MtPm5ldGRldi0+c3RhdHMucnhfZHJvcHBlZDsKIAkJcmV0dXJuOwogCX0KIApAQCAtNDMzLDggKzQzMyw4IEBACiAKIAluZXRpZl9yeChza2IpOwogCi0JbWNzLT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0JbWNzLT5zdGF0cy5yeF9ieXRlcyArPSBuZXdfbGVuOworCW1jcy0+bmV0ZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJbWNzLT5uZXRkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IG5ld19sZW47CiAKIAlyZXR1cm47CiB9CkBAIC00NTgsMjIgKzQ1OCwyMiBAQAogCWlmKHVubGlrZWx5KG5ld19sZW4gPD0gMCkpIHsKIAkJSVJEQV9FUlJPUigiJXMgc2hvcnQgZnJhbWUgbGVuZ3RoICVkXG4iLAogCQkJICAgbWNzLT5uZXRkZXYtPm5hbWUsIG5ld19sZW4pOwotCQkrK21jcy0+c3RhdHMucnhfZXJyb3JzOwotCQkrK21jcy0+c3RhdHMucnhfbGVuZ3RoX2Vycm9yczsKKwkJKyttY3MtPm5ldGRldi0+c3RhdHMucnhfZXJyb3JzOworCQkrK21jcy0+bmV0ZGV2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzOwogCQlyZXR1cm47CiAJfQogCiAJZmNzID0gfihjcmMzMl9sZSh+MCwgYnVmLCBuZXdfbGVuKSk7CiAJaWYoZmNzICE9IGdldF91bmFsaWduZWRfbGUzMihidWYgKyBuZXdfbGVuKSkgewogCQlJUkRBX0VSUk9SKCJjcmMgZXJyb3IgY2FsYyAweCV4IGxlbiAlZFxuIiwgZmNzLCBuZXdfbGVuKTsKLQkJbWNzLT5zdGF0cy5yeF9lcnJvcnMrKzsKLQkJbWNzLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCW1jcy0+bmV0ZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJbWNzLT5uZXRkZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKIAkJcmV0dXJuOwogCX0KIAogCXNrYiA9IGRldl9hbGxvY19za2IobmV3X2xlbiArIDEpOwogCWlmKHVubGlrZWx5KCFza2IpKSB7Ci0JCSsrbWNzLT5zdGF0cy5yeF9kcm9wcGVkOworCQkrK21jcy0+bmV0ZGV2LT5zdGF0cy5yeF9kcm9wcGVkOwogCQlyZXR1cm47CiAJfQogCkBAIC00ODYsOCArNDg2LDggQEAKIAogCW5ldGlmX3J4KHNrYik7CiAKLQltY3MtPnN0YXRzLnJ4X3BhY2tldHMrKzsKLQltY3MtPnN0YXRzLnJ4X2J5dGVzICs9IG5ld19sZW47CisJbWNzLT5uZXRkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwltY3MtPm5ldGRldi0+c3RhdHMucnhfYnl0ZXMgKz0gbmV3X2xlbjsKIAogCXJldHVybjsKIH0KQEAgLTc1NiwxNCArNzU2LDYgQEAKIAkJcmV0dXJuIHJldDsKIH0KIAotCi0vKiBHZXQgZGV2aWNlIHN0YXRzIGZvciAvcHJvYy9uZXQvZGV2IGFuZCBpZmNvbmZpZyAqLwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICptY3NfbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQotewotCXN0cnVjdCBtY3NfY2IgKm1jcyA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JcmV0dXJuICZtY3MtPnN0YXRzOwotfQotCiAvKiBSZWNlaXZlIGNhbGxiYWNrIGZ1bmN0aW9uLiAgKi8KIHN0YXRpYyB2b2lkIG1jc19yZWNlaXZlX2lycShzdHJ1Y3QgdXJiICp1cmIpCiB7CkBAIC03ODYsMTQgKzc3OCwxNCBAQAogCQkgKi8KIAkJLyogU0lSIHNwZWVkICovCiAJCWlmKG1jcy0+c3BlZWQgPCA1NzYwMDApIHsKLQkJCWFzeW5jX3Vud3JhcF9jaGFyKG1jcy0+bmV0ZGV2LCAmbWNzLT5zdGF0cywKKwkJCWFzeW5jX3Vud3JhcF9jaGFyKG1jcy0+bmV0ZGV2LCAmbWNzLT5uZXRkZXYtPnN0YXRzLAogCQkJCSAgJm1jcy0+cnhfYnVmZiwgMHhjMCk7CiAKIAkJCWZvciAoaSA9IDA7IGkgPCB1cmItPmFjdHVhbF9sZW5ndGg7IGkrKykKLQkJCQlhc3luY191bndyYXBfY2hhcihtY3MtPm5ldGRldiwgJm1jcy0+c3RhdHMsCisJCQkJYXN5bmNfdW53cmFwX2NoYXIobWNzLT5uZXRkZXYsICZtY3MtPm5ldGRldi0+c3RhdHMsCiAJCQkJCSAgJm1jcy0+cnhfYnVmZiwgYnl0ZXNbaV0pOwogCi0JCQlhc3luY191bndyYXBfY2hhcihtY3MtPm5ldGRldiwgJm1jcy0+c3RhdHMsCisJCQlhc3luY191bndyYXBfY2hhcihtY3MtPm5ldGRldiwgJm1jcy0+bmV0ZGV2LT5zdGF0cywKIAkJCQkgICZtY3MtPnJ4X2J1ZmYsIDB4YzEpOwogCQl9CiAJCS8qIE1JUiBzcGVlZCAqLwpAQCAtODY4LDEyICs4NjAsMTIgQEAKIAkJY2FzZSAtRVBJUEU6CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCW1jcy0+c3RhdHMudHhfZXJyb3JzKys7CisJCQltY3MtPm5ldGRldi0+c3RhdHMudHhfZXJyb3JzKys7CiAJCQluZXRpZl9zdGFydF9xdWV1ZShuZGV2KTsKIAkJfQogCX0gZWxzZSB7Ci0JCW1jcy0+c3RhdHMudHhfcGFja2V0cysrOwotCQltY3MtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCQltY3MtPm5ldGRldi0+c3RhdHMudHhfcGFja2V0cysrOworCQltY3MtPm5ldGRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CiAJfQogCiAJZGV2X2tmcmVlX3NrYihza2IpOwpAQCAtOTMxLDcgKzkyMyw2IEBACiAJbmRldi0+aGFyZF9zdGFydF94bWl0ID0gbWNzX2hhcmRfeG1pdDsKIAluZGV2LT5vcGVuID0gbWNzX25ldF9vcGVuOwogCW5kZXYtPnN0b3AgPSBtY3NfbmV0X2Nsb3NlOwotCW5kZXYtPmdldF9zdGF0cyA9IG1jc19uZXRfZ2V0X3N0YXRzOwogCW5kZXYtPmRvX2lvY3RsID0gbWNzX25ldF9pb2N0bDsKIAogCWlmICghaW50Zi0+Y3VyX2FsdHNldHRpbmcpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL21jczc3ODAuaCBiL2RyaXZlcnMvbmV0L2lyZGEvbWNzNzc4MC5oCmluZGV4IGIxODE0OGMuLjZiZGM2MjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvbWNzNzc4MC5oCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvbWNzNzc4MC5oCkBAIC0xMDQsNyArMTA0LDYgQEAKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiZGV2OwkvKiBpbml0OiBwcm9iZV9pcmRhICovCiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsJLyogbmV0d29yayBsYXllciAqLwogCXN0cnVjdCBpcmxhcF9jYiAqaXJsYXA7CS8qIFRoZSBsaW5rIGxheWVyIHdlIGFyZSBiaW5kZWQgdG8gKi8KLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsJLyogbmV0d29yayBzdGF0aXN0aWNzICovCiAJc3RydWN0IHFvc19pbmZvIHFvczsKIAl1bnNpZ25lZCBpbnQgc3BlZWQ7CS8qIEN1cnJlbnQgc3BlZWQgKi8KIAl1bnNpZ25lZCBpbnQgbmV3X3NwZWVkOwkvKiBuZXcgc3BlZWQgKi8KQEAgLTE1NCw3ICsxNTMsNiBAQAogc3RhdGljIGludCBtY3NfbmV0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOwogc3RhdGljIGludCBtY3NfbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOwogc3RhdGljIGludCBtY3NfbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7Ci1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm1jc19uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOwogCiBzdGF0aWMgdm9pZCBtY3NfcmVjZWl2ZV9pcnEoc3RydWN0IHVyYiAqdXJiKTsKIHN0YXRpYyB2b2lkIG1jc19zZW5kX2lycShzdHJ1Y3QgdXJiICp1cmIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9uc2MtaXJjYy5jIGIvZHJpdmVycy9uZXQvaXJkYS9uc2MtaXJjYy5jCmluZGV4IDJjNmJmMmQuLjYxZTUwOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvbnNjLWlyY2MuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL25zYy1pcmNjLmMKQEAgLTE4NSw3ICsxODUsNiBAQAogc3RhdGljIGludCAgbnNjX2lyY2NfbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgaW50ICBuc2NfaXJjY19uZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgaW50ICBuc2NfaXJjY19uZXRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7Ci1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5zY19pcmNjX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKIC8qIEdsb2JhbHMgKi8KIHN0YXRpYyBpbnQgcG5wX3JlZ2lzdGVyZWQ7CkBAIC00NDYsNyArNDQ1LDYgQEAKIAlkZXYtPm9wZW4gICAgICAgICAgICA9IG5zY19pcmNjX25ldF9vcGVuOwogCWRldi0+c3RvcCAgICAgICAgICAgID0gbnNjX2lyY2NfbmV0X2Nsb3NlOwogCWRldi0+ZG9faW9jdGwgICAgICAgID0gbnNjX2lyY2NfbmV0X2lvY3RsOwotCWRldi0+Z2V0X3N0YXRzCSAgICAgPSBuc2NfaXJjY19uZXRfZ2V0X3N0YXRzOwogCiAJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CiAJaWYgKGVycikgewpAQCAtMTQwMSw3ICsxMzk5LDcgQEAKIAlzZWxmLT50eF9idWZmLmxlbiA9IGFzeW5jX3dyYXBfc2tiKHNrYiwgc2VsZi0+dHhfYnVmZi5kYXRhLCAKIAkJCQkJICAgc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSk7CiAKLQlzZWxmLT5zdGF0cy50eF9ieXRlcyArPSBzZWxmLT50eF9idWZmLmxlbjsKKwlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNlbGYtPnR4X2J1ZmYubGVuOwogCQogCS8qIEFkZCBpbnRlcnJ1cHQgb24gdHggbG93IGxldmVsICh3aWxsIGZpcmUgaW1tZWRpYXRlbHkpICovCiAJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7CkBAIC0xNDczLDcgKzE0NzEsNyBAQAogCXNlbGYtPnR4X2ZpZm8ucXVldWVbc2VsZi0+dHhfZmlmby5mcmVlXS5sZW4gPSBza2ItPmxlbjsKIAlzZWxmLT50eF9maWZvLnRhaWwgKz0gc2tiLT5sZW47CiAKLQlzZWxmLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOwogCiAJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHNlbGYtPnR4X2ZpZm8ucXVldWVbc2VsZi0+dHhfZmlmby5mcmVlXS5zdGFydCwKIAkJICAgICAgc2tiLT5sZW4pOwpAQCAtMTY1MiwxMyArMTY1MCwxMyBAQAogCQogCS8qIENoZWNrIGZvciB1bmRlcnJydW4hICovCiAJaWYgKGluYihpb2Jhc2UrQVNDUikgJiBBU0NSX1RYVVIpIHsKLQkJc2VsZi0+c3RhdHMudHhfZXJyb3JzKys7Ci0JCXNlbGYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCXNlbGYtPm5ldGRldi0+c3RhdHMudHhfZXJyb3JzKys7CisJCXNlbGYtPm5ldGRldi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKIAkJCiAJCS8qIENsZWFyIGJpdCwgYnkgd3JpdGluZyAxIGludG8gaXQgKi8KIAkJb3V0YihBU0NSX1RYVVIsIGlvYmFzZStBU0NSKTsKIAl9IGVsc2UgewotCQlzZWxmLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCXNlbGYtPm5ldGRldi0+c3RhdHMudHhfcGFja2V0cysrOwogCX0KIAogCS8qIEZpbmlzaGVkIHdpdGggdGhpcyBmcmFtZSwgc28gcHJlcGFyZSBmb3IgbmV4dCAqLwpAQCAtMTc5MywyOCArMTc5MSwyOCBAQAogCQlpZiAoc3RhdHVzICYgRlJNX1NUX0VSUl9NU0spIHsKIAkJCWlmIChzdGF0dXMgJiBGUk1fU1RfTE9TVF9GUikgewogCQkJCS8qIEFkZCBudW1iZXIgb2YgbG9zdCBmcmFtZXMgdG8gc3RhdHMgKi8KLQkJCQlzZWxmLT5zdGF0cy5yeF9lcnJvcnMgKz0gbGVuOwkKKwkJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2Vycm9ycyArPSBsZW47CiAJCQl9IGVsc2UgewogCQkJCS8qIFNraXAgZnJhbWUgKi8KLQkJCQlzZWxmLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOwogCQkJCQogCQkJCXNlbGYtPnJ4X2J1ZmYuZGF0YSArPSBsZW47CiAJCQkKIAkJCQlpZiAoc3RhdHVzICYgRlJNX1NUX01BWF9MRU4pCi0JCQkJCXNlbGYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCQkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CiAJCQkJCiAJCQkJaWYgKHN0YXR1cyAmIEZSTV9TVF9QSFlfRVJSKSAKLQkJCQkJc2VsZi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQkJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CiAJCQkJCiAJCQkJaWYgKHN0YXR1cyAmIEZSTV9TVF9CQURfQ1JDKSAKLQkJCQkJc2VsZi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKIAkJCX0KIAkJCS8qIFRoZSBlcnJvcnMgYmVsb3cgY2FuIGJlIHJlcG9ydGVkIGluIGJvdGggY2FzZXMgKi8KIAkJCWlmIChzdGF0dXMgJiBGUk1fU1RfT1ZSMSkKLQkJCQlzZWxmLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOwkJICAgICAgIAorCQkJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKIAkJCQogCQkJaWYgKHN0YXR1cyAmIEZSTV9TVF9PVlIyKQotCQkJCXNlbGYtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCQkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOwogCQl9IGVsc2UgewogCQkJLyogIAogCQkJICogRmlyc3Qgd2UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGUgZnJhbWUgd2UKQEAgLTE4NjMsNyArMTg2MSw3IEBACiAJCQkJSVJEQV9XQVJOSU5HKCIlcygpLCBtZW1vcnkgc3F1ZWV6ZSwgIgogCQkJCQkgICAgICJkcm9wcGluZyBmcmFtZS5cbiIsCiAJCQkJCSAgICAgX19mdW5jX18pOwotCQkJCXNlbGYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAogCQkJCS8qIFJlc3RvcmUgYmFuayByZWdpc3RlciAqLwogCQkJCW91dGIoYmFuaywgaW9iYXNlK0JTUik7CkBAIC0xODg5LDggKzE4ODcsOCBAQAogCiAJCQkvKiBNb3ZlIHRvIG5leHQgZnJhbWUgKi8KIAkJCXNlbGYtPnJ4X2J1ZmYuZGF0YSArPSBsZW47Ci0JCQlzZWxmLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47Ci0JCQlzZWxmLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKwkJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfcGFja2V0cysrOwogCiAJCQlza2ItPmRldiA9IHNlbGYtPm5ldGRldjsKIAkJCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CkBAIC0xOTIwLDggKzE5MTgsOCBAQAogCS8qICBSZWNlaXZlIGFsbCBjaGFyYWN0ZXJzIGluIFJ4IEZJRk8gKi8KIAlkbyB7CiAJCWJ5dGUgPSBpbmIoaW9iYXNlK1JYRCk7Ci0JCWFzeW5jX3Vud3JhcF9jaGFyKHNlbGYtPm5ldGRldiwgJnNlbGYtPnN0YXRzLCAmc2VsZi0+cnhfYnVmZiwgCi0JCQkJICBieXRlKTsKKwkJYXN5bmNfdW53cmFwX2NoYXIoc2VsZi0+bmV0ZGV2LCAmc2VsZi0+bmV0ZGV2LT5zdGF0cywKKwkJCQkgICZzZWxmLT5yeF9idWZmLCBieXRlKTsKIAl9IHdoaWxlIChpbmIoaW9iYXNlK0xTUikgJiBMU1JfUlhEQSk7IC8qIERhdGEgYXZhaWxhYmxlICovCQogfQogCkBAIC0xOTUyLDcgKzE5NTAsNyBAQAogCQkJc2VsZi0+aWVyID0gSUVSX1RYTERMX0lFOwogCQllbHNlIHsgCiAKLQkJCXNlbGYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCXNlbGYtPm5ldGRldi0+c3RhdHMudHhfcGFja2V0cysrOwogCQkJbmV0aWZfd2FrZV9xdWV1ZShzZWxmLT5uZXRkZXYpOwogCQkJc2VsZi0+aWVyID0gSUVSX1RYRU1QX0lFOwogCQl9CkBAIC0yMzA3LDEzICsyMzA1LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5zY19pcmNjX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgbnNjX2lyY2NfY2IgKnNlbGYgPSBuZXRkZXZfcHJpdihkZXYpOwotCQotCXJldHVybiAmc2VsZi0+c3RhdHM7Ci19Ci0KIHN0YXRpYyBpbnQgbnNjX2lyY2Nfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKICAgICAgCXN0cnVjdCBuc2NfaXJjY19jYiAqc2VsZiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL25zYy1pcmNjLmggYi9kcml2ZXJzL25ldC9pcmRhL25zYy1pcmNjLmgKaW5kZXggNzFjZDNjNS4uN2JhNzczOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9uc2MtaXJjYy5oCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvbnNjLWlyY2MuaApAQCAtMjUxLDcgKzI1MSw2IEBACiAJc3RydWN0IHR4X2ZpZm8gdHhfZmlmbzsgICAgLyogSW5mbyBhYm91dCBmcmFtZXMgdG8gYmUgdHJhbnNtaXR0ZWQgKi8KIAogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7ICAgICAvKiBZZXMhIHdlIGFyZSBzb21lIGtpbmQgb2YgbmV0ZGV2aWNlICovCi0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CiAJCiAJc3RydWN0IGlybGFwX2NiICppcmxhcDsgICAgLyogVGhlIGxpbmsgbGF5ZXIgd2UgYXJlIGJpbmRlZCB0byAqLwogCXN0cnVjdCBxb3NfaW5mbyBxb3M7ICAgICAgIC8qIFFvUyBjYXBhYmlsaXRpZXMgZm9yIHRoaXMgZGV2aWNlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3B4YWZpY3BfaXIuYyBiL2RyaXZlcnMvbmV0L2lyZGEvcHhhZmljcF9pci5jCmluZGV4IDAwNGE5YWEuLjMxNzk0YzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvcHhhZmljcF9pci5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvcHhhZmljcF9pci5jCkBAIC0xMDgsNyArMTA4LDYgQEAKIAlpbnQJCQl0eGRtYTsKIAlpbnQJCQlyeGRtYTsKIAotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCXN0YXRzOwogCXN0cnVjdCBpcmxhcF9jYgkJKmlybGFwOwogCXN0cnVjdCBxb3NfaW5mbwkJcW9zOwogCkBAIC0yNTgsMTQgKzI1NywxNSBAQAogCQkJZGF0YSA9IFNUUkJSOwogCQkJaWYgKGxzciAmIChMU1JfT0UgfCBMU1JfUEUgfCBMU1JfRkUgfCBMU1JfQkkpKSB7CiAJCQkJcHJpbnRrKEtFUk5fREVCVUcgInB4YV9pcjogc2lyIHJlY2VpdmluZyBlcnJvclxuIik7Ci0JCQkJc2ktPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CiAJCQkJaWYgKGxzciAmIExTUl9GRSkKLQkJCQkJc2ktPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJCQlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwogCQkJCWlmIChsc3IgJiBMU1JfT0UpCi0JCQkJCXNpLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQkJCQlkZXYtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CiAJCQl9IGVsc2UgewotCQkJCXNpLT5zdGF0cy5yeF9ieXRlcysrOwotCQkJCWFzeW5jX3Vud3JhcF9jaGFyKGRldiwgJnNpLT5zdGF0cywgJnNpLT5yeF9idWZmLCBkYXRhKTsKKwkJCQlkZXYtPnN0YXRzLnJ4X2J5dGVzKys7CisJCQkJYXN5bmNfdW53cmFwX2NoYXIoZGV2LCAmZGV2LT5zdGF0cywKKwkJCQkJCSAgJnNpLT5yeF9idWZmLCBkYXRhKTsKIAkJCX0KIAkJCWxzciA9IFNUTFNSOwogCQl9CkBAIC0yNzcsOCArMjc3LDggQEAKIAogCWNhc2UgMHgwQzogLyogQ2hhcmFjdGVyIFRpbWVvdXQgSW5kaWNhdGlvbiAqLwogCSAgCWRvICB7Ci0JCSAgICBzaS0+c3RhdHMucnhfYnl0ZXMrKzsKLQkgICAgICAgICAgICBhc3luY191bndyYXBfY2hhcihkZXYsICZzaS0+c3RhdHMsICZzaS0+cnhfYnVmZiwgU1RSQlIpOworCQkgICAgZGV2LT5zdGF0cy5yeF9ieXRlcysrOworCSAgICAgICAgICAgIGFzeW5jX3Vud3JhcF9jaGFyKGRldiwgJmRldi0+c3RhdHMsICZzaS0+cnhfYnVmZiwgU1RSQlIpOwogCSAgCX0gd2hpbGUgKFNUTFNSICYgTFNSX0RSKTsKIAkJc2ktPmxhc3Rfb3NjciA9IE9TQ1I7CiAJICAJYnJlYWs7CkBAIC0yOTAsOSArMjkwLDggQEAKIAkgICAgCX0KIAogCQlpZiAoc2ktPnR4X2J1ZmYubGVuID09IDApIHsKLQkJCXNpLT5zdGF0cy50eF9wYWNrZXRzKys7Ci0JCQlzaS0+c3RhdHMudHhfYnl0ZXMgKz0gc2ktPnR4X2J1ZmYuZGF0YSAtCi0JCQkJCSAgICAgIHNpLT50eF9idWZmLmhlYWQ7CisJCQlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2ktPnR4X2J1ZmYuZGF0YSAtIHNpLT50eF9idWZmLmhlYWQ7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIHRyYW5zbWl0dGVyIGhhcyBmaW5pc2hlZC4gKi8KIAkJCXdoaWxlICgoU1RMU1IgJiBMU1JfVEVNVCkgPT0gMCkKQEAgLTM0MywxMCArMzQyLDEwIEBACiAJRENTUihjaGFubmVsKSA9IGRjc3IgJiB+RENTUl9SVU47CiAKIAlpZiAoZGNzciAmIERDU1JfRU5ESU5UUikgIHsKLQkJc2ktPnN0YXRzLnR4X3BhY2tldHMrKzsKLQkJc2ktPnN0YXRzLnR4X2J5dGVzICs9IHNpLT5kbWFfdHhfYnVmZl9sZW47CisJCWRldi0+c3RhdHMudHhfcGFja2V0cysrOworCQlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNpLT5kbWFfdHhfYnVmZl9sZW47CiAJfSBlbHNlIHsKLQkJc2ktPnN0YXRzLnR4X2Vycm9ycysrOworCQlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOwogCX0KIAogCXdoaWxlIChJQ1NSMSAmIElDU1IxX1RCWSkKQEAgLTM5MiwxNCArMzkxLDE0IEBACiAJCWRhdGEgPSBJQ0RSOwogCiAJCWlmIChzdGF0ICYgKElDU1IxX0NSRSB8IElDU1IxX1JPUikpIHsKLQkJCXNpLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CiAJCQlpZiAoc3RhdCAmIElDU1IxX0NSRSkgewogCQkJCXByaW50ayhLRVJOX0RFQlVHICJweGFfaXI6IGZpciByZWNlaXZlIENSQyBlcnJvclxuIik7Ci0JCQkJc2ktPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCQlkZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKIAkJCX0KIAkJCWlmIChzdGF0ICYgSUNTUjFfUk9SKSB7CiAJCQkJcHJpbnRrKEtFUk5fREVCVUcgInB4YV9pcjogZmlyIHJlY2VpdmUgb3ZlcnJ1blxuIik7Ci0JCQkJc2ktPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQkJZGV2LT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOwogCQkJfQogCQl9IGVsc2UJewogCQkJc2ktPmRtYV9yeF9idWZmW2xlbisrXSA9IGRhdGE7CkBAIC00MTUsMTQgKzQxNCwxNCBAQAogCiAJCWlmIChpY3NyMCAmIElDU1IwX0ZSRSkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJweGFfaXI6IGRyb3BwaW5nIGVycm9uZW91cyBmcmFtZVxuIik7Ci0JCQlzaS0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCQlyZXR1cm47CiAJCX0KIAogCQlza2IgPSBhbGxvY19za2IobGVuKzEsR0ZQX0FUT01JQyk7CiAJCWlmICghc2tiKSAgewogCQkJcHJpbnRrKEtFUk5fRVJSICJweGFfaXI6IGZpciBvdXQgb2YgbWVtb3J5IGZvciByZWNlaXZlIHNrYlxuIik7Ci0JCQlzaS0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCQlyZXR1cm47CiAJCX0KIApAQCAtNDM3LDggKzQzNiw4IEBACiAJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKIAkJbmV0aWZfcngoc2tiKTsKIAotCQlzaS0+c3RhdHMucnhfcGFja2V0cysrOwotCQlzaS0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCQlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CiAJfQogfQogCkBAIC00NTcsMTAgKzQ1NiwxMCBAQAogCWlmIChpY3NyMCAmIChJQ1NSMF9GUkUgfCBJQ1NSMF9SQUIpKSB7CiAJCWlmIChpY3NyMCAmIElDU1IwX0ZSRSkgewogCQkgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJweGFfaXI6IGZpciByZWNlaXZlIGZyYW1lIGVycm9yXG4iKTsKLQkJCXNpLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCWRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CiAJCX0gZWxzZSB7CiAJCQlwcmludGsoS0VSTl9ERUJVRyAicHhhX2lyOiBmaXIgcmVjZWl2ZSBhYm9ydFxuIik7Ci0JCQlzaS0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOwogCQl9CiAJCUlDU1IwID0gaWNzcjAgJiAoSUNTUjBfRlJFIHwgSUNTUjBfUkFCKTsKIAl9CkBAIC01ODksMTIgKzU4OCw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpweGFfaXJkYV9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBweGFfaXJkYSAqc2kgPSBuZXRkZXZfcHJpdihkZXYpOwotCXJldHVybiAmc2ktPnN0YXRzOwotfQotCiBzdGF0aWMgdm9pZCBweGFfaXJkYV9zdGFydHVwKHN0cnVjdCBweGFfaXJkYSAqc2kpCiB7CiAJLyogRGlzYWJsZSBTVFVBUlQgaW50ZXJydXB0cyAqLwpAQCAtODU3LDcgKzg1MCw2IEBACiAJZGV2LT5vcGVuCQk9IHB4YV9pcmRhX3N0YXJ0OwogCWRldi0+c3RvcAkJPSBweGFfaXJkYV9zdG9wOwogCWRldi0+ZG9faW9jdGwJCT0gcHhhX2lyZGFfaW9jdGw7Ci0JZGV2LT5nZXRfc3RhdHMJCT0gcHhhX2lyZGFfc3RhdHM7CiAKIAlpcmRhX2luaXRfbWF4X3Fvc19jYXBhYmlsaWVzKCZzaS0+cW9zKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9zYTExMDBfaXIuYyBiL2RyaXZlcnMvbmV0L2lyZGEvc2ExMTAwX2lyLmMKaW5kZXggZDMwMmJjZi4uN2EyYjAwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9zYTExMDBfaXIuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL3NhMTEwMF9pci5jCkBAIC02MCw3ICs2MCw2IEBACiAJZG1hX3JlZ3NfdAkJKnR4ZG1hOwogCWRtYV9yZWdzX3QJCSpyeGRtYTsKIAotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCXN0YXRzOwogCXN0cnVjdCBkZXZpY2UJCSpkZXY7CiAJc3RydWN0IGlyZGFfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CiAJc3RydWN0IGlybGFwX2NiCQkqaXJsYXA7CkBAIC0zNzUsMTMgKzM3NCwxMyBAQAogCQlkYXRhID0gU2VyMlVURFI7CiAKIAkJaWYgKHN0YXQgJiAoVVRTUjFfRlJFIHwgVVRTUjFfUk9SKSkgewotCQkJc2ktPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJCWlmIChzdGF0ICYgVVRTUjFfRlJFKQotCQkJCXNpLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCQlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwogCQkJaWYgKHN0YXQgJiBVVFNSMV9ST1IpCi0JCQkJc2ktPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCQkJZGV2LT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOwogCQl9IGVsc2UKLQkJCWFzeW5jX3Vud3JhcF9jaGFyKGRldiwgJnNpLT5zdGF0cywgJnNpLT5yeF9idWZmLCBkYXRhKTsKKwkJCWFzeW5jX3Vud3JhcF9jaGFyKGRldiwgJmRldi0+c3RhdHMsICZzaS0+cnhfYnVmZiwgZGF0YSk7CiAKIAkJc3RhdHVzID0gU2VyMlVUU1IwOwogCX0KQEAgLTM5Niw5ICszOTUsOSBAQAogCQkgKiBUaGVyZSBhcmUgYXQgbGVhc3QgNCBieXRlcyBpbiB0aGUgRklGTy4gIFJlYWQgMyBieXRlcwogCQkgKiBhbmQgbGVhdmUgdGhlIHJlc3QgdG8gdGhlIGJsb2NrIGJlbG93LgogCQkgKi8KLQkJYXN5bmNfdW53cmFwX2NoYXIoZGV2LCAmc2ktPnN0YXRzLCAmc2ktPnJ4X2J1ZmYsIFNlcjJVVERSKTsKLQkJYXN5bmNfdW53cmFwX2NoYXIoZGV2LCAmc2ktPnN0YXRzLCAmc2ktPnJ4X2J1ZmYsIFNlcjJVVERSKTsKLQkJYXN5bmNfdW53cmFwX2NoYXIoZGV2LCAmc2ktPnN0YXRzLCAmc2ktPnJ4X2J1ZmYsIFNlcjJVVERSKTsKKwkJYXN5bmNfdW53cmFwX2NoYXIoZGV2LCAmZGV2LT5zdGF0cywgJnNpLT5yeF9idWZmLCBTZXIyVVREUik7CisJCWFzeW5jX3Vud3JhcF9jaGFyKGRldiwgJmRldi0+c3RhdHMsICZzaS0+cnhfYnVmZiwgU2VyMlVURFIpOworCQlhc3luY191bndyYXBfY2hhcihkZXYsICZkZXYtPnN0YXRzLCAmc2ktPnJ4X2J1ZmYsIFNlcjJVVERSKTsKIAl9CiAKIAlpZiAoc3RhdHVzICYgKFVUU1IwX1JGUyB8IFVUU1IwX1JJRCkpIHsKQEAgLTQwNiw3ICs0MDUsNyBAQAogCQkgKiBGaWZvIGNvbnRhaW5zIG1vcmUgdGhhbiAxIGNoYXJhY3Rlci4KIAkJICovCiAJCWRvIHsKLQkJCWFzeW5jX3Vud3JhcF9jaGFyKGRldiwgJnNpLT5zdGF0cywgJnNpLT5yeF9idWZmLAorCQkJYXN5bmNfdW53cmFwX2NoYXIoZGV2LCAmZGV2LT5zdGF0cywgJnNpLT5yeF9idWZmLAogCQkJCQkgIFNlcjJVVERSKTsKIAkJfSB3aGlsZSAoU2VyMlVUU1IxICYgVVRTUjFfUk5FKTsKIApAQCAtNDIyLDggKzQyMSw4IEBACiAJCX0gd2hpbGUgKFNlcjJVVFNSMSAmIFVUU1IxX1RORiAmJiBzaS0+dHhfYnVmZi5sZW4pOwogCiAJCWlmIChzaS0+dHhfYnVmZi5sZW4gPT0gMCkgewotCQkJc2ktPnN0YXRzLnR4X3BhY2tldHMrKzsKLQkJCXNpLT5zdGF0cy50eF9ieXRlcyArPSBzaS0+dHhfYnVmZi5kYXRhIC0KKwkJCWRldi0+c3RhdHMudHhfcGFja2V0cysrOworCQkJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBzaS0+dHhfYnVmZi5kYXRhIC0KIAkJCQkJICAgICAgc2ktPnR4X2J1ZmYuaGVhZDsKIAogCQkJLyoKQEAgLTQ4MiwxMSArNDgxLDExIEBACiAJCWRhdGEgPSBTZXIySFNEUjsKIAogCQlpZiAoc3RhdCAmIChIU1NSMV9DUkUgfCBIU1NSMV9ST1IpKSB7Ci0JCQlzaS0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOwogCQkJaWYgKHN0YXQgJiBIU1NSMV9DUkUpCi0JCQkJc2ktPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCQlkZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKIAkJCWlmIChzdGF0ICYgSFNTUjFfUk9SKQotCQkJCXNpLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCQlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwogCQl9IGVsc2UKIAkJCXNrYi0+ZGF0YVtsZW4rK10gPSBkYXRhOwogCkBAIC01MDUsOCArNTA0LDggQEAKIAkJc2tiLT5kZXYgPSBkZXY7CiAJCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKLQkJc2ktPnN0YXRzLnJ4X3BhY2tldHMrKzsKLQkJc2ktPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKwkJZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCWRldi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOwogCiAJCS8qCiAJCSAqIEJlZm9yZSB3ZSBwYXNzIHRoZSBidWZmZXIgdXAsIGFsbG9jYXRlIGEgbmV3IG9uZS4KQEAgLTU0NSwxMCArNTQ0LDEwIEBACiAJICogZnJvbSB0aGUgZmlmby4KIAkgKi8KIAlpZiAoU2VyMkhTU1IwICYgKEhTU1IwX0ZSRSB8IEhTU1IwX1JBQikpIHsKLQkJc2ktPnN0YXRzLnJ4X2Vycm9ycysrOworCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOwogCiAJCWlmIChTZXIySFNTUjAgJiBIU1NSMF9GUkUpCi0JCQlzaS0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwogCiAJCS8qCiAJCSAqIENsZWFyIG91dCB0aGUgRE1BLi4uCkBAIC02MzMsOCArNjMyLDggQEAKIAkgKi8KIAlpZiAoc2tiKSB7CiAJCWRtYV91bm1hcF9zaW5nbGUoc2ktPmRldiwgc2ktPnR4YnVmX2RtYSwgc2tiLT5sZW4sIERNQV9UT19ERVZJQ0UpOwotCQlzaS0+c3RhdHMudHhfcGFja2V0cyArKzsKLQkJc2ktPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCQlkZXYtPnN0YXRzLnR4X3BhY2tldHMgKys7CisJCWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CiAJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CiAJfQogCkBAIC03NjIsMTIgKzc2MSw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzYTExMDBfaXJkYV9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBzYTExMDBfaXJkYSAqc2kgPSBuZXRkZXZfcHJpdihkZXYpOwotCXJldHVybiAmc2ktPnN0YXRzOwotfQotCiBzdGF0aWMgaW50IHNhMTEwMF9pcmRhX3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHNhMTEwMF9pcmRhICpzaSA9IG5ldGRldl9wcml2KGRldik7CkBAIC05MjQsNyArOTE3LDYgQEAKIAlkZXYtPm9wZW4JCT0gc2ExMTAwX2lyZGFfc3RhcnQ7CiAJZGV2LT5zdG9wCQk9IHNhMTEwMF9pcmRhX3N0b3A7CiAJZGV2LT5kb19pb2N0bAkJPSBzYTExMDBfaXJkYV9pb2N0bDsKLQlkZXYtPmdldF9zdGF0cwkJPSBzYTExMDBfaXJkYV9zdGF0czsKIAlkZXYtPmlycQkJPSBJUlFfU2VyMklDUDsKIAogCWlyZGFfaW5pdF9tYXhfcW9zX2NhcGFiaWxpZXMoJnNpLT5xb3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9zaXItZGV2LmggYi9kcml2ZXJzL25ldC9pcmRhL3Npci1kZXYuaAppbmRleCAyYTU3YmM2Li42ZDViMWUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL3Npci1kZXYuaAorKysgYi9kcml2ZXJzL25ldC9pcmRhL3Npci1kZXYuaApAQCAtMTYwLDcgKzE2MCw2IEBACiAKIHN0cnVjdCBzaXJfZGV2IHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwogCiAJc3RydWN0IGlybGFwX2NiICAgICppcmxhcDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9zaXJfZGV2LmMgYi9kcml2ZXJzL25ldC9pcmRhL3Npcl9kZXYuYwppbmRleCBjZWVmMDQwLi41YjU4NjI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL3Npcl9kZXYuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL3Npcl9kZXYuYwpAQCAtNDU1LDggKzQ1NSw4IEBACiAJCQlpZiAoKHNrYj1kZXYtPnR4X3NrYikgIT0gTlVMTCkgewogCQkJCWRldi0+dHhfc2tiID0gTlVMTDsKIAkJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCQkJCWRldi0+c3RhdHMudHhfZXJyb3JzKys7CQkgICAgICAKLQkJCQlkZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsJCSAgICAgIAorCQkJCWRldi0+bmV0ZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCQlkZXYtPm5ldGRldi0+c3RhdHMudHhfZHJvcHBlZCsrOwogCQkJfQogCQkJZGV2LT50eF9idWZmLmxlbiA9IDA7CiAJCX0KQEAgLTQ5Myw4ICs0OTMsOCBAQAogCQkKIAlpZiAoKHNrYj1kZXYtPnR4X3NrYikgIT0gTlVMTCkgewogCQlkZXYtPnR4X3NrYiA9IE5VTEw7Ci0JCWRldi0+c3RhdHMudHhfcGFja2V0cysrOwkJICAgICAgCi0JCWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCWRldi0+bmV0ZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJCWRldi0+bmV0ZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKIAkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAl9CiAKQEAgLTU0OCw3ICs1NDgsNyBAQAogCQkgKiBqdXN0IHVwZGF0ZSBzdGF0cyBhbmQgc2V0IG1lZGlhIGJ1c3kKIAkJICovCiAJCWlyZGFfZGV2aWNlX3NldF9tZWRpYV9idXN5KGRldi0+bmV0ZGV2LCBUUlVFKTsKLQkJZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCWRldi0+bmV0ZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCUlSREFfREVCVUcoMCwgIiVzOyByeC1kcm9wOiAlemRcbiIsIF9fZnVuY19fLCBjb3VudCk7CiAJCXJldHVybiAwOwogCX0KQEAgLTU1Nyw3ICs1NTcsNyBAQAogCWlmIChsaWtlbHkoYXRvbWljX3JlYWQoJmRldi0+ZW5hYmxlX3J4KSkpIHsKIAkJd2hpbGUgKGNvdW50LS0pCiAJCQkvKiBVbndyYXAgYW5kIGRlc3R1ZmYgb25lIGJ5dGUgKi8KLQkJCWFzeW5jX3Vud3JhcF9jaGFyKGRldi0+bmV0ZGV2LCAmZGV2LT5zdGF0cywgCisJCQlhc3luY191bndyYXBfY2hhcihkZXYtPm5ldGRldiwgJmRldi0+bmV0ZGV2LT5zdGF0cywKIAkJCQkJICAmZGV2LT5yeF9idWZmLCAqY3ArKyk7CiAJfSBlbHNlIHsKIAkJd2hpbGUgKGNvdW50LS0pIHsKQEAgLTU4MiwxMyArNTgyLDYgQEAKIAogLyogY2FsbGJhY2tzIGZyb20gbmV0d29yayBsYXllciAqLwogCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNpcmRldl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCi17Ci0Jc3RydWN0IHNpcl9kZXYgKmRldiA9IG5ldGRldl9wcml2KG5kZXYpOwotCi0JcmV0dXJuIChkZXYpID8gJmRldi0+c3RhdHMgOiBOVUxMOwotfQotCiBzdGF0aWMgaW50IHNpcmRldl9oYXJkX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7CiAJc3RydWN0IHNpcl9kZXYgKmRldiA9IG5ldGRldl9wcml2KG5kZXYpOwpAQCAtNjU0LDcgKzY0Nyw3IEBACiAJICovCiAJYXRvbWljX3NldCgmZGV2LT5lbmFibGVfcngsIDApOwogCWlmICh1bmxpa2VseShzaXJkZXZfaXNfcmVjZWl2aW5nKGRldikpKQotCQlkZXYtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkJZGV2LT5uZXRkZXYtPnN0YXRzLmNvbGxpc2lvbnMrKzsKIAogCWFjdHVhbCA9IGRldi0+ZHJ2LT5kb193cml0ZShkZXYsIGRldi0+dHhfYnVmZi5kYXRhLCBkZXYtPnR4X2J1ZmYubGVuKTsKIApAQCAtNjY5LDggKzY2Miw4IEBACiAJCUlSREFfRVJST1IoIiVzOiBkcnYtPmRvX3dyaXRlIGZhaWxlZCAoJWQpXG4iLAogCQkJICAgX19mdW5jX18sIGFjdHVhbCk7CiAJCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JCWRldi0+c3RhdHMudHhfZXJyb3JzKys7CQkgICAgICAKLQkJZGV2LT5zdGF0cy50eF9kcm9wcGVkKys7CQkgICAgICAKKwkJZGV2LT5uZXRkZXYtPnN0YXRzLnR4X2Vycm9ycysrOworCQlkZXYtPm5ldGRldi0+c3RhdHMudHhfZHJvcHBlZCsrOwogCQluZXRpZl93YWtlX3F1ZXVlKG5kZXYpOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnR4X2xvY2ssIGZsYWdzKTsKQEAgLTkxOCw3ICs5MTEsNiBAQAogCW5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHNpcmRldl9oYXJkX3htaXQ7CiAJbmRldi0+b3BlbiA9IHNpcmRldl9vcGVuOwogCW5kZXYtPnN0b3AgPSBzaXJkZXZfY2xvc2U7Ci0JbmRldi0+Z2V0X3N0YXRzID0gc2lyZGV2X2dldF9zdGF0czsKIAluZGV2LT5kb19pb2N0bCA9IHNpcmRldl9pb2N0bDsKIAogCWlmIChyZWdpc3Rlcl9uZXRkZXYobmRldikpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvc21zYy1pcmNjMi5jIGIvZHJpdmVycy9uZXQvaXJkYS9zbXNjLWlyY2MyLmMKaW5kZXggNWQwOWUxNS4uZGQ3M2NjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9zbXNjLWlyY2MyLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9zbXNjLWlyY2MyLmMKQEAgLTE1MCw3ICsxNTAsNiBAQAogLyogUHJpdmF0ZSBkYXRhIGZvciBlYWNoIGluc3RhbmNlICovCiBzdHJ1Y3Qgc21zY19pcmNjX2NiIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OyAgICAgLyogWWVzISB3ZSBhcmUgc29tZSBraW5kIG9mIG5ldGRldmljZSAqLwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwogCXN0cnVjdCBpcmxhcF9jYiAgICAqaXJsYXA7IC8qIFRoZSBsaW5rIGxheWVyIHdlIGFyZSBiaW5kZWQgdG8gKi8KIAogCWNoaXBpb190IGlvOyAgICAgICAgICAgICAgIC8qIElyREEgY29udHJvbGxlciBpbmZvcm1hdGlvbiAqLwpAQCAtMjE1LDcgKzIxNCw2IEBACiAjaWYgU01TQ19JUkNDMl9DX05FVF9USU1FT1VUCiBzdGF0aWMgdm9pZCBzbXNjX2lyY2NfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKICNlbmRpZgotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzbXNjX2lyY2NfbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyBpbnQgc21zY19pcmNjX2lzX3JlY2VpdmluZyhzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKTsKIHN0YXRpYyB2b2lkIHNtc2NfaXJjY19wcm9iZV90cmFuc2NlaXZlcihzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKTsKIHN0YXRpYyB2b2lkIHNtc2NfaXJjY19zZXRfdHJhbnNjZWl2ZXJfZm9yX3NwZWVkKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYsIHUzMiBzcGVlZCk7CkBAIC01MjksNyArNTI3LDYgQEAKIAlkZXYtPm9wZW4gICAgICAgICAgICA9IHNtc2NfaXJjY19uZXRfb3BlbjsKIAlkZXYtPnN0b3AgICAgICAgICAgICA9IHNtc2NfaXJjY19uZXRfY2xvc2U7CiAJZGV2LT5kb19pb2N0bCAgICAgICAgPSBzbXNjX2lyY2NfbmV0X2lvY3RsOwotCWRldi0+Z2V0X3N0YXRzCSAgICAgPSBzbXNjX2lyY2NfbmV0X2dldF9zdGF0czsKIAogCXNlbGYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXNlbGYtPm5ldGRldiA9IGRldjsKQEAgLTgzNCwxMyArODMxLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNtc2NfaXJjY19uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZiA9IG5ldGRldl9wcml2KGRldik7Ci0KLQlyZXR1cm4gJnNlbGYtPnN0YXRzOwotfQotCiAjaWYgU01TQ19JUkNDMl9DX05FVF9USU1FT1VUCiAvKgogICogRnVuY3Rpb24gc21zY19pcmNjX3RpbWVvdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC05MjAsNyArOTEwLDcgQEAKIAlzZWxmLT50eF9idWZmLmxlbiA9IGFzeW5jX3dyYXBfc2tiKHNrYiwgc2VsZi0+dHhfYnVmZi5kYXRhLAogCQkJCQkgICBzZWxmLT50eF9idWZmLnRydWVzaXplKTsKIAotCXNlbGYtPnN0YXRzLnR4X2J5dGVzICs9IHNlbGYtPnR4X2J1ZmYubGVuOworCWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2VsZi0+dHhfYnVmZi5sZW47CiAKIAkvKiBUdXJuIG9uIHRyYW5zbWl0IGZpbmlzaGVkIGludGVycnVwdC4gV2lsbCBmaXJlIGltbWVkaWF0ZWx5ISAgKi8KIAlvdXRiKFVBUlRfSUVSX1RIUkksIHNlbGYtPmlvLnNpcl9iYXNlICsgVUFSVF9JRVIpOwpAQCAtMTMyMCwxNiArMTMxMCwxNiBAQAogCS8qIENoZWNrIGZvciB1bmRlcnJ1biEgKi8KIAlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgMCk7CiAJaWYgKGluYihpb2Jhc2UgKyBJUkNDX0xTUikgJiBJUkNDX0xTUl9VTkRFUlJVTikgewotCQlzZWxmLT5zdGF0cy50eF9lcnJvcnMrKzsKLQkJc2VsZi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJc2VsZi0+bmV0ZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJc2VsZi0+bmV0ZGV2LT5zdGF0cy50eF9maWZvX2Vycm9ycysrOwogCiAJCS8qIFJlc2V0IGVycm9yIGNvbmRpdGlvbiAqLwogCQlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgMCk7CiAJCW91dGIoSVJDQ19NQVNURVJfRVJST1JfUkVTRVQsIGlvYmFzZSArIElSQ0NfTUFTVEVSKTsKIAkJb3V0YigweDAwLCBpb2Jhc2UgKyBJUkNDX01BU1RFUik7CiAJfSBlbHNlIHsKLQkJc2VsZi0+c3RhdHMudHhfcGFja2V0cysrOwotCQlzZWxmLT5zdGF0cy50eF9ieXRlcyArPSBzZWxmLT50eF9idWZmLmxlbjsKKwkJc2VsZi0+bmV0ZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJCXNlbGYtPm5ldGRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2VsZi0+dHhfYnVmZi5sZW47CiAJfQogCiAJLyogQ2hlY2sgaWYgaXQncyB0aW1lIHRvIGNoYW5nZSB0aGUgc3BlZWQgKi8KQEAgLTE0MjksMTUgKzE0MTksMTUgQEAKIAogCS8qIExvb2sgZm9yIGVycm9ycyAqLwogCWlmIChsc3IgJiAoSVJDQ19MU1JfRlJBTUVfRVJST1IgfCBJUkNDX0xTUl9DUkNfRVJST1IgfCBJUkNDX0xTUl9TSVpFX0VSUk9SKSkgewotCQlzZWxmLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJaWYgKGxzciAmIElSQ0NfTFNSX0ZSQU1FX0VSUk9SKQotCQkJc2VsZi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwogCQlpZiAobHNyICYgSVJDQ19MU1JfQ1JDX0VSUk9SKQotCQkJc2VsZi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CiAJCWlmIChsc3IgJiBJUkNDX0xTUl9TSVpFX0VSUk9SKQotCQkJc2VsZi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CiAJCWlmIChsc3IgJiAoSVJDQ19MU1JfVU5ERVJSVU4gfCBJUkNDX0xTUl9PVkVSUlVOKSkKLQkJCXNlbGYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOwogCQlyZXR1cm47CiAJfQogCkBAIC0xNDYwLDggKzE0NTAsOCBAQAogCXNrYl9yZXNlcnZlKHNrYiwgMSk7CiAKIAltZW1jcHkoc2tiX3B1dChza2IsIGxlbiksIHNlbGYtPnJ4X2J1ZmYuZGF0YSwgbGVuKTsKLQlzZWxmLT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0Jc2VsZi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfcGFja2V0cysrOworCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOwogCiAJc2tiLT5kZXYgPSBzZWxmLT5uZXRkZXY7CiAJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKQEAgLTE0ODksNyArMTQ3OSw3IEBACiAgICAgICAgICAqIGFzeW5jX3Vud3JhcF9jaGFyIHdpbGwgZGVsaXZlciBhbGwgZm91bmQgZnJhbWVzCiAJICovCiAJZG8gewotCQlhc3luY191bndyYXBfY2hhcihzZWxmLT5uZXRkZXYsICZzZWxmLT5zdGF0cywgJnNlbGYtPnJ4X2J1ZmYsCisJCWFzeW5jX3Vud3JhcF9jaGFyKHNlbGYtPm5ldGRldiwgJnNlbGYtPm5ldGRldi0+c3RhdHMsICZzZWxmLT5yeF9idWZmLAogCQkJCSAgaW5iKGlvYmFzZSArIFVBUlRfUlgpKTsKIAogCQkvKiBNYWtlIHN1cmUgd2UgZG9uJ3Qgc3RheSBoZXJlIHRvIGxvbmcgKi8KQEAgLTE5OTIsNyArMTk4Miw3IEBACiAJCQkvKiBUZWxsIG5ldHdvcmsgbGF5ZXIgdGhhdCB3ZSB3YW50IG1vcmUgZnJhbWVzICovCiAJCQluZXRpZl93YWtlX3F1ZXVlKHNlbGYtPm5ldGRldik7CiAJCX0KLQkJc2VsZi0+c3RhdHMudHhfcGFja2V0cysrOworCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKIAogCQlpZiAoc2VsZi0+aW8uc3BlZWQgPD0gMTE1MjAwKSB7CiAJCQkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9zdGlyNDIwMC5jIGIvZHJpdmVycy9uZXQvaXJkYS9zdGlyNDIwMC5jCmluZGV4IGNhNGNkOTIuLjhiMTY1OGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvc3RpcjQyMDAuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL3N0aXI0MjAwLmMKQEAgLTE2NCw3ICsxNjQsNyBAQAogICAgICAgICBzdHJ1Y3QgdXNiX2RldmljZSAqdXNiZGV2OyAgICAgIC8qIGluaXQ6IHByb2JlX2lyZGEgKi8KICAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsgICAgICAvKiBuZXR3b3JrIGxheWVyICovCiAgICAgICAgIHN0cnVjdCBpcmxhcF9jYiAgICppcmxhcDsgICAgICAgLyogVGhlIGxpbmsgbGF5ZXIgd2UgYXJlIGJpbmRlZCB0byAqLwotICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsJLyogbmV0d29yayBzdGF0aXN0aWNzICovCisKICAgICAgICAgc3RydWN0IHFvc19pbmZvICAgcW9zOwogCXVuc2lnbmVkIAkgIHNwZWVkOwkvKiBDdXJyZW50IHNwZWVkICovCiAKQEAgLTMyMywxNiArMzIzLDE2IEBACiAJCXByX2RlYnVnKCIlczogc2hvcnQgZnJhbWUgbGVuICVkXG4iLAogCQkJIHN0aXItPm5ldGRldi0+bmFtZSwgbGVuKTsKIAotCQkrK3N0aXItPnN0YXRzLnJ4X2Vycm9yczsKLQkJKytzdGlyLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzOworCQkrK3N0aXItPm5ldGRldi0+c3RhdHMucnhfZXJyb3JzOworCQkrK3N0aXItPm5ldGRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9yczsKIAkJcmV0dXJuOwogCX0KIAogCWZjcyA9IH4oY3JjMzJfbGUofjAsIHJ4X2J1ZmYtPmRhdGEsIGxlbikpOwogCWlmIChmY3MgIT0gZ2V0X3VuYWxpZ25lZF9sZTMyKHJ4X2J1ZmYtPmRhdGEgKyBsZW4pKSB7CiAJCXByX2RlYnVnKCJjcmMgZXJyb3IgY2FsYyAweCV4IGxlbiAlZFxuIiwgZmNzLCBsZW4pOwotCQlzdGlyLT5zdGF0cy5yeF9lcnJvcnMrKzsKLQkJc3Rpci0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQlzdGlyLT5uZXRkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQlzdGlyLT5uZXRkZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKIAkJcmV0dXJuOwogCX0KIApAQCAtMzQwLDcgKzM0MCw3IEBACiAJaWYgKGxlbiA8IElSREFfUlhfQ09QWV9USFJFU0hPTEQpIHsKIAkJbnNrYiA9IGRldl9hbGxvY19za2IobGVuICsgMSk7CiAJCWlmICh1bmxpa2VseSghbnNrYikpIHsKLQkJCSsrc3Rpci0+c3RhdHMucnhfZHJvcHBlZDsKKwkJCSsrc3Rpci0+bmV0ZGV2LT5zdGF0cy5yeF9kcm9wcGVkOwogCQkJcmV0dXJuOwogCQl9CiAJCXNrYl9yZXNlcnZlKG5za2IsIDEpOwpAQCAtMzQ5LDcgKzM0OSw3IEBACiAJfSBlbHNlIHsKIAkJbnNrYiA9IGRldl9hbGxvY19za2IocnhfYnVmZi0+dHJ1ZXNpemUpOwogCQlpZiAodW5saWtlbHkoIW5za2IpKSB7Ci0JCQkrK3N0aXItPnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCQkrK3N0aXItPm5ldGRldi0+c3RhdHMucnhfZHJvcHBlZDsKIAkJCXJldHVybjsKIAkJfQogCQlza2JfcmVzZXJ2ZShuc2tiLCAxKTsKQEAgLTM2Niw4ICszNjYsOCBAQAogCiAJbmV0aWZfcngoc2tiKTsKIAotCXN0aXItPnN0YXRzLnJ4X3BhY2tldHMrKzsKLQlzdGlyLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CisJc3Rpci0+bmV0ZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJc3Rpci0+bmV0ZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CiAKIAlyeF9idWZmLT5kYXRhID0gcnhfYnVmZi0+aGVhZDsKIAlyeF9idWZmLT5sZW4gPSAwOwpAQCAtNDM3LDcgKzQzNyw3IEBACiAJCWlmICh1bmxpa2VseShyeF9idWZmLT5sZW4gPj0gcnhfYnVmZi0+dHJ1ZXNpemUpKSB7CiAJCQlwcl9kZWJ1ZygiJXM6IGZpciBmcmFtZSBleGNlZWRzICVkXG4iLAogCQkJCSBzdGlyLT5uZXRkZXYtPm5hbWUsIHJ4X2J1ZmYtPnRydWVzaXplKTsKLQkJCSsrc3Rpci0+c3RhdHMucnhfb3Zlcl9lcnJvcnM7CisJCQkrK3N0aXItPm5ldGRldi0+c3RhdHMucnhfb3Zlcl9lcnJvcnM7CiAJCQlnb3RvIGVycm9yX3JlY292ZXJ5OwogCQl9CiAKQEAgLTQ0NSwxMCArNDQ1LDEwIEBACiAJCWNvbnRpbnVlOwogCiAJZnJhbWVfZXJyb3I6Ci0JCSsrc3Rpci0+c3RhdHMucnhfZnJhbWVfZXJyb3JzOworCQkrK3N0aXItPm5ldGRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzOwogCiAJZXJyb3JfcmVjb3Zlcnk6Ci0JCSsrc3Rpci0+c3RhdHMucnhfZXJyb3JzOworCQkrK3N0aXItPm5ldGRldi0+c3RhdHMucnhfZXJyb3JzOwogCQlyeF9idWZmLT5zdGF0ZSA9IE9VVFNJREVfRlJBTUU7CiAJCXJ4X2J1ZmYtPmluX2ZyYW1lID0gRkFMU0U7CiAJfQpAQCAtNDYxLDcgKzQ2MSw3IEBACiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JCWFzeW5jX3Vud3JhcF9jaGFyKHN0aXItPm5ldGRldiwgJnN0aXItPnN0YXRzLAorCQlhc3luY191bndyYXBfY2hhcihzdGlyLT5uZXRkZXYsICZzdGlyLT5uZXRkZXYtPnN0YXRzLAogCQkJCSAgJnN0aXItPnJ4X2J1ZmYsIGJ5dGVzW2ldKTsKIH0KIApAQCAtNjkyLDcgKzY5Miw3IEBACiAJdXNiX2tpbGxfdXJiKHN0aXItPnJ4X3VyYik7CiAKIAlpZiAoc3Rpci0+cnhfYnVmZi5pbl9mcmFtZSkgCi0JCXN0aXItPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkJc3Rpci0+bmV0ZGV2LT5zdGF0cy5jb2xsaXNpb25zKys7CiB9CiAvKgogICogV3JhcCBkYXRhIGluIHNvY2tldCBidWZmZXIgYW5kIHNlbmQgaXQuCkBAIC03MTgsMTUgKzcxOCwxNSBAQAogCWlmICghZmlyc3RfZnJhbWUpCiAJCWZpZm9fdHh3YWl0KHN0aXIsIHdyYXBsZW4pOwogCi0Jc3Rpci0+c3RhdHMudHhfcGFja2V0cysrOwotCXN0aXItPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCXN0aXItPm5ldGRldi0+c3RhdHMudHhfcGFja2V0cysrOworCXN0aXItPm5ldGRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CiAJc3Rpci0+bmV0ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CiAJcHJfZGVidWcoInNlbmQgJWQgKCVkKVxuIiwgc2tiLT5sZW4sIHdyYXBsZW4pOwogCiAJaWYgKHVzYl9idWxrX21zZyhzdGlyLT51c2JkZXYsIHVzYl9zbmRidWxrcGlwZShzdGlyLT51c2JkZXYsIDEpLAogCQkJIHN0aXItPmlvX2J1Ziwgd3JhcGxlbiwKIAkJCSBOVUxMLCBUUkFOU01JVF9USU1FT1VUKSkKLQkJc3Rpci0+c3RhdHMudHhfZXJyb3JzKys7CisJCXN0aXItPm5ldGRldi0+c3RhdHMudHhfZXJyb3JzKys7CiB9CiAKIC8qCkBAIC0xMDA4LDE1ICsxMDA4LDYgQEAKIH0KIAogLyoKLSAqIEdldCBkZXZpY2Ugc3RhdHMgKGZvciAvcHJvYy9uZXQvZGV2IGFuZCBpZmNvbmZpZykKLSAqLwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGlyX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKLXsKLQlzdHJ1Y3Qgc3Rpcl9jYiAqc3RpciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JcmV0dXJuICZzdGlyLT5zdGF0czsKLX0KLQotLyoKICAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIFVTQiBzdWJzeXN0ZW0gZm9yIGVhY2ggbmV3IGRldmljZQogICogaW4gdGhlIHN5c3RlbS4gV2UgbmVlZCB0byBjaGVjayBpZiB0aGUgZGV2aWNlIGlzIG91cnMsIGFuZCBpbgogICogdGhpcyBjYXNlIHN0YXJ0IGhhbmRsaW5nIGl0LgpAQCAtMTA2Niw3ICsxMDU3LDYgQEAKIAluZXQtPmhhcmRfc3RhcnRfeG1pdCA9IHN0aXJfaGFyZF94bWl0OwogCW5ldC0+b3BlbiAgICAgICAgICAgID0gc3Rpcl9uZXRfb3BlbjsKIAluZXQtPnN0b3AgICAgICAgICAgICA9IHN0aXJfbmV0X2Nsb3NlOwotCW5ldC0+Z2V0X3N0YXRzCSAgICAgPSBzdGlyX25ldF9nZXRfc3RhdHM7CiAJbmV0LT5kb19pb2N0bCAgICAgICAgPSBzdGlyX25ldF9pb2N0bDsKIAogCXJldCA9IHJlZ2lzdGVyX25ldGRldihuZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS92aWEtaXJjYy5jIGIvZHJpdmVycy9uZXQvaXJkYS92aWEtaXJjYy5jCmluZGV4IDc0Yzc4Y2YuLjhiM2U1NDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvdmlhLWlyY2MuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL3ZpYS1pcmNjLmMKQEAgLTEwMSw4ICsxMDEsNiBAQAogc3RhdGljIGludCB2aWFfaXJjY19uZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgaW50IHZpYV9pcmNjX25ldF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLAogCQkJICAgICAgaW50IGNtZCk7Ci1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnZpYV9pcmNjX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UKLQkJCQkJCSAgICAgICAqZGV2KTsKIHN0YXRpYyB2b2lkIHZpYV9pcmNjX2NoYW5nZV9kb25nbGVfc3BlZWQoaW50IGlvYmFzZSwgaW50IHNwZWVkLAogCQkJCQkgaW50IGRvbmdsZV9pZCk7CiBzdGF0aWMgaW50IFJ4VGltZXJIYW5kbGVyKHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZiwgaW50IGlvYmFzZSk7CkBAIC00MzQsNyArNDMyLDYgQEAKIAlkZXYtPm9wZW4gPSB2aWFfaXJjY19uZXRfb3BlbjsKIAlkZXYtPnN0b3AgPSB2aWFfaXJjY19uZXRfY2xvc2U7CiAJZGV2LT5kb19pb2N0bCA9IHZpYV9pcmNjX25ldF9pb2N0bDsKLQlkZXYtPmdldF9zdGF0cyA9IHZpYV9pcmNjX25ldF9nZXRfc3RhdHM7CiAKIAllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKIAlpZiAoZXJyKQpAQCAtODU1LDcgKzg1Miw3IEBACiAJICAgIGFzeW5jX3dyYXBfc2tiKHNrYiwgc2VsZi0+dHhfYnVmZi5kYXRhLAogCQkJICAgc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSk7CiAKLQlzZWxmLT5zdGF0cy50eF9ieXRlcyArPSBzZWxmLT50eF9idWZmLmxlbjsKKwlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNlbGYtPnR4X2J1ZmYubGVuOwogCS8qIFNlbmQgdGhpcyBmcmFtZSB3aXRoIG9sZCBzcGVlZCAqLwogCVNldEJhdWRSYXRlKGlvYmFzZSwgc2VsZi0+aW8uc3BlZWQpOwogCVNldFB1bHNlV2lkdGgoaW9iYXNlLCAxMik7CkBAIC05MjEsNyArOTE4LDcgQEAKIAlzZWxmLT50eF9maWZvLnF1ZXVlW3NlbGYtPnR4X2ZpZm8uZnJlZV0ubGVuID0gc2tiLT5sZW47CiAKIAlzZWxmLT50eF9maWZvLnRhaWwgKz0gc2tiLT5sZW47Ci0Jc2VsZi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKIAlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwKIAkJICAgICAgc2VsZi0+dHhfZmlmby5xdWV1ZVtzZWxmLT50eF9maWZvLmZyZWVdLnN0YXJ0LCBza2ItPmxlbik7CiAJc2VsZi0+dHhfZmlmby5sZW4rKzsKQEAgLTk5MCwxMiArOTg3LDEyIEBACiAJLyogQ2xlYXIgYml0LCBieSB3cml0aW5nIDEgaW50byBpdCAqLwogCVR4X3N0YXR1cyA9IEdldFRYU3RhdHVzKGlvYmFzZSk7CiAJaWYgKFR4X3N0YXR1cyAmIDB4MDgpIHsKLQkJc2VsZi0+c3RhdHMudHhfZXJyb3JzKys7Ci0JCXNlbGYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCXNlbGYtPm5ldGRldi0+c3RhdHMudHhfZXJyb3JzKys7CisJCXNlbGYtPm5ldGRldi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKIAkJaHdyZXNldChzZWxmKTsKIC8vIGhvdyB0byBjbGVhciB1bmRlcnJydW4gPwogCX0gZWxzZSB7Ci0JCXNlbGYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJc2VsZi0+bmV0ZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CiAJCVJlc2V0Q2hpcChpb2Jhc2UsIDMpOwogCQlSZXNldENoaXAoaW9iYXNlLCA0KTsKIAl9CkBAIC0xMTE5LDggKzExMTYsOCBAQAogCQl9CiAJCS8vIE1vdmUgdG8gbmV4dCBmcmFtZSAKIAkJc2VsZi0+cnhfYnVmZi5kYXRhICs9IGxlbjsKLQkJc2VsZi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOwotCQlzZWxmLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKIAkJc2tiLT5kZXYgPSBzZWxmLT5uZXRkZXY7CiAJCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKQEAgLTExODAsNyArMTE3Nyw3IEBACiAJCSAqLwogCQlpZiAoKHNrYiA9PSBOVUxMKSB8fCAoc2tiLT5kYXRhID09IE5VTEwpCiAJCSAgICB8fCAoc2VsZi0+cnhfYnVmZi5kYXRhID09IE5VTEwpIHx8IChsZW4gPCA2KSkgewotCQkJc2VsZi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCQlyZXR1cm4gVFJVRTsKIAkJfQogCQlza2JfcmVzZXJ2ZShza2IsIDEpOwpAQCAtMTE5Miw4ICsxMTg5LDggQEAKIAogCQkvLyBNb3ZlIHRvIG5leHQgZnJhbWUgCiAJCXNlbGYtPnJ4X2J1ZmYuZGF0YSArPSBsZW47Ci0JCXNlbGYtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKLQkJc2VsZi0+c3RhdHMucnhfcGFja2V0cysrOworCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKwkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CiAJCXNrYi0+ZGV2ID0gc2VsZi0+bmV0ZGV2OwogCQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVJEQSk7CkBAIC0xMjIwLDEzICsxMjE3LDEzIEBACiAJSVJEQV9ERUJVRygyLCAiJXMoKTogbGVuPSV4XG4iLCBfX2Z1bmNfXywgbGVuKTsKIAogCWlmICgobGVuIC0gNCkgPCAyKSB7Ci0JCXNlbGYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCXJldHVybiBGQUxTRTsKIAl9CiAKIAlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbiArIDEpOwogCWlmIChza2IgPT0gTlVMTCkgewotCQlzZWxmLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQlyZXR1cm4gRkFMU0U7CiAJfQogCXNrYl9yZXNlcnZlKHNrYiwgMSk7CkBAIC0xMjM4LDggKzEyMzUsOCBAQAogCQlzdF9maWZvLT50YWlsID0gMDsKIAkvLyBNb3ZlIHRvIG5leHQgZnJhbWUgCiAJc2VsZi0+cnhfYnVmZi5kYXRhICs9IGxlbjsKLQlzZWxmLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47Ci0Jc2VsZi0+c3RhdHMucnhfcGFja2V0cysrOworCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfcGFja2V0cysrOwogCXNrYi0+ZGV2ID0gc2VsZi0+bmV0ZGV2OwogCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lSREEpOwpAQCAtMTI5NSw3ICsxMjkyLDcgQEAKIAkJCSAqLwogCQkJaWYgKChza2IgPT0gTlVMTCkgfHwgKHNrYi0+ZGF0YSA9PSBOVUxMKQogCQkJICAgIHx8IChzZWxmLT5yeF9idWZmLmRhdGEgPT0gTlVMTCkgfHwgKGxlbiA8IDYpKSB7Ci0JCQkJc2VsZi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCQkJc2tiX3Jlc2VydmUoc2tiLCAxKTsKQEAgLTEzMDcsOCArMTMwNCw4IEBACiAKIAkJCS8vIE1vdmUgdG8gbmV4dCBmcmFtZSAKIAkJCXNlbGYtPnJ4X2J1ZmYuZGF0YSArPSBsZW47Ci0JCQlzZWxmLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47Ci0JCQlzZWxmLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKwkJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfcGFja2V0cysrOwogCQkJc2tiLT5kZXYgPSBzZWxmLT5uZXRkZXY7CiAJCQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCQkJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lSREEpOwpAQCAtMTUyMyw3ICsxNTIwLDcgQEAKIAogCUlSREFfQVNTRVJUKGRldiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKIAlzZWxmID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzZWxmLT5zdGF0cy5yeF9wYWNrZXRzID0gMDsKKwlkZXYtPnN0YXRzLnJ4X3BhY2tldHMgPSAwOwogCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIDA7KTsKIAlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKIAlpZiAocmVxdWVzdF9pcnEoc2VsZi0+aW8uaXJxLCB2aWFfaXJjY19pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgZGV2KSkgewpAQCAtMTY2MCwxNCArMTY1Nyw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp2aWFfaXJjY19uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlCi0JCQkJCQkgICAgICAgKmRldikKLXsKLQlzdHJ1Y3QgdmlhX2lyY2NfY2IgKnNlbGYgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JcmV0dXJuICZzZWxmLT5zdGF0czsKLX0KLQogTU9EVUxFX0FVVEhPUigiVklBIFRlY2hub2xvZ2llcyxpbmMiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiVklBIElyREEgRGV2aWNlIERyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS92aWEtaXJjYy5oIGIvZHJpdmVycy9uZXQvaXJkYS92aWEtaXJjYy5oCmluZGV4IDQwM2MzZjcuLmQ5ZDFkYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvdmlhLWlyY2MuaAorKysgYi9kcml2ZXJzL25ldC9pcmRhL3ZpYS1pcmNjLmgKQEAgLTk1LDcgKzk1LDYgQEAKIAlzdHJ1Y3QgdHhfZmlmbyB0eF9maWZvOwkvKiBJbmZvIGFib3V0IGZyYW1lcyB0byBiZSB0cmFuc21pdHRlZCAqLwogCiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsJLyogWWVzISB3ZSBhcmUgc29tZSBraW5kIG9mIG5ldGRldmljZSAqLwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwogCiAJc3RydWN0IGlybGFwX2NiICppcmxhcDsJLyogVGhlIGxpbmsgbGF5ZXIgd2UgYXJlIGJpbmRlZCB0byAqLwogCXN0cnVjdCBxb3NfaW5mbyBxb3M7CS8qIFFvUyBjYXBhYmlsaXRpZXMgZm9yIHRoaXMgZGV2aWNlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3Zsc2lfaXIuYyBiL2RyaXZlcnMvbmV0L2lyZGEvdmxzaV9pci5jCmluZGV4IDBkMzBmOGQuLjcyM2M0NTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvdmxzaV9pci5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvdmxzaV9pci5jCkBAIC0yOTEsMTQgKzI5MSwxNCBAQAogCQlub3cudHZfc2VjIC0gaWRldi0+bGFzdF9yeC50dl9zZWMgLSBkZWx0YTEsIGRlbHRhMik7CQogCiAJc2VxX3ByaW50ZihzZXEsICJSWDogcGFja2V0cz0lbHUgLyBieXRlcz0lbHUgLyBlcnJvcnM9JWx1IC8gZHJvcHBlZD0lbHUiLAotCQlpZGV2LT5zdGF0cy5yeF9wYWNrZXRzLCBpZGV2LT5zdGF0cy5yeF9ieXRlcywgaWRldi0+c3RhdHMucnhfZXJyb3JzLAotCQlpZGV2LT5zdGF0cy5yeF9kcm9wcGVkKTsKKwkJbmRldi0+c3RhdHMucnhfcGFja2V0cywgbmRldi0+c3RhdHMucnhfYnl0ZXMsIG5kZXYtPnN0YXRzLnJ4X2Vycm9ycywKKwkJbmRldi0+c3RhdHMucnhfZHJvcHBlZCk7CiAJc2VxX3ByaW50ZihzZXEsICIgLyBvdmVycnVuPSVsdSAvIGxlbmd0aD0lbHUgLyBmcmFtZT0lbHUgLyBjcmM9JWx1XG4iLAotCQlpZGV2LT5zdGF0cy5yeF9vdmVyX2Vycm9ycywgaWRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycywKLQkJaWRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzLCBpZGV2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKTsKKwkJbmRldi0+c3RhdHMucnhfb3Zlcl9lcnJvcnMsIG5kZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMsCisJCW5kZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycywgbmRldi0+c3RhdHMucnhfY3JjX2Vycm9ycyk7CiAJc2VxX3ByaW50ZihzZXEsICJUWDogcGFja2V0cz0lbHUgLyBieXRlcz0lbHUgLyBlcnJvcnM9JWx1IC8gZHJvcHBlZD0lbHUgLyBmaWZvPSVsdVxuIiwKLQkJaWRldi0+c3RhdHMudHhfcGFja2V0cywgaWRldi0+c3RhdHMudHhfYnl0ZXMsIGlkZXYtPnN0YXRzLnR4X2Vycm9ycywKLQkJaWRldi0+c3RhdHMudHhfZHJvcHBlZCwgaWRldi0+c3RhdHMudHhfZmlmb19lcnJvcnMpOworCQluZGV2LT5zdGF0cy50eF9wYWNrZXRzLCBuZGV2LT5zdGF0cy50eF9ieXRlcywgbmRldi0+c3RhdHMudHhfZXJyb3JzLAorCQluZGV2LT5zdGF0cy50eF9kcm9wcGVkLCBuZGV2LT5zdGF0cy50eF9maWZvX2Vycm9ycyk7CiAKIH0KIAkJCkBAIC02NTEsMjEgKzY1MSwyMSBAQAogCiAJCWlmIChyZXQgPCAwKSB7CiAJCQlyZXQgPSAtcmV0OwotCQkJaWRldi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQluZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJCWlmIChyZXQgJiBWTFNJX1JYX0RST1ApICAKLQkJCQlpZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJbmRldi0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQkJaWYgKHJldCAmIFZMU0lfUlhfT1ZFUikgIAotCQkJCWlkZXYtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQkJbmRldi0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKIAkJCWlmIChyZXQgJiBWTFNJX1JYX0xFTkdUSCkgIAotCQkJCWlkZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCQluZGV2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CiAJCQlpZiAocmV0ICYgVkxTSV9SWF9GUkFNRSkgIAotCQkJCWlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJCW5kZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwogCQkJaWYgKHJldCAmIFZMU0lfUlhfQ1JDKSAgCi0JCQkJaWRldi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJCW5kZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKIAkJfQogCQllbHNlIGlmIChyZXQgPiAwKSB7Ci0JCQlpZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0JCQlpZGV2LT5zdGF0cy5yeF9ieXRlcyArPSByZXQ7CisJCQluZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQluZGV2LT5zdGF0cy5yeF9ieXRlcyArPSByZXQ7CiAJCX0KIAl9CiAKQEAgLTY4Niw2ICs2ODYsNyBAQAogCiBzdGF0aWMgdm9pZCB2bHNpX3VuYXJtX3J4KHZsc2lfaXJkYV9kZXZfdCAqaWRldikKIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShpZGV2LT5wZGV2KTsKIAlzdHJ1Y3QgdmxzaV9yaW5nICpyID0gaWRldi0+cnhfcmluZzsKIAlzdHJ1Y3QgcmluZ19kZXNjciAqcmQ7CiAJaW50IHJldDsKQEAgLTcxMSwyMSArNzEyLDIxIEBACiAKIAkJaWYgKHJldCA8IDApIHsKIAkJCXJldCA9IC1yZXQ7Ci0JCQlpZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCW5kZXYtPnN0YXRzLnJ4X2Vycm9ycysrOwogCQkJaWYgKHJldCAmIFZMU0lfUlhfRFJPUCkgIAotCQkJCWlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQluZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCQlpZiAocmV0ICYgVkxTSV9SWF9PVkVSKSAgCi0JCQkJaWRldi0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwkJCQluZGV2LT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOwogCQkJaWYgKHJldCAmIFZMU0lfUlhfTEVOR1RIKSAgCi0JCQkJaWRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJCW5kZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKIAkJCWlmIChyZXQgJiBWTFNJX1JYX0ZSQU1FKSAgCi0JCQkJaWRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQkJbmRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CiAJCQlpZiAocmV0ICYgVkxTSV9SWF9DUkMpICAKLQkJCQlpZGV2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQkJbmRldi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOwogCQl9CiAJCWVsc2UgaWYgKHJldCA+IDApIHsKLQkJCWlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKLQkJCWlkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHJldDsKKwkJCW5kZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCW5kZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHJldDsKIAkJfQogCX0KIH0KQEAgLTEwNTAsOCArMTA1MSw4IEBACiBkcm9wOgogCUlSREFfV0FSTklORygiJXM6IGRyb3BwaW5nIHBhY2tldCAtICVzXG4iLCBfX2Z1bmNfXywgbXNnKTsKIAlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCWlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOwotCWlkZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwluZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKKwluZGV2LT5zdGF0cy50eF9kcm9wcGVkKys7CiAJLyogRG9uJ3QgZXZlbiB0aGluayBhYm91dCByZXR1cm5pbmcgTkVUX1hNSVRfRFJPUCAoPTEpIGhlcmUhCiAJICogSW4gZmFjdCBhbnkgcmV0dmFsIT0wIGNhdXNlcyB0aGUgcGFja2V0IHNjaGVkdWxlciB0byByZXF1ZXVlIHRoZQogCSAqIHBhY2tldCBmb3IgbGF0ZXIgcmV0cnkgb2YgdHJhbnNtaXNzaW9uIC0gd2hpY2ggaXNuJ3QgZXhhY3RseQpAQCAtMTA3OCwxNSArMTA3OSwxNSBAQAogCiAJCWlmIChyZXQgPCAwKSB7CiAJCQlyZXQgPSAtcmV0OwotCQkJaWRldi0+c3RhdHMudHhfZXJyb3JzKys7CisJCQluZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKIAkJCWlmIChyZXQgJiBWTFNJX1RYX0RST1ApCi0JCQkJaWRldi0+c3RhdHMudHhfZHJvcHBlZCsrOworCQkJCW5kZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKIAkJCWlmIChyZXQgJiBWTFNJX1RYX0ZJRk8pCi0JCQkJaWRldi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCQluZGV2LT5zdGF0cy50eF9maWZvX2Vycm9ycysrOwogCQl9CiAJCWVsc2UgaWYgKHJldCA+IDApewotCQkJaWRldi0+c3RhdHMudHhfcGFja2V0cysrOwotCQkJaWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gcmV0OworCQkJbmRldi0+c3RhdHMudHhfcGFja2V0cysrOworCQkJbmRldi0+c3RhdHMudHhfYnl0ZXMgKz0gcmV0OwogCQl9CiAJfQogCkBAIC0xMTIyLDYgKzExMjMsNyBAQAogCiBzdGF0aWMgdm9pZCB2bHNpX3VuYXJtX3R4KHZsc2lfaXJkYV9kZXZfdCAqaWRldikKIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShpZGV2LT5wZGV2KTsKIAlzdHJ1Y3QgdmxzaV9yaW5nICpyID0gaWRldi0+dHhfcmluZzsKIAlzdHJ1Y3QgcmluZ19kZXNjciAqcmQ7CiAJaW50IHJldDsKQEAgLTExNDUsMTUgKzExNDcsMTUgQEAKIAogCQlpZiAocmV0IDwgMCkgewogCQkJcmV0ID0gLXJldDsKLQkJCWlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJbmRldi0+c3RhdHMudHhfZXJyb3JzKys7CiAJCQlpZiAocmV0ICYgVkxTSV9UWF9EUk9QKQotCQkJCWlkZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJCQluZGV2LT5zdGF0cy50eF9kcm9wcGVkKys7CiAJCQlpZiAocmV0ICYgVkxTSV9UWF9GSUZPKQotCQkJCWlkZXYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQkJbmRldi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKIAkJfQogCQllbHNlIGlmIChyZXQgPiAwKXsKLQkJCWlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKLQkJCWlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHJldDsKKwkJCW5kZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCW5kZXYtPnN0YXRzLnR4X2J5dGVzICs9IHJldDsKIAkJfQogCX0KIApAQCAtMTM3MywxMyArMTM3NSw2IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICogdmxzaV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCi17Ci0JdmxzaV9pcmRhX2Rldl90ICppZGV2ID0gbmV0ZGV2X3ByaXYobmRldik7Ci0KLQlyZXR1cm4gJmlkZXYtPnN0YXRzOwotfQotCiBzdGF0aWMgdm9pZCB2bHNpX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7CiAJdmxzaV9pcmRhX2Rldl90ICppZGV2ID0gbmV0ZGV2X3ByaXYobmRldik7CkBAIC0xNjE1LDcgKzE2MTAsNiBAQAogIAogCW5kZXYtPm9wZW4JICAgICAgPSB2bHNpX29wZW47CiAJbmRldi0+c3RvcAkgICAgICA9IHZsc2lfY2xvc2U7Ci0JbmRldi0+Z2V0X3N0YXRzCSAgICAgID0gdmxzaV9nZXRfc3RhdHM7CiAJbmRldi0+aGFyZF9zdGFydF94bWl0ID0gdmxzaV9oYXJkX3N0YXJ0X3htaXQ7CiAJbmRldi0+ZG9faW9jdGwJICAgICAgPSB2bHNpX2lvY3RsOwogCW5kZXYtPnR4X3RpbWVvdXQgICAgICA9IHZsc2lfdHhfdGltZW91dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvdmxzaV9pci5oIGIvZHJpdmVycy9uZXQvaXJkYS92bHNpX2lyLmgKaW5kZXggOWIxODg0My4uMzA1MGQxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS92bHNpX2lyLmgKKysrIGIvZHJpdmVycy9uZXQvaXJkYS92bHNpX2lyLmgKQEAgLTcxMiw3ICs3MTIsNiBAQAogCiB0eXBlZGVmIHN0cnVjdCB2bHNpX2lyZGFfZGV2IHsKIAlzdHJ1Y3QgcGNpX2RldgkJKnBkZXY7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJc3RhdHM7CiAKIAlzdHJ1Y3QgaXJsYXBfY2IJCSppcmxhcDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS93ODM5NzdhZl9pci5jIGIvZHJpdmVycy9uZXQvaXJkYS93ODM5NzdhZl9pci5jCmluZGV4IDMwZWM5MTMuLmRjMGEyZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvdzgzOTc3YWZfaXIuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL3c4Mzk3N2FmX2lyLmMKQEAgLTEwMiw3ICsxMDIsNiBAQAogc3RhdGljIGludCAgdzgzOTc3YWZfbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgaW50ICB3ODM5NzdhZl9uZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgaW50ICB3ODM5NzdhZl9uZXRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7Ci1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnc4Mzk3N2FmX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKIC8qCiAgKiBGdW5jdGlvbiB3ODM5NzdhZl9pbml0ICgpCkBAIC0yMzcsNyArMjM2LDYgQEAKIAlkZXYtPm9wZW4gICAgICAgICAgICA9IHc4Mzk3N2FmX25ldF9vcGVuOwogCWRldi0+c3RvcCAgICAgICAgICAgID0gdzgzOTc3YWZfbmV0X2Nsb3NlOwogCWRldi0+ZG9faW9jdGwgICAgICAgID0gdzgzOTc3YWZfbmV0X2lvY3RsOwotCWRldi0+Z2V0X3N0YXRzCSAgICAgPSB3ODM5NzdhZl9uZXRfZ2V0X3N0YXRzOwogCiAJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CiAJaWYgKGVycikgewpAQCAtNzAyLDEzICs3MDAsMTMgQEAKIAlpZiAoaW5iKGlvYmFzZStBVURSKSAmIEFVRFJfVU5EUikgewogCQlJUkRBX0RFQlVHKDAsICIlcygpLCBUcmFuc21pdCB1bmRlcnJ1biFcbiIsIF9fZnVuY19fICk7CiAJCQotCQlzZWxmLT5zdGF0cy50eF9lcnJvcnMrKzsKLQkJc2VsZi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJc2VsZi0+bmV0ZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJc2VsZi0+bmV0ZGV2LT5zdGF0cy50eF9maWZvX2Vycm9ycysrOwogCiAJCS8qIENsZWFyIGJpdCwgYnkgd3JpdGluZyAxIHRvIGl0ICovCiAJCW91dGIoQVVEUl9VTkRSLCBpb2Jhc2UrQVVEUik7CiAJfSBlbHNlCi0JCXNlbGYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJc2VsZi0+bmV0ZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CiAKIAkKIAlpZiAoc2VsZi0+bmV3X3NwZWVkKSB7CkBAIC04NDYsMjggKzg0NCwyOCBAQAogCQlpZiAoc3RhdHVzICYgRlNfRk9fRVJSX01TSykgewogCQkJaWYgKHN0YXR1cyAmIEZTX0ZPX0xTVF9GUikgewogCQkJCS8qIEFkZCBudW1iZXIgb2YgbG9zdCBmcmFtZXMgdG8gc3RhdHMgKi8KLQkJCQlzZWxmLT5zdGF0cy5yeF9lcnJvcnMgKz0gbGVuOwkKKwkJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2Vycm9ycyArPSBsZW47CiAJCQl9IGVsc2UgewogCQkJCS8qIFNraXAgZnJhbWUgKi8KLQkJCQlzZWxmLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOwogCQkJCQogCQkJCXNlbGYtPnJ4X2J1ZmYuZGF0YSArPSBsZW47CiAJCQkJCiAJCQkJaWYgKHN0YXR1cyAmIEZTX0ZPX01YX0xFWCkKLQkJCQkJc2VsZi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKIAkJCQkKIAkJCQlpZiAoc3RhdHVzICYgRlNfRk9fUEhZX0VSUikgCi0JCQkJCXNlbGYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwogCQkJCQogCQkJCWlmIChzdGF0dXMgJiBGU19GT19DUkNfRVJSKSAKLQkJCQkJc2VsZi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKIAkJCX0KIAkJCS8qIFRoZSBlcnJvcnMgYmVsb3cgY2FuIGJlIHJlcG9ydGVkIGluIGJvdGggY2FzZXMgKi8KIAkJCWlmIChzdGF0dXMgJiBGU19GT19SWF9PVikKLQkJCQlzZWxmLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQkJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKIAkJCQogCQkJaWYgKHN0YXR1cyAmIEZTX0ZPX0ZTRl9PVikKLQkJCQlzZWxmLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQkJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKIAkJCQogCQl9IGVsc2UgewogCQkJLyogQ2hlY2sgaWYgd2UgaGF2ZSB0cmFuc2ZlcnJlZCBhbGwgZGF0YSB0byBtZW1vcnkgKi8KQEAgLTkxNyw3ICs5MTUsNyBAQAogCiAJCQkvKiBNb3ZlIHRvIG5leHQgZnJhbWUgKi8KIAkJCXNlbGYtPnJ4X2J1ZmYuZGF0YSArPSBsZW47Ci0JCQlzZWxmLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKIAkJCQogCQkJc2tiLT5kZXYgPSBzZWxmLT5uZXRkZXY7CiAJCQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwpAQCAtOTUxLDcgKzk0OSw3IEBACiAJLyogIFJlY2VpdmUgYWxsIGNoYXJhY3RlcnMgaW4gUnggRklGTyAqLwogCWRvIHsKIAkJYnl0ZSA9IGluYihpb2Jhc2UrUkJSKTsKLQkJYXN5bmNfdW53cmFwX2NoYXIoc2VsZi0+bmV0ZGV2LCAmc2VsZi0+c3RhdHMsICZzZWxmLT5yeF9idWZmLCAKKwkJYXN5bmNfdW53cmFwX2NoYXIoc2VsZi0+bmV0ZGV2LCAmc2VsZi0+bmV0ZGV2LT5zdGF0cywgJnNlbGYtPnJ4X2J1ZmYsCiAJCQkJICBieXRlKTsKIAl9IHdoaWxlIChpbmIoaW9iYXNlK1VTUikgJiBVU1JfUkRSKTsgLyogRGF0YSBhdmFpbGFibGUgKi8JCiB9CkBAIC05OTQsNyArOTkyLDcgQEAKIAkJCW91dGIoQVVEUl9TRkVORCwgaW9iYXNlK0FVRFIpOwogCQkJb3V0YihzZXQsIGlvYmFzZStTU1IpOyAKIAotCQkJc2VsZi0+c3RhdHMudHhfcGFja2V0cysrOworCQkJc2VsZi0+bmV0ZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CiAKIAkJCS8qIEZlZWQgbWUgbW9yZSBwYWNrZXRzICovCiAJCQluZXRpZl93YWtlX3F1ZXVlKHNlbGYtPm5ldGRldik7CkBAIC0xMzM2LDEzICsxMzM0LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnc4Mzk3N2FmX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgdzgzOTc3YWZfaXIgKnNlbGYgPSBuZXRkZXZfcHJpdihkZXYpOwotCQotCXJldHVybiAmc2VsZi0+c3RhdHM7Ci19Ci0KIE1PRFVMRV9BVVRIT1IoIkRhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiV2luYm9uZCBXODM5NzdBRiBJckRBIERldmljZSBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvdzgzOTc3YWZfaXIuaCBiL2RyaXZlcnMvbmV0L2lyZGEvdzgzOTc3YWZfaXIuaAppbmRleCA4N2MzOTc1Li5mZWZlOWIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL3c4Mzk3N2FmX2lyLmgKKysrIGIvZHJpdmVycy9uZXQvaXJkYS93ODM5NzdhZl9pci5oCkBAIC0xNzIsNyArMTcyLDYgQEAKIAlpbnQgdHhfbGVuOyAgICAgICAgICAvKiBOdW1iZXIgb2YgZnJhbWVzIGluIHR4X2J1ZmYgKi8KIAogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7IC8qIFllcyEgd2UgYXJlIHNvbWUga2luZCBvZiBuZXRkZXZpY2UgKi8KLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKIAkKIAlzdHJ1Y3QgaXJsYXBfY2IgICAgKmlybGFwOyAvKiBUaGUgbGluayBsYXllciB3ZSBhcmUgYmluZGVkIHRvICovCiAJc3RydWN0IHFvc19pbmZvICAgICBxb3M7ICAgLyogUW9TIGNhcGFiaWxpdGllcyBmb3IgdGhpcyBkZXZpY2UgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21seDQvZW5fcGFyYW1zLmMgYi9kcml2ZXJzL25ldC9tbHg0L2VuX3BhcmFtcy5jCmluZGV4IGNmZWVmMGYuLmMxYmQwNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21seDQvZW5fcGFyYW1zLmMKKysrIGIvZHJpdmVycy9uZXQvbWx4NC9lbl9wYXJhbXMuYwpAQCAtMzk5LDggKzM5OSwxMCBAQAogCiAJcnhfc2l6ZSA9IHJvdW5kdXBfcG93X29mX3R3byhwYXJhbS0+cnhfcGVuZGluZyk7CiAJcnhfc2l6ZSA9IG1heF90KHUzMiwgcnhfc2l6ZSwgTUxYNF9FTl9NSU5fUlhfU0laRSk7CisJcnhfc2l6ZSA9IG1pbl90KHUzMiwgcnhfc2l6ZSwgTUxYNF9FTl9NQVhfUlhfU0laRSk7CiAJdHhfc2l6ZSA9IHJvdW5kdXBfcG93X29mX3R3byhwYXJhbS0+dHhfcGVuZGluZyk7CiAJdHhfc2l6ZSA9IG1heF90KHUzMiwgdHhfc2l6ZSwgTUxYNF9FTl9NSU5fVFhfU0laRSk7CisJdHhfc2l6ZSA9IG1pbl90KHUzMiwgdHhfc2l6ZSwgTUxYNF9FTl9NQVhfVFhfU0laRSk7CiAKIAlpZiAocnhfc2l6ZSA9PSBwcml2LT5wcm9mLT5yeF9yaW5nX3NpemUgJiYKIAkgICAgdHhfc2l6ZSA9PSBwcml2LT5wcm9mLT50eF9yaW5nX3NpemUpCkBAIC00NDAsOCArNDQyLDggQEAKIAlzdHJ1Y3QgbWx4NF9lbl9kZXYgKm1kZXYgPSBwcml2LT5tZGV2OwogCiAJbWVtc2V0KHBhcmFtLCAwLCBzaXplb2YoKnBhcmFtKSk7Ci0JcGFyYW0tPnJ4X21heF9wZW5kaW5nID0gbWRldi0+ZGV2LT5jYXBzLm1heF9ycV9zZzsKLQlwYXJhbS0+dHhfbWF4X3BlbmRpbmcgPSBtZGV2LT5kZXYtPmNhcHMubWF4X3NxX3NnOworCXBhcmFtLT5yeF9tYXhfcGVuZGluZyA9IE1MWDRfRU5fTUFYX1JYX1NJWkU7CisJcGFyYW0tPnR4X21heF9wZW5kaW5nID0gTUxYNF9FTl9NQVhfVFhfU0laRTsKIAlwYXJhbS0+cnhfcGVuZGluZyA9IG1kZXYtPnByb2ZpbGUucHJvZltwcml2LT5wb3J0XS5yeF9yaW5nX3NpemU7CiAJcGFyYW0tPnR4X3BlbmRpbmcgPSBtZGV2LT5wcm9maWxlLnByb2ZbcHJpdi0+cG9ydF0udHhfcmluZ19zaXplOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWx4NC9lbl90eC5jIGIvZHJpdmVycy9uZXQvbWx4NC9lbl90eC5jCmluZGV4IGZmNGQ3NTIuLjRhZmQ1OTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21seDQvZW5fdHguYworKysgYi9kcml2ZXJzL25ldC9tbHg0L2VuX3R4LmMKQEAgLTIwMywxOSArMjAzLDIxIEBACiAKIAkvKiBPcHRpbWl6ZSB0aGUgY29tbW9uIGNhc2Ugd2hlbiB0aGVyZSBhcmUgbm8gd3JhcGFyb3VuZHMgKi8KIAlpZiAobGlrZWx5KCh2b2lkICopIHR4X2Rlc2MgKyB0eF9pbmZvLT5ucl90eGJiICogVFhCQl9TSVpFIDw9IGVuZCkpIHsKLQkJaWYgKHR4X2luZm8tPmxpbmVhcikgewotCQkJcGNpX3VubWFwX3NpbmdsZShtZGV2LT5wZGV2LAotCQkJCQkgKGRtYV9hZGRyX3QpIGJlNjRfdG9fY3B1KGRhdGEtPmFkZHIpLAorCQlpZiAoIXR4X2luZm8tPmlubCkgeworCQkJaWYgKHR4X2luZm8tPmxpbmVhcikgeworCQkJCXBjaV91bm1hcF9zaW5nbGUobWRldi0+cGRldiwKKwkJCQkJKGRtYV9hZGRyX3QpIGJlNjRfdG9fY3B1KGRhdGEtPmFkZHIpLAogCQkJCQkgYmUzMl90b19jcHUoZGF0YS0+Ynl0ZV9jb3VudCksCiAJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJCSsrZGF0YTsKLQkJfQorCQkJCSsrZGF0YTsKKwkJCX0KIAotCQlmb3IgKGkgPSAwOyBpIDwgZnJhZ3M7IGkrKykgewotCQkJZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOwotCQkJcGNpX3VubWFwX3BhZ2UobWRldi0+cGRldiwKLQkJCQkgICAgICAgKGRtYV9hZGRyX3QpIGJlNjRfdG9fY3B1KGRhdGFbaV0uYWRkciksCi0JCQkJICAgICAgIGZyYWctPnNpemUsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJZm9yIChpID0gMDsgaSA8IGZyYWdzOyBpKyspIHsKKwkJCQlmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CisJCQkJcGNpX3VubWFwX3BhZ2UobWRldi0+cGRldiwKKwkJCQkJKGRtYV9hZGRyX3QpIGJlNjRfdG9fY3B1KGRhdGFbaV0uYWRkciksCisJCQkJCWZyYWctPnNpemUsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJfQogCQl9CiAJCS8qIFN0YW1wIHRoZSBmcmVlZCBkZXNjcmlwdG9yICovCiAJCWZvciAoaSA9IDA7IGkgPCB0eF9pbmZvLT5ucl90eGJiICogVFhCQl9TSVpFOyBpICs9IFNUQU1QX1NUUklERSkgewpAQCAtMjI0LDI3ICsyMjYsMjkgQEAKIAkJfQogCiAJfSBlbHNlIHsKLQkJaWYgKCh2b2lkICopIGRhdGEgPj0gZW5kKSB7Ci0JCQlkYXRhID0gKHN0cnVjdCBtbHg0X3dxZV9kYXRhX3NlZyAqKQotCQkJCQkocmluZy0+YnVmICsgKCh2b2lkICopIGRhdGEgLSBlbmQpKTsKLQkJfQorCQlpZiAoIXR4X2luZm8tPmlubCkgeworCQkJaWYgKCh2b2lkICopIGRhdGEgPj0gZW5kKSB7CisJCQkJZGF0YSA9IChzdHJ1Y3QgbWx4NF93cWVfZGF0YV9zZWcgKikKKwkJCQkJCShyaW5nLT5idWYgKyAoKHZvaWQgKikgZGF0YSAtIGVuZCkpOworCQkJfQogCi0JCWlmICh0eF9pbmZvLT5saW5lYXIpIHsKLQkJCXBjaV91bm1hcF9zaW5nbGUobWRldi0+cGRldiwKLQkJCQkJIChkbWFfYWRkcl90KSBiZTY0X3RvX2NwdShkYXRhLT5hZGRyKSwKKwkJCWlmICh0eF9pbmZvLT5saW5lYXIpIHsKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKG1kZXYtPnBkZXYsCisJCQkJCShkbWFfYWRkcl90KSBiZTY0X3RvX2NwdShkYXRhLT5hZGRyKSwKIAkJCQkJIGJlMzJfdG9fY3B1KGRhdGEtPmJ5dGVfY291bnQpLAogCQkJCQkgUENJX0RNQV9UT0RFVklDRSk7Ci0JCQkrK2RhdGE7Ci0JCX0KKwkJCQkrK2RhdGE7CisJCQl9CiAKLQkJZm9yIChpID0gMDsgaSA8IGZyYWdzOyBpKyspIHsKLQkJCS8qIENoZWNrIGZvciB3cmFwYXJvdW5kIGJlZm9yZSB1bm1hcHBpbmcgKi8KLQkJCWlmICgodm9pZCAqKSBkYXRhID49IGVuZCkKLQkJCQlkYXRhID0gKHN0cnVjdCBtbHg0X3dxZV9kYXRhX3NlZyAqKSByaW5nLT5idWY7Ci0JCQlmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07Ci0JCQlwY2lfdW5tYXBfcGFnZShtZGV2LT5wZGV2LAorCQkJZm9yIChpID0gMDsgaSA8IGZyYWdzOyBpKyspIHsKKwkJCQkvKiBDaGVjayBmb3Igd3JhcGFyb3VuZCBiZWZvcmUgdW5tYXBwaW5nICovCisJCQkJaWYgKCh2b2lkICopIGRhdGEgPj0gZW5kKQorCQkJCQlkYXRhID0gKHN0cnVjdCBtbHg0X3dxZV9kYXRhX3NlZyAqKSByaW5nLT5idWY7CisJCQkJZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOworCQkJCXBjaV91bm1hcF9wYWdlKG1kZXYtPnBkZXYsCiAJCQkJCShkbWFfYWRkcl90KSBiZTY0X3RvX2NwdShkYXRhLT5hZGRyKSwKIAkJCQkJIGZyYWctPnNpemUsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJfQogCQl9CiAJCS8qIFN0YW1wIHRoZSBmcmVlZCBkZXNjcmlwdG9yICovCiAJCWZvciAoaSA9IDA7IGkgPCB0eF9pbmZvLT5ucl90eGJiICogVFhCQl9TSVpFOyBpICs9IFNUQU1QX1NUUklERSkgewpAQCAtNzkwLDggKzc5NCwxMSBAQAogCQkJd21iKCk7CiAJCQlkYXRhLT5ieXRlX2NvdW50ID0gY3B1X3RvX2JlMzIoc2tiX2hlYWRsZW4oc2tiKSAtIGxzb19oZWFkZXJfc2l6ZSk7CiAJCX0KLQl9IGVsc2UKKwkJdHhfaW5mby0+aW5sID0gMDsKKwl9IGVsc2UgewogCQlidWlsZF9pbmxpbmVfd3FlKHR4X2Rlc2MsIHNrYiwgcmVhbF9zaXplLCAmdmxhbl90YWcsIHR4X2luZCwgZnJhZ3B0cik7CisJCXR4X2luZm8tPmlubCA9IDE7CisJfQogCiAJcmluZy0+cHJvZCArPSBucl90eGJiOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tbHg0L21seDRfZW4uaCBiL2RyaXZlcnMvbmV0L21seDQvbWx4NF9lbi5oCmluZGV4IDJlOTZjN2IuLmU5YWYzMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21seDQvbWx4NF9lbi5oCisrKyBiL2RyaXZlcnMvbmV0L21seDQvbWx4NF9lbi5oCkBAIC0xMTUsNiArMTE1LDEwIEBACiB9OwogI2RlZmluZSBNTFg0X0VOX01BWF9SWF9GUkFHUwk0CiAKKy8qIE1heGltdW0gcmluZyBzaXplcyAqLworI2RlZmluZSBNTFg0X0VOX01BWF9UWF9TSVpFCTgxOTIKKyNkZWZpbmUgTUxYNF9FTl9NQVhfUlhfU0laRQk4MTkyCisKIC8qIE1pbmltdW0gcmluZyBzaXplIGZvciBvdXIgcGFnZS1hbGxvY2F0aW9uIHNjZW1lIHRvIHdvcmsgKi8KICNkZWZpbmUgTUxYNF9FTl9NSU5fUlhfU0laRQkoTUxYNF9FTl9BTExPQ19TSVpFIC8gU01QX0NBQ0hFX0JZVEVTKQogI2RlZmluZSBNTFg0X0VOX01JTl9UWF9TSVpFCSg0MDk2IC8gVFhCQl9TSVpFKQpAQCAtMjAyLDYgKzIwNiw3IEBACiAJdTMyIG5yX3R4YmI7CiAJdTggbGluZWFyOwogCXU4IGRhdGFfb2Zmc2V0OworCXU4IGlubDsKIH07CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbXlyaTEwZ2UvbXlyaTEwZ2UuYyBiL2RyaXZlcnMvbmV0L215cmkxMGdlL215cmkxMGdlLmMKaW5kZXggNWU3MDE4MC4uNmJiNzFiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbXlyaTEwZ2UvbXlyaTEwZ2UuYworKysgYi9kcml2ZXJzL25ldC9teXJpMTBnZS9teXJpMTBnZS5jCkBAIC03NSw3ICs3NSw3IEBACiAjaW5jbHVkZSAibXlyaTEwZ2VfbWNwLmgiCiAjaW5jbHVkZSAibXlyaTEwZ2VfbWNwX2dlbl9oZWFkZXIuaCIKIAotI2RlZmluZSBNWVJJMTBHRV9WRVJTSU9OX1NUUiAiMS40LjQtMS4zOTUiCisjZGVmaW5lIE1ZUkkxMEdFX1ZFUlNJT05fU1RSICIxLjQuNC0xLjM5OCIKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJNeXJpY29tIDEwRyBkcml2ZXIgKDEwR2JFKSIpOwogTU9EVUxFX0FVVEhPUigiTWFpbnRhaW5lcjogaGVscEBteXJpLmNvbSIpOwpAQCAtMzkyOSw2ICszOTI5LDEwIEBACiAJbXlyaTEwZ2VfZHVtbXlfcmRtYShtZ3AsIDApOwogCiBhYm9ydF93aXRoX2lvcmVtYXA6CisJaWYgKG1ncC0+bWFjX2FkZHJfc3RyaW5nICE9IE5VTEwpCisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJteXJpMTBnZV9wcm9iZSgpIGZhaWxlZDogTUFDPSVzLCBTTj0lbGRcbiIsCisJCQltZ3AtPm1hY19hZGRyX3N0cmluZywgbWdwLT5zZXJpYWxfbnVtYmVyKTsKIAlpb3VubWFwKG1ncC0+c3JhbSk7CiAKIGFib3J0X3dpdGhfbXRycjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25hdHNlbWkuYyBiL2RyaXZlcnMvbmV0L25hdHNlbWkuYwppbmRleCA0NzhlZGI5Li5jNWRlYzU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uYXRzZW1pLmMKKysrIGIvZHJpdmVycy9uZXQvbmF0c2VtaS5jCkBAIC03NzksNiArNzc5LDIyIEBACiAKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBuYXRzZW1pX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCQk9IG5ldGRldl9vcGVuLAorCS5uZG9fc3RvcAkJPSBuZXRkZXZfY2xvc2UsCisJLm5kb19zdGFydF94bWl0CQk9IHN0YXJ0X3R4LAorCS5uZG9fZ2V0X3N0YXRzCQk9IGdldF9zdGF0cywKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IHNldF9yeF9tb2RlLAorCS5uZG9fY2hhbmdlX210dQkJPSBuYXRzZW1pX2NoYW5nZV9tdHUsCisJLm5kb19kb19pb2N0bAkJPSBuZXRkZXZfaW9jdGwsCisJLm5kb190eF90aW1lb3V0IAk9IG5zX3R4X3RpbWVvdXQsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgCT0gZXRoX21hY19hZGRyLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJLm5kb19wb2xsX2NvbnRyb2xsZXIJPSBuYXRzZW1pX3BvbGxfY29udHJvbGxlciwKKyNlbmRpZgorfTsKKwogc3RhdGljIGludCBfX2RldmluaXQgbmF0c2VtaV9wcm9iZTEgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CkBAIC05MTEsMjAgKzkyNyw5IEBACiAJaWYgKGZpbmRfY250IDwgTUFYX1VOSVRTICAmJiAgZnVsbF9kdXBsZXhbZmluZF9jbnRdKQogCQlucC0+ZnVsbF9kdXBsZXggPSAxOwogCi0JLyogVGhlIGNoaXAtc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KLQlkZXYtPm9wZW4gPSAmbmV0ZGV2X29wZW47Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmc3RhcnRfdHg7Ci0JZGV2LT5zdG9wID0gJm5ldGRldl9jbG9zZTsKLQlkZXYtPmdldF9zdGF0cyA9ICZnZXRfc3RhdHM7Ci0JZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X3J4X21vZGU7Ci0JZGV2LT5jaGFuZ2VfbXR1ID0gJm5hdHNlbWlfY2hhbmdlX210dTsKLQlkZXYtPmRvX2lvY3RsID0gJm5ldGRldl9pb2N0bDsKLQlkZXYtPnR4X3RpbWVvdXQgPSAmbnNfdHhfdGltZW91dDsKKwlkZXYtPm5ldGRldl9vcHMgPSAmbmF0c2VtaV9uZXRkZXZfb3BzOwogCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOwogCi0jaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKLQlkZXYtPnBvbGxfY29udHJvbGxlciA9ICZuYXRzZW1pX3BvbGxfY29udHJvbGxlcjsKLSNlbmRpZgogCVNFVF9FVEhUT09MX09QUyhkZXYsICZldGh0b29sX29wcyk7CiAKIAlpZiAobXR1KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbnM4MzgyMC5jIGIvZHJpdmVycy9uZXQvbnM4MzgyMC5jCmluZGV4IDQ2YjA3NzIuLjQyMDIxYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L25zODM4MjAuYworKysgYi9kcml2ZXJzL25ldC9uczgzODIwLmMKQEAgLTE5NTcsNiArMTk1Nyw5IEBACiAJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBuczgzODIwX3NldF9tdWx0aWNhc3QsCiAJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCiAJLm5kb190eF90aW1lb3V0CQk9IG5zODM4MjBfdHhfdGltZW91dCwKKyNpZmRlZiBOUzgzODIwX1ZMQU5fQUNDRUxfU1VQUE9SVAorCS5uZG9fdmxhbl9yeF9yZWdpc3Rlcgk9IG5zODM4MjBfdmxhbl9yeF9yZWdpc3RlciwKKyNlbmRpZgogfTsKIAogc3RhdGljIGludCBfX2RldmluaXQgbnM4MzgyMF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwKQEAgLTIyMTYsNyArMjIxOSw2IEBACiAjaWZkZWYgTlM4MzgyMF9WTEFOX0FDQ0VMX1NVUFBPUlQKIAkvKiBXZSBhbHNvIHN1cHBvcnQgaGFyZHdhcmUgdmxhbiBhY2NlbGVyYXRpb24gKi8KIAluZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hXX1ZMQU5fVFggfCBORVRJRl9GX0hXX1ZMQU5fUlg7Ci0JbmRldi0+dmxhbl9yeF9yZWdpc3RlciA9IG5zODM4MjBfdmxhbl9yeF9yZWdpc3RlcjsKICNlbmRpZgogCiAJaWYgKHVzaW5nX2RhYykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNuZXQzMi5jIGIvZHJpdmVycy9uZXQvcGNuZXQzMi5jCmluZGV4IDA0NGI3YjAuLjY2NWE0MjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BjbmV0MzIuYworKysgYi9kcml2ZXJzL25ldC9wY25ldDMyLmMKQEAgLTE1NjgsNiArMTU2OCwyMiBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgcGNuZXQzMl9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbgkJPSBwY25ldDMyX29wZW4sCisJLm5kb19zdG9wIAkJPSBwY25ldDMyX2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdAkJPSBwY25ldDMyX3N0YXJ0X3htaXQsCisJLm5kb190eF90aW1lb3V0CQk9IHBjbmV0MzJfdHhfdGltZW91dCwKKwkubmRvX2dldF9zdGF0cwkJPSBwY25ldDMyX2dldF9zdGF0cywKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IHBjbmV0MzJfc2V0X211bHRpY2FzdF9saXN0LAorCS5uZG9fZG9faW9jdGwJCT0gcGNuZXQzMl9pb2N0bCwKKwkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgCT0gZXRoX21hY19hZGRyLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJLm5kb19wb2xsX2NvbnRyb2xsZXIJPSBwY25ldDMyX3BvbGxfY29udHJvbGxlciwKKyNlbmRpZgorfTsKKwogLyogcGNuZXQzMl9wcm9iZTEKICAqICBDYWxsZWQgZnJvbSBib3RoIHBjbmV0MzJfcHJvYmVfdmxidXMgYW5kIHBjbmV0X3Byb2JlX3BjaS4KICAqICBwZGV2IHdpbGwgYmUgTlVMTCB3aGVuIGNhbGxlZCBmcm9tIHBjbmV0MzJfcHJvYmVfdmxidXMuCkBAIC0xOTM0LDIwICsxOTUwLDEwIEBACiAJbHAtPndhdGNoZG9nX3RpbWVyLmZ1bmN0aW9uID0gKHZvaWQgKikmcGNuZXQzMl93YXRjaGRvZzsKIAogCS8qIFRoZSBQQ05FVDMyLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCi0JZGV2LT5vcGVuID0gJnBjbmV0MzJfb3BlbjsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZwY25ldDMyX3N0YXJ0X3htaXQ7Ci0JZGV2LT5zdG9wID0gJnBjbmV0MzJfY2xvc2U7Ci0JZGV2LT5nZXRfc3RhdHMgPSAmcGNuZXQzMl9nZXRfc3RhdHM7Ci0JZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmcGNuZXQzMl9zZXRfbXVsdGljYXN0X2xpc3Q7Ci0JZGV2LT5kb19pb2N0bCA9ICZwY25ldDMyX2lvY3RsOworCWRldi0+bmV0ZGV2X29wcyA9ICZwY25ldDMyX25ldGRldl9vcHM7CiAJZGV2LT5ldGh0b29sX29wcyA9ICZwY25ldDMyX2V0aHRvb2xfb3BzOwotCWRldi0+dHhfdGltZW91dCA9IHBjbmV0MzJfdHhfdGltZW91dDsKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gKDUgKiBIWik7CiAKLSNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgotCWRldi0+cG9sbF9jb250cm9sbGVyID0gcGNuZXQzMl9wb2xsX2NvbnRyb2xsZXI7Ci0jZW5kaWYKLQogCS8qIEZpbGwgaW4gdGhlIGdlbmVyaWMgZmllbGRzIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLwogCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSkKIAkJZ290byBlcnJfZnJlZV9yaW5nOwpAQCAtMjI3Niw3ICsyMjgyLDcgQEAKIAlpZiAobHAtPmNoaXBfdmVyc2lvbiA+PSBQQ05FVDMyXzc5Qzk3MEEpIHsKIAkJLyogUHJpbnQgdGhlIGxpbmsgc3RhdHVzIGFuZCBzdGFydCB0aGUgd2F0Y2hkb2cgKi8KIAkJcGNuZXQzMl9jaGVja19tZWRpYShkZXYsIDEpOwotCQltb2RfdGltZXIoJihscC0+d2F0Y2hkb2dfdGltZXIpLCBQQ05FVDMyX1dBVENIRE9HX1RJTUVPVVQpOworCQltb2RfdGltZXIoJmxwLT53YXRjaGRvZ190aW1lciwgUENORVQzMl9XQVRDSERPR19USU1FT1VUKTsKIAl9CiAKIAlpID0gMDsKQEAgLTI5MTEsNyArMjkxNyw3IEBACiAJcGNuZXQzMl9jaGVja19tZWRpYShkZXYsIDApOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CiAKLQltb2RfdGltZXIoJihscC0+d2F0Y2hkb2dfdGltZXIpLCBQQ05FVDMyX1dBVENIRE9HX1RJTUVPVVQpOworCW1vZF90aW1lcigmbHAtPndhdGNoZG9nX3RpbWVyLCByb3VuZF9qaWZmaWVzKFBDTkVUMzJfV0FUQ0hET0dfVElNRU9VVCkpOwogfQogCiBzdGF0aWMgaW50IHBjbmV0MzJfcG1fc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGxpcC5jIGIvZHJpdmVycy9uZXQvcGxpcC5jCmluZGV4IDBjNDZkNjAuLjBiZTBmMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BsaXAuYworKysgYi9kcml2ZXJzL25ldC9wbGlwLmMKQEAgLTI2NSw2ICsyNjUsMTMgQEAKIAkuY2FjaGUgID0gcGxpcF9oYXJkX2hlYWRlcl9jYWNoZSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgcGxpcF9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbgkJID0gcGxpcF9vcGVuLAorCS5uZG9fc3RvcAkJID0gcGxpcF9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJCSA9IHBsaXBfdHhfcGFja2V0LAorCS5uZG9fZG9faW9jdGwJCSA9IHBsaXBfaW9jdGwsCit9OworCiAvKiBFbnRyeSBwb2ludCBvZiBQTElQIGRyaXZlci4KICAgIFByb2JlIHRoZSBoYXJkd2FyZSwgYW5kIHJlZ2lzdGVyL2luaXRpYWxpemUgdGhlIGRyaXZlci4KIApAQCAtMjgwLDE1ICsyODcsMTEgQEAKIAlzdHJ1Y3QgbmV0X2xvY2FsICpubCA9IG5ldGRldl9wcml2KGRldik7CiAKIAkvKiBUaGVuLCBvdmVycmlkZSBwYXJ0cyBvZiBpdCAqLwotCWRldi0+aGFyZF9zdGFydF94bWl0CSA9IHBsaXBfdHhfcGFja2V0OwotCWRldi0+b3BlbgkJID0gcGxpcF9vcGVuOwotCWRldi0+c3RvcAkJID0gcGxpcF9jbG9zZTsKLQlkZXYtPmRvX2lvY3RsCQkgPSBwbGlwX2lvY3RsOwotCiAJZGV2LT50eF9xdWV1ZV9sZW4gCSA9IDEwOwogCWRldi0+ZmxhZ3MJICAgICAgICAgPSBJRkZfUE9JTlRPUE9JTlR8SUZGX05PQVJQOwogCW1lbXNldChkZXYtPmRldl9hZGRyLCAweGZjLCBFVEhfQUxFTik7CiAKKwlkZXYtPm5ldGRldl9vcHMJCSA9ICZwbGlwX25ldGRldl9vcHM7CiAJZGV2LT5oZWFkZXJfb3BzICAgICAgICAgID0gJnBsaXBfaGVhZGVyX29wczsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9xbGdlL3FsZ2UuaCBiL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZS5oCmluZGV4IGJhMmUxYzViLi40NTk2NjNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9xbGdlL3FsZ2UuaAorKysgYi9kcml2ZXJzL25ldC9xbGdlL3FsZ2UuaApAQCAtODE4LDE1ICs4MTgsNiBAQAogfTsKIAogLyogREFUQSBTVFJVQ1RVUkVTIFNIQVJFRCBXSVRIIEhBUkRXQVJFLiAqLwotCi1zdHJ1Y3QgYnFfZWxlbWVudCB7Ci0JdTMyIGFkZHJfbG87Ci0jZGVmaW5lIEJRX0VORAkweDAwMDAwMDAxCi0jZGVmaW5lIEJRX0NPTlQJMHgwMDAwMDAwMgotI2RlZmluZSBCUV9NQVNLCTB4MDAwMDAwMDMKLQl1MzIgYWRkcl9oaTsKLX0gX19hdHRyaWJ1dGUoKHBhY2tlZCkpOwotCiBzdHJ1Y3QgdHhfYnVmX2Rlc2MgewogCV9fbGU2NCBhZGRyOwogCV9fbGUzMiBsZW47CkBAIC04NjAsOCArODUxLDggQEAKIAlfX2xlMTYgZnJhbWVfbGVuOwogI2RlZmluZSBPQl9NQUNfSU9DQl9MRU5fTUFTSyAweDNmZmZmCiAJX19sZTE2IHJlc2VydmVkMjsKLQlfX2xlMzIgdGlkOwotCV9fbGUzMiB0eHFfaWR4OworCXUzMiB0aWQ7CisJdTMyIHR4cV9pZHg7CiAJX19sZTMyIHJlc2VydmVkMzsKIAlfX2xlMTYgdmxhbl90Y2k7CiAJX19sZTE2IHJlc2VydmVkNDsKQEAgLTg4MCw4ICs4NzEsOCBAQAogCXU4IGZsYWdzMjsJCS8qICovCiAJdTggZmxhZ3MzOwkJLyogKi8KICNkZWZpbmUgT0JfTUFDX0lPQ0JfUlNQX0IJMHg4MAkvKiAqLwotCV9fbGUzMiB0aWQ7Ci0JX19sZTMyIHR4cV9pZHg7CisJdTMyIHRpZDsKKwl1MzIgdHhxX2lkeDsKIAlfX2xlMzIgcmVzZXJ2ZWRbMTNdOwogfSBfX2F0dHJpYnV0ZSgocGFja2VkKSk7CiAKQEAgLTkwMyw4ICs4OTQsOCBAQAogI2RlZmluZSBPQl9NQUNfVFNPX0lPQ0JfVgkweDA0CiAJX19sZTMyIHJlc2VydmVkMVsyXTsKIAlfX2xlMzIgZnJhbWVfbGVuOwotCV9fbGUzMiB0aWQ7Ci0JX19sZTMyIHR4cV9pZHg7CisJdTMyIHRpZDsKKwl1MzIgdHhxX2lkeDsKIAlfX2xlMTYgdG90YWxfaGRyc19sZW47CiAJX19sZTE2IG5ldF90cmFuc19vZmZzZXQ7CiAjZGVmaW5lIE9CX01BQ19UUkFOU1BPUlRfSERSX1NISUZUIDYKQEAgLTkyNSw4ICs5MTYsOCBAQAogCXU4IGZsYWdzMjsJCS8qICovCiAJdTggZmxhZ3MzOwkJLyogKi8KICNkZWZpbmUgT0JfTUFDX1RTT19JT0NCX1JTUF9CCTB4ODAwMAotCV9fbGUzMiB0aWQ7Ci0JX19sZTMyIHR4cV9pZHg7CisJdTMyIHRpZDsKKwl1MzIgdHhxX2lkeDsKIAlfX2xlMzIgcmVzZXJ2ZWQyWzEzXTsKIH0gX19hdHRyaWJ1dGUoKHBhY2tlZCkpOwogCkBAIC05NzksMTAgKzk3MCwxMSBAQAogCiAJX19sZTE2IHJlc2VydmVkMTsKIAlfX2xlMzIgcmVzZXJ2ZWQyWzZdOwotCV9fbGUzMiBmbGFnczQ7Ci0jZGVmaW5lIElCX01BQ19JT0NCX1JTUF9IVgkweDIwMDAwMDAwCS8qICovCi0jZGVmaW5lIElCX01BQ19JT0NCX1JTUF9IUwkweDQwMDAwMDAwCS8qICovCi0jZGVmaW5lIElCX01BQ19JT0NCX1JTUF9ITAkweDgwMDAwMDAwCS8qICovCisJdTggcmVzZXJ2ZWQzWzNdOworCXU4IGZsYWdzNDsKKyNkZWZpbmUgSUJfTUFDX0lPQ0JfUlNQX0hWCTB4MjAKKyNkZWZpbmUgSUJfTUFDX0lPQ0JfUlNQX0hTCTB4NDAKKyNkZWZpbmUgSUJfTUFDX0lPQ0JfUlNQX0hMCTB4ODAKIAlfX2xlMzIgaGRyX2xlbjsJCS8qICovCiAJX19sZTMyIGhkcl9hZGRyX2xvOwkvKiAqLwogCV9fbGUzMiBoZHJfYWRkcl9oaTsJLyogKi8KQEAgLTExMjYsNyArMTExOCw3IEBACiBzdHJ1Y3QgdHhfcmluZ19kZXNjIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBvYl9tYWNfaW9jYl9yZXEgKnF1ZXVlX2VudHJ5OwotCWludCBpbmRleDsKKwl1MzIgaW5kZXg7CiAJc3RydWN0IG9hbCBvYWw7CiAJc3RydWN0IG1hcF9saXN0IG1hcFtNQVhfU0tCX0ZSQUdTICsgMV07CiAJaW50IG1hcF9jbnQ7CkBAIC0xMTM4LDggKzExMzAsOCBAQAogCQlzdHJ1Y3QgcGFnZSAqbGJxX3BhZ2U7CiAJCXN0cnVjdCBza19idWZmICpza2I7CiAJfSBwOwotCXN0cnVjdCBicV9lbGVtZW50ICpicTsKLQlpbnQgaW5kZXg7CisJX19sZTY0ICphZGRyOworCXUzMiBpbmRleDsKIAkgREVDTEFSRV9QQ0lfVU5NQVBfQUREUihtYXBhZGRyKTsKIAkgREVDTEFSRV9QQ0lfVU5NQVBfTEVOKG1hcGxlbik7CiB9OwpAQCAtMTE4OSw3ICsxMTgxLDcgQEAKIAl1MzIgY3Ffc2l6ZTsKIAl1MzIgY3FfbGVuOwogCXUxNiBjcV9pZDsKLQl1MzIgKnByb2RfaWR4X3NoX3JlZzsJLyogU2hhZG93ZWQgcHJvZHVjZXIgcmVnaXN0ZXIuICovCisJdm9sYXRpbGUgX19sZTMyICpwcm9kX2lkeF9zaF9yZWc7CS8qIFNoYWRvd2VkIHByb2R1Y2VyIHJlZ2lzdGVyLiAqLwogCWRtYV9hZGRyX3QgcHJvZF9pZHhfc2hfcmVnX2RtYTsKIAl2b2lkIF9faW9tZW0gKmNuc21yX2lkeF9kYl9yZWc7CS8qIFBDSSBkb29yYmVsbCBtZW0gYXJlYSArIDAgKi8KIAl1MzIgY25zbXJfaWR4OwkJLyogY3VycmVudCBzdyBpZHggKi8KQEAgLTE0NjcsMjEgKzE0NTksNiBAQAogCW1taW93YigpOwogfQogCi0vKgotICogU2hhZG93IFJlZ2lzdGVyczoKLSAqIE91dGJvdW5kIHF1ZXVlcyBoYXZlIGEgY29uc3VtZXIgaW5kZXggdGhhdCBpcyBtYWludGFpbmVkIGJ5IHRoZSBjaGlwLgotICogSW5ib3VuZCBxdWV1ZXMgaGF2ZSBhIHByb2R1Y2VyIGluZGV4IHRoYXQgaXMgbWFpbnRhaW5lZCBieSB0aGUgY2hpcC4KLSAqIEZvciBsb3dlciBvdmVyaGVhZCwgdGhlc2UgcmVnaXN0ZXJzIGFyZSAic2hhZG93ZWQiIHRvIGhvc3QgbWVtb3J5Ci0gKiB3aGljaCBhbGxvd3MgdGhlIGRldmljZSBkcml2ZXIgdG8gdHJhY2sgdGhlIHF1ZXVlIHByb2dyZXNzIHdpdGhvdXQKLSAqIFBDSSByZWFkcy4gV2hlbiBhbiBlbnRyeSBpcyBwbGFjZWQgb24gYW4gaW5ib3VuZCBxdWV1ZSwgdGhlIGNoaXAgd2lsbAotICogdXBkYXRlIHRoZSByZWxldmFudCBpbmRleCByZWdpc3RlciBhbmQgdGhlbiBjb3B5IHRoZSB2YWx1ZSB0byB0aGUKLSAqIHNoYWRvdyByZWdpc3RlciBpbiBob3N0IG1lbW9yeS4KLSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcWxfcmVhZF9zaF9yZWcoY29uc3Qgdm9sYXRpbGUgdm9pZCAgKmFkZHIpCi17Ci0JcmV0dXJuICoodm9sYXRpbGUgdW5zaWduZWQgaW50IF9fZm9yY2UgKilhZGRyOwotfQotCiBleHRlcm4gY2hhciBxbGdlX2RyaXZlcl9uYW1lW107CiBleHRlcm4gY29uc3QgY2hhciBxbGdlX2RyaXZlcl92ZXJzaW9uW107CiBleHRlcm4gY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIHFsZ2VfZXRodG9vbF9vcHM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9xbGdlL3FsZ2VfZGJnLmMgYi9kcml2ZXJzL25ldC9xbGdlL3FsZ2VfZGJnLmMKaW5kZXggNDdkZjMwNC4uM2Y1ZTAyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcWxnZS9xbGdlX2RiZy5jCisrKyBiL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZV9kYmcuYwpAQCAtODIxLDE0ICs4MjEsMTEgQEAKIAkJICAgICAgIGxlMTZfdG9fY3B1KGliX21hY19yc3AtPnZsYW5faWQpKTsKIAogCXByaW50ayhLRVJOX0VSUiBQRlggImZsYWdzNCA9ICVzJXMlcy5cbiIsCi0JICAgICAgIGxlMzJfdG9fY3B1KGliX21hY19yc3AtPgotCQkJICAgZmxhZ3M0KSAmIElCX01BQ19JT0NCX1JTUF9IViA/ICJIViAiIDogIiIsCi0JICAgICAgIGxlMzJfdG9fY3B1KGliX21hY19yc3AtPgotCQkJICAgZmxhZ3M0KSAmIElCX01BQ19JT0NCX1JTUF9IUyA/ICJIUyAiIDogIiIsCi0JICAgICAgIGxlMzJfdG9fY3B1KGliX21hY19yc3AtPgotCQkJICAgZmxhZ3M0KSAmIElCX01BQ19JT0NCX1JTUF9ITCA/ICJITCAiIDogIiIpOworCQlpYl9tYWNfcnNwLT5mbGFnczQgJiBJQl9NQUNfSU9DQl9SU1BfSFYgPyAiSFYgIiA6ICIiLAorCQlpYl9tYWNfcnNwLT5mbGFnczQgJiBJQl9NQUNfSU9DQl9SU1BfSFMgPyAiSFMgIiA6ICIiLAorCQlpYl9tYWNfcnNwLT5mbGFnczQgJiBJQl9NQUNfSU9DQl9SU1BfSEwgPyAiSEwgIiA6ICIiKTsKIAotCWlmIChsZTMyX3RvX2NwdShpYl9tYWNfcnNwLT5mbGFnczQpICYgSUJfTUFDX0lPQ0JfUlNQX0hWKSB7CisJaWYgKGliX21hY19yc3AtPmZsYWdzNCAmIElCX01BQ19JT0NCX1JTUF9IVikgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICJoZHIgbGVuZ3RoCT0gJWQuXG4iLAogCQkgICAgICAgbGUzMl90b19jcHUoaWJfbWFjX3JzcC0+aGRyX2xlbikpOwogCQlwcmludGsoS0VSTl9FUlIgUEZYICJoZHIgYWRkcl9oaSAgICA9IDB4JXguXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcWxnZS9xbGdlX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZV9ldGh0b29sLmMKaW5kZXggZWVmYjgxYi4uOWQ5MjJlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcWxnZS9xbGdlX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9xbGdlL3FsZ2VfZXRodG9vbC5jCkBAIC01Niw5ICs1Niw5IEBACiAJCWZvciAoaSA9IDE7IGkgPCBxZGV2LT5yc3NfcmluZ19maXJzdF9jcV9pZDsgaSsrLCByeF9yaW5nKyspIHsKIAkJCXJ4X3JpbmcgPSAmcWRldi0+cnhfcmluZ1tpXTsKIAkJCWNxaWNiID0gKHN0cnVjdCBjcWljYiAqKXJ4X3Jpbmc7Ci0JCQljcWljYi0+aXJxX2RlbGF5ID0gbGUxNl90b19jcHUocWRldi0+dHhfY29hbGVzY2VfdXNlY3MpOworCQkJY3FpY2ItPmlycV9kZWxheSA9IGNwdV90b19sZTE2KHFkZXYtPnR4X2NvYWxlc2NlX3VzZWNzKTsKIAkJCWNxaWNiLT5wa3RfZGVsYXkgPQotCQkJICAgIGxlMTZfdG9fY3B1KHFkZXYtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzKTsKKwkJCSAgICBjcHVfdG9fbGUxNihxZGV2LT50eF9tYXhfY29hbGVzY2VkX2ZyYW1lcyk7CiAJCQljcWljYi0+ZmxhZ3MgPSBGTEFHU19MSTsKIAkJCXN0YXR1cyA9IHFsX3dyaXRlX2NmZyhxZGV2LCBjcWljYiwgc2l6ZW9mKGNxaWNiKSwKIAkJCQkJCUNGR19MQ1EsIHJ4X3JpbmctPmNxX2lkKTsKQEAgLTc5LDkgKzc5LDkgQEAKIAkJICAgICBpKyspIHsKIAkJCXJ4X3JpbmcgPSAmcWRldi0+cnhfcmluZ1tpXTsKIAkJCWNxaWNiID0gKHN0cnVjdCBjcWljYiAqKXJ4X3Jpbmc7Ci0JCQljcWljYi0+aXJxX2RlbGF5ID0gbGUxNl90b19jcHUocWRldi0+cnhfY29hbGVzY2VfdXNlY3MpOworCQkJY3FpY2ItPmlycV9kZWxheSA9IGNwdV90b19sZTE2KHFkZXYtPnJ4X2NvYWxlc2NlX3VzZWNzKTsKIAkJCWNxaWNiLT5wa3RfZGVsYXkgPQotCQkJICAgIGxlMTZfdG9fY3B1KHFkZXYtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzKTsKKwkJCSAgICBjcHVfdG9fbGUxNihxZGV2LT5yeF9tYXhfY29hbGVzY2VkX2ZyYW1lcyk7CiAJCQljcWljYi0+ZmxhZ3MgPSBGTEFHU19MSTsKIAkJCXN0YXR1cyA9IHFsX3dyaXRlX2NmZyhxZGV2LCBjcWljYiwgc2l6ZW9mKGNxaWNiKSwKIAkJCQkJCUNGR19MQ1EsIHJ4X3JpbmctPmNxX2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZV9tYWluLmMgYi9kcml2ZXJzL25ldC9xbGdlL3FsZ2VfbWFpbi5jCmluZGV4IDcxOGE3YmQuLmY0YzAxNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZV9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvcWxnZS9xbGdlX21haW4uYwpAQCAtMjU3LDcgKzI1Nyw3IEBACiAJCXsKIAkJCXN0YXR1cyA9CiAJCQkgICAgcWxfd2FpdF9yZWdfcmR5KHFkZXYsCi0JCQkJTUFDX0FERFJfSURYLCBNQUNfQUREUl9NVywgTUFDX0FERFJfRSk7CisJCQkJTUFDX0FERFJfSURYLCBNQUNfQUREUl9NVywgMCk7CiAJCQlpZiAoc3RhdHVzKQogCQkJCWdvdG8gZXhpdDsKIAkJCXFsX3dyaXRlMzIocWRldiwgTUFDX0FERFJfSURYLCAob2Zmc2V0KyspIHwgLyogb2Zmc2V0ICovCkBAIC0yNjUsMTMgKzI2NSwxMyBAQAogCQkJCSAgIE1BQ19BRERSX0FEUiB8IE1BQ19BRERSX1JTIHwgdHlwZSk7IC8qIHR5cGUgKi8KIAkJCXN0YXR1cyA9CiAJCQkgICAgcWxfd2FpdF9yZWdfcmR5KHFkZXYsCi0JCQkJTUFDX0FERFJfSURYLCBNQUNfQUREUl9NUiwgTUFDX0FERFJfRSk7CisJCQkJTUFDX0FERFJfSURYLCBNQUNfQUREUl9NUiwgMCk7CiAJCQlpZiAoc3RhdHVzKQogCQkJCWdvdG8gZXhpdDsKIAkJCSp2YWx1ZSsrID0gcWxfcmVhZDMyKHFkZXYsIE1BQ19BRERSX0RBVEEpOwogCQkJc3RhdHVzID0KIAkJCSAgICBxbF93YWl0X3JlZ19yZHkocWRldiwKLQkJCQlNQUNfQUREUl9JRFgsIE1BQ19BRERSX01XLCBNQUNfQUREUl9FKTsKKwkJCQlNQUNfQUREUl9JRFgsIE1BQ19BRERSX01XLCAwKTsKIAkJCWlmIChzdGF0dXMpCiAJCQkJZ290byBleGl0OwogCQkJcWxfd3JpdGUzMihxZGV2LCBNQUNfQUREUl9JRFgsIChvZmZzZXQrKykgfCAvKiBvZmZzZXQgKi8KQEAgLTI3OSwxNCArMjc5LDE0IEBACiAJCQkJICAgTUFDX0FERFJfQURSIHwgTUFDX0FERFJfUlMgfCB0eXBlKTsgLyogdHlwZSAqLwogCQkJc3RhdHVzID0KIAkJCSAgICBxbF93YWl0X3JlZ19yZHkocWRldiwKLQkJCQlNQUNfQUREUl9JRFgsIE1BQ19BRERSX01SLCBNQUNfQUREUl9FKTsKKwkJCQlNQUNfQUREUl9JRFgsIE1BQ19BRERSX01SLCAwKTsKIAkJCWlmIChzdGF0dXMpCiAJCQkJZ290byBleGl0OwogCQkJKnZhbHVlKysgPSBxbF9yZWFkMzIocWRldiwgTUFDX0FERFJfREFUQSk7CiAJCQlpZiAodHlwZSA9PSBNQUNfQUREUl9UWVBFX0NBTV9NQUMpIHsKIAkJCQlzdGF0dXMgPQogCQkJCSAgICBxbF93YWl0X3JlZ19yZHkocWRldiwKLQkJCQkJTUFDX0FERFJfSURYLCBNQUNfQUREUl9NVywgTUFDX0FERFJfRSk7CisJCQkJCU1BQ19BRERSX0lEWCwgTUFDX0FERFJfTVcsIDApOwogCQkJCWlmIChzdGF0dXMpCiAJCQkJCWdvdG8gZXhpdDsKIAkJCQlxbF93cml0ZTMyKHFkZXYsIE1BQ19BRERSX0lEWCwgKG9mZnNldCsrKSB8IC8qIG9mZnNldCAqLwpAQCAtMjk0LDcgKzI5NCw3IEBACiAJCQkJCSAgIE1BQ19BRERSX0FEUiB8IE1BQ19BRERSX1JTIHwgdHlwZSk7IC8qIHR5cGUgKi8KIAkJCQlzdGF0dXMgPQogCQkJCSAgICBxbF93YWl0X3JlZ19yZHkocWRldiwgTUFDX0FERFJfSURYLAotCQkJCQkJICAgIE1BQ19BRERSX01SLCBNQUNfQUREUl9FKTsKKwkJCQkJCSAgICBNQUNfQUREUl9NUiwgMCk7CiAJCQkJaWYgKHN0YXR1cykKIAkJCQkJZ290byBleGl0OwogCQkJCSp2YWx1ZSsrID0gcWxfcmVhZDMyKHFkZXYsIE1BQ19BRERSX0RBVEEpOwpAQCAtMzQ0LDcgKzM0NCw3IEBACiAKIAkJCXN0YXR1cyA9CiAJCQkgICAgcWxfd2FpdF9yZWdfcmR5KHFkZXYsCi0JCQkJTUFDX0FERFJfSURYLCBNQUNfQUREUl9NVywgTUFDX0FERFJfRSk7CisJCQkJTUFDX0FERFJfSURYLCBNQUNfQUREUl9NVywgMCk7CiAJCQlpZiAoc3RhdHVzKQogCQkJCWdvdG8gZXhpdDsKIAkJCXFsX3dyaXRlMzIocWRldiwgTUFDX0FERFJfSURYLCAob2Zmc2V0KyspIHwgLyogb2Zmc2V0ICovCkBAIC0zNTMsNyArMzUzLDcgQEAKIAkJCXFsX3dyaXRlMzIocWRldiwgTUFDX0FERFJfREFUQSwgbG93ZXIpOwogCQkJc3RhdHVzID0KIAkJCSAgICBxbF93YWl0X3JlZ19yZHkocWRldiwKLQkJCQlNQUNfQUREUl9JRFgsIE1BQ19BRERSX01XLCBNQUNfQUREUl9FKTsKKwkJCQlNQUNfQUREUl9JRFgsIE1BQ19BRERSX01XLCAwKTsKIAkJCWlmIChzdGF0dXMpCiAJCQkJZ290byBleGl0OwogCQkJcWxfd3JpdGUzMihxZGV2LCBNQUNfQUREUl9JRFgsIChvZmZzZXQrKykgfCAvKiBvZmZzZXQgKi8KQEAgLTM2Miw3ICszNjIsNyBAQAogCQkJcWxfd3JpdGUzMihxZGV2LCBNQUNfQUREUl9EQVRBLCB1cHBlcik7CiAJCQlzdGF0dXMgPQogCQkJICAgIHFsX3dhaXRfcmVnX3JkeShxZGV2LAotCQkJCU1BQ19BRERSX0lEWCwgTUFDX0FERFJfTVcsIE1BQ19BRERSX0UpOworCQkJCU1BQ19BRERSX0lEWCwgTUFDX0FERFJfTVcsIDApOwogCQkJaWYgKHN0YXR1cykKIAkJCQlnb3RvIGV4aXQ7CiAJCQlxbF93cml0ZTMyKHFkZXYsIE1BQ19BRERSX0lEWCwgKG9mZnNldCkgfAkvKiBvZmZzZXQgKi8KQEAgLTQwMCw3ICs0MDAsNyBAQAogCiAJCQlzdGF0dXMgPQogCQkJICAgIHFsX3dhaXRfcmVnX3JkeShxZGV2LAotCQkJCU1BQ19BRERSX0lEWCwgTUFDX0FERFJfTVcsIE1BQ19BRERSX0UpOworCQkJCU1BQ19BRERSX0lEWCwgTUFDX0FERFJfTVcsIDApOwogCQkJaWYgKHN0YXR1cykKIAkJCQlnb3RvIGV4aXQ7CiAJCQlxbF93cml0ZTMyKHFkZXYsIE1BQ19BRERSX0lEWCwgb2Zmc2V0IHwJLyogb2Zmc2V0ICovCkBAIC00MzEsMTMgKzQzMSwxMyBAQAogCWlmIChzdGF0dXMpCiAJCWdvdG8gZXhpdDsKIAotCXN0YXR1cyA9IHFsX3dhaXRfcmVnX3JkeShxZGV2LCBSVF9JRFgsIFJUX0lEWF9NVywgUlRfSURYX0UpOworCXN0YXR1cyA9IHFsX3dhaXRfcmVnX3JkeShxZGV2LCBSVF9JRFgsIFJUX0lEWF9NVywgMCk7CiAJaWYgKHN0YXR1cykKIAkJZ290byBleGl0OwogCiAJcWxfd3JpdGUzMihxZGV2LCBSVF9JRFgsCiAJCSAgIFJUX0lEWF9UWVBFX05JQ1EgfCBSVF9JRFhfUlMgfCAoaW5kZXggPDwgUlRfSURYX0lEWF9TSElGVCkpOwotCXN0YXR1cyA9IHFsX3dhaXRfcmVnX3JkeShxZGV2LCBSVF9JRFgsIFJUX0lEWF9NUiwgUlRfSURYX0UpOworCXN0YXR1cyA9IHFsX3dhaXRfcmVnX3JkeShxZGV2LCBSVF9JRFgsIFJUX0lEWF9NUiwgMCk7CiAJaWYgKHN0YXR1cykKIAkJZ290byBleGl0OwogCSp2YWx1ZSA9IHFsX3JlYWQzMihxZGV2LCBSVF9EQVRBKTsKQEAgLTg3NCw3ICs4NzQsNiBAQAogewogCWludCBjbGVhbl9pZHggPSByeF9yaW5nLT5sYnFfY2xlYW5faWR4OwogCXN0cnVjdCBicV9kZXNjICpsYnFfZGVzYzsKLQlzdHJ1Y3QgYnFfZWxlbWVudCAqYnE7CiAJdTY0IG1hcDsKIAlpbnQgaTsKIApAQCAtODg0LDcgKzg4Myw2IEBACiAJCQkJImxicTogdHJ5IGNsZWFuaW5nIGNsZWFuX2lkeCA9ICVkLlxuIiwKIAkJCQljbGVhbl9pZHgpOwogCQkJbGJxX2Rlc2MgPSAmcnhfcmluZy0+bGJxW2NsZWFuX2lkeF07Ci0JCQlicSA9IGxicV9kZXNjLT5icTsKIAkJCWlmIChsYnFfZGVzYy0+cC5sYnFfcGFnZSA9PSBOVUxMKSB7CiAJCQkJUVBSSU5USyhxZGV2LCBSWF9TVEFUVVMsIERFQlVHLAogCQkJCQkibGJxOiBnZXR0aW5nIG5ldyBwYWdlIGZvciBpbmRleCAlZC5cbiIsCkBAIC05MDYsMTAgKzkwNCw3IEBACiAJCQkJfQogCQkJCXBjaV91bm1hcF9hZGRyX3NldChsYnFfZGVzYywgbWFwYWRkciwgbWFwKTsKIAkJCQlwY2lfdW5tYXBfbGVuX3NldChsYnFfZGVzYywgbWFwbGVuLCBQQUdFX1NJWkUpOwotCQkJCWJxLT5hZGRyX2xvID0JLypsYnFfZGVzYy0+YWRkcl9sbyA9ICovCi0JCQkJICAgIGNwdV90b19sZTMyKG1hcCk7Ci0JCQkJYnEtPmFkZHJfaGkgPQkvKmxicV9kZXNjLT5hZGRyX2hpID0gKi8KLQkJCQkgICAgY3B1X3RvX2xlMzIobWFwID4+IDMyKTsKKwkJCQkqbGJxX2Rlc2MtPmFkZHIgPSBjcHVfdG9fbGU2NChtYXApOwogCQkJfQogCQkJY2xlYW5faWR4Kys7CiAJCQlpZiAoY2xlYW5faWR4ID09IHJ4X3JpbmctPmxicV9sZW4pCkBAIC05MzQsNyArOTI5LDYgQEAKIHsKIAlpbnQgY2xlYW5faWR4ID0gcnhfcmluZy0+c2JxX2NsZWFuX2lkeDsKIAlzdHJ1Y3QgYnFfZGVzYyAqc2JxX2Rlc2M7Ci0Jc3RydWN0IGJxX2VsZW1lbnQgKmJxOwogCXU2NCBtYXA7CiAJaW50IGk7CiAKQEAgLTk0NCw3ICs5MzgsNiBAQAogCQkJUVBSSU5USyhxZGV2LCBSWF9TVEFUVVMsIERFQlVHLAogCQkJCSJzYnE6IHRyeSBjbGVhbmluZyBjbGVhbl9pZHggPSAlZC5cbiIsCiAJCQkJY2xlYW5faWR4KTsKLQkJCWJxID0gc2JxX2Rlc2MtPmJxOwogCQkJaWYgKHNicV9kZXNjLT5wLnNrYiA9PSBOVUxMKSB7CiAJCQkJUVBSSU5USyhxZGV2LCBSWF9TVEFUVVMsIERFQlVHLAogCQkJCQkic2JxOiBnZXR0aW5nIG5ldyBza2IgZm9yIGluZGV4ICVkLlxuIiwKQEAgLTk2MywxMSArOTU2LDE1IEBACiAJCQkJCQkgICAgIHNicV9kZXNjLT5wLnNrYi0+ZGF0YSwKIAkJCQkJCSAgICAgcnhfcmluZy0+c2JxX2J1Zl9zaXplIC8KIAkJCQkJCSAgICAgMiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQlpZiAocGNpX2RtYV9tYXBwaW5nX2Vycm9yKHFkZXYtPnBkZXYsIG1hcCkpIHsKKwkJCQkJUVBSSU5USyhxZGV2LCBJRlVQLCBFUlIsICJQQ0kgbWFwcGluZyBmYWlsZWQuXG4iKTsKKwkJCQkJcnhfcmluZy0+c2JxX2NsZWFuX2lkeCA9IGNsZWFuX2lkeDsKKwkJCQkJcmV0dXJuOworCQkJCX0KIAkJCQlwY2lfdW5tYXBfYWRkcl9zZXQoc2JxX2Rlc2MsIG1hcGFkZHIsIG1hcCk7CiAJCQkJcGNpX3VubWFwX2xlbl9zZXQoc2JxX2Rlc2MsIG1hcGxlbiwKIAkJCQkJCSAgcnhfcmluZy0+c2JxX2J1Zl9zaXplIC8gMik7Ci0JCQkJYnEtPmFkZHJfbG8gPSBjcHVfdG9fbGUzMihtYXApOwotCQkJCWJxLT5hZGRyX2hpID0gY3B1X3RvX2xlMzIobWFwID4+IDMyKTsKKwkJCQkqc2JxX2Rlc2MtPmFkZHIgPSBjcHVfdG9fbGU2NChtYXApOwogCQkJfQogCiAJCQljbGVhbl9pZHgrKzsKQEAgLTEzMDMsNiArMTMwMCwxMSBAQAogCQkJCQkiTm8gc2tiIGF2YWlsYWJsZSwgZHJvcCB0aGUgcGFja2V0LlxuIik7CiAJCQkJcmV0dXJuIE5VTEw7CiAJCQl9CisJCQlwY2lfdW5tYXBfcGFnZShxZGV2LT5wZGV2LAorCQkJCSAgICAgICBwY2lfdW5tYXBfYWRkcihsYnFfZGVzYywKKwkJCQkJCSAgICAgIG1hcGFkZHIpLAorCQkJCSAgICAgICBwY2lfdW5tYXBfbGVuKGxicV9kZXNjLCBtYXBsZW4pLAorCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQkJc2tiX3Jlc2VydmUoc2tiLCBORVRfSVBfQUxJR04pOwogCQkJUVBSSU5USyhxZGV2LCBSWF9TVEFUVVMsIERFQlVHLAogCQkJCSIlZCBieXRlcyBvZiBoZWFkZXJzIGFuZCBkYXRhIGluIGxhcmdlLiBDaGFpbiBwYWdlIHRvIG5ldyBza2IgYW5kIHB1bGwgdGFpbC5cbiIsIGxlbmd0aCk7CkBAIC0xMzMwLDcgKzEzMzIsNyBAQAogCQkgKiAgICAgICAgICBldmVudHVhbGx5IGJlIGluIHRyb3VibGUuCiAJCSAqLwogCQlpbnQgc2l6ZSwgb2Zmc2V0LCBpID0gMDsKLQkJc3RydWN0IGJxX2VsZW1lbnQgKmJxLCBicV9hcnJheVs4XTsKKwkJX19sZTY0ICpicSwgYnFfYXJyYXlbOF07CiAJCXNicV9kZXNjID0gcWxfZ2V0X2N1cnJfc2J1ZihyeF9yaW5nKTsKIAkJcGNpX3VubWFwX3NpbmdsZShxZGV2LT5wZGV2LAogCQkJCSBwY2lfdW5tYXBfYWRkcihzYnFfZGVzYywgbWFwYWRkciksCkBAIC0xMzU2LDE2ICsxMzU4LDEwIEBACiAJCX0gZWxzZSB7CiAJCQlRUFJJTlRLKHFkZXYsIFJYX1NUQVRVUywgREVCVUcsCiAJCQkJIkhlYWRlcnMgaW4gc21hbGwsICVkIGJ5dGVzIG9mIGRhdGEgaW4gY2hhaW4gb2YgbGFyZ2UuXG4iLCBsZW5ndGgpOwotCQkJYnEgPSAoc3RydWN0IGJxX2VsZW1lbnQgKilzYnFfZGVzYy0+cC5za2ItPmRhdGE7CisJCQlicSA9IChfX2xlNjQgKilzYnFfZGVzYy0+cC5za2ItPmRhdGE7CiAJCX0KIAkJd2hpbGUgKGxlbmd0aCA+IDApIHsKIAkJCWxicV9kZXNjID0gcWxfZ2V0X2N1cnJfbGJ1ZihyeF9yaW5nKTsKLQkJCWlmICgoYnEtPmFkZHJfbG8gJiB+QlFfTUFTSykgIT0gbGJxX2Rlc2MtPmJxLT5hZGRyX2xvKSB7Ci0JCQkJUVBSSU5USyhxZGV2LCBSWF9TVEFUVVMsIEVSUiwKLQkJCQkJIlBhbmljISEhIGJhZCBsYXJnZSBidWZmZXIgYWRkcmVzcywgZXhwZWN0ZWQgMHglLjA4eCwgZ290IDB4JS4wOHguXG4iLAotCQkJCQlsYnFfZGVzYy0+YnEtPmFkZHJfbG8sIGJxLT5hZGRyX2xvKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KIAkJCXBjaV91bm1hcF9wYWdlKHFkZXYtPnBkZXYsCiAJCQkJICAgICAgIHBjaV91bm1hcF9hZGRyKGxicV9kZXNjLAogCQkJCQkJICAgICAgbWFwYWRkciksCkBAIC0xNTQ5LDcgKzE1NDUsNyBAQAogc3RhdGljIGludCBxbF9jbGVhbl9vdXRib3VuZF9yeF9yaW5nKHN0cnVjdCByeF9yaW5nICpyeF9yaW5nKQogewogCXN0cnVjdCBxbF9hZGFwdGVyICpxZGV2ID0gcnhfcmluZy0+cWRldjsKLQl1MzIgcHJvZCA9IHFsX3JlYWRfc2hfcmVnKHJ4X3JpbmctPnByb2RfaWR4X3NoX3JlZyk7CisJdTMyIHByb2QgPSBsZTMyX3RvX2NwdSgqcnhfcmluZy0+cHJvZF9pZHhfc2hfcmVnKTsKIAlzdHJ1Y3Qgb2JfbWFjX2lvY2JfcnNwICpuZXRfcnNwID0gTlVMTDsKIAlpbnQgY291bnQgPSAwOwogCkBAIC0xNTc1LDcgKzE1NzEsNyBAQAogCQl9CiAJCWNvdW50Kys7CiAJCXFsX3VwZGF0ZV9jcShyeF9yaW5nKTsKLQkJcHJvZCA9IHFsX3JlYWRfc2hfcmVnKHJ4X3JpbmctPnByb2RfaWR4X3NoX3JlZyk7CisJCXByb2QgPSBsZTMyX3RvX2NwdSgqcnhfcmluZy0+cHJvZF9pZHhfc2hfcmVnKTsKIAl9CiAJcWxfd3JpdGVfY3FfaWR4KHJ4X3JpbmcpOwogCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKHFkZXYtPm5kZXYpICYmIG5ldF9yc3AgIT0gTlVMTCkgewpAQCAtMTU5NSw3ICsxNTkxLDcgQEAKIHN0YXRpYyBpbnQgcWxfY2xlYW5faW5ib3VuZF9yeF9yaW5nKHN0cnVjdCByeF9yaW5nICpyeF9yaW5nLCBpbnQgYnVkZ2V0KQogewogCXN0cnVjdCBxbF9hZGFwdGVyICpxZGV2ID0gcnhfcmluZy0+cWRldjsKLQl1MzIgcHJvZCA9IHFsX3JlYWRfc2hfcmVnKHJ4X3JpbmctPnByb2RfaWR4X3NoX3JlZyk7CisJdTMyIHByb2QgPSBsZTMyX3RvX2NwdSgqcnhfcmluZy0+cHJvZF9pZHhfc2hfcmVnKTsKIAlzdHJ1Y3QgcWxfbmV0X3JzcF9pb2NiICpuZXRfcnNwOwogCWludCBjb3VudCA9IDA7CiAKQEAgLTE2MjgsNyArMTYyNCw3IEBACiAJCX0KIAkJY291bnQrKzsKIAkJcWxfdXBkYXRlX2NxKHJ4X3JpbmcpOwotCQlwcm9kID0gcWxfcmVhZF9zaF9yZWcocnhfcmluZy0+cHJvZF9pZHhfc2hfcmVnKTsKKwkJcHJvZCA9IGxlMzJfdG9fY3B1KCpyeF9yaW5nLT5wcm9kX2lkeF9zaF9yZWcpOwogCQlpZiAoY291bnQgPT0gYnVkZ2V0KQogCQkJYnJlYWs7CiAJfQpAQCAtMTc5MSw3ICsxNzg3LDcgQEAKIAkgKiBDaGVjayB0aGUgZGVmYXVsdCBxdWV1ZSBhbmQgd2FrZSBoYW5kbGVyIGlmIGFjdGl2ZS4KIAkgKi8KIAlyeF9yaW5nID0gJnFkZXYtPnJ4X3JpbmdbMF07Ci0JaWYgKHFsX3JlYWRfc2hfcmVnKHJ4X3JpbmctPnByb2RfaWR4X3NoX3JlZykgIT0gcnhfcmluZy0+Y25zbXJfaWR4KSB7CisJaWYgKGxlMzJfdG9fY3B1KCpyeF9yaW5nLT5wcm9kX2lkeF9zaF9yZWcpICE9IHJ4X3JpbmctPmNuc21yX2lkeCkgewogCQlRUFJJTlRLKHFkZXYsIElOVFIsIElORk8sICJXYWtpbmcgaGFuZGxlciBmb3IgcnhfcmluZ1swXS5cbiIpOwogCQlxbF9kaXNhYmxlX2NvbXBsZXRpb25faW50ZXJydXB0KHFkZXYsIGludHJfY29udGV4dC0+aW50cik7CiAJCXF1ZXVlX2RlbGF5ZWRfd29ya19vbihzbXBfcHJvY2Vzc29yX2lkKCksIHFkZXYtPnFfd29ya3F1ZXVlLApAQCAtMTgwNSw3ICsxODAxLDcgQEAKIAkJICovCiAJCWZvciAoaSA9IDE7IGkgPCBxZGV2LT5yeF9yaW5nX2NvdW50OyBpKyspIHsKIAkJCXJ4X3JpbmcgPSAmcWRldi0+cnhfcmluZ1tpXTsKLQkJCWlmIChxbF9yZWFkX3NoX3JlZyhyeF9yaW5nLT5wcm9kX2lkeF9zaF9yZWcpICE9CisJCQlpZiAobGUzMl90b19jcHUoKnJ4X3JpbmctPnByb2RfaWR4X3NoX3JlZykgIT0KIAkJCSAgICByeF9yaW5nLT5jbnNtcl9pZHgpIHsKIAkJCQlRUFJJTlRLKHFkZXYsIElOVFIsIElORk8sCiAJCQkJCSJXYWtpbmcgaGFuZGxlciBmb3IgcnhfcmluZ1slZF0uXG4iLCBpKTsKQEAgLTE4NzQsNyArMTg3MCw3IEBACiB7CiAJaW50IGxlbjsKIAlzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwotCXUxNiAqY2hlY2s7CisJX19zdW0xNiAqY2hlY2s7CiAJbWFjX2lvY2JfcHRyLT5vcGNvZGUgPSBPUENPREVfT0JfTUFDX1RTT19JT0NCOwogCW1hY19pb2NiX3B0ci0+ZnJhbWVfbGVuID0gY3B1X3RvX2xlMzIoKHUzMikgc2tiLT5sZW4pOwogCW1hY19pb2NiX3B0ci0+bmV0X3RyYW5zX29mZnNldCA9CkBAIC0yMDgzLDggKzIwNzksNiBAQAogCQkJcHV0X3BhZ2UobGJxX2Rlc2MtPnAubGJxX3BhZ2UpOwogCQkJbGJxX2Rlc2MtPnAubGJxX3BhZ2UgPSBOVUxMOwogCQl9Ci0JCWxicV9kZXNjLT5icS0+YWRkcl9sbyA9IDA7Ci0JCWxicV9kZXNjLT5icS0+YWRkcl9oaSA9IDA7CiAJfQogfQogCkBAIC0yMDk3LDEyICsyMDkxLDEyIEBACiAJaW50IGk7CiAJc3RydWN0IGJxX2Rlc2MgKmxicV9kZXNjOwogCXU2NCBtYXA7Ci0Jc3RydWN0IGJxX2VsZW1lbnQgKmJxID0gcnhfcmluZy0+bGJxX2Jhc2U7CisJX19sZTY0ICpicSA9IHJ4X3JpbmctPmxicV9iYXNlOwogCiAJZm9yIChpID0gMDsgaSA8IHJ4X3JpbmctPmxicV9sZW47IGkrKykgewogCQlsYnFfZGVzYyA9ICZyeF9yaW5nLT5sYnFbaV07CiAJCW1lbXNldChsYnFfZGVzYywgMCwgc2l6ZW9mKGxicV9kZXNjKSk7Ci0JCWxicV9kZXNjLT5icSA9IGJxOworCQlsYnFfZGVzYy0+YWRkciA9IGJxOwogCQlsYnFfZGVzYy0+aW5kZXggPSBpOwogCQlsYnFfZGVzYy0+cC5sYnFfcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0FUT01JQyk7CiAJCWlmICh1bmxpa2VseSghbGJxX2Rlc2MtPnAubGJxX3BhZ2UpKSB7CkBAIC0yMTE5LDggKzIxMTMsNyBAQAogCQkJfQogCQkJcGNpX3VubWFwX2FkZHJfc2V0KGxicV9kZXNjLCBtYXBhZGRyLCBtYXApOwogCQkJcGNpX3VubWFwX2xlbl9zZXQobGJxX2Rlc2MsIG1hcGxlbiwgUEFHRV9TSVpFKTsKLQkJCWJxLT5hZGRyX2xvID0gY3B1X3RvX2xlMzIobWFwKTsKLQkJCWJxLT5hZGRyX2hpID0gY3B1X3RvX2xlMzIobWFwID4+IDMyKTsKKwkJCSpsYnFfZGVzYy0+YWRkciA9IGNwdV90b19sZTY0KG1hcCk7CiAJCX0KIAkJYnErKzsKIAl9CkBAIC0yMTQ5LDEzICsyMTQyLDYgQEAKIAkJCWRldl9rZnJlZV9za2Ioc2JxX2Rlc2MtPnAuc2tiKTsKIAkJCXNicV9kZXNjLT5wLnNrYiA9IE5VTEw7CiAJCX0KLQkJaWYgKHNicV9kZXNjLT5icSA9PSBOVUxMKSB7Ci0JCQlRUFJJTlRLKHFkZXYsIElGVVAsIEVSUiwgInNicV9kZXNjLT5icSAlZCBpcyBOVUxMLlxuIiwKLQkJCQlpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzYnFfZGVzYy0+YnEtPmFkZHJfbG8gPSAwOwotCQlzYnFfZGVzYy0+YnEtPmFkZHJfaGkgPSAwOwogCX0KIH0KIApAQCAtMjE2NywxMyArMjE1MywxMyBAQAogCXN0cnVjdCBicV9kZXNjICpzYnFfZGVzYzsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXU2NCBtYXA7Ci0Jc3RydWN0IGJxX2VsZW1lbnQgKmJxID0gcnhfcmluZy0+c2JxX2Jhc2U7CisJX19sZTY0ICpicSA9IHJ4X3JpbmctPnNicV9iYXNlOwogCiAJZm9yIChpID0gMDsgaSA8IHJ4X3JpbmctPnNicV9sZW47IGkrKykgewogCQlzYnFfZGVzYyA9ICZyeF9yaW5nLT5zYnFbaV07CiAJCW1lbXNldChzYnFfZGVzYywgMCwgc2l6ZW9mKHNicV9kZXNjKSk7CiAJCXNicV9kZXNjLT5pbmRleCA9IGk7Ci0JCXNicV9kZXNjLT5icSA9IGJxOworCQlzYnFfZGVzYy0+YWRkciA9IGJxOwogCQlza2IgPSBuZXRkZXZfYWxsb2Nfc2tiKHFkZXYtPm5kZXYsIHJ4X3JpbmctPnNicV9idWZfc2l6ZSk7CiAJCWlmICh1bmxpa2VseSghc2tiKSkgewogCQkJLyogQmV0dGVyIGx1Y2sgbmV4dCByb3VuZCAqLwpAQCAtMjE5OSwxMCArMjE4NSw3IEBACiAJCX0KIAkJcGNpX3VubWFwX2FkZHJfc2V0KHNicV9kZXNjLCBtYXBhZGRyLCBtYXApOwogCQlwY2lfdW5tYXBfbGVuX3NldChzYnFfZGVzYywgbWFwbGVuLCByeF9yaW5nLT5zYnFfYnVmX3NpemUgLyAyKTsKLQkJYnEtPmFkZHJfbG8gPQkvKnNicV9kZXNjLT5hZGRyX2xvID0gKi8KLQkJICAgIGNwdV90b19sZTMyKG1hcCk7Ci0JCWJxLT5hZGRyX2hpID0JLypzYnFfZGVzYy0+YWRkcl9oaSA9ICovCi0JCSAgICBjcHVfdG9fbGUzMihtYXAgPj4gMzIpOworCQkqc2JxX2Rlc2MtPmFkZHIgPSBjcHVfdG9fbGU2NChtYXApOwogCQlicSsrOwogCX0KIAlyZXR1cm4gMDsKQEAgLTI0ODEsNyArMjQ2NCw4IEBACiAJbWVtc2V0KCh2b2lkICopY3FpY2IsIDAsIHNpemVvZihzdHJ1Y3QgY3FpY2IpKTsKIAljcWljYi0+bXNpeF92ZWN0ID0gcnhfcmluZy0+aXJxOwogCi0JY3FpY2ItPmxlbiA9IGNwdV90b19sZTE2KHJ4X3JpbmctPmNxX2xlbiB8IExFTl9WIHwgTEVOX0NQUF9DT05UKTsKKwlicV9sZW4gPSAocnhfcmluZy0+Y3FfbGVuID09IDY1NTM2KSA/IDAgOiAodTE2KSByeF9yaW5nLT5jcV9sZW47CisJY3FpY2ItPmxlbiA9IGNwdV90b19sZTE2KGJxX2xlbiB8IExFTl9WIHwgTEVOX0NQUF9DT05UKTsKIAogCWNxaWNiLT5hZGRyX2xvID0gY3B1X3RvX2xlMzIocnhfcmluZy0+Y3FfYmFzZV9kbWEpOwogCWNxaWNiLT5hZGRyX2hpID0gY3B1X3RvX2xlMzIoKHU2NCkgcnhfcmluZy0+Y3FfYmFzZV9kbWEgPj4gMzIpOwpAQCAtMjUwMyw4ICsyNDg3LDExIEBACiAJCSAgICBjcHVfdG9fbGUzMihyeF9yaW5nLT5sYnFfYmFzZV9pbmRpcmVjdF9kbWEpOwogCQljcWljYi0+bGJxX2FkZHJfaGkgPQogCQkgICAgY3B1X3RvX2xlMzIoKHU2NCkgcnhfcmluZy0+bGJxX2Jhc2VfaW5kaXJlY3RfZG1hID4+IDMyKTsKLQkJY3FpY2ItPmxicV9idWZfc2l6ZSA9IGNwdV90b19sZTMyKHJ4X3JpbmctPmxicV9idWZfc2l6ZSk7Ci0JCWJxX2xlbiA9ICh1MTYpIHJ4X3JpbmctPmxicV9sZW47CisJCWJxX2xlbiA9IChyeF9yaW5nLT5sYnFfYnVmX3NpemUgPT0gNjU1MzYpID8gMCA6CisJCQkodTE2KSByeF9yaW5nLT5sYnFfYnVmX3NpemU7CisJCWNxaWNiLT5sYnFfYnVmX3NpemUgPSBjcHVfdG9fbGUxNihicV9sZW4pOworCQlicV9sZW4gPSAocnhfcmluZy0+bGJxX2xlbiA9PSA2NTUzNikgPyAwIDoKKwkJCSh1MTYpIHJ4X3JpbmctPmxicV9sZW47CiAJCWNxaWNiLT5sYnFfbGVuID0gY3B1X3RvX2xlMTYoYnFfbGVuKTsKIAkJcnhfcmluZy0+bGJxX3Byb2RfaWR4ID0gcnhfcmluZy0+bGJxX2xlbiAtIDE2OwogCQlyeF9yaW5nLT5sYnFfY3Vycl9pZHggPSAwOwpAQCAtMjUyMCw3ICsyNTA3LDggQEAKIAkJICAgIGNwdV90b19sZTMyKCh1NjQpIHJ4X3JpbmctPnNicV9iYXNlX2luZGlyZWN0X2RtYSA+PiAzMik7CiAJCWNxaWNiLT5zYnFfYnVmX3NpemUgPQogCQkgICAgY3B1X3RvX2xlMTYoKChyeF9yaW5nLT5zYnFfYnVmX3NpemUgLyAyKSArIDgpICYgMHhmZmZmZmZmOCk7Ci0JCWJxX2xlbiA9ICh1MTYpIHJ4X3JpbmctPnNicV9sZW47CisJCWJxX2xlbiA9IChyeF9yaW5nLT5zYnFfbGVuID09IDY1NTM2KSA/IDAgOgorCQkJKHUxNikgcnhfcmluZy0+c2JxX2xlbjsKIAkJY3FpY2ItPnNicV9sZW4gPSBjcHVfdG9fbGUxNihicV9sZW4pOwogCQlyeF9yaW5nLT5zYnFfcHJvZF9pZHggPSByeF9yaW5nLT5zYnFfbGVuIC0gMTY7CiAJCXJ4X3JpbmctPnNicV9jdXJyX2lkeCA9IDA7CkBAIC0zMzQxLDExICszMzI5LDExIEBACiAJCQkgICAgcnhfcmluZy0+Y3FfbGVuICogc2l6ZW9mKHN0cnVjdCBxbF9uZXRfcnNwX2lvY2IpOwogCQkJcnhfcmluZy0+bGJxX2xlbiA9IE5VTV9MQVJHRV9CVUZGRVJTOwogCQkJcnhfcmluZy0+bGJxX3NpemUgPQotCQkJICAgIHJ4X3JpbmctPmxicV9sZW4gKiBzaXplb2Yoc3RydWN0IGJxX2VsZW1lbnQpOworCQkJICAgIHJ4X3JpbmctPmxicV9sZW4gKiBzaXplb2YoX19sZTY0KTsKIAkJCXJ4X3JpbmctPmxicV9idWZfc2l6ZSA9IExBUkdFX0JVRkZFUl9TSVpFOwogCQkJcnhfcmluZy0+c2JxX2xlbiA9IE5VTV9TTUFMTF9CVUZGRVJTOwogCQkJcnhfcmluZy0+c2JxX3NpemUgPQotCQkJICAgIHJ4X3JpbmctPnNicV9sZW4gKiBzaXplb2Yoc3RydWN0IGJxX2VsZW1lbnQpOworCQkJICAgIHJ4X3JpbmctPnNicV9sZW4gKiBzaXplb2YoX19sZTY0KTsKIAkJCXJ4X3JpbmctPnNicV9idWZfc2l6ZSA9IFNNQUxMX0JVRkZFUl9TSVpFICogMjsKIAkJCXJ4X3JpbmctPnR5cGUgPSBERUZBVUxUX1E7CiAJCX0gZWxzZSBpZiAoaSA8IHFkZXYtPnJzc19yaW5nX2ZpcnN0X2NxX2lkKSB7CkBAIC0zMzcyLDExICszMzYwLDExIEBACiAJCQkgICAgcnhfcmluZy0+Y3FfbGVuICogc2l6ZW9mKHN0cnVjdCBxbF9uZXRfcnNwX2lvY2IpOwogCQkJcnhfcmluZy0+bGJxX2xlbiA9IE5VTV9MQVJHRV9CVUZGRVJTOwogCQkJcnhfcmluZy0+bGJxX3NpemUgPQotCQkJICAgIHJ4X3JpbmctPmxicV9sZW4gKiBzaXplb2Yoc3RydWN0IGJxX2VsZW1lbnQpOworCQkJICAgIHJ4X3JpbmctPmxicV9sZW4gKiBzaXplb2YoX19sZTY0KTsKIAkJCXJ4X3JpbmctPmxicV9idWZfc2l6ZSA9IExBUkdFX0JVRkZFUl9TSVpFOwogCQkJcnhfcmluZy0+c2JxX2xlbiA9IE5VTV9TTUFMTF9CVUZGRVJTOwogCQkJcnhfcmluZy0+c2JxX3NpemUgPQotCQkJICAgIHJ4X3JpbmctPnNicV9sZW4gKiBzaXplb2Yoc3RydWN0IGJxX2VsZW1lbnQpOworCQkJICAgIHJ4X3JpbmctPnNicV9sZW4gKiBzaXplb2YoX19sZTY0KTsKIAkJCXJ4X3JpbmctPnNicV9idWZfc2l6ZSA9IFNNQUxMX0JVRkZFUl9TSVpFICogMjsKIAkJCXJ4X3JpbmctPnR5cGUgPSBSWF9ROwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9yNjA0MC5jIGIvZHJpdmVycy9uZXQvcjYwNDAuYwppbmRleCA1M2JiZGRmLi5jZjNhMDgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9yNjA0MC5jCisrKyBiL2RyaXZlcnMvbmV0L3I2MDQwLmMKQEAgLTQ5LDggKzQ5LDggQEAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAKICNkZWZpbmUgRFJWX05BTUUJInI2MDQwIgotI2RlZmluZSBEUlZfVkVSU0lPTgkiMC4xOSIKLSNkZWZpbmUgRFJWX1JFTERBVEUJIjE4RGVjMjAwOCIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuMjAiCisjZGVmaW5lIERSVl9SRUxEQVRFCSIwN0phbjIwMDkiCiAKIC8qIFBIWSBDSElQIEFkZHJlc3MgKi8KICNkZWZpbmUgUEhZMV9BRERSCTEJLyogRm9yIE1BQzEgKi8KQEAgLTIwMCw3ICsyMDAsNyBAQAogCiBzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9IEtFUk5fSU5GTyBEUlZfTkFNRQogCSI6IFJEQyBSNjA0MCBOQVBJIG5ldCBkcml2ZXIsIgotCSJ2ZXJzaW9uICJEUlZfVkVSU0lPTiAiICgiIERSVl9SRUxEQVRFICIpXG4iOworCSJ2ZXJzaW9uICJEUlZfVkVSU0lPTiAiICgiIERSVl9SRUxEQVRFICIpIjsKIAogc3RhdGljIGludCBwaHlfdGFibGVbXSA9IHsgUEhZMV9BRERSLCBQSFkyX0FERFIgfTsKIApAQCAtMzMwLDcgKzMzMCw3IEBACiAJZG8gewogCQlza2IgPSBuZXRkZXZfYWxsb2Nfc2tiKGRldiwgTUFYX0JVRl9TSVpFKTsKIAkJaWYgKCFza2IpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byBhbGxvYyBza2IgZm9yIHJ4XG4iLCBkZXYtPm5hbWUpOworCQkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICIlczogZmFpbGVkIHRvIGFsbG9jIHNrYiBmb3IgcnhcbiIsIGRldi0+bmFtZSk7CiAJCQlyYyA9IC1FTk9NRU07CiAJCQlnb3RvIGVycl9leGl0OwogCQl9CkBAIC0xMDc3LDIwICsxMDc3LDIwIEBACiAJLyogdGhpcyBzaG91bGQgYWx3YXlzIGJlIHN1cHBvcnRlZCAqLwogCWVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICIzMi1iaXQgUENJIERNQSBhZGRyZXNzZXMiCisJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiAzMi1iaXQgUENJIERNQSBhZGRyZXNzZXMiCiAJCQkJIm5vdCBzdXBwb3J0ZWQgYnkgdGhlIGNhcmRcbiIpOwogCQlnb3RvIGVycl9vdXQ7CiAJfQogCWVyciA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSyk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIjMyLWJpdCBQQ0kgRE1BIGFkZHJlc3NlcyIKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6IDMyLWJpdCBQQ0kgRE1BIGFkZHJlc3NlcyIKIAkJCQkibm90IHN1cHBvcnRlZCBieSB0aGUgY2FyZFxuIik7CiAJCWdvdG8gZXJyX291dDsKIAl9CiAKIAkvKiBJTyBTaXplIGNoZWNrICovCiAJaWYgKHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkgPCBpb19zaXplKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiSW5zdWZmaWNpZW50IFBDSSByZXNvdXJjZXMsIGFib3J0aW5nXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6IEluc3VmZmljaWVudCBQQ0kgcmVzb3VyY2VzLCBhYm9ydGluZ1xuIik7CiAJCWVyciA9IC1FSU87CiAJCWdvdG8gZXJyX291dDsKIAl9CkBAIC0xMTAwLDcgKzExMDAsNyBAQAogCiAJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCByNjA0MF9wcml2YXRlKSk7CiAJaWYgKCFkZXYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICJGYWlsZWQgdG8gYWxsb2NhdGUgZXRoZXJkZXZcbiIpOworCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIjogRmFpbGVkIHRvIGFsbG9jYXRlIGV0aGVyZGV2XG4iKTsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBlcnJfb3V0OwogCX0KQEAgLTExMTYsMTEgKzExMTYsMTUgQEAKIAogCWlvYWRkciA9IHBjaV9pb21hcChwZGV2LCBiYXIsIGlvX3NpemUpOwogCWlmICghaW9hZGRyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaW9yZW1hcCBmYWlsZWQgZm9yIGRldmljZSAlc1xuIiwKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6IGlvcmVtYXAgZmFpbGVkIGZvciBkZXZpY2UgJXNcbiIsCiAJCQlwY2lfbmFtZShwZGV2KSk7CiAJCWVyciA9IC1FSU87CiAJCWdvdG8gZXJyX291dF9mcmVlX3JlczsKIAl9CisJLyogSWYgUEhZIHN0YXR1cyBjaGFuZ2UgcmVnaXN0ZXIgaXMgc3RpbGwgc2V0IHRvIHplcm8gaXQgbWVhbnMgdGhlCisJICogYm9vdGxvYWRlciBkaWRuJ3QgaW5pdGlhbGl6ZSBpdCAqLworCWlmIChpb3JlYWQxNihpb2FkZHIgKyBQSFlfQ0MpID09IDApCisJCWlvd3JpdGUxNigweDlmMDcsIGlvYWRkciArIFBIWV9DQyk7CiAKIAkvKiBJbml0IHN5c3RlbSAmIGRldmljZSAqLwogCWxwLT5iYXNlID0gaW9hZGRyOwpAQCAtMTEzNyw2ICsxMTQxLDExIEBACiAJYWRycFsxXSA9IGlvcmVhZDE2KGlvYWRkciArIE1JRF8wTSk7CiAJYWRycFsyXSA9IGlvcmVhZDE2KGlvYWRkciArIE1JRF8wSCk7CiAKKwkvKiBTb21lIGJvb3Rsb2FkZXIvQklPU2VzIGRvIG5vdCBpbml0aWFsaXplCisJICogTUFDIGFkZHJlc3MsIHdhcm4gYWJvdXQgdGhhdCAqLworCWlmICghKGFkcnBbMF0gfHwgYWRycFsxXSB8fCBhZHJwWzJdKSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRSAiOiBNQUMgYWRkcmVzcyBub3QgaW5pdGlhbGl6ZWRcbiIpOworCiAJLyogTGluayBuZXcgZGV2aWNlIGludG8gcjYwNDBfcm9vdF9kZXYgKi8KIAlscC0+cGRldiA9IHBkZXY7CiAJbHAtPmRldiA9IGRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NiMTAwMC5jIGIvZHJpdmVycy9uZXQvc2IxMDAwLmMKaW5kZXggYmUzMDI1My4uZmMwZTM4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2IxMDAwLmMKKysrIGIvZHJpdmVycy9uZXQvc2IxMDAwLmMKQEAgLTEzNCw2ICsxMzQsMTYgQEAKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBucCwgc2IxMDAwX3BucF9pZHMpOwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHNiMTAwMF9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbgkJPSBzYjEwMDBfb3BlbiwKKwkubmRvX3N0YXJ0X3htaXQJCT0gc2IxMDAwX3N0YXJ0X3htaXQsCisJLm5kb19kb19pb2N0bAkJPSBzYjEwMDBfZGV2X2lvY3RsLAorCS5uZG9fc3RvcAkJPSBzYjEwMDBfY2xvc2UsCisJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAorCS5uZG9fc2V0X21hY19hZGRyZXNzIAk9IGV0aF9tYWNfYWRkciwKKwkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKK307CisKIHN0YXRpYyBpbnQKIHNiMTAwMF9wcm9iZV9vbmUoc3RydWN0IHBucF9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwbnBfZGV2aWNlX2lkICppZCkKIHsKQEAgLTE5MiwxMSArMjAyLDcgQEAKIAlpZiAoc2IxMDAwX2RlYnVnID4gMCkKIAkJcHJpbnRrKEtFUk5fTk9USUNFICIlcyIsIHZlcnNpb24pOwogCi0JLyogVGhlIFNCMTAwMC1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLwotCWRldi0+b3BlbgkJPSBzYjEwMDBfb3BlbjsKLQlkZXYtPmRvX2lvY3RsCQk9IHNiMTAwMF9kZXZfaW9jdGw7Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSBzYjEwMDBfc3RhcnRfeG1pdDsKLQlkZXYtPnN0b3AJCT0gc2IxMDAwX2Nsb3NlOworCWRldi0+bmV0ZGV2X29wcwk9ICZzYjEwMDBfbmV0ZGV2X29wczsKIAogCS8qIGhhcmR3YXJlIGFkZHJlc3MgaXMgMDowOnNlcmlhbF9udW1iZXIgKi8KIAlkZXYtPmRldl9hZGRyWzJdCT0gc2VyaWFsX251bWJlciA+PiAyNCAmIDB4ZmY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zZmMvZmFsY29uLmMgYi9kcml2ZXJzL25ldC9zZmMvZmFsY29uLmMKaW5kZXggNjg4NGRjOC4uNWI5ZjJkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2ZjL2ZhbGNvbi5jCisrKyBiL2RyaXZlcnMvbmV0L3NmYy9mYWxjb24uYwpAQCAtMTQwMyw5ICsxNDAzLDkgQEAKIAl9CiAKIAkvKiBEaXNhYmxlIGJvdGggZGV2aWNlcyAqLwotCXBjaV9kaXNhYmxlX2RldmljZShlZngtPnBjaV9kZXYpOworCXBjaV9jbGVhcl9tYXN0ZXIoZWZ4LT5wY2lfZGV2KTsKIAlpZiAoRkFMQ09OX0lTX0RVQUxfRlVOQyhlZngpKQotCQlwY2lfZGlzYWJsZV9kZXZpY2UobmljX2RhdGEtPnBjaV9kZXYyKTsKKwkJcGNpX2NsZWFyX21hc3RlcihuaWNfZGF0YS0+cGNpX2RldjIpOwogCWZhbGNvbl9kaXNhYmxlX2ludGVycnVwdHMoZWZ4KTsKIAogCWlmICgrK25faW50X2Vycm9ycyA8IEZBTENPTl9NQVhfSU5UX0VSUk9SUykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2lzMTkwLmMgYi9kcml2ZXJzL25ldC9zaXMxOTAuYwppbmRleCA4M2NjM2M1Li5hOTczMjY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zaXMxOTAuYworKysgYi9kcml2ZXJzL25ldC9zaXMxOTAuYwpAQCAtMTc4Miw2ICsxNzgyLDIxIEBACiAJCWdlbmVyaWNfbWlpX2lvY3RsKCZ0cC0+bWlpX2lmLCBpZl9taWkoaWZyKSwgY21kLCBOVUxMKTsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBzaXMxOTBfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gc2lzMTkwX29wZW4sCisJLm5kb19zdG9wCQk9IHNpczE5MF9jbG9zZSwKKwkubmRvX2RvX2lvY3RsCQk9IHNpczE5MF9pb2N0bCwKKwkubmRvX3N0YXJ0X3htaXQJCT0gc2lzMTkwX3N0YXJ0X3htaXQsCisJLm5kb190eF90aW1lb3V0CQk9IHNpczE5MF90eF90aW1lb3V0LAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gc2lzMTkwX3NldF9yeF9tb2RlLAorCS5uZG9fY2hhbmdlX210dQkJPSBldGhfY2hhbmdlX210dSwKKwkubmRvX3NldF9tYWNfYWRkcmVzcyAJPSBldGhfbWFjX2FkZHIsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwkubmRvX3BvbGxfY29udHJvbGxlcgkgPSBzaXMxOTBfbmV0cG9sbCwKKyNlbmRpZgorfTsKKwogc3RhdGljIGludCBfX2RldmluaXQgc2lzMTkwX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJCSAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKQEAgLTE4MTUsMTkgKzE4MzAsMTIgQEAKIAogCUlOSVRfV09SSygmdHAtPnBoeV90YXNrLCBzaXMxOTBfcGh5X3Rhc2spOwogCi0JZGV2LT5vcGVuID0gc2lzMTkwX29wZW47Ci0JZGV2LT5zdG9wID0gc2lzMTkwX2Nsb3NlOwotCWRldi0+ZG9faW9jdGwgPSBzaXMxOTBfaW9jdGw7Ci0JZGV2LT50eF90aW1lb3V0ID0gc2lzMTkwX3R4X3RpbWVvdXQ7Ci0JZGV2LT53YXRjaGRvZ190aW1lbyA9IFNJUzE5MF9UWF9USU1FT1VUOwotCWRldi0+aGFyZF9zdGFydF94bWl0ID0gc2lzMTkwX3N0YXJ0X3htaXQ7Ci0jaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKLQlkZXYtPnBvbGxfY29udHJvbGxlciA9IHNpczE5MF9uZXRwb2xsOwotI2VuZGlmCi0JZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBzaXMxOTBfc2V0X3J4X21vZGU7CisJZGV2LT5uZXRkZXZfb3BzID0gJnNpczE5MF9uZXRkZXZfb3BzOworCiAJU0VUX0VUSFRPT0xfT1BTKGRldiwgJnNpczE5MF9ldGh0b29sX29wcyk7CiAJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CiAJZGV2LT5iYXNlX2FkZHIgPSAodW5zaWduZWQgbG9uZykgMHhkZWFkOworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBTSVMxOTBfVFhfVElNRU9VVDsKIAogCXNwaW5fbG9ja19pbml0KCZ0cC0+bG9jayk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NsaXAuYyBiL2RyaXZlcnMvbmV0L3NsaXAuYwppbmRleCA4ZTFjMGJhLi41YzYxZDVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zbGlwLmMKKysrIGIvZHJpdmVycy9uZXQvc2xpcC5jCkBAIC02MDMsNyArNjAzLDYgQEAKIAlkZXYtPm10dQkJPSBzbC0+bXR1OwogCWRldi0+dHlwZQkJPSBBUlBIUkRfU0xJUCArIHNsLT5tb2RlOwogI2lmZGVmIFNMX0NIRUNLX1RSQU5TTUlUCi0JZGV2LT50eF90aW1lb3V0CQk9IHNsX3R4X3RpbWVvdXQ7CiAJZGV2LT53YXRjaGRvZ190aW1lbwk9IDIwKkhaOwogI2VuZGlmCiAJcmV0dXJuIDA7CkBAIC02MTcsMTkgKzYxNiwyNiBAQAogCXNsX2ZyZWVfYnVmcyhzbCk7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgc2xfbmV0ZGV2X29wcyA9IHsKKwkubmRvX2luaXQJCT0gc2xfaW5pdCwKKwkubmRvX3VuaW5pdAkgIAk9IHNsX3VuaW5pdCwKKwkubmRvX29wZW4JCT0gc2xfb3BlbiwKKwkubmRvX3N0b3AJCT0gc2xfY2xvc2UsCisJLm5kb19zdGFydF94bWl0CQk9IHNsX3htaXQsCisJLm5kb19nZXRfc3RhdHMJICAgICAgICA9IHNsX2dldF9zdGF0cywKKwkubmRvX2NoYW5nZV9tdHUJCT0gc2xfY2hhbmdlX210dSwKKwkubmRvX3R4X3RpbWVvdXQJCT0gc2xfdHhfdGltZW91dCwKKyNpZmRlZiBDT05GSUdfU0xJUF9TTUFSVAorCS5uZG9fZG9faW9jdGwJCT0gc2xfaW9jdGwsCisjZW5kaWYKK307CisKKwogc3RhdGljIHZvaWQgc2xfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlkZXYtPmluaXQJCT0gc2xfaW5pdDsKLQlkZXYtPnVuaW5pdAkgIAk9IHNsX3VuaW5pdDsKLQlkZXYtPm9wZW4JCT0gc2xfb3BlbjsKKwlkZXYtPm5ldGRldl9vcHMJCT0gJnNsX25ldGRldl9vcHM7CiAJZGV2LT5kZXN0cnVjdG9yCQk9IGZyZWVfbmV0ZGV2OwotCWRldi0+c3RvcAkJPSBzbF9jbG9zZTsKLQlkZXYtPmdldF9zdGF0cwkgICAgICAgID0gc2xfZ2V0X3N0YXRzOwotCWRldi0+Y2hhbmdlX210dQkJPSBzbF9jaGFuZ2VfbXR1OwotCWRldi0+aGFyZF9zdGFydF94bWl0CT0gc2xfeG1pdDsKLSNpZmRlZiBDT05GSUdfU0xJUF9TTUFSVAotCWRldi0+ZG9faW9jdGwJCT0gc2xfaW9jdGw7Ci0jZW5kaWYKKwogCWRldi0+aGFyZF9oZWFkZXJfbGVuCT0gMDsKIAlkZXYtPmFkZHJfbGVuCQk9IDA7CiAJZGV2LT50eF9xdWV1ZV9sZW4JPSAxMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NsaXAuaCBiL2RyaXZlcnMvbmV0L3NsaXAuaAppbmRleCA4NTNlMGY2Li45ZWE1YzExIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zbGlwLmgKKysrIGIvZHJpdmVycy9uZXQvc2xpcC5oCkBAIC03NSw3ICs3NSw3IEBACiAgIHVuc2lnbmVkIGxvbmcgICAgICAgICB0eF9lcnJvcnM7ICAgICAgLyogUGxhbm5lZCBzdHVmZiAgICAgICAgICAgICAgICAqLwogICB1bnNpZ25lZCBsb25nICAgICAgICAgcnhfZHJvcHBlZDsgICAgIC8qIE5vIG1lbW9yeSBmb3Igc2tiICAgICAgICAgICAgKi8KICAgdW5zaWduZWQgbG9uZyAgICAgICAgIHR4X2Ryb3BwZWQ7ICAgICAvKiBXaGVuIE1UVSBjaGFuZ2UgICAgICAgICAgICAgICovCi0gIHVuc2lnbmVkIGxvbmcgICAgICAgICByeF9vdmVyX2Vycm9yczsgLyogRnJhbWUgYmlnZ2VyIHRoZW4gU0xJUCBidWYuICAqLworICB1bnNpZ25lZCBsb25nICAgICAgICAgcnhfb3Zlcl9lcnJvcnM7IC8qIEZyYW1lIGJpZ2dlciB0aGFuIFNMSVAgYnVmLiAgKi8KICNpZmRlZiBTTF9JTkNMVURFX0NTTElQCiAgIHVuc2lnbmVkIGxvbmcJCXR4X2NvbXByZXNzZWQ7CiAgIHVuc2lnbmVkIGxvbmcJCXJ4X2NvbXByZXNzZWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdGFyZmlyZS5jIGIvZHJpdmVycy9uZXQvc3RhcmZpcmUuYwppbmRleCBmNTRhYzIzLi5kYTNhNzZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdGFyZmlyZS5jCisrKyBiL2RyaXZlcnMvbmV0L3N0YXJmaXJlLmMKQEAgLTQyLDExICs0MiwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L21paS5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgkJLyogUHJvY2Vzc29yIHR5cGUgZm9yIGNhY2hlIGFsaWdubWVudC4gKi8KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCi0jaW5jbHVkZSAic3RhcmZpcmVfZmlybXdhcmUuaCIKIC8qCiAgKiBUaGUgY3VycmVudCBmcmFtZSBwcm9jZXNzb3IgZmlybXdhcmUgZmFpbHMgdG8gY2hlY2tzdW0gYSBmcmFnbWVudAogICogb2YgbGVuZ3RoIDEuIElmIGFuZCB3aGVuIHRoaXMgaXMgZml4ZWQsIHRoZSAjZGVmaW5lIGJlbG93IGNhbiBiZSByZW1vdmVkLgpAQCAtMTczLDYgKzE3MywxMCBAQAogI2RlZmluZSBza2JfZmlyc3RfZnJhZ19sZW4oc2tiKQlza2JfaGVhZGxlbihza2IpCiAjZGVmaW5lIHNrYl9udW1fZnJhZ3Moc2tiKSAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyArIDEpCiAKKy8qIEZpcm13YXJlIG5hbWVzICovCisjZGVmaW5lIEZJUk1XQVJFX1JYCSJhZGFwdGVjL3N0YXJmaXJlX3J4LmJpbiIKKyNkZWZpbmUgRklSTVdBUkVfVFgJImFkYXB0ZWMvc3RhcmZpcmVfdHguYmluIgorCiAvKiBUaGVzZSBpZGVudGlmeSB0aGUgZHJpdmVyIGJhc2UgdmVyc2lvbiBhbmQgbWF5IG5vdCBiZSByZW1vdmVkLiAqLwogc3RhdGljIGNoYXIgdmVyc2lvbltdID0KIEtFUk5fSU5GTyAic3RhcmZpcmUuYzp2MS4wMyA3LzI2LzIwMDAgIFdyaXR0ZW4gYnkgRG9uYWxkIEJlY2tlciA8YmVja2VyQHNjeWxkLmNvbT5cbiIKQEAgLTE4Miw2ICsxODYsOCBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJBZGFwdGVjIFN0YXJmaXJlIEV0aGVybmV0IGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworTU9EVUxFX0ZJUk1XQVJFKEZJUk1XQVJFX1JYKTsKK01PRFVMRV9GSVJNV0FSRShGSVJNV0FSRV9UWCk7CiAKIG1vZHVsZV9wYXJhbShtYXhfaW50ZXJydXB0X3dvcmssIGludCwgMCk7CiBtb2R1bGVfcGFyYW0obXR1LCBpbnQsIDApOwpAQCAtNjQyLDYgKzY0OCwyNCBAQAogI2VuZGlmIC8qIFZMQU5fU1VQUE9SVCAqLwogCiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gbmV0ZGV2X29wZW4sCisJLm5kb19zdG9wCQk9IG5ldGRldl9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJCT0gc3RhcnRfdHgsCisJLm5kb190eF90aW1lb3V0IAk9IHR4X3RpbWVvdXQsCisJLm5kb19nZXRfc3RhdHMgCQk9IGdldF9zdGF0cywKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfcnhfbW9kZSwKKwkubmRvX2RvX2lvY3RsIAkJPSBuZXRkZXZfaW9jdGwsCisJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAorCS5uZG9fc2V0X21hY19hZGRyZXNzIAk9IGV0aF9tYWNfYWRkciwKKwkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKKyNpZmRlZiBWTEFOX1NVUFBPUlQKKwkubmRvX3ZsYW5fcnhfcmVnaXN0ZXIJPSBuZXRkZXZfdmxhbl9yeF9yZWdpc3RlciwKKwkubmRvX3ZsYW5fcnhfYWRkX3ZpZAk9IG5ldGRldl92bGFuX3J4X2FkZF92aWQsCisJLm5kb192bGFuX3J4X2tpbGxfdmlkCT0gbmV0ZGV2X3ZsYW5fcnhfa2lsbF92aWQsCisjZW5kaWYKK307CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IHN0YXJmaXJlX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewpAQCAtNzA0LDExICs3MjgsOSBAQAogCWlmIChlbmFibGVfaHdfY2tzdW0pCiAJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9TRzsKICNlbmRpZiAvKiBaRVJPQ09QWSAqLworCiAjaWZkZWYgVkxBTl9TVVBQT1JUCiAJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hXX1ZMQU5fUlggfCBORVRJRl9GX0hXX1ZMQU5fRklMVEVSOwotCWRldi0+dmxhbl9yeF9yZWdpc3RlciA9IG5ldGRldl92bGFuX3J4X3JlZ2lzdGVyOwotCWRldi0+dmxhbl9yeF9hZGRfdmlkID0gbmV0ZGV2X3ZsYW5fcnhfYWRkX3ZpZDsKLQlkZXYtPnZsYW5fcnhfa2lsbF92aWQgPSBuZXRkZXZfdmxhbl9yeF9raWxsX3ZpZDsKICNlbmRpZiAvKiBWTEFOX1JYX0tJTExfVklEICovCiAjaWZkZWYgQUREUl82NEJJVFMKIAlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSElHSERNQTsKQEAgLTgwNCwxOCArODI2LDEyIEBACiAJCX0KIAl9CiAKLQkvKiBUaGUgY2hpcC1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLwotCWRldi0+b3BlbiA9ICZuZXRkZXZfb3BlbjsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZzdGFydF90eDsKLQlkZXYtPnR4X3RpbWVvdXQgPSB0eF90aW1lb3V0OworCWRldi0+bmV0ZGV2X29wcyA9ICZuZXRkZXZfb3BzOwogCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOwotCW5ldGlmX25hcGlfYWRkKGRldiwgJm5wLT5uYXBpLCBuZXRkZXZfcG9sbCwgbWF4X2ludGVycnVwdF93b3JrKTsKLQlkZXYtPnN0b3AgPSAmbmV0ZGV2X2Nsb3NlOwotCWRldi0+Z2V0X3N0YXRzID0gJmdldF9zdGF0czsKLQlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfcnhfbW9kZTsKLQlkZXYtPmRvX2lvY3RsID0gJm5ldGRldl9pb2N0bDsKIAlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmZXRodG9vbF9vcHMpOwogCisJbmV0aWZfbmFwaV9hZGQoZGV2LCAmbnAtPm5hcGksIG5ldGRldl9wb2xsLCBtYXhfaW50ZXJydXB0X3dvcmspOworCiAJaWYgKG10dSkKIAkJZGV2LT5tdHUgPSBtdHU7CiAKQEAgLTkwMiw5ICs5MTgsMTIgQEAKIAogc3RhdGljIGludCBuZXRkZXZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogeworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZndfcngsICpmd190eDsKKwljb25zdCBfX2JlMzIgKmZ3X3J4X2RhdGEsICpmd190eF9kYXRhOwogCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPmJhc2U7CiAJaW50IGksIHJldHZhbDsKKwlzaXplX3QgdHhfc2l6ZSwgcnhfc2l6ZTsKIAlzaXplX3QgdHhfZG9uZV9xX3NpemUsIHJ4X2RvbmVfcV9zaXplLCB0eF9yaW5nX3NpemUsIHJ4X3Jpbmdfc2l6ZTsKIAogCS8qIERvIHdlIGV2ZXIgbmVlZCB0byByZXNldCB0aGUgY2hpcD8/PyAqLwpAQCAtMTA0MCwxMSArMTA1OSw0MCBAQAogCXdyaXRlbChFVEhfUF84MDIxUSwgaW9hZGRyICsgVmxhblR5cGUpOwogI2VuZGlmIC8qIFZMQU5fU1VQUE9SVCAqLwogCisJcmV0dmFsID0gcmVxdWVzdF9maXJtd2FyZSgmZndfcngsIEZJUk1XQVJFX1JYLCAmbnAtPnBjaV9kZXYtPmRldik7CisJaWYgKHJldHZhbCkgeworCQlwcmludGsoS0VSTl9FUlIgInN0YXJmaXJlOiBGYWlsZWQgdG8gbG9hZCBmaXJtd2FyZSBcIiVzXCJcbiIsCisJCSAgICAgICBGSVJNV0FSRV9SWCk7CisJCXJldHVybiByZXR2YWw7CisJfQorCWlmIChmd19yeC0+c2l6ZSAlIDQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzdGFyZmlyZTogYm9ndXMgbGVuZ3RoICV6dSBpbiBcIiVzXCJcbiIsCisJCSAgICAgICBmd19yeC0+c2l6ZSwgRklSTVdBUkVfUlgpOworCQlyZXR2YWwgPSAtRUlOVkFMOworCQlnb3RvIG91dF9yeDsKKwl9CisJcmV0dmFsID0gcmVxdWVzdF9maXJtd2FyZSgmZndfdHgsIEZJUk1XQVJFX1RYLCAmbnAtPnBjaV9kZXYtPmRldik7CisJaWYgKHJldHZhbCkgeworCQlwcmludGsoS0VSTl9FUlIgInN0YXJmaXJlOiBGYWlsZWQgdG8gbG9hZCBmaXJtd2FyZSBcIiVzXCJcbiIsCisJCSAgICAgICBGSVJNV0FSRV9UWCk7CisJCWdvdG8gb3V0X3J4OworCX0KKwlpZiAoZndfdHgtPnNpemUgJSA0KSB7CisJCXByaW50ayhLRVJOX0VSUiAic3RhcmZpcmU6IGJvZ3VzIGxlbmd0aCAlenUgaW4gXCIlc1wiXG4iLAorCQkgICAgICAgZndfdHgtPnNpemUsIEZJUk1XQVJFX1RYKTsKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwkJZ290byBvdXRfdHg7CisJfQorCWZ3X3J4X2RhdGEgPSAoY29uc3QgX19iZTMyICopJmZ3X3J4LT5kYXRhWzBdOworCWZ3X3R4X2RhdGEgPSAoY29uc3QgX19iZTMyICopJmZ3X3R4LT5kYXRhWzBdOworCXJ4X3NpemUgPSBmd19yeC0+c2l6ZSAvIDQ7CisJdHhfc2l6ZSA9IGZ3X3R4LT5zaXplIC8gNDsKKwogCS8qIExvYWQgUngvVHggZmlybXdhcmUgaW50byB0aGUgZnJhbWUgcHJvY2Vzc29ycyAqLwotCWZvciAoaSA9IDA7IGkgPCBGSVJNV0FSRV9SWF9TSVpFICogMjsgaSsrKQotCQl3cml0ZWwoZmlybXdhcmVfcnhbaV0sIGlvYWRkciArIFJ4R2ZwTWVtICsgaSAqIDQpOwotCWZvciAoaSA9IDA7IGkgPCBGSVJNV0FSRV9UWF9TSVpFICogMjsgaSsrKQotCQl3cml0ZWwoZmlybXdhcmVfdHhbaV0sIGlvYWRkciArIFR4R2ZwTWVtICsgaSAqIDQpOworCWZvciAoaSA9IDA7IGkgPCByeF9zaXplOyBpKyspCisJCXdyaXRlbChiZTMyX3RvX2NwdXAoJmZ3X3J4X2RhdGFbaV0pLCBpb2FkZHIgKyBSeEdmcE1lbSArIGkgKiA0KTsKKwlmb3IgKGkgPSAwOyBpIDwgdHhfc2l6ZTsgaSsrKQorCQl3cml0ZWwoYmUzMl90b19jcHVwKCZmd190eF9kYXRhW2ldKSwgaW9hZGRyICsgVHhHZnBNZW0gKyBpICogNCk7CiAJaWYgKGVuYWJsZV9od19ja3N1bSkKIAkJLyogRW5hYmxlIHRoZSBSeCBhbmQgVHggdW5pdHMsIGFuZCB0aGUgUngvVHggZnJhbWUgcHJvY2Vzc29ycy4gKi8KIAkJd3JpdGVsKFR4RW5hYmxlfFR4R0ZQRW5hYmxlfFJ4RW5hYmxlfFJ4R0ZQRW5hYmxlLCBpb2FkZHIgKyBHZW5DdHJsKTsKQEAgLTEwNTYsNyArMTEwNCwxMSBAQAogCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IERvbmUgbmV0ZGV2X29wZW4oKS5cbiIsCiAJCSAgICAgICBkZXYtPm5hbWUpOwogCi0JcmV0dXJuIDA7CitvdXRfdHg6CisJcmVsZWFzZV9maXJtd2FyZShmd190eCk7CitvdXRfcng6CisJcmVsZWFzZV9maXJtd2FyZShmd19yeCk7CisJcmV0dXJuIHJldHZhbDsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdGFyZmlyZV9maXJtd2FyZS5oIGIvZHJpdmVycy9uZXQvc3RhcmZpcmVfZmlybXdhcmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE2Njg1Mi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC9zdGFyZmlyZV9maXJtd2FyZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMyBBZGFwdGVjLCBJbmMuCi0gKgotICogUGxlYXNlIHJlYWQgdGhlIGZvbGxvd2luZyBsaWNlbnNlIGJlZm9yZSB1c2luZyB0aGUgQWRhcHRlYyBTb2Z0d2FyZQotICogKCJQcm9ncmFtIikuIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhlIGxpY2Vuc2UgdGVybXMsIGRvIG5vdCB1c2UgdGhlCi0gKiBQcm9ncmFtOgotICoKLSAqIFlvdSBhZ3JlZSB0byBiZSBib3VuZCBieSB2ZXJzaW9uIDIgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKQotICogZGF0ZWQgSnVuZSAxOTkxLCB3aGljaCBjYW4gYmUgZm91bmQgYXQgaHR0cDovL3d3dy5mc2Yub3JnL2xpY2Vuc2VzL2dwbC5odG1sLgotICogSWYgdGhlIGxpbmsgaXMgYnJva2VuLCB3cml0ZSB0byBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSwKLSAqIEJvc3RvbiwgTWFzc2FjaHVzZXR0cyAwMjExMS0xMzA3LgotICoKLSAqIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UgSVQgSVMgTElDRU5TRUQgIkFTIElTIiBBTkQKLSAqIFRIRVJFIElTIE5PIFdBUlJBTlRZIEZPUiBUSEUgUFJPR1JBTSwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIChUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVykuIFVTRSBPRiBUSEUgUFJPR1JBTSBJUyBBVCBZT1VSCi0gKiBPV04gUklTSy4gSU4gTk8gRVZFTlQgV0lMTCBBREFQVEVDIE9SIElUUyBMSUNFTlNPUlMgQkUgTElBQkxFIFRPIFlPVSBGT1IKLSAqIERBTUFHRVMsIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTS4KLSAqCi0gKi8KLQotc3RhdGljIGNvbnN0IHUzMiBmaXJtd2FyZV9yeFtdID0gewotICAweDAxMDAwM2RjLCAweDAwMDAwMDAwLAotICAweDA0MDAwNDIxLCAweDAwMDAwMDg2LAotICAweDgwMDAwMDE1LCAweDAwMDAxODBlLAotICAweDgxMDAwMDE1LCAweDAwMDA2NjY0LAotICAweDFhMDA0MGFiLCAweDAwMDAwYjA2LAotICAweDE0MjAwMDExLCAweDAwMDAwMDAwLAotICAweDE0MjA0MDIyLCAweDAwMDBhYWFhLAotICAweDE0MjA0MDIyLCAweDAwMDAwMzAwLAotICAweDE0MjA0MDIyLCAweDAwMDAwMDAwLAotICAweDFhMDA0MGFiLCAweDAwMDAwYjE0LAotICAweDE0MjAwMDExLCAweDAwMDAwMDAwLAotICAweDgzMDAwMDE1LCAweDAwMDAwMDAyLAotICAweDA0MDAwMDIxLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDEwLCAweDAwMDAwMDAwLAotICAweDA0MDAwNDIxLCAweDAwMDAwMDg3LAotICAweDAwMDAwMDEwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDEwLCAweDAwMDAwMDAwLAotICAweDAwMDA4MDE1LCAweDAwMDAwMDAwLAotICAweDAwMDAwMDNlLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDEwLCAweDAwMDAwMDAwLAotICAweDgyMDAwMDE1LCAweDAwMDA0MDAwLAotICAweDAwOWU4MDUwLCAweDAwMDAwMDAwLAotICAweDAzMDA4MDE1LCAweDAwMDAwMDAwLAotICAweDg2MDA4MDE1LCAweDAwMDAwMDAwLAotICAweDgyMDAwMDE1LCAweDAwMDA4MDAwLAotICAweDAxMDAwMDFjLCAweDAwMDAwMDAwLAotICAweDAwMDA1MGEwLCAweDAwMDAwMTBjLAotICAweDRlMjBkMDExLCAweDAwMDA2MDA4LAotICAweDE0MjBkMDEyLCAweDAwMDA0MDA4LAotICAweDAwMDBmMDkwLCAweDAwMDA3MDAwLAotICAweDAwMDBjOGIwLCAweDAwMDAzMDAwLAotICAweDAwMDA0MDQwLCAweDAwMDAwMDAwLAotICAweDAwMTA4MDE1LCAweDAwMDAwMDAwLAotICAweDAwYTJjMTUwLCAweDAwMDA0MDAwLAotICAweDAwYTQwMGIwLCAweDAwMDAwMDE0LAotICAweDAwMDAwMDIwLCAweDAwMDAwMDAwLAotICAweDI1MDA0MDBkLCAweDAwMDAyNTI1LAotICAweDAwMDQ3MjIwLCAweDAwMDAzMTAwLAotICAweDAwOTM0MDcwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDIwLCAweDAwMDAwMDAwLAotICAweDAwOTI0NDYwLCAweDAwMDAwMTg0LAotICAweDJiMjBjMDExLCAweDAwMDAwMDAwLAotICAweDAwMDBjNDIwLCAweDAwMDAwNTQwLAotICAweDM2MDE0MDE4LCAweDAwMDA0MjJkLAotICAweDE0MjAwMDExLCAweDAwMDAwMDAwLAotICAweDAwOTI0NDYwLCAweDAwMDAwMTgzLAotICAweDMyMDAwMDFmLCAweDAwMDAwMDM0LAotICAweDAyYWMwMDE1LCAweDAwMDAwMDAyLAotICAweDAwYTYwMTEwLCAweDAwMDAwMDA4LAotICAweDQyMjAwMDExLCAweDAwMDAwMDAwLAotICAweDAwOTI0MDYwLCAweDAwMDAwMTAzLAotICAweDAwMDAwMDFlLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDIwLCAweDAwMDAwMTAwLAotICAweDAwMDAwMDFlLCAweDAwMDAwMDAwLAotICAweDAwOTI0NDYwLCAweDAwMDAwMDg2LAotICAweDAwMDA0MDgwLCAweDAwMDAwMDAwLAotICAweDAwOTJjMDcwLCAweDAwMDAwMDAwLAotICAweDAwOTI0MDYwLCAweDAwMDAwMTAwLAotICAweDAwMDBjODkwLCAweDAwMDA1MDAwLAotICAweDAwYTZjMTEwLCAweDAwMDAwMDAwLAotICAweDAwYjBjMDkwLCAweDAwMDAwMDEyLAotICAweDAyMWMwMDE1LCAweDAwMDAwMDAwLAotICAweDMyMDAwMDFmLCAweDAwMDAwMDM0LAotICAweDAwOTI0NDYwLCAweDAwMDAwNTEwLAotICAweDQ0MjEwMDExLCAweDAwMDAwMDAwLAotICAweDQyMDAwMDExLCAweDAwMDAwMDAwLAotICAweDgzMDAwMDE1LCAweDAwMDAwMDQwLAotICAweDAwOTI0NDYwLCAweDAwMDAwNTA4LAotICAweDQ1MDE0MDE4LCAweDAwMDA0NTQ1LAotICAweDAwODA4MDUwLCAweDAwMDAwMDAwLAotICAweDYyMjA4MDEyLCAweDAwMDAwMDAwLAotICAweDgyMDAwMDE1LCAweDAwMDAwODAwLAotICAweDE1MjAwMDExLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDEwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDEwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDEwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDEwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDEwLCAweDAwMDAwMDAwLAotICAweDgwMDAwMDE1LCAweDAwMDBlZWE0LAotICAweDgxMDAwMDE1LCAweDAwMDAwMDVmLAotICAweDAwMDAwMDYwLCAweDAwMDAwMDAwLAotICAweDAwMDA0MTIwLCAweDAwMDAwMDAwLAotICAweDAwMDA0YTAwLCAweDAwMDA0MDAwLAotICAweDAwOTI0NDYwLCAweDAwMDAwMTkwLAotICAweDU2MDE0MDFhLCAweDAwMDA1OTU2LAotICAweDE0MDAwMDExLCAweDAwMDAwMDAwLAotICAweDAwOTM0MDUwLCAweDAwMDAwMDE4LAotICAweDAwOTMwMDUwLCAweDAwMDAwMDE4LAotICAweDM2MDE0MDNhLCAweDAwMDAwMDJkLAotICAweDAwMDY0M2E5LCAweDAwMDAwMDAwLAotICAweDAwMDBjNDIwLCAweDAwMDAwMTQwLAotICAweDU2MDE0MDFhLCAweDAwMDA1OTU2LAotICAweDE0MDAwMDExLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDEwLCAweDAwMDAwMDAwLAotICAweDAwMDAwMDEwLCAweDAwMDAwMDAwLAotICAweDAwMDY0MmE5LCAweDAwMDAwMDAwLAotICAweDAwMDI0NDIwLCAweDAwMDAwMTgzLAotICAweDU2MDE0MDFhLCAweDAwMDA1OTU2LAotICAweDgyMDAwMDE1LCAweDAwMDAyMDAwLAotICAweDE1MjAwMDExLCAweDAwMDAwMDAwLAotICAweDgyMDAwMDE1LCAweDAwMDAwMDEwLAotICAweDE1MjAwMDExLCAweDAwMDAwMDAwLAotICAweDgyMDAwMDE1LCAweDAwMDAwMDEwLAotICAweDE1MjAwMDExLCAweDAwMDAwMDAwLAotfTsJLyogMTA0IFJ4IGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBGSVJNV0FSRV9SWF9TSVpFIDEwNAotCi1zdGF0aWMgY29uc3QgdTMyIGZpcm13YXJlX3R4W10gPSB7Ci0gIDB4MDEwMDAzZGMsIDB4MDAwMDAwMDAsCi0gIDB4MDQwMDA0MjEsIDB4MDAwMDAwODYsCi0gIDB4ODAwMDAwMTUsIDB4MDAwMDE4MGUsCi0gIDB4ODEwMDAwMTUsIDB4MDAwMDY2NjQsCi0gIDB4MWEwMDQwYWIsIDB4MDAwMDBiMDYsCi0gIDB4MTQyMDAwMTEsIDB4MDAwMDAwMDAsCi0gIDB4MTQyMDQwMjIsIDB4MDAwMGFhYWEsCi0gIDB4MTQyMDQwMjIsIDB4MDAwMDAzMDAsCi0gIDB4MTQyMDQwMjIsIDB4MDAwMDAwMDAsCi0gIDB4MWEwMDQwYWIsIDB4MDAwMDBiMTQsCi0gIDB4MTQyMDAwMTEsIDB4MDAwMDAwMDAsCi0gIDB4ODMwMDAwMTUsIDB4MDAwMDAwMDIsCi0gIDB4MDQwMDAwMjEsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDAwMTAsIDB4MDAwMDAwMDAsCi0gIDB4MDQwMDA0MjEsIDB4MDAwMDAwODcsCi0gIDB4MDAwMDAwMTAsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDAwMTAsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDgwMTUsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDAwM2UsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDAwMTAsIDB4MDAwMDAwMDAsCi0gIDB4ODIwMDAwMTUsIDB4MDAwMDQwMDAsCi0gIDB4MDA5ZTgwNTAsIDB4MDAwMDAwMDAsCi0gIDB4MDMwMDgwMTUsIDB4MDAwMDAwMDAsCi0gIDB4ODYwMDgwMTUsIDB4MDAwMDAwMDAsCi0gIDB4ODIwMDAwMTUsIDB4MDAwMDgwMDAsCi0gIDB4MDEwMDAwMWMsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDUwYTAsIDB4MDAwMDAxMGMsCi0gIDB4NGUyMGQwMTEsIDB4MDAwMDYwMDgsCi0gIDB4MTQyMGQwMTIsIDB4MDAwMDQwMDgsCi0gIDB4MDAwMGYwOTAsIDB4MDAwMDcwMDAsCi0gIDB4MDAwMGM4YjAsIDB4MDAwMDMwMDAsCi0gIDB4MDAwMDQwNDAsIDB4MDAwMDAwMDAsCi0gIDB4MDAxMDgwMTUsIDB4MDAwMDAwMDAsCi0gIDB4MDBhMmMxNTAsIDB4MDAwMDQwMDAsCi0gIDB4MDBhNDAwYjAsIDB4MDAwMDAwMTQsCi0gIDB4MDAwMDAwMjAsIDB4MDAwMDAwMDAsCi0gIDB4MjUwMDQwMGQsIDB4MDAwMDI1MjUsCi0gIDB4MDAwNDcyMjAsIDB4MDAwMDMxMDAsCi0gIDB4MDA5MzQwNzAsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDAwMjAsIDB4MDAwMDAwMDAsCi0gIDB4MDA5MjQ0NjAsIDB4MDAwMDAxODQsCi0gIDB4MmIyMGMwMTEsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMGM0MjAsIDB4MDAwMDA1NDAsCi0gIDB4MzYwMTQwMTgsIDB4MDAwMDQyMmQsCi0gIDB4MTQyMDAwMTEsIDB4MDAwMDAwMDAsCi0gIDB4MDA5MjQ0NjAsIDB4MDAwMDAxODMsCi0gIDB4MzIwMDAwMWYsIDB4MDAwMDAwMzQsCi0gIDB4MDJhYzAwMTUsIDB4MDAwMDAwMDIsCi0gIDB4MDBhNjAxMTAsIDB4MDAwMDAwMDgsCi0gIDB4NDIyMDAwMTEsIDB4MDAwMDAwMDAsCi0gIDB4MDA5MjQwNjAsIDB4MDAwMDAxMDMsCi0gIDB4MDAwMDAwMWUsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDAwMjAsIDB4MDAwMDAxMDAsCi0gIDB4MDAwMDAwMWUsIDB4MDAwMDAwMDAsCi0gIDB4MDA5MjQ0NjAsIDB4MDAwMDAwODYsCi0gIDB4MDAwMDQwODAsIDB4MDAwMDAwMDAsCi0gIDB4MDA5MmMwNzAsIDB4MDAwMDAwMDAsCi0gIDB4MDA5MjQwNjAsIDB4MDAwMDAxMDAsCi0gIDB4MDAwMGM4OTAsIDB4MDAwMDUwMDAsCi0gIDB4MDBhNmMxMTAsIDB4MDAwMDAwMDAsCi0gIDB4MDBiMGMwOTAsIDB4MDAwMDAwMTIsCi0gIDB4MDIxYzAwMTUsIDB4MDAwMDAwMDAsCi0gIDB4MzIwMDAwMWYsIDB4MDAwMDAwMzQsCi0gIDB4MDA5MjQ0NjAsIDB4MDAwMDA1MTAsCi0gIDB4NDQyMTAwMTEsIDB4MDAwMDAwMDAsCi0gIDB4NDIwMDAwMTEsIDB4MDAwMDAwMDAsCi0gIDB4ODMwMDAwMTUsIDB4MDAwMDAwNDAsCi0gIDB4MDA5MjQ0NjAsIDB4MDAwMDA1MDgsCi0gIDB4NDUwMTQwMTgsIDB4MDAwMDQ1NDUsCi0gIDB4MDA4MDgwNTAsIDB4MDAwMDAwMDAsCi0gIDB4NjIyMDgwMTIsIDB4MDAwMDAwMDAsCi0gIDB4ODIwMDAwMTUsIDB4MDAwMDA4MDAsCi0gIDB4MTUyMDAwMTEsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDAwMTAsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDAwMTAsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDAwMTAsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDAwMTAsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDAwMTAsIDB4MDAwMDAwMDAsCi0gIDB4ODAwMDAwMTUsIDB4MDAwMGVlYTQsCi0gIDB4ODEwMDAwMTUsIDB4MDAwMDAwNWYsCi0gIDB4MDAwMDAwNjAsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDQxMjAsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDRhMDAsIDB4MDAwMDQwMDAsCi0gIDB4MDA5MjQ0NjAsIDB4MDAwMDAxOTAsCi0gIDB4NTYwMTQwMWEsIDB4MDAwMDU5NTYsCi0gIDB4MTQwMDAwMTEsIDB4MDAwMDAwMDAsCi0gIDB4MDA5MzQwNTAsIDB4MDAwMDAwMTgsCi0gIDB4MDA5MzAwNTAsIDB4MDAwMDAwMTgsCi0gIDB4MzYwMTQwM2EsIDB4MDAwMDAwMmQsCi0gIDB4MDAwNjQzYTksIDB4MDAwMDAwMDAsCi0gIDB4MDAwMGM0MjAsIDB4MDAwMDAxNDAsCi0gIDB4NTYwMTQwMWEsIDB4MDAwMDU5NTYsCi0gIDB4MTQwMDAwMTEsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDAwMTAsIDB4MDAwMDAwMDAsCi0gIDB4MDAwMDAwMTAsIDB4MDAwMDAwMDAsCi0gIDB4MDAwNjQyYTksIDB4MDAwMDAwMDAsCi0gIDB4MDAwMjQ0MjAsIDB4MDAwMDAxODMsCi0gIDB4NTYwMTQwMWEsIDB4MDAwMDU5NTYsCi0gIDB4ODIwMDAwMTUsIDB4MDAwMDIwMDAsCi0gIDB4MTUyMDAwMTEsIDB4MDAwMDAwMDAsCi0gIDB4ODIwMDAwMTUsIDB4MDAwMDAwMTAsCi0gIDB4MTUyMDAwMTEsIDB4MDAwMDAwMDAsCi0gIDB4ODIwMDAwMTUsIDB4MDAwMDAwMTAsCi0gIDB4MTUyMDAwMTEsIDB4MDAwMDAwMDAsCi19OwkvKiAxMDQgVHggaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIEZJUk1XQVJFX1RYX1NJWkUgMTA0Ci0jaWYgMAotc3RhdGljIGNvbnN0IHUzMiBmaXJtd2FyZV93b2xbXSA9IHsKLSAgMHgwMTAwMDNkYywgMHgwMDAwMDAwMCwKLSAgMHgxOTAwMDQyMSwgMHgwMDAwMDA4NywKLSAgMHg4MDAwMDAxNSwgMHgwMDAwMWExYSwKLSAgMHg4MTAwMDAxNSwgMHgwMDAwMWExYSwKLSAgMHgxYTAwNDBhYiwgMHgwMDAwMGIwNiwKLSAgMHgxNTIwMDAxMSwgMHgwMDAwMDAwMCwKLSAgMHgxNTIwNDAyMiwgMHgwMDAwYWFhYSwKLSAgMHgxNTIwNDAyMiwgMHgwMDAwMDMwMCwKLSAgMHgxNTIwNDAyMiwgMHgwMDAwMDAwMCwKLSAgMHgxYTAwNDBhYiwgMHgwMDAwMGIxNSwKLSAgMHgxNTIwMDAxMSwgMHgwMDAwMDAwMCwKLSAgMHg4MzAwMDAxNSwgMHgwMDAwMDAwMiwKLSAgMHgwNDAwMDAyMSwgMHgwMDAwMDAwMCwKLSAgMHgwMDAwMDAxMCwgMHgwMDAwMDAwMCwKLSAgMHgwNDAwMDQyMSwgMHgwMDAwMDA4NywKLSAgMHgwMDAwMDAxMCwgMHgwMDAwMDAwMCwKLSAgMHgwMDAwMDAxMCwgMHgwMDAwMDAwMCwKLSAgMHgwMDAwODAxNSwgMHgwMDAwMDAwMCwKLSAgMHgwMDAwMDAzZSwgMHgwMDAwMDAwMCwKLSAgMHgwMDAwMDAxMCwgMHgwMDAwMDAwMCwKLSAgMHgwMDAwMDAxMCwgMHgwMDAwMDAwMCwKLSAgMHg4MjAwMDAxNSwgMHgwMDAwNDAwMCwKLSAgMHg4MjAwMDAxNSwgMHgwMDAwODAwMCwKLSAgMHgwMDAwMDAwYywgMHgwMDAwMDAwMCwKLSAgMHgwMDAwMDAxMCwgMHgwMDAwMDAwMCwKLSAgMHgwMDAwNDA4MCwgMHgwMDAwMDEwMCwKLSAgMHgxZjIwYzAxMSwgMHgwMDAwMTEyMiwKLSAgMHgyNzIwZjAxMSwgMHgwMDAwMzAxMSwKLSAgMHgxOTIwMDA3MSwgMHgwMDAwMDAwMCwKLSAgMHgxYTIwMDA1MSwgMHgwMDAwMDAwMCwKLSAgMHgwMDAwMDAxMCwgMHgwMDAwMDAwMCwKLSAgMHgwMDAwMDAxMCwgMHgwMDAwMDAwMCwKLSAgMHgxZDIwNDBhNCwgMHgwMDAwMzM0NCwKLSAgMHgxZDIwNDBhMiwgMHgwMDAwNTU2NiwKLSAgMHgwMDAwNDBhMCwgMHgwMDAwMDEwMCwKLSAgMHgwMDEwODA1MCwgMHgwMDAwMDAwMSwKLSAgMHgxYTIwODAxMiwgMHgwMDAwMDAwNiwKLSAgMHg4MjAwMDAxNSwgMHgwMDAwODA4MCwKLSAgMHgwMTAwMDNkYywgMHgwMDAwMDAwMCwKLSAgMHgxZDIwNDBhNCwgMHgwMDAwMjIzMywKLSAgMHgxZDIwNDBhNCwgMHgwMDAwNDQ1NSwKLSAgMHgyZDIwODAxMSwgMHgwMDAwMDAwNSwKLSAgMHgxZDIwNDBhNCwgMHgwMDAwNjYxMSwKLSAgMHgwMDEwODA1MCwgMHgwMDAwMDAwMSwKLSAgMHgyNzIwMDAxMSwgMHgwMDAwMDAwMCwKLSAgMHgxZDIwNTBhNCwgMHgwMDAwNjYwMCwKLSAgMHg4MjAwMDAxNSwgMHgwMDAwODA4MCwKLSAgMHgwMTAwMDNkYywgMHgwMDAwMDAwMCwKLSAgMHgwMDAwMDA1MCwgMHgwMDAwMDAwMCwKLSAgMHgxYjIwMDAzMSwgMHgwMDAwMDAwMCwKLSAgMHgwMDAwMDAxZSwgMHgwMDAwMDAwMCwKLSAgMHgwMDAwMDAxZSwgMHgwMDAwMDAwMCwKLSAgMHgwMDAwMDAxZSwgMHgwMDAwMDAwMCwKLSAgMHgwMDAwMDAxZSwgMHgwMDAwMDAwMCwKLSAgMHgwMDkyNDQ2MCwgMHgwMDAwMDA4NiwKLSAgMHgwMDAwNDA4MCwgMHgwMDAwMDAwMCwKLSAgMHgwMDkyYzA3MCwgMHgwMDAwMDAwMCwKLSAgMHgwMDkyNDA2MCwgMHgwMDAwMDEwMCwKLSAgMHgwMDAwYzg5MCwgMHgwMDAwNTAwMCwKLSAgMHgwMGE2YzExMCwgMHgwMDAwMDAwMCwKLSAgMHgwMGIwYzA5MCwgMHgwMDAwMDAxMiwKLSAgMHgwMjFjMDAxNSwgMHgwMDAwMDAwMCwKLSAgMHgzMjAwMDAxZiwgMHgwMDAwMDAzNCwKLSAgMHgwMDkyNDQ2MCwgMHgwMDAwMDUxMCwKLSAgMHg0NDIxMDAxMSwgMHgwMDAwMDAwMCwKLSAgMHg0MjAwMDAxMSwgMHgwMDAwMDAwMCwKLSAgMHg4MzAwMDAxNSwgMHgwMDAwMDA0MCwKLSAgMHgwMDkyNDQ2MCwgMHgwMDAwMDUwOCwKLSAgMHg0NzZhMDAxMiwgMHgwMDAwMDEwMCwKLSAgMHg4MzAwMDAxNSwgMHgwMDAwMDAwOCwKLSAgMHgxNjIwMDAxMSwgMHgwMDAwMDAwMCwKLSAgMHgwMDFlODA1MCwgMHgwMDAwMDAwMCwKLSAgMHgwMDFlODA1MCwgMHgwMDAwMDAwMCwKLSAgMHgwMDgwODA1MCwgMHgwMDAwMDAwMCwKLSAgMHgwMzAwODAxNSwgMHgwMDAwMDAwMCwKLSAgMHg2MjIwODAxMiwgMHgwMDAwMDAwMCwKLSAgMHg4MjAwMDAxNSwgMHgwMDAwMDgwMCwKLSAgMHgxNjIwMDAxMSwgMHgwMDAwMDAwMCwKLSAgMHg4MDAwMDAxNSwgMHgwMDAwZWVhNCwKLSAgMHg4MTAwMDAxNSwgMHgwMDAwMDA1ZiwKLSAgMHgwMDAwMDAyMCwgMHgwMDAwMDAwMCwKLSAgMHgwMDAwNDEyMCwgMHgwMDAwMDAwMCwKLSAgMHgwMDAwNGEwMCwgMHgwMDAwNDAwMCwKLSAgMHgwMDkyNDQ2MCwgMHgwMDAwMDE5MCwKLSAgMHg1YzAxNDAxYSwgMHgwMDAwNTk1YywKLSAgMHgxNTAwMDAxMSwgMHgwMDAwMDAwMCwKLSAgMHgwMDkzNDA1MCwgMHgwMDAwMDAxOCwKLSAgMHgwMDkzMDA1MCwgMHgwMDAwMDAxOCwKLSAgMHgzNjAxNDAzYSwgMHgwMDAwMDAyZCwKLSAgMHgwMDA2NDAyOSwgMHgwMDAwMDAwMCwKLSAgMHgwMDAwYzQyMCwgMHgwMDAwMDE0MCwKLSAgMHg1YzAxNDAxYSwgMHgwMDAwNTk1YywKLSAgMHgxNTAwMDAxMSwgMHgwMDAwMDAwMCwKLSAgMHgwMDAwMDAxMCwgMHgwMDAwMDAwMCwKLSAgMHgwMDAwMDAxMCwgMHgwMDAwMDAwMCwKLSAgMHgwMDA2NDAyOSwgMHgwMDAwMDAwMCwKLSAgMHgwMDAyNDQyMCwgMHgwMDAwMDE4MywKLSAgMHg1YzAxNDAxYSwgMHgwMDAwNTk1YywKLSAgMHg4MjAwMDAxNSwgMHgwMDAwMjAwMCwKLSAgMHgxNjIwMDAxMSwgMHgwMDAwMDAwMCwKLSAgMHg4MjAwMDAxNSwgMHgwMDAwMDAxMCwKLSAgMHgxNjIwMDAxMSwgMHgwMDAwMDAwMCwKLSAgMHg4MjAwMDAxNSwgMHgwMDAwMDAxMCwKLSAgMHgxNjIwMDAxMSwgMHgwMDAwMDAwMCwKLX07CS8qIDEwNCBXb0wgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIEZJUk1XQVJFX1dPTF9TSVpFIDEwNAotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdGFyZmlyZV9maXJtd2FyZS5wbCBiL2RyaXZlcnMvbmV0L3N0YXJmaXJlX2Zpcm13YXJlLnBsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzgyYjgwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3N0YXJmaXJlX2Zpcm13YXJlLnBsCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyEvdXNyL2Jpbi9wZXJsCi0KLSMgVGhpcyBzY3JpcHQgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgYSBuZXcgc3RhcmZpcmVfZmlybXdhcmUuaAotIyBmcm9tIEdGUF9SWC5EQVQgYW5kIEdGUF9UWC5EQVQsIGZpbGVzIGluY2x1ZGVkIHdpdGggdGhlIERESwotIyBhbmQgYWxzbyB3aXRoIHRoZSBOb3ZlbGwgZHJpdmVycy4KLQotb3BlbiBGVywgIkdGUF9SWC5EQVQiIHx8IGRpZTsKLW9wZW4gRldILCAiPnN0YXJmaXJlX2Zpcm13YXJlLmgiIHx8IGRpZTsKLQotcHJpbnRmKEZXSCAic3RhdGljIHUzMiBmaXJtd2FyZV9yeFtdID0ge1xuIik7Ci0kY291bnRlciA9IDA7Ci13aGlsZSAoJGZvbyA9IDxGVz4pIHsKLSAgY2hvbXA7Ci0gIHByaW50ZihGV0ggIiAgMHglcywgMHgwMDAwJXMsXG4iLCBzdWJzdHIoJGZvbywgNCwgOCksIHN1YnN0cigkZm9vLCAwLCA0KSk7Ci0gICRjb3VudGVyKys7Ci19Ci0KLWNsb3NlIEZXOwotb3BlbiBGVywgIkdGUF9UWC5EQVQiIHx8IGRpZTsKLQotcHJpbnRmKEZXSCAifTtcdC8qICVkIFJ4IGluc3RydWN0aW9ucyAqL1xuI2RlZmluZSBGSVJNV0FSRV9SWF9TSVpFICVkXG5cbnN0YXRpYyB1MzIgZmlybXdhcmVfdHhbXSA9IHtcbiIsICRjb3VudGVyLCAkY291bnRlcik7Ci0kY291bnRlciA9IDA7Ci13aGlsZSAoJGZvbyA9IDxGVz4pIHsKLSAgY2hvbXA7Ci0gIHByaW50ZihGV0ggIiAgMHglcywgMHgwMDAwJXMsXG4iLCBzdWJzdHIoJGZvbywgNCwgOCksIHN1YnN0cigkZm9vLCAwLCA0KSk7Ci0gICRjb3VudGVyKys7Ci19Ci0KLWNsb3NlIEZXOwotcHJpbnRmKEZXSCAifTtcdC8qICVkIFR4IGluc3RydWN0aW9ucyAqL1xuI2RlZmluZSBGSVJNV0FSRV9UWF9TSVpFICVkXG4iLCAkY291bnRlciwgJGNvdW50ZXIpOwotY2xvc2UoRldIKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bmRhbmNlLmMgYi9kcml2ZXJzL25ldC9zdW5kYW5jZS5jCmluZGV4IDY5ODg5M2IuLmZlYWYwZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N1bmRhbmNlLmMKKysrIGIvZHJpdmVycy9uZXQvc3VuZGFuY2UuYwpAQCAtNDQ5LDYgKzQ0OSwxOSBAQAogCX0KIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBuZXRkZXZfb3BzID0geworCS5uZG9fb3BlbgkJPSBuZXRkZXZfb3BlbiwKKwkubmRvX3N0b3AJCT0gbmV0ZGV2X2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdAkJPSBzdGFydF90eCwKKwkubmRvX2dldF9zdGF0cyAJCT0gZ2V0X3N0YXRzLAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gc2V0X3J4X21vZGUsCisJLm5kb19kb19pb2N0bCAJCT0gbmV0ZGV2X2lvY3RsLAorCS5uZG9fdHhfdGltZW91dAkJPSB0eF90aW1lb3V0LAorCS5uZG9fY2hhbmdlX210dQkJPSBjaGFuZ2VfbXR1LAorCS5uZG9fc2V0X21hY19hZGRyZXNzIAk9IGV0aF9tYWNfYWRkciwKKwkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKK307CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IHN1bmRhbmNlX3Byb2JlMSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKQEAgLTUzMCwxNiArNTQzLDEwIEBACiAJbnAtPm1paV9pZi5yZWdfbnVtX21hc2sgPSAweDFmOwogCiAJLyogVGhlIGNoaXAtc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KLQlkZXYtPm9wZW4gPSAmbmV0ZGV2X29wZW47Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmc3RhcnRfdHg7Ci0JZGV2LT5zdG9wID0gJm5ldGRldl9jbG9zZTsKLQlkZXYtPmdldF9zdGF0cyA9ICZnZXRfc3RhdHM7Ci0JZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X3J4X21vZGU7Ci0JZGV2LT5kb19pb2N0bCA9ICZuZXRkZXZfaW9jdGw7CisJZGV2LT5uZXRkZXZfb3BzID0gJm5ldGRldl9vcHM7CiAJU0VUX0VUSFRPT0xfT1BTKGRldiwgJmV0aHRvb2xfb3BzKTsKLQlkZXYtPnR4X3RpbWVvdXQgPSAmdHhfdGltZW91dDsKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKLQlkZXYtPmNoYW5nZV9tdHUgPSAmY2hhbmdlX210dTsKKwogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOwogCiAJaSA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuZ2VtLmMgYi9kcml2ZXJzL25ldC9zdW5nZW0uYwppbmRleCA4YTc0NjA0Li44NmM3NjVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW5nZW0uYworKysgYi9kcml2ZXJzL25ldC9zdW5nZW0uYwpAQCAtMjk4OSw2ICsyOTg5LDE5IEBACiAJfQogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGdlbV9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbgkJPSBnZW1fb3BlbiwKKwkubmRvX3N0b3AJCT0gZ2VtX2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdAkJPSBnZW1fc3RhcnRfeG1pdCwKKwkubmRvX2dldF9zdGF0cwkJPSBnZW1fZ2V0X3N0YXRzLAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gZ2VtX3NldF9tdWx0aWNhc3QsCisJLm5kb19kb19pb2N0bAkJPSBnZW1faW9jdGwsCisJLm5kb190eF90aW1lb3V0CQk9IGdlbV90eF90aW1lb3V0LAorCS5uZG9fY2hhbmdlX210dQkJPSBnZW1fY2hhbmdlX210dSwKKwkubmRvX3NldF9tYWNfYWRkcmVzcyAJPSBldGhfbWFjX2FkZHIsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCit9OworCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBnZW1faW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewpAQCAtMzE0MiwxNyArMzE1NSwxMCBAQAogCWlmIChnZW1fZ2V0X2RldmljZV9hZGRyZXNzKGdwKSkKIAkJZ290byBlcnJfb3V0X2ZyZWVfY29uc2lzdGVudDsKIAotCWRldi0+b3BlbiA9IGdlbV9vcGVuOwotCWRldi0+c3RvcCA9IGdlbV9jbG9zZTsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGdlbV9zdGFydF94bWl0OwotCWRldi0+Z2V0X3N0YXRzID0gZ2VtX2dldF9zdGF0czsKLQlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IGdlbV9zZXRfbXVsdGljYXN0OwotCWRldi0+ZG9faW9jdGwgPSBnZW1faW9jdGw7CisJZGV2LT5uZXRkZXZfb3BzID0gJmdlbV9uZXRkZXZfb3BzOwogCW5ldGlmX25hcGlfYWRkKGRldiwgJmdwLT5uYXBpLCBnZW1fcG9sbCwgNjQpOwogCWRldi0+ZXRodG9vbF9vcHMgPSAmZ2VtX2V0aHRvb2xfb3BzOwotCWRldi0+dHhfdGltZW91dCA9IGdlbV90eF90aW1lb3V0OwogCWRldi0+d2F0Y2hkb2dfdGltZW8gPSA1ICogSFo7Ci0JZGV2LT5jaGFuZ2VfbXR1ID0gZ2VtX2NoYW5nZV9tdHU7CiAJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CiAJZGV2LT5kbWEgPSAwOwogCWRldi0+c2V0X21hY19hZGRyZXNzID0gZ2VtX3NldF9tYWNfYWRkcmVzczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bmhtZS5jIGIvZHJpdmVycy9uZXQvc3VuaG1lLmMKaW5kZXggYjIyZDMzNS4uN2E3MmEzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3VuaG1lLmMKKysrIGIvZHJpdmVycy9uZXQvc3VuaG1lLmMKQEAgLTI2MDcsNiArMjYwNywxOCBAQAogfQogI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBobWVfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gaGFwcHlfbWVhbF9vcGVuLAorCS5uZG9fc3RvcAkJPSBoYXBweV9tZWFsX2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdAkJPSBoYXBweV9tZWFsX3N0YXJ0X3htaXQsCisJLm5kb190eF90aW1lb3V0CQk9IGhhcHB5X21lYWxfdHhfdGltZW91dCwKKwkubmRvX2dldF9zdGF0cwkJPSBoYXBweV9tZWFsX2dldF9zdGF0cywKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IGhhcHB5X21lYWxfc2V0X211bHRpY2FzdCwKKwkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgCT0gZXRoX21hY19hZGRyLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorfTsKKwogI2lmZGVmIENPTkZJR19TQlVTCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBoYXBweV9tZWFsX3NidXNfcHJvYmVfb25lKHN0cnVjdCBvZl9kZXZpY2UgKm9wLCBpbnQgaXNfcWZlKQogewpAQCAtMjc1MCwxMiArMjc2Miw3IEBACiAJaW5pdF90aW1lcigmaHAtPmhhcHB5X3RpbWVyKTsKIAogCWhwLT5kZXYgPSBkZXY7Ci0JZGV2LT5vcGVuID0gJmhhcHB5X21lYWxfb3BlbjsKLQlkZXYtPnN0b3AgPSAmaGFwcHlfbWVhbF9jbG9zZTsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZoYXBweV9tZWFsX3N0YXJ0X3htaXQ7Ci0JZGV2LT5nZXRfc3RhdHMgPSAmaGFwcHlfbWVhbF9nZXRfc3RhdHM7Ci0JZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmaGFwcHlfbWVhbF9zZXRfbXVsdGljYXN0OwotCWRldi0+dHhfdGltZW91dCA9ICZoYXBweV9tZWFsX3R4X3RpbWVvdXQ7CisJZGV2LT5uZXRkZXZfb3BzID0gJmhtZV9uZXRkZXZfb3BzOwogCWRldi0+d2F0Y2hkb2dfdGltZW8gPSA1KkhaOwogCWRldi0+ZXRodG9vbF9vcHMgPSAmaG1lX2V0aHRvb2xfb3BzOwogCkBAIC0zMDc2LDEyICszMDgzLDcgQEAKIAlpbml0X3RpbWVyKCZocC0+aGFwcHlfdGltZXIpOwogCiAJaHAtPmRldiA9IGRldjsKLQlkZXYtPm9wZW4gPSAmaGFwcHlfbWVhbF9vcGVuOwotCWRldi0+c3RvcCA9ICZoYXBweV9tZWFsX2Nsb3NlOwotCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJmhhcHB5X21lYWxfc3RhcnRfeG1pdDsKLQlkZXYtPmdldF9zdGF0cyA9ICZoYXBweV9tZWFsX2dldF9zdGF0czsKLQlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZoYXBweV9tZWFsX3NldF9tdWx0aWNhc3Q7Ci0JZGV2LT50eF90aW1lb3V0ID0gJmhhcHB5X21lYWxfdHhfdGltZW91dDsKKwlkZXYtPm5ldGRldl9vcHMgPSAmaG1lX25ldGRldl9vcHM7CiAJZGV2LT53YXRjaGRvZ190aW1lbyA9IDUqSFo7CiAJZGV2LT5ldGh0b29sX29wcyA9ICZobWVfZXRodG9vbF9vcHM7CiAJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW52bmV0LmMgYi9kcml2ZXJzL25ldC9zdW52bmV0LmMKaW5kZXggMjMzZjFjZC4uNjExMjMwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3Vudm5ldC5jCisrKyBiL2RyaXZlcnMvbmV0L3N1bnZuZXQuYwpAQCAtMzM2LDcgKzMzNiw3IEBACiAJaWYgKElTX0VSUihkZXNjKSkKIAkJcmV0dXJuIFBUUl9FUlIoZGVzYyk7CiAKLQl2aW9kYmcoREFUQSwgInZpb193YWxrX3J4X29uZSBkZXNjWyUwMng6JTAyeDolMDh4OiUwOHg6JWx4OiVseF1cbiIsCisJdmlvZGJnKERBVEEsICJ2aW9fd2Fsa19yeF9vbmUgZGVzY1slMDJ4OiUwMng6JTA4eDolMDh4OiVsbHg6JWxseF1cbiIsCiAJICAgICAgIGRlc2MtPmhkci5zdGF0ZSwgZGVzYy0+aGRyLmFjaywKIAkgICAgICAgZGVzYy0+c2l6ZSwgZGVzYy0+bmNvb2tpZXMsCiAJICAgICAgIGRlc2MtPmNvb2tpZXNbMF0uY29va2llX2FkZHIsCkBAIC0zOTQsMTQgKzM5NCwxNCBAQAogCXN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyID0gJnBvcnQtPnZpby5kcmluZ3NbVklPX0RSSVZFUl9SWF9SSU5HXTsKIAlzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvID0gJnBvcnQtPnZpbzsKIAotCXZpb2RiZyhEQVRBLCAidm5ldF9yeCBzdHlwZV9lbnZbJTA0eF0gc2VxWyUwMTZseF0gcmN2X254dFslMDE2bHhdXG4iLAorCXZpb2RiZyhEQVRBLCAidm5ldF9yeCBzdHlwZV9lbnZbJTA0eF0gc2VxWyUwMTZsbHhdIHJjdl9ueHRbJTAxNmxseF1cbiIsCiAJICAgICAgIHBrdC0+dGFnLnN0eXBlX2VudiwgcGt0LT5zZXEsIGRyLT5yY3Zfbnh0KTsKIAogCWlmICh1bmxpa2VseShwa3QtPnRhZy5zdHlwZV9lbnYgIT0gVklPX0RSSU5HX0RBVEEpKQogCQlyZXR1cm4gMDsKIAlpZiAodW5saWtlbHkocGt0LT5zZXEgIT0gZHItPnJjdl9ueHQpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggIlJYIG91dCBvZiBzZXF1ZW5jZSBzZXFbMHglbHhdICIKLQkJICAgICAgICJyY3Zfbnh0WzB4JWx4XVxuIiwgcGt0LT5zZXEsIGRyLT5yY3Zfbnh0KTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiUlggb3V0IG9mIHNlcXVlbmNlIHNlcVsweCVsbHhdICIKKwkJICAgICAgICJyY3Zfbnh0WzB4JWxseF1cbiIsIHBrdC0+c2VxLCBkci0+cmN2X254dCk7CiAJCXJldHVybiAwOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdGVodXRpLmMgYi9kcml2ZXJzL25ldC90ZWh1dGkuYwppbmRleCBhMTBhODNhLi5hN2E0ZGM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90ZWh1dGkuYworKysgYi9kcml2ZXJzL25ldC90ZWh1dGkuYwpAQCAtMTAwNCw3ICsxMDA0LDcgQEAKICAqIHNrYiBmb3IgcnguIEl0IGFzc3VtZXMgdGhhdCBSeCBpcyBkZXNhYmxlZCBpbiBIVwogICogZnVuY3MgYXJlIGdyb3VwZWQgZm9yIGJldHRlciBjYWNoZSB1c2FnZQogICoKLSAqIFJ4RCBmaWZvIGlzIHNtYWxsZXIgdGhlbiBSeEYgZmlmbyBieSBkZXNpZ24uIFVwb24gaGlnaCBsb2FkLCBSeEQgd2lsbCBiZQorICogUnhEIGZpZm8gaXMgc21hbGxlciB0aGFuIFJ4RiBmaWZvIGJ5IGRlc2lnbi4gVXBvbiBoaWdoIGxvYWQsIFJ4RCB3aWxsIGJlCiAgKiBmaWxsZWQgYW5kIHBhY2tldHMgd2lsbCBiZSBkcm9wcGVkIGJ5IG5pYyB3aXRob3V0IGdldHRpbmcgaW50byBob3N0IG9yCiAgKiBjb3VzaW5nIGludGVycnVwdC4gQW55d2F5LCBpbiB0aGF0IGNvbmRpdGlvbiwgaG9zdCBoYXMgbm8gY2hhbmNlIHRvIHByb2NjZXNzCiAgKiBhbGwgcGFja2V0cywgYnV0IGRyb3BwaW5nIGluIG5pYyBpcyBjaGVhcGVyLCBzaW5jZSBpdCB0YWtlcyAwIGNwdSBjeWNsZXMKQEAgLTE4MjYsNyArMTgyNiw3IEBACiAgKgogICogUHVzaGVzIGRlc2MgdG8gVHhEIGZpZm8gYW5kIG92ZXJsYXBzIGl0IGlmIG5lZWRlZC4KICAqIE5PVEU6IHRoaXMgZnVuYyBkb2VzIG5vdCBjaGVjayBmb3IgYXZhaWxhYmxlIHNwYWNlLiB0aGlzIGlzIHJlc3BvbnNpYmlsaXR5Ci0gKiAgICBvZiB0aGUgY2FsbGVyLiBOZWl0aGVyIGRvZXMgaXQgY2hlY2sgdGhhdCBkYXRhIHNpemUgaXMgc21hbGxlciB0aGVuCisgKiAgICBvZiB0aGUgY2FsbGVyLiBOZWl0aGVyIGRvZXMgaXQgY2hlY2sgdGhhdCBkYXRhIHNpemUgaXMgc21hbGxlciB0aGFuCiAgKiAgICBmaWZvIHNpemUuCiAgKi8KIHN0YXRpYyB2b2lkIGJkeF90eF9wdXNoX2Rlc2Moc3RydWN0IGJkeF9wcml2ICpwcml2LCB2b2lkICpkYXRhLCBpbnQgc2l6ZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3RnMy5jIGIvZHJpdmVycy9uZXQvdGczLmMKaW5kZXggMDRhZTFlOC4uNWUyZGJhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdGczLmMKKysrIGIvZHJpdmVycy9uZXQvdGczLmMKQEAgLTQwLDYgKzQwLDcgQEAKICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9wcmVmZXRjaC5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KIAogI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgogI2luY2x1ZGUgPG5ldC9pcC5oPgpAQCAtMTM3LDYgKzEzOCwxMCBAQAogCiAjZGVmaW5lIFRHM19OVU1fVEVTVAkJNgogCisjZGVmaW5lIEZJUk1XQVJFX1RHMwkJInRpZ29uL3RnMy5iaW4iCisjZGVmaW5lIEZJUk1XQVJFX1RHM1RTTwkJInRpZ29uL3RnM190c28uYmluIgorI2RlZmluZSBGSVJNV0FSRV9URzNUU081CSJ0aWdvbi90ZzNfdHNvNS5iaW4iCisKIHN0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KIAlEUlZfTU9EVUxFX05BTUUgIi5jOnYiIERSVl9NT0RVTEVfVkVSU0lPTiAiICgiIERSVl9NT0RVTEVfUkVMREFURSAiKVxuIjsKIApAQCAtMTQ0LDYgKzE0OSwxMCBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJCcm9hZGNvbSBUaWdvbjMgZXRoZXJuZXQgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfVkVSU0lPTihEUlZfTU9EVUxFX1ZFUlNJT04pOworTU9EVUxFX0ZJUk1XQVJFKEZJUk1XQVJFX1RHMyk7CitNT0RVTEVfRklSTVdBUkUoRklSTVdBUkVfVEczVFNPKTsKK01PRFVMRV9GSVJNV0FSRShGSVJNV0FSRV9URzNUU081KTsKKwogCiBzdGF0aWMgaW50IHRnM19kZWJ1ZyA9IC0xOwkvKiAtMSA9PSB1c2UgVEczX0RFRl9NU0dfRU5BQkxFIGFzIHZhbHVlICovCiBtb2R1bGVfcGFyYW0odGczX2RlYnVnLCBpbnQsIDApOwpAQCAtNjIwNSwxMzAgKzYyMTQsNiBAQAogCXJldHVybiAwOwogfQogCi0jZGVmaW5lIFRHM19GV19SRUxFQVNFX01BSk9SCTB4MAotI2RlZmluZSBURzNfRldfUkVMQVNFX01JTk9SCTB4MAotI2RlZmluZSBURzNfRldfUkVMRUFTRV9GSVgJMHgwCi0jZGVmaW5lIFRHM19GV19TVEFSVF9BRERSCTB4MDgwMDAwMDAKLSNkZWZpbmUgVEczX0ZXX1RFWFRfQUREUgkweDA4MDAwMDAwCi0jZGVmaW5lIFRHM19GV19URVhUX0xFTgkJMHg5YzAKLSNkZWZpbmUgVEczX0ZXX1JPREFUQV9BRERSCTB4MDgwMDA5YzAKLSNkZWZpbmUgVEczX0ZXX1JPREFUQV9MRU4JMHg2MAotI2RlZmluZSBURzNfRldfREFUQV9BRERSCTB4MDgwMDBhNDAKLSNkZWZpbmUgVEczX0ZXX0RBVEFfTEVOCQkweDIwCi0jZGVmaW5lIFRHM19GV19TQlNTX0FERFIJMHgwODAwMGE2MAotI2RlZmluZSBURzNfRldfU0JTU19MRU4JCTB4YwotI2RlZmluZSBURzNfRldfQlNTX0FERFIJCTB4MDgwMDBhNzAKLSNkZWZpbmUgVEczX0ZXX0JTU19MRU4JCTB4MTAKLQotc3RhdGljIGNvbnN0IHUzMiB0ZzNGd1RleHRbKFRHM19GV19URVhUX0xFTiAvIHNpemVvZih1MzIpKSArIDFdID0gewotCTB4MDAwMDAwMDAsIDB4MTAwMDAwMDMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMGQsIDB4MDAwMDAwMGQsIDB4M2MxZDA4MDAsCi0JMHgzN2JkM2ZmYywgMHgwM2EwZjAyMSwgMHgzYzEwMDgwMCwgMHgyNjEwMDAwMCwgMHgwZTAwMDAxOCwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMDBkLCAweDNjMWQwODAwLCAweDM3YmQzZmZjLCAweDAzYTBmMDIxLCAweDNjMTAwODAwLCAweDI2MTAwMDM0LAotCTB4MGUwMDAyMWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMGQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0JMHgyN2JkZmZlMCwgMHgzYzFjYzAwMCwgMHhhZmJmMDAxOCwgMHhhZjgwNjgwYywgMHgwZTAwMDA0YywgMHgyNDFiMjEwNSwKLQkweDk3ODUwMDAwLCAweDk3ODcwMDAyLCAweDk3ODIwMDJjLCAweDk3ODMwMDJlLCAweDNjMDQwODAwLCAweDI0ODQwOWMwLAotCTB4YWZhMDAwMTQsIDB4MDAwMjE0MDAsIDB4MDA2MjE4MjUsIDB4MDAwNTJjMDAsIDB4YWZhMzAwMTAsIDB4OGY4NjAwMTAsCi0JMHgwMGU1MjgyNSwgMHgwZTAwMDA2MCwgMHgyNDA3MDEwMiwgMHgzYzAyYWMwMCwgMHgzNDQyMDEwMCwgMHgzYzAzYWMwMSwKLQkweDM0NjMwMTAwLCAweGFmODIwNDkwLCAweDNjMDJmZmZmLCAweGFmODIwNDk0LCAweGFmODMwNDk4LCAweGFmODIwNDljLAotCTB4MjQwMjAwMDEsIDB4YWY4MjVjZTAsIDB4MGUwMDAwM2YsIDB4YWY4MjVkMDAsIDB4MGUwMDAxNDAsIDB4MDAwMDAwMDAsCi0JMHg4ZmJmMDAxOCwgMHgwM2UwMDAwOCwgMHgyN2JkMDAyMCwgMHgyNDAyZmZmZiwgMHhhZjgyNTQwNCwgMHg4ZjgzNTQwMCwKLQkweDM0NjMwNDAwLCAweGFmODM1NDAwLCAweGFmODI1NDA0LCAweDNjMDIwODAwLCAweDI0NDIwMDM0LCAweGFmODI1NDFjLAotCTB4MDNlMDAwMDgsIDB4YWY4MDU0MDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4M2MwMjA4MDAsIDB4MzQ0MjMwMDAsCi0JMHgzYzAzMDgwMCwgMHgzNDYzMzAwMCwgMHgzYzA0MDgwMCwgMHgzNDg0MzdmZiwgMHgzYzAxMDgwMCwgMHhhYzIyMGE2NCwKLQkweDI0MDIwMDQwLCAweDNjMDEwODAwLCAweGFjMjIwYTY4LCAweDNjMDEwODAwLCAweGFjMjAwYTYwLCAweGFjNjAwMDAwLAotCTB4MjQ2MzAwMDQsIDB4MDA4MzEwMmIsIDB4NTA0MGZmZmQsIDB4YWM2MDAwMDAsIDB4MDNlMDAwMDgsIDB4MDAwMDAwMDAsCi0JMHgwMDgwNDgyMSwgMHg4ZmFhMDAxMCwgMHgzYzAyMDgwMCwgMHg4YzQyMGE2MCwgMHgzYzA0MDgwMCwgMHg4Yzg0MGE2OCwKLQkweDhmYWIwMDE0LCAweDI0NDMwMDAxLCAweDAwNDQxMDJiLCAweDNjMDEwODAwLCAweGFjMjMwYTYwLCAweDE0NDAwMDAzLAotCTB4MDAwMDQwMjEsIDB4M2MwMTA4MDAsIDB4YWMyMDBhNjAsIDB4M2MwMjA4MDAsIDB4OGM0MjBhNjAsIDB4M2MwMzA4MDAsCi0JMHg4YzYzMGE2NCwgMHg5MTI0MDAwMCwgMHgwMDAyMTE0MCwgMHgwMDQzMTAyMSwgMHgwMDQ4MTAyMSwgMHgyNTA4MDAwMSwKLQkweGEwNDQwMDAwLCAweDI5MDIwMDA4LCAweDE0NDBmZmY0LCAweDI1MjkwMDAxLCAweDNjMDIwODAwLCAweDhjNDIwYTYwLAotCTB4M2MwMzA4MDAsIDB4OGM2MzBhNjQsIDB4OGY4NDY4MGMsIDB4MDAwMjExNDAsIDB4MDA0MzEwMjEsIDB4YWM0NDAwMDgsCi0JMHhhYzQ1MDAwYywgMHhhYzQ2MDAxMCwgMHhhYzQ3MDAxNCwgMHhhYzRhMDAxOCwgMHgwM2UwMDAwOCwgMHhhYzRiMDAxYywKLQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0JMCwgMCwgMCwgMCwgMCwgMCwKLQkweDAyMDAwMDA4LCAweDAwMDAwMDAwLCAweDBhMDAwMWUzLCAweDNjMGEwMDAxLCAweDBhMDAwMWUzLCAweDNjMGEwMDAyLAotCTB4MGEwMDAxZTMsIDB4MDAwMDAwMDAsIDB4MGEwMDAxZTMsIDB4MDAwMDAwMDAsIDB4MGEwMDAxZTMsIDB4MDAwMDAwMDAsCi0JMHgwYTAwMDFlMywgMHgwMDAwMDAwMCwgMHgwYTAwMDFlMywgMHgwMDAwMDAwMCwgMHgwYTAwMDFlMywgMHgwMDAwMDAwMCwKLQkweDBhMDAwMWUzLCAweDAwMDAwMDAwLCAweDBhMDAwMWUzLCAweDAwMDAwMDAwLCAweDBhMDAwMWUzLCAweDAwMDAwMDAwLAotCTB4MGEwMDAxZTMsIDB4M2MwYTAwMDcsIDB4MGEwMDAxZTMsIDB4M2MwYTAwMDgsIDB4MGEwMDAxZTMsIDB4M2MwYTAwMDksCi0JMHgwYTAwMDFlMywgMHgwMDAwMDAwMCwgMHgwYTAwMDFlMywgMHgwMDAwMDAwMCwgMHgwYTAwMDFlMywgMHgzYzBhMDAwYiwKLQkweDBhMDAwMWUzLCAweDNjMGEwMDBjLCAweDBhMDAwMWUzLCAweDNjMGEwMDBkLCAweDBhMDAwMWUzLCAweDAwMDAwMDAwLAotCTB4MGEwMDAxZTMsIDB4MDAwMDAwMDAsIDB4MGEwMDAxZTMsIDB4M2MwYTAwMGUsIDB4MGEwMDAxZTMsIDB4MDAwMDAwMDAsCi0JMHgwYTAwMDFlMywgMHgwMDAwMDAwMCwgMHgwYTAwMDFlMywgMHgwMDAwMDAwMCwgMHgwYTAwMDFlMywgMHgwMDAwMDAwMCwKLQkweDBhMDAwMWUzLCAweDAwMDAwMDAwLCAweDBhMDAwMWUzLCAweDAwMDAwMDAwLCAweDBhMDAwMWUzLCAweDAwMDAwMDAwLAotCTB4MGEwMDAxZTMsIDB4MDAwMDAwMDAsIDB4MGEwMDAxZTMsIDB4M2MwYTAwMTMsIDB4MGEwMDAxZTMsIDB4M2MwYTAwMTQsCi0JMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0JMHgyN2JkZmZlMCwgMHgwMDAwMTgyMSwgMHgwMDAwMTAyMSwgMHhhZmJmMDAxOCwgMHhhZmIxMDAxNCwgMHhhZmIwMDAxMCwKLQkweDNjMDEwODAwLCAweDAwMjIwODIxLCAweGFjMjAwYTcwLCAweDNjMDEwODAwLCAweDAwMjIwODIxLCAweGFjMjAwYTc0LAotCTB4M2MwMTA4MDAsIDB4MDAyMjA4MjEsIDB4YWMyMDBhNzgsIDB4MjQ2MzAwMDEsIDB4MTg2MGZmZjUsIDB4MjQ0MjAwMGMsCi0JMHgyNDExMDAwMSwgMHg4ZjkwNjgxMCwgMHgzMjAyMDAwNCwgMHgxNDQwMDAwNSwgMHgyNDA0MDAwMSwgMHgzYzAyMDgwMCwKLQkweDhjNDIwYTc4LCAweDE4NDAwMDAzLCAweDAwMDAyMDIxLCAweDBlMDAwMTgyLCAweDAwMDAwMDAwLCAweDMyMDIwMDAxLAotCTB4MTA0MDAwMDMsIDB4MDAwMDAwMDAsIDB4MGUwMDAxNjksIDB4MDAwMDAwMDAsIDB4MGEwMDAxNTMsIDB4YWY5MTUwMjgsCi0JMHg4ZmJmMDAxOCwgMHg4ZmIxMDAxNCwgMHg4ZmIwMDAxMCwgMHgwM2UwMDAwOCwgMHgyN2JkMDAyMCwgMHgzYzA1MDgwMCwKLQkweDhjYTUwYTcwLCAweDNjMDYwODAwLCAweDhjYzYwYTgwLCAweDNjMDcwODAwLCAweDhjZTcwYTc4LCAweDI3YmRmZmUwLAotCTB4M2MwNDA4MDAsIDB4MjQ4NDA5ZDAsIDB4YWZiZjAwMTgsIDB4YWZhMDAwMTAsIDB4MGUwMDAwNjAsIDB4YWZhMDAwMTQsCi0JMHgwZTAwMDE3YiwgMHgwMDAwMjAyMSwgMHg4ZmJmMDAxOCwgMHgwM2UwMDAwOCwgMHgyN2JkMDAyMCwgMHgyNDAyMDAwMSwKLQkweDhmODM2ODEwLCAweDAwODIxMDA0LCAweDAwMDIxMDI3LCAweDAwNjIxODI0LCAweDAzZTAwMDA4LCAweGFmODM2ODEwLAotCTB4MjdiZGZmZDgsIDB4YWZiZjAwMjQsIDB4MTA4MDAwMmUsIDB4YWZiMDAwMjAsIDB4OGY4MjVjZWMsIDB4YWZhMjAwMTgsCi0JMHg4ZjgyNWNlYywgMHgzYzEwMDgwMCwgMHgyNjEwMGE3OCwgMHhhZmEyMDAxYywgMHgzNDAyODAwMCwgMHhhZjgyNWNlYywKLQkweDhlMDIwMDAwLCAweDE4NDAwMDE2LCAweDAwMDAwMDAwLCAweDNjMDIwODAwLCAweDk0NDIwYTc0LCAweDhmYTMwMDFjLAotCTB4MDAwMjIxYzAsIDB4YWM4MzAwMDQsIDB4OGZhMjAwMWMsIDB4M2MwMTA4MDAsIDB4MGUwMDAyMDEsIDB4YWMyMjBhNzQsCi0JMHgxMDQwMDAwNSwgMHgwMDAwMDAwMCwgMHg4ZTAyMDAwMCwgMHgyNDQyMDAwMSwgMHgwYTAwMDFkZiwgMHhhZTAyMDAwMCwKLQkweDNjMDIwODAwLCAweDhjNDIwYTcwLCAweDAwMDIxYzAyLCAweDAwMDMyMWMwLCAweDBhMDAwMWM1LCAweGFmYTIwMDFjLAotCTB4MGUwMDAyMDEsIDB4MDAwMDAwMDAsIDB4MTA0MDAwMWYsIDB4MDAwMDAwMDAsIDB4OGUwMjAwMDAsIDB4OGZhMzAwMWMsCi0JMHgyNDQyMDAwMSwgMHgzYzAxMDgwMCwgMHhhYzIzMGE3MCwgMHgzYzAxMDgwMCwgMHhhYzIzMGE3NCwgMHgwYTAwMDFkZiwKLQkweGFlMDIwMDAwLCAweDNjMTAwODAwLCAweDI2MTAwYTc4LCAweDhlMDIwMDAwLCAweDE4NDAwMDI4LCAweDAwMDAwMDAwLAotCTB4MGUwMDAyMDEsIDB4MDAwMDAwMDAsIDB4MTQ0MDAwMjQsIDB4MDAwMDAwMDAsIDB4OGUwMjAwMDAsIDB4M2MwMzA4MDAsCi0JMHg4YzYzMGE3MCwgMHgyNDQyZmZmZiwgMHhhZmEzMDAxYywgMHgxODQwMDAwNiwgMHhhZTAyMDAwMCwgMHgwMDAzMTQwMiwKLQkweDAwMDIyMWMwLCAweDhjODIwMDA0LCAweDNjMDEwODAwLCAweGFjMjIwYTcwLCAweDk3YTIwMDFlLCAweDI0NDJmZjAwLAotCTB4MmM0MjAzMDAsIDB4MTQ0MDAwMGIsIDB4MjQwMjQwMDAsIDB4M2MwNDA4MDAsIDB4MjQ4NDA5ZGMsIDB4YWZhMDAwMTAsCi0JMHhhZmEwMDAxNCwgMHg4ZmE2MDAxYywgMHgyNDA1MDAwOCwgMHgwZTAwMDA2MCwgMHgwMDAwMzgyMSwgMHgwYTAwMDFkZiwKLQkweDAwMDAwMDAwLCAweGFmODI1Y2Y4LCAweDNjMDIwODAwLCAweDhjNDIwYTQwLCAweDhmYTMwMDFjLCAweDI0NDIwMDAxLAotCTB4YWY4MzVjZjgsIDB4M2MwMTA4MDAsIDB4YWMyMjBhNDAsIDB4OGZiZjAwMjQsIDB4OGZiMDAwMjAsIDB4MDNlMDAwMDgsCi0JMHgyN2JkMDAyOCwgMHgyN2JkZmZlMCwgMHgzYzA0MDgwMCwgMHgyNDg0MDllOCwgMHgwMDAwMjgyMSwgMHgwMDAwMzAyMSwKLQkweDAwMDAzODIxLCAweGFmYmYwMDE4LCAweGFmYTAwMDEwLCAweDBlMDAwMDYwLCAweGFmYTAwMDE0LCAweDhmYmYwMDE4LAotCTB4MDNlMDAwMDgsIDB4MjdiZDAwMjAsIDB4OGY4MjY4MGMsIDB4OGY4NTY4MGMsIDB4MDAwMjE4MjcsIDB4MDAwMzE4MmIsCi0JMHgwMDAzMTgyMywgMHgwMDQzMTAyNCwgMHgwMDQ0MTAyMSwgMHgwMGEyMjgyYiwgMHgxMGEwMDAwNiwgMHgwMDAwMDAwMCwKLQkweDAwNDAxODIxLCAweDhmODI2ODBjLCAweDAwNDMxMDJiLCAweDE0NDBmZmZkLCAweDAwMDAwMDAwLCAweDAzZTAwMDA4LAotCTB4MDAwMDAwMDAsIDB4M2MwNDA4MDAsIDB4OGM4NDAwMDAsIDB4M2MwMzA4MDAsIDB4OGM2MzBhNDAsIDB4MDA2NDEwMmIsCi0JMHg1NDQwMDAwMiwgMHgwMDgzMTAyMywgMHgwMDY0MTAyMywgMHgyYzQyMDAwOCwgMHgwM2UwMDAwOCwgMHgzODQyMDAwMSwKLQkweDI3YmRmZmUwLCAweDAwODAyODIxLCAweDNjMDQwODAwLCAweDI0ODQwYTAwLCAweDAwMDAzMDIxLCAweDAwMDAzODIxLAotCTB4YWZiZjAwMTgsIDB4YWZhMDAwMTAsIDB4MGUwMDAwNjAsIDB4YWZhMDAwMTQsIDB4MGEwMDAyMTYsIDB4MDAwMDAwMDAsCi0JMHg4ZmJmMDAxOCwgMHgwM2UwMDAwOCwgMHgyN2JkMDAyMCwgMHgwMDAwMDAwMCwgMHgyN2JkZmZlMCwgMHgzYzFjYzAwMCwKLQkweGFmYmYwMDE4LCAweDBlMDAwMDRjLCAweGFmODA2ODBjLCAweDNjMDQwODAwLCAweDI0ODQwYTEwLCAweDAzODAyODIxLAotCTB4MDAwMDMwMjEsIDB4MDAwMDM4MjEsIDB4YWZhMDAwMTAsIDB4MGUwMDAwNjAsIDB4YWZhMDAwMTQsIDB4MjQwMmZmZmYsCi0JMHhhZjgyNTQwNCwgMHgzYzAyMDBhYSwgMHgwZTAwMDIzNCwgMHhhZjgyNTQzNCwgMHg4ZmJmMDAxOCwgMHgwM2UwMDAwOCwKLQkweDI3YmQwMDIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDI3YmRmZmU4LCAweGFmYjAwMDEwLAotCTB4MjQxMDAwMDEsIDB4YWZiZjAwMTQsIDB4M2MwMWMwMDMsIDB4YWMyMDAwMDAsIDB4OGY4MjY4MTAsIDB4MzA0MjIwMDAsCi0JMHgxMDQwMDAwMywgMHgwMDAwMDAwMCwgMHgwZTAwMDI0NiwgMHgwMDAwMDAwMCwgMHgwYTAwMDIzYSwgMHhhZjkwNTQyOCwKLQkweDhmYmYwMDE0LCAweDhmYjAwMDEwLCAweDAzZTAwMDA4LCAweDI3YmQwMDE4LCAweDI3YmRmZmY4LCAweDhmODQ1ZDBjLAotCTB4M2MwMjAwZmYsIDB4M2MwMzA4MDAsIDB4OGM2MzBhNTAsIDB4MzQ0MmZmZjgsIDB4MDA4MjEwMjQsIDB4MTA0MzAwMWUsCi0JMHgzYzA1MDBmZiwgMHgzNGE1ZmZmOCwgMHgzYzA2YzAwMywgMHgzYzA3NDAwMCwgMHgwMDg1MTgyNCwgMHg4YzYyMDAxMCwKLQkweDNjMDEwODAwLCAweGFjMjMwYTUwLCAweDMwNDIwMDA4LCAweDEwNDAwMDA1LCAweDAwODcxMDI1LCAweDhjYzIwMDAwLAotCTB4MjQ0MjAwMDEsIDB4YWNjMjAwMDAsIDB4MDA4NzEwMjUsIDB4YWY4MjVkMGMsIDB4OGZhMjAwMDAsIDB4MjQ0MjAwMDEsCi0JMHhhZmEyMDAwMCwgMHg4ZmEyMDAwMCwgMHg4ZmEyMDAwMCwgMHgyNDQyMDAwMSwgMHhhZmEyMDAwMCwgMHg4ZmEyMDAwMCwKLQkweDhmODQ1ZDBjLCAweDNjMDMwODAwLCAweDhjNjMwYTUwLCAweDAwODUxMDI0LCAweDE0NDNmZmU4LCAweDAwODUxODI0LAotCTB4MjdiZDAwMDgsIDB4MDNlMDAwMDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAKLX07Ci0KLXN0YXRpYyBjb25zdCB1MzIgdGczRndSb2RhdGFbKFRHM19GV19ST0RBVEFfTEVOIC8gc2l6ZW9mKHUzMikpICsgMV0gPSB7Ci0JMHgzNTM3MzAzMSwgMHg3MjZjNzM0MSwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg1Mzc3NDU3NiwgMHg2NTZlNzQzMCwKLQkweDAwMDAwMDAwLCAweDcyNmM3MDQ1LCAweDc2NjU2ZTc0LCAweDMxMDAwMDAwLCAweDU1NmU2YjZlLCAweDQ1NzY2ZTc0LAotCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NjY2MTc0NjEsIDB4NmM0NTcyNzIsCi0JMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0ZDYxNjk2ZSwgMHg0MzcwNzU0MiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwCi19OwotCi0jaWYgMCAvKiBBbGwgemVyb3MsIGRvbid0IGVhdCB1cCBzcGFjZSB3aXRoIGl0LiAqLwotdTMyIHRnM0Z3RGF0YVsoVEczX0ZXX0RBVEFfTEVOIC8gc2l6ZW9mKHUzMikpICsgMV0gPSB7Ci0JMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwCi19OwotI2VuZGlmCi0KICNkZWZpbmUgUlhfQ1BVX1NDUkFUQ0hfQkFTRQkweDMwMDAwCiAjZGVmaW5lIFJYX0NQVV9TQ1JBVENIX1NJWkUJMHgwNDAwMAogI2RlZmluZSBUWF9DUFVfU0NSQVRDSF9CQVNFCTB4MzQwMDAKQEAgLTYzODMsMTUgKzYyNjgsOSBAQAogfQogCiBzdHJ1Y3QgZndfaW5mbyB7Ci0JdW5zaWduZWQgaW50IHRleHRfYmFzZTsKLQl1bnNpZ25lZCBpbnQgdGV4dF9sZW47Ci0JY29uc3QgdTMyICp0ZXh0X2RhdGE7Ci0JdW5zaWduZWQgaW50IHJvZGF0YV9iYXNlOwotCXVuc2lnbmVkIGludCByb2RhdGFfbGVuOwotCWNvbnN0IHUzMiAqcm9kYXRhX2RhdGE7Ci0JdW5zaWduZWQgaW50IGRhdGFfYmFzZTsKLQl1bnNpZ25lZCBpbnQgZGF0YV9sZW47Ci0JY29uc3QgdTMyICpkYXRhX2RhdGE7CisJdW5zaWduZWQgaW50IGZ3X2Jhc2U7CisJdW5zaWduZWQgaW50IGZ3X2xlbjsKKwljb25zdCBfX2JlMzIgKmZ3X2RhdGE7CiB9OwogCiAvKiB0cC0+bG9jayBpcyBoZWxkLiAqLwpAQCAtNjQyOCwyNCArNjMwNywxMSBAQAogCQl3cml0ZV9vcCh0cCwgY3B1X3NjcmF0Y2hfYmFzZSArIGksIDApOwogCXR3MzIoY3B1X2Jhc2UgKyBDUFVfU1RBVEUsIDB4ZmZmZmZmZmYpOwogCXR3MzIoY3B1X2Jhc2UgKyBDUFVfTU9ERSwgdHIzMihjcHVfYmFzZStDUFVfTU9ERSl8Q1BVX01PREVfSEFMVCk7Ci0JZm9yIChpID0gMDsgaSA8IChpbmZvLT50ZXh0X2xlbiAvIHNpemVvZih1MzIpKTsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCAoaW5mby0+ZndfbGVuIC8gc2l6ZW9mKHUzMikpOyBpKyspCiAJCXdyaXRlX29wKHRwLCAoY3B1X3NjcmF0Y2hfYmFzZSArCi0JCQkgICAgICAoaW5mby0+dGV4dF9iYXNlICYgMHhmZmZmKSArCisJCQkgICAgICAoaW5mby0+ZndfYmFzZSAmIDB4ZmZmZikgKwogCQkJICAgICAgKGkgKiBzaXplb2YodTMyKSkpLAotCQkJIChpbmZvLT50ZXh0X2RhdGEgPwotCQkJICBpbmZvLT50ZXh0X2RhdGFbaV0gOiAwKSk7Ci0JZm9yIChpID0gMDsgaSA8IChpbmZvLT5yb2RhdGFfbGVuIC8gc2l6ZW9mKHUzMikpOyBpKyspCi0JCXdyaXRlX29wKHRwLCAoY3B1X3NjcmF0Y2hfYmFzZSArCi0JCQkgICAgICAoaW5mby0+cm9kYXRhX2Jhc2UgJiAweGZmZmYpICsKLQkJCSAgICAgIChpICogc2l6ZW9mKHUzMikpKSwKLQkJCSAoaW5mby0+cm9kYXRhX2RhdGEgPwotCQkJICBpbmZvLT5yb2RhdGFfZGF0YVtpXSA6IDApKTsKLQlmb3IgKGkgPSAwOyBpIDwgKGluZm8tPmRhdGFfbGVuIC8gc2l6ZW9mKHUzMikpOyBpKyspCi0JCXdyaXRlX29wKHRwLCAoY3B1X3NjcmF0Y2hfYmFzZSArCi0JCQkgICAgICAoaW5mby0+ZGF0YV9iYXNlICYgMHhmZmZmKSArCi0JCQkgICAgICAoaSAqIHNpemVvZih1MzIpKSksCi0JCQkgKGluZm8tPmRhdGFfZGF0YSA/Ci0JCQkgIGluZm8tPmRhdGFfZGF0YVtpXSA6IDApKTsKKwkJCSAgICAgIGJlMzJfdG9fY3B1KGluZm8tPmZ3X2RhdGFbaV0pKTsKIAogCWVyciA9IDA7CiAKQEAgLTY0NTcsMTcgKzYzMjMsMjAgQEAKIHN0YXRpYyBpbnQgdGczX2xvYWRfNTcwMV9hMF9maXJtd2FyZV9maXgoc3RydWN0IHRnMyAqdHApCiB7CiAJc3RydWN0IGZ3X2luZm8gaW5mbzsKKwljb25zdCBfX2JlMzIgKmZ3X2RhdGE7CiAJaW50IGVyciwgaTsKIAotCWluZm8udGV4dF9iYXNlID0gVEczX0ZXX1RFWFRfQUREUjsKLQlpbmZvLnRleHRfbGVuID0gVEczX0ZXX1RFWFRfTEVOOwotCWluZm8udGV4dF9kYXRhID0gJnRnM0Z3VGV4dFswXTsKLQlpbmZvLnJvZGF0YV9iYXNlID0gVEczX0ZXX1JPREFUQV9BRERSOwotCWluZm8ucm9kYXRhX2xlbiA9IFRHM19GV19ST0RBVEFfTEVOOwotCWluZm8ucm9kYXRhX2RhdGEgPSAmdGczRndSb2RhdGFbMF07Ci0JaW5mby5kYXRhX2Jhc2UgPSBURzNfRldfREFUQV9BRERSOwotCWluZm8uZGF0YV9sZW4gPSBURzNfRldfREFUQV9MRU47Ci0JaW5mby5kYXRhX2RhdGEgPSBOVUxMOworCWZ3X2RhdGEgPSAodm9pZCAqKXRwLT5mdy0+ZGF0YTsKKworCS8qIEZpcm13YXJlIGJsb2Igc3RhcnRzIHdpdGggdmVyc2lvbiBudW1iZXJzLCBmb2xsb3dlZCBieQorCSAgIHN0YXJ0IGFkZHJlc3MgYW5kIGxlbmd0aC4gV2UgYXJlIHNldHRpbmcgY29tcGxldGUgbGVuZ3RoLgorCSAgIGxlbmd0aCA9IGVuZF9hZGRyZXNzX29mX2JzcyAtIHN0YXJ0X2FkZHJlc3Nfb2ZfdGV4dC4KKwkgICBSZW1haW5kZXIgaXMgdGhlIGJsb2IgdG8gYmUgbG9hZGVkIGNvbnRpZ3VvdXNseQorCSAgIGZyb20gc3RhcnQgYWRkcmVzcy4gKi8KKworCWluZm8uZndfYmFzZSA9IGJlMzJfdG9fY3B1KGZ3X2RhdGFbMV0pOworCWluZm8uZndfbGVuID0gdHAtPmZ3LT5zaXplIC0gMTI7CisJaW5mby5md19kYXRhID0gJmZ3X2RhdGFbM107CiAKIAllcnIgPSB0ZzNfbG9hZF9maXJtd2FyZV9jcHUodHAsIFJYX0NQVV9CQVNFLAogCQkJCSAgICBSWF9DUFVfU0NSQVRDSF9CQVNFLCBSWF9DUFVfU0NSQVRDSF9TSVpFLApAQCAtNjQ4MywyMSArNjM1MiwyMSBAQAogCiAJLyogTm93IHN0YXJ0dXAgb25seSB0aGUgUlggY3B1LiAqLwogCXR3MzIoUlhfQ1BVX0JBU0UgKyBDUFVfU1RBVEUsIDB4ZmZmZmZmZmYpOwotCXR3MzJfZihSWF9DUFVfQkFTRSArIENQVV9QQywgICAgVEczX0ZXX1RFWFRfQUREUik7CisJdHczMl9mKFJYX0NQVV9CQVNFICsgQ1BVX1BDLCBpbmZvLmZ3X2Jhc2UpOwogCiAJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewotCQlpZiAodHIzMihSWF9DUFVfQkFTRSArIENQVV9QQykgPT0gVEczX0ZXX1RFWFRfQUREUikKKwkJaWYgKHRyMzIoUlhfQ1BVX0JBU0UgKyBDUFVfUEMpID09IGluZm8uZndfYmFzZSkKIAkJCWJyZWFrOwogCQl0dzMyKFJYX0NQVV9CQVNFICsgQ1BVX1NUQVRFLCAweGZmZmZmZmZmKTsKIAkJdHczMihSWF9DUFVfQkFTRSArIENQVV9NT0RFLCAgQ1BVX01PREVfSEFMVCk7Ci0JCXR3MzJfZihSWF9DUFVfQkFTRSArIENQVV9QQywgICAgVEczX0ZXX1RFWFRfQUREUik7CisJCXR3MzJfZihSWF9DUFVfQkFTRSArIENQVV9QQywgaW5mby5md19iYXNlKTsKIAkJdWRlbGF5KDEwMDApOwogCX0KIAlpZiAoaSA+PSA1KSB7CiAJCXByaW50ayhLRVJOX0VSUiBQRlggInRnM19sb2FkX2Zpcm13YXJlIGZhaWxzIGZvciAlcyAiCiAJCSAgICAgICAidG8gc2V0IFJYIENQVSBQQywgaXMgJTA4eCBzaG91bGQgYmUgJTA4eFxuIiwKIAkJICAgICAgIHRwLT5kZXYtPm5hbWUsIHRyMzIoUlhfQ1BVX0JBU0UgKyBDUFVfUEMpLAotCQkgICAgICAgVEczX0ZXX1RFWFRfQUREUik7CisJCSAgICAgICBpbmZvLmZ3X2Jhc2UpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJdHczMihSWF9DUFVfQkFTRSArIENQVV9TVEFURSwgMHhmZmZmZmZmZik7CkBAIC02NTA2LDU0NyArNjM3NSwzNiBAQAogCXJldHVybiAwOwogfQogCi0KLSNkZWZpbmUgVEczX1RTT19GV19SRUxFQVNFX01BSk9SCTB4MQotI2RlZmluZSBURzNfVFNPX0ZXX1JFTEFTRV9NSU5PUgkJMHg2Ci0jZGVmaW5lIFRHM19UU09fRldfUkVMRUFTRV9GSVgJCTB4MAotI2RlZmluZSBURzNfVFNPX0ZXX1NUQVJUX0FERFIJCTB4MDgwMDAwMDAKLSNkZWZpbmUgVEczX1RTT19GV19URVhUX0FERFIJCTB4MDgwMDAwMDAKLSNkZWZpbmUgVEczX1RTT19GV19URVhUX0xFTgkJMHgxYWEwCi0jZGVmaW5lIFRHM19UU09fRldfUk9EQVRBX0FERFIJCTB4MDgwMDFhYTAKLSNkZWZpbmUgVEczX1RTT19GV19ST0RBVEFfTEVOCQkweDYwCi0jZGVmaW5lIFRHM19UU09fRldfREFUQV9BRERSCQkweDA4MDAxYjIwCi0jZGVmaW5lIFRHM19UU09fRldfREFUQV9MRU4JCTB4MzAKLSNkZWZpbmUgVEczX1RTT19GV19TQlNTX0FERFIJCTB4MDgwMDFiNTAKLSNkZWZpbmUgVEczX1RTT19GV19TQlNTX0xFTgkJMHgyYwotI2RlZmluZSBURzNfVFNPX0ZXX0JTU19BRERSCQkweDA4MDAxYjgwCi0jZGVmaW5lIFRHM19UU09fRldfQlNTX0xFTgkJMHg4OTQKLQotc3RhdGljIGNvbnN0IHUzMiB0ZzNUc29Gd1RleHRbKFRHM19UU09fRldfVEVYVF9MRU4gLyA0KSArIDFdID0gewotCTB4MGUwMDAwMDMsIDB4MDAwMDAwMDAsIDB4MDgwMDFiMjQsIDB4MDAwMDAwMDAsIDB4MTAwMDAwMDMsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwZCwgMHgwMDAwMDAwZCwgMHgzYzFkMDgwMCwgMHgzN2JkNDAwMCwgMHgwM2EwZjAyMSwgMHgzYzEwMDgwMCwKLQkweDI2MTAwMDAwLCAweDBlMDAwMDEwLCAweDAwMDAwMDAwLCAweDAwMDAwMDBkLCAweDI3YmRmZmUwLCAweDNjMDRmZWZlLAotCTB4YWZiZjAwMTgsIDB4MGUwMDA1ZDgsIDB4MzQ4NDAwMDIsIDB4MGUwMDA2NjgsIDB4MDAwMDAwMDAsIDB4M2MwMzA4MDAsCi0JMHg5MDYzMWI2OCwgMHgyNDAyMDAwMiwgMHgzYzA0MDgwMCwgMHgyNDg0MWFhYywgMHgxNDYyMDAwMywgMHgyNDA1MDAwMSwKLQkweDNjMDQwODAwLCAweDI0ODQxYWEwLCAweDI0MDYwMDA2LCAweDAwMDAzODIxLCAweGFmYTAwMDEwLCAweDBlMDAwNjdjLAotCTB4YWZhMDAwMTQsIDB4OGY2MjVjNTAsIDB4MzQ0MjAwMDEsIDB4YWY2MjVjNTAsIDB4OGY2MjVjOTAsIDB4MzQ0MjAwMDEsCi0JMHhhZjYyNWM5MCwgMHgyNDAyZmZmZiwgMHgwZTAwMDAzNCwgMHhhZjYyNTQwNCwgMHg4ZmJmMDAxOCwgMHgwM2UwMDAwOCwKLQkweDI3YmQwMDIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDI3YmRmZmUwLCAweGFmYmYwMDFjLAotCTB4YWZiMjAwMTgsIDB4YWZiMTAwMTQsIDB4MGUwMDAwNWIsIDB4YWZiMDAwMTAsIDB4MjQxMjAwMDIsIDB4MjQxMTAwMDEsCi0JMHg4ZjcwNjgyMCwgMHgzMjAyMDEwMCwgMHgxMDQwMDAwMywgMHgwMDAwMDAwMCwgMHgwZTAwMDBiYiwgMHgwMDAwMDAwMCwKLQkweDhmNzA2ODIwLCAweDMyMDIyMDAwLCAweDEwNDAwMDA0LCAweDMyMDIwMDAxLCAweDBlMDAwMWYwLCAweDI0MDQwMDAxLAotCTB4MzIwMjAwMDEsIDB4MTA0MDAwMDMsIDB4MDAwMDAwMDAsIDB4MGUwMDAwYTMsIDB4MDAwMDAwMDAsIDB4M2MwMjA4MDAsCi0JMHg5MDQyMWI5OCwgMHgxNDUyMDAwMywgMHgwMDAwMDAwMCwgMHgwZTAwMDRjMCwgMHgwMDAwMDAwMCwgMHgwYTAwMDAzYywKLQkweGFmNzE1MDI4LCAweDhmYmYwMDFjLCAweDhmYjIwMDE4LCAweDhmYjEwMDE0LCAweDhmYjAwMDEwLCAweDAzZTAwMDA4LAotCTB4MjdiZDAwMjAsIDB4MjdiZGZmZTAsIDB4M2MwNDA4MDAsIDB4MjQ4NDFhYzAsIDB4MDAwMDI4MjEsIDB4MDAwMDMwMjEsCi0JMHgwMDAwMzgyMSwgMHhhZmJmMDAxOCwgMHhhZmEwMDAxMCwgMHgwZTAwMDY3YywgMHhhZmEwMDAxNCwgMHgzYzA0MDgwMCwKLQkweDI0ODQyM2Q4LCAweGE0ODAwMDAwLCAweDNjMDEwODAwLCAweGEwMjAxYjk4LCAweDNjMDEwODAwLCAweGFjMjAxYjljLAotCTB4M2MwMTA4MDAsIDB4YWMyMDFiYTAsIDB4M2MwMTA4MDAsIDB4YWMyMDFiYTQsIDB4M2MwMTA4MDAsIDB4YWMyMDFiYWMsCi0JMHgzYzAxMDgwMCwgMHhhYzIwMWJiOCwgMHgzYzAxMDgwMCwgMHhhYzIwMWJiYywgMHg4ZjYyNDQzNCwgMHgzYzAxMDgwMCwKLQkweGFjMjIxYjg4LCAweDhmNjI0NDM4LCAweDNjMDEwODAwLCAweGFjMjIxYjhjLCAweDhmNjI0NDEwLCAweGFjODBmN2E4LAotCTB4M2MwMTA4MDAsIDB4YWMyMDFiODQsIDB4M2MwMTA4MDAsIDB4YWMyMDIzZTAsIDB4M2MwMTA4MDAsIDB4YWMyMDIzYzgsCi0JMHgzYzAxMDgwMCwgMHhhYzIwMjNjYywgMHgzYzAxMDgwMCwgMHhhYzIwMjQwMCwgMHgzYzAxMDgwMCwgMHhhYzIyMWI5MCwKLQkweDhmNjIwMDY4LCAweDI0MDMwMDA3LCAweDAwMDIxNzAyLCAweDEwNDMwMDA1LCAweDAwMDAwMDAwLCAweDhmNjIwMDY4LAotCTB4MDAwMjE3MDIsIDB4MTQ0MDAwMDQsIDB4MjQwMjAwMDEsIDB4M2MwMTA4MDAsIDB4MGEwMDAwOTcsIDB4YWMyMDI0MGMsCi0JMHhhYzgyMDAzNCwgMHgzYzA0MDgwMCwgMHgyNDg0MWFjYywgMHgzYzA1MDgwMCwgMHg4Y2E1MjQwYywgMHgwMDAwMzAyMSwKLQkweDAwMDAzODIxLCAweGFmYTAwMDEwLCAweDBlMDAwNjdjLCAweGFmYTAwMDE0LCAweDhmYmYwMDE4LCAweDAzZTAwMDA4LAotCTB4MjdiZDAwMjAsIDB4MjdiZGZmZTAsIDB4M2MwNDA4MDAsIDB4MjQ4NDFhZDgsIDB4MDAwMDI4MjEsIDB4MDAwMDMwMjEsCi0JMHgwMDAwMzgyMSwgMHhhZmJmMDAxOCwgMHhhZmEwMDAxMCwgMHgwZTAwMDY3YywgMHhhZmEwMDAxNCwgMHgwZTAwMDA1YiwKLQkweDAwMDAwMDAwLCAweDBlMDAwMGI0LCAweDAwMDAyMDIxLCAweDhmYmYwMDE4LCAweDAzZTAwMDA4LCAweDI3YmQwMDIwLAotCTB4MjQwMjAwMDEsIDB4OGY2MzY4MjAsIDB4MDA4MjEwMDQsIDB4MDAwMjEwMjcsIDB4MDA2MjE4MjQsIDB4MDNlMDAwMDgsCi0JMHhhZjYzNjgyMCwgMHgyN2JkZmZkMCwgMHhhZmJmMDAyYywgMHhhZmI2MDAyOCwgMHhhZmI1MDAyNCwgMHhhZmI0MDAyMCwKLQkweGFmYjMwMDFjLCAweGFmYjIwMDE4LCAweGFmYjEwMDE0LCAweGFmYjAwMDEwLCAweDhmNjc1YzVjLCAweDNjMDMwODAwLAotCTB4MjQ2MzFiYmMsIDB4OGM2MjAwMDAsIDB4MTQ0NzAwMDUsIDB4M2MwMjAwZmYsIDB4M2MwMjA4MDAsIDB4OTA0MjFiOTgsCi0JMHgxNDQwMDExOSwgMHgzYzAyMDBmZiwgMHgzNDQyZmZmOCwgMHgwMGUyODgyNCwgMHhhYzY3MDAwMCwgMHgwMDExMTkwMiwKLQkweDMwNjMwMGZmLCAweDMwZTIwMDAzLCAweDAwMDIxMWMwLCAweDAwNjIyODI1LCAweDAwYTA0MDIxLCAweDAwMDcxNjAyLAotCTB4M2MwMzA4MDAsIDB4OTA2MzFiOTgsIDB4MzA0NDAwMGYsIDB4MTQ2MDAwMzYsIDB4MDA4MDQ4MjEsIDB4MjQwMjAwMDEsCi0JMHgzYzAxMDgwMCwgMHhhMDIyMWI5OCwgMHgwMDA1MTEwMCwgMHgwMDgyMTAyNSwgMHgzYzAxMDgwMCwgMHhhYzIwMWI5YywKLQkweDNjMDEwODAwLCAweGFjMjAxYmEwLCAweDNjMDEwODAwLCAweGFjMjAxYmE0LCAweDNjMDEwODAwLCAweGFjMjAxYmFjLAotCTB4M2MwMTA4MDAsIDB4YWMyMDFiYjgsIDB4M2MwMTA4MDAsIDB4YWMyMDFiYjAsIDB4M2MwMTA4MDAsIDB4YWMyMDFiYjQsCi0JMHgzYzAxMDgwMCwgMHhhNDIyMjNkOCwgMHg5NjIyMDAwYywgMHgzMDQzN2ZmZiwgMHgzYzAxMDgwMCwgMHhhNDIyMjQxMCwKLQkweDMwNDI4MDAwLCAweDNjMDEwODAwLCAweGE0MjMxYmM2LCAweDEwNDAwMDA1LCAweDI0MDIwMDAxLCAweDNjMDEwODAwLAotCTB4YWMyMjIzZjQsIDB4MGEwMDAxMDIsIDB4MjQwNjAwM2UsIDB4MjQwNjAwMzYsIDB4M2MwMTA4MDAsIDB4YWMyMDIzZjQsCi0JMHg5NjIyMDAwYSwgMHgzYzAzMDgwMCwgMHg5NDYzMWJjNiwgMHgzYzAxMDgwMCwgMHhhYzIwMjNmMCwgMHgzYzAxMDgwMCwKLQkweGFjMjAyM2Y4LCAweDAwMDIxMzAyLCAweDAwMDIxMDgwLCAweDAwYzIxMDIxLCAweDAwNjIxODIxLCAweDNjMDEwODAwLAotCTB4YTQyMjIzZDAsIDB4M2MwMTA4MDAsIDB4MGEwMDAxMTUsIDB4YTQyMzFiOTYsIDB4OTYyMjAwMGMsIDB4M2MwMTA4MDAsCi0JMHhhNDIyMjNlYywgMHgzYzA0MDgwMCwgMHgyNDg0MWI5YywgMHg4YzgyMDAwMCwgMHgwMDAyMTEwMCwgMHgzYzAxMDgwMCwKLQkweDAwMjIwODIxLCAweGFjMzExYmM4LCAweDhjODIwMDAwLCAweDAwMDIxMTAwLCAweDNjMDEwODAwLCAweDAwMjIwODIxLAotCTB4YWMyNzFiY2MsIDB4OGM4MjAwMDAsIDB4MjUwMzAwMDEsIDB4MzA2NjAxZmYsIDB4MDAwMjExMDAsIDB4M2MwMTA4MDAsCi0JMHgwMDIyMDgyMSwgMHhhYzI2MWJkMCwgMHg4YzgyMDAwMCwgMHgwMDAyMTEwMCwgMHgzYzAxMDgwMCwgMHgwMDIyMDgyMSwKLQkweGFjMjkxYmQ0LCAweDk2MjMwMDA4LCAweDNjMDIwODAwLCAweDhjNDIxYmFjLCAweDAwNDMyODIxLCAweDNjMDEwODAwLAotCTB4YWMyNTFiYWMsIDB4OTYyMjAwMGEsIDB4MzA0MjAwMDQsIDB4MTQ0MDAwMTgsIDB4MDAwNjExMDAsIDB4OGY2MzBjMTQsCi0JMHgzMDYzMDAwZiwgMHgyYzYyMDAwMiwgMHgxNDQwMDAwYiwgMHgzYzAyYzAwMCwgMHg4ZjYzMGMxNCwgMHgzYzAyMDgwMCwKLQkweDhjNDIxYjQwLCAweDMwNjMwMDBmLCAweDI0NDIwMDAxLCAweDNjMDEwODAwLCAweGFjMjIxYjQwLCAweDJjNjIwMDAyLAotCTB4MTA0MGZmZjcsIDB4M2MwMmMwMDAsIDB4MDBlMjE4MjUsIDB4YWY2MzVjNWMsIDB4OGY2MjVjNTAsIDB4MzA0MjAwMDIsCi0JMHgxMDQwMDAxNCwgMHgwMDAwMDAwMCwgMHgwYTAwMDE0NywgMHgwMDAwMDAwMCwgMHgzYzAzMDgwMCwgMHg4YzYzMWI4MCwKLQkweDNjMDQwODAwLCAweDk0ODQxYjk0LCAweDAxMjIxMDI1LCAweDNjMDEwODAwLCAweGE0MjIyM2RhLCAweDI0MDIwMDAxLAotCTB4M2MwMTA4MDAsIDB4YWMyMjFiYjgsIDB4MjQ2MzAwMDEsIDB4MDA4NTIwMmEsIDB4M2MwMTA4MDAsIDB4MTA4MDAwMDMsCi0JMHhhYzIzMWI4MCwgMHgzYzAxMDgwMCwgMHhhNDI1MWI5NCwgMHgzYzA2MDgwMCwgMHgyNGM2MWI5YywgMHg4Y2MyMDAwMCwKLQkweDI0NDIwMDAxLCAweGFjYzIwMDAwLCAweDI4NDIwMDgwLCAweDE0NDAwMDA1LCAweDAwMDAwMDAwLCAweDBlMDAwNjU2LAotCTB4MjQwNDAwMDIsIDB4MGEwMDAxZTYsIDB4MDAwMDAwMDAsIDB4M2MwMjA4MDAsIDB4OGM0MjFiYjgsIDB4MTA0MDAwNzgsCi0JMHgyNDAyMDAwMSwgMHgzYzA1MDgwMCwgMHg5MGE1MWI5OCwgMHgxNGEyMDA3MiwgMHgwMDAwMDAwMCwgMHgzYzE1MDgwMCwKLQkweDk2YjUxYjk2LCAweDNjMDQwODAwLCAweDhjODQxYmFjLCAweDMyYTNmZmZmLCAweDAwODMxMDJhLCAweDE0NDAwMDZjLAotCTB4MDAwMDAwMDAsIDB4MTQ4MzAwMDMsIDB4MDAwMDAwMDAsIDB4M2MwMTA4MDAsIDB4YWMyNTIzZjAsIDB4MTA2MDAwNWMsCi0JMHgwMDAwOTAyMSwgMHgyNGQ2MDAwNCwgMHgwMDYwYTAyMSwgMHgyNGQzMDAxNCwgMHg4ZWMyMDAwMCwgMHgwMDAyODEwMCwKLQkweDNjMTEwODAwLCAweDAyMzA4ODIxLCAweDBlMDAwNjI1LCAweDhlMzExYmM4LCAweDAwNDAyODIxLCAweDEwYTAwMDU0LAotCTB4MDAwMDAwMDAsIDB4OTYyODAwMGEsIDB4MzEwMjAwNDAsIDB4MTA0MDAwMDUsIDB4MjQwNzE4MGMsIDB4OGUyMjAwMGMsCi0JMHgyNDA3MTg4YywgMHgwMDAyMTQwMCwgMHhhY2EyMDAxOCwgMHgzYzAzMDgwMCwgMHgwMDcwMTgyMSwgMHg4YzYzMWJkMCwKLQkweDNjMDIwODAwLCAweDAwNTAxMDIxLCAweDhjNDIxYmQ0LCAweDAwMDMxZDAwLCAweDAwMDIxNDAwLCAweDAwNjIxODI1LAotCTB4YWNhMzAwMTQsIDB4OGVjMzAwMDQsIDB4OTYyMjAwMDgsIDB4MDA0MzIwMjMsIDB4MzI0MmZmZmYsIDB4MzA4M2ZmZmYsCi0JMHgwMDQzMTAyMSwgMHgwMjgyMTAyYSwgMHgxNDQwMDAwMiwgMHgwMmIyMzAyMywgMHgwMDgwMzAyMSwgMHg4ZTYyMDAwMCwKLQkweDMwYzRmZmZmLCAweDAwNDQxMDIxLCAweGFlNjIwMDAwLCAweDhlMjIwMDAwLCAweGFjYTIwMDAwLCAweDhlMjIwMDA0LAotCTB4OGU2M2ZmZjQsIDB4MDA0MzEwMjEsIDB4YWNhMjAwMDQsIDB4YTRhNjAwMGUsIDB4OGU2MmZmZjQsIDB4MDA0NDEwMjEsCi0JMHhhZTYyZmZmNCwgMHg5NjIzMDAwOCwgMHgwMDQzMTAyYSwgMHgxNDQwMDAwNSwgMHgwMjQ2OTAyMSwgMHg4ZTYyZmZmMCwKLQkweGFlNjBmZmY0LCAweDI0NDIwMDAxLCAweGFlNjJmZmYwLCAweGFjYTAwMDA4LCAweDMyNDJmZmZmLCAweDE0NTQwMDA4LAotCTB4MjQwMjAzMDUsIDB4MzEwMjAwODAsIDB4NTQ0MDAwMDEsIDB4MzRlNzAwMTAsIDB4MjQwMjA5MDUsIDB4YTRhMjAwMGMsCi0JMHgwYTAwMDFjYiwgMHgzNGU3MDAyMCwgMHhhNGEyMDAwYywgMHgzYzAyMDgwMCwgMHg4YzQyMjNmMCwgMHgxMDQwMDAwMywKLQkweDNjMDI0YjY1LCAweDBhMDAwMWQzLCAweDM0NDI3NjU0LCAweDNjMDJiNDlhLCAweDM0NDI4OWFiLCAweGFjYTIwMDFjLAotCTB4MzBlMmZmZmYsIDB4YWNhMjAwMTAsIDB4MGUwMDA1YTIsIDB4MDBhMDIwMjEsIDB4MzI0MmZmZmYsIDB4MDA1NDEwMmIsCi0JMHgxNDQwZmZhOSwgMHgwMDAwMDAwMCwgMHgyNDAyMDAwMiwgMHgzYzAxMDgwMCwgMHgwYTAwMDFlNiwgMHhhMDIyMWI5OCwKLQkweDhlYzIwODNjLCAweDI0NDIwMDAxLCAweDBhMDAwMWU2LCAweGFlYzIwODNjLCAweDBlMDAwNGMwLCAweDAwMDAwMDAwLAotCTB4OGZiZjAwMmMsIDB4OGZiNjAwMjgsIDB4OGZiNTAwMjQsIDB4OGZiNDAwMjAsIDB4OGZiMzAwMWMsIDB4OGZiMjAwMTgsCi0JMHg4ZmIxMDAxNCwgMHg4ZmIwMDAxMCwgMHgwM2UwMDAwOCwgMHgyN2JkMDAzMCwgMHgyN2JkZmZkMCwgMHhhZmJmMDAyOCwKLQkweGFmYjMwMDI0LCAweGFmYjIwMDIwLCAweGFmYjEwMDFjLCAweGFmYjAwMDE4LCAweDhmNzI1YzljLCAweDNjMDIwMGZmLAotCTB4MzQ0MmZmZjgsIDB4M2MwNzA4MDAsIDB4MjRlNzFiYjQsIDB4MDI0Mjg4MjQsIDB4OTYyMzAwMGUsIDB4OGNlMjAwMDAsCi0JMHgwMDQzMTAyMSwgMHhhY2UyMDAwMCwgMHg4ZTIyMDAxMCwgMHgzMDQyMDAyMCwgMHgxNDQwMDAxMSwgMHgwMDgwOTgyMSwKLQkweDBlMDAwNjNiLCAweDAyMjAyMDIxLCAweDNjMDJjMDAwLCAweDAyNDIxODI1LCAweGFmNjM1YzljLCAweDhmNjI1YzkwLAotCTB4MzA0MjAwMDIsIDB4MTA0MDAxMWUsIDB4MDAwMDAwMDAsIDB4YWY2MzVjOWMsIDB4OGY2MjVjOTAsIDB4MzA0MjAwMDIsCi0JMHgxMDQwMDExOSwgMHgwMDAwMDAwMCwgMHgwYTAwMDIwZCwgMHgwMDAwMDAwMCwgMHg4ZTI0MDAwOCwgMHg4ZTIzMDAxNCwKLQkweDAwMDQxNDAyLCAweDAwMDIzMWMwLCAweDAwMDMxNTAyLCAweDMwNDIwMWZmLCAweDI0NDJmZmZmLCAweDMwNDIwMDdmLAotCTB4MDAwMzE5NDIsIDB4MzA2Mzc4MDAsIDB4MDAwMjExMDAsIDB4MjQ0MjQwMDAsIDB4MDA2MjQ4MjEsIDB4OTUyMjAwMGEsCi0JMHgzMDg0ZmZmZiwgMHgzMDQyMDAwOCwgMHgxMDQwMDBiMCwgMHgwMDA0MjljMCwgMHgzYzAyMDgwMCwgMHg4YzQyMjQwMCwKLQkweDE0NDAwMDI0LCAweDI0YzUwMDA4LCAweDk0YzIwMDE0LCAweDNjMDEwODAwLCAweGE0MjIyM2QwLCAweDhjYzQwMDEwLAotCTB4MDAwNDE0MDIsIDB4M2MwMTA4MDAsIDB4YTQyMjIzZDIsIDB4M2MwMTA4MDAsIDB4YTQyNDIzZDQsIDB4OTRjMjAwMGUsCi0JMHgzMDgzZmZmZiwgMHgwMDQzMTAyMywgMHgzYzAxMDgwMCwgMHhhYzIyMjQwOCwgMHg5NGMyMDAxYSwgMHgzYzAxMDgwMCwKLQkweGFjMjYyNDAwLCAweDNjMDEwODAwLCAweGFjMzIyNDA0LCAweDNjMDEwODAwLCAweGFjMjIyM2ZjLCAweDNjMDJjMDAwLAotCTB4MDI0MjE4MjUsIDB4YWY2MzVjOWMsIDB4OGY2MjVjOTAsIDB4MzA0MjAwMDIsIDB4MTA0MDAwZTUsIDB4MDAwMDAwMDAsCi0JMHhhZjYzNWM5YywgMHg4ZjYyNWM5MCwgMHgzMDQyMDAwMiwgMHgxMDQwMDBlMCwgMHgwMDAwMDAwMCwgMHgwYTAwMDI0NiwKLQkweDAwMDAwMDAwLCAweDk0YzIwMDBlLCAweDNjMDMwODAwLCAweDk0NjMyM2Q0LCAweDAwNDM0MDIzLCAweDMxMDNmZmZmLAotCTB4MmM2MjAwMDgsIDB4MTA0MDAwMWMsIDB4MDAwMDAwMDAsIDB4OTRjMjAwMTQsIDB4MjQ0MjAwMjgsIDB4MDBhMjI4MjEsCi0JMHgwMDAzMTA0MiwgMHgxODQwMDAwYiwgMHgwMDAwMjAyMSwgMHgyNGU2MDg0OCwgMHgwMDQwMzgyMSwgMHg5NGEzMDAwMCwKLQkweDhjYzIwMDAwLCAweDI0ODQwMDAxLCAweDAwNDMxMDIxLCAweGFjYzIwMDAwLCAweDAwODcxMDJhLCAweDE0NDBmZmY5LAotCTB4MjRhNTAwMDIsIDB4MzEwMjAwMDEsIDB4MTA0MDAwMWYsIDB4M2MwMjQwMDAsIDB4M2MwNDA4MDAsIDB4MjQ4NDIzZmMsCi0JMHhhMGEwMDAwMSwgMHg5NGEzMDAwMCwgMHg4YzgyMDAwMCwgMHgwMDQzMTAyMSwgMHgwYTAwMDI4NSwgMHhhYzgyMDAwMCwKLQkweDhmNjI2ODAwLCAweDNjMDMwMDEwLCAweDAwNDMxMDI0LCAweDEwNDAwMDA5LCAweDAwMDAwMDAwLCAweDk0YzIwMDFhLAotCTB4M2MwMzA4MDAsIDB4OGM2MzIzZmMsIDB4MDA0MzEwMjEsIDB4M2MwMTA4MDAsIDB4YWMyMjIzZmMsIDB4MGEwMDAyODYsCi0JMHgzYzAyNDAwMCwgMHg5NGMyMDAxYSwgMHg5NGM0MDAxYywgMHgzYzAzMDgwMCwgMHg4YzYzMjNmYywgMHgwMDQ0MTAyMywKLQkweDAwNjIxODIxLCAweDNjMDEwODAwLCAweGFjMjMyM2ZjLCAweDNjMDI0MDAwLCAweDAyNDIxODI1LCAweGFmNjM1YzljLAotCTB4OGY2MjVjOTAsIDB4MzA0MjAwMDIsIDB4MTQ0MGZmZmMsIDB4MDAwMDAwMDAsIDB4OTUyMjAwMGEsIDB4MzA0MjAwMTAsCi0JMHgxMDQwMDA5YiwgMHgwMDAwMDAwMCwgMHgzYzAzMDgwMCwgMHg5NDYzMjNkNCwgMHgzYzA3MDgwMCwgMHgyNGU3MjQwMCwKLQkweDhjZTQwMDAwLCAweDhmNjI2ODAwLCAweDI0NjMwMDMwLCAweDAwODMyODIxLCAweDNjMDMwMDEwLCAweDAwNDMxMDI0LAotCTB4MTQ0MDAwMGEsIDB4MDAwMDAwMDAsIDB4OTRhMjAwMDQsIDB4M2MwNDA4MDAsIDB4OGM4NDI0MDgsIDB4M2MwMzA4MDAsCi0JMHg4YzYzMjNmYywgMHgwMDQ0MTAyMywgMHgwMDYyMTgyMSwgMHgzYzAxMDgwMCwgMHhhYzIzMjNmYywgMHgzYzA0MDgwMCwKLQkweDhjODQyM2ZjLCAweDAwMDQxYzAyLCAweDMwODJmZmZmLCAweDAwNjIyMDIxLCAweDAwMDQxNDAyLCAweDAwODIyMDIxLAotCTB4MDAwNDEwMjcsIDB4YTRhMjAwMDYsIDB4M2MwMzA4MDAsIDB4OGM2MzI0MDQsIDB4M2MwMjAwZmYsIDB4MzQ0MmZmZjgsCi0JMHgwMDYyODgyNCwgMHg5NjIyMDAwOCwgMHgyNDA1MDAwMSwgMHgyNDAzNDAwMCwgMHgwMDAyMzFjMCwgMHgwMDgwMTAyMSwKLQkweGE0YzIwMDFhLCAweGE0YzAwMDFjLCAweGFjZTAwMDAwLCAweDNjMDEwODAwLCAweGFjMjUxYjYwLCAweGFmNjM1Y2I4LAotCTB4OGY2MjVjYjAsIDB4MzA0MjAwMDIsIDB4MTA0MDAwMDMsIDB4MDAwMDAwMDAsIDB4M2MwMTA4MDAsIDB4YWMyMDFiNjAsCi0JMHg4ZTIyMDAwOCwgMHhhZjYyNWNiOCwgMHg4ZjYyNWNiMCwgMHgzMDQyMDAwMiwgMHgxMDQwMDAwMywgMHgwMDAwMDAwMCwKLQkweDNjMDEwODAwLCAweGFjMjAxYjYwLCAweDNjMDIwODAwLCAweDhjNDIxYjYwLCAweDEwNDBmZmVjLCAweDAwMDAwMDAwLAotCTB4M2MwNDA4MDAsIDB4MGUwMDA2M2IsIDB4OGM4NDI0MDQsIDB4MGEwMDAzMmEsIDB4MDAwMDAwMDAsIDB4M2MwMzA4MDAsCi0JMHg5MDYzMWI5OCwgMHgyNDAyMDAwMiwgMHgxNDYyMDAwMywgMHgzYzAzNGI2NSwgMHgwYTAwMDJlMSwgMHgwMDAwODAyMSwKLQkweDhlMjIwMDFjLCAweDM0NjM3NjU0LCAweDEwNDMwMDAyLCAweDI0MTAwMDAyLCAweDI0MTAwMDAxLCAweDAwYzAyMDIxLAotCTB4MGUwMDAzNTAsIDB4MDIwMDMwMjEsIDB4MjQwMjAwMDMsIDB4M2MwMTA4MDAsIDB4YTAyMjFiOTgsIDB4MjQwMjAwMDIsCi0JMHgxMjAyMDAwYSwgMHgyNDAyMDAwMSwgMHgzYzAzMDgwMCwgMHg4YzYzMjNmMCwgMHgxMDYyMDAwNiwgMHgwMDAwMDAwMCwKLQkweDNjMDIwODAwLCAweDk0NDIyM2Q4LCAweDAwMDIxNDAwLCAweDBhMDAwMzFmLCAweGFlMjIwMDE0LCAweDNjMDQwODAwLAotCTB4MjQ4NDIzZGEsIDB4OTQ4MjAwMDAsIDB4MDAwMjE0MDAsIDB4YWUyMjAwMTQsIDB4M2MwMjA4MDAsIDB4OGM0MjFiYmMsCi0JMHgzYzAzYzAwMCwgMHgzYzAxMDgwMCwgMHhhMDIwMWI5OCwgMHgwMDQzMTAyNSwgMHhhZjYyNWM1YywgMHg4ZjYyNWM1MCwKLQkweDMwNDIwMDAyLCAweDEwNDAwMDA5LCAweDAwMDAwMDAwLCAweDI0ODRmN2UyLCAweDhjODIwMDAwLCAweDAwNDMxMDI1LAotCTB4YWY2MjVjNWMsIDB4OGY2MjVjNTAsIDB4MzA0MjAwMDIsIDB4MTQ0MGZmZmEsIDB4MDAwMDAwMDAsIDB4M2MwMjA4MDAsCi0JMHgyNDQyMWI4NCwgMHg4YzQzMDAwMCwgMHgyNDYzMDAwMSwgMHhhYzQzMDAwMCwgMHg4ZjYzMGMxNCwgMHgzMDYzMDAwZiwKLQkweDJjNjIwMDAyLCAweDE0NDAwMDBjLCAweDNjMDI0MDAwLCAweDhmNjMwYzE0LCAweDNjMDIwODAwLCAweDhjNDIxYjQwLAotCTB4MzA2MzAwMGYsIDB4MjQ0MjAwMDEsIDB4M2MwMTA4MDAsIDB4YWMyMjFiNDAsIDB4MmM2MjAwMDIsIDB4MTA0MGZmZjcsCi0JMHgwMDAwMDAwMCwgMHgzYzAyNDAwMCwgMHgwMjQyMTgyNSwgMHhhZjYzNWM5YywgMHg4ZjYyNWM5MCwgMHgzMDQyMDAwMiwKLQkweDE0NDBmZmZjLCAweDAwMDAwMDAwLCAweDEyNjAwMDAzLCAweDAwMDAwMDAwLCAweDBlMDAwNGMwLCAweDAwMDAwMDAwLAotCTB4OGZiZjAwMjgsIDB4OGZiMzAwMjQsIDB4OGZiMjAwMjAsIDB4OGZiMTAwMWMsIDB4OGZiMDAwMTgsIDB4MDNlMDAwMDgsCi0JMHgyN2JkMDAzMCwgMHg4ZjYzNDQ1MCwgMHgzYzA0MDgwMCwgMHgyNDg0MWI4OCwgMHg4YzgyMDAwMCwgMHgwMDAzMWMwMiwKLQkweDAwNDMxMDJiLCAweDE0NDAwMDA3LCAweDNjMDM4MDAwLCAweDhjODQwMDA0LCAweDhmNjI0NDUwLCAweDAwMDIxYzAyLAotCTB4MDA4MzEwMmIsIDB4MTA0MGZmZmMsIDB4M2MwMzgwMDAsIDB4YWY2MzQ0NDQsIDB4OGY2MjQ0NDQsIDB4MDA0MzEwMjQsCi0JMHgxNDQwZmZmZCwgMHgwMDAwMDAwMCwgMHg4ZjYyNDQ0OCwgMHgwM2UwMDAwOCwgMHgzMDQyZmZmZiwgMHgzYzAyNDAwMCwKLQkweDAwODIyMDI1LCAweGFmNjQ1YzM4LCAweDhmNjI1YzMwLCAweDMwNDIwMDAyLCAweDE0NDBmZmZjLCAweDAwMDAwMDAwLAotCTB4MDNlMDAwMDgsIDB4MDAwMDAwMDAsIDB4MjdiZGZmZTAsIDB4MDA4MDU4MjEsIDB4MTRjMDAwMTEsIDB4MjU2ZTAwMDgsCi0JMHgzYzAyMDgwMCwgMHg4YzQyMjNmNCwgMHgxMDQwMDAwNywgMHgyNDAyMDAxNiwgMHgzYzAxMDgwMCwgMHhhNDIyMjNkMiwKLQkweDI0MDIwMDJhLCAweDNjMDEwODAwLCAweDBhMDAwMzY0LCAweGE0MjIyM2Q0LCAweDhkNjcwMDEwLCAweDAwMDcxNDAyLAotCTB4M2MwMTA4MDAsIDB4YTQyMjIzZDIsIDB4M2MwMTA4MDAsIDB4YTQyNzIzZDQsIDB4M2MwNDA4MDAsIDB4OTQ4NDIzZDQsCi0JMHgzYzAzMDgwMCwgMHg5NDYzMjNkMiwgMHg5NWNmMDAwNiwgMHgzYzAyMDgwMCwgMHg5NDQyMjNkMCwgMHgwMDgzMjAyMywKLQkweDAxZTJjMDIzLCAweDMwNjVmZmZmLCAweDI0YTIwMDI4LCAweDAxYzI0ODIxLCAweDMwODJmZmZmLCAweDE0YzAwMDFhLAotCTB4MDEyMjYwMjEsIDB4OTU4MjAwMGMsIDB4MzA0MjAwM2YsIDB4M2MwMTA4MDAsIDB4YTQyMjIzZDYsIDB4OTU4MjAwMDQsCi0JMHg5NTgzMDAwNiwgMHgzYzAxMDgwMCwgMHhhYzIwMjNlNCwgMHgzYzAxMDgwMCwgMHhhYzIwMjNlOCwgMHgwMDAyMTQwMCwKLQkweDAwNDMxMDI1LCAweDNjMDEwODAwLCAweGFjMjIxYmMwLCAweDk1MjIwMDA0LCAweDNjMDEwODAwLCAweGE0MjIxYmM0LAotCTB4OTUyMzAwMDIsIDB4MDFlNTEwMjMsIDB4MDA0MzEwMmEsIDB4MTA0MDAwMTAsIDB4MjQwMjAwMDEsIDB4M2MwMTA4MDAsCi0JMHgwYTAwMDM5OCwgMHhhYzIyMjNmOCwgMHgzYzAzMDgwMCwgMHg4YzYzMjNlOCwgMHgzYzAyMDgwMCwgMHg5NDQyMWJjNCwKLQkweDAwNDMxMDIxLCAweGE1MjIwMDA0LCAweDNjMDIwODAwLCAweDk0NDIxYmMwLCAweGE1ODIwMDA0LCAweDNjMDIwODAwLAotCTB4OGM0MjFiYzAsIDB4YTU4MjAwMDYsIDB4M2MwMjA4MDAsIDB4OGM0MjIzZjAsIDB4M2MwZDA4MDAsIDB4OGRhZDIzZTQsCi0JMHgzYzBhMDgwMCwgMHgxNDQwMDBlNSwgMHg4ZDRhMjNlOCwgMHgzYzAyMDgwMCwgMHg5NDQyMWJjNCwgMHgwMDRhMTgyMSwKLQkweDMwNjNmZmZmLCAweDAwNjIxODJiLCAweDI0MDIwMDAyLCAweDEwYzIwMDBkLCAweDAxNDM1MDIzLCAweDNjMDIwODAwLAotCTB4OTQ0MjIzZDYsIDB4MzA0MjAwMDksIDB4MTA0MDAwMDgsIDB4MDAwMDAwMDAsIDB4OTU4MjAwMGMsIDB4MzA0MmZmZjYsCi0JMHhhNTgyMDAwYywgMHgzYzAyMDgwMCwgMHg5NDQyMjNkNiwgMHgzMDQyMDAwOSwgMHgwMWEyNjgyMywgMHgzYzAyMDgwMCwKLQkweDhjNDIyM2Y4LCAweDEwNDAwMDRhLCAweDAxMjAzODIxLCAweDNjMDIwODAwLCAweDk0NDIyM2QyLCAweDAwMDA0MDIxLAotCTB4YTUyMDAwMGEsIDB4MDFlMjEwMjMsIDB4YTUyMjAwMDIsIDB4MzA4MmZmZmYsIDB4MDAwMjEwNDIsIDB4MTg0MDAwMDgsCi0JMHgwMDAwMzAyMSwgMHgwMDQwMTgyMSwgMHg5NGUyMDAwMCwgMHgyNTA4MDAwMSwgMHgwMGMyMzAyMSwgMHgwMTAzMTAyYSwKLQkweDE0NDBmZmZiLCAweDI0ZTcwMDAyLCAweDAwMDYxYzAyLCAweDMwYzJmZmZmLCAweDAwNjIzMDIxLCAweDAwMDYxNDAyLAotCTB4MDBjMjMwMjEsIDB4MDBjMDI4MjEsIDB4MDAwNjEwMjcsIDB4YTUyMjAwMGEsIDB4MDAwMDMwMjEsIDB4MjUyNzAwMGMsCi0JMHgwMDAwNDAyMSwgMHg5NGUyMDAwMCwgMHgyNTA4MDAwMSwgMHgwMGMyMzAyMSwgMHgyZDAyMDAwNCwgMHgxNDQwZmZmYiwKLQkweDI0ZTcwMDAyLCAweDk1MjIwMDAyLCAweDAwMDA0MDIxLCAweDkxMjMwMDA5LCAweDAwNDQyMDIzLCAweDAxODAzODIxLAotCTB4MzA4MmZmZmYsIDB4YTRlMDAwMTAsIDB4MDA2MjE4MjEsIDB4MDAwMjEwNDIsIDB4MTg0MDAwMTAsIDB4MDBjMzMwMjEsCi0JMHgwMDQwNDgyMSwgMHg5NGUyMDAwMCwgMHgyNGU3MDAwMiwgMHgwMGMyMzAyMSwgMHgzMGUyMDA3ZiwgMHgxNDQwMDAwNiwKLQkweDI1MDgwMDAxLCAweDhkNjMwMDAwLCAweDNjMDIwMDdmLCAweDM0NDJmZjgwLCAweDAwNjI1ODI0LCAweDI1NjcwMDA4LAotCTB4MDEwOTEwMmEsIDB4MTQ0MGZmZjMsIDB4MDAwMDAwMDAsIDB4MzA4MjAwMDEsIDB4MTA0MDAwMDUsIDB4MDAwNjFjMDIsCi0JMHhhMGUwMDAwMSwgMHg5NGUyMDAwMCwgMHgwMGMyMzAyMSwgMHgwMDA2MWMwMiwgMHgzMGMyZmZmZiwgMHgwMDYyMzAyMSwKLQkweDAwMDYxNDAyLCAweDAwYzIzMDIxLCAweDBhMDAwNDdkLCAweDMwYzZmZmZmLCAweDI0MDIwMDAyLCAweDE0YzIwMDgxLAotCTB4MDAwMDAwMDAsIDB4M2MwMjA4MDAsIDB4OGM0MjI0MGMsIDB4MTQ0MDAwMDcsIDB4MDAwMDAwMDAsIDB4M2MwMjA4MDAsCi0JMHg5NDQyMjNkMiwgMHg5NTIzMDAwMiwgMHgwMWUyMTAyMywgMHgxMDYyMDA3NywgMHgwMDAwMDAwMCwgMHgzYzAyMDgwMCwKLQkweDk0NDIyM2QyLCAweDAxZTIxMDIzLCAweGE1MjIwMDAyLCAweDNjMDIwODAwLCAweDhjNDIyNDBjLCAweDEwNDAwMDFhLAotCTB4MzFlM2ZmZmYsIDB4OGRjNzAwMTAsIDB4M2MwMjA4MDAsIDB4OTQ0MjFiOTYsIDB4MDBlMDQwMjEsIDB4MDAwNzJjMDIsCi0JMHgwMGFhMjAyMSwgMHgwMDQzMTAyMywgMHgwMDgyMzgyMywgMHgwMDA3MjQwMiwgMHgzMGUyZmZmZiwgMHgwMDgyMzgyMSwKLQkweDAwMDcxMDI3LCAweGE1MjIwMDBhLCAweDMxMDJmZmZmLCAweDNjMDQwODAwLCAweDk0ODQyM2Q0LCAweDAwNDUzMDIzLAotCTB4MDBlMDI4MjEsIDB4MDA2NDE4MjMsIDB4MDA2ZDE4MjEsIDB4MDBjMzMwMjEsIDB4MDAwNjFjMDIsIDB4MzBjMmZmZmYsCi0JMHgwYTAwMDQ3ZCwgMHgwMDYyMzAyMSwgMHgwMTIwMzgyMSwgMHgwMDAwNDAyMSwgMHgzMDgyZmZmZiwgMHgwMDAyMTA0MiwKLQkweDE4NDAwMDA4LCAweDAwMDAzMDIxLCAweDAwNDAxODIxLCAweDk0ZTIwMDAwLCAweDI1MDgwMDAxLCAweDAwYzIzMDIxLAotCTB4MDEwMzEwMmEsIDB4MTQ0MGZmZmIsIDB4MjRlNzAwMDIsIDB4MDAwNjFjMDIsIDB4MzBjMmZmZmYsIDB4MDA2MjMwMjEsCi0JMHgwMDA2MTQwMiwgMHgwMGMyMzAyMSwgMHgwMGMwMjgyMSwgMHgwMDA2MTAyNywgMHhhNTIyMDAwYSwgMHgwMDAwMzAyMSwKLQkweDI1MjcwMDBjLCAweDAwMDA0MDIxLCAweDk0ZTIwMDAwLCAweDI1MDgwMDAxLCAweDAwYzIzMDIxLCAweDJkMDIwMDA0LAotCTB4MTQ0MGZmZmIsIDB4MjRlNzAwMDIsIDB4OTUyMjAwMDIsIDB4MDAwMDQwMjEsIDB4OTEyMzAwMDksIDB4MDA0NDIwMjMsCi0JMHgwMTgwMzgyMSwgMHgzMDgyZmZmZiwgMHhhNGUwMDAxMCwgMHgzYzA0MDgwMCwgMHg5NDg0MjNkNCwgMHgwMDYyMTgyMSwKLQkweDAwYzMzMDIxLCAweDAwMDYxYzAyLCAweDMwYzJmZmZmLCAweDAwNjIzMDIxLCAweDAwMDYxYzAyLCAweDNjMDIwODAwLAotCTB4OTQ0MjIzZDAsIDB4MDBjMzQ4MjEsIDB4MDA0NDEwMjMsIDB4MDAwMjFmYzIsIDB4MDA0MzEwMjEsIDB4MDAwMjEwNDMsCi0JMHgxODQwMDAxMCwgMHgwMDAwMzAyMSwgMHgwMDQwMjAyMSwgMHg5NGUyMDAwMCwgMHgyNGU3MDAwMiwgMHgwMGMyMzAyMSwKLQkweDMwZTIwMDdmLCAweDE0NDAwMDA2LCAweDI1MDgwMDAxLCAweDhkNjMwMDAwLCAweDNjMDIwMDdmLCAweDM0NDJmZjgwLAotCTB4MDA2MjU4MjQsIDB4MjU2NzAwMDgsIDB4MDEwNDEwMmEsIDB4MTQ0MGZmZjMsIDB4MDAwMDAwMDAsIDB4M2MwMjA4MDAsCi0JMHg5NDQyMjNlYywgMHgwMGMyMzAyMSwgMHgzMTIyZmZmZiwgMHgwMGMyMzAyMSwgMHgwMDA2MWMwMiwgMHgzMGMyZmZmZiwKLQkweDAwNjIzMDIxLCAweDAwMDYxNDAyLCAweDAwYzIzMDIxLCAweDAwYzA0MDIxLCAweDAwMDYxMDI3LCAweGE1ODIwMDEwLAotCTB4YWRjMDAwMTQsIDB4MGEwMDA0OWQsIDB4YWRjMDAwMDAsIDB4OGRjNzAwMTAsIDB4MDBlMDQwMjEsIDB4MTE0MDAwMDcsCi0JMHgwMDA3MmMwMiwgMHgwMGFhMzAyMSwgMHgwMDA2MTQwMiwgMHgzMGMzZmZmZiwgMHgwMDQzMzAyMSwgMHgwMDA2MTQwMiwKLQkweDAwYzIyODIxLCAweDAwMDUxMDI3LCAweGE1MjIwMDBhLCAweDNjMDMwODAwLCAweDk0NjMyM2Q0LCAweDMxMDJmZmZmLAotCTB4MDFlMjEwMjEsIDB4MDA0MzMwMjMsIDB4MDBjZDMwMjEsIDB4MDAwNjFjMDIsIDB4MzBjMmZmZmYsIDB4MDA2MjMwMjEsCi0JMHgwMDA2MTQwMiwgMHgwMGMyMzAyMSwgMHgwMGMwNDAyMSwgMHgwMDA2MTAyNywgMHhhNTgyMDAxMCwgMHgzMTAyZmZmZiwKLQkweDAwMDUxYzAwLCAweDAwNDMxMDI1LCAweGFkYzIwMDEwLCAweDNjMDIwODAwLCAweDhjNDIyM2Y0LCAweDEwNDAwMDA1LAotCTB4MmRlMjA1ZWIsIDB4MTQ0MDAwMDIsIDB4MjVlMmZmZjIsIDB4MzQwMjg4NzAsIDB4YTVjMjAwMzQsIDB4M2MwMzA4MDAsCi0JMHgyNDYzMjNlOCwgMHg4YzYyMDAwMCwgMHgyNDQyMDAwMSwgMHhhYzYyMDAwMCwgMHgzYzA0MDgwMCwgMHg4Yzg0MjNlNCwKLQkweDNjMDIwODAwLCAweDhjNDIxYmMwLCAweDMzMDNmZmZmLCAweDAwODMyMDIxLCAweDAwNDMxODIxLCAweDAwNjIxMDJiLAotCTB4M2MwMTA4MDAsIDB4YWMyNDIzZTQsIDB4MTA0MDAwMDMsIDB4MjQ4MmZmZmYsIDB4M2MwMTA4MDAsIDB4YWMyMjIzZTQsCi0JMHgzYzAxMDgwMCwgMHhhYzIzMWJjMCwgMHgwM2UwMDAwOCwgMHgyN2JkMDAyMCwgMHgyN2JkZmZiOCwgMHgzYzA1MDgwMCwKLQkweDI0YTUxYjk2LCAweGFmYmYwMDQ0LCAweGFmYmUwMDQwLCAweGFmYjcwMDNjLCAweGFmYjYwMDM4LCAweGFmYjUwMDM0LAotCTB4YWZiNDAwMzAsIDB4YWZiMzAwMmMsIDB4YWZiMjAwMjgsIDB4YWZiMTAwMjQsIDB4YWZiMDAwMjAsIDB4OTRhOTAwMDAsCi0JMHgzYzAyMDgwMCwgMHg5NDQyMjNkMCwgMHgzYzAzMDgwMCwgMHg4YzYzMWJiMCwgMHgzYzA0MDgwMCwgMHg4Yzg0MWJhYywKLQkweDAxMjIxMDIzLCAweDAwNjQxODJhLCAweGE3YTkwMDFlLCAweDEwNjAwMGJlLCAweGE3YTIwMDE2LCAweDI0YmUwMDIyLAotCTB4OTdiNjAwMWUsIDB4MjRiMzAwMWEsIDB4MjRiNzAwMTYsIDB4OGZjMjAwMDAsIDB4MTQ0MDAwMDgsIDB4MDAwMDAwMDAsCi0JMHg4ZmMyZmZmOCwgMHg5N2EzMDAxNiwgMHg4ZmM0ZmZmNCwgMHgwMDQzMTAyMSwgMHgwMDgyMjAyYSwgMHgxNDgwMDBiMCwKLQkweDAwMDAwMDAwLCAweDk3ZDUwODE4LCAweDMyYTJmZmZmLCAweDEwNDAwMGEzLCAweDAwMDA5MDIxLCAweDAwNDBhMDIxLAotCTB4MDAwMDg4MjEsIDB4MGUwMDA2MjUsIDB4MDAwMDAwMDAsIDB4MDA0MDMwMjEsIDB4MTRjMDAwMDcsIDB4MDAwMDAwMDAsCi0JMHgzYzAyMDgwMCwgMHg4YzQyMjNkYywgMHgyNDQyMDAwMSwgMHgzYzAxMDgwMCwgMHgwYTAwMDU5NiwgMHhhYzIyMjNkYywKLQkweDNjMTAwODAwLCAweDAyMTE4MDIxLCAweDhlMTAxYmM4LCAweDk2MDgwMDBhLCAweDMxMDIwMDQwLCAweDEwNDAwMDA1LAotCTB4MjQwNzE4MGMsIDB4OGUwMjAwMGMsIDB4MjQwNzE4OGMsIDB4MDAwMjE0MDAsIDB4YWNjMjAwMTgsIDB4MzEwMjAwODAsCi0JMHg1NDQwMDAwMSwgMHgzNGU3MDAxMCwgMHgzYzAyMDgwMCwgMHgwMDUxMTAyMSwgMHg4YzQyMWJkMCwgMHgzYzAzMDgwMCwKLQkweDAwNzExODIxLCAweDhjNjMxYmQ0LCAweDAwMDIxNTAwLCAweDAwMDMxYzAwLCAweDAwNDMxMDI1LCAweGFjYzIwMDE0LAotCTB4OTYwNDAwMDgsIDB4MzI0MmZmZmYsIDB4MDA4MjEwMjEsIDB4MDI4MjEwMmEsIDB4MTQ0MDAwMDIsIDB4MDJiMjI4MjMsCi0JMHgwMDgwMjgyMSwgMHg4ZTAyMDAwMCwgMHgwMjQ1OTAyMSwgMHhhY2MyMDAwMCwgMHg4ZTAyMDAwNCwgMHgwMGMwMjAyMSwKLQkweDI2MzEwMDEwLCAweGFjODIwMDA0LCAweDMwZTJmZmZmLCAweGFjODAwMDA4LCAweGE0ODUwMDBlLCAweGFjODIwMDEwLAotCTB4MjQwMjAzMDUsIDB4MGUwMDA1YTIsIDB4YTQ4MjAwMGMsIDB4MzI0MmZmZmYsIDB4MDA1NDEwMmIsIDB4MTQ0MGZmYzUsCi0JMHgzMjQyZmZmZiwgMHgwYTAwMDU4ZSwgMHgwMDAwMDAwMCwgMHg4ZTYyMDAwMCwgMHg4ZTYzZmZmYywgMHgwMDQzMTAyYSwKLQkweDEwNDAwMDY3LCAweDAwMDAwMDAwLCAweDhlNjJmZmYwLCAweDAwMDI4OTAwLCAweDNjMTAwODAwLCAweDAyMTE4MDIxLAotCTB4MGUwMDA2MjUsIDB4OGUxMDFiYzgsIDB4MDA0MDMwMjEsIDB4MTRjMDAwMDUsIDB4MDAwMDAwMDAsIDB4OGU2MjA4MmMsCi0JMHgyNDQyMDAwMSwgMHgwYTAwMDU5NiwgMHhhZTYyMDgyYywgMHg5NjA4MDAwYSwgMHgzMTAyMDA0MCwgMHgxMDQwMDAwNSwKLQkweDI0MDcxODBjLCAweDhlMDIwMDBjLCAweDI0MDcxODhjLCAweDAwMDIxNDAwLCAweGFjYzIwMDE4LCAweDNjMDIwODAwLAotCTB4MDA1MTEwMjEsIDB4OGM0MjFiZDAsIDB4M2MwMzA4MDAsIDB4MDA3MTE4MjEsIDB4OGM2MzFiZDQsIDB4MDAwMjE1MDAsCi0JMHgwMDAzMWMwMCwgMHgwMDQzMTAyNSwgMHhhY2MyMDAxNCwgMHg4ZTYzZmZmNCwgMHg5NjAyMDAwOCwgMHgwMDQzMjAyMywKLQkweDMyNDJmZmZmLCAweDMwODNmZmZmLCAweDAwNDMxMDIxLCAweDAyYzIxMDJhLCAweDEwNDAwMDAzLCAweDAwODAyODIxLAotCTB4OTdhOTAwMWUsIDB4MDEzMjI4MjMsIDB4OGU2MjAwMDAsIDB4MzBhNGZmZmYsIDB4MDA0NDEwMjEsIDB4YWU2MjAwMDAsCi0JMHhhNGM1MDAwZSwgMHg4ZTAyMDAwMCwgMHhhY2MyMDAwMCwgMHg4ZTAyMDAwNCwgMHg4ZTYzZmZmNCwgMHgwMDQzMTAyMSwKLQkweGFjYzIwMDA0LCAweDhlNjNmZmY0LCAweDk2MDIwMDA4LCAweDAwNjQxODIxLCAweDAwNjIxMDJhLCAweDE0NDAwMDA2LAotCTB4MDI0NTkwMjEsIDB4OGU2MmZmZjAsIDB4YWU2MGZmZjQsIDB4MjQ0MjAwMDEsIDB4MGEwMDA1NzEsIDB4YWU2MmZmZjAsCi0JMHhhZTYzZmZmNCwgMHhhY2MwMDAwOCwgMHgzMjQyZmZmZiwgMHgxMDU2MDAwMywgMHgzMTAyMDAwNCwgMHgxMDQwMDAwNiwKLQkweDI0MDIwMzA1LCAweDMxMDIwMDgwLCAweDU0NDAwMDAxLCAweDM0ZTcwMDEwLCAweDM0ZTcwMDIwLCAweDI0MDIwOTA1LAotCTB4YTRjMjAwMGMsIDB4OGVlMzAwMDAsIDB4OGVlMjAwMDQsIDB4MTQ2MjAwMDcsIDB4M2MwMmI0OWEsIDB4OGVlMjA4NjAsCi0JMHg1NDQwMDAwMSwgMHgzNGU3MDQwMCwgMHgzYzAyNGI2NSwgMHgwYTAwMDU4OCwgMHgzNDQyNzY1NCwgMHgzNDQyODlhYiwKLQkweGFjYzIwMDFjLCAweDMwZTJmZmZmLCAweGFjYzIwMDEwLCAweDBlMDAwNWEyLCAweDAwYzAyMDIxLCAweDMyNDJmZmZmLAotCTB4MDA1NjEwMmIsIDB4MTQ0MGZmOWIsIDB4MDAwMDAwMDAsIDB4OGU2MjAwMDAsIDB4OGU2M2ZmZmMsIDB4MDA0MzEwMmEsCi0JMHgxNDQwZmY0OCwgMHgwMDAwMDAwMCwgMHg4ZmJmMDA0NCwgMHg4ZmJlMDA0MCwgMHg4ZmI3MDAzYywgMHg4ZmI2MDAzOCwKLQkweDhmYjUwMDM0LCAweDhmYjQwMDMwLCAweDhmYjMwMDJjLCAweDhmYjIwMDI4LCAweDhmYjEwMDI0LCAweDhmYjAwMDIwLAotCTB4MDNlMDAwMDgsIDB4MjdiZDAwNDgsIDB4MjdiZGZmZTgsIDB4YWZiZjAwMTQsIDB4YWZiMDAwMTAsIDB4OGY2MjQ0NTAsCi0JMHg4ZjYzNDQxMCwgMHgwYTAwMDViMSwgMHgwMDgwODAyMSwgMHg4ZjYyNjgyMCwgMHgzMDQyMjAwMCwgMHgxMDQwMDAwMywKLQkweDAwMDAwMDAwLCAweDBlMDAwMWYwLCAweDAwMDAyMDIxLCAweDhmNjI0NDUwLCAweDhmNjM0NDEwLCAweDMwNDJmZmZmLAotCTB4MDA0MzEwMmIsIDB4MTQ0MGZmZjUsIDB4MDAwMDAwMDAsIDB4OGY2MzBjMTQsIDB4MzA2MzAwMGYsIDB4MmM2MjAwMDIsCi0JMHgxNDQwMDAwYiwgMHgwMDAwMDAwMCwgMHg4ZjYzMGMxNCwgMHgzYzAyMDgwMCwgMHg4YzQyMWI0MCwgMHgzMDYzMDAwZiwKLQkweDI0NDIwMDAxLCAweDNjMDEwODAwLCAweGFjMjIxYjQwLCAweDJjNjIwMDAyLCAweDEwNDBmZmY3LCAweDAwMDAwMDAwLAotCTB4YWY3MDVjMTgsIDB4OGY2MjVjMTAsIDB4MzA0MjAwMDIsIDB4MTA0MDAwMDksIDB4MDAwMDAwMDAsIDB4OGY2MjY4MjAsCi0JMHgzMDQyMjAwMCwgMHgxMDQwZmZmOCwgMHgwMDAwMDAwMCwgMHgwZTAwMDFmMCwgMHgwMDAwMjAyMSwgMHgwYTAwMDVjNCwKLQkweDAwMDAwMDAwLCAweDhmYmYwMDE0LCAweDhmYjAwMDEwLCAweDAzZTAwMDA4LCAweDI3YmQwMDE4LCAweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MjdiZGZmZTgsIDB4M2MxYmMwMDAsIDB4YWZiZjAwMTQsIDB4YWZiMDAwMTAsCi0JMHhhZjYwNjgwYywgMHg4ZjYyNjgwNCwgMHgzNDQyMDA4MiwgMHhhZjYyNjgwNCwgMHg4ZjYzNDAwMCwgMHgyNDAyMGI1MCwKLQkweDNjMDEwODAwLCAweGFjMjIxYjU0LCAweDI0MDIwYjc4LCAweDNjMDEwODAwLCAweGFjMjIxYjY0LCAweDM0NjMwMDAyLAotCTB4YWY2MzQwMDAsIDB4MGUwMDA2MDUsIDB4MDA4MDgwMjEsIDB4M2MwMTA4MDAsIDB4YTAyMjFiNjgsIDB4MzA0MjAwZmYsCi0JMHgyNDAzMDAwMiwgMHgxNDQzMDAwNSwgMHgwMDAwMDAwMCwgMHgzYzAyMDgwMCwgMHg4YzQyMWI1NCwgMHgwYTAwMDVmOCwKLQkweGFjNTAwMGMwLCAweDNjMDIwODAwLCAweDhjNDIxYjU0LCAweGFjNTAwMGJjLCAweDhmNjI0NDM0LCAweDhmNjM0NDM4LAotCTB4OGY2NDQ0MTAsIDB4M2MwMTA4MDAsIDB4YWMyMjFiNWMsIDB4M2MwMTA4MDAsIDB4YWMyMzFiNmMsIDB4M2MwMTA4MDAsCi0JMHhhYzI0MWI1OCwgMHg4ZmJmMDAxNCwgMHg4ZmIwMDAxMCwgMHgwM2UwMDAwOCwgMHgyN2JkMDAxOCwgMHgzYzA0MDgwMCwKLQkweDhjODcwMDAwLCAweDNjMDNhYTU1LCAweDM0NjNhYTU1LCAweDNjMDZjMDAzLCAweGFjODMwMDAwLCAweDhjYzIwMDAwLAotCTB4MTQ0MzAwMDcsIDB4MjQwNTAwMDIsIDB4M2MwMzU1YWEsIDB4MzQ2MzU1YWEsIDB4YWM4MzAwMDAsIDB4OGNjMjAwMDAsCi0JMHg1MDQzMDAwMSwgMHgyNDA1MDAwMSwgMHgzYzAyMDgwMCwgMHhhYzQ3MDAwMCwgMHgwM2UwMDAwOCwgMHgwMGEwMTAyMSwKLQkweDI3YmRmZmY4LCAweDE4ODAwMDA5LCAweDAwMDAyODIxLCAweDhmNjM2ODBjLCAweDhmNjI2ODBjLCAweDEwNDNmZmZlLAotCTB4MDAwMDAwMDAsIDB4MjRhNTAwMDEsIDB4MDBhNDEwMmEsIDB4MTQ0MGZmZjksIDB4MDAwMDAwMDAsIDB4MDNlMDAwMDgsCi0JMHgyN2JkMDAwOCwgMHg4ZjYzNDQ1MCwgMHgzYzAyMDgwMCwgMHg4YzQyMWI1YywgMHgwMDAzMWMwMiwgMHgwMDQzMTAyYiwKLQkweDE0NDAwMDA4LCAweDNjMDM4MDAwLCAweDNjMDQwODAwLCAweDhjODQxYjZjLCAweDhmNjI0NDUwLCAweDAwMDIxYzAyLAotCTB4MDA4MzEwMmIsIDB4MTA0MGZmZmMsIDB4M2MwMzgwMDAsIDB4YWY2MzQ0NDQsIDB4OGY2MjQ0NDQsIDB4MDA0MzEwMjQsCi0JMHgxNDQwZmZmZCwgMHgwMDAwMDAwMCwgMHg4ZjYyNDQ0OCwgMHgwM2UwMDAwOCwgMHgzMDQyZmZmZiwgMHgzMDgyZmZmZiwKLQkweDI0NDJlMDAwLCAweDJjNDIyMDAxLCAweDE0NDAwMDAzLCAweDNjMDI0MDAwLCAweDBhMDAwNjQ4LCAweDI0MDJmZmZmLAotCTB4MDA4MjIwMjUsIDB4YWY2NDVjMzgsIDB4OGY2MjVjMzAsIDB4MzA0MjAwMDIsIDB4MTQ0MGZmZmMsIDB4MDAwMDEwMjEsCi0JMHgwM2UwMDAwOCwgMHgwMDAwMDAwMCwgMHg4ZjYyNDQ1MCwgMHgzYzAzMDgwMCwgMHg4YzYzMWI1OCwgMHgwYTAwMDY1MSwKLQkweDMwNDJmZmZmLCAweDhmNjI0NDUwLCAweDMwNDJmZmZmLCAweDAwNDMxMDJiLCAweDE0NDBmZmZjLCAweDAwMDAwMDAwLAotCTB4MDNlMDAwMDgsIDB4MDAwMDAwMDAsIDB4MjdiZGZmZTAsIDB4MDA4MDI4MjEsIDB4M2MwNDA4MDAsIDB4MjQ4NDFhZjAsCi0JMHgwMDAwMzAyMSwgMHgwMDAwMzgyMSwgMHhhZmJmMDAxOCwgMHhhZmEwMDAxMCwgMHgwZTAwMDY3YywgMHhhZmEwMDAxNCwKLQkweDBhMDAwNjYwLCAweDAwMDAwMDAwLCAweDhmYmYwMDE4LCAweDAzZTAwMDA4LCAweDI3YmQwMDIwLCAweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4M2MwMjA4MDAsIDB4MzQ0MjMwMDAsIDB4M2MwMzA4MDAsIDB4MzQ2MzMwMDAsCi0JMHgzYzA0MDgwMCwgMHgzNDg0MzdmZiwgMHgzYzAxMDgwMCwgMHhhYzIyMWI3NCwgMHgyNDAyMDA0MCwgMHgzYzAxMDgwMCwKLQkweGFjMjIxYjc4LCAweDNjMDEwODAwLCAweGFjMjAxYjcwLCAweGFjNjAwMDAwLCAweDI0NjMwMDA0LCAweDAwODMxMDJiLAotCTB4NTA0MGZmZmQsIDB4YWM2MDAwMDAsIDB4MDNlMDAwMDgsIDB4MDAwMDAwMDAsIDB4MDA4MDQ4MjEsIDB4OGZhYTAwMTAsCi0JMHgzYzAyMDgwMCwgMHg4YzQyMWI3MCwgMHgzYzA0MDgwMCwgMHg4Yzg0MWI3OCwgMHg4ZmFiMDAxNCwgMHgyNDQzMDAwMSwKLQkweDAwNDQxMDJiLCAweDNjMDEwODAwLCAweGFjMjMxYjcwLCAweDE0NDAwMDAzLCAweDAwMDA0MDIxLCAweDNjMDEwODAwLAotCTB4YWMyMDFiNzAsIDB4M2MwMjA4MDAsIDB4OGM0MjFiNzAsIDB4M2MwMzA4MDAsIDB4OGM2MzFiNzQsIDB4OTEyNDAwMDAsCi0JMHgwMDAyMTE0MCwgMHgwMDQzMTAyMSwgMHgwMDQ4MTAyMSwgMHgyNTA4MDAwMSwgMHhhMDQ0MDAwMCwgMHgyOTAyMDAwOCwKLQkweDE0NDBmZmY0LCAweDI1MjkwMDAxLCAweDNjMDIwODAwLCAweDhjNDIxYjcwLCAweDNjMDMwODAwLCAweDhjNjMxYjc0LAotCTB4OGY2NDY4MGMsIDB4MDAwMjExNDAsIDB4MDA0MzEwMjEsIDB4YWM0NDAwMDgsIDB4YWM0NTAwMGMsIDB4YWM0NjAwMTAsCi0JMHhhYzQ3MDAxNCwgMHhhYzRhMDAxOCwgMHgwM2UwMDAwOCwgMHhhYzRiMDAxYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLX07Ci0KLXN0YXRpYyBjb25zdCB1MzIgdGczVHNvRndSb2RhdGFbXSA9IHsKLQkweDRkNjE2OTZlLCAweDQzNzA3NTQyLCAweDAwMDAwMDAwLCAweDRkNjE2OTZlLCAweDQzNzA3NTQxLCAweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NzM3NDZiNmYsIDB4NjY2NjZjNjQsIDB4NDk2ZTAwMDAsIDB4NzM3NDZiNmYsCi0JMHg2NjY2MmEyYSwgMHgwMDAwMDAwMCwgMHg1Mzc3NDU3NiwgMHg2NTZlNzQzMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDY2NjE3NDYxLCAweDZjNDU3MjcyLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi19OwotCi1zdGF0aWMgY29uc3QgdTMyIHRnM1Rzb0Z3RGF0YVtdID0gewotCTB4MDAwMDAwMDAsIDB4NzM3NDZiNmYsIDB4NjY2NjZjNjQsIDB4NWY3NjMxMmUsIDB4MzYyZTMwMDAsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotfTsKLQogLyogNTcwNSBuZWVkcyBhIHNwZWNpYWwgdmVyc2lvbiBvZiB0aGUgVFNPIGZpcm13YXJlLiAgKi8KLSNkZWZpbmUgVEczX1RTTzVfRldfUkVMRUFTRV9NQUpPUgkweDEKLSNkZWZpbmUgVEczX1RTTzVfRldfUkVMQVNFX01JTk9SCTB4MgotI2RlZmluZSBURzNfVFNPNV9GV19SRUxFQVNFX0ZJWAkJMHgwCi0jZGVmaW5lIFRHM19UU081X0ZXX1NUQVJUX0FERFIJCTB4MDAwMTAwMDAKLSNkZWZpbmUgVEczX1RTTzVfRldfVEVYVF9BRERSCQkweDAwMDEwMDAwCi0jZGVmaW5lIFRHM19UU081X0ZXX1RFWFRfTEVOCQkweGU5MAotI2RlZmluZSBURzNfVFNPNV9GV19ST0RBVEFfQUREUgkJMHgwMDAxMGU5MAotI2RlZmluZSBURzNfVFNPNV9GV19ST0RBVEFfTEVOCQkweDUwCi0jZGVmaW5lIFRHM19UU081X0ZXX0RBVEFfQUREUgkJMHgwMDAxMGYwMAotI2RlZmluZSBURzNfVFNPNV9GV19EQVRBX0xFTgkJMHgyMAotI2RlZmluZSBURzNfVFNPNV9GV19TQlNTX0FERFIJCTB4MDAwMTBmMjAKLSNkZWZpbmUgVEczX1RTTzVfRldfU0JTU19MRU4JCTB4MjgKLSNkZWZpbmUgVEczX1RTTzVfRldfQlNTX0FERFIJCTB4MDAwMTBmNTAKLSNkZWZpbmUgVEczX1RTTzVfRldfQlNTX0xFTgkJMHg4OAotCi1zdGF0aWMgY29uc3QgdTMyIHRnM1RzbzVGd1RleHRbKFRHM19UU081X0ZXX1RFWFRfTEVOIC8gNCkgKyAxXSA9IHsKLQkweDBjMDA0MDAzLCAweDAwMDAwMDAwLCAweDAwMDEwZjA0LCAweDAwMDAwMDAwLCAweDEwMDAwMDAzLCAweDAwMDAwMDAwLAotCTB4MDAwMDAwMGQsIDB4MDAwMDAwMGQsIDB4M2MxZDAwMDEsIDB4MzdiZGUwMDAsIDB4MDNhMGYwMjEsIDB4M2MxMDAwMDEsCi0JMHgyNjEwMDAwMCwgMHgwYzAwNDAxMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwZCwgMHgyN2JkZmZlMCwgMHgzYzA0ZmVmZSwKLQkweGFmYmYwMDE4LCAweDBjMDA0MmU4LCAweDM0ODQwMDAyLCAweDBjMDA0MzY0LCAweDAwMDAwMDAwLCAweDNjMDMwMDAxLAotCTB4OTA2MzBmMzQsIDB4MjQwMjAwMDIsIDB4M2MwNDAwMDEsIDB4MjQ4NDBlOWMsIDB4MTQ2MjAwMDMsIDB4MjQwNTAwMDEsCi0JMHgzYzA0MDAwMSwgMHgyNDg0MGU5MCwgMHgyNDA2MDAwMiwgMHgwMDAwMzgyMSwgMHhhZmEwMDAxMCwgMHgwYzAwNDM3OCwKLQkweGFmYTAwMDE0LCAweDBjMDA0MDJjLCAweDAwMDAwMDAwLCAweDhmYmYwMDE4LCAweDAzZTAwMDA4LCAweDI3YmQwMDIwLAotCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MjdiZGZmZTAsIDB4YWZiZjAwMWMsIDB4YWZiMjAwMTgsIDB4YWZiMTAwMTQsCi0JMHgwYzAwNDJkNCwgMHhhZmIwMDAxMCwgMHgzYzEyODAwMCwgMHgyNDExMDAwMSwgMHg4ZjcwNjgxMCwgMHgzMjAyMDQwMCwKLQkweDEwNDAwMDA3LCAweDAwMDAwMDAwLCAweDhmNjQxMDA4LCAweDAwOTIxMDI0LCAweDE0NDAwMDAzLCAweDAwMDAwMDAwLAotCTB4MGMwMDQwNjQsIDB4MDAwMDAwMDAsIDB4M2MwMjAwMDEsIDB4OTA0MjBmNTYsIDB4MTA1MTAwMDMsIDB4MzIwMjAyMDAsCi0JMHgxMDQwZmZmMSwgMHgwMDAwMDAwMCwgMHgwYzAwNDFiNCwgMHgwMDAwMDAwMCwgMHgwODAwNDAzNCwgMHgwMDAwMDAwMCwKLQkweDhmYmYwMDFjLCAweDhmYjIwMDE4LCAweDhmYjEwMDE0LCAweDhmYjAwMDEwLCAweDAzZTAwMDA4LCAweDI3YmQwMDIwLAotCTB4MjdiZGZmZTAsIDB4M2MwNDAwMDEsIDB4MjQ4NDBlYjAsIDB4MDAwMDI4MjEsIDB4MDAwMDMwMjEsIDB4MDAwMDM4MjEsCi0JMHhhZmJmMDAxOCwgMHhhZmEwMDAxMCwgMHgwYzAwNDM3OCwgMHhhZmEwMDAxNCwgMHgwMDAwZDAyMSwgMHgyNDAyMDEzMCwKLQkweGFmNjI1MDAwLCAweDNjMDEwMDAxLCAweGE0MjAwZjUwLCAweDNjMDEwMDAxLCAweGEwMjAwZjU3LCAweDhmYmYwMDE4LAotCTB4MDNlMDAwMDgsIDB4MjdiZDAwMjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4M2MwMzAwMDEsIDB4MjQ2MzBmNjAsCi0JMHg5MDYyMDAwMCwgMHgyN2JkZmZmMCwgMHgxNDQwMDAwMywgMHgwMDgwYzAyMSwgMHgwODAwNDA3MywgMHgwMDAwNDgyMSwKLQkweDNjMDIyMDAwLCAweDAzMDIxMDI0LCAweDEwNDAwMDAzLCAweDI0MDkwMDAyLCAweDA4MDA0MDczLCAweGEwNjAwMDAwLAotCTB4MjQwOTAwMDEsIDB4MDAxODEwNDAsIDB4MzA0MzFmODAsIDB4MzQ2ZjgwMDgsIDB4MTUyMDAwNGIsIDB4MjVlYjAwMjgsCi0JMHgzYzA0MDAwMSwgMHgwMDgzMjAyMSwgMHg4Yzg0ODAxMCwgMHgzYzA1MDAwMSwgMHgyNGE1MGY3YSwgMHgwMDA0MTQwMiwKLQkweGEwYTIwMDAwLCAweDNjMDEwMDAxLCAweGEwMjQwZjdiLCAweDNjMDIwMDAxLCAweDAwNDMxMDIxLCAweDk0NDI4MDE0LAotCTB4M2MwMTAwMDEsIDB4YTAyMjBmN2MsIDB4M2MwYzAwMDEsIDB4MDE4MzYwMjEsIDB4OGQ4YzgwMTgsIDB4MzA0MjAwZmYsCi0JMHgyNDQyMDAwOCwgMHgwMDAyMjBjMywgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHhhMDIyMGY2MCwgMHgwMTI0MTAyYiwKLQkweDEwNDAwMDBjLCAweDAwMDAzODIxLCAweDI0YTYwMDBlLCAweDAxNjAyODIxLCAweDhjYTIwMDAwLCAweDhjYTMwMDA0LAotCTB4MjRhNTAwMDgsIDB4MjRlNzAwMDEsIDB4YWNjMjAwMDAsIDB4YWNjMzAwMDQsIDB4MDBlNDEwMmIsIDB4MTQ0MGZmZjgsCi0JMHgyNGM2MDAwOCwgMHgwMDAwMzgyMSwgMHgzYzA4MDAwMSwgMHgyNTA4MGY3YiwgMHg5MTA2MDAwMCwgMHgzYzAyMDAwMSwKLQkweDkwNDIwZjdjLCAweDI1MDMwMDBkLCAweDAwYzMyODIxLCAweDAwNDYxMDIzLCAweDAwMDIxZmMyLCAweDAwNDMxMDIxLAotCTB4MDAwMjEwNDMsIDB4MTg0MDAwMGMsIDB4MDAwMDIwMjEsIDB4OTEwMjAwMDEsIDB4MDA0NjEwMjMsIDB4MDAwMjFmYzIsCi0JMHgwMDQzMTAyMSwgMHgwMDAyMTg0MywgMHg5NGEyMDAwMCwgMHgyNGU3MDAwMSwgMHgwMDgyMjAyMSwgMHgwMGUzMTAyYSwKLQkweDE0NDBmZmZiLCAweDI0YTUwMDAyLCAweDAwMDQxYzAyLCAweDMwODJmZmZmLCAweDAwNjIyMDIxLCAweDAwMDQxNDAyLAotCTB4MDA4MjIwMjEsIDB4M2MwMmZmZmYsIDB4MDE4MjEwMjQsIDB4MzA4M2ZmZmYsIDB4MDA0MzEwMjUsIDB4M2MwMTAwMDEsCi0JMHgwODAwNDBmYSwgMHhhYzIyMGY4MCwgMHgzYzA1MDAwMSwgMHgyNGE1MGY3YywgMHg5MGEyMDAwMCwgMHgzYzBjMDAwMSwKLQkweDAxODM2MDIxLCAweDhkOGM4MDE4LCAweDAwMDIyMGMyLCAweDEwODAwMDBlLCAweDAwMDAzODIxLCAweDAxNjAzMDIxLAotCTB4MjRhNTAwMGMsIDB4OGNhMjAwMDAsIDB4OGNhMzAwMDQsIDB4MjRhNTAwMDgsIDB4MjRlNzAwMDEsIDB4YWNjMjAwMDAsCi0JMHhhY2MzMDAwNCwgMHgwMGU0MTAyYiwgMHgxNDQwZmZmOCwgMHgyNGM2MDAwOCwgMHgzYzA1MDAwMSwgMHgyNGE1MGY3YywKLQkweDkwYTIwMDAwLCAweDMwNDMwMDA3LCAweDI0MDIwMDA0LCAweDEwNjIwMDExLCAweDI4NjIwMDA1LCAweDEwNDAwMDA1LAotCTB4MjQwMjAwMDIsIDB4MTA2MjAwMDgsIDB4MDAwNzEwYzAsIDB4MDgwMDQwZmEsIDB4MDAwMDAwMDAsIDB4MjQwMjAwMDYsCi0JMHgxMDYyMDAwZSwgMHgwMDA3MTBjMCwgMHgwODAwNDBmYSwgMHgwMDAwMDAwMCwgMHgwMGEyMTgyMSwgMHg5NDYzMDAwYywKLQkweDAwNGIxMDIxLCAweDA4MDA0MGZhLCAweGE0NDMwMDAwLCAweDAwMDcxMGMwLCAweDAwYTIxODIxLCAweDhjNjMwMDBjLAotCTB4MDA0YjEwMjEsIDB4MDgwMDQwZmEsIDB4YWM0MzAwMDAsIDB4MDBhMjE4MjEsIDB4OGM2MzAwMGMsIDB4MDA0YjIwMjEsCi0JMHgwMGEyMTAyMSwgMHhhYzgzMDAwMCwgMHg5NDQyMDAxMCwgMHhhNDgyMDAwNCwgMHg5NWU3MDAwNiwgMHgzYzAyMDAwMSwKLQkweDkwNDIwZjdjLCAweDNjMDMwMDAxLCAweDkwNjMwZjdhLCAweDAwZTJjODIzLCAweDNjMDIwMDAxLCAweDkwNDIwZjdiLAotCTB4MjQ2MzAwMjgsIDB4MDFlMzQwMjEsIDB4MjQ0MjAwMjgsIDB4MTUyMDAwMTIsIDB4MDFlMjMwMjEsIDB4OTRjMjAwMGMsCi0JMHgzYzAxMDAwMSwgMHhhNDIyMGY3OCwgMHg5NGMyMDAwNCwgMHg5NGMzMDAwNiwgMHgzYzAxMDAwMSwgMHhhNDIwMGY3NiwKLQkweDNjMDEwMDAxLCAweGE0MjAwZjcyLCAweDAwMDIxNDAwLCAweDAwNDMxMDI1LCAweDNjMDEwMDAxLCAweGFjMjIwZjZjLAotCTB4OTUwMjAwMDQsIDB4M2MwMTAwMDEsIDB4MDgwMDQxMjQsIDB4YTQyMjBmNzAsIDB4M2MwMjAwMDEsIDB4OTQ0MjBmNzAsCi0JMHgzYzAzMDAwMSwgMHg5NDYzMGY3MiwgMHgwMDQzMTAyMSwgMHhhNTAyMDAwNCwgMHgzYzAyMDAwMSwgMHg5NDQyMGY2YywKLQkweGE0YzIwMDA0LCAweDNjMDIwMDAxLCAweDhjNDIwZjZjLCAweGE0YzIwMDA2LCAweDNjMDQwMDAxLCAweDk0ODQwZjcyLAotCTB4M2MwMjAwMDEsIDB4OTQ0MjBmNzAsIDB4M2MwYTAwMDEsIDB4OTU0YTBmNzYsIDB4MDA0NDE4MjEsIDB4MzA2M2ZmZmYsCi0JMHgwMDYyMTgyYSwgMHgyNDAyMDAwMiwgMHgxMTIyMDAwYiwgMHgwMDgzMjAyMywgMHgzYzAzMDAwMSwgMHg5NDYzMGY3OCwKLQkweDMwNjIwMDA5LCAweDEwNDAwMDA2LCAweDMwNjJmZmY2LCAweGE0YzIwMDBjLCAweDNjMDIwMDAxLCAweDk0NDIwZjc4LAotCTB4MzA0MjAwMDksIDB4MDE0MjUwMjMsIDB4MjQwMjAwMDEsIDB4MTEyMjAwMWIsIDB4MjkyMjAwMDIsIDB4NTA0MDAwMDUsCi0JMHgyNDAyMDAwMiwgMHgxMTIwMDAwNywgMHgzMWEyZmZmZiwgMHgwODAwNDE5NywgMHgwMDAwMDAwMCwgMHgxMTIyMDAxZCwKLQkweDI0MDIwMDE2LCAweDA4MDA0MTk3LCAweDMxYTJmZmZmLCAweDNjMGUwMDAxLCAweDk1Y2UwZjgwLCAweDEwODAwMDA1LAotCTB4MDE4MDY4MjEsIDB4MDFjNDIwMjEsIDB4MDAwNDFjMDIsIDB4MzA4MmZmZmYsIDB4MDA2MjcwMjEsIDB4MDAwZTEwMjcsCi0JMHhhNTAyMDAwYSwgMHgzYzAzMDAwMSwgMHg5MDYzMGY3YiwgMHgzMWEyZmZmZiwgMHgwMGUyMTAyMSwgMHgwODAwNDE4ZCwKLQkweDAwNDMyMDIzLCAweDNjMDIwMDAxLCAweDk0NDIwZjgwLCAweDAwNDQyMDIxLCAweDAwMDQxYzAyLCAweDMwODJmZmZmLAotCTB4MDA2MjIwMjEsIDB4MDA4MDcwMjEsIDB4MDAwNDEwMjcsIDB4MDgwMDQxODUsIDB4YTUwMjAwMGEsIDB4M2MwNTAwMDEsCi0JMHgyNGE1MGY3YSwgMHg5MGEzMDAwMCwgMHgxNDYyMDAwMiwgMHgyNGUyZmZmMiwgMHhhNWUyMDAzNCwgMHg5MGEyMDAwMCwKLQkweDAwZTIxMDIzLCAweGE1MDIwMDAyLCAweDNjMDMwMDAxLCAweDk0NjMwZjgwLCAweDNjMDIwMDAxLCAweDk0NDIwZjVhLAotCTB4MzBlNWZmZmYsIDB4MDA2NDE4MjEsIDB4MDA0NTEwMjMsIDB4MDA2MjIwMjMsIDB4MDAwNDFjMDIsIDB4MzA4MmZmZmYsCi0JMHgwMDYyMjAyMSwgMHgwMDA0MTAyNywgMHhhNTAyMDAwYSwgMHgzYzAzMDAwMSwgMHg5MDYzMGY3YywgMHgyNDYyMDAwMSwKLQkweDE0YTIwMDA1LCAweDAwODA3MDIxLCAweDAxNjMxMDIxLCAweDkwNDIwMDAwLCAweDA4MDA0MTg1LCAweDAwMDI2MjAwLAotCTB4MjQ2MjAwMDIsIDB4MTRhMjAwMDMsIDB4MzA2MjAwZmUsIDB4MDA0YjEwMjEsIDB4OTQ0YzAwMDAsIDB4M2MwMjAwMDEsCi0JMHg5NDQyMGY4MiwgMHgzMTgzZmZmZiwgMHgzYzA0MDAwMSwgMHg5MDg0MGY3YiwgMHgwMDQzMTAyMSwgMHgwMGUyMTAyMSwKLQkweDAwNDQyMDIzLCAweDAwOGEyMDIxLCAweDAwMDQxYzAyLCAweDMwODJmZmZmLCAweDAwNjIyMDIxLCAweDAwMDQxNDAyLAotCTB4MDA4MjIwMjEsIDB4MDA4MDY4MjEsIDB4MDAwNDEwMjcsIDB4YTRjMjAwMTAsIDB4MzFhMmZmZmYsIDB4MDAwZTFjMDAsCi0JMHgwMDQzMTAyNSwgMHgzYzA0MDAwMSwgMHgyNDg0MGY3MiwgMHhhZGUyMDAxMCwgMHg5NDgyMDAwMCwgMHgzYzA1MDAwMSwKLQkweDk0YTUwZjc2LCAweDNjMDMwMDAxLCAweDhjNjMwZjZjLCAweDI0NDIwMDAxLCAweDAwYjkyODIxLCAweGE0ODIwMDAwLAotCTB4MzMyMmZmZmYsIDB4MDA2MjIwMjEsIDB4MDA4MzE4MmIsIDB4M2MwMTAwMDEsIDB4YTQyNTBmNzYsIDB4MTA2MDAwMDMsCi0JMHgyNGEyZmZmZiwgMHgzYzAxMDAwMSwgMHhhNDIyMGY3NiwgMHgzYzAyNDAwMCwgMHgwMzAyMTAyNSwgMHgzYzAxMDAwMSwKLQkweGFjMjQwZjZjLCAweGFmNjIxMDA4LCAweDAzZTAwMDA4LCAweDI3YmQwMDEwLCAweDNjMDMwMDAxLCAweDkwNjMwZjU2LAotCTB4MjdiZGZmZTgsIDB4MjQwMjAwMDEsIDB4YWZiZjAwMTQsIDB4MTA2MjAwMjYsIDB4YWZiMDAwMTAsIDB4OGY2MjBjZjQsCi0JMHgyNDQyZmZmZiwgMHgzMDQyMDA3ZiwgMHgwMDAyMTEwMCwgMHg4YzQzNDAwMCwgMHgzYzAxMDAwMSwgMHhhYzIzMGY2NCwKLQkweDhjNDM0MDA4LCAweDI0NDQ0MDAwLCAweDhjNWM0MDA0LCAweDMwNjIwMDQwLCAweDE0NDAwMDAyLCAweDI0MDIwMDg4LAotCTB4MjQwMjAwMDgsIDB4M2MwMTAwMDEsIDB4YTQyMjBmNjgsIDB4MzA2MjAwMDQsIDB4MTA0MDAwMDUsIDB4MjQwMjAwMDEsCi0JMHgzYzAxMDAwMSwgMHhhMDIyMGY1NywgMHgwODAwNDFkNSwgMHgwMDAzMTQwMiwgMHgzYzAxMDAwMSwgMHhhMDIwMGY1NywKLQkweDAwMDMxNDAyLCAweDNjMDEwMDAxLCAweGE0MjIwZjU0LCAweDk0ODMwMDBjLCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLAotCTB4YTQyMDBmNTAsIDB4M2MwMTAwMDEsIDB4YTAyMjBmNTYsIDB4M2MwMTAwMDEsIDB4YTQyMzBmNjIsIDB4MjQwMjAwMDEsCi0JMHgxMzQyMDAxZSwgMHgwMDAwMDAwMCwgMHgxMzQwMDAwNSwgMHgyNDAyMDAwMywgMHgxMzQyMDA2NywgMHgwMDAwMDAwMCwKLQkweDA4MDA0MmNmLCAweDAwMDAwMDAwLCAweDNjMDIwMDAxLCAweDk0NDIwZjYyLCAweDI0MWEwMDAxLCAweDNjMDEwMDAxLAotCTB4YTQyMDBmNWUsIDB4M2MwMTAwMDEsIDB4YTQyMDBmNTIsIDB4MzA0NDA3ZmYsIDB4MDAwMjFiYzIsIDB4MDAwMzE4MjMsCi0JMHgzMDYzMDAzZSwgMHgzNDYzMDAzNiwgMHgwMDAyMTI0MiwgMHgzMDQyMDAzYywgMHgwMDYyMTgyMSwgMHgzYzAxMDAwMSwKLQkweGE0MjQwZjU4LCAweDAwODMyMDIxLCAweDI0NjMwMDMwLCAweDNjMDEwMDAxLCAweGE0MjQwZjVhLCAweDNjMDEwMDAxLAotCTB4YTQyMzBmNWMsIDB4M2MwNjAwMDEsIDB4MjRjNjBmNTIsIDB4OTRjNTAwMDAsIDB4OTRjMzAwMDIsIDB4M2MwNDAwMDEsCi0JMHg5NDg0MGY1YSwgMHgwMDY1MTAyMSwgMHgwMDQ0MTAyYSwgMHgxMDQwMDAxMywgMHgzYzEwODAwMCwgMHgwMGEzMTAyMSwKLQkweGE0YzIwMDAwLCAweDNjMDJhMDAwLCAweGFmNjIwY2Y0LCAweDNjMDEwMDAxLCAweGEwMjAwZjU2LCAweDhmNjQxMDA4LAotCTB4MDA5MDEwMjQsIDB4MTQ0MDAwMDMsIDB4MDAwMDAwMDAsIDB4MGMwMDQwNjQsIDB4MDAwMDAwMDAsIDB4OGY2MjBjZjQsCi0JMHgwMDUwMTAyNCwgMHgxMDQwMDBiNywgMHgwMDAwMDAwMCwgMHgwODAwNDIwZiwgMHgwMDAwMDAwMCwgMHgzYzAzMDAwMSwKLQkweDk0NjMwZjUwLCAweDAwODUxMDIzLCAweGE0YzQwMDAwLCAweDAwNjIxODIxLCAweDMwNDJmZmZmLCAweDNjMDEwMDAxLAotCTB4YTQyMzBmNTAsIDB4YWY2MjBjZTgsIDB4M2MwMjAwMDEsIDB4OTQ0MjBmNjgsIDB4MzQ0MjAwMjQsIDB4YWY2MjBjZWMsCi0JMHg5NGMzMDAwMiwgMHgzYzAyMDAwMSwgMHg5NDQyMGY1MCwgMHgxNDYyMDAxMiwgMHgzYzAyODAwMCwgMHgzYzEwODAwMCwKLQkweDNjMDJhMDAwLCAweGFmNjIwY2Y0LCAweDNjMDEwMDAxLCAweGEwMjAwZjU2LCAweDhmNjQxMDA4LCAweDAwOTAxMDI0LAotCTB4MTQ0MDAwMDMsIDB4MDAwMDAwMDAsIDB4MGMwMDQwNjQsIDB4MDAwMDAwMDAsIDB4OGY2MjBjZjQsIDB4MDA1MDEwMjQsCi0JMHgxNDQwZmZmNywgMHgwMDAwMDAwMCwgMHgwODAwNDJjZiwgMHgyNDFhMDAwMywgMHhhZjYyMGNmNCwgMHgzYzEwODAwMCwKLQkweDhmNjQxMDA4LCAweDAwOTAxMDI0LCAweDE0NDAwMDAzLCAweDAwMDAwMDAwLCAweDBjMDA0MDY0LCAweDAwMDAwMDAwLAotCTB4OGY2MjBjZjQsIDB4MDA1MDEwMjQsIDB4MTQ0MGZmZjcsIDB4MDAwMDAwMDAsIDB4MDgwMDQyY2YsIDB4MjQxYTAwMDMsCi0JMHgzYzA3MDAwMSwgMHgyNGU3MGY1MCwgMHg5NGUyMDAwMCwgMHgwMzgyMTAyMSwgMHhhZjYyMGNlMCwgMHgzYzAyMDAwMSwKLQkweDhjNDIwZjY0LCAweGFmNjIwY2U0LCAweDNjMDUwMDAxLCAweDk0YTUwZjU0LCAweDk0ZTMwMDAwLCAweDNjMDQwMDAxLAotCTB4OTQ4NDBmNTgsIDB4M2MwMjAwMDEsIDB4OTQ0MjBmNWUsIDB4MDBhMzI4MjMsIDB4MDA4MjIwMjMsIDB4MzBhNmZmZmYsCi0JMHgzMDgzZmZmZiwgMHgwMGMzMTAyYiwgMHgxNDQwMDA0MywgMHgwMDAwMDAwMCwgMHgzYzAyMDAwMSwgMHg5NDQyMGY1YywKLQkweDAwMDIxNDAwLCAweDAwNjIxMDI1LCAweGFmNjIwY2U4LCAweDk0ZTIwMDAwLCAweDNjMDMwMDAxLCAweDk0NjMwZjU0LAotCTB4MDA0NDEwMjEsIDB4YTRlMjAwMDAsIDB4MzA0MmZmZmYsIDB4MTQ0MzAwMjEsIDB4M2MwMjAwMDgsIDB4M2MwMjAwMDEsCi0JMHg5MDQyMGY1NywgMHgxMDQwMDAwNiwgMHgzYzAzMDAwYywgMHgzYzAyMDAwMSwgMHg5NDQyMGY2OCwgMHgzNDYzMDYyNCwKLQkweDA4MDA0MjdjLCAweDAwMDBkMDIxLCAweDNjMDIwMDAxLCAweDk0NDIwZjY4LCAweDNjMDMwMDA4LCAweDM0NjMwNjI0LAotCTB4MDA0MzEwMjUsIDB4YWY2MjBjZWMsIDB4M2MxMDgwMDAsIDB4M2MwMmEwMDAsIDB4YWY2MjBjZjQsIDB4M2MwMTAwMDEsCi0JMHhhMDIwMGY1NiwgMHg4ZjY0MTAwOCwgMHgwMDkwMTAyNCwgMHgxNDQwMDAwMywgMHgwMDAwMDAwMCwgMHgwYzAwNDA2NCwKLQkweDAwMDAwMDAwLCAweDhmNjIwY2Y0LCAweDAwNTAxMDI0LCAweDEwNDAwMDE1LCAweDAwMDAwMDAwLCAweDA4MDA0MjgzLAotCTB4MDAwMDAwMDAsIDB4M2MwMzAwMDEsIDB4OTQ2MzBmNjgsIDB4MzQ0MjA2MjQsIDB4M2MxMDgwMDAsIDB4MDA2MjE4MjUsCi0JMHgzYzAyODAwMCwgMHhhZjYzMGNlYywgMHhhZjYyMGNmNCwgMHg4ZjY0MTAwOCwgMHgwMDkwMTAyNCwgMHgxNDQwMDAwMywKLQkweDAwMDAwMDAwLCAweDBjMDA0MDY0LCAweDAwMDAwMDAwLCAweDhmNjIwY2Y0LCAweDAwNTAxMDI0LCAweDE0NDBmZmY3LAotCTB4MDAwMDAwMDAsIDB4M2MwMTAwMDEsIDB4MDgwMDQyY2YsIDB4YTQyMDBmNWUsIDB4M2MwMjAwMDEsIDB4OTQ0MjBmNWMsCi0JMHgwMDAyMTQwMCwgMHgwMGMyMTAyNSwgMHhhZjYyMGNlOCwgMHgzYzAyMDAwMSwgMHg5MDQyMGY1NywgMHgxMDQwMDAwOSwKLQkweDNjMDMwMDBjLCAweDNjMDIwMDAxLCAweDk0NDIwZjY4LCAweDM0NjMwNjI0LCAweDAwMDBkMDIxLCAweDAwNDMxMDI1LAotCTB4YWY2MjBjZWMsIDB4MDgwMDQyYzEsIDB4M2MxMDgwMDAsIDB4M2MwMjAwMDEsIDB4OTQ0MjBmNjgsIDB4M2MwMzAwMDgsCi0JMHgzNDYzMDYwNCwgMHgwMDQzMTAyNSwgMHhhZjYyMGNlYywgMHgzYzAyMDAwMSwgMHg5NDQyMGY1ZSwgMHgwMDQ1MTAyMSwKLQkweDNjMDEwMDAxLCAweGE0MjIwZjVlLCAweDNjMTA4MDAwLCAweDNjMDJhMDAwLCAweGFmNjIwY2Y0LCAweDNjMDEwMDAxLAotCTB4YTAyMDBmNTYsIDB4OGY2NDEwMDgsIDB4MDA5MDEwMjQsIDB4MTQ0MDAwMDMsIDB4MDAwMDAwMDAsIDB4MGMwMDQwNjQsCi0JMHgwMDAwMDAwMCwgMHg4ZjYyMGNmNCwgMHgwMDUwMTAyNCwgMHgxNDQwZmZmNywgMHgwMDAwMDAwMCwgMHg4ZmJmMDAxNCwKLQkweDhmYjAwMDEwLCAweDAzZTAwMDA4LCAweDI3YmQwMDE4LCAweDAwMDAwMDAwLCAweDI3YmRmZmUwLCAweDNjMDQwMDAxLAotCTB4MjQ4NDBlYzAsIDB4MDAwMDI4MjEsIDB4MDAwMDMwMjEsIDB4MDAwMDM4MjEsIDB4YWZiZjAwMTgsIDB4YWZhMDAwMTAsCi0JMHgwYzAwNDM3OCwgMHhhZmEwMDAxNCwgMHgwMDAwZDAyMSwgMHgyNDAyMDEzMCwgMHhhZjYyNTAwMCwgMHgzYzAxMDAwMSwKLQkweGE0MjAwZjUwLCAweDNjMDEwMDAxLCAweGEwMjAwZjU3LCAweDhmYmYwMDE4LCAweDAzZTAwMDA4LCAweDI3YmQwMDIwLAotCTB4MjdiZGZmZTgsIDB4M2MxYmMwMDAsIDB4YWZiZjAwMTQsIDB4YWZiMDAwMTAsIDB4YWY2MDY4MGMsIDB4OGY2MjY4MDQsCi0JMHgzNDQyMDA4MiwgMHhhZjYyNjgwNCwgMHg4ZjYzNDAwMCwgMHgyNDAyMGI1MCwgMHgzYzAxMDAwMSwgMHhhYzIyMGYyMCwKLQkweDI0MDIwYjc4LCAweDNjMDEwMDAxLCAweGFjMjIwZjMwLCAweDM0NjMwMDAyLCAweGFmNjM0MDAwLCAweDBjMDA0MzE1LAotCTB4MDA4MDgwMjEsIDB4M2MwMTAwMDEsIDB4YTAyMjBmMzQsIDB4MzA0MjAwZmYsIDB4MjQwMzAwMDIsIDB4MTQ0MzAwMDUsCi0JMHgwMDAwMDAwMCwgMHgzYzAyMDAwMSwgMHg4YzQyMGYyMCwgMHgwODAwNDMwOCwgMHhhYzUwMDBjMCwgMHgzYzAyMDAwMSwKLQkweDhjNDIwZjIwLCAweGFjNTAwMGJjLCAweDhmNjI0NDM0LCAweDhmNjM0NDM4LCAweDhmNjQ0NDEwLCAweDNjMDEwMDAxLAotCTB4YWMyMjBmMjgsIDB4M2MwMTAwMDEsIDB4YWMyMzBmMzgsIDB4M2MwMTAwMDEsIDB4YWMyNDBmMjQsIDB4OGZiZjAwMTQsCi0JMHg4ZmIwMDAxMCwgMHgwM2UwMDAwOCwgMHgyN2JkMDAxOCwgMHgwM2UwMDAwOCwgMHgyNDAyMDAwMSwgMHgyN2JkZmZmOCwKLQkweDE4ODAwMDA5LCAweDAwMDAyODIxLCAweDhmNjM2ODBjLCAweDhmNjI2ODBjLCAweDEwNDNmZmZlLCAweDAwMDAwMDAwLAotCTB4MjRhNTAwMDEsIDB4MDBhNDEwMmEsIDB4MTQ0MGZmZjksIDB4MDAwMDAwMDAsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMDgsCi0JMHg4ZjYzNDQ1MCwgMHgzYzAyMDAwMSwgMHg4YzQyMGYyOCwgMHgwMDAzMWMwMiwgMHgwMDQzMTAyYiwgMHgxNDQwMDAwOCwKLQkweDNjMDM4MDAwLCAweDNjMDQwMDAxLCAweDhjODQwZjM4LCAweDhmNjI0NDUwLCAweDAwMDIxYzAyLCAweDAwODMxMDJiLAotCTB4MTA0MGZmZmMsIDB4M2MwMzgwMDAsIDB4YWY2MzQ0NDQsIDB4OGY2MjQ0NDQsIDB4MDA0MzEwMjQsIDB4MTQ0MGZmZmQsCi0JMHgwMDAwMDAwMCwgMHg4ZjYyNDQ0OCwgMHgwM2UwMDAwOCwgMHgzMDQyZmZmZiwgMHgzMDgyZmZmZiwgMHgyNDQyZTAwMCwKLQkweDJjNDIyMDAxLCAweDE0NDAwMDAzLCAweDNjMDI0MDAwLCAweDA4MDA0MzQ3LCAweDI0MDJmZmZmLCAweDAwODIyMDI1LAotCTB4YWY2NDVjMzgsIDB4OGY2MjVjMzAsIDB4MzA0MjAwMDIsIDB4MTQ0MGZmZmMsIDB4MDAwMDEwMjEsIDB4MDNlMDAwMDgsCi0JMHgwMDAwMDAwMCwgMHg4ZjYyNDQ1MCwgMHgzYzAzMDAwMSwgMHg4YzYzMGYyNCwgMHgwODAwNDM1MCwgMHgzMDQyZmZmZiwKLQkweDhmNjI0NDUwLCAweDMwNDJmZmZmLCAweDAwNDMxMDJiLCAweDE0NDBmZmZjLCAweDAwMDAwMDAwLCAweDAzZTAwMDA4LAotCTB4MDAwMDAwMDAsIDB4MjdiZGZmZTAsIDB4MDA4MDI4MjEsIDB4M2MwNDAwMDEsIDB4MjQ4NDBlZDAsIDB4MDAwMDMwMjEsCi0JMHgwMDAwMzgyMSwgMHhhZmJmMDAxOCwgMHhhZmEwMDAxMCwgMHgwYzAwNDM3OCwgMHhhZmEwMDAxNCwgMHgwODAwNDM1ZiwKLQkweDAwMDAwMDAwLCAweDhmYmYwMDE4LCAweDAzZTAwMDA4LCAweDI3YmQwMDIwLCAweDNjMDIwMDAxLCAweDM0NDJkNjAwLAotCTB4M2MwMzAwMDEsIDB4MzQ2M2Q2MDAsIDB4M2MwNDAwMDEsIDB4MzQ4NGRkZmYsIDB4M2MwMTAwMDEsIDB4YWMyMjBmNDAsCi0JMHgyNDAyMDA0MCwgMHgzYzAxMDAwMSwgMHhhYzIyMGY0NCwgMHgzYzAxMDAwMSwgMHhhYzIwMGYzYywgMHhhYzYwMDAwMCwKLQkweDI0NjMwMDA0LCAweDAwODMxMDJiLCAweDUwNDBmZmZkLCAweGFjNjAwMDAwLCAweDAzZTAwMDA4LCAweDAwMDAwMDAwLAotCTB4MDA4MDQ4MjEsIDB4OGZhYTAwMTAsIDB4M2MwMjAwMDEsIDB4OGM0MjBmM2MsIDB4M2MwNDAwMDEsIDB4OGM4NDBmNDQsCi0JMHg4ZmFiMDAxNCwgMHgyNDQzMDAwMSwgMHgwMDQ0MTAyYiwgMHgzYzAxMDAwMSwgMHhhYzIzMGYzYywgMHgxNDQwMDAwMywKLQkweDAwMDA0MDIxLCAweDNjMDEwMDAxLCAweGFjMjAwZjNjLCAweDNjMDIwMDAxLCAweDhjNDIwZjNjLCAweDNjMDMwMDAxLAotCTB4OGM2MzBmNDAsIDB4OTEyNDAwMDAsIDB4MDAwMjExNDAsIDB4MDA0MzEwMjEsIDB4MDA0ODEwMjEsIDB4MjUwODAwMDEsCi0JMHhhMDQ0MDAwMCwgMHgyOTAyMDAwOCwgMHgxNDQwZmZmNCwgMHgyNTI5MDAwMSwgMHgzYzAyMDAwMSwgMHg4YzQyMGYzYywKLQkweDNjMDMwMDAxLCAweDhjNjMwZjQwLCAweDhmNjQ2ODBjLCAweDAwMDIxMTQwLCAweDAwNDMxMDIxLCAweGFjNDQwMDA4LAotCTB4YWM0NTAwMGMsIDB4YWM0NjAwMTAsIDB4YWM0NzAwMTQsIDB4YWM0YTAwMTgsIDB4MDNlMDAwMDgsIDB4YWM0YjAwMWMsCi0JMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLX07Ci0KLXN0YXRpYyBjb25zdCB1MzIgdGczVHNvNUZ3Um9kYXRhWyhURzNfVFNPNV9GV19ST0RBVEFfTEVOIC8gNCkgKyAxXSA9IHsKLQkweDRkNjE2OTZlLCAweDQzNzA3NTQyLCAweDAwMDAwMDAwLCAweDRkNjE2OTZlLCAweDQzNzA3NTQxLCAweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NzM3NDZiNmYsIDB4NjY2NjZjNjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0JMHg3Mzc0NmI2ZiwgMHg2NjY2NmM2NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg2NjYxNzQ2MSwgMHg2YzQ1NzI3MiwKLQkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotfTsKLQotc3RhdGljIGNvbnN0IHUzMiB0ZzNUc281RndEYXRhWyhURzNfVFNPNV9GV19EQVRBX0xFTiAvIDQpICsgMV0gPSB7Ci0JMHgwMDAwMDAwMCwgMHg3Mzc0NmI2ZiwgMHg2NjY2NmM2NCwgMHg1Zjc2MzEyZSwgMHgzMjJlMzAwMCwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotfTsKIAogLyogdHAtPmxvY2sgaXMgaGVsZC4gKi8KIHN0YXRpYyBpbnQgdGczX2xvYWRfdHNvX2Zpcm13YXJlKHN0cnVjdCB0ZzMgKnRwKQogewogCXN0cnVjdCBmd19pbmZvIGluZm87CisJY29uc3QgX19iZTMyICpmd19kYXRhOwogCXVuc2lnbmVkIGxvbmcgY3B1X2Jhc2UsIGNwdV9zY3JhdGNoX2Jhc2UsIGNwdV9zY3JhdGNoX3NpemU7CiAJaW50IGVyciwgaTsKIAogCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX0hXX1RTTykKIAkJcmV0dXJuIDA7CiAKKwlmd19kYXRhID0gKHZvaWQgKil0cC0+ZnctPmRhdGE7CisKKwkvKiBGaXJtd2FyZSBibG9iIHN0YXJ0cyB3aXRoIHZlcnNpb24gbnVtYmVycywgZm9sbG93ZWQgYnkKKwkgICBzdGFydCBhZGRyZXNzIGFuZCBsZW5ndGguIFdlIGFyZSBzZXR0aW5nIGNvbXBsZXRlIGxlbmd0aC4KKwkgICBsZW5ndGggPSBlbmRfYWRkcmVzc19vZl9ic3MgLSBzdGFydF9hZGRyZXNzX29mX3RleHQuCisJICAgUmVtYWluZGVyIGlzIHRoZSBibG9iIHRvIGJlIGxvYWRlZCBjb250aWd1b3VzbHkKKwkgICBmcm9tIHN0YXJ0IGFkZHJlc3MuICovCisKKwlpbmZvLmZ3X2Jhc2UgPSBiZTMyX3RvX2NwdShmd19kYXRhWzFdKTsKKwljcHVfc2NyYXRjaF9zaXplID0gdHAtPmZ3X2xlbjsKKwlpbmZvLmZ3X2xlbiA9IHRwLT5mdy0+c2l6ZSAtIDEyOworCWluZm8uZndfZGF0YSA9ICZmd19kYXRhWzNdOworCiAJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA1KSB7Ci0JCWluZm8udGV4dF9iYXNlID0gVEczX1RTTzVfRldfVEVYVF9BRERSOwotCQlpbmZvLnRleHRfbGVuID0gVEczX1RTTzVfRldfVEVYVF9MRU47Ci0JCWluZm8udGV4dF9kYXRhID0gJnRnM1RzbzVGd1RleHRbMF07Ci0JCWluZm8ucm9kYXRhX2Jhc2UgPSBURzNfVFNPNV9GV19ST0RBVEFfQUREUjsKLQkJaW5mby5yb2RhdGFfbGVuID0gVEczX1RTTzVfRldfUk9EQVRBX0xFTjsKLQkJaW5mby5yb2RhdGFfZGF0YSA9ICZ0ZzNUc281RndSb2RhdGFbMF07Ci0JCWluZm8uZGF0YV9iYXNlID0gVEczX1RTTzVfRldfREFUQV9BRERSOwotCQlpbmZvLmRhdGFfbGVuID0gVEczX1RTTzVfRldfREFUQV9MRU47Ci0JCWluZm8uZGF0YV9kYXRhID0gJnRnM1RzbzVGd0RhdGFbMF07CiAJCWNwdV9iYXNlID0gUlhfQ1BVX0JBU0U7CiAJCWNwdV9zY3JhdGNoX2Jhc2UgPSBOSUNfU1JBTV9NQlVGX1BPT0xfQkFTRTU3MDU7Ci0JCWNwdV9zY3JhdGNoX3NpemUgPSAoaW5mby50ZXh0X2xlbiArCi0JCQkJICAgIGluZm8ucm9kYXRhX2xlbiArCi0JCQkJICAgIGluZm8uZGF0YV9sZW4gKwotCQkJCSAgICBURzNfVFNPNV9GV19TQlNTX0xFTiArCi0JCQkJICAgIFRHM19UU081X0ZXX0JTU19MRU4pOwogCX0gZWxzZSB7Ci0JCWluZm8udGV4dF9iYXNlID0gVEczX1RTT19GV19URVhUX0FERFI7Ci0JCWluZm8udGV4dF9sZW4gPSBURzNfVFNPX0ZXX1RFWFRfTEVOOwotCQlpbmZvLnRleHRfZGF0YSA9ICZ0ZzNUc29Gd1RleHRbMF07Ci0JCWluZm8ucm9kYXRhX2Jhc2UgPSBURzNfVFNPX0ZXX1JPREFUQV9BRERSOwotCQlpbmZvLnJvZGF0YV9sZW4gPSBURzNfVFNPX0ZXX1JPREFUQV9MRU47Ci0JCWluZm8ucm9kYXRhX2RhdGEgPSAmdGczVHNvRndSb2RhdGFbMF07Ci0JCWluZm8uZGF0YV9iYXNlID0gVEczX1RTT19GV19EQVRBX0FERFI7Ci0JCWluZm8uZGF0YV9sZW4gPSBURzNfVFNPX0ZXX0RBVEFfTEVOOwotCQlpbmZvLmRhdGFfZGF0YSA9ICZ0ZzNUc29Gd0RhdGFbMF07CiAJCWNwdV9iYXNlID0gVFhfQ1BVX0JBU0U7CiAJCWNwdV9zY3JhdGNoX2Jhc2UgPSBUWF9DUFVfU0NSQVRDSF9CQVNFOwogCQljcHVfc2NyYXRjaF9zaXplID0gVFhfQ1BVX1NDUkFUQ0hfU0laRTsKQEAgLTcwNjAsMjEgKzY0MTgsMjEgQEAKIAogCS8qIE5vdyBzdGFydHVwIHRoZSBjcHUuICovCiAJdHczMihjcHVfYmFzZSArIENQVV9TVEFURSwgMHhmZmZmZmZmZik7Ci0JdHczMl9mKGNwdV9iYXNlICsgQ1BVX1BDLCAgICBpbmZvLnRleHRfYmFzZSk7CisJdHczMl9mKGNwdV9iYXNlICsgQ1BVX1BDLCBpbmZvLmZ3X2Jhc2UpOwogCiAJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewotCQlpZiAodHIzMihjcHVfYmFzZSArIENQVV9QQykgPT0gaW5mby50ZXh0X2Jhc2UpCisJCWlmICh0cjMyKGNwdV9iYXNlICsgQ1BVX1BDKSA9PSBpbmZvLmZ3X2Jhc2UpCiAJCQlicmVhazsKIAkJdHczMihjcHVfYmFzZSArIENQVV9TVEFURSwgMHhmZmZmZmZmZik7CiAJCXR3MzIoY3B1X2Jhc2UgKyBDUFVfTU9ERSwgIENQVV9NT0RFX0hBTFQpOwotCQl0dzMyX2YoY3B1X2Jhc2UgKyBDUFVfUEMsICAgIGluZm8udGV4dF9iYXNlKTsKKwkJdHczMl9mKGNwdV9iYXNlICsgQ1BVX1BDLCBpbmZvLmZ3X2Jhc2UpOwogCQl1ZGVsYXkoMTAwMCk7CiAJfQogCWlmIChpID49IDUpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidGczX2xvYWRfdHNvX2Zpcm13YXJlIGZhaWxzIGZvciAlcyAiCiAJCSAgICAgICAidG8gc2V0IENQVSBQQywgaXMgJTA4eCBzaG91bGQgYmUgJTA4eFxuIiwKIAkJICAgICAgIHRwLT5kZXYtPm5hbWUsIHRyMzIoY3B1X2Jhc2UgKyBDUFVfUEMpLAotCQkgICAgICAgaW5mby50ZXh0X2Jhc2UpOworCQkgICAgICAgaW5mby5md19iYXNlKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCXR3MzIoY3B1X2Jhc2UgKyBDUFVfU1RBVEUsIDB4ZmZmZmZmZmYpOwpAQCAtNzI5OSwxMSArNjY1Nyw3IEBACiAJZWxzZSBpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9UU09fQ0FQQUJMRSkgewogCQlpbnQgZndfbGVuOwogCi0JCWZ3X2xlbiA9IChURzNfVFNPNV9GV19URVhUX0xFTiArCi0JCQkgIFRHM19UU081X0ZXX1JPREFUQV9MRU4gKwotCQkJICBURzNfVFNPNV9GV19EQVRBX0xFTiArCi0JCQkgIFRHM19UU081X0ZXX1NCU1NfTEVOICsKLQkJCSAgVEczX1RTTzVfRldfQlNTX0xFTik7CisJCWZ3X2xlbiA9IHRwLT5md19sZW47CiAJCWZ3X2xlbiA9IChmd19sZW4gKyAoMHg4MCAtIDEpKSAmIH4oMHg4MCAtIDEpOwogCQl0dzMyKEJVRk1HUl9NQl9QT09MX0FERFIsCiAJCSAgICAgTklDX1NSQU1fTUJVRl9QT09MX0JBU0U1NzA1ICsgZndfbGVuKTsKQEAgLTEzNTgwLDYgKzEyOTM0LDcgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCXN0cnVjdCB0ZzMgKnRwOwogCWludCBlcnIsIHBtX2NhcDsKKwljb25zdCBjaGFyICpmd19uYW1lID0gTlVMTDsKIAljaGFyIHN0cls0MF07CiAJdTY0IGRtYV9tYXNrLCBwZXJzaXN0X2RtYV9tYXNrOwogCkBAIC0xMzczNSw2ICsxMzA5MCw5IEBACiAKIAl0ZzNfaW5pdF9idWZtZ3JfY29uZmlnKHRwKTsKIAorCWlmICh0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwMV9BMCkKKwkJZndfbmFtZSA9IEZJUk1XQVJFX1RHMzsKKwogCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX0hXX1RTTykgewogCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9UU09fQ0FQQUJMRTsKIAl9CkBAIC0xMzc0Nyw2ICsxMzEwNSwzNyBAQAogCX0gZWxzZSB7CiAJCXRwLT50ZzNfZmxhZ3MyIHw9IFRHM19GTEcyX1RTT19DQVBBQkxFIHwgVEczX0ZMRzJfVFNPX0JVRzsKIAl9CisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfVFNPX0NBUEFCTEUpIHsKKwkJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA1KQorCQkJZndfbmFtZSA9IEZJUk1XQVJFX1RHM1RTTzU7CisJCWVsc2UKKwkJCWZ3X25hbWUgPSBGSVJNV0FSRV9URzNUU087CisJfQorCisJaWYgKGZ3X25hbWUpIHsKKwkJY29uc3QgX19iZTMyICpmd19kYXRhOworCisJCWVyciA9IHJlcXVlc3RfZmlybXdhcmUoJnRwLT5mdywgZndfbmFtZSwgJnRwLT5wZGV2LT5kZXYpOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInRnMzogRmFpbGVkIHRvIGxvYWQgZmlybXdhcmUgXCIlc1wiXG4iLAorCQkJICAgICAgIGZ3X25hbWUpOworCQkJZ290byBlcnJfb3V0X2lvdW5tYXA7CisJCX0KKworCQlmd19kYXRhID0gKHZvaWQgKil0cC0+ZnctPmRhdGE7CisKKwkJLyogRmlybXdhcmUgYmxvYiBzdGFydHMgd2l0aCB2ZXJzaW9uIG51bWJlcnMsIGZvbGxvd2VkIGJ5CisJCSAgIHN0YXJ0IGFkZHJlc3MgYW5kIF9mdWxsXyBsZW5ndGggaW5jbHVkaW5nIEJTUyBzZWN0aW9ucworCQkgICAod2hpY2ggbXVzdCBiZSBsb25nZXIgdGhhbiB0aGUgYWN0dWFsIGRhdGEsIG9mIGNvdXJzZSAqLworCisJCXRwLT5md19sZW4gPSBiZTMyX3RvX2NwdShmd19kYXRhWzJdKTsJLyogaW5jbHVkZXMgYnNzICovCisJCWlmICh0cC0+ZndfbGVuIDwgKHRwLT5mdy0+c2l6ZSAtIDEyKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJ0ZzM6IGJvZ3VzIGxlbmd0aCAlZCBpbiBcIiVzXCJcbiIsCisJCQkgICAgICAgdHAtPmZ3X2xlbiwgZndfbmFtZSk7CisJCQllcnIgPSAtRUlOVkFMOworCQkJZ290byBlcnJfb3V0X2Z3OworCQl9CisJfQogCiAJLyogVFNPIGlzIG9uIGJ5IGRlZmF1bHQgb24gY2hpcHMgdGhhdCBzdXBwb3J0IGhhcmR3YXJlIFRTTy4KIAkgKiBGaXJtd2FyZSBUU08gb24gb2xkZXIgY2hpcHMgZ2l2ZXMgbG93ZXIgcGVyZm9ybWFuY2UsIHNvIGl0CkBAIC0xMzc3OCw3ICsxMzE2Nyw3IEBACiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICJDb3VsZCBub3Qgb2J0YWluIHZhbGlkIGV0aGVybmV0IGFkZHJlc3MsICIKIAkJICAgICAgICJhYm9ydGluZy5cbiIpOwotCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKKwkJZ290byBlcnJfb3V0X2Z3OwogCX0KIAogCWlmICh0cC0+dGczX2ZsYWdzMyAmIFRHM19GTEczX0VOQUJMRV9BUEUpIHsKQEAgLTEzNzg3LDcgKzEzMTc2LDcgQEAKIAkJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBtYXAgQVBFIHJlZ2lzdGVycywgIgogCQkJICAgICAgICJhYm9ydGluZy5cbiIpOwogCQkJZXJyID0gLUVOT01FTTsKLQkJCWdvdG8gZXJyX291dF9pb3VubWFwOworCQkJZ290byBlcnJfb3V0X2Z3OwogCQl9CiAKIAkJdGczX2FwZV9sb2NrX2luaXQodHApOwpAQCAtMTM4NjcsNiArMTMyNTYsMTAgQEAKIAkJdHAtPmFwZXJlZ3MgPSBOVUxMOwogCX0KIAorZXJyX291dF9mdzoKKwlpZiAodHAtPmZ3KQorCQlyZWxlYXNlX2Zpcm13YXJlKHRwLT5mdyk7CisKIGVycl9vdXRfaW91bm1hcDoKIAlpZiAodHAtPnJlZ3MpIHsKIAkJaW91bm1hcCh0cC0+cmVncyk7CkBAIC0xMzg5Miw2ICsxMzI4NSw5IEBACiAJaWYgKGRldikgewogCQlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CiAKKwkJaWYgKHRwLT5mdykKKwkJCXJlbGVhc2VfZmlybXdhcmUodHAtPmZ3KTsKKwogCQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwogCiAJCWlmICh0cC0+dGczX2ZsYWdzMyAmIFRHM19GTEczX1VTRV9QSFlMSUIpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3RnMy5oIGIvZHJpdmVycy9uZXQvdGczLmgKaW5kZXggODkzNmVkZi4uYWU1ZGE2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdGczLmgKKysrIGIvZHJpdmVycy9uZXQvdGczLmgKQEAgLTI3NjIsNiArMjc2MiwxMCBAQAogI2RlZmluZSBTU1RfMjVWRjBYMF9QQUdFX1NJWkUJCTQwOTgKIAogCXN0cnVjdCBldGh0b29sX2NvYWxlc2NlCQljb2FsOworCisJLyogZmlybXdhcmUgaW5mbyAqLworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZQkJKmZ3OworCXUzMgkJCQlmd19sZW47IC8qIGluY2x1ZGVzIEJTUyAqLwogfTsKIAogI2VuZGlmIC8qICEoX1QzX0gpICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90bGFuLmMgYi9kcml2ZXJzL25ldC90bGFuLmMKaW5kZXggODVlZjhiNy4uNjhiOTY3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdGxhbi5jCisrKyBiL2RyaXZlcnMvbmV0L3RsYW4uYwpAQCAtODMxLDYgKzgzMSwyMSBAQAogfQogI2VuZGlmCiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgVExhbl9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbiAJCT0gVExhbl9PcGVuLAorCS5uZG9fc3RvcAkJPSBUTGFuX0Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdAkJPSBUTGFuX1N0YXJ0VHgsCisJLm5kb190eF90aW1lb3V0CQk9IFRMYW5fdHhfdGltZW91dCwKKwkubmRvX2dldF9zdGF0cwkJPSBUTGFuX0dldFN0YXRzLAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gVExhbl9TZXRNdWx0aWNhc3RMaXN0LAorCS5uZG9fZG9faW9jdGwJCT0gVExhbl9pb2N0bCwKKwkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgCT0gZXRoX21hY19hZGRyLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJLm5kb19wb2xsX2NvbnRyb2xsZXIJID0gVExhbl9Qb2xsLAorI2VuZGlmCit9OwogCiAKIApAQCAtODkyLDE2ICs5MDcsNyBAQAogCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CiAKIAkvKiBEZXZpY2UgbWV0aG9kcyAqLwotCWRldi0+b3BlbiA9ICZUTGFuX09wZW47Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmVExhbl9TdGFydFR4OwotCWRldi0+c3RvcCA9ICZUTGFuX0Nsb3NlOwotCWRldi0+Z2V0X3N0YXRzID0gJlRMYW5fR2V0U3RhdHM7Ci0JZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmVExhbl9TZXRNdWx0aWNhc3RMaXN0OwotCWRldi0+ZG9faW9jdGwgPSAmVExhbl9pb2N0bDsKLSNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgotCWRldi0+cG9sbF9jb250cm9sbGVyID0gJlRMYW5fUG9sbDsKLSNlbmRpZgotCWRldi0+dHhfdGltZW91dCA9ICZUTGFuX3R4X3RpbWVvdXQ7CisJZGV2LT5uZXRkZXZfb3BzID0gJlRMYW5fbmV0ZGV2X29wczsKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3NtY3RyLmMgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvc21jdHIuYwppbmRleCBhMDExNjY2Li41MGViMjljIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvc21jdHIuYworKysgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvc21jdHIuYwpAQCAtMzA2NCw3ICszMDY0LDcgQEAKICAqIHdpbGwgY29uc2VxdWVudGx5IGNhdXNlIGEgdGltZW91dC4KICAqCiAgKiBOT1RFIDE6IElmIHRoZSBtb25pdG9yX3N0YXRlIGlzIE1TX0JFQUNPTl9URVNUX1NUQVRFLCBhbGwgdHJhbnNtaXQKLSAqIHF1ZXVlcyBvdGhlciB0aGVuIHRoZSBvbmUgdXNlZCBmb3IgdGhlIGxvYmVfbWVkaWFfdGVzdCBzaG91bGQgYmUKKyAqIHF1ZXVlcyBvdGhlciB0aGFuIHRoZSBvbmUgdXNlZCBmb3IgdGhlIGxvYmVfbWVkaWFfdGVzdCBzaG91bGQgYmUKICAqIGRpc2FibGVkLiE/CiAgKgogICogTk9URSAyOiBJZiB0aGUgbW9uaXRvcl9zdGF0ZSBpcyBNU19CRUFDT05fVEVTVF9TVEFURSBhbmQgdGhlIHJlY2VpdmVfbWFzawpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvZGUyMTA0eC5jIGIvZHJpdmVycy9uZXQvdHVsaXAvZGUyMTA0eC5jCmluZGV4IDUxNjZiZTkuLmQ1ZDUzYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL2RlMjEwNHguYworKysgYi9kcml2ZXJzL25ldC90dWxpcC9kZTIxMDR4LmMKQEAgLTE5MjIsNiArMTkyMiwxOCBAQAogCWdvdG8gZmlsbF9kZWZhdWx0czsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBkZV9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbgkJPSBkZV9vcGVuLAorCS5uZG9fc3RvcAkJPSBkZV9jbG9zZSwKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IGRlX3NldF9yeF9tb2RlLAorCS5uZG9fc3RhcnRfeG1pdAkJPSBkZV9zdGFydF94bWl0LAorCS5uZG9fZ2V0X3N0YXRzCQk9IGRlX2dldF9zdGF0cywKKwkubmRvX3R4X3RpbWVvdXQgCT0gZGVfdHhfdGltZW91dCwKKwkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgCT0gZXRoX21hY19hZGRyLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorfTsKKwogc3RhdGljIGludCBfX2RldmluaXQgZGVfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKQEAgLTE5NDQsMTQgKzE5NTYsOSBAQAogCWlmICghZGV2KQogCQlyZXR1cm4gLUVOT01FTTsKIAorCWRldi0+bmV0ZGV2X29wcyA9ICZkZV9uZXRkZXZfb3BzOwogCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7Ci0JZGV2LT5vcGVuID0gZGVfb3BlbjsKLQlkZXYtPnN0b3AgPSBkZV9jbG9zZTsKLQlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IGRlX3NldF9yeF9tb2RlOwotCWRldi0+aGFyZF9zdGFydF94bWl0ID0gZGVfc3RhcnRfeG1pdDsKLQlkZXYtPmdldF9zdGF0cyA9IGRlX2dldF9zdGF0czsKIAlkZXYtPmV0aHRvb2xfb3BzID0gJmRlX2V0aHRvb2xfb3BzOwotCWRldi0+dHhfdGltZW91dCA9IGRlX3R4X3RpbWVvdXQ7CiAJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CiAKIAlkZSA9IG5ldGRldl9wcml2KGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC9kZTR4NS5jIGIvZHJpdmVycy9uZXQvdHVsaXAvZGU0eDUuYwppbmRleCA2N2JmZDZmLi42NDE4Zjc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dWxpcC9kZTR4NS5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL2RlNHg1LmMKQEAgLTEwNzcsNiArMTA3NywxOCBAQAogICAgIG1kZWxheSgyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXYWl0IGZvciAybXMgKi9cCiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgZGU0eDVfbmV0ZGV2X29wcyA9IHsKKyAgICAubmRvX29wZW4JCT0gZGU0eDVfb3BlbiwKKyAgICAubmRvX3N0b3AJCT0gZGU0eDVfY2xvc2UsCisgICAgLm5kb19zdGFydF94bWl0CT0gZGU0eDVfcXVldWVfcGt0LAorICAgIC5uZG9fZ2V0X3N0YXRzCT0gZGU0eDVfZ2V0X3N0YXRzLAorICAgIC5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gc2V0X211bHRpY2FzdF9saXN0LAorICAgIC5uZG9fZG9faW9jdGwJPSBkZTR4NV9pb2N0bCwKKyAgICAubmRvX2NoYW5nZV9tdHUJPSBldGhfY2hhbmdlX210dSwKKyAgICAubmRvX3NldF9tYWNfYWRkcmVzcz0gZXRoX21hY19hZGRyLAorICAgIC5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorfTsKKwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdAogZGU0eDVfaHdfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X2xvbmcgaW9iYXNlLCBzdHJ1Y3QgZGV2aWNlICpnZW5kZXYpCkBAIC0xMjU4LDEzICsxMjcwLDcgQEAKIAogICAgIC8qIFRoZSBERTRYNS1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLwogICAgIFNFVF9ORVRERVZfREVWKGRldiwgZ2VuZGV2KTsKLSAgICBkZXYtPm9wZW4gPSAmZGU0eDVfb3BlbjsKLSAgICBkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZkZTR4NV9xdWV1ZV9wa3Q7Ci0gICAgZGV2LT5zdG9wID0gJmRlNHg1X2Nsb3NlOwotICAgIGRldi0+Z2V0X3N0YXRzID0gJmRlNHg1X2dldF9zdGF0czsKLSAgICBkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfbXVsdGljYXN0X2xpc3Q7Ci0gICAgZGV2LT5kb19pb2N0bCA9ICZkZTR4NV9pb2N0bDsKLQorICAgIGRldi0+bmV0ZGV2X29wcyA9ICZkZTR4NV9uZXRkZXZfb3BzOwogICAgIGRldi0+bWVtX3N0YXJ0ID0gMDsKIAogICAgIC8qIEZpbGwgaW4gdGhlIGdlbmVyaWMgZmllbGRzIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvZG1mZS5jIGIvZHJpdmVycy9uZXQvdHVsaXAvZG1mZS5jCmluZGV4IDI4YTVjNTEuLjJlNWM5OTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL2RtZmUuYworKysgYi9kcml2ZXJzL25ldC90dWxpcC9kbWZlLmMKQEAgLTI1Nyw5ICsyNTcsNiBAQAogCXU4IHdvbF9tb2RlOwkJCS8qIHVzZXIgV09MIHNldHRpbmdzICovCiAJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CiAKLQkvKiBTeXN0ZW0gZGVmaW5lZCBzdGF0aXN0aWMgY291bnRlciAqLwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwotCiAJLyogRHJpdmVyIGRlZmluZWQgc3RhdGlzdGljIGNvdW50ZXIgKi8KIAl1bnNpZ25lZCBsb25nIHR4X2ZpZm9fdW5kZXJydW47CiAJdW5zaWduZWQgbG9uZyB0eF9sb3NzX2NhcnJpZXI7CkBAIC0zMTYsNyArMzEzLDYgQEAKIHN0YXRpYyBpbnQgZG1mZV9vcGVuKHN0cnVjdCBERVZJQ0UgKik7CiBzdGF0aWMgaW50IGRtZmVfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgREVWSUNFICopOwogc3RhdGljIGludCBkbWZlX3N0b3Aoc3RydWN0IERFVklDRSAqKTsKLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqIGRtZmVfZ2V0X3N0YXRzKHN0cnVjdCBERVZJQ0UgKik7CiBzdGF0aWMgdm9pZCBkbWZlX3NldF9maWx0ZXJfbW9kZShzdHJ1Y3QgREVWSUNFICopOwogc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHM7CiBzdGF0aWMgdTE2IHJlYWRfc3JvbV93b3JkKGxvbmcgLGludCk7CkBAIC0zNTEsNiArMzQ3LDE5IEBACiAKIC8qIERNOTEwWCBuZXR3b3JrIGJvYXJkIHJvdXRpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIG5ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuIAkJPSBkbWZlX29wZW4sCisJLm5kb19zdG9wCQk9IGRtZmVfc3RvcCwKKwkubmRvX3N0YXJ0X3htaXQJCT0gZG1mZV9zdGFydF94bWl0LAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gZG1mZV9zZXRfZmlsdGVyX21vZGUsCisJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAorCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gZXRoX21hY19hZGRyLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJLm5kb19wb2xsX2NvbnRyb2xsZXIJPSBwb2xsX2RtZmUsCisjZW5kaWYKK307CisKIC8qCiAgKglTZWFyY2ggRE05MTBYIGJvYXJkICxhbGxvY2F0ZSBzcGFjZSBhbmQgcmVnaXN0ZXIgaXQKICAqLwpAQCAtNDQyLDE0ICs0NTEsNyBAQAogCWRldi0+YmFzZV9hZGRyID0gZGItPmlvYWRkcjsKIAlkZXYtPmlycSA9IHBkZXYtPmlycTsKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKLQlkZXYtPm9wZW4gPSAmZG1mZV9vcGVuOwotCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJmRtZmVfc3RhcnRfeG1pdDsKLQlkZXYtPnN0b3AgPSAmZG1mZV9zdG9wOwotCWRldi0+Z2V0X3N0YXRzID0gJmRtZmVfZ2V0X3N0YXRzOwotCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJmRtZmVfc2V0X2ZpbHRlcl9tb2RlOwotI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCi0JZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSAmcG9sbF9kbWZlOwotI2VuZGlmCisJZGV2LT5uZXRkZXZfb3BzID0gJm5ldGRldl9vcHM7CiAJZGV2LT5ldGh0b29sX29wcyA9ICZuZXRkZXZfZXRodG9vbF9vcHM7CiAJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKIAlzcGluX2xvY2tfaW5pdCgmZGItPmxvY2spOwpAQCAtODY3LDE1ICs4NjksMTUgQEAKIAogCQkvKiBBIHBhY2tldCBzZW50IGNvbXBsZXRlZCAqLwogCQlkYi0+dHhfcGFja2V0X2NudC0tOwotCQlkYi0+c3RhdHMudHhfcGFja2V0cysrOworCQlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKIAogCQkvKiBUcmFuc21pdCBzdGF0aXN0aWMgY291bnRlciAqLwogCQlpZiAoIHRkZXMwICE9IDB4N2ZmZmZmZmYgKSB7CiAJCQkvKiBwcmludGsoRFJWX05BTUUgIjogdGRlczA9JXhcbiIsIHRkZXMwKTsgKi8KLQkJCWRiLT5zdGF0cy5jb2xsaXNpb25zICs9ICh0ZGVzMCA+PiAzKSAmIDB4ZjsKLQkJCWRiLT5zdGF0cy50eF9ieXRlcyArPSBsZTMyX3RvX2NwdSh0eHB0ci0+dGRlczEpICYgMHg3ZmY7CisJCQlkZXYtPnN0YXRzLmNvbGxpc2lvbnMgKz0gKHRkZXMwID4+IDMpICYgMHhmOworCQkJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBsZTMyX3RvX2NwdSh0eHB0ci0+dGRlczEpICYgMHg3ZmY7CiAJCQlpZiAodGRlczAgJiBUREVTMF9FUlJfTUFTSykgewotCQkJCWRiLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCQlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOwogCiAJCQkJaWYgKHRkZXMwICYgMHgwMDAyKSB7CS8qIFVuZGVyUnVuICovCiAJCQkJCWRiLT50eF9maWZvX3VuZGVycnVuKys7CkBAIC05NjksMTMgKzk3MSwxMyBAQAogCQkJaWYgKHJkZXMwICYgMHg4MDAwKSB7CiAJCQkJLyogVGhpcyBpcyBhIGVycm9yIHBhY2tldCAqLwogCQkJCS8vcHJpbnRrKERSVl9OQU1FICI6IHJkZXMwOiAlbHhcbiIsIHJkZXMwKTsKLQkJCQlkYi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJCQlpZiAocmRlczAgJiAxKQotCQkJCQlkYi0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJCQkJZGV2LT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOwogCQkJCWlmIChyZGVzMCAmIDIpCi0JCQkJCWRiLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQkJCWRldi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOwogCQkJCWlmIChyZGVzMCAmIDB4ODApCi0JCQkJCWRiLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQkJCWRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOwogCQkJfQogCiAJCQlpZiAoICEocmRlczAgJiAweDgwMDApIHx8CkBAIC0xMDA4LDggKzEwMTAsOCBAQAogCiAJCQkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CiAJCQkJCW5ldGlmX3J4KHNrYik7Ci0JCQkJCWRiLT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0JCQkJCWRiLT5zdGF0cy5yeF9ieXRlcyArPSByeGxlbjsKKwkJCQkJZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQkJCWRldi0+c3RhdHMucnhfYnl0ZXMgKz0gcnhsZW47CiAJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQkvKiBSZXVzZSBTS0IgYnVmZmVyIHdoZW4gdGhlIHBhY2tldCBpcyBlcnJvciAqLwpAQCAtMTAyNCwyMCArMTAyNiw2IEBACiAJZGItPnJ4X3JlYWR5X3B0ciA9IHJ4cHRyOwogfQogCi0KLS8qCi0gKglHZXQgc3RhdGlzdGljcyBmcm9tIGRyaXZlci4KLSAqLwotCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKiBkbWZlX2dldF9zdGF0cyhzdHJ1Y3QgREVWSUNFICpkZXYpCi17Ci0Jc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqZGIgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JRE1GRV9EQlVHKDAsICJkbWZlX2dldF9zdGF0cyIsIDApOwotCXJldHVybiAmZGItPnN0YXRzOwotfQotCi0KIC8qCiAgKiBTZXQgRE05MTBYIG11bHRpY2FzdCBhZGRyZXNzCiAgKi8KQEAgLTExNjEsNyArMTE0OSw3IEBACiAKIAkvKiBPcGVyYXRpbmcgTW9kZSBDaGVjayAqLwogCWlmICggKGRiLT5kbTkxMHhfY2hrX21vZGUgJiAweDEpICYmCi0JCShkYi0+c3RhdHMucnhfcGFja2V0cyA+IE1BWF9DSEVDS19QQUNLRVQpICkKKwkJKGRldi0+c3RhdHMucnhfcGFja2V0cyA+IE1BWF9DSEVDS19QQUNLRVQpICkKIAkJZGItPmRtOTEweF9jaGtfbW9kZSA9IDB4NDsKIAogCS8qIER5bmFtaWMgcmVzZXQgRE05MTBYIDogc3lzdGVtIGVycm9yIG9yIHRyYW5zbWl0IHRpbWUtb3V0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC90dWxpcF9jb3JlLmMgYi9kcml2ZXJzL25ldC90dWxpcC90dWxpcF9jb3JlLmMKaW5kZXggZmY4NGJhYi4uYmVlNzVmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAvdHVsaXBfY29yZS5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL3R1bGlwX2NvcmUuYwpAQCAtMTIyNSw2ICsxMjI1LDIyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgdHVsaXBfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gdHVsaXBfb3BlbiwKKwkubmRvX3N0YXJ0X3htaXQJCT0gdHVsaXBfc3RhcnRfeG1pdCwKKwkubmRvX3R4X3RpbWVvdXQJCT0gdHVsaXBfdHhfdGltZW91dCwKKwkubmRvX3N0b3AJCT0gdHVsaXBfY2xvc2UsCisJLm5kb19nZXRfc3RhdHMJCT0gdHVsaXBfZ2V0X3N0YXRzLAorCS5uZG9fZG9faW9jdGwgCQk9IHByaXZhdGVfaW9jdGwsCisJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBzZXRfcnhfbW9kZSwKKwkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBldGhfbWFjX2FkZHIsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwkubmRvX3BvbGxfY29udHJvbGxlcgkgPSBwb2xsX3R1bGlwLAorI2VuZGlmCit9OworCiBzdGF0aWMgaW50IF9fZGV2aW5pdCB0dWxpcF9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewpAQCAtMTYwMSwyMCArMTYxNywxMSBAQAogCX0KIAogCS8qIFRoZSBUdWxpcC1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLwotCWRldi0+b3BlbiA9IHR1bGlwX29wZW47Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSB0dWxpcF9zdGFydF94bWl0OwotCWRldi0+dHhfdGltZW91dCA9IHR1bGlwX3R4X3RpbWVvdXQ7CisJZGV2LT5uZXRkZXZfb3BzID0gJnR1bGlwX25ldGRldl9vcHM7CiAJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CiAjaWZkZWYgQ09ORklHX1RVTElQX05BUEkKIAluZXRpZl9uYXBpX2FkZChkZXYsICZ0cC0+bmFwaSwgdHVsaXBfcG9sbCwgMTYpOwogI2VuZGlmCi0JZGV2LT5zdG9wID0gdHVsaXBfY2xvc2U7Ci0JZGV2LT5nZXRfc3RhdHMgPSB0dWxpcF9nZXRfc3RhdHM7Ci0JZGV2LT5kb19pb2N0bCA9IHByaXZhdGVfaW9jdGw7Ci0JZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBzZXRfcnhfbW9kZTsKLSNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgotCWRldi0+cG9sbF9jb250cm9sbGVyID0gJnBvbGxfdHVsaXA7Ci0jZW5kaWYKIAlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmb3BzKTsKIAogCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL3VsaTUyNnguYyBiL2RyaXZlcnMvbmV0L3R1bGlwL3VsaTUyNnguYwppbmRleCAwMGNiYzUyLi4wMzBlMDJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dWxpcC91bGk1MjZ4LmMKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvdWxpNTI2eC5jCkBAIC0xNjgsOSArMTY4LDYgQEAKIAl1OCB3YWl0X3Jlc2V0OwkJCS8qIEhhcmR3YXJlIGZhaWxlZCwgbmVlZCB0byByZXNldCAqLwogCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwogCi0JLyogU3lzdGVtIGRlZmluZWQgc3RhdGlzdGljIGNvdW50ZXIgKi8KLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKLQogCS8qIERyaXZlciBkZWZpbmVkIHN0YXRpc3RpYyBjb3VudGVyICovCiAJdW5zaWduZWQgbG9uZyB0eF9maWZvX3VuZGVycnVuOwogCXVuc2lnbmVkIGxvbmcgdHhfbG9zc19jYXJyaWVyOwpAQCAtMjIwLDcgKzIxNyw2IEBACiBzdGF0aWMgaW50IHVsaTUyNnhfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqKTsKIHN0YXRpYyBpbnQgdWxpNTI2eF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICosIHN0cnVjdCBuZXRfZGV2aWNlICopOwogc3RhdGljIGludCB1bGk1MjZ4X3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKik7Ci1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKiB1bGk1MjZ4X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsKIHN0YXRpYyB2b2lkIHVsaTUyNnhfc2V0X2ZpbHRlcl9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICopOwogc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHM7CiBzdGF0aWMgdTE2IHJlYWRfc3JvbV93b3JkKGxvbmcsIGludCk7CkBAIC0yNTEsNiArMjQ3LDE5IEBACiAKIC8qIFVMSTUyNlggbmV0d29yayBib2FyZCByb3V0aW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBuZXRkZXZfb3BzID0geworCS5uZG9fb3BlbgkJPSB1bGk1MjZ4X29wZW4sCisJLm5kb19zdG9wCQk9IHVsaTUyNnhfc3RvcCwKKwkubmRvX3N0YXJ0X3htaXQJCT0gdWxpNTI2eF9zdGFydF94bWl0LAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gdWxpNTI2eF9zZXRfZmlsdGVyX21vZGUsCisJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAorCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gZXRoX21hY19hZGRyLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJLm5kb19wb2xsX2NvbnRyb2xsZXIgCT0gdWxpNTI2eF9wb2xsLAorI2VuZGlmCit9OworCiAvKgogICoJU2VhcmNoIFVMSTUyNlggYm9hcmQsIGFsbG9jYXRlIHNwYWNlIGFuZCByZWdpc3RlciBpdAogICovCkBAIC0zMzUsMTUgKzM0NCw5IEBACiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CiAKIAkvKiBSZWdpc3RlciBzb21lIG5lY2Vzc2FyeSBmdW5jdGlvbnMgKi8KLQlkZXYtPm9wZW4gPSAmdWxpNTI2eF9vcGVuOwotCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJnVsaTUyNnhfc3RhcnRfeG1pdDsKLQlkZXYtPnN0b3AgPSAmdWxpNTI2eF9zdG9wOwotCWRldi0+Z2V0X3N0YXRzID0gJnVsaTUyNnhfZ2V0X3N0YXRzOwotCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnVsaTUyNnhfc2V0X2ZpbHRlcl9tb2RlOworCWRldi0+bmV0ZGV2X29wcyA9ICZuZXRkZXZfb3BzOwogCWRldi0+ZXRodG9vbF9vcHMgPSAmbmV0ZGV2X2V0aHRvb2xfb3BzOwotI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCi0JZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSAmdWxpNTI2eF9wb2xsOwotI2VuZGlmCisKIAlzcGluX2xvY2tfaW5pdCgmZGItPmxvY2spOwogCiAKQEAgLTczMyw3ICs3MzYsOCBAQAogICoJRnJlZSBUWCByZXNvdXJjZSBhZnRlciBUWCBjb21wbGV0ZQogICovCiAKLXN0YXRpYyB2b2lkIHVsaTUyNnhfZnJlZV90eF9wa3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHVsaTUyNnhfYm9hcmRfaW5mbyAqIGRiKQorc3RhdGljIHZvaWQgdWxpNTI2eF9mcmVlX3R4X3BrdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCB1bGk1MjZ4X2JvYXJkX2luZm8gKiBkYikKIHsKIAlzdHJ1Y3QgdHhfZGVzYyAqdHhwdHI7CiAJdTMyIHRkZXMwOwpAQCAtNzQ3LDE1ICs3NTEsMTUgQEAKIAogCQkvKiBBIHBhY2tldCBzZW50IGNvbXBsZXRlZCAqLwogCQlkYi0+dHhfcGFja2V0X2NudC0tOwotCQlkYi0+c3RhdHMudHhfcGFja2V0cysrOworCQlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKIAogCQkvKiBUcmFuc21pdCBzdGF0aXN0aWMgY291bnRlciAqLwogCQlpZiAoIHRkZXMwICE9IDB4N2ZmZmZmZmYgKSB7CiAJCQkvKiBwcmludGsoRFJWX05BTUUgIjogdGRlczA9JXhcbiIsIHRkZXMwKTsgKi8KLQkJCWRiLT5zdGF0cy5jb2xsaXNpb25zICs9ICh0ZGVzMCA+PiAzKSAmIDB4ZjsKLQkJCWRiLT5zdGF0cy50eF9ieXRlcyArPSBsZTMyX3RvX2NwdSh0eHB0ci0+dGRlczEpICYgMHg3ZmY7CisJCQlkZXYtPnN0YXRzLmNvbGxpc2lvbnMgKz0gKHRkZXMwID4+IDMpICYgMHhmOworCQkJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBsZTMyX3RvX2NwdSh0eHB0ci0+dGRlczEpICYgMHg3ZmY7CiAJCQlpZiAodGRlczAgJiBUREVTMF9FUlJfTUFTSykgewotCQkJCWRiLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCQlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOwogCQkJCWlmICh0ZGVzMCAmIDB4MDAwMikgewkvKiBVbmRlclJ1biAqLwogCQkJCQlkYi0+dHhfZmlmb191bmRlcnJ1bisrOwogCQkJCQlpZiAoICEoZGItPmNyNl9kYXRhICYgQ1I2X1NGVCkgKSB7CkBAIC04MjUsMTMgKzgyOSwxMyBAQAogCQkJaWYgKHJkZXMwICYgMHg4MDAwKSB7CiAJCQkJLyogVGhpcyBpcyBhIGVycm9yIHBhY2tldCAqLwogCQkJCS8vcHJpbnRrKERSVl9OQU1FICI6IHJkZXMwOiAlbHhcbiIsIHJkZXMwKTsKLQkJCQlkYi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJCQlpZiAocmRlczAgJiAxKQotCQkJCQlkYi0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJCQkJZGV2LT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOwogCQkJCWlmIChyZGVzMCAmIDIpCi0JCQkJCWRiLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQkJCWRldi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOwogCQkJCWlmIChyZGVzMCAmIDB4ODApCi0JCQkJCWRiLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQkJCWRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOwogCQkJfQogCiAJCQlpZiAoICEocmRlczAgJiAweDgwMDApIHx8CkBAIC04NTQsOCArODU4LDggQEAKIAogCQkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CiAJCQkJbmV0aWZfcngoc2tiKTsKLQkJCQlkYi0+c3RhdHMucnhfcGFja2V0cysrOwotCQkJCWRiLT5zdGF0cy5yeF9ieXRlcyArPSByeGxlbjsKKwkJCQlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCQlkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHJ4bGVuOwogCiAJCQl9IGVsc2UgewogCQkJCS8qIFJldXNlIFNLQiBidWZmZXIgd2hlbiB0aGUgcGFja2V0IGlzIGVycm9yICovCkBAIC04NzIsMTkgKzg3Niw2IEBACiAKIAogLyoKLSAqCUdldCBzdGF0aXN0aWNzIGZyb20gZHJpdmVyLgotICovCi0KLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqIHVsaTUyNnhfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHVsaTUyNnhfYm9hcmRfaW5mbyAqZGIgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JVUxJNTI2WF9EQlVHKDAsICJ1bGk1MjZ4X2dldF9zdGF0cyIsIDApOwotCXJldHVybiAmZGItPnN0YXRzOwotfQotCi0KLS8qCiAgKiBTZXQgVUxJNTI2WCBtdWx0aWNhc3QgYWRkcmVzcwogICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL3dpbmJvbmQtODQwLmMgYi9kcml2ZXJzL25ldC90dWxpcC93aW5ib25kLTg0MC5jCmluZGV4IDAyMmQ5OWEuLmY0NjdiZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL3dpbmJvbmQtODQwLmMKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvd2luYm9uZC04NDAuYwpAQCAtMzQzLDcgKzM0MywxOCBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHM7CiBzdGF0aWMgaW50ICBuZXRkZXZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKLQorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBuZXRkZXZfb3BzID0geworCS5uZG9fb3BlbgkJPSBuZXRkZXZfb3BlbiwKKwkubmRvX3N0b3AJCT0gbmV0ZGV2X2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdAkJPSBzdGFydF90eCwKKwkubmRvX2dldF9zdGF0cwkJPSBnZXRfc3RhdHMsCisJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBzZXRfcnhfbW9kZSwKKwkubmRvX2RvX2lvY3RsCQk9IG5ldGRldl9pb2N0bCwKKwkubmRvX3R4X3RpbWVvdXQJCT0gdHhfdGltZW91dCwKKwkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBldGhfbWFjX2FkZHIsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCit9OwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCB3ODQwX3Byb2JlMSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQpAQCAtNDIwLDE0ICs0MzEsOCBAQAogCQlucC0+bWlpX2lmLmZvcmNlX21lZGlhID0gMTsKIAogCS8qIFRoZSBjaGlwLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCi0JZGV2LT5vcGVuID0gJm5ldGRldl9vcGVuOwotCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJnN0YXJ0X3R4OwotCWRldi0+c3RvcCA9ICZuZXRkZXZfY2xvc2U7Ci0JZGV2LT5nZXRfc3RhdHMgPSAmZ2V0X3N0YXRzOwotCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9yeF9tb2RlOwotCWRldi0+ZG9faW9jdGwgPSAmbmV0ZGV2X2lvY3RsOworCWRldi0+bmV0ZGV2X29wcyA9ICZuZXRkZXZfb3BzOwogCWRldi0+ZXRodG9vbF9vcHMgPSAmbmV0ZGV2X2V0aHRvb2xfb3BzOwotCWRldi0+dHhfdGltZW91dCA9ICZ0eF90aW1lb3V0OwogCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOwogCiAJaSA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwpAQCAtMTU1NSw3ICsxNTYwLDcgQEAKICAqIAlydG5sX2xvY2ssICYgbmV0aWZfZGV2aWNlX2RldGFjaCBhZnRlciB0aGUgcnRubF91bmxvY2suCiAgKiAtIGdldF9zdGF0czoKICAqIAlzcGluX2xvY2tfaXJxKG5wLT5sb2NrKSwgZG9lc24ndCB0b3VjaCBodyBpZiBub3QgcHJlc2VudAotICogLSBoYXJkX3N0YXJ0X3htaXQ6CisgKiAtIHN0YXJ0X3htaXQ6CiAgKiAJc3luY2hyb25pemVfaXJxICsgbmV0aWZfdHhfZGlzYWJsZTsKICAqIC0gdHhfdGltZW91dDoKICAqIAluZXRpZl9kZXZpY2VfZGV0YWNoICsgbmV0aWZfdHhfZGlzYWJsZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL3hpcmNvbV9jYi5jIGIvZHJpdmVycy9uZXQvdHVsaXAveGlyY29tX2NiLmMKaW5kZXggMTNjODcwMy4uYzJjYTlmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAveGlyY29tX2NiLmMKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAveGlyY29tX2NiLmMKQEAgLTEwNCwxMCArMTA0LDggQEAKIAkgKi8KIAlzcGlubG9ja190IGxvY2s7CiAKLQogCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CiB9OwogCiAKQEAgLTExOSw3ICsxMTcsNiBAQAogc3RhdGljIGludCB4aXJjb21fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyBpbnQgeGlyY29tX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIHZvaWQgeGlyY29tX3VwKHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCk7Ci1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnhpcmNvbV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKIHN0YXRpYyB2b2lkIHhpcmNvbV9wb2xsX2NvbnRyb2xsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAjZW5kaWYKQEAgLTE5NCw2ICsxOTEsMTggQEAKIAkuZ2V0X2RydmluZm8JCT0gbmV0ZGV2X2dldF9kcnZpbmZvLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBuZXRkZXZfb3BzID0geworCS5uZG9fb3BlbgkJPSB4aXJjb21fb3BlbiwKKwkubmRvX3N0b3AJCT0geGlyY29tX2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdAkJPSB4aXJjb21fc3RhcnRfeG1pdCwKKwkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBldGhfbWFjX2FkZHIsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwkubmRvX3BvbGxfY29udHJvbGxlcgk9IHhpcmNvbV9wb2xsX2NvbnRyb2xsZXIsCisjZW5kaWYKK307CisKIC8qIHhpcmNvbV9wcm9iZSBpcyB0aGUgY29kZSB0aGF0IGdldHMgY2FsbGVkIG9uIGRldmljZSBpbnNlcnRpb24uCiAgICBpdCBzZXRzIHVwIHRoZSBoYXJkd2FyZSBhbmQgcmVnaXN0ZXJzIHRoZSBkZXZpY2UgdG8gdGhlIG5ldHdvcmtsYXllci4KIApAQCAtMjY2LDEzICsyNzUsNyBAQAogCXJlYWRfbWFjX2FkZHJlc3MocHJpdmF0ZSk7CiAJc2V0dXBfZGVzY3JpcHRvcnMocHJpdmF0ZSk7CiAKLQlkZXYtPm9wZW4gPSAmeGlyY29tX29wZW47Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmeGlyY29tX3N0YXJ0X3htaXQ7Ci0JZGV2LT5zdG9wID0gJnhpcmNvbV9jbG9zZTsKLQlkZXYtPmdldF9zdGF0cyA9ICZ4aXJjb21fZ2V0X3N0YXRzOwotI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCi0JZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSAmeGlyY29tX3BvbGxfY29udHJvbGxlcjsKLSNlbmRpZgorCWRldi0+bmV0ZGV2X29wcyA9ICZuZXRkZXZfb3BzOwogCVNFVF9FVEhUT09MX09QUyhkZXYsICZuZXRkZXZfZXRodG9vbF9vcHMpOwogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOwogCkBAIC00OTcsMTQgKzUwMCw2IEBACiB9CiAKIAotCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnhpcmNvbV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLSAgICAgICAgc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkID0gbmV0ZGV2X3ByaXYoZGV2KTsKLSAgICAgICAgcmV0dXJuICZjYXJkLT5zdGF0czsKLX0KLQotCiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKIHN0YXRpYyB2b2lkIHhpcmNvbV9wb2xsX2NvbnRyb2xsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKQEAgLTExOTMsNyArMTE4OCw3IEBACiAKIAkJCXNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDIpOwogCQkJaWYgKHNrYiA9PSBOVUxMKSB7Ci0JCQkJY2FyZC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCWRldi0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQkJCWdvdG8gb3V0OwogCQkJfQogCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKQEAgLTEyMDEsOCArMTE5Niw4IEBACiAJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CiAJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCQkJbmV0aWZfcngoc2tiKTsKLQkJCWNhcmQtPnN0YXRzLnJ4X3BhY2tldHMrKzsKLQkJCWNhcmQtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CisJCQlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCWRldi0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKIAogCQkgICAgICBvdXQ6CiAJCQkvKiBnaXZlIHRoZSBidWZmZXIgYmFjayB0byB0aGUgY2FyZCAqLwpAQCAtMTIzMiwxNiArMTIyNywxNiBAQAogI2VuZGlmCiAJCWlmIChzdGF0dXMgPiAwKSB7CS8qIGJpdCAzMSBpcyAwIHdoZW4gZG9uZSAqLwogCQkJaWYgKGNhcmQtPnR4X3NrYltkZXNjbnJdIT1OVUxMKSB7Ci0JCQkJY2FyZC0+c3RhdHMudHhfYnl0ZXMgKz0gY2FyZC0+dHhfc2tiW2Rlc2Nucl0tPmxlbjsKKwkJCQlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IGNhcmQtPnR4X3NrYltkZXNjbnJdLT5sZW47CiAJCQkJZGV2X2tmcmVlX3NrYl9pcnEoY2FyZC0+dHhfc2tiW2Rlc2Nucl0pOwogCQkJfQogCQkJY2FyZC0+dHhfc2tiW2Rlc2Nucl0gPSBOVUxMOwogCQkJLyogQml0IDggaW4gdGhlIHN0YXR1cyBmaWVsZCBpcyAxIGlmIHRoZXJlIHdhcyBhIGNvbGxpc2lvbiAqLwogCQkJaWYgKHN0YXR1cyYoMTw8OCkpCi0JCQkJY2FyZC0+c3RhdHMuY29sbGlzaW9ucysrOworCQkJCWRldi0+c3RhdHMuY29sbGlzaW9ucysrOwogCQkJY2FyZC0+dHhfYnVmZmVyWzQqZGVzY25yXSA9IDA7IC8qIGRlc2NyaXB0b3IgaXMgZnJlZSBhZ2FpbiAqLwogCQkJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKLQkJCWNhcmQtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCWRldi0+c3RhdHMudHhfcGFja2V0cysrOwogCQl9CiAKIAkJbGVhdmUoImludmVzdGlnYXRlX3dyaXRlX2Rlc2NyaXB0b3IiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bi5jIGIvZHJpdmVycy9uZXQvdHVuLmMKaW5kZXggNjlmOWEwZS4uZDdiODFlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVuLmMKKysrIGIvZHJpdmVycy9uZXQvdHVuLmMKQEAgLTIxMyw3ICsyMTMsNyBAQAogCiAvKiBOZXR3b3JrIGRldmljZSBwYXJ0IG9mIHRoZSBkcml2ZXIgKi8KIAotc3RhdGljIHVuc2lnbmVkIGludCB0dW5fbmV0X2lkOworc3RhdGljIGludCB0dW5fbmV0X2lkOwogc3RydWN0IHR1bl9uZXQgewogCXN0cnVjdCBsaXN0X2hlYWQgZGV2X2xpc3Q7CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHlwaG9vbi5jIGIvZHJpdmVycy9uZXQvdHlwaG9vbi5jCmluZGV4IDAwMDlmNGUuLjNhZjlhOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R5cGhvb24uYworKysgYi9kcml2ZXJzL25ldC90eXBob29uLmMKQEAgLTIyOTYsNiArMjI5NiwxOSBAQAogCXJldHVybiBtb2RlOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHR5cGhvb25fbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gdHlwaG9vbl9vcGVuLAorCS5uZG9fc3RvcAkJPSB0eXBob29uX2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdAkJPSB0eXBob29uX3N0YXJ0X3R4LAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0CT0gdHlwaG9vbl9zZXRfcnhfbW9kZSwKKwkubmRvX3R4X3RpbWVvdXQJCT0gdHlwaG9vbl90eF90aW1lb3V0LAorCS5uZG9fZ2V0X3N0YXRzCQk9IHR5cGhvb25fZ2V0X3N0YXRzLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gdHlwaG9vbl9zZXRfbWFjX2FkZHJlc3MsCisJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAorCS5uZG9fdmxhbl9yeF9yZWdpc3Rlcgk9IHR5cGhvb25fdmxhbl9yeF9yZWdpc3RlciwKK307CisKIHN0YXRpYyBpbnQgX19kZXZpbml0CiB0eXBob29uX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewpAQCAtMjQ5NSwxNiArMjUwOCw5IEBACiAJfQogCiAJLyogVGhlIGNoaXAtc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KLQlkZXYtPm9wZW4JCT0gdHlwaG9vbl9vcGVuOwotCWRldi0+aGFyZF9zdGFydF94bWl0CT0gdHlwaG9vbl9zdGFydF90eDsKLQlkZXYtPnN0b3AJCT0gdHlwaG9vbl9jbG9zZTsKLQlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdAk9IHR5cGhvb25fc2V0X3J4X21vZGU7Ci0JZGV2LT50eF90aW1lb3V0CQk9IHR5cGhvb25fdHhfdGltZW91dDsKKwlkZXYtPm5ldGRldl9vcHMJCT0gJnR5cGhvb25fbmV0ZGV2X29wczsKIAluZXRpZl9uYXBpX2FkZChkZXYsICZ0cC0+bmFwaSwgdHlwaG9vbl9wb2xsLCAxNik7CiAJZGV2LT53YXRjaGRvZ190aW1lbwk9IFRYX1RJTUVPVVQ7Ci0JZGV2LT5nZXRfc3RhdHMJCT0gdHlwaG9vbl9nZXRfc3RhdHM7Ci0JZGV2LT5zZXRfbWFjX2FkZHJlc3MJPSB0eXBob29uX3NldF9tYWNfYWRkcmVzczsKLQlkZXYtPnZsYW5fcnhfcmVnaXN0ZXIJPSB0eXBob29uX3ZsYW5fcnhfcmVnaXN0ZXI7CiAKIAlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmdHlwaG9vbl9ldGh0b29sX29wcyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9kbTk2MDEuYyBiL2RyaXZlcnMvbmV0L3VzYi9kbTk2MDEuYwppbmRleCBlZGQyNDRmLi41YjY3YmJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvZG05NjAxLmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL2RtOTYwMS5jCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvdXNiL3VzYm5ldC5oPgogCiAvKiBkYXRhc2hlZXQ6Ci0gaHR0cDovL3d3dy5kYXZpY29tLmNvbS50dy9iaWc1L2Rvd25sb2FkL0RhdGElMjBTaGVldC9ETTk2MDEtRFMtUDAxLTkzMDkxNC5wZGYKKyBodHRwOi8vcHRtMi5jYy51dHUuZmkvZnRwL25ldHdvcmsvY2FyZHMvRE05NjAxL0Zyb21fTkVUL0RNOTYwMS1EUy1QMDEtOTMwOTE0LnBkZgogKi8KIAogLyogY29udHJvbCByZXF1ZXN0cyAqLwpAQCAtMzk3LDE2ICszOTcsMjQgQEAKIAlkbV93cml0ZV9yZWdfYXN5bmMoZGV2LCBETV9SWF9DVFJMLCByeF9jdGwpOwogfQogCitzdGF0aWMgdm9pZCBfX2RtOTYwMV9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IHVzYm5ldCAqZGV2KQoreworCWRtX3dyaXRlX2FzeW5jKGRldiwgRE1fUEhZX0FERFIsIEVUSF9BTEVOLCBkZXYtPm5ldC0+ZGV2X2FkZHIpOworfQorCiBzdGF0aWMgaW50IGRtOTYwMV9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldCwgdm9pZCAqcCkKIHsKIAlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBwOwogCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldCk7CiAKLQlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoYWRkci0+c2FfZGF0YSkpCisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGFkZHItPnNhX2RhdGEpKSB7CisJCWRldl9lcnIoJm5ldC0+ZGV2LCAibm90IHNldHRpbmcgaW52YWxpZCBtYWMgYWRkcmVzcyAlcE1cbiIsCisJCQkJCQkJCWFkZHItPnNhX2RhdGEpOwogCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAltZW1jcHkobmV0LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgbmV0LT5hZGRyX2xlbik7Ci0JZG1fd3JpdGVfYXN5bmMoZGV2LCBETV9QSFlfQUREUiwgbmV0LT5hZGRyX2xlbiwgbmV0LT5kZXZfYWRkcik7CisJX19kbTk2MDFfc2V0X21hY19hZGRyZXNzKGRldik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQxNCw2ICs0MjIsNyBAQAogc3RhdGljIGludCBkbTk2MDFfYmluZChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewogCWludCByZXQ7CisJdTggbWFjW0VUSF9BTEVOXTsKIAogCXJldCA9IHVzYm5ldF9nZXRfZW5kcG9pbnRzKGRldiwgaW50Zik7CiAJaWYgKHJldCkKQEAgLTQzOCwxMiArNDQ3LDI0IEBACiAJdWRlbGF5KDIwKTsKIAogCS8qIHJlYWQgTUFDICovCi0JaWYgKGRtX3JlYWQoZGV2LCBETV9QSFlfQUREUiwgRVRIX0FMRU4sIGRldi0+bmV0LT5kZXZfYWRkcikgPCAwKSB7CisJaWYgKGRtX3JlYWQoZGV2LCBETV9QSFlfQUREUiwgRVRIX0FMRU4sIG1hYykgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgcmVhZGluZyBNQUMgYWRkcmVzc1xuIik7CiAJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gb3V0OwogCX0KIAorCS8qCisJICogT3ZlcndyaXRlIHRoZSBhdXRvLWdlbmVyYXRlZCBhZGRyZXNzIG9ubHkgd2l0aCBnb29kIG9uZXMuCisJICovCisJaWYgKGlzX3ZhbGlkX2V0aGVyX2FkZHIobWFjKSkKKwkJbWVtY3B5KGRldi0+bmV0LT5kZXZfYWRkciwgbWFjLCBFVEhfQUxFTik7CisJZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSJkbTk2MDE6IE5vIHZhbGlkIE1BQyBhZGRyZXNzIGluIEVFUFJPTSwgdXNpbmcgJXBNXG4iLAorCQkJZGV2LT5uZXQtPmRldl9hZGRyKTsKKwkJX19kbTk2MDFfc2V0X21hY19hZGRyZXNzKGRldik7CisJfQorCiAJLyogcG93ZXIgdXAgcGh5ICovCiAJZG1fd3JpdGVfcmVnKGRldiwgRE1fR1BSX0NUUkwsIDEpOwogCWRtX3dyaXRlX3JlZyhkZXYsIERNX0dQUl9EQVRBLCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9rYXdldGguYyBiL2RyaXZlcnMvbmV0L3VzYi9rYXdldGguYwppbmRleCAyZWUwMzRmLi43Y2IxMGEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2Iva2F3ZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL2thd2V0aC5jCkBAIC0yNTEsNyArMjUxLDYgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKIH07CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICBrYXdldGhfY29udHJvbAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yODMsOSArMjgyLDkgQEAKIAogCWRyLT5iUmVxdWVzdFR5cGU9IHJlcXVlc3R0eXBlOwogCWRyLT5iUmVxdWVzdCA9IHJlcXVlc3Q7Ci0JZHItPndWYWx1ZSA9IGNwdV90b19sZTE2cCgmdmFsdWUpOwotCWRyLT53SW5kZXggPSBjcHVfdG9fbGUxNnAoJmluZGV4KTsKLQlkci0+d0xlbmd0aCA9IGNwdV90b19sZTE2cCgmc2l6ZSk7CisJZHItPndWYWx1ZSA9IGNwdV90b19sZTE2KHZhbHVlKTsKKwlkci0+d0luZGV4ID0gY3B1X3RvX2xlMTYoaW5kZXgpOworCWRyLT53TGVuZ3RoID0gY3B1X3RvX2xlMTYoc2l6ZSk7CiAKIAlyZXR1cm4ga2F3ZXRoX2ludGVybmFsX2NvbnRyb2xfbXNnKGthd2V0aC0+ZGV2LAogCQkJCQlwaXBlLApAQCAtOTc1LDYgKzk3NCwxNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICBrYXdldGhfcHJvYmUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMga2F3ZXRoX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuID0JCQlrYXdldGhfb3BlbiwKKwkubmRvX3N0b3AgPQkJCWthd2V0aF9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQgPQkJa2F3ZXRoX3N0YXJ0X3htaXQsCisJLm5kb190eF90aW1lb3V0ID0JCWthd2V0aF90eF90aW1lb3V0LAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0Ja2F3ZXRoX3NldF9yeF9tb2RlLAorCS5uZG9fZ2V0X3N0YXRzID0JCWthd2V0aF9uZXRkZXZfc3RhdHMsCit9OworCiBzdGF0aWMgaW50IGthd2V0aF9wcm9iZSgKIAkJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCiAJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCAgICAgIC8qIGZyb20gaWRfdGFibGUgKi8KQEAgLTExNDcsMjIgKzExNTcsMTMgQEAKIAltZW1jcHkobmV0ZGV2LT5kZXZfYWRkciwgJmthd2V0aC0+Y29uZmlndXJhdGlvbi5od19hZGRyLAogICAgICAgICAgICAgICAgc2l6ZW9mKGthd2V0aC0+Y29uZmlndXJhdGlvbi5od19hZGRyKSk7CiAKLQluZXRkZXYtPm9wZW4gPSBrYXdldGhfb3BlbjsKLQluZXRkZXYtPnN0b3AgPSBrYXdldGhfY2xvc2U7Ci0KKwluZXRkZXYtPm5ldGRldl9vcHMgPSAma2F3ZXRoX25ldGRldl9vcHM7CiAJbmV0ZGV2LT53YXRjaGRvZ190aW1lbyA9IEtBV0VUSF9UWF9USU1FT1VUOwotCW5ldGRldi0+dHhfdGltZW91dCA9IGthd2V0aF90eF90aW1lb3V0OwotCi0JbmV0ZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBrYXdldGhfc3RhcnRfeG1pdDsKLQluZXRkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IGthd2V0aF9zZXRfcnhfbW9kZTsKLQluZXRkZXYtPmdldF9zdGF0cyA9IGthd2V0aF9uZXRkZXZfc3RhdHM7CiAJbmV0ZGV2LT5tdHUgPSBsZTE2X3RvX2NwdShrYXdldGgtPmNvbmZpZ3VyYXRpb24uc2VnbWVudF9zaXplKTsKIAlTRVRfRVRIVE9PTF9PUFMobmV0ZGV2LCAmb3BzKTsKIAogCS8qIGthd2V0aCBpcyB6ZXJvZWQgYXMgcGFydCBvZiBhbGxvY19uZXRkZXYgKi8KLQogCUlOSVRfREVMQVlFRF9XT1JLKCZrYXdldGgtPmxvd21lbV93b3JrLCBrYXdldGhfcmVzdWJtaXRfdGwpOwotCiAJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBrYXdldGgpOwogCiAjaWYgMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL3BlZ2FzdXMuYyBiL2RyaXZlcnMvbmV0L3VzYi9wZWdhc3VzLmMKaW5kZXggMTY2ODgwYy4uYTgyMjhkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL3BlZ2FzdXMuYworKysgYi9kcml2ZXJzL25ldC91c2IvcGVnYXN1cy5jCkBAIC05Myw2ICs5Myw3IEBACiBNT0RVTEVfUEFSTV9ERVNDIChtc2dfbGV2ZWwsICJPdmVycmlkZSBkZWZhdWx0IG1lc3NhZ2UgbGV2ZWwiKTsKIAogTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHBlZ2FzdXNfaWRzKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgcGVnYXN1c19uZXRkZXZfb3BzOwogCiBzdGF0aWMgaW50IHVwZGF0ZV9ldGhfcmVnc19hc3luYyhwZWdhc3VzX3QgKik7CiAvKiBBYXJnaCEhISBJIF9yZWFsbHlfIGhhdGUgc3VjaCB0d2Vha3MgKi8KQEAgLTE1MCw4ICsxNTEsOCBAQAogCXBlZ2FzdXMtPmRyLmJSZXF1ZXN0VHlwZSA9IFBFR0FTVVNfUkVRVF9SRUFEOwogCXBlZ2FzdXMtPmRyLmJSZXF1ZXN0ID0gUEVHQVNVU19SRVFfR0VUX1JFR1M7CiAJcGVnYXN1cy0+ZHIud1ZhbHVlID0gY3B1X3RvX2xlMTYoMCk7Ci0JcGVnYXN1cy0+ZHIud0luZGV4ID0gY3B1X3RvX2xlMTZwKCZpbmR4KTsKLQlwZWdhc3VzLT5kci53TGVuZ3RoID0gY3B1X3RvX2xlMTZwKCZzaXplKTsKKwlwZWdhc3VzLT5kci53SW5kZXggPSBjcHVfdG9fbGUxNihpbmR4KTsKKwlwZWdhc3VzLT5kci53TGVuZ3RoID0gY3B1X3RvX2xlMTYoc2l6ZSk7CiAJcGVnYXN1cy0+Y3RybF91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBzaXplOwogCiAJdXNiX2ZpbGxfY29udHJvbF91cmIocGVnYXN1cy0+Y3RybF91cmIsIHBlZ2FzdXMtPnVzYiwKQEAgLTIwOCw4ICsyMDksOCBAQAogCXBlZ2FzdXMtPmRyLmJSZXF1ZXN0VHlwZSA9IFBFR0FTVVNfUkVRVF9XUklURTsKIAlwZWdhc3VzLT5kci5iUmVxdWVzdCA9IFBFR0FTVVNfUkVRX1NFVF9SRUdTOwogCXBlZ2FzdXMtPmRyLndWYWx1ZSA9IGNwdV90b19sZTE2KDApOwotCXBlZ2FzdXMtPmRyLndJbmRleCA9IGNwdV90b19sZTE2cCgmaW5keCk7Ci0JcGVnYXN1cy0+ZHIud0xlbmd0aCA9IGNwdV90b19sZTE2cCgmc2l6ZSk7CisJcGVnYXN1cy0+ZHIud0luZGV4ID0gY3B1X3RvX2xlMTYoaW5keCk7CisJcGVnYXN1cy0+ZHIud0xlbmd0aCA9IGNwdV90b19sZTE2KHNpemUpOwogCXBlZ2FzdXMtPmN0cmxfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gc2l6ZTsKIAogCXVzYl9maWxsX2NvbnRyb2xfdXJiKHBlZ2FzdXMtPmN0cmxfdXJiLCBwZWdhc3VzLT51c2IsCkBAIC0yNjEsNyArMjYyLDcgQEAKIAlwZWdhc3VzLT5kci5iUmVxdWVzdFR5cGUgPSBQRUdBU1VTX1JFUVRfV1JJVEU7CiAJcGVnYXN1cy0+ZHIuYlJlcXVlc3QgPSBQRUdBU1VTX1JFUV9TRVRfUkVHOwogCXBlZ2FzdXMtPmRyLndWYWx1ZSA9IGNwdV90b19sZTE2KGRhdGEpOwotCXBlZ2FzdXMtPmRyLndJbmRleCA9IGNwdV90b19sZTE2cCgmaW5keCk7CisJcGVnYXN1cy0+ZHIud0luZGV4ID0gY3B1X3RvX2xlMTYoaW5keCk7CiAJcGVnYXN1cy0+ZHIud0xlbmd0aCA9IGNwdV90b19sZTE2KDEpOwogCXBlZ2FzdXMtPmN0cmxfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gMTsKIApAQCAtNDc2LDcgKzQ3Nyw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAJCXJlYWRfZXByb21fd29yZChwZWdhc3VzLCBpLCAmdzE2KTsKLQkJKChfX2xlMTYgKikgaWQpW2ldID0gY3B1X3RvX2xlMTZwKCZ3MTYpOworCQkoKF9fbGUxNiAqKSBpZClbaV0gPSBjcHVfdG9fbGUxNih3MTYpOwogCX0KIH0KIApAQCAtMTM2MCwxNCArMTM2MSwxMCBAQAogCXBlZ2FzdXMtPmludGYgPSBpbnRmOwogCXBlZ2FzdXMtPnVzYiA9IGRldjsKIAlwZWdhc3VzLT5uZXQgPSBuZXQ7Ci0JbmV0LT5vcGVuID0gcGVnYXN1c19vcGVuOwotCW5ldC0+c3RvcCA9IHBlZ2FzdXNfY2xvc2U7CisKKwogCW5ldC0+d2F0Y2hkb2dfdGltZW8gPSBQRUdBU1VTX1RYX1RJTUVPVVQ7Ci0JbmV0LT50eF90aW1lb3V0ID0gcGVnYXN1c190eF90aW1lb3V0OwotCW5ldC0+ZG9faW9jdGwgPSBwZWdhc3VzX2lvY3RsOwotCW5ldC0+aGFyZF9zdGFydF94bWl0ID0gcGVnYXN1c19zdGFydF94bWl0OwotCW5ldC0+c2V0X211bHRpY2FzdF9saXN0ID0gcGVnYXN1c19zZXRfbXVsdGljYXN0OwotCW5ldC0+Z2V0X3N0YXRzID0gcGVnYXN1c19uZXRkZXZfc3RhdHM7CisJbmV0LT5uZXRkZXZfb3BzID0gJnBlZ2FzdXNfbmV0ZGV2X29wczsKIAlTRVRfRVRIVE9PTF9PUFMobmV0LCAmb3BzKTsKIAlwZWdhc3VzLT5taWkuZGV2ID0gbmV0OwogCXBlZ2FzdXMtPm1paS5tZGlvX3JlYWQgPSBtZGlvX3JlYWQ7CkBAIC0xNDgyLDYgKzE0NzksMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBwZWdhc3VzX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuID0JCQlwZWdhc3VzX29wZW4sCisJLm5kb19zdG9wID0JCQlwZWdhc3VzX2Nsb3NlLAorCS5uZG9fZG9faW9jdGwgPQkJCXBlZ2FzdXNfaW9jdGwsCisJLm5kb19zdGFydF94bWl0ID0JCXBlZ2FzdXNfc3RhcnRfeG1pdCwKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9CXBlZ2FzdXNfc2V0X211bHRpY2FzdCwKKwkubmRvX2dldF9zdGF0cyA9CQlwZWdhc3VzX25ldGRldl9zdGF0cywKKwkubmRvX3R4X3RpbWVvdXQgPQkJcGVnYXN1c190eF90aW1lb3V0LAorfTsKKwogc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHBlZ2FzdXNfZHJpdmVyID0gewogCS5uYW1lID0gZHJpdmVyX25hbWUsCiAJLnByb2JlID0gcGVnYXN1c19wcm9iZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYyBiL2RyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYwppbmRleCBiNzAwNGZmLi40M2Y2NTIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvdmlydGlvX25ldC5jCkBAIC02MjQsNiArNjI0LDE4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgdmlydG5ldF9uZXRkZXYgPSB7CisJLm5kb19vcGVuICAgICAgICAgICAgPSB2aXJ0bmV0X29wZW4sCisJLm5kb19zdG9wICAgCSAgICAgPSB2aXJ0bmV0X2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdCAgICAgID0gc3RhcnRfeG1pdCwKKwkubmRvX3ZhbGlkYXRlX2FkZHIgICA9IGV0aF92YWxpZGF0ZV9hZGRyLAorCS5uZG9fc2V0X21hY19hZGRyZXNzID0gZXRoX21hY19hZGRyLAorCS5uZG9fY2hhbmdlX210dQkgICAgID0gdmlydG5ldF9jaGFuZ2VfbXR1LAorI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJLm5kb19wb2xsX2NvbnRyb2xsZXIgPSB2aXJ0bmV0X25ldHBvbGwsCisjZW5kaWYKK307CisKIHN0YXRpYyBpbnQgdmlydG5ldF9wcm9iZShzdHJ1Y3QgdmlydGlvX2RldmljZSAqdmRldikKIHsKIAlpbnQgZXJyOwpAQCAtNjM2LDE0ICs2NDgsOCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCS8qIFNldCB1cCBuZXR3b3JrIGRldmljZSBhcyBub3JtYWwuICovCi0JZGV2LT5vcGVuID0gdmlydG5ldF9vcGVuOwotCWRldi0+c3RvcCA9IHZpcnRuZXRfY2xvc2U7Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBzdGFydF94bWl0OwotCWRldi0+Y2hhbmdlX210dSA9IHZpcnRuZXRfY2hhbmdlX210dTsKKwlkZXYtPm5ldGRldl9vcHMgPSAmdmlydG5ldF9uZXRkZXY7CiAJZGV2LT5mZWF0dXJlcyA9IE5FVElGX0ZfSElHSERNQTsKLSNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgotCWRldi0+cG9sbF9jb250cm9sbGVyID0gdmlydG5ldF9uZXRwb2xsOwotI2VuZGlmCiAJU0VUX0VUSFRPT0xfT1BTKGRldiwgJnZpcnRuZXRfZXRodG9vbF9vcHMpOwogCVNFVF9ORVRERVZfREVWKGRldiwgJnZkZXYtPmRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L0tjb25maWcgYi9kcml2ZXJzL25ldC93aW1heC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NTAxOGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aW1heC9LY29uZmlnCkBAIC0wLDAgKzEsMTcgQEAKKyMKKyMgV2lNQVggTEFOIGRldmljZSBkcml2ZXJzIGNvbmZpZ3VyYXRpb24KKyMKKworCitjb21tZW50ICJFbmFibGUgV2lNQVggKE5ldHdvcmtpbmcgb3B0aW9ucykgdG8gc2VlIHRoZSBXaU1BWCBkcml2ZXJzIgorCWRlcGVuZHMgb24gV0lNQVggPSBuCisKK2lmIFdJTUFYCisKK21lbnUgIldpTUFYIFdpcmVsZXNzIEJyb2FkYmFuZCBkZXZpY2VzIgorCitzb3VyY2UgImRyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9LY29uZmlnIgorCitlbmRtZW51CisKK2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aW1heC9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3dpbWF4L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MmJjMDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aW1heC9NYWtlZmlsZQpAQCAtMCwwICsxLDUgQEAKKworb2JqLSQoQ09ORklHX1dJTUFYX0kyNDAwTSkJKz0gaTI0MDBtLworCisjIChmcm9tIFNhbSBSYXZuYm9yZykgZm9yY2Uga2J1aWxkIHRvIGNyZWF0ZSBidWlsdC1pbi5vCitvYmotIDo9IGR1bW15Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9LY29uZmlnIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYyM2IzZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9LY29uZmlnCkBAIC0wLDAgKzEsNDkgQEAKKworY29uZmlnIFdJTUFYX0kyNDAwTQorCXRyaXN0YXRlCisJZGVwZW5kcyBvbiBXSU1BWAorCXNlbGVjdCBGV19MT0FERVIKKworY29tbWVudCAiRW5hYmxlIFVTQiBzdXBwb3J0IHRvIHNlZSBXaU1BWCBVU0IgZHJpdmVycyIKKwlkZXBlbmRzIG9uIFVTQiA9IG4KKworY29tbWVudCAiRW5hYmxlIE1NQyBzdXBwb3J0IHRvIHNlZSBXaU1BWCBTRElPIGRyaXZlcnMiCisJZGVwZW5kcyBvbiBNTUMgPSBuCisKK2NvbmZpZyBXSU1BWF9JMjQwME1fVVNCCisJdHJpc3RhdGUgIkludGVsIFdpcmVsZXNzIFdpTUFYIENvbm5lY3Rpb24gMjQwMCBvdmVyIFVTQiAoaW5jbHVkaW5nIDV4NTApIgorCWRlcGVuZHMgb24gV0lNQVggJiYgVVNCCisJc2VsZWN0IFdJTUFYX0kyNDAwTQorCWhlbHAKKwkgIFNlbGVjdCBpZiB5b3UgaGF2ZSBhIGRldmljZSBiYXNlZCBvbiB0aGUgSW50ZWwgV2lNQVgKKwkgIENvbm5lY3Rpb24gMjQwMCBvdmVyIFVTQiAobGlrZSBhbnkgb2YgdGhlIEludGVsIFdpcmVsZXNzCisJICBXaU1BWC9XaUZpIExpbmsgNXg1MCBzZXJpZXMpLgorCisJICBJZiB1bnN1cmUsIGl0IGlzIHNhZmUgdG8gc2VsZWN0IE0gKG1vZHVsZSkuCisKK2NvbmZpZyBXSU1BWF9JMjQwME1fU0RJTworCXRyaXN0YXRlICJJbnRlbCBXaXJlbGVzcyBXaU1BWCBDb25uZWN0aW9uIDI0MDAgb3ZlciBTRElPIgorCWRlcGVuZHMgb24gV0lNQVggJiYgTU1DCisJc2VsZWN0IFdJTUFYX0kyNDAwTQorCWhlbHAKKwkgIFNlbGVjdCBpZiB5b3UgaGF2ZSBhIGRldmljZSBiYXNlZCBvbiB0aGUgSW50ZWwgV2lNQVgKKwkgIENvbm5lY3Rpb24gMjQwMCBvdmVyIFNESU8uCisKKwkgIElmIHVuc3VyZSwgaXQgaXMgc2FmZSB0byBzZWxlY3QgTSAobW9kdWxlKS4KKworY29uZmlnIFdJTUFYX0kyNDAwTV9ERUJVR19MRVZFTAorCWludCAiV2lNQVggaTI0MDBtIGRlYnVnIGxldmVsIgorCWRlcGVuZHMgb24gV0lNQVhfSTI0MDBNCisJZGVmYXVsdCA4CisJaGVscAorCisJICBTZWxlY3QgdGhlIG1heGltdW0gZGVidWcgdmVyYm9zaXR5IGxldmVsIHRvIGJlIGNvbXBpbGVkIGludG8KKwkgIHRoZSBXaU1BWCBpMjQwMG0gZHJpdmVyIGNvZGUuCisKKwkgIEJ5IGRlZmF1bHQsIHRoaXMgaXMgZGlzYWJsZWQgYXQgcnVudGltZSBhbmQgY2FuIGJlCisJICBzZWxlY3RpdmVseSBlbmFibGVkIGF0IHJ1bnRpbWUgZm9yIGRpZmZlcmVudCBwYXJ0cyBvZiB0aGUKKwkgIGNvZGUgdXNpbmcgdGhlIHN5c2ZzIGRlYnVnLWxldmVscyBmaWxlLgorCisJICBJZiBzZXQgYXQgemVybywgdGhpcyB3aWxsIGNvbXBpbGUgb3V0IGFsbCB0aGUgZGVidWcgY29kZS4KKworCSAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBpdCBpcyBsZWZ0IGF0IDguCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vTWFrZWZpbGUgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY5NmU5MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9NYWtlZmlsZQpAQCAtMCwwICsxLDI5IEBACisKK29iai0kKENPTkZJR19XSU1BWF9JMjQwME0pICs9IGkyNDAwbS5vCitvYmotJChDT05GSUdfV0lNQVhfSTI0MDBNX1VTQikgKz0gaTI0MDBtLXVzYi5vCitvYmotJChDT05GSUdfV0lNQVhfSTI0MDBNX1NESU8pICs9IGkyNDAwbS1zZGlvLm8KKworaTI0MDBtLXkgOj0JCVwKKwljb250cm9sLm8JXAorCWRyaXZlci5vCVwKKwlmdy5vCQlcCisJb3AtcmZraWxsLm8JXAorCW5ldGRldi5vCVwKKwl0eC5vCQlcCisJcngubworCitpMjQwMG0tJChDT05GSUdfREVCVUdfRlMpICs9IGRlYnVnZnMubworCitpMjQwMG0tdXNiLXkgOj0JCQlcCisJdXNiLWZ3Lm8JCVwKKwl1c2Itbm90aWYubwkJXAorCXVzYi10eC5vCQlcCisJdXNiLXJ4Lm8JCVwKKwl1c2IubworCisKK2kyNDAwbS1zZGlvLXkgOj0gCQlcCisJc2Rpby5vICAgICAgCQlcCisJc2Rpby10eC5vICAgCQlcCisJc2Rpby1mdy5vCSAJXAorCXNkaW8tcngubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL2NvbnRyb2wuYyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9jb250cm9sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNkMzdmZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9jb250cm9sLmMKQEAgLTAsMCArMSwxMjkxIEBACisvKgorICogSW50ZWwgV2lyZWxlc3MgV2lNQVggQ29ubmVjdGlvbiAyNDAwbQorICogTWlzY2VsbGFuZW91cyBjb250cm9sIGZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcgdGhlIGRldmljZQorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKgorICogSW50ZWwgQ29ycG9yYXRpb24gPGxpbnV4LXdpbWF4QGludGVsLmNvbT4KKyAqIEluYWt5IFBlcmV6LUdvbnphbGV6IDxpbmFreS5wZXJlei1nb256YWxlekBpbnRlbC5jb20+CisgKiAgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCisgKgorICogVGhpcyBpcyBhIGNvbGxlY3Rpb24gb2YgZnVuY3Rpb25zIHVzZWQgdG8gY29udHJvbCB0aGUgZGV2aWNlIChwbHVzCisgKiBhIGZldyBoZWxwZXJzKS4KKyAqCisgKiBUaGVyZSBhcmUgdXRpbGl0aWVzIGZvciBoYW5kbGluZyBUTFYgYnVmZmVycywgaG9va3Mgb24gdGhlIGRldmljZSdzCisgKiByZXBvcnRzIHRvIGFjdCBvbiBkZXZpY2UgY2hhbmdlcyBvZiBzdGF0ZSBbaTI0MDBtX3JlcG9ydF9ob29rKCldLAorICogb24gYWNrcyB0byBjb21tYW5kcyBbaTI0MDBtX21zZ19hY2tfaG9vaygpXSwgYSBoZWxwZXIgZm9yIHNlbmRpbmcKKyAqIGNvbW1hbmRzIHRvIHRoZSBkZXZpY2UgYW5kIGJsb2NraW5nIHVudGlsIGEgcmVwbHkgYXJyaXZlcworICogW2kyNDAwbV9tc2dfdG9fZGV2KCldLCBhIGZldyBoaWdoIGxldmVsIGNvbW1hbmRzIGZvciBtYW5pcHVsYXRpbmcKKyAqIHRoZSBkZXZpY2Ugc3RhdGUsIHBvd2Vyc3ZpbmcgbW9kZSBhbmQgY29uZmlndXJhdGlvbiBwbHVzIHRoZQorICogcm91dGluZXMgdG8gc2V0dXAgdGhlIGRldmljZSBvbmNlIGNvbW11bmljYXRpb24gaXMgc3RhYmxpc2hlZCB3aXRoCisgKiBpdCBbaTI0MDBtX2Rldl9pbml0aWFsaXplKCldLgorICoKKyAqIFJPQURNQVAKKyAqCisgKiBpMjQwMG1fZGV2X2luaXRhbGl6ZSgpICAgICAgIENhbGxlZCBieSBpMjQwMG1fZGV2X3N0YXJ0KCkKKyAqICAgaTI0MDBtX3NldF9pbml0X2NvbmZpZygpCisgKiAgIGkyNDAwbV9maXJtd2FyZV9jaGVjaygpCisgKiAgIGkyNDAwbV9jbWRfZ2V0X3N0YXRlKCkKKyAqIGkyNDAwbV9kZXZfc2h1dGRvd24oKSAgICAgICAgQ2FsbGVkIGJ5IGkyNDAwbV9kZXZfc3RvcCgpCisgKiAgIGkyNDAwbS0+YnVzX3Jlc2V0KCkKKyAqCisgKiBpMjQwMG1fe2NtZCxnZXQsc2V0fV8qKCkKKyAqICAgaTI0MDBtX21zZ190b19kZXYoKQorICogICBpMjQwMG1fbXNnX2NoZWNrX3N0YXR1cygpCisgKgorICogaTI0MDBtX3JlcG9ydF9ob29rKCkgICAgICAgICBDYWxsZWQgb24gcmVjZXB0aW9uIG9mIGFuIGV2ZW50CisgKiAgIGkyNDAwbV9yZXBvcnRfc3RhdGVfaG9vaygpCisgKiAgICAgaTI0MDBtX3Rsdl9idWZmZXJfd2FsaygpCisgKiAgICAgaTI0MDBtX3Rsdl9tYXRjaCgpCisgKiAgICAgaTI0MDBtX3JlcG9ydF90bHZfc3lzdGVtX3N0YXRlKCkKKyAqICAgICBpMjQwMG1fcmVwb3J0X3Rsdl9yZl9zd2l0Y2hlc19zdGF0dXMoKQorICogICAgIGkyNDAwbV9yZXBvcnRfdGx2X21lZGlhX3N0YXR1cygpCisgKiAgIGkyNDAwbV9jbWRfZW50ZXJfcG93ZXJzYXZlKCkKKyAqCisgKiBpMjQwMG1fbXNnX2Fja19ob29rKCkgICAgICAgIENhbGxlZCBvbiByZWNlcHRpb24gb2YgYSByZXBseSB0byBhCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQsIGdldCBvciBzZXQKKyAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSAiaTI0MDBtLmgiCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvd2ltYXgvaTI0MDBtLmg+CisKKworI2RlZmluZSBEX1NVQk1PRFVMRSBjb250cm9sCisjaW5jbHVkZSAiZGVidWctbGV2ZWxzLmgiCisKKworLyoKKyAqIFJldHVybiBpZiBhIFRMViBpcyBvZiBhIGdpdmUgdHlwZSBhbmQgc2l6ZQorICoKKyAqIEB0bHZfaGRyOiBwb2ludGVyIHRvIHRoZSBUTFYKKyAqIEB0bHZfdHlwZTogdHlwZSBvZiB0aGUgVExWIHdlIGFyZSBsb29raW5nIGZvcgorICogQHRsdl9zaXplOiBleHBlY3RlZCBzaXplIG9mIHRoZSBUTFYgd2UgYXJlIGxvb2tpbmcgZm9yIChpZiAtMSwKKyAqICAgICAgICAgICAgZG9uJ3QgY2hlY2sgdGhlIHNpemUpLiBUaGlzIGluY2x1ZGVzIHRoZSBoZWFkZXIKKyAqIFJldHVybnM6IDAgaWYgdGhlIFRMViBtYXRjaGVzCisgKiAgICAgICAgICA8IDAgaWYgaXQgZG9lc24ndCBtYXRjaCBhdCBhbGwKKyAqICAgICAgICAgID4gMCB0b3RhbCBUTFYgKyBwYXlsb2FkIHNpemUsIGlmIHRoZSB0eXBlIG1hdGNoZXMsIGJ1dCBub3QKKyAqICAgICAgICAgICAgICB0aGUgc2l6ZQorICovCitzdGF0aWMKK3NzaXplX3QgaTI0MDBtX3Rsdl9tYXRjaChjb25zdCBzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIgKnRsdiwKKwkJICAgICBlbnVtIGkyNDAwbV90bHYgdGx2X3R5cGUsIHNzaXplX3QgdGx2X3NpemUpCit7CisJaWYgKGxlMTZfdG9fY3B1KHRsdi0+dHlwZSkgIT0gdGx2X3R5cGUpCS8qIE5vdCBvdXIgdHlwZT8gc2tpcCAqLworCQlyZXR1cm4gLTE7CisJaWYgKHRsdl9zaXplICE9IC0xCisJICAgICYmIGxlMTZfdG9fY3B1KHRsdi0+bGVuZ3RoKSArIHNpemVvZigqdGx2KSAhPSB0bHZfc2l6ZSkgeworCQlzaXplX3Qgc2l6ZSA9IGxlMTZfdG9fY3B1KHRsdi0+bGVuZ3RoKSArIHNpemVvZigqdGx2KTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVzogdGx2IHR5cGUgMHgleCBtaXNtYXRjaGVkIGJlY2F1c2Ugb2YgIgorCQkgICAgICAgInNpemUgKGdvdCAlenUgdnMgJXp1IGV4cGVjdGVkKVxuIiwKKwkJICAgICAgIHRsdl90eXBlLCBzaXplLCB0bHZfc2l6ZSk7CisJCXJldHVybiBzaXplOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKgorICogR2l2ZW4gYSBidWZmZXIgb2YgVExWcywgaXRlcmF0ZSBvdmVyIHRoZW0KKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgaW5zdGFuY2UKKyAqIEB0bHZfYnVmOiBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIFRMViBidWZmZXIKKyAqIEBidWZfc2l6ZTogYnVmZmVyIHNpemUgaW4gYnl0ZXMKKyAqIEB0bHZfcG9zOiBzZWVrIHBvc2l0aW9uOyB0aGlzIGlzIGFzc3VtZWQgdG8gYmUgYSBwb2ludGVyIHJldHVybmVkCisgKiAgICAgICAgICAgYnkgaTI0MDBtX3Rsdl9idWZmZXJfd2FsaygpIFthbmQgdGh1cywgdmFsaWRhdGVkXS4gVGhlCisgKiAgICAgICAgICAgVExWIHJldHVybmVkIHdpbGwgYmUgdGhlIG9uZSBmb2xsb3dpbmcgdGhpcyBvbmUuCisgKgorICogVXNhZ2U6CisgKgorICogdGx2X2l0ciA9IE5VTEw7CisgKiB3aGlsZSAodGx2X2l0ciA9IGkyNDAwbV90bHZfYnVmZmVyX3dhbGsoaTI0MDBtLCBidWYsIHNpemUsIHRsdl9pdHIpKSAgeworICogICAgICAgICAuLi4KKyAqICAgICAgICAgLy8gRG8gc3R1ZmYgd2l0aCB0bHZfaXRyLCBET04nVCBNT0RJRlkgSVQKKyAqICAgICAgICAgLi4uCisgKiB9CisgKi8KK3N0YXRpYworY29uc3Qgc3RydWN0IGkyNDAwbV90bHZfaGRyICppMjQwMG1fdGx2X2J1ZmZlcl93YWxrKAorCXN0cnVjdCBpMjQwMG0gKmkyNDAwbSwKKwljb25zdCB2b2lkICp0bHZfYnVmLCBzaXplX3QgYnVmX3NpemUsCisJY29uc3Qgc3RydWN0IGkyNDAwbV90bHZfaGRyICp0bHZfcG9zKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwljb25zdCBzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIgKnRsdl90b3AgPSB0bHZfYnVmICsgYnVmX3NpemU7CisJc2l6ZV90IG9mZnNldCwgbGVuZ3RoLCBhdmFpbF9zaXplOworCXVuc2lnbmVkIHR5cGU7CisKKwlpZiAodGx2X3BvcyA9PSBOVUxMKQkvKiBUYWtlIHRoZSBmaXJzdCBvbmU/ICovCisJCXRsdl9wb3MgPSB0bHZfYnVmOworCWVsc2UJCQkvKiBOb3BlLCB0aGUgbmV4dCBvbmUgKi8KKwkJdGx2X3BvcyA9ICh2b2lkICopIHRsdl9wb3MKKwkJCSsgbGUxNl90b19jcHUodGx2X3Bvcy0+bGVuZ3RoKSArIHNpemVvZigqdGx2X3Bvcyk7CisJaWYgKHRsdl9wb3MgPT0gdGx2X3RvcCkgewkvKiBidWZmZXIgZG9uZSAqLworCQl0bHZfcG9zID0gTlVMTDsKKwkJZ290byBlcnJvcl9iZXlvbmRfZW5kOworCX0KKwlpZiAodGx2X3BvcyA+IHRsdl90b3ApIHsKKwkJdGx2X3BvcyA9IE5VTEw7CisJCVdBUk5fT04oMSk7CisJCWdvdG8gZXJyb3JfYmV5b25kX2VuZDsKKwl9CisJb2Zmc2V0ID0gKHZvaWQgKikgdGx2X3BvcyAtICh2b2lkICopIHRsdl9idWY7CisJYXZhaWxfc2l6ZSA9IGJ1Zl9zaXplIC0gb2Zmc2V0OworCWlmIChhdmFpbF9zaXplIDwgc2l6ZW9mKCp0bHZfcG9zKSkgeworCQlkZXZfZXJyKGRldiwgIkhXIEJVRz8gdGx2X2J1ZiAlcCBbJXp1IGJ5dGVzXSwgdGx2IEAlenU6ICIKKwkJCSJzaG9ydCBoZWFkZXJcbiIsIHRsdl9idWYsIGJ1Zl9zaXplLCBvZmZzZXQpOworCQlnb3RvIGVycm9yX3Nob3J0X2hlYWRlcjsKKwl9CisJdHlwZSA9IGxlMTZfdG9fY3B1KHRsdl9wb3MtPnR5cGUpOworCWxlbmd0aCA9IGxlMTZfdG9fY3B1KHRsdl9wb3MtPmxlbmd0aCk7CisJaWYgKGF2YWlsX3NpemUgPCBzaXplb2YoKnRsdl9wb3MpICsgbGVuZ3RoKSB7CisJCWRldl9lcnIoZGV2LCAiSFcgQlVHPyB0bHZfYnVmICVwIFslenUgYnl0ZXNdLCAiCisJCQkidGx2IHR5cGUgMHglMDR4IEAlenU6ICIKKwkJCSJzaG9ydCBkYXRhICglenUgYnl0ZXMgdnMgJXp1IG5lZWRlZClcbiIsCisJCQl0bHZfYnVmLCBidWZfc2l6ZSwgdHlwZSwgb2Zmc2V0LCBhdmFpbF9zaXplLAorCQkJc2l6ZW9mKCp0bHZfcG9zKSArIGxlbmd0aCk7CisJCWdvdG8gZXJyb3Jfc2hvcnRfaGVhZGVyOworCX0KK2Vycm9yX3Nob3J0X2hlYWRlcjoKK2Vycm9yX2JleW9uZF9lbmQ6CisJcmV0dXJuIHRsdl9wb3M7Cit9CisKKworLyoKKyAqIEZpbmQgYSBUTFYgaW4gYSBidWZmZXIgb2Ygc2VxdWVudGlhbCBUTFZzCisgKgorICogQGkyNDAwbTogZGV2aWNlIGRlc2NyaXB0b3IKKyAqIEB0bHZfaGRyOiBwb2ludGVyIHRvIHRoZSBmaXJzdCBUTFYgaW4gdGhlIHNlcXVlbmNlCisgKiBAc2l6ZTogc2l6ZSBvZiB0aGUgYnVmZmVyIGluIGJ5dGVzOyBhbGwgVExWcyBhcmUgYXNzdW1lZCB0byBmaXQKKyAqICAgICAgICBmdWxseSBpbiB0aGUgYnVmZmVyIChvdGhlcndpc2Ugd2UnbGwgY29tcGxhaW4pLgorICogQHRsdl90eXBlOiB0eXBlIG9mIHRoZSBUTFYgd2UgYXJlIGxvb2tpbmcgZm9yCisgKiBAdGx2X3NpemU6IGV4cGVjdGVkIHNpemUgb2YgdGhlIFRMViB3ZSBhcmUgbG9va2luZyBmb3IgKGlmIC0xLAorICogICAgICAgICAgICBkb24ndCBjaGVjayB0aGUgc2l6ZSkuIFRoaXMgaW5jbHVkZXMgdGhlIGhlYWRlcgorICoKKyAqIFJldHVybnM6IE5VTEwgaWYgdGhlIFRMViBpcyBub3QgZm91bmQsIG90aGVyd2lzZSBhIHBvaW50ZXIgdG8KKyAqICAgICAgICAgIGl0LiBJZiB0aGUgc2l6ZXMgZG9uJ3QgbWF0Y2gsIGFuIGVycm9yIGlzIHByaW50ZWQgYW5kIE5VTEwKKyAqICAgICAgICAgIHJldHVybmVkLgorICovCitzdGF0aWMKK2NvbnN0IHN0cnVjdCBpMjQwMG1fdGx2X2hkciAqaTI0MDBtX3Rsdl9maW5kKAorCXN0cnVjdCBpMjQwMG0gKmkyNDAwbSwKKwljb25zdCBzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIgKnRsdl9oZHIsIHNpemVfdCBzaXplLAorCWVudW0gaTI0MDBtX3RsdiB0bHZfdHlwZSwgc3NpemVfdCB0bHZfc2l6ZSkKK3sKKwlzc2l6ZV90IG1hdGNoOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwljb25zdCBzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIgKnRsdiA9IE5VTEw7CisJd2hpbGUgKCh0bHYgPSBpMjQwMG1fdGx2X2J1ZmZlcl93YWxrKGkyNDAwbSwgdGx2X2hkciwgc2l6ZSwgdGx2KSkpIHsKKwkJbWF0Y2ggPSBpMjQwMG1fdGx2X21hdGNoKHRsdiwgdGx2X3R5cGUsIHRsdl9zaXplKTsKKwkJaWYgKG1hdGNoID09IDApCQkvKiBmb3VuZCBpdCA6KSAqLworCQkJYnJlYWs7CisJCWlmIChtYXRjaCA+IDApCisJCQlkZXZfd2FybihkZXYsICJUTFYgdHlwZSAweCUwNHggZm91bmQgd2l0aCBzaXplICIKKwkJCQkgIm1pc21hdGNoICglenUgdnMgJXp1IG5lZWRlZClcbiIsCisJCQkJIHRsdl90eXBlLCBtYXRjaCwgdGx2X3NpemUpOworCX0KKwlyZXR1cm4gdGx2OworfQorCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QKK3sKKwljaGFyICptc2c7CisJaW50IGVycm5vOworfSBtc190b19lcnJub1tJMjQwME1fTVNfTUFYXSA9IHsKKwlbSTI0MDBNX01TX0RPTkVfT0tdID0geyAiIiwgMCB9LAorCVtJMjQwME1fTVNfRE9ORV9JTl9QUk9HUkVTU10gPSB7ICIiLCAwIH0sCisJW0kyNDAwTV9NU19JTlZBTElEX09QXSA9IHsgImludmFsaWQgb3Bjb2RlIiwgLUVOT1NZUyB9LAorCVtJMjQwME1fTVNfQkFEX1NUQVRFXSA9IHsgImludmFsaWQgc3RhdGUiLCAtRUlMU0VRIH0sCisJW0kyNDAwTV9NU19JTExFR0FMX1ZBTFVFXSA9IHsgImlsbGVnYWwgdmFsdWUiLCAtRUlOVkFMIH0sCisJW0kyNDAwTV9NU19NSVNTSU5HX1BBUkFNU10gPSB7ICJtaXNzaW5nIHBhcmFtZXRlcnMiLCAtRU5PTVNHIH0sCisJW0kyNDAwTV9NU19WRVJTSU9OX0VSUk9SXSA9IHsgImJhZCB2ZXJzaW9uIiwgLUVJTyB9LAorCVtJMjQwME1fTVNfQUNDRVNTSUJJTElUWV9FUlJPUl0gPSB7ICJhY2Nlc2liaWxpdHkgZXJyb3IiLCAtRUlPIH0sCisJW0kyNDAwTV9NU19CVVNZXSA9IHsgImJ1c3kiLCAtRUJVU1kgfSwKKwlbSTI0MDBNX01TX0NPUlJVUFRFRF9UTFZdID0geyAiY29ycnVwdGVkIFRMViIsIC1FSUxTRVEgfSwKKwlbSTI0MDBNX01TX1VOSU5JVElBTElaRURdID0geyAibm90IHVuaXRpYWxpemVkIiwgLUVJTFNFUSB9LAorCVtJMjQwME1fTVNfVU5LTk9XTl9FUlJPUl0gPSB7ICJ1bmtub3duIGVycm9yIiwgLUVJTyB9LAorCVtJMjQwME1fTVNfUFJPRFVDVElPTl9FUlJPUl0gPSB7ICJwcm9kdWN0aW9uIGVycm9yIiwgLUVJTyB9LAorCVtJMjQwME1fTVNfTk9fUkZdID0geyAibm8gUkYiLCAtRUlPIH0sCisJW0kyNDAwTV9NU19OT1RfUkVBRFlfRk9SX1BPV0VSU0FWRV0gPQorCQl7ICJub3QgcmVhZHkgZm9yIHBvd2Vyc2F2ZSIsIC1FQUNDRVMgfSwKKwlbSTI0MDBNX01TX1RIRVJNQUxfQ1JJVElDQUxdID0geyAidGhlcm1hbCBjcml0aWNhbCIsIC1FTDNITFQgfSwKK307CisKKworLyoKKyAqIGkyNDAwbV9tc2dfY2hlY2tfc3RhdHVzIC0gdHJhbnNsYXRlIGEgbWVzc2FnZSdzIHN0YXR1cyBjb2RlCisgKgorICogQGkyNDAwbTogZGV2aWNlIGRlc2NyaXB0b3IKKyAqIEBsM2w0X2hkcjogbWVzc2FnZSBoZWFkZXIKKyAqIEBzdHJidWY6IGJ1ZmZlciB0byBwbGFjZSBhIGZvcm1hdHRlZCBlcnJvciBtZXNzYWdlICh1bmxlc3MgTlVMTCkuCisgKiBAc3RyYnVmX3NpemU6IG1heCBhbW91bnQgb2YgYXZhaWxhYmxlIHNwYWNlOyBsYXJnZXIgbWVzc2FnZXMgd2lsbAorICogYmUgdHJ1bmNhdGVkLgorICoKKyAqIFJldHVybnM6IGVycm5vIGNvZGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3RhdHVzIGNvZGUgaW4gQGwzbDRfaGRyCisgKiAgICAgICAgICBhbmQgYSBtZXNzYWdlIGluIEBzdHJidWYgZGVzY3JpYmluZyB0aGUgZXJyb3IuCisgKi8KK2ludCBpMjQwMG1fbXNnX2NoZWNrX3N0YXR1cyhjb25zdCBzdHJ1Y3QgaTI0MDBtX2wzbDRfaGRyICpsM2w0X2hkciwKKwkJCSAgICBjaGFyICpzdHJidWYsIHNpemVfdCBzdHJidWZfc2l6ZSkKK3sKKwlpbnQgcmVzdWx0OworCWVudW0gaTI0MDBtX21zIHN0YXR1cyA9IGxlMTZfdG9fY3B1KGwzbDRfaGRyLT5zdGF0dXMpOworCWNvbnN0IGNoYXIgKnN0cjsKKworCWlmIChzdGF0dXMgPT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKHN0YXR1cyA+IEFSUkFZX1NJWkUobXNfdG9fZXJybm8pKSB7CisJCXN0ciA9ICJ1bmtub3duIHN0YXR1cyBjb2RlIjsKKwkJcmVzdWx0ID0gLUVCQURSOworCX0gZWxzZSB7CisJCXN0ciA9IG1zX3RvX2Vycm5vW3N0YXR1c10ubXNnOworCQlyZXN1bHQgPSBtc190b19lcnJub1tzdGF0dXNdLmVycm5vOworCX0KKwlpZiAoc3RyYnVmKQorCQlzbnByaW50ZihzdHJidWYsIHN0cmJ1Zl9zaXplLCAiJXMgKCVkKSIsIHN0ciwgc3RhdHVzKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKiBBY3Qgb24gYSBUTFYgU3lzdGVtIFN0YXRlIHJlcG9ydGVkIGJ5IHRoZSBkZXZpY2UKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcgorICogQHNzOiB2YWxpZGF0ZWQgU3lzdGVtIFN0YXRlIFRMVgorICovCitzdGF0aWMKK3ZvaWQgaTI0MDBtX3JlcG9ydF90bHZfc3lzdGVtX3N0YXRlKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwKKwkJCQkgICAgY29uc3Qgc3RydWN0IGkyNDAwbV90bHZfc3lzdGVtX3N0YXRlICpzcykKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2ID0gJmkyNDAwbS0+d2ltYXhfZGV2OworCWVudW0gaTI0MDBtX3N5c3RlbV9zdGF0ZSBpMjQwMG1fc3RhdGUgPSBsZTMyX3RvX2NwdShzcy0+c3RhdGUpOworCisJZF9mbnN0YXJ0KDMsIGRldiwgIihpMjQwMG0gJXAgc3MgJXAgWyV1XSlcbiIsIGkyNDAwbSwgc3MsIGkyNDAwbV9zdGF0ZSk7CisKKwlpZiAodW5saWtlbHkoaTI0MDBtLT5yZWFkeSA9PSAwKSkJLyogYWN0IGlmIHVwICovCisJCWdvdG8gb3V0OworCWlmIChpMjQwMG0tPnN0YXRlICE9IGkyNDAwbV9zdGF0ZSkgeworCQlpMjQwMG0tPnN0YXRlID0gaTI0MDBtX3N0YXRlOworCQl3YWtlX3VwX2FsbCgmaTI0MDBtLT5zdGF0ZV93cSk7CisJfQorCXN3aXRjaCAoaTI0MDBtX3N0YXRlKSB7CisJY2FzZSBJMjQwME1fU1NfVU5JTklUSUFMSVpFRDoKKwljYXNlIEkyNDAwTV9TU19JTklUOgorCWNhc2UgSTI0MDBNX1NTX0NPTkZJRzoKKwljYXNlIEkyNDAwTV9TU19QUk9EVUNUSU9OOgorCQl3aW1heF9zdGF0ZV9jaGFuZ2Uod2ltYXhfZGV2LCBXSU1BWF9TVF9VTklOSVRJQUxJWkVEKTsKKwkJYnJlYWs7CisKKwljYXNlIEkyNDAwTV9TU19SRl9PRkY6CisJY2FzZSBJMjQwME1fU1NfUkZfU0hVVERPV046CisJCXdpbWF4X3N0YXRlX2NoYW5nZSh3aW1heF9kZXYsIFdJTUFYX1NUX1JBRElPX09GRik7CisJCWJyZWFrOworCisJY2FzZSBJMjQwME1fU1NfUkVBRFk6CisJY2FzZSBJMjQwME1fU1NfU1RBTkRCWToKKwljYXNlIEkyNDAwTV9TU19TTEVFUEFDVElWRToKKwkJd2ltYXhfc3RhdGVfY2hhbmdlKHdpbWF4X2RldiwgV0lNQVhfU1RfUkVBRFkpOworCQlicmVhazsKKworCWNhc2UgSTI0MDBNX1NTX0NPTk5FQ1RJTkc6CisJY2FzZSBJMjQwME1fU1NfV0lNQVhfQ09OTkVDVEVEOgorCQl3aW1heF9zdGF0ZV9jaGFuZ2Uod2ltYXhfZGV2LCBXSU1BWF9TVF9SRUFEWSk7CisJCWJyZWFrOworCisJY2FzZSBJMjQwME1fU1NfU0NBTjoKKwljYXNlIEkyNDAwTV9TU19PVVRfT0ZfWk9ORToKKwkJd2ltYXhfc3RhdGVfY2hhbmdlKHdpbWF4X2RldiwgV0lNQVhfU1RfU0NBTk5JTkcpOworCQlicmVhazsKKworCWNhc2UgSTI0MDBNX1NTX0lETEU6CisJCWRfcHJpbnRmKDEsIGRldiwgImVudGVyaW5nIEJTLW5lZ290aWF0ZWQgaWRsZSBtb2RlXG4iKTsKKwljYXNlIEkyNDAwTV9TU19ESVNDT05ORUNUSU5HOgorCWNhc2UgSTI0MDBNX1NTX0RBVEFfUEFUSF9DT05ORUNURUQ6CisJCXdpbWF4X3N0YXRlX2NoYW5nZSh3aW1heF9kZXYsIFdJTUFYX1NUX0NPTk5FQ1RFRCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyogSHVoPyBqdXN0IGluIGNhc2UsIHNodXQgaXQgZG93biAqLworCQlkZXZfZXJyKGRldiwgIkhXIEJVRz8gdW5rbm93biBzdGF0ZSAldTogc2h1dHRpbmcgZG93blxuIiwKKwkJCWkyNDAwbV9zdGF0ZSk7CisJCWkyNDAwbS0+YnVzX3Jlc2V0KGkyNDAwbSwgSTI0MDBNX1JUX1dBUk0pOworCQlicmVhazsKKwl9Oworb3V0OgorCWRfZm5lbmQoMywgZGV2LCAiKGkyNDAwbSAlcCBzcyAlcCBbJXVdKSA9IHZvaWRcbiIsCisJCWkyNDAwbSwgc3MsIGkyNDAwbV9zdGF0ZSk7Cit9CisKKworLyoKKyAqIFBhcnNlIGFuZCBhY3Qgb24gYSBUTFYgTWVkaWEgU3RhdHVzIHNlbnQgYnkgdGhlIGRldmljZQorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKiBAbXM6IHZhbGlkYXRlZCBNZWRpYSBTdGF0dXMgVExWCisgKgorICogVGhpcyB3aWxsIHNldCB0aGUgY2FycmllciB1cCBvbiBkb3duIGJhc2VkIG9uIHRoZSBkZXZpY2UncyBsaW5rCisgKiByZXBvcnQuIFRoaXMgaXMgZG9uZSBhc2lkZXMgb2Ygd2hhdCB0aGUgV2lNQVggc3RhY2sgZG9lcyBiYXNlZCBvbgorICogdGhlIGRldmljZSdzIHN0YXRlIGFzIHNvbWV0aW1lcyB3ZSBuZWVkIHRvIGRvIGEgbGluay1yZW5ldyAodGhlIEJTCisgKiB3YW50cyB1cyB0byByZW5ldyBhIERIQ1AgbGVhc2UsIGZvciBleGFtcGxlKS4KKyAqCisgKiBJbiBmYWN0LCBkb2Mgc2F5cyB0aGF0IGV2ZXJ5dGltZSB3ZSBnZXQgYSBsaW5rLXVwLCB3ZSBzaG91bGQgZG8gYQorICogREhDUCBuZWdvdGlhdGlvbi4uLgorICovCitzdGF0aWMKK3ZvaWQgaTI0MDBtX3JlcG9ydF90bHZfbWVkaWFfc3RhdHVzKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwKKwkJCQkgICAgY29uc3Qgc3RydWN0IGkyNDAwbV90bHZfbWVkaWFfc3RhdHVzICptcykKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2ID0gJmkyNDAwbS0+d2ltYXhfZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gd2ltYXhfZGV2LT5uZXRfZGV2OworCWVudW0gaTI0MDBtX21lZGlhX3N0YXR1cyBzdGF0dXMgPSBsZTMyX3RvX2NwdShtcy0+bWVkaWFfc3RhdHVzKTsKKworCWRfZm5zdGFydCgzLCBkZXYsICIoaTI0MDBtICVwIG1zICVwIFsldV0pXG4iLCBpMjQwMG0sIG1zLCBzdGF0dXMpOworCisJaWYgKHVubGlrZWx5KGkyNDAwbS0+cmVhZHkgPT0gMCkpCS8qIGFjdCBpZiB1cCAqLworCQlnb3RvIG91dDsKKwlzd2l0Y2ggKHN0YXR1cykgeworCWNhc2UgSTI0MDBNX01FRElBX1NUQVRVU19MSU5LX1VQOgorCQluZXRpZl9jYXJyaWVyX29uKG5ldF9kZXYpOworCQlicmVhazsKKwljYXNlIEkyNDAwTV9NRURJQV9TVEFUVVNfTElOS19ET1dOOgorCQluZXRpZl9jYXJyaWVyX29mZihuZXRfZGV2KTsKKwkJYnJlYWs7CisJLyoKKwkgKiBUaGlzIGlzIHRoZSBuZXR3b3JrIHRlbGxpbmcgdXMgd2UgbmVlZCB0byByZXRyYWluIHRoZSBESENQCisJICogbGVhc2UgLS0gc28gZmFyLCB3ZSBhcmUgdHJ1c3RpbmcgdGhlIFdpTUFYIE5ldHdvcmsgU2VydmljZQorCSAqIGluIHVzZXIgc3BhY2UgdG8gcGljayB0aGlzIHVwIGFuZCBwb2tlIHRoZSBESENQIGNsaWVudC4KKwkgKi8KKwljYXNlIEkyNDAwTV9NRURJQV9TVEFUVVNfTElOS19SRU5FVzoKKwkJbmV0aWZfY2Fycmllcl9vbihuZXRfZGV2KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihkZXYsICJIVyBCVUc/IHVua25vd24gbWVkaWEgc3RhdHVzICV1XG4iLAorCQkJc3RhdHVzKTsKKwl9Oworb3V0OgorCWRfZm5lbmQoMywgZGV2LCAiKGkyNDAwbSAlcCBtcyAlcCBbJXVdKSA9IHZvaWRcbiIsCisJCWkyNDAwbSwgbXMsIHN0YXR1cyk7Cit9CisKKworLyoKKyAqIFBhcnNlIGEgJ3N0YXRlIHJlcG9ydCcgYW5kIGV4dHJhY3QgY2FycmllciBvbi9vZmYgaW5mb3JtYXRpb24KKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcgorICogQGwzbDRfaGRyOiBwb2ludGVyIHRvIG1lc3NhZ2U7IGl0IGhhcyBiZWVuIGFscmVhZHkgdmFsaWRhdGVkIGZvcgorICogICAgICAgICAgICBjb25zaXN0ZW50IHNpemUuCisgKiBAc2l6ZTogc2l6ZSBvZiB0aGUgbWVzc2FnZSAoaGVhZGVyICsgcGF5bG9hZCkuIFRoZSBoZWFkZXIgbGVuZ3RoCisgKiAgICAgICAgZGVjbGFyYXRpb24gaXMgYXNzdW1lZCB0byBiZSBjb25ncnVlbnQgd2l0aCBAc2l6ZSAoYXMgaW4KKyAqICAgICAgICBzaXplb2YoKmwzbDRfaGRyKSArIGwzbDRfaGRyLT5sZW5ndGggPT0gc2l6ZSkKKyAqCisgKiBFeHRyYWN0IGZyb20gdGhlIHJlcG9ydCBzdGF0ZSB0aGUgc3lzdGVtIHN0YXRlIFRMViBhbmQgaW5mZXIgZnJvbQorICogdGhlcmUgaWYgd2UgaGF2ZSBhIGNhcnJpZXIgb3Igbm90LiBVcGRhdGUgb3VyIGxvY2FsIHN0YXRlIGFuZCB0ZWxsCisgKiBuZXRkZXYuCisgKgorICogV2hlbiBzZXR0aW5nIHRoZSBjYXJyaWVyLCBpdCdzIGZpbmUgdG8gc2V0IE9GRiB0d2ljZSAoZm9yIGV4YW1wbGUpLAorICogYXMgbmV0aWZfY2Fycmllcl9vZmYoKSB3aWxsIG5vdCBnZW5lcmF0ZSB0d28gT0ZGIGV2ZW50cyAoanVzdCBvbgorICogdGhlIHRyYW5zaXRpb25zKS4KKyAqLworc3RhdGljCit2b2lkIGkyNDAwbV9yZXBvcnRfc3RhdGVfaG9vayhzdHJ1Y3QgaTI0MDBtICppMjQwMG0sCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgaTI0MDBtX2wzbDRfaGRyICpsM2w0X2hkciwKKwkJCSAgICAgIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICp0YWcpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCWNvbnN0IHN0cnVjdCBpMjQwMG1fdGx2X2hkciAqdGx2OworCWNvbnN0IHN0cnVjdCBpMjQwMG1fdGx2X3N5c3RlbV9zdGF0ZSAqc3M7CisJY29uc3Qgc3RydWN0IGkyNDAwbV90bHZfcmZfc3dpdGNoZXNfc3RhdHVzICpyZnNzOworCWNvbnN0IHN0cnVjdCBpMjQwMG1fdGx2X21lZGlhX3N0YXR1cyAqbXM7CisJc2l6ZV90IHRsdl9zaXplID0gbGUxNl90b19jcHUobDNsNF9oZHItPmxlbmd0aCk7CisKKwlkX2Zuc3RhcnQoNCwgZGV2LCAiKGkyNDAwbSAlcCwgbDNsNF9oZHIgJXAsIHNpemUgJXp1LCAlcylcbiIsCisJCSAgaTI0MDBtLCBsM2w0X2hkciwgc2l6ZSwgdGFnKTsKKwl0bHYgPSBOVUxMOworCisJd2hpbGUgKCh0bHYgPSBpMjQwMG1fdGx2X2J1ZmZlcl93YWxrKGkyNDAwbSwgJmwzbDRfaGRyLT5wbCwKKwkJCQkJICAgICB0bHZfc2l6ZSwgdGx2KSkpIHsKKwkJaWYgKDAgPT0gaTI0MDBtX3Rsdl9tYXRjaCh0bHYsIEkyNDAwTV9UTFZfU1lTVEVNX1NUQVRFLAorCQkJCQkgIHNpemVvZigqc3MpKSkgeworCQkJc3MgPSBjb250YWluZXJfb2YodGx2LCB0eXBlb2YoKnNzKSwgaGRyKTsKKwkJCWRfcHJpbnRmKDIsIGRldiwgIiVzOiBzeXN0ZW0gc3RhdGUgVExWICIKKwkJCQkgImZvdW5kICgweCUwNHgpLCBzdGF0ZSAweCUwOHhcbiIsCisJCQkJIHRhZywgSTI0MDBNX1RMVl9TWVNURU1fU1RBVEUsCisJCQkJIGxlMzJfdG9fY3B1KHNzLT5zdGF0ZSkpOworCQkJaTI0MDBtX3JlcG9ydF90bHZfc3lzdGVtX3N0YXRlKGkyNDAwbSwgc3MpOworCQl9CisJCWlmICgwID09IGkyNDAwbV90bHZfbWF0Y2godGx2LCBJMjQwME1fVExWX1JGX1NUQVRVUywKKwkJCQkJICBzaXplb2YoKnJmc3MpKSkgeworCQkJcmZzcyA9IGNvbnRhaW5lcl9vZih0bHYsIHR5cGVvZigqcmZzcyksIGhkcik7CisJCQlkX3ByaW50ZigyLCBkZXYsICIlczogUkYgc3RhdHVzIFRMViAiCisJCQkJICJmb3VuZCAoMHglMDR4KSwgc3cgMHglMDJ4IGh3IDB4JTAyeFxuIiwKKwkJCQkgdGFnLCBJMjQwME1fVExWX1JGX1NUQVRVUywKKwkJCQkgbGUzMl90b19jcHUocmZzcy0+c3dfcmZfc3dpdGNoKSwKKwkJCQkgbGUzMl90b19jcHUocmZzcy0+aHdfcmZfc3dpdGNoKSk7CisJCQlpMjQwMG1fcmVwb3J0X3Rsdl9yZl9zd2l0Y2hlc19zdGF0dXMoaTI0MDBtLCByZnNzKTsKKwkJfQorCQlpZiAoMCA9PSBpMjQwMG1fdGx2X21hdGNoKHRsdiwgSTI0MDBNX1RMVl9NRURJQV9TVEFUVVMsCisJCQkJCSAgc2l6ZW9mKCptcykpKSB7CisJCQltcyA9IGNvbnRhaW5lcl9vZih0bHYsIHR5cGVvZigqbXMpLCBoZHIpOworCQkJZF9wcmludGYoMiwgZGV2LCAiJXM6IE1lZGlhIFN0YXR1cyBUTFY6ICV1XG4iLAorCQkJCSB0YWcsIGxlMzJfdG9fY3B1KG1zLT5tZWRpYV9zdGF0dXMpKTsKKwkJCWkyNDAwbV9yZXBvcnRfdGx2X21lZGlhX3N0YXR1cyhpMjQwMG0sIG1zKTsKKwkJfQorCX0KKwlkX2ZuZW5kKDQsIGRldiwgIihpMjQwMG0gJXAsIGwzbDRfaGRyICVwLCBzaXplICV6dSwgJXMpID0gdm9pZFxuIiwKKwkJaTI0MDBtLCBsM2w0X2hkciwgc2l6ZSwgdGFnKTsKK30KKworCisvKgorICogaTI0MDBtX3JlcG9ydF9ob29rIC0gKG1heWJlKSBhY3Qgb24gYSByZXBvcnQKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcgorICogQGwzbDRfaGRyOiBwb2ludGVyIHRvIG1lc3NhZ2U7IGl0IGhhcyBiZWVuIGFscmVhZHkgdmFsaWRhdGVkIGZvcgorICogICAgICAgICAgICBjb25zaXN0ZW50IHNpemUuCisgKiBAc2l6ZTogc2l6ZSBvZiB0aGUgbWVzc2FnZSAoaGVhZGVyICsgcGF5bG9hZCkuIFRoZSBoZWFkZXIgbGVuZ3RoCisgKiAgICAgICAgZGVjbGFyYXRpb24gaXMgYXNzdW1lZCB0byBiZSBjb25ncnVlbnQgd2l0aCBAc2l6ZSAoYXMgaW4KKyAqICAgICAgICBzaXplb2YoKmwzbDRfaGRyKSArIGwzbDRfaGRyLT5sZW5ndGggPT0gc2l6ZSkKKyAqCisgKiBFeHRyYWN0IGluZm9ybWF0aW9uIHdlIG1pZ2h0IG5lZWQgKGxpa2UgY2FycmllbiBvbi9vZmYpIGZyb20gYQorICogZGV2aWNlIHJlcG9ydC4KKyAqLwordm9pZCBpMjQwMG1fcmVwb3J0X2hvb2soc3RydWN0IGkyNDAwbSAqaTI0MDBtLAorCQkJY29uc3Qgc3RydWN0IGkyNDAwbV9sM2w0X2hkciAqbDNsNF9oZHIsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwl1bnNpZ25lZCBtc2dfdHlwZTsKKworCWRfZm5zdGFydCgzLCBkZXYsICIoaTI0MDBtICVwIGwzbDRfaGRyICVwIHNpemUgJXp1KVxuIiwKKwkJICBpMjQwMG0sIGwzbDRfaGRyLCBzaXplKTsKKwkvKiBDaGV3IG9uIHRoZSBtZXNzYWdlLCB3ZSBtaWdodCBuZWVkIHNvbWUgaW5mb3JtYXRpb24gZnJvbQorCSAqIGhlcmUgKi8KKwltc2dfdHlwZSA9IGxlMTZfdG9fY3B1KGwzbDRfaGRyLT50eXBlKTsKKwlzd2l0Y2ggKG1zZ190eXBlKSB7CisJY2FzZSBJMjQwME1fTVRfUkVQT1JUX1NUQVRFOgkvKiBjYXJyaWVyIGRldGVjdGlvbi4uLiAqLworCQlpMjQwMG1fcmVwb3J0X3N0YXRlX2hvb2soaTI0MDBtLAorCQkJCQkgbDNsNF9oZHIsIHNpemUsICJSRVBPUlQgU1RBVEUiKTsKKwkJYnJlYWs7CisJLyogSWYgdGhlIGRldmljZSBpcyByZWFkeSBmb3IgcG93ZXIgc2F2ZSwgdGhlbiBhc2sgaXQgdG8gZG8KKwkgKiBpdC4gKi8KKwljYXNlIEkyNDAwTV9NVF9SRVBPUlRfUE9XRVJTQVZFX1JFQURZOgkvKiB6enp6eiAqLworCQlpZiAobDNsNF9oZHItPnN0YXR1cyA9PSBjcHVfdG9fbGUxNihJMjQwME1fTVNfRE9ORV9PSykpIHsKKwkJCWRfcHJpbnRmKDEsIGRldiwgInJlYWR5IGZvciBwb3dlcnNhdmUsIHJlcXVlc3RpbmdcbiIpOworCQkJaTI0MDBtX2NtZF9lbnRlcl9wb3dlcnNhdmUoaTI0MDBtKTsKKwkJfQorCQlicmVhazsKKwl9OworCWRfZm5lbmQoMywgZGV2LCAiKGkyNDAwbSAlcCBsM2w0X2hkciAlcCBzaXplICV6dSkgPSB2b2lkXG4iLAorCQlpMjQwMG0sIGwzbDRfaGRyLCBzaXplKTsKK30KKworCisvKgorICogaTI0MDBtX21zZ19hY2tfaG9vayAtIHByb2Nlc3MgY21kL3NldC9nZXQgYWNrIGZvciBpbnRlcm5hbCBzdGF0dXMKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcgorICogQGwzbDRfaGRyOiBwb2ludGVyIHRvIG1lc3NhZ2U7IGl0IGhhcyBiZWVuIGFscmVhZHkgdmFsaWRhdGVkIGZvcgorICogICAgICAgICAgICBjb25zaXN0ZW50IHNpemUuCisgKiBAc2l6ZTogc2l6ZSBvZiB0aGUgbWVzc2FnZQorICoKKyAqIEV4dHJhY3QgaW5mb3JtYXRpb24gd2UgbWlnaHQgbmVlZCBmcm9tIGFja3MgdG8gY29tbWFuZHMgYW5kIGFjdCBvbgorICogaXQuIFRoaXMgaXMgYWtpbiB0byBpMjQwMG1fcmVwb3J0X2hvb2soKS4gTm90ZSBtb3N0IG9mIHRoaXMKKyAqIHByb2Nlc3Npbmcgc2hvdWxkIGJlIGRvbmUgaW4gdGhlIGZ1bmN0aW9uIHRoYXQgY2FsbHMgdGhlCisgKiBjb21tYW5kLiBUaGlzIGlzIGhlcmUgZm9yIHNvbWUgY2FzZXMgd2hlcmUgaXQgY2FuJ3QgaGFwcGVuLi4uCisgKi8KK3ZvaWQgaTI0MDBtX21zZ19hY2tfaG9vayhzdHJ1Y3QgaTI0MDBtICppMjQwMG0sCisJCQkgY29uc3Qgc3RydWN0IGkyNDAwbV9sM2w0X2hkciAqbDNsNF9oZHIsIHNpemVfdCBzaXplKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXVuc2lnbmVkIGFja190eXBlLCBhY2tfc3RhdHVzOworCWNoYXIgc3RyZXJyWzMyXTsKKworCS8qIENoZXcgb24gdGhlIG1lc3NhZ2UsIHdlIG1pZ2h0IG5lZWQgc29tZSBpbmZvcm1hdGlvbiBmcm9tCisJICogaGVyZSAqLworCWFja190eXBlID0gbGUxNl90b19jcHUobDNsNF9oZHItPnR5cGUpOworCWFja19zdGF0dXMgPSBsZTE2X3RvX2NwdShsM2w0X2hkci0+c3RhdHVzKTsKKwlzd2l0Y2ggKGFja190eXBlKSB7CisJY2FzZSBJMjQwME1fTVRfQ01EX0VOVEVSX1BPV0VSU0FWRToKKwkJLyogVGhpcyBpcyBqdXN0IGxlZnQgaGVyZSBmb3IgdGhlIHNha2Ugb2YgZXhhbXBsZSwgYXMKKwkJICogdGhlIHByb2Nlc3NpbmcgaXMgZG9uZSBzb21ld2hlcmUgZWxzZS4gKi8KKwkJaWYgKDApIHsKKwkJCXJlc3VsdCA9IGkyNDAwbV9tc2dfY2hlY2tfc3RhdHVzKAorCQkJCWwzbDRfaGRyLCBzdHJlcnIsIHNpemVvZihzdHJlcnIpKTsKKwkJCWlmIChyZXN1bHQgPj0gMCkKKwkJCQlkX3ByaW50ZigxLCBkZXYsICJyZWFkeSBmb3IgcG93ZXIgc2F2ZTogJXpkXG4iLAorCQkJCQkgc2l6ZSk7CisJCX0KKwkJYnJlYWs7CisJfTsKKwlyZXR1cm47Cit9CisKKworLyoKKyAqIGkyNDAwbV9tc2dfc2l6ZV9jaGVjaygpIC0gdmVyaWZ5IG1lc3NhZ2Ugc2l6ZSBhbmQgaGVhZGVyIGFyZSBjb25ncnVlbnQKKyAqCisgKiBJdCBpcyBvayBpZiB0aGUgdG90YWwgbWVzc2FnZSBzaXplIGlzIGxhcmdlciB0aGFuIHRoZSBleHBlY3RlZAorICogc2l6ZSwgYXMgdGhlcmUgY2FuIGJlIHBhZGRpbmcuCisgKi8KK2ludCBpMjQwMG1fbXNnX3NpemVfY2hlY2soc3RydWN0IGkyNDAwbSAqaTI0MDBtLAorCQkJICBjb25zdCBzdHJ1Y3QgaTI0MDBtX2wzbDRfaGRyICpsM2w0X2hkciwKKwkJCSAgc2l6ZV90IG1zZ19zaXplKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXNpemVfdCBleHBlY3RlZF9zaXplOworCWRfZm5zdGFydCg0LCBkZXYsICIoaTI0MDBtICVwIGwzbDRfaGRyICVwIG1zZ19zaXplICV6dSlcbiIsCisJCSAgaTI0MDBtLCBsM2w0X2hkciwgbXNnX3NpemUpOworCWlmIChtc2dfc2l6ZSA8IHNpemVvZigqbDNsNF9oZHIpKSB7CisJCWRldl9lcnIoZGV2LCAiYmFkIHNpemUgZm9yIG1lc3NhZ2UgaGVhZGVyICIKKwkJCSIoZXhwZWN0ZWQgYXQgbGVhc3QgJXp1LCBnb3QgJXp1KVxuIiwKKwkJCShzaXplX3QpIHNpemVvZigqbDNsNF9oZHIpLCBtc2dfc2l6ZSk7CisJCXJlc3VsdCA9IC1FSU87CisJCWdvdG8gZXJyb3JfaGRyX3NpemU7CisJfQorCWV4cGVjdGVkX3NpemUgPSBsZTE2X3RvX2NwdShsM2w0X2hkci0+bGVuZ3RoKSArIHNpemVvZigqbDNsNF9oZHIpOworCWlmIChtc2dfc2l6ZSA8IGV4cGVjdGVkX3NpemUpIHsKKwkJZGV2X2VycihkZXYsICJiYWQgc2l6ZSBmb3IgbWVzc2FnZSBjb2RlIDB4JTA0eCAoZXhwZWN0ZWQgJXp1LCAiCisJCQkiZ290ICV6dSlcbiIsIGxlMTZfdG9fY3B1KGwzbDRfaGRyLT50eXBlKSwKKwkJCWV4cGVjdGVkX3NpemUsIG1zZ19zaXplKTsKKwkJcmVzdWx0ID0gLUVJTzsKKwl9IGVsc2UKKwkJcmVzdWx0ID0gMDsKK2Vycm9yX2hkcl9zaXplOgorCWRfZm5lbmQoNCwgZGV2LAorCQkiKGkyNDAwbSAlcCBsM2w0X2hkciAlcCBtc2dfc2l6ZSAlenUpID0gJWRcbiIsCisJCWkyNDAwbSwgbDNsNF9oZHIsIG1zZ19zaXplLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKworCisvKgorICogQ2FuY2VsIGEgd2FpdCBmb3IgYSBjb21tYW5kIEFDSworICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKiBAY29kZTogW25lZ2F0aXZlXSBlcnJubyBjb2RlIHRvIGNhbmNlbCB3aXRoIChkb24ndCB1c2UKKyAqICAgICAtRUlOUFJPR1JFU1MpCisgKgorICogSWYgdGhlcmUgaXMgYW4gYWNrIGFscmVhZHkgZmlsbGVkIG91dCwgZnJlZSBpdC4KKyAqLwordm9pZCBpMjQwMG1fbXNnX3RvX2Rldl9jYW5jZWxfd2FpdChzdHJ1Y3QgaTI0MDBtICppMjQwMG0sIGludCBjb2RlKQoreworCXN0cnVjdCBza19idWZmICphY2tfc2tiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTI0MDBtLT5yeF9sb2NrLCBmbGFncyk7CisJYWNrX3NrYiA9IGkyNDAwbS0+YWNrX3NrYjsKKwlpZiAoYWNrX3NrYiAmJiAhSVNfRVJSKGFja19za2IpKQorCQlrZnJlZShhY2tfc2tiKTsKKwlpMjQwMG0tPmFja19za2IgPSBFUlJfUFRSKGNvZGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmkyNDAwbS0+cnhfbG9jaywgZmxhZ3MpOworfQorCisKKy8qKgorICogaTI0MDBtX21zZ190b19kZXYgLSBTZW5kIGEgY29udHJvbCBtZXNzYWdlIHRvIHRoZSBkZXZpY2UgYW5kIGdldCBhIHJlc3BvbnNlCisgKgorICogQGkyNDAwbTogZGV2aWNlIGRlc2NyaXB0b3IKKyAqCisgKiBAbXNnX3NrYjogYW4gc2tiICAqCisgKgorICogQGJ1ZjogcG9pbnRlciB0byB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIG1lc3NhZ2UgdG8gYmUgc2VudDsgaXQKKyAqICAgICAgICAgICBoYXMgdG8gc3RhcnQgd2l0aCBhICZzdHJ1Y3QgaTI0MDBNX2wzbDRfaGRyIGFuZCB0aGVuCisgKiAgICAgICAgICAgZm9sbG93ZWQgYnkgdGhlIHBheWxvYWQuIE9uY2UgdGhpcyBmdW5jdGlvbiByZXR1cm5zLCB0aGUKKyAqICAgICAgICAgICBidWZmZXIgY2FuIGJlIHJldXNlZC4KKyAqCisgKiBAYnVmX2xlbjogYnVmZmVyIHNpemUKKyAqCisgKiBSZXR1cm5zOgorICoKKyAqIFBvaW50ZXIgdG8gc2tiIGNvbnRhaW5pbmcgdGhlIGFjayBtZXNzYWdlLiBZb3UgbmVlZCB0byBjaGVjayB0aGUKKyAqIHBvaW50ZXIgd2l0aCBJU19FUlIoKSwgYXMgaXQgbWlnaHQgYmUgYW4gZXJyb3IgY29kZS4gRXJyb3IgY29kZXMKKyAqIGNvdWxkIGhhcHBlbiBiZWNhdXNlOgorICoKKyAqICAtIHRoZSBtZXNzYWdlIHdhc24ndCBmb3JtYXR0ZWQgY29ycmVjdGx5CisgKiAgLSBjb3VsZG4ndCBzZW5kIHRoZSBtZXNzYWdlCisgKiAgLSBmYWlsZWQgd2FpdGluZyBmb3IgYSByZXNwb25zZQorICogIC0gdGhlIGFjayBtZXNzYWdlIHdhc24ndCBmb3JtYXR0ZWQgY29ycmVjdGx5CisgKgorICogVGhlIHJldHVybmVkIHNrYiBoYXMgYmVlbiBhbGxvY2F0ZWQgd2l0aCB3aW1heF9tc2dfdG9fdXNlcl9hbGxvYygpLAorICogaXQgY29udGFpbnMgdGhlIHJlcG9uc2UgaW4gYSBuZXRsaW5rIGF0dHJpYnV0ZSBhbmQgaXMgcmVhZHkgdG8gYmUKKyAqIHBhc3NlZCB1cCB0byB1c2VyIHNwYWNlIHdpdGggd2ltYXhfbXNnX3RvX3VzZXJfc2VuZCgpLiBUbyBhY2Nlc3MKKyAqIHRoZSBwYXlsb2FkIGFuZCBpdHMgbGVuZ3RoLCB1c2Ugd2ltYXhfbXNnX3tkYXRhLGxlbn0oKSBvbiB0aGUgc2tiLgorICoKKyAqIFRoZSBza2IgaGFzIHRvIGJlIGZyZWVkIHdpdGgga2ZyZWVfc2tiKCkgb25jZSBkb25lLgorICoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZGVsaXZlcnMgYSBtZXNzYWdlL2NvbW1hbmQgdG8gdGhlIGRldmljZSBhbmQgd2FpdHMKKyAqIGZvciBhbiBhY2sgdG8gYmUgcmVjZWl2ZWQuIFRoZSBmb3JtYXQgaXMgZGVzY3JpYmVkIGluCisgKiBsaW51eC93aW1heC9pMjQwMG0uaC4gSW4gc3VtbWFyeSwgYSBjb21tYW5kL2dldC9zZXQgaXMgZm9sbG93ZWQgYnkgYW4KKyAqIGFjay4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgbm90IGNoZWNrIHRoZSBhY2sgc3RhdHVzLCB0aGF0J3MgbGVmdCB1cCB0byB0aGUKKyAqIGNhbGxlci4gIE9uY2UgZG9uZSB3aXRoIHRoZSBhY2sgc2tiLCBpdCBoYXMgdG8gYmUga2ZyZWVfc2tiKCllZC4KKyAqCisgKiBUaGUgaTI0MDBtIGhhbmRsZXMgb25seSBvbmUgbWVzc2FnZSBhdCB0aGUgc2FtZSB0aW1lLCB0aHVzIHdlIG5lZWQKKyAqIHRoZSBtdXRleCB0byBleGNsdWRlIG90aGVyIHBsYXllcnMuCisgKgorICogV2Ugd3JpdGUgdGhlIG1lc3NhZ2UgYW5kIHRoZW4gd2FpdCBmb3IgYW4gYW5zd2VyIHRvIGNvbWUgYmFjay4gVGhlCisgKiBSWCBwYXRoIGludGVyY2VwdHMgY29udHJvbCBtZXNzYWdlcyBhbmQgaGFuZGxlcyB0aGVtIGluCisgKiBpMjQwMG1fcnhfY3RsKCkuIFJlcG9ydHMgKG5vdGlmaWNhdGlvbnMpIGFyZSAobWF5YmUpIHByb2Nlc3NlZAorICogbG9jYWxseSBhbmQgdGhlbiBmb3J3YXJkZWQgKGFzIG5lZWRlZCkgdG8gdXNlciBzcGFjZSBvbiB0aGUgV2lNQVgKKyAqIHN0YWNrIG1lc3NhZ2UgcGlwZS4gQWNrcyBhcmUgc2F2ZWQgYW5kIHBhc3NlZCBiYWNrIHRvIHVzIHRocm91Z2ggYW4KKyAqIHNrYiBpbiBpMjQwMG0tPmFja19za2Igd2hpY2ggaXMgcmVhZHkgdG8gYmUgZ2l2ZW4gdG8gZ2VuZXJpYworICogbmV0bGluayBpZiBuZWVkIGJlLgorICovCitzdHJ1Y3Qgc2tfYnVmZiAqaTI0MDBtX21zZ190b19kZXYoc3RydWN0IGkyNDAwbSAqaTI0MDBtLAorCQkJCSAgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgYnVmX2xlbikKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwljb25zdCBzdHJ1Y3QgaTI0MDBtX2wzbDRfaGRyICptc2dfbDNsNF9oZHI7CisJc3RydWN0IHNrX2J1ZmYgKmFja19za2I7CisJY29uc3Qgc3RydWN0IGkyNDAwbV9sM2w0X2hkciAqYWNrX2wzbDRfaGRyOworCXNpemVfdCBhY2tfbGVuOworCWludCBhY2tfdGltZW91dDsKKwl1bnNpZ25lZCBtc2dfdHlwZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZF9mbnN0YXJ0KDMsIGRldiwgIihpMjQwMG0gJXAgYnVmICVwIGxlbiAlenUpXG4iLAorCQkgIGkyNDAwbSwgYnVmLCBidWZfbGVuKTsKKworCWlmIChpMjQwMG0tPmJvb3RfbW9kZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisKKwltc2dfbDNsNF9oZHIgPSBidWY7CisJLyogQ2hlY2sgbXNnICYgcGF5bG9hZCBjb25zaXN0ZW5jeSAqLworCXJlc3VsdCA9IGkyNDAwbV9tc2dfc2l6ZV9jaGVjayhpMjQwMG0sIG1zZ19sM2w0X2hkciwgYnVmX2xlbik7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gZXJyb3JfYmFkX21zZzsKKwltc2dfdHlwZSA9IGxlMTZfdG9fY3B1KG1zZ19sM2w0X2hkci0+dHlwZSk7CisJZF9wcmludGYoMSwgZGV2LCAiQ01EL0dFVC9TRVQgMHglMDR4ICV6dSBieXRlc1xuIiwKKwkJIG1zZ190eXBlLCBidWZfbGVuKTsKKwlkX2R1bXAoMiwgZGV2LCBidWYsIGJ1Zl9sZW4pOworCisJLyogU2V0dXAgdGhlIGNvbXBsZXRpb24sIGFja19za2IgKCJ3ZSBhcmUgd2FpdGluZyIpIGFuZCBzZW5kCisJICogdGhlIG1lc3NhZ2UgdG8gdGhlIGRldmljZSAqLworCW11dGV4X2xvY2soJmkyNDAwbS0+bXNnX211dGV4KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTI0MDBtLT5yeF9sb2NrLCBmbGFncyk7CisJaTI0MDBtLT5hY2tfc2tiID0gRVJSX1BUUigtRUlOUFJPR1JFU1MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmkyNDAwbS0+cnhfbG9jaywgZmxhZ3MpOworCWluaXRfY29tcGxldGlvbigmaTI0MDBtLT5tc2dfY29tcGxldGlvbik7CisJcmVzdWx0ID0gaTI0MDBtX3R4KGkyNDAwbSwgYnVmLCBidWZfbGVuLCBJMjQwME1fUFRfQ1RSTCk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJjYW4ndCBzZW5kIG1lc3NhZ2UgMHglMDR4OiAlZFxuIiwKKwkJCWxlMTZfdG9fY3B1KG1zZ19sM2w0X2hkci0+dHlwZSksIHJlc3VsdCk7CisJCWdvdG8gZXJyb3JfdHg7CisJfQorCisJLyogU29tZSBjb21tYW5kcyB0YWtlIGxvbmdlciB0byBleGVjdXRlIGJlY2F1c2Ugb2YgY3J5cHRvIG9wcywKKwkgKiBzbyB3ZSBnaXZlIHRoZW0gc29tZSBtb3JlIGxlZXdheSBvbiB0aW1lb3V0ICovCisJc3dpdGNoIChtc2dfdHlwZSkgeworCWNhc2UgSTI0MDBNX01UX0dFVF9UTFNfT1BFUkFUSU9OX1JFU1VMVDoKKwljYXNlIEkyNDAwTV9NVF9DTURfU0VORF9FQVBfUkVTUE9OU0U6CisJCWFja190aW1lb3V0ID0gNSAqIEhaOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlhY2tfdGltZW91dCA9IEhaOworCX07CisKKwkvKiBUaGUgUlggcGF0aCBpbiByeC5jIHdpbGwgcHV0IGFueSByZXNwb25zZSBmb3IgdGhpcyBtZXNzYWdlCisJICogaW4gaTI0MDBtLT5hY2tfc2tiIGFuZCB3YWtlIHVzIHVwLiBJZiB3ZSBjYW5jZWwgdGhlIHdhaXQsCisJICogd2UgbmVlZCB0byBjaGFuZ2UgdGhlIHZhbHVlIG9mIGkyNDAwbS0+YWNrX3NrYiB0byBzb21ldGhpbmcKKwkgKiBub3QgLUVJTlBST0dSRVNTIHNvIFJYIGtub3dzIHRoZXJlIGlzIG5vIG9uZSB3YWl0aW5nLiAqLworCXJlc3VsdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KAorCQkmaTI0MDBtLT5tc2dfY29tcGxldGlvbiwgYWNrX3RpbWVvdXQpOworCWlmIChyZXN1bHQgPT0gMCkgeworCQlkZXZfZXJyKGRldiwgInRpbWVvdXQgd2FpdGluZyBmb3IgcmVwbHkgdG8gbWVzc2FnZSAweCUwNHhcbiIsCisJCQltc2dfdHlwZSk7CisJCXJlc3VsdCA9IC1FVElNRURPVVQ7CisJCWkyNDAwbV9tc2dfdG9fZGV2X2NhbmNlbF93YWl0KGkyNDAwbSwgcmVzdWx0KTsKKwkJZ290byBlcnJvcl93YWl0X2Zvcl9jb21wbGV0aW9uOworCX0gZWxzZSBpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImVycm9yIHdhaXRpbmcgZm9yIHJlcGx5IHRvIG1lc3NhZ2UgMHglMDR4OiAlZFxuIiwKKwkJCW1zZ190eXBlLCByZXN1bHQpOworCQlpMjQwMG1fbXNnX3RvX2Rldl9jYW5jZWxfd2FpdChpMjQwMG0sIHJlc3VsdCk7CisJCWdvdG8gZXJyb3Jfd2FpdF9mb3JfY29tcGxldGlvbjsKKwl9CisKKwkvKiBQdWxsIG91dCB0aGUgYWNrIGRhdGEgZnJvbSBpMjQwMG0tPmFja19za2IgLS0gc2VlIGlmIGl0IGlzCisJICogYW4gZXJyb3IgYW5kIGFjdCBhY2NvcmRpbmdseSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpMjQwMG0tPnJ4X2xvY2ssIGZsYWdzKTsKKwlhY2tfc2tiID0gaTI0MDBtLT5hY2tfc2tiOworCWlmIChJU19FUlIoYWNrX3NrYikpCisJCXJlc3VsdCA9IFBUUl9FUlIoYWNrX3NrYik7CisJZWxzZQorCQlyZXN1bHQgPSAwOworCWkyNDAwbS0+YWNrX3NrYiA9IE5VTEw7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTI0MDBtLT5yeF9sb2NrLCBmbGFncyk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gZXJyb3JfYWNrX3N0YXR1czsKKwlhY2tfbDNsNF9oZHIgPSB3aW1heF9tc2dfZGF0YV9sZW4oYWNrX3NrYiwgJmFja19sZW4pOworCisJLyogQ2hlY2sgdGhlIGFjayBhbmQgZGVsaXZlciBpdCBpZiBpdCBpcyBvayAqLworCXJlc3VsdCA9IGkyNDAwbV9tc2dfc2l6ZV9jaGVjayhpMjQwMG0sIGFja19sM2w0X2hkciwgYWNrX2xlbik7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJIVyBCVUc/IHJlcGx5IHRvIG1lc3NhZ2UgMHglMDR4OiAlZFxuIiwKKwkJCW1zZ190eXBlLCByZXN1bHQpOworCQlnb3RvIGVycm9yX2JhZF9hY2tfbGVuOworCX0KKwlpZiAobXNnX3R5cGUgIT0gbGUxNl90b19jcHUoYWNrX2wzbDRfaGRyLT50eXBlKSkgeworCQlkZXZfZXJyKGRldiwgIkhXIEJVRz8gYmFkIHJlcGx5IDB4JTA0eCB0byBtZXNzYWdlIDB4JTA0eFxuIiwKKwkJCWxlMTZfdG9fY3B1KGFja19sM2w0X2hkci0+dHlwZSksIG1zZ190eXBlKTsKKwkJcmVzdWx0ID0gLUVJTzsKKwkJZ290byBlcnJvcl9iYWRfYWNrX3R5cGU7CisJfQorCWkyNDAwbV9tc2dfYWNrX2hvb2soaTI0MDBtLCBhY2tfbDNsNF9oZHIsIGFja19sZW4pOworCW11dGV4X3VubG9jaygmaTI0MDBtLT5tc2dfbXV0ZXgpOworCWRfZm5lbmQoMywgZGV2LCAiKGkyNDAwbSAlcCBidWYgJXAgbGVuICV6dSkgPSAlcFxuIiwKKwkJaTI0MDBtLCBidWYsIGJ1Zl9sZW4sIGFja19za2IpOworCXJldHVybiBhY2tfc2tiOworCitlcnJvcl9iYWRfYWNrX3R5cGU6CitlcnJvcl9iYWRfYWNrX2xlbjoKKwlrZnJlZV9za2IoYWNrX3NrYik7CitlcnJvcl9hY2tfc3RhdHVzOgorZXJyb3Jfd2FpdF9mb3JfY29tcGxldGlvbjoKK2Vycm9yX3R4OgorCW11dGV4X3VubG9jaygmaTI0MDBtLT5tc2dfbXV0ZXgpOworZXJyb3JfYmFkX21zZzoKKwlkX2ZuZW5kKDMsIGRldiwgIihpMjQwMG0gJXAgYnVmICVwIGxlbiAlenUpID0gJWRcbiIsCisJCWkyNDAwbSwgYnVmLCBidWZfbGVuLCByZXN1bHQpOworCXJldHVybiBFUlJfUFRSKHJlc3VsdCk7Cit9CisKKworLyoKKyAqIERlZmluaXRpb25zIGZvciB0aGUgRW50ZXIgUG93ZXIgU2F2ZSBjb21tYW5kCisgKgorICogVGhlIEVudGVyIFBvd2VyIFNhdmUgY29tbWFuZCByZXF1ZXN0cyB0aGUgZGV2aWNlIHRvIGdvIGludG8gcG93ZXIKKyAqIHNhdmluZyBtb2RlLiBUaGUgZGV2aWNlIHdpbGwgYWNrIG9yIG5hayB0aGUgY29tbWFuZCBkZXBlbmRpbmcgb24gaXQKKyAqIGJlaW5nIHJlYWR5IGZvciBpdC4gSWYgaXQgYWNrcywgd2UgdGVsbCB0aGUgVVNCIHN1YnN5c3RlbSB0bworICoKKyAqIEFzIHdlbGwsIHRoZSBkZXZpY2UgbWlnaHQgcmVxdWVzdCB0byBnbyBpbnRvIHBvd2VyIHNhdmluZyBtb2RlIGJ5CisgKiBzZW5kaW5nIGEgcmVwb3J0IChSRVBPUlRfUE9XRVJTQVZFX1JFQURZKSwgaW4gd2hpY2ggY2FzZSwgd2UgaXNzdWUKKyAqIHRoaXMgY29tbWFuZC4gVGhlIGhvb2t1cHMgaW4gdGhlIFJYIGNvZGVyIGFsbG93CisgKi8KK2VudW0geworCUkyNDAwTV9XQUtFVVBfRU5BQkxFRCAgPSAweDAxLAorCUkyNDAwTV9XQUtFVVBfRElTQUJMRUQgPSAweDAyLAorCUkyNDAwTV9UTFZfVFlQRV9XQUtFVVBfTU9ERSA9IDE0NCwKK307CisKK3N0cnVjdCBpMjQwMG1fY21kX2VudGVyX3Bvd2VyX3NhdmUgeworCXN0cnVjdCBpMjQwMG1fbDNsNF9oZHIgaGRyOworCXN0cnVjdCBpMjQwMG1fdGx2X2hkciB0bHY7CisJX19sZTMyIHZhbDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworLyoKKyAqIFJlcXVlc3QgZW50ZXJpbmcgcG93ZXIgc2F2ZQorICoKKyAqIFRoaXMgY29tbWFuZCBpcyAobWFpbmx5KSBleGVjdXRlZCB3aGVuIHRoZSBkZXZpY2UgaW5kaWNhdGVzIHRoYXQgaXQKKyAqIGlzIHJlYWR5IHRvIGdvIGludG8gcG93ZXJzYXZlIG1vZGUgdmlhIGEgUkVQT1JUX1BPV0VSU0FWRV9SRUFEWS4KKyAqLworaW50IGkyNDAwbV9jbWRfZW50ZXJfcG93ZXJzYXZlKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYWNrX3NrYjsKKwlzdHJ1Y3QgaTI0MDBtX2NtZF9lbnRlcl9wb3dlcl9zYXZlICpjbWQ7CisJY2hhciBzdHJlcnJbMzJdOworCisJcmVzdWx0ID0gLUVOT01FTTsKKwljbWQgPSBremFsbG9jKHNpemVvZigqY21kKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNtZCA9PSBOVUxMKQorCQlnb3RvIGVycm9yX2FsbG9jOworCWNtZC0+aGRyLnR5cGUgPSBjcHVfdG9fbGUxNihJMjQwME1fTVRfQ01EX0VOVEVSX1BPV0VSU0FWRSk7CisJY21kLT5oZHIubGVuZ3RoID0gY3B1X3RvX2xlMTYoc2l6ZW9mKCpjbWQpIC0gc2l6ZW9mKGNtZC0+aGRyKSk7CisJY21kLT5oZHIudmVyc2lvbiA9IGNwdV90b19sZTE2KEkyNDAwTV9MM0w0X1ZFUlNJT04pOworCWNtZC0+dGx2LnR5cGUgPSBjcHVfdG9fbGUxNihJMjQwME1fVExWX1RZUEVfV0FLRVVQX01PREUpOworCWNtZC0+dGx2Lmxlbmd0aCA9IGNwdV90b19sZTE2KHNpemVvZihjbWQtPnZhbCkpOworCWNtZC0+dmFsID0gY3B1X3RvX2xlMzIoSTI0MDBNX1dBS0VVUF9FTkFCTEVEKTsKKworCWFja19za2IgPSBpMjQwMG1fbXNnX3RvX2RldihpMjQwMG0sIGNtZCwgc2l6ZW9mKCpjbWQpKTsKKwlyZXN1bHQgPSBQVFJfRVJSKGFja19za2IpOworCWlmIChJU19FUlIoYWNrX3NrYikpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gaXNzdWUgJ0VudGVyIHBvd2VyIHNhdmUnIGNvbW1hbmQ6ICVkXG4iLAorCQkJcmVzdWx0KTsKKwkJZ290byBlcnJvcl9tc2dfdG9fZGV2OworCX0KKwlyZXN1bHQgPSBpMjQwMG1fbXNnX2NoZWNrX3N0YXR1cyh3aW1heF9tc2dfZGF0YShhY2tfc2tiKSwKKwkJCQkJIHN0cmVyciwgc2l6ZW9mKHN0cmVycikpOworCWlmIChyZXN1bHQgPT0gLUVBQ0NFUykKKwkJZF9wcmludGYoMSwgZGV2LCAiQ2Fubm90IGVudGVyIHBvd2VyIHNhdmUgbW9kZVxuIik7CisJZWxzZSBpZiAocmVzdWx0IDwgMCkKKwkJZGV2X2VycihkZXYsICInRW50ZXIgcG93ZXIgc2F2ZScgKDB4JTA0eCkgY29tbWFuZCBmYWlsZWQ6ICIKKwkJCSIlZCAtICVzXG4iLCBJMjQwME1fTVRfQ01EX0VOVEVSX1BPV0VSU0FWRSwKKwkJCXJlc3VsdCwgc3RyZXJyKTsKKwllbHNlCisJCWRfcHJpbnRmKDEsIGRldiwgImRldmljZSByZWFkeSB0byBwb3dlciBzYXZlXG4iKTsKKwlrZnJlZV9za2IoYWNrX3NrYik7CitlcnJvcl9tc2dfdG9fZGV2OgorCWtmcmVlKGNtZCk7CitlcnJvcl9hbGxvYzoKKwlyZXR1cm4gcmVzdWx0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoaTI0MDBtX2NtZF9lbnRlcl9wb3dlcnNhdmUpOworCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgZ2V0dGluZyBkZXZpY2UgaW5mb3JtYXRpb24KKyAqLworZW51bSB7CisJSTI0MDBNX1RMVl9ERVRBSUxFRF9ERVZJQ0VfSU5GTyA9IDE0MAorfTsKKworLyoqCisgKiBpMjQwMG1fZ2V0X2RldmljZV9pbmZvIC0gUXVlcnkgdGhlIGRldmljZSBmb3IgZGV0YWlsZWQgZGV2aWNlIGluZm9ybWF0aW9uCisgKgorICogQGkyNDAwbTogZGV2aWNlIGRlc2NyaXB0b3IKKyAqCisgKiBSZXR1cm5zOiBhbiBza2Igd2hvc2Ugc2tiLT5kYXRhIHBvaW50cyB0byBhICdzdHJ1Y3QKKyAqICAgIGkyNDAwbV90bHZfZGV0YWlsZWRfZGV2aWNlX2luZm8nLiBXaGVuIGRvbmUsIGtmcmVlX3NrYigpIGl0LiBUaGUKKyAqICAgIHNrYiBpcyAqZ3VhcmFudGVlZCogdG8gY29udGFpbiB0aGUgd2hvbGUgVExWIGRhdGEgc3RydWN0dXJlLgorICoKKyAqICAgIE9uIGVycm9yLCBJU19FUlIoc2tiKSBpcyB0cnVlIGFuZCBFUlJfUFRSKHNrYikgaXMgdGhlIGVycm9yCisgKiAgICBjb2RlLgorICovCitzdHJ1Y3Qgc2tfYnVmZiAqaTI0MDBtX2dldF9kZXZpY2VfaW5mbyhzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJc3RydWN0IHNrX2J1ZmYgKmFja19za2I7CisJc3RydWN0IGkyNDAwbV9sM2w0X2hkciAqY21kOworCWNvbnN0IHN0cnVjdCBpMjQwMG1fbDNsNF9oZHIgKmFjazsKKwlzaXplX3QgYWNrX2xlbjsKKwljb25zdCBzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIgKnRsdjsKKwljb25zdCBzdHJ1Y3QgaTI0MDBtX3Rsdl9kZXRhaWxlZF9kZXZpY2VfaW5mbyAqZGRpOworCWNoYXIgc3RyZXJyWzMyXTsKKworCWFja19za2IgPSBFUlJfUFRSKC1FTk9NRU0pOworCWNtZCA9IGt6YWxsb2Moc2l6ZW9mKCpjbWQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY21kID09IE5VTEwpCisJCWdvdG8gZXJyb3JfYWxsb2M7CisJY21kLT50eXBlID0gY3B1X3RvX2xlMTYoSTI0MDBNX01UX0dFVF9ERVZJQ0VfSU5GTyk7CisJY21kLT5sZW5ndGggPSAwOworCWNtZC0+dmVyc2lvbiA9IGNwdV90b19sZTE2KEkyNDAwTV9MM0w0X1ZFUlNJT04pOworCisJYWNrX3NrYiA9IGkyNDAwbV9tc2dfdG9fZGV2KGkyNDAwbSwgY21kLCBzaXplb2YoKmNtZCkpOworCWlmIChJU19FUlIoYWNrX3NrYikpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gaXNzdWUgJ2dldCBkZXZpY2UgaW5mbycgY29tbWFuZDogJWxkXG4iLAorCQkJUFRSX0VSUihhY2tfc2tiKSk7CisJCWdvdG8gZXJyb3JfbXNnX3RvX2RldjsKKwl9CisJYWNrID0gd2ltYXhfbXNnX2RhdGFfbGVuKGFja19za2IsICZhY2tfbGVuKTsKKwlyZXN1bHQgPSBpMjQwMG1fbXNnX2NoZWNrX3N0YXR1cyhhY2ssIHN0cmVyciwgc2l6ZW9mKHN0cmVycikpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiJ2dldCBkZXZpY2UgaW5mbycgKDB4JTA0eCkgY29tbWFuZCBmYWlsZWQ6ICIKKwkJCSIlZCAtICVzXG4iLCBJMjQwME1fTVRfR0VUX0RFVklDRV9JTkZPLCByZXN1bHQsCisJCQlzdHJlcnIpOworCQlnb3RvIGVycm9yX2NtZF9mYWlsZWQ7CisJfQorCXRsdiA9IGkyNDAwbV90bHZfZmluZChpMjQwMG0sIGFjay0+cGwsIGFja19sZW4gLSBzaXplb2YoKmFjayksCisJCQkgICAgICBJMjQwME1fVExWX0RFVEFJTEVEX0RFVklDRV9JTkZPLCBzaXplb2YoKmRkaSkpOworCWlmICh0bHYgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgIkdFVCBERVZJQ0UgSU5GTzogIgorCQkJImRldGFpbGVkIGRldmljZSBpbmZvIFRMViBub3QgZm91bmQgKDB4JTA0eClcbiIsCisJCQlJMjQwME1fVExWX0RFVEFJTEVEX0RFVklDRV9JTkZPKTsKKwkJcmVzdWx0ID0gLUVJTzsKKwkJZ290byBlcnJvcl9ub190bHY7CisJfQorCXNrYl9wdWxsKGFja19za2IsICh2b2lkICopIHRsdiAtICh2b2lkICopIGFja19za2ItPmRhdGEpOworZXJyb3JfbXNnX3RvX2RldjoKKwlrZnJlZShjbWQpOworZXJyb3JfYWxsb2M6CisJcmV0dXJuIGFja19za2I7CisKK2Vycm9yX25vX3RsdjoKK2Vycm9yX2NtZF9mYWlsZWQ6CisJa2ZyZWVfc2tiKGFja19za2IpOworCWtmcmVlKGNtZCk7CisJcmV0dXJuIEVSUl9QVFIocmVzdWx0KTsKK30KKworCisvKiBGaXJtd2FyZSBpbnRlcmZhY2UgdmVyc2lvbnMgd2Ugc3VwcG9ydCAqLworZW51bSB7CisJSTI0MDBNX0hESXZfTUFKT1IgPSA5LAorCUkyNDAwTV9IREl2X01BSk9SXzIgPSA4LAorCUkyNDAwTV9IREl2X01JTk9SID0gMSwKK307CisKKworLyoqCisgKiBpMjQwMG1fZmlybXdhcmVfY2hlY2sgLSBjaGVjayBmaXJtd2FyZSB2ZXJzaW9ucyBhcmUgY29tcGF0aWJsZSB3aXRoCisgKiB0aGUgZHJpdmVyCisgKgorICogQGkyNDAwbTogZGV2aWNlIGRlc2NyaXB0b3IKKyAqCisgKiBSZXR1cm5zOiAwIGlmIG9rLCA8IDAgZXJybm8gY29kZSBhbiBlcnJvciBhbmQgYSBtZXNzYWdlIGluIHRoZQorICogICAga2VybmVsIGxvZy4KKyAqCisgKiBMb25nIGZ1bmN0aW9uLCBidXQgcXVpdGUgc2ltcGxlOyBmaXJzdCBjaHVuayBsYXVuY2hlcyB0aGUgY29tbWFuZAorICogYW5kIGRvdWJsZSBjaGVja3MgdGhlIHJlcGx5IGZvciB0aGUgcmlnaHQgVExWLiBUaGVuIHdlIHByb2Nlc3MgdGhlCisgKiBUTFYgKHdoZXJlIHRoZSBtZWF0IGlzKS4KKyAqLworaW50IGkyNDAwbV9maXJtd2FyZV9jaGVjayhzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJc3RydWN0IHNrX2J1ZmYgKmFja19za2I7CisJc3RydWN0IGkyNDAwbV9sM2w0X2hkciAqY21kOworCWNvbnN0IHN0cnVjdCBpMjQwMG1fbDNsNF9oZHIgKmFjazsKKwlzaXplX3QgYWNrX2xlbjsKKwljb25zdCBzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIgKnRsdjsKKwljb25zdCBzdHJ1Y3QgaTI0MDBtX3Rsdl9sNF9tZXNzYWdlX3ZlcnNpb25zICpsNG12OworCWNoYXIgc3RyZXJyWzMyXTsKKwl1bnNpZ25lZCBtYWpvciwgbWlub3IsIGJyYW5jaDsKKworCXJlc3VsdCA9IC1FTk9NRU07CisJY21kID0ga3phbGxvYyhzaXplb2YoKmNtZCksIEdGUF9LRVJORUwpOworCWlmIChjbWQgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9hbGxvYzsKKwljbWQtPnR5cGUgPSBjcHVfdG9fbGUxNihJMjQwME1fTVRfR0VUX0xNX1ZFUlNJT04pOworCWNtZC0+bGVuZ3RoID0gMDsKKwljbWQtPnZlcnNpb24gPSBjcHVfdG9fbGUxNihJMjQwME1fTDNMNF9WRVJTSU9OKTsKKworCWFja19za2IgPSBpMjQwMG1fbXNnX3RvX2RldihpMjQwMG0sIGNtZCwgc2l6ZW9mKCpjbWQpKTsKKwlpZiAoSVNfRVJSKGFja19za2IpKSB7CisJCXJlc3VsdCA9IFBUUl9FUlIoYWNrX3NrYik7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGlzc3VlICdnZXQgbG0gdmVyc2lvbicgY29tbWFuZDogJS1kXG4iLAorCQkJcmVzdWx0KTsKKwkJZ290byBlcnJvcl9tc2dfdG9fZGV2OworCX0KKwlhY2sgPSB3aW1heF9tc2dfZGF0YV9sZW4oYWNrX3NrYiwgJmFja19sZW4pOworCXJlc3VsdCA9IGkyNDAwbV9tc2dfY2hlY2tfc3RhdHVzKGFjaywgc3RyZXJyLCBzaXplb2Yoc3RyZXJyKSk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycihkZXYsICInZ2V0IGxtIHZlcnNpb24nICgweCUwNHgpIGNvbW1hbmQgZmFpbGVkOiAiCisJCQkiJWQgLSAlc1xuIiwgSTI0MDBNX01UX0dFVF9MTV9WRVJTSU9OLCByZXN1bHQsCisJCQlzdHJlcnIpOworCQlnb3RvIGVycm9yX2NtZF9mYWlsZWQ7CisJfQorCXRsdiA9IGkyNDAwbV90bHZfZmluZChpMjQwMG0sIGFjay0+cGwsIGFja19sZW4gLSBzaXplb2YoKmFjayksCisJCQkgICAgICBJMjQwME1fVExWX0w0X01FU1NBR0VfVkVSU0lPTlMsIHNpemVvZigqbDRtdikpOworCWlmICh0bHYgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgImdldCBsbSB2ZXJzaW9uOiBUTFYgbm90IGZvdW5kICgweCUwNHgpXG4iLAorCQkJSTI0MDBNX1RMVl9MNF9NRVNTQUdFX1ZFUlNJT05TKTsKKwkJcmVzdWx0ID0gLUVJTzsKKwkJZ290byBlcnJvcl9ub190bHY7CisJfQorCWw0bXYgPSBjb250YWluZXJfb2YodGx2LCB0eXBlb2YoKmw0bXYpLCBoZHIpOworCW1ham9yID0gbGUxNl90b19jcHUobDRtdi0+bWFqb3IpOworCW1pbm9yID0gbGUxNl90b19jcHUobDRtdi0+bWlub3IpOworCWJyYW5jaCA9IGxlMTZfdG9fY3B1KGw0bXYtPmJyYW5jaCk7CisJcmVzdWx0ID0gLUVJTlZBTDsKKwlpZiAobWFqb3IgIT0gSTI0MDBNX0hESXZfTUFKT1IKKwkgICAgJiYgbWFqb3IgIT0gSTI0MDBNX0hESXZfTUFKT1JfMikgeworCQlkZXZfZXJyKGRldiwgInVuc3VwcG9ydGVkIG1ham9yIGZ3IGludGVyZmFjZSB2ZXJzaW9uICIKKwkJCSIldS4ldS4ldVxuIiwgbWFqb3IsIG1pbm9yLCBicmFuY2gpOworCQlnb3RvIGVycm9yX2JhZF9tYWpvcjsKKwl9CisJaWYgKG1ham9yID09IEkyNDAwTV9IREl2X01BSk9SXzIpCisJCWRldl9lcnIoZGV2LCAiZGVwcmVjYXRlZCBtYWpvciBmdyBpbnRlcmZhY2UgdmVyc2lvbiAiCisJCQkiJXUuJXUuJXVcbiIsIG1ham9yLCBtaW5vciwgYnJhbmNoKTsKKwlyZXN1bHQgPSAwOworCWlmIChtaW5vciAhPSBJMjQwME1fSERJdl9NSU5PUikKKwkJZGV2X3dhcm4oZGV2LCAidW50ZXN0ZWQgbWlub3IgZncgZmlybXdhcmUgdmVyc2lvbiAldS4ldS4ldVxuIiwKKwkJCSBtYWpvciwgbWlub3IsIGJyYW5jaCk7CitlcnJvcl9iYWRfbWFqb3I6CisJZGV2X2luZm8oZGV2LCAiZmlybXdhcmUgaW50ZXJmYWNlIHZlcnNpb24gJXUuJXUuJXVcbiIsCisJCSBtYWpvciwgbWlub3IsIGJyYW5jaCk7CitlcnJvcl9ub190bHY6CitlcnJvcl9jbWRfZmFpbGVkOgorCWtmcmVlX3NrYihhY2tfc2tiKTsKK2Vycm9yX21zZ190b19kZXY6CisJa2ZyZWUoY21kKTsKK2Vycm9yX2FsbG9jOgorCXJldHVybiByZXN1bHQ7Cit9CisKKworLyoKKyAqIFNlbmQgYW4gRG9FeGl0SWRsZSBjb21tYW5kIHRvIHRoZSBkZXZpY2UgdG8gYXNrIGl0IHRvIGdvIG91dCBvZgorICogYmFzZXN0YXRpb24taWRsZSBtb2RlLgorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKgorICogVGhpcyBzdGFydHMgYSByZW5lZ290aWF0aW9uIHdpdGggdGhlIGJhc2VzdGF0aW9uIHRoYXQgbWlnaHQgaW52b2x2ZQorICogYW5vdGhlciBjcnlwdG8gaGFuZHNoYWtlIHdpdGggdXNlciBzcGFjZS4KKyAqCisgKiBSZXR1cm5zOiAwIGlmIG9rLCA8IDAgZXJybm8gY29kZSBvbiBlcnJvci4KKyAqLworaW50IGkyNDAwbV9jbWRfZXhpdF9pZGxlKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYWNrX3NrYjsKKwlzdHJ1Y3QgaTI0MDBtX2wzbDRfaGRyICpjbWQ7CisJY2hhciBzdHJlcnJbMzJdOworCisJcmVzdWx0ID0gLUVOT01FTTsKKwljbWQgPSBremFsbG9jKHNpemVvZigqY21kKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNtZCA9PSBOVUxMKQorCQlnb3RvIGVycm9yX2FsbG9jOworCWNtZC0+dHlwZSA9IGNwdV90b19sZTE2KEkyNDAwTV9NVF9DTURfRVhJVF9JRExFKTsKKwljbWQtPmxlbmd0aCA9IDA7CisJY21kLT52ZXJzaW9uID0gY3B1X3RvX2xlMTYoSTI0MDBNX0wzTDRfVkVSU0lPTik7CisKKwlhY2tfc2tiID0gaTI0MDBtX21zZ190b19kZXYoaTI0MDBtLCBjbWQsIHNpemVvZigqY21kKSk7CisJcmVzdWx0ID0gUFRSX0VSUihhY2tfc2tiKTsKKwlpZiAoSVNfRVJSKGFja19za2IpKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGlzc3VlICdleGl0IGlkbGUnIGNvbW1hbmQ6ICVkXG4iLAorCQkJcmVzdWx0KTsKKwkJZ290byBlcnJvcl9tc2dfdG9fZGV2OworCX0KKwlyZXN1bHQgPSBpMjQwMG1fbXNnX2NoZWNrX3N0YXR1cyh3aW1heF9tc2dfZGF0YShhY2tfc2tiKSwKKwkJCQkJIHN0cmVyciwgc2l6ZW9mKHN0cmVycikpOworCWtmcmVlX3NrYihhY2tfc2tiKTsKK2Vycm9yX21zZ190b19kZXY6CisJa2ZyZWUoY21kKTsKK2Vycm9yX2FsbG9jOgorCXJldHVybiByZXN1bHQ7CisKK30KKworCisvKgorICogUXVlcnkgdGhlIGRldmljZSBmb3IgaXRzIHN0YXRlLCB1cGRhdGUgdGhlIFdpTUFYIHN0YWNrJ3MgaWRlYSBvZiBpdAorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKgorICogUmV0dXJuczogMCBpZiBvaywgPCAwIGVycm5vIGNvZGUgb24gZXJyb3IuCisgKgorICogRXhlY3V0ZXMgYSAnR2V0IFN0YXRlJyBjb21tYW5kIGFuZCBwYXJzZXMgdGhlIHJldHVybmVkCisgKiBUTFZzLgorICoKKyAqIEJlY2F1c2UgdGhpcyBpcyBhbG1vc3QgaWRlbnRpY2FsIHRvIGEgJ1JlcG9ydCBTdGF0ZScsIHdlIHVzZQorICogaTI0MDBtX3JlcG9ydF9zdGF0ZV9ob29rKCkgdG8gcGFyc2UgdGhlIGFuc3dlci4gVGhpcyB3aWxsIHNldCB0aGUKKyAqIGNhcnJpZXIgc3RhdGUsIGFzIHdlbGwgYXMgdGhlIFJGIEtpbGwgc3dpdGNoZXMgc3RhdGUuCisgKi8KK2ludCBpMjQwMG1fY21kX2dldF9zdGF0ZShzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJc3RydWN0IHNrX2J1ZmYgKmFja19za2I7CisJc3RydWN0IGkyNDAwbV9sM2w0X2hkciAqY21kOworCWNvbnN0IHN0cnVjdCBpMjQwMG1fbDNsNF9oZHIgKmFjazsKKwlzaXplX3QgYWNrX2xlbjsKKwljaGFyIHN0cmVyclszMl07CisKKwlyZXN1bHQgPSAtRU5PTUVNOworCWNtZCA9IGt6YWxsb2Moc2l6ZW9mKCpjbWQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY21kID09IE5VTEwpCisJCWdvdG8gZXJyb3JfYWxsb2M7CisJY21kLT50eXBlID0gY3B1X3RvX2xlMTYoSTI0MDBNX01UX0dFVF9TVEFURSk7CisJY21kLT5sZW5ndGggPSAwOworCWNtZC0+dmVyc2lvbiA9IGNwdV90b19sZTE2KEkyNDAwTV9MM0w0X1ZFUlNJT04pOworCisJYWNrX3NrYiA9IGkyNDAwbV9tc2dfdG9fZGV2KGkyNDAwbSwgY21kLCBzaXplb2YoKmNtZCkpOworCWlmIChJU19FUlIoYWNrX3NrYikpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gaXNzdWUgJ2dldCBzdGF0ZScgY29tbWFuZDogJWxkXG4iLAorCQkJUFRSX0VSUihhY2tfc2tiKSk7CisJCXJlc3VsdCA9IFBUUl9FUlIoYWNrX3NrYik7CisJCWdvdG8gZXJyb3JfbXNnX3RvX2RldjsKKwl9CisJYWNrID0gd2ltYXhfbXNnX2RhdGFfbGVuKGFja19za2IsICZhY2tfbGVuKTsKKwlyZXN1bHQgPSBpMjQwMG1fbXNnX2NoZWNrX3N0YXR1cyhhY2ssIHN0cmVyciwgc2l6ZW9mKHN0cmVycikpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiJ2dldCBzdGF0ZScgKDB4JTA0eCkgY29tbWFuZCBmYWlsZWQ6ICIKKwkJCSIlZCAtICVzXG4iLCBJMjQwME1fTVRfR0VUX1NUQVRFLCByZXN1bHQsIHN0cmVycik7CisJCWdvdG8gZXJyb3JfY21kX2ZhaWxlZDsKKwl9CisJaTI0MDBtX3JlcG9ydF9zdGF0ZV9ob29rKGkyNDAwbSwgYWNrLCBhY2tfbGVuIC0gc2l6ZW9mKCphY2spLAorCQkJCSAiR0VUIFNUQVRFIik7CisJcmVzdWx0ID0gMDsKKwlrZnJlZV9za2IoYWNrX3NrYik7CitlcnJvcl9jbWRfZmFpbGVkOgorZXJyb3JfbXNnX3RvX2RldjoKKwlrZnJlZShjbWQpOworZXJyb3JfYWxsb2M6CisJcmV0dXJuIHJlc3VsdDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGkyNDAwbV9jbWRfZ2V0X3N0YXRlKTsKKworCisvKioKKyAqIFNldCBiYXNpYyBjb25maWd1cmF0aW9uIHNldHRpbmdzCisgKgorICogQGkyNDAwbTogZGV2aWNlIGRlc2NyaXB0b3IKKyAqIEBhcmdzOiBhcnJheSBvZiBwb2ludGVycyB0byB0aGUgVExWIGhlYWRlcnMgdG8gc2VuZCBmb3IKKyAqICAgICBjb25maWd1cmF0aW9uIChlYWNoIGZvbGxvd2VkIGJ5IGl0cyBwYXlsb2FkKS4KKyAqICAgICBUTFYgaGVhZGVycyBhbmQgcGF5bG9hZHMgbXVzdCBiZSBwcm9wZXJseSBpbml0aWFsaXplZCwgd2l0aCB0aGUKKyAqICAgICByaWdodCBlbmRpYW5lc3MgKExFKS4KKyAqIEBhcmdfc2l6ZTogbnVtYmVyIG9mIHBvaW50ZXJzIGluIHRoZSBAYXJncyBhcnJheQorICovCitpbnQgaTI0MDBtX3NldF9pbml0X2NvbmZpZyhzdHJ1Y3QgaTI0MDBtICppMjQwMG0sCisJCQkgICBjb25zdCBzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIgKiphcmcsIHNpemVfdCBhcmdzKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXN0cnVjdCBza19idWZmICphY2tfc2tiOworCXN0cnVjdCBpMjQwMG1fbDNsNF9oZHIgKmNtZDsKKwljaGFyIHN0cmVyclszMl07CisJdW5zaWduZWQgYXJnYywgYXJnc2l6ZSwgdGx2X3NpemU7CisJY29uc3Qgc3RydWN0IGkyNDAwbV90bHZfaGRyICp0bHZfaGRyOworCXZvaWQgKmJ1ZiwgKml0cjsKKworCWRfZm5zdGFydCgzLCBkZXYsICIoaTI0MDBtICVwIGFyZyAlcCBhcmdzICV6dSlcbiIsIGkyNDAwbSwgYXJnLCBhcmdzKTsKKwlyZXN1bHQgPSAwOworCWlmIChhcmdzID09IDApCisJCWdvdG8gbm9uZTsKKwkvKiBDb21wdXRlIHRoZSBzaXplIG9mIGFsbCB0aGUgVExWcywgc28gd2UgY2FuIGFsbG9jIGEKKwkgKiBjb250aWd1b3VzIGNvbW1hbmQgYmxvY2sgdG8gY29weSB0aGVtLiAqLworCWFyZ3NpemUgPSAwOworCWZvciAoYXJnYyA9IDA7IGFyZ2MgPCBhcmdzOyBhcmdjKyspIHsKKwkJdGx2X2hkciA9IGFyZ1thcmdjXTsKKwkJYXJnc2l6ZSArPSBzaXplb2YoKnRsdl9oZHIpICsgbGUxNl90b19jcHUodGx2X2hkci0+bGVuZ3RoKTsKKwl9CisJV0FSTl9PTihhcmdjID49IDkpOwkvKiBBcyBwZXIgaHcgc3BlYyAqLworCisJLyogQWxsb2MgdGhlIHNwYWNlIGZvciB0aGUgY29tbWFuZCBhbmQgVExWcyovCisJcmVzdWx0ID0gLUVOT01FTTsKKwlidWYgPSBremFsbG9jKHNpemVvZigqY21kKSArIGFyZ3NpemUsIEdGUF9LRVJORUwpOworCWlmIChidWYgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9hbGxvYzsKKwljbWQgPSBidWY7CisJY21kLT50eXBlID0gY3B1X3RvX2xlMTYoSTI0MDBNX01UX1NFVF9JTklUX0NPTkZJRyk7CisJY21kLT5sZW5ndGggPSBjcHVfdG9fbGUxNihhcmdzaXplKTsKKwljbWQtPnZlcnNpb24gPSBjcHVfdG9fbGUxNihJMjQwME1fTDNMNF9WRVJTSU9OKTsKKworCS8qIENvcHkgdGhlIFRMVnMgKi8KKwlpdHIgPSBidWYgKyBzaXplb2YoKmNtZCk7CisJZm9yIChhcmdjID0gMDsgYXJnYyA8IGFyZ3M7IGFyZ2MrKykgeworCQl0bHZfaGRyID0gYXJnW2FyZ2NdOworCQl0bHZfc2l6ZSA9IHNpemVvZigqdGx2X2hkcikgKyBsZTE2X3RvX2NwdSh0bHZfaGRyLT5sZW5ndGgpOworCQltZW1jcHkoaXRyLCB0bHZfaGRyLCB0bHZfc2l6ZSk7CisJCWl0ciArPSB0bHZfc2l6ZTsKKwl9CisKKwkvKiBTZW5kIHRoZSBtZXNzYWdlISAqLworCWFja19za2IgPSBpMjQwMG1fbXNnX3RvX2RldihpMjQwMG0sIGJ1Ziwgc2l6ZW9mKCpjbWQpICsgYXJnc2l6ZSk7CisJcmVzdWx0ID0gUFRSX0VSUihhY2tfc2tiKTsKKwlpZiAoSVNfRVJSKGFja19za2IpKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGlzc3VlICdpbml0IGNvbmZpZycgY29tbWFuZDogJWRcbiIsCisJCQlyZXN1bHQpOworCisJCWdvdG8gZXJyb3JfbXNnX3RvX2RldjsKKwl9CisJcmVzdWx0ID0gaTI0MDBtX21zZ19jaGVja19zdGF0dXMod2ltYXhfbXNnX2RhdGEoYWNrX3NrYiksCisJCQkJCSBzdHJlcnIsIHNpemVvZihzdHJlcnIpKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZGV2X2VycihkZXYsICInaW5pdCBjb25maWcnICgweCUwNHgpIGNvbW1hbmQgZmFpbGVkOiAlZCAtICVzXG4iLAorCQkJSTI0MDBNX01UX1NFVF9JTklUX0NPTkZJRywgcmVzdWx0LCBzdHJlcnIpOworCWtmcmVlX3NrYihhY2tfc2tiKTsKK2Vycm9yX21zZ190b19kZXY6CisJa2ZyZWUoYnVmKTsKK2Vycm9yX2FsbG9jOgorbm9uZToKKwlkX2ZuZW5kKDMsIGRldiwgIihpMjQwMG0gJXAgYXJnICVwIGFyZ3MgJXp1KSA9ICVkXG4iLAorCQlpMjQwMG0sIGFyZywgYXJncywgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworCit9CitFWFBPUlRfU1lNQk9MX0dQTChpMjQwMG1fc2V0X2luaXRfY29uZmlnKTsKKworCisvKioKKyAqIGkyNDAwbV9kZXZfaW5pdGlhbGl6ZSAtIEluaXRpYWxpemUgdGhlIGRldmljZSBvbmNlIGNvbW11bmljYXRpb25zIGFyZSByZWFkeQorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKgorICogUmV0dXJuczogMCBpZiBvaywgPCAwIGVycm5vIGNvZGUgb24gZXJyb3IuCisgKgorICogQ29uZmlndXJlcyB0aGUgZGV2aWNlIHRvIHdvcmsgdGhlIHdheSB3ZSBsaWtlIGl0LgorICoKKyAqIEF0IHRoZSBwb2ludCBvZiB0aGlzIGNhbGwsIHRoZSBkZXZpY2UgaXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBXaU1BWAorICogYW5kIG5ldGRldiBzdGFja3MsIGZpcm13YXJlIGlzIHVwbG9hZGVkIGFuZCB3ZSBjYW4gdGFsayB0byB0aGUKKyAqIGRldmljZSBub3JtYWxseS4KKyAqLworaW50IGkyNDAwbV9kZXZfaW5pdGlhbGl6ZShzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJc3RydWN0IGkyNDAwbV90bHZfY29uZmlnX2lkbGVfcGFyYW1ldGVycyBpZGxlX3BhcmFtczsKKwljb25zdCBzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIgKmFyZ3NbOV07CisJdW5zaWduZWQgYXJnYyA9IDA7CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKGkyNDAwbSAlcClcbiIsIGkyNDAwbSk7CisJLyogVXNlbGVzcyBmb3Igbm93Li4ubWlnaHQgY2hhbmdlICovCisJaWYgKGkyNDAwbV9pZGxlX21vZGVfZGlzYWJsZWQpIHsKKwkJaWRsZV9wYXJhbXMuaGRyLnR5cGUgPQorCQkJY3B1X3RvX2xlMTYoSTI0MDBNX1RMVl9DT05GSUdfSURMRV9QQVJBTUVURVJTKTsKKwkJaWRsZV9wYXJhbXMuaGRyLmxlbmd0aCA9IGNwdV90b19sZTE2KAorCQkJc2l6ZW9mKGlkbGVfcGFyYW1zKSAtIHNpemVvZihpZGxlX3BhcmFtcy5oZHIpKTsKKwkJaWRsZV9wYXJhbXMuaWRsZV90aW1lb3V0ID0gMDsKKwkJaWRsZV9wYXJhbXMuaWRsZV9wYWdpbmdfaW50ZXJ2YWwgPSAwOworCQlhcmdzW2FyZ2MrK10gPSAmaWRsZV9wYXJhbXMuaGRyOworCX0KKwlyZXN1bHQgPSBpMjQwMG1fc2V0X2luaXRfY29uZmlnKGkyNDAwbSwgYXJncywgYXJnYyk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gZXJyb3I7CisJcmVzdWx0ID0gaTI0MDBtX2Zpcm13YXJlX2NoZWNrKGkyNDAwbSk7CS8qIGZ3IHZlcnNpb25zIG9rPyAqLworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIGVycm9yOworCS8qCisJICogVXBkYXRlIHN0YXRlOiBIZXJlIGl0IGp1c3QgY2FsbHMgYSBnZXQgc3RhdGU7IHBhcnNpbmcgdGhlCisJICogcmVzdWx0IChTeXN0ZW0gU3RhdGUgVExWIGFuZCBSRiBTdGF0dXMgVExWIFtkb25lIGluIHRoZSByeAorCSAqIHBhdGggaG9va3NdKSB3aWxsIHNldCB0aGUgaGFyZHdhcmUgYW5kIHNvZnR3YXJlIFJGLUtpbGwKKwkgKiBzdGF0dXMuCisJICovCisJcmVzdWx0ID0gaTI0MDBtX2NtZF9nZXRfc3RhdGUoaTI0MDBtKTsKK2Vycm9yOgorCWRfZm5lbmQoMywgZGV2LCAiKGkyNDAwbSAlcCkgPSAlZFxuIiwgaTI0MDBtLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKworLyoqCisgKiBpMjQwMG1fZGV2X3NodXRkb3duIC0gU2h1dGRvd24gYSBydW5uaW5nIGRldmljZQorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKgorICogR3JhY2VmdWxseSBzdG9wcyB0aGUgZGV2aWNlLCBtb3ZpbmcgaXQgdG8gdGhlIGxvd2VzdCBwb3dlcgorICogY29uc3VtcHRpb24gc3RhdGUgcG9zc2libGUuCisgKi8KK3ZvaWQgaTI0MDBtX2Rldl9zaHV0ZG93bihzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJaW50IHJlc3VsdCA9IC1FTk9ERVY7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCisJZF9mbnN0YXJ0KDMsIGRldiwgIihpMjQwMG0gJXApXG4iLCBpMjQwMG0pOworCXJlc3VsdCA9IGkyNDAwbS0+YnVzX3Jlc2V0KGkyNDAwbSwgSTI0MDBNX1JUX1dBUk0pOworCWRfZm5lbmQoMywgZGV2LCAiKGkyNDAwbSAlcCkgPSB2b2lkIFslZF1cbiIsIGkyNDAwbSwgcmVzdWx0KTsKKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vZGVidWctbGV2ZWxzLmggYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vZGVidWctbGV2ZWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE4M2JhYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9kZWJ1Zy1sZXZlbHMuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogSW50ZWwgV2lyZWxlc3MgV2lNQVggQ29ubmVjdGlvbiAyNDAwbQorICogRGVidWcgbGV2ZWxzIGNvbnRyb2wgZmlsZSBmb3IgdGhlIGkyNDAwbSBtb2R1bGUKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggSW50ZWwgQ29ycG9yYXRpb24gPGxpbnV4LXdpbWF4QGludGVsLmNvbT4KKyAqIEluYWt5IFBlcmV6LUdvbnphbGV6IDxpbmFreS5wZXJlei1nb256YWxlekBpbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisjaWZuZGVmIF9fZGVidWdfbGV2ZWxzX19oX18KKyNkZWZpbmUgX19kZWJ1Z19sZXZlbHNfX2hfXworCisvKiBNYXhpbXVtIGNvbXBpbGUgYW5kIHJ1biB0aW1lIGRlYnVnIGxldmVsIGZvciBhbGwgc3VibW9kdWxlcyAqLworI2RlZmluZSBEX01PRFVMRU5BTUUgaTI0MDBtCisjZGVmaW5lIERfTUFTVEVSIENPTkZJR19XSU1BWF9JMjQwME1fREVCVUdfTEVWRUwKKworI2luY2x1ZGUgPGxpbnV4L3dpbWF4L2RlYnVnLmg+CisKKy8qIExpc3Qgb2YgYWxsIHRoZSBlbmFibGVkIG1vZHVsZXMgKi8KK2VudW0gZF9tb2R1bGUgeworCURfU1VCTU9EVUxFX0RFQ0xBUkUoY29udHJvbCksCisJRF9TVUJNT0RVTEVfREVDTEFSRShkcml2ZXIpLAorCURfU1VCTU9EVUxFX0RFQ0xBUkUoZGVidWdmcyksCisJRF9TVUJNT0RVTEVfREVDTEFSRShmdyksCisJRF9TVUJNT0RVTEVfREVDTEFSRShuZXRkZXYpLAorCURfU1VCTU9EVUxFX0RFQ0xBUkUocmZraWxsKSwKKwlEX1NVQk1PRFVMRV9ERUNMQVJFKHJ4KSwKKwlEX1NVQk1PRFVMRV9ERUNMQVJFKHR4KSwKK307CisKKworI2VuZGlmIC8qICNpZm5kZWYgX19kZWJ1Z19sZXZlbHNfX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL2RlYnVnZnMuYyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9kZWJ1Z2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI2NjMyOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9kZWJ1Z2ZzLmMKQEAgLTAsMCArMSwzOTIgQEAKKy8qCisgKiBJbnRlbCBXaXJlbGVzcyBXaU1BWCBDb25uZWN0aW9uIDI0MDBtCisgKiBEZWJ1Z2ZzIGludGVyZmFjZXMgdG8gbWFuaXB1bGF0ZSBkcml2ZXIgYW5kIGRldmljZSBpbmZvcm1hdGlvbgorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgSW50ZWwgQ29ycG9yYXRpb24gPGxpbnV4LXdpbWF4QGludGVsLmNvbT4KKyAqIEluYWt5IFBlcmV6LUdvbnphbGV6IDxpbmFreS5wZXJlei1nb256YWxlekBpbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgImkyNDAwbS5oIgorCisKKyNkZWZpbmUgRF9TVUJNT0RVTEUgZGVidWdmcworI2luY2x1ZGUgImRlYnVnLWxldmVscy5oIgorCitzdGF0aWMKK2ludCBkZWJ1Z2ZzX25ldGRldl9xdWV1ZV9zdG9wcGVkX2dldCh2b2lkICpkYXRhLCB1NjQgKnZhbCkKK3sKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0gPSBkYXRhOworCSp2YWwgPSBuZXRpZl9xdWV1ZV9zdG9wcGVkKGkyNDAwbS0+d2ltYXhfZGV2Lm5ldF9kZXYpOworCXJldHVybiAwOworfQorREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUoZm9wc19uZXRkZXZfcXVldWVfc3RvcHBlZCwKKwkJCWRlYnVnZnNfbmV0ZGV2X3F1ZXVlX3N0b3BwZWRfZ2V0LAorCQkJTlVMTCwgIiVsbHVcbiIpOworCisKK3N0YXRpYworc3RydWN0IGRlbnRyeSAqZGVidWdmc19jcmVhdGVfbmV0ZGV2X3F1ZXVlX3N0b3BwZWQoCisJY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGRlbnRyeSAqcGFyZW50LCBzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJcmV0dXJuIGRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgMDQwMCwgcGFyZW50LCBpMjQwMG0sCisJCQkJICAgJmZvcHNfbmV0ZGV2X3F1ZXVlX3N0b3BwZWQpOworfQorCisKKy8qCisgKiBpbm9kZS0+aV9wcml2YXRlIGhhcyB0aGUgQGRhdGEgYXJndW1lbnQgdG8gZGVidWdmc19jcmVhdGVfZmlsZSgpCisgKi8KK3N0YXRpYworaW50IGkyNDAwbV9zdGF0c19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWZpbHAtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXZSBkb24ndCBhbGxvdyBwYXJ0aWFsIHJlYWRzIG9mIHRoaXMgZmlsZSwgYXMgdGhlbiB0aGUgcmVhZGVyIHdvdWxkCisgKiBnZXQgd2VpcmRseSBjb25mdXNlZCBkYXRhIGFzIGl0IGlzIHVwZGF0ZWQuCisgKgorICogU28gb3IgeW91IHJlYWQgaXQgYWxsIG9yIG5vdGhpbmc7IGlmIHlvdSB0cnkgdG8gcmVhZCB3aXRoIGFuIG9mZnNldAorICogIT0gMCwgd2UgY29uc2lkZXIgeW91IGFyZSBkb25lIHJlYWRpbmcuCisgKi8KK3N0YXRpYworc3NpemVfdCBpMjQwMG1fcnhfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWNoYXIgYnVmWzEyOF07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICgqcHBvcyAhPSAwKQorCQlyZXR1cm4gMDsKKwlpZiAoY291bnQgPCBzaXplb2YoYnVmKSkKKwkJcmV0dXJuIC1FTk9TUEM7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmkyNDAwbS0+cnhfbG9jaywgZmxhZ3MpOworCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIldSAldSAldSAldSAldSAldSAldVxuIiwKKwkJIGkyNDAwbS0+cnhfcGxfbnVtLCBpMjQwMG0tPnJ4X3BsX21pbiwKKwkJIGkyNDAwbS0+cnhfcGxfbWF4LCBpMjQwMG0tPnJ4X251bSwKKwkJIGkyNDAwbS0+cnhfc2l6ZV9hY2MsCisJCSBpMjQwMG0tPnJ4X3NpemVfbWluLCBpMjQwMG0tPnJ4X3NpemVfbWF4KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpMjQwMG0tPnJ4X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmZmVyLCBjb3VudCwgcHBvcywgYnVmLCBzdHJsZW4oYnVmKSk7Cit9CisKKworLyogQW55IHdyaXRlIGNsZWFycyB0aGUgc3RhdHMgKi8KK3N0YXRpYworc3NpemVfdCBpMjQwMG1fcnhfc3RhdHNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0gPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpMjQwMG0tPnJ4X2xvY2ssIGZsYWdzKTsKKwlpMjQwMG0tPnJ4X3BsX251bSA9IDA7CisJaTI0MDBtLT5yeF9wbF9tYXggPSAwOworCWkyNDAwbS0+cnhfcGxfbWluID0gVUlOVF9NQVg7CisJaTI0MDBtLT5yeF9udW0gPSAwOworCWkyNDAwbS0+cnhfc2l6ZV9hY2MgPSAwOworCWkyNDAwbS0+cnhfc2l6ZV9taW4gPSBVSU5UX01BWDsKKwlpMjQwMG0tPnJ4X3NpemVfbWF4ID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpMjQwMG0tPnJ4X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYworY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpMjQwMG1fcnhfc3RhdHNfZm9wcyA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkub3BlbiA9CQlpMjQwMG1fc3RhdHNfb3BlbiwKKwkucmVhZCA9CQlpMjQwMG1fcnhfc3RhdHNfcmVhZCwKKwkud3JpdGUgPQlpMjQwMG1fcnhfc3RhdHNfd3JpdGUsCit9OworCisKKy8qIFNlZSBpMjQwMG1fcnhfc3RhdHNfcmVhZCgpICovCitzdGF0aWMKK3NzaXplX3QgaTI0MDBtX3R4X3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpidWZmZXIsCisJCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpMjQwMG0gKmkyNDAwbSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwljaGFyIGJ1ZlsxMjhdOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoKnBwb3MgIT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKGNvdW50IDwgc2l6ZW9mKGJ1ZikpCisJCXJldHVybiAtRU5PU1BDOworCXNwaW5fbG9ja19pcnFzYXZlKCZpMjQwMG0tPnR4X2xvY2ssIGZsYWdzKTsKKwlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXUgJXUgJXUgJXUgJXUgJXUgJXVcbiIsCisJCSBpMjQwMG0tPnR4X3BsX251bSwgaTI0MDBtLT50eF9wbF9taW4sCisJCSBpMjQwMG0tPnR4X3BsX21heCwgaTI0MDBtLT50eF9udW0sCisJCSBpMjQwMG0tPnR4X3NpemVfYWNjLAorCQkgaTI0MDBtLT50eF9zaXplX21pbiwgaTI0MDBtLT50eF9zaXplX21heCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTI0MDBtLT50eF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZmZlciwgY291bnQsIHBwb3MsIGJ1Ziwgc3RybGVuKGJ1ZikpOworfQorCisvKiBBbnkgd3JpdGUgY2xlYXJzIHRoZSBzdGF0cyAqLworc3RhdGljCitzc2l6ZV90IGkyNDAwbV90eF9zdGF0c193cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpMjQwMG0gKmkyNDAwbSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmkyNDAwbS0+dHhfbG9jaywgZmxhZ3MpOworCWkyNDAwbS0+dHhfcGxfbnVtID0gMDsKKwlpMjQwMG0tPnR4X3BsX21heCA9IDA7CisJaTI0MDBtLT50eF9wbF9taW4gPSBVSU5UX01BWDsKKwlpMjQwMG0tPnR4X251bSA9IDA7CisJaTI0MDBtLT50eF9zaXplX2FjYyA9IDA7CisJaTI0MDBtLT50eF9zaXplX21pbiA9IFVJTlRfTUFYOworCWkyNDAwbS0+dHhfc2l6ZV9tYXggPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmkyNDAwbS0+dHhfbG9jaywgZmxhZ3MpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljCitjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGkyNDAwbV90eF9zdGF0c19mb3BzID0geworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5vcGVuID0JCWkyNDAwbV9zdGF0c19vcGVuLAorCS5yZWFkID0JCWkyNDAwbV90eF9zdGF0c19yZWFkLAorCS53cml0ZSA9CWkyNDAwbV90eF9zdGF0c193cml0ZSwKK307CisKKworLyogV3JpdGUgMSB0byBhc2sgdGhlIGRldmljZSB0byBnbyBpbnRvIHN1c3BlbmQgKi8KK3N0YXRpYworaW50IGRlYnVnZnNfaTI0MDBtX3N1c3BlbmRfc2V0KHZvaWQgKmRhdGEsIHU2NCB2YWwpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0gPSBkYXRhOworCXJlc3VsdCA9IGkyNDAwbV9jbWRfZW50ZXJfcG93ZXJzYXZlKGkyNDAwbSk7CisJaWYgKHJlc3VsdCA+PSAwKQorCQlyZXN1bHQgPSAwOworCXJldHVybiByZXN1bHQ7Cit9CitERUZJTkVfU0lNUExFX0FUVFJJQlVURShmb3BzX2kyNDAwbV9zdXNwZW5kLAorCQkJTlVMTCwgZGVidWdmc19pMjQwMG1fc3VzcGVuZF9zZXQsCisJCQkiJWxsdVxuIik7CisKK3N0YXRpYworc3RydWN0IGRlbnRyeSAqZGVidWdmc19jcmVhdGVfaTI0MDBtX3N1c3BlbmQoCisJY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGRlbnRyeSAqcGFyZW50LCBzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJcmV0dXJuIGRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgMDIwMCwgcGFyZW50LCBpMjQwMG0sCisJCQkJICAgJmZvcHNfaTI0MDBtX3N1c3BlbmQpOworfQorCisKKy8qCisgKiBSZXNldCB0aGUgZGV2aWNlCisgKgorICogV3JpdGUgMCB0byBhc2sgdGhlIGRldmljZSB0byBzb2Z0IHJlc2V0LCAxIHRvIGNvbGQgcmVzZXQsIDIgdG8gYnVzCisgKiByZXNldCAoYXMgZGVmaW5lZCBieSBlbnVtIGkyNDAwbV9yZXNldF90eXBlKS4KKyAqLworc3RhdGljCitpbnQgZGVidWdmc19pMjQwMG1fcmVzZXRfc2V0KHZvaWQgKmRhdGEsIHU2NCB2YWwpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0gPSBkYXRhOworCWVudW0gaTI0MDBtX3Jlc2V0X3R5cGUgcnQgPSB2YWw7CisJc3dpdGNoKHJ0KSB7CisJY2FzZSBJMjQwME1fUlRfV0FSTToKKwljYXNlIEkyNDAwTV9SVF9DT0xEOgorCWNhc2UgSTI0MDBNX1JUX0JVUzoKKwkJcmVzdWx0ID0gaTI0MDBtLT5idXNfcmVzZXQoaTI0MDBtLCBydCk7CisJCWlmIChyZXN1bHQgPj0gMCkKKwkJCXJlc3VsdCA9IDA7CisJZGVmYXVsdDoKKwkJcmVzdWx0ID0gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KK0RFRklORV9TSU1QTEVfQVRUUklCVVRFKGZvcHNfaTI0MDBtX3Jlc2V0LAorCQkJTlVMTCwgZGVidWdmc19pMjQwMG1fcmVzZXRfc2V0LAorCQkJIiVsbHVcbiIpOworCitzdGF0aWMKK3N0cnVjdCBkZW50cnkgKmRlYnVnZnNfY3JlYXRlX2kyNDAwbV9yZXNldCgKKwljb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsIHN0cnVjdCBpMjQwMG0gKmkyNDAwbSkKK3sKKwlyZXR1cm4gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCAwMjAwLCBwYXJlbnQsIGkyNDAwbSwKKwkJCQkgICAmZm9wc19pMjQwMG1fcmVzZXQpOworfQorCisvKgorICogRGVidWcgbGV2ZWxzIGNvbnRyb2w7IHNlZSBkZWJ1Zy5oCisgKi8KK3N0cnVjdCBkX2xldmVsIERfTEVWRUxbXSA9IHsKKwlEX1NVQk1PRFVMRV9ERUZJTkUoY29udHJvbCksCisJRF9TVUJNT0RVTEVfREVGSU5FKGRyaXZlciksCisJRF9TVUJNT0RVTEVfREVGSU5FKGRlYnVnZnMpLAorCURfU1VCTU9EVUxFX0RFRklORShmdyksCisJRF9TVUJNT0RVTEVfREVGSU5FKG5ldGRldiksCisJRF9TVUJNT0RVTEVfREVGSU5FKHJma2lsbCksCisJRF9TVUJNT0RVTEVfREVGSU5FKHJ4KSwKKwlEX1NVQk1PRFVMRV9ERUZJTkUodHgpLAorfTsKK3NpemVfdCBEX0xFVkVMX1NJWkUgPSBBUlJBWV9TSVpFKERfTEVWRUwpOworCisjZGVmaW5lIF9fZGVidWdmc19yZWdpc3RlcihwcmVmaXgsIG5hbWUsIHBhcmVudCkJCQlcCitkbyB7CQkJCQkJCQkJXAorCXJlc3VsdCA9IGRfbGV2ZWxfcmVnaXN0ZXJfZGVidWdmcyhwcmVmaXgsIG5hbWUsIHBhcmVudCk7CVwKKwlpZiAocmVzdWx0IDwgMCkJCQkJCQkJXAorCQlnb3RvIGVycm9yOwkJCQkJCVwKK30gd2hpbGUgKDApCisKKworaW50IGkyNDAwbV9kZWJ1Z2ZzX2FkZChzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gaTI0MDBtLT53aW1heF9kZXYuZGVidWdmc19kZW50cnk7CisJc3RydWN0IGRlbnRyeSAqZmQ7CisKKwlkZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImkyNDAwbSIsIGRlbnRyeSk7CisJcmVzdWx0ID0gUFRSX0VSUihkZW50cnkpOworCWlmIChJU19FUlIoZGVudHJ5KSkgeworCQlpZiAocmVzdWx0ID09IC1FTk9ERVYpCisJCQlyZXN1bHQgPSAwOwkvKiBObyBkZWJ1Z2ZzIHN1cHBvcnQgKi8KKwkJZ290byBlcnJvcjsKKwl9CisJaTI0MDBtLT5kZWJ1Z2ZzX2RlbnRyeSA9IGRlbnRyeTsKKwlfX2RlYnVnZnNfcmVnaXN0ZXIoImRsXyIsIGNvbnRyb2wsIGRlbnRyeSk7CisJX19kZWJ1Z2ZzX3JlZ2lzdGVyKCJkbF8iLCBkcml2ZXIsIGRlbnRyeSk7CisJX19kZWJ1Z2ZzX3JlZ2lzdGVyKCJkbF8iLCBkZWJ1Z2ZzLCBkZW50cnkpOworCV9fZGVidWdmc19yZWdpc3RlcigiZGxfIiwgZncsIGRlbnRyeSk7CisJX19kZWJ1Z2ZzX3JlZ2lzdGVyKCJkbF8iLCBuZXRkZXYsIGRlbnRyeSk7CisJX19kZWJ1Z2ZzX3JlZ2lzdGVyKCJkbF8iLCByZmtpbGwsIGRlbnRyeSk7CisJX19kZWJ1Z2ZzX3JlZ2lzdGVyKCJkbF8iLCByeCwgZGVudHJ5KTsKKwlfX2RlYnVnZnNfcmVnaXN0ZXIoImRsXyIsIHR4LCBkZW50cnkpOworCisJZmQgPSBkZWJ1Z2ZzX2NyZWF0ZV9zaXplX3QoInR4X2luIiwgMDQwMCwgZGVudHJ5LAorCQkJCSAgICZpMjQwMG0tPnR4X2luKTsKKwlyZXN1bHQgPSBQVFJfRVJSKGZkKTsKKwlpZiAoSVNfRVJSKGZkKSAmJiByZXN1bHQgIT0gLUVOT0RFVikgeworCQlkZXZfZXJyKGRldiwgIkNhbid0IGNyZWF0ZSBkZWJ1Z2ZzIGVudHJ5ICIKKwkJCSJ0eF9pbjogJWRcbiIsIHJlc3VsdCk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZmQgPSBkZWJ1Z2ZzX2NyZWF0ZV9zaXplX3QoInR4X291dCIsIDA0MDAsIGRlbnRyeSwKKwkJCQkgICAmaTI0MDBtLT50eF9vdXQpOworCXJlc3VsdCA9IFBUUl9FUlIoZmQpOworCWlmIChJU19FUlIoZmQpICYmIHJlc3VsdCAhPSAtRU5PREVWKSB7CisJCWRldl9lcnIoZGV2LCAiQ2FuJ3QgY3JlYXRlIGRlYnVnZnMgZW50cnkgIgorCQkJInR4X291dDogJWRcbiIsIHJlc3VsdCk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZmQgPSBkZWJ1Z2ZzX2NyZWF0ZV91MzIoInN0YXRlIiwgMDYwMCwgZGVudHJ5LAorCQkJCSZpMjQwMG0tPnN0YXRlKTsKKwlyZXN1bHQgPSBQVFJfRVJSKGZkKTsKKwlpZiAoSVNfRVJSKGZkKSAmJiByZXN1bHQgIT0gLUVOT0RFVikgeworCQlkZXZfZXJyKGRldiwgIkNhbid0IGNyZWF0ZSBkZWJ1Z2ZzIGVudHJ5ICIKKwkJCSJzdGF0ZTogJWRcbiIsIHJlc3VsdCk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyoKKwkgKiBUcmFjZSByZWNlaXZlZCBtZXNzYWdlcyBmcm9tIHVzZXIgc3BhY2UKKwkgKgorCSAqIEluIG9yZGVyIHRvIHRhcCB0aGUgYmlkaXJlY3Rpb25hbCBtZXNzYWdlIHN0cmVhbSBpbiB0aGUKKwkgKiAnbXNnJyBwaXBlLCB1c2VyIHNwYWNlIGNhbiByZWFkIGZyb20gdGhlICdtc2cnIHBpcGU7CisJICogaG93ZXZlciwgZHVlIHRvIGxpbWl0YXRpb25zIGluIGxpYm5sLCB3ZSBjYW4ndCBrbm93IHdoYXQKKwkgKiB0aGUgZGlmZmVyZW50IGFwcGxpY2F0aW9ucyBhcmUgc2VuZGluZyBkb3duIHRvIHRoZSBrZXJuZWwuCisJICoKKwkgKiBTbyB3ZSBoYXZlIHRoaXMgaGFjayB3aGVyZSB0aGUgZHJpdmVyIHdpbGwgZWNobyBhbnkgbWVzc2FnZQorCSAqIHJlY2VpdmVkIG9uIHRoZSBtc2cgcGlwZSBmcm9tIHVzZXIgc3BhY2UgW3Rocm91Z2ggYSBjYWxsIHRvCisJICogd2ltYXhfZGV2LT5vcF9tc2dfZnJvbV91c2VyKCkgaW50bworCSAqIGkyNDAwbV9vcF9tc2dfZnJvbV91c2VyKCldIGludG8gdGhlICd0cmFjZScgcGlwZSB0aGF0IHRoaXMKKwkgKiBkcml2ZXIgY3JlYXRlcy4KKwkgKgorCSAqIFNvIHRoZW4sIHJlYWRpbmcgZnJvbSBib3RoIHRoZSAndHJhY2UnIGFuZCAnbXNnJyBwaXBlcyBpbgorCSAqIHVzZXIgc3BhY2Ugd2lsbCBwcm92aWRlIGEgZnVsbCBkdW1wIG9mIHRoZSB0cmFmZmljLgorCSAqCisJICogV3JpdGUgMSB0byBhY3RpdmF0ZSwgMCB0byBjbGVhci4KKwkgKgorCSAqIEl0IGlzIG5vdCByZWFsbHkgdmVyeSBhdG9taWMsIGJ1dCBpdCBpcyBhbHNvIG5vdCB0b28KKwkgKiBjcml0aWNhbC4KKwkgKi8KKwlmZCA9IGRlYnVnZnNfY3JlYXRlX3U4KCJ0cmFjZV9tc2dfZnJvbV91c2VyIiwgMDYwMCwgZGVudHJ5LAorCQkJICAgICAgICZpMjQwMG0tPnRyYWNlX21zZ19mcm9tX3VzZXIpOworCXJlc3VsdCA9IFBUUl9FUlIoZmQpOworCWlmIChJU19FUlIoZmQpICYmIHJlc3VsdCAhPSAtRU5PREVWKSB7CisJCWRldl9lcnIoZGV2LCAiQ2FuJ3QgY3JlYXRlIGRlYnVnZnMgZW50cnkgIgorCQkJInRyYWNlX21zZ19mcm9tX3VzZXI6ICVkXG4iLCByZXN1bHQpOworCQlnb3RvIGVycm9yOworCX0KKworCWZkID0gZGVidWdmc19jcmVhdGVfbmV0ZGV2X3F1ZXVlX3N0b3BwZWQoIm5ldGRldl9xdWV1ZV9zdG9wcGVkIiwKKwkJCQkJCSBkZW50cnksIGkyNDAwbSk7CisJcmVzdWx0ID0gUFRSX0VSUihmZCk7CisJaWYgKElTX0VSUihmZCkgJiYgcmVzdWx0ICE9IC1FTk9ERVYpIHsKKwkJZGV2X2VycihkZXYsICJDYW4ndCBjcmVhdGUgZGVidWdmcyBlbnRyeSAiCisJCQkibmV0ZGV2X3F1ZXVlX3N0b3BwZWQ6ICVkXG4iLCByZXN1bHQpOworCQlnb3RvIGVycm9yOworCX0KKworCWZkID0gZGVidWdmc19jcmVhdGVfZmlsZSgicnhfc3RhdHMiLCAwNjAwLCBkZW50cnksIGkyNDAwbSwKKwkJCQkgJmkyNDAwbV9yeF9zdGF0c19mb3BzKTsKKwlyZXN1bHQgPSBQVFJfRVJSKGZkKTsKKwlpZiAoSVNfRVJSKGZkKSAmJiByZXN1bHQgIT0gLUVOT0RFVikgeworCQlkZXZfZXJyKGRldiwgIkNhbid0IGNyZWF0ZSBkZWJ1Z2ZzIGVudHJ5ICIKKwkJCSJyeF9zdGF0czogJWRcbiIsIHJlc3VsdCk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZmQgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJ0eF9zdGF0cyIsIDA2MDAsIGRlbnRyeSwgaTI0MDBtLAorCQkJCSAmaTI0MDBtX3R4X3N0YXRzX2ZvcHMpOworCXJlc3VsdCA9IFBUUl9FUlIoZmQpOworCWlmIChJU19FUlIoZmQpICYmIHJlc3VsdCAhPSAtRU5PREVWKSB7CisJCWRldl9lcnIoZGV2LCAiQ2FuJ3QgY3JlYXRlIGRlYnVnZnMgZW50cnkgIgorCQkJInR4X3N0YXRzOiAlZFxuIiwgcmVzdWx0KTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlmZCA9IGRlYnVnZnNfY3JlYXRlX2kyNDAwbV9zdXNwZW5kKCJzdXNwZW5kIiwgZGVudHJ5LCBpMjQwMG0pOworCXJlc3VsdCA9IFBUUl9FUlIoZmQpOworCWlmIChJU19FUlIoZmQpICYmIHJlc3VsdCAhPSAtRU5PREVWKSB7CisJCWRldl9lcnIoZGV2LCAiQ2FuJ3QgY3JlYXRlIGRlYnVnZnMgZW50cnkgc3VzcGVuZDogJWRcbiIsCisJCQlyZXN1bHQpOworCQlnb3RvIGVycm9yOworCX0KKworCWZkID0gZGVidWdmc19jcmVhdGVfaTI0MDBtX3Jlc2V0KCJyZXNldCIsIGRlbnRyeSwgaTI0MDBtKTsKKwlyZXN1bHQgPSBQVFJfRVJSKGZkKTsKKwlpZiAoSVNfRVJSKGZkKSAmJiByZXN1bHQgIT0gLUVOT0RFVikgeworCQlkZXZfZXJyKGRldiwgIkNhbid0IGNyZWF0ZSBkZWJ1Z2ZzIGVudHJ5IHJlc2V0OiAlZFxuIiwgcmVzdWx0KTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXN1bHQgPSAwOworZXJyb3I6CisJcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBpMjQwMG1fZGVidWdmc19ybShzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGkyNDAwbS0+ZGVidWdmc19kZW50cnkpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL2RyaXZlci5jIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL2RyaXZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmOTgwNDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vZHJpdmVyLmMKQEAgLTAsMCArMSw3MjggQEAKKy8qCisgKiBJbnRlbCBXaXJlbGVzcyBXaU1BWCBDb25uZWN0aW9uIDI0MDBtCisgKiBHZW5lcmljIHByb2JlL2Rpc2Nvbm5lY3QsIHJlc2V0IGFuZCBtZXNzYWdlIHBhc3NpbmcKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggSW50ZWwgQ29ycG9yYXRpb24gPGxpbnV4LXdpbWF4QGludGVsLmNvbT4KKyAqIEluYWt5IFBlcmV6LUdvbnphbGV6IDxpbmFreS5wZXJlei1nb256YWxlekBpbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqCisgKiBTZWUgaTI0MDBtLmggZm9yIGRyaXZlciBkb2N1bWVudGF0aW9uLiBUaGlzIGNvbnRhaW5zIGhlbHBlcnMgZm9yCisgKiB0aGUgZHJpdmVyIG1vZGVsIGdsdWUgW19zZXR1cCgpL19yZWxlYXNlKCldLCBoYW5kbGluZyBkZXZpY2UgcmVzZXRzCisgKiBbX2Rldl9yZXNldF9oYW5kbGUoKV0sIGFuZCB0aGUgYmFja2VuZHMgZm9yIHRoZSBXaU1BWCBzdGFjayBvcHMKKyAqIHJlc2V0IFtfb3BfcmVzZXQoKV0gYW5kIG1lc3NhZ2UgZnJvbSB1c2VyIFtfb3BfbXNnX2Zyb21fdXNlcigpXS4KKyAqCisgKiBST0FETUFQOgorICoKKyAqIGkyNDAwbV9vcF9tc2dfZnJvbV91c2VyKCkKKyAqICAgaTI0MDBtX21zZ190b19kZXYoKQorICogICB3aW1heF9tc2dfdG9fdXNlcl9zZW5kKCkKKyAqCisgKiBpMjQwMG1fb3BfcmVzZXQoKQorICogICBpMjQwbS0+YnVzX3Jlc2V0KCkKKyAqCisgKiBpMjQwMG1fZGV2X3Jlc2V0X2hhbmRsZSgpCisgKiAgIF9faTI0MDBtX2Rldl9yZXNldF9oYW5kbGUoKQorICogICAgIF9faTI0MDBtX2Rldl9zdG9wKCkKKyAqICAgICBfX2kyNDAwbV9kZXZfc3RhcnQoKQorICoKKyAqIGkyNDAwbV9zZXR1cCgpCisgKiAgIGkyNDAwbV9ib290cm9tX2luaXQoKQorICogICByZWdpc3Rlcl9uZXRkZXYoKQorICogICBpMjQwMG1fZGV2X3N0YXJ0KCkKKyAqICAgICBfX2kyNDAwbV9kZXZfc3RhcnQoKQorICogICAgICAgaTI0MDBtX2Rldl9ib290c3RyYXAoKQorICogICAgICAgaTI0MDBtX3R4X3NldHVwKCkKKyAqICAgICAgIGkyNDAwbS0+YnVzX2Rldl9zdGFydCgpCisgKiAgICAgICBpMjQwMG1fY2hlY2tfbWFjX2FkZHIoKQorICogICB3aW1heF9kZXZfYWRkKCkKKyAqCisgKiBpMjQwMG1fcmVsZWFzZSgpCisgKiAgIHdpbWF4X2Rldl9ybSgpCisgKiAgIGkyNDAwbV9kZXZfc3RvcCgpCisgKiAgICAgX19pMjQwMG1fZGV2X3N0b3AoKQorICogICAgICAgaTI0MDBtX2Rldl9zaHV0ZG93bigpCisgKiAgICAgICBpMjQwMG0tPmJ1c19kZXZfc3RvcCgpCisgKiAgICAgICBpMjQwMG1fdHhfcmVsZWFzZSgpCisgKiAgIHVucmVnaXN0ZXJfbmV0ZGV2KCkKKyAqLworI2luY2x1ZGUgImkyNDAwbS5oIgorI2luY2x1ZGUgPGxpbnV4L3dpbWF4L2kyNDAwbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisKKyNkZWZpbmUgRF9TVUJNT0RVTEUgZHJpdmVyCisjaW5jbHVkZSAiZGVidWctbGV2ZWxzLmgiCisKKworaW50IGkyNDAwbV9pZGxlX21vZGVfZGlzYWJsZWQ7CS8qIDAgKGlkbGUgbW9kZSBlbmFibGVkKSBieSBkZWZhdWx0ICovCittb2R1bGVfcGFyYW1fbmFtZWQoaWRsZV9tb2RlX2Rpc2FibGVkLCBpMjQwMG1faWRsZV9tb2RlX2Rpc2FibGVkLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhpZGxlX21vZGVfZGlzYWJsZWQsCisJCSAiSWYgdHJ1ZSwgdGhlIGRldmljZSB3aWxsIG5vdCBlbmFibGUgaWRsZSBtb2RlIG5lZ290aWF0aW9uICIKKwkJICJ3aXRoIHRoZSBiYXNlIHN0YXRpb24gKHdoZW4gY29ubmVjdGVkKSB0byBzYXZlIHBvd2VyLiIpOworCisvKioKKyAqIGkyNDAwbV9xdWV1ZV93b3JrIC0gc2NoZWR1bGUgd29yayBvbiBhIGkyNDAwbSdzIHF1ZXVlCisgKgorICogQGkyNDAwbTogZGV2aWNlIGRlc2NyaXB0b3IKKyAqCisgKiBAZm46IGZ1bmN0aW9uIHRvIHJ1biB0byBleGVjdXRlIHdvcmsuIEl0IGdldHMgcGFzc2VkIGEgJ3N0cnVjdAorICogICAgIHdvcmtfc3RydWN0JyB0aGF0IGlzIHdyYXBwZWQgaW4gYSAnc3RydWN0IGkyNDAwbV93b3JrJy4gT25jZQorICogICAgIGRvbmUsIHlvdSBoYXZlIHRvICgxKSBpMjQwMG1fcHV0KGkyNDAwbV93b3JrLT5pMjQwMG0pIGFuZCB0aGVuCisgKiAgICAgKDIpIGtmcmVlKGkyNDAwbV93b3JrKS4KKyAqCisgKiBAZ2ZwX2ZsYWdzOiBHRlAgZmxhZ3MgZm9yIG1lbW9yeSBhbGxvY2F0aW9uLgorICoKKyAqIEBwbDogcG9pbnRlciB0byBhIHBheWxvYWQgYnVmZmVyIHRoYXQgeW91IHdhbnQgdG8gcGFzcyB0byB0aGUgX3dvcmsKKyAqICAgICBmdW5jdGlvbi4gVXNlIHRoaXMgdG8gcGFjayAoZm9yIGV4YW1wbGUpIGEgc3RydWN0IHdpdGggZXh0cmEKKyAqICAgICBhcmd1bWVudHMuCisgKgorICogQHBsX3NpemU6IHNpemUgb2YgdGhlIHBheWxvYWQgYnVmZmVyLgorICoKKyAqIFdlIGRvIHRoaXMgcXVpdGUgb2Z0ZW4sIHNvIHRoaXMganVzdCBzYXZlcyB0eXBpbmc7IGFsbG9jYXRlIGEKKyAqIHdyYXBwZXIgZm9yIGEgaTI0MDBtLCBnZXQgYSByZWYgdG8gaXQsIHBhY2sgYXJndW1lbnRzIGFuZCBsYXVuY2gKKyAqIHRoZSB3b3JrLgorICoKKyAqIEEgdXN1YWwgd29ya2Zsb3cgaXM6CisgKgorICogc3RydWN0IG15X3dvcmtfYXJncyB7CisgKiAgICAgICAgIHZvaWQgKnNvbWV0aGluZzsKKyAqICAgICAgICAgaW50IHdoYXRldmVyOworICogfTsKKyAqIC4uLgorICoKKyAqIHN0cnVjdCBteV93b3JrX2FyZ3MgbXlfYXJncyA9IHsKKyAqICAgICAgICAgLnNvbWV0aGluZyA9IEZPTywKKyAqICAgICAgICAgLndoYWV0ZXZlciA9IEJMQUgKKyAqIH07CisgKiBpMjQwMG1fcXVldWVfd29yayhpMjQwMG0sIDEsIG15X3dvcmtfZnVuY3Rpb24sIEdGUF9LRVJORUwsCisgKiAgICAgICAgICAgICAgICAgICAmYXJncywgc2l6ZW9mKGFyZ3MpKQorICoKKyAqIEFuZCBub3cgdGhlIHdvcmsgZnVuY3Rpb24gY2FuIHVucGFjayB0aGUgYXJndW1lbnRzIGFuZCBjYWxsIHRoZQorICogcmVhbCBmdW5jdGlvbiAob3IgZG8gdGhlIGpvYiBpdHNlbGYpOgorICoKKyAqIHN0YXRpYworICogdm9pZCBteV93b3JrX2ZuKChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndzKQorICogeworICogICAgICAgICBzdHJ1Y3QgaTI0MDBtX3dvcmsgKml3ID0KKyAqCSAgICAgICAgICAgY29udGFpbmVyX29mKHdzLCBzdHJ1Y3QgaTI0MDBtX3dvcmssIHdzKTsKKyAqCSAgIHN0cnVjdCBteV93b3JrX2FyZ3MgKm15X2FyZ3MgPSAodm9pZCAqKSBpdy0+cGw7CisgKgorICoJICAgbXlfd29yayhpdy0+aTI0MDBtLCBteV9hcmdzLT5zb21ldGhpbmcsIG15X2FyZ3MtPndoYXRldmVydCk7CisgKiB9CisgKi8KK2ludCBpMjQwMG1fcXVldWVfd29yayhzdHJ1Y3QgaTI0MDBtICppMjQwMG0sCisJCSAgICAgIHZvaWQgKCpmbikoc3RydWN0IHdvcmtfc3RydWN0ICopLCBnZnBfdCBnZnBfZmxhZ3MsCisJCSAgICAgIGNvbnN0IHZvaWQgKnBsLCBzaXplX3QgcGxfc2l6ZSkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBpMjQwMG1fd29yayAqaXc7CisKKwlCVUdfT04oaTI0MDBtLT53b3JrX3F1ZXVlID09IE5VTEwpOworCXJlc3VsdCA9IC1FTk9NRU07CisJaXcgPSBremFsbG9jKHNpemVvZigqaXcpICsgcGxfc2l6ZSwgZ2ZwX2ZsYWdzKTsKKwlpZiAoaXcgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9remFsbG9jOworCWl3LT5pMjQwMG0gPSBpMjQwMG1fZ2V0KGkyNDAwbSk7CisJbWVtY3B5KGl3LT5wbCwgcGwsIHBsX3NpemUpOworCUlOSVRfV09SSygmaXctPndzLCBmbik7CisJcmVzdWx0ID0gcXVldWVfd29yayhpMjQwMG0tPndvcmtfcXVldWUsICZpdy0+d3MpOworZXJyb3Jfa3phbGxvYzoKKwlyZXR1cm4gcmVzdWx0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoaTI0MDBtX3F1ZXVlX3dvcmspOworCisKKy8qCisgKiBTY2hlZHVsZSBpMjQwMG0ncyBzcGVjaWZpYyB3b3JrIG9uIHRoZSBzeXN0ZW0ncyBxdWV1ZS4KKyAqCisgKiBVc2VkIGZvciBhIGZldyBjYXNlcyB3aGVyZSB3ZSByZWFsbHkgbmVlZCBpdDsgb3RoZXJ3aXNlLCBpZGVudGljYWwKKyAqIHRvIGkyNDAwbV9xdWV1ZV93b3JrKCkuCisgKgorICogUmV0dXJucyA8IDAgZXJybm8gY29kZSBvbiBlcnJvciwgMSBpZiBvay4KKyAqCisgKiBJZiBpdCByZXR1cm5zIHplcm8sIHNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbmVkLCBhcyBpdCBtZWFucyB0aGUKKyAqIHdvcmtzIHN0cnVjdCB3YXMgYWxyZWFkeSBxdWV1ZWQsIGJ1dCB3ZSBoYXZlIGp1c3QgYWxsb2NhdGVkIGl0LCBzbworICogaXQgc2hvdWxkIG5vdCBoYXBwZW4uCisgKi8KK2ludCBpMjQwMG1fc2NoZWR1bGVfd29yayhzdHJ1Y3QgaTI0MDBtICppMjQwMG0sCisJCQkgdm9pZCAoKmZuKShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKiksIGdmcF90IGdmcF9mbGFncykKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBpMjQwMG1fd29yayAqaXc7CisKKwlCVUdfT04oaTI0MDBtLT53b3JrX3F1ZXVlID09IE5VTEwpOworCXJlc3VsdCA9IC1FTk9NRU07CisJaXcgPSBremFsbG9jKHNpemVvZigqaXcpLCBnZnBfZmxhZ3MpOworCWlmIChpdyA9PSBOVUxMKQorCQlnb3RvIGVycm9yX2t6YWxsb2M7CisJaXctPmkyNDAwbSA9IGkyNDAwbV9nZXQoaTI0MDBtKTsKKwlJTklUX1dPUksoJml3LT53cywgZm4pOworCXJlc3VsdCA9IHNjaGVkdWxlX3dvcmsoJml3LT53cyk7CisJaWYgKHJlc3VsdCA9PSAwKQorCQlyZXN1bHQgPSAtRU5YSU87CitlcnJvcl9remFsbG9jOgorCXJldHVybiByZXN1bHQ7Cit9CisKKworLyoKKyAqIFdpTUFYIHN0YWNrIG9wZXJhdGlvbjogcmVsYXkgYSBtZXNzYWdlIGZyb20gdXNlciBzcGFjZQorICoKKyAqIEB3aW1heF9kZXY6IGRldmljZSBkZXNjcmlwdG9yCisgKiBAcGlwZV9uYW1lOiBuYW1lZCBwaXBlIHRoZSBtZXNzYWdlIGlzIGZvcgorICogQG1zZ19idWY6IHBvaW50ZXIgdG8gdGhlIG1lc3NhZ2UgYnl0ZXMKKyAqIEBtc2dfbGVuOiBsZW5ndGggb2YgdGhlIGJ1ZmZlcgorICogQGdlbmxfaW5mbzogcGFzc2VkIGJ5IHRoZSBnZW5lcmljIG5ldGxpbmsgbGF5ZXIKKyAqCisgKiBUaGUgV2lNQVggc3RhY2sgd2lsbCBjYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiBhIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkCisgKiBmcm9tIHVzZXIgc3BhY2UuCisgKgorICogRm9yIHRoZSBpMjQwMG0sIHRoaXMgaXMgYW4gTDNMNCBtZXNzYWdlLCBhcyBzcGVjaWZpZWQgaW4KKyAqIGluY2x1ZGUvbGludXgvd2ltYXgvaTI0MDBtLmgsIGFuZCB0aHVzIHByZWZpeGVkIHdpdGggYSAnc3RydWN0CisgKiBpMjQwMG1fbDNsNF9oZHInLiBEcml2ZXIgKGFuZCBkZXZpY2UpIGV4cGVjdCB0aGUgbWVzc2FnZXMgdG8gYmUKKyAqIGNvZGVkIGluIExpdHRsZSBFbmRpYW4uCisgKgorICogVGhpcyBmdW5jdGlvbiBqdXN0IHZlcmlmaWVzIHRoYXQgdGhlIGhlYWRlciBkZWNsYXJhdGlvbiBhbmQgdGhlCisgKiBwYXlsb2FkIGFyZSBjb25zaXN0ZW50IGFuZCB0aGVuIGRlYWxzIHdpdGggaXQsIGVpdGhlciBmb3J3YXJkaW5nIGl0CisgKiB0byB0aGUgZGV2aWNlIG9yIHByb2Nlc2luZyBpdCBsb2NhbGx5LgorICoKKyAqIEluIHRoZSBpMjQwMG0sIG1lc3NhZ2VzIGFyZSBiYXNpY2FsbHkgY29tbWFuZHMgdGhhdCB3aWxsIGNhcnJ5IGFuCisgKiBhY2ssIHNvIHdlIHVzZSBpMjQwMG1fbXNnX3RvX2RldigpIGFuZCB0aGVuIGRlbGl2ZXIgdGhlIGFjayBiYWNrIHRvCisgKiB1c2VyIHNwYWNlLiBUaGUgcnguYyBjb2RlIG1pZ2h0IGludGVyY2VwdCB0aGUgcmVzcG9uc2UgYW5kIHVzZSBpdAorICogdG8gdXBkYXRlIHRoZSBkcml2ZXIncyBzdGF0ZSwgYnV0IHRoZW4gaXQgd2lsbCBwYXNzIGl0IG9uIHNvIGl0IGNhbgorICogYmUgcmVsYXllZCBiYWNrIHRvIHVzZXIgc3BhY2UuCisgKgorICogTm90ZSB0aGF0IGFzeW5jaHJvbm91cyBldmVudHMgZnJvbSB0aGUgZGV2aWNlIGFyZSBwcm9jZXNzZWQgYW5kCisgKiBzZW50IHRvIHVzZXIgc3BhY2UgaW4gcnguYy4KKyAqLworc3RhdGljCitpbnQgaTI0MDBtX29wX21zZ19mcm9tX3VzZXIoc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2LAorCQkJICAgIGNvbnN0IGNoYXIgKnBpcGVfbmFtZSwKKwkJCSAgICBjb25zdCB2b2lkICptc2dfYnVmLCBzaXplX3QgbXNnX2xlbiwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgZ2VubF9pbmZvICpnZW5sX2luZm8pCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0gPSB3aW1heF9kZXZfdG9faTI0MDBtKHdpbWF4X2Rldik7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXN0cnVjdCBza19idWZmICphY2tfc2tiOworCisJZF9mbnN0YXJ0KDQsIGRldiwgIih3aW1heF9kZXYgJXAgW2kyNDAwbSAlcF0gbXNnX2J1ZiAlcCAiCisJCSAgIm1zZ19sZW4gJXp1IGdlbmxfaW5mbyAlcClcbiIsIHdpbWF4X2RldiwgaTI0MDBtLAorCQkgIG1zZ19idWYsIG1zZ19sZW4sIGdlbmxfaW5mbyk7CisJYWNrX3NrYiA9IGkyNDAwbV9tc2dfdG9fZGV2KGkyNDAwbSwgbXNnX2J1ZiwgbXNnX2xlbik7CisJcmVzdWx0ID0gUFRSX0VSUihhY2tfc2tiKTsKKwlpZiAoSVNfRVJSKGFja19za2IpKQorCQlnb3RvIGVycm9yX21zZ190b19kZXY7CisJaWYgKHVubGlrZWx5KGkyNDAwbS0+dHJhY2VfbXNnX2Zyb21fdXNlcikpCisJCXdpbWF4X21zZygmaTI0MDBtLT53aW1heF9kZXYsICJ0cmFjZSIsCisJCQkgIG1zZ19idWYsIG1zZ19sZW4sIEdGUF9LRVJORUwpOworCXJlc3VsdCA9IHdpbWF4X21zZ19zZW5kKCZpMjQwMG0tPndpbWF4X2RldiwgYWNrX3NrYik7CitlcnJvcl9tc2dfdG9fZGV2OgorCWRfZm5lbmQoNCwgZGV2LCAiKHdpbWF4X2RldiAlcCBbaTI0MDBtICVwXSBtc2dfYnVmICVwIG1zZ19sZW4gJXp1ICIKKwkJImdlbmxfaW5mbyAlcCkgPSAlZFxuIiwgd2ltYXhfZGV2LCBpMjQwMG0sIG1zZ19idWYsIG1zZ19sZW4sCisJCWdlbmxfaW5mbywgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKiBDb250ZXh0IHRvIHdhaXQgZm9yIGEgcmVzZXQgdG8gZmluYWxpemUKKyAqLworc3RydWN0IGkyNDAwbV9yZXNldF9jdHggeworCXN0cnVjdCBjb21wbGV0aW9uIGNvbXBsZXRpb247CisJaW50IHJlc3VsdDsKK307CisKKworLyoKKyAqIFdpTUFYIHN0YWNrIG9wZXJhdGlvbjogcmVzZXQgYSBkZXZpY2UKKyAqCisgKiBAd2ltYXhfZGV2OiBkZXZpY2UgZGVzY3JpcHRvcgorICoKKyAqIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3Igd2ltYXhfcmVzZXQoKSBhbmQgd2ltYXhfZGV2LT5vcF9yZXNldCBmb3IKKyAqIHRoZSByZXF1aXJlbWVudHMgb2YgdGhpcyBmdW5jdGlvbi4gVGhlIFdpTUFYIHN0YWNrIGd1YXJhbnRlZXMKKyAqIHNlcmlhbGl6YXRpb24gb24gY2FsbHMgdG8gdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBEbyBhIHdhcm0gcmVzZXQgb24gdGhlIGRldmljZTsgaWYgaXQgZmFpbHMsIHJlc29ydCB0byBhIGNvbGQgcmVzZXQKKyAqIGFuZCByZXR1cm4gLUVOT0RFVi4gT24gc3VjY2Vzc2Z1bCB3YXJtIHJlc2V0LCB3ZSBuZWVkIHRvIGJsb2NrCisgKiB1bnRpbCBpdCBpcyBjb21wbGV0ZS4KKyAqCisgKiBUaGUgYnVzLWRyaXZlciBpbXBsZW1lbnRhdGlvbiBvZiByZXNldCB0YWtlcyBjYXJlIG9mIGZhbGxpbmcgYmFjaworICogdG8gY29sZCByZXNldCBpZiB3YXJtIGZhaWxzLgorICovCitzdGF0aWMKK2ludCBpMjQwMG1fb3BfcmVzZXQoc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2KQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gd2ltYXhfZGV2X3RvX2kyNDAwbSh3aW1heF9kZXYpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlzdHJ1Y3QgaTI0MDBtX3Jlc2V0X2N0eCBjdHggPSB7CisJCS5jb21wbGV0aW9uID0gQ09NUExFVElPTl9JTklUSUFMSVpFUl9PTlNUQUNLKGN0eC5jb21wbGV0aW9uKSwKKwkJLnJlc3VsdCA9IDAsCisJfTsKKworCWRfZm5zdGFydCg0LCBkZXYsICIod2ltYXhfZGV2ICVwKVxuIiwgd2ltYXhfZGV2KTsKKwltdXRleF9sb2NrKCZpMjQwMG0tPmluaXRfbXV0ZXgpOworCWkyNDAwbS0+cmVzZXRfY3R4ID0gJmN0eDsKKwltdXRleF91bmxvY2soJmkyNDAwbS0+aW5pdF9tdXRleCk7CisJcmVzdWx0ID0gaTI0MDBtLT5idXNfcmVzZXQoaTI0MDBtLCBJMjQwME1fUlRfV0FSTSk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gb3V0OworCXJlc3VsdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmY3R4LmNvbXBsZXRpb24sIDQqSFopOworCWlmIChyZXN1bHQgPT0gMCkKKwkJcmVzdWx0ID0gLUVUSU1FRE9VVDsKKwllbHNlIGlmIChyZXN1bHQgPiAwKQorCQlyZXN1bHQgPSBjdHgucmVzdWx0OworCS8qIGlmIHJlc3VsdCA8IDAsIHBhc3MgaXQgb24gKi8KKwltdXRleF9sb2NrKCZpMjQwMG0tPmluaXRfbXV0ZXgpOworCWkyNDAwbS0+cmVzZXRfY3R4ID0gTlVMTDsKKwltdXRleF91bmxvY2soJmkyNDAwbS0+aW5pdF9tdXRleCk7CitvdXQ6CisJZF9mbmVuZCg0LCBkZXYsICIod2ltYXhfZGV2ICVwKSA9ICVkXG4iLCB3aW1heF9kZXYsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICogQ2hlY2sgdGhlIE1BQyBhZGRyZXNzIHdlIGdvdCBmcm9tIGJvb3QgbW9kZSBpcyBvaworICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKgorICogUmV0dXJuczogMCBpZiBvaywgPCAwIGVycm5vIGNvZGUgb24gZXJyb3IuCisgKi8KK3N0YXRpYworaW50IGkyNDAwbV9jaGVja19tYWNfYWRkcihzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwljb25zdCBzdHJ1Y3QgaTI0MDBtX3Rsdl9kZXRhaWxlZF9kZXZpY2VfaW5mbyAqZGRpOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gaTI0MDBtLT53aW1heF9kZXYubmV0X2RldjsKKwljb25zdCB1bnNpZ25lZCBjaGFyIHplcm9tYWNbRVRIX0FMRU5dID0geyAwIH07CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKGkyNDAwbSAlcClcbiIsIGkyNDAwbSk7CisJc2tiID0gaTI0MDBtX2dldF9kZXZpY2VfaW5mbyhpMjQwMG0pOworCWlmIChJU19FUlIoc2tiKSkgeworCQlyZXN1bHQgPSBQVFJfRVJSKHNrYik7CisJCWRldl9lcnIoZGV2LCAiQ2Fubm90IHZlcmlmeSBNQUMgYWRkcmVzcywgZXJyb3IgcmVhZGluZzogJWRcbiIsCisJCQlyZXN1bHQpOworCQlnb3RvIGVycm9yOworCX0KKwkvKiBFeHRyYWN0IE1BQyBhZGRyZXNzcyAqLworCWRkaSA9ICh2b2lkICopIHNrYi0+ZGF0YTsKKwlCVUlMRF9CVUdfT04oRVRIX0FMRU4gIT0gc2l6ZW9mKGRkaS0+bWFjX2FkZHJlc3MpKTsKKwlkX3ByaW50ZigyLCBkZXYsICJHRVQgREVWSUNFIElORk86IG1hYyBhZGRyICIKKwkJICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJIGRkaS0+bWFjX2FkZHJlc3NbMF0sIGRkaS0+bWFjX2FkZHJlc3NbMV0sCisJCSBkZGktPm1hY19hZGRyZXNzWzJdLCBkZGktPm1hY19hZGRyZXNzWzNdLAorCQkgZGRpLT5tYWNfYWRkcmVzc1s0XSwgZGRpLT5tYWNfYWRkcmVzc1s1XSk7CisJaWYgKCFtZW1jbXAobmV0X2Rldi0+cGVybV9hZGRyLCBkZGktPm1hY19hZGRyZXNzLAorCQkgICBzaXplb2YoZGRpLT5tYWNfYWRkcmVzcykpKQorCQlnb3RvIG9rOworCWRldl93YXJuKGRldiwgIndhcm5pbmc6IGRldmljZSByZXBvcnRzIGEgZGlmZmVyZW50IE1BQyBhZGRyZXNzICIKKwkJICJ0byB0aGF0IG9mIGJvb3QgbW9kZSdzXG4iKTsKKwlkZXZfd2FybihkZXYsICJkZXZpY2UgcmVwb3J0cyAgICAgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCSBkZGktPm1hY19hZGRyZXNzWzBdLCBkZGktPm1hY19hZGRyZXNzWzFdLAorCQkgZGRpLT5tYWNfYWRkcmVzc1syXSwgZGRpLT5tYWNfYWRkcmVzc1szXSwKKwkJIGRkaS0+bWFjX2FkZHJlc3NbNF0sIGRkaS0+bWFjX2FkZHJlc3NbNV0pOworCWRldl93YXJuKGRldiwgImJvb3QgbW9kZSByZXBvcnRlZCAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJIG5ldF9kZXYtPnBlcm1fYWRkclswXSwgbmV0X2Rldi0+cGVybV9hZGRyWzFdLAorCQkgbmV0X2Rldi0+cGVybV9hZGRyWzJdLCBuZXRfZGV2LT5wZXJtX2FkZHJbM10sCisJCSBuZXRfZGV2LT5wZXJtX2FkZHJbNF0sIG5ldF9kZXYtPnBlcm1fYWRkcls1XSk7CisJaWYgKCFtZW1jbXAoemVyb21hYywgZGRpLT5tYWNfYWRkcmVzcywgc2l6ZW9mKHplcm9tYWMpKSkKKwkJZGV2X2VycihkZXYsICJkZXZpY2UgcmVwb3J0cyBhbiBpbnZhbGlkIE1BQyBhZGRyZXNzLCAiCisJCQkibm90IHVwZGF0aW5nXG4iKTsKKwllbHNlIHsKKwkJZGV2X3dhcm4oZGV2LCAidXBkYXRpbmcgTUFDIGFkZHJlc3NcbiIpOworCQluZXRfZGV2LT5hZGRyX2xlbiA9IEVUSF9BTEVOOworCQltZW1jcHkobmV0X2Rldi0+cGVybV9hZGRyLCBkZGktPm1hY19hZGRyZXNzLCBFVEhfQUxFTik7CisJCW1lbWNweShuZXRfZGV2LT5kZXZfYWRkciwgZGRpLT5tYWNfYWRkcmVzcywgRVRIX0FMRU4pOworCX0KK29rOgorCXJlc3VsdCA9IDA7CisJa2ZyZWVfc2tiKHNrYik7CitlcnJvcjoKKwlkX2ZuZW5kKDMsIGRldiwgIihpMjQwMG0gJXApID0gJWRcbiIsIGkyNDAwbSwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qKgorICogX19pMjQwMG1fZGV2X3N0YXJ0IC0gQnJpbmcgdXAgZHJpdmVyIGNvbW11bmljYXRpb24gd2l0aCB0aGUgZGV2aWNlCisgKgorICogQGkyNDAwbTogZGV2aWNlIGRlc2NyaXB0b3IKKyAqIEBmbGFnczogYm9vdCBtb2RlIGZsYWdzCisgKgorICogUmV0dXJuczogMCBpZiBvaywgPCAwIGVycm5vIGNvZGUgb24gZXJyb3IuCisgKgorICogVXBsb2FkcyBmaXJtd2FyZSBhbmQgYnJpbmdzIHVwIGFsbCB0aGUgcmVzb3VyY2VzIG5lZWRlZCB0byBiZSBhYmxlCisgKiB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBkZXZpY2UuCisgKgorICogVFggbmVlZHMgdG8gYmUgc2V0dXAgYmVmb3JlIHRoZSBidXMtc3BlY2lmaWMgY29kZSAob3RoZXJ3aXNlIG9uCisgKiBzaHV0ZG93biwgdGhlIGJ1cy10eCBjb2RlIGNvdWxkIHRyeSB0byBhY2Nlc3MgaXQpLgorICovCitzdGF0aWMKK2ludCBfX2kyNDAwbV9kZXZfc3RhcnQoc3RydWN0IGkyNDAwbSAqaTI0MDBtLCBlbnVtIGkyNDAwbV9icmkgZmxhZ3MpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYgPSAmaTI0MDBtLT53aW1heF9kZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSB3aW1heF9kZXYtPm5ldF9kZXY7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCWludCB0aW1lcyA9IDM7CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKGkyNDAwbSAlcClcbiIsIGkyNDAwbSk7CityZXRyeToKKwlyZXN1bHQgPSBpMjQwMG1fZGV2X2Jvb3RzdHJhcChpMjQwMG0sIGZsYWdzKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImNhbm5vdCBib290c3RyYXAgZGV2aWNlOiAlZFxuIiwgcmVzdWx0KTsKKwkJZ290byBlcnJvcl9ib290c3RyYXA7CisJfQorCXJlc3VsdCA9IGkyNDAwbV90eF9zZXR1cChpMjQwMG0pOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIGVycm9yX3R4X3NldHVwOworCXJlc3VsdCA9IGkyNDAwbS0+YnVzX2Rldl9zdGFydChpMjQwMG0pOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIGVycm9yX2J1c19kZXZfc3RhcnQ7CisJaTI0MDBtLT53b3JrX3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUod2ltYXhfZGV2LT5uYW1lKTsKKwlpZiAoaTI0MDBtLT53b3JrX3F1ZXVlID09IE5VTEwpIHsKKwkJcmVzdWx0ID0gLUVOT01FTTsKKwkJZGV2X2VycihkZXYsICJjYW5ub3QgY3JlYXRlIHdvcmtxdWV1ZVxuIik7CisJCWdvdG8gZXJyb3JfY3JlYXRlX3dvcmtxdWV1ZTsKKwl9CisJLyogQXQgdGhpcyBwb2ludCBpcyBvayB0byBzZW5kIGNvbW1hbmRzIHRvIHRoZSBkZXZpY2UgKi8KKwlyZXN1bHQgPSBpMjQwMG1fY2hlY2tfbWFjX2FkZHIoaTI0MDBtKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBlcnJvcl9jaGVja19tYWNfYWRkcjsKKwlpMjQwMG0tPnJlYWR5ID0gMTsKKwl3aW1heF9zdGF0ZV9jaGFuZ2Uod2ltYXhfZGV2LCBXSU1BWF9TVF9VTklOSVRJQUxJWkVEKTsKKwlyZXN1bHQgPSBpMjQwMG1fZGV2X2luaXRpYWxpemUoaTI0MDBtKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBlcnJvcl9kZXZfaW5pdGlhbGl6ZTsKKwkvKiBBdCB0aGlzIHBvaW50LCByZXBvcnRzIHdpbGwgY29tZSBmb3IgdGhlIGRldmljZSBhbmQgc2V0IGl0CisJICogdG8gdGhlIHJpZ2h0IHN0YXRlIGlmIGl0IGlzIGRpZmZlcmVudCB0aGFuIFVOSU5JVElBTElaRUQgKi8KKwlkX2ZuZW5kKDMsIGRldiwgIihuZXRfZGV2ICVwIFtpMjQwMG0gJXBdKSA9ICVkXG4iLAorCQluZXRfZGV2LCBpMjQwMG0sIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKKworZXJyb3JfZGV2X2luaXRpYWxpemU6CitlcnJvcl9jaGVja19tYWNfYWRkcjoKKwlkZXN0cm95X3dvcmtxdWV1ZShpMjQwMG0tPndvcmtfcXVldWUpOworZXJyb3JfY3JlYXRlX3dvcmtxdWV1ZToKKwlpMjQwMG0tPmJ1c19kZXZfc3RvcChpMjQwMG0pOworZXJyb3JfYnVzX2Rldl9zdGFydDoKKwlpMjQwMG1fdHhfcmVsZWFzZShpMjQwMG0pOworZXJyb3JfdHhfc2V0dXA6CitlcnJvcl9ib290c3RyYXA6CisJaWYgKHJlc3VsdCA9PSAtRVJFU1RBUlRTWVMgJiYgdGltZXMtLSA+IDApIHsKKwkJZmxhZ3MgPSBJMjQwME1fQlJJX1NPRlQ7CisJCWdvdG8gcmV0cnk7CisJfQorCWRfZm5lbmQoMywgZGV2LCAiKG5ldF9kZXYgJXAgW2kyNDAwbSAlcF0pID0gJWRcbiIsCisJCW5ldF9kZXYsIGkyNDAwbSwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYworaW50IGkyNDAwbV9kZXZfc3RhcnQoc3RydWN0IGkyNDAwbSAqaTI0MDBtLCBlbnVtIGkyNDAwbV9icmkgYm1fZmxhZ3MpCit7CisJaW50IHJlc3VsdDsKKwltdXRleF9sb2NrKCZpMjQwMG0tPmluaXRfbXV0ZXgpOwkvKiBXZWxsLCBzdGFydCB0aGUgZGV2aWNlICovCisJcmVzdWx0ID0gX19pMjQwMG1fZGV2X3N0YXJ0KGkyNDAwbSwgYm1fZmxhZ3MpOworCWlmIChyZXN1bHQgPj0gMCkKKwkJaTI0MDBtLT51cGRvd24gPSAxOworCW11dGV4X3VubG9jaygmaTI0MDBtLT5pbml0X211dGV4KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qKgorICogaTI0MDBtX2Rldl9zdG9wIC0gVGVhciBkb3duIGRyaXZlciBjb21tdW5pY2F0aW9uIHdpdGggdGhlIGRldmljZQorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKgorICogUmV0dXJuczogMCBpZiBvaywgPCAwIGVycm5vIGNvZGUgb24gZXJyb3IuCisgKgorICogUmVsZWFzZXMgYWxsIHRoZSByZXNvdXJjZXMgYWxsb2NhdGVkIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIGRldmljZS4KKyAqLworc3RhdGljCit2b2lkIF9faTI0MDBtX2Rldl9zdG9wKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSkKK3sKKwlzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYgPSAmaTI0MDBtLT53aW1heF9kZXY7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCisJZF9mbnN0YXJ0KDMsIGRldiwgIihpMjQwMG0gJXApXG4iLCBpMjQwMG0pOworCXdpbWF4X3N0YXRlX2NoYW5nZSh3aW1heF9kZXYsIF9fV0lNQVhfU1RfUVVJRVNDSU5HKTsKKwlpMjQwMG1fZGV2X3NodXRkb3duKGkyNDAwbSk7CisJaTI0MDBtLT5yZWFkeSA9IDA7CisJZGVzdHJveV93b3JrcXVldWUoaTI0MDBtLT53b3JrX3F1ZXVlKTsKKwlpMjQwMG0tPmJ1c19kZXZfc3RvcChpMjQwMG0pOworCWkyNDAwbV90eF9yZWxlYXNlKGkyNDAwbSk7CisJd2ltYXhfc3RhdGVfY2hhbmdlKHdpbWF4X2RldiwgV0lNQVhfU1RfRE9XTik7CisJZF9mbmVuZCgzLCBkZXYsICIoaTI0MDBtICVwKSA9IDBcbiIsIGkyNDAwbSk7Cit9CisKKworLyoKKyAqIFdhdGNoIG91dCAtLSB3ZSBvbmx5IG5lZWQgdG8gc3RvcCBpZiB0aGVyZSBpcyBhIG5lZWQgZm9yIGl0LiBUaGUKKyAqIGRldmljZSBjb3VsZCBoYXZlIHJlc2V0IGl0c2VsZiBhbmQgZmFpbGVkIHRvIGNvbWUgdXAgYWdhaW4gKHNlZQorICogX2kyNDAwbV9kZXZfcmVzZXRfaGFuZGxlKCkpLgorICovCitzdGF0aWMKK3ZvaWQgaTI0MDBtX2Rldl9zdG9wKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSkKK3sKKwltdXRleF9sb2NrKCZpMjQwMG0tPmluaXRfbXV0ZXgpOworCWlmIChpMjQwMG0tPnVwZG93bikgeworCQlfX2kyNDAwbV9kZXZfc3RvcChpMjQwMG0pOworCQlpMjQwMG0tPnVwZG93biA9IDA7CisJfQorCW11dGV4X3VubG9jaygmaTI0MDBtLT5pbml0X211dGV4KTsKK30KKworCisvKgorICogVGhlIGRldmljZSBoYXMgcmVib290ZWQ7IGZpeCB1cCB0aGUgZGV2aWNlIGFuZCB0aGUgZHJpdmVyCisgKgorICogVGVhciBkb3duIHRoZSBkcml2ZXIgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBkZXZpY2UsIHJlbG9hZCB0aGUKKyAqIGZpcm13YXJlIGFuZCByZWluaXRpYWxpemUgdGhlIGNvbW11bmljYXRpb24gd2l0aCB0aGUgZGV2aWNlLgorICoKKyAqIElmIHNvbWVvbmUgY2FsbHMgYSByZXNldCB3aGVuIHRoZSBkZXZpY2UncyBmaXJtd2FyZSBpcyBkb3duLCBpbgorICogdGhlb3J5IHdlIHdvbid0IHNlZSBpdCBiZWNhdXNlIHdlIGFyZSBub3QgbGlzdGVuaW5nLiBIb3dldmVyLCBqdXN0CisgKiBpbiBjYXNlLCBsZWF2ZSB0aGUgY29kZSB0byBoYW5kbGUgaXQuCisgKgorICogSWYgdGhlcmUgaXMgYSByZXNldCBjb250ZXh0LCB1c2UgaXQ7IHRoaXMgbWVhbnMgc29tZW9uZSBpcyB3YWl0aW5nCisgKiBmb3IgdXMgdG8gdGVsbCBoaW0gd2hlbiB0aGUgcmVzZXQgb3BlcmF0aW9uIGlzIGNvbXBsZXRlIGFuZCB0aGUKKyAqIGRldmljZSBpcyByZWFkeSB0byByb2NrIGFnYWluLgorICoKKyAqIE5PVEU6IGlmIHdlIGFyZSBpbiB0aGUgcHJvY2VzcyBvZiBicmluZ2luZyB1cCBvciBkb3duIHRoZQorICogICAgICAgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBkZXZpY2UgW3J1bm5pbmcgaTI0MDBtX2Rldl9zdGFydCgpIG9yCisgKiAgICAgICBfc3RvcCgpXSwgZG9uJ3QgZG8gYW55dGhpbmcsIGxldCBpdCBmYWlsIGFuZCBoYW5kbGUgaXQuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyByYW4gYWx3YXlzIGluIGEgdGhyZWFkIGNvbnRleHQKKyAqLworc3RhdGljCit2b2lkIF9faTI0MDBtX2Rldl9yZXNldF9oYW5kbGUoc3RydWN0IHdvcmtfc3RydWN0ICp3cykKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBpMjQwMG1fd29yayAqaXcgPSBjb250YWluZXJfb2Yod3MsIHN0cnVjdCBpMjQwMG1fd29yaywgd3MpOworCXN0cnVjdCBpMjQwMG0gKmkyNDAwbSA9IGl3LT5pMjQwMG07CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCWVudW0gd2ltYXhfc3Qgd2ltYXhfc3RhdGU7CisJc3RydWN0IGkyNDAwbV9yZXNldF9jdHggKmN0eCA9IGkyNDAwbS0+cmVzZXRfY3R4OworCisJZF9mbnN0YXJ0KDMsIGRldiwgIih3cyAlcCBpMjQwMG0gJXApXG4iLCB3cywgaTI0MDBtKTsKKwlyZXN1bHQgPSAwOworCWlmIChtdXRleF90cnlsb2NrKCZpMjQwMG0tPmluaXRfbXV0ZXgpID09IDApIHsKKwkJLyogV2UgYXJlIHN0aWxsIGluIGkyNDAwbV9kZXZfc3RhcnQoKSBbbGV0IGl0IGZhaWxdIG9yCisJCSAqIGkyNDAwbV9kZXZfc3RvcCgpIFt3ZSBhcmUgc2h1dHRpbmcgZG93biBhbnl3YXksIHNvCisJCSAqIGlnbm9yZSBpdF0gb3Igd2UgYXJlIHJlc2V0dGluZyBzb21ld2hlcmUgZWxzZS4gKi8KKwkJZGV2X2VycihkZXYsICJkZXZpY2UgcmVib290ZWRcbiIpOworCQlpMjQwMG1fbXNnX3RvX2Rldl9jYW5jZWxfd2FpdChpMjQwMG0sIC1FUkVTVEFSVFNZUyk7CisJCWNvbXBsZXRlKCZpMjQwMG0tPm1zZ19jb21wbGV0aW9uKTsKKwkJZ290byBvdXQ7CisJfQorCXdpbWF4X3N0YXRlID0gd2ltYXhfc3RhdGVfZ2V0KCZpMjQwMG0tPndpbWF4X2Rldik7CisJaWYgKHdpbWF4X3N0YXRlIDwgV0lNQVhfU1RfVU5JTklUSUFMSVpFRCkgeworCQlkZXZfaW5mbyhkZXYsICJkZXZpY2UgcmVib290ZWQ6IGl0IGlzIGRvd24sIGlnbm9yaW5nXG4iKTsKKwkJZ290byBvdXRfdW5sb2NrOwkvKiBpZmNvbmZpZyB1cC9kb3duIHdhc24ndCBjYWxsZWQgKi8KKwl9CisJZGV2X2VycihkZXYsICJkZXZpY2UgcmVib290ZWQ6IHJlaW5pdGlhbGl6aW5nIGRyaXZlclxuIik7CisJX19pMjQwMG1fZGV2X3N0b3AoaTI0MDBtKTsKKwlpMjQwMG0tPnVwZG93biA9IDA7CisJcmVzdWx0ID0gX19pMjQwMG1fZGV2X3N0YXJ0KGkyNDAwbSwKKwkJCQkgICAgSTI0MDBNX0JSSV9TT0ZUIHwgSTI0MDBNX0JSSV9NQUNfUkVJTklUKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImRldmljZSByZWJvb3Q6IGNhbm5vdCBzdGFydCB0aGUgZGV2aWNlOiAlZFxuIiwKKwkJCXJlc3VsdCk7CisJCXJlc3VsdCA9IGkyNDAwbS0+YnVzX3Jlc2V0KGkyNDAwbSwgSTI0MDBNX1JUX0JVUyk7CisJCWlmIChyZXN1bHQgPj0gMCkKKwkJCXJlc3VsdCA9IC1FTk9ERVY7CisJfSBlbHNlCisJCWkyNDAwbS0+dXBkb3duID0gMTsKK291dF91bmxvY2s6CisJaWYgKGkyNDAwbS0+cmVzZXRfY3R4KSB7CisJCWN0eC0+cmVzdWx0ID0gcmVzdWx0OworCQljb21wbGV0ZSgmY3R4LT5jb21wbGV0aW9uKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZpMjQwMG0tPmluaXRfbXV0ZXgpOworb3V0OgorCWkyNDAwbV9wdXQoaTI0MDBtKTsKKwlrZnJlZShpdyk7CisJZF9mbmVuZCgzLCBkZXYsICIod3MgJXAgaTI0MDBtICVwKSA9IHZvaWRcbiIsIHdzLCBpMjQwMG0pOworCXJldHVybjsKK30KKworCisvKioKKyAqIGkyNDAwbV9kZXZfcmVzZXRfaGFuZGxlIC0gSGFuZGxlIGEgZGV2aWNlJ3MgcmVzZXQgaW4gYSB0aHJlYWQgY29udGV4dAorICoKKyAqIFNjaGVkdWxlIGEgZGV2aWNlIHJlc2V0IGhhbmRsaW5nIG91dCBvbiBhIHRocmVhZCBjb250ZXh0LCBzbyBpdAorICogaXMgc2FmZSB0byBjYWxsIGZyb20gYXRvbWljIGNvbnRleHQuIFdlIGNhbid0IHVzZSB0aGUgaTI0MDBtJ3MKKyAqIHF1ZXVlIGFzIHdlIGFyZSBnb2luZyB0byBkZXN0cm95IGl0IGFuZCByZWluaXRpYWxpemUgaXQgYXMgcGFydCBvZgorICogdGhlIGRyaXZlciBicmluZ3VwL2JyaW5ndXAgcHJvY2Vzcy4KKyAqCisgKiBTZWUgX19pMjQwMG1fZGV2X3Jlc2V0X2hhbmRsZSgpIGZvciBkZXRhaWxzOyB0aGF0IHRha2VzIGNhcmUgb2YKKyAqIHJlaW5pdGlhbGl6aW5nIHRoZSBkcml2ZXIgdG8gaGFuZGxlIHRoZSByZXNldCwgY2FsbGluZyBpbnRvIHRoZQorICogYnVzLXNwZWNpZmljIGZ1bmN0aW9ucyBvcHMgYXMgbmVlZGVkLgorICovCitpbnQgaTI0MDBtX2Rldl9yZXNldF9oYW5kbGUoc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCXJldHVybiBpMjQwMG1fc2NoZWR1bGVfd29yayhpMjQwMG0sIF9faTI0MDBtX2Rldl9yZXNldF9oYW5kbGUsCisJCQkJICAgIEdGUF9BVE9NSUMpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaTI0MDBtX2Rldl9yZXNldF9oYW5kbGUpOworCisKKy8qKgorICogaTI0MDBtX3NldHVwIC0gYnVzLWdlbmVyaWMgc2V0dXAgZnVuY3Rpb24gZm9yIHRoZSBpMjQwMG0gZGV2aWNlCisgKgorICogQGkyNDAwbTogZGV2aWNlIGRlc2NyaXB0b3IgKGJ1cy1zcGVjaWZpYyBwYXJ0cyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQpCisgKgorICogUmV0dXJuczogMCBpZiBvaywgPCAwIGVycm5vIGNvZGUgb24gZXJyb3IuCisgKgorICogSW5pdGlhbGl6ZXMgdGhlIGJ1cy1nZW5lcmljIHBhcnRzIG9mIHRoZSBpMjQwMG0gZHJpdmVyOyB0aGUKKyAqIGJ1cy1zcGVjaWZpYyBwYXJ0cyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQsIGZ1bmN0aW9uIHBvaW50ZXJzIGZpbGxlZAorICogb3V0IGJ5IHRoZSBidXMtc3BlY2lmaWMgcHJvYmUgZnVuY3Rpb24uCisgKgorICogQXMgd2VsbCwgdGhpcyByZWdpc3RlcnMgdGhlIFdpTUFYIGFuZCBuZXQgZGV2aWNlIG5vZGVzLiBPbmNlIHRoaXMKKyAqIGZ1bmN0aW9uIHJldHVybnMsIHRoZSBkZXZpY2UgaXMgb3BlcmF0aXZlIGFuZCBoYXMgdG8gYmUgcmVhZHkgdG8KKyAqIHJlY2VpdmUgYW5kIHNlbmQgbmV0d29yayB0cmFmZmljIGFuZCBXaU1BWCBjb250cm9sIG9wZXJhdGlvbnMuCisgKi8KK2ludCBpMjQwMG1fc2V0dXAoc3RydWN0IGkyNDAwbSAqaTI0MDBtLCBlbnVtIGkyNDAwbV9icmkgYm1fZmxhZ3MpCit7CisJaW50IHJlc3VsdCA9IC1FTk9ERVY7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldiA9ICZpMjQwMG0tPndpbWF4X2RldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IGkyNDAwbS0+d2ltYXhfZGV2Lm5ldF9kZXY7CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKGkyNDAwbSAlcClcbiIsIGkyNDAwbSk7CisKKwlzbnByaW50Zih3aW1heF9kZXYtPm5hbWUsIHNpemVvZih3aW1heF9kZXYtPm5hbWUpLAorCQkgImkyNDAwbS0lczolcyIsIGRldi0+YnVzLT5uYW1lLCBkZXYtPmJ1c19pZCk7CisKKwlpMjQwMG0tPmJtX2NtZF9idWYgPSBremFsbG9jKEkyNDAwTV9CTV9DTURfQlVGX1NJWkUsIEdGUF9LRVJORUwpOworCWlmIChpMjQwMG0tPmJtX2NtZF9idWYgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgImNhbm5vdCBhbGxvY2F0ZSBVU0IgY29tbWFuZCBidWZmZXJcbiIpOworCQlnb3RvIGVycm9yX2JtX2NtZF9remFsbG9jOworCX0KKwlpMjQwMG0tPmJtX2Fja19idWYgPSBremFsbG9jKEkyNDAwTV9CTV9BQ0tfQlVGX1NJWkUsIEdGUF9LRVJORUwpOworCWlmIChpMjQwMG0tPmJtX2Fja19idWYgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgImNhbm5vdCBhbGxvY2F0ZSBVU0IgYWNrIGJ1ZmZlclxuIik7CisJCWdvdG8gZXJyb3JfYm1fYWNrX2J1Zl9remFsbG9jOworCX0KKwlyZXN1bHQgPSBpMjQwMG1fYm9vdHJvbV9pbml0KGkyNDAwbSwgYm1fZmxhZ3MpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAicmVhZCBtYWMgYWRkcjogYm9vdHJvbSBpbml0ICIKKwkJCSJmYWlsZWQ6ICVkXG4iLCByZXN1bHQpOworCQlnb3RvIGVycm9yX2Jvb3Ryb21faW5pdDsKKwl9CisJcmVzdWx0ID0gaTI0MDBtX3JlYWRfbWFjX2FkZHIoaTI0MDBtKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBlcnJvcl9yZWFkX21hY19hZGRyOworCisJcmVzdWx0ID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldF9kZXYpOwkvKiBPa2V5IGRva2V5LCBicmluZyBpdCB1cCAqLworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiY2Fubm90IHJlZ2lzdGVyIGkyNDAwbSBuZXR3b3JrIGRldmljZTogJWRcbiIsCisJCQlyZXN1bHQpOworCQlnb3RvIGVycm9yX3JlZ2lzdGVyX25ldGRldjsKKwl9CisJbmV0aWZfY2Fycmllcl9vZmYobmV0X2Rldik7CisKKwlyZXN1bHQgPSBpMjQwMG1fZGV2X3N0YXJ0KGkyNDAwbSwgYm1fZmxhZ3MpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIGVycm9yX2Rldl9zdGFydDsKKworCWkyNDAwbS0+d2ltYXhfZGV2Lm9wX21zZ19mcm9tX3VzZXIgPSBpMjQwMG1fb3BfbXNnX2Zyb21fdXNlcjsKKwlpMjQwMG0tPndpbWF4X2Rldi5vcF9yZmtpbGxfc3dfdG9nZ2xlID0gaTI0MDBtX29wX3Jma2lsbF9zd190b2dnbGU7CisJaTI0MDBtLT53aW1heF9kZXYub3BfcmVzZXQgPSBpMjQwMG1fb3BfcmVzZXQ7CisJcmVzdWx0ID0gd2ltYXhfZGV2X2FkZCgmaTI0MDBtLT53aW1heF9kZXYsIG5ldF9kZXYpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIGVycm9yX3dpbWF4X2Rldl9hZGQ7CisJLyogVXNlciBzcGFjZSBuZWVkcyB0byBkbyBzb21lIGluaXQgc3R1ZmYgKi8KKwl3aW1heF9zdGF0ZV9jaGFuZ2Uod2ltYXhfZGV2LCBXSU1BWF9TVF9VTklOSVRJQUxJWkVEKTsKKworCS8qIE5vdyBzZXR1cCBhbGwgdGhhdCByZXF1aXJlcyBhIHJlZ2lzdGVyZWQgbmV0IGFuZCB3aW1heCBkZXZpY2UuICovCisJcmVzdWx0ID0gaTI0MDBtX2RlYnVnZnNfYWRkKGkyNDAwbSk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJjYW5ub3Qgc2V0dXAgaTI0MDBtJ3MgZGVidWdmczogJWRcbiIsIHJlc3VsdCk7CisJCWdvdG8gZXJyb3JfZGVidWdmc19zZXR1cDsKKwl9CisJZF9mbmVuZCgzLCBkZXYsICIoaTI0MDBtICVwKSA9ICVkXG4iLCBpMjQwMG0sIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKKworZXJyb3JfZGVidWdmc19zZXR1cDoKKwl3aW1heF9kZXZfcm0oJmkyNDAwbS0+d2ltYXhfZGV2KTsKK2Vycm9yX3dpbWF4X2Rldl9hZGQ6CisJaTI0MDBtX2Rldl9zdG9wKGkyNDAwbSk7CitlcnJvcl9kZXZfc3RhcnQ6CisJdW5yZWdpc3Rlcl9uZXRkZXYobmV0X2Rldik7CitlcnJvcl9yZWdpc3Rlcl9uZXRkZXY6CitlcnJvcl9yZWFkX21hY19hZGRyOgorZXJyb3JfYm9vdHJvbV9pbml0OgorCWtmcmVlKGkyNDAwbS0+Ym1fYWNrX2J1Zik7CitlcnJvcl9ibV9hY2tfYnVmX2t6YWxsb2M6CisJa2ZyZWUoaTI0MDBtLT5ibV9jbWRfYnVmKTsKK2Vycm9yX2JtX2NtZF9remFsbG9jOgorCWRfZm5lbmQoMywgZGV2LCAiKGkyNDAwbSAlcCkgPSAlZFxuIiwgaTI0MDBtLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpMjQwMG1fc2V0dXApOworCisKKy8qKgorICogaTI0MDBtX3JlbGVhc2UgLSByZWxlYXNlIHRoZSBidXMtZ2VuZXJpYyBkcml2ZXIgcmVzb3VyY2VzCisgKgorICogU2VuZHMgYSBkaXNjb25uZWN0IG1lc3NhZ2UgYW5kIHVuZG9lcyBhbnkgc2V0dXAgZG9uZSBieSBpMjQwMG1fc2V0dXAoKQorICovCit2b2lkIGkyNDAwbV9yZWxlYXNlKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKGkyNDAwbSAlcClcbiIsIGkyNDAwbSk7CisJbmV0aWZfc3RvcF9xdWV1ZShpMjQwMG0tPndpbWF4X2Rldi5uZXRfZGV2KTsKKworCWkyNDAwbV9kZWJ1Z2ZzX3JtKGkyNDAwbSk7CisJd2ltYXhfZGV2X3JtKCZpMjQwMG0tPndpbWF4X2Rldik7CisJaTI0MDBtX2Rldl9zdG9wKGkyNDAwbSk7CisJdW5yZWdpc3Rlcl9uZXRkZXYoaTI0MDBtLT53aW1heF9kZXYubmV0X2Rldik7CisJa2ZyZWUoaTI0MDBtLT5ibV9hY2tfYnVmKTsKKwlrZnJlZShpMjQwMG0tPmJtX2NtZF9idWYpOworCWRfZm5lbmQoMywgZGV2LCAiKGkyNDAwbSAlcCkgPSB2b2lkXG4iLCBpMjQwMG0pOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaTI0MDBtX3JlbGVhc2UpOworCisKK3N0YXRpYworaW50IF9faW5pdCBpMjQwMG1fZHJpdmVyX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KK21vZHVsZV9pbml0KGkyNDAwbV9kcml2ZXJfaW5pdCk7CisKK3N0YXRpYwordm9pZCBfX2V4aXQgaTI0MDBtX2RyaXZlcl9leGl0KHZvaWQpCit7CisJLyogZm9yIHNjaGVkcyBpMjQwMG1fZGV2X3Jlc2V0X2hhbmRsZSgpICovCisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwlyZXR1cm47Cit9Cittb2R1bGVfZXhpdChpMjQwMG1fZHJpdmVyX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnRlbCAyNDAwTSBXaU1BWCBuZXR3b3JraW5nIGJ1cy1nZW5lcmljIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL2Z3LmMgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vZncuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDgyNzFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL2Z3LmMKQEAgLTAsMCArMSwxMDk1IEBACisvKgorICogSW50ZWwgV2lyZWxlc3MgV2lNQVggQ29ubmVjdGlvbiAyNDAwbQorICogRmlybXdhcmUgdXBsb2FkZXIKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICoKKyAqIEludGVsIENvcnBvcmF0aW9uIDxsaW51eC13aW1heEBpbnRlbC5jb20+CisgKiBZYW5pciBMdWJldGtpbiA8eWFuaXJ4Lmx1YmV0a2luQGludGVsLmNvbT4KKyAqIEluYWt5IFBlcmV6LUdvbnphbGV6IDxpbmFreS5wZXJlei1nb256YWxlekBpbnRlbC5jb20+CisgKiAgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCisgKgorICoKKyAqIFRIRSBQUk9DRURVUkUKKyAqCisgKiAodGhpcyBpcyBkZWNyaWJlZCBmb3IgVVNCLCBidXQgZm9yIFNESU8gaXMgc2ltaWxhcikKKyAqCisgKiBUaGUgMjQwMG0gd29ya3MgaW4gdHdvIG1vZGVzOiBib290LW1vZGUgb3Igbm9ybWFsIG1vZGUuIEluIGJvb3QKKyAqIG1vZGUgd2UgY2FuIGV4ZWN1dGUgb25seSBhIGhhbmRmdWwgb2YgY29tbWFuZHMgdGFyZ2V0ZWQgYXQKKyAqIHVwbG9hZGluZyB0aGUgZmlybXdhcmUgYW5kIGxhdW5jaGluZyBpdC4KKyAqCisgKiBUaGUgMjQwMG0gZW50ZXJzIGJvb3QgbW9kZSB3aGVuIGl0IGlzIGZpcnN0IGNvbm5lY3RlZCB0byB0aGUKKyAqIHN5c3RlbSwgd2hlbiBpdCBjcmFzaGVzIGFuZCB3aGVuIHlvdSBhc2sgaXQgdG8gcmVib290LiBUaGVyZSBhcmUKKyAqIHR3byBzdWJtb2RlcyBvZiB0aGUgYm9vdCBtb2RlOiBzaWduZWQgYW5kIG5vbi1zaWduZWQuIFNpZ25lZCB0YWtlcworICogZmlybXdhcmVzIHNpZ25lZCB3aXRoIGEgY2VydGFpbiBwcml2YXRlIGtleSwgbm9uLXNpZ25lZCB0YWtlcyBhbnkKKyAqIGZpcm13YXJlLiBOb3JtYWwgaGFyZHdhcmUgdGFrZXMgb25seSBzaWduZWQgZmlybXdhcmUuCisgKgorICogVXBvbiBlbnRyYW5jZSB0byBib290IG1vZGUsIHRoZSBkZXZpY2Ugc2VuZHMgYSBmZXcgemVybyBsZW5ndGgKKyAqIHBhY2tldHMgKFpMUHMpIG9uIHRoZSBub3RpZmljYXRpb24gZW5kcG9pbnQsIHRoZW4gYSByZWJvb3QgYmFya2VyCisgKiAoNCBsZTMyIHdvcmRzIHdpdGggdmFsdWUgSTI0MDBNX3tTLE59Qk9PVF9CQVJLRVIpLiBXZSBhY2sgaXQgYnkKKyAqIHNlbmRpbmcgdGhlIHNhbWUgYmFya2VyIG9uIHRoZSBidWxrIG91dCBlbmRwb2ludC4gVGhlIGRldmljZSBhY2tzCisgKiB3aXRoIGEgcmVib290IGFjayBiYXJrZXIgKDQgbGUzMiB3b3JkcyB3aXRoIHZhbHVlIDB4ZmVlZGJhYmUpIGFuZAorICogdGhlbiB0aGUgZGV2aWNlIGlzIGZ1bGx5IHJlYm9vdGVkLiBBdCB0aGlzIHBvaW50IHdlIGNhbiB1cGxvYWQgdGhlCisgKiBmaXJtd2FyZS4KKyAqCisgKiBUaGlzIHByb2Nlc3MgaXMgYWNjb21wbGlzaGVkIGJ5IHRoZSBpMjQwMG1fYm9vdHJvbV9pbml0KCkKKyAqIGZ1bmN0aW9uLiBBbGwgdGhlIGRldmljZSBpbnRlcmFjdGlvbiBoYXBwZW5zIHRocm91Z2ggdGhlCisgKiBpMjQwMG1fYm1fY21kKCkgW2Jvb3QgbW9kZSBjb21tYW5kXS4gU3BlY2lhbCByZXR1cm4gdmFsdWVzIHdpbGwKKyAqIGluZGljYXRlIGlmIHRoZSBkZXZpY2UgcmVzZXRzLgorICoKKyAqIEFmdGVyIHRoaXMsIHdlIHJlYWQgdGhlIE1BQyBhZGRyZXNzIGFuZCB0aGVuIChpZiBuZWVkZWQpCisgKiByZWluaXRpYWxpemUgdGhlIGRldmljZS4gV2UgbmVlZCB0byByZWFkIGl0IGFoZWFkIG9mIHRpbWUgYmVjYXVzZQorICogaW4gdGhlIGZ1dHVyZSwgd2UgbWlnaHQgbm90IHVwbG9hZCB0aGUgZmlybXdhcmUgdW50aWwgdXNlcnNwYWNlCisgKiAnaWZjb25maWcgdXAncyB0aGUgZGV2aWNlLgorICoKKyAqIFdlIGNhbiB0aGVuIHVwbG9hZCB0aGUgZmlybXdhcmUgZmlsZS4gVGhlIGZpbGUgaXMgY29tcG9zZWQgb2YgYSBCQ0YKKyAqIGhlYWRlciAoYmFzaWMgZGF0YSwga2V5cyBhbmQgc2lnbmF0dXJlcykgYW5kIGEgbGlzdCBvZiB3cml0ZQorICogY29tbWFuZHMgYW5kIHBheWxvYWRzLiBXZSBmaXJzdCB1cGxvYWQgdGhlIGhlYWRlcgorICogW2kyNDAwbV9kbmxvYWRfaW5pdCgpXSBhbmQgdGhlbiBwYXNzIHRoZSBjb21tYW5kcyBhbmQgcGF5bG9hZHMKKyAqIHZlcmJhdGltIHRvIHRoZSBpMjQwMG1fYm1fY21kKCkgZnVuY3Rpb24KKyAqIFtpMjQwMG1fZG5sb2FkX2JjZigpXS4gVGhlbiB3ZSB0ZWxsIHRoZSBkZXZpY2UgdG8ganVtcCB0byB0aGUgbmV3CisgKiBmaXJtd2FyZSBbaTI0MDBtX2RubG9hZF9maW5hbGl6ZSgpXS4KKyAqCisgKiBPbmNlIGZpcm13YXJlIGlzIHVwbG9hZGVkLCB3ZSBhcmUgZ29vZCB0byBnbyA6KQorICoKKyAqIFdoZW4gd2UgZG9uJ3Qga25vdyBpbiB3aGljaCBtb2RlIHdlIGFyZSwgd2UgZmlyc3QgdHJ5IGJ5IHNlbmRpbmcgYQorICogd2FybSByZXNldCByZXF1ZXN0IHRoYXQgd2lsbCB0YWtlIHVzIHRvIGJvb3QtbW9kZS4gSWYgd2UgdGltZSBvdXQKKyAqIHdhaXRpbmcgZm9yIGEgcmVib290IGJhcmtlciwgdGhhdCBtZWFucyBtYXliZSB3ZSBhcmUgYWxyZWFkeSBpbgorICogYm9vdCBtb2RlLCBzbyB3ZSBzZW5kIGEgcmVib290IGJhcmtlci4KKyAqCisgKiBDT01NQU5EIEVYRUNVVElPTgorICoKKyAqIFRoaXMgY29kZSAoYW5kIHByb2Nlc3MpIGlzIHNpbmdsZSB0aHJlYWRlZDsgZm9yIGV4ZWN1dGluZyBjb21tYW5kcywKKyAqIHdlIHBvc3QgYSBVUkIgdG8gdGhlIG5vdGlmaWNhdGlvbiBlbmRwb2ludCwgcG9zdCB0aGUgY29tbWFuZCwgd2FpdAorICogZm9yIGRhdGEgb24gdGhlIG5vdGlmaWNhdGlvbiBidWZmZXIuIFdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQKKyAqIG90aGVycyBhcyB3ZSBrbm93IHdlIGFyZSB0aGUgb25seSBvbmVzIGluIHRoZXJlLgorICoKKyAqIEJBQ0tFTkQgSU1QTEVNRU5UQVRJT04KKyAqCisgKiBUaGlzIGNvZGUgaXMgYnVzLWdlbmVyaWM7IHRoZSBidXMtc3BlY2lmaWMgZHJpdmVyIHByb3ZpZGVzIGJhY2sgZW5kCisgKiBpbXBsZW1lbnRhdGlvbnMgdG8gc2VuZCBhIGJvb3QgbW9kZSBjb21tYW5kIHRvIHRoZSBkZXZpY2UgYW5kIHRvCisgKiByZWFkIGFuIGFja25vbHdlZGdlbWVudCBmcm9tIGl0IChvciBhbiBhc3luY2hyb25vdXMgbm90aWZpY2F0aW9uKQorICogZnJvbSBpdC4KKyAqCisgKiBST0FETUFQCisgKgorICogaTI0MDBtX2Rldl9ib290c3RyYXAgICAgICAgICAgICAgICBDYWxsZWQgYnkgX19pMjQwMG1fZGV2X3N0YXJ0KCkKKyAqICAgcmVxdWVzdF9maXJtd2FyZQorICogICBpMjQwMG1fZndfY2hlY2sKKyAqICAgaTI0MDBtX2Z3X2RubG9hZAorICogICByZWxlYXNlX2Zpcm13YXJlCisgKgorICogaTI0MDBtX2Z3X2RubG9hZAorICogICBpMjQwMG1fYm9vdHJvbV9pbml0CisgKiAgICAgaTI0MDBtX2JtX2NtZAorICogICAgIGkyNDAwbS0+YnVzX3Jlc2V0CisgKiAgIGkyNDAwbV9kbmxvYWRfaW5pdAorICogICAgIGkyNDAwbV9kbmxvYWRfaW5pdF9zaWduZWQKKyAqICAgICBpMjQwMG1fZG5sb2FkX2luaXRfbm9uc2lnbmVkCisgKiAgICAgICBpMjQwMG1fZG93bmxvYWRfY2h1bmsKKyAqICAgICAgICAgaTI0MDBtX2JtX2NtZAorICogICBpMjQwMG1fZG5sb2FkX2JjZgorICogICAgIGkyNDAwbV9ibV9jbWQKKyAqICAgaTI0MDBtX2RubG9hZF9maW5hbGl6ZQorICogICAgIGkyNDAwbV9ibV9jbWQKKyAqCisgKiBpMjQwMG1fYm1fY21kCisgKiAgIGkyNDAwbS0+YnVzX2JtX2NtZF9zZW5kKCkKKyAqICAgaTI0MDBtLT5idXNfYm1fd2FpdF9mb3JfYWNrCisgKiAgIF9faTI0MDBtX2JtX2Fja192ZXJpZnkKKyAqCisgKiBpMjQwMG1fYm1fY21kX3ByZXBhcmUgICAgICAgICAgICAgIFVzZWQgYnkgYnVzLWRyaXZlcnMgdG8gcHJlcAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kcyBiZWZvcmUgc2VuZGluZworICovCisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgImkyNDAwbS5oIgorCisKKyNkZWZpbmUgRF9TVUJNT0RVTEUgZncKKyNpbmNsdWRlICJkZWJ1Zy1sZXZlbHMuaCIKKworCitzdGF0aWMgY29uc3QgX19sZTMyIGkyNDAwbV9BQ0tfQkFSS0VSWzRdID0geworCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoSTI0MDBNX0FDS19CQVJLRVIpLAorCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoSTI0MDBNX0FDS19CQVJLRVIpLAorCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoSTI0MDBNX0FDS19CQVJLRVIpLAorCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoSTI0MDBNX0FDS19CQVJLRVIpCit9OworCisKKy8qKgorICogUHJlcGFyZSBhIGJvb3QtbW9kZSBjb21tYW5kIGZvciBkZWxpdmVyeQorICoKKyAqIEBjbWQ6IHBvaW50ZXIgdG8gYm9vdHJvbSBoZWFkZXIgdG8gcHJlcGFyZQorICoKKyAqIENvbXB1dGVzIGNoZWNrc3VtIGlmIHNvIG5lZWRlZC4gQWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLCBETyBOT1QKKyAqIG1vZGlmeSB0aGUgY29tbWFuZCBvciBoZWFkZXIgYXMgdGhlIGNoZWNrc3VtIHdvbid0IHdvcmsgYW55bW9yZS4KKyAqCisgKiBXZSBkbyBpdCBmcm9tIGhlcmUgYmVjYXVzZSBzb21lIHRpbWVzIHdlIGNhbm5vdCBkbyBpdCBpbiB0aGUKKyAqIG9yaWdpbmFsIGNvbnRleHQgdGhlIGNvbW1hbmQgd2FzIHNlbnQgKGl0IGlzIGEgY29uc3QpLCBzbyB3aGVuIHdlCisgKiBjb3B5IGl0IHRvIG91ciBzdGFnaW5nIGJ1ZmZlciwgd2UgYWRkIHRoZSBjaGVja3N1bSB0aGVyZS4KKyAqLwordm9pZCBpMjQwMG1fYm1fY21kX3ByZXBhcmUoc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciAqY21kKQoreworCWlmIChpMjQwMG1fYnJoX2dldF91c2VfY2hlY2tzdW0oY21kKSkgeworCQlpbnQgaTsKKwkJdTMyIGNoZWNrc3VtID0gMDsKKwkJY29uc3QgdTMyICpjaGVja3N1bV9wdHIgPSAodm9pZCAqKSBjbWQtPnBheWxvYWQ7CisJCWZvciAoaSA9IDA7IGkgPCBjbWQtPmRhdGFfc2l6ZSAvIDQ7IGkrKykKKwkJCWNoZWNrc3VtICs9IGNwdV90b19sZTMyKCpjaGVja3N1bV9wdHIrKyk7CisJCWNoZWNrc3VtICs9IGNtZC0+Y29tbWFuZCArIGNtZC0+dGFyZ2V0X2FkZHIgKyBjbWQtPmRhdGFfc2l6ZTsKKwkJY21kLT5ibG9ja19jaGVja3N1bSA9IGNwdV90b19sZTMyKGNoZWNrc3VtKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpMjQwMG1fYm1fY21kX3ByZXBhcmUpOworCisKKy8qCisgKiBWZXJpZnkgdGhlIGFjayBkYXRhIHJlY2VpdmVkCisgKgorICogR2l2ZW4gYSByZXBseSB0byBhIGJvb3QgbW9kZSBjb21tYW5kLCBjaGV3IGl0IGFuZCB2ZXJpZnkgZXZlcnl0aGluZworICogaXMgb2suCisgKgorICogQG9wY29kZTogb3Bjb2RlIHdoaWNoIGdlbmVyYXRlZCB0aGlzIGFjay4gRm9yIGVycm9yIG1lc3NhZ2VzLgorICogQGFjazogcG9pbnRlciB0byBhY2sgZGF0YSB3ZSByZWNlaXZlZAorICogQGFja19zaXplOiBzaXplIG9mIHRoYXQgZGF0YSBidWZmZXIKKyAqIEBmbGFnczogSTI0MDBNX0JNX0NNRF8qIGZsYWdzIHdlIGNhbGxlZCB0aGUgY29tbWFuZCB3aXRoLgorICoKKyAqIFdheSB0b28gbG9uZyBmdW5jdGlvbiAtLSBtYXliZSBpdCBzaG91bGQgYmUgZnVydGhlciBzcGxpdAorICovCitzdGF0aWMKK3NzaXplX3QgX19pMjQwMG1fYm1fYWNrX3ZlcmlmeShzdHJ1Y3QgaTI0MDBtICppMjQwMG0sIGludCBvcGNvZGUsCisJCQkgICAgICAgc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciAqYWNrLAorCQkJICAgICAgIHNpemVfdCBhY2tfc2l6ZSwgaW50IGZsYWdzKQoreworCXNzaXplX3QgcmVzdWx0ID0gLUVOT01FTTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisKKwlkX2Zuc3RhcnQoOCwgZGV2LCAiKGkyNDAwbSAlcCBvcGNvZGUgJWQgYWNrICVwIHNpemUgJXp1KVxuIiwKKwkJICBpMjQwMG0sIG9wY29kZSwgYWNrLCBhY2tfc2l6ZSk7CisJaWYgKGFja19zaXplIDwgc2l6ZW9mKCphY2spKSB7CisJCXJlc3VsdCA9IC1FSU87CisJCWRldl9lcnIoZGV2LCAiYm9vdC1tb2RlIGNtZCAlZDogSFcgQlVHPyBub3RpZmljYXRpb24gZGlkbid0ICIKKwkJCSJyZXR1cm4gZW5vdWdoIGRhdGEgKCV6dSBieXRlcyB2cyAlenUgZXhwZWN0ZWQpXG4iLAorCQkJb3Bjb2RlLCBhY2tfc2l6ZSwgc2l6ZW9mKCphY2spKTsKKwkJZ290byBlcnJvcl9hY2tfc2hvcnQ7CisJfQorCWlmIChhY2tfc2l6ZSA9PSBzaXplb2YoaTI0MDBtX05CT09UX0JBUktFUikKKwkJICYmIG1lbWNtcChhY2ssIGkyNDAwbV9OQk9PVF9CQVJLRVIsIHNpemVvZigqYWNrKSkgPT0gMCkgeworCQlyZXN1bHQgPSAtRVJFU1RBUlRTWVM7CisJCWkyNDAwbS0+c2Jvb3QgPSAwOworCQlkX3ByaW50Zig2LCBkZXYsICJib290LW1vZGUgY21kICVkOiAiCisJCQkgIkhXIG5vbi1zaWduZWQgYm9vdCBiYXJrZXJcbiIsIG9wY29kZSk7CisJCWdvdG8gZXJyb3JfcmVib290OworCX0KKwlpZiAoYWNrX3NpemUgPT0gc2l6ZW9mKGkyNDAwbV9TQk9PVF9CQVJLRVIpCisJCSAmJiBtZW1jbXAoYWNrLCBpMjQwMG1fU0JPT1RfQkFSS0VSLCBzaXplb2YoKmFjaykpID09IDApIHsKKwkJcmVzdWx0ID0gLUVSRVNUQVJUU1lTOworCQlpMjQwMG0tPnNib290ID0gMTsKKwkJZF9wcmludGYoNiwgZGV2LCAiYm9vdC1tb2RlIGNtZCAlZDogSFcgc2lnbmVkIHJlYm9vdCBiYXJrZXJcbiIsCisJCQkgb3Bjb2RlKTsKKwkJZ290byBlcnJvcl9yZWJvb3Q7CisJfQorCWlmIChhY2tfc2l6ZSA9PSBzaXplb2YoaTI0MDBtX0FDS19CQVJLRVIpCisJCSAmJiBtZW1jbXAoYWNrLCBpMjQwMG1fQUNLX0JBUktFUiwgc2l6ZW9mKCphY2spKSA9PSAwKSB7CisJCXJlc3VsdCA9IC1FSVNDT05OOworCQlkX3ByaW50ZigzLCBkZXYsICJib290LW1vZGUgY21kICVkOiBIVyByZWJvb3QgYWNrIGJhcmtlclxuIiwKKwkJCSBvcGNvZGUpOworCQlnb3RvIGVycm9yX3JlYm9vdF9hY2s7CisJfQorCXJlc3VsdCA9IDA7CisJaWYgKGZsYWdzICYgSTI0MDBNX0JNX0NNRF9SQVcpCisJCWdvdG8gb3V0X3JhdzsKKwlhY2stPmRhdGFfc2l6ZSA9IGxlMzJfdG9fY3B1KGFjay0+ZGF0YV9zaXplKTsKKwlhY2stPnRhcmdldF9hZGRyID0gbGUzMl90b19jcHUoYWNrLT50YXJnZXRfYWRkcik7CisJYWNrLT5ibG9ja19jaGVja3N1bSA9IGxlMzJfdG9fY3B1KGFjay0+YmxvY2tfY2hlY2tzdW0pOworCWRfcHJpbnRmKDUsIGRldiwgImJvb3QtbW9kZSBjbWQgJWQ6IG5vdGlmaWNhdGlvbiBmb3Igb3Bjb2RlICV1ICIKKwkJICJyZXNwb25zZSAldSBjc3VtICV1IHJyICV1IGRhICV1XG4iLAorCQkgb3Bjb2RlLCBpMjQwMG1fYnJoX2dldF9vcGNvZGUoYWNrKSwKKwkJIGkyNDAwbV9icmhfZ2V0X3Jlc3BvbnNlKGFjayksCisJCSBpMjQwMG1fYnJoX2dldF91c2VfY2hlY2tzdW0oYWNrKSwKKwkJIGkyNDAwbV9icmhfZ2V0X3Jlc3BvbnNlX3JlcXVpcmVkKGFjayksCisJCSBpMjQwMG1fYnJoX2dldF9kaXJlY3RfYWNjZXNzKGFjaykpOworCXJlc3VsdCA9IC1FSU87CisJaWYgKGkyNDAwbV9icmhfZ2V0X3NpZ25hdHVyZShhY2spICE9IDB4Y2JiYykgeworCQlkZXZfZXJyKGRldiwgImJvb3QtbW9kZSBjbWQgJWQ6IEhXIEJVRz8gd3Jvbmcgc2lnbmF0dXJlICIKKwkJCSIweCUwNHhcbiIsIG9wY29kZSwgaTI0MDBtX2JyaF9nZXRfc2lnbmF0dXJlKGFjaykpOworCQlnb3RvIGVycm9yX2Fja19zaWduYXR1cmU7CisJfQorCWlmIChvcGNvZGUgIT0gLTEgJiYgb3Bjb2RlICE9IGkyNDAwbV9icmhfZ2V0X29wY29kZShhY2spKSB7CisJCWRldl9lcnIoZGV2LCAiYm9vdC1tb2RlIGNtZCAlZDogSFcgQlVHPyAiCisJCQkicmVjZWl2ZWQgcmVzcG9uc2UgZm9yIG9wY29kZSAldSwgZXhwZWN0ZWQgJXVcbiIsCisJCQlvcGNvZGUsIGkyNDAwbV9icmhfZ2V0X29wY29kZShhY2spLCBvcGNvZGUpOworCQlnb3RvIGVycm9yX2Fja19vcGNvZGU7CisJfQorCWlmIChpMjQwMG1fYnJoX2dldF9yZXNwb25zZShhY2spICE9IDApIHsJLyogZmFpbGVkPyAqLworCQlkZXZfZXJyKGRldiwgImJvb3QtbW9kZSBjbWQgJWQ6IGVycm9yOyBodyByZXNwb25zZSAldVxuIiwKKwkJCW9wY29kZSwgaTI0MDBtX2JyaF9nZXRfcmVzcG9uc2UoYWNrKSk7CisJCWdvdG8gZXJyb3JfYWNrX2ZhaWxlZDsKKwl9CisJaWYgKGFja19zaXplIDwgYWNrLT5kYXRhX3NpemUgKyBzaXplb2YoKmFjaykpIHsKKwkJZGV2X2VycihkZXYsICJib290LW1vZGUgY21kICVkOiBTVyBCVUcgIgorCQkJImRyaXZlciBwcm92aWRlZCBvbmx5ICV6dSBieXRlcyBmb3IgJXp1IGJ5dGVzICIKKwkJCSJvZiBkYXRhXG4iLCBvcGNvZGUsIGFja19zaXplLAorCQkJKHNpemVfdCkgbGUzMl90b19jcHUoYWNrLT5kYXRhX3NpemUpICsgc2l6ZW9mKCphY2spKTsKKwkJZ290byBlcnJvcl9hY2tfc2hvcnRfYnVmZmVyOworCX0KKwlyZXN1bHQgPSBhY2tfc2l6ZTsKKwkvKiBEb24ndCB5b3UgbG92ZSB0aGlzIHN0YWNrIG9mIGVtcHR5IHRhcmdldHM/IFdlbGwsIEkgZG9uJ3QKKwkgKiBlaXRoZXIsIGJ1dCBpdCBoZWxwcyB0cmFjayBleGFjdGx5IHdobyBjb21lcyBpbiBoZXJlIGFuZAorCSAqIHdoeSA6KSAqLworZXJyb3JfYWNrX3Nob3J0X2J1ZmZlcjoKK2Vycm9yX2Fja19mYWlsZWQ6CitlcnJvcl9hY2tfb3Bjb2RlOgorZXJyb3JfYWNrX3NpZ25hdHVyZToKK291dF9yYXc6CitlcnJvcl9yZWJvb3RfYWNrOgorZXJyb3JfcmVib290OgorZXJyb3JfYWNrX3Nob3J0OgorCWRfZm5lbmQoOCwgZGV2LCAiKGkyNDAwbSAlcCBvcGNvZGUgJWQgYWNrICVwIHNpemUgJXp1KSA9ICVkXG4iLAorCQlpMjQwMG0sIG9wY29kZSwgYWNrLCBhY2tfc2l6ZSwgKGludCkgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qKgorICogaTI0MDBtX2JtX2NtZCAtIEV4ZWN1dGUgYSBib290IG1vZGUgY29tbWFuZAorICoKKyAqIEBjbWQ6IGJ1ZmZlciBjb250YWluaW5nIHRoZSBjb21tYW5kIGRhdGEgKHBvaW50aW5nIGF0IHRoZSBoZWFkZXIpLgorICogICAgIFRoaXMgZGF0YSBjYW4gYmUgQU5ZV0hFUkUgKGZvciBVU0IsIHdlIHdpbGwgY29weSBpdCB0byBhbgorICogICAgIHNwZWNpZmljIGJ1ZmZlcikuIE1ha2Ugc3VyZSBldmVyeXRoaW5nIGlzIGluIHByb3BlciBsaXR0bGUKKyAqICAgICBlbmRpYW4uCisgKgorICogICAgIEEgcmF3IGJ1ZmZlciBjYW4gYmUgYWxzbyBzZW50LCBqdXN0IGNhc3QgaXQgYW5kIHNldCBmbGFncyB0bworICogICAgIEkyNDAwTV9CTV9DTURfUkFXLgorICoKKyAqICAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgZ2VuZXJhdGUgYSBjaGVja3N1bSBmb3IgeW91IGlmIHRoZQorICogICAgIGNoZWNrc3VtIGJpdCBpbiB0aGUgY29tbWFuZCBpcyBzZXQgKHVubGVzcyBJMjQwME1fQk1fQ01EX1JBVworICogICAgIGlzIHNldCkuCisgKgorICogICAgIFlvdSBjYW4gdXNlIHRoZSBpMjQwMG0tPmJtX2NtZF9idWYgdG8gc3RhZ2UgeW91ciBjb21tYW5kcyBhbmQKKyAqICAgICBzZW5kIHRoZW0uCisgKgorICogICAgIElmIE5VTEwsIG5vIGNvbW1hbmQgaXMgc2VudCAod2UganVzdCB3YWl0IGZvciBhbiBhY2spLgorICoKKyAqIEBjbWRfc2l6ZTogc2l6ZSBvZiB0aGUgY29tbWFuZC4gV2lsbCBiZSBhdXRvIHBhZGRlZCB0byB0aGUKKyAqICAgICBidXMtc3BlY2lmaWMgZHJpdmVycyBwYWRkaW5nIHJlcXVpcmVtZW50cy4KKyAqCisgKiBAYWNrOiBidWZmZXIgd2hlcmUgdG8gcGxhY2UgdGhlIGFja25vd2xlZGdlbWVudC4gSWYgaXQgaXMgYSByZWd1bGFyCisgKiAgICAgY29tbWFuZCByZXNwb25zZSwgYWxsIGZpZWxkcyB3aWxsIGJlIHJldHVybmVkIHdpdGggdGhlIHJpZ2h0LAorICogICAgIG5hdGl2ZSBlbmRpYW5lc3MuCisgKgorICogICAgIFlvdSAqY2Fubm90KiB1c2UgaTI0MDBtLT5ibV9hY2tfYnVmIGZvciB0aGlzIGJ1ZmZlci4KKyAqCisgKiBAYWNrX3NpemU6IHNpemUgb2YgQGFjaywgMTYgYWxpZ25lZDsgeW91IG5lZWQgdG8gcHJvdmlkZSBhdCBsZWFzdAorICogICAgIHNpemVvZigqYWNrKSBieXRlcyBhbmQgdGhlbiBlbm91Z2ggdG8gY29udGFpbiB0aGUgcmV0dXJuIGRhdGEKKyAqICAgICBmcm9tIHRoZSBjb21tYW5kCisgKgorICogQGZsYWdzOiBzZWUgSTI0MDBNX0JNX0NNRF8qIGFib3ZlLgorICoKKyAqIEByZXR1cm5zOiBieXRlcyByZWNlaXZlZCBieSB0aGUgbm90aWZpY2F0aW9uOyBpZiA8IDAsIGFuIGVycm5vIGNvZGUKKyAqICAgICBkZW5vdGluZyBhbiBlcnJvciBvcjoKKyAqCisgKiAgICAgLUVSRVNUQVJUU1lTICBUaGUgZGV2aWNlIGhhcyByZWJvb3RlZAorICoKKyAqIEV4ZWN1dGVzIGEgYm9vdC1tb2RlIGNvbW1hbmQgYW5kIHdhaXRzIGZvciBhIHJlc3BvbnNlLCBkb2luZyBiYXNpYworICogdmFsaWRhdGlvbiBvbiBpdDsgaWYgYSB6ZXJvIGxlbmd0aCByZXNwb25zZSBpcyByZWNlaXZlZCwgaXQgcmV0cmllcworICogd2FpdGluZyBmb3IgYSByZXNwb25zZSB1bnRpbCBhIG5vbi16ZXJvIG9uZSBpcyByZWNlaXZlZCAodGltaW5nIG91dAorICogYWZ0ZXIgJUkyNDAwTV9CT09UX1JFVFJJRVMgcmV0cmllcykuCisgKi8KK3N0YXRpYworc3NpemVfdCBpMjQwMG1fYm1fY21kKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwKKwkJICAgICAgY29uc3Qgc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciAqY21kLCBzaXplX3QgY21kX3NpemUsCisJCSAgICAgIHN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgKmFjaywgc2l6ZV90IGFja19zaXplLAorCQkgICAgICBpbnQgZmxhZ3MpCit7CisJc3NpemVfdCByZXN1bHQgPSAtRU5PTUVNLCByeF9ieXRlczsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJaW50IG9wY29kZSA9IGNtZCA9PSBOVUxMID8gLTEgOiBpMjQwMG1fYnJoX2dldF9vcGNvZGUoY21kKTsKKworCWRfZm5zdGFydCg2LCBkZXYsICIoaTI0MDBtICVwIGNtZCAlcCBzaXplICV6dSBhY2sgJXAgc2l6ZSAlenUpXG4iLAorCQkgIGkyNDAwbSwgY21kLCBjbWRfc2l6ZSwgYWNrLCBhY2tfc2l6ZSk7CisJQlVHX09OKGFja19zaXplIDwgc2l6ZW9mKCphY2spKTsKKwlCVUdfT04oaTI0MDBtLT5ib290X21vZGUgPT0gMCk7CisKKwlpZiAoY21kICE9IE5VTEwpIHsJCS8qIHNlbmQgdGhlIGNvbW1hbmQgKi8KKwkJbWVtY3B5KGkyNDAwbS0+Ym1fY21kX2J1ZiwgY21kLCBjbWRfc2l6ZSk7CisJCXJlc3VsdCA9IGkyNDAwbS0+YnVzX2JtX2NtZF9zZW5kKGkyNDAwbSwgY21kLCBjbWRfc2l6ZSwgZmxhZ3MpOworCQlpZiAocmVzdWx0IDwgMCkKKwkJCWdvdG8gZXJyb3JfY21kX3NlbmQ7CisJCWlmICgoZmxhZ3MgJiBJMjQwME1fQk1fQ01EX1JBVykgPT0gMCkKKwkJCWRfcHJpbnRmKDUsIGRldiwKKwkJCQkgImJvb3QtbW9kZSBjbWQgJWQgY3N1bSAldSByciAldSBkYSAldTogIgorCQkJCSAiYWRkciAweCUwNHggc2l6ZSAldSBibG9jayBjc3VtIDB4JTA0eFxuIiwKKwkJCQkgb3Bjb2RlLCBpMjQwMG1fYnJoX2dldF91c2VfY2hlY2tzdW0oY21kKSwKKwkJCQkgaTI0MDBtX2JyaF9nZXRfcmVzcG9uc2VfcmVxdWlyZWQoY21kKSwKKwkJCQkgaTI0MDBtX2JyaF9nZXRfZGlyZWN0X2FjY2VzcyhjbWQpLAorCQkJCSBjbWQtPnRhcmdldF9hZGRyLCBjbWQtPmRhdGFfc2l6ZSwKKwkJCQkgY21kLT5ibG9ja19jaGVja3N1bSk7CisJfQorCXJlc3VsdCA9IGkyNDAwbS0+YnVzX2JtX3dhaXRfZm9yX2FjayhpMjQwMG0sIGFjaywgYWNrX3NpemUpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiYm9vdC1tb2RlIGNtZCAlZDogZXJyb3Igd2FpdGluZyBmb3IgYW4gYWNrOiAlZFxuIiwKKwkJCW9wY29kZSwgKGludCkgcmVzdWx0KTsJLyogYmFoLCAlemQgZG9lc24ndCB3b3JrICovCisJCWdvdG8gZXJyb3Jfd2FpdF9mb3JfYWNrOworCX0KKwlyeF9ieXRlcyA9IHJlc3VsdDsKKwkvKiB2ZXJpZnkgdGhlIGFjayBhbmQgcmVhZCBtb3JlIGlmIG5lY2Nlc3NhcnkgW3Jlc3VsdCBpcyB0aGUKKwkgKiBmaW5hbCBhbW91bnQgb2YgYnl0ZXMgd2UgZ2V0IGluIHRoZSBhY2tdICAqLworCXJlc3VsdCA9IF9faTI0MDBtX2JtX2Fja192ZXJpZnkoaTI0MDBtLCBvcGNvZGUsIGFjaywgYWNrX3NpemUsIGZsYWdzKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBlcnJvcl9iYWRfYWNrOworCS8qIERvbid0IHlvdSBsb3ZlIHRoaXMgc3RhY2sgb2YgZW1wdHkgdGFyZ2V0cz8gV2VsbCwgSSBkb24ndAorCSAqIGVpdGhlciwgYnV0IGl0IGhlbHBzIHRyYWNrIGV4YWN0bHkgd2hvIGNvbWVzIGluIGhlcmUgYW5kCisJICogd2h5IDopICovCisJcmVzdWx0ID0gcnhfYnl0ZXM7CitlcnJvcl9iYWRfYWNrOgorZXJyb3Jfd2FpdF9mb3JfYWNrOgorZXJyb3JfY21kX3NlbmQ6CisJZF9mbmVuZCg2LCBkZXYsICIoaTI0MDBtICVwIGNtZCAlcCBzaXplICV6dSBhY2sgJXAgc2l6ZSAlenUpID0gJWRcbiIsCisJCWkyNDAwbSwgY21kLCBjbWRfc2l6ZSwgYWNrLCBhY2tfc2l6ZSwgKGludCkgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qKgorICogaTI0MDBtX2Rvd25sb2FkX2NodW5rIC0gd3JpdGUgYSBzaW5nbGUgY2h1bmsgb2YgZGF0YSB0byB0aGUgZGV2aWNlJ3MgbWVtb3J5CisgKgorICogQGkyNDAwbTogZGV2aWNlIGRlc2NyaXB0b3IKKyAqIEBidWY6IHRoZSBidWZmZXIgdG8gd3JpdGUKKyAqIEBidWZfbGVuOiBsZW5ndGggb2YgdGhlIGJ1ZmZlciB0byB3cml0ZQorICogQGFkZHI6IGFkZHJlc3MgaW4gdGhlIGRldmljZSBtZW1vcnkgc3BhY2UKKyAqIEBkaXJlY3Q6IGJvb3Ryb20gd3JpdGUgbW9kZQorICogQGRvX2NzdW06IHNob3VsZCBhIGNoZWNrc3VtIHZhbGlkYXRpb24gYmUgcGVyZm9ybWVkCisgKi8KK3N0YXRpYyBpbnQgaTI0MDBtX2Rvd25sb2FkX2NodW5rKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwgY29uc3Qgdm9pZCAqY2h1bmssCisJCQkJIHNpemVfdCBfX2NodW5rX2xlbiwgdW5zaWduZWQgbG9uZyBhZGRyLAorCQkJCSB1bnNpZ25lZCBpbnQgZGlyZWN0LCB1bnNpZ25lZCBpbnQgZG9fY3N1bSkKK3sKKwlpbnQgcmV0OworCXNpemVfdCBjaHVua19sZW4gPSBBTElHTihfX2NodW5rX2xlbiwgSTI0MDBNX1BMX1BBRCk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXN0cnVjdCB7CisJCXN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgY21kOworCQl1OCBjbWRfcGF5bG9hZFtjaHVua19sZW5dOworCX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgKmJ1ZjsKKwlzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyIGFjazsKKworCWRfZm5zdGFydCg1LCBkZXYsICIoaTI0MDBtICVwIGNodW5rICVwIF9fY2h1bmtfbGVuICV6dSBhZGRyIDB4JTA4bHggIgorCQkgICJkaXJlY3QgJXUgZG9fY3N1bSAldSlcbiIsIGkyNDAwbSwgY2h1bmssIF9fY2h1bmtfbGVuLAorCQkgIGFkZHIsIGRpcmVjdCwgZG9fY3N1bSk7CisJYnVmID0gaTI0MDBtLT5ibV9jbWRfYnVmOworCW1lbWNweShidWYtPmNtZF9wYXlsb2FkLCBjaHVuaywgX19jaHVua19sZW4pOworCW1lbXNldChidWYtPmNtZF9wYXlsb2FkICsgX19jaHVua19sZW4sIDB4YWQsIGNodW5rX2xlbiAtIF9fY2h1bmtfbGVuKTsKKworCWJ1Zi0+Y21kLmNvbW1hbmQgPSBpMjQwMG1fYnJoX2NvbW1hbmQoSTI0MDBNX0JSSF9XUklURSwKKwkJCQkJICAgICAgX19jaHVua19sZW4gJiAweDMgPyAwIDogZG9fY3N1bSwKKwkJCQkJICAgICAgX19jaHVua19sZW4gJiAweGYgPyAwIDogZGlyZWN0KTsKKwlidWYtPmNtZC50YXJnZXRfYWRkciA9IGNwdV90b19sZTMyKGFkZHIpOworCWJ1Zi0+Y21kLmRhdGFfc2l6ZSA9IGNwdV90b19sZTMyKF9fY2h1bmtfbGVuKTsKKwlyZXQgPSBpMjQwMG1fYm1fY21kKGkyNDAwbSwgJmJ1Zi0+Y21kLCBzaXplb2YoYnVmLT5jbWQpICsgY2h1bmtfbGVuLAorCQkJICAgICZhY2ssIHNpemVvZihhY2spLCAwKTsKKwlpZiAocmV0ID49IDApCisJCXJldCA9IDA7CisJZF9mbmVuZCg1LCBkZXYsICIoaTI0MDBtICVwIGNodW5rICVwIF9fY2h1bmtfbGVuICV6dSBhZGRyIDB4JTA4bHggIgorCQkiZGlyZWN0ICV1IGRvX2NzdW0gJXUpID0gJWRcbiIsIGkyNDAwbSwgY2h1bmssIF9fY2h1bmtfbGVuLAorCQlhZGRyLCBkaXJlY3QsIGRvX2NzdW0sIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworCisvKgorICogRG93bmxvYWQgYSBCQ0YgZmlsZSdzIHNlY3Rpb25zIHRvIHRoZSBkZXZpY2UKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcgorICogQGJjZjogcG9pbnRlciB0byBmaXJtd2FyZSBkYXRhIChmb2xsb3dlZCBieSB0aGUgcGF5bG9hZHMpLiBBc3N1bWVkCisgKiAgICAgICB2ZXJpZmllZCBhbmQgY29uc2lzdGVudC4KKyAqIEBiY2ZfbGVuOiBsZW5ndGggKGluIGJ5dGVzKSBvZiB0aGUgQGJjZiBidWZmZXIuCisgKgorICogUmV0dXJuczogPCAwIGVycm5vIGNvZGUgb24gZXJyb3Igb3IgdGhlIG9mZnNldCB0byB0aGUganVtcCBpbnN0cnVjdGlvbi4KKyAqCisgKiBHaXZlbiBhIEJDRiBmaWxlLCBkb3dubG9hZHMgZWFjaCBzZWN0aW9uIChhIGNvbW1hbmQgYW5kIGEgcGF5bG9hZCkKKyAqIHRvIHRoZSBkZXZpY2UncyBhZGRyZXNzIHNwYWNlLiBBY3R1YWxseSwgaXQganVzdCBleGVjdXRlcyBlYWNoCisgKiBjb21tYW5kIGkgdGhlIEJDRiBmaWxlLgorICoKKyAqIFRoZSBzZWN0aW9uIHNpemUgaGFzIHRvIGJlIGFsaWduZWQgdG8gNCBieXRlcyBBTkQgdGhlIHBhZGRpbmcgaGFzCisgKiB0byBiZSB0YWtlbiBmcm9tIHRoZSBmaXJtd2FyZSBmaWxlLCBhcyB0aGUgc2lnbmF0dXJlIHRha2VzIGl0IGludG8KKyAqIGFjY291bnQuCisgKi8KK3N0YXRpYworc3NpemVfdCBpMjQwMG1fZG5sb2FkX2JjZihzdHJ1Y3QgaTI0MDBtICppMjQwMG0sCisJCQkgIGNvbnN0IHN0cnVjdCBpMjQwMG1fYmNmX2hkciAqYmNmLCBzaXplX3QgYmNmX2xlbikKK3sKKwlzc2l6ZV90IHJldDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJc2l6ZV90IG9mZnNldCwJCS8qIGl0ZXJhdG9yIG9mZnNldCAqLworCQlkYXRhX3NpemUsCS8qIFNpemUgb2YgdGhlIGRhdGEgcGF5bG9hZCAqLworCQlzZWN0aW9uX3NpemUsCS8qIFNpemUgb2YgdGhlIHdob2xlIHNlY3Rpb24gKGNtZCArIHBheWxvYWQpICovCisJCXNlY3Rpb24gPSAxOworCWNvbnN0IHN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgKmJoOworCXN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgYWNrOworCisJZF9mbnN0YXJ0KDMsIGRldiwgIihpMjQwMG0gJXAgYmNmICVwIGJjZl9sZW4gJXp1KVxuIiwKKwkJICBpMjQwMG0sIGJjZiwgYmNmX2xlbik7CisJLyogSXRlcmF0ZSBvdmVyIHRoZSBjb21tYW5kIGJsb2NrcyBpbiB0aGUgQkNGIGZpbGUgdGhhdCBzdGFydAorCSAqIGFmdGVyIHRoZSBoZWFkZXIgKi8KKwlvZmZzZXQgPSBsZTMyX3RvX2NwdShiY2YtPmhlYWRlcl9sZW4pICogc2l6ZW9mKHUzMik7CisJd2hpbGUgKDEpIHsJLyogc3RhcnQgc2VuZGluZyB0aGUgZmlsZSAqLworCQliaCA9ICh2b2lkICopIGJjZiArIG9mZnNldDsKKwkJZGF0YV9zaXplID0gbGUzMl90b19jcHUoYmgtPmRhdGFfc2l6ZSk7CisJCXNlY3Rpb25fc2l6ZSA9IEFMSUdOKHNpemVvZigqYmgpICsgZGF0YV9zaXplLCA0KTsKKwkJZF9wcmludGYoNywgZGV2LAorCQkJICJkb3dubG9hZGluZyBzZWN0aW9uICMlenUgKEAlenUgJXp1IEIpIHRvIDB4JTA4eFxuIiwKKwkJCSBzZWN0aW9uLCBvZmZzZXQsIHNpemVvZigqYmgpICsgZGF0YV9zaXplLAorCQkJIGxlMzJfdG9fY3B1KGJoLT50YXJnZXRfYWRkcikpOworCQlpZiAoaTI0MDBtX2JyaF9nZXRfb3Bjb2RlKGJoKSA9PSBJMjQwME1fQlJIX1NJR05FRF9KVU1QKSB7CisJCQkvKiBTZWN1cmUgYm9vdCBuZWVkcyB0byBzdG9wIGhlcmUgKi8KKwkJCWRfcHJpbnRmKDUsIGRldiwgICJzaWduZWQganVtcCBmb3VuZCBAJXp1XG4iLCBvZmZzZXQpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKG9mZnNldCArIHNlY3Rpb25fc2l6ZSA9PSBiY2ZfbGVuKQorCQkJLyogTm9uLXNlY3VyZSBib290IHN0b3BzIGhlcmUgKi8KKwkJCWJyZWFrOworCQlpZiAob2Zmc2V0ICsgc2VjdGlvbl9zaXplID4gYmNmX2xlbikgeworCQkJZGV2X2VycihkZXYsICJmdyAlczogYmFkIHNlY3Rpb24gIyV6dSwgIgorCQkJCSJlbmQgKEAlenUpIGJleW9uZCBFT0YgKEAlenUpXG4iLAorCQkJCWkyNDAwbS0+YnVzX2Z3X25hbWUsIHNlY3Rpb24sCisJCQkJb2Zmc2V0ICsgc2VjdGlvbl9zaXplLCAgYmNmX2xlbik7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJvcl9zZWN0aW9uX2JleW9uZF9lb2Y7CisJCX0KKwkJX19pMjQwMG1fbXNsZWVwKDIwKTsKKwkJcmV0ID0gaTI0MDBtX2JtX2NtZChpMjQwMG0sIGJoLCBzZWN0aW9uX3NpemUsCisJCQkJICAgICZhY2ssIHNpemVvZihhY2spLCBJMjQwME1fQk1fQ01EX1JBVyk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKGRldiwgImZ3ICVzOiBzZWN0aW9uICMlenUgKEAlenUgJXp1IEIpICIKKwkJCQkiZmFpbGVkICVkXG4iLCBpMjQwMG0tPmJ1c19md19uYW1lLCBzZWN0aW9uLAorCQkJCW9mZnNldCwgc2l6ZW9mKCpiaCkgKyBkYXRhX3NpemUsIChpbnQpIHJldCk7CisJCQlnb3RvIGVycm9yX3NlbmQ7CisJCX0KKwkJb2Zmc2V0ICs9IHNlY3Rpb25fc2l6ZTsKKwkJc2VjdGlvbisrOworCX0KKwlyZXQgPSBvZmZzZXQ7CitlcnJvcl9zZWN0aW9uX2JleW9uZF9lb2Y6CitlcnJvcl9zZW5kOgorCWRfZm5lbmQoMywgZGV2LCAiKGkyNDAwbSAlcCBiY2YgJXAgYmNmX2xlbiAlenUpID0gJWRcbiIsCisJCWkyNDAwbSwgYmNmLCBiY2ZfbGVuLCAoaW50KSByZXQpOworCXJldHVybiByZXQ7Cit9CisKKworLyoKKyAqIERvIHRoZSBmaW5hbCBzdGVwcyBvZiB1cGxvYWRpbmcgZmlybXdhcmUKKyAqCisgKiBEZXBlbmRpbmcgb24gdGhlIGJvb3QgbW9kZSAoc2lnbmVkIHZzIG5vbi1zaWduZWQpLCBkaWZmZXJlbnQKKyAqIGFjdGlvbnMgbmVlZCB0byBiZSB0YWtlbi4KKyAqLworc3RhdGljCitpbnQgaTI0MDBtX2RubG9hZF9maW5hbGl6ZShzdHJ1Y3QgaTI0MDBtICppMjQwMG0sCisJCQkgICBjb25zdCBzdHJ1Y3QgaTI0MDBtX2JjZl9oZHIgKmJjZiwgc2l6ZV90IG9mZnNldCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciAqY21kLCBhY2s7CisJc3RydWN0IHsKKwkJc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciBjbWQ7CisJCXU4IGNtZF9wbFswXTsKKwl9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpICpjbWRfYnVmOworCXNpemVfdCBzaWduYXR1cmVfYmxvY2tfb2Zmc2V0LCBzaWduYXR1cmVfYmxvY2tfc2l6ZTsKKworCWRfZm5zdGFydCgzLCBkZXYsICJvZmZzZXQgJXp1XG4iLCBvZmZzZXQpOworCWNtZCA9ICh2b2lkICopIGJjZiArIG9mZnNldDsKKwlpZiAoaTI0MDBtLT5zYm9vdCA9PSAwKSB7CisJCXN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIganVtcF9hY2s7CisJCWRfcHJpbnRmKDMsIGRldiwgInVuc2VjdXJlIGJvb3QsIGp1bXBpbmcgdG8gMHglMDh4XG4iLAorCQkJbGUzMl90b19jcHUoY21kLT50YXJnZXRfYWRkcikpOworCQlpMjQwMG1fYnJoX3NldF9vcGNvZGUoY21kLCBJMjQwME1fQlJIX0pVTVApOworCQljbWQtPmRhdGFfc2l6ZSA9IDA7CisJCXJldCA9IGkyNDAwbV9ibV9jbWQoaTI0MDBtLCBjbWQsIHNpemVvZigqY21kKSwKKwkJCQkgICAgJmp1bXBfYWNrLCBzaXplb2YoanVtcF9hY2spLCAwKTsKKwl9IGVsc2UgeworCQlkX3ByaW50ZigzLCBkZXYsICJzZWN1cmUgYm9vdCwganVtcGluZyB0byAweCUwOHhcbiIsCisJCQkgbGUzMl90b19jcHUoY21kLT50YXJnZXRfYWRkcikpOworCQljbWRfYnVmID0gaTI0MDBtLT5ibV9jbWRfYnVmOworCQltZW1jcHkoJmNtZF9idWYtPmNtZCwgY21kLCBzaXplb2YoKmNtZCkpOworCQlzaWduYXR1cmVfYmxvY2tfb2Zmc2V0ID0KKwkJCXNpemVvZigqYmNmKQorCQkJKyBsZTMyX3RvX2NwdShiY2YtPmtleV9zaXplKSAqIHNpemVvZih1MzIpCisJCQkrIGxlMzJfdG9fY3B1KGJjZi0+ZXhwb25lbnRfc2l6ZSkgKiBzaXplb2YodTMyKTsKKwkJc2lnbmF0dXJlX2Jsb2NrX3NpemUgPQorCQkJbGUzMl90b19jcHUoYmNmLT5tb2R1bHVzX3NpemUpICogc2l6ZW9mKHUzMik7CisJCW1lbWNweShjbWRfYnVmLT5jbWRfcGwsICh2b2lkICopIGJjZiArIHNpZ25hdHVyZV9ibG9ja19vZmZzZXQsCisJCSAgICAgICBzaWduYXR1cmVfYmxvY2tfc2l6ZSk7CisJCXJldCA9IGkyNDAwbV9ibV9jbWQoaTI0MDBtLCAmY21kX2J1Zi0+Y21kLAorCQkJCSAgICBzaXplb2YoY21kX2J1Zi0+Y21kKSArIHNpZ25hdHVyZV9ibG9ja19zaXplLAorCQkJCSAgICAmYWNrLCBzaXplb2YoYWNrKSwgSTI0MDBNX0JNX0NNRF9SQVcpOworCX0KKwlkX2ZuZW5kKDMsIGRldiwgInJldHVybmluZyAlZFxuIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qKgorICogaTI0MDBtX2Jvb3Ryb21faW5pdCAtIFJlYm9vdHMgYSBwb3dlcmVkIGRldmljZSBpbnRvIGJvb3QgbW9kZQorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKiBAZmxhZ3M6CisgKiAgICAgIEkyNDAwTV9CUklfU09GVDogYSByZWJvb3Qgbm90aWZpY2F0aW9uIGhhcyBiZWVuIHNlZW4KKyAqICAgICAgICAgIGFscmVhZHksIHNvIGRvbid0IHdhaXQgZm9yIGl0LgorICoKKyAqICAgICAgSTI0MDBNX0JSSV9OT19SRUJPT1Q6IERvbid0IHNlbmQgYSByZWJvb3QgY29tbWFuZCwgYnV0IHdhaXQKKyAqICAgICAgICAgIGZvciBhIHJlYm9vdCBiYXJrZXIgbm90aWZpY2F0aW9uLiBUaGlzIGlzIGEgb25lIHNob3Q7IGlmCisgKiAgICAgICAgICB0aGUgc3RhdGUgbWFjaGluZSBuZWVkcyB0byBzZW5kIGEgcmVib290IGNvbW1hbmQgaXQgd2lsbC4KKyAqCisgKiBSZXR1cm5zOgorICoKKyAqICAgICA8IDAgZXJybm8gY29kZSBvbiBlcnJvciwgMCBpZiBvay4KKyAqCisgKiAgICAgaTI0MDBtLT5zYm9vdCBzZXQgdG8gMCBmb3IgdW5zZWN1cmUgYm9vdCBwcm9jZXNzLCAxIGZvciBzZWN1cmUKKyAqICAgICBib290IHByb2Nlc3MuCisgKgorICogRGVzY3JpcHRpb246CisgKgorICogVHJpZXMgaGFyZCBlbm91Z2ggdG8gcHV0IHRoZSBkZXZpY2UgaW4gYm9vdC1tb2RlLiBUaGVyZSBhcmUgdHdvCisgKiBtYWluIHBoYXNlcyB0byB0aGlzOgorICoKKyAqIGEuICgxKSBzZW5kIGEgcmVib290IGNvbW1hbmQgYW5kICgyKSBnZXQgYSByZWJvb3QgYmFya2VyCisgKiBiLiAoMSkgYWNrIHRoZSByZWJvb3Qgc2VuZGluZyBhIHJlYm9vdCBiYXJrZXIgYW5kICgyKSBnZXR0aW5nIGFuCisgKiAgICAgICAgYWNrIGJhcmtlciBpbiByZXR1cm4KKyAqCisgKiBXZSB3YW50IHRvIHNraXAgKGEpIGluIHNvbWUgY2FzZXMgW3NvZnRdLiBUaGUgc3RhdGUgbWFjaGluZSBpcworICogaG9ycmlibGUsIGJ1dCBpdCBpcyBiYXNpY2FsbHk6IG9uIGVhY2ggcGhhc2UsIHNlbmQgd2hhdCBoYXMgdG8gYmUKKyAqIHNlbnQgKGlmIGFueSksIHdhaXQgZm9yIHRoZSBhbnN3ZXIgYW5kIGFjdCBvbiB0aGUgYW5zd2VyLiBXZSBtaWdodAorICogaGF2ZSB0byBiYWNrdHJhY2sgYW5kIHJldHJ5LCBzbyB3ZSBrZWVwIGEgbWF4IHRyaWVzIGNvdW50ZXIgZm9yCisgKiB0aGF0LgorICoKKyAqIElmIHdlIGdldCBhIHRpbWVvdXQgYWZ0ZXIgc2VuZGluZyBhIHdhcm0gcmVzZXQsIHdlIGRvIGl0IGFnYWluLgorICovCitpbnQgaTI0MDBtX2Jvb3Ryb21faW5pdChzdHJ1Y3QgaTI0MDBtICppMjQwMG0sIGVudW0gaTI0MDBtX2JyaSBmbGFncykKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyICpjbWQ7CisJc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciBhY2s7CisJaW50IGNvdW50ID0gSTI0MDBNX0JPT1RfUkVUUklFUzsKKwlpbnQgYWNrX3RpbWVvdXRfY250ID0gMTsKKworCUJVSUxEX0JVR19PTihzaXplb2YoKmNtZCkgIT0gc2l6ZW9mKGkyNDAwbV9OQk9PVF9CQVJLRVIpKTsKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKGFjaykgIT0gc2l6ZW9mKGkyNDAwbV9BQ0tfQkFSS0VSKSk7CisKKwlkX2Zuc3RhcnQoNCwgZGV2LCAiKGkyNDAwbSAlcCBmbGFncyAweCUwOHgpXG4iLCBpMjQwMG0sIGZsYWdzKTsKKwlyZXN1bHQgPSAtRU5PTUVNOworCWNtZCA9IGkyNDAwbS0+Ym1fY21kX2J1ZjsKKwlpZiAoZmxhZ3MgJiBJMjQwME1fQlJJX1NPRlQpCisJCWdvdG8gZG9fcmVib290X2FjazsKK2RvX3JlYm9vdDoKKwlpZiAoLS1jb3VudCA8IDApCisJCWdvdG8gZXJyb3JfdGltZW91dDsKKwlkX3ByaW50Zig0LCBkZXYsICJkZXZpY2UgcmVib290OiByZWJvb3QgY29tbWFuZCBbJWQgIyBsZWZ0XVxuIiwKKwkJIGNvdW50KTsKKwlpZiAoKGZsYWdzICYgSTI0MDBNX0JSSV9OT19SRUJPT1QpID09IDApCisJCWkyNDAwbS0+YnVzX3Jlc2V0KGkyNDAwbSwgSTI0MDBNX1JUX1dBUk0pOworCXJlc3VsdCA9IGkyNDAwbV9ibV9jbWQoaTI0MDBtLCBOVUxMLCAwLCAmYWNrLCBzaXplb2YoYWNrKSwKKwkJCSAgICAgICBJMjQwME1fQk1fQ01EX1JBVyk7CisJZmxhZ3MgJj0gfkkyNDAwTV9CUklfTk9fUkVCT09UOworCXN3aXRjaCAocmVzdWx0KSB7CisJY2FzZSAtRVJFU1RBUlRTWVM6CisJCWRfcHJpbnRmKDQsIGRldiwgImRldmljZSByZWJvb3Q6IGdvdCByZWJvb3QgYmFya2VyXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAtRUlTQ09OTjoJLyogd2UgZG9uJ3Qga25vdyBob3cgaXQgZ290IGhlcmUuLi5idXQgd2UgZm9sbG93IGl0ICovCisJCWRfcHJpbnRmKDQsIGRldiwgImRldmljZSByZWJvb3Q6IGdvdCBhY2sgYmFya2VyIC0gd2hhdGV2ZXJcbiIpOworCQlnb3RvIGRvX3JlYm9vdDsKKwljYXNlIC1FVElNRURPVVQ6CS8qIGRldmljZSBoYXMgdGltZWQgb3V0LCB3ZSBtaWdodCBiZSBpbiBib290CisJCQkJICogbW9kZSBhbHJlYWR5IGFuZCBleHBlY3RpbmcgYW4gYWNrLCBsZXQncyB0cnkKKwkJCQkgKiB0aGF0ICovCisJCWRldl9pbmZvKGRldiwgIndhcm0gcmVzZXQgdGltZWQgb3V0LCB0cnlpbmcgYW4gYWNrXG4iKTsKKwkJZ290byBkb19yZWJvb3RfYWNrOworCWNhc2UgLUVQUk9UTzoKKwljYXNlIC1FU0hVVERPV046CS8qIGRldiBpcyBnb25lICovCisJY2FzZSAtRUlOVFI6CQkvKiB1c2VyIGNhbmNlbGxlZCAqLworCQlnb3RvIGVycm9yX2Rldl9nb25lOworCWRlZmF1bHQ6CisJCWRldl9lcnIoZGV2LCAiZGV2aWNlIHJlYm9vdDogZXJyb3IgJWQgd2hpbGUgd2FpdGluZyAiCisJCQkiZm9yIHJlYm9vdCBiYXJrZXIgLSByZWJvb3RpbmdcbiIsIHJlc3VsdCk7CisJCWdvdG8gZG9fcmVib290OworCX0KKwkvKiBBdCB0aGlzIHBvaW50IHdlIGFjayBiYWNrIHdpdGggNCBSRUJPT1QgYmFya2VycyBhbmQgZXhwZWN0CisJICogNCBBQ0sgYmFya2Vycy4gVGhpcyBpcyB1Z2x5LCBhcyB3ZSBzZW5kIGEgcmF3IGNvbW1hbmQgLS0KKwkgKiBoZW5jZSB0aGUgY2FzdC4gX2JtX2NtZCgpIHdpbGwgY2F0Y2ggdGhlIHJlYm9vdCBhY2sKKwkgKiBub3RpZmljYXRpb24gYW5kIHJlcG9ydCBpdCBhcyAtRUlTQ09OTi4gKi8KK2RvX3JlYm9vdF9hY2s6CisJZF9wcmludGYoNCwgZGV2LCAiZGV2aWNlIHJlYm9vdCBhY2s6IHNlbmRpbmcgYWNrIFslZCAjIGxlZnRdXG4iLCBjb3VudCk7CisJaWYgKGkyNDAwbS0+c2Jvb3QgPT0gMCkKKwkJbWVtY3B5KGNtZCwgaTI0MDBtX05CT09UX0JBUktFUiwKKwkJICAgICAgIHNpemVvZihpMjQwMG1fTkJPT1RfQkFSS0VSKSk7CisJZWxzZQorCQltZW1jcHkoY21kLCBpMjQwMG1fU0JPT1RfQkFSS0VSLAorCQkgICAgICAgc2l6ZW9mKGkyNDAwbV9TQk9PVF9CQVJLRVIpKTsKKwlyZXN1bHQgPSBpMjQwMG1fYm1fY21kKGkyNDAwbSwgY21kLCBzaXplb2YoKmNtZCksCisJCQkgICAgICAgJmFjaywgc2l6ZW9mKGFjayksIEkyNDAwTV9CTV9DTURfUkFXKTsKKwlzd2l0Y2ggKHJlc3VsdCkgeworCWNhc2UgLUVSRVNUQVJUU1lTOgorCQlkX3ByaW50Zig0LCBkZXYsICJyZWJvb3QgYWNrOiBnb3QgcmVib290IGJhcmtlciAtIHJldHJ5aW5nXG4iKTsKKwkJaWYgKC0tY291bnQgPCAwKQorCQkJZ290byBlcnJvcl90aW1lb3V0OworCQlnb3RvIGRvX3JlYm9vdF9hY2s7CisJY2FzZSAtRUlTQ09OTjoKKwkJZF9wcmludGYoNCwgZGV2LCAicmVib290IGFjazogZ290IGFjayBiYXJrZXIgLSBnb29kXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAtRVRJTUVET1VUOgkvKiBubyByZXNwb25zZSwgbWF5YmUgaXQgaXMgdGhlIG90aGVyIHR5cGU/ICovCisJCWlmIChhY2tfdGltZW91dF9jbnQtLSA+PSAwKSB7CisJCQlkX3ByaW50Zig0LCBkZXYsICJyZWJvb3QgYWNrIHRpbWVkb3V0OiAiCisJCQkJICJ0cnlpbmcgdGhlIG90aGVyIHR5cGU/XG4iKTsKKwkJCWkyNDAwbS0+c2Jvb3QgPSAhaTI0MDBtLT5zYm9vdDsKKwkJCWdvdG8gZG9fcmVib290X2FjazsKKwkJfSBlbHNlIHsKKwkJCWRldl9lcnIoZGV2LCAicmVib290IGFjayB0aW1lZG91dCB0b28gbG9uZzogIgorCQkJCSJ0cnlpbmcgcmVib290XG4iKTsKKwkJCWdvdG8gZG9fcmVib290OworCQl9CisJCWJyZWFrOworCWNhc2UgLUVQUk9UTzoKKwljYXNlIC1FU0hVVERPV046CS8qIGRldiBpcyBnb25lICovCisJCWdvdG8gZXJyb3JfZGV2X2dvbmU7CisJZGVmYXVsdDoKKwkJZGV2X2VycihkZXYsICJkZXZpY2UgcmVib290IGFjazogZXJyb3IgJWQgd2hpbGUgd2FpdGluZyBmb3IgIgorCQkJInJlYm9vdCBhY2sgYmFya2VyIC0gcmVib290aW5nXG4iLCByZXN1bHQpOworCQlnb3RvIGRvX3JlYm9vdDsKKwl9CisJZF9wcmludGYoMiwgZGV2LCAiZGV2aWNlIHJlYm9vdCBhY2s6IGdvdCBhY2sgYmFya2VyIC0gYm9vdCBkb25lXG4iKTsKKwlyZXN1bHQgPSAwOworZXhpdF90aW1lb3V0OgorZXJyb3JfZGV2X2dvbmU6CisJZF9mbmVuZCg0LCBkZXYsICIoaTI0MDBtICVwIGZsYWdzIDB4JTA4eCkgPSAlZFxuIiwKKwkJaTI0MDBtLCBmbGFncywgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworCitlcnJvcl90aW1lb3V0OgorCWRldl9lcnIoZGV2LCAiVGltZWQgb3V0IHdhaXRpbmcgZm9yIHJlYm9vdCBhY2ssIHJlc2V0dGluZ1xuIik7CisJaTI0MDBtLT5idXNfcmVzZXQoaTI0MDBtLCBJMjQwME1fUlRfQlVTKTsKKwlyZXN1bHQgPSAtRVRJTUVET1VUOworCWdvdG8gZXhpdF90aW1lb3V0OworfQorCisKKy8qCisgKiBSZWFkIHRoZSBNQUMgYWRkcgorICoKKyAqIFRoZSBwb3NpdGlvbiB0aGlzIGZ1bmN0aW9uIHJlYWRzIGlzIGZpeGVkIGluIGRldmljZSBtZW1vcnkgYW5kCisgKiBhbHdheXMgYXZhaWxhYmxlLCBldmVuIHdpdGhvdXQgZmlybXdhcmUuCisgKgorICogTm90ZSB3ZSBzcGVjaWZ5IHdlIHdhbnQgdG8gcmVhZCBvbmx5IHNpeCBieXRlcywgYnV0IHByb3ZpZGUgc3BhY2UKKyAqIGZvciAxNiwgYXMgd2UgYWx3YXlzIGdldCBpdCByb3VuZGVkIHVwLgorICovCitpbnQgaTI0MDBtX3JlYWRfbWFjX2FkZHIoc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gaTI0MDBtLT53aW1heF9kZXYubmV0X2RldjsKKwlzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyICpjbWQ7CisJc3RydWN0IHsKKwkJc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciBhY2s7CisJCXU4IGFja19wbFsxNl07CisJfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBhY2tfYnVmOworCisJZF9mbnN0YXJ0KDUsIGRldiwgIihpMjQwMG0gJXApXG4iLCBpMjQwMG0pOworCWNtZCA9IGkyNDAwbS0+Ym1fY21kX2J1ZjsKKwljbWQtPmNvbW1hbmQgPSBpMjQwMG1fYnJoX2NvbW1hbmQoSTI0MDBNX0JSSF9SRUFELCAwLCAxKTsKKwljbWQtPnRhcmdldF9hZGRyID0gY3B1X3RvX2xlMzIoMHgwMDIwM2ZlOCk7CisJY21kLT5kYXRhX3NpemUgPSBjcHVfdG9fbGUzMig2KTsKKwlyZXN1bHQgPSBpMjQwMG1fYm1fY21kKGkyNDAwbSwgY21kLCBzaXplb2YoKmNtZCksCisJCQkgICAgICAgJmFja19idWYuYWNrLCBzaXplb2YoYWNrX2J1ZiksIDApOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiQk06IHJlYWQgbWFjIGFkZHIgZmFpbGVkOiAlZFxuIiwgcmVzdWx0KTsKKwkJZ290byBlcnJvcl9yZWFkX21hYzsKKwl9CisJZF9wcmludGYoMiwgZGV2LAorCQkgIm1hYyBhZGRyIGlzICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkgYWNrX2J1Zi5hY2tfcGxbMF0sIGFja19idWYuYWNrX3BsWzFdLAorCQkgYWNrX2J1Zi5hY2tfcGxbMl0sIGFja19idWYuYWNrX3BsWzNdLAorCQkgYWNrX2J1Zi5hY2tfcGxbNF0sIGFja19idWYuYWNrX3BsWzVdKTsKKwlpZiAoaTI0MDBtLT5idXNfYm1fbWFjX2FkZHJfaW1wYWlyZWQgPT0gMSkgeworCQlhY2tfYnVmLmFja19wbFswXSA9IDB4MDA7CisJCWFja19idWYuYWNrX3BsWzFdID0gMHgxNjsKKwkJYWNrX2J1Zi5hY2tfcGxbMl0gPSAweGQzOworCQlnZXRfcmFuZG9tX2J5dGVzKCZhY2tfYnVmLmFja19wbFszXSwgMyk7CisJCWRldl9lcnIoZGV2LCAiQk0gaXMgTUFDIGFkZHIgaW1wYWlyZWQsIGZha2luZyBNQUMgYWRkciB0byAiCisJCQkibWFjIGFkZHIgaXMgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQlhY2tfYnVmLmFja19wbFswXSwgYWNrX2J1Zi5hY2tfcGxbMV0sCisJCQlhY2tfYnVmLmFja19wbFsyXSwgYWNrX2J1Zi5hY2tfcGxbM10sCisJCQlhY2tfYnVmLmFja19wbFs0XSwgYWNrX2J1Zi5hY2tfcGxbNV0pOworCQlyZXN1bHQgPSAwOworCX0KKwluZXRfZGV2LT5hZGRyX2xlbiA9IEVUSF9BTEVOOworCW1lbWNweShuZXRfZGV2LT5wZXJtX2FkZHIsIGFja19idWYuYWNrX3BsLCBFVEhfQUxFTik7CisJbWVtY3B5KG5ldF9kZXYtPmRldl9hZGRyLCBhY2tfYnVmLmFja19wbCwgRVRIX0FMRU4pOworZXJyb3JfcmVhZF9tYWM6CisJZF9mbmVuZCg1LCBkZXYsICIoaTI0MDBtICVwKSA9ICVkXG4iLCBpMjQwMG0sIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICogSW5pdGlhbGl6ZSBhIG5vbiBzaWduZWQgYm9vdAorICoKKyAqIFRoaXMgaW1wbGllcyBzZW5kaW5nIHNvbWUgbWFnaWMgdmFsdWVzIHRvIHRoZSBkZXZpY2UncyBtZW1vcnkuIE5vdGUKKyAqIHdlIGNvbnZlcnQgdGhlIHZhbHVlcyB0byBsaXR0bGUgZW5kaWFuIGluIHRoZSBzYW1lIGFycmF5CisgKiBkZWNsYXJhdGlvbi4KKyAqLworc3RhdGljCitpbnQgaTI0MDBtX2RubG9hZF9pbml0X25vbnNpZ25lZChzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisjZGVmaW5lIFBPS0UoYSwgZCkgewkJCQkJXAorCS5hZGRyZXNzID0gX19jb25zdGFudF9jcHVfdG9fbGUzMihhKSwJCVwKKwkuZGF0YSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoZCkJCVwKK30KKwlzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwkJX19sZTMyIGFkZHJlc3M7CisJCV9fbGUzMiBkYXRhOworCX0gaTI0MDBtX3Bva2VzW10gPSB7CisJCVBPS0UoMHgwODFBNTgsIDB4QTc4MTAyMzApLAorCQlQT0tFKDB4MDgwMDQwLCAweDAwMDAwMDAwKSwKKwkJUE9LRSgweDA4MDA0OCwgMHgwMDAwMDA4MiksCisJCVBPS0UoMHgwODAwNEMsIDB4MDAwMDA4MUYpLAorCQlQT0tFKDB4MDgwMDU0LCAweDAwMDAwMDg1KSwKKwkJUE9LRSgweDA4MDA1OCwgMHgwMDAwMDE4MCksCisJCVBPS0UoMHgwODAwNUMsIDB4MDAwMDAwMTgpLAorCQlQT0tFKDB4MDgwMDYwLCAweDAwMDAwMDEwKSwKKwkJUE9LRSgweDA4MDU3NCwgMHgwMDAwMDAwMSksCisJCVBPS0UoMHgwODA1NTAsIDB4MDAwMDAwMDUpLAorCQlQT0tFKDB4QUUwMDAwLCAweDAwMDAwMDAwKSwKKwl9OworI3VuZGVmIFBPS0UKKwl1bnNpZ25lZCBpOworCWludCByZXQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCisJZGV2X3dhcm4oZGV2LCAiV0FSTklORyEhISBub24tc2lnbmVkIGJvb3QgVU5URVNURUQgUEFUSCFcbiIpOworCisJZF9mbnN0YXJ0KDUsIGRldiwgIihpMjQwMG0gJXApXG4iLCBpMjQwMG0pOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGkyNDAwbV9wb2tlcyk7IGkrKykgeworCQlyZXQgPSBpMjQwMG1fZG93bmxvYWRfY2h1bmsoaTI0MDBtLCAmaTI0MDBtX3Bva2VzW2ldLmRhdGEsCisJCQkJCSAgICBzaXplb2YoaTI0MDBtX3Bva2VzW2ldLmRhdGEpLAorCQkJCQkgICAgaTI0MDBtX3Bva2VzW2ldLmFkZHJlc3MsIDEsIDEpOworCQlpZiAocmV0IDwgMCkKKwkJCWJyZWFrOworCX0KKwlkX2ZuZW5kKDUsIGRldiwgIihpMjQwMG0gJXApID0gJWRcbiIsIGkyNDAwbSwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBzaWduZWQgYm9vdCBwcm9jZXNzCisgKgorICogQGkyNDAwbTogZGV2aWNlIGRlc2NyaXB0b3IKKyAqCisgKiBAYmNmX2hkcjogcG9pbnRlciB0byB0aGUgZmlybXdhcmUgaGVhZGVyOyBhc3N1bWVzIGl0IGlzIGZ1bGx5IGluCisgKiAgICAgbWVtb3J5IChpdCBoYXMgZ29uZSB0aHJvdWdoIGJhc2ljIHZhbGlkYXRpb24pLgorICoKKyAqIFJldHVybnM6IDAgaWYgb2ssIDwgMCBlcnJubyBjb2RlIG9uIGVycm9yLCAtRVJFU1RBUlRTWVMgaWYgdGhlIGh3CisgKiAgICAgcmVib290ZWQuCisgKgorICogVGhpcyB3cml0ZXMgdGhlIGZpcm13YXJlIEJDRiBoZWFkZXIgdG8gdGhlIGRldmljZSB1c2luZyB0aGUKKyAqIEhBU0hfUEFZTE9BRF9PTkxZIGNvbW1hbmQuCisgKi8KK3N0YXRpYworaW50IGkyNDAwbV9kbmxvYWRfaW5pdF9zaWduZWQoc3RydWN0IGkyNDAwbSAqaTI0MDBtLAorCQkJICAgICAgY29uc3Qgc3RydWN0IGkyNDAwbV9iY2ZfaGRyICpiY2ZfaGRyKQoreworCWludCByZXQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXN0cnVjdCB7CisJCXN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgY21kOworCQlzdHJ1Y3QgaTI0MDBtX2JjZl9oZHIgY21kX3BsOworCX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgKmNtZF9idWY7CisJc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciBhY2s7CisKKwlkX2Zuc3RhcnQoNSwgZGV2LCAiKGkyNDAwbSAlcCBiY2ZfaGRyICVwKVxuIiwgaTI0MDBtLCBiY2ZfaGRyKTsKKwljbWRfYnVmID0gaTI0MDBtLT5ibV9jbWRfYnVmOworCWNtZF9idWYtPmNtZC5jb21tYW5kID0KKwkJaTI0MDBtX2JyaF9jb21tYW5kKEkyNDAwTV9CUkhfSEFTSF9QQVlMT0FEX09OTFksIDAsIDApOworCWNtZF9idWYtPmNtZC50YXJnZXRfYWRkciA9IDA7CisJY21kX2J1Zi0+Y21kLmRhdGFfc2l6ZSA9IGNwdV90b19sZTMyKHNpemVvZihjbWRfYnVmLT5jbWRfcGwpKTsKKwltZW1jcHkoJmNtZF9idWYtPmNtZF9wbCwgYmNmX2hkciwgc2l6ZW9mKCpiY2ZfaGRyKSk7CisJcmV0ID0gaTI0MDBtX2JtX2NtZChpMjQwMG0sICZjbWRfYnVmLT5jbWQsIHNpemVvZigqY21kX2J1ZiksCisJCQkgICAgJmFjaywgc2l6ZW9mKGFjayksIDApOworCWlmIChyZXQgPj0gMCkKKwkJcmV0ID0gMDsKKwlkX2ZuZW5kKDUsIGRldiwgIihpMjQwMG0gJXAgYmNmX2hkciAlcCkgPSAlZFxuIiwgaTI0MDBtLCBiY2ZfaGRyLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKKworLyoKKyAqIEluaXRpYWxpemUgdGhlIGZpcm13YXJlIGRvd25sb2FkIGF0IHRoZSBkZXZpY2Ugc2l6ZQorICoKKyAqIE11bHRpcGxleCB0byB0aGUgb25lIHRoYXQgbWF0dGVycyBiYXNlZCBvbiB0aGUgZGV2aWNlJ3MgbW9kZQorICogKHNpZ25lZCBvciBub24tc2lnbmVkKS4KKyAqLworc3RhdGljCitpbnQgaTI0MDBtX2RubG9hZF9pbml0KHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwgY29uc3Qgc3RydWN0IGkyNDAwbV9iY2ZfaGRyICpiY2YpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJdTMyIG1vZHVsZV9pZCA9IGxlMzJfdG9fY3B1KGJjZi0+bW9kdWxlX2lkKTsKKworCWlmIChpMjQwMG0tPnNib290ID09IDAKKwkgICAgJiYgKG1vZHVsZV9pZCAmIEkyNDAwTV9CQ0ZfTU9EX0lEX1BPS0VTKSA9PSAwKSB7CisJCS8qIG5vbi1zaWduZWQgYm9vdCBwcm9jZXNzIHdpdGhvdXQgcG9rZXMgKi8KKwkJcmVzdWx0ID0gaTI0MDBtX2RubG9hZF9pbml0X25vbnNpZ25lZChpMjQwMG0pOworCQlpZiAocmVzdWx0ID09IC1FUkVTVEFSVFNZUykKKwkJCXJldHVybiByZXN1bHQ7CisJCWlmIChyZXN1bHQgPCAwKQorCQkJZGV2X2VycihkZXYsICJmdyAlczogbm9uLXNpZ25lZCBkb3dubG9hZCAiCisJCQkJImluaXRpYWxpemF0aW9uIGZhaWxlZDogJWRcbiIsCisJCQkJaTI0MDBtLT5idXNfZndfbmFtZSwgcmVzdWx0KTsKKwl9IGVsc2UgaWYgKGkyNDAwbS0+c2Jvb3QgPT0gMAorCQkgJiYgKG1vZHVsZV9pZCAmIEkyNDAwTV9CQ0ZfTU9EX0lEX1BPS0VTKSkgeworCQkvKiBub24tc2lnbmVkIGJvb3QgcHJvY2VzcyB3aXRoIHBva2VzLCBub3RoaW5nIHRvIGRvICovCisJCXJlc3VsdCA9IDA7CisJfSBlbHNlIHsJCSAvKiBzaWduZWQgYm9vdCBwcm9jZXNzICovCisJCXJlc3VsdCA9IGkyNDAwbV9kbmxvYWRfaW5pdF9zaWduZWQoaTI0MDBtLCBiY2YpOworCQlpZiAocmVzdWx0ID09IC1FUkVTVEFSVFNZUykKKwkJCXJldHVybiByZXN1bHQ7CisJCWlmIChyZXN1bHQgPCAwKQorCQkJZGV2X2VycihkZXYsICJmdyAlczogc2lnbmVkIGJvb3QgZG93bmxvYWQgIgorCQkJCSJpbml0aWFsaXphdGlvbiBmYWlsZWQ6ICVkXG4iLAorCQkJCWkyNDAwbS0+YnVzX2Z3X25hbWUsIHJlc3VsdCk7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKKworLyoKKyAqIFJ1biBxdWljayBjb25zaXN0ZW5jeSB0ZXN0cyBvbiB0aGUgZmlybXdhcmUgZmlsZQorICoKKyAqIENoZWNrIGZvciB0aGUgZmlybXdhcmUgYmVpbmcgbWFkZSBmb3IgdGhlIGkyNDAwbSBkZXZpY2UsCisgKiBldGMuLi5UaGVzZSBjaGVja3MgYXJlIG1vc3RseSBpbmZvcm1hdGl2ZSwgYXMgdGhlIGRldmljZSB3aWxsIG1ha2UKKyAqIHRoZW0gdG9vOyBidXQgdGhlIGRyaXZlcidzIHJlc3BvbnNlIGlzIG1vcmUgaW5mb3JtYXRpdmUgb24gd2hhdAorICogd2VudCB3cm9uZy4KKyAqLworc3RhdGljCitpbnQgaTI0MDBtX2Z3X2NoZWNrKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwKKwkJICAgIGNvbnN0IHN0cnVjdCBpMjQwMG1fYmNmX2hkciAqYmNmLAorCQkgICAgc2l6ZV90IGJjZl9zaXplKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXVuc2lnbmVkIG1vZHVsZV90eXBlLCBoZWFkZXJfbGVuLCBtYWpvcl92ZXJzaW9uLCBtaW5vcl92ZXJzaW9uLAorCQltb2R1bGVfaWQsIG1vZHVsZV92ZW5kb3IsIGRhdGUsIHNpemU7CisKKwkvKiBDaGVjayBoYXJkIGVycm9ycyAqLworCXJlc3VsdCA9IC1FSU5WQUw7CisJaWYgKGJjZl9zaXplIDwgc2l6ZW9mKCpiY2YpKSB7CS8qIGJpZyBlbm91Z2ggaGVhZGVyPyAqLworCQlkZXZfZXJyKGRldiwgImZpcm13YXJlICVzIHRvbyBzaG9ydDogIgorCQkJIiV6dSBCIHZzICV6dSAoYXQgbGVhc3QpIGV4cGVjdGVkXG4iLAorCQkJaTI0MDBtLT5idXNfZndfbmFtZSwgYmNmX3NpemUsIHNpemVvZigqYmNmKSk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJbW9kdWxlX3R5cGUgPSBiY2YtPm1vZHVsZV90eXBlOworCWhlYWRlcl9sZW4gPSBzaXplb2YodTMyKSAqIGxlMzJfdG9fY3B1KGJjZi0+aGVhZGVyX2xlbik7CisJbWFqb3JfdmVyc2lvbiA9IGxlMzJfdG9fY3B1KGJjZi0+aGVhZGVyX3ZlcnNpb24pICYgMHhmZmZmMDAwMCA+PiAxNjsKKwltaW5vcl92ZXJzaW9uID0gbGUzMl90b19jcHUoYmNmLT5oZWFkZXJfdmVyc2lvbikgJiAweDAwMDBmZmZmOworCW1vZHVsZV9pZCA9IGxlMzJfdG9fY3B1KGJjZi0+bW9kdWxlX2lkKTsKKwltb2R1bGVfdmVuZG9yID0gbGUzMl90b19jcHUoYmNmLT5tb2R1bGVfdmVuZG9yKTsKKwlkYXRlID0gbGUzMl90b19jcHUoYmNmLT5kYXRlKTsKKwlzaXplID0gc2l6ZW9mKHUzMikgKiBsZTMyX3RvX2NwdShiY2YtPnNpemUpOworCisJaWYgKGJjZl9zaXplICE9IHNpemUpIHsJCS8qIGFubm95aW5nbHkgcGFyYW5vaWQgKi8KKwkJZGV2X2VycihkZXYsICJmaXJtd2FyZSAlczogYmFkIHNpemUsIGdvdCAiCisJCQkiJXp1IEIgdnMgJXUgZXhwZWN0ZWRcbiIsCisJCQlpMjQwMG0tPmJ1c19md19uYW1lLCBiY2Zfc2l6ZSwgc2l6ZSk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZF9wcmludGYoMiwgZGV2LCAidHlwZSAweCV4IGlkIDB4JXggdmVuZG9yIDB4JXg7IGhlYWRlciB2JXUuJXUgKCV6dSBCKSAiCisJCSAiZGF0ZSAlMDh4ICglenUgQilcbiIsCisJCSBtb2R1bGVfdHlwZSwgbW9kdWxlX2lkLCBtb2R1bGVfdmVuZG9yLAorCQkgbWFqb3JfdmVyc2lvbiwgbWlub3JfdmVyc2lvbiwgKHNpemVfdCkgaGVhZGVyX2xlbiwKKwkJIGRhdGUsIChzaXplX3QpIHNpemUpOworCisJaWYgKG1vZHVsZV90eXBlICE9IDYpIHsJCS8qIGJ1aWx0IGZvciB0aGUgcmlnaHQgaGFyZHdhcmU/ICovCisJCWRldl9lcnIoZGV2LCAiYmFkIGZ3ICVzOiB1bmV4cGVjdGVkIG1vZHVsZSB0eXBlIDB4JXg7ICIKKwkJCSJhYm9ydGluZ1xuIiwgaTI0MDBtLT5idXNfZndfbmFtZSwgbW9kdWxlX3R5cGUpOworCQlnb3RvIGVycm9yOworCX0KKworCS8qIENoZWNrIHNvZnQtZXIgZXJyb3JzICovCisJcmVzdWx0ID0gMDsKKwlpZiAobW9kdWxlX3ZlbmRvciAhPSAweDgwODYpCisJCWRldl9lcnIoZGV2LCAiYmFkIGZ3ICVzPyB1bmV4cGVjdGVkIHZlbmRvciAweCUwNHhcbiIsCisJCQlpMjQwMG0tPmJ1c19md19uYW1lLCBtb2R1bGVfdmVuZG9yKTsKKwlpZiAoZGF0ZSA8IDB4MjAwODAzMDApCisJCWRldl9lcnIoZGV2LCAiYmFkIGZ3ICVzPyBidWlsZCBkYXRlIHRvbyBvbGQgJTA4eFxuIiwKKwkJCWkyNDAwbS0+YnVzX2Z3X25hbWUsIGRhdGUpOworZXJyb3I6CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICogRG93bmxvYWQgdGhlIGZpcm13YXJlIHRvIHRoZSBkZXZpY2UKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcgorICogQGJjZjogcG9pbnRlciB0byBsb2FkZWQgKGFuZCBtaW5pbWFsbHkgdmVyaWZpZWQgZm9yIGNvbnNpc3RlbmN5KQorICogICAgZmlybXdhcmUKKyAqIEBiY2Zfc2l6ZTogc2l6ZSBvZiB0aGUgQGJjZiBidWZmZXIgKGhlYWRlciBwbHVzIHBheWxvYWRzKQorICoKKyAqIFRoZSBwcm9jZXNzIGZvciBkb2luZyB0aGlzIGlzIGRlc2NyaWJlZCBpbiB0aGlzIGZpbGUncyBoZWFkZXIuCisgKgorICogTm90ZSB3ZSBvbmx5IHJlaW5pdGlhbGl6ZSBib290LW1vZGUgaWYgdGhlIGZsYWdzIHNheSBzby4gU29tZSBodworICogaXRlcmF0aW9ucyBuZWVkIGl0LCBzb21lIGRvbid0LiBJbiBhbnkgY2FzZSwgaWYgd2UgbG9vcCwgd2UgYWx3YXlzCisgKiBuZWVkIHRvIHJlaW5pdGlhbGl6ZSB0aGUgYm9vdCByb29tLCBoZW5jZSB0aGUgZmxhZ3MgbW9kaWZpY2F0aW9uLgorICovCitzdGF0aWMKK2ludCBpMjQwMG1fZndfZG5sb2FkKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwgY29uc3Qgc3RydWN0IGkyNDAwbV9iY2ZfaGRyICpiY2YsCisJCSAgICAgc2l6ZV90IGJjZl9zaXplLCBlbnVtIGkyNDAwbV9icmkgZmxhZ3MpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCWludCBjb3VudCA9IEkyNDAwTV9CT09UX1JFVFJJRVM7CisKKwlkX2Zuc3RhcnQoNSwgZGV2LCAiKGkyNDAwbSAlcCBiY2YgJXAgc2l6ZSAlenUpXG4iLAorCQkgIGkyNDAwbSwgYmNmLCBiY2Zfc2l6ZSk7CisJaTI0MDBtLT5ib290X21vZGUgPSAxOworaHdfcmVib290OgorCWlmIChjb3VudC0tID09IDApIHsKKwkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQlkZXZfZXJyKGRldiwgImRldmljZSByZWJvb3RlZCB0b28gbWFueSB0aW1lcywgYWJvcnRpbmdcbiIpOworCQlnb3RvIGVycm9yX3Rvb19tYW55X3JlYm9vdHM7CisJfQorCWlmIChmbGFncyAmIEkyNDAwTV9CUklfTUFDX1JFSU5JVCkgeworCQlyZXQgPSBpMjQwMG1fYm9vdHJvbV9pbml0KGkyNDAwbSwgZmxhZ3MpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihkZXYsICJib290cm9tIGluaXQgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJCWdvdG8gZXJyb3JfYm9vdHJvbV9pbml0OworCQl9CisJfQorCWZsYWdzIHw9IEkyNDAwTV9CUklfTUFDX1JFSU5JVDsKKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgZG93bmxvYWQsIHB1c2ggdGhlIGJ5dGVzIHRvIHRoZSBkZXZpY2UgYW5kCisJICogdGhlbiBqdW1wIHRvIHRoZSBuZXcgZmlybXdhcmUuIE5vdGUgQHJldCBpcyBwYXNzZWQgd2l0aCB0aGUKKwkgKiBvZmZzZXQgb2YgdGhlIGp1bXAgaW5zdHJ1Y3Rpb24gdG8gX2RubG9hZF9maW5hbGl6ZSgpCisJICovCisJcmV0ID0gaTI0MDBtX2RubG9hZF9pbml0KGkyNDAwbSwgYmNmKTsJLyogSW5pdCBkZXZpY2UncyBkbmxvYWQgKi8KKwlpZiAocmV0ID09IC1FUkVTVEFSVFNZUykKKwkJZ290byBlcnJvcl9kZXZfcmVib290ZWQ7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3JfZG5sb2FkX2luaXQ7CisKKwlyZXQgPSBpMjQwMG1fZG5sb2FkX2JjZihpMjQwMG0sIGJjZiwgYmNmX3NpemUpOworCWlmIChyZXQgPT0gLUVSRVNUQVJUU1lTKQorCQlnb3RvIGVycm9yX2Rldl9yZWJvb3RlZDsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImZ3ICVzOiBkb3dubG9hZCBmYWlsZWQ6ICVkXG4iLAorCQkJaTI0MDBtLT5idXNfZndfbmFtZSwgcmV0KTsKKwkJZ290byBlcnJvcl9kbmxvYWRfYmNmOworCX0KKworCXJldCA9IGkyNDAwbV9kbmxvYWRfZmluYWxpemUoaTI0MDBtLCBiY2YsIHJldCk7CisJaWYgKHJldCA9PSAtRVJFU1RBUlRTWVMpCisJCWdvdG8gZXJyb3JfZGV2X3JlYm9vdGVkOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiZncgJXM6ICIKKwkJCSJkb3dubG9hZCBmaW5hbGl6YXRpb24gZmFpbGVkOiAlZFxuIiwKKwkJCWkyNDAwbS0+YnVzX2Z3X25hbWUsIHJldCk7CisJCWdvdG8gZXJyb3JfZG5sb2FkX2ZpbmFsaXplOworCX0KKworCWRfcHJpbnRmKDIsIGRldiwgImZ3ICVzIHN1Y2Nlc3NmdWxseSB1cGxvYWRlZFxuIiwKKwkJIGkyNDAwbS0+YnVzX2Z3X25hbWUpOworCWkyNDAwbS0+Ym9vdF9tb2RlID0gMDsKK2Vycm9yX2RubG9hZF9maW5hbGl6ZToKK2Vycm9yX2RubG9hZF9iY2Y6CitlcnJvcl9kbmxvYWRfaW5pdDoKK2Vycm9yX2Jvb3Ryb21faW5pdDoKK2Vycm9yX3Rvb19tYW55X3JlYm9vdHM6CisJZF9mbmVuZCg1LCBkZXYsICIoaTI0MDBtICVwIGJjZiAlcCBzaXplICV6dSkgPSAlZFxuIiwKKwkJaTI0MDBtLCBiY2YsIGJjZl9zaXplLCByZXQpOworCXJldHVybiByZXQ7CisKK2Vycm9yX2Rldl9yZWJvb3RlZDoKKwlkZXZfZXJyKGRldiwgImRldmljZSByZWJvb3RlZCwgJWQgdHJpZXMgbGVmdFxuIiwgY291bnQpOworCS8qIHdlIGdvdCB0aGUgbm90aWZpY2F0aW9uIGFscmVhZHksIG5vIG5lZWQgdG8gd2FpdCBmb3IgaXQgYWdhaW4gKi8KKwlmbGFncyB8PSBJMjQwME1fQlJJX1NPRlQ7CisJZ290byBod19yZWJvb3Q7Cit9CisKKworLyoqCisgKiBpMjQwMG1fZGV2X2Jvb3RzdHJhcCAtIEJyaW5nIHRoZSBkZXZpY2UgdG8gYSBrbm93biBzdGF0ZSBhbmQgdXBsb2FkIGZpcm13YXJlCisgKgorICogQGkyNDAwbTogZGV2aWNlIGRlc2NyaXB0b3IKKyAqCisgKiBSZXR1cm5zOiA+PSAwIGlmIG9rLCA8IDAgZXJybm8gY29kZSBvbiBlcnJvci4KKyAqCisgKiBUaGlzIHNldHMgdXAgdGhlIGZpcm13YXJlIHVwbG9hZCBlbnZpcm9ubWVudCwgbG9hZHMgdGhlIGZpcm13YXJlCisgKiBmaWxlIGZyb20gZGlzaywgdmVyaWZpZXMgYW5kIHRoZW4gY2FsbHMgdGhlIGZpcm13YXJlIHVwbG9hZCBwcm9jZXNzCisgKiBwZXIgc2UuCisgKgorICogQ2FuIGJlIGNhbGxlZCBlaXRoZXIgZnJvbSBwcm9iZSwgb3IgYWZ0ZXIgYSB3YXJtIHJlc2V0LiAgQ2FuIG5vdCBiZQorICogY2FsbGVkIGZyb20gd2l0aGluIGFuIGludGVycnVwdC4gIEFsbCB0aGUgZmxvdyBpbiB0aGlzIGNvZGUgaXMKKyAqIHNpbmdsZS10aHJlYWRlOyBhbGwgSS9PcyBhcmUgc3luY2hyb25vdXMuCisgKi8KK2ludCBpMjQwMG1fZGV2X2Jvb3RzdHJhcChzdHJ1Y3QgaTI0MDBtICppMjQwMG0sIGVudW0gaTI0MDBtX2JyaSBmbGFncykKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKKwljb25zdCBzdHJ1Y3QgaTI0MDBtX2JjZl9oZHIgKmJjZjsJLyogRmlybXdhcmUgZGF0YSAqLworCisJZF9mbnN0YXJ0KDUsIGRldiwgIihpMjQwMG0gJXApXG4iLCBpMjQwMG0pOworCS8qIExvYWQgZmlybXdhcmUgZmlsZXMgdG8gbWVtb3J5LiAqLworCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBpMjQwMG0tPmJ1c19md19uYW1lLCBkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmdyAlczogcmVxdWVzdCBmYWlsZWQ6ICVkXG4iLAorCQkJaTI0MDBtLT5idXNfZndfbmFtZSwgcmV0KTsKKwkJZ290byBlcnJvcl9md19yZXE7CisJfQorCWJjZiA9ICh2b2lkICopIGZ3LT5kYXRhOworCisJcmV0ID0gaTI0MDBtX2Z3X2NoZWNrKGkyNDAwbSwgYmNmLCBmdy0+c2l6ZSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3JfZndfYmFkOworCXJldCA9IGkyNDAwbV9md19kbmxvYWQoaTI0MDBtLCBiY2YsIGZ3LT5zaXplLCBmbGFncyk7CitlcnJvcl9md19iYWQ6CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CitlcnJvcl9md19yZXE6CisJZF9mbmVuZCg1LCBkZXYsICIoaTI0MDBtICVwKSA9ICVkXG4iLCBpMjQwMG0sIHJldCk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGkyNDAwbV9kZXZfYm9vdHN0cmFwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9pMjQwMG0tc2Rpby5oIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL2kyNDAwbS1zZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhjMmZiNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9pMjQwMG0tc2Rpby5oCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogSW50ZWwgV2lyZWxlc3MgV2lNQVggQ29ubmVjdGlvbiAyNDAwbQorICogU0RJTy1zcGVjaWZpYyBpMjQwMG0gZHJpdmVyIGRlZmluaXRpb25zCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqCisgKiBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogQnJpYW4gQmlhbiA8YnJpYW4uYmlhbkBpbnRlbC5jb20+CisgKiBEaXJrIEJyYW5kZXdpZSA8ZGlyay5qLmJyYW5kZXdpZUBpbnRlbC5jb20+CisgKiBJbmFreSBQZXJlei1Hb256YWxleiA8aW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tPgorICogWWFuaXIgTHViZXRraW4gPHlhbmlyeC5sdWJldGtpbkBpbnRlbC5jb20+CisgKiAgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCisgKgorICoKKyAqIFRoaXMgZHJpdmVyIGltcGxlbWVudHMgdGhlIGJ1cy1zcGVjaWZpYyBwYXJ0IG9mIHRoZSBpMjQwMG0gZm9yCisgKiBTRElPLiBDaGVjayBpMjQwMG0uaCBmb3IgYSBnZW5lcmljIGRyaXZlciBkZXNjcmlwdGlvbi4KKyAqCisgKiBBUkNISVRFQ1RVUkUKKyAqCisgKiBUaGlzIGRyaXZlciBzaXRzIHVuZGVyIHRoZSBidXMtZ2VuZXJpYyBpMjQwMG0gZHJpdmVyLCBwcm92aWRpbmcgdGhlCisgKiBjb25uZWN0aW9uIHRvIHRoZSBkZXZpY2UuCisgKgorICogV2hlbiBwcm9iZWQsIGFsbCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgYXJlIHNldHVwIGFuZCB0aGVuIHRoZQorICogYnVzLWdlbmVyaWMgY29kZSBjYWxsZWQuIFRoZSBnZW5lcmljIGRyaXZlciB3aWxsIHRoZW4gdXNlIHRoZQorICogcHJvdmlkZWQgcG9pbnRlcnMgZm9yIHVwbG9hZGluZyBmaXJtd2FyZSAoaTI0MDBtc19idXNfYm0qKCkgaW4KKyAqIHNkaW8tZncuYykgYW5kIHRoZW4gc2V0dGluZyB1cCB0aGUgZGV2aWNlIChpMjQwMG1zX2Rldl8qKCkgaW4KKyAqIHNkaW8uYykuCisgKgorICogT25jZSBmaXJtd2FyZSBpcyB1cGxvYWRlZCwgVFggZnVuY3Rpb25zIChzZGlvLXR4LmMpIGFyZSBjYWxsZWQgd2hlbgorICogZGF0YSBpcyByZWFkeSBmb3IgdHJhbnNtaXNzaW9uIGluIHRoZSBUWCBmaWZvOyB0aGVuIHRoZSBTRElPIElSUSBpcworICogZmlyZWQgYW5kIGRhdGEgaXMgYXZhaWxhYmxlIChzZGlvLXJ4LmMpLCBpdCBpcyBzZW50IHRvIHRoZSBnZW5lcmljCisgKiBkcml2ZXIgZm9yIHByb2Nlc3Npbmcgd2l0aCBpMjQwMG1fcnguCisgKi8KKworI2lmbmRlZiBfX0kyNDAwTV9TRElPX0hfXworI2RlZmluZSBfX0kyNDAwTV9TRElPX0hfXworCisjaW5jbHVkZSAiaTI0MDBtLmgiCisKKy8qIEhvc3QtRGV2aWNlIGludGVyZmFjZSBmb3IgU0RJTyAqLworZW51bSB7CisJSTI0MDBNU19CTEtfU0laRSA9IDI1NiwKKwlJMjQwME1TX1BMX1NJWkVfTUFYID0gMHgzRTAwLAorCisJSTI0MDBNU19EQVRBX0FERFIgPSAweDAsCisJSTI0MDBNU19JTlRSX1NUQVRVU19BRERSID0gMHgxMywKKwlJMjQwME1TX0lOVFJfQ0xFQVJfQUREUiA9IDB4MTMsCisJSTI0MDBNU19JTlRSX0VOQUJMRV9BRERSID0gMHgxNCwKKwlJMjQwME1TX0lOVFJfR0VUX1NJWkVfQUREUiA9IDB4MkMsCisJLyogVGhlIG51bWJlciBvZiB0aWNrcyB0byB3YWl0IGZvciB0aGUgZGV2aWNlIHRvIHNpZ25hbCB0aGF0CisJICogaXQgaXMgcmVhZHkgKi8KKwlJMjQwME1TX0lOSVRfU0xFRVBfSU5URVJWQUwgPSAxMCwKK307CisKKworLyoqCisgKiBzdHJ1Y3QgaTI0MDBtcyAtIGRlc2NyaXB0b3IgZm9yIGEgU0RJTyBjb25uZWN0ZWQgaTI0MDBtCisgKgorICogQGkyNDAwbTogYnVzLWdlbmVyaWMgaTI0MDBtIGltcGxlbWVudGF0aW9uOyBoYXMgdG8gYmUgZmlyc3QgKHNlZQorICogICAgIGl0J3MgZG9jdW1lbnRhdGlvbiBpbiBpMjQwMG0uaCkuCisgKgorICogQGZ1bmM6IHBvaW50ZXIgdG8gb3VyIFNESU8gZnVuY3Rpb24KKyAqCisgKiBAdHhfd29ya2VyOiB3b3JrcXVldWUgc3RydWN0IHVzZWQgdG8gVFggZGF0YSB3aGVuIHRoZSBidXMtZ2VuZXJpYworICogICAgIGNvZGUgc2lnbmFscyBwYWNrZXRzIGFyZSBwZW5kaW5nIGZvciB0cmFuc21pc3Npb24gdG8gdGhlIGRldmljZS4KKyAqCisgKiBAdHhfd29ya3F1ZXVlOiB3b3JrcWV1ZXVlIHVzZWQgZm9yIGRhdGEgVFg7IHdlIGRvbid0IHVzZSB0aGUKKyAqICAgICBzeXN0ZW0ncyB3b3JrcXVldWUgYXMgdGhhdCBtaWdodCBjYXVzZSBkZWFkbG9ja3Mgd2l0aCBjb2RlIGluCisgKiAgICAgdGhlIGJ1cy1nZW5lcmljIGRyaXZlci4KKyAqLworc3RydWN0IGkyNDAwbXMgeworCXN0cnVjdCBpMjQwMG0gaTI0MDBtOwkJLyogRklSU1QhIFNlZSBkb2MgKi8KKwlzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jOworCisJc3RydWN0IHdvcmtfc3RydWN0IHR4X3dvcmtlcjsKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqdHhfd29ya3F1ZXVlOworCWNoYXIgdHhfd3FfbmFtZVszMl07CisKKwlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2RlbnRyeTsKK307CisKKworc3RhdGljIGlubGluZQordm9pZCBpMjQwMG1zX2luaXQoc3RydWN0IGkyNDAwbXMgKmkyNDAwbXMpCit7CisJaTI0MDBtX2luaXQoJmkyNDAwbXMtPmkyNDAwbSk7Cit9CisKKworZXh0ZXJuIGludCBpMjQwMG1zX3J4X3NldHVwKHN0cnVjdCBpMjQwMG1zICopOworZXh0ZXJuIHZvaWQgaTI0MDBtc19yeF9yZWxlYXNlKHN0cnVjdCBpMjQwMG1zICopOworZXh0ZXJuIHNzaXplX3QgX19pMjQwMG1zX3J4X2dldF9zaXplKHN0cnVjdCBpMjQwMG1zICopOworCitleHRlcm4gaW50IGkyNDAwbXNfdHhfc2V0dXAoc3RydWN0IGkyNDAwbXMgKik7CitleHRlcm4gdm9pZCBpMjQwMG1zX3R4X3JlbGVhc2Uoc3RydWN0IGkyNDAwbXMgKik7CitleHRlcm4gdm9pZCBpMjQwMG1zX2J1c190eF9raWNrKHN0cnVjdCBpMjQwMG0gKik7CisKK2V4dGVybiBzc2l6ZV90IGkyNDAwbXNfYnVzX2JtX2NtZF9zZW5kKHN0cnVjdCBpMjQwMG0gKiwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciAqLAorCQkJCSAgICAgICBzaXplX3QsIGludCk7CitleHRlcm4gc3NpemVfdCBpMjQwMG1zX2J1c19ibV93YWl0X2Zvcl9hY2soc3RydWN0IGkyNDAwbSAqLAorCQkJCQkgICBzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyICosCisJCQkJCSAgIHNpemVfdCk7CisjZW5kaWYgLyogI2lmbmRlZiBfX0kyNDAwTV9TRElPX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL2kyNDAwbS11c2IuaCBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9pMjQwMG0tdXNiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY3NjU1OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9pMjQwMG0tdXNiLmgKQEAgLTAsMCArMSwyNjQgQEAKKy8qCisgKiBJbnRlbCBXaXJlbGVzcyBXaU1BWCBDb25uZWN0aW9uIDI0MDBtCisgKiBVU0Itc3BlY2lmaWMgaTI0MDBtIGRyaXZlciBkZWZpbml0aW9ucworICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKgorICogSW50ZWwgQ29ycG9yYXRpb24gPGxpbnV4LXdpbWF4QGludGVsLmNvbT4KKyAqIEluYWt5IFBlcmV6LUdvbnphbGV6IDxpbmFreS5wZXJlei1nb256YWxlekBpbnRlbC5jb20+CisgKiBZYW5pciBMdWJldGtpbiA8eWFuaXJ4Lmx1YmV0a2luQGludGVsLmNvbT4KKyAqICAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqCisgKgorICogVGhpcyBkcml2ZXIgaW1wbGVtZW50cyB0aGUgYnVzLXNwZWNpZmljIHBhcnQgb2YgdGhlIGkyNDAwbSBmb3IKKyAqIFVTQi4gQ2hlY2sgaTI0MDBtLmggZm9yIGEgZ2VuZXJpYyBkcml2ZXIgZGVzY3JpcHRpb24uCisgKgorICogQVJDSElURUNUVVJFCisgKgorICogVGhpcyBkcml2ZXIgbGlzdGVucyB0byBub3RpZmljYXRpb25zIHNlbnQgZnJvbSB0aGUgbm90aWZpY2F0aW9uCisgKiBlbmRwb2ludCAoaW4gdXNiLW5vdGlmLmMpOyB3aGVuIGRhdGEgaXMgcmVhZHkgdG8gcmVhZCwgdGhlIGNvZGUgaW4KKyAqIHRoZXJlIHNjaGVkdWxlcyBhIHJlYWQgZnJvbSB0aGUgZGV2aWNlICh1c2ItcnguYykgYW5kIHRoZW4gcGFzc2VzCisgKiB0aGUgZGF0YSB0byB0aGUgZ2VuZXJpYyBSWCBjb2RlIChyeC5jKS4KKyAqCisgKiBXaGVuIHRoZSBnZW5lcmljIGRyaXZlciBuZWVkcyB0byBzZW5kIGRhdGEgKG5ldHdvcmsgb3IgY29udHJvbCksIGl0CisgKiBxdWV1ZXMgdXAgaW4gdGhlIFRYIEZJRk8gKHR4LmMpIGFuZCB0aGF0IHdpbGwgbm90aWZ5IHRoZSBkcml2ZXIKKyAqIHRocm91Z2ggdGhlIGkyNDAwbS0+YnVzX3R4X2tpY2soKSBjYWxsYmFjaworICogKHVzYi10eC5jOmkyNDAwbXVfYnVzX3R4X2tpY2spIHdoaWNoIHdpbGwgc2VuZCB0aGUgaXRlbXMgaW4gdGhlCisgKiBGSUZPIHF1ZXVlLgorICoKKyAqIFRoaXMgZHJpdmVyLCBhcyB3ZWxsLCBpbXBsZW1lbnRzIHRoZSBVU0Itc3BlY2lmaWMgb3BzIGZvciB0aGUgZ2VuZXJpYworICogZHJpdmVyIHRvIGJlIGFibGUgdG8gc2V0dXAvdGVhcmRvd24gY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBkZXZpY2UKKyAqIFtpMjQwMG1fYnVzX2Rldl9zdGFydCgpIGFuZCBpMjQwMG1fYnVzX2Rldl9zdG9wKCldLCByZXNldGluZyB0aGUKKyAqIGRldmljZSBbaTI0MDBtX2J1c19yZXNldCgpXSBhbmQgcGVyZm9ybWluZyBmaXJtd2FyZSB1cGxvYWQKKyAqIFtpMjQwMG1fYnVzX2JtX2NtZCgpIGFuZCBpMjQwMF9idXNfYm1fd2FpdF9mb3JfYWNrKCldLgorICovCisKKyNpZm5kZWYgX19JMjQwME1fVVNCX0hfXworI2RlZmluZSBfX0kyNDAwTV9VU0JfSF9fCisKKyNpbmNsdWRlICJpMjQwMG0uaCIKKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisKKworLyoKKyAqIEVycm9yIERlbnNpdHkgQ291bnQ6IGNoZWFwbyBlcnJvciBkZW5zaXR5IChvdmVyIHRpbWUpIGNvdW50ZXIKKyAqCisgKiBPcmlnaW5hbGx5IGJ5IFJlaW5ldHRlIENoYXRyZSA8cmVpbmV0dGUuY2hhdHJlQGludGVsLmNvbT4KKyAqCisgKiBFbWJlZCBhbiAnc3RydWN0IGVkYycgc29tZXdoZXJlLiBFYWNoIHRpbWUgdGhlcmUgaXMgYSBzb2Z0IG9yCisgKiByZXRyeWFibGUgZXJyb3IsIGNhbGwgZWRjX2luYygpIGFuZCBjaGVjayBpZiB0aGUgZXJyb3IgdG9wCisgKiB3YXRlcm1hcmsgaGFzIGJlZW4gcmVhY2hlZC4KKyAqLworZW51bSB7CisJRURDX01BWF9FUlJPUlMgPSAxMCwKKwlFRENfRVJST1JfVElNRUZSQU1FID0gSFosCit9OworCisvKiBlcnJvciBkZW5zaXR5IGNvdW50ZXIgKi8KK3N0cnVjdCBlZGMgeworCXVuc2lnbmVkIGxvbmcgdGltZXN0YXJ0OworCXUxNiBlcnJvcmNvdW50OworfTsKKworc3RhdGljIGlubGluZSB2b2lkIGVkY19pbml0KHN0cnVjdCBlZGMgKmVkYykKK3sKKwllZGMtPnRpbWVzdGFydCA9IGppZmZpZXM7Cit9CisKKy8qKgorICogZWRjX2luYyAtIHJlcG9ydCBhIHNvZnQgZXJyb3IgYW5kIGNoZWNrIGlmIHdlIGFyZSBvdmVyIHRoZSB3YXRlcm1hcmsKKyAqCisgKiBAZWRjOiBwb2ludGVyIHRvIGVycm9yIGRlbnNpdHkgY291bnRlci4KKyAqIEBtYXhfZXJyOiBtYXhpbXVtIG51bWJlciBvZiBlcnJvcnMgd2UgY2FuIGFjY2VwdCBvdmVyIHRoZSB0aW1lZnJhbWUKKyAqIEB0aW1lZnJhbWU6IGxlbmdodCBvZiB0aGUgdGltZWZyYW1lIChpbiBqaWZmaWVzKS4KKyAqCisgKiBSZXR1cm5zOiAhMCAxIGlmIG1heGltdW0gYWNjZXB0YWJsZSBlcnJvcnMgcGVyIHRpbWVmcmFtZSBoYXMgYmVlbgorICogICAgIGV4Y2VlZGVkLiAwIG90aGVyd2lzZS4KKyAqCisgKiBUaGlzIGlzIHdheSB0byBkZXRlcm1pbmUgaWYgdGhlIG51bWJlciBvZiBhY2NlcHRhYmxlIGVycm9ycyBwZXIgdGltZQorICogcGVyaW9kIGhhcyBiZWVuIGV4Y2VlZGVkLiBJdCBpcyBub3QgYWNjdXJhdGUgYXMgdGhlcmUgYXJlIGNhc2VzIGluIHdoaWNoCisgKiB0aGlzIHNjaGVtZSB3aWxsIG5vdCB3b3JrLCBmb3IgZXhhbXBsZSBpZiB0aGVyZSBhcmUgcGVyaW9kaWMgb2NjdXJlbmNlcworICogb2YgZXJyb3JzIHRoYXQgc3RyYWRkbGUgdXBkYXRlcyB0byB0aGUgc3RhcnQgdGltZS4gVGhpcyBzY2hlbWUgaXMKKyAqIHN1ZmZpY2llbnQgZm9yIG91ciB1c2FnZS4KKyAqCisgKiBUbyB1c2UsIGVtYmVkIGEgJ3N0cnVjdCBlZGMnIHNvbWV3aGVyZSwgaW5pdGlhbGl6ZSBpdCB3aXRoCisgKiBlZGNfaW5pdCgpIGFuZCB3aGVuIGFuIGVycm9yIGhpdHM6CisgKgorICogaWYgKGRvX3NvbWV0aGluZ19mYWlsc193aXRoX2Ffc29mdF9lcnJvcikgeworICogICAgICAgIGlmIChlZGNfaW5jKCZteS0+ZWRjLCBNQVhfRVJST1JTLCBNQVhfVElNRUZSQU1FKSkKKyAqIAkgICAgICAgICAgIE9wcywgaGFyZCBlcnJvciwgZG8gc29tZXRoaW5nIGFib3V0IGl0CisgKiAgICAgICAgZWxzZQorICogICAgICAgICAgICAgICAgIFJldHJ5IG9yIGlnbm9yZSwgZGVwZW5kaW5nIG9uIHdoYXRldmVyCisgKiB9CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGVkY19pbmMoc3RydWN0IGVkYyAqZWRjLCB1MTYgbWF4X2VyciwgdTE2IHRpbWVmcmFtZSkKK3sKKwl1bnNpZ25lZCBsb25nIG5vdzsKKworCW5vdyA9IGppZmZpZXM7CisJaWYgKG5vdyAtIGVkYy0+dGltZXN0YXJ0ID4gdGltZWZyYW1lKSB7CisJCWVkYy0+ZXJyb3Jjb3VudCA9IDE7CisJCWVkYy0+dGltZXN0YXJ0ID0gbm93OworCX0gZWxzZSBpZiAoKytlZGMtPmVycm9yY291bnQgPiBtYXhfZXJyKSB7CisJCWVkYy0+ZXJyb3Jjb3VudCA9IDA7CisJCWVkYy0+dGltZXN0YXJ0ID0gbm93OworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIEhvc3QtRGV2aWNlIGludGVyZmFjZSBmb3IgVVNCICovCitlbnVtIHsKKwlJMjQwME1VX01BWF9OT1RJRklDQVRJT05fTEVOID0gMjU2LAorCUkyNDAwTVVfQkxLX1NJWkUgPSAxNiwKKwlJMjQwME1VX1BMX1NJWkVfTUFYID0gMHgzRUZGLAorCisJLyogRW5kcG9pbnRzICovCisJSTI0MDBNVV9FUF9CVUxLX09VVCA9IDAsCisJSTI0MDBNVV9FUF9OT1RJRklDQVRJT04sCisJSTI0MDBNVV9FUF9SRVNFVF9DT0xELAorCUkyNDAwTVVfRVBfQlVMS19JTiwKK307CisKKworLyoqCisgKiBzdHJ1Y3QgaTI0MDBtdSAtIGRlc2NyaXB0b3IgZm9yIGEgVVNCIGNvbm5lY3RlZCBpMjQwMG0KKyAqCisgKiBAaTI0MDBtOiBidXMtZ2VuZXJpYyBpMjQwMG0gaW1wbGVtZW50YXRpb247IGhhcyB0byBiZSBmaXJzdCAoc2VlCisgKiAgICAgaXQncyBkb2N1bWVudGF0aW9uIGluIGkyNDAwbS5oKS4KKyAqCisgKiBAdXNiX2RldjogcG9pbnRlciB0byBvdXIgVVNCIGRldmljZQorICoKKyAqIEB1c2JfaWZhY2U6IHBvaW50ZXIgdG8gb3VyIFVTQiBpbnRlcmZhY2UKKyAqCisgKiBAdXJiX2VkYzogZXJyb3IgZGVuc2l0eSBjb3VudGVyOyB1c2VkIHRvIGtlZXAgYSBkZW5zaXR5LW9uLXRpbWUgdGFiCisgKiAgICAgb24gaG93IG1hbnkgc29mdCAocmV0cnlhYmxlIG9yIGlnbm9yYWJsZSkgZXJyb3JzIHdlIGdldC4gSWYgd2UKKyAqICAgICBnbyBvdmVyIHRoZSB0aHJlc2hvbGQsIHdlIGNvbnNpZGVyIHRoZSBidXMgdHJhbnNwb3J0IGlzIGZhaWxpbmcKKyAqICAgICB0b28gbXVjaCBhbmQgcmVzZXQuCisgKgorICogQG5vdGlmX3VyYjogVVJCIGZvciByZWNlaXZpbmcgbm90aWZpY2F0aW9ucyBmcm9tIHRoZSBkZXZpY2UuCisgKgorICogQHR4X2t0aHJlYWQ6IHRocmVhZCB3ZSB1c2UgZm9yIGRhdGEgVFguIFdlIHVzZSBhIHRocmVhZCBiZWNhdXNlIGluCisgKiAgICAgb3JkZXIgdG8gZG8gZGVlcCBwb3dlciBzYXZpbmcgYW5kIHB1dCB0aGUgZGV2aWNlIHRvIHNsZWVwLCB3ZQorICogICAgIG5lZWQgdG8gY2FsbCB1c2JfYXV0b3BtXyooKSBbYmxvY2tpbmcgZnVuY3Rpb25zXS4KKyAqCisgKiBAdHhfd3E6IHdhaXRxdWV1ZSBmb3IgdGhlIFRYIGt0aHJlYWQgdG8gc2xlZXAgd2hlbiB0aGVyZSBpcyBubyBkYXRhCisgKiAgICAgdG8gYmUgc2VudDsgd2hlbiBtb3JlIGRhdGEgaXMgYXZhaWxhYmxlLCBpdCBpcyB3b2tlbiB1cCBieQorICogICAgIGkyNDAwbXVfYnVzX3R4X2tpY2soKS4KKyAqCisgKiBAcnhfa3RocmVhZDogdGhyZWFkIHdlIHVzZSBmb3IgZGF0YSBSWC4gV2UgdXNlIGEgdGhyZWFkIGJlY2F1c2UgaW4KKyAqICAgICBvcmRlciB0byBkbyBkZWVwIHBvd2VyIHNhdmluZyBhbmQgcHV0IHRoZSBkZXZpY2UgdG8gc2xlZXAsIHdlCisgKiAgICAgbmVlZCB0byBjYWxsIHVzYl9hdXRvcG1fKigpIFtibG9ja2luZyBmdW5jdGlvbnNdLgorICoKKyAqIEByeF93cTogd2FpdHF1ZXVlIGZvciB0aGUgUlgga3RocmVhZCB0byBzbGVlcCB3aGVuIHRoZXJlIGlzIG5vIGRhdGEKKyAqICAgICB0byByZWNlaXZlLiBXaGVuIGRhdGEgaXMgYXZhaWxhYmxlLCBpdCBpcyB3b2tlbiB1cCBieQorICogICAgIHVzYi1ub3RpZi5jOmkyNDAwbXVfbm90aWZpY2F0aW9uX2dyb2soKS4KKyAqCisgKiBAcnhfcGVuZGluZ19jb3VudDogbnVtYmVyIG9mIHJ4LWRhdGEtcmVhZHkgbm90aWZpY2F0aW9ucyB0aGF0IHdlcmUKKyAqICAgICBzdGlsbCBub3QgaGFuZGxlZCBieSB0aGUgUlgga3RocmVhZC4KKyAqCisgKiBAcnhfc2l6ZTogY3VycmVudCBSWCBidWZmZXIgc2l6ZSB0aGF0IGlzIGJlaW5nIHVzZWQuCisgKgorICogQHJ4X3NpemVfYWNjOiBhY2N1bXVsYXRvciBvZiB0aGUgc2l6ZXMgb2YgdGhlIHByZXZpb3VzIHJlYWQKKyAqICAgICB0cmFuc2FjdGlvbnMuCisgKgorICogQHJ4X3NpemVfY250OiBudW1iZXIgb2YgcmVhZCB0cmFuc2FjdGlvbnMgYWNjdW11bGF0ZWQgaW4KKyAqICAgICBAcnhfc2l6ZV9hY2MuCisgKgorICogQGRvX2F1dG9wbTogZGlzYWJsZSgwKS9lbmFibGUoPjApIGNhbGxpbmcgdGhlCisgKiAgICAgdXNiX2F1dG9wbV9nZXQvcHV0X2ludGVyZmFjZSgpIGJhcnJpZXJzIHdoZW4gZXhlY3V0aW5nCisgKiAgICAgY29tbWFuZHMuIFNlZSBkb2MgaW4gaTI0MDBtdV9zdXNwZW5kKCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKgorICogQHJ4X3NpemVfYXV0b19zaHJpbms6IGlmIHRydWUsIHRoZSByeF9zaXplIGlzIHNocmlua2VkCisgKiAgICAgYXV0b21hdGljYWxseSBiYXNlZCBvbiB0aGUgYXZlcmFnZSBzaXplIG9mIHRoZSByZWNlaXZlZAorICogICAgIHRyYW5zYWN0aW9ucy4gVGhpcyBhbGxvd3MgdGhlIHJlY2VpdmUgY29kZSB0byBhbGxvY2F0ZSBzbWFsbGVyCisgKiAgICAgY2h1bmtzIG9mIG1lbW9yeSBhbmQgdGh1cyByZWR1Y2UgcHJlc3N1cmUgb24gdGhlIG1lbW9yeQorICogICAgIGFsbG9jYXRvciBieSBub3Qgd2FzdGluZyBzbyBtdWNoIHNwYWNlLiBCeSBkZWZhdWx0IGl0IGlzCisgKiAgICAgZW5hYmxlZC4KKyAqCisgKiBAZGVidWdmc19kZW50cnk6IGhvb2t1cCBmb3IgZGVidWdmcyBmaWxlcy4KKyAqICAgICBUaGVzZSBoYXZlIHRvIGJlIGluIGEgc2VwYXJhdGUgZGlyZWN0b3J5LCBhIGNoaWxkIG9mCisgKiAgICAgKHdpbWF4X2Rldi0+ZGVidWdmc19kZW50cnkpIHNvIHRoZXkgY2FuIGJlIHJlbW92ZWQgd2hlbiB0aGUKKyAqICAgICBtb2R1bGUgdW5sb2FkcywgYXMgd2UgZG9uJ3Qga2VlcCBlYWNoIGRlbnRyeS4KKyAqLworc3RydWN0IGkyNDAwbXUgeworCXN0cnVjdCBpMjQwMG0gaTI0MDBtOwkJLyogRklSU1QhIFNlZSBkb2MgKi8KKworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2OworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICp1c2JfaWZhY2U7CisJc3RydWN0IGVkYyB1cmJfZWRjOwkJLyogRXJyb3IgZGVuc2l0eSBjb3VudGVyICovCisKKwlzdHJ1Y3QgdXJiICpub3RpZl91cmI7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0eF9rdGhyZWFkOworCXdhaXRfcXVldWVfaGVhZF90IHR4X3dxOworCisJc3RydWN0IHRhc2tfc3RydWN0ICpyeF9rdGhyZWFkOworCXdhaXRfcXVldWVfaGVhZF90IHJ4X3dxOworCWF0b21pY190IHJ4X3BlbmRpbmdfY291bnQ7CisJc2l6ZV90IHJ4X3NpemUsIHJ4X3NpemVfYWNjLCByeF9zaXplX2NudDsKKwlhdG9taWNfdCBkb19hdXRvcG07CisJdTggcnhfc2l6ZV9hdXRvX3NocmluazsKKworCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfZGVudHJ5OworfTsKKworCitzdGF0aWMgaW5saW5lCit2b2lkIGkyNDAwbXVfaW5pdChzdHJ1Y3QgaTI0MDBtdSAqaTI0MDBtdSkKK3sKKwlpMjQwMG1faW5pdCgmaTI0MDBtdS0+aTI0MDBtKTsKKwllZGNfaW5pdCgmaTI0MDBtdS0+dXJiX2VkYyk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaTI0MDBtdS0+dHhfd3EpOworCWF0b21pY19zZXQoJmkyNDAwbXUtPnJ4X3BlbmRpbmdfY291bnQsIDApOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmkyNDAwbXUtPnJ4X3dxKTsKKwlpMjQwMG11LT5yeF9zaXplID0gUEFHRV9TSVpFIC0gc2l6ZW9mKHN0cnVjdCBza2Jfc2hhcmVkX2luZm8pOworCWF0b21pY19zZXQoJmkyNDAwbXUtPmRvX2F1dG9wbSwgMSk7CisJaTI0MDBtdS0+cnhfc2l6ZV9hdXRvX3NocmluayA9IDE7Cit9CisKK2V4dGVybiBpbnQgaTI0MDBtdV9ub3RpZmljYXRpb25fc2V0dXAoc3RydWN0IGkyNDAwbXUgKik7CitleHRlcm4gdm9pZCBpMjQwMG11X25vdGlmaWNhdGlvbl9yZWxlYXNlKHN0cnVjdCBpMjQwMG11ICopOworCitleHRlcm4gaW50IGkyNDAwbXVfcnhfc2V0dXAoc3RydWN0IGkyNDAwbXUgKik7CitleHRlcm4gdm9pZCBpMjQwMG11X3J4X3JlbGVhc2Uoc3RydWN0IGkyNDAwbXUgKik7CitleHRlcm4gdm9pZCBpMjQwMG11X3J4X2tpY2soc3RydWN0IGkyNDAwbXUgKik7CisKK2V4dGVybiBpbnQgaTI0MDBtdV90eF9zZXR1cChzdHJ1Y3QgaTI0MDBtdSAqKTsKK2V4dGVybiB2b2lkIGkyNDAwbXVfdHhfcmVsZWFzZShzdHJ1Y3QgaTI0MDBtdSAqKTsKK2V4dGVybiB2b2lkIGkyNDAwbXVfYnVzX3R4X2tpY2soc3RydWN0IGkyNDAwbSAqKTsKKworZXh0ZXJuIHNzaXplX3QgaTI0MDBtdV9idXNfYm1fY21kX3NlbmQoc3RydWN0IGkyNDAwbSAqLAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyICosCisJCQkJICAgICAgIHNpemVfdCwgaW50KTsKK2V4dGVybiBzc2l6ZV90IGkyNDAwbXVfYnVzX2JtX3dhaXRfZm9yX2FjayhzdHJ1Y3QgaTI0MDBtICosCisJCQkJCSAgIHN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgKiwKKwkJCQkJICAgc2l6ZV90KTsKKyNlbmRpZiAvKiAjaWZuZGVmIF9fSTI0MDBNX1VTQl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9pMjQwMG0uaCBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9pMjQwMG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjdjODcxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL2kyNDAwbS5oCkBAIC0wLDAgKzEsNzU1IEBACisvKgorICogSW50ZWwgV2lyZWxlc3MgV2lNQVggQ29ubmVjdGlvbiAyNDAwbQorICogRGVjbGFyYXRpb25zIGZvciBidXMtZ2VuZXJpYyBpbnRlcm5hbCBBUElzCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqCisgKiBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqIFlhbmlyIEx1YmV0a2luIDx5YW5pcngubHViZXRraW5AaW50ZWwuY29tPgorICogIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICoKKyAqCisgKiBHRU5FUkFMIERSSVZFUiBBUkNISVRFQ1RVUkUKKyAqCisgKiBUaGUgaTI0MDBtIGRyaXZlciBpcyBzcGxpdCBpbiB0aGUgZm9sbG93aW5nIHR3byBtYWpvciBwYXJ0czoKKyAqCisgKiAgLSBidXMgc3BlY2lmaWMgZHJpdmVyCisgKiAgLSBidXMgZ2VuZXJpYyBkcml2ZXIgKHRoaXMgcGFydCkKKyAqCisgKiBUaGUgYnVzIHNwZWNpZmljIGRyaXZlciBzZXRzIHVwIHN0dWZmIHNwZWNpZmljIHRvIHRoZSBidXMgdGhlCisgKiBkZXZpY2UgaXMgY29ubmVjdGVkIHRvIChVU0IsIFNESU8sIFBDSSwgdGFtLXRhbS4uLm5vbi1hdXRob3JpdGF0aXZlCisgKiBub3IgYmluZGluZyBsaXN0KSB3aGljaCBpcyBiYXNpY2FsbHkgdGhlIGRldmljZS1tb2RlbCBtYW5hZ2VtZW50CisgKiAocHJvYmUvZGlzY29ubmVjdCwgZXRjKSwgbW92aW5nIGRhdGEgZnJvbSBkZXZpY2UgdG8ga2VybmVsIGFuZAorICogYmFjaywgZG9pbmcgdGhlIHBvd2VyIHNhdmluZyBkZXRhaWxzIGFuZCByZXNldGluZyB0aGUgZGV2aWNlLgorICoKKyAqIEZvciBkZXRhaWxzIG9uIGVhY2ggYnVzLXNwZWNpZmljIGRyaXZlciwgc2VlIGl0J3MgaW5jbHVkZSBmaWxlLAorICogaTI0MDBtLUJVU05BTUUuaAorICoKKyAqIFRoZSBidXMtZ2VuZXJpYyBmdW5jdGlvbmFsaXR5IGJyZWFrIHVwIGlzOgorICoKKyAqICAtIEZpcm13YXJlIHVwbG9hZDogZncuYyAtIHRha2VzIGNhcmUgb2YgdXBsb2FkaW5nIGZpcm13YXJlIHRvIHRoZQorICogICAgICAgIGRldmljZS4gYnVzLXNwZWNpZmljIGRyaXZlciBqdXN0IG5lZWRzIHRvIHByb3ZpZGVzIGEgd2F5IHRvCisgKiAgICAgICAgZXhlY3V0ZSBib290LW1vZGUgY29tbWFuZHMgYW5kIHRvIHJlc2V0IHRoZSBkZXZpY2UuCisgKgorICogIC0gUlggaGFuZGxpbmc6IHJ4LmMgLSByZWNlaXZlcyBkYXRhIGZyb20gdGhlIGJ1cy1zcGVjaWZpYyBjb2RlIGFuZAorICogICAgICAgIGZlZWRzIGl0IHRvIHRoZSBuZXR3b3JrIG9yIFdpTUFYIHN0YWNrIG9yIHVzZXMgaXQgdG8gbW9kaWZ5CisgKiAgICAgICAgdGhlIGRyaXZlciBzdGF0ZS4gYnVzLXNwZWNpZmljIGRyaXZlciBvbmx5IGhhcyB0byByZWNlaXZlCisgKiAgICAgICAgZnJhbWVzIGFuZCBwYXNzIHRoZW0gdG8gdGhpcyBtb2R1bGUuCisgKgorICogIC0gVFggaGFuZGxpbmc6IHR4LmMgLSBtYW5hZ2VzIHRoZSBUWCBGSUZPIHF1ZXVlIGFuZCBwcm92aWRlcyBtZWFucworICogICAgICAgIGZvciB0aGUgYnVzLXNwZWNpZmljIFRYIGNvZGUgdG8gcHVsbCBkYXRhIGZyb20gdGhlIEZJRk8KKyAqICAgICAgICBxdWV1ZS4gYnVzLXNwZWNpZmljIGNvZGUganVzdCBwdWxscyBmcmFtZXMgZnJvbSB0aGlzIG1vZHVsZQorICogICAgICAgIHRvIHNlbmRzIHRoZW0gdG8gdGhlIGRldmljZS4KKyAqCisgKiAgLSBuZXRkZXYgZ2x1ZTogbmV0ZGV2LmMgLSBpbnRlcmZhY2Ugd2l0aCBMaW51eCBuZXR3b3JraW5nCisgKiAgICAgICAgc3RhY2suIFBhc3MgYXJvdW5kIGRhdGEgZnJhbWVzLCBhbmQgY29uZmlndXJlIHdoZW4gdGhlCisgKiAgICAgICAgZGV2aWNlIGlzIHVwIGFuZCBydW5uaW5nIG9yIHNodXRkb3duICh0aHJvdWdoIGlmY29uZmlnIHVwIC8KKyAqICAgICAgICBkb3duKS4gQnVzLWdlbmVyaWMgb25seS4KKyAqCisgKiAgLSBjb250cm9sIG9wczogY29udHJvbC5jIC0gaW1wbGVtZW50cyB2YXJpb3VzIGNvbW1tYW5kcyBmb3IKKyAqICAgICAgICBjb250cm9sbGluZyB0aGUgZGV2aWNlLiBidXMtZ2VuZXJpYyBvbmx5LgorICoKKyAqICAtIGRldmljZSBtb2RlbCBnbHVlOiBkcml2ZXIuYyAtIGltcGxlbWVudHMgaGVscGVycyBmb3IgdGhlCisgKiAgICAgICAgZGV2aWNlLW1vZGVsIGdsdWUgZG9uZSBieSB0aGUgYnVzLXNwZWNpZmljIGxheWVyCisgKiAgICAgICAgKHNldHVwL3JlbGVhc2UgdGhlIGRyaXZlciByZXNvdXJjZXMpLCB0dXJuaW5nIHRoZSBkZXZpY2Ugb24KKyAqICAgICAgICBhbmQgb2ZmLCBoYW5kbGluZyB0aGUgZGV2aWNlIHJlYm9vdHMvcmVzZXRzIGFuZCBhIGZldyBzaW1wbGUKKyAqICAgICAgICBXaU1BWCBzdGFjayBvcHMuCisgKgorICogQ29kZSBpcyBhbHNvIGJyb2tlbiB1cCBpbiBsaW51eC1nbHVlIC8gZGV2aWNlLWdsdWUuCisgKgorICogTGludXggZ2x1ZSBjb250YWlucyBmdW5jdGlvbnMgdGhhdCBkZWFsIG1vc3RseSB3aXRoIGdsdWluZyB3aXRoIHRoZQorICogcmVzdCBvZiB0aGUgTGludXgga2VybmVsLgorICoKKyAqIERldmljZS1nbHVlIGFyZSBmdW5jdGlvbnMgdGhhdCBkZWFsIG1vc3RseSB3aXRoIHRoZSB3YXkgdGhlIGRldmljZQorICogZG9lcyB0aGluZ3MgYW5kIHRhbGsgdGhlIGRldmljZSdzIGxhbmd1YWdlLgorICoKKyAqIGRldmljZS1nbHVlIGNvZGUgaXMgbGljZW5zZWQgQlNEIHNvIG90aGVyIG9wZW4gc291cmNlIE9TZXMgY2FuIHRha2UKKyAqIGl0IHRvIGltcGxlbWVudCB0aGVpciBkcml2ZXJzLgorICoKKyAqCisgKiBBUElzIEFORCBIRUFERVIgRklMRVMKKyAqCisgKiBUaGlzIGJ1cyBnZW5lcmljIGNvZGUgZXhwb3J0cyB0aHJlZSBBUElzOgorICoKKyAqICAtIEhESSAoaG9zdC1kZXZpY2UgaW50ZXJmYWNlKSBkZWZpbml0aW9ucyBjb21tb24gdG8gYWxsIGJ1c3NlcworICogICAgKGluY2x1ZGUvbGludXgvd2ltYXgvaTI0MDBtLmgpOyB0aGVzZSBjYW4gYmUgYWxzbyB1c2VkIGJ5IHVzZXIKKyAqICAgIHNwYWNlIGNvZGUuCisgKiAgLSBpbnRlcm5hbCBBUEkgZm9yIHRoZSBidXMtZ2VuZXJpYyBjb2RlCisgKiAgLSBleHRlcm5hbCBBUEkgZm9yIHRoZSBidXMtc3BlY2lmaWMgZHJpdmVycworICoKKyAqCisgKiBMSUZFIENZQ0xFOgorICoKKyAqIFdoZW4gdGhlIGJ1cy1zcGVjaWZpYyBkcml2ZXIgcHJvYmVzLCBpdCBhbGxvY2F0ZXMgYSBuZXR3b3JrIGRldmljZQorICogd2l0aCBlbm91Z2ggc3BhY2UgZm9yIGl0J3MgZGF0YSBzdHJ1Y3R1ZSwgdGhhdCBtdXN0IGNvbnRhaW4gYQorICogJnN0cnVjdCBpMjQwMG0gYXQgdGhlIHRvcC4KKyAqCisgKiBPbiBwcm9iZSwgaXQgbmVlZHMgdG8gZmlsbCB0aGUgaTI0MDBtIG1lbWJlcnMgbWFya2VkIGFzIFtmaWxsXSwgYXMKKyAqIHdlbGwgYXMgaTI0MDBtLT53aW1heF9kZXYubmV0X2RldiBhbmQgY2FsbCBpMjQwMG1fc2V0dXAoKS4gVGhlCisgKiBpMjQwMG0gZHJpdmVyIHdpbGwgb25seSByZWdpc3RlciB3aXRoIHRoZSBXaU1BWCBhbmQgbmV0d29yayBzdGFja3M7CisgKiB0aGUgb25seSBhY2Nlc3MgZG9uZSB0byB0aGUgZGV2aWNlIGlzIHRvIHJlYWQgdGhlIE1BQyBhZGRyZXNzIHNvIHdlCisgKiBjYW4gcmVnaXN0ZXIgYSBuZXR3b3JrIGRldmljZS4gVGhpcyBjYWxscyBpMjQwMG1fZGV2X3N0YXJ0KCkgdG8KKyAqIGxvYWQgZmlybXdhcmUsIHNldHVwIGNvbW11bmljYXRpb24gd2l0aCB0aGUgZGV2aWNlIGFuZCBjb25maWd1cmUgaXQKKyAqIGZvciBvcGVyYXRpb24uCisgKgorICogQXQgdGhpcyBwb2ludCwgY29udHJvbCBhbmQgZGF0YSBjb21tdW5pY2F0aW9ucyBhcmUgcG9zc2libGUuCisgKgorICogT24gZGlzY29ubmVjdC9kcml2ZXIgdW5sb2FkLCB0aGUgYnVzLXNwZWNpZmljIGRpc2Nvbm5lY3QgZnVuY3Rpb24KKyAqIGNhbGxzIGkyNDAwbV9yZWxlYXNlKCkgdG8gdW5kbyBpMjQwMG1fc2V0dXAoKS4gaTI0MDBtX2Rldl9zdG9wKCkKKyAqIHNodXRzIHRoZSBmaXJtd2FyZSBkb3duIGFuZCByZWxlYXNlcyByZXNvdXJjZXMgdXNlcyB0byBjb21tdW5pY2F0ZQorICogd2l0aCB0aGUgZGV2aWNlLgorICoKKyAqIFdoaWxlIHRoZSBkZXZpY2UgaXMgdXAsIGl0IG1pZ2h0IHJlc2V0LiBUaGUgYnVzLXNwZWNpZmljIGRyaXZlciBoYXMKKyAqIHRvIGNhdGNoIHRoYXQgc2l0dWF0aW9uIGFuZCBjYWxsIGkyNDAwbV9kZXZfcmVzZXRfaGFuZGxlKCkgdG8gZGVhbAorICogd2l0aCBpdCAocmVzZXQgdGhlIGludGVybmFsIGRyaXZlciBzdHJ1Y3R1cmVzIGFuZCBnbyBiYWNrIHRvIHNxdWFyZQorICogb25lKS4KKyAqLworCisjaWZuZGVmIF9fSTI0MDBNX0hfXworI2RlZmluZSBfX0kyNDAwTV9IX18KKworI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxuZXQvd2ltYXguaD4KKyNpbmNsdWRlIDxsaW51eC93aW1heC9pMjQwMG0uaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKy8qIE1pc2MgY29uc3RhbnRzICovCitlbnVtIHsKKwkvKiBGaXJtd2FyZSB1cGxvYWRpbmcgKi8KKwlJMjQwME1fQk9PVF9SRVRSSUVTID0gMywKKwkvKiBTaXplIG9mIHRoZSBCb290IE1vZGUgQ29tbWFuZCBidWZmZXIgKi8KKwlJMjQwME1fQk1fQ01EX0JVRl9TSVpFID0gMTYgKiAxMDI0LAorCUkyNDAwTV9CTV9BQ0tfQlVGX1NJWkUgPSAyNTYsCit9OworCisKKy8qIEZpcm13YXJlIHZlcnNpb24gd2UgcmVxdWVzdCB3aGVuIHB1bGxpbmcgdGhlIGZ3IGltYWdlIGZpbGUgKi8KKyNkZWZpbmUgSTI0MDBNX0ZXX1ZFUlNJT04gIjEuMyIKKworCisvKioKKyAqIGkyNDAwbV9yZXNldF90eXBlIC0gbWV0aG9kcyB0byByZXNldCBhIGRldmljZQorICoKKyAqIEBJMjQwME1fUlRfV0FSTTogUmVzZXQgd2l0aG91dCBkZXZpY2UgZGlzY29ubmVjdGlvbiwgZGV2aWNlIGhhbmRsZXMKKyAqICAgICBhcmUga2VwdCB2YWxpZCBidXQgc3RhdGUgaXMgYmFjayB0byBwb3dlciBvbiwgd2l0aCBmaXJtd2FyZQorICogICAgIHJlLXVwbG9hZGVkLgorICogQEkyNDAwTV9SVF9DT0xEOiBUZWxsIHRoZSBkZXZpY2UgdG8gZGlzY29ubmVjdCBpdHNlbGYgZnJvbSB0aGUgYnVzCisgKiAgICAgYW5kIHJlY29ubmVjdC4gUmVuZGVycyBhbGwgZGV2aWNlIGhhbmRsZXMgaW52YWxpZC4KKyAqIEBJMjQwME1fUlRfQlVTOiBUZWxscyB0aGUgYnVzIHRvIHJlc2V0IHRoZSBkZXZpY2U7IGxhc3QgbWVhc3VyZQorICogICAgIHVzZWQgd2hlbiBib3RoIHR5cGVzIGFib3ZlIGRvbid0IHdvcmsuCisgKi8KK2VudW0gaTI0MDBtX3Jlc2V0X3R5cGUgeworCUkyNDAwTV9SVF9XQVJNLAkvKiBmaXJzdCBtZWFzdXJlICovCisJSTI0MDBNX1JUX0NPTEQsCS8qIHNlY29uZCBtZWFzdXJlICovCisJSTI0MDBNX1JUX0JVUywJLyogY2FsbCBpbiBhcnRpbGxlcnkgKi8KK307CisKK3N0cnVjdCBpMjQwMG1fcmVzZXRfY3R4OworCisvKioKKyAqIHN0cnVjdCBpMjQwMG0gLSBkZXNjcmlwdG9yIGZvciBhbiBJbnRlbCAyNDAwbQorICoKKyAqIE1lbWJlcnMgbWFya2VkIHdpdGggW2ZpbGxdIG11c3QgYmUgZmlsbGVkIG91dC9pbml0aWFsaXplZCBiZWZvcmUKKyAqIGNhbGxpbmcgaTI0MDBtX3NldHVwKCkuCisgKgorICogQGJ1c190eF9ibG9ja19zaXplOiBbZmlsbF0gU0RJTyBpbXBvc2VzIGEgMjU2IGJsb2NrIHNpemUsIFVTQiAxNiwKKyAqICAgICBzbyB3ZSBoYXZlIGEgdHhfYmxrX3NpemUgdmFyaWFibGUgdGhhdCB0aGUgYnVzIGxheWVyIHNldHMgdG8KKyAqICAgICB0ZWxsIHRoZSBlbmdpbmUgaG93IG11Y2ggb2YgdGhhdCB3ZSBuZWVkLgorICoKKyAqIEBidXNfcGxfc2l6ZV9tYXg6IFtmaWxsXSBNYXhpbXVtIHBheWxvYWQgc2l6ZS4KKyAqCisgKiBAYnVzX2Rldl9zdGFydDogW2ZpbGxdIEZ1bmN0aW9uIGNhbGxlZCBieSB0aGUgYnVzLWdlbmVyaWMgY29kZQorICogICAgIFtpMjQwMG1fZGV2X3N0YXJ0KCldIHRvIHNldHVwIHRoZSBidXMtc3BlY2lmaWMgY29tbXVuaWNhdGlvbnMKKyAqICAgICB0byB0aGUgdGhlIGRldmljZS4gU2VlIExJRkUgQ1lDTEUgYWJvdmUuCisgKgorICogICAgIE5PVEU6IERvZXNuJ3QgbmVlZCB0byB1cGxvYWQgdGhlIGZpcm13YXJlLCBhcyB0aGF0IGlzIHRha2VuCisgKiAgICAgY2FyZSBvZiBieSB0aGUgYnVzLWdlbmVyaWMgY29kZS4KKyAqCisgKiBAYnVzX2Rldl9zdG9wOiBbZmlsbF0gRnVuY3Rpb24gY2FsbGVkIGJ5IHRoZSBidXMtZ2VuZXJpYyBjb2RlCisgKiAgICAgW2kyNDAwbV9kZXZfc3RvcCgpXSB0byBzaHV0ZG93biB0aGUgYnVzLXNwZWNpZmljIGNvbW11bmljYXRpb25zCisgKiAgICAgdG8gdGhlIHRoZSBkZXZpY2UuIFNlZSBMSUZFIENZQ0xFIGFib3ZlLgorICoKKyAqICAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IG5lZWQgdG8gcmVzZXQgdGhlIGRldmljZSwganVzdCB0ZWFyIGRvd24KKyAqICAgICBhbGwgdGhlIGhvc3QgcmVzb3VyY2VzIGNyZWF0ZWQgdG8gIGhhbmRsZSBjb21tdW5pY2F0aW9uIHdpdGgKKyAqICAgICB0aGUgZGV2aWNlLgorICoKKyAqIEBidXNfdHhfa2ljazogW2ZpbGxdIEZ1bmN0aW9uIGNhbGxlZCBieSB0aGUgYnVzLWdlbmVyaWMgY29kZSB0byBsZXQKKyAqICAgICB0aGUgYnVzLXNwZWNpZmljIGNvZGUga25vdyB0aGF0IHRoZXJlIGlzIGRhdGEgYXZhaWxhYmxlIGluIHRoZQorICogICAgIFRYIEZJRk8gZm9yIHRyYW5zbWlzc2lvbiB0byB0aGUgZGV2aWNlLgorICoKKyAqICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBzbGVlcC4KKyAqCisgKiBAYnVzX3Jlc2V0OiBbZmlsbF0gRnVuY3Rpb24gY2FsbGVkIGJ5IHRoZSBidXMtZ2VuZXJpYyBjb2RlIHRvIHJlc2V0CisgKiAgICAgdGhlIGRldmljZSBpbiBpbiB2YXJpb3VzIHdheXMuIERvZXNuJ3QgbmVlZCB0byB3YWl0IGZvciB0aGUKKyAqICAgICByZXNldCB0byBmaW5pc2guCisgKgorICogICAgIElmIHdhcm0gb3IgY29sZCByZXNldCBmYWlsLCB0aGlzIGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIGRvIGEKKyAqICAgICBidXMtc3BlY2lmaWMgcmVzZXQgKGVnOiBVU0IgcmVzZXQpIHRvIGdldCB0aGUgZGV2aWNlIHRvIGEKKyAqICAgICB3b3JraW5nIHN0YXRlIChldmVuIGlmIGl0IGltcGxpZXMgZGV2aWNlIGRpc2NvbmVjY3Rpb24pLgorICoKKyAqICAgICBOb3RlIHRoZSB3YXJtIHJlc2V0IGlzIHVzZWQgYnkgdGhlIGZpcm13YXJlIHVwbG9hZGVyIHRvCisgKiAgICAgcmVpbml0aWFsaXplIHRoZSBkZXZpY2UuCisgKgorICogICAgIElNUE9SVEFOVDogdGhpcyBpcyBjYWxsZWQgdmVyeSBlYXJseSBpbiB0aGUgZGV2aWNlIHNldHVwCisgKiAgICAgcHJvY2Vzcywgc28gaXQgY2Fubm90IHJlbHkgb24gY29tbW9uIGluZnJhc3RydWN0dXJlIGJlaW5nIGxhaWQKKyAqICAgICBvdXQuCisgKgorICogQGJ1c19ibV9jbWRfc2VuZDogW2ZpbGxdIEZ1bmN0aW9uIGNhbGxlZCB0byBzZW5kIGEgYm9vdC1tb2RlCisgKiAgICAgY29tbWFuZC4gRmxhZ3MgYXJlIGRlZmluZWQgaW4gJ2VudW0gaTI0MDBtX2JtX2NtZF9mbGFncycuIFRoaXMKKyAqICAgICBpcyBzeW5jaHJvbm91cyBhbmQgaGFzIHRvIHJldHVybiAwIGlmIG9rIG9yIDwgMCBlcnJubyBjb2RlIGluCisgKiAgICAgYW55IGVycm9yIGNvbmRpdGlvbi4KKyAqCisgKiBAYnVzX2JtX3dhaXRfZm9yX2FjazogW2ZpbGxdIEZ1bmN0aW9uIGNhbGxlZCB0byB3YWl0IGZvciBhCisgKiAgICAgYm9vdC1tb2RlIG5vdGlmaWNhdGlvbiAodGhhdCBjYW4gYmUgYSByZXNwb25zZSB0byBhIHByZXZpb3VzbHkKKyAqICAgICBpc3N1ZWQgY29tbWFuZCBvciBhbiBhc3luY2hyb25vdXMgb25lKS4gV2lsbCByZWFkIHVudGlsIGFsbCB0aGUKKyAqICAgICBpbmRpY2F0ZWQgc2l6ZSBpcyByZWFkIG9yIHRpbWVvdXQuIFJlYWRpbmcgbW9yZSBvciBsZXNzIGRhdGEKKyAqICAgICB0aGFuIGFza2VkIGZvciBpcyBhbiBlcnJvciBjb25kaXRpb24uIFJldHVybiAwIGlmIG9rLCA8IDAgZXJybm8KKyAqICAgICBjb2RlIG9uIGVycm9yLgorICoKKyAqICAgICBUaGUgY2FsbGVyIHRvIHRoaXMgZnVuY3Rpb24gd2lsbCBjaGVjayBpZiB0aGUgcmVzcG9uc2UgaXMgYQorICogICAgIGJhcmtlciB0aGF0IGluZGljYXRlcyB0aGUgZGV2aWNlIGdvaW5nIGludG8gcmVzZXQgbW9kZS4KKyAqCisgKiBAYnVzX2Z3X25hbWU6IFtmaWxsXSBuYW1lIG9mIHRoZSBmaXJtd2FyZSBpbWFnZSAoaW4gbW9zdCBjYXNlcywKKyAqICAgICB0aGV5IGFyZSBhbGwgdGhlIHNhbWUgZm9yIGEgc2luZ2xlIHJlbGVhc2UsIGV4Y2VwdCB0aGF0IHRoZXkKKyAqICAgICBoYXZlIHRoZSB0eXBlIG9mIHRoZSBidXMgZW1iZWRkZWQgaW4gdGhlIG5hbWUgKGVnOgorICogICAgIGkyNDAwbS1mdy1YLVZFUlNJT04uc2JjZiwgd2hlcmUgWCBpcyB0aGUgYnVzIG5hbWUpLgorICoKKyAqIEBidXNfYm1fbWFjX2FkZHJfaW1wYWlyZWQ6IFtmaWxsXSBTZXQgdG8gdHJ1ZSBpZiB0aGUgZGV2aWNlJ3MgTUFDCisgKiAgICAgYWRkcmVzcyBwcm92aWRlZCBpbiBib290IG1vZGUgaXMga2luZCBvZiBicm9rZW4gYW5kIG5lZWRzIHRvCisgKiAgICAgYmUgcmUtcmVhZCBsYXRlciBvbi4KKyAqCisgKgorICogQHdpbWF4X2RldjogV2lNQVggZ2VuZXJpYyBkZXZpY2UgZm9yIGxpbmthZ2UgaW50byB0aGUga2VybmVsIFdpTUFYCisgKiAgICAgc3RhY2suIER1ZSB0byB0aGUgd2F5IGEgbmV0X2RldmljZSBpcyBhbGxvY2F0ZWQsIHdlIG5lZWQgdG8KKyAqICAgICBmb3JjZSB0aGlzIHRvIGJlIHRoZSBmaXJzdCBmaWVsZCBzbyB0aGF0IHdlIGNhbiBnZXQgZnJvbQorICogICAgIG5ldGRldl9wcml2KCkgdGhlIHJpZ2h0IHBvaW50ZXIuCisgKgorICogQHN0YXRlOiBkZXZpY2UncyBzdGF0ZSAoYXMgcmVwb3J0ZWQgYnkgaXQpCisgKgorICogQHN0YXRlX3dxOiB3YWl0cXVldWUgdGhhdCBpcyB3b2tlbiB1cCB3aGVuZXZlciB0aGUgc3RhdGUgY2hhbmdlcworICoKKyAqIEB0eF9sb2NrOiBzcGlubG9jayB0byBwcm90ZWN0IFRYIG1lbWJlcnMKKyAqCisgKiBAdHhfYnVmOiBGSUZPIGJ1ZmZlciBmb3IgVFg7IHdlIHF1ZXVlIGRhdGEgaGVyZQorICoKKyAqIEB0eF9pbjogRklGTyBpbmRleCBmb3IgaW5jb21pbmcgZGF0YS4gTm90ZSB0aGlzIGRvZXNuJ3Qgd3JhcCBhcm91bmQKKyAqICAgICBhbmQgaXQgaXMgYWx3YXlzIGdyZWF0ZXIgdGhhbiBAdHhfb3V0LgorICoKKyAqIEB0eF9vdXQ6IEZJRk8gaW5kZXggZm9yIG91dGdvaW5nIGRhdGEKKyAqCisgKiBAdHhfbXNnOiBjdXJyZW50IFRYIG1lc3NhZ2UgdGhhdCBpcyBhY3RpdmUgaW4gdGhlIEZJRk8gZm9yCisgKiAgICAgYXBwZW5kaW5nIHBheWxvYWRzLgorICoKKyAqIEB0eF9zZXF1ZW5jZTogY3VycmVudCBzZXF1ZW5jZSBudW1iZXIgZm9yIFRYIG1lc3NhZ2VzIGZyb20gdGhlCisgKiAgICAgZGV2aWNlIHRvIHRoZSBob3N0LgorICoKKyAqIEB0eF9tc2dfc2l6ZTogc2l6ZSBvZiB0aGUgY3VycmVudCBtZXNzYWdlIGJlaW5nIHRyYW5zbWl0dGVkIGJ5IHRoZQorICogICAgIGJ1cy1zcGVjaWZpYyBjb2RlLgorICoKKyAqIEB0eF9wbF9udW06IHRvdGFsIG51bWJlciBvZiBwYXlsb2FkcyBzZW50CisgKgorICogQHR4X3BsX21heDogbWF4aW11bSBudW1iZXIgb2YgcGF5bG9hZHMgc2VudCBpbiBhIFRYIG1lc3NhZ2UKKyAqCisgKiBAdHhfcGxfbWluOiBtaW5pbXVtIG51bWJlciBvZiBwYXlsb2FkcyBzZW50IGluIGEgVFggbWVzc2FnZQorICoKKyAqIEB0eF9udW06IG51bWJlciBvZiBUWCBtZXNzYWdlcyBzZW50CisgKgorICogQHR4X3NpemVfYWNjOiBudW1iZXIgb2YgYnl0ZXMgaW4gYWxsIFRYIG1lc3NhZ2VzIHNlbnQKKyAqICAgICAodGhpcyBpcyBkaWZmZXJlbnQgdG8gbmV0X2RldidzIHN0YXRpc3RpY3MgYXMgaXQgYWxzbyBjb3VudHMKKyAqICAgICBjb250cm9sIG1lc3NhZ2VzKS4KKyAqCisgKiBAdHhfc2l6ZV9taW46IHNtYWxsZXN0IFRYIG1lc3NhZ2Ugc2VudC4KKyAqCisgKiBAdHhfc2l6ZV9tYXg6IGJpZ2dlc3QgVFggbWVzc2FnZSBzZW50LgorICoKKyAqIEByeF9sb2NrOiBzcGlubG9jayB0byBwcm90ZWN0IFJYIG1lbWJlcnMKKyAqCisgKiBAcnhfcGxfbnVtOiB0b3RhbCBudW1iZXIgb2YgcGF5bG9hZHMgcmVjZWl2ZWQKKyAqCisgKiBAcnhfcGxfbWF4OiBtYXhpbXVtIG51bWJlciBvZiBwYXlsb2FkcyByZWNlaXZlZCBpbiBhIFJYIG1lc3NhZ2UKKyAqCisgKiBAcnhfcGxfbWluOiBtaW5pbXVtIG51bWJlciBvZiBwYXlsb2FkcyByZWNlaXZlZCBpbiBhIFJYIG1lc3NhZ2UKKyAqCisgKiBAcnhfbnVtOiBudW1iZXIgb2YgUlggbWVzc2FnZXMgcmVjZWl2ZWQKKyAqCisgKiBAcnhfc2l6ZV9hY2M6IG51bWJlciBvZiBieXRlcyBpbiBhbGwgUlggbWVzc2FnZXMgcmVjZWl2ZWQKKyAqICAgICAodGhpcyBpcyBkaWZmZXJlbnQgdG8gbmV0X2RldidzIHN0YXRpc3RpY3MgYXMgaXQgYWxzbyBjb3VudHMKKyAqICAgICBjb250cm9sIG1lc3NhZ2VzKS4KKyAqCisgKiBAcnhfc2l6ZV9taW46IHNtYWxsZXN0IFJYIG1lc3NhZ2UgcmVjZWl2ZWQuCisgKgorICogQHJ4X3NpemVfbWF4OiBidWdnZXN0IFJYIG1lc3NhZ2UgcmVjZWl2ZWQuCisgKgorICogQGluaXRfbXV0ZXg6IE11dGV4IHVzZWQgZm9yIHNlcmlhbGl6aW5nIHRoZSBkZXZpY2UgYnJpbmd1cAorICogICAgIHNlcXVlbmNlOyB0aGlzIHdheSBpZiB0aGUgZGV2aWNlIHJlYm9vdHMgaW4gdGhlIG1pZGRsZSwgd2UKKyAqICAgICBkb24ndCB0cnkgdG8gZG8gYSBicmluZ3VwIGFnYWluIHdoaWxlIHdlIGFyZSB0ZWFyaW5nIGRvd24gdGhlCisgKiAgICAgb25lIHRoYXQgZmFpbGVkLgorICoKKyAqICAgICBDYW4ndCByZXVzZSBAbXNnX211dGV4IGJlY2F1c2UgZnJvbSB3aXRoaW4gdGhlIGJyaW5ndXAgc2VxdWVuY2UKKyAqICAgICB3ZSBuZWVkIHRvIHNlbmQgbWVzc2FnZXMgdG8gdGhlIGRldmljZSBhbmQgdGh1cyB1c2UgQG1zZ19tdXRleC4KKyAqCisgKiBAbXNnX211dGV4OiBtdXRleCB1c2VkIHRvIHNlbmQgY29udHJvbCBjb21tYW5kcyB0byB0aGUgZGV2aWNlICh3ZQorICogICAgIG9ubHkgYWxsb3cgb25lIGF0IGEgdGltZSwgcGVyIGhvc3QtZGV2aWNlIGludGVyZmFjZSBkZXNpZ24pLgorICoKKyAqIEBtc2dfY29tcGxldGlvbjogdXNlZCB0byB3YWl0IGZvciBhbiBhY2sgdG8gYSBjb250cm9sIGNvbW1hbmQgc2VudAorICogICAgIHRvIHRoZSBkZXZpY2UuCisgKgorICogQGFja19za2I6IHVzZWQgdG8gc3RvcmUgdGhlIGFjdHVhbCBhY2sgdG8gYSBjb250cm9sIGNvbW1hbmQgaWYgdGhlCisgKiAgICAgcmVjZXB0aW9uIG9mIHRoZSBjb21tYW5kIHdhcyBzdWNjZXNzZnVsLiBPdGhlcndpc2UsIGEgRVJSX1BUUigpCisgKiAgICAgZXJybm8gY29kZSB0aGF0IGluZGljYXRlcyB3aGF0IGZhaWxlZCB3aXRoIHRoZSBhY2sgcmVjZXB0aW9uLgorICoKKyAqICAgICBPbmx5IHZhbGlkIGFmdGVyIEBtc2dfY29tcGxldGlvbiBpcyB3b2tlbiB1cC4gT25seSB1cGRhdGVhYmxlCisgKiAgICAgaWYgQG1zZ19jb21wbGV0aW9uIGlzIGFybWVkLiBPbmx5IHRvdWNoZWQgYnkKKyAqICAgICBpMjQwMG1fbXNnX3RvX2RldigpLgorICoKKyAqICAgICBQcm90ZWN0ZWQgYnkgQHJ4X2xvY2suIEluIHRoZW9yeSB0aGUgY29tbWFuZCBleGVjdXRpb24gZmxvdyBpcworICogICAgIHNlcXVlbnRpYWwsIGJ1dCBpbiBjYXNlIHRoZSBkZXZpY2Ugc2VuZHMgYW4gb3V0LW9mLXBoYXNlIG9yCisgKiAgICAgdmVyeSBkZWxheWVkIHJlc3BvbnNlLCB3ZSBuZWVkIHRvIGF2b2lkIGl0IHRyYW1wbGluZyBjdXJyZW50CisgKiAgICAgZXhlY3V0aW9uLgorICoKKyAqIEBibV9jbWRfYnVmOiBib290IG1vZGUgY29tbWFuZCBidWZmZXIgZm9yIGNvbXBvc2luZyBmaXJtd2FyZSB1cGxvYWQKKyAqICAgICBjb21tYW5kcy4KKyAqCisgKiAgICAgVVNCIGNhbid0IHIvdyB0byBzdGFjaywgdm1hbGxvYywgZXRjLi4uYXMgd2VsbCwgd2UgZW5kIHVwCisgKiAgICAgaGF2aW5nIHRvIGFsbG9jL2ZyZWUgYSBsb3QgdG8gY29tcG9zZSBjb21tYW5kcywgc28gd2UgdXNlIHRoZXNlCisgKiAgICAgZm9yIHN0YWdnaW5nIGFuZCBub3QgaGF2aW5nIHRvIHJlYWxsb2MgYWxsIHRoZSB0aW1lLgorICoKKyAqICAgICBUaGlzIGFzc3VtZXMgdGhlIGNvZGUgYWx3YXlzIHJ1bnMgc2VyaWFsaXplZC4gT25seSBvbmUgdGhyZWFkCisgKiAgICAgY2FuIGNhbGwgaTI0MDBtX2JtX2NtZCgpIGF0IHRoZSBzYW1lIHRpbWUuCisgKgorICogQGJtX2Fja19idWY6IGJvb3QgbW9kZSBhY2tub2xlZGdlIGJ1ZmZlciBmb3Igc3RhZ2luZyByZWNlcHRpb24gb2YKKyAqICAgICByZXNwb25zZXMgdG8gY29tbWFuZHMuCisgKgorICogICAgIFNlZSBAYm1fY21kX2J1Zi4KKyAqCisgKiBAd29ya19xdWV1ZTogd29yayBxdWV1ZSBmb3IgcHJvY2Vzc2luZyBkZXZpY2UgcmVwb3J0cy4gVGhpcworICogICAgIHdvcmtxdWV1ZSBjYW5ub3QgYmUgdXNlZCBmb3IgcHJvY2Vzc2luZyBUWCBvciBSWCB0byB0aGUgZGV2aWNlLAorICogICAgIGFzIGZyb20gaXQgd2UnbGwgcHJvY2VzcyBkZXZpY2UgcmVwb3J0cywgd2hpY2ggbWlnaHQgcmVxdWlyZQorICogICAgIGZ1cnRoZXIgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBkZXZpY2UuCisgKgorICogQGRlYnVnZnNfZGVudHJ5OiBob29rdXAgZm9yIGRlYnVnZnMgZmlsZXMuCisgKiAgICAgVGhlc2UgaGF2ZSB0byBiZSBpbiBhIHNlcGFyYXRlIGRpcmVjdG9yeSwgYSBjaGlsZCBvZgorICogICAgICh3aW1heF9kZXYtPmRlYnVnZnNfZGVudHJ5KSBzbyB0aGV5IGNhbiBiZSByZW1vdmVkIHdoZW4gdGhlCisgKiAgICAgbW9kdWxlIHVubG9hZHMsIGFzIHdlIGRvbid0IGtlZXAgZWFjaCBkZW50cnkuCisgKi8KK3N0cnVjdCBpMjQwMG0geworCXN0cnVjdCB3aW1heF9kZXYgd2ltYXhfZGV2OwkvKiBGSVJTVCEgU2VlIGRvYyAqLworCisJdW5zaWduZWQgdXBkb3duOjE7CQkvKiBOZXR3b3JrIGRldmljZSBpcyB1cCBvciBkb3duICovCisJdW5zaWduZWQgYm9vdF9tb2RlOjE7CQkvKiBpcyB0aGUgZGV2aWNlIGluIGJvb3QgbW9kZT8gKi8KKwl1bnNpZ25lZCBzYm9vdDoxOwkJLyogc2lnbmVkIG9yIHVuc2lnbmVkIGZ3IGJvb3QgKi8KKwl1bnNpZ25lZCByZWFkeToxOwkJLyogYWxsIHByb2Jpbmcgc3RlcHMgZG9uZSAqLworCXU4IHRyYWNlX21zZ19mcm9tX3VzZXI7CQkvKiBlY2hvIHJ4IG1zZ3MgdG8gJ3RyYWNlJyBwaXBlICovCisJCQkJCS8qIHR5cGVkIHU4IHNvIGRlYnVnZnMvdTggY2FuIHR3ZWFrICovCisJZW51bSBpMjQwMG1fc3lzdGVtX3N0YXRlIHN0YXRlOworCXdhaXRfcXVldWVfaGVhZF90IHN0YXRlX3dxOwkvKiBXb2tlbiB1cCB3aGVuIG9uIHN0YXRlIHVwZGF0ZXMgKi8KKworCXNpemVfdCBidXNfdHhfYmxvY2tfc2l6ZTsKKwlzaXplX3QgYnVzX3BsX3NpemVfbWF4OworCWludCAoKmJ1c19kZXZfc3RhcnQpKHN0cnVjdCBpMjQwMG0gKik7CisJdm9pZCAoKmJ1c19kZXZfc3RvcCkoc3RydWN0IGkyNDAwbSAqKTsKKwl2b2lkICgqYnVzX3R4X2tpY2spKHN0cnVjdCBpMjQwMG0gKik7CisJaW50ICgqYnVzX3Jlc2V0KShzdHJ1Y3QgaTI0MDBtICosIGVudW0gaTI0MDBtX3Jlc2V0X3R5cGUpOworCXNzaXplX3QgKCpidXNfYm1fY21kX3NlbmQpKHN0cnVjdCBpMjQwMG0gKiwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyICosCisJCQkJICAgc2l6ZV90LCBpbnQgZmxhZ3MpOworCXNzaXplX3QgKCpidXNfYm1fd2FpdF9mb3JfYWNrKShzdHJ1Y3QgaTI0MDBtICosCisJCQkJICAgICAgIHN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgKiwgc2l6ZV90KTsKKwljb25zdCBjaGFyICpidXNfZndfbmFtZTsKKwl1bnNpZ25lZCBidXNfYm1fbWFjX2FkZHJfaW1wYWlyZWQ6MTsKKworCXNwaW5sb2NrX3QgdHhfbG9jazsJCS8qIHByb3RlY3QgVFggc3RhdGUgKi8KKwl2b2lkICp0eF9idWY7CisJc2l6ZV90IHR4X2luLCB0eF9vdXQ7CisJc3RydWN0IGkyNDAwbV9tc2dfaGRyICp0eF9tc2c7CisJc2l6ZV90IHR4X3NlcXVlbmNlLCB0eF9tc2dfc2l6ZTsKKwkvKiBUWCBzdGF0cyAqLworCXVuc2lnbmVkIHR4X3BsX251bSwgdHhfcGxfbWF4LCB0eF9wbF9taW4sCisJCXR4X251bSwgdHhfc2l6ZV9hY2MsIHR4X3NpemVfbWluLCB0eF9zaXplX21heDsKKworCS8qIFJYIHN0YXRzICovCisJc3BpbmxvY2tfdCByeF9sb2NrOwkJLyogcHJvdGVjdCBSWCBzdGF0ZSAqLworCXVuc2lnbmVkIHJ4X3BsX251bSwgcnhfcGxfbWF4LCByeF9wbF9taW4sCisJCXJ4X251bSwgcnhfc2l6ZV9hY2MsIHJ4X3NpemVfbWluLCByeF9zaXplX21heDsKKworCXN0cnVjdCBtdXRleCBtc2dfbXV0ZXg7CQkvKiBzZXJpYWxpemUgY29tbWFuZCBleGVjdXRpb24gKi8KKwlzdHJ1Y3QgY29tcGxldGlvbiBtc2dfY29tcGxldGlvbjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYWNrX3NrYjsJLyogcHJvdGVjdGVkIGJ5IHJ4X2xvY2sgKi8KKworCXZvaWQgKmJtX2Fja19idWY7CQkvKiBmb3IgcmVjZWl2aW5nIGFja3Mgb3ZlciBVU0IgKi8KKwl2b2lkICpibV9jbWRfYnVmOwkJLyogZm9yIGlzc3VpbmcgY29tbWFuZHMgb3ZlciBVU0IgKi8KKworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3b3JrX3F1ZXVlOworCisJc3RydWN0IG11dGV4IGluaXRfbXV0ZXg7CS8qIHByb3RlY3QgYnJpbmd1cCBzZXEgKi8KKwlzdHJ1Y3QgaTI0MDBtX3Jlc2V0X2N0eCAqcmVzZXRfY3R4OwkvKiBwcm90ZWN0ZWQgYnkgaW5pdF9tdXRleCAqLworCisJc3RydWN0IHdvcmtfc3RydWN0IHdha2VfdHhfd3M7CisJc3RydWN0IHNrX2J1ZmYgKndha2VfdHhfc2tiOworCisJc3RydWN0IGRlbnRyeSAqZGVidWdmc19kZW50cnk7Cit9OworCisKKy8qCisgKiBJbml0aWFsaXplIGEgJ3N0cnVjdCBpMjQwMG0nIGZyb20gYWxsIHplcm9lcworICoKKyAqIFRoaXMgaXMgYSBidXMtZ2VuZXJpYyBBUEkgY2FsbC4KKyAqLworc3RhdGljIGlubGluZQordm9pZCBpMjQwMG1faW5pdChzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJd2ltYXhfZGV2X2luaXQoJmkyNDAwbS0+d2ltYXhfZGV2KTsKKworCWkyNDAwbS0+Ym9vdF9tb2RlID0gMTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpMjQwMG0tPnN0YXRlX3dxKTsKKworCXNwaW5fbG9ja19pbml0KCZpMjQwMG0tPnR4X2xvY2spOworCWkyNDAwbS0+dHhfcGxfbWluID0gVUlOVF9NQVg7CisJaTI0MDBtLT50eF9zaXplX21pbiA9IFVJTlRfTUFYOworCisJc3Bpbl9sb2NrX2luaXQoJmkyNDAwbS0+cnhfbG9jayk7CisJaTI0MDBtLT5yeF9wbF9taW4gPSBVSU5UX01BWDsKKwlpMjQwMG0tPnJ4X3NpemVfbWluID0gVUlOVF9NQVg7CisKKwltdXRleF9pbml0KCZpMjQwMG0tPm1zZ19tdXRleCk7CisJaW5pdF9jb21wbGV0aW9uKCZpMjQwMG0tPm1zZ19jb21wbGV0aW9uKTsKKworCW11dGV4X2luaXQoJmkyNDAwbS0+aW5pdF9tdXRleCk7CisJLyogd2FrZV90eF93cyBpcyBpbml0aWFsaXplZCBpbiBpMjQwMG1fdHhfc2V0dXAoKSAqLworfQorCisKKy8qCisgKiBCdXMtZ2VuZXJpYyBpbnRlcm5hbCBBUElzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworc3RhdGljIGlubGluZQorc3RydWN0IGkyNDAwbSAqd2ltYXhfZGV2X3RvX2kyNDAwbShzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZih3aW1heF9kZXYsIHN0cnVjdCBpMjQwMG0sIHdpbWF4X2Rldik7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCBpMjQwMG0gKm5ldF9kZXZfdG9faTI0MDBtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworCXJldHVybiB3aW1heF9kZXZfdG9faTI0MDBtKG5ldGRldl9wcml2KG5ldF9kZXYpKTsKK30KKworLyoKKyAqIEJvb3QgbW9kZSBzdXBwb3J0CisgKi8KKworLyoqCisgKiBpMjQwMG1fYm1fY21kX2ZsYWdzIC0gZmxhZ3MgdG8gaTI0MDBtX2JtX2NtZCgpCisgKgorICogQEkyNDAwTV9CTV9DTURfUkFXOiBzZW5kIHRoZSBjb21tYW5kIGJsb2NrIGFzLWlzLCB3aXRob3V0IGRvaW5nIGFueQorICogICAgIGV4dHJhIHByb2Nlc3NpbmcgZm9yIGFkZGluZyBDUkMuCisgKi8KK2VudW0gaTI0MDBtX2JtX2NtZF9mbGFncyB7CisJSTI0MDBNX0JNX0NNRF9SQVcJPSAxIDw8IDIsCit9OworCisvKioKKyAqIGkyNDAwbV9icmkgLSBCb290LVJPTSBpbmRpY2F0b3JzCisgKgorICogRmxhZ3MgZm9yIGkyNDAwbV9ib290cm9tX2luaXQoKSBhbmQgaTI0MDBtX2Rldl9ib290c3RyYXAoKSBbd2hpY2gKKyAqIGFyZSBwYXNzZWQgZnJvbSB0aGluZ3MgbGlrZSBpMjQwMG1fc2V0dXAoKV0uIENhbiBiZSBjb21iaW5lZCB3aXRoCisgKiB8LgorICoKKyAqIEBJMjQwME1fQlJJX1NPRlQ6IFRoZSBkZXZpY2UgcmVib290ZWQgYWxyZWFkeSBhbmQgYSByZWJvb3QKKyAqICAgICBiYXJrZXIgcmVjZWl2ZWQsIHByb2NlZWQgZGlyZWN0bHkgdG8gYWNrIHRoZSBib290IHNlcXVlbmNlLgorICogQEkyNDAwTV9CUklfTk9fUkVCT09UOiBEbyBub3QgcmVib290IHRoZSBkZXZpY2UgYW5kIHByb2NlZWQKKyAqICAgICBkaXJlY3RseSB0byB3YWl0IGZvciBhIHJlYm9vdCBiYXJrZXIgZnJvbSB0aGUgZGV2aWNlLgorICogQEkyNDAwTV9CUklfTUFDX1JFSU5JVDogV2UgbmVlZCB0byByZWluaXRpYWxpemUgdGhlIGJvb3QKKyAqICAgICByb20gYWZ0ZXIgcmVhZGluZyB0aGUgTUFDIGFkcmVzcy4gVGhpcyBpcyBxdWl0ZSBhIGRpcnR5IGhhY2ssCisgKiAgICAgaWYgeW91IGFzayBtZSAtLSB0aGUgZGV2aWNlIHJlcXVpcmVzIHRoZSBib290cm9tIHRvIGJlCisgKiAgICAgaW50aWFsaXplZCBhZnRlciByZWFkaW5nIHRoZSBNQUMgYWRkcmVzcy4KKyAqLworZW51bSBpMjQwMG1fYnJpIHsKKwlJMjQwME1fQlJJX1NPRlQgICAgICAgPSAxIDw8IDEsCisJSTI0MDBNX0JSSV9OT19SRUJPT1QgID0gMSA8PCAyLAorCUkyNDAwTV9CUklfTUFDX1JFSU5JVCA9IDEgPDwgMywKK307CisKK2V4dGVybiB2b2lkIGkyNDAwbV9ibV9jbWRfcHJlcGFyZShzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyICopOworZXh0ZXJuIGludCBpMjQwMG1fZGV2X2Jvb3RzdHJhcChzdHJ1Y3QgaTI0MDBtICosIGVudW0gaTI0MDBtX2JyaSk7CitleHRlcm4gaW50IGkyNDAwbV9yZWFkX21hY19hZGRyKHN0cnVjdCBpMjQwMG0gKik7CitleHRlcm4gaW50IGkyNDAwbV9ib290cm9tX2luaXQoc3RydWN0IGkyNDAwbSAqLCBlbnVtIGkyNDAwbV9icmkpOworCisvKiBNYWtlL2dyb2sgYm9vdC1yb20gaGVhZGVyIGNvbW1hbmRzICovCisKK3N0YXRpYyBpbmxpbmUKK19fbGUzMiBpMjQwMG1fYnJoX2NvbW1hbmQoZW51bSBpMjQwMG1fYnJoX29wY29kZSBvcGNvZGUsIHVuc2lnbmVkIHVzZV9jaGVja3N1bSwKKwkJCSAgdW5zaWduZWQgZGlyZWN0X2FjY2VzcykKK3sKKwlyZXR1cm4gY3B1X3RvX2xlMzIoCisJCUkyNDAwTV9CUkhfU0lHTkFUVVJFCisJCXwgKGRpcmVjdF9hY2Nlc3MgPyBJMjQwME1fQlJIX0RJUkVDVF9BQ0NFU1MgOiAwKQorCQl8IEkyNDAwTV9CUkhfUkVTUE9OU0VfUkVRVUlSRUQgLyogcmVzcG9uc2UgYWx3YXlzIHJlcXVpcmVkICovCisJCXwgKHVzZV9jaGVja3N1bSA/IEkyNDAwTV9CUkhfVVNFX0NIRUNLU1VNIDogMCkKKwkJfCAob3Bjb2RlICYgSTI0MDBNX0JSSF9PUENPREVfTUFTSykpOworfQorCitzdGF0aWMgaW5saW5lCit2b2lkIGkyNDAwbV9icmhfc2V0X29wY29kZShzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyICpoZHIsCisJCQkgICBlbnVtIGkyNDAwbV9icmhfb3Bjb2RlIG9wY29kZSkKK3sKKwloZHItPmNvbW1hbmQgPSBjcHVfdG9fbGUzMigKKwkJKGxlMzJfdG9fY3B1KGhkci0+Y29tbWFuZCkgJiB+STI0MDBNX0JSSF9PUENPREVfTUFTSykKKwkJfCAob3Bjb2RlICYgSTI0MDBNX0JSSF9PUENPREVfTUFTSykpOworfQorCitzdGF0aWMgaW5saW5lCit1bnNpZ25lZCBpMjQwMG1fYnJoX2dldF9vcGNvZGUoY29uc3Qgc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciAqaGRyKQoreworCXJldHVybiBsZTMyX3RvX2NwdShoZHItPmNvbW1hbmQpICYgSTI0MDBNX0JSSF9PUENPREVfTUFTSzsKK30KKworc3RhdGljIGlubGluZQordW5zaWduZWQgaTI0MDBtX2JyaF9nZXRfcmVzcG9uc2UoY29uc3Qgc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciAqaGRyKQoreworCXJldHVybiAobGUzMl90b19jcHUoaGRyLT5jb21tYW5kKSAmIEkyNDAwTV9CUkhfUkVTUE9OU0VfTUFTSykKKwkJPj4gSTI0MDBNX0JSSF9SRVNQT05TRV9TSElGVDsKK30KKworc3RhdGljIGlubGluZQordW5zaWduZWQgaTI0MDBtX2JyaF9nZXRfdXNlX2NoZWNrc3VtKGNvbnN0IHN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgKmhkcikKK3sKKwlyZXR1cm4gbGUzMl90b19jcHUoaGRyLT5jb21tYW5kKSAmIEkyNDAwTV9CUkhfVVNFX0NIRUNLU1VNOworfQorCitzdGF0aWMgaW5saW5lCit1bnNpZ25lZCBpMjQwMG1fYnJoX2dldF9yZXNwb25zZV9yZXF1aXJlZCgKKwljb25zdCBzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyICpoZHIpCit7CisJcmV0dXJuIGxlMzJfdG9fY3B1KGhkci0+Y29tbWFuZCkgJiBJMjQwME1fQlJIX1JFU1BPTlNFX1JFUVVJUkVEOworfQorCitzdGF0aWMgaW5saW5lCit1bnNpZ25lZCBpMjQwMG1fYnJoX2dldF9kaXJlY3RfYWNjZXNzKGNvbnN0IHN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgKmhkcikKK3sKKwlyZXR1cm4gbGUzMl90b19jcHUoaGRyLT5jb21tYW5kKSAmIEkyNDAwTV9CUkhfRElSRUNUX0FDQ0VTUzsKK30KKworc3RhdGljIGlubGluZQordW5zaWduZWQgaTI0MDBtX2JyaF9nZXRfc2lnbmF0dXJlKGNvbnN0IHN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgKmhkcikKK3sKKwlyZXR1cm4gKGxlMzJfdG9fY3B1KGhkci0+Y29tbWFuZCkgJiBJMjQwME1fQlJIX1NJR05BVFVSRV9NQVNLKQorCQk+PiBJMjQwME1fQlJIX1NJR05BVFVSRV9TSElGVDsKK30KKworCisvKgorICogRHJpdmVyIC8gZGV2aWNlIHNldHVwIGFuZCBpbnRlcm5hbCBmdW5jdGlvbnMKKyAqLworZXh0ZXJuIHZvaWQgaTI0MDBtX25ldGRldl9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CitleHRlcm4gaW50IGkyNDAwbV90eF9zZXR1cChzdHJ1Y3QgaTI0MDBtICopOworZXh0ZXJuIHZvaWQgaTI0MDBtX3dha2VfdHhfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CitleHRlcm4gdm9pZCBpMjQwMG1fdHhfcmVsZWFzZShzdHJ1Y3QgaTI0MDBtICopOworCitleHRlcm4gdm9pZCBpMjQwMG1fbmV0X3J4KHN0cnVjdCBpMjQwMG0gKiwgc3RydWN0IHNrX2J1ZmYgKiwgdW5zaWduZWQsCisJCQkgIGNvbnN0IHZvaWQgKiwgaW50KTsKK2VudW0gaTI0MDBtX3B0OworZXh0ZXJuIGludCBpMjQwMG1fdHgoc3RydWN0IGkyNDAwbSAqLCBjb25zdCB2b2lkICosIHNpemVfdCwgZW51bSBpMjQwMG1fcHQpOworCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCitleHRlcm4gaW50IGkyNDAwbV9kZWJ1Z2ZzX2FkZChzdHJ1Y3QgaTI0MDBtICopOworZXh0ZXJuIHZvaWQgaTI0MDBtX2RlYnVnZnNfcm0oc3RydWN0IGkyNDAwbSAqKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBpMjQwMG1fZGVidWdmc19hZGQoc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSB2b2lkIGkyNDAwbV9kZWJ1Z2ZzX3JtKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSkge30KKyNlbmRpZgorCisvKiBDYWxsZWQgYnkgX2Rldl9zdGFydCgpL19kZXZfc3RvcCgpIHRvIGluaXRpYWxpemUgdGhlIGRldmljZSBpdHNlbGYgKi8KK2V4dGVybiBpbnQgaTI0MDBtX2Rldl9pbml0aWFsaXplKHN0cnVjdCBpMjQwMG0gKik7CitleHRlcm4gdm9pZCBpMjQwMG1fZGV2X3NodXRkb3duKHN0cnVjdCBpMjQwMG0gKik7CisKK2V4dGVybiBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGkyNDAwbV9kZXZfYXR0cl9ncm91cDsKKworZXh0ZXJuIGludCBpMjQwMG1fc2NoZWR1bGVfd29yayhzdHJ1Y3QgaTI0MDBtICosCisJCQkJdm9pZCAoKikoc3RydWN0IHdvcmtfc3RydWN0ICopLCBnZnBfdCk7CisKKy8qIEhESSBtZXNzYWdlJ3MgcGF5bG9hZCBkZXNjcmlwdGlvbiBoYW5kbGluZyAqLworCitzdGF0aWMgaW5saW5lCitzaXplX3QgaTI0MDBtX3BsZF9zaXplKGNvbnN0IHN0cnVjdCBpMjQwMG1fcGxkICpwbGQpCit7CisJcmV0dXJuIEkyNDAwTV9QTERfU0laRV9NQVNLICYgbGUzMl90b19jcHUocGxkLT52YWwpOworfQorCitzdGF0aWMgaW5saW5lCitlbnVtIGkyNDAwbV9wdCBpMjQwMG1fcGxkX3R5cGUoY29uc3Qgc3RydWN0IGkyNDAwbV9wbGQgKnBsZCkKK3sKKwlyZXR1cm4gKEkyNDAwTV9QTERfVFlQRV9NQVNLICYgbGUzMl90b19jcHUocGxkLT52YWwpKQorCQk+PiBJMjQwME1fUExEX1RZUEVfU0hJRlQ7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgaTI0MDBtX3BsZF9zZXQoc3RydWN0IGkyNDAwbV9wbGQgKnBsZCwgc2l6ZV90IHNpemUsCisJCSAgICBlbnVtIGkyNDAwbV9wdCB0eXBlKQoreworCXBsZC0+dmFsID0gY3B1X3RvX2xlMzIoCisJCSgodHlwZSA8PCBJMjQwME1fUExEX1RZUEVfU0hJRlQpICYgSTI0MDBNX1BMRF9UWVBFX01BU0spCisJCXwgIChzaXplICYgSTI0MDBNX1BMRF9TSVpFX01BU0spKTsKK30KKworCisvKgorICogQVBJIGZvciB0aGUgYnVzLXNwZWNpZmljIGRyaXZlcnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworc3RhdGljIGlubGluZQorc3RydWN0IGkyNDAwbSAqaTI0MDBtX2dldChzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJZGV2X2hvbGQoaTI0MDBtLT53aW1heF9kZXYubmV0X2Rldik7CisJcmV0dXJuIGkyNDAwbTsKK30KKworc3RhdGljIGlubGluZQordm9pZCBpMjQwMG1fcHV0KHN0cnVjdCBpMjQwMG0gKmkyNDAwbSkKK3sKKwlkZXZfcHV0KGkyNDAwbS0+d2ltYXhfZGV2Lm5ldF9kZXYpOworfQorCitleHRlcm4gaW50IGkyNDAwbV9kZXZfcmVzZXRfaGFuZGxlKHN0cnVjdCBpMjQwMG0gKik7CisKKy8qCisgKiBfc2V0dXAoKS9fcmVsZWFzZSgpIGFyZSBjYWxsZWQgYnkgdGhlIHByb2JlL2Rpc2Nvbm5lY3QgZnVuY3Rpb25zIG9mCisgKiB0aGUgYnVzLXNwZWNpZmljIGRyaXZlcnMuCisgKi8KK2V4dGVybiBpbnQgaTI0MDBtX3NldHVwKHN0cnVjdCBpMjQwMG0gKiwgZW51bSBpMjQwMG1fYnJpIGJtX2ZsYWdzKTsKK2V4dGVybiB2b2lkIGkyNDAwbV9yZWxlYXNlKHN0cnVjdCBpMjQwMG0gKik7CisKK2V4dGVybiBpbnQgaTI0MDBtX3J4KHN0cnVjdCBpMjQwMG0gKiwgc3RydWN0IHNrX2J1ZmYgKik7CitleHRlcm4gc3RydWN0IGkyNDAwbV9tc2dfaGRyICppMjQwMG1fdHhfbXNnX2dldChzdHJ1Y3QgaTI0MDBtICosIHNpemVfdCAqKTsKK2V4dGVybiB2b2lkIGkyNDAwbV90eF9tc2dfc2VudChzdHJ1Y3QgaTI0MDBtICopOworCitzdGF0aWMgY29uc3QgX19sZTMyIGkyNDAwbV9OQk9PVF9CQVJLRVJbNF0gPSB7CisJX19jb25zdGFudF9jcHVfdG9fbGUzMihJMjQwME1fTkJPT1RfQkFSS0VSKSwKKwlfX2NvbnN0YW50X2NwdV90b19sZTMyKEkyNDAwTV9OQk9PVF9CQVJLRVIpLAorCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoSTI0MDBNX05CT09UX0JBUktFUiksCisJX19jb25zdGFudF9jcHVfdG9fbGUzMihJMjQwME1fTkJPT1RfQkFSS0VSKQorfTsKKworc3RhdGljIGNvbnN0IF9fbGUzMiBpMjQwMG1fU0JPT1RfQkFSS0VSWzRdID0geworCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoSTI0MDBNX1NCT09UX0JBUktFUiksCisJX19jb25zdGFudF9jcHVfdG9fbGUzMihJMjQwME1fU0JPT1RfQkFSS0VSKSwKKwlfX2NvbnN0YW50X2NwdV90b19sZTMyKEkyNDAwTV9TQk9PVF9CQVJLRVIpLAorCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoSTI0MDBNX1NCT09UX0JBUktFUikKK307CisKKworLyoKKyAqIFV0aWxpdHkgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIGlubGluZQorc3RydWN0IGRldmljZSAqaTI0MDBtX2RldihzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJcmV0dXJuIGkyNDAwbS0+d2ltYXhfZGV2Lm5ldF9kZXYtPmRldi5wYXJlbnQ7Cit9CisKKy8qCisgKiBIZWxwZXIgZm9yIHNjaGVkdWxpbmcgc2ltcGxlIHdvcmsgZnVuY3Rpb25zCisgKgorICogVGhpcyBzdHJ1Y3QgY2FuIGdldCBhbnkga2luZCBvZiBwYXlsb2FkIGF0dGFjaGVkIChub3JtYWxseSBpbiB0aGUKKyAqIGZvcm0gb2YgYSBzdHJ1Y3Qgd2hlcmUgeW91IHBhY2sgdGhlIHN0dWZmIHlvdSB3YW50IHRvIHBhc3MgdG8gdGhlCisgKiBfd29yayBmdW5jdGlvbikuCisgKi8KK3N0cnVjdCBpMjQwMG1fd29yayB7CisJc3RydWN0IHdvcmtfc3RydWN0IHdzOworCXN0cnVjdCBpMjQwMG0gKmkyNDAwbTsKKwl1OCBwbFswXTsKK307CitleHRlcm4gaW50IGkyNDAwbV9xdWV1ZV93b3JrKHN0cnVjdCBpMjQwMG0gKiwKKwkJCSAgICAgdm9pZCAoKikoc3RydWN0IHdvcmtfc3RydWN0ICopLCBnZnBfdCwKKwkJCQljb25zdCB2b2lkICosIHNpemVfdCk7CisKK2V4dGVybiBpbnQgaTI0MDBtX21zZ19jaGVja19zdGF0dXMoY29uc3Qgc3RydWN0IGkyNDAwbV9sM2w0X2hkciAqLAorCQkJCSAgIGNoYXIgKiwgc2l6ZV90KTsKK2V4dGVybiBpbnQgaTI0MDBtX21zZ19zaXplX2NoZWNrKHN0cnVjdCBpMjQwMG0gKiwKKwkJCQkgY29uc3Qgc3RydWN0IGkyNDAwbV9sM2w0X2hkciAqLCBzaXplX3QpOworZXh0ZXJuIHN0cnVjdCBza19idWZmICppMjQwMG1fbXNnX3RvX2RldihzdHJ1Y3QgaTI0MDBtICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKK2V4dGVybiB2b2lkIGkyNDAwbV9tc2dfdG9fZGV2X2NhbmNlbF93YWl0KHN0cnVjdCBpMjQwMG0gKiwgaW50KTsKK2V4dGVybiB2b2lkIGkyNDAwbV9tc2dfYWNrX2hvb2soc3RydWN0IGkyNDAwbSAqLAorCQkJCWNvbnN0IHN0cnVjdCBpMjQwMG1fbDNsNF9oZHIgKiwgc2l6ZV90KTsKK2V4dGVybiB2b2lkIGkyNDAwbV9yZXBvcnRfaG9vayhzdHJ1Y3QgaTI0MDBtICosCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGkyNDAwbV9sM2w0X2hkciAqLCBzaXplX3QpOworZXh0ZXJuIGludCBpMjQwMG1fY21kX2VudGVyX3Bvd2Vyc2F2ZShzdHJ1Y3QgaTI0MDBtICopOworZXh0ZXJuIGludCBpMjQwMG1fY21kX2dldF9zdGF0ZShzdHJ1Y3QgaTI0MDBtICopOworZXh0ZXJuIGludCBpMjQwMG1fY21kX2V4aXRfaWRsZShzdHJ1Y3QgaTI0MDBtICopOworZXh0ZXJuIHN0cnVjdCBza19idWZmICppMjQwMG1fZ2V0X2RldmljZV9pbmZvKHN0cnVjdCBpMjQwMG0gKik7CitleHRlcm4gaW50IGkyNDAwbV9maXJtd2FyZV9jaGVjayhzdHJ1Y3QgaTI0MDBtICopOworZXh0ZXJuIGludCBpMjQwMG1fc2V0X2luaXRfY29uZmlnKHN0cnVjdCBpMjQwMG0gKiwKKwkJCQkgIGNvbnN0IHN0cnVjdCBpMjQwMG1fdGx2X2hkciAqKiwgc2l6ZV90KTsKKworc3RhdGljIGlubGluZQorc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICp1c2JfZ2V0X2VwZChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2UsIGludCBlcCkKK3sKKwlyZXR1cm4gJmlmYWNlLT5jdXJfYWx0c2V0dGluZy0+ZW5kcG9pbnRbZXBdLmRlc2M7Cit9CisKK2V4dGVybiBpbnQgaTI0MDBtX29wX3Jma2lsbF9zd190b2dnbGUoc3RydWN0IHdpbWF4X2RldiAqLAorCQkJCSAgICAgIGVudW0gd2ltYXhfcmZfc3RhdGUpOworZXh0ZXJuIHZvaWQgaTI0MDBtX3JlcG9ydF90bHZfcmZfc3dpdGNoZXNfc3RhdHVzKAorCXN0cnVjdCBpMjQwMG0gKiwgY29uc3Qgc3RydWN0IGkyNDAwbV90bHZfcmZfc3dpdGNoZXNfc3RhdHVzICopOworCisKKy8qCisgKiBEbyBhIG1pbGxpc2Vjb25kLXNsZWVwIGZvciBhbGxvd2luZyB3aXJlc2hhcmsgdG8gZHVtcCBhbGwgdGhlIGRhdGEKKyAqIHBhY2tldHMuIFVzZWQgb25seSBmb3IgZGVidWdnaW5nLgorICovCitzdGF0aWMgaW5saW5lCit2b2lkIF9faTI0MDBtX21zbGVlcCh1bnNpZ25lZCBtcykKK3sKKyNpZiAxCisjZWxzZQorCW1zbGVlcChtcyk7CisjZW5kaWYKK30KKworLyogTW9kdWxlIHBhcmFtZXRlcnMgKi8KKworZXh0ZXJuIGludCBpMjQwMG1faWRsZV9tb2RlX2Rpc2FibGVkOworCisKKyNlbmRpZiAvKiAjaWZuZGVmIF9fSTI0MDBNX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL25ldGRldi5jIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL25ldGRldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZmU3MDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vbmV0ZGV2LmMKQEAgLTAsMCArMSw1MjQgQEAKKy8qCisgKiBJbnRlbCBXaXJlbGVzcyBXaU1BWCBDb25uZWN0aW9uIDI0MDBtCisgKiBHbHVlIHdpdGggdGhlIG5ldHdvcmtpbmcgc3RhY2sKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEludGVsIENvcnBvcmF0aW9uIDxsaW51eC13aW1heEBpbnRlbC5jb20+CisgKiBZYW5pciBMdWJldGtpbiA8eWFuaXJ4Lmx1YmV0a2luQGludGVsLmNvbT4KKyAqIEluYWt5IFBlcmV6LUdvbnphbGV6IDxpbmFreS5wZXJlei1nb256YWxlekBpbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqCisgKiBUaGlzIGltcGxlbWVudHMgYW4gZXRoZXJuZXQgZGV2aWNlIGZvciB0aGUgaTI0MDBtLgorICoKKyAqIFdlIGZha2UgYmVpbmcgYW4gZXRoZXJuZXQgZGV2aWNlIHRvIHNpbXBsaWZ5IHRoZSBzdXBwb3J0IGZyb20gdXNlcgorICogc3BhY2UgYW5kIGZyb20gdGhlIG90aGVyIHNpZGUuIFRoZSB3b3JsZCBpcyAoc2FkbHkpIGNvbmZpZ3VyZWQgdG8KKyAqIHRha2UgaW4gb25seSBFdGhlcm5ldCBkZXZpY2VzLi4uCisgKgorICogQmVjYXVzZSBvZiB0aGlzLCBjdXJyZW50bHkgdGhlcmUgaXMgYW4gY29weS1lYWNoLXJ4ZWQtcGFja2V0CisgKiBvdmVyaGVhZCBvbiB0aGUgUlggcGF0aC4gRWFjaCBJUCBwYWNrZXQgaGFzIHRvIGJlIHJlYWxsb2NhdGVkIHRvCisgKiBhZGQgYW4gZXRoZXJuZXQgaGVhZGVyIChhcyB0aGVyZSBpcyBubyBzcGFjZSBpbiB3aGF0IHdlIGdldCBmcm9tCisgKiB0aGUgZGV2aWNlKS4gVGhpcyBpcyBhIGtub3duIGRyYXdiYWNrIGFuZCBjb21pbmcgdmVyc2lvbnMgb2YgdGhlCisgKiBkZXZpY2UncyBmaXJtd2FyZSBhcmUgYmVpbmcgY2hhbmdlZCB0byBhZGQgaGVhZGVyIHNwYWNlIHRoYXQgY2FuIGJlCisgKiB1c2VkIHRvIGluc2VydCB0aGUgZXRoZXJuZXQgaGVhZGVyIHdpdGhvdXQgaGF2aW5nIHRvIHJlYWxsb2NhdGUgYW5kCisgKiBjb3B5LgorICoKKyAqIFRYIGVycm9yIGhhbmRsaW5nIGlzIHRyaWNreTsgYmVjYXVzZSB3ZSBoYXZlIHRvIEZJRk8vcXVldWUgdGhlCisgKiBidWZmZXJzIGZvciB0cmFuc21pc3Npb24gKGFzIHRoZSBoYXJkd2FyZSBsaWtlcyBpdCBhZ2dyZWdhdGVkKSwgd2UKKyAqIGp1c3QgZ2l2ZSB0aGUgc2tiIHRvIHRoZSBUWCBzdWJzeXN0ZW0gYW5kIGJ5IHRoZSB0aW1lIGl0IGlzCisgKiB0cmFuc21pdHRlZCwgd2UgaGF2ZSBsb25nIGZvcmdvdHRlbiBhYm91dCBpdC4gU28gd2UganVzdCBkb24ndCBjYXJlCisgKiB0b28gbXVjaCBhYm91dCBpdC4KKyAqCisgKiBOb3RlIHRoYXQgd2hlbiB0aGUgZGV2aWNlIGlzIGluIGlkbGUgbW9kZSB3aXRoIHRoZSBiYXNlc3RhdGlvbiwgd2UKKyAqIG5lZWQgdG8gbmVnb3RpYXRlIGNvbWluZyBiYWNrIHVwIG9ubGluZS4gVGhhdCBpbnZvbHZlcyBuZWdvdGlhdGlvbgorICogYW5kIHBvc3NpYmxlIHVzZXIgc3BhY2UgaW50ZXJhY3Rpb24uIFRodXMsIHdlIGRlZmVyIHRvIGEgd29ya3F1ZXVlCisgKiB0byBkbyBhbGwgdGhhdC4gQnkgZGVmYXVsdCwgd2Ugb25seSBxdWV1ZSBhIHNpbmdsZSBwYWNrZXQgYW5kIGRyb3AKKyAqIHRoZSByZXN0LCBhcyBwb3RlbnRpYWxseSB0aGUgdGltZSB0byBnbyBiYWNrIGZyb20gaWRsZSB0byBub3JtYWwgaXMKKyAqIGxvbmcuCisgKgorICogUk9BRE1BUAorICoKKyAqIGkyNDAwbV9vcGVuICAgICAgICAgQ2FsbGVkIG9uIGlmY29uZmlnIHVwCisgKiBpMjQwMG1fc3RvcCAgICAgICAgIENhbGxlZCBvbiBpZmNvbmZpZyBkb3duCisgKgorICogaTI0MDBtX2hhcmRfc3RhcnRfeG1pdCBDYWxsZWQgYnkgdGhlIG5ldHdvcmsgc3RhY2sgdG8gc2VuZCBhIHBhY2tldAorICogICBpMjQwMG1fbmV0X3dha2VfdHgJICBXYWtlIHVwIGRldmljZSBmcm9tIGJhc2VzdGF0aW9uLUlETEUgJiBUWAorICogICAgIGkyNDAwbV93YWtlX3R4X3dvcmsKKyAqICAgICAgIGkyNDAwbV9jbWRfZXhpdF9pZGxlCisgKiAgICAgICBpMjQwMG1fdHgKKyAqICAgaTI0MDBtX25ldF90eCAgICAgICAgVFggYSBkYXRhIGZyYW1lCisgKiAgICAgaTI0MDBtX3R4CisgKgorICogaTI0MDBtX2NoYW5nZV9tdHUgICAgICBDYWxsZWQgb24gaWZjb25maWcgbXR1IFhYWAorICoKKyAqIGkyNDAwbV90eF90aW1lb3V0ICAgICAgQ2FsbGVkIHdoZW4gdGhlIGRldmljZSB0aW1lcyBvdXQKKyAqCisgKiBpMjQwMG1fbmV0X3J4ICAgICAgICAgIENhbGxlZCBieSB0aGUgUlggY29kZSB3aGVuIGEgZGF0YSBmcmFtZSBpcworICogICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUuCisgKiBpMjQwMG1fbmV0ZGV2X3NldHVwICAgIENhbGxlZCB0byBzZXR1cCBhbGwgdGhlIG5ldGRldiBzdHVmZiBmcm9tCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jX25ldGRldi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgImkyNDAwbS5oIgorCisKKyNkZWZpbmUgRF9TVUJNT0RVTEUgbmV0ZGV2CisjaW5jbHVkZSAiZGVidWctbGV2ZWxzLmgiCisKK2VudW0geworLyogbmV0ZGV2IGludGVyZmFjZSAqLworCS8qCisJICogT3V0IG9mIE5XRyBzcGVjIChSMV92MS4yLjIpLCAzLjMuMyBBU04gQmVhcmVyIFBsYW5lIE1UVSBTaXplCisJICoKKwkgKiBUaGUgTVRVIGlzIDE0MDAgb3IgbGVzcworCSAqLworCUkyNDAwTV9NQVhfTVRVID0gMTQwMCwKKwlJMjQwME1fVFhfVElNRU9VVCA9IEhaLAorCUkyNDAwTV9UWF9RTEVOID0gNSwKK307CisKKworc3RhdGljCitpbnQgaTI0MDBtX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0gPSBuZXRfZGV2X3RvX2kyNDAwbShuZXRfZGV2KTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKG5ldF9kZXYgJXAgW2kyNDAwbSAlcF0pXG4iLCBuZXRfZGV2LCBpMjQwMG0pOworCWlmIChpMjQwMG0tPnJlYWR5ID09IDApIHsKKwkJZGV2X2VycihkZXYsICJEZXZpY2UgaXMgc3RpbGwgaW5pdGlhbGl6aW5nXG4iKTsKKwkJcmVzdWx0ID0gLUVCVVNZOworCX0gZWxzZQorCQlyZXN1bHQgPSAwOworCWRfZm5lbmQoMywgZGV2LCAiKG5ldF9kZXYgJXAgW2kyNDAwbSAlcF0pID0gJWRcbiIsCisJCW5ldF9kZXYsIGkyNDAwbSwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKgorICogT24ga2VybmVsIHZlcnNpb25zIHdoZXJlIGNhbmNlbF93b3JrX3N5bmMoKSBkaWRuJ3QgcmV0dXJuIGFueXRoaW5nLAorICogd2UgcmVseSBvbiB3YWtlX3R4X3NrYigpIGJlaW5nIG5vbi1OVUxMLgorICovCitzdGF0aWMKK2ludCBpMjQwMG1fc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0gPSBuZXRfZGV2X3RvX2kyNDAwbShuZXRfZGV2KTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKG5ldF9kZXYgJXAgW2kyNDAwbSAlcF0pXG4iLCBuZXRfZGV2LCBpMjQwMG0pOworCS8qIFNlZSBpMjQwMG1faGFyZF9zdGFydF94bWl0KCksIHJlZmVyZW5jZXMgYXJlIHRha2VuIHRoZXJlCisJICogYW5kIGhlcmUgd2UgcmVsZWFzZSB0aGVtIGlmIHRoZSB3b3JrIHdhcyBzdGlsbAorCSAqIHBlbmRpbmcuIE5vdGUgd2UgY2FuJ3QgZGlmZmVyZW50aWF0ZSB3b3JrIG5vdCBwZW5kaW5nIHZzCisJICogbmV2ZXIgc2NoZWR1bGVkLCBzbyB0aGUgTlVMTCBjaGVjayBkb2VzIHRoYXQuICovCisJaWYgKGNhbmNlbF93b3JrX3N5bmMoJmkyNDAwbS0+d2FrZV90eF93cykgPT0gMAorCSAgICAmJiBpMjQwMG0tPndha2VfdHhfc2tiICE9IE5VTEwpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJc3RydWN0IHNrX2J1ZmYgKndha2VfdHhfc2tiOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaTI0MDBtLT50eF9sb2NrLCBmbGFncyk7CisJCXdha2VfdHhfc2tiID0gaTI0MDBtLT53YWtlX3R4X3NrYjsJLyogY29tcGF0IGhlbHAgKi8KKwkJaTI0MDBtLT53YWtlX3R4X3NrYiA9IE5VTEw7CS8qIGNvbXBhdCBoZWxwICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmkyNDAwbS0+dHhfbG9jaywgZmxhZ3MpOworCQlpMjQwMG1fcHV0KGkyNDAwbSk7CisJCWtmcmVlX3NrYih3YWtlX3R4X3NrYik7CisJfQorCWRfZm5lbmQoMywgZGV2LCAiKG5ldF9kZXYgJXAgW2kyNDAwbSAlcF0pID0gMFxuIiwgbmV0X2RldiwgaTI0MDBtKTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogV2FrZSB1cCB0aGUgZGV2aWNlIGFuZCB0cmFuc21pdCBhIGhlbGQgU0tCLCB0aGVuIHJlc3RhcnQgdGhlIG5ldCBxdWV1ZQorICoKKyAqIFdoZW4gdGhlIGRldmljZSBnb2VzIGludG8gYmFzZXN0YXRpb24taWRsZSBtb2RlLCB3ZSBuZWVkIHRvIHRlbGwgaXQKKyAqIHRvIGV4aXQgdGhhdCBtb2RlOyBpdCB3aWxsIG5lZ290aWF0ZSB3aXRoIHRoZSBiYXNlIHN0YXRpb24sIHVzZXIKKyAqIHNwYWNlIG1heSBoYXZlIHRvIGludGVydmVuZSB0byByZWhhbmRzaGFrZSBjcnlwdG8gYW5kIHRoZW4gdGVsbCB1cworICogd2hlbiBpdCBpcyByZWFkeSB0byB0cmFuc21pdCB0aGUgcGFja2V0IHdlIGhhdmUgInF1ZXVlZCIuIFN0aWxsIHdlCisgKiBuZWVkIHRvIGdpdmUgaXQgc29tZXRpbWUgYWZ0ZXIgaXQgcmVwb3J0cyBiZWluZyBvay4KKyAqCisgKiBPbiBlcnJvciwgdGhlcmUgaXMgbm90IG11Y2ggd2UgY2FuIGRvLiBJZiB0aGUgZXJyb3Igd2FzIG9uIFRYLCB3ZQorICogc3RpbGwgd2FrZSB0aGUgcXVldWUgdXAgdG8gc2VlIGlmIHRoZSBuZXh0IHBhY2tldCB3aWxsIGJlIGx1Y2tpZXIuCisgKgorICogSWYgX2NtZF9leGl0X2lkbGUoKSBmYWlscy4uLndlbGwsIGl0IGNvdWxkIGJlIG1hbnkgdGhpbmdzOyBtb3N0CisgKiBjb21tb25seSBpdCBpcyB0aGF0IHNvbWV0aGluZyBlbHNlIHRvb2sgdGhlIGRldmljZSBvdXQgb2YgSURMRSBtb2RlCisgKiAoZm9yIGV4YW1wbGUsIHRoZSBiYXNlIHN0YXRpb24pLiBJbiB0aGF0IGNhc2Ugd2UgZ2V0IGFuIC1FSUxTRVEgYW5kCisgKiB3ZSBhcmUganVzdCBnb2luZyB0byBpZ25vcmUgdGhhdCBvbmUuIElmIHRoZSBkZXZpY2UgaXMgYmFjayB0bworICogY29ubmVjdGVkLCB0aGVuIGZpbmUgLS0gaWYgaXQgaXMgc29tZW90aGVyIHN0YXRlLCB0aGUgcGFja2V0IHdpbGwKKyAqIGJlIGRyb3BwZWQgYW55d2F5LgorICovCit2b2lkIGkyNDAwbV93YWtlX3R4X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3cykKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBpMjQwMG0gKmkyNDAwbSA9IGNvbnRhaW5lcl9vZih3cywgc3RydWN0IGkyNDAwbSwgd2FrZV90eF93cyk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXN0cnVjdCBza19idWZmICpza2IgPSBpMjQwMG0tPndha2VfdHhfc2tiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTI0MDBtLT50eF9sb2NrLCBmbGFncyk7CisJc2tiID0gaTI0MDBtLT53YWtlX3R4X3NrYjsKKwlpMjQwMG0tPndha2VfdHhfc2tiID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpMjQwMG0tPnR4X2xvY2ssIGZsYWdzKTsKKworCWRfZm5zdGFydCgzLCBkZXYsICIod3MgJXAgaTI0MDBtICVwIHNrYiAlcClcbiIsIHdzLCBpMjQwMG0sIHNrYik7CisJcmVzdWx0ID0gLUVJTlZBTDsKKwlpZiAoc2tiID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJXQUtFJlRYOiBza2IgZGlzc2FwZWFyZWQhXG4iKTsKKwkJZ290byBvdXRfcHV0OworCX0KKwlyZXN1bHQgPSBpMjQwMG1fY21kX2V4aXRfaWRsZShpMjQwMG0pOworCWlmIChyZXN1bHQgPT0gLUVJTFNFUSkKKwkJcmVzdWx0ID0gMDsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIldBS0UmVFg6IGRldmljZSBkaWRuJ3QgZ2V0IG91dCBvZiBpZGxlOiAiCisJCQkiJWRcbiIsIHJlc3VsdCk7CisJCQlnb3RvIGVycm9yOworCX0KKwlyZXN1bHQgPSB3YWl0X2V2ZW50X3RpbWVvdXQoaTI0MDBtLT5zdGF0ZV93cSwKKwkJCQkgICAgaTI0MDBtLT5zdGF0ZSAhPSBJMjQwME1fU1NfSURMRSwgNSAqIEhaKTsKKwlpZiAocmVzdWx0ID09IDApCisJCXJlc3VsdCA9IC1FVElNRURPVVQ7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJXQUtFJlRYOiBlcnJvciB3YWl0aW5nIGZvciBkZXZpY2UgdG8gZXhpdCBJRExFOiAiCisJCQkiJWRcbiIsIHJlc3VsdCk7CisJCWdvdG8gZXJyb3I7CisJfQorCW1zbGVlcCgyMCk7CS8qIGRldmljZSBzdGlsbCBuZWVkcyBzb21lIHRpbWUgb3IgaXQgZHJvcHMgaXQgKi8KKwlyZXN1bHQgPSBpMjQwMG1fdHgoaTI0MDBtLCBza2ItPmRhdGEsIHNrYi0+bGVuLCBJMjQwME1fUFRfREFUQSk7CisJbmV0aWZfd2FrZV9xdWV1ZShpMjQwMG0tPndpbWF4X2Rldi5uZXRfZGV2KTsKK2Vycm9yOgorCWtmcmVlX3NrYihza2IpOwkvKiByZWZjb3VudCB0cmFuc2ZlcnJlZCBieSBfaGFyZF9zdGFydF94bWl0KCkgKi8KK291dF9wdXQ6CisJaTI0MDBtX3B1dChpMjQwMG0pOworCWRfZm5lbmQoMywgZGV2LCAiKHdzICVwIGkyNDAwbSAlcCBza2IgJXApID0gdm9pZCBbJWRdXG4iLAorCQl3cywgaTI0MDBtLCBza2IsIHJlc3VsdCk7Cit9CisKKworLyoKKyAqIFByZXBhcmUgdGhlIGRhdGEgcGF5bG9hZCBUWCBoZWFkZXIKKyAqCisgKiBUaGUgaTI0MDBtIGV4cGVjdHMgYSA0IGJ5dGUgaGVhZGVyIGluIGZyb250IG9mIGEgZGF0YSBwYWNrZXQuCisgKgorICogQmVjYXVzZSB3ZSBwcmV0ZW5kIHRvIGJlIGFuIGV0aGVybmV0IGRldmljZSwgdGhpcyBwYWNrZXQgY29tZXMgd2l0aAorICogYW4gZXRoZXJuZXQgaGVhZGVyLiBQdWxsIGl0IGFuZCBwdXNoIG91ciBoZWFkZXIuCisgKi8KK3N0YXRpYwordm9pZCBpMjQwMG1fdHhfcHJlcF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaTI0MDBtX3BsX2RhdGFfaGRyICpwbF9oZHI7CisJc2tiX3B1bGwoc2tiLCBFVEhfSExFTik7CisJcGxfaGRyID0gKHN0cnVjdCBpMjQwMG1fcGxfZGF0YV9oZHIgKikgc2tiX3B1c2goc2tiLCBzaXplb2YoKnBsX2hkcikpOworCXBsX2hkci0+cmVzZXJ2ZWQgPSAwOworfQorCisKKy8qCisgKiBUWCBhbiBza2IgdG8gYW4gaWRsZSBkZXZpY2UKKyAqCisgKiBXaGVuIHRoZSBkZXZpY2UgaXMgaW4gYmFzZXN0YXRpb24taWRsZSBtb2RlLCB3ZSBuZWVkIHRvIHdha2UgaXQgdXAKKyAqIGFuZCB0aGVuIFRYLiBTbyB3ZSBxdWV1ZSBhIHdvcmtfc3RydWN0IGZvciBkb2luZyBzby4KKyAqCisgKiBXZSBuZWVkIHRvIGdldCBhbiBleHRyYSByZWYgZm9yIHRoZSBza2IgKHNvIGl0IGlzIG5vdCBkcm9wcGVkKSwgYXMKKyAqIHdlbGwgYXMgYmUgY2FyZWZ1bCBub3QgdG8gcXVldWUgbW9yZSB0aGFuIG9uZSByZXF1ZXN0ICh3b24ndCBoZWxwCisgKiBhdCBhbGwpLiBJZiBtb3JlIHRoYW4gb25lIHJlcXVlc3QgY29tZXMgb3IgdGhlcmUgYXJlIGVycm9ycywgd2UKKyAqIGp1c3QgZHJvcCB0aGUgcGFja2V0cyAoc2VlIGkyNDAwbV9oYXJkX3N0YXJ0X3htaXQoKSkuCisgKi8KK3N0YXRpYworaW50IGkyNDAwbV9uZXRfd2FrZV90eChzdHJ1Y3QgaTI0MDBtICppMjQwMG0sIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LAorCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZF9mbnN0YXJ0KDMsIGRldiwgIihza2IgJXAgbmV0X2RldiAlcClcbiIsIHNrYiwgbmV0X2Rldik7CisJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQlkX3ByaW50ZigzLCBkZXYsICJXQUtFJk5FVFRYOiAiCisJCQkgInNrYiAlcCBzZW5kaW5nICVkIGJ5dGVzIHRvIHJhZGlvXG4iLAorCQkJIHNrYiwgc2tiLT5sZW4pOworCQlkX2R1bXAoNCwgZGV2LCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwl9CisJLyogV2UgaG9sZCBhIHJlZiBjb3VudCBmb3IgaTI0MDBtIGFuZCBza2IsIHNvIHdoZW4KKwkgKiBzdG9wcGluZygpIHRoZSBkZXZpY2UsIHdlIG5lZWQgdG8gY2FuY2VsIHRoYXQgd29yaworCSAqIGFuZCBpZiBwZW5kaW5nLCByZWxlYXNlIHRob3NlIHJlc291cmNlcy4gKi8KKwlyZXN1bHQgPSAwOworCXNwaW5fbG9ja19pcnFzYXZlKCZpMjQwMG0tPnR4X2xvY2ssIGZsYWdzKTsKKwlpZiAoIXdvcmtfcGVuZGluZygmaTI0MDBtLT53YWtlX3R4X3dzKSkgeworCQluZXRpZl9zdG9wX3F1ZXVlKG5ldF9kZXYpOworCQlpMjQwMG1fZ2V0KGkyNDAwbSk7CisJCWkyNDAwbS0+d2FrZV90eF9za2IgPSBza2JfZ2V0KHNrYik7CS8qIHRyYW5zZmVyIHJlZiBjb3VudCAqLworCQlpMjQwMG1fdHhfcHJlcF9oZWFkZXIoc2tiKTsKKwkJcmVzdWx0ID0gc2NoZWR1bGVfd29yaygmaTI0MDBtLT53YWtlX3R4X3dzKTsKKwkJV0FSTl9PTihyZXN1bHQgPT0gMCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmkyNDAwbS0+dHhfbG9jaywgZmxhZ3MpOworCWlmIChyZXN1bHQgPT0gMCkgeworCQkvKiBZZXMsIHRoaXMgaGFwcGVucyBldmVuIGlmIHdlIHN0b3BwZWQgdGhlCisJCSAqIHF1ZXVlIC0tIGJsYW1lIHRoZSBxdWV1ZSBkaXNjaXBsaW5lcyB0aGF0CisJCSAqIHF1ZXVlIHdpdGhvdXQgbG9va2luZyAtLSBJIGd1ZXNzIHRoZXJlIGlzIGEgcmVhc29uCisJCSAqIGZvciB0aGF0LiAqLworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJZF9wcmludGYoMSwgZGV2LCAiTkVUVFg6IGRldmljZSBleGl0aW5nIGlkbGUsICIKKwkJCQkgImRyb3BwaW5nIHNrYiAlcCwgcXVldWUgcnVubmluZyAlZFxuIiwKKwkJCQkgc2tiLCBuZXRpZl9xdWV1ZV9zdG9wcGVkKG5ldF9kZXYpKTsKKwkJcmVzdWx0ID0gLUVCVVNZOworCX0KKwlkX2ZuZW5kKDMsIGRldiwgIihza2IgJXAgbmV0X2RldiAlcCkgPSAlZFxuIiwgc2tiLCBuZXRfZGV2LCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKworLyoKKyAqIFRyYW5zbWl0IGEgcGFja2V0IHRvIHRoZSBiYXNlIHN0YXRpb24gb24gYmVoYWxmIG9mIHRoZSBuZXR3b3JrIHN0YWNrLgorICoKKyAqIFJldHVybnM6IDAgaWYgb2ssIDwgMCBlcnJubyBjb2RlIG9uIGVycm9yLgorICoKKyAqIFdlIG5lZWQgdG8gcHVsbCB0aGUgZXRoZXJuZXQgaGVhZGVyIGFuZCBhZGQgdGhlIGhhcmR3YXJlIGhlYWRlciwKKyAqIHdoaWNoIGlzIGN1cnJlbnRseSBzZXQgdG8gYWxsIHplcm9lcyBhbmQgcmVzZXJ2ZWQuCisgKi8KK3N0YXRpYworaW50IGkyNDAwbV9uZXRfdHgoc3RydWN0IGkyNDAwbSAqaTI0MDBtLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwKKwkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCisJZF9mbnN0YXJ0KDMsIGRldiwgIihpMjQwMG0gJXAgbmV0X2RldiAlcCBza2IgJXApXG4iLAorCQkgIGkyNDAwbSwgbmV0X2Rldiwgc2tiKTsKKwkvKiBGSVhNRTogY2hlY2sgZXRoIGhkciwgb25seSBJUHY0IGlzIHJvdXRlZCBieSB0aGUgZGV2aWNlIGFzIG9mIG5vdyAqLworCW5ldF9kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlpMjQwMG1fdHhfcHJlcF9oZWFkZXIoc2tiKTsKKwlkX3ByaW50ZigzLCBkZXYsICJORVRUWDogc2tiICVwIHNlbmRpbmcgJWQgYnl0ZXMgdG8gcmFkaW9cbiIsCisJCSBza2IsIHNrYi0+bGVuKTsKKwlkX2R1bXAoNCwgZGV2LCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwlyZXN1bHQgPSBpMjQwMG1fdHgoaTI0MDBtLCBza2ItPmRhdGEsIHNrYi0+bGVuLCBJMjQwME1fUFRfREFUQSk7CisJZF9mbmVuZCgzLCBkZXYsICIoaTI0MDBtICVwIG5ldF9kZXYgJXAgc2tiICVwKSA9ICVkXG4iLAorCQlpMjQwMG0sIG5ldF9kZXYsIHNrYiwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKiBUcmFuc21pdCBhIHBhY2tldCB0byB0aGUgYmFzZSBzdGF0aW9uIG9uIGJlaGFsZiBvZiB0aGUgbmV0d29yayBzdGFjaworICoKKyAqCisgKiBSZXR1cm5zOiBORVRERVZfVFhfT0sgKGFsd2F5cywgZXZlbiBpbiBjYXNlIG9mIGVycm9yKQorICoKKyAqIEluIGNhc2Ugb2YgZXJyb3IsIHdlIGp1c3QgZHJvcCBpdC4gUmVhc29uczoKKyAqCisgKiAgLSB3ZSBhZGQgYSBodyBoZWFkZXIgdG8gZWFjaCBza2IsIGFuZCBpZiB0aGUgbmV0d29yayBzdGFjaworICogICAgcmV0cmllcywgd2UgaGF2ZSBubyB3YXkgdG8ga25vdyBpZiB0aGF0IHNrYiBoYXMgaXQgb3Igbm90LgorICoKKyAqICAtIG5ldHdvcmsgcHJvdG9jb2xzIGhhdmUgdGhlaXIgb3duIGRyb3AtcmVjb3ZlcnkgbWVjaGFuaXNtcworICoKKyAqICAtIHRoZXJlIGlzIG5vdCBtdWNoIGVsc2Ugd2UgY2FuIGRvCisgKgorICogSWYgdGhlIGRldmljZSBpcyBpZGxlLCB3ZSBuZWVkIHRvIHdha2UgaXQgdXA7IHRoYXQgaXMgYW4gb3BlcmF0aW9uCisgKiB0aGF0IHdpbGwgc2xlZXAuIFNlZSBpMjQwMG1fbmV0X3dha2VfdHgoKSBmb3IgZGV0YWlscy4KKyAqLworc3RhdGljCitpbnQgaTI0MDBtX2hhcmRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0gPSBuZXRfZGV2X3RvX2kyNDAwbShuZXRfZGV2KTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKHNrYiAlcCBuZXRfZGV2ICVwKVxuIiwgc2tiLCBuZXRfZGV2KTsKKwlpZiAoaTI0MDBtLT5zdGF0ZSA9PSBJMjQwME1fU1NfSURMRSkKKwkJcmVzdWx0ID0gaTI0MDBtX25ldF93YWtlX3R4KGkyNDAwbSwgbmV0X2Rldiwgc2tiKTsKKwllbHNlCisJCXJlc3VsdCA9IGkyNDAwbV9uZXRfdHgoaTI0MDBtLCBuZXRfZGV2LCBza2IpOworCWlmIChyZXN1bHQgPCAgMCkKKwkJbmV0X2Rldi0+c3RhdHMudHhfZHJvcHBlZCsrOworCWVsc2UgeworCQluZXRfZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJCW5ldF9kZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCX0KKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXN1bHQgPSBORVRERVZfVFhfT0s7CisJZF9mbmVuZCgzLCBkZXYsICIoc2tiICVwIG5ldF9kZXYgJXApID0gJWRcbiIsIHNrYiwgbmV0X2RldiwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYworaW50IGkyNDAwbV9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LCBpbnQgbmV3X210dSkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBpMjQwMG0gKmkyNDAwbSA9IG5ldF9kZXZfdG9faTI0MDBtKG5ldF9kZXYpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKworCWlmIChuZXdfbXR1ID49IEkyNDAwTV9NQVhfTVRVKSB7CisJCWRldl9lcnIoZGV2LCAiQ2Fubm90IGNoYW5nZSBNVFUgdG8gJWQgKG1heCBpcyAlZClcbiIsCisJCQluZXdfbXR1LCBJMjQwME1fTUFYX01UVSk7CisJCXJlc3VsdCA9IC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJbmV0X2Rldi0+bXR1ID0gbmV3X210dTsKKwkJcmVzdWx0ID0gMDsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMKK3ZvaWQgaTI0MDBtX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisJLyoKKwkgKiBXZSBtaWdodCB3YW50IHRvIGtpY2sgdGhlIGRldmljZQorCSAqCisJICogVGhlcmUgaXMgbm90IG11Y2ggd2UgY2FuIGRvIHRob3VnaCwgYXMgdGhlIGRldmljZSByZXF1aXJlcworCSAqIHRoYXQgd2Ugc2VuZCB0aGUgZGF0YSBhZ2dyZWdhdGVkLiBCeSB0aGUgdGltZSB3ZSByZWNlaXZlCisJICogdGhpcywgdGhlcmUgbWlnaHQgYmUgZGF0YSBwZW5kaW5nIHRvIGJlIHNlbnQgb3Igbm90Li4uCisJICovCisJbmV0X2Rldi0+c3RhdHMudHhfZXJyb3JzKys7CisJcmV0dXJuOworfQorCisKKy8qCisgKiBDcmVhdGUgYSBmYWtlIGV0aGVybmV0IGhlYWRlcgorICoKKyAqIEZvciBlbXVsYXRpbmcgYW4gZXRoZXJuZXQgZGV2aWNlLCBldmVyeSByZWNlaXZlZCBJUCBoZWFkZXIgaGFzIHRvCisgKiBiZSBwcmVmaXhlZCB3aXRoIGFuIGV0aGVybmV0IGhlYWRlci4KKyAqCisgKiBXaGF0IHdlIHJlY2VpdmUgaGFzIChwb3RlbnRpYWxseSkgbWFueSBJUCBwYWNrZXRzIGNvbmNhdGVuYXRlZCB3aXRoCisgKiBubyBFVEhfSExFTiBieXRlcyBwcmVmaXhlZC4gVGh1cyB0aGVyZSBpcyBubyBzcGFjZSBmb3IgYW4gZXRoCisgKiBoZWFkZXIuCisgKgorICogV2Ugd291bGQgaGF2ZSB0byByZWFsbG9jYXRlIG9yIGRvIHVnbHkgZnJhZ21lbnQgdHJpY2tzIGluIG9yZGVyIHRvCisgKiBhZGQgaXQuCisgKgorICogQnV0IHdoYXQgd2UgZG8gaXMgdXNlIHRoZSBoZWFkZXIgc3BhY2Ugb2YgdGhlIFJYIHRyYW5zYWN0aW9uCisgKiAoKm1zZ19oZHIpIGFzIHdlIGRvbid0IG5lZWQgaXQgYW55bW9yZTsgdGhlbiB3ZSdsbCBwb2ludCBhbGwgdGhlCisgKiBkYXRhIHNrYnMgdGhlcmUsIGFzIHRoZXkgc2hhcmUgdGhlIHNhbWUgYmFja2luZyBzdG9yZS4KKyAqCisgKiBXZSBvbmx5IHN1cHBvcnQgSVB2NCBmb3IgdjMgZmlybXdhcmUuCisgKi8KK3N0YXRpYwordm9pZCBpMjQwMG1fcnhfZmFrZV9ldGhfaGVhZGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LAorCQkJICAgICAgIHZvaWQgKl9ldGhfaGRyKQoreworCXN0cnVjdCBldGhoZHIgKmV0aF9oZHIgPSBfZXRoX2hkcjsKKworCW1lbWNweShldGhfaGRyLT5oX2Rlc3QsIG5ldF9kZXYtPmRldl9hZGRyLCBzaXplb2YoZXRoX2hkci0+aF9kZXN0KSk7CisJbWVtc2V0KGV0aF9oZHItPmhfc291cmNlLCAwLCBzaXplb2YoZXRoX2hkci0+aF9kZXN0KSk7CisJZXRoX2hkci0+aF9wcm90byA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMTYoRVRIX1BfSVApOworfQorCisKKy8qCisgKiBpMjQwMG1fbmV0X3J4IC0gcGFzcyBhIG5ldHdvcmsgcGFja2V0IHRvIHRoZSBzdGFjaworICoKKyAqIEBpMjQwMG06IGRldmljZSBpbnN0YW5jZQorICogQHNrYl9yeDogdGhlIHNrYiB3aGVyZSB0aGUgYnVmZmVyIHBvaW50ZWQgdG8gYnkgQGJ1ZiBpcworICogQGk6IDEgaWYgcGF5bG9hZCBpcyB0aGUgb25seSBvbmUKKyAqIEBidWY6IHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBkYXRhCisgKiBAbGVuOiBidWZmZXIncyBsZW5ndGgKKyAqCisgKiBXZSBqdXN0IGNsb25lIHRoZSBza2IgYW5kIHNldCBpdCB1cCBzbyB0aGF0IGl0J3Mgc2tiLT5kYXRhIHBvaW50ZXIKKyAqIHBvaW50cyB0byAiYnVmIiBhbmQgaXQncyBsZW5ndGguCisgKgorICogTm90ZSB0aGF0IGlmIHRoZSBwYXlsb2FkIGlzIHRoZSBsYXN0IChvciB0aGUgb25seSBvbmUpIGluIGEKKyAqIG11bHRpLXBheWxvYWQgbWVzc2FnZSwgd2UgZG9uJ3QgY2xvbmUgdGhlIFNLQiBidXQganVzdCByZXVzZSBpdC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIG5vcm1hbGx5IHJ1biBmcm9tIGEgdGhyZWFkIGNvbnRleHQuIEhvd2V2ZXIsIHdlCisgKiBzdGlsbCB1c2UgbmV0aWZfcngoKSBpbnN0ZWFkIG9mIG5ldGlmX3JlY2VpdmVfc2tiKCkgYXMgd2FzCisgKiByZWNvbW1lbmRlZCBpbiB0aGUgbWFpbGluZyBsaXN0LiBSZWFzb24gaXMgaW4gc29tZSBzdHJlc3MgdGVzdHMKKyAqIHdoZW4gc2VuZGluZy9yZWNlaXZpbmcgYSBsb3Qgb2YgZGF0YSB3ZSBzZWVtIHRvIGhpdCBhIHNvZnRsb2NrIGluCisgKiB0aGUga2VybmVsJ3MgVENQIGltcGxlbWVudGF0aW9uIFthcm91ZG4gdGNwX2RlbGF5X3RpbWVyKCldLiBVc2luZworICogbmV0aWZfcngoKSB0b29rIGNhcmUgb2YgdGhlIGlzc3VlLgorICoKKyAqIFRoaXMgaXMsIG9mIGNvdXJzZSwgc3RpbGwgb3BlbiB0byBkbyBtb3JlIHJlc2VhcmNoIG9uIHdoeSBydW5uaW5nCisgKiB3aXRoIG5ldGlmX3JlY2VpdmVfc2tiKCkgaGl0cyB0aGlzIHNvZnRsb2NrLiBGSVhNRS4KKyAqCisgKiBGSVhNRTogY3VycmVudGx5IHdlIGRvbid0IGRvIGFueSBlZmZvcnRzIGF0IGRpc3Rpbmd1aXNoaW5nIGlmIHdoYXQKKyAqIHdlIGdvdCB3YXMgYW4gSVB2NCBvciBJUHY2IGhlYWRlciwgdG8gc2V0dXAgdGhlIHByb3RvY29sIGZpZWxkCisgKiBjb3JyZWN0bHkuCisgKi8KK3ZvaWQgaTI0MDBtX25ldF9yeChzdHJ1Y3QgaTI0MDBtICppMjQwMG0sIHN0cnVjdCBza19idWZmICpza2JfcngsCisJCSAgIHVuc2lnbmVkIGksIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IGJ1Zl9sZW4pCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBpMjQwMG0tPndpbWF4X2Rldi5uZXRfZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJZF9mbnN0YXJ0KDIsIGRldiwgIihpMjQwMG0gJXAgYnVmICVwIGJ1Zl9sZW4gJWQpXG4iLAorCQkgIGkyNDAwbSwgYnVmLCBidWZfbGVuKTsKKwlpZiAoaSkgeworCQlza2IgPSBza2JfZ2V0KHNrYl9yeCk7CisJCWRfcHJpbnRmKDIsIGRldiwgIlJYOiByZXVzaW5nIGZpcnN0IHBheWxvYWQgc2tiICVwXG4iLCBza2IpOworCQlza2JfcHVsbChza2IsIGJ1ZiAtICh2b2lkICopIHNrYi0+ZGF0YSk7CisJCXNrYl90cmltKHNrYiwgKHZvaWQgKikgc2tiX2VuZF9wb2ludGVyKHNrYikgLSBidWYpOworCX0gZWxzZSB7CisJCS8qIFllcywgdGhpcyBpcyBiYWQgLS0gYSBsb3Qgb2Ygb3ZlcmhlYWQgLS0gc2VlCisJCSAqIGNvbW1lbnRzIGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUgKi8KKwkJc2tiID0gX19uZXRkZXZfYWxsb2Nfc2tiKG5ldF9kZXYsIGJ1Zl9sZW4sIEdGUF9LRVJORUwpOworCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCWRldl9lcnIoZGV2LCAiTkVUUlg6IG5vIG1lbW9yeSB0byByZWFsbG9jIHNrYlxuIik7CisJCQluZXRfZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQlnb3RvIGVycm9yX3NrYl9yZWFsbG9jOworCQl9CisJCW1lbWNweShza2JfcHV0KHNrYiwgYnVmX2xlbiksIGJ1ZiwgYnVmX2xlbik7CisJfQorCWkyNDAwbV9yeF9mYWtlX2V0aF9oZWFkZXIoaTI0MDBtLT53aW1heF9kZXYubmV0X2RldiwKKwkJCQkgIHNrYi0+ZGF0YSAtIEVUSF9ITEVOKTsKKwlza2Jfc2V0X21hY19oZWFkZXIoc2tiLCAtRVRIX0hMRU4pOworCXNrYi0+ZGV2ID0gaTI0MDBtLT53aW1heF9kZXYubmV0X2RldjsKKwlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVApOworCW5ldF9kZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwluZXRfZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBidWZfbGVuOworCWRfcHJpbnRmKDMsIGRldiwgIk5FVFJYOiByZWNlaXZpbmcgJWQgYnl0ZXMgdG8gbmV0d29yayBzdGFja1xuIiwKKwkJYnVmX2xlbik7CisJZF9kdW1wKDQsIGRldiwgYnVmLCBidWZfbGVuKTsKKwluZXRpZl9yeF9uaShza2IpOwkvKiBzZWUgbm90ZXMgaW4gZnVuY3Rpb24gaGVhZGVyICovCitlcnJvcl9za2JfcmVhbGxvYzoKKwlkX2ZuZW5kKDIsIGRldiwgIihpMjQwMG0gJXAgYnVmICVwIGJ1Zl9sZW4gJWQpID0gdm9pZFxuIiwKKwkJaTI0MDBtLCBidWYsIGJ1Zl9sZW4pOworfQorCisKKy8qKgorICogaTI0MDBtX25ldGRldl9zZXR1cCAtIFNldHVwIHNldHVwIEBuZXRfZGV2J3MgaTI0MDBtIHByaXZhdGUgZGF0YQorICoKKyAqIENhbGxlZCBieSBhbGxvY19uZXRkZXYoKQorICovCit2b2lkIGkyNDAwbV9uZXRkZXZfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisJZF9mbnN0YXJ0KDMsIE5VTEwsICIobmV0X2RldiAlcClcbiIsIG5ldF9kZXYpOworCWV0aGVyX3NldHVwKG5ldF9kZXYpOworCW5ldF9kZXYtPm10dSA9IEkyNDAwTV9NQVhfTVRVOworCW5ldF9kZXYtPnR4X3F1ZXVlX2xlbiA9IEkyNDAwTV9UWF9RTEVOOworCW5ldF9kZXYtPmZlYXR1cmVzID0KKwkJICBORVRJRl9GX1ZMQU5fQ0hBTExFTkdFRAorCQl8IE5FVElGX0ZfSElHSERNQTsKKwluZXRfZGV2LT5mbGFncyA9CisJCUlGRl9OT0FSUAkJLyogaTI0MDBtIGlzIGFwdXJlIElQIGRldmljZSAqLworCQkmICh+SUZGX0JST0FEQ0FTVAkvKiBpMjQwMG0gaXMgUDJQICovCisJCSAgICYgfklGRl9NVUxUSUNBU1QpOworCW5ldF9kZXYtPndhdGNoZG9nX3RpbWVvID0gSTI0MDBNX1RYX1RJTUVPVVQ7CisJbmV0X2Rldi0+b3BlbiA9IGkyNDAwbV9vcGVuOworCW5ldF9kZXYtPnN0b3AgPSBpMjQwMG1fc3RvcDsKKwluZXRfZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBpMjQwMG1faGFyZF9zdGFydF94bWl0OworCW5ldF9kZXYtPmNoYW5nZV9tdHUgPSBpMjQwMG1fY2hhbmdlX210dTsKKwluZXRfZGV2LT50eF90aW1lb3V0ID0gaTI0MDBtX3R4X3RpbWVvdXQ7CisJZF9mbmVuZCgzLCBOVUxMLCAiKG5ldF9kZXYgJXApID0gdm9pZFxuIiwgbmV0X2Rldik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpMjQwMG1fbmV0ZGV2X3NldHVwKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL29wLXJma2lsbC5jIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL29wLXJma2lsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4N2VjNTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vb3AtcmZraWxsLmMKQEAgLTAsMCArMSwyMDcgQEAKKy8qCisgKiBJbnRlbCBXaXJlbGVzcyBXaU1BWCBDb25uZWN0aW9uIDI0MDBtCisgKiBJbXBsZW1lbnQgYmFja2VuZCBmb3IgdGhlIFdpTUFYIHN0YWNrIHJma2lsbCBzdXBwb3J0CisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEludGVsIENvcnBvcmF0aW9uIDxsaW51eC13aW1heEBpbnRlbC5jb20+CisgKiBJbmFreSBQZXJlei1Hb256YWxleiA8aW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKgorICogVGhlIFdpTUFYIGtlcm5lbCBzdGFjayBpbnRlZ3JhdGVzIGludG8gUkYtS2lsbCBhbmQga2VlcHMgdGhlCisgKiBzd2l0Y2hlcydzIHN0YXR1cy4gV2UganVzdCBuZWVkIHRvOgorICoKKyAqIC0gcmVwb3J0IGNoYW5nZXMgaW4gdGhlIEhXIFJGIEtpbGwgc3dpdGNoIFt3aXRoCisgKiAgIHdpbWF4X3Jma2lsbF97c3csaHd9X3JlcG9ydCgpLCB3aGljaCBoYXBwZW5zIHdoZW4gd2UgZGV0ZWN0IHRob3NlCisgKiAgIGluZGljYXRpb25zIGNvbWluZyB0aHJvdWdoIGhhcmR3YXJlIHJlcG9ydHNdLiBXZSBhbHNvIGRvIGl0IG9uCisgKiAgIGluaXRpYWxpemF0aW9uIHRvIGxldCB0aGUgc3RhY2sga25vdyB0aGUgaW50aWFsIEhXIHN0YXRlLgorICoKKyAqIC0gaW1wbGVtZW50IGluZGljYXRpb25zIGZyb20gdGhlIHN0YWNrIHRvIGNoYW5nZSB0aGUgU1cgUkYgS2lsbAorICogICBzd2l0Y2ggKGNvbWluZyBmcm9tIHN5c2ZzLCB0aGUgd2ltYXggc3RhY2sgb3IgdXNlciBzcGFjZSkuCisgKi8KKyNpbmNsdWRlICJpMjQwMG0uaCIKKyNpbmNsdWRlIDxsaW51eC93aW1heC9pMjQwMG0uaD4KKworCisKKyNkZWZpbmUgRF9TVUJNT0RVTEUgcmZraWxsCisjaW5jbHVkZSAiZGVidWctbGV2ZWxzLmgiCisKKy8qCisgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgaTI0MDBtIHJhZGlvIGlzIGluIHRoZSByZXF1ZXN0ZWQgd2ltYXhfcmZfc3RhdGUgc3RhdGUKKyAqCisgKi8KK3N0YXRpYworaW50IGkyNDAwbV9yYWRpb19pcyhzdHJ1Y3QgaTI0MDBtICppMjQwMG0sIGVudW0gd2ltYXhfcmZfc3RhdGUgc3RhdGUpCit7CisJaWYgKHN0YXRlID09IFdJTUFYX1JGX09GRikKKwkJcmV0dXJuIGkyNDAwbS0+c3RhdGUgPT0gSTI0MDBNX1NTX1JGX09GRgorCQkJfHwgaTI0MDBtLT5zdGF0ZSA9PSBJMjQwME1fU1NfUkZfU0hVVERPV047CisJZWxzZSBpZiAoc3RhdGUgPT0gV0lNQVhfUkZfT04pCisJCS8qIHN0YXRlID09IFdJTUFYX1JGX09OICovCisJCXJldHVybiBpMjQwMG0tPnN0YXRlICE9IEkyNDAwTV9TU19SRl9PRkYKKwkJCSYmIGkyNDAwbS0+c3RhdGUgIT0gSTI0MDBNX1NTX1JGX1NIVVRET1dOOworCWVsc2UKKwkJQlVHKCk7Cit9CisKKworLyoKKyAqIFdpTUFYIHN0YWNrIG9wZXJhdGlvbjogaW1wbGVtZW50IFNXIFJGS2lsbCB0b2dnbGluZworICoKKyAqIEB3aW1heF9kZXY6IGRldmljZSBkZXNjcmlwdG9yCisgKiBAc2tiOiBza2Igd2hlcmUgdGhlIG1lc3NhZ2UgaGFzIGJlZW4gcmVjZWl2ZWQ7IHNrYi0+ZGF0YSBpcworICogICAgICAgZXhwZWN0ZWQgdG8gcG9pbnQgdG8gdGhlIG1lc3NhZ2UgcGF5bG9hZC4KKyAqIEBnZW5sX2luZm86IHBhc3NlZCBieSB0aGUgZ2VuZXJpYyBuZXRsaW5rIGxheWVyCisgKgorICogR2VuZXJpYyBOZXRsaW5rIHdpbGwgY2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gYSBtZXNzYWdlIGlzIHNlbnQgZnJvbQorICogdXNlcnNwYWNlIHRvIGNoYW5nZSB0aGUgc29mdHdhcmUgUkYtS2lsbCBzd2l0Y2ggc3RhdHVzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBzZXQgdGhlIGRldmljZSdzIHNvZndhcmUgUkYtS2lsbCBzd2l0Y2ggc3RhdGUgdG8KKyAqIG1hdGNoIHdoYXQgaXMgcmVxdWVzdGVkLgorICoKKyAqIE5PVEU6IHRoZSBpMjQwMG0gaGFzIGEgc3RyaWN0IHN0YXRlIG1hY2hpbmU7IHdlIGNhbiBvbmx5IHNldCB0aGUKKyAqICAgICAgIFJGLUtpbGwgc3dpdGNoIHdoZW4gaXQgaXMgb24sIHRoZSBIVyBSRi1LaWxsIGlzIG9uIGFuZCB0aGUKKyAqICAgICAgIGRldmljZSBpcyBpbml0aWFsaXplZC4gU28gd2UgaWdub3JlIGVycm9ycyBzdGVhbWluZyBmcm9tIG5vdAorICogICAgICAgYmVpbmcgaW4gdGhlIHJpZ2h0IHN0YXRlICgtRUlMU0VRKS4KKyAqLworaW50IGkyNDAwbV9vcF9yZmtpbGxfc3dfdG9nZ2xlKHN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldiwKKwkJCSAgICAgICBlbnVtIHdpbWF4X3JmX3N0YXRlIHN0YXRlKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gd2ltYXhfZGV2X3RvX2kyNDAwbSh3aW1heF9kZXYpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYWNrX3NrYjsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgaTI0MDBtX2wzbDRfaGRyIGhkcjsKKwkJc3RydWN0IGkyNDAwbV90bHZfcmZfb3BlcmF0aW9uIHN3X3JmOworCX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgKmNtZDsKKwljaGFyIHN0cmVyclszMl07CisKKwlkX2Zuc3RhcnQoNCwgZGV2LCAiKHdpbWF4X2RldiAlcCBzdGF0ZSAlZClcbiIsIHdpbWF4X2Rldiwgc3RhdGUpOworCisJcmVzdWx0ID0gLUVOT01FTTsKKwljbWQgPSBremFsbG9jKHNpemVvZigqY21kKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNtZCA9PSBOVUxMKQorCQlnb3RvIGVycm9yX2FsbG9jOworCWNtZC0+aGRyLnR5cGUgPSBjcHVfdG9fbGUxNihJMjQwME1fTVRfQ01EX1JGX0NPTlRST0wpOworCWNtZC0+aGRyLmxlbmd0aCA9IHNpemVvZihjbWQtPnN3X3JmKTsKKwljbWQtPmhkci52ZXJzaW9uID0gY3B1X3RvX2xlMTYoSTI0MDBNX0wzTDRfVkVSU0lPTik7CisJY21kLT5zd19yZi5oZHIudHlwZSA9IGNwdV90b19sZTE2KEkyNDAwTV9UTFZfUkZfT1BFUkFUSU9OKTsKKwljbWQtPnN3X3JmLmhkci5sZW5ndGggPSBjcHVfdG9fbGUxNihzaXplb2YoY21kLT5zd19yZi5zdGF0dXMpKTsKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBXSU1BWF9SRl9PRkY6CS8qIFJGS0lMTCBPTiwgcmFkaW8gT0ZGICovCisJCWNtZC0+c3dfcmYuc3RhdHVzID0gY3B1X3RvX2xlMzIoMik7CisJCWJyZWFrOworCWNhc2UgV0lNQVhfUkZfT046CS8qIFJGS0lMTCBPRkYsIHJhZGlvIE9OICovCisJCWNtZC0+c3dfcmYuc3RhdHVzID0gY3B1X3RvX2xlMzIoMSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKworCWFja19za2IgPSBpMjQwMG1fbXNnX3RvX2RldihpMjQwMG0sIGNtZCwgc2l6ZW9mKCpjbWQpKTsKKwlyZXN1bHQgPSBQVFJfRVJSKGFja19za2IpOworCWlmIChJU19FUlIoYWNrX3NrYikpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gaXNzdWUgJ1JGIENvbnRyb2wnIGNvbW1hbmQ6ICVkXG4iLAorCQkJcmVzdWx0KTsKKwkJZ290byBlcnJvcl9tc2dfdG9fZGV2OworCX0KKwlyZXN1bHQgPSBpMjQwMG1fbXNnX2NoZWNrX3N0YXR1cyh3aW1heF9tc2dfZGF0YShhY2tfc2tiKSwKKwkJCQkJIHN0cmVyciwgc2l6ZW9mKHN0cmVycikpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiJ1JGIENvbnRyb2wnICgweCUwNHgpIGNvbW1hbmQgZmFpbGVkOiAlZCAtICVzXG4iLAorCQkJSTI0MDBNX01UX0NNRF9SRl9DT05UUk9MLCByZXN1bHQsIHN0cmVycik7CisJCWdvdG8gZXJyb3JfY21kOworCX0KKworCS8qIE5vdyB3ZSB3YWl0IGZvciB0aGUgc3RhdGUgdG8gY2hhbmdlIHRvIFJBRElPX09GRiBvciBSQURJT19PTiAqLworCXJlc3VsdCA9IHdhaXRfZXZlbnRfdGltZW91dCgKKwkJaTI0MDBtLT5zdGF0ZV93cSwgaTI0MDBtX3JhZGlvX2lzKGkyNDAwbSwgc3RhdGUpLAorCQk1ICogSFopOworCWlmIChyZXN1bHQgPT0gMCkKKwkJcmVzdWx0ID0gLUVUSU1FRE9VVDsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZGV2X2VycihkZXYsICJFcnJvciB3YWl0aW5nIGZvciBkZXZpY2UgdG8gdG9nZ2xlIFJGIHN0YXRlOiAiCisJCQkiJWRcbiIsIHJlc3VsdCk7CisJcmVzdWx0ID0gMDsKK2Vycm9yX2NtZDoKKwlrZnJlZV9za2IoYWNrX3NrYik7CitlcnJvcl9tc2dfdG9fZGV2OgorZXJyb3JfYWxsb2M6CisJZF9mbmVuZCg0LCBkZXYsICIod2ltYXhfZGV2ICVwIHN0YXRlICVkKSA9ICVkXG4iLAorCQl3aW1heF9kZXYsIHN0YXRlLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKworLyoKKyAqIEluZm9ybSB0aGUgV2lNQVggc3RhY2sgb2YgY2hhbmdlcyBpbiB0aGUgUkYgS2lsbCBzd2l0Y2hlcyByZXBvcnRlZAorICogYnkgdGhlIGRldmljZQorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKiBAcmZzczogVExWIGZvciBSRiBTd2l0Y2hlcyBzdGF0dXM7IGFscmVhZHkgdmFsaWRhdGVkCisgKgorICogTk9URTogdGhlIHJlcG9ydHMgb24gUkYgc3dpdGNoIHN0YXR1cyBjYW5ub3QgYmUgdHJ1c3RlZAorICogICAgICAgb3IgdXNlZCB1bnRpbCB0aGUgZGV2aWNlIGlzIGluIGEgc3RhdGUgb2YgUkFESU9fT0ZGCisgKiAgICAgICBvciBncmVhdGVyLgorICovCit2b2lkIGkyNDAwbV9yZXBvcnRfdGx2X3JmX3N3aXRjaGVzX3N0YXR1cygKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0sCisJY29uc3Qgc3RydWN0IGkyNDAwbV90bHZfcmZfc3dpdGNoZXNfc3RhdHVzICpyZnNzKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwllbnVtIGkyNDAwbV9yZl9zd2l0Y2hfc3RhdHVzIGh3LCBzdzsKKwllbnVtIHdpbWF4X3N0IHdpbWF4X3N0YXRlOworCisJc3cgPSBsZTMyX3RvX2NwdShyZnNzLT5zd19yZl9zd2l0Y2gpOworCWh3ID0gbGUzMl90b19jcHUocmZzcy0+aHdfcmZfc3dpdGNoKTsKKworCWRfZm5zdGFydCgzLCBkZXYsICIoaTI0MDBtICVwIHJmc3MgJXAgW2h3ICV1IHN3ICV1XSlcbiIsCisJCSAgaTI0MDBtLCByZnNzLCBodywgc3cpOworCS8qIFdlIG9ubHkgcHJvY2VzcyBydyBzd2l0Y2ggZXZlbnMgd2hlbiB0aGUgZGV2aWNlIGhhcyBiZWVuCisJICogZnVsbHkgaW5pdGlhbGl6ZWQgKi8KKwl3aW1heF9zdGF0ZSA9IHdpbWF4X3N0YXRlX2dldCgmaTI0MDBtLT53aW1heF9kZXYpOworCWlmICh3aW1heF9zdGF0ZSA8IFdJTUFYX1NUX1JBRElPX09GRikgeworCQlkX3ByaW50ZigzLCBkZXYsICJpZ25vcmluZyBSRiBzd2l0Y2hlcyByZXBvcnQsIHN0YXRlICV1XG4iLAorCQkJIHdpbWF4X3N0YXRlKTsKKwkJZ290byBvdXQ7CisJfQorCXN3aXRjaCAoc3cpIHsKKwljYXNlIEkyNDAwTV9SRl9TV0lUQ0hfT046CS8qIFJGIEtpbGwgZGlzYWJsZWQgKHJhZGlvIG9uKSAqLworCQl3aW1heF9yZXBvcnRfcmZraWxsX3N3KCZpMjQwMG0tPndpbWF4X2RldiwgV0lNQVhfUkZfT04pOworCQlicmVhazsKKwljYXNlIEkyNDAwTV9SRl9TV0lUQ0hfT0ZGOgkvKiBSRiBLaWxsIGVuYWJsZWQgKHJhZGlvIG9mZikgKi8KKwkJd2ltYXhfcmVwb3J0X3Jma2lsbF9zdygmaTI0MDBtLT53aW1heF9kZXYsIFdJTUFYX1JGX09GRik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoZGV2LCAiSFcgQlVHPyBVbmtub3duIFJGIFNXIHN0YXRlIDB4JXhcbiIsIHN3KTsKKwl9CisKKwlzd2l0Y2ggKGh3KSB7CisJY2FzZSBJMjQwME1fUkZfU1dJVENIX09OOgkvKiBSRiBLaWxsIGRpc2FibGVkIChyYWRpbyBvbikgKi8KKwkJd2ltYXhfcmVwb3J0X3Jma2lsbF9odygmaTI0MDBtLT53aW1heF9kZXYsIFdJTUFYX1JGX09OKTsKKwkJYnJlYWs7CisJY2FzZSBJMjQwME1fUkZfU1dJVENIX09GRjoJLyogUkYgS2lsbCBlbmFibGVkIChyYWRpbyBvZmYpICovCisJCXdpbWF4X3JlcG9ydF9yZmtpbGxfaHcoJmkyNDAwbS0+d2ltYXhfZGV2LCBXSU1BWF9SRl9PRkYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRldiwgIkhXIEJVRz8gVW5rbm93biBSRiBIVyBzdGF0ZSAweCV4XG4iLCBodyk7CisJfQorb3V0OgorCWRfZm5lbmQoMywgZGV2LCAiKGkyNDAwbSAlcCByZnNzICVwIFtodyAldSBzdyAldV0pID0gdm9pZFxuIiwKKwkJaTI0MDBtLCByZnNzLCBodywgc3cpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3J4LmMgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vcnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTIyMDIyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3J4LmMKQEAgLTAsMCArMSw1MzQgQEAKKy8qCisgKiBJbnRlbCBXaXJlbGVzcyBXaU1BWCBDb25uZWN0aW9uIDI0MDBtCisgKiBIYW5kbGUgaW5jb21pbmcgdHJhZmZpYyBhbmQgZGVsaXZlciBpdCB0byB0aGUgY29udHJvbCBvciBkYXRhIHBsYW5lcworICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKgorICogSW50ZWwgQ29ycG9yYXRpb24gPGxpbnV4LXdpbWF4QGludGVsLmNvbT4KKyAqIFlhbmlyIEx1YmV0a2luIDx5YW5pcngubHViZXRraW5AaW50ZWwuY29tPgorICogIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqICAtIFVzZSBza2JfY2xvbmUoKSwgYnJlYWsgdXAgcHJvY2Vzc2luZyBpbiBjaHVua3MKKyAqICAtIFNwbGl0IHRyYW5zcG9ydC9kZXZpY2Ugc3BlY2lmaWMKKyAqICAtIE1ha2UgYnVmZmVyIHNpemUgZHluYW1pYyB0byBleGVydCBsZXNzIG1lbW9yeSBwcmVzc3VyZQorICoKKyAqCisgKiBUaGlzIGhhbmRsZXMgdGhlIFJYIHBhdGguCisgKgorICogV2UgcmVjZWl2ZSBhbiBSWCBtZXNzYWdlIGZyb20gdGhlIGJ1cy1zcGVjaWZpYyBkcml2ZXIsIHdoaWNoCisgKiBjb250YWlucyBvbmUgb3IgbW9yZSBwYXlsb2FkcyB0aGF0IGhhdmUgcG90ZW50aWFsbHkgZGlmZmVyZW50CisgKiBkZXN0aW5hdGFyaWVzIChkYXRhIG9yIGNvbnRyb2wgcGF0aHMpLgorICoKKyAqIFNvIHdlIGp1c3QgdGFrZSB0aGF0IHBheWxvYWQgZnJvbSB0aGUgdHJhbnNwb3J0IHNwZWNpZmljIGNvZGUgaW4KKyAqIHRoZSBmb3JtIG9mIGFuIHNrYiwgYnJlYWsgaXQgdXAgaW4gY2h1bmtzIChhIGNsb25lZCBza2IgZWFjaCBpbiB0aGUKKyAqIGNhc2Ugb2YgbmV0d29yayBwYWNrZXRzKSBhbmQgcGFzcyBpdCB0byBuZXRkZXYgb3IgdG8gdGhlCisgKiBjb21tYW5kL2FjayBoYW5kbGVyIChhbmQgZnJvbSB0aGVyZSB0byB0aGUgV2lNQVggc3RhY2spLgorICoKKyAqIFBST1RPQ09MIEZPUk1BVAorICoKKyAqIFRoZSBmb3JtYXQgb2YgdGhlIGJ1ZmZlciBpczoKKyAqCisgKiBIRUFERVIgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBpMjQwMG1fbXNnX2hkcikKKyAqIFBBWUxPQUQgREVTQ1JJUFRPUiAwICAgICAgICAoc3RydWN0IGkyNDAwbV9wbGQpCisgKiBQQVlMT0FEIERFU0NSSVBUT1IgMQorICogLi4uCisgKiBQQVlMT0FEIERFU0NSSVBUT1IgTgorICogUEFZTE9BRCAwICAgICAgICAgICAgICAgICAgIChyYXcgYnl0ZXMpCisgKiBQQVlMT0FEIDEKKyAqIC4uLgorICogUEFZTE9BRCBOCisgKgorICogU2VlIHR4LmMgZm9yIGEgZGVlcGVyIGRlc2NyaXB0aW9uIG9uIGFsaWdubWVudCByZXF1aXJlbWVudHMgYW5kCisgKiBvdGhlciBmdW4gZmFjdHMgb2YgaXQuCisgKgorICogUk9BRE1BUAorICoKKyAqIGkyNDAwbV9yeAorICogICBpMjQwMG1fcnhfbXNnX2hkcl9jaGVjaworICogICBpMjQwMG1fcnhfcGxfZGVzY3JfY2hlY2sKKyAqICAgaTI0MDBtX3J4X3BheWxvYWQKKyAqICAgICBpMjQwMG1fbmV0X3J4CisgKiAgICAgaTI0MDBtX3J4X2N0bAorICogICAgICAgaTI0MDBtX21zZ19zaXplX2NoZWNrCisgKiAgICAgICBpMjQwMG1fcmVwb3J0X2hvb2tfd29yayAgICBbaW4gYSB3b3JrcXVldWVdCisgKiAgICAgICAgIGkyNDAwbV9yZXBvcnRfaG9vaworICogICAgICAgd2ltYXhfbXNnX3RvX3VzZXIKKyAqICAgICAgIGkyNDAwbV9yeF9jdGxfYWNrCisgKiAgICAgICAgIHdpbWF4X21zZ190b191c2VyX2FsbG9jCisgKiAgICAgaTI0MDBtX3J4X3RyYWNlCisgKiAgICAgICBpMjQwMG1fbXNnX3NpemVfY2hlY2sKKyAqICAgICAgIHdpbWF4X21zZworICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSAiaTI0MDBtLmgiCisKKworI2RlZmluZSBEX1NVQk1PRFVMRSByeAorI2luY2x1ZGUgImRlYnVnLWxldmVscy5oIgorCitzdHJ1Y3QgaTI0MDBtX3JlcG9ydF9ob29rX2FyZ3MgeworCXN0cnVjdCBza19idWZmICpza2Jfcng7CisJY29uc3Qgc3RydWN0IGkyNDAwbV9sM2w0X2hkciAqbDNsNF9oZHI7CisJc2l6ZV90IHNpemU7Cit9OworCisKKy8qCisgKiBFeGVjdXRlIGkyNDAwbV9yZXBvcnRfaG9vayBpbiBhIHdvcmtxdWV1ZQorICoKKyAqIFVucGFja3MgYXJndW1lbnRzIGZyb20gdGhlIGRlZmVycmVkIGNhbGwsIGV4ZWN1dGVzIGl0IGFuZCB0aGVuCisgKiBkcm9wcyB0aGUgcmVmZXJlbmNlcy4KKyAqCisgKiBPYnZpb3VzIE5PVEU6IFJlZmVyZW5jZXMgYXJlIG5lZWRlZCBiZWNhdXNlIHdlIGFyZSBhIHNlcGFyYXRlCisgKiAgICAgdGhyZWFkOyBvdGhlcndpc2UgdGhlIGJ1ZmZlciBjaGFuZ2VzIHVuZGVyIHVzIGJlY2F1c2UgaXQgaXMKKyAqICAgICByZWxlYXNlZCBieSB0aGUgb3JpZ2luYWwgY2FsbGVyLgorICovCitzdGF0aWMKK3ZvaWQgaTI0MDBtX3JlcG9ydF9ob29rX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3cykKK3sKKwlzdHJ1Y3QgaTI0MDBtX3dvcmsgKml3ID0KKwkJY29udGFpbmVyX29mKHdzLCBzdHJ1Y3QgaTI0MDBtX3dvcmssIHdzKTsKKwlzdHJ1Y3QgaTI0MDBtX3JlcG9ydF9ob29rX2FyZ3MgKmFyZ3MgPSAodm9pZCAqKSBpdy0+cGw7CisJaTI0MDBtX3JlcG9ydF9ob29rKGl3LT5pMjQwMG0sIGFyZ3MtPmwzbDRfaGRyLCBhcmdzLT5zaXplKTsKKwlrZnJlZV9za2IoYXJncy0+c2tiX3J4KTsKKwlpMjQwMG1fcHV0KGl3LT5pMjQwMG0pOworCWtmcmVlKGl3KTsKK30KKworCisvKgorICogUHJvY2VzcyBhbiBhY2sgdG8gYSBjb21tYW5kCisgKgorICogQGkyNDAwbTogZGV2aWNlIGRlc2NyaXB0b3IKKyAqIEBwYXlsb2FkOiBwb2ludGVyIHRvIG1lc3NhZ2UKKyAqIEBzaXplOiBzaXplIG9mIHRoZSBtZXNzYWdlCisgKgorICogUGFzcyB0aGUgYWNrbm9kbGVkZ21lbnQgKGluIGFuIHNrYikgdG8gdGhlIHRocmVhZCB0aGF0IGlzIHdhaXRpbmcKKyAqIGZvciBpdCBpbiBpMjQwMG0tPm1zZ19jb21wbGV0aW9uLgorICoKKyAqIFdlIG5lZWQgdG8gY29vcmRpbmF0ZSBwcm9wZXJseSB3aXRoIHRoZSB0aHJlYWQgd2FpdGluZyBmb3IgdGhlCisgKiBhY2suIENoZWNrIGlmIGl0IGlzIHdhaXRpbmcgb3IgaWYgaXQgaXMgZ29uZS4gV2UgbG9vc2UgdGhlIHNwaW5sb2NrCisgKiB0byBhdm9pZCBhbGxvY2F0aW5nIG9uIGF0b21pYyBjb250ZXh0cyAoeWVhaCwgY291bGQgdXNlIEdGUF9BVE9NSUMsCisgKiBidXQgdGhpcyBpcyBub3Qgc28gc3BlZWQgY3JpdGljYWwpLgorICovCitzdGF0aWMKK3ZvaWQgaTI0MDBtX3J4X2N0bF9hY2soc3RydWN0IGkyNDAwbSAqaTI0MDBtLAorCQkgICAgICAgY29uc3Qgdm9pZCAqcGF5bG9hZCwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldiA9ICZpMjQwMG0tPndpbWF4X2RldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBza19idWZmICphY2tfc2tiOworCisJLyogQW55b25lIHdhaXRpbmcgZm9yIGFuIGFuc3dlcj8gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTI0MDBtLT5yeF9sb2NrLCBmbGFncyk7CisJaWYgKGkyNDAwbS0+YWNrX3NrYiAhPSBFUlJfUFRSKC1FSU5QUk9HUkVTUykpIHsKKwkJZGV2X2VycihkZXYsICJIdWg/IHJlcGx5IHRvIGNvbW1hbmQgd2l0aCBubyB3YWl0ZXJzXG4iKTsKKwkJZ290byBlcnJvcl9ub193YWl0ZXI7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmkyNDAwbS0+cnhfbG9jaywgZmxhZ3MpOworCisJYWNrX3NrYiA9IHdpbWF4X21zZ19hbGxvYyh3aW1heF9kZXYsIE5VTEwsIHBheWxvYWQsIHNpemUsIEdGUF9LRVJORUwpOworCisJLyogQ2hlY2sgd2FpdGVyIGRpZG4ndCB0aW1lIG91dCB3YWl0aW5nIGZvciB0aGUgYW5zd2VyLi4uICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmkyNDAwbS0+cnhfbG9jaywgZmxhZ3MpOworCWlmIChpMjQwMG0tPmFja19za2IgIT0gRVJSX1BUUigtRUlOUFJPR1JFU1MpKSB7CisJCWRfcHJpbnRmKDEsIGRldiwgIkh1aD8gd2FpdGVyIGZvciBjb21tYW5kIHJlcGx5IGNhbmNlbGxlZFxuIik7CisJCWdvdG8gZXJyb3Jfd2FpdGVyX2NhbmNlbGxlZDsKKwl9CisJaWYgKGFja19za2IgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgIkNNRC9HRVQvU0VUIGFjazogY2Fubm90IGFsbG9jYXRlIFNLQlxuIik7CisJCWkyNDAwbS0+YWNrX3NrYiA9IEVSUl9QVFIoLUVOT01FTSk7CisJfSBlbHNlCisJCWkyNDAwbS0+YWNrX3NrYiA9IGFja19za2I7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTI0MDBtLT5yeF9sb2NrLCBmbGFncyk7CisJY29tcGxldGUoJmkyNDAwbS0+bXNnX2NvbXBsZXRpb24pOworCXJldHVybjsKKworZXJyb3Jfd2FpdGVyX2NhbmNlbGxlZDoKKwlpZiAoYWNrX3NrYikKKwkJa2ZyZWVfc2tiKGFja19za2IpOworZXJyb3Jfbm9fd2FpdGVyOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmkyNDAwbS0+cnhfbG9jaywgZmxhZ3MpOworCXJldHVybjsKK30KKworCisvKgorICogUmVjZWl2ZSBhbmQgcHJvY2VzcyBhIGNvbnRyb2wgcGF5bG9hZAorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKiBAc2tiX3J4OiBza2IgdGhhdCBjb250YWlucyB0aGUgcGF5bG9hZCAoZm9yIHJlZmVyZW5jZSBjb3VudGluZykKKyAqIEBwYXlsb2FkOiBwb2ludGVyIHRvIG1lc3NhZ2UKKyAqIEBzaXplOiBzaXplIG9mIHRoZSBtZXNzYWdlCisgKgorICogVGhlcmUgYXJlIHR3byB0eXBlcyBvZiBjb250cm9sIFJYIG1lc3NhZ2VzOiByZXBvcnRzIChhc3luY2hyb25vdXMsCisgKiBsaWtlIHlvdXIgZXZlcnkgZGF5IGludGVycnVwdHMpIGFuZCAnYWNrcycgKHJlcG9uc2VzIHRvIGEgY29tbWFuZCwKKyAqIGdldCBvciBzZXQgcmVxdWVzdCkuCisgKgorICogSWYgaXQgaXMgYSByZXBvcnQsIHdlIHJ1biBob29rcyBvbiBpdCAodG8gZXh0cmFjdCBpbmZvcm1hdGlvbiBmb3IKKyAqIHRoaW5ncyB3ZSBuZWVkIHRvIGRvIGluIHRoZSBkcml2ZXIpIGFuZCB0aGVuIHBhc3MgaXQgb3ZlciB0byB0aGUKKyAqIFdpTUFYIHN0YWNrIHRvIHNlbmQgaXQgdG8gdXNlciBzcGFjZS4KKyAqCisgKiBOT1RFOiByZXBvcnQgcHJvY2Vzc2luZyBpcyBkb25lIGluIGEgd29ya3F1ZXVlIHNwZWNpZmljIHRvIHRoZQorICogICAgIGdlbmVyaWMgZHJpdmVyLCB0byBhdm9pZCBkZWFkbG9ja3MgaW4gdGhlIHN5c3RlbS4KKyAqCisgKiBJZiBpdCBpcyBub3QgYSByZXBvcnQsIGl0IGlzIGFuIGFjayB0byBhIHByZXZpb3VzbHkgZXhlY3V0ZWQKKyAqIGNvbW1hbmQsIHNldCBvciBnZXQsIHNvIHdha2UgdXAgd2hvZXZlciBpcyB3YWl0aW5nIGZvciBpdCBmcm9tCisgKiBpMjQwMG1fbXNnX3RvX2RldigpLiBpMjQwMG1fcnhfY3RsX2FjaygpIHRha2VzIGNhcmUgb2YgdGhhdC4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIHNpemVzIHdlIHBhc3MgdG8gb3RoZXIgZnVuY3Rpb25zIGZyb20gaGVyZSBhcmUgdGhlCisgKiBzaXplcyBvZiB0aGUgX2wzbDRfaGRyICsgcGF5bG9hZCwgbm90IGZ1bGwgYnVmZmVyIHNpemVzLCBhcyB3ZSBoYXZlCisgKiB2ZXJpZmllZCBpbiBfbXNnX3NpemVfY2hlY2soKSB0aGF0IHRoZXkgYXJlIGNvbmdydWVudC4KKyAqCisgKiBGb3IgcmVwb3J0czogV2UgY2FuJ3QgY2xvbmUgdGhlIG9yaWdpbmFsIHNrYiB3aGVyZSB0aGUgZGF0YSBpcworICogYmVjYXVzZSB3ZSBuZWVkIHRvIHNlbmQgdGhpcyB1cCB2aWEgbmV0bGluazsgbmV0bGluayBoYXMgdG8gYWRkCisgKiBoZWFkZXJzIGFuZCB3ZSBjYW4ndCBvdmVyd3JpdGUgd2hhdCdzIHByZWNlZWRpbmcgdGhlIHBheWxvYWQuLi5hcworICogaXQgaXMgYW5vdGhlciBtZXNzYWdlLiBTbyB3ZSBqdXN0IGR1cCB0aGVtLgorICovCitzdGF0aWMKK3ZvaWQgaTI0MDBtX3J4X2N0bChzdHJ1Y3QgaTI0MDBtICppMjQwMG0sIHN0cnVjdCBza19idWZmICpza2JfcngsCisJCSAgIGNvbnN0IHZvaWQgKnBheWxvYWQsIHNpemVfdCBzaXplKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCWNvbnN0IHN0cnVjdCBpMjQwMG1fbDNsNF9oZHIgKmwzbDRfaGRyID0gcGF5bG9hZDsKKwl1bnNpZ25lZCBtc2dfdHlwZTsKKworCXJlc3VsdCA9IGkyNDAwbV9tc2dfc2l6ZV9jaGVjayhpMjQwMG0sIGwzbDRfaGRyLCBzaXplKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIkhXIEJVRz8gZGV2aWNlIHNlbnQgYSBiYWQgbWVzc2FnZTogJWRcbiIsCisJCQlyZXN1bHQpOworCQlnb3RvIGVycm9yX2NoZWNrOworCX0KKwltc2dfdHlwZSA9IGxlMTZfdG9fY3B1KGwzbDRfaGRyLT50eXBlKTsKKwlkX3ByaW50ZigxLCBkZXYsICIlcyAweCUwNHg6ICV6dSBieXRlc1xuIiwKKwkJIG1zZ190eXBlICYgSTI0MDBNX01UX1JFUE9SVF9NQVNLID8gIlJFUE9SVCIgOiAiQ01EL1NFVC9HRVQiLAorCQkgbXNnX3R5cGUsIHNpemUpOworCWRfZHVtcCgyLCBkZXYsIGwzbDRfaGRyLCBzaXplKTsKKwlpZiAobXNnX3R5cGUgJiBJMjQwME1fTVRfUkVQT1JUX01BU0spIHsKKwkJLyogVGhlc2UgaG9va3MgaGF2ZSB0byBiZSByYW4gc2VyaWFsaXplZDsgYXMgd2VsbCwgdGhlCisJCSAqIGhhbmRsaW5nIG1pZ2h0IGZvcmNlIHRoZSBleGVjdXRpb24gb2YgY29tbWFuZHMsIGFuZAorCQkgKiB0aGF0IG1pZ2h0IGNhdXNlIHJlZW50cmFuY3kgaXNzdWVzIHdpdGgKKwkJICogYnVzLXNwZWNpZmljIHN1YmRyaXZlcnMgYW5kIHdvcmtxdWV1ZXMuIFNvIHdlIHJ1bgorCQkgKiBpdCBpbiBhIHNlcGFyYXRlIHdvcmtxdWV1ZS4gKi8KKwkJc3RydWN0IGkyNDAwbV9yZXBvcnRfaG9va19hcmdzIGFyZ3MgPSB7CisJCQkuc2tiX3J4ID0gc2tiX3J4LAorCQkJLmwzbDRfaGRyID0gbDNsNF9oZHIsCisJCQkuc2l6ZSA9IHNpemUKKwkJfTsKKwkJaWYgKHVubGlrZWx5KGkyNDAwbS0+cmVhZHkgPT0gMCkpCS8qIG9ubHkgc2VuZCBpZiB1cCAqLworCQkJcmV0dXJuOworCQlza2JfZ2V0KHNrYl9yeCk7CisJCWkyNDAwbV9xdWV1ZV93b3JrKGkyNDAwbSwgaTI0MDBtX3JlcG9ydF9ob29rX3dvcmssCisJCQkJICBHRlBfS0VSTkVMLCAmYXJncywgc2l6ZW9mKGFyZ3MpKTsKKwkJcmVzdWx0ID0gd2ltYXhfbXNnKCZpMjQwMG0tPndpbWF4X2RldiwgTlVMTCwgbDNsNF9oZHIsIHNpemUsCisJCQkJICAgR0ZQX0tFUk5FTCk7CisJCWlmIChyZXN1bHQgPCAwKQorCQkJZGV2X2VycihkZXYsICJlcnJvciBzZW5kaW5nIHJlcG9ydCB0byB1c2Vyc3BhY2U6ICVkXG4iLAorCQkJCXJlc3VsdCk7CisJfSBlbHNlCQkvKiBhbiBhY2sgdG8gYSBDTUQsIEdFVCBvciBTRVQgKi8KKwkJaTI0MDBtX3J4X2N0bF9hY2soaTI0MDBtLCBwYXlsb2FkLCBzaXplKTsKK2Vycm9yX2NoZWNrOgorCXJldHVybjsKK30KKworCisKKworLyoKKyAqIFJlY2VpdmUgYW5kIHNlbmQgdXAgYSB0cmFjZQorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKiBAc2tiX3J4OiBza2IgdGhhdCBjb250YWlucyB0aGUgdHJhY2UgKGZvciByZWZlcmVuY2UgY291bnRpbmcpCisgKiBAcGF5bG9hZDogcG9pbnRlciB0byB0cmFjZSBtZXNzYWdlIGluc2lkZSB0aGUgc2tiCisgKiBAc2l6ZTogc2l6ZSBvZiB0aGUgbWVzc2FnZQorICoKKyAqIFRIZSBpMjQwMG0gbWlnaHQgcHJvZHVjZSB0cmFjZSBpbmZvcm1hdGlvbiAoZGlhZ25vc3RpY3MpIGFuZCB3ZQorICogc2VuZCB0aGVtIHRocm91Z2ggYSBkaWZmZXJlbnQga2VybmVsLXRvLXVzZXIgcGlwZSAodG8gYXZvaWQKKyAqIGNsb2dnaW5nIGl0KS4KKyAqCisgKiBBcyBpbiBpMjQwMG1fcnhfY3RsKCksIHdlIGNhbid0IGNsb25lIHRoZSBvcmlnaW5hbCBza2Igd2hlcmUgdGhlCisgKiBkYXRhIGlzIGJlY2F1c2Ugd2UgbmVlZCB0byBzZW5kIHRoaXMgdXAgdmlhIG5ldGxpbms7IG5ldGxpbmsgaGFzIHRvCisgKiBhZGQgaGVhZGVycyBhbmQgd2UgY2FuJ3Qgb3ZlcndyaXRlIHdoYXQncyBwcmVjZWVkaW5nIHRoZQorICogcGF5bG9hZC4uLmFzIGl0IGlzIGFub3RoZXIgbWVzc2FnZS4gU28gd2UganVzdCBkdXAgdGhlbS4KKyAqLworc3RhdGljCit2b2lkIGkyNDAwbV9yeF90cmFjZShzdHJ1Y3QgaTI0MDBtICppMjQwMG0sCisJCSAgICAgY29uc3Qgdm9pZCAqcGF5bG9hZCwgc2l6ZV90IHNpemUpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2ID0gJmkyNDAwbS0+d2ltYXhfZGV2OworCWNvbnN0IHN0cnVjdCBpMjQwMG1fbDNsNF9oZHIgKmwzbDRfaGRyID0gcGF5bG9hZDsKKwl1bnNpZ25lZCBtc2dfdHlwZTsKKworCXJlc3VsdCA9IGkyNDAwbV9tc2dfc2l6ZV9jaGVjayhpMjQwMG0sIGwzbDRfaGRyLCBzaXplKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIkhXIEJVRz8gZGV2aWNlIHNlbnQgYSBiYWQgdHJhY2UgbWVzc2FnZTogJWRcbiIsCisJCQlyZXN1bHQpOworCQlnb3RvIGVycm9yX2NoZWNrOworCX0KKwltc2dfdHlwZSA9IGxlMTZfdG9fY3B1KGwzbDRfaGRyLT50eXBlKTsKKwlkX3ByaW50ZigxLCBkZXYsICJUcmFjZSAlcyAweCUwNHg6ICV6dSBieXRlc1xuIiwKKwkJIG1zZ190eXBlICYgSTI0MDBNX01UX1JFUE9SVF9NQVNLID8gIlJFUE9SVCIgOiAiQ01EL1NFVC9HRVQiLAorCQkgbXNnX3R5cGUsIHNpemUpOworCWRfZHVtcCgyLCBkZXYsIGwzbDRfaGRyLCBzaXplKTsKKwlpZiAodW5saWtlbHkoaTI0MDBtLT5yZWFkeSA9PSAwKSkJLyogb25seSBzZW5kIGlmIHVwICovCisJCXJldHVybjsKKwlyZXN1bHQgPSB3aW1heF9tc2cod2ltYXhfZGV2LCAidHJhY2UiLCBsM2w0X2hkciwgc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKHJlc3VsdCA8IDApCisJCWRldl9lcnIoZGV2LCAiZXJyb3Igc2VuZGluZyB0cmFjZSB0byB1c2Vyc3BhY2U6ICVkXG4iLAorCQkJcmVzdWx0KTsKK2Vycm9yX2NoZWNrOgorCXJldHVybjsKK30KKworCisvKgorICogQWN0IG9uIGEgcmVjZWl2ZWQgcGF5bG9hZAorICoKKyAqIEBpMjQwMG06IGRldmljZSBpbnN0YW5jZQorICogQHNrYl9yeDogc2tiIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiB3YXMgcmVjZWl2ZWQKKyAqIEBzaW5nbGU6IDEgaWYgdGhlcmUgaXMgb25seSBvbmUgcGF5bG9hZCwgMCBvdGhlcndpc2UKKyAqIEBwbGQ6IHBheWxvYWQgZGVzY3JpcHRvcgorICogQHBheWxvYWQ6IHBheWxvYWQgZGF0YQorICoKKyAqIFVwb24gcmVjZXB0aW9uIG9mIGEgcGF5bG9hZCwgbG9vayBhdCBpdHMgZ3V0cyBpbiB0aGUgcGF5bG9hZAorICogZGVzY3JpcHRvciBhbmQgZGVjaWRlIHdoYXQgdG8gZG8gd2l0aCBpdC4KKyAqLworc3RhdGljCit2b2lkIGkyNDAwbV9yeF9wYXlsb2FkKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwgc3RydWN0IHNrX2J1ZmYgKnNrYl9yeCwKKwkJICAgICAgIHVuc2lnbmVkIHNpbmdsZSwgY29uc3Qgc3RydWN0IGkyNDAwbV9wbGQgKnBsZCwKKwkJICAgICAgIGNvbnN0IHZvaWQgKnBheWxvYWQpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXNpemVfdCBwbF9zaXplID0gaTI0MDBtX3BsZF9zaXplKHBsZCk7CisJZW51bSBpMjQwMG1fcHQgcGxfdHlwZSA9IGkyNDAwbV9wbGRfdHlwZShwbGQpOworCisJc3dpdGNoIChwbF90eXBlKSB7CisJY2FzZSBJMjQwME1fUFRfREFUQToKKwkJZF9wcmludGYoMywgZGV2LCAiUlg6IGRhdGEgcGF5bG9hZCAlenUgYnl0ZXNcbiIsIHBsX3NpemUpOworCQlpMjQwMG1fbmV0X3J4KGkyNDAwbSwgc2tiX3J4LCBzaW5nbGUsIHBheWxvYWQsIHBsX3NpemUpOworCQlicmVhazsKKwljYXNlIEkyNDAwTV9QVF9DVFJMOgorCQlpMjQwMG1fcnhfY3RsKGkyNDAwbSwgc2tiX3J4LCBwYXlsb2FkLCBwbF9zaXplKTsKKwkJYnJlYWs7CisJY2FzZSBJMjQwME1fUFRfVFJBQ0U6CisJCWkyNDAwbV9yeF90cmFjZShpMjQwMG0sIHBheWxvYWQsIHBsX3NpemUpOworCQlicmVhazsKKwlkZWZhdWx0OgkvKiBBbnl0aGluZyBlbHNlIHNob3VsZG4ndCBjb21lIHRvIHRoZSBob3N0ICovCisJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCisJCQlkZXZfZXJyKGRldiwgIlJYOiBIVyBCVUc/IHVuZXhwZWN0ZWQgcGF5bG9hZCB0eXBlICV1XG4iLAorCQkJCXBsX3R5cGUpOworCX0KK30KKworCisvKgorICogQ2hlY2sgYSByZWNlaXZlZCB0cmFuc2FjdGlvbidzIG1lc3NhZ2UgaGVhZGVyCisgKgorICogQGkyNDAwbTogZGV2aWNlIGRlc2NyaXB0b3IKKyAqIEBtc2dfaGRyOiBtZXNzYWdlIGhlYWRlcgorICogQGJ1Zl9zaXplOiBzaXplIG9mIHRoZSByZWNlaXZlZCBidWZmZXIKKyAqCisgKiBDaGVjayB0aGF0IHRoZSBkZWNsYXJhdGlvbnMgZG9uZSBieSBhIFJYIGJ1ZmZlciBtZXNzYWdlIGhlYWRlciBhcmUKKyAqIHNhbmUgYW5kIGNvbnNpc3RlbnQgd2l0aCB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCB3YXMgcmVjZWl2ZWQuCisgKi8KK3N0YXRpYworaW50IGkyNDAwbV9yeF9tc2dfaGRyX2NoZWNrKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgaTI0MDBtX21zZ19oZHIgKm1zZ19oZHIsCisJCQkgICAgc2l6ZV90IGJ1Zl9zaXplKQoreworCWludCByZXN1bHQgPSAtRUlPOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlpZiAoYnVmX3NpemUgPCBzaXplb2YoKm1zZ19oZHIpKSB7CisJCWRldl9lcnIoZGV2LCAiUlg6IEhXIEJVRz8gbWVzc2FnZSB3aXRoIHNob3J0IGhlYWRlciAoJXp1ICIKKwkJCSJ2cyAlenUgYnl0ZXMgZXhwZWN0ZWQpXG4iLCBidWZfc2l6ZSwgc2l6ZW9mKCptc2dfaGRyKSk7CisJCWdvdG8gZXJyb3I7CisJfQorCWlmIChtc2dfaGRyLT5iYXJrZXIgIT0gY3B1X3RvX2xlMzIoSTI0MDBNX0QySF9NU0dfQkFSS0VSKSkgeworCQlkZXZfZXJyKGRldiwgIlJYOiBIVyBCVUc/IG1lc3NhZ2UgcmVjZWl2ZWQgd2l0aCB1bmtub3duICIKKwkJCSJiYXJrZXIgMHglMDh4IChidWZfc2l6ZSAlenUgYnl0ZXMpXG4iLAorCQkJbGUzMl90b19jcHUobXNnX2hkci0+YmFya2VyKSwgYnVmX3NpemUpOworCQlnb3RvIGVycm9yOworCX0KKwlpZiAobXNnX2hkci0+bnVtX3BscyA9PSAwKSB7CisJCWRldl9lcnIoZGV2LCAiUlg6IEhXIEJVRz8gemVybyBwYXlsb2FkIHBhY2tldHMgaW4gbWVzc2FnZVxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCWlmIChsZTE2X3RvX2NwdShtc2dfaGRyLT5udW1fcGxzKSA+IEkyNDAwTV9NQVhfUExTX0lOX01TRykgeworCQlkZXZfZXJyKGRldiwgIlJYOiBIVyBCVUc/IG1lc3NhZ2UgY29udGFpbnMgbW9yZSBwYXlsb2FkICIKKwkJCSJ0aGFuIG1heGltdW07IGlnbm9yaW5nLlxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCXJlc3VsdCA9IDA7CitlcnJvcjoKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKiBDaGVjayBhIHBheWxvYWQgZGVzY3JpcHRvciBhZ2FpbnN0IHRoZSByZWNlaXZlZCBkYXRhCisgKgorICogQGkyNDAwbTogZGV2aWNlIGRlc2NyaXB0b3IKKyAqIEBwbGQ6IHBheWxvYWQgZGVzY3JpcHRvcgorICogQHBsX2l0cjogb2Zmc2V0IChpbiBieXRlcykgaW4gdGhlIHJlY2VpdmVkIGJ1ZmZlciB0aGUgcGF5bG9hZCBpcworICogICAgICAgICAgbG9jYXRlZAorICogQGJ1Zl9zaXplOiBzaXplIG9mIHRoZSByZWNlaXZlZCBidWZmZXIKKyAqCisgKiBHaXZlbiBhIHBheWxvYWQgZGVzY3JpcHRvciAocGFydCBvZiBhIFJYIGJ1ZmZlciksIGNoZWNrIGl0IGlzIHNhbmUKKyAqIGFuZCB0aGF0IHRoZSBkYXRhIGl0IGRlY2xhcmVzIGZpdHMgaW4gdGhlIGJ1ZmZlci4KKyAqLworc3RhdGljCitpbnQgaTI0MDBtX3J4X3BsX2Rlc2NyX2NoZWNrKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBpMjQwMG1fcGxkICpwbGQsCisJCQkgICAgICBzaXplX3QgcGxfaXRyLCBzaXplX3QgYnVmX3NpemUpCit7CisJaW50IHJlc3VsdCA9IC1FSU87CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXNpemVfdCBwbF9zaXplID0gaTI0MDBtX3BsZF9zaXplKHBsZCk7CisJZW51bSBpMjQwMG1fcHQgcGxfdHlwZSA9IGkyNDAwbV9wbGRfdHlwZShwbGQpOworCisJaWYgKHBsX3NpemUgPiBpMjQwMG0tPmJ1c19wbF9zaXplX21heCkgeworCQlkZXZfZXJyKGRldiwgIlJYOiBIVyBCVUc/IHBheWxvYWQgQCV6dTogc2l6ZSAlenUgaXMgIgorCQkJImJpZ2dlciB0aGFuIG1heGltdW0gJXp1OyBpZ25vcmluZyBtZXNzYWdlXG4iLAorCQkJcGxfaXRyLCBwbF9zaXplLCBpMjQwMG0tPmJ1c19wbF9zaXplX21heCk7CisJCWdvdG8gZXJyb3I7CisJfQorCWlmIChwbF9pdHIgKyBwbF9zaXplID4gYnVmX3NpemUpIHsJLyogZW5vdWdoPyAqLworCQlkZXZfZXJyKGRldiwgIlJYOiBIVyBCVUc/IHBheWxvYWQgQCV6dTogc2l6ZSAlenUgIgorCQkJImdvZXMgYmV5b25kIHRoZSByZWNlaXZlZCBidWZmZXIgIgorCQkJInNpemUgKCV6dSBieXRlcyk7IGlnbm9yaW5nIG1lc3NhZ2VcbiIsCisJCQlwbF9pdHIsIHBsX3NpemUsIGJ1Zl9zaXplKTsKKwkJZ290byBlcnJvcjsKKwl9CisJaWYgKHBsX3R5cGUgPj0gSTI0MDBNX1BUX0lMTEVHQUwpIHsKKwkJZGV2X2VycihkZXYsICJSWDogSFcgQlVHPyBpbGxlZ2FsIHBheWxvYWQgdHlwZSAldTsgIgorCQkJImlnbm9yaW5nIG1lc3NhZ2VcbiIsIHBsX3R5cGUpOworCQlnb3RvIGVycm9yOworCX0KKwlyZXN1bHQgPSAwOworZXJyb3I6CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKioKKyAqIGkyNDAwbV9yeCAtIFJlY2VpdmUgYSBidWZmZXIgb2YgZGF0YSBmcm9tIHRoZSBkZXZpY2UKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcgorICogQHNrYjogc2tidWZmIHdoZXJlIHRoZSBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkCisgKgorICogUGFyc2UgaW4gYSBidWZmZXIgb2YgZGF0YSB0aGF0IGNvbnRhaW5zIGFuIFJYIG1lc3NhZ2Ugc2VudCBmcm9tIHRoZQorICogZGV2aWNlLiBTZWUgdGhlIGZpbGUgaGVhZGVyIGZvciB0aGUgZm9ybWF0LiBSdW4gYWxsIGNoZWNrcyBvbiB0aGUKKyAqIGJ1ZmZlciBoZWFkZXIsIHRoZW4gcnVuIG92ZXIgZWFjaCBwYXlsb2FkJ3MgZGVzY3JpcHRvcnMsIHZlcmlmeQorICogdGhlaXIgY29uc2lzdGVuY3kgYW5kIGFjdCBvbiBlYWNoIHBheWxvYWQncyBjb250ZW50cy4gIElmCisgKiBldmVyeXRoaW5nIGlzIHN1Y2Nlc2Z1bCwgdXBkYXRlIHRoZSBkZXZpY2UncyBzdGF0aXN0aWNzLgorICoKKyAqIE5vdGU6IFlvdSBuZWVkIHRvIHNldCB0aGUgc2tiIHRvIGNvbnRhaW4gb25seSB0aGUgbGVuZ3RoIG9mIHRoZQorICogcmVjZWl2ZWQgYnVmZmVyOyBmb3IgdGhhdCwgdXNlIHNrYl90cmltKHNrYiwgUkVDRUlWRURfU0laRSkuCisgKgorICogUmV0dXJuczoKKyAqCisgKiAwIGlmIG9rLCA8IDAgZXJybm8gb24gZXJyb3IKKyAqCisgKiBJZiBvaywgdGhpcyBmdW5jdGlvbiBvd25zIG5vdyB0aGUgc2tiIGFuZCB0aGUgY2FsbGVyIERPRVNOJ1QgaGF2ZQorICogdG8gcnVuIGtmcmVlX3NrYigpIG9uIGl0LiBIb3dldmVyLCBvbiBlcnJvciwgdGhlIGNhbGxlciBzdGlsbCBvd25zCisgKiB0aGUgc2tiIGFuZCBpdCBpcyByZXNwb25zaWJsZSBmb3IgcmVsZWFzaW5nIGl0LgorICovCitpbnQgaTI0MDBtX3J4KHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgaSwgcmVzdWx0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwljb25zdCBzdHJ1Y3QgaTI0MDBtX21zZ19oZHIgKm1zZ19oZHI7CisJc2l6ZV90IHBsX2l0ciwgcGxfc2l6ZSwgc2tiX2xlbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIG51bV9wbHM7CisKKwlza2JfbGVuID0gc2tiLT5sZW47CisJZF9mbnN0YXJ0KDQsIGRldiwgIihpMjQwMG0gJXAgc2tiICVwIFtzaXplICV6dV0pXG4iLAorCQkgIGkyNDAwbSwgc2tiLCBza2JfbGVuKTsKKwlyZXN1bHQgPSAtRUlPOworCW1zZ19oZHIgPSAodm9pZCAqKSBza2ItPmRhdGE7CisJcmVzdWx0ID0gaTI0MDBtX3J4X21zZ19oZHJfY2hlY2soaTI0MDBtLCBtc2dfaGRyLCBza2ItPmxlbik7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gZXJyb3JfbXNnX2hkcl9jaGVjazsKKwlyZXN1bHQgPSAtRUlPOworCW51bV9wbHMgPSBsZTE2X3RvX2NwdShtc2dfaGRyLT5udW1fcGxzKTsKKwlwbF9pdHIgPSBzaXplb2YoKm1zZ19oZHIpICsJLyogQ2hlY2sgcGF5bG9hZCBkZXNjcmlwdG9yKHMpICovCisJCW51bV9wbHMgKiBzaXplb2YobXNnX2hkci0+cGxkWzBdKTsKKwlwbF9pdHIgPSBBTElHTihwbF9pdHIsIEkyNDAwTV9QTF9QQUQpOworCWlmIChwbF9pdHIgPiBza2ItPmxlbikgewkvKiBnb3QgYWxsIHRoZSBwYXlsb2FkIGRlc2NyaXB0b3JzPyAqLworCQlkZXZfZXJyKGRldiwgIlJYOiBIVyBCVUc/IG1lc3NhZ2UgdG9vIHNob3J0ICgldSBieXRlcykgZm9yICIKKwkJCSIldSBwYXlsb2FkIGRlc2NyaXB0b3JzICglenUgZWFjaCwgdG90YWwgJXp1KVxuIiwKKwkJCXNrYi0+bGVuLCBudW1fcGxzLCBzaXplb2YobXNnX2hkci0+cGxkWzBdKSwgcGxfaXRyKTsKKwkJZ290byBlcnJvcl9wbF9kZXNjcl9zaG9ydDsKKwl9CisJLyogV2FsayBlYWNoIHBheWxvYWQgcGF5bG9hZC0tY2hlY2sgd2UgcmVhbGx5IGdvdCBpdCAqLworCWZvciAoaSA9IDA7IGkgPCBudW1fcGxzOyBpKyspIHsKKwkJLyogd29yayBhcm91bmQgb2xkIGdjYyB3YXJuaW5ncyAqLworCQlwbF9zaXplID0gaTI0MDBtX3BsZF9zaXplKCZtc2dfaGRyLT5wbGRbaV0pOworCQlyZXN1bHQgPSBpMjQwMG1fcnhfcGxfZGVzY3JfY2hlY2soaTI0MDBtLCAmbXNnX2hkci0+cGxkW2ldLAorCQkJCQkJICBwbF9pdHIsIHNrYi0+bGVuKTsKKwkJaWYgKHJlc3VsdCA8IDApCisJCQlnb3RvIGVycm9yX3BsX2Rlc2NyX2NoZWNrOworCQlpMjQwMG1fcnhfcGF5bG9hZChpMjQwMG0sIHNrYiwgbnVtX3BscyA9PSAxLCAmbXNnX2hkci0+cGxkW2ldLAorCQkJCSAgc2tiLT5kYXRhICsgcGxfaXRyKTsKKwkJcGxfaXRyICs9IEFMSUdOKHBsX3NpemUsIEkyNDAwTV9QTF9QQUQpOworCQljb25kX3Jlc2NoZWQoKTsJCS8qIERvbid0IG1vbm9wb2xpemUgKi8KKwl9CisJa2ZyZWVfc2tiKHNrYik7CisJLyogVXBkYXRlIGRldmljZSBzdGF0aXN0aWNzICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmkyNDAwbS0+cnhfbG9jaywgZmxhZ3MpOworCWkyNDAwbS0+cnhfcGxfbnVtICs9IGk7CisJaWYgKGkgPiBpMjQwMG0tPnJ4X3BsX21heCkKKwkJaTI0MDBtLT5yeF9wbF9tYXggPSBpOworCWlmIChpIDwgaTI0MDBtLT5yeF9wbF9taW4pCisJCWkyNDAwbS0+cnhfcGxfbWluID0gaTsKKwlpMjQwMG0tPnJ4X251bSsrOworCWkyNDAwbS0+cnhfc2l6ZV9hY2MgKz0gc2tiLT5sZW47CisJaWYgKHNrYi0+bGVuIDwgaTI0MDBtLT5yeF9zaXplX21pbikKKwkJaTI0MDBtLT5yeF9zaXplX21pbiA9IHNrYi0+bGVuOworCWlmIChza2ItPmxlbiA+IGkyNDAwbS0+cnhfc2l6ZV9tYXgpCisJCWkyNDAwbS0+cnhfc2l6ZV9tYXggPSBza2ItPmxlbjsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpMjQwMG0tPnJ4X2xvY2ssIGZsYWdzKTsKK2Vycm9yX3BsX2Rlc2NyX2NoZWNrOgorZXJyb3JfcGxfZGVzY3Jfc2hvcnQ6CitlcnJvcl9tc2dfaGRyX2NoZWNrOgorCWRfZm5lbmQoNCwgZGV2LCAiKGkyNDAwbSAlcCBza2IgJXAgW3NpemUgJXp1XSkgPSAlZFxuIiwKKwkJaTI0MDBtLCBza2IsIHNrYl9sZW4sIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGkyNDAwbV9yeCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vc2Rpby1kZWJ1Zy1sZXZlbHMuaCBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9zZGlvLWRlYnVnLWxldmVscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MTk5ODcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vc2Rpby1kZWJ1Zy1sZXZlbHMuaApAQCAtMCwwICsxLDIyIEBACisvKgorICogZGVidWcgbGV2ZWxzIGNvbnRyb2wgZmlsZSBmb3IgdGhlIGkyNDAwbSBtb2R1bGUncworICovCisjaWZuZGVmIF9fZGVidWdfbGV2ZWxzX19oX18KKyNkZWZpbmUgX19kZWJ1Z19sZXZlbHNfX2hfXworCisvKiBNYXhpbXVtIGNvbXBpbGUgYW5kIHJ1biB0aW1lIGRlYnVnIGxldmVsIGZvciBhbGwgc3VibW9kdWxlcyAqLworI2RlZmluZSBEX01PRFVMRU5BTUUgaTI0MDBtX3NkaW8KKyNkZWZpbmUgRF9NQVNURVIgQ09ORklHX1dJTUFYX0kyNDAwTV9ERUJVR19MRVZFTAorCisjaW5jbHVkZSA8bGludXgvd2ltYXgvZGVidWcuaD4KKworLyogTGlzdCBvZiBhbGwgdGhlIGVuYWJsZWQgbW9kdWxlcyAqLworZW51bSBkX21vZHVsZSB7CisJRF9TVUJNT0RVTEVfREVDTEFSRShtYWluKSwKKwlEX1NVQk1PRFVMRV9ERUNMQVJFKHR4KSwKKwlEX1NVQk1PRFVMRV9ERUNMQVJFKHJ4KSwKKwlEX1NVQk1PRFVMRV9ERUNMQVJFKGZ3KQorfTsKKworCisjZW5kaWYgLyogI2lmbmRlZiBfX2RlYnVnX2xldmVsc19faF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vc2Rpby1mdy5jIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3NkaW8tZncuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDg3MjA1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3NkaW8tZncuYwpAQCAtMCwwICsxLDIyNCBAQAorLyoKKyAqIEludGVsIFdpcmVsZXNzIFdpTUFYIENvbm5lY3Rpb24gMjQwMG0KKyAqIEZpcm13YXJlIHVwbG9hZGVyJ3MgU0RJTyBzcGVjaWZpY3MKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICoKKyAqIEludGVsIENvcnBvcmF0aW9uIDxsaW51eC13aW1heEBpbnRlbC5jb20+CisgKiBZYW5pciBMdWJldGtpbiA8eWFuaXJ4Lmx1YmV0a2luQGludGVsLmNvbT4KKyAqIEluYWt5IFBlcmV6LUdvbnphbGV6IDxpbmFreS5wZXJlei1nb256YWxlekBpbnRlbC5jb20+CisgKiAgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCisgKgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqICAtIEJ1cyBnZW5lcmljL3NwZWNpZmljIHNwbGl0IGZvciBVU0IKKyAqCisgKiBEaXJrIEJyYW5kZXdpZSA8ZGlyay5qLmJyYW5kZXdpZUBpbnRlbC5jb20+CisgKiAgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIGZvciBTRElPCisgKgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqICAtIFNESU8gcmVoYXNoIGZvciBjaGFuZ2VzIGluIHRoZSBidXMtZHJpdmVyIG1vZGVsCisgKgorICogVEhFIFBST0NFRFVSRQorICoKKyAqIFNlZSBmdy5jIGZvciB0aGUgZ2VuZXJpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIHByb2NlZHVyZS4KKyAqCisgKiBUaGlzIGZpbGUgaW1wbGVtZW50cyBvbmx5IHRoZSBTRElPIHNwZWNpZmljcy4gSXQgYm9pbHMgZG93biB0byBob3cKKyAqIHRvIHNlbmQgYSBjb21tYW5kIGFuZCB3YWl0aW5nIGZvciBhbiBhY2tub3dsZWRnZW1lbnQgZnJvbSB0aGUKKyAqIGRldmljZS4gV2UgZG8gcG9sbGVkIHJlYWRzLgorICoKKyAqIENPTU1BTkQgRVhFQ1VUSU9OCisgKgorICogVEhlIGdlbmVyaWMgZmlybXdhcmUgdXBsb2FkIGNvZGUgd2lsbCBjYWxsIGkyNDAwbV9idXNfYm1fY21kX3NlbmQoKQorICogdG8gc2VuZCBjb21tYW5kcy4KKyAqCisgKiBUaGUgU0RJTyBkZXZpY2VzIGV4cGVjdHMgdGhpbmdzIGluIDI1NiBieXRlIGJsb2Nrcywgc28gaXQgd2lsbCBwYWQKKyAqIGl0LCBjb21wdXRlIHRoZSBjaGVja3N1bSAoaWYgbmVlZGVkKSBhbmQgcGFzcyBpdCB0byBTRElPLgorICoKKyAqIEFDSyBSRUNFUFRJT04KKyAqCisgKiBUaGlzIHdvcmtzIGluIHBvbGxpbmcgbW9kZSAtLSB0aGUgZncgbG9hZGVyIHNheXMgd2hlbiB0byB3YWl0IGZvcgorICogZGF0YSBhbmQgZm9yIHRoYXQgaXQgY2FsbHMgaTI0MDBtc19idXNfYm1fd2FpdF9mb3JfYWNrKCkuCisgKgorICogVGhpcyB3aWxsIHBvbGwgdGhlIGRldmljZSBmb3IgZGF0YSB1bnRpbCBpdCBpcyByZWNlaXZlZC4gV2UgbmVlZCB0bworICogcmVjZWl2ZSBhdCBsZWFzdCBhcyBtdWNoIGJ5dGVzIGFzIHdoZXJlIGFza2VkIGZvciAoYWx0aG91Z2ggaXQnbGwKKyAqIGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mIDI1NiBieXRlcykuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tbWMvc2Rpb19mdW5jLmg+CisjaW5jbHVkZSAiaTI0MDBtLXNkaW8uaCIKKworCisjZGVmaW5lIERfU1VCTU9EVUxFIGZ3CisjaW5jbHVkZSAic2Rpby1kZWJ1Zy1sZXZlbHMuaCIKKworLyoKKyAqIFNlbmQgYSBib290LW1vZGUgY29tbWFuZCB0byB0aGUgU0RJTyBmdW5jdGlvbgorICoKKyAqIFdlIHVzZSBhIGJvdW5jZSBidWZmZXIgKGkyNDAwbS0+Ym1fY21kX2J1ZikgYmVjYXVzZSB3ZSBuZWVkIHRvCisgKiB0b3VjaCB0aGUgaGVhZGVyIGlmIHRoZSBSQVcgZmxhZyBpcyBub3Qgc2V0LgorICoKKyAqIEBmbGFnczogcGFzcyB0aHJ1IGZyb20gaTI0MDBtX2JtX2NtZCgpCisgKiBAcmV0dXJuOiBjbWRfc2l6ZSBpZiBvaywgPCAwIGVycm5vIGNvZGUgb24gZXJyb3IuCisgKgorICogTm90ZSB0aGUgY29tbWFuZCBpcyBwYWRkZWQgdG8gdGhlIFNESU8gYmxvY2sgc2l6ZSBmb3IgdGhlIGRldmljZS4KKyAqLworc3NpemVfdCBpMjQwMG1zX2J1c19ibV9jbWRfc2VuZChzdHJ1Y3QgaTI0MDBtICppMjQwMG0sCisJCQkJY29uc3Qgc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciAqX2NtZCwKKwkJCQlzaXplX3QgY21kX3NpemUsIGludCBmbGFncykKK3sKKwlzc2l6ZV90IHJlc3VsdDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJc3RydWN0IGkyNDAwbXMgKmkyNDAwbXMgPSBjb250YWluZXJfb2YoaTI0MDBtLCBzdHJ1Y3QgaTI0MDBtcywgaTI0MDBtKTsKKwlpbnQgb3Bjb2RlID0gX2NtZCA9PSBOVUxMID8gLTEgOiBpMjQwMG1fYnJoX2dldF9vcGNvZGUoX2NtZCk7CisJc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciAqY21kOworCS8qIFNESU8gcmVzdHJpY3Rpb24gKi8KKwlzaXplX3QgY21kX3NpemVfYSA9IEFMSUdOKGNtZF9zaXplLCBJMjQwME1TX0JMS19TSVpFKTsKKworCWRfZm5zdGFydCg1LCBkZXYsICIoaTI0MDBtICVwIGNtZCAlcCBzaXplICV6dSlcbiIsCisJCSAgaTI0MDBtLCBfY21kLCBjbWRfc2l6ZSk7CisJcmVzdWx0ID0gLUUyQklHOworCWlmIChjbWRfc2l6ZSA+IEkyNDAwTV9CTV9DTURfQlVGX1NJWkUpCisJCWdvdG8gZXJyb3JfdG9vX2JpZzsKKworCW1lbWNweShpMjQwMG0tPmJtX2NtZF9idWYsIF9jbWQsIGNtZF9zaXplKTsJLyogUHJlcCBjb21tYW5kICovCisJY21kID0gaTI0MDBtLT5ibV9jbWRfYnVmOworCWlmIChjbWRfc2l6ZV9hID4gY21kX3NpemUpCQkJLyogWmVybyBwYWQgc3BhY2UgKi8KKwkJbWVtc2V0KGkyNDAwbS0+Ym1fY21kX2J1ZiArIGNtZF9zaXplLCAwLCBjbWRfc2l6ZV9hIC0gY21kX3NpemUpOworCWlmICgoZmxhZ3MgJiBJMjQwME1fQk1fQ01EX1JBVykgPT0gMCkgeworCQlpZiAoV0FSTl9PTihpMjQwMG1fYnJoX2dldF9yZXNwb25zZV9yZXF1aXJlZChjbWQpID09IDApKQorCQkJZGV2X3dhcm4oZGV2LCAiU1cgQlVHOiByZXNwb25zZV9yZXF1aXJlZCA9PSAwXG4iKTsKKwkJaTI0MDBtX2JtX2NtZF9wcmVwYXJlKGNtZCk7CisJfQorCWRfcHJpbnRmKDQsIGRldiwgIkJNIGNtZCAlZDogJXp1IGJ5dGVzICglenUgcGFkZGVkKVxuIiwKKwkJIG9wY29kZSwgY21kX3NpemUsIGNtZF9zaXplX2EpOworCWRfZHVtcCg1LCBkZXYsIGNtZCwgY21kX3NpemUpOworCisJc2Rpb19jbGFpbV9ob3N0KGkyNDAwbXMtPmZ1bmMpOwkJCS8qIFNlbmQgJiBjaGVjayAqLworCXJlc3VsdCA9IHNkaW9fbWVtY3B5X3RvaW8oaTI0MDBtcy0+ZnVuYywgSTI0MDBNU19EQVRBX0FERFIsCisJCQkJICBpMjQwMG0tPmJtX2NtZF9idWYsIGNtZF9zaXplX2EpOworCXNkaW9fcmVsZWFzZV9ob3N0KGkyNDAwbXMtPmZ1bmMpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiQk0gY21kICVkOiBjYW5ub3Qgc2VuZDogJWxkXG4iLAorCQkJb3Bjb2RlLCAobG9uZykgcmVzdWx0KTsKKwkJZ290byBlcnJvcl9jbWRfc2VuZDsKKwl9CisJcmVzdWx0ID0gY21kX3NpemU7CitlcnJvcl9jbWRfc2VuZDoKK2Vycm9yX3Rvb19iaWc6CisJZF9mbmVuZCg1LCBkZXYsICIoaTI0MDBtICVwIGNtZCAlcCBzaXplICV6dSkgPSAlZFxuIiwKKwkJaTI0MDBtLCBfY21kLCBjbWRfc2l6ZSwgKGludCkgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKiBSZWFkIGFuIGFjayBmcm9tIHRoZSBkZXZpY2UncyBib290LW1vZGUgKHBvbGxpbmcpCisgKgorICogQGkyNDAwbToKKyAqIEBfYWNrOiBwb2ludGVyIHRvIHdoZXJlIHRvIHN0b3JlIHRoZSByZWFkIGRhdGEKKyAqIEBhY2tfc2l6ZTogaG93IG1hbnkgYnl0ZXMgd2Ugc2hvdWxkIHJlYWQKKyAqCisgKiBSZXR1cm5zOiA8IDAgZXJybm8gY29kZSBvbiBlcnJvcjsgb3RoZXJ3aXNlLCBhbW91bnQgb2YgcmVjZWl2ZWQgYnl0ZXMuCisgKgorICogVGhlIEFDSyBmb3IgYSBCTSBjb21tYW5kIGlzIGFsd2F5cyBhdCBsZWFzdCBzaXplb2YoKmFjaykgYnl0ZXMsIHNvCisgKiBjaGVjayBmb3IgdGhhdC4gV2UgZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgZGV2aWNlIHJlYm9vdHMKKyAqCisgKiBOT1RFOiBXZSBkbyBhbiBhcnRpZmljaWFsIHRpbWVvdXQgb2YgMSBzZWMgb3ZlciB0aGUgU0RJTyB0aW1lb3V0OworICogICAgIHRoaXMgd2F5IHdlIGhhdmUgY29udHJvbCBvdmVyIGl0Li4udGhlcmUgaXMgbm8gd2F5IHRoYXQgSSBrbm93CisgKiAgICAgb2Ygc2V0dGluZyBhbiBTRElPIHRyYW5zYWN0aW9uIHRpbWVvdXQuCisgKi8KK3NzaXplX3QgaTI0MDBtc19idXNfYm1fd2FpdF9mb3JfYWNrKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwKKwkJCQkgICAgc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciAqYWNrLAorCQkJCSAgICBzaXplX3QgYWNrX3NpemUpCit7CisJaW50IHJlc3VsdDsKKwlzc2l6ZV90IHJ4X3NpemU7CisJdTY0IHRpbWVvdXQ7CisJc3RydWN0IGkyNDAwbXMgKmkyNDAwbXMgPSBjb250YWluZXJfb2YoaTI0MDBtLCBzdHJ1Y3QgaTI0MDBtcywgaTI0MDBtKTsKKwlzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jID0gaTI0MDBtcy0+ZnVuYzsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZnVuYy0+ZGV2OworCisJQlVHX09OKHNpemVvZigqYWNrKSA+IGFja19zaXplKTsKKworCWRfZm5zdGFydCg1LCBkZXYsICIoaTI0MDBtICVwIGFjayAlcCBzaXplICV6dSlcbiIsCisJCSAgaTI0MDBtLCBhY2ssIGFja19zaXplKTsKKworCXRpbWVvdXQgPSBnZXRfamlmZmllc182NCgpICsgMiAqIEhaOworCXNkaW9fY2xhaW1faG9zdChmdW5jKTsKKwl3aGlsZSAoMSkgeworCQlpZiAodGltZV9hZnRlcjY0KGdldF9qaWZmaWVzXzY0KCksIHRpbWVvdXQpKSB7CisJCQlyeF9zaXplID0gLUVUSU1FRE9VVDsKKwkJCWRldl9lcnIoZGV2LCAidGltZW91dCB3YWl0aW5nIGZvciBhY2sgZGF0YVxuIik7CisJCQlnb3RvIGVycm9yX3RpbWVkb3V0OworCQl9CisKKwkJLyogRmluZCB0aGUgUlggc2l6ZSwgY2hlY2sgaWYgaXQgZml0cyBvciBub3QgLS0gaXQgaWYKKwkJICogZG9lc24ndCBmaXQsIGZhaWwsIGFzIHdlIGhhdmUgbm8gd2F5IHRvIGRpc3Bvc2Ugb2YKKwkJICogdGhlIGV4dHJhIGRhdGEuICovCisJCXJ4X3NpemUgPSBfX2kyNDAwbXNfcnhfZ2V0X3NpemUoaTI0MDBtcyk7CisJCWlmIChyeF9zaXplIDwgMCkKKwkJCWdvdG8gZXJyb3JfcnhfZ2V0X3NpemU7CisJCXJlc3VsdCA9IC1FTk9TUEM7CQkvKiBDaGVjayBpdCBmaXRzICovCisJCWlmIChyeF9zaXplIDwgc2l6ZW9mKCphY2spKSB7CisJCQlyeF9zaXplID0gLUVJTzsKKwkJCWRldl9lcnIoZGV2LCAiSFcgQlVHPyByZWNlaXZlZCBpcyB0b28gc21hbGwgKCV6dSB2cyAiCisJCQkJIiV6dSBuZWVkZWQpXG4iLCBzaXplb2YoKmFjayksIHJ4X3NpemUpOworCQkJZ290byBlcnJvcl90b29fc21hbGw7CisJCX0KKwkJaWYgKHJ4X3NpemUgPiBJMjQwME1fQk1fQUNLX0JVRl9TSVpFKSB7CisJCQlkZXZfZXJyKGRldiwgIlNXIEJVRz8gQk1fQUNLX0JVRiBpcyB0b28gc21hbGwgKCV1IHZzICIKKwkJCQkiJXp1IG5lZWRlZClcbiIsIEkyNDAwTV9CTV9BQ0tfQlVGX1NJWkUsCisJCQkJcnhfc2l6ZSk7CisJCQlnb3RvIGVycm9yX3Rvb19zbWFsbDsKKwkJfQorCisJCS8qIFJlYWQgaXQgKi8KKwkJcmVzdWx0ID0gc2Rpb19tZW1jcHlfZnJvbWlvKGZ1bmMsIGkyNDAwbS0+Ym1fYWNrX2J1ZiwKKwkJCQkJICAgIEkyNDAwTVNfREFUQV9BRERSLCByeF9zaXplKTsKKwkJaWYgKHJlc3VsdCA9PSAtRVRJTUVET1VUIHx8IHJlc3VsdCA9PSAtRVRJTUUpCisJCQljb250aW51ZTsKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCWRldl9lcnIoZGV2LCAiQk0gU0RJTyByZWNlaXZlICglenUgQikgZmFpbGVkOiAlZFxuIiwKKwkJCQlyeF9zaXplLCByZXN1bHQpOworCQkJZ290byBlcnJvcl9yZWFkOworCQl9IGVsc2UKKwkJCWJyZWFrOworCX0KKwlyeF9zaXplID0gbWluKChzc2l6ZV90KWFja19zaXplLCByeF9zaXplKTsKKwltZW1jcHkoYWNrLCBpMjQwMG0tPmJtX2Fja19idWYsIHJ4X3NpemUpOworZXJyb3JfcmVhZDoKK2Vycm9yX3Rvb19zbWFsbDoKK2Vycm9yX3J4X2dldF9zaXplOgorZXJyb3JfdGltZWRvdXQ6CisJc2Rpb19yZWxlYXNlX2hvc3QoZnVuYyk7CisJZF9mbmVuZCg1LCBkZXYsICIoaTI0MDBtICVwIGFjayAlcCBzaXplICV6dSkgPSAlbGRcbiIsCisJCWkyNDAwbSwgYWNrLCBhY2tfc2l6ZSwgKGxvbmcpIHJ4X3NpemUpOworCXJldHVybiByeF9zaXplOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3NkaW8tcnguYyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9zZGlvLXJ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMwMDhiOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9zZGlvLXJ4LmMKQEAgLTAsMCArMSwyNTUgQEAKKy8qCisgKiBJbnRlbCBXaXJlbGVzcyBXaU1BWCBDb25uZWN0aW9uIDI0MDBtCisgKiBTRElPIFJYIGhhbmRsaW5nCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqCisgKiBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogRGlyayBCcmFuZGV3aWUgPGRpcmsuai5icmFuZGV3aWVAaW50ZWwuY29tPgorICogIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICoKKyAqCisgKiBUaGlzIGhhbmRsZXMgdGhlIFJYIHBhdGggb24gU0RJTy4KKyAqCisgKiBUaGUgU0RJTyBidXMgZHJpdmVyIGNhbGxzIHRoZSAiaXJxIiByb3V0aW5lIHdoZW4gZGF0YSBpcyBhdmFpbGFibGUuCisgKiBUaGlzIGlzIG5vdCBhIHRyYWRpdGlvbmFsIGludGVycnVwdCByb3V0aW5lIHNpbmNlIHRoZSBTRElPIGJ1cworICogZHJpdmVyIGNhbGxzIHVzIGZyb20gaXRzIGlycSB0aHJlYWQgY29udGV4dC4gIEJlY2F1c2Ugb2YgdGhpcworICogc2xlZXBpbmcgaW4gdGhlIFNESU8gUlggSVJRIHJvdXRpbmUgaXMgb2theS4KKyAqCisgKiBGcm9tIHRoZXJlIG9uLCB3ZSBvYnRhaW4gdGhlIHNpemUgb2YgdGhlIGRhdGEgdGhhdCBpcyBhdmFpbGFibGUsCisgKiBhbGxvY2F0ZSBhbiBza2IsIGNvcHkgaXQgYW5kIHRoZW4gcGFzcyBpdCB0byB0aGUgZ2VuZXJpYyBkcml2ZXIncworICogUlggcm91dGluZSBbaTI0MDBtX3J4KCldLgorICoKKyAqIFJPQURNQVAKKyAqCisgKiBpMjQwMG1zX2lycSgpCisgKiAgIGkyNDAwbXNfcngoKQorICogICAgIF9faTI0MDBtc19yeF9nZXRfc2l6ZSgpCisgKiAgICAgaTI0MDBtX3J4KCkKKyAqCisgKiBpMjQwMG1zX3J4X3NldHVwKCkKKyAqCisgKiBpMjQwMG1zX3J4X3JlbGVhc2UoKQorICovCisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L21tYy9zZGlvLmg+CisjaW5jbHVkZSA8bGludXgvbW1jL3NkaW9fZnVuYy5oPgorI2luY2x1ZGUgImkyNDAwbS1zZGlvLmgiCisKKyNkZWZpbmUgRF9TVUJNT0RVTEUgcngKKyNpbmNsdWRlICJzZGlvLWRlYnVnLWxldmVscy5oIgorCisKKy8qCisgKiBSZWFkIGFuZCByZXR1cm4gdGhlIGFtb3VudCBvZiBieXRlcyBhdmFpbGFibGUgZm9yIFJYCisgKgorICogVGhlIFJYIHNpemUgaGFzIHRvIGJlIHJlYWQgbGlrZSB0aGlzOiBieXRlIHJlYWRzIG9mIHRocmVlCisgKiBzZXF1ZW50aWFsIGxvY2F0aW9uczsgdGhlbiBnbHVlJ2VtIHRvZ2V0aGVyLgorICoKKyAqIHNkaW9fcmVhZGwoKSBkb2Vzbid0IHdvcmsuCisgKi8KK3NzaXplX3QgX19pMjQwMG1zX3J4X2dldF9zaXplKHN0cnVjdCBpMjQwMG1zICppMjQwMG1zKQoreworCWludCByZXQsIGNudCwgdmFsOworCXNzaXplX3Qgcnhfc2l6ZTsKKwl1bnNpZ25lZCB4ZmVyX3NpemVfYWRkcjsKKwlzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jID0gaTI0MDBtcy0+ZnVuYzsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaTI0MDBtcy0+ZnVuYy0+ZGV2OworCisJZF9mbnN0YXJ0KDcsIGRldiwgIihpMjQwMG1zICVwKVxuIiwgaTI0MDBtcyk7CisJeGZlcl9zaXplX2FkZHIgPSBJMjQwME1TX0lOVFJfR0VUX1NJWkVfQUREUjsKKwlyeF9zaXplID0gMDsKKwlmb3IgKGNudCA9IDA7IGNudCA8IDM7IGNudCsrKSB7CisJCXZhbCA9IHNkaW9fcmVhZGIoZnVuYywgeGZlcl9zaXplX2FkZHIgKyBjbnQsICZyZXQpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihkZXYsICJSWDogQ2FuJ3QgcmVhZCBieXRlICVkIG9mIFJYIHNpemUgZnJvbSAiCisJCQkJIjB4JTA4eDogJWRcbiIsIGNudCwgeGZlcl9zaXplX2FkZHIgKyBjbnQsIHJldCk7CisJCQlyeF9zaXplID0gcmV0OworCQkJZ290byBlcnJvcl9yZWFkOworCQl9CisJCXJ4X3NpemUgPSByeF9zaXplIDw8IDggfCAodmFsICYgMHhmZik7CisJfQorCWRfcHJpbnRmKDYsIGRldiwgIlJYOiByeF9zaXplIGlzICVsZFxuIiwgKGxvbmcpIHJ4X3NpemUpOworZXJyb3JfcmVhZDoKKwlkX2ZuZW5kKDcsIGRldiwgIihpMjQwMG1zICVwKSA9ICVsZFxuIiwgaTI0MDBtcywgKGxvbmcpIHJ4X3NpemUpOworCXJldHVybiByeF9zaXplOworfQorCisKKy8qCisgKiBSZWFkIGRhdGEgZnJvbSB0aGUgZGV2aWNlICh3aGVuIGluIG5vcm1hbCkKKyAqCisgKiBBbGxvY2F0ZSBhbiBTS0Igb2YgdGhlIHJpZ2h0IHNpemUsIHJlYWQgdGhlIGRhdGEgaW4gYW5kIHRoZW4KKyAqIGRlbGl2ZXIgaXQgdG8gdGhlIGdlbmVyaWMgbGF5ZXIuCisgKgorICogV2UgYWxzbyBjaGVjayBmb3IgYSByZWJvb3QgYmFya2VyLiBUaGF0IG1lYW5zIHRoZSBkZXZpY2UgZGllZCBhbmQKKyAqIHdlIGhhdmUgdG8gcmVib290IGl0LgorICovCitzdGF0aWMKK3ZvaWQgaTI0MDBtc19yeChzdHJ1Y3QgaTI0MDBtcyAqaTI0MDBtcykKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMgPSBpMjQwMG1zLT5mdW5jOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZmdW5jLT5kZXY7CisJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gJmkyNDAwbXMtPmkyNDAwbTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXNzaXplX3Qgcnhfc2l6ZTsKKworCWRfZm5zdGFydCg3LCBkZXYsICIoaTI0MDBtcyAlcClcbiIsIGkyNDAwbXMpOworCXJ4X3NpemUgPSBfX2kyNDAwbXNfcnhfZ2V0X3NpemUoaTI0MDBtcyk7CisJaWYgKHJ4X3NpemUgPCAwKSB7CisJCXJldCA9IHJ4X3NpemU7CisJCWdvdG8gZXJyb3JfZ2V0X3NpemU7CisJfQorCXJldCA9IC1FTk9NRU07CisJc2tiID0gYWxsb2Nfc2tiKHJ4X3NpemUsIEdGUF9BVE9NSUMpOworCWlmIChOVUxMID09IHNrYikgeworCQlkZXZfZXJyKGRldiwgIlJYOiB1bmFibGUgdG8gYWxsb2Mgc2tiXG4iKTsKKwkJZ290byBlcnJvcl9hbGxvY19za2I7CisJfQorCisJcmV0ID0gc2Rpb19tZW1jcHlfZnJvbWlvKGZ1bmMsIHNrYi0+ZGF0YSwKKwkJCQkgSTI0MDBNU19EQVRBX0FERFIsIHJ4X3NpemUpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiUlg6IFNESU8gZGF0YSByZWFkIGZhaWxlZDogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyb3JfbWVtY3B5X2Zyb21pbzsKKwl9CisJLyogQ2hlY2sgaWYgZGV2aWNlIGhhcyByZXNldCAqLworCWlmICghbWVtY21wKHNrYi0+ZGF0YSwgaTI0MDBtX05CT09UX0JBUktFUiwKKwkJICAgIHNpemVvZihpMjQwMG1fTkJPT1RfQkFSS0VSKSkKKwkgICAgfHwgIW1lbWNtcChza2ItPmRhdGEsIGkyNDAwbV9TQk9PVF9CQVJLRVIsCisJCSAgICAgICBzaXplb2YoaTI0MDBtX1NCT09UX0JBUktFUikpKSB7CisJCXJldCA9IGkyNDAwbV9kZXZfcmVzZXRfaGFuZGxlKGkyNDAwbSk7CisJCWtmcmVlX3NrYihza2IpOworCX0gZWxzZSB7CisJCXNrYl9wdXQoc2tiLCByeF9zaXplKTsKKwkJaTI0MDBtX3J4KGkyNDAwbSwgc2tiKTsKKwl9CisJZF9mbmVuZCg3LCBkZXYsICIoaTI0MDBtcyAlcCkgPSB2b2lkXG4iLCBpMjQwMG1zKTsKKwlyZXR1cm47CisKK2Vycm9yX21lbWNweV9mcm9taW86CisJa2ZyZWVfc2tiKHNrYik7CitlcnJvcl9hbGxvY19za2I6CitlcnJvcl9nZXRfc2l6ZToKKwlkX2ZuZW5kKDcsIGRldiwgIihpMjQwMG1zICVwKSA9ICVkXG4iLCBpMjQwMG1zLCByZXQpOworCXJldHVybjsKK30KKworCisvKgorICogUHJvY2VzcyBhbiBpbnRlcnJ1cHQgZnJvbSB0aGUgU0RJTyBjYXJkCisgKgorICogRklYTUU6IG5lZWQgdG8gcHJvY2VzcyBvdGhlciBldmVudHMgdGhhdCBhcmUgbm90IGp1c3QgcmVhZHktdG8tcmVhZAorICoKKyAqIENoZWNrcyB0aGVyZSBpcyBkYXRhIHJlYWR5IGFuZCB0aGVuIHByb2NlZWRzIHRvIHJlYWQgaXQuCisgKi8KK3N0YXRpYwordm9pZCBpMjQwMG1zX2lycShzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jKQoreworCWludCByZXQ7CisJc3RydWN0IGkyNDAwbXMgKmkyNDAwbXMgPSBzZGlvX2dldF9kcnZkYXRhKGZ1bmMpOworCXN0cnVjdCBpMjQwMG0gKmkyNDAwbSA9ICZpMjQwMG1zLT5pMjQwMG07CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmZ1bmMtPmRldjsKKwlpbnQgdmFsOworCisJZF9mbnN0YXJ0KDYsIGRldiwgIihpMjQwMG1zICVwKVxuIiwgaTI0MDBtcyk7CisJdmFsID0gc2Rpb19yZWFkYihmdW5jLCBJMjQwME1TX0lOVFJfU1RBVFVTX0FERFIsICZyZXQpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiUlg6IENhbid0IHJlYWQgaW50ZXJydXB0IHN0YXR1czogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyb3Jfbm9faXJxOworCX0KKwlpZiAoIXZhbCkgeworCQlkZXZfZXJyKGRldiwgIlJYOiBCVUc/IGdvdCBJUlEgYnV0IG5vIGludGVycnVwdCByZWFkeT9cbiIpOworCQlnb3RvIGVycm9yX25vX2lycTsKKwl9CisJc2Rpb193cml0ZWIoZnVuYywgMSwgSTI0MDBNU19JTlRSX0NMRUFSX0FERFIsICZyZXQpOworCWlmIChXQVJOX09OKGkyNDAwbS0+Ym9vdF9tb2RlICE9IDApKQorCQlkZXZfZXJyKGRldiwgIlJYOiBTVyBCVUc/IGJvb3QgbW9kZSBhbmQgSVJRIGlzIHVwP1xuIik7CisJZWxzZQorCQlpMjQwMG1zX3J4KGkyNDAwbXMpOworZXJyb3Jfbm9faXJxOgorCWRfZm5lbmQoNiwgZGV2LCAiKGkyNDAwbXMgJXApID0gdm9pZFxuIiwgaTI0MDBtcyk7CisJcmV0dXJuOworfQorCisKKy8qCisgKiBTZXR1cCBTRElPIFJYCisgKgorICogSG9va3MgdXAgdGhlIElSUSBoYW5kbGVyIGFuZCB0aGVuIGVuYWJsZXMgSVJRcy4KKyAqLworaW50IGkyNDAwbXNfcnhfc2V0dXAoc3RydWN0IGkyNDAwbXMgKmkyNDAwbXMpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jID0gaTI0MDBtcy0+ZnVuYzsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZnVuYy0+ZGV2OworCisJZF9mbnN0YXJ0KDUsIGRldiwgIihpMjQwMG1zICVwKVxuIiwgaTI0MDBtcyk7CisJc2Rpb19jbGFpbV9ob3N0KGZ1bmMpOworCXJlc3VsdCA9IHNkaW9fY2xhaW1faXJxKGZ1bmMsIGkyNDAwbXNfaXJxKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIkNhbm5vdCBjbGFpbSBJUlE6ICVkXG4iLCByZXN1bHQpOworCQlnb3RvIGVycm9yX2lycV9jbGFpbTsKKwl9CisJcmVzdWx0ID0gMDsKKwlzZGlvX3dyaXRlYihmdW5jLCAxLCBJMjQwME1TX0lOVFJfRU5BQkxFX0FERFIsICZyZXN1bHQpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCXNkaW9fcmVsZWFzZV9pcnEoZnVuYyk7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBpbnRlcnJ1cHRzICVkXG4iLCByZXN1bHQpOworCX0KK2Vycm9yX2lycV9jbGFpbToKKwlzZGlvX3JlbGVhc2VfaG9zdChmdW5jKTsKKwlkX2ZuZW5kKDUsIGRldiwgIihpMjQwMG1zICVwKSA9ICVkXG4iLCBpMjQwMG1zLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKworLyoKKyAqIFRlYXIgZG93biBTRElPIFJYCisgKgorICogRGlzYWJsZXMgSVJRcyBpbiB0aGUgZGV2aWNlIGFuZCByZW1vdmVzIHRoZSBJUlEgaGFuZGxlci4KKyAqLwordm9pZCBpMjQwMG1zX3J4X3JlbGVhc2Uoc3RydWN0IGkyNDAwbXMgKmkyNDAwbXMpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jID0gaTI0MDBtcy0+ZnVuYzsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZnVuYy0+ZGV2OworCisJZF9mbnN0YXJ0KDUsIGRldiwgIihpMjQwMG1zICVwKVxuIiwgaTI0MDBtcyk7CisJc2Rpb19jbGFpbV9ob3N0KGZ1bmMpOworCXNkaW9fd3JpdGViKGZ1bmMsIDAsIEkyNDAwTVNfSU5UUl9FTkFCTEVfQUREUiwgJnJlc3VsdCk7CisJc2Rpb19yZWxlYXNlX2lycShmdW5jKTsKKwlzZGlvX3JlbGVhc2VfaG9zdChmdW5jKTsKKwlkX2ZuZW5kKDUsIGRldiwgIihpMjQwMG1zICVwKSA9ICVkXG4iLCBpMjQwMG1zLCByZXN1bHQpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3NkaW8tdHguYyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9zZGlvLXR4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEwNWE1ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9zZGlvLXR4LmMKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBJbnRlbCBXaXJlbGVzcyBXaU1BWCBDb25uZWN0aW9uIDI0MDBtCisgKiBTRElPIFRYIHRyYW5zYWN0aW9uIGJhY2tlbmRzCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqCisgKiBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogRGlyayBCcmFuZGV3aWUgPGRpcmsuai5icmFuZGV3aWVAaW50ZWwuY29tPgorICogIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICoKKyAqCisgKiBUYWtlcyB0aGUgVFggbWVzc2FnZXMgaW4gdGhlIGkyNDAwbSdzIGRyaXZlciBUWCBGSUZPIGFuZCBzZW5kcyB0aGVtCisgKiB0byB0aGUgZGV2aWNlIHVudGlsIHRoZXJlIGFyZSBubyBtb3JlLgorICoKKyAqIElmIHdlIGZhaWwgc2VuZGluZyB0aGUgbWVzc2FnZSwgd2UganVzdCBkcm9wIGl0LiBUaGVyZSBpc24ndCBtdWNoCisgKiB3ZSBjYW4gZG8gYXQgdGhpcyBwb2ludC4gTW9zdCBvZiB0aGUgdHJhZmZpYyBpcyBuZXR3b3JrLCB3aGljaCBoYXMKKyAqIHJlY292ZXJ5IG1ldGhvZHMgZm9yIGRyb3BwZWQgcGFja2V0cy4KKyAqCisgKiBUaGUgU0RJTyBmdW5jdGlvbnMgYXJlIG5vdCBhdG9taWMsIHNvIHdlIGNhbid0IHJ1biBmcm9tIHRoZSBjb250ZXh0CisgKiB3aGVyZSBpMjQwMG0tPmJ1c190eF9raWNrKCkgW2kyNDAwbXNfYnVzX3R4X2tpY2soKV0gaXMgYmVpbmcgY2FsbGVkCisgKiAoc29tZSB0aW1lcyBhdG9taWMpLiBUaHVzLCB0aGUgYWN0dWFsIFRYIHdvcmsgaXMgZGVmZXJyZWQgdG8gYQorICogd29ya3F1ZXVlLgorICoKKyAqIFJPQURNQVAKKyAqCisgKiBpMjQwMG1zX2J1c190eF9raWNrKCkKKyAqICAgaTI0MDBtc190eF9zdWJtaXQoKSAgICAgW3Rocm91Z2ggd29ya3F1ZXVlXQorICoKKyAqIGkyNDAwbV90eF9zZXR1cCgpCisgKgorICogaTI0MDBtX3R4X3JlbGVhc2UoKQorICovCisjaW5jbHVkZSA8bGludXgvbW1jL3NkaW9fZnVuYy5oPgorI2luY2x1ZGUgImkyNDAwbS1zZGlvLmgiCisKKyNkZWZpbmUgRF9TVUJNT0RVTEUgdHgKKyNpbmNsdWRlICJzZGlvLWRlYnVnLWxldmVscy5oIgorCisKKy8qCisgKiBQdWxsIFRYIHRyYW5zYXRpb25zIGZyb20gdGhlIFRYIEZJRk8gYW5kIHNlbmQgdGhlbSB0byB0aGUgZGV2aWNlCisgKiB1bnRpbCB0aGVyZSBhcmUgbm8gbW9yZS4KKyAqLworc3RhdGljCit2b2lkIGkyNDAwbXNfdHhfc3VibWl0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd3MpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgaTI0MDBtcyAqaTI0MDBtcyA9IGNvbnRhaW5lcl9vZih3cywgc3RydWN0IGkyNDAwbXMsIHR4X3dvcmtlcik7CisJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gJmkyNDAwbXMtPmkyNDAwbTsKKwlzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jID0gaTI0MDBtcy0+ZnVuYzsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZnVuYy0+ZGV2OworCXN0cnVjdCBpMjQwMG1fbXNnX2hkciAqdHhfbXNnOworCXNpemVfdCB0eF9tc2dfc2l6ZTsKKworCWRfZm5zdGFydCg0LCBkZXYsICIoaTI0MDBtcyAlcCwgaTI0MDBtICVwKVxuIiwgaTI0MDBtcywgaTI0MDBtcyk7CisKKwl3aGlsZSAoTlVMTCAhPSAodHhfbXNnID0gaTI0MDBtX3R4X21zZ19nZXQoaTI0MDBtLCAmdHhfbXNnX3NpemUpKSkgeworCQlkX3ByaW50ZigyLCBkZXYsICJUWDogc3VibWl0dGluZyAlenUgYnl0ZXNcbiIsIHR4X21zZ19zaXplKTsKKwkJZF9kdW1wKDUsIGRldiwgdHhfbXNnLCB0eF9tc2dfc2l6ZSk7CisKKwkJc2Rpb19jbGFpbV9ob3N0KGZ1bmMpOworCQlyZXN1bHQgPSBzZGlvX21lbWNweV90b2lvKGZ1bmMsIDAsIHR4X21zZywgdHhfbXNnX3NpemUpOworCQlzZGlvX3JlbGVhc2VfaG9zdChmdW5jKTsKKworCQlpMjQwMG1fdHhfbXNnX3NlbnQoaTI0MDBtKTsKKworCQlpZiAocmVzdWx0IDwgMCkgeworCQkJZGV2X2VycihkZXYsICJUWDogY2Fubm90IHN1Ym1pdCBUWDsgdHhfbXNnIEAlenUgJXp1IEI6IgorCQkJCSIgJWRcbiIsICh2b2lkICopIHR4X21zZyAtIGkyNDAwbS0+dHhfYnVmLAorCQkJCXR4X21zZ19zaXplLCByZXN1bHQpOworCQl9CisKKwkJZF9wcmludGYoMiwgZGV2LCAiVFg6ICV6dWIgc3VibWl0dGVkXG4iLCB0eF9tc2dfc2l6ZSk7CisJfQorCisJZF9mbmVuZCg0LCBkZXYsICIoaTI0MDBtcyAlcCkgPSB2b2lkXG4iLCBpMjQwMG1zKTsKK30KKworCisvKgorICogVGhlIGdlbmVyaWMgZHJpdmVyIG5vdGlmaWVzIHVzIHRoYXQgdGhlcmUgaXMgZGF0YSByZWFkeSBmb3IgVFgKKyAqCisgKiBTY2hlZHVsZSBhIHJ1biBvZiBpMjQwMG1zX3R4X3N1Ym1pdCgpIHRvIGhhbmRsZSBpdC4KKyAqLwordm9pZCBpMjQwMG1zX2J1c190eF9raWNrKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSkKK3sKKwlzdHJ1Y3QgaTI0MDBtcyAqaTI0MDBtcyA9IGNvbnRhaW5lcl9vZihpMjQwMG0sIHN0cnVjdCBpMjQwMG1zLCBpMjQwMG0pOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpMjQwMG1zLT5mdW5jLT5kZXY7CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKGkyNDAwbSAlcCkgPSB2b2lkXG4iLCBpMjQwMG0pOworCisJLyogc2NoZWR1bGUgdHggd29yaywgdGhpcyBpcyBiZWNhdXNlIHR4IG1heSBibG9jaywgdGhlcmVmb3JlCisJICogaXQgaGFzIHRvIHJ1biBpbiBhIHRocmVhZCBjb250ZXh0LgorCSAqLworCXF1ZXVlX3dvcmsoaTI0MDBtcy0+dHhfd29ya3F1ZXVlLCAmaTI0MDBtcy0+dHhfd29ya2VyKTsKKworCWRfZm5lbmQoMywgZGV2LCAiKGkyNDAwbSAlcCkgPSB2b2lkXG4iLCBpMjQwMG0pOworfQorCitpbnQgaTI0MDBtc190eF9zZXR1cChzdHJ1Y3QgaTI0MDBtcyAqaTI0MDBtcykKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpMjQwMG1zLT5mdW5jLT5kZXY7CisJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gJmkyNDAwbXMtPmkyNDAwbTsKKworCWRfZm5zdGFydCg1LCBkZXYsICIoaTI0MDBtcyAlcClcbiIsIGkyNDAwbXMpOworCisJSU5JVF9XT1JLKCZpMjQwMG1zLT50eF93b3JrZXIsIGkyNDAwbXNfdHhfc3VibWl0KTsKKwlzbnByaW50ZihpMjQwMG1zLT50eF93cV9uYW1lLCBzaXplb2YoaTI0MDBtcy0+dHhfd3FfbmFtZSksCisJCSAiJXMtdHgiLCBpMjQwMG0tPndpbWF4X2Rldi5uYW1lKTsKKwlpMjQwMG1zLT50eF93b3JrcXVldWUgPQorCQljcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZShpMjQwMG1zLT50eF93cV9uYW1lKTsKKwlpZiAoTlVMTCA9PSBpMjQwMG1zLT50eF93b3JrcXVldWUpIHsKKwkJZGV2X2VycihkZXYsICJUWDogZmFpbGVkIHRvIGNyZWF0ZSB3b3JrcXVldWVcbiIpOworCQlyZXN1bHQgPSAtRU5PTUVNOworCX0gZWxzZQorCQlyZXN1bHQgPSAwOworCWRfZm5lbmQoNSwgZGV2LCAiKGkyNDAwbXMgJXApID0gJWRcbiIsIGkyNDAwbXMsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBpMjQwMG1zX3R4X3JlbGVhc2Uoc3RydWN0IGkyNDAwbXMgKmkyNDAwbXMpCit7CisJZGVzdHJveV93b3JrcXVldWUoaTI0MDBtcy0+dHhfd29ya3F1ZXVlKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9zZGlvLmMgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vc2Rpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZmEyODMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vc2Rpby5jCkBAIC0wLDAgKzEsNTExIEBACisvKgorICogSW50ZWwgV2lyZWxlc3MgV2lNQVggQ29ubmVjdGlvbiAyNDAwbQorICogTGludXggZHJpdmVyIG1vZGVsIGdsdWUgZm9yIHRoZSBTRElPIGRldmljZSwgcmVzZXQgJiBmdyB1cGxvYWQKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggSW50ZWwgQ29ycG9yYXRpb24gPGxpbnV4LXdpbWF4QGludGVsLmNvbT4KKyAqIERpcmsgQnJhbmRld2llIDxkaXJrLmouYnJhbmRld2llQGludGVsLmNvbT4KKyAqIEluYWt5IFBlcmV6LUdvbnphbGV6IDxpbmFreS5wZXJlei1nb256YWxlekBpbnRlbC5jb20+CisgKiBZYW5pciBMdWJldGtpbiA8eWFuaXJ4Lmx1YmV0a2luQGludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKgorICoKKyAqIFNlZSBpMjQwMG0tc2Rpby5oIGZvciBhIGdlbmVyYWwgZGVzY3JpcHRpb24gb2YgdGhpcyBkcml2ZXIuCisgKgorICogVGhpcyBmaWxlIGltcGxlbWVudHMgZHJpdmVyIG1vZGVsIGdsdWUsIGFuZCBob29rIHVwcyBmb3IgdGhlCisgKiBnZW5lcmljIGRyaXZlciB0byBpbXBsZW1lbnQgdGhlIGJ1cy1zcGVjaWZpYyBmdW5jdGlvbnMgKGRldmljZQorICogY29tbXVuaWNhdGlvbiBzZXR1cC90ZWFyIGRvd24sIGZpcm13YXJlIHVwbG9hZCBhbmQgcmVzZXR0aW5nKS4KKyAqCisgKiBST0FETUFQCisgKgorICogaTI0MDBtX3Byb2JlKCkKKyAqICAgYWxsb2NfbmV0ZGV2KCkKKyAqICAgICBpMjQwMG1zX25ldGRldl9zZXR1cCgpCisgKiAgICAgICBpMjQwMG1zX2luaXQoKQorICogICAgICAgaTI0MDBtX25ldGRldl9zZXR1cCgpCisgKiAgIGkyNDAwbXNfZW5hYmxlX2Z1bmN0aW9uKCkKKyAqICAgaTI0MDBtX3NldHVwKCkKKyAqCisgKiBpMjQwMG1fcmVtb3ZlKCkKKyAqICAgICBpMjQwMG1fcmVsZWFzZSgpCisgKiAgICAgZnJlZV9uZXRkZXYobmV0X2RldikKKyAqCisgKiBpMjQwMG1zX2J1c19yZXNldCgpICAgICAgICAgICAgQ2FsbGVkIGJ5IGkyNDAwbS0+YnVzX3Jlc2V0CisgKiAgIF9faTI0MDBtc19yZXNldCgpCisgKiAgICAgX19pMjQwMG1zX3NlbmRfYmFya2VyKCkKKyAqCisgKiBpMjQwMG1zX2J1c19kZXZfc3RhcnQoKSAgICAgICAgQ2FsbGVkIGJ5IGkyNDAwbV9kZXZfc3RhcnQoKSBbd2hvIGlzCisgKiAgIGkyNDAwbXNfdHhfc2V0dXAoKSAgICAgICAgICAgY2FsbGVkIGJ5IGkyNDAwbV9zZXR1cCgpXQorICogICBpMjQwMG1zX3J4X3NldHVwKCkKKyAqCisgKiBpMjQwMG1zX2J1c19kZXZfc3RvcCgpICAgICAgICAgQ2FsbGVkIGJ5IGkyNDAwbV9kZXZfc3RvcCgpIFt3aG8gaXMKKyAqICAgaTI0MDBtc19yeF9yZWxlYXNlKCkgICAgICAgICBpcyBjYWxsZWQgYnkgaTI0MDBtX3JlbGVhc2UoKV0KKyAqICAgaTI0MDBtc190eF9yZWxlYXNlKCkKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbWMvc2Rpby5oPgorI2luY2x1ZGUgPGxpbnV4L21tYy9zZGlvX2Z1bmMuaD4KKyNpbmNsdWRlICJpMjQwMG0tc2Rpby5oIgorI2luY2x1ZGUgPGxpbnV4L3dpbWF4L2kyNDAwbS5oPgorCisjZGVmaW5lIERfU1VCTU9EVUxFIG1haW4KKyNpbmNsdWRlICJzZGlvLWRlYnVnLWxldmVscy5oIgorCisvKiBJT0UgV2lNQVggZnVuY3Rpb24gdGltZW91dCBpbiBzZWNvbmRzICovCitzdGF0aWMgaW50IGlvZV90aW1lb3V0ID0gMjsKK21vZHVsZV9wYXJhbShpb2VfdGltZW91dCwgaW50LCAwKTsKKworLyogT3VyIGZpcm13YXJlIGZpbGUgbmFtZSAqLworI2RlZmluZSBJMjQwME1TX0ZXX0ZJTEVfTkFNRSAiaTI0MDBtLWZ3LXNkaW8tIiBJMjQwME1fRldfVkVSU0lPTiAiLnNiY2YiCisKKy8qCisgKiBFbmFibGUgdGhlIFNESU8gZnVuY3Rpb24KKyAqCisgKiBUcmllcyB0byBlbmFibGUgdGhlIFNESU8gZnVuY3Rpb247IG1pZ2h0IGZhaWwgaWYgaXQgaXMgc3RpbGwgbm90CisgKiByZWFkeSAoaW4gc29tZSBoYXJkd2FyZSwgdGhlIFNESU8gV2lNQVggZnVuY3Rpb24gaXMgb25seSBlbmFibGVkCisgKiB3aGVuIHdlIGFzayBpdCB0byBleHBsaWNpdGx5IGRvaW5nKS4gVHJpZXMgdW50aWwgYSB0aW1lb3V0IGlzCisgKiByZWFjaGVkLgorICoKKyAqIFRoZSByZXZlcnNlIG9mIHRoaXMgaXMuLi5zZGlvX2Rpc2FibGVfZnVuY3Rpb24oKQorICoKKyAqIFJldHVybnM6IDAgaWYgdGhlIFNESU8gZnVuY3Rpb24gd2FzIGVuYWJsZWQsIDwgMCBlcnJubyBjb2RlIG9uCisgKiAgICAgZXJyb3IgKC1FTk9ERVYgd2hlbiBpdCB3YXMgdW5hYmxlIHRvIGVuYWJsZSB0aGUgZnVuY3Rpb24pLgorICovCitzdGF0aWMKK2ludCBpMjQwMG1zX2VuYWJsZV9mdW5jdGlvbihzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jKQoreworCXU2NCB0aW1lb3V0OworCWludCBlcnI7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmZ1bmMtPmRldjsKKworCWRfZm5zdGFydCgzLCBkZXYsICIoZnVuYyAlcClcbiIsIGZ1bmMpOworCS8qIFNldHVwIHRpbWVvdXQgKEZJWE1FOiBUaGlzIG5lZWRzIHRvIHJlYWQgdGhlIENJUyB0YWJsZSB0bworCSAqIGdldCBhIHJlYWwgdGltZW91dCkgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIGRldmljZSB0byBzaWduYWwKKwkgKiBpdCBpcyByZWFkeSAqLworCXRpbWVvdXQgPSBnZXRfamlmZmllc182NCgpICsgaW9lX3RpbWVvdXQgKiBIWjsKKwllcnIgPSAtRU5PREVWOworCXdoaWxlIChlcnIgIT0gMCAmJiB0aW1lX2JlZm9yZTY0KGdldF9qaWZmaWVzXzY0KCksIHRpbWVvdXQpKSB7CisJCXNkaW9fY2xhaW1faG9zdChmdW5jKTsKKwkJZXJyID0gc2Rpb19lbmFibGVfZnVuYyhmdW5jKTsKKwkJaWYgKDAgPT0gZXJyKSB7CisJCQlzZGlvX3JlbGVhc2VfaG9zdChmdW5jKTsKKwkJCWRfcHJpbnRmKDIsIGRldiwgIlNESU8gZnVuY3Rpb24gZW5hYmxlZFxuIik7CisJCQlnb3RvIGZ1bmN0aW9uX2VuYWJsZWQ7CisJCX0KKwkJZF9wcmludGYoMiwgZGV2LCAiU0RJTyBmdW5jdGlvbiBmYWlsZWQgdG8gZW5hYmxlOiAlZFxuIiwgZXJyKTsKKwkJc2Rpb19kaXNhYmxlX2Z1bmMoZnVuYyk7CisJCXNkaW9fcmVsZWFzZV9ob3N0KGZ1bmMpOworCQltc2xlZXAoSTI0MDBNU19JTklUX1NMRUVQX0lOVEVSVkFMKTsKKwl9CisJLyogSWYgdGltZWQgb3V0LCBkZXZpY2UgaXMgbm90IHRoZXJlIHlldCAtLSBnZXQgLUVOT0RFViBzbworCSAqIHRoZSBkZXZpY2UgZHJpdmVyIGNvcmUgd2lsbCByZXRyeSBsYXRlciBvbi4gKi8KKwlpZiAoZXJyID09IC1FVElNRSkgeworCQlkZXZfZXJyKGRldiwgIkNhbid0IGVuYWJsZSBXaU1BWCBmdW5jdGlvbjsgIgorCQkJIiBoYXMgdGhlIGZ1bmN0aW9uIGJlZW4gZW5hYmxlZD9cbiIpOworCQllcnIgPSAtRU5PREVWOworCX0KK2Z1bmN0aW9uX2VuYWJsZWQ6CisJZF9mbmVuZCgzLCBkZXYsICIoZnVuYyAlcCkgPSAlZFxuIiwgZnVuYywgZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCisKKy8qCisgKiBTZXR1cCBkcml2ZXIgcmVzb3VyY2VzIG5lZWRlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBkZXZpY2UKKyAqCisgKiBUaGUgZncgbmVlZHMgc29tZSB0aW1lIHRvIHNldHRsZSwgYW5kIGl0IHdhcyBqdXN0IHVwbG9hZGVkLAorICogc28gZ2l2ZSBpdCBhIGJyZWFrIGZpcnN0LiBJJ2QgcHJlZmVyIHRvIGp1c3Qgd2FpdCBmb3IgdGhlIGRldmljZSB0bworICogc2VuZCBzb21ldGhpbmcsIGJ1dCBzZWVtcyB0aGUgcG9raW5nIHdlIGRvIHRvIGVuYWJsZSBTRElPIHN0dWZmCisgKiBpbnRlcmZlcmVzIHdpdGggaXQsIHNvIGp1c3QgZ2l2ZSBpdCBhIGJyZWFrIGJlZm9yZSBzdGFydGluZy4uLgorICovCitzdGF0aWMKK2ludCBpMjQwMG1zX2J1c19kZXZfc3RhcnQoc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGkyNDAwbXMgKmkyNDAwbXMgPSBjb250YWluZXJfb2YoaTI0MDBtLCBzdHJ1Y3QgaTI0MDBtcywgaTI0MDBtKTsKKwlzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jID0gaTI0MDBtcy0+ZnVuYzsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZnVuYy0+ZGV2OworCisJZF9mbnN0YXJ0KDMsIGRldiwgIihpMjQwMG0gJXApXG4iLCBpMjQwMG0pOworCW1zbGVlcCgyMDApOworCXJlc3VsdCA9IGkyNDAwbXNfcnhfc2V0dXAoaTI0MDBtcyk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gZXJyb3Jfcnhfc2V0dXA7CisJcmVzdWx0ID0gaTI0MDBtc190eF9zZXR1cChpMjQwMG1zKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBlcnJvcl90eF9zZXR1cDsKKwlkX2ZuZW5kKDMsIGRldiwgIihpMjQwMG0gJXApID0gJWRcbiIsIGkyNDAwbSwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworCisJaTI0MDBtc190eF9yZWxlYXNlKGkyNDAwbXMpOworZXJyb3JfdHhfc2V0dXA6CisJaTI0MDBtc19yeF9yZWxlYXNlKGkyNDAwbXMpOworZXJyb3Jfcnhfc2V0dXA6CisJZF9mbmVuZCgzLCBkZXYsICIoaTI0MDBtICVwKSA9IHZvaWRcbiIsIGkyNDAwbSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMKK3ZvaWQgaTI0MDBtc19idXNfZGV2X3N0b3Aoc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCXN0cnVjdCBpMjQwMG1zICppMjQwMG1zID0gY29udGFpbmVyX29mKGkyNDAwbSwgc3RydWN0IGkyNDAwbXMsIGkyNDAwbSk7CisJc3RydWN0IHNkaW9fZnVuYyAqZnVuYyA9IGkyNDAwbXMtPmZ1bmM7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmZ1bmMtPmRldjsKKworCWRfZm5zdGFydCgzLCBkZXYsICIoaTI0MDBtICVwKVxuIiwgaTI0MDBtKTsKKwlpMjQwMG1zX3J4X3JlbGVhc2UoaTI0MDBtcyk7CisJaTI0MDBtc190eF9yZWxlYXNlKGkyNDAwbXMpOworCWRfZm5lbmQoMywgZGV2LCAiKGkyNDAwbSAlcCkgPSB2b2lkXG4iLCBpMjQwMG0pOworfQorCisKKy8qCisgKiBTZW5kcyBhIGJhcmtlciBidWZmZXIgdG8gdGhlIGRldmljZQorICoKKyAqIFRoaXMgaGVscGVyIHdpbGwgYWxsb2NhdGUgYSBrbWFsbG9jZWQgYnVmZmVyIGFuZCB1c2UgaXQgdG8gdHJhbnNtaXQKKyAqICh0aGVuIGZyZWUgaXQpLiBSZWFzb24gZm9yIHRoaXMgaXMgdGhhdCB0aGUgU0RJTyBob3N0IGNvbnRyb2xsZXIKKyAqIGV4cGVjdHMgYWxpZ25tZW50ICh1bmtub3duIGV4YWN0bHkgd2hpY2gpIHdoaWNoIHRoZSBzdGFjayB3b24ndAorICogcmVhbGx5IHByb3ZpZGUgYW5kIGNlcnRhaW4gYXJjaGVzL2hvc3QtY29udHJvbGxlciBjb21iaW5hdGlvbnMKKyAqIGNhbm5vdCB1c2Ugc3RhY2svdm1hbGxvYy90ZXh0IGFyZWFzIGZvciBETUEgdHJhbnNmZXJzLgorICovCitzdGF0aWMKK2ludCBfX2kyNDAwbXNfc2VuZF9iYXJrZXIoc3RydWN0IGkyNDAwbXMgKmkyNDAwbXMsCisJCQkgIGNvbnN0IF9fbGUzMiAqYmFya2VyLCBzaXplX3QgYmFya2VyX3NpemUpCit7CisJaW50ICByZXQ7CisJc3RydWN0IHNkaW9fZnVuYyAqZnVuYyA9IGkyNDAwbXMtPmZ1bmM7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmZ1bmMtPmRldjsKKwl2b2lkICpidWZmZXI7CisKKwlyZXQgPSAtRU5PTUVNOworCWJ1ZmZlciA9IGttYWxsb2MoSTI0MDBNU19CTEtfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKGJ1ZmZlciA9PSBOVUxMKQorCQlnb3RvIGVycm9yX2t6YWxsb2M7CisKKwltZW1jcHkoYnVmZmVyLCBiYXJrZXIsIGJhcmtlcl9zaXplKTsKKwlzZGlvX2NsYWltX2hvc3QoZnVuYyk7CisJcmV0ID0gc2Rpb19tZW1jcHlfdG9pbyhmdW5jLCAwLCBidWZmZXIsIEkyNDAwTVNfQkxLX1NJWkUpOworCXNkaW9fcmVsZWFzZV9ob3N0KGZ1bmMpOworCisJaWYgKHJldCA8IDApCisJCWRfcHJpbnRmKDAsIGRldiwgIkU6IGJhcmtlciBlcnJvcjogJWRcbiIsIHJldCk7CisKKwlrZnJlZShidWZmZXIpOworZXJyb3Jfa3phbGxvYzoKKwlyZXR1cm4gcmV0OworfQorCisKKy8qCisgKiBSZXNldCBhIGRldmljZSBhdCBkaWZmZXJlbnQgbGV2ZWxzICh3YXJtLCBjb2xkIG9yIGJ1cykKKyAqCisgKiBAaTI0MDBtczogZGV2aWNlIGRlc2NyaXB0b3IKKyAqIEByZXNldF90eXBlOiBzb2Z0LCB3YXJtIG9yIGJ1cyByZXNldCAoSTI0MDBNX1JUX1dBUk0vU09GVC9CVVMpCisgKgorICogRklYTUU6IG5vdCB0ZXN0ZWQgLS0gbmVlZCB0byBjb25maXJtIGV4cGVjdGVkIGVmZmVjdHMKKyAqCisgKiBXYXJtIGFuZCBjb2xkIHJlc2V0cyBnZXQgYW4gU0RJTyByZXNldCBpZiB0aGV5IGZhaWwgKHVuaW1wbGVtZW50ZWQpCisgKgorICogV2FybSByZXNldDoKKyAqCisgKiBUaGUgZGV2aWNlIHdpbGwgYmUgZnVsbHkgcmVzZXQgaW50ZXJuYWxseSwgYnV0IHdvbid0IGJlCisgKiBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgVVNCIGJ1cyAoc28gbm8gcmVlbnVtZXJhdGlvbiB3aWxsCisgKiBoYXBwZW4pLiBGaXJtd2FyZSB1cGxvYWQgd2lsbCBiZSBuZWNjZXNzYXJ5LgorICoKKyAqIFRoZSBkZXZpY2Ugd2lsbCBzZW5kIGEgcmVib290IGJhcmtlciBpbiB0aGUgbm90aWZpY2F0aW9uIGVuZHBvaW50CisgKiB0aGF0IHdpbGwgdHJpZ2dlciB0aGUgZHJpdmVyIHRvIHJlaW5pdGlhbGl6ZSB0aGUgc3RhdGUKKyAqIGF1dG9tYXRpY2FsbHkgZnJvbSBub3RpZi5jOmkyNDAwbV9ub3RpZmljYXRpb25fZ3JvaygpIGludG8KKyAqIGkyNDAwbV9kZXZfYm9vdHN0cmFwX2RlbGF5ZWQoKS4KKyAqCisgKiBDb2xkIGFuZCBidXMgKFVTQikgcmVzZXQ6CisgKgorICogVGhlIGRldmljZSB3aWxsIGJlIGZ1bGx5IHJlc2V0IGludGVybmFsbHksIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZQorICogVVNCIGJ1cyBhbiBhIHJlZW51bWVyYXRpb24gd2lsbCBoYXBwZW4uIEZpcm13YXJlIHVwbG9hZCB3aWxsIGJlCisgKiBuZWNjZXNzYXJ5LiBUaHVzLCB3ZSBkb24ndCBkbyBhbnkgbG9ja2luZyBvciBzdHJ1Y3QKKyAqIHJlaW5pdGlhbGl6YXRpb24sIGFzIHdlIGFyZSBnb2luZyB0byBiZSBmdWxseSBkaXNjb25uZWN0ZWQgYW5kCisgKiByZWVudW1lcmF0ZWQuCisgKgorICogTm90ZSB3ZSBuZWVkIHRvIHJldHVybiAtRU5PREVWIGlmIGEgd2FybSByZXNldCB3YXMgcmVxdWVzdGVkIGFuZCB3ZQorICogaGFkIHRvIHJlc29ydCB0byBhIGJ1cyByZXNldC4gU2VlIGkyNDAwbV9vcF9yZXNldCgpLCB3aW1heF9yZXNldCgpCisgKiBhbmQgd2ltYXhfZGV2LT5vcF9yZXNldC4KKyAqCisgKiBXQVJOSU5HOiBubyBkcml2ZXIgc3RhdGUgc2F2ZWQvZml4ZWQKKyAqLworc3RhdGljCitpbnQgaTI0MDBtc19idXNfcmVzZXQoc3RydWN0IGkyNDAwbSAqaTI0MDBtLCBlbnVtIGkyNDAwbV9yZXNldF90eXBlIHJ0KQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGkyNDAwbXMgKmkyNDAwbXMgPQorCQljb250YWluZXJfb2YoaTI0MDBtLCBzdHJ1Y3QgaTI0MDBtcywgaTI0MDBtKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJc3RhdGljIGNvbnN0IF9fbGUzMiBpMjQwMG1fV0FSTV9CT09UX0JBUktFUls0XSA9IHsKKwkJX19jb25zdGFudF9jcHVfdG9fbGUzMihJMjQwME1fV0FSTV9SRVNFVF9CQVJLRVIpLAorCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKEkyNDAwTV9XQVJNX1JFU0VUX0JBUktFUiksCisJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoSTI0MDBNX1dBUk1fUkVTRVRfQkFSS0VSKSwKKwkJX19jb25zdGFudF9jcHVfdG9fbGUzMihJMjQwME1fV0FSTV9SRVNFVF9CQVJLRVIpLAorCX07CisJc3RhdGljIGNvbnN0IF9fbGUzMiBpMjQwMG1fQ09MRF9CT09UX0JBUktFUls0XSA9IHsKKwkJX19jb25zdGFudF9jcHVfdG9fbGUzMihJMjQwME1fQ09MRF9SRVNFVF9CQVJLRVIpLAorCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKEkyNDAwTV9DT0xEX1JFU0VUX0JBUktFUiksCisJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoSTI0MDBNX0NPTERfUkVTRVRfQkFSS0VSKSwKKwkJX19jb25zdGFudF9jcHVfdG9fbGUzMihJMjQwME1fQ09MRF9SRVNFVF9CQVJLRVIpLAorCX07CisKKwlpZiAocnQgPT0gSTI0MDBNX1JUX1dBUk0pCisJCXJlc3VsdCA9IF9faTI0MDBtc19zZW5kX2JhcmtlcihpMjQwMG1zLCBpMjQwMG1fV0FSTV9CT09UX0JBUktFUiwKKwkJCQkJICAgICAgIHNpemVvZihpMjQwMG1fV0FSTV9CT09UX0JBUktFUikpOworCWVsc2UgaWYgKHJ0ID09IEkyNDAwTV9SVF9DT0xEKQorCQlyZXN1bHQgPSBfX2kyNDAwbXNfc2VuZF9iYXJrZXIoaTI0MDBtcywgaTI0MDBtX0NPTERfQk9PVF9CQVJLRVIsCisJCQkJCSAgICAgICBzaXplb2YoaTI0MDBtX0NPTERfQk9PVF9CQVJLRVIpKTsKKwllbHNlIGlmIChydCA9PSBJMjQwME1fUlRfQlVTKSB7Citkb19idXNfcmVzZXQ6CisJCWRldl9lcnIoZGV2LCAiRklYTUU6IFNESU8gYnVzIHJlc2V0IG5vdCBpbXBsZW1lbnRlZFxuIik7CisJCXJlc3VsdCA9IHJ0ID09IEkyNDAwTV9SVF9XQVJNID8gLUVOT0RFViA6IC1FTk9TWVM7CisJfSBlbHNlCisJCUJVRygpOworCWlmIChyZXN1bHQgPCAwICYmIHJ0ICE9IEkyNDAwTV9SVF9CVVMpIHsKKwkJZGV2X2VycihkZXYsICIlcyByZXNldCBmYWlsZWQgKCVkKTsgdHJ5aW5nIFNESU8gcmVzZXRcbiIsCisJCQlydCA9PSBJMjQwME1fUlRfV0FSTSA/ICJ3YXJtIiA6ICJjb2xkIiwgcmVzdWx0KTsKKwkJcnQgPSBJMjQwME1fUlRfQlVTOworCQlnb3RvIGRvX2J1c19yZXNldDsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMKK3ZvaWQgaTI0MDBtc19uZXRkZXZfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gbmV0X2Rldl90b19pMjQwMG0obmV0X2Rldik7CisJc3RydWN0IGkyNDAwbXMgKmkyNDAwbXMgPSBjb250YWluZXJfb2YoaTI0MDBtLCBzdHJ1Y3QgaTI0MDBtcywgaTI0MDBtKTsKKwlpMjQwMG1zX2luaXQoaTI0MDBtcyk7CisJaTI0MDBtX25ldGRldl9zZXR1cChuZXRfZGV2KTsKK30KKworCisvKgorICogRGVidWcgbGV2ZWxzIGNvbnRyb2w7IHNlZSBkZWJ1Zy5oCisgKi8KK3N0cnVjdCBkX2xldmVsIERfTEVWRUxbXSA9IHsKKwlEX1NVQk1PRFVMRV9ERUZJTkUobWFpbiksCisJRF9TVUJNT0RVTEVfREVGSU5FKHR4KSwKKwlEX1NVQk1PRFVMRV9ERUZJTkUocngpLAorCURfU1VCTU9EVUxFX0RFRklORShmdyksCit9Oworc2l6ZV90IERfTEVWRUxfU0laRSA9IEFSUkFZX1NJWkUoRF9MRVZFTCk7CisKKworI2RlZmluZSBfX2RlYnVnZnNfcmVnaXN0ZXIocHJlZml4LCBuYW1lLCBwYXJlbnQpCQkJXAorZG8gewkJCQkJCQkJCVwKKwlyZXN1bHQgPSBkX2xldmVsX3JlZ2lzdGVyX2RlYnVnZnMocHJlZml4LCBuYW1lLCBwYXJlbnQpOwlcCisJaWYgKHJlc3VsdCA8IDApCQkJCQkJCVwKKwkJZ290byBlcnJvcjsJCQkJCQlcCit9IHdoaWxlICgwKQorCisKK3N0YXRpYworaW50IGkyNDAwbXNfZGVidWdmc19hZGQoc3RydWN0IGkyNDAwbXMgKmkyNDAwbXMpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBpMjQwMG1zLT5pMjQwMG0ud2ltYXhfZGV2LmRlYnVnZnNfZGVudHJ5OworCisJZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZGlyKCJpMjQwMG0tdXNiIiwgZGVudHJ5KTsKKwlyZXN1bHQgPSBQVFJfRVJSKGRlbnRyeSk7CisJaWYgKElTX0VSUihkZW50cnkpKSB7CisJCWlmIChyZXN1bHQgPT0gLUVOT0RFVikKKwkJCXJlc3VsdCA9IDA7CS8qIE5vIGRlYnVnZnMgc3VwcG9ydCAqLworCQlnb3RvIGVycm9yOworCX0KKwlpMjQwMG1zLT5kZWJ1Z2ZzX2RlbnRyeSA9IGRlbnRyeTsKKwlfX2RlYnVnZnNfcmVnaXN0ZXIoImRsXyIsIG1haW4sIGRlbnRyeSk7CisJX19kZWJ1Z2ZzX3JlZ2lzdGVyKCJkbF8iLCB0eCwgZGVudHJ5KTsKKwlfX2RlYnVnZnNfcmVnaXN0ZXIoImRsXyIsIHJ4LCBkZW50cnkpOworCV9fZGVidWdmc19yZWdpc3RlcigiZGxfIiwgZncsIGRlbnRyeSk7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGkyNDAwbXMtPmRlYnVnZnNfZGVudHJ5KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKiBQcm9iZSBhIGkyNDAwbSBpbnRlcmZhY2UgYW5kIHJlZ2lzdGVyIGl0CisgKgorICogQGZ1bmM6ICAgIFNESU8gZnVuY3Rpb24KKyAqIEBpZDogICAgICBTRElPIGRldmljZSBJRAorICogQHJldHVybnM6IDAgaWYgb2ssIDwgMCBlcnJubyBjb2RlIG9uIGVycm9yLgorICoKKyAqIEFsbG9jIGEgbmV0IGRldmljZSwgaW5pdGlhbGl6ZSB0aGUgYnVzLXNwZWNpZmljIGRldGFpbHMgYW5kIHRoZW4KKyAqIGNhbGxzIHRoZSBidXMtZ2VuZXJpYyBpbml0aWFsaXphdGlvbiByb3V0aW5lLiBUaGF0IHdpbGwgcmVnaXN0ZXIKKyAqIHRoZSB3aW1heCBhbmQgbmV0ZGV2IGRldmljZXMsIHVwbG9hZCB0aGUgZmlybXdhcmUgW3VzaW5nCisgKiBfYnVzX2JtXyooKV0sIGNhbGwgX2J1c19kZXZfc3RhcnQoKSB0byBmaW5hbGl6ZSB0aGUgc2V0dXAgb2YgdGhlCisgKiBjb21tdW5pY2F0aW9uIHdpdGggdGhlIGRldmljZSBhbmQgdGhlbiB3aWxsIHN0YXJ0IHRvIHRhbGsgdG8gaXQgdG8KKyAqIGZpbm5pc2ggc2V0dGluZyBpdCB1cC4KKyAqCisgKiBJbml0aWFsaXphdGlvbiBpcyB0cmlja3k7IHNvbWUgaW5zdGFuY2VzIG9mIHRoZSBodyBhcmUgcGFja2VkIHdpdGgKKyAqIG90aGVycyBpbiBhIHdheSB0aGF0IHJlcXVpcmVzIGEgdGhpcmQgZHJpdmVyIHRoYXQgZW5hYmxlcyB0aGUgV2lNQVgKKyAqIGZ1bmN0aW9uLiBJbiB0aG9zZSBjYXNlcywgd2UgY2FuJ3QgZW5hYmxlIHRoZSBTRElPIGZ1bmN0aW9uIGFuZAorICogd2UnbGwgcmV0dXJuIHdpdGggLUVOT0RFVi4gV2hlbiB0aGUgZHJpdmVyIHRoYXQgZW5hYmxlcyB0aGUgV2lNQVgKKyAqIGZ1bmN0aW9uIGRvZXMgaXRzIHRoaW5nLCBpdCBoYXMgdG8gZG8gYSBidXNfcmVzY2FuX2RldmljZXMoKSBvbiB0aGUKKyAqIFNESU8gYnVzIHNvIHRoaXMgZHJpdmVyIGlzIGNhbGxlZCBhZ2FpbiB0byBlbnVtZXJhdGUgdGhlIFdpTUFYCisgKiBmdW5jdGlvbi4KKyAqLworc3RhdGljCitpbnQgaTI0MDBtc19wcm9iZShzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jLAorCQkgIGNvbnN0IHN0cnVjdCBzZGlvX2RldmljZV9pZCAqaWQpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZnVuYy0+ZGV2OworCXN0cnVjdCBpMjQwMG0gKmkyNDAwbTsKKwlzdHJ1Y3QgaTI0MDBtcyAqaTI0MDBtczsKKworCS8qIEFsbG9jYXRlIGluc3RhbmNlIFtjYWxscyBpMjQwMG1fbmV0ZGV2X3NldHVwKCkgb24gaXRdLiAqLworCXJlc3VsdCA9IC1FTk9NRU07CisJbmV0X2RldiA9IGFsbG9jX25ldGRldihzaXplb2YoKmkyNDAwbXMpLCAid214JWQiLAorCQkJICAgICAgIGkyNDAwbXNfbmV0ZGV2X3NldHVwKTsKKwlpZiAobmV0X2RldiA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAibm8gbWVtb3J5IGZvciBuZXR3b3JrIGRldmljZSBpbnN0YW5jZVxuIik7CisJCWdvdG8gZXJyb3JfYWxsb2NfbmV0ZGV2OworCX0KKwlTRVRfTkVUREVWX0RFVihuZXRfZGV2LCBkZXYpOworCWkyNDAwbSA9IG5ldF9kZXZfdG9faTI0MDBtKG5ldF9kZXYpOworCWkyNDAwbXMgPSBjb250YWluZXJfb2YoaTI0MDBtLCBzdHJ1Y3QgaTI0MDBtcywgaTI0MDBtKTsKKwlpMjQwMG0tPndpbWF4X2Rldi5uZXRfZGV2ID0gbmV0X2RldjsKKwlpMjQwMG1zLT5mdW5jID0gZnVuYzsKKwlzZGlvX3NldF9kcnZkYXRhKGZ1bmMsIGkyNDAwbXMpOworCisJaTI0MDBtLT5idXNfdHhfYmxvY2tfc2l6ZSA9IEkyNDAwTVNfQkxLX1NJWkU7CisJaTI0MDBtLT5idXNfcGxfc2l6ZV9tYXggPSBJMjQwME1TX1BMX1NJWkVfTUFYOworCWkyNDAwbS0+YnVzX2Rldl9zdGFydCA9IGkyNDAwbXNfYnVzX2Rldl9zdGFydDsKKwlpMjQwMG0tPmJ1c19kZXZfc3RvcCA9IGkyNDAwbXNfYnVzX2Rldl9zdG9wOworCWkyNDAwbS0+YnVzX3R4X2tpY2sgPSBpMjQwMG1zX2J1c190eF9raWNrOworCWkyNDAwbS0+YnVzX3Jlc2V0ID0gaTI0MDBtc19idXNfcmVzZXQ7CisJaTI0MDBtLT5idXNfYm1fY21kX3NlbmQgPSBpMjQwMG1zX2J1c19ibV9jbWRfc2VuZDsKKwlpMjQwMG0tPmJ1c19ibV93YWl0X2Zvcl9hY2sgPSBpMjQwMG1zX2J1c19ibV93YWl0X2Zvcl9hY2s7CisJaTI0MDBtLT5idXNfZndfbmFtZSA9IEkyNDAwTVNfRldfRklMRV9OQU1FOworCWkyNDAwbS0+YnVzX2JtX21hY19hZGRyX2ltcGFpcmVkID0gMTsKKworCXJlc3VsdCA9IGkyNDAwbXNfZW5hYmxlX2Z1bmN0aW9uKGkyNDAwbXMtPmZ1bmMpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiQ2Fubm90IGVuYWJsZSBTRElPIGZ1bmN0aW9uOiAlZFxuIiwgcmVzdWx0KTsKKwkJZ290byBlcnJvcl9mdW5jX2VuYWJsZTsKKwl9CisKKwlzZGlvX2NsYWltX2hvc3QoZnVuYyk7CisJcmVzdWx0ID0gc2Rpb19zZXRfYmxvY2tfc2l6ZShmdW5jLCBJMjQwME1TX0JMS19TSVpFKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBzZXQgYmxvY2sgc2l6ZTogJWRcbiIsIHJlc3VsdCk7CisJCWdvdG8gZXJyb3Jfc2V0X2Jsa19zaXplOworCX0KKwlzZGlvX3JlbGVhc2VfaG9zdChmdW5jKTsKKworCXJlc3VsdCA9IGkyNDAwbV9zZXR1cChpMjQwMG0sIEkyNDAwTV9CUklfTk9fUkVCT09UKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImNhbm5vdCBzZXR1cCBkZXZpY2U6ICVkXG4iLCByZXN1bHQpOworCQlnb3RvIGVycm9yX3NldHVwOworCX0KKworCXJlc3VsdCA9IGkyNDAwbXNfZGVidWdmc19hZGQoaTI0MDBtcyk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJjYW5ub3QgY3JlYXRlIFNESU8gZGVidWdmczogJWRcbiIsCisJCQlyZXN1bHQpOworCQlnb3RvIGVycm9yX2RlYnVnZnNfYWRkOworCX0KKwlyZXR1cm4gMDsKKworZXJyb3JfZGVidWdmc19hZGQ6CisJaTI0MDBtX3JlbGVhc2UoaTI0MDBtKTsKK2Vycm9yX3NldHVwOgorCXNkaW9fc2V0X2RydmRhdGEoZnVuYywgTlVMTCk7CisJc2Rpb19jbGFpbV9ob3N0KGZ1bmMpOworZXJyb3Jfc2V0X2Jsa19zaXplOgorCXNkaW9fZGlzYWJsZV9mdW5jKGZ1bmMpOworCXNkaW9fcmVsZWFzZV9ob3N0KGZ1bmMpOworZXJyb3JfZnVuY19lbmFibGU6CisJZnJlZV9uZXRkZXYobmV0X2Rldik7CitlcnJvcl9hbGxvY19uZXRkZXY6CisJcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMKK3ZvaWQgaTI0MDBtc19yZW1vdmUoc3RydWN0IHNkaW9fZnVuYyAqZnVuYykKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZnVuYy0+ZGV2OworCXN0cnVjdCBpMjQwMG1zICppMjQwMG1zID0gc2Rpb19nZXRfZHJ2ZGF0YShmdW5jKTsKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0gPSAmaTI0MDBtcy0+aTI0MDBtOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gaTI0MDBtLT53aW1heF9kZXYubmV0X2RldjsKKworCWRfZm5zdGFydCgzLCBkZXYsICJTRElPIGZ1bmMgJXBcbiIsIGZ1bmMpOworCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShpMjQwMG1zLT5kZWJ1Z2ZzX2RlbnRyeSk7CisJaTI0MDBtX3JlbGVhc2UoaTI0MDBtKTsKKwlzZGlvX3NldF9kcnZkYXRhKGZ1bmMsIE5VTEwpOworCXNkaW9fY2xhaW1faG9zdChmdW5jKTsKKwlzZGlvX2Rpc2FibGVfZnVuYyhmdW5jKTsKKwlzZGlvX3JlbGVhc2VfaG9zdChmdW5jKTsKKwlmcmVlX25ldGRldihuZXRfZGV2KTsKKwlkX2ZuZW5kKDMsIGRldiwgIlNESU8gZnVuYyAlcFxuIiwgZnVuYyk7Cit9CisKK2VudW0geworCUkyNDAwTVNfSU5URUxfVklEID0gMHg4OSwKK307CisKK3N0YXRpYworY29uc3Qgc3RydWN0IHNkaW9fZGV2aWNlX2lkIGkyNDAwbXNfc2Rpb19pZHNbXSA9IHsKKwkvKiBJbnRlbDogaTI0MDBtIFdpTUFYIG92ZXIgU0RJTyAqLworCXsgU0RJT19ERVZJQ0UoSTI0MDBNU19JTlRFTF9WSUQsIDB4MTQwMikgfSwKKwl7IH0sIAkJCS8qIGVuZDogYWxsIHplcm9lcyAqLworfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoc2RpbywgaTI0MDBtc19zZGlvX2lkcyk7CisKKworc3RhdGljCitzdHJ1Y3Qgc2Rpb19kcml2ZXIgaTI0MDBtX3NkaW9fZHJpdmVyID0geworCS5uYW1lCQk9IEtCVUlMRF9NT0ROQU1FLAorCS5wcm9iZQkJPSBpMjQwMG1zX3Byb2JlLAorCS5yZW1vdmUJCT0gaTI0MDBtc19yZW1vdmUsCisJLmlkX3RhYmxlCT0gaTI0MDBtc19zZGlvX2lkcywKK307CisKKworc3RhdGljCitpbnQgX19pbml0IGkyNDAwbXNfZHJpdmVyX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc2Rpb19yZWdpc3Rlcl9kcml2ZXIoJmkyNDAwbV9zZGlvX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChpMjQwMG1zX2RyaXZlcl9pbml0KTsKKworCitzdGF0aWMKK3ZvaWQgX19leGl0IGkyNDAwbXNfZHJpdmVyX2V4aXQodm9pZCkKK3sKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwkvKiBmb3IgdGhlIHN0dWZmIHdlIHNjaGVkdWxlICovCisJc2Rpb191bnJlZ2lzdGVyX2RyaXZlcigmaTI0MDBtX3NkaW9fZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGkyNDAwbXNfZHJpdmVyX2V4aXQpOworCisKK01PRFVMRV9BVVRIT1IoIkludGVsIENvcnBvcmF0aW9uIDxsaW51eC13aW1heEBpbnRlbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkludGVsIDI0MDBNIFdpTUFYIG5ldHdvcmtpbmcgZm9yIFNESU8iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9GSVJNV0FSRShJMjQwME1TX0ZXX0ZJTEVfTkFNRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdHguYyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS90eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxM2E4OGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdHguYwpAQCAtMCwwICsxLDgxNyBAQAorLyoKKyAqIEludGVsIFdpcmVsZXNzIFdpTUFYIENvbm5lY3Rpb24gMjQwMG0KKyAqIEdlbmVyaWMgKG5vbi1idXMgc3BlY2lmaWMpIFRYIGhhbmRsaW5nCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqCisgKiBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogWWFuaXIgTHViZXRraW4gPHlhbmlyeC5sdWJldGtpbkBpbnRlbC5jb20+CisgKiAgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCisgKgorICogSW50ZWwgQ29ycG9yYXRpb24gPGxpbnV4LXdpbWF4QGludGVsLmNvbT4KKyAqIEluYWt5IFBlcmV6LUdvbnphbGV6IDxpbmFreS5wZXJlei1nb256YWxlekBpbnRlbC5jb20+CisgKiAgLSBSZXdyaXR0ZW4gdG8gdXNlIGEgc2luZ2xlIEZJRk8gdG8gbG93ZXIgdGhlIG1lbW9yeSBhbGxvY2F0aW9uCisgKiAgICBwcmVzc3VyZSBhbmQgb3B0aW1pemUgY2FjaGUgaGl0cyB3aGVuIGNvcHlpbmcgdG8gdGhlIHF1ZXVlLCBhcworICogICAgd2VsbCBhcyBzcGxpdHRpbmcgb3V0IGJ1cy1zcGVjaWZpYyBjb2RlLgorICoKKyAqCisgKiBJbXBsZW1lbnRzIGRhdGEgdHJhbnNtaXNzaW9uIHRvIHRoZSBkZXZpY2U7IHRoaXMgaXMgZG9uZSB0aHJvdWdoIGEKKyAqIHNvZnR3YXJlIEZJRk8sIGFzIGRhdGEvY29udHJvbCBmcmFtZXMgY2FuIGJlIGNvYWxlc2NlZCAod2hpbGUgdGhlCisgKiBkZXZpY2UgaXMgcmVhZGluZyB0aGUgcHJldmlvdXMgdHggdHJhbnNhY3Rpb24sIG90aGVycyBhY2N1bXVsYXRlKS4KKyAqCisgKiBBIEZJRk8gaXMgdXNlZCBiZWNhdXNlIGF0IHRoZSBlbmQgaXQgaXMgcmVzb3VyY2UtY2hlYXBlciB0aGF0IHRyeWluZworICogdG8gaW1wbGVtZW50IHNjYXR0ZXIvZ2F0aGVyIG92ZXIgVVNCLiBBcyB3ZWxsLCBtb3N0IHRyYWZmaWMgaXMgZ29pbmcKKyAqIHRvIGJlIGRvd25sb2FkICh2cyB1cGxvYWQpLgorICoKKyAqIFRoZSBmb3JtYXQgZm9yIHNlbmRpbmcvcmVjZWl2aW5nIGRhdGEgdG8vZnJvbSB0aGUgaTI0MDBtIGlzCisgKiBkZXNjcmliZWQgaW4gZGV0YWlsIGluIHJ4LmM6UFJPVE9DT0wgRk9STUFULiBJbiBoZXJlIHdlIGltcGxlbWVudAorICogdGhlIHRyYW5zbWlzc2lvbiBvZiB0aGF0LiBUaGlzIGlzIHNwbGl0IGJldHdlZW4gYSBidXMtaW5kZXBlbmRlbnQKKyAqIHBhcnQgdGhhdCBqdXN0IHByZXBhcmVzIGV2ZXJ5dGhpbmcgYW5kIGEgYnVzLXNwZWNpZmljIHBhcnQgdGhhdAorICogZG9lcyB0aGUgYWN0dWFsIHRyYW5zbWlzc2lvbiBvdmVyIHRoZSBidXMgdG8gdGhlIGRldmljZSAoaW4gdGhlCisgKiBidXMtc3BlY2lmaWMgZHJpdmVyKS4KKyAqCisgKgorICogVGhlIGdlbmVyYWwgZm9ybWF0IG9mIGEgZGV2aWNlLWhvc3QgdHJhbnNhY3Rpb24gaXMgTVNHLUhEUiwgUExEMSwKKyAqIFBMRDIuLi5QTEROLCBQTDEsIFBMMiwuLi5QTE4sIFBBRERJTkcuCisgKgorICogQmVjYXVzZSB3ZSBuZWVkIHRoZSBzZW5kIHBheWxvYWQgZGVzY3JpcHRvcnMgYW5kIHRoZW4gcGF5bG9hZHMgYW5kCisgKiBiZWNhdXNlIGl0IGlzIGtpbmQgb2YgZXhwZW5zaXZlIHRvIGRvIHNjYXR0ZXJsaXN0cyBpbiBVU0IgKG9uZSBVUkIKKyAqIHBlciBub2RlKSwgaXQgYmVjb21lcyBjaGVhcGVyIHRvIGFwcGVuZCBhbGwgdGhlIGRhdGEgdG8gYSBGSUZPCisgKiAoY29weWluZyB0byBhIEZJRk8gcG90ZW50aWFsbHkgaW4gY2FjaGUgaXMgY2hlYXBlcikuCisgKgorICogVGhlbiB0aGUgYnVzLXNwZWNpZmljIGNvZGUgdGFrZXMgdGhlIHBhcnRzIG9mIHRoYXQgRklGTyB0aGF0IGFyZQorICogd3JpdHRlbiBhbmQgcGFzc2VzIHRoZW0gdG8gdGhlIGRldmljZS4KKyAqCisgKiBTbyB0aGUgY29uY2VwdHMgdG8ga2VlcCBpbiBtaW5kIHRoZXJlIGFyZToKKyAqCisgKiBXZSB1c2UgYSBGSUZPIHRvIHF1ZXVlIHRoZSBkYXRhIGluIGEgbGluZWFyIGJ1ZmZlci4gV2UgZmlyc3QgYXBwZW5kCisgKiBhIE1TRy1IRFIsIHNwYWNlIGZvciBJMjQwME1fVFhfUExEX01BWCBwYXlsb2FkIGRlc2NyaXB0b3JzIGFuZCB0aGVuCisgKiBnbyBhcHBlbmRpbmcgcGF5bG9hZHMgdW50aWwgd2UgcnVuIG91dCBvZiBzcGFjZSBvciBvZiBwYXlsb2FkCisgKiBkZXNjcmlwdG9ycy4gVGhlbiB3ZSBhcHBlbmQgcGFkZGluZyB0byBtYWtlIHRoZSB3aG9sZSB0cmFuc2FjdGlvbiBhCisgKiBtdWx0aXBsZSBvZiBpMjQwMG0tPmJ1c190eF9ibG9ja19zaXplIChhcyBkZWZpbmVkIGJ5IHRoZSBidXMgbGF5ZXIpLgorICoKKyAqIC0gQSBUWCBtZXNzYWdlOiBhIGNvbWJpbmF0aW9uIG9mIGEgbWVzc2FnZSBoZWFkZXIsIHBheWxvYWQKKyAqICAgZGVzY3JpcHRvcnMgYW5kIHBheWxvYWRzLgorICoKKyAqICAgICBPcGVuOiBpdCBpcyBtYXJrZWQgYXMgYWN0aXZlIChpMjQwMG0tPnR4X21zZyBpcyB2YWxpZCkgYW5kIHdlCisgKiAgICAgICBjYW4ga2VlcCBhZGRpbmcgcGF5bG9hZHMgdG8gaXQuCisgKgorICogICAgIENsb3NlZDogd2UgYXJlIG5vdCBhcHBlbmRpbmcgbW9yZSBwYXlsb2FkcyB0byB0aGlzIFRYIG1lc3NhZ2UKKyAqICAgICAgIChleGFodXN0ZWQgc3BhY2UgaW4gdGhlIHF1ZXVlLCB0b28gbWFueSBwYXlsb2FkcyBvcgorICogICAgICAgd2hpY2hldmVyKS4gIFdlIGhhdmUgYXBwZW5kZWQgcGFkZGluZyBzbyB0aGUgd2hvbGUgbWVzc2FnZQorICogICAgICAgbGVuZ3RoIGlzIGFsaWduZWQgdG8gaTI0MDBtLT5idXNfdHhfYmxvY2tfc2l6ZSAoYXMgc2V0IGJ5IHRoZQorICogICAgICAgYnVzL3RyYW5zcG9ydCBsYXllcikuCisgKgorICogLSBNb3N0IG9mIHRoZSB0aW1lIHdlIGtlZXAgYSBUWCBtZXNzYWdlIG9wZW4gdG8gd2hpY2ggd2UgYXBwZW5kCisgKiAgIHBheWxvYWRzLgorICoKKyAqIC0gSWYgd2UgYXJlIGdvaW5nIHRvIGFwcGVuZCBhbmQgdGhlcmUgaXMgbm8gbW9yZSBzcGFjZSAod2UgYXJlIGF0CisgKiAgIHRoZSBlbmQgb2YgdGhlIEZJRk8pLCB3ZSBjbG9zZSB0aGUgbWVzc2FnZSwgbWFyayB0aGUgcmVzdCBvZiB0aGUKKyAqICAgRklGTyBzcGFjZSB1bnVzYWJsZSAoc2tpcF90YWlsKSwgY3JlYXRlIGEgbmV3IG1lc3NhZ2UgYXQgdGhlCisgKiAgIGJlZ2lubmluZyBvZiB0aGUgRklGTyAoaWYgdGhlcmUgaXMgc3BhY2UpIGFuZCBhcHBlbmQgdGhlIG1lc3NhZ2UKKyAqICAgdGhlcmUuCisgKgorICogICBUaGlzIGlzIGJlY2F1c2Ugd2UgbmVlZCB0byBnaXZlIGxpbmVhciBUWCBtZXNzYWdlcyB0byB0aGUgYnVzCisgKiAgIGVuZ2luZS4gU28gd2UgZG9uJ3Qgd3JpdGUgYSBtZXNzYWdlIHRvIHRoZSByZW1haW5pbmcgRklGTyBzcGFjZQorICogICB1bnRpbCB0aGUgdGFpbCBhbmQgY29udGludWUgYXQgdGhlIGhlYWQgb2YgaXQuCisgKgorICogLSBXZSBvdmVybG9hZCBvbmUgb2YgdGhlIGZpZWxkcyBpbiB0aGUgbWVzc2FnZSBoZWFkZXIgdG8gdXNlIGl0IGFzCisgKiAgICdzaXplJyBvZiB0aGUgVFggbWVzc2FnZSwgc28gd2UgY2FuIGl0ZXJhdGUgb3ZlciB0aGVtLiBJdCBhbHNvCisgKiAgIGNvbnRhaW5zIGEgZmxhZyB0aGF0IGluZGljYXRlcyBpZiB3ZSBoYXZlIHRvIHNraXAgaXQgb3Igbm90LgorICogICBXaGVuIHdlIHNlbmQgdGhlIGJ1ZmZlciwgd2UgdXBkYXRlIHRoYXQgdG8gaXRzIHJlYWwgb24tdGhlLXdpcmUKKyAqICAgdmFsdWUuCisgKgorICogLSBUaGUgTVNHLUhEUiBQTEQxLi4uUExEMiBzdHVmZiBoYXMgdG8gYmUgYSBzaXplIG11bHRpcGxlIG9mIDE2LgorICoKKyAqICAgSXQgZm9sbG93cyB0aGF0IGlmIE1TRy1IRFIgc2F5cyB3ZSBoYXZlIE4gbWVzc2FnZXMsIHRoZSB3aG9sZQorICogICBoZWFkZXIgKyBkZXNjcmlwdG9ycyBpcyAxNiArIDQqTjsgZm9yIHRob3NlIHRvIGJlIGEgbXVsdGlwbGUgb2YKKyAqICAgMTYsIGl0IGZvbGxvd3MgdGhhdCBOIGNhbiBiZSA0LCA4LCAxMiwgLi4uICgzMiwgNDgsIDY0LCA4MC4uLgorICogICBieXRlcykuCisgKgorICogICBTbyBpZiB3ZSBoYXZlIG9ubHkgMSBwYXlsb2FkLCB3ZSBoYXZlIHRvIHN1Ym1pdCBhIGhlYWRlciB0aGF0IGluCisgKiAgIGFsbCB0cnV0aCBoYXMgc3BhY2UgZm9yIDQuCisgKgorICogICBUaGUgaW1wbGljYXRpb24gaXMgdGhhdCB3ZSByZXNlcnZlIHNwYWNlIGZvciAxMiAoNjQgYnl0ZXMpOyBidXQKKyAqICAgaWYgd2UgZmlsbCB1cCBvbmx5IChlZykgMiwgb3VyIGhlYWRlciBiZWNvbWVzIDMyIGJ5dGVzIG9ubHkuIFNvCisgKiAgIHRoZSBUWCBlbmdpbmUgaGFzIHRvIHNoaWZ0IHRob3NlIDMyIGJ5dGVzIG9mIG1zZyBoZWFkZXIgYW5kIDIKKyAqICAgcGF5bG9hZHMgYW5kIHBhZGRpbmcgc28gdGhhdCByaWdodCBhZnRlciBpdCB0aGUgcGF5bG9hZHMgc3RhcnQKKyAqICAgYW5kIHRoZSBUWCBlbmdpbmUgaGFzIHRvIGtub3cgYWJvdXQgdGhhdC4KKyAqCisgKiAgIEl0IGlzIGNoZWFwZXIgdG8gbW92ZSB0aGUgaGVhZGVyIHVwIHRoYW4gdGhlIHdob2xlIHBheWxvYWRzIGRvd24uCisgKgorICogICBXZSBkbyB0aGlzIGluIGkyNDAwbV90eF9jbG9zZSgpLiBTZWUgJ2kyNDAwbV9tc2dfaGRyLT5vZmZzZXQnLgorICoKKyAqIC0gRWFjaCBwYXlsb2FkIGhhcyB0byBiZSBzaXplLXBhZGRlZCB0byAxNiBieXRlczsgYmVmb3JlIGFwcGVuZGluZworICogICBpdCwgd2UganVzdCBkbyBpdC4KKyAqCisgKiAtIFRoZSB3aG9sZSBtZXNzYWdlIGhhcyB0byBiZSBwYWRkZWQgdG8gaTI0MDBtLT5idXNfdHhfYmxvY2tfc2l6ZTsKKyAqICAgd2UgZG8gdGhpcyBhdCBjbG9zZSB0aW1lLiBUaHVzLCB3aGVuIHJlc2VydmluZyBzcGFjZSBmb3IgdGhlCisgKiAgIHBheWxvYWQsIHdlIGFsd2F5cyBtYWtlIHN1cmUgdGhlcmUgaXMgYWxzbyBmcmVlIHNwYWNlIGZvciB0aGlzCisgKiAgIHBhZGRpbmcgdGhhdCBzb29uZXIgb3IgbGF0ZXIgd2lsbCBoYXBwZW4uCisgKgorICogV2hlbiB3ZSBhcHBlbmQgYSBtZXNzYWdlLCB3ZSB0ZWxsIHRoZSBidXMgc3BlY2lmaWMgY29kZSB0byBraWNrIGluCisgKiBUWHMuIEl0IHdpbGwgVFggKGluIHBhcmFsbGVsKSB1bnRpbCB0aGUgYnVmZmVyIGlzIGV4aGF1c3RlZC0taGVuY2UKKyAqIHRoZSBsb2NraW4gd2UgZG8uIFRoZSBUWCBjb2RlIHdpbGwgb25seSBzZW5kIGEgVFggbWVzc2FnZSBhdCB0aGUKKyAqIHRpbWUgKHdoaWNoIHJlbWVtYmVyLCBtaWdodCBjb250YWluIG1vcmUgdGhhbiBvbmUgcGF5bG9hZCkuIE9mCisgKiBjb3Vyc2UsIHdoZW4gdGhlIGJ1cy1zcGVjaWZpYyBkcml2ZXIgYXR0ZW1wdHMgdG8gVFggYSBtZXNzYWdlIHRoYXQKKyAqIGlzIHN0aWxsIG9wZW4sIGl0IGdldHMgY2xvc2VkIGZpcnN0LgorICoKKyAqIEdlZSwgdGhpcyBpcyBtZXNzeTsgd2VsbCBhIHBpY3R1cmUuIEluIHRoZSBleGFtcGxlIGJlbG93IHdlIGhhdmUgYQorICogcGFydGlhbGx5IGZ1bGwgRklGTywgd2l0aCBhIGNsb3NlZCBtZXNzYWdlIHJlYWR5IHRvIGJlIGRlbGl2ZXJlZAorICogKHdpdGggYSBtb3ZlZCBtZXNzYWdlIGhlYWRlciB0byBtYWtlIHN1cmUgaXQgaXMgc2l6ZS1hbGlnbmVkIHRvCisgKiAxNiksIFRBSUwgcm9vbSB0aGF0IHdhcyB1bnVzYWJsZSAoYW5kIHRodXMgaXMgbWFya2VkIHdpdGggYSBtZXNzYWdlCisgKiBoZWFkZXIgdGhhdCBzYXlzICdza2lwIHRoaXMnKSBhbmQgYXQgdGhlIGhlYWQgb2YgdGhlIGJ1ZmZlciwgYW4KKyAqIGltY29tcGxldGUgbWVzc2FnZSB3aXRoIGEgY291cGxlIG9mIHBheWxvYWRzLgorICoKKyAqIE4gICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICB8ICAgICBUQUlMIHJvb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgIHwgIG1zZ19oZHIgdG8gc2tpcCAoc2l6ZSB8PSAweDgwMDAwKSAgICAgICAgICAgICAgICB8CisgKiAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0KKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAvfFwKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgfAorICogICAgfCAgVFggbWVzc2FnZSBwYWRkaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICB8CisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIHwKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgfAorICogICAgfC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLXwgICB8CisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIHwKKyAqICAgIHwgIHBheWxvYWQgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgfAorICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTiAqIHR4X2Jsb2NrX3NpemUKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgfAorICogICAgfC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLXwgICB8CisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIHwKKyAqICAgIHwgIHBheWxvYWQgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgfAorICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICB8CisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIHwKKyAqICAgIHwtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC18LSAtfC0gLSAtIC0KKyAqICAgIHwgIHBhZGRpbmcgMyAgICAgICAgICAgICAgICAgIC98XCAgICAgICAgICAgICAgICAgICB8ICAgfCAgIC98XAorICogICAgfCAgcGFkZGluZyAyICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgICB8ICAgIHwKKyAqICAgIHwgIHBsZCAxICAgICAgICAgICAgICAgIDMyIGJ5dGVzICgyICogMTYpICAgICAgICAgICB8ICAgfCAgICB8CisgKiAgICB8ICBwbGQgMCAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAgIHwgICAgfAorICogICAgfCAgbW92ZWQgbXNnX2hkciAgICAgICAgICAgICAgXHwvICAgICAgICAgICAgICAgICAgIHwgIFx8LyAgIHwKKyAqICAgIHwtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC18LSAtIC0gICB8CisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICBfUExEX1NJWkUKKyAqICAgIHwgIHVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICB8CisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgfAorICogICAgfC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLXwgICAgICAgIHwKKyAqICAgIHwgIG1zZ19oZHIgKHNpemUgWCkgICAgICAgW3RoaXMgbWVzc2FnZSBpcyBjbG9zZWRdICB8ICAgICAgIFx8LworICogICAgfD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXw9PT09PT09PT09IDw9PT0gT1VUCisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICB8ICAgICAgICAgIEZyZWUgcm9vb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgfD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXw9PT09PT09PT09IDw9PT0gSU4KKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICB8ICBwYXlsb2FkIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICB8LSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtfAorICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgIHwgIHBheWxvYWQgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgIHwtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC18CisgKiAgICB8ICBwbGQgMTEgICAgICAgICAgICAgICAgICAgICAvfFwgICAgICAgICAgICAgICAgICAgfAorICogICAgfCAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgIHwgIHBsZCAxICAgICAgICAgICAgICAgIDY0IGJ5dGVzICgyICogMTYpICAgICAgICAgICB8CisgKiAgICB8ICBwbGQgMCAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfAorICogICAgfCAgbXNnX2hkciAoc2l6ZSBYKSAgICAgICAgICAgXHwvIFttZXNzYWdlIGlzIG9wZW5dIHwKKyAqIDAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKgorICogUk9BRE1BUAorICoKKyAqIGkyNDAwbV90eF9zZXR1cCgpICAgICAgICAgICBDYWxsZWQgYnkgaTI0MDBtX3NldHVwCisgKiBpMjQwMG1fdHhfcmVsZWFzZSgpICAgICAgICAgQ2FsbGVkIGJ5IGkyNDAwbV9yZWxlYXNlKCkKKyAqCisgKiAgaTI0MDBtX3R4KCkgICAgICAgICAgICAgICAgIENhbGxlZCB0byBzZW5kIGRhdGEgb3IgY29udHJvbCBmcmFtZXMKKyAqICAgIGkyNDAwbV90eF9maWZvX3B1c2goKSAgICAgQWxsb2NhdGVzIGFwcGVuZC1zcGFjZSBpbiB0aGUgRklGTworICogICAgaTI0MDBtX3R4X25ldygpICAgICAgICAgICBPcGVucyBhIG5ldyBtZXNzYWdlIGluIHRoZSBGSUZPCisgKiAgICBpMjQwMG1fdHhfZml0cygpICAgICAgICAgIENoZWNrcyBpZiBhIG5ldyBwYXlsb2FkIGZpdHMgaW4gdGhlIG1lc3NhZ2UKKyAqICAgIGkyNDAwbV90eF9jbG9zZSgpICAgICAgICAgQ2xvc2VzIGFuIG9wZW4gbWVzc2FnZSBpbiB0aGUgRklGTworICogICAgaTI0MDBtX3R4X3NraXBfdGFpbCgpICAgICBNYXJrcyB1bnVzYWJsZSBGSUZPIHRhaWwgc3BhY2UKKyAqICAgIGkyNDAwbS0+YnVzX3R4X2tpY2soKQorICoKKyAqIE5vdyBpMjQwMG0tPmJ1c190eF9raWNrKCkgaXMgdGhlIHRoZSBidXMtc3BlY2lmaWMgZHJpdmVyIGJhY2tlbmQKKyAqIGltcGxlbWVudGF0aW9uOyB0aGF0IHdvdWxkIGRvOgorICoKKyAqIGkyNDAwbS0+YnVzX3R4X2tpY2soKQorICogICBpMjQwMG1fdHhfbXNnX2dldCgpCUdldHMgZmlyc3QgbWVzc2FnZSByZWFkeSB0byBnbworICogICAuLi5zZW5kcyBpdC4uLgorICogICBpMjQwMG1fdHhfbXNnX3NlbnQoKSAgICAgICBBY2sgdGhlIG1lc3NhZ2UgaXMgc2VudDsgcmVwZWF0IGZyb20KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3R4X21zZ19nZXQoKSB1bnRpbCBpdCByZXR1cm5zIE5VTEwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSUZPIGVtcHR5KS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgImkyNDAwbS5oIgorCisKKyNkZWZpbmUgRF9TVUJNT0RVTEUgdHgKKyNpbmNsdWRlICJkZWJ1Zy1sZXZlbHMuaCIKKworZW51bSB7CisJLyoqCisJICogVFggQnVmZmVyIHNpemUKKwkgKgorCSAqIERvYyBzYXlzIG1heGltdW0gdHJhbnNhY3Rpb24gaXMgMTZLaUIuIElmIHdlIGhhZCAxNktpQiBlbgorCSAqIHJvdXRlIGFuZCAxNktpQiBiZWluZyBxdWV1ZWQsIGl0IGJvaWxzIGRvd24gdG8gbmVlZGluZworCSAqIDMyS2lCLgorCSAqLworCUkyNDAwTV9UWF9CVUZfU0laRSA9IDMyNzY4LAorCS8qKgorCSAqIE1lc3NhZ2UgaGVhZGVyIGFuZCBwYXlsb2FkIGRlc2NyaXB0b3JzIGhhdmUgdG8gYmUgMTYKKwkgKiBhbGlnbmVkICgxNiArIDQgKiBOID0gMTYgKiBNKS4gSWYgd2UgdGFrZSB0aGF0IGF2ZXJhZ2Ugc2VudAorCSAqIHBhY2tldHMgYXJlIE1UVSBzaXplICh+MTQwMC1+MTUwMCkgaXQgZm9sbG93cyB0aGF0IHdlIGNvdWxkCisJICogZml0IGF0IG1vc3QgMTAtMTEgcGF5bG9hZHMgaW4gb25lIHRyYW5zYWN0aW9uLiBUbyBtZWV0IHRoZQorCSAqIGFsaWdubWVudCByZXF1aXJlbWVudCwgdGhhdCBtZWFucyB3ZSBuZWVkIHRvIGxlYXZlIHNwYWNlCisJICogZm9yIDEyICg2NCBieXRlcykuIFRvIHNpbXBsaWZ5LCB3ZSBsZWF2ZSBzcGFjZSBmb3IgdGhhdC4gSWYKKwkgKiBhdCB0aGUgZW5kIHRoZXJlIGFyZSBsZXNzLCB3ZSBwYWQgdXAgdG8gdGhlIG5lYXJlc3QKKwkgKiBtdWx0aXBsZSBvZiAxNi4KKwkgKi8KKwlJMjQwME1fVFhfUExEX01BWCA9IDEyLAorCUkyNDAwTV9UWF9QTERfU0laRSA9IHNpemVvZihzdHJ1Y3QgaTI0MDBtX21zZ19oZHIpCisJKyBJMjQwME1fVFhfUExEX01BWCAqIHNpemVvZihzdHJ1Y3QgaTI0MDBtX3BsZCksCisJSTI0MDBNX1RYX1NLSVAgPSAweDgwMDAwMDAwLAorfTsKKworI2RlZmluZSBUQUlMX0ZVTEwgKCh2b2lkICopfih1bnNpZ25lZCBsb25nKU5VTEwpCisKKy8qCisgKiBBbGxvY2F0ZSBAc2l6ZSBieXRlcyBpbiB0aGUgVFggZmlmbywgcmV0dXJuIGEgcG9pbnRlciB0byBpdAorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKiBAc2l6ZTogc2l6ZSBvZiB0aGUgYnVmZmVyIHdlIG5lZWQgdG8gYWxsb2NhdGUKKyAqIEBwYWRkaW5nOiBlbnN1cmUgdGhhdCB0aGVyZSBpcyBhdCBsZWFzdCB0aGlzIG1hbnkgYnl0ZXMgb2YgZnJlZQorICogICAgIGNvbnRpZ3VvdXMgc3BhY2UgaW4gdGhlIGZpZm8uIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgbGF0ZXIgb24KKyAqICAgICB3ZSBtaWdodCBuZWVkIHRvIGFkZCBwYWRkaW5nLgorICoKKyAqIFJldHVybnM6CisgKgorICogICAgIFBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBzcGFjZS4gTlVMTCBpZiB0aGVyZSBpcyBubworICogICAgIHNwYWNlLiBUQUlMX0ZVTEwgaWYgdGhlcmUgaXMgbm8gc3BhY2UgYXQgdGhlIHRhaWwgYnV0IHRoZXJlIGlzIGF0CisgKiAgICAgdGhlIGhlYWQgKENhc2UgQiBiZWxvdykuCisgKgorICogVGhlc2UgYXJlIHRoZSB0d28gYmFzaWMgY2FzZXMgd2UgbmVlZCB0byBrZWVwIGFuIGV5ZSBmb3IgLS0gaXQgaXMKKyAqIG11Y2ggYmV0dGVyIGV4cGxhaW5lZCBpbiBsaW51eC9rZXJuZWwva2ZpZm8uYywgYnV0IHRoaXMgY29kZQorICogYmFzaWNhbGx5IGRvZXMgdGhlIHNhbWUuIE5vIHJvY2tldCBzY2llbmNlIGhlcmUuCisgKgorICogICAgICAgQ2FzZSBBICAgICAgICAgICAgICAgQ2FzZSBCCisgKiBOICBfX19fX19fX19fXyAgICAgICAgICBfX19fX19fX19fXworICogICB8IHRhaWwgcm9vbSB8ICAgICAgICB8ICAgZGF0YSAgICB8CisgKiAgIHwgICAgICAgICAgIHwgICAgICAgIHwgICAgICAgICAgIHwKKyAqICAgfDwtICBJTiAgIC0+fCAgICAgICAgfDwtICBPVVQgIC0+fAorICogICB8ICAgICAgICAgICB8ICAgICAgICB8ICAgICAgICAgICB8CisgKiAgIHwgICBkYXRhICAgIHwgICAgICAgIHwgICByb29tICAgIHwKKyAqICAgfCAgICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICAgfAorICogICB8PC0gIE9VVCAgLT58ICAgICAgICB8PC0gIElOICAgLT58CisgKiAgIHwgICAgICAgICAgIHwgICAgICAgIHwgICAgICAgICAgIHwKKyAqICAgfCBoZWFkIHJvb20gfCAgICAgICAgfCAgIGRhdGEgICAgfAorICogMCAgLS0tLS0tLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0KKyAqCisgKiBXZSBhbGxvY2F0ZSBvbmx5ICpjb250aWd1b3VzKiBzcGFjZS4KKyAqCisgKiBXZSBjYW4gYWxsb2NhdGUgb25seSBmcm9tICdyb29tJy4gSW4gQ2FzZSBCLCBpdCBpcyBzaW1wbGU7IGluIGNhc2UKKyAqIEEsIHdlIG9ubHkgdHJ5IGZyb20gdGhlIHRhaWwgcm9vbTsgaWYgaXQgaXMgbm90IGVub3VnaCwgd2UganVzdAorICogZmFpbCBhbmQgcmV0dXJuIFRBSUxfRlVMTCBhbmQgbGV0IHRoZSBjYWxsZXIgZmlndXJlIG91dCBpZiB3ZSB3YW50cyB0bworICogc2tpcCB0aGUgdGFpbCByb29tIGFuZCB0cnkgdG8gYWxsb2NhdGUgZnJvbSB0aGUgaGVhZC4KKyAqCisgKiBOb3RlOgorICoKKyAqICAgICBBc3N1bWVzIGkyNDAwbS0+dHhfbG9jayBpcyB0YWtlbiwgYW5kIHdlIHVzZSB0aGF0IGFzIGEgYmFycmllcgorICoKKyAqICAgICBUaGUgaW5kZXhlcyBrZWVwIGluY3JlYXNpbmcgYW5kIHdlIHJlc2V0IHRoZW0gdG8gemVybyB3aGVuIHdlCisgKiAgICAgcG9wIGRhdGEgb2ZmIHRoZSBxdWV1ZQorICovCitzdGF0aWMKK3ZvaWQgKmkyNDAwbV90eF9maWZvX3B1c2goc3RydWN0IGkyNDAwbSAqaTI0MDBtLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IHBhZGRpbmcpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXNpemVfdCByb29tLCB0YWlsX3Jvb20sIG5lZWRlZF9zaXplOworCXZvaWQgKnB0cjsKKworCW5lZWRlZF9zaXplID0gc2l6ZSArIHBhZGRpbmc7CisJcm9vbSA9IEkyNDAwTV9UWF9CVUZfU0laRSAtIChpMjQwMG0tPnR4X2luIC0gaTI0MDBtLT50eF9vdXQpOworCWlmIChyb29tIDwgbmVlZGVkX3NpemUpCXsgLyogdGhpcyB0YWtlcyBjYXJlIG9mIENhc2UgQiAqLworCQlkX3ByaW50ZigyLCBkZXYsICJmaWZvIHB1c2ggJXp1LyV6dTogbm8gc3BhY2VcbiIsCisJCQkgc2l6ZSwgcGFkZGluZyk7CisJCXJldHVybiBOVUxMOworCX0KKwkvKiBJcyB0aGVyZSBzcGFjZSBhdCB0aGUgdGFpbD8gKi8KKwl0YWlsX3Jvb20gPSBJMjQwME1fVFhfQlVGX1NJWkUgLSBpMjQwMG0tPnR4X2luICUgSTI0MDBNX1RYX0JVRl9TSVpFOworCWlmICh0YWlsX3Jvb20gPCBuZWVkZWRfc2l6ZSkgeworCQlpZiAoaTI0MDBtLT50eF9vdXQgJSBJMjQwME1fVFhfQlVGX1NJWkUKKwkJICAgIDwgaTI0MDBtLT50eF9pbiAlIEkyNDAwTV9UWF9CVUZfU0laRSkgeworCQkJZF9wcmludGYoMiwgZGV2LCAiZmlmbyBwdXNoICV6dS8lenU6IHRhaWwgZnVsbFxuIiwKKwkJCQkgc2l6ZSwgcGFkZGluZyk7CisJCQlyZXR1cm4gVEFJTF9GVUxMOwkvKiBUaGVyZSBtaWdodCBiZSBoZWFkIHNwYWNlICovCisJCX0gZWxzZSB7CisJCQlkX3ByaW50ZigyLCBkZXYsICJmaWZvIHB1c2ggJXp1LyV6dTogbm8gaGVhZCBzcGFjZVxuIiwKKwkJCQkgc2l6ZSwgcGFkZGluZyk7CisJCQlyZXR1cm4gTlVMTDsJLyogVGhlcmUgaXMgbm8gc3BhY2UgKi8KKwkJfQorCX0KKwlwdHIgPSBpMjQwMG0tPnR4X2J1ZiArIGkyNDAwbS0+dHhfaW4gJSBJMjQwME1fVFhfQlVGX1NJWkU7CisJZF9wcmludGYoMiwgZGV2LCAiZmlmbyBwdXNoICV6dS8lenU6IGF0IEAlenVcbiIsIHNpemUsIHBhZGRpbmcsCisJCSBpMjQwMG0tPnR4X2luICUgSTI0MDBNX1RYX0JVRl9TSVpFKTsKKwlpMjQwMG0tPnR4X2luICs9IHNpemU7CisJcmV0dXJuIHB0cjsKK30KKworCisvKgorICogTWFyayB0aGUgdGFpbCBvZiB0aGUgRklGTyBidWZmZXIgYXMgJ3RvLXNraXAnCisgKgorICogV2Ugc2hvdWxkIG5ldmVyIGhpdCB0aGUgQlVHX09OKCkgYmVjYXVzZSBhbGwgdGhlIHNpemVzIHdlIHB1c2ggdG8KKyAqIHRoZSBGSUZPIGFyZSBwYWRkZWQgdG8gYmUgYSBtdWx0aXBsZSBvZiAxNiAtLSB0aGUgc2l6ZSBvZiAqbXNnCisgKiAoSTI0MDBNX1BMX1BBRCBmb3IgdGhlIHBheWxvYWRzLCBJMjQwME1fVFhfUExEX1NJWkUgZm9yIHRoZQorICogaGVhZGVyKS4KKyAqCisgKiBOb3RlOgorICoKKyAqICAgICBBc3N1bWVzIGkyNDAwbS0+dHhfbG9jayBpcyB0YWtlbiwgYW5kIHdlIHVzZSB0aGF0IGFzIGEgYmFycmllcgorICovCitzdGF0aWMKK3ZvaWQgaTI0MDBtX3R4X3NraXBfdGFpbChzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXNpemVfdCB0eF9pbiA9IGkyNDAwbS0+dHhfaW4gJSBJMjQwME1fVFhfQlVGX1NJWkU7CisJc2l6ZV90IHRhaWxfcm9vbSA9IEkyNDAwTV9UWF9CVUZfU0laRSAtIHR4X2luOworCXN0cnVjdCBpMjQwMG1fbXNnX2hkciAqbXNnID0gaTI0MDBtLT50eF9idWYgKyB0eF9pbjsKKwlCVUdfT04odGFpbF9yb29tIDwgc2l6ZW9mKCptc2cpKTsKKwltc2ctPnNpemUgPSB0YWlsX3Jvb20gfCBJMjQwME1fVFhfU0tJUDsKKwlkX3ByaW50ZigyLCBkZXYsICJza2lwIHRhaWw6IHNraXBwaW5nICV6dSBieXRlcyBAJXp1XG4iLAorCQkgdGFpbF9yb29tLCB0eF9pbik7CisJaTI0MDBtLT50eF9pbiArPSB0YWlsX3Jvb207Cit9CisKKworLyoKKyAqIENoZWNrIGlmIGEgc2tiIHdpbGwgZml0IGluIHRoZSBUWCBxdWV1ZSdzIGN1cnJlbnQgYWN0aXZlIFRYCisgKiBtZXNzYWdlIChpZiB0aGVyZSBhcmUgc3RpbGwgZGVzY3JpcHRvcnMgbGVmdCB1bnVzZWQpLgorICoKKyAqIFJldHVybnM6CisgKiAgICAgMCBpZiB0aGUgbWVzc2FnZSB3b24ndCBmaXQsIDEgaWYgaXQgd2lsbC4KKyAqCisgKiBOb3RlOgorICoKKyAqICAgICBBc3N1bWVzIGEgVFggbWVzc2FnZSBpcyBhY3RpdmUgKGkyNDAwbS0+dHhfbXNnKS4KKyAqCisgKiAgICAgQXNzdW1lcyBpMjQwMG0tPnR4X2xvY2sgaXMgdGFrZW4sIGFuZCB3ZSB1c2UgdGhhdCBhcyBhIGJhcnJpZXIKKyAqLworc3RhdGljCit1bnNpZ25lZCBpMjQwMG1fdHhfZml0cyhzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJc3RydWN0IGkyNDAwbV9tc2dfaGRyICptc2dfaGRyID0gaTI0MDBtLT50eF9tc2c7CisJcmV0dXJuIGxlMTZfdG9fY3B1KG1zZ19oZHItPm51bV9wbHMpIDwgSTI0MDBNX1RYX1BMRF9NQVg7CisKK30KKworCisvKgorICogU3RhcnQgYSBuZXcgVFggbWVzc2FnZSBoZWFkZXIgaW4gdGhlIHF1ZXVlLgorICoKKyAqIFJlc2VydmUgbWVtb3J5IGZyb20gdGhlIGJhc2UgRklGTyBlbmdpbmUgYW5kIHRoZW4ganVzdCBpbml0aWFsaXplCisgKiB0aGUgbWVzc2FnZSBoZWFkZXIuCisgKgorICogV2UgYWxsb2NhdGUgdGhlIGJpZ2dlc3QgVFggbWVzc2FnZSBoZWFkZXIgd2UgbWlnaHQgbmVlZCAob25lIHRoYXQnZAorICogZml0IEkyNDAwTV9UWF9QTERfTUFYIHBheWxvYWRzKSAtLSB3aGVuIGl0IGlzIGNsb3NlZCBpdCB3aWxsIGJlCisgKiAnaXJvbmVkIGl0IG91dCcgYW5kIHRoZSB1bm5lZWRlZCBwYXJ0cyByZW1vdmVkLgorICoKKyAqIE5PVEU6CisgKgorICogICAgIEFzc3VtZXMgdGhhdCB0aGUgcHJldmlvdXMgbWVzc2FnZSBpcyBDTE9TRUQgKGVnOiBlaXRoZXIKKyAqICAgICB0aGVyZSB3YXMgbm9uZSBvciAnaTI0MDBtX3R4X2Nsb3NlKCknIHdhcyBjYWxsZWQgb24gaXQpLgorICoKKyAqICAgICBBc3N1bWVzIGkyNDAwbS0+dHhfbG9jayBpcyB0YWtlbiwgYW5kIHdlIHVzZSB0aGF0IGFzIGEgYmFycmllcgorICovCitzdGF0aWMKK3ZvaWQgaTI0MDBtX3R4X25ldyhzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXN0cnVjdCBpMjQwMG1fbXNnX2hkciAqdHhfbXNnOworCUJVR19PTihpMjQwMG0tPnR4X21zZyAhPSBOVUxMKTsKK3RyeV9oZWFkOgorCXR4X21zZyA9IGkyNDAwbV90eF9maWZvX3B1c2goaTI0MDBtLCBJMjQwME1fVFhfUExEX1NJWkUsIDApOworCWlmICh0eF9tc2cgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisJZWxzZSBpZiAodHhfbXNnID09IFRBSUxfRlVMTCkgeworCQlpMjQwMG1fdHhfc2tpcF90YWlsKGkyNDAwbSk7CisJCWRfcHJpbnRmKDIsIGRldiwgIm5ldyBUWCBtZXNzYWdlOiB0YWlsIGZ1bGwsIHRyeWluZyBoZWFkXG4iKTsKKwkJZ290byB0cnlfaGVhZDsKKwl9CisJbWVtc2V0KHR4X21zZywgMCwgSTI0MDBNX1RYX1BMRF9TSVpFKTsKKwl0eF9tc2ctPnNpemUgPSBJMjQwME1fVFhfUExEX1NJWkU7CitvdXQ6CisJaTI0MDBtLT50eF9tc2cgPSB0eF9tc2c7CisJZF9wcmludGYoMiwgZGV2LCAibmV3IFRYIG1lc3NhZ2U6ICVwIEAlenVcbiIsCisJCSB0eF9tc2csICh2b2lkICopIHR4X21zZyAtIGkyNDAwbS0+dHhfYnVmKTsKK30KKworCisvKgorICogRmluYWxpemUgdGhlIGN1cnJlbnQgVFggbWVzc2FnZSBoZWFkZXIKKyAqCisgKiBTZXRzIHRoZSBtZXNzYWdlIGhlYWRlciB0byBiZSBhdCB0aGUgcHJvcGVyIGxvY2F0aW9uIGRlcGVuZGluZyBvbgorICogaG93IG1hbnkgZGVzY3JpcHRvcnMgd2UgaGF2ZSAoY2hlY2sgZG9jdW1lbnRhdGlvbiBhdCB0aGUgZmlsZSdzCisgKiBoZWFkZXIgZm9yIG1vcmUgaW5mbyBvbiB0aGF0KS4KKyAqCisgKiBBcHBlbmRzIHBhZGRpbmcgYnl0ZXMgdG8gbWFrZSBzdXJlIHRoZSB3aG9sZSBUWCBtZXNzYWdlIChjb3VudGluZworICogZnJvbSB0aGUgJ3JlbG9jYXRlZCcgbWVzc2FnZSBoZWFkZXIpIGlzIGFsaWduZWQgdG8KKyAqIHR4X2Jsb2NrX3NpemUuIFdlIGFzc3VtZSB0aGUgX2FwcGVuZCgpIGNvZGUgaGFzIGxlZnQgZW5vdWdoIHNwYWNlCisgKiBpbiB0aGUgRklGTyBmb3IgdGhhdC4gSWYgdGhlcmUgYXJlIG5vIHBheWxvYWRzLCBqdXN0IHBhc3MsIGFzIGl0CisgKiB3b24ndCBiZSB0cmFuc2ZlcnJlZC4KKyAqCisgKiBUaGUgYW1vdW50IG9mIHBhZGRpbmcgYnl0ZXMgZGVwZW5kcyBvbiBob3cgbWFueSBwYXlsb2FkcyBhcmUgaW4gdGhlCisgKiBUWCBtZXNzYWdlLCBhcyB0aGUgIm1zZyBoZWFkZXIgYW5kIHBheWxvYWQgZGVzY3JpcHRvcnMiIHdpbGwgYmUKKyAqIHNoaWZ0ZWQgdXAgaW4gdGhlIGJ1ZmZlci4KKyAqLworc3RhdGljCit2b2lkIGkyNDAwbV90eF9jbG9zZShzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXN0cnVjdCBpMjQwMG1fbXNnX2hkciAqdHhfbXNnID0gaTI0MDBtLT50eF9tc2c7CisJc3RydWN0IGkyNDAwbV9tc2dfaGRyICp0eF9tc2dfbW92ZWQ7CisJc2l6ZV90IGFsaWduZWRfc2l6ZSwgcGFkZGluZywgaGRyX3NpemU7CisJdm9pZCAqcGFkX2J1ZjsKKworCWlmICh0eF9tc2ctPnNpemUgJiBJMjQwME1fVFhfU0tJUCkJLyogYSBza2lwcGVyPyBub3RoaW5nIHRvIGRvICovCisJCWdvdG8gb3V0OworCisJLyogUmVsb2NhdGUgdGhlIG1lc3NhZ2UgaGVhZGVyCisJICoKKwkgKiBGaW5kIHRoZSBjdXJyZW50IGhlYWRlciBzaXplLCBhbGlnbiBpdCB0byAxNiBhbmQgaWYgd2UgbmVlZAorCSAqIHRvIG1vdmUgaXQgc28gdGhlIHRhaWwgaXMgbmV4dCB0byB0aGUgcGF5bG9hZHMsIG1vdmUgaXQgYW5kCisJICogc2V0IHRoZSBvZmZzZXQuCisJICoKKwkgKiBJZiBpdCBtb3ZlZCwgdGhpcyBoZWFkZXIgaXMgZ29vZCBvbmx5IGZvciB0cmFuc21pc3Npb247IHRoZQorCSAqIG9yaWdpbmFsIG9uZSAoaXQgaXMga2VwdCBpZiB3ZSBtb3ZlZCkgaXMgc3RpbGwgdXNlZCB0bworCSAqIGZpZ3VyZSBvdXQgd2hlcmUgdGhlIG5leHQgVFggbWVzc2FnZSBzdGFydHMgKGFuZCB3aGVyZSB0aGUKKwkgKiBvZmZzZXQgdG8gdGhlIG1vdmVkIGhlYWRlciBpcykuCisJICovCisJaGRyX3NpemUgPSBzaXplb2YoKnR4X21zZykKKwkJKyBsZTE2X3RvX2NwdSh0eF9tc2ctPm51bV9wbHMpICogc2l6ZW9mKHR4X21zZy0+cGxkWzBdKTsKKwloZHJfc2l6ZSA9IEFMSUdOKGhkcl9zaXplLCBJMjQwME1fUExfUEFEKTsKKwl0eF9tc2ctPm9mZnNldCA9IEkyNDAwTV9UWF9QTERfU0laRSAtIGhkcl9zaXplOworCXR4X21zZ19tb3ZlZCA9ICh2b2lkICopIHR4X21zZyArIHR4X21zZy0+b2Zmc2V0OworCW1lbW1vdmUodHhfbXNnX21vdmVkLCB0eF9tc2csIGhkcl9zaXplKTsKKwl0eF9tc2dfbW92ZWQtPnNpemUgLT0gdHhfbXNnLT5vZmZzZXQ7CisJLyoKKwkgKiBOb3cgZmlndXJlIG91dCBob3cgbXVjaCB3ZSBoYXZlIHRvIGFkZCB0byB0aGUgKG1vdmVkISkKKwkgKiBtZXNzYWdlIHNvIHRoZSBzaXplIGlzIGEgbXVsdGlwbGUgb2YgaTI0MDBtLT5idXNfdHhfYmxvY2tfc2l6ZS4KKwkgKi8KKwlhbGlnbmVkX3NpemUgPSBBTElHTih0eF9tc2dfbW92ZWQtPnNpemUsIGkyNDAwbS0+YnVzX3R4X2Jsb2NrX3NpemUpOworCXBhZGRpbmcgPSBhbGlnbmVkX3NpemUgLSB0eF9tc2dfbW92ZWQtPnNpemU7CisJaWYgKHBhZGRpbmcgPiAwKSB7CisJCXBhZF9idWYgPSBpMjQwMG1fdHhfZmlmb19wdXNoKGkyNDAwbSwgcGFkZGluZywgMCk7CisJCWlmICh1bmxpa2VseShXQVJOX09OKHBhZF9idWYgPT0gTlVMTAorCQkJCSAgICAgfHwgcGFkX2J1ZiA9PSBUQUlMX0ZVTEwpKSkgeworCQkJLyogVGhpcyBzaG91bGQgbm90IGhhcHBlbiAtLSBhcHBlbmQgc2hvdWxkIHZlcmlmeQorCQkJICogdGhlcmUgaXMgYWx3YXlzIHNwYWNlIGxlZnQgYXQgbGVhc3QgdG8gYXBwZW5kCisJCQkgKiB0eF9ibG9ja19zaXplICovCisJCQlkZXZfZXJyKGRldiwKKwkJCQkiU1cgQlVHISBQb3NzaWJsZSBkYXRhIGxlYWthZ2UgZnJvbSBtZW1vcnkgdGhlICIKKwkJCQkiZGV2aWNlIHNob3VsZCBub3QgcmVhZCBmb3IgcGFkZGluZyAtICIKKwkJCQkic2l6ZSAlbHUgYWxpZ25lZF9zaXplICV6dSB0eF9idWYgJXAgaW4gIgorCQkJCSIlenUgb3V0ICV6dVxuIiwKKwkJCQkodW5zaWduZWQgbG9uZykgdHhfbXNnX21vdmVkLT5zaXplLAorCQkJCWFsaWduZWRfc2l6ZSwgaTI0MDBtLT50eF9idWYsIGkyNDAwbS0+dHhfaW4sCisJCQkJaTI0MDBtLT50eF9vdXQpOworCQl9IGVsc2UKKwkJCW1lbXNldChwYWRfYnVmLCAweGFkLCBwYWRkaW5nKTsKKwl9CisJdHhfbXNnX21vdmVkLT5wYWRkaW5nID0gY3B1X3RvX2xlMTYocGFkZGluZyk7CisJdHhfbXNnX21vdmVkLT5zaXplICs9IHBhZGRpbmc7CisJaWYgKHR4X21zZyAhPSB0eF9tc2dfbW92ZWQpCisJCXR4X21zZy0+c2l6ZSArPSBwYWRkaW5nOworb3V0OgorCWkyNDAwbS0+dHhfbXNnID0gTlVMTDsKK30KKworCisvKioKKyAqIGkyNDAwbV90eCAtIHNlbmQgdGhlIGRhdGEgaW4gYSBidWZmZXIgdG8gdGhlIGRldmljZQorICoKKyAqIEBidWY6IHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB0cmFuc21pdAorICoKKyAqIEBidWZfbGVuOiBidWZmZXIgc2l6ZQorICoKKyAqIEBwbF90eXBlOiB0eXBlIG9mIHRoZSBwYXlsb2FkIHdlIGFyZSBzZW5kaW5nLgorICoKKyAqIFJldHVybnM6CisgKiAgICAgMCBpZiBvaywgPCAwIGVycm5vIGNvZGUgb24gZXJyb3IgKC1FTk9TUEMsIGlmIHRoZXJlIGlzIG5vIG1vcmUKKyAqICAgICByb29tIGZvciB0aGUgbWVzc2FnZSBpbiB0aGUgcXVldWUpLgorICoKKyAqIEFwcGVuZHMgdGhlIGJ1ZmZlciB0byB0aGUgVFggRklGTyBhbmQgbm90aWZpZXMgdGhlIGJ1cy1zcGVjaWZpYworICogcGFydCBvZiB0aGUgZHJpdmVyIHRoYXQgdGhlcmUgaXMgbmV3IGRhdGEgcmVhZHkgdG8gdHJhbnNtaXQuCisgKiBPbmNlIHRoaXMgZnVuY3Rpb24gcmV0dXJucywgdGhlIGJ1ZmZlciBoYXMgYmVlbiBjb3BpZWQsIHNvIGl0IGNhbgorICogYmUgcmV1c2VkLgorICoKKyAqIFRoZSBzdGVwcyBmb2xsb3dlZCB0byBhcHBlbmQgYXJlIGV4cGxhaW5lZCBpbiBkZXRhaWwgaW4gdGhlIGZpbGUKKyAqIGhlYWRlci4KKyAqCisgKiBXaGVuZXZlciB3ZSB3cml0ZSB0byBhIG1lc3NhZ2UsIHdlIGluY3JlYXNlIG1zZy0+c2l6ZSwgc28gaXQKKyAqIHJlZmxlY3RzIGV4YWN0bHkgaG93IGJpZyB0aGUgbWVzc2FnZSBpcy4gVGhpcyBpcyBuZWVkZWQgc28gdGhhdCBpZgorICogd2UgY29uY2F0ZW5hdGUgdHdvIG1lc3NhZ2VzIGJlZm9yZSB0aGV5IGNhbiBiZSBzZW50LCB0aGUgY29kZSB0aGF0CisgKiBzZW5kcyB0aGUgbWVzc2FnZXMgY2FuIGZpbmQgdGhlIGJvdW5kYXJpZXMgKGFuZCBpdCB3aWxsIHJlcGxhY2UgdGhlCisgKiBzaXplIHdpdGggdGhlIHJlYWwgYmFya2VyIGJlZm9yZSBzZW5kaW5nKS4KKyAqCisgKiBOb3RlOgorICoKKyAqICAgICBDb2xkIGFuZCB3YXJtIHJlc2V0IHBheWxvYWRzIG5lZWQgdG8gYmUgc2VudCBhcyBhIHNpbmdsZQorICogICAgIHBheWxvYWQsIHNvIHdlIGhhbmRsZSB0aGF0LgorICovCitpbnQgaTI0MDBtX3R4KHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgYnVmX2xlbiwKKwkgICAgICBlbnVtIGkyNDAwbV9wdCBwbF90eXBlKQoreworCWludCByZXN1bHQgPSAtRU5PU1BDOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNpemVfdCBwYWRkZWRfbGVuOworCXZvaWQgKnB0cjsKKwl1bnNpZ25lZCBpc19zaW5nbGV0b24gPSBwbF90eXBlID09IEkyNDAwTV9QVF9SRVNFVF9XQVJNCisJCXx8IHBsX3R5cGUgPT0gSTI0MDBNX1BUX1JFU0VUX0NPTEQ7CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKGkyNDAwbSAlcCBza2IgJXAgWyV6dSBieXRlc10gcHQgJXUpXG4iLAorCQkgIGkyNDAwbSwgYnVmLCBidWZfbGVuLCBwbF90eXBlKTsKKwlwYWRkZWRfbGVuID0gQUxJR04oYnVmX2xlbiwgSTI0MDBNX1BMX1BBRCk7CisJZF9wcmludGYoNSwgZGV2LCAicGFkZGVkX2xlbiAlemQgYnVmX2xlbiAlemRcbiIsIHBhZGRlZF9sZW4sIGJ1Zl9sZW4pOworCS8qIElmIHRoZXJlIGlzIG5vIGN1cnJlbnQgVFggbWVzc2FnZSwgY3JlYXRlIG9uZTsgaWYgdGhlCisJICogY3VycmVudCBvbmUgaXMgb3V0IG9mIHBheWxvYWQgc2xvdHMgb3Igd2UgaGF2ZSBhIHNpbmdsZXRvbiwKKwkgKiBjbG9zZSBpdCBhbmQgc3RhcnQgYSBuZXcgb25lICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmkyNDAwbS0+dHhfbG9jaywgZmxhZ3MpOwordHJ5X25ldzoKKwlpZiAodW5saWtlbHkoaTI0MDBtLT50eF9tc2cgPT0gTlVMTCkpCisJCWkyNDAwbV90eF9uZXcoaTI0MDBtKTsKKwllbHNlIGlmICh1bmxpa2VseSghaTI0MDBtX3R4X2ZpdHMoaTI0MDBtKQorCQkJICB8fCAoaXNfc2luZ2xldG9uICYmIGkyNDAwbS0+dHhfbXNnLT5udW1fcGxzICE9IDApKSkgeworCQlkX3ByaW50ZigyLCBkZXYsICJjbG9zaW5nIFRYIG1lc3NhZ2UgKGZpdHMgJXUgc2luZ2xldG9uICIKKwkJCSAiJXUgbnVtX3BscyAldSlcbiIsIGkyNDAwbV90eF9maXRzKGkyNDAwbSksCisJCQkgaXNfc2luZ2xldG9uLCBpMjQwMG0tPnR4X21zZy0+bnVtX3Bscyk7CisJCWkyNDAwbV90eF9jbG9zZShpMjQwMG0pOworCQlpMjQwMG1fdHhfbmV3KGkyNDAwbSk7CisJfQorCWlmIChpMjQwMG0tPnR4X21zZy0+c2l6ZSArIHBhZGRlZF9sZW4gPiBJMjQwME1fVFhfQlVGX1NJWkUgLyAyKSB7CisJCWRfcHJpbnRmKDIsIGRldiwgIlRYOiBtZXNzYWdlIHRvbyBiaWcsIGdvaW5nIG5ld1xuIik7CisJCWkyNDAwbV90eF9jbG9zZShpMjQwMG0pOworCQlpMjQwMG1fdHhfbmV3KGkyNDAwbSk7CisJfQorCWlmIChpMjQwMG0tPnR4X21zZyA9PSBOVUxMKQorCQlnb3RvIGVycm9yX3R4X25ldzsKKwkvKiBTbyB3ZSBoYXZlIGEgY3VycmVudCBtZXNzYWdlIGhlYWRlcjsgbm93IGFwcGVuZCBzcGFjZSBmb3IKKwkgKiB0aGUgbWVzc2FnZSAtLSBpZiB0aGVyZSBpcyBub3QgZW5vdWdoLCB0cnkgdGhlIGhlYWQgKi8KKwlwdHIgPSBpMjQwMG1fdHhfZmlmb19wdXNoKGkyNDAwbSwgcGFkZGVkX2xlbiwKKwkJCQkgIGkyNDAwbS0+YnVzX3R4X2Jsb2NrX3NpemUpOworCWlmIChwdHIgPT0gVEFJTF9GVUxMKSB7CS8qIFRhaWwgaXMgZnVsbCwgdHJ5IGhlYWQgKi8KKwkJZF9wcmludGYoMiwgZGV2LCAicGwgYXBwZW5kOiB0YWlsIGZ1bGxcbiIpOworCQlpMjQwMG1fdHhfY2xvc2UoaTI0MDBtKTsKKwkJaTI0MDBtX3R4X3NraXBfdGFpbChpMjQwMG0pOworCQlnb3RvIHRyeV9uZXc7CisJfSBlbHNlIGlmIChwdHIgPT0gTlVMTCkgewkvKiBBbGwgZnVsbCAqLworCQlyZXN1bHQgPSAtRU5PU1BDOworCQlkX3ByaW50ZigyLCBkZXYsICJwbCBhcHBlbmQ6IGFsbCBmdWxsXG4iKTsKKwl9IGVsc2UgewkJCS8qIEdvdCBzcGFjZSwgY29weSBpdCwgc2V0IHBhZGRpbmcgKi8KKwkJc3RydWN0IGkyNDAwbV9tc2dfaGRyICp0eF9tc2cgPSBpMjQwMG0tPnR4X21zZzsKKwkJdW5zaWduZWQgbnVtX3BscyA9IGxlMTZfdG9fY3B1KHR4X21zZy0+bnVtX3Bscyk7CisJCW1lbWNweShwdHIsIGJ1ZiwgYnVmX2xlbik7CisJCW1lbXNldChwdHIgKyBidWZfbGVuLCAweGFkLCBwYWRkZWRfbGVuIC0gYnVmX2xlbik7CisJCWkyNDAwbV9wbGRfc2V0KCZ0eF9tc2ctPnBsZFtudW1fcGxzXSwgYnVmX2xlbiwgcGxfdHlwZSk7CisJCWRfcHJpbnRmKDMsIGRldiwgInBsZCAweCUwOHggKHR5cGUgMHglMXggbGVuIDB4JTA0enhcbiIsCisJCQkgbGUzMl90b19jcHUodHhfbXNnLT5wbGRbbnVtX3Bsc10udmFsKSwKKwkJCSBwbF90eXBlLCBidWZfbGVuKTsKKwkJdHhfbXNnLT5udW1fcGxzID0gbGUxNl90b19jcHUobnVtX3BscysxKTsKKwkJdHhfbXNnLT5zaXplICs9IHBhZGRlZF9sZW47CisJCWRfcHJpbnRmKDIsIGRldiwgIlRYOiBhcHBlbmRlZCAlenUgYiAodXAgdG8gJXUgYikgcGwgIyV1IFxuIiwKKwkJCXBhZGRlZF9sZW4sIHR4X21zZy0+c2l6ZSwgbnVtX3BscysxKTsKKwkJZF9wcmludGYoMiwgZGV2LAorCQkJICJUWDogYXBwZW5kZWQgaGRyIEAlenUgJXp1IGIgcGwgIyV1IEAlenUgJXp1LyV6dSBiXG4iLAorCQkJICh2b2lkICopdHhfbXNnIC0gaTI0MDBtLT50eF9idWYsIChzaXplX3QpdHhfbXNnLT5zaXplLAorCQkJIG51bV9wbHMrMSwgcHRyIC0gaTI0MDBtLT50eF9idWYsIGJ1Zl9sZW4sIHBhZGRlZF9sZW4pOworCQlyZXN1bHQgPSAwOworCQlpZiAoaXNfc2luZ2xldG9uKQorCQkJaTI0MDBtX3R4X2Nsb3NlKGkyNDAwbSk7CisJfQorZXJyb3JfdHhfbmV3OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmkyNDAwbS0+dHhfbG9jaywgZmxhZ3MpOworCWkyNDAwbS0+YnVzX3R4X2tpY2soaTI0MDBtKTsJLyogYWx3YXlzIGtpY2ssIG1pZ2h0IGZyZWUgdXAgc3BhY2UgKi8KKwlkX2ZuZW5kKDMsIGRldiwgIihpMjQwMG0gJXAgc2tiICVwIFslenUgYnl0ZXNdIHB0ICV1KSA9ICVkXG4iLAorCQlpMjQwMG0sIGJ1ZiwgYnVmX2xlbiwgcGxfdHlwZSwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoaTI0MDBtX3R4KTsKKworCisvKioKKyAqIGkyNDAwbV90eF9tc2dfZ2V0IC0gR2V0IHRoZSBmaXJzdCBUWCBtZXNzYWdlIGluIHRoZSBGSUZPIHRvIHN0YXJ0IHNlbmRpbmcgaXQKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcnMKKyAqIEBidXNfc2l6ZTogd2hlcmUgdG8gcGxhY2UgdGhlIHNpemUgb2YgdGhlIFRYIG1lc3NhZ2UKKyAqCisgKiBDYWxsZWQgYnkgdGhlIGJ1cy1zcGVjaWZpYyBkcml2ZXIgdG8gZ2V0IHRoZSBmaXJzdCBUWCBtZXNzYWdlIGF0CisgKiB0aGUgRklGIHRoYXQgaXMgcmVhZHkgZm9yIHRyYW5zbWlzc2lvbi4KKyAqCisgKiBJdCBzZXRzIHRoZSBzdGF0ZSBpbiBAaTI0MDBtIHRvIGluZGljYXRlIHRoZSBidXMtc3BlY2lmaWMgZHJpdmVyIGlzCisgKiB0cmFuc2ZlcmluZyB0aGF0IG1lc3NhZ2UgKGkyNDAwbS0+dHhfbXNnX3NpemUpLgorICoKKyAqIE9uY2UgdGhlIHRyYW5zZmVyIGlzIGNvbXBsZXRlZCwgY2FsbCBpMjQwMG1fdHhfbXNnX3NlbnQoKS4KKyAqCisgKiBOb3RlczoKKyAqCisgKiAgICAgVGhlIHNpemUgb2YgdGhlIFRYIG1lc3NhZ2UgdG8gYmUgdHJhbnNtaXR0ZWQgbWlnaHQgYmUgc21hbGxlciB0aGFuCisgKiAgICAgdGhhdCBvZiB0aGUgVFggbWVzc2FnZSBpbiB0aGUgRklGTyAoaW4gY2FzZSB0aGUgaGVhZGVyIHdhcworICogICAgIHNob3J0ZXIpLiBIZW5jZSwgd2UgY29weSBpdCBpbiBAYnVzX3NpemUsIGZvciB0aGUgYnVzIGxheWVyIHRvCisgKiAgICAgdXNlLiBXZSBrZWVwIHRoZSBtZXNzYWdlJ3Mgc2l6ZSBpbiBpMjQwMG0tPnR4X21zZ19zaXplIHNvIHRoYXQKKyAqICAgICB3aGVuIHRoZSBidXMgbGF0ZXIgaXMgZG9uZSB0cmFuc2ZlcnJpbmcgd2Uga25vdyBob3cgbXVjaCB0bworICogICAgIGFkdmFuY2UgdGhlIGZpZm8uCisgKgorICogICAgIFdlIGNvbGxlY3Qgc3RhdGlzdGljcyBoZXJlIGFzIGFsbCB0aGUgZGF0YSBpcyBhdmFpbGFibGUgYW5kIHdlCisgKiAgICAgYXNzdW1lIGl0IGlzIGdvaW5nIHRvIHdvcmsgW3NlZSBpMjQwMG1fdHhfbXNnX3NlbnQoKV0uCisgKi8KK3N0cnVjdCBpMjQwMG1fbXNnX2hkciAqaTI0MDBtX3R4X21zZ19nZXQoc3RydWN0IGkyNDAwbSAqaTI0MDBtLAorCQkJCQkgc2l6ZV90ICpidXNfc2l6ZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJc3RydWN0IGkyNDAwbV9tc2dfaGRyICp0eF9tc2csICp0eF9tc2dfbW92ZWQ7CisJdW5zaWduZWQgbG9uZyBmbGFncywgcGxzOworCisJZF9mbnN0YXJ0KDMsIGRldiwgIihpMjQwMG0gJXAgYnVzX3NpemUgJXApXG4iLCBpMjQwMG0sIGJ1c19zaXplKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTI0MDBtLT50eF9sb2NrLCBmbGFncyk7Citza2lwOgorCXR4X21zZ19tb3ZlZCA9IE5VTEw7CisJaWYgKGkyNDAwbS0+dHhfaW4gPT0gaTI0MDBtLT50eF9vdXQpIHsJLyogRW1wdHkgRklGTz8gKi8KKwkJaTI0MDBtLT50eF9pbiA9IDA7CisJCWkyNDAwbS0+dHhfb3V0ID0gMDsKKwkJZF9wcmludGYoMiwgZGV2LCAiVFg6IEZJRk8gZW1wdHk6IHJlc2V0dGluZ1xuIik7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisJdHhfbXNnID0gaTI0MDBtLT50eF9idWYgKyBpMjQwMG0tPnR4X291dCAlIEkyNDAwTV9UWF9CVUZfU0laRTsKKwlpZiAodHhfbXNnLT5zaXplICYgSTI0MDBNX1RYX1NLSVApIHsJLyogc2tpcD8gKi8KKwkJZF9wcmludGYoMiwgZGV2LCAiVFg6IHNraXA6IG1zZyBAJXp1ICglenUgYilcbiIsCisJCQkgaTI0MDBtLT50eF9vdXQgJSBJMjQwME1fVFhfQlVGX1NJWkUsCisJCQkgKHNpemVfdCkgdHhfbXNnLT5zaXplICYgfkkyNDAwTV9UWF9TS0lQKTsKKwkJaTI0MDBtLT50eF9vdXQgKz0gdHhfbXNnLT5zaXplICYgfkkyNDAwTV9UWF9TS0lQOworCQlnb3RvIHNraXA7CisJfQorCisJaWYgKHR4X21zZy0+bnVtX3BscyA9PSAwKSB7CQkvKiBObyBwYXlsb2Fkcz8gKi8KKwkJaWYgKHR4X21zZyA9PSBpMjQwMG0tPnR4X21zZykgewkvKiBvcGVuLCB3ZSBhcmUgZG9uZSAqLworCQkJZF9wcmludGYoMiwgZGV2LAorCQkJCSAiVFg6IEZJRk8gZW1wdHk6IG9wZW4gbXNnIHcvbyBwYXlsb2FkcyBAJXp1XG4iLAorCQkJCSAodm9pZCAqKSB0eF9tc2cgLSBpMjQwMG0tPnR4X2J1Zik7CisJCQl0eF9tc2cgPSBOVUxMOworCQkJZ290byBvdXRfdW5sb2NrOworCQl9IGVsc2UgewkJCS8qIGNsb3NlZCwgc2tpcCBpdCAqLworCQkJZF9wcmludGYoMiwgZGV2LAorCQkJCSAiVFg6IHNraXAgbXNnIHcvbyBwYXlsb2FkcyBAJXp1ICglenUgYilcbiIsCisJCQkJICh2b2lkICopIHR4X21zZyAtIGkyNDAwbS0+dHhfYnVmLAorCQkJCSAoc2l6ZV90KSB0eF9tc2ctPnNpemUpOworCQkJaTI0MDBtLT50eF9vdXQgKz0gdHhfbXNnLT5zaXplICYgfkkyNDAwTV9UWF9TS0lQOworCQkJZ290byBza2lwOworCQl9CisJfQorCWlmICh0eF9tc2cgPT0gaTI0MDBtLT50eF9tc2cpCQkvKiBvcGVuIG1zZz8gKi8KKwkJaTI0MDBtX3R4X2Nsb3NlKGkyNDAwbSk7CisKKwkvKiBOb3cgd2UgaGF2ZSBhIHZhbGlkIFRYIG1lc3NhZ2UgKHdpdGggcGF5bG9hZHMpIHRvIFRYICovCisJdHhfbXNnX21vdmVkID0gKHZvaWQgKikgdHhfbXNnICsgdHhfbXNnLT5vZmZzZXQ7CisJaTI0MDBtLT50eF9tc2dfc2l6ZSA9IHR4X21zZy0+c2l6ZTsKKwkqYnVzX3NpemUgPSB0eF9tc2dfbW92ZWQtPnNpemU7CisJZF9wcmludGYoMiwgZGV2LCAiVFg6IHBpZCAlZCBtc2cgaGRyIGF0IEAlenUgb2Zmc2V0ICtAJXp1ICIKKwkJICJzaXplICV6dSBidXNfc2l6ZSAlenVcbiIsCisJCSBjdXJyZW50LT5waWQsICh2b2lkICopIHR4X21zZyAtIGkyNDAwbS0+dHhfYnVmLAorCQkgKHNpemVfdCkgdHhfbXNnLT5vZmZzZXQsIChzaXplX3QpIHR4X21zZy0+c2l6ZSwKKwkJIChzaXplX3QpIHR4X21zZ19tb3ZlZC0+c2l6ZSk7CisJdHhfbXNnX21vdmVkLT5iYXJrZXIgPSBsZTMyX3RvX2NwdShJMjQwME1fSDJEX1BSRVZJRVdfQkFSS0VSKTsKKwl0eF9tc2dfbW92ZWQtPnNlcXVlbmNlID0gbGUzMl90b19jcHUoaTI0MDBtLT50eF9zZXF1ZW5jZSsrKTsKKworCXBscyA9IGxlMzJfdG9fY3B1KHR4X21zZ19tb3ZlZC0+bnVtX3Bscyk7CisJaTI0MDBtLT50eF9wbF9udW0gKz0gcGxzOwkJLyogVXBkYXRlIHN0YXRzICovCisJaWYgKHBscyA+IGkyNDAwbS0+dHhfcGxfbWF4KQorCQlpMjQwMG0tPnR4X3BsX21heCA9IHBsczsKKwlpZiAocGxzIDwgaTI0MDBtLT50eF9wbF9taW4pCisJCWkyNDAwbS0+dHhfcGxfbWluID0gcGxzOworCWkyNDAwbS0+dHhfbnVtKys7CisJaTI0MDBtLT50eF9zaXplX2FjYyArPSAqYnVzX3NpemU7CisJaWYgKCpidXNfc2l6ZSA8IGkyNDAwbS0+dHhfc2l6ZV9taW4pCisJCWkyNDAwbS0+dHhfc2l6ZV9taW4gPSAqYnVzX3NpemU7CisJaWYgKCpidXNfc2l6ZSA+IGkyNDAwbS0+dHhfc2l6ZV9tYXgpCisJCWkyNDAwbS0+dHhfc2l6ZV9tYXggPSAqYnVzX3NpemU7CitvdXRfdW5sb2NrOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmkyNDAwbS0+dHhfbG9jaywgZmxhZ3MpOworCWRfZm5zdGFydCgzLCBkZXYsICIoaTI0MDBtICVwIGJ1c19zaXplICVwIFslenVdKSA9ICVwXG4iLAorCQkgIGkyNDAwbSwgYnVzX3NpemUsICpidXNfc2l6ZSwgdHhfbXNnX21vdmVkKTsKKwlyZXR1cm4gdHhfbXNnX21vdmVkOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaTI0MDBtX3R4X21zZ19nZXQpOworCisKKy8qKgorICogaTI0MDBtX3R4X21zZ19zZW50IC0gaW5kaWNhdGUgdGhlIHRyYW5zbWlzc2lvbiBvZiBhIFRYIG1lc3NhZ2UKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcgorICoKKyAqIENhbGxlZCBieSB0aGUgYnVzLXNwZWNpZmljIGRyaXZlciB3aGVuIGEgbWVzc2FnZSBoYXMgYmVlbiBzZW50OworICogdGhpcyBwb3BzIGl0IGZyb20gdGhlIEZJRk87IGFuZCBhcyB0aGVyZSBpcyBzcGFjZSwgc3RhcnQgdGhlIHF1ZXVlCisgKiBpbiBjYXNlIGl0IHdhcyBzdG9wcGVkLgorICoKKyAqIFNob3VsZCBiZSBjYWxsZWQgZXZlbiBpZiB0aGUgbWVzc2FnZSBzZW5kIGZhaWxlZCBhbmQgd2UgYXJlCisgKiBkcm9wcGluZyB0aGlzIFRYIG1lc3NhZ2UuCisgKi8KK3ZvaWQgaTI0MDBtX3R4X21zZ19zZW50KHN0cnVjdCBpMjQwMG0gKmkyNDAwbSkKK3sKKwl1bnNpZ25lZCBuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCisJZF9mbnN0YXJ0KDMsIGRldiwgIihpMjQwMG0gJXApXG4iLCBpMjQwMG0pOworCXNwaW5fbG9ja19pcnFzYXZlKCZpMjQwMG0tPnR4X2xvY2ssIGZsYWdzKTsKKwlpMjQwMG0tPnR4X291dCArPSBpMjQwMG0tPnR4X21zZ19zaXplOworCWRfcHJpbnRmKDIsIGRldiwgIlRYOiBzZW50ICV6dSBiXG4iLCAoc2l6ZV90KSBpMjQwMG0tPnR4X21zZ19zaXplKTsKKwlpMjQwMG0tPnR4X21zZ19zaXplID0gMDsKKwlCVUdfT04oaTI0MDBtLT50eF9vdXQgPiBpMjQwMG0tPnR4X2luKTsKKwkvKiBsZXZlbCB0aGVtIEZJRk8gbWFya2VycyBvZmYgKi8KKwluID0gaTI0MDBtLT50eF9vdXQgLyBJMjQwME1fVFhfQlVGX1NJWkU7CisJaTI0MDBtLT50eF9vdXQgJT0gSTI0MDBNX1RYX0JVRl9TSVpFOworCWkyNDAwbS0+dHhfaW4gLT0gbiAqIEkyNDAwTV9UWF9CVUZfU0laRTsKKwluZXRpZl9zdGFydF9xdWV1ZShpMjQwMG0tPndpbWF4X2Rldi5uZXRfZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpMjQwMG0tPnR4X2xvY2ssIGZsYWdzKTsKKwlkX2ZuZW5kKDMsIGRldiwgIihpMjQwMG0gJXApID0gdm9pZFxuIiwgaTI0MDBtKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGkyNDAwbV90eF9tc2dfc2VudCk7CisKKworLyoqCisgKiBpMjQwMG1fdHhfc2V0dXAgLSBJbml0aWFsaXplIHRoZSBUWCBxdWV1ZSBhbmQgaW5mcmFzdHJ1Y3R1cmUKKyAqCisgKiBNYWtlIHN1cmUgd2UgcmVzZXQgdGhlIFRYIHNlcXVlbmNlIHRvIHplcm8sIGFzIHdoZW4gdGhpcyBmdW5jdGlvbgorICogaXMgY2FsbGVkLCB0aGUgZmlybXdhcmUgaGFzIGJlZW4ganVzdCByZXN0YXJ0ZWQuCisgKi8KK2ludCBpMjQwMG1fdHhfc2V0dXAoc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCWludCByZXN1bHQ7CisKKwkvKiBEbyB0aGlzIGhlcmUgb25seSBvbmNlIC0tIGNhbid0IGRvIG9uCisJICogaTI0MDBtX2hhcmRfc3RhcnRfeG1pdCgpIGFzIHdlJ2xsIGNhdXNlIHJhY2UgY29uZGl0aW9ucyBpZgorCSAqIHRoZSBXUyB3YXMgc2NoZWR1bGVkIG9uIGFub3RoZXIgQ1BVICovCisJSU5JVF9XT1JLKCZpMjQwMG0tPndha2VfdHhfd3MsIGkyNDAwbV93YWtlX3R4X3dvcmspOworCisJaTI0MDBtLT50eF9zZXF1ZW5jZSA9IDA7CisJaTI0MDBtLT50eF9idWYgPSBrbWFsbG9jKEkyNDAwTV9UWF9CVUZfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKGkyNDAwbS0+dHhfYnVmID09IE5VTEwpCisJCXJlc3VsdCA9IC1FTk9NRU07CisJZWxzZQorCQlyZXN1bHQgPSAwOworCS8qIEh1aD8gdGhlIGJ1cyBsYXllciBoYXMgdG8gZGVmaW5lIHRoaXMuLi4gKi8KKwlCVUdfT04oaTI0MDBtLT5idXNfdHhfYmxvY2tfc2l6ZSA9PSAwKTsKKwlyZXR1cm4gcmVzdWx0OworCit9CisKKworLyoqCisgKiBpMjQwMG1fdHhfcmVsZWFzZSAtIFRlYXIgZG93biB0aGUgVFggcXVldWUgYW5kIGluZnJhc3RydWN0dXJlCisgKi8KK3ZvaWQgaTI0MDBtX3R4X3JlbGVhc2Uoc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCWtmcmVlKGkyNDAwbS0+dHhfYnVmKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS91c2ItZGVidWctbGV2ZWxzLmggYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdXNiLWRlYnVnLWxldmVscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MzU4YmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdXNiLWRlYnVnLWxldmVscy5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBJbnRlbCBXaXJlbGVzcyBXaU1BWCBDb25uZWN0aW9uIDI0MDBtCisgKiBEZWJ1ZyBsZXZlbHMgY29udHJvbCBmaWxlIGZvciB0aGUgaTI0MDBtLXVzYiBtb2R1bGUKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggSW50ZWwgQ29ycG9yYXRpb24gPGxpbnV4LXdpbWF4QGludGVsLmNvbT4KKyAqIEluYWt5IFBlcmV6LUdvbnphbGV6IDxpbmFreS5wZXJlei1nb256YWxlekBpbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisjaWZuZGVmIF9fZGVidWdfbGV2ZWxzX19oX18KKyNkZWZpbmUgX19kZWJ1Z19sZXZlbHNfX2hfXworCisvKiBNYXhpbXVtIGNvbXBpbGUgYW5kIHJ1biB0aW1lIGRlYnVnIGxldmVsIGZvciBhbGwgc3VibW9kdWxlcyAqLworI2RlZmluZSBEX01PRFVMRU5BTUUgaTI0MDBtX3VzYgorI2RlZmluZSBEX01BU1RFUiBDT05GSUdfV0lNQVhfSTI0MDBNX0RFQlVHX0xFVkVMCisKKyNpbmNsdWRlIDxsaW51eC93aW1heC9kZWJ1Zy5oPgorCisvKiBMaXN0IG9mIGFsbCB0aGUgZW5hYmxlZCBtb2R1bGVzICovCitlbnVtIGRfbW9kdWxlIHsKKwlEX1NVQk1PRFVMRV9ERUNMQVJFKHVzYiksCisJRF9TVUJNT0RVTEVfREVDTEFSRShmdyksCisJRF9TVUJNT0RVTEVfREVDTEFSRShub3RpZiksCisJRF9TVUJNT0RVTEVfREVDTEFSRShyeCksCisJRF9TVUJNT0RVTEVfREVDTEFSRSh0eCksCit9OworCisKKyNlbmRpZiAvKiAjaWZuZGVmIF9fZGVidWdfbGV2ZWxzX19oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS91c2ItZncuYyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS91c2ItZncuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWQyODdjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3VzYi1mdy5jCkBAIC0wLDAgKzEsMzQwIEBACisvKgorICogSW50ZWwgV2lyZWxlc3MgV2lNQVggQ29ubmVjdGlvbiAyNDAwbQorICogRmlybXdhcmUgdXBsb2FkZXIncyBVU0Igc3BlY2lmaWNzCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqCisgKiBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogWWFuaXIgTHViZXRraW4gPHlhbmlyeC5sdWJldGtpbkBpbnRlbC5jb20+CisgKiBJbmFreSBQZXJlei1Hb256YWxleiA8aW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tPgorICogIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICoKKyAqIEluYWt5IFBlcmV6LUdvbnphbGV6IDxpbmFreS5wZXJlei1nb256YWxlekBpbnRlbC5jb20+CisgKiAgLSBidXMgZ2VuZXJpYy9zcGVjaWZpYyBzcGxpdAorICoKKyAqIFRIRSBQUk9DRURVUkUKKyAqCisgKiBTZWUgZncuYyBmb3IgdGhlIGdlbmVyaWMgZGVzY3JpcHRpb24gb2YgdGhpcyBwcm9jZWR1cmUuCisgKgorICogVGhpcyBmaWxlIGltcGxlbWVudHMgb25seSB0aGUgVVNCIHNwZWNpZmljcy4gSXQgYm9pbHMgZG93biB0byBob3cKKyAqIHRvIHNlbmQgYSBjb21tYW5kIGFuZCB3YWl0aW5nIGZvciBhbiBhY2tub3dsZWRnZW1lbnQgZnJvbSB0aGUKKyAqIGRldmljZS4KKyAqCisgKiBUaGlzIGNvZGUgKGFuZCBwcm9jZXNzKSBpcyBzaW5nbGUgdGhyZWFkZWQuIEl0IGFzc3VtZXMgaXQgaXMgdGhlCisgKiBvbmx5IHRocmVhZCBwb2tpbmcgYXJvdW5kIChndWFyYW50ZWVkIGJ5IGZ3LmMpLgorICoKKyAqIENPTU1BTkQgRVhFQ1VUSU9OCisgKgorICogQSB3cml0ZSBVUkIgaXMgcG9zdGVkIHdpdGggdGhlIGJ1ZmZlciB0byB0aGUgYnVsayBvdXRwdXQgZW5kcG9pbnQuCisgKgorICogQUNLIFJFQ0VQVElPTgorICoKKyAqIFdlIGp1c3QgcG9zdCBhIFVSQiB0byB0aGUgbm90aWZpY2F0aW9uIGVuZHBvaW50IGFuZCB3YWl0IGZvcgorICogZGF0YS4gV2UgcmVwZWF0IHVudGlsIHdlIGdldCBhbGwgdGhlIGRhdGEgd2UgZXhwZWN0IChhcyBpbmRpY2F0ZWQKKyAqIGJ5IHRoZSBjYWxsIGZyb20gdGhlIGJ1cyBnZW5lcmljIGNvZGUpLgorICoKKyAqIFRoZSBkYXRhIGlzIG5vdCByZWFkIGZyb20gdGhlIGJ1bGsgaW4gZW5kcG9pbnQgZm9yIGJvb3QgbW9kZS4KKyAqCisgKiBST0FETUFQCisgKgorICogaTI0MDBtdV9idXNfYm1fY21kX3NlbmQKKyAqICAgaTI0MDBtX2JtX2NtZF9wcmVwYXJlLi4uCisgKiAgIGkyNDAwbXVfdHhfYnVsa19vdXQKKyAqCisgKiBpMjQwMG11X2J1c19ibV93YWl0X2Zvcl9hY2sKKyAqICAgaTI0MDBtX25vdGlmX3N1Ym1pdAorICovCisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSAiaTI0MDBtLXVzYi5oIgorCisKKyNkZWZpbmUgRF9TVUJNT0RVTEUgZncKKyNpbmNsdWRlICJ1c2ItZGVidWctbGV2ZWxzLmgiCisKKworLyoKKyAqIFN5bmNocm9ub3VzIHdyaXRlIHRvIHRoZSBkZXZpY2UKKyAqCisgKiBUYWtlcyBjYXJlIG9mIHVwZGF0aW5nIEVEQyBjb3VudHMgYW5kIHRodXMsIGhhbmRsZSBkZXZpY2UgZXJyb3JzLgorICovCitzdGF0aWMKK3NzaXplX3QgaTI0MDBtdV90eF9idWxrX291dChzdHJ1Y3QgaTI0MDBtdSAqaTI0MDBtdSwgdm9pZCAqYnVmLCBzaXplX3QgYnVmX3NpemUpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaTI0MDBtdS0+dXNiX2lmYWNlLT5kZXY7CisJaW50IGxlbjsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZDsKKwlpbnQgcGlwZSwgZG9fYXV0b3BtID0gMTsKKworCXJlc3VsdCA9IHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZShpMjQwMG11LT51c2JfaWZhY2UpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiQk0tQ01EOiBjYW4ndCBnZXQgYXV0b3BtOiAlZFxuIiwgcmVzdWx0KTsKKwkJZG9fYXV0b3BtID0gMDsKKwl9CisJZXBkID0gdXNiX2dldF9lcGQoaTI0MDBtdS0+dXNiX2lmYWNlLCBJMjQwME1VX0VQX0JVTEtfT1VUKTsKKwlwaXBlID0gdXNiX3NuZGJ1bGtwaXBlKGkyNDAwbXUtPnVzYl9kZXYsIGVwZC0+YkVuZHBvaW50QWRkcmVzcyk7CityZXRyeToKKwlyZXN1bHQgPSB1c2JfYnVsa19tc2coaTI0MDBtdS0+dXNiX2RldiwgcGlwZSwgYnVmLCBidWZfc2l6ZSwgJmxlbiwgSFopOworCXN3aXRjaCAocmVzdWx0KSB7CisJY2FzZSAwOgorCQlpZiAobGVuICE9IGJ1Zl9zaXplKSB7CisJCQlkZXZfZXJyKGRldiwgIkJNLUNNRDogc2hvcnQgd3JpdGUgKCV1IEIgdnMgJXp1ICIKKwkJCQkiZXhwZWN0ZWQpXG4iLCBsZW4sIGJ1Zl9zaXplKTsKKwkJCXJlc3VsdCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQlyZXN1bHQgPSBsZW47CisJCWJyZWFrOworCWNhc2UgLUVJTlZBTDoJCQkvKiB3aGlsZSByZW1vdmluZyBkcml2ZXIgKi8KKwljYXNlIC1FTk9ERVY6CQkJLyogZGV2IGRpc2Nvbm5lY3QgLi4uICovCisJY2FzZSAtRU5PRU5UOgkJCS8qIGp1c3QgaWdub3JlIGl0ICovCisJY2FzZSAtRVNIVVRET1dOOgkJLyogYW5kIGV4aXQgKi8KKwljYXNlIC1FQ09OTlJFU0VUOgorCQlyZXN1bHQgPSAtRVNIVVRET1dOOworCQlicmVhazsKKwljYXNlIC1FVElNRURPVVQ6CQkJLyogYmFoLi4uICovCisJCWJyZWFrOworCWRlZmF1bHQ6CQkJCS8qIGFueSBvdGhlcj8gKi8KKwkJaWYgKGVkY19pbmMoJmkyNDAwbXUtPnVyYl9lZGMsCisJCQkgICAgRURDX01BWF9FUlJPUlMsIEVEQ19FUlJPUl9USU1FRlJBTUUpKSB7CisJCQkJZGV2X2VycihkZXYsICJCTS1DTUQ6IG1heGltdW0gZXJyb3JzIGluICIKKwkJCQkJIlVSQiBleGNlZWRlZDsgcmVzZXR0aW5nIGRldmljZVxuIik7CisJCQkJdXNiX3F1ZXVlX3Jlc2V0X2RldmljZShpMjQwMG11LT51c2JfaWZhY2UpOworCQkJCXJlc3VsdCA9IC1FTk9ERVY7CisJCQkJYnJlYWs7CisJCX0KKwkJZGV2X2VycihkZXYsICJCTS1DTUQ6IFVSQiBlcnJvciAlZCwgcmV0cnlpbmdcbiIsCisJCQlyZXN1bHQpOworCQlnb3RvIHJldHJ5OworCX0KKwlyZXN1bHQgPSBsZW47CisJaWYgKGRvX2F1dG9wbSkKKwkJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKGkyNDAwbXUtPnVzYl9pZmFjZSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICogU2VuZCBhIGJvb3QtbW9kZSBjb21tYW5kIG92ZXIgdGhlIGJ1bGstb3V0IHBpcGUKKyAqCisgKiBDb21tYW5kIGNhbiBiZSBhIHJhdyBjb21tYW5kLCB3aGljaCByZXF1aXJlcyBubyBwcmVwYXJhdGlvbiAoYW5kCisgKiB3aGljaCBtaWdodCBub3QgZXZlbiBiZSBmb2xsb3dpbmcgdGhlIGNvbW1hbmQgZm9ybWF0KS4gQ2hlY2tzIHRoYXQKKyAqIHRoZSByaWdodCBhbW91bnQgb2YgZGF0YSB3YXMgdHJhbnNmZXJlZC4KKyAqCisgKiBUbyBzYXRpc2Z5IFVTQiByZXF1aXJlbWVudHMgKG5vIG9uc3RhY2ssIHZtYWxsb2Mgb3IgaW4gZGF0YSBzZWdtZW50CisgKiBidWZmZXJzKSwgd2UgY29weSB0aGUgY29tbWFuZCB0byBpMjQwMG0tPmJtX2NtZF9idWYgYW5kIHNlbmQgaXQgZnJvbQorICogdGhlcmUuCisgKgorICogQGZsYWdzOiBwYXNzIHRocnUgZnJvbSBpMjQwMG1fYm1fY21kKCkKKyAqIEByZXR1cm46IGNtZF9zaXplIGlmIG9rLCA8IDAgZXJybm8gY29kZSBvbiBlcnJvci4KKyAqLworc3NpemVfdCBpMjQwMG11X2J1c19ibV9jbWRfc2VuZChzdHJ1Y3QgaTI0MDBtICppMjQwMG0sCisJCQkJY29uc3Qgc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciAqX2NtZCwKKwkJCQlzaXplX3QgY21kX3NpemUsIGludCBmbGFncykKK3sKKwlzc2l6ZV90IHJlc3VsdDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJc3RydWN0IGkyNDAwbXUgKmkyNDAwbXUgPSBjb250YWluZXJfb2YoaTI0MDBtLCBzdHJ1Y3QgaTI0MDBtdSwgaTI0MDBtKTsKKwlpbnQgb3Bjb2RlID0gX2NtZCA9PSBOVUxMID8gLTEgOiBpMjQwMG1fYnJoX2dldF9vcGNvZGUoX2NtZCk7CisJc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciAqY21kOworCXNpemVfdCBjbWRfc2l6ZV9hID0gQUxJR04oY21kX3NpemUsIDE2KTsJLyogVVNCIHJlc3RyaWN0aW9uICovCisKKwlkX2Zuc3RhcnQoOCwgZGV2LCAiKGkyNDAwbSAlcCBjbWQgJXAgc2l6ZSAlenUpXG4iLAorCQkgIGkyNDAwbSwgX2NtZCwgY21kX3NpemUpOworCXJlc3VsdCA9IC1FMkJJRzsKKwlpZiAoY21kX3NpemUgPiBJMjQwME1fQk1fQ01EX0JVRl9TSVpFKQorCQlnb3RvIGVycm9yX3Rvb19iaWc7CisJbWVtY3B5KGkyNDAwbS0+Ym1fY21kX2J1ZiwgX2NtZCwgY21kX3NpemUpOworCWNtZCA9IGkyNDAwbS0+Ym1fY21kX2J1ZjsKKwlpZiAoY21kX3NpemVfYSA+IGNtZF9zaXplKQkJCS8qIFplcm8gcGFkIHNwYWNlICovCisJCW1lbXNldChpMjQwMG0tPmJtX2NtZF9idWYgKyBjbWRfc2l6ZSwgMCwgY21kX3NpemVfYSAtIGNtZF9zaXplKTsKKwlpZiAoKGZsYWdzICYgSTI0MDBNX0JNX0NNRF9SQVcpID09IDApIHsKKwkJaWYgKFdBUk5fT04oaTI0MDBtX2JyaF9nZXRfcmVzcG9uc2VfcmVxdWlyZWQoY21kKSA9PSAwKSkKKwkJCWRldl93YXJuKGRldiwgIlNXIEJVRzogcmVzcG9uc2VfcmVxdWlyZWQgPT0gMFxuIik7CisJCWkyNDAwbV9ibV9jbWRfcHJlcGFyZShjbWQpOworCX0KKwlyZXN1bHQgPSBpMjQwMG11X3R4X2J1bGtfb3V0KGkyNDAwbXUsIGkyNDAwbS0+Ym1fY21kX2J1ZiwgY21kX3NpemUpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiYm9vdC1tb2RlIGNtZCAlZDogY2Fubm90IHNlbmQ6ICV6ZFxuIiwKKwkJCW9wY29kZSwgcmVzdWx0KTsKKwkJZ290byBlcnJvcl9jbWRfc2VuZDsKKwl9CisJaWYgKHJlc3VsdCAhPSBjbWRfc2l6ZSkgewkJLyogYWxsIHdhcyB0cmFuc2ZlcnJlZD8gKi8KKwkJZGV2X2VycihkZXYsICJib290LW1vZGUgY21kICVkOiBpbmNvbXBsZXRlIHRyYW5zZmVyICIKKwkJCSIoJXp1IHZzICV6dSBzdWJtaXR0ZWQpXG4iLCAgb3Bjb2RlLCByZXN1bHQsIGNtZF9zaXplKTsKKwkJcmVzdWx0ID0gLUVJTzsKKwkJZ290byBlcnJvcl9jbWRfc2l6ZTsKKwl9CitlcnJvcl9jbWRfc2l6ZToKK2Vycm9yX2NtZF9zZW5kOgorZXJyb3JfdG9vX2JpZzoKKwlkX2ZuZW5kKDgsIGRldiwgIihpMjQwMG0gJXAgY21kICVwIHNpemUgJXp1KSA9ICV6ZFxuIiwKKwkJaTI0MDBtLCBfY21kLCBjbWRfc2l6ZSwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYwordm9pZCBfX2kyNDAwbXVfYm1fbm90aWZfY2Ioc3RydWN0IHVyYiAqdXJiKQoreworCWNvbXBsZXRlKHVyYi0+Y29udGV4dCk7Cit9CisKKworLyoKKyAqIHN1Ym1pdCBhIHJlYWQgdG8gdGhlIG5vdGlmaWNhdGlvbiBlbmRwb2ludAorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKiBAdXJiOiB1cmIgdG8gdXNlCisgKiBAY29tcGxldGlvbjogY29tcGxldGlvbiB2YXJpYmxlIHRvIGNvbXBsZXRlIHdoZW4gZG9uZQorICoKKyAqIERhdGEgaXMgYWx3YXlzIHJlYWQgdG8gaTI0MDBtLT5ibV9hY2tfYnVmCisgKi8KK3N0YXRpYworaW50IGkyNDAwbXVfbm90aWZfc3VibWl0KHN0cnVjdCBpMjQwMG11ICppMjQwMG11LCBzdHJ1Y3QgdXJiICp1cmIsCisJCQkgc3RydWN0IGNvbXBsZXRpb24gKmNvbXBsZXRpb24pCit7CisJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gJmkyNDAwbXUtPmkyNDAwbTsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZDsKKwlpbnQgcGlwZTsKKworCWVwZCA9IHVzYl9nZXRfZXBkKGkyNDAwbXUtPnVzYl9pZmFjZSwgSTI0MDBNVV9FUF9OT1RJRklDQVRJT04pOworCXBpcGUgPSB1c2JfcmN2aW50cGlwZShpMjQwMG11LT51c2JfZGV2LCBlcGQtPmJFbmRwb2ludEFkZHJlc3MpOworCXVzYl9maWxsX2ludF91cmIodXJiLCBpMjQwMG11LT51c2JfZGV2LCBwaXBlLAorCQkJIGkyNDAwbS0+Ym1fYWNrX2J1ZiwgSTI0MDBNX0JNX0FDS19CVUZfU0laRSwKKwkJCSBfX2kyNDAwbXVfYm1fbm90aWZfY2IsIGNvbXBsZXRpb24sCisJCQkgZXBkLT5iSW50ZXJ2YWwpOworCXJldHVybiB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9LRVJORUwpOworfQorCisKKy8qCisgKiBSZWFkIGFuIGFjayBmcm9tICB0aGUgbm90aWZpY2F0aW9uIGVuZHBvaW50CisgKgorICogQGkyNDAwbToKKyAqIEBfYWNrOiBwb2ludGVyIHRvIHdoZXJlIHRvIHN0b3JlIHRoZSByZWFkIGRhdGEKKyAqIEBhY2tfc2l6ZTogaG93IG1hbnkgYnl0ZXMgd2Ugc2hvdWxkIHJlYWQKKyAqCisgKiBSZXR1cm5zOiA8IDAgZXJybm8gY29kZSBvbiBlcnJvcjsgb3RoZXJ3aXNlLCBhbW91bnQgb2YgcmVjZWl2ZWQgYnl0ZXMuCisgKgorICogU3VibWl0cyBhIG5vdGlmaWNhdGlvbiByZWFkLCBhcHBlbmRzIHRoZSByZWFkIGRhdGEgdG8gdGhlIGdpdmVuIGFjaworICogYnVmZmVyIGFuZCB0aGVuIHJlcGVhdHMgKHVudGlsIEBhY2tfc2l6ZSBieXRlcyBoYXZlIGJlZW4KKyAqIHJlY2VpdmVkKS4KKyAqLworc3NpemVfdCBpMjQwMG11X2J1c19ibV93YWl0X2Zvcl9hY2soc3RydWN0IGkyNDAwbSAqaTI0MDBtLAorCQkJCSAgICBzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyICpfYWNrLAorCQkJCSAgICBzaXplX3QgYWNrX3NpemUpCit7CisJc3NpemVfdCByZXN1bHQgPSAtRU5PTUVNOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlzdHJ1Y3QgaTI0MDBtdSAqaTI0MDBtdSA9IGNvbnRhaW5lcl9vZihpMjQwMG0sIHN0cnVjdCBpMjQwMG11LCBpMjQwMG0pOworCXN0cnVjdCB1cmIgbm90aWZfdXJiOworCXZvaWQgKmFjayA9IF9hY2s7CisJc2l6ZV90IG9mZnNldCwgbGVuOworCWxvbmcgdmFsOworCWludCBkb19hdXRvcG0gPSAxOworCURFQ0xBUkVfQ09NUExFVElPTl9PTlNUQUNLKG5vdGlmX2NvbXBsZXRpb24pOworCisJZF9mbnN0YXJ0KDgsIGRldiwgIihpMjQwMG0gJXAgYWNrICVwIHNpemUgJXp1KVxuIiwKKwkJICBpMjQwMG0sIGFjaywgYWNrX3NpemUpOworCUJVR19PTihfYWNrID09IGkyNDAwbS0+Ym1fYWNrX2J1Zik7CisJcmVzdWx0ID0gdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKGkyNDAwbXUtPnVzYl9pZmFjZSk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJCTS1BQ0s6IGNhbid0IGdldCBhdXRvcG06ICVkXG4iLCAoaW50KSByZXN1bHQpOworCQlkb19hdXRvcG0gPSAwOworCX0KKwl1c2JfaW5pdF91cmIoJm5vdGlmX3VyYik7CS8qIHJlYWR5IG5vdGlmaWNhdGlvbnMgKi8KKwl1c2JfZ2V0X3VyYigmbm90aWZfdXJiKTsKKwlvZmZzZXQgPSAwOworCXdoaWxlIChvZmZzZXQgPCBhY2tfc2l6ZSkgeworCQlpbml0X2NvbXBsZXRpb24oJm5vdGlmX2NvbXBsZXRpb24pOworCQlyZXN1bHQgPSBpMjQwMG11X25vdGlmX3N1Ym1pdChpMjQwMG11LCAmbm90aWZfdXJiLAorCQkJCQkgICAgICAmbm90aWZfY29tcGxldGlvbik7CisJCWlmIChyZXN1bHQgPCAwKQorCQkJZ290byBlcnJvcl9ub3RpZl91cmJfc3VibWl0OworCQl2YWwgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgKKwkJCSZub3RpZl9jb21wbGV0aW9uLCBIWik7CisJCWlmICh2YWwgPT0gMCkgeworCQkJcmVzdWx0ID0gLUVUSU1FRE9VVDsKKwkJCXVzYl9raWxsX3VyYigmbm90aWZfdXJiKTsJLyogVGltZWRvdXQgKi8KKwkJCWdvdG8gZXJyb3Jfbm90aWZfd2FpdDsKKwkJfQorCQlpZiAodmFsID09IC1FUkVTVEFSVFNZUykgeworCQkJcmVzdWx0ID0gLUVJTlRSOwkJLyogSW50ZXJydXB0ZWQgKi8KKwkJCXVzYl9raWxsX3VyYigmbm90aWZfdXJiKTsKKwkJCWdvdG8gZXJyb3Jfbm90aWZfd2FpdDsKKwkJfQorCQlyZXN1bHQgPSBub3RpZl91cmIuc3RhdHVzOwkJLyogSG93IHdhcyB0aGUgYWNrPyAqLworCQlzd2l0Y2ggKHJlc3VsdCkgeworCQljYXNlIDA6CisJCQlicmVhazsKKwkJY2FzZSAtRUlOVkFMOgkJCS8qIHdoaWxlIHJlbW92aW5nIGRyaXZlciAqLworCQljYXNlIC1FTk9ERVY6CQkJLyogZGV2IGRpc2Nvbm5lY3QgLi4uICovCisJCWNhc2UgLUVOT0VOVDoJCQkvKiBqdXN0IGlnbm9yZSBpdCAqLworCQljYXNlIC1FU0hVVERPV046CQkvKiBhbmQgZXhpdCAqLworCQljYXNlIC1FQ09OTlJFU0VUOgorCQkJcmVzdWx0ID0gLUVTSFVURE9XTjsKKwkJCWdvdG8gZXJyb3JfZGV2X2dvbmU7CisJCWRlZmF1bHQ6CQkJCS8qIGFueSBvdGhlcj8gKi8KKwkJCXVzYl9raWxsX3VyYigmbm90aWZfdXJiKTsJLyogVGltZWRvdXQgKi8KKwkJCWlmIChlZGNfaW5jKCZpMjQwMG11LT51cmJfZWRjLAorCQkJCSAgICBFRENfTUFYX0VSUk9SUywgRURDX0VSUk9SX1RJTUVGUkFNRSkpCisJCQkJZ290byBlcnJvcl9leGNlZWRlZDsKKwkJCWRldl9lcnIoZGV2LCAiQk0tQUNLOiBVUkIgZXJyb3IgJWQsICIKKwkJCQkicmV0cnlpbmdcbiIsIG5vdGlmX3VyYi5zdGF0dXMpOworCQkJY29udGludWU7CS8qIHJldHJ5ICovCisJCX0KKwkJaWYgKG5vdGlmX3VyYi5hY3R1YWxfbGVuZ3RoID09IDApIHsKKwkJCWRfcHJpbnRmKDYsIGRldiwgIlpMUCByZWNlaXZlZCwgcmV0cnlpbmdcbiIpOworCQkJY29udGludWU7CisJCX0KKwkJLyogR290IGRhdGEsIGFwcGVuZCBpdCB0byB0aGUgYnVmZmVyICovCisJCWxlbiA9IG1pbihhY2tfc2l6ZSAtIG9mZnNldCwgKHNpemVfdCkgbm90aWZfdXJiLmFjdHVhbF9sZW5ndGgpOworCQltZW1jcHkoYWNrICsgb2Zmc2V0LCBpMjQwMG0tPmJtX2Fja19idWYsIGxlbik7CisJCW9mZnNldCArPSBsZW47CisJfQorCXJlc3VsdCA9IG9mZnNldDsKK2Vycm9yX25vdGlmX3VyYl9zdWJtaXQ6CitlcnJvcl9ub3RpZl93YWl0OgorZXJyb3JfZGV2X2dvbmU6CitvdXQ6CisJaWYgKGRvX2F1dG9wbSkKKwkJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKGkyNDAwbXUtPnVzYl9pZmFjZSk7CisJZF9mbmVuZCg4LCBkZXYsICIoaTI0MDBtICVwIGFjayAlcCBzaXplICV6dSkgPSAlemRcbiIsCisJCWkyNDAwbSwgYWNrLCBhY2tfc2l6ZSwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworCitlcnJvcl9leGNlZWRlZDoKKwlkZXZfZXJyKGRldiwgImJtOiBtYXhpbXVtIGVycm9ycyBpbiBub3RpZmljYXRpb24gVVJCIGV4Y2VlZGVkOyAiCisJCSJyZXNldHRpbmcgZGV2aWNlXG4iKTsKKwl1c2JfcXVldWVfcmVzZXRfZGV2aWNlKGkyNDAwbXUtPnVzYl9pZmFjZSk7CisJZ290byBvdXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdXNiLW5vdGlmLmMgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdXNiLW5vdGlmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcwMmMyMmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdXNiLW5vdGlmLmMKQEAgLTAsMCArMSwyNjkgQEAKKy8qCisgKiBJbnRlbCBXaXJlbGVzcyBXaU1BWCBDb25uZWN0aW9uIDI0MDBtIG92ZXIgVVNCCisgKiBOb3RpZmljYXRpb24gaGFuZGxpbmcKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICoKKyAqIEludGVsIENvcnBvcmF0aW9uIDxsaW51eC13aW1heEBpbnRlbC5jb20+CisgKiBZYW5pciBMdWJldGtpbiA8eWFuaXJ4Lmx1YmV0a2luQGludGVsLmNvbT4KKyAqIEluYWt5IFBlcmV6LUdvbnphbGV6IDxpbmFreS5wZXJlei1nb256YWxlekBpbnRlbC5jb20+CisgKiAgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCisgKgorICoKKyAqIFRoZSBub3RpZmljYXRpb24gZW5kcG9pbnQgaXMgYWN0aXZlIHdoZW4gdGhlIGRldmljZSBpcyBub3QgaW4gYm9vdAorICogbW9kZTsgaW4gaGVyZSB3ZSBqdXN0IHJlYWQgYW5kIGdldCBub3RpZmljYXRpb25zOyBiYXNlZCBvbiB0aG9zZSwKKyAqIHdlIGFjdCB0byBlaXRoZXIgcmVpbml0aWFsaXplIHRoZSBkZXZpY2UgYWZ0ZXIgYSByZWJvb3Qgb3IgdG8KKyAqIHN1Ym1pdCBhIFJYIHJlcXVlc3QuCisgKgorICogUk9BRE1BUAorICoKKyAqIGkyNDAwbXVfdXNiX25vdGlmaWNhdGlvbl9zZXR1cCgpCisgKgorICogaTI0MDBtdV91c2Jfbm90aWZpY2F0aW9uX3JlbGVhc2UoKQorICoKKyAqIGkyNDAwbXVfdXNiX25vdGlmaWNhdGlvbl9jYigpCUNhbGxlZCB3aGVuIGEgVVJCIGlzIHJlYWR5CisgKiAgIGkyNDAwbXVfbm90aWZfZ3JvaygpCisgKiAgICAgaTI0MDBtX2Rldl9yZXNldF9oYW5kbGUoKQorICogICAgIGkyNDAwbXVfcnhfa2ljaygpCisgKi8KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlICJpMjQwMG0tdXNiLmgiCisKKworI2RlZmluZSBEX1NVQk1PRFVMRSBub3RpZgorI2luY2x1ZGUgInVzYi1kZWJ1Zy1sZXZlbHMuaCIKKworCitzdGF0aWMgY29uc3QKK19fbGUzMiBpMjQwMG1fWkVST19CQVJLRVJbNF0gPSB7IDAsIDAsIDAsIDAgfTsKKworCisvKgorICogUHJvY2VzcyBhIHJlY2VpdmVkIG5vdGlmaWNhdGlvbgorICoKKyAqIEluIG5vcm1hbCBvcGVyYXRpb24gbW9kZSwgd2UgY2FuIG9ubHkgcmVjZWl2ZSB0d28gdHlwZXMgb2YgcGF5bG9hZHMKKyAqIG9uIHRoZSBub3RpZmljYXRpb24gZW5kcG9pbnQ6CisgKgorICogICAtIGEgcmVib290IGJhcmtlciwgd2UgZG8gYSBib290c3RyYXAgKHRoZSBkZXZpY2UgaGFzIHJlc2V0ZWQpLgorICoKKyAqICAgLSBhIGJsb2NrIG9mIHplcm9lczogdGhlcmUgaXMgcGVuZGluZyBkYXRhIGluIHRoZSBJTiBlbmRwb2ludAorICovCitzdGF0aWMKK2ludCBpMjQwMG11X25vdGlmaWNhdGlvbl9ncm9rKHN0cnVjdCBpMjQwMG11ICppMjQwMG11LCBjb25zdCB2b2lkICpidWYsCisJCQkJIHNpemVfdCBidWZfbGVuKQoreworCWludCByZXQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmkyNDAwbXUtPnVzYl9pZmFjZS0+ZGV2OworCXN0cnVjdCBpMjQwMG0gKmkyNDAwbSA9ICZpMjQwMG11LT5pMjQwMG07CisKKwlkX2Zuc3RhcnQoNCwgZGV2LCAiKGkyNDAwbSAlcCBidWYgJXAgYnVmX2xlbiAlenUpXG4iLAorCQkgIGkyNDAwbXUsIGJ1ZiwgYnVmX2xlbik7CisJcmV0ID0gLUVJTzsKKwlpZiAoYnVmX2xlbiA8IHNpemVvZihpMjQwMG1fTkJPT1RfQkFSS0VSKSkKKwkJLyogTm90IGEgYnVnLCBqdXN0IGlnbm9yZSAqLworCQlnb3RvIGVycm9yX2JhZF9zaXplOworCWlmICghbWVtY21wKGkyNDAwbV9OQk9PVF9CQVJLRVIsIGJ1Ziwgc2l6ZW9mKGkyNDAwbV9OQk9PVF9CQVJLRVIpKQorCSAgICB8fCAhbWVtY21wKGkyNDAwbV9TQk9PVF9CQVJLRVIsIGJ1Ziwgc2l6ZW9mKGkyNDAwbV9TQk9PVF9CQVJLRVIpKSkKKwkJcmV0ID0gaTI0MDBtX2Rldl9yZXNldF9oYW5kbGUoaTI0MDBtKTsKKwllbHNlIGlmICghbWVtY21wKGkyNDAwbV9aRVJPX0JBUktFUiwgYnVmLCBzaXplb2YoaTI0MDBtX1pFUk9fQkFSS0VSKSkpIHsKKwkJaTI0MDBtdV9yeF9raWNrKGkyNDAwbXUpOworCQlyZXQgPSAwOworCX0gZWxzZSB7CS8qIFVua25vd24gb3IgdW5leHBlY3RlZCBkYXRhIGluIHRoZSBub3RpZiBtZXNzYWdlICovCisJCWNoYXIgcHJlZml4WzY0XTsKKwkJcmV0ID0gLUVJTzsKKwkJZGV2X2VycihkZXYsICJIVyBCVUc/IFVua25vd24vdW5leHBlY3RlZCBkYXRhIGluIG5vdGlmaWNhdGlvbiAiCisJCQkibWVzc2FnZSAoJXp1IGJ5dGVzKVxuIiwgYnVmX2xlbik7CisJCXNucHJpbnRmKHByZWZpeCwgc2l6ZW9mKHByZWZpeCksICIlcyAlczogIiwKKwkJCSBkZXZfZHJpdmVyX3N0cmluZyhkZXYpICwgZGV2LT5idXNfaWQpOworCQlpZiAoYnVmX2xlbiA+IDY0KSB7CisJCQlwcmludF9oZXhfZHVtcChLRVJOX0VSUiwgcHJlZml4LCBEVU1QX1BSRUZJWF9PRkZTRVQsCisJCQkJICAgICAgIDgsIDQsIGJ1ZiwgNjQsIDApOworCQkJcHJpbnRrKEtFUk5fRVJSICIlcy4uLiAob25seSBmaXJzdCA2NCBieXRlcyAiCisJCQkgICAgICAgImR1bXBlZClcbiIsIHByZWZpeCk7CisJCX0gZWxzZQorCQkJcHJpbnRfaGV4X2R1bXAoS0VSTl9FUlIsIHByZWZpeCwgRFVNUF9QUkVGSVhfT0ZGU0VULAorCQkJCSAgICAgICA4LCA0LCBidWYsIGJ1Zl9sZW4sIDApOworCX0KK2Vycm9yX2JhZF9zaXplOgorCWRfZm5lbmQoNCwgZGV2LCAiKGkyNDAwbSAlcCBidWYgJXAgYnVmX2xlbiAlenUpID0gJWRcbiIsCisJCWkyNDAwbXUsIGJ1ZiwgYnVmX2xlbiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qCisgKiBVUkIgY2FsbGJhY2sgZm9yIHRoZSBub3RpZmljYXRpb24gZW5kcG9pbnQKKyAqCisgKiBAdXJiOiB0aGUgdXJiIHJlY2VpdmVkIGZyb20gdGhlIG5vdGlmaWNhdGlvbiBlbmRwb2ludAorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBqdXN0IHByb2Nlc3MgdGhlIFVTQiBzaWRlIG9mIHRoZSB0cmFuc2FjdGlvbiwKKyAqIGNoZWNraW5nIGV2ZXJ5dGhpbmcgaXMgZmluZSwgcGFzcyB0aGUgcHJvY2Vzc2luZyB0bworICogaTI0MDBtX25vdGlmaWNhdGlvbl9ncm9rKCkgYW5kIHJlc3VibWl0IHRoZSBVUkIuCisgKi8KK3N0YXRpYwordm9pZCBpMjQwMG11X25vdGlmaWNhdGlvbl9jYihzdHJ1Y3QgdXJiICp1cmIpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaTI0MDBtdSAqaTI0MDBtdSA9IHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaTI0MDBtdS0+dXNiX2lmYWNlLT5kZXY7CisKKwlkX2Zuc3RhcnQoNCwgZGV2LCAiKHVyYiAlcCBzdGF0dXMgJWQgYWN0dWFsX2xlbmd0aCAlZClcbiIsCisJCSAgdXJiLCB1cmItPnN0YXR1cywgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwlyZXQgPSB1cmItPnN0YXR1czsKKwlzd2l0Y2ggKHJldCkgeworCWNhc2UgMDoKKwkJcmV0ID0gaTI0MDBtdV9ub3RpZmljYXRpb25fZ3JvayhpMjQwMG11LCB1cmItPnRyYW5zZmVyX2J1ZmZlciwKKwkJCQkJCXVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCWlmIChyZXQgPT0gLUVJTyAmJiBlZGNfaW5jKCZpMjQwMG11LT51cmJfZWRjLCBFRENfTUFYX0VSUk9SUywKKwkJCQkJICAgRURDX0VSUk9SX1RJTUVGUkFNRSkpCisJCQlnb3RvIGVycm9yX2V4Y2VlZGVkOworCQlpZiAocmV0ID09IC1FTk9NRU0pCS8qIHVmZi4uLnBvd2VyIGN5Y2xlPyBzaHV0ZG93bj8gKi8KKwkJCWdvdG8gZXJyb3JfZXhjZWVkZWQ7CisJCWJyZWFrOworCWNhc2UgLUVJTlZBTDoJCQkvKiB3aGlsZSByZW1vdmluZyBkcml2ZXIgKi8KKwljYXNlIC1FTk9ERVY6CQkJLyogZGV2IGRpc2Nvbm5lY3QgLi4uICovCisJY2FzZSAtRU5PRU5UOgkJCS8qIGRpdHRvICovCisJY2FzZSAtRVNIVVRET1dOOgkJLyogVVJCIGtpbGxlZCAqLworCWNhc2UgLUVDT05OUkVTRVQ6CQkvKiBkaXNjb25uZWN0aW9uICovCisJCWdvdG8gb3V0OwkJLyogTm90aWZ5IGFyb3VuZCAqLworCWRlZmF1bHQ6CQkJLyogU29tZSBlcnJvcj8gKi8KKwkJaWYgKGVkY19pbmMoJmkyNDAwbXUtPnVyYl9lZGMsCisJCQkgICAgRURDX01BWF9FUlJPUlMsIEVEQ19FUlJPUl9USU1FRlJBTUUpKQorCQkJZ290byBlcnJvcl9leGNlZWRlZDsKKwkJZGV2X2VycihkZXYsICJub3RpZmljYXRpb246IFVSQiBlcnJvciAlZCwgcmV0cnlpbmdcbiIsCisJCQl1cmItPnN0YXR1cyk7CisJfQorCXVzYl9tYXJrX2xhc3RfYnVzeShpMjQwMG11LT51c2JfZGV2KTsKKwlyZXQgPSB1c2Jfc3VibWl0X3VyYihpMjQwMG11LT5ub3RpZl91cmIsIEdGUF9BVE9NSUMpOworCXN3aXRjaCAocmV0KSB7CisJY2FzZSAwOgorCWNhc2UgLUVJTlZBTDoJCQkvKiB3aGlsZSByZW1vdmluZyBkcml2ZXIgKi8KKwljYXNlIC1FTk9ERVY6CQkJLyogZGV2IGRpc2Nvbm5lY3QgLi4uICovCisJY2FzZSAtRU5PRU5UOgkJCS8qIGRpdHRvICovCisJY2FzZSAtRVNIVVRET1dOOgkJLyogVVJCIGtpbGxlZCAqLworCWNhc2UgLUVDT05OUkVTRVQ6CQkvKiBkaXNjb25uZWN0aW9uICovCisJCWJyZWFrOwkJCS8qIGp1c3QgaWdub3JlICovCisJZGVmYXVsdDoJCQkvKiBTb21lIGVycm9yPyAqLworCQlkZXZfZXJyKGRldiwgIm5vdGlmaWNhdGlvbjogY2Fubm90IHN1Ym1pdCBVUkI6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycm9yX3N1Ym1pdDsKKwl9CisJZF9mbmVuZCg0LCBkZXYsICIodXJiICVwIHN0YXR1cyAlZCBhY3R1YWxfbGVuZ3RoICVkKSA9IHZvaWRcbiIsCisJCXVyYiwgdXJiLT5zdGF0dXMsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJcmV0dXJuOworCitlcnJvcl9leGNlZWRlZDoKKwlkZXZfZXJyKGRldiwgIm1heGltdW0gZXJyb3JzIGluIG5vdGlmaWNhdGlvbiBVUkIgZXhjZWVkZWQ7ICIKKwkJInJlc2V0dGluZyBkZXZpY2VcbiIpOworZXJyb3Jfc3VibWl0OgorCXVzYl9xdWV1ZV9yZXNldF9kZXZpY2UoaTI0MDBtdS0+dXNiX2lmYWNlKTsKK291dDoKKwlkX2ZuZW5kKDQsIGRldiwgIih1cmIgJXAgc3RhdHVzICVkIGFjdHVhbF9sZW5ndGggJWQpID0gdm9pZFxuIiwKKwkJdXJiLCB1cmItPnN0YXR1cywgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwlyZXR1cm47Cit9CisKKworLyoKKyAqIHNldHVwIHRoZSBub3RpZmljYXRpb24gZW5kcG9pbnQKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcgorICoKKyAqIFRoaXMgcHJvY2VkdXJlIHByZXBhcmVzIHRoZSBub3RpZmljYXRpb24gdXJiIGFuZCBoYW5kbGVyIGZvciByZWNlaXZpbmcKKyAqIHVuc29saWNpdGVkIGJhcmtlcnMgZnJvbSB0aGUgZGV2aWNlLgorICovCitpbnQgaTI0MDBtdV9ub3RpZmljYXRpb25fc2V0dXAoc3RydWN0IGkyNDAwbXUgKmkyNDAwbXUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmkyNDAwbXUtPnVzYl9pZmFjZS0+ZGV2OworCWludCB1c2JfcGlwZSwgcmV0ID0gMDsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZDsKKwljaGFyICpidWY7CisKKwlkX2Zuc3RhcnQoNCwgZGV2LCAiKGkyNDAwbSAlcClcbiIsIGkyNDAwbXUpOworCWJ1ZiA9IGttYWxsb2MoSTI0MDBNVV9NQVhfTk9USUZJQ0FUSU9OX0xFTiwgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOworCWlmIChidWYgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgIm5vdGlmaWNhdGlvbjogYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9idWZfYWxsb2M7CisJfQorCisJaTI0MDBtdS0+bm90aWZfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWkyNDAwbXUtPm5vdGlmX3VyYikgeworCQlyZXQgPSAtRU5PTUVNOworCQlkZXZfZXJyKGRldiwgIm5vdGlmaWNhdGlvbjogY2Fubm90IGFsbG9jYXRlIFVSQlxuIik7CisJCWdvdG8gZXJyb3JfYWxsb2NfdXJiOworCX0KKwllcGQgPSB1c2JfZ2V0X2VwZChpMjQwMG11LT51c2JfaWZhY2UsIEkyNDAwTVVfRVBfTk9USUZJQ0FUSU9OKTsKKwl1c2JfcGlwZSA9IHVzYl9yY3ZpbnRwaXBlKGkyNDAwbXUtPnVzYl9kZXYsIGVwZC0+YkVuZHBvaW50QWRkcmVzcyk7CisJdXNiX2ZpbGxfaW50X3VyYihpMjQwMG11LT5ub3RpZl91cmIsIGkyNDAwbXUtPnVzYl9kZXYsIHVzYl9waXBlLAorCQkJIGJ1ZiwgSTI0MDBNVV9NQVhfTk9USUZJQ0FUSU9OX0xFTiwKKwkJCSBpMjQwMG11X25vdGlmaWNhdGlvbl9jYiwgaTI0MDBtdSwgZXBkLT5iSW50ZXJ2YWwpOworCXJldCA9IHVzYl9zdWJtaXRfdXJiKGkyNDAwbXUtPm5vdGlmX3VyYiwgR0ZQX0tFUk5FTCk7CisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIoZGV2LCAibm90aWZpY2F0aW9uOiBjYW5ub3Qgc3VibWl0IFVSQjogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyb3Jfc3VibWl0OworCX0KKwlkX2ZuZW5kKDQsIGRldiwgIihpMjQwMG0gJXApID0gJWRcbiIsIGkyNDAwbXUsIHJldCk7CisJcmV0dXJuIHJldDsKKworZXJyb3Jfc3VibWl0OgorCXVzYl9mcmVlX3VyYihpMjQwMG11LT5ub3RpZl91cmIpOworZXJyb3JfYWxsb2NfdXJiOgorCWtmcmVlKGJ1Zik7CitlcnJvcl9idWZfYWxsb2M6CisJZF9mbmVuZCg0LCBkZXYsICIoaTI0MDBtICVwKSA9ICVkXG4iLCBpMjQwMG11LCByZXQpOworCXJldHVybiByZXQ7Cit9CisKKworLyoKKyAqIFRlYXIgZG93biBvZiB0aGUgbm90aWZpY2F0aW9uIG1lY2hhbmlzbQorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKgorICogS2lsbCB0aGUgaW50ZXJydXB0IGVuZHBvaW50IHVyYiwgZnJlZSBhbnkgYWxsb2NhdGVkIHJlc291cmNlcy4KKyAqCisgKiBXZSBuZWVkIHRvIGNoZWNrIGlmIHdlIGhhdmUgZG9uZSBpdCBiZWZvcmUgYXMgZm9yIGV4YW1wbGUsCisgKiBfc3VzcGVuZCgpIGNhbGwgdGhpczsgaWYgYWZ0ZXIgYSBzdXNwZW5kKCkgd2UgZ2V0IGEgX2Rpc2Nvbm5lY3QoKQorICogKGFzIHRoZSBjYXNlIGlzIHdoZW4gaGliZXJuYXRpbmcpLCBub3RoaW5nIGJhZCBoYXBwZW5zLgorICovCit2b2lkIGkyNDAwbXVfbm90aWZpY2F0aW9uX3JlbGVhc2Uoc3RydWN0IGkyNDAwbXUgKmkyNDAwbXUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmkyNDAwbXUtPnVzYl9pZmFjZS0+ZGV2OworCisJZF9mbnN0YXJ0KDQsIGRldiwgIihpMjQwMG11ICVwKVxuIiwgaTI0MDBtdSk7CisJaWYgKGkyNDAwbXUtPm5vdGlmX3VyYiAhPSBOVUxMKSB7CisJCXVzYl9raWxsX3VyYihpMjQwMG11LT5ub3RpZl91cmIpOworCQlrZnJlZShpMjQwMG11LT5ub3RpZl91cmItPnRyYW5zZmVyX2J1ZmZlcik7CisJCXVzYl9mcmVlX3VyYihpMjQwMG11LT5ub3RpZl91cmIpOworCQlpMjQwMG11LT5ub3RpZl91cmIgPSBOVUxMOworCX0KKwlkX2ZuZW5kKDQsIGRldiwgIihpMjQwMG11ICVwKVxuIiwgaTI0MDBtdSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdXNiLXJ4LmMgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdXNiLXJ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc0Y2MxZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS91c2ItcnguYwpAQCAtMCwwICsxLDQxNyBAQAorLyoKKyAqIEludGVsIFdpcmVsZXNzIFdpTUFYIENvbm5lY3Rpb24gMjQwMG0KKyAqIFVTQiBSWCBoYW5kbGluZworICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKgorICogSW50ZWwgQ29ycG9yYXRpb24gPGxpbnV4LXdpbWF4QGludGVsLmNvbT4KKyAqIFlhbmlyIEx1YmV0a2luIDx5YW5pcngubHViZXRraW5AaW50ZWwuY29tPgorICogIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqICAtIFVzZSBza2JfY2xvbmUoKSwgYnJlYWsgdXAgcHJvY2Vzc2luZyBpbiBjaHVua3MKKyAqICAtIFNwbGl0IHRyYW5zcG9ydC9kZXZpY2Ugc3BlY2lmaWMKKyAqICAtIE1ha2UgYnVmZmVyIHNpemUgZHluYW1pYyB0byBleGVydCBsZXNzIG1lbW9yeSBwcmVzc3VyZQorICoKKyAqCisgKiBUaGlzIGhhbmRsZXMgdGhlIFJYIHBhdGggb24gVVNCLgorICoKKyAqIFdoZW4gYSBub3RpZmljYXRpb24gaXMgcmVjZWl2ZWQgdGhhdCBzYXlzICd0aGVyZSBpcyBSWCBkYXRhIHJlYWR5JywKKyAqIHdlIGNhbGwgaTI0MDBtdV9yeF9raWNrKCk7IHRoYXQgd2FrZXMgdXAgdGhlIFJYIGt0aHJlYWQsIHdoaWNoCisgKiByZWFkcyBhIGJ1ZmZlciBmcm9tIFVTQiBhbmQgcGFzc2VzIGl0IHRvIGkyNDAwbV9yeCgpIGluIHRoZSBnZW5lcmljCisgKiBoYW5kbGluZyBjb2RlLiBUaGUgUlggYnVmZmVyIGhhcyBhbiBzcGVjaWZpYyBmb3JtYXQgdGhhdCBpcworICogZGVzY3JpYmVkIGluIHJ4LmMuCisgKgorICogV2UgdXNlIGEga2VybmVsIHRocmVhZCBpbiBhIGxvb3AgYmVjYXVzZToKKyAqCisgKiAgLSB3ZSB3YW50IHRvIGJlIGFibGUgdG8gY2FsbCB0aGUgVVNCIHBvd2VyIG1hbmFnZW1lbnQgZ2V0L3B1dAorICogICAgZnVuY3Rpb25zIChibG9ja2luZykgYmVmb3JlIGVhY2ggdHJhbnNhY3Rpb24uCisgKgorICogIC0gV2UgbWlnaHQgZ2V0IGEgbG90IG9mIG5vdGlmaWNhdGlvbnMgYW5kIHdlIGRvbid0IHdhbnQgdG8gc3VibWl0CisgKiAgICBhIHppbGxpb24gcmVhZHM7IGJ5IHNlcmlhbGl6aW5nLCB3ZSBhcmUgdGhyb3R0bGluZy4KKyAqCisgKiAgLSBSWCBkYXRhIHByb2Nlc3NpbmcgY2FuIGdldCBoZWF2eSBlbm91Z2ggc28gdGhhdCBpdCBpcyBub3QKKyAqICAgIGFwcHJvcGlhdGUgZm9yIGRvaW5nIGl0IGluIHRoZSBVU0IgY2FsbGJhY2s7IHRodXMgd2UgcnVuIGl0IGluIGEKKyAqICAgIHByb2Nlc3MgY29udGV4dC4KKyAqCisgKiBXZSBwcm92aWRlIGEgcmVhZCBidWZmZXIgb2YgYW4gYXJiaXRyYXJ5IHNpemUgKHNob3J0IG9mIGEgcGFnZSk7IGlmCisgKiB0aGUgY2FsbGJhY2sgcmVwb3J0cyAtRU9WRVJGTE9XLCBpdCBtZWFucyBpdCB3YXMgdG9vIHNtYWxsLCBzbyB3ZQorICoganVzdCBkb3VibGUgdGhlIHNpemUgYW5kIHJldHJ5IChiZWluZyBjYXJlZnVsIHRvIGFwcGVuZCwgYXMKKyAqIHNvbWV0aW1lcyB0aGUgZGV2aWNlIHByb3ZpZGVkIHNvbWUgZGF0YSkuIEV2ZXJ5IG5vdyBhbmQgdGhlbiB3ZQorICogY2hlY2sgaWYgdGhlIGF2ZXJhZ2UgcGFja2V0IHNpemUgaXMgc21hbGxlciB0aGFuIHRoZSBjdXJyZW50IHBhY2tldAorICogc2l6ZSBhbmQgaWYgc28sIHdlIGhhbHZlIGl0LiBBdCB0aGUgZW5kLCB0aGUgc2l6ZSBvZiB0aGUKKyAqIHByZWFsbG9jYXRlZCBidWZmZXIgc2hvdWxkIGJlIGZvbGxvd2luZyB0aGUgYXZlcmFnZSByZWNlaXZlZAorICogdHJhbnNhY3Rpb24gc2l6ZSwgYWRhcHRpbmcgZHluYW1pY2FsbHkgdG8gaXQuCisgKgorICogUk9BRE1BUAorICoKKyAqIGkyNDAwbXVfcnhfa2ljaygpCQkgICBDYWxsZWQgZnJvbSBub3RpZi5jIHdoZW4gd2UgZ2V0IGEKKyAqICAgCQkJICAgICAgICAgICAnZGF0YSByZWFkeScgbm90aWZpY2F0aW9uCisgKiBpMjQwMG11X3J4ZCgpICAgICAgICAgICAgICAgICAgIEtlcm5lbCBSWCBkYWVtb24KKyAqICAgaTI0MDBtdV9yeCgpICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBVU0IgZGF0YQorICogICBpMjQwMG1fcngoKSAgICAgICAgICAgICAgICAgICBTZW5kIGRhdGEgdG8gZ2VuZXJpYyBpMjQwMG0gUlggaGFuZGxpbmcKKyAqCisgKiBpMjQwMG11X3J4X3NldHVwKCkgICAgICAgICAgICAgIGNhbGxlZCBmcm9tIGkyNDAwbXVfYnVzX2Rldl9zdGFydCgpCisgKgorICogaTI0MDBtdV9yeF9yZWxlYXNlKCkgICAgICAgICAgICBjYWxsZWQgZnJvbSBpMjQwMG11X2J1c19kZXZfc3RvcCgpCisgKi8KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlICJpMjQwMG0tdXNiLmgiCisKKworI2RlZmluZSBEX1NVQk1PRFVMRSByeAorI2luY2x1ZGUgInVzYi1kZWJ1Zy1sZXZlbHMuaCIKKworLyoKKyAqIER5bmFtaWMgUlggc2l6ZQorICoKKyAqIFdlIGNhbid0IGxldCB0aGUgcnhfc2l6ZSBiZSBhIG11bHRpcGxlIG9mIDUxMiBieXRlcyAodGhlIFJYCisgKiBlbmRwb2ludCdzIG1heCBwYWNrZXQgc2l6ZSkuIE9uIHNvbWUgVVNCIGhvc3QgY29udHJvbGxlcnMgKHdlCisgKiBoYXZlbid0IGJlZW4gYWJsZSB0byBmdWxseSBjaGFyYWN0ZXJpemUgd2hpY2gpLCBpZiB0aGUgZGV2aWNlIGlzCisgKiBhYm91dCB0byBzZW5kIChmb3IgZXhhbXBsZSkgWCBieXRlcyBhbmQgd2Ugb25seSBwb3N0IGEgYnVmZmVyIHRvCisgKiByZWNlaXZlIG4qNTEyLCBpdCB3aWxsIGZhaWwgdG8gbWFyayB0aGF0IGFzIGJhYmJsZSAoc28gdGhhdAorICogaTI0MDBtdV9yeCgpIFtjYXNlIC1FT1ZFUkZMT1ddIGNhbiByZXNpemUgdGhlIGJ1ZmZlciBhbmQgZ2V0IHRoZQorICogcmVzdCkuCisgKgorICogU28gb24gZ3Jvd2luZyBvciBzaHJpbmtpbmcsIGlmIGl0IGlzIGEgbXVsdGlwbGUgb2YgdGhlCisgKiBtYXhwYWNrZXRzaXplLCB3ZSByZW1vdmUgc29tZSAoaW5zdGVhZCBvZiBpbmNyZXNpbmcgc29tZSwgc28gaW4gYQorICogYnVkZHkgYWxsb2NhdG9yIHdlIHRyeSB0byB3YXN0ZSBsZXNzIHNwYWNlKS4KKyAqCisgKiBOb3RlIHdlIGFsc28gbmVlZCBhIGhvb2sgZm9yIHRoaXMgb24gaTI0MDBtdV9yeCgpIC0tIHdoZW4gd2UgZG8gdGhlCisgKiBmaXJzdCByZWFkLCB3ZSBhcmUgc3VyZSB3ZSB3b24ndCBoaXQgdGhpcyBzcG90IGJlY2F1c2UKKyAqIGkyNDBtbS0+cnhfc2l6ZSBoYXMgYmVlbiBzZXQgcHJvcGVybHkuIEhvd2V2ZXIsIGlmIHdlIGhhdmUgdG8KKyAqIGRvdWJsZSBiZWNhdXNlIG9mIC1FT1ZFUkZMT1csIHdoZW4gd2UgbGF1bmNoIHRoZSByZWFkIHRvIGdldCB0aGUKKyAqIHJlc3Qgb2YgdGhlIGRhdGEsIHdlICpoYXZlKiB0byBtYWtlIHN1cmUgdGhhdCBhbHNvIGlzIG5vdCBhCisgKiBtdWx0aXBsZSBvZiB0aGUgbWF4X3BrdF9zaXplLgorICovCisKK3N0YXRpYworc2l6ZV90IGkyNDAwbXVfcnhfc2l6ZV9ncm93KHN0cnVjdCBpMjQwMG11ICppMjQwMG11KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpMjQwMG11LT51c2JfaWZhY2UtPmRldjsKKwlzaXplX3Qgcnhfc2l6ZTsKKwljb25zdCBzaXplX3QgbWF4X3BrdF9zaXplID0gNTEyOworCisJcnhfc2l6ZSA9IDIgKiBpMjQwMG11LT5yeF9zaXplOworCWlmIChyeF9zaXplICUgbWF4X3BrdF9zaXplID09IDApIHsKKwkJcnhfc2l6ZSAtPSA4OworCQlkX3ByaW50ZigxLCBkZXYsCisJCQkgIlJYOiBleHBlY3RlZCBzaXplIGdyZXcgdG8gJXp1IFthZGp1c3RlZCAtOF0gIgorCQkJICJmcm9tICV6dVxuIiwKKwkJCSByeF9zaXplLCBpMjQwMG11LT5yeF9zaXplKTsKKwl9IGVsc2UKKwkJZF9wcmludGYoMSwgZGV2LAorCQkJICJSWDogZXhwZWN0ZWQgc2l6ZSBncmV3IHRvICV6dSBmcm9tICV6dVxuIiwKKwkJCSByeF9zaXplLCBpMjQwMG11LT5yeF9zaXplKTsKKwlyZXR1cm4gcnhfc2l6ZTsKK30KKworCitzdGF0aWMKK3ZvaWQgaTI0MDBtdV9yeF9zaXplX21heWJlX3NocmluayhzdHJ1Y3QgaTI0MDBtdSAqaTI0MDBtdSkKK3sKKwljb25zdCBzaXplX3QgbWF4X3BrdF9zaXplID0gNTEyOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpMjQwMG11LT51c2JfaWZhY2UtPmRldjsKKworCWlmICh1bmxpa2VseShpMjQwMG11LT5yeF9zaXplX2NudCA+PSAxMDAKKwkJICAgICAmJiBpMjQwMG11LT5yeF9zaXplX2F1dG9fc2hyaW5rKSkgeworCQlzaXplX3QgYXZnX3J4X3NpemUgPQorCQkJaTI0MDBtdS0+cnhfc2l6ZV9hY2MgLyBpMjQwMG11LT5yeF9zaXplX2NudDsKKwkJc2l6ZV90IG5ld19yeF9zaXplID0gaTI0MDBtdS0+cnhfc2l6ZSAvIDI7CisJCWlmIChhdmdfcnhfc2l6ZSA8IG5ld19yeF9zaXplKSB7CisJCQlpZiAobmV3X3J4X3NpemUgJSBtYXhfcGt0X3NpemUgPT0gMCkgeworCQkJCW5ld19yeF9zaXplIC09IDg7CisJCQkJZF9wcmludGYoMSwgZGV2LAorCQkJCQkgIlJYOiBleHBlY3RlZCBzaXplIHNocmFuayB0byAlenUgIgorCQkJCQkgIlthZGp1c3RlZCAtOF0gZnJvbSAlenVcbiIsCisJCQkJCSBuZXdfcnhfc2l6ZSwgaTI0MDBtdS0+cnhfc2l6ZSk7CisJCQl9IGVsc2UKKwkJCQlkX3ByaW50ZigxLCBkZXYsCisJCQkJCSAiUlg6IGV4cGVjdGVkIHNpemUgc2hyYW5rIHRvICV6dSAiCisJCQkJCSAiZnJvbSAlenVcbiIsCisJCQkJCSBuZXdfcnhfc2l6ZSwgaTI0MDBtdS0+cnhfc2l6ZSk7CisJCQlpMjQwMG11LT5yeF9zaXplID0gbmV3X3J4X3NpemU7CisJCQlpMjQwMG11LT5yeF9zaXplX2NudCA9IDA7CisJCQlpMjQwMG11LT5yeF9zaXplX2FjYyA9IGkyNDAwbXUtPnJ4X3NpemU7CisJCX0KKwl9Cit9CisKKy8qCisgKiBSZWNlaXZlIGEgbWVzc2FnZSB3aXRoIHBheWxvYWRzIGZyb20gdGhlIFVTQiBidXMgaW50byBhbiBza2IKKyAqCisgKiBAaTI0MDBtdTogVVNCIGRldmljZSBkZXNjcmlwdG9yCisgKiBAcnhfc2tiOiBza2Igd2hlcmUgdG8gcGxhY2UgdGhlIHJlY2VpdmVkIG1lc3NhZ2UKKyAqCisgKiBEZWFscyB3aXRoIGFsbCB0aGUgVVNCLXNwZWNpZmljcyBvZiByZWNlaXZpbmcsIGR5bmFtaWNhbGx5CisgKiBpbmNyZWFzaW5nIHRoZSBidWZmZXIgc2l6ZSBpZiBzbyBuZWVkZWQuIFJldHVybnMgdGhlIHBheWxvYWQgaW4gdGhlCisgKiBza2IsIHJlYWR5IHRvIHByb2Nlc3MuIE9uIGEgemVyby1sZW5ndGggcGFja2V0LCB3ZSByZXRyeS4KKyAqCisgKiBPbiBzb2Z0IFVTQiBlcnJvcnMsIHdlIHJldHJ5ICh1bnRpbCB0aGV5IGJlY29tZSB0b28gZnJlcXVlbnQgYW5kCisgKiB0aGVuIGFyZSBwcm9tb3RlZCB0byBoYXJkKTsgb24gaGFyZCBVU0IgZXJyb3JzLCB3ZSByZXNldCB0aGUKKyAqIGRldmljZS4gT24gb3RoZXIgZXJyb3JzIChza2IgcmVhbGxvYWNhdGlvbiwgd2UganVzdCBkcm9wIGl0IGFuZAorICogaG9wZSBmb3IgdGhlIG5leHQgaW52b2NhdGlvbiB0byBzb2x2ZSBpdCkuCisgKgorICogUmV0dXJuczogcG9pbnRlciB0byB0aGUgc2tiIGlmIG9rLCBFUlJfUFRSIG9uIGVycm9yLgorICogICBOT1RFOiB0aGlzIGZ1bmN0aW9uIG1pZ2h0IHJlYWxsb2MgdGhlIHNrYiAoaWYgaXQgaXMgdG9vIHNtYWxsKSwKKyAqICAgc28gYWx3YXlzIHVwZGF0ZSB3aXRoIHRoZSBvbmUgcmV0dXJuZWQuCisgKiAgIEVSUl9QVFIoKSBpcyA8IDAgb24gZXJyb3IuCisgKi8KK3N0YXRpYworc3RydWN0IHNrX2J1ZmYgKmkyNDAwbXVfcngoc3RydWN0IGkyNDAwbXUgKmkyNDAwbXUsIHN0cnVjdCBza19idWZmICpyeF9za2IpCit7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmkyNDAwbXUtPnVzYl9pZmFjZS0+ZGV2OworCWludCB1c2JfcGlwZSwgcmVhZF9zaXplLCByeF9zaXplLCBkb19hdXRvcG07CisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQ7CisJY29uc3Qgc2l6ZV90IG1heF9wa3Rfc2l6ZSA9IDUxMjsKKworCWRfZm5zdGFydCg0LCBkZXYsICIoaTI0MDBtdSAlcClcbiIsIGkyNDAwbXUpOworCWRvX2F1dG9wbSA9IGF0b21pY19yZWFkKCZpMjQwMG11LT5kb19hdXRvcG0pOworCXJlc3VsdCA9IGRvX2F1dG9wbSA/CisJCXVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZShpMjQwMG11LT51c2JfaWZhY2UpIDogMDsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIlJYOiBjYW4ndCBnZXQgYXV0b3BtOiAlZFxuIiwgcmVzdWx0KTsKKwkJZG9fYXV0b3BtID0gMDsKKwl9CisJZXBkID0gdXNiX2dldF9lcGQoaTI0MDBtdS0+dXNiX2lmYWNlLCBJMjQwME1VX0VQX0JVTEtfSU4pOworCXVzYl9waXBlID0gdXNiX3JjdmJ1bGtwaXBlKGkyNDAwbXUtPnVzYl9kZXYsIGVwZC0+YkVuZHBvaW50QWRkcmVzcyk7CityZXRyeToKKwlyeF9zaXplID0gc2tiX2VuZF9wb2ludGVyKHJ4X3NrYikgLSByeF9za2ItPmRhdGEgLSByeF9za2ItPmxlbjsKKwlpZiAodW5saWtlbHkocnhfc2l6ZSAlIG1heF9wa3Rfc2l6ZSA9PSAwKSkgeworCQlyeF9zaXplIC09IDg7CisJCWRfcHJpbnRmKDEsIGRldiwgIlJYOiByeF9zaXplIGFkYXB0ZWQgdG8gJWQgWy04XVxuIiwgcnhfc2l6ZSk7CisJfQorCXJlc3VsdCA9IHVzYl9idWxrX21zZygKKwkJaTI0MDBtdS0+dXNiX2RldiwgdXNiX3BpcGUsIHJ4X3NrYi0+ZGF0YSArIHJ4X3NrYi0+bGVuLAorCQlyeF9zaXplLCAmcmVhZF9zaXplLCBIWik7CisJdXNiX21hcmtfbGFzdF9idXN5KGkyNDAwbXUtPnVzYl9kZXYpOworCXN3aXRjaCAocmVzdWx0KSB7CisJY2FzZSAwOgorCQlpZiAocmVhZF9zaXplID09IDApCisJCQlnb3RvIHJldHJ5OwkvKiBaTFAsIGp1c3QgcmVzdWJtaXQgKi8KKwkJc2tiX3B1dChyeF9za2IsIHJlYWRfc2l6ZSk7CisJCWJyZWFrOworCWNhc2UgLUVJTlZBTDoJCQkvKiB3aGlsZSByZW1vdmluZyBkcml2ZXIgKi8KKwljYXNlIC1FTk9ERVY6CQkJLyogZGV2IGRpc2Nvbm5lY3QgLi4uICovCisJY2FzZSAtRU5PRU5UOgkJCS8qIGp1c3QgaWdub3JlIGl0ICovCisJY2FzZSAtRVNIVVRET1dOOgorCWNhc2UgLUVDT05OUkVTRVQ6CisJCWJyZWFrOworCWNhc2UgLUVPVkVSRkxPVzogewkJLyogdG9vIHNtYWxsLCByZWFsbG9jYXRlICovCisJCXN0cnVjdCBza19idWZmICpuZXdfc2tiOworCQlyeF9zaXplID0gaTI0MDBtdV9yeF9zaXplX2dyb3coaTI0MDBtdSk7CisJCWlmIChyeF9zaXplIDw9ICgxIDw8IDE2KSkJLyogY2FwIGl0ICovCisJCQlpMjQwMG11LT5yeF9zaXplID0gcnhfc2l6ZTsKKwkJZWxzZSBpZiAocHJpbnRrX3JhdGVsaW1pdCgpKSB7CisJCQlkZXZfZXJyKGRldiwgIkJVRz8gcnhfc2l6ZSB1cCB0byAlZFxuIiwgcnhfc2l6ZSk7CisJCQlyZXN1bHQgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKwkJc2tiX3B1dChyeF9za2IsIHJlYWRfc2l6ZSk7CisJCW5ld19za2IgPSBza2JfY29weV9leHBhbmQocnhfc2tiLCAwLCByeF9zaXplIC0gcnhfc2tiLT5sZW4sCisJCQkJCSAgR0ZQX0tFUk5FTCk7CisJCWlmIChuZXdfc2tiID09IE5VTEwpIHsKKwkJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCisJCQkJZGV2X2VycihkZXYsICJSWDogQ2FuJ3QgcmVhbGxvY2F0ZSBza2IgdG8gJWQ7ICIKKwkJCQkJIlJYIGRyb3BwZWRcbiIsIHJ4X3NpemUpOworCQkJa2ZyZWUocnhfc2tiKTsKKwkJCXJlc3VsdCA9IDA7CisJCQlnb3RvIG91dDsJLyogZHJvcCBpdC4uLiovCisJCX0KKwkJa2ZyZWVfc2tiKHJ4X3NrYik7CisJCXJ4X3NrYiA9IG5ld19za2I7CisJCWkyNDAwbXUtPnJ4X3NpemVfY250ID0gMDsKKwkJaTI0MDBtdS0+cnhfc2l6ZV9hY2MgPSBpMjQwMG11LT5yeF9zaXplOworCQlkX3ByaW50ZigxLCBkZXYsICJSWDogc2l6ZSBjaGFuZ2VkIHRvICVkLCByZWNlaXZlZCAlZCwgIgorCQkJICJjb3BpZWQgJWQsIGNhcGFjaXR5ICVsZFxuIiwKKwkJCSByeF9zaXplLCByZWFkX3NpemUsIHJ4X3NrYi0+bGVuLAorCQkJIChsb25nKSAoc2tiX2VuZF9wb2ludGVyKG5ld19za2IpIC0gbmV3X3NrYi0+aGVhZCkpOworCQlnb3RvIHJldHJ5OworCX0KKwkJLyogSW4gbW9zdCBjYXNlcywgaXQgaGFwcGVucyBkdWUgdG8gdGhlIGhhcmR3YXJlIHNjaGVkdWxpbmcgYQorCQkgKiByZWFkIHdoZW4gdGhlcmUgd2FzIG5vIGRhdGEgLSB1bmZvcnR1bmF0ZWx5LCB3ZSBoYXZlIG5vIHdheQorCQkgKiB0byB0ZWxsIHRoaXMgdGltZW91dCBmcm9tIGEgVVNCIHRpbWVvdXQuIFNvIHdlIGp1c3QgaWdub3JlCisJCSAqIGl0LiAqLworCWNhc2UgLUVUSU1FRE9VVDoKKwkJZGV2X2VycihkZXYsICJSWDogdGltZW91dDogJWRcbiIsIHJlc3VsdCk7CisJCXJlc3VsdCA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CQkJLyogQW55IGVycm9yICovCisJCWlmIChlZGNfaW5jKCZpMjQwMG11LT51cmJfZWRjLAorCQkJICAgIEVEQ19NQVhfRVJST1JTLCBFRENfRVJST1JfVElNRUZSQU1FKSkKKwkJCWdvdG8gZXJyb3JfcmVzZXQ7CisJCWRldl9lcnIoZGV2LCAiUlg6IGVycm9yIHJlY2VpdmluZyBVUkI6ICVkLCByZXRyeWluZ1xuIiwgcmVzdWx0KTsKKwkJZ290byByZXRyeTsKKwl9CitvdXQ6CisJaWYgKGRvX2F1dG9wbSkKKwkJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKGkyNDAwbXUtPnVzYl9pZmFjZSk7CisJZF9mbmVuZCg0LCBkZXYsICIoaTI0MDBtdSAlcCkgPSAlcFxuIiwgaTI0MDBtdSwgcnhfc2tiKTsKKwlyZXR1cm4gcnhfc2tiOworCitlcnJvcl9yZXNldDoKKwlkZXZfZXJyKGRldiwgIlJYOiBtYXhpbXVtIGVycm9ycyBpbiBVUkIgZXhjZWVkZWQ7ICIKKwkJInJlc2V0dGluZyBkZXZpY2VcbiIpOworCXVzYl9xdWV1ZV9yZXNldF9kZXZpY2UoaTI0MDBtdS0+dXNiX2lmYWNlKTsKKwlyeF9za2IgPSBFUlJfUFRSKHJlc3VsdCk7CisJZ290byBvdXQ7Cit9CisKKworLyoKKyAqIEtlcm5lbCB0aHJlYWQgZm9yIFVTQiByZWNlcHRpb24gb2YgZGF0YQorICoKKyAqIFRoaXMgdGhyZWFkIHdhaXRzIGZvciBhIGtpY2s7IG9uY2Uga2lja2VkLCBpdCB3aWxsIGFsbG9jYXRlIGFuIHNrYgorICogYW5kIHJlY2VpdmUgYSBzaW5nbGUgbWVzc2FnZSB0byBpdCBmcm9tIFVTQiAodXNpbmcKKyAqIGkyNDAwbXVfcngoKSkuIE9uY2UgcmVjZWl2ZWQsIGl0IGlzIHBhc3NlZCB0byB0aGUgZ2VuZXJpYyBpMjQwMG0gUlgKKyAqIGNvZGUgZm9yIHByb2Nlc3NpbmcuCisgKgorICogV2hlbiBkb25lIHByb2Nlc3NpbmcsIGl0IHJ1bnMgc29tZSBkaXJ0eSBzdGF0aXN0aWNzIHRvIHZlcmlmeSBpZgorICogdGhlIGxhc3QgMTAwIG1lc3NhZ2VzIHJlY2VpdmVkIHdlcmUgc21hbGxlciB0aGFuIGhhbGYgb2YgdGhlCisgKiBjdXJyZW50IFJYIGJ1ZmZlciBzaXplLiBJbiB0aGF0IGNhc2UsIHRoZSBSWCBidWZmZXIgc2l6ZSBpcworICogaGFsdmVkLiBUaGlzIHdpbGwgaGVscHMgbG93ZXJpbmcgdGhlIHByZXNzdXJlIG9uIHRoZSBtZW1vcnkKKyAqIGFsbG9jYXRvci4KKyAqCisgKiBIYXJkIGVycm9ycyBmb3JjZSB0aGUgdGhyZWFkIHRvIGV4aXQuCisgKi8KK3N0YXRpYworaW50IGkyNDAwbXVfcnhkKHZvaWQgKl9pMjQwMG11KQoreworCWludCByZXN1bHQgPSAwOworCXN0cnVjdCBpMjQwMG11ICppMjQwMG11ID0gX2kyNDAwbXU7CisJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gJmkyNDAwbXUtPmkyNDAwbTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaTI0MDBtdS0+dXNiX2lmYWNlLT5kZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBpMjQwMG0tPndpbWF4X2Rldi5uZXRfZGV2OworCXNpemVfdCBwZW5kaW5nOworCWludCByeF9zaXplOworCXN0cnVjdCBza19idWZmICpyeF9za2I7CisKKwlkX2Zuc3RhcnQoNCwgZGV2LCAiKGkyNDAwbXUgJXApXG4iLCBpMjQwMG11KTsKKwl3aGlsZSAoMSkgeworCQlkX3ByaW50ZigyLCBkZXYsICJUWDogd2FpdGluZyBmb3IgbWVzc2FnZXNcbiIpOworCQlwZW5kaW5nID0gMDsKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKAorCQkJaTI0MDBtdS0+cnhfd3EsCisJCQkoa3RocmVhZF9zaG91bGRfc3RvcCgpCS8qIGNoZWNrIHRoaXMgZmlyc3QhICovCisJCQkgfHwgKHBlbmRpbmcgPSBhdG9taWNfcmVhZCgmaTI0MDBtdS0+cnhfcGVuZGluZ19jb3VudCkpKQorCQkJKTsKKwkJaWYgKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKKwkJCWJyZWFrOworCQlpZiAocGVuZGluZyA9PSAwKQorCQkJY29udGludWU7CisJCXJ4X3NpemUgPSBpMjQwMG11LT5yeF9zaXplOworCQlkX3ByaW50ZigyLCBkZXYsICJSWDogcmVhZGluZyB1cCB0byAlZCBieXRlc1xuIiwgcnhfc2l6ZSk7CisJCXJ4X3NrYiA9IF9fbmV0ZGV2X2FsbG9jX3NrYihuZXRfZGV2LCByeF9zaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHJ4X3NrYiA9PSBOVUxMKSB7CisJCQlkZXZfZXJyKGRldiwgIlJYOiBjYW4ndCBhbGxvY2F0ZSBza2IgWyVkIGJ5dGVzXVxuIiwKKwkJCQlyeF9zaXplKTsKKwkJCW1zbGVlcCg1MCk7CS8qIGdpdmUgaXQgc29tZSB0aW1lPyAqLworCQkJY29udGludWU7CisJCX0KKworCQkvKiBSZWNlaXZlIHRoZSBtZXNzYWdlIHdpdGggdGhlIHBheWxvYWRzICovCisJCXJ4X3NrYiA9IGkyNDAwbXVfcngoaTI0MDBtdSwgcnhfc2tiKTsKKwkJcmVzdWx0ID0gUFRSX0VSUihyeF9za2IpOworCQlpZiAoSVNfRVJSKHJ4X3NrYikpCisJCQlnb3RvIG91dDsKKwkJYXRvbWljX2RlYygmaTI0MDBtdS0+cnhfcGVuZGluZ19jb3VudCk7CisJCWlmIChyeF9za2ItPmxlbiA9PSAwKSB7CS8qIHNvbWUgaWdub3JhYmxlIGNvbmRpdGlvbiAqLworCQkJa2ZyZWVfc2tiKHJ4X3NrYik7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIERlbGl2ZXIgdGhlIG1lc3NhZ2UgdG8gdGhlIGdlbmVyaWMgaTI0MDBtIGNvZGUgKi8KKwkJaTI0MDBtdS0+cnhfc2l6ZV9jbnQrKzsKKwkJaTI0MDBtdS0+cnhfc2l6ZV9hY2MgKz0gcnhfc2tiLT5sZW47CisJCXJlc3VsdCA9IGkyNDAwbV9yeChpMjQwMG0sIHJ4X3NrYik7CisJCWlmIChyZXN1bHQgPT0gLUVJTworCQkgICAgJiYgZWRjX2luYygmaTI0MDBtdS0+dXJiX2VkYywKKwkJCSAgICAgICBFRENfTUFYX0VSUk9SUywgRURDX0VSUk9SX1RJTUVGUkFNRSkpIHsKKwkJCWdvdG8gZXJyb3JfcmVzZXQ7CisJCX0KKworCQkvKiBNYXliZSBhZGp1c3QgUlggYnVmZmVyIHNpemUgKi8KKwkJaTI0MDBtdV9yeF9zaXplX21heWJlX3NocmluayhpMjQwMG11KTsKKwl9CisJcmVzdWx0ID0gMDsKK291dDoKKwlkX2ZuZW5kKDQsIGRldiwgIihpMjQwMG11ICVwKSA9ICVkXG4iLCBpMjQwMG11LCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7CisKK2Vycm9yX3Jlc2V0OgorCWRldl9lcnIoZGV2LCAiUlg6IG1heGltdW0gZXJyb3JzIGluIHJlY2VpdmVkIGJ1ZmZlciBleGNlZWRlZDsgIgorCQkicmVzZXR0aW5nIGRldmljZVxuIik7CisJdXNiX3F1ZXVlX3Jlc2V0X2RldmljZShpMjQwMG11LT51c2JfaWZhY2UpOworCWdvdG8gb3V0OworfQorCisKKy8qCisgKiBTdGFydCByZWFkaW5nIGZyb20gdGhlIGRldmljZQorICoKKyAqIEBpMjQwMG06IGRldmljZSBpbnN0YW5jZQorICoKKyAqIE5vdGlmeSB0aGUgUlggdGhyZWFkIHRoYXQgdGhlcmUgaXMgZGF0YSBwZW5kaW5nLgorICovCit2b2lkIGkyNDAwbXVfcnhfa2ljayhzdHJ1Y3QgaTI0MDBtdSAqaTI0MDBtdSkKK3sKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0gPSAmaTI0MDBtdS0+aTI0MDBtOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpMjQwMG11LT51c2JfaWZhY2UtPmRldjsKKworCWRfZm5zdGFydCgzLCBkZXYsICIoaTI0MDBtdSAlcClcbiIsIGkyNDAwbSk7CisJYXRvbWljX2luYygmaTI0MDBtdS0+cnhfcGVuZGluZ19jb3VudCk7CisJd2FrZV91cF9hbGwoJmkyNDAwbXUtPnJ4X3dxKTsKKwlkX2ZuZW5kKDMsIGRldiwgIihpMjQwMG0gJXApID0gdm9pZFxuIiwgaTI0MDBtKTsKK30KKworCitpbnQgaTI0MDBtdV9yeF9zZXR1cChzdHJ1Y3QgaTI0MDBtdSAqaTI0MDBtdSkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0gPSAmaTI0MDBtdS0+aTI0MDBtOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpMjQwMG11LT51c2JfaWZhY2UtPmRldjsKKwlzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYgPSAmaTI0MDBtLT53aW1heF9kZXY7CisKKwlpMjQwMG11LT5yeF9rdGhyZWFkID0ga3RocmVhZF9ydW4oaTI0MDBtdV9yeGQsIGkyNDAwbXUsICIlcy1yeCIsCisJCQkJCSAgd2ltYXhfZGV2LT5uYW1lKTsKKwlpZiAoSVNfRVJSKGkyNDAwbXUtPnJ4X2t0aHJlYWQpKSB7CisJCXJlc3VsdCA9IFBUUl9FUlIoaTI0MDBtdS0+cnhfa3RocmVhZCk7CisJCWRldl9lcnIoZGV2LCAiUlg6IGNhbm5vdCBzdGFydCB0aHJlYWQ6ICVkXG4iLCByZXN1bHQpOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCit2b2lkIGkyNDAwbXVfcnhfcmVsZWFzZShzdHJ1Y3QgaTI0MDBtdSAqaTI0MDBtdSkKK3sKKwlrdGhyZWFkX3N0b3AoaTI0MDBtdS0+cnhfa3RocmVhZCk7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS91c2ItdHguYyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS91c2ItdHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmQ4OTMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3VzYi10eC5jCkBAIC0wLDAgKzEsMjI5IEBACisvKgorICogSW50ZWwgV2lyZWxlc3MgV2lNQVggQ29ubmVjdGlvbiAyNDAwbQorICogVVNCIHNwZWNpZmljIFRYIGhhbmRsaW5nCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqCisgKiBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogWWFuaXIgTHViZXRraW4gPHlhbmlyeC5sdWJldGtpbkBpbnRlbC5jb20+CisgKiAgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiBJbmFreSBQZXJlei1Hb256YWxleiA8aW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tPgorICogIC0gU3BsaXQgdHJhbnNwb3J0L2RldmljZSBzcGVjaWZpYworICoKKyAqCisgKiBUYWtlcyB0aGUgVFggbWVzc2FnZXMgaW4gdGhlIGkyNDAwbSdzIGRyaXZlciBUWCBGSUZPIGFuZCBzZW5kcyB0aGVtCisgKiB0byB0aGUgZGV2aWNlIHVudGlsIHRoZXJlIGFyZSBubyBtb3JlLgorICoKKyAqIElmIHdlIGZhaWwgc2VuZGluZyB0aGUgbWVzc2FnZSwgd2UganVzdCBkcm9wIGl0LiBUaGVyZSBpc24ndCBtdWNoCisgKiB3ZSBjYW4gZG8gYXQgdGhpcyBwb2ludC4gV2UgY291bGQgYWxzbyByZXRyeSwgYnV0IHRoZSBVU0Igc3RhY2sgaGFzCisgKiBhbHJlYWR5IHJldHJpZWQgYW5kIHN0aWxsIGZhaWxlZCwgc28gdGhlcmUgaXMgbm90IG11Y2ggb2YgYQorICogcG9pbnQuIEFzIHdlbGwsIG1vc3Qgb2YgdGhlIHRyYWZmaWMgaXMgbmV0d29yaywgd2hpY2ggaGFzIHJlY292ZXJ5CisgKiBtZXRob2RzIGZvciBkcm9wcGVkIHBhY2tldHMuCisgKgorICogRm9yIHNlbmRpbmcgd2UganVzdCBvYnRhaW4gYSBGSUZPIGJ1ZmZlciB0byBzZW5kLCBzZW5kIGl0IHRvIHRoZQorICogVVNCIGJ1bGsgb3V0LCB0ZWxsIHRoZSBUWCBGSUZPIGNvZGUgd2UgaGF2ZSBzZW50IGl0OyBxdWVyeSBmb3IKKyAqIGFub3RoZXIgb25lLCBldGMuLi4gdW50aWwgZG9uZS4KKyAqCisgKiBXZSB1c2UgYSB0aHJlYWQgc28gd2UgY2FuIGNhbGwgdXNiX2F1dG9wbV9lbmFibGUoKSBhbmQKKyAqIHVzYl9hdXRvcG1fZGlzYWJsZSgpIGZvciBlYWNoIHRyYW5zYWN0aW9uOyB0aGlzIHdheSB3aGVuIHRoZSBkZXZpY2UKKyAqIGdvZXMgaWRsZSwgaXQgd2lsbCBzdXNwZW5kLiBJdCBhbHNvIGhhcyBsZXNzIG92ZXJoZWFkIHRoYW4gYQorICogZGVkaWNhdGVkIHdvcmtxdWV1ZSwgYXMgaXQgaXMgYmVpbmcgdXNlZCBmb3IgYSBzaW5nbGUgdGFzay4KKyAqCisgKiBST0FETUFQCisgKgorICogaTI0MDBtdV90eF9zZXR1cCgpCisgKiBpMjQwMG11X3R4X3JlbGVhc2UoKQorICoKKyAqIGkyNDAwbXVfYnVzX3R4X2tpY2soKQktIENhbGxlZCBieSB0aGUgdHguYyBjb2RlIHdoZW4gdGhlcmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBuZXcgZGF0YSBpbiB0aGUgRklGTy4KKyAqIGkyNDAwbXVfdHhkKCkKKyAqICAgaTI0MDBtX3R4X21zZ19nZXQoKQorICogICBpMjQwMG1fdHhfbXNnX3NlbnQoKQorICovCisjaW5jbHVkZSAiaTI0MDBtLXVzYi5oIgorCisKKyNkZWZpbmUgRF9TVUJNT0RVTEUgdHgKKyNpbmNsdWRlICJ1c2ItZGVidWctbGV2ZWxzLmgiCisKKworLyoKKyAqIEdldCB0aGUgbmV4dCBUWCBtZXNzYWdlIGluIHRoZSBUWCBGSUZPIGFuZCBzZW5kIGl0IHRvIHRoZSBkZXZpY2UKKyAqCisgKiBOb3RlIHRoYXQgYW55IGl0ZXJhdGlvbiBjb25zdW1lcyBhIG1lc3NhZ2UgdG8gYmUgc2VudCwgbm8gbWF0dGVyIGlmCisgKiBpdCBzdWNjZWVkcyBvciBmYWlscyAod2UgaGF2ZSBubyByZWFsIHdheSB0byByZXRyeSBvciBjb21wbGFpbikuCisgKgorICogUmV0dXJuOiAwIGlmIG9rLCA8IDAgZXJybm8gY29kZSBvbiBoYXJkIGVycm9yLgorICovCitzdGF0aWMKK2ludCBpMjQwMG11X3R4KHN0cnVjdCBpMjQwMG11ICppMjQwMG11LCBzdHJ1Y3QgaTI0MDBtX21zZ19oZHIgKnR4X21zZywKKwkgICAgICAgc2l6ZV90IHR4X21zZ19zaXplKQoreworCWludCByZXN1bHQgPSAwOworCXN0cnVjdCBpMjQwMG0gKmkyNDAwbSA9ICZpMjQwMG11LT5pMjQwMG07CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmkyNDAwbXUtPnVzYl9pZmFjZS0+ZGV2OworCWludCB1c2JfcGlwZSwgc2VudF9zaXplLCBkb19hdXRvcG07CisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQ7CisKKwlkX2Zuc3RhcnQoNCwgZGV2LCAiKGkyNDAwbXUgJXApXG4iLCBpMjQwMG11KTsKKwlkb19hdXRvcG0gPSBhdG9taWNfcmVhZCgmaTI0MDBtdS0+ZG9fYXV0b3BtKTsKKwlyZXN1bHQgPSBkb19hdXRvcG0gPworCQl1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2UoaTI0MDBtdS0+dXNiX2lmYWNlKSA6IDA7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJUWDogY2FuJ3QgZ2V0IGF1dG9wbTogJWRcbiIsIHJlc3VsdCk7CisJCWRvX2F1dG9wbSA9IDA7CisJfQorCWVwZCA9IHVzYl9nZXRfZXBkKGkyNDAwbXUtPnVzYl9pZmFjZSwgSTI0MDBNVV9FUF9CVUxLX09VVCk7CisJdXNiX3BpcGUgPSB1c2Jfc25kYnVsa3BpcGUoaTI0MDBtdS0+dXNiX2RldiwgZXBkLT5iRW5kcG9pbnRBZGRyZXNzKTsKK3JldHJ5OgorCXJlc3VsdCA9IHVzYl9idWxrX21zZyhpMjQwMG11LT51c2JfZGV2LCB1c2JfcGlwZSwKKwkJCSAgICAgIHR4X21zZywgdHhfbXNnX3NpemUsICZzZW50X3NpemUsIEhaKTsKKwl1c2JfbWFya19sYXN0X2J1c3koaTI0MDBtdS0+dXNiX2Rldik7CisJc3dpdGNoIChyZXN1bHQpIHsKKwljYXNlIDA6CisJCWlmIChzZW50X3NpemUgIT0gdHhfbXNnX3NpemUpIHsJLyogVG9vIHNob3J0PyBkcm9wIGl0ICovCisJCQlkZXZfZXJyKGRldiwgIlRYOiBzaG9ydCB3cml0ZSAoJWQgQiB2cyAlenUgIgorCQkJCSJleHBlY3RlZClcbiIsIHNlbnRfc2l6ZSwgdHhfbXNnX3NpemUpOworCQkJcmVzdWx0ID0gLUVJTzsKKwkJfQorCQlicmVhazsKKwljYXNlIC1FSU5WQUw6CQkJLyogd2hpbGUgcmVtb3ZpbmcgZHJpdmVyICovCisJY2FzZSAtRU5PREVWOgkJCS8qIGRldiBkaXNjb25uZWN0IC4uLiAqLworCWNhc2UgLUVOT0VOVDoJCQkvKiBqdXN0IGlnbm9yZSBpdCAqLworCWNhc2UgLUVTSFVURE9XTjoJCS8qIGFuZCBleGl0ICovCisJY2FzZSAtRUNPTk5SRVNFVDoKKwkJcmVzdWx0ID0gLUVTSFVURE9XTjsKKwkJYnJlYWs7CisJZGVmYXVsdDoJCQkvKiBTb21lIGVycm9yPyAqLworCQlpZiAoZWRjX2luYygmaTI0MDBtdS0+dXJiX2VkYywKKwkJCSAgICBFRENfTUFYX0VSUk9SUywgRURDX0VSUk9SX1RJTUVGUkFNRSkpIHsKKwkJCWRldl9lcnIoZGV2LCAiVFg6IG1heGltdW0gZXJyb3JzIGluIFVSQiAiCisJCQkJImV4Y2VlZGVkOyByZXNldHRpbmcgZGV2aWNlXG4iKTsKKwkJCXVzYl9xdWV1ZV9yZXNldF9kZXZpY2UoaTI0MDBtdS0+dXNiX2lmYWNlKTsKKwkJfSBlbHNlIHsKKwkJCWRldl9lcnIoZGV2LCAiVFg6IGNhbm5vdCBzZW5kIFVSQjsgcmV0cnlpbmcuICIKKwkJCQkidHhfbXNnIEAlenUgJXp1IEIgWyVkIHNlbnRdOiAlZFxuIiwKKwkJCQkodm9pZCAqKSB0eF9tc2cgLSBpMjQwMG0tPnR4X2J1ZiwKKwkJCQl0eF9tc2dfc2l6ZSwgc2VudF9zaXplLCByZXN1bHQpOworCQkJZ290byByZXRyeTsKKwkJfQorCX0KKwlpZiAoZG9fYXV0b3BtKQorCQl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UoaTI0MDBtdS0+dXNiX2lmYWNlKTsKKwlkX2ZuZW5kKDQsIGRldiwgIihpMjQwMG11ICVwKSA9IHJlc3VsdFxuIiwgaTI0MDBtdSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICogR2V0IHRoZSBuZXh0IFRYIG1lc3NhZ2UgaW4gdGhlIFRYIEZJRk8gYW5kIHNlbmQgaXQgdG8gdGhlIGRldmljZQorICoKKyAqIE5vdGUgd2UgZXhpdCB0aGUgbG9vcCBpZiBpMjQwMG11X3R4KCkgZmFpbHM7IHRoYXQgZnVudGlvbiBvbmx5CisgKiBmYWlscyBvbiBoYXJkIGVycm9yIChmYWlsaW5nIHRvIHR4IGEgYnVmZmVyIG5vdCBiZWluZyBvbmUgb2YgdGhlbSwKKyAqIHNlZSBpdHMgZG9jKS4KKyAqCisgKiBSZXR1cm46IDAKKyAqLworc3RhdGljCitpbnQgaTI0MDBtdV90eGQodm9pZCAqX2kyNDAwbXUpCit7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IGkyNDAwbXUgKmkyNDAwbXUgPSBfaTI0MDBtdTsKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0gPSAmaTI0MDBtdS0+aTI0MDBtOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpMjQwMG11LT51c2JfaWZhY2UtPmRldjsKKwlzdHJ1Y3QgaTI0MDBtX21zZ19oZHIgKnR4X21zZzsKKwlzaXplX3QgdHhfbXNnX3NpemU7CisKKwlkX2Zuc3RhcnQoNCwgZGV2LCAiKGkyNDAwbXUgJXApXG4iLCBpMjQwMG11KTsKKworCXdoaWxlICgxKSB7CisJCWRfcHJpbnRmKDIsIGRldiwgIlRYOiB3YWl0aW5nIGZvciBtZXNzYWdlc1xuIik7CisJCXR4X21zZyA9IE5VTEw7CisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgKKwkJCWkyNDAwbXUtPnR4X3dxLAorCQkJKGt0aHJlYWRfc2hvdWxkX3N0b3AoKQkvKiBjaGVjayB0aGlzIGZpcnN0ISAqLworCQkJIHx8ICh0eF9tc2cgPSBpMjQwMG1fdHhfbXNnX2dldChpMjQwMG0sICZ0eF9tc2dfc2l6ZSkpKQorCQkJKTsKKwkJaWYgKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKKwkJCWJyZWFrOworCQlXQVJOX09OKHR4X21zZyA9PSBOVUxMKTsJLyogc2hvdWxkIG5vdCBoYXBwZW4uLi4qLworCQlkX3ByaW50ZigyLCBkZXYsICJUWDogc3VibWl0dGluZyAlenUgYnl0ZXNcbiIsIHR4X21zZ19zaXplKTsKKwkJZF9kdW1wKDUsIGRldiwgdHhfbXNnLCB0eF9tc2dfc2l6ZSk7CisJCS8qIFllYWgsIHdlIGlnbm9yZSBlcnJvcnMgLi4uIG5vdCBtdWNoIHdlIGNhbiBkbyAqLworCQlpMjQwMG11X3R4KGkyNDAwbXUsIHR4X21zZywgdHhfbXNnX3NpemUpOworCQlpMjQwMG1fdHhfbXNnX3NlbnQoaTI0MDBtKTsJLyogYWNrIGl0LCBhZHZhbmNlIHRoZSBGSUZPICovCisJCWlmIChyZXN1bHQgPCAwKQorCQkJYnJlYWs7CisJfQorCWRfZm5lbmQoNCwgZGV2LCAiKGkyNDAwbXUgJXApID0gJWRcbiIsIGkyNDAwbXUsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICogaTI0MDBtIFRYIGVuZ2luZSBub3RpZmllcyB1cyB0aGF0IHRoZXJlIGlzIGRhdGEgaW4gdGhlIEZJRk8gcmVhZHkKKyAqIGZvciBUWAorICoKKyAqIElmIHRoZXJlIGlzIGEgVVJCIGluIGZsaWdodCwgZG9uJ3QgZG8gYW55dGhpbmc7IHdoZW4gaXQgZmluaXNoZXMsCisgKiBpdCB3aWxsIHNlZSB0aGVyZSBpcyBkYXRhIGluIHRoZSBGSUZPIGFuZCBzZW5kIGl0LiBFbHNlLCBqdXN0CisgKiBzdWJtaXQgYSB3cml0ZS4KKyAqLwordm9pZCBpMjQwMG11X2J1c190eF9raWNrKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSkKK3sKKwlzdHJ1Y3QgaTI0MDBtdSAqaTI0MDBtdSA9IGNvbnRhaW5lcl9vZihpMjQwMG0sIHN0cnVjdCBpMjQwMG11LCBpMjQwMG0pOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpMjQwMG11LT51c2JfaWZhY2UtPmRldjsKKworCWRfZm5zdGFydCgzLCBkZXYsICIoaTI0MDBtICVwKSA9IHZvaWRcbiIsIGkyNDAwbSk7CisJd2FrZV91cF9hbGwoJmkyNDAwbXUtPnR4X3dxKTsKKwlkX2ZuZW5kKDMsIGRldiwgIihpMjQwMG0gJXApID0gdm9pZFxuIiwgaTI0MDBtKTsKK30KKworCitpbnQgaTI0MDBtdV90eF9zZXR1cChzdHJ1Y3QgaTI0MDBtdSAqaTI0MDBtdSkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0gPSAmaTI0MDBtdS0+aTI0MDBtOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpMjQwMG11LT51c2JfaWZhY2UtPmRldjsKKwlzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYgPSAmaTI0MDBtLT53aW1heF9kZXY7CisKKwlpMjQwMG11LT50eF9rdGhyZWFkID0ga3RocmVhZF9ydW4oaTI0MDBtdV90eGQsIGkyNDAwbXUsICIlcy10eCIsCisJCQkJCSAgd2ltYXhfZGV2LT5uYW1lKTsKKwlpZiAoSVNfRVJSKGkyNDAwbXUtPnR4X2t0aHJlYWQpKSB7CisJCXJlc3VsdCA9IFBUUl9FUlIoaTI0MDBtdS0+dHhfa3RocmVhZCk7CisJCWRldl9lcnIoZGV2LCAiVFg6IGNhbm5vdCBzdGFydCB0aHJlYWQ6ICVkXG4iLCByZXN1bHQpOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCit2b2lkIGkyNDAwbXVfdHhfcmVsZWFzZShzdHJ1Y3QgaTI0MDBtdSAqaTI0MDBtdSkKK3sKKwlrdGhyZWFkX3N0b3AoaTI0MDBtdS0+dHhfa3RocmVhZCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdXNiLmMgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZkOTM0NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS91c2IuYwpAQCAtMCwwICsxLDU5NyBAQAorLyoKKyAqIEludGVsIFdpcmVsZXNzIFdpTUFYIENvbm5lY3Rpb24gMjQwMG0KKyAqIExpbnV4IGRyaXZlciBtb2RlbCBnbHVlIGZvciBVU0IgZGV2aWNlLCByZXNldCAmIGZ3IHVwbG9hZAorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqIFlhbmlyIEx1YmV0a2luIDx5YW5pcngubHViZXRraW5AaW50ZWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKgorICogU2VlIGkyNDAwbS11c2IuaCBmb3IgYSBnZW5lcmFsIGRlc2NyaXB0aW9uIG9mIHRoaXMgZHJpdmVyLgorICoKKyAqIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGRyaXZlciBtb2RlbCBnbHVlLCBhbmQgaG9vayB1cHMgZm9yIHRoZQorICogZ2VuZXJpYyBkcml2ZXIgdG8gaW1wbGVtZW50IHRoZSBidXMtc3BlY2lmaWMgZnVuY3Rpb25zIChkZXZpY2UKKyAqIGNvbW11bmljYXRpb24gc2V0dXAvdGVhciBkb3duLCBmaXJtd2FyZSB1cGxvYWQgYW5kIHJlc2V0dGluZykuCisgKgorICogUk9BRE1BUAorICoKKyAqIGkyNDAwbXVfcHJvYmUoKQorICogICBhbGxvY19uZXRkZXYoKS4uLgorICogICAgIGkyNDAwbXVfbmV0ZGV2X3NldHVwKCkKKyAqICAgICAgIGkyNDAwbXVfaW5pdCgpCisgKiAgICAgICBpMjQwMG1fbmV0ZGV2X3NldHVwKCkKKyAqICAgaTI0MDBtX3NldHVwKCkuLi4KKyAqCisgKiBpMjQwMG11X2Rpc2Nvbm5lY3QKKyAqICAgaTI0MDBtX3JlbGVhc2UoKQorICogICBmcmVlX25ldGRldigpCisgKgorICogaTI0MDBtdV9zdXNwZW5kKCkKKyAqICAgaTI0MDBtX2NtZF9lbnRlcl9wb3dlcnNhdmUoKQorICogICBpMjQwMG11X25vdGlmaWNhdGlvbl9yZWxlYXNlKCkKKyAqCisgKiBpMjQwMG11X3Jlc3VtZSgpCisgKiAgIGkyNDAwbXVfbm90aWZpY2F0aW9uX3NldHVwKCkKKyAqCisgKiBpMjQwMG11X2J1c19kZXZfc3RhcnQoKSAgICAgICAgQ2FsbGVkIGJ5IGkyNDAwbV9kZXZfc3RhcnQoKSBbd2hvIGlzCisgKiAgIGkyNDAwbXVfdHhfc2V0dXAoKSAgICAgICAgICAgY2FsbGVkIGJ5IGkyNDAwbV9zZXR1cCgpXQorICogICBpMjQwMG11X3J4X3NldHVwKCkKKyAqICAgaTI0MDBtdV9ub3RpZmljYXRpb25fc2V0dXAoKQorICoKKyAqIGkyNDAwbXVfYnVzX2Rldl9zdG9wKCkgICAgICAgICBDYWxsZWQgYnkgaTI0MDBtX2Rldl9zdG9wKCkgW3dobyBpcworICogICBpMjQwMG11X25vdGlmaWNhdGlvbl9yZWxlYXNlKCkgIGNhbGxlZCBieSBpMjQwMG1fcmVsZWFzZSgpXQorICogICBpMjQwMG11X3J4X3JlbGVhc2UoKQorICogICBpMjQwMG11X3R4X3JlbGVhc2UoKQorICoKKyAqIGkyNDAwbXVfYnVzX3Jlc2V0KCkgICAgICAgICAgICBDYWxsZWQgYnkgaTI0MDBtLT5idXNfcmVzZXQKKyAqICAgX19pMjQwMG11X3Jlc2V0KCkKKyAqICAgICBfX2kyNDAwbXVfc2VuZF9iYXJrZXIoKQorICogICB1c2JfcmVzZXRfZGV2aWNlKCkKKyAqLworI2luY2x1ZGUgImkyNDAwbS11c2IuaCIKKyNpbmNsdWRlIDxsaW51eC93aW1heC9pMjQwMG0uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisKKworI2RlZmluZSBEX1NVQk1PRFVMRSB1c2IKKyNpbmNsdWRlICJ1c2ItZGVidWctbGV2ZWxzLmgiCisKKworLyogT3VyIGZpcm13YXJlIGZpbGUgbmFtZSAqLworI2RlZmluZSBJMjQwME1VX0ZXX0ZJTEVfTkFNRSAiaTI0MDBtLWZ3LXVzYi0iIEkyNDAwTV9GV19WRVJTSU9OICIuc2JjZiIKKworc3RhdGljCitpbnQgaTI0MDBtdV9idXNfZGV2X3N0YXJ0KHN0cnVjdCBpMjQwMG0gKmkyNDAwbSkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBpMjQwMG11ICppMjQwMG11ID0gY29udGFpbmVyX29mKGkyNDAwbSwgc3RydWN0IGkyNDAwbXUsIGkyNDAwbSk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmkyNDAwbXUtPnVzYl9pZmFjZS0+ZGV2OworCisJZF9mbnN0YXJ0KDMsIGRldiwgIihpMjQwMG0gJXApXG4iLCBpMjQwMG0pOworCXJlc3VsdCA9IGkyNDAwbXVfdHhfc2V0dXAoaTI0MDBtdSk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gZXJyb3JfdXNiX3R4X3NldHVwOworCXJlc3VsdCA9IGkyNDAwbXVfcnhfc2V0dXAoaTI0MDBtdSk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gZXJyb3JfdXNiX3J4X3NldHVwOworCXJlc3VsdCA9IGkyNDAwbXVfbm90aWZpY2F0aW9uX3NldHVwKGkyNDAwbXUpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIGVycm9yX25vdGlmX3NldHVwOworCWRfZm5lbmQoMywgZGV2LCAiKGkyNDAwbSAlcCkgPSAlZFxuIiwgaTI0MDBtLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7CisKK2Vycm9yX25vdGlmX3NldHVwOgorCWkyNDAwbXVfcnhfcmVsZWFzZShpMjQwMG11KTsKK2Vycm9yX3VzYl9yeF9zZXR1cDoKKwlpMjQwMG11X3R4X3JlbGVhc2UoaTI0MDBtdSk7CitlcnJvcl91c2JfdHhfc2V0dXA6CisJZF9mbmVuZCgzLCBkZXYsICIoaTI0MDBtICVwKSA9IHZvaWRcbiIsIGkyNDAwbSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMKK3ZvaWQgaTI0MDBtdV9idXNfZGV2X3N0b3Aoc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCXN0cnVjdCBpMjQwMG11ICppMjQwMG11ID0gY29udGFpbmVyX29mKGkyNDAwbSwgc3RydWN0IGkyNDAwbXUsIGkyNDAwbSk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmkyNDAwbXUtPnVzYl9pZmFjZS0+ZGV2OworCisJZF9mbnN0YXJ0KDMsIGRldiwgIihpMjQwMG0gJXApXG4iLCBpMjQwMG0pOworCWkyNDAwbXVfbm90aWZpY2F0aW9uX3JlbGVhc2UoaTI0MDBtdSk7CisJaTI0MDBtdV9yeF9yZWxlYXNlKGkyNDAwbXUpOworCWkyNDAwbXVfdHhfcmVsZWFzZShpMjQwMG11KTsKKwlkX2ZuZW5kKDMsIGRldiwgIihpMjQwMG0gJXApID0gdm9pZFxuIiwgaTI0MDBtKTsKK30KKworCisvKgorICogU2VuZHMgYSBiYXJrZXIgYnVmZmVyIHRvIHRoZSBkZXZpY2UKKyAqCisgKiBUaGlzIGhlbHBlciB3aWxsIGFsbG9jYXRlIGEga21hbGxvY2VkIGJ1ZmZlciBhbmQgdXNlIGl0IHRvIHRyYW5zbWl0CisgKiAodGhlbiBmcmVlIGl0KS4gUmVhc29uIGZvciB0aGlzIGlzIHRoYXQgb3RoZXIgYXJjaGVzIGNhbm5vdCB1c2UKKyAqIHN0YWNrL3ZtYWxsb2MvdGV4dCBhcmVhcyBmb3IgRE1BIHRyYW5zZmVycy4KKyAqCisgKiBFcnJvciByZWNvdmVyeSBoZXJlIGlzIHNpbXBsZXI6IGFueXRoaW5nIGlzIGNvbnNpZGVyZWQgYSBoYXJkIGVycm9yCisgKiBhbmQgd2lsbCBtb3ZlIHRoZSByZXNldCBjb2RlIHRvIHVzZSBhIGxhc3QtcmVzb3J0IGJ1cy1iYXNlZCByZXNldC4KKyAqLworc3RhdGljCitpbnQgX19pMjQwMG11X3NlbmRfYmFya2VyKHN0cnVjdCBpMjQwMG11ICppMjQwMG11LAorCQkJICBjb25zdCBfX2xlMzIgKmJhcmtlciwKKwkJCSAgc2l6ZV90IGJhcmtlcl9zaXplLAorCQkJICB1bnNpZ25lZCBlbmRwb2ludCkKK3sKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCA9IE5VTEw7CisJaW50IHBpcGUsIGFjdHVhbF9sZW4sIHJldDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaTI0MDBtdS0+dXNiX2lmYWNlLT5kZXY7CisJdm9pZCAqYnVmZmVyOworCWludCBkb19hdXRvcG0gPSAxOworCisJcmV0ID0gdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKGkyNDAwbXUtPnVzYl9pZmFjZSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJSRVNFVDogY2FuJ3QgZ2V0IGF1dG9wbTogJWRcbiIsIHJldCk7CisJCWRvX2F1dG9wbSA9IDA7CisJfQorCXJldCA9IC1FTk9NRU07CisJYnVmZmVyID0ga21hbGxvYyhiYXJrZXJfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKGJ1ZmZlciA9PSBOVUxMKQorCQlnb3RvIGVycm9yX2t6YWxsb2M7CisJZXBkID0gdXNiX2dldF9lcGQoaTI0MDBtdS0+dXNiX2lmYWNlLCBlbmRwb2ludCk7CisJcGlwZSA9IHVzYl9zbmRidWxrcGlwZShpMjQwMG11LT51c2JfZGV2LCBlcGQtPmJFbmRwb2ludEFkZHJlc3MpOworCW1lbWNweShidWZmZXIsIGJhcmtlciwgYmFya2VyX3NpemUpOworCXJldCA9IHVzYl9idWxrX21zZyhpMjQwMG11LT51c2JfZGV2LCBwaXBlLCBidWZmZXIsIGJhcmtlcl9zaXplLAorCQkJICAgJmFjdHVhbF9sZW4sIEhaKTsKKwlpZiAocmV0IDwgMCkgeworCQlpZiAocmV0ICE9IC1FSU5WQUwpCisJCQlkZXZfZXJyKGRldiwgIkU6IGJhcmtlciBlcnJvcjogJWRcbiIsIHJldCk7CisJfSBlbHNlIGlmIChhY3R1YWxfbGVuICE9IGJhcmtlcl9zaXplKSB7CisJCWRldl9lcnIoZGV2LCAiRTogb25seSAlZCBieXRlcyB0cmFuc21pdHRlZFxuIiwgYWN0dWFsX2xlbik7CisJCXJldCA9IC1FSU87CisJfQorCWtmcmVlKGJ1ZmZlcik7CitlcnJvcl9remFsbG9jOgorCWlmIChkb19hdXRvcG0pCisJCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZShpMjQwMG11LT51c2JfaWZhY2UpOworCXJldHVybiByZXQ7Cit9CisKKworLyoKKyAqIFJlc2V0IGEgZGV2aWNlIGF0IGRpZmZlcmVudCBsZXZlbHMgKHdhcm0sIGNvbGQgb3IgYnVzKQorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKiBAcmVzZXRfdHlwZTogc29mdCwgd2FybSBvciBidXMgcmVzZXQgKEkyNDAwTV9SVF9XQVJNL1NPRlQvQlVTKQorICoKKyAqIFdhcm0gYW5kIGNvbGQgcmVzZXRzIGdldCBhIFVTQiByZXNldCBpZiB0aGV5IGZhaWwuCisgKgorICogV2FybSByZXNldDoKKyAqCisgKiBUaGUgZGV2aWNlIHdpbGwgYmUgZnVsbHkgcmVzZXQgaW50ZXJuYWxseSwgYnV0IHdvbid0IGJlCisgKiBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgVVNCIGJ1cyAoc28gbm8gcmVlbnVtZXJhdGlvbiB3aWxsCisgKiBoYXBwZW4pLiBGaXJtd2FyZSB1cGxvYWQgd2lsbCBiZSBuZWNjZXNzYXJ5LgorICoKKyAqIFRoZSBkZXZpY2Ugd2lsbCBzZW5kIGEgcmVib290IGJhcmtlciBpbiB0aGUgbm90aWZpY2F0aW9uIGVuZHBvaW50CisgKiB0aGF0IHdpbGwgdHJpZ2dlciB0aGUgZHJpdmVyIHRvIHJlaW5pdGlhbGl6ZSB0aGUgc3RhdGUKKyAqIGF1dG9tYXRpY2FsbHkgZnJvbSBub3RpZi5jOmkyNDAwbV9ub3RpZmljYXRpb25fZ3JvaygpIGludG8KKyAqIGkyNDAwbV9kZXZfYm9vdHN0cmFwX2RlbGF5ZWQoKS4KKyAqCisgKiBDb2xkIGFuZCBidXMgKFVTQikgcmVzZXQ6CisgKgorICogVGhlIGRldmljZSB3aWxsIGJlIGZ1bGx5IHJlc2V0IGludGVybmFsbHksIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZQorICogVVNCIGJ1cyBhbiBhIHJlZW51bWVyYXRpb24gd2lsbCBoYXBwZW4uIEZpcm13YXJlIHVwbG9hZCB3aWxsIGJlCisgKiBuZWNjZXNzYXJ5LiBUaHVzLCB3ZSBkb24ndCBkbyBhbnkgbG9ja2luZyBvciBzdHJ1Y3QKKyAqIHJlaW5pdGlhbGl6YXRpb24sIGFzIHdlIGFyZSBnb2luZyB0byBiZSBmdWxseSBkaXNjb25uZWN0ZWQgYW5kCisgKiByZWVudW1lcmF0ZWQuCisgKgorICogTm90ZSB3ZSBuZWVkIHRvIHJldHVybiAtRU5PREVWIGlmIGEgd2FybSByZXNldCB3YXMgcmVxdWVzdGVkIGFuZCB3ZQorICogaGFkIHRvIHJlc29ydCB0byBhIGJ1cyByZXNldC4gU2VlIGkyNDAwbV9vcF9yZXNldCgpLCB3aW1heF9yZXNldCgpCisgKiBhbmQgd2ltYXhfZGV2LT5vcF9yZXNldC4KKyAqCisgKiBXQVJOSU5HOiBubyBkcml2ZXIgc3RhdGUgc2F2ZWQvZml4ZWQKKyAqLworc3RhdGljCitpbnQgaTI0MDBtdV9idXNfcmVzZXQoc3RydWN0IGkyNDAwbSAqaTI0MDBtLCBlbnVtIGkyNDAwbV9yZXNldF90eXBlIHJ0KQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGkyNDAwbXUgKmkyNDAwbXUgPQorCQljb250YWluZXJfb2YoaTI0MDBtLCBzdHJ1Y3QgaTI0MDBtdSwgaTI0MDBtKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJc3RhdGljIGNvbnN0IF9fbGUzMiBpMjQwMG1fV0FSTV9CT09UX0JBUktFUls0XSA9IHsKKwkJX19jb25zdGFudF9jcHVfdG9fbGUzMihJMjQwME1fV0FSTV9SRVNFVF9CQVJLRVIpLAorCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKEkyNDAwTV9XQVJNX1JFU0VUX0JBUktFUiksCisJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoSTI0MDBNX1dBUk1fUkVTRVRfQkFSS0VSKSwKKwkJX19jb25zdGFudF9jcHVfdG9fbGUzMihJMjQwME1fV0FSTV9SRVNFVF9CQVJLRVIpLAorCX07CisJc3RhdGljIGNvbnN0IF9fbGUzMiBpMjQwMG1fQ09MRF9CT09UX0JBUktFUls0XSA9IHsKKwkJX19jb25zdGFudF9jcHVfdG9fbGUzMihJMjQwME1fQ09MRF9SRVNFVF9CQVJLRVIpLAorCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKEkyNDAwTV9DT0xEX1JFU0VUX0JBUktFUiksCisJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoSTI0MDBNX0NPTERfUkVTRVRfQkFSS0VSKSwKKwkJX19jb25zdGFudF9jcHVfdG9fbGUzMihJMjQwME1fQ09MRF9SRVNFVF9CQVJLRVIpLAorCX07CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKGkyNDAwbSAlcCBydCAldSlcbiIsIGkyNDAwbSwgcnQpOworCWlmIChydCA9PSBJMjQwME1fUlRfV0FSTSkKKwkJcmVzdWx0ID0gX19pMjQwMG11X3NlbmRfYmFya2VyKGkyNDAwbXUsIGkyNDAwbV9XQVJNX0JPT1RfQkFSS0VSLAorCQkJCQkgICAgICAgc2l6ZW9mKGkyNDAwbV9XQVJNX0JPT1RfQkFSS0VSKSwKKwkJCQkJICAgICAgIEkyNDAwTVVfRVBfQlVMS19PVVQpOworCWVsc2UgaWYgKHJ0ID09IEkyNDAwTV9SVF9DT0xEKQorCQlyZXN1bHQgPSBfX2kyNDAwbXVfc2VuZF9iYXJrZXIoaTI0MDBtdSwgaTI0MDBtX0NPTERfQk9PVF9CQVJLRVIsCisJCQkJCSAgICAgICBzaXplb2YoaTI0MDBtX0NPTERfQk9PVF9CQVJLRVIpLAorCQkJCQkgICAgICAgSTI0MDBNVV9FUF9SRVNFVF9DT0xEKTsKKwllbHNlIGlmIChydCA9PSBJMjQwME1fUlRfQlVTKSB7Citkb19idXNfcmVzZXQ6CisJCXJlc3VsdCA9IHVzYl9yZXNldF9kZXZpY2UoaTI0MDBtdS0+dXNiX2Rldik7CisJCXN3aXRjaCAocmVzdWx0KSB7CisJCWNhc2UgMDoKKwkJY2FzZSAtRUlOVkFMOgkvKiBkZXZpY2UgaXMgZ29uZSAqLworCQljYXNlIC1FTk9ERVY6CisJCWNhc2UgLUVOT0VOVDoKKwkJY2FzZSAtRVNIVVRET1dOOgorCQkJcmVzdWx0ID0gcnQgPT0gSTI0MDBNX1JUX1dBUk0gPyAtRU5PREVWIDogMDsKKwkJCWJyZWFrOwkvKiBXZSBhc3N1bWUgdGhlIGRldmljZSBpcyBkaXNjb25uZWN0ZWQgKi8KKwkJZGVmYXVsdDoKKwkJCWRldl9lcnIoZGV2LCAiVVNCIHJlc2V0IGZhaWxlZCAoJWQpLCBnaXZpbmcgdXAhXG4iLAorCQkJCXJlc3VsdCk7CisJCX0KKwl9IGVsc2UKKwkJQlVHKCk7CisJaWYgKHJlc3VsdCA8IDAKKwkgICAgJiYgcmVzdWx0ICE9IC1FSU5WQUwJLyogZGV2aWNlIGlzIGdvbmUgKi8KKwkgICAgJiYgcnQgIT0gSTI0MDBNX1JUX0JVUykgeworCQlkZXZfZXJyKGRldiwgIiVzIHJlc2V0IGZhaWxlZCAoJWQpOyB0cnlpbmcgVVNCIHJlc2V0XG4iLAorCQkJcnQgPT0gSTI0MDBNX1JUX1dBUk0gPyAid2FybSIgOiAiY29sZCIsIHJlc3VsdCk7CisJCXJ0ID0gSTI0MDBNX1JUX0JVUzsKKwkJZ290byBkb19idXNfcmVzZXQ7CisJfQorCWRfZm5lbmQoMywgZGV2LCAiKGkyNDAwbSAlcCBydCAldSkgPSAlZFxuIiwgaTI0MDBtLCBydCwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYwordm9pZCBpMjQwMG11X25ldGRldl9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0gPSBuZXRfZGV2X3RvX2kyNDAwbShuZXRfZGV2KTsKKwlzdHJ1Y3QgaTI0MDBtdSAqaTI0MDBtdSA9IGNvbnRhaW5lcl9vZihpMjQwMG0sIHN0cnVjdCBpMjQwMG11LCBpMjQwMG0pOworCWkyNDAwbXVfaW5pdChpMjQwMG11KTsKKwlpMjQwMG1fbmV0ZGV2X3NldHVwKG5ldF9kZXYpOworfQorCisKKy8qCisgKiBEZWJ1ZyBsZXZlbHMgY29udHJvbDsgc2VlIGRlYnVnLmgKKyAqLworc3RydWN0IGRfbGV2ZWwgRF9MRVZFTFtdID0geworCURfU1VCTU9EVUxFX0RFRklORSh1c2IpLAorCURfU1VCTU9EVUxFX0RFRklORShmdyksCisJRF9TVUJNT0RVTEVfREVGSU5FKG5vdGlmKSwKKwlEX1NVQk1PRFVMRV9ERUZJTkUocngpLAorCURfU1VCTU9EVUxFX0RFRklORSh0eCksCit9Oworc2l6ZV90IERfTEVWRUxfU0laRSA9IEFSUkFZX1NJWkUoRF9MRVZFTCk7CisKKworI2RlZmluZSBfX2RlYnVnZnNfcmVnaXN0ZXIocHJlZml4LCBuYW1lLCBwYXJlbnQpCQkJXAorZG8gewkJCQkJCQkJCVwKKwlyZXN1bHQgPSBkX2xldmVsX3JlZ2lzdGVyX2RlYnVnZnMocHJlZml4LCBuYW1lLCBwYXJlbnQpOwlcCisJaWYgKHJlc3VsdCA8IDApCQkJCQkJCVwKKwkJZ290byBlcnJvcjsJCQkJCQlcCit9IHdoaWxlICgwKQorCisKK3N0YXRpYworaW50IGkyNDAwbXVfZGVidWdmc19hZGQoc3RydWN0IGkyNDAwbXUgKmkyNDAwbXUpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaTI0MDBtdS0+dXNiX2lmYWNlLT5kZXY7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gaTI0MDBtdS0+aTI0MDBtLndpbWF4X2Rldi5kZWJ1Z2ZzX2RlbnRyeTsKKwlzdHJ1Y3QgZGVudHJ5ICpmZDsKKworCWRlbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2RpcigiaTI0MDBtLXVzYiIsIGRlbnRyeSk7CisJcmVzdWx0ID0gUFRSX0VSUihkZW50cnkpOworCWlmIChJU19FUlIoZGVudHJ5KSkgeworCQlpZiAocmVzdWx0ID09IC1FTk9ERVYpCisJCQlyZXN1bHQgPSAwOwkvKiBObyBkZWJ1Z2ZzIHN1cHBvcnQgKi8KKwkJZ290byBlcnJvcjsKKwl9CisJaTI0MDBtdS0+ZGVidWdmc19kZW50cnkgPSBkZW50cnk7CisJX19kZWJ1Z2ZzX3JlZ2lzdGVyKCJkbF8iLCB1c2IsIGRlbnRyeSk7CisJX19kZWJ1Z2ZzX3JlZ2lzdGVyKCJkbF8iLCBmdywgZGVudHJ5KTsKKwlfX2RlYnVnZnNfcmVnaXN0ZXIoImRsXyIsIG5vdGlmLCBkZW50cnkpOworCV9fZGVidWdmc19yZWdpc3RlcigiZGxfIiwgcngsIGRlbnRyeSk7CisJX19kZWJ1Z2ZzX3JlZ2lzdGVyKCJkbF8iLCB0eCwgZGVudHJ5KTsKKworCS8qIERvbid0IHRvdWNoIHRoZXNlIGlmIHlvdSBkb24ndCBrbm93IHdoYXQgeW91IGFyZSBkb2luZyAqLworCWZkID0gZGVidWdmc19jcmVhdGVfdTgoInJ4X3NpemVfYXV0b19zaHJpbmsiLCAwNjAwLCBkZW50cnksCisJCQkgICAgICAgJmkyNDAwbXUtPnJ4X3NpemVfYXV0b19zaHJpbmspOworCXJlc3VsdCA9IFBUUl9FUlIoZmQpOworCWlmIChJU19FUlIoZmQpICYmIHJlc3VsdCAhPSAtRU5PREVWKSB7CisJCWRldl9lcnIoZGV2LCAiQ2FuJ3QgY3JlYXRlIGRlYnVnZnMgZW50cnkgIgorCQkJInJ4X3NpemVfYXV0b19zaHJpbms6ICVkXG4iLCByZXN1bHQpOworCQlnb3RvIGVycm9yOworCX0KKworCWZkID0gZGVidWdmc19jcmVhdGVfc2l6ZV90KCJyeF9zaXplIiwgMDYwMCwgZGVudHJ5LAorCQkJCSAgICZpMjQwMG11LT5yeF9zaXplKTsKKwlyZXN1bHQgPSBQVFJfRVJSKGZkKTsKKwlpZiAoSVNfRVJSKGZkKSAmJiByZXN1bHQgIT0gLUVOT0RFVikgeworCQlkZXZfZXJyKGRldiwgIkNhbid0IGNyZWF0ZSBkZWJ1Z2ZzIGVudHJ5ICIKKwkJCSJyeF9zaXplOiAlZFxuIiwgcmVzdWx0KTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGkyNDAwbXUtPmRlYnVnZnNfZGVudHJ5KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKiBQcm9iZSBhIGkyNDAwbSBpbnRlcmZhY2UgYW5kIHJlZ2lzdGVyIGl0CisgKgorICogQGlmYWNlOiAgIFVTQiBpbnRlcmZhY2UgdG8gbGluayB0bworICogQGlkOiAgICAgIFVTQiBjbGFzcy9zdWJjbGFzcy9wcm90b2NvbCBpZAorICogQHJldHVybnM6IDAgaWYgb2ssIDwgMCBlcnJubyBjb2RlIG9uIGVycm9yLgorICoKKyAqIEFsbG9jIGEgbmV0IGRldmljZSwgaW5pdGlhbGl6ZSB0aGUgYnVzLXNwZWNpZmljIGRldGFpbHMgYW5kIHRoZW4KKyAqIGNhbGxzIHRoZSBidXMtZ2VuZXJpYyBpbml0aWFsaXphdGlvbiByb3V0aW5lLiBUaGF0IHdpbGwgcmVnaXN0ZXIKKyAqIHRoZSB3aW1heCBhbmQgbmV0ZGV2IGRldmljZXMsIHVwbG9hZCB0aGUgZmlybXdhcmUgW3VzaW5nCisgKiBfYnVzX2JtXyooKV0sIGNhbGwgX2J1c19kZXZfc3RhcnQoKSB0byBmaW5hbGl6ZSB0aGUgc2V0dXAgb2YgdGhlCisgKiBjb21tdW5pY2F0aW9uIHdpdGggdGhlIGRldmljZSBhbmQgdGhlbiB3aWxsIHN0YXJ0IHRvIHRhbGsgdG8gaXQgdG8KKyAqIGZpbm5pc2ggc2V0dGluZyBpdCB1cC4KKyAqLworc3RhdGljCitpbnQgaTI0MDBtdV9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2UsCisJCSAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXY7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmlmYWNlLT5kZXY7CisJc3RydWN0IGkyNDAwbSAqaTI0MDBtOworCXN0cnVjdCBpMjQwMG11ICppMjQwMG11OworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpZmFjZSk7CisKKwlpZiAodXNiX2Rldi0+c3BlZWQgIT0gVVNCX1NQRUVEX0hJR0gpCisJCWRldl9lcnIoZGV2LCAiZGV2aWNlIG5vdCBjb25uZWN0ZWQgYXMgaGlnaCBzcGVlZFxuIik7CisKKwkvKiBBbGxvY2F0ZSBpbnN0YW5jZSBbY2FsbHMgaTI0MDBtX25ldGRldl9zZXR1cCgpIG9uIGl0XS4gKi8KKwlyZXN1bHQgPSAtRU5PTUVNOworCW5ldF9kZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKCppMjQwMG11KSwgIndteCVkIiwKKwkJCSAgICAgICBpMjQwMG11X25ldGRldl9zZXR1cCk7CisJaWYgKG5ldF9kZXYgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgIm5vIG1lbW9yeSBmb3IgbmV0d29yayBkZXZpY2UgaW5zdGFuY2VcbiIpOworCQlnb3RvIGVycm9yX2FsbG9jX25ldGRldjsKKwl9CisJU0VUX05FVERFVl9ERVYobmV0X2RldiwgZGV2KTsKKwlpMjQwMG0gPSBuZXRfZGV2X3RvX2kyNDAwbShuZXRfZGV2KTsKKwlpMjQwMG11ID0gY29udGFpbmVyX29mKGkyNDAwbSwgc3RydWN0IGkyNDAwbXUsIGkyNDAwbSk7CisJaTI0MDBtLT53aW1heF9kZXYubmV0X2RldiA9IG5ldF9kZXY7CisJaTI0MDBtdS0+dXNiX2RldiA9IHVzYl9nZXRfZGV2KHVzYl9kZXYpOworCWkyNDAwbXUtPnVzYl9pZmFjZSA9IGlmYWNlOworCXVzYl9zZXRfaW50ZmRhdGEoaWZhY2UsIGkyNDAwbXUpOworCisJaTI0MDBtLT5idXNfdHhfYmxvY2tfc2l6ZSA9IEkyNDAwTVVfQkxLX1NJWkU7CisJaTI0MDBtLT5idXNfcGxfc2l6ZV9tYXggPSBJMjQwME1VX1BMX1NJWkVfTUFYOworCWkyNDAwbS0+YnVzX2Rldl9zdGFydCA9IGkyNDAwbXVfYnVzX2Rldl9zdGFydDsKKwlpMjQwMG0tPmJ1c19kZXZfc3RvcCA9IGkyNDAwbXVfYnVzX2Rldl9zdG9wOworCWkyNDAwbS0+YnVzX3R4X2tpY2sgPSBpMjQwMG11X2J1c190eF9raWNrOworCWkyNDAwbS0+YnVzX3Jlc2V0ID0gaTI0MDBtdV9idXNfcmVzZXQ7CisJaTI0MDBtLT5idXNfYm1fY21kX3NlbmQgPSBpMjQwMG11X2J1c19ibV9jbWRfc2VuZDsKKwlpMjQwMG0tPmJ1c19ibV93YWl0X2Zvcl9hY2sgPSBpMjQwMG11X2J1c19ibV93YWl0X2Zvcl9hY2s7CisJaTI0MDBtLT5idXNfZndfbmFtZSA9IEkyNDAwTVVfRldfRklMRV9OQU1FOworCWkyNDAwbS0+YnVzX2JtX21hY19hZGRyX2ltcGFpcmVkID0gMDsKKworI2lmZGVmIENPTkZJR19QTQorCWlmYWNlLT5uZWVkc19yZW1vdGVfd2FrZXVwID0gMTsJCS8qIGF1dG9zdXNwZW5kICgxNXMgZGVsYXkpICovCisJZGV2aWNlX2luaXRfd2FrZXVwKGRldiwgMSk7CisJdXNiX2F1dG9wbV9lbmFibGUoaTI0MDBtdS0+dXNiX2lmYWNlKTsKKwl1c2JfZGV2LT5hdXRvc3VzcGVuZF9kZWxheSA9IDE1ICogSFo7CisJdXNiX2Rldi0+YXV0b3N1c3BlbmRfZGlzYWJsZWQgPSAwOworI2VuZGlmCisKKwlyZXN1bHQgPSBpMjQwMG1fc2V0dXAoaTI0MDBtLCBJMjQwME1fQlJJX01BQ19SRUlOSVQpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiY2Fubm90IHNldHVwIGRldmljZTogJWRcbiIsIHJlc3VsdCk7CisJCWdvdG8gZXJyb3Jfc2V0dXA7CisJfQorCXJlc3VsdCA9IGkyNDAwbXVfZGVidWdmc19hZGQoaTI0MDBtdSk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJDYW4ndCByZWdpc3RlciBpMjQwMG11J3MgZGVidWdmczogJWRcbiIsIHJlc3VsdCk7CisJCWdvdG8gZXJyb3JfZGVidWdmc19hZGQ7CisJfQorCXJldHVybiAwOworCitlcnJvcl9kZWJ1Z2ZzX2FkZDoKKwlpMjQwMG1fcmVsZWFzZShpMjQwMG0pOworZXJyb3Jfc2V0dXA6CisJdXNiX3NldF9pbnRmZGF0YShpZmFjZSwgTlVMTCk7CisJdXNiX3B1dF9kZXYoaTI0MDBtdS0+dXNiX2Rldik7CisJZnJlZV9uZXRkZXYobmV0X2Rldik7CitlcnJvcl9hbGxvY19uZXRkZXY6CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICogRGlzY29uZWN0IGEgaTI0MDBtIGZyb20gdGhlIHN5c3RlbS4KKyAqCisgKiBpMjQwMG1fc3RvcCgpIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUsIHNvIGFsIHRoZSByeCBhbmQgdHggY29udGV4dHMKKyAqIGhhdmUgYmVlbiB0YWtlbiBkb3duIGFscmVhZHkuIE1ha2Ugc3VyZSB0aGUgcXVldWUgaXMgc3RvcHBlZCwKKyAqIHVucmVnaXN0ZXIgbmV0ZGV2IGFuZCBpMjQwMG0sIGZyZWUgYW5kIGtpbGwuCisgKi8KK3N0YXRpYwordm9pZCBpMjQwMG11X2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlKQoreworCXN0cnVjdCBpMjQwMG11ICppMjQwMG11ID0gdXNiX2dldF9pbnRmZGF0YShpZmFjZSk7CisJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gJmkyNDAwbXUtPmkyNDAwbTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IGkyNDAwbS0+d2ltYXhfZGV2Lm5ldF9kZXY7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmlmYWNlLT5kZXY7CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKGlmYWNlICVwIGkyNDAwbSAlcClcbiIsIGlmYWNlLCBpMjQwMG0pOworCisJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGkyNDAwbXUtPmRlYnVnZnNfZGVudHJ5KTsKKwlpMjQwMG1fcmVsZWFzZShpMjQwMG0pOworCXVzYl9zZXRfaW50ZmRhdGEoaWZhY2UsIE5VTEwpOworCXVzYl9wdXRfZGV2KGkyNDAwbXUtPnVzYl9kZXYpOworCWZyZWVfbmV0ZGV2KG5ldF9kZXYpOworCWRfZm5lbmQoMywgZGV2LCAiKGlmYWNlICVwIGkyNDAwbSAlcCkgPSB2b2lkXG4iLCBpZmFjZSwgaTI0MDBtKTsKK30KKworCisvKgorICogR2V0IHRoZSBkZXZpY2UgcmVhZHkgZm9yIFVTQiBwb3J0IG9yIHN5c3RlbSBzdGFuZGJ5IGFuZCBoaWJlcm5hdGlvbgorICoKKyAqIFVTQiBwb3J0IGFuZCBzeXN0ZW0gc3RhbmRieSBhcmUgaGFuZGxlZCB0aGUgc2FtZS4KKyAqCisgKiBXaGVuIHRoZSBzeXN0ZW0gaGliZXJuYXRlcywgdGhlIFVTQiBkZXZpY2UgaXMgcG93ZXJlZCBkb3duIGFuZCB0aGVuCisgKiB1cCwgc28gd2UgZG9uJ3QgcmVhbGx5IGhhdmUgdG8gZG8gbXVjaCBoZXJlLCBhcyBpdCB3aWxsIGJlIHNlZW4gYXMKKyAqIGEgcmVjb25uZWN0LiBTdGlsbCBmb3Igc2ltcGxpY2l0eSB3ZSBjb25zaWRlciB0aGlzIGNhc2UgdGhlIHNhbWUgYXMKKyAqIHN1c3BlbmQsIHNvIHRoYXQgdGhlIGRldmljZSBoYXMgYSBjaGFuY2UgdG8gZG8gbm90aWZ5IHRoZSBiYXNlCisgKiBzdGF0aW9uIChpZiBjb25uZWN0ZWQpLgorICoKKyAqIFNvIGF0IHRoZSBlbmQsIHRoZSB0aHJlZSBjYXNlcyByZXF1aXJlIGNvbW1vbiBoYW5kbGluZy4KKyAqCisgKiBJZiBhdCB0aGUgdGltZSBvZiB0aGlzIGNhbGwgdGhlIGRldmljZSdzIGZpcm13YXJlIGlzIG5vdCBsb2FkZWQsCisgKiBub3RoaW5nIGhhcyB0byBiZSBkb25lLgorICoKKyAqIElmIHRoZSBmaXJtd2FyZSBpcyBsb2FkZWQsIHdlIG5lZWQgdG86CisgKgorICogIC0gdGVsbCB0aGUgZGV2aWNlIHRvIGdvIGludG8gaG9zdCBpbnRlcmZhY2UgcG93ZXIgc2F2ZSBtb2RlLCB3YWl0CisgKiAgICBmb3IgaXQgdG8gYWNrCisgKgorICogICAgVGhpcyBpcyBxdWl0ZSBtb3JlIGludGVyZXN0aW5nIHRoYW4gaXQgaXM7IHdlIG5lZWQgdG8gZXhlY3V0ZSBhCisgKiAgICBjb21tYW5kLCBidXQgdGhpcyB0aW1lLCB3ZSBkb24ndCB3YW50IHRoZSBjb2RlIGluIHVzYi17dHgscnh9LmMKKyAqICAgIHRvIGNhbGwgdGhlIHVzYl9hdXRvcG1fZ2V0L3B1dF9pbnRlcmZhY2UoKSBiYXJyaWVycyBhcyBpdCdkCisgKiAgICBkZWFkbG9jaywgc28gd2UgbmVlZCB0byBkZWNyZW1lbnQgaTI0MDBtdS0+ZG9fYXV0b3BtLCB0aGF0IGFjdHMKKyAqICAgIGFzIGEgcG9vciBtYW4ncyBzZW1hcGhvcmUuIFVnbHksIGJ1dCBpdCB3b3Jrcy4KKyAqCisgKiAgICBBcyB3ZWxsLCB0aGUgZGV2aWNlIG1pZ2h0IHJlZnVzZSBnb2luZyB0byBzbGVlcCBmb3Igd2hpY2hldmVyCisgKiAgICByZWFzb24uIEluIHRoaXMgY2FzZSB3ZSBqdXN0IGZhaWwuIEZvciBzeXN0ZW0gc3VzcGVuZC9oaWJlcm5hdGUsCisgKiAgICB3ZSAqY2FuJ3QqIGZhaWwuIFdlIGxvb2sgYXQgdXNiX2Rldi0+YXV0b19wbSB0byBzZWUgaWYgdGhlCisgKiAgICBzdXNwZW5kIGNhbGwgY29tZXMgZnJvbSB0aGUgVVNCIHN0YWNrIG9yIGZyb20gdGhlIHN5c3RlbSBhbmQgYWN0CisgKiAgICBpbiBjb25zZXF1ZW5jZS4KKyAqCisgKiAgLSBzdG9wIHRoZSBub3RpZmljYXRpb24gZW5kcG9pbnQgcG9sbGluZworICovCitzdGF0aWMKK2ludCBpMjQwMG11X3N1c3BlbmQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlLCBwbV9tZXNzYWdlX3QgcG1fbXNnKQoreworCWludCByZXN1bHQgPSAwOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpZmFjZS0+ZGV2OworCXN0cnVjdCBpMjQwMG11ICppMjQwMG11ID0gdXNiX2dldF9pbnRmZGF0YShpZmFjZSk7CisjaWZkZWYgQ09ORklHX1BNCisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYgPSBpMjQwMG11LT51c2JfZGV2OworI2VuZGlmCisJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gJmkyNDAwbXUtPmkyNDAwbTsKKworCWRfZm5zdGFydCgzLCBkZXYsICIoaWZhY2UgJXAgcG1fbXNnICV1KVxuIiwgaWZhY2UsIHBtX21zZy5ldmVudCk7CisJaWYgKGkyNDAwbS0+dXBkb3duID09IDApCisJCWdvdG8gbm9fZmlybXdhcmU7CisJZF9wcmludGYoMSwgZGV2LCAiZncgdXAsIHJlcXVlc3Rpbmcgc3RhbmRieVxuIik7CisJYXRvbWljX2RlYygmaTI0MDBtdS0+ZG9fYXV0b3BtKTsKKwlyZXN1bHQgPSBpMjQwMG1fY21kX2VudGVyX3Bvd2Vyc2F2ZShpMjQwMG0pOworCWF0b21pY19pbmMoJmkyNDAwbXUtPmRvX2F1dG9wbSk7CisjaWZkZWYgQ09ORklHX1BNCisJaWYgKHJlc3VsdCA8IDAgJiYgdXNiX2Rldi0+YXV0b19wbSA9PSAwKSB7CisJCS8qIFN5c3RlbSBzdXNwZW5kLCBjYW4ndCBmYWlsICovCisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHN1c3BlbmQsIHdpbGwgcmVzZXQgb24gcmVzdW1lXG4iKTsKKwkJcmVzdWx0ID0gMDsKKwl9CisjZW5kaWYKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBlcnJvcl9lbnRlcl9wb3dlcnNhdmU7CisJaTI0MDBtdV9ub3RpZmljYXRpb25fcmVsZWFzZShpMjQwMG11KTsKKwlkX3ByaW50ZigxLCBkZXYsICJmdyB1cCwgZ290IHN0YW5kYnlcbiIpOworZXJyb3JfZW50ZXJfcG93ZXJzYXZlOgorbm9fZmlybXdhcmU6CisJZF9mbmVuZCgzLCBkZXYsICIoaWZhY2UgJXAgcG1fbXNnICV1KSA9ICVkXG4iLAorCQlpZmFjZSwgcG1fbXNnLmV2ZW50LCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljCitpbnQgaTI0MDBtdV9yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpZmFjZS0+ZGV2OworCXN0cnVjdCBpMjQwMG11ICppMjQwMG11ID0gdXNiX2dldF9pbnRmZGF0YShpZmFjZSk7CisJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gJmkyNDAwbXUtPmkyNDAwbTsKKworCWRfZm5zdGFydCgzLCBkZXYsICIoaWZhY2UgJXApXG4iLCBpZmFjZSk7CisJaWYgKGkyNDAwbS0+dXBkb3duID09IDApIHsKKwkJZF9wcmludGYoMSwgZGV2LCAiZncgd2FzIGRvd24sIG5vIHJlc3VtZSBuZWVlZFxuIik7CisJCWdvdG8gb3V0OworCX0KKwlkX3ByaW50ZigxLCBkZXYsICJmdyB3YXMgdXAsIHJlc3VtaW5nXG4iKTsKKwlpMjQwMG11X25vdGlmaWNhdGlvbl9zZXR1cChpMjQwMG11KTsKKwkvKiBVU0IgaGFzIGZsb3cgY29udHJvbCwgc28gd2UgZG9uJ3QgbmVlZCB0byBnaXZlIGl0IHRpbWUgdG8KKwkgKiBjb21lIGJhY2s7IG90aGVyd2lzZSwgd2UnZCB1c2Ugc29tZXRoaW5nIGxpa2UgYSBnZXQtc3RhdGUKKwkgKiBjb21tYW5kLi4uICovCitvdXQ6CisJZF9mbmVuZCgzLCBkZXYsICIoaWZhY2UgJXApID0gJWRcbiIsIGlmYWNlLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljCitzdHJ1Y3QgdXNiX2RldmljZV9pZCBpMjQwMG11X2lkX3RhYmxlW10gPSB7CisJeyBVU0JfREVWSUNFKDB4ODA4NiwgMHgwMTgxKSB9LAorCXsgVVNCX0RFVklDRSgweDgwODYsIDB4MTQwMykgfSwKKwl7IFVTQl9ERVZJQ0UoMHg4MDg2LCAweDE0MDUpIH0sCisJeyBVU0JfREVWSUNFKDB4ODA4NiwgMHgwMTgwKSB9LAorCXsgVVNCX0RFVklDRSgweDgwODYsIDB4MDE4MikgfSwKKwl7IFVTQl9ERVZJQ0UoMHg4MDg2LCAweDE0MDYpIH0sCisJeyBVU0JfREVWSUNFKDB4ODA4NiwgMHgxNDAzKSB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgaTI0MDBtdV9pZF90YWJsZSk7CisKKworc3RhdGljCitzdHJ1Y3QgdXNiX2RyaXZlciBpMjQwMG11X2RyaXZlciA9IHsKKwkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAorCS5zdXNwZW5kID0gaTI0MDBtdV9zdXNwZW5kLAorCS5yZXN1bWUgPSBpMjQwMG11X3Jlc3VtZSwKKwkucHJvYmUgPSBpMjQwMG11X3Byb2JlLAorCS5kaXNjb25uZWN0ID0gaTI0MDBtdV9kaXNjb25uZWN0LAorCS5pZF90YWJsZSA9IGkyNDAwbXVfaWRfdGFibGUsCisJLnN1cHBvcnRzX2F1dG9zdXNwZW5kID0gMSwKK307CisKK3N0YXRpYworaW50IF9faW5pdCBpMjQwMG11X2RyaXZlcl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHVzYl9yZWdpc3RlcigmaTI0MDBtdV9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoaTI0MDBtdV9kcml2ZXJfaW5pdCk7CisKKworc3RhdGljCit2b2lkIF9fZXhpdCBpMjQwMG11X2RyaXZlcl9leGl0KHZvaWQpCit7CisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsJLyogZm9yIHRoZSBzdHVmZiB3ZSBzY2hlZHVsZSBmcm9tIHN5c2ZzLmMgKi8KKwl1c2JfZGVyZWdpc3RlcigmaTI0MDBtdV9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoaTI0MDBtdV9kcml2ZXJfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkludGVsIENvcnBvcmF0aW9uIDxsaW51eC13aW1heEBpbnRlbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkludGVsIDI0MDBNIFdpTUFYIG5ldHdvcmtpbmcgZm9yIFVTQiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0ZJUk1XQVJFKEkyNDAwTVVfRldfRklMRV9OQU1FKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL2RtYS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoNWsvZG1hLmMKaW5kZXggN2UyYjFhNi4uYjY1YjRmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoNWsvZG1hLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoNWsvZG1hLmMKQEAgLTU5NCw3ICs1OTQsNyBAQAogCQkgKiBYWFg6IEJNSVNTIGludGVycnVwdHMgbWF5IG9jY3VyIGFmdGVyIGFzc29jaWF0aW9uLgogCQkgKiBJIGZvdW5kIHRoaXMgb24gNTIxMCBjb2RlIGJ1dCBpdCBuZWVkcyB0ZXN0aW5nLiBJZiB0aGlzIGlzCiAJCSAqIHRydWUgd2Ugc2hvdWxkIGRpc2FibGUgdGhlbSBiZWZvcmUgYXNzb2MgYW5kIHJlLWVuYWJsZSB0aGVtCi0JCSAqIGFmdGVyIGEgc3VjY2Vzc2Z1bGwgYXNzb2MgKyBzb21lIGppZmZpZXMuCisJCSAqIGFmdGVyIGEgc3VjY2Vzc2Z1bCBhc3NvYyArIHNvbWUgamlmZmllcy4KIAkJCWludGVycnVwdF9tYXNrICY9IH5BUjVLX0lOVF9CTUlTUzsKIAkJICovCiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWwuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsLmMKaW5kZXggMzUwMTU3Zi4uNDIyMzY3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWwuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbC5jCkBAIC0zODM2LDcgKzM4MzYsNyBAQAogCSAgIFRoaXMgcm91dGluZSBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvciBpbml0aWFsaXNpbmcgc29tZQogCSAgIGhhcmR3YXJlLXNwZWNpZmljIGZpZWxkcyBpbiB0aGUgYXRtZWxfcHJpdmF0ZSBzdHJ1Y3R1cmUsCiAJICAgaW5jbHVkaW5nIGEgY29weSBvZiB0aGUgZmlybXdhcmUncyBob3N0aW5mbyBzdHVjdHVyZQotCSAgIHdoaWNoIGlzIHRoZSByb3V0ZSBpbnRvIHRoZSByZXN0IG9mIHRoZSBmaXJtYXJlIGRhdGFzdHJ1Y3R1cmVzLiAqLworCSAgIHdoaWNoIGlzIHRoZSByb3V0ZSBpbnRvIHRoZSByZXN0IG9mIHRoZSBmaXJtd2FyZSBkYXRhc3RydWN0dXJlcy4gKi8KIAogCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1OCBjb25maWd1cmF0aW9uOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9pcHcyMTAwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIxMDAuYwppbmRleCAxNjY3MDY1Li44MjNjMmJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIxMDAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIxMDAuYwpAQCAtMTMzMiw3ICsxMzMyLDcgQEAKIAkJICAgICAgIElQV19BVVhfSE9TVF9SRVNFVF9SRUdfU1RPUF9NQVNURVIpOwogCiAJLyogU3RlcCAyLiBXYWl0IGZvciBzdG9wIE1hc3RlciBBc3NlcnQKLQkgKiAgICAgICAgIChub3QgbW9yZSB0aGVuIDUwdXMsIG90aGVyd2lzZSByZXQgZXJyb3IgKi8KKwkgKiAgICAgICAgIChub3QgbW9yZSB0aGFuIDUwdXMsIG90aGVyd2lzZSByZXQgZXJyb3IgKi8KIAlpID0gNTsKIAlkbyB7CiAJCXVkZWxheShJUFdfV0FJVF9SRVNFVF9NQVNURVJfQVNTRVJUX0NPTVBMRVRFX0RFTEFZKTsKQEAgLTE4MzAsNyArMTgzMCw3IEBACiAJCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPnJmX2tpbGwpOwogCX0KIAotCS8qIEtpbGwgdGhlIGZpcm1hcmUgaGFuZyBjaGVjayB0aW1lciAqLworCS8qIEtpbGwgdGhlIGZpcm13YXJlIGhhbmcgY2hlY2sgdGltZXIgKi8KIAlpZiAoIXByaXYtPnN0b3BfaGFuZ19jaGVjaykgewogCQlwcml2LT5zdG9wX2hhbmdfY2hlY2sgPSAxOwogCQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5oYW5nX2NoZWNrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBjcnlwdG8uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBjcnlwdG8uYwppbmRleCAzN2FkMGQyLi5hZWU5Y2JhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwY3J5cHRvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMGNyeXB0by5jCkBAIC0xODQsOCArMTg0LDggQEAKIAkgKiBNYWtlIHJvb20gZm9yIG5ldyBkYXRhLCBub3RlIHRoYXQgd2UgaW5jcmVhc2UgYm90aAogCSAqIGhlYWRzaXplIGFuZCB0YWlsc2l6ZSB3aGVuIHJlcXVpcmVkLiBUaGUgdGFpbHNpemUgaXMKIAkgKiBvbmx5IG5lZWRlZCB3aGVuIElDViBkYXRhIG5lZWRzIHRvIGJlIGluc2VydGVkIGFuZAotCSAqIHRoZSBwYWRkaW5nIGlzIHNtYWxsZXIgdGhlbiB0aGUgSUNWIGRhdGEuCi0JICogV2hlbiBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzIGlzIGdyZWF0ZXIgdGhlbiB0aGUKKwkgKiB0aGUgcGFkZGluZyBpcyBzbWFsbGVyIHRoYW4gdGhlIElDViBkYXRhLgorCSAqIFdoZW4gYWxpZ25tZW50IHJlcXVpcmVtZW50cyBpcyBncmVhdGVyIHRoYW4gdGhlCiAJICogSUNWIGRhdGEgd2UgbXVzdCB0cmltIHRoZSBza2IgdG8gdGhlIGNvcnJlY3Qgc2l6ZQogCSAqIGJlY2F1c2Ugd2UgbmVlZCB0byByZW1vdmUgdGhlIGV4dHJhIGJ5dGVzLgogCSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvc3RyaXAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3N0cmlwLmMKaW5kZXggZGQwZGUzYS4uNzAxNWYyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvc3RyaXAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9zdHJpcC5jCkBAIC0yMzYsNyArMjM2LDcgQEAKIAl1bnNpZ25lZCBsb25nIHR4X2Vycm9yczsJLyogUGxhbm5lZCBzdHVmZiAgICAgICAgICAgICAgICAqLwogCXVuc2lnbmVkIGxvbmcgcnhfZHJvcHBlZDsJLyogTm8gbWVtb3J5IGZvciBza2IgICAgICAgICAgICAqLwogCXVuc2lnbmVkIGxvbmcgdHhfZHJvcHBlZDsJLyogV2hlbiBNVFUgY2hhbmdlICAgICAgICAgICAgICAqLwotCXVuc2lnbmVkIGxvbmcgcnhfb3Zlcl9lcnJvcnM7CS8qIEZyYW1lIGJpZ2dlciB0aGVuIFNUUklQIGJ1Zi4gKi8KKwl1bnNpZ25lZCBsb25nIHJ4X292ZXJfZXJyb3JzOwkvKiBGcmFtZSBiaWdnZXIgdGhhbiBTVFJJUCBidWYuICovCiAKIAl1bnNpZ25lZCBsb25nIHBwc190aW1lcjsJLyogVGltZXIgdG8gZGV0ZXJtaW5lIHBwcyAgICAgICAqLwogCXVuc2lnbmVkIGxvbmcgcnhfcHBzX2NvdW50OwkvKiBDb3VudGVyIHRvIGRldGVybWluZSBwcHMgICAgICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9tYWMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX21hYy5jCmluZGV4IDljYWE5NmEuLmE2MTFhZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX21hYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX21hYy5jCkBAIC0yODcsNyArMjg3LDcgQEAKICAqIEBza2IgLSBhIHNrLWJ1ZmZlcgogICogQGZsYWdzOiBleHRyYSBmbGFncyB0byBzZXQgaW4gdGhlIFRYIHN0YXR1cyBpbmZvCiAgKiBAYWNrc3NpOiBBQ0sgc2lnbmFsIHN0cmVuZ3RoCi0gKiBAc3VjY2VzcyAtIFRydWUgZm9yIHN1Y2Nlc3NmdWxsIHRyYW5zbWlzc2lvbiBvZiB0aGUgZnJhbWUKKyAqIEBzdWNjZXNzIC0gVHJ1ZSBmb3Igc3VjY2Vzc2Z1bCB0cmFuc21pc3Npb24gb2YgdGhlIGZyYW1lCiAgKgogICogVGhpcyBpbmZvcm1hdGlvbiBjYWxscyBpZWVlODAyMTFfdHhfc3RhdHVzX2lycXNhZmUoKSBpZiByZXF1aXJlZCBieSB0aGUKICAqIGNvbnRyb2wgaW5mb3JtYXRpb24uIEl0IGNvcGllcyB0aGUgY29udHJvbCBpbmZvcm1hdGlvbiBpbnRvIHRoZSBzdGF0dXMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3hlbi1uZXRmcm9udC5jIGIvZHJpdmVycy9uZXQveGVuLW5ldGZyb250LmMKaW5kZXggNzYxNjM1Yi4uY2Q2MTg0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQveGVuLW5ldGZyb250LmMKKysrIGIvZHJpdmVycy9uZXQveGVuLW5ldGZyb250LmMKQEAgLTExMDUsNiArMTEwNSwxNiBAQAogCWdudHRhYl9mcmVlX2dyYW50X3JlZmVyZW5jZXMobnAtPmdyZWZfcnhfaGVhZCk7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgeGVubmV0X25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuICAgICAgICAgICAgPSB4ZW5uZXRfb3BlbiwKKwkubmRvX3VuaW5pdCAgICAgICAgICA9IHhlbm5ldF91bmluaXQsCisJLm5kb19zdG9wICAgICAgICAgICAgPSB4ZW5uZXRfY2xvc2UsCisJLm5kb19zdGFydF94bWl0ICAgICAgPSB4ZW5uZXRfc3RhcnRfeG1pdCwKKwkubmRvX2NoYW5nZV9tdHUJICAgICA9IHhlbm5ldF9jaGFuZ2VfbXR1LAorCS5uZG9fc2V0X21hY19hZGRyZXNzID0gZXRoX21hY19hZGRyLAorCS5uZG9fdmFsaWRhdGVfYWRkciAgID0gZXRoX3ZhbGlkYXRlX2FkZHIsCit9OworCiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKiBfX2RldmluaXQgeGVubmV0X2NyZWF0ZV9kZXYoc3RydWN0IHhlbmJ1c19kZXZpY2UgKmRldikKIHsKIAlpbnQgaSwgZXJyOwpAQCAtMTE2MSwxMiArMTE3MSw5IEBACiAJCWdvdG8gZXhpdF9mcmVlX3R4OwogCX0KIAotCW5ldGRldi0+b3BlbiAgICAgICAgICAgID0geGVubmV0X29wZW47Ci0JbmV0ZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSB4ZW5uZXRfc3RhcnRfeG1pdDsKLQluZXRkZXYtPnN0b3AgICAgICAgICAgICA9IHhlbm5ldF9jbG9zZTsKKwluZXRkZXYtPm5ldGRldl9vcHMJPSAmeGVubmV0X25ldGRldl9vcHM7CisKIAluZXRpZl9uYXBpX2FkZChuZXRkZXYsICZucC0+bmFwaSwgeGVubmV0X3BvbGwsIDY0KTsKLQluZXRkZXYtPnVuaW5pdCAgICAgICAgICA9IHhlbm5ldF91bmluaXQ7Ci0JbmV0ZGV2LT5jaGFuZ2VfbXR1CT0geGVubmV0X2NoYW5nZV9tdHU7CiAJbmV0ZGV2LT5mZWF0dXJlcyAgICAgICAgPSBORVRJRl9GX0lQX0NTVU07CiAKIAlTRVRfRVRIVE9PTF9PUFMobmV0ZGV2LCAmeGVubmV0X2V0aHRvb2xfb3BzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb3Byb2ZpbGUvb3Byb2ZpbGVmcy5jIGIvZHJpdmVycy9vcHJvZmlsZS9vcHJvZmlsZWZzLmMKaW5kZXggZGRjNGM1OS4uYjdlNGNlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9vcHJvZmlsZS9vcHJvZmlsZWZzLmMKKysrIGIvZHJpdmVycy9vcHJvZmlsZS9vcHJvZmlsZWZzLmMKQEAgLTI5LDkgKzI5LDYgQEAKIAogCWlmIChpbm9kZSkgewogCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKLQkJaW5vZGUtPmlfdWlkID0gMDsKLQkJaW5vZGUtPmlfZ2lkID0gMDsKLQkJaW5vZGUtPmlfYmxvY2tzID0gMDsKIAkJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCX0KIAlyZXR1cm4gaW5vZGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcmlzYy9kaW5vLmMgYi9kcml2ZXJzL3BhcmlzYy9kaW5vLmMKaW5kZXggYzVhNDRmZi4uZDUzOWQ5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wYXJpc2MvZGluby5jCisrKyBiL2RyaXZlcnMvcGFyaXNjL2Rpbm8uYwpAQCAtNTQ3LDcgKzU0Nyw3IEBACiAJKiogVGhlIGFkZGl0aW9uYWwgIi0xIiBhZGp1c3RzIGZvciBza2V3aW5nIHRoZSBJUlE8LT5zbG90LgogCSovCiAJZGlub19jZmdfcmVhZChkZXYtPmJ1cywgZGV2LT5kZXZmbiwgUENJX0lOVEVSUlVQVF9QSU4sIDEsICZpcnFfcGluKTsgCi0JZGV2LT5pcnEgPSAoaXJxX3BpbiArIFBDSV9TTE9UKGRldi0+ZGV2Zm4pIC0gMSkgJSA0IDsKKwlkZXYtPmlycSA9IHBjaV9zd2l6emxlX2ludGVycnVwdF9waW4oZGV2LCBpcnFfcGluKSAtIDE7CiAKIAkvKiBTaG91bGRuJ3QgcmVhbGx5IG5lZWQgdG8gZG8gdGhpcyBidXQgaXQncyBpbiBjYXNlIHNvbWVvbmUgdHJpZXMKIAkqKiB0byBieXBhc3MgUENJIHNlcnZpY2VzIGFuZCBsb29rIGF0IHRoZSBjYXJkIHRoZW1zZWx2ZXMuCkBAIC02NzIsNyArNjcyLDcgQEAKIAkJCQogCQkJZGlub19jZmdfcmVhZChkZXYtPmJ1cywgZGV2LT5kZXZmbiwgCiAJCQkJICAgICAgUENJX0lOVEVSUlVQVF9QSU4sIDEsICZpcnFfcGluKTsKLQkJCWlycV9waW4gPSAoaXJxX3BpbiArIFBDSV9TTE9UKGRldi0+ZGV2Zm4pIC0gMSkgJSA0IDsKKwkJCWlycV9waW4gPSBwY2lfc3dpenpsZV9pbnRlcnJ1cHRfcGluKGRldiwgaXJxX3BpbikgLSAxOwogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRGV2aWNlICVzIGhhcyB1bmRlZmluZWQgSVJRLCAiCiAJCQkJCSJzZXR0aW5nIHRvICVkXG4iLCBwY2lfbmFtZShkZXYpLCBpcnFfcGluKTsKIAkJCWRpbm9fY2ZnX3dyaXRlKGRldi0+YnVzLCBkZXYtPmRldmZuLCAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFyaXNjL2lvc2FwaWMuYyBiL2RyaXZlcnMvcGFyaXNjL2lvc2FwaWMuYwppbmRleCA5ZGVkYmJkLi4wNzk3NjU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BhcmlzYy9pb3NhcGljLmMKKysrIGIvZHJpdmVycy9wYXJpc2MvaW9zYXBpYy5jCkBAIC01MTksOCArNTE5LDcgQEAKIAkJKioKIAkJKiogQWR2YW50YWdlIGlzIGl0J3MgcmVhbGx5IGVhc3kgdG8gaW1wbGVtZW50LgogCQkqLwotCQlpbnRyX3BpbiA9ICgoaW50cl9waW4tMSkrUENJX1NMT1QocGNpZGV2LT5kZXZmbikpICUgNDsKLQkJaW50cl9waW4rKzsJLyogY29udmVydCBiYWNrIHRvIElOVEEtRCAoMS00KSAqLworCQlpbnRyX3BpbiA9IHBjaV9zd2l6emxlX2ludGVycnVwdF9waW4ocGNpZGV2LCBpbnRyX3Bpbik7CiAjZW5kaWYgLyogUENJX0JSSURHRV9GVU5DUyAqLwogCiAJCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcnBvcnQvaWVlZTEyODQuYyBiL2RyaXZlcnMvcGFycG9ydC9pZWVlMTI4NC5jCmluZGV4IGFjMmE4MDUuLjg5MDFlY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFycG9ydC9pZWVlMTI4NC5jCisrKyBiL2RyaXZlcnMvcGFycG9ydC9pZWVlMTI4NC5jCkBAIC04NCw3ICs4NCw3IEBACiAKIAlhZGRfdGltZXIgKCZ0aW1lcik7CiAJcmV0ID0gZG93bl9pbnRlcnJ1cHRpYmxlICgmcG9ydC0+cGh5c3BvcnQtPmllZWUxMjg0LmlycSk7Ci0JaWYgKCFkZWxfdGltZXIgKCZ0aW1lcikgJiYgIXJldCkKKwlpZiAoIWRlbF90aW1lcl9zeW5jKCZ0aW1lcikgJiYgIXJldCkKIAkJLyogVGltZWQgb3V0LiAqLwogCQlyZXQgPSAxOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9LY29uZmlnIGIvZHJpdmVycy9wY2kvS2NvbmZpZwppbmRleCBlMWNhNDI1Li4yYTQ1MDFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGNpL0tjb25maWcKQEAgLTQyLDYgKzQyLDE1IEBACiAKIAkgIFdoZW4gaW4gZG91YnQsIHNheSBOLgogCitjb25maWcgUENJX1NUVUIKKwl0cmlzdGF0ZSAiUENJIFN0dWIgZHJpdmVyIgorCWRlcGVuZHMgb24gUENJCisJaGVscAorCSAgU2F5IFkgb3IgTSBoZXJlIGlmIHlvdSB3YW50IGJlIGFibGUgdG8gcmVzZXJ2ZSBhIFBDSSBkZXZpY2UKKwkgIHdoZW4gaXQgaXMgZ29pbmcgdG8gYmUgYXNzaWduZWQgdG8gYSBndWVzdCBvcGVyYXRpbmcgc3lzdGVtLgorCisJICBXaGVuIGluIGRvdWJ0LCBzYXkgTi4KKwogY29uZmlnIEhUX0lSUQogCWJvb2wgIkludGVycnVwdHMgb24gaHlwZXJ0cmFuc3BvcnQgZGV2aWNlcyIKIAlkZWZhdWx0IHkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL01ha2VmaWxlIGIvZHJpdmVycy9wY2kvTWFrZWZpbGUKaW5kZXggYWYzYmZlMi4uM2QwN2NlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9wY2kvTWFrZWZpbGUKQEAgLTUzLDYgKzUzLDggQEAKIAogb2JqLSQoQ09ORklHX1BDSV9TWVNDQUxMKSArPSBzeXNjYWxsLm8KIAorb2JqLSQoQ09ORklHX1BDSV9TVFVCKSArPSBwY2ktc3R1Yi5vCisKIGlmZXEgKCQoQ09ORklHX1BDSV9ERUJVRykseSkKIEVYVFJBX0NGTEFHUyArPSAtRERFQlVHCiBlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvYWNjZXNzLmMgYi9kcml2ZXJzL3BjaS9hY2Nlc3MuYwppbmRleCAzOWJiOTZiLi4zODE0NDQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9hY2Nlc3MuYworKysgYi9kcml2ZXJzL3BjaS9hY2Nlc3MuYwpAQCAtNjYsNiArNjYsMzkgQEAKIEVYUE9SVF9TWU1CT0wocGNpX2J1c193cml0ZV9jb25maWdfd29yZCk7CiBFWFBPUlRfU1lNQk9MKHBjaV9idXNfd3JpdGVfY29uZmlnX2R3b3JkKTsKIAorCisvKioKKyAqIHBjaV9yZWFkX3ZwZCAtIFJlYWQgb25lIGVudHJ5IGZyb20gVml0YWwgUHJvZHVjdCBEYXRhCisgKiBAZGV2OglwY2kgZGV2aWNlIHN0cnVjdAorICogQHBvczoJb2Zmc2V0IGluIHZwZCBzcGFjZQorICogQGNvdW50OgludW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorICogQGJ1ZjoJcG9pbnRlciB0byB3aGVyZSB0byBzdG9yZSByZXN1bHQKKyAqCisgKi8KK3NzaXplX3QgcGNpX3JlYWRfdnBkKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGxvZmZfdCBwb3MsIHNpemVfdCBjb3VudCwgdm9pZCAqYnVmKQoreworCWlmICghZGV2LT52cGQgfHwgIWRldi0+dnBkLT5vcHMpCisJCXJldHVybiAtRU5PREVWOworCXJldHVybiBkZXYtPnZwZC0+b3BzLT5yZWFkKGRldiwgcG9zLCBjb3VudCwgYnVmKTsKK30KK0VYUE9SVF9TWU1CT0wocGNpX3JlYWRfdnBkKTsKKworLyoqCisgKiBwY2lfd3JpdGVfdnBkIC0gV3JpdGUgZW50cnkgdG8gVml0YWwgUHJvZHVjdCBEYXRhCisgKiBAZGV2OglwY2kgZGV2aWNlIHN0cnVjdAorICogQHBvczoJb2Zmc2V0IGluIHZwZCBzcGFjZQorICogQGNvdW50OgludW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorICogQHZhbDoJdmFsdWUgdG8gd3JpdGUKKyAqCisgKi8KK3NzaXplX3QgcGNpX3dyaXRlX3ZwZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBsb2ZmX3QgcG9zLCBzaXplX3QgY291bnQsIGNvbnN0IHZvaWQgKmJ1ZikKK3sKKwlpZiAoIWRldi0+dnBkIHx8ICFkZXYtPnZwZC0+b3BzKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gZGV2LT52cGQtPm9wcy0+d3JpdGUoZGV2LCBwb3MsIGNvdW50LCBidWYpOworfQorRVhQT1JUX1NZTUJPTChwY2lfd3JpdGVfdnBkKTsKKwogLyoKICAqIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgYXJlIHRvIHByZXZlbnQgdGhlIHVzZXIgZnJvbSBhY2Nlc3NpbmcgUENJIGNvbmZpZwogICogc3BhY2Ugd2hlbiBpdCdzIHVuc2FmZSB0byBkbyBzby4gIFNvbWUgZGV2aWNlcyByZXF1aXJlIHRoaXMgZHVyaW5nIEJJU1QgYW5kCkBAIC0xMzMsMTI1ICsxNjYsMTQ1IEBACiAKIHN0cnVjdCBwY2lfdnBkX3BjaTIyIHsKIAlzdHJ1Y3QgcGNpX3ZwZCBiYXNlOwotCXNwaW5sb2NrX3QgbG9jazsgLyogY29udHJvbHMgYWNjZXNzIHRvIGhhcmR3YXJlIGFuZCB0aGUgZmxhZ3MgKi8KLQl1OAljYXA7CisJc3RydWN0IG11dGV4IGxvY2s7CisJdTE2CWZsYWc7CiAJYm9vbAlidXN5OwotCWJvb2wJZmxhZzsgLyogdmFsdWUgb2YgRiBiaXQgdG8gd2FpdCBmb3IgKi8KKwl1OAljYXA7CiB9OwogCi0vKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBjb21wbGV0ZSAqLworLyoKKyAqIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGNvbXBsZXRlLgorICogVGhpcyBjb2RlIGhhcyB0byBzcGluIHNpbmNlIHRoZXJlIGlzIG5vIG90aGVyIG5vdGlmaWNhdGlvbiBmcm9tIHRoZSBQQ0kKKyAqIGhhcmR3YXJlLiBTaW5jZSB0aGUgVlBEIGlzIG9mdGVuIGltcGxlbWVudGVkIGJ5IHNlcmlhbCBhdHRhY2htZW50IHRvIGFuCisgKiBFRVBST00sIGl0IG1heSB0YWtlIG1hbnkgbWlsbGlzZWNvbmRzIHRvIGNvbXBsZXRlLgorICovCiBzdGF0aWMgaW50IHBjaV92cGRfcGNpMjJfd2FpdChzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXN0cnVjdCBwY2lfdnBkX3BjaTIyICp2cGQgPQogCQljb250YWluZXJfb2YoZGV2LT52cGQsIHN0cnVjdCBwY2lfdnBkX3BjaTIyLCBiYXNlKTsKLQl1MTYgZmxhZywgc3RhdHVzOwotCWludCB3YWl0OworCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IGppZmZpZXMgKyBIWi8yMCArIDI7CisJdTE2IHN0YXR1czsKIAlpbnQgcmV0OwogCiAJaWYgKCF2cGQtPmJ1c3kpCiAJCXJldHVybiAwOwogCi0JZmxhZyA9IHZwZC0+ZmxhZyA/IFBDSV9WUERfQUREUl9GIDogMDsKLQl3YWl0ID0gdnBkLT5mbGFnID8gMTAgOiAxMDAwOyAvKiByZWFkOiAxMDAgdXM7IHdyaXRlOiAxMCBtcyAqLwogCWZvciAoOzspIHsKLQkJcmV0ID0gcGNpX3VzZXJfcmVhZF9jb25maWdfd29yZChkZXYsCi0JCQkJCQl2cGQtPmNhcCArIFBDSV9WUERfQUREUiwKKwkJcmV0ID0gcGNpX3VzZXJfcmVhZF9jb25maWdfd29yZChkZXYsIHZwZC0+Y2FwICsgUENJX1ZQRF9BRERSLAogCQkJCQkJJnN0YXR1cyk7Ci0JCWlmIChyZXQgPCAwKQorCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKLQkJaWYgKChzdGF0dXMgJiBQQ0lfVlBEX0FERFJfRikgPT0gZmxhZykgeworCisJCWlmICgoc3RhdHVzICYgUENJX1ZQRF9BRERSX0YpID09IHZwZC0+ZmxhZykgewogCQkJdnBkLT5idXN5ID0gZmFsc2U7CiAJCQlyZXR1cm4gMDsKIAkJfQotCQlpZiAod2FpdC0tID09IDApCisKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpCiAJCQlyZXR1cm4gLUVUSU1FRE9VVDsKLQkJdWRlbGF5KDEwKTsKKwkJaWYgKGZhdGFsX3NpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJcmV0dXJuIC1FSU5UUjsKKwkJaWYgKCFjb25kX3Jlc2NoZWQoKSkKKwkJCXVkZWxheSgxMCk7CiAJfQogfQogCi1zdGF0aWMgaW50IHBjaV92cGRfcGNpMjJfcmVhZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcG9zLCBpbnQgc2l6ZSwKLQkJCSAgICAgIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHBjaV92cGRfcGNpMjJfcmVhZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBsb2ZmX3QgcG9zLCBzaXplX3QgY291bnQsCisJCQkJICB2b2lkICphcmcpCiB7CiAJc3RydWN0IHBjaV92cGRfcGNpMjIgKnZwZCA9CiAJCWNvbnRhaW5lcl9vZihkZXYtPnZwZCwgc3RydWN0IHBjaV92cGRfcGNpMjIsIGJhc2UpOwotCXUzMiB2YWw7CiAJaW50IHJldDsKLQlpbnQgYmVnaW4sIGVuZCwgaTsKKwlsb2ZmX3QgZW5kID0gcG9zICsgY291bnQ7CisJdTggKmJ1ZiA9IGFyZzsKIAotCWlmIChwb3MgPCAwIHx8IHBvcyA+IHZwZC0+YmFzZS5sZW4gfHwgc2l6ZSA+IHZwZC0+YmFzZS5sZW4gIC0gcG9zKQorCWlmIChwb3MgPCAwIHx8IHBvcyA+IHZwZC0+YmFzZS5sZW4gfHwgZW5kID4gdnBkLT5iYXNlLmxlbikKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKHNpemUgPT0gMCkKLQkJcmV0dXJuIDA7CiAKLQlzcGluX2xvY2tfaXJxKCZ2cGQtPmxvY2spOworCWlmIChtdXRleF9sb2NrX2tpbGxhYmxlKCZ2cGQtPmxvY2spKQorCQlyZXR1cm4gLUVJTlRSOworCiAJcmV0ID0gcGNpX3ZwZF9wY2kyMl93YWl0KGRldik7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwotCXJldCA9IHBjaV91c2VyX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgdnBkLT5jYXAgKyBQQ0lfVlBEX0FERFIsCi0JCQkJCSBwb3MgJiB+Myk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0OwotCXZwZC0+YnVzeSA9IHRydWU7Ci0JdnBkLT5mbGFnID0gMTsKLQlyZXQgPSBwY2lfdnBkX3BjaTIyX3dhaXQoZGV2KTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXQ7Ci0JcmV0ID0gcGNpX3VzZXJfcmVhZF9jb25maWdfZHdvcmQoZGV2LCB2cGQtPmNhcCArIFBDSV9WUERfREFUQSwKLQkJCQkJICZ2YWwpOwotb3V0OgotCXNwaW5fdW5sb2NrX2lycSgmdnBkLT5sb2NrKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKIAotCS8qIENvbnZlcnQgdG8gYnl0ZXMgKi8KLQliZWdpbiA9IHBvcyAmIDM7Ci0JZW5kID0gbWluKDQsIGJlZ2luICsgc2l6ZSk7Ci0JZm9yIChpID0gMDsgaSA8IGVuZDsgKytpKSB7Ci0JCWlmIChpID49IGJlZ2luKQotCQkJKmJ1ZisrID0gdmFsOwotCQl2YWwgPj49IDg7CisJd2hpbGUgKHBvcyA8IGVuZCkgeworCQl1MzIgdmFsOworCQl1bnNpZ25lZCBpbnQgaSwgc2tpcDsKKworCQlyZXQgPSBwY2lfdXNlcl93cml0ZV9jb25maWdfd29yZChkZXYsIHZwZC0+Y2FwICsgUENJX1ZQRF9BRERSLAorCQkJCQkJIHBvcyAmIH4zKTsKKwkJaWYgKHJldCA8IDApCisJCQlicmVhazsKKwkJdnBkLT5idXN5ID0gdHJ1ZTsKKwkJdnBkLT5mbGFnID0gUENJX1ZQRF9BRERSX0Y7CisJCXJldCA9IHBjaV92cGRfcGNpMjJfd2FpdChkZXYpOworCQlpZiAocmV0IDwgMCkKKwkJCWJyZWFrOworCisJCXJldCA9IHBjaV91c2VyX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgdnBkLT5jYXAgKyBQQ0lfVlBEX0RBVEEsICZ2YWwpOworCQlpZiAocmV0IDwgMCkKKwkJCWJyZWFrOworCisJCXNraXAgPSBwb3MgJiAzOworCQlmb3IgKGkgPSAwOyAgaSA8IHNpemVvZih1MzIpOyBpKyspIHsKKwkJCWlmIChpID49IHNraXApIHsKKwkJCQkqYnVmKysgPSB2YWw7CisJCQkJaWYgKCsrcG9zID09IGVuZCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQl2YWwgPj49IDg7CisJCX0KIAl9Ci0JcmV0dXJuIGVuZCAtIGJlZ2luOworb3V0OgorCW11dGV4X3VubG9jaygmdnBkLT5sb2NrKTsKKwlyZXR1cm4gcmV0ID8gcmV0IDogY291bnQ7CiB9CiAKLXN0YXRpYyBpbnQgcGNpX3ZwZF9wY2kyMl93cml0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcG9zLCBpbnQgc2l6ZSwKLQkJCSAgICAgICBjb25zdCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBwY2lfdnBkX3BjaTIyX3dyaXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGxvZmZfdCBwb3MsIHNpemVfdCBjb3VudCwKKwkJCQkgICBjb25zdCB2b2lkICphcmcpCiB7CiAJc3RydWN0IHBjaV92cGRfcGNpMjIgKnZwZCA9CiAJCWNvbnRhaW5lcl9vZihkZXYtPnZwZCwgc3RydWN0IHBjaV92cGRfcGNpMjIsIGJhc2UpOwotCXUzMiB2YWw7Ci0JaW50IHJldDsKKwljb25zdCB1OCAqYnVmID0gYXJnOworCWxvZmZfdCBlbmQgPSBwb3MgKyBjb3VudDsKKwlpbnQgcmV0ID0gMDsKIAotCWlmIChwb3MgPCAwIHx8IHBvcyA+IHZwZC0+YmFzZS5sZW4gfHwgcG9zICYgMyB8fAotCSAgICBzaXplID4gdnBkLT5iYXNlLmxlbiAtIHBvcyB8fCBzaXplIDwgNCkKKwlpZiAocG9zIDwgMCB8fCAocG9zICYgMykgfHwgKGNvdW50ICYgMykgfHwgZW5kID4gdnBkLT5iYXNlLmxlbikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQl2YWwgPSAodTgpICpidWYrKzsKLQl2YWwgfD0gKCh1OCkgKmJ1ZisrKSA8PCA4OwotCXZhbCB8PSAoKHU4KSAqYnVmKyspIDw8IDE2OwotCXZhbCB8PSAoKHUzMikodTgpICpidWYrKykgPDwgMjQ7CisJaWYgKG11dGV4X2xvY2tfa2lsbGFibGUoJnZwZC0+bG9jaykpCisJCXJldHVybiAtRUlOVFI7CiAKLQlzcGluX2xvY2tfaXJxKCZ2cGQtPmxvY2spOwogCXJldCA9IHBjaV92cGRfcGNpMjJfd2FpdChkZXYpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKLQlyZXQgPSBwY2lfdXNlcl93cml0ZV9jb25maWdfZHdvcmQoZGV2LCB2cGQtPmNhcCArIFBDSV9WUERfREFUQSwKLQkJCQkJICB2YWwpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dDsKLQlyZXQgPSBwY2lfdXNlcl93cml0ZV9jb25maWdfd29yZChkZXYsIHZwZC0+Y2FwICsgUENJX1ZQRF9BRERSLAotCQkJCQkgcG9zIHwgUENJX1ZQRF9BRERSX0YpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dDsKLQl2cGQtPmJ1c3kgPSB0cnVlOwotCXZwZC0+ZmxhZyA9IDA7Ci0JcmV0ID0gcGNpX3ZwZF9wY2kyMl93YWl0KGRldik7CisKKwl3aGlsZSAocG9zIDwgZW5kKSB7CisJCXUzMiB2YWw7CisKKwkJdmFsID0gKmJ1ZisrOworCQl2YWwgfD0gKmJ1ZisrIDw8IDg7CisJCXZhbCB8PSAqYnVmKysgPDwgMTY7CisJCXZhbCB8PSAqYnVmKysgPDwgMjQ7CisKKwkJcmV0ID0gcGNpX3VzZXJfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgdnBkLT5jYXAgKyBQQ0lfVlBEX0RBVEEsIHZhbCk7CisJCWlmIChyZXQgPCAwKQorCQkJYnJlYWs7CisJCXJldCA9IHBjaV91c2VyX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgdnBkLT5jYXAgKyBQQ0lfVlBEX0FERFIsCisJCQkJCQkgcG9zIHwgUENJX1ZQRF9BRERSX0YpOworCQlpZiAocmV0IDwgMCkKKwkJCWJyZWFrOworCisJCXZwZC0+YnVzeSA9IHRydWU7CisJCXZwZC0+ZmxhZyA9IDA7CisJCXJldCA9IHBjaV92cGRfcGNpMjJfd2FpdChkZXYpOworCisJCXBvcyArPSBzaXplb2YodTMyKTsKKwl9CiBvdXQ6Ci0Jc3Bpbl91bmxvY2tfaXJxKCZ2cGQtPmxvY2spOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIDQ7CisJbXV0ZXhfdW5sb2NrKCZ2cGQtPmxvY2spOworCXJldHVybiByZXQgPyByZXQgOiBjb3VudDsKIH0KIAogc3RhdGljIHZvaWQgcGNpX3ZwZF9wY2kyMl9yZWxlYXNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCkBAIC0yNTksNyArMzEyLDcgQEAKIAlrZnJlZShjb250YWluZXJfb2YoZGV2LT52cGQsIHN0cnVjdCBwY2lfdnBkX3BjaTIyLCBiYXNlKSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGNpX3ZwZF9vcHMgcGNpX3ZwZF9wY2kyMl9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV92cGRfb3BzIHBjaV92cGRfcGNpMjJfb3BzID0gewogCS5yZWFkID0gcGNpX3ZwZF9wY2kyMl9yZWFkLAogCS53cml0ZSA9IHBjaV92cGRfcGNpMjJfd3JpdGUsCiAJLnJlbGVhc2UgPSBwY2lfdnBkX3BjaTIyX3JlbGVhc2UsCkBAIC0yNzksNyArMzMyLDcgQEAKIAogCXZwZC0+YmFzZS5sZW4gPSBQQ0lfVlBEX1BDSTIyX1NJWkU7CiAJdnBkLT5iYXNlLm9wcyA9ICZwY2lfdnBkX3BjaTIyX29wczsKLQlzcGluX2xvY2tfaW5pdCgmdnBkLT5sb2NrKTsKKwltdXRleF9pbml0KCZ2cGQtPmxvY2spOwogCXZwZC0+Y2FwID0gY2FwOwogCXZwZC0+YnVzeSA9IGZhbHNlOwogCWRldi0+dnBkID0gJnZwZC0+YmFzZTsKQEAgLTI4Nyw2ICszNDAsMjkgQEAKIH0KIAogLyoqCisgKiBwY2lfdnBkX3RydW5jYXRlIC0gU2V0IGF2YWlsYWJsZSBWaXRhbCBQcm9kdWN0IERhdGEgc2l6ZQorICogQGRldjoJcGNpIGRldmljZSBzdHJ1Y3QKKyAqIEBzaXplOglhdmFpbGFibGUgbWVtb3J5IGluIGJ5dGVzCisgKgorICogQWRqdXN0IHNpemUgb2YgYXZhaWxhYmxlIFZQRCBhcmVhLgorICovCitpbnQgcGNpX3ZwZF90cnVuY2F0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzaXplX3Qgc2l6ZSkKK3sKKwlpZiAoIWRldi0+dnBkKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGxpbWl0ZWQgYnkgdGhlIGFjY2VzcyBtZXRob2QgKi8KKwlpZiAoc2l6ZSA+IGRldi0+dnBkLT5sZW4pCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2LT52cGQtPmxlbiA9IHNpemU7CisJZGV2LT52cGQtPmF0dHItPnNpemUgPSBzaXplOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHBjaV92cGRfdHJ1bmNhdGUpOworCisvKioKICAqIHBjaV9ibG9ja191c2VyX2NmZ19hY2Nlc3MgLSBCbG9jayB1c2Vyc3BhY2UgUENJIGNvbmZpZyByZWFkcy93cml0ZXMKICAqIEBkZXY6CXBjaSBkZXZpY2Ugc3RydWN0CiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvYnVzLmMgYi9kcml2ZXJzL3BjaS9idXMuYwppbmRleCA5OTljYzQwLi41MmI1NGYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9idXMuYworKysgYi9kcml2ZXJzL3BjaS9idXMuYwpAQCAtNzEsNyArNzEsNyBAQAogfQogCiAvKioKLSAqIGFkZCBhIHNpbmdsZSBkZXZpY2UKKyAqIHBjaV9idXNfYWRkX2RldmljZSAtIGFkZCBhIHNpbmdsZSBkZXZpY2UKICAqIEBkZXY6IGRldmljZSB0byBhZGQKICAqCiAgKiBUaGlzIGFkZHMgYSBzaW5nbGUgcGNpIGRldmljZSB0byB0aGUgZ2xvYmFsCkBAIC05MSw2ICs5MSwzNyBAQAogfQogCiAvKioKKyAqIHBjaV9idXNfYWRkX2NoaWxkIC0gYWRkIGEgY2hpbGQgYnVzCisgKiBAYnVzOiBidXMgdG8gYWRkCisgKgorICogVGhpcyBhZGRzIHN5c2ZzIGVudHJpZXMgZm9yIGEgc2luZ2xlIGJ1cworICovCitpbnQgcGNpX2J1c19hZGRfY2hpbGQoc3RydWN0IHBjaV9idXMgKmJ1cykKK3sKKwlpbnQgcmV0dmFsOworCisJaWYgKGJ1cy0+YnJpZGdlKQorCQlidXMtPmRldi5wYXJlbnQgPSBidXMtPmJyaWRnZTsKKworCXJldHZhbCA9IGRldmljZV9yZWdpc3RlcigmYnVzLT5kZXYpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlidXMtPmlzX2FkZGVkID0gMTsKKworCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZSgmYnVzLT5kZXYsICZkZXZfYXR0cl9jcHVhZmZpbml0eSk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZSgmYnVzLT5kZXYsICZkZXZfYXR0cl9jcHVsaXN0YWZmaW5pdHkpOworCisJLyogQ3JlYXRlIGxlZ2FjeV9pbyBhbmQgbGVnYWN5X21lbSBmaWxlcyBmb3IgdGhpcyBidXMgKi8KKwlwY2lfY3JlYXRlX2xlZ2FjeV9maWxlcyhidXMpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCiAgKiBwY2lfYnVzX2FkZF9kZXZpY2VzIC0gaW5zZXJ0IG5ld2x5IGRpc2NvdmVyZWQgUENJIGRldmljZXMKICAqIEBidXM6IGJ1cyB0byBjaGVjayBmb3IgbmV3IGRldmljZXMKICAqCkBAIC0xMDUsNyArMTM2LDcgQEAKIHZvaWQgcGNpX2J1c19hZGRfZGV2aWNlcyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKQogewogCXN0cnVjdCBwY2lfZGV2ICpkZXY7Ci0Jc3RydWN0IHBjaV9idXMgKmNoaWxkX2J1czsKKwlzdHJ1Y3QgcGNpX2J1cyAqY2hpbGQ7CiAJaW50IHJldHZhbDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkgewpAQCAtMTIwLDQ1ICsxNTEsMjkgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmJ1cy0+ZGV2aWNlcywgYnVzX2xpc3QpIHsKIAkJQlVHX09OKCFkZXYtPmlzX2FkZGVkKTsKIAorCQljaGlsZCA9IGRldi0+c3Vib3JkaW5hdGU7CiAJCS8qCiAJCSAqIElmIHRoZXJlIGlzIGFuIHVuYXR0YWNoZWQgc3Vib3JkaW5hdGUgYnVzLCBhdHRhY2gKIAkJICogaXQgYW5kIHRoZW4gc2NhbiBmb3IgdW5hdHRhY2hlZCBQQ0kgZGV2aWNlcy4KIAkJICovCi0JCWlmIChkZXYtPnN1Ym9yZGluYXRlKSB7Ci0JCSAgICAgICBpZiAobGlzdF9lbXB0eSgmZGV2LT5zdWJvcmRpbmF0ZS0+bm9kZSkpIHsKLQkJCSAgICAgICBkb3duX3dyaXRlKCZwY2lfYnVzX3NlbSk7Ci0JCQkgICAgICAgbGlzdF9hZGRfdGFpbCgmZGV2LT5zdWJvcmRpbmF0ZS0+bm9kZSwKLQkJCQkJICAgICAgICZkZXYtPmJ1cy0+Y2hpbGRyZW4pOwotCQkJICAgICAgIHVwX3dyaXRlKCZwY2lfYnVzX3NlbSk7Ci0JCQl9Ci0JCQlwY2lfYnVzX2FkZF9kZXZpY2VzKGRldi0+c3Vib3JkaW5hdGUpOwotCi0JCQkvKiByZWdpc3RlciB0aGUgYnVzIHdpdGggc3lzZnMgYXMgdGhlIHBhcmVudCBpcyBub3cKLQkJCSAqIHByb3Blcmx5IHJlZ2lzdGVyZWQuICovCi0JCQljaGlsZF9idXMgPSBkZXYtPnN1Ym9yZGluYXRlOwotCQkJaWYgKGNoaWxkX2J1cy0+aXNfYWRkZWQpCi0JCQkJY29udGludWU7Ci0JCQljaGlsZF9idXMtPmRldi5wYXJlbnQgPSBjaGlsZF9idXMtPmJyaWRnZTsKLQkJCXJldHZhbCA9IGRldmljZV9yZWdpc3RlcigmY2hpbGRfYnVzLT5kZXYpOwotCQkJaWYgKHJldHZhbCkKLQkJCQlkZXZfZXJyKCZkZXYtPmRldiwgIkVycm9yIHJlZ2lzdGVyaW5nIHBjaV9idXMsIgotCQkJCQkiIGNvbnRpbnVpbmcuLi5cbiIpOwotCQkJZWxzZSB7Ci0JCQkJY2hpbGRfYnVzLT5pc19hZGRlZCA9IDE7Ci0JCQkJcmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZjaGlsZF9idXMtPmRldiwKLQkJCQkJCQkmZGV2X2F0dHJfY3B1YWZmaW5pdHkpOwotCQkJfQotCQkJaWYgKHJldHZhbCkKLQkJCQlkZXZfZXJyKCZkZXYtPmRldiwgIkVycm9yIGNyZWF0aW5nIGNwdWFmZmluaXR5IgotCQkJCQkiIGZpbGUsIGNvbnRpbnVpbmcuLi5cbiIpOwotCi0JCQlyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmNoaWxkX2J1cy0+ZGV2LAotCQkJCQkJJmRldl9hdHRyX2NwdWxpc3RhZmZpbml0eSk7Ci0JCQlpZiAocmV0dmFsKQotCQkJCWRldl9lcnIoJmRldi0+ZGV2LAotCQkJCQkiRXJyb3IgY3JlYXRpbmcgY3B1bGlzdGFmZmluaXR5IgotCQkJCQkiIGZpbGUsIGNvbnRpbnVpbmcuLi5cbiIpOworCQlpZiAoIWNoaWxkKQorCQkJY29udGludWU7CisJCWlmIChsaXN0X2VtcHR5KCZjaGlsZC0+bm9kZSkpIHsKKwkJCWRvd25fd3JpdGUoJnBjaV9idXNfc2VtKTsKKwkJCWxpc3RfYWRkX3RhaWwoJmNoaWxkLT5ub2RlLCAmZGV2LT5idXMtPmNoaWxkcmVuKTsKKwkJCXVwX3dyaXRlKCZwY2lfYnVzX3NlbSk7CiAJCX0KKwkJcGNpX2J1c19hZGRfZGV2aWNlcyhjaGlsZCk7CisKKwkJLyoKKwkJICogcmVnaXN0ZXIgdGhlIGJ1cyB3aXRoIHN5c2ZzIGFzIHRoZSBwYXJlbnQgaXMgbm93CisJCSAqIHByb3Blcmx5IHJlZ2lzdGVyZWQuCisJCSAqLworCQlpZiAoY2hpbGQtPmlzX2FkZGVkKQorCQkJY29udGludWU7CisJCXJldHZhbCA9IHBjaV9idXNfYWRkX2NoaWxkKGNoaWxkKTsKKwkJaWYgKHJldHZhbCkKKwkJCWRldl9lcnIoJmRldi0+ZGV2LCAiRXJyb3IgYWRkaW5nIGJ1cywgY29udGludWluZ1xuIik7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL01ha2VmaWxlIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9NYWtlZmlsZQppbmRleCA5YmRiZTFhLi5lMzFmYjkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvTWFrZWZpbGUKQEAgLTU1LDYgKzU1LDkgQEAKIAkJCQlwY2llaHBfY3RybC5vCVwKIAkJCQlwY2llaHBfcGNpLm8JXAogCQkJCXBjaWVocF9ocGMubworaWZkZWYgQ09ORklHX0FDUEkKK3BjaWVocC1vYmpzCQkrPQlwY2llaHBfYWNwaS5vCitlbmRpZgogCiBzaHBjaHAtb2JqcwkJOj0Jc2hwY2hwX2NvcmUubwlcCiAJCQkJc2hwY2hwX2N0cmwubwlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlfcGNpaHAuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaV9wY2locC5jCmluZGV4IGUxN2VmNTQuLmM2MmFiOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaV9wY2locC5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaV9wY2locC5jCkBAIC01MDEsNSArNTAxLDc0IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChhY3BpX3Jvb3RfYnJpZGdlKTsKIAorCitzdGF0aWMgaW50IGlzX2VqZWN0YWJsZShhY3BpX2hhbmRsZSBoYW5kbGUpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfaGFuZGxlIHRtcDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgcmVtb3ZhYmxlOworCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShoYW5kbGUsICJfQURSIiwgJnRtcCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQlyZXR1cm4gMDsKKwlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoaGFuZGxlLCAiX0VKMCIsICZ0bXApOworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkKKwkJcmV0dXJuIDE7CisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGhhbmRsZSwgIl9STVYiLCBOVUxMLCAmcmVtb3ZhYmxlKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykgJiYgcmVtb3ZhYmxlKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBhY3BpX3BjaWhwX2NoZWNrX2VqZWN0YWJsZSAtIGNoZWNrIGlmIGhhbmRsZSBpcyBlamVjdGFibGUgQUNQSSBQQ0kgc2xvdAorICogQHBidXM6IHRoZSBQQ0kgYnVzIG9mIHRoZSBQQ0kgc2xvdCBjb3JyZXNwb25kaW5nIHRvICdoYW5kbGUnCisgKiBAaGFuZGxlOiBBQ1BJIGhhbmRsZSB0byBjaGVjaworICoKKyAqIFJldHVybiAxIGlmIGhhbmRsZSBpcyBlamVjdGFibGUgUENJIHNsb3QsIDAgb3RoZXJ3aXNlLgorICovCitpbnQgYWNwaV9wY2lfY2hlY2tfZWplY3RhYmxlKHN0cnVjdCBwY2lfYnVzICpwYnVzLCBhY3BpX2hhbmRsZSBoYW5kbGUpCit7CisJYWNwaV9oYW5kbGUgYnJpZGdlX2hhbmRsZSwgcGFyZW50X2hhbmRsZTsKKworCWlmICghKGJyaWRnZV9oYW5kbGUgPSBhY3BpX3BjaV9nZXRfYnJpZGdlX2hhbmRsZShwYnVzKSkpCisJCXJldHVybiAwOworCWlmICgoQUNQSV9GQUlMVVJFKGFjcGlfZ2V0X3BhcmVudChoYW5kbGUsICZwYXJlbnRfaGFuZGxlKSkpKQorCQlyZXR1cm4gMDsKKwlpZiAoYnJpZGdlX2hhbmRsZSAhPSBwYXJlbnRfaGFuZGxlKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gaXNfZWplY3RhYmxlKGhhbmRsZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhY3BpX3BjaV9jaGVja19lamVjdGFibGUpOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2NoZWNrX2hvdHBsdWcoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgbHZsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcnYpCit7CisJaW50ICpmb3VuZCA9IChpbnQgKiljb250ZXh0OworCWlmIChpc19lamVjdGFibGUoaGFuZGxlKSkgeworCQkqZm91bmQgPSAxOworCQlyZXR1cm4gQUVfQ1RSTF9URVJNSU5BVEU7CisJfQorCXJldHVybiBBRV9PSzsKK30KKworLyoqCisgKiBhY3BpX3BjaV9kZXRlY3RfZWplY3RhYmxlIC0gY2hlY2sgaWYgdGhlIFBDSSBidXMgaGFzIGVqZWN0YWJsZSBzbG90cworICogQHBidXMgLSBQQ0kgYnVzIHRvIHNjYW4KKyAqCisgKiBSZXR1cm5zIDEgaWYgdGhlIFBDSSBidXMgaGFzIEFDUEkgYmFzZWQgZWplY3RhYmxlIHNsb3RzLCAwIG90aGVyd2lzZS4KKyAqLworaW50IGFjcGlfcGNpX2RldGVjdF9lamVjdGFibGUoc3RydWN0IHBjaV9idXMgKnBidXMpCit7CisJYWNwaV9oYW5kbGUgaGFuZGxlOworCWludCBmb3VuZCA9IDA7CisKKwlpZiAoIShoYW5kbGUgPSBhY3BpX3BjaV9nZXRfYnJpZGdlX2hhbmRsZShwYnVzKSkpCisJCXJldHVybiAwOworCWFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0RFVklDRSwgaGFuZGxlLCAodTMyKTEsCisJCQkgICAgY2hlY2tfaG90cGx1ZywgKHZvaWQgKikmZm91bmQsIE5VTEwpOworCXJldHVybiBmb3VuZDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFjcGlfcGNpX2RldGVjdF9lamVjdGFibGUpOworCiBtb2R1bGVfcGFyYW0oZGVidWdfYWNwaSwgYm9vbCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnX2FjcGksICJEZWJ1Z2dpbmcgbW9kZSBmb3IgQUNQSSBlbmFibGVkIG9yIG5vdCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwLmggYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHAuaAppbmRleCA5YmNiNmNiLi40ZmMxNjhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHAuaAorKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHAuaApAQCAtNDQsNyArNDQsNyBAQAogCWRvIHsJCQkJCQkJXAogCQlpZiAoYWNwaXBocF9kZWJ1ZykJCQkJXAogCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAiIGZvcm1hdCwJXAotCQkJCU1ZX05BTUUgLCAjIyBhcmcpOyAJCVwKKwkJCQlNWV9OQU1FICwgIyMgYXJnKTsJCVwKIAl9IHdoaWxlICgwKQogI2RlZmluZSBlcnIoZm9ybWF0LCBhcmcuLi4pIHByaW50ayhLRVJOX0VSUiAiJXM6ICIgZm9ybWF0LCBNWV9OQU1FICwgIyMgYXJnKQogI2RlZmluZSBpbmZvKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9JTkZPICIlczogIiBmb3JtYXQsIE1ZX05BTUUgLCAjIyBhcmcpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfZ2x1ZS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2dsdWUuYwppbmRleCAzYWZmYzY0Li5mMDliMTAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfZ2x1ZS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9nbHVlLmMKQEAgLTQ2LDYgKzQ2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9wY2lfaG90cGx1Zy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS1hY3BpLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgIi4uL3BjaS5oIgpAQCAtNjIsNjEgKzYzLDYgQEAKIHN0YXRpYyB2b2lkIGFjcGlwaHBfc2V0X2hwcF92YWx1ZXMoYWNwaV9oYW5kbGUgaGFuZGxlLCBzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKIHN0YXRpYyB2b2lkIGhhbmRsZV9ob3RwbHVnX2V2ZW50X2Z1bmMoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgdHlwZSwgdm9pZCAqY29udGV4dCk7CiAKLQotLyoKLSAqIGluaXRpYWxpemF0aW9uICYgdGVybWluYXRhdGlvbiByb3V0aW5lcwotICovCi0KLS8qKgotICogaXNfZWplY3RhYmxlIC0gZGV0ZXJtaW5lIGlmIGEgc2xvdCBpcyBlamVjdGFibGUKLSAqIEBoYW5kbGU6IGhhbmRsZSB0byBhY3BpIG5hbWVzcGFjZQotICoKLSAqIEVqZWN0YWJsZSBzbG90IHNob3VsZCBzYXRpc2Z5IGF0IGxlYXN0IHRoZXNlIGNvbmRpdGlvbnM6Ci0gKgotICogIDEuIGhhcyBfQURSIG1ldGhvZAotICogIDIuIGhhcyBfRUowIG1ldGhvZAotICoKLSAqIG9wdGlvbmFsbHkKLSAqCi0gKiAgMS4gaGFzIF9TVEEgbWV0aG9kCi0gKiAgMi4gaGFzIF9QUzAgbWV0aG9kCi0gKiAgMy4gaGFzIF9QUzMgbWV0aG9kCi0gKiAgNC4gLi4KLSAqLwotc3RhdGljIGludCBpc19lamVjdGFibGUoYWNwaV9oYW5kbGUgaGFuZGxlKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlhY3BpX2hhbmRsZSB0bXA7Ci0KLQlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoaGFuZGxlLCAiX0FEUiIsICZ0bXApOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoaGFuZGxlLCAiX0VKMCIsICZ0bXApOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXR1cm4gMTsKLX0KLQotCi0vKiBjYWxsYmFjayByb3V0aW5lIHRvIGNoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mIGVqZWN0YWJsZSBzbG90cyAqLwotc3RhdGljIGFjcGlfc3RhdHVzCi1pc19lamVjdGFibGVfc2xvdChhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBsdmwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipydikKLXsKLQlpbnQgKmNvdW50ID0gKGludCAqKWNvbnRleHQ7Ci0KLQlpZiAoaXNfZWplY3RhYmxlKGhhbmRsZSkpIHsKLQkJKCpjb3VudCkrKzsKLQkJLyogb25seSBvbmUgZWplY3RhYmxlIHNsb3QgaXMgZW5vdWdoICovCi0JCXJldHVybiBBRV9DVFJMX1RFUk1JTkFURTsKLQl9IGVsc2UgewotCQlyZXR1cm4gQUVfT0s7Ci0JfQotfQotCiAvKiBjYWxsYmFjayByb3V0aW5lIHRvIGNoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mIGEgcGNpIGRvY2sgZGV2aWNlICovCiBzdGF0aWMgYWNwaV9zdGF0dXMKIGlzX3BjaV9kb2NrX2RldmljZShhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBsdmwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipydikKQEAgLTEzMSw5ICs3Nyw2IEBACiAJfQogfQogCi0KLQotCiAvKgogICogdGhlIF9EQ0sgbWV0aG9kIGNhbiBkbyBmdW5ueSB0aGluZ3MuLi4gYW5kIHNvbWV0aW1lcyBub3QKICAqIGhhaC1oYWggZnVubnkuCkBAIC0xNjAsOSArMTAzLDkgQEAKIAogCWlmICgoKGJ1c2VzID4+IDgpICYgMHhmZikgIT0gYnVzLT5zZWNvbmRhcnkpIHsKIAkJYnVzZXMgPSAoYnVzZXMgJiAweGZmMDAwMDAwKQotCSAgICAgCQl8ICgodW5zaWduZWQgaW50KShidXMtPnByaW1hcnkpICAgICA8PCAgMCkKLQkgICAgIAkJfCAoKHVuc2lnbmVkIGludCkoYnVzLT5zZWNvbmRhcnkpICAgPDwgIDgpCi0JICAgICAJCXwgKCh1bnNpZ25lZCBpbnQpKGJ1cy0+c3Vib3JkaW5hdGUpIDw8IDE2KTsKKwkJCXwgKCh1bnNpZ25lZCBpbnQpKGJ1cy0+cHJpbWFyeSkgICAgIDw8ICAwKQorCQkJfCAoKHVuc2lnbmVkIGludCkoYnVzLT5zZWNvbmRhcnkpICAgPDwgIDgpCisJCQl8ICgodW5zaWduZWQgaW50KShidXMtPnN1Ym9yZGluYXRlKSA8PCAxNik7CiAJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYnVzLT5zZWxmLCBQQ0lfUFJJTUFSWV9CVVMsIGJ1c2VzKTsKIAl9CiAJcmV0dXJuIE5PVElGWV9PSzsKQEAgLTE4NCwxNyArMTI3LDEyIEBACiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAJdW5zaWduZWQgbG9uZyBsb25nIGFkciwgc3VuOwogCWludCBkZXZpY2UsIGZ1bmN0aW9uLCByZXR2YWw7CisJc3RydWN0IHBjaV9idXMgKnBidXMgPSBicmlkZ2UtPnBjaV9idXM7CiAKLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCAiX0FEUiIsIE5VTEwsICZhZHIpOwotCi0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCWlmICghYWNwaV9wY2lfY2hlY2tfZWplY3RhYmxlKHBidXMsIGhhbmRsZSkgJiYgIWlzX2RvY2tfZGV2aWNlKGhhbmRsZSkpCiAJCXJldHVybiBBRV9PSzsKIAotCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShoYW5kbGUsICJfRUowIiwgJnRtcCk7Ci0KLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgJiYgIShpc19kb2NrX2RldmljZShoYW5kbGUpKSkKLQkJcmV0dXJuIEFFX09LOwotCisJYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGhhbmRsZSwgIl9BRFIiLCBOVUxMLCAmYWRyKTsKIAlkZXZpY2UgPSAoYWRyID4+IDE2KSAmIDB4ZmZmZjsKIAlmdW5jdGlvbiA9IGFkciAmIDB4ZmZmZjsKIApAQCAtMjA1LDcgKzE0Myw4IEBACiAJSU5JVF9MSVNUX0hFQUQoJm5ld2Z1bmMtPnNpYmxpbmcpOwogCW5ld2Z1bmMtPmhhbmRsZSA9IGhhbmRsZTsKIAluZXdmdW5jLT5mdW5jdGlvbiA9IGZ1bmN0aW9uOwotCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkKKworCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKGhhbmRsZSwgIl9FSjAiLCAmdG1wKSkpCiAJCW5ld2Z1bmMtPmZsYWdzID0gRlVOQ19IQVNfRUowOwogCiAJaWYgKEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUoaGFuZGxlLCAiX1NUQSIsICZ0bXApKSkKQEAgLTI1Niw4ICsxOTUsNyBAQAogCQlicmlkZ2UtPm5yX3Nsb3RzKys7CiAKIAkJZGJnKCJmb3VuZCBBQ1BJIFBDSSBIb3RwbHVnIHNsb3QgJWxsdSBhdCBQQ0kgJTA0eDolMDJ4OiUwMnhcbiIsCi0JCQkJc2xvdC0+c3VuLCBwY2lfZG9tYWluX25yKGJyaWRnZS0+cGNpX2J1cyksCi0JCQkJYnJpZGdlLT5wY2lfYnVzLT5udW1iZXIsIHNsb3QtPmRldmljZSk7CisJCSAgICBzbG90LT5zdW4sIHBjaV9kb21haW5fbnIocGJ1cyksIHBidXMtPm51bWJlciwgZGV2aWNlKTsKIAkJcmV0dmFsID0gYWNwaXBocF9yZWdpc3Rlcl9ob3RwbHVnX3Nsb3Qoc2xvdCk7CiAJCWlmIChyZXR2YWwpIHsKIAkJCWlmIChyZXR2YWwgPT0gLUVCVVNZKQpAQCAtMjc0LDggKzIxMiw3IEBACiAJbGlzdF9hZGRfdGFpbCgmbmV3ZnVuYy0+c2libGluZywgJnNsb3QtPmZ1bmNzKTsKIAogCS8qIGFzc29jaWF0ZSBjb3JyZXNwb25kaW5nIHBjaV9kZXYgKi8KLQluZXdmdW5jLT5wY2lfZGV2ID0gcGNpX2dldF9zbG90KGJyaWRnZS0+cGNpX2J1cywKLQkJCQkJIFBDSV9ERVZGTihkZXZpY2UsIGZ1bmN0aW9uKSk7CisJbmV3ZnVuYy0+cGNpX2RldiA9IHBjaV9nZXRfc2xvdChwYnVzLCBQQ0lfREVWRk4oZGV2aWNlLCBmdW5jdGlvbikpOwogCWlmIChuZXdmdW5jLT5wY2lfZGV2KSB7CiAJCXNsb3QtPmZsYWdzIHw9IChTTE9UX0VOQUJMRUQgfCBTTE9UX1BPV0VSRURPTik7CiAJfQpAQCAtMzI0LDI3ICsyNjEsMTUgQEAKIAogCiAvKiBzZWUgaWYgaXQncyB3b3J0aCBsb29raW5nIGF0IHRoaXMgYnJpZGdlICovCi1zdGF0aWMgaW50IGRldGVjdF9lamVjdGFibGVfc2xvdHMoYWNwaV9oYW5kbGUgKmJyaWRnZV9oYW5kbGUpCitzdGF0aWMgaW50IGRldGVjdF9lamVjdGFibGVfc2xvdHMoc3RydWN0IHBjaV9idXMgKnBidXMpCiB7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCWludCBjb3VudDsKLQotCWNvdW50ID0gMDsKLQotCS8qIG9ubHkgY2hlY2sgc2xvdHMgZGVmaW5lZCBkaXJlY3RseSBiZWxvdyBicmlkZ2Ugb2JqZWN0ICovCi0Jc3RhdHVzID0gYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfREVWSUNFLCBicmlkZ2VfaGFuZGxlLCAodTMyKTEsCi0JCQkJICAgICBpc19lamVjdGFibGVfc2xvdCwgKHZvaWQgKikmY291bnQsIE5VTEwpOwotCi0JLyoKLQkgKiB3ZSBhbHNvIG5lZWQgdG8gYWRkIHRoaXMgYnJpZGdlIGlmIHRoZXJlIGlzIGEgZG9jayBicmlkZ2Ugb3IKLQkgKiBvdGhlciBwY2kgZGV2aWNlIG9uIGEgZG9jayBzdGF0aW9uIChyZW1vdmFibGUpCi0JICovCi0JaWYgKCFjb3VudCkKLQkJc3RhdHVzID0gYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfREVWSUNFLCBicmlkZ2VfaGFuZGxlLAotCQkJCSh1MzIpMSwgaXNfcGNpX2RvY2tfZGV2aWNlLCAodm9pZCAqKSZjb3VudCwKLQkJCQlOVUxMKTsKLQotCXJldHVybiBjb3VudDsKKwlpbnQgZm91bmQgPSBhY3BpX3BjaV9kZXRlY3RfZWplY3RhYmxlKHBidXMpOworCWlmICghZm91bmQpIHsKKwkJYWNwaV9oYW5kbGUgYnJpZGdlX2hhbmRsZSA9IGFjcGlfcGNpX2dldF9icmlkZ2VfaGFuZGxlKHBidXMpOworCQlhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9ERVZJQ0UsIGJyaWRnZV9oYW5kbGUsICh1MzIpMSwKKwkJCQkgICAgaXNfcGNpX2RvY2tfZGV2aWNlLCAodm9pZCAqKSZmb3VuZCwgTlVMTCk7CisJfQorCXJldHVybiBmb3VuZDsKIH0KIAogCkBAIC01NTQsNyArNDc5LDcgQEAKIAkJZ290byBvdXQ7CiAKIAkvKiBjaGVjayBpZiB0aGlzIGJyaWRnZSBoYXMgZWplY3RhYmxlIHNsb3RzICovCi0JaWYgKChkZXRlY3RfZWplY3RhYmxlX3Nsb3RzKGhhbmRsZSkgPiAwKSkgeworCWlmICgoZGV0ZWN0X2VqZWN0YWJsZV9zbG90cyhkZXYtPnN1Ym9yZGluYXRlKSA+IDApKSB7CiAJCWRiZygiZm91bmQgUENJLXRvLVBDSSBicmlkZ2UgYXQgUENJICVzXG4iLCBwY2lfbmFtZShkZXYpKTsKIAkJYWRkX3AycF9icmlkZ2UoaGFuZGxlLCBkZXYpOwogCX0KQEAgLTYxNSw3ICs1NDAsNyBAQAogCX0KIAogCS8qIGNoZWNrIGlmIHRoaXMgYnJpZGdlIGhhcyBlamVjdGFibGUgc2xvdHMgKi8KLQlpZiAoZGV0ZWN0X2VqZWN0YWJsZV9zbG90cyhoYW5kbGUpID4gMCkgeworCWlmIChkZXRlY3RfZWplY3RhYmxlX3Nsb3RzKHBjaV9idXMpID4gMCkgewogCQlkYmcoImZvdW5kIFBDSSBob3N0LWJ1cyBicmlkZ2Ugd2l0aCBob3QtcGx1Z2dhYmxlIHNsb3RzXG4iKTsKIAkJYWRkX2hvc3RfYnJpZGdlKGhhbmRsZSwgcGNpX2J1cyk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2libS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2libS5jCmluZGV4IDg4MWZkZDIuLjViZWZhN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9pYm0uYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfaWJtLmMKQEAgLTI3MSw3ICsyNzEsNyBAQAogCQlkYmcoIiVzOiBnZW5lcmF0aW9uZyBidXMgZXZlbnRcbiIsIF9fZnVuY19fKTsKIAkJYWNwaV9idXNfZ2VuZXJhdGVfcHJvY19ldmVudChub3RlLT5kZXZpY2UsIG5vdGUtPmV2ZW50LCBkZXRhaWwpOwogCQlhY3BpX2J1c19nZW5lcmF0ZV9uZXRsaW5rX2V2ZW50KG5vdGUtPmRldmljZS0+cG5wLmRldmljZV9jbGFzcywKLQkJCQkJCSAgbm90ZS0+ZGV2aWNlLT5kZXYuYnVzX2lkLAorCQkJCQkJICBkZXZfbmFtZSgmbm90ZS0+ZGV2aWNlLT5kZXYpLAogCQkJCQkJICBub3RlLT5ldmVudCwgZGV0YWlsKTsKIAl9IGVsc2UKIAkJbm90ZS0+ZXZlbnQgPSBldmVudDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX2N0cmwuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX2N0cmwuYwppbmRleCBhNjBhMjUyLi5jYzIyN2E4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9jdHJsLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfY3RybC5jCkBAIC0xOTU0LDcgKzE5NTQsNyBAQAogCQkJcmV0dXJuIDsKIAkJfQogCi0JCWlmIChmdW5jICE9IE5VTEwgJiYgY3RybCAhPSBOVUxMKSB7CisJCWlmIChjdHJsICE9IE5VTEwpIHsKIAkJCWlmIChjcHFocF9wcm9jZXNzX1NJKGN0cmwsIGZ1bmMpICE9IDApIHsKIAkJCQlhbWJlcl9MRURfb24oY3RybCwgaHBfc2xvdCk7CiAJCQkJZ3JlZW5fTEVEX29mZihjdHJsLCBocF9zbG90KTsKQEAgLTI2MDQsNyArMjYwNCw3IEBACiAJCQlmb3IgKGNsb29wID0gMDsgY2xvb3AgPCA0OyBjbG9vcCsrKSB7CiAJCQkJaWYgKGlycXMudmFsaWRfSU5UICYgKDB4MDEgPDwgY2xvb3ApKSB7CiAJCQkJCXJjID0gY3BxaHBfc2V0X2lycShmdW5jLT5idXMsIGZ1bmMtPmRldmljZSwKLQkJCQkJCQkgICAweDBBICsgY2xvb3AsIGlycXMuaW50ZXJydXB0W2Nsb29wXSk7CisJCQkJCQkJICAgY2xvb3AgKyAxLCBpcnFzLmludGVycnVwdFtjbG9vcF0pOwogCQkJCQlpZiAocmMpCiAJCQkJCQlnb3RvIGZyZWVfYW5kX291dDsKIAkJCQl9CkBAIC0yOTQ1LDcgKzI5NDUsNyBAQAogCQl9CiAKIAkJaWYgKCFiZWhpbmRfYnJpZGdlKSB7Ci0JCQlyYyA9IGNwcWhwX3NldF9pcnEoZnVuYy0+YnVzLCBmdW5jLT5kZXZpY2UsIHRlbXBfYnl0ZSArIDB4MDksIElSUSk7CisJCQlyYyA9IGNwcWhwX3NldF9pcnEoZnVuYy0+YnVzLCBmdW5jLT5kZXZpY2UsIHRlbXBfYnl0ZSwgSVJRKTsKIAkJCWlmIChyYykKIAkJCQlyZXR1cm4gMTsKIAkJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX3BjaS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfcGNpLmMKaW5kZXggZGYxNDZiZS4uNmMwZWQwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfcGNpLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfcGNpLmMKQEAgLTE3MSw3ICsxNzEsNyBAQAogCQlmYWtlYnVzLT5udW1iZXIgPSBidXNfbnVtOwogCQlkYmcoIiVzOiBkZXYgJWQsIGJ1cyAlZCwgcGluICVkLCBudW0gJWRcbiIsCiAJCSAgICBfX2Z1bmNfXywgZGV2X251bSwgYnVzX251bSwgaW50X3BpbiwgaXJxX251bSk7Ci0JCXJjID0gcGNpYmlvc19zZXRfaXJxX3JvdXRpbmcoZmFrZWRldiwgaW50X3BpbiAtIDB4MGEsIGlycV9udW0pOworCQlyYyA9IHBjaWJpb3Nfc2V0X2lycV9yb3V0aW5nKGZha2VkZXYsIGludF9waW4gLSAxLCBpcnFfbnVtKTsKIAkJa2ZyZWUoZmFrZWRldik7CiAJCWtmcmVlKGZha2VidXMpOwogCQlkYmcoIiVzOiByYyAlZFxuIiwgX19mdW5jX18sIHJjKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvZmFrZXBocC5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9mYWtlcGhwLmMKaW5kZXggM2EyNjM3YS4uYjBlN2RlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9mYWtlcGhwLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9mYWtlcGhwLmMKQEAgLTMyNCw2ICszMjQsNyBAQAogCiAJCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZkc2xvdC0+cmVtb3ZlZCkpIHsKIAkJCWRiZygiU2xvdCBhbHJlYWR5IHNjaGVkdWxlZCBmb3IgcmVtb3ZhbFxuIik7CisJCQlwY2lfZGV2X3B1dChkZXYpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHAuaCBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwLmgKaW5kZXggYjI4MDFhNy4uMjdmZDE4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHAuaAorKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocC5oCkBAIC0yMjAsMTEgKzIyMCwyMyBAQAogI2luY2x1ZGUgPGFjcGkvYWN0eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS1hY3BpLmg+CiAKK2V4dGVybiB2b2lkIF9faW5pdCBwY2llaHBfYWNwaV9zbG90X2RldGVjdGlvbl9pbml0KHZvaWQpOworZXh0ZXJuIGludCBwY2llaHBfYWNwaV9zbG90X2RldGVjdGlvbl9jaGVjayhzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKKworc3RhdGljIGlubGluZSB2b2lkIHBjaWVocF9maXJtd2FyZV9pbml0KHZvaWQpCit7CisJcGNpZWhwX2FjcGlfc2xvdF9kZXRlY3Rpb25faW5pdCgpOworfQorCiBzdGF0aWMgaW5saW5lIGludCBwY2llaHBfZ2V0X2hwX2h3X2NvbnRyb2xfZnJvbV9maXJtd2FyZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogeworCWludCByZXR2YWw7CiAJdTMyIGZsYWdzID0gKE9TQ19QQ0lfRVhQUkVTU19OQVRJVkVfSFBfQ09OVFJPTCB8CiAJCSAgICAgT1NDX1BDSV9FWFBSRVNTX0NBUF9TVFJVQ1RVUkVfQ09OVFJPTCk7Ci0JcmV0dXJuIGFjcGlfZ2V0X2hwX2h3X2NvbnRyb2xfZnJvbV9maXJtd2FyZShkZXYsIGZsYWdzKTsKKwlyZXR2YWwgPSBhY3BpX2dldF9ocF9od19jb250cm9sX2Zyb21fZmlybXdhcmUoZGV2LCBmbGFncyk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwlyZXR1cm4gcGNpZWhwX2FjcGlfc2xvdF9kZXRlY3Rpb25fY2hlY2soZGV2KTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgcGNpZWhwX2dldF9ocF9wYXJhbXNfZnJvbV9maXJtd2FyZShzdHJ1Y3QgcGNpX2RldiAqZGV2LApAQCAtMjM1LDYgKzI0Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAjZWxzZQorI2RlZmluZSBwY2llaHBfZmlybXdhcmVfaW5pdCgpCQkJCWRvIHt9IHdoaWxlICgwKQogI2RlZmluZSBwY2llaHBfZ2V0X2hwX2h3X2NvbnRyb2xfZnJvbV9maXJtd2FyZShkZXYpIAkwCiAjZGVmaW5lIHBjaWVocF9nZXRfaHBfcGFyYW1zX2Zyb21fZmlybXdhcmUoZGV2LCBocHApICAgICgtRU5PREVWKQogI2VuZGlmIAkJCQkvKiBDT05GSUdfQUNQSSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfYWNwaS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfYWNwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzOGQ3OTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9hY3BpLmMKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBBQ1BJIHJlbGF0ZWQgZnVuY3Rpb25zIGZvciBQQ0kgRXhwcmVzcyBIb3QgUGx1ZyBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEtlbmppIEthbmVzaGlnZQorICogQ29weXJpZ2h0IChDKSAyMDA4IEZ1aml0c3UgTGltaXRlZC4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaV9ob3RwbHVnLmg+CisjaW5jbHVkZSAicGNpZWhwLmgiCisKKyNkZWZpbmUgUENJRUhQX0RFVEVDVF9QQ0lFCSgwKQorI2RlZmluZSBQQ0lFSFBfREVURUNUX0FDUEkJKDEpCisjZGVmaW5lIFBDSUVIUF9ERVRFQ1RfQVVUTwkoMikKKyNkZWZpbmUgUENJRUhQX0RFVEVDVF9ERUZBVUxUCVBDSUVIUF9ERVRFQ1RfQVVUTworCitzdGF0aWMgaW50IHNsb3RfZGV0ZWN0aW9uX21vZGU7CitzdGF0aWMgY2hhciAqcGNpZWhwX2RldGVjdF9tb2RlOworbW9kdWxlX3BhcmFtKHBjaWVocF9kZXRlY3RfbW9kZSwgY2hhcnAsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhwY2llaHBfZGV0ZWN0X21vZGUsCisJICJTbG90IGRldGVjdGlvbiBtb2RlOiBwY2llLCBhY3BpLCBhdXRvXG4iCisJICIgIHBjaWUgICAgICAgICAgLSBVc2UgUENJZSBiYXNlZCBzbG90IGRldGVjdGlvblxuIgorCSAiICBhY3BpICAgICAgICAgIC0gVXNlIEFDUEkgZm9yIHNsb3QgZGV0ZWN0aW9uXG4iCisJICIgIGF1dG8oZGVmYXVsdCkgLSBBdXRvIHNlbGVjdCBtb2RlLiBVc2UgYWNwaSBvcHRpb24gaWYgZHVwbGljYXRlXG4iCisJICIgICAgICAgICAgICAgICAgICBzbG90IGlkcyBhcmUgZm91bmQuIE90aGVyd2lzZSwgdXNlIHBjaWUgb3B0aW9uXG4iKTsKKworaW50IHBjaWVocF9hY3BpX3Nsb3RfZGV0ZWN0aW9uX2NoZWNrKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaWYgKHNsb3RfZGV0ZWN0aW9uX21vZGUgIT0gUENJRUhQX0RFVEVDVF9BQ1BJKQorCQlyZXR1cm4gMDsKKwlpZiAoYWNwaV9wY2lfZGV0ZWN0X2VqZWN0YWJsZShkZXYtPnN1Ym9yZGluYXRlKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHBhcnNlX2RldGVjdF9tb2RlKHZvaWQpCit7CisJaWYgKCFwY2llaHBfZGV0ZWN0X21vZGUpCisJCXJldHVybiBQQ0lFSFBfREVURUNUX0RFRkFVTFQ7CisJaWYgKCFzdHJjbXAocGNpZWhwX2RldGVjdF9tb2RlLCAicGNpZSIpKQorCQlyZXR1cm4gUENJRUhQX0RFVEVDVF9QQ0lFOworCWlmICghc3RyY21wKHBjaWVocF9kZXRlY3RfbW9kZSwgImFjcGkiKSkKKwkJcmV0dXJuIFBDSUVIUF9ERVRFQ1RfQUNQSTsKKwlpZiAoIXN0cmNtcChwY2llaHBfZGV0ZWN0X21vZGUsICJhdXRvIikpCisJCXJldHVybiBQQ0lFSFBfREVURUNUX0FVVE87CisJd2FybigiYmFkIHNwZWNpZmllciAnJXMnIGZvciBwY2llaHBfZGV0ZWN0X21vZGUuIFVzZSBkZWZhdWx0XG4iLAorCSAgICAgcGNpZWhwX2RldGVjdF9tb2RlKTsKKwlyZXR1cm4gUENJRUhQX0RFVEVDVF9ERUZBVUxUOworfQorCitzdGF0aWMgc3RydWN0IHBjaWVfcG9ydF9zZXJ2aWNlX2lkIF9faW5pdGRhdGEgcG9ydF9wY2lfaWRzW10gPSB7CisJeworCQkudmVuZG9yID0gUENJX0FOWV9JRCwKKwkJLmRldmljZSA9IFBDSV9BTllfSUQsCisJCS5wb3J0X3R5cGUgPSBQQ0lFX0FOWV9QT1JULAorCQkuc2VydmljZV90eXBlID0gUENJRV9QT1JUX1NFUlZJQ0VfSFAsCisJCS5kcml2ZXJfZGF0YSA9ICAwLAorICAgICAgICB9LCB7IC8qIGVuZDogYWxsIHplcm9lcyAqLyB9Cit9OworCitzdGF0aWMgaW50IF9faW5pdGRhdGEgZHVwX3Nsb3RfaWQ7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgYWNwaV9zbG90X2RldGVjdGVkOworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgX19pbml0ZGF0YSBkdW1teV9zbG90cyA9IExJU1RfSEVBRF9JTklUKGR1bW15X3Nsb3RzKTsKKworLyogRHVtbXkgZHJpdmVyIGZvciBkdW1wbGljYXRlIG5hbWUgZGV0ZWN0aW9uICovCitzdGF0aWMgaW50IF9faW5pdCBkdW1teV9wcm9iZShzdHJ1Y3QgcGNpZV9kZXZpY2UgKmRldiwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBwY2llX3BvcnRfc2VydmljZV9pZCAqaWQpCit7CisJaW50IHBvczsKKwl1MzIgc2xvdF9jYXA7CisJc3RydWN0IHNsb3QgKnNsb3QsICp0bXA7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBkZXYtPnBvcnQ7CisJc3RydWN0IHBjaV9idXMgKnBidXMgPSBwZGV2LT5zdWJvcmRpbmF0ZTsKKwlpZiAoIShzbG90ID0ga3phbGxvYyhzaXplb2YoKnNsb3QpLCBHRlBfS0VSTkVMKSkpCisJCXJldHVybiAtRU5PTUVNOworCS8qIE5vdGU6IHBjaWVocF9kZXRlY3RfbW9kZSAhPSBQQ0lFSFBfREVURUNUX0FDUEkgaGVyZSAqLworCWlmIChwY2llaHBfZ2V0X2hwX2h3X2NvbnRyb2xfZnJvbV9maXJtd2FyZShwZGV2KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKCEocG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfQ0FQX0lEX0VYUCkpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgcG9zICsgUENJX0VYUF9TTFRDQVAsICZzbG90X2NhcCk7CisJc2xvdC0+bnVtYmVyID0gc2xvdF9jYXAgPj4gMTk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXAsICZkdW1teV9zbG90cywgc2xvdF9saXN0KSB7CisJCWlmICh0bXAtPm51bWJlciA9PSBzbG90LT5udW1iZXIpCisJCQlkdXBfc2xvdF9pZCsrOworCX0KKwlsaXN0X2FkZF90YWlsKCZzbG90LT5zbG90X2xpc3QsICZkdW1teV9zbG90cyk7CisJaWYgKCFhY3BpX3Nsb3RfZGV0ZWN0ZWQgJiYgYWNwaV9wY2lfZGV0ZWN0X2VqZWN0YWJsZShwYnVzKSkKKwkJYWNwaV9zbG90X2RldGVjdGVkID0gMTsKKwlyZXR1cm4gLUVOT0RFVjsgICAgICAgICAvKiBkdW1teSBkcml2ZXIgYWx3YXlzIHJldHVybnMgZXJyb3IgKi8KK30KKworc3RhdGljIHN0cnVjdCBwY2llX3BvcnRfc2VydmljZV9kcml2ZXIgX19pbml0ZGF0YSBkdW1teV9kcml2ZXIgPSB7CisgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJwY2llaHBfZHVtbXkiLAorICAgICAgICAuaWRfdGFibGUgICAgICAgPSBwb3J0X3BjaV9pZHMsCisgICAgICAgIC5wcm9iZSAgICAgICAgICA9IGR1bW15X3Byb2JlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2VsZWN0X2RldGVjdGlvbl9tb2RlKHZvaWQpCit7CisJc3RydWN0IHNsb3QgKnNsb3QsICp0bXA7CisJcGNpZV9wb3J0X3NlcnZpY2VfcmVnaXN0ZXIoJmR1bW15X2RyaXZlcik7CisJcGNpZV9wb3J0X3NlcnZpY2VfdW5yZWdpc3RlcigmZHVtbXlfZHJpdmVyKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2xvdCwgdG1wLCAmZHVtbXlfc2xvdHMsIHNsb3RfbGlzdCkgeworCQlsaXN0X2RlbCgmc2xvdC0+c2xvdF9saXN0KTsKKwkJa2ZyZWUoc2xvdCk7CisJfQorCWlmIChhY3BpX3Nsb3RfZGV0ZWN0ZWQgJiYgZHVwX3Nsb3RfaWQpCisJCXJldHVybiBQQ0lFSFBfREVURUNUX0FDUEk7CisJcmV0dXJuIFBDSUVIUF9ERVRFQ1RfUENJRTsKK30KKwordm9pZCBfX2luaXQgcGNpZWhwX2FjcGlfc2xvdF9kZXRlY3Rpb25faW5pdCh2b2lkKQoreworCXNsb3RfZGV0ZWN0aW9uX21vZGUgPSBwYXJzZV9kZXRlY3RfbW9kZSgpOworCWlmIChzbG90X2RldGVjdGlvbl9tb2RlICE9IFBDSUVIUF9ERVRFQ1RfQVVUTykKKwkJZ290byBvdXQ7CisJc2xvdF9kZXRlY3Rpb25fbW9kZSA9IHNlbGVjdF9kZXRlY3Rpb25fbW9kZSgpOworb3V0OgorCWlmIChzbG90X2RldGVjdGlvbl9tb2RlID09IFBDSUVIUF9ERVRFQ1RfQUNQSSkKKwkJaW5mbygiVXNpbmcgQUNQSSBmb3Igc2xvdCBkZXRlY3Rpb24uXG4iKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2NvcmUuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2NvcmUuYwppbmRleCAzOWNmMjQ4Li41NDgyZDRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jb3JlLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY29yZS5jCkBAIC01MjIsNiArNTIyLDcgQEAKIHsKIAlpbnQgcmV0dmFsID0gMDsKIAorCXBjaWVocF9maXJtd2FyZV9pbml0KCk7CiAJcmV0dmFsID0gcGNpZV9wb3J0X3NlcnZpY2VfcmVnaXN0ZXIoJmhwZHJpdmVyX3BvcnRkcnYpOwogIAlkYmcoInBjaWVfcG9ydF9zZXJ2aWNlX3JlZ2lzdGVyID0gJWRcbiIsIHJldHZhbCk7CiAgIAlpbmZvKERSSVZFUl9ERVNDICIgdmVyc2lvbjogIiBEUklWRVJfVkVSU0lPTiAiXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2N0cmwuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2N0cmwuYwppbmRleCBmZWFkNjNjLi5mZjQwMzQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jdHJsLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY3RybC5jCkBAIC0xNzgsMTUgKzE3OCwxNCBAQAogCQkJCSAiSXNzdWUgb2YgU2xvdCBQb3dlciBPZmYgY29tbWFuZCBmYWlsZWRcbiIpOwogCQkJcmV0dXJuOwogCQl9CisJCS8qCisJCSAqIEFmdGVyIHR1cm5pbmcgcG93ZXIgb2ZmLCB3ZSBtdXN0IHdhaXQgZm9yIGF0IGxlYXN0IDEgc2Vjb25kCisJCSAqIGJlZm9yZSB0YWtpbmcgYW55IGFjdGlvbiB0aGF0IHJlbGllcyBvbiBwb3dlciBoYXZpbmcgYmVlbgorCQkgKiByZW1vdmVkIGZyb20gdGhlIHNsb3QvYWRhcHRlci4KKwkJICovCisJCW1zbGVlcCgxMDAwKTsKIAl9CiAKLQkvKgotCSAqIEFmdGVyIHR1cm5pbmcgcG93ZXIgb2ZmLCB3ZSBtdXN0IHdhaXQgZm9yIGF0IGxlYXN0IDEgc2Vjb25kCi0JICogYmVmb3JlIHRha2luZyBhbnkgYWN0aW9uIHRoYXQgcmVsaWVzIG9uIHBvd2VyIGhhdmluZyBiZWVuCi0JICogcmVtb3ZlZCBmcm9tIHRoZSBzbG90L2FkYXB0ZXIuCi0JICovCi0JbXNsZWVwKDEwMDApOwotCiAJaWYgKFBXUl9MRUQoY3RybCkpCiAJCXBzbG90LT5ocGNfb3BzLT5ncmVlbl9sZWRfb2ZmKHBzbG90KTsKIApAQCAtMjg2LDE1ICsyODUsMTQgQEAKIAkJCQkgIklzc3VlIG9mIFNsb3QgRGlzYWJsZSBjb21tYW5kIGZhaWxlZFxuIik7CiAJCQlyZXR1cm4gcmV0dmFsOwogCQl9CisJCS8qCisJCSAqIEFmdGVyIHR1cm5pbmcgcG93ZXIgb2ZmLCB3ZSBtdXN0IHdhaXQgZm9yIGF0IGxlYXN0IDEgc2Vjb25kCisJCSAqIGJlZm9yZSB0YWtpbmcgYW55IGFjdGlvbiB0aGF0IHJlbGllcyBvbiBwb3dlciBoYXZpbmcgYmVlbgorCQkgKiByZW1vdmVkIGZyb20gdGhlIHNsb3QvYWRhcHRlci4KKwkJICovCisJCW1zbGVlcCgxMDAwKTsKIAl9CiAKLQkvKgotCSAqIEFmdGVyIHR1cm5pbmcgcG93ZXIgb2ZmLCB3ZSBtdXN0IHdhaXQgZm9yIGF0IGxlYXN0IDEgc2Vjb25kCi0JICogYmVmb3JlIHRha2luZyBhbnkgYWN0aW9uIHRoYXQgcmVsaWVzIG9uIHBvd2VyIGhhdmluZyBiZWVuCi0JICogcmVtb3ZlZCBmcm9tIHRoZSBzbG90L2FkYXB0ZXIuCi0JICovCi0JbXNsZWVwKDEwMDApOwotCiAJaWYgKFBXUl9MRUQoY3RybCkpCiAJCS8qIHR1cm4gb2ZmIEdyZWVuIExFRCAqLwogCQlwX3Nsb3QtPmhwY19vcHMtPmdyZWVuX2xlZF9vZmYocF9zbG90KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2hwYy5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfaHBjLmMKaW5kZXggYjY0M2NhMS4uNzFhODAxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfaHBjLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfaHBjLmMKQEAgLTQyLDQyICs0Miw2IEBACiAKIHN0YXRpYyBhdG9taWNfdCBwY2llaHBfbnVtX2NvbnRyb2xsZXJzID0gQVRPTUlDX0lOSVQoMCk7CiAKLXN0cnVjdCBjdHJsX3JlZyB7Ci0JdTggY2FwX2lkOwotCXU4IG54dF9wdHI7Ci0JdTE2IGNhcF9yZWc7Ci0JdTMyIGRldl9jYXA7Ci0JdTE2IGRldl9jdHJsOwotCXUxNiBkZXZfc3RhdHVzOwotCXUzMiBsbmtfY2FwOwotCXUxNiBsbmtfY3RybDsKLQl1MTYgbG5rX3N0YXR1czsKLQl1MzIgc2xvdF9jYXA7Ci0JdTE2IHNsb3RfY3RybDsKLQl1MTYgc2xvdF9zdGF0dXM7Ci0JdTE2IHJvb3RfY3RybDsKLQl1MTYgcnN2cDsKLQl1MzIgcm9vdF9zdGF0dXM7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotLyogb2Zmc2V0cyB0byB0aGUgY29udHJvbGxlciByZWdpc3RlcnMgYmFzZWQgb24gdGhlIGFib3ZlIHN0cnVjdHVyZSBsYXlvdXQgKi8KLWVudW0gY3RybF9vZmZzZXRzIHsKLQlQQ0lFQ0FQSUQJPQlvZmZzZXRvZihzdHJ1Y3QgY3RybF9yZWcsIGNhcF9pZCksCi0JTlhUQ0FQUFRSCT0Jb2Zmc2V0b2Yoc3RydWN0IGN0cmxfcmVnLCBueHRfcHRyKSwKLQlDQVBSRUcJCT0Jb2Zmc2V0b2Yoc3RydWN0IGN0cmxfcmVnLCBjYXBfcmVnKSwKLQlERVZDQVAJCT0Jb2Zmc2V0b2Yoc3RydWN0IGN0cmxfcmVnLCBkZXZfY2FwKSwKLQlERVZDVFJMCQk9CW9mZnNldG9mKHN0cnVjdCBjdHJsX3JlZywgZGV2X2N0cmwpLAotCURFVlNUQVRVUwk9CW9mZnNldG9mKHN0cnVjdCBjdHJsX3JlZywgZGV2X3N0YXR1cyksCi0JTE5LQ0FQCQk9CW9mZnNldG9mKHN0cnVjdCBjdHJsX3JlZywgbG5rX2NhcCksCi0JTE5LQ1RSTAkJPQlvZmZzZXRvZihzdHJ1Y3QgY3RybF9yZWcsIGxua19jdHJsKSwKLQlMTktTVEFUVVMJPQlvZmZzZXRvZihzdHJ1Y3QgY3RybF9yZWcsIGxua19zdGF0dXMpLAotCVNMT1RDQVAJCT0Jb2Zmc2V0b2Yoc3RydWN0IGN0cmxfcmVnLCBzbG90X2NhcCksCi0JU0xPVENUUkwJPQlvZmZzZXRvZihzdHJ1Y3QgY3RybF9yZWcsIHNsb3RfY3RybCksCi0JU0xPVFNUQVRVUwk9CW9mZnNldG9mKHN0cnVjdCBjdHJsX3JlZywgc2xvdF9zdGF0dXMpLAotCVJPT1RDVFJMCT0Jb2Zmc2V0b2Yoc3RydWN0IGN0cmxfcmVnLCByb290X2N0cmwpLAotCVJPT1RTVEFUVVMJPQlvZmZzZXRvZihzdHJ1Y3QgY3RybF9yZWcsIHJvb3Rfc3RhdHVzKSwKLX07Ci0KIHN0YXRpYyBpbmxpbmUgaW50IHBjaWVocF9yZWFkdyhzdHJ1Y3QgY29udHJvbGxlciAqY3RybCwgaW50IHJlZywgdTE2ICp2YWx1ZSkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gY3RybC0+cGNpX2RldjsKQEAgLTEwMiw5NSArNjYsOSBAQAogCXJldHVybiBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgY3RybC0+Y2FwX2Jhc2UgKyByZWcsIHZhbHVlKTsKIH0KIAotLyogRmllbGQgZGVmaW5pdGlvbnMgaW4gUENJIEV4cHJlc3MgQ2FwYWJpbGl0aWVzIFJlZ2lzdGVyICovCi0jZGVmaW5lIENBUF9WRVIJCQkweDAwMEYKLSNkZWZpbmUgREVWX1BPUlRfVFlQRQkJMHgwMEYwCi0jZGVmaW5lIFNMT1RfSU1QTAkJMHgwMTAwCi0jZGVmaW5lIE1TR19OVU0JCQkweDNFMDAKLQotLyogRGV2aWNlIG9yIFBvcnQgVHlwZSAqLwotI2RlZmluZSBOQVRfRU5EUFQJCTB4MDAKLSNkZWZpbmUgTEVHX0VORFBUCQkweDAxCi0jZGVmaW5lIFJPT1RfUE9SVAkJMHgwNAotI2RlZmluZSBVUF9TVFJFQU0JCTB4MDUKLSNkZWZpbmUJRE5fU1RSRUFNCQkweDA2Ci0jZGVmaW5lIFBDSUVfUENJX0JSREcJCTB4MDcKLSNkZWZpbmUgUENJX1BDSUVfQlJERwkJMHgxMAotCi0vKiBGaWVsZCBkZWZpbml0aW9ucyBpbiBEZXZpY2UgQ2FwYWJpbGl0aWVzIFJlZ2lzdGVyICovCi0jZGVmaW5lIERBVFROX0JVVFROX1BSU04JMHgxMDAwCi0jZGVmaW5lIERBVFROX0xFRF9QUlNOCQkweDIwMDAKLSNkZWZpbmUgRFBXUl9MRURfUFJTTgkJMHg0MDAwCi0KLS8qIEZpZWxkIGRlZmluaXRpb25zIGluIExpbmsgQ2FwYWJpbGl0aWVzIFJlZ2lzdGVyICovCi0jZGVmaW5lIE1BWF9MTktfU1BFRUQJCTB4MDAwRgotI2RlZmluZSBNQVhfTE5LX1dJRFRICQkweDAzRjAKLSNkZWZpbmUgTElOS19BQ1RJVkVfUkVQT1JUSU5HCTB4MDAxMDAwMDAKLQotLyogTGluayBXaWR0aCBFbmNvZGluZyAqLwotI2RlZmluZSBMTktfWDEJCTB4MDEKLSNkZWZpbmUgTE5LX1gyCQkweDAyCi0jZGVmaW5lIExOS19YNAkJMHgwNAotI2RlZmluZSBMTktfWDgJCTB4MDgKLSNkZWZpbmUgTE5LX1gxMgkJMHgwQwotI2RlZmluZSBMTktfWDE2CQkweDEwCi0jZGVmaW5lIExOS19YMzIJCTB4MjAKLQotLypGaWVsZCBkZWZpbml0aW9ucyBvZiBMaW5rIFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZSBMTktfU1BFRUQJMHgwMDBGCi0jZGVmaW5lIE5FR19MSU5LX1dECTB4MDNGMAotI2RlZmluZSBMTktfVFJOX0VSUgkweDA0MDAKLSNkZWZpbmUJTE5LX1RSTgkJMHgwODAwCi0jZGVmaW5lIFNMT1RfQ0xLX0NPTkYJMHgxMDAwCi0jZGVmaW5lIExJTktfQUNUSVZFCTB4MjAwMAotCi0vKiBGaWVsZCBkZWZpbml0aW9ucyBpbiBTbG90IENhcGFiaWxpdGllcyBSZWdpc3RlciAqLwotI2RlZmluZSBBVFROX0JVVFROX1BSU04JMHgwMDAwMDAwMQotI2RlZmluZQlQV1JfQ1RSTF9QUlNOCTB4MDAwMDAwMDIKLSNkZWZpbmUgTVJMX1NFTlNfUFJTTgkweDAwMDAwMDA0Ci0jZGVmaW5lIEFUVE5fTEVEX1BSU04JMHgwMDAwMDAwOAotI2RlZmluZSBQV1JfTEVEX1BSU04JMHgwMDAwMDAxMAotI2RlZmluZSBIUF9TVVBSX1JNX1NVUAkweDAwMDAwMDIwCi0jZGVmaW5lIEhQX0NBUAkJMHgwMDAwMDA0MAotI2RlZmluZSBTTE9UX1BXUl9WQUxVRQkweDAwMDAwM0Y4Ci0jZGVmaW5lIFNMT1RfUFdSX0xJTUlUCTB4MDAwMDBDMDAKLSNkZWZpbmUgUFNOCQkweEZGRjgwMDAwCS8qIFBTTjogUGh5c2ljYWwgU2xvdCBOdW1iZXIgKi8KLQotLyogRmllbGQgZGVmaW5pdGlvbnMgaW4gU2xvdCBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lIEFUVE5fQlVUVE5fRU5BQkxFCQkweDAwMDEKLSNkZWZpbmUgUFdSX0ZBVUxUX0RFVEVDVF9FTkFCTEUJCTB4MDAwMgotI2RlZmluZSBNUkxfREVURUNUX0VOQUJMRQkJMHgwMDA0Ci0jZGVmaW5lIFBSU05fREVURUNUX0VOQUJMRQkJMHgwMDA4Ci0jZGVmaW5lIENNRF9DTVBMX0lOVFJfRU5BQkxFCQkweDAwMTAKLSNkZWZpbmUgSFBfSU5UUl9FTkFCTEUJCQkweDAwMjAKLSNkZWZpbmUgQVRUTl9MRURfQ1RSTAkJCTB4MDBDMAotI2RlZmluZSBQV1JfTEVEX0NUUkwJCQkweDAzMDAKLSNkZWZpbmUgUFdSX0NUUkwJCQkweDA0MDAKLSNkZWZpbmUgRU1JX0NUUkwJCQkweDA4MDAKLQotLyogQXR0ZW50aW9uIGluZGljYXRvciBhbmQgUG93ZXIgaW5kaWNhdG9yIHN0YXRlcyAqLwotI2RlZmluZSBMRURfT04JCTB4MDEKLSNkZWZpbmUgTEVEX0JMSU5LCTB4MTAKLSNkZWZpbmUgTEVEX09GRgkJMHgxMQotCiAvKiBQb3dlciBDb250cm9sIENvbW1hbmQgKi8KICNkZWZpbmUgUE9XRVJfT04JMAotI2RlZmluZSBQT1dFUl9PRkYJMHgwNDAwCi0KLS8qIEVNSSBTdGF0dXMgZGVmaW5lcyAqLwotI2RlZmluZSBFTUlfRElTRU5HQUdFRAkwCi0jZGVmaW5lIEVNSV9FTkdBR0VECTEKLQotLyogRmllbGQgZGVmaW5pdGlvbnMgaW4gU2xvdCBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgQVRUTl9CVVRUTl9QUkVTU0VECTB4MDAwMQotI2RlZmluZSBQV1JfRkFVTFRfREVURUNURUQJMHgwMDAyCi0jZGVmaW5lIE1STF9TRU5TX0NIQU5HRUQJMHgwMDA0Ci0jZGVmaW5lIFBSU05fREVURUNUX0NIQU5HRUQJMHgwMDA4Ci0jZGVmaW5lIENNRF9DT01QTEVURUQJCTB4MDAxMAotI2RlZmluZSBNUkxfU1RBVEUJCTB4MDAyMAotI2RlZmluZSBQUlNOX1NUQVRFCQkweDAwNDAKLSNkZWZpbmUgRU1JX1NUQVRFCQkweDAwODAKLSNkZWZpbmUgRU1JX1NUQVRVU19CSVQJCTcKKyNkZWZpbmUgUE9XRVJfT0ZGCVBDSV9FWFBfU0xUQ1RMX1BDQwogCiBzdGF0aWMgaXJxcmV0dXJuX3QgcGNpZV9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKIHN0YXRpYyB2b2lkIHN0YXJ0X2ludF9wb2xsX3RpbWVyKHN0cnVjdCBjb250cm9sbGVyICpjdHJsLCBpbnQgc2VjKTsKQEAgLTI1MywyMiArMTMxLDIwIEBACiBzdGF0aWMgaW50IHBjaWVfcG9sbF9jbWQoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwpCiB7CiAJdTE2IHNsb3Rfc3RhdHVzOwotCWludCB0aW1lb3V0ID0gMTAwMDsKKwlpbnQgZXJyLCB0aW1lb3V0ID0gMTAwMDsKIAotCWlmICghcGNpZWhwX3JlYWR3KGN0cmwsIFNMT1RTVEFUVVMsICZzbG90X3N0YXR1cykpIHsKLQkJaWYgKHNsb3Rfc3RhdHVzICYgQ01EX0NPTVBMRVRFRCkgewotCQkJcGNpZWhwX3dyaXRldyhjdHJsLCBTTE9UU1RBVFVTLCBDTURfQ09NUExFVEVEKTsKLQkJCXJldHVybiAxOwotCQl9CisJZXJyID0gcGNpZWhwX3JlYWR3KGN0cmwsIFBDSV9FWFBfU0xUU1RBLCAmc2xvdF9zdGF0dXMpOworCWlmICghZXJyICYmIChzbG90X3N0YXR1cyAmIFBDSV9FWFBfU0xUU1RBX0NDKSkgeworCQlwY2llaHBfd3JpdGV3KGN0cmwsIFBDSV9FWFBfU0xUU1RBLCBQQ0lfRVhQX1NMVFNUQV9DQyk7CisJCXJldHVybiAxOwogCX0KIAl3aGlsZSAodGltZW91dCA+IDApIHsKIAkJbXNsZWVwKDEwKTsKIAkJdGltZW91dCAtPSAxMDsKLQkJaWYgKCFwY2llaHBfcmVhZHcoY3RybCwgU0xPVFNUQVRVUywgJnNsb3Rfc3RhdHVzKSkgewotCQkJaWYgKHNsb3Rfc3RhdHVzICYgQ01EX0NPTVBMRVRFRCkgewotCQkJCXBjaWVocF93cml0ZXcoY3RybCwgU0xPVFNUQVRVUywgQ01EX0NPTVBMRVRFRCk7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9CisJCWVyciA9IHBjaWVocF9yZWFkdyhjdHJsLCBQQ0lfRVhQX1NMVFNUQSwgJnNsb3Rfc3RhdHVzKTsKKwkJaWYgKCFlcnIgJiYgKHNsb3Rfc3RhdHVzICYgUENJX0VYUF9TTFRTVEFfQ0MpKSB7CisJCQlwY2llaHBfd3JpdGV3KGN0cmwsIFBDSV9FWFBfU0xUU1RBLCBQQ0lfRVhQX1NMVFNUQV9DQyk7CisJCQlyZXR1cm4gMTsKIAkJfQogCX0KIAlyZXR1cm4gMDsJLyogdGltZW91dCAqLwpAQCAtMzAyLDE0ICsxNzgsMTQgQEAKIAogCW11dGV4X2xvY2soJmN0cmwtPmN0cmxfbG9jayk7CiAKLQlyZXR2YWwgPSBwY2llaHBfcmVhZHcoY3RybCwgU0xPVFNUQVRVUywgJnNsb3Rfc3RhdHVzKTsKKwlyZXR2YWwgPSBwY2llaHBfcmVhZHcoY3RybCwgUENJX0VYUF9TTFRTVEEsICZzbG90X3N0YXR1cyk7CiAJaWYgKHJldHZhbCkgewogCQljdHJsX2VycihjdHJsLCAiJXM6IENhbm5vdCByZWFkIFNMT1RTVEFUVVMgcmVnaXN0ZXJcbiIsCiAJCQkgX19mdW5jX18pOwogCQlnb3RvIG91dDsKIAl9CiAKLQlpZiAoc2xvdF9zdGF0dXMgJiBDTURfQ09NUExFVEVEKSB7CisJaWYgKHNsb3Rfc3RhdHVzICYgUENJX0VYUF9TTFRTVEFfQ0MpIHsKIAkJaWYgKCFjdHJsLT5ub19jbWRfY29tcGxldGUpIHsKIAkJCS8qCiAJCQkgKiBBZnRlciAxIHNlYyBhbmQgQ01EX0NPTVBMRVRFRCBzdGlsbCBub3Qgc2V0LCBqdXN0CkBAIC0zMzIsNyArMjA4LDcgQEAKIAkJfQogCX0KIAotCXJldHZhbCA9IHBjaWVocF9yZWFkdyhjdHJsLCBTTE9UQ1RSTCwgJnNsb3RfY3RybCk7CisJcmV0dmFsID0gcGNpZWhwX3JlYWR3KGN0cmwsIFBDSV9FWFBfU0xUQ1RMLCAmc2xvdF9jdHJsKTsKIAlpZiAocmV0dmFsKSB7CiAJCWN0cmxfZXJyKGN0cmwsICIlczogQ2Fubm90IHJlYWQgU0xPVENUUkwgcmVnaXN0ZXJcbiIsIF9fZnVuY19fKTsKIAkJZ290byBvdXQ7CkBAIC0zNDIsNyArMjE4LDcgQEAKIAlzbG90X2N0cmwgfD0gKGNtZCAmIG1hc2spOwogCWN0cmwtPmNtZF9idXN5ID0gMTsKIAlzbXBfbWIoKTsKLQlyZXR2YWwgPSBwY2llaHBfd3JpdGV3KGN0cmwsIFNMT1RDVFJMLCBzbG90X2N0cmwpOworCXJldHZhbCA9IHBjaWVocF93cml0ZXcoY3RybCwgUENJX0VYUF9TTFRDVEwsIHNsb3RfY3RybCk7CiAJaWYgKHJldHZhbCkKIAkJY3RybF9lcnIoY3RybCwgIkNhbm5vdCB3cml0ZSB0byBTTE9UQ1RSTCByZWdpc3RlclxuIik7CiAKQEAgLTM1Niw4ICsyMzIsOCBAQAogCQkgKiBjb21wbGV0ZWQgaW50ZXJydXB0IGlzIG5vdCBlbmFibGVkLCB3ZSBuZWVkIHRvIHBvbGwKIAkJICogY29tbWFuZCBjb21wbGV0ZWQgZXZlbnQuCiAJCSAqLwotCQlpZiAoIShzbG90X2N0cmwgJiBIUF9JTlRSX0VOQUJMRSkgfHwKLQkJICAgICEoc2xvdF9jdHJsICYgQ01EX0NNUExfSU5UUl9FTkFCTEUpKQorCQlpZiAoIShzbG90X2N0cmwgJiBQQ0lfRVhQX1NMVENUTF9IUElFKSB8fAorCQkgICAgIShzbG90X2N0cmwgJiBQQ0lfRVhQX1NMVENUTF9DQ0lFKSkKIAkJCXBvbGwgPSAxOwogICAgICAgICAgICAgICAgIHBjaWVfd2FpdF9jbWQoY3RybCwgcG9sbCk7CiAJfQpAQCAtMzcwLDkgKzI0Niw5IEBACiB7CiAJdTE2IGxpbmtfc3RhdHVzOwogCi0JaWYgKHBjaWVocF9yZWFkdyhjdHJsLCBMTktTVEFUVVMsICZsaW5rX3N0YXR1cykpCisJaWYgKHBjaWVocF9yZWFkdyhjdHJsLCBQQ0lfRVhQX0xOS1NUQSwgJmxpbmtfc3RhdHVzKSkKIAkJcmV0dXJuIDA7Ci0JcmV0dXJuICEhKGxpbmtfc3RhdHVzICYgTElOS19BQ1RJVkUpOworCXJldHVybiAhIShsaW5rX3N0YXR1cyAmIFBDSV9FWFBfTE5LU1RBX0RMTExBKTsKIH0KIAogc3RhdGljIHZvaWQgcGNpZV93YWl0X2xpbmtfYWN0aXZlKHN0cnVjdCBjb250cm9sbGVyICpjdHJsKQpAQCAtNDEyLDE1ICsyODgsMTUgQEAKICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgbXNsZWVwKDEwMDApOwogCi0JcmV0dmFsID0gcGNpZWhwX3JlYWR3KGN0cmwsIExOS1NUQVRVUywgJmxua19zdGF0dXMpOworCXJldHZhbCA9IHBjaWVocF9yZWFkdyhjdHJsLCBQQ0lfRVhQX0xOS1NUQSwgJmxua19zdGF0dXMpOwogCWlmIChyZXR2YWwpIHsKIAkJY3RybF9lcnIoY3RybCwgIkNhbm5vdCByZWFkIExOS1NUQVRVUyByZWdpc3RlclxuIik7CiAJCXJldHVybiByZXR2YWw7CiAJfQogCiAJY3RybF9kYmcoY3RybCwgIiVzOiBsbmtfc3RhdHVzID0gJXhcbiIsIF9fZnVuY19fLCBsbmtfc3RhdHVzKTsKLQlpZiAoIChsbmtfc3RhdHVzICYgTE5LX1RSTikgfHwgKGxua19zdGF0dXMgJiBMTktfVFJOX0VSUikgfHwKLQkJIShsbmtfc3RhdHVzICYgTkVHX0xJTktfV0QpKSB7CisJaWYgKChsbmtfc3RhdHVzICYgUENJX0VYUF9MTktTVEFfTFQpIHx8CisJICAgICEobG5rX3N0YXR1cyAmIFBDSV9FWFBfTE5LU1RBX05MVykpIHsKIAkJY3RybF9lcnIoY3RybCwgIkxpbmsgVHJhaW5pbmcgRXJyb3Igb2NjdXJzIFxuIik7CiAJCXJldHZhbCA9IC0xOwogCQlyZXR1cm4gcmV0dmFsOwpAQCAtNDM2LDE2ICszMTIsMTYgQEAKIAl1OCBhdHRlbl9sZWRfc3RhdGU7CiAJaW50IHJldHZhbCA9IDA7CiAKLQlyZXR2YWwgPSBwY2llaHBfcmVhZHcoY3RybCwgU0xPVENUUkwsICZzbG90X2N0cmwpOworCXJldHZhbCA9IHBjaWVocF9yZWFkdyhjdHJsLCBQQ0lfRVhQX1NMVENUTCwgJnNsb3RfY3RybCk7CiAJaWYgKHJldHZhbCkgewogCQljdHJsX2VycihjdHJsLCAiJXM6IENhbm5vdCByZWFkIFNMT1RDVFJMIHJlZ2lzdGVyXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiByZXR2YWw7CiAJfQogCiAJY3RybF9kYmcoY3RybCwgIiVzOiBTTE9UQ1RSTCAleCwgdmFsdWUgcmVhZCAleFxuIiwKLQkJIF9fZnVuY19fLCBjdHJsLT5jYXBfYmFzZSArIFNMT1RDVFJMLCBzbG90X2N0cmwpOworCQkgX19mdW5jX18sIGN0cmwtPmNhcF9iYXNlICsgUENJX0VYUF9TTFRDVEwsIHNsb3RfY3RybCk7CiAKLQlhdHRlbl9sZWRfc3RhdGUgPSAoc2xvdF9jdHJsICYgQVRUTl9MRURfQ1RSTCkgPj4gNjsKKwlhdHRlbl9sZWRfc3RhdGUgPSAoc2xvdF9jdHJsICYgUENJX0VYUF9TTFRDVExfQUlDKSA+PiA2OwogCiAJc3dpdGNoIChhdHRlbl9sZWRfc3RhdGUpIHsKIAljYXNlIDA6CkBAIC00NzUsMTUgKzM1MSwxNSBAQAogCXU4IHB3cl9zdGF0ZTsKIAlpbnQJcmV0dmFsID0gMDsKIAotCXJldHZhbCA9IHBjaWVocF9yZWFkdyhjdHJsLCBTTE9UQ1RSTCwgJnNsb3RfY3RybCk7CisJcmV0dmFsID0gcGNpZWhwX3JlYWR3KGN0cmwsIFBDSV9FWFBfU0xUQ1RMLCAmc2xvdF9jdHJsKTsKIAlpZiAocmV0dmFsKSB7CiAJCWN0cmxfZXJyKGN0cmwsICIlczogQ2Fubm90IHJlYWQgU0xPVENUUkwgcmVnaXN0ZXJcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAJY3RybF9kYmcoY3RybCwgIiVzOiBTTE9UQ1RSTCAleCB2YWx1ZSByZWFkICV4XG4iLAotCQkgX19mdW5jX18sIGN0cmwtPmNhcF9iYXNlICsgU0xPVENUUkwsIHNsb3RfY3RybCk7CisJCSBfX2Z1bmNfXywgY3RybC0+Y2FwX2Jhc2UgKyBQQ0lfRVhQX1NMVENUTCwgc2xvdF9jdHJsKTsKIAotCXB3cl9zdGF0ZSA9IChzbG90X2N0cmwgJiBQV1JfQ1RSTCkgPj4gMTA7CisJcHdyX3N0YXRlID0gKHNsb3RfY3RybCAmIFBDSV9FWFBfU0xUQ1RMX1BDQykgPj4gMTA7CiAKIAlzd2l0Y2ggKHB3cl9zdGF0ZSkgewogCWNhc2UgMDoKQEAgLTUwNCwxNyArMzgwLDE1IEBACiB7CiAJc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwgPSBzbG90LT5jdHJsOwogCXUxNiBzbG90X3N0YXR1czsKLQlpbnQgcmV0dmFsID0gMDsKKwlpbnQgcmV0dmFsOwogCi0JcmV0dmFsID0gcGNpZWhwX3JlYWR3KGN0cmwsIFNMT1RTVEFUVVMsICZzbG90X3N0YXR1cyk7CisJcmV0dmFsID0gcGNpZWhwX3JlYWR3KGN0cmwsIFBDSV9FWFBfU0xUU1RBLCAmc2xvdF9zdGF0dXMpOwogCWlmIChyZXR2YWwpIHsKIAkJY3RybF9lcnIoY3RybCwgIiVzOiBDYW5ub3QgcmVhZCBTTE9UU1RBVFVTIHJlZ2lzdGVyXG4iLAogCQkJIF9fZnVuY19fKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9Ci0KLQkqc3RhdHVzID0gKCgoc2xvdF9zdGF0dXMgJiBNUkxfU1RBVEUpID4+IDUpID09IDApID8gMCA6IDE7Ci0KKwkqc3RhdHVzID0gISEoc2xvdF9zdGF0dXMgJiBQQ0lfRVhQX1NMVFNUQV9NUkxTUyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTUyMiwxOCArMzk2LDE1IEBACiB7CiAJc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwgPSBzbG90LT5jdHJsOwogCXUxNiBzbG90X3N0YXR1czsKLQl1OCBjYXJkX3N0YXRlOwotCWludCByZXR2YWwgPSAwOworCWludCByZXR2YWw7CiAKLQlyZXR2YWwgPSBwY2llaHBfcmVhZHcoY3RybCwgU0xPVFNUQVRVUywgJnNsb3Rfc3RhdHVzKTsKKwlyZXR2YWwgPSBwY2llaHBfcmVhZHcoY3RybCwgUENJX0VYUF9TTFRTVEEsICZzbG90X3N0YXR1cyk7CiAJaWYgKHJldHZhbCkgewogCQljdHJsX2VycihjdHJsLCAiJXM6IENhbm5vdCByZWFkIFNMT1RTVEFUVVMgcmVnaXN0ZXJcbiIsCiAJCQkgX19mdW5jX18pOwogCQlyZXR1cm4gcmV0dmFsOwogCX0KLQljYXJkX3N0YXRlID0gKHU4KSgoc2xvdF9zdGF0dXMgJiBQUlNOX1NUQVRFKSA+PiA2KTsKLQkqc3RhdHVzID0gKGNhcmRfc3RhdGUgPT0gMSkgPyAxIDogMDsKLQorCSpzdGF0dXMgPSAhIShzbG90X3N0YXR1cyAmIFBDSV9FWFBfU0xUU1RBX1BEUyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU0MSwzMiArNDEyLDI4IEBACiB7CiAJc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwgPSBzbG90LT5jdHJsOwogCXUxNiBzbG90X3N0YXR1czsKLQl1OCBwd3JfZmF1bHQ7Ci0JaW50IHJldHZhbCA9IDA7CisJaW50IHJldHZhbDsKIAotCXJldHZhbCA9IHBjaWVocF9yZWFkdyhjdHJsLCBTTE9UU1RBVFVTLCAmc2xvdF9zdGF0dXMpOworCXJldHZhbCA9IHBjaWVocF9yZWFkdyhjdHJsLCBQQ0lfRVhQX1NMVFNUQSwgJnNsb3Rfc3RhdHVzKTsKIAlpZiAocmV0dmFsKSB7CiAJCWN0cmxfZXJyKGN0cmwsICJDYW5ub3QgY2hlY2sgZm9yIHBvd2VyIGZhdWx0XG4iKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9Ci0JcHdyX2ZhdWx0ID0gKHU4KSgoc2xvdF9zdGF0dXMgJiBQV1JfRkFVTFRfREVURUNURUQpID4+IDEpOwotCi0JcmV0dXJuIHB3cl9mYXVsdDsKKwlyZXR1cm4gISEoc2xvdF9zdGF0dXMgJiBQQ0lfRVhQX1NMVFNUQV9QRkQpOwogfQogCiBzdGF0aWMgaW50IGhwY19nZXRfZW1pX3N0YXR1cyhzdHJ1Y3Qgc2xvdCAqc2xvdCwgdTggKnN0YXR1cykKIHsKIAlzdHJ1Y3QgY29udHJvbGxlciAqY3RybCA9IHNsb3QtPmN0cmw7CiAJdTE2IHNsb3Rfc3RhdHVzOwotCWludCByZXR2YWwgPSAwOworCWludCByZXR2YWw7CiAKLQlyZXR2YWwgPSBwY2llaHBfcmVhZHcoY3RybCwgU0xPVFNUQVRVUywgJnNsb3Rfc3RhdHVzKTsKKwlyZXR2YWwgPSBwY2llaHBfcmVhZHcoY3RybCwgUENJX0VYUF9TTFRTVEEsICZzbG90X3N0YXR1cyk7CiAJaWYgKHJldHZhbCkgewogCQljdHJsX2VycihjdHJsLCAiQ2Fubm90IGNoZWNrIEVNSSBzdGF0dXNcbiIpOwogCQlyZXR1cm4gcmV0dmFsOwogCX0KLQkqc3RhdHVzID0gKHNsb3Rfc3RhdHVzICYgRU1JX1NUQVRFKSA+PiBFTUlfU1RBVFVTX0JJVDsKLQorCSpzdGF0dXMgPSAhIShzbG90X3N0YXR1cyAmIFBDSV9FWFBfU0xUU1RBX0VJUyk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtNTc2LDggKzQ0Myw4IEBACiAJdTE2IGNtZF9tYXNrOwogCWludCByYzsKIAotCXNsb3RfY21kID0gRU1JX0NUUkw7Ci0JY21kX21hc2sgPSBFTUlfQ1RSTDsKKwlzbG90X2NtZCA9IFBDSV9FWFBfU0xUQ1RMX0VJQzsKKwljbWRfbWFzayA9IFBDSV9FWFBfU0xUQ1RMX0VJQzsKIAlyYyA9IHBjaWVfd3JpdGVfY21kKHNsb3QtPmN0cmwsIHNsb3RfY21kLCBjbWRfbWFzayk7CiAJc2xvdC0+bGFzdF9lbWlfdG9nZ2xlID0gZ2V0X3NlY29uZHMoKTsKIApAQCAtNTkxLDcgKzQ1OCw3IEBACiAJdTE2IGNtZF9tYXNrOwogCWludCByYzsKIAotCWNtZF9tYXNrID0gQVRUTl9MRURfQ1RSTDsKKwljbWRfbWFzayA9IFBDSV9FWFBfU0xUQ1RMX0FJQzsKIAlzd2l0Y2ggKHZhbHVlKSB7CiAJCWNhc2UgMCA6CS8qIHR1cm4gb2ZmICovCiAJCQlzbG90X2NtZCA9IDB4MDBDMDsKQEAgLTYwNyw3ICs0NzQsNyBAQAogCX0KIAlyYyA9IHBjaWVfd3JpdGVfY21kKGN0cmwsIHNsb3RfY21kLCBjbWRfbWFzayk7CiAJY3RybF9kYmcoY3RybCwgIiVzOiBTTE9UQ1RSTCAleCB3cml0ZSBjbWQgJXhcbiIsCi0JCSBfX2Z1bmNfXywgY3RybC0+Y2FwX2Jhc2UgKyBTTE9UQ1RSTCwgc2xvdF9jbWQpOworCQkgX19mdW5jX18sIGN0cmwtPmNhcF9iYXNlICsgUENJX0VYUF9TTFRDVEwsIHNsb3RfY21kKTsKIAogCXJldHVybiByYzsKIH0KQEAgLTYxOSwxMCArNDg2LDEwIEBACiAJdTE2IGNtZF9tYXNrOwogCiAJc2xvdF9jbWQgPSAweDAxMDA7Ci0JY21kX21hc2sgPSBQV1JfTEVEX0NUUkw7CisJY21kX21hc2sgPSBQQ0lfRVhQX1NMVENUTF9QSUM7CiAJcGNpZV93cml0ZV9jbWQoY3RybCwgc2xvdF9jbWQsIGNtZF9tYXNrKTsKIAljdHJsX2RiZyhjdHJsLCAiJXM6IFNMT1RDVFJMICV4IHdyaXRlIGNtZCAleFxuIiwKLQkJIF9fZnVuY19fLCBjdHJsLT5jYXBfYmFzZSArIFNMT1RDVFJMLCBzbG90X2NtZCk7CisJCSBfX2Z1bmNfXywgY3RybC0+Y2FwX2Jhc2UgKyBQQ0lfRVhQX1NMVENUTCwgc2xvdF9jbWQpOwogfQogCiBzdGF0aWMgdm9pZCBocGNfc2V0X2dyZWVuX2xlZF9vZmYoc3RydWN0IHNsb3QgKnNsb3QpCkBAIC02MzIsMTAgKzQ5OSwxMCBAQAogCXUxNiBjbWRfbWFzazsKIAogCXNsb3RfY21kID0gMHgwMzAwOwotCWNtZF9tYXNrID0gUFdSX0xFRF9DVFJMOworCWNtZF9tYXNrID0gUENJX0VYUF9TTFRDVExfUElDOwogCXBjaWVfd3JpdGVfY21kKGN0cmwsIHNsb3RfY21kLCBjbWRfbWFzayk7CiAJY3RybF9kYmcoY3RybCwgIiVzOiBTTE9UQ1RSTCAleCB3cml0ZSBjbWQgJXhcbiIsCi0JCSBfX2Z1bmNfXywgY3RybC0+Y2FwX2Jhc2UgKyBTTE9UQ1RSTCwgc2xvdF9jbWQpOworCQkgX19mdW5jX18sIGN0cmwtPmNhcF9iYXNlICsgUENJX0VYUF9TTFRDVEwsIHNsb3RfY21kKTsKIH0KIAogc3RhdGljIHZvaWQgaHBjX3NldF9ncmVlbl9sZWRfYmxpbmsoc3RydWN0IHNsb3QgKnNsb3QpCkBAIC02NDUsMTAgKzUxMiwxMCBAQAogCXUxNiBjbWRfbWFzazsKIAogCXNsb3RfY21kID0gMHgwMjAwOwotCWNtZF9tYXNrID0gUFdSX0xFRF9DVFJMOworCWNtZF9tYXNrID0gUENJX0VYUF9TTFRDVExfUElDOwogCXBjaWVfd3JpdGVfY21kKGN0cmwsIHNsb3RfY21kLCBjbWRfbWFzayk7CiAJY3RybF9kYmcoY3RybCwgIiVzOiBTTE9UQ1RSTCAleCB3cml0ZSBjbWQgJXhcbiIsCi0JCSBfX2Z1bmNfXywgY3RybC0+Y2FwX2Jhc2UgKyBTTE9UQ1RSTCwgc2xvdF9jbWQpOworCQkgX19mdW5jX18sIGN0cmwtPmNhcF9iYXNlICsgUENJX0VYUF9TTFRDVEwsIHNsb3RfY21kKTsKIH0KIAogc3RhdGljIGludCBocGNfcG93ZXJfb25fc2xvdChzdHJ1Y3Qgc2xvdCAqIHNsb3QpCkBAIC02NjIsMTUgKzUyOSwxNSBAQAogCWN0cmxfZGJnKGN0cmwsICIlczogc2xvdC0+aHBfc2xvdCAleFxuIiwgX19mdW5jX18sIHNsb3QtPmhwX3Nsb3QpOwogCiAJLyogQ2xlYXIgc3RpY2t5IHBvd2VyLWZhdWx0IGJpdCBmcm9tIHByZXZpb3VzIHBvd2VyIGZhaWx1cmVzICovCi0JcmV0dmFsID0gcGNpZWhwX3JlYWR3KGN0cmwsIFNMT1RTVEFUVVMsICZzbG90X3N0YXR1cyk7CisJcmV0dmFsID0gcGNpZWhwX3JlYWR3KGN0cmwsIFBDSV9FWFBfU0xUU1RBLCAmc2xvdF9zdGF0dXMpOwogCWlmIChyZXR2YWwpIHsKIAkJY3RybF9lcnIoY3RybCwgIiVzOiBDYW5ub3QgcmVhZCBTTE9UU1RBVFVTIHJlZ2lzdGVyXG4iLAogCQkJIF9fZnVuY19fKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9Ci0Jc2xvdF9zdGF0dXMgJj0gUFdSX0ZBVUxUX0RFVEVDVEVEOworCXNsb3Rfc3RhdHVzICY9IFBDSV9FWFBfU0xUU1RBX1BGRDsKIAlpZiAoc2xvdF9zdGF0dXMpIHsKLQkJcmV0dmFsID0gcGNpZWhwX3dyaXRldyhjdHJsLCBTTE9UU1RBVFVTLCBzbG90X3N0YXR1cyk7CisJCXJldHZhbCA9IHBjaWVocF93cml0ZXcoY3RybCwgUENJX0VYUF9TTFRTVEEsIHNsb3Rfc3RhdHVzKTsKIAkJaWYgKHJldHZhbCkgewogCQkJY3RybF9lcnIoY3RybCwKIAkJCQkgIiVzOiBDYW5ub3Qgd3JpdGUgdG8gU0xPVFNUQVRVUyByZWdpc3RlclxuIiwKQEAgLTY4MCwxMyArNTQ3LDEzIEBACiAJfQogCiAJc2xvdF9jbWQgPSBQT1dFUl9PTjsKLQljbWRfbWFzayA9IFBXUl9DVFJMOworCWNtZF9tYXNrID0gUENJX0VYUF9TTFRDVExfUENDOwogCS8qIEVuYWJsZSBkZXRlY3Rpb24gdGhhdCB3ZSB0dXJuZWQgb2ZmIGF0IHNsb3QgcG93ZXItb2ZmIHRpbWUgKi8KIAlpZiAoIXBjaWVocF9wb2xsX21vZGUpIHsKLQkJc2xvdF9jbWQgfD0gKFBXUl9GQVVMVF9ERVRFQ1RfRU5BQkxFIHwgTVJMX0RFVEVDVF9FTkFCTEUgfAotCQkJICAgICBQUlNOX0RFVEVDVF9FTkFCTEUpOwotCQljbWRfbWFzayB8PSAoUFdSX0ZBVUxUX0RFVEVDVF9FTkFCTEUgfCBNUkxfREVURUNUX0VOQUJMRSB8Ci0JCQkgICAgIFBSU05fREVURUNUX0VOQUJMRSk7CisJCXNsb3RfY21kIHw9IChQQ0lfRVhQX1NMVENUTF9QRkRFIHwgUENJX0VYUF9TTFRDVExfTVJMU0NFIHwKKwkJCSAgICAgUENJX0VYUF9TTFRDVExfUERDRSk7CisJCWNtZF9tYXNrIHw9IChQQ0lfRVhQX1NMVENUTF9QRkRFIHwgUENJX0VYUF9TTFRDVExfTVJMU0NFIHwKKwkJCSAgICAgUENJX0VYUF9TTFRDVExfUERDRSk7CiAJfQogCiAJcmV0dmFsID0gcGNpZV93cml0ZV9jbWQoY3RybCwgc2xvdF9jbWQsIGNtZF9tYXNrKTsKQEAgLTY5Niw3ICs1NjMsNyBAQAogCQlyZXR1cm4gLTE7CiAJfQogCWN0cmxfZGJnKGN0cmwsICIlczogU0xPVENUUkwgJXggd3JpdGUgY21kICV4XG4iLAotCQkgX19mdW5jX18sIGN0cmwtPmNhcF9iYXNlICsgU0xPVENUUkwsIHNsb3RfY21kKTsKKwkJIF9fZnVuY19fLCBjdHJsLT5jYXBfYmFzZSArIFBDSV9FWFBfU0xUQ1RMLCBzbG90X2NtZCk7CiAKIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtNzUzLDcgKzYyMCw3IEBACiAJY2hhbmdlZCA9IHBjaWVfbWFza19iYWRfZGxscChjdHJsKTsKIAogCXNsb3RfY21kID0gUE9XRVJfT0ZGOwotCWNtZF9tYXNrID0gUFdSX0NUUkw7CisJY21kX21hc2sgPSBQQ0lfRVhQX1NMVENUTF9QQ0M7CiAJLyoKIAkgKiBJZiB3ZSBnZXQgTVJMIG9yIHByZXNlbmNlIGRldGVjdCBpbnRlcnJ1cHRzIG5vdywgdGhlIGlzcgogCSAqIHdpbGwgbm90aWNlIHRoZSBzdGlja3kgcG93ZXItZmF1bHQgYml0IHRvbyBhbmQgaXNzdWUgcG93ZXIKQEAgLTc2MiwxMCArNjI5LDEwIEBACiAJICogdGlsbCB0aGUgc2xvdCBpcyBwb3dlcmVkIG9uIGFnYWluLgogCSAqLwogCWlmICghcGNpZWhwX3BvbGxfbW9kZSkgewotCQlzbG90X2NtZCAmPSB+KFBXUl9GQVVMVF9ERVRFQ1RfRU5BQkxFIHwgTVJMX0RFVEVDVF9FTkFCTEUgfAotCQkJICAgICAgUFJTTl9ERVRFQ1RfRU5BQkxFKTsKLQkJY21kX21hc2sgfD0gKFBXUl9GQVVMVF9ERVRFQ1RfRU5BQkxFIHwgTVJMX0RFVEVDVF9FTkFCTEUgfAotCQkJICAgICBQUlNOX0RFVEVDVF9FTkFCTEUpOworCQlzbG90X2NtZCAmPSB+KFBDSV9FWFBfU0xUQ1RMX1BGREUgfCBQQ0lfRVhQX1NMVENUTF9NUkxTQ0UgfAorCQkJICAgICAgUENJX0VYUF9TTFRDVExfUERDRSk7CisJCWNtZF9tYXNrIHw9IChQQ0lfRVhQX1NMVENUTF9QRkRFIHwgUENJX0VYUF9TTFRDVExfTVJMU0NFIHwKKwkJCSAgICAgUENJX0VYUF9TTFRDVExfUERDRSk7CiAJfQogCiAJcmV0dmFsID0gcGNpZV93cml0ZV9jbWQoY3RybCwgc2xvdF9jbWQsIGNtZF9tYXNrKTsKQEAgLTc3NSw3ICs2NDIsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAJY3RybF9kYmcoY3RybCwgIiVzOiBTTE9UQ1RSTCAleCB3cml0ZSBjbWQgJXhcbiIsCi0JCSBfX2Z1bmNfXywgY3RybC0+Y2FwX2Jhc2UgKyBTTE9UQ1RSTCwgc2xvdF9jbWQpOworCQkgX19mdW5jX18sIGN0cmwtPmNhcF9iYXNlICsgUENJX0VYUF9TTFRDVEwsIHNsb3RfY21kKTsKICBvdXQ6CiAJaWYgKGNoYW5nZWQpCiAJCXBjaWVfdW5tYXNrX2JhZF9kbGxwKGN0cmwpOwpAQCAtNzk2LDE5ICs2NjMsMTkgQEAKIAkgKi8KIAlpbnRyX2xvYyA9IDA7CiAJZG8gewotCQlpZiAocGNpZWhwX3JlYWR3KGN0cmwsIFNMT1RTVEFUVVMsICZkZXRlY3RlZCkpIHsKKwkJaWYgKHBjaWVocF9yZWFkdyhjdHJsLCBQQ0lfRVhQX1NMVFNUQSwgJmRldGVjdGVkKSkgewogCQkJY3RybF9lcnIoY3RybCwgIiVzOiBDYW5ub3QgcmVhZCBTTE9UU1RBVFVTXG4iLAogCQkJCSBfX2Z1bmNfXyk7CiAJCQlyZXR1cm4gSVJRX05PTkU7CiAJCX0KIAotCQlkZXRlY3RlZCAmPSAoQVRUTl9CVVRUTl9QUkVTU0VEIHwgUFdSX0ZBVUxUX0RFVEVDVEVEIHwKLQkJCSAgICAgTVJMX1NFTlNfQ0hBTkdFRCB8IFBSU05fREVURUNUX0NIQU5HRUQgfAotCQkJICAgICBDTURfQ09NUExFVEVEKTsKKwkJZGV0ZWN0ZWQgJj0gKFBDSV9FWFBfU0xUU1RBX0FCUCB8IFBDSV9FWFBfU0xUU1RBX1BGRCB8CisJCQkgICAgIFBDSV9FWFBfU0xUU1RBX01STFNDIHwgUENJX0VYUF9TTFRTVEFfUERDIHwKKwkJCSAgICAgUENJX0VYUF9TTFRTVEFfQ0MpOwogCQlpbnRyX2xvYyB8PSBkZXRlY3RlZDsKIAkJaWYgKCFpbnRyX2xvYykKIAkJCXJldHVybiBJUlFfTk9ORTsKLQkJaWYgKGRldGVjdGVkICYmIHBjaWVocF93cml0ZXcoY3RybCwgU0xPVFNUQVRVUywgZGV0ZWN0ZWQpKSB7CisJCWlmIChkZXRlY3RlZCAmJiBwY2llaHBfd3JpdGV3KGN0cmwsIFBDSV9FWFBfU0xUU1RBLCBkZXRlY3RlZCkpIHsKIAkJCWN0cmxfZXJyKGN0cmwsICIlczogQ2Fubm90IHdyaXRlIHRvIFNMT1RTVEFUVVNcbiIsCiAJCQkJIF9fZnVuY19fKTsKIAkJCXJldHVybiBJUlFfTk9ORTsKQEAgLTgxOCwzMSArNjg1LDMxIEBACiAJY3RybF9kYmcoY3RybCwgIiVzOiBpbnRyX2xvYyAleFxuIiwgX19mdW5jX18sIGludHJfbG9jKTsKIAogCS8qIENoZWNrIENvbW1hbmQgQ29tcGxldGUgSW50ZXJydXB0IFBlbmRpbmcgKi8KLQlpZiAoaW50cl9sb2MgJiBDTURfQ09NUExFVEVEKSB7CisJaWYgKGludHJfbG9jICYgUENJX0VYUF9TTFRTVEFfQ0MpIHsKIAkJY3RybC0+Y21kX2J1c3kgPSAwOwogCQlzbXBfbWIoKTsKIAkJd2FrZV91cCgmY3RybC0+cXVldWUpOwogCX0KIAotCWlmICghKGludHJfbG9jICYgfkNNRF9DT01QTEVURUQpKQorCWlmICghKGludHJfbG9jICYgflBDSV9FWFBfU0xUU1RBX0NDKSkKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCiAJcF9zbG90ID0gcGNpZWhwX2ZpbmRfc2xvdChjdHJsLCBjdHJsLT5zbG90X2RldmljZV9vZmZzZXQpOwogCiAJLyogQ2hlY2sgTVJMIFNlbnNvciBDaGFuZ2VkICovCi0JaWYgKGludHJfbG9jICYgTVJMX1NFTlNfQ0hBTkdFRCkKKwlpZiAoaW50cl9sb2MgJiBQQ0lfRVhQX1NMVFNUQV9NUkxTQykKIAkJcGNpZWhwX2hhbmRsZV9zd2l0Y2hfY2hhbmdlKHBfc2xvdCk7CiAKIAkvKiBDaGVjayBBdHRlbnRpb24gQnV0dG9uIFByZXNzZWQgKi8KLQlpZiAoaW50cl9sb2MgJiBBVFROX0JVVFROX1BSRVNTRUQpCisJaWYgKGludHJfbG9jICYgUENJX0VYUF9TTFRTVEFfQUJQKQogCQlwY2llaHBfaGFuZGxlX2F0dGVudGlvbl9idXR0b24ocF9zbG90KTsKIAogCS8qIENoZWNrIFByZXNlbmNlIERldGVjdCBDaGFuZ2VkICovCi0JaWYgKGludHJfbG9jICYgUFJTTl9ERVRFQ1RfQ0hBTkdFRCkKKwlpZiAoaW50cl9sb2MgJiBQQ0lfRVhQX1NMVFNUQV9QREMpCiAJCXBjaWVocF9oYW5kbGVfcHJlc2VuY2VfY2hhbmdlKHBfc2xvdCk7CiAKIAkvKiBDaGVjayBQb3dlciBGYXVsdCBEZXRlY3RlZCAqLwotCWlmIChpbnRyX2xvYyAmIFBXUl9GQVVMVF9ERVRFQ1RFRCkKKwlpZiAoaW50cl9sb2MgJiBQQ0lfRVhQX1NMVFNUQV9QRkQpCiAJCXBjaWVocF9oYW5kbGVfcG93ZXJfZmF1bHQocF9zbG90KTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKQEAgLTg1NSw3ICs3MjIsNyBAQAogCXUzMglsbmtfY2FwOwogCWludCByZXR2YWwgPSAwOwogCi0JcmV0dmFsID0gcGNpZWhwX3JlYWRsKGN0cmwsIExOS0NBUCwgJmxua19jYXApOworCXJldHZhbCA9IHBjaWVocF9yZWFkbChjdHJsLCBQQ0lfRVhQX0xOS0NBUCwgJmxua19jYXApOwogCWlmIChyZXR2YWwpIHsKIAkJY3RybF9lcnIoY3RybCwgIiVzOiBDYW5ub3QgcmVhZCBMTktDQVAgcmVnaXN0ZXJcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIHJldHZhbDsKQEAgLTg4NCwxMyArNzUxLDEzIEBACiAJdTMyCWxua19jYXA7CiAJaW50IHJldHZhbCA9IDA7CiAKLQlyZXR2YWwgPSBwY2llaHBfcmVhZGwoY3RybCwgTE5LQ0FQLCAmbG5rX2NhcCk7CisJcmV0dmFsID0gcGNpZWhwX3JlYWRsKGN0cmwsIFBDSV9FWFBfTE5LQ0FQLCAmbG5rX2NhcCk7CiAJaWYgKHJldHZhbCkgewogCQljdHJsX2VycihjdHJsLCAiJXM6IENhbm5vdCByZWFkIExOS0NBUCByZWdpc3RlclxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gcmV0dmFsOwogCX0KIAotCXN3aXRjaCAoKGxua19jYXAgJiAweDAzRjApID4+IDQpeworCXN3aXRjaCAoKGxua19jYXAgJiBQQ0lfRVhQX0xOS1NUQV9OTFcpID4+IDQpewogCWNhc2UgMDoKIAkJbG5rX3dkdGggPSBQQ0lFX0xOS19XSURUSF9SRVNSVjsKIAkJYnJlYWs7CkBAIC05MzMsMTQgKzgwMCwxNCBAQAogCWludCByZXR2YWwgPSAwOwogCXUxNiBsbmtfc3RhdHVzOwogCi0JcmV0dmFsID0gcGNpZWhwX3JlYWR3KGN0cmwsIExOS1NUQVRVUywgJmxua19zdGF0dXMpOworCXJldHZhbCA9IHBjaWVocF9yZWFkdyhjdHJsLCBQQ0lfRVhQX0xOS1NUQSwgJmxua19zdGF0dXMpOwogCWlmIChyZXR2YWwpIHsKIAkJY3RybF9lcnIoY3RybCwgIiVzOiBDYW5ub3QgcmVhZCBMTktTVEFUVVMgcmVnaXN0ZXJcbiIsCiAJCQkgX19mdW5jX18pOwogCQlyZXR1cm4gcmV0dmFsOwogCX0KIAotCXN3aXRjaCAobG5rX3N0YXR1cyAmIDB4MEYpIHsKKwlzd2l0Y2ggKGxua19zdGF0dXMgJiBQQ0lfRVhQX0xOS1NUQV9DTFMpIHsKIAljYXNlIDE6CiAJCWxua19zcGVlZCA9IFBDSUVfMlBUNUdCOwogCQlicmVhazsKQEAgLTk2MywxNCArODMwLDE0IEBACiAJaW50IHJldHZhbCA9IDA7CiAJdTE2IGxua19zdGF0dXM7CiAKLQlyZXR2YWwgPSBwY2llaHBfcmVhZHcoY3RybCwgTE5LU1RBVFVTLCAmbG5rX3N0YXR1cyk7CisJcmV0dmFsID0gcGNpZWhwX3JlYWR3KGN0cmwsIFBDSV9FWFBfTE5LU1RBLCAmbG5rX3N0YXR1cyk7CiAJaWYgKHJldHZhbCkgewogCQljdHJsX2VycihjdHJsLCAiJXM6IENhbm5vdCByZWFkIExOS1NUQVRVUyByZWdpc3RlclxuIiwKIAkJCSBfX2Z1bmNfXyk7CiAJCXJldHVybiByZXR2YWw7CiAJfQogCi0Jc3dpdGNoICgobG5rX3N0YXR1cyAmIDB4MDNGMCkgPj4gNCl7CisJc3dpdGNoICgobG5rX3N0YXR1cyAmIFBDSV9FWFBfTE5LU1RBX05MVykgPj4gNCl7CiAJY2FzZSAwOgogCQlsbmtfd2R0aCA9IFBDSUVfTE5LX1dJRFRIX1JFU1JWOwogCQlicmVhazsKQEAgLTEwMzYsMTggKzkwMywxOSBAQAogewogCXUxNiBjbWQsIG1hc2s7CiAKLQljbWQgPSBQUlNOX0RFVEVDVF9FTkFCTEU7CisJY21kID0gUENJX0VYUF9TTFRDVExfUERDRTsKIAlpZiAoQVRUTl9CVVRUTihjdHJsKSkKLQkJY21kIHw9IEFUVE5fQlVUVE5fRU5BQkxFOworCQljbWQgfD0gUENJX0VYUF9TTFRDVExfQUJQRTsKIAlpZiAoUE9XRVJfQ1RSTChjdHJsKSkKLQkJY21kIHw9IFBXUl9GQVVMVF9ERVRFQ1RfRU5BQkxFOworCQljbWQgfD0gUENJX0VYUF9TTFRDVExfUEZERTsKIAlpZiAoTVJMX1NFTlMoY3RybCkpCi0JCWNtZCB8PSBNUkxfREVURUNUX0VOQUJMRTsKKwkJY21kIHw9IFBDSV9FWFBfU0xUQ1RMX01STFNDRTsKIAlpZiAoIXBjaWVocF9wb2xsX21vZGUpCi0JCWNtZCB8PSBIUF9JTlRSX0VOQUJMRSB8IENNRF9DTVBMX0lOVFJfRU5BQkxFOworCQljbWQgfD0gUENJX0VYUF9TTFRDVExfSFBJRSB8IFBDSV9FWFBfU0xUQ1RMX0NDSUU7CiAKLQltYXNrID0gUFJTTl9ERVRFQ1RfRU5BQkxFIHwgQVRUTl9CVVRUTl9FTkFCTEUgfCBNUkxfREVURUNUX0VOQUJMRSB8Ci0JICAgICAgIFBXUl9GQVVMVF9ERVRFQ1RfRU5BQkxFIHwgSFBfSU5UUl9FTkFCTEUgfCBDTURfQ01QTF9JTlRSX0VOQUJMRTsKKwltYXNrID0gKFBDSV9FWFBfU0xUQ1RMX1BEQ0UgfCBQQ0lfRVhQX1NMVENUTF9BQlBFIHwKKwkJUENJX0VYUF9TTFRDVExfTVJMU0NFIHwgUENJX0VYUF9TTFRDVExfUEZERSB8CisJCVBDSV9FWFBfU0xUQ1RMX0hQSUUgfCBQQ0lfRVhQX1NMVENUTF9DQ0lFKTsKIAogCWlmIChwY2llX3dyaXRlX2NtZChjdHJsLCBjbWQsIG1hc2spKSB7CiAJCWN0cmxfZXJyKGN0cmwsICJDYW5ub3QgZW5hYmxlIHNvZnR3YXJlIG5vdGlmaWNhdGlvblxuIik7CkBAIC0xMDU5LDggKzkyNyw5IEBACiBzdGF0aWMgdm9pZCBwY2llX2Rpc2FibGVfbm90aWZpY2F0aW9uKHN0cnVjdCBjb250cm9sbGVyICpjdHJsKQogewogCXUxNiBtYXNrOwotCW1hc2sgPSBQUlNOX0RFVEVDVF9FTkFCTEUgfCBBVFROX0JVVFROX0VOQUJMRSB8IE1STF9ERVRFQ1RfRU5BQkxFIHwKLQkgICAgICAgUFdSX0ZBVUxUX0RFVEVDVF9FTkFCTEUgfCBIUF9JTlRSX0VOQUJMRSB8IENNRF9DTVBMX0lOVFJfRU5BQkxFOworCW1hc2sgPSAoUENJX0VYUF9TTFRDVExfUERDRSB8IFBDSV9FWFBfU0xUQ1RMX0FCUEUgfAorCQlQQ0lfRVhQX1NMVENUTF9NUkxTQ0UgfCBQQ0lfRVhQX1NMVENUTF9QRkRFIHwKKwkJUENJX0VYUF9TTFRDVExfSFBJRSB8IFBDSV9FWFBfU0xUQ1RMX0NDSUUpOwogCWlmIChwY2llX3dyaXRlX2NtZChjdHJsLCAwLCBtYXNrKSkKIAkJY3RybF93YXJuKGN0cmwsICJDYW5ub3QgZGlzYWJsZSBzb2Z0d2FyZSBub3RpZmljYXRpb25cbiIpOwogfQpAQCAtMTE1Nyw5ICsxMDI2LDkgQEAKIAkJICBFTUkoY3RybCkgICAgICAgID8gInllcyIgOiAibm8iKTsKIAljdHJsX2luZm8oY3RybCwgIiAgQ29tbWFuZCBDb21wbGV0ZWQgICAgOiAlM3NcbiIsCiAJCSAgTk9fQ01EX0NNUEwoY3RybCkgPyAibm8iIDogInllcyIpOwotCXBjaWVocF9yZWFkdyhjdHJsLCBTTE9UU1RBVFVTLCAmcmVnMTYpOworCXBjaWVocF9yZWFkdyhjdHJsLCBQQ0lfRVhQX1NMVFNUQSwgJnJlZzE2KTsKIAljdHJsX2luZm8oY3RybCwgIlNsb3QgU3RhdHVzICAgICAgICAgICAgOiAweCUwNHhcbiIsIHJlZzE2KTsKLQlwY2llaHBfcmVhZHcoY3RybCwgU0xPVENUUkwsICZyZWcxNik7CisJcGNpZWhwX3JlYWR3KGN0cmwsIFBDSV9FWFBfU0xUQ1RMLCAmcmVnMTYpOwogCWN0cmxfaW5mbyhjdHJsLCAiU2xvdCBDb250cm9sICAgICAgICAgICA6IDB4JTA0eFxuIiwgcmVnMTYpOwogfQogCkBAIC0xMTgzLDcgKzEwNTIsNyBAQAogCQljdHJsX2VycihjdHJsLCAiQ2Fubm90IGZpbmQgUENJIEV4cHJlc3MgY2FwYWJpbGl0eVxuIik7CiAJCWdvdG8gYWJvcnRfY3RybDsKIAl9Ci0JaWYgKHBjaWVocF9yZWFkbChjdHJsLCBTTE9UQ0FQLCAmc2xvdF9jYXApKSB7CisJaWYgKHBjaWVocF9yZWFkbChjdHJsLCBQQ0lfRVhQX1NMVENBUCwgJnNsb3RfY2FwKSkgewogCQljdHJsX2VycihjdHJsLCAiQ2Fubm90IHJlYWQgU0xPVENBUCByZWdpc3RlclxuIik7CiAJCWdvdG8gYWJvcnRfY3RybDsKIAl9CkBAIC0xMjA4LDE3ICsxMDc3LDE3IEBACiAJICAgIGN0cmwtPm5vX2NtZF9jb21wbGV0ZSA9IDE7CiAKICAgICAgICAgLyogQ2hlY2sgaWYgRGF0YSBMaW5rIExheWVyIExpbmsgQWN0aXZlIFJlcG9ydGluZyBpcyBpbXBsZW1lbnRlZCAqLwotICAgICAgICBpZiAocGNpZWhwX3JlYWRsKGN0cmwsIExOS0NBUCwgJmxpbmtfY2FwKSkgeworICAgICAgICBpZiAocGNpZWhwX3JlYWRsKGN0cmwsIFBDSV9FWFBfTE5LQ0FQLCAmbGlua19jYXApKSB7CiAgICAgICAgICAgICAgICAgY3RybF9lcnIoY3RybCwgIiVzOiBDYW5ub3QgcmVhZCBMTktDQVAgcmVnaXN0ZXJcbiIsIF9fZnVuY19fKTsKICAgICAgICAgICAgICAgICBnb3RvIGFib3J0X2N0cmw7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGxpbmtfY2FwICYgTElOS19BQ1RJVkVfUkVQT1JUSU5HKSB7CisgICAgICAgIGlmIChsaW5rX2NhcCAmIFBDSV9FWFBfTE5LQ0FQX0RMTExBUkMpIHsKICAgICAgICAgICAgICAgICBjdHJsX2RiZyhjdHJsLCAiTGluayBBY3RpdmUgUmVwb3J0aW5nIHN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgICAgICAgY3RybC0+bGlua19hY3RpdmVfcmVwb3J0aW5nID0gMTsKICAgICAgICAgfQogCiAJLyogQ2xlYXIgYWxsIHJlbWFpbmluZyBldmVudCBiaXRzIGluIFNsb3QgU3RhdHVzIHJlZ2lzdGVyICovCi0JaWYgKHBjaWVocF93cml0ZXcoY3RybCwgU0xPVFNUQVRVUywgMHgxZikpCisJaWYgKHBjaWVocF93cml0ZXcoY3RybCwgUENJX0VYUF9TTFRTVEEsIDB4MWYpKQogCQlnb3RvIGFib3J0X2N0cmw7CiAKIAkvKiBEaXNhYmxlIHNvdGZ3YXJlIG5vdGlmaWNhdGlvbiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaXJxLmMgYi9kcml2ZXJzL3BjaS9pcnEuYwppbmRleCA2NDQxZGZhLi5kZTAxMTc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9pcnEuYworKysgYi9kcml2ZXJzL3BjaS9pcnEuYwpAQCAtMTUsNyArMTUsNyBAQAogCiAJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnBkZXYtPmRldiwKIAkJICAgIlBvdGVudGlhbGx5IG1pc3JvdXRlZCBJUlEgKEJyaWRnZSAlcyAlMDR4OiUwNHgpXG4iLAotCQkgICBwYXJlbnQtPmRldi5idXNfaWQsIHBhcmVudC0+dmVuZG9yLCBwYXJlbnQtPmRldmljZSk7CisJCSAgIGRldl9uYW1lKCZwYXJlbnQtPmRldiksIHBhcmVudC0+dmVuZG9yLCBwYXJlbnQtPmRldmljZSk7CiAJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnBkZXYtPmRldiwgIiVzXG4iLCByZWFzb24pOwogCWRldl9wcmludGsoS0VSTl9FUlIsICZwZGV2LT5kZXYsICJQbGVhc2UgcmVwb3J0IHRvIGxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmdcbiIpOwogCVdBUk5fT04oMSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9tc2kuYyBiL2RyaXZlcnMvcGNpL21zaS5jCmluZGV4IDExYTUxZjguLmI0YTkwYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL21zaS5jCisrKyBiL2RyaXZlcnMvcGNpL21zaS5jCkBAIC03NzYsMjggKzc3NiwxOSBAQAogCXBjaV9tc2lfZW5hYmxlID0gMDsKIH0KIAorLyoqCisgKiBwY2lfbXNpX2VuYWJsZWQgLSBpcyBNU0kgZW5hYmxlZD8KKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgTVNJIGhhcyBub3QgYmVlbiBkaXNhYmxlZCBieSB0aGUgY29tbWFuZC1saW5lIG9wdGlvbgorICogcGNpPW5vbXNpLgorICoqLworaW50IHBjaV9tc2lfZW5hYmxlZCh2b2lkKQoreworCXJldHVybiBwY2lfbXNpX2VuYWJsZTsKK30KK0VYUE9SVF9TWU1CT0wocGNpX21zaV9lbmFibGVkKTsKKwogdm9pZCBwY2lfbXNpX2luaXRfcGNpX2RldihzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCUlOSVRfTElTVF9IRUFEKCZkZXYtPm1zaV9saXN0KTsKIH0KLQotI2lmZGVmIENPTkZJR19BQ1BJCi0jaW5jbHVkZSA8bGludXgvYWNwaS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS1hY3BpLmg+Ci1zdGF0aWMgdm9pZCBfX2RldmluaXQgbXNpX2FjcGlfaW5pdCh2b2lkKQotewotCWlmIChhY3BpX3BjaV9kaXNhYmxlZCkKLQkJcmV0dXJuOwotCXBjaV9vc2Nfc3VwcG9ydF9zZXQoT1NDX01TSV9TVVBQT1JUKTsKLQlwY2llX29zY19zdXBwb3J0X3NldChPU0NfTVNJX1NVUFBPUlQpOwotfQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBtc2lfYWNwaV9pbml0KHZvaWQpIHsgfQotI2VuZGlmIC8qIENPTkZJR19BQ1BJICovCi0KLXZvaWQgX19kZXZpbml0IG1zaV9pbml0KHZvaWQpCi17Ci0JaWYgKCFwY2lfbXNpX2VuYWJsZSkKLQkJcmV0dXJuOwotCW1zaV9hY3BpX2luaXQoKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS1hY3BpLmMgYi9kcml2ZXJzL3BjaS9wY2ktYWNwaS5jCmluZGV4IGFlNWVjNzYuLjM1ODI1MTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS1hY3BpLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpLWFjcGkuYwpAQCAtMjQsMTMgKzI0LDE0IEBACiAJYWNwaV9oYW5kbGUgaGFuZGxlOwogCXUzMiBzdXBwb3J0X3NldDsKIAl1MzIgY29udHJvbF9zZXQ7CisJdTMyIGNvbnRyb2xfcXVlcnk7CisJaW50IGlzX3F1ZXJpZWQ7CiAJc3RydWN0IGxpc3RfaGVhZCBzaWJpbGluZzsKIH07CiBzdGF0aWMgTElTVF9IRUFEKGFjcGlfb3NjX2RhdGFfbGlzdCk7CiAKIHN0cnVjdCBhY3BpX29zY19hcmdzIHsKIAl1MzIgY2FwYnVmWzNdOwotCXUzMiBjdHJsX3Jlc3VsdDsKIH07CiAKIHN0YXRpYyBERUZJTkVfTVVURVgocGNpX2FjcGlfbG9jayk7CkBAIC01Niw3ICs1Nyw3IEBACiAJCQkgIDB4OTYsIDB4NTcsIDB4NzQsIDB4NDEsIDB4QzAsIDB4M0QsIDB4RDcsIDB4NjZ9OwogCiBzdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV9ydW5fb3NjKGFjcGlfaGFuZGxlIGhhbmRsZSwKLQkJCQlzdHJ1Y3QgYWNwaV9vc2NfYXJncyAqb3NjX2FyZ3MpCisJCQkJc3RydWN0IGFjcGlfb3NjX2FyZ3MgKm9zY19hcmdzLCB1MzIgKnJldHZhbCkKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgaW5wdXQ7CkBAIC0xMTIsOCArMTEzLDcgQEAKIAkJZ290byBvdXRfa2ZyZWU7CiAJfQogb3V0X3N1Y2Nlc3M6Ci0Jb3NjX2FyZ3MtPmN0cmxfcmVzdWx0ID0KLQkJKigodTMyICopKG91dF9vYmotPmJ1ZmZlci5wb2ludGVyICsgOCkpOworCSpyZXR2YWwgPSAqKCh1MzIgKikob3V0X29iai0+YnVmZmVyLnBvaW50ZXIgKyA4KSk7CiAJc3RhdHVzID0gQUVfT0s7CiAKIG91dF9rZnJlZToKQEAgLTEyMSwxMSArMTIxLDEwIEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGFjcGlfc3RhdHVzIF9fYWNwaV9xdWVyeV9vc2ModTMyIGZsYWdzLCBzdHJ1Y3QgYWNwaV9vc2NfZGF0YSAqb3NjX2RhdGEsCi0JCQkJICAgIHUzMiAqcmVzdWx0KQorc3RhdGljIGFjcGlfc3RhdHVzIF9fYWNwaV9xdWVyeV9vc2ModTMyIGZsYWdzLCBzdHJ1Y3QgYWNwaV9vc2NfZGF0YSAqb3NjX2RhdGEpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwotCXUzMiBzdXBwb3J0X3NldDsKKwl1MzIgc3VwcG9ydF9zZXQsIHJlc3VsdDsKIAlzdHJ1Y3QgYWNwaV9vc2NfYXJncyBvc2NfYXJnczsKIAogCS8qIGRvIF9PU0MgcXVlcnkgZm9yIGFsbCBwb3NzaWJsZSBjb250cm9scyAqLwpAQCAtMTM0LDU2ICsxMzMsNDUgQEAKIAlvc2NfYXJncy5jYXBidWZbT1NDX1NVUFBPUlRfVFlQRV0gPSBzdXBwb3J0X3NldDsKIAlvc2NfYXJncy5jYXBidWZbT1NDX0NPTlRST0xfVFlQRV0gPSBPU0NfQ09OVFJPTF9NQVNLUzsKIAotCXN0YXR1cyA9IGFjcGlfcnVuX29zYyhvc2NfZGF0YS0+aGFuZGxlLCAmb3NjX2FyZ3MpOworCXN0YXR1cyA9IGFjcGlfcnVuX29zYyhvc2NfZGF0YS0+aGFuZGxlLCAmb3NjX2FyZ3MsICZyZXN1bHQpOwogCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQlvc2NfZGF0YS0+c3VwcG9ydF9zZXQgPSBzdXBwb3J0X3NldDsKLQkJKnJlc3VsdCA9IG9zY19hcmdzLmN0cmxfcmVzdWx0OworCQlvc2NfZGF0YS0+Y29udHJvbF9xdWVyeSA9IHJlc3VsdDsKKwkJb3NjX2RhdGEtPmlzX3F1ZXJpZWQgPSAxOwogCX0KIAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX3F1ZXJ5X29zYyhhY3BpX2hhbmRsZSBoYW5kbGUsCi0JCQkJICB1MzIgbGV2ZWwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR2YWwpCisvKgorICogcGNpX2FjcGlfb3NjX3N1cHBvcnQ6IEludm9rZSBfT1NDIGluZGljYXRpbmcgc3VwcG9ydCBmb3IgdGhlIGdpdmVuIGZlYXR1cmUKKyAqIEBmbGFnczogQml0bWFzayBvZiBmbGFncyB0byBzdXBwb3J0CisgKgorICogU2VlIHRoZSBBQ1BJIHNwZWMgZm9yIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBmbGFncworICovCitpbnQgcGNpX2FjcGlfb3NjX3N1cHBvcnQoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgZmxhZ3MpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBhY3BpX29zY19kYXRhICpvc2NfZGF0YTsKLQl1MzIgZmxhZ3MgPSAodW5zaWduZWQgbG9uZyljb250ZXh0LCBkdW1teTsKIAlhY3BpX2hhbmRsZSB0bXA7CisJc3RydWN0IGFjcGlfb3NjX2RhdGEgKm9zY19kYXRhOworCWludCByYyA9IDA7CiAKIAlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoaGFuZGxlLCAiX09TQyIsICZ0bXApOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKLQkJcmV0dXJuIEFFX09LOworCQlyZXR1cm4gLUVOT1RUWTsKIAogCW11dGV4X2xvY2soJnBjaV9hY3BpX2xvY2spOwogCW9zY19kYXRhID0gYWNwaV9nZXRfb3NjX2RhdGEoaGFuZGxlKTsKIAlpZiAoIW9zY19kYXRhKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiYWNwaSBvc2MgZGF0YSBhcnJheSBpcyBmdWxsXG4iKTsKKwkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKIAl9CiAKLQlfX2FjcGlfcXVlcnlfb3NjKGZsYWdzLCBvc2NfZGF0YSwgJmR1bW15KTsKKwlfX2FjcGlfcXVlcnlfb3NjKGZsYWdzLCBvc2NfZGF0YSk7CiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZwY2lfYWNwaV9sb2NrKTsKLQlyZXR1cm4gQUVfT0s7Ci19Ci0KLS8qKgotICogX19wY2lfb3NjX3N1cHBvcnRfc2V0IC0gcmVnaXN0ZXIgT1Mgc3VwcG9ydCB0byBGaXJtd2FyZQotICogQGZsYWdzOiBPUyBzdXBwb3J0IGJpdHMKLSAqIEBoaWQ6IGhhcmR3YXJlIElECi0gKgotICogVXBkYXRlIE9TIHN1cHBvcnQgZmllbGRzIGFuZCBkb2luZyBhIF9PU0MgUXVlcnkgdG8gb2J0YWluIGFuIHVwZGF0ZQotICogZnJvbSBGaXJtd2FyZSBvbiBzdXBwb3J0ZWQgY29udHJvbCBiaXRzLgotICoqLwotYWNwaV9zdGF0dXMgX19wY2lfb3NjX3N1cHBvcnRfc2V0KHUzMiBmbGFncywgY29uc3QgY2hhciAqaGlkKQotewotCWlmICghKGZsYWdzICYgT1NDX1NVUFBPUlRfTUFTS1MpKQotCQlyZXR1cm4gQUVfVFlQRTsKLQotCWFjcGlfZ2V0X2RldmljZXMoaGlkLCBhY3BpX3F1ZXJ5X29zYywKLQkJCSAodm9pZCAqKSh1bnNpZ25lZCBsb25nKWZsYWdzLCBOVUxMKTsKLQlyZXR1cm4gQUVfT0s7CisJcmV0dXJuIHJjOwogfQogCiAvKioKQEAgLTE5Niw3ICsxODQsNyBAQAogYWNwaV9zdGF0dXMgcGNpX29zY19jb250cm9sX3NldChhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBmbGFncykKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JdTMyIGN0cmxzZXQsIGNvbnRyb2xfc2V0LCByZXN1bHQ7CisJdTMyIGNvbnRyb2xfcmVxLCBjb250cm9sX3NldCwgcmVzdWx0OwogCWFjcGlfaGFuZGxlIHRtcDsKIAlzdHJ1Y3QgYWNwaV9vc2NfZGF0YSAqb3NjX2RhdGE7CiAJc3RydWN0IGFjcGlfb3NjX2FyZ3Mgb3NjX2FyZ3M7CkBAIC0yMTMsMjggKzIwMSwzNCBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQljdHJsc2V0ID0gKGZsYWdzICYgT1NDX0NPTlRST0xfTUFTS1MpOwotCWlmICghY3RybHNldCkgeworCWNvbnRyb2xfcmVxID0gKGZsYWdzICYgT1NDX0NPTlRST0xfTUFTS1MpOworCWlmICghY29udHJvbF9yZXEpIHsKIAkJc3RhdHVzID0gQUVfVFlQRTsKIAkJZ290byBvdXQ7CiAJfQogCi0Jc3RhdHVzID0gX19hY3BpX3F1ZXJ5X29zYyhvc2NfZGF0YS0+c3VwcG9ydF9zZXQsIG9zY19kYXRhLCAmcmVzdWx0KTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJLyogTm8gbmVlZCB0byBldmFsdWF0ZSBfT1NDIGlmIHRoZSBjb250cm9sIHdhcyBhbHJlYWR5IGdyYW50ZWQuICovCisJaWYgKChvc2NfZGF0YS0+Y29udHJvbF9zZXQgJiBjb250cm9sX3JlcSkgPT0gY29udHJvbF9yZXEpCiAJCWdvdG8gb3V0OwogCi0JaWYgKChyZXN1bHQgJiBjdHJsc2V0KSAhPSBjdHJsc2V0KSB7CisJaWYgKCFvc2NfZGF0YS0+aXNfcXVlcmllZCkgeworCQlzdGF0dXMgPSBfX2FjcGlfcXVlcnlfb3NjKG9zY19kYXRhLT5zdXBwb3J0X3NldCwgb3NjX2RhdGEpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoKG9zY19kYXRhLT5jb250cm9sX3F1ZXJ5ICYgY29udHJvbF9yZXEpICE9IGNvbnRyb2xfcmVxKSB7CiAJCXN0YXR1cyA9IEFFX1NVUFBPUlQ7CiAJCWdvdG8gb3V0OwogCX0KIAotCWNvbnRyb2xfc2V0ID0gb3NjX2RhdGEtPmNvbnRyb2xfc2V0IHwgY3RybHNldDsKKwljb250cm9sX3NldCA9IG9zY19kYXRhLT5jb250cm9sX3NldCB8IGNvbnRyb2xfcmVxOwogCW9zY19hcmdzLmNhcGJ1ZltPU0NfUVVFUllfVFlQRV0gPSAwOwogCW9zY19hcmdzLmNhcGJ1ZltPU0NfU1VQUE9SVF9UWVBFXSA9IG9zY19kYXRhLT5zdXBwb3J0X3NldDsKIAlvc2NfYXJncy5jYXBidWZbT1NDX0NPTlRST0xfVFlQRV0gPSBjb250cm9sX3NldDsKLQlzdGF0dXMgPSBhY3BpX3J1bl9vc2MoaGFuZGxlLCAmb3NjX2FyZ3MpOworCXN0YXR1cyA9IGFjcGlfcnVuX29zYyhoYW5kbGUsICZvc2NfYXJncywgJnJlc3VsdCk7CiAJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKQotCQlvc2NfZGF0YS0+Y29udHJvbF9zZXQgPSBjb250cm9sX3NldDsKKwkJb3NjX2RhdGEtPmNvbnRyb2xfc2V0ID0gcmVzdWx0Owogb3V0OgogCW11dGV4X3VubG9jaygmcGNpX2FjcGlfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKQEAgLTM3NSw3ICszNjksNyBAQAogCSAqIFRoZSBzdHJpbmcgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHJvb3QgYnJpZGdlJ3MgbmFtZQogCSAqIFBsZWFzZSBsb29rIGF0ICdwY2lfc2Nhbl9idXNfcGFyZW50ZWQnCiAJICovCi0JbnVtID0gc3NjYW5mKGRldi0+YnVzX2lkLCAicGNpJTA0eDolMDJ4IiwgJnNlZywgJmJ1cyk7CisJbnVtID0gc3NjYW5mKGRldl9uYW1lKGRldiksICJwY2klMDR4OiUwMngiLCAmc2VnLCAmYnVzKTsKIAlpZiAobnVtICE9IDIpCiAJCXJldHVybiAtRU5PREVWOwogCSpoYW5kbGUgPSBhY3BpX2dldF9wY2lfcm9vdGJyaWRnZV9oYW5kbGUoc2VnLCBidXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLWRyaXZlci5jIGIvZHJpdmVycy9wY2kvcGNpLWRyaXZlci5jCmluZGV4IGI0Y2RkNjkuLmM2OTdmMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYworKysgYi9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlICJwY2kuaCIKIAogLyoKQEAgLTQ4LDcgKzQ5LDcgQEAKIAkJc3ViZGV2aWNlPVBDSV9BTllfSUQsIGNsYXNzPTAsIGNsYXNzX21hc2s9MDsKIAl1bnNpZ25lZCBsb25nIGRyaXZlcl9kYXRhPTA7CiAJaW50IGZpZWxkcz0wOwotCWludCByZXR2YWw7CisJaW50IHJldHZhbD0wOwogCiAJZmllbGRzID0gc3NjYW5mKGJ1ZiwgIiV4ICV4ICV4ICV4ICV4ICV4ICVseCIsCiAJCQkmdmVuZG9yLCAmZGV2aWNlLCAmc3VidmVuZG9yLCAmc3ViZGV2aWNlLApAQCAtNTgsMTYgKzU5LDE4IEBACiAKIAkvKiBPbmx5IGFjY2VwdCBkcml2ZXJfZGF0YSB2YWx1ZXMgdGhhdCBtYXRjaCBhbiBleGlzdGluZyBpZF90YWJsZQogCSAgIGVudHJ5ICovCi0JcmV0dmFsID0gLUVJTlZBTDsKLQl3aGlsZSAoaWRzLT52ZW5kb3IgfHwgaWRzLT5zdWJ2ZW5kb3IgfHwgaWRzLT5jbGFzc19tYXNrKSB7Ci0JCWlmIChkcml2ZXJfZGF0YSA9PSBpZHMtPmRyaXZlcl9kYXRhKSB7Ci0JCQlyZXR2YWwgPSAwOwotCQkJYnJlYWs7CisJaWYgKGlkcykgeworCQlyZXR2YWwgPSAtRUlOVkFMOworCQl3aGlsZSAoaWRzLT52ZW5kb3IgfHwgaWRzLT5zdWJ2ZW5kb3IgfHwgaWRzLT5jbGFzc19tYXNrKSB7CisJCQlpZiAoZHJpdmVyX2RhdGEgPT0gaWRzLT5kcml2ZXJfZGF0YSkgeworCQkJCXJldHZhbCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZHMrKzsKIAkJfQotCQlpZHMrKzsKKwkJaWYgKHJldHZhbCkJLyogTm8gbWF0Y2ggKi8KKwkJCXJldHVybiByZXR2YWw7CiAJfQotCWlmIChyZXR2YWwpCS8qIE5vIG1hdGNoICovCi0JCXJldHVybiByZXR2YWw7CiAKIAlkeW5pZCA9IGt6YWxsb2Moc2l6ZW9mKCpkeW5pZCksIEdGUF9LRVJORUwpOwogCWlmICghZHluaWQpCkBAIC0xODMsMzIgKzE4Niw0MyBAQAogCXJldHVybiBwY2lfbWF0Y2hfaWQoZHJ2LT5pZF90YWJsZSwgZGV2KTsKIH0KIAorc3RydWN0IGRydl9kZXZfYW5kX2lkIHsKKwlzdHJ1Y3QgcGNpX2RyaXZlciAqZHJ2OworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkOworfTsKKworc3RhdGljIGxvbmcgbG9jYWxfcGNpX3Byb2JlKHZvaWQgKl9kZGkpCit7CisJc3RydWN0IGRydl9kZXZfYW5kX2lkICpkZGkgPSBfZGRpOworCisJcmV0dXJuIGRkaS0+ZHJ2LT5wcm9iZShkZGktPmRldiwgZGRpLT5pZCk7Cit9CisKIHN0YXRpYyBpbnQgcGNpX2NhbGxfcHJvYmUoc3RydWN0IHBjaV9kcml2ZXIgKmRydiwgc3RydWN0IHBjaV9kZXYgKmRldiwKIAkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogewotCWludCBlcnJvcjsKLSNpZmRlZiBDT05GSUdfTlVNQQotCS8qIEV4ZWN1dGUgZHJpdmVyIGluaXRpYWxpemF0aW9uIG9uIG5vZGUgd2hlcmUgdGhlCi0JICAgZGV2aWNlJ3MgYnVzIGlzIGF0dGFjaGVkIHRvLiAgVGhpcyB3YXkgdGhlIGRyaXZlciBsaWtlbHkKLQkgICBhbGxvY2F0ZXMgaXRzIGxvY2FsIG1lbW9yeSBvbiB0aGUgcmlnaHQgbm9kZSB3aXRob3V0Ci0JICAgYW55IG5lZWQgdG8gY2hhbmdlIGl0LiAqLwotCXN0cnVjdCBtZW1wb2xpY3kgKm9sZHBvbDsKLQljcHVtYXNrX3Qgb2xkbWFzayA9IGN1cnJlbnQtPmNwdXNfYWxsb3dlZDsKLQlpbnQgbm9kZSA9IGRldl90b19ub2RlKCZkZXYtPmRldik7CisJaW50IGVycm9yLCBub2RlOworCXN0cnVjdCBkcnZfZGV2X2FuZF9pZCBkZGkgPSB7IGRydiwgZGV2LCBpZCB9OwogCisJLyogRXhlY3V0ZSBkcml2ZXIgaW5pdGlhbGl6YXRpb24gb24gbm9kZSB3aGVyZSB0aGUgZGV2aWNlJ3MKKwkgICBidXMgaXMgYXR0YWNoZWQgdG8uICBUaGlzIHdheSB0aGUgZHJpdmVyIGxpa2VseSBhbGxvY2F0ZXMKKwkgICBpdHMgbG9jYWwgbWVtb3J5IG9uIHRoZSByaWdodCBub2RlIHdpdGhvdXQgYW55IG5lZWQgdG8KKwkgICBjaGFuZ2UgaXQuICovCisJbm9kZSA9IGRldl90b19ub2RlKCZkZXYtPmRldik7CiAJaWYgKG5vZGUgPj0gMCkgeworCQlpbnQgY3B1OwogCQlub2RlX3RvX2NwdW1hc2tfcHRyKG5vZGVjcHVtYXNrLCBub2RlKTsKLQkJc2V0X2NwdXNfYWxsb3dlZF9wdHIoY3VycmVudCwgbm9kZWNwdW1hc2spOwotCX0KLQkvKiBBbmQgc2V0IGRlZmF1bHQgbWVtb3J5IGFsbG9jYXRpb24gcG9saWN5ICovCi0Jb2xkcG9sID0gY3VycmVudC0+bWVtcG9saWN5OwotCWN1cnJlbnQtPm1lbXBvbGljeSA9IE5VTEw7CS8qIGZhbGwgYmFjayB0byBzeXN0ZW0gZGVmYXVsdCBwb2xpY3kgKi8KLSNlbmRpZgotCWVycm9yID0gZHJ2LT5wcm9iZShkZXYsIGlkKTsKLSNpZmRlZiBDT05GSUdfTlVNQQotCXNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsICZvbGRtYXNrKTsKLQljdXJyZW50LT5tZW1wb2xpY3kgPSBvbGRwb2w7Ci0jZW5kaWYKKworCQlnZXRfb25saW5lX2NwdXMoKTsKKwkJY3B1ID0gY3B1bWFza19hbnlfYW5kKG5vZGVjcHVtYXNrLCBjcHVfb25saW5lX21hc2spOworCQlpZiAoY3B1IDwgbnJfY3B1X2lkcykKKwkJCWVycm9yID0gd29ya19vbl9jcHUoY3B1LCBsb2NhbF9wY2lfcHJvYmUsICZkZGkpOworCQllbHNlCisJCQllcnJvciA9IGxvY2FsX3BjaV9wcm9iZSgmZGRpKTsKKwkJcHV0X29ubGluZV9jcHVzKCk7CisJfSBlbHNlCisJCWVycm9yID0gbG9jYWxfcGNpX3Byb2JlKCZkZGkpOwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtMzAyLDExICszMTYsMTAgQEAKIAogLyoKICAqIERlZmF1bHQgInN1c3BlbmQiIG1ldGhvZCBmb3IgZGV2aWNlcyB0aGF0IGhhdmUgbm8gZHJpdmVyIHByb3ZpZGVkIHN1c3BlbmQsCi0gKiBvciBub3QgZXZlbiBhIGRyaXZlciBhdCBhbGwuCisgKiBvciBub3QgZXZlbiBhIGRyaXZlciBhdCBhbGwgKHNlY29uZCBwYXJ0KS4KICAqLwotc3RhdGljIHZvaWQgcGNpX2RlZmF1bHRfcG1fc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3N0YXRpYyB2b2lkIHBjaV9wbV9zZXRfdW5rbm93bl9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKIHsKLQlwY2lfc2F2ZV9zdGF0ZShwY2lfZGV2KTsKIAkvKgogCSAqIG1hcmsgaXRzIHBvd2VyIHN0YXRlIGFzICJ1bmtub3duIiwgc2luY2Ugd2UgZG9uJ3Qga25vdyBpZgogCSAqIGUuZy4gdGhlIEJJT1Mgd2lsbCBjaGFuZ2UgaXRzIGRldmljZSBzdGF0ZSB3aGVuIHdlIHN1c3BlbmQuCkBAIC0zMTcsMTQgKzMzMCwxMiBAQAogCiAvKgogICogRGVmYXVsdCAicmVzdW1lIiBtZXRob2QgZm9yIGRldmljZXMgdGhhdCBoYXZlIG5vIGRyaXZlciBwcm92aWRlZCByZXN1bWUsCi0gKiBvciBub3QgZXZlbiBhIGRyaXZlciBhdCBhbGwuCisgKiBvciBub3QgZXZlbiBhIGRyaXZlciBhdCBhbGwgKHNlY29uZCBwYXJ0KS4KICAqLwotc3RhdGljIGludCBwY2lfZGVmYXVsdF9wbV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCitzdGF0aWMgaW50IHBjaV9wbV9yZWVuYWJsZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCiB7Ci0JaW50IHJldHZhbCA9IDA7CisJaW50IHJldHZhbDsKIAotCS8qIHJlc3RvcmUgdGhlIFBDSSBjb25maWcgc3BhY2UgKi8KLQlwY2lfcmVzdG9yZV9zdGF0ZShwY2lfZGV2KTsKIAkvKiBpZiB0aGUgZGV2aWNlIHdhcyBlbmFibGVkIGJlZm9yZSBzdXNwZW5kLCByZWVuYWJsZSAqLwogCXJldHZhbCA9IHBjaV9yZWVuYWJsZV9kZXZpY2UocGNpX2Rldik7CiAJLyoKQEAgLTM0Nyw4ICszNTgsMTYgQEAKIAkJaSA9IGRydi0+c3VzcGVuZChwY2lfZGV2LCBzdGF0ZSk7CiAJCXN1c3BlbmRfcmVwb3J0X3Jlc3VsdChkcnYtPnN1c3BlbmQsIGkpOwogCX0gZWxzZSB7Ci0JCXBjaV9kZWZhdWx0X3BtX3N1c3BlbmQocGNpX2Rldik7CisJCXBjaV9zYXZlX3N0YXRlKHBjaV9kZXYpOworCQkvKgorCQkgKiBUaGlzIGlzIGZvciBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgY29kZSB3aXRoIGxlZ2FjeSBQTQorCQkgKiBzdXBwb3J0LgorCQkgKi8KKwkJcGNpX3BtX3NldF91bmtub3duX3N0YXRlKHBjaV9kZXYpOwogCX0KKworCXBjaV9maXh1cF9kZXZpY2UocGNpX2ZpeHVwX3N1c3BlbmQsIHBjaV9kZXYpOworCiAJcmV0dXJuIGk7CiB9CiAKQEAgLTM2NSwzMCArMzg0LDEzMCBAQAogCXJldHVybiBpOwogfQogCi1zdGF0aWMgaW50IHBjaV9sZWdhY3lfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlpbnQgZXJyb3I7Ci0Jc3RydWN0IHBjaV9kZXYgKiBwY2lfZGV2ID0gdG9fcGNpX2RldihkZXYpOwotCXN0cnVjdCBwY2lfZHJpdmVyICogZHJ2ID0gcGNpX2Rldi0+ZHJpdmVyOwotCi0JaWYgKGRydiAmJiBkcnYtPnJlc3VtZSkKLQkJZXJyb3IgPSBkcnYtPnJlc3VtZShwY2lfZGV2KTsKLQllbHNlCi0JCWVycm9yID0gcGNpX2RlZmF1bHRfcG1fcmVzdW1lKHBjaV9kZXYpOwotCXJldHVybiBlcnJvcjsKLX0KLQogc3RhdGljIGludCBwY2lfbGVnYWN5X3Jlc3VtZV9lYXJseShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJaW50IGVycm9yID0gMDsKIAlzdHJ1Y3QgcGNpX2RldiAqIHBjaV9kZXYgPSB0b19wY2lfZGV2KGRldik7CiAJc3RydWN0IHBjaV9kcml2ZXIgKiBkcnYgPSBwY2lfZGV2LT5kcml2ZXI7CiAKKwlwY2lfZml4dXBfZGV2aWNlKHBjaV9maXh1cF9yZXN1bWVfZWFybHksIHBjaV9kZXYpOworCiAJaWYgKGRydiAmJiBkcnYtPnJlc3VtZV9lYXJseSkKIAkJZXJyb3IgPSBkcnYtPnJlc3VtZV9lYXJseShwY2lfZGV2KTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKK3N0YXRpYyBpbnQgcGNpX2xlZ2FjeV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgcGNpX2RldiAqIHBjaV9kZXYgPSB0b19wY2lfZGV2KGRldik7CisJc3RydWN0IHBjaV9kcml2ZXIgKiBkcnYgPSBwY2lfZGV2LT5kcml2ZXI7CisKKwlwY2lfZml4dXBfZGV2aWNlKHBjaV9maXh1cF9yZXN1bWUsIHBjaV9kZXYpOworCisJaWYgKGRydiAmJiBkcnYtPnJlc3VtZSkgeworCQllcnJvciA9IGRydi0+cmVzdW1lKHBjaV9kZXYpOworCX0gZWxzZSB7CisJCS8qIHJlc3RvcmUgdGhlIFBDSSBjb25maWcgc3BhY2UgKi8KKwkJcGNpX3Jlc3RvcmVfc3RhdGUocGNpX2Rldik7CisJCWVycm9yID0gcGNpX3BtX3JlZW5hYmxlX2RldmljZShwY2lfZGV2KTsKKwl9CisJcmV0dXJuIGVycm9yOworfQorCisvKiBBdXhpbGlhcnkgZnVuY3Rpb25zIHVzZWQgYnkgdGhlIG5ldyBwb3dlciBtYW5hZ2VtZW50IGZyYW1ld29yayAqLworCitzdGF0aWMgaW50IHBjaV9yZXN0b3JlX3N0YW5kYXJkX2NvbmZpZyhzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGFyZW50ID0gcGNpX2Rldi0+YnVzLT5zZWxmOworCWludCBlcnJvciA9IDA7CisKKwkvKiBDaGVjayBpZiB0aGUgZGV2aWNlJ3MgYnVzIGlzIG9wZXJhdGlvbmFsICovCisJaWYgKCFwYXJlbnQgfHwgcGFyZW50LT5jdXJyZW50X3N0YXRlID09IFBDSV9EMCkgeworCQlwY2lfcmVzdG9yZV9zdGF0ZShwY2lfZGV2KTsKKwkJcGNpX3VwZGF0ZV9jdXJyZW50X3N0YXRlKHBjaV9kZXYsIFBDSV9EMCk7CisJfSBlbHNlIHsKKwkJZGV2X3dhcm4oJnBjaV9kZXYtPmRldiwgInVuYWJsZSB0byByZXN0b3JlIGNvbmZpZywgIgorCQkJImJyaWRnZSAlcyBpbiBsb3cgcG93ZXIgc3RhdGUgRCVkXG4iLCBwY2lfbmFtZShwYXJlbnQpLAorCQkJcGFyZW50LT5jdXJyZW50X3N0YXRlKTsKKwkJcGNpX2Rldi0+Y3VycmVudF9zdGF0ZSA9IFBDSV9VTktOT1dOOworCQllcnJvciA9IC1FQUdBSU47CisJfQorCisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgYm9vbCBwY2lfaXNfYnJpZGdlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQoreworCXJldHVybiAhIShwY2lfZGV2LT5zdWJvcmRpbmF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHBjaV9wbV9kZWZhdWx0X3Jlc3VtZV9ub2lycShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3sKKwlpZiAocGNpX3Jlc3RvcmVfc3RhbmRhcmRfY29uZmlnKHBjaV9kZXYpKQorCQlwY2lfZml4dXBfZGV2aWNlKHBjaV9maXh1cF9yZXN1bWVfZWFybHksIHBjaV9kZXYpOworfQorCitzdGF0aWMgaW50IHBjaV9wbV9kZWZhdWx0X3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3sKKwkvKgorCSAqIHBjaV9yZXN0b3JlX3N0YW5kYXJkX2NvbmZpZygpIHNob3VsZCBoYXZlIGJlZW4gY2FsbGVkIG9uY2UgYWxyZWFkeSwKKwkgKiBidXQgaXQgd291bGQgaGF2ZSBmYWlsZWQgaWYgdGhlIGRldmljZSdzIHBhcmVudCBicmlkZ2UgaGFkIG5vdCBiZWVuCisJICogaW4gcG93ZXIgc3RhdGUgRDAgYXQgdGhhdCB0aW1lLiAgQ2hlY2sgaXQgYW5kIHRyeSBhZ2FpbiBpZiBuZWNlc3NhcnkuCisJICovCisJaWYgKHBjaV9kZXYtPmN1cnJlbnRfc3RhdGUgPT0gUENJX1VOS05PV04pIHsKKwkJaW50IGVycm9yID0gcGNpX3Jlc3RvcmVfc3RhbmRhcmRfY29uZmlnKHBjaV9kZXYpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisJfQorCisJcGNpX2ZpeHVwX2RldmljZShwY2lfZml4dXBfcmVzdW1lLCBwY2lfZGV2KTsKKworCWlmICghcGNpX2lzX2JyaWRnZShwY2lfZGV2KSkKKwkJcGNpX2VuYWJsZV93YWtlKHBjaV9kZXYsIFBDSV9EMCwgZmFsc2UpOworCisJcmV0dXJuIHBjaV9wbV9yZWVuYWJsZV9kZXZpY2UocGNpX2Rldik7Cit9CisKK3N0YXRpYyB2b2lkIHBjaV9wbV9kZWZhdWx0X3N1c3BlbmRfZ2VuZXJpYyhzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3sKKwkvKiBJZiBkZXZpY2UgaXMgZW5hYmxlZCBhdCB0aGlzIHBvaW50LCBkaXNhYmxlIGl0ICovCisJcGNpX2Rpc2FibGVfZW5hYmxlZF9kZXZpY2UocGNpX2Rldik7CisJLyoKKwkgKiBTYXZlIHN0YXRlIHdpdGggaW50ZXJydXB0cyBlbmFibGVkLCBiZWNhdXNlIGluIHByaW5jaXBsZSB0aGUgYnVzIHRoZQorCSAqIGRldmljZSBpcyBvbiBtYXkgYmUgcHV0IGludG8gYSBsb3cgcG93ZXIgc3RhdGUgYWZ0ZXIgdGhpcyBjb2RlIHJ1bnMuCisJICovCisJcGNpX3NhdmVfc3RhdGUocGNpX2Rldik7Cit9CisKK3N0YXRpYyB2b2lkIHBjaV9wbV9kZWZhdWx0X3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCit7CisJcGNpX3BtX2RlZmF1bHRfc3VzcGVuZF9nZW5lcmljKHBjaV9kZXYpOworCisJaWYgKCFwY2lfaXNfYnJpZGdlKHBjaV9kZXYpKQorCQlwY2lfcHJlcGFyZV90b19zbGVlcChwY2lfZGV2KTsKKworCXBjaV9maXh1cF9kZXZpY2UocGNpX2ZpeHVwX3N1c3BlbmQsIHBjaV9kZXYpOworfQorCitzdGF0aWMgYm9vbCBwY2lfaGFzX2xlZ2FjeV9wbV9zdXBwb3J0KHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQoreworCXN0cnVjdCBwY2lfZHJpdmVyICpkcnYgPSBwY2lfZGV2LT5kcml2ZXI7CisJYm9vbCByZXQgPSBkcnYgJiYgKGRydi0+c3VzcGVuZCB8fCBkcnYtPnN1c3BlbmRfbGF0ZSB8fCBkcnYtPnJlc3VtZQorCQl8fCBkcnYtPnJlc3VtZV9lYXJseSk7CisKKwkvKgorCSAqIExlZ2FjeSBQTSBzdXBwb3J0IGlzIHVzZWQgYnkgZGVmYXVsdCwgc28gd2FybiBpZiB0aGUgbmV3IGZyYW1ld29yayBpcworCSAqIHN1cHBvcnRlZCBhcyB3ZWxsLiAgRHJpdmVycyBhcmUgc3VwcG9zZWQgdG8gc3VwcG9ydCBlaXRoZXIgdGhlCisJICogZm9ybWVyLCBvciB0aGUgbGF0dGVyLCBidXQgbm90IGJvdGggYXQgdGhlIHNhbWUgdGltZS4KKwkgKi8KKwlXQVJOX09OKHJldCAmJiBkcnYtPmRyaXZlci5wbSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBOZXcgcG93ZXIgbWFuYWdlbWVudCBmcmFtZXdvcmsgKi8KKwogc3RhdGljIGludCBwY2lfcG1fcHJlcGFyZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwpAQCAtNDE2LDE3ICs1MzUsMTYgQEAKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CiAJaW50IGVycm9yID0gMDsKIAotCWlmIChkcnYgJiYgZHJ2LT5wbSkgewotCQlpZiAoZHJ2LT5wbS0+c3VzcGVuZCkgewotCQkJZXJyb3IgPSBkcnYtPnBtLT5zdXNwZW5kKGRldik7Ci0JCQlzdXNwZW5kX3JlcG9ydF9yZXN1bHQoZHJ2LT5wbS0+c3VzcGVuZCwgZXJyb3IpOwotCQl9IGVsc2UgewotCQkJcGNpX2RlZmF1bHRfcG1fc3VzcGVuZChwY2lfZGV2KTsKLQkJfQotCX0gZWxzZSB7Ci0JCWVycm9yID0gcGNpX2xlZ2FjeV9zdXNwZW5kKGRldiwgUE1TR19TVVNQRU5EKTsKKwlpZiAocGNpX2hhc19sZWdhY3lfcG1fc3VwcG9ydChwY2lfZGV2KSkKKwkJcmV0dXJuIHBjaV9sZWdhY3lfc3VzcGVuZChkZXYsIFBNU0dfU1VTUEVORCk7CisKKwlpZiAoZHJ2ICYmIGRydi0+cG0gJiYgZHJ2LT5wbS0+c3VzcGVuZCkgeworCQllcnJvciA9IGRydi0+cG0tPnN1c3BlbmQoZGV2KTsKKwkJc3VzcGVuZF9yZXBvcnRfcmVzdWx0KGRydi0+cG0tPnN1c3BlbmQsIGVycm9yKTsKIAl9Ci0JcGNpX2ZpeHVwX2RldmljZShwY2lfZml4dXBfc3VzcGVuZCwgcGNpX2Rldik7CisKKwlpZiAoIWVycm9yKQorCQlwY2lfcG1fZGVmYXVsdF9zdXNwZW5kKHBjaV9kZXYpOwogCiAJcmV0dXJuIGVycm9yOwogfQpAQCAtNDM0LDE4ICs1NTIsMzcgQEAKIHN0YXRpYyBpbnQgcGNpX3BtX3N1c3BlbmRfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gdG9fcGNpX2RldihkZXYpOwotCXN0cnVjdCBwY2lfZHJpdmVyICpkcnYgPSBwY2lfZGV2LT5kcml2ZXI7CisJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwogCWludCBlcnJvciA9IDA7CiAKLQlpZiAoZHJ2ICYmIGRydi0+cG0pIHsKLQkJaWYgKGRydi0+cG0tPnN1c3BlbmRfbm9pcnEpIHsKLQkJCWVycm9yID0gZHJ2LT5wbS0+c3VzcGVuZF9ub2lycShkZXYpOwotCQkJc3VzcGVuZF9yZXBvcnRfcmVzdWx0KGRydi0+cG0tPnN1c3BlbmRfbm9pcnEsIGVycm9yKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWVycm9yID0gcGNpX2xlZ2FjeV9zdXNwZW5kX2xhdGUoZGV2LCBQTVNHX1NVU1BFTkQpOworCWlmIChwY2lfaGFzX2xlZ2FjeV9wbV9zdXBwb3J0KHBjaV9kZXYpKQorCQlyZXR1cm4gcGNpX2xlZ2FjeV9zdXNwZW5kX2xhdGUoZGV2LCBQTVNHX1NVU1BFTkQpOworCisJaWYgKGRydiAmJiBkcnYtPnBtICYmIGRydi0+cG0tPnN1c3BlbmRfbm9pcnEpIHsKKwkJZXJyb3IgPSBkcnYtPnBtLT5zdXNwZW5kX25vaXJxKGRldik7CisJCXN1c3BlbmRfcmVwb3J0X3Jlc3VsdChkcnYtPnBtLT5zdXNwZW5kX25vaXJxLCBlcnJvcik7CiAJfQogCisJaWYgKCFlcnJvcikKKwkJcGNpX3BtX3NldF91bmtub3duX3N0YXRlKHBjaV9kZXYpOworCisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IHBjaV9wbV9yZXN1bWVfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gdG9fcGNpX2RldihkZXYpOworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKKwlpbnQgZXJyb3IgPSAwOworCisJaWYgKHBjaV9oYXNfbGVnYWN5X3BtX3N1cHBvcnQocGNpX2RldikpCisJCXJldHVybiBwY2lfbGVnYWN5X3Jlc3VtZV9lYXJseShkZXYpOworCisJcGNpX3BtX2RlZmF1bHRfcmVzdW1lX25vaXJxKHBjaV9kZXYpOworCisJaWYgKGRydiAmJiBkcnYtPnBtICYmIGRydi0+cG0tPnJlc3VtZV9ub2lycSkKKwkJZXJyb3IgPSBkcnYtPnBtLT5yZXN1bWVfbm9pcnEoZGV2KTsKKwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtNDUzLDM0ICs1OTAsMTUgQEAKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7Ci0JaW50IGVycm9yOwotCi0JcGNpX2ZpeHVwX2RldmljZShwY2lfZml4dXBfcmVzdW1lLCBwY2lfZGV2KTsKLQotCWlmIChkcnYgJiYgZHJ2LT5wbSkgewotCQllcnJvciA9IGRydi0+cG0tPnJlc3VtZSA/IGRydi0+cG0tPnJlc3VtZShkZXYpIDoKLQkJCXBjaV9kZWZhdWx0X3BtX3Jlc3VtZShwY2lfZGV2KTsKLQl9IGVsc2UgewotCQllcnJvciA9IHBjaV9sZWdhY3lfcmVzdW1lKGRldik7Ci0JfQotCi0JcmV0dXJuIGVycm9yOwotfQotCi1zdGF0aWMgaW50IHBjaV9wbV9yZXN1bWVfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gdG9fcGNpX2RldihkZXYpOwotCXN0cnVjdCBwY2lfZHJpdmVyICpkcnYgPSBwY2lfZGV2LT5kcml2ZXI7CiAJaW50IGVycm9yID0gMDsKIAotCXBjaV9maXh1cF9kZXZpY2UocGNpX2ZpeHVwX3Jlc3VtZV9lYXJseSwgcGNpX2Rldik7CisJaWYgKHBjaV9oYXNfbGVnYWN5X3BtX3N1cHBvcnQocGNpX2RldikpCisJCXJldHVybiBwY2lfbGVnYWN5X3Jlc3VtZShkZXYpOwogCi0JaWYgKGRydiAmJiBkcnYtPnBtKSB7Ci0JCWlmIChkcnYtPnBtLT5yZXN1bWVfbm9pcnEpCi0JCQllcnJvciA9IGRydi0+cG0tPnJlc3VtZV9ub2lycShkZXYpOwotCX0gZWxzZSB7Ci0JCWVycm9yID0gcGNpX2xlZ2FjeV9yZXN1bWVfZWFybHkoZGV2KTsKLQl9CisJZXJyb3IgPSBwY2lfcG1fZGVmYXVsdF9yZXN1bWUocGNpX2Rldik7CisKKwlpZiAoIWVycm9yICYmIGRydiAmJiBkcnYtPnBtICYmIGRydi0+cG0tPnJlc3VtZSkKKwkJZXJyb3IgPSBkcnYtPnBtLT5yZXN1bWUoZGV2KTsKIAogCXJldHVybiBlcnJvcjsKIH0KQEAgLTUwMiwxNDEgKzYyMCwxNDAgQEAKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CiAJaW50IGVycm9yID0gMDsKIAotCWlmIChkcnYgJiYgZHJ2LT5wbSkgewotCQlpZiAoZHJ2LT5wbS0+ZnJlZXplKSB7Ci0JCQllcnJvciA9IGRydi0+cG0tPmZyZWV6ZShkZXYpOwotCQkJc3VzcGVuZF9yZXBvcnRfcmVzdWx0KGRydi0+cG0tPmZyZWV6ZSwgZXJyb3IpOwotCQl9IGVsc2UgewotCQkJcGNpX2RlZmF1bHRfcG1fc3VzcGVuZChwY2lfZGV2KTsKLQkJfQotCX0gZWxzZSB7Ci0JCWVycm9yID0gcGNpX2xlZ2FjeV9zdXNwZW5kKGRldiwgUE1TR19GUkVFWkUpOwotCQlwY2lfZml4dXBfZGV2aWNlKHBjaV9maXh1cF9zdXNwZW5kLCBwY2lfZGV2KTsKKwlpZiAocGNpX2hhc19sZWdhY3lfcG1fc3VwcG9ydChwY2lfZGV2KSkKKwkJcmV0dXJuIHBjaV9sZWdhY3lfc3VzcGVuZChkZXYsIFBNU0dfRlJFRVpFKTsKKworCWlmIChkcnYgJiYgZHJ2LT5wbSAmJiBkcnYtPnBtLT5mcmVlemUpIHsKKwkJZXJyb3IgPSBkcnYtPnBtLT5mcmVlemUoZGV2KTsKKwkJc3VzcGVuZF9yZXBvcnRfcmVzdWx0KGRydi0+cG0tPmZyZWV6ZSwgZXJyb3IpOwogCX0KIAorCWlmICghZXJyb3IpCisJCXBjaV9wbV9kZWZhdWx0X3N1c3BlbmRfZ2VuZXJpYyhwY2lfZGV2KTsKKwogCXJldHVybiBlcnJvcjsKIH0KIAogc3RhdGljIGludCBwY2lfcG1fZnJlZXplX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKLQlzdHJ1Y3QgcGNpX2RyaXZlciAqZHJ2ID0gcGNpX2Rldi0+ZHJpdmVyOwotCWludCBlcnJvciA9IDA7Ci0KLQlpZiAoZHJ2ICYmIGRydi0+cG0pIHsKLQkJaWYgKGRydi0+cG0tPmZyZWV6ZV9ub2lycSkgewotCQkJZXJyb3IgPSBkcnYtPnBtLT5mcmVlemVfbm9pcnEoZGV2KTsKLQkJCXN1c3BlbmRfcmVwb3J0X3Jlc3VsdChkcnYtPnBtLT5mcmVlemVfbm9pcnEsIGVycm9yKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWVycm9yID0gcGNpX2xlZ2FjeV9zdXNwZW5kX2xhdGUoZGV2LCBQTVNHX0ZSRUVaRSk7Ci0JfQotCi0JcmV0dXJuIGVycm9yOwotfQotCi1zdGF0aWMgaW50IHBjaV9wbV90aGF3KHN0cnVjdCBkZXZpY2UgKmRldikKLXsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CiAJaW50IGVycm9yID0gMDsKIAotCWlmIChkcnYgJiYgZHJ2LT5wbSkgewotCQlpZiAoZHJ2LT5wbS0+dGhhdykKLQkJCWVycm9yID0gIGRydi0+cG0tPnRoYXcoZGV2KTsKLQl9IGVsc2UgewotCQlwY2lfZml4dXBfZGV2aWNlKHBjaV9maXh1cF9yZXN1bWUsIHRvX3BjaV9kZXYoZGV2KSk7Ci0JCWVycm9yID0gcGNpX2xlZ2FjeV9yZXN1bWUoZGV2KTsKKwlpZiAocGNpX2hhc19sZWdhY3lfcG1fc3VwcG9ydChwY2lfZGV2KSkKKwkJcmV0dXJuIHBjaV9sZWdhY3lfc3VzcGVuZF9sYXRlKGRldiwgUE1TR19GUkVFWkUpOworCisJaWYgKGRydiAmJiBkcnYtPnBtICYmIGRydi0+cG0tPmZyZWV6ZV9ub2lycSkgeworCQllcnJvciA9IGRydi0+cG0tPmZyZWV6ZV9ub2lycShkZXYpOworCQlzdXNwZW5kX3JlcG9ydF9yZXN1bHQoZHJ2LT5wbS0+ZnJlZXplX25vaXJxLCBlcnJvcik7CiAJfQogCisJaWYgKCFlcnJvcikKKwkJcGNpX3BtX3NldF91bmtub3duX3N0YXRlKHBjaV9kZXYpOworCiAJcmV0dXJuIGVycm9yOwogfQogCiBzdGF0aWMgaW50IHBjaV9wbV90aGF3X25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKLQlzdHJ1Y3QgcGNpX2RyaXZlciAqZHJ2ID0gcGNpX2Rldi0+ZHJpdmVyOworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKIAlpbnQgZXJyb3IgPSAwOwogCi0JaWYgKGRydiAmJiBkcnYtPnBtKSB7Ci0JCWlmIChkcnYtPnBtLT50aGF3X25vaXJxKQotCQkJZXJyb3IgPSBkcnYtPnBtLT50aGF3X25vaXJxKGRldik7Ci0JfSBlbHNlIHsKLQkJcGNpX2ZpeHVwX2RldmljZShwY2lfZml4dXBfcmVzdW1lX2Vhcmx5LCBwY2lfZGV2KTsKLQkJZXJyb3IgPSBwY2lfbGVnYWN5X3Jlc3VtZV9lYXJseShkZXYpOwotCX0KKwlpZiAocGNpX2hhc19sZWdhY3lfcG1fc3VwcG9ydChwY2lfZGV2KSkKKwkJcmV0dXJuIHBjaV9sZWdhY3lfcmVzdW1lX2Vhcmx5KGRldik7CisKKwlwY2lfdXBkYXRlX2N1cnJlbnRfc3RhdGUocGNpX2RldiwgUENJX0QwKTsKKworCWlmIChkcnYgJiYgZHJ2LT5wbSAmJiBkcnYtPnBtLT50aGF3X25vaXJxKQorCQllcnJvciA9IGRydi0+cG0tPnRoYXdfbm9pcnEoZGV2KTsKKworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBwY2lfcG1fdGhhdyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSB0b19wY2lfZGV2KGRldik7CisJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOworCWludCBlcnJvciA9IDA7CisKKwlpZiAocGNpX2hhc19sZWdhY3lfcG1fc3VwcG9ydChwY2lfZGV2KSkKKwkJcmV0dXJuIHBjaV9sZWdhY3lfcmVzdW1lKGRldik7CisKKwlwY2lfcG1fcmVlbmFibGVfZGV2aWNlKHBjaV9kZXYpOworCisJaWYgKGRydiAmJiBkcnYtPnBtICYmIGRydi0+cG0tPnRoYXcpCisJCWVycm9yID0gIGRydi0+cG0tPnRoYXcoZGV2KTsKIAogCXJldHVybiBlcnJvcjsKIH0KIAogc3RhdGljIGludCBwY2lfcG1fcG93ZXJvZmYoc3RydWN0IGRldmljZSAqZGV2KQogeworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gdG9fcGNpX2RldihkZXYpOwogCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKIAlpbnQgZXJyb3IgPSAwOwogCi0JcGNpX2ZpeHVwX2RldmljZShwY2lfZml4dXBfc3VzcGVuZCwgdG9fcGNpX2RldihkZXYpKTsKKwlpZiAocGNpX2hhc19sZWdhY3lfcG1fc3VwcG9ydChwY2lfZGV2KSkKKwkJcmV0dXJuIHBjaV9sZWdhY3lfc3VzcGVuZChkZXYsIFBNU0dfSElCRVJOQVRFKTsKIAotCWlmIChkcnYgJiYgZHJ2LT5wbSkgewotCQlpZiAoZHJ2LT5wbS0+cG93ZXJvZmYpIHsKLQkJCWVycm9yID0gZHJ2LT5wbS0+cG93ZXJvZmYoZGV2KTsKLQkJCXN1c3BlbmRfcmVwb3J0X3Jlc3VsdChkcnYtPnBtLT5wb3dlcm9mZiwgZXJyb3IpOwotCQl9Ci0JfSBlbHNlIHsKLQkJZXJyb3IgPSBwY2lfbGVnYWN5X3N1c3BlbmQoZGV2LCBQTVNHX0hJQkVSTkFURSk7CisJaWYgKGRydiAmJiBkcnYtPnBtICYmIGRydi0+cG0tPnBvd2Vyb2ZmKSB7CisJCWVycm9yID0gZHJ2LT5wbS0+cG93ZXJvZmYoZGV2KTsKKwkJc3VzcGVuZF9yZXBvcnRfcmVzdWx0KGRydi0+cG0tPnBvd2Vyb2ZmLCBlcnJvcik7CiAJfQogCisJaWYgKCFlcnJvcikKKwkJcGNpX3BtX2RlZmF1bHRfc3VzcGVuZChwY2lfZGV2KTsKKwogCXJldHVybiBlcnJvcjsKIH0KIAogc3RhdGljIGludCBwY2lfcG1fcG93ZXJvZmZfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gdG9fcGNpX2RldihkZXYpOwotCXN0cnVjdCBwY2lfZHJpdmVyICpkcnYgPSBwY2lfZGV2LT5kcml2ZXI7CisJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwogCWludCBlcnJvciA9IDA7CiAKLQlpZiAoZHJ2ICYmIGRydi0+cG0pIHsKLQkJaWYgKGRydi0+cG0tPnBvd2Vyb2ZmX25vaXJxKSB7Ci0JCQllcnJvciA9IGRydi0+cG0tPnBvd2Vyb2ZmX25vaXJxKGRldik7Ci0JCQlzdXNwZW5kX3JlcG9ydF9yZXN1bHQoZHJ2LT5wbS0+cG93ZXJvZmZfbm9pcnEsIGVycm9yKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWVycm9yID0gcGNpX2xlZ2FjeV9zdXNwZW5kX2xhdGUoZGV2LCBQTVNHX0hJQkVSTkFURSk7CisJaWYgKHBjaV9oYXNfbGVnYWN5X3BtX3N1cHBvcnQodG9fcGNpX2RldihkZXYpKSkKKwkJcmV0dXJuIHBjaV9sZWdhY3lfc3VzcGVuZF9sYXRlKGRldiwgUE1TR19ISUJFUk5BVEUpOworCisJaWYgKGRydiAmJiBkcnYtPnBtICYmIGRydi0+cG0tPnBvd2Vyb2ZmX25vaXJxKSB7CisJCWVycm9yID0gZHJ2LT5wbS0+cG93ZXJvZmZfbm9pcnEoZGV2KTsKKwkJc3VzcGVuZF9yZXBvcnRfcmVzdWx0KGRydi0+cG0tPnBvd2Vyb2ZmX25vaXJxLCBlcnJvcik7CiAJfQogCiAJcmV0dXJuIGVycm9yOwogfQogCitzdGF0aWMgaW50IHBjaV9wbV9yZXN0b3JlX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CisJaW50IGVycm9yID0gMDsKKworCWlmIChwY2lfaGFzX2xlZ2FjeV9wbV9zdXBwb3J0KHBjaV9kZXYpKQorCQlyZXR1cm4gcGNpX2xlZ2FjeV9yZXN1bWVfZWFybHkoZGV2KTsKKworCXBjaV9wbV9kZWZhdWx0X3Jlc3VtZV9ub2lycShwY2lfZGV2KTsKKworCWlmIChkcnYgJiYgZHJ2LT5wbSAmJiBkcnYtPnBtLT5yZXN0b3JlX25vaXJxKQorCQllcnJvciA9IGRydi0+cG0tPnJlc3RvcmVfbm9pcnEoZGV2KTsKKworCXJldHVybiBlcnJvcjsKK30KKwogc3RhdGljIGludCBwY2lfcG1fcmVzdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSB0b19wY2lfZGV2KGRldik7CiAJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwotCWludCBlcnJvcjsKLQotCWlmIChkcnYgJiYgZHJ2LT5wbSkgewotCQllcnJvciA9IGRydi0+cG0tPnJlc3RvcmUgPyBkcnYtPnBtLT5yZXN0b3JlKGRldikgOgotCQkJcGNpX2RlZmF1bHRfcG1fcmVzdW1lKHBjaV9kZXYpOwotCX0gZWxzZSB7Ci0JCWVycm9yID0gcGNpX2xlZ2FjeV9yZXN1bWUoZGV2KTsKLQl9Ci0JcGNpX2ZpeHVwX2RldmljZShwY2lfZml4dXBfcmVzdW1lLCBwY2lfZGV2KTsKLQotCXJldHVybiBlcnJvcjsKLX0KLQotc3RhdGljIGludCBwY2lfcG1fcmVzdG9yZV9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSB0b19wY2lfZGV2KGRldik7Ci0Jc3RydWN0IHBjaV9kcml2ZXIgKmRydiA9IHBjaV9kZXYtPmRyaXZlcjsKIAlpbnQgZXJyb3IgPSAwOwogCi0JcGNpX2ZpeHVwX2RldmljZShwY2lfZml4dXBfcmVzdW1lLCBwY2lfZGV2KTsKKwlpZiAocGNpX2hhc19sZWdhY3lfcG1fc3VwcG9ydChwY2lfZGV2KSkKKwkJcmV0dXJuIHBjaV9sZWdhY3lfcmVzdW1lKGRldik7CiAKLQlpZiAoZHJ2ICYmIGRydi0+cG0pIHsKLQkJaWYgKGRydi0+cG0tPnJlc3RvcmVfbm9pcnEpCi0JCQllcnJvciA9IGRydi0+cG0tPnJlc3RvcmVfbm9pcnEoZGV2KTsKLQl9IGVsc2UgewotCQllcnJvciA9IHBjaV9sZWdhY3lfcmVzdW1lX2Vhcmx5KGRldik7Ci0JfQotCXBjaV9maXh1cF9kZXZpY2UocGNpX2ZpeHVwX3Jlc3VtZV9lYXJseSwgcGNpX2Rldik7CisJZXJyb3IgPSBwY2lfcG1fZGVmYXVsdF9yZXN1bWUocGNpX2Rldik7CisKKwlpZiAoIWVycm9yICYmIGRydiAmJiBkcnYtPnBtICYmIGRydi0+cG0tPnJlc3RvcmUpCisJCWVycm9yID0gZHJ2LT5wbS0+cmVzdG9yZShkZXYpOwogCiAJcmV0dXJuIGVycm9yOwogfQpAQCAtNjU0LDE3ICs3NzEsMTUgQEAKIAogI2VuZGlmIC8qICFDT05GSUdfSElCRVJOQVRJT04gKi8KIAotc3RydWN0IHBtX2V4dF9vcHMgcGNpX3BtX29wcyA9IHsKLQkuYmFzZSA9IHsKLQkJLnByZXBhcmUgPSBwY2lfcG1fcHJlcGFyZSwKLQkJLmNvbXBsZXRlID0gcGNpX3BtX2NvbXBsZXRlLAotCQkuc3VzcGVuZCA9IHBjaV9wbV9zdXNwZW5kLAotCQkucmVzdW1lID0gcGNpX3BtX3Jlc3VtZSwKLQkJLmZyZWV6ZSA9IHBjaV9wbV9mcmVlemUsCi0JCS50aGF3ID0gcGNpX3BtX3RoYXcsCi0JCS5wb3dlcm9mZiA9IHBjaV9wbV9wb3dlcm9mZiwKLQkJLnJlc3RvcmUgPSBwY2lfcG1fcmVzdG9yZSwKLQl9LAorc3RydWN0IGRldl9wbV9vcHMgcGNpX2Rldl9wbV9vcHMgPSB7CisJLnByZXBhcmUgPSBwY2lfcG1fcHJlcGFyZSwKKwkuY29tcGxldGUgPSBwY2lfcG1fY29tcGxldGUsCisJLnN1c3BlbmQgPSBwY2lfcG1fc3VzcGVuZCwKKwkucmVzdW1lID0gcGNpX3BtX3Jlc3VtZSwKKwkuZnJlZXplID0gcGNpX3BtX2ZyZWV6ZSwKKwkudGhhdyA9IHBjaV9wbV90aGF3LAorCS5wb3dlcm9mZiA9IHBjaV9wbV9wb3dlcm9mZiwKKwkucmVzdG9yZSA9IHBjaV9wbV9yZXN0b3JlLAogCS5zdXNwZW5kX25vaXJxID0gcGNpX3BtX3N1c3BlbmRfbm9pcnEsCiAJLnJlc3VtZV9ub2lycSA9IHBjaV9wbV9yZXN1bWVfbm9pcnEsCiAJLmZyZWV6ZV9ub2lycSA9IHBjaV9wbV9mcmVlemVfbm9pcnEsCkBAIC02NzMsNyArNzg4LDcgQEAKIAkucmVzdG9yZV9ub2lycSA9IHBjaV9wbV9yZXN0b3JlX25vaXJxLAogfTsKIAotI2RlZmluZSBQQ0lfUE1fT1BTX1BUUgkmcGNpX3BtX29wcworI2RlZmluZSBQQ0lfUE1fT1BTX1BUUgkoJnBjaV9kZXZfcG1fb3BzKQogCiAjZWxzZSAvKiAhQ09ORklHX1BNX1NMRUVQICovCiAKQEAgLTcwMyw5ICs4MTgsNiBAQAogCWRydi0+ZHJpdmVyLm93bmVyID0gb3duZXI7CiAJZHJ2LT5kcml2ZXIubW9kX25hbWUgPSBtb2RfbmFtZTsKIAotCWlmIChkcnYtPnBtKQotCQlkcnYtPmRyaXZlci5wbSA9ICZkcnYtPnBtLT5iYXNlOwotCiAJc3Bpbl9sb2NrX2luaXQoJmRydi0+ZHluaWRzLmxvY2spOwogCUlOSVRfTElTVF9IRUFEKCZkcnYtPmR5bmlkcy5saXN0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLXN0dWIuYyBiL2RyaXZlcnMvcGNpL3BjaS1zdHViLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRmYmVjMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGNpL3BjaS1zdHViLmMKQEAgLTAsMCArMSw0NyBAQAorLyogcGNpLXN0dWIgLSBzaW1wbGUgc3R1YiBkcml2ZXIgdG8gcmVzZXJ2ZSBhIHBjaSBkZXZpY2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggUmVkIEhhdCwgSW5jLgorICogQXV0aG9yOgorICogCUNocmlzIFdyaWdodAorICoKKyAqIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwsIHZlcnNpb24gMi4KKyAqCisgKiBVc2FnZSBpcyBzaW1wbGUsIGFsbG9jYXRlIGEgbmV3IGlkIHRvIHRoZSBzdHViIGRyaXZlciBhbmQgYmluZCB0aGUKKyAqIGRldmljZSB0byBpdC4gIEZvciBleGFtcGxlOgorICogCisgKiAjIGVjaG8gIjgwODYgMTBmNSIgPiAvc3lzL2J1cy9wY2kvZHJpdmVycy9wY2ktc3R1Yi9uZXdfaWQKKyAqICMgZWNobyAtbiAwMDAwOjAwOjE5LjAgPiAvc3lzL2J1cy9wY2kvZHJpdmVycy9lMTAwMGUvdW5iaW5kCisgKiAjIGVjaG8gLW4gMDAwMDowMDoxOS4wID4gL3N5cy9idXMvcGNpL2RyaXZlcnMvcGNpLXN0dWIvYmluZAorICogIyBscyAtbCAvc3lzL2J1cy9wY2kvZGV2aWNlcy8wMDAwOjAwOjE5LjAvZHJpdmVyCisgKiAuLi4vMDAwMDowMDoxOS4wL2RyaXZlciAtPiAuLi8uLi8uLi9idXMvcGNpL2RyaXZlcnMvcGNpLXN0dWIKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKK3N0YXRpYyBpbnQgcGNpX3N0dWJfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgc3R1Yl9kcml2ZXIgPSB7CisJLm5hbWUJCT0gInBjaS1zdHViIiwKKwkuaWRfdGFibGUJPSBOVUxMLAkvKiBvbmx5IGR5bmFtaWMgaWQncyAqLworCS5wcm9iZQkJPSBwY2lfc3R1Yl9wcm9iZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBjaV9zdHViX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmc3R1Yl9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcGNpX3N0dWJfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmc3R1Yl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChwY2lfc3R1Yl9pbml0KTsKK21vZHVsZV9leGl0KHBjaV9zdHViX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJDaHJpcyBXcmlnaHQgPGNocmlzd0Bzb3VzLXNvbC5vcmc+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2ktc3lzZnMuYyBiL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jCmluZGV4IGM4ODQ4NTguLmMyMzYxOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jCkBAIC01OCwxMyArNTgsMTQgQEAKIAkJCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2KTsKLQlzc2l6ZV90IGNvbnN1bWVkID0gLUVJTlZBTDsKKwl1bnNpZ25lZCBsb25nIHZhbDsKIAotCWlmICgoY291bnQgPiAwKSAmJiAoKmJ1ZiA9PSAnMCcgfHwgKmJ1ZiA9PSAnMScpKSB7Ci0JCXBkZXYtPmJyb2tlbl9wYXJpdHlfc3RhdHVzID0gKmJ1ZiA9PSAnMScgPyAxIDogMDsKLQkJY29uc3VtZWQgPSBjb3VudDsKLQl9Ci0JcmV0dXJuIGNvbnN1bWVkOworCWlmIChzdHJpY3Rfc3RydG91bChidWYsIDAsICZ2YWwpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwZGV2LT5icm9rZW5fcGFyaXR5X3N0YXR1cyA9ICEhdmFsOworCisJcmV0dXJuIGNvdW50OwogfQogCiBzdGF0aWMgc3NpemVfdCBsb2NhbF9jcHVzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LApAQCAtMTAxLDExICsxMDIsMTMgQEAKIAlzdHJ1Y3QgcGNpX2RldiAqIHBjaV9kZXYgPSB0b19wY2lfZGV2KGRldik7CiAJY2hhciAqIHN0ciA9IGJ1ZjsKIAlpbnQgaTsKLQlpbnQgbWF4ID0gNzsKKwlpbnQgbWF4OwogCXJlc291cmNlX3NpemVfdCBzdGFydCwgZW5kOwogCiAJaWYgKHBjaV9kZXYtPnN1Ym9yZGluYXRlKQogCQltYXggPSBERVZJQ0VfQ09VTlRfUkVTT1VSQ0U7CisJZWxzZQorCQltYXggPSBQQ0lfQlJJREdFX1JFU09VUkNFUzsKIAogCWZvciAoaSA9IDA7IGkgPCBtYXg7IGkrKykgewogCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9ICAmcGNpX2Rldi0+cmVzb3VyY2VbaV07CkBAIC0xMzMsMTkgKzEzNiwyMyBAQAogCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsCiAJCQkJc2l6ZV90IGNvdW50KQogewotCXNzaXplX3QgcmVzdWx0ID0gLUVJTlZBTDsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwlzc2l6ZV90IHJlc3VsdCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMCwgJnZhbCk7CisKKwlpZiAocmVzdWx0IDwgMCkKKwkJcmV0dXJuIHJlc3VsdDsKIAogCS8qIHRoaXMgY2FuIGNyYXNoIHRoZSBtYWNoaW5lIHdoZW4gZG9uZSBvbiB0aGUgIndyb25nIiBkZXZpY2UgKi8KIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCi0JCXJldHVybiBjb3VudDsKKwkJcmV0dXJuIC1FUEVSTTsKIAotCWlmICgqYnVmID09ICcwJykgeworCWlmICghdmFsKSB7CiAJCWlmIChhdG9taWNfcmVhZCgmcGRldi0+ZW5hYmxlX2NudCkgIT0gMCkKIAkJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIAkJZWxzZQogCQkJcmVzdWx0ID0gLUVJTzsKLQl9IGVsc2UgaWYgKCpidWYgPT0gJzEnKQorCX0gZWxzZQogCQlyZXN1bHQgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKIAogCXJldHVybiByZXN1bHQgPCAwID8gcmVzdWx0IDogY291bnQ7CkBAIC0xODUsMjUgKzE5MiwyOCBAQAogCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOworCXVuc2lnbmVkIGxvbmcgdmFsOworCisJaWYgKHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMCwgJnZhbCkgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIGJhZCB0aGluZ3MgbWF5IGhhcHBlbiBpZiB0aGUgbm9fbXNpIGZsYWcgaXMgY2hhbmdlZAogCSAqIHdoaWxlIHNvbWUgZHJpdmVycyBhcmUgbG9hZGVkICovCiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQotCQlyZXR1cm4gY291bnQ7CisJCXJldHVybiAtRVBFUk07CiAKKwkvKiBNYXliZSBwY2kgZGV2aWNlcyB3aXRob3V0IHN1Ym9yZGluYXRlIGJ1c3NlcyBzaG91bGRuJ3QgZXZlbiBoYXZlIHRoaXMKKwkgKiBhdHRyaWJ1dGUgaW4gdGhlIGZpcnN0IHBsYWNlPyAgKi8KIAlpZiAoIXBkZXYtPnN1Ym9yZGluYXRlKQogCQlyZXR1cm4gY291bnQ7CiAKLQlpZiAoKmJ1ZiA9PSAnMCcpIHsKLQkJcGRldi0+c3Vib3JkaW5hdGUtPmJ1c19mbGFncyB8PSBQQ0lfQlVTX0ZMQUdTX05PX01TSTsKLQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImZvcmNlZCBzdWJvcmRpbmF0ZSBidXMgdG8gbm90IHN1cHBvcnQgTVNJLCIKLQkJCSAiIGJhZCB0aGluZ3MgY291bGQgaGFwcGVuLlxuIik7Ci0JfQorCS8qIElzIHRoZSBmbGFnIGdvaW5nIHRvIGNoYW5nZSwgb3Iga2VlcCB0aGUgdmFsdWUgaXQgYWxyZWFkeSBoYWQ/ICovCisJaWYgKCEocGRldi0+c3Vib3JkaW5hdGUtPmJ1c19mbGFncyAmIFBDSV9CVVNfRkxBR1NfTk9fTVNJKSBeCisJICAgICEhdmFsKSB7CisJCXBkZXYtPnN1Ym9yZGluYXRlLT5idXNfZmxhZ3MgXj0gUENJX0JVU19GTEFHU19OT19NU0k7CiAKLQlpZiAoKmJ1ZiA9PSAnMScpIHsKLQkJcGRldi0+c3Vib3JkaW5hdGUtPmJ1c19mbGFncyAmPSB+UENJX0JVU19GTEFHU19OT19NU0k7Ci0JCWRldl93YXJuKCZwZGV2LT5kZXYsICJmb3JjZWQgc3Vib3JkaW5hdGUgYnVzIHRvIHN1cHBvcnQgTVNJLCIKLQkJCSAiIGJhZCB0aGluZ3MgY291bGQgaGFwcGVuLlxuIik7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJmb3JjZWQgc3Vib3JkaW5hdGUgYnVzIHRvJXMgc3VwcG9ydCBNU0ksIgorCQkJICIgYmFkIHRoaW5ncyBjb3VsZCBoYXBwZW5cbiIsIHZhbCA/ICIiIDogIiBub3QiKTsKIAl9CiAKIAlyZXR1cm4gY291bnQ7CkBAIC0zNjEsNTUgKzM3MSwzMyBAQAogfQogCiBzdGF0aWMgc3NpemVfdAotcGNpX3JlYWRfdnBkKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsCi0JICAgICBjaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0KLQkJdG9fcGNpX2Rldihjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaikpOwotCWludCBlbmQ7Ci0JaW50IHJldDsKLQotCWlmIChvZmYgPiBiaW5fYXR0ci0+c2l6ZSkKLQkJY291bnQgPSAwOwotCWVsc2UgaWYgKGNvdW50ID4gYmluX2F0dHItPnNpemUgLSBvZmYpCi0JCWNvdW50ID0gYmluX2F0dHItPnNpemUgLSBvZmY7Ci0JZW5kID0gb2ZmICsgY291bnQ7Ci0KLQl3aGlsZSAob2ZmIDwgZW5kKSB7Ci0JCXJldCA9IGRldi0+dnBkLT5vcHMtPnJlYWQoZGV2LCBvZmYsIGVuZCAtIG9mZiwgYnVmKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCQlidWYgKz0gcmV0OwotCQlvZmYgKz0gcmV0OwotCX0KLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3QKLXBjaV93cml0ZV92cGQoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKK3JlYWRfdnBkX2F0dHIoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKIAkgICAgICBjaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0KIAkJdG9fcGNpX2Rldihjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaikpOwotCWludCBlbmQ7Ci0JaW50IHJldDsKIAogCWlmIChvZmYgPiBiaW5fYXR0ci0+c2l6ZSkKIAkJY291bnQgPSAwOwogCWVsc2UgaWYgKGNvdW50ID4gYmluX2F0dHItPnNpemUgLSBvZmYpCiAJCWNvdW50ID0gYmluX2F0dHItPnNpemUgLSBvZmY7Ci0JZW5kID0gb2ZmICsgY291bnQ7CiAKLQl3aGlsZSAob2ZmIDwgZW5kKSB7Ci0JCXJldCA9IGRldi0+dnBkLT5vcHMtPndyaXRlKGRldiwgb2ZmLCBlbmQgLSBvZmYsIGJ1Zik7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKLQkJYnVmICs9IHJldDsKLQkJb2ZmICs9IHJldDsKLQl9CisJcmV0dXJuIHBjaV9yZWFkX3ZwZChkZXYsIG9mZiwgY291bnQsIGJ1Zik7Cit9CiAKLQlyZXR1cm4gY291bnQ7CitzdGF0aWMgc3NpemVfdAord3JpdGVfdnBkX2F0dHIoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKKwkgICAgICAgY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9CisJCXRvX3BjaV9kZXYoY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopKTsKKworCWlmIChvZmYgPiBiaW5fYXR0ci0+c2l6ZSkKKwkJY291bnQgPSAwOworCWVsc2UgaWYgKGNvdW50ID4gYmluX2F0dHItPnNpemUgLSBvZmYpCisJCWNvdW50ID0gYmluX2F0dHItPnNpemUgLSBvZmY7CisKKwlyZXR1cm4gcGNpX3dyaXRlX3ZwZChkZXYsIG9mZiwgY291bnQsIGJ1Zik7CiB9CiAKICNpZmRlZiBIQVZFX1BDSV9MRUdBQ1kKQEAgLTU2OSw3ICs1NTcsNyBAQAogCiAjaWZkZWYgSEFWRV9QQ0lfTU1BUAogCi1zdGF0aWMgaW50IHBjaV9tbWFwX2ZpdHMoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCByZXNubywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCitpbnQgcGNpX21tYXBfZml0cyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IHJlc25vLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAl1bnNpZ25lZCBsb25nIG5yLCBzdGFydCwgc2l6ZTsKIApAQCAtNjIwLDYgKzYwOCw5IEBACiAJdm1hLT52bV9wZ29mZiArPSBzdGFydCA+PiBQQUdFX1NISUZUOwogCW1tYXBfdHlwZSA9IHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSA/IHBjaV9tbWFwX21lbSA6IHBjaV9tbWFwX2lvOwogCisJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSAmJiBpb21lbV9pc19leGNsdXNpdmUoc3RhcnQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCXJldHVybiBwY2lfbW1hcF9wYWdlX3JhbmdlKHBkZXYsIHZtYSwgbW1hcF90eXBlLCB3cml0ZV9jb21iaW5lKTsKIH0KIApAQCAtODMyLDggKzgyMyw4IEBACiAJCWF0dHItPnNpemUgPSBkZXYtPnZwZC0+bGVuOwogCQlhdHRyLT5hdHRyLm5hbWUgPSAidnBkIjsKIAkJYXR0ci0+YXR0ci5tb2RlID0gU19JUlVTUiB8IFNfSVdVU1I7Ci0JCWF0dHItPnJlYWQgPSBwY2lfcmVhZF92cGQ7Ci0JCWF0dHItPndyaXRlID0gcGNpX3dyaXRlX3ZwZDsKKwkJYXR0ci0+cmVhZCA9IHJlYWRfdnBkX2F0dHI7CisJCWF0dHItPndyaXRlID0gd3JpdGVfdnBkX2F0dHI7CiAJCXJldHZhbCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmZGV2LT5kZXYua29iaiwgYXR0cik7CiAJCWlmIChyZXR2YWwpIHsKIAkJCWtmcmVlKGRldi0+dnBkLT5hdHRyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS5jIGIvZHJpdmVycy9wY2kvcGNpLmMKaW5kZXggMDYxZDFlZS4uYzEyZjZjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpLmMKQEAgLTU2LDYgKzU2LDIyIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwY2lfYnVzX21heF9idXNucik7CiAKKyNpZmRlZiBDT05GSUdfSEFTX0lPTUVNCit2b2lkIF9faW9tZW0gKnBjaV9pb3JlbWFwX2JhcihzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGJhcikKK3sKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGUgQkFSIGlzIGFjdHVhbGx5IGEgbWVtb3J5IHJlc291cmNlLCBub3QgYW4gSU8gcmVzb3VyY2UKKwkgKi8KKwlpZiAoIShwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgYmFyKSAmIElPUkVTT1VSQ0VfTUVNKSkgeworCQlXQVJOX09OKDEpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGlvcmVtYXBfbm9jYWNoZShwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgYmFyKSwKKwkJCQkgICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgYmFyKSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwY2lfaW9yZW1hcF9iYXIpOworI2VuZGlmCisKICNpZiAwCiAvKioKICAqIHBjaV9tYXhfYnVzbnIgLSByZXR1cm5zIG1heGltdW0gUENJIGJ1cyBudW1iZXIKQEAgLTM2MCwyNSArMzc2LDEwIEBACiBzdGF0aWMgdm9pZAogcGNpX3Jlc3RvcmVfYmFycyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCWludCBpLCBudW1yZXM7CisJaW50IGk7CiAKLQlzd2l0Y2ggKGRldi0+aGRyX3R5cGUpIHsKLQljYXNlIFBDSV9IRUFERVJfVFlQRV9OT1JNQUw6Ci0JCW51bXJlcyA9IDY7Ci0JCWJyZWFrOwotCWNhc2UgUENJX0hFQURFUl9UWVBFX0JSSURHRToKLQkJbnVtcmVzID0gMjsKLQkJYnJlYWs7Ci0JY2FzZSBQQ0lfSEVBREVSX1RZUEVfQ0FSREJVUzoKLQkJbnVtcmVzID0gMTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJLyogU2hvdWxkIG5ldmVyIGdldCBoZXJlLCBidXQganVzdCBpbiBjYXNlLi4uICovCi0JCXJldHVybjsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtcmVzOyBpICsrKQotCQlwY2lfdXBkYXRlX3Jlc291cmNlKGRldiwgJmRldi0+cmVzb3VyY2VbaV0sIGkpOworCWZvciAoaSA9IDA7IGkgPCBQQ0lfQlJJREdFX1JFU09VUkNFUzsgaSsrKQorCQlwY2lfdXBkYXRlX3Jlc291cmNlKGRldiwgaSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX3BsYXRmb3JtX3BtX29wcyAqcGNpX3BsYXRmb3JtX3BtOwpAQCAtNTI0LDE0ICs1MjUsMTcgQEAKICAqIHBjaV91cGRhdGVfY3VycmVudF9zdGF0ZSAtIFJlYWQgUENJIHBvd2VyIHN0YXRlIG9mIGdpdmVuIGRldmljZSBmcm9tIGl0cwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJIFBNIHJlZ2lzdGVycyBhbmQgY2FjaGUgaXQKICAqIEBkZXY6IFBDSSBkZXZpY2UgdG8gaGFuZGxlLgorICogQHN0YXRlOiBTdGF0ZSB0byBjYWNoZSBpbiBjYXNlIHRoZSBkZXZpY2UgZG9lc24ndCBoYXZlIHRoZSBQTSBjYXBhYmlsaXR5CiAgKi8KLXN0YXRpYyB2b2lkIHBjaV91cGRhdGVfY3VycmVudF9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQordm9pZCBwY2lfdXBkYXRlX2N1cnJlbnRfc3RhdGUoc3RydWN0IHBjaV9kZXYgKmRldiwgcGNpX3Bvd2VyX3Qgc3RhdGUpCiB7CiAJaWYgKGRldi0+cG1fY2FwKSB7CiAJCXUxNiBwbWNzcjsKIAogCQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIGRldi0+cG1fY2FwICsgUENJX1BNX0NUUkwsICZwbWNzcik7CiAJCWRldi0+Y3VycmVudF9zdGF0ZSA9IChwbWNzciAmIFBDSV9QTV9DVFJMX1NUQVRFX01BU0spOworCX0gZWxzZSB7CisJCWRldi0+Y3VycmVudF9zdGF0ZSA9IHN0YXRlOwogCX0KIH0KIApAQCAtNTc0LDcgKzU3OCw3IEBACiAJCSAqLwogCQlpbnQgcmV0ID0gcGxhdGZvcm1fcGNpX3NldF9wb3dlcl9zdGF0ZShkZXYsIFBDSV9EMCk7CiAJCWlmICghcmV0KQotCQkJcGNpX3VwZGF0ZV9jdXJyZW50X3N0YXRlKGRldik7CisJCQlwY2lfdXBkYXRlX2N1cnJlbnRfc3RhdGUoZGV2LCBQQ0lfRDApOwogCX0KIAkvKiBUaGlzIGRldmljZSBpcyBxdWlya2VkIG5vdCB0byBiZSBwdXQgaW50byBEMywgc28KIAkgICBkb24ndCBwdXQgaXQgaW4gRDMgKi8KQEAgLTU4Nyw3ICs1OTEsNyBAQAogCQkvKiBBbGxvdyB0aGUgcGxhdGZvcm0gdG8gZmluYWxpemUgdGhlIHRyYW5zaXRpb24gKi8KIAkJaW50IHJldCA9IHBsYXRmb3JtX3BjaV9zZXRfcG93ZXJfc3RhdGUoZGV2LCBzdGF0ZSk7CiAJCWlmICghcmV0KSB7Ci0JCQlwY2lfdXBkYXRlX2N1cnJlbnRfc3RhdGUoZGV2KTsKKwkJCXBjaV91cGRhdGVfY3VycmVudF9zdGF0ZShkZXYsIHN0YXRlKTsKIAkJCWVycm9yID0gMDsKIAkJfQogCX0KQEAgLTY0MCwxOSArNjQ0LDE0IEBACiAJaW50IHBvcywgaSA9IDA7CiAJc3RydWN0IHBjaV9jYXBfc2F2ZWRfc3RhdGUgKnNhdmVfc3RhdGU7CiAJdTE2ICpjYXA7Ci0JaW50IGZvdW5kID0gMDsKIAogCXBvcyA9IHBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LCBQQ0lfQ0FQX0lEX0VYUCk7CiAJaWYgKHBvcyA8PSAwKQogCQlyZXR1cm4gMDsKIAogCXNhdmVfc3RhdGUgPSBwY2lfZmluZF9zYXZlZF9jYXAoZGV2LCBQQ0lfQ0FQX0lEX0VYUCk7Ci0JaWYgKCFzYXZlX3N0YXRlKQotCQlzYXZlX3N0YXRlID0ga3phbGxvYyhzaXplb2YoKnNhdmVfc3RhdGUpICsgc2l6ZW9mKHUxNikgKiA0LCBHRlBfS0VSTkVMKTsKLQllbHNlCi0JCWZvdW5kID0gMTsKIAlpZiAoIXNhdmVfc3RhdGUpIHsKLQkJZGV2X2VycigmZGV2LT5kZXYsICJvdXQgb2YgbWVtb3J5IGluIHBjaV9zYXZlX3BjaWVfc3RhdGVcbiIpOworCQlkZXZfZXJyKCZkZXYtPmRldiwgImJ1ZmZlciBub3QgZm91bmQgaW4gJXNcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAljYXAgPSAodTE2ICopJnNhdmVfc3RhdGUtPmRhdGFbMF07CkBAIC02NjEsOSArNjYwLDcgQEAKIAlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIHBvcyArIFBDSV9FWFBfTE5LQ1RMLCAmY2FwW2krK10pOwogCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgcG9zICsgUENJX0VYUF9TTFRDVEwsICZjYXBbaSsrXSk7CiAJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBwb3MgKyBQQ0lfRVhQX1JUQ1RMLCAmY2FwW2krK10pOwotCXNhdmVfc3RhdGUtPmNhcF9uciA9IFBDSV9DQVBfSURfRVhQOwotCWlmICghZm91bmQpCi0JCXBjaV9hZGRfc2F2ZWRfY2FwKGRldiwgc2F2ZV9zdGF0ZSk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjg4LDMwICs2ODUsMjEgQEAKIAogc3RhdGljIGludCBwY2lfc2F2ZV9wY2l4X3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7Ci0JaW50IHBvcywgaSA9IDA7CisJaW50IHBvczsKIAlzdHJ1Y3QgcGNpX2NhcF9zYXZlZF9zdGF0ZSAqc2F2ZV9zdGF0ZTsKLQl1MTYgKmNhcDsKLQlpbnQgZm91bmQgPSAwOwogCiAJcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfUENJWCk7CiAJaWYgKHBvcyA8PSAwKQogCQlyZXR1cm4gMDsKIAogCXNhdmVfc3RhdGUgPSBwY2lfZmluZF9zYXZlZF9jYXAoZGV2LCBQQ0lfQ0FQX0lEX1BDSVgpOwotCWlmICghc2F2ZV9zdGF0ZSkKLQkJc2F2ZV9zdGF0ZSA9IGt6YWxsb2Moc2l6ZW9mKCpzYXZlX3N0YXRlKSArIHNpemVvZih1MTYpLCBHRlBfS0VSTkVMKTsKLQllbHNlCi0JCWZvdW5kID0gMTsKIAlpZiAoIXNhdmVfc3RhdGUpIHsKLQkJZGV2X2VycigmZGV2LT5kZXYsICJvdXQgb2YgbWVtb3J5IGluIHBjaV9zYXZlX3BjaWVfc3RhdGVcbiIpOworCQlkZXZfZXJyKCZkZXYtPmRldiwgImJ1ZmZlciBub3QgZm91bmQgaW4gJXNcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQljYXAgPSAodTE2ICopJnNhdmVfc3RhdGUtPmRhdGFbMF07CiAKLQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIHBvcyArIFBDSV9YX0NNRCwgJmNhcFtpKytdKTsKLQlzYXZlX3N0YXRlLT5jYXBfbnIgPSBQQ0lfQ0FQX0lEX1BDSVg7Ci0JaWYgKCFmb3VuZCkKLQkJcGNpX2FkZF9zYXZlZF9jYXAoZGV2LCBzYXZlX3N0YXRlKTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIHBvcyArIFBDSV9YX0NNRCwgKHUxNiAqKXNhdmVfc3RhdGUtPmRhdGEpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTk4Miw2ICs5NzAsMzIgQEAKICAqLwogdm9pZCBfX2F0dHJpYnV0ZV9fICgod2VhaykpIHBjaWJpb3NfZGlzYWJsZV9kZXZpY2UgKHN0cnVjdCBwY2lfZGV2ICpkZXYpIHt9CiAKK3N0YXRpYyB2b2lkIGRvX3BjaV9kaXNhYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXUxNiBwY2lfY29tbWFuZDsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZwY2lfY29tbWFuZCk7CisJaWYgKHBjaV9jb21tYW5kICYgUENJX0NPTU1BTkRfTUFTVEVSKSB7CisJCXBjaV9jb21tYW5kICY9IH5QQ0lfQ09NTUFORF9NQVNURVI7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCBwY2lfY29tbWFuZCk7CisJfQorCisJcGNpYmlvc19kaXNhYmxlX2RldmljZShkZXYpOworfQorCisvKioKKyAqIHBjaV9kaXNhYmxlX2VuYWJsZWRfZGV2aWNlIC0gRGlzYWJsZSBkZXZpY2Ugd2l0aG91dCB1cGRhdGluZyBlbmFibGVfY250CisgKiBAZGV2OiBQQ0kgZGV2aWNlIHRvIGRpc2FibGUKKyAqCisgKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIGEgYmFja2VuZCBvZiBQQ0kgcG93ZXIgbWFuYWdlbWVudCByb3V0aW5lcyBhbmQgaXMKKyAqIG5vdCBzdXBwb3NlZCB0byBiZSBjYWxsZWQgZHJpdmVycy4KKyAqLwordm9pZCBwY2lfZGlzYWJsZV9lbmFibGVkX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWlmIChhdG9taWNfcmVhZCgmZGV2LT5lbmFibGVfY250KSkKKwkJZG9fcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7Cit9CisKIC8qKgogICogcGNpX2Rpc2FibGVfZGV2aWNlIC0gRGlzYWJsZSBQQ0kgZGV2aWNlIGFmdGVyIHVzZQogICogQGRldjogUENJIGRldmljZSB0byBiZSBkaXNhYmxlZApAQCAtOTk2LDcgKzEwMTAsNiBAQAogcGNpX2Rpc2FibGVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJc3RydWN0IHBjaV9kZXZyZXMgKmRyOwotCXUxNiBwY2lfY29tbWFuZDsKIAogCWRyID0gZmluZF9wY2lfZHIoZGV2KTsKIAlpZiAoZHIpCkBAIC0xMDA1LDE0ICsxMDE4LDkgQEAKIAlpZiAoYXRvbWljX3N1Yl9yZXR1cm4oMSwgJmRldi0+ZW5hYmxlX2NudCkgIT0gMCkKIAkJcmV0dXJuOwogCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJnBjaV9jb21tYW5kKTsKLQlpZiAocGNpX2NvbW1hbmQgJiBQQ0lfQ09NTUFORF9NQVNURVIpIHsKLQkJcGNpX2NvbW1hbmQgJj0gflBDSV9DT01NQU5EX01BU1RFUjsKLQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsIHBjaV9jb21tYW5kKTsKLQl9Ci0JZGV2LT5pc19idXNtYXN0ZXIgPSAwOworCWRvX3BjaV9kaXNhYmxlX2RldmljZShkZXYpOwogCi0JcGNpYmlvc19kaXNhYmxlX2RldmljZShkZXYpOworCWRldi0+aXNfYnVzbWFzdGVyID0gMDsKIH0KIAogLyoqCkBAIC0xMTA3LDcgKzExMTUsNyBAQAogCWludCBlcnJvciA9IDA7CiAJYm9vbCBwbWVfZG9uZSA9IGZhbHNlOwogCi0JaWYgKCFkZXZpY2VfbWF5X3dha2V1cCgmZGV2LT5kZXYpKQorCWlmIChlbmFibGUgJiYgIWRldmljZV9tYXlfd2FrZXVwKCZkZXYtPmRldikpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyoKQEAgLTEyNTIsMTQgKzEyNjAsMTUgQEAKIAkvKiBmaW5kIFBDSSBQTSBjYXBhYmlsaXR5IGluIGxpc3QgKi8KIAlwbSA9IHBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LCBQQ0lfQ0FQX0lEX1BNKTsKIAlpZiAoIXBtKQotCQlyZXR1cm47CisJCWdvdG8gRXhpdDsKKwogCS8qIENoZWNrIGRldmljZSdzIGFiaWxpdHkgdG8gZ2VuZXJhdGUgUE1FIyAqLwogCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgcG0gKyBQQ0lfUE1fUE1DLCAmcG1jKTsKIAogCWlmICgocG1jICYgUENJX1BNX0NBUF9WRVJfTUFTSykgPiAzKSB7CiAJCWRldl9lcnIoJmRldi0+ZGV2LCAidW5zdXBwb3J0ZWQgUE0gY2FwIHJlZ3MgdmVyc2lvbiAoJXUpXG4iLAogCQkJcG1jICYgUENJX1BNX0NBUF9WRVJfTUFTSyk7Ci0JCXJldHVybjsKKwkJZ290byBFeGl0OwogCX0KIAogCWRldi0+cG1fY2FwID0gcG07CkBAIC0xMjk4LDYgKzEzMDcsNzQgQEAKIAl9IGVsc2UgewogCQlkZXYtPnBtZV9zdXBwb3J0ID0gMDsKIAl9CisKKyBFeGl0OgorCXBjaV91cGRhdGVfY3VycmVudF9zdGF0ZShkZXYsIFBDSV9EMCk7Cit9CisKKy8qKgorICogcGxhdGZvcm1fcGNpX3dha2V1cF9pbml0IC0gaW5pdCBwbGF0Zm9ybSB3YWtldXAgaWYgcHJlc2VudAorICogQGRldjogUENJIGRldmljZQorICoKKyAqIFNvbWUgZGV2aWNlcyBkb24ndCBoYXZlIFBDSSBQTSBjYXBzIGJ1dCBjYW4gc3RpbGwgZ2VuZXJhdGUgd2FrZXVwCisgKiBldmVudHMgdGhyb3VnaCBwbGF0Zm9ybSBtZXRob2RzIChsaWtlIEFDUEkgZXZlbnRzKS4gIElmIEBkZXYgc3VwcG9ydHMKKyAqIHBsYXRmb3JtIHdha2V1cCBldmVudHMsIHNldCB0aGUgZGV2aWNlIGZsYWcgdG8gaW5kaWNhdGUgYXMgbXVjaC4gIFRoaXMKKyAqIG1heSBiZSByZWR1bmRhbnQgaWYgdGhlIGRldmljZSBhbHNvIHN1cHBvcnRzIFBDSSBQTSBjYXBzLCBidXQgZG91YmxlCisgKiBpbml0aWFsaXphdGlvbiBzaG91bGQgYmUgc2FmZSBpbiB0aGF0IGNhc2UuCisgKi8KK3ZvaWQgcGxhdGZvcm1fcGNpX3dha2V1cF9pbml0KHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaWYgKCFwbGF0Zm9ybV9wY2lfY2FuX3dha2V1cChkZXYpKQorCQlyZXR1cm47CisKKwlkZXZpY2Vfc2V0X3dha2V1cF9jYXBhYmxlKCZkZXYtPmRldiwgdHJ1ZSk7CisJZGV2aWNlX3NldF93YWtldXBfZW5hYmxlKCZkZXYtPmRldiwgZmFsc2UpOworCXBsYXRmb3JtX3BjaV9zbGVlcF93YWtlKGRldiwgZmFsc2UpOworfQorCisvKioKKyAqIHBjaV9hZGRfc2F2ZV9idWZmZXIgLSBhbGxvY2F0ZSBidWZmZXIgZm9yIHNhdmluZyBnaXZlbiBjYXBhYmlsaXR5IHJlZ2lzdGVycworICogQGRldjogdGhlIFBDSSBkZXZpY2UKKyAqIEBjYXA6IHRoZSBjYXBhYmlsaXR5IHRvIGFsbG9jYXRlIHRoZSBidWZmZXIgZm9yCisgKiBAc2l6ZTogcmVxdWVzdGVkIHNpemUgb2YgdGhlIGJ1ZmZlcgorICovCitzdGF0aWMgaW50IHBjaV9hZGRfY2FwX3NhdmVfYnVmZmVyKAorCXN0cnVjdCBwY2lfZGV2ICpkZXYsIGNoYXIgY2FwLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwlpbnQgcG9zOworCXN0cnVjdCBwY2lfY2FwX3NhdmVkX3N0YXRlICpzYXZlX3N0YXRlOworCisJcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIGNhcCk7CisJaWYgKHBvcyA8PSAwKQorCQlyZXR1cm4gMDsKKworCXNhdmVfc3RhdGUgPSBremFsbG9jKHNpemVvZigqc2F2ZV9zdGF0ZSkgKyBzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNhdmVfc3RhdGUpCisJCXJldHVybiAtRU5PTUVNOworCisJc2F2ZV9zdGF0ZS0+Y2FwX25yID0gY2FwOworCXBjaV9hZGRfc2F2ZWRfY2FwKGRldiwgc2F2ZV9zdGF0ZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBwY2lfYWxsb2NhdGVfY2FwX3NhdmVfYnVmZmVycyAtIGFsbG9jYXRlIGJ1ZmZlcnMgZm9yIHNhdmluZyBjYXBhYmlsaXRpZXMKKyAqIEBkZXY6IHRoZSBQQ0kgZGV2aWNlCisgKi8KK3ZvaWQgcGNpX2FsbG9jYXRlX2NhcF9zYXZlX2J1ZmZlcnMoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IHBjaV9hZGRfY2FwX3NhdmVfYnVmZmVyKGRldiwgUENJX0NBUF9JRF9FWFAsIDQgKiBzaXplb2YodTE2KSk7CisJaWYgKGVycm9yKQorCQlkZXZfZXJyKCZkZXYtPmRldiwKKwkJCSJ1bmFibGUgdG8gcHJlYWxsb2NhdGUgUENJIEV4cHJlc3Mgc2F2ZSBidWZmZXJcbiIpOworCisJZXJyb3IgPSBwY2lfYWRkX2NhcF9zYXZlX2J1ZmZlcihkZXYsIFBDSV9DQVBfSURfUENJWCwgc2l6ZW9mKHUxNikpOworCWlmIChlcnJvcikKKwkJZGV2X2VycigmZGV2LT5kZXYsCisJCQkidW5hYmxlIHRvIHByZWFsbG9jYXRlIFBDSS1YIHNhdmUgYnVmZmVyXG4iKTsKIH0KIAogLyoqCkBAIC0xMzM3LDYgKzE0MTQsMjAgQEAKIAlicmlkZ2UtPmFyaV9lbmFibGVkID0gMTsKIH0KIAorLyoqCisgKiBwY2lfc3dpenpsZV9pbnRlcnJ1cHRfcGluIC0gc3dpenpsZSBJTlR4IGZvciBkZXZpY2UgYmVoaW5kIGJyaWRnZQorICogQGRldjogdGhlIFBDSSBkZXZpY2UKKyAqIEBwaW46IHRoZSBJTlR4IHBpbiAoMT1JTlRBLCAyPUlOVEIsIDM9SU5URCwgND1JTlREKQorICoKKyAqIFBlcmZvcm0gSU5UeCBzd2l6emxpbmcgZm9yIGEgZGV2aWNlIGJlaGluZCBvbmUgbGV2ZWwgb2YgYnJpZGdlLiAgVGhpcyBpcworICogcmVxdWlyZWQgYnkgc2VjdGlvbiA5LjEgb2YgdGhlIFBDSS10by1QQ0kgYnJpZGdlIHNwZWNpZmljYXRpb24gZm9yIGRldmljZXMKKyAqIGJlaGluZCBicmlkZ2VzIG9uIGFkZC1pbiBjYXJkcy4KKyAqLwordTggcGNpX3N3aXp6bGVfaW50ZXJydXB0X3BpbihzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBwaW4pCit7CisJcmV0dXJuICgoKHBpbiAtIDEpICsgUENJX1NMT1QoZGV2LT5kZXZmbikpICUgNCkgKyAxOworfQorCiBpbnQKIHBjaV9nZXRfaW50ZXJydXB0X3BpbihzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcGNpX2RldiAqKmJyaWRnZSkKIHsKQEAgLTEzNDUsOSArMTQzNiw5IEBACiAJcGluID0gZGV2LT5waW47CiAJaWYgKCFwaW4pCiAJCXJldHVybiAtMTsKLQlwaW4tLTsKKwogCXdoaWxlIChkZXYtPmJ1cy0+c2VsZikgewotCQlwaW4gPSAocGluICsgUENJX1NMT1QoZGV2LT5kZXZmbikpICUgNDsKKwkJcGluID0gcGNpX3N3aXp6bGVfaW50ZXJydXB0X3BpbihkZXYsIHBpbik7CiAJCWRldiA9IGRldi0+YnVzLT5zZWxmOwogCX0KIAkqYnJpZGdlID0gZGV2OwpAQCAtMTM1NSw2ICsxNDQ2LDI2IEBACiB9CiAKIC8qKgorICogcGNpX2NvbW1vbl9zd2l6emxlIC0gc3dpenpsZSBJTlR4IGFsbCB0aGUgd2F5IHRvIHJvb3QgYnJpZGdlCisgKiBAZGV2OiB0aGUgUENJIGRldmljZQorICogQHBpbnA6IHBvaW50ZXIgdG8gdGhlIElOVHggcGluIHZhbHVlICgxPUlOVEEsIDI9SU5UQiwgMz1JTlRELCA0PUlOVEQpCisgKgorICogUGVyZm9ybSBJTlR4IHN3aXp6bGluZyBmb3IgYSBkZXZpY2UuICBUaGlzIHRyYXZlcnNlcyB0aHJvdWdoIGFsbCBQQ0ktdG8tUENJCisgKiBicmlkZ2VzIGFsbCB0aGUgd2F5IHVwIHRvIGEgUENJIHJvb3QgYnVzLgorICovCit1OCBwY2lfY29tbW9uX3N3aXp6bGUoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggKnBpbnApCit7CisJdTggcGluID0gKnBpbnA7CisKKwl3aGlsZSAoZGV2LT5idXMtPnNlbGYpIHsKKwkJcGluID0gcGNpX3N3aXp6bGVfaW50ZXJydXB0X3BpbihkZXYsIHBpbik7CisJCWRldiA9IGRldi0+YnVzLT5zZWxmOworCX0KKwkqcGlucCA9IHBpbjsKKwlyZXR1cm4gUENJX1NMT1QoZGV2LT5kZXZmbik7Cit9CisKKy8qKgogICoJcGNpX3JlbGVhc2VfcmVnaW9uIC0gUmVsZWFzZSBhIFBDSSBiYXIKICAqCUBwZGV2OiBQQ0kgZGV2aWNlIHdob3NlIHJlc291cmNlcyB3ZXJlIHByZXZpb3VzbHkgcmVzZXJ2ZWQgYnkgcGNpX3JlcXVlc3RfcmVnaW9uCiAgKglAYmFyOiBCQVIgdG8gcmVsZWFzZQpAQCAtMTM5NSw3ICsxNTA2LDggQEAKICAqCVJldHVybnMgMCBvbiBzdWNjZXNzLCBvciAlRUJVU1kgb24gZXJyb3IuICBBIHdhcm5pbmcKICAqCW1lc3NhZ2UgaXMgYWxzbyBwcmludGVkIG9uIGZhaWx1cmUuCiAgKi8KLWludCBwY2lfcmVxdWVzdF9yZWdpb24oc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBiYXIsIGNvbnN0IGNoYXIgKnJlc19uYW1lKQorc3RhdGljIGludCBfX3BjaV9yZXF1ZXN0X3JlZ2lvbihzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGJhciwgY29uc3QgY2hhciAqcmVzX25hbWUsCisJCQkJCQkJCQlpbnQgZXhjbHVzaXZlKQogewogCXN0cnVjdCBwY2lfZGV2cmVzICpkcjsKIApAQCAtMTQwOCw4ICsxNTIwLDkgQEAKIAkJCWdvdG8gZXJyX291dDsKIAl9CiAJZWxzZSBpZiAocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIGJhcikgJiBJT1JFU09VUkNFX01FTSkgewotCQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgYmFyKSwKLQkJCQkgICAgICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgYmFyKSwgcmVzX25hbWUpKQorCQlpZiAoIV9fcmVxdWVzdF9tZW1fcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBiYXIpLAorCQkJCQlwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIGJhciksIHJlc19uYW1lLAorCQkJCQlleGNsdXNpdmUpKQogCQkJZ290byBlcnJfb3V0OwogCX0KIApAQCAtMTQyOCw2ICsxNTQxLDQ3IEBACiB9CiAKIC8qKgorICoJcGNpX3JlcXVlc3RfcmVnaW9uIC0gUmVzZXJ2ZWQgUENJIEkvTyBhbmQgbWVtb3J5IHJlc291cmNlCisgKglAcGRldjogUENJIGRldmljZSB3aG9zZSByZXNvdXJjZXMgYXJlIHRvIGJlIHJlc2VydmVkCisgKglAYmFyOiBCQVIgdG8gYmUgcmVzZXJ2ZWQKKyAqCUByZXNfbmFtZTogTmFtZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggcmVzb3VyY2UuCisgKgorICoJTWFyayB0aGUgUENJIHJlZ2lvbiBhc3NvY2lhdGVkIHdpdGggUENJIGRldmljZSBAcGRldiBCUiBAYmFyIGFzCisgKgliZWluZyByZXNlcnZlZCBieSBvd25lciBAcmVzX25hbWUuICBEbyBub3QgYWNjZXNzIGFueQorICoJYWRkcmVzcyBpbnNpZGUgdGhlIFBDSSByZWdpb25zIHVubGVzcyB0aGlzIGNhbGwgcmV0dXJucworICoJc3VjY2Vzc2Z1bGx5LgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzLCBvciAlRUJVU1kgb24gZXJyb3IuICBBIHdhcm5pbmcKKyAqCW1lc3NhZ2UgaXMgYWxzbyBwcmludGVkIG9uIGZhaWx1cmUuCisgKi8KK2ludCBwY2lfcmVxdWVzdF9yZWdpb24oc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBiYXIsIGNvbnN0IGNoYXIgKnJlc19uYW1lKQoreworCXJldHVybiBfX3BjaV9yZXF1ZXN0X3JlZ2lvbihwZGV2LCBiYXIsIHJlc19uYW1lLCAwKTsKK30KKworLyoqCisgKglwY2lfcmVxdWVzdF9yZWdpb25fZXhjbHVzaXZlIC0gUmVzZXJ2ZWQgUENJIEkvTyBhbmQgbWVtb3J5IHJlc291cmNlCisgKglAcGRldjogUENJIGRldmljZSB3aG9zZSByZXNvdXJjZXMgYXJlIHRvIGJlIHJlc2VydmVkCisgKglAYmFyOiBCQVIgdG8gYmUgcmVzZXJ2ZWQKKyAqCUByZXNfbmFtZTogTmFtZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggcmVzb3VyY2UuCisgKgorICoJTWFyayB0aGUgUENJIHJlZ2lvbiBhc3NvY2lhdGVkIHdpdGggUENJIGRldmljZSBAcGRldiBCUiBAYmFyIGFzCisgKgliZWluZyByZXNlcnZlZCBieSBvd25lciBAcmVzX25hbWUuICBEbyBub3QgYWNjZXNzIGFueQorICoJYWRkcmVzcyBpbnNpZGUgdGhlIFBDSSByZWdpb25zIHVubGVzcyB0aGlzIGNhbGwgcmV0dXJucworICoJc3VjY2Vzc2Z1bGx5LgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzLCBvciAlRUJVU1kgb24gZXJyb3IuICBBIHdhcm5pbmcKKyAqCW1lc3NhZ2UgaXMgYWxzbyBwcmludGVkIG9uIGZhaWx1cmUuCisgKgorICoJVGhlIGtleSBkaWZmZXJlbmNlIHRoYXQgX2V4Y2x1c2l2ZSBtYWtlcyBpdCB0aGF0IHVzZXJzcGFjZSBpcworICoJZXhwbGljaXRseSBub3QgYWxsb3dlZCB0byBtYXAgdGhlIHJlc291cmNlIHZpYSAvZGV2L21lbSBvcgorICogCXN5c2ZzLgorICovCitpbnQgcGNpX3JlcXVlc3RfcmVnaW9uX2V4Y2x1c2l2ZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGJhciwgY29uc3QgY2hhciAqcmVzX25hbWUpCit7CisJcmV0dXJuIF9fcGNpX3JlcXVlc3RfcmVnaW9uKHBkZXYsIGJhciwgcmVzX25hbWUsIElPUkVTT1VSQ0VfRVhDTFVTSVZFKTsKK30KKy8qKgogICogcGNpX3JlbGVhc2Vfc2VsZWN0ZWRfcmVnaW9ucyAtIFJlbGVhc2Ugc2VsZWN0ZWQgUENJIEkvTyBhbmQgbWVtb3J5IHJlc291cmNlcwogICogQHBkZXY6IFBDSSBkZXZpY2Ugd2hvc2UgcmVzb3VyY2VzIHdlcmUgcHJldmlvdXNseSByZXNlcnZlZAogICogQGJhcnM6IEJpdG1hc2sgb2YgQkFScyB0byBiZSByZWxlYXNlZApAQCAtMTQ0NCwyMCArMTU5OCwxNCBAQAogCQkJcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIGkpOwogfQogCi0vKioKLSAqIHBjaV9yZXF1ZXN0X3NlbGVjdGVkX3JlZ2lvbnMgLSBSZXNlcnZlIHNlbGVjdGVkIFBDSSBJL08gYW5kIG1lbW9yeSByZXNvdXJjZXMKLSAqIEBwZGV2OiBQQ0kgZGV2aWNlIHdob3NlIHJlc291cmNlcyBhcmUgdG8gYmUgcmVzZXJ2ZWQKLSAqIEBiYXJzOiBCaXRtYXNrIG9mIEJBUnMgdG8gYmUgcmVxdWVzdGVkCi0gKiBAcmVzX25hbWU6IE5hbWUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlCi0gKi8KLWludCBwY2lfcmVxdWVzdF9zZWxlY3RlZF9yZWdpb25zKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgYmFycywKLQkJCQkgY29uc3QgY2hhciAqcmVzX25hbWUpCitpbnQgX19wY2lfcmVxdWVzdF9zZWxlY3RlZF9yZWdpb25zKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgYmFycywKKwkJCQkgY29uc3QgY2hhciAqcmVzX25hbWUsIGludCBleGNsKQogewogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKIAkJaWYgKGJhcnMgJiAoMSA8PCBpKSkKLQkJCWlmKHBjaV9yZXF1ZXN0X3JlZ2lvbihwZGV2LCBpLCByZXNfbmFtZSkpCisJCQlpZiAoX19wY2lfcmVxdWVzdF9yZWdpb24ocGRldiwgaSwgcmVzX25hbWUsIGV4Y2wpKQogCQkJCWdvdG8gZXJyX291dDsKIAlyZXR1cm4gMDsKIApAQCAtMTQ2OSw2ICsxNjE3LDI2IEBACiAJcmV0dXJuIC1FQlVTWTsKIH0KIAorCisvKioKKyAqIHBjaV9yZXF1ZXN0X3NlbGVjdGVkX3JlZ2lvbnMgLSBSZXNlcnZlIHNlbGVjdGVkIFBDSSBJL08gYW5kIG1lbW9yeSByZXNvdXJjZXMKKyAqIEBwZGV2OiBQQ0kgZGV2aWNlIHdob3NlIHJlc291cmNlcyBhcmUgdG8gYmUgcmVzZXJ2ZWQKKyAqIEBiYXJzOiBCaXRtYXNrIG9mIEJBUnMgdG8gYmUgcmVxdWVzdGVkCisgKiBAcmVzX25hbWU6IE5hbWUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlCisgKi8KK2ludCBwY2lfcmVxdWVzdF9zZWxlY3RlZF9yZWdpb25zKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgYmFycywKKwkJCQkgY29uc3QgY2hhciAqcmVzX25hbWUpCit7CisJcmV0dXJuIF9fcGNpX3JlcXVlc3Rfc2VsZWN0ZWRfcmVnaW9ucyhwZGV2LCBiYXJzLCByZXNfbmFtZSwgMCk7Cit9CisKK2ludCBwY2lfcmVxdWVzdF9zZWxlY3RlZF9yZWdpb25zX2V4Y2x1c2l2ZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgaW50IGJhcnMsIGNvbnN0IGNoYXIgKnJlc19uYW1lKQoreworCXJldHVybiBfX3BjaV9yZXF1ZXN0X3NlbGVjdGVkX3JlZ2lvbnMocGRldiwgYmFycywgcmVzX25hbWUsCisJCQlJT1JFU09VUkNFX0VYQ0xVU0lWRSk7Cit9CisKIC8qKgogICoJcGNpX3JlbGVhc2VfcmVnaW9ucyAtIFJlbGVhc2UgcmVzZXJ2ZWQgUENJIEkvTyBhbmQgbWVtb3J5IHJlc291cmNlcwogICoJQHBkZXY6IFBDSSBkZXZpY2Ugd2hvc2UgcmVzb3VyY2VzIHdlcmUgcHJldmlvdXNseSByZXNlcnZlZCBieSBwY2lfcmVxdWVzdF9yZWdpb25zCkBAIC0xNTAyLDI3ICsxNjcwLDY2IEBACiB9CiAKIC8qKgorICoJcGNpX3JlcXVlc3RfcmVnaW9uc19leGNsdXNpdmUgLSBSZXNlcnZlZCBQQ0kgSS9PIGFuZCBtZW1vcnkgcmVzb3VyY2VzCisgKglAcGRldjogUENJIGRldmljZSB3aG9zZSByZXNvdXJjZXMgYXJlIHRvIGJlIHJlc2VydmVkCisgKglAcmVzX25hbWU6IE5hbWUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlLgorICoKKyAqCU1hcmsgYWxsIFBDSSByZWdpb25zIGFzc29jaWF0ZWQgd2l0aCBQQ0kgZGV2aWNlIEBwZGV2IGFzCisgKgliZWluZyByZXNlcnZlZCBieSBvd25lciBAcmVzX25hbWUuICBEbyBub3QgYWNjZXNzIGFueQorICoJYWRkcmVzcyBpbnNpZGUgdGhlIFBDSSByZWdpb25zIHVubGVzcyB0aGlzIGNhbGwgcmV0dXJucworICoJc3VjY2Vzc2Z1bGx5LgorICoKKyAqCXBjaV9yZXF1ZXN0X3JlZ2lvbnNfZXhjbHVzaXZlKCkgd2lsbCBtYXJrIHRoZSByZWdpb24gc28gdGhhdAorICogCS9kZXYvbWVtIGFuZCB0aGUgc3lzZnMgTU1JTyBhY2Nlc3Mgd2lsbCBub3QgYmUgYWxsb3dlZC4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgJUVCVVNZIG9uIGVycm9yLiAgQSB3YXJuaW5nCisgKgltZXNzYWdlIGlzIGFsc28gcHJpbnRlZCBvbiBmYWlsdXJlLgorICovCitpbnQgcGNpX3JlcXVlc3RfcmVnaW9uc19leGNsdXNpdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IGNoYXIgKnJlc19uYW1lKQoreworCXJldHVybiBwY2lfcmVxdWVzdF9zZWxlY3RlZF9yZWdpb25zX2V4Y2x1c2l2ZShwZGV2LAorCQkJCQkoKDEgPDwgNikgLSAxKSwgcmVzX25hbWUpOworfQorCitzdGF0aWMgdm9pZCBfX3BjaV9zZXRfbWFzdGVyKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGJvb2wgZW5hYmxlKQoreworCXUxNiBvbGRfY21kLCBjbWQ7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCAmb2xkX2NtZCk7CisJaWYgKGVuYWJsZSkKKwkJY21kID0gb2xkX2NtZCB8IFBDSV9DT01NQU5EX01BU1RFUjsKKwllbHNlCisJCWNtZCA9IG9sZF9jbWQgJiB+UENJX0NPTU1BTkRfTUFTVEVSOworCWlmIChjbWQgIT0gb2xkX2NtZCkgeworCQlkZXZfZGJnKCZkZXYtPmRldiwgIiVzIGJ1cyBtYXN0ZXJpbmdcbiIsCisJCQllbmFibGUgPyAiZW5hYmxpbmciIDogImRpc2FibGluZyIpOworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgY21kKTsKKwl9CisJZGV2LT5pc19idXNtYXN0ZXIgPSBlbmFibGU7Cit9CisKKy8qKgogICogcGNpX3NldF9tYXN0ZXIgLSBlbmFibGVzIGJ1cy1tYXN0ZXJpbmcgZm9yIGRldmljZSBkZXYKICAqIEBkZXY6IHRoZSBQQ0kgZGV2aWNlIHRvIGVuYWJsZQogICoKICAqIEVuYWJsZXMgYnVzLW1hc3RlcmluZyBvbiB0aGUgZGV2aWNlIGFuZCBjYWxscyBwY2liaW9zX3NldF9tYXN0ZXIoKQogICogdG8gZG8gdGhlIG5lZWRlZCBhcmNoIHNwZWNpZmljIHNldHRpbmdzLgogICovCi12b2lkCi1wY2lfc2V0X21hc3RlcihzdHJ1Y3QgcGNpX2RldiAqZGV2KQordm9pZCBwY2lfc2V0X21hc3RlcihzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCXUxNiBjbWQ7Ci0KLQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCAmY21kKTsKLQlpZiAoISAoY21kICYgUENJX0NPTU1BTkRfTUFTVEVSKSkgewotCQlkZXZfZGJnKCZkZXYtPmRldiwgImVuYWJsaW5nIGJ1cyBtYXN0ZXJpbmdcbiIpOwotCQljbWQgfD0gUENJX0NPTU1BTkRfTUFTVEVSOwotCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgY21kKTsKLQl9Ci0JZGV2LT5pc19idXNtYXN0ZXIgPSAxOworCV9fcGNpX3NldF9tYXN0ZXIoZGV2LCB0cnVlKTsKIAlwY2liaW9zX3NldF9tYXN0ZXIoZGV2KTsKIH0KIAorLyoqCisgKiBwY2lfY2xlYXJfbWFzdGVyIC0gZGlzYWJsZXMgYnVzLW1hc3RlcmluZyBmb3IgZGV2aWNlIGRldgorICogQGRldjogdGhlIFBDSSBkZXZpY2UgdG8gZGlzYWJsZQorICovCit2b2lkIHBjaV9jbGVhcl9tYXN0ZXIoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlfX3BjaV9zZXRfbWFzdGVyKGRldiwgZmFsc2UpOworfQorCiAjaWZkZWYgUENJX0RJU0FCTEVfTVdJCiBpbnQgcGNpX3NldF9td2koc3RydWN0IHBjaV9kZXYgKmRldikKIHsKQEAgLTE3NTEsMjQgKzE5NTgsNyBAQAogRVhQT1JUX1NZTUJPTChwY2lfc2V0X2RtYV9zZWdfYm91bmRhcnkpOwogI2VuZGlmCiAKLS8qKgotICogcGNpX2V4ZWN1dGVfcmVzZXRfZnVuY3Rpb24oKSAtIFJlc2V0IGEgUENJIGRldmljZSBmdW5jdGlvbgotICogQGRldjogRGV2aWNlIGZ1bmN0aW9uIHRvIHJlc2V0Ci0gKgotICogU29tZSBkZXZpY2VzIGFsbG93IGFuIGluZGl2aWR1YWwgZnVuY3Rpb24gdG8gYmUgcmVzZXQgd2l0aG91dCBhZmZlY3RpbmcKLSAqIG90aGVyIGZ1bmN0aW9ucyBpbiB0aGUgc2FtZSBkZXZpY2UuICBUaGUgUENJIGRldmljZSBtdXN0IGJlIHJlc3BvbnNpdmUKLSAqIHRvIFBDSSBjb25maWcgc3BhY2UgaW4gb3JkZXIgdG8gdXNlIHRoaXMgZnVuY3Rpb24uCi0gKgotICogVGhlIGRldmljZSBmdW5jdGlvbiBpcyBwcmVzdW1lZCB0byBiZSB1bnVzZWQgd2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4KLSAqIFJlc2V0dGluZyB0aGUgZGV2aWNlIHdpbGwgbWFrZSB0aGUgY29udGVudHMgb2YgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UKLSAqIHJhbmRvbSwgc28gYW55IGNhbGxlciBvZiB0aGlzIG11c3QgYmUgcHJlcGFyZWQgdG8gcmVpbml0aWFsaXNlIHRoZQotICogZGV2aWNlIGluY2x1ZGluZyBNU0ksIGJ1cyBtYXN0ZXJpbmcsIEJBUnMsIGRlY29kaW5nIElPIGFuZCBtZW1vcnkgc3BhY2VzLAotICogZXRjLgotICoKLSAqIFJldHVybnMgMCBpZiB0aGUgZGV2aWNlIGZ1bmN0aW9uIHdhcyBzdWNjZXNzZnVsbHkgcmVzZXQgb3IgLUVOT1RUWSBpZiB0aGUKLSAqIGRldmljZSBkb2Vzbid0IHN1cHBvcnQgcmVzZXR0aW5nIGEgc2luZ2xlIGZ1bmN0aW9uLgotICovCi1pbnQgcGNpX2V4ZWN1dGVfcmVzZXRfZnVuY3Rpb24oc3RydWN0IHBjaV9kZXYgKmRldikKK3N0YXRpYyBpbnQgX19wY2llX2ZscihzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcHJvYmUpCiB7CiAJdTE2IHN0YXR1czsKIAl1MzIgY2FwOwpAQCAtMTc4MCw2ICsxOTcwLDkgQEAKIAlpZiAoIShjYXAgJiBQQ0lfRVhQX0RFVkNBUF9GTFIpKQogCQlyZXR1cm4gLUVOT1RUWTsKIAorCWlmIChwcm9iZSkKKwkJcmV0dXJuIDA7CisKIAlwY2lfYmxvY2tfdXNlcl9jZmdfYWNjZXNzKGRldik7CiAKIAkvKiBXYWl0IGZvciBUcmFuc2FjdGlvbiBQZW5kaW5nIGJpdCBjbGVhbiAqLwpAQCAtMTgwMiw2ICsxOTk1LDgwIEBACiAJcGNpX3VuYmxvY2tfdXNlcl9jZmdfYWNjZXNzKGRldik7CiAJcmV0dXJuIDA7CiB9CisKK3N0YXRpYyBpbnQgX19wY2lfYWZfZmxyKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBwcm9iZSkKK3sKKwlpbnQgY2FwcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfQUYpOworCXU4IHN0YXR1czsKKwl1OCBjYXA7CisKKwlpZiAoIWNhcHBvcykKKwkJcmV0dXJuIC1FTk9UVFk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBjYXBwb3MgKyBQQ0lfQUZfQ0FQLCAmY2FwKTsKKwlpZiAoIShjYXAgJiBQQ0lfQUZfQ0FQX1RQKSB8fCAhKGNhcCAmIFBDSV9BRl9DQVBfRkxSKSkKKwkJcmV0dXJuIC1FTk9UVFk7CisKKwlpZiAocHJvYmUpCisJCXJldHVybiAwOworCisJcGNpX2Jsb2NrX3VzZXJfY2ZnX2FjY2VzcyhkZXYpOworCisJLyogV2FpdCBmb3IgVHJhbnNhY3Rpb24gUGVuZGluZyBiaXQgY2xlYW4gKi8KKwltc2xlZXAoMTAwKTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIGNhcHBvcyArIFBDSV9BRl9TVEFUVVMsICZzdGF0dXMpOworCWlmIChzdGF0dXMgJiBQQ0lfQUZfU1RBVFVTX1RQKSB7CisJCWRldl9pbmZvKCZkZXYtPmRldiwgIkJ1c3kgYWZ0ZXIgMTAwbXMgd2hpbGUgdHJ5aW5nIHRvIgorCQkJCSIgcmVzZXQ7IHNsZWVwaW5nIGZvciAxIHNlY29uZFxuIik7CisJCXNzbGVlcCgxKTsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LAorCQkJCWNhcHBvcyArIFBDSV9BRl9TVEFUVVMsICZzdGF0dXMpOworCQlpZiAoc3RhdHVzICYgUENJX0FGX1NUQVRVU19UUCkKKwkJCWRldl9pbmZvKCZkZXYtPmRldiwgIlN0aWxsIGJ1c3kgYWZ0ZXIgMXM7ICIKKwkJCQkJInByb2NlZWRpbmcgd2l0aCByZXNldCBhbnl3YXlcbiIpOworCX0KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBjYXBwb3MgKyBQQ0lfQUZfQ1RSTCwgUENJX0FGX0NUUkxfRkxSKTsKKwltZGVsYXkoMTAwKTsKKworCXBjaV91bmJsb2NrX3VzZXJfY2ZnX2FjY2VzcyhkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fcGNpX3Jlc2V0X2Z1bmN0aW9uKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgcHJvYmUpCit7CisJaW50IHJlczsKKworCXJlcyA9IF9fcGNpZV9mbHIocGRldiwgcHJvYmUpOworCWlmIChyZXMgIT0gLUVOT1RUWSkKKwkJcmV0dXJuIHJlczsKKworCXJlcyA9IF9fcGNpX2FmX2ZscihwZGV2LCBwcm9iZSk7CisJaWYgKHJlcyAhPSAtRU5PVFRZKQorCQlyZXR1cm4gcmVzOworCisJcmV0dXJuIHJlczsKK30KKworLyoqCisgKiBwY2lfZXhlY3V0ZV9yZXNldF9mdW5jdGlvbigpIC0gUmVzZXQgYSBQQ0kgZGV2aWNlIGZ1bmN0aW9uCisgKiBAZGV2OiBEZXZpY2UgZnVuY3Rpb24gdG8gcmVzZXQKKyAqCisgKiBTb21lIGRldmljZXMgYWxsb3cgYW4gaW5kaXZpZHVhbCBmdW5jdGlvbiB0byBiZSByZXNldCB3aXRob3V0IGFmZmVjdGluZworICogb3RoZXIgZnVuY3Rpb25zIGluIHRoZSBzYW1lIGRldmljZS4gIFRoZSBQQ0kgZGV2aWNlIG11c3QgYmUgcmVzcG9uc2l2ZQorICogdG8gUENJIGNvbmZpZyBzcGFjZSBpbiBvcmRlciB0byB1c2UgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBUaGUgZGV2aWNlIGZ1bmN0aW9uIGlzIHByZXN1bWVkIHRvIGJlIHVudXNlZCB3aGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLgorICogUmVzZXR0aW5nIHRoZSBkZXZpY2Ugd2lsbCBtYWtlIHRoZSBjb250ZW50cyBvZiBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZQorICogcmFuZG9tLCBzbyBhbnkgY2FsbGVyIG9mIHRoaXMgbXVzdCBiZSBwcmVwYXJlZCB0byByZWluaXRpYWxpc2UgdGhlCisgKiBkZXZpY2UgaW5jbHVkaW5nIE1TSSwgYnVzIG1hc3RlcmluZywgQkFScywgZGVjb2RpbmcgSU8gYW5kIG1lbW9yeSBzcGFjZXMsCisgKiBldGMuCisgKgorICogUmV0dXJucyAwIGlmIHRoZSBkZXZpY2UgZnVuY3Rpb24gd2FzIHN1Y2Nlc3NmdWxseSByZXNldCBvciAtRU5PVFRZIGlmIHRoZQorICogZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCByZXNldHRpbmcgYSBzaW5nbGUgZnVuY3Rpb24uCisgKi8KK2ludCBwY2lfZXhlY3V0ZV9yZXNldF9mdW5jdGlvbihzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXJldHVybiBfX3BjaV9yZXNldF9mdW5jdGlvbihkZXYsIDApOworfQogRVhQT1JUX1NZTUJPTF9HUEwocGNpX2V4ZWN1dGVfcmVzZXRfZnVuY3Rpb24pOwogCiAvKioKQEAgLTE4MjIsMTUgKzIwODksMTAgQEAKICAqLwogaW50IHBjaV9yZXNldF9mdW5jdGlvbihzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCXUzMiBjYXA7Ci0JaW50IGV4cHBvcyA9IHBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LCBQQ0lfQ0FQX0lEX0VYUCk7Ci0JaW50IHI7CisJaW50IHIgPSBfX3BjaV9yZXNldF9mdW5jdGlvbihkZXYsIDEpOwogCi0JaWYgKCFleHBwb3MpCi0JCXJldHVybiAtRU5PVFRZOwotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIGV4cHBvcyArIFBDSV9FWFBfREVWQ0FQLCAmY2FwKTsKLQlpZiAoIShjYXAgJiBQQ0lfRVhQX0RFVkNBUF9GTFIpKQotCQlyZXR1cm4gLUVOT1RUWTsKKwlpZiAociA8IDApCisJCXJldHVybiByOwogCiAJaWYgKCFkZXYtPm1zaV9lbmFibGVkICYmICFkZXYtPm1zaXhfZW5hYmxlZCAmJiBkZXYtPmlycSAhPSAwKQogCQlkaXNhYmxlX2lycShkZXYtPmlycSk7CkBAIC0yMDIyLDYgKzIyODQsMjggQEAKIAlyZXR1cm4gYmFyczsKIH0KIAorLyoqCisgKiBwY2lfcmVzb3VyY2VfYmFyIC0gZ2V0IHBvc2l0aW9uIG9mIHRoZSBCQVIgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UKKyAqIEBkZXY6IHRoZSBQQ0kgZGV2aWNlCisgKiBAcmVzbm86IHRoZSByZXNvdXJjZSBudW1iZXIKKyAqIEB0eXBlOiB0aGUgQkFSIHR5cGUgdG8gYmUgZmlsbGVkIGluCisgKgorICogUmV0dXJucyBCQVIgcG9zaXRpb24gaW4gY29uZmlnIHNwYWNlLCBvciAwIGlmIHRoZSBCQVIgaXMgaW52YWxpZC4KKyAqLworaW50IHBjaV9yZXNvdXJjZV9iYXIoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHJlc25vLCBlbnVtIHBjaV9iYXJfdHlwZSAqdHlwZSkKK3sKKwlpZiAocmVzbm8gPCBQQ0lfUk9NX1JFU09VUkNFKSB7CisJCSp0eXBlID0gcGNpX2Jhcl91bmtub3duOworCQlyZXR1cm4gUENJX0JBU0VfQUREUkVTU18wICsgNCAqIHJlc25vOworCX0gZWxzZSBpZiAocmVzbm8gPT0gUENJX1JPTV9SRVNPVVJDRSkgeworCQkqdHlwZSA9IHBjaV9iYXJfbWVtMzI7CisJCXJldHVybiBkZXYtPnJvbV9iYXNlX3JlZzsKKwl9CisKKwlkZXZfZXJyKCZkZXYtPmRldiwgIkJBUjogaW52YWxpZCByZXNvdXJjZSAjJWRcbiIsIHJlc25vKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQgX19kZXZpbml0IHBjaV9ub19kb21haW5zKHZvaWQpCiB7CiAjaWZkZWYgQ09ORklHX1BDSV9ET01BSU5TCkBAIC0yMDI5LDYgKzIzMTMsMTkgQEAKICNlbmRpZgogfQogCisvKioKKyAqIHBjaV9leHRfY2ZnX2VuYWJsZWQgLSBjYW4gd2UgYWNjZXNzIGV4dGVuZGVkIFBDSSBjb25maWcgc3BhY2U/CisgKiBAZGV2OiBUaGUgUENJIGRldmljZSBvZiB0aGUgcm9vdCBicmlkZ2UuCisgKgorICogUmV0dXJucyAxIGlmIHdlIGNhbiBhY2Nlc3MgUENJIGV4dGVuZGVkIGNvbmZpZyBzcGFjZSAob2Zmc2V0cworICogZ3JlYXRlciB0aGFuIDB4ZmYpLiBUaGlzIGlzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uLiBBcmNoaXRlY3R1cmUKKyAqIGltcGxlbWVudGF0aW9ucyBjYW4gb3ZlcnJpZGUgdGhpcy4KKyAqLworaW50IF9fYXR0cmlidXRlX18gKCh3ZWFrKSkgcGNpX2V4dF9jZmdfYXZhaWwoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlyZXR1cm4gMTsKK30KKwogc3RhdGljIGludCBfX2RldmluaXQgcGNpX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKQEAgLTIwMzcsOCArMjMzNCw2IEBACiAJCXBjaV9maXh1cF9kZXZpY2UocGNpX2ZpeHVwX2ZpbmFsLCBkZXYpOwogCX0KIAotCW1zaV9pbml0KCk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMjA4MywxMSArMjM3OCwxNSBAQAogRVhQT1JUX1NZTUJPTChwY2lfYnVzX2ZpbmRfY2FwYWJpbGl0eSk7CiBFWFBPUlRfU1lNQk9MKHBjaV9yZWxlYXNlX3JlZ2lvbnMpOwogRVhQT1JUX1NZTUJPTChwY2lfcmVxdWVzdF9yZWdpb25zKTsKK0VYUE9SVF9TWU1CT0wocGNpX3JlcXVlc3RfcmVnaW9uc19leGNsdXNpdmUpOwogRVhQT1JUX1NZTUJPTChwY2lfcmVsZWFzZV9yZWdpb24pOwogRVhQT1JUX1NZTUJPTChwY2lfcmVxdWVzdF9yZWdpb24pOworRVhQT1JUX1NZTUJPTChwY2lfcmVxdWVzdF9yZWdpb25fZXhjbHVzaXZlKTsKIEVYUE9SVF9TWU1CT0wocGNpX3JlbGVhc2Vfc2VsZWN0ZWRfcmVnaW9ucyk7CiBFWFBPUlRfU1lNQk9MKHBjaV9yZXF1ZXN0X3NlbGVjdGVkX3JlZ2lvbnMpOworRVhQT1JUX1NZTUJPTChwY2lfcmVxdWVzdF9zZWxlY3RlZF9yZWdpb25zX2V4Y2x1c2l2ZSk7CiBFWFBPUlRfU1lNQk9MKHBjaV9zZXRfbWFzdGVyKTsKK0VYUE9SVF9TWU1CT0wocGNpX2NsZWFyX21hc3Rlcik7CiBFWFBPUlRfU1lNQk9MKHBjaV9zZXRfbXdpKTsKIEVYUE9SVF9TWU1CT0wocGNpX3RyeV9zZXRfbXdpKTsKIEVYUE9SVF9TWU1CT0wocGNpX2NsZWFyX213aSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2kuaCBiL2RyaXZlcnMvcGNpL3BjaS5oCmluZGV4IDlkZTg3ZTkuLjEzNTFiYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS5oCisrKyBiL2RyaXZlcnMvcGNpL3BjaS5oCkBAIC0xMCw2ICsxMCwxMCBAQAogZXh0ZXJuIGludCBwY2lfY3JlYXRlX3N5c2ZzX2Rldl9maWxlcyhzdHJ1Y3QgcGNpX2RldiAqcGRldik7CiBleHRlcm4gdm9pZCBwY2lfcmVtb3ZlX3N5c2ZzX2Rldl9maWxlcyhzdHJ1Y3QgcGNpX2RldiAqcGRldik7CiBleHRlcm4gdm9pZCBwY2lfY2xlYW51cF9yb20oc3RydWN0IHBjaV9kZXYgKmRldik7CisjaWZkZWYgSEFWRV9QQ0lfTU1BUAorZXh0ZXJuIGludCBwY2lfbW1hcF9maXRzKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgcmVzbm8sCisJCQkgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworI2VuZGlmCiAKIC8qKgogICogRmlybXdhcmUgUE0gY2FsbGJhY2tzCkBAIC00MCw3ICs0NCwxMSBAQAogfTsKIAogZXh0ZXJuIGludCBwY2lfc2V0X3BsYXRmb3JtX3BtKHN0cnVjdCBwY2lfcGxhdGZvcm1fcG1fb3BzICpvcHMpOworZXh0ZXJuIHZvaWQgcGNpX3VwZGF0ZV9jdXJyZW50X3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBjaV9wb3dlcl90IHN0YXRlKTsKK2V4dGVybiB2b2lkIHBjaV9kaXNhYmxlX2VuYWJsZWRfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogZXh0ZXJuIHZvaWQgcGNpX3BtX2luaXQoc3RydWN0IHBjaV9kZXYgKmRldik7CitleHRlcm4gdm9pZCBwbGF0Zm9ybV9wY2lfd2FrZXVwX2luaXQoc3RydWN0IHBjaV9kZXYgKmRldik7CitleHRlcm4gdm9pZCBwY2lfYWxsb2NhdGVfY2FwX3NhdmVfYnVmZmVycyhzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIAogZXh0ZXJuIGludCBwY2lfdXNlcl9yZWFkX2NvbmZpZ19ieXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCB3aGVyZSwgdTggKnZhbCk7CiBleHRlcm4gaW50IHBjaV91c2VyX3JlYWRfY29uZmlnX3dvcmQoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHdoZXJlLCB1MTYgKnZhbCk7CkBAIC01MCwxNCArNTgsMTQgQEAKIGV4dGVybiBpbnQgcGNpX3VzZXJfd3JpdGVfY29uZmlnX2R3b3JkKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCB3aGVyZSwgdTMyIHZhbCk7CiAKIHN0cnVjdCBwY2lfdnBkX29wcyB7Ci0JaW50ICgqcmVhZCkoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHBvcywgaW50IHNpemUsIGNoYXIgKmJ1Zik7Ci0JaW50ICgqd3JpdGUpKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBwb3MsIGludCBzaXplLCBjb25zdCBjaGFyICpidWYpOworCXNzaXplX3QgKCpyZWFkKShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBsb2ZmX3QgcG9zLCBzaXplX3QgY291bnQsIHZvaWQgKmJ1Zik7CisJc3NpemVfdCAoKndyaXRlKShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBsb2ZmX3QgcG9zLCBzaXplX3QgY291bnQsIGNvbnN0IHZvaWQgKmJ1Zik7CiAJdm9pZCAoKnJlbGVhc2UpKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogfTsKIAogc3RydWN0IHBjaV92cGQgewogCXVuc2lnbmVkIGludCBsZW47Ci0Jc3RydWN0IHBjaV92cGRfb3BzICpvcHM7CisJY29uc3Qgc3RydWN0IHBjaV92cGRfb3BzICpvcHM7CiAJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHI7IC8qIGRlc2NyaXB0b3IgZm9yIHN5c2ZzIFZQRCBlbnRyeSAqLwogfTsKIApAQCAtOTgsMTEgKzEwNiw5IEBACiAjaWZkZWYgQ09ORklHX1BDSV9NU0kKIHZvaWQgcGNpX25vX21zaSh2b2lkKTsKIGV4dGVybiB2b2lkIHBjaV9tc2lfaW5pdF9wY2lfZGV2KHN0cnVjdCBwY2lfZGV2ICpkZXYpOwotZXh0ZXJuIHZvaWQgX19kZXZpbml0IG1zaV9pbml0KHZvaWQpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCBwY2lfbm9fbXNpKHZvaWQpIHsgfQogc3RhdGljIGlubGluZSB2b2lkIHBjaV9tc2lfaW5pdF9wY2lfZGV2KHN0cnVjdCBwY2lfZGV2ICpkZXYpIHsgfQotc3RhdGljIGlubGluZSB2b2lkIG1zaV9pbml0KHZvaWQpIHsgfQogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfUENJRUFFUgpAQCAtMTU5LDE2ICsxNjUsMjggQEAKIH07CiAjZGVmaW5lIHRvX3BjaV9zbG90X2F0dHIocykgY29udGFpbmVyX29mKHMsIHN0cnVjdCBwY2lfc2xvdF9hdHRyaWJ1dGUsIGF0dHIpCiAKK2VudW0gcGNpX2Jhcl90eXBlIHsKKwlwY2lfYmFyX3Vua25vd24sCS8qIFN0YW5kYXJkIFBDSSBCQVIgcHJvYmUgKi8KKwlwY2lfYmFyX2lvLAkJLyogQW4gaW8gcG9ydCBCQVIgKi8KKwlwY2lfYmFyX21lbTMyLAkJLyogQSAzMi1iaXQgbWVtb3J5IEJBUiAqLworCXBjaV9iYXJfbWVtNjQsCQkvKiBBIDY0LWJpdCBtZW1vcnkgQkFSICovCit9OworCitleHRlcm4gaW50IF9fcGNpX3JlYWRfYmFzZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBlbnVtIHBjaV9iYXJfdHlwZSB0eXBlLAorCQkJCXN0cnVjdCByZXNvdXJjZSAqcmVzLCB1bnNpZ25lZCBpbnQgcmVnKTsKK2V4dGVybiBpbnQgcGNpX3Jlc291cmNlX2JhcihzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcmVzbm8sCisJCQkgICAgZW51bSBwY2lfYmFyX3R5cGUgKnR5cGUpOworZXh0ZXJuIGludCBwY2lfYnVzX2FkZF9jaGlsZChzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKIGV4dGVybiB2b2lkIHBjaV9lbmFibGVfYXJpKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogLyoqCiAgKiBwY2lfYXJpX2VuYWJsZWQgLSBxdWVyeSBBUkkgZm9yd2FyZGluZyBzdGF0dXMKLSAqIEBkZXY6IHRoZSBQQ0kgZGV2aWNlCisgKiBAYnVzOiB0aGUgUENJIGJ1cwogICoKICAqIFJldHVybnMgMSBpZiBBUkkgZm9yd2FyZGluZyBpcyBlbmFibGVkLCBvciAwIGlmIG5vdCBlbmFibGVkOwogICovCi1zdGF0aWMgaW5saW5lIGludCBwY2lfYXJpX2VuYWJsZWQoc3RydWN0IHBjaV9kZXYgKmRldikKK3N0YXRpYyBpbmxpbmUgaW50IHBjaV9hcmlfZW5hYmxlZChzdHJ1Y3QgcGNpX2J1cyAqYnVzKQogewotCXJldHVybiBkZXYtPmFyaV9lbmFibGVkOworCXJldHVybiBidXMtPnNlbGYgJiYgYnVzLT5zZWxmLT5hcmlfZW5hYmxlZDsKIH0KIAogI2VuZGlmIC8qIERSSVZFUlNfUENJX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2FlcmRydl9hY3BpLmMgYi9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnZfYWNwaS5jCmluZGV4IDZkZDdiMTMuLmViY2UyNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2FlcmRydl9hY3BpLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2X2FjcGkuYwpAQCAtMzgsNyArMzgsNiBAQAogCiAJaGFuZGxlID0gYWNwaV9maW5kX3Jvb3RfYnJpZGdlX2hhbmRsZShwZGV2KTsKIAlpZiAoaGFuZGxlKSB7Ci0JCXBjaWVfb3NjX3N1cHBvcnRfc2V0KE9TQ19FWFRfUENJX0NPTkZJR19TVVBQT1JUKTsKIAkJc3RhdHVzID0gcGNpX29zY19jb250cm9sX3NldChoYW5kbGUsCiAJCQkJCU9TQ19QQ0lfRVhQUkVTU19BRVJfQ09OVFJPTCB8CiAJCQkJCU9TQ19QQ0lfRVhQUkVTU19DQVBfU1RSVUNUVVJFX0NPTlRST0wpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2X2VycnByaW50LmMgYi9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnZfZXJycHJpbnQuYwppbmRleCAzOTMzZDRmMy4uMGZjMjlhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2X2VycnByaW50LmMKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2X2VycnByaW50LmMKQEAgLTIzMyw3ICsyMzMsNyBAQAogCiAJCWlmIChpbmZvLT5mbGFncyAmIEFFUl9UTFBfSEVBREVSX1ZBTElEX0ZMQUcpIHsKIAkJCXVuc2lnbmVkIGNoYXIgKnRscCA9ICh1bnNpZ25lZCBjaGFyICopICZpbmZvLT50bHA7Ci0JCQlwcmludGsoIiVzVExCIEhlYWRlcjpcbiIsIGxvZ2xldmVsKTsKKwkJCXByaW50aygiJXNUTFAgSGVhZGVyOlxuIiwgbG9nbGV2ZWwpOwogCQkJcHJpbnRrKCIlcyUwMnglMDJ4JTAyeCUwMnggJTAyeCUwMnglMDJ4JTAyeCIKIAkJCQkiICUwMnglMDJ4JTAyeCUwMnggJTAyeCUwMnglMDJ4JTAyeFxuIiwKIAkJCQlsb2dsZXZlbCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvYXNwbS5jIGIvZHJpdmVycy9wY2kvcGNpZS9hc3BtLmMKaW5kZXggOWFhZDYwOC4uNTg2YjZmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpZS9hc3BtLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9hc3BtLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS1hc3BtLmg+CiAjaW5jbHVkZSAiLi4vcGNpLmgiCiAKQEAgLTMzLDYgKzM0LDExIEBACiBzdHJ1Y3QgcGNpZV9saW5rX3N0YXRlIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHNpYmlsaW5nOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCWJvb2wgZG93bnN0cmVhbV9oYXNfc3dpdGNoOworCisJc3RydWN0IHBjaWVfbGlua19zdGF0ZSAqcGFyZW50OworCXN0cnVjdCBsaXN0X2hlYWQgY2hpbGRyZW47CisJc3RydWN0IGxpc3RfaGVhZCBsaW5rOwogCiAJLyogQVNQTSBzdGF0ZSAqLwogCXVuc2lnbmVkIGludCBzdXBwb3J0X3N0YXRlOwpAQCAtNzAsNiArNzYsOCBAQAogCVtQT0xJQ1lfUE9XRVJTQVZFXSA9ICJwb3dlcnNhdmUiCiB9OwogCisjZGVmaW5lIExJTktfUkVUUkFJTl9USU1FT1VUIEhaCisKIHN0YXRpYyBpbnQgcG9saWN5X3RvX2FzcG1fc3RhdGUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJc3RydWN0IHBjaWVfbGlua19zdGF0ZSAqbGlua19zdGF0ZSA9IHBkZXYtPmxpbmtfc3RhdGU7CkBAIC0xMjUsNyArMTMzLDcgQEAKIAlsaW5rX3N0YXRlLT5jbGtfcG1fZW5hYmxlZCA9ICEhZW5hYmxlOwogfQogCi1zdGF0aWMgdm9pZCBwY2llX2NoZWNrX2Nsb2NrX3BtKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQorc3RhdGljIHZvaWQgcGNpZV9jaGVja19jbG9ja19wbShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGJsYWNrbGlzdCkKIHsKIAlpbnQgcG9zOwogCXUzMiByZWczMjsKQEAgLTE0OSwxMCArMTU3LDI2IEBACiAJCWlmICghKHJlZzE2ICYgUENJX0VYUF9MTktDVExfQ0xLUkVRX0VOKSkKIAkJCWVuYWJsZWQgPSAwOwogCX0KLQlsaW5rX3N0YXRlLT5jbGtfcG1fY2FwYWJsZSA9IGNhcGFibGU7CiAJbGlua19zdGF0ZS0+Y2xrX3BtX2VuYWJsZWQgPSBlbmFibGVkOwogCWxpbmtfc3RhdGUtPmJpb3NfY2xrX3N0YXRlID0gZW5hYmxlZDsKLQlwY2llX3NldF9jbG9ja19wbShwZGV2LCBwb2xpY3lfdG9fY2xrcG1fc3RhdGUocGRldikpOworCWlmICghYmxhY2tsaXN0KSB7CisJCWxpbmtfc3RhdGUtPmNsa19wbV9jYXBhYmxlID0gY2FwYWJsZTsKKwkJcGNpZV9zZXRfY2xvY2tfcG0ocGRldiwgcG9saWN5X3RvX2Nsa3BtX3N0YXRlKHBkZXYpKTsKKwl9IGVsc2UgeworCQlsaW5rX3N0YXRlLT5jbGtfcG1fY2FwYWJsZSA9IDA7CisJCXBjaWVfc2V0X2Nsb2NrX3BtKHBkZXYsIDApOworCX0KK30KKworc3RhdGljIGJvb2wgcGNpZV9hc3BtX2Rvd25zdHJlYW1faGFzX3N3aXRjaChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqY2hpbGRfZGV2OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGlsZF9kZXYsICZwZGV2LT5zdWJvcmRpbmF0ZS0+ZGV2aWNlcywgYnVzX2xpc3QpIHsKKwkJaWYgKGNoaWxkX2Rldi0+cGNpZV90eXBlID09IFBDSV9FWFBfVFlQRV9VUFNUUkVBTSkKKwkJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7CiB9CiAKIC8qCkBAIC0yMTcsMTYgKzI0MSwxOCBAQAogCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBwb3MgKyBQQ0lfRVhQX0xOS0NUTCwgcmVnMTYpOwogCiAJLyogV2FpdCBmb3IgbGluayB0cmFpbmluZyBlbmQgKi8KLQkvKiBicmVhayBvdXQgYWZ0ZXIgd2FpdGluZyBmb3IgMSBzZWNvbmQgKi8KKwkvKiBicmVhayBvdXQgYWZ0ZXIgd2FpdGluZyBmb3IgdGltZW91dCAqLwogCXN0YXJ0X2ppZmZpZXMgPSBqaWZmaWVzOwotCXdoaWxlICgoamlmZmllcyAtIHN0YXJ0X2ppZmZpZXMpIDwgSFopIHsKKwlmb3IgKDs7KSB7CiAJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIHBvcyArIFBDSV9FWFBfTE5LU1RBLCAmcmVnMTYpOwogCQlpZiAoIShyZWcxNiAmIFBDSV9FWFBfTE5LU1RBX0xUKSkKIAkJCWJyZWFrOwotCQljcHVfcmVsYXgoKTsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnRfamlmZmllcyArIExJTktfUkVUUkFJTl9USU1FT1VUKSkKKwkJCWJyZWFrOworCQltc2xlZXAoMSk7CiAJfQogCS8qIHRyYWluaW5nIGZhaWxlZCAtPiByZWNvdmVyICovCi0JaWYgKChqaWZmaWVzIC0gc3RhcnRfamlmZmllcykgPj0gSFopIHsKKwlpZiAocmVnMTYgJiBQQ0lfRVhQX0xOS1NUQV9MVCkgewogCQlkZXZfcHJpbnRrIChLRVJOX0VSUiwgJnBkZXYtPmRldiwgIkFTUE06IENvdWxkIG5vdCBjb25maWd1cmUiCiAJCQkgICAgIiBjb21tb24gY2xvY2tcbiIpOwogCQlpID0gMDsKQEAgLTQxOSw5ICs0NDUsOSBAQAogewogCXN0cnVjdCBwY2lfZGV2ICpjaGlsZF9kZXY7CiAKLQkvKiBJZiBubyBjaGlsZCwgZGlzYWJsZSB0aGUgbGluayAqLworCS8qIElmIG5vIGNoaWxkLCBpZ25vcmUgdGhlIGxpbmsgKi8KIAlpZiAobGlzdF9lbXB0eSgmcGRldi0+c3Vib3JkaW5hdGUtPmRldmljZXMpKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIHN0YXRlOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGRfZGV2LCAmcGRldi0+c3Vib3JkaW5hdGUtPmRldmljZXMsIGJ1c19saXN0KSB7CiAJCWlmIChjaGlsZF9kZXYtPnBjaWVfdHlwZSA9PSBQQ0lfRVhQX1RZUEVfUENJX0JSSURHRSkgewogCQkJLyoKQEAgLTQ2Miw2ICs0ODgsOSBAQAogCWludCB2YWxpZCA9IDE7CiAJc3RydWN0IHBjaWVfbGlua19zdGF0ZSAqbGlua19zdGF0ZSA9IHBkZXYtPmxpbmtfc3RhdGU7CiAKKwkvKiBJZiBubyBjaGlsZCwgZGlzYWJsZSB0aGUgbGluayAqLworCWlmIChsaXN0X2VtcHR5KCZwZGV2LT5zdWJvcmRpbmF0ZS0+ZGV2aWNlcykpCisJCXN0YXRlID0gMDsKIAkvKgogCSAqIGlmIHRoZSBkb3duc3RyZWFtIGNvbXBvbmVudCBoYXMgcGNpIGJyaWRnZSBmdW5jdGlvbiwgZG9uJ3QgZG8gQVNQTQogCSAqIG5vdwpAQCAtNDkzLDIwICs1MjIsNTIgQEAKIAlsaW5rX3N0YXRlLT5lbmFibGVkX3N0YXRlID0gc3RhdGU7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgcGNpZV9saW5rX3N0YXRlICpnZXRfcm9vdF9wb3J0X2xpbmsoc3RydWN0IHBjaWVfbGlua19zdGF0ZSAqbGluaykKK3sKKwlzdHJ1Y3QgcGNpZV9saW5rX3N0YXRlICpyb290X3BvcnRfbGluayA9IGxpbms7CisJd2hpbGUgKHJvb3RfcG9ydF9saW5rLT5wYXJlbnQpCisJCXJvb3RfcG9ydF9saW5rID0gcm9vdF9wb3J0X2xpbmstPnBhcmVudDsKKwlyZXR1cm4gcm9vdF9wb3J0X2xpbms7Cit9CisKKy8qIGNoZWNrIHRoZSB3aG9sZSBoaWVyYXJjaHksIGFuZCBjb25maWd1cmUgZWFjaCBsaW5rIGluIHRoZSBoaWVyYXJjaHkgKi8KIHN0YXRpYyB2b2lkIF9fcGNpZV9hc3BtX2NvbmZpZ3VyZV9saW5rX3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCXVuc2lnbmVkIGludCBzdGF0ZSkKIHsKIAlzdHJ1Y3QgcGNpZV9saW5rX3N0YXRlICpsaW5rX3N0YXRlID0gcGRldi0+bGlua19zdGF0ZTsKKwlzdHJ1Y3QgcGNpZV9saW5rX3N0YXRlICpyb290X3BvcnRfbGluayA9IGdldF9yb290X3BvcnRfbGluayhsaW5rX3N0YXRlKTsKKwlzdHJ1Y3QgcGNpZV9saW5rX3N0YXRlICpsZWFmOwogCi0JaWYgKGxpbmtfc3RhdGUtPnN1cHBvcnRfc3RhdGUgPT0gMCkKLQkJcmV0dXJuOwogCXN0YXRlICY9IFBDSUVfTElOS19TVEFURV9MMFN8UENJRV9MSU5LX1NUQVRFX0wxOwogCi0JLyogc3RhdGUgMCBtZWFucyBkaXNhYmxpbmcgYXNwbSAqLwotCXN0YXRlID0gcGNpZV9hc3BtX2NoZWNrX3N0YXRlKHBkZXYsIHN0YXRlKTsKKwkvKiBjaGVjayBhbGwgbGlua3Mgd2hvIGhhdmUgc3BlY2lmaWMgcm9vdCBwb3J0IGxpbmsgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxlYWYsICZsaW5rX2xpc3QsIHNpYmlsaW5nKSB7CisJCWlmICghbGlzdF9lbXB0eSgmbGVhZi0+Y2hpbGRyZW4pIHx8CisJCQlnZXRfcm9vdF9wb3J0X2xpbmsobGVhZikgIT0gcm9vdF9wb3J0X2xpbmspCisJCQljb250aW51ZTsKKwkJc3RhdGUgPSBwY2llX2FzcG1fY2hlY2tfc3RhdGUobGVhZi0+cGRldiwgc3RhdGUpOworCX0KKwkvKiBjaGVjayByb290IHBvcnQgbGluayB0b28gaW4gY2FzZSBpdCBoYXNuJ3QgY2hpbGRyZW4gKi8KKwlzdGF0ZSA9IHBjaWVfYXNwbV9jaGVja19zdGF0ZShyb290X3BvcnRfbGluay0+cGRldiwgc3RhdGUpOworCiAJaWYgKGxpbmtfc3RhdGUtPmVuYWJsZWRfc3RhdGUgPT0gc3RhdGUpCiAJCXJldHVybjsKLQlfX3BjaWVfYXNwbV9jb25maWdfbGluayhwZGV2LCBzdGF0ZSk7CisKKwkvKgorCSAqIHdlIG11c3QgY2hhbmdlIHRoZSBoaWVyYXJjaHkuIFNlZSBjb21tZW50cyBpbgorCSAqIF9fcGNpZV9hc3BtX2NvbmZpZ19saW5rIGZvciB0aGUgb3JkZXIKKwkgKiovCisJaWYgKHN0YXRlICYgUENJRV9MSU5LX1NUQVRFX0wxKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkobGVhZiwgJmxpbmtfbGlzdCwgc2liaWxpbmcpIHsKKwkJCWlmIChnZXRfcm9vdF9wb3J0X2xpbmsobGVhZikgPT0gcm9vdF9wb3J0X2xpbmspCisJCQkJX19wY2llX2FzcG1fY29uZmlnX2xpbmsobGVhZi0+cGRldiwgc3RhdGUpOworCQl9CisJfSBlbHNlIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKGxlYWYsICZsaW5rX2xpc3QsIHNpYmlsaW5nKSB7CisJCQlpZiAoZ2V0X3Jvb3RfcG9ydF9saW5rKGxlYWYpID09IHJvb3RfcG9ydF9saW5rKQorCQkJCV9fcGNpZV9hc3BtX2NvbmZpZ19saW5rKGxlYWYtPnBkZXYsIHN0YXRlKTsKKwkJfQorCX0KIH0KIAogLyoKQEAgLTU3MCw2ICs2MzEsNyBAQAogCXVuc2lnbmVkIGludCBzdGF0ZTsKIAlzdHJ1Y3QgcGNpZV9saW5rX3N0YXRlICpsaW5rX3N0YXRlOwogCWludCBlcnJvciA9IDA7CisJaW50IGJsYWNrbGlzdDsKIAogCWlmIChhc3BtX2Rpc2FibGVkIHx8ICFwZGV2LT5pc19wY2llIHx8IHBkZXYtPmxpbmtfc3RhdGUpCiAJCXJldHVybjsKQEAgLTU4MCwyOSArNjQyLDU4IEBACiAJaWYgKGxpc3RfZW1wdHkoJnBkZXYtPnN1Ym9yZGluYXRlLT5kZXZpY2VzKSkKIAkJZ290byBvdXQ7CiAKLQlpZiAocGNpZV9hc3BtX3Nhbml0eV9jaGVjayhwZGV2KSkKLQkJZ290byBvdXQ7CisJYmxhY2tsaXN0ID0gISFwY2llX2FzcG1fc2FuaXR5X2NoZWNrKHBkZXYpOwogCiAJbXV0ZXhfbG9jaygmYXNwbV9sb2NrKTsKIAogCWxpbmtfc3RhdGUgPSBremFsbG9jKHNpemVvZigqbGlua19zdGF0ZSksIEdGUF9LRVJORUwpOwogCWlmICghbGlua19zdGF0ZSkKIAkJZ290byB1bmxvY2tfb3V0OworCisJbGlua19zdGF0ZS0+ZG93bnN0cmVhbV9oYXNfc3dpdGNoID0gcGNpZV9hc3BtX2Rvd25zdHJlYW1faGFzX3N3aXRjaChwZGV2KTsKKwlJTklUX0xJU1RfSEVBRCgmbGlua19zdGF0ZS0+Y2hpbGRyZW4pOworCUlOSVRfTElTVF9IRUFEKCZsaW5rX3N0YXRlLT5saW5rKTsKKwlpZiAocGRldi0+YnVzLT5zZWxmKSB7LyogdGhpcyBpcyBhIHN3aXRjaCAqLworCQlzdHJ1Y3QgcGNpZV9saW5rX3N0YXRlICpwYXJlbnRfbGlua19zdGF0ZTsKKworCQlwYXJlbnRfbGlua19zdGF0ZSA9IHBkZXYtPmJ1cy0+cGFyZW50LT5zZWxmLT5saW5rX3N0YXRlOworCQlpZiAoIXBhcmVudF9saW5rX3N0YXRlKSB7CisJCQlrZnJlZShsaW5rX3N0YXRlKTsKKwkJCWdvdG8gdW5sb2NrX291dDsKKwkJfQorCQlsaXN0X2FkZCgmbGlua19zdGF0ZS0+bGluaywgJnBhcmVudF9saW5rX3N0YXRlLT5jaGlsZHJlbik7CisJCWxpbmtfc3RhdGUtPnBhcmVudCA9IHBhcmVudF9saW5rX3N0YXRlOworCX0KKwogCXBkZXYtPmxpbmtfc3RhdGUgPSBsaW5rX3N0YXRlOwogCi0JcGNpZV9hc3BtX2NvbmZpZ3VyZV9jb21tb25fY2xvY2socGRldik7Ci0KLQlwY2llX2FzcG1fY2FwX2luaXQocGRldik7Ci0KLQkvKiBjb25maWcgbGluayBzdGF0ZSB0byBhdm9pZCBCSU9TIGVycm9yICovCi0Jc3RhdGUgPSBwY2llX2FzcG1fY2hlY2tfc3RhdGUocGRldiwgcG9saWN5X3RvX2FzcG1fc3RhdGUocGRldikpOwotCV9fcGNpZV9hc3BtX2NvbmZpZ19saW5rKHBkZXYsIHN0YXRlKTsKLQotCXBjaWVfY2hlY2tfY2xvY2tfcG0ocGRldik7CisJaWYgKCFibGFja2xpc3QpIHsKKwkJcGNpZV9hc3BtX2NvbmZpZ3VyZV9jb21tb25fY2xvY2socGRldik7CisJCXBjaWVfYXNwbV9jYXBfaW5pdChwZGV2KTsKKwl9IGVsc2UgeworCQlsaW5rX3N0YXRlLT5lbmFibGVkX3N0YXRlID0gUENJRV9MSU5LX1NUQVRFX0wwU3xQQ0lFX0xJTktfU1RBVEVfTDE7CisJCWxpbmtfc3RhdGUtPmJpb3NfYXNwbV9zdGF0ZSA9IDA7CisJCS8qIFNldCBzdXBwb3J0IHN0YXRlIHRvIDAsIHNvIHdlIHdpbGwgZGlzYWJsZSBBU1BNIGxhdGVyICovCisJCWxpbmtfc3RhdGUtPnN1cHBvcnRfc3RhdGUgPSAwOworCX0KIAogCWxpbmtfc3RhdGUtPnBkZXYgPSBwZGV2OwogCWxpc3RfYWRkKCZsaW5rX3N0YXRlLT5zaWJpbGluZywgJmxpbmtfbGlzdCk7CiAKKwlpZiAobGlua19zdGF0ZS0+ZG93bnN0cmVhbV9oYXNfc3dpdGNoKSB7CisJCS8qCisJCSAqIElmIGxpbmsgaGFzIHN3aXRjaCwgZGVsYXkgdGhlIGxpbmsgY29uZmlnLiBUaGUgbGVhZiBsaW5rCisJCSAqIGluaXRpYWxpemF0aW9uIHdpbGwgY29uZmlnIHRoZSB3aG9sZSBoaWVyYXJjaHkuIGJ1dCB3ZSBtdXN0CisJCSAqIG1ha2Ugc3VyZSBCSU9TIGRvZXNuJ3Qgc2V0IHVuc3VwcG9ydGVkIGxpbmsgc3RhdGUKKwkJICoqLworCQlzdGF0ZSA9IHBjaWVfYXNwbV9jaGVja19zdGF0ZShwZGV2LCBsaW5rX3N0YXRlLT5iaW9zX2FzcG1fc3RhdGUpOworCQlfX3BjaWVfYXNwbV9jb25maWdfbGluayhwZGV2LCBzdGF0ZSk7CisJfSBlbHNlCisJCV9fcGNpZV9hc3BtX2NvbmZpZ3VyZV9saW5rX3N0YXRlKHBkZXYsCisJCQlwb2xpY3lfdG9fYXNwbV9zdGF0ZShwZGV2KSk7CisKKwlwY2llX2NoZWNrX2Nsb2NrX3BtKHBkZXYsIGJsYWNrbGlzdCk7CisKIHVubG9ja19vdXQ6CiAJaWYgKGVycm9yKQogCQlmcmVlX2xpbmtfc3RhdGUocGRldik7CkBAIC02MzUsNiArNzI2LDcgQEAKIAkvKiBBbGwgZnVuY3Rpb25zIGFyZSByZW1vdmVkLCBzbyBqdXN0IGRpc2FibGUgQVNQTSBmb3IgdGhlIGxpbmsgKi8KIAlfX3BjaWVfYXNwbV9jb25maWdfb25lX2RldihwYXJlbnQsIDApOwogCWxpc3RfZGVsKCZsaW5rX3N0YXRlLT5zaWJpbGluZyk7CisJbGlzdF9kZWwoJmxpbmtfc3RhdGUtPmxpbmspOwogCS8qIENsb2NrIFBNIGlzIGZvciBlbmRwb2ludCBkZXZpY2UgKi8KIAogCWZyZWVfbGlua19zdGF0ZShwYXJlbnQpOwpAQCAtODU3LDI0ICs5NDksMTUgQEAKIAkJYXNwbV9kaXNhYmxlZCA9IDE7CiB9CiAKLSNpZmRlZiBDT05GSUdfQUNQSQotI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2ktYWNwaS5oPgotc3RhdGljIHZvaWQgcGNpZV9hc3BtX3BsYXRmb3JtX2luaXQodm9pZCkKKy8qKgorICogcGNpZV9hc3BtX2VuYWJsZWQgLSBpcyBQQ0llIEFTUE0gZW5hYmxlZD8KKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgQVNQTSBoYXMgbm90IGJlZW4gZGlzYWJsZWQgYnkgdGhlIGNvbW1hbmQtbGluZSBvcHRpb24KKyAqIHBjaWVfYXNwbT1vZmYuCisgKiovCitpbnQgcGNpZV9hc3BtX2VuYWJsZWQodm9pZCkKIHsKLQlwY2llX29zY19zdXBwb3J0X3NldChPU0NfQUNUSVZFX1NUQVRFX1BXUl9TVVBQT1JUfAotCQlPU0NfQ0xPQ0tfUFdSX0NBUEFCSUxJVFlfU1VQUE9SVCk7CisgICAgICAgcmV0dXJuICFhc3BtX2Rpc2FibGVkOwogfQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBwY2llX2FzcG1fcGxhdGZvcm1faW5pdCh2b2lkKSB7IH0KLSNlbmRpZgorRVhQT1JUX1NZTUJPTChwY2llX2FzcG1fZW5hYmxlZCk7CiAKLXN0YXRpYyBpbnQgX19pbml0IHBjaWVfYXNwbV9pbml0KHZvaWQpCi17Ci0JaWYgKGFzcG1fZGlzYWJsZWQpCi0JCXJldHVybiAwOwotCXBjaWVfYXNwbV9wbGF0Zm9ybV9pbml0KCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWZzX2luaXRjYWxsKHBjaWVfYXNwbV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9idXMuYyBiL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9idXMuYwppbmRleCAzNTlmZTU1Li5lZWM4OWI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfYnVzLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X2J1cy5jCkBAIC0xNiwxNCArMTYsMTAgQEAKICNpbmNsdWRlICJwb3J0ZHJ2LmgiCiAKIHN0YXRpYyBpbnQgcGNpZV9wb3J0X2J1c19tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpOwotc3RhdGljIGludCBwY2llX3BvcnRfYnVzX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOwotc3RhdGljIGludCBwY2llX3BvcnRfYnVzX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogCiBzdHJ1Y3QgYnVzX3R5cGUgcGNpZV9wb3J0X2J1c190eXBlID0gewogCS5uYW1lIAkJPSAicGNpX2V4cHJlc3MiLAogCS5tYXRjaCAJCT0gcGNpZV9wb3J0X2J1c19tYXRjaCwKLQkuc3VzcGVuZAk9IHBjaWVfcG9ydF9idXNfc3VzcGVuZCwKLQkucmVzdW1lCQk9IHBjaWVfcG9ydF9idXNfcmVzdW1lLCAKIH07CiBFWFBPUlRfU1lNQk9MX0dQTChwY2llX3BvcnRfYnVzX3R5cGUpOwogCkBAIC00OSwzMiArNDUsMTIgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCBwY2llX3BvcnRfYnVzX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCitpbnQgcGNpZV9wb3J0X2J1c19yZWdpc3Rlcih2b2lkKQogewotCXN0cnVjdCBwY2llX2RldmljZSAqcGNpZWRldjsKLQlzdHJ1Y3QgcGNpZV9wb3J0X3NlcnZpY2VfZHJpdmVyICpkcml2ZXI7Ci0KLQlpZiAoIWRldiB8fCAhZGV2LT5kcml2ZXIpCi0JCXJldHVybiAwOwotCi0JcGNpZWRldiA9IHRvX3BjaWVfZGV2aWNlKGRldik7Ci0gCWRyaXZlciA9IHRvX3NlcnZpY2VfZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQlpZiAoZHJpdmVyICYmIGRyaXZlci0+c3VzcGVuZCkKLQkJZHJpdmVyLT5zdXNwZW5kKHBjaWVkZXYsIHN0YXRlKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gYnVzX3JlZ2lzdGVyKCZwY2llX3BvcnRfYnVzX3R5cGUpOwogfQogCi1zdGF0aWMgaW50IHBjaWVfcG9ydF9idXNfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3ZvaWQgcGNpZV9wb3J0X2J1c191bnJlZ2lzdGVyKHZvaWQpCiB7Ci0Jc3RydWN0IHBjaWVfZGV2aWNlICpwY2llZGV2OwotCXN0cnVjdCBwY2llX3BvcnRfc2VydmljZV9kcml2ZXIgKmRyaXZlcjsKLQotCWlmICghZGV2IHx8ICFkZXYtPmRyaXZlcikKLQkJcmV0dXJuIDA7Ci0KLQlwY2llZGV2ID0gdG9fcGNpZV9kZXZpY2UoZGV2KTsKLSAJZHJpdmVyID0gdG9fc2VydmljZV9kcml2ZXIoZGV2LT5kcml2ZXIpOwotCWlmIChkcml2ZXIgJiYgZHJpdmVyLT5yZXN1bWUpCi0JCWRyaXZlci0+cmVzdW1lKHBjaWVkZXYpOwotCXJldHVybiAwOworCWJ1c191bnJlZ2lzdGVyKCZwY2llX3BvcnRfYnVzX3R5cGUpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X2NvcmUuYyBiL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9jb3JlLmMKaW5kZXggMmUwOTFlMC4uOGIzZjhjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X2NvcmUuYworKysgYi9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfY29yZS5jCkBAIC0xOSw5MSArMTksMTUgQEAKIAogZXh0ZXJuIGludCBwY2llX21jaF9xdWlyazsJLyogTVNJLXF1aXJrIEluZGljYXRvciAqLwogCi1zdGF0aWMgaW50IHBjaWVfcG9ydF9wcm9iZV9zZXJ2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcGNpZV9kZXZpY2UgKnBjaWVkZXY7Ci0Jc3RydWN0IHBjaWVfcG9ydF9zZXJ2aWNlX2RyaXZlciAqZHJpdmVyOwotCWludCBzdGF0dXM7Ci0KLQlpZiAoIWRldiB8fCAhZGV2LT5kcml2ZXIpCi0JCXJldHVybiAtRU5PREVWOwotCi0gCWRyaXZlciA9IHRvX3NlcnZpY2VfZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQlpZiAoIWRyaXZlciB8fCAhZHJpdmVyLT5wcm9iZSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlwY2llZGV2ID0gdG9fcGNpZV9kZXZpY2UoZGV2KTsKLQlzdGF0dXMgPSBkcml2ZXItPnByb2JlKHBjaWVkZXYsIGRyaXZlci0+aWRfdGFibGUpOwotCWlmICghc3RhdHVzKSB7Ci0JCWRldl9wcmludGsoS0VSTl9ERUJVRywgZGV2LCAic2VydmljZSBkcml2ZXIgJXMgbG9hZGVkXG4iLAotCQkJZHJpdmVyLT5uYW1lKTsKLQkJZ2V0X2RldmljZShkZXYpOwotCX0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgaW50IHBjaWVfcG9ydF9yZW1vdmVfc2VydmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHBjaWVfZGV2aWNlICpwY2llZGV2OwotCXN0cnVjdCBwY2llX3BvcnRfc2VydmljZV9kcml2ZXIgKmRyaXZlcjsKLQotCWlmICghZGV2IHx8ICFkZXYtPmRyaXZlcikKLQkJcmV0dXJuIDA7Ci0KLQlwY2llZGV2ID0gdG9fcGNpZV9kZXZpY2UoZGV2KTsKLSAJZHJpdmVyID0gdG9fc2VydmljZV9kcml2ZXIoZGV2LT5kcml2ZXIpOwotCWlmIChkcml2ZXIgJiYgZHJpdmVyLT5yZW1vdmUpIHsgCi0JCWRldl9wcmludGsoS0VSTl9ERUJVRywgZGV2LCAidW5sb2FkaW5nIHNlcnZpY2UgZHJpdmVyICVzXG4iLAotCQkJZHJpdmVyLT5uYW1lKTsKLQkJZHJpdmVyLT5yZW1vdmUocGNpZWRldik7Ci0JCXB1dF9kZXZpY2UoZGV2KTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHBjaWVfcG9ydF9zaHV0ZG93bl9zZXJ2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikge30KLQotc3RhdGljIGludCBwY2llX3BvcnRfc3VzcGVuZF9zZXJ2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQotewotCXN0cnVjdCBwY2llX2RldmljZSAqcGNpZWRldjsKLQlzdHJ1Y3QgcGNpZV9wb3J0X3NlcnZpY2VfZHJpdmVyICpkcml2ZXI7Ci0KLQlpZiAoIWRldiB8fCAhZGV2LT5kcml2ZXIpCi0JCXJldHVybiAwOwotCi0JcGNpZWRldiA9IHRvX3BjaWVfZGV2aWNlKGRldik7Ci0gCWRyaXZlciA9IHRvX3NlcnZpY2VfZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQlpZiAoZHJpdmVyICYmIGRyaXZlci0+c3VzcGVuZCkKLQkJZHJpdmVyLT5zdXNwZW5kKHBjaWVkZXYsIHN0YXRlKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBwY2llX3BvcnRfcmVzdW1lX3NlcnZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBwY2llX2RldmljZSAqcGNpZWRldjsKLQlzdHJ1Y3QgcGNpZV9wb3J0X3NlcnZpY2VfZHJpdmVyICpkcml2ZXI7Ci0KLQlpZiAoIWRldiB8fCAhZGV2LT5kcml2ZXIpCi0JCXJldHVybiAwOwotCi0JcGNpZWRldiA9IHRvX3BjaWVfZGV2aWNlKGRldik7Ci0gCWRyaXZlciA9IHRvX3NlcnZpY2VfZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQotCWlmIChkcml2ZXIgJiYgZHJpdmVyLT5yZXN1bWUpCi0JCWRyaXZlci0+cmVzdW1lKHBjaWVkZXYpOwotCXJldHVybiAwOwotfQotCi0vKgotICogcmVsZWFzZV9wY2llX2RldmljZQotICoJCi0gKglCZWluZyBpbnZva2VkIGF1dG9tYXRpY2FsbHkgd2hlbiBkZXZpY2UgaXMgYmVpbmcgcmVtb3ZlZCAKLSAqCWluIHJlc3BvbnNlIHRvIGRldmljZV91bnJlZ2lzdGVyKGRldikgY2FsbC4KLSAqCVJlbGVhc2UgYWxsIHJlc291cmNlcyBiZWluZyBjbGFpbWVkLgorLyoqCisgKiByZWxlYXNlX3BjaWVfZGV2aWNlIC0gZnJlZSBQQ0kgRXhwcmVzcyBwb3J0IHNlcnZpY2UgZGV2aWNlIHN0cnVjdHVyZQorICogQGRldjogUG9ydCBzZXJ2aWNlIGRldmljZSB0byByZWxlYXNlCisgKgorICogSW52b2tlZCBhdXRvbWF0aWNhbGx5IHdoZW4gZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWQgaW4gcmVzcG9uc2UgdG8KKyAqIGRldmljZV91bnJlZ2lzdGVyKGRldikuICBSZWxlYXNlIGFsbCByZXNvdXJjZXMgYmVpbmcgY2xhaW1lZC4KICAqLwogc3RhdGljIHZvaWQgcmVsZWFzZV9wY2llX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JZGV2X3ByaW50ayhLRVJOX0RFQlVHLCBkZXYsICJmcmVlIHBvcnQgc2VydmljZVxuIik7CiAJa2ZyZWUodG9fcGNpZV9kZXZpY2UoZGV2KSk7CQkJCiB9CiAKQEAgLTEyOCw3ICs1MiwxNiBAQAogCX0KIAlyZXR1cm4gcXVpcms7CiB9Ci0JCisKKy8qKgorICogYXNzaWduX2ludGVycnVwdF9tb2RlIC0gY2hvb3NlIGludGVycnVwdCBtb2RlIGZvciBQQ0kgRXhwcmVzcyBwb3J0IHNlcnZpY2VzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAoSU5UeCwgTVNJLVgsIE1TSSkgYW5kIHNldCB1cCB2ZWN0b3JzCisgKiBAZGV2OiBQQ0kgRXhwcmVzcyBwb3J0IHRvIGhhbmRsZQorICogQHZlY3RvcnM6IEFycmF5IG9mIGludGVycnVwdCB2ZWN0b3JzIHRvIHBvcHVsYXRlCisgKiBAbWFzazogQml0bWFzayBvZiBwb3J0IGNhcGFiaWxpdGllcyByZXR1cm5lZCBieSBnZXRfcG9ydF9kZXZpY2VfY2FwYWJpbGl0eSgpCisgKgorICogUmV0dXJuIHZhbHVlOiBJbnRlcnJ1cHQgbW9kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHBvcnQKKyAqLwogc3RhdGljIGludCBhc3NpZ25faW50ZXJydXB0X21vZGUoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50ICp2ZWN0b3JzLCBpbnQgbWFzaykKIHsKIAlpbnQgaSwgcG9zLCBudmVjLCBzdGF0dXMgPSAtRUlOVkFMOwpAQCAtMTUwLDcgKzgzLDYgQEAKIAlpZiAocG9zKSB7CiAJCXN0cnVjdCBtc2l4X2VudHJ5IG1zaXhfZW50cmllc1tQQ0lFX1BPUlRfREVWSUNFX01BWFNFUlZJQ0VTXSA9IAogCQkJe3swLCAwfSwgezAsIDF9LCB7MCwgMn0sIHswLCAzfX07Ci0JCWRldl9pbmZvKCZkZXYtPmRldiwgImZvdW5kIE1TSS1YIGNhcGFiaWxpdHlcbiIpOwogCQlzdGF0dXMgPSBwY2lfZW5hYmxlX21zaXgoZGV2LCBtc2l4X2VudHJpZXMsIG52ZWMpOwogCQlpZiAoIXN0YXR1cykgewogCQkJaW50IGogPSAwOwpAQCAtMTY1LDcgKzk3LDYgQEAKIAlpZiAoc3RhdHVzKSB7CiAJCXBvcyA9IHBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LCBQQ0lfQ0FQX0lEX01TSSk7CiAJCWlmIChwb3MpIHsKLQkJCWRldl9pbmZvKCZkZXYtPmRldiwgImZvdW5kIE1TSSBjYXBhYmlsaXR5XG4iKTsKIAkJCXN0YXR1cyA9IHBjaV9lbmFibGVfbXNpKGRldik7CiAJCQlpZiAoIXN0YXR1cykgewogCQkJCWludGVycnVwdF9tb2RlID0gUENJRV9QT1JUX01TSV9NT0RFOwpAQCAtMTc3LDYgKzEwOCwxNiBAQAogCXJldHVybiBpbnRlcnJ1cHRfbW9kZTsKIH0KIAorLyoqCisgKiBnZXRfcG9ydF9kZXZpY2VfY2FwYWJpbGl0eSAtIGRpc2NvdmVyIGNhcGFiaWxpdGllcyBvZiBhIFBDSSBFeHByZXNzIHBvcnQKKyAqIEBkZXY6IFBDSSBFeHByZXNzIHBvcnQgdG8gZXhhbWluZQorICoKKyAqIFRoZSBjYXBhYmlsaXRpZXMgYXJlIHJlYWQgZnJvbSB0aGUgcG9ydCdzIFBDSSBFeHByZXNzIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzCisgKiBhcyBkZXNjcmliZWQgaW4gUENJIEV4cHJlc3MgQmFzZSBTcGVjaWZpY2F0aW9uIDEuMGEgc2VjdGlvbnMgNy44LjIsIDcuOC45IGFuZAorICogNy45IC0gNy4xMS4KKyAqCisgKiBSZXR1cm4gdmFsdWU6IEJpdG1hc2sgb2YgZGlzY292ZXJlZCBwb3J0IGNhcGFiaWxpdGllcworICovCiBzdGF0aWMgaW50IGdldF9wb3J0X2RldmljZV9jYXBhYmlsaXR5KHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJaW50IHNlcnZpY2VzID0gMCwgcG9zOwpAQCAtMjA0LDYgKzE0NSwxNSBAQAogCXJldHVybiBzZXJ2aWNlczsKIH0KIAorLyoqCisgKiBwY2llX2RldmljZV9pbml0IC0gaW5pdGlhbGl6ZSBQQ0kgRXhwcmVzcyBwb3J0IHNlcnZpY2UgZGV2aWNlCisgKiBAZGV2OiBQb3J0IHNlcnZpY2UgZGV2aWNlIHRvIGluaXRpYWxpemUKKyAqIEBwYXJlbnQ6IFBDSSBFeHByZXNzIHBvcnQgdG8gYXNzb2NpYXRlIHRoZSBzZXJ2aWNlIGRldmljZSB3aXRoCisgKiBAcG9ydF90eXBlOiBUeXBlIG9mIHRoZSBwb3J0CisgKiBAc2VydmljZV90eXBlOiBUeXBlIG9mIHNlcnZpY2UgdG8gYXNzb2NpYXRlIHdpdGggdGhlIHNlcnZpY2UgZGV2aWNlCisgKiBAaXJxOiBJbnRlcnJ1cHQgdmVjdG9yIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBzZXJ2aWNlIGRldmljZQorICogQGlycV9tb2RlOiBJbnRlcnJ1cHQgbW9kZSBvZiB0aGUgc2VydmljZSAoSU5UeCwgTVNJLVgsIE1TSSkKKyAqLwogc3RhdGljIHZvaWQgcGNpZV9kZXZpY2VfaW5pdChzdHJ1Y3QgcGNpX2RldiAqcGFyZW50LCBzdHJ1Y3QgcGNpZV9kZXZpY2UgKmRldiwgCiAJaW50IHBvcnRfdHlwZSwgaW50IHNlcnZpY2VfdHlwZSwgaW50IGlycSwgaW50IGlycV9tb2RlKQogewpAQCAtMjI0LDExICsxNzQsMTkgQEAKIAlkZXZpY2UtPmRyaXZlciA9IE5VTEw7CiAJZGV2aWNlLT5kcml2ZXJfZGF0YSA9IE5VTEw7CiAJZGV2aWNlLT5yZWxlYXNlID0gcmVsZWFzZV9wY2llX2RldmljZTsJLyogY2FsbGJhY2sgdG8gZnJlZSBwY2llIGRldiAqLwotCXNucHJpbnRmKGRldmljZS0+YnVzX2lkLCBzaXplb2YoZGV2aWNlLT5idXNfaWQpLCAiJXM6cGNpZSUwMngiLAorCWRldl9zZXRfbmFtZShkZXZpY2UsICIlczpwY2llJTAyeCIsCiAJCSBwY2lfbmFtZShwYXJlbnQpLCBnZXRfZGVzY3JpcHRvcl9pZChwb3J0X3R5cGUsIHNlcnZpY2VfdHlwZSkpOwogCWRldmljZS0+cGFyZW50ID0gJnBhcmVudC0+ZGV2OwogfQogCisvKioKKyAqIGFsbG9jX3BjaWVfZGV2aWNlIC0gYWxsb2NhdGUgUENJIEV4cHJlc3MgcG9ydCBzZXJ2aWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBwYXJlbnQ6IFBDSSBFeHByZXNzIHBvcnQgdG8gYXNzb2NpYXRlIHRoZSBzZXJ2aWNlIGRldmljZSB3aXRoCisgKiBAcG9ydF90eXBlOiBUeXBlIG9mIHRoZSBwb3J0CisgKiBAc2VydmljZV90eXBlOiBUeXBlIG9mIHNlcnZpY2UgdG8gYXNzb2NpYXRlIHdpdGggdGhlIHNlcnZpY2UgZGV2aWNlCisgKiBAaXJxOiBJbnRlcnJ1cHQgdmVjdG9yIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBzZXJ2aWNlIGRldmljZQorICogQGlycV9tb2RlOiBJbnRlcnJ1cHQgbW9kZSBvZiB0aGUgc2VydmljZSAoSU5UeCwgTVNJLVgsIE1TSSkKKyAqLwogc3RhdGljIHN0cnVjdCBwY2llX2RldmljZSogYWxsb2NfcGNpZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKnBhcmVudCwKIAlpbnQgcG9ydF90eXBlLCBpbnQgc2VydmljZV90eXBlLCBpbnQgaXJxLCBpbnQgaXJxX21vZGUpCiB7CkBAIC0yMzksMTAgKzE5NywxMyBAQAogCQlyZXR1cm4gTlVMTDsKIAogCXBjaWVfZGV2aWNlX2luaXQocGFyZW50LCBkZXZpY2UsIHBvcnRfdHlwZSwgc2VydmljZV90eXBlLCBpcnEsaXJxX21vZGUpOwotCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmRldmljZS0+ZGV2aWNlLCAiYWxsb2NhdGUgcG9ydCBzZXJ2aWNlXG4iKTsKIAlyZXR1cm4gZGV2aWNlOwogfQogCisvKioKKyAqIHBjaWVfcG9ydF9kZXZpY2VfcHJvYmUgLSBjaGVjayBpZiBkZXZpY2UgaXMgYSBQQ0kgRXhwcmVzcyBwb3J0CisgKiBAZGV2OiBEZXZpY2UgdG8gY2hlY2sKKyAqLwogaW50IHBjaWVfcG9ydF9kZXZpY2VfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlpbnQgcG9zLCB0eXBlOwpAQCAtMjYwLDYgKzIyMSwxMyBAQAogCXJldHVybiAtRU5PREVWOwogfQogCisvKioKKyAqIHBjaWVfcG9ydF9kZXZpY2VfcmVnaXN0ZXIgLSByZWdpc3RlciBQQ0kgRXhwcmVzcyBwb3J0CisgKiBAZGV2OiBQQ0kgRXhwcmVzcyBwb3J0IHRvIHJlZ2lzdGVyCisgKgorICogQWxsb2NhdGUgdGhlIHBvcnQgZXh0ZW5zaW9uIHN0cnVjdHVyZSBhbmQgcmVnaXN0ZXIgc2VydmljZXMgYXNzb2NpYXRlZCB3aXRoCisgKiB0aGUgcG9ydC4KKyAqLwogaW50IHBjaWVfcG9ydF9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgcGNpZV9wb3J0X2RldmljZV9leHQgKnBfZXh0OwpAQCAtMzIzLDYgKzI5MSwxMSBAQAogCXJldHVybiAwOwogfQogCisvKioKKyAqIHBjaWVfcG9ydF9kZXZpY2Vfc3VzcGVuZCAtIHN1c3BlbmQgcG9ydCBzZXJ2aWNlcyBhc3NvY2lhdGVkIHdpdGggYSBQQ0llIHBvcnQKKyAqIEBkZXY6IFBDSSBFeHByZXNzIHBvcnQgdG8gaGFuZGxlCisgKiBAc3RhdGU6IFJlcHJlc2VudGF0aW9uIG9mIHN5c3RlbSBwb3dlciBtYW5hZ2VtZW50IHRyYW5zaXRpb24gaW4gcHJvZ3Jlc3MKKyAqLwogaW50IHBjaWVfcG9ydF9kZXZpY2Vfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CiAJcmV0dXJuIGRldmljZV9mb3JfZWFjaF9jaGlsZCgmZGV2LT5kZXYsICZzdGF0ZSwgc3VzcGVuZF9pdGVyKTsKQEAgLTM0MSw2ICszMTQsMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoqCisgKiBwY2llX3BvcnRfZGV2aWNlX3N1c3BlbmQgLSByZXN1bWUgcG9ydCBzZXJ2aWNlcyBhc3NvY2lhdGVkIHdpdGggYSBQQ0llIHBvcnQKKyAqIEBkZXY6IFBDSSBFeHByZXNzIHBvcnQgdG8gaGFuZGxlCisgKi8KIGludCBwY2llX3BvcnRfZGV2aWNlX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXJldHVybiBkZXZpY2VfZm9yX2VhY2hfY2hpbGQoJmRldi0+ZGV2LCBOVUxMLCByZXN1bWVfaXRlcik7CkBAIC0zNjMsNiArMzQwLDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogcGNpZV9wb3J0X2RldmljZV9yZW1vdmUgLSB1bnJlZ2lzdGVyIFBDSSBFeHByZXNzIHBvcnQgc2VydmljZSBkZXZpY2VzCisgKiBAZGV2OiBQQ0kgRXhwcmVzcyBwb3J0IHRoZSBzZXJ2aWNlIGRldmljZXMgdG8gdW5yZWdpc3RlciBhcmUgYXNzb2NpYXRlZCB3aXRoCisgKgorICogUmVtb3ZlIFBDSSBFeHByZXNzIHBvcnQgc2VydmljZSBkZXZpY2VzIGFzc29jaWF0ZWQgd2l0aCBnaXZlbiBwb3J0IGFuZAorICogZGlzYWJsZSBNU0ktWCBvciBNU0kgZm9yIHRoZSBwb3J0LgorICovCiB2b2lkIHBjaWVfcG9ydF9kZXZpY2VfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2aWNlOwpAQCAtMzg2LDE2ICszNzAsODAgQEAKIAkJcGNpX2Rpc2FibGVfbXNpKGRldik7CiB9CiAKLWludCBwY2llX3BvcnRfYnVzX3JlZ2lzdGVyKHZvaWQpCisvKioKKyAqIHBjaWVfcG9ydF9wcm9iZV9zZXJ2aWNlIC0gcHJvYmUgZHJpdmVyIGZvciBnaXZlbiBQQ0kgRXhwcmVzcyBwb3J0IHNlcnZpY2UKKyAqIEBkZXY6IFBDSSBFeHByZXNzIHBvcnQgc2VydmljZSBkZXZpY2UgdG8gcHJvYmUgYWdhaW5zdAorICoKKyAqIElmIFBDSSBFeHByZXNzIHBvcnQgc2VydmljZSBkcml2ZXIgaXMgcmVnaXN0ZXJlZCB3aXRoCisgKiBwY2llX3BvcnRfc2VydmljZV9yZWdpc3RlcigpLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGJ5IHRoZSBkcml2ZXIgY29yZQorICogd2hlbmV2ZXIgbWF0Y2ggaXMgZm91bmQgYmV0d2VlbiB0aGUgZHJpdmVyIGFuZCBhIHBvcnQgc2VydmljZSBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbnQgcGNpZV9wb3J0X3Byb2JlX3NlcnZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQogewotCXJldHVybiBidXNfcmVnaXN0ZXIoJnBjaWVfcG9ydF9idXNfdHlwZSk7CisJc3RydWN0IHBjaWVfZGV2aWNlICpwY2llZGV2OworCXN0cnVjdCBwY2llX3BvcnRfc2VydmljZV9kcml2ZXIgKmRyaXZlcjsKKwlpbnQgc3RhdHVzOworCisJaWYgKCFkZXYgfHwgIWRldi0+ZHJpdmVyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRyaXZlciA9IHRvX3NlcnZpY2VfZHJpdmVyKGRldi0+ZHJpdmVyKTsKKwlpZiAoIWRyaXZlciB8fCAhZHJpdmVyLT5wcm9iZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwY2llZGV2ID0gdG9fcGNpZV9kZXZpY2UoZGV2KTsKKwlzdGF0dXMgPSBkcml2ZXItPnByb2JlKHBjaWVkZXYsIGRyaXZlci0+aWRfdGFibGUpOworCWlmICghc3RhdHVzKSB7CisJCWRldl9wcmludGsoS0VSTl9ERUJVRywgZGV2LCAic2VydmljZSBkcml2ZXIgJXMgbG9hZGVkXG4iLAorCQkJZHJpdmVyLT5uYW1lKTsKKwkJZ2V0X2RldmljZShkZXYpOworCX0KKwlyZXR1cm4gc3RhdHVzOwogfQogCi12b2lkIHBjaWVfcG9ydF9idXNfdW5yZWdpc3Rlcih2b2lkKQorLyoqCisgKiBwY2llX3BvcnRfcmVtb3ZlX3NlcnZpY2UgLSBkZXRhY2ggZHJpdmVyIGZyb20gZ2l2ZW4gUENJIEV4cHJlc3MgcG9ydCBzZXJ2aWNlCisgKiBAZGV2OiBQQ0kgRXhwcmVzcyBwb3J0IHNlcnZpY2UgZGV2aWNlIHRvIGhhbmRsZQorICoKKyAqIElmIFBDSSBFeHByZXNzIHBvcnQgc2VydmljZSBkcml2ZXIgaXMgcmVnaXN0ZXJlZCB3aXRoCisgKiBwY2llX3BvcnRfc2VydmljZV9yZWdpc3RlcigpLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGJ5IHRoZSBkcml2ZXIgY29yZQorICogd2hlbiBkZXZpY2VfdW5yZWdpc3RlcigpIGlzIGNhbGxlZCBmb3IgdGhlIHBvcnQgc2VydmljZSBkZXZpY2UgYXNzb2NpYXRlZAorICogd2l0aCB0aGUgZHJpdmVyLgorICovCitzdGF0aWMgaW50IHBjaWVfcG9ydF9yZW1vdmVfc2VydmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JYnVzX3VucmVnaXN0ZXIoJnBjaWVfcG9ydF9idXNfdHlwZSk7CisJc3RydWN0IHBjaWVfZGV2aWNlICpwY2llZGV2OworCXN0cnVjdCBwY2llX3BvcnRfc2VydmljZV9kcml2ZXIgKmRyaXZlcjsKKworCWlmICghZGV2IHx8ICFkZXYtPmRyaXZlcikKKwkJcmV0dXJuIDA7CisKKwlwY2llZGV2ID0gdG9fcGNpZV9kZXZpY2UoZGV2KTsKKwlkcml2ZXIgPSB0b19zZXJ2aWNlX2RyaXZlcihkZXYtPmRyaXZlcik7CisJaWYgKGRyaXZlciAmJiBkcml2ZXItPnJlbW92ZSkgeworCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsIGRldiwgInVubG9hZGluZyBzZXJ2aWNlIGRyaXZlciAlc1xuIiwKKwkJCWRyaXZlci0+bmFtZSk7CisJCWRyaXZlci0+cmVtb3ZlKHBjaWVkZXYpOworCQlwdXRfZGV2aWNlKGRldik7CisJfQorCXJldHVybiAwOwogfQogCisvKioKKyAqIHBjaWVfcG9ydF9zaHV0ZG93bl9zZXJ2aWNlIC0gc2h1dCBkb3duIGdpdmVuIFBDSSBFeHByZXNzIHBvcnQgc2VydmljZQorICogQGRldjogUENJIEV4cHJlc3MgcG9ydCBzZXJ2aWNlIGRldmljZSB0byBoYW5kbGUKKyAqCisgKiBJZiBQQ0kgRXhwcmVzcyBwb3J0IHNlcnZpY2UgZHJpdmVyIGlzIHJlZ2lzdGVyZWQgd2l0aAorICogcGNpZV9wb3J0X3NlcnZpY2VfcmVnaXN0ZXIoKSwgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBieSB0aGUgZHJpdmVyIGNvcmUKKyAqIHdoZW4gZGV2aWNlX3NodXRkb3duKCkgaXMgY2FsbGVkIGZvciB0aGUgcG9ydCBzZXJ2aWNlIGRldmljZSBhc3NvY2lhdGVkCisgKiB3aXRoIHRoZSBkcml2ZXIuCisgKi8KK3N0YXRpYyB2b2lkIHBjaWVfcG9ydF9zaHV0ZG93bl9zZXJ2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikge30KKworLyoqCisgKiBwY2llX3BvcnRfc2VydmljZV9yZWdpc3RlciAtIHJlZ2lzdGVyIFBDSSBFeHByZXNzIHBvcnQgc2VydmljZSBkcml2ZXIKKyAqIEBuZXc6IFBDSSBFeHByZXNzIHBvcnQgc2VydmljZSBkcml2ZXIgdG8gcmVnaXN0ZXIKKyAqLwogaW50IHBjaWVfcG9ydF9zZXJ2aWNlX3JlZ2lzdGVyKHN0cnVjdCBwY2llX3BvcnRfc2VydmljZV9kcml2ZXIgKm5ldykKIHsKIAluZXctPmRyaXZlci5uYW1lID0gKGNoYXIgKiluZXctPm5hbWU7CkBAIC00MDMsMTUgKzQ1MSwxNyBAQAogCW5ldy0+ZHJpdmVyLnByb2JlID0gcGNpZV9wb3J0X3Byb2JlX3NlcnZpY2U7CiAJbmV3LT5kcml2ZXIucmVtb3ZlID0gcGNpZV9wb3J0X3JlbW92ZV9zZXJ2aWNlOwogCW5ldy0+ZHJpdmVyLnNodXRkb3duID0gcGNpZV9wb3J0X3NodXRkb3duX3NlcnZpY2U7Ci0JbmV3LT5kcml2ZXIuc3VzcGVuZCA9IHBjaWVfcG9ydF9zdXNwZW5kX3NlcnZpY2U7Ci0JbmV3LT5kcml2ZXIucmVzdW1lID0gcGNpZV9wb3J0X3Jlc3VtZV9zZXJ2aWNlOwogCiAJcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmbmV3LT5kcml2ZXIpOwogfQogCi12b2lkIHBjaWVfcG9ydF9zZXJ2aWNlX3VucmVnaXN0ZXIoc3RydWN0IHBjaWVfcG9ydF9zZXJ2aWNlX2RyaXZlciAqbmV3KQorLyoqCisgKiBwY2llX3BvcnRfc2VydmljZV91bnJlZ2lzdGVyIC0gdW5yZWdpc3RlciBQQ0kgRXhwcmVzcyBwb3J0IHNlcnZpY2UgZHJpdmVyCisgKiBAZHJ2OiBQQ0kgRXhwcmVzcyBwb3J0IHNlcnZpY2UgZHJpdmVyIHRvIHVucmVnaXN0ZXIKKyAqLwordm9pZCBwY2llX3BvcnRfc2VydmljZV91bnJlZ2lzdGVyKHN0cnVjdCBwY2llX3BvcnRfc2VydmljZV9kcml2ZXIgKmRydikKIHsKLQlkcml2ZXJfdW5yZWdpc3RlcigmbmV3LT5kcml2ZXIpOworCWRyaXZlcl91bnJlZ2lzdGVyKCZkcnYtPmRyaXZlcik7CiB9CiAKIEVYUE9SVF9TWU1CT0wocGNpZV9wb3J0X3NlcnZpY2VfcmVnaXN0ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X3BjaS5jIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X3BjaS5jCmluZGV4IDU4NDQyMmQuLjk5YTkxNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9wY2kuYworKysgYi9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfcGNpLmMKQEAgLTQxLDcgKzQxLDYgQEAKIHsKIAlpbnQgcmV0dmFsOwogCi0JcGNpX3Jlc3RvcmVfc3RhdGUoZGV2KTsKIAlyZXR2YWwgPSBwY2lfZW5hYmxlX2RldmljZShkZXYpOwogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CkBAIC01MiwxMSArNTEsMTggQEAKICNpZmRlZiBDT05GSUdfUE0KIHN0YXRpYyBpbnQgcGNpZV9wb3J0ZHJ2X3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewotCWludCByZXQgPSBwY2llX3BvcnRfZGV2aWNlX3N1c3BlbmQoZGV2LCBzdGF0ZSk7CisJcmV0dXJuIHBjaWVfcG9ydF9kZXZpY2Vfc3VzcGVuZChkZXYsIHN0YXRlKTsKIAotCWlmICghcmV0KQotCQlyZXQgPSBwY2llX3BvcnRkcnZfc2F2ZV9jb25maWcoZGV2KTsKLQlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHBjaWVfcG9ydGRydl9zdXNwZW5kX2xhdGUoc3RydWN0IHBjaV9kZXYgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXJldHVybiBwY2lfc2F2ZV9zdGF0ZShkZXYpOworfQorCitzdGF0aWMgaW50IHBjaWVfcG9ydGRydl9yZXN1bWVfZWFybHkoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlyZXR1cm4gcGNpX3Jlc3RvcmVfc3RhdGUoZGV2KTsKIH0KIAogc3RhdGljIGludCBwY2llX3BvcnRkcnZfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpkZXYpCkBAIC02Niw2ICs3Miw4IEBACiB9CiAjZWxzZQogI2RlZmluZSBwY2llX3BvcnRkcnZfc3VzcGVuZCBOVUxMCisjZGVmaW5lIHBjaWVfcG9ydGRydl9zdXNwZW5kX2xhdGUgTlVMTAorI2RlZmluZSBwY2llX3BvcnRkcnZfcmVzdW1lX2Vhcmx5IE5VTEwKICNkZWZpbmUgcGNpZV9wb3J0ZHJ2X3Jlc3VtZSBOVUxMCiAjZW5kaWYKIApAQCAtMjIxLDYgKzIyOSw3IEBACiAKIAkvKiBJZiBmYXRhbCwgcmVzdG9yZSBjZmcgc3BhY2UgZm9yIHBvc3NpYmxlIGxpbmsgcmVzZXQgYXQgdXBzdHJlYW0gKi8KIAlpZiAoZGV2LT5lcnJvcl9zdGF0ZSA9PSBwY2lfY2hhbm5lbF9pb19mcm96ZW4pIHsKKwkJcGNpX3Jlc3RvcmVfc3RhdGUoZGV2KTsKIAkJcGNpZV9wb3J0ZHJ2X3Jlc3RvcmVfY29uZmlnKGRldik7CiAJCXBjaV9lbmFibGVfcGNpZV9lcnJvcl9yZXBvcnRpbmcoZGV2KTsKIAl9CkBAIC0yODMsNiArMjkyLDggQEAKIAkucmVtb3ZlCQk9IHBjaWVfcG9ydGRydl9yZW1vdmUsCiAKIAkuc3VzcGVuZAk9IHBjaWVfcG9ydGRydl9zdXNwZW5kLAorCS5zdXNwZW5kX2xhdGUJPSBwY2llX3BvcnRkcnZfc3VzcGVuZF9sYXRlLAorCS5yZXN1bWVfZWFybHkJPSBwY2llX3BvcnRkcnZfcmVzdW1lX2Vhcmx5LAogCS5yZXN1bWUJCT0gcGNpZV9wb3J0ZHJ2X3Jlc3VtZSwKIAogCS5lcnJfaGFuZGxlciAJPSAmcGNpZV9wb3J0ZHJ2X2Vycl9oYW5kbGVyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcHJvYmUuYyBiL2RyaXZlcnMvcGNpL3Byb2JlLmMKaW5kZXggNWIzZjU5My4uMzAzNjQ0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcHJvYmUuYworKysgYi9kcml2ZXJzL3BjaS9wcm9iZS5jCkBAIC0xMzUsMTMgKzEzNSw2IEBACiAJcmV0dXJuIHNpemU7CiB9CiAKLWVudW0gcGNpX2Jhcl90eXBlIHsKLQlwY2lfYmFyX3Vua25vd24sCS8qIFN0YW5kYXJkIFBDSSBCQVIgcHJvYmUgKi8KLQlwY2lfYmFyX2lvLAkJLyogQW4gaW8gcG9ydCBCQVIgKi8KLQlwY2lfYmFyX21lbTMyLAkJLyogQSAzMi1iaXQgbWVtb3J5IEJBUiAqLwotCXBjaV9iYXJfbWVtNjQsCQkvKiBBIDY0LWJpdCBtZW1vcnkgQkFSICovCi19OwotCiBzdGF0aWMgaW5saW5lIGVudW0gcGNpX2Jhcl90eXBlIGRlY29kZV9iYXIoc3RydWN0IHJlc291cmNlICpyZXMsIHUzMiBiYXIpCiB7CiAJaWYgKChiYXIgJiBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFKSA9PSBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX0lPKSB7CkBAIC0xNTYsMTEgKzE0OSwxNiBAQAogCXJldHVybiBwY2lfYmFyX21lbTMyOwogfQogCi0vKgotICogSWYgdGhlIHR5cGUgaXMgbm90IHVua25vd24sIHdlIGFzc3VtZSB0aGF0IHRoZSBsb3dlc3QgYml0IGlzICdlbmFibGUnLgotICogUmV0dXJucyAxIGlmIHRoZSBCQVIgd2FzIDY0LWJpdCBhbmQgMCBpZiBpdCB3YXMgMzItYml0LgorLyoqCisgKiBwY2lfcmVhZF9iYXNlIC0gcmVhZCBhIFBDSSBCQVIKKyAqIEBkZXY6IHRoZSBQQ0kgZGV2aWNlCisgKiBAdHlwZTogdHlwZSBvZiB0aGUgQkFSCisgKiBAcmVzOiByZXNvdXJjZSBidWZmZXIgdG8gYmUgZmlsbGVkIGluCisgKiBAcG9zOiBCQVIgcG9zaXRpb24gaW4gdGhlIGNvbmZpZyBzcGFjZQorICoKKyAqIFJldHVybnMgMSBpZiB0aGUgQkFSIGlzIDY0LWJpdCwgb3IgMCBpZiAzMi1iaXQuCiAgKi8KLXN0YXRpYyBpbnQgX19wY2lfcmVhZF9iYXNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGVudW0gcGNpX2Jhcl90eXBlIHR5cGUsCitpbnQgX19wY2lfcmVhZF9iYXNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGVudW0gcGNpX2Jhcl90eXBlIHR5cGUsCiAJCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgdW5zaWduZWQgaW50IHBvcykKIHsKIAl1MzIgbCwgc3osIG1hc2s7CkBAIC00MDAsMTkgKzM5OCwxNyBAQAogCWlmICghY2hpbGQpCiAJCXJldHVybiBOVUxMOwogCi0JY2hpbGQtPnNlbGYgPSBicmlkZ2U7CiAJY2hpbGQtPnBhcmVudCA9IHBhcmVudDsKIAljaGlsZC0+b3BzID0gcGFyZW50LT5vcHM7CiAJY2hpbGQtPnN5c2RhdGEgPSBwYXJlbnQtPnN5c2RhdGE7CiAJY2hpbGQtPmJ1c19mbGFncyA9IHBhcmVudC0+YnVzX2ZsYWdzOwotCWNoaWxkLT5icmlkZ2UgPSBnZXRfZGV2aWNlKCZicmlkZ2UtPmRldik7CiAKIAkvKiBpbml0aWFsaXplIHNvbWUgcG9ydGlvbnMgb2YgdGhlIGJ1cyBkZXZpY2UsIGJ1dCBkb24ndCByZWdpc3RlciBpdAogCSAqIG5vdyBhcyB0aGUgcGFyZW50IGlzIG5vdCBwcm9wZXJseSBzZXQgdXAgeWV0LiAgVGhpcyBkZXZpY2Ugd2lsbCBnZXQKIAkgKiByZWdpc3RlcmVkIGxhdGVyIGluIHBjaV9idXNfYWRkX2RldmljZXMoKQogCSAqLwogCWNoaWxkLT5kZXYuY2xhc3MgPSAmcGNpYnVzX2NsYXNzOwotCXNwcmludGYoY2hpbGQtPmRldi5idXNfaWQsICIlMDR4OiUwMngiLCBwY2lfZG9tYWluX25yKGNoaWxkKSwgYnVzbnIpOworCWRldl9zZXRfbmFtZSgmY2hpbGQtPmRldiwgIiUwNHg6JTAyeCIsIHBjaV9kb21haW5fbnIoY2hpbGQpLCBidXNucik7CiAKIAkvKgogCSAqIFNldCB1cCB0aGUgcHJpbWFyeSwgc2Vjb25kYXJ5IGFuZCBzdWJvcmRpbmF0ZQpAQCAtNDIyLDggKzQxOCwxNCBAQAogCWNoaWxkLT5wcmltYXJ5ID0gcGFyZW50LT5zZWNvbmRhcnk7CiAJY2hpbGQtPnN1Ym9yZGluYXRlID0gMHhmZjsKIAorCWlmICghYnJpZGdlKQorCQlyZXR1cm4gY2hpbGQ7CisKKwljaGlsZC0+c2VsZiA9IGJyaWRnZTsKKwljaGlsZC0+YnJpZGdlID0gZ2V0X2RldmljZSgmYnJpZGdlLT5kZXYpOworCiAJLyogU2V0IHVwIGRlZmF1bHQgcmVzb3VyY2UgcG9pbnRlcnMgYW5kIG5hbWVzLi4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IFBDSV9CUklER0VfUkVTT1VSQ0VfTlVNOyBpKyspIHsKIAkJY2hpbGQtPnJlc291cmNlW2ldID0gJmJyaWRnZS0+cmVzb3VyY2VbUENJX0JSSURHRV9SRVNPVVJDRVMraV07CiAJCWNoaWxkLT5yZXNvdXJjZVtpXS0+bmFtZSA9IGNoaWxkLT5uYW1lOwogCX0KQEAgLTk1OCw4ICs5NjAsMTIgQEAKIAkvKiBNU0kvTVNJLVggbGlzdCAqLwogCXBjaV9tc2lfaW5pdF9wY2lfZGV2KGRldik7CiAKKwkvKiBCdWZmZXJzIGZvciBzYXZpbmcgUENJZSBhbmQgUENJLVggY2FwYWJpbGl0aWVzICovCisJcGNpX2FsbG9jYXRlX2NhcF9zYXZlX2J1ZmZlcnMoZGV2KTsKKwogCS8qIFBvd2VyIE1hbmFnZW1lbnQgKi8KIAlwY2lfcG1faW5pdChkZXYpOworCXBsYXRmb3JtX3BjaV93YWtldXBfaW5pdChkZXYpOwogCiAJLyogVml0YWwgUHJvZHVjdCBEYXRhICovCiAJcGNpX3ZwZF9wY2kyMl9pbml0KGRldik7CkBAIC0xMTMwLDcgKzExMzYsNyBAQAogCW1lbXNldChkZXYsIDAsIHNpemVvZigqZGV2KSk7CiAJZGV2LT5wYXJlbnQgPSBwYXJlbnQ7CiAJZGV2LT5yZWxlYXNlID0gcGNpX3JlbGVhc2VfYnVzX2JyaWRnZV9kZXY7Ci0Jc3ByaW50ZihkZXYtPmJ1c19pZCwgInBjaSUwNHg6JTAyeCIsIHBjaV9kb21haW5fbnIoYiksIGJ1cyk7CisJZGV2X3NldF9uYW1lKGRldiwgInBjaSUwNHg6JTAyeCIsIHBjaV9kb21haW5fbnIoYiksIGJ1cyk7CiAJZXJyb3IgPSBkZXZpY2VfcmVnaXN0ZXIoZGV2KTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZGV2X3JlZ19lcnI7CkBAIC0xMTQxLDcgKzExNDcsNyBAQAogCiAJYi0+ZGV2LmNsYXNzID0gJnBjaWJ1c19jbGFzczsKIAliLT5kZXYucGFyZW50ID0gYi0+YnJpZGdlOwotCXNwcmludGYoYi0+ZGV2LmJ1c19pZCwgIiUwNHg6JTAyeCIsIHBjaV9kb21haW5fbnIoYiksIGJ1cyk7CisJZGV2X3NldF9uYW1lKCZiLT5kZXYsICIlMDR4OiUwMngiLCBwY2lfZG9tYWluX25yKGIpLCBidXMpOwogCWVycm9yID0gZGV2aWNlX3JlZ2lzdGVyKCZiLT5kZXYpOwogCWlmIChlcnJvcikKIAkJZ290byBjbGFzc19kZXZfcmVnX2VycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3Byb2MuYyBiL2RyaXZlcnMvcGNpL3Byb2MuYwppbmRleCBlMTA5OGMzLi41OTNiYjg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wcm9jLmMKKysrIGIvZHJpdmVycy9wY2kvcHJvYy5jCkBAIC0yNTIsMTEgKzI1MiwyMCBAQAogCWNvbnN0IHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHAgPSBQREUoaW5vZGUpOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBkcC0+ZGF0YTsKIAlzdHJ1Y3QgcGNpX2ZpbHBfcHJpdmF0ZSAqZnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJldDsKKwlpbnQgaSwgcmV0OwogCiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKQogCQlyZXR1cm4gLUVQRVJNOwogCisJLyogTWFrZSBzdXJlIHRoZSBjYWxsZXIgaXMgbWFwcGluZyBhIHJlYWwgcmVzb3VyY2UgZm9yIHRoaXMgZGV2aWNlICovCisJZm9yIChpID0gMDsgaSA8IFBDSV9ST01fUkVTT1VSQ0U7IGkrKykgeworCQlpZiAocGNpX21tYXBfZml0cyhkZXYsIGksIHZtYSkpCisJCQlicmVhazsKKwl9CisKKwlpZiAoaSA+PSBQQ0lfUk9NX1JFU09VUkNFKQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCXJldCA9IHBjaV9tbWFwX3BhZ2VfcmFuZ2UoZGV2LCB2bWEsCiAJCQkJICBmcHJpdi0+bW1hcF9zdGF0ZSwKIAkJCQkgIGZwcml2LT53cml0ZV9jb21iaW5lKTsKQEAgLTM1MiwxNSArMzYxLDE2IEBACiAJCQlkZXYtPnZlbmRvciwKIAkJCWRldi0+ZGV2aWNlLAogCQkJZGV2LT5pcnEpOwotCS8qIEhlcmUgc2hvdWxkIGJlIDcgYW5kIG5vdCBQQ0lfTlVNX1JFU09VUkNFUyBhcyB3ZSBuZWVkIHRvIHByZXNlcnZlIGNvbXBhdGliaWxpdHkgKi8KLQlmb3IgKGk9MDsgaTw3OyBpKyspIHsKKworCS8qIG9ubHkgcHJpbnQgc3RhbmRhcmQgYW5kIFJPTSByZXNvdXJjZXMgdG8gcHJlc2VydmUgY29tcGF0aWJpbGl0eSAqLworCWZvciAoaSA9IDA7IGkgPD0gUENJX1JPTV9SRVNPVVJDRTsgaSsrKSB7CiAJCXJlc291cmNlX3NpemVfdCBzdGFydCwgZW5kOwogCQlwY2lfcmVzb3VyY2VfdG9fdXNlcihkZXYsIGksICZkZXYtPnJlc291cmNlW2ldLCAmc3RhcnQsICZlbmQpOwogCQlzZXFfcHJpbnRmKG0sICJcdCUxNmxseCIsCiAJCQkodW5zaWduZWQgbG9uZyBsb25nKShzdGFydCB8CiAJCQkoZGV2LT5yZXNvdXJjZVtpXS5mbGFncyAmIFBDSV9SRUdJT05fRkxBR19NQVNLKSkpOwogCX0KLQlmb3IgKGk9MDsgaTw3OyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDw9IFBDSV9ST01fUkVTT1VSQ0U7IGkrKykgewogCQlyZXNvdXJjZV9zaXplX3Qgc3RhcnQsIGVuZDsKIAkJcGNpX3Jlc291cmNlX3RvX3VzZXIoZGV2LCBpLCAmZGV2LT5yZXNvdXJjZVtpXSwgJnN0YXJ0LCAmZW5kKTsKIAkJc2VxX3ByaW50ZihtLCAiXHQlMTZsbHgiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcXVpcmtzLmMgYi9kcml2ZXJzL3BjaS9xdWlya3MuYwppbmRleCBjZTA5ODU2Li5iYWFkMDkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9xdWlya3MuYworKysgYi9kcml2ZXJzL3BjaS9xdWlya3MuYwpAQCAtNTYsNyArNTYsNyBAQAogCXdoaWxlICgoZCA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFTQl8wLCBkKSkpIHsKIAkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZCwgMHg4MiwgJmRsYyk7CiAJCWlmICghKGRsYyAmIDE8PDEpKSB7Ci0JCQlkZXZfZXJyKCZkLT5kZXYsICJQSUlYMzogRW5hYmxpbmcgUGFzc2l2ZSBSZWxlYXNlXG4iKTsKKwkJCWRldl9pbmZvKCZkLT5kZXYsICJQSUlYMzogRW5hYmxpbmcgUGFzc2l2ZSBSZWxlYXNlXG4iKTsKIAkJCWRsYyB8PSAxPDwxOwogCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGQsIDB4ODIsIGRsYyk7CiAJCX0KQEAgLTQ0OSw3ICs0NDksNyBAQAogREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFFQl8wLAkJcXVpcmtfaWNoNF9scGNfYWNwaSk7CiBERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwgICAgUENJX0RFVklDRV9JRF9JTlRFTF9FU0JfMSwJCXF1aXJrX2ljaDRfbHBjX2FjcGkpOwogCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgcXVpcmtfaWNoNl9scGNfYWNwaShzdHJ1Y3QgcGNpX2RldiAqZGV2KQorc3RhdGljIHZvaWQgX19kZXZpbml0IGljaDZfbHBjX2FjcGlfZ3BpbyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXUzMiByZWdpb247CiAKQEAgLTQ1OSwyMCArNDU5LDk1IEBACiAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMHg0OCwgJnJlZ2lvbik7CiAJcXVpcmtfaW9fcmVnaW9uKGRldiwgcmVnaW9uLCA2NCwgUENJX0JSSURHRV9SRVNPVVJDRVMrMSwgIklDSDYgR1BJTyIpOwogfQotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfSUNINl8wLCBxdWlya19pY2g2X2xwY19hY3BpKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDZfMSwgcXVpcmtfaWNoNl9scGNfYWNwaSk7Ci1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g3XzAsIHF1aXJrX2ljaDZfbHBjX2FjcGkpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfSUNIN18xLCBxdWlya19pY2g2X2xwY19hY3BpKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDdfMzEsIHF1aXJrX2ljaDZfbHBjX2FjcGkpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOF8wLCBxdWlya19pY2g2X2xwY19hY3BpKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDhfMiwgcXVpcmtfaWNoNl9scGNfYWNwaSk7Ci1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g4XzMsIHF1aXJrX2ljaDZfbHBjX2FjcGkpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOF8xLCBxdWlya19pY2g2X2xwY19hY3BpKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDhfNCwgcXVpcmtfaWNoNl9scGNfYWNwaSk7Ci1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g5XzIsIHF1aXJrX2ljaDZfbHBjX2FjcGkpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOV80LCBxdWlya19pY2g2X2xwY19hY3BpKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDlfNywgcXVpcmtfaWNoNl9scGNfYWNwaSk7Ci1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g5XzgsIHF1aXJrX2ljaDZfbHBjX2FjcGkpOworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgaWNoNl9scGNfZ2VuZXJpY19kZWNvZGUoc3RydWN0IHBjaV9kZXYgKmRldiwgdW5zaWduZWQgcmVnLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgZHluc2l6ZSkKK3sKKwl1MzIgdmFsOworCXUzMiBzaXplLCBiYXNlOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgcmVnLCAmdmFsKTsKKworCS8qIEVuYWJsZWQ/ICovCisJaWYgKCEodmFsICYgMSkpCisJCXJldHVybjsKKwliYXNlID0gdmFsICYgMHhmZmZjOworCWlmIChkeW5zaXplKSB7CisJCS8qCisJCSAqIFRoaXMgaXMgbm90IGNvcnJlY3QuIEl0IGlzIDE2LCAzMiBvciA2NCBieXRlcyBkZXBlbmRpbmcgb24KKwkJICogcmVnaXN0ZXIgRDMxOkYwOkFEaCBiaXRzIDU6NC4KKwkJICoKKwkJICogQnV0IHRoaXMgZ2V0cyB1cyBhdCBsZWFzdCBfcGFydF8gb2YgaXQuCisJCSAqLworCQlzaXplID0gMTY7CisJfSBlbHNlIHsKKwkJc2l6ZSA9IDEyODsKKwl9CisJYmFzZSAmPSB+KHNpemUtMSk7CisKKwkvKiBKdXN0IHByaW50IGl0IG91dCBmb3Igbm93LiBXZSBzaG91bGQgcmVzZXJ2ZSBpdCBhZnRlciBtb3JlIGRlYnVnZ2luZyAqLworCWRldl9pbmZvKCZkZXYtPmRldiwgIiVzIFBJTyBhdCAlMDR4LSUwNHhcbiIsIG5hbWUsIGJhc2UsIGJhc2Urc2l6ZS0xKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IHF1aXJrX2ljaDZfbHBjKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJLyogU2hhcmVkIEFDUEkvR1BJTyBkZWNvZGUgd2l0aCBhbGwgSUNINisgKi8KKwlpY2g2X2xwY19hY3BpX2dwaW8oZGV2KTsKKworCS8qIElDSDYtc3BlY2lmaWMgZ2VuZXJpYyBJTyBkZWNvZGUgKi8KKwlpY2g2X2xwY19nZW5lcmljX2RlY29kZShkZXYsIDB4ODQsICJMUEMgR2VuZXJpYyBJTyBkZWNvZGUgMSIsIDApOworCWljaDZfbHBjX2dlbmVyaWNfZGVjb2RlKGRldiwgMHg4OCwgIkxQQyBHZW5lcmljIElPIGRlY29kZSAyIiwgMSk7Cit9CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g2XzAsIHF1aXJrX2ljaDZfbHBjKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDZfMSwgcXVpcmtfaWNoNl9scGMpOworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgaWNoN19scGNfZ2VuZXJpY19kZWNvZGUoc3RydWN0IHBjaV9kZXYgKmRldiwgdW5zaWduZWQgcmVnLCBjb25zdCBjaGFyICpuYW1lKQoreworCXUzMiB2YWw7CisJdTMyIG1hc2ssIGJhc2U7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCByZWcsICZ2YWwpOworCisJLyogRW5hYmxlZD8gKi8KKwlpZiAoISh2YWwgJiAxKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBJTyBiYXNlIGluIGJpdHMgMTU6MiwgbWFzayBpbiBiaXRzIDIzOjE4LCBib3RoCisJICogYXJlIGR3b3JkLWJhc2VkCisJICovCisJYmFzZSA9IHZhbCAmIDB4ZmZmYzsKKwltYXNrID0gKHZhbCA+PiAxNikgJiAweGZjOworCW1hc2sgfD0gMzsKKworCS8qIEp1c3QgcHJpbnQgaXQgb3V0IGZvciBub3cuIFdlIHNob3VsZCByZXNlcnZlIGl0IGFmdGVyIG1vcmUgZGVidWdnaW5nICovCisJZGV2X2luZm8oJmRldi0+ZGV2LCAiJXMgUElPIGF0ICUwNHggKG1hc2sgJTA0eClcbiIsIG5hbWUsIGJhc2UsIG1hc2spOworfQorCisvKiBJQ0g3LTEwIGhhcyB0aGUgc2FtZSBjb21tb24gTFBDIGdlbmVyaWMgSU8gZGVjb2RlIHJlZ2lzdGVycyAqLworc3RhdGljIHZvaWQgX19kZXZpbml0IHF1aXJrX2ljaDdfbHBjKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJLyogV2Ugc2hhcmUgdGhlIGNvbW1vbiBBQ1BJL0RQSU8gZGVjb2RlIHdpdGggSUNINiAqLworCWljaDZfbHBjX2FjcGlfZ3BpbyhkZXYpOworCisJLyogQW5kIGhhdmUgNCBJQ0g3KyBnZW5lcmljIGRlY29kZXMgKi8KKwlpY2g3X2xwY19nZW5lcmljX2RlY29kZShkZXYsIDB4ODQsICJJQ0g3IExQQyBHZW5lcmljIElPIGRlY29kZSAxIik7CisJaWNoN19scGNfZ2VuZXJpY19kZWNvZGUoZGV2LCAweDg4LCAiSUNINyBMUEMgR2VuZXJpYyBJTyBkZWNvZGUgMiIpOworCWljaDdfbHBjX2dlbmVyaWNfZGVjb2RlKGRldiwgMHg4YywgIklDSDcgTFBDIEdlbmVyaWMgSU8gZGVjb2RlIDMiKTsKKwlpY2g3X2xwY19nZW5lcmljX2RlY29kZShkZXYsIDB4OTAsICJJQ0g3IExQQyBHZW5lcmljIElPIGRlY29kZSA0Iik7Cit9CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g3XzAsIHF1aXJrX2ljaDdfbHBjKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDdfMSwgcXVpcmtfaWNoN19scGMpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfSUNIN18zMSwgcXVpcmtfaWNoN19scGMpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOF8wLCBxdWlya19pY2g3X2xwYyk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g4XzIsIHF1aXJrX2ljaDdfbHBjKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDhfMywgcXVpcmtfaWNoN19scGMpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOF8xLCBxdWlya19pY2g3X2xwYyk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g4XzQsIHF1aXJrX2ljaDdfbHBjKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDlfMiwgcXVpcmtfaWNoN19scGMpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOV80LCBxdWlya19pY2g3X2xwYyk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g5XzcsIHF1aXJrX2ljaDdfbHBjKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDlfOCwgcXVpcmtfaWNoN19scGMpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsICAgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0gxMF8xLCBxdWlya19pY2g3X2xwYyk7CiAKIC8qCiAgKiBWSUEgQUNQSTogT25lIElPIHJlZ2lvbiBwb2ludGVkIHRvIGJ5IGxvbmd3b3JkIGF0CkBAIC0yMDc0LDExICsyMTQ5LDEyIEBACiAKICNlbmRpZiAvKiBDT05GSUdfUENJX01TSSAqLwogCi1zdGF0aWMgdm9pZCBwY2lfZG9fZml4dXBzKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCBwY2lfZml4dXAgKmYsIHN0cnVjdCBwY2lfZml4dXAgKmVuZCkKK3N0YXRpYyB2b2lkIHBjaV9kb19maXh1cHMoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHBjaV9maXh1cCAqZiwKKwkJCSAgc3RydWN0IHBjaV9maXh1cCAqZW5kKQogewogCXdoaWxlIChmIDwgZW5kKSB7CiAJCWlmICgoZi0+dmVuZG9yID09IGRldi0+dmVuZG9yIHx8IGYtPnZlbmRvciA9PSAodTE2KSBQQ0lfQU5ZX0lEKSAmJgotIAkJICAgIChmLT5kZXZpY2UgPT0gZGV2LT5kZXZpY2UgfHwgZi0+ZGV2aWNlID09ICh1MTYpIFBDSV9BTllfSUQpKSB7CisJCSAgICAoZi0+ZGV2aWNlID09IGRldi0+ZGV2aWNlIHx8IGYtPmRldmljZSA9PSAodTE2KSBQQ0lfQU5ZX0lEKSkgewogCQkJZGV2X2RiZygmZGV2LT5kZXYsICJjYWxsaW5nICVwRlxuIiwgZi0+aG9vayk7CiAJCQlmLT5ob29rKGRldik7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3NldHVwLWJ1cy5jIGIvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMKaW5kZXggZWE5NzlmMi4uNzA0NjA4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMKKysrIGIvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMKQEAgLTUzNiw5ICs1MzYsOCBAQAogICAgICAgICAgICAgICAgIGlmICghcmVzKQogICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYnVzOiAlMDJ4IGluZGV4ICV4ICVzOiAlcFJcbiIsCi0JCSAgICAgICBidXMtPm51bWJlciwgaSwKLQkJICAgICAgIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykgPyAiaW8gcG9ydCIgOiAibW1pbyIsIHJlcyk7CisJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmJ1cy0+ZGV2LCAicmVzb3VyY2UgJWQgJXMgJXBSXG4iLCBpLAorCQkJICAgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSA/ICJpbzogIiA6ICJtZW06IiwgcmVzKTsKICAgICAgICAgfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9zZXR1cC1yZXMuYyBiL2RyaXZlcnMvcGNpL3NldHVwLXJlcy5jCmluZGV4IDJkYmQ5NmMuLjMyZThkODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3NldHVwLXJlcy5jCisrKyBiL2RyaXZlcnMvcGNpL3NldHVwLXJlcy5jCkBAIC0yNiwxMSArMjYsMTMgQEAKICNpbmNsdWRlICJwY2kuaCIKIAogCi12b2lkIHBjaV91cGRhdGVfcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHJlc291cmNlICpyZXMsIGludCByZXNubykKK3ZvaWQgcGNpX3VwZGF0ZV9yZXNvdXJjZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcmVzbm8pCiB7CiAJc3RydWN0IHBjaV9idXNfcmVnaW9uIHJlZ2lvbjsKIAl1MzIgbmV3LCBjaGVjaywgbWFzazsKIAlpbnQgcmVnOworCWVudW0gcGNpX2Jhcl90eXBlIHR5cGU7CisJc3RydWN0IHJlc291cmNlICpyZXMgPSBkZXYtPnJlc291cmNlICsgcmVzbm87CiAKIAkvKgogCSAqIElnbm9yZSByZXNvdXJjZXMgZm9yIHVuaW1wbGVtZW50ZWQgQkFScyBhbmQgdW51c2VkIHJlc291cmNlIHNsb3RzCkBAIC02MSwxNyArNjMsMTMgQEAKIAllbHNlCiAJCW1hc2sgPSAodTMyKVBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0s7CiAKLQlpZiAocmVzbm8gPCA2KSB7Ci0JCXJlZyA9IFBDSV9CQVNFX0FERFJFU1NfMCArIDQgKiByZXNubzsKLQl9IGVsc2UgaWYgKHJlc25vID09IFBDSV9ST01fUkVTT1VSQ0UpIHsKKwlyZWcgPSBwY2lfcmVzb3VyY2VfYmFyKGRldiwgcmVzbm8sICZ0eXBlKTsKKwlpZiAoIXJlZykKKwkJcmV0dXJuOworCWlmICh0eXBlICE9IHBjaV9iYXJfdW5rbm93bikgewogCQlpZiAoIShyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9ST01fRU5BQkxFKSkKIAkJCXJldHVybjsKIAkJbmV3IHw9IFBDSV9ST01fQUREUkVTU19FTkFCTEU7Ci0JCXJlZyA9IGRldi0+cm9tX2Jhc2VfcmVnOwotCX0gZWxzZSB7Ci0JCS8qIEhtbSwgbm9uLXN0YW5kYXJkIHJlc291cmNlLiAqLwotCQotCQlyZXR1cm47CQkvKiBraWxsIHVuaW5pdGlhbGlzZWQgdmFyIHdhcm5pbmcgKi8KIAl9CiAKIAlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgcmVnLCBuZXcpOwpAQCAtMTM0LDcgKzEzMiw3IEBACiAKIAlhbGlnbiA9IHJlc291cmNlX2FsaWdubWVudChyZXMpOwogCWlmICghYWxpZ24pIHsKLQkJZGV2X2VycigmZGV2LT5kZXYsICJCQVIgJWQ6IGNhbid0IGFsbG9jYXRlIHJlc291cmNlIChib2d1cyAiCisJCWRldl9pbmZvKCZkZXYtPmRldiwgIkJBUiAlZDogY2FuJ3QgYWxsb2NhdGUgcmVzb3VyY2UgKGJvZ3VzICIKIAkJCSJhbGlnbm1lbnQpICVwUiBmbGFncyAlI2x4XG4iLAogCQkJcmVzbm8sIHJlcywgcmVzLT5mbGFncyk7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTU3LDEyICsxNTUsMTIgQEAKIAl9CiAKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmRldi0+ZGV2LCAiQkFSICVkOiBjYW4ndCBhbGxvY2F0ZSAlcyByZXNvdXJjZSAlcFJcbiIsCisJCWRldl9pbmZvKCZkZXYtPmRldiwgIkJBUiAlZDogY2FuJ3QgYWxsb2NhdGUgJXMgcmVzb3VyY2UgJXBSXG4iLAogCQkJcmVzbm8sIHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPID8gIkkvTyIgOiAibWVtIiwgcmVzKTsKIAl9IGVsc2UgewogCQlyZXMtPmZsYWdzICY9IH5JT1JFU09VUkNFX1NUQVJUQUxJR047CiAJCWlmIChyZXNubyA8IFBDSV9CUklER0VfUkVTT1VSQ0VTKQotCQkJcGNpX3VwZGF0ZV9yZXNvdXJjZShkZXYsIHJlcywgcmVzbm8pOworCQkJcGNpX3VwZGF0ZV9yZXNvdXJjZShkZXYsIHJlc25vKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwpAQCAtMTk3LDcgKzE5NSw3IEBACiAJCWRldl9lcnIoJmRldi0+ZGV2LCAiQkFSICVkOiBjYW4ndCBhbGxvY2F0ZSAlcyByZXNvdXJjZSAlcFJcbiIsCiAJCQlyZXNubywgcmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8gPyAiSS9PIiA6ICJtZW0iLCByZXMpOwogCX0gZWxzZSBpZiAocmVzbm8gPCBQQ0lfQlJJREdFX1JFU09VUkNFUykgewotCQlwY2lfdXBkYXRlX3Jlc291cmNlKGRldiwgcmVzLCByZXNubyk7CisJCXBjaV91cGRhdGVfcmVzb3VyY2UoZGV2LCByZXNubyk7CiAJfQogCiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL2NhcmQuYyBiL2RyaXZlcnMvcG5wL2NhcmQuYwppbmRleCBlNzViMDYwLi5lZmVhMTI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9jYXJkLmMKKysrIGIvZHJpdmVycy9wbnAvY2FyZC5jCkBAIC0xNjUsOCArMTY1LDcgQEAKIAljYXJkLT5udW1iZXIgPSBpZDsKIAogCWNhcmQtPmRldi5wYXJlbnQgPSAmY2FyZC0+cHJvdG9jb2wtPmRldjsKLQlzcHJpbnRmKGNhcmQtPmRldi5idXNfaWQsICIlMDJ4OiUwMngiLCBjYXJkLT5wcm90b2NvbC0+bnVtYmVyLAotCQljYXJkLT5udW1iZXIpOworCWRldl9zZXRfbmFtZSgmY2FyZC0+ZGV2LCAiJTAyeDolMDJ4IiwgY2FyZC0+cHJvdG9jb2wtPm51bWJlciwgY2FyZC0+bnVtYmVyKTsKIAogCWNhcmQtPmRldi5jb2hlcmVudF9kbWFfbWFzayA9IERNQV8yNEJJVF9NQVNLOwogCWNhcmQtPmRldi5kbWFfbWFzayA9ICZjYXJkLT5kZXYuY29oZXJlbnRfZG1hX21hc2s7CkBAIC0yOTUsOCArMjk0LDggQEAKIHsKIAlkZXYtPmRldi5wYXJlbnQgPSAmY2FyZC0+ZGV2OwogCWRldi0+Y2FyZF9saW5rID0gTlVMTDsKLQlzbnByaW50ZihkZXYtPmRldi5idXNfaWQsIEJVU19JRF9TSVpFLCAiJTAyeDolMDJ4LiUwMngiLAotCQkgZGV2LT5wcm90b2NvbC0+bnVtYmVyLCBjYXJkLT5udW1iZXIsIGRldi0+bnVtYmVyKTsKKwlkZXZfc2V0X25hbWUoJmRldi0+ZGV2LCAiJTAyeDolMDJ4LiUwMngiLAorCQkgICAgIGRldi0+cHJvdG9jb2wtPm51bWJlciwgY2FyZC0+bnVtYmVyLCBkZXYtPm51bWJlcik7CiAJc3Bpbl9sb2NrKCZwbnBfbG9jayk7CiAJZGV2LT5jYXJkID0gY2FyZDsKIAlsaXN0X2FkZF90YWlsKCZkZXYtPmNhcmRfbGlzdCwgJmNhcmQtPmRldmljZXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvY29yZS5jIGIvZHJpdmVycy9wbnAvY29yZS5jCmluZGV4IDE2YzAxYzYuLjE0ODE0ZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL2NvcmUuYworKysgYi9kcml2ZXJzL3BucC9jb3JlLmMKQEAgLTcwLDcgKzcwLDcgQEAKIAlzcGluX3VubG9jaygmcG5wX2xvY2spOwogCiAJcHJvdG9jb2wtPm51bWJlciA9IG5vZGVudW07Ci0Jc3ByaW50Zihwcm90b2NvbC0+ZGV2LmJ1c19pZCwgInBucCVkIiwgbm9kZW51bSk7CisJZGV2X3NldF9uYW1lKCZwcm90b2NvbC0+ZGV2LCAicG5wJWQiLCBub2RlbnVtKTsKIAlyZXR1cm4gZGV2aWNlX3JlZ2lzdGVyKCZwcm90b2NvbC0+ZGV2KTsKIH0KIApAQCAtMTQ1LDggKzE0NSw3IEBACiAJZGV2LT5kZXYuY29oZXJlbnRfZG1hX21hc2sgPSBkZXYtPmRtYV9tYXNrOwogCWRldi0+ZGV2LnJlbGVhc2UgPSAmcG5wX3JlbGVhc2VfZGV2aWNlOwogCi0Jc3ByaW50ZihkZXYtPmRldi5idXNfaWQsICIlMDJ4OiUwMngiLCBkZXYtPnByb3RvY29sLT5udW1iZXIsCi0JCWRldi0+bnVtYmVyKTsKKwlkZXZfc2V0X25hbWUoJmRldi0+ZGV2LCAiJTAyeDolMDJ4IiwgZGV2LT5wcm90b2NvbC0+bnVtYmVyLCBkZXYtPm51bWJlcik7CiAKIAlkZXZfaWQgPSBwbnBfYWRkX2lkKGRldiwgcG5waWQpOwogCWlmICghZGV2X2lkKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9zeXN0ZW0uYyBiL2RyaXZlcnMvcG5wL3N5c3RlbS5jCmluZGV4IDc2NGYzYTMuLjU5YjkwOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL3N5c3RlbS5jCisrKyBiL2RyaXZlcnMvcG5wL3N5c3RlbS5jCkBAIC0yNiw3ICsyNiw3IEBACiAJCQkgIHJlc291cmNlX3NpemVfdCBlbmQsIGludCBwb3J0KQogewogCWNoYXIgKnJlZ2lvbmlkOwotCWNvbnN0IGNoYXIgKnBucGlkID0gZGV2LT5kZXYuYnVzX2lkOworCWNvbnN0IGNoYXIgKnBucGlkID0gZGV2X25hbWUoJmRldi0+ZGV2KTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAogCXJlZ2lvbmlkID0ga21hbGxvYygxNiwgR0ZQX0tFUk5FTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL0tjb25maWcgYi9kcml2ZXJzL3Bvd2VyL0tjb25maWcKaW5kZXggOGUwYzJiNC4uNjY4NDcyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9LY29uZmlnCisrKyBiL2RyaXZlcnMvcG93ZXIvS2NvbmZpZwpAQCAtMjksNiArMjksMTMgQEAKIAkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHN1cHBvcnQgQVBNIHN0YXR1cyBlbXVsYXRpb24gdXNpbmcKIAkgIGJhdHRlcnkgY2xhc3MgZGV2aWNlcy4KIAorY29uZmlnIFdNODM1MF9QT1dFUgorICAgICAgICB0cmlzdGF0ZSAiV004MzUwIFBNVSBzdXBwb3J0IgorICAgICAgICBkZXBlbmRzIG9uIE1GRF9XTTgzNTAKKyAgICAgICAgaGVscAorICAgICAgICAgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBwb3dlciBtYW5hZ2VtZW50IHVuaXQKKwkgIHByb3ZpZGVkIGJ5IHRoZSBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgV004MzUwIFBNSUMuCisKIGNvbmZpZyBCQVRURVJZX0RTMjc2MAogCXRyaXN0YXRlICJEUzI3NjAgYmF0dGVyeSBkcml2ZXIgKEhQIGlQQVEgJiBvdGhlcnMpIgogCXNlbGVjdCBXMQpAQCAtNjgsNCArNzUsMTEgQEAKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciBiYXR0ZXJpZXMgd2l0aCBCUTI3MjAwKEkyQykgY2hpcC4KIAorY29uZmlnIEJBVFRFUllfREE5MDMwCisJdHJpc3RhdGUgIkRBOTAzMCBiYXR0ZXJ5IGRyaXZlciIKKwlkZXBlbmRzIG9uIFBNSUNfREE5MDNYCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgc3VwcG9ydCBmb3IgYmF0dGVyaWVzIGNoYXJnZXIgaW50ZWdyYXRlZCBpbnRvCisJICBEQTkwMzAgUE1JQy4KKwogZW5kaWYgIyBQT1dFUl9TVVBQTFkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvTWFrZWZpbGUgYi9kcml2ZXJzL3Bvd2VyL01ha2VmaWxlCmluZGV4IGU4ZjFlY2UuLmVlYmIxNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9wb3dlci9NYWtlZmlsZQpAQCAtMTYsNiArMTYsNyBAQAogCiBvYmotJChDT05GSUdfUERBX1BPV0VSKQkJKz0gcGRhX3Bvd2VyLm8KIG9iai0kKENPTkZJR19BUE1fUE9XRVIpCQkrPSBhcG1fcG93ZXIubworb2JqLSQoQ09ORklHX1dNODM1MF9QT1dFUikJKz0gd204MzUwX3Bvd2VyLm8KIAogb2JqLSQoQ09ORklHX0JBVFRFUllfRFMyNzYwKQkrPSBkczI3NjBfYmF0dGVyeS5vCiBvYmotJChDT05GSUdfQkFUVEVSWV9QTVUpCSs9IHBtdV9iYXR0ZXJ5Lm8KQEAgLTIzLDMgKzI0LDQgQEAKIG9iai0kKENPTkZJR19CQVRURVJZX1RPU0EpCSs9IHRvc2FfYmF0dGVyeS5vCiBvYmotJChDT05GSUdfQkFUVEVSWV9XTTk3WFgpCSs9IHdtOTd4eF9iYXR0ZXJ5Lm8KIG9iai0kKENPTkZJR19CQVRURVJZX0JRMjd4MDApCSs9IGJxMjd4MDBfYmF0dGVyeS5vCitvYmotJChDT05GSUdfQkFUVEVSWV9EQTkwMzApCSs9IGRhOTAzMF9iYXR0ZXJ5Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvZGE5MDMwX2JhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvZGE5MDMwX2JhdHRlcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjYyYmIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wb3dlci9kYTkwMzBfYmF0dGVyeS5jCkBAIC0wLDAgKzEsNjAwIEBACisvKgorICogQmF0dGVyeSBjaGFyZ2VyIGRyaXZlciBmb3IgRGlhbG9nIFNlbWljb25kdWN0b3IgREE5MDMwCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IENvbXB1bGFiLCBMdGQuCisgKiAJTWlrZSBSYXBvcG9ydCA8bWlrZUBjb21wdWxhYi5jby5pbD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvZGE5MDN4Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKworI2RlZmluZSBEQTkwMzBfU1RBVFVTX0NIREVUCSgxIDw8IDMpCisKKyNkZWZpbmUgREE5MDMwX0ZBVUxUX0xPRwkJMHgwYQorI2RlZmluZSBEQTkwMzBfRkFVTFRfTE9HX09WRVJfVEVNUAkoMSA8PCA3KQorI2RlZmluZSBEQTkwMzBfRkFVTFRfTE9HX1ZCQVRfT1ZFUgkoMSA8PCA0KQorCisjZGVmaW5lIERBOTAzMF9DSEFSR0VfQ09OVFJPTAkJMHgyOAorI2RlZmluZSBEQTkwMzBfQ0hSR19DSEFSR0VSX0VOQUJMRQkoMSA8PCA3KQorCisjZGVmaW5lIERBOTAzMF9BRENfTUFOX0NPTlRST0wJCTB4MzAKKyNkZWZpbmUgREE5MDMwX0FEQ19UQkFUUkVGX0VOQUJMRQkoMSA8PCA1KQorI2RlZmluZSBEQTkwMzBfQURDX0xET19JTlRfRU5BQkxFCSgxIDw8IDQpCisKKyNkZWZpbmUgREE5MDMwX0FEQ19BVVRPX0NPTlRST0wJCTB4MzEKKyNkZWZpbmUgREE5MDMwX0FEQ19UQkFUX0VOQUJMRQkJKDEgPDwgNSkKKyNkZWZpbmUgREE5MDMwX0FEQ19WQkFUX0lOX1RYT04JCSgxIDw8IDQpCisjZGVmaW5lIERBOTAzMF9BRENfVkNIX0VOQUJMRQkJKDEgPDwgMykKKyNkZWZpbmUgREE5MDMwX0FEQ19JQ0hfRU5BQkxFCQkoMSA8PCAyKQorI2RlZmluZSBEQTkwMzBfQURDX1ZCQVRfRU5BQkxFCQkoMSA8PCAxKQorI2RlZmluZSBEQTkwMzBfQURDX0FVVE9fU0xFRVBfRU5BQkxFCSgxIDw8IDApCisKKyNkZWZpbmUgREE5MDMwX1ZCQVRNT04JCTB4MzIKKyNkZWZpbmUgREE5MDMwX1ZCQVRNT05UWE9OCTB4MzMKKyNkZWZpbmUgREE5MDMwX1RCQVRISUdIUAkweDM0CisjZGVmaW5lIERBOTAzMF9UQkFUSElHSE4JMHgzNQorI2RlZmluZSBEQTkwMzBfVEJBVExPVwkJMHgzNgorCisjZGVmaW5lIERBOTAzMF9WQkFUX1JFUwkJMHg0MQorI2RlZmluZSBEQTkwMzBfVkJBVE1JTl9SRVMJMHg0MgorI2RlZmluZSBEQTkwMzBfVkJBVE1JTlRYT05fUkVTCTB4NDMKKyNkZWZpbmUgREE5MDMwX0lDSE1BWF9SRVMJMHg0NAorI2RlZmluZSBEQTkwMzBfSUNITUlOX1JFUwkweDQ1CisjZGVmaW5lIERBOTAzMF9JQ0hBVkVSQUdFX1JFUwkweDQ2CisjZGVmaW5lIERBOTAzMF9WQ0hNQVhfUkVTCTB4NDcKKyNkZWZpbmUgREE5MDMwX1ZDSE1JTl9SRVMJMHg0OAorI2RlZmluZSBEQTkwMzBfVEJBVF9SRVMJCTB4NDkKKworc3RydWN0IGRhOTAzMF9hZGNfcmVzIHsKKwl1aW50OF90IHZiYXRfcmVzOworCXVpbnQ4X3QgdmJhdG1pbl9yZXM7CisJdWludDhfdCB2YmF0bWludHhvbjsKKwl1aW50OF90IGljaG1heF9yZXM7CisJdWludDhfdCBpY2htaW5fcmVzOworCXVpbnQ4X3QgaWNoYXZlcmFnZV9yZXM7CisJdWludDhfdCB2Y2htYXhfcmVzOworCXVpbnQ4X3QgdmNobWluX3JlczsKKwl1aW50OF90IHRiYXRfcmVzOworCXVpbnQ4X3QgYWRjX2luNF9yZXM7CisJdWludDhfdCBhZGNfaW41X3JlczsKK307CisKK3N0cnVjdCBkYTkwMzBfYmF0dGVyeV90aHJlc2hvbGRzIHsKKwlpbnQgdGJhdF9sb3c7CisJaW50IHRiYXRfaGlnaDsKKwlpbnQgdGJhdF9yZXN0YXJ0OworCisJaW50IHZiYXRfbG93OworCWludCB2YmF0X2NyaXQ7CisJaW50IHZiYXRfY2hhcmdlX3N0YXJ0OworCWludCB2YmF0X2NoYXJnZV9zdG9wOworCWludCB2YmF0X2NoYXJnZV9yZXN0YXJ0OworCisJaW50IHZjaGFyZ2VfbWluOworCWludCB2Y2hhcmdlX21heDsKK307CisKK3N0cnVjdCBkYTkwMzBfY2hhcmdlciB7CisJc3RydWN0IHBvd2VyX3N1cHBseSBwc3k7CisKKwlzdHJ1Y3QgZGV2aWNlICptYXN0ZXI7CisKKwlzdHJ1Y3QgZGE5MDMwX2FkY19yZXMgYWRjOworCXN0cnVjdCBkZWxheWVkX3dvcmsgd29yazsKKwl1bnNpZ25lZCBpbnQgaW50ZXJ2YWw7CisKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2luZm8gKmJhdHRlcnlfaW5mbzsKKworCXN0cnVjdCBkYTkwMzBfYmF0dGVyeV90aHJlc2hvbGRzIHRocmVzaG9sZHM7CisKKwl1bnNpZ25lZCBpbnQgY2hhcmdlX21pbGxpYW1wOworCXVuc2lnbmVkIGludCBjaGFyZ2VfbWlsbGl2b2x0OworCisJLyogY2hhcmdlciBzdGF0dXMgKi8KKwlib29sIGNoZGV0OworCXVpbnQ4X3QgZmF1bHQ7CisJaW50IG1BOworCWludCBtVjsKKwlib29sIGlzX29uOworCisJc3RydWN0IG5vdGlmaWVyX2Jsb2NrIG5iOworCisJLyogcGxhdGZvcm0gY2FsbGJhY2tzIGZvciBiYXR0ZXJ5IGxvdyBhbmQgY3JpdGljYWwgZXZlbnRzICovCisJdm9pZCAoKmJhdHRlcnlfbG93KSh2b2lkKTsKKwl2b2lkICgqYmF0dGVyeV9jcml0aWNhbCkodm9pZCk7CisKKwlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z19maWxlOworfTsKKworc3RhdGljIGlubGluZSBpbnQgZGE5MDMwX3JlZ190b19tVihpbnQgcmVnKQoreworCXJldHVybiAoKHJlZyAqIDI2NTApID4+IDgpICsgMjY1MDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZGE5MDMwX21pbGxpdm9sdF90b19yZWcoaW50IG1WKQoreworCXJldHVybiAoKG1WIC0gMjY1MCkgPDwgOCkgLyAyNjUwOworfQorCitzdGF0aWMgaW5saW5lIGludCBkYTkwMzBfcmVnX3RvX21BKGludCByZWcpCit7CisJcmV0dXJuICgocmVnICogMjQwMDApID4+IDgpIC8gMTU7Cit9CisKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKK3N0YXRpYyBpbnQgYmF0X2RlYnVnX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBkYTkwMzBfY2hhcmdlciAqY2hhcmdlciA9IHMtPnByaXZhdGU7CisKKwlzZXFfcHJpbnRmKHMsICJjaGFyZ2VyIGlzICVzXG4iLCBjaGFyZ2VyLT5pc19vbiA/ICJvbiIgOiAib2ZmIik7CisJaWYgKGNoYXJnZXItPmNoZGV0KSB7CisJCXNlcV9wcmludGYocywgImlzZXQgPSAlZG1BLCB2c2V0ID0gJWRtVlxuIiwKKwkJCSAgIGNoYXJnZXItPm1BLCBjaGFyZ2VyLT5tVik7CisJfQorCisJc2VxX3ByaW50ZihzLCAidmJhdF9yZXMgPSAlZCAoJWRtVilcbiIsCisJCSAgIGNoYXJnZXItPmFkYy52YmF0X3JlcywKKwkJICAgZGE5MDMwX3JlZ190b19tVihjaGFyZ2VyLT5hZGMudmJhdF9yZXMpKTsKKwlzZXFfcHJpbnRmKHMsICJ2YmF0bWluX3JlcyA9ICVkICglZG1WKVxuIiwKKwkJICAgY2hhcmdlci0+YWRjLnZiYXRtaW5fcmVzLAorCQkgICBkYTkwMzBfcmVnX3RvX21WKGNoYXJnZXItPmFkYy52YmF0bWluX3JlcykpOworCXNlcV9wcmludGYocywgInZiYXRtaW50eG9uID0gJWQgKCVkbVYpXG4iLAorCQkgICBjaGFyZ2VyLT5hZGMudmJhdG1pbnR4b24sCisJCSAgIGRhOTAzMF9yZWdfdG9fbVYoY2hhcmdlci0+YWRjLnZiYXRtaW50eG9uKSk7CisJc2VxX3ByaW50ZihzLCAiaWNobWF4X3JlcyA9ICVkICglZG1BKVxuIiwKKwkJICAgY2hhcmdlci0+YWRjLmljaG1heF9yZXMsCisJCSAgIGRhOTAzMF9yZWdfdG9fbVYoY2hhcmdlci0+YWRjLmljaG1heF9yZXMpKTsKKwlzZXFfcHJpbnRmKHMsICJpY2htaW5fcmVzID0gJWQgKCVkbUEpXG4iLAorCQkgICBjaGFyZ2VyLT5hZGMuaWNobWluX3JlcywKKwkJICAgZGE5MDMwX3JlZ190b19tQShjaGFyZ2VyLT5hZGMuaWNobWluX3JlcykpOworCXNlcV9wcmludGYocywgImljaGF2ZXJhZ2VfcmVzID0gJWQgKCVkbUEpXG4iLAorCQkgICBjaGFyZ2VyLT5hZGMuaWNoYXZlcmFnZV9yZXMsCisJCSAgIGRhOTAzMF9yZWdfdG9fbUEoY2hhcmdlci0+YWRjLmljaGF2ZXJhZ2VfcmVzKSk7CisJc2VxX3ByaW50ZihzLCAidmNobWF4X3JlcyA9ICVkICglZG1WKVxuIiwKKwkJICAgY2hhcmdlci0+YWRjLnZjaG1heF9yZXMsCisJCSAgIGRhOTAzMF9yZWdfdG9fbUEoY2hhcmdlci0+YWRjLnZjaG1heF9yZXMpKTsKKwlzZXFfcHJpbnRmKHMsICJ2Y2htaW5fcmVzID0gJWQgKCVkbVYpXG4iLAorCQkgICBjaGFyZ2VyLT5hZGMudmNobWluX3JlcywKKwkJICAgZGE5MDMwX3JlZ190b19tVihjaGFyZ2VyLT5hZGMudmNobWluX3JlcykpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVidWdfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYmF0X2RlYnVnX3Nob3csIGlub2RlLT5pX3ByaXZhdGUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBiYXRfZGVidWdfZm9wcyA9IHsKKwkub3BlbgkJPSBkZWJ1Z19vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqZGE5MDMwX2JhdF9jcmVhdGVfZGVidWdmcyhzdHJ1Y3QgZGE5MDMwX2NoYXJnZXIgKmNoYXJnZXIpCit7CisJY2hhcmdlci0+ZGVidWdfZmlsZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImNoYXJnZXIiLCAwNjY2LCAwLCBjaGFyZ2VyLAorCQkJCQkJICZiYXRfZGVidWdfZm9wcyk7CisJcmV0dXJuIGNoYXJnZXItPmRlYnVnX2ZpbGU7Cit9CisKK3N0YXRpYyB2b2lkIGRhOTAzMF9iYXRfcmVtb3ZlX2RlYnVnZnMoc3RydWN0IGRhOTAzMF9jaGFyZ2VyICpjaGFyZ2VyKQoreworCWRlYnVnZnNfcmVtb3ZlKGNoYXJnZXItPmRlYnVnX2ZpbGUpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRlbnRyeSAqZGE5MDMwX2JhdF9jcmVhdGVfZGVidWdmcyhzdHJ1Y3QgZGE5MDMwX2NoYXJnZXIgKmNoYXJnZXIpCit7CisJcmV0dXJuIE5VTEw7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgZGE5MDMwX2JhdF9yZW1vdmVfZGVidWdmcyhzdHJ1Y3QgZGE5MDMwX2NoYXJnZXIgKmNoYXJnZXIpCit7Cit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSB2b2lkIGRhOTAzMF9yZWFkX2FkYyhzdHJ1Y3QgZGE5MDMwX2NoYXJnZXIgKmNoYXJnZXIsCisJCQkJICAgc3RydWN0IGRhOTAzMF9hZGNfcmVzICphZGMpCit7CisJZGE5MDN4X3JlYWRzKGNoYXJnZXItPm1hc3RlciwgREE5MDMwX1ZCQVRfUkVTLAorCQkgICAgIHNpemVvZigqYWRjKSwgKHVpbnQ4X3QgKilhZGMpOworfQorCitzdGF0aWMgdm9pZCBkYTkwMzBfY2hhcmdlcl91cGRhdGVfc3RhdGUoc3RydWN0IGRhOTAzMF9jaGFyZ2VyICpjaGFyZ2VyKQoreworCXVpbnQ4X3QgdmFsOworCisJZGE5MDN4X3JlYWQoY2hhcmdlci0+bWFzdGVyLCBEQTkwMzBfQ0hBUkdFX0NPTlRST0wsICZ2YWwpOworCWNoYXJnZXItPmlzX29uID0gKHZhbCAmIERBOTAzMF9DSFJHX0NIQVJHRVJfRU5BQkxFKSA/IDEgOiAwOworCWNoYXJnZXItPm1BID0gKCh2YWwgPj4gMykgJiAweGYpICogMTAwOworCWNoYXJnZXItPm1WID0gKHZhbCAmIDB4NykgKiA1MCArIDQwMDA7CisKKwlkYTkwMzBfcmVhZF9hZGMoY2hhcmdlciwgJmNoYXJnZXItPmFkYyk7CisJZGE5MDN4X3JlYWQoY2hhcmdlci0+bWFzdGVyLCBEQTkwMzBfRkFVTFRfTE9HLCAmY2hhcmdlci0+ZmF1bHQpOworCWNoYXJnZXItPmNoZGV0ID0gZGE5MDN4X3F1ZXJ5X3N0YXR1cyhjaGFyZ2VyLT5tYXN0ZXIsCisJCQkJCQkgICAgIERBOTAzMF9TVEFUVVNfQ0hERVQpOworfQorCitzdGF0aWMgdm9pZCBkYTkwMzBfc2V0X2NoYXJnZShzdHJ1Y3QgZGE5MDMwX2NoYXJnZXIgKmNoYXJnZXIsIGludCBvbikKK3sKKwl1aW50OF90IHZhbDsKKworCWlmIChvbikgeworCQl2YWwgPSBEQTkwMzBfQ0hSR19DSEFSR0VSX0VOQUJMRTsKKwkJdmFsIHw9IChjaGFyZ2VyLT5jaGFyZ2VfbWlsbGlhbXAgLyAxMDApIDw8IDM7CisJCXZhbCB8PSAoY2hhcmdlci0+Y2hhcmdlX21pbGxpdm9sdCAtIDQwMDApIC8gNTA7CisJCWNoYXJnZXItPmlzX29uID0gMTsKKwl9IGVsc2UgeworCQl2YWwgPSAwOworCQljaGFyZ2VyLT5pc19vbiA9IDA7CisJfQorCisJZGE5MDN4X3dyaXRlKGNoYXJnZXItPm1hc3RlciwgREE5MDMwX0NIQVJHRV9DT05UUk9MLCB2YWwpOworfQorCitzdGF0aWMgdm9pZCBkYTkwMzBfY2hhcmdlcl9jaGVja19zdGF0ZShzdHJ1Y3QgZGE5MDMwX2NoYXJnZXIgKmNoYXJnZXIpCit7CisJZGE5MDMwX2NoYXJnZXJfdXBkYXRlX3N0YXRlKGNoYXJnZXIpOworCisJLyogd2Ugd2FrZSBvciBib290IHdpdGggZXh0ZXJuYWwgcG93ZXIgb24gKi8KKwlpZiAoIWNoYXJnZXItPmlzX29uKSB7CisJCWlmICgoY2hhcmdlci0+Y2hkZXQpICYmCisJCSAgICAoY2hhcmdlci0+YWRjLnZiYXRfcmVzIDwKKwkJICAgICBjaGFyZ2VyLT50aHJlc2hvbGRzLnZiYXRfY2hhcmdlX3N0YXJ0KSkgeworCQkJZGE5MDMwX3NldF9jaGFyZ2UoY2hhcmdlciwgMSk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoY2hhcmdlci0+YWRjLnZiYXRfcmVzID49CisJCSAgICBjaGFyZ2VyLT50aHJlc2hvbGRzLnZiYXRfY2hhcmdlX3N0b3ApIHsKKwkJCWRhOTAzMF9zZXRfY2hhcmdlKGNoYXJnZXIsIDApOworCQkJZGE5MDN4X3dyaXRlKGNoYXJnZXItPm1hc3RlciwgREE5MDMwX1ZCQVRNT04sCisJCQkJICAgICAgIGNoYXJnZXItPnRocmVzaG9sZHMudmJhdF9jaGFyZ2VfcmVzdGFydCk7CisJCX0gZWxzZSBpZiAoY2hhcmdlci0+YWRjLnZiYXRfcmVzID4KKwkJCSAgIGNoYXJnZXItPnRocmVzaG9sZHMudmJhdF9sb3cpIHsKKwkJCS8qIHdlIGFyZSBjaGFyZ2luZyBhbmQgcGFzc2VkIExPV19USFJFU0gsCisJCQkgICBzbyB1cGF0ZSBEQTkwMzAgVkJBVCB0aHJlc2hvbGQKKwkJCSAqLworCQkJZGE5MDN4X3dyaXRlKGNoYXJnZXItPm1hc3RlciwgREE5MDMwX1ZCQVRNT04sCisJCQkJICAgICBjaGFyZ2VyLT50aHJlc2hvbGRzLnZiYXRfbG93KTsKKwkJfQorCQlpZiAoY2hhcmdlci0+YWRjLnZjaG1heF9yZXMgPiBjaGFyZ2VyLT50aHJlc2hvbGRzLnZjaGFyZ2VfbWF4IHx8CisJCSAgICBjaGFyZ2VyLT5hZGMudmNobWluX3JlcyA8IGNoYXJnZXItPnRocmVzaG9sZHMudmNoYXJnZV9taW4gfHwKKwkJICAgIC8qIFRlbXByZXR1cmUgcmVhZGluZ3MgYXJlIG5lZ2F0aXZlICovCisJCSAgICBjaGFyZ2VyLT5hZGMudGJhdF9yZXMgPCBjaGFyZ2VyLT50aHJlc2hvbGRzLnRiYXRfaGlnaCB8fAorCQkgICAgY2hhcmdlci0+YWRjLnRiYXRfcmVzID4gY2hhcmdlci0+dGhyZXNob2xkcy50YmF0X2xvdykgeworCQkJLyogZGlzYWJsZSBjaGFyZ2VyICovCisJCQlkYTkwMzBfc2V0X2NoYXJnZShjaGFyZ2VyLCAwKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZGE5MDMwX2NoYXJnaW5nX21vbml0b3Ioc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBkYTkwMzBfY2hhcmdlciAqY2hhcmdlcjsKKworCWNoYXJnZXIgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGRhOTAzMF9jaGFyZ2VyLCB3b3JrLndvcmspOworCisJZGE5MDMwX2NoYXJnZXJfY2hlY2tfc3RhdGUoY2hhcmdlcik7CisKKwkvKiByZXNjaGVkdWxlIGZvciB0aGUgbmV4dCB0aW1lICovCisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjaGFyZ2VyLT53b3JrLCBjaGFyZ2VyLT5pbnRlcnZhbCk7Cit9CisKK3N0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBkYTkwMzBfYmF0dGVyeV9wcm9wc1tdID0geworCVBPV0VSX1NVUFBMWV9QUk9QX01PREVMX05BTUUsCisJUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTLAorCVBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9URUNITk9MT0dZLAorCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUFYX0RFU0lHTiwKKwlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01JTl9ERVNJR04sCisJUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1csCisJUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9BVkcsCit9OworCitzdGF0aWMgdm9pZCBkYTkwMzBfYmF0dGVyeV9jaGVja19zdGF0dXMoc3RydWN0IGRhOTAzMF9jaGFyZ2VyICpjaGFyZ2VyLAorCQkJCSAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQoreworCWlmIChjaGFyZ2VyLT5jaGRldCkgeworCQlpZiAoY2hhcmdlci0+aXNfb24pCisJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfQ0hBUkdJTkc7CisJCWVsc2UKKwkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19OT1RfQ0hBUkdJTkc7CisJfSBlbHNlIHsKKwkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0RJU0NIQVJHSU5HOworCX0KK30KKworc3RhdGljIHZvaWQgZGE5MDMwX2JhdHRlcnlfY2hlY2tfaGVhbHRoKHN0cnVjdCBkYTkwMzBfY2hhcmdlciAqY2hhcmdlciwKKwkJCQkgICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlpZiAoY2hhcmdlci0+ZmF1bHQgJiBEQTkwMzBfRkFVTFRfTE9HX09WRVJfVEVNUCkKKwkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX09WRVJIRUFUOworCWVsc2UgaWYgKGNoYXJnZXItPmZhdWx0ICYgREE5MDMwX0ZBVUxUX0xPR19WQkFUX09WRVIpCisJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9PVkVSVk9MVEFHRTsKKwllbHNlCisJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9HT09EOworfQorCitzdGF0aWMgaW50IGRhOTAzMF9iYXR0ZXJ5X2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCisJCQkJICAgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAorCQkJCSAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCit7CisJc3RydWN0IGRhOTAzMF9jaGFyZ2VyICpjaGFyZ2VyOworCWNoYXJnZXIgPSBjb250YWluZXJfb2YocHN5LCBzdHJ1Y3QgZGE5MDMwX2NoYXJnZXIsIHBzeSk7CisKKwlzd2l0Y2ggKHBzcCkgeworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTOgorCQlkYTkwMzBfYmF0dGVyeV9jaGVja19zdGF0dXMoY2hhcmdlciwgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEg6CisJCWRhOTAzMF9iYXR0ZXJ5X2NoZWNrX2hlYWx0aChjaGFyZ2VyLCB2YWwpOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1k6CisJCXZhbC0+aW50dmFsID0gY2hhcmdlci0+YmF0dGVyeV9pbmZvLT50ZWNobm9sb2d5OworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUFYX0RFU0lHTjoKKwkJdmFsLT5pbnR2YWwgPSBjaGFyZ2VyLT5iYXR0ZXJ5X2luZm8tPnZvbHRhZ2VfbWF4X2Rlc2lnbjsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01JTl9ERVNJR046CisJCXZhbC0+aW50dmFsID0gY2hhcmdlci0+YmF0dGVyeV9pbmZvLT52b2x0YWdlX21pbl9kZXNpZ247CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1c6CisJCXZhbC0+aW50dmFsID0gZGE5MDMwX3JlZ190b19tVihjaGFyZ2VyLT5hZGMudmJhdF9yZXMpICogMTAwMDsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX0FWRzoKKwkJdmFsLT5pbnR2YWwgPQorCQkJZGE5MDMwX3JlZ190b19tQShjaGFyZ2VyLT5hZGMuaWNoYXZlcmFnZV9yZXMpICogMTAwMDsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9NT0RFTF9OQU1FOgorCQl2YWwtPnN0cnZhbCA9IGNoYXJnZXItPmJhdHRlcnlfaW5mby0+bmFtZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRhOTAzMF9iYXR0ZXJ5X3ZiYXRfZXZlbnQoc3RydWN0IGRhOTAzMF9jaGFyZ2VyICpjaGFyZ2VyKQoreworCWRhOTAzMF9yZWFkX2FkYyhjaGFyZ2VyLCAmY2hhcmdlci0+YWRjKTsKKworCWlmIChjaGFyZ2VyLT5pc19vbikKKwkJcmV0dXJuOworCisJaWYgKGNoYXJnZXItPmFkYy52YmF0X3JlcyA8IGNoYXJnZXItPnRocmVzaG9sZHMudmJhdF9sb3cpIHsKKwkJLyogc2V0IFZCQVQgdGhyZXNob2xkIGZvciBjcml0aWNhbCAqLworCQlkYTkwM3hfd3JpdGUoY2hhcmdlci0+bWFzdGVyLCBEQTkwMzBfVkJBVE1PTiwKKwkJCSAgICAgY2hhcmdlci0+dGhyZXNob2xkcy52YmF0X2NyaXQpOworCQlpZiAoY2hhcmdlci0+YmF0dGVyeV9sb3cpCisJCQljaGFyZ2VyLT5iYXR0ZXJ5X2xvdygpOworCX0gZWxzZSBpZiAoY2hhcmdlci0+YWRjLnZiYXRfcmVzIDwKKwkJICAgY2hhcmdlci0+dGhyZXNob2xkcy52YmF0X2NyaXQpIHsKKwkJLyogbm90aWZ5IHRoZSBzeXN0ZW0gb2YgYmF0dGVyeSBjcml0aWNhbCAqLworCQlpZiAoY2hhcmdlci0+YmF0dGVyeV9jcml0aWNhbCkKKwkJCWNoYXJnZXItPmJhdHRlcnlfY3JpdGljYWwoKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZGE5MDMwX2JhdHRlcnlfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyBldmVudCwKKwkJCQl2b2lkICpkYXRhKQoreworCXN0cnVjdCBkYTkwMzBfY2hhcmdlciAqY2hhcmdlciA9CisJCWNvbnRhaW5lcl9vZihuYiwgc3RydWN0IGRhOTAzMF9jaGFyZ2VyLCBuYik7CisJaW50IHN0YXR1czsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIERBOTAzMF9FVkVOVF9DSERFVDoKKwkJc3RhdHVzID0gZGE5MDN4X3F1ZXJ5X3N0YXR1cyhjaGFyZ2VyLT5tYXN0ZXIsCisJCQkJCSAgICAgREE5MDMwX1NUQVRVU19DSERFVCk7CisJCWRhOTAzMF9zZXRfY2hhcmdlKGNoYXJnZXIsIHN0YXR1cyk7CisJCWJyZWFrOworCWNhc2UgREE5MDMwX0VWRU5UX1ZCQVRNT046CisJCWRhOTAzMF9iYXR0ZXJ5X3ZiYXRfZXZlbnQoY2hhcmdlcik7CisJCWJyZWFrOworCWNhc2UgREE5MDMwX0VWRU5UX0NISU9WRVI6CisJY2FzZSBEQTkwMzBfRVZFTlRfVEJBVDoKKwkJZGE5MDMwX3NldF9jaGFyZ2UoY2hhcmdlciwgMCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkYTkwMzBfYmF0dGVyeV9jb252ZXJ0X3RocmVzaG9sZHMoc3RydWN0IGRhOTAzMF9jaGFyZ2VyICpjaGFyZ2VyLAorCQkJCQkgICAgICBzdHJ1Y3QgZGE5MDMwX2JhdHRlcnlfaW5mbyAqcGRhdGEpCit7CisJY2hhcmdlci0+dGhyZXNob2xkcy50YmF0X2xvdyA9IHBkYXRhLT50YmF0X2xvdzsKKwljaGFyZ2VyLT50aHJlc2hvbGRzLnRiYXRfaGlnaCA9IHBkYXRhLT50YmF0X2hpZ2g7CisJY2hhcmdlci0+dGhyZXNob2xkcy50YmF0X3Jlc3RhcnQgID0gcGRhdGEtPnRiYXRfcmVzdGFydDsKKworCWNoYXJnZXItPnRocmVzaG9sZHMudmJhdF9sb3cgPQorCQlkYTkwMzBfbWlsbGl2b2x0X3RvX3JlZyhwZGF0YS0+dmJhdF9sb3cpOworCWNoYXJnZXItPnRocmVzaG9sZHMudmJhdF9jcml0ID0KKwkJZGE5MDMwX21pbGxpdm9sdF90b19yZWcocGRhdGEtPnZiYXRfY3JpdCk7CisJY2hhcmdlci0+dGhyZXNob2xkcy52YmF0X2NoYXJnZV9zdGFydCA9CisJCWRhOTAzMF9taWxsaXZvbHRfdG9fcmVnKHBkYXRhLT52YmF0X2NoYXJnZV9zdGFydCk7CisJY2hhcmdlci0+dGhyZXNob2xkcy52YmF0X2NoYXJnZV9zdG9wID0KKwkJZGE5MDMwX21pbGxpdm9sdF90b19yZWcocGRhdGEtPnZiYXRfY2hhcmdlX3N0b3ApOworCWNoYXJnZXItPnRocmVzaG9sZHMudmJhdF9jaGFyZ2VfcmVzdGFydCA9CisJCWRhOTAzMF9taWxsaXZvbHRfdG9fcmVnKHBkYXRhLT52YmF0X2NoYXJnZV9yZXN0YXJ0KTsKKworCWNoYXJnZXItPnRocmVzaG9sZHMudmNoYXJnZV9taW4gPQorCQlkYTkwMzBfbWlsbGl2b2x0X3RvX3JlZyhwZGF0YS0+dmNoYXJnZV9taW4pOworCWNoYXJnZXItPnRocmVzaG9sZHMudmNoYXJnZV9tYXggPQorCQlkYTkwMzBfbWlsbGl2b2x0X3RvX3JlZyhwZGF0YS0+dmNoYXJnZV9tYXgpOworfQorCitzdGF0aWMgdm9pZCBkYTkwMzBfYmF0dGVyeV9zZXR1cF9wc3koc3RydWN0IGRhOTAzMF9jaGFyZ2VyICpjaGFyZ2VyKQoreworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSA9ICZjaGFyZ2VyLT5wc3k7CisJc3RydWN0IHBvd2VyX3N1cHBseV9pbmZvICppbmZvID0gY2hhcmdlci0+YmF0dGVyeV9pbmZvOworCisJcHN5LT5uYW1lID0gaW5mby0+bmFtZTsKKwlwc3ktPnVzZV9mb3JfYXBtID0gaW5mby0+dXNlX2Zvcl9hcG07CisJcHN5LT50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWTsKKwlwc3ktPmdldF9wcm9wZXJ0eSA9IGRhOTAzMF9iYXR0ZXJ5X2dldF9wcm9wZXJ0eTsKKworCXBzeS0+cHJvcGVydGllcyA9IGRhOTAzMF9iYXR0ZXJ5X3Byb3BzOworCXBzeS0+bnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKGRhOTAzMF9iYXR0ZXJ5X3Byb3BzKTsKK307CisKK3N0YXRpYyBpbnQgZGE5MDMwX2JhdHRlcnlfY2hhcmdlcl9pbml0KHN0cnVjdCBkYTkwMzBfY2hhcmdlciAqY2hhcmdlcikKK3sKKwljaGFyIHZbNV07CisJaW50IHJldDsKKworCXZbMF0gPSB2WzFdID0gY2hhcmdlci0+dGhyZXNob2xkcy52YmF0X2xvdzsKKwl2WzJdID0gY2hhcmdlci0+dGhyZXNob2xkcy50YmF0X2hpZ2g7CisJdlszXSA9IGNoYXJnZXItPnRocmVzaG9sZHMudGJhdF9yZXN0YXJ0OworCXZbNF0gPSBjaGFyZ2VyLT50aHJlc2hvbGRzLnRiYXRfbG93OworCisJcmV0ID0gZGE5MDN4X3dyaXRlcyhjaGFyZ2VyLT5tYXN0ZXIsIERBOTAzMF9WQkFUTU9OLCA1LCB2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyoKKwkgKiBFbmFibGUgcmVmZXJlbmNlIHZvbHRhZ2Ugc3VwcGx5IGZvciBBREMgZnJvbSB0aGUgTERPX0lOVEVSTkFMCisJICogcmVndWxhdG9yLiBNdXN0IGJlIHNldCBiZWZvcmUgQURDIG1lYXN1cmVtZW50cyBjYW4gYmUgbWFkZS4KKwkgKi8KKwlyZXQgPSBkYTkwM3hfd3JpdGUoY2hhcmdlci0+bWFzdGVyLCBEQTkwMzBfQURDX01BTl9DT05UUk9MLAorCQkJICAgREE5MDMwX0FEQ19MRE9fSU5UX0VOQUJMRSB8CisJCQkgICBEQTkwMzBfQURDX1RCQVRSRUZfRU5BQkxFKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogZW5hYmxlIGF1dG8gQURDIG1lYXN1cmVtbnRzICovCisJcmV0dXJuIGRhOTAzeF93cml0ZShjaGFyZ2VyLT5tYXN0ZXIsIERBOTAzMF9BRENfQVVUT19DT05UUk9MLAorCQkJICAgIERBOTAzMF9BRENfVEJBVF9FTkFCTEUgfCBEQTkwMzBfQURDX1ZCQVRfSU5fVFhPTiB8CisJCQkgICAgREE5MDMwX0FEQ19WQ0hfRU5BQkxFIHwgREE5MDMwX0FEQ19JQ0hfRU5BQkxFIHwKKwkJCSAgICBEQTkwMzBfQURDX1ZCQVRfRU5BQkxFIHwKKwkJCSAgICBEQTkwMzBfQURDX0FVVE9fU0xFRVBfRU5BQkxFKTsKK30KKworc3RhdGljIGludCBkYTkwMzBfYmF0dGVyeV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkYTkwMzBfY2hhcmdlciAqY2hhcmdlcjsKKwlzdHJ1Y3QgZGE5MDMwX2JhdHRlcnlfaW5mbyAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpbnQgcmV0OworCisJaWYgKHBkYXRhID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHBkYXRhLT5jaGFyZ2VfbWlsbGlhbXAgPj0gMTUwMCB8fAorCSAgICBwZGF0YS0+Y2hhcmdlX21pbGxpdm9sdCA8IDQwMDAgfHwKKwkgICAgcGRhdGEtPmNoYXJnZV9taWxsaXZvbHQgPiA0MzUwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNoYXJnZXIgPSBremFsbG9jKHNpemVvZigqY2hhcmdlciksIEdGUF9LRVJORUwpOworCWlmIChjaGFyZ2VyID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJY2hhcmdlci0+bWFzdGVyID0gcGRldi0+ZGV2LnBhcmVudDsKKworCS8qIDEwIHNlY29uZHMgYmV0d2VlbiBtb25vdG9yIHJ1bnMgdW5sZXNzIHBsYXRmcm9tIGRlZmluZXMgb3RoZXIKKwkgICBpbnRlcnZhbCAqLworCWNoYXJnZXItPmludGVydmFsID0gbXNlY3NfdG9famlmZmllcygKKwkJKHBkYXRhLT5iYXRtb25faW50ZXJ2YWwgPyA6IDEwKSAqIDEwMDApOworCisJY2hhcmdlci0+Y2hhcmdlX21pbGxpYW1wID0gcGRhdGEtPmNoYXJnZV9taWxsaWFtcDsKKwljaGFyZ2VyLT5jaGFyZ2VfbWlsbGl2b2x0ID0gcGRhdGEtPmNoYXJnZV9taWxsaXZvbHQ7CisJY2hhcmdlci0+YmF0dGVyeV9pbmZvID0gcGRhdGEtPmJhdHRlcnlfaW5mbzsKKwljaGFyZ2VyLT5iYXR0ZXJ5X2xvdyA9IHBkYXRhLT5iYXR0ZXJ5X2xvdzsKKwljaGFyZ2VyLT5iYXR0ZXJ5X2NyaXRpY2FsID0gcGRhdGEtPmJhdHRlcnlfY3JpdGljYWw7CisKKwlkYTkwMzBfYmF0dGVyeV9jb252ZXJ0X3RocmVzaG9sZHMoY2hhcmdlciwgcGRhdGEpOworCisJcmV0ID0gZGE5MDMwX2JhdHRlcnlfY2hhcmdlcl9pbml0KGNoYXJnZXIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2NoYXJnZXJfaW5pdDsKKworCUlOSVRfREVMQVlFRF9XT1JLKCZjaGFyZ2VyLT53b3JrLCBkYTkwMzBfY2hhcmdpbmdfbW9uaXRvcik7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjaGFyZ2VyLT53b3JrLCBjaGFyZ2VyLT5pbnRlcnZhbCk7CisKKwljaGFyZ2VyLT5uYi5ub3RpZmllcl9jYWxsID0gZGE5MDMwX2JhdHRlcnlfZXZlbnQ7CisJcmV0ID0gZGE5MDN4X3JlZ2lzdGVyX25vdGlmaWVyKGNoYXJnZXItPm1hc3RlciwgJmNoYXJnZXItPm5iLAorCQkJCSAgICAgICBEQTkwMzBfRVZFTlRfQ0hERVQgfAorCQkJCSAgICAgICBEQTkwMzBfRVZFTlRfVkJBVE1PTiB8CisJCQkJICAgICAgIERBOTAzMF9FVkVOVF9DSElPVkVSIHwKKwkJCQkgICAgICAgREE5MDMwX0VWRU5UX1RCQVQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX25vdGlmaWVyOworCisJZGE5MDMwX2JhdHRlcnlfc2V0dXBfcHN5KGNoYXJnZXIpOworCXJldCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LCAmY2hhcmdlci0+cHN5KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9wc19yZWdpc3RlcjsKKworCWNoYXJnZXItPmRlYnVnX2ZpbGUgPSBkYTkwMzBfYmF0X2NyZWF0ZV9kZWJ1Z2ZzKGNoYXJnZXIpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGNoYXJnZXIpOworCXJldHVybiAwOworCitlcnJfcHNfcmVnaXN0ZXI6CisJZGE5MDN4X3VucmVnaXN0ZXJfbm90aWZpZXIoY2hhcmdlci0+bWFzdGVyLCAmY2hhcmdlci0+bmIsCisJCQkJICAgREE5MDMwX0VWRU5UX0NIREVUIHwgREE5MDMwX0VWRU5UX1ZCQVRNT04gfAorCQkJCSAgIERBOTAzMF9FVkVOVF9DSElPVkVSIHwgREE5MDMwX0VWRU5UX1RCQVQpOworZXJyX25vdGlmaWVyOgorCWNhbmNlbF9kZWxheWVkX3dvcmsoJmNoYXJnZXItPndvcmspOworCitlcnJfY2hhcmdlcl9pbml0OgorCWtmcmVlKGNoYXJnZXIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkYTkwMzBfYmF0dGVyeV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkYTkwMzBfY2hhcmdlciAqY2hhcmdlciA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CisKKwlkYTkwMzBfYmF0X3JlbW92ZV9kZWJ1Z2ZzKGNoYXJnZXIpOworCisJZGE5MDN4X3VucmVnaXN0ZXJfbm90aWZpZXIoY2hhcmdlci0+bWFzdGVyLCAmY2hhcmdlci0+bmIsCisJCQkJICAgREE5MDMwX0VWRU5UX0NIREVUIHwgREE5MDMwX0VWRU5UX1ZCQVRNT04gfAorCQkJCSAgIERBOTAzMF9FVkVOVF9DSElPVkVSIHwgREE5MDMwX0VWRU5UX1RCQVQpOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmNoYXJnZXItPndvcmspOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZjaGFyZ2VyLT5wc3kpOworCisJa2ZyZWUoY2hhcmdlcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZGE5MDN4X2JhdHRlcnlfZHJpdmVyID0geworCS5kcml2ZXIJPSB7CisJCS5uYW1lCT0gImRhOTAzeC1iYXR0ZXJ5IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBkYTkwMzBfYmF0dGVyeV9wcm9iZSwKKwkucmVtb3ZlID0gZGE5MDMwX2JhdHRlcnlfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBkYTkwM3hfYmF0dGVyeV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZGE5MDN4X2JhdHRlcnlfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgZGE5MDN4X2JhdHRlcnlfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZkYTkwM3hfYmF0dGVyeV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChkYTkwM3hfYmF0dGVyeV9pbml0KTsKK21vZHVsZV9leGl0KGRhOTAzeF9iYXR0ZXJ5X2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkRBOTAzMCBiYXR0ZXJ5IGNoYXJnZXIgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJNaWtlIFJhcG9wb3J0LCBDb21wdUxhYiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9kczI3NjBfYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci9kczI3NjBfYmF0dGVyeS5jCmluZGV4IDMwOGRkYjIuLjFkNzY4OTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvZHMyNzYwX2JhdHRlcnkuYworKysgYi9kcml2ZXJzL3Bvd2VyL2RzMjc2MF9iYXR0ZXJ5LmMKQEAgLTM1NCw3ICszNTQsNyBAQAogCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJZGktPmRldgkJPSAmcGRldi0+ZGV2OwogCWRpLT53MV9kZXYJICAgICA9IHBkZXYtPmRldi5wYXJlbnQ7Ci0JZGktPmJhdC5uYW1lCSAgID0gcGRldi0+ZGV2LmJ1c19pZDsKKwlkaS0+YmF0Lm5hbWUJICAgPSBkZXZfbmFtZSgmcGRldi0+ZGV2KTsKIAlkaS0+YmF0LnR5cGUJICAgPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOwogCWRpLT5iYXQucHJvcGVydGllcyAgICAgPSBkczI3NjBfYmF0dGVyeV9wcm9wczsKIAlkaS0+YmF0Lm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShkczI3NjBfYmF0dGVyeV9wcm9wcyk7CkBAIC0zNzEsNyArMzcxLDcgQEAKIAl9CiAKIAlJTklUX0RFTEFZRURfV09SSygmZGktPm1vbml0b3Jfd29yaywgZHMyNzYwX2JhdHRlcnlfd29yayk7Ci0JZGktPm1vbml0b3Jfd3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUocGRldi0+ZGV2LmJ1c19pZCk7CisJZGktPm1vbml0b3Jfd3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoZGV2X25hbWUoJnBkZXYtPmRldikpOwogCWlmICghZGktPm1vbml0b3Jfd3F1ZXVlKSB7CiAJCXJldHZhbCA9IC1FU1JDSDsKIAkJZ290byB3b3JrcXVldWVfZmFpbGVkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9wb3dlcl9zdXBwbHlfc3lzZnMuYyBiL2RyaXZlcnMvcG93ZXIvcG93ZXJfc3VwcGx5X3N5c2ZzLmMKaW5kZXggMjNhZTg0Ni4uYWMwMWUwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9wb3dlcl9zdXBwbHlfc3lzZnMuYworKysgYi9kcml2ZXJzL3Bvd2VyL3Bvd2VyX3N1cHBseV9zeXNmcy5jCkBAIC00NSw3ICs0NSw3IEBACiAJfTsKIAlzdGF0aWMgY2hhciAqaGVhbHRoX3RleHRbXSA9IHsKIAkJIlVua25vd24iLCAiR29vZCIsICJPdmVyaGVhdCIsICJEZWFkIiwgIk92ZXIgdm9sdGFnZSIsCi0JCSJVbnNwZWNpZmllZCBmYWlsdXJlIgorCQkiVW5zcGVjaWZpZWQgZmFpbHVyZSIsICJDb2xkIiwKIAl9OwogCXN0YXRpYyBjaGFyICp0ZWNobm9sb2d5X3RleHRbXSA9IHsKIAkJIlVua25vd24iLCAiTmlNSCIsICJMaS1pb24iLCAiTGktcG9seSIsICJMaUZlIiwgIk5pQ2QiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci93bTgzNTBfcG93ZXIuYyBiL2RyaXZlcnMvcG93ZXIvd204MzUwX3Bvd2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIxNmJmMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcG93ZXIvd204MzUwX3Bvd2VyLmMKQEAgLTAsMCArMSw1MzIgQEAKKy8qCisgKiBCYXR0ZXJ5IGRyaXZlciBmb3Igd204MzUwIFBNSUMKKyAqCisgKiBDb3B5cmlnaHQgMjAwNywgMjAwOCBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgUExDLgorICoKKyAqIEJhc2VkIG9uIE9MUEMgQmF0dGVyeSBEcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAwNiAgRGF2aWQgV29vZGhvdXNlIDxkd213MkBpbmZyYWRlYWQub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93bTgzNTAvc3VwcGx5Lmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3dtODM1MC9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3dtODM1MC9jb21wYXJhdG9yLmg+CisKK3N0YXRpYyBpbnQgd204MzUwX3JlYWRfYmF0dGVyeV91dm9sdHMoc3RydWN0IHdtODM1MCAqd204MzUwKQoreworCXJldHVybiB3bTgzNTBfcmVhZF9hdXhhZGMod204MzUwLCBXTTgzNTBfQVVYQURDX0JBVFQsIDAsIDApCisJCSogV004MzUwX0FVWF9DT0VGRjsKK30KKworc3RhdGljIGludCB3bTgzNTBfcmVhZF9saW5lX3V2b2x0cyhzdHJ1Y3Qgd204MzUwICp3bTgzNTApCit7CisJcmV0dXJuIHdtODM1MF9yZWFkX2F1eGFkYyh3bTgzNTAsIFdNODM1MF9BVVhBRENfTElORSwgMCwgMCkKKwkJKiBXTTgzNTBfQVVYX0NPRUZGOworfQorCitzdGF0aWMgaW50IHdtODM1MF9yZWFkX3VzYl91dm9sdHMoc3RydWN0IHdtODM1MCAqd204MzUwKQoreworCXJldHVybiB3bTgzNTBfcmVhZF9hdXhhZGMod204MzUwLCBXTTgzNTBfQVVYQURDX1VTQiwgMCwgMCkKKwkJKiBXTTgzNTBfQVVYX0NPRUZGOworfQorCisjZGVmaW5lIFdNODM1MF9CQVRUX1NVUFBMWQkxCisjZGVmaW5lIFdNODM1MF9VU0JfU1VQUExZCTIKKyNkZWZpbmUgV004MzUwX0xJTkVfU1VQUExZCTQKKworc3RhdGljIGlubGluZSBpbnQgd204MzUwX2NoYXJnZV90aW1lX21pbihzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGludCBtaW4pCit7CisJaWYgKCF3bTgzNTAtPnBvd2VyLnJldl9nX2NvZWZmKQorCQlyZXR1cm4gKCgobWluIC0gMzApIC8gMTUpICYgMHhmKSA8PCA4OworCWVsc2UKKwkJcmV0dXJuICgoKG1pbiAtIDMwKSAvIDMwKSAmIDB4ZikgPDwgODsKK30KKworc3RhdGljIGludCB3bTgzNTBfZ2V0X3N1cHBsaWVzKHN0cnVjdCB3bTgzNTAgKndtODM1MCkKK3sKKwl1MTYgc20sIG92LCBjbywgY2hyZzsKKwlpbnQgc3VwcGxpZXMgPSAwOworCisJc20gPSB3bTgzNTBfcmVnX3JlYWQod204MzUwLCBXTTgzNTBfU1RBVEVfTUFDSElORV9TVEFUVVMpOworCW92ID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX01JU0NfT1ZFUlJJREVTKTsKKwljbyA9IHdtODM1MF9yZWdfcmVhZCh3bTgzNTAsIFdNODM1MF9DT01QQVJBVE9SX09WRVJSSURFUyk7CisJY2hyZyA9IHdtODM1MF9yZWdfcmVhZCh3bTgzNTAsIFdNODM1MF9CQVRURVJZX0NIQVJHRVJfQ09OVFJPTF8yKTsKKworCS8qIFVTQl9TTSAqLworCXNtID0gKHNtICYgV004MzUwX1VTQl9TTV9NQVNLKSA+PiBXTTgzNTBfVVNCX1NNX1NISUZUOworCisJLyogQ0hHX0lTRUwgKi8KKwljaHJnICY9IFdNODM1MF9DSEdfSVNFTF9NQVNLOworCisJLyogSWYgdGhlIFVTQiBzdGF0ZSBtYWNoaW5lIGlzIGFjdGl2ZSB0aGVuIHdlJ3JlIHVzaW5nIHRoYXQgd2l0aCBvcgorCSAqIHdpdGhvdXQgYmF0dGVyeSwgb3RoZXJ3aXNlIGNoZWNrIGZvciB3YWxsIHN1cHBseSAqLworCWlmICgoKHNtID09IFdNODM1MF9VU0JfU01fMTAwX1NMVikgfHwKKwkgICAgIChzbSA9PSBXTTgzNTBfVVNCX1NNXzUwMF9TTFYpIHx8CisJICAgICAoc20gPT0gV004MzUwX1VTQl9TTV9TVERCWV9TTFYpKQorCSAgICAmJiAhKG92ICYgV004MzUwX1VTQl9MSU1JVF9PVlJERSkpCisJCXN1cHBsaWVzID0gV004MzUwX1VTQl9TVVBQTFk7CisJZWxzZSBpZiAoKChzbSA9PSBXTTgzNTBfVVNCX1NNXzEwMF9TTFYpIHx8CisJCSAgKHNtID09IFdNODM1MF9VU0JfU01fNTAwX1NMVikgfHwKKwkJICAoc20gPT0gV004MzUwX1VTQl9TTV9TVERCWV9TTFYpKQorCQkgJiYgKG92ICYgV004MzUwX1VTQl9MSU1JVF9PVlJERSkgJiYgKGNocmcgPT0gMCkpCisJCXN1cHBsaWVzID0gV004MzUwX1VTQl9TVVBQTFkgfCBXTTgzNTBfQkFUVF9TVVBQTFk7CisJZWxzZSBpZiAoY28gJiBXTTgzNTBfV0FMTF9GQl9PVlJERSkKKwkJc3VwcGxpZXMgPSBXTTgzNTBfTElORV9TVVBQTFk7CisJZWxzZQorCQlzdXBwbGllcyA9IFdNODM1MF9CQVRUX1NVUFBMWTsKKworCXJldHVybiBzdXBwbGllczsKK30KKworc3RhdGljIGludCB3bTgzNTBfY2hhcmdlcl9jb25maWcoc3RydWN0IHdtODM1MCAqd204MzUwLAorCQkJCSBzdHJ1Y3Qgd204MzUwX2NoYXJnZXJfcG9saWN5ICpwb2xpY3kpCit7CisJdTE2IHJlZywgZW9jX21BLCBmYXN0X2xpbWl0X21BOworCisJaWYgKCFwb2xpY3kpIHsKKwkJZGV2X3dhcm4od204MzUwLT5kZXYsCisJCQkgIk5vIGNoYXJnZXIgcG9saWN5LCBjaGFyZ2VyIG5vdCBjb25maWd1cmVkLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIG1ha2Ugc3VyZSBVU0IgZmFzdCBjaGFyZ2UgY3VycmVudCBpcyBub3QgPiA1MDBtQSAqLworCWlmIChwb2xpY3ktPmZhc3RfbGltaXRfVVNCX21BID4gNTAwKSB7CisJCWRldl9lcnIod204MzUwLT5kZXYsICJVU0IgZmFzdCBjaGFyZ2UgPiA1MDBtQVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWVvY19tQSA9IFdNODM1MF9DSEdfRU9DX21BKHBvbGljeS0+ZW9jX21BKTsKKworCXdtODM1MF9yZWdfdW5sb2NrKHdtODM1MCk7CisKKwlyZWcgPSB3bTgzNTBfcmVnX3JlYWQod204MzUwLCBXTTgzNTBfQkFUVEVSWV9DSEFSR0VSX0NPTlRST0xfMSkKKwkJJiBXTTgzNTBfQ0hHX0VOQV9SMTY4OworCXdtODM1MF9yZWdfd3JpdGUod204MzUwLCBXTTgzNTBfQkFUVEVSWV9DSEFSR0VSX0NPTlRST0xfMSwKKwkJCSByZWcgfCBlb2NfbUEgfCBwb2xpY3ktPnRyaWNrbGVfc3RhcnRfbVYgfAorCQkJIFdNODM1MF9DSEdfVFJJQ0tMRV9URU1QX0NIT0tFIHwKKwkJCSBXTTgzNTBfQ0hHX1RSSUNLTEVfVVNCX0NIT0tFIHwKKwkJCSBXTTgzNTBfQ0hHX0ZBU1RfVVNCX1RIUk9UVExFKTsKKworCWlmICh3bTgzNTBfZ2V0X3N1cHBsaWVzKHdtODM1MCkgJiBXTTgzNTBfVVNCX1NVUFBMWSkgeworCQlmYXN0X2xpbWl0X21BID0KKwkJCVdNODM1MF9DSEdfRkFTVF9MSU1JVF9tQShwb2xpY3ktPmZhc3RfbGltaXRfVVNCX21BKTsKKwkJd204MzUwX3JlZ193cml0ZSh3bTgzNTAsIFdNODM1MF9CQVRURVJZX0NIQVJHRVJfQ09OVFJPTF8yLAorCQkJICAgIHBvbGljeS0+Y2hhcmdlX21WIHwgcG9saWN5LT50cmlja2xlX2NoYXJnZV9VU0JfbUEgfAorCQkJICAgIGZhc3RfbGltaXRfbUEgfCB3bTgzNTBfY2hhcmdlX3RpbWVfbWluKHdtODM1MCwKKwkJCQkJCXBvbGljeS0+Y2hhcmdlX3RpbWVvdXQpKTsKKworCX0gZWxzZSB7CisJCWZhc3RfbGltaXRfbUEgPQorCQkJV004MzUwX0NIR19GQVNUX0xJTUlUX21BKHBvbGljeS0+ZmFzdF9saW1pdF9tQSk7CisJCXdtODM1MF9yZWdfd3JpdGUod204MzUwLCBXTTgzNTBfQkFUVEVSWV9DSEFSR0VSX0NPTlRST0xfMiwKKwkJCSAgICBwb2xpY3ktPmNoYXJnZV9tViB8IHBvbGljeS0+dHJpY2tsZV9jaGFyZ2VfbUEgfAorCQkJICAgIGZhc3RfbGltaXRfbUEgfCB3bTgzNTBfY2hhcmdlX3RpbWVfbWluKHdtODM1MCwKKwkJCQkJCXBvbGljeS0+Y2hhcmdlX3RpbWVvdXQpKTsKKwl9CisKKwl3bTgzNTBfcmVnX2xvY2sod204MzUwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTgzNTBfYmF0dF9zdGF0dXMoc3RydWN0IHdtODM1MCAqd204MzUwKQoreworCXUxNiBzdGF0ZTsKKworCXN0YXRlID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX0JBVFRFUllfQ0hBUkdFUl9DT05UUk9MXzIpOworCXN0YXRlICY9IFdNODM1MF9DSEdfU1RTX01BU0s7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBXTTgzNTBfQ0hHX1NUU19PRkY6CisJCXJldHVybiBQT1dFUl9TVVBQTFlfU1RBVFVTX0RJU0NIQVJHSU5HOworCisJY2FzZSBXTTgzNTBfQ0hHX1NUU19UUklDS0xFOgorCWNhc2UgV004MzUwX0NIR19TVFNfRkFTVDoKKwkJcmV0dXJuIFBPV0VSX1NVUFBMWV9TVEFUVVNfQ0hBUkdJTkc7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gUE9XRVJfU1VQUExZX1NUQVRVU19VTktOT1dOOworCX0KK30KKworc3RhdGljIHNzaXplX3QgY2hhcmdlcl9zdGF0ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgd204MzUwICp3bTgzNTAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwljaGFyICpjaGFyZ2U7CisJaW50IHN0YXRlOworCisJc3RhdGUgPSB3bTgzNTBfcmVnX3JlYWQod204MzUwLCBXTTgzNTBfQkFUVEVSWV9DSEFSR0VSX0NPTlRST0xfMikgJgorCSAgICBXTTgzNTBfQ0hHX1NUU19NQVNLOworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFdNODM1MF9DSEdfU1RTX09GRjoKKwkJY2hhcmdlID0gIkNoYXJnZXIgT2ZmIjsKKwkJYnJlYWs7CisJY2FzZSBXTTgzNTBfQ0hHX1NUU19UUklDS0xFOgorCQljaGFyZ2UgPSAiVHJpY2tsZSBDaGFyZ2luZyI7CisJCWJyZWFrOworCWNhc2UgV004MzUwX0NIR19TVFNfRkFTVDoKKwkJY2hhcmdlID0gIkZhc3QgQ2hhcmdpbmciOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgY2hhcmdlKTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGNoYXJnZXJfc3RhdGUsIDA0NDQsIGNoYXJnZXJfc3RhdGVfc2hvdywgTlVMTCk7CisKK3N0YXRpYyB2b2lkIHdtODM1MF9jaGFyZ2VyX2hhbmRsZXIoc3RydWN0IHdtODM1MCAqd204MzUwLCBpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCB3bTgzNTBfcG93ZXIgKnBvd2VyID0gJndtODM1MC0+cG93ZXI7CisJc3RydWN0IHdtODM1MF9jaGFyZ2VyX3BvbGljeSAqcG9saWN5ID0gcG93ZXItPnBvbGljeTsKKworCXN3aXRjaCAoaXJxKSB7CisJY2FzZSBXTTgzNTBfSVJRX0NIR19CQVRfRkFJTDoKKwkJZGV2X2Vycih3bTgzNTAtPmRldiwgImJhdHRlcnkgZmFpbGVkXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBXTTgzNTBfSVJRX0NIR19UTzoKKwkJZGV2X2Vycih3bTgzNTAtPmRldiwgImNoYXJnZXIgdGltZW91dFxuIik7CisJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKCZwb3dlci0+YmF0dGVyeSk7CisJCWJyZWFrOworCisJY2FzZSBXTTgzNTBfSVJRX0NIR19CQVRfSE9UOgorCWNhc2UgV004MzUwX0lSUV9DSEdfQkFUX0NPTEQ6CisJY2FzZSBXTTgzNTBfSVJRX0NIR19TVEFSVDoKKwljYXNlIFdNODM1MF9JUlFfQ0hHX0VORDoKKwkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoJnBvd2VyLT5iYXR0ZXJ5KTsKKwkJYnJlYWs7CisKKwljYXNlIFdNODM1MF9JUlFfQ0hHX0ZBU1RfUkRZOgorCQlkZXZfZGJnKHdtODM1MC0+ZGV2LCAiZmFzdCBjaGFyZ2VyIHJlYWR5XG4iKTsKKwkJd204MzUwX2NoYXJnZXJfY29uZmlnKHdtODM1MCwgcG9saWN5KTsKKwkJd204MzUwX3JlZ191bmxvY2sod204MzUwKTsKKwkJd204MzUwX3NldF9iaXRzKHdtODM1MCwgV004MzUwX0JBVFRFUllfQ0hBUkdFUl9DT05UUk9MXzEsCisJCQkJV004MzUwX0NIR19GQVNUKTsKKwkJd204MzUwX3JlZ19sb2NrKHdtODM1MCk7CisJCWJyZWFrOworCisJY2FzZSBXTTgzNTBfSVJRX0NIR19WQkFUVF9MVF8zUDk6CisJCWRldl93YXJuKHdtODM1MC0+ZGV2LCAiYmF0dGVyeSA8IDMuOVZcbiIpOworCQlicmVhazsKKwljYXNlIFdNODM1MF9JUlFfQ0hHX1ZCQVRUX0xUXzNQMToKKwkJZGV2X3dhcm4od204MzUwLT5kZXYsICJiYXR0ZXJ5IDwgMy4xVlxuIik7CisJCWJyZWFrOworCWNhc2UgV004MzUwX0lSUV9DSEdfVkJBVFRfTFRfMlA4NToKKwkJZGV2X3dhcm4od204MzUwLT5kZXYsICJiYXR0ZXJ5IDwgMi44NVZcbiIpOworCQlicmVhazsKKworCQkvKiBTdXBwbHkgY2hhbmdlLiAgV2Ugd2lsbCBvdmVybm90aWZ5IGJ1dCBpdCBzaG91bGQgZG8KKwkJICogbm8gaGFybS4gKi8KKwljYXNlIFdNODM1MF9JUlFfRVhUX1VTQl9GQjoKKwljYXNlIFdNODM1MF9JUlFfRVhUX1dBTExfRkI6CisJCXdtODM1MF9jaGFyZ2VyX2NvbmZpZyh3bTgzNTAsIHBvbGljeSk7CisJY2FzZSBXTTgzNTBfSVJRX0VYVF9CQVRfRkI6ICAgLyogRmFsbCB0aHJvdWdoICovCisJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKCZwb3dlci0+YmF0dGVyeSk7CisJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKCZwb3dlci0+dXNiKTsKKwkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoJnBvd2VyLT5hYyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGV2X2Vycih3bTgzNTAtPmRldiwgIlVua25vd24gaW50ZXJydXB0ICVkXG4iLCBpcnEpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCUFDIFBvd2VyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB3bTgzNTBfYWNfZ2V0X3Byb3Aoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAorCQkJICAgICAgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAorCQkJICAgICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlzdHJ1Y3Qgd204MzUwICp3bTgzNTAgPSBkZXZfZ2V0X2RydmRhdGEocHN5LT5kZXYtPnBhcmVudCk7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKHBzcCkgeworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfT05MSU5FOgorCQl2YWwtPmludHZhbCA9ICEhKHdtODM1MF9nZXRfc3VwcGxpZXMod204MzUwKSAmCisJCQkJIFdNODM1MF9MSU5FX1NVUFBMWSk7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1c6CisJCXZhbC0+aW50dmFsID0gd204MzUwX3JlYWRfbGluZV91dm9sdHMod204MzUwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSB3bTgzNTBfYWNfcHJvcHNbXSA9IHsKKwlQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkUsCisJUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1csCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJVVNCIFBvd2VyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB3bTgzNTBfdXNiX2dldF9wcm9wKHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSwKKwkJCSAgICAgICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCisJCQkgICAgICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlzdHJ1Y3Qgd204MzUwICp3bTgzNTAgPSBkZXZfZ2V0X2RydmRhdGEocHN5LT5kZXYtPnBhcmVudCk7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKHBzcCkgeworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfT05MSU5FOgorCQl2YWwtPmludHZhbCA9ICEhKHdtODM1MF9nZXRfc3VwcGxpZXMod204MzUwKSAmCisJCQkJIFdNODM1MF9VU0JfU1VQUExZKTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVzoKKwkJdmFsLT5pbnR2YWwgPSB3bTgzNTBfcmVhZF91c2JfdXZvbHRzKHdtODM1MCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgd204MzUwX3VzYl9wcm9wc1tdID0geworCVBPV0VSX1NVUFBMWV9QUk9QX09OTElORSwKKwlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVywKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlCYXR0ZXJ5IHByb3BlcnRpZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgd204MzUwX2JhdF9jaGVja19oZWFsdGgoc3RydWN0IHdtODM1MCAqd204MzUwKQoreworCXUxNiByZWc7CisKKwlpZiAod204MzUwX3JlYWRfYmF0dGVyeV91dm9sdHMod204MzUwKSA8IDI4NTAwMDApCisJCXJldHVybiBQT1dFUl9TVVBQTFlfSEVBTFRIX1VOU1BFQ19GQUlMVVJFOworCisJcmVnID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX0NIQVJHRVJfT1ZFUlJJREVTKTsKKwlpZiAocmVnICYgV004MzUwX0NIR19CQVRUX0hPVF9PVlJERSkKKwkJcmV0dXJuIFBPV0VSX1NVUFBMWV9IRUFMVEhfT1ZFUkhFQVQ7CisKKwlpZiAocmVnICYgV004MzUwX0NIR19CQVRUX0NPTERfT1ZSREUpCisJCXJldHVybiBQT1dFUl9TVVBQTFlfSEVBTFRIX0NPTEQ7CisKKwlyZXR1cm4gUE9XRVJfU1VQUExZX0hFQUxUSF9HT09EOworfQorCitzdGF0aWMgaW50IHdtODM1MF9iYXRfZ2V0X3Byb3BlcnR5KHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSwKKwkJCQkgICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCisJCQkJICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlzdHJ1Y3Qgd204MzUwICp3bTgzNTAgPSBkZXZfZ2V0X2RydmRhdGEocHN5LT5kZXYtPnBhcmVudCk7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKHBzcCkgeworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTOgorCQl2YWwtPmludHZhbCA9IHdtODM1MF9iYXR0X3N0YXR1cyh3bTgzNTApOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX09OTElORToKKwkJdmFsLT5pbnR2YWwgPSAhISh3bTgzNTBfZ2V0X3N1cHBsaWVzKHdtODM1MCkgJgorCQkJCSBXTTgzNTBfQkFUVF9TVVBQTFkpOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XOgorCQl2YWwtPmludHZhbCA9IHdtODM1MF9yZWFkX2JhdHRlcnlfdXZvbHRzKHdtODM1MCk7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfSEVBTFRIOgorCQl2YWwtPmludHZhbCA9IHdtODM1MF9iYXRfY2hlY2tfaGVhbHRoKHdtODM1MCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSB3bTgzNTBfYmF0X3Byb3BzW10gPSB7CisJUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTLAorCVBPV0VSX1NVUFBMWV9QUk9QX09OTElORSwKKwlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVywKKwlQT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEgsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJSW5pdGlhbGlzYXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHdtODM1MF9pbml0X2NoYXJnZXIoc3RydWN0IHdtODM1MCAqd204MzUwKQoreworCS8qIHJlZ2lzdGVyIG91ciBpbnRlcmVzdCBpbiBjaGFyZ2VyIGV2ZW50cyAqLworCXdtODM1MF9yZWdpc3Rlcl9pcnEod204MzUwLCBXTTgzNTBfSVJRX0NIR19CQVRfSE9ULAorCQkJICAgIHdtODM1MF9jaGFyZ2VyX2hhbmRsZXIsIE5VTEwpOworCXdtODM1MF91bm1hc2tfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DSEdfQkFUX0hPVCk7CisJd204MzUwX3JlZ2lzdGVyX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX0JBVF9DT0xELAorCQkJICAgIHdtODM1MF9jaGFyZ2VyX2hhbmRsZXIsIE5VTEwpOworCXdtODM1MF91bm1hc2tfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DSEdfQkFUX0NPTEQpOworCXdtODM1MF9yZWdpc3Rlcl9pcnEod204MzUwLCBXTTgzNTBfSVJRX0NIR19CQVRfRkFJTCwKKwkJCSAgICB3bTgzNTBfY2hhcmdlcl9oYW5kbGVyLCBOVUxMKTsKKwl3bTgzNTBfdW5tYXNrX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX0JBVF9GQUlMKTsKKwl3bTgzNTBfcmVnaXN0ZXJfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DSEdfVE8sCisJCQkgICAgd204MzUwX2NoYXJnZXJfaGFuZGxlciwgTlVMTCk7CisJd204MzUwX3VubWFza19pcnEod204MzUwLCBXTTgzNTBfSVJRX0NIR19UTyk7CisJd204MzUwX3JlZ2lzdGVyX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX0VORCwKKwkJCSAgICB3bTgzNTBfY2hhcmdlcl9oYW5kbGVyLCBOVUxMKTsKKwl3bTgzNTBfdW5tYXNrX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX0VORCk7CisJd204MzUwX3JlZ2lzdGVyX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX1NUQVJULAorCQkJICAgIHdtODM1MF9jaGFyZ2VyX2hhbmRsZXIsIE5VTEwpOworCXdtODM1MF91bm1hc2tfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DSEdfU1RBUlQpOworCXdtODM1MF9yZWdpc3Rlcl9pcnEod204MzUwLCBXTTgzNTBfSVJRX0NIR19GQVNUX1JEWSwKKwkJCSAgICB3bTgzNTBfY2hhcmdlcl9oYW5kbGVyLCBOVUxMKTsKKwl3bTgzNTBfdW5tYXNrX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX0ZBU1RfUkRZKTsKKwl3bTgzNTBfcmVnaXN0ZXJfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DSEdfVkJBVFRfTFRfM1A5LAorCQkJICAgIHdtODM1MF9jaGFyZ2VyX2hhbmRsZXIsIE5VTEwpOworCXdtODM1MF91bm1hc2tfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DSEdfVkJBVFRfTFRfM1A5KTsKKwl3bTgzNTBfcmVnaXN0ZXJfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DSEdfVkJBVFRfTFRfM1AxLAorCQkJICAgIHdtODM1MF9jaGFyZ2VyX2hhbmRsZXIsIE5VTEwpOworCXdtODM1MF91bm1hc2tfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DSEdfVkJBVFRfTFRfM1AxKTsKKwl3bTgzNTBfcmVnaXN0ZXJfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DSEdfVkJBVFRfTFRfMlA4NSwKKwkJCSAgICB3bTgzNTBfY2hhcmdlcl9oYW5kbGVyLCBOVUxMKTsKKwl3bTgzNTBfdW5tYXNrX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX1ZCQVRUX0xUXzJQODUpOworCisJLyogYW5kIHN1cHBseSBjaGFuZ2UgZXZlbnRzICovCisJd204MzUwX3JlZ2lzdGVyX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfRVhUX1VTQl9GQiwKKwkJCSAgICB3bTgzNTBfY2hhcmdlcl9oYW5kbGVyLCBOVUxMKTsKKwl3bTgzNTBfdW5tYXNrX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfRVhUX1VTQl9GQik7CisJd204MzUwX3JlZ2lzdGVyX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfRVhUX1dBTExfRkIsCisJCQkgICAgd204MzUwX2NoYXJnZXJfaGFuZGxlciwgTlVMTCk7CisJd204MzUwX3VubWFza19pcnEod204MzUwLCBXTTgzNTBfSVJRX0VYVF9XQUxMX0ZCKTsKKwl3bTgzNTBfcmVnaXN0ZXJfaXJxKHdtODM1MCwgV004MzUwX0lSUV9FWFRfQkFUX0ZCLAorCQkJICAgIHdtODM1MF9jaGFyZ2VyX2hhbmRsZXIsIE5VTEwpOworCXdtODM1MF91bm1hc2tfaXJxKHdtODM1MCwgV004MzUwX0lSUV9FWFRfQkFUX0ZCKTsKK30KKworc3RhdGljIHZvaWQgZnJlZV9jaGFyZ2VyX2lycShzdHJ1Y3Qgd204MzUwICp3bTgzNTApCit7CisJd204MzUwX21hc2tfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DSEdfQkFUX0hPVCk7CisJd204MzUwX2ZyZWVfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DSEdfQkFUX0hPVCk7CisJd204MzUwX21hc2tfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DSEdfQkFUX0NPTEQpOworCXdtODM1MF9mcmVlX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX0JBVF9DT0xEKTsKKwl3bTgzNTBfbWFza19pcnEod204MzUwLCBXTTgzNTBfSVJRX0NIR19CQVRfRkFJTCk7CisJd204MzUwX2ZyZWVfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DSEdfQkFUX0ZBSUwpOworCXdtODM1MF9tYXNrX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX1RPKTsKKwl3bTgzNTBfZnJlZV9pcnEod204MzUwLCBXTTgzNTBfSVJRX0NIR19UTyk7CisJd204MzUwX21hc2tfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DSEdfRU5EKTsKKwl3bTgzNTBfZnJlZV9pcnEod204MzUwLCBXTTgzNTBfSVJRX0NIR19FTkQpOworCXdtODM1MF9tYXNrX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX1NUQVJUKTsKKwl3bTgzNTBfZnJlZV9pcnEod204MzUwLCBXTTgzNTBfSVJRX0NIR19TVEFSVCk7CisJd204MzUwX21hc2tfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DSEdfVkJBVFRfTFRfM1A5KTsKKwl3bTgzNTBfZnJlZV9pcnEod204MzUwLCBXTTgzNTBfSVJRX0NIR19WQkFUVF9MVF8zUDkpOworCXdtODM1MF9tYXNrX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfQ0hHX1ZCQVRUX0xUXzNQMSk7CisJd204MzUwX2ZyZWVfaXJxKHdtODM1MCwgV004MzUwX0lSUV9DSEdfVkJBVFRfTFRfM1AxKTsKKwl3bTgzNTBfbWFza19pcnEod204MzUwLCBXTTgzNTBfSVJRX0NIR19WQkFUVF9MVF8yUDg1KTsKKwl3bTgzNTBfZnJlZV9pcnEod204MzUwLCBXTTgzNTBfSVJRX0NIR19WQkFUVF9MVF8yUDg1KTsKKwl3bTgzNTBfbWFza19pcnEod204MzUwLCBXTTgzNTBfSVJRX0VYVF9VU0JfRkIpOworCXdtODM1MF9mcmVlX2lycSh3bTgzNTAsIFdNODM1MF9JUlFfRVhUX1VTQl9GQik7CisJd204MzUwX21hc2tfaXJxKHdtODM1MCwgV004MzUwX0lSUV9FWFRfV0FMTF9GQik7CisJd204MzUwX2ZyZWVfaXJxKHdtODM1MCwgV004MzUwX0lSUV9FWFRfV0FMTF9GQik7CisJd204MzUwX21hc2tfaXJxKHdtODM1MCwgV004MzUwX0lSUV9FWFRfQkFUX0ZCKTsKKwl3bTgzNTBfZnJlZV9pcnEod204MzUwLCBXTTgzNTBfSVJRX0VYVF9CQVRfRkIpOworfQorCitzdGF0aWMgX19kZXZpbml0IGludCB3bTgzNTBfcG93ZXJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgd204MzUwICp3bTgzNTAgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgd204MzUwX3Bvd2VyICpwb3dlciA9ICZ3bTgzNTAtPnBvd2VyOworCXN0cnVjdCB3bTgzNTBfY2hhcmdlcl9wb2xpY3kgKnBvbGljeSA9IHBvd2VyLT5wb2xpY3k7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqdXNiID0gJnBvd2VyLT51c2I7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0dGVyeSA9ICZwb3dlci0+YmF0dGVyeTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICphYyA9ICZwb3dlci0+YWM7CisJaW50IHJldDsKKworCWFjLT5uYW1lID0gIndtODM1MC1hYyI7CisJYWMtPnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9NQUlOUzsKKwlhYy0+cHJvcGVydGllcyA9IHdtODM1MF9hY19wcm9wczsKKwlhYy0+bnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKHdtODM1MF9hY19wcm9wcyk7CisJYWMtPmdldF9wcm9wZXJ0eSA9IHdtODM1MF9hY19nZXRfcHJvcDsKKwlyZXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwgYWMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwliYXR0ZXJ5LT5uYW1lID0gIndtODM1MC1iYXR0ZXJ5IjsKKwliYXR0ZXJ5LT5wcm9wZXJ0aWVzID0gd204MzUwX2JhdF9wcm9wczsKKwliYXR0ZXJ5LT5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUod204MzUwX2JhdF9wcm9wcyk7CisJYmF0dGVyeS0+Z2V0X3Byb3BlcnR5ID0gd204MzUwX2JhdF9nZXRfcHJvcGVydHk7CisJYmF0dGVyeS0+dXNlX2Zvcl9hcG0gPSAxOworCXJldCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LCBiYXR0ZXJ5KTsKKwlpZiAocmV0KQorCQlnb3RvIGJhdHRlcnlfZmFpbGVkOworCisJdXNiLT5uYW1lID0gIndtODM1MC11c2IiLAorCXVzYi0+dHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX1VTQjsKKwl1c2ItPnByb3BlcnRpZXMgPSB3bTgzNTBfdXNiX3Byb3BzOworCXVzYi0+bnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKHdtODM1MF91c2JfcHJvcHMpOworCXVzYi0+Z2V0X3Byb3BlcnR5ID0gd204MzUwX3VzYl9nZXRfcHJvcDsKKwlyZXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwgdXNiKTsKKwlpZiAocmV0KQorCQlnb3RvIHVzYl9mYWlsZWQ7CisKKwlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2NoYXJnZXJfc3RhdGUpOworCWlmIChyZXQgPCAwKQorCQlkZXZfd2Fybih3bTgzNTAtPmRldiwgImZhaWxlZCB0byBhZGQgY2hhcmdlIHN5c2ZzOiAlZFxuIiwgcmV0KTsKKwlyZXQgPSAwOworCisJd204MzUwX2luaXRfY2hhcmdlcih3bTgzNTApOworCWlmICh3bTgzNTBfY2hhcmdlcl9jb25maWcod204MzUwLCBwb2xpY3kpID09IDApIHsKKwkJd204MzUwX3JlZ191bmxvY2sod204MzUwKTsKKwkJd204MzUwX3NldF9iaXRzKHdtODM1MCwgV004MzUwX1BPV0VSX01HTVRfNSwgV004MzUwX0NIR19FTkEpOworCQl3bTgzNTBfcmVnX2xvY2sod204MzUwKTsKKwl9CisKKwlyZXR1cm4gcmV0OworCit1c2JfZmFpbGVkOgorCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGJhdHRlcnkpOworYmF0dGVyeV9mYWlsZWQ6CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoYWMpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIF9fZGV2ZXhpdCBpbnQgd204MzUwX3Bvd2VyX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCB3bTgzNTBfcG93ZXIgKnBvd2VyID0gJndtODM1MC0+cG93ZXI7CisKKwlmcmVlX2NoYXJnZXJfaXJxKHdtODM1MCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9jaGFyZ2VyX3N0YXRlKTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmcG93ZXItPmJhdHRlcnkpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZwb3dlci0+YWMpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZwb3dlci0+dXNiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgd204MzUwX3Bvd2VyX2RyaXZlciA9IHsKKwkucHJvYmUgPSB3bTgzNTBfcG93ZXJfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHdtODM1MF9wb3dlcl9yZW1vdmUpLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIndtODM1MC1wb3dlciIsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHdtODM1MF9wb3dlcl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmd204MzUwX3Bvd2VyX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdCh3bTgzNTBfcG93ZXJfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB3bTgzNTBfcG93ZXJfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ3bTgzNTBfcG93ZXJfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHdtODM1MF9wb3dlcl9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQb3dlciBzdXBwbHkgZHJpdmVyIGZvciBXTTgzNTAiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06d204MzUwLXBvd2VyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JhcGlkaW8vcmlvLWRyaXZlci5jIGIvZHJpdmVycy9yYXBpZGlvL3Jpby1kcml2ZXIuYwppbmRleCA5NTZkM2U3Li5hZGRiODdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JhcGlkaW8vcmlvLWRyaXZlci5jCisrKyBiL2RyaXZlcnMvcmFwaWRpby9yaW8tZHJpdmVyLmMKQEAgLTc5LDcgKzc5LDYgQEAKIAogLyoqCiAgKiAgcmlvX2RldmljZV9wcm9iZSAtIFRlbGwgaWYgYSBSSU8gZGV2aWNlIHN0cnVjdHVyZSBoYXMgYSBtYXRjaGluZyBSSU8gZGV2aWNlIGlkIHN0cnVjdHVyZQotICogIEBpZDogdGhlIFJJTyBkZXZpY2UgaWQgc3RydWN0dXJlIHRvIG1hdGNoIGFnYWluc3QKICAqICBAZGV2OiB0aGUgUklPIGRldmljZSBzdHJ1Y3R1cmUgdG8gbWF0Y2ggYWdhaW5zdAogICoKICAqIHJldHVybiAwIGFuZCBzZXQgcmlvX2Rldi0+ZHJpdmVyIHdoZW4gZHJ2IGNsYWltcyByaW9fZGV2LCBlbHNlIGVycm9yCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9jb3JlLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9jb3JlLmMKaW5kZXggMDJhNzc0NC4uZjUxMWE0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvY29yZS5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2NvcmUuYwpAQCAtMjksNyArMjksNyBAQAogc3RhdGljIExJU1RfSEVBRChyZWd1bGF0b3JfbGlzdCk7CiBzdGF0aWMgTElTVF9IRUFEKHJlZ3VsYXRvcl9tYXBfbGlzdCk7CiAKLS8qKgorLyoKICAqIHN0cnVjdCByZWd1bGF0b3JfZGV2CiAgKgogICogVm9sdGFnZSAvIEN1cnJlbnQgcmVndWxhdG9yIGNsYXNzIGRldmljZS4gT25lIGZvciBlYWNoIHJlZ3VsYXRvci4KQEAgLTU2LDcgKzU2LDcgQEAKIAl2b2lkICpyZWdfZGF0YTsJCS8qIHJlZ3VsYXRvcl9kZXYgZGF0YSAqLwogfTsKIAotLyoqCisvKgogICogc3RydWN0IHJlZ3VsYXRvcl9tYXAKICAqCiAgKiBVc2VkIHRvIHByb3ZpZGUgc3ltYm9saWMgc3VwcGx5IG5hbWVzIHRvIGRldmljZXMuCkBAIC03OSw3ICs3OSw3IEBACiAJaW50IHVBX2xvYWQ7CiAJaW50IG1pbl91VjsKIAlpbnQgbWF4X3VWOwotCWludCBlbmFibGVkOyAvKiBjbGllbnQgaGFzIGNhbGxlZCBlbmFibGVkICovCisJaW50IGVuYWJsZWQ7IC8qIGNvdW50IG9mIGNsaWVudCBlbmFibGVzICovCiAJY2hhciAqc3VwcGx5X25hbWU7CiAJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHI7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXY7CkBAIC0xNzQsNiArMTc0LDE2IEBACiAvKiBvcGVyYXRpbmcgbW9kZSBjb25zdHJhaW50IGNoZWNrICovCiBzdGF0aWMgaW50IHJlZ3VsYXRvcl9jaGVja19tb2RlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LCBpbnQgbW9kZSkKIHsKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIFJFR1VMQVRPUl9NT0RFX0ZBU1Q6CisJY2FzZSBSRUdVTEFUT1JfTU9ERV9OT1JNQUw6CisJY2FzZSBSRUdVTEFUT1JfTU9ERV9JRExFOgorCWNhc2UgUkVHVUxBVE9SX01PREVfU1RBTkRCWToKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJaWYgKCFyZGV2LT5jb25zdHJhaW50cykgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBubyBjb25zdHJhaW50cyBmb3IgJXNcbiIsIF9fZnVuY19fLAogCQkgICAgICAgcmRldi0+ZGVzYy0+bmFtZSk7CkBAIC0yMzIsNiArMjQyLDcgQEAKIAogCXJldHVybiByZXQ7CiB9CitzdGF0aWMgREVWSUNFX0FUVFIobWljcm92b2x0cywgMDQ0NCwgcmVndWxhdG9yX3VWX3Nob3csIE5VTEwpOwogCiBzdGF0aWMgc3NpemVfdCByZWd1bGF0b3JfdUFfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKQEAgLTI0MCw2ICsyNTEsNyBAQAogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIF9yZWd1bGF0b3JfZ2V0X2N1cnJlbnRfbGltaXQocmRldikpOwogfQorc3RhdGljIERFVklDRV9BVFRSKG1pY3JvYW1wcywgMDQ0NCwgcmVndWxhdG9yX3VBX3Nob3csIE5VTEwpOwogCiBzdGF0aWMgc3NpemVfdCByZWd1bGF0b3JfbmFtZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKQEAgLTI1NywxMiArMjY5LDggQEAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgbmFtZSk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHJlZ3VsYXRvcl9vcG1vZGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCByZWd1bGF0b3JfcHJpbnRfb3Btb2RlKGNoYXIgKmJ1ZiwgaW50IG1vZGUpCiB7Ci0Jc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlpbnQgbW9kZSA9IF9yZWd1bGF0b3JfZ2V0X21vZGUocmRldik7Ci0KIAlzd2l0Y2ggKG1vZGUpIHsKIAljYXNlIFJFR1VMQVRPUl9NT0RFX0ZBU1Q6CiAJCXJldHVybiBzcHJpbnRmKGJ1ZiwgImZhc3RcbiIpOwpAQCAtMjc2LDEyICsyODQsMTcgQEAKIAlyZXR1cm4gc3ByaW50ZihidWYsICJ1bmtub3duXG4iKTsKIH0KIAotc3RhdGljIHNzaXplX3QgcmVndWxhdG9yX3N0YXRlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCByZWd1bGF0b3Jfb3Btb2RlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JaW50IHN0YXRlID0gX3JlZ3VsYXRvcl9pc19lbmFibGVkKHJkZXYpOwogCisJcmV0dXJuIHJlZ3VsYXRvcl9wcmludF9vcG1vZGUoYnVmLCBfcmVndWxhdG9yX2dldF9tb2RlKHJkZXYpKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihvcG1vZGUsIDA0NDQsIHJlZ3VsYXRvcl9vcG1vZGVfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHJlZ3VsYXRvcl9wcmludF9zdGF0ZShjaGFyICpidWYsIGludCBzdGF0ZSkKK3sKIAlpZiAoc3RhdGUgPiAwKQogCQlyZXR1cm4gc3ByaW50ZihidWYsICJlbmFibGVkXG4iKTsKIAllbHNlIGlmIChzdGF0ZSA9PSAwKQpAQCAtMjkwLDYgKzMwMywxNSBAQAogCQlyZXR1cm4gc3ByaW50ZihidWYsICJ1bmtub3duXG4iKTsKIH0KIAorc3RhdGljIHNzaXplX3QgcmVndWxhdG9yX3N0YXRlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJldHVybiByZWd1bGF0b3JfcHJpbnRfc3RhdGUoYnVmLCBfcmVndWxhdG9yX2lzX2VuYWJsZWQocmRldikpOworfQorc3RhdGljIERFVklDRV9BVFRSKHN0YXRlLCAwNDQ0LCByZWd1bGF0b3Jfc3RhdGVfc2hvdywgTlVMTCk7CisKIHN0YXRpYyBzc2l6ZV90IHJlZ3VsYXRvcl9taW5fdUFfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CkBAIC0zMDAsNiArMzIyLDcgQEAKIAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCByZGV2LT5jb25zdHJhaW50cy0+bWluX3VBKTsKIH0KK3N0YXRpYyBERVZJQ0VfQVRUUihtaW5fbWljcm9hbXBzLCAwNDQ0LCByZWd1bGF0b3JfbWluX3VBX3Nob3csIE5VTEwpOwogCiBzdGF0aWMgc3NpemVfdCByZWd1bGF0b3JfbWF4X3VBX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQpAQCAtMzExLDYgKzMzNCw3IEBACiAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcmRldi0+Y29uc3RyYWludHMtPm1heF91QSk7CiB9CitzdGF0aWMgREVWSUNFX0FUVFIobWF4X21pY3JvYW1wcywgMDQ0NCwgcmVndWxhdG9yX21heF91QV9zaG93LCBOVUxMKTsKIAogc3RhdGljIHNzaXplX3QgcmVndWxhdG9yX21pbl91Vl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKQEAgLTMyMiw2ICszNDYsNyBAQAogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHJkZXYtPmNvbnN0cmFpbnRzLT5taW5fdVYpOwogfQorc3RhdGljIERFVklDRV9BVFRSKG1pbl9taWNyb3ZvbHRzLCAwNDQ0LCByZWd1bGF0b3JfbWluX3VWX3Nob3csIE5VTEwpOwogCiBzdGF0aWMgc3NpemVfdCByZWd1bGF0b3JfbWF4X3VWX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQpAQCAtMzMzLDYgKzM1OCw3IEBACiAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcmRldi0+Y29uc3RyYWludHMtPm1heF91Vik7CiB9CitzdGF0aWMgREVWSUNFX0FUVFIobWF4X21pY3Jvdm9sdHMsIDA0NDQsIHJlZ3VsYXRvcl9tYXhfdVZfc2hvdywgTlVMTCk7CiAKIHN0YXRpYyBzc2l6ZV90IHJlZ3VsYXRvcl90b3RhbF91QV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQpAQCAtMzQ3LDYgKzM3Myw3IEBACiAJbXV0ZXhfdW5sb2NrKCZyZGV2LT5tdXRleCk7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHVBKTsKIH0KK3N0YXRpYyBERVZJQ0VfQVRUUihyZXF1ZXN0ZWRfbWljcm9hbXBzLCAwNDQ0LCByZWd1bGF0b3JfdG90YWxfdUFfc2hvdywgTlVMTCk7CiAKIHN0YXRpYyBzc2l6ZV90IHJlZ3VsYXRvcl9udW1fdXNlcnNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKQEAgLTM3NCwxNTMgKzQwMSwxMDYgQEAKIHsKIAlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCi0JaWYgKCFyZGV2LT5jb25zdHJhaW50cykKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAibm90IGRlZmluZWRcbiIpOwogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCByZGV2LT5jb25zdHJhaW50cy0+c3RhdGVfbWVtLnVWKTsKIH0KK3N0YXRpYyBERVZJQ0VfQVRUUihzdXNwZW5kX21lbV9taWNyb3ZvbHRzLCAwNDQ0LAorCQlyZWd1bGF0b3Jfc3VzcGVuZF9tZW1fdVZfc2hvdywgTlVMTCk7CiAKIHN0YXRpYyBzc2l6ZV90IHJlZ3VsYXRvcl9zdXNwZW5kX2Rpc2tfdVZfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCi0JaWYgKCFyZGV2LT5jb25zdHJhaW50cykKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAibm90IGRlZmluZWRcbiIpOwogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCByZGV2LT5jb25zdHJhaW50cy0+c3RhdGVfZGlzay51Vik7CiB9CitzdGF0aWMgREVWSUNFX0FUVFIoc3VzcGVuZF9kaXNrX21pY3Jvdm9sdHMsIDA0NDQsCisJCXJlZ3VsYXRvcl9zdXNwZW5kX2Rpc2tfdVZfc2hvdywgTlVMTCk7CiAKIHN0YXRpYyBzc2l6ZV90IHJlZ3VsYXRvcl9zdXNwZW5kX3N0YW5kYnlfdVZfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCi0JaWYgKCFyZGV2LT5jb25zdHJhaW50cykKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAibm90IGRlZmluZWRcbiIpOwogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCByZGV2LT5jb25zdHJhaW50cy0+c3RhdGVfc3RhbmRieS51Vik7CiB9Ci0KLXN0YXRpYyBzc2l6ZV90IHN1c3BlbmRfb3Btb2RlX3Nob3coc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCi0JdW5zaWduZWQgaW50IG1vZGUsIGNoYXIgKmJ1ZikKLXsKLQlzd2l0Y2ggKG1vZGUpIHsKLQljYXNlIFJFR1VMQVRPUl9NT0RFX0ZBU1Q6Ci0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgImZhc3RcbiIpOwotCWNhc2UgUkVHVUxBVE9SX01PREVfTk9STUFMOgotCQlyZXR1cm4gc3ByaW50ZihidWYsICJub3JtYWxcbiIpOwotCWNhc2UgUkVHVUxBVE9SX01PREVfSURMRToKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAiaWRsZVxuIik7Ci0JY2FzZSBSRUdVTEFUT1JfTU9ERV9TVEFOREJZOgotCQlyZXR1cm4gc3ByaW50ZihidWYsICJzdGFuZGJ5XG4iKTsKLQl9Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAidW5rbm93blxuIik7Ci19CitzdGF0aWMgREVWSUNFX0FUVFIoc3VzcGVuZF9zdGFuZGJ5X21pY3Jvdm9sdHMsIDA0NDQsCisJCXJlZ3VsYXRvcl9zdXNwZW5kX3N0YW5kYnlfdVZfc2hvdywgTlVMTCk7CiAKIHN0YXRpYyBzc2l6ZV90IHJlZ3VsYXRvcl9zdXNwZW5kX21lbV9tb2RlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAotCWlmICghcmRldi0+Y29uc3RyYWludHMpCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIm5vdCBkZWZpbmVkXG4iKTsKLQlyZXR1cm4gc3VzcGVuZF9vcG1vZGVfc2hvdyhyZGV2LAotCQlyZGV2LT5jb25zdHJhaW50cy0+c3RhdGVfbWVtLm1vZGUsIGJ1Zik7CisJcmV0dXJuIHJlZ3VsYXRvcl9wcmludF9vcG1vZGUoYnVmLAorCQlyZGV2LT5jb25zdHJhaW50cy0+c3RhdGVfbWVtLm1vZGUpOwogfQorc3RhdGljIERFVklDRV9BVFRSKHN1c3BlbmRfbWVtX21vZGUsIDA0NDQsCisJCXJlZ3VsYXRvcl9zdXNwZW5kX21lbV9tb2RlX3Nob3csIE5VTEwpOwogCiBzdGF0aWMgc3NpemVfdCByZWd1bGF0b3Jfc3VzcGVuZF9kaXNrX21vZGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCi0JaWYgKCFyZGV2LT5jb25zdHJhaW50cykKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAibm90IGRlZmluZWRcbiIpOwotCXJldHVybiBzdXNwZW5kX29wbW9kZV9zaG93KHJkZXYsCi0JCXJkZXYtPmNvbnN0cmFpbnRzLT5zdGF0ZV9kaXNrLm1vZGUsIGJ1Zik7CisJcmV0dXJuIHJlZ3VsYXRvcl9wcmludF9vcG1vZGUoYnVmLAorCQlyZGV2LT5jb25zdHJhaW50cy0+c3RhdGVfZGlzay5tb2RlKTsKIH0KK3N0YXRpYyBERVZJQ0VfQVRUUihzdXNwZW5kX2Rpc2tfbW9kZSwgMDQ0NCwKKwkJcmVndWxhdG9yX3N1c3BlbmRfZGlza19tb2RlX3Nob3csIE5VTEwpOwogCiBzdGF0aWMgc3NpemVfdCByZWd1bGF0b3Jfc3VzcGVuZF9zdGFuZGJ5X21vZGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCi0JaWYgKCFyZGV2LT5jb25zdHJhaW50cykKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAibm90IGRlZmluZWRcbiIpOwotCXJldHVybiBzdXNwZW5kX29wbW9kZV9zaG93KHJkZXYsCi0JCXJkZXYtPmNvbnN0cmFpbnRzLT5zdGF0ZV9zdGFuZGJ5Lm1vZGUsIGJ1Zik7CisJcmV0dXJuIHJlZ3VsYXRvcl9wcmludF9vcG1vZGUoYnVmLAorCQlyZGV2LT5jb25zdHJhaW50cy0+c3RhdGVfc3RhbmRieS5tb2RlKTsKIH0KK3N0YXRpYyBERVZJQ0VfQVRUUihzdXNwZW5kX3N0YW5kYnlfbW9kZSwgMDQ0NCwKKwkJcmVndWxhdG9yX3N1c3BlbmRfc3RhbmRieV9tb2RlX3Nob3csIE5VTEwpOwogCiBzdGF0aWMgc3NpemVfdCByZWd1bGF0b3Jfc3VzcGVuZF9tZW1fc3RhdGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCi0JaWYgKCFyZGV2LT5jb25zdHJhaW50cykKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAibm90IGRlZmluZWRcbiIpOwotCi0JaWYgKHJkZXYtPmNvbnN0cmFpbnRzLT5zdGF0ZV9tZW0uZW5hYmxlZCkKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAiZW5hYmxlZFxuIik7Ci0JZWxzZQotCQlyZXR1cm4gc3ByaW50ZihidWYsICJkaXNhYmxlZFxuIik7CisJcmV0dXJuIHJlZ3VsYXRvcl9wcmludF9zdGF0ZShidWYsCisJCQlyZGV2LT5jb25zdHJhaW50cy0+c3RhdGVfbWVtLmVuYWJsZWQpOwogfQorc3RhdGljIERFVklDRV9BVFRSKHN1c3BlbmRfbWVtX3N0YXRlLCAwNDQ0LAorCQlyZWd1bGF0b3Jfc3VzcGVuZF9tZW1fc3RhdGVfc2hvdywgTlVMTCk7CiAKIHN0YXRpYyBzc2l6ZV90IHJlZ3VsYXRvcl9zdXNwZW5kX2Rpc2tfc3RhdGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCi0JaWYgKCFyZGV2LT5jb25zdHJhaW50cykKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAibm90IGRlZmluZWRcbiIpOwotCi0JaWYgKHJkZXYtPmNvbnN0cmFpbnRzLT5zdGF0ZV9kaXNrLmVuYWJsZWQpCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgImVuYWJsZWRcbiIpOwotCWVsc2UKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAiZGlzYWJsZWRcbiIpOworCXJldHVybiByZWd1bGF0b3JfcHJpbnRfc3RhdGUoYnVmLAorCQkJcmRldi0+Y29uc3RyYWludHMtPnN0YXRlX2Rpc2suZW5hYmxlZCk7CiB9CitzdGF0aWMgREVWSUNFX0FUVFIoc3VzcGVuZF9kaXNrX3N0YXRlLCAwNDQ0LAorCQlyZWd1bGF0b3Jfc3VzcGVuZF9kaXNrX3N0YXRlX3Nob3csIE5VTEwpOwogCiBzdGF0aWMgc3NpemVfdCByZWd1bGF0b3Jfc3VzcGVuZF9zdGFuZGJ5X3N0YXRlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAotCWlmICghcmRldi0+Y29uc3RyYWludHMpCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIm5vdCBkZWZpbmVkXG4iKTsKLQotCWlmIChyZGV2LT5jb25zdHJhaW50cy0+c3RhdGVfc3RhbmRieS5lbmFibGVkKQotCQlyZXR1cm4gc3ByaW50ZihidWYsICJlbmFibGVkXG4iKTsKLQllbHNlCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgImRpc2FibGVkXG4iKTsKKwlyZXR1cm4gcmVndWxhdG9yX3ByaW50X3N0YXRlKGJ1ZiwKKwkJCXJkZXYtPmNvbnN0cmFpbnRzLT5zdGF0ZV9zdGFuZGJ5LmVuYWJsZWQpOwogfQorc3RhdGljIERFVklDRV9BVFRSKHN1c3BlbmRfc3RhbmRieV9zdGF0ZSwgMDQ0NCwKKwkJcmVndWxhdG9yX3N1c3BlbmRfc3RhbmRieV9zdGF0ZV9zaG93LCBOVUxMKTsKIAorCisvKgorICogVGhlc2UgYXJlIHRoZSBvbmx5IGF0dHJpYnV0ZXMgYXJlIHByZXNlbnQgZm9yIGFsbCByZWd1bGF0b3JzLgorICogT3RoZXIgYXR0cmlidXRlcyBhcmUgYSBmdW5jdGlvbiBvZiByZWd1bGF0b3IgZnVuY3Rpb25hbGl0eS4KKyAqLwogc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHJlZ3VsYXRvcl9kZXZfYXR0cnNbXSA9IHsKIAlfX0FUVFIobmFtZSwgMDQ0NCwgcmVndWxhdG9yX25hbWVfc2hvdywgTlVMTCksCi0JX19BVFRSKG1pY3Jvdm9sdHMsIDA0NDQsIHJlZ3VsYXRvcl91Vl9zaG93LCBOVUxMKSwKLQlfX0FUVFIobWljcm9hbXBzLCAwNDQ0LCByZWd1bGF0b3JfdUFfc2hvdywgTlVMTCksCi0JX19BVFRSKG9wbW9kZSwgMDQ0NCwgcmVndWxhdG9yX29wbW9kZV9zaG93LCBOVUxMKSwKLQlfX0FUVFIoc3RhdGUsIDA0NDQsIHJlZ3VsYXRvcl9zdGF0ZV9zaG93LCBOVUxMKSwKLQlfX0FUVFIobWluX21pY3Jvdm9sdHMsIDA0NDQsIHJlZ3VsYXRvcl9taW5fdVZfc2hvdywgTlVMTCksCi0JX19BVFRSKG1pbl9taWNyb2FtcHMsIDA0NDQsIHJlZ3VsYXRvcl9taW5fdUFfc2hvdywgTlVMTCksCi0JX19BVFRSKG1heF9taWNyb3ZvbHRzLCAwNDQ0LCByZWd1bGF0b3JfbWF4X3VWX3Nob3csIE5VTEwpLAotCV9fQVRUUihtYXhfbWljcm9hbXBzLCAwNDQ0LCByZWd1bGF0b3JfbWF4X3VBX3Nob3csIE5VTEwpLAotCV9fQVRUUihyZXF1ZXN0ZWRfbWljcm9hbXBzLCAwNDQ0LCByZWd1bGF0b3JfdG90YWxfdUFfc2hvdywgTlVMTCksCiAJX19BVFRSKG51bV91c2VycywgMDQ0NCwgcmVndWxhdG9yX251bV91c2Vyc19zaG93LCBOVUxMKSwKIAlfX0FUVFIodHlwZSwgMDQ0NCwgcmVndWxhdG9yX3R5cGVfc2hvdywgTlVMTCksCi0JX19BVFRSKHN1c3BlbmRfbWVtX21pY3Jvdm9sdHMsIDA0NDQsCi0JCXJlZ3VsYXRvcl9zdXNwZW5kX21lbV91Vl9zaG93LCBOVUxMKSwKLQlfX0FUVFIoc3VzcGVuZF9kaXNrX21pY3Jvdm9sdHMsIDA0NDQsCi0JCXJlZ3VsYXRvcl9zdXNwZW5kX2Rpc2tfdVZfc2hvdywgTlVMTCksCi0JX19BVFRSKHN1c3BlbmRfc3RhbmRieV9taWNyb3ZvbHRzLCAwNDQ0LAotCQlyZWd1bGF0b3Jfc3VzcGVuZF9zdGFuZGJ5X3VWX3Nob3csIE5VTEwpLAotCV9fQVRUUihzdXNwZW5kX21lbV9tb2RlLCAwNDQ0LAotCQlyZWd1bGF0b3Jfc3VzcGVuZF9tZW1fbW9kZV9zaG93LCBOVUxMKSwKLQlfX0FUVFIoc3VzcGVuZF9kaXNrX21vZGUsIDA0NDQsCi0JCXJlZ3VsYXRvcl9zdXNwZW5kX2Rpc2tfbW9kZV9zaG93LCBOVUxMKSwKLQlfX0FUVFIoc3VzcGVuZF9zdGFuZGJ5X21vZGUsIDA0NDQsCi0JCXJlZ3VsYXRvcl9zdXNwZW5kX3N0YW5kYnlfbW9kZV9zaG93LCBOVUxMKSwKLQlfX0FUVFIoc3VzcGVuZF9tZW1fc3RhdGUsIDA0NDQsCi0JCXJlZ3VsYXRvcl9zdXNwZW5kX21lbV9zdGF0ZV9zaG93LCBOVUxMKSwKLQlfX0FUVFIoc3VzcGVuZF9kaXNrX3N0YXRlLCAwNDQ0LAotCQlyZWd1bGF0b3Jfc3VzcGVuZF9kaXNrX3N0YXRlX3Nob3csIE5VTEwpLAotCV9fQVRUUihzdXNwZW5kX3N0YW5kYnlfc3RhdGUsIDA0NDQsCi0JCXJlZ3VsYXRvcl9zdXNwZW5kX3N0YW5kYnlfc3RhdGVfc2hvdywgTlVMTCksCiAJX19BVFRSX05VTEwsCiB9OwogCkBAIC02NzUsNyArNjU1LDggQEAKIAogLyoqCiAgKiBzZXRfbWFjaGluZV9jb25zdHJhaW50cyAtIHNldHMgcmVndWxhdG9yIGNvbnN0cmFpbnRzCi0gKiBAcmVndWxhdG9yOiByZWd1bGF0b3Igc291cmNlCisgKiBAcmRldjogcmVndWxhdG9yIHNvdXJjZQorICogQGNvbnN0cmFpbnRzOiBjb25zdHJhaW50cyB0byBhcHBseQogICoKICAqIEFsbG93cyBwbGF0Zm9ybSBpbml0aWFsaXNhdGlvbiBjb2RlIHRvIGRlZmluZSBhbmQgY29uc3RyYWluCiAgKiByZWd1bGF0b3IgY2lyY3VpdHMgZS5nLiB2YWxpZCB2b2x0YWdlL2N1cnJlbnQgcmFuZ2VzLCBldGMuICBOT1RFOgpAQCAtNzUwLDggKzczMSw4IEBACiAKIC8qKgogICogc2V0X3N1cHBseSAtIHNldCByZWd1bGF0b3Igc3VwcGx5IHJlZ3VsYXRvcgotICogQHJlZ3VsYXRvcjogcmVndWxhdG9yIG5hbWUKLSAqIEBzdXBwbHk6IHN1cHBseSByZWd1bGF0b3IgbmFtZQorICogQHJkZXY6IHJlZ3VsYXRvciBuYW1lCisgKiBAc3VwcGx5X3JkZXY6IHN1cHBseSByZWd1bGF0b3IgbmFtZQogICoKICAqIENhbGxlZCBieSBwbGF0Zm9ybSBpbml0aWFsaXNhdGlvbiBjb2RlIHRvIHNldCB0aGUgc3VwcGx5IHJlZ3VsYXRvciBmb3IgdGhpcwogICogcmVndWxhdG9yLiBUaGlzIGVuc3VyZXMgdGhhdCBhIHJlZ3VsYXRvcnMgc3VwcGx5IHdpbGwgYWxzbyBiZSBlbmFibGVkIGJ5IHRoZQpAQCAtNzc4LDkgKzc1OSw5IEBACiAKIC8qKgogICogc2V0X2NvbnN1bWVyX2RldmljZV9zdXBwbHk6IEJpbmQgYSByZWd1bGF0b3IgdG8gYSBzeW1ib2xpYyBzdXBwbHkKLSAqIEByZWd1bGF0b3I6IHJlZ3VsYXRvciBzb3VyY2UKLSAqIEBkZXY6ICAgICAgIGRldmljZSB0aGUgc3VwcGx5IGFwcGxpZXMgdG8KLSAqIEBzdXBwbHk6ICAgIHN5bWJvbGljIG5hbWUgZm9yIHN1cHBseQorICogQHJkZXY6ICAgICAgICAgcmVndWxhdG9yIHNvdXJjZQorICogQGNvbnN1bWVyX2RldjogZGV2aWNlIHRoZSBzdXBwbHkgYXBwbGllcyB0bworICogQHN1cHBseTogICAgICAgc3ltYm9saWMgbmFtZSBmb3Igc3VwcGx5CiAgKgogICogQWxsb3dzIHBsYXRmb3JtIGluaXRpYWxpc2F0aW9uIGNvZGUgdG8gbWFwIHBoeXNpY2FsIHJlZ3VsYXRvcgogICogc291cmNlcyB0byBzeW1ib2xpYyBuYW1lcyBmb3Igc3VwcGxpZXMgZm9yIHVzZSBieSBkZXZpY2VzLiAgRGV2aWNlcwpAQCAtNzk1LDYgKzc3NiwyMCBAQAogCWlmIChzdXBwbHkgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5vZGUsICZyZWd1bGF0b3JfbWFwX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGNvbnN1bWVyX2RldiAhPSBub2RlLT5kZXYpCisJCQljb250aW51ZTsKKwkJaWYgKHN0cmNtcChub2RlLT5zdXBwbHksIHN1cHBseSkgIT0gMCkKKwkJCWNvbnRpbnVlOworCisJCWRldl9kYmcoY29uc3VtZXJfZGV2LCAiJXMvJXMgaXMgJyVzJyBzdXBwbHk7IGZhaWwgJXMvJXNcbiIsCisJCQkJZGV2X25hbWUoJm5vZGUtPnJlZ3VsYXRvci0+ZGV2KSwKKwkJCQlub2RlLT5yZWd1bGF0b3ItPmRlc2MtPm5hbWUsCisJCQkJc3VwcGx5LAorCQkJCWRldl9uYW1lKCZyZGV2LT5kZXYpLCByZGV2LT5kZXNjLT5uYW1lKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKIAlub2RlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHJlZ3VsYXRvcl9tYXApLCBHRlBfS0VSTkVMKTsKIAlpZiAobm9kZSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTk2MywxNiArOTU4LDEzIEBACiAJaWYgKHJlZ3VsYXRvciA9PSBOVUxMIHx8IElTX0VSUihyZWd1bGF0b3IpKQogCQlyZXR1cm47CiAKLQlpZiAocmVndWxhdG9yLT5lbmFibGVkKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIlJlbGVhc2luZyBzdXBwbHkgJXMgd2hpbGUgZW5hYmxlZFxuIiwKLQkJICAgICAgIHJlZ3VsYXRvci0+c3VwcGx5X25hbWUpOwotCQlXQVJOX09OKHJlZ3VsYXRvci0+ZW5hYmxlZCk7Ci0JCXJlZ3VsYXRvcl9kaXNhYmxlKHJlZ3VsYXRvcik7Ci0JfQotCiAJbXV0ZXhfbG9jaygmcmVndWxhdG9yX2xpc3RfbXV0ZXgpOwogCXJkZXYgPSByZWd1bGF0b3ItPnJkZXY7CiAKKwlpZiAoV0FSTihyZWd1bGF0b3ItPmVuYWJsZWQsICJSZWxlYXNpbmcgc3VwcGx5ICVzIHdoaWxlIGVuYWJsZWRcbiIsCisJCQkgICAgICAgcmVndWxhdG9yLT5zdXBwbHlfbmFtZSkpCisJCV9yZWd1bGF0b3JfZGlzYWJsZShyZGV2KTsKKwogCS8qIHJlbW92ZSBhbnkgc3lzZnMgZW50cmllcyAqLwogCWlmIChyZWd1bGF0b3ItPmRldikgewogCQlzeXNmc19yZW1vdmVfbGluaygmcmRldi0+ZGV2LmtvYmosIHJlZ3VsYXRvci0+c3VwcGx5X25hbWUpOwpAQCAtMTAzNCwyOSArMTAyNiwyNiBAQAogICogcmVndWxhdG9yX2VuYWJsZSAtIGVuYWJsZSByZWd1bGF0b3Igb3V0cHV0CiAgKiBAcmVndWxhdG9yOiByZWd1bGF0b3Igc291cmNlCiAgKgotICogRW5hYmxlIHRoZSByZWd1bGF0b3Igb3V0cHV0IGF0IHRoZSBwcmVkZWZpbmVkIHZvbHRhZ2Ugb3IgY3VycmVudCB2YWx1ZS4KKyAqIFJlcXVlc3QgdGhhdCB0aGUgcmVndWxhdG9yIGJlIGVuYWJsZWQgd2l0aCB0aGUgcmVndWxhdG9yIG91dHB1dCBhdAorICogdGhlIHByZWRlZmluZWQgdm9sdGFnZSBvciBjdXJyZW50IHZhbHVlLiAgQ2FsbHMgdG8gcmVndWxhdG9yX2VuYWJsZSgpCisgKiBtdXN0IGJlIGJhbGFuY2VkIHdpdGggY2FsbHMgdG8gcmVndWxhdG9yX2Rpc2FibGUoKS4KKyAqCiAgKiBOT1RFOiB0aGUgb3V0cHV0IHZhbHVlIGNhbiBiZSBzZXQgYnkgb3RoZXIgZHJpdmVycywgYm9vdCBsb2FkZXIgb3IgbWF5IGJlCiAgKiBoYXJkd2lyZWQgaW4gdGhlIHJlZ3VsYXRvci4KLSAqIE5PVEU6IGNhbGxzIHRvIHJlZ3VsYXRvcl9lbmFibGUoKSBtdXN0IGJlIGJhbGFuY2VkIHdpdGggY2FsbHMgdG8KLSAqIHJlZ3VsYXRvcl9kaXNhYmxlKCkuCiAgKi8KIGludCByZWd1bGF0b3JfZW5hYmxlKHN0cnVjdCByZWd1bGF0b3IgKnJlZ3VsYXRvcikKIHsKLQlpbnQgcmV0OworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gcmVndWxhdG9yLT5yZGV2OworCWludCByZXQgPSAwOwogCi0JaWYgKHJlZ3VsYXRvci0+ZW5hYmxlZCkgewotCQlwcmludGsoS0VSTl9DUklUICJSZWd1bGF0b3IgJXMgYWxyZWFkeSBlbmFibGVkXG4iLAotCQkgICAgICAgcmVndWxhdG9yLT5zdXBwbHlfbmFtZSk7Ci0JCVdBUk5fT04ocmVndWxhdG9yLT5lbmFibGVkKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JbXV0ZXhfbG9jaygmcmVndWxhdG9yLT5yZGV2LT5tdXRleCk7Ci0JcmVndWxhdG9yLT5lbmFibGVkID0gMTsKLQlyZXQgPSBfcmVndWxhdG9yX2VuYWJsZShyZWd1bGF0b3ItPnJkZXYpOwotCWlmIChyZXQgIT0gMCkKLQkJcmVndWxhdG9yLT5lbmFibGVkID0gMDsKLQltdXRleF91bmxvY2soJnJlZ3VsYXRvci0+cmRldi0+bXV0ZXgpOworCW11dGV4X2xvY2soJnJkZXYtPm11dGV4KTsKKwlpZiAocmVndWxhdG9yLT5lbmFibGVkID09IDApCisJCXJldCA9IF9yZWd1bGF0b3JfZW5hYmxlKHJkZXYpOworCWVsc2UgaWYgKHJlZ3VsYXRvci0+ZW5hYmxlZCA8IDApCisJCXJldCA9IC1FSU87CisJaWYgKHJldCA9PSAwKQorCQlyZWd1bGF0b3ItPmVuYWJsZWQrKzsKKwltdXRleF91bmxvY2soJnJkZXYtPm11dGV4KTsKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwocmVndWxhdG9yX2VuYWJsZSk7CkBAIC0xMTAwLDI3ICsxMDg5LDMxIEBACiAgKiByZWd1bGF0b3JfZGlzYWJsZSAtIGRpc2FibGUgcmVndWxhdG9yIG91dHB1dAogICogQHJlZ3VsYXRvcjogcmVndWxhdG9yIHNvdXJjZQogICoKLSAqIERpc2FibGUgdGhlIHJlZ3VsYXRvciBvdXRwdXQgdm9sdGFnZSBvciBjdXJyZW50LgotICogTk9URTogdGhpcyB3aWxsIG9ubHkgZGlzYWJsZSB0aGUgcmVndWxhdG9yIG91dHB1dCBpZiBubyBvdGhlciBjb25zdW1lcgotICogZGV2aWNlcyBoYXZlIGl0IGVuYWJsZWQuCi0gKiBOT1RFOiBjYWxscyB0byByZWd1bGF0b3JfZW5hYmxlKCkgbXVzdCBiZSBiYWxhbmNlZCB3aXRoIGNhbGxzIHRvCisgKiBEaXNhYmxlIHRoZSByZWd1bGF0b3Igb3V0cHV0IHZvbHRhZ2Ugb3IgY3VycmVudC4gIENhbGxzIHRvCisgKiByZWd1bGF0b3JfZW5hYmxlKCkgbXVzdCBiZSBiYWxhbmNlZCB3aXRoIGNhbGxzIHRvCiAgKiByZWd1bGF0b3JfZGlzYWJsZSgpLgorICoKKyAqIE5PVEU6IHRoaXMgd2lsbCBvbmx5IGRpc2FibGUgdGhlIHJlZ3VsYXRvciBvdXRwdXQgaWYgbm8gb3RoZXIgY29uc3VtZXIKKyAqIGRldmljZXMgaGF2ZSBpdCBlbmFibGVkLCB0aGUgcmVndWxhdG9yIGRldmljZSBzdXBwb3J0cyBkaXNhYmxpbmcgYW5kCisgKiBtYWNoaW5lIGNvbnN0cmFpbnRzIHBlcm1pdCB0aGlzIG9wZXJhdGlvbi4KICAqLwogaW50IHJlZ3VsYXRvcl9kaXNhYmxlKHN0cnVjdCByZWd1bGF0b3IgKnJlZ3VsYXRvcikKIHsKLQlpbnQgcmV0OworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gcmVndWxhdG9yLT5yZGV2OworCWludCByZXQgPSAwOwogCi0JaWYgKCFyZWd1bGF0b3ItPmVuYWJsZWQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogbm90IGluIHVzZSBieSB0aGlzIGNvbnN1bWVyXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQltdXRleF9sb2NrKCZyZWd1bGF0b3ItPnJkZXYtPm11dGV4KTsKLQlyZWd1bGF0b3ItPmVuYWJsZWQgPSAwOwotCXJlZ3VsYXRvci0+dUFfbG9hZCA9IDA7Ci0JcmV0ID0gX3JlZ3VsYXRvcl9kaXNhYmxlKHJlZ3VsYXRvci0+cmRldik7Ci0JbXV0ZXhfdW5sb2NrKCZyZWd1bGF0b3ItPnJkZXYtPm11dGV4KTsKKwltdXRleF9sb2NrKCZyZGV2LT5tdXRleCk7CisJaWYgKHJlZ3VsYXRvci0+ZW5hYmxlZCA9PSAxKSB7CisJCXJldCA9IF9yZWd1bGF0b3JfZGlzYWJsZShyZGV2KTsKKwkJaWYgKHJldCA9PSAwKQorCQkJcmVndWxhdG9yLT51QV9sb2FkID0gMDsKKwl9IGVsc2UgaWYgKFdBUk4ocmVndWxhdG9yLT5lbmFibGVkIDw9IDAsCisJCQkidW5iYWxhbmNlZCBkaXNhYmxlcyBmb3Igc3VwcGx5ICVzXG4iLAorCQkJcmVndWxhdG9yLT5zdXBwbHlfbmFtZSkpCisJCXJldCA9IC1FSU87CisJaWYgKHJldCA9PSAwKQorCQlyZWd1bGF0b3ItPmVuYWJsZWQtLTsKKwltdXRleF91bmxvY2soJnJkZXYtPm11dGV4KTsKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwocmVndWxhdG9yX2Rpc2FibGUpOwpAQCAtMTE5Niw3ICsxMTg5LDEzIEBACiAgKiByZWd1bGF0b3JfaXNfZW5hYmxlZCAtIGlzIHRoZSByZWd1bGF0b3Igb3V0cHV0IGVuYWJsZWQKICAqIEByZWd1bGF0b3I6IHJlZ3VsYXRvciBzb3VyY2UKICAqCi0gKiBSZXR1cm5zIHplcm8gZm9yIGRpc2FibGVkIG90aGVyd2lzZSByZXR1cm4gbnVtYmVyIG9mIGVuYWJsZSByZXF1ZXN0cy4KKyAqIFJldHVybnMgcG9zaXRpdmUgaWYgdGhlIHJlZ3VsYXRvciBkcml2ZXIgYmFja2luZyB0aGUgc291cmNlL2NsaWVudAorICogaGFzIHJlcXVlc3RlZCB0aGF0IHRoZSBkZXZpY2UgYmUgZW5hYmxlZCwgemVybyBpZiBpdCBoYXNuJ3QsIGVsc2UgYQorICogbmVnYXRpdmUgZXJybm8gY29kZS4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIGRldmljZSBiYWNraW5nIHRoaXMgcmVndWxhdG9yIGhhbmRsZSBjYW4gaGF2ZSBtdWx0aXBsZQorICogdXNlcnMsIHNvIGl0IG1pZ2h0IGJlIGVuYWJsZWQgZXZlbiBpZiByZWd1bGF0b3JfZW5hYmxlKCkgd2FzIG5ldmVyCisgKiBjYWxsZWQgZm9yIHRoaXMgcGFydGljdWxhciBzb3VyY2UuCiAgKi8KIGludCByZWd1bGF0b3JfaXNfZW5hYmxlZChzdHJ1Y3QgcmVndWxhdG9yICpyZWd1bGF0b3IpCiB7CkBAIC0xMjE5LDcgKzEyMTgsNyBAQAogICoKICAqIE5PVEU6IElmIHRoZSByZWd1bGF0b3IgaXMgc2hhcmVkIGJldHdlZW4gc2V2ZXJhbCBkZXZpY2VzIHRoZW4gdGhlIGxvd2VzdAogICogcmVxdWVzdCB2b2x0YWdlIHRoYXQgbWVldHMgdGhlIHN5c3RlbSBjb25zdHJhaW50cyB3aWxsIGJlIHVzZWQuCi0gKiBOT1RFOiBSZWd1bGF0b3Igc3lzdGVtIGNvbnN0cmFpbnRzIG11c3QgYmUgc2V0IGZvciB0aGlzIHJlZ3VsYXRvciBiZWZvcmUKKyAqIFJlZ3VsYXRvciBzeXN0ZW0gY29uc3RyYWludHMgbXVzdCBiZSBzZXQgZm9yIHRoaXMgcmVndWxhdG9yIGJlZm9yZQogICogY2FsbGluZyB0aGlzIGZ1bmN0aW9uIG90aGVyd2lzZSB0aGlzIGNhbGwgd2lsbCBmYWlsLgogICovCiBpbnQgcmVndWxhdG9yX3NldF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3IgKnJlZ3VsYXRvciwgaW50IG1pbl91ViwgaW50IG1heF91VikKQEAgLTE0OTMsNyArMTQ5Miw4IEBACiAJbW9kZSA9IHJkZXYtPmRlc2MtPm9wcy0+Z2V0X29wdGltdW1fbW9kZShyZGV2LAogCQkJCQkJIGlucHV0X3VWLCBvdXRwdXRfdVYsCiAJCQkJCQkgdG90YWxfdUFfbG9hZCk7Ci0JaWYgKHJldCA8PSAwKSB7CisJcmV0ID0gcmVndWxhdG9yX2NoZWNrX21vZGUocmRldiwgbW9kZSk7CisJaWYgKHJldCA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIGdldCBvcHRpbXVtIG1vZGUgZm9yICVzIEAiCiAJCQkiICVkIHVBICVkIC0+ICVkIHVWXG4iLCBfX2Z1bmNfXywgcmRldi0+ZGVzYy0+bmFtZSwKIAkJCXRvdGFsX3VBX2xvYWQsIGlucHV0X3VWLCBvdXRwdXRfdVYpOwpAQCAtMTUwMSw3ICsxNTAxLDcgQEAKIAl9CiAKIAlyZXQgPSByZGV2LT5kZXNjLT5vcHMtPnNldF9tb2RlKHJkZXYsIG1vZGUpOwotCWlmIChyZXQgPD0gMCkgeworCWlmIChyZXQgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byBzZXQgb3B0aW11bSBtb2RlICV4IGZvciAlc1xuIiwKIAkJCV9fZnVuY19fLCBtb2RlLCByZGV2LT5kZXNjLT5uYW1lKTsKIAkJZ290byBvdXQ7CkBAIC0xNTE2LDcgKzE1MTYsNyBAQAogLyoqCiAgKiByZWd1bGF0b3JfcmVnaXN0ZXJfbm90aWZpZXIgLSByZWdpc3RlciByZWd1bGF0b3IgZXZlbnQgbm90aWZpZXIKICAqIEByZWd1bGF0b3I6IHJlZ3VsYXRvciBzb3VyY2UKLSAqIEBub3RpZmllcl9ibG9jazogbm90aWZpZXIgYmxvY2sKKyAqIEBuYjogbm90aWZpZXIgYmxvY2sKICAqCiAgKiBSZWdpc3RlciBub3RpZmllciBibG9jayB0byByZWNlaXZlIHJlZ3VsYXRvciBldmVudHMuCiAgKi8KQEAgLTE1MzEsNyArMTUzMSw3IEBACiAvKioKICAqIHJlZ3VsYXRvcl91bnJlZ2lzdGVyX25vdGlmaWVyIC0gdW5yZWdpc3RlciByZWd1bGF0b3IgZXZlbnQgbm90aWZpZXIKICAqIEByZWd1bGF0b3I6IHJlZ3VsYXRvciBzb3VyY2UKLSAqIEBub3RpZmllcl9ibG9jazogbm90aWZpZXIgYmxvY2sKKyAqIEBuYjogbm90aWZpZXIgYmxvY2sKICAqCiAgKiBVbnJlZ2lzdGVyIHJlZ3VsYXRvciBldmVudCBub3RpZmllciBibG9jay4KICAqLwpAQCAtMTY5Nyw5ICsxNjk3LDkgQEAKIAogLyoqCiAgKiByZWd1bGF0b3Jfbm90aWZpZXJfY2FsbF9jaGFpbiAtIGNhbGwgcmVndWxhdG9yIGV2ZW50IG5vdGlmaWVyCi0gKiBAcmVndWxhdG9yOiByZWd1bGF0b3Igc291cmNlCisgKiBAcmRldjogcmVndWxhdG9yIHNvdXJjZQogICogQGV2ZW50OiBub3RpZmllciBibG9jawotICogQGRhdGE6CisgKiBAZGF0YTogY2FsbGJhY2stc3BlY2lmaWMgZGF0YS4KICAqCiAgKiBDYWxsZWQgYnkgcmVndWxhdG9yIGRyaXZlcnMgdG8gbm90aWZ5IGNsaWVudHMgYSByZWd1bGF0b3IgZXZlbnQgaGFzCiAgKiBvY2N1cnJlZC4gV2UgYWxzbyBub3RpZnkgcmVndWxhdG9yIGNsaWVudHMgZG93bnN0cmVhbS4KQEAgLTE3MTMsMTAgKzE3MTMsMTIyIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChyZWd1bGF0b3Jfbm90aWZpZXJfY2FsbF9jaGFpbik7CiAKKy8qCisgKiBUbyBhdm9pZCBjbHV0dGVyaW5nIHN5c2ZzIChhbmQgbWVtb3J5KSB3aXRoIHVzZWxlc3Mgc3RhdGUsIG9ubHkKKyAqIGNyZWF0ZSBhdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIG1lYW5pbmdmdWxseSBkaXNwbGF5ZWQuCisgKi8KK3N0YXRpYyBpbnQgYWRkX3JlZ3VsYXRvcl9hdHRyaWJ1dGVzKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQoreworCXN0cnVjdCBkZXZpY2UJCSpkZXYgPSAmcmRldi0+ZGV2OworCXN0cnVjdCByZWd1bGF0b3Jfb3BzCSpvcHMgPSByZGV2LT5kZXNjLT5vcHM7CisJaW50CQkJc3RhdHVzID0gMDsKKworCS8qIHNvbWUgYXR0cmlidXRlcyBuZWVkIHNwZWNpZmljIG1ldGhvZHMgdG8gYmUgZGlzcGxheWVkICovCisJaWYgKG9wcy0+Z2V0X3ZvbHRhZ2UpIHsKKwkJc3RhdHVzID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX21pY3Jvdm9sdHMpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCXJldHVybiBzdGF0dXM7CisJfQorCWlmIChvcHMtPmdldF9jdXJyZW50X2xpbWl0KSB7CisJCXN0YXR1cyA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9taWNyb2FtcHMpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCXJldHVybiBzdGF0dXM7CisJfQorCWlmIChvcHMtPmdldF9tb2RlKSB7CisJCXN0YXR1cyA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9vcG1vZGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCXJldHVybiBzdGF0dXM7CisJfQorCWlmIChvcHMtPmlzX2VuYWJsZWQpIHsKKwkJc3RhdHVzID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3N0YXRlKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlyZXR1cm4gc3RhdHVzOworCX0KKworCS8qIHNvbWUgYXR0cmlidXRlcyBhcmUgdHlwZS1zcGVjaWZpYyAqLworCWlmIChyZGV2LT5kZXNjLT50eXBlID09IFJFR1VMQVRPUl9DVVJSRU5UKSB7CisJCXN0YXR1cyA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9yZXF1ZXN0ZWRfbWljcm9hbXBzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlyZXR1cm4gc3RhdHVzOworCX0KKworCS8qIGFsbCB0aGUgb3RoZXIgYXR0cmlidXRlcyBleGlzdCB0byBzdXBwb3J0IGNvbnN0cmFpbnRzOworCSAqIGRvbid0IHNob3cgdGhlbSBpZiB0aGVyZSBhcmUgbm8gY29uc3RyYWludHMsIG9yIGlmIHRoZQorCSAqIHJlbGV2YW50IHN1cHBvcnRpbmcgbWV0aG9kcyBhcmUgbWlzc2luZy4KKwkgKi8KKwlpZiAoIXJkZXYtPmNvbnN0cmFpbnRzKQorCQlyZXR1cm4gc3RhdHVzOworCisJLyogY29uc3RyYWludHMgbmVlZCBzcGVjaWZpYyBzdXBwb3J0aW5nIG1ldGhvZHMgKi8KKwlpZiAob3BzLT5zZXRfdm9sdGFnZSkgeworCQlzdGF0dXMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfbWluX21pY3Jvdm9sdHMpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCXJldHVybiBzdGF0dXM7CisJCXN0YXR1cyA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9tYXhfbWljcm92b2x0cyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJcmV0dXJuIHN0YXR1czsKKwl9CisJaWYgKG9wcy0+c2V0X2N1cnJlbnRfbGltaXQpIHsKKwkJc3RhdHVzID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX21pbl9taWNyb2FtcHMpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCXJldHVybiBzdGF0dXM7CisJCXN0YXR1cyA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9tYXhfbWljcm9hbXBzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlyZXR1cm4gc3RhdHVzOworCX0KKworCS8qIHN1c3BlbmQgbW9kZSBjb25zdHJhaW50cyBuZWVkIG11bHRpcGxlIHN1cHBvcnRpbmcgbWV0aG9kcyAqLworCWlmICghKG9wcy0+c2V0X3N1c3BlbmRfZW5hYmxlICYmIG9wcy0+c2V0X3N1c3BlbmRfZGlzYWJsZSkpCisJCXJldHVybiBzdGF0dXM7CisKKwlzdGF0dXMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfc3VzcGVuZF9zdGFuZGJ5X3N0YXRlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKwlzdGF0dXMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfc3VzcGVuZF9tZW1fc3RhdGUpOworCWlmIChzdGF0dXMgPCAwKQorCQlyZXR1cm4gc3RhdHVzOworCXN0YXR1cyA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9zdXNwZW5kX2Rpc2tfc3RhdGUpOworCWlmIChzdGF0dXMgPCAwKQorCQlyZXR1cm4gc3RhdHVzOworCisJaWYgKG9wcy0+c2V0X3N1c3BlbmRfdm9sdGFnZSkgeworCQlzdGF0dXMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LAorCQkJCSZkZXZfYXR0cl9zdXNwZW5kX3N0YW5kYnlfbWljcm92b2x0cyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJcmV0dXJuIHN0YXR1czsKKwkJc3RhdHVzID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKKwkJCQkmZGV2X2F0dHJfc3VzcGVuZF9tZW1fbWljcm92b2x0cyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJcmV0dXJuIHN0YXR1czsKKwkJc3RhdHVzID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKKwkJCQkmZGV2X2F0dHJfc3VzcGVuZF9kaXNrX21pY3Jvdm9sdHMpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCXJldHVybiBzdGF0dXM7CisJfQorCisJaWYgKG9wcy0+c2V0X3N1c3BlbmRfbW9kZSkgeworCQlzdGF0dXMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LAorCQkJCSZkZXZfYXR0cl9zdXNwZW5kX3N0YW5kYnlfbW9kZSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJcmV0dXJuIHN0YXR1czsKKwkJc3RhdHVzID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKKwkJCQkmZGV2X2F0dHJfc3VzcGVuZF9tZW1fbW9kZSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJcmV0dXJuIHN0YXR1czsKKwkJc3RhdHVzID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKKwkJCQkmZGV2X2F0dHJfc3VzcGVuZF9kaXNrX21vZGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCXJldHVybiBzdGF0dXM7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKwogLyoqCiAgKiByZWd1bGF0b3JfcmVnaXN0ZXIgLSByZWdpc3RlciByZWd1bGF0b3IKLSAqIEByZWd1bGF0b3I6IHJlZ3VsYXRvciBzb3VyY2UKLSAqIEByZWdfZGF0YTogcHJpdmF0ZSByZWd1bGF0b3IgZGF0YQorICogQHJlZ3VsYXRvcl9kZXNjOiByZWd1bGF0b3IgdG8gcmVnaXN0ZXIKKyAqIEBkZXY6IHN0cnVjdCBkZXZpY2UgZm9yIHRoZSByZWd1bGF0b3IKKyAqIEBkcml2ZXJfZGF0YTogcHJpdmF0ZSByZWd1bGF0b3IgZGF0YQogICoKICAqIENhbGxlZCBieSByZWd1bGF0b3IgZHJpdmVycyB0byByZWdpc3RlciBhIHJlZ3VsYXRvci4KICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgpAQCAtMTc2MSw0NSArMTg3MywzNyBAQAogCS8qIHByZWZvcm0gYW55IHJlZ3VsYXRvciBzcGVjaWZpYyBpbml0ICovCiAJaWYgKGluaXRfZGF0YS0+cmVndWxhdG9yX2luaXQpIHsKIAkJcmV0ID0gaW5pdF9kYXRhLT5yZWd1bGF0b3JfaW5pdChyZGV2LT5yZWdfZGF0YSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlrZnJlZShyZGV2KTsKLQkJCXJkZXYgPSBFUlJfUFRSKHJldCk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQotCS8qIHNldCByZWd1bGF0b3IgY29uc3RyYWludHMgKi8KLQlyZXQgPSBzZXRfbWFjaGluZV9jb25zdHJhaW50cyhyZGV2LCAmaW5pdF9kYXRhLT5jb25zdHJhaW50cyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJa2ZyZWUocmRldik7Ci0JCXJkZXYgPSBFUlJfUFRSKHJldCk7Ci0JCWdvdG8gb3V0OworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gY2xlYW47CiAJfQogCiAJLyogcmVnaXN0ZXIgd2l0aCBzeXNmcyAqLwogCXJkZXYtPmRldi5jbGFzcyA9ICZyZWd1bGF0b3JfY2xhc3M7CiAJcmRldi0+ZGV2LnBhcmVudCA9IGRldjsKLQlzbnByaW50ZihyZGV2LT5kZXYuYnVzX2lkLCBzaXplb2YocmRldi0+ZGV2LmJ1c19pZCksCi0JCSAicmVndWxhdG9yLiVkIiwgYXRvbWljX2luY19yZXR1cm4oJnJlZ3VsYXRvcl9ubykgLSAxKTsKKwlkZXZfc2V0X25hbWUoJnJkZXYtPmRldiwgInJlZ3VsYXRvci4lZCIsCisJCSAgICAgYXRvbWljX2luY19yZXR1cm4oJnJlZ3VsYXRvcl9ubykgLSAxKTsKIAlyZXQgPSBkZXZpY2VfcmVnaXN0ZXIoJnJkZXYtPmRldik7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWtmcmVlKHJkZXYpOwotCQlyZGV2ID0gRVJSX1BUUihyZXQpOwotCQlnb3RvIG91dDsKLQl9CisJaWYgKHJldCAhPSAwKQorCQlnb3RvIGNsZWFuOwogCiAJZGV2X3NldF9kcnZkYXRhKCZyZGV2LT5kZXYsIHJkZXYpOwogCisJLyogc2V0IHJlZ3VsYXRvciBjb25zdHJhaW50cyAqLworCXJldCA9IHNldF9tYWNoaW5lX2NvbnN0cmFpbnRzKHJkZXYsICZpbml0X2RhdGEtPmNvbnN0cmFpbnRzKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBzY3J1YjsKKworCS8qIGFkZCBhdHRyaWJ1dGVzIHN1cHBvcnRlZCBieSB0aGlzIHJlZ3VsYXRvciAqLworCXJldCA9IGFkZF9yZWd1bGF0b3JfYXR0cmlidXRlcyhyZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBzY3J1YjsKKwogCS8qIHNldCBzdXBwbHkgcmVndWxhdG9yIGlmIGl0IGV4aXN0cyAqLwogCWlmIChpbml0X2RhdGEtPnN1cHBseV9yZWd1bGF0b3JfZGV2KSB7CiAJCXJldCA9IHNldF9zdXBwbHkocmRldiwKIAkJCWRldl9nZXRfZHJ2ZGF0YShpbml0X2RhdGEtPnN1cHBseV9yZWd1bGF0b3JfZGV2KSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZpY2VfdW5yZWdpc3RlcigmcmRldi0+ZGV2KTsKLQkJCWtmcmVlKHJkZXYpOwotCQkJcmRldiA9IEVSUl9QVFIocmV0KTsKLQkJCWdvdG8gb3V0OwotCQl9CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBzY3J1YjsKIAl9CiAKIAkvKiBhZGQgY29uc3VtZXJzIGRldmljZXMgKi8KQEAgLTE4MTEsMTAgKzE5MTUsNyBAQAogCQkJZm9yICgtLWk7IGkgPj0gMDsgaS0tKQogCQkJCXVuc2V0X2NvbnN1bWVyX2RldmljZV9zdXBwbHkocmRldiwKIAkJCQkJaW5pdF9kYXRhLT5jb25zdW1lcl9zdXBwbGllc1tpXS5kZXYpOwotCQkJZGV2aWNlX3VucmVnaXN0ZXIoJnJkZXYtPmRldik7Ci0JCQlrZnJlZShyZGV2KTsKLQkJCXJkZXYgPSBFUlJfUFRSKHJldCk7Ci0JCQlnb3RvIG91dDsKKwkJCWdvdG8gc2NydWI7CiAJCX0KIAl9CiAKQEAgLTE4MjIsMTIgKzE5MjMsMTkgQEAKIG91dDoKIAltdXRleF91bmxvY2soJnJlZ3VsYXRvcl9saXN0X211dGV4KTsKIAlyZXR1cm4gcmRldjsKKworc2NydWI6CisJZGV2aWNlX3VucmVnaXN0ZXIoJnJkZXYtPmRldik7CitjbGVhbjoKKwlrZnJlZShyZGV2KTsKKwlyZGV2ID0gRVJSX1BUUihyZXQpOworCWdvdG8gb3V0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwocmVndWxhdG9yX3JlZ2lzdGVyKTsKIAogLyoqCiAgKiByZWd1bGF0b3JfdW5yZWdpc3RlciAtIHVucmVnaXN0ZXIgcmVndWxhdG9yCi0gKiBAcmVndWxhdG9yOiByZWd1bGF0b3Igc291cmNlCisgKiBAcmRldjogcmVndWxhdG9yIHRvIHVucmVnaXN0ZXIKICAqCiAgKiBDYWxsZWQgYnkgcmVndWxhdG9yIGRyaXZlcnMgdG8gdW5yZWdpc3RlciBhIHJlZ3VsYXRvci4KICAqLwpAQCAtMTg0Niw3ICsxOTU0LDcgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHJlZ3VsYXRvcl91bnJlZ2lzdGVyKTsKIAogLyoqCi0gKiByZWd1bGF0b3Jfc3VzcGVuZF9wcmVwYXJlOiBwcmVwYXJlIHJlZ3VsYXRvcnMgZm9yIHN5c3RlbSB3aWRlIHN1c3BlbmQKKyAqIHJlZ3VsYXRvcl9zdXNwZW5kX3ByZXBhcmUgLSBwcmVwYXJlIHJlZ3VsYXRvcnMgZm9yIHN5c3RlbSB3aWRlIHN1c3BlbmQKICAqIEBzdGF0ZTogc3lzdGVtIHN1c3BlbmQgc3RhdGUKICAqCiAgKiBDb25maWd1cmUgZWFjaCByZWd1bGF0b3Igd2l0aCBpdCdzIHN1c3BlbmQgb3BlcmF0aW5nIHBhcmFtZXRlcnMgZm9yIHN0YXRlLgpAQCAtMTg4Miw3ICsxOTkwLDcgQEAKIAogLyoqCiAgKiByZGV2X2dldF9kcnZkYXRhIC0gZ2V0IHJkZXYgcmVndWxhdG9yIGRyaXZlciBkYXRhCi0gKiBAcmVndWxhdG9yOiByZWd1bGF0b3IKKyAqIEByZGV2OiByZWd1bGF0b3IKICAqCiAgKiBHZXQgcmRldiByZWd1bGF0b3IgZHJpdmVyIHByaXZhdGUgZGF0YS4gVGhpcyBjYWxsIGNhbiBiZSB1c2VkIGluIHRoZQogICogcmVndWxhdG9yIGRyaXZlciBjb250ZXh0LgpAQCAtMTkxOSw3ICsyMDI3LDcgQEAKIAogLyoqCiAgKiByZWd1bGF0b3JfZ2V0X2lkIC0gZ2V0IHJlZ3VsYXRvciBJRAotICogQHJlZ3VsYXRvcjogcmVndWxhdG9yCisgKiBAcmRldjogcmVndWxhdG9yCiAgKi8KIGludCByZGV2X2dldF9pZChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2RhOTAzeC5jIGIvZHJpdmVycy9yZWd1bGF0b3IvZGE5MDN4LmMKaW5kZXggNzczYjI5Yy4uZmU3NzczMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvZGE5MDN4LmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvZGE5MDN4LmMKQEAgLTEwMiw3ICsxMDIsNyBAQAogCXVpbnQ4X3QgdmFsLCBtYXNrOwogCiAJaWYgKGNoZWNrX3JhbmdlKGluZm8sIG1pbl91ViwgbWF4X3VWKSkgewotCQlwcl9lcnIoImludmFsaWQgdm9sdGFnZSByYW5nZSAoJWQsICVkKSB1ViIsIG1pbl91ViwgbWF4X3VWKTsKKwkJcHJfZXJyKCJpbnZhbGlkIHZvbHRhZ2UgcmFuZ2UgKCVkLCAlZCkgdVZcbiIsIG1pbl91ViwgbWF4X3VWKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xNTksNyArMTU5LDcgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JcmV0dXJuIHJlZ192YWwgJiAoMSA8PCBpbmZvLT5lbmFibGVfYml0KTsKKwlyZXR1cm4gISEocmVnX3ZhbCAmICgxIDw8IGluZm8tPmVuYWJsZV9iaXQpKTsKIH0KIAogLyogREE5MDMwIHNwZWNpZmljIG9wZXJhdGlvbnMgKi8KQEAgLTE3Miw3ICsxNzIsNyBAQAogCWludCByZXQ7CiAKIAlpZiAoY2hlY2tfcmFuZ2UoaW5mbywgbWluX3VWLCBtYXhfdVYpKSB7Ci0JCXByX2VycigiaW52YWxpZCB2b2x0YWdlIHJhbmdlICglZCwgJWQpIHVWIiwgbWluX3VWLCBtYXhfdVYpOworCQlwcl9lcnIoImludmFsaWQgdm9sdGFnZSByYW5nZSAoJWQsICVkKSB1VlxuIiwgbWluX3VWLCBtYXhfdVYpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTE5OSw3ICsxOTksNyBAQAogCWludCB0aHJlc2g7CiAKIAlpZiAoY2hlY2tfcmFuZ2UoaW5mbywgbWluX3VWLCBtYXhfdVYpKSB7Ci0JCXByX2VycigiaW52YWxpZCB2b2x0YWdlIHJhbmdlICglZCwgJWQpIHVWIiwgbWluX3VWLCBtYXhfdVYpOworCQlwcl9lcnIoImludmFsaWQgdm9sdGFnZSByYW5nZSAoJWQsICVkKSB1VlxuIiwgbWluX3VWLCBtYXhfdVYpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTI0OCw3ICsyNDgsNyBAQAogCWludCByZXQ7CiAKIAlpZiAoY2hlY2tfcmFuZ2UoaW5mbywgbWluX3VWLCBtYXhfdVYpKSB7Ci0JCXByX2VycigiaW52YWxpZCB2b2x0YWdlIHJhbmdlICglZCwgJWQpIHVWIiwgbWluX3VWLCBtYXhfdVYpOworCQlwcl9lcnIoImludmFsaWQgdm9sdGFnZSByYW5nZSAoJWQsICVkKSB1VlxuIiwgbWluX3VWLCBtYXhfdVYpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTI3Myw3ICsyNzMsNyBAQAogCXVpbnQ4X3QgdmFsLCBtYXNrOwogCiAJaWYgKGNoZWNrX3JhbmdlKGluZm8sIG1pbl91ViwgbWF4X3VWKSkgewotCQlwcl9lcnIoImludmFsaWQgdm9sdGFnZSByYW5nZSAoJWQsICVkKSB1ViIsIG1pbl91ViwgbWF4X3VWKTsKKwkJcHJfZXJyKCJpbnZhbGlkIHZvbHRhZ2UgcmFuZ2UgKCVkLCAlZCkgdVZcbiIsIG1pbl91ViwgbWF4X3VWKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci93bTgzNTAtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci93bTgzNTAtcmVndWxhdG9yLmMKaW5kZXggMWY0NGIxNy4uYzY4YzQ5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3Ivd204MzUwLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3dtODM1MC1yZWd1bGF0b3IuYwpAQCAtMTM4MCw2ICsxMzgwLDEzIEBACiAJaWYgKHdtODM1MC0+cG1pYy5wZGV2W3JlZ10pCiAJCXJldHVybiAtRUJVU1k7CiAKKwlpZiAocmVnID49IFdNODM1MF9EQ0RDXzEgJiYgcmVnIDw9IFdNODM1MF9EQ0RDXzYgJiYKKwkgICAgcmVnID4gd204MzUwLT5wbWljLm1heF9kY2RjKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAocmVnID49IFdNODM1MF9JU0lOS19BICYmIHJlZyA8PSBXTTgzNTBfSVNJTktfQiAmJgorCSAgICByZWcgPiB3bTgzNTAtPnBtaWMubWF4X2lzaW5rKQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoIndtODM1MC1yZWd1bGF0b3IiLCByZWcpOwogCWlmICghcGRldikKIAkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9LY29uZmlnIGIvZHJpdmVycy9ydGMvS2NvbmZpZwppbmRleCAxNjVhODE4Li40YWQ4MzFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9LY29uZmlnCisrKyBiL2RyaXZlcnMvcnRjL0tjb25maWcKQEAgLTM1LDggKzM1LDggQEAKIAlkZWZhdWx0ICJydGMwIgogCWhlbHAKIAkgIFRoZSBSVEMgZGV2aWNlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIChyZSlpbml0aWFsaXplIHRoZSBzeXN0ZW0KLQkgIGNsb2NrLCB1c3VhbGx5IHJ0YzAuICBJbml0aWFsaXphdGlvbiBpcyBkb25lIHdoZW4gdGhlIHN5c3RlbQotCSAgc3RhcnRzIHVwLCBhbmQgd2hlbiBpdCByZXN1bWVzIGZyb20gYSBsb3cgcG93ZXIgc3RhdGUuICBUaGlzCisJICBjbG9jaywgdXN1YWxseSBydGMwLiBJbml0aWFsaXphdGlvbiBpcyBkb25lIHdoZW4gdGhlIHN5c3RlbQorCSAgc3RhcnRzIHVwLCBhbmQgd2hlbiBpdCByZXN1bWVzIGZyb20gYSBsb3cgcG93ZXIgc3RhdGUuIFRoaXMKIAkgIGRldmljZSBzaG91bGQgcmVjb3JkIHRpbWUgaW4gVVRDLCBzaW5jZSB0aGUga2VybmVsIHdvbid0IGRvCiAJICB0aW1lem9uZSBjb3JyZWN0aW9uLgogCkBAIC00NCw3ICs0NCw3IEBACiAJICBmdW5jdGlvbnMgcnVuLCBzbyBpdCBtdXN0IHVzdWFsbHkgYmUgc3RhdGljYWxseSBsaW5rZWQuCiAKIAkgIFRoaXMgY2xvY2sgc2hvdWxkIGJlIGJhdHRlcnktYmFja2VkLCBzbyB0aGF0IGl0IHJlYWRzIHRoZSBjb3JyZWN0Ci0JICB0aW1lIHdoZW4gdGhlIHN5c3RlbSBib290cyBmcm9tIGEgcG93ZXItb2ZmIHN0YXRlLiAgT3RoZXJ3aXNlLCB5b3VyCisJICB0aW1lIHdoZW4gdGhlIHN5c3RlbSBib290cyBmcm9tIGEgcG93ZXItb2ZmIHN0YXRlLiBPdGhlcndpc2UsIHlvdXIKIAkgIHN5c3RlbSB3aWxsIG5lZWQgYW4gZXh0ZXJuYWwgY2xvY2sgc291cmNlIChsaWtlIGFuIE5UUCBzZXJ2ZXIpLgogCiAJICBJZiB0aGUgY2xvY2sgeW91IHNwZWNpZnkgaGVyZSBpcyBub3QgYmF0dGVyeSBiYWNrZWQsIGl0IG1heSBzdGlsbApAQCAtNjksOCArNjksNyBAQAogCSAgU2F5IHllcyBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSB5b3VyIFJUQ3MgdXNpbmcgc3lzZnMgaW50ZXJmYWNlcywKIAkgIC9zeXMvY2xhc3MvcnRjL3J0YzAgdGhyb3VnaCAvc3lzLy4uLi9ydGNOLgogCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1zeXNmcy4KKwkgIElmIHVuc3VyZSwgc2F5IFkuCiAKIGNvbmZpZyBSVENfSU5URl9QUk9DCiAJYm9vbGVhbiAiL3Byb2MvZHJpdmVyL3J0YyAocHJvY2ZzIGZvciBydGMwKSIKQEAgLTc4LDExICs3NywxMCBAQAogCWRlZmF1bHQgUlRDX0NMQVNTCiAJaGVscAogCSAgU2F5IHllcyBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSB5b3VyIGZpcnN0IFJUQyB0aHJvdWdoIHRoZSBwcm9jCi0JICBpbnRlcmZhY2UsIC9wcm9jL2RyaXZlci9ydGMuICBPdGhlciBSVENzIHdpbGwgbm90IGJlIGF2YWlsYWJsZQorCSAgaW50ZXJmYWNlLCAvcHJvYy9kcml2ZXIvcnRjLiBPdGhlciBSVENzIHdpbGwgbm90IGJlIGF2YWlsYWJsZQogCSAgdGhyb3VnaCB0aGF0IEFQSS4KIAotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBydGMtcHJvYy4KKwkgIElmIHVuc3VyZSwgc2F5IFkuCiAKIGNvbmZpZyBSVENfSU5URl9ERVYKIAlib29sZWFuICIvZGV2L3J0Y04gKGNoYXJhY3RlciBkZXZpY2VzKSIKQEAgLTkwLDEyICs4OCwxNCBAQAogCWhlbHAKIAkgIFNheSB5ZXMgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgeW91ciBSVENzIHVzaW5nIHRoZSAvZGV2CiAJICBpbnRlcmZhY2VzLCB3aGljaCAidWRldiIgc2V0cyB1cCBhcyAvZGV2L3J0YzAgdGhyb3VnaAotCSAgL2Rldi9ydGNOLiAgWW91IG1heSB3YW50IHRvIHNldCB1cCBhIHN5bWJvbGljIGxpbmsgc28gb25lCi0JICBvZiB0aGVzZSBjYW4gYmUgYWNjZXNzZWQgYXMgL2Rldi9ydGMsIHdoaWNoIGlzIGEgbmFtZQotCSAgZXhwZWN0ZWQgYnkgImh3Y2xvY2siIGFuZCBzb21lIG90aGVyIHByb2dyYW1zLgorCSAgL2Rldi9ydGNOLgogCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1kZXYuCisJICBZb3UgbWF5IHdhbnQgdG8gc2V0IHVwIGEgc3ltYm9saWMgbGluayBzbyBvbmUgb2YgdGhlc2UKKwkgIGNhbiBiZSBhY2Nlc3NlZCBhcyAvZGV2L3J0Yywgd2hpY2ggaXMgYSBuYW1lCisJICBleHBlY3RlZCBieSAiaHdjbG9jayIgYW5kIHNvbWUgb3RoZXIgcHJvZ3JhbXMuIFJlY2VudAorCSAgdmVyc2lvbnMgb2YgInVkZXYiIGFyZSBrbm93biB0byBzZXQgdXAgdGhlIHN5bWxpbmsgZm9yIHlvdS4KKworCSAgSWYgdW5zdXJlLCBzYXkgWS4KIAogY29uZmlnIFJUQ19JTlRGX0RFVl9VSUVfRU1VTAogCWJvb2wgIlJUQyBVSUUgZW11bGF0aW9uIG9uIGRldiBpbnRlcmZhY2UiCkBAIC0xMzIsMTQgKzEzMiwxNCBAQAogCXRyaXN0YXRlICJEYWxsYXMvTWF4aW0gRFMxMzA3LzM3LzM4LzM5LzQwLCBTVCBNNDFUMDAiCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHZhcmlvdXMgY29tcGF0aWJsZSBSVEMKLQkgIGNoaXBzIChvZnRlbiB3aXRoIGJhdHRlcnkgYmFja3VwKSBjb25uZWN0ZWQgd2l0aCBJMkMuICBUaGlzIGRyaXZlcgorCSAgY2hpcHMgKG9mdGVuIHdpdGggYmF0dGVyeSBiYWNrdXApIGNvbm5lY3RlZCB3aXRoIEkyQy4gVGhpcyBkcml2ZXIKIAkgIHNob3VsZCBoYW5kbGUgRFMxMzA3LCBEUzEzMzcsIERTMTMzOCwgRFMxMzM5LCBEUzEzNDAsIFNUIE00MVQwMCwKLQkgIGFuZCBwcm9iYWJseSBvdGhlciBjaGlwcy4gIEluIHNvbWUgY2FzZXMgdGhlIFJUQyBtdXN0IGFscmVhZHkKKwkgIGFuZCBwcm9iYWJseSBvdGhlciBjaGlwcy4gSW4gc29tZSBjYXNlcyB0aGUgUlRDIG11c3QgYWxyZWFkeQogCSAgaGF2ZSBiZWVuIGluaXRpYWxpemVkIChieSBtYW51ZmFjdHVyaW5nIG9yIGEgYm9vdGxvYWRlcikuCiAKIAkgIFRoZSBmaXJzdCBzZXZlbiByZWdpc3RlcnMgb24gdGhlc2UgY2hpcHMgaG9sZCBhbiBSVEMsIGFuZCBvdGhlcgogCSAgcmVnaXN0ZXJzIG1heSBhZGQgZmVhdHVyZXMgc3VjaCBhcyBOVlJBTSwgYSB0cmlja2xlIGNoYXJnZXIgZm9yCi0JICB0aGUgUlRDL05WUkFNIGJhY2t1cCBwb3dlciwgYW5kIGFsYXJtcy4gIE5WUkFNIGlzIHZpc2libGUgaW4KKwkgIHRoZSBSVEMvTlZSQU0gYmFja3VwIHBvd2VyLCBhbmQgYWxhcm1zLiBOVlJBTSBpcyB2aXNpYmxlIGluCiAJICBzeXNmcywgYnV0IG90aGVyIGNoaXAgZmVhdHVyZXMgbWF5IG5vdCBiZSBhdmFpbGFibGUuCiAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQpAQCAtMTUwLDEwICsxNTAsMTAgQEAKIAlkZXBlbmRzIG9uIFJUQ19DTEFTUyAmJiBJMkMKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgRGFsbGFzIFNlbWljb25kdWN0b3IKLQkgIERTMTM3NCByZWFsLXRpbWUgY2xvY2sgY2hpcHMuICBJZiBhbiBpbnRlcnJ1cHQgaXMgYXNzb2NpYXRlZAorCSAgRFMxMzc0IHJlYWwtdGltZSBjbG9jayBjaGlwcy4gSWYgYW4gaW50ZXJydXB0IGlzIGFzc29jaWF0ZWQKIAkgIHdpdGggdGhlIGRldmljZSwgdGhlIGFsYXJtIGZ1bmN0aW9uYWxpdHkgaXMgc3VwcG9ydGVkLgogCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1kczEzNzQuCiAKIGNvbmZpZyBSVENfRFJWX0RTMTY3MgpAQCAtMjQ3LDcgKzI0Nyw3IEBACiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBSVEMgb24gdGhlCiAJICBUV0w5MjMzMCAiTWVuZWxhdXMiIHBvd2VyIG1hbmFnZW1lbnQgY2hpcCwgdXNlZCB3aXRoIE9NQVAyCi0JICBwbGF0Zm9ybXMuICBUaGUgc3VwcG9ydCBpcyBpbnRlZ3JhdGVkIHdpdGggdGhlIHJlc3Qgb2YKKwkgIHBsYXRmb3Jtcy4gVGhlIHN1cHBvcnQgaXMgaW50ZWdyYXRlZCB3aXRoIHRoZSByZXN0IG9mCiAJICB0aGUgTWVuZWxhdXMgZHJpdmVyOyBpdCdzIG5vdCBzZXBhcmF0ZSBtb2R1bGUuCiAKIGNvbmZpZyBSVENfRFJWX1RXTDQwMzAKQEAgLTMwOCw3ICszMDgsNyBAQAogCXRyaXN0YXRlICJEYWxsYXMvTWF4aW0gRFMxMzA1L0RTMTMwNiIKIAloZWxwCiAJICBTZWxlY3QgdGhpcyBkcml2ZXIgdG8gZ2V0IHN1cHBvcnQgZm9yIHRoZSBEYWxsYXMvTWF4aW0gRFMxMzA1Ci0JICBhbmQgRFMxMzA2IHJlYWwgdGltZSBjbG9jayBjaGlwcy4gIFRoZXNlIHN1cHBvcnQgYSB0cmlja2xlCisJICBhbmQgRFMxMzA2IHJlYWwgdGltZSBjbG9jayBjaGlwcy4gVGhlc2Ugc3VwcG9ydCBhIHRyaWNrbGUKIAkgIGNoYXJnZXIsIGFsYXJtcywgYW5kIE5WUkFNIGluIGFkZGl0aW9uIHRvIHRoZSBjbG9jay4KIAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCkBAIC0zMTcsNyArMzE3LDggQEAKIGNvbmZpZyBSVENfRFJWX0RTMTM5MAogCXRyaXN0YXRlICJEYWxsYXMvTWF4aW0gRFMxMzkwLzkzLzk0IgogCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgRFMxMzkwLzkzLzk0IGNoaXBzLgorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZQorCSAgRGFsbGFzL01heGltIERTMTM5MC85My85NCBjaGlwcy4KIAogCSAgVGhpcyBkcml2ZXIgb25seSBzdXBwb3J0cyB0aGUgUlRDIGZlYXR1cmUsIGFuZCBub3Qgb3RoZXIgY2hpcAogCSAgZmVhdHVyZXMgc3VjaCBhcyBhbGFybXMgYW5kIHRyaWNrbGUgY2hhcmdpbmcuCkBAIC0zODEsNyArMzgyLDcgQEAKIAkgIG9yIExQQyBidXMgY2hpcHMsIGFuZCBzbyBvbi4KIAogCSAgWW91ciBzeXN0ZW0gd2lsbCBuZWVkIHRvIGRlZmluZSB0aGUgcGxhdGZvcm0gZGV2aWNlIHVzZWQgYnkKLQkgIHRoaXMgZHJpdmVyLCBvdGhlcndpc2UgaXQgd29uJ3QgYmUgYWNjZXNzaWJsZS4gIFRoaXMgbWVhbnMKKwkgIHRoaXMgZHJpdmVyLCBvdGhlcndpc2UgaXQgd29uJ3QgYmUgYWNjZXNzaWJsZS4gVGhpcyBtZWFucwogCSAgeW91IGNhbiBzYWZlbHkgZW5hYmxlIHRoaXMgZHJpdmVyIGlmIHlvdSBkb24ndCBrbm93IHdoZXRoZXIKIAkgIG9yIG5vdCB5b3VyIGJvYXJkIGhhcyB0aGlzIGtpbmQgb2YgaGFyZHdhcmUuCiAKQEAgLTU5OCw3ICs1OTksNyBAQAogCWRlcGVuZHMgb24gQVJDSF9BVDkxUk05MjAwIHx8IEFSQ0hfQVQ5MVNBTTlSTAogCWhlbHAKIAkgIERyaXZlciBmb3IgdGhlIGludGVybmFsIFJUQyAoUmVhbHRpbWUgQ2xvY2spIG1vZHVsZSBmb3VuZCBvbgotCSAgQXRtZWwgQVQ5MVJNOTIwMCdzIGFuZCBBVDkxU0FNOVJMIGNoaXBzLiAgT24gU0FNOVJMIGNoaXBzCisJICBBdG1lbCBBVDkxUk05MjAwJ3MgYW5kIEFUOTFTQU05UkwgY2hpcHMuIE9uIFNBTTlSTCBjaGlwcwogCSAgdGhpcyBpcyBwb3dlcmVkIGJ5IHRoZSBiYWNrdXAgcG93ZXIgc3VwcGx5LgogCiBjb25maWcgUlRDX0RSVl9BVDkxU0FNOQpAQCAtNjIwLDggKzYyMSw4IEBACiAJcHJvbXB0ICJSVFQgbW9kdWxlIE51bWJlciIgaWYgQVJDSF9BVDkxU0FNOTI2MwogCWRlcGVuZHMgb24gUlRDX0RSVl9BVDkxU0FNOQogCWhlbHAKLQkgIE1vcmUgdGhhbiBvbmUgUlRUIG1vZHVsZSBpcyBhdmFpbGFibGUuICBZb3UgY2FuIGNob29zZSB3aGljaAotCSAgb25lIHdpbGwgYmUgdXNlZCBhcyBhbiBSVEMuICBUaGUgZGVmYXVsdCBvZiB6ZXJvIGlzIG5vcm1hbGx5CisJICBNb3JlIHRoYW4gb25lIFJUVCBtb2R1bGUgaXMgYXZhaWxhYmxlLiBZb3UgY2FuIGNob29zZSB3aGljaAorCSAgb25lIHdpbGwgYmUgdXNlZCBhcyBhbiBSVEMuIFRoZSBkZWZhdWx0IG9mIHplcm8gaXMgbm9ybWFsbHkKIAkgIE9LIHRvIHVzZSwgdGhvdWdoIHNvbWUgc3lzdGVtcyB1c2UgdGhhdCBmb3Igbm9uLVJUQyBwdXJwb3Nlcy4KIAogY29uZmlnIFJUQ19EUlZfQVQ5MVNBTTlfR1BCUgpAQCAtNjMzLDEwICs2MzQsMjAgQEAKIAlkZXBlbmRzIG9uIFJUQ19EUlZfQVQ5MVNBTTkKIAloZWxwCiAJICBUaGUgUlRDIGRyaXZlciBuZWVkcyB0byB1c2Ugb25lIG9mIHRoZSBHZW5lcmFsIFB1cnBvc2UgQmFja3VwCi0JICBSZWdpc3RlcnMgKEdQQlJzKSBhcyB3ZWxsIGFzIHRoZSBSVFQuICBZb3UgY2FuIGNob29zZSB3aGljaCBvbmUKLQkgIHdpbGwgYmUgdXNlZC4gIFRoZSBkZWZhdWx0IG9mIHplcm8gaXMgbm9ybWFsbHkgT0sgdG8gdXNlLCBidXQKKwkgIFJlZ2lzdGVycyAoR1BCUnMpIGFzIHdlbGwgYXMgdGhlIFJUVC4gWW91IGNhbiBjaG9vc2Ugd2hpY2ggb25lCisJICB3aWxsIGJlIHVzZWQuIFRoZSBkZWZhdWx0IG9mIHplcm8gaXMgbm9ybWFsbHkgT0sgdG8gdXNlLCBidXQKIAkgIG9uIHNvbWUgc3lzdGVtcyBvdGhlciBzb2Z0d2FyZSBuZWVkcyB0byB1c2UgdGhhdCByZWdpc3Rlci4KIAorY29uZmlnIFJUQ19EUlZfQVUxWFhYCisJdHJpc3RhdGUgIkF1MXh4eCBDb3VudGVyMCBSVEMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNPQ19BVTFYMDAKKwloZWxwCisJICBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgQXUxeHh4IG9uLWNoaXAgQ291bnRlcjAgKFRpbWUtT2YtWWVhcgorCSAgY291bnRlcikgdG8gYmUgdXNlZCBhcyBhIFJUQy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBydGMtYXUxeHh4LgorCiBjb25maWcgUlRDX0RSVl9CRklOCiAJdHJpc3RhdGUgIkJsYWNrZmluIE9uLUNoaXAgUlRDIgogCWRlcGVuZHMgb24gQkxBQ0tGSU4gJiYgIUJGNTYxCkBAIC02NjksNiArNjgwLDE3IEBACiAJIHRoZSBSVEMuIFRoaXMgZXhwb3NlcyB0aGF0IGZ1bmN0aW9uYWxpdHkgdGhyb3VnaCB0aGUgZ2VuZXJpYyBSVEMKIAkgY2xhc3MuCiAKK2NvbmZpZyBSVENfRFJWX1BYQQorICAgICAgIHRyaXN0YXRlICJQWEEyN3gvUFhBM3h4IgorICAgICAgIGRlcGVuZHMgb24gQVJDSF9QWEEKKyAgICAgICBoZWxwCisgICAgICAgICBJZiB5b3Ugc2F5IFkgaGVyZSB5b3Ugd2lsbCBnZXQgYWNjZXNzIHRvIHRoZSByZWFsIHRpbWUgY2xvY2sKKyAgICAgICAgIGJ1aWx0IGludG8geW91ciBQWEEyN3ggb3IgUFhBM3h4IENQVS4KKworICAgICAgICAgVGhpcyBSVEMgZHJpdmVyIHVzZXMgUFhBIFJUQyByZWdpc3RlcnMgYXZhaWxhYmxlIHNpbmNlIHB4YTI3eAorICAgICAgICAgc2VyaWVzIChSRHhSLCBSWXhSKSBpbnN0ZWFkIG9mIGxlZ2FjeSBSQ05SLCBSVEFSLgorCisKIGNvbmZpZyBSVENfRFJWX1NVTjRWCiAJYm9vbCAiU1VONFYgSHlwZXJ2aXNvciBSVEMiCiAJZGVwZW5kcyBvbiBTUEFSQzY0CkBAIC02ODMsNCArNzA1LDIyIEBACiAJICBJZiB5b3Ugc2F5IFkgaGVyZSB5b3Ugd2lsbCBnZXQgc3VwcG9ydCBmb3IgdGhlIFJUQyBmb3VuZCBvbgogCSAgU3RhcmZpcmUgc3lzdGVtcy4KIAorY29uZmlnIFJUQ19EUlZfVFg0OTM5CisJdHJpc3RhdGUgIlRYNDkzOSBTb0MiCisJZGVwZW5kcyBvbiBTT0NfVFg0OTM5CisJaGVscAorCSAgRHJpdmVyIGZvciB0aGUgaW50ZXJuYWwgUlRDIChSZWFsdGltZSBDbG9jaykgbW9kdWxlIGZvdW5kIG9uCisJICBUb3NoaWJhIFRYNDkzOSBTb0MuCisKK2NvbmZpZyBSVENfRFJWX01WCisJdHJpc3RhdGUgIk1hcnZlbGwgU29DIFJUQyIKKwlkZXBlbmRzIG9uIEFSQ0hfS0lSS1dPT0QKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSB3aWxsIGdldCBzdXBwb3J0IGZvciB0aGUgaW4tY2hpcCBSVEMKKwkgIHRoYXQgY2FuIGJlIGZvdW5kIGluIHNvbWUgb2YgTWFydmVsbCdzIFNvQyBkZXZpY2VzLCBzdWNoIGFzCisJICB0aGUgS2lya3dvb2QgODhGNjI4MSBhbmQgODhGNjE5Mi4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBydGMtbXYuCisKIGVuZGlmICMgUlRDX0NMQVNTCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9NYWtlZmlsZSBiL2RyaXZlcnMvcnRjL01ha2VmaWxlCmluZGV4IDZlNzljOTEuLjlhNDM0MGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcnRjL01ha2VmaWxlCkBAIC0yMCw2ICsyMCw3IEBACiBvYmotJChDT05GSUdfUlRDX0RSVl9BVDMyQVA3MDBYKSs9IHJ0Yy1hdDMyYXA3MDB4Lm8KIG9iai0kKENPTkZJR19SVENfRFJWX0FUOTFSTTkyMDApKz0gcnRjLWF0OTFybTkyMDAubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfQVQ5MVNBTTkpCSs9IHJ0Yy1hdDkxc2FtOS5vCitvYmotJChDT05GSUdfUlRDX0RSVl9BVTFYWFgpCSs9IHJ0Yy1hdTF4eHgubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfQkZJTikJKz0gcnRjLWJmaW4ubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfQ01PUykJKz0gcnRjLWNtb3Mubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfRFMxMjE2KQkrPSBydGMtZHMxMjE2Lm8KQEAgLTQ3LDYgKzQ4LDcgQEAKIG9iai0kKENPTkZJR19SVENfRFJWX1NUQVJGSVJFKQkrPSBydGMtc3RhcmZpcmUubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfTUFYNjkwMCkJKz0gcnRjLW1heDY5MDAubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfTUFYNjkwMikJKz0gcnRjLW1heDY5MDIubworb2JqLSQoQ09ORklHX1JUQ19EUlZfTVYpCSs9IHJ0Yy1tdi5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9PTUFQKQkrPSBydGMtb21hcC5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9QQ0Y4NTYzKQkrPSBydGMtcGNmODU2My5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9QQ0Y4NTgzKQkrPSBydGMtcGNmODU4My5vCkBAIC01NCw2ICs1Niw3IEBACiBvYmotJChDT05GSUdfUlRDX0RSVl9QTDAzMSkJKz0gcnRjLXBsMDMxLm8KIG9iai0kKENPTkZJR19SVENfRFJWX1BBUklTQykJKz0gcnRjLXBhcmlzYy5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9QUEMpCSs9IHJ0Yy1wcGMubworb2JqLSQoQ09ORklHX1JUQ19EUlZfUFhBKQkrPSBydGMtcHhhLm8KIG9iai0kKENPTkZJR19SVENfRFJWX1I5NzAxKQkrPSBydGMtcjk3MDEubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfUlM1QzMxMykJKz0gcnRjLXJzNWMzMTMubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfUlM1QzM0OCkJKz0gcnRjLXJzNWMzNDgubwpAQCAtNjYsNiArNjksNyBAQAogb2JqLSQoQ09ORklHX1JUQ19EUlZfU1RLMTdUQTgpCSs9IHJ0Yy1zdGsxN3RhOC5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9URVNUKQkrPSBydGMtdGVzdC5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9UV0w0MDMwKQkrPSBydGMtdHdsNDAzMC5vCitvYmotJChDT05GSUdfUlRDX0RSVl9UWDQ5MzkpCSs9IHJ0Yy10eDQ5Mzkubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfVjMwMjApCSs9IHJ0Yy12MzAyMC5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9WUjQxWFgpCSs9IHJ0Yy12cjQxeHgubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfV004MzUwKQkrPSBydGMtd204MzUwLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL2NsYXNzLmMgYi9kcml2ZXJzL3J0Yy9jbGFzcy5jCmluZGV4IDRkZmRmMDEuLmJlNWE2YjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL2NsYXNzLmMKKysrIGIvZHJpdmVycy9ydGMvY2xhc3MuYwpAQCAtNDgsOSArNDgsNyBAQAogCXN0cnVjdCBydGNfdGltZQkJdG07CiAJc3RydWN0IHRpbWVzcGVjCQl0cyA9IGN1cnJlbnRfa2VybmVsX3RpbWUoKTsKIAotCWlmIChzdHJuY21wKHJ0Yy0+ZGV2LmJ1c19pZCwKLQkJCQlDT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFLAotCQkJCUJVU19JRF9TSVpFKSAhPSAwKQorCWlmIChzdHJjbXAoZGV2X25hbWUoJnJ0Yy0+ZGV2KSwgQ09ORklHX1JUQ19IQ1RPU1lTX0RFVklDRSkgIT0gMCkKIAkJcmV0dXJuIDA7CiAKIAlydGNfcmVhZF90aW1lKHJ0YywgJnRtKTsKQEAgLTcxLDIwICs2OSwxOCBAQAogCXRpbWVfdAkJCW5ld3RpbWU7CiAJc3RydWN0IHRpbWVzcGVjCQl0aW1lOwogCi0JaWYgKHN0cm5jbXAocnRjLT5kZXYuYnVzX2lkLAotCQkJCUNPTkZJR19SVENfSENUT1NZU19ERVZJQ0UsCi0JCQkJQlVTX0lEX1NJWkUpICE9IDApCisJaWYgKHN0cmNtcChkZXZfbmFtZSgmcnRjLT5kZXYpLCBDT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFKSAhPSAwKQogCQlyZXR1cm4gMDsKIAogCXJ0Y19yZWFkX3RpbWUocnRjLCAmdG0pOwogCWlmIChydGNfdmFsaWRfdG0oJnRtKSAhPSAwKSB7Ci0JCXByX2RlYnVnKCIlczogIGJvZ3VzIHJlc3VtZSB0aW1lXG4iLCBydGMtPmRldi5idXNfaWQpOworCQlwcl9kZWJ1ZygiJXM6ICBib2d1cyByZXN1bWUgdGltZVxuIiwgZGV2X25hbWUoJnJ0Yy0+ZGV2KSk7CiAJCXJldHVybiAwOwogCX0KIAlydGNfdG1fdG9fdGltZSgmdG0sICZuZXd0aW1lKTsKIAlpZiAobmV3dGltZSA8PSBvbGR0aW1lKSB7CiAJCWlmIChuZXd0aW1lIDwgb2xkdGltZSkKLQkJCXByX2RlYnVnKCIlczogIHRpbWUgdHJhdmVsIVxuIiwgcnRjLT5kZXYuYnVzX2lkKTsKKwkJCXByX2RlYnVnKCIlczogIHRpbWUgdHJhdmVsIVxuIiwgZGV2X25hbWUoJnJ0Yy0+ZGV2KSk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMTU2LDcgKzE1Miw3IEBACiAJaW5pdF93YWl0cXVldWVfaGVhZCgmcnRjLT5pcnFfcXVldWUpOwogCiAJc3RybGNweShydGMtPm5hbWUsIG5hbWUsIFJUQ19ERVZJQ0VfTkFNRV9TSVpFKTsKLQlzbnByaW50ZihydGMtPmRldi5idXNfaWQsIEJVU19JRF9TSVpFLCAicnRjJWQiLCBpZCk7CisJZGV2X3NldF9uYW1lKCZydGMtPmRldiwgInJ0YyVkIiwgaWQpOwogCiAJcnRjX2Rldl9wcmVwYXJlKHJ0Yyk7CiAKQEAgLTE2OSw3ICsxNjUsNyBAQAogCXJ0Y19wcm9jX2FkZF9kZXZpY2UocnRjKTsKIAogCWRldl9pbmZvKGRldiwgInJ0YyBjb3JlOiByZWdpc3RlcmVkICVzIGFzICVzXG4iLAotCQkJcnRjLT5uYW1lLCBydGMtPmRldi5idXNfaWQpOworCQkJcnRjLT5uYW1lLCBkZXZfbmFtZSgmcnRjLT5kZXYpKTsKIAogCXJldHVybiBydGM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL2ludGVyZmFjZS5jIGIvZHJpdmVycy9ydGMvaW50ZXJmYWNlLmMKaW5kZXggZmQyYzY1Mi4uNDM0OGM0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvaW50ZXJmYWNlLmMKKysrIGIvZHJpdmVycy9ydGMvaW50ZXJmYWNlLmMKQEAgLTUwLDEwICs1MCwxNSBAQAogCiAJaWYgKCFydGMtPm9wcykKIAkJZXJyID0gLUVOT0RFVjsKLQllbHNlIGlmICghcnRjLT5vcHMtPnNldF90aW1lKQotCQllcnIgPSAtRUlOVkFMOwotCWVsc2UKKwllbHNlIGlmIChydGMtPm9wcy0+c2V0X3RpbWUpCiAJCWVyciA9IHJ0Yy0+b3BzLT5zZXRfdGltZShydGMtPmRldi5wYXJlbnQsIHRtKTsKKwllbHNlIGlmIChydGMtPm9wcy0+c2V0X21tc3MpIHsKKwkJdW5zaWduZWQgbG9uZyBzZWNzOworCQllcnIgPSBydGNfdG1fdG9fdGltZSh0bSwgJnNlY3MpOworCQlpZiAoZXJyID09IDApCisJCQllcnIgPSBydGMtPm9wcy0+c2V0X21tc3MocnRjLT5kZXYucGFyZW50LCBzZWNzKTsKKwl9IGVsc2UKKwkJZXJyID0gLUVJTlZBTDsKIAogCW11dGV4X3VubG9jaygmcnRjLT5vcHNfbG9jayk7CiAJcmV0dXJuIGVycjsKQEAgLTM4OSw3ICszOTQsNyBAQAogewogCWNoYXIgKm5hbWUgPSAoY2hhciAqKWRhdGE7CiAKLQlpZiAoc3RybmNtcChkZXYtPmJ1c19pZCwgbmFtZSwgQlVTX0lEX1NJWkUpID09IDApCisJaWYgKHN0cmNtcChkZXZfbmFtZShkZXYpLCBuYW1lKSA9PSAwKQogCQlyZXR1cm4gMTsKIAlyZXR1cm4gMDsKIH0KQEAgLTUwNCw5ICs1MDksNiBAQAogCWlmIChydGMtPm9wcy0+aXJxX3NldF9mcmVxID09IE5VTEwpCiAJCXJldHVybiAtRU5YSU87CiAKLQlpZiAoIWlzX3Bvd2VyX29mXzIoZnJlcSkpCi0JCXJldHVybiAtRUlOVkFMOwotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0Yy0+aXJxX3Rhc2tfbG9jaywgZmxhZ3MpOwogCWlmIChydGMtPmlycV90YXNrICE9IE5VTEwgJiYgdGFzayA9PSBOVUxMKQogCQllcnIgPSAtRUJVU1k7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtYXQzMmFwNzAweC5jIGIvZHJpdmVycy9ydGMvcnRjLWF0MzJhcDcwMHguYwppbmRleCA5MGI5YTY1Li5lMWVjMzNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtYXQzMmFwNzAweC5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1hdDMyYXA3MDB4LmMKQEAgLTIwNSw3ICsyMDUsNyBAQAogewogCXN0cnVjdCByZXNvdXJjZQkqcmVnczsKIAlzdHJ1Y3QgcnRjX2F0MzJhcDcwMHggKnJ0YzsKLQlpbnQgaXJxID0gLTE7CisJaW50IGlycTsKIAlpbnQgcmV0OwogCiAJcnRjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJ0Y19hdDMyYXA3MDB4KSwgR0ZQX0tFUk5FTCk7CkBAIC0yMjIsNyArMjIyLDcgQEAKIAl9CiAKIAlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwotCWlmIChpcnEgPCAwKSB7CisJaWYgKGlycSA8PSAwKSB7CiAJCWRldl9kYmcoJnBkZXYtPmRldiwgImNvdWxkIG5vdCBnZXQgaXJxXG4iKTsKIAkJcmV0ID0gLUVOWElPOwogCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1hdTF4eHguYyBiL2RyaXZlcnMvcnRjL3J0Yy1hdTF4eHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTA2YTY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ydGMvcnRjLWF1MXh4eC5jCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogQXUxeHh4IGNvdW50ZXIwIChha2EgVGltZS1PZi1ZZWFyIGNvdW50ZXIpIFJUQyBpbnRlcmZhY2UgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBNYW51ZWwgTGF1c3MgPG1hbm9Acm9hcmluZWxrLmhvbWVsaW51eC5uZXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyogQWxsIGN1cnJlbnQgQXUxeHh4IFNvQ3MgaGF2ZSAyIGNvdW50ZXJzIGZlZCBieSBhbiBleHRlcm5hbCAzMi43Njgga0h6CisgKiBjcnlzdGFsLiBDb3VudGVyIDAsIHdoaWNoIGtlZXBzIGNvdW50aW5nIGR1cmluZyBzbGVlcC9wb3dlcmRvd24sIGlzCisgKiB1c2VkIHRvIGNvdW50IHNlY29uZHMgc2luY2UgdGhlIGJlZ2lubmluZyBvZiB0aGUgdW5peCBlcG9jaC4KKyAqCisgKiBUaGUgY291bnRlcnMgbXVzdCBiZSBjb25maWd1cmVkIGFuZCBlbmFibGVkIGJ5IGJvb3Rsb2FkZXIvYm9hcmQgY29kZTsKKyAqIG5vIGNoZWNrcyBhcyB0byB3aGV0aGVyIHRoZXkgcmVhbGx5IGdldCBhIHByb3BlciAzMi43NjhrSHogY2xvY2sgYXJlCisgKiBtYWRlIGFzIHRoaXMgd291bGQgdGFrZSBmYXIgdG9vIGxvbmcuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaD4KKworLyogMzJrSHogY2xvY2sgZW5hYmxlZCBhbmQgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgQ05UUl9PSyAoU1lTX0NOVFJMX0UwIHwgU1lTX0NOVFJMXzMyUykKKworc3RhdGljIGludCBhdTF4dG95X3J0Y19yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXVuc2lnbmVkIGxvbmcgdDsKKworCXQgPSBhdV9yZWFkbChTWVNfVE9ZUkVBRCk7CisKKwlydGNfdGltZV90b190bSh0LCB0bSk7CisKKwlyZXR1cm4gcnRjX3ZhbGlkX3RtKHRtKTsKK30KKworc3RhdGljIGludCBhdTF4dG95X3J0Y19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJdW5zaWduZWQgbG9uZyB0OworCisJcnRjX3RtX3RvX3RpbWUodG0sICZ0KTsKKworCWF1X3dyaXRlbCh0LCBTWVNfVE9ZV1JJVEUpOworCWF1X3N5bmMoKTsKKworCS8qIHdhaXQgZm9yIHRoZSBwZW5kaW5nIHJlZ2lzdGVyIHdyaXRlIHRvIHN1Y2NlZWQuICBUaGlzIGNhbgorCSAqIHRha2UgdXAgdG8gNiBzZWNvbmRzLi4uCisJICovCisJd2hpbGUgKGF1X3JlYWRsKFNZU19DT1VOVEVSX0NOVFJMKSAmIFNZU19DTlRSTF9DMFMpCisJCW1zbGVlcCgxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHJ0Y19jbGFzc19vcHMgYXUxeHRveV9ydGNfb3BzID0geworCS5yZWFkX3RpbWUJPSBhdTF4dG95X3J0Y19yZWFkX3RpbWUsCisJLnNldF90aW1lCT0gYXUxeHRveV9ydGNfc2V0X3RpbWUsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhdTF4dG95X3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGNkZXY7CisJdW5zaWduZWQgbG9uZyB0OworCWludCByZXQ7CisKKwl0ID0gYXVfcmVhZGwoU1lTX0NPVU5URVJfQ05UUkwpOworCWlmICghKHQgJiBDTlRSX09LKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjb3VudGVycyBub3Qgd29ya2luZzsgYWJvcnRpbmcuXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXRfZXJyOworCX0KKworCXJldCA9IC1FVElNRURPVVQ7CisKKwkvKiBzZXQgY291bnRlcjAgdGlja3JhdGUgdG8gMUh6IGlmIG5lY2Vzc2FyeSAqLworCWlmIChhdV9yZWFkbChTWVNfVE9ZVFJJTSkgIT0gMzI3NjcpIHsKKwkJLyogd2FpdCB1bnRpbCBoYXJkd2FyZSBnaXZlcyBhY2Nlc3MgdG8gVFJJTSByZWdpc3RlciAqLworCQl0ID0gMHgwMDEwMDAwMDsKKwkJd2hpbGUgKChhdV9yZWFkbChTWVNfQ09VTlRFUl9DTlRSTCkgJiBTWVNfQ05UUkxfVDBTKSAmJiB0LS0pCisJCQltc2xlZXAoMSk7CisKKwkJaWYgKCF0KSB7CisJCQkvKiB0aW1lZCBvdXQgd2FpdGluZyBmb3IgcmVnaXN0ZXIgYWNjZXNzOyBhc3N1bWUKKwkJCSAqIGNvdW50ZXJzIGFyZSB1bnVzYWJsZS4KKwkJCSAqLworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAidGltZW91dCB3YWl0aW5nIGZvciBhY2Nlc3NcbiIpOworCQkJZ290byBvdXRfZXJyOworCQl9CisKKwkJLyogc2V0IDFIeiBUT1kgdGljayByYXRlICovCisJCWF1X3dyaXRlbCgzMjc2NywgU1lTX1RPWVRSSU0pOworCQlhdV9zeW5jKCk7CisJfQorCisJLyogd2FpdCB1bnRpbCB0aGUgaGFyZHdhcmUgYWxsb3dzIHdyaXRlcyB0byB0aGUgY291bnRlciByZWcgKi8KKwl3aGlsZSAoYXVfcmVhZGwoU1lTX0NPVU5URVJfQ05UUkwpICYgU1lTX0NOVFJMX0MwUykKKwkJbXNsZWVwKDEpOworCisJcnRjZGV2ID0gcnRjX2RldmljZV9yZWdpc3RlcigicnRjLWF1MXh4eCIsICZwZGV2LT5kZXYsCisJCQkJICAgICAmYXUxeHRveV9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihydGNkZXYpKSB7CisJCXJldCA9IFBUUl9FUlIocnRjZGV2KTsKKwkJZ290byBvdXRfZXJyOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHJ0Y2Rldik7CisKKwlyZXR1cm4gMDsKKworb3V0X2VycjoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhdTF4dG95X3J0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjZGV2KTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhdTF4cnRjX2RyaXZlciA9IHsKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAicnRjLWF1MXh4eCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChhdTF4dG95X3J0Y19yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYXUxeHRveV9ydGNfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmF1MXhydGNfZHJpdmVyLCBhdTF4dG95X3J0Y19wcm9iZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhdTF4dG95X3J0Y19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmF1MXhydGNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYXUxeHRveV9ydGNfaW5pdCk7Cittb2R1bGVfZXhpdChhdTF4dG95X3J0Y19leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBdTF4eHggVE9ZLWNvdW50ZXItYmFzZWQgUlRDIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTWFudWVsIExhdXNzIDxtYW51ZWwubGF1c3NAZ21haWwuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpydGMtYXUxeHh4Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtYmZpbi5jIGIvZHJpdmVycy9ydGMvcnRjLWJmaW4uYwppbmRleCAzNDQzOWNlLi5hYWZkM2U2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtYmZpbi5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1iZmluLmMKQEAgLTM5MCw3ICszOTAsNyBAQAogCiAJLyogUmVnaXN0ZXIgb3VyIFJUQyB3aXRoIHRoZSBSVEMgZnJhbWV3b3JrICovCiAJcnRjLT5ydGNfZGV2ID0gcnRjX2RldmljZV9yZWdpc3RlcihwZGV2LT5uYW1lLCBkZXYsICZiZmluX3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKLQlpZiAodW5saWtlbHkoSVNfRVJSKHJ0YykpKSB7CisJaWYgKHVubGlrZWx5KElTX0VSUihydGMtPnJ0Y19kZXYpKSkgewogCQlyZXQgPSBQVFJfRVJSKHJ0Yy0+cnRjX2Rldik7CiAJCWdvdG8gZXJyX2lycTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtY21vcy5jIGIvZHJpdmVycy9ydGMvcnRjLWNtb3MuYwppbmRleCA2Y2Y4ZTI4Li5iNmQzNWY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtY21vcy5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1jbW9zLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZpY2V0YWJsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KIAogLyogdGhpcyBpcyBmb3IgImdlbmVyaWMgYWNjZXNzIHRvIFBDLXN0eWxlIFJUQyIgdXNpbmcgQ01PU19SRUFEL0NNT1NfV1JJVEUgKi8KICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ydGMuaD4KQEAgLTU4LDcgKzU5LDcgQEAKIH07CiAKIC8qIGJvdGggcGxhdGZvcm0gYW5kIHBucCBidXNzZXMgdXNlIG5lZ2F0aXZlIG51bWJlcnMgZm9yIGludmFsaWQgaXJxcyAqLwotI2RlZmluZSBpc192YWxpZF9pcnEobikJCSgobikgPj0gMCkKKyNkZWZpbmUgaXNfdmFsaWRfaXJxKG4pCQkoKG4pID4gMCkKIAogc3RhdGljIGNvbnN0IGNoYXIgZHJpdmVyX25hbWVbXSA9ICJydGNfY21vcyI7CiAKQEAgLTM4NCw2ICszODUsOCBAQAogCWlmICghaXNfdmFsaWRfaXJxKGNtb3MtPmlycSkpCiAJCXJldHVybiAtRU5YSU87CiAKKwlpZiAoIWlzX3Bvd2VyX29mXzIoZnJlcSkpCisJCXJldHVybiAtRUlOVkFMOwogCS8qIDAgPSBubyBpcnFzOyAxID0gMl4xNSBIeiAuLi4gMTUgPSAyXjAgSHogKi8KIAlmID0gZmZzKGZyZXEpOwogCWlmIChmLS0gPiAxNikKQEAgLTcyOSw3ICs3MzIsNyBAQAogCiAJY21vc19ydGMuZGV2ID0gZGV2OwogCWRldl9zZXRfZHJ2ZGF0YShkZXYsICZjbW9zX3J0Yyk7Ci0JcmVuYW1lX3JlZ2lvbihwb3J0cywgY21vc19ydGMucnRjLT5kZXYuYnVzX2lkKTsKKwlyZW5hbWVfcmVnaW9uKHBvcnRzLCBkZXZfbmFtZSgmY21vc19ydGMucnRjLT5kZXYpKTsKIAogCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKIApAQCAtNzc3LDcgKzc4MCw3IEBACiAJCQlydGNfY21vc19pbnRfaGFuZGxlciA9IGNtb3NfaW50ZXJydXB0OwogCiAJCXJldHZhbCA9IHJlcXVlc3RfaXJxKHJ0Y19pcnEsIHJ0Y19jbW9zX2ludF9oYW5kbGVyLAotCQkJCUlSUUZfRElTQUJMRUQsIGNtb3NfcnRjLnJ0Yy0+ZGV2LmJ1c19pZCwKKwkJCQlJUlFGX0RJU0FCTEVELCBkZXZfbmFtZSgmY21vc19ydGMucnRjLT5kZXYpLAogCQkJCWNtb3NfcnRjLnJ0Yyk7CiAJCWlmIChyZXR2YWwgPCAwKSB7CiAJCQlkZXZfZGJnKGRldiwgIklSUSAlZCBpcyBhbHJlYWR5IGluIHVzZVxuIiwgcnRjX2lycSk7CkBAIC03OTUsNyArNzk4LDcgQEAKIAl9CiAKIAlwcl9pbmZvKCIlczogYWxhcm1zIHVwIHRvIG9uZSAlcyVzLCAlemQgYnl0ZXMgbnZyYW0lc1xuIiwKLQkJCWNtb3NfcnRjLnJ0Yy0+ZGV2LmJ1c19pZCwKKwkJCWRldl9uYW1lKCZjbW9zX3J0Yy5ydGMtPmRldiksCiAJCQlpc192YWxpZF9pcnEocnRjX2lycSkKIAkJCQk/ICAoY21vc19ydGMubW9uX2Fscm0KIAkJCQkJPyAieWVhciIKQEAgLTg4NSw3ICs4ODgsNyBAQAogCX0KIAogCXByX2RlYnVnKCIlczogc3VzcGVuZCVzLCBjdHJsICUwMnhcbiIsCi0JCQljbW9zX3J0Yy5ydGMtPmRldi5idXNfaWQsCisJCQlkZXZfbmFtZSgmY21vc19ydGMucnRjLT5kZXYpLAogCQkJKHRtcCAmIFJUQ19BSUUpID8gIiwgYWxhcm0gbWF5IHdha2UiIDogIiIsCiAJCQl0bXApOwogCkBAIC05NDEsNyArOTQ0LDcgQEAKIAl9CiAKIAlwcl9kZWJ1ZygiJXM6IHJlc3VtZSwgY3RybCAlMDJ4XG4iLAotCQkJY21vc19ydGMucnRjLT5kZXYuYnVzX2lkLAorCQkJZGV2X25hbWUoJmNtb3NfcnRjLnJ0Yy0+ZGV2KSwKIAkJCXRtcCk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1kczEyMTYuYyBiL2RyaXZlcnMvcnRjL3J0Yy1kczEyMTYuYwppbmRleCA5YTIzNGE0Li40YWVkYzcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtZHMxMjE2LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWRzMTIxNi5jCkBAIC0xMCw3ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvYmNkLmg+CiAKLSNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMiIKIAogc3RydWN0IGRzMTIxNl9yZWdzIHsKIAl1OCB0c2VjOwpAQCAtMTAxLDcgKzEwMSw4IEBACiAJdG0tPnRtX3llYXIgPSBiY2QyYmluKHJlZ3MueWVhcik7CiAJaWYgKHRtLT50bV95ZWFyIDwgNzApCiAJCXRtLT50bV95ZWFyICs9IDEwMDsKLQlyZXR1cm4gMDsKKworCXJldHVybiBydGNfdmFsaWRfdG0odG0pOwogfQogCiBzdGF0aWMgaW50IGRzMTIxNl9ydGNfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQpAQCAtMTM4LDkgKzEzOSw4IEBACiAJLnNldF90aW1lCT0gZHMxMjE2X3J0Y19zZXRfdGltZSwKIH07CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IGRzMTIxNl9ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgX19pbml0IGRzMTIxNl9ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCXN0cnVjdCBkczEyMTZfcHJpdiAqcHJpdjsKIAlpbnQgcmV0ID0gMDsKQEAgLTE1Miw3ICsxNTIsMTAgQEAKIAlwcml2ID0ga3phbGxvYyhzaXplb2YgKnByaXYsIEdGUF9LRVJORUwpOwogCWlmICghcHJpdikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JcHJpdi0+c2l6ZSA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwcml2KTsKKworCXByaXYtPnNpemUgPSByZXNvdXJjZV9zaXplKHJlcyk7CiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgcHJpdi0+c2l6ZSwgcGRldi0+bmFtZSkpIHsKIAkJcmV0ID0gLUVCVVNZOwogCQlnb3RvIG91dDsKQEAgLTE2MywyMiArMTY2LDE4IEBACiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwogCX0KLQlydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJkczEyMTYiLCAmcGRldi0+ZGV2LAorCXByaXYtPnJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoImRzMTIxNiIsICZwZGV2LT5kZXYsCiAJCQkJICAmZHMxMjE2X3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKLQlpZiAoSVNfRVJSKHJ0YykpIHsKLQkJcmV0ID0gUFRSX0VSUihydGMpOworCWlmIChJU19FUlIocHJpdi0+cnRjKSkgeworCQlyZXQgPSBQVFJfRVJSKHByaXYtPnJ0Yyk7CiAJCWdvdG8gb3V0OwogCX0KLQlwcml2LT5ydGMgPSBydGM7Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcHJpdik7CiAKIAkvKiBkdW1teSByZWFkIHRvIGdldCBjbG9jayBpbnRvIGEga25vd24gc3RhdGUgKi8KIAlkczEyMTZfcmVhZChwcml2LT5pb2FkZHIsIGR1bW15KTsKIAlyZXR1cm4gMDsKIAogb3V0OgotCWlmIChwcml2LT5ydGMpCi0JCXJ0Y19kZXZpY2VfdW5yZWdpc3Rlcihwcml2LT5ydGMpOwogCWlmIChwcml2LT5pb2FkZHIpCiAJCWlvdW5tYXAocHJpdi0+aW9hZGRyKTsKIAlpZiAocHJpdi0+YmFzZWFkZHIpCkBAIC0xODcsNyArMTg2LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IF9fZGV2ZXhpdCBkczEyMTZfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBfX2V4aXQgZHMxMjE2X3J0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgZHMxMjE2X3ByaXYgKnByaXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIApAQCAtMjAzLDEzICsyMDIsMTIgQEAKIAkJLm5hbWUJPSAicnRjLWRzMTIxNiIsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCX0sCi0JLnByb2JlCQk9IGRzMTIxNl9ydGNfcHJvYmUsCi0JLnJlbW92ZQkJPSBfX2RldmV4aXRfcChkczEyMTZfcnRjX3JlbW92ZSksCisJLnJlbW92ZQkJPSBfX2V4aXRfcChkczEyMTZfcnRjX3JlbW92ZSksCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBkczEyMTZfcnRjX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZkczEyMTZfcnRjX3BsYXRmb3JtX2RyaXZlcik7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmZHMxMjE2X3J0Y19wbGF0Zm9ybV9kcml2ZXIsIGRzMTIxNl9ydGNfcHJvYmUpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZHMxMjE2X3J0Y19leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtZHMxMzA3LmMgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxMzA3LmMKaW5kZXggMTYyMzMwYi4uN2U1MTU1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWRzMTMwNy5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1kczEzMDcuYwpAQCAtODYsMTMgKzg2LDExIEBACiAKIAogc3RydWN0IGRzMTMwNyB7Ci0JdTgJCQlyZWdfYWRkcjsKIAl1OAkJCXJlZ3NbMTFdOwogCWVudW0gZHNfdHlwZQkJdHlwZTsKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKICNkZWZpbmUgSEFTX05WUkFNCTAJCS8qIGJpdCAwID09IHN5c2ZzIGZpbGUgYWN0aXZlICovCiAjZGVmaW5lIEhBU19BTEFSTQkxCQkvKiBiaXQgMSA9PSBpcnEgY2xhaW1lZCAqLwotCXN0cnVjdCBpMmNfbXNnCQltc2dbMl07CiAJc3RydWN0IGkyY19jbGllbnQJKmNsaWVudDsKIAlzdHJ1Y3QgcnRjX2RldmljZQkqcnRjOwogCXN0cnVjdCB3b3JrX3N0cnVjdAl3b3JrOwpAQCAtMjA0LDEzICsyMDIsOSBAQAogCWludAkJdG1wOwogCiAJLyogcmVhZCB0aGUgUlRDIGRhdGUgYW5kIHRpbWUgcmVnaXN0ZXJzIGFsbCBhdCBvbmNlICovCi0JZHMxMzA3LT5yZWdfYWRkciA9IDA7Ci0JZHMxMzA3LT5tc2dbMV0uZmxhZ3MgPSBJMkNfTV9SRDsKLQlkczEzMDctPm1zZ1sxXS5sZW4gPSA3OwotCi0JdG1wID0gaTJjX3RyYW5zZmVyKHRvX2kyY19hZGFwdGVyKGRzMTMwNy0+Y2xpZW50LT5kZXYucGFyZW50KSwKLQkJCWRzMTMwNy0+bXNnLCAyKTsKLQlpZiAodG1wICE9IDIpIHsKKwl0bXAgPSBpMmNfc21idXNfcmVhZF9pMmNfYmxvY2tfZGF0YShkczEzMDctPmNsaWVudCwKKwkJRFMxMzA3X1JFR19TRUNTLCA3LCBkczEzMDctPnJlZ3MpOworCWlmICh0bXAgIT0gNykgewogCQlkZXZfZXJyKGRldiwgIiVzIGVycm9yICVkXG4iLCAicmVhZCIsIHRtcCk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTI1Nyw3ICsyNTEsNiBAQAogCQl0LT50bV9ob3VyLCB0LT50bV9tZGF5LAogCQl0LT50bV9tb24sIHQtPnRtX3llYXIsIHQtPnRtX3dkYXkpOwogCi0JKmJ1ZisrID0gMDsJCS8qIGZpcnN0IHJlZ2lzdGVyIGFkZHIgKi8KIAlidWZbRFMxMzA3X1JFR19TRUNTXSA9IGJpbjJiY2QodC0+dG1fc2VjKTsKIAlidWZbRFMxMzA3X1JFR19NSU5dID0gYmluMmJjZCh0LT50bV9taW4pOwogCWJ1ZltEUzEzMDdfUkVHX0hPVVJdID0gYmluMmJjZCh0LT50bV9ob3VyKTsKQEAgLTI4MiwyMyArMjc1LDE5IEBACiAJCWJyZWFrOwogCX0KIAotCWRzMTMwNy0+bXNnWzFdLmZsYWdzID0gMDsKLQlkczEzMDctPm1zZ1sxXS5sZW4gPSA4OwotCiAJZGV2X2RiZyhkZXYsICIlczogJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKIAkJIndyaXRlIiwgYnVmWzBdLCBidWZbMV0sIGJ1ZlsyXSwgYnVmWzNdLAogCQlidWZbNF0sIGJ1Zls1XSwgYnVmWzZdKTsKIAotCXJlc3VsdCA9IGkyY190cmFuc2Zlcih0b19pMmNfYWRhcHRlcihkczEzMDctPmNsaWVudC0+ZGV2LnBhcmVudCksCi0JCQkmZHMxMzA3LT5tc2dbMV0sIDEpOwotCWlmIChyZXN1bHQgIT0gMSkgewotCQlkZXZfZXJyKGRldiwgIiVzIGVycm9yICVkXG4iLCAid3JpdGUiLCB0bXApOwotCQlyZXR1cm4gLUVJTzsKKwlyZXN1bHQgPSBpMmNfc21idXNfd3JpdGVfaTJjX2Jsb2NrX2RhdGEoZHMxMzA3LT5jbGllbnQsIDAsIDcsIGJ1Zik7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycihkZXYsICIlcyBlcnJvciAlZFxuIiwgIndyaXRlIiwgcmVzdWx0KTsKKwkJcmV0dXJuIHJlc3VsdDsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZHMxMzA3X3JlYWRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqdCkKK3N0YXRpYyBpbnQgZHMxMzM3X3JlYWRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqdCkKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAgICAgICAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwogCXN0cnVjdCBkczEzMDcJCSpkczEzMDcgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKQEAgLTMwOCwxMyArMjk3LDkgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiByZWFkIGFsbCBBTEFSTTEsIEFMQVJNMiwgYW5kIHN0YXR1cyByZWdpc3RlcnMgYXQgb25jZSAqLwotCWRzMTMwNy0+cmVnX2FkZHIgPSBEUzEzMzlfUkVHX0FMQVJNMV9TRUNTOwotCWRzMTMwNy0+bXNnWzFdLmZsYWdzID0gSTJDX01fUkQ7Ci0JZHMxMzA3LT5tc2dbMV0ubGVuID0gOTsKLQotCXJldCA9IGkyY190cmFuc2Zlcih0b19pMmNfYWRhcHRlcihjbGllbnQtPmRldi5wYXJlbnQpLAotCQkJZHMxMzA3LT5tc2csIDIpOwotCWlmIChyZXQgIT0gMikgeworCXJldCA9IGkyY19zbWJ1c19yZWFkX2kyY19ibG9ja19kYXRhKGNsaWVudCwKKwkJCURTMTMzOV9SRUdfQUxBUk0xX1NFQ1MsIDksIGRzMTMwNy0+cmVncyk7CisJaWYgKHJldCAhPSA5KSB7CiAJCWRldl9lcnIoZGV2LCAiJXMgZXJyb3IgJWRcbiIsICJhbGFybSByZWFkIiwgcmV0KTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMzUzLDcgKzMzOCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZHMxMzA3X3NldF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICp0KQorc3RhdGljIGludCBkczEzMzdfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKnQpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgICAgICAgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKIAlzdHJ1Y3QgZHMxMzA3CQkqZHMxMzA3ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CkBAIC0zNzEsMTMgKzM1Niw5IEBACiAJCXQtPmVuYWJsZWQsIHQtPnBlbmRpbmcpOwogCiAJLyogcmVhZCBjdXJyZW50IHN0YXR1cyBvZiBib3RoIGFsYXJtcyBhbmQgdGhlIGNoaXAgKi8KLQlkczEzMDctPnJlZ19hZGRyID0gRFMxMzM5X1JFR19BTEFSTTFfU0VDUzsKLQlkczEzMDctPm1zZ1sxXS5mbGFncyA9IEkyQ19NX1JEOwotCWRzMTMwNy0+bXNnWzFdLmxlbiA9IDk7Ci0KLQlyZXQgPSBpMmNfdHJhbnNmZXIodG9faTJjX2FkYXB0ZXIoY2xpZW50LT5kZXYucGFyZW50KSwKLQkJCWRzMTMwNy0+bXNnLCAyKTsKLQlpZiAocmV0ICE9IDIpIHsKKwlyZXQgPSBpMmNfc21idXNfcmVhZF9pMmNfYmxvY2tfZGF0YShjbGllbnQsCisJCQlEUzEzMzlfUkVHX0FMQVJNMV9TRUNTLCA5LCBidWYpOworCWlmIChyZXQgIT0gOSkgewogCQlkZXZfZXJyKGRldiwgIiVzIGVycm9yICVkXG4iLCAiYWxhcm0gd3JpdGUiLCByZXQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0zOTIsNyArMzczLDYgQEAKIAkJCWRzMTMwNy0+cmVnc1s2XSwgY29udHJvbCwgc3RhdHVzKTsKIAogCS8qIHNldCBBTEFSTTEsIHVzaW5nIDI0IGhvdXIgYW5kIGRheS1vZi1tb250aCBtb2RlcyAqLwotCSpidWYrKyA9IERTMTMzOV9SRUdfQUxBUk0xX1NFQ1M7CS8qIGZpcnN0IHJlZ2lzdGVyIGFkZHIgKi8KIAlidWZbMF0gPSBiaW4yYmNkKHQtPnRpbWUudG1fc2VjKTsKIAlidWZbMV0gPSBiaW4yYmNkKHQtPnRpbWUudG1fbWluKTsKIAlidWZbMl0gPSBiaW4yYmNkKHQtPnRpbWUudG1faG91cik7CkBAIC00MTEsMTQgKzM5MSwxMSBAQAogCX0KIAlidWZbOF0gPSBzdGF0dXMgJiB+KERTMTMzN19CSVRfQTFJIHwgRFMxMzM3X0JJVF9BMkkpOwogCi0JZHMxMzA3LT5tc2dbMV0uZmxhZ3MgPSAwOwotCWRzMTMwNy0+bXNnWzFdLmxlbiA9IDEwOwotCi0JcmV0ID0gaTJjX3RyYW5zZmVyKHRvX2kyY19hZGFwdGVyKGNsaWVudC0+ZGV2LnBhcmVudCksCi0JCQkmZHMxMzA3LT5tc2dbMV0sIDEpOwotCWlmIChyZXQgIT0gMSkgeworCXJldCA9IGkyY19zbWJ1c193cml0ZV9pMmNfYmxvY2tfZGF0YShjbGllbnQsCisJCQlEUzEzMzlfUkVHX0FMQVJNMV9TRUNTLCA5LCBidWYpOworCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoZGV2LCAiY2FuJ3Qgc2V0IGFsYXJtIHRpbWVcbiIpOwotCQlyZXR1cm4gLUVJTzsKKwkJcmV0dXJuIHJldDsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTQ3NSw4ICs0NTIsOCBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIGRzMTN4eF9ydGNfb3BzID0gewogCS5yZWFkX3RpbWUJPSBkczEzMDdfZ2V0X3RpbWUsCiAJLnNldF90aW1lCT0gZHMxMzA3X3NldF90aW1lLAotCS5yZWFkX2FsYXJtCT0gZHMxMzA3X3JlYWRfYWxhcm0sCi0JLnNldF9hbGFybQk9IGRzMTMwN19zZXRfYWxhcm0sCisJLnJlYWRfYWxhcm0JPSBkczEzMzdfcmVhZF9hbGFybSwKKwkuc2V0X2FsYXJtCT0gZHMxMzM3X3NldF9hbGFybSwKIAkuaW9jdGwJCT0gZHMxMzA3X2lvY3RsLAogfTsKIApAQCAtNDkwLDcgKzQ2Nyw2IEBACiB7CiAJc3RydWN0IGkyY19jbGllbnQJKmNsaWVudDsKIAlzdHJ1Y3QgZHMxMzA3CQkqZHMxMzA3OwotCXN0cnVjdCBpMmNfbXNnCQltc2dbMl07CiAJaW50CQkJcmVzdWx0OwogCiAJY2xpZW50ID0ga29ial90b19pMmNfY2xpZW50KGtvYmopOwpAQCAtNTAzLDI0ICs0NzksMTAgQEAKIAlpZiAodW5saWtlbHkoIWNvdW50KSkKIAkJcmV0dXJuIGNvdW50OwogCi0JbXNnWzBdLmFkZHIgPSBjbGllbnQtPmFkZHI7Ci0JbXNnWzBdLmZsYWdzID0gMDsKLQltc2dbMF0ubGVuID0gMTsKLQltc2dbMF0uYnVmID0gYnVmOwotCi0JYnVmWzBdID0gOCArIG9mZjsKLQotCW1zZ1sxXS5hZGRyID0gY2xpZW50LT5hZGRyOwotCW1zZ1sxXS5mbGFncyA9IEkyQ19NX1JEOwotCW1zZ1sxXS5sZW4gPSBjb3VudDsKLQltc2dbMV0uYnVmID0gYnVmOwotCi0JcmVzdWx0ID0gaTJjX3RyYW5zZmVyKHRvX2kyY19hZGFwdGVyKGNsaWVudC0+ZGV2LnBhcmVudCksIG1zZywgMik7Ci0JaWYgKHJlc3VsdCAhPSAyKSB7CisJcmVzdWx0ID0gaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoY2xpZW50LCA4ICsgb2ZmLCBjb3VudCwgYnVmKTsKKwlpZiAocmVzdWx0IDwgMCkKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlcyBlcnJvciAlZFxuIiwgIm52cmFtIHJlYWQiLCByZXN1bHQpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0JcmV0dXJuIGNvdW50OworCXJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBzc2l6ZV90CkBAIC01MjgsOCArNDkwLDcgQEAKIAkJY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IGkyY19jbGllbnQJKmNsaWVudDsKLQl1OAkJCWJ1ZmZlcltOVlJBTV9TSVpFICsgMV07Ci0JaW50CQkJcmV0OworCWludAkJCXJlc3VsdDsKIAogCWNsaWVudCA9IGtvYmpfdG9faTJjX2NsaWVudChrb2JqKTsKIApAQCAtNTQwLDExICs1MDEsMTIgQEAKIAlpZiAodW5saWtlbHkoIWNvdW50KSkKIAkJcmV0dXJuIGNvdW50OwogCi0JYnVmZmVyWzBdID0gOCArIG9mZjsKLQltZW1jcHkoYnVmZmVyICsgMSwgYnVmLCBjb3VudCk7Ci0KLQlyZXQgPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWZmZXIsIGNvdW50ICsgMSk7Ci0JcmV0dXJuIChyZXQgPCAwKSA/IHJldCA6IChyZXQgLSAxKTsKKwlyZXN1bHQgPSBpMmNfc21idXNfd3JpdGVfaTJjX2Jsb2NrX2RhdGEoY2xpZW50LCA4ICsgb2ZmLCBjb3VudCwgYnVmKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzIGVycm9yICVkXG4iLCAibnZyYW0gd3JpdGUiLCByZXN1bHQpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwlyZXR1cm4gY291bnQ7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBudnJhbSA9IHsKQEAgLTU3MSw5ICs1MzMsMTEgQEAKIAljb25zdCBzdHJ1Y3QgY2hpcF9kZXNjCSpjaGlwID0gJmNoaXBzW2lkLT5kcml2ZXJfZGF0YV07CiAJc3RydWN0IGkyY19hZGFwdGVyCSphZGFwdGVyID0gdG9faTJjX2FkYXB0ZXIoY2xpZW50LT5kZXYucGFyZW50KTsKIAlpbnQJCQl3YW50X2lycSA9IGZhbHNlOworCXVuc2lnbmVkIGNoYXIJCSpidWY7CiAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsCi0JCQlJMkNfRlVOQ19JMkMgfCBJMkNfRlVOQ19TTUJVU19XUklURV9CWVRFX0RBVEEpKQorCQkJSTJDX0ZVTkNfU01CVVNfV1JJVEVfQllURV9EQVRBIHwKKwkJCUkyQ19GVU5DX1NNQlVTX0kyQ19CTE9DSykpCiAJCXJldHVybiAtRUlPOwogCiAJaWYgKCEoZHMxMzA3ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRzMTMwNyksIEdGUF9LRVJORUwpKSkKQEAgLTU4MSwxOCArNTQ1LDggQEAKIAogCWRzMTMwNy0+Y2xpZW50ID0gY2xpZW50OwogCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGRzMTMwNyk7Ci0KLQlkczEzMDctPm1zZ1swXS5hZGRyID0gY2xpZW50LT5hZGRyOwotCWRzMTMwNy0+bXNnWzBdLmZsYWdzID0gMDsKLQlkczEzMDctPm1zZ1swXS5sZW4gPSAxOwotCWRzMTMwNy0+bXNnWzBdLmJ1ZiA9ICZkczEzMDctPnJlZ19hZGRyOwotCi0JZHMxMzA3LT5tc2dbMV0uYWRkciA9IGNsaWVudC0+YWRkcjsKLQlkczEzMDctPm1zZ1sxXS5mbGFncyA9IEkyQ19NX1JEOwotCWRzMTMwNy0+bXNnWzFdLmxlbiA9IHNpemVvZihkczEzMDctPnJlZ3MpOwotCWRzMTMwNy0+bXNnWzFdLmJ1ZiA9IGRzMTMwNy0+cmVnczsKLQogCWRzMTMwNy0+dHlwZSA9IGlkLT5kcml2ZXJfZGF0YTsKKwlidWYgPSBkczEzMDctPnJlZ3M7CiAKIAlzd2l0Y2ggKGRzMTMwNy0+dHlwZSkgewogCWNhc2UgZHNfMTMzNzoKQEAgLTYwMiwyMSArNTU2LDE1IEBACiAJCQlJTklUX1dPUksoJmRzMTMwNy0+d29yaywgZHMxMzA3X3dvcmspOwogCQkJd2FudF9pcnEgPSB0cnVlOwogCQl9Ci0KLQkJZHMxMzA3LT5yZWdfYWRkciA9IERTMTMzN19SRUdfQ09OVFJPTDsKLQkJZHMxMzA3LT5tc2dbMV0ubGVuID0gMjsKLQogCQkvKiBnZXQgcmVnaXN0ZXJzIHRoYXQgdGhlICJydGMiIHJlYWQgYmVsb3cgd29uJ3QgcmVhZC4uLiAqLwotCQl0bXAgPSBpMmNfdHJhbnNmZXIoYWRhcHRlciwgZHMxMzA3LT5tc2csIDIpOworCQl0bXAgPSBpMmNfc21idXNfcmVhZF9pMmNfYmxvY2tfZGF0YShkczEzMDctPmNsaWVudCwKKwkJCQlEUzEzMzdfUkVHX0NPTlRST0wsIDIsIGJ1Zik7CiAJCWlmICh0bXAgIT0gMikgewogCQkJcHJfZGVidWcoInJlYWQgZXJyb3IgJWRcbiIsIHRtcCk7CiAJCQllcnIgPSAtRUlPOwogCQkJZ290byBleGl0X2ZyZWU7CiAJCX0KIAotCQlkczEzMDctPnJlZ19hZGRyID0gMDsKLQkJZHMxMzA3LT5tc2dbMV0ubGVuID0gc2l6ZW9mKGRzMTMwNy0+cmVncyk7Ci0KIAkJLyogb3NjaWxsYXRvciBvZmY/ICB0dXJuIGl0IG9uLCBzbyBjbG9jayBjYW4gdGljay4gKi8KIAkJaWYgKGRzMTMwNy0+cmVnc1swXSAmIERTMTMzN19CSVRfbkVPU0MpCiAJCQlkczEzMDctPnJlZ3NbMF0gJj0gfkRTMTMzN19CSVRfbkVPU0M7CkBAIC02NDcsOSArNTk1LDggQEAKIAogcmVhZF9ydGM6CiAJLyogcmVhZCBSVEMgcmVnaXN0ZXJzICovCi0KLQl0bXAgPSBpMmNfdHJhbnNmZXIoYWRhcHRlciwgZHMxMzA3LT5tc2csIDIpOwotCWlmICh0bXAgIT0gMikgeworCXRtcCA9IGkyY19zbWJ1c19yZWFkX2kyY19ibG9ja19kYXRhKGRzMTMwNy0+Y2xpZW50LCAwLCA4LCBidWYpOworCWlmICh0bXAgIT0gOCkgewogCQlwcl9kZWJ1ZygicmVhZCBlcnJvciAlZFxuIiwgdG1wKTsKIAkJZXJyID0gLUVJTzsKIAkJZ290byBleGl0X2ZyZWU7CkBAIC03MDcsMjIgKzY1NCw2IEBACiAJCWJyZWFrOwogCX0KIAotCXRtcCA9IGRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX1NFQ1NdOwotCXRtcCA9IGJjZDJiaW4odG1wICYgMHg3Zik7Ci0JaWYgKHRtcCA+IDYwKQotCQlnb3RvIGV4aXRfYmFkOwotCXRtcCA9IGJjZDJiaW4oZHMxMzA3LT5yZWdzW0RTMTMwN19SRUdfTUlOXSAmIDB4N2YpOwotCWlmICh0bXAgPiA2MCkKLQkJZ290byBleGl0X2JhZDsKLQotCXRtcCA9IGJjZDJiaW4oZHMxMzA3LT5yZWdzW0RTMTMwN19SRUdfTURBWV0gJiAweDNmKTsKLQlpZiAodG1wID09IDAgfHwgdG1wID4gMzEpCi0JCWdvdG8gZXhpdF9iYWQ7Ci0KLQl0bXAgPSBiY2QyYmluKGRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX01PTlRIXSAmIDB4MWYpOwotCWlmICh0bXAgPT0gMCB8fCB0bXAgPiAxMikKLQkJZ290byBleGl0X2JhZDsKLQogCXRtcCA9IGRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX0hPVVJdOwogCXN3aXRjaCAoZHMxMzA3LT50eXBlKSB7CiAJY2FzZSBkc18xMzQwOgpAQCAtNzc5LDEzICs3MTAsNiBAQAogCiAJcmV0dXJuIDA7CiAKLWV4aXRfYmFkOgotCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiJXM6ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCi0JCQkiYm9ndXMgcmVnaXN0ZXIiLAotCQkJZHMxMzA3LT5yZWdzWzBdLCBkczEzMDctPnJlZ3NbMV0sCi0JCQlkczEzMDctPnJlZ3NbMl0sIGRzMTMwNy0+cmVnc1szXSwKLQkJCWRzMTMwNy0+cmVnc1s0XSwgZHMxMzA3LT5yZWdzWzVdLAotCQkJZHMxMzA3LT5yZWdzWzZdKTsKIGV4aXRfaXJxOgogCWlmIChkczEzMDctPnJ0YykKIAkJcnRjX2RldmljZV91bnJlZ2lzdGVyKGRzMTMwNy0+cnRjKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1kczEzOTAuYyBiL2RyaXZlcnMvcnRjL3J0Yy1kczEzOTAuYwppbmRleCA1OTllOTc2Li5lNTRiNWM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtZHMxMzkwLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWRzMTM5MC5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIHJ0Yy1kczEzOTAuYyAtLSBkcml2ZXIgZm9yIERTMTM5MC85My85NAorICogcnRjLWRzMTM5MC5jIC0tIGRyaXZlciBmb3IgdGhlIERhbGxhcy9NYXhpbSBEUzEzOTAvOTMvOTQgU1BJIFJUQwogICoKICAqIENvcHlyaWdodCAoQykgMjAwOCBNZXJjdXJ5IElNQyBMdGQKICAqIFdyaXR0ZW4gYnkgTWFyayBKYWNrc29uIDxtcGZqQG1pbWMuY28udWs+CkBAIC04LDExICs4LDEzIEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogTk9URSA6IEN1cnJlbnRseSB0aGlzIGRyaXZlciBvbmx5IHN1cHBvcnRzIHRoZSBiYXJlIG1pbmltdW0gZm9yIHJlYWQKLSAqIGFuZCB3cml0ZSB0aGUgUlRDLiAgVGhlIGV4dHJhIGZlYXR1cmVzIHByb3ZpZGVkIGJ5IHRoZSBjaGlwIGZhbWlseQorICogTk9URTogQ3VycmVudGx5IHRoaXMgZHJpdmVyIG9ubHkgc3VwcG9ydHMgdGhlIGJhcmUgbWluaW11bSBmb3IgcmVhZAorICogYW5kIHdyaXRlIHRoZSBSVEMuIFRoZSBleHRyYSBmZWF0dXJlcyBwcm92aWRlZCBieSB0aGUgY2hpcCBmYW1pbHkKICAqIChhbGFybXMsIHRyaWNrbGUgY2hhcmdlciwgZGlmZmVyZW50IGNvbnRyb2wgcmVnaXN0ZXJzKSBhcmUgdW5hdmFpbGFibGUuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ydGMuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CkBAIC00MiwyMCArNDQsNiBAQAogCXU4IHR4cnhfYnVmWzldOwkvKiBjbWQgKyA4IHJlZ2lzdGVycyAqLwogfTsKIAotc3RhdGljIHZvaWQgZHMxMzkwX3NldF9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyIGFkZHJlc3MsCi0JCQkJdW5zaWduZWQgY2hhciBkYXRhKQotewotCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7Ci0Jc3RydWN0IGRzMTM5MCAqY2hpcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JLyogU2V0IE1TQiB0byBpbmRpY2F0ZSB3cml0ZSAqLwotCWNoaXAtPnR4cnhfYnVmWzBdID0gYWRkcmVzcyB8IDB4ODA7Ci0JY2hpcC0+dHhyeF9idWZbMV0gPSBkYXRhOwotCi0JLyogZG8gdGhlIGkvbyAqLwotCXNwaV93cml0ZV90aGVuX3JlYWQoc3BpLCBjaGlwLT50eHJ4X2J1ZiwgMiwgTlVMTCwgMCk7Ci19Ci0KIHN0YXRpYyBpbnQgZHMxMzkwX2dldF9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyIGFkZHJlc3MsCiAJCQkJdW5zaWduZWQgY2hhciAqZGF0YSkKIHsKQEAgLTc4LDcgKzY2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkczEzOTBfZ2V0X2RhdGV0aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICpkdCkKK3N0YXRpYyBpbnQgZHMxMzkwX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqZHQpCiB7CiAJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgZHMxMzkwICpjaGlwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CkBAIC0xMDcsNyArOTUsNyBAQAogCXJldHVybiBydGNfdmFsaWRfdG0oZHQpOwogfQogCi1zdGF0aWMgaW50IGRzMTM5MF9zZXRfZGF0ZXRpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKmR0KQorc3RhdGljIGludCBkczEzOTBfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKmR0KQogewogCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7CiAJc3RydWN0IGRzMTM5MCAqY2hpcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwpAQCAtMTI3LDE2ICsxMTUsNiBAQAogCXJldHVybiBzcGlfd3JpdGVfdGhlbl9yZWFkKHNwaSwgY2hpcC0+dHhyeF9idWYsIDgsIE5VTEwsIDApOwogfQogCi1zdGF0aWMgaW50IGRzMTM5MF9yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQotewotCXJldHVybiBkczEzOTBfZ2V0X2RhdGV0aW1lKGRldiwgdG0pOwotfQotCi1zdGF0aWMgaW50IGRzMTM5MF9zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCi17Ci0JcmV0dXJuIGRzMTM5MF9zZXRfZGF0ZXRpbWUoZGV2LCB0bSk7Ci19Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBkczEzOTBfcnRjX29wcyA9IHsKIAkucmVhZF90aW1lCT0gZHMxMzkwX3JlYWRfdGltZSwKIAkuc2V0X3RpbWUJPSBkczEzOTBfc2V0X3RpbWUsCkBAIC0xNDksNDYgKzEyNyw0MCBAQAogCXN0cnVjdCBkczEzOTAgKmNoaXA7CiAJaW50IHJlczsKIAotCXByaW50ayhLRVJOX0RFQlVHICJEUzEzOTAgU1BJIFJUQyBkcml2ZXJcbiIpOwotCi0JcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcigiZHMxMzkwIiwKLQkJCQkmc3BpLT5kZXYsICZkczEzOTBfcnRjX29wcywgVEhJU19NT0RVTEUpOwotCWlmIChJU19FUlIocnRjKSkgewotCQlwcmludGsoS0VSTl9BTEVSVCAiUlRDIDogdW5hYmxlIHRvIHJlZ2lzdGVyIGRldmljZVxuIik7Ci0JCXJldHVybiBQVFJfRVJSKHJ0Yyk7Ci0JfQotCiAJc3BpLT5tb2RlID0gU1BJX01PREVfMzsKIAlzcGktPmJpdHNfcGVyX3dvcmQgPSA4OwogCXNwaV9zZXR1cChzcGkpOwogCiAJY2hpcCA9IGt6YWxsb2Moc2l6ZW9mICpjaGlwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNoaXApIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgIlJUQyA6IHVuYWJsZSB0byBhbGxvY2F0ZSBkZXZpY2UgbWVtb3J5XG4iKTsKLQkJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAidW5hYmxlIHRvIGFsbG9jYXRlIGRldmljZSBtZW1vcnlcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JY2hpcC0+cnRjID0gcnRjOwogCWRldl9zZXRfZHJ2ZGF0YSgmc3BpLT5kZXYsIGNoaXApOwogCiAJcmVzID0gZHMxMzkwX2dldF9yZWcoJnNwaS0+ZGV2LCBEUzEzOTBfUkVHX1NFQ09ORFMsICZ0bXApOwotCWlmIChyZXMpIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgIlJUQyA6IHVuYWJsZSB0byByZWFkIGRldmljZVxuIik7Ci0JCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOworCWlmIChyZXMgIT0gMCkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgInVuYWJsZSB0byByZWFkIGRldmljZVxuIik7CisJCWtmcmVlKGNoaXApOwogCQlyZXR1cm4gcmVzOwogCX0KIAotCXJldHVybiAwOworCWNoaXAtPnJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoImRzMTM5MCIsCisJCQkJJnNwaS0+ZGV2LCAmZHMxMzkwX3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKGNoaXAtPnJ0YykpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJ1bmFibGUgdG8gcmVnaXN0ZXIgZGV2aWNlXG4iKTsKKwkJcmVzID0gUFRSX0VSUihjaGlwLT5ydGMpOworCQlrZnJlZShjaGlwKTsKKwl9CisKKwlyZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgaW50IF9fZGV2ZXhpdCBkczEzOTBfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJc3RydWN0IGRzMTM5MCAqY2hpcCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHNwaSk7Ci0Jc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IGNoaXAtPnJ0YzsKIAotCWlmIChydGMpCi0JCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOwotCisJcnRjX2RldmljZV91bnJlZ2lzdGVyKGNoaXAtPnJ0Yyk7CiAJa2ZyZWUoY2hpcCk7CiAKIAlyZXR1cm4gMDsKQEAgLTIxNSw2ICsxODcsNiBAQAogfQogbW9kdWxlX2V4aXQoZHMxMzkwX2V4aXQpOwogCi1NT0RVTEVfREVTQ1JJUFRJT04oIkRTMTM5MC85My85NCBTUEkgUlRDIGRyaXZlciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEYWxsYXMvTWF4aW0gRFMxMzkwLzkzLzk0IFNQSSBSVEMgZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJNYXJrIEphY2tzb24gPG1wZmpAbWltYy5jby51az4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1kczE1MTEuYyBiL2RyaXZlcnMvcnRjL3J0Yy1kczE1MTEuYwppbmRleCAyNWNhYWRhLi4wYjZiNzczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtZHMxNTExLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWRzMTUxMS5jCkBAIC0zMjYsOSArMzI2LDkgQEAKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CiAJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKLQlpZiAocGRhdGEtPmlycSA8IDApIHsKKwlpZiAocGRhdGEtPmlycSA8PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisKIAlwZGF0YS0+YWxybV9tZGF5ID0gYWxybS0+dGltZS50bV9tZGF5OwogCXBkYXRhLT5hbHJtX2hvdXIgPSBhbHJtLT50aW1lLnRtX2hvdXI7CiAJcGRhdGEtPmFscm1fbWluID0gYWxybS0+dGltZS50bV9taW47CkBAIC0zNDYsOSArMzQ2LDkgQEAKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CiAJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKLQlpZiAocGRhdGEtPmlycSA8IDApIHsKKwlpZiAocGRhdGEtPmlycSA8PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisKIAlhbHJtLT50aW1lLnRtX21kYXkgPSBwZGF0YS0+YWxybV9tZGF5IDwgMCA/IDAgOiBwZGF0YS0+YWxybV9tZGF5OwogCWFscm0tPnRpbWUudG1faG91ciA9IHBkYXRhLT5hbHJtX2hvdXIgPCAwID8gMCA6IHBkYXRhLT5hbHJtX2hvdXI7CiAJYWxybS0+dGltZS50bV9taW4gPSBwZGF0YS0+YWxybV9taW4gPCAwID8gMCA6IHBkYXRhLT5hbHJtX21pbjsKQEAgLTM4NSw3ICszODUsNyBAQAogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAotCWlmIChwZGF0YS0+aXJxIDwgMCkgeworCWlmIChwZGF0YS0+aXJxIDw9IDApIHsKIAkJcmV0dXJuIC1FTk9JT0NUTENNRDsgLyogZmFsbCBiYWNrIGludG8gcnRjLWRldidzIGVtdWxhdGlvbiAqLwogCX0KIAlzd2l0Y2ggKGNtZCkgewpAQCAtNTAzLDcgKzUwMyw2IEBACiAJaWYgKCFwZGF0YSkgewogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JcGRhdGEtPmlycSA9IC0xOwogCXBkYXRhLT5zaXplID0gcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMTsKIAlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCBwZGF0YS0+c2l6ZSwgcGRldi0+bmFtZSkpIHsKIAkJcmV0ID0gLUVCVVNZOwpAQCAtNTQ1LDEzICs1NDQsMTMgQEAKIAkgKiBpZiB0aGUgcGxhdGZvcm0gaGFzIGFuIGludGVycnVwdCBpbiBtaW5kIGZvciB0aGlzIGRldmljZSwKIAkgKiB0aGVuIGJ5IGFsbCBtZWFucywgc2V0IGl0CiAJICovCi0JaWYgKHBkYXRhLT5pcnEgPj0gMCkgeworCWlmIChwZGF0YS0+aXJxID4gMCkgewogCQlydGNfcmVhZChSVENfQ01EMSk7CiAJCWlmIChyZXF1ZXN0X2lycShwZGF0YS0+aXJxLCBkczE1MTFfaW50ZXJydXB0LAogCQkJSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVELCBwZGV2LT5uYW1lLCBwZGV2KSA8IDApIHsKIAogCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImludGVycnVwdCBub3QgYXZhaWxhYmxlLlxuIik7Ci0JCQlwZGF0YS0+aXJxID0gLTE7CisJCQlwZGF0YS0+aXJxID0gMDsKIAkJfQogCX0KIApAQCAtNTcyLDcgKzU3MSw3IEBACiAJaWYgKHBkYXRhLT5ydGMpIHsKIAkJcnRjX2RldmljZV91bnJlZ2lzdGVyKHBkYXRhLT5ydGMpOwogCX0KLQlpZiAocGRhdGEtPmlycSA+PSAwKSB7CisJaWYgKHBkYXRhLT5pcnEgPiAwKSB7CiAJCWZyZWVfaXJxKHBkYXRhLT5pcnEsIHBkZXYpOwogCX0KIAlpZiAoZHMxNTExX2Jhc2UpIHsKQEAgLTU5NSw3ICs1OTQsNyBAQAogCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmcGRldi0+ZGV2LmtvYmosICZkczE1MTFfbnZyYW1fYXR0cik7CiAJcnRjX2RldmljZV91bnJlZ2lzdGVyKHBkYXRhLT5ydGMpOwogCXBkYXRhLT5ydGMgPSBOVUxMOwotCWlmIChwZGF0YS0+aXJxID49IDApIHsKKwlpZiAocGRhdGEtPmlycSA+IDApIHsKIAkJLyoKIAkJICogZGlzYWJsZSB0aGUgYWxhcm0gaW50ZXJydXB0CiAJCSAqLwpAQCAtNjMxLDcgKzYzMCw3IEBACiAgc3RhdGljIHZvaWQgX19leGl0CiBkczE1MTFfcnRjX2V4aXQodm9pZCkKIHsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmRzMTUxMV9ydGNfZHJpdmVyKTsKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZHMxNTExX3J0Y19kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChkczE1MTFfcnRjX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWRzMTU1My5jIGIvZHJpdmVycy9ydGMvcnRjLWRzMTU1My5jCmluZGV4IGI5NDc1Y2QuLjM4ZDQ3MmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1kczE1NTMuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxNTUzLmMKQEAgLTE2Miw3ICsxNjIsNyBAQAogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAotCWlmIChwZGF0YS0+aXJxIDwgMCkKKwlpZiAocGRhdGEtPmlycSA8PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlwZGF0YS0+YWxybV9tZGF5ID0gYWxybS0+dGltZS50bV9tZGF5OwogCXBkYXRhLT5hbHJtX2hvdXIgPSBhbHJtLT50aW1lLnRtX2hvdXI7CkBAIC0xNzksNyArMTc5LDcgQEAKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CiAJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKLQlpZiAocGRhdGEtPmlycSA8IDApCisJaWYgKHBkYXRhLT5pcnEgPD0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJYWxybS0+dGltZS50bV9tZGF5ID0gcGRhdGEtPmFscm1fbWRheSA8IDAgPyAwIDogcGRhdGEtPmFscm1fbWRheTsKIAlhbHJtLT50aW1lLnRtX2hvdXIgPSBwZGF0YS0+YWxybV9ob3VyIDwgMCA/IDAgOiBwZGF0YS0+YWxybV9ob3VyOwpAQCAtMjEzLDcgKzIxMyw3IEBACiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwogCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCi0JaWYgKHBkYXRhLT5pcnEgPCAwKQorCWlmIChwZGF0YS0+aXJxIDw9IDApCiAJCXJldHVybiAtRU5PSU9DVExDTUQ7IC8qIGZhbGwgYmFjayBpbnRvIHJ0Yy1kZXYncyBlbXVsYXRpb24gKi8KIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgUlRDX0FJRV9PRkY6CkBAIC0zMDEsNyArMzAxLDYgQEAKIAlwZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpwZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghcGRhdGEpCiAJCXJldHVybiAtRU5PTUVNOwotCXBkYXRhLT5pcnEgPSAtMTsKIAlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCBSVENfUkVHX1NJWkUsIHBkZXYtPm5hbWUpKSB7CiAJCXJldCA9IC1FQlVTWTsKIAkJZ290byBvdXQ7CkBAIC0zMjcsMTMgKzMyNiwxMyBAQAogCWlmIChyZWFkYihpb2FkZHIgKyBSVENfRkxBR1MpICYgUlRDX0ZMQUdTX0JMRikKIAkJZGV2X3dhcm4oJnBkZXYtPmRldiwgInZvbHRhZ2UtbG93IGRldGVjdGVkLlxuIik7CiAKLQlpZiAocGRhdGEtPmlycSA+PSAwKSB7CisJaWYgKHBkYXRhLT5pcnEgPiAwKSB7CiAJCXdyaXRlYigwLCBpb2FkZHIgKyBSVENfSU5URVJSVVBUUyk7CiAJCWlmIChyZXF1ZXN0X2lycShwZGF0YS0+aXJxLCBkczE1NTNfcnRjX2ludGVycnVwdCwKIAkJCQlJUlFGX0RJU0FCTEVEIHwgSVJRRl9TSEFSRUQsCiAJCQkJcGRldi0+bmFtZSwgcGRldikgPCAwKSB7CiAJCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiaW50ZXJydXB0IG5vdCBhdmFpbGFibGUuXG4iKTsKLQkJCXBkYXRhLT5pcnEgPSAtMTsKKwkJCXBkYXRhLT5pcnEgPSAwOwogCQl9CiAJfQogCkBAIC0zNTMsNyArMzUyLDcgQEAKICBvdXQ6CiAJaWYgKHBkYXRhLT5ydGMpCiAJCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihwZGF0YS0+cnRjKTsKLQlpZiAocGRhdGEtPmlycSA+PSAwKQorCWlmIChwZGF0YS0+aXJxID4gMCkKIAkJZnJlZV9pcnEocGRhdGEtPmlycSwgcGRldik7CiAJaWYgKGlvYWRkcikKIAkJaW91bm1hcChpb2FkZHIpOwpAQCAtMzY5LDcgKzM2OCw3IEBACiAKIAlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJnBkZXYtPmRldi5rb2JqLCAmZHMxNTUzX252cmFtX2F0dHIpOwogCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihwZGF0YS0+cnRjKTsKLQlpZiAocGRhdGEtPmlycSA+PSAwKSB7CisJaWYgKHBkYXRhLT5pcnEgPiAwKSB7CiAJCXdyaXRlYigwLCBwZGF0YS0+aW9hZGRyICsgUlRDX0lOVEVSUlVQVFMpOwogCQlmcmVlX2lycShwZGF0YS0+aXJxLCBwZGV2KTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtZHMxNjcyLmMgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxNjcyLmMKaW5kZXggNGU5MTQxOS4uMDZkZmI1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWRzMTY3Mi5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1kczE2NzIuYwpAQCAtODMsMzIgKzgzLDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZHMxNjcyX3NldF9kYXRldGltZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQotewotCXVuc2lnbmVkIGxvbmcgc2VjczsKLQotCWRldl9kYmcoJmNsaWVudC0+ZGV2LAotCQkiJXM6IHNlY3M9JWQsIG1pbnM9JWQsIGhvdXJzPSVkLCAiCi0JCSJtZGF5PSVkLCBtb249JWQsIHllYXI9JWQsIHdkYXk9JWRcbiIsCi0JCV9fZnVuY19fLAotCQl0bS0+dG1fc2VjLCB0bS0+dG1fbWluLCB0bS0+dG1faG91ciwKLQkJdG0tPnRtX21kYXksIHRtLT50bV9tb24sIHRtLT50bV95ZWFyLCB0bS0+dG1fd2RheSk7Ci0KLQlydGNfdG1fdG9fdGltZSh0bSwgJnNlY3MpOwotCi0JcmV0dXJuIGRzMTY3Ml9zZXRfbW1zcyhjbGllbnQsIHNlY3MpOwotfQotCiBzdGF0aWMgaW50IGRzMTY3Ml9ydGNfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKIHsKIAlyZXR1cm4gZHMxNjcyX2dldF9kYXRldGltZSh0b19pMmNfY2xpZW50KGRldiksIHRtKTsKIH0KIAotc3RhdGljIGludCBkczE2NzJfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKLXsKLQlyZXR1cm4gZHMxNjcyX3NldF9kYXRldGltZSh0b19pMmNfY2xpZW50KGRldiksIHRtKTsKLX0KLQogc3RhdGljIGludCBkczE2NzJfcnRjX3NldF9tbXNzKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBzZWNzKQogewogCXJldHVybiBkczE2NzJfc2V0X21tc3ModG9faTJjX2NsaWVudChkZXYpLCBzZWNzKTsKQEAgLTE1Miw3ICsxMzEsNiBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgZHMxNjcyX3J0Y19vcHMgPSB7CiAJLnJlYWRfdGltZSA9IGRzMTY3Ml9ydGNfcmVhZF90aW1lLAotCS5zZXRfdGltZSA9IGRzMTY3Ml9ydGNfc2V0X3RpbWUsCiAJLnNldF9tbXNzID0gZHMxNjcyX3J0Y19zZXRfbW1zcywKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1kczMyMzQuYyBiL2RyaXZlcnMvcnRjL3J0Yy1kczMyMzQuYwppbmRleCA0NWU1YjEwLi5jNTE1ODllIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtZHMzMjM0LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWRzMzIzNC5jCkBAIC0xLDQgKzEsNCBAQAotLyogZHJpdmVycy9ydGMvcnRjLWRzMzIzNC5jCisvKiBydGMtZHMzMjM0LmMKICAqCiAgKiBEcml2ZXIgZm9yIERhbGxhcyBTZW1pY29uZHVjdG9yIChEUzMyMzQpIFNQSSBSVEMgd2l0aCBJbnRlZ3JhdGVkIENyeXN0YWwKICAqIGFuZCBTUkFNLgpAQCAtOSwxMyArOSwxMCBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqIENoYW5nZWxvZzoKLSAqCi0gKiAwNy1NYXktMjAwODogRGVubmlzIEFiZXJpbGxhIDxkZW56enpob21lQHlhaG9vLmNvbT4KLSAqCQktIENyZWF0ZWQgYmFzZWQgb24gdGhlIG1heDY5MDIgY29kZS4gT25seSBpbXBsZW1lbnRzIHRoZQotICoJCSAgZGF0ZS90aW1lIGtlZXBpbmcgZnVuY3Rpb25zOyBubyBTUkFNIHlldC4KICAqLwogCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgpAQCAtMzQsMTYgKzMxLDcgQEAKICNkZWZpbmUgRFMzMjM0X1JFR19DT05UUk9MCTB4MEUKICNkZWZpbmUgRFMzMjM0X1JFR19DT05UX1NUQVQJMHgwRgogCi0jdW5kZWYgRFMzMjM0X0RFQlVHCi0KLXN0cnVjdCBkczMyMzQgewotCXN0cnVjdCBydGNfZGV2aWNlICpydGM7Ci0JdTggYnVmWzhdOyAvKiBCdXJzdCByZWFkOiBhZGRyICsgNyByZWdzICovCi0JdTggdHhfYnVmWzJdOwotCXU4IHJ4X2J1ZlsyXTsKLX07Ci0KLXN0YXRpYyB2b2lkIGRzMzIzNF9zZXRfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciBhZGRyZXNzLAorc3RhdGljIGludCBkczMyMzRfc2V0X3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgYWRkcmVzcywKIAkJCQl1bnNpZ25lZCBjaGFyIGRhdGEpCiB7CiAJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKQEAgLTUzLDEwNyArNDEsNDUgQEAKIAlidWZbMF0gPSBhZGRyZXNzIHwgMHg4MDsKIAlidWZbMV0gPSBkYXRhOwogCi0Jc3BpX3dyaXRlKHNwaSwgYnVmLCAyKTsKKwlyZXR1cm4gc3BpX3dyaXRlX3RoZW5fcmVhZChzcGksIGJ1ZiwgMiwgTlVMTCwgMCk7CiB9CiAKIHN0YXRpYyBpbnQgZHMzMjM0X2dldF9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyIGFkZHJlc3MsCiAJCQkJdW5zaWduZWQgY2hhciAqZGF0YSkKIHsKIAlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOwotCXN0cnVjdCBkczMyMzQgKmNoaXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbWVzc2FnZTsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXI7Ci0JaW50IHN0YXR1czsKIAotCWlmICghZGF0YSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJKmRhdGEgPSBhZGRyZXNzICYgMHg3ZjsKIAotCS8qIEJ1aWxkIG91ciBzcGkgbWVzc2FnZSAqLwotCXNwaV9tZXNzYWdlX2luaXQoJm1lc3NhZ2UpOwotCW1lbXNldCgmeGZlciwgMCwgc2l6ZW9mKHhmZXIpKTsKLQotCS8qIEFkZHJlc3MgKyBkdW1teSB0eCBieXRlICovCi0JeGZlci5sZW4gPSAyOwotCXhmZXIudHhfYnVmID0gY2hpcC0+dHhfYnVmOwotCXhmZXIucnhfYnVmID0gY2hpcC0+cnhfYnVmOwotCi0JY2hpcC0+dHhfYnVmWzBdID0gYWRkcmVzczsKLQljaGlwLT50eF9idWZbMV0gPSAweGZmOwotCi0Jc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtZXNzYWdlKTsKLQotCS8qIGRvIHRoZSBpL28gKi8KLQlzdGF0dXMgPSBzcGlfc3luYyhzcGksICZtZXNzYWdlKTsKLQlpZiAoc3RhdHVzID09IDApCi0JCXN0YXR1cyA9IG1lc3NhZ2Uuc3RhdHVzOwotCWVsc2UKLQkJcmV0dXJuIHN0YXR1czsKLQotCSpkYXRhID0gY2hpcC0+cnhfYnVmWzFdOwotCi0JcmV0dXJuIHN0YXR1czsKKwlyZXR1cm4gc3BpX3dyaXRlX3RoZW5fcmVhZChzcGksIGRhdGEsIDEsIGRhdGEsIDEpOwogfQogCi1zdGF0aWMgaW50IGRzMzIzNF9nZXRfZGF0ZXRpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKmR0KQorc3RhdGljIGludCBkczMyMzRfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICpkdCkKIHsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGNoYXIgYnVmWzhdOwogCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7Ci0Jc3RydWN0IGRzMzIzNCAqY2hpcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBzcGlfbWVzc2FnZSBtZXNzYWdlOwotCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcjsKLQlpbnQgc3RhdHVzOwogCi0JLyogYnVpbGQgdGhlIG1lc3NhZ2UgKi8KLQlzcGlfbWVzc2FnZV9pbml0KCZtZXNzYWdlKTsKLQltZW1zZXQoJnhmZXIsIDAsIHNpemVvZih4ZmVyKSk7Ci0JeGZlci5sZW4gPSAxICsgNzsJLyogQWRkciArIDcgcmVnaXN0ZXJzICovCi0JeGZlci50eF9idWYgPSBjaGlwLT5idWY7Ci0JeGZlci5yeF9idWYgPSBjaGlwLT5idWY7Ci0JY2hpcC0+YnVmWzBdID0gMHgwMDsJLyogU3RhcnQgYWRkcmVzcyAqLwotCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbWVzc2FnZSk7CisJYnVmWzBdID0gMHgwMDsgLyogU3RhcnQgYWRkcmVzcyAqLwogCi0JLyogZG8gdGhlIGkvbyAqLwotCXN0YXR1cyA9IHNwaV9zeW5jKHNwaSwgJm1lc3NhZ2UpOwotCWlmIChzdGF0dXMgPT0gMCkKLQkJc3RhdHVzID0gbWVzc2FnZS5zdGF0dXM7Ci0JZWxzZQotCQlyZXR1cm4gc3RhdHVzOworCWVyciA9IHNwaV93cml0ZV90aGVuX3JlYWQoc3BpLCBidWYsIDEsIGJ1ZiwgOCk7CisJaWYgKGVyciAhPSAwKQorCQlyZXR1cm4gZXJyOwogCiAJLyogU2Vjb25kcywgTWludXRlcywgSG91cnMsIERheSwgRGF0ZSwgTW9udGgsIFllYXIgKi8KLQlkdC0+dG1fc2VjCT0gYmNkMmJpbihjaGlwLT5idWZbMV0pOwotCWR0LT50bV9taW4JPSBiY2QyYmluKGNoaXAtPmJ1ZlsyXSk7Ci0JZHQtPnRtX2hvdXIJPSBiY2QyYmluKGNoaXAtPmJ1ZlszXSAmIDB4M2YpOwotCWR0LT50bV93ZGF5CT0gYmNkMmJpbihjaGlwLT5idWZbNF0pIC0gMTsgLyogMCA9IFN1biAqLwotCWR0LT50bV9tZGF5CT0gYmNkMmJpbihjaGlwLT5idWZbNV0pOwotCWR0LT50bV9tb24JPSBiY2QyYmluKGNoaXAtPmJ1Zls2XSAmIDB4MWYpIC0gMTsgLyogMCA9IEphbiAqLwotCWR0LT50bV95ZWFyIAk9IGJjZDJiaW4oY2hpcC0+YnVmWzddICYgMHhmZikgKyAxMDA7IC8qIEFzc3VtZSAyMFlZICovCisJZHQtPnRtX3NlYwk9IGJjZDJiaW4oYnVmWzBdKTsKKwlkdC0+dG1fbWluCT0gYmNkMmJpbihidWZbMV0pOworCWR0LT50bV9ob3VyCT0gYmNkMmJpbihidWZbMl0gJiAweDNmKTsKKwlkdC0+dG1fd2RheQk9IGJjZDJiaW4oYnVmWzNdKSAtIDE7IC8qIDAgPSBTdW4gKi8KKwlkdC0+dG1fbWRheQk9IGJjZDJiaW4oYnVmWzRdKTsKKwlkdC0+dG1fbW9uCT0gYmNkMmJpbihidWZbNV0gJiAweDFmKSAtIDE7IC8qIDAgPSBKYW4gKi8KKwlkdC0+dG1feWVhciAJPSBiY2QyYmluKGJ1Zls2XSAmIDB4ZmYpICsgMTAwOyAvKiBBc3N1bWUgMjBZWSAqLwogCi0jaWZkZWYgRFMzMjM0X0RFQlVHCi0JZGV2X2RiZyhkZXYsICJcbiVzIDogUmVhZCBSVEMgdmFsdWVzXG4iLCBfX2Z1bmNfXyk7Ci0JZGV2X2RiZyhkZXYsICJ0bV9ob3VyOiAlaVxuIiwgZHQtPnRtX2hvdXIpOwotCWRldl9kYmcoZGV2LCAidG1fbWluIDogJWlcbiIsIGR0LT50bV9taW4pOwotCWRldl9kYmcoZGV2LCAidG1fc2VjIDogJWlcbiIsIGR0LT50bV9zZWMpOwotCWRldl9kYmcoZGV2LCAidG1fd2RheTogJWlcbiIsIGR0LT50bV93ZGF5KTsKLQlkZXZfZGJnKGRldiwgInRtX21kYXk6ICVpXG4iLCBkdC0+dG1fbWRheSk7Ci0JZGV2X2RiZyhkZXYsICJ0bV9tb24gOiAlaVxuIiwgZHQtPnRtX21vbik7Ci0JZGV2X2RiZyhkZXYsICJ0bV95ZWFyOiAlaVxuIiwgZHQtPnRtX3llYXIpOwotI2VuZGlmCi0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gcnRjX3ZhbGlkX3RtKGR0KTsKIH0KIAotc3RhdGljIGludCBkczMyMzRfc2V0X2RhdGV0aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICpkdCkKK3N0YXRpYyBpbnQgZHMzMjM0X3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICpkdCkKIHsKLSNpZmRlZiBEUzMyMzRfREVCVUcKLQlkZXZfZGJnKGRldiwgIlxuJXMgOiBTZXR0aW5nIFJUQyB2YWx1ZXNcbiIsIF9fZnVuY19fKTsKLQlkZXZfZGJnKGRldiwgInRtX3NlYyA6ICVpXG4iLCBkdC0+dG1fc2VjKTsKLQlkZXZfZGJnKGRldiwgInRtX21pbiA6ICVpXG4iLCBkdC0+dG1fbWluKTsKLQlkZXZfZGJnKGRldiwgInRtX2hvdXI6ICVpXG4iLCBkdC0+dG1faG91cik7Ci0JZGV2X2RiZyhkZXYsICJ0bV93ZGF5OiAlaVxuIiwgZHQtPnRtX3dkYXkpOwotCWRldl9kYmcoZGV2LCAidG1fbWRheTogJWlcbiIsIGR0LT50bV9tZGF5KTsKLQlkZXZfZGJnKGRldiwgInRtX21vbiA6ICVpXG4iLCBkdC0+dG1fbW9uKTsKLQlkZXZfZGJnKGRldiwgInRtX3llYXI6ICVpXG4iLCBkdC0+dG1feWVhcik7Ci0jZW5kaWYKLQogCWRzMzIzNF9zZXRfcmVnKGRldiwgRFMzMjM0X1JFR19TRUNPTkRTLCBiaW4yYmNkKGR0LT50bV9zZWMpKTsKIAlkczMyMzRfc2V0X3JlZyhkZXYsIERTMzIzNF9SRUdfTUlOVVRFUywgYmluMmJjZChkdC0+dG1fbWluKSk7CiAJZHMzMjM0X3NldF9yZWcoZGV2LCBEUzMyMzRfUkVHX0hPVVJTLCBiaW4yYmNkKGR0LT50bV9ob3VyKSAmIDB4M2YpOwpAQCAtMTc0LDE2ICsxMDAsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRzMzIzNF9yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQotewotCXJldHVybiBkczMyMzRfZ2V0X2RhdGV0aW1lKGRldiwgdG0pOwotfQotCi1zdGF0aWMgaW50IGRzMzIzNF9zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCi17Ci0JcmV0dXJuIGRzMzIzNF9zZXRfZGF0ZXRpbWUoZGV2LCB0bSk7Ci19Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBkczMyMzRfcnRjX29wcyA9IHsKIAkucmVhZF90aW1lCT0gZHMzMjM0X3JlYWRfdGltZSwKIAkuc2V0X3RpbWUJPSBkczMyMzRfc2V0X3RpbWUsCkBAIC0xOTMsMzEgKzEwOSwxNSBAQAogewogCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CiAJdW5zaWduZWQgY2hhciB0bXA7Ci0Jc3RydWN0IGRzMzIzNCAqY2hpcDsKIAlpbnQgcmVzOwogCi0JcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcigiZHMzMjM0IiwKLQkJCQkmc3BpLT5kZXYsICZkczMyMzRfcnRjX29wcywgVEhJU19NT0RVTEUpOwotCWlmIChJU19FUlIocnRjKSkKLQkJcmV0dXJuIFBUUl9FUlIocnRjKTsKLQogCXNwaS0+bW9kZSA9IFNQSV9NT0RFXzM7CiAJc3BpLT5iaXRzX3Blcl93b3JkID0gODsKIAlzcGlfc2V0dXAoc3BpKTsKIAotCWNoaXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHMzMjM0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjaGlwKSB7Ci0JCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JY2hpcC0+cnRjID0gcnRjOwotCWRldl9zZXRfZHJ2ZGF0YSgmc3BpLT5kZXYsIGNoaXApOwotCiAJcmVzID0gZHMzMjM0X2dldF9yZWcoJnNwaS0+ZGV2LCBEUzMyMzRfUkVHX1NFQ09ORFMsICZ0bXApOwotCWlmIChyZXMpIHsKLQkJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CisJaWYgKHJlcyAhPSAwKQogCQlyZXR1cm4gcmVzOwotCX0KIAogCS8qIENvbnRyb2wgc2V0dGluZ3MKIAkgKgpAQCAtMjQ2LDI2ICsxNDYsMjcgQEAKIAlkczMyMzRfZ2V0X3JlZygmc3BpLT5kZXYsIERTMzIzNF9SRUdfQ09OVF9TVEFULCAmdG1wKTsKIAlkZXZfaW5mbygmc3BpLT5kZXYsICJDdHJsL1N0YXQgUmVnOiAweCUwMnhcbiIsIHRtcCk7CiAKKwlydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJkczMyMzQiLAorCQkJCSZzcGktPmRldiwgJmRzMzIzNF9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihydGMpKQorCQlyZXR1cm4gUFRSX0VSUihydGMpOworCisJZGV2X3NldF9kcnZkYXRhKCZzcGktPmRldiwgcnRjKTsKKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IF9fZGV2ZXhpdCBkczMyMzRfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7Ci0Jc3RydWN0IGRzMzIzNCAqY2hpcCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHNwaSk7Ci0Jc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IGNoaXAtPnJ0YzsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoc3BpKTsKIAotCWlmIChydGMpCi0JCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOwotCi0Ja2ZyZWUoY2hpcCk7Ci0KKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGRzMzIzNF9kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUJID0gImRzMzIzNCIsCi0JCS5idXMJPSAmc3BpX2J1c190eXBlLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAl9LAogCS5wcm9iZQkgPSBkczMyMzRfcHJvYmUsCkBAIC0yNzQsNyArMTc1LDYgQEAKIAogc3RhdGljIF9faW5pdCBpbnQgZHMzMjM0X2luaXQodm9pZCkKIHsKLQlwcmludGsoS0VSTl9JTkZPICJEUzMyMzQgU1BJIFJUQyBEcml2ZXJcbiIpOwogCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZkczMyMzRfZHJpdmVyKTsKIH0KIG1vZHVsZV9pbml0KGRzMzIzNF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1lcDkzeHguYyBiL2RyaXZlcnMvcnRjL3J0Yy1lcDkzeHguYwppbmRleCAzNmU0YWMwLi5mN2EzMjgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtZXA5M3h4LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWVwOTN4eC5jCkBAIC00OSwxOCArNDksNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGVwOTN4eF9ydGNfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQotewotCWludCBlcnI7Ci0JdW5zaWduZWQgbG9uZyBzZWNzOwotCi0JZXJyID0gcnRjX3RtX3RvX3RpbWUodG0sICZzZWNzKTsKLQlpZiAoZXJyICE9IDApCi0JCXJldHVybiBlcnI7Ci0KLQlyZXR1cm4gZXA5M3h4X3J0Y19zZXRfbW1zcyhkZXYsIHNlY3MpOwotfQotCiBzdGF0aWMgaW50IGVwOTN4eF9ydGNfcHJvYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzZXFfZmlsZSAqc2VxKQogewogCXVuc2lnbmVkIHNob3J0IHByZWxvYWQsIGRlbGV0ZTsKQEAgLTc1LDcgKzYzLDYgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIGVwOTN4eF9ydGNfb3BzID0gewogCS5yZWFkX3RpbWUJPSBlcDkzeHhfcnRjX3JlYWRfdGltZSwKLQkuc2V0X3RpbWUJPSBlcDkzeHhfcnRjX3NldF90aW1lLAogCS5zZXRfbW1zcwk9IGVwOTN4eF9ydGNfc2V0X21tc3MsCiAJLnByb2MJCT0gZXA5M3h4X3J0Y19wcm9jLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1tNDh0NTkuYyBiL2RyaXZlcnMvcnRjL3J0Yy1tNDh0NTkuYwppbmRleCA0M2FmYjdhLi4zMzkyMWE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtbTQ4dDU5LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLW00OHQ1OS5jCkBAIC00NTAsNyArNDUwLDcgQEAKIAkgKiB0aGUgbW9kZSB3aXRob3V0IElSUS4KIAkgKi8KIAltNDh0NTktPmlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7Ci0JaWYgKG00OHQ1OS0+aXJxIDwgMCkKKwlpZiAobTQ4dDU5LT5pcnEgPD0gMCkKIAkJbTQ4dDU5LT5pcnEgPSBOT19JUlE7CiAKIAlpZiAobTQ4dDU5LT5pcnEgIT0gTk9fSVJRKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtbWF4NjkwMi5jIGIvZHJpdmVycy9ydGMvcnRjLW1heDY5MDIuYwppbmRleCAyZjY1MDdkLi4zNmE4ZWE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtbWF4NjkwMi5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1tYXg2OTAyLmMKQEAgLTksMTQgKzksNiBAQAogICoKICAqIERyaXZlciBmb3IgTUFYNjkwMiBzcGkgUlRDCiAgKgotICogQ2hhbmdlbG9nOgotICoKLSAqIDI0LU1heS0yMDA2OiBSYXBoYWVsIEFzc2VuYXQgPHJhcGhAOGQuY29tPgotICogICAgICAgICAgICAgICAgLSBNYWpvciByZXdvcmsKLSAqCQkJCUNvbnZlcnRlZCB0byBydGNfZGV2aWNlIGFuZCB1c2VzIHRoZSBTUEkgbGF5ZXIuCi0gKgotICogPz8tPz8/LTIwMDU6IFNvbWVvbmUgYXQgQ29tcHVsYWIKLSAqICAgICAgICAgICAgICAgIC0gSW5pdGlhbCBkcml2ZXIgY3JlYXRpb24uCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMjYsNyArMTgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9iY2QuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCiAjZGVmaW5lIE1BWDY5MDJfUkVHX1NFQ09ORFMJCTB4MDEKICNkZWZpbmUgTUFYNjkwMl9SRUdfTUlOVVRFUwkJMHgwMwpAQCAtMzgsMTYgKzI5LDcgQEAKICNkZWZpbmUgTUFYNjkwMl9SRUdfQ09OVFJPTAkJMHgwRgogI2RlZmluZSBNQVg2OTAyX1JFR19DRU5UVVJZCQkweDEzCiAKLSN1bmRlZiBNQVg2OTAyX0RFQlVHCi0KLXN0cnVjdCBtYXg2OTAyIHsKLQlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOwotCXU4IGJ1Zls5XTsgLyogQnVyc3QgcmVhZCBjbWQgKyA4IHJlZ2lzdGVycyAqLwotCXU4IHR4X2J1ZlsyXTsKLQl1OCByeF9idWZbMl07Ci19OwotCi1zdGF0aWMgdm9pZCBtYXg2OTAyX3NldF9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyIGFkZHJlc3MsCitzdGF0aWMgaW50IG1heDY5MDJfc2V0X3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgYWRkcmVzcywKIAkJCQl1bnNpZ25lZCBjaGFyIGRhdGEpCiB7CiAJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKQEAgLTU3LDExMyArMzksNTggQEAKIAlidWZbMF0gPSBhZGRyZXNzICYgMHg3ZjsKIAlidWZbMV0gPSBkYXRhOwogCi0Jc3BpX3dyaXRlKHNwaSwgYnVmLCAyKTsKKwlyZXR1cm4gc3BpX3dyaXRlX3RoZW5fcmVhZChzcGksIGJ1ZiwgMiwgTlVMTCwgMCk7CiB9CiAKIHN0YXRpYyBpbnQgbWF4NjkwMl9nZXRfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciBhZGRyZXNzLAogCQkJCXVuc2lnbmVkIGNoYXIgKmRhdGEpCiB7CiAJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKLQlzdHJ1Y3QgbWF4NjkwMiAqY2hpcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBzcGlfbWVzc2FnZSBtZXNzYWdlOwotCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcjsKLQlpbnQgc3RhdHVzOwotCi0JaWYgKCFkYXRhKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIEJ1aWxkIG91ciBzcGkgbWVzc2FnZSAqLwotCXNwaV9tZXNzYWdlX2luaXQoJm1lc3NhZ2UpOwotCW1lbXNldCgmeGZlciwgMCwgc2l6ZW9mKHhmZXIpKTsKLQl4ZmVyLmxlbiA9IDI7Ci0JLyogQ2FuIHR4X2J1ZiBhbmQgcnhfYnVmIGJlIGVxdWFsPyBUaGUgZG9jIGluIHNwaS5oIGlzIG5vdCBzdXJlLi4uICovCi0JeGZlci50eF9idWYgPSBjaGlwLT50eF9idWY7Ci0JeGZlci5yeF9idWYgPSBjaGlwLT5yeF9idWY7CiAKIAkvKiBTZXQgTVNCIHRvIGluZGljYXRlIHJlYWQgKi8KLQljaGlwLT50eF9idWZbMF0gPSBhZGRyZXNzIHwgMHg4MDsKKwkqZGF0YSA9IGFkZHJlc3MgfCAweDgwOwogCi0Jc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtZXNzYWdlKTsKLQotCS8qIGRvIHRoZSBpL28gKi8KLQlzdGF0dXMgPSBzcGlfc3luYyhzcGksICZtZXNzYWdlKTsKLQotCWlmIChzdGF0dXMgPT0gMCkKLQkJKmRhdGEgPSBjaGlwLT5yeF9idWZbMV07Ci0JcmV0dXJuIHN0YXR1czsKKwlyZXR1cm4gc3BpX3dyaXRlX3RoZW5fcmVhZChzcGksIGRhdGEsIDEsIGRhdGEsIDEpOwogfQogCi1zdGF0aWMgaW50IG1heDY5MDJfZ2V0X2RhdGV0aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICpkdCkKK3N0YXRpYyBpbnQgbWF4NjkwMl9yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKmR0KQogewotCXVuc2lnbmVkIGNoYXIgdG1wOwotCWludCBjZW50dXJ5OwotCWludCBlcnI7CisJaW50IGVyciwgY2VudHVyeTsKIAlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOwotCXN0cnVjdCBtYXg2OTAyICpjaGlwID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IHNwaV9tZXNzYWdlIG1lc3NhZ2U7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyOwotCWludCBzdGF0dXM7CisJdW5zaWduZWQgY2hhciBidWZbOF07CiAKLQllcnIgPSBtYXg2OTAyX2dldF9yZWcoZGV2LCBNQVg2OTAyX1JFR19DRU5UVVJZLCAmdG1wKTsKLQlpZiAoZXJyKQorCWJ1ZlswXSA9IDB4YmY7CS8qIEJ1cnN0IHJlYWQgKi8KKworCWVyciA9IHNwaV93cml0ZV90aGVuX3JlYWQoc3BpLCBidWYsIDEsIGJ1ZiwgOCk7CisJaWYgKGVyciAhPSAwKQogCQlyZXR1cm4gZXJyOwogCi0JLyogYnVpbGQgdGhlIG1lc3NhZ2UgKi8KLQlzcGlfbWVzc2FnZV9pbml0KCZtZXNzYWdlKTsKLQltZW1zZXQoJnhmZXIsIDAsIHNpemVvZih4ZmVyKSk7Ci0JeGZlci5sZW4gPSAxICsgNzsJLyogQnVyc3QgcmVhZCBjb21tYW5kICsgNyByZWdpc3RlcnMgKi8KLQl4ZmVyLnR4X2J1ZiA9IGNoaXAtPmJ1ZjsKLQl4ZmVyLnJ4X2J1ZiA9IGNoaXAtPmJ1ZjsKLQljaGlwLT5idWZbMF0gPSAweGJmOwkvKiBCdXJzdCByZWFkICovCi0Jc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtZXNzYWdlKTsKLQotCS8qIGRvIHRoZSBpL28gKi8KLQlzdGF0dXMgPSBzcGlfc3luYyhzcGksICZtZXNzYWdlKTsKLQlpZiAoc3RhdHVzKQotCQlyZXR1cm4gc3RhdHVzOwotCiAJLyogVGhlIGNoaXAgc2VuZHMgZGF0YSBpbiB0aGlzIG9yZGVyOgogCSAqIFNlY29uZHMsIE1pbnV0ZXMsIEhvdXJzLCBEYXRlLCBNb250aCwgRGF5LCBZZWFyICovCi0JZHQtPnRtX3NlYwk9IGJjZDJiaW4oY2hpcC0+YnVmWzFdKTsKLQlkdC0+dG1fbWluCT0gYmNkMmJpbihjaGlwLT5idWZbMl0pOwotCWR0LT50bV9ob3VyCT0gYmNkMmJpbihjaGlwLT5idWZbM10pOwotCWR0LT50bV9tZGF5CT0gYmNkMmJpbihjaGlwLT5idWZbNF0pOwotCWR0LT50bV9tb24JPSBiY2QyYmluKGNoaXAtPmJ1Zls1XSkgLSAxOwotCWR0LT50bV93ZGF5CT0gYmNkMmJpbihjaGlwLT5idWZbNl0pOwotCWR0LT50bV95ZWFyID0gYmNkMmJpbihjaGlwLT5idWZbN10pOworCWR0LT50bV9zZWMJPSBiY2QyYmluKGJ1ZlswXSk7CisJZHQtPnRtX21pbgk9IGJjZDJiaW4oYnVmWzFdKTsKKwlkdC0+dG1faG91cgk9IGJjZDJiaW4oYnVmWzJdKTsKKwlkdC0+dG1fbWRheQk9IGJjZDJiaW4oYnVmWzNdKTsKKwlkdC0+dG1fbW9uCT0gYmNkMmJpbihidWZbNF0pIC0gMTsKKwlkdC0+dG1fd2RheQk9IGJjZDJiaW4oYnVmWzVdKTsKKwlkdC0+dG1feWVhcgk9IGJjZDJiaW4oYnVmWzZdKTsKIAotCWNlbnR1cnkgPSBiY2QyYmluKHRtcCkgKiAxMDA7CisJLyogUmVhZCBjZW50dXJ5ICovCisJZXJyID0gbWF4NjkwMl9nZXRfcmVnKGRldiwgTUFYNjkwMl9SRUdfQ0VOVFVSWSwgJmJ1ZlswXSk7CisJaWYgKGVyciAhPSAwKQorCQlyZXR1cm4gZXJyOworCisJY2VudHVyeSA9IGJjZDJiaW4oYnVmWzBdKSAqIDEwMDsKIAogCWR0LT50bV95ZWFyICs9IGNlbnR1cnk7CiAJZHQtPnRtX3llYXIgLT0gMTkwMDsKIAotI2lmZGVmIE1BWDY5MDJfREVCVUcKLQlwcmludGsoIlxuJXMgOiBSZWFkIFJUQyB2YWx1ZXNcbiIsX19mdW5jX18pOwotCXByaW50aygidG1faG91cjogJWlcbiIsZHQtPnRtX2hvdXIpOwotCXByaW50aygidG1fbWluIDogJWlcbiIsZHQtPnRtX21pbik7Ci0JcHJpbnRrKCJ0bV9zZWMgOiAlaVxuIixkdC0+dG1fc2VjKTsKLQlwcmludGsoInRtX3llYXI6ICVpXG4iLGR0LT50bV95ZWFyKTsKLQlwcmludGsoInRtX21vbiA6ICVpXG4iLGR0LT50bV9tb24pOwotCXByaW50aygidG1fbWRheTogJWlcbiIsZHQtPnRtX21kYXkpOwotCXByaW50aygidG1fd2RheTogJWlcbiIsZHQtPnRtX3dkYXkpOwotI2VuZGlmCi0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gcnRjX3ZhbGlkX3RtKGR0KTsKIH0KIAotc3RhdGljIGludCBtYXg2OTAyX3NldF9kYXRldGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqZHQpCitzdGF0aWMgaW50IG1heDY5MDJfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKmR0KQogewotCWR0LT50bV95ZWFyID0gZHQtPnRtX3llYXIrMTkwMDsKLQotI2lmZGVmIE1BWDY5MDJfREVCVUcKLQlwcmludGsoIlxuJXMgOiBTZXR0aW5nIFJUQyB2YWx1ZXNcbiIsX19mdW5jX18pOwotCXByaW50aygidG1fc2VjIDogJWlcbiIsZHQtPnRtX3NlYyk7Ci0JcHJpbnRrKCJ0bV9taW4gOiAlaVxuIixkdC0+dG1fbWluKTsKLQlwcmludGsoInRtX2hvdXI6ICVpXG4iLGR0LT50bV9ob3VyKTsKLQlwcmludGsoInRtX21kYXk6ICVpXG4iLGR0LT50bV9tZGF5KTsKLQlwcmludGsoInRtX3dkYXk6ICVpXG4iLGR0LT50bV93ZGF5KTsKLQlwcmludGsoInRtX3llYXI6ICVpXG4iLGR0LT50bV95ZWFyKTsKLSNlbmRpZgorCWR0LT50bV95ZWFyID0gZHQtPnRtX3llYXIgKyAxOTAwOwogCiAJLyogUmVtb3ZlIHdyaXRlIHByb3RlY3Rpb24gKi8KIAltYXg2OTAyX3NldF9yZWcoZGV2LCAweEYsIDApOwpAQCAtMTczLDEwICsxMDAsMTAgQEAKIAltYXg2OTAyX3NldF9yZWcoZGV2LCAweDA1LCBiaW4yYmNkKGR0LT50bV9ob3VyKSk7CiAKIAltYXg2OTAyX3NldF9yZWcoZGV2LCAweDA3LCBiaW4yYmNkKGR0LT50bV9tZGF5KSk7Ci0JbWF4NjkwMl9zZXRfcmVnKGRldiwgMHgwOSwgYmluMmJjZChkdC0+dG1fbW9uKzEpKTsKKwltYXg2OTAyX3NldF9yZWcoZGV2LCAweDA5LCBiaW4yYmNkKGR0LT50bV9tb24gKyAxKSk7CiAJbWF4NjkwMl9zZXRfcmVnKGRldiwgMHgwQiwgYmluMmJjZChkdC0+dG1fd2RheSkpOwotCW1heDY5MDJfc2V0X3JlZyhkZXYsIDB4MEQsIGJpbjJiY2QoZHQtPnRtX3llYXIlMTAwKSk7Ci0JbWF4NjkwMl9zZXRfcmVnKGRldiwgMHgxMywgYmluMmJjZChkdC0+dG1feWVhci8xMDApKTsKKwltYXg2OTAyX3NldF9yZWcoZGV2LCAweDBELCBiaW4yYmNkKGR0LT50bV95ZWFyICUgMTAwKSk7CisJbWF4NjkwMl9zZXRfcmVnKGRldiwgMHgxMywgYmluMmJjZChkdC0+dG1feWVhciAvIDEwMCkpOwogCiAJLyogQ29tcHVsYWIgdXNlZCBhIGRlbGF5IGhlcmUuIEhvd2V2ZXIsIHRoZSBkYXRhc2hlZXQKIAkgKiBkb2VzIG5vdCBtZW50aW9uIGEgZGVsYXkgYmVpbmcgcmVxdWlyZWQgYW55d2hlcmUuLi4gKi8KQEAgLTE4OCwxNiArMTE1LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtYXg2OTAyX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCi17Ci0JcmV0dXJuIG1heDY5MDJfZ2V0X2RhdGV0aW1lKGRldiwgdG0pOwotfQotCi1zdGF0aWMgaW50IG1heDY5MDJfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQotewotCXJldHVybiBtYXg2OTAyX3NldF9kYXRldGltZShkZXYsIHRtKTsKLX0KLQogc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIG1heDY5MDJfcnRjX29wcyA9IHsKIAkucmVhZF90aW1lCT0gbWF4NjkwMl9yZWFkX3RpbWUsCiAJLnNldF90aW1lCT0gbWF4NjkwMl9zZXRfdGltZSwKQEAgLTIwNyw0NSArMTI0LDI5IEBACiB7CiAJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKIAl1bnNpZ25lZCBjaGFyIHRtcDsKLQlzdHJ1Y3QgbWF4NjkwMiAqY2hpcDsKIAlpbnQgcmVzOwogCisJc3BpLT5tb2RlID0gU1BJX01PREVfMzsKKwlzcGktPmJpdHNfcGVyX3dvcmQgPSA4OworCXNwaV9zZXR1cChzcGkpOworCisJcmVzID0gbWF4NjkwMl9nZXRfcmVnKCZzcGktPmRldiwgTUFYNjkwMl9SRUdfU0VDT05EUywgJnRtcCk7CisJaWYgKHJlcyAhPSAwKQorCQlyZXR1cm4gcmVzOworCiAJcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcigibWF4NjkwMiIsCiAJCQkJJnNwaS0+ZGV2LCAmbWF4NjkwMl9ydGNfb3BzLCBUSElTX01PRFVMRSk7CiAJaWYgKElTX0VSUihydGMpKQogCQlyZXR1cm4gUFRSX0VSUihydGMpOwogCi0Jc3BpLT5tb2RlID0gU1BJX01PREVfMzsKLQlzcGktPmJpdHNfcGVyX3dvcmQgPSA4OwotCXNwaV9zZXR1cChzcGkpOwotCi0JY2hpcCA9IGt6YWxsb2Moc2l6ZW9mICpjaGlwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNoaXApIHsKLQkJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQljaGlwLT5ydGMgPSBydGM7Ci0JZGV2X3NldF9kcnZkYXRhKCZzcGktPmRldiwgY2hpcCk7Ci0KLQlyZXMgPSBtYXg2OTAyX2dldF9yZWcoJnNwaS0+ZGV2LCBNQVg2OTAyX1JFR19TRUNPTkRTLCAmdG1wKTsKLQlpZiAocmVzKSB7Ci0JCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOwotCQlyZXR1cm4gcmVzOwotCX0KLQogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IF9fZGV2ZXhpdCBtYXg2OTAyX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewotCXN0cnVjdCBtYXg2OTAyICpjaGlwID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoc3BpKTsKLQlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gY2hpcC0+cnRjOworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShzcGkpOwogCi0JaWYgKHJ0YykKLQkJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7Ci0KLQlrZnJlZShjaGlwKTsKLQorCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOwogCXJldHVybiAwOwogfQogCkBAIC0yNjEsNyArMTYyLDYgQEAKIAogc3RhdGljIF9faW5pdCBpbnQgbWF4NjkwMl9pbml0KHZvaWQpCiB7Ci0JcHJpbnRrKCJtYXg2OTAyIHNwaSBkcml2ZXJcbiIpOwogCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZtYXg2OTAyX2RyaXZlcik7CiB9CiBtb2R1bGVfaW5pdChtYXg2OTAyX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLW12LmMgYi9kcml2ZXJzL3J0Yy9ydGMtbXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWYxMmRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ydGMvcnRjLW12LmMKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBEcml2ZXIgZm9yIHRoZSBSVEMgaW4gTWFydmVsbCBTb0NzLgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQorICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworCisjZGVmaW5lIFJUQ19USU1FX1JFR19PRkZTCTAKKyNkZWZpbmUgUlRDX1NFQ09ORFNfT0ZGUwkwCisjZGVmaW5lIFJUQ19NSU5VVEVTX09GRlMJOAorI2RlZmluZSBSVENfSE9VUlNfT0ZGUwkJMTYKKyNkZWZpbmUgUlRDX1dEQVlfT0ZGUwkJMjQKKyNkZWZpbmUgUlRDX0hPVVJTXzEySF9NT0RFCQkoMSA8PCAyMikgLyogMTIgaG91cnMgbW9kZSAqLworCisjZGVmaW5lIFJUQ19EQVRFX1JFR19PRkZTCTQKKyNkZWZpbmUgUlRDX01EQVlfT0ZGUwkJMAorI2RlZmluZSBSVENfTU9OVEhfT0ZGUwkJOAorI2RlZmluZSBSVENfWUVBUl9PRkZTCQkxNgorCisKK3N0cnVjdCBydGNfcGxhdF9kYXRhIHsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCXZvaWQgX19pb21lbSAqaW9hZGRyOworfTsKKworc3RhdGljIGludCBtdl9ydGNfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcGRhdGEtPmlvYWRkcjsKKwl1MzIJcnRjX3JlZzsKKworCXJ0Y19yZWcgPSAoYmluMmJjZCh0bS0+dG1fc2VjKSA8PCBSVENfU0VDT05EU19PRkZTKSB8CisJCShiaW4yYmNkKHRtLT50bV9taW4pIDw8IFJUQ19NSU5VVEVTX09GRlMpIHwKKwkJKGJpbjJiY2QodG0tPnRtX2hvdXIpIDw8IFJUQ19IT1VSU19PRkZTKSB8CisJCShiaW4yYmNkKHRtLT50bV93ZGF5KSA8PCBSVENfV0RBWV9PRkZTKTsKKwl3cml0ZWwocnRjX3JlZywgaW9hZGRyICsgUlRDX1RJTUVfUkVHX09GRlMpOworCisJcnRjX3JlZyA9IChiaW4yYmNkKHRtLT50bV9tZGF5KSA8PCBSVENfTURBWV9PRkZTKSB8CisJCShiaW4yYmNkKHRtLT50bV9tb24gKyAxKSA8PCBSVENfTU9OVEhfT0ZGUykgfAorCQkoYmluMmJjZCh0bS0+dG1feWVhciAlIDEwMCkgPDwgUlRDX1lFQVJfT0ZGUyk7CisJd3JpdGVsKHJ0Y19yZWcsIGlvYWRkciArIFJUQ19EQVRFX1JFR19PRkZTKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG12X3J0Y19yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcGRhdGEtPmlvYWRkcjsKKwl1MzIJcnRjX3RpbWUsIHJ0Y19kYXRlOworCXVuc2lnbmVkIGludCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgd2RheTsKKworCXJ0Y190aW1lID0gcmVhZGwoaW9hZGRyICsgUlRDX1RJTUVfUkVHX09GRlMpOworCXJ0Y19kYXRlID0gcmVhZGwoaW9hZGRyICsgUlRDX0RBVEVfUkVHX09GRlMpOworCisJc2Vjb25kID0gcnRjX3RpbWUgJiAweDdmOworCW1pbnV0ZSA9IChydGNfdGltZSA+PiBSVENfTUlOVVRFU19PRkZTKSAmIDB4N2Y7CisJaG91ciA9IChydGNfdGltZSA+PiBSVENfSE9VUlNfT0ZGUykgJiAweDNmOyAvKiBhc3N1bWUgMjQgaG91cnMgbW9kZSAqLworCXdkYXkgPSAocnRjX3RpbWUgPj4gUlRDX1dEQVlfT0ZGUykgJiAweDc7CisKKwlkYXkgPSBydGNfZGF0ZSAmIDB4M2Y7CisJbW9udGggPSAocnRjX2RhdGUgPj4gUlRDX01PTlRIX09GRlMpICYgMHgzZjsKKwl5ZWFyID0gKHJ0Y19kYXRlID4+IFJUQ19ZRUFSX09GRlMpICYgMHhmZjsKKworCXRtLT50bV9zZWMgPSBiY2QyYmluKHNlY29uZCk7CisJdG0tPnRtX21pbiA9IGJjZDJiaW4obWludXRlKTsKKwl0bS0+dG1faG91ciA9IGJjZDJiaW4oaG91cik7CisJdG0tPnRtX21kYXkgPSBiY2QyYmluKGRheSk7CisJdG0tPnRtX3dkYXkgPSBiY2QyYmluKHdkYXkpOworCXRtLT50bV9tb24gPSBiY2QyYmluKG1vbnRoKSAtIDE7CisJLyogaHcgY291bnRzIGZyb20geWVhciAyMDAwLCBidXQgdG1feWVhciBpcyByZWxhdGl2ZSB0byAxOTAwICovCisJdG0tPnRtX3llYXIgPSBiY2QyYmluKHllYXIpICsgMTAwOworCisJcmV0dXJuIHJ0Y192YWxpZF90bSh0bSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBtdl9ydGNfb3BzID0geworCS5yZWFkX3RpbWUJPSBtdl9ydGNfcmVhZF90aW1lLAorCS5zZXRfdGltZQk9IG12X3J0Y19zZXRfdGltZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG12X3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YTsKKwlyZXNvdXJjZV9zaXplX3Qgc2l6ZTsKKwl1MzIgcnRjX3RpbWU7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXBkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcGRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNpemUgPSByZXNvdXJjZV9zaXplKHJlcyk7CisJaWYgKCFkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbigmcGRldi0+ZGV2LCByZXMtPnN0YXJ0LCBzaXplLAorCQkJCSAgICAgcGRldi0+bmFtZSkpCisJCXJldHVybiAtRUJVU1k7CisKKwlwZGF0YS0+aW9hZGRyID0gZGV2bV9pb3JlbWFwKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsIHNpemUpOworCWlmICghcGRhdGEtPmlvYWRkcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBtYWtlIHN1cmUgdGhlIDI0IGhvdXJzIG1vZGUgaXMgZW5hYmxlZCAqLworCXJ0Y190aW1lID0gcmVhZGwocGRhdGEtPmlvYWRkciArIFJUQ19USU1FX1JFR19PRkZTKTsKKwlpZiAocnRjX3RpbWUgJiBSVENfSE9VUlNfMTJIX01PREUpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiMjQgSG91cnMgbW9kZSBub3Qgc3VwcG9ydGVkLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBkYXRhKTsKKwlwZGF0YS0+cnRjID0gcnRjX2RldmljZV9yZWdpc3RlcihwZGV2LT5uYW1lLCAmcGRldi0+ZGV2LAorCQkJCQkgJm12X3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKHBkYXRhLT5ydGMpKQorCQlyZXR1cm4gUFRSX0VSUihwZGF0YS0+cnRjKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZXhpdCBtdl9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIocGRhdGEtPnJ0Yyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG12X3J0Y19kcml2ZXIgPSB7CisJLnJlbW92ZQkJPSBfX2V4aXRfcChtdl9ydGNfcmVtb3ZlKSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAicnRjLW12IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IG12X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZtdl9ydGNfZHJpdmVyLCBtdl9ydGNfcHJvYmUpOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgbXZfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtdl9ydGNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQobXZfaW5pdCk7Cittb2R1bGVfZXhpdChtdl9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiU2FlZWQgQmlzaGFyYSA8c2FlZWRAbWFydmVsbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1hcnZlbGwgUlRDIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpydGMtbXYiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1weGEuYyBiL2RyaXZlcnMvcnRjL3J0Yy1weGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzdlYjg3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ydGMvcnRjLXB4YS5jCkBAIC0wLDAgKzEsNDg5IEBACisvKgorICogUmVhbCBUaW1lIENsb2NrIGludGVyZmFjZSBmb3IgWFNjYWxlIFBYQTI3eCBhbmQgUFhBM3h4CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFJvYmVydCBKYXJ6bWlrCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2RlZmluZSBUSU1FUl9GUkVRCQlDTE9DS19USUNLX1JBVEUKKyNkZWZpbmUgUlRDX0RFRl9ESVZJREVSCQkoMzI3NjggLSAxKQorI2RlZmluZSBSVENfREVGX1RSSU0JCTAKKyNkZWZpbmUgTUFYRlJFUV9QRVJJT0RJQwkxMDAwCisKKy8qCisgKiBQWEEgUmVnaXN0ZXJzIGFuZCBiaXRzIGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgUlRTUl9QSUNFCSgxIDw8IDE1KQkvKiBQZXJpb2RpYyBpbnRlcnJ1cHQgY291bnQgZW5hYmxlICovCisjZGVmaW5lIFJUU1JfUElBTEUJKDEgPDwgMTQpCS8qIFBlcmlvZGljIGludGVycnVwdCBBbGFybSBlbmFibGUgKi8KKyNkZWZpbmUgUlRTUl9QSUFMCSgxIDw8IDEzKQkvKiBQZXJpb2RpYyBpbnRlcnJ1cHQgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgUlRTUl9TV0FMRTIJKDEgPDwgMTEpCS8qIFJUQyBzdG9wd2F0Y2ggYWxhcm0yIGVuYWJsZSAqLworI2RlZmluZSBSVFNSX1NXQUwyCSgxIDw8IDEwKQkvKiBSVEMgc3RvcHdhdGNoIGFsYXJtMiBkZXRlY3RlZCAqLworI2RlZmluZSBSVFNSX1NXQUxFMQkoMSA8PCA5KQkvKiBSVEMgc3RvcHdhdGNoIGFsYXJtMSBlbmFibGUgKi8KKyNkZWZpbmUgUlRTUl9TV0FMMQkoMSA8PCA4KQkvKiBSVEMgc3RvcHdhdGNoIGFsYXJtMSBkZXRlY3RlZCAqLworI2RlZmluZSBSVFNSX1JEQUxFMgkoMSA8PCA3KQkvKiBSVEMgYWxhcm0yIGVuYWJsZSAqLworI2RlZmluZSBSVFNSX1JEQUwyCSgxIDw8IDYpCS8qIFJUQyBhbGFybTIgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgUlRTUl9SREFMRTEJKDEgPDwgNSkJLyogUlRDIGFsYXJtMSBlbmFibGUgKi8KKyNkZWZpbmUgUlRTUl9SREFMMQkoMSA8PCA0KQkvKiBSVEMgYWxhcm0xIGRldGVjdGVkICovCisjZGVmaW5lIFJUU1JfSFpFCSgxIDw8IDMpCS8qIEhaIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgUlRTUl9BTEUJKDEgPDwgMikJLyogUlRDIGFsYXJtIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgUlRTUl9IWgkJKDEgPDwgMSkJLyogSFogcmlzaW5nLWVkZ2UgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgUlRTUl9BTAkJKDEgPDwgMCkJLyogUlRDIGFsYXJtIGRldGVjdGVkICovCisjZGVmaW5lIFJUU1JfVFJJR19NQVNLCShSVFNSX0FMIHwgUlRTUl9IWiB8IFJUU1JfUkRBTDEgfCBSVFNSX1JEQUwyXAorCQkJIHwgUlRTUl9TV0FMMSB8IFJUU1JfU1dBTDIpCisjZGVmaW5lIFJZeFJfWUVBUl9TCTkKKyNkZWZpbmUgUll4Ul9ZRUFSX01BU0sJKDB4ZmZmIDw8IFJZeFJfWUVBUl9TKQorI2RlZmluZSBSWXhSX01PTlRIX1MJNQorI2RlZmluZSBSWXhSX01PTlRIX01BU0sJKDB4ZiA8PCBSWXhSX01PTlRIX1MpCisjZGVmaW5lIFJZeFJfREFZX01BU0sJMHgxZgorI2RlZmluZSBSRHhSX0hPVVJfUwkxMgorI2RlZmluZSBSRHhSX0hPVVJfTUFTSwkoMHgxZiA8PCBSRHhSX0hPVVJfUykKKyNkZWZpbmUgUkR4Ul9NSU5fUwk2CisjZGVmaW5lIFJEeFJfTUlOX01BU0sJKDB4M2YgPDwgUkR4Ul9NSU5fUykKKyNkZWZpbmUgUkR4Ul9TRUNfTUFTSwkweDNmCisKKyNkZWZpbmUgUlRTUgkJMHgwOAorI2RlZmluZSBSVFRSCQkweDBjCisjZGVmaW5lIFJEQ1IJCTB4MTAKKyNkZWZpbmUgUllDUgkJMHgxNAorI2RlZmluZSBSREFSMQkJMHgxOAorI2RlZmluZSBSWUFSMQkJMHgxYworI2RlZmluZSBSVENQSUNSCQkweDM0CisjZGVmaW5lIFBJQVIJCTB4MzgKKworI2RlZmluZSBydGNfcmVhZGwocHhhX3J0YywgcmVnKQlcCisJX19yYXdfcmVhZGwoKHB4YV9ydGMpLT5iYXNlICsgKHJlZykpCisjZGVmaW5lIHJ0Y193cml0ZWwocHhhX3J0YywgcmVnLCB2YWx1ZSkJXAorCV9fcmF3X3dyaXRlbCgodmFsdWUpLCAocHhhX3J0YyktPmJhc2UgKyAocmVnKSkKKworc3RydWN0IHB4YV9ydGMgeworCXN0cnVjdCByZXNvdXJjZQkqcmVzczsKKwl2b2lkIF9faW9tZW0JCSpiYXNlOworCWludAkJCWlycV8xSHo7CisJaW50CQkJaXJxX0Fscm07CisJc3RydWN0IHJ0Y19kZXZpY2UJKnJ0YzsKKwlzcGlubG9ja190CQlsb2NrOwkJLyogUHJvdGVjdHMgdGhpcyBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgcnRjX3RpbWUJCXJ0Y19hbGFybTsKK307CisKK3N0YXRpYyB1MzIgcnl4cl9jYWxjKHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJcmV0dXJuICgodG0tPnRtX3llYXIgKyAxOTAwKSA8PCBSWXhSX1lFQVJfUykKKwkJfCAoKHRtLT50bV9tb24gKyAxKSA8PCBSWXhSX01PTlRIX1MpCisJCXwgdG0tPnRtX21kYXk7Cit9CisKK3N0YXRpYyB1MzIgcmR4cl9jYWxjKHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJcmV0dXJuICh0bS0+dG1faG91ciA8PCBSRHhSX0hPVVJfUykgfCAodG0tPnRtX21pbiA8PCBSRHhSX01JTl9TKQorCQl8IHRtLT50bV9zZWM7Cit9CisKK3N0YXRpYyB2b2lkIHRtX2NhbGModTMyIHJ5Y3IsIHUzMiByZGNyLCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXRtLT50bV95ZWFyID0gKChyeWNyICYgUll4Ul9ZRUFSX01BU0spID4+IFJZeFJfWUVBUl9TKSAtIDE5MDA7CisJdG0tPnRtX21vbiA9ICgoKHJ5Y3IgJiBSWXhSX01PTlRIX01BU0spID4+IFJZeFJfTU9OVEhfUykpIC0gMTsKKwl0bS0+dG1fbWRheSA9IChyeWNyICYgUll4Ul9EQVlfTUFTSyk7CisJdG0tPnRtX2hvdXIgPSAocmRjciAmIFJEeFJfSE9VUl9NQVNLKSA+PiBSRHhSX0hPVVJfUzsKKwl0bS0+dG1fbWluID0gKHJkY3IgJiBSRHhSX01JTl9NQVNLKSA+PiBSRHhSX01JTl9TOworCXRtLT50bV9zZWMgPSByZGNyICYgUkR4Ul9TRUNfTUFTSzsKK30KKworc3RhdGljIHZvaWQgcnRzcl9jbGVhcl9iaXRzKHN0cnVjdCBweGFfcnRjICpweGFfcnRjLCB1MzIgbWFzaykKK3sKKwl1MzIgcnRzcjsKKworCXJ0c3IgPSBydGNfcmVhZGwocHhhX3J0YywgUlRTUik7CisJcnRzciAmPSB+UlRTUl9UUklHX01BU0s7CisJcnRzciAmPSB+bWFzazsKKwlydGNfd3JpdGVsKHB4YV9ydGMsIFJUU1IsIHJ0c3IpOworfQorCitzdGF0aWMgdm9pZCBydHNyX3NldF9iaXRzKHN0cnVjdCBweGFfcnRjICpweGFfcnRjLCB1MzIgbWFzaykKK3sKKwl1MzIgcnRzcjsKKworCXJ0c3IgPSBydGNfcmVhZGwocHhhX3J0YywgUlRTUik7CisJcnRzciAmPSB+UlRTUl9UUklHX01BU0s7CisJcnRzciB8PSBtYXNrOworCXJ0Y193cml0ZWwocHhhX3J0YywgUlRTUiwgcnRzcik7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBweGFfcnRjX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXZfaWQpOworCXN0cnVjdCBweGFfcnRjICpweGFfcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdTMyIHJ0c3I7CisJdW5zaWduZWQgbG9uZyBldmVudHMgPSAwOworCisJc3Bpbl9sb2NrKCZweGFfcnRjLT5sb2NrKTsKKworCS8qIGNsZWFyIGludGVycnVwdCBzb3VyY2VzICovCisJcnRzciA9IHJ0Y19yZWFkbChweGFfcnRjLCBSVFNSKTsKKwlydGNfd3JpdGVsKHB4YV9ydGMsIFJUU1IsIHJ0c3IpOworCisJLyogdGVtcG9yYXJ5IGRpc2FibGUgcnRjIGludGVycnVwdHMgKi8KKwlydHNyX2NsZWFyX2JpdHMocHhhX3J0YywgUlRTUl9SREFMRTEgfCBSVFNSX1BJQUxFIHwgUlRTUl9IWkUpOworCisJLyogY2xlYXIgYWxhcm0gaW50ZXJydXB0IGlmIGl0IGhhcyBvY2N1cnJlZCAqLworCWlmIChydHNyICYgUlRTUl9SREFMMSkKKwkJcnRzciAmPSB+UlRTUl9SREFMRTE7CisKKwkvKiB1cGRhdGUgaXJxIGRhdGEgJiBjb3VudGVyICovCisJaWYgKHJ0c3IgJiBSVFNSX1JEQUwxKQorCQlldmVudHMgfD0gUlRDX0FGIHwgUlRDX0lSUUY7CisJaWYgKHJ0c3IgJiBSVFNSX0haKQorCQlldmVudHMgfD0gUlRDX1VGIHwgUlRDX0lSUUY7CisJaWYgKHJ0c3IgJiBSVFNSX1BJQUwpCisJCWV2ZW50cyB8PSBSVENfUEYgfCBSVENfSVJRRjsKKworCXJ0Y191cGRhdGVfaXJxKHB4YV9ydGMtPnJ0YywgMSwgZXZlbnRzKTsKKworCS8qIGVuYWJsZSBiYWNrIHJ0YyBpbnRlcnJ1cHRzICovCisJcnRjX3dyaXRlbChweGFfcnRjLCBSVFNSLCBydHNyICYgflJUU1JfVFJJR19NQVNLKTsKKworCXNwaW5fdW5sb2NrKCZweGFfcnRjLT5sb2NrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgcHhhX3J0Y19vcGVuKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcHhhX3J0YyAqcHhhX3J0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCByZXQ7CisKKwlyZXQgPSByZXF1ZXN0X2lycShweGFfcnRjLT5pcnFfMUh6LCBweGFfcnRjX2lycSwgSVJRRl9ESVNBQkxFRCwKKwkJCSAgInJ0YyAxSHoiLCBkZXYpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiY2FuJ3QgZ2V0IGlycSAlaSwgZXJyICVkXG4iLCBweGFfcnRjLT5pcnFfMUh6LAorCQkJcmV0KTsKKwkJZ290byBlcnJfaXJxXzFIejsKKwl9CisJcmV0ID0gcmVxdWVzdF9pcnEocHhhX3J0Yy0+aXJxX0Fscm0sIHB4YV9ydGNfaXJxLCBJUlFGX0RJU0FCTEVELAorCQkJICAicnRjIEFscm0iLCBkZXYpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiY2FuJ3QgZ2V0IGlycSAlaSwgZXJyICVkXG4iLCBweGFfcnRjLT5pcnFfQWxybSwKKwkJCXJldCk7CisJCWdvdG8gZXJyX2lycV9BbHJtOworCX0KKworCXJldHVybiAwOworCitlcnJfaXJxX0Fscm06CisJZnJlZV9pcnEocHhhX3J0Yy0+aXJxXzFIeiwgZGV2KTsKK2Vycl9pcnFfMUh6OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHB4YV9ydGNfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHB4YV9ydGMgKnB4YV9ydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXNwaW5fbG9ja19pcnEoJnB4YV9ydGMtPmxvY2spOworCXJ0c3JfY2xlYXJfYml0cyhweGFfcnRjLCBSVFNSX1BJQUxFIHwgUlRTUl9SREFMRTEgfCBSVFNSX0haRSk7CisJc3Bpbl91bmxvY2tfaXJxKCZweGFfcnRjLT5sb2NrKTsKKworCWZyZWVfaXJxKHB4YV9ydGMtPmlycV9BbHJtLCBkZXYpOworCWZyZWVfaXJxKHB4YV9ydGMtPmlycV8xSHosIGRldik7Cit9CisKK3N0YXRpYyBpbnQgcHhhX3BlcmlvZGljX2lycV9zZXRfZnJlcShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBmcmVxKQoreworCXN0cnVjdCBweGFfcnRjICpweGFfcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHBlcmlvZF9tczsKKworCWlmIChmcmVxIDwgMSB8fCBmcmVxID4gTUFYRlJFUV9QRVJJT0RJQykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwZXJpb2RfbXMgPSAxMDAwIC8gZnJlcTsKKwlydGNfd3JpdGVsKHB4YV9ydGMsIFBJQVIsIHBlcmlvZF9tcyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBweGFfcGVyaW9kaWNfaXJxX3NldF9zdGF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBlbmFibGVkKQoreworCXN0cnVjdCBweGFfcnRjICpweGFfcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoZW5hYmxlZCkKKwkJcnRzcl9zZXRfYml0cyhweGFfcnRjLCBSVFNSX1BJQUxFIHwgUlRTUl9QSUNFKTsKKwllbHNlCisJCXJ0c3JfY2xlYXJfYml0cyhweGFfcnRjLCBSVFNSX1BJQUxFIHwgUlRTUl9QSUNFKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB4YV9ydGNfaW9jdGwoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgY21kLAorCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgcHhhX3J0YyAqcHhhX3J0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCByZXQgPSAwOworCisJc3Bpbl9sb2NrX2lycSgmcHhhX3J0Yy0+bG9jayk7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFJUQ19BSUVfT0ZGOgorCQlydHNyX2NsZWFyX2JpdHMocHhhX3J0YywgUlRTUl9SREFMRTEpOworCQlicmVhazsKKwljYXNlIFJUQ19BSUVfT046CisJCXJ0c3Jfc2V0X2JpdHMocHhhX3J0YywgUlRTUl9SREFMRTEpOworCQlicmVhazsKKwljYXNlIFJUQ19VSUVfT0ZGOgorCQlydHNyX2NsZWFyX2JpdHMocHhhX3J0YywgUlRTUl9IWkUpOworCQlicmVhazsKKwljYXNlIFJUQ19VSUVfT046CisJCXJ0c3Jfc2V0X2JpdHMocHhhX3J0YywgUlRTUl9IWkUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PSU9DVExDTUQ7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxKCZweGFfcnRjLT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHB4YV9ydGNfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgcHhhX3J0YyAqcHhhX3J0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXUzMiByeWNyLCByZGNyOworCisJcnljciA9IHJ0Y19yZWFkbChweGFfcnRjLCBSWUNSKTsKKwlyZGNyID0gcnRjX3JlYWRsKHB4YV9ydGMsIFJEQ1IpOworCisJdG1fY2FsYyhyeWNyLCByZGNyLCB0bSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHhhX3J0Y19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHB4YV9ydGMgKnB4YV9ydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJ0Y193cml0ZWwocHhhX3J0YywgUllDUiwgcnl4cl9jYWxjKHRtKSk7CisJcnRjX3dyaXRlbChweGFfcnRjLCBSRENSLCByZHhyX2NhbGModG0pKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB4YV9ydGNfcmVhZF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQoreworCXN0cnVjdCBweGFfcnRjICpweGFfcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdTMyIHJ0c3IsIHJ5YXIsIHJkYXI7CisKKwlyeWFyID0gcnRjX3JlYWRsKHB4YV9ydGMsIFJZQVIxKTsKKwlyZGFyID0gcnRjX3JlYWRsKHB4YV9ydGMsIFJEQVIxKTsKKwl0bV9jYWxjKHJ5YXIsIHJkYXIsICZhbHJtLT50aW1lKTsKKworCXJ0c3IgPSBydGNfcmVhZGwocHhhX3J0YywgUlRTUik7CisJYWxybS0+ZW5hYmxlZCA9IChydHNyICYgUlRTUl9SREFMRTEpID8gMSA6IDA7CisJYWxybS0+cGVuZGluZyA9IChydHNyICYgUlRTUl9SREFMMSkgPyAxIDogMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBweGFfcnRjX3NldF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQoreworCXN0cnVjdCBweGFfcnRjICpweGFfcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdTMyIHJ0c3I7CisKKwlzcGluX2xvY2tfaXJxKCZweGFfcnRjLT5sb2NrKTsKKworCXJ0Y193cml0ZWwocHhhX3J0YywgUllBUjEsIHJ5eHJfY2FsYygmYWxybS0+dGltZSkpOworCXJ0Y193cml0ZWwocHhhX3J0YywgUkRBUjEsIHJkeHJfY2FsYygmYWxybS0+dGltZSkpOworCisJcnRzciA9IHJ0Y19yZWFkbChweGFfcnRjLCBSVFNSKTsKKwlpZiAoYWxybS0+ZW5hYmxlZCkKKwkJcnRzciB8PSBSVFNSX1JEQUxFMTsKKwllbHNlCisJCXJ0c3IgJj0gflJUU1JfUkRBTEUxOworCXJ0Y193cml0ZWwocHhhX3J0YywgUlRTUiwgcnRzcik7CisKKwlzcGluX3VubG9ja19pcnEoJnB4YV9ydGMtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHhhX3J0Y19wcm9jKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNlcV9maWxlICpzZXEpCit7CisJc3RydWN0IHB4YV9ydGMgKnB4YV9ydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXNlcV9wcmludGYoc2VxLCAidHJpbS9kaXZpZGVyXHQ6IDB4JTA4eFxuIiwgcnRjX3JlYWRsKHB4YV9ydGMsIFJUVFIpKTsKKwlzZXFfcHJpbnRmKHNlcSwgInVwZGF0ZV9JUlFcdDogJXNcbiIsCisJCSAgIChydGNfcmVhZGwocHhhX3J0YywgUlRTUikgJiBSVFNSX0haRSkgPyAieWVzIiA6ICJubyIpOworCXNlcV9wcmludGYoc2VxLCAicGVyaW9kaWNfSVJRXHQ6ICVzXG4iLAorCQkgICAocnRjX3JlYWRsKHB4YV9ydGMsIFJUU1IpICYgUlRTUl9QSUFMRSkgPyAieWVzIiA6ICJubyIpOworCXNlcV9wcmludGYoc2VxLCAicGVyaW9kaWNfZnJlcVx0OiAldVxuIiwgcnRjX3JlYWRsKHB4YV9ydGMsIFBJQVIpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgcHhhX3J0Y19vcHMgPSB7CisJLm9wZW4gPSBweGFfcnRjX29wZW4sCisJLnJlbGVhc2UgPSBweGFfcnRjX3JlbGVhc2UsCisJLmlvY3RsID0gcHhhX3J0Y19pb2N0bCwKKwkucmVhZF90aW1lID0gcHhhX3J0Y19yZWFkX3RpbWUsCisJLnNldF90aW1lID0gcHhhX3J0Y19zZXRfdGltZSwKKwkucmVhZF9hbGFybSA9IHB4YV9ydGNfcmVhZF9hbGFybSwKKwkuc2V0X2FsYXJtID0gcHhhX3J0Y19zZXRfYWxhcm0sCisJLnByb2MgPSBweGFfcnRjX3Byb2MsCisJLmlycV9zZXRfc3RhdGUgPSBweGFfcGVyaW9kaWNfaXJxX3NldF9zdGF0ZSwKKwkuaXJxX3NldF9mcmVxID0gcHhhX3BlcmlvZGljX2lycV9zZXRfZnJlcSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHB4YV9ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBweGFfcnRjICpweGFfcnRjOworCWludCByZXQ7CisJdTMyIHJ0dHI7CisKKwlweGFfcnRjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHB4YV9ydGMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXB4YV9ydGMpCisJCXJldHVybiAtRU5PTUVNOworCisJc3Bpbl9sb2NrX2luaXQoJnB4YV9ydGMtPmxvY2spOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHB4YV9ydGMpOworCisJcmV0ID0gLUVOWElPOworCXB4YV9ydGMtPnJlc3MgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcHhhX3J0Yy0+cmVzcykgeworCQlkZXZfZXJyKGRldiwgIk5vIEkvTyBtZW1vcnkgcmVzb3VyY2UgZGVmaW5lZFxuIik7CisJCWdvdG8gZXJyX3Jlc3M7CisJfQorCisJcHhhX3J0Yy0+aXJxXzFIeiA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKHB4YV9ydGMtPmlycV8xSHogPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiTm8gMUh6IElSUSByZXNvdXJjZSBkZWZpbmVkXG4iKTsKKwkJZ290byBlcnJfcmVzczsKKwl9CisJcHhhX3J0Yy0+aXJxX0Fscm0gPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDEpOworCWlmIChweGFfcnRjLT5pcnFfQWxybSA8IDApIHsKKwkJZGV2X2VycihkZXYsICJObyBhbGFybSBJUlEgcmVzb3VyY2UgZGVmaW5lZFxuIik7CisJCWdvdG8gZXJyX3Jlc3M7CisJfQorCisJcmV0ID0gLUVOT01FTTsKKwlweGFfcnRjLT5iYXNlID0gaW9yZW1hcChweGFfcnRjLT5yZXNzLT5zdGFydCwKKwkJCQlyZXNvdXJjZV9zaXplKHB4YV9ydGMtPnJlc3MpKTsKKwlpZiAoIXB4YV9ydGMtPmJhc2UpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIG1hcCBweGEgUlRDIEkvTyBtZW1vcnlcbiIpOworCQlnb3RvIGVycl9tYXA7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgY2xvY2sgZGl2aWRlciBpcyB1bmluaXRpYWxpemVkIHRoZW4gcmVzZXQgaXQgdG8gdGhlCisJICogZGVmYXVsdCB2YWx1ZSB0byBnZXQgdGhlIDFIeiBjbG9jay4KKwkgKi8KKwlpZiAocnRjX3JlYWRsKHB4YV9ydGMsIFJUVFIpID09IDApIHsKKwkJcnR0ciA9IFJUQ19ERUZfRElWSURFUiArIChSVENfREVGX1RSSU0gPDwgMTYpOworCQlydGNfd3JpdGVsKHB4YV9ydGMsIFJUVFIsIHJ0dHIpOworCQlkZXZfd2FybihkZXYsICJ3YXJuaW5nOiBpbml0aWFsaXppbmcgZGVmYXVsdCBjbG9jayIKKwkJCSAiIGRpdmlkZXIvdHJpbSB2YWx1ZVxuIik7CisJfQorCisJcnRzcl9jbGVhcl9iaXRzKHB4YV9ydGMsIFJUU1JfUElBTEUgfCBSVFNSX1JEQUxFMSB8IFJUU1JfSFpFKTsKKworCXB4YV9ydGMtPnJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoInB4YS1ydGMiLCAmcGRldi0+ZGV2LCAmcHhhX3J0Y19vcHMsCisJCQkJCSAgIFRISVNfTU9EVUxFKTsKKwlyZXQgPSBQVFJfRVJSKHB4YV9ydGMtPnJ0Yyk7CisJaWYgKElTX0VSUihweGFfcnRjLT5ydGMpKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIFJUQyBkZXZpY2UgLT4gJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX3J0Y19yZWc7CisJfQorCisJZGV2aWNlX2luaXRfd2FrZXVwKGRldiwgMSk7CisKKwlyZXR1cm4gMDsKKworZXJyX3J0Y19yZWc6CisJIGlvdW5tYXAocHhhX3J0Yy0+YmFzZSk7CitlcnJfcmVzczoKK2Vycl9tYXA6CisJa2ZyZWUocHhhX3J0Yyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2V4aXQgcHhhX3J0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcHhhX3J0YyAqcHhhX3J0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHB4YV9ydGMtPnJ0Yyk7CisKKwlzcGluX2xvY2tfaXJxKCZweGFfcnRjLT5sb2NrKTsKKwlpb3VubWFwKHB4YV9ydGMtPmJhc2UpOworCXNwaW5fdW5sb2NrX2lycSgmcHhhX3J0Yy0+bG9jayk7CisKKwlrZnJlZShweGFfcnRjKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHB4YV9ydGNfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IHB4YV9ydGMgKnB4YV9ydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChkZXZpY2VfbWF5X3dha2V1cCgmcGRldi0+ZGV2KSkKKwkJZW5hYmxlX2lycV93YWtlKHB4YV9ydGMtPmlycV9BbHJtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBweGFfcnRjX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBweGFfcnRjICpweGFfcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAoZGV2aWNlX21heV93YWtldXAoJnBkZXYtPmRldikpCisJCWRpc2FibGVfaXJxX3dha2UocHhhX3J0Yy0+aXJxX0Fscm0pOworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgcHhhX3J0Y19zdXNwZW5kCU5VTEwKKyNkZWZpbmUgcHhhX3J0Y19yZXN1bWUJTlVMTAorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHB4YV9ydGNfZHJpdmVyID0geworCS5yZW1vdmUJCT0gX19leGl0X3AocHhhX3J0Y19yZW1vdmUpLAorCS5zdXNwZW5kCT0gcHhhX3J0Y19zdXNwZW5kLAorCS5yZXN1bWUJCT0gcHhhX3J0Y19yZXN1bWUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCQk9ICJweGEtcnRjIiwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgcHhhX3J0Y19pbml0KHZvaWQpCit7CisJaWYgKGNwdV9pc19weGEyN3goKSB8fCBjcHVfaXNfcHhhM3h4KCkpCisJCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJnB4YV9ydGNfZHJpdmVyLCBweGFfcnRjX3Byb2JlKTsKKworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcHhhX3J0Y19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnB4YV9ydGNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocHhhX3J0Y19pbml0KTsKK21vZHVsZV9leGl0KHB4YV9ydGNfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlJvYmVydCBKYXJ6bWlrIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBYQTI3eC9QWEEzeHggUmVhbHRpbWUgQ2xvY2sgRHJpdmVyIChSVEMpIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnB4YS1ydGMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1zM2MuYyBiL2RyaXZlcnMvcnRjL3J0Yy1zM2MuYwppbmRleCA3YTU2OGJlLi5lMGQ3Yjk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtczNjLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLXMzYy5jCkBAIC05NCw2ICs5NCw5IEBACiB7CiAJdW5zaWduZWQgaW50IHRtcDsKIAorCWlmICghaXNfcG93ZXJfb2ZfMihmcmVxKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlzcGluX2xvY2tfaXJxKCZzM2NfcnRjX3BpZV9sb2NrKTsKIAogCXRtcCA9IHJlYWRiKHMzY19ydGNfYmFzZSArIFMzQzI0MTBfVElDTlQpICYgUzNDMjQxMF9USUNOVF9FTkFCTEU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtc2guYyBiL2RyaXZlcnMvcnRjL3J0Yy1zaC5jCmluZGV4IGFhZjlkNmEuLjFjM2ZjNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1zaC5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1zaC5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KICNpbmNsdWRlIDxhc20vcnRjLmg+CiAKICNkZWZpbmUgRFJWX05BTUUJInNoLXJ0YyIKQEAgLTg5LDcgKzkwLDkgQEAKIAl2b2lkIF9faW9tZW0gKnJlZ2Jhc2U7CiAJdW5zaWduZWQgbG9uZyByZWdzaXplOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCXVuc2lnbmVkIGludCBhbGFybV9pcnEsIHBlcmlvZGljX2lycSwgY2FycnlfaXJxOworCWludCBhbGFybV9pcnE7CisJaW50IHBlcmlvZGljX2lycTsKKwlpbnQgY2FycnlfaXJxOwogCXN0cnVjdCBydGNfZGV2aWNlICpydGNfZGV2OwogCXNwaW5sb2NrX3QgbG9jazsKIAl1bnNpZ25lZCBsb25nIGNhcGFiaWxpdGllczsJLyogU2VlIGFzbS1zaC9ydGMuaCBmb3IgY2FwIGJpdHMgKi8KQEAgLTU0OSw2ICs1NTIsOCBAQAogCiBzdGF0aWMgaW50IHNoX3J0Y19pcnFfc2V0X2ZyZXEoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgZnJlcSkKIHsKKwlpZiAoIWlzX3Bvd2VyX29mXzIoZnJlcSkpCisJCXJldHVybiAtRUlOVkFMOwogCXJldHVybiBzaF9ydGNfaW9jdGwoZGV2LCBSVENfSVJRUF9TRVQsIGZyZXEpOwogfQogCkBAIC01NzgsNyArNTgzLDcgQEAKIAogCS8qIGdldCBwZXJpb2RpYy9jYXJyeS9hbGFybSBpcnFzICovCiAJcmV0ID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKLQlpZiAodW5saWtlbHkocmV0IDwgMCkpIHsKKwlpZiAodW5saWtlbHkocmV0IDw9IDApKSB7CiAJCXJldCA9IC1FTk9FTlQ7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIElSUSBmb3IgcGVyaW9kXG4iKTsKIAkJZ290byBlcnJfYmFkcmVzOwpAQCAtNTg2LDcgKzU5MSw3IEBACiAJcnRjLT5wZXJpb2RpY19pcnEgPSByZXQ7CiAKIAlyZXQgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDEpOwotCWlmICh1bmxpa2VseShyZXQgPCAwKSkgeworCWlmICh1bmxpa2VseShyZXQgPD0gMCkpIHsKIAkJcmV0ID0gLUVOT0VOVDsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gSVJRIGZvciBjYXJyeVxuIik7CiAJCWdvdG8gZXJyX2JhZHJlczsKQEAgLTU5NCw3ICs1OTksNyBAQAogCXJ0Yy0+Y2FycnlfaXJxID0gcmV0OwogCiAJcmV0ID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAyKTsKLQlpZiAodW5saWtlbHkocmV0IDwgMCkpIHsKKwlpZiAodW5saWtlbHkocmV0IDw9IDApKSB7CiAJCXJldCA9IC1FTk9FTlQ7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIElSUSBmb3IgYWxhcm1cbiIpOwogCQlnb3RvIGVycl9iYWRyZXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtc3RrMTd0YTguYyBiL2RyaXZlcnMvcnRjL3J0Yy1zdGsxN3RhOC5jCmluZGV4IGY0Y2Q0NmUuLjdkMTU0N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1zdGsxN3RhOC5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1zdGsxN3RhOC5jCkBAIC0xNzAsNyArMTcwLDcgQEAKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CiAJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKLQlpZiAocGRhdGEtPmlycSA8IDApCisJaWYgKHBkYXRhLT5pcnEgPD0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJcGRhdGEtPmFscm1fbWRheSA9IGFscm0tPnRpbWUudG1fbWRheTsKIAlwZGF0YS0+YWxybV9ob3VyID0gYWxybS0+dGltZS50bV9ob3VyOwpAQCAtMTg3LDcgKzE4Nyw3IEBACiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwogCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCi0JaWYgKHBkYXRhLT5pcnEgPCAwKQorCWlmIChwZGF0YS0+aXJxIDw9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCWFscm0tPnRpbWUudG1fbWRheSA9IHBkYXRhLT5hbHJtX21kYXkgPCAwID8gMCA6IHBkYXRhLT5hbHJtX21kYXk7CiAJYWxybS0+dGltZS50bV9ob3VyID0gcGRhdGEtPmFscm1faG91ciA8IDAgPyAwIDogcGRhdGEtPmFscm1faG91cjsKQEAgLTIyMSw3ICsyMjEsNyBAQAogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAotCWlmIChwZGF0YS0+aXJxIDwgMCkKKwlpZiAocGRhdGEtPmlycSA8PSAwKQogCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOyAvKiBmYWxsIGJhY2sgaW50byBydGMtZGV2J3MgZW11bGF0aW9uICovCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFJUQ19BSUVfT0ZGOgpAQCAtMzAzLDcgKzMwMyw2IEBACiAJcGRhdGEgPSBremFsbG9jKHNpemVvZigqcGRhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBkYXRhKQogCQlyZXR1cm4gLUVOT01FTTsKLQlwZGF0YS0+aXJxID0gLTE7CiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgUlRDX1JFR19TSVpFLCBwZGV2LT5uYW1lKSkgewogCQlyZXQgPSAtRUJVU1k7CiAJCWdvdG8gb3V0OwpAQCAtMzI5LDEzICszMjgsMTMgQEAKIAlpZiAocmVhZGIoaW9hZGRyICsgUlRDX0ZMQUdTKSAmIFJUQ19GTEFHU19QRikKIAkJZGV2X3dhcm4oJnBkZXYtPmRldiwgInZvbHRhZ2UtbG93IGRldGVjdGVkLlxuIik7CiAKLQlpZiAocGRhdGEtPmlycSA+PSAwKSB7CisJaWYgKHBkYXRhLT5pcnEgPiAwKSB7CiAJCXdyaXRlYigwLCBpb2FkZHIgKyBSVENfSU5URVJSVVBUUyk7CiAJCWlmIChyZXF1ZXN0X2lycShwZGF0YS0+aXJxLCBzdGsxN3RhOF9ydGNfaW50ZXJydXB0LAogCQkJCUlSUUZfRElTQUJMRUQgfCBJUlFGX1NIQVJFRCwKIAkJCQlwZGV2LT5uYW1lLCBwZGV2KSA8IDApIHsKIAkJCWRldl93YXJuKCZwZGV2LT5kZXYsICJpbnRlcnJ1cHQgbm90IGF2YWlsYWJsZS5cbiIpOwotCQkJcGRhdGEtPmlycSA9IC0xOworCQkJcGRhdGEtPmlycSA9IDA7CiAJCX0KIAl9CiAKQEAgLTM1NSw3ICszNTQsNyBAQAogIG91dDoKIAlpZiAocGRhdGEtPnJ0YykKIAkJcnRjX2RldmljZV91bnJlZ2lzdGVyKHBkYXRhLT5ydGMpOwotCWlmIChwZGF0YS0+aXJxID49IDApCisJaWYgKHBkYXRhLT5pcnEgPiAwKQogCQlmcmVlX2lycShwZGF0YS0+aXJxLCBwZGV2KTsKIAlpZiAoaW9hZGRyKQogCQlpb3VubWFwKGlvYWRkcik7CkBAIC0zNzEsNyArMzcwLDcgQEAKIAogCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmcGRldi0+ZGV2LmtvYmosICZzdGsxN3RhOF9udnJhbV9hdHRyKTsKIAlydGNfZGV2aWNlX3VucmVnaXN0ZXIocGRhdGEtPnJ0Yyk7Ci0JaWYgKHBkYXRhLT5pcnEgPj0gMCkgeworCWlmIChwZGF0YS0+aXJxID4gMCkgewogCQl3cml0ZWIoMCwgcGRhdGEtPmlvYWRkciArIFJUQ19JTlRFUlJVUFRTKTsKIAkJZnJlZV9pcnEocGRhdGEtPmlycSwgcGRldik7CiAJfQpAQCAtNDAwLDcgKzM5OSw3IEBACiAKIHN0YXRpYyBfX2V4aXQgdm9pZCBzdGsxN3RhOF9leGl0KHZvaWQpCiB7Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzdGsxN3RhOF9ydGNfZHJpdmVyKTsKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc3RrMTd0YThfcnRjX2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KHN0azE3dGE4X2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXRlc3QuYyBiL2RyaXZlcnMvcnRjL3J0Yy10ZXN0LmMKaW5kZXggYmM5MzAwMi4uZTQ3ODI4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLXRlc3QuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtdGVzdC5jCkBAIC0zNCwxNCArMzQsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHRlc3RfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwKLQlzdHJ1Y3QgcnRjX3RpbWUgKnRtKQotewotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IHRlc3RfcnRjX3NldF9tbXNzKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBzZWNzKQogeworCWRldl9pbmZvKGRldiwgIiVzLCBzZWNzID0gJWx1XG4iLCBfX2Z1bmNfXywgc2Vjcyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTc4LDcgKzczLDYgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyB0ZXN0X3J0Y19vcHMgPSB7CiAJLnByb2MgPSB0ZXN0X3J0Y19wcm9jLAogCS5yZWFkX3RpbWUgPSB0ZXN0X3J0Y19yZWFkX3RpbWUsCi0JLnNldF90aW1lID0gdGVzdF9ydGNfc2V0X3RpbWUsCiAJLnJlYWRfYWxhcm0gPSB0ZXN0X3J0Y19yZWFkX2FsYXJtLAogCS5zZXRfYWxhcm0gPSB0ZXN0X3J0Y19zZXRfYWxhcm0sCiAJLnNldF9tbXNzID0gdGVzdF9ydGNfc2V0X21tc3MsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtdHdsNDAzMC5jIGIvZHJpdmVycy9ydGMvcnRjLXR3bDQwMzAuYwppbmRleCAwMWQ4ZGE5Li44Y2U1Zjc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtdHdsNDAzMC5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy10d2w0MDMwLmMKQEAgLTE5LDYgKzE5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KQEAgLTQxNSw4ICs0MTYsOCBAQAogCWludCBpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwogCXU4IHJkX3JlZzsKIAotCWlmIChpcnEgPCAwKQotCQlyZXR1cm4gaXJxOworCWlmIChpcnEgPD0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKHBkZXYtPm5hbWUsCiAJCQkJICAmcGRldi0+ZGV2LCAmdHdsNDAzMF9ydGNfb3BzLCBUSElTX01PRFVMRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtdHg0OTM5LmMgYi9kcml2ZXJzL3J0Yy9ydGMtdHg0OTM5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVlNDg1NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy10eDQ5MzkuYwpAQCAtMCwwICsxLDMxNyBAQAorLyoKKyAqIFRYNDkzOSBpbnRlcm5hbCBSVEMgZHJpdmVyCisgKiBCYXNlZCBvbiBSQlRYNDl4eCBwYXRjaCBmcm9tIENFTEYgcGF0Y2ggYXJjaGl2ZS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAoQykgQ29weXJpZ2h0IFRPU0hJQkEgQ09SUE9SQVRJT04gMjAwNS0yMDA3CisgKi8KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGFzbS90eHg5L3R4NDkzOS5oPgorCitzdHJ1Y3QgdHg0OTM5cnRjX3BsYXRfZGF0YSB7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwlzdHJ1Y3QgdHg0OTM5X3J0Y19yZWcgX19pb21lbSAqcnRjcmVnOworfTsKKworc3RhdGljIHN0cnVjdCB0eDQ5MzlydGNfcGxhdF9kYXRhICpnZXRfdHg0OTM5cnRjX3BsYXRfZGF0YShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIHBsYXRmb3JtX2dldF9kcnZkYXRhKHRvX3BsYXRmb3JtX2RldmljZShkZXYpKTsKK30KKworc3RhdGljIGludCB0eDQ5MzlfcnRjX2NtZChzdHJ1Y3QgdHg0OTM5X3J0Y19yZWcgX19pb21lbSAqcnRjcmVnLCBpbnQgY21kKQoreworCWludCBpID0gMDsKKworCV9fcmF3X3dyaXRlbChjbWQsICZydGNyZWctPmN0bCk7CisJLyogVGhpcyBtaWdodCB0YWtlIDMwdXMgKG5leHQgMzIuNzY4S0h6IGNsb2NrKSAqLworCXdoaWxlIChfX3Jhd19yZWFkbCgmcnRjcmVnLT5jdGwpICYgVFg0OTM5X1JUQ0NUTF9CVVNZKSB7CisJCS8qIHRpbWVvdXQgb24gYXBwcm94LiAxMDB1cyAoQCBHQlVTMjAwTUh6KSAqLworCQlpZiAoaSsrID4gMjAwICogMTAwKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJY3B1X3JlbGF4KCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHR4NDkzOV9ydGNfc2V0X21tc3Moc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHNlY3MpCit7CisJc3RydWN0IHR4NDkzOXJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gZ2V0X3R4NDkzOXJ0Y19wbGF0X2RhdGEoZGV2KTsKKwlzdHJ1Y3QgdHg0OTM5X3J0Y19yZWcgX19pb21lbSAqcnRjcmVnID0gcGRhdGEtPnJ0Y3JlZzsKKwlpbnQgaSwgcmV0OworCXVuc2lnbmVkIGNoYXIgYnVmWzZdOworCisJYnVmWzBdID0gMDsKKwlidWZbMV0gPSAwOworCWJ1ZlsyXSA9IHNlY3M7CisJYnVmWzNdID0gc2VjcyA+PiA4OworCWJ1Zls0XSA9IHNlY3MgPj4gMTY7CisJYnVmWzVdID0gc2VjcyA+PiAyNDsKKwlzcGluX2xvY2tfaXJxKCZwZGF0YS0+cnRjLT5pcnFfbG9jayk7CisJX19yYXdfd3JpdGVsKDAsICZydGNyZWctPmFkcik7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJX19yYXdfd3JpdGVsKGJ1ZltpXSwgJnJ0Y3JlZy0+ZGF0KTsKKwlyZXQgPSB0eDQ5MzlfcnRjX2NtZChydGNyZWcsCisJCQkgICAgIFRYNDkzOV9SVENDVExfQ09NTUFORF9TRVRUSU1FIHwKKwkJCSAgICAgKF9fcmF3X3JlYWRsKCZydGNyZWctPmN0bCkgJiBUWDQ5MzlfUlRDQ1RMX0FMTUUpKTsKKwlzcGluX3VubG9ja19pcnEoJnBkYXRhLT5ydGMtPmlycV9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHR4NDkzOV9ydGNfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgdHg0OTM5cnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBnZXRfdHg0OTM5cnRjX3BsYXRfZGF0YShkZXYpOworCXN0cnVjdCB0eDQ5MzlfcnRjX3JlZyBfX2lvbWVtICpydGNyZWcgPSBwZGF0YS0+cnRjcmVnOworCWludCBpLCByZXQ7CisJdW5zaWduZWQgbG9uZyBzZWM7CisJdW5zaWduZWQgY2hhciBidWZbNl07CisKKwlzcGluX2xvY2tfaXJxKCZwZGF0YS0+cnRjLT5pcnFfbG9jayk7CisJcmV0ID0gdHg0OTM5X3J0Y19jbWQocnRjcmVnLAorCQkJICAgICBUWDQ5MzlfUlRDQ1RMX0NPTU1BTkRfR0VUVElNRSB8CisJCQkgICAgIChfX3Jhd19yZWFkbCgmcnRjcmVnLT5jdGwpICYgVFg0OTM5X1JUQ0NUTF9BTE1FKSk7CisJaWYgKHJldCkgeworCQlzcGluX3VubG9ja19pcnEoJnBkYXRhLT5ydGMtPmlycV9sb2NrKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJX19yYXdfd3JpdGVsKDIsICZydGNyZWctPmFkcik7CisJZm9yIChpID0gMjsgaSA8IDY7IGkrKykKKwkJYnVmW2ldID0gX19yYXdfcmVhZGwoJnJ0Y3JlZy0+ZGF0KTsKKwlzcGluX3VubG9ja19pcnEoJnBkYXRhLT5ydGMtPmlycV9sb2NrKTsKKwlzZWMgPSAoYnVmWzVdIDw8IDI0KSB8IChidWZbNF0gPDwgMTYpIHwgKGJ1ZlszXSA8PCA4KSB8IGJ1ZlsyXTsKKwlydGNfdGltZV90b190bShzZWMsIHRtKTsKKwlyZXR1cm4gcnRjX3ZhbGlkX3RtKHRtKTsKK30KKworc3RhdGljIGludCB0eDQ5MzlfcnRjX3NldF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQoreworCXN0cnVjdCB0eDQ5MzlydGNfcGxhdF9kYXRhICpwZGF0YSA9IGdldF90eDQ5MzlydGNfcGxhdF9kYXRhKGRldik7CisJc3RydWN0IHR4NDkzOV9ydGNfcmVnIF9faW9tZW0gKnJ0Y3JlZyA9IHBkYXRhLT5ydGNyZWc7CisJaW50IGksIHJldDsKKwl1bnNpZ25lZCBsb25nIHNlYzsKKwl1bnNpZ25lZCBjaGFyIGJ1Zls2XTsKKworCWlmIChhbHJtLT50aW1lLnRtX3NlYyA8IDAgfHwKKwkgICAgYWxybS0+dGltZS50bV9taW4gPCAwIHx8CisJICAgIGFscm0tPnRpbWUudG1faG91ciA8IDAgfHwKKwkgICAgYWxybS0+dGltZS50bV9tZGF5IDwgMCB8fAorCSAgICBhbHJtLT50aW1lLnRtX21vbiA8IDAgfHwKKwkgICAgYWxybS0+dGltZS50bV95ZWFyIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcnRjX3RtX3RvX3RpbWUoJmFscm0tPnRpbWUsICZzZWMpOworCWJ1ZlswXSA9IDA7CisJYnVmWzFdID0gMDsKKwlidWZbMl0gPSBzZWM7CisJYnVmWzNdID0gc2VjID4+IDg7CisJYnVmWzRdID0gc2VjID4+IDE2OworCWJ1Zls1XSA9IHNlYyA+PiAyNDsKKwlzcGluX2xvY2tfaXJxKCZwZGF0YS0+cnRjLT5pcnFfbG9jayk7CisJX19yYXdfd3JpdGVsKDAsICZydGNyZWctPmFkcik7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJX19yYXdfd3JpdGVsKGJ1ZltpXSwgJnJ0Y3JlZy0+ZGF0KTsKKwlyZXQgPSB0eDQ5MzlfcnRjX2NtZChydGNyZWcsIFRYNDkzOV9SVENDVExfQ09NTUFORF9TRVRBTEFSTSB8CisJCQkgICAgIChhbHJtLT5lbmFibGVkID8gVFg0OTM5X1JUQ0NUTF9BTE1FIDogMCkpOworCXNwaW5fdW5sb2NrX2lycSgmcGRhdGEtPnJ0Yy0+aXJxX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdHg0OTM5X3J0Y19yZWFkX2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCit7CisJc3RydWN0IHR4NDkzOXJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gZ2V0X3R4NDkzOXJ0Y19wbGF0X2RhdGEoZGV2KTsKKwlzdHJ1Y3QgdHg0OTM5X3J0Y19yZWcgX19pb21lbSAqcnRjcmVnID0gcGRhdGEtPnJ0Y3JlZzsKKwlpbnQgaSwgcmV0OworCXVuc2lnbmVkIGxvbmcgc2VjOworCXVuc2lnbmVkIGNoYXIgYnVmWzZdOworCXUzMiBjdGw7CisKKwlzcGluX2xvY2tfaXJxKCZwZGF0YS0+cnRjLT5pcnFfbG9jayk7CisJcmV0ID0gdHg0OTM5X3J0Y19jbWQocnRjcmVnLAorCQkJICAgICBUWDQ5MzlfUlRDQ1RMX0NPTU1BTkRfR0VUQUxBUk0gfAorCQkJICAgICAoX19yYXdfcmVhZGwoJnJ0Y3JlZy0+Y3RsKSAmIFRYNDkzOV9SVENDVExfQUxNRSkpOworCWlmIChyZXQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZwZGF0YS0+cnRjLT5pcnFfbG9jayk7CisJCXJldHVybiByZXQ7CisJfQorCV9fcmF3X3dyaXRlbCgyLCAmcnRjcmVnLT5hZHIpOworCWZvciAoaSA9IDI7IGkgPCA2OyBpKyspCisJCWJ1ZltpXSA9IF9fcmF3X3JlYWRsKCZydGNyZWctPmRhdCk7CisJY3RsID0gX19yYXdfcmVhZGwoJnJ0Y3JlZy0+Y3RsKTsKKwlhbHJtLT5lbmFibGVkID0gKGN0bCAmIFRYNDkzOV9SVENDVExfQUxNRSkgPyAxIDogMDsKKwlhbHJtLT5wZW5kaW5nID0gKGN0bCAmIFRYNDkzOV9SVENDVExfQUxNRCkgPyAxIDogMDsKKwlzcGluX3VubG9ja19pcnEoJnBkYXRhLT5ydGMtPmlycV9sb2NrKTsKKwlzZWMgPSAoYnVmWzVdIDw8IDI0KSB8IChidWZbNF0gPDwgMTYpIHwgKGJ1ZlszXSA8PCA4KSB8IGJ1ZlsyXTsKKwlydGNfdGltZV90b190bShzZWMsICZhbHJtLT50aW1lKTsKKwlyZXR1cm4gcnRjX3ZhbGlkX3RtKCZhbHJtLT50aW1lKTsKK30KKworc3RhdGljIGludCB0eDQ5MzlfcnRjX2FsYXJtX2lycV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgZW5hYmxlZCkKK3sKKwlzdHJ1Y3QgdHg0OTM5cnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBnZXRfdHg0OTM5cnRjX3BsYXRfZGF0YShkZXYpOworCisJc3Bpbl9sb2NrX2lycSgmcGRhdGEtPnJ0Yy0+aXJxX2xvY2spOworCXR4NDkzOV9ydGNfY21kKHBkYXRhLT5ydGNyZWcsCisJCSAgICAgICBUWDQ5MzlfUlRDQ1RMX0NPTU1BTkRfTk9QIHwKKwkJICAgICAgIChlbmFibGVkID8gVFg0OTM5X1JUQ0NUTF9BTE1FIDogMCkpOworCXNwaW5fdW5sb2NrX2lycSgmcGRhdGEtPnJ0Yy0+aXJxX2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgdHg0OTM5X3J0Y19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCB0eDQ5MzlydGNfcGxhdF9kYXRhICpwZGF0YSA9IGdldF90eDQ5MzlydGNfcGxhdF9kYXRhKGRldl9pZCk7CisJc3RydWN0IHR4NDkzOV9ydGNfcmVnIF9faW9tZW0gKnJ0Y3JlZyA9IHBkYXRhLT5ydGNyZWc7CisJdW5zaWduZWQgbG9uZyBldmVudHMgPSBSVENfSVJRRjsKKworCXNwaW5fbG9jaygmcGRhdGEtPnJ0Yy0+aXJxX2xvY2spOworCWlmIChfX3Jhd19yZWFkbCgmcnRjcmVnLT5jdGwpICYgVFg0OTM5X1JUQ0NUTF9BTE1EKSB7CisJCWV2ZW50cyB8PSBSVENfQUY7CisJCXR4NDkzOV9ydGNfY21kKHJ0Y3JlZywgVFg0OTM5X1JUQ0NUTF9DT01NQU5EX05PUCk7CisJfQorCXNwaW5fdW5sb2NrKCZwZGF0YS0+cnRjLT5pcnFfbG9jayk7CisJcnRjX3VwZGF0ZV9pcnEocGRhdGEtPnJ0YywgMSwgZXZlbnRzKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyB0eDQ5MzlfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lCQk9IHR4NDkzOV9ydGNfcmVhZF90aW1lLAorCS5yZWFkX2FsYXJtCQk9IHR4NDkzOV9ydGNfcmVhZF9hbGFybSwKKwkuc2V0X2FsYXJtCQk9IHR4NDkzOV9ydGNfc2V0X2FsYXJtLAorCS5zZXRfbW1zcwkJPSB0eDQ5MzlfcnRjX3NldF9tbXNzLAorCS5hbGFybV9pcnFfZW5hYmxlCT0gdHg0OTM5X3J0Y19hbGFybV9pcnFfZW5hYmxlLAorfTsKKworc3RhdGljIHNzaXplX3QgdHg0OTM5X3J0Y19udnJhbV9yZWFkKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgICAgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyLAorCQkJCSAgICAgY2hhciAqYnVmLCBsb2ZmX3QgcG9zLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IHR4NDkzOXJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gZ2V0X3R4NDkzOXJ0Y19wbGF0X2RhdGEoZGV2KTsKKwlzdHJ1Y3QgdHg0OTM5X3J0Y19yZWcgX19pb21lbSAqcnRjcmVnID0gcGRhdGEtPnJ0Y3JlZzsKKwlzc2l6ZV90IGNvdW50OworCisJc3Bpbl9sb2NrX2lycSgmcGRhdGEtPnJ0Yy0+aXJxX2xvY2spOworCWZvciAoY291bnQgPSAwOyBzaXplID4gMCAmJiBwb3MgPCBUWDQ5MzlfUlRDX1JFR19SQU1TSVpFOworCSAgICAgY291bnQrKywgc2l6ZS0tKSB7CisJCV9fcmF3X3dyaXRlbChwb3MrKywgJnJ0Y3JlZy0+YWRyKTsKKwkJKmJ1ZisrID0gX19yYXdfcmVhZGwoJnJ0Y3JlZy0+ZGF0KTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZwZGF0YS0+cnRjLT5pcnFfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCB0eDQ5MzlfcnRjX252cmFtX3dyaXRlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgICAgIHN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKKwkJCQkgICAgICBjaGFyICpidWYsIGxvZmZfdCBwb3MsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKKwlzdHJ1Y3QgdHg0OTM5cnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBnZXRfdHg0OTM5cnRjX3BsYXRfZGF0YShkZXYpOworCXN0cnVjdCB0eDQ5MzlfcnRjX3JlZyBfX2lvbWVtICpydGNyZWcgPSBwZGF0YS0+cnRjcmVnOworCXNzaXplX3QgY291bnQ7CisKKwlzcGluX2xvY2tfaXJxKCZwZGF0YS0+cnRjLT5pcnFfbG9jayk7CisJZm9yIChjb3VudCA9IDA7IHNpemUgPiAwICYmIHBvcyA8IFRYNDkzOV9SVENfUkVHX1JBTVNJWkU7CisJICAgICBjb3VudCsrLCBzaXplLS0pIHsKKwkJX19yYXdfd3JpdGVsKHBvcysrLCAmcnRjcmVnLT5hZHIpOworCQlfX3Jhd193cml0ZWwoKmJ1ZisrLCAmcnRjcmVnLT5kYXQpOworCX0KKwlzcGluX3VubG9ja19pcnEoJnBkYXRhLT5ydGMtPmlycV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSB0eDQ5MzlfcnRjX252cmFtX2F0dHIgPSB7CisJLmF0dHIgPSB7CisJCS5uYW1lID0gIm52cmFtIiwKKwkJLm1vZGUgPSBTX0lSVUdPIHwgU19JV1VTUiwKKwl9LAorCS5zaXplID0gVFg0OTM5X1JUQ19SRUdfUkFNU0laRSwKKwkucmVhZCA9IHR4NDkzOV9ydGNfbnZyYW1fcmVhZCwKKwkud3JpdGUgPSB0eDQ5MzlfcnRjX252cmFtX3dyaXRlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdHg0OTM5X3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisJc3RydWN0IHR4NDkzOXJ0Y19wbGF0X2RhdGEgKnBkYXRhOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCBpcnEsIHJldDsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpCisJCXJldHVybiAtRU5PREVWOworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKGlycSA8IDApCisJCXJldHVybiAtRU5PREVWOworCXBkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcGRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwZGF0YSk7CisKKwlpZiAoIWRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsCisJCQkJICAgICByZXNvdXJjZV9zaXplKHJlcyksIHBkZXYtPm5hbWUpKQorCQlyZXR1cm4gLUVCVVNZOworCXBkYXRhLT5ydGNyZWcgPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwgcmVzLT5zdGFydCwKKwkJCQkgICAgIHJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKCFwZGF0YS0+cnRjcmVnKQorCQlyZXR1cm4gLUVCVVNZOworCisJdHg0OTM5X3J0Y19jbWQocGRhdGEtPnJ0Y3JlZywgVFg0OTM5X1JUQ0NUTF9DT01NQU5EX05PUCk7CisJaWYgKGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgaXJxLCB0eDQ5MzlfcnRjX2ludGVycnVwdCwKKwkJCSAgICAgSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVELAorCQkJICAgICBwZGV2LT5uYW1lLCAmcGRldi0+ZGV2KSA8IDApIHsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcihwZGV2LT5uYW1lLCAmcGRldi0+ZGV2LAorCQkJCSAgJnR4NDkzOV9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihydGMpKQorCQlyZXR1cm4gUFRSX0VSUihydGMpOworCXBkYXRhLT5ydGMgPSBydGM7CisJcmV0ID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZwZGV2LT5kZXYua29iaiwgJnR4NDkzOV9ydGNfbnZyYW1fYXR0cik7CisJaWYgKHJldCkKKwkJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2V4aXQgdHg0OTM5X3J0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdHg0OTM5cnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gcGRhdGEtPnJ0YzsKKworCXNwaW5fbG9ja19pcnEoJnJ0Yy0+aXJxX2xvY2spOworCXR4NDkzOV9ydGNfY21kKHBkYXRhLT5ydGNyZWcsIFRYNDkzOV9SVENDVExfQ09NTUFORF9OT1ApOworCXNwaW5fdW5sb2NrX2lycSgmcnRjLT5pcnFfbG9jayk7CisJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZwZGV2LT5kZXYua29iaiwgJnR4NDkzOV9ydGNfbnZyYW1fYXR0cik7CisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHR4NDkzOV9ydGNfZHJpdmVyID0geworCS5yZW1vdmUJCT0gX19leGl0X3AodHg0OTM5X3J0Y19yZW1vdmUpLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJ0eDQ5MzlydGMiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgdHg0OTM5cnRjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZ0eDQ5MzlfcnRjX2RyaXZlciwgdHg0OTM5X3J0Y19wcm9iZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0eDQ5MzlydGNfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ0eDQ5MzlfcnRjX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHR4NDkzOXJ0Y19pbml0KTsKK21vZHVsZV9leGl0KHR4NDkzOXJ0Y19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQXRzdXNoaSBOZW1vdG8gPGFuZW1vQG1iYS5vY24ubmUuanA+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRYNDkzOSBpbnRlcm5hbCBSVEMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnR4NDkzOXJ0YyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXZyNDF4eC5jIGIvZHJpdmVycy9ydGMvcnRjLXZyNDF4eC5jCmluZGV4IDgzNGRjYzYuLmYxMTI5N2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy12cjQxeHguYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtdnI0MXh4LmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ydGMuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbG9nMi5oPgogCiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC04NCw4ICs4NSw4IEBACiBzdGF0aWMgY2hhciBydGNfbmFtZVtdID0gIlJUQyI7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBwZXJpb2RpY19jb3VudDsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgYWxhcm1fZW5hYmxlZDsKLXN0YXRpYyBpbnQgYWllX2lycSA9IC0xOwotc3RhdGljIGludCBwaWVfaXJxID0gLTE7CitzdGF0aWMgaW50IGFpZV9pcnE7CitzdGF0aWMgaW50IHBpZV9pcnE7CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyByZWFkX2VsYXBzZWRfc2Vjb25kKHZvaWQpCiB7CkBAIC0yMTAsNiArMjExLDggQEAKIHsKIAl1bnNpZ25lZCBsb25nIGNvdW50OwogCisJaWYgKCFpc19wb3dlcl9vZl8yKGZyZXEpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAljb3VudCA9IFJUQ19GUkVRVUVOQ1k7CiAJZG9fZGl2KGNvdW50LCBmcmVxKTsKIApAQCAtMzYwLDcgKzM2Myw3IEBACiAJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CiAKIAlhaWVfaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKLQlpZiAoYWllX2lycSA8IDAgfHwgYWllX2lycSA+PSBucl9pcnFzKSB7CisJaWYgKGFpZV9pcnEgPD0gMCkgewogCQlyZXR2YWwgPSAtRUJVU1k7CiAJCWdvdG8gZXJyX2RldmljZV91bnJlZ2lzdGVyOwogCX0KQEAgLTM3MSw3ICszNzQsNyBAQAogCQlnb3RvIGVycl9kZXZpY2VfdW5yZWdpc3RlcjsKIAogCXBpZV9pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDEpOwotCWlmIChwaWVfaXJxIDwgMCB8fCBwaWVfaXJxID49IG5yX2lycXMpCisJaWYgKHBpZV9pcnEgPD0gMCkKIAkJZ290byBlcnJfZnJlZV9pcnE7CiAKIAlyZXR2YWwgPSByZXF1ZXN0X2lycShwaWVfaXJxLCBydGNsb25nMV9pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvTWFrZWZpbGUgYi9kcml2ZXJzL3MzOTAvTWFrZWZpbGUKaW5kZXggNGY0ZTdjZi4uZDBlYWU1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvczM5MC9NYWtlZmlsZQpAQCAtNCw3ICs0LDcgQEAKIAogQ0ZMQUdTX3N5c2luZm8ubyArPSAtSWluY2x1ZGUvbWF0aC1lbXUgLUlhcmNoL3MzOTAvbWF0aC1lbXUgLXcKIAotb2JqLXkgKz0gczM5MG1hY2gubyBzeXNpbmZvLm8gczM5MF9yZGV2Lm8KK29iai15ICs9IHMzOTBtYWNoLm8gc3lzaW5mby5vCiBvYmoteSArPSBjaW8vIGJsb2NrLyBjaGFyLyBjcnlwdG8vIG5ldC8gc2NzaS8ga3ZtLwogCiBkcml2ZXJzLXkgKz0gZHJpdmVycy9zMzkwL2J1aWx0LWluLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkXzM5OTBfZXJwLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF8zOTkwX2VycC5jCmluZGV4IGI4ZjljMDAuLmQ4MmFhZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkXzM5OTBfZXJwLmMKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfMzk5MF9lcnAuYwpAQCAtMjYyMSw3ICsyNjIxLDcgQEAKIAkJfQogCX0KIAotCS8qIGRvdWJsZS1jaGVjayBpZiBjdXJyZW50IGVycC9jcXIgd2FzIHN1Y2Nlc3NmdWxsICovCisJLyogZG91YmxlLWNoZWNrIGlmIGN1cnJlbnQgZXJwL2NxciB3YXMgc3VjY2Vzc2Z1bCAqLwogCWlmICgoY3FyLT5pcmIuc2Nzdy5jbWQuY3N0YXQgPT0gMHgwMCkgJiYKIAkgICAgKGNxci0+aXJiLnNjc3cuY21kLmRzdGF0ID09CiAJICAgICAoREVWX1NUQVRfQ0hOX0VORCB8IERFVl9TVEFUX0RFVl9FTkQpKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZWVyLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lZXIuYwppbmRleCA4OTJlMjg3Li5mOGUwNWNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lZXIuYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lZXIuYwpAQCAtNTM1LDggKzUzNSw4IEBACiAJICAgIGVlcmItPmJ1ZmZlcl9wYWdlX2NvdW50ID4gSU5UX01BWCAvIFBBR0VfU0laRSkgewogCQlrZnJlZShlZXJiKTsKIAkJTUVTU0FHRShLRVJOX1dBUk5JTkcsICJjYW4ndCBvcGVuIGRldmljZSBzaW5jZSBtb2R1bGUgIgotCQkJInBhcmFtZXRlciBlZXJfcGFnZXMgaXMgc21hbGxlciB0aGVuIDEgb3IiCi0JCQkiIGJpZ2dlciB0aGVuICVkIiwgKGludCkoSU5UX01BWCAvIFBBR0VfU0laRSkpOworCQkJInBhcmFtZXRlciBlZXJfcGFnZXMgaXMgc21hbGxlciB0aGFuIDEgb3IiCisJCQkiIGJpZ2dlciB0aGFuICVkIiwgKGludCkoSU5UX01BWCAvIFBBR0VfU0laRSkpOwogCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2ludC5oIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfaW50LmgKaW5kZXggMDVhMTQ1My4uNGEzOTA4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfaW50LmgKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfaW50LmgKQEAgLTE5OSw3ICsxOTksNyBAQAogI2RlZmluZSBEQVNEX0NRUl9FUlJPUgkJMHg4MgkvKiByZXF1ZXN0IGlzIGNvbXBsZXRlZCB3aXRoIGVycm9yICovCiAjZGVmaW5lIERBU0RfQ1FSX0NMRUFSX1BFTkRJTkcJMHg4MwkvKiByZXF1ZXN0IGlzIGNsZWFyIHBlbmRpbmcgKi8KICNkZWZpbmUgREFTRF9DUVJfQ0xFQVJFRAkweDg0CS8qIHJlcXVlc3Qgd2FzIGNsZWFyZWQgKi8KLSNkZWZpbmUgREFTRF9DUVJfU1VDQ0VTUwkweDg1CS8qIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxsICovCisjZGVmaW5lIERBU0RfQ1FSX1NVQ0NFU1MJMHg4NQkvKiByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsICovCiAKIAogLyogcGVyIGRhc2RfY2N3X3JlcSBmbGFncyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rjc3NibGsuYyBiL2RyaXZlcnMvczM5MC9ibG9jay9kY3NzYmxrLmMKaW5kZXggMjZmZmM2YS4uY2ZkY2YxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rjc3NibGsuYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGNzc2Jsay5jCkBAIC0xOCw3ICsxOCw2IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGFzbS9zMzkwX3JkZXYuaD4KIAogI2RlZmluZSBEQ1NTQkxLX05BTUUgImRjc3NibGsiCiAjZGVmaW5lIERDU1NCTEtfTUlOT1JTX1BFUl9ESVNLIDEKQEAgLTk0Niw3ICs5NDUsNyBAQAogc3RhdGljIHZvaWQgX19leGl0CiBkY3NzYmxrX2V4aXQodm9pZCkKIHsKLQlzMzkwX3Jvb3RfZGV2X3VucmVnaXN0ZXIoZGNzc2Jsa19yb290X2Rldik7CisJcm9vdF9kZXZpY2VfdW5yZWdpc3RlcihkY3NzYmxrX3Jvb3RfZGV2KTsKIAl1bnJlZ2lzdGVyX2Jsa2RldihkY3NzYmxrX21ham9yLCBEQ1NTQkxLX05BTUUpOwogfQogCkBAIC05NTUsMjIgKzk1NCwyMiBAQAogewogCWludCByYzsKIAotCWRjc3NibGtfcm9vdF9kZXYgPSBzMzkwX3Jvb3RfZGV2X3JlZ2lzdGVyKCJkY3NzYmxrIik7CisJZGNzc2Jsa19yb290X2RldiA9IHJvb3RfZGV2aWNlX3JlZ2lzdGVyKCJkY3NzYmxrIik7CiAJaWYgKElTX0VSUihkY3NzYmxrX3Jvb3RfZGV2KSkKIAkJcmV0dXJuIFBUUl9FUlIoZGNzc2Jsa19yb290X2Rldik7CiAJcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGNzc2Jsa19yb290X2RldiwgJmRldl9hdHRyX2FkZCk7CiAJaWYgKHJjKSB7Ci0JCXMzOTBfcm9vdF9kZXZfdW5yZWdpc3RlcihkY3NzYmxrX3Jvb3RfZGV2KTsKKwkJcm9vdF9kZXZpY2VfdW5yZWdpc3RlcihkY3NzYmxrX3Jvb3RfZGV2KTsKIAkJcmV0dXJuIHJjOwogCX0KIAlyYyA9IGRldmljZV9jcmVhdGVfZmlsZShkY3NzYmxrX3Jvb3RfZGV2LCAmZGV2X2F0dHJfcmVtb3ZlKTsKIAlpZiAocmMpIHsKLQkJczM5MF9yb290X2Rldl91bnJlZ2lzdGVyKGRjc3NibGtfcm9vdF9kZXYpOworCQlyb290X2RldmljZV91bnJlZ2lzdGVyKGRjc3NibGtfcm9vdF9kZXYpOwogCQlyZXR1cm4gcmM7CiAJfQogCXJjID0gcmVnaXN0ZXJfYmxrZGV2KDAsIERDU1NCTEtfTkFNRSk7CiAJaWYgKHJjIDwgMCkgewotCQlzMzkwX3Jvb3RfZGV2X3VucmVnaXN0ZXIoZGNzc2Jsa19yb290X2Rldik7CisJCXJvb3RfZGV2aWNlX3VucmVnaXN0ZXIoZGNzc2Jsa19yb290X2Rldik7CiAJCXJldHVybiByYzsKIAl9CiAJZGNzc2Jsa19tYWpvciA9IHJjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNTkwLmMgYi9kcml2ZXJzL3MzOTAvY2hhci90YXBlXzM1OTAuYwppbmRleCA0MDA1YzQ0Li43MTYwNWExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci90YXBlXzM1OTAuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci90YXBlXzM1OTAuYwpAQCAtODAxLDcgKzgwMSw3IEBACiBzdGF0aWMgaW5saW5lIGludAogdGFwZV8zNTkwX2VycF9zdWNjZWRlZChzdHJ1Y3QgdGFwZV9kZXZpY2UgKmRldmljZSwgc3RydWN0IHRhcGVfcmVxdWVzdCAqcmVxdWVzdCkKIHsKLQlEQkZfRVZFTlQoMywgIkVycm9yIFJlY292ZXJ5IHN1Y2Nlc3NmdWxsIGZvciAlc1xuIiwKKwlEQkZfRVZFTlQoMywgIkVycm9yIFJlY292ZXJ5IHN1Y2Nlc3NmdWwgZm9yICVzXG4iLAogCQkgIHRhcGVfb3BfdmVyYm9zZVtyZXF1ZXN0LT5vcF0pOwogCXJldHVybiB0YXBlXzM1OTBfZG9uZShkZXZpY2UsIHJlcXVlc3QpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvdm1sb2dyZHIuYyBiL2RyaXZlcnMvczM5MC9jaGFyL3ZtbG9ncmRyLmMKaW5kZXggYWFiYmViOS4uZDhhMjI4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvdm1sb2dyZHIuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci92bWxvZ3Jkci5jCkBAIC00MjcsNyArNDI3LDcgQEAKIAkJCWJ1ZmZlciA9IHByaXYtPmJ1ZmZlciArIHNpemVvZihpbnQpOwogCQl9CiAJCS8qCi0JCSAqIElmIHRoZSByZWNvcmQgaXMgYmlnZ2VyIHRoZW4gb3VyIGJ1ZmZlciwgd2UgcmVjZWl2ZSBvbmx5CisJCSAqIElmIHRoZSByZWNvcmQgaXMgYmlnZ2VyIHRoYW4gb3VyIGJ1ZmZlciwgd2UgcmVjZWl2ZSBvbmx5CiAJCSAqIGEgcGFydCBvZiBpdC4gV2UgY2FuIGdldCB0aGUgcmVzdCBsYXRlci4KIAkJICovCiAJCWlmIChpdWN2X2RhdGFfY291bnQgPiBORVRfQlVGRkVSX1NJWkUpCkBAIC00MzcsNyArNDM3LDcgQEAKIAkJCQkJICAwLCBidWZmZXIsIGl1Y3ZfZGF0YV9jb3VudCwKIAkJCQkJICAmcHJpdi0+cmVzaWR1YWxfbGVuZ3RoKTsKIAkJc3Bpbl91bmxvY2tfYmgoJnByaXYtPnByaXZfbG9jayk7Ci0JCS8qIEFuIHJjIG9mIDUgaW5kaWNhdGVzIHRoYXQgdGhlIHJlY29yZCB3YXMgYmlnZ2VyIHRoZW4KKwkJLyogQW4gcmMgb2YgNSBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVjb3JkIHdhcyBiaWdnZXIgdGhhbgogCQkgKiB0aGUgYnVmZmVyLCB3aGljaCBpcyBPSyBmb3IgdXMuIEEgOSBpbmRpY2F0ZXMgdGhhdCB0aGUKIAkJICogcmVjb3JkIHdhcyBwdXJnZWQgYmVmb3Igd2UgY291bGQgcmVjZWl2ZSBpdC4KIAkJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2Npby5jIGIvZHJpdmVycy9zMzkwL2Npby9jaW8uYwppbmRleCAwNmI3MTgyLi42NTlmOGE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2Npby5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vY2lvLmMKQEAgLTM3OSw3ICszNzksNyBAQAogCQlpZiAoY2NvZGUgPCAwKSAvKiAtRUlPIGlmIG1zY2ggZ2V0cyBhIHByb2dyYW0gY2hlY2suICovCiAJCQlyZXR1cm4gY2NvZGU7CiAJCXN3aXRjaCAoY2NvZGUpIHsKLQkJY2FzZSAwOiAvKiBzdWNjZXNzZnVsbCAqLworCQljYXNlIDA6IC8qIHN1Y2Nlc3NmdWwgKi8KIAkJCWlmIChzdHNjaChzY2gtPnNjaGlkLCAmc2NoaWIpIHx8CiAJCQkgICAgIWNzc19zY2hfaXNfdmFsaWQoJnNjaGliKSkKIAkJCQlyZXR1cm4gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vcWRpb19tYWluLmMgYi9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fbWFpbi5jCmluZGV4IDc0NGY5MjguLjEwY2IwZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vcWRpb19tYWluLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9xZGlvX21haW4uYwpAQCAtMTE0LDcgKzExNCw3IEBACiAgKiBAY291bnQ6IGNvdW50IG9mIGJ1ZmZlcnMgdG8gZXhhbWluZQogICogQGF1dG9fYWNrOiBhdXRvbWF0aWNhbGx5IGFja25vd2xlZGdlIGJ1ZmZlcnMKICAqCi0gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bGwgZXh0cmFjdGVkIGVxdWFsIGJ1ZmZlciBzdGF0ZXMuCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bGx5IGV4dHJhY3RlZCBlcXVhbCBidWZmZXIgc3RhdGVzLgogICogU3RvcHMgcHJvY2Vzc2luZyBpZiBhIHN0YXRlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBsYXN0IGJ1ZmZlcnMgc3RhdGUuCiAgKi8KIHN0YXRpYyBpbnQgcWRpb19kb19lcWJzKHN0cnVjdCBxZGlvX3EgKnEsIHVuc2lnbmVkIGNoYXIgKnN0YXRlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NyeXB0by9hcF9idXMuYyBiL2RyaXZlcnMvczM5MC9jcnlwdG8vYXBfYnVzLmMKaW5kZXggMWY1ZjVkMi4uOWMxNDg0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NyeXB0by9hcF9idXMuYworKysgYi9kcml2ZXJzL3MzOTAvY3J5cHRvL2FwX2J1cy5jCkBAIC0zNiw3ICszNiw2IEBACiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxhc20vczM5MF9yZGV2Lmg+CiAjaW5jbHVkZSA8YXNtL3Jlc2V0Lmg+CiAjaW5jbHVkZSA8YXNtL2FpcnEuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CkBAIC0xNTIyLDcgKzE1MjEsNyBAQAogCX0KIAogCS8qIENyZWF0ZSAvc3lzL2RldmljZXMvYXAuICovCi0JYXBfcm9vdF9kZXZpY2UgPSBzMzkwX3Jvb3RfZGV2X3JlZ2lzdGVyKCJhcCIpOworCWFwX3Jvb3RfZGV2aWNlID0gcm9vdF9kZXZpY2VfcmVnaXN0ZXIoImFwIik7CiAJcmMgPSBJU19FUlIoYXBfcm9vdF9kZXZpY2UpID8gUFRSX0VSUihhcF9yb290X2RldmljZSkgOiAwOwogCWlmIChyYykKIAkJZ290byBvdXRfYnVzOwpAQCAtMTU2NSw3ICsxNTY0LDcgQEAKIAlocnRpbWVyX2NhbmNlbCgmYXBfcG9sbF90aW1lcik7CiAJZGVzdHJveV93b3JrcXVldWUoYXBfd29ya19xdWV1ZSk7CiBvdXRfcm9vdDoKLQlzMzkwX3Jvb3RfZGV2X3VucmVnaXN0ZXIoYXBfcm9vdF9kZXZpY2UpOworCXJvb3RfZGV2aWNlX3VucmVnaXN0ZXIoYXBfcm9vdF9kZXZpY2UpOwogb3V0X2J1czoKIAl3aGlsZSAoaS0tKQogCQlidXNfcmVtb3ZlX2ZpbGUoJmFwX2J1c190eXBlLCBhcF9idXNfYXR0cnNbaV0pOwpAQCAtMTYwMCw3ICsxNTk5LDcgQEAKIAlocnRpbWVyX2NhbmNlbCgmYXBfcG9sbF90aW1lcik7CiAJZGVzdHJveV93b3JrcXVldWUoYXBfd29ya19xdWV1ZSk7CiAJdGFza2xldF9raWxsKCZhcF90YXNrbGV0KTsKLQlzMzkwX3Jvb3RfZGV2X3VucmVnaXN0ZXIoYXBfcm9vdF9kZXZpY2UpOworCXJvb3RfZGV2aWNlX3VucmVnaXN0ZXIoYXBfcm9vdF9kZXZpY2UpOwogCXdoaWxlICgoZGV2ID0gYnVzX2ZpbmRfZGV2aWNlKCZhcF9idXNfdHlwZSwgTlVMTCwgTlVMTCwKIAkJICAgIF9fYXBfbWF0Y2hfYWxsKSkpCiAJewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2t2bS9rdm1fdmlydGlvLmMgYi9kcml2ZXJzL3MzOTAva3ZtL2t2bV92aXJ0aW8uYwppbmRleCAyOGM5MGI4Li5jYmM4NTY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAva3ZtL2t2bV92aXJ0aW8uYworKysgYi9kcml2ZXJzL3MzOTAva3ZtL2t2bV92aXJ0aW8uYwpAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgPGFzbS9rdm1fdmlydGlvLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL3MzOTBfZXh0Lmg+Ci0jaW5jbHVkZSA8YXNtL3MzOTBfcmRldi5oPgogCiAjZGVmaW5lIFZJUlRJT19TVUJDT0RFXzY0IDB4MEQwMAogCkBAIC0zMzUsNyArMzM0LDcgQEAKIAlpZiAoIU1BQ0hJTkVfSVNfS1ZNKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWt2bV9yb290ID0gczM5MF9yb290X2Rldl9yZWdpc3Rlcigia3ZtX3MzOTAiKTsKKwlrdm1fcm9vdCA9IHJvb3RfZGV2aWNlX3JlZ2lzdGVyKCJrdm1fczM5MCIpOwogCWlmIChJU19FUlIoa3ZtX3Jvb3QpKSB7CiAJCXJjID0gUFRSX0VSUihrdm1fcm9vdCk7CiAJCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IHJlZ2lzdGVyIGt2bV9zMzkwIHJvb3QgZGV2aWNlIik7CkBAIC0zNDQsNyArMzQzLDcgQEAKIAogCXJjID0gdm1lbV9hZGRfbWFwcGluZyhyZWFsX21lbW9yeV9zaXplLCBQQUdFX1NJWkUpOwogCWlmIChyYykgewotCQlzMzkwX3Jvb3RfZGV2X3VucmVnaXN0ZXIoa3ZtX3Jvb3QpOworCQlyb290X2RldmljZV91bnJlZ2lzdGVyKGt2bV9yb290KTsKIAkJcmV0dXJuIHJjOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9jdTMwODguYyBiL2RyaXZlcnMvczM5MC9uZXQvY3UzMDg4LmMKaW5kZXggZjRhMzIzNy4uNDgzODM0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9jdTMwODguYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L2N1MzA4OC5jCkBAIC0yNSw3ICsyNSw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAKLSNpbmNsdWRlIDxhc20vczM5MF9yZGV2Lmg+CiAjaW5jbHVkZSA8YXNtL2Njd2Rldi5oPgogI2luY2x1ZGUgPGFzbS9jY3dncm91cC5oPgogCkBAIC0xMjAsMTIgKzExOSwxMiBAQAogewogCWludCByYzsKIAotCWN1MzA4OF9yb290X2RldiA9IHMzOTBfcm9vdF9kZXZfcmVnaXN0ZXIoImN1MzA4OCIpOworCWN1MzA4OF9yb290X2RldiA9IHJvb3RfZGV2aWNlX3JlZ2lzdGVyKCJjdTMwODgiKTsKIAlpZiAoSVNfRVJSKGN1MzA4OF9yb290X2RldikpCiAJCXJldHVybiBQVFJfRVJSKGN1MzA4OF9yb290X2Rldik7CiAJcmMgPSBjY3dfZHJpdmVyX3JlZ2lzdGVyKCZjdTMwODhfZHJpdmVyKTsKIAlpZiAocmMpCi0JCXMzOTBfcm9vdF9kZXZfdW5yZWdpc3RlcihjdTMwODhfcm9vdF9kZXYpOworCQlyb290X2RldmljZV91bnJlZ2lzdGVyKGN1MzA4OF9yb290X2Rldik7CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC0xMzQsNyArMTMzLDcgQEAKIGN1MzA4OF9leGl0ICh2b2lkKQogewogCWNjd19kcml2ZXJfdW5yZWdpc3RlcigmY3UzMDg4X2RyaXZlcik7Ci0JczM5MF9yb290X2Rldl91bnJlZ2lzdGVyKGN1MzA4OF9yb290X2Rldik7CisJcm9vdF9kZXZpY2VfdW5yZWdpc3RlcihjdTMwODhfcm9vdF9kZXYpOwogfQogCiBNT0RVTEVfREVWSUNFX1RBQkxFKGNjdyxjdTMwODhfaWRzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlLmggYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZS5oCmluZGV4IGQ1Y2NjZTEuLmUwYzQ1NTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlLmgKKysrIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmUuaApAQCAtNjQzLDcgKzY0Myw2IEBACiAJaW50IG1hY2FkZHJfbW9kZTsKIAlpbnQgZmFrZV9icm9hZGNhc3Q7CiAJaW50IGFkZF9oaGxlbjsKLQlpbnQgZmFrZV9sbDsKIAlpbnQgbGF5ZXIyOwogCWVudW0gcWV0aF9sYXJnZV9zZW5kX3R5cGVzIGxhcmdlX3NlbmQ7CiAJaW50IHBlcmZvcm1hbmNlX3N0YXRzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmVfbWFpbi5jIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmVfbWFpbi5jCmluZGV4IGU3ODM2NDQuLmQxYjViZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlX21haW4uYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZV9tYWluLmMKQEAgLTI0LDcgKzI0LDYgQEAKIAogI2luY2x1ZGUgPGFzbS9lYmNkaWMuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vczM5MF9yZGV2Lmg+CiAKICNpbmNsdWRlICJxZXRoX2NvcmUuaCIKICNpbmNsdWRlICJxZXRoX2NvcmVfb2ZmbC5oIgpAQCAtMjg3LDggKzI4NiwxNSBAQAogCWNhcmQtPm9wdGlvbnMubGFyZ2Vfc2VuZCA9IHR5cGU7CiAJc3dpdGNoIChjYXJkLT5vcHRpb25zLmxhcmdlX3NlbmQpIHsKIAljYXNlIFFFVEhfTEFSR0VfU0VORF9FRERQOgotCQljYXJkLT5kZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPIHwgTkVUSUZfRl9TRyB8CisJCWlmIChjYXJkLT5pbmZvLnR5cGUgIT0gUUVUSF9DQVJEX1RZUEVfSVFEKSB7CisJCQljYXJkLT5kZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPIHwgTkVUSUZfRl9TRyB8CiAJCQkJCU5FVElGX0ZfSFdfQ1NVTTsKKwkJfSBlbHNlIHsKKwkJCWNhcmQtPmRldi0+ZmVhdHVyZXMgJj0gfihORVRJRl9GX1RTTyB8IE5FVElGX0ZfU0cgfAorCQkJCQkJTkVUSUZfRl9IV19DU1VNKTsKKwkJCWNhcmQtPm9wdGlvbnMubGFyZ2Vfc2VuZCA9IFFFVEhfTEFSR0VfU0VORF9OTzsKKwkJCXJjID0gLUVPUE5PVFNVUFA7CisJCX0KIAkJYnJlYWs7CiAJY2FzZSBRRVRIX0xBUkdFX1NFTkRfVFNPOgogCQlpZiAocWV0aF9pc19zdXBwb3J0ZWQoY2FyZCwgSVBBX09VVEJPVU5EX1RTTykpIHsKQEAgLTU3Miw2ICs1NzgsMTAgQEAKIAljYXJkID0gQ0FSRF9GUk9NX0NERVYoY2hhbm5lbC0+Y2N3ZGV2KTsKIAlpZiAocWV0aF9jaGVja19pZHhfcmVzcG9uc2UoaW9iLT5kYXRhKSkgewogCQlxZXRoX2NsZWFyX2lwYWNtZF9saXN0KGNhcmQpOworCQlpZiAoKChpb2ItPmRhdGFbMl0gJiAweGMwKSA9PSAweGMwKSAmJiBpb2ItPmRhdGFbNF0gPT0gMHhmNikKKwkJCWRldl9lcnIoJmNhcmQtPmdkZXYtPmRldiwKKwkJCQkiVGhlIHFldGggZGV2aWNlIGlzIG5vdCBjb25maWd1cmVkICIKKwkJCQkiZm9yIHRoZSBPU0kgbGF5ZXIgcmVxdWlyZWQgYnkgei9WTVxuIik7CiAJCXFldGhfc2NoZWR1bGVfcmVjb3ZlcnkoY2FyZCk7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTEwNzIsNyArMTA4Miw2IEBACiAJY2FyZC0+b3B0aW9ucy5tYWNhZGRyX21vZGUgPSBRRVRIX1RSX01BQ0FERFJfTk9OQ0FOT05JQ0FMOwogCWNhcmQtPm9wdGlvbnMuZmFrZV9icm9hZGNhc3QgPSAwOwogCWNhcmQtPm9wdGlvbnMuYWRkX2hobGVuID0gREVGQVVMVF9BRERfSEhMRU47Ci0JY2FyZC0+b3B0aW9ucy5mYWtlX2xsID0gMDsKIAljYXJkLT5vcHRpb25zLnBlcmZvcm1hbmNlX3N0YXRzID0gMDsKIAljYXJkLT5vcHRpb25zLnJ4X3NnX2NiID0gUUVUSF9SWF9TR19DQjsKIH0KQEAgLTE2ODIsNiArMTY5MSw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgcWV0aF9yZXBseSAqcmVwbHkgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwlzdHJ1Y3QgcWV0aF9pcGFfY21kICpjbWQ7CiAKIAlRRVRIX0RCRl9URVhUKFRSQUNFLCAyLCAic2VuZGN0bCIpOwogCkBAIC0xNzI4LDE3ICsxNzM4LDM0IEBACiAJCXdha2VfdXAoJmNhcmQtPndhaXRfcSk7CiAJCXJldHVybiByYzsKIAl9Ci0Jd2hpbGUgKCFhdG9taWNfcmVhZCgmcmVwbHktPnJlY2VpdmVkKSkgewotCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnJlcGx5LT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JCQlsaXN0X2RlbF9pbml0KCZyZXBseS0+bGlzdCk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZXBseS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCQkJcmVwbHktPnJjID0gLUVUSU1FOwotCQkJYXRvbWljX2luYygmcmVwbHktPnJlY2VpdmVkKTsKLQkJCXdha2VfdXAoJnJlcGx5LT53YWl0X3EpOwotCQl9Ci0JCWNwdV9yZWxheCgpOwotCX07CisKKwkvKiB3ZSBoYXZlIG9ubHkgb25lIGxvbmcgcnVubmluZyBpcGFzc2lzdCwgc2luY2Ugd2UgY2FuIGVuc3VyZQorCSAgIHByb2Nlc3MgY29udGV4dCBvZiB0aGlzIGNvbW1hbmQgd2UgY2FuIHNsZWVwICovCisJY21kID0gKHN0cnVjdCBxZXRoX2lwYV9jbWQgKikoaW9iLT5kYXRhK0lQQV9QRFVfSEVBREVSX1NJWkUpOworCWlmICgoY21kLT5oZHIuY29tbWFuZCA9PSBJUEFfQ01EX1NFVElQKSAmJgorCSAgICAoY21kLT5oZHIucHJvdF92ZXJzaW9uID09IFFFVEhfUFJPVF9JUFY0KSkgeworCQlpZiAoIXdhaXRfZXZlbnRfdGltZW91dChyZXBseS0+d2FpdF9xLAorCQkgICAgYXRvbWljX3JlYWQoJnJlcGx5LT5yZWNlaXZlZCksIHRpbWVvdXQpKQorCQkJZ290byB0aW1lX2VycjsKKwl9IGVsc2UgeworCQl3aGlsZSAoIWF0b21pY19yZWFkKCZyZXBseS0+cmVjZWl2ZWQpKSB7CisJCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkKKwkJCQlnb3RvIHRpbWVfZXJyOworCQkJY3B1X3JlbGF4KCk7CisJCX07CisJfQorCisJcmMgPSByZXBseS0+cmM7CisJcWV0aF9wdXRfcmVwbHkocmVwbHkpOworCXJldHVybiByYzsKKwordGltZV9lcnI6CisJc3Bpbl9sb2NrX2lycXNhdmUoJnJlcGx5LT5jYXJkLT5sb2NrLCBmbGFncyk7CisJbGlzdF9kZWxfaW5pdCgmcmVwbHktPmxpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJlcGx5LT5jYXJkLT5sb2NrLCBmbGFncyk7CisJcmVwbHktPnJjID0gLUVUSU1FOworCWF0b21pY19pbmMoJnJlcGx5LT5yZWNlaXZlZCk7CisJd2FrZV91cCgmcmVwbHktPndhaXRfcSk7CiAJcmMgPSByZXBseS0+cmM7CiAJcWV0aF9wdXRfcmVwbHkocmVwbHkpOwogCXJldHVybiByYzsKQEAgLTIyNTAsNyArMjI3Nyw4IEBACiAJCX0KIAkJLyogZmFsbHRocm91Z2ggKi8KIAljYXNlIFFFVEhfQ0FSRF9UWVBFX0lRRDoKLQkJaWYgKGNhcmQtPmluZm8uZ3Vlc3RsYW4pIHsKKwkJaWYgKChjYXJkLT5pbmZvLmd1ZXN0bGFuKSB8fAorCQkgICAgKGNhcmQtPmluZm8ubWNsX2xldmVsWzBdICYgMHg4MCkpIHsKIAkJCWNhcmQtPmluZm8ubWNsX2xldmVsWzBdID0gKGNoYXIpIF9lYmNhc2NbKF9fdTgpCiAJCQkJY2FyZC0+aW5mby5tY2xfbGV2ZWxbMF1dOwogCQkJY2FyZC0+aW5mby5tY2xfbGV2ZWxbMV0gPSAoY2hhcikgX2ViY2FzY1soX191OCkKQEAgLTQ0OTYsNyArNDUyNCw3IEBACiAJCQkJJmRyaXZlcl9hdHRyX2dyb3VwKTsKIAlpZiAocmMpCiAJCWdvdG8gZHJpdmVyX2VycjsKLQlxZXRoX2NvcmVfcm9vdF9kZXYgPSBzMzkwX3Jvb3RfZGV2X3JlZ2lzdGVyKCJxZXRoIik7CisJcWV0aF9jb3JlX3Jvb3RfZGV2ID0gcm9vdF9kZXZpY2VfcmVnaXN0ZXIoInFldGgiKTsKIAlyYyA9IElTX0VSUihxZXRoX2NvcmVfcm9vdF9kZXYpID8gUFRSX0VSUihxZXRoX2NvcmVfcm9vdF9kZXYpIDogMDsKIAlpZiAocmMpCiAJCWdvdG8gcmVnaXN0ZXJfZXJyOwpAQCAtNDUxMCw3ICs0NTM4LDcgQEAKIAogCXJldHVybiAwOwogc2xhYl9lcnI6Ci0JczM5MF9yb290X2Rldl91bnJlZ2lzdGVyKHFldGhfY29yZV9yb290X2Rldik7CisJcm9vdF9kZXZpY2VfdW5yZWdpc3RlcihxZXRoX2NvcmVfcm9vdF9kZXYpOwogcmVnaXN0ZXJfZXJyOgogCWRyaXZlcl9yZW1vdmVfZmlsZSgmcWV0aF9jb3JlX2Njd2dyb3VwX2RyaXZlci5kcml2ZXIsCiAJCQkgICAmZHJpdmVyX2F0dHJfZ3JvdXApOwpAQCAtNDUyOCw3ICs0NTU2LDcgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IHFldGhfY29yZV9leGl0KHZvaWQpCiB7Ci0JczM5MF9yb290X2Rldl91bnJlZ2lzdGVyKHFldGhfY29yZV9yb290X2Rldik7CisJcm9vdF9kZXZpY2VfdW5yZWdpc3RlcihxZXRoX2NvcmVfcm9vdF9kZXYpOwogCWRyaXZlcl9yZW1vdmVfZmlsZSgmcWV0aF9jb3JlX2Njd2dyb3VwX2RyaXZlci5kcml2ZXIsCiAJCQkgICAmZHJpdmVyX2F0dHJfZ3JvdXApOwogCWNjd2dyb3VwX2RyaXZlcl91bnJlZ2lzdGVyKCZxZXRoX2NvcmVfY2N3Z3JvdXBfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sMl9tYWluLmMgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDJfbWFpbi5jCmluZGV4IDJjNDg1OTEuLmM0ZjFiMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sMl9tYWluLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2wyX21haW4uYwpAQCAtMjAsOCArMjAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21paS5oPgogI2luY2x1ZGUgPGxpbnV4L2lwLmg+CiAKLSNpbmNsdWRlIDxhc20vczM5MF9yZGV2Lmg+Ci0KICNpbmNsdWRlICJxZXRoX2NvcmUuaCIKICNpbmNsdWRlICJxZXRoX2NvcmVfb2ZmbC5oIgogCkBAIC05MTgsNiArOTE2LDIxIEBACiAJLmdldF9kcnZpbmZvID0gcWV0aF9jb3JlX2dldF9kcnZpbmZvLAogfTsKIAorc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX29wcyBxZXRoX2wyX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCQk9IHFldGhfbDJfb3BlbiwKKwkubmRvX3N0b3AJCT0gcWV0aF9sMl9zdG9wLAorCS5uZG9fZ2V0X3N0YXRzCQk9IHFldGhfZ2V0X3N0YXRzLAorCS5uZG9fc3RhcnRfeG1pdAkJPSBxZXRoX2wyX2hhcmRfc3RhcnRfeG1pdCwKKwkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IHFldGhfbDJfc2V0X211bHRpY2FzdF9saXN0LAorCS5uZG9fZG9faW9jdGwJICAgCT0gcWV0aF9sMl9kb19pb2N0bCwKKwkubmRvX3NldF9tYWNfYWRkcmVzcyAgICA9IHFldGhfbDJfc2V0X21hY19hZGRyZXNzLAorCS5uZG9fY2hhbmdlX210dQkgICAJPSBxZXRoX2NoYW5nZV9tdHUsCisJLm5kb192bGFuX3J4X2FkZF92aWQJPSBxZXRoX2wyX3ZsYW5fcnhfYWRkX3ZpZCwKKwkubmRvX3ZsYW5fcnhfa2lsbF92aWQgICA9IHFldGhfbDJfdmxhbl9yeF9raWxsX3ZpZCwKKwkubmRvX3R4X3RpbWVvdXQJICAgCT0gcWV0aF90eF90aW1lb3V0LAorfTsKKwogc3RhdGljIGludCBxZXRoX2wyX3NldHVwX25ldGRldihzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkKQogewogCXN3aXRjaCAoY2FyZC0+aW5mby50eXBlKSB7CkBAIC05MzksMTkgKzk1Miw5IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJY2FyZC0+ZGV2LT5tbF9wcml2ID0gY2FyZDsKLQljYXJkLT5kZXYtPnR4X3RpbWVvdXQgPSAmcWV0aF90eF90aW1lb3V0OwogCWNhcmQtPmRldi0+d2F0Y2hkb2dfdGltZW8gPSBRRVRIX1RYX1RJTUVPVVQ7Ci0JY2FyZC0+ZGV2LT5vcGVuID0gcWV0aF9sMl9vcGVuOwotCWNhcmQtPmRldi0+c3RvcCA9IHFldGhfbDJfc3RvcDsKLQljYXJkLT5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHFldGhfbDJfaGFyZF9zdGFydF94bWl0OwotCWNhcmQtPmRldi0+ZG9faW9jdGwgPSBxZXRoX2wyX2RvX2lvY3RsOwotCWNhcmQtPmRldi0+Z2V0X3N0YXRzID0gcWV0aF9nZXRfc3RhdHM7Ci0JY2FyZC0+ZGV2LT5jaGFuZ2VfbXR1ID0gcWV0aF9jaGFuZ2VfbXR1OwotCWNhcmQtPmRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gcWV0aF9sMl9zZXRfbXVsdGljYXN0X2xpc3Q7Ci0JY2FyZC0+ZGV2LT52bGFuX3J4X2tpbGxfdmlkID0gcWV0aF9sMl92bGFuX3J4X2tpbGxfdmlkOwotCWNhcmQtPmRldi0+dmxhbl9yeF9hZGRfdmlkID0gcWV0aF9sMl92bGFuX3J4X2FkZF92aWQ7Ci0JY2FyZC0+ZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBxZXRoX2wyX3NldF9tYWNfYWRkcmVzczsKIAljYXJkLT5kZXYtPm10dSA9IGNhcmQtPmluZm8uaW5pdGlhbF9tdHU7CisJY2FyZC0+ZGV2LT5uZXRkZXZfb3BzID0gJnFldGhfbDJfbmV0ZGV2X29wczsKIAlpZiAoY2FyZC0+aW5mby50eXBlICE9IFFFVEhfQ0FSRF9UWVBFX09TTikKIAkJU0VUX0VUSFRPT0xfT1BTKGNhcmQtPmRldiwgJnFldGhfbDJfZXRodG9vbF9vcHMpOwogCWVsc2UKQEAgLTExMjYsOSArMTEyOSwxMSBAQAogCQlkZXZfaW5mbygmY2FyZC0+Z2Rldi0+ZGV2LAogCQkJIkRldmljZSBzdWNjZXNzZnVsbHkgcmVjb3ZlcmVkIVxuIik7CiAJZWxzZSB7Ci0JCXJ0bmxfbG9jaygpOwotCQlkZXZfY2xvc2UoY2FyZC0+ZGV2KTsKLQkJcnRubF91bmxvY2soKTsKKwkJaWYgKGNhcmQtPmRldikgeworCQkJcnRubF9sb2NrKCk7CisJCQlkZXZfY2xvc2UoY2FyZC0+ZGV2KTsKKwkJCXJ0bmxfdW5sb2NrKCk7CisJCX0KIAkJZGV2X3dhcm4oJmNhcmQtPmdkZXYtPmRldiwgIlRoZSBxZXRoIGRldmljZSBkcml2ZXIgIgogCQkJImZhaWxlZCB0byByZWNvdmVyIGFuIGVycm9yIG9uIHRoZSBkZXZpY2VcbiIpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sM19tYWluLmMgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDNfbWFpbi5jCmluZGV4IGMwYjMwYjIuLjY4ZDYyM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sM19tYWluLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2wzX21haW4uYwpAQCAtMjYsOCArMjYsNiBAQAogI2luY2x1ZGUgPG5ldC9pcC5oPgogI2luY2x1ZGUgPG5ldC9hcnAuaD4KIAotI2luY2x1ZGUgPGFzbS9zMzkwX3JkZXYuaD4KLQogI2luY2x1ZGUgInFldGhfbDMuaCIKICNpbmNsdWRlICJxZXRoX2NvcmVfb2ZmbC5oIgogCkBAIC0xMDQ3LDcgKzEwNDUsNyBAQAogCQlyYyA9IHFldGhfc2V0YWRwcGFybXNfY2hhbmdlX21hY2FkZHIoY2FyZCk7CiAJCWlmIChyYykKIAkJCWRldl93YXJuKCZjYXJkLT5nZGV2LT5kZXYsICJSZWFkaW5nIHRoZSBhZGFwdGVyIE1BQyIKLQkJCQkiIGFkZHJlc3MgZmFpbGVkXG4iLCByYyk7CisJCQkJIiBhZGRyZXNzIGZhaWxlZFxuIik7CiAJfQogCiAJaWYgKChjYXJkLT5pbmZvLmxpbmtfdHlwZSA9PSBRRVRIX0xJTktfVFlQRV9IU1RSKSB8fApAQCAtMTIwNywxMiArMTIwNSw5IEBACiAKIAlRRVRIX0RCRl9URVhUKFRSQUNFLCAzLCAic3RzcmNtYWMiKTsKIAotCWlmICghY2FyZC0+b3B0aW9ucy5mYWtlX2xsKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KIAlpZiAoIXFldGhfaXNfc3VwcG9ydGVkKGNhcmQsIElQQV9TT1VSQ0VfTUFDKSkgewogCQlkZXZfaW5mbygmY2FyZC0+Z2Rldi0+ZGV2LAotCQkJIkluYm91bmQgc291cmNlIGFkZHJlc3Mgbm90IHN1cHBvcnRlZCBvbiAlc1xuIiwKKwkJCSJJbmJvdW5kIHNvdXJjZSBNQUMtYWRkcmVzcyBub3Qgc3VwcG9ydGVkIG9uICVzXG4iLAogCQkJUUVUSF9DQVJEX0lGTkFNRShjYXJkKSk7CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CkBAIC0xMjIxLDcgKzEyMTYsNyBAQAogCQkJCQkgIElQQV9DTURfQVNTX1NUQVJULCAwKTsKIAlpZiAocmMpCiAJCWRldl93YXJuKCZjYXJkLT5nZGV2LT5kZXYsCi0JCQkiU3RhcnRpbmcgcHJveHkgQVJQIHN1cHBvcnQgZm9yICVzIGZhaWxlZFxuIiwKKwkJCSJTdGFydGluZyBzb3VyY2UgTUFDLWFkZHJlc3Mgc3VwcG9ydCBmb3IgJXMgZmFpbGVkXG4iLAogCQkJUUVUSF9DQVJEX0lGTkFNRShjYXJkKSk7CiAJcmV0dXJuIHJjOwogfQpAQCAtMTgzNCwyOCArMTgyOSw2IEBACiAKIHN0YXRpYyB2b2lkIHFldGhfbDNfdmxhbl9yeF9hZGRfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZpZCkKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqdmxhbmRldjsKLQlzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkID0gZGV2LT5tbF9wcml2OwotCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKLQotCWlmIChjYXJkLT5pbmZvLnR5cGUgPT0gUUVUSF9DQVJEX1RZUEVfSVFEKQotCQlyZXR1cm47Ci0KLQl2bGFuZGV2ID0gdmxhbl9ncm91cF9nZXRfZGV2aWNlKGNhcmQtPnZsYW5ncnAsIHZpZCk7Ci0JdmxhbmRldi0+bmVpZ2hfc2V0dXAgPSBxZXRoX2wzX25laWdoX3NldHVwOwotCi0JaW5fZGV2ID0gaW5fZGV2X2dldCh2bGFuZGV2KTsKLSNpZmRlZiBDT05GSUdfU1lTQ1RMCi0JbmVpZ2hfc3lzY3RsX3VucmVnaXN0ZXIoaW5fZGV2LT5hcnBfcGFybXMpOwotI2VuZGlmCi0JbmVpZ2hfcGFybXNfcmVsZWFzZSgmYXJwX3RibCwgaW5fZGV2LT5hcnBfcGFybXMpOwotCi0JaW5fZGV2LT5hcnBfcGFybXMgPSBuZWlnaF9wYXJtc19hbGxvYyh2bGFuZGV2LCAmYXJwX3RibCk7Ci0jaWZkZWYgQ09ORklHX1NZU0NUTAotCW5laWdoX3N5c2N0bF9yZWdpc3Rlcih2bGFuZGV2LCBpbl9kZXYtPmFycF9wYXJtcywgTkVUX0lQVjQsCi0JCQkgICAgICBORVRfSVBWNF9ORUlHSCwgImlwdjQiLCBOVUxMLCBOVUxMKTsKLSNlbmRpZgotCWluX2Rldl9wdXQoaW5fZGV2KTsKIAlyZXR1cm47CiB9CiAKQEAgLTE5MjEsOCArMTg5NCwxMyBAQAogCQkJbWVtY3B5KHRnX2FkZHIsIGNhcmQtPmRldi0+ZGV2X2FkZHIsCiAJCQkJY2FyZC0+ZGV2LT5hZGRyX2xlbik7CiAJCX0KLQkJY2FyZC0+ZGV2LT5oZWFkZXJfb3BzLT5jcmVhdGUoc2tiLCBjYXJkLT5kZXYsIHByb3QsIHRnX2FkZHIsCi0JCQkJCSAgICAgICJGQUtFTEwiLCBjYXJkLT5kZXYtPmFkZHJfbGVuKTsKKwkJaWYgKGhkci0+aGRyLmwzLmV4dF9mbGFncyAmIFFFVEhfSERSX0VYVF9TUkNfTUFDX0FERFIpCisJCQljYXJkLT5kZXYtPmhlYWRlcl9vcHMtPmNyZWF0ZShza2IsIGNhcmQtPmRldiwgcHJvdCwKKwkJCQl0Z19hZGRyLCAmaGRyLT5oZHIubDMuZGVzdF9hZGRyWzJdLAorCQkJCWNhcmQtPmRldi0+YWRkcl9sZW4pOworCQllbHNlCisJCQljYXJkLT5kZXYtPmhlYWRlcl9vcHMtPmNyZWF0ZShza2IsIGNhcmQtPmRldiwgcHJvdCwKKwkJCQl0Z19hZGRyLCAiRkFLRUxMIiwgY2FyZC0+ZGV2LT5hZGRyX2xlbik7CiAJfQogCiAjaWZkZWYgQ09ORklHX1RSCkBAIC0yMDgwLDkgKzIwNTgsMTEgQEAKIAkJaWYgKHJlY292ZXJ5X21vZGUpCiAJCQlxZXRoX2wzX3N0b3AoY2FyZC0+ZGV2KTsKIAkJZWxzZSB7Ci0JCQlydG5sX2xvY2soKTsKLQkJCWRldl9jbG9zZShjYXJkLT5kZXYpOwotCQkJcnRubF91bmxvY2soKTsKKwkJCWlmIChjYXJkLT5kZXYpIHsKKwkJCQlydG5sX2xvY2soKTsKKwkJCQlkZXZfY2xvc2UoY2FyZC0+ZGV2KTsKKwkJCQlydG5sX3VubG9jaygpOworCQkJfQogCQl9CiAJCWlmICghY2FyZC0+dXNlX2hhcmRfc3RvcCkgewogCQkJcmMgPSBxZXRoX3NlbmRfc3RvcGxhbihjYXJkKTsKQEAgLTI5MTQsNiArMjg5NCwyMSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHFldGhfbDNfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gcWV0aF9sM19vcGVuLAorCS5uZG9fc3RvcAkJPSBxZXRoX2wzX3N0b3AsCisJLm5kb19nZXRfc3RhdHMJCT0gcWV0aF9nZXRfc3RhdHMsCisJLm5kb19zdGFydF94bWl0CQk9IHFldGhfbDNfaGFyZF9zdGFydF94bWl0LAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gcWV0aF9sM19zZXRfbXVsdGljYXN0X2xpc3QsCisJLm5kb19kb19pb2N0bAkgICAJPSBxZXRoX2wzX2RvX2lvY3RsLAorCS5uZG9fY2hhbmdlX210dQkgICAJPSBxZXRoX2NoYW5nZV9tdHUsCisJLm5kb192bGFuX3J4X3JlZ2lzdGVyCT0gcWV0aF9sM192bGFuX3J4X3JlZ2lzdGVyLAorCS5uZG9fdmxhbl9yeF9hZGRfdmlkCT0gcWV0aF9sM192bGFuX3J4X2FkZF92aWQsCisJLm5kb192bGFuX3J4X2tpbGxfdmlkICAgPSBxZXRoX2wzX3ZsYW5fcnhfa2lsbF92aWQsCisJLm5kb190eF90aW1lb3V0CSAgIAk9IHFldGhfdHhfdGltZW91dCwKK307CisKIHN0YXRpYyBpbnQgcWV0aF9sM19zZXR1cF9uZXRkZXYoc3RydWN0IHFldGhfY2FyZCAqY2FyZCkKIHsKIAlpZiAoY2FyZC0+aW5mby50eXBlID09IFFFVEhfQ0FSRF9UWVBFX09TQUUpIHsKQEAgLTI5MjgsNyArMjkyMyw4IEBACiAJCQljYXJkLT5kZXYgPSBhbGxvY19ldGhlcmRldigwKTsKIAkJCWlmICghY2FyZC0+ZGV2KQogCQkJCXJldHVybiAtRU5PREVWOwotCQkJY2FyZC0+ZGV2LT5uZWlnaF9zZXR1cCA9IHFldGhfbDNfbmVpZ2hfc2V0dXA7CisJCQlxZXRoX2wzX25ldGRldl9vcHMubmRvX25laWdoX3NldHVwID0KKwkJCQlxZXRoX2wzX25laWdoX3NldHVwOwogCiAJCQkvKklQdjYgYWRkcmVzcyBhdXRvY29uZmlndXJhdGlvbiBzdHVmZiovCiAJCQlxZXRoX2wzX2dldF91bmlxdWVfaWQoY2FyZCk7CkBAIC0yOTQ1LDIxICsyOTQxLDEwIEBACiAJfSBlbHNlCiAJCXJldHVybiAtRU5PREVWOwogCi0JY2FyZC0+ZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBxZXRoX2wzX2hhcmRfc3RhcnRfeG1pdDsKIAljYXJkLT5kZXYtPm1sX3ByaXYgPSBjYXJkOwotCWNhcmQtPmRldi0+dHhfdGltZW91dCA9ICZxZXRoX3R4X3RpbWVvdXQ7CiAJY2FyZC0+ZGV2LT53YXRjaGRvZ190aW1lbyA9IFFFVEhfVFhfVElNRU9VVDsKLQljYXJkLT5kZXYtPm9wZW4gPSBxZXRoX2wzX29wZW47Ci0JY2FyZC0+ZGV2LT5zdG9wID0gcWV0aF9sM19zdG9wOwotCWNhcmQtPmRldi0+ZG9faW9jdGwgPSBxZXRoX2wzX2RvX2lvY3RsOwotCWNhcmQtPmRldi0+Z2V0X3N0YXRzID0gcWV0aF9nZXRfc3RhdHM7Ci0JY2FyZC0+ZGV2LT5jaGFuZ2VfbXR1ID0gcWV0aF9jaGFuZ2VfbXR1OwotCWNhcmQtPmRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gcWV0aF9sM19zZXRfbXVsdGljYXN0X2xpc3Q7Ci0JY2FyZC0+ZGV2LT52bGFuX3J4X3JlZ2lzdGVyID0gcWV0aF9sM192bGFuX3J4X3JlZ2lzdGVyOwotCWNhcmQtPmRldi0+dmxhbl9yeF9hZGRfdmlkID0gcWV0aF9sM192bGFuX3J4X2FkZF92aWQ7Ci0JY2FyZC0+ZGV2LT52bGFuX3J4X2tpbGxfdmlkID0gcWV0aF9sM192bGFuX3J4X2tpbGxfdmlkOwogCWNhcmQtPmRldi0+bXR1ID0gY2FyZC0+aW5mby5pbml0aWFsX210dTsKLQljYXJkLT5kZXYtPnNldF9tYWNfYWRkcmVzcyA9IE5VTEw7CisJY2FyZC0+ZGV2LT5uZXRkZXZfb3BzID0gJnFldGhfbDNfbmV0ZGV2X29wczsKIAlTRVRfRVRIVE9PTF9PUFMoY2FyZC0+ZGV2LCAmcWV0aF9sM19ldGh0b29sX29wcyk7CiAJY2FyZC0+ZGV2LT5mZWF0dXJlcyB8PQlORVRJRl9GX0hXX1ZMQU5fVFggfAogCQkJCU5FVElGX0ZfSFdfVkxBTl9SWCB8CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvczM5MF9yZGV2LmMgYi9kcml2ZXJzL3MzOTAvczM5MF9yZGV2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MzcxYzAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zMzkwL3MzOTBfcmRldi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqICBkcml2ZXJzL3MzOTAvczM5MF9yZGV2LmMKLSAqICBzMzkwIHJvb3QgZGV2aWNlCi0gKgotICogICAgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA1IElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILAotICoJCQkgSUJNIENvcnBvcmF0aW9uCi0gKiAgICBBdXRob3Iocyk6IENvcm5lbGlhIEh1Y2sgKGNvcm5lbGlhLmh1Y2tAZGUuaWJtLmNvbSkKLSAqCQkgIENhcnN0ZW4gT3R0ZSAgKGNvdHRlQGRlLmlibS5jb20pCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxhc20vczM5MF9yZGV2Lmg+Ci0KLXN0YXRpYyB2b2lkCi1zMzkwX3Jvb3RfZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQotewotCWtmcmVlKGRldik7Ci19Ci0KLXN0cnVjdCBkZXZpY2UgKgotczM5MF9yb290X2Rldl9yZWdpc3Rlcihjb25zdCBjaGFyICpuYW1lKQotewotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQlpbnQgcmV0OwotCi0JaWYgKCFzdHJsZW4obmFtZSkpCi0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwotCWRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkZXZpY2UpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldikKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JZGV2X3NldF9uYW1lKGRldiwgbmFtZSk7Ci0JZGV2LT5yZWxlYXNlID0gczM5MF9yb290X2Rldl9yZWxlYXNlOwotCXJldCA9IGRldmljZV9yZWdpc3RlcihkZXYpOwotCWlmIChyZXQpIHsKLQkJa2ZyZWUoZGV2KTsKLQkJcmV0dXJuIEVSUl9QVFIocmV0KTsKLQl9Ci0JcmV0dXJuIGRldjsKLX0KLQotdm9pZAotczM5MF9yb290X2Rldl91bnJlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlpZiAoZGV2KQotCQlkZXZpY2VfdW5yZWdpc3RlcihkZXYpOwotfQotCi1FWFBPUlRfU1lNQk9MKHMzOTBfcm9vdF9kZXZfcmVnaXN0ZXIpOwotRVhQT1JUX1NZTUJPTChzMzkwX3Jvb3RfZGV2X3VucmVnaXN0ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvZGlzcGxheTdzZWcuYyBiL2RyaXZlcnMvc2J1cy9jaGFyL2Rpc3BsYXk3c2VnLmMKaW5kZXggMjU1MGFmNC4uNDQzMTU3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zYnVzL2NoYXIvZGlzcGxheTdzZWcuYworKysgYi9kcml2ZXJzL3NidXMvY2hhci9kaXNwbGF5N3NlZy5jCkBAIC0yMTQsNyArMjE0LDcgQEAKIAogCXdyaXRlYihyZWdzLCAgcC0+cmVncyk7CiAKLQlwcmludGsoS0VSTl9JTkZPIFBGWCAiNy1TZWdtZW50IERpc3BsYXklcyBhdCBbJXM6MHglbHhdICVzXG4iLCAKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiNy1TZWdtZW50IERpc3BsYXklcyBhdCBbJXM6MHglbGx4XSAlc1xuIiwKIAkgICAgICAgb3AtPm5vZGUtPmZ1bGxfbmFtZSwKIAkgICAgICAgKHJlZ3MgJiBEN1NfRkxJUCkgPyAiIChGTElQUEVEKSIgOiAiIiwKIAkgICAgICAgb3AtPnJlc291cmNlWzBdLnN0YXJ0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL0tjb25maWcgYi9kcml2ZXJzL3Njc2kvS2NvbmZpZwppbmRleCBiNzMyMjk3Li4yNTZjN2JlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvS2NvbmZpZworKysgYi9kcml2ZXJzL3Njc2kvS2NvbmZpZwpAQCAtODg0LDYgKzg4NCw3IEBACiAJdHJpc3RhdGUgIklCTSBWaXJ0dWFsIFNDU0kgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBQQ19QU0VSSUVTIHx8IFBQQ19JU0VSSUVTCiAJc2VsZWN0IFNDU0lfU1JQX0FUVFJTCisJc2VsZWN0IFZJT1BBVEggaWYgUFBDX0lTRVJJRVMKIAloZWxwCiAJICBUaGlzIGlzIHRoZSBJQk0gUE9XRVIgVmlydHVhbCBTQ1NJIENsaWVudAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvTkNSX0Q3MDAuYyBiL2RyaXZlcnMvc2NzaS9OQ1JfRDcwMC5jCmluZGV4IDllNjRiMjEuLmM4ODlkODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9OQ1JfRDcwMC5jCisrKyBiL2RyaXZlcnMvc2NzaS9OQ1JfRDcwMC5jCkBAIC0zMTgsNyArMzE4LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlwLT5kZXYgPSBkZXY7Ci0Jc25wcmludGYocC0+bmFtZSwgc2l6ZW9mKHAtPm5hbWUpLCAiRDcwMCglcykiLCBkZXYtPmJ1c19pZCk7CisJc25wcmludGYocC0+bmFtZSwgc2l6ZW9mKHAtPm5hbWUpLCAiRDcwMCglcykiLCBkZXZfbmFtZShkZXYpKTsKIAlpZiAocmVxdWVzdF9pcnEoaXJxLCBOQ1JfRDcwMF9pbnRyLCBJUlFGX1NIQVJFRCwgcC0+bmFtZSwgcCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJENzAwOiByZXF1ZXN0X2lycSBmYWlsZWRcbiIpOwogCQlrZnJlZShwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hMTAwdTJ3LmMgYi9kcml2ZXJzL3Njc2kvYTEwMHUydy5jCmluZGV4IDNjMjk4YzcuLjk2NDc2OWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hMTAwdTJ3LmMKKysrIGIvZHJpdmVycy9zY3NpL2ExMDB1MncuYwpAQCAtNjMzLDcgKzYzMyw3IEBACiAJCXJldHVybiBGQUlMRUQ7CiAJfQogCi0JLyogUmVzZXQgZGV2aWNlIGlzIGhhbmRsZWQgYnkgdGhlIGZpcm1hcmUsIHdlIGZpbGwgaW4gYW4gU0NCIGFuZAorCS8qIFJlc2V0IGRldmljZSBpcyBoYW5kbGVkIGJ5IHRoZSBmaXJtd2FyZSwgd2UgZmlsbCBpbiBhbiBTQ0IgYW5kCiAJICAgZmlyZSBpdCBhdCB0aGUgY29udHJvbGxlciwgaXQgZG9lcyB0aGUgcmVzdCAqLwogCXNjYi0+b3Bjb2RlID0gT1JDX0JVU0RFVlJTVDsKIAlzY2ItPnRhcmdldCA9IHRhcmdldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hMjA5MS5jIGIvZHJpdmVycy9zY3NpL2EyMDkxLmMKaW5kZXggMDdkNTcyZi4uMzdkZDQ3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2EyMDkxLmMKKysrIGIvZHJpdmVycy9zY3NpL2EyMDkxLmMKQEAgLTE2OSwxMCArMTY5LDggQEAKIAkgICAgY29udGludWU7CiAKIAlpbnN0YW5jZSA9IHNjc2lfcmVnaXN0ZXIgKHRwbnQsIHNpemVvZiAoc3RydWN0IFdEMzNDOTNfaG9zdGRhdGEpKTsKLQlpZiAoaW5zdGFuY2UgPT0gTlVMTCkgewotCSAgICByZWxlYXNlX21lbV9yZWdpb24oYWRkcmVzcywgMjU2KTsKLQkgICAgY29udGludWU7Ci0JfQorCWlmIChpbnN0YW5jZSA9PSBOVUxMKQorCSAgICBnb3RvIHJlbGVhc2U7CiAJaW5zdGFuY2UtPmJhc2UgPSBaVFdPX1ZBRERSKGFkZHJlc3MpOwogCWluc3RhbmNlLT5pcnEgPSBJUlFfQU1JR0FfUE9SVFM7CiAJaW5zdGFuY2UtPnVuaXF1ZV9pZCA9IHotPnNsb3RhZGRyOwpAQCAtMTgzLDEwICsxODEsMTggQEAKIAlIREFUQShpbnN0YW5jZSktPmZhc3QgPSAwOwogCUhEQVRBKGluc3RhbmNlKS0+ZG1hX21vZGUgPSBDVFJMX0RNQTsKIAl3ZDMzYzkzX2luaXQoaW5zdGFuY2UsIHJlZ3MsIGRtYV9zZXR1cCwgZG1hX3N0b3AsIFdEMzNDOTNfRlNfOF8xMCk7Ci0JcmVxdWVzdF9pcnEoSVJRX0FNSUdBX1BPUlRTLCBhMjA5MV9pbnRyLCBJUlFGX1NIQVJFRCwgIkEyMDkxIFNDU0kiLAotCQkgICAgaW5zdGFuY2UpOworCWlmIChyZXF1ZXN0X2lycShJUlFfQU1JR0FfUE9SVFMsIGEyMDkxX2ludHIsIElSUUZfU0hBUkVELCAiQTIwOTEgU0NTSSIsCisJCQlpbnN0YW5jZSkpCisJICAgIGdvdG8gdW5yZWdpc3RlcjsKIAlETUEoaW5zdGFuY2UpLT5DTlRSID0gQ05UUl9QRE1EIHwgQ05UUl9JTlRFTjsKIAludW1fYTIwOTErKzsKKwljb250aW51ZTsKKwordW5yZWdpc3RlcjoKKwlzY3NpX3VucmVnaXN0ZXIoaW5zdGFuY2UpOworCXdkMzNjOTNfcmVsZWFzZSgpOworcmVsZWFzZToKKwlyZWxlYXNlX21lbV9yZWdpb24oYWRkcmVzcywgMjU2KTsKICAgICB9CiAKICAgICByZXR1cm4gbnVtX2EyMDkxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FkdmFuc3lzLmMgYi9kcml2ZXJzL3Njc2kvYWR2YW5zeXMuYwppbmRleCAyZjYwMjcyLi43NTA3ZDhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWR2YW5zeXMuYworKysgYi9kcml2ZXJzL3Njc2kvYWR2YW5zeXMuYwpAQCAtMjUyNyw3ICsyNTI3LDcgQEAKIHsKIAlzdHJ1Y3QgYXNjX2JvYXJkICpib2FyZHAgPSBzaG9zdF9wcml2KHMpOwogCi0JcHJpbnRrKCJTY3NpX0hvc3QgYXQgYWRkciAweCVwLCBkZXZpY2UgJXNcbiIsIHMsIGJvYXJkcC0+ZGV2LT5idXNfaWQpOworCXByaW50aygiU2NzaV9Ib3N0IGF0IGFkZHIgMHglcCwgZGV2aWNlICVzXG4iLCBzLCBkZXZfbmFtZShib2FyZHAtPmRldikpOwogCXByaW50aygiIGhvc3RfYnVzeSAldSwgaG9zdF9ubyAlZCwgbGFzdF9yZXNldCAlZCxcbiIsCiAJICAgICAgIHMtPmhvc3RfYnVzeSwgcy0+aG9zdF9ubywgKHVuc2lnbmVkKXMtPmxhc3RfcmVzZXQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X3RtZi5jIGIvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF90bWYuYwppbmRleCBkNDY0MGVmLi43OGViODZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X3RtZi5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfdG1mLmMKQEAgLTE4OSw3ICsxODksNyBAQAogCWFzZF9jbGVhcl9uZXh1c19JX1QoZGV2LCBORVhVU19QSEFTRV9QUkUpOwogCS8qIHNlbmQgYSBoYXJkIHJlc2V0ICovCiAJQVNEX0RQUklOVEsoInNlbmRpbmcgJXMgcmVzZXQgdG8gJXNcbiIsCi0JCSAgICByZXNldF90eXBlID8gImhhcmQiIDogInNvZnQiLCBwaHktPmRldi5idXNfaWQpOworCQkgICAgcmVzZXRfdHlwZSA/ICJoYXJkIiA6ICJzb2Z0IiwgZGV2X25hbWUoJnBoeS0+ZGV2KSk7CiAJcmVzID0gc2FzX3BoeV9yZXNldChwaHksIHJlc2V0X3R5cGUpOwogCWlmIChyZXMgPT0gVE1GX1JFU1BfRlVOQ19DT01QTEVURSkgewogCQkvKiB3YWl0IGZvciB0aGUgbWF4aW11bSBzZXR0bGUgdGltZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2N4Z2IzaS9jeGdiM2lfZGRwLmMgYi9kcml2ZXJzL3Njc2kvY3hnYjNpL2N4Z2IzaV9kZHAuYwppbmRleCAxYTQxZjA0Li4wOGYzYTA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvY3hnYjNpL2N4Z2IzaV9kZHAuYworKysgYi9kcml2ZXJzL3Njc2kvY3hnYjNpL2N4Z2IzaV9kZHAuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogCiAvKiBmcm9tIGN4Z2IzIExMRCAqLwogI2luY2x1ZGUgImNvbW1vbi5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2d2cDExLmMgYi9kcml2ZXJzL3Njc2kvZ3ZwMTEuYwppbmRleCBjYTczNjM3Li41ZDFiZjdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZ3ZwMTEuYworKysgYi9kcml2ZXJzL3Njc2kvZ3ZwMTEuYwpAQCAtMzI5LDEyICszMjksMTYgQEAKIAkJICAgICAoZXBjICYgR1ZQX1NDU0lDTEtNQVNLKSA/IFdEMzNDOTNfRlNfOF8xMAogCQkJCQkgICAgIDogV0QzM0M5M19GU18xMl8xNSk7CiAKLQlyZXF1ZXN0X2lycShJUlFfQU1JR0FfUE9SVFMsIGd2cDExX2ludHIsIElSUUZfU0hBUkVELCAiR1ZQMTEgU0NTSSIsCi0JCSAgICBpbnN0YW5jZSk7CisJaWYgKHJlcXVlc3RfaXJxKElSUV9BTUlHQV9QT1JUUywgZ3ZwMTFfaW50ciwgSVJRRl9TSEFSRUQsICJHVlAxMSBTQ1NJIiwKKwkJCWluc3RhbmNlKSkKKwkJZ290byB1bnJlZ2lzdGVyOwogCURNQShpbnN0YW5jZSktPkNOVFIgPSBHVlAxMV9ETUFDX0lOVF9FTkFCTEU7CiAJbnVtX2d2cDExKys7CiAJY29udGludWU7CiAKK3VucmVnaXN0ZXI6CisJc2NzaV91bnJlZ2lzdGVyKGluc3RhbmNlKTsKKwl3ZDMzYzkzX3JlbGVhc2UoKTsKIHJlbGVhc2U6CiAJcmVsZWFzZV9tZW1fcmVnaW9uKGFkZHJlc3MsIDI1Nik7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2hvc3RzLmMgYi9kcml2ZXJzL3Njc2kvaG9zdHMuYwppbmRleCAzZmRiYjEzLi5hYTY3MGExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaG9zdHMuYworKysgYi9kcml2ZXJzL3Njc2kvaG9zdHMuYwpAQCAtMzg4LDggKzM4OCw3IEBACiAJCXNob3N0LT5kbWFfYm91bmRhcnkgPSAweGZmZmZmZmZmOwogCiAJZGV2aWNlX2luaXRpYWxpemUoJnNob3N0LT5zaG9zdF9nZW5kZXYpOwotCXNucHJpbnRmKHNob3N0LT5zaG9zdF9nZW5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgImhvc3QlZCIsCi0JCXNob3N0LT5ob3N0X25vKTsKKwlkZXZfc2V0X25hbWUoJnNob3N0LT5zaG9zdF9nZW5kZXYsICJob3N0JWQiLCBzaG9zdC0+aG9zdF9ubyk7CiAjaWZuZGVmIENPTkZJR19TWVNGU19ERVBSRUNBVEVECiAJc2hvc3QtPnNob3N0X2dlbmRldi5idXMgPSAmc2NzaV9idXNfdHlwZTsKICNlbmRpZgpAQCAtMzk4LDggKzM5Nyw3IEBACiAJZGV2aWNlX2luaXRpYWxpemUoJnNob3N0LT5zaG9zdF9kZXYpOwogCXNob3N0LT5zaG9zdF9kZXYucGFyZW50ID0gJnNob3N0LT5zaG9zdF9nZW5kZXY7CiAJc2hvc3QtPnNob3N0X2Rldi5jbGFzcyA9ICZzaG9zdF9jbGFzczsKLQlzbnByaW50ZihzaG9zdC0+c2hvc3RfZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsICJob3N0JWQiLAotCQkgc2hvc3QtPmhvc3Rfbm8pOworCWRldl9zZXRfbmFtZSgmc2hvc3QtPnNob3N0X2RldiwgImhvc3QlZCIsIHNob3N0LT5ob3N0X25vKTsKIAlzaG9zdC0+c2hvc3RfZGV2Lmdyb3VwcyA9IHNjc2lfc3lzZnNfc2hvc3RfYXR0cl9ncm91cHM7CiAKIAlzaG9zdC0+ZWhhbmRsZXIgPSBrdGhyZWFkX3J1bihzY3NpX2Vycm9yX2hhbmRsZXIsIHNob3N0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZmYy5jIGIvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZmYy5jCmluZGV4IDQ0ZjIwMmYuLmVlMDczOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12ZmMuYworKysgYi9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdmZjLmMKQEAgLTEwMSw3ICsxMDEsNyBAQAogCXsgSUJNVkZDX0ZBQlJJQ19NQVBQRUQsIElCTVZGQ19VTkFCTEVfVE9fRVNUQUJMSVNILCBESURfRVJST1IsIDEsIDEsICJ1bmFibGUgdG8gZXN0YWJsaXNoIiB9LAogCXsgSUJNVkZDX0ZBQlJJQ19NQVBQRUQsIElCTVZGQ19YUE9SVF9GQVVMVCwgRElEX09LLCAxLCAwLCAidHJhbnNwb3J0IGZhdWx0IiB9LAogCXsgSUJNVkZDX0ZBQlJJQ19NQVBQRUQsIElCTVZGQ19DTURfVElNRU9VVCwgRElEX1RJTUVfT1VULCAxLCAxLCAiY29tbWFuZCB0aW1lb3V0IiB9LAotCXsgSUJNVkZDX0ZBQlJJQ19NQVBQRUQsIElCTVZGQ19FTkVURE9XTiwgRElEX05PX0NPTk5FQ1QsIDEsIDEsICJuZXR3b3JrIGRvd24iIH0sCisJeyBJQk1WRkNfRkFCUklDX01BUFBFRCwgSUJNVkZDX0VORVRET1dOLCBESURfVFJBTlNQT1JUX0RJU1JVUFRFRCwgMSwgMSwgIm5ldHdvcmsgZG93biIgfSwKIAl7IElCTVZGQ19GQUJSSUNfTUFQUEVELCBJQk1WRkNfSFdfRkFJTFVSRSwgRElEX0VSUk9SLCAxLCAxLCAiaGFyZHdhcmUgZmFpbHVyZSIgfSwKIAl7IElCTVZGQ19GQUJSSUNfTUFQUEVELCBJQk1WRkNfTElOS19ET1dOX0VSUiwgRElEX1JFUVVFVUUsIDAsIDAsICJsaW5rIGRvd24iIH0sCiAJeyBJQk1WRkNfRkFCUklDX01BUFBFRCwgSUJNVkZDX0xJTktfREVBRF9FUlIsIERJRF9FUlJPUiwgMCwgMCwgImxpbmsgZGVhZCIgfSwKQEAgLTExNSwxMSArMTE1LDExIEBACiAKIAl7IElCTVZGQ19WSU9TX0ZBSUxVUkUsIElCTVZGQ19DUlFfRkFJTFVSRSwgRElEX1JFUVVFVUUsIDEsIDEsICJDUlEgZmFpbHVyZSIgfSwKIAl7IElCTVZGQ19WSU9TX0ZBSUxVUkUsIElCTVZGQ19TV19GQUlMVVJFLCBESURfRVJST1IsIDAsIDEsICJzb2Z0d2FyZSBmYWlsdXJlIiB9LAotCXsgSUJNVkZDX1ZJT1NfRkFJTFVSRSwgSUJNVkZDX0lOVkFMSURfUEFSQU1FVEVSLCBESURfQUJPUlQsIDAsIDEsICJpbnZhbGlkIHBhcmFtZXRlciIgfSwKLQl7IElCTVZGQ19WSU9TX0ZBSUxVUkUsIElCTVZGQ19NSVNTSU5HX1BBUkFNRVRFUiwgRElEX0FCT1JULCAwLCAxLCAibWlzc2luZyBwYXJhbWV0ZXIiIH0sCisJeyBJQk1WRkNfVklPU19GQUlMVVJFLCBJQk1WRkNfSU5WQUxJRF9QQVJBTUVURVIsIERJRF9FUlJPUiwgMCwgMSwgImludmFsaWQgcGFyYW1ldGVyIiB9LAorCXsgSUJNVkZDX1ZJT1NfRkFJTFVSRSwgSUJNVkZDX01JU1NJTkdfUEFSQU1FVEVSLCBESURfRVJST1IsIDAsIDEsICJtaXNzaW5nIHBhcmFtZXRlciIgfSwKIAl7IElCTVZGQ19WSU9TX0ZBSUxVUkUsIElCTVZGQ19IT1NUX0lPX0JVUywgRElEX0VSUk9SLCAxLCAxLCAiaG9zdCBJL08gYnVzIGZhaWx1cmUiIH0sCi0JeyBJQk1WRkNfVklPU19GQUlMVVJFLCBJQk1WRkNfVFJBTlNfQ0FOQ0VMTEVELCBESURfQUJPUlQsIDAsIDEsICJ0cmFuc2FjdGlvbiBjYW5jZWxsZWQiIH0sCi0JeyBJQk1WRkNfVklPU19GQUlMVVJFLCBJQk1WRkNfVFJBTlNfQ0FOQ0VMTEVEX0lNUExJQ0lULCBESURfQUJPUlQsIDAsIDEsICJ0cmFuc2FjdGlvbiBjYW5jZWxsZWQgaW1wbGljaXQiIH0sCisJeyBJQk1WRkNfVklPU19GQUlMVVJFLCBJQk1WRkNfVFJBTlNfQ0FOQ0VMTEVELCBESURfRVJST1IsIDAsIDEsICJ0cmFuc2FjdGlvbiBjYW5jZWxsZWQiIH0sCisJeyBJQk1WRkNfVklPU19GQUlMVVJFLCBJQk1WRkNfVFJBTlNfQ0FOQ0VMTEVEX0lNUExJQ0lULCBESURfRVJST1IsIDAsIDEsICJ0cmFuc2FjdGlvbiBjYW5jZWxsZWQgaW1wbGljaXQiIH0sCiAJeyBJQk1WRkNfVklPU19GQUlMVVJFLCBJQk1WRkNfSU5TVUZGSUNJRU5UX1JFU09VUkNFLCBESURfUkVRVUVVRSwgMSwgMSwgImluc3VmZmljaWVudCByZXNvdXJjZXMiIH0sCiAJeyBJQk1WRkNfVklPU19GQUlMVVJFLCBJQk1WRkNfUExPR0lfUkVRVUlSRUQsIERJRF9FUlJPUiwgMCwgMSwgInBvcnQgbG9naW4gcmVxdWlyZWQiIH0sCiAJeyBJQk1WRkNfVklPU19GQUlMVVJFLCBJQk1WRkNfQ09NTUFORF9GQUlMRUQsIERJRF9FUlJPUiwgMSwgMSwgImNvbW1hbmQgZmFpbGVkIiB9LApAQCAtMTE0NSwxMCArMTE0NSwxMCBAQAogCWxvZ2luX2luZm8tPmFzeW5jLmxlbiA9IHZob3N0LT5hc3luY19jcnEuc2l6ZSAqIHNpemVvZigqdmhvc3QtPmFzeW5jX2NycS5tc2dzKTsKIAlzdHJuY3B5KGxvZ2luX2luZm8tPnBhcnRpdGlvbl9uYW1lLCB2aG9zdC0+cGFydGl0aW9uX25hbWUsIElCTVZGQ19NQVhfTkFNRSk7CiAJc3RybmNweShsb2dpbl9pbmZvLT5kZXZpY2VfbmFtZSwKLQkJdmhvc3QtPmhvc3QtPnNob3N0X2dlbmRldi5idXNfaWQsIElCTVZGQ19NQVhfTkFNRSk7CisJCWRldl9uYW1lKCZ2aG9zdC0+aG9zdC0+c2hvc3RfZ2VuZGV2KSwgSUJNVkZDX01BWF9OQU1FKTsKIAogCWxvY2F0aW9uID0gb2ZfZ2V0X3Byb3BlcnR5KG9mX25vZGUsICJpYm0sbG9jLWNvZGUiLCBOVUxMKTsKLQlsb2NhdGlvbiA9IGxvY2F0aW9uID8gbG9jYXRpb24gOiB2aG9zdC0+ZGV2LT5idXNfaWQ7CisJbG9jYXRpb24gPSBsb2NhdGlvbiA/IGxvY2F0aW9uIDogZGV2X25hbWUodmhvc3QtPmRldik7CiAJc3RybmNweShsb2dpbl9pbmZvLT5kcmNfbmFtZSwgbG9jYXRpb24sIElCTVZGQ19NQVhfTkFNRSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12c2NzaS5jIGIvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZzY3NpLmMKaW5kZXggODY4ZDM1ZS4uNWM1NDFmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZzY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZzY3NpLmMKQEAgLTg5LDYgKzg5LDcgQEAKIHN0YXRpYyBpbnQgbWF4X2NoYW5uZWwgPSAzOwogc3RhdGljIGludCBpbml0X3RpbWVvdXQgPSA1Owogc3RhdGljIGludCBtYXhfcmVxdWVzdHMgPSBJQk1WU0NTSV9NQVhfUkVRVUVTVFNfREVGQVVMVDsKK3N0YXRpYyBpbnQgbWF4X2V2ZW50cyA9IElCTVZTQ1NJX01BWF9SRVFVRVNUU19ERUZBVUxUICsgMjsKIAogc3RhdGljIHN0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSAqaWJtdnNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlOwogCkBAIC0xNjMzLDcgKzE2MzQsNyBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcgaWJtdnNjc2lfZ2V0X2Rlc2lyZWRfZG1hKHN0cnVjdCB2aW9fZGV2ICp2ZGV2KQogewogCS8qIGl1X3N0b3JhZ2UgZGF0YSBhbGxvY2F0ZWQgaW4gaW5pdGlhbGl6ZV9ldmVudF9wb29sICovCi0JdW5zaWduZWQgbG9uZyBkZXNpcmVkX2lvID0gbWF4X3JlcXVlc3RzICogc2l6ZW9mKHVuaW9uIHZpb3NycF9pdSk7CisJdW5zaWduZWQgbG9uZyBkZXNpcmVkX2lvID0gbWF4X2V2ZW50cyAqIHNpemVvZih1bmlvbiB2aW9zcnBfaXUpOwogCiAJLyogYWRkIGlvIHNwYWNlIGZvciBzZyBkYXRhICovCiAJZGVzaXJlZF9pbyArPSAoSUJNVlNDU0lfTUFYX1NFQ1RPUlNfREVGQVVMVCAqIDUxMiAqCkBAIC0xNjU3LDcgKzE2NTgsNiBAQAogCiAJdmRldi0+ZGV2LmRyaXZlcl9kYXRhID0gTlVMTDsKIAotCWRyaXZlcl90ZW1wbGF0ZS5jYW5fcXVldWUgPSBtYXhfcmVxdWVzdHMgLSAyOwogCWhvc3QgPSBzY3NpX2hvc3RfYWxsb2MoJmRyaXZlcl90ZW1wbGF0ZSwgc2l6ZW9mKCpob3N0ZGF0YSkpOwogCWlmICghaG9zdCkgewogCQlkZXZfZXJyKCZ2ZGV2LT5kZXYsICJjb3VsZG4ndCBhbGxvY2F0ZSBob3N0IGRhdGFcbiIpOwpAQCAtMTY3MywxMiArMTY3MywxMiBAQAogCWF0b21pY19zZXQoJmhvc3RkYXRhLT5yZXF1ZXN0X2xpbWl0LCAtMSk7CiAJaG9zdGRhdGEtPmhvc3QtPm1heF9zZWN0b3JzID0gSUJNVlNDU0lfTUFYX1NFQ1RPUlNfREVGQVVMVDsKIAotCXJjID0gaWJtdnNjc2lfb3BzLT5pbml0X2NycV9xdWV1ZSgmaG9zdGRhdGEtPnF1ZXVlLCBob3N0ZGF0YSwgbWF4X3JlcXVlc3RzKTsKKwlyYyA9IGlibXZzY3NpX29wcy0+aW5pdF9jcnFfcXVldWUoJmhvc3RkYXRhLT5xdWV1ZSwgaG9zdGRhdGEsIG1heF9ldmVudHMpOwogCWlmIChyYyAhPSAwICYmIHJjICE9IEhfUkVTT1VSQ0UpIHsKIAkJZGV2X2VycigmdmRldi0+ZGV2LCAiY291bGRuJ3QgaW5pdGlhbGl6ZSBjcnEuIHJjPSVkXG4iLCByYyk7CiAJCWdvdG8gaW5pdF9jcnFfZmFpbGVkOwogCX0KLQlpZiAoaW5pdGlhbGl6ZV9ldmVudF9wb29sKCZob3N0ZGF0YS0+cG9vbCwgbWF4X3JlcXVlc3RzLCBob3N0ZGF0YSkgIT0gMCkgeworCWlmIChpbml0aWFsaXplX2V2ZW50X3Bvb2woJmhvc3RkYXRhLT5wb29sLCBtYXhfZXZlbnRzLCBob3N0ZGF0YSkgIT0gMCkgewogCQlkZXZfZXJyKCZ2ZGV2LT5kZXYsICJjb3VsZG4ndCBpbml0aWFsaXplIGV2ZW50IHBvb2xcbiIpOwogCQlnb3RvIGluaXRfcG9vbF9mYWlsZWQ7CiAJfQpAQCAtMTczMCw3ICsxNzMwLDcgQEAKICAgICAgIGFkZF9ob3N0X2ZhaWxlZDoKIAlyZWxlYXNlX2V2ZW50X3Bvb2woJmhvc3RkYXRhLT5wb29sLCBob3N0ZGF0YSk7CiAgICAgICBpbml0X3Bvb2xfZmFpbGVkOgotCWlibXZzY3NpX29wcy0+cmVsZWFzZV9jcnFfcXVldWUoJmhvc3RkYXRhLT5xdWV1ZSwgaG9zdGRhdGEsIG1heF9yZXF1ZXN0cyk7CisJaWJtdnNjc2lfb3BzLT5yZWxlYXNlX2NycV9xdWV1ZSgmaG9zdGRhdGEtPnF1ZXVlLCBob3N0ZGF0YSwgbWF4X2V2ZW50cyk7CiAgICAgICBpbml0X2NycV9mYWlsZWQ6CiAJc2NzaV9ob3N0X3B1dChob3N0KTsKICAgICAgIHNjc2lfaG9zdF9hbGxvY19mYWlsZWQ6CkBAIC0xNzQyLDcgKzE3NDIsNyBAQAogCXN0cnVjdCBpYm12c2NzaV9ob3N0X2RhdGEgKmhvc3RkYXRhID0gdmRldi0+ZGV2LmRyaXZlcl9kYXRhOwogCXJlbGVhc2VfZXZlbnRfcG9vbCgmaG9zdGRhdGEtPnBvb2wsIGhvc3RkYXRhKTsKIAlpYm12c2NzaV9vcHMtPnJlbGVhc2VfY3JxX3F1ZXVlKCZob3N0ZGF0YS0+cXVldWUsIGhvc3RkYXRhLAotCQkJCQltYXhfcmVxdWVzdHMpOworCQkJCQltYXhfZXZlbnRzKTsKIAogCXNycF9yZW1vdmVfaG9zdChob3N0ZGF0YS0+aG9zdCk7CiAJc2NzaV9yZW1vdmVfaG9zdChob3N0ZGF0YS0+aG9zdCk7CkBAIC0xNzc5LDYgKzE3NzksMTAgQEAKIHsKIAlpbnQgcmV0OwogCisJLyogRW5zdXJlIHdlIGhhdmUgdHdvIHJlcXVlc3RzIHRvIGRvIGVycm9yIHJlY292ZXJ5ICovCisJZHJpdmVyX3RlbXBsYXRlLmNhbl9xdWV1ZSA9IG1heF9yZXF1ZXN0czsKKwltYXhfZXZlbnRzID0gbWF4X3JlcXVlc3RzICsgMjsKKwogCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKQogCQlpYm12c2NzaV9vcHMgPSAmaXNlcmllc3ZzY3NpX29wczsKIAllbHNlIGlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX1ZJTykpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXByLmMgYi9kcml2ZXJzL3Njc2kvaXByLmMKaW5kZXggMGVkZmIxZi4uODQxZjQ2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2lwci5jCisrKyBiL2RyaXZlcnMvc2NzaS9pcHIuYwpAQCAtMjE4NCw3ICsyMTg0LDcgQEAKIAkJc2l6ZW9mKHN0cnVjdCBpcHJfZHVtcF9lbnRyeV9oZWFkZXIpOwogCWRyaXZlcl9kdW1wLT5sb2NhdGlvbl9lbnRyeS5oZHIuZGF0YV90eXBlID0gSVBSX0RVTVBfREFUQV9UWVBFX0FTQ0lJOwogCWRyaXZlcl9kdW1wLT5sb2NhdGlvbl9lbnRyeS5oZHIuaWQgPSBJUFJfRFVNUF9MT0NBVElPTl9JRDsKLQlzdHJjcHkoZHJpdmVyX2R1bXAtPmxvY2F0aW9uX2VudHJ5LmxvY2F0aW9uLCBpb2FfY2ZnLT5wZGV2LT5kZXYuYnVzX2lkKTsKKwlzdHJjcHkoZHJpdmVyX2R1bXAtPmxvY2F0aW9uX2VudHJ5LmxvY2F0aW9uLCBkZXZfbmFtZSgmaW9hX2NmZy0+cGRldi0+ZGV2KSk7CiAJZHJpdmVyX2R1bXAtPmhkci5udW1fZW50cmllcysrOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXByLmggYi9kcml2ZXJzL3Njc2kvaXByLmgKaW5kZXggNTk0NTkxNC4uOGY4NzJmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2lwci5oCisrKyBiL2RyaXZlcnMvc2NzaS9pcHIuaApAQCAtMTI3Miw3ICsxMjcyLDcgQEAKIAogc3RydWN0IGlwcl9kdW1wX2xvY2F0aW9uX2VudHJ5IHsKIAlzdHJ1Y3QgaXByX2R1bXBfZW50cnlfaGVhZGVyIGhkcjsKLQl1OCBsb2NhdGlvbltCVVNfSURfU0laRV07CisJdTggbG9jYXRpb25bMjBdOwogfV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgaXByX2R1bXBfdHJhY2VfZW50cnkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xhc2k3MDAuYyBiL2RyaXZlcnMvc2NzaS9sYXNpNzAwLmMKaW5kZXggMzEyNjgyNC4uNGE0ZTY5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xhc2k3MDAuYworKysgYi9kcml2ZXJzL3Njc2kvbGFzaTcwMC5jCkBAIC0xMDMsOCArMTAzLDcgQEAKIAogCWhvc3RkYXRhID0ga3phbGxvYyhzaXplb2YoKmhvc3RkYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFob3N0ZGF0YSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgaG9zdCBkYXRhXG4iLAotCQkgICAgICAgZGV2LT5kZXYuYnVzX2lkKTsKKwkJZGV2X3ByaW50ayhLRVJOX0VSUiwgZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIGhvc3QgZGF0YVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfZGlzY292ZXIuYyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2Rpc2NvdmVyLmMKaW5kZXggNzA5YTZmNy4uZmFjYzViZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2Rpc2NvdmVyLmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfZGlzY292ZXIuYwpAQCAtMTY5LDcgKzE2OSw3IEBACiAJCWlmIChyZXMpIHsKIAkJCXByaW50aygic2FzOiBkcml2ZXIgb24gcGNpZGV2ICVzIGNhbm5vdCBoYW5kbGUgIgogCQkJICAgICAgICJkZXZpY2UgJWxseCwgZXJyb3I6JWRcbiIsCi0JCQkgICAgICAgc2FzX2hhLT5kZXYtPmJ1c19pZCwKKwkJCSAgICAgICBkZXZfbmFtZShzYXNfaGEtPmRldiksCiAJCQkgICAgICAgU0FTX0FERFIoZGV2LT5zYXNfYWRkciksIHJlcyk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19kdW1wLmMgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19kdW1wLmMKaW5kZXggYmYzNGEyMy4uYzE3YzI1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfZHVtcC5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2R1bXAuYwpAQCAtNTYsNyArNTYsNyBAQAogCiB2b2lkIHNhc19kcHJpbnRfaGFlKHN0cnVjdCBzYXNfaGFfc3RydWN0ICpzYXNfaGEsIGVudW0gaGFfZXZlbnQgaGUpCiB7Ci0JU0FTX0RQUklOVEsoImhhICVzOiAlcyBldmVudFxuIiwgc2FzX2hhLT5kZXYtPmJ1c19pZCwKKwlTQVNfRFBSSU5USygiaGEgJXM6ICVzIGV2ZW50XG4iLCBkZXZfbmFtZShzYXNfaGEtPmRldiksCiAJCSAgICBzYXNfaGFlX3N0cltoZV0pOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19ob3N0X3NtcC5jIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfaG9zdF9zbXAuYwppbmRleCAxNmY5MzEyLi5kMTEwYTM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19ob3N0X3NtcC5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2hvc3Rfc21wLmMKQEAgLTE5OSw4ICsxOTksOCBAQAogCQlicmVhazsKIAogCWNhc2UgU01QX0RJU0NPVkVSOgotCQlyZXEtPmRhdGFfbGVuID0tIDE2OwotCQlpZiAocmVxLT5kYXRhX2xlbiA8IDApIHsKKwkJcmVxLT5kYXRhX2xlbiAtPSAxNjsKKwkJaWYgKChpbnQpcmVxLT5kYXRhX2xlbiA8IDApIHsKIAkJCXJlcS0+ZGF0YV9sZW4gPSAwOwogCQkJZXJyb3IgPSAtRUlOVkFMOwogCQkJZ290byBvdXQ7CkBAIC0yMTUsOCArMjE1LDggQEAKIAkJYnJlYWs7CiAKIAljYXNlIFNNUF9SRVBPUlRfUEhZX1NBVEE6Ci0JCXJlcS0+ZGF0YV9sZW4gPS0gMTY7Ci0JCWlmIChyZXEtPmRhdGFfbGVuIDwgMCkgeworCQlyZXEtPmRhdGFfbGVuIC09IDE2OworCQlpZiAoKGludClyZXEtPmRhdGFfbGVuIDwgMCkgewogCQkJcmVxLT5kYXRhX2xlbiA9IDA7CiAJCQllcnJvciA9IC1FSU5WQUw7CiAJCQlnb3RvIG91dDsKQEAgLTIzOCw4ICsyMzgsOCBAQAogCQlicmVhazsKIAogCWNhc2UgU01QX1BIWV9DT05UUk9MOgotCQlyZXEtPmRhdGFfbGVuID0tIDQ0OwotCQlpZiAocmVxLT5kYXRhX2xlbiA8IDApIHsKKwkJcmVxLT5kYXRhX2xlbiAtPSA0NDsKKwkJaWYgKChpbnQpcmVxLT5kYXRhX2xlbiA8IDApIHsKIAkJCXJlcS0+ZGF0YV9sZW4gPSAwOwogCQkJZXJyb3IgPSAtRUlOVkFMOwogCQkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19wb3J0LmMgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19wb3J0LmMKaW5kZXggMTM5OTM1YS4uZTZhYzU5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfcG9ydC5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX3BvcnQuYwpAQCAtMTEzLDcgKzExMyw3IEBACiAJc2FzX3BvcnRfYWRkX3BoeShwb3J0LT5wb3J0LCBwaHktPnBoeSk7CiAKIAlTQVNfRFBSSU5USygiJXMgYWRkZWQgdG8gJXMsIHBoeV9tYXNrOjB4JXggKCUxNmxseClcbiIsCi0JCSAgICBwaHktPnBoeS0+ZGV2LmJ1c19pZCxwb3J0LT5wb3J0LT5kZXYuYnVzX2lkLAorCQkgICAgZGV2X25hbWUoJnBoeS0+cGh5LT5kZXYpLCBkZXZfbmFtZSgmcG9ydC0+cG9ydC0+ZGV2KSwKIAkJICAgIHBvcnQtPnBoeV9tYXNrLAogCQkgICAgU0FTX0FERFIocG9ydC0+YXR0YWNoZWRfc2FzX2FkZHIpKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19oYmFkaXNjLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2hiYWRpc2MuYwppbmRleCA4YzY0NDk0Li4zMTFlZDZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2hiYWRpc2MuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2hiYWRpc2MuYwpAQCAtMTk2NCwxMCArMTk2NCwxMCBAQAogCXVpbnQzMl90IHRtbzsKIAogCWlmICh2cG9ydC0+cG9ydF9zdGF0ZSA9PSBMUEZDX0xPQ0FMX0NGR19MSU5LKSB7Ci0JCS8qIEZvciBGQU4sIHRpbWVvdXQgc2hvdWxkIGJlIGdyZWF0ZXIgdGhlbiBlZHRvdiAqLworCQkvKiBGb3IgRkFOLCB0aW1lb3V0IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gZWR0b3YgKi8KIAkJdG1vID0gKCgocGhiYS0+ZmNfZWR0b3YgKyA5OTkpIC8gMTAwMCkgKyAxKTsKIAl9IGVsc2UgewotCQkvKiBOb3JtYWwgZGlzY292ZXJ5IHRpbWVvdXQgc2hvdWxkIGJlID4gdGhlbiBFTFMvQ1QgdGltZW91dAorCQkvKiBOb3JtYWwgZGlzY292ZXJ5IHRpbWVvdXQgc2hvdWxkIGJlID4gdGhhbiBFTFMvQ1QgdGltZW91dAogCQkgKiBGQyBzcGVjIHN0YXRlcyB3ZSBuZWVkIDMgKiByYXRvdiBmb3IgQ1QgcmVxdWVzdHMKIAkJICovCiAJCXRtbyA9ICgocGhiYS0+ZmNfcmF0b3YgKiAzKSArIDMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19pbml0LmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2luaXQuYwppbmRleCA0Yzc3MDM4Li42Yzg2NzMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2luaXQuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2luaXQuYwpAQCAtMTc5NSwxMiArMTc5NSwxMyBAQAogaW50CiBscGZjX29ubGluZShzdHJ1Y3QgbHBmY19oYmEgKnBoYmEpCiB7Ci0Jc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0ID0gcGhiYS0+cHBvcnQ7CisJc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0OwogCXN0cnVjdCBscGZjX3Zwb3J0ICoqdnBvcnRzOwogCWludCBpOwogCiAJaWYgKCFwaGJhKQogCQlyZXR1cm4gMDsKKwl2cG9ydCA9IHBoYmEtPnBwb3J0OwogCiAJaWYgKCEodnBvcnQtPmZjX2ZsYWcgJiBGQ19PRkZMSU5FX01PREUpKQogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaS5jCmluZGV4IDAxZGZkYzguLmEzNmExMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGkuYwpAQCAtNDIwLDcgKzQyMCw3IEBACiAJCWlmICh1bmxpa2VseShwcmluZy0+bG9jYWxfZ2V0aWR4ID49IG1heF9jbWRfaWR4KSkgewogCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfU0xJLAogCQkJCQkiMDMxNSBSaW5nICVkIGlzc3VlOiBwb3J0Q21kR2V0ICVkICIKLQkJCQkJImlzIGJpZ2dlciB0aGVuIGNtZCByaW5nICVkXG4iLAorCQkJCQkiaXMgYmlnZ2VyIHRoYW4gY21kIHJpbmcgJWRcbiIsCiAJCQkJCXByaW5nLT5yaW5nbm8sCiAJCQkJCXByaW5nLT5sb2NhbF9nZXRpZHgsIG1heF9jbWRfaWR4KTsKIApAQCAtMTYyOCwxMiArMTYyOCwxMiBAQAogewogCXN0cnVjdCBscGZjX3BncCAqcGdwID0gJnBoYmEtPnBvcnRfZ3BbcHJpbmctPnJpbmdub107CiAJLyoKLQkgKiBSaW5nIDxyaW5nbm8+IGhhbmRsZXI6IHBvcnRSc3BQdXQgPHBvcnRSc3BQdXQ+IGlzIGJpZ2dlciB0aGVuCisJICogUmluZyA8cmluZ25vPiBoYW5kbGVyOiBwb3J0UnNwUHV0IDxwb3J0UnNwUHV0PiBpcyBiaWdnZXIgdGhhbgogCSAqIHJzcCByaW5nIDxwb3J0UnNwTWF4PgogCSAqLwogCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX1NMSSwKIAkJCSIwMzEyIFJpbmcgJWQgaGFuZGxlcjogcG9ydFJzcFB1dCAlZCAiCi0JCQkiaXMgYmlnZ2VyIHRoZW4gcnNwIHJpbmcgJWRcbiIsCisJCQkiaXMgYmlnZ2VyIHRoYW4gcnNwIHJpbmcgJWRcbiIsCiAJCQlwcmluZy0+cmluZ25vLCBsZTMyX3RvX2NwdShwZ3AtPnJzcFB1dElueCksCiAJCQlwcmluZy0+bnVtUmlvY2IpOwogCkBAIC0yMDgzLDEyICsyMDgzLDEyIEBACiAJcG9ydFJzcFB1dCA9IGxlMzJfdG9fY3B1KHBncC0+cnNwUHV0SW54KTsKIAlpZiAocG9ydFJzcFB1dCA+PSBwb3J0UnNwTWF4KSB7CiAJCS8qCi0JCSAqIFJpbmcgPHJpbmdubz4gaGFuZGxlcjogcG9ydFJzcFB1dCA8cG9ydFJzcFB1dD4gaXMgYmlnZ2VyIHRoZW4KKwkJICogUmluZyA8cmluZ25vPiBoYW5kbGVyOiBwb3J0UnNwUHV0IDxwb3J0UnNwUHV0PiBpcyBiaWdnZXIgdGhhbgogCQkgKiByc3AgcmluZyA8cG9ydFJzcE1heD4KIAkJICovCiAJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX1NMSSwKIAkJCQkiMDMwMyBSaW5nICVkIGhhbmRsZXI6IHBvcnRSc3BQdXQgJWQgIgotCQkJCSJpcyBiaWdnZXIgdGhlbiByc3AgcmluZyAlZFxuIiwKKwkJCQkiaXMgYmlnZ2VyIHRoYW4gcnNwIHJpbmcgJWRcbiIsCiAJCQkJcHJpbmctPnJpbmdubywgcG9ydFJzcFB1dCwgcG9ydFJzcE1heCk7CiAKIAkJcGhiYS0+bGlua19zdGF0ZSA9IExQRkNfSEJBX0VSUk9SOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkLmMgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQuYwppbmRleCA3ZGM2MmRlLi45ZmRjZDYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQuYworKysgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQuYwpAQCAtMTk2Nyw4ICsxOTY3LDggQEAKIAkJCXNjYi0+c3RhdGUgfD0gYW9yOwogCiAJCQkvKgotCQkJICogQ2hlY2sgaWYgdGhpcyBjb21tYW5kIGhhcyBmaXJtYXJlIG93ZW5lcnNoaXAuIElmCi0JCQkgKiB5ZXMsIHdlIGNhbm5vdCByZXNldCB0aGlzIGNvbW1hbmQuIFdoZW5ldmVyLCBmL3cKKwkJCSAqIENoZWNrIGlmIHRoaXMgY29tbWFuZCBoYXMgZmlybXdhcmUgb3duZXJzaGlwLiBJZgorCQkJICogeWVzLCB3ZSBjYW5ub3QgcmVzZXQgdGhpcyBjb21tYW5kLiBXaGVuZXZlciBmL3cKIAkJCSAqIGNvbXBsZXRlcyB0aGlzIGNvbW1hbmQsIHdlIHdpbGwgcmV0dXJuIGFwcHJvcHJpYXRlCiAJCQkgKiBzdGF0dXMgZnJvbSBJU1IuCiAJCQkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tdnNhcy5jIGIvZHJpdmVycy9zY3NpL212c2FzLmMKaW5kZXggMWRkNzBkNy4uMjNlNWE4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL212c2FzLmMKKysrIGIvZHJpdmVycy9zY3NpL212c2FzLmMKQEAgLTI5NTksNyArMjk1OSw3IEBACiAKIAkvKiBlbmFibGUgYXV0byBwb3J0IGRldGVjdGlvbiAqLwogCW13MzIoR0JMX1BPUlRfVFlQRSwgTU9ERV9BVVRPX0RFVF9FTik7Ci0JbXNsZWVwKDEwMCk7CisJbXNsZWVwKDExMDApOwogCS8qIGluaXQgYW5kIHJlc2V0IHBoeXMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgbXZpLT5jaGlwLT5uX3BoeTsgaSsrKSB7CiAJCXUzMiBsbyA9IGJlMzJfdG9fY3B1KCoodTMyICopJm12aS0+c2FzX2FkZHJbNF0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BjbWNpYS9haGExNTJ4X3N0dWIuYyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvYWhhMTUyeF9zdHViLmMKaW5kZXggMTY1ZmY4OC4uNjdjZGUwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3BjbWNpYS9haGExNTJ4X3N0dWIuYworKysgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL2FoYTE1Mnhfc3R1Yi5jCkBAIC0xMTQsNyArMTE0LDcgQEAKICAgICBsaW5rLT5pby5OdW1Qb3J0czEgPSAweDIwOwogICAgIGxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87CiAgICAgbGluay0+aW8uSU9BZGRyTGluZXMgPSAxMDsKLSAgICBsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRTsKKyAgICBsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0RZTkFNSUNfU0hBUklORzsKICAgICBsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfTEVWRUxfSUQ7CiAgICAgbGluay0+Y29uZi5BdHRyaWJ1dGVzID0gQ09ORl9FTkFCTEVfSVJROwogICAgIGxpbmstPmNvbmYuSW50VHlwZSA9IElOVF9NRU1PUllfQU5EX0lPOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTEyODAuYyBiL2RyaXZlcnMvc2NzaS9xbGExMjgwLmMKaW5kZXggOGNiOTI0MC4uZGYwOTgyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTEyODAuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMTI4MC5jCkBAIC0xMjgsNyArMTI4LDcgQEAKIAktIEludGVncmF0ZSBxbDEyMTYwX3NldF90YXJnZXRfcGFyYW1ldGVycygpIHdpdGggMTI4MCB2ZXJzaW9uCiAJLSBNYWtlIHFsYTEyODBfc2V0dXAoKSBub24gc3RhdGljCiAJLSBEbyBub3QgY2FsbCBxbGExMjgwX2NoZWNrX2Zvcl9kZWFkX3Njc2lfYnVzKCkgb24gZXZlcnkgSS9PIHJlcXVlc3QKLQkgIHNlbnQgdG8gdGhlIGNhcmQgLSB0aGlzIGNvbW1hbmQgcGF1c2VzIHRoZSBmaXJtYXJlISEhCisJICBzZW50IHRvIHRoZSBjYXJkIC0gdGhpcyBjb21tYW5kIHBhdXNlcyB0aGUgZmlybXdhcmUhISEKICAgICBSZXYgIDMuMjMuMTUgQmV0YSBNYXJjaCAxOSwgMjAwMiwgSmVzIFNvcmVuc2VuCiAJLSBDbGVhbiB1cCBxbGExMjgwLmggLSByZW1vdmUgb2Jzb2xldGUgUUxfREVCVUdfTEVWRUxfeCBkZWZpbml0aW9ucwogCS0gUmVtb3ZlIGEgcGlsZSBvZiBwb2ludGxlc3MgYW5kIGNvbmZ1c2luZyAoc3JiX3QgKiopIGFuZApAQCAtNjU5LDcgKzY1OSw3IEBACiAJLyogVGhlIGZpcm13YXJlIGludGVyZmFjZSBpcywgdW0sIGludGVyZXN0aW5nLCBpbiB0aGF0IHRoZQogCSAqIGFjdHVhbCBmaXJtd2FyZSBpbWFnZSBvbiB0aGUgY2hpcCBpcyBsaXR0bGUgZW5kaWFuLCB0aHVzLAogCSAqIHRoZSBwcm9jZXNzIG9mIHRha2luZyB0aGF0IGltYWdlIHRvIHRoZSBDUFUgd291bGQgZW5kIHVwCi0JICogbGl0dGxlIGVuZGlhbi4gIEhvd2V2ZXIsIHRoZSBmaXJtYXJlIGludGVyZmFjZSByZXF1aXJlcyBpdAorCSAqIGxpdHRsZSBlbmRpYW4uICBIb3dldmVyLCB0aGUgZmlybXdhcmUgaW50ZXJmYWNlIHJlcXVpcmVzIGl0CiAJICogdG8gYmUgcmVhZCBhIHdvcmQgKHR3byBieXRlcykgYXQgYSB0aW1lLgogCSAqCiAJICogVGhlIG5ldCByZXN1bHQgb2YgdGhpcyB3b3VsZCBiZSB0aGF0IHRoZSB3b3JkIChhbmQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYXR0ci5jCmluZGV4IGNkNTM2MjcuLmM3YWNlZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2F0dHIuYwpAQCAtMzAzLDcgKzMwMyw3IEBACiAJCWVsc2UgaWYgKHN0YXJ0ID09IChoYS0+Zmx0X3JlZ2lvbl9ib290ICogNCkgfHwKIAkJICAgIHN0YXJ0ID09IChoYS0+Zmx0X3JlZ2lvbl9mdyAqIDQpKQogCQkJdmFsaWQgPSAxOwotCQllbHNlIGlmIChJU19RTEEyNVhYKGhhKSAmJgorCQllbHNlIGlmICgoSVNfUUxBMjVYWChoYSkgfHwgSVNfUUxBODFYWChoYSkpICYmCiAJCSAgICBzdGFydCA9PSAoaGEtPmZsdF9yZWdpb25fdnBkX252cmFtICogNCkpCiAJCSAgICB2YWxpZCA9IDE7CiAJCWlmICghdmFsaWQpIHsKQEAgLTgxNSw2ICs4MTUsMjEgQEAKIAkgICAgaGEtPnFsYV9zdGF0cy50b3RhbF9pc3BfYWJvcnRzKTsKIH0KIAorc3RhdGljIHNzaXplX3QKK3FsYTJ4MDBfbXBpX3ZlcnNpb25fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorICAgIGNoYXIgKmJ1ZikKK3sKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHNob3N0X3ByaXYoY2xhc3NfdG9fc2hvc3QoZGV2KSk7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisKKwlpZiAoIUlTX1FMQTgxWFgoaGEpKQorCQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJcbiIpOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJTAyeC4lMDJ4LiUwMnguJTAyeCAoJXgpXG4iLAorCSAgICBoYS0+bXBpX3ZlcnNpb25bMF0sIGhhLT5tcGlfdmVyc2lvblsxXSwgaGEtPm1waV92ZXJzaW9uWzJdLAorCSAgICBoYS0+bXBpX3ZlcnNpb25bM10sIGhhLT5tcGlfY2FwYWJpbGl0aWVzKTsKK30KKwogc3RhdGljIERFVklDRV9BVFRSKGRyaXZlcl92ZXJzaW9uLCBTX0lSVUdPLCBxbGEyeDAwX2RydnJfdmVyc2lvbl9zaG93LCBOVUxMKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihmd192ZXJzaW9uLCBTX0lSVUdPLCBxbGEyeDAwX2Z3X3ZlcnNpb25fc2hvdywgTlVMTCk7CiBzdGF0aWMgREVWSUNFX0FUVFIoc2VyaWFsX251bSwgU19JUlVHTywgcWxhMngwMF9zZXJpYWxfbnVtX3Nob3csIE5VTEwpOwpAQCAtODM5LDYgKzg1NCw3IEBACiAJCSAgIE5VTEwpOwogc3RhdGljIERFVklDRV9BVFRSKHRvdGFsX2lzcF9hYm9ydHMsIFNfSVJVR08sIHFsYTJ4MDBfdG90YWxfaXNwX2Fib3J0c19zaG93LAogCQkgICBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihtcGlfdmVyc2lvbiwgU19JUlVHTywgcWxhMngwMF9tcGlfdmVyc2lvbl9zaG93LCBOVUxMKTsKIAogc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKnFsYTJ4MDBfaG9zdF9hdHRyc1tdID0gewogCSZkZXZfYXR0cl9kcml2ZXJfdmVyc2lvbiwKQEAgLTg1OCw2ICs4NzQsNyBAQAogCSZkZXZfYXR0cl9vcHRyb21fZmNvZGVfdmVyc2lvbiwKIAkmZGV2X2F0dHJfb3B0cm9tX2Z3X3ZlcnNpb24sCiAJJmRldl9hdHRyX3RvdGFsX2lzcF9hYm9ydHMsCisJJmRldl9hdHRyX21waV92ZXJzaW9uLAogCU5VTEwsCiB9OwogCkBAIC04OTIsNiArOTA5LDkgQEAKIAljYXNlIFBPUlRfU1BFRURfOEdCOgogCQlzcGVlZCA9IEZDX1BPUlRTUEVFRF84R0JJVDsKIAkJYnJlYWs7CisJY2FzZSBQT1JUX1NQRUVEXzEwR0I6CisJCXNwZWVkID0gRkNfUE9SVFNQRUVEXzEwR0JJVDsKKwkJYnJlYWs7CiAJfQogCWZjX2hvc3Rfc3BlZWQoc2hvc3QpID0gc3BlZWQ7CiB9CkBAIC0xMzgyLDcgKzE0MDIsOSBAQAogCWZjX2hvc3RfbWF4X25waXZfdnBvcnRzKHZoYS0+aG9zdCkgPSBoYS0+bWF4X25waXZfdnBvcnRzOwogCWZjX2hvc3RfbnBpdl92cG9ydHNfaW51c2UodmhhLT5ob3N0KSA9IGhhLT5jdXJfdnBvcnRfY291bnQ7CiAKLQlpZiAoSVNfUUxBMjVYWChoYSkpCisJaWYgKElTX1FMQTgxWFgoaGEpKQorCQlzcGVlZCA9IEZDX1BPUlRTUEVFRF8xMEdCSVQ7CisJZWxzZSBpZiAoSVNfUUxBMjVYWChoYSkpCiAJCXNwZWVkID0gRkNfUE9SVFNQRUVEXzhHQklUIHwgRkNfUE9SVFNQRUVEXzRHQklUIHwKIAkJICAgIEZDX1BPUlRTUEVFRF8yR0JJVCB8IEZDX1BPUlRTUEVFRF8xR0JJVDsKIAllbHNlIGlmIChJU19RTEEyNFhYX1RZUEUoaGEpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5jCmluZGV4IDFjZjc3NzcuLjM0NzYwZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmMKQEAgLTMxMCw2ICszMTAsNzYgQEAKIAkJKmJ1ZisrID0gaHRvbnMoUkRfUkVHX1dPUkQoZG1wX3JlZysrKSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCAqCitxbGEyNHh4X2NvcHlfZWZ0KHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsIHZvaWQgKnB0cikKK3sKKwlpZiAoIWhhLT5lZnQpCisJCXJldHVybiBwdHI7CisKKwltZW1jcHkocHRyLCBoYS0+ZWZ0LCBudG9obChoYS0+ZndfZHVtcC0+ZWZ0X3NpemUpKTsKKwlyZXR1cm4gcHRyICsgbnRvaGwoaGEtPmZ3X2R1bXAtPmVmdF9zaXplKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICoKK3FsYTI1eHhfY29weV9mY2Uoc3RydWN0IHFsYV9od19kYXRhICpoYSwgdm9pZCAqcHRyLCB1aW50MzJfdCAqKmxhc3RfY2hhaW4pCit7CisJdWludDMyX3QgY250OworCXVpbnQzMl90ICppdGVyX3JlZzsKKwlzdHJ1Y3QgcWxhMnh4eF9mY2VfY2hhaW4gKmZjZWMgPSBwdHI7CisKKwlpZiAoIWhhLT5mY2UpCisJCXJldHVybiBwdHI7CisKKwkqbGFzdF9jaGFpbiA9ICZmY2VjLT50eXBlOworCWZjZWMtPnR5cGUgPSBfX2NvbnN0YW50X2h0b25sKERVTVBfQ0hBSU5fRkNFKTsKKwlmY2VjLT5jaGFpbl9zaXplID0gaHRvbmwoc2l6ZW9mKHN0cnVjdCBxbGEyeHh4X2ZjZV9jaGFpbikgKworCSAgICBmY2VfY2FsY19zaXplKGhhLT5mY2VfYnVmcykpOworCWZjZWMtPnNpemUgPSBodG9ubChmY2VfY2FsY19zaXplKGhhLT5mY2VfYnVmcykpOworCWZjZWMtPmFkZHJfbCA9IGh0b25sKExTRChoYS0+ZmNlX2RtYSkpOworCWZjZWMtPmFkZHJfaCA9IGh0b25sKE1TRChoYS0+ZmNlX2RtYSkpOworCisJaXRlcl9yZWcgPSBmY2VjLT5lcmVnczsKKwlmb3IgKGNudCA9IDA7IGNudCA8IDg7IGNudCsrKQorCQkqaXRlcl9yZWcrKyA9IGh0b25sKGhhLT5mY2VfbWJbY250XSk7CisKKwltZW1jcHkoaXRlcl9yZWcsIGhhLT5mY2UsIG50b2hsKGZjZWMtPnNpemUpKTsKKworCXJldHVybiBpdGVyX3JlZzsKK30KKworc3RhdGljIGlubGluZSB2b2lkICoKK3FsYTI1eHhfY29weV9tcShzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhLCB2b2lkICpwdHIsIHVpbnQzMl90ICoqbGFzdF9jaGFpbikKK3sKKwl1aW50MzJfdCBjbnQsIHF1ZV9pZHg7CisJdWludDhfdCByZXFfY250LCByc3BfY250LCBxdWVfY250OworCXN0cnVjdCBxbGEyeHh4X21xX2NoYWluICptcSA9IHB0cjsKKwlzdHJ1Y3QgZGV2aWNlX3JlZ18yNXh4bXEgX19pb21lbSAqcmVnOworCisJaWYgKCFoYS0+bXFlbmFibGUpCisJCXJldHVybiBwdHI7CisKKwltcSA9IHB0cjsKKwkqbGFzdF9jaGFpbiA9ICZtcS0+dHlwZTsKKwltcS0+dHlwZSA9IF9fY29uc3RhbnRfaHRvbmwoRFVNUF9DSEFJTl9NUSk7CisJbXEtPmNoYWluX3NpemUgPSBfX2NvbnN0YW50X2h0b25sKHNpemVvZihzdHJ1Y3QgcWxhMnh4eF9tcV9jaGFpbikpOworCisJcmVxX2NudCA9IGZpbmRfZmlyc3RfemVyb19iaXQoaGEtPnJlcV9xaWRfbWFwLCBoYS0+bWF4X3F1ZXVlcyk7CisJcnNwX2NudCA9IGZpbmRfZmlyc3RfemVyb19iaXQoaGEtPnJzcF9xaWRfbWFwLCBoYS0+bWF4X3F1ZXVlcyk7CisJcXVlX2NudCA9IHJlcV9jbnQgPiByc3BfY250ID8gcmVxX2NudCA6IHJzcF9jbnQ7CisJbXEtPmNvdW50ID0gaHRvbmwocXVlX2NudCk7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBxdWVfY250OyBjbnQrKykgeworCQlyZWcgPSAoc3RydWN0IGRldmljZV9yZWdfMjV4eG1xICopICgodm9pZCAqKQorCQkJaGEtPm1xaW9iYXNlICsgY250ICogUUxBX1FVRV9QQUdFKTsKKwkJcXVlX2lkeCA9IGNudCAqIDQ7CisJCW1xLT5xcmVnc1txdWVfaWR4XSA9IGh0b25sKFJEX1JFR19EV09SRCgmcmVnLT5yZXFfcV9pbikpOworCQltcS0+cXJlZ3NbcXVlX2lkeCsxXSA9IGh0b25sKFJEX1JFR19EV09SRCgmcmVnLT5yZXFfcV9vdXQpKTsKKwkJbXEtPnFyZWdzW3F1ZV9pZHgrMl0gPSBodG9ubChSRF9SRUdfRFdPUkQoJnJlZy0+cnNwX3FfaW4pKTsKKwkJbXEtPnFyZWdzW3F1ZV9pZHgrM10gPSBodG9ubChSRF9SRUdfRFdPUkQoJnJlZy0+cnNwX3Ffb3V0KSk7CisJfQorCisJcmV0dXJuIHB0ciArIHNpemVvZihzdHJ1Y3QgcWxhMnh4eF9tcV9jaGFpbik7Cit9CisKIC8qKgogICogcWxhMjMwMF9md19kdW1wKCkgLSBEdW1wcyBiaW5hcnkgZGF0YSBmcm9tIHRoZSAyMzAwIGZpcm13YXJlLgogICogQGhhOiBIQSBjb250ZXh0CkBAIC05MTMsOCArOTgzLDggQEAKIAkJZ290byBxbGEyNHh4X2Z3X2R1bXBfZmFpbGVkXzA7CiAKIAlueHQgPSBxbGEyeHh4X2NvcHlfcXVldWVzKGhhLCBueHQpOwotCWlmIChoYS0+ZWZ0KQotCQltZW1jcHkobnh0LCBoYS0+ZWZ0LCBudG9obChoYS0+ZndfZHVtcC0+ZWZ0X3NpemUpKTsKKworCXFsYTI0eHhfY29weV9lZnQoaGEsIG54dCk7CiAKIHFsYTI0eHhfZndfZHVtcF9mYWlsZWRfMDoKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewpAQCAtOTQyLDE5ICsxMDEyLDE0IEBACiAJdWludDMyX3QJcmlzY19hZGRyZXNzOwogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXN0cnVjdCBkZXZpY2VfcmVnXzI0eHggX19pb21lbSAqcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDI0OwotCXN0cnVjdCBkZXZpY2VfcmVnXzI1eHhtcSBfX2lvbWVtICpyZWcyNTsKIAl1aW50MzJfdCBfX2lvbWVtICpkbXBfcmVnOwogCXVpbnQzMl90CSppdGVyX3JlZzsKIAl1aW50MTZfdCBfX2lvbWVtICptYnhfcmVnOwogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CiAJc3RydWN0IHFsYTI1eHhfZndfZHVtcCAqZnc7CiAJdWludDMyX3QJZXh0X21lbV9jbnQ7Ci0Jdm9pZAkJKm54dDsKLQlzdHJ1Y3QgcWxhMnh4eF9mY2VfY2hhaW4gKmZjZWM7Ci0Jc3RydWN0IHFsYTJ4eHhfbXFfY2hhaW4gKm1xID0gTlVMTDsKLQl1aW50MzJfdAlxcmVnX3NpemU7Ci0JdWludDhfdAkJcmVxX2NudCwgcnNwX2NudCwgcXVlX2NudDsKLQl1aW50MzJfdAlxdWVfaWR4OworCXZvaWQJCSpueHQsICpueHRfY2hhaW47CisJdWludDMyX3QJKmxhc3RfY2hhaW4gPSBOVUxMOwogCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpiYXNlX3ZoYSA9IHBjaV9nZXRfZHJ2ZGF0YShoYS0+cGRldik7CiAKIAlyaXNjX2FkZHJlc3MgPSBleHRfbWVtX2NudCA9IDA7CkBAIC0xMDAxLDI4ICsxMDY2LDYgQEAKIAlmdy0+cGNpZV9yZWdzWzJdID0gaHRvbmwoUkRfUkVHX0RXT1JEKGRtcF9yZWcpKTsKIAlmdy0+cGNpZV9yZWdzWzNdID0gaHRvbmwoUkRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV93aW5kb3cpKTsKIAotCS8qIE11bHRpIHF1ZXVlIHJlZ2lzdGVycyAqLwotCWlmIChoYS0+bXFlbmFibGUpIHsKLQkJcXJlZ19zaXplID0gc2l6ZW9mKHN0cnVjdCBxbGEyeHh4X21xX2NoYWluKTsKLQkJbXEgPSBremFsbG9jKHFyZWdfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghbXEpCi0JCQlnb3RvIHFsYTI1eHhfZndfZHVtcF9mYWlsZWRfMDsKLQkJcmVxX2NudCA9IGZpbmRfZmlyc3RfemVyb19iaXQoaGEtPnJlcV9xaWRfbWFwLCBoYS0+bWF4X3F1ZXVlcyk7Ci0JCXJzcF9jbnQgPSBmaW5kX2ZpcnN0X3plcm9fYml0KGhhLT5yc3BfcWlkX21hcCwgaGEtPm1heF9xdWV1ZXMpOwotCQlxdWVfY250ID0gcmVxX2NudCA+IHJzcF9jbnQgPyByZXFfY250IDogcnNwX2NudDsKLQkJbXEtPmNvdW50ID0gaHRvbmwocXVlX2NudCk7Ci0JCW1xLT5jaGFpbl9zaXplID0gaHRvbmwocXJlZ19zaXplKTsKLQkJbXEtPnR5cGUgPSBfX2NvbnN0YW50X2h0b25sKERVTVBfQ0hBSU5fTVEpOwotCQlmb3IgKGNudCA9IDA7IGNudCA8IHF1ZV9jbnQ7IGNudCsrKSB7Ci0JCQlyZWcyNSA9IChzdHJ1Y3QgZGV2aWNlX3JlZ18yNXh4bXEgKikgKCh2b2lkICopCi0JCQkJaGEtPm1xaW9iYXNlICsgY250ICogUUxBX1FVRV9QQUdFKTsKLQkJCXF1ZV9pZHggPSBjbnQgKiA0OwotCQkJbXEtPnFyZWdzW3F1ZV9pZHhdID0gaHRvbmwocmVnMjUtPnJlcV9xX2luKTsKLQkJCW1xLT5xcmVnc1txdWVfaWR4KzFdID0gaHRvbmwocmVnMjUtPnJlcV9xX291dCk7Ci0JCQltcS0+cXJlZ3NbcXVlX2lkeCsyXSA9IGh0b25sKHJlZzI1LT5yc3BfcV9pbik7Ci0JCQltcS0+cXJlZ3NbcXVlX2lkeCszXSA9IGh0b25sKHJlZzI1LT5yc3BfcV9vdXQpOwotCQl9Ci0JfQogCVdSVF9SRUdfRFdPUkQoJnJlZy0+aW9iYXNlX3dpbmRvdywgMHgwMCk7CiAJUkRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV93aW5kb3cpOwogCkBAIC0xMjQwLDYgKzEyODMsMTAgQEAKIAlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDYxQjAsIDE2LCBpdGVyX3JlZyk7CiAJcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NkYwMCwgMTYsIGl0ZXJfcmVnKTsKIAorCS8qIE11bHRpIHF1ZXVlIHJlZ2lzdGVycyAqLworCW54dF9jaGFpbiA9IHFsYTI1eHhfY29weV9tcShoYSwgKHZvaWQgKiloYS0+ZndfZHVtcCArIGhhLT5jaGFpbl9vZmZzZXQsCisJICAgICZsYXN0X2NoYWluKTsKKwogCXJ2YWwgPSBxbGEyNHh4X3NvZnRfcmVzZXQoaGEpOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKQogCQlnb3RvIHFsYTI1eHhfZndfZHVtcF9mYWlsZWRfMDsKQEAgLTEyNDksMzcgKzEyOTYsMTYgQEAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykKIAkJZ290byBxbGEyNXh4X2Z3X2R1bXBfZmFpbGVkXzA7CiAKLQkvKiBGaWJyZSBDaGFubmVsIFRyYWNlIEJ1ZmZlci4gKi8KIAlueHQgPSBxbGEyeHh4X2NvcHlfcXVldWVzKGhhLCBueHQpOwotCWlmIChoYS0+ZWZ0KQotCQltZW1jcHkobnh0LCBoYS0+ZWZ0LCBudG9obChoYS0+ZndfZHVtcC0+ZWZ0X3NpemUpKTsKIAotCS8qIEZpYnJlIENoYW5uZWwgRXZlbnQgQnVmZmVyLiAqLwotCWlmICghaGEtPmZjZSkKLQkJZ290byBxbGEyNXh4X2Z3X2R1bXBfZmFpbGVkXzA7CisJbnh0ID0gcWxhMjR4eF9jb3B5X2VmdChoYSwgbnh0KTsKIAotCWhhLT5md19kdW1wLT52ZXJzaW9uIHw9IF9fY29uc3RhbnRfaHRvbmwoRFVNUF9DSEFJTl9WQVJJQU5UKTsKLQotCWlmIChoYS0+bXFlbmFibGUpIHsKLQkJbnh0ID0gbnh0ICsgbnRvaGwoaGEtPmZ3X2R1bXAtPmVmdF9zaXplKTsKLQkJbWVtY3B5KG54dCwgbXEsIHFyZWdfc2l6ZSk7Ci0JCWtmcmVlKG1xKTsKLQkJZmNlYyA9IG54dCArIHFyZWdfc2l6ZTsKLQl9IGVsc2UgewotCQlmY2VjID0gbnh0ICsgbnRvaGwoaGEtPmZ3X2R1bXAtPmVmdF9zaXplKTsKKwkvKiBDaGFpbiBlbnRyaWVzIC0tIHN0YXJ0ZWQgd2l0aCBNUS4gKi8KKwlxbGEyNXh4X2NvcHlfZmNlKGhhLCBueHRfY2hhaW4sICZsYXN0X2NoYWluKTsKKwlpZiAobGFzdF9jaGFpbikgeworCQloYS0+ZndfZHVtcC0+dmVyc2lvbiB8PSBfX2NvbnN0YW50X2h0b25sKERVTVBfQ0hBSU5fVkFSSUFOVCk7CisJCSpsYXN0X2NoYWluIHw9IF9fY29uc3RhbnRfaHRvbmwoRFVNUF9DSEFJTl9MQVNUKTsKIAl9Ci0JZmNlYy0+dHlwZSA9IF9fY29uc3RhbnRfaHRvbmwoRFVNUF9DSEFJTl9GQ0UgfCBEVU1QX0NIQUlOX0xBU1QpOwotCWZjZWMtPmNoYWluX3NpemUgPSBodG9ubChzaXplb2Yoc3RydWN0IHFsYTJ4eHhfZmNlX2NoYWluKSArCi0JICAgIGZjZV9jYWxjX3NpemUoaGEtPmZjZV9idWZzKSk7Ci0JZmNlYy0+c2l6ZSA9IGh0b25sKGZjZV9jYWxjX3NpemUoaGEtPmZjZV9idWZzKSk7Ci0JZmNlYy0+YWRkcl9sID0gaHRvbmwoTFNEKGhhLT5mY2VfZG1hKSk7Ci0JZmNlYy0+YWRkcl9oID0gaHRvbmwoTVNEKGhhLT5mY2VfZG1hKSk7Ci0KLQlpdGVyX3JlZyA9IGZjZWMtPmVyZWdzOwotCWZvciAoY250ID0gMDsgY250IDwgODsgY250KyspCi0JCSppdGVyX3JlZysrID0gaHRvbmwoaGEtPmZjZV9tYltjbnRdKTsKLQotCW1lbWNweShpdGVyX3JlZywgaGEtPmZjZSwgbnRvaGwoZmNlYy0+c2l6ZSkpOwogCiBxbGEyNXh4X2Z3X2R1bXBfZmFpbGVkXzA6CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKQEAgLTEyOTgsNiArMTMyNCwzMzAgQEAKIAlpZiAoIWhhcmR3YXJlX2xvY2tlZCkKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIH0KKwordm9pZAorcWxhODF4eF9md19kdW1wKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCBpbnQgaGFyZHdhcmVfbG9ja2VkKQoreworCWludAkJcnZhbDsKKwl1aW50MzJfdAljbnQ7CisJdWludDMyX3QJcmlzY19hZGRyZXNzOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCXN0cnVjdCBkZXZpY2VfcmVnXzI0eHggX19pb21lbSAqcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDI0OworCXVpbnQzMl90IF9faW9tZW0gKmRtcF9yZWc7CisJdWludDMyX3QJKml0ZXJfcmVnOworCXVpbnQxNl90IF9faW9tZW0gKm1ieF9yZWc7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwlzdHJ1Y3QgcWxhODF4eF9md19kdW1wICpmdzsKKwl1aW50MzJfdAlleHRfbWVtX2NudDsKKwl2b2lkCQkqbnh0LCAqbnh0X2NoYWluOworCXVpbnQzMl90CSpsYXN0X2NoYWluID0gTlVMTDsKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqYmFzZV92aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOworCisJcmlzY19hZGRyZXNzID0gZXh0X21lbV9jbnQgPSAwOworCWZsYWdzID0gMDsKKworCWlmICghaGFyZHdhcmVfbG9ja2VkKQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKworCWlmICghaGEtPmZ3X2R1bXApIHsKKwkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkgICAgIk5vIGJ1ZmZlciBhdmFpbGFibGUgZm9yIGR1bXAhISFcbiIpOworCQlnb3RvIHFsYTgxeHhfZndfZHVtcF9mYWlsZWQ7CisJfQorCisJaWYgKGhhLT5md19kdW1wZWQpIHsKKwkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkgICAgIkZpcm13YXJlIGhhcyBiZWVuIHByZXZpb3VzbHkgZHVtcGVkICglcCkgLS0gaWdub3JpbmcgIgorCQkgICAgInJlcXVlc3QuLi5cbiIsIGhhLT5md19kdW1wKTsKKwkJZ290byBxbGE4MXh4X2Z3X2R1bXBfZmFpbGVkOworCX0KKwlmdyA9ICZoYS0+ZndfZHVtcC0+aXNwLmlzcDgxOworCXFsYTJ4eHhfcHJlcF9kdW1wKGhhLCBoYS0+ZndfZHVtcCk7CisKKwlmdy0+aG9zdF9zdGF0dXMgPSBodG9ubChSRF9SRUdfRFdPUkQoJnJlZy0+aG9zdF9zdGF0dXMpKTsKKworCS8qIFBhdXNlIFJJU0MuICovCisJcnZhbCA9IHFsYTI0eHhfcGF1c2VfcmlzYyhyZWcpOworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKQorCQlnb3RvIHFsYTgxeHhfZndfZHVtcF9mYWlsZWRfMDsKKworCS8qIEhvc3QvUmlzYyByZWdpc3RlcnMuICovCisJaXRlcl9yZWcgPSBmdy0+aG9zdF9yaXNjX3JlZzsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDcwMDAsIDE2LCBpdGVyX3JlZyk7CisJcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NzAxMCwgMTYsIGl0ZXJfcmVnKTsKKworCS8qIFBDSWUgcmVnaXN0ZXJzLiAqLworCVdSVF9SRUdfRFdPUkQoJnJlZy0+aW9iYXNlX2FkZHIsIDB4N0MwMCk7CisJUkRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV9hZGRyKTsKKwlXUlRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV93aW5kb3csIDB4MDEpOworCWRtcF9yZWcgPSAmcmVnLT5pb2Jhc2VfYzQ7CisJZnctPnBjaWVfcmVnc1swXSA9IGh0b25sKFJEX1JFR19EV09SRChkbXBfcmVnKyspKTsKKwlmdy0+cGNpZV9yZWdzWzFdID0gaHRvbmwoUkRfUkVHX0RXT1JEKGRtcF9yZWcrKykpOworCWZ3LT5wY2llX3JlZ3NbMl0gPSBodG9ubChSRF9SRUdfRFdPUkQoZG1wX3JlZykpOworCWZ3LT5wY2llX3JlZ3NbM10gPSBodG9ubChSRF9SRUdfRFdPUkQoJnJlZy0+aW9iYXNlX3dpbmRvdykpOworCisJV1JUX1JFR19EV09SRCgmcmVnLT5pb2Jhc2Vfd2luZG93LCAweDAwKTsKKwlSRF9SRUdfRFdPUkQoJnJlZy0+aW9iYXNlX3dpbmRvdyk7CisKKwkvKiBIb3N0IGludGVyZmFjZSByZWdpc3RlcnMuICovCisJZG1wX3JlZyA9ICZyZWctPmZsYXNoX2FkZHI7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplb2YoZnctPmhvc3RfcmVnKSAvIDQ7IGNudCsrKQorCQlmdy0+aG9zdF9yZWdbY250XSA9IGh0b25sKFJEX1JFR19EV09SRChkbXBfcmVnKyspKTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cy4gKi8KKwlXUlRfUkVHX0RXT1JEKCZyZWctPmljdHJsLCAwKTsKKwlSRF9SRUdfRFdPUkQoJnJlZy0+aWN0cmwpOworCisJLyogU2hhZG93IHJlZ2lzdGVycy4gKi8KKwlXUlRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV9hZGRyLCAweDBGNzApOworCVJEX1JFR19EV09SRCgmcmVnLT5pb2Jhc2VfYWRkcik7CisJV1JUX1JFR19EV09SRCgmcmVnLT5pb2Jhc2Vfc2VsZWN0LCAweEIwMDAwMDAwKTsKKwlmdy0+c2hhZG93X3JlZ1swXSA9IGh0b25sKFJEX1JFR19EV09SRCgmcmVnLT5pb2Jhc2Vfc2RhdGEpKTsKKworCVdSVF9SRUdfRFdPUkQoJnJlZy0+aW9iYXNlX3NlbGVjdCwgMHhCMDEwMDAwMCk7CisJZnctPnNoYWRvd19yZWdbMV0gPSBodG9ubChSRF9SRUdfRFdPUkQoJnJlZy0+aW9iYXNlX3NkYXRhKSk7CisKKwlXUlRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV9zZWxlY3QsIDB4QjAyMDAwMDApOworCWZ3LT5zaGFkb3dfcmVnWzJdID0gaHRvbmwoUkRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV9zZGF0YSkpOworCisJV1JUX1JFR19EV09SRCgmcmVnLT5pb2Jhc2Vfc2VsZWN0LCAweEIwMzAwMDAwKTsKKwlmdy0+c2hhZG93X3JlZ1szXSA9IGh0b25sKFJEX1JFR19EV09SRCgmcmVnLT5pb2Jhc2Vfc2RhdGEpKTsKKworCVdSVF9SRUdfRFdPUkQoJnJlZy0+aW9iYXNlX3NlbGVjdCwgMHhCMDQwMDAwMCk7CisJZnctPnNoYWRvd19yZWdbNF0gPSBodG9ubChSRF9SRUdfRFdPUkQoJnJlZy0+aW9iYXNlX3NkYXRhKSk7CisKKwlXUlRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV9zZWxlY3QsIDB4QjA1MDAwMDApOworCWZ3LT5zaGFkb3dfcmVnWzVdID0gaHRvbmwoUkRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV9zZGF0YSkpOworCisJV1JUX1JFR19EV09SRCgmcmVnLT5pb2Jhc2Vfc2VsZWN0LCAweEIwNjAwMDAwKTsKKwlmdy0+c2hhZG93X3JlZ1s2XSA9IGh0b25sKFJEX1JFR19EV09SRCgmcmVnLT5pb2Jhc2Vfc2RhdGEpKTsKKworCVdSVF9SRUdfRFdPUkQoJnJlZy0+aW9iYXNlX3NlbGVjdCwgMHhCMDcwMDAwMCk7CisJZnctPnNoYWRvd19yZWdbN10gPSBodG9ubChSRF9SRUdfRFdPUkQoJnJlZy0+aW9iYXNlX3NkYXRhKSk7CisKKwlXUlRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV9zZWxlY3QsIDB4QjA4MDAwMDApOworCWZ3LT5zaGFkb3dfcmVnWzhdID0gaHRvbmwoUkRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV9zZGF0YSkpOworCisJV1JUX1JFR19EV09SRCgmcmVnLT5pb2Jhc2Vfc2VsZWN0LCAweEIwOTAwMDAwKTsKKwlmdy0+c2hhZG93X3JlZ1s5XSA9IGh0b25sKFJEX1JFR19EV09SRCgmcmVnLT5pb2Jhc2Vfc2RhdGEpKTsKKworCVdSVF9SRUdfRFdPUkQoJnJlZy0+aW9iYXNlX3NlbGVjdCwgMHhCMEEwMDAwMCk7CisJZnctPnNoYWRvd19yZWdbMTBdID0gaHRvbmwoUkRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV9zZGF0YSkpOworCisJLyogUklTQyBJL08gcmVnaXN0ZXIuICovCisJV1JUX1JFR19EV09SRCgmcmVnLT5pb2Jhc2VfYWRkciwgMHgwMDEwKTsKKwlmdy0+cmlzY19pb19yZWcgPSBodG9ubChSRF9SRUdfRFdPUkQoJnJlZy0+aW9iYXNlX3dpbmRvdykpOworCisJLyogTWFpbGJveCByZWdpc3RlcnMuICovCisJbWJ4X3JlZyA9ICZyZWctPm1haWxib3gwOworCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mKGZ3LT5tYWlsYm94X3JlZykgLyAyOyBjbnQrKykKKwkJZnctPm1haWxib3hfcmVnW2NudF0gPSBodG9ucyhSRF9SRUdfV09SRChtYnhfcmVnKyspKTsKKworCS8qIFRyYW5zZmVyIHNlcXVlbmNlIHJlZ2lzdGVycy4gKi8KKwlpdGVyX3JlZyA9IGZ3LT54c2VxX2dwX3JlZzsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweEJGMDAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHhCRjEwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4QkYyMCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweEJGMzAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHhCRjQwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4QkY1MCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweEJGNjAsIDE2LCBpdGVyX3JlZyk7CisJcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4QkY3MCwgMTYsIGl0ZXJfcmVnKTsKKworCWl0ZXJfcmVnID0gZnctPnhzZXFfMF9yZWc7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHhCRkMwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4QkZEMCwgMTYsIGl0ZXJfcmVnKTsKKwlxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHhCRkUwLCAxNiwgaXRlcl9yZWcpOworCisJcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4QkZGMCwgMTYsIGZ3LT54c2VxXzFfcmVnKTsKKworCS8qIFJlY2VpdmUgc2VxdWVuY2UgcmVnaXN0ZXJzLiAqLworCWl0ZXJfcmVnID0gZnctPnJzZXFfZ3BfcmVnOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4RkYwMCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweEZGMTAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHhGRjIwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4RkYzMCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweEZGNDAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHhGRjUwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4RkY2MCwgMTYsIGl0ZXJfcmVnKTsKKwlxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHhGRjcwLCAxNiwgaXRlcl9yZWcpOworCisJaXRlcl9yZWcgPSBmdy0+cnNlcV8wX3JlZzsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweEZGQzAsIDE2LCBpdGVyX3JlZyk7CisJcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4RkZEMCwgMTYsIGl0ZXJfcmVnKTsKKworCXFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweEZGRTAsIDE2LCBmdy0+cnNlcV8xX3JlZyk7CisJcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4RkZGMCwgMTYsIGZ3LT5yc2VxXzJfcmVnKTsKKworCS8qIEF1eGlsaWFyeSBzZXF1ZW5jZSByZWdpc3RlcnMuICovCisJaXRlcl9yZWcgPSBmdy0+YXNlcV9ncF9yZWc7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHhCMDAwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4QjAxMCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweEIwMjAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHhCMDMwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4QjA0MCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweEIwNTAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHhCMDYwLCAxNiwgaXRlcl9yZWcpOworCXFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweEIwNzAsIDE2LCBpdGVyX3JlZyk7CisKKwlpdGVyX3JlZyA9IGZ3LT5hc2VxXzBfcmVnOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4QjBDMCwgMTYsIGl0ZXJfcmVnKTsKKwlxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHhCMEQwLCAxNiwgaXRlcl9yZWcpOworCisJcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4QjBFMCwgMTYsIGZ3LT5hc2VxXzFfcmVnKTsKKwlxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHhCMEYwLCAxNiwgZnctPmFzZXFfMl9yZWcpOworCisJLyogQ29tbWFuZCBETUEgcmVnaXN0ZXJzLiAqLworCXFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDcxMDAsIDE2LCBmdy0+Y21kX2RtYV9yZWcpOworCisJLyogUXVldWVzLiAqLworCWl0ZXJfcmVnID0gZnctPnJlcTBfZG1hX3JlZzsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDcyMDAsIDgsIGl0ZXJfcmVnKTsKKwlkbXBfcmVnID0gJnJlZy0+aW9iYXNlX3E7CisJZm9yIChjbnQgPSAwOyBjbnQgPCA3OyBjbnQrKykKKwkJKml0ZXJfcmVnKysgPSBodG9ubChSRF9SRUdfRFdPUkQoZG1wX3JlZysrKSk7CisKKwlpdGVyX3JlZyA9IGZ3LT5yZXNwMF9kbWFfcmVnOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NzMwMCwgOCwgaXRlcl9yZWcpOworCWRtcF9yZWcgPSAmcmVnLT5pb2Jhc2VfcTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IDc7IGNudCsrKQorCQkqaXRlcl9yZWcrKyA9IGh0b25sKFJEX1JFR19EV09SRChkbXBfcmVnKyspKTsKKworCWl0ZXJfcmVnID0gZnctPnJlcTFfZG1hX3JlZzsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDc0MDAsIDgsIGl0ZXJfcmVnKTsKKwlkbXBfcmVnID0gJnJlZy0+aW9iYXNlX3E7CisJZm9yIChjbnQgPSAwOyBjbnQgPCA3OyBjbnQrKykKKwkJKml0ZXJfcmVnKysgPSBodG9ubChSRF9SRUdfRFdPUkQoZG1wX3JlZysrKSk7CisKKwkvKiBUcmFuc21pdCBETUEgcmVnaXN0ZXJzLiAqLworCWl0ZXJfcmVnID0gZnctPnhtdDBfZG1hX3JlZzsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDc2MDAsIDE2LCBpdGVyX3JlZyk7CisJcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NzYxMCwgMTYsIGl0ZXJfcmVnKTsKKworCWl0ZXJfcmVnID0gZnctPnhtdDFfZG1hX3JlZzsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDc2MjAsIDE2LCBpdGVyX3JlZyk7CisJcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NzYzMCwgMTYsIGl0ZXJfcmVnKTsKKworCWl0ZXJfcmVnID0gZnctPnhtdDJfZG1hX3JlZzsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDc2NDAsIDE2LCBpdGVyX3JlZyk7CisJcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NzY1MCwgMTYsIGl0ZXJfcmVnKTsKKworCWl0ZXJfcmVnID0gZnctPnhtdDNfZG1hX3JlZzsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDc2NjAsIDE2LCBpdGVyX3JlZyk7CisJcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NzY3MCwgMTYsIGl0ZXJfcmVnKTsKKworCWl0ZXJfcmVnID0gZnctPnhtdDRfZG1hX3JlZzsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDc2ODAsIDE2LCBpdGVyX3JlZyk7CisJcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NzY5MCwgMTYsIGl0ZXJfcmVnKTsKKworCXFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDc2QTAsIDE2LCBmdy0+eG10X2RhdGFfZG1hX3JlZyk7CisKKwkvKiBSZWNlaXZlIERNQSByZWdpc3RlcnMuICovCisJaXRlcl9yZWcgPSBmdy0+cmN2dDBfZGF0YV9kbWFfcmVnOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NzcwMCwgMTYsIGl0ZXJfcmVnKTsKKwlxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg3NzEwLCAxNiwgaXRlcl9yZWcpOworCisJaXRlcl9yZWcgPSBmdy0+cmN2dDFfZGF0YV9kbWFfcmVnOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NzcyMCwgMTYsIGl0ZXJfcmVnKTsKKwlxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg3NzMwLCAxNiwgaXRlcl9yZWcpOworCisJLyogUklTQyByZWdpc3RlcnMuICovCisJaXRlcl9yZWcgPSBmdy0+cmlzY19ncF9yZWc7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHgwRjAwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4MEYxMCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDBGMjAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHgwRjMwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4MEY0MCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDBGNTAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHgwRjYwLCAxNiwgaXRlcl9yZWcpOworCXFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDBGNzAsIDE2LCBpdGVyX3JlZyk7CisKKwkvKiBMb2NhbCBtZW1vcnkgY29udHJvbGxlciByZWdpc3RlcnMuICovCisJaXRlcl9yZWcgPSBmdy0+bG1jX3JlZzsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDMwMDAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHgzMDEwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4MzAyMCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDMwMzAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHgzMDQwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4MzA1MCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDMwNjAsIDE2LCBpdGVyX3JlZyk7CisJcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4MzA3MCwgMTYsIGl0ZXJfcmVnKTsKKworCS8qIEZpYnJlIFByb3RvY29sIE1vZHVsZSByZWdpc3RlcnMuICovCisJaXRlcl9yZWcgPSBmdy0+ZnBtX2hkd19yZWc7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg0MDAwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NDAxMCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDQwMjAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg0MDMwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NDA0MCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDQwNTAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg0MDYwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NDA3MCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDQwODAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg0MDkwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NDBBMCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDQwQjAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg0MEMwLCAxNiwgaXRlcl9yZWcpOworCXFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDQwRDAsIDE2LCBpdGVyX3JlZyk7CisKKwkvKiBGcmFtZSBCdWZmZXIgcmVnaXN0ZXJzLiAqLworCWl0ZXJfcmVnID0gZnctPmZiX2hkd19yZWc7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg2MDAwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NjAxMCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDYwMjAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg2MDMwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NjA0MCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDYxMDAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg2MTMwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NjE1MCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDYxNzAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg2MTkwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NjFCMCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDYxQzAsIDE2LCBpdGVyX3JlZyk7CisJcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NkYwMCwgMTYsIGl0ZXJfcmVnKTsKKworCS8qIE11bHRpIHF1ZXVlIHJlZ2lzdGVycyAqLworCW54dF9jaGFpbiA9IHFsYTI1eHhfY29weV9tcShoYSwgKHZvaWQgKiloYS0+ZndfZHVtcCArIGhhLT5jaGFpbl9vZmZzZXQsCisJICAgICZsYXN0X2NoYWluKTsKKworCXJ2YWwgPSBxbGEyNHh4X3NvZnRfcmVzZXQoaGEpOworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKQorCQlnb3RvIHFsYTgxeHhfZndfZHVtcF9mYWlsZWRfMDsKKworCXJ2YWwgPSBxbGEyNHh4X2R1bXBfbWVtb3J5KGhhLCBmdy0+Y29kZV9yYW0sIHNpemVvZihmdy0+Y29kZV9yYW0pLAorCSAgICAmbnh0KTsKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykKKwkJZ290byBxbGE4MXh4X2Z3X2R1bXBfZmFpbGVkXzA7CisKKwlueHQgPSBxbGEyeHh4X2NvcHlfcXVldWVzKGhhLCBueHQpOworCisJbnh0ID0gcWxhMjR4eF9jb3B5X2VmdChoYSwgbnh0KTsKKworCS8qIENoYWluIGVudHJpZXMgLS0gc3RhcnRlZCB3aXRoIE1RLiAqLworCXFsYTI1eHhfY29weV9mY2UoaGEsIG54dF9jaGFpbiwgJmxhc3RfY2hhaW4pOworCWlmIChsYXN0X2NoYWluKSB7CisJCWhhLT5md19kdW1wLT52ZXJzaW9uIHw9IF9fY29uc3RhbnRfaHRvbmwoRFVNUF9DSEFJTl9WQVJJQU5UKTsKKwkJKmxhc3RfY2hhaW4gfD0gX19jb25zdGFudF9odG9ubChEVU1QX0NIQUlOX0xBU1QpOworCX0KKworcWxhODF4eF9md19kdW1wX2ZhaWxlZF8wOgorCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJICAgICJGYWlsZWQgdG8gZHVtcCBmaXJtd2FyZSAoJXgpISEhXG4iLCBydmFsKTsKKwkJaGEtPmZ3X2R1bXBlZCA9IDA7CisKKwl9IGVsc2UgeworCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCSAgICAiRmlybXdhcmUgZHVtcCBzYXZlZCB0byB0ZW1wIGJ1ZmZlciAoJWxkLyVwKS5cbiIsCisJCSAgICBiYXNlX3ZoYS0+aG9zdF9ubywgaGEtPmZ3X2R1bXApOworCQloYS0+ZndfZHVtcGVkID0gMTsKKwl9CisKK3FsYTgxeHhfZndfZHVtcF9mYWlsZWQ6CisJaWYgKCFoYXJkd2FyZV9sb2NrZWQpCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7Cit9CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgRHJpdmVyIERlYnVnIEZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuaAppbmRleCBjMTc5NGE3Li5mNjYwZGQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5oCkBAIC0yNTEsNiArMjUxLDQ1IEBACiAJdWludDMyX3QgZXh0X21lbVsxXTsKIH07CiAKK3N0cnVjdCBxbGE4MXh4X2Z3X2R1bXAgeworCXVpbnQzMl90IGhvc3Rfc3RhdHVzOworCXVpbnQzMl90IGhvc3RfcmlzY19yZWdbMzJdOworCXVpbnQzMl90IHBjaWVfcmVnc1s0XTsKKwl1aW50MzJfdCBob3N0X3JlZ1szMl07CisJdWludDMyX3Qgc2hhZG93X3JlZ1sxMV07CisJdWludDMyX3QgcmlzY19pb19yZWc7CisJdWludDE2X3QgbWFpbGJveF9yZWdbMzJdOworCXVpbnQzMl90IHhzZXFfZ3BfcmVnWzEyOF07CisJdWludDMyX3QgeHNlcV8wX3JlZ1s0OF07CisJdWludDMyX3QgeHNlcV8xX3JlZ1sxNl07CisJdWludDMyX3QgcnNlcV9ncF9yZWdbMTI4XTsKKwl1aW50MzJfdCByc2VxXzBfcmVnWzMyXTsKKwl1aW50MzJfdCByc2VxXzFfcmVnWzE2XTsKKwl1aW50MzJfdCByc2VxXzJfcmVnWzE2XTsKKwl1aW50MzJfdCBhc2VxX2dwX3JlZ1sxMjhdOworCXVpbnQzMl90IGFzZXFfMF9yZWdbMzJdOworCXVpbnQzMl90IGFzZXFfMV9yZWdbMTZdOworCXVpbnQzMl90IGFzZXFfMl9yZWdbMTZdOworCXVpbnQzMl90IGNtZF9kbWFfcmVnWzE2XTsKKwl1aW50MzJfdCByZXEwX2RtYV9yZWdbMTVdOworCXVpbnQzMl90IHJlc3AwX2RtYV9yZWdbMTVdOworCXVpbnQzMl90IHJlcTFfZG1hX3JlZ1sxNV07CisJdWludDMyX3QgeG10MF9kbWFfcmVnWzMyXTsKKwl1aW50MzJfdCB4bXQxX2RtYV9yZWdbMzJdOworCXVpbnQzMl90IHhtdDJfZG1hX3JlZ1szMl07CisJdWludDMyX3QgeG10M19kbWFfcmVnWzMyXTsKKwl1aW50MzJfdCB4bXQ0X2RtYV9yZWdbMzJdOworCXVpbnQzMl90IHhtdF9kYXRhX2RtYV9yZWdbMTZdOworCXVpbnQzMl90IHJjdnQwX2RhdGFfZG1hX3JlZ1szMl07CisJdWludDMyX3QgcmN2dDFfZGF0YV9kbWFfcmVnWzMyXTsKKwl1aW50MzJfdCByaXNjX2dwX3JlZ1sxMjhdOworCXVpbnQzMl90IGxtY19yZWdbMTI4XTsKKwl1aW50MzJfdCBmcG1faGR3X3JlZ1syMjRdOworCXVpbnQzMl90IGZiX2hkd19yZWdbMjA4XTsKKwl1aW50MzJfdCBjb2RlX3JhbVsweDIwMDBdOworCXVpbnQzMl90IGV4dF9tZW1bMV07Cit9OworCiAjZGVmaW5lIEVGVF9OVU1fQlVGRkVSUwkJNAogI2RlZmluZSBFRlRfQllURVNfUEVSX0JVRkZFUgkweDQwMDAKICNkZWZpbmUgRUZUX1NJWkUJCSgoRUZUX0JZVEVTX1BFUl9CVUZGRVIpICogKEVGVF9OVU1fQlVGRkVSUykpCkBAIC0zMTMsNSArMzUyLDYgQEAKIAkJc3RydWN0IHFsYTIzMDBfZndfZHVtcCBpc3AyMzsKIAkJc3RydWN0IHFsYTI0eHhfZndfZHVtcCBpc3AyNDsKIAkJc3RydWN0IHFsYTI1eHhfZndfZHVtcCBpc3AyNTsKKwkJc3RydWN0IHFsYTgxeHhfZndfZHVtcCBpc3A4MTsKIAl9IGlzcDsKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGVmLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGVmLmgKaW5kZXggYTI5Yzk1Mi4uMDIzZWU3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RlZi5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZWYuaApAQCAtMTg3LDcgKzE4Nyw2IEBACiAgKiBTQ1NJIFJlcXVlc3QgQmxvY2sKICAqLwogdHlwZWRlZiBzdHJ1Y3Qgc3JiIHsKLQlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhOwkvKiBIQSB0aGUgU1AgaXMgcXVldWVkIG9uICovCiAJc3RydWN0IHJlcV9xdWUgKnF1ZTsKIAlzdHJ1Y3QgZmNfcG9ydCAqZmNwb3J0OwogCkBAIC0yMTM2LDcgKzIxMzUsNiBAQAogLyogV29yayBldmVudHMuICAqLwogZW51bSBxbGFfd29ya190eXBlIHsKIAlRTEFfRVZUX0FFTiwKLQlRTEFfRVZUX0hXRV9MT0csCiB9OwogCiAKQEAgLTIxNTEsMTAgKzIxNDksNiBAQAogCQkJZW51bSBmY19ob3N0X2V2ZW50X2NvZGUgY29kZTsKIAkJCXUzMiBkYXRhOwogCQl9IGFlbjsKLQkJc3RydWN0IHsKLQkJCXVpbnQxNl90IGNvZGU7Ci0JCQl1aW50MTZfdCBkMSwgZDIsIGQzOwotCQl9IGh3ZTsKIAl9IHU7CiB9OwogCkBAIC0yMzA5LDYgKzIzMDMsNyBAQAogI2RlZmluZSBQT1JUX1NQRUVEXzJHQiAgMHgwMQogI2RlZmluZSBQT1JUX1NQRUVEXzRHQiAgMHgwMwogI2RlZmluZSBQT1JUX1NQRUVEXzhHQiAgMHgwNAorI2RlZmluZSBQT1JUX1NQRUVEXzEwR0IJMHgxMwogCXVpbnQxNl90CWxpbmtfZGF0YV9yYXRlOyAgICAgICAgIC8qIEYvVyBvcGVyYXRpbmcgc3BlZWQgKi8KIAogCXVpbnQ4X3QJCWN1cnJlbnRfdG9wb2xvZ3k7CkBAIC0yMzI4LDYgKzIzMjMsNyBAQAogCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDI1MzIgICAgMHgyNTMyCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDg0MzIgICAgMHg4NDMyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDgwMDEJMHg4MDAxCiAJdWludDMyX3QJZGV2aWNlX3R5cGU7CiAjZGVmaW5lIERUX0lTUDIxMDAgICAgICAgICAgICAgICAgICAgICAgQklUXzAKICNkZWZpbmUgRFRfSVNQMjIwMCAgICAgICAgICAgICAgICAgICAgICBCSVRfMQpAQCAtMjM0Miw3ICsyMzM4LDggQEAKICNkZWZpbmUgRFRfSVNQNTQzMiAgICAgICAgICAgICAgICAgICAgICBCSVRfMTAKICNkZWZpbmUgRFRfSVNQMjUzMiAgICAgICAgICAgICAgICAgICAgICBCSVRfMTEKICNkZWZpbmUgRFRfSVNQODQzMiAgICAgICAgICAgICAgICAgICAgICBCSVRfMTIKLSNkZWZpbmUgRFRfSVNQX0xBU1QgICAgICAgICAgICAgICAgICAgICAoRFRfSVNQODQzMiA8PCAxKQorI2RlZmluZSBEVF9JU1A4MDAxCQkJQklUXzEzCisjZGVmaW5lIERUX0lTUF9MQVNUCQkJKERUX0lTUDgwMDEgPDwgMSkKIAogI2RlZmluZSBEVF9JSURNQSAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8yNgogI2RlZmluZSBEVF9GV0kyICAgICAgICAgICAgICAgICAgICAgICAgIEJJVF8yNwpAQCAtMjM2NCw2ICsyMzYxLDcgQEAKICNkZWZpbmUgSVNfUUxBNTQzMihoYSkgIChEVF9NQVNLKGhhKSAmIERUX0lTUDU0MzIpCiAjZGVmaW5lIElTX1FMQTI1MzIoaGEpICAoRFRfTUFTSyhoYSkgJiBEVF9JU1AyNTMyKQogI2RlZmluZSBJU19RTEE4NDMyKGhhKSAgKERUX01BU0soaGEpICYgRFRfSVNQODQzMikKKyNkZWZpbmUgSVNfUUxBODAwMShoYSkJKERUX01BU0soaGEpICYgRFRfSVNQODAwMSkKIAogI2RlZmluZSBJU19RTEEyM1hYKGhhKSAgKElTX1FMQTIzMDAoaGEpIHx8IElTX1FMQTIzMTIoaGEpIHx8IElTX1FMQTIzMjIoaGEpIHx8IFwKIAkJCUlTX1FMQTYzMTIoaGEpIHx8IElTX1FMQTYzMjIoaGEpKQpAQCAtMjM3Myw4ICsyMzcxLDExIEBACiAjZGVmaW5lIElTX1FMQTg0WFgoaGEpICAoSVNfUUxBODQzMihoYSkpCiAjZGVmaW5lIElTX1FMQTI0WFhfVFlQRShoYSkgICAgIChJU19RTEEyNFhYKGhhKSB8fCBJU19RTEE1NFhYKGhhKSB8fCBcCiAJCQkJSVNfUUxBODRYWChoYSkpCisjZGVmaW5lIElTX1FMQTgxWFgoaGEpCQkoSVNfUUxBODAwMShoYSkpCiAjZGVmaW5lIElTX1FMQTJYWFhfTUlEVFlQRShoYSkJKElTX1FMQTI0WFgoaGEpIHx8IElTX1FMQTg0WFgoaGEpIHx8IFwKLQkJCQlJU19RTEEyNVhYKGhhKSkKKwkJCQlJU19RTEEyNVhYKGhhKSB8fCBJU19RTEE4MVhYKGhhKSkKKyNkZWZpbmUgSVNfTk9QT0xMSU5HX1RZUEUoaGEpCSgoSVNfUUxBMjVYWChoYSkgfHwgSVNfUUxBODFYWChoYSkpICYmIFwKKwkJCQkoaGEpLT5mbGFncy5tc2l4X2VuYWJsZWQpCiAKICNkZWZpbmUgSVNfSUlETUFfQ0FQQUJMRShoYSkgICAgKChoYSktPmRldmljZV90eXBlICYgRFRfSUlETUEpCiAjZGVmaW5lIElTX0ZXSTJfQ0FQQUJMRShoYSkgICAgICgoaGEpLT5kZXZpY2VfdHlwZSAmIERUX0ZXSTIpCkBAIC0yNDcyLDYgKzI0NzMsOSBAQAogCXVpbnQ4X3QJCWZ3X3NlcmlhbGxpbmtfb3B0aW9uc1s0XTsKIAl1aW50MTZfdAlmd19zZXJpYWxsaW5rX29wdGlvbnMyNFs0XTsKIAorCXVpbnQ4X3QJCW1waV92ZXJzaW9uWzRdOworCXVpbnQzMl90CW1waV9jYXBhYmlsaXRpZXM7CisKIAkvKiBGaXJtd2FyZSBkdW1wIGluZm9ybWF0aW9uLiAqLwogCXN0cnVjdCBxbGEyeHh4X2Z3X2R1bXAgKmZ3X2R1bXA7CiAJdWludDMyX3QJZndfZHVtcF9sZW47CkBAIC0yNDgwLDYgKzI0ODQsNyBAQAogCWRtYV9hZGRyX3QJZWZ0X2RtYTsKIAl2b2lkCQkqZWZ0OwogCisJdWludDMyX3QJY2hhaW5fb2Zmc2V0OwogCXN0cnVjdCBkZW50cnkgKmRmc19kaXI7CiAJc3RydWN0IGRlbnRyeSAqZGZzX2ZjZTsKIAlkbWFfYWRkcl90CWZjZV9kbWE7CkBAIC0yNDg5LDEwICsyNDk0LDYgQEAKIAl1aW50NjRfdAlmY2Vfd3IsIGZjZV9yZDsKIAlzdHJ1Y3QgbXV0ZXgJZmNlX211dGV4OwogCi0JdWludDMyX3QJaHdfZXZlbnRfc3RhcnQ7Ci0JdWludDMyX3QJaHdfZXZlbnRfcHRyOwotCXVpbnQzMl90CWh3X2V2ZW50X3BhdXNlX2Vycm9yczsKLQogCXVpbnQzMl90CXBjaV9hdHRyOwogCXVpbnQxNl90CWNoaXBfcmV2aXNpb247CiAKQEAgLTI1MjIsNiArMjUyMywxMiBAQAogCXVpbnQ4X3QgCWZjb2RlX3JldmlzaW9uWzE2XTsKIAl1aW50MzJfdAlmd19yZXZpc2lvbls0XTsKIAorCS8qIE9mZnNldHMgZm9yIGZsYXNoL252cmFtIGFjY2VzcyAoc2V0IHRvIH4wIGlmIG5vdCB1c2VkKS4gKi8KKwl1aW50MzJfdAlmbGFzaF9jb25mX29mZjsKKwl1aW50MzJfdAlmbGFzaF9kYXRhX29mZjsKKwl1aW50MzJfdAludnJhbV9jb25mX29mZjsKKwl1aW50MzJfdAludnJhbV9kYXRhX29mZjsKKwogCXVpbnQzMl90CWZkdF93cnRfZGlzYWJsZTsKIAl1aW50MzJfdAlmZHRfZXJhc2VfY21kOwogCXVpbnQzMl90CWZkdF9ibG9ja19zaXplOwpAQCAtMjUzMyw3ICsyNTQwLDYgQEAKIAl1aW50MzJfdCAgICAgICAgZmx0X3JlZ2lvbl9ib290OwogCXVpbnQzMl90ICAgICAgICBmbHRfcmVnaW9uX2Z3OwogCXVpbnQzMl90ICAgICAgICBmbHRfcmVnaW9uX3ZwZF9udnJhbTsKLQl1aW50MzJfdCAgICAgICAgZmx0X3JlZ2lvbl9od19ldmVudDsKIAl1aW50MzJfdCAgICAgICAgZmx0X3JlZ2lvbl9ucGl2X2NvbmY7CiAKIAkvKiBOZWVkZWQgZm9yIEJFQUNPTiAqLwpAQCAtMjczNyw2ICsyNzQzLDcgQEAKICNkZWZpbmUgT1BUUk9NX1NJWkVfMjMyMgkweDEwMDAwMAogI2RlZmluZSBPUFRST01fU0laRV8yNFhYCTB4MTAwMDAwCiAjZGVmaW5lIE9QVFJPTV9TSVpFXzI1WFgJMHgyMDAwMDAKKyNkZWZpbmUgT1BUUk9NX1NJWkVfODFYWAkweDQwMDAwMAogCiAjaW5jbHVkZSAicWxhX2dibC5oIgogI2luY2x1ZGUgInFsYV9kYmcuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZnMuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZnMuYwppbmRleCAwZTM2NmExLi5jNjYwMzZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGZzLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2Rmcy5jCkBAIC0xMTMsNyArMTEzLDggQEAKIHFsYTJ4MDBfZGZzX3NldHVwKHNjc2lfcWxhX2hvc3RfdCAqdmhhKQogewogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwotCWlmICghSVNfUUxBMjVYWChoYSkpCisKKwlpZiAoIUlTX1FMQTI1WFgoaGEpICYmICFJU19RTEE4MVhYKGhhKSkKIAkJZ290byBvdXQ7CiAJaWYgKCFoYS0+ZmNlKQogCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9mdy5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2Z3LmgKaW5kZXggZWUxZjFlNy4uN2FiYjA0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2Z3LmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2Z3LmgKQEAgLTEyMTUsOSArMTIxNSwxMCBAQAogCiBzdHJ1Y3QgcWxhX2ZsdF9sb2NhdGlvbiB7CiAJdWludDhfdCBzaWdbNF07Ci0JdWludDMyX3Qgc3RhcnRfbG87Ci0JdWludDMyX3Qgc3RhcnRfaGk7Ci0JdWludDE2X3QgdW51c2VkOworCXVpbnQxNl90IHN0YXJ0X2xvOworCXVpbnQxNl90IHN0YXJ0X2hpOworCXVpbnQ4X3QgdmVyc2lvbjsKKwl1aW50OF90IHVudXNlZFs1XTsKIAl1aW50MTZfdCBjaGVja3N1bTsKIH07CiAKQEAgLTEzOTAsNCArMTM5MSwyOTEgQEAKIAogCXVpbnQzMl90IHJlc2VydmVkWzEyXTsKIH07CisKKy8qIDgxWFggU3VwcG9ydCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNQkFfRENCWF9TVEFSVAkJMHg4MDE2CisjZGVmaW5lIE1CQV9EQ0JYX0NPTVBMRVRFCTB4ODAzMAorI2RlZmluZSBNQkFfRkNGX0NPTkZfRVJSCTB4ODAzMQorI2RlZmluZSBNQkFfRENCWF9QQVJBTV9VUERBVEUJMHg4MDMyCisjZGVmaW5lIE1CQV9JRENfQ09NUExFVEUJMHg4MTAwCisjZGVmaW5lIE1CQV9JRENfTk9USUZZCQkweDgxMDEKKyNkZWZpbmUgTUJBX0lEQ19USU1FX0VYVAkweDgxMDIKKworc3RydWN0IG52cmFtXzgxeHggeworCS8qIE5WUkFNIGhlYWRlci4gKi8KKwl1aW50OF90IGlkWzRdOworCXVpbnQxNl90IG52cmFtX3ZlcnNpb247CisJdWludDE2X3QgcmVzZXJ2ZWRfMDsKKworCS8qIEZpcm13YXJlIEluaXRpYWxpemF0aW9uIENvbnRyb2wgQmxvY2suICovCisJdWludDE2X3QgdmVyc2lvbjsKKwl1aW50MTZfdCByZXNlcnZlZF8xOworCXVpbnQxNl90IGZyYW1lX3BheWxvYWRfc2l6ZTsKKwl1aW50MTZfdCBleGVjdXRpb25fdGhyb3R0bGU7CisJdWludDE2X3QgZXhjaGFuZ2VfY291bnQ7CisJdWludDE2X3QgcmVzZXJ2ZWRfMjsKKworCXVpbnQ4X3QgcG9ydF9uYW1lW1dXTl9TSVpFXTsKKwl1aW50OF90IG5vZGVfbmFtZVtXV05fU0laRV07CisKKwl1aW50MTZfdCBsb2dpbl9yZXRyeV9jb3VudDsKKwl1aW50MTZfdCByZXNlcnZlZF8zOworCXVpbnQxNl90IGludGVycnVwdF9kZWxheV90aW1lcjsKKwl1aW50MTZfdCBsb2dpbl90aW1lb3V0OworCisJdWludDMyX3QgZmlybXdhcmVfb3B0aW9uc18xOworCXVpbnQzMl90IGZpcm13YXJlX29wdGlvbnNfMjsKKwl1aW50MzJfdCBmaXJtd2FyZV9vcHRpb25zXzM7CisKKwl1aW50MTZfdCByZXNlcnZlZF80WzRdOworCisJLyogT2Zmc2V0IDY0LiAqLworCXVpbnQ4X3QgZW5vZGVfbWFjWzZdOworCXVpbnQxNl90IHJlc2VydmVkXzVbNV07CisKKwkvKiBPZmZzZXQgODAuICovCisJdWludDE2X3QgcmVzZXJ2ZWRfNlsyNF07CisKKwkvKiBPZmZzZXQgMTI4LiAqLworCXVpbnQxNl90IHJlc2VydmVkXzdbNjRdOworCisJLyoKKwkgKiBCSVQgMCAgPSBFbmFibGUgc3BpbnVwIGRlbGF5CisJICogQklUIDEgID0gRGlzYWJsZSBCSU9TCisJICogQklUIDIgID0gRW5hYmxlIE1lbW9yeSBNYXAgQklPUworCSAqIEJJVCAzICA9IEVuYWJsZSBTZWxlY3RhYmxlIEJvb3QKKwkgKiBCSVQgNCAgPSBEaXNhYmxlIFJJU0MgY29kZSBsb2FkCisJICogQklUIDUgID0gRGlzYWJsZSBTZXJkZXMKKwkgKiBCSVQgNiAgPSBPcHQgYm9vdCBtb2RlCisJICogQklUIDcgID0gSW50ZXJydXB0IGVuYWJsZQorCSAqCisJICogQklUIDggID0gRVYgQ29udHJvbCBlbmFibGUKKwkgKiBCSVQgOSAgPSBFbmFibGUgbGlwIHJlc2V0CisJICogQklUIDEwID0gRW5hYmxlIGxpcCBmdWxsIGxvZ2luCisJICogQklUIDExID0gRW5hYmxlIHRhcmdldCByZXNldAorCSAqIEJJVCAxMiA9IFN0b3AgZmlybXdhcmUKKwkgKiBCSVQgMTMgPSBFbmFibGUgbm9kZW5hbWUgb3B0aW9uCisJICogQklUIDE0ID0gRGVmYXVsdCBXV1BOIHZhbGlkCisJICogQklUIDE1ID0gRW5hYmxlIGFsdGVybmF0ZSBXV04KKwkgKgorCSAqIEJJVCAxNiA9IENMUCBMVU4gc3RyaW5nCisJICogQklUIDE3ID0gQ0xQIFRhcmdldCBzdHJpbmcKKwkgKiBCSVQgMTggPSBDTFAgQklPUyBlbmFibGUgc3RyaW5nCisJICogQklUIDE5ID0gQ0xQIFNlcmRlcyBzdHJpbmcKKwkgKiBCSVQgMjAgPSBDTFAgV1dQTiBzdHJpbmcKKwkgKiBCSVQgMjEgPSBDTFAgV1dOTiBzdHJpbmcKKwkgKiBCSVQgMjIgPQorCSAqIEJJVCAyMyA9CisJICogQklUIDI0ID0gS2VlcCBXV1BOCisJICogQklUIDI1ID0gVGVtcCBXV1BOCisJICogQklUIDI2LTMxID0KKwkgKi8KKwl1aW50MzJfdCBob3N0X3A7CisKKwl1aW50OF90IGFsdGVybmF0ZV9wb3J0X25hbWVbV1dOX1NJWkVdOworCXVpbnQ4X3QgYWx0ZXJuYXRlX25vZGVfbmFtZVtXV05fU0laRV07CisKKwl1aW50OF90IGJvb3RfcG9ydF9uYW1lW1dXTl9TSVpFXTsKKwl1aW50MTZfdCBib290X2x1bl9udW1iZXI7CisJdWludDE2X3QgcmVzZXJ2ZWRfODsKKworCXVpbnQ4X3QgYWx0MV9ib290X3BvcnRfbmFtZVtXV05fU0laRV07CisJdWludDE2X3QgYWx0MV9ib290X2x1bl9udW1iZXI7CisJdWludDE2X3QgcmVzZXJ2ZWRfOTsKKworCXVpbnQ4X3QgYWx0Ml9ib290X3BvcnRfbmFtZVtXV05fU0laRV07CisJdWludDE2X3QgYWx0Ml9ib290X2x1bl9udW1iZXI7CisJdWludDE2X3QgcmVzZXJ2ZWRfMTA7CisKKwl1aW50OF90IGFsdDNfYm9vdF9wb3J0X25hbWVbV1dOX1NJWkVdOworCXVpbnQxNl90IGFsdDNfYm9vdF9sdW5fbnVtYmVyOworCXVpbnQxNl90IHJlc2VydmVkXzExOworCisJLyoKKwkgKiBCSVQgMCA9IFNlbGVjdGl2ZSBMb2dpbgorCSAqIEJJVCAxID0gQWx0LUJvb3QgRW5hYmxlCisJICogQklUIDIgPSBSZXNlcnZlZAorCSAqIEJJVCAzID0gQm9vdCBPcmRlciBMaXN0CisJICogQklUIDQgPSBSZXNlcnZlZAorCSAqIEJJVCA1ID0gU2VsZWN0aXZlIExVTgorCSAqIEJJVCA2ID0gUmVzZXJ2ZWQKKwkgKiBCSVQgNy0zMSA9CisJICovCisJdWludDMyX3QgZWZpX3BhcmFtZXRlcnM7CisKKwl1aW50OF90IHJlc2V0X2RlbGF5OworCXVpbnQ4X3QgcmVzZXJ2ZWRfMTI7CisJdWludDE2X3QgcmVzZXJ2ZWRfMTM7CisKKwl1aW50MTZfdCBib290X2lkX251bWJlcjsKKwl1aW50MTZfdCByZXNlcnZlZF8xNDsKKworCXVpbnQxNl90IG1heF9sdW5zX3Blcl90YXJnZXQ7CisJdWludDE2X3QgcmVzZXJ2ZWRfMTU7CisKKwl1aW50MTZfdCBwb3J0X2Rvd25fcmV0cnlfY291bnQ7CisJdWludDE2X3QgbGlua19kb3duX3RpbWVvdXQ7CisKKwkvKiBGQ29kZSBwYXJhbWV0ZXJzLiAqLworCXVpbnQxNl90IGZjb2RlX3BhcmFtZXRlcjsKKworCXVpbnQxNl90IHJlc2VydmVkXzE2WzNdOworCisJLyogT2Zmc2V0IDM1Mi4gKi8KKwl1aW50OF90IHJlc2VydmVkXzE3WzRdOworCXVpbnQxNl90IHJlc2VydmVkXzE4WzVdOworCXVpbnQ4X3QgcmVzZXJ2ZWRfMTlbMl07CisJdWludDE2X3QgcmVzZXJ2ZWRfMjBbOF07CisKKwkvKiBPZmZzZXQgMzg0LiAqLworCXVpbnQ4X3QgcmVzZXJ2ZWRfMjFbMTZdOworCXVpbnQxNl90IHJlc2VydmVkXzIyWzhdOworCisJLyogT2Zmc2V0IDQxNi4gKi8KKwl1aW50MTZfdCByZXNlcnZlZF8yM1szMl07CisKKwkvKiBPZmZzZXQgNDgwLiAqLworCXVpbnQ4X3QgbW9kZWxfbmFtZVsxNl07CisKKwkvKiBPZmZzZXQgNDk2LiAqLworCXVpbnQxNl90IGZlYXR1cmVfbWFza19sOworCXVpbnQxNl90IGZlYXR1cmVfbWFza19oOworCXVpbnQxNl90IHJlc2VydmVkXzI0WzJdOworCisJdWludDE2X3Qgc3Vic3lzdGVtX3ZlbmRvcl9pZDsKKwl1aW50MTZfdCBzdWJzeXN0ZW1fZGV2aWNlX2lkOworCisJdWludDMyX3QgY2hlY2tzdW07Cit9OworCisvKgorICogSVNQIEluaXRpYWxpemF0aW9uIENvbnRyb2wgQmxvY2suCisgKiBMaXR0bGUgZW5kaWFuIGV4Y2VwdCB3aGVyZSBub3RlZC4KKyAqLworI2RlZmluZQlJQ0JfVkVSU0lPTiAxCitzdHJ1Y3QgaW5pdF9jYl84MXh4IHsKKwl1aW50MTZfdCB2ZXJzaW9uOworCXVpbnQxNl90IHJlc2VydmVkXzE7CisKKwl1aW50MTZfdCBmcmFtZV9wYXlsb2FkX3NpemU7CisJdWludDE2X3QgZXhlY3V0aW9uX3Rocm90dGxlOworCXVpbnQxNl90IGV4Y2hhbmdlX2NvdW50OworCisJdWludDE2X3QgcmVzZXJ2ZWRfMjsKKworCXVpbnQ4X3QgcG9ydF9uYW1lW1dXTl9TSVpFXTsJCS8qIEJpZyBlbmRpYW4uICovCisJdWludDhfdCBub2RlX25hbWVbV1dOX1NJWkVdOwkJLyogQmlnIGVuZGlhbi4gKi8KKworCXVpbnQxNl90IHJlc3BvbnNlX3FfaW5wb2ludGVyOworCXVpbnQxNl90IHJlcXVlc3RfcV9vdXRwb2ludGVyOworCisJdWludDE2X3QgbG9naW5fcmV0cnlfY291bnQ7CisKKwl1aW50MTZfdCBwcmlvX3JlcXVlc3RfcV9vdXRwb2ludGVyOworCisJdWludDE2X3QgcmVzcG9uc2VfcV9sZW5ndGg7CisJdWludDE2X3QgcmVxdWVzdF9xX2xlbmd0aDsKKworCXVpbnQxNl90IHJlc2VydmVkXzM7CisKKwl1aW50MTZfdCBwcmlvX3JlcXVlc3RfcV9sZW5ndGg7CisKKwl1aW50MzJfdCByZXF1ZXN0X3FfYWRkcmVzc1syXTsKKwl1aW50MzJfdCByZXNwb25zZV9xX2FkZHJlc3NbMl07CisJdWludDMyX3QgcHJpb19yZXF1ZXN0X3FfYWRkcmVzc1syXTsKKworCXVpbnQ4X3QgcmVzZXJ2ZWRfNFs4XTsKKworCXVpbnQxNl90IGF0aW9fcV9pbnBvaW50ZXI7CisJdWludDE2X3QgYXRpb19xX2xlbmd0aDsKKwl1aW50MzJfdCBhdGlvX3FfYWRkcmVzc1syXTsKKworCXVpbnQxNl90IGludGVycnVwdF9kZWxheV90aW1lcjsJCS8qIDEwMHVzIGluY3JlbWVudHMuICovCisJdWludDE2X3QgbG9naW5fdGltZW91dDsKKworCS8qCisJICogQklUIDAtMyA9IFJlc2VydmVkCisJICogQklUIDQgID0gRW5hYmxlIFRhcmdldCBNb2RlCisJICogQklUIDUgID0gRGlzYWJsZSBJbml0aWF0b3IgTW9kZQorCSAqIEJJVCA2ICA9IFJlc2VydmVkCisJICogQklUIDcgID0gUmVzZXJ2ZWQKKwkgKgorCSAqIEJJVCA4LTEzID0gUmVzZXJ2ZWQKKwkgKiBCSVQgMTQgPSBOb2RlIE5hbWUgT3B0aW9uCisJICogQklUIDE1LTMxID0gUmVzZXJ2ZWQKKwkgKi8KKwl1aW50MzJfdCBmaXJtd2FyZV9vcHRpb25zXzE7CisKKwkvKgorCSAqIEJJVCAwICA9IE9wZXJhdGlvbiBNb2RlIGJpdCAwCisJICogQklUIDEgID0gT3BlcmF0aW9uIE1vZGUgYml0IDEKKwkgKiBCSVQgMiAgPSBPcGVyYXRpb24gTW9kZSBiaXQgMgorCSAqIEJJVCAzICA9IE9wZXJhdGlvbiBNb2RlIGJpdCAzCisJICogQklUIDQtNyA9IFJlc2VydmVkCisJICoKKwkgKiBCSVQgOCAgPSBFbmFibGUgQ2xhc3MgMgorCSAqIEJJVCA5ICA9IEVuYWJsZSBBQ0swCisJICogQklUIDEwID0gUmVzZXJ2ZWQKKwkgKiBCSVQgMTEgPSBFbmFibGUgRkMtU1AgU2VjdXJpdHkKKwkgKiBCSVQgMTIgPSBGQyBUYXBlIEVuYWJsZQorCSAqIEJJVCAxMyA9IFJlc2VydmVkCisJICogQklUIDE0ID0gRW5hYmxlIFRhcmdldCBQUkxJIENvbnRyb2wKKwkgKiBCSVQgMTUtMzEgPSBSZXNlcnZlZAorCSAqLworCXVpbnQzMl90IGZpcm13YXJlX29wdGlvbnNfMjsKKworCS8qCisJICogQklUIDAtMyA9IFJlc2VydmVkCisJICogQklUIDQgID0gRkNQIFJTUCBQYXlsb2FkIGJpdCAwCisJICogQklUIDUgID0gRkNQIFJTUCBQYXlsb2FkIGJpdCAxCisJICogQklUIDYgID0gRW5hYmxlIFJlY2VpdmUgT3V0LW9mLU9yZGVyIGRhdGEgZnJhbWUgaGFuZGxpbmcKKwkgKiBCSVQgNyAgPSBSZXNlcnZlZAorCSAqCisJICogQklUIDggID0gUmVzZXJ2ZWQKKwkgKiBCSVQgOSAgPSBFbmFibGUgT3V0LW9mLU9yZGVyIEZDUF9YRkVSX1JEWSByZWxhdGl2ZSBvZmZzZXQgaGFuZGxpbmcKKwkgKiBCSVQgMTAtMTYgPSBSZXNlcnZlZAorCSAqIEJJVCAxNyA9IEVuYWJsZSBtdWx0aXBsZSBGQ0ZzCisJICogQklUIDE4LTIwID0gTUFDIGFkZHJlc3NpbmcgbW9kZQorCSAqIEJJVCAyMS0yNSA9IEV0aGVybmV0IGRhdGEgcmF0ZQorCSAqIEJJVCAyNiA9IEVuYWJsZSBldGhlcm5ldCBoZWFkZXIgcnggSU9DQiBmb3IgQVRJTyBxCisJICogQklUIDI3ID0gRW5hYmxlIGV0aGVybmV0IGhlYWRlciByeCBJT0NCIGZvciByZXNwb25zZSBxCisJICogQklUIDI4ID0gU1BNQSBzZWxlY3Rpb24gYml0IDAKKwkgKiBCSVQgMjggPSBTUE1BIHNlbGVjdGlvbiBiaXQgMQorCSAqIEJJVCAzMC0zMSA9IFJlc2VydmVkCisJICovCisJdWludDMyX3QgZmlybXdhcmVfb3B0aW9uc18zOworCisJdWludDhfdCAgcmVzZXJ2ZWRfNVs4XTsKKworCXVpbnQ4X3QgZW5vZGVfbWFjWzZdOworCisJdWludDhfdCByZXNlcnZlZF82WzEwXTsKK307CisKK3N0cnVjdCBtaWRfaW5pdF9jYl84MXh4IHsKKwlzdHJ1Y3QgaW5pdF9jYl84MXh4IGluaXRfY2I7CisKKwl1aW50MTZfdCBjb3VudDsKKwl1aW50MTZfdCBvcHRpb25zOworCisJc3RydWN0IG1pZF9jb25mX2VudHJ5XzI0eHggZW50cmllc1tNQVhfTVVMVElfSURfRkFCUklDXTsKK307CisKKyNkZWZpbmUgRkFSWF9BQ0NFU1NfRkxBU0hfQ09ORl84MVhYCTB4N0ZGRDAwMDAKKyNkZWZpbmUgRkFSWF9BQ0NFU1NfRkxBU0hfREFUQV84MVhYCTB4N0Y4MDAwMDAKKworLyogODFYWCBGbGFzaCBsb2NhdGlvbnMgLS0gb2NjdXBpZXMgc2Vjb25kIDJNQiByZWdpb24uICovCisjZGVmaW5lIEZBX0JPT1RfQ09ERV9BRERSXzgxCTB4ODAwMDAKKyNkZWZpbmUgRkFfUklTQ19DT0RFX0FERFJfODEJMHhBMDAwMAorI2RlZmluZSBGQV9GV19BUkVBX0FERFJfODEJMHhDMDAwMAorI2RlZmluZSBGQV9WUERfTlZSQU1fQUREUl84MQkweEQwMDAwCisjZGVmaW5lIEZBX0ZFQVRVUkVfQUREUl84MQkweEQ0MDAwCisjZGVmaW5lIEZBX0ZMQVNIX0RFU0NSX0FERFJfODEJMHhEODAwMAorI2RlZmluZSBGQV9GTEFTSF9MQVlPVVRfQUREUl84MQkweEQ4NDAwCisjZGVmaW5lIEZBX0hXX0VWRU5UMF9BRERSXzgxCTB4REMwMDAKKyNkZWZpbmUgRkFfSFdfRVZFTlQxX0FERFJfODEJMHhEQzQwMAorI2RlZmluZSBGQV9OUElWX0NPTkYwX0FERFJfODEJMHhEMTAwMAorI2RlZmluZSBGQV9OUElWX0NPTkYxX0FERFJfODEJMHhEMjAwMAorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9nYmwuaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9nYmwuaAppbmRleCAwMDExZTMxLi5iYTQ5MTMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ2JsLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dibC5oCkBAIC0yOCw4ICsyOCwxMCBAQAogZXh0ZXJuIHZvaWQgcWxhMjR4eF9yZXNldF9hZGFwdGVyKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopOwogZXh0ZXJuIGludCBxbGEyeDAwX252cmFtX2NvbmZpZyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKTsKIGV4dGVybiBpbnQgcWxhMjR4eF9udnJhbV9jb25maWcoc3RydWN0IHNjc2lfcWxhX2hvc3QgKik7CitleHRlcm4gaW50IHFsYTgxeHhfbnZyYW1fY29uZmlnKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopOwogZXh0ZXJuIHZvaWQgcWxhMngwMF91cGRhdGVfZndfb3B0aW9ucyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKTsKIGV4dGVybiB2b2lkIHFsYTI0eHhfdXBkYXRlX2Z3X29wdGlvbnMoc2NzaV9xbGFfaG9zdF90ICopOworZXh0ZXJuIHZvaWQgcWxhODF4eF91cGRhdGVfZndfb3B0aW9ucyhzY3NpX3FsYV9ob3N0X3QgKik7CiBleHRlcm4gaW50IHFsYTJ4MDBfbG9hZF9yaXNjKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosIHVpbnQzMl90ICopOwogZXh0ZXJuIGludCBxbGEyNHh4X2xvYWRfcmlzYyhzY3NpX3FsYV9ob3N0X3QgKiwgdWludDMyX3QgKik7CiAKQEAgLTY5LDggKzcxLDYgQEAKIGV4dGVybiB2b2lkIHFsYTJ4MDBfYWJvcnRfYWxsX2NtZHMoc2NzaV9xbGFfaG9zdF90ICosIGludCk7CiBleHRlcm4gaW50IHFsYTJ4MDBfcG9zdF9hZW5fd29yayhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqLCBlbnVtCiAgICAgZmNfaG9zdF9ldmVudF9jb2RlLCB1MzIpOwotZXh0ZXJuIGludCBxbGEyeDAwX3Bvc3RfaHdlX3dvcmsoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiwgdWludDE2X3QgLCB1aW50MTZfdCwKLSAgICB1aW50MTZfdCwgdWludDE2X3QpOwogCiBleHRlcm4gdm9pZCBxbGEyeDAwX2Fib3J0X2ZjcG9ydF9jbWRzKGZjX3BvcnRfdCAqKTsKIGV4dGVybiBzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqcWxhMngwMF9jcmVhdGVfaG9zdChzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICosCkBAIC0xNDMsNyArMTQzLDcgQEAKIAogZXh0ZXJuIHZvaWQKIHFsYTJ4MDBfZ2V0X2Z3X3ZlcnNpb24oc2NzaV9xbGFfaG9zdF90ICosIHVpbnQxNl90ICosCi0gICAgdWludDE2X3QgKiwgdWludDE2X3QgKiwgdWludDE2X3QgKiwgdWludDMyX3QgKik7CisgICAgdWludDE2X3QgKiwgdWludDE2X3QgKiwgdWludDE2X3QgKiwgdWludDMyX3QgKiwgdWludDhfdCAqLCB1aW50MzJfdCAqKTsKIAogZXh0ZXJuIGludAogcWxhMngwMF9nZXRfZndfb3B0aW9ucyhzY3NpX3FsYV9ob3N0X3QgKiwgdWludDE2X3QgKik7CkBAIC0zMTcsOSArMzE3LDYgQEAKIGV4dGVybiBpbnQgcWxhMngwMF9nZXRfZmxhc2hfdmVyc2lvbihzY3NpX3FsYV9ob3N0X3QgKiwgdm9pZCAqKTsKIGV4dGVybiBpbnQgcWxhMjR4eF9nZXRfZmxhc2hfdmVyc2lvbihzY3NpX3FsYV9ob3N0X3QgKiwgdm9pZCAqKTsKIAotZXh0ZXJuIGludCBxbGEyeHh4X2h3X2V2ZW50X2xvZyhzY3NpX3FsYV9ob3N0X3QgKiwgdWludDE2X3QgLCB1aW50MTZfdCwKLSAgICB1aW50MTZfdCwgdWludDE2X3QpOwotCiBleHRlcm4gaW50IHFsYTJ4eHhfZ2V0X2ZsYXNoX2luZm8oc2NzaV9xbGFfaG9zdF90ICopOwogZXh0ZXJuIGludCBxbGEyeHh4X2dldF92cGRfZmllbGQoc2NzaV9xbGFfaG9zdF90ICosIGNoYXIgKiwgY2hhciAqLCBzaXplX3QpOwogCkBAIC0zMzIsNiArMzI5LDcgQEAKIGV4dGVybiB2b2lkIHFsYTIzMDBfZndfZHVtcChzY3NpX3FsYV9ob3N0X3QgKiwgaW50KTsKIGV4dGVybiB2b2lkIHFsYTI0eHhfZndfZHVtcChzY3NpX3FsYV9ob3N0X3QgKiwgaW50KTsKIGV4dGVybiB2b2lkIHFsYTI1eHhfZndfZHVtcChzY3NpX3FsYV9ob3N0X3QgKiwgaW50KTsKK2V4dGVybiB2b2lkIHFsYTgxeHhfZndfZHVtcChzY3NpX3FsYV9ob3N0X3QgKiwgaW50KTsKIGV4dGVybiB2b2lkIHFsYTJ4MDBfZHVtcF9yZWdzKHNjc2lfcWxhX2hvc3RfdCAqKTsKIGV4dGVybiB2b2lkIHFsYTJ4MDBfZHVtcF9idWZmZXIodWludDhfdCAqLCB1aW50MzJfdCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ncy5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dzLmMKaW5kZXggMGE2ZjcyOTcuLjU1N2Y1OGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ncy5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ncy5jCkBAIC0xNTM1LDcgKzE1MzUsMTAgQEAKIAllaXRlciA9IChzdHJ1Y3QgY3RfZmRtaV9wb3J0X2F0dHIgKikgKGVudHJpZXMgKyBzaXplKTsKIAllaXRlci0+dHlwZSA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMTYoRkRNSV9QT1JUX1NVUFBPUlRfU1BFRUQpOwogCWVpdGVyLT5sZW4gPSBfX2NvbnN0YW50X2NwdV90b19iZTE2KDQgKyA0KTsKLQlpZiAoSVNfUUxBMjVYWChoYSkpCisJaWYgKElTX1FMQTgxWFgoaGEpKQorCQllaXRlci0+YS5zdXBfc3BlZWQgPSBfX2NvbnN0YW50X2NwdV90b19iZTMyKAorCQkgICAgRkRNSV9QT1JUX1NQRUVEXzEwR0IpOworCWVsc2UgaWYgKElTX1FMQTI1WFgoaGEpKQogCQllaXRlci0+YS5zdXBfc3BlZWQgPSBfX2NvbnN0YW50X2NwdV90b19iZTMyKAogCQkgICAgRkRNSV9QT1JUX1NQRUVEXzFHQnxGRE1JX1BPUlRfU1BFRURfMkdCfAogCQkgICAgRkRNSV9QT1JUX1NQRUVEXzRHQnxGRE1JX1BPUlRfU1BFRURfOEdCKTsKQEAgLTE1NzUsNiArMTU3OCwxMCBAQAogCQllaXRlci0+YS5jdXJfc3BlZWQgPQogCQkgICAgX19jb25zdGFudF9jcHVfdG9fYmUzMihGRE1JX1BPUlRfU1BFRURfOEdCKTsKIAkJYnJlYWs7CisJY2FzZSBQT1JUX1NQRUVEXzEwR0I6CisJCWVpdGVyLT5hLmN1cl9zcGVlZCA9CisJCSAgICBfX2NvbnN0YW50X2NwdV90b19iZTMyKEZETUlfUE9SVF9TUEVFRF8xMEdCKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZWl0ZXItPmEuY3VyX3NwZWVkID0KIAkJICAgIF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoRkRNSV9QT1JUX1NQRUVEX1VOS05PV04pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2luaXQuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbml0LmMKaW5kZXggNTJlZDU2ZS4uMmQ0ZjMyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2luaXQuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5pdC5jCkBAIC01NTIsMTAgKzU1Miw2IEBACiAJCWQyID0gUkRfUkVHX0RXT1JEKCZyZWctPmN0cmxfc3RhdHVzKTsKIAkJYmFycmllcigpOwogCX0KLQlpZiAoY250ID09IDAgfHwgaHdfZXZ0KQotCQlxbGEyeHh4X2h3X2V2ZW50X2xvZyh2aGEsIEhXX0VWRU5UX1JFU0VUX0VSUiwKLQkJICAgIFJEX1JFR19XT1JEKCZyZWctPm1haWxib3gxKSwgUkRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDIpLAotCQkgICAgUkRfUkVHX1dPUkQoJnJlZy0+bWFpbGJveDMpKTsKIAogCVdSVF9SRUdfRFdPUkQoJnJlZy0+aGNjciwgSENDUlhfU0VUX1JJU0NfUkVTRVQpOwogCVJEX1JFR19EV09SRCgmcmVnLT5oY2NyKTsKQEAgLTU3NCw2ICs1NzAsOSBAQAogCX0KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisKKwlpZiAoSVNfTk9QT0xMSU5HX1RZUEUoaGEpKQorCQloYS0+aXNwX29wcy0+ZW5hYmxlX2ludHJzKGhhKTsKIH0KIAogLyoqCkBAIC03NzksMTYgKzc3OCwxOSBAQAogCQltZW1fc2l6ZSA9IChoYS0+ZndfbWVtb3J5X3NpemUgLSAweDExMDAwICsgMSkgKgogCQkgICAgc2l6ZW9mKHVpbnQxNl90KTsKIAl9IGVsc2UgaWYgKElTX0ZXSTJfQ0FQQUJMRShoYSkpIHsKLQkJZml4ZWRfc2l6ZSA9IElTX1FMQTI1WFgoaGEpID8KLQkJCW9mZnNldG9mKHN0cnVjdCBxbGEyNXh4X2Z3X2R1bXAsIGV4dF9tZW0pIDoKLQkJCW9mZnNldG9mKHN0cnVjdCBxbGEyNHh4X2Z3X2R1bXAsIGV4dF9tZW0pOworCQlpZiAoSVNfUUxBODFYWChoYSkpCisJCQlmaXhlZF9zaXplID0gb2Zmc2V0b2Yoc3RydWN0IHFsYTgxeHhfZndfZHVtcCwgZXh0X21lbSk7CisJCWVsc2UgaWYgKElTX1FMQTI1WFgoaGEpKQorCQkJZml4ZWRfc2l6ZSA9IG9mZnNldG9mKHN0cnVjdCBxbGEyNXh4X2Z3X2R1bXAsIGV4dF9tZW0pOworCQllbHNlCisJCQlmaXhlZF9zaXplID0gb2Zmc2V0b2Yoc3RydWN0IHFsYTI0eHhfZndfZHVtcCwgZXh0X21lbSk7CiAJCW1lbV9zaXplID0gKGhhLT5md19tZW1vcnlfc2l6ZSAtIDB4MTAwMDAwICsgMSkgKgogCQkgICAgc2l6ZW9mKHVpbnQzMl90KTsKIAkJaWYgKGhhLT5tcWVuYWJsZSkKIAkJCW1xX3NpemUgPSBzaXplb2Yoc3RydWN0IHFsYTJ4eHhfbXFfY2hhaW4pOwogCiAJCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgRmlicmUgQ2hhbm5lbCBFdmVudCBCdWZmZXIuICovCi0JCWlmICghSVNfUUxBMjVYWChoYSkpCisJCWlmICghSVNfUUxBMjVYWChoYSkgJiYgIUlTX1FMQTgxWFgoaGEpKQogCQkJZ290byB0cnlfZWZ0OwogCiAJCXRjID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBGQ0VfU0laRSwgJnRjX2RtYSwKQEAgLTg1MSw3ICs4NTMsOSBAQAogCiAJZHVtcF9zaXplID0gb2Zmc2V0b2Yoc3RydWN0IHFsYTJ4eHhfZndfZHVtcCwgaXNwKTsKIAlkdW1wX3NpemUgKz0gZml4ZWRfc2l6ZSArIG1lbV9zaXplICsgcmVxX3Ffc2l6ZSArIHJzcF9xX3NpemUgKwotCSAgICBtcV9zaXplICsgZWZ0X3NpemUgKyBmY2Vfc2l6ZTsKKwkgICAgZWZ0X3NpemU7CisJaGEtPmNoYWluX29mZnNldCA9IGR1bXBfc2l6ZTsKKwlkdW1wX3NpemUgKz0gbXFfc2l6ZSArIGZjZV9zaXplOwogCiAJaGEtPmZ3X2R1bXAgPSB2bWFsbG9jKGR1bXBfc2l6ZSk7CiAJaWYgKCFoYS0+ZndfZHVtcCkgewpAQCAtOTg3LDcgKzk5MSw4IEBACiAJCQkJICAgICZoYS0+ZndfbWFqb3JfdmVyc2lvbiwKIAkJCQkgICAgJmhhLT5md19taW5vcl92ZXJzaW9uLAogCQkJCSAgICAmaGEtPmZ3X3N1Ym1pbm9yX3ZlcnNpb24sCi0JCQkJICAgICZoYS0+ZndfYXR0cmlidXRlcywgJmhhLT5md19tZW1vcnlfc2l6ZSk7CisJCQkJICAgICZoYS0+ZndfYXR0cmlidXRlcywgJmhhLT5md19tZW1vcnlfc2l6ZSwKKwkJCQkgICAgaGEtPm1waV92ZXJzaW9uLCAmaGEtPm1waV9jYXBhYmlsaXRpZXMpOwogCQkJCWhhLT5mbGFncy5ucGl2X3N1cHBvcnRlZCA9IDA7CiAJCQkJaWYgKElTX1FMQTJYWFhfTUlEVFlQRShoYSkgJiYKIAkJCQkJIChoYS0+ZndfYXR0cmlidXRlcyAmIEJJVF8yKSkgewpAQCAtMTY2NSwxMCArMTY3MCw2IEBACiAJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIkZhbGxpbmcgYmFjayB0byBmdW5jdGlvbmluZyAoeWV0ICIKIAkJICAgICJpbnZhbGlkIC0tIFdXUE4pIGRlZmF1bHRzLlxuIik7CiAKLQkJaWYgKGNoa3N1bSkKLQkJCXFsYTJ4eHhfaHdfZXZlbnRfbG9nKHZoYSwgSFdfRVZFTlRfTlZSQU1fQ0hLU1VNX0VSUiwgMCwKLQkJCSAgICBNU1coY2hrc3VtKSwgTFNXKGNoa3N1bSkpOwotCiAJCS8qCiAJCSAqIFNldCBkZWZhdWx0IGluaXRpYWxpemF0aW9uIGNvbnRyb2wgYmxvY2suCiAJCSAqLwpAQCAtNDI1NSwzICs0MjU2LDI2OSBAQAogCXJldHVybiBydmFsICE9IFFMQV9TVUNDRVNTIHx8IHN0YXR1c1swXSA/IFFMQV9GVU5DVElPTl9GQUlMRUQ6CiAJICAgIFFMQV9TVUNDRVNTOwogfQorCisvKiA4MVhYIFN1cHBvcnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludAorcWxhODF4eF9udnJhbV9jb25maWcoc2NzaV9xbGFfaG9zdF90ICp2aGEpCit7CisJaW50ICAgcnZhbDsKKwlzdHJ1Y3QgaW5pdF9jYl84MXh4ICppY2I7CisJc3RydWN0IG52cmFtXzgxeHggKm52OworCXVpbnQzMl90ICpkcHRyOworCXVpbnQ4X3QgICpkcHRyMSwgKmRwdHIyOworCXVpbnQzMl90IGNoa3N1bTsKKwl1aW50MTZfdCBjbnQ7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisKKwlydmFsID0gUUxBX1NVQ0NFU1M7CisJaWNiID0gKHN0cnVjdCBpbml0X2NiXzgxeHggKiloYS0+aW5pdF9jYjsKKwludiA9IGhhLT5udnJhbTsKKworCS8qIERldGVybWluZSBOVlJBTSBzdGFydGluZyBhZGRyZXNzLiAqLworCWhhLT5udnJhbV9zaXplID0gc2l6ZW9mKHN0cnVjdCBudnJhbV84MXh4KTsKKwloYS0+bnZyYW1fYmFzZSA9IEZBX05WUkFNX0ZVTkMwX0FERFI7CisJaGEtPnZwZF9zaXplID0gRkFfTlZSQU1fVlBEX1NJWkU7CisJaGEtPnZwZF9iYXNlID0gRkFfTlZSQU1fVlBEMF9BRERSOworCWlmIChQQ0lfRlVOQyhoYS0+cGRldi0+ZGV2Zm4pICYgMSkgeworCQloYS0+bnZyYW1fYmFzZSA9IEZBX05WUkFNX0ZVTkMxX0FERFI7CisJCWhhLT52cGRfYmFzZSA9IEZBX05WUkFNX1ZQRDFfQUREUjsKKwl9CisKKwkvKiBHZXQgVlBEIGRhdGEgaW50byBjYWNoZSAqLworCWhhLT52cGQgPSBoYS0+bnZyYW0gKyBWUERfT0ZGU0VUOworCWhhLT5pc3Bfb3BzLT5yZWFkX252cmFtKHZoYSwgKHVpbnQ4X3QgKiloYS0+dnBkLAorCSAgICBoYS0+bnZyYW1fYmFzZSAtIEZBX05WUkFNX0ZVTkMwX0FERFIsIEZBX05WUkFNX1ZQRF9TSVpFICogNCk7CisKKwkvKiBHZXQgTlZSQU0gZGF0YSBpbnRvIGNhY2hlIGFuZCBjYWxjdWxhdGUgY2hlY2tzdW0uICovCisJZHB0ciA9ICh1aW50MzJfdCAqKW52OworCWhhLT5pc3Bfb3BzLT5yZWFkX252cmFtKHZoYSwgKHVpbnQ4X3QgKilkcHRyLCBoYS0+bnZyYW1fYmFzZSwKKwkgICAgaGEtPm52cmFtX3NpemUpOworCWZvciAoY250ID0gMCwgY2hrc3VtID0gMDsgY250IDwgaGEtPm52cmFtX3NpemUgPj4gMjsgY250KyspCisJCWNoa3N1bSArPSBsZTMyX3RvX2NwdSgqZHB0cisrKTsKKworCURFQlVHNShwcmludGsoInNjc2koJWxkKTogQ29udGVudHMgb2YgTlZSQU1cbiIsIGhhLT5ob3N0X25vKSk7CisJREVCVUc1KHFsYTJ4MDBfZHVtcF9idWZmZXIoKHVpbnQ4X3QgKiludiwgaGEtPm52cmFtX3NpemUpKTsKKworCS8qIEJhZCBOVlJBTSBkYXRhLCBzZXQgZGVmYXVsdHMgcGFyYW1ldGVycy4gKi8KKwlpZiAoY2hrc3VtIHx8IG52LT5pZFswXSAhPSAnSScgfHwgbnYtPmlkWzFdICE9ICdTJyB8fCBudi0+aWRbMl0gIT0gJ1AnCisJICAgIHx8IG52LT5pZFszXSAhPSAnICcgfHwKKwkgICAgbnYtPm52cmFtX3ZlcnNpb24gPCBfX2NvbnN0YW50X2NwdV90b19sZTE2KElDQl9WRVJTSU9OKSkgeworCQkvKiBSZXNldCBOVlJBTSBkYXRhLiAqLworCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJJbmNvbnNpc3RlbnQgTlZSQU0gZGV0ZWN0ZWQ6ICIKKwkJICAgICJjaGVja3N1bT0weCV4IGlkPSVjIHZlcnNpb249MHgleC5cbiIsIGNoa3N1bSwgbnYtPmlkWzBdLAorCQkgICAgbGUxNl90b19jcHUobnYtPm52cmFtX3ZlcnNpb24pKTsKKwkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiRmFsbGluZyBiYWNrIHRvIGZ1bmN0aW9uaW5nICh5ZXQgIgorCQkgICAgImludmFsaWQgLS0gV1dQTikgZGVmYXVsdHMuXG4iKTsKKworCQkvKgorCQkgKiBTZXQgZGVmYXVsdCBpbml0aWFsaXphdGlvbiBjb250cm9sIGJsb2NrLgorCQkgKi8KKwkJbWVtc2V0KG52LCAwLCBoYS0+bnZyYW1fc2l6ZSk7CisJCW52LT5udnJhbV92ZXJzaW9uID0gX19jb25zdGFudF9jcHVfdG9fbGUxNihJQ0JfVkVSU0lPTik7CisJCW52LT52ZXJzaW9uID0gX19jb25zdGFudF9jcHVfdG9fbGUxNihJQ0JfVkVSU0lPTik7CisJCW52LT5mcmFtZV9wYXlsb2FkX3NpemUgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDIwNDgpOworCQludi0+ZXhlY3V0aW9uX3Rocm90dGxlID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigweEZGRkYpOworCQludi0+ZXhjaGFuZ2VfY291bnQgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDApOworCQludi0+cG9ydF9uYW1lWzBdID0gMHgyMTsKKwkJbnYtPnBvcnRfbmFtZVsxXSA9IDB4MDAgKyBQQ0lfRlVOQyhoYS0+cGRldi0+ZGV2Zm4pOworCQludi0+cG9ydF9uYW1lWzJdID0gMHgwMDsKKwkJbnYtPnBvcnRfbmFtZVszXSA9IDB4ZTA7CisJCW52LT5wb3J0X25hbWVbNF0gPSAweDhiOworCQludi0+cG9ydF9uYW1lWzVdID0gMHgxYzsKKwkJbnYtPnBvcnRfbmFtZVs2XSA9IDB4NTU7CisJCW52LT5wb3J0X25hbWVbN10gPSAweDg2OworCQludi0+bm9kZV9uYW1lWzBdID0gMHgyMDsKKwkJbnYtPm5vZGVfbmFtZVsxXSA9IDB4MDA7CisJCW52LT5ub2RlX25hbWVbMl0gPSAweDAwOworCQludi0+bm9kZV9uYW1lWzNdID0gMHhlMDsKKwkJbnYtPm5vZGVfbmFtZVs0XSA9IDB4OGI7CisJCW52LT5ub2RlX25hbWVbNV0gPSAweDFjOworCQludi0+bm9kZV9uYW1lWzZdID0gMHg1NTsKKwkJbnYtPm5vZGVfbmFtZVs3XSA9IDB4ODY7CisJCW52LT5sb2dpbl9yZXRyeV9jb3VudCA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoOCk7CisJCW52LT5pbnRlcnJ1cHRfZGVsYXlfdGltZXIgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDApOworCQludi0+bG9naW5fdGltZW91dCA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMCk7CisJCW52LT5maXJtd2FyZV9vcHRpb25zXzEgPQorCQkgICAgX19jb25zdGFudF9jcHVfdG9fbGUzMihCSVRfMTR8QklUXzEzfEJJVF8yfEJJVF8xKTsKKwkJbnYtPmZpcm13YXJlX29wdGlvbnNfMiA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMiA8PCA0KTsKKwkJbnYtPmZpcm13YXJlX29wdGlvbnNfMiB8PSBfX2NvbnN0YW50X2NwdV90b19sZTMyKEJJVF8xMik7CisJCW52LT5maXJtd2FyZV9vcHRpb25zXzMgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyKDIgPDwgMTMpOworCQludi0+aG9zdF9wID0gX19jb25zdGFudF9jcHVfdG9fbGUzMihCSVRfMTF8QklUXzEwKTsKKwkJbnYtPmVmaV9wYXJhbWV0ZXJzID0gX19jb25zdGFudF9jcHVfdG9fbGUzMigwKTsKKwkJbnYtPnJlc2V0X2RlbGF5ID0gNTsKKwkJbnYtPm1heF9sdW5zX3Blcl90YXJnZXQgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDEyOCk7CisJCW52LT5wb3J0X2Rvd25fcmV0cnlfY291bnQgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDMwKTsKKwkJbnYtPmxpbmtfZG93bl90aW1lb3V0ID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigzMCk7CisJCW52LT5lbm9kZV9tYWNbMF0gPSAweDAxOworCQludi0+ZW5vZGVfbWFjWzFdID0gMHgwMjsKKwkJbnYtPmVub2RlX21hY1syXSA9IDB4MDM7CisJCW52LT5lbm9kZV9tYWNbM10gPSAweDA0OworCQludi0+ZW5vZGVfbWFjWzRdID0gMHgwNTsKKwkJbnYtPmVub2RlX21hY1s1XSA9IDB4MDYgKyBQQ0lfRlVOQyhoYS0+cGRldi0+ZGV2Zm4pOworCisJCXJ2YWwgPSAxOworCX0KKworCS8qIFJlc2V0IEluaXRpYWxpemF0aW9uIGNvbnRyb2wgYmxvY2sgKi8KKwltZW1zZXQoaWNiLCAwLCBzaXplb2Yoc3RydWN0IGluaXRfY2JfODF4eCkpOworCisJLyogQ29weSAxc3Qgc2VnbWVudC4gKi8KKwlkcHRyMSA9ICh1aW50OF90ICopaWNiOworCWRwdHIyID0gKHVpbnQ4X3QgKikmbnYtPnZlcnNpb247CisJY250ID0gKHVpbnQ4X3QgKikmaWNiLT5yZXNwb25zZV9xX2lucG9pbnRlciAtICh1aW50OF90ICopJmljYi0+dmVyc2lvbjsKKwl3aGlsZSAoY250LS0pCisJCSpkcHRyMSsrID0gKmRwdHIyKys7CisKKwlpY2ItPmxvZ2luX3JldHJ5X2NvdW50ID0gbnYtPmxvZ2luX3JldHJ5X2NvdW50OworCisJLyogQ29weSAybmQgc2VnbWVudC4gKi8KKwlkcHRyMSA9ICh1aW50OF90ICopJmljYi0+aW50ZXJydXB0X2RlbGF5X3RpbWVyOworCWRwdHIyID0gKHVpbnQ4X3QgKikmbnYtPmludGVycnVwdF9kZWxheV90aW1lcjsKKwljbnQgPSAodWludDhfdCAqKSZpY2ItPnJlc2VydmVkXzUgLQorCSAgICAodWludDhfdCAqKSZpY2ItPmludGVycnVwdF9kZWxheV90aW1lcjsKKwl3aGlsZSAoY250LS0pCisJCSpkcHRyMSsrID0gKmRwdHIyKys7CisKKwltZW1jcHkoaWNiLT5lbm9kZV9tYWMsIG52LT5lbm9kZV9tYWMsIHNpemVvZihpY2ItPmVub2RlX21hYykpOworCS8qIFNvbWUgYm9hcmRzICh3aXRoIHZhbGlkIE5WUkFNcykgc3RpbGwgaGF2ZSBOVUxMIGVub2RlX21hYyEhICovCisJaWYgKCFtZW1jbXAoaWNiLT5lbm9kZV9tYWMsICJcMFwwXDBcMFwwXDAiLCBzaXplb2YoaWNiLT5lbm9kZV9tYWMpKSkgeworCQlpY2ItPmVub2RlX21hY1swXSA9IDB4MDE7CisJCWljYi0+ZW5vZGVfbWFjWzFdID0gMHgwMjsKKwkJaWNiLT5lbm9kZV9tYWNbMl0gPSAweDAzOworCQlpY2ItPmVub2RlX21hY1szXSA9IDB4MDQ7CisJCWljYi0+ZW5vZGVfbWFjWzRdID0gMHgwNTsKKwkJaWNiLT5lbm9kZV9tYWNbNV0gPSAweDA2ICsgUENJX0ZVTkMoaGEtPnBkZXYtPmRldmZuKTsKKwl9CisKKwkvKgorCSAqIFNldHVwIGRyaXZlciBOVlJBTSBvcHRpb25zLgorCSAqLworCXFsYTJ4MDBfc2V0X21vZGVsX2luZm8odmhhLCBudi0+bW9kZWxfbmFtZSwgc2l6ZW9mKG52LT5tb2RlbF9uYW1lKSwKKwkgICAgIlFMRTgxWFgiKTsKKworCS8qIFVzZSBhbHRlcm5hdGUgV1dOPyAqLworCWlmIChudi0+aG9zdF9wICYgX19jb25zdGFudF9jcHVfdG9fbGUzMihCSVRfMTUpKSB7CisJCW1lbWNweShpY2ItPm5vZGVfbmFtZSwgbnYtPmFsdGVybmF0ZV9ub2RlX25hbWUsIFdXTl9TSVpFKTsKKwkJbWVtY3B5KGljYi0+cG9ydF9uYW1lLCBudi0+YWx0ZXJuYXRlX3BvcnRfbmFtZSwgV1dOX1NJWkUpOworCX0KKworCS8qIFByZXBhcmUgbm9kZW5hbWUgKi8KKwlpZiAoKGljYi0+ZmlybXdhcmVfb3B0aW9uc18xICYgX19jb25zdGFudF9jcHVfdG9fbGUzMihCSVRfMTQpKSA9PSAwKSB7CisJCS8qCisJCSAqIEZpcm13YXJlIHdpbGwgYXBwbHkgdGhlIGZvbGxvd2luZyBtYXNrIGlmIHRoZSBub2RlbmFtZSB3YXMKKwkJICogbm90IHByb3ZpZGVkLgorCQkgKi8KKwkJbWVtY3B5KGljYi0+bm9kZV9uYW1lLCBpY2ItPnBvcnRfbmFtZSwgV1dOX1NJWkUpOworCQlpY2ItPm5vZGVfbmFtZVswXSAmPSAweEYwOworCX0KKworCS8qIFNldCBob3N0IGFkYXB0ZXIgcGFyYW1ldGVycy4gKi8KKwloYS0+ZmxhZ3MuZGlzYWJsZV9yaXNjX2NvZGVfbG9hZCA9IDA7CisJaGEtPmZsYWdzLmVuYWJsZV9saXBfcmVzZXQgPSAwOworCWhhLT5mbGFncy5lbmFibGVfbGlwX2Z1bGxfbG9naW4gPQorCSAgICBsZTMyX3RvX2NwdShudi0+aG9zdF9wKSAmIEJJVF8xMCA/IDE6IDA7CisJaGEtPmZsYWdzLmVuYWJsZV90YXJnZXRfcmVzZXQgPQorCSAgICBsZTMyX3RvX2NwdShudi0+aG9zdF9wKSAmIEJJVF8xMSA/IDE6IDA7CisJaGEtPmZsYWdzLmVuYWJsZV9sZWRfc2NoZW1lID0gMDsKKwloYS0+ZmxhZ3MuZGlzYWJsZV9zZXJkZXMgPSBsZTMyX3RvX2NwdShudi0+aG9zdF9wKSAmIEJJVF81ID8gMTogMDsKKworCWhhLT5vcGVyYXRpbmdfbW9kZSA9IChsZTMyX3RvX2NwdShpY2ItPmZpcm13YXJlX29wdGlvbnNfMikgJgorCSAgICAoQklUXzYgfCBCSVRfNSB8IEJJVF80KSkgPj4gNDsKKworCS8qIHNhdmUgSEJBIHNlcmlhbCBudW1iZXIgKi8KKwloYS0+c2VyaWFsMCA9IGljYi0+cG9ydF9uYW1lWzVdOworCWhhLT5zZXJpYWwxID0gaWNiLT5wb3J0X25hbWVbNl07CisJaGEtPnNlcmlhbDIgPSBpY2ItPnBvcnRfbmFtZVs3XTsKKwltZW1jcHkodmhhLT5ub2RlX25hbWUsIGljYi0+bm9kZV9uYW1lLCBXV05fU0laRSk7CisJbWVtY3B5KHZoYS0+cG9ydF9uYW1lLCBpY2ItPnBvcnRfbmFtZSwgV1dOX1NJWkUpOworCisJaWNiLT5leGVjdXRpb25fdGhyb3R0bGUgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4RkZGRik7CisKKwloYS0+cmV0cnlfY291bnQgPSBsZTE2X3RvX2NwdShudi0+bG9naW5fcmV0cnlfY291bnQpOworCisJLyogU2V0IG1pbmltdW0gbG9naW5fdGltZW91dCB0byA0IHNlY29uZHMuICovCisJaWYgKGxlMTZfdG9fY3B1KG52LT5sb2dpbl90aW1lb3V0KSA8IHFsMnhsb2dpbnRpbWVvdXQpCisJCW52LT5sb2dpbl90aW1lb3V0ID0gY3B1X3RvX2xlMTYocWwyeGxvZ2ludGltZW91dCk7CisJaWYgKGxlMTZfdG9fY3B1KG52LT5sb2dpbl90aW1lb3V0KSA8IDQpCisJCW52LT5sb2dpbl90aW1lb3V0ID0gX19jb25zdGFudF9jcHVfdG9fbGUxNig0KTsKKwloYS0+bG9naW5fdGltZW91dCA9IGxlMTZfdG9fY3B1KG52LT5sb2dpbl90aW1lb3V0KTsKKwlpY2ItPmxvZ2luX3RpbWVvdXQgPSBudi0+bG9naW5fdGltZW91dDsKKworCS8qIFNldCBtaW5pbXVtIFJBVE9WIHRvIDEwMCB0ZW50aHMgb2YgYSBzZWNvbmQuICovCisJaGEtPnJfYV90b3YgPSAxMDA7CisKKwloYS0+bG9vcF9yZXNldF9kZWxheSA9IG52LT5yZXNldF9kZWxheTsKKworCS8qIExpbmsgRG93biBUaW1lb3V0ID0gMDoKKwkgKgorCSAqIAlXaGVuIFBvcnQgRG93biB0aW1lciBleHBpcmVzIHdlIHdpbGwgc3RhcnQgcmV0dXJuaW5nCisJICoJSS9PJ3MgdG8gT1Mgd2l0aCAiRElEX05PX0NPTk5FQ1QiLgorCSAqCisJICogTGluayBEb3duIFRpbWVvdXQgIT0gMDoKKwkgKgorCSAqCSBUaGUgZHJpdmVyIHdhaXRzIGZvciB0aGUgbGluayB0byBjb21lIHVwIGFmdGVyIGxpbmsgZG93bgorCSAqCSBiZWZvcmUgcmV0dXJuaW5nIEkvT3MgdG8gT1Mgd2l0aCAiRElEX05PX0NPTk5FQ1QiLgorCSAqLworCWlmIChsZTE2X3RvX2NwdShudi0+bGlua19kb3duX3RpbWVvdXQpID09IDApIHsKKwkJaGEtPmxvb3BfZG93bl9hYm9ydF90aW1lID0KKwkJICAgIChMT09QX0RPV05fVElNRSAtIExPT1BfRE9XTl9USU1FT1VUKTsKKwl9IGVsc2UgeworCQloYS0+bGlua19kb3duX3RpbWVvdXQgPQlsZTE2X3RvX2NwdShudi0+bGlua19kb3duX3RpbWVvdXQpOworCQloYS0+bG9vcF9kb3duX2Fib3J0X3RpbWUgPQorCQkgICAgKExPT1BfRE9XTl9USU1FIC0gaGEtPmxpbmtfZG93bl90aW1lb3V0KTsKKwl9CisKKwkvKiBOZWVkIGVub3VnaCB0aW1lIHRvIHRyeSBhbmQgZ2V0IHRoZSBwb3J0IGJhY2suICovCisJaGEtPnBvcnRfZG93bl9yZXRyeV9jb3VudCA9IGxlMTZfdG9fY3B1KG52LT5wb3J0X2Rvd25fcmV0cnlfY291bnQpOworCWlmIChxbHBvcnRfZG93bl9yZXRyeSkKKwkJaGEtPnBvcnRfZG93bl9yZXRyeV9jb3VudCA9IHFscG9ydF9kb3duX3JldHJ5OworCisJLyogU2V0IGxvZ2luX3JldHJ5X2NvdW50ICovCisJaGEtPmxvZ2luX3JldHJ5X2NvdW50ICA9IGxlMTZfdG9fY3B1KG52LT5sb2dpbl9yZXRyeV9jb3VudCk7CisJaWYgKGhhLT5wb3J0X2Rvd25fcmV0cnlfY291bnQgPT0KKwkgICAgbGUxNl90b19jcHUobnYtPnBvcnRfZG93bl9yZXRyeV9jb3VudCkgJiYKKwkgICAgaGEtPnBvcnRfZG93bl9yZXRyeV9jb3VudCA+IDMpCisJCWhhLT5sb2dpbl9yZXRyeV9jb3VudCA9IGhhLT5wb3J0X2Rvd25fcmV0cnlfY291bnQ7CisJZWxzZSBpZiAoaGEtPnBvcnRfZG93bl9yZXRyeV9jb3VudCA+IChpbnQpaGEtPmxvZ2luX3JldHJ5X2NvdW50KQorCQloYS0+bG9naW5fcmV0cnlfY291bnQgPSBoYS0+cG9ydF9kb3duX3JldHJ5X2NvdW50OworCWlmIChxbDJ4bG9naW5yZXRyeWNvdW50KQorCQloYS0+bG9naW5fcmV0cnlfY291bnQgPSBxbDJ4bG9naW5yZXRyeWNvdW50OworCisJLyogRW5hYmxlIFpJTy4gKi8KKwlpZiAoIXZoYS0+ZmxhZ3MuaW5pdF9kb25lKSB7CisJCWhhLT56aW9fbW9kZSA9IGxlMzJfdG9fY3B1KGljYi0+ZmlybXdhcmVfb3B0aW9uc18yKSAmCisJCSAgICAoQklUXzMgfCBCSVRfMiB8IEJJVF8xIHwgQklUXzApOworCQloYS0+emlvX3RpbWVyID0gbGUxNl90b19jcHUoaWNiLT5pbnRlcnJ1cHRfZGVsYXlfdGltZXIpID8KKwkJICAgIGxlMTZfdG9fY3B1KGljYi0+aW50ZXJydXB0X2RlbGF5X3RpbWVyKTogMjsKKwl9CisJaWNiLT5maXJtd2FyZV9vcHRpb25zXzIgJj0gX19jb25zdGFudF9jcHVfdG9fbGUzMigKKwkgICAgfihCSVRfMyB8IEJJVF8yIHwgQklUXzEgfCBCSVRfMCkpOworCXZoYS0+ZmxhZ3MucHJvY2Vzc19yZXNwb25zZV9xdWV1ZSA9IDA7CisJaWYgKGhhLT56aW9fbW9kZSAhPSBRTEFfWklPX0RJU0FCTEVEKSB7CisJCWhhLT56aW9fbW9kZSA9IFFMQV9aSU9fTU9ERV82OworCisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogWklPIG1vZGUgJWQgZW5hYmxlZDsgdGltZXIgZGVsYXkgIgorCQkgICAgIiglZCB1cykuXG4iLCB2aGEtPmhvc3Rfbm8sIGhhLT56aW9fbW9kZSwKKwkJICAgIGhhLT56aW9fdGltZXIgKiAxMDApKTsKKwkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkgICAgIlpJTyBtb2RlICVkIGVuYWJsZWQ7IHRpbWVyIGRlbGF5ICglZCB1cykuXG4iLAorCQkgICAgaGEtPnppb19tb2RlLCBoYS0+emlvX3RpbWVyICogMTAwKTsKKworCQlpY2ItPmZpcm13YXJlX29wdGlvbnNfMiB8PSBjcHVfdG9fbGUzMigKKwkJICAgICh1aW50MzJfdCloYS0+emlvX21vZGUpOworCQlpY2ItPmludGVycnVwdF9kZWxheV90aW1lciA9IGNwdV90b19sZTE2KGhhLT56aW9fdGltZXIpOworCQl2aGEtPmZsYWdzLnByb2Nlc3NfcmVzcG9uc2VfcXVldWUgPSAxOworCX0KKworCWlmIChydmFsKSB7CisJCURFQlVHMl8zKHByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICJzY3NpKCVsZCk6IE5WUkFNIGNvbmZpZ3VyYXRpb24gZmFpbGVkIVxuIiwgdmhhLT5ob3N0X25vKSk7CisJfQorCXJldHVybiAocnZhbCk7Cit9CisKK3ZvaWQKK3FsYTgxeHhfdXBkYXRlX2Z3X29wdGlvbnMoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pb2NiLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW9jYi5jCmluZGV4IDViZWRjOWQuLjIyNTgxNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pb2NiLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lvY2IuYwpAQCAtMTczLDcgKzE3Myw3IEBACiAJCXJldHVybjsKIAl9CiAKLQl2aGEgPSBzcC0+dmhhOworCXZoYSA9IHNwLT5mY3BvcnQtPnZoYTsKIAlyZXEgPSBzcC0+cXVlOwogCiAJY21kX3BrdC0+Y29udHJvbF9mbGFncyB8PSBjcHVfdG9fbGUxNihxbGEyeDAwX2dldF9jbWRfZGlyZWN0aW9uKHNwKSk7CkBAIC0yMzQsNyArMjM0LDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCXZoYSA9IHNwLT52aGE7CisJdmhhID0gc3AtPmZjcG9ydC0+dmhhOwogCXJlcSA9IHNwLT5xdWU7CiAKIAljbWRfcGt0LT5jb250cm9sX2ZsYWdzIHw9IGNwdV90b19sZTE2KHFsYTJ4MDBfZ2V0X2NtZF9kaXJlY3Rpb24oc3ApKTsKQEAgLTI5NCw3ICsyOTQsNyBAQAogCiAJLyogU2V0dXAgZGV2aWNlIHBvaW50ZXJzLiAqLwogCXJldCA9IDA7Ci0JdmhhID0gc3AtPnZoYTsKKwl2aGEgPSBzcC0+ZmNwb3J0LT52aGE7CiAJaGEgPSB2aGEtPmh3OwogCXJlZyA9ICZoYS0+aW9iYXNlLT5pc3A7CiAJY21kID0gc3AtPmNtZDsKQEAgLTM1Myw3ICszNTMsNiBAQAogCS8qIEJ1aWxkIGNvbW1hbmQgcGFja2V0ICovCiAJcmVxLT5jdXJyZW50X291dHN0YW5kaW5nX2NtZCA9IGhhbmRsZTsKIAlyZXEtPm91dHN0YW5kaW5nX2NtZHNbaGFuZGxlXSA9IHNwOwotCXNwLT52aGEgPSB2aGE7CiAJc3AtPnF1ZSA9IHJlcTsKIAlzcC0+Y21kLT5ob3N0X3NjcmliYmxlID0gKHVuc2lnbmVkIGNoYXIgKikodW5zaWduZWQgbG9uZyloYW5kbGU7CiAJcmVxLT5jbnQgLT0gcmVxX2NudDsKQEAgLTY1Niw3ICs2NTUsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JdmhhID0gc3AtPnZoYTsKKwl2aGEgPSBzcC0+ZmNwb3J0LT52aGE7CiAJcmVxID0gc3AtPnF1ZTsKIAogCS8qIFNldCB0cmFuc2ZlciBkaXJlY3Rpb24gKi8KQEAgLTcyMyw3ICs3MjIsNyBAQAogCXN0cnVjdCByZXFfcXVlICpyZXEgPSBOVUxMOwogCXN0cnVjdCByc3BfcXVlICpyc3AgPSBOVUxMOwogCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IHNwLT5jbWQ7Ci0Jc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSA9IHNwLT52aGE7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSA9IHNwLT5mY3BvcnQtPnZoYTsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAl1aW50MTZfdCBxdWVfaWQ7CiAKQEAgLTc5MSw3ICs3OTAsNiBAQAogCS8qIEJ1aWxkIGNvbW1hbmQgcGFja2V0LiAqLwogCXJlcS0+Y3VycmVudF9vdXRzdGFuZGluZ19jbWQgPSBoYW5kbGU7CiAJcmVxLT5vdXRzdGFuZGluZ19jbWRzW2hhbmRsZV0gPSBzcDsKLQlzcC0+dmhhID0gdmhhOwogCXNwLT5jbWQtPmhvc3Rfc2NyaWJibGUgPSAodW5zaWduZWQgY2hhciAqKSh1bnNpZ25lZCBsb25nKWhhbmRsZTsKIAlyZXEtPmNudCAtPSByZXFfY250OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaXNyLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaXNyLmMKaW5kZXggZDVmYjc5YS4uNzg5ZmM1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lzci5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYwpAQCAtMjc1LDcgKzI3NSw3IEBACiBxbGEyeDAwX2FzeW5jX2V2ZW50KHNjc2lfcWxhX2hvc3RfdCAqdmhhLCBzdHJ1Y3QgcnNwX3F1ZSAqcnNwLCB1aW50MTZfdCAqbWIpCiB7CiAjZGVmaW5lIExTX1VOS05PV04JMgotCXN0YXRpYyBjaGFyCSpsaW5rX3NwZWVkc1s1XSA9IHsgIjEiLCAiMiIsICI/IiwgIjQiLCAiOCIgfTsKKwlzdGF0aWMgY2hhcgkqbGlua19zcGVlZHNbXSA9IHsgIjEiLCAiMiIsICI/IiwgIjQiLCAiOCIsICIxMCIgfTsKIAljaGFyCQkqbGlua19zcGVlZDsKIAl1aW50MTZfdAloYW5kbGVfY250OwogCXVpbnQxNl90CWNudDsKQEAgLTI4OCw2ICsyODgsOCBAQAogCiAJLyogU2V0dXAgdG8gcHJvY2VzcyBSSU8gY29tcGxldGlvbi4gKi8KIAloYW5kbGVfY250ID0gMDsKKwlpZiAoSVNfUUxBODFYWChoYSkpCisJCWdvdG8gc2tpcF9yaW87CiAJc3dpdGNoIChtYlswXSkgewogCWNhc2UgTUJBX1NDU0lfQ09NUExFVElPTjoKIAkJaGFuZGxlc1swXSA9IGxlMzJfdG9fY3B1KCh1aW50MzJfdCkoKG1iWzJdIDw8IDE2KSB8IG1iWzFdKSk7CkBAIC0zMzksNyArMzQxLDcgQEAKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9Ci0KK3NraXBfcmlvOgogCXN3aXRjaCAobWJbMF0pIHsKIAljYXNlIE1CQV9TQ1NJX0NPTVBMRVRJT046CS8qIEZhc3QgUG9zdCAqLwogCQlpZiAoIXZoYS0+ZmxhZ3Mub25saW5lKQpAQCAtMzYyLDcgKzM2NCw2IEBACiAJCSAgICAiSVNQIFN5c3RlbSBFcnJvciAtIG1ieDE9JXhoIG1ieDI9JXhoIG1ieDM9JXhoLlxuIiwKIAkJICAgIG1iWzFdLCBtYlsyXSwgbWJbM10pOwogCi0JCXFsYTJ4MDBfcG9zdF9od2Vfd29yayh2aGEsIG1iWzBdLCBtYlsxXSwgbWJbMl0sIG1iWzNdKTsKIAkJaGEtPmlzcF9vcHMtPmZ3X2R1bXAodmhhLCAxKTsKIAogCQlpZiAoSVNfRldJMl9DQVBBQkxFKGhhKSkgewpAQCAtMzg3LDcgKzM4OCw2IEBACiAJCSAgICB2aGEtPmhvc3Rfbm8pKTsKIAkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiSVNQIFJlcXVlc3QgVHJhbnNmZXIgRXJyb3IuXG4iKTsKIAotCQlxbGEyeDAwX3Bvc3RfaHdlX3dvcmsodmhhLCBtYlswXSwgbWJbMV0sIG1iWzJdLCBtYlszXSk7CiAJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKIAkJYnJlYWs7CiAKQEAgLTM5Niw3ICszOTYsNiBAQAogCQkgICAgdmhhLT5ob3N0X25vKSk7CiAJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIklTUCBSZXNwb25zZSBUcmFuc2ZlciBFcnJvci5cbiIpOwogCi0JCXFsYTJ4MDBfcG9zdF9od2Vfd29yayh2aGEsIG1iWzBdLCBtYlsxXSwgbWJbMl0sIG1iWzNdKTsKIAkJc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOwogCQlicmVhazsKIApAQCAtNDM2LDYgKzQzNSw4IEBACiAJCQlsaW5rX3NwZWVkID0gbGlua19zcGVlZHNbTFNfVU5LTk9XTl07CiAJCQlpZiAobWJbMV0gPCA1KQogCQkJCWxpbmtfc3BlZWQgPSBsaW5rX3NwZWVkc1ttYlsxXV07CisJCQllbHNlIGlmIChtYlsxXSA9PSAweDEzKQorCQkJCWxpbmtfc3BlZWQgPSBsaW5rX3NwZWVkc1s1XTsKIAkJCWhhLT5saW5rX2RhdGFfcmF0ZSA9IG1iWzFdOwogCQl9CiAKQEAgLTQ5NSwxMiArNDk2LDE3IEBACiAJCXFsYTJ4MDBfcG9zdF9hZW5fd29yayh2aGEsIEZDSF9FVlRfTElQUkVTRVQsIG1iWzFdKTsKIAkJYnJlYWs7CiAKKwkvKiBjYXNlIE1CQV9EQ0JYX0NPTVBMRVRFOiAqLwogCWNhc2UgTUJBX1BPSU5UX1RPX1BPSU5UOgkvKiBQb2ludC10by1Qb2ludCAqLwogCQlpZiAoSVNfUUxBMjEwMChoYSkpCiAJCQlicmVhazsKIAotCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IEFzeW5jaHJvbm91cyBQMlAgTU9ERSByZWNlaXZlZC5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8pKTsKKwkJaWYgKElTX1FMQTgxWFgoaGEpKQorCQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBEQ0JYIENvbXBsZXRlZCAtLSAlMDR4ICUwNHggIgorCQkJICAgICIlMDR4XG4iLCB2aGEtPmhvc3Rfbm8sIG1iWzFdLCBtYlsyXSwgbWJbM10pKTsKKwkJZWxzZQorCQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBBc3luY2hyb25vdXMgUDJQIE1PREUgIgorCQkJICAgICJyZWNlaXZlZC5cbiIsIHZoYS0+aG9zdF9ubykpOwogCiAJCS8qCiAJCSAqIFVudGlsIHRoZXJlJ3MgYSB0cmFuc2l0aW9uIGZyb20gbG9vcCBkb3duIHRvIGxvb3AgdXAsIHRyZWF0CkBAIC02NDEsMTAgKzY0Nyw3IEBACiAKIAkvKiBjYXNlIE1CQV9SSU9fUkVTUE9OU0U6ICovCiAJY2FzZSBNQkFfWklPX1JFU1BPTlNFOgotCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFtSfFpdSU8gdXBkYXRlIGNvbXBsZXRpb24uXG4iLAotCQkgICAgdmhhLT5ob3N0X25vKSk7Ci0JCURFQlVHKHByaW50ayhLRVJOX0lORk8KLQkJICAgICJzY3NpKCVsZCk6IFtSfFpdSU8gdXBkYXRlIGNvbXBsZXRpb24uXG4iLAorCQlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IFtSfFpdSU8gdXBkYXRlIGNvbXBsZXRpb24uXG4iLAogCQkgICAgdmhhLT5ob3N0X25vKSk7CiAKIAkJaWYgKElTX0ZXSTJfQ0FQQUJMRShoYSkpCkBAIC02OTgsNiArNzAxLDM1IEBACiAJCX0KIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmNzODR4eC0+YWNjZXNzX2xvY2ssIGZsYWdzKTsKIAkJYnJlYWs7CisJY2FzZSBNQkFfRENCWF9TVEFSVDoKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBEQ0JYIFN0YXJ0ZWQgLS0gJTA0eCAlMDR4ICUwNHhcbiIsCisJCSAgICB2aGEtPmhvc3Rfbm8sIG1iWzFdLCBtYlsyXSwgbWJbM10pKTsKKwkJYnJlYWs7CisJY2FzZSBNQkFfRENCWF9QQVJBTV9VUERBVEU6CisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogRENCWCBQYXJhbWV0ZXJzIFVwZGF0ZWQgLS0gIgorCQkgICAgIiUwNHggJTA0eCAlMDR4XG4iLCB2aGEtPmhvc3Rfbm8sIG1iWzFdLCBtYlsyXSwgbWJbM10pKTsKKwkJYnJlYWs7CisJY2FzZSBNQkFfRkNGX0NPTkZfRVJSOgorCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IEZDRiBDb25maWd1cmF0aW9uIEVycm9yIC0tICIKKwkJICAgICIlMDR4ICUwNHggJTA0eFxuIiwgdmhhLT5ob3N0X25vLCBtYlsxXSwgbWJbMl0sIG1iWzNdKSk7CisJCWJyZWFrOworCWNhc2UgTUJBX0lEQ19DT01QTEVURToKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBJbnRlci1Ecml2ZXIgQ29tbXVjYXRpb24gIgorCQkgICAgIkNvbXBsZXRlIC0tICUwNHggJTA0eCAlMDR4XG4iLCB2aGEtPmhvc3Rfbm8sIG1iWzFdLCBtYlsyXSwKKwkJICAgIG1iWzNdKSk7CisJCWJyZWFrOworCWNhc2UgTUJBX0lEQ19OT1RJRlk6CisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogSW50ZXItRHJpdmVyIENvbW11Y2F0aW9uICIKKwkJICAgICJSZXF1ZXN0IE5vdGlmaWNhdGlvbiAtLSAlMDR4ICUwNHggJTA0eFxuIiwgdmhhLT5ob3N0X25vLAorCQkgICAgbWJbMV0sIG1iWzJdLCBtYlszXSkpOworCQkvKioqKiBNYWlsYm94IHJlZ2lzdGVycyA0IC0gNyB2YWxpZCEhISAqLworCQlicmVhazsKKwljYXNlIE1CQV9JRENfVElNRV9FWFQ6CisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogSW50ZXItRHJpdmVyIENvbW11Y2F0aW9uICIKKwkJICAgICJUaW1lIEV4dGVuc2lvbiAtLSAlMDR4ICUwNHggJTA0eFxuIiwgdmhhLT5ob3N0X25vLCBtYlsxXSwKKwkJICAgIG1iWzJdLCBtYlszXSkpOworCQkvKioqKiBNYWlsYm94IHJlZ2lzdGVycyA0IC0gNyB2YWxpZCEhISAqLworCQlicmVhazsKIAl9CiAKIAlpZiAoIXZoYS0+dnBfaWR4ICYmIGhhLT5udW1fdmhvc3RzKQpAQCAtMTUxMCw3ICsxNTQyLDcgQEAKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlzdHJ1Y3QgZGV2aWNlX3JlZ18yNHh4IF9faW9tZW0gKnJlZyA9ICZoYS0+aW9iYXNlLT5pc3AyNDsKIAotCWlmICghSVNfUUxBMjVYWChoYSkpCisJaWYgKCFJU19RTEEyNVhYKGhhKSAmJiAhSVNfUUxBODFYWChoYSkpCiAJCXJldHVybjsKIAogCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKQEAgLTE1OTAsMTIgKzE2MjIsNiBAQAogCQkJaWYgKHBjaV9jaGFubmVsX29mZmxpbmUoaGEtPnBkZXYpKQogCQkJCWJyZWFrOwogCi0JCQlpZiAoaGEtPmh3X2V2ZW50X3BhdXNlX2Vycm9ycyA9PSAwKQotCQkJCXFsYTJ4MDBfcG9zdF9od2Vfd29yayh2aGEsIEhXX0VWRU5UX1BBUklUWV9FUlIsCi0JCQkJICAgIDAsIE1TVyhzdGF0KSwgTFNXKHN0YXQpKTsKLQkJCWVsc2UgaWYgKGhhLT5od19ldmVudF9wYXVzZV9lcnJvcnMgPCAweGZmZmZmZmZmKQotCQkJCWhhLT5od19ldmVudF9wYXVzZV9lcnJvcnMrKzsKLQogCQkJaGNjciA9IFJEX1JFR19EV09SRCgmcmVnLT5oY2NyKTsKIAogCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiUklTQyBwYXVzZWQgLS0gSENDUj0leCwgIgpAQCAtMTc0MCwxMiArMTc2Niw2IEBACiAJCQlpZiAocGNpX2NoYW5uZWxfb2ZmbGluZShoYS0+cGRldikpCiAJCQkJYnJlYWs7CiAKLQkJCWlmIChoYS0+aHdfZXZlbnRfcGF1c2VfZXJyb3JzID09IDApCi0JCQkJcWxhMngwMF9wb3N0X2h3ZV93b3JrKHZoYSwgSFdfRVZFTlRfUEFSSVRZX0VSUiwKLQkJCQkgICAgMCwgTVNXKHN0YXQpLCBMU1coc3RhdCkpOwotCQkJZWxzZSBpZiAoaGEtPmh3X2V2ZW50X3BhdXNlX2Vycm9ycyA8IDB4ZmZmZmZmZmYpCi0JCQkJaGEtPmh3X2V2ZW50X3BhdXNlX2Vycm9ycysrOwotCiAJCQloY2NyID0gUkRfUkVHX0RXT1JEKCZyZWctPmhjY3IpOwogCiAJCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJSSVNDIHBhdXNlZCAtLSBIQ0NSPSV4LCAiCkBAIC0xOTQ0LDcgKzE5NjQsOCBAQAogCWRldmljZV9yZWdfdCBfX2lvbWVtICpyZWcgPSBoYS0+aW9iYXNlOwogCiAJLyogSWYgcG9zc2libGUsIGVuYWJsZSBNU0ktWC4gKi8KLQlpZiAoIUlTX1FMQTI0MzIoaGEpICYmICFJU19RTEEyNTMyKGhhKSAmJiAhSVNfUUxBODQzMihoYSkpCisJaWYgKCFJU19RTEEyNDMyKGhhKSAmJiAhSVNfUUxBMjUzMihoYSkgJiYKKwkgICAgIUlTX1FMQTg0MzIoaGEpICYmICFJU19RTEE4MDAxKGhhKSkKIAkJZ290byBza2lwX21zaXg7CiAKIAlpZiAoSVNfUUxBMjQzMihoYSkgJiYgKGhhLT5wZGV2LT5yZXZpc2lvbiA8IFFMQV9NU0lYX0NISVBfUkVWXzI0WFggfHwKQEAgLTE5NzksNyArMjAwMCw4IEBACiAJICAgICJNU0ktWDogRmFsbGluZyBiYWNrLXRvIElOVGEgbW9kZSAtLSAlZC5cbiIsIHJldCk7CiBza2lwX21zaXg6CiAKLQlpZiAoIUlTX1FMQTI0WFgoaGEpICYmICFJU19RTEEyNTMyKGhhKSAmJiAhSVNfUUxBODQzMihoYSkpCisJaWYgKCFJU19RTEEyNFhYKGhhKSAmJiAhSVNfUUxBMjUzMihoYSkgJiYgIUlTX1FMQTg0MzIoaGEpICYmCisJICAgICFJU19RTEE4MDAxKGhhKSkKIAkJZ290byBza2lwX21zaTsKIAogCXJldCA9IHBjaV9lbmFibGVfbXNpKGhhLT5wZGV2KTsKQEAgLTIwMDAsNiArMjAyMiwxMiBAQAogCWhhLT5mbGFncy5pbnRhX2VuYWJsZWQgPSAxOwogY2xlYXJfcmlzY19pbnRzOgogCisJLyoKKwkgKiBGSVhNRTogTm90ZWQgdGhhdCA4MDE0cyB3ZXJlIGJlaW5nIGRyb3BwZWQgZHVyaW5nIE5LIHRlc3RpbmcuCisJICogVGltaW5nIGRlbHRhcyBkdXJpbmcgTVNJLVgvSU5UYSB0cmFuc2l0aW9ucz8KKwkgKi8KKwlpZiAoSVNfUUxBODFYWChoYSkpCisJCWdvdG8gZmFpbDsKIAlzcGluX2xvY2tfaXJxKCZoYS0+aGFyZHdhcmVfbG9jayk7CiAJaWYgKElTX0ZXSTJfQ0FQQUJMRShoYSkpIHsKIAkJV1JUX1JFR19EV09SRCgmcmVnLT5pc3AyNC5oY2NyLCBIQ0NSWF9DTFJfSE9TVF9JTlQpOwpAQCAtMjA0NCw3ICsyMDcyLDcgQEAKIAkJaWYgKHBrdCAmJiBwa3QtPmhhbmRsZSA8IE1BWF9PVVRTVEFORElOR19DT01NQU5EUykgewogCQkJc3AgPSByZXEtPm91dHN0YW5kaW5nX2NtZHNbcGt0LT5oYW5kbGVdOwogCQkJaWYgKHNwKQotCQkJCXZoYSA9IHNwLT52aGE7CisJCQkJdmhhID0gc3AtPmZjcG9ydC0+dmhhOwogCQl9CiAJfQogCWlmICghdmhhKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21ieC5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21ieC5jCmluZGV4IGE5OTk3NmYuLmRiNGRmNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tYnguYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWJ4LmMKQEAgLTEyMyw4ICsxMjMsNyBAQAogCiAJLyogV2FpdCBmb3IgbWJ4IGNtZCBjb21wbGV0aW9uIHVudGlsIHRpbWVvdXQgKi8KIAotCWlmICghYWJvcnRfYWN0aXZlICYmIGlvX2xvY2tfb24pIHsKLQorCWlmICgoIWFib3J0X2FjdGl2ZSAmJiBpb19sb2NrX29uKSB8fCBJU19OT1BPTExJTkdfVFlQRShoYSkpIHsKIAkJc2V0X2JpdChNQlhfSU5UUl9XQUlULCAmaGEtPm1ieF9jbWRfZmxhZ3MpOwogCiAJCWlmIChJU19GV0kyX0NBUEFCTEUoaGEpKQpAQCAtMjE4LDcgKzIxNyw3IEBACiAJLyogQ2xlYW4gdXAgKi8KIAloYS0+bWNwID0gTlVMTDsKIAotCWlmIChhYm9ydF9hY3RpdmUgfHwgIWlvX2xvY2tfb24pIHsKKwlpZiAoKGFib3J0X2FjdGl2ZSB8fCAhaW9fbG9ja19vbikgJiYgIUlTX05PUE9MTElOR19UWVBFKGhhKSkgewogCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogY2hlY2tpbmcgZm9yIGFkZGl0aW9uYWwgcmVzcCAiCiAJCSAgICAiaW50ZXJydXB0LlxuIiwgX19mdW5jX18sIGJhc2VfdmhhLT5ob3N0X25vKSk7CiAKQEAgLTQxMiw3ICs0MTEsOCBAQAogICovCiB2b2lkCiBxbGEyeDAwX2dldF9md192ZXJzaW9uKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCB1aW50MTZfdCAqbWFqb3IsIHVpbnQxNl90ICptaW5vciwKLSAgICB1aW50MTZfdCAqc3VibWlub3IsIHVpbnQxNl90ICphdHRyaWJ1dGVzLCB1aW50MzJfdCAqbWVtb3J5KQorICAgIHVpbnQxNl90ICpzdWJtaW5vciwgdWludDE2X3QgKmF0dHJpYnV0ZXMsIHVpbnQzMl90ICptZW1vcnksIHVpbnQ4X3QgKm1waSwKKyAgICB1aW50MzJfdCAqbXBpX2NhcHMpCiB7CiAJaW50CQlydmFsOwogCW1ieF9jbWRfdAltYzsKQEAgLTQyMyw2ICs0MjMsOCBAQAogCW1jcC0+bWJbMF0gPSBNQkNfR0VUX0ZJUk1XQVJFX1ZFUlNJT047CiAJbWNwLT5vdXRfbWIgPSBNQlhfMDsKIAltY3AtPmluX21iID0gTUJYXzZ8TUJYXzV8TUJYXzR8TUJYXzN8TUJYXzJ8TUJYXzF8TUJYXzA7CisJaWYgKElTX1FMQTgxWFgodmhhLT5odykpCisJCW1jcC0+aW5fbWIgfD0gTUJYXzEzfE1CWF8xMnxNQlhfMTF8TUJYXzEwOwogCW1jcC0+ZmxhZ3MgPSAwOwogCW1jcC0+dG92ID0gTUJYX1RPVl9TRUNPTkRTOwogCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZCh2aGEsIG1jcCk7CkBAIC00MzYsNiArNDM4LDEzIEBACiAJCSptZW1vcnkgPSAweDFGRkZGOwkJCS8qIERlZmF1bHRzIHRvIDEyOEtCLiAqLwogCWVsc2UKIAkJKm1lbW9yeSA9IChtY3AtPm1iWzVdIDw8IDE2KSB8IG1jcC0+bWJbNF07CisJaWYgKElTX1FMQTgxWFgodmhhLT5odykpIHsKKwkJbXBpWzBdID0gbWNwLT5tYlsxMF0gPj4gODsKKwkJbXBpWzFdID0gbWNwLT5tYlsxMF0gJiAweGZmOworCQltcGlbMl0gPSBtY3AtPm1iWzExXSA+PiA4OworCQltcGlbM10gPSBtY3AtPm1iWzExXSAmIDB4ZmY7CisJCSptcGlfY2FwcyA9IChtY3AtPm1iWzEyXSA8PCAxNikgfCBtY3AtPm1iWzEzXTsKKwl9CiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkvKkVNUFRZKi8KQEAgLTU2OCw3ICs1NzcsNiBAQAogcWxhMngwMF9tYnhfcmVnX3Rlc3Qoc2NzaV9xbGFfaG9zdF90ICp2aGEpCiB7CiAJaW50IHJ2YWw7Ci0Jc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJbWJ4X2NtZF90IG1jOwogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCkBAIC01OTUsMTQgKzYwMyw2IEBACiAJCWlmIChtY3AtPm1iWzVdICE9IDB4QTVBNSB8fCBtY3AtPm1iWzZdICE9IDB4NUE1QSB8fAogCQkgICAgbWNwLT5tYls3XSAhPSAweDI1MjUpCiAJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKLQkJaWYgKHJ2YWwgPT0gUUxBX0ZVTkNUSU9OX0ZBSUxFRCkgewotCQkJc3RydWN0IGRldmljZV9yZWdfMjR4eCBfX2lvbWVtICpyZWcgPQotCQkJICAgICZoYS0+aW9iYXNlLT5pc3AyNDsKLQotCQkJcWxhMnh4eF9od19ldmVudF9sb2codmhhLCBIV19FVkVOVF9JU1BfRVJSLCAwLAotCQkJICAgIExTVyhSRF9SRUdfRFdPUkQoJnJlZy0+aGNjcikpLAotCQkJICAgIExTVyhSRF9SRUdfRFdPUkQoJnJlZy0+aXN0YXR1cykpKTsKLQkJfQogCX0KIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CkBAIC0xMzYzLDcgKzEzNjMsMTMgQEAKIAogCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwogCi0JaWYgKElTX0ZXSTJfQ0FQQUJMRSh2aGEtPmh3KSkgeworCWlmIChJU19RTEE4MVhYKHZoYS0+aHcpKSB7CisJCS8qIExvZ291dCBhY3Jvc3MgYWxsIEZDRnMuICovCisJCW1jcC0+bWJbMF0gPSBNQkNfTElQX0ZVTExfTE9HSU47CisJCW1jcC0+bWJbMV0gPSBCSVRfMTsKKwkJbWNwLT5tYlsyXSA9IDA7CisJCW1jcC0+b3V0X21iID0gTUJYXzJ8TUJYXzF8TUJYXzA7CisJfSBlbHNlIGlmIChJU19GV0kyX0NBUEFCTEUodmhhLT5odykpIHsKIAkJbWNwLT5tYlswXSA9IE1CQ19MSVBfRlVMTF9MT0dJTjsKIAkJbWNwLT5tYlsxXSA9IEJJVF82OwogCQltY3AtPm1iWzJdID0gMDsKQEAgLTE4NTMsNiArMTg1OSw5IEBACiAJbWJ4X2NtZF90IG1jOwogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCisJaWYgKElTX1FMQTgxWFgodmhhLT5odykpCisJICAgIHJldHVybiBRTEFfU1VDQ0VTUzsKKwogCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2Z1bGxfbG9naW5fbGlwKCVsZCk6IGVudGVyZWQuXG4iLAogCSAgICB2aGEtPmhvc3Rfbm8pKTsKIApAQCAtMjUxMiw3ICsyNTIxLDcgQEAKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKLQlpZiAoIUlTX1FMQTI1WFgodmhhLT5odykpCisJaWYgKCFJU19RTEEyNVhYKHZoYS0+aHcpICYmICFJU19RTEE4MVhYKHZoYS0+aHcpKQogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAogCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwpAQCAtMzE1NSw3ICszMTY0LDcgQEAKIAltY3AtPm1iWzddID0gTFNXKE1TRChyc3AtPmRtYSkpOwogCW1jcC0+bWJbNV0gPSByc3AtPmxlbmd0aDsKIAltY3AtPm1iWzExXSA9IHJzcC0+dnBfaWR4OwotCW1jcC0+bWJbMTRdID0gcnNwLT5tc2l4LT52ZWN0b3I7CisJbWNwLT5tYlsxNF0gPSByc3AtPm1zaXgtPmVudHJ5OwogCW1jcC0+bWJbMTNdID0gcnNwLT5yaWQ7CiAKIAlyZWcgPSAoc3RydWN0IGRldmljZV9yZWdfMjV4eG1xICopKCh2b2lkICopKGhhLT5tcWlvYmFzZSkgKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21pZC5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21pZC5jCmluZGV4IDM4NmZmZWEuLjg4NjMyMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9taWQuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWlkLmMKQEAgLTYxNCw4ICs2MTQsMTAgQEAKIAlyZXEtPnZwX2lkeCA9IHZwX2lkeDsKIAlyZXEtPnFvcyA9IHFvczsKIAotCWlmIChoYS0+cnNwX3FfbWFwW3JzcF9xdWVdKQorCWlmIChoYS0+cnNwX3FfbWFwW3JzcF9xdWVdKSB7CiAJCXJlcS0+cnNwID0gaGEtPnJzcF9xX21hcFtyc3BfcXVlXTsKKwkJcmVxLT5yc3AtPnJlcSA9IHJlcTsKKwl9CiAJLyogVXNlIGFsdGVybmF0ZSBQQ0kgYnVzIG51bWJlciAqLwogCWlmIChNU0IocmVxLT5yaWQpKQogCQlvcHRpb25zIHw9IEJJVF80OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYwppbmRleCA4ZWE5Mjc3Li40YTcxZjUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYwpAQCAtNDA0LDI2ICs0MDQsOSBAQAogcWxhMjR4eF9md192ZXJzaW9uX3N0cihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLCBjaGFyICpzdHIpCiB7CiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7Ci0Jc3ByaW50ZihzdHIsICIlZC4lMDJkLiUwMmQgIiwgaGEtPmZ3X21ham9yX3ZlcnNpb24sCi0JICAgIGhhLT5md19taW5vcl92ZXJzaW9uLAotCSAgICBoYS0+Zndfc3VibWlub3JfdmVyc2lvbik7CiAKLQlpZiAoaGEtPmZ3X2F0dHJpYnV0ZXMgJiBCSVRfMCkKLQkJc3RyY2F0KHN0ciwgIltDbGFzcyAyXSAiKTsKLQlpZiAoaGEtPmZ3X2F0dHJpYnV0ZXMgJiBCSVRfMSkKLQkJc3RyY2F0KHN0ciwgIltJUF0gIik7Ci0JaWYgKGhhLT5md19hdHRyaWJ1dGVzICYgQklUXzIpCi0JCXN0cmNhdChzdHIsICJbTXVsdGktSURdICIpOwotCWlmIChoYS0+ZndfYXR0cmlidXRlcyAmIEJJVF8zKQotCQlzdHJjYXQoc3RyLCAiW1NCLTJdICIpOwotCWlmIChoYS0+ZndfYXR0cmlidXRlcyAmIEJJVF80KQotCQlzdHJjYXQoc3RyLCAiW1QxMCBDUkNdICIpOwotCWlmIChoYS0+ZndfYXR0cmlidXRlcyAmIEJJVF81KQotCQlzdHJjYXQoc3RyLCAiW1ZJXSAiKTsKLQlpZiAoaGEtPmZ3X2F0dHJpYnV0ZXMgJiBCSVRfMTApCi0JCXN0cmNhdChzdHIsICJbODRYWF0gIik7Ci0JaWYgKGhhLT5md19hdHRyaWJ1dGVzICYgQklUXzEzKQotCQlzdHJjYXQoc3RyLCAiW0V4cGVyaW1lbnRhbF0iKTsKKwlzcHJpbnRmKHN0ciwgIiVkLiUwMmQuJTAyZCAoJXgpIiwgaGEtPmZ3X21ham9yX3ZlcnNpb24sCisJICAgIGhhLT5md19taW5vcl92ZXJzaW9uLCBoYS0+Zndfc3VibWlub3JfdmVyc2lvbiwgaGEtPmZ3X2F0dHJpYnV0ZXMpOwogCXJldHVybiBzdHI7CiB9CiAKQEAgLTQzOCw3ICs0MjEsNiBAQAogCWlmICghc3ApCiAJCXJldHVybiBzcDsKIAotCXNwLT52aGEgPSB2aGE7CiAJc3AtPmZjcG9ydCA9IGZjcG9ydDsKIAlzcC0+Y21kID0gY21kOwogCXNwLT5xdWUgPSBoYS0+cmVxX3FfbWFwWzBdOwpAQCAtMTE4Miw3ICsxMTY0LDcgQEAKIAkJCWNvbnRpbnVlOwogCQlmb3IgKGNudCA9IDE7IGNudCA8IE1BWF9PVVRTVEFORElOR19DT01NQU5EUzsgY250KyspIHsKIAkJCXNwID0gcmVxLT5vdXRzdGFuZGluZ19jbWRzW2NudF07Ci0JCQlpZiAoc3AgJiYgc3AtPnZoYSA9PSB2aGEpIHsKKwkJCWlmIChzcCAmJiBzcC0+ZmNwb3J0LT52aGEgPT0gdmhhKSB7CiAJCQkJcmVxLT5vdXRzdGFuZGluZ19jbWRzW2NudF0gPSBOVUxMOwogCQkJCXNwLT5jbWQtPnJlc3VsdCA9IHJlczsKIAkJCQlxbGEyeDAwX3NwX2NvbXBsKGhhLCBzcCk7CkBAIC0xMzI5LDYgKzEzMTEsOCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwogCXN0cnVjdCBkZXZpY2VfcmVnXzI0eHggX19pb21lbSAqcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDI0OwogCisJaWYgKElTX05PUE9MTElOR19UWVBFKGhhKSkKKwkJcmV0dXJuOwogCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCWhhLT5pbnRlcnJ1cHRzX29uID0gMDsKIAlXUlRfUkVHX0RXT1JEKCZyZWctPmljdHJsLCAwKTsKQEAgLTE0ODgsNiArMTQ3Miw0NCBAQAogCS5yZF9yZXFfcmVnCQk9IHFsYTI0eHhfcmRfcmVxX3JlZywKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgaXNwX29wZXJhdGlvbnMgcWxhODF4eF9pc3Bfb3BzID0geworCS5wY2lfY29uZmlnCQk9IHFsYTI1eHhfcGNpX2NvbmZpZywKKwkucmVzZXRfY2hpcAkJPSBxbGEyNHh4X3Jlc2V0X2NoaXAsCisJLmNoaXBfZGlhZwkJPSBxbGEyNHh4X2NoaXBfZGlhZywKKwkuY29uZmlnX3JpbmdzCQk9IHFsYTI0eHhfY29uZmlnX3JpbmdzLAorCS5yZXNldF9hZGFwdGVyCQk9IHFsYTI0eHhfcmVzZXRfYWRhcHRlciwKKwkubnZyYW1fY29uZmlnCQk9IHFsYTgxeHhfbnZyYW1fY29uZmlnLAorCS51cGRhdGVfZndfb3B0aW9ucwk9IHFsYTgxeHhfdXBkYXRlX2Z3X29wdGlvbnMsCisJLmxvYWRfcmlzYwkJPSBxbGEyNHh4X2xvYWRfcmlzYywKKwkucGNpX2luZm9fc3RyCQk9IHFsYTI0eHhfcGNpX2luZm9fc3RyLAorCS5md192ZXJzaW9uX3N0cgkJPSBxbGEyNHh4X2Z3X3ZlcnNpb25fc3RyLAorCS5pbnRyX2hhbmRsZXIJCT0gcWxhMjR4eF9pbnRyX2hhbmRsZXIsCisJLmVuYWJsZV9pbnRycwkJPSBxbGEyNHh4X2VuYWJsZV9pbnRycywKKwkuZGlzYWJsZV9pbnRycwkJPSBxbGEyNHh4X2Rpc2FibGVfaW50cnMsCisJLmFib3J0X2NvbW1hbmQJCT0gcWxhMjR4eF9hYm9ydF9jb21tYW5kLAorCS50YXJnZXRfcmVzZXQJCT0gcWxhMjR4eF9hYm9ydF90YXJnZXQsCisJLmx1bl9yZXNldAkJPSBxbGEyNHh4X2x1bl9yZXNldCwKKwkuZmFicmljX2xvZ2luCQk9IHFsYTI0eHhfbG9naW5fZmFicmljLAorCS5mYWJyaWNfbG9nb3V0CQk9IHFsYTI0eHhfZmFicmljX2xvZ291dCwKKwkuY2FsY19yZXFfZW50cmllcwk9IE5VTEwsCisJLmJ1aWxkX2lvY2JzCQk9IE5VTEwsCisJLnByZXBfbXNfaW9jYgkJPSBxbGEyNHh4X3ByZXBfbXNfaW9jYiwKKwkucHJlcF9tc19mZG1pX2lvY2IJPSBxbGEyNHh4X3ByZXBfbXNfZmRtaV9pb2NiLAorCS5yZWFkX252cmFtCQk9IHFsYTI1eHhfcmVhZF9udnJhbV9kYXRhLAorCS53cml0ZV9udnJhbQkJPSBxbGEyNXh4X3dyaXRlX252cmFtX2RhdGEsCisJLmZ3X2R1bXAJCT0gcWxhODF4eF9md19kdW1wLAorCS5iZWFjb25fb24JCT0gcWxhMjR4eF9iZWFjb25fb24sCisJLmJlYWNvbl9vZmYJCT0gcWxhMjR4eF9iZWFjb25fb2ZmLAorCS5iZWFjb25fYmxpbmsJCT0gcWxhMjR4eF9iZWFjb25fYmxpbmssCisJLnJlYWRfb3B0cm9tCQk9IHFsYTI1eHhfcmVhZF9vcHRyb21fZGF0YSwKKwkud3JpdGVfb3B0cm9tCQk9IHFsYTI0eHhfd3JpdGVfb3B0cm9tX2RhdGEsCisJLmdldF9mbGFzaF92ZXJzaW9uCT0gcWxhMjR4eF9nZXRfZmxhc2hfdmVyc2lvbiwKKwkuc3RhcnRfc2NzaQkJPSBxbGEyNHh4X3N0YXJ0X3Njc2ksCisJLndydF9yZXFfcmVnCQk9IHFsYTI0eHhfd3J0X3JlcV9yZWcsCisJLndydF9yc3BfcmVnCQk9IHFsYTI0eHhfd3J0X3JzcF9yZWcsCisJLnJkX3JlcV9yZWcJCT0gcWxhMjR4eF9yZF9yZXFfcmVnLAorfTsKKwogc3RhdGljIGlubGluZSB2b2lkCiBxbGEyeDAwX3NldF9pc3BfZmxhZ3Moc3RydWN0IHFsYV9od19kYXRhICpoYSkKIHsKQEAgLTE1NjcsNiArMTU4OSwxMyBAQAogCQloYS0+ZGV2aWNlX3R5cGUgfD0gRFRfSUlETUE7CiAJCWhhLT5md19zcmlzY19hZGRyZXNzID0gUklTQ19TVEFSVF9BRERSRVNTXzI0MDA7CiAJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQODAwMToKKwkJaGEtPmRldmljZV90eXBlIHw9IERUX0lTUDgwMDE7CisJCWhhLT5kZXZpY2VfdHlwZSB8PSBEVF9aSU9fU1VQUE9SVEVEOworCQloYS0+ZGV2aWNlX3R5cGUgfD0gRFRfRldJMjsKKwkJaGEtPmRldmljZV90eXBlIHw9IERUX0lJRE1BOworCQloYS0+Zndfc3Jpc2NfYWRkcmVzcyA9IFJJU0NfU1RBUlRfQUREUkVTU18yNDAwOworCQlicmVhazsKIAl9CiB9CiAKQEAgLTE2MjksNyArMTY1OCw3IEBACiAKIAkvKiBEZXRlcm1pbmUgcXVldWUgcmVzb3VyY2VzICovCiAJaGEtPm1heF9xdWV1ZXMgPSAxOwotCWlmIChxbDJ4bWF4cXVldWVzIDw9IDEgfHwgIUlTX1FMQTI1WFgoaGEpKQorCWlmIChxbDJ4bWF4cXVldWVzIDw9IDEgfHwgKCFJU19RTEEyNVhYKGhhKSAmJiAhSVNfUUxBODFYWChoYSkpKQogCQlnb3RvIG1xaW9iYXNlX2V4aXQ7CiAJaGEtPm1xaW9iYXNlID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoaGEtPnBkZXYsIDMpLAogCQkJcGNpX3Jlc291cmNlX2xlbihoYS0+cGRldiwgMykpOwpAQCAtMTcwNiw3ICsxNzM1LDggQEAKIAkgICAgcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDg0MzIgfHwKIAkgICAgcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDU0MjIgfHwKIAkgICAgcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDU0MzIgfHwKLQkgICAgcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDI1MzIpIHsKKwkgICAgcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDI1MzIgfHwKKwkgICAgcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDgwMDEpIHsKIAkJYmFycyA9IHBjaV9zZWxlY3RfYmFycyhwZGV2LCBJT1JFU09VUkNFX01FTSk7CiAJCXNodCA9ICZxbGEyNHh4X2RyaXZlcl90ZW1wbGF0ZTsKIAkJbWVtX29ubHkgPSAxOwpAQCAtMTc2MCw2ICsxNzkwLDEwIEBACiAJCXJzcF9sZW5ndGggPSBSRVNQT05TRV9FTlRSWV9DTlRfMjEwMDsKIAkJaGEtPm1heF9sb29wX2lkID0gU05TX0xBU1RfTE9PUF9JRF8yMTAwOwogCQloYS0+Z2lkX2xpc3RfaW5mb19zaXplID0gNDsKKwkJaGEtPmZsYXNoX2NvbmZfb2ZmID0gfjA7CisJCWhhLT5mbGFzaF9kYXRhX29mZiA9IH4wOworCQloYS0+bnZyYW1fY29uZl9vZmYgPSB+MDsKKwkJaGEtPm52cmFtX2RhdGFfb2ZmID0gfjA7CiAJCWhhLT5pc3Bfb3BzID0gJnFsYTIxMDBfaXNwX29wczsKIAl9IGVsc2UgaWYgKElTX1FMQTIyMDAoaGEpKSB7CiAJCWhhLT5tYnhfY291bnQgPSBNQUlMQk9YX1JFR0lTVEVSX0NPVU5UOwpAQCAtMTc2Nyw2ICsxODAxLDEwIEBACiAJCXJzcF9sZW5ndGggPSBSRVNQT05TRV9FTlRSWV9DTlRfMjEwMDsKIAkJaGEtPm1heF9sb29wX2lkID0gU05TX0xBU1RfTE9PUF9JRF8yMTAwOwogCQloYS0+Z2lkX2xpc3RfaW5mb19zaXplID0gNDsKKwkJaGEtPmZsYXNoX2NvbmZfb2ZmID0gfjA7CisJCWhhLT5mbGFzaF9kYXRhX29mZiA9IH4wOworCQloYS0+bnZyYW1fY29uZl9vZmYgPSB+MDsKKwkJaGEtPm52cmFtX2RhdGFfb2ZmID0gfjA7CiAJCWhhLT5pc3Bfb3BzID0gJnFsYTIxMDBfaXNwX29wczsKIAl9IGVsc2UgaWYgKElTX1FMQTIzWFgoaGEpKSB7CiAJCWhhLT5tYnhfY291bnQgPSBNQUlMQk9YX1JFR0lTVEVSX0NPVU5UOwpAQCAtMTc3Niw2ICsxODE0LDEwIEBACiAJCWhhLT5naWRfbGlzdF9pbmZvX3NpemUgPSA2OwogCQlpZiAoSVNfUUxBMjMyMihoYSkgfHwgSVNfUUxBNjMyMihoYSkpCiAJCQloYS0+b3B0cm9tX3NpemUgPSBPUFRST01fU0laRV8yMzIyOworCQloYS0+Zmxhc2hfY29uZl9vZmYgPSB+MDsKKwkJaGEtPmZsYXNoX2RhdGFfb2ZmID0gfjA7CisJCWhhLT5udnJhbV9jb25mX29mZiA9IH4wOworCQloYS0+bnZyYW1fZGF0YV9vZmYgPSB+MDsKIAkJaGEtPmlzcF9vcHMgPSAmcWxhMjMwMF9pc3Bfb3BzOwogCX0gZWxzZSBpZiAoSVNfUUxBMjRYWF9UWVBFKGhhKSkgewogCQloYS0+bWJ4X2NvdW50ID0gTUFJTEJPWF9SRUdJU1RFUl9DT1VOVDsKQEAgLTE3ODcsNiArMTgyOSwxMCBAQAogCQloYS0+b3B0cm9tX3NpemUgPSBPUFRST01fU0laRV8yNFhYOwogCQloYS0+bnZyYW1fbnBpdl9zaXplID0gUUxBX01BWF9WUE9SVFNfUUxBMjRYWDsKIAkJaGEtPmlzcF9vcHMgPSAmcWxhMjR4eF9pc3Bfb3BzOworCQloYS0+Zmxhc2hfY29uZl9vZmYgPSBGQVJYX0FDQ0VTU19GTEFTSF9DT05GOworCQloYS0+Zmxhc2hfZGF0YV9vZmYgPSBGQVJYX0FDQ0VTU19GTEFTSF9EQVRBOworCQloYS0+bnZyYW1fY29uZl9vZmYgPSBGQVJYX0FDQ0VTU19OVlJBTV9DT05GOworCQloYS0+bnZyYW1fZGF0YV9vZmYgPSBGQVJYX0FDQ0VTU19OVlJBTV9EQVRBOwogCX0gZWxzZSBpZiAoSVNfUUxBMjVYWChoYSkpIHsKIAkJaGEtPm1ieF9jb3VudCA9IE1BSUxCT1hfUkVHSVNURVJfQ09VTlQ7CiAJCXJlcV9sZW5ndGggPSBSRVFVRVNUX0VOVFJZX0NOVF8yNFhYOwpAQCAtMTc5Nyw2ICsxODQzLDIzIEBACiAJCWhhLT5vcHRyb21fc2l6ZSA9IE9QVFJPTV9TSVpFXzI1WFg7CiAJCWhhLT5udnJhbV9ucGl2X3NpemUgPSBRTEFfTUFYX1ZQT1JUU19RTEEyNVhYOwogCQloYS0+aXNwX29wcyA9ICZxbGEyNXh4X2lzcF9vcHM7CisJCWhhLT5mbGFzaF9jb25mX29mZiA9IEZBUlhfQUNDRVNTX0ZMQVNIX0NPTkY7CisJCWhhLT5mbGFzaF9kYXRhX29mZiA9IEZBUlhfQUNDRVNTX0ZMQVNIX0RBVEE7CisJCWhhLT5udnJhbV9jb25mX29mZiA9IEZBUlhfQUNDRVNTX05WUkFNX0NPTkY7CisJCWhhLT5udnJhbV9kYXRhX29mZiA9IEZBUlhfQUNDRVNTX05WUkFNX0RBVEE7CisJfSBlbHNlIGlmIChJU19RTEE4MVhYKGhhKSkgeworCQloYS0+bWJ4X2NvdW50ID0gTUFJTEJPWF9SRUdJU1RFUl9DT1VOVDsKKwkJcmVxX2xlbmd0aCA9IFJFUVVFU1RfRU5UUllfQ05UXzI0WFg7CisJCXJzcF9sZW5ndGggPSBSRVNQT05TRV9FTlRSWV9DTlRfMjMwMDsKKwkJaGEtPm1heF9sb29wX2lkID0gU05TX0xBU1RfTE9PUF9JRF8yMzAwOworCQloYS0+aW5pdF9jYl9zaXplID0gc2l6ZW9mKHN0cnVjdCBtaWRfaW5pdF9jYl84MXh4KTsKKwkJaGEtPmdpZF9saXN0X2luZm9fc2l6ZSA9IDg7CisJCWhhLT5vcHRyb21fc2l6ZSA9IE9QVFJPTV9TSVpFXzgxWFg7CisJCWhhLT5pc3Bfb3BzID0gJnFsYTgxeHhfaXNwX29wczsKKwkJaGEtPmZsYXNoX2NvbmZfb2ZmID0gRkFSWF9BQ0NFU1NfRkxBU0hfQ09ORl84MVhYOworCQloYS0+Zmxhc2hfZGF0YV9vZmYgPSBGQVJYX0FDQ0VTU19GTEFTSF9EQVRBXzgxWFg7CisJCWhhLT5udnJhbV9jb25mX29mZiA9IH4wOworCQloYS0+bnZyYW1fZGF0YV9vZmYgPSB+MDsKIAl9CiAKIAltdXRleF9pbml0KCZoYS0+dnBvcnRfbG9jayk7CkBAIC0yNDU4LDIzICsyNTIxLDYgQEAKIAlyZXR1cm4gcWxhMngwMF9wb3N0X3dvcmsodmhhLCBlLCAxKTsKIH0KIAotaW50Ci1xbGEyeDAwX3Bvc3RfaHdlX3dvcmsoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwgdWludDE2X3QgY29kZSwgdWludDE2X3QgZDEsCi0gICAgdWludDE2X3QgZDIsIHVpbnQxNl90IGQzKQotewotCXN0cnVjdCBxbGFfd29ya19ldnQgKmU7Ci0KLQllID0gcWxhMngwMF9hbGxvY193b3JrKHZoYSwgUUxBX0VWVF9IV0VfTE9HLCAxKTsKLQlpZiAoIWUpCi0JCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwotCi0JZS0+dS5od2UuY29kZSA9IGNvZGU7Ci0JZS0+dS5od2UuZDEgPSBkMTsKLQllLT51Lmh3ZS5kMiA9IGQyOwotCWUtPnUuaHdlLmQzID0gZDM7Ci0JcmV0dXJuIHFsYTJ4MDBfcG9zdF93b3JrKHZoYSwgZSwgMSk7Ci19Ci0KIHN0YXRpYyB2b2lkCiBxbGEyeDAwX2RvX3dvcmsoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSkKIHsKQEAgLTI0OTIsMTAgKzI1MzgsNiBAQAogCQkJZmNfaG9zdF9wb3N0X2V2ZW50KHZoYS0+aG9zdCwgZmNfZ2V0X2V2ZW50X251bWJlcigpLAogCQkJICAgIGUtPnUuYWVuLmNvZGUsIGUtPnUuYWVuLmRhdGEpOwogCQkJYnJlYWs7Ci0JCWNhc2UgUUxBX0VWVF9IV0VfTE9HOgotCQkJcWxhMnh4eF9od19ldmVudF9sb2codmhhLCBlLT51Lmh3ZS5jb2RlLCBlLT51Lmh3ZS5kMSwKLQkJCSAgICBlLT51Lmh3ZS5kMiwgZS0+dS5od2UuZDMpOwotCQkJYnJlYWs7CiAJCX0KIAkJaWYgKGUtPmZsYWdzICYgUUxBX0VWVF9GTEFHX0ZSRUUpCiAJCQlrZnJlZShlKTsKQEAgLTI5MTQsMTMgKzI5NTYsMTQgQEAKIAogLyogRmlybXdhcmUgaW50ZXJmYWNlIHJvdXRpbmVzLiAqLwogCi0jZGVmaW5lIEZXX0JMT0JTCTYKKyNkZWZpbmUgRldfQkxPQlMJNwogI2RlZmluZSBGV19JU1AyMVhYCTAKICNkZWZpbmUgRldfSVNQMjJYWAkxCiAjZGVmaW5lIEZXX0lTUDIzMDAJMgogI2RlZmluZSBGV19JU1AyMzIyCTMKICNkZWZpbmUgRldfSVNQMjRYWAk0CiAjZGVmaW5lIEZXX0lTUDI1WFgJNQorI2RlZmluZSBGV19JU1A4MVhYCTYKIAogI2RlZmluZSBGV19GSUxFX0lTUDIxWFgJInFsMjEwMF9mdy5iaW4iCiAjZGVmaW5lIEZXX0ZJTEVfSVNQMjJYWAkicWwyMjAwX2Z3LmJpbiIKQEAgLTI5MjgsNiArMjk3MSw3IEBACiAjZGVmaW5lIEZXX0ZJTEVfSVNQMjMyMgkicWwyMzIyX2Z3LmJpbiIKICNkZWZpbmUgRldfRklMRV9JU1AyNFhYCSJxbDI0MDBfZncuYmluIgogI2RlZmluZSBGV19GSUxFX0lTUDI1WFgJInFsMjUwMF9mdy5iaW4iCisjZGVmaW5lIEZXX0ZJTEVfSVNQODFYWAkicWw4MTAwX2Z3LmJpbiIKIAogc3RhdGljIERFRklORV9NVVRFWChxbGFfZndfbG9jayk7CiAKQEAgLTI5MzgsNiArMjk4Miw3IEBACiAJeyAubmFtZSA9IEZXX0ZJTEVfSVNQMjMyMiwgLnNlZ3MgPSB7IDB4ODAwLCAweDFjMDAwLCAweDFlMDAwLCAwIH0sIH0sCiAJeyAubmFtZSA9IEZXX0ZJTEVfSVNQMjRYWCwgfSwKIAl7IC5uYW1lID0gRldfRklMRV9JU1AyNVhYLCB9LAorCXsgLm5hbWUgPSBGV19GSUxFX0lTUDgxWFgsIH0sCiB9OwogCiBzdHJ1Y3QgZndfYmxvYiAqCkBAIC0yOTU5LDYgKzMwMDQsOCBAQAogCQlibG9iID0gJnFsYV9md19ibG9ic1tGV19JU1AyNFhYXTsKIAl9IGVsc2UgaWYgKElTX1FMQTI1WFgoaGEpKSB7CiAJCWJsb2IgPSAmcWxhX2Z3X2Jsb2JzW0ZXX0lTUDI1WFhdOworCX0gZWxzZSBpZiAoSVNfUUxBODFYWChoYSkpIHsKKwkJYmxvYiA9ICZxbGFfZndfYmxvYnNbRldfSVNQODFYWF07CiAJfQogCiAJbXV0ZXhfbG9jaygmcWxhX2Z3X2xvY2spOwpAQCAtMzExMiw2ICszMTU5LDcgQEAKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9RTE9HSUMsIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDU0MjIpIH0sCiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfUUxPR0lDLCBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1A1NDMyKSB9LAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1FMT0dJQywgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMjUzMikgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9RTE9HSUMsIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDgwMDEpIH0sCiAJeyAwIH0sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHFsYTJ4eHhfcGNpX3RibCk7CkBAIC0zMjAwLDMgKzMyNDgsNCBAQAogTU9EVUxFX0ZJUk1XQVJFKEZXX0ZJTEVfSVNQMjMyMik7CiBNT0RVTEVfRklSTVdBUkUoRldfRklMRV9JU1AyNFhYKTsKIE1PRFVMRV9GSVJNV0FSRShGV19GSUxFX0lTUDI1WFgpOworTU9EVUxFX0ZJUk1XQVJFKEZXX0ZJTEVfSVNQODFYWCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfc3VwLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfc3VwLmMKaW5kZXggYzUzOGVlMS4uMzAzZjhlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3N1cC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9zdXAuYwpAQCAtNDI1LDI3ICs0MjUsMjcgQEAKICNkZWZpbmUgT1BUUk9NX0JVUlNUX0RXT1JEUwkoT1BUUk9NX0JVUlNUX1NJWkUgLyA0KQogCiBzdGF0aWMgaW5saW5lIHVpbnQzMl90Ci1mbGFzaF9jb25mX3RvX2FjY2Vzc19hZGRyKHVpbnQzMl90IGZhZGRyKQorZmxhc2hfY29uZl9hZGRyKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsIHVpbnQzMl90IGZhZGRyKQogewotCXJldHVybiBGQVJYX0FDQ0VTU19GTEFTSF9DT05GIHwgZmFkZHI7CisJcmV0dXJuIGhhLT5mbGFzaF9jb25mX29mZiB8IGZhZGRyOwogfQogCiBzdGF0aWMgaW5saW5lIHVpbnQzMl90Ci1mbGFzaF9kYXRhX3RvX2FjY2Vzc19hZGRyKHVpbnQzMl90IGZhZGRyKQorZmxhc2hfZGF0YV9hZGRyKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsIHVpbnQzMl90IGZhZGRyKQogewotCXJldHVybiBGQVJYX0FDQ0VTU19GTEFTSF9EQVRBIHwgZmFkZHI7CisJcmV0dXJuIGhhLT5mbGFzaF9kYXRhX29mZiB8IGZhZGRyOwogfQogCiBzdGF0aWMgaW5saW5lIHVpbnQzMl90Ci1udnJhbV9jb25mX3RvX2FjY2Vzc19hZGRyKHVpbnQzMl90IG5hZGRyKQorbnZyYW1fY29uZl9hZGRyKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsIHVpbnQzMl90IG5hZGRyKQogewotCXJldHVybiBGQVJYX0FDQ0VTU19OVlJBTV9DT05GIHwgbmFkZHI7CisJcmV0dXJuIGhhLT5udnJhbV9jb25mX29mZiB8IG5hZGRyOwogfQogCiBzdGF0aWMgaW5saW5lIHVpbnQzMl90Ci1udnJhbV9kYXRhX3RvX2FjY2Vzc19hZGRyKHVpbnQzMl90IG5hZGRyKQorbnZyYW1fZGF0YV9hZGRyKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsIHVpbnQzMl90IG5hZGRyKQogewotCXJldHVybiBGQVJYX0FDQ0VTU19OVlJBTV9EQVRBIHwgbmFkZHI7CisJcmV0dXJuIGhhLT5udnJhbV9kYXRhX29mZiB8IG5hZGRyOwogfQogCiBzdGF0aWMgdWludDMyX3QKQEAgLTQ4MSwxMCArNDgxLDEyIEBACiAgICAgdWludDMyX3QgZHdvcmRzKQogewogCXVpbnQzMl90IGk7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisKIAkvKiBEd29yZCByZWFkcyB0byBmbGFzaC4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgZHdvcmRzOyBpKyssIGZhZGRyKyspCi0JCWR3cHRyW2ldID0gY3B1X3RvX2xlMzIocWxhMjR4eF9yZWFkX2ZsYXNoX2R3b3JkKHZoYS0+aHcsCi0JCSAgICBmbGFzaF9kYXRhX3RvX2FjY2Vzc19hZGRyKGZhZGRyKSkpOworCQlkd3B0cltpXSA9IGNwdV90b19sZTMyKHFsYTI0eHhfcmVhZF9mbGFzaF9kd29yZChoYSwKKwkJICAgIGZsYXNoX2RhdGFfYWRkcihoYSwgZmFkZHIpKSk7CiAKIAlyZXR1cm4gZHdwdHI7CiB9CkBAIC01MTgsNyArNTIwLDcgQEAKIHsKIAl1aW50MzJfdCBpZHM7CiAKLQlpZHMgPSBxbGEyNHh4X3JlYWRfZmxhc2hfZHdvcmQoaGEsIGZsYXNoX2RhdGFfdG9fYWNjZXNzX2FkZHIoMHhkMDNhYikpOworCWlkcyA9IHFsYTI0eHhfcmVhZF9mbGFzaF9kd29yZChoYSwgZmxhc2hfY29uZl9hZGRyKGhhLCAweDAzYWIpKTsKIAkqbWFuX2lkID0gTFNCKGlkcyk7CiAJKmZsYXNoX2lkID0gTVNCKGlkcyk7CiAKQEAgLTUzMCw4ICs1MzIsNyBAQAogCQkgKiBFeGFtcGxlOiBBVE1FTCAweDAwIDAxIDQ1IDFGCiAJCSAqIEV4dHJhY3QgTUZHIGFuZCBEZXYgSUQgZnJvbSBsYXN0IHR3byBieXRlcy4KIAkJICovCi0JCWlkcyA9IHFsYTI0eHhfcmVhZF9mbGFzaF9kd29yZChoYSwKLQkJICAgIGZsYXNoX2RhdGFfdG9fYWNjZXNzX2FkZHIoMHhkMDA5ZikpOworCQlpZHMgPSBxbGEyNHh4X3JlYWRfZmxhc2hfZHdvcmQoaGEsIGZsYXNoX2NvbmZfYWRkcihoYSwgMHgwMDlmKSk7CiAJCSptYW5faWQgPSBMU0IoaWRzKTsKIAkJKmZsYXNoX2lkID0gTVNCKGlkcyk7CiAJfQpAQCAtNTU1LDkgKzU1NiwxMyBAQAogCiAJLyogQmVnaW4gd2l0aCBzYW5lIGRlZmF1bHRzLiAqLwogCWxvYyA9IGxvY2F0aW9uc1swXTsKLQkqc3RhcnQgPSBJU19RTEEyNFhYX1RZUEUoaGEpID8gRkFfRkxBU0hfTEFZT1VUX0FERFJfMjQ6Ci0JICAgIEZBX0ZMQVNIX0xBWU9VVF9BRERSOwotCisJKnN0YXJ0ID0gMDsKKwlpZiAoSVNfUUxBMjRYWF9UWVBFKGhhKSkKKwkJKnN0YXJ0ID0gRkFfRkxBU0hfTEFZT1VUX0FERFJfMjQ7CisJZWxzZSBpZiAoSVNfUUxBMjVYWChoYSkpCisJCSpzdGFydCA9IEZBX0ZMQVNIX0xBWU9VVF9BRERSOworCWVsc2UgaWYgKElTX1FMQTgxWFgoaGEpKQorCQkqc3RhcnQgPSBGQV9GTEFTSF9MQVlPVVRfQUREUl84MTsKIAkvKiBCZWdpbiB3aXRoIGZpcnN0IFBDSSBleHBhbnNpb24gUk9NIGhlYWRlci4gKi8KIAlidWYgPSAodWludDhfdCAqKXJlcS0+cmluZzsKIAlkY29kZSA9ICh1aW50MzJfdCAqKXJlcS0+cmluZzsKQEAgLTYxOCw2ICs2MjMsMjIgQEAKIHFsYTJ4eHhfZ2V0X2ZsdF9pbmZvKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCB1aW50MzJfdCBmbHRfYWRkcikKIHsKIAljb25zdCBjaGFyICpsb2MsICpsb2NhdGlvbnNbXSA9IHsgIkRFRiIsICJGTFQiIH07CisJY29uc3QgdWludDMyX3QgZGVmX2Z3W10gPQorCQl7IEZBX1JJU0NfQ09ERV9BRERSLCBGQV9SSVNDX0NPREVfQUREUiwgRkFfUklTQ19DT0RFX0FERFJfODEgfTsKKwljb25zdCB1aW50MzJfdCBkZWZfYm9vdFtdID0KKwkJeyBGQV9CT09UX0NPREVfQUREUiwgRkFfQk9PVF9DT0RFX0FERFIsIEZBX0JPT1RfQ09ERV9BRERSXzgxIH07CisJY29uc3QgdWludDMyX3QgZGVmX3ZwZF9udnJhbVtdID0KKwkJeyBGQV9WUERfTlZSQU1fQUREUiwgRkFfVlBEX05WUkFNX0FERFIsIEZBX1ZQRF9OVlJBTV9BRERSXzgxIH07CisJY29uc3QgdWludDMyX3QgZGVmX2ZkdFtdID0KKwkJeyBGQV9GTEFTSF9ERVNDUl9BRERSXzI0LCBGQV9GTEFTSF9ERVNDUl9BRERSLAorCQkJRkFfRkxBU0hfREVTQ1JfQUREUl84MSB9OworCWNvbnN0IHVpbnQzMl90IGRlZl9ucGl2X2NvbmYwW10gPQorCQl7IEZBX05QSVZfQ09ORjBfQUREUl8yNCwgRkFfTlBJVl9DT05GMF9BRERSLAorCQkJRkFfTlBJVl9DT05GMF9BRERSXzgxIH07CisJY29uc3QgdWludDMyX3QgZGVmX25waXZfY29uZjFbXSA9CisJCXsgRkFfTlBJVl9DT05GMV9BRERSXzI0LCBGQV9OUElWX0NPTkYxX0FERFIsCisJCQlGQV9OUElWX0NPTkYxX0FERFJfODEgfTsKKwl1aW50MzJfdCBkZWY7CiAJdWludDE2X3QgKndwdHI7CiAJdWludDE2X3QgY250LCBjaGtzdW07CiAJdWludDMyX3Qgc3RhcnQ7CkBAIC02NzYsMjAgKzY5NywxMiBAQAogCQljYXNlIEZMVF9SRUdfRkRUOgogCQkJaGEtPmZsdF9yZWdpb25fZmR0ID0gc3RhcnQ7CiAJCQlicmVhazsKLQkJY2FzZSBGTFRfUkVHX0hXX0VWRU5UXzA6Ci0JCQlpZiAoIVBDSV9GVU5DKGhhLT5wZGV2LT5kZXZmbikpCi0JCQkJaGEtPmZsdF9yZWdpb25faHdfZXZlbnQgPSBzdGFydDsKLQkJCWJyZWFrOwotCQljYXNlIEZMVF9SRUdfSFdfRVZFTlRfMToKLQkJCWlmIChQQ0lfRlVOQyhoYS0+cGRldi0+ZGV2Zm4pKQotCQkJCWhhLT5mbHRfcmVnaW9uX2h3X2V2ZW50ID0gc3RhcnQ7Ci0JCQlicmVhazsKIAkJY2FzZSBGTFRfUkVHX05QSVZfQ09ORl8wOgotCQkJaWYgKCFQQ0lfRlVOQyhoYS0+cGRldi0+ZGV2Zm4pKQorCQkJaWYgKCEoUENJX0ZVTkMoaGEtPnBkZXYtPmRldmZuKSAmIDEpKQogCQkJCWhhLT5mbHRfcmVnaW9uX25waXZfY29uZiA9IHN0YXJ0OwogCQkJYnJlYWs7CiAJCWNhc2UgRkxUX1JFR19OUElWX0NPTkZfMToKLQkJCWlmIChQQ0lfRlVOQyhoYS0+cGRldi0+ZGV2Zm4pKQorCQkJaWYgKFBDSV9GVU5DKGhhLT5wZGV2LT5kZXZmbikgJiAxKQogCQkJCWhhLT5mbHRfcmVnaW9uX25waXZfY29uZiA9IHN0YXJ0OwogCQkJYnJlYWs7CiAJCX0KQEAgLTY5OSwyMiArNzEyLDI0IEBACiBub19mbGFzaF9kYXRhOgogCS8qIFVzZSBoYXJkY29kZWQgZGVmYXVsdHMuICovCiAJbG9jID0gbG9jYXRpb25zWzBdOwotCWhhLT5mbHRfcmVnaW9uX2Z3ID0gRkFfUklTQ19DT0RFX0FERFI7Ci0JaGEtPmZsdF9yZWdpb25fYm9vdCA9IEZBX0JPT1RfQ09ERV9BRERSOwotCWhhLT5mbHRfcmVnaW9uX3ZwZF9udnJhbSA9IEZBX1ZQRF9OVlJBTV9BRERSOwotCWhhLT5mbHRfcmVnaW9uX2ZkdCA9IElTX1FMQTI0WFhfVFlQRShoYSkgPyBGQV9GTEFTSF9ERVNDUl9BRERSXzI0OgotCSAgICBGQV9GTEFTSF9ERVNDUl9BRERSOwotCWhhLT5mbHRfcmVnaW9uX2h3X2V2ZW50ID0gIVBDSV9GVU5DKGhhLT5wZGV2LT5kZXZmbikgPwotCSAgICBGQV9IV19FVkVOVDBfQUREUjogRkFfSFdfRVZFTlQxX0FERFI7Ci0JaGEtPmZsdF9yZWdpb25fbnBpdl9jb25mID0gIVBDSV9GVU5DKGhhLT5wZGV2LT5kZXZmbikgPwotCSAgICAoSVNfUUxBMjRYWF9UWVBFKGhhKSA/IEZBX05QSVZfQ09ORjBfQUREUl8yNDogRkFfTlBJVl9DT05GMF9BRERSKToKLQkgICAgKElTX1FMQTI0WFhfVFlQRShoYSkgPyBGQV9OUElWX0NPTkYxX0FERFJfMjQ6IEZBX05QSVZfQ09ORjFfQUREUik7CisJZGVmID0gMDsKKwlpZiAoSVNfUUxBMjRYWF9UWVBFKGhhKSkKKwkJZGVmID0gMDsKKwllbHNlIGlmIChJU19RTEEyNVhYKGhhKSkKKwkJZGVmID0gMTsKKwllbHNlIGlmIChJU19RTEE4MVhYKGhhKSkKKwkJZGVmID0gMjsKKwloYS0+Zmx0X3JlZ2lvbl9mdyA9IGRlZl9md1tkZWZdOworCWhhLT5mbHRfcmVnaW9uX2Jvb3QgPSBkZWZfYm9vdFtkZWZdOworCWhhLT5mbHRfcmVnaW9uX3ZwZF9udnJhbSA9IGRlZl92cGRfbnZyYW1bZGVmXTsKKwloYS0+Zmx0X3JlZ2lvbl9mZHQgPSBkZWZfZmR0W2RlZl07CisJaGEtPmZsdF9yZWdpb25fbnBpdl9jb25mID0gIShQQ0lfRlVOQyhoYS0+cGRldi0+ZGV2Zm4pICYgMSkgPworCSAgICBkZWZfbnBpdl9jb25mMFtkZWZdOiBkZWZfbnBpdl9jb25mMVtkZWZdOwogZG9uZToKIAlERUJVRzIocWxhX3ByaW50ayhLRVJOX0RFQlVHLCBoYSwgIkZMVFslc106IGJvb3Q9MHgleCBmdz0weCV4ICIKLQkgICAgInZwZF9udnJhbT0weCV4IGZkdD0weCV4IGZsdD0weCV4IGh3ZT0weCV4IG5waXY9MHgleC5cbiIsIGxvYywKKwkgICAgInZwZF9udnJhbT0weCV4IGZkdD0weCV4IGZsdD0weCV4IG5waXY9MHgleC5cbiIsIGxvYywKIAkgICAgaGEtPmZsdF9yZWdpb25fYm9vdCwgaGEtPmZsdF9yZWdpb25fZncsIGhhLT5mbHRfcmVnaW9uX3ZwZF9udnJhbSwKLQkgICAgaGEtPmZsdF9yZWdpb25fZmR0LCBoYS0+Zmx0X3JlZ2lvbl9mbHQsIGhhLT5mbHRfcmVnaW9uX2h3X2V2ZW50LAotCSAgICBoYS0+Zmx0X3JlZ2lvbl9ucGl2X2NvbmYpKTsKKwkgICAgaGEtPmZsdF9yZWdpb25fZmR0LCBoYS0+Zmx0X3JlZ2lvbl9mbHQsIGhhLT5mbHRfcmVnaW9uX25waXZfY29uZikpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtNzU3LDE0ICs3NzIsMTQgQEAKIAltaWQgPSBsZTE2X3RvX2NwdShmZHQtPm1hbl9pZCk7CiAJZmlkID0gbGUxNl90b19jcHUoZmR0LT5pZCk7CiAJaGEtPmZkdF93cnRfZGlzYWJsZSA9IGZkdC0+d3J0X2Rpc2FibGVfYml0czsKLQloYS0+ZmR0X2VyYXNlX2NtZCA9IGZsYXNoX2NvbmZfdG9fYWNjZXNzX2FkZHIoMHgwMzAwIHwgZmR0LT5lcmFzZV9jbWQpOworCWhhLT5mZHRfZXJhc2VfY21kID0gZmxhc2hfY29uZl9hZGRyKGhhLCAweDAzMDAgfCBmZHQtPmVyYXNlX2NtZCk7CiAJaGEtPmZkdF9ibG9ja19zaXplID0gbGUzMl90b19jcHUoZmR0LT5ibG9ja19zaXplKTsKIAlpZiAoZmR0LT51bnByb3RlY3Rfc2VjX2NtZCkgewotCQloYS0+ZmR0X3VucHJvdGVjdF9zZWNfY21kID0gZmxhc2hfY29uZl90b19hY2Nlc3NfYWRkcigweDAzMDAgfAorCQloYS0+ZmR0X3VucHJvdGVjdF9zZWNfY21kID0gZmxhc2hfY29uZl9hZGRyKGhhLCAweDAzMDAgfAogCQkgICAgZmR0LT51bnByb3RlY3Rfc2VjX2NtZCk7CiAJCWhhLT5mZHRfcHJvdGVjdF9zZWNfY21kID0gZmR0LT5wcm90ZWN0X3NlY19jbWQgPwotCQkgICAgZmxhc2hfY29uZl90b19hY2Nlc3NfYWRkcigweDAzMDAgfCBmZHQtPnByb3RlY3Rfc2VjX2NtZCk6Ci0JCSAgICBmbGFzaF9jb25mX3RvX2FjY2Vzc19hZGRyKDB4MDMzNik7CisJCSAgICBmbGFzaF9jb25mX2FkZHIoaGEsIDB4MDMwMCB8IGZkdC0+cHJvdGVjdF9zZWNfY21kKToKKwkJICAgIGZsYXNoX2NvbmZfYWRkcihoYSwgMHgwMzM2KTsKIAl9CiAJZ290byBkb25lOwogbm9fZmxhc2hfZGF0YToKQEAgLTc3Myw3ICs3ODgsNyBAQAogCW1pZCA9IG1hbl9pZDsKIAlmaWQgPSBmbGFzaF9pZDsKIAloYS0+ZmR0X3dydF9kaXNhYmxlID0gMHg5YzsKLQloYS0+ZmR0X2VyYXNlX2NtZCA9IGZsYXNoX2NvbmZfdG9fYWNjZXNzX2FkZHIoMHgwM2Q4KTsKKwloYS0+ZmR0X2VyYXNlX2NtZCA9IGZsYXNoX2NvbmZfYWRkcihoYSwgMHgwM2Q4KTsKIAlzd2l0Y2ggKG1hbl9pZCkgewogCWNhc2UgMHhiZjogLyogU1RUIGZsYXNoLiAqLwogCQlpZiAoZmxhc2hfaWQgPT0gMHg4ZSkKQEAgLTc4MiwxNiArNzk3LDE2IEBACiAJCQloYS0+ZmR0X2Jsb2NrX3NpemUgPSBGTEFTSF9CTEtfU0laRV8zMks7CiAKIAkJaWYgKGZsYXNoX2lkID09IDB4ODApCi0JCQloYS0+ZmR0X2VyYXNlX2NtZCA9IGZsYXNoX2NvbmZfdG9fYWNjZXNzX2FkZHIoMHgwMzUyKTsKKwkJCWhhLT5mZHRfZXJhc2VfY21kID0gZmxhc2hfY29uZl9hZGRyKGhhLCAweDAzNTIpOwogCQlicmVhazsKIAljYXNlIDB4MTM6IC8qIFNUIE0yNVA4MC4gKi8KIAkJaGEtPmZkdF9ibG9ja19zaXplID0gRkxBU0hfQkxLX1NJWkVfNjRLOwogCQlicmVhazsKIAljYXNlIDB4MWY6IC8qIEF0bWVsIDI2REYwODFBLiAqLwogCQloYS0+ZmR0X2Jsb2NrX3NpemUgPSBGTEFTSF9CTEtfU0laRV80SzsKLQkJaGEtPmZkdF9lcmFzZV9jbWQgPSBmbGFzaF9jb25mX3RvX2FjY2Vzc19hZGRyKDB4MDMyMCk7Ci0JCWhhLT5mZHRfdW5wcm90ZWN0X3NlY19jbWQgPSBmbGFzaF9jb25mX3RvX2FjY2Vzc19hZGRyKDB4MDMzOSk7Ci0JCWhhLT5mZHRfcHJvdGVjdF9zZWNfY21kID0gZmxhc2hfY29uZl90b19hY2Nlc3NfYWRkcigweDAzMzYpOworCQloYS0+ZmR0X2VyYXNlX2NtZCA9IGZsYXNoX2NvbmZfYWRkcihoYSwgMHgwMzIwKTsKKwkJaGEtPmZkdF91bnByb3RlY3Rfc2VjX2NtZCA9IGZsYXNoX2NvbmZfYWRkcihoYSwgMHgwMzM5KTsKKwkJaGEtPmZkdF9wcm90ZWN0X3NlY19jbWQgPSBmbGFzaF9jb25mX2FkZHIoaGEsIDB4MDMzNik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCS8qIERlZmF1bHQgdG8gNjQga2Igc2VjdG9yIHNpemUuICovCkBAIC04MTMsNyArODI4LDcgQEAKIAl1aW50MzJfdCBmbHRfYWRkcjsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAotCWlmICghSVNfUUxBMjRYWF9UWVBFKGhhKSAmJiAhSVNfUUxBMjVYWChoYSkpCisJaWYgKCFJU19RTEEyNFhYX1RZUEUoaGEpICYmICFJU19RTEEyNVhYKGhhKSAmJiAhSVNfUUxBODFYWChoYSkpCiAJCXJldHVybiBRTEFfU1VDQ0VTUzsKIAogCXJldCA9IHFsYTJ4eHhfZmluZF9mbHRfc3RhcnQodmhhLCAmZmx0X2FkZHIpOwpAQCAtODM4LDcgKzg1Myw3IEBACiAJc3RydWN0IHFsYV9ucGl2X2VudHJ5ICplbnRyeTsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAotCWlmICghSVNfUUxBMjRYWF9UWVBFKGhhKSAmJiAhSVNfUUxBMjVYWChoYSkpCisJaWYgKCFJU19RTEEyNFhYX1RZUEUoaGEpICYmICFJU19RTEEyNVhYKGhhKSAmJiAhSVNfUUxBODFYWChoYSkpCiAJCXJldHVybjsKIAogCWhhLT5pc3Bfb3BzLT5yZWFkX29wdHJvbSh2aGEsICh1aW50OF90ICopJmhkciwKQEAgLTkzMCw5ICs5NDUsOSBAQAogCQlyZXR1cm47CiAKIAkvKiBEaXNhYmxlIGZsYXNoIHdyaXRlLXByb3RlY3Rpb24uICovCi0JcWxhMjR4eF93cml0ZV9mbGFzaF9kd29yZChoYSwgZmxhc2hfY29uZl90b19hY2Nlc3NfYWRkcigweDEwMSksIDApOworCXFsYTI0eHhfd3JpdGVfZmxhc2hfZHdvcmQoaGEsIGZsYXNoX2NvbmZfYWRkcihoYSwgMHgxMDEpLCAwKTsKIAkvKiBTb21lIGZsYXNoIHBhcnRzIG5lZWQgYW4gYWRkaXRpb25hbCB6ZXJvLXdyaXRlIHRvIGNsZWFyIGJpdHMuKi8KLQlxbGEyNHh4X3dyaXRlX2ZsYXNoX2R3b3JkKGhhLCBmbGFzaF9jb25mX3RvX2FjY2Vzc19hZGRyKDB4MTAxKSwgMCk7CisJcWxhMjR4eF93cml0ZV9mbGFzaF9kd29yZChoYSwgZmxhc2hfY29uZl9hZGRyKGhhLCAweDEwMSksIDApOwogfQogCiBzdGF0aWMgdm9pZApAQCAtOTQ1LDExICs5NjAsMTAgQEAKIAkJZ290byBza2lwX3dydF9wcm90ZWN0OwogCiAJLyogRW5hYmxlIGZsYXNoIHdyaXRlLXByb3RlY3Rpb24gYW5kIHdhaXQgZm9yIGNvbXBsZXRpb24uICovCi0JcWxhMjR4eF93cml0ZV9mbGFzaF9kd29yZChoYSwgZmxhc2hfY29uZl90b19hY2Nlc3NfYWRkcigweDEwMSksCisJcWxhMjR4eF93cml0ZV9mbGFzaF9kd29yZChoYSwgZmxhc2hfY29uZl9hZGRyKGhhLCAweDEwMSksCiAJICAgIGhhLT5mZHRfd3J0X2Rpc2FibGUpOwogCWZvciAoY250ID0gMzAwOyBjbnQgJiYKLQkgICAgcWxhMjR4eF9yZWFkX2ZsYXNoX2R3b3JkKGhhLAotCQkgICAgZmxhc2hfY29uZl90b19hY2Nlc3NfYWRkcigweDAwNSkpICYgQklUXzA7CisJICAgIHFsYTI0eHhfcmVhZF9mbGFzaF9kd29yZChoYSwgZmxhc2hfY29uZl9hZGRyKGhhLCAweDAwNSkpICYgQklUXzA7CiAJICAgIGNudC0tKSB7CiAJCXVkZWxheSgxMCk7CiAJfQpAQCAtOTc3LDcgKzk5MSw3IEBACiAJcmV0ID0gUUxBX1NVQ0NFU1M7CiAKIAkvKiBQcmVwYXJlIGJ1cnN0LWNhcGFibGUgd3JpdGUgb24gc3VwcG9ydGVkIElTUHMuICovCi0JaWYgKElTX1FMQTI1WFgoaGEpICYmICEoZmFkZHIgJiAweGZmZikgJiYKKwlpZiAoKElTX1FMQTI1WFgoaGEpIHx8IElTX1FMQTgxWFgoaGEpKSAmJiAhKGZhZGRyICYgMHhmZmYpICYmCiAJICAgIGR3b3JkcyA+IE9QVFJPTV9CVVJTVF9EV09SRFMpIHsKIAkJb3B0cm9tID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBPUFRST01fQlVSU1RfU0laRSwKIAkJICAgICZvcHRyb21fZG1hLCBHRlBfS0VSTkVMKTsKQEAgLTk4OSw3ICsxMDAzLDcgQEAKIAl9CiAKIAlyZXN0X2FkZHIgPSAoaGEtPmZkdF9ibG9ja19zaXplID4+IDIpIC0gMTsKLQlzZWNfbWFzayA9IDB4ODAwMDAgLSAoaGEtPmZkdF9ibG9ja19zaXplID4+IDIpOworCXNlY19tYXNrID0gKGhhLT5vcHRyb21fc2l6ZSA+PiAyKSAtIChoYS0+ZmR0X2Jsb2NrX3NpemUgPj4gMik7CiAKIAlxbGEyNHh4X3VucHJvdGVjdF9mbGFzaChoYSk7CiAKQEAgLTEwMjQsMTMgKzEwMzgsMTMgQEAKIAkJCQkqcyA9IGNwdV90b19sZTMyKCpkKTsKIAogCQkJcmV0ID0gcWxhMngwMF9sb2FkX3JhbSh2aGEsIG9wdHJvbV9kbWEsCi0JCQkgICAgZmxhc2hfZGF0YV90b19hY2Nlc3NfYWRkcihmYWRkciksCisJCQkgICAgZmxhc2hfZGF0YV9hZGRyKGhhLCBmYWRkciksCiAJCQkgICAgT1BUUk9NX0JVUlNUX0RXT1JEUyk7CiAJCQlpZiAocmV0ICE9IFFMQV9TVUNDRVNTKSB7CiAJCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAogCQkJCSAgICAiVW5hYmxlIHRvIGJ1cnN0LXdyaXRlIG9wdHJvbSBzZWdtZW50ICIKIAkJCQkgICAgIigleC8leC8lbGx4KS5cbiIsIHJldCwKLQkJCQkgICAgZmxhc2hfZGF0YV90b19hY2Nlc3NfYWRkcihmYWRkciksCisJCQkJICAgIGZsYXNoX2RhdGFfYWRkcihoYSwgZmFkZHIpLAogCQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKW9wdHJvbV9kbWEpOwogCQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKIAkJCQkgICAgIlJldmVydGluZyB0byBzbG93LXdyaXRlLlxuIik7CkBAIC0xMDQ3LDcgKzEwNjEsNyBAQAogCQl9CiAKIAkJcmV0ID0gcWxhMjR4eF93cml0ZV9mbGFzaF9kd29yZChoYSwKLQkJICAgIGZsYXNoX2RhdGFfdG9fYWNjZXNzX2FkZHIoZmFkZHIpLCBjcHVfdG9fbGUzMigqZHdwdHIpKTsKKwkJICAgIGZsYXNoX2RhdGFfYWRkcihoYSwgZmFkZHIpLCBjcHVfdG9fbGUzMigqZHdwdHIpKTsKIAkJaWYgKHJldCAhPSBRTEFfU1VDQ0VTUykgewogCQkJREVCVUc5KHByaW50aygiJXMoJWxkKSBVbmFibGUgdG8gcHJvZ3JhbSBmbGFzaCAiCiAJCQkgICAgImFkZHJlc3M9JXggZGF0YT0leC5cbiIsIF9fZnVuY19fLApAQCAtMTA5OCwxMiArMTExMiwxMyBAQAogewogCXVpbnQzMl90IGk7CiAJdWludDMyX3QgKmR3cHRyOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCiAJLyogRHdvcmQgcmVhZHMgdG8gZmxhc2guICovCiAJZHdwdHIgPSAodWludDMyX3QgKilidWY7CiAJZm9yIChpID0gMDsgaSA8IGJ5dGVzID4+IDI7IGkrKywgbmFkZHIrKykKLQkJZHdwdHJbaV0gPSBjcHVfdG9fbGUzMihxbGEyNHh4X3JlYWRfZmxhc2hfZHdvcmQodmhhLT5odywKLQkJICAgIG52cmFtX2RhdGFfdG9fYWNjZXNzX2FkZHIobmFkZHIpKSk7CisJCWR3cHRyW2ldID0gY3B1X3RvX2xlMzIocWxhMjR4eF9yZWFkX2ZsYXNoX2R3b3JkKGhhLAorCQkgICAgbnZyYW1fZGF0YV9hZGRyKGhhLCBuYWRkcikpKTsKIAogCXJldHVybiBidWY7CiB9CkBAIC0xMTYwLDE3ICsxMTc1LDE0IEBACiAJUkRfUkVHX0RXT1JEKCZyZWctPmN0cmxfc3RhdHVzKTsJLyogUENJIFBvc3RpbmcuICovCiAKIAkvKiBEaXNhYmxlIE5WUkFNIHdyaXRlLXByb3RlY3Rpb24uICovCi0JcWxhMjR4eF93cml0ZV9mbGFzaF9kd29yZChoYSwgbnZyYW1fY29uZl90b19hY2Nlc3NfYWRkcigweDEwMSksCi0JICAgIDApOwotCXFsYTI0eHhfd3JpdGVfZmxhc2hfZHdvcmQoaGEsIG52cmFtX2NvbmZfdG9fYWNjZXNzX2FkZHIoMHgxMDEpLAotCSAgICAwKTsKKwlxbGEyNHh4X3dyaXRlX2ZsYXNoX2R3b3JkKGhhLCBudnJhbV9jb25mX2FkZHIoaGEsIDB4MTAxKSwgMCk7CisJcWxhMjR4eF93cml0ZV9mbGFzaF9kd29yZChoYSwgbnZyYW1fY29uZl9hZGRyKGhhLCAweDEwMSksIDApOwogCiAJLyogRHdvcmQgd3JpdGVzIHRvIGZsYXNoLiAqLwogCWR3cHRyID0gKHVpbnQzMl90ICopYnVmOwogCWZvciAoaSA9IDA7IGkgPCBieXRlcyA+PiAyOyBpKyssIG5hZGRyKyssIGR3cHRyKyspIHsKIAkJcmV0ID0gcWxhMjR4eF93cml0ZV9mbGFzaF9kd29yZChoYSwKLQkJICAgIG52cmFtX2RhdGFfdG9fYWNjZXNzX2FkZHIobmFkZHIpLAotCQkgICAgY3B1X3RvX2xlMzIoKmR3cHRyKSk7CisJCSAgICBudnJhbV9kYXRhX2FkZHIoaGEsIG5hZGRyKSwgY3B1X3RvX2xlMzIoKmR3cHRyKSk7CiAJCWlmIChyZXQgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJCURFQlVHOShxbGFfcHJpbnRrKCJVbmFibGUgdG8gcHJvZ3JhbSBudnJhbSBhZGRyZXNzPSV4ICIKIAkJCSAgICAiZGF0YT0leC5cbiIsIG5hZGRyLCAqZHdwdHIpKTsKQEAgLTExNzksOCArMTE5MSw3IEBACiAJfQogCiAJLyogRW5hYmxlIE5WUkFNIHdyaXRlLXByb3RlY3Rpb24uICovCi0JcWxhMjR4eF93cml0ZV9mbGFzaF9kd29yZChoYSwgbnZyYW1fY29uZl90b19hY2Nlc3NfYWRkcigweDEwMSksCi0JICAgIDB4OGMpOworCXFsYTI0eHhfd3JpdGVfZmxhc2hfZHdvcmQoaGEsIG52cmFtX2NvbmZfYWRkcihoYSwgMHgxMDEpLCAweDhjKTsKIAogCS8qIERpc2FibGUgZmxhc2ggd3JpdGUuICovCiAJV1JUX1JFR19EV09SRCgmcmVnLT5jdHJsX3N0YXR1cywKQEAgLTEyMDIsOCArMTIxMyw3IEBACiAJZHdwdHIgPSAodWludDMyX3QgKilidWY7CiAJZm9yIChpID0gMDsgaSA8IGJ5dGVzID4+IDI7IGkrKywgbmFkZHIrKykKIAkJZHdwdHJbaV0gPSBjcHVfdG9fbGUzMihxbGEyNHh4X3JlYWRfZmxhc2hfZHdvcmQoaGEsCi0JCSAgICBmbGFzaF9kYXRhX3RvX2FjY2Vzc19hZGRyKGhhLT5mbHRfcmVnaW9uX3ZwZF9udnJhbSB8Ci0JCSAgICBuYWRkcikpKTsKKwkJICAgIGZsYXNoX2RhdGFfYWRkcihoYSwgaGEtPmZsdF9yZWdpb25fdnBkX252cmFtIHwgbmFkZHIpKSk7CiAKIAlyZXR1cm4gYnVmOwogfQpAQCAtMjI0NiwxMiArMjI1NiwxMiBAQAogCQkJYnVyc3QgPSBsZWZ0OwogCiAJCXJ2YWwgPSBxbGEyeDAwX2R1bXBfcmFtKHZoYSwgb3B0cm9tX2RtYSwKLQkJICAgIGZsYXNoX2RhdGFfdG9fYWNjZXNzX2FkZHIoZmFkZHIpLCBidXJzdCk7CisJCSAgICBmbGFzaF9kYXRhX2FkZHIoaGEsIGZhZGRyKSwgYnVyc3QpOwogCQlpZiAocnZhbCkgewogCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAogCQkJICAgICJVbmFibGUgdG8gYnVyc3QtcmVhZCBvcHRyb20gc2VnbWVudCAiCiAJCQkgICAgIigleC8leC8lbGx4KS5cbiIsIHJ2YWwsCi0JCQkgICAgZmxhc2hfZGF0YV90b19hY2Nlc3NfYWRkcihmYWRkciksCisJCQkgICAgZmxhc2hfZGF0YV9hZGRyKGhhLCBmYWRkciksCiAJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylvcHRyb21fZG1hKTsKIAkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKIAkJCSAgICAiUmV2ZXJ0aW5nIHRvIHNsb3ctcmVhZC5cbiIpOwpAQCAtMjY0OCwxMDggKzI2NTgsMyBAQAogCiAJcmV0dXJuIDA7CiB9Ci0KLXN0YXRpYyBpbnQKLXFsYTJ4eHhfaHdfZXZlbnRfc3RvcmUoc2NzaV9xbGFfaG9zdF90ICp2aGEsIHVpbnQzMl90ICpmZGF0YSkKLXsKLQl1aW50MzJfdCBkWzJdLCBmYWRkcjsKLQlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKLQotCS8qIExvY2F0ZSBmaXJzdCBlbXB0eSBlbnRyeS4gKi8KLQlmb3IgKDs7KSB7Ci0JCWlmIChoYS0+aHdfZXZlbnRfcHRyID49Ci0JCSAgICBoYS0+Zmx0X3JlZ2lvbl9od19ldmVudCArIEZBX0hXX0VWRU5UX1NJWkUpIHsKLQkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkgICAgIkhXIGV2ZW50IC0tIExvZyBGdWxsIVxuIikpOwotCQkJcmV0dXJuIFFMQV9NRU1PUllfQUxMT0NfRkFJTEVEOwotCQl9Ci0KLQkJcWxhMjR4eF9yZWFkX2ZsYXNoX2RhdGEodmhhLCBkLCBoYS0+aHdfZXZlbnRfcHRyLCAyKTsKLQkJZmFkZHIgPSBmbGFzaF9kYXRhX3RvX2FjY2Vzc19hZGRyKGhhLT5od19ldmVudF9wdHIpOwotCQloYS0+aHdfZXZlbnRfcHRyICs9IEZBX0hXX0VWRU5UX0VOVFJZX1NJWkU7Ci0JCWlmIChkWzBdID09IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHhmZmZmZmZmZikgJiYKLQkJICAgIGRbMV0gPT0gX19jb25zdGFudF9jcHVfdG9fbGUzMigweGZmZmZmZmZmKSkgewotCQkJcWxhMjR4eF91bnByb3RlY3RfZmxhc2goaGEpOwotCi0JCQlxbGEyNHh4X3dyaXRlX2ZsYXNoX2R3b3JkKGhhLCBmYWRkcisrLAotCQkJICAgIGNwdV90b19sZTMyKGppZmZpZXMpKTsKLQkJCXFsYTI0eHhfd3JpdGVfZmxhc2hfZHdvcmQoaGEsIGZhZGRyKyssIDApOwotCQkJcWxhMjR4eF93cml0ZV9mbGFzaF9kd29yZChoYSwgZmFkZHIrKywgKmZkYXRhKyspOwotCQkJcWxhMjR4eF93cml0ZV9mbGFzaF9kd29yZChoYSwgZmFkZHIrKywgKmZkYXRhKTsKLQotCQkJcWxhMjR4eF9wcm90ZWN0X2ZsYXNoKGhhKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybiBRTEFfU1VDQ0VTUzsKLX0KLQotaW50Ci1xbGEyeHh4X2h3X2V2ZW50X2xvZyhzY3NpX3FsYV9ob3N0X3QgKnZoYSwgdWludDE2X3QgY29kZSwgdWludDE2X3QgZDEsCi0gICAgdWludDE2X3QgZDIsIHVpbnQxNl90IGQzKQotewotI2RlZmluZSBRTUFSSyhhLCBiLCBjLCBkKSBcCi0gICAgY3B1X3RvX2xlMzIoTFNCKGEpIDw8IDI0IHwgTFNCKGIpIDw8IDE2IHwgTFNCKGMpIDw8IDggfCBMU0IoZCkpCi0Jc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7Ci0JaW50IHJ2YWw7Ci0JdWludDMyX3QgbWFya2VyWzJdLCBmZGF0YVs0XTsKLQotCWlmIChoYS0+Zmx0X3JlZ2lvbl9od19ldmVudCA9PSAwKQotCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKLQotCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JICAgICJIVyBldmVudCAtLSBjb2RlPSV4LCBkMT0leCwgZDI9JXgsIGQzPSV4LlxuIiwgY29kZSwgZDEsIGQyLCBkMykpOwotCi0JLyogSWYgbWFya2VyIG5vdCBhbHJlYWR5IGZvdW5kLCBsb2NhdGUgb3Igd3JpdGUuICAqLwotCWlmICghaGEtPmZsYWdzLmh3X2V2ZW50X21hcmtlcl9mb3VuZCkgewotCQkvKiBDcmVhdGUgbWFya2VyLiAqLwotCQltYXJrZXJbMF0gPSBRTUFSSygnTCcsIGhhLT5md19tYWpvcl92ZXJzaW9uLAotCQkgICAgaGEtPmZ3X21pbm9yX3ZlcnNpb24sIGhhLT5md19zdWJtaW5vcl92ZXJzaW9uKTsKLQkJbWFya2VyWzFdID0gUU1BUksoUUxBX0RSSVZFUl9NQUpPUl9WRVIsIFFMQV9EUklWRVJfTUlOT1JfVkVSLAotCQkgICAgUUxBX0RSSVZFUl9QQVRDSF9WRVIsIFFMQV9EUklWRVJfQkVUQV9WRVIpOwotCi0JCS8qIExvY2F0ZSBtYXJrZXIuICovCi0JCWhhLT5od19ldmVudF9wdHIgPSBoYS0+Zmx0X3JlZ2lvbl9od19ldmVudDsKLQkJZm9yICg7OykgewotCQkJcWxhMjR4eF9yZWFkX2ZsYXNoX2RhdGEodmhhLCBmZGF0YSwgaGEtPmh3X2V2ZW50X3B0ciwKLQkJCSAgICA0KTsKLQkJCWlmIChmZGF0YVswXSA9PSBfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4ZmZmZmZmZmYpICYmCi0JCQkgICAgZmRhdGFbMV0gPT0gX19jb25zdGFudF9jcHVfdG9fbGUzMigweGZmZmZmZmZmKSkKLQkJCQlicmVhazsKLQkJCWhhLT5od19ldmVudF9wdHIgKz0gRkFfSFdfRVZFTlRfRU5UUllfU0laRTsKLQkJCWlmIChoYS0+aHdfZXZlbnRfcHRyID49Ci0JCQkgICAgaGEtPmZsdF9yZWdpb25faHdfZXZlbnQgKyBGQV9IV19FVkVOVF9TSVpFKSB7Ci0JCQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCQkgICAgIkhXIGV2ZW50IC0tIExvZyBGdWxsIVxuIikpOwotCQkJCXJldHVybiBRTEFfTUVNT1JZX0FMTE9DX0ZBSUxFRDsKLQkJCX0KLQkJCWlmIChmZGF0YVsyXSA9PSBtYXJrZXJbMF0gJiYgZmRhdGFbM10gPT0gbWFya2VyWzFdKSB7Ci0JCQkJaGEtPmZsYWdzLmh3X2V2ZW50X21hcmtlcl9mb3VuZCA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJLyogTm8gbWFya2VyLCB3cml0ZSBpdC4gKi8KLQkJaWYgKCFoYS0+ZmxhZ3MuaHdfZXZlbnRfbWFya2VyX2ZvdW5kKSB7Ci0JCQlydmFsID0gcWxhMnh4eF9od19ldmVudF9zdG9yZSh2aGEsIG1hcmtlcik7Ci0JCQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkJICAgICJIVyBldmVudCAtLSBGYWlsZWQgbWFya2VyIHdyaXRlPSV4LiFcbiIsCi0JCQkJICAgIHJ2YWwpKTsKLQkJCQlyZXR1cm4gcnZhbDsKLQkJCX0KLQkJCWhhLT5mbGFncy5od19ldmVudF9tYXJrZXJfZm91bmQgPSAxOwotCQl9Ci0JfQotCi0JLyogU3RvcmUgZXJyb3IuICAqLwotCWZkYXRhWzBdID0gY3B1X3RvX2xlMzIoY29kZSA8PCAxNiB8IGQxKTsKLQlmZGF0YVsxXSA9IGNwdV90b19sZTMyKGQyIDw8IDE2IHwgZDMpOwotCXJ2YWwgPSBxbGEyeHh4X2h3X2V2ZW50X3N0b3JlKHZoYSwgZmRhdGEpOwotCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiSFcgZXZlbnQgLS0gRmFpbGVkIGVycm9yIHdyaXRlPSV4LiFcbiIsCi0JCSAgICBydmFsKSk7Ci0JfQotCi0JcmV0dXJuIHJ2YWw7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfdmVyc2lvbi5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3ZlcnNpb24uaAppbmRleCBiZTIyZjNhLi44MDhiYWI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfdmVyc2lvbi5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV92ZXJzaW9uLmgKQEAgLTcsOSArNyw5IEBACiAvKgogICogRHJpdmVyIHZlcnNpb24KICAqLwotI2RlZmluZSBRTEEyWFhYX1ZFUlNJT04gICAgICAiOC4wMi4wMy1rMSIKKyNkZWZpbmUgUUxBMlhYWF9WRVJTSU9OICAgICAgIjguMDMuMDAtazEiCiAKICNkZWZpbmUgUUxBX0RSSVZFUl9NQUpPUl9WRVIJOAotI2RlZmluZSBRTEFfRFJJVkVSX01JTk9SX1ZFUgkyCi0jZGVmaW5lIFFMQV9EUklWRVJfUEFUQ0hfVkVSCTMKKyNkZWZpbmUgUUxBX0RSSVZFUl9NSU5PUl9WRVIJMworI2RlZmluZSBRTEFfRFJJVkVSX1BBVENIX1ZFUgkwCiAjZGVmaW5lIFFMQV9EUklWRVJfQkVUQV9WRVIJMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X21ieC5jIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X21ieC5jCmluZGV4IGM1NzdkNzkuLjA1MWIwZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9tYnguYworKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfbWJ4LmMKQEAgLTM5Miw3ICszOTIsNyBAQAogCQloYS0+aW9jYl9oaXdhdCAtPSBJT0NCX0hJV0FUX0NVU0hJT047CiAJZWxzZQogCQlkZXZfaW5mbygmaGEtPnBkZXYtPmRldiwgIldBUk5JTkchISEgIFlvdSBoYXZlIGxlc3MgdGhhbiAlZCAiCi0JCQkgICAiZmlybWFyZSBJT0NCcyBhdmFpbGFibGUgKCVkKS5cbiIsCisJCQkgICAiZmlybXdhcmUgSU9DQnMgYXZhaWxhYmxlICglZCkuXG4iLAogCQkJICAgSU9DQl9ISVdBVF9DVVNISU9OLCBoYS0+aW9jYl9oaXdhdCk7CiAKIAlyZXR1cm4gUUxBX1NVQ0NFU1M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcmFpZF9jbGFzcy5jIGIvZHJpdmVycy9zY3NpL3JhaWRfY2xhc3MuYwppbmRleCA5MTNhOTMxLi44ZTVjMTY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcmFpZF9jbGFzcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9yYWlkX2NsYXNzLmMKQEAgLTIzNyw4ICsyMzcsNyBAQAogCXJjLT5kZXYucGFyZW50ID0gZ2V0X2RldmljZShjb21wb25lbnRfZGV2KTsKIAlyYy0+bnVtID0gcmQtPmNvbXBvbmVudF9jb3VudCsrOwogCi0Jc25wcmludGYocmMtPmRldi5idXNfaWQsIHNpemVvZihyYy0+ZGV2LmJ1c19pZCksCi0JCSAiY29tcG9uZW50LSVkIiwgcmMtPm51bSk7CisJZGV2X3NldF9uYW1lKCZyYy0+ZGV2LCAiY29tcG9uZW50LSVkIiwgcmMtPm51bSk7CiAJbGlzdF9hZGRfdGFpbCgmcmMtPm5vZGUsICZyZC0+Y29tcG9uZW50X2xpc3QpOwogCXJjLT5kZXYuY2xhc3MgPSAmcmFpZF9jbGFzcy5jbGFzczsKIAllcnIgPSBkZXZpY2VfYWRkKCZyYy0+ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpLmMgYi9kcml2ZXJzL3Njc2kvc2NzaS5jCmluZGV4IGY4Yjc5ZDQuLjQyZTcyYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2kuYwpAQCAtNjUxLDEwICs2NTEsNiBAQAogCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKIAlpbnQgcnRuID0gMDsKIAotCS8qCi0JICogV2Ugd2lsbCB1c2UgYSBxdWV1ZWQgY29tbWFuZCBpZiBwb3NzaWJsZSwgb3RoZXJ3aXNlIHdlIHdpbGwKLQkgKiBlbXVsYXRlIHRoZSBxdWV1aW5nIGFuZCBjYWxsaW5nIG9mIGNvbXBsZXRpb24gZnVuY3Rpb24gb3Vyc2VsdmVzLgotCSAqLwogCWF0b21pY19pbmMoJmNtZC0+ZGV2aWNlLT5pb3JlcXVlc3RfY250KTsKIAogCS8qIGNoZWNrIGlmIHRoZSBkZXZpY2UgaXMgc3RpbGwgdXNhYmxlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9kZWJ1Zy5jIGIvZHJpdmVycy9zY3NpL3Njc2lfZGVidWcuYwppbmRleCAyN2M2MzNmLi42ZWViZDBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9kZWJ1Zy5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX2RlYnVnLmMKQEAgLTI1MDgsNyArMjUwOCw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlIHBzZXVkb19wcmltYXJ5ID0gewotCS5idXNfaWQJCT0gInBzZXVkb18wIiwKKwkuaW5pdF9uYW1lCT0gInBzZXVkb18wIiwKIAkucmVsZWFzZQk9IHBzZXVkb18wX3JlbGVhc2UsCiB9OwogCkBAIC0yNjgwLDcgKzI2ODAsNyBAQAogICAgICAgICBzZGJnX2hvc3QtPmRldi5idXMgPSAmcHNldWRvX2xsZF9idXM7CiAgICAgICAgIHNkYmdfaG9zdC0+ZGV2LnBhcmVudCA9ICZwc2V1ZG9fcHJpbWFyeTsKICAgICAgICAgc2RiZ19ob3N0LT5kZXYucmVsZWFzZSA9ICZzZGVidWdfcmVsZWFzZV9hZGFwdGVyOwotICAgICAgICBzcHJpbnRmKHNkYmdfaG9zdC0+ZGV2LmJ1c19pZCwgImFkYXB0ZXIlZCIsIHNjc2lfZGVidWdfYWRkX2hvc3QpOworICAgICAgICBkZXZfc2V0X25hbWUoJnNkYmdfaG9zdC0+ZGV2LCAiYWRhcHRlciVkIiwgc2NzaV9kZWJ1Z19hZGRfaG9zdCk7CiAKICAgICAgICAgZXJyb3IgPSBkZXZpY2VfcmVnaXN0ZXIoJnNkYmdfaG9zdC0+ZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfZXJyb3IuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX2Vycm9yLmMKaW5kZXggMzgxODM4ZS4uYWQ2YTEzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfZXJyb3IuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9lcnJvci5jCkBAIC0xMjQsMzQgKzEyNCwyMiBAQAogZW51bSBibGtfZWhfdGltZXJfcmV0dXJuIHNjc2lfdGltZXNfb3V0KHN0cnVjdCByZXF1ZXN0ICpyZXEpCiB7CiAJc3RydWN0IHNjc2lfY21uZCAqc2NtZCA9IHJlcS0+c3BlY2lhbDsKLQllbnVtIGJsa19laF90aW1lcl9yZXR1cm4gKCplaF90aW1lZF9vdXQpKHN0cnVjdCBzY3NpX2NtbmQgKik7CiAJZW51bSBibGtfZWhfdGltZXJfcmV0dXJuIHJ0biA9IEJMS19FSF9OT1RfSEFORExFRDsKIAogCXNjc2lfbG9nX2NvbXBsZXRpb24oc2NtZCwgVElNRU9VVF9FUlJPUik7CiAKIAlpZiAoc2NtZC0+ZGV2aWNlLT5ob3N0LT50cmFuc3BvcnR0LT5laF90aW1lZF9vdXQpCi0JCWVoX3RpbWVkX291dCA9IHNjbWQtPmRldmljZS0+aG9zdC0+dHJhbnNwb3J0dC0+ZWhfdGltZWRfb3V0OworCQlydG4gPSBzY21kLT5kZXZpY2UtPmhvc3QtPnRyYW5zcG9ydHQtPmVoX3RpbWVkX291dChzY21kKTsKIAllbHNlIGlmIChzY21kLT5kZXZpY2UtPmhvc3QtPmhvc3R0LT5laF90aW1lZF9vdXQpCi0JCWVoX3RpbWVkX291dCA9IHNjbWQtPmRldmljZS0+aG9zdC0+aG9zdHQtPmVoX3RpbWVkX291dDsKLQllbHNlCi0JCWVoX3RpbWVkX291dCA9IE5VTEw7CisJCXJ0biA9IHNjbWQtPmRldmljZS0+aG9zdC0+aG9zdHQtPmVoX3RpbWVkX291dChzY21kKTsKIAotCWlmIChlaF90aW1lZF9vdXQpIHsKLQkJcnRuID0gZWhfdGltZWRfb3V0KHNjbWQpOwotCQlzd2l0Y2ggKHJ0bikgewotCQljYXNlIEJMS19FSF9OT1RfSEFORExFRDoKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIHJ0bjsKLQkJfQotCX0KLQotCWlmICh1bmxpa2VseSghc2NzaV9laF9zY21kX2FkZChzY21kLCBTQ1NJX0VIX0NBTkNFTF9DTUQpKSkgeworCWlmICh1bmxpa2VseShydG4gPT0gQkxLX0VIX05PVF9IQU5ETEVEICYmCisJCSAgICAgIXNjc2lfZWhfc2NtZF9hZGQoc2NtZCwgU0NTSV9FSF9DQU5DRUxfQ01EKSkpIHsKIAkJc2NtZC0+cmVzdWx0IHw9IERJRF9USU1FX09VVCA8PCAxNjsKLQkJcmV0dXJuIEJMS19FSF9IQU5ETEVEOworCQlydG4gPSBCTEtfRUhfSEFORExFRDsKIAl9CiAKLQlyZXR1cm4gQkxLX0VIX05PVF9IQU5ETEVEOworCXJldHVybiBydG47CiB9CiAKIC8qKgpAQCAtMTY1MCw3ICsxNjM4LDcgQEAKIAkgKiBXZSB1c2UgVEFTS19JTlRFUlJVUFRJQkxFIHNvIHRoYXQgdGhlIHRocmVhZCBpcyBub3QKIAkgKiBjb3VudGVkIGFnYWluc3QgdGhlIGxvYWQgYXZlcmFnZSBhcyBhIHJ1bm5pbmcgcHJvY2Vzcy4KIAkgKiBXZSBuZXZlciBhY3R1YWxseSBnZXQgaW50ZXJydXB0ZWQgYmVjYXVzZSBrdGhyZWFkX3J1bgotCSAqIGRpc2FibGVzIHNpbmdhbCBkZWxpdmVyeSBmb3IgdGhlIGNyZWF0ZWQgdGhyZWFkLgorCSAqIGRpc2FibGVzIHNpZ25hbCBkZWxpdmVyeSBmb3IgdGhlIGNyZWF0ZWQgdGhyZWFkLgogCSAqLwogCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX2lvY3RsLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9pb2N0bC5jCmluZGV4IDJhZTRmOGYuLmI5OGY3NjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX2lvY3RsLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfaW9jdGwuYwpAQCAtMTY3LDEwICsxNjcsMTcgQEAKIHN0YXRpYyBpbnQgc2NzaV9pb2N0bF9nZXRfcGNpKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgdm9pZCBfX3VzZXIgKmFyZykKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBzY3NpX2dldF9kZXZpY2Uoc2Rldi0+aG9zdCk7CisJY29uc3QgY2hhciAqbmFtZTsKIAogICAgICAgICBpZiAoIWRldikKIAkJcmV0dXJuIC1FTlhJTzsKLSAgICAgICAgcmV0dXJuIGNvcHlfdG9fdXNlcihhcmcsIGRldi0+YnVzX2lkLCBzaXplb2YoZGV2LT5idXNfaWQpKT8gLUVGQVVMVDogMDsKKworCW5hbWUgPSBkZXZfbmFtZShkZXYpOworCisJLyogY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBpb2N0bCB3aGljaCBvbmx5IHJldHVybmVkCisJICogMjAgY2hhcmFjdGVycyAqLworICAgICAgICByZXR1cm4gY29weV90b191c2VyKGFyZywgbmFtZSwgbWluKHN0cmxlbihuYW1lKSwgKHNpemVfdCkyMCkpCisJCT8gLUVGQVVMVDogMDsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCmluZGV4IGYyZjUxZTAuLjk0MGRjMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCkBAIC05MSwyNiArOTEsMTkgQEAKIAlzY3NpX3B1dF9jb21tYW5kKGNtZCk7CiB9CiAKLS8qCi0gKiBGdW5jdGlvbjogICAgc2NzaV9xdWV1ZV9pbnNlcnQoKQorLyoqCisgKiBfX3Njc2lfcXVldWVfaW5zZXJ0IC0gcHJpdmF0ZSBxdWV1ZSBpbnNlcnRpb24KKyAqIEBjbWQ6IFRoZSBTQ1NJIGNvbW1hbmQgYmVpbmcgcmVxdWV1ZWQKKyAqIEByZWFzb246ICBUaGUgcmVhc29uIGZvciB0aGUgcmVxdWV1ZQorICogQHVuYnVzeTogV2hldGhlciB0aGUgcXVldWUgc2hvdWxkIGJlIHVuYnVzaWVkCiAgKgotICogUHVycG9zZTogICAgIEluc2VydCBhIGNvbW1hbmQgaW4gdGhlIG1pZGxldmVsIHF1ZXVlLgotICoKLSAqIEFyZ3VtZW50czogICBjbWQgICAgLSBjb21tYW5kIHRoYXQgd2UgYXJlIGFkZGluZyB0byBxdWV1ZS4KLSAqICAgICAgICAgICAgICByZWFzb24gLSB3aHkgd2UgYXJlIGluc2VydGluZyBjb21tYW5kIHRvIHF1ZXVlLgotICoKLSAqIExvY2sgc3RhdHVzOiBBc3N1bWVkIHRoYXQgbG9jayBpcyBub3QgaGVsZCB1cG9uIGVudHJ5LgotICoKLSAqIFJldHVybnM6ICAgICBOb3RoaW5nLgotICoKLSAqIE5vdGVzOiAgICAgICBXZSBkbyB0aGlzIGZvciBvbmUgb2YgdHdvIGNhc2VzLiAgRWl0aGVyIHRoZSBob3N0IGlzIGJ1c3kKLSAqICAgICAgICAgICAgICBhbmQgaXQgY2Fubm90IGFjY2VwdCBhbnkgbW9yZSBjb21tYW5kcyBmb3IgdGhlIHRpbWUgYmVpbmcsCi0gKiAgICAgICAgICAgICAgb3IgdGhlIGRldmljZSByZXR1cm5lZCBRVUVVRV9GVUxMIGFuZCBjYW4gYWNjZXB0IG5vIG1vcmUKLSAqICAgICAgICAgICAgICBjb21tYW5kcy4KLSAqIE5vdGVzOiAgICAgICBUaGlzIGNvdWxkIGJlIGNhbGxlZCBlaXRoZXIgZnJvbSBhbiBpbnRlcnJ1cHQgY29udGV4dCBvciBhCi0gKiAgICAgICAgICAgICAgbm9ybWFsIHByb2Nlc3MgY29udGV4dC4KKyAqIFRoaXMgaXMgYSBwcml2YXRlIHF1ZXVlIGluc2VydGlvbi4gIFRoZSBwdWJsaWMgaW50ZXJmYWNlCisgKiBzY3NpX3F1ZXVlX2luc2VydCgpIGFsd2F5cyBhc3N1bWVzIHRoZSBxdWV1ZSBzaG91bGQgYmUgdW5idXNpZWQKKyAqIGJlY2F1c2UgaXQncyBhbHdheXMgY2FsbGVkIGJlZm9yZSB0aGUgY29tcGxldGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMKKyAqIGZvciBhIHJlcXVldWUgYWZ0ZXIgY29tcGxldGlvbiwgd2hpY2ggc2hvdWxkIG9ubHkgb2NjdXIgaW4gdGhpcworICogZmlsZS4KICAqLwotaW50IHNjc2lfcXVldWVfaW5zZXJ0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgaW50IHJlYXNvbikKK3N0YXRpYyBpbnQgX19zY3NpX3F1ZXVlX2luc2VydChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIGludCByZWFzb24sIGludCB1bmJ1c3kpCiB7CiAJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IGNtZC0+ZGV2aWNlLT5ob3N0OwogCXN0cnVjdCBzY3NpX2RldmljZSAqZGV2aWNlID0gY21kLT5kZXZpY2U7CkBAIC0xNTAsNyArMTQzLDggQEAKIAkgKiBEZWNyZW1lbnQgdGhlIGNvdW50ZXJzLCBzaW5jZSB0aGVzZSBjb21tYW5kcyBhcmUgbm8gbG9uZ2VyCiAJICogYWN0aXZlIG9uIHRoZSBob3N0L2RldmljZS4KIAkgKi8KLQlzY3NpX2RldmljZV91bmJ1c3koZGV2aWNlKTsKKwlpZiAodW5idXN5KQorCQlzY3NpX2RldmljZV91bmJ1c3koZGV2aWNlKTsKIAogCS8qCiAJICogUmVxdWV1ZSB0aGlzIGNvbW1hbmQuICBJdCB3aWxsIGdvIGJlZm9yZSBhbGwgb3RoZXIgY29tbWFuZHMKQEAgLTE3Miw2ICsxNjYsMjkgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIEZ1bmN0aW9uOiAgICBzY3NpX3F1ZXVlX2luc2VydCgpCisgKgorICogUHVycG9zZTogICAgIEluc2VydCBhIGNvbW1hbmQgaW4gdGhlIG1pZGxldmVsIHF1ZXVlLgorICoKKyAqIEFyZ3VtZW50czogICBjbWQgICAgLSBjb21tYW5kIHRoYXQgd2UgYXJlIGFkZGluZyB0byBxdWV1ZS4KKyAqICAgICAgICAgICAgICByZWFzb24gLSB3aHkgd2UgYXJlIGluc2VydGluZyBjb21tYW5kIHRvIHF1ZXVlLgorICoKKyAqIExvY2sgc3RhdHVzOiBBc3N1bWVkIHRoYXQgbG9jayBpcyBub3QgaGVsZCB1cG9uIGVudHJ5LgorICoKKyAqIFJldHVybnM6ICAgICBOb3RoaW5nLgorICoKKyAqIE5vdGVzOiAgICAgICBXZSBkbyB0aGlzIGZvciBvbmUgb2YgdHdvIGNhc2VzLiAgRWl0aGVyIHRoZSBob3N0IGlzIGJ1c3kKKyAqICAgICAgICAgICAgICBhbmQgaXQgY2Fubm90IGFjY2VwdCBhbnkgbW9yZSBjb21tYW5kcyBmb3IgdGhlIHRpbWUgYmVpbmcsCisgKiAgICAgICAgICAgICAgb3IgdGhlIGRldmljZSByZXR1cm5lZCBRVUVVRV9GVUxMIGFuZCBjYW4gYWNjZXB0IG5vIG1vcmUKKyAqICAgICAgICAgICAgICBjb21tYW5kcy4KKyAqIE5vdGVzOiAgICAgICBUaGlzIGNvdWxkIGJlIGNhbGxlZCBlaXRoZXIgZnJvbSBhbiBpbnRlcnJ1cHQgY29udGV4dCBvciBhCisgKiAgICAgICAgICAgICAgbm9ybWFsIHByb2Nlc3MgY29udGV4dC4KKyAqLworaW50IHNjc2lfcXVldWVfaW5zZXJ0KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgaW50IHJlYXNvbikKK3sKKwlyZXR1cm4gX19zY3NpX3F1ZXVlX2luc2VydChjbWQsIHJlYXNvbiwgMSk7Cit9CiAvKioKICAqIHNjc2lfZXhlY3V0ZSAtIGluc2VydCByZXF1ZXN0IGFuZCB3YWl0IGZvciB0aGUgcmVzdWx0CiAgKiBAc2RldjoJc2NzaSBkZXZpY2UKQEAgLTY4NCw2ICs3MDEsOCBAQAogCQlzY3NpX3J1bl9xdWV1ZShzZGV2LT5yZXF1ZXN0X3F1ZXVlKTsKIH0KIAorc3RhdGljIHZvaWQgX19zY3NpX3JlbGVhc2VfYnVmZmVycyhzdHJ1Y3Qgc2NzaV9jbW5kICosIGludCk7CisKIC8qCiAgKiBGdW5jdGlvbjogICAgc2NzaV9lbmRfcmVxdWVzdCgpCiAgKgpAQCAtNzMyLDYgKzc1MSw3IEBACiAJCQkJICogbGVmdG92ZXJzIGluIHRoZSBmcm9udCBvZiB0aGUKIAkJCQkgKiBxdWV1ZSwgYW5kIGdvb3NlIHRoZSBxdWV1ZSBhZ2Fpbi4KIAkJCQkgKi8KKwkJCQlzY3NpX3JlbGVhc2VfYnVmZmVycyhjbWQpOwogCQkJCXNjc2lfcmVxdWV1ZV9jb21tYW5kKHEsIGNtZCk7CiAJCQkJY21kID0gTlVMTDsKIAkJCX0KQEAgLTc0Myw2ICs3NjMsNyBAQAogCSAqIFRoaXMgd2lsbCBnb29zZSB0aGUgcXVldWUgcmVxdWVzdCBmdW5jdGlvbiBhdCB0aGUgZW5kLCBzbyB3ZSBkb24ndAogCSAqIG5lZWQgdG8gd29ycnkgYWJvdXQgbGF1bmNoaW5nIGFub3RoZXIgY29tbWFuZC4KIAkgKi8KKwlfX3Njc2lfcmVsZWFzZV9idWZmZXJzKGNtZCwgMCk7CiAJc2NzaV9uZXh0X2NvbW1hbmQoY21kKTsKIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTc5OCw2ICs4MTksMjYgQEAKIAlfX3NnX2ZyZWVfdGFibGUoJnNkYi0+dGFibGUsIFNDU0lfTUFYX1NHX1NFR01FTlRTLCBzY3NpX3NnX2ZyZWUpOwogfQogCitzdGF0aWMgdm9pZCBfX3Njc2lfcmVsZWFzZV9idWZmZXJzKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgaW50IGRvX2JpZGlfY2hlY2spCit7CisKKwlpZiAoY21kLT5zZGIudGFibGUubmVudHMpCisJCXNjc2lfZnJlZV9zZ3RhYmxlKCZjbWQtPnNkYik7CisKKwltZW1zZXQoJmNtZC0+c2RiLCAwLCBzaXplb2YoY21kLT5zZGIpKTsKKworCWlmIChkb19iaWRpX2NoZWNrICYmIHNjc2lfYmlkaV9jbW5kKGNtZCkpIHsKKwkJc3RydWN0IHNjc2lfZGF0YV9idWZmZXIgKmJpZGlfc2RiID0KKwkJCWNtZC0+cmVxdWVzdC0+bmV4dF9ycS0+c3BlY2lhbDsKKwkJc2NzaV9mcmVlX3NndGFibGUoYmlkaV9zZGIpOworCQlrbWVtX2NhY2hlX2ZyZWUoc2NzaV9zZGJfY2FjaGUsIGJpZGlfc2RiKTsKKwkJY21kLT5yZXF1ZXN0LT5uZXh0X3JxLT5zcGVjaWFsID0gTlVMTDsKKwl9CisKKwlpZiAoc2NzaV9wcm90X3NnX2NvdW50KGNtZCkpCisJCXNjc2lfZnJlZV9zZ3RhYmxlKGNtZC0+cHJvdF9zZGIpOworfQorCiAvKgogICogRnVuY3Rpb246ICAgIHNjc2lfcmVsZWFzZV9idWZmZXJzKCkKICAqCkBAIC04MTcsMjEgKzg1OCw3IEBACiAgKi8KIHZvaWQgc2NzaV9yZWxlYXNlX2J1ZmZlcnMoc3RydWN0IHNjc2lfY21uZCAqY21kKQogewotCWlmIChjbWQtPnNkYi50YWJsZS5uZW50cykKLQkJc2NzaV9mcmVlX3NndGFibGUoJmNtZC0+c2RiKTsKLQotCW1lbXNldCgmY21kLT5zZGIsIDAsIHNpemVvZihjbWQtPnNkYikpOwotCi0JaWYgKHNjc2lfYmlkaV9jbW5kKGNtZCkpIHsKLQkJc3RydWN0IHNjc2lfZGF0YV9idWZmZXIgKmJpZGlfc2RiID0KLQkJCWNtZC0+cmVxdWVzdC0+bmV4dF9ycS0+c3BlY2lhbDsKLQkJc2NzaV9mcmVlX3NndGFibGUoYmlkaV9zZGIpOwotCQlrbWVtX2NhY2hlX2ZyZWUoc2NzaV9zZGJfY2FjaGUsIGJpZGlfc2RiKTsKLQkJY21kLT5yZXF1ZXN0LT5uZXh0X3JxLT5zcGVjaWFsID0gTlVMTDsKLQl9Ci0KLQlpZiAoc2NzaV9wcm90X3NnX2NvdW50KGNtZCkpCi0JCXNjc2lfZnJlZV9zZ3RhYmxlKGNtZC0+cHJvdF9zZGIpOworCV9fc2NzaV9yZWxlYXNlX2J1ZmZlcnMoY21kLCAxKTsKIH0KIEVYUE9SVF9TWU1CT0woc2NzaV9yZWxlYXNlX2J1ZmZlcnMpOwogCkBAIC05NDUsNyArOTcyLDYgQEAKIAl9CiAKIAlCVUdfT04oYmxrX2JpZGlfcnEocmVxKSk7IC8qIGJpZGkgbm90IHN1cHBvcnQgZm9yICFibGtfcGNfcmVxdWVzdCB5ZXQgKi8KLQlzY3NpX3JlbGVhc2VfYnVmZmVycyhjbWQpOwogCiAJLyoKIAkgKiBOZXh0IGRlYWwgd2l0aCBhbnkgc2VjdG9ycyB3aGljaCB3ZSB3ZXJlIGFibGUgdG8gY29ycmVjdGx5CkBAIC05NjMsNiArOTg5LDggQEAKIAkJcmV0dXJuOwogCXRoaXNfY291bnQgPSBibGtfcnFfYnl0ZXMocmVxKTsKIAorCWVycm9yID0gLUVJTzsKKwogCWlmIChob3N0X2J5dGUocmVzdWx0KSA9PSBESURfUkVTRVQpIHsKIAkJLyogVGhpcmQgcGFydHkgYnVzIHJlc2V0IG9yIHJlc2V0IGZvciBlcnJvciByZWNvdmVyeQogCQkgKiByZWFzb25zLiAgSnVzdCByZXRyeSB0aGUgY29tbWFuZCBhbmQgc2VlIHdoYXQKQEAgLTEwMDQsMTMgKzEwMzIsMTggQEAKIAkJCQkvKiBUaGlzIHdpbGwgaXNzdWUgYSBuZXcgNi1ieXRlIGNvbW1hbmQuICovCiAJCQkJY21kLT5kZXZpY2UtPnVzZV8xMF9mb3JfcncgPSAwOwogCQkJCWFjdGlvbiA9IEFDVElPTl9SRVBSRVA7CisJCQl9IGVsc2UgaWYgKHNzaGRyLmFzYyA9PSAweDEwKSAvKiBESVggKi8geworCQkJCWRlc2NyaXB0aW9uID0gIkhvc3QgRGF0YSBJbnRlZ3JpdHkgRmFpbHVyZSI7CisJCQkJYWN0aW9uID0gQUNUSU9OX0ZBSUw7CisJCQkJZXJyb3IgPSAtRUlMU0VROwogCQkJfSBlbHNlCiAJCQkJYWN0aW9uID0gQUNUSU9OX0ZBSUw7CiAJCQlicmVhazsKIAkJY2FzZSBBQk9SVEVEX0NPTU1BTkQ6CiAJCQlpZiAoc3NoZHIuYXNjID09IDB4MTApIHsgLyogRElGICovCisJCQkJZGVzY3JpcHRpb24gPSAiVGFyZ2V0IERhdGEgSW50ZWdyaXR5IEZhaWx1cmUiOwogCQkJCWFjdGlvbiA9IEFDVElPTl9GQUlMOwotCQkJCWRlc2NyaXB0aW9uID0gIkRhdGEgSW50ZWdyaXR5IEZhaWx1cmUiOworCQkJCWVycm9yID0gLUVJTFNFUTsKIAkJCX0gZWxzZQogCQkJCWFjdGlvbiA9IEFDVElPTl9SRVRSWTsKIAkJCWJyZWFrOwpAQCAtMTAyOSw2ICsxMDYyLDEwIEBACiAJCQkJY2FzZSAweDA5OiAvKiBzZWxmIHRlc3QgaW4gcHJvZ3Jlc3MgKi8KIAkJCQkJYWN0aW9uID0gQUNUSU9OX0RFTEFZRURfUkVUUlk7CiAJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWRlc2NyaXB0aW9uID0gIkRldmljZSBub3QgcmVhZHkiOworCQkJCQlhY3Rpb24gPSBBQ1RJT05fRkFJTDsKKwkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQlkZXNjcmlwdGlvbiA9ICJEZXZpY2Ugbm90IHJlYWR5IjsKQEAgLTEwNTIsOSArMTA4OSwxMCBAQAogCXN3aXRjaCAoYWN0aW9uKSB7CiAJY2FzZSBBQ1RJT05fRkFJTDoKIAkJLyogR2l2ZSB1cCBhbmQgZmFpbCB0aGUgcmVtYWluZGVyIG9mIHRoZSByZXF1ZXN0ICovCisJCXNjc2lfcmVsZWFzZV9idWZmZXJzKGNtZCk7CiAJCWlmICghKHJlcS0+Y21kX2ZsYWdzICYgUkVRX1FVSUVUKSkgewogCQkJaWYgKGRlc2NyaXB0aW9uKQotCQkJCXNjbWRfcHJpbnRrKEtFUk5fSU5GTywgY21kLCAiJXMiLAorCQkJCXNjbWRfcHJpbnRrKEtFUk5fSU5GTywgY21kLCAiJXNcbiIsCiAJCQkJCSAgICBkZXNjcmlwdGlvbik7CiAJCQlzY3NpX3ByaW50X3Jlc3VsdChjbWQpOwogCQkJaWYgKGRyaXZlcl9ieXRlKHJlc3VsdCkgJiBEUklWRVJfU0VOU0UpCkBAIC0xMDY3LDE1ICsxMTA1LDE2IEBACiAJCS8qIFVucHJlcCB0aGUgcmVxdWVzdCBhbmQgcHV0IGl0IGJhY2sgYXQgdGhlIGhlYWQgb2YgdGhlIHF1ZXVlLgogCQkgKiBBIG5ldyBjb21tYW5kIHdpbGwgYmUgcHJlcGFyZWQgYW5kIGlzc3VlZC4KIAkJICovCisJCXNjc2lfcmVsZWFzZV9idWZmZXJzKGNtZCk7CiAJCXNjc2lfcmVxdWV1ZV9jb21tYW5kKHEsIGNtZCk7CiAJCWJyZWFrOwogCWNhc2UgQUNUSU9OX1JFVFJZOgogCQkvKiBSZXRyeSB0aGUgc2FtZSBjb21tYW5kIGltbWVkaWF0ZWx5ICovCi0JCXNjc2lfcXVldWVfaW5zZXJ0KGNtZCwgU0NTSV9NTFFVRVVFX0VIX1JFVFJZKTsKKwkJX19zY3NpX3F1ZXVlX2luc2VydChjbWQsIFNDU0lfTUxRVUVVRV9FSF9SRVRSWSwgMCk7CiAJCWJyZWFrOwogCWNhc2UgQUNUSU9OX0RFTEFZRURfUkVUUlk6CiAJCS8qIFJldHJ5IHRoZSBzYW1lIGNvbW1hbmQgYWZ0ZXIgYSBkZWxheSAqLwotCQlzY3NpX3F1ZXVlX2luc2VydChjbWQsIFNDU0lfTUxRVUVVRV9ERVZJQ0VfQlVTWSk7CisJCV9fc2NzaV9xdWV1ZV9pbnNlcnQoY21kLCBTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1ksIDApOwogCQlicmVhazsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9zY2FuLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9zY2FuLmMKaW5kZXggMTg0ODZiNS4uNjY1MDViYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfc2Nhbi5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3NjYW4uYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYXN5bmMuaD4KIAogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CkBAIC0xNzksNiArMTgwLDggQEAKIAlzcGluX3VubG9jaygmYXN5bmNfc2Nhbl9sb2NrKTsKIAogCWtmcmVlKGRhdGEpOworCS8qIFN5bmNocm9uaXplIGFzeW5jIG9wZXJhdGlvbnMgZ2xvYmFsbHkgKi8KKwlhc3luY19zeW5jaHJvbml6ZV9mdWxsKCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQxMSw4ICs0MTQsNyBAQAogCWRldmljZV9pbml0aWFsaXplKGRldik7CiAJc3RhcmdldC0+cmVhcF9yZWYgPSAxOwogCWRldi0+cGFyZW50ID0gZ2V0X2RldmljZShwYXJlbnQpOwotCXNwcmludGYoZGV2LT5idXNfaWQsICJ0YXJnZXQlZDolZDolZCIsCi0JCXNob3N0LT5ob3N0X25vLCBjaGFubmVsLCBpZCk7CisJZGV2X3NldF9uYW1lKGRldiwgInRhcmdldCVkOiVkOiVkIiwgc2hvc3QtPmhvc3Rfbm8sIGNoYW5uZWwsIGlkKTsKICNpZm5kZWYgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQKIAlkZXYtPmJ1cyA9ICZzY3NpX2J1c190eXBlOwogI2VuZGlmCkBAIC0xMDIxLDcgKzEwMjMsNyBAQAogCQlpZiAocmVzY2FuIHx8ICFzY3NpX2RldmljZV9jcmVhdGVkKHNkZXYpKSB7CiAJCQlTQ1NJX0xPR19TQ0FOX0JVUygzLCBwcmludGsoS0VSTl9JTkZPCiAJCQkJInNjc2kgc2NhbjogZGV2aWNlIGV4aXN0cyBvbiAlc1xuIiwKLQkJCQlzZGV2LT5zZGV2X2dlbmRldi5idXNfaWQpKTsKKwkJCQlkZXZfbmFtZSgmc2Rldi0+c2Rldl9nZW5kZXYpKSk7CiAJCQlpZiAoc2RldnApCiAJCQkJKnNkZXZwID0gc2RldjsKIAkJCWVsc2UKQEAgLTExNjAsNyArMTE2Miw3IEBACiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkZXZfdG9fc2hvc3Qoc3RhcmdldC0+ZGV2LnBhcmVudCk7CiAKIAlTQ1NJX0xPR19TQ0FOX0JVUygzLCBwcmludGsoS0VSTl9JTkZPICJzY3NpIHNjYW46IFNlcXVlbnRpYWwgc2NhbiBvZiIKLQkJCQkgICAgIiVzXG4iLCBzdGFyZ2V0LT5kZXYuYnVzX2lkKSk7CisJCQkJICAgICIlc1xuIiwgZGV2X25hbWUoJnN0YXJnZXQtPmRldikpKTsKIAogCW1heF9kZXZfbHVuID0gbWluKG1heF9zY3NpX2x1bnMsIHNob3N0LT5tYXhfbHVuKTsKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfc3lzZnMuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3N5c2ZzLmMKaW5kZXggOTNjMjhmMy4uZGE2MzgwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfc3lzZnMuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9zeXNmcy5jCkBAIC0xMDc5LDE2ICsxMDc5LDE0IEBACiAJZGV2aWNlX2luaXRpYWxpemUoJnNkZXYtPnNkZXZfZ2VuZGV2KTsKIAlzZGV2LT5zZGV2X2dlbmRldi5idXMgPSAmc2NzaV9idXNfdHlwZTsKIAlzZGV2LT5zZGV2X2dlbmRldi50eXBlID0gJnNjc2lfZGV2X3R5cGU7Ci0Jc3ByaW50ZihzZGV2LT5zZGV2X2dlbmRldi5idXNfaWQsIiVkOiVkOiVkOiVkIiwKLQkJc2Rldi0+aG9zdC0+aG9zdF9ubywgc2Rldi0+Y2hhbm5lbCwgc2Rldi0+aWQsCi0JCXNkZXYtPmx1bik7Ci0JCisJZGV2X3NldF9uYW1lKCZzZGV2LT5zZGV2X2dlbmRldiwgIiVkOiVkOiVkOiVkIiwKKwkJICAgICBzZGV2LT5ob3N0LT5ob3N0X25vLCBzZGV2LT5jaGFubmVsLCBzZGV2LT5pZCwgc2Rldi0+bHVuKTsKKwogCWRldmljZV9pbml0aWFsaXplKCZzZGV2LT5zZGV2X2Rldik7CiAJc2Rldi0+c2Rldl9kZXYucGFyZW50ID0gJnNkZXYtPnNkZXZfZ2VuZGV2OwogCXNkZXYtPnNkZXZfZGV2LmNsYXNzID0gJnNkZXZfY2xhc3M7Ci0Jc25wcmludGYoc2Rldi0+c2Rldl9kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwKLQkJICIlZDolZDolZDolZCIsIHNkZXYtPmhvc3QtPmhvc3Rfbm8sCi0JCSBzZGV2LT5jaGFubmVsLCBzZGV2LT5pZCwgc2Rldi0+bHVuKTsKKwlkZXZfc2V0X25hbWUoJnNkZXYtPnNkZXZfZGV2LCAiJWQ6JWQ6JWQ6JWQiLAorCQkgICAgIHNkZXYtPmhvc3QtPmhvc3Rfbm8sIHNkZXYtPmNoYW5uZWwsIHNkZXYtPmlkLCBzZGV2LT5sdW4pOwogCXNkZXYtPnNjc2lfbGV2ZWwgPSBzdGFyZ2V0LT5zY3NpX2xldmVsOwogCXRyYW5zcG9ydF9zZXR1cF9kZXZpY2UoJnNkZXYtPnNkZXZfZ2VuZGV2KTsKIAlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfZmMuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5jCmluZGV4IDA2MjMwNGQuLjVmNzc0MTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5jCkBAIC0yNDA3LDggKzI0MDcsMTIgQEAKIAkvKgogCSAqIE5vdGlmeSB0aGUgZHJpdmVyIHRoYXQgdGhlIHJwb3J0IGlzIG5vdyBkZWFkLiBUaGUgTExERCB3aWxsCiAJICogYWxzbyBndWFyYW50ZWUgdGhhdCBhbnkgY29tbXVuaWNhdGlvbiB0byB0aGUgcnBvcnQgaXMgdGVybWluYXRlZAorCSAqCisJICogQXZvaWQgdGhpcyBjYWxsIGlmIHdlIGFscmVhZHkgY2FsbGVkIGl0IHdoZW4gd2UgcHJlc2VydmVkIHRoZQorCSAqIHJwb3J0IGZvciB0aGUgYmluZGluZy4KIAkgKi8KLQlpZiAoaS0+Zi0+ZGV2X2xvc3NfdG1vX2NhbGxiaykKKwlpZiAoIShycG9ydC0+ZmxhZ3MgJiBGQ19SUE9SVF9ERVZMT1NTX0NBTExCS19ET05FKSAmJgorCSAgICAoaS0+Zi0+ZGV2X2xvc3NfdG1vX2NhbGxiaykpCiAJCWktPmYtPmRldl9sb3NzX3Rtb19jYWxsYmsocnBvcnQpOwogCiAJdHJhbnNwb3J0X3JlbW92ZV9kZXZpY2UoZGV2KTsKQEAgLTI0ODYsOCArMjQ5MCw4IEBACiAJZGV2aWNlX2luaXRpYWxpemUoZGV2KTsJCQkvKiB0YWtlcyBzZWxmIHJlZmVyZW5jZSAqLwogCWRldi0+cGFyZW50ID0gZ2V0X2RldmljZSgmc2hvc3QtPnNob3N0X2dlbmRldik7IC8qIHBhcmVudCByZWZlcmVuY2UgKi8KIAlkZXYtPnJlbGVhc2UgPSBmY19ycG9ydF9kZXZfcmVsZWFzZTsKLQlzcHJpbnRmKGRldi0+YnVzX2lkLCAicnBvcnQtJWQ6JWQtJWQiLAotCQlzaG9zdC0+aG9zdF9ubywgY2hhbm5lbCwgcnBvcnQtPm51bWJlcik7CisJZGV2X3NldF9uYW1lKGRldiwgInJwb3J0LSVkOiVkLSVkIiwKKwkJICAgICBzaG9zdC0+aG9zdF9ubywgY2hhbm5lbCwgcnBvcnQtPm51bWJlcik7CiAJdHJhbnNwb3J0X3NldHVwX2RldmljZShkZXYpOwogCiAJZXJyb3IgPSBkZXZpY2VfYWRkKGRldik7CkBAIC0yNjQ3LDcgKzI2NTEsOCBAQAogCQkJCXNwaW5fbG9ja19pcnFzYXZlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIAogCQkJCXJwb3J0LT5mbGFncyAmPSB+KEZDX1JQT1JUX0ZBU1RfRkFJTF9USU1FRE9VVCB8Ci0JCQkJCQkgIEZDX1JQT1JUX0RFVkxPU1NfUEVORElORyk7CisJCQkJCQkgIEZDX1JQT1JUX0RFVkxPU1NfUEVORElORyB8CisJCQkJCQkgIEZDX1JQT1JUX0RFVkxPU1NfQ0FMTEJLX0RPTkUpOwogCiAJCQkJLyogaWYgdGFyZ2V0LCBpbml0aWF0ZSBhIHNjYW4gKi8KIAkJCQlpZiAocnBvcnQtPnNjc2lfdGFyZ2V0X2lkICE9IC0xKSB7CkBAIC0yOTQ0LDYgKzI5NDksNyBAQAogCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQgPQogCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGZjX3Jwb3J0LCBkZXZfbG9zc193b3JrLndvcmspOwogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gcnBvcnRfdG9fc2hvc3QocnBvcnQpOworCXN0cnVjdCBmY19pbnRlcm5hbCAqaSA9IHRvX2ZjX2ludGVybmFsKHNob3N0LT50cmFuc3BvcnR0KTsKIAlzdHJ1Y3QgZmNfaG9zdF9hdHRycyAqZmNfaG9zdCA9IHNob3N0X3RvX2ZjX2hvc3Qoc2hvc3QpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTMwMTEsNiArMzAxNyw3IEBACiAJcnBvcnQtPnJvbGVzID0gRkNfUE9SVF9ST0xFX1VOS05PV047CiAJcnBvcnQtPnBvcnRfc3RhdGUgPSBGQ19QT1JUU1RBVEVfTk9UUFJFU0VOVDsKIAlycG9ydC0+ZmxhZ3MgJj0gfkZDX1JQT1JUX0ZBU1RfRkFJTF9USU1FRE9VVDsKKwlycG9ydC0+ZmxhZ3MgfD0gRkNfUlBPUlRfREVWTE9TU19DQUxMQktfRE9ORTsKIAogCS8qCiAJICogUHJlLWVtcHRpdmVseSBraWxsIEkvTyByYXRoZXIgdGhhbiB3YWl0aW5nIGZvciB0aGUgd29yayBxdWV1ZQpAQCAtMzA0Niw4ICszMDUzLDE4IEBACiAJICogYWxsIGF0dGFjaGVkIHNjc2kgZGV2aWNlcy4KIAkgKi8KIAlmY19xdWV1ZV93b3JrKHNob3N0LCAmcnBvcnQtPnN0Z3RfZGVsZXRlX3dvcmspOworCisJLyoKKwkgKiBOb3RpZnkgdGhlIGRyaXZlciB0aGF0IHRoZSBycG9ydCBpcyBub3cgZGVhZC4gVGhlIExMREQgd2lsbAorCSAqIGFsc28gZ3VhcmFudGVlIHRoYXQgYW55IGNvbW11bmljYXRpb24gdG8gdGhlIHJwb3J0IGlzIHRlcm1pbmF0ZWQKKwkgKgorCSAqIE5vdGU6IHdlIHNldCB0aGUgQ0FMTEJLX0RPTkUgZmxhZyBhYm92ZSB0byBjb3JyZXNwb25kCisJICovCisJaWYgKGktPmYtPmRldl9sb3NzX3Rtb19jYWxsYmspCisJCWktPmYtPmRldl9sb3NzX3Rtb19jYWxsYmsocnBvcnQpOwogfQogCisKIC8qKgogICogZmNfdGltZW91dF9mYWlsX3Jwb3J0X2lvIC0gVGltZW91dCBoYW5kbGVyIGZvciBhIGZhc3QgaW8gZmFpbGluZyBvbiBhIGRpc2Nvbm5lY3RlZCBTQ1NJIHRhcmdldC4KICAqIEB3b3JrOglycG9ydCB0byB0ZXJtaW5hdGUgaW8gb24uCkBAIC0zMTY0LDggKzMxODEsOCBAQAogCWRldmljZV9pbml0aWFsaXplKGRldik7CQkJLyogdGFrZXMgc2VsZiByZWZlcmVuY2UgKi8KIAlkZXYtPnBhcmVudCA9IGdldF9kZXZpY2UocGRldik7CQkvKiB0YWtlcyBwYXJlbnQgcmVmZXJlbmNlICovCiAJZGV2LT5yZWxlYXNlID0gZmNfdnBvcnRfZGV2X3JlbGVhc2U7Ci0Jc3ByaW50ZihkZXYtPmJ1c19pZCwgInZwb3J0LSVkOiVkLSVkIiwKLQkJc2hvc3QtPmhvc3Rfbm8sIGNoYW5uZWwsIHZwb3J0LT5udW1iZXIpOworCWRldl9zZXRfbmFtZShkZXYsICJ2cG9ydC0lZDolZC0lZCIsCisJCSAgICAgc2hvc3QtPmhvc3Rfbm8sIGNoYW5uZWwsIHZwb3J0LT5udW1iZXIpOwogCXRyYW5zcG9ydF9zZXR1cF9kZXZpY2UoZGV2KTsKIAogCWVycm9yID0gZGV2aWNlX2FkZChkZXYpOwpAQCAtMzE4OCwxOSArMzIwNSwxOSBAQAogCSAqLwogCWlmIChwZGV2ICE9ICZzaG9zdC0+c2hvc3RfZ2VuZGV2KSB7CiAJCWVycm9yID0gc3lzZnNfY3JlYXRlX2xpbmsoJnNob3N0LT5zaG9zdF9nZW5kZXYua29iaiwKLQkJCQkgJmRldi0+a29iaiwgZGV2LT5idXNfaWQpOworCQkJCSAmZGV2LT5rb2JqLCBkZXZfbmFtZShkZXYpKTsKIAkJaWYgKGVycm9yKQogCQkJcHJpbnRrKEtFUk5fRVJSCiAJCQkJIiVzOiBDYW5ub3QgY3JlYXRlIHZwb3J0IHN5bWxpbmtzIGZvciAiCiAJCQkJIiVzLCBlcnI9JWRcbiIsCi0JCQkJX19mdW5jX18sIGRldi0+YnVzX2lkLCBlcnJvcik7CisJCQkJX19mdW5jX18sIGRldl9uYW1lKGRldiksIGVycm9yKTsKIAl9CiAJc3Bpbl9sb2NrX2lycXNhdmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwogCXZwb3J0LT5mbGFncyAmPSB+RkNfVlBPUlRfQ1JFQVRJTkc7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiAKIAlkZXZfcHJpbnRrKEtFUk5fTk9USUNFLCBwZGV2LAotCQkJIiVzIGNyZWF0ZWQgdmlhIHNob3N0JWQgY2hhbm5lbCAlZFxuIiwgZGV2LT5idXNfaWQsCisJCQkiJXMgY3JlYXRlZCB2aWEgc2hvc3QlZCBjaGFubmVsICVkXG4iLCBkZXZfbmFtZShkZXYpLAogCQkJc2hvc3QtPmhvc3Rfbm8sIGNoYW5uZWwpOwogCiAJKnJldF92cG9ydCA9IHZwb3J0OwpAQCAtMzI5Nyw3ICszMzE0LDcgQEAKIAkJcmV0dXJuIHN0YXQ7CiAKIAlpZiAoZGV2LT5wYXJlbnQgIT0gJnNob3N0LT5zaG9zdF9nZW5kZXYpCi0JCXN5c2ZzX3JlbW92ZV9saW5rKCZzaG9zdC0+c2hvc3RfZ2VuZGV2LmtvYmosIGRldi0+YnVzX2lkKTsKKwkJc3lzZnNfcmVtb3ZlX2xpbmsoJnNob3N0LT5zaG9zdF9nZW5kZXYua29iaiwgZGV2X25hbWUoZGV2KSk7CiAJdHJhbnNwb3J0X3JlbW92ZV9kZXZpY2UoZGV2KTsKIAlkZXZpY2VfZGVsKGRldik7CiAJdHJhbnNwb3J0X2Rlc3Ryb3lfZGV2aWNlKGRldik7CkBAIC0zMzI5LDcgKzMzNDYsNyBAQAogCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCB2cG9ydC0+ZGV2LnBhcmVudCwKIAkJCSIlczogJXMgY291bGQgbm90IGJlIGRlbGV0ZWQgY3JlYXRlZCB2aWEgIgogCQkJInNob3N0JWQgY2hhbm5lbCAlZCAtIGVycm9yICVkXG4iLCBfX2Z1bmNfXywKLQkJCXZwb3J0LT5kZXYuYnVzX2lkLCB2cG9ydC0+c2hvc3QtPmhvc3Rfbm8sCisJCQlkZXZfbmFtZSgmdnBvcnQtPmRldiksIHZwb3J0LT5zaG9zdC0+aG9zdF9ubywKIAkJCXZwb3J0LT5jaGFubmVsLCBzdGF0KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuYwppbmRleCA0YTgwM2ViLi43NWM5Mjk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuYwpAQCAtMTg3LDggKzE4Nyw3IEBACiAKIAllcC0+aWQgPSBpZDsKIAllcC0+ZGV2LmNsYXNzID0gJmlzY3NpX2VuZHBvaW50X2NsYXNzOwotCXNucHJpbnRmKGVwLT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgImVwLSVsbHUiLAotCQkgKHVuc2lnbmVkIGxvbmcgbG9uZykgaWQpOworCWRldl9zZXRfbmFtZSgmZXAtPmRldiwgImVwLSVsbHUiLCAodW5zaWduZWQgbG9uZyBsb25nKSBpZCk7CiAJZXJyID0gZGV2aWNlX3JlZ2lzdGVyKCZlcC0+ZGV2KTsKICAgICAgICAgaWYgKGVycikKICAgICAgICAgICAgICAgICBnb3RvIGZyZWVfZXA7CkBAIC03MjQsOCArNzIzLDcgQEAKIAl9CiAJc2Vzc2lvbi0+dGFyZ2V0X2lkID0gaWQ7CiAKLQlzbnByaW50ZihzZXNzaW9uLT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgInNlc3Npb24ldSIsCi0JCSBzZXNzaW9uLT5zaWQpOworCWRldl9zZXRfbmFtZSgmc2Vzc2lvbi0+ZGV2LCAic2Vzc2lvbiV1Iiwgc2Vzc2lvbi0+c2lkKTsKIAllcnIgPSBkZXZpY2VfYWRkKCZzZXNzaW9uLT5kZXYpOwogCWlmIChlcnIpIHsKIAkJaXNjc2lfY2xzX3Nlc3Npb25fcHJpbnRrKEtFUk5fRVJSLCBzZXNzaW9uLApAQCAtODk4LDggKzg5Niw3IEBACiAJaWYgKCFnZXRfZGV2aWNlKCZzZXNzaW9uLT5kZXYpKQogCQlnb3RvIGZyZWVfY29ubjsKIAotCXNucHJpbnRmKGNvbm4tPmRldi5idXNfaWQsIEJVU19JRF9TSVpFLCAiY29ubmVjdGlvbiVkOiV1IiwKLQkJIHNlc3Npb24tPnNpZCwgY2lkKTsKKwlkZXZfc2V0X25hbWUoJmNvbm4tPmRldiwgImNvbm5lY3Rpb24lZDoldSIsIHNlc3Npb24tPnNpZCwgY2lkKTsKIAljb25uLT5kZXYucGFyZW50ID0gJnNlc3Npb24tPmRldjsKIAljb25uLT5kZXYucmVsZWFzZSA9IGlzY3NpX2Nvbm5fcmVsZWFzZTsKIAllcnIgPSBkZXZpY2VfcmVnaXN0ZXIoJmNvbm4tPmRldik7CkBAIC0xODE2LDcgKzE4MTMsNyBAQAogCQlwcml2LT50LmNyZWF0ZV93b3JrX3F1ZXVlID0gMTsKIAogCXByaXYtPmRldi5jbGFzcyA9ICZpc2NzaV90cmFuc3BvcnRfY2xhc3M7Ci0Jc25wcmludGYocHJpdi0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsICIlcyIsIHR0LT5uYW1lKTsKKwlkZXZfc2V0X25hbWUoJnByaXYtPmRldiwgIiVzIiwgdHQtPm5hbWUpOwogCWVyciA9IGRldmljZV9yZWdpc3RlcigmcHJpdi0+ZGV2KTsKIAlpZiAoZXJyKQogCQlnb3RvIGZyZWVfcHJpdjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zYXMuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zYXMuYwppbmRleCAzNjY2MDkzLi41MDk4OGNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc2FzLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X3Nhcy5jCkBAIC0yMDcsNyArMjA3LDcgQEAKIAlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcTsKIAlpbnQgZXJyb3I7CiAJc3RydWN0IGRldmljZSAqZGV2OwotCWNoYXIgbmFtZWJ1ZltCVVNfSURfU0laRV07CisJY2hhciBuYW1lYnVmWzIwXTsKIAljb25zdCBjaGFyICpuYW1lOwogCXZvaWQgKCpyZWxlYXNlKShzdHJ1Y3QgZGV2aWNlICopOwogCkBAIC0yMTksNyArMjE5LDcgQEAKIAlpZiAocnBoeSkgewogCQlxID0gYmxrX2luaXRfcXVldWUoc2FzX25vbl9ob3N0X3NtcF9yZXF1ZXN0LCBOVUxMKTsKIAkJZGV2ID0gJnJwaHktPmRldjsKLQkJbmFtZSA9IGRldi0+YnVzX2lkOworCQluYW1lID0gZGV2X25hbWUoZGV2KTsKIAkJcmVsZWFzZSA9IE5VTEw7CiAJfSBlbHNlIHsKIAkJcSA9IGJsa19pbml0X3F1ZXVlKHNhc19ob3N0X3NtcF9yZXF1ZXN0LCBOVUxMKTsKQEAgLTYyOSwxMCArNjI5LDEwIEBACiAJSU5JVF9MSVNUX0hFQUQoJnBoeS0+cG9ydF9zaWJsaW5ncyk7CiAJaWYgKHNjc2lfaXNfc2FzX2V4cGFuZGVyX2RldmljZShwYXJlbnQpKSB7CiAJCXN0cnVjdCBzYXNfcnBoeSAqcnBoeSA9IGRldl90b19ycGh5KHBhcmVudCk7Ci0JCXNwcmludGYocGh5LT5kZXYuYnVzX2lkLCAicGh5LSVkOiVkOiVkIiwgc2hvc3QtPmhvc3Rfbm8sCisJCWRldl9zZXRfbmFtZSgmcGh5LT5kZXYsICJwaHktJWQ6JWQ6JWQiLCBzaG9zdC0+aG9zdF9ubywKIAkJCXJwaHktPnNjc2lfdGFyZ2V0X2lkLCBudW1iZXIpOwogCX0gZWxzZQotCQlzcHJpbnRmKHBoeS0+ZGV2LmJ1c19pZCwgInBoeS0lZDolZCIsIHNob3N0LT5ob3N0X25vLCBudW1iZXIpOworCQlkZXZfc2V0X25hbWUoJnBoeS0+ZGV2LCAicGh5LSVkOiVkIiwgc2hvc3QtPmhvc3Rfbm8sIG51bWJlcik7CiAKIAl0cmFuc3BvcnRfc2V0dXBfZGV2aWNlKCZwaHktPmRldik7CiAKQEAgLTc3MCw3ICs3NzAsNyBAQAogCWludCByZXM7CiAKIAlyZXMgPSBzeXNmc19jcmVhdGVfbGluaygmcG9ydC0+ZGV2LmtvYmosICZwaHktPmRldi5rb2JqLAotCQkJCXBoeS0+ZGV2LmJ1c19pZCk7CisJCQkJZGV2X25hbWUoJnBoeS0+ZGV2KSk7CiAJaWYgKHJlcykKIAkJZ290byBlcnI7CiAJcmVzID0gc3lzZnNfY3JlYXRlX2xpbmsoJnBoeS0+ZGV2LmtvYmosICZwb3J0LT5kZXYua29iaiwgInBvcnQiKTsKQEAgLTc4NSw3ICs3ODUsNyBAQAogc3RhdGljIHZvaWQgc2FzX3BvcnRfZGVsZXRlX2xpbmsoc3RydWN0IHNhc19wb3J0ICpwb3J0LAogCQkJCSBzdHJ1Y3Qgc2FzX3BoeSAqcGh5KQogewotCXN5c2ZzX3JlbW92ZV9saW5rKCZwb3J0LT5kZXYua29iaiwgcGh5LT5kZXYuYnVzX2lkKTsKKwlzeXNmc19yZW1vdmVfbGluaygmcG9ydC0+ZGV2LmtvYmosIGRldl9uYW1lKCZwaHktPmRldikpOwogCXN5c2ZzX3JlbW92ZV9saW5rKCZwaHktPmRldi5rb2JqLCAicG9ydCIpOwogfQogCkBAIC04MjEsMTEgKzgyMSwxMSBAQAogCiAJaWYgKHNjc2lfaXNfc2FzX2V4cGFuZGVyX2RldmljZShwYXJlbnQpKSB7CiAJCXN0cnVjdCBzYXNfcnBoeSAqcnBoeSA9IGRldl90b19ycGh5KHBhcmVudCk7Ci0JCXNwcmludGYocG9ydC0+ZGV2LmJ1c19pZCwgInBvcnQtJWQ6JWQ6JWQiLCBzaG9zdC0+aG9zdF9ubywKLQkJCXJwaHktPnNjc2lfdGFyZ2V0X2lkLCBwb3J0LT5wb3J0X2lkZW50aWZpZXIpOworCQlkZXZfc2V0X25hbWUoJnBvcnQtPmRldiwgInBvcnQtJWQ6JWQ6JWQiLCBzaG9zdC0+aG9zdF9ubywKKwkJCSAgICAgcnBoeS0+c2NzaV90YXJnZXRfaWQsIHBvcnQtPnBvcnRfaWRlbnRpZmllcik7CiAJfSBlbHNlCi0JCXNwcmludGYocG9ydC0+ZGV2LmJ1c19pZCwgInBvcnQtJWQ6JWQiLCBzaG9zdC0+aG9zdF9ubywKLQkJCXBvcnQtPnBvcnRfaWRlbnRpZmllcik7CisJCWRldl9zZXRfbmFtZSgmcG9ydC0+ZGV2LCAicG9ydC0lZDolZCIsIHNob3N0LT5ob3N0X25vLAorCQkJICAgICBwb3J0LT5wb3J0X2lkZW50aWZpZXIpOwogCiAJdHJhbnNwb3J0X3NldHVwX2RldmljZSgmcG9ydC0+ZGV2KTsKIApAQCAtOTM1LDcgKzkzNSw3IEBACiAJaWYgKHBvcnQtPmlzX2JhY2tsaW5rKSB7CiAJCXN0cnVjdCBkZXZpY2UgKnBhcmVudCA9IHBvcnQtPmRldi5wYXJlbnQ7CiAKLQkJc3lzZnNfcmVtb3ZlX2xpbmsoJnBvcnQtPmRldi5rb2JqLCBwYXJlbnQtPmJ1c19pZCk7CisJCXN5c2ZzX3JlbW92ZV9saW5rKCZwb3J0LT5kZXYua29iaiwgZGV2X25hbWUocGFyZW50KSk7CiAJCXBvcnQtPmlzX2JhY2tsaW5rID0gMDsKIAl9CiAKQEAgLTk4NCw3ICs5ODQsOCBAQAogCQkvKiBJZiB0aGlzIHRyaXBzLCB5b3UgYWRkZWQgYSBwaHkgdGhhdCB3YXMgYWxyZWFkeQogCQkgKiBwYXJ0IG9mIGEgZGlmZmVyZW50IHBvcnQgKi8KIAkJaWYgKHVubGlrZWx5KHRtcCAhPSBwaHkpKSB7Ci0JCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmcG9ydC0+ZGV2LCAidHJ5aW5nIHRvIGFkZCBwaHkgJXMgZmFpbHM6IGl0J3MgYWxyZWFkeSBwYXJ0IG9mIGFub3RoZXIgcG9ydFxuIiwgcGh5LT5kZXYuYnVzX2lkKTsKKwkJCWRldl9wcmludGsoS0VSTl9FUlIsICZwb3J0LT5kZXYsICJ0cnlpbmcgdG8gYWRkIHBoeSAlcyBmYWlsczogaXQncyBhbHJlYWR5IHBhcnQgb2YgYW5vdGhlciBwb3J0XG4iLAorCQkJCSAgIGRldl9uYW1lKCZwaHktPmRldikpOwogCQkJQlVHKCk7CiAJCX0KIAl9IGVsc2UgewpAQCAtMTAyMyw3ICsxMDI0LDcgQEAKIAkJcmV0dXJuOwogCXBvcnQtPmlzX2JhY2tsaW5rID0gMTsKIAlyZXMgPSBzeXNmc19jcmVhdGVfbGluaygmcG9ydC0+ZGV2LmtvYmosICZwYXJlbnQtPmtvYmosCi0JCQkJcGFyZW50LT5idXNfaWQpOworCQkJCWRldl9uYW1lKHBhcmVudCkpOwogCWlmIChyZXMpCiAJCWdvdG8gZXJyOwogCXJldHVybjsKQEAgLTEzNjcsMTEgKzEzNjgsMTIgQEAKIAlyZGV2LT5ycGh5LmRldi5yZWxlYXNlID0gc2FzX2VuZF9kZXZpY2VfcmVsZWFzZTsKIAlpZiAoc2NzaV9pc19zYXNfZXhwYW5kZXJfZGV2aWNlKHBhcmVudC0+ZGV2LnBhcmVudCkpIHsKIAkJc3RydWN0IHNhc19ycGh5ICpycGh5ID0gZGV2X3RvX3JwaHkocGFyZW50LT5kZXYucGFyZW50KTsKLQkJc3ByaW50ZihyZGV2LT5ycGh5LmRldi5idXNfaWQsICJlbmRfZGV2aWNlLSVkOiVkOiVkIiwKLQkJCXNob3N0LT5ob3N0X25vLCBycGh5LT5zY3NpX3RhcmdldF9pZCwgcGFyZW50LT5wb3J0X2lkZW50aWZpZXIpOworCQlkZXZfc2V0X25hbWUoJnJkZXYtPnJwaHkuZGV2LCAiZW5kX2RldmljZS0lZDolZDolZCIsCisJCQkgICAgIHNob3N0LT5ob3N0X25vLCBycGh5LT5zY3NpX3RhcmdldF9pZCwKKwkJCSAgICAgcGFyZW50LT5wb3J0X2lkZW50aWZpZXIpOwogCX0gZWxzZQotCQlzcHJpbnRmKHJkZXYtPnJwaHkuZGV2LmJ1c19pZCwgImVuZF9kZXZpY2UtJWQ6JWQiLAotCQkJc2hvc3QtPmhvc3Rfbm8sIHBhcmVudC0+cG9ydF9pZGVudGlmaWVyKTsKKwkJZGV2X3NldF9uYW1lKCZyZGV2LT5ycGh5LmRldiwgImVuZF9kZXZpY2UtJWQ6JWQiLAorCQkJICAgICBzaG9zdC0+aG9zdF9ubywgcGFyZW50LT5wb3J0X2lkZW50aWZpZXIpOwogCXJkZXYtPnJwaHkuaWRlbnRpZnkuZGV2aWNlX3R5cGUgPSBTQVNfRU5EX0RFVklDRTsKIAlzYXNfcnBoeV9pbml0aWFsaXplKCZyZGV2LT5ycGh5KTsKIAl0cmFuc3BvcnRfc2V0dXBfZGV2aWNlKCZyZGV2LT5ycGh5LmRldik7CkBAIC0xNDExLDggKzE0MTMsOCBAQAogCW11dGV4X2xvY2soJnNhc19ob3N0LT5sb2NrKTsKIAlyZGV2LT5ycGh5LnNjc2lfdGFyZ2V0X2lkID0gc2FzX2hvc3QtPm5leHRfZXhwYW5kZXJfaWQrKzsKIAltdXRleF91bmxvY2soJnNhc19ob3N0LT5sb2NrKTsKLQlzcHJpbnRmKHJkZXYtPnJwaHkuZGV2LmJ1c19pZCwgImV4cGFuZGVyLSVkOiVkIiwKLQkJc2hvc3QtPmhvc3Rfbm8sIHJkZXYtPnJwaHkuc2NzaV90YXJnZXRfaWQpOworCWRldl9zZXRfbmFtZSgmcmRldi0+cnBoeS5kZXYsICJleHBhbmRlci0lZDolZCIsCisJCSAgICAgc2hvc3QtPmhvc3Rfbm8sIHJkZXYtPnJwaHkuc2NzaV90YXJnZXRfaWQpOwogCXJkZXYtPnJwaHkuaWRlbnRpZnkuZGV2aWNlX3R5cGUgPSB0eXBlOwogCXNhc19ycGh5X2luaXRpYWxpemUoJnJkZXYtPnJwaHkpOwogCXRyYW5zcG9ydF9zZXR1cF9kZXZpY2UoJnJkZXYtPnJwaHkuZGV2KTsKQEAgLTE0NDUsNyArMTQ0Nyw3IEBACiAJdHJhbnNwb3J0X2FkZF9kZXZpY2UoJnJwaHktPmRldik7CiAJdHJhbnNwb3J0X2NvbmZpZ3VyZV9kZXZpY2UoJnJwaHktPmRldik7CiAJaWYgKHNhc19ic2dfaW5pdGlhbGl6ZShzaG9zdCwgcnBoeSkpCi0JCXByaW50aygiZmFpbCB0byBhIGJzZyBkZXZpY2UgJXNcbiIsIHJwaHktPmRldi5idXNfaWQpOworCQlwcmludGsoImZhaWwgdG8gYSBic2cgZGV2aWNlICVzXG4iLCBkZXZfbmFtZSgmcnBoeS0+ZGV2KSk7CiAKIAogCW11dGV4X2xvY2soJnNhc19ob3N0LT5sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zcnAuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zcnAuYwppbmRleCA4YTdhZjk1Li4yMWEwNDVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc3JwLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X3NycC5jCkBAIC0yMTIsNyArMjEyLDcgQEAKIAlycG9ydC0+cm9sZXMgPSBpZHMtPnJvbGVzOwogCiAJaWQgPSBhdG9taWNfaW5jX3JldHVybigmdG9fc3JwX2hvc3RfYXR0cnMoc2hvc3QpLT5uZXh0X3BvcnRfaWQpOwotCXNwcmludGYocnBvcnQtPmRldi5idXNfaWQsICJwb3J0LSVkOiVkIiwgc2hvc3QtPmhvc3Rfbm8sIGlkKTsKKwlkZXZfc2V0X25hbWUoJnJwb3J0LT5kZXYsICJwb3J0LSVkOiVkIiwgc2hvc3QtPmhvc3Rfbm8sIGlkKTsKIAogCXRyYW5zcG9ydF9zZXR1cF9kZXZpY2UoJnJwb3J0LT5kZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2QuYyBiL2RyaXZlcnMvc2NzaS9zZC5jCmluZGV4IDYyYjI4ZDUuLmQ1NzU2NmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zZC5jCisrKyBiL2RyaXZlcnMvc2NzaS9zZC5jCkBAIC00OCw2ICs0OCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZ19oZWxwZXJzLmg+CisjaW5jbHVkZSA8bGludXgvYXN5bmMuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCiAjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CkBAIC0xODAyLDYgKzE4MDMsNzEgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIFRoZSBhc3luY2hyb25vdXMgcGFydCBvZiBzZF9wcm9iZQorICovCitzdGF0aWMgdm9pZCBzZF9wcm9iZV9hc3luYyh2b2lkICpkYXRhLCBhc3luY19jb29raWVfdCBjb29raWUpCit7CisJc3RydWN0IHNjc2lfZGlzayAqc2RrcCA9IGRhdGE7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZHA7CisJc3RydWN0IGdlbmRpc2sgKmdkOworCXUzMiBpbmRleDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisKKwlzZHAgPSBzZGtwLT5kZXZpY2U7CisJZ2QgPSBzZGtwLT5kaXNrOworCWluZGV4ID0gc2RrcC0+aW5kZXg7CisJZGV2ID0gJnNkcC0+c2Rldl9nZW5kZXY7CisKKwlpZiAoIXNkcC0+cmVxdWVzdF9xdWV1ZS0+cnFfdGltZW91dCkgeworCQlpZiAoc2RwLT50eXBlICE9IFRZUEVfTU9EKQorCQkJYmxrX3F1ZXVlX3JxX3RpbWVvdXQoc2RwLT5yZXF1ZXN0X3F1ZXVlLCBTRF9USU1FT1VUKTsKKwkJZWxzZQorCQkJYmxrX3F1ZXVlX3JxX3RpbWVvdXQoc2RwLT5yZXF1ZXN0X3F1ZXVlLAorCQkJCQkgICAgIFNEX01PRF9USU1FT1VUKTsKKwl9CisKKwlkZXZpY2VfaW5pdGlhbGl6ZSgmc2RrcC0+ZGV2KTsKKwlzZGtwLT5kZXYucGFyZW50ID0gJnNkcC0+c2Rldl9nZW5kZXY7CisJc2RrcC0+ZGV2LmNsYXNzID0gJnNkX2Rpc2tfY2xhc3M7CisJZGV2X3NldF9uYW1lKCZzZGtwLT5kZXYsIGRldl9uYW1lKCZzZHAtPnNkZXZfZ2VuZGV2KSk7CisKKwlpZiAoZGV2aWNlX2FkZCgmc2RrcC0+ZGV2KSkKKwkJZ290byBvdXRfZnJlZV9pbmRleDsKKworCWdldF9kZXZpY2UoJnNkcC0+c2Rldl9nZW5kZXYpOworCisJaWYgKGluZGV4IDwgU0RfTUFYX0RJU0tTKSB7CisJCWdkLT5tYWpvciA9IHNkX21ham9yKChpbmRleCAmIDB4ZjApID4+IDQpOworCQlnZC0+Zmlyc3RfbWlub3IgPSAoKGluZGV4ICYgMHhmKSA8PCA0KSB8IChpbmRleCAmIDB4ZmZmMDApOworCQlnZC0+bWlub3JzID0gU0RfTUlOT1JTOworCX0KKwlnZC0+Zm9wcyA9ICZzZF9mb3BzOworCWdkLT5wcml2YXRlX2RhdGEgPSAmc2RrcC0+ZHJpdmVyOworCWdkLT5xdWV1ZSA9IHNka3AtPmRldmljZS0+cmVxdWVzdF9xdWV1ZTsKKworCXNkX3JldmFsaWRhdGVfZGlzayhnZCk7CisKKwlibGtfcXVldWVfcHJlcF9ycShzZHAtPnJlcXVlc3RfcXVldWUsIHNkX3ByZXBfZm4pOworCisJZ2QtPmRyaXZlcmZzX2RldiA9ICZzZHAtPnNkZXZfZ2VuZGV2OworCWdkLT5mbGFncyA9IEdFTkhEX0ZMX0VYVF9ERVZUIHwgR0VOSERfRkxfRFJJVkVSRlM7CisJaWYgKHNkcC0+cmVtb3ZhYmxlKQorCQlnZC0+ZmxhZ3MgfD0gR0VOSERfRkxfUkVNT1ZBQkxFOworCisJZGV2X3NldF9kcnZkYXRhKGRldiwgc2RrcCk7CisJYWRkX2Rpc2soZ2QpOworCXNkX2RpZl9jb25maWdfaG9zdChzZGtwKTsKKworCXNkX3ByaW50ayhLRVJOX05PVElDRSwgc2RrcCwgIkF0dGFjaGVkIFNDU0kgJXNkaXNrXG4iLAorCQkgIHNkcC0+cmVtb3ZhYmxlID8gInJlbW92YWJsZSAiIDogIiIpOworCisJcmV0dXJuOworCisgb3V0X2ZyZWVfaW5kZXg6CisJaWRhX3JlbW92ZSgmc2RfaW5kZXhfaWRhLCBpbmRleCk7Cit9CisKIC8qKgogICoJc2RfcHJvYmUgLSBjYWxsZWQgZHVyaW5nIGRyaXZlciBpbml0aWFsaXphdGlvbiBhbmQgd2hlbmV2ZXIgYQogICoJbmV3IHNjc2kgZGV2aWNlIGlzIGF0dGFjaGVkIHRvIHRoZSBzeXN0ZW0uIEl0IGlzIGNhbGxlZCBvbmNlCkBAIC0xODY1LDQ4ICsxOTMxLDcgQEAKIAlzZGtwLT5vcGVuZXJzID0gMDsKIAlzZGtwLT5wcmV2aW91c19zdGF0ZSA9IDE7CiAKLQlpZiAoIXNkcC0+cmVxdWVzdF9xdWV1ZS0+cnFfdGltZW91dCkgewotCQlpZiAoc2RwLT50eXBlICE9IFRZUEVfTU9EKQotCQkJYmxrX3F1ZXVlX3JxX3RpbWVvdXQoc2RwLT5yZXF1ZXN0X3F1ZXVlLCBTRF9USU1FT1VUKTsKLQkJZWxzZQotCQkJYmxrX3F1ZXVlX3JxX3RpbWVvdXQoc2RwLT5yZXF1ZXN0X3F1ZXVlLAotCQkJCQkgICAgIFNEX01PRF9USU1FT1VUKTsKLQl9Ci0KLQlkZXZpY2VfaW5pdGlhbGl6ZSgmc2RrcC0+ZGV2KTsKLQlzZGtwLT5kZXYucGFyZW50ID0gJnNkcC0+c2Rldl9nZW5kZXY7Ci0Jc2RrcC0+ZGV2LmNsYXNzID0gJnNkX2Rpc2tfY2xhc3M7Ci0Jc3RybmNweShzZGtwLT5kZXYuYnVzX2lkLCBzZHAtPnNkZXZfZ2VuZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUpOwotCi0JaWYgKGRldmljZV9hZGQoJnNka3AtPmRldikpCi0JCWdvdG8gb3V0X2ZyZWVfaW5kZXg7Ci0KLQlnZXRfZGV2aWNlKCZzZHAtPnNkZXZfZ2VuZGV2KTsKLQotCWlmIChpbmRleCA8IFNEX01BWF9ESVNLUykgewotCQlnZC0+bWFqb3IgPSBzZF9tYWpvcigoaW5kZXggJiAweGYwKSA+PiA0KTsKLQkJZ2QtPmZpcnN0X21pbm9yID0gKChpbmRleCAmIDB4ZikgPDwgNCkgfCAoaW5kZXggJiAweGZmZjAwKTsKLQkJZ2QtPm1pbm9ycyA9IFNEX01JTk9SUzsKLQl9Ci0JZ2QtPmZvcHMgPSAmc2RfZm9wczsKLQlnZC0+cHJpdmF0ZV9kYXRhID0gJnNka3AtPmRyaXZlcjsKLQlnZC0+cXVldWUgPSBzZGtwLT5kZXZpY2UtPnJlcXVlc3RfcXVldWU7Ci0KLQlzZF9yZXZhbGlkYXRlX2Rpc2soZ2QpOwotCi0JYmxrX3F1ZXVlX3ByZXBfcnEoc2RwLT5yZXF1ZXN0X3F1ZXVlLCBzZF9wcmVwX2ZuKTsKLQotCWdkLT5kcml2ZXJmc19kZXYgPSAmc2RwLT5zZGV2X2dlbmRldjsKLQlnZC0+ZmxhZ3MgPSBHRU5IRF9GTF9FWFRfREVWVCB8IEdFTkhEX0ZMX0RSSVZFUkZTOwotCWlmIChzZHAtPnJlbW92YWJsZSkKLQkJZ2QtPmZsYWdzIHw9IEdFTkhEX0ZMX1JFTU9WQUJMRTsKLQotCWRldl9zZXRfZHJ2ZGF0YShkZXYsIHNka3ApOwotCWFkZF9kaXNrKGdkKTsKLQlzZF9kaWZfY29uZmlnX2hvc3Qoc2RrcCk7Ci0KLQlzZF9wcmludGsoS0VSTl9OT1RJQ0UsIHNka3AsICJBdHRhY2hlZCBTQ1NJICVzZGlza1xuIiwKLQkJICBzZHAtPnJlbW92YWJsZSA/ICJyZW1vdmFibGUgIiA6ICIiKTsKKwlhc3luY19zY2hlZHVsZShzZF9wcm9iZV9hc3luYywgc2RrcCk7CiAKIAlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NkX2RpZi5jIGIvZHJpdmVycy9zY3NpL3NkX2RpZi5jCmluZGV4IDNlYmIxZjIuLjE4NGRmZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zZF9kaWYuYworKysgYi9kcml2ZXJzL3Njc2kvc2RfZGlmLmMKQEAgLTE0Miw3ICsxNDIsNyBAQAogc3RhdGljIHZvaWQgc2RfZGlmX3R5cGUxX3NldF90YWcodm9pZCAqcHJvdCwgdm9pZCAqdGFnX2J1ZiwgdW5zaWduZWQgaW50IHNlY3RvcnMpCiB7CiAJc3RydWN0IHNkX2RpZl90dXBsZSAqc2R0ID0gcHJvdDsKLQljaGFyICp0YWcgPSB0YWdfYnVmOworCXU4ICp0YWcgPSB0YWdfYnVmOwogCXVuc2lnbmVkIGludCBpLCBqOwogCiAJZm9yIChpID0gMCwgaiA9IDAgOyBpIDwgc2VjdG9ycyA7IGkrKywgaiArPSAyLCBzZHQrKykgewpAQCAtMTU0LDcgKzE1NCw3IEBACiBzdGF0aWMgdm9pZCBzZF9kaWZfdHlwZTFfZ2V0X3RhZyh2b2lkICpwcm90LCB2b2lkICp0YWdfYnVmLCB1bnNpZ25lZCBpbnQgc2VjdG9ycykKIHsKIAlzdHJ1Y3Qgc2RfZGlmX3R1cGxlICpzZHQgPSBwcm90OwotCWNoYXIgKnRhZyA9IHRhZ19idWY7CisJdTggKnRhZyA9IHRhZ19idWY7CiAJdW5zaWduZWQgaW50IGksIGo7CiAKIAlmb3IgKGkgPSAwLCBqID0gMCA7IGkgPCBzZWN0b3JzIDsgaSsrLCBqICs9IDIsIHNkdCsrKSB7CkBAIC0yNTYsNyArMjU2LDcgQEAKIHN0YXRpYyB2b2lkIHNkX2RpZl90eXBlM19zZXRfdGFnKHZvaWQgKnByb3QsIHZvaWQgKnRhZ19idWYsIHVuc2lnbmVkIGludCBzZWN0b3JzKQogewogCXN0cnVjdCBzZF9kaWZfdHVwbGUgKnNkdCA9IHByb3Q7Ci0JY2hhciAqdGFnID0gdGFnX2J1ZjsKKwl1OCAqdGFnID0gdGFnX2J1ZjsKIAl1bnNpZ25lZCBpbnQgaSwgajsKIAogCWZvciAoaSA9IDAsIGogPSAwIDsgaSA8IHNlY3RvcnMgOyBpKyssIGogKz0gNiwgc2R0KyspIHsKQEAgLTI2OSw3ICsyNjksNyBAQAogc3RhdGljIHZvaWQgc2RfZGlmX3R5cGUzX2dldF90YWcodm9pZCAqcHJvdCwgdm9pZCAqdGFnX2J1ZiwgdW5zaWduZWQgaW50IHNlY3RvcnMpCiB7CiAJc3RydWN0IHNkX2RpZl90dXBsZSAqc2R0ID0gcHJvdDsKLQljaGFyICp0YWcgPSB0YWdfYnVmOworCXU4ICp0YWcgPSB0YWdfYnVmOwogCXVuc2lnbmVkIGludCBpLCBqOwogCiAJZm9yIChpID0gMCwgaiA9IDAgOyBpIDwgc2VjdG9ycyA7IGkrKywgaiArPSAyLCBzZHQrKykgewpAQCAtMzc0LDcgKzM3NCwxMCBAQAogCWVsc2UKIAkJY3N1bV9jb252ZXJ0ID0gMDsKIAorCUJVR19PTihkaWYgJiYgKHNjbWQtPmNtbmRbMF0gPT0gUkVBRF82IHx8IHNjbWQtPmNtbmRbMF0gPT0gV1JJVEVfNikpOworCiAJc3dpdGNoIChzY21kLT5jbW5kWzBdKSB7CisJY2FzZSBSRUFEXzY6CiAJY2FzZSBSRUFEXzEwOgogCWNhc2UgUkVBRF8xMjoKIAljYXNlIFJFQURfMTY6CkBAIC0zOTAsNiArMzkzLDcgQEAKIAogCQlicmVhazsKIAorCWNhc2UgV1JJVEVfNjoKIAljYXNlIFdSSVRFXzEwOgogCWNhc2UgV1JJVEVfMTI6CiAJY2FzZSBXUklURV8xNjoKQEAgLTQ3NSw4ICs0NzksOSBAQAogCiBlcnJvcjoKIAlrdW5tYXBfYXRvbWljKHNkdCwgS01fVVNFUjApOwotCXNkX3ByaW50ayhLRVJOX0VSUiwgc2RrcCwgIiVzOiB2aXJ0ICV1LCBwaHlzICV1LCByZWYgJXVcbiIsCi0JCSAgX19mdW5jX18sIHZpcnQsIHBoeXMsIGJlMzJfdG9fY3B1KHNkdC0+cmVmX3RhZykpOworCXNkX3ByaW50ayhLRVJOX0VSUiwgc2RrcCwgIiVzOiB2aXJ0ICV1LCBwaHlzICV1LCByZWYgJXUsIGFwcCAlNHhcbiIsCisJCSAgX19mdW5jX18sIHZpcnQsIHBoeXMsIGJlMzJfdG9fY3B1KHNkdC0+cmVmX3RhZyksCisJCSAgYmUxNl90b19jcHUoc2R0LT5hcHBfdGFnKSk7CiAKIAlyZXR1cm4gLUVJTzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zZXMuYyBiL2RyaXZlcnMvc2NzaS9zZXMuYwppbmRleCA3ZjBkZjI5Li5lOTQ2ZTA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2VzLmMKKysrIGIvZHJpdmVycy9zY3NpL3Nlcy5jCkBAIC01MjYsNyArNTI2LDcgQEAKIAlpZiAoIXNjb21wKQogCQlnb3RvIGVycl9mcmVlOwogCi0JZWRldiA9IGVuY2xvc3VyZV9yZWdpc3RlcihjZGV2LT5wYXJlbnQsIHNkZXYtPnNkZXZfZ2VuZGV2LmJ1c19pZCwKKwllZGV2ID0gZW5jbG9zdXJlX3JlZ2lzdGVyKGNkZXYtPnBhcmVudCwgZGV2X25hbWUoJnNkZXYtPnNkZXZfZ2VuZGV2KSwKIAkJCQkgIGNvbXBvbmVudHMsICZzZXNfZW5jbG9zdXJlX2NhbGxiYWNrcyk7CiAJaWYgKElTX0VSUihlZGV2KSkgewogCQllcnIgPSBQVFJfRVJSKGVkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NnLmMgYi9kcml2ZXJzL3Njc2kvc2cuYwppbmRleCA1MTAzODU1Li44ZjBiZDNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2cuYworKysgYi9kcml2ZXJzL3Njc2kvc2cuYwpAQCAtMTY2OSw2ICsxNjY5LDggQEAKIAkJbWQtPnBhZ2VzID0gcmVxX3NjaHAtPnBhZ2VzOwogCQltZC0+cGFnZV9vcmRlciA9IHJlcV9zY2hwLT5wYWdlX29yZGVyOwogCQltZC0+bnJfZW50cmllcyA9IHJlcV9zY2hwLT5rX3VzZV9zZzsKKwkJbWQtPm9mZnNldCA9IDA7CisJCW1kLT5udWxsX21hcHBlZCA9IGhwLT5keGZlcnAgPyAwIDogMTsKIAl9CiAKIAlpZiAoaW92X2NvdW50KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NnaXdkOTMuYyBiL2RyaXZlcnMvc2NzaS9zZ2l3ZDkzLmMKaW5kZXggMzFmZTYwNS4uMDgwN2IyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NnaXdkOTMuYworKysgYi9kcml2ZXJzL3Njc2kvc2dpd2Q5My5jCkBAIC0yOTcsNyArMjk3LDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgdm9pZCBfX2V4aXQgc2dpd2Q5M19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgX19leGl0IHNnaXdkOTNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBpcDIyX2hvc3RkYXRhICpoZGF0YSA9IChzdHJ1Y3QgaXAyMl9ob3N0ZGF0YSAqKSBob3N0LT5ob3N0ZGF0YTsKQEAgLTMwNyw2ICszMDcsNyBAQAogCWZyZWVfaXJxKHBkLT5pcnEsIGhvc3QpOwogCWRtYV9mcmVlX25vbmNvaGVyZW50KCZwZGV2LT5kZXYsIEhQQ19ETUFfU0laRSwgaGRhdGEtPmNwdSwgaGRhdGEtPmRtYSk7CiAJc2NzaV9ob3N0X3B1dChob3N0KTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2dpd2Q5M19kcml2ZXIgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2ltNzEwLmMgYi9kcml2ZXJzL3Njc2kvc2ltNzEwLmMKaW5kZXggZDYzZDIyOS4uNmRjOGI4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NpbTcxMC5jCisrKyBiL2RyaXZlcnMvc2NzaS9zaW03MTAuYwpAQCAtMTAyLDcgKzEwMiw3IEBACiAJc3RydWN0IE5DUl83MDBfSG9zdF9QYXJhbWV0ZXJzICpob3N0ZGF0YSA9CiAJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyksCUdGUF9LRVJORUwpOwogCi0JcHJpbnRrKEtFUk5fTk9USUNFICJzaW03MTA6ICVzXG4iLCBkZXYtPmJ1c19pZCk7CisJcHJpbnRrKEtFUk5fTk9USUNFICJzaW03MTA6ICVzXG4iLCBkZXZfbmFtZShkZXYpKTsKIAlwcmludGsoS0VSTl9OT1RJQ0UgInNpbTcxMDogaXJxID0gJWQsIGNsb2NrID0gJWQsIGJhc2UgPSAweCVseCwgc2NzaV9pZCA9ICVkXG4iLAogCSAgICAgICBpcnEsIGNsb2NrLCBiYXNlX2FkZHIsIHNjc2lfaWQpOwogCkBAIC0zMDUsNyArMzA1LDcgQEAKIAkJc2NzaV9pZCA9IGZmcyh2YWwpIC0gMTsKIAogCQlpZihzY3NpX2lkID4gNyB8fCAodmFsICYgfigxPDxzY3NpX2lkKSkgIT0gMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJzaW03MTAuYywgRUlTQSBjYXJkICVzIGhhcyBpbmNvcnJlY3Qgc2NzaV9pZCwgc2V0dGluZyB0byA3XG4iLCBkZXYtPmJ1c19pZCk7CisJCQlwcmludGsoS0VSTl9FUlIgInNpbTcxMC5jLCBFSVNBIGNhcmQgJXMgaGFzIGluY29ycmVjdCBzY3NpX2lkLCBzZXR0aW5nIHRvIDdcbiIsIGRldl9uYW1lKGRldikpOwogCQkJc2NzaV9pZCA9IDc7CiAJCX0KIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NuaV81M2M3MTAuYyBiL2RyaXZlcnMvc2NzaS9zbmlfNTNjNzEwLmMKaW5kZXggMmJiZWY0Yy4uNzdmMGIyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NuaV81M2M3MTAuYworKysgYi9kcml2ZXJzL3Njc2kvc25pXzUzYzcxMC5jCkBAIC03OCw4ICs3OCw3IEBACiAJYmFzZSA9IHJlcy0+c3RhcnQ7CiAJaG9zdGRhdGEgPSBremFsbG9jKHNpemVvZigqaG9zdGRhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWhvc3RkYXRhKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IEZhaWxlZCB0byBhbGxvY2F0ZSBob3N0IGRhdGFcbiIsCi0JCSAgICAgICBkZXYtPmRldi5idXNfaWQpOworCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCBkZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgaG9zdCBkYXRhXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3QuYyBiL2RyaXZlcnMvc2NzaS9zdC5jCmluZGV4IDdmM2YzMTcuLmM2ZjE5ZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9zdC5jCkBAIC0xNyw3ICsxNyw3IEBACiAgICBMYXN0IG1vZGlmaWVkOiAxOC1KQU4tMTk5OCBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4gRGV2ZnMgc3VwcG9ydAogICovCiAKLXN0YXRpYyBjb25zdCBjaGFyICp2ZXJzdHIgPSAiMjAwODA1MDQiOworc3RhdGljIGNvbnN0IGNoYXIgKnZlcnN0ciA9ICIyMDA4MTIxNSI7CiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIApAQCAtMTgyLDE4ICsxODIsMTYgQEAKIAogc3RhdGljIGludCBtb2Rlc19kZWZpbmVkOwogCi1zdGF0aWMgc3RydWN0IHN0X2J1ZmZlciAqbmV3X3RhcGVfYnVmZmVyKGludCwgaW50LCBpbnQpOwogc3RhdGljIGludCBlbmxhcmdlX2J1ZmZlcihzdHJ1Y3Qgc3RfYnVmZmVyICosIGludCwgaW50KTsKIHN0YXRpYyB2b2lkIGNsZWFyX2J1ZmZlcihzdHJ1Y3Qgc3RfYnVmZmVyICopOwogc3RhdGljIHZvaWQgbm9ybWFsaXplX2J1ZmZlcihzdHJ1Y3Qgc3RfYnVmZmVyICopOwogc3RhdGljIGludCBhcHBlbmRfdG9fYnVmZmVyKGNvbnN0IGNoYXIgX191c2VyICosIHN0cnVjdCBzdF9idWZmZXIgKiwgaW50KTsKIHN0YXRpYyBpbnQgZnJvbV9idWZmZXIoc3RydWN0IHN0X2J1ZmZlciAqLCBjaGFyIF9fdXNlciAqLCBpbnQpOwogc3RhdGljIHZvaWQgbW92ZV9idWZmZXJfZGF0YShzdHJ1Y3Qgc3RfYnVmZmVyICosIGludCk7Ci1zdGF0aWMgdm9pZCBidWZfdG9fc2coc3RydWN0IHN0X2J1ZmZlciAqLCB1bnNpZ25lZCBpbnQpOwogCi1zdGF0aWMgaW50IHNnbF9tYXBfdXNlcl9wYWdlcyhzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiwgY29uc3QgdW5zaWduZWQgaW50LCAKK3N0YXRpYyBpbnQgc2dsX21hcF91c2VyX3BhZ2VzKHN0cnVjdCBzdF9idWZmZXIgKiwgY29uc3QgdW5zaWduZWQgaW50LAogCQkJICAgICAgdW5zaWduZWQgbG9uZywgc2l6ZV90LCBpbnQpOwotc3RhdGljIGludCBzZ2xfdW5tYXBfdXNlcl9wYWdlcyhzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiwgY29uc3QgdW5zaWduZWQgaW50LCBpbnQpOworc3RhdGljIGludCBzZ2xfdW5tYXBfdXNlcl9wYWdlcyhzdHJ1Y3Qgc3RfYnVmZmVyICosIGNvbnN0IHVuc2lnbmVkIGludCwgaW50KTsKIAogc3RhdGljIGludCBzdF9wcm9iZShzdHJ1Y3QgZGV2aWNlICopOwogc3RhdGljIGludCBzdF9yZW1vdmUoc3RydWN0IGRldmljZSAqKTsKQEAgLTQzNSwyMiArNDMzLDYgQEAKIAlyZXR1cm4gKC1FSU8pOwogfQogCi0KLS8qIFdha2V1cCBmcm9tIGludGVycnVwdCAqLwotc3RhdGljIHZvaWQgc3Rfc2xlZXBfZG9uZSh2b2lkICpkYXRhLCBjaGFyICpzZW5zZSwgaW50IHJlc3VsdCwgaW50IHJlc2lkKQotewotCXN0cnVjdCBzdF9yZXF1ZXN0ICpTUnBudCA9IGRhdGE7Ci0Jc3RydWN0IHNjc2lfdGFwZSAqU1RwID0gU1JwbnQtPnN0cDsKLQotCW1lbWNweShTUnBudC0+c2Vuc2UsIHNlbnNlLCBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUpOwotCShTVHAtPmJ1ZmZlciktPmNtZHN0YXQubWlkbGV2ZWxfcmVzdWx0ID0gU1JwbnQtPnJlc3VsdCA9IHJlc3VsdDsKLQkoU1RwLT5idWZmZXIpLT5jbWRzdGF0LnJlc2lkdWFsID0gcmVzaWQ7Ci0JREVCKCBTVHAtPndyaXRlX3BlbmRpbmcgPSAwOyApCi0KLQlpZiAoU1JwbnQtPndhaXRpbmcpCi0JCWNvbXBsZXRlKFNScG50LT53YWl0aW5nKTsKLX0KLQogc3RhdGljIHN0cnVjdCBzdF9yZXF1ZXN0ICpzdF9hbGxvY2F0ZV9yZXF1ZXN0KHN0cnVjdCBzY3NpX3RhcGUgKnN0cCkKIHsKIAlzdHJ1Y3Qgc3RfcmVxdWVzdCAqc3RyZXE7CkBAIC00NzUsNiArNDU3LDYzIEBACiAJa2ZyZWUoc3RyZXEpOwogfQogCitzdGF0aWMgdm9pZCBzdF9zY3NpX2V4ZWN1dGVfZW5kKHN0cnVjdCByZXF1ZXN0ICpyZXEsIGludCB1cHRvZGF0ZSkKK3sKKwlzdHJ1Y3Qgc3RfcmVxdWVzdCAqU1JwbnQgPSByZXEtPmVuZF9pb19kYXRhOworCXN0cnVjdCBzY3NpX3RhcGUgKlNUcCA9IFNScG50LT5zdHA7CisKKwlTVHAtPmJ1ZmZlci0+Y21kc3RhdC5taWRsZXZlbF9yZXN1bHQgPSBTUnBudC0+cmVzdWx0ID0gcmVxLT5lcnJvcnM7CisJU1RwLT5idWZmZXItPmNtZHN0YXQucmVzaWR1YWwgPSByZXEtPmRhdGFfbGVuOworCisJaWYgKFNScG50LT53YWl0aW5nKQorCQljb21wbGV0ZShTUnBudC0+d2FpdGluZyk7CisKKwlibGtfcnFfdW5tYXBfdXNlcihTUnBudC0+YmlvKTsKKwlfX2Jsa19wdXRfcmVxdWVzdChyZXEtPnEsIHJlcSk7Cit9CisKK3N0YXRpYyBpbnQgc3Rfc2NzaV9leGVjdXRlKHN0cnVjdCBzdF9yZXF1ZXN0ICpTUnBudCwgY29uc3QgdW5zaWduZWQgY2hhciAqY21kLAorCQkJICAgaW50IGRhdGFfZGlyZWN0aW9uLCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGJ1ZmZsZW4sCisJCQkgICBpbnQgdGltZW91dCwgaW50IHJldHJpZXMpCit7CisJc3RydWN0IHJlcXVlc3QgKnJlcTsKKwlzdHJ1Y3QgcnFfbWFwX2RhdGEgKm1kYXRhID0gJlNScG50LT5zdHAtPmJ1ZmZlci0+bWFwX2RhdGE7CisJaW50IGVyciA9IDA7CisJaW50IHdyaXRlID0gKGRhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpOworCisJcmVxID0gYmxrX2dldF9yZXF1ZXN0KFNScG50LT5zdHAtPmRldmljZS0+cmVxdWVzdF9xdWV1ZSwgd3JpdGUsCisJCQkgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlcSkKKwkJcmV0dXJuIERSSVZFUl9FUlJPUiA8PCAyNDsKKworCXJlcS0+Y21kX3R5cGUgPSBSRVFfVFlQRV9CTE9DS19QQzsKKwlyZXEtPmNtZF9mbGFncyB8PSBSRVFfUVVJRVQ7CisKKwltZGF0YS0+bnVsbF9tYXBwZWQgPSAxOworCisJaWYgKGJ1ZmZsZW4pIHsKKwkJZXJyID0gYmxrX3JxX21hcF91c2VyKHJlcS0+cSwgcmVxLCBtZGF0YSwgTlVMTCwgYnVmZmxlbiwKKwkJCQkgICAgICBHRlBfS0VSTkVMKTsKKwkJaWYgKGVycikgeworCQkJYmxrX3B1dF9yZXF1ZXN0KHJlcSk7CisJCQlyZXR1cm4gRFJJVkVSX0VSUk9SIDw8IDI0OworCQl9CisJfQorCisJU1JwbnQtPmJpbyA9IHJlcS0+YmlvOworCXJlcS0+Y21kX2xlbiA9IENPTU1BTkRfU0laRShjbWRbMF0pOworCW1lbXNldChyZXEtPmNtZCwgMCwgQkxLX01BWF9DREIpOworCW1lbWNweShyZXEtPmNtZCwgY21kLCByZXEtPmNtZF9sZW4pOworCXJlcS0+c2Vuc2UgPSBTUnBudC0+c2Vuc2U7CisJcmVxLT5zZW5zZV9sZW4gPSAwOworCXJlcS0+dGltZW91dCA9IHRpbWVvdXQ7CisJcmVxLT5yZXRyaWVzID0gcmV0cmllczsKKwlyZXEtPmVuZF9pb19kYXRhID0gU1JwbnQ7CisKKwlibGtfZXhlY3V0ZV9ycV9ub3dhaXQocmVxLT5xLCBOVUxMLCByZXEsIDEsIHN0X3Njc2lfZXhlY3V0ZV9lbmQpOworCXJldHVybiAwOworfQorCiAvKiBEbyB0aGUgc2NzaSBjb21tYW5kLiBXYWl0cyB1bnRpbCBjb21tYW5kIHBlcmZvcm1lZCBpZiBkb193YWl0IGlzIHRydWUuCiAgICBPdGhlcndpc2Ugd3JpdGVfYmVoaW5kX2NoZWNrKCkgaXMgdXNlZCB0byBjaGVjayB0aGF0IHRoZSBjb21tYW5kCiAgICBoYXMgZmluaXNoZWQuICovCkBAIC00ODMsNiArNTIyLDggQEAKIAkgICBpbnQgYnl0ZXMsIGludCBkaXJlY3Rpb24sIGludCB0aW1lb3V0LCBpbnQgcmV0cmllcywgaW50IGRvX3dhaXQpCiB7CiAJc3RydWN0IGNvbXBsZXRpb24gKndhaXRpbmc7CisJc3RydWN0IHJxX21hcF9kYXRhICptZGF0YSA9ICZTVHAtPmJ1ZmZlci0+bWFwX2RhdGE7CisJaW50IHJldDsKIAogCS8qIGlmIGFzeW5jLCBtYWtlIHN1cmUgdGhlcmUncyBubyBjb21tYW5kIG91dHN0YW5kaW5nICovCiAJaWYgKCFkb193YWl0ICYmICgoU1RwLT5idWZmZXIpLT5sYXN0X1NScG50KSkgewpAQCAtNTEwLDIxICs1NTEsMjcgQEAKIAlpbml0X2NvbXBsZXRpb24od2FpdGluZyk7CiAJU1JwbnQtPndhaXRpbmcgPSB3YWl0aW5nOwogCi0JaWYgKCFTVHAtPmJ1ZmZlci0+ZG9fZGlvKQotCQlidWZfdG9fc2coU1RwLT5idWZmZXIsIGJ5dGVzKTsKKwlpZiAoU1RwLT5idWZmZXItPmRvX2RpbykgeworCQltZGF0YS0+bnJfZW50cmllcyA9IFNUcC0+YnVmZmVyLT5zZ19zZWdzOworCQltZGF0YS0+cGFnZXMgPSBTVHAtPmJ1ZmZlci0+bWFwcGVkX3BhZ2VzOworCX0gZWxzZSB7CisJCW1kYXRhLT5ucl9lbnRyaWVzID0KKwkJCURJVl9ST1VORF9VUChieXRlcywgUEFHRV9TSVpFIDw8IG1kYXRhLT5wYWdlX29yZGVyKTsKKwkJU1RwLT5idWZmZXItPm1hcF9kYXRhLnBhZ2VzID0gU1RwLT5idWZmZXItPnJlc2VydmVkX3BhZ2VzOworCQlTVHAtPmJ1ZmZlci0+bWFwX2RhdGEub2Zmc2V0ID0gMDsKKwl9CiAKIAltZW1jcHkoU1JwbnQtPmNtZCwgY21kLCBzaXplb2YoU1JwbnQtPmNtZCkpOwogCVNUcC0+YnVmZmVyLT5jbWRzdGF0LmhhdmVfc2Vuc2UgPSAwOwogCVNUcC0+YnVmZmVyLT5zeXNjYWxsX3Jlc3VsdCA9IDA7CiAKLQlpZiAoc2NzaV9leGVjdXRlX2FzeW5jKFNUcC0+ZGV2aWNlLCBjbWQsIENPTU1BTkRfU0laRShjbWRbMF0pLCBkaXJlY3Rpb24sCi0JCQkmKChTVHAtPmJ1ZmZlciktPnNnWzBdKSwgYnl0ZXMsIChTVHAtPmJ1ZmZlciktPnNnX3NlZ3MsCi0JCQkgICAgICAgdGltZW91dCwgcmV0cmllcywgU1JwbnQsIHN0X3NsZWVwX2RvbmUsIEdGUF9LRVJORUwpKSB7CisJcmV0ID0gc3Rfc2NzaV9leGVjdXRlKFNScG50LCBjbWQsIGRpcmVjdGlvbiwgTlVMTCwgYnl0ZXMsIHRpbWVvdXQsCisJCQkgICAgICByZXRyaWVzKTsKKwlpZiAocmV0KSB7CiAJCS8qIGNvdWxkIG5vdCBhbGxvY2F0ZSB0aGUgYnVmZmVyIG9yIHJlcXVlc3Qgd2FzIHRvbyBsYXJnZSAqLwogCQkoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdCA9ICgtRUJVU1kpOwogCQkoU1RwLT5idWZmZXIpLT5sYXN0X1NScG50ID0gTlVMTDsKLQl9Ci0JZWxzZSBpZiAoZG9fd2FpdCkgeworCX0gZWxzZSBpZiAoZG9fd2FpdCkgewogCQl3YWl0X2Zvcl9jb21wbGV0aW9uKHdhaXRpbmcpOwogCQlTUnBudC0+d2FpdGluZyA9IE5VTEw7CiAJCShTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0ID0gc3RfY2hrX3Jlc3VsdChTVHAsIFNScG50KTsKQEAgLTUzMywyOCArNTgwLDYgQEAKIAlyZXR1cm4gU1JwbnQ7CiB9CiAKLXN0YXRpYyBpbnQgc3Rfc2NzaV9rZXJuX2V4ZWN1dGUoc3RydWN0IHN0X3JlcXVlc3QgKnN0cmVxLAotCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmNtZCwgaW50IGRhdGFfZGlyZWN0aW9uLAotCQkJCXZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgYnVmZmxlbiwgaW50IHRpbWVvdXQsCi0JCQkJaW50IHJldHJpZXMpCi17Ci0Jc3RydWN0IHNjc2lfdGFwZSAqc3RwID0gc3RyZXEtPnN0cDsKLQlpbnQgcmV0LCByZXNpZDsKLQotCXN0cC0+YnVmZmVyLT5jbWRzdGF0LmhhdmVfc2Vuc2UgPSAwOwotCW1lbWNweShzdHJlcS0+Y21kLCBjbWQsIHNpemVvZihzdHJlcS0+Y21kKSk7Ci0KLQlyZXQgPSBzY3NpX2V4ZWN1dGUoc3RwLT5kZXZpY2UsIGNtZCwgZGF0YV9kaXJlY3Rpb24sIGJ1ZmZlciwgYnVmZmxlbiwKLQkJCSAgIHN0cmVxLT5zZW5zZSwgdGltZW91dCwgcmV0cmllcywgMCwgJnJlc2lkKTsKLQlpZiAoZHJpdmVyX2J5dGUocmV0KSAmIERSSVZFUl9FUlJPUikKLQkJcmV0dXJuIC1FQlVTWTsKLQotCXN0cC0+YnVmZmVyLT5jbWRzdGF0Lm1pZGxldmVsX3Jlc3VsdCA9IHN0cmVxLT5yZXN1bHQgPSByZXQ7Ci0Jc3RwLT5idWZmZXItPmNtZHN0YXQucmVzaWR1YWwgPSByZXNpZDsKLQlzdHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQgPSBzdF9jaGtfcmVzdWx0KHN0cCwgc3RyZXEpOwotCi0JcmV0dXJuIDA7Ci19CiAKIC8qIEhhbmRsZSB0aGUgd3JpdGUtYmVoaW5kIGNoZWNraW5nICh3YWl0cyBmb3IgY29tcGxldGlvbikuIFJldHVybnMgLUVOT1NQQyBpZgogICAgd3JpdGUgaGFzIGJlZW4gY29ycmVjdCBidXQgRU9NIGVhcmx5IHdhcm5pbmcgcmVhY2hlZCwgLUVJTyBpZiB3cml0ZSBlbmRlZCBpbgpAQCAtNjI3LDcgKzY1Miw2IEBACiB7CiAJc3RydWN0IHN0X3JlcXVlc3QgKlNScG50OwogCXVuc2lnbmVkIGNoYXIgY21kW01BWF9DT01NQU5EX1NJWkVdOwotCWludCByZXQ7CiAKIAljbWRbMF0gPSBTUEFDRTsKIAljbWRbMV0gPSAweDAxOwkJLyogU3BhY2UgRmlsZU1hcmtzICovCkBAIC02NDEsMjYgKzY2NSwyMCBAQAogICAgICAgICBERUJDKHByaW50ayhTVF9ERUJfTVNHICIlczogU3RlcHBpbmcgb3ZlciBmaWxlbWFyayAlcy5cbiIsCiAJCSAgIHRhcGVfbmFtZShTVHApLCBmb3J3YXJkID8gImZvcndhcmQiIDogImJhY2t3YXJkIikpOwogCi0JU1JwbnQgPSBzdF9hbGxvY2F0ZV9yZXF1ZXN0KFNUcCk7CisJU1JwbnQgPSBzdF9kb19zY3NpKE5VTEwsIFNUcCwgY21kLCAwLCBETUFfTk9ORSwKKwkJCSAgIFNUcC0+ZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlLT5ycV90aW1lb3V0LAorCQkJICAgTUFYX1JFVFJJRVMsIDEpOwogCWlmICghU1JwbnQpCi0JCXJldHVybiBTVHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQ7CisJCXJldHVybiAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKIAotCXJldCA9IHN0X3Njc2lfa2Vybl9leGVjdXRlKFNScG50LCBjbWQsIERNQV9OT05FLCBOVUxMLCAwLAotCQkJCSAgIFNUcC0+ZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlLT5ycV90aW1lb3V0LAotCQkJCSAgIE1BWF9SRVRSSUVTKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dDsKLQotCXJldCA9IFNUcC0+YnVmZmVyLT5zeXNjYWxsX3Jlc3VsdDsKKwlzdF9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOworCVNScG50ID0gTlVMTDsKIAogCWlmICgoU1RwLT5idWZmZXIpLT5jbWRzdGF0Lm1pZGxldmVsX3Jlc3VsdCAhPSAwKQogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBTdGVwcGluZyBvdmVyIGZpbGVtYXJrICVzIGZhaWxlZC5cbiIsCiAJCSAgIHRhcGVfbmFtZShTVHApLCBmb3J3YXJkID8gImZvcndhcmQiIDogImJhY2t3YXJkIik7CiAKLW91dDoKLQlzdF9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQ7CiB9CiAKIApAQCAtODgxLDI0ICs4OTksMjEgQEAKIAlpbnQgYXR0ZW50aW9ucywgd2FpdHMsIG1heF93YWl0LCBzY29kZTsKIAlpbnQgcmV0dmFsID0gQ0hLUkVTX1JFQURZLCBuZXdfc2Vzc2lvbiA9IDA7CiAJdW5zaWduZWQgY2hhciBjbWRbTUFYX0NPTU1BTkRfU0laRV07Ci0Jc3RydWN0IHN0X3JlcXVlc3QgKlNScG50OworCXN0cnVjdCBzdF9yZXF1ZXN0ICpTUnBudCA9IE5VTEw7CiAJc3RydWN0IHN0X2NtZHN0YXR1cyAqY21kc3RhdHAgPSAmU1RwLT5idWZmZXItPmNtZHN0YXQ7CiAKLQlTUnBudCA9IHN0X2FsbG9jYXRlX3JlcXVlc3QoU1RwKTsKLQlpZiAoIVNScG50KQotCQlyZXR1cm4gU1RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0OwotCiAJbWF4X3dhaXQgPSBkb193YWl0ID8gU1RfQkxPQ0tfU0VDT05EUyA6IDA7CiAKIAlmb3IgKGF0dGVudGlvbnM9d2FpdHM9MDsgOyApIHsKIAkJbWVtc2V0KCh2b2lkICopICZjbWRbMF0sIDAsIE1BWF9DT01NQU5EX1NJWkUpOwogCQljbWRbMF0gPSBURVNUX1VOSVRfUkVBRFk7CisJCVNScG50ID0gc3RfZG9fc2NzaShTUnBudCwgU1RwLCBjbWQsIDAsIERNQV9OT05FLAorCQkJCSAgIFNUcC0+bG9uZ190aW1lb3V0LCBNQVhfUkVBRFlfUkVUUklFUywgMSk7CiAKLQkJcmV0dmFsID0gc3Rfc2NzaV9rZXJuX2V4ZWN1dGUoU1JwbnQsIGNtZCwgRE1BX05PTkUsIE5VTEwsIDAsCi0JCQkJCSAgICAgIFNUcC0+bG9uZ190aW1lb3V0LAotCQkJCQkgICAgICBNQVhfUkVBRFlfUkVUUklFUyk7Ci0JCWlmIChyZXR2YWwpCisJCWlmICghU1JwbnQpIHsKKwkJCXJldHZhbCA9IChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0OwogCQkJYnJlYWs7CisJCX0KIAogCQlpZiAoY21kc3RhdHAtPmhhdmVfc2Vuc2UpIHsKIApAQCAtOTQyLDggKzk1Nyw4IEBACiAJCWJyZWFrOwogCX0KIAotCXN0X3JlbGVhc2VfcmVxdWVzdChTUnBudCk7Ci0KKwlpZiAoU1JwbnQgIT0gTlVMTCkKKwkJc3RfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC0xMDIwLDI0ICsxMDM1LDE3IEBACiAJCX0KIAl9CiAKLQlTUnBudCA9IHN0X2FsbG9jYXRlX3JlcXVlc3QoU1RwKTsKLQlpZiAoIVNScG50KSB7Ci0JCXJldHZhbCA9IFNUcC0+YnVmZmVyLT5zeXNjYWxsX3Jlc3VsdDsKLQkJZ290byBlcnJfb3V0OwotCX0KLQogCWlmIChTVHAtPm9taXRfYmxrbGltcykKIAkJU1RwLT5taW5fYmxvY2sgPSBTVHAtPm1heF9ibG9jayA9ICgtMSk7CiAJZWxzZSB7CiAJCW1lbXNldCgodm9pZCAqKSAmY21kWzBdLCAwLCBNQVhfQ09NTUFORF9TSVpFKTsKIAkJY21kWzBdID0gUkVBRF9CTE9DS19MSU1JVFM7CiAKLQkJcmV0dmFsID0gc3Rfc2NzaV9rZXJuX2V4ZWN1dGUoU1JwbnQsIGNtZCwgRE1BX0ZST01fREVWSUNFLAotCQkJCQkgICAgICBTVHAtPmJ1ZmZlci0+Yl9kYXRhLCA2LAotCQkJCQkgICAgICBTVHAtPmRldmljZS0+cmVxdWVzdF9xdWV1ZS0+cnFfdGltZW91dCwKLQkJCQkJICAgICAgTUFYX1JFQURZX1JFVFJJRVMpOwotCQlpZiAocmV0dmFsKSB7Ci0JCQlzdF9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOworCQlTUnBudCA9IHN0X2RvX3Njc2koU1JwbnQsIFNUcCwgY21kLCA2LCBETUFfRlJPTV9ERVZJQ0UsCisJCQkJICAgU1RwLT5kZXZpY2UtPnJlcXVlc3RfcXVldWUtPnJxX3RpbWVvdXQsCisJCQkJICAgTUFYX1JFQURZX1JFVFJJRVMsIDEpOworCQlpZiAoIVNScG50KSB7CisJCQlyZXR2YWwgPSAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKIAkJCWdvdG8gZXJyX291dDsKIAkJfQogCkBAIC0xMDYxLDEyICsxMDY5LDExIEBACiAJY21kWzBdID0gTU9ERV9TRU5TRTsKIAljbWRbNF0gPSAxMjsKIAotCXJldHZhbCA9IHN0X3Njc2lfa2Vybl9leGVjdXRlKFNScG50LCBjbWQsIERNQV9GUk9NX0RFVklDRSwKLQkJCQkgICAgICBTVHAtPmJ1ZmZlci0+Yl9kYXRhLCAxMiwKLQkJCQkgICAgICBTVHAtPmRldmljZS0+cmVxdWVzdF9xdWV1ZS0+cnFfdGltZW91dCwKLQkJCQkgICAgICBNQVhfUkVBRFlfUkVUUklFUyk7Ci0JaWYgKHJldHZhbCkgewotCQlzdF9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOworCVNScG50ID0gc3RfZG9fc2NzaShTUnBudCwgU1RwLCBjbWQsIDEyLCBETUFfRlJPTV9ERVZJQ0UsCisJCQkgICBTVHAtPmRldmljZS0+cmVxdWVzdF9xdWV1ZS0+cnFfdGltZW91dCwKKwkJCSAgIE1BWF9SRUFEWV9SRVRSSUVTLCAxKTsKKwlpZiAoIVNScG50KSB7CisJCXJldHZhbCA9IChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0OwogCQlnb3RvIGVycl9vdXQ7CiAJfQogCkBAIC0xMjk2LDE3ICsxMzAzLDExIEBACiAJCWNtZFswXSA9IFdSSVRFX0ZJTEVNQVJLUzsKIAkJY21kWzRdID0gMSArIFNUcC0+dHdvX2ZtOwogCi0JCVNScG50ID0gc3RfYWxsb2NhdGVfcmVxdWVzdChTVHApOworCQlTUnBudCA9IHN0X2RvX3Njc2koTlVMTCwgU1RwLCBjbWQsIDAsIERNQV9OT05FLAorCQkJCSAgIFNUcC0+ZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlLT5ycV90aW1lb3V0LAorCQkJCSAgIE1BWF9XUklURV9SRVRSSUVTLCAxKTsKIAkJaWYgKCFTUnBudCkgewotCQkJcmVzdWx0ID0gU1RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0OwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlyZXN1bHQgPSBzdF9zY3NpX2tlcm5fZXhlY3V0ZShTUnBudCwgY21kLCBETUFfTk9ORSwgTlVMTCwgMCwKLQkJCQkJICAgICAgU1RwLT5kZXZpY2UtPnJlcXVlc3RfcXVldWUtPnJxX3RpbWVvdXQsCi0JCQkJCSAgICAgIE1BWF9XUklURV9SRVRSSUVTKTsKLQkJaWYgKHJlc3VsdCkgewotCQkJc3RfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKKwkJCXJlc3VsdCA9IChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0OwogCQkJZ290byBvdXQ7CiAJCX0KIApAQCAtMTQ3MSw4ICsxNDcyLDggQEAKIAogCWlmIChpICYmICgodW5zaWduZWQgbG9uZylidWYgJiBxdWV1ZV9kbWFfYWxpZ25tZW50KAogCQkJCQlTVHAtPmRldmljZS0+cmVxdWVzdF9xdWV1ZSkpID09IDApIHsKLQkJaSA9IHNnbF9tYXBfdXNlcl9wYWdlcygmKFNUYnAtPnNnWzBdKSwgU1RicC0+dXNlX3NnLAotCQkJCSAgICAgICh1bnNpZ25lZCBsb25nKWJ1ZiwgY291bnQsIChpc19yZWFkID8gUkVBRCA6IFdSSVRFKSk7CisJCWkgPSBzZ2xfbWFwX3VzZXJfcGFnZXMoU1RicCwgU1RicC0+dXNlX3NnLCAodW5zaWduZWQgbG9uZylidWYsCisJCQkJICAgICAgIGNvdW50LCAoaXNfcmVhZCA/IFJFQUQgOiBXUklURSkpOwogCQlpZiAoaSA+IDApIHsKIAkJCVNUYnAtPmRvX2RpbyA9IGk7CiAJCQlTVGJwLT5idWZmZXJfYnl0ZXMgPSAwOyAgIC8qIGNhbiBiZSB1c2VkIGFzIHRyYW5zZmVyIGNvdW50ZXIgKi8KQEAgLTE0ODAsNyArMTQ4MSw2IEBACiAJCWVsc2UKIAkJCVNUYnAtPmRvX2RpbyA9IDA7ICAvKiBmYWxsIGJhY2sgdG8gYnVmZmVyaW5nIHdpdGggYW55IGVycm9yICovCiAJCVNUYnAtPnNnX3NlZ3MgPSBTVGJwLT5kb19kaW87Ci0JCVNUYnAtPmZycF9zZ19jdXJyZW50ID0gMDsKIAkJREVCKAogCQkgICAgIGlmIChTVGJwLT5kb19kaW8pIHsKIAkJCVNUcC0+bmJyX2RpbysrOwpAQCAtMTUyNiw3ICsxNTI2LDcgQEAKIAogCVNUYnAgPSBTVHAtPmJ1ZmZlcjsKIAlpZiAoU1RicC0+ZG9fZGlvKSB7Ci0JCXNnbF91bm1hcF91c2VyX3BhZ2VzKCYoU1RicC0+c2dbMF0pLCBTVGJwLT5kb19kaW8sIGlzX3JlYWQpOworCQlzZ2xfdW5tYXBfdXNlcl9wYWdlcyhTVGJwLCBTVGJwLT5kb19kaW8sIGlzX3JlYWQpOwogCQlTVGJwLT5kb19kaW8gPSAwOwogCQlTVGJwLT5zZ19zZWdzID0gMDsKIAl9CkBAIC0yMzcyLDcgKzIzNzIsNiBAQAogewogCXVuc2lnbmVkIGNoYXIgY21kW01BWF9DT01NQU5EX1NJWkVdOwogCXN0cnVjdCBzdF9yZXF1ZXN0ICpTUnBudDsKLQlpbnQgcmV0OwogCiAJbWVtc2V0KGNtZCwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CiAJY21kWzBdID0gTU9ERV9TRU5TRTsKQEAgLTIzODEsMTcgKzIzODAsMTQgQEAKIAljbWRbMl0gPSBwYWdlOwogCWNtZFs0XSA9IDI1NTsKIAotCVNScG50ID0gc3RfYWxsb2NhdGVfcmVxdWVzdChTVHApOwotCWlmICghU1JwbnQpCi0JCXJldHVybiBTVHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQ7CisJU1JwbnQgPSBzdF9kb19zY3NpKE5VTEwsIFNUcCwgY21kLCBjbWRbNF0sIERNQV9GUk9NX0RFVklDRSwKKwkJCSAgIFNUcC0+ZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlLT5ycV90aW1lb3V0LCAwLCAxKTsKKwlpZiAoU1JwbnQgPT0gTlVMTCkKKwkJcmV0dXJuIChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0OwogCi0JcmV0ID0gc3Rfc2NzaV9rZXJuX2V4ZWN1dGUoU1JwbnQsIGNtZCwgRE1BX0ZST01fREVWSUNFLAotCQkJCSAgIFNUcC0+YnVmZmVyLT5iX2RhdGEsIGNtZFs0XSwKLQkJCQkgICBTVHAtPmRldmljZS0+cmVxdWVzdF9xdWV1ZS0+cnFfdGltZW91dCwKLQkJCQkgICBNQVhfUkVUUklFUyk7CiAJc3RfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKIAotCXJldHVybiByZXQgPyA6IFNUcC0+YnVmZmVyLT5zeXNjYWxsX3Jlc3VsdDsKKwlyZXR1cm4gU1RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0OwogfQogCiAKQEAgLTIzOTksOSArMjM5NSwxMCBAQAogICAgaW4gdGhlIGJ1ZmZlciBpcyBjb3JyZWN0bHkgZm9ybWF0dGVkLiBUaGUgbG9uZyB0aW1lb3V0IGlzIHVzZWQgaWYgc2xvdyBpcyBub24temVyby4gKi8KIHN0YXRpYyBpbnQgd3JpdGVfbW9kZV9wYWdlKHN0cnVjdCBzY3NpX3RhcGUgKlNUcCwgaW50IHBhZ2UsIGludCBzbG93KQogewotCWludCBwZ28sIHRpbWVvdXQsIHJldCA9IDA7CisJaW50IHBnbzsKIAl1bnNpZ25lZCBjaGFyIGNtZFtNQVhfQ09NTUFORF9TSVpFXTsKIAlzdHJ1Y3Qgc3RfcmVxdWVzdCAqU1JwbnQ7CisJaW50IHRpbWVvdXQ7CiAKIAltZW1zZXQoY21kLCAwLCBNQVhfQ09NTUFORF9TSVpFKTsKIAljbWRbMF0gPSBNT0RFX1NFTEVDVDsKQEAgLTI0MTUsMjEgKzI0MTIsMTYgQEAKIAkoU1RwLT5idWZmZXIpLT5iX2RhdGFbTUhfT0ZGX0RFVl9TUEVDSUZJQ10gJj0gfk1IX0JJVF9XUDsKIAkoU1RwLT5idWZmZXIpLT5iX2RhdGFbcGdvICsgTVBfT0ZGX1BBR0VfTkJSXSAmPSBNUF9NU0tfUEFHRV9OQlI7CiAKLQlTUnBudCA9IHN0X2FsbG9jYXRlX3JlcXVlc3QoU1RwKTsKLQlpZiAoIVNScG50KQotCQlyZXR1cm4gcmV0OwotCi0JdGltZW91dCA9IHNsb3cgPyBTVHAtPmxvbmdfdGltZW91dCA6Ci0JCVNUcC0+ZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlLT5ycV90aW1lb3V0OwotCi0JcmV0ID0gc3Rfc2NzaV9rZXJuX2V4ZWN1dGUoU1JwbnQsIGNtZCwgRE1BX1RPX0RFVklDRSwKLQkJCQkgICBTVHAtPmJ1ZmZlci0+Yl9kYXRhLCBjbWRbNF0sIHRpbWVvdXQsIDApOwotCWlmICghcmV0KQotCQlyZXQgPSBTVHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQ7CisJdGltZW91dCA9IHNsb3cgPworCQlTVHAtPmxvbmdfdGltZW91dCA6IFNUcC0+ZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlLT5ycV90aW1lb3V0OworCVNScG50ID0gc3RfZG9fc2NzaShOVUxMLCBTVHAsIGNtZCwgY21kWzRdLCBETUFfVE9fREVWSUNFLAorCQkJICAgdGltZW91dCwgMCwgMSk7CisJaWYgKFNScG50ID09IE5VTEwpCisJCXJldHVybiAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKIAogCXN0X3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiBTVHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQ7CiB9CiAKIApAQCAtMjU0NywxNiArMjUzOSwxMyBAQAogCQlwcmludGsoU1RfREVCX01TRyAiJXM6IExvYWRpbmcgdGFwZS5cbiIsIG5hbWUpOwogCQkpOwogCi0JU1JwbnQgPSBzdF9hbGxvY2F0ZV9yZXF1ZXN0KFNUcCk7CisJU1JwbnQgPSBzdF9kb19zY3NpKE5VTEwsIFNUcCwgY21kLCAwLCBETUFfTk9ORSwKKwkJCSAgIHRpbWVvdXQsIE1BWF9SRVRSSUVTLCAxKTsKIAlpZiAoIVNScG50KQotCQlyZXR1cm4gU1RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0OwotCi0JcmV0dmFsID0gc3Rfc2NzaV9rZXJuX2V4ZWN1dGUoU1JwbnQsIGNtZCwgRE1BX05PTkUsIE5VTEwsIDAsIHRpbWVvdXQsCi0JCQkJICAgICAgTUFYX1JFVFJJRVMpOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gb3V0OworCQlyZXR1cm4gKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQ7CiAKIAlyZXR2YWwgPSAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKKwlzdF9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOwogCiAJaWYgKCFyZXR2YWwpIHsJLyogU0NTSSBjb21tYW5kIHN1Y2Nlc3NmdWwgKi8KIApAQCAtMjU3NSw4ICsyNTY0LDYgQEAKIAkJU1RwcyA9ICYoU1RwLT5wc1tTVHAtPnBhcnRpdGlvbl0pOwogCQlTVHBzLT5kcnZfZmlsZSA9IFNUcHMtPmRydl9ibG9jayA9ICgtMSk7CiAJfQotb3V0OgotCXN0X3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CiAKIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtMjg1MiwxNSArMjgzOSwxMiBAQAogCQlyZXR1cm4gKC1FTk9TWVMpOwogCX0KIAotCVNScG50ID0gc3RfYWxsb2NhdGVfcmVxdWVzdChTVHApOworCVNScG50ID0gc3RfZG9fc2NzaShOVUxMLCBTVHAsIGNtZCwgZGF0YWxlbiwgZGlyZWN0aW9uLAorCQkJICAgdGltZW91dCwgTUFYX1JFVFJJRVMsIDEpOwogCWlmICghU1JwbnQpCiAJCXJldHVybiAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKIAotCWlvY3RsX3Jlc3VsdCA9IHN0X3Njc2lfa2Vybl9leGVjdXRlKFNScG50LCBjbWQsIGRpcmVjdGlvbiwKLQkJCQkJICAgIFNUcC0+YnVmZmVyLT5iX2RhdGEsIGRhdGFsZW4sCi0JCQkJCSAgICB0aW1lb3V0LCBNQVhfUkVUUklFUyk7Ci0JaWYgKCFpb2N0bF9yZXN1bHQpCi0JCWlvY3RsX3Jlc3VsdCA9IChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0OworCWlvY3RsX3Jlc3VsdCA9IChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0OwogCiAJaWYgKCFpb2N0bF9yZXN1bHQpIHsJLyogU0NTSSBjb21tYW5kIHN1Y2Nlc3NmdWwgKi8KIAkJc3RfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKQEAgLTMwMjIsMTcgKzMwMDYsMTEgQEAKIAkJaWYgKCFsb2dpY2FsICYmICFTVHAtPnNjc2kyX2xvZ2ljYWwpCiAJCQlzY21kWzFdID0gMTsKIAl9Ci0KLQlTUnBudCA9IHN0X2FsbG9jYXRlX3JlcXVlc3QoU1RwKTsKKwlTUnBudCA9IHN0X2RvX3Njc2koTlVMTCwgU1RwLCBzY21kLCAyMCwgRE1BX0ZST01fREVWSUNFLAorCQkJICAgU1RwLT5kZXZpY2UtPnJlcXVlc3RfcXVldWUtPnJxX3RpbWVvdXQsCisJCQkgICBNQVhfUkVBRFlfUkVUUklFUywgMSk7CiAJaWYgKCFTUnBudCkKLQkJcmV0dXJuIFNUcC0+YnVmZmVyLT5zeXNjYWxsX3Jlc3VsdDsKLQotCXJlc3VsdCA9IHN0X3Njc2lfa2Vybl9leGVjdXRlKFNScG50LCBzY21kLCBETUFfRlJPTV9ERVZJQ0UsCi0JCQkJICAgICAgU1RwLT5idWZmZXItPmJfZGF0YSwgMjAsCi0JCQkJICAgICAgU1RwLT5kZXZpY2UtPnJlcXVlc3RfcXVldWUtPnJxX3RpbWVvdXQsCi0JCQkJICAgICAgTUFYX1JFQURZX1JFVFJJRVMpOwotCWlmIChyZXN1bHQpCi0JCWdvdG8gb3V0OworCQlyZXR1cm4gKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQ7CiAKIAlpZiAoKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQgIT0gMCB8fAogCSAgICAoU1RwLT5kZXZpY2UtPnNjc2lfbGV2ZWwgPj0gU0NTSV8yICYmCkBAIC0zMDYwLDcgKzMwMzgsNiBAQAogICAgICAgICAgICAgICAgIERFQkMocHJpbnRrKFNUX0RFQl9NU0cgIiVzOiBHb3QgdGFwZSBwb3MuIGJsayAlZCBwYXJ0ICVkLlxuIiwgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYmxvY2ssICpwYXJ0aXRpb24pKTsKIAl9Ci1vdXQ6CiAJc3RfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKIAlTUnBudCA9IE5VTEw7CiAKQEAgLTMxMzUsMTQgKzMxMTIsMTAgQEAKIAkJdGltZW91dCA9IFNUcC0+ZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlLT5ycV90aW1lb3V0OwogCX0KIAotCVNScG50ID0gc3RfYWxsb2NhdGVfcmVxdWVzdChTVHApOworCVNScG50ID0gc3RfZG9fc2NzaShOVUxMLCBTVHAsIHNjbWQsIDAsIERNQV9OT05FLAorCQkJICAgdGltZW91dCwgTUFYX1JFQURZX1JFVFJJRVMsIDEpOwogCWlmICghU1JwbnQpCi0JCXJldHVybiBTVHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQ7Ci0KLQlyZXN1bHQgPSBzdF9zY3NpX2tlcm5fZXhlY3V0ZShTUnBudCwgc2NtZCwgRE1BX05PTkUsIE5VTEwsIDAsCi0JCQkJICAgICAgdGltZW91dCwgTUFYX1JFQURZX1JFVFJJRVMpOwotCWlmIChyZXN1bHQpCi0JCWdvdG8gb3V0OworCQlyZXR1cm4gKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQ7CiAKIAlTVHBzLT5kcnZfYmxvY2sgPSBTVHBzLT5kcnZfZmlsZSA9ICgtMSk7CiAJU1Rwcy0+ZW9mID0gU1RfTk9FT0Y7CkBAIC0zMTY3LDcgKzMxNDAsNyBAQAogCQkJU1Rwcy0+ZHJ2X2Jsb2NrID0gU1Rwcy0+ZHJ2X2ZpbGUgPSAwOwogCQlyZXN1bHQgPSAwOwogCX0KLW91dDoKKwogCXN0X3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CiAJU1JwbnQgPSBOVUxMOwogCkBAIC0zNjk2LDM4ICszNjY5LDM0IEBACiAKIC8qIFRyeSB0byBhbGxvY2F0ZSBhIG5ldyB0YXBlIGJ1ZmZlci4gQ2FsbGluZyBmdW5jdGlvbiBtdXN0IG5vdCBob2xkCiAgICBkZXZfYXJyX2xvY2suICovCi1zdGF0aWMgc3RydWN0IHN0X2J1ZmZlciAqCi0gbmV3X3RhcGVfYnVmZmVyKGludCBmcm9tX2luaXRpYWxpemF0aW9uLCBpbnQgbmVlZF9kbWEsIGludCBtYXhfc2cpCitzdGF0aWMgc3RydWN0IHN0X2J1ZmZlciAqbmV3X3RhcGVfYnVmZmVyKGludCBuZWVkX2RtYSwgaW50IG1heF9zZykKIHsKLQlpbnQgaSwgZ290ID0gMDsKLQlnZnBfdCBwcmlvcml0eTsKIAlzdHJ1Y3Qgc3RfYnVmZmVyICp0YjsKIAotCWlmIChmcm9tX2luaXRpYWxpemF0aW9uKQotCQlwcmlvcml0eSA9IEdGUF9BVE9NSUM7Ci0JZWxzZQotCQlwcmlvcml0eSA9IEdGUF9LRVJORUw7Ci0KLQlpID0gc2l6ZW9mKHN0cnVjdCBzdF9idWZmZXIpICsgKG1heF9zZyAtIDEpICogc2l6ZW9mKHN0cnVjdCBzY2F0dGVybGlzdCkgKwotCQltYXhfc2cgKiBzaXplb2Yoc3RydWN0IHN0X2J1Zl9mcmFnbWVudCk7Ci0JdGIgPSBremFsbG9jKGksIHByaW9yaXR5KTsKKwl0YiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzdF9idWZmZXIpLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXRiKSB7CiAJCXByaW50ayhLRVJOX05PVElDRSAic3Q6IENhbid0IGFsbG9jYXRlIG5ldyB0YXBlIGJ1ZmZlci5cbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JdGItPmZycF9zZWdzID0gdGItPm9yaWdfZnJwX3NlZ3MgPSAwOworCXRiLT5mcnBfc2VncyA9IDA7CiAJdGItPnVzZV9zZyA9IG1heF9zZzsKLQl0Yi0+ZnJwID0gKHN0cnVjdCBzdF9idWZfZnJhZ21lbnQgKikoJih0Yi0+c2dbMF0pICsgbWF4X3NnKTsKLQogCXRiLT5kbWEgPSBuZWVkX2RtYTsKLQl0Yi0+YnVmZmVyX3NpemUgPSBnb3Q7Ci0Jc2dfaW5pdF90YWJsZSh0Yi0+c2csIG1heF9zZyk7CisJdGItPmJ1ZmZlcl9zaXplID0gMDsKKworCXRiLT5yZXNlcnZlZF9wYWdlcyA9IGt6YWxsb2MobWF4X3NnICogc2l6ZW9mKHN0cnVjdCBwYWdlICopLAorCQkJCSAgICAgR0ZQX0FUT01JQyk7CisJaWYgKCF0Yi0+cmVzZXJ2ZWRfcGFnZXMpIHsKKwkJa2ZyZWUodGIpOworCQlyZXR1cm4gTlVMTDsKKwl9CiAKIAlyZXR1cm4gdGI7CiB9CiAKIAogLyogVHJ5IHRvIGFsbG9jYXRlIGVub3VnaCBzcGFjZSBpbiB0aGUgdGFwZSBidWZmZXIgKi8KKyNkZWZpbmUgU1RfTUFYX09SREVSIDYKKwogc3RhdGljIGludCBlbmxhcmdlX2J1ZmZlcihzdHJ1Y3Qgc3RfYnVmZmVyICogU1RidWZmZXIsIGludCBuZXdfc2l6ZSwgaW50IG5lZWRfZG1hKQogewogCWludCBzZWdzLCBuYnIsIG1heF9zZWdzLCBiX3NpemUsIG9yZGVyLCBnb3Q7CkBAIC0zNzQ3LDMzICszNzE2LDQ1IEBACiAJcHJpb3JpdHkgPSBHRlBfS0VSTkVMIHwgX19HRlBfTk9XQVJOOwogCWlmIChuZWVkX2RtYSkKIAkJcHJpb3JpdHkgfD0gR0ZQX0RNQTsKLQlmb3IgKGJfc2l6ZSA9IFBBR0VfU0laRSwgb3JkZXI9MDsgb3JkZXIgPD0gNiAmJgotCSAgICAgYl9zaXplIDwgbmV3X3NpemUgLSBTVGJ1ZmZlci0+YnVmZmVyX3NpemU7Ci0JICAgICBvcmRlcisrLCBiX3NpemUgKj0gMikKLQkJOyAgLyogZW1wdHkgKi8KKworCWlmIChTVGJ1ZmZlci0+Y2xlYXJlZCkKKwkJcHJpb3JpdHkgfD0gX19HRlBfWkVSTzsKKworCWlmIChTVGJ1ZmZlci0+ZnJwX3NlZ3MpIHsKKwkJb3JkZXIgPSBTVGJ1ZmZlci0+bWFwX2RhdGEucGFnZV9vcmRlcjsKKwkJYl9zaXplID0gUEFHRV9TSVpFIDw8IG9yZGVyOworCX0gZWxzZSB7CisJCWZvciAoYl9zaXplID0gUEFHRV9TSVpFLCBvcmRlciA9IDA7CisJCSAgICAgb3JkZXIgPCBTVF9NQVhfT1JERVIgJiYgYl9zaXplIDwgbmV3X3NpemU7CisJCSAgICAgb3JkZXIrKywgYl9zaXplICo9IDIpCisJCQk7ICAvKiBlbXB0eSAqLworCX0KKwlpZiAobWF4X3NlZ3MgKiAoUEFHRV9TSVpFIDw8IG9yZGVyKSA8IG5ld19zaXplKSB7CisJCWlmIChvcmRlciA9PSBTVF9NQVhfT1JERVIpCisJCQlyZXR1cm4gMDsKKwkJbm9ybWFsaXplX2J1ZmZlcihTVGJ1ZmZlcik7CisJCXJldHVybiBlbmxhcmdlX2J1ZmZlcihTVGJ1ZmZlciwgbmV3X3NpemUsIG5lZWRfZG1hKTsKKwl9CiAKIAlmb3IgKHNlZ3MgPSBTVGJ1ZmZlci0+ZnJwX3NlZ3MsIGdvdCA9IFNUYnVmZmVyLT5idWZmZXJfc2l6ZTsKIAkgICAgIHNlZ3MgPCBtYXhfc2VncyAmJiBnb3QgPCBuZXdfc2l6ZTspIHsKLQkJU1RidWZmZXItPmZycFtzZWdzXS5wYWdlID0gYWxsb2NfcGFnZXMocHJpb3JpdHksIG9yZGVyKTsKLQkJaWYgKFNUYnVmZmVyLT5mcnBbc2Vnc10ucGFnZSA9PSBOVUxMKSB7Ci0JCQlpZiAobmV3X3NpemUgLSBnb3QgPD0gKG1heF9zZWdzIC0gc2VncykgKiBiX3NpemUgLyAyKSB7Ci0JCQkJYl9zaXplIC89IDI7IC8qIExhcmdlIGVub3VnaCBmb3IgdGhlIHJlc3Qgb2YgdGhlIGJ1ZmZlcnMgKi8KLQkJCQlvcmRlci0tOwotCQkJCWNvbnRpbnVlOwotCQkJfQorCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCQlwYWdlID0gYWxsb2NfcGFnZXMocHJpb3JpdHksIG9yZGVyKTsKKwkJaWYgKCFwYWdlKSB7CiAJCQlERUIoU1RidWZmZXItPmJ1ZmZlcl9zaXplID0gZ290KTsKIAkJCW5vcm1hbGl6ZV9idWZmZXIoU1RidWZmZXIpOwogCQkJcmV0dXJuIDA7CiAJCX0KLQkJU1RidWZmZXItPmZycFtzZWdzXS5sZW5ndGggPSBiX3NpemU7CisKIAkJU1RidWZmZXItPmZycF9zZWdzICs9IDE7CiAJCWdvdCArPSBiX3NpemU7CiAJCVNUYnVmZmVyLT5idWZmZXJfc2l6ZSA9IGdvdDsKLQkJaWYgKFNUYnVmZmVyLT5jbGVhcmVkKQotCQkJbWVtc2V0KHBhZ2VfYWRkcmVzcyhTVGJ1ZmZlci0+ZnJwW3NlZ3NdLnBhZ2UpLCAwLCBiX3NpemUpOworCQlTVGJ1ZmZlci0+cmVzZXJ2ZWRfcGFnZXNbc2Vnc10gPSBwYWdlOwogCQlzZWdzKys7CiAJfQotCVNUYnVmZmVyLT5iX2RhdGEgPSBwYWdlX2FkZHJlc3MoU1RidWZmZXItPmZycFswXS5wYWdlKTsKKwlTVGJ1ZmZlci0+Yl9kYXRhID0gcGFnZV9hZGRyZXNzKFNUYnVmZmVyLT5yZXNlcnZlZF9wYWdlc1swXSk7CisJU1RidWZmZXItPm1hcF9kYXRhLnBhZ2Vfb3JkZXIgPSBvcmRlcjsKIAogCXJldHVybiAxOwogfQpAQCAtMzc4NSw3ICszNzY2LDggQEAKIAlpbnQgaTsKIAogCWZvciAoaT0wOyBpIDwgc3RfYnAtPmZycF9zZWdzOyBpKyspCi0JCW1lbXNldChwYWdlX2FkZHJlc3Moc3RfYnAtPmZycFtpXS5wYWdlKSwgMCwgc3RfYnAtPmZycFtpXS5sZW5ndGgpOworCQltZW1zZXQocGFnZV9hZGRyZXNzKHN0X2JwLT5yZXNlcnZlZF9wYWdlc1tpXSksIDAsCisJCSAgICAgICBQQUdFX1NJWkUgPDwgc3RfYnAtPm1hcF9kYXRhLnBhZ2Vfb3JkZXIpOwogCXN0X2JwLT5jbGVhcmVkID0gMTsKIH0KIApAQCAtMzc5MywxNiArMzc3NSwxNiBAQAogLyogUmVsZWFzZSB0aGUgZXh0cmEgYnVmZmVyICovCiBzdGF0aWMgdm9pZCBub3JtYWxpemVfYnVmZmVyKHN0cnVjdCBzdF9idWZmZXIgKiBTVGJ1ZmZlcikKIHsKLQlpbnQgaSwgb3JkZXI7CisJaW50IGksIG9yZGVyID0gU1RidWZmZXItPm1hcF9kYXRhLnBhZ2Vfb3JkZXI7CiAKLQlmb3IgKGkgPSBTVGJ1ZmZlci0+b3JpZ19mcnBfc2VnczsgaSA8IFNUYnVmZmVyLT5mcnBfc2VnczsgaSsrKSB7Ci0JCW9yZGVyID0gZ2V0X29yZGVyKFNUYnVmZmVyLT5mcnBbaV0ubGVuZ3RoKTsKLQkJX19mcmVlX3BhZ2VzKFNUYnVmZmVyLT5mcnBbaV0ucGFnZSwgb3JkZXIpOwotCQlTVGJ1ZmZlci0+YnVmZmVyX3NpemUgLT0gU1RidWZmZXItPmZycFtpXS5sZW5ndGg7CisJZm9yIChpID0gMDsgaSA8IFNUYnVmZmVyLT5mcnBfc2VnczsgaSsrKSB7CisJCV9fZnJlZV9wYWdlcyhTVGJ1ZmZlci0+cmVzZXJ2ZWRfcGFnZXNbaV0sIG9yZGVyKTsKKwkJU1RidWZmZXItPmJ1ZmZlcl9zaXplIC09IChQQUdFX1NJWkUgPDwgb3JkZXIpOwogCX0KLQlTVGJ1ZmZlci0+ZnJwX3NlZ3MgPSBTVGJ1ZmZlci0+b3JpZ19mcnBfc2VnczsKLQlTVGJ1ZmZlci0+ZnJwX3NnX2N1cnJlbnQgPSAwOworCVNUYnVmZmVyLT5mcnBfc2VncyA9IDA7CiAJU1RidWZmZXItPnNnX3NlZ3MgPSAwOworCVNUYnVmZmVyLT5tYXBfZGF0YS5wYWdlX29yZGVyID0gMDsKKwlTVGJ1ZmZlci0+bWFwX2RhdGEub2Zmc2V0ID0gMDsKIH0KIAogCkBAIC0zODExLDE4ICszNzkzLDE5IEBACiBzdGF0aWMgaW50IGFwcGVuZF90b19idWZmZXIoY29uc3QgY2hhciBfX3VzZXIgKnVicCwgc3RydWN0IHN0X2J1ZmZlciAqIHN0X2JwLCBpbnQgZG9fY291bnQpCiB7CiAJaW50IGksIGNudCwgcmVzLCBvZmZzZXQ7CisJaW50IGxlbmd0aCA9IFBBR0VfU0laRSA8PCBzdF9icC0+bWFwX2RhdGEucGFnZV9vcmRlcjsKIAogCWZvciAoaSA9IDAsIG9mZnNldCA9IHN0X2JwLT5idWZmZXJfYnl0ZXM7Ci0JICAgICBpIDwgc3RfYnAtPmZycF9zZWdzICYmIG9mZnNldCA+PSBzdF9icC0+ZnJwW2ldLmxlbmd0aDsgaSsrKQotCQlvZmZzZXQgLT0gc3RfYnAtPmZycFtpXS5sZW5ndGg7CisJICAgICBpIDwgc3RfYnAtPmZycF9zZWdzICYmIG9mZnNldCA+PSBsZW5ndGg7IGkrKykKKwkJb2Zmc2V0IC09IGxlbmd0aDsKIAlpZiAoaSA9PSBzdF9icC0+ZnJwX3NlZ3MpIHsJLyogU2hvdWxkIG5ldmVyIGhhcHBlbiAqLwogCQlwcmludGsoS0VSTl9XQVJOSU5HICJzdDogYXBwZW5kX3RvX2J1ZmZlciBvZmZzZXQgb3ZlcmZsb3cuXG4iKTsKIAkJcmV0dXJuICgtRUlPKTsKIAl9CiAJZm9yICg7IGkgPCBzdF9icC0+ZnJwX3NlZ3MgJiYgZG9fY291bnQgPiAwOyBpKyspIHsKLQkJY250ID0gc3RfYnAtPmZycFtpXS5sZW5ndGggLSBvZmZzZXQgPCBkb19jb3VudCA/Ci0JCSAgICBzdF9icC0+ZnJwW2ldLmxlbmd0aCAtIG9mZnNldCA6IGRvX2NvdW50OwotCQlyZXMgPSBjb3B5X2Zyb21fdXNlcihwYWdlX2FkZHJlc3Moc3RfYnAtPmZycFtpXS5wYWdlKSArIG9mZnNldCwgdWJwLCBjbnQpOworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHN0X2JwLT5yZXNlcnZlZF9wYWdlc1tpXTsKKwkJY250ID0gbGVuZ3RoIC0gb2Zmc2V0IDwgZG9fY291bnQgPyBsZW5ndGggLSBvZmZzZXQgOiBkb19jb3VudDsKKwkJcmVzID0gY29weV9mcm9tX3VzZXIocGFnZV9hZGRyZXNzKHBhZ2UpICsgb2Zmc2V0LCB1YnAsIGNudCk7CiAJCWlmIChyZXMpCiAJCQlyZXR1cm4gKC1FRkFVTFQpOwogCQlkb19jb3VudCAtPSBjbnQ7CkBAIC0zODQyLDE4ICszODI1LDE5IEBACiBzdGF0aWMgaW50IGZyb21fYnVmZmVyKHN0cnVjdCBzdF9idWZmZXIgKiBzdF9icCwgY2hhciBfX3VzZXIgKnVicCwgaW50IGRvX2NvdW50KQogewogCWludCBpLCBjbnQsIHJlcywgb2Zmc2V0OworCWludCBsZW5ndGggPSBQQUdFX1NJWkUgPDwgc3RfYnAtPm1hcF9kYXRhLnBhZ2Vfb3JkZXI7CiAKIAlmb3IgKGkgPSAwLCBvZmZzZXQgPSBzdF9icC0+cmVhZF9wb2ludGVyOwotCSAgICAgaSA8IHN0X2JwLT5mcnBfc2VncyAmJiBvZmZzZXQgPj0gc3RfYnAtPmZycFtpXS5sZW5ndGg7IGkrKykKLQkJb2Zmc2V0IC09IHN0X2JwLT5mcnBbaV0ubGVuZ3RoOworCSAgICAgaSA8IHN0X2JwLT5mcnBfc2VncyAmJiBvZmZzZXQgPj0gbGVuZ3RoOyBpKyspCisJCW9mZnNldCAtPSBsZW5ndGg7CiAJaWYgKGkgPT0gc3RfYnAtPmZycF9zZWdzKSB7CS8qIFNob3VsZCBuZXZlciBoYXBwZW4gKi8KIAkJcHJpbnRrKEtFUk5fV0FSTklORyAic3Q6IGZyb21fYnVmZmVyIG9mZnNldCBvdmVyZmxvdy5cbiIpOwogCQlyZXR1cm4gKC1FSU8pOwogCX0KIAlmb3IgKDsgaSA8IHN0X2JwLT5mcnBfc2VncyAmJiBkb19jb3VudCA+IDA7IGkrKykgewotCQljbnQgPSBzdF9icC0+ZnJwW2ldLmxlbmd0aCAtIG9mZnNldCA8IGRvX2NvdW50ID8KLQkJICAgIHN0X2JwLT5mcnBbaV0ubGVuZ3RoIC0gb2Zmc2V0IDogZG9fY291bnQ7Ci0JCXJlcyA9IGNvcHlfdG9fdXNlcih1YnAsIHBhZ2VfYWRkcmVzcyhzdF9icC0+ZnJwW2ldLnBhZ2UpICsgb2Zmc2V0LCBjbnQpOworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHN0X2JwLT5yZXNlcnZlZF9wYWdlc1tpXTsKKwkJY250ID0gbGVuZ3RoIC0gb2Zmc2V0IDwgZG9fY291bnQgPyBsZW5ndGggLSBvZmZzZXQgOiBkb19jb3VudDsKKwkJcmVzID0gY29weV90b191c2VyKHVicCwgcGFnZV9hZGRyZXNzKHBhZ2UpICsgb2Zmc2V0LCBjbnQpOwogCQlpZiAocmVzKQogCQkJcmV0dXJuICgtRUZBVUxUKTsKIAkJZG9fY291bnQgLT0gY250OwpAQCAtMzg3NCw2ICszODU4LDcgQEAKIHsKIAlpbnQgc3JjX3NlZywgZHN0X3NlZywgc3JjX29mZnNldCA9IDAsIGRzdF9vZmZzZXQ7CiAJaW50IGNvdW50LCB0b3RhbDsKKwlpbnQgbGVuZ3RoID0gUEFHRV9TSVpFIDw8IHN0X2JwLT5tYXBfZGF0YS5wYWdlX29yZGVyOwogCiAJaWYgKG9mZnNldCA9PSAwKQogCQlyZXR1cm47CkBAIC0zODgxLDI0ICszODY2LDI2IEBACiAJdG90YWw9c3RfYnAtPmJ1ZmZlcl9ieXRlcyAtIG9mZnNldDsKIAlmb3IgKHNyY19zZWc9MDsgc3JjX3NlZyA8IHN0X2JwLT5mcnBfc2Vnczsgc3JjX3NlZysrKSB7CiAJCXNyY19vZmZzZXQgPSBvZmZzZXQ7Ci0JCWlmIChzcmNfb2Zmc2V0IDwgc3RfYnAtPmZycFtzcmNfc2VnXS5sZW5ndGgpCisJCWlmIChzcmNfb2Zmc2V0IDwgbGVuZ3RoKQogCQkJYnJlYWs7Ci0JCW9mZnNldCAtPSBzdF9icC0+ZnJwW3NyY19zZWddLmxlbmd0aDsKKwkJb2Zmc2V0IC09IGxlbmd0aDsKIAl9CiAKIAlzdF9icC0+YnVmZmVyX2J5dGVzID0gc3RfYnAtPnJlYWRfcG9pbnRlciA9IHRvdGFsOwogCWZvciAoZHN0X3NlZz1kc3Rfb2Zmc2V0PTA7IHRvdGFsID4gMDsgKSB7Ci0JCWNvdW50ID0gbWluKHN0X2JwLT5mcnBbZHN0X3NlZ10ubGVuZ3RoIC0gZHN0X29mZnNldCwKLQkJCSAgICBzdF9icC0+ZnJwW3NyY19zZWddLmxlbmd0aCAtIHNyY19vZmZzZXQpOwotCQltZW1tb3ZlKHBhZ2VfYWRkcmVzcyhzdF9icC0+ZnJwW2RzdF9zZWddLnBhZ2UpICsgZHN0X29mZnNldCwKLQkJCXBhZ2VfYWRkcmVzcyhzdF9icC0+ZnJwW3NyY19zZWddLnBhZ2UpICsgc3JjX29mZnNldCwgY291bnQpOworCQlzdHJ1Y3QgcGFnZSAqZHBhZ2UgPSBzdF9icC0+cmVzZXJ2ZWRfcGFnZXNbZHN0X3NlZ107CisJCXN0cnVjdCBwYWdlICpzcGFnZSA9IHN0X2JwLT5yZXNlcnZlZF9wYWdlc1tzcmNfc2VnXTsKKworCQljb3VudCA9IG1pbihsZW5ndGggLSBkc3Rfb2Zmc2V0LCBsZW5ndGggLSBzcmNfb2Zmc2V0KTsKKwkJbWVtbW92ZShwYWdlX2FkZHJlc3MoZHBhZ2UpICsgZHN0X29mZnNldCwKKwkJCXBhZ2VfYWRkcmVzcyhzcGFnZSkgKyBzcmNfb2Zmc2V0LCBjb3VudCk7CiAJCXNyY19vZmZzZXQgKz0gY291bnQ7Ci0JCWlmIChzcmNfb2Zmc2V0ID49IHN0X2JwLT5mcnBbc3JjX3NlZ10ubGVuZ3RoKSB7CisJCWlmIChzcmNfb2Zmc2V0ID49IGxlbmd0aCkgewogCQkJc3JjX3NlZysrOwogCQkJc3JjX29mZnNldCA9IDA7CiAJCX0KIAkJZHN0X29mZnNldCArPSBjb3VudDsKLQkJaWYgKGRzdF9vZmZzZXQgPj0gc3RfYnAtPmZycFtkc3Rfc2VnXS5sZW5ndGgpIHsKKwkJaWYgKGRzdF9vZmZzZXQgPj0gbGVuZ3RoKSB7CiAJCQlkc3Rfc2VnKys7CiAJCQlkc3Rfb2Zmc2V0ID0gMDsKIAkJfQpAQCAtMzkwNiwzMiArMzg5Myw2IEBACiAJfQogfQogCi0KLS8qIEZpbGwgdGhlIHMvZyBsaXN0IHVwIHRvIHRoZSBsZW5ndGggcmVxdWlyZWQgZm9yIHRoaXMgdHJhbnNmZXIgKi8KLXN0YXRpYyB2b2lkIGJ1Zl90b19zZyhzdHJ1Y3Qgc3RfYnVmZmVyICpTVGJwLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQotewotCWludCBpOwotCXVuc2lnbmVkIGludCBjb3VudDsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwotCXN0cnVjdCBzdF9idWZfZnJhZ21lbnQgKmZycDsKLQotCWlmIChsZW5ndGggPT0gU1RicC0+ZnJwX3NnX2N1cnJlbnQpCi0JCXJldHVybjsgICAvKiB3b3JrIGFscmVhZHkgZG9uZSAqLwotCi0Jc2cgPSAmKFNUYnAtPnNnWzBdKTsKLQlmcnAgPSBTVGJwLT5mcnA7Ci0JZm9yIChpPWNvdW50PTA7IGNvdW50IDwgbGVuZ3RoOyBpKyspIHsKLQkJaWYgKGxlbmd0aCAtIGNvdW50ID4gZnJwW2ldLmxlbmd0aCkKLQkJCXNnX3NldF9wYWdlKCZzZ1tpXSwgZnJwW2ldLnBhZ2UsIGZycFtpXS5sZW5ndGgsIDApOwotCQllbHNlCi0JCQlzZ19zZXRfcGFnZSgmc2dbaV0sIGZycFtpXS5wYWdlLCBsZW5ndGggLSBjb3VudCwgMCk7Ci0JCWNvdW50ICs9IHNnW2ldLmxlbmd0aDsKLQl9Ci0JU1RicC0+c2dfc2VncyA9IGk7Ci0JU1RicC0+ZnJwX3NnX2N1cnJlbnQgPSBsZW5ndGg7Ci19Ci0KLQogLyogVmFsaWRhdGUgdGhlIG9wdGlvbnMgZnJvbSBjb21tYW5kIGxpbmUgb3IgbW9kdWxlIHBhcmFtZXRlcnMgKi8KIHN0YXRpYyB2b2lkIHZhbGlkYXRlX29wdGlvbnModm9pZCkKIHsKQEAgLTQwMjYsNyArMzk4Nyw3IEBACiAJCVNEcC0+cmVxdWVzdF9xdWV1ZS0+bWF4X3BoeXNfc2VnbWVudHMpOwogCWlmIChzdF9tYXhfc2dfc2VncyA8IGkpCiAJCWkgPSBzdF9tYXhfc2dfc2VnczsKLQlidWZmZXIgPSBuZXdfdGFwZV9idWZmZXIoMSwgKFNEcC0+aG9zdCktPnVuY2hlY2tlZF9pc2FfZG1hLCBpKTsKKwlidWZmZXIgPSBuZXdfdGFwZV9idWZmZXIoKFNEcC0+aG9zdCktPnVuY2hlY2tlZF9pc2FfZG1hLCBpKTsKIAlpZiAoYnVmZmVyID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSCiAJCSAgICAgICAic3Q6IENhbid0IGFsbG9jYXRlIG5ldyB0YXBlIGJ1ZmZlci4gRGV2aWNlIG5vdCBhdHRhY2hlZC5cbiIpOwpAQCAtNDI4MCw4ICs0MjQxLDggQEAKIAl0cG50LT5kZXZpY2UgPSBOVUxMOwogCiAJaWYgKHRwbnQtPmJ1ZmZlcikgewotCQl0cG50LT5idWZmZXItPm9yaWdfZnJwX3NlZ3MgPSAwOwogCQlub3JtYWxpemVfYnVmZmVyKHRwbnQtPmJ1ZmZlcik7CisJCWtmcmVlKHRwbnQtPmJ1ZmZlci0+cmVzZXJ2ZWRfcGFnZXMpOwogCQlrZnJlZSh0cG50LT5idWZmZXIpOwogCX0KIApAQCAtNDU2NywxNCArNDUyOCwxNiBAQAogfQogCiAvKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBtYXkgYmUgdXNlZnVsIGZvciBhIGxhcmdlciBhdWRpZW5jZS4gKi8KLXN0YXRpYyBpbnQgc2dsX21hcF91c2VyX3BhZ2VzKHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsLCBjb25zdCB1bnNpZ25lZCBpbnQgbWF4X3BhZ2VzLCAKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdWFkZHIsIHNpemVfdCBjb3VudCwgaW50IHJ3KQorc3RhdGljIGludCBzZ2xfbWFwX3VzZXJfcGFnZXMoc3RydWN0IHN0X2J1ZmZlciAqU1RicCwKKwkJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBtYXhfcGFnZXMsIHVuc2lnbmVkIGxvbmcgdWFkZHIsCisJCQkgICAgICBzaXplX3QgY291bnQsIGludCBydykKIHsKIAl1bnNpZ25lZCBsb25nIGVuZCA9ICh1YWRkciArIGNvdW50ICsgUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVDsKIAl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gdWFkZHIgPj4gUEFHRV9TSElGVDsKIAljb25zdCBpbnQgbnJfcGFnZXMgPSBlbmQgLSBzdGFydDsKIAlpbnQgcmVzLCBpLCBqOwogCXN0cnVjdCBwYWdlICoqcGFnZXM7CisJc3RydWN0IHJxX21hcF9kYXRhICptZGF0YSA9ICZTVGJwLT5tYXBfZGF0YTsKIAogCS8qIFVzZXIgYXR0ZW1wdGVkIE92ZXJmbG93ISAqLwogCWlmICgodWFkZHIgKyBjb3VudCkgPCB1YWRkcikKQEAgLTQ2MTYsMjQgKzQ1NzksMTEgQEAKIAkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZXNbaV0pOwogICAgICAgICB9CiAKLQkvKiBQb3B1bGF0ZSB0aGUgc2NhdHRlci9nYXRoZXIgbGlzdCAqLwotCXNnX3NldF9wYWdlKCZzZ2xbMF0sIHBhZ2VzWzBdLCAwLCB1YWRkciAmIH5QQUdFX01BU0spOwotCWlmIChucl9wYWdlcyA+IDEpIHsKLQkJc2dsWzBdLmxlbmd0aCA9IFBBR0VfU0laRSAtIHNnbFswXS5vZmZzZXQ7Ci0JCWNvdW50IC09IHNnbFswXS5sZW5ndGg7Ci0JCWZvciAoaT0xOyBpIDwgbnJfcGFnZXMgOyBpKyspIHsKLQkJCXNnX3NldF9wYWdlKCZzZ2xbaV0sIHBhZ2VzW2ldLAotCQkJCSAgICBjb3VudCA8IFBBR0VfU0laRSA/IGNvdW50IDogUEFHRV9TSVpFLCAwKTs7Ci0JCQljb3VudCAtPSBQQUdFX1NJWkU7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCXNnbFswXS5sZW5ndGggPSBjb3VudDsKLQl9CisJbWRhdGEtPm9mZnNldCA9IHVhZGRyICYgflBBR0VfTUFTSzsKKwltZGF0YS0+cGFnZV9vcmRlciA9IDA7CisJU1RicC0+bWFwcGVkX3BhZ2VzID0gcGFnZXM7CiAKLQlrZnJlZShwYWdlcyk7CiAJcmV0dXJuIG5yX3BhZ2VzOwotCiAgb3V0X3VubWFwOgogCWlmIChyZXMgPiAwKSB7CiAJCWZvciAoaj0wOyBqIDwgcmVzOyBqKyspCkBAIC00NjQ2LDEzICs0NTk2LDEzIEBACiAKIAogLyogQW5kIHVubWFwIHRoZW0uLi4gKi8KLXN0YXRpYyBpbnQgc2dsX3VubWFwX3VzZXJfcGFnZXMoc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsIGNvbnN0IHVuc2lnbmVkIGludCBucl9wYWdlcywKLQkJCQlpbnQgZGlydGllZCkKK3N0YXRpYyBpbnQgc2dsX3VubWFwX3VzZXJfcGFnZXMoc3RydWN0IHN0X2J1ZmZlciAqU1RicCwKKwkJCQljb25zdCB1bnNpZ25lZCBpbnQgbnJfcGFnZXMsIGludCBkaXJ0aWVkKQogewogCWludCBpOwogCiAJZm9yIChpPTA7IGkgPCBucl9wYWdlczsgaSsrKSB7Ci0JCXN0cnVjdCBwYWdlICpwYWdlID0gc2dfcGFnZSgmc2dsW2ldKTsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBTVGJwLT5tYXBwZWRfcGFnZXNbaV07CiAKIAkJaWYgKGRpcnRpZWQpCiAJCQlTZXRQYWdlRGlydHkocGFnZSk7CkBAIC00NjYxLDYgKzQ2MTEsOCBAQAogCQkgKi8KIAkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwogCX0KKwlrZnJlZShTVGJwLT5tYXBwZWRfcGFnZXMpOworCVNUYnAtPm1hcHBlZF9wYWdlcyA9IE5VTEw7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zdC5oIGIvZHJpdmVycy9zY3NpL3N0LmgKaW5kZXggYjkyNzEyZi4uNTQ0ZGM2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3N0LmgKKysrIGIvZHJpdmVycy9zY3NpL3N0LmgKQEAgLTI5LDYgKzI5LDcgQEAKIAlpbnQgcmVzdWx0OwogCXN0cnVjdCBzY3NpX3RhcGUgKnN0cDsKIAlzdHJ1Y3QgY29tcGxldGlvbiAqd2FpdGluZzsKKwlzdHJ1Y3QgYmlvICpiaW87CiB9OwogCiAvKiBUaGUgdGFwZSBidWZmZXIgZGVzY3JpcHRvci4gKi8KQEAgLTQ0LDIwICs0NSwxMyBAQAogCWludCBzeXNjYWxsX3Jlc3VsdDsKIAlzdHJ1Y3Qgc3RfcmVxdWVzdCAqbGFzdF9TUnBudDsKIAlzdHJ1Y3Qgc3RfY21kc3RhdHVzIGNtZHN0YXQ7CisJc3RydWN0IHBhZ2UgKipyZXNlcnZlZF9wYWdlczsKKwlzdHJ1Y3QgcGFnZSAqKm1hcHBlZF9wYWdlczsKKwlzdHJ1Y3QgcnFfbWFwX2RhdGEgbWFwX2RhdGE7CiAJdW5zaWduZWQgY2hhciAqYl9kYXRhOwogCXVuc2lnbmVkIHNob3J0IHVzZV9zZzsJLyogemVybyBvciBtYXggbnVtYmVyIG9mIHMvZyBzZWdtZW50cyBmb3IgdGhpcyBhZGFwdGVyICovCiAJdW5zaWduZWQgc2hvcnQgc2dfc2VnczsJCS8qIG51bWJlciBvZiBzZWdtZW50cyBpbiBzL2cgbGlzdCAqLwotCXVuc2lnbmVkIHNob3J0IG9yaWdfZnJwX3NlZ3M7CS8qIG51bWJlciBvZiBzZWdtZW50cyBhbGxvY2F0ZWQgYXQgZmlyc3QgdHJ5ICovCiAJdW5zaWduZWQgc2hvcnQgZnJwX3NlZ3M7CS8qIG51bWJlciBvZiBidWZmZXIgc2VnbWVudHMgKi8KLQl1bnNpZ25lZCBpbnQgZnJwX3NnX2N1cnJlbnQ7CS8qIGRyaXZlciBidWZmZXIgbGVuZ3RoIGN1cnJlbnRseSBpbiBzL2cgbGlzdCAqLwotCXN0cnVjdCBzdF9idWZfZnJhZ21lbnQgKmZycDsJLyogdGhlIGFsbG9jYXRlZCBidWZmZXIgZnJhZ21lbnQgbGlzdCAqLwotCXN0cnVjdCBzY2F0dGVybGlzdCBzZ1sxXTsJLyogTVVTVCBCRSBsYXN0IGl0ZW0gKi8KLX07Ci0KLS8qIFRoZSB0YXBlIGJ1ZmZlciBmcmFnbWVudCBkZXNjcmlwdG9yICovCi1zdHJ1Y3Qgc3RfYnVmX2ZyYWdtZW50IHsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQl1bnNpZ25lZCBpbnQgbGVuZ3RoOwogfTsKIAogLyogVGhlIHRhcGUgbW9kZSBkZWZpbml0aW9uICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvemFsb24uYyBiL2RyaXZlcnMvc2NzaS96YWxvbi5jCmluZGV4IDNjNGEzMDAuLmE4ZDYxYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS96YWxvbi5jCisrKyBiL2RyaXZlcnMvc2NzaS96YWxvbi5jCkBAIC0xMzcsOCArMTM3LDggQEAKIAkJZ290byBmYWlsOwogCiAJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCBuY3I1M2M4eHhfaW50ciwgSVJRRl9TSEFSRUQsICJ6YWxvbiIsIGhvc3QpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGlycSBwcm9ibGVtIHdpdGggJWQsIGRldGFjaGluZ1xuICIsCi0JCQlkZXYtPmRldi5idXNfaWQsIGRldi0+aXJxKTsKKwkgIGRldl9wcmludGsoS0VSTl9FUlIsIGRldiwgImlycSBwcm9ibGVtIHdpdGggJWQsIGRldGFjaGluZ1xuICIsCisJCSAgICAgZGV2LT5pcnEpOwogCQlnb3RvIGZhaWw7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC84MjUwLmMgYi9kcml2ZXJzL3NlcmlhbC84MjUwLmMKaW5kZXggZGFhMDA1Ni4uMTg4OWE2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvODI1MC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsLzgyNTAuYwpAQCAtMzEyMyw3ICszMTIzLDcgQEAKIAlpZiAobnJfdWFydHMgPiBVQVJUX05SKQogCQlucl91YXJ0cyA9IFVBUlRfTlI7CiAKLQlwcmludGsoS0VSTl9JTkZPICJTZXJpYWw6IDgyNTAvMTY1NTAgZHJpdmVyIgorCXByaW50ayhLRVJOX0lORk8gIlNlcmlhbDogODI1MC8xNjU1MCBkcml2ZXIsICIKIAkJIiVkIHBvcnRzLCBJUlEgc2hhcmluZyAlc2FibGVkXG4iLCBucl91YXJ0cywKIAkJc2hhcmVfaXJxcyA/ICJlbiIgOiAiZGlzIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL0tjb25maWcgYi9kcml2ZXJzL3NlcmlhbC9LY29uZmlnCmluZGV4IGI2OTVhYjMuLjNlNTI1ZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL0tjb25maWcKKysrIGIvZHJpdmVycy9zZXJpYWwvS2NvbmZpZwpAQCAtNDU3LDcgKzQ1Nyw3IEBACiAKIGNvbmZpZyBTRVJJQUxfU0FNU1VOR19VQVJUUwogCWludAotCWRlcGVuZHMgb24gU0VSSUFMX1NBTVNVTkcKKwlkZXBlbmRzIG9uIEFSTSAmJiBQTEFUX1MzQwogCWRlZmF1bHQgMiBpZiBBUkNIX1MzQzI0MDAKIAlkZWZhdWx0IDQgaWYgQVJDSF9TM0M2NFhYIHx8IENQVV9TM0MyNDQzCiAJZGVmYXVsdCAzCkBAIC0xMzIwLDEzICsxMzIwLDMwIEBACiBjb25maWcgU0VSSUFMX09GX1BMQVRGT1JNCiAJdHJpc3RhdGUgIlNlcmlhbCBwb3J0IG9uIE9wZW4gRmlybXdhcmUgcGxhdGZvcm0gYnVzIgogCWRlcGVuZHMgb24gUFBDX09GCi0JZGVwZW5kcyBvbiBTRVJJQUxfODI1MAorCWRlcGVuZHMgb24gU0VSSUFMXzgyNTAgfHwgU0VSSUFMX09GX1BMQVRGT1JNX05XUFNFUklBTAogCWhlbHAKIAkgIElmIHlvdSBoYXZlIGEgUG93ZXJQQyBiYXNlZCBzeXN0ZW0gdGhhdCBoYXMgc2VyaWFsIHBvcnRzCiAJICBvbiBhIHBsYXRmb3JtIHNwZWNpZmljIGJ1cywgeW91IHNob3VsZCBlbmFibGUgdGhpcyBvcHRpb24uCiAJICBDdXJyZW50bHksIG9ubHkgODI1MCBjb21wYXRpYmxlIHBvcnRzIGFyZSBzdXBwb3J0ZWQsIGJ1dAogCSAgb3RoZXJzIGNhbiBlYXNpbHkgYmUgYWRkZWQuCiAKK2NvbmZpZyBTRVJJQUxfT0ZfUExBVEZPUk1fTldQU0VSSUFMCisJdHJpc3RhdGUgIk5XUCBzZXJpYWwgcG9ydCBkcml2ZXIiCisJZGVwZW5kcyBvbiBQUENfT0YgJiYgUFBDX0RDUgorCXNlbGVjdCBTRVJJQUxfT0ZfUExBVEZPUk0KKwlzZWxlY3QgU0VSSUFMX0NPUkVfQ09OU09MRQorCXNlbGVjdCBTRVJJQUxfQ09SRQorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBjZWxsIG5ldHdvcmsgcHJvY2Vzc29yIG53cCBzZXJpYWwKKwkgIGRldmljZS4KKworY29uZmlnIFNFUklBTF9PRl9QTEFURk9STV9OV1BTRVJJQUxfQ09OU09MRQorCWJvb2wgIkNvbnNvbGUgb24gTldQIHNlcmlhbCBwb3J0IgorCWRlcGVuZHMgb24gU0VSSUFMX09GX1BMQVRGT1JNX05XUFNFUklBTD15CisJc2VsZWN0IFNFUklBTF9DT1JFX0NPTlNPTEUKKwloZWxwCisJICBTdXBwb3J0IGZvciBDb25zb2xlIG9uIHRoZSBOV1Agc2VyaWFsIHBvcnRzLgorCiBjb25maWcgU0VSSUFMX1FFCiAJdHJpc3RhdGUgIkZyZWVzY2FsZSBRVUlDQyBFbmdpbmUgc2VyaWFsIHBvcnQgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFFVSUNDX0VOR0lORQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvTWFrZWZpbGUgYi9kcml2ZXJzL3NlcmlhbC9NYWtlZmlsZQppbmRleCBkZmU3NzVhLi44ODQ0YzBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3NlcmlhbC9NYWtlZmlsZQpAQCAtNzIsNiArNzIsNyBAQAogb2JqLSQoQ09ORklHX1NFUklBTF9VQVJUTElURSkgKz0gdWFydGxpdGUubwogb2JqLSQoQ09ORklHX1NFUklBTF9ORVRYKSArPSBuZXR4LXNlcmlhbC5vCiBvYmotJChDT05GSUdfU0VSSUFMX09GX1BMQVRGT1JNKSArPSBvZl9zZXJpYWwubworb2JqLSQoQ09ORklHX1NFUklBTF9PRl9QTEFURk9STV9OV1BTRVJJQUwpICs9IG53cHNlcmlhbC5vCiBvYmotJChDT05GSUdfU0VSSUFMX0tTODY5NSkgKz0gc2VyaWFsX2tzODY5NS5vCiBvYmotJChDT05GSUdfS0dEQl9TRVJJQUxfQ09OU09MRSkgKz0ga2dkYm9jLm8KIG9iai0kKENPTkZJR19TRVJJQUxfUUUpICs9IHVjY191YXJ0Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2NyaXN2MTAuYyBiL2RyaXZlcnMvc2VyaWFsL2NyaXN2MTAuYwppbmRleCA4YjJjNjE5Li5lNjQyYzIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9jcmlzdjEwLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvY3Jpc3YxMC5jCkBAIC0xMjAzLDcgKzEyMDMsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvKiBEaXNhYmxlIG91dHB1dCBETUEgY2hhbm5lbCBmb3IgdGhlIHNlcmlhbCBwb3J0IGluIHF1ZXN0aW9uCi0JICogKCBzZXQgdG8gc29tZXRoaW5nIG90aGVyIHRoZW4gc2VyaWFsWCkKKwkgKiAoIHNldCB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiBzZXJpYWxYKQogCSAqLwogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlERkxPVyhERUJVR19MT0coaW5mby0+bGluZSwgImRpc2FibGVfdHhkbWFfY2hhbm5lbCAlaVxuIiwgaW5mby0+bGluZSkpOwpAQCAtMTI2Niw3ICsxMjY2LDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyogRGlzYWJsZSBpbnB1dCBETUEgY2hhbm5lbCBmb3IgdGhlIHNlcmlhbCBwb3J0IGluIHF1ZXN0aW9uCi0JICogKCBzZXQgdG8gc29tZXRoaW5nIG90aGVyIHRoZW4gc2VyaWFsWCkKKwkgKiAoIHNldCB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiBzZXJpYWxYKQogCSAqLwogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlpZiAoaW5mby0+bGluZSA9PSAwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9ud3BzZXJpYWwuYyBiL2RyaXZlcnMvc2VyaWFsL253cHNlcmlhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZjNlYWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NlcmlhbC9ud3BzZXJpYWwuYwpAQCAtMCwwICsxLDQ3NSBAQAorLyoKKyAqICBTZXJpYWwgUG9ydCBkcml2ZXIgZm9yIGEgTldQIHVhcnQgZGV2aWNlCisgKgorICogICAgQ29weXJpZ2h0IChDKSAyMDA4IElCTSBDb3JwLiwgQmVuamFtaW4gS3JpbGwgPGJlbkBjb2RpZXJ0Lm9yZz4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycXJldHVybi5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ud3BzZXJpYWwuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9kY3IuaD4KKworI2RlZmluZSBOV1BTRVJJQUxfTlIgICAgICAgICAgICAgICAyCisKKyNkZWZpbmUgTldQU0VSSUFMX1NUQVRVU19SWFZBTElEIDB4MQorI2RlZmluZSBOV1BTRVJJQUxfU1RBVFVTX1RYRlVMTCAgMHgyCisKK3N0cnVjdCBud3BzZXJpYWxfcG9ydCB7CisJc3RydWN0IHVhcnRfcG9ydCBwb3J0OworCWRjcl9ob3N0X3QgZGNyX2hvc3Q7CisJdW5zaWduZWQgaW50IGllcjsKKwl1bnNpZ25lZCBpbnQgbWNyOworfTsKKworc3RhdGljIERFRklORV9NVVRFWChud3BzZXJpYWxfbXV0ZXgpOworc3RhdGljIHN0cnVjdCBud3BzZXJpYWxfcG9ydCBud3BzZXJpYWxfcG9ydHNbTldQU0VSSUFMX05SXTsKKworc3RhdGljIHZvaWQgd2FpdF9mb3JfYml0cyhzdHJ1Y3Qgbndwc2VyaWFsX3BvcnQgKnVwLCBpbnQgYml0cykKK3sKKwl1bnNpZ25lZCBpbnQgc3RhdHVzLCB0bW91dCA9IDEwMDAwOworCisJLyogV2FpdCB1cCB0byAxMG1zIGZvciB0aGUgY2hhcmFjdGVyKHMpIHRvIGJlIHNlbnQuICovCisJZG8geworCQlzdGF0dXMgPSBkY3JfcmVhZCh1cC0+ZGNyX2hvc3QsIFVBUlRfTFNSKTsKKworCQlpZiAoLS10bW91dCA9PSAwKQorCQkJYnJlYWs7CisJCXVkZWxheSgxKTsKKwl9IHdoaWxlICgoc3RhdHVzICYgYml0cykgIT0gYml0cyk7Cit9CisKKyNpZmRlZiBDT05GSUdfU0VSSUFMX09GX1BMQVRGT1JNX05XUFNFUklBTF9DT05TT0xFCitzdGF0aWMgdm9pZCBud3BzZXJpYWxfY29uc29sZV9wdXRjaGFyKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCBjKQoreworCXN0cnVjdCBud3BzZXJpYWxfcG9ydCAqdXA7CisJdXAgPSBjb250YWluZXJfb2YocG9ydCwgc3RydWN0IG53cHNlcmlhbF9wb3J0LCBwb3J0KTsKKwkvKiBjaGVjayBpZiB0eCBidWZmZXIgaXMgZnVsbCAqLworCXdhaXRfZm9yX2JpdHModXAsIFVBUlRfTFNSX1RIUkUpOworCWRjcl93cml0ZSh1cC0+ZGNyX2hvc3QsIFVBUlRfVFgsIGMpOworCXVwLT5wb3J0Lmljb3VudC50eCsrOworfQorCitzdGF0aWMgdm9pZAorbndwc2VyaWFsX2NvbnNvbGVfd3JpdGUoc3RydWN0IGNvbnNvbGUgKmNvLCBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJc3RydWN0IG53cHNlcmlhbF9wb3J0ICp1cCA9ICZud3BzZXJpYWxfcG9ydHNbY28tPmluZGV4XTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBsb2NrZWQgPSAxOworCisJaWYgKG9vcHNfaW5fcHJvZ3Jlc3MpCisJCWxvY2tlZCA9IHNwaW5fdHJ5bG9ja19pcnFzYXZlKCZ1cC0+cG9ydC5sb2NrLCBmbGFncyk7CisJZWxzZQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmdXAtPnBvcnQubG9jaywgZmxhZ3MpOworCisJLyogc2F2ZSBhbmQgZGlzYWJsZSBpbnRlcnJ1cHQgKi8KKwl1cC0+aWVyID0gZGNyX3JlYWQodXAtPmRjcl9ob3N0LCBVQVJUX0lFUik7CisJZGNyX3dyaXRlKHVwLT5kY3JfaG9zdCwgVUFSVF9JRVIsIHVwLT5pZXIgJiB+VUFSVF9JRVJfUkRJKTsKKworCXVhcnRfY29uc29sZV93cml0ZSgmdXAtPnBvcnQsIHMsIGNvdW50LCBud3BzZXJpYWxfY29uc29sZV9wdXRjaGFyKTsKKworCS8qIHdhaXQgZm9yIHRyYW5zbWl0dGVyIHRvIGJlY29tZSBlbXRweSAqLworCXdoaWxlICgoZGNyX3JlYWQodXAtPmRjcl9ob3N0LCBVQVJUX0xTUikgJiBVQVJUX0xTUl9USFJFKSA9PSAwKQorCQljcHVfcmVsYXgoKTsKKworCS8qIHJlc3RvcmUgaW50ZXJydXB0IHN0YXRlICovCisJZGNyX3dyaXRlKHVwLT5kY3JfaG9zdCwgVUFSVF9JRVIsIHVwLT5pZXIpOworCisJaWYgKGxvY2tlZCkKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXAtPnBvcnQubG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgc3RydWN0IHVhcnRfZHJpdmVyIG53cHNlcmlhbF9yZWc7CitzdGF0aWMgc3RydWN0IGNvbnNvbGUgbndwc2VyaWFsX2NvbnNvbGUgPSB7CisJLm5hbWUJCT0gInR0eVNRIiwKKwkud3JpdGUJCT0gbndwc2VyaWFsX2NvbnNvbGVfd3JpdGUsCisJLmRldmljZQkJPSB1YXJ0X2NvbnNvbGVfZGV2aWNlLAorCS5mbGFncwkJPSBDT05fUFJJTlRCVUZGRVIsCisJLmluZGV4CQk9IC0xLAorCS5kYXRhCQk9ICZud3BzZXJpYWxfcmVnLAorfTsKKyNkZWZpbmUgTldQU0VSSUFMX0NPTlNPTEUJKCZud3BzZXJpYWxfY29uc29sZSkKKyNlbHNlCisjZGVmaW5lIE5XUFNFUklBTF9DT05TT0xFCU5VTEwKKyNlbmRpZiAvKiBDT05GSUdfU0VSSUFMX09GX1BMQVRGT1JNX05XUFNFUklBTF9DT05TT0xFICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBud3BzZXJpYWxfcmVxdWVzdF9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG53cHNlcmlhbF9yZWxlYXNlX3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwkvKiBOL0EgKi8KK30KKworc3RhdGljIHZvaWQgbndwc2VyaWFsX2NvbmZpZ19wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCBmbGFncykKK3sKKwlwb3J0LT50eXBlID0gUE9SVF9OV1BTRVJJQUw7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBud3BzZXJpYWxfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3Qgbndwc2VyaWFsX3BvcnQgKnVwID0gZGV2X2lkOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSB1cC0+cG9ydC5pbmZvLT5wb3J0LnR0eTsKKwlpcnFyZXR1cm5fdCByZXQ7CisJdW5zaWduZWQgaW50IGlpcjsKKwl1bnNpZ25lZCBjaGFyIGNoOworCisJc3Bpbl9sb2NrKCZ1cC0+cG9ydC5sb2NrKTsKKworCS8qIGNoZWNrIGlmIHRoZSB1YXJ0IHdhcyB0aGUgaW50ZXJydXB0IHNvdXJjZS4gKi8KKwlpaXIgPSBkY3JfcmVhZCh1cC0+ZGNyX2hvc3QsIFVBUlRfSUlSKTsKKwlpZiAoIWlpcikgeworCQlyZXQgPSBJUlFfTk9ORTsKKwkJZ290byBvdXQ7CisJfQorCisJZG8geworCQl1cC0+cG9ydC5pY291bnQucngrKzsKKwkJY2ggPSBkY3JfcmVhZCh1cC0+ZGNyX2hvc3QsIFVBUlRfUlgpOworCQlpZiAodXAtPnBvcnQuaWdub3JlX3N0YXR1c19tYXNrICE9IE5XUFNFUklBTF9TVEFUVVNfUlhWQUxJRCkKKwkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgY2gsIFRUWV9OT1JNQUwpOworCX0gd2hpbGUgKGRjcl9yZWFkKHVwLT5kY3JfaG9zdCwgVUFSVF9SWCkgJiBVQVJUX0xTUl9EUik7CisKKwl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOworCXJldCA9IElSUV9IQU5ETEVEOworCitvdXQ6CisJc3Bpbl91bmxvY2soJnVwLT5wb3J0LmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbndwc2VyaWFsX3N0YXJ0dXAoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3Qgbndwc2VyaWFsX3BvcnQgKnVwOworCWludCBlcnI7CisKKwl1cCA9IGNvbnRhaW5lcl9vZihwb3J0LCBzdHJ1Y3Qgbndwc2VyaWFsX3BvcnQsIHBvcnQpOworCisJLyogZGlzYWJsZSBmbG93IGNvbnRyb2wgYnkgZGVmYXVsdCAqLworCXVwLT5tY3IgPSBkY3JfcmVhZCh1cC0+ZGNyX2hvc3QsIFVBUlRfTUNSKSAmIH5VQVJUX01DUl9BRkU7CisJZGNyX3dyaXRlKHVwLT5kY3JfaG9zdCwgVUFSVF9NQ1IsIHVwLT5tY3IpOworCisJLyogcmVnaXN0ZXIgaW50ZXJydXB0IGhhbmRsZXIgKi8KKwllcnIgPSByZXF1ZXN0X2lycSh1cC0+cG9ydC5pcnEsIG53cHNlcmlhbF9pbnRlcnJ1cHQsCisJCQlJUlFGX1NIQVJFRCwgIm53cHNlcmlhbCIsIHVwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogZW5hYmxlIGludGVycnVwdHMgKi8KKwl1cC0+aWVyID0gVUFSVF9JRVJfUkRJOworCWRjcl93cml0ZSh1cC0+ZGNyX2hvc3QsIFVBUlRfSUVSLCB1cC0+aWVyKTsKKworCS8qIGVuYWJsZSByZWNlaXZpbmcgKi8KKwl1cC0+cG9ydC5pZ25vcmVfc3RhdHVzX21hc2sgJj0gfk5XUFNFUklBTF9TVEFUVVNfUlhWQUxJRDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBud3BzZXJpYWxfc2h1dGRvd24oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3Qgbndwc2VyaWFsX3BvcnQgKnVwOworCXVwID0gY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCBud3BzZXJpYWxfcG9ydCwgcG9ydCk7CisKKwkvKiBkaXNhYmxlIHJlY2VpdmluZyAqLworCXVwLT5wb3J0Lmlnbm9yZV9zdGF0dXNfbWFzayB8PSBOV1BTRVJJQUxfU1RBVFVTX1JYVkFMSUQ7CisKKwkvKiBkaXNhYmxlIGludGVycnVwdHMgZnJvbSB0aGlzIHBvcnQgKi8KKwl1cC0+aWVyID0gMDsKKwlkY3Jfd3JpdGUodXAtPmRjcl9ob3N0LCBVQVJUX0lFUiwgdXAtPmllcik7CisKKwkvKiBmcmVlIGlycSAqLworCWZyZWVfaXJxKHVwLT5wb3J0LmlycSwgcG9ydCk7Cit9CisKK3N0YXRpYyBpbnQgbndwc2VyaWFsX3ZlcmlmeV9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsCisJCQlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqc2VyKQoreworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqbndwc2VyaWFsX3R5cGUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlyZXR1cm4gcG9ydC0+dHlwZSA9PSBQT1JUX05XUFNFUklBTCA/ICJud3BzZXJpYWwiIDogTlVMTDsKK30KKworc3RhdGljIHZvaWQgbndwc2VyaWFsX3NldF90ZXJtaW9zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsCisJCQlzdHJ1Y3Qga3Rlcm1pb3MgKnRlcm1pb3MsIHN0cnVjdCBrdGVybWlvcyAqb2xkKQoreworCXN0cnVjdCBud3BzZXJpYWxfcG9ydCAqdXA7CisJdXAgPSBjb250YWluZXJfb2YocG9ydCwgc3RydWN0IG53cHNlcmlhbF9wb3J0LCBwb3J0KTsKKworCXVwLT5wb3J0LnJlYWRfc3RhdHVzX21hc2sgPSBOV1BTRVJJQUxfU1RBVFVTX1JYVkFMSUQKKwkJCQl8IE5XUFNFUklBTF9TVEFUVVNfVFhGVUxMOworCisJdXAtPnBvcnQuaWdub3JlX3N0YXR1c19tYXNrID0gMDsKKwkvKiBpZ25vcmUgYWxsIGNoYXJhY3RlcnMgaWYgQ1JFQUQgaXMgbm90IHNldCAqLworCWlmICgodGVybWlvcy0+Y19jZmxhZyAmIENSRUFEKSA9PSAwKQorCQl1cC0+cG9ydC5pZ25vcmVfc3RhdHVzX21hc2sgfD0gTldQU0VSSUFMX1NUQVRVU19SWFZBTElEOworCisJLyogQ29weSBiYWNrIHRoZSBvbGQgaGFyZHdhcmUgc2V0dGluZ3MgKi8KKwlpZiAob2xkKQorCQl0dHlfdGVybWlvc19jb3B5X2h3KHRlcm1pb3MsIG9sZCk7Cit9CisKK3N0YXRpYyB2b2lkIG53cHNlcmlhbF9icmVha19jdGwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgaW50IGN0bCkKK3sKKwkvKiBOL0EgKi8KK30KKworc3RhdGljIHZvaWQgbndwc2VyaWFsX2VuYWJsZV9tcyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCS8qIE4vQSAqLworfQorCitzdGF0aWMgdm9pZCBud3BzZXJpYWxfc3RvcF9yeChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBud3BzZXJpYWxfcG9ydCAqdXA7CisJdXAgPSBjb250YWluZXJfb2YocG9ydCwgc3RydWN0IG53cHNlcmlhbF9wb3J0LCBwb3J0KTsKKwkvKiBkb24ndCBmb3J3YXJkIGFueSBtb3JlIGRhdGEgKGxpa2UgIUNSRUFEKSAqLworCXVwLT5wb3J0Lmlnbm9yZV9zdGF0dXNfbWFzayA9IE5XUFNFUklBTF9TVEFUVVNfUlhWQUxJRDsKK30KKworc3RhdGljIHZvaWQgbndwc2VyaWFsX3B1dGNoYXIoc3RydWN0IG53cHNlcmlhbF9wb3J0ICp1cCwgdW5zaWduZWQgY2hhciBjKQoreworCS8qIGNoZWNrIGlmIHR4IGJ1ZmZlciBpcyBmdWxsICovCisJd2FpdF9mb3JfYml0cyh1cCwgVUFSVF9MU1JfVEhSRSk7CisJZGNyX3dyaXRlKHVwLT5kY3JfaG9zdCwgVUFSVF9UWCwgYyk7CisJdXAtPnBvcnQuaWNvdW50LnR4Kys7Cit9CisKK3N0YXRpYyB2b2lkIG53cHNlcmlhbF9zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBud3BzZXJpYWxfcG9ydCAqdXA7CisJc3RydWN0IGNpcmNfYnVmICp4bWl0OworCXVwID0gY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCBud3BzZXJpYWxfcG9ydCwgcG9ydCk7CisJeG1pdCAgPSAmdXAtPnBvcnQuaW5mby0+eG1pdDsKKworCWlmIChwb3J0LT54X2NoYXIpIHsKKwkJbndwc2VyaWFsX3B1dGNoYXIodXAsIHVwLT5wb3J0LnhfY2hhcik7CisJCXBvcnQtPnhfY2hhciA9IDA7CisJfQorCisJd2hpbGUgKCEodWFydF9jaXJjX2VtcHR5KHhtaXQpIHx8IHVhcnRfdHhfc3RvcHBlZCgmdXAtPnBvcnQpKSkgeworCQlud3BzZXJpYWxfcHV0Y2hhcih1cCwgeG1pdC0+YnVmW3htaXQtPnRhaWxdKTsKKwkJeG1pdC0+dGFpbCA9ICh4bWl0LT50YWlsICsgMSkgJiAoVUFSVF9YTUlUX1NJWkUtMSk7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgaW50IG53cHNlcmlhbF9nZXRfbWN0cmwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbndwc2VyaWFsX3NldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgbWN0cmwpCit7CisJLyogTi9BICovCit9CisKK3N0YXRpYyB2b2lkIG53cHNlcmlhbF9zdG9wX3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJLyogTi9BICovCit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbndwc2VyaWFsX3R4X2VtcHR5KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IG53cHNlcmlhbF9wb3J0ICp1cDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisJdXAgPSBjb250YWluZXJfb2YocG9ydCwgc3RydWN0IG53cHNlcmlhbF9wb3J0LCBwb3J0KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ1cC0+cG9ydC5sb2NrLCBmbGFncyk7CisJcmV0ID0gZGNyX3JlYWQodXAtPmRjcl9ob3N0LCBVQVJUX0xTUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXAtPnBvcnQubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldCAmIFVBUlRfTFNSX1RFTVQgPyBUSU9DU0VSX1RFTVQgOiAwOworfQorCitzdGF0aWMgc3RydWN0IHVhcnRfb3BzIG53cHNlcmlhbF9wb3BzID0geworCS50eF9lbXB0eSAgICAgPSBud3BzZXJpYWxfdHhfZW1wdHksCisJLnNldF9tY3RybCAgICA9IG53cHNlcmlhbF9zZXRfbWN0cmwsCisJLmdldF9tY3RybCAgICA9IG53cHNlcmlhbF9nZXRfbWN0cmwsCisJLnN0b3BfdHggICAgICA9IG53cHNlcmlhbF9zdG9wX3R4LAorCS5zdGFydF90eCAgICAgPSBud3BzZXJpYWxfc3RhcnRfdHgsCisJLnN0b3BfcnggICAgICA9IG53cHNlcmlhbF9zdG9wX3J4LAorCS5lbmFibGVfbXMgICAgPSBud3BzZXJpYWxfZW5hYmxlX21zLAorCS5icmVha19jdGwgICAgPSBud3BzZXJpYWxfYnJlYWtfY3RsLAorCS5zdGFydHVwICAgICAgPSBud3BzZXJpYWxfc3RhcnR1cCwKKwkuc2h1dGRvd24gICAgID0gbndwc2VyaWFsX3NodXRkb3duLAorCS5zZXRfdGVybWlvcyAgPSBud3BzZXJpYWxfc2V0X3Rlcm1pb3MsCisJLnR5cGUgICAgICAgICA9IG53cHNlcmlhbF90eXBlLAorCS5yZWxlYXNlX3BvcnQgPSBud3BzZXJpYWxfcmVsZWFzZV9wb3J0LAorCS5yZXF1ZXN0X3BvcnQgPSBud3BzZXJpYWxfcmVxdWVzdF9wb3J0LAorCS5jb25maWdfcG9ydCAgPSBud3BzZXJpYWxfY29uZmlnX3BvcnQsCisJLnZlcmlmeV9wb3J0ICA9IG53cHNlcmlhbF92ZXJpZnlfcG9ydCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdWFydF9kcml2ZXIgbndwc2VyaWFsX3JlZyA9IHsKKwkub3duZXIgICAgICAgPSBUSElTX01PRFVMRSwKKwkuZHJpdmVyX25hbWUgPSAibndwc2VyaWFsIiwKKwkuZGV2X25hbWUgICAgPSAidHR5U1EiLAorCS5tYWpvciAgICAgICA9IFRUWV9NQUpPUiwKKwkubWlub3IgICAgICAgPSA2OCwKKwkubnIgICAgICAgICAgPSBOV1BTRVJJQUxfTlIsCisJLmNvbnMgICAgICAgID0gTldQU0VSSUFMX0NPTlNPTEUsCit9OworCitpbnQgbndwc2VyaWFsX3JlZ2lzdGVyX3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3Qgbndwc2VyaWFsX3BvcnQgKnVwID0gTlVMTDsKKwlpbnQgcmV0ID0gLTE7CisJaW50IGk7CisJc3RhdGljIGludCBmaXJzdCA9IDE7CisJaW50IGRjcl9sZW47CisJaW50IGRjcl9iYXNlOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG47CisKKwltdXRleF9sb2NrKCZud3BzZXJpYWxfbXV0ZXgpOworCisJZG4gPSB0b19vZl9kZXZpY2UocG9ydC0+ZGV2KS0+bm9kZTsKKwlpZiAoZG4gPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwkvKiBnZXQgZGNyIGJhc2UuICovCisJZGNyX2Jhc2UgPSBkY3JfcmVzb3VyY2Vfc3RhcnQoZG4sIDApOworCisJLyogZmluZCBtYXRjaGluZyBlbnRyeSAqLworCWZvciAoaSA9IDA7IGkgPCBOV1BTRVJJQUxfTlI7IGkrKykKKwkJaWYgKG53cHNlcmlhbF9wb3J0c1tpXS5wb3J0LmlvYmFzZSA9PSBkY3JfYmFzZSkgeworCQkJdXAgPSAmbndwc2VyaWFsX3BvcnRzW2ldOworCQkJYnJlYWs7CisJCX0KKworCS8qIHdlIGRpZG4ndCBmaW5kIGEgbXRjaGluZyBlbnRyeSwgc2VhcmNoIGZvciBhIGZyZWUgcG9ydCAqLworCWlmICh1cCA9PSBOVUxMKQorCQlmb3IgKGkgPSAwOyBpIDwgTldQU0VSSUFMX05SOyBpKyspCisJCQlpZiAobndwc2VyaWFsX3BvcnRzW2ldLnBvcnQudHlwZSA9PSBQT1JUX1VOS05PV04gJiYKKwkJCQlud3BzZXJpYWxfcG9ydHNbaV0ucG9ydC5pb2Jhc2UgPT0gMCkgeworCQkJCXVwID0gJm53cHNlcmlhbF9wb3J0c1tpXTsKKwkJCQlicmVhazsKKwkJCX0KKworCWlmICh1cCA9PSBOVUxMKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGZpcnN0KQorCQl1YXJ0X3JlZ2lzdGVyX2RyaXZlcigmbndwc2VyaWFsX3JlZyk7CisJZmlyc3QgPSAwOworCisJdXAtPnBvcnQubWVtYmFzZSAgICAgID0gcG9ydC0+bWVtYmFzZTsKKwl1cC0+cG9ydC5pcnEgICAgICAgICAgPSBwb3J0LT5pcnE7CisJdXAtPnBvcnQudWFydGNsayAgICAgID0gcG9ydC0+dWFydGNsazsKKwl1cC0+cG9ydC5maWZvc2l6ZSAgICAgPSBwb3J0LT5maWZvc2l6ZTsKKwl1cC0+cG9ydC5yZWdzaGlmdCAgICAgPSBwb3J0LT5yZWdzaGlmdDsKKwl1cC0+cG9ydC5pb3R5cGUgICAgICAgPSBwb3J0LT5pb3R5cGU7CisJdXAtPnBvcnQuZmxhZ3MgICAgICAgID0gcG9ydC0+ZmxhZ3M7CisJdXAtPnBvcnQubWFwYmFzZSAgICAgID0gcG9ydC0+bWFwYmFzZTsKKwl1cC0+cG9ydC5wcml2YXRlX2RhdGEgPSBwb3J0LT5wcml2YXRlX2RhdGE7CisKKwlpZiAocG9ydC0+ZGV2KQorCQl1cC0+cG9ydC5kZXYgPSBwb3J0LT5kZXY7CisKKwlpZiAodXAtPnBvcnQuaW9iYXNlICE9IGRjcl9iYXNlKSB7CisJCXVwLT5wb3J0Lm9wcyAgICAgICAgICA9ICZud3BzZXJpYWxfcG9wczsKKwkJdXAtPnBvcnQuZmlmb3NpemUgICAgID0gMTY7CisKKwkJc3Bpbl9sb2NrX2luaXQoJnVwLT5wb3J0LmxvY2spOworCisJCXVwLT5wb3J0LmlvYmFzZSA9IGRjcl9iYXNlOworCQlkY3JfbGVuID0gZGNyX3Jlc291cmNlX2xlbihkbiwgMCk7CisKKwkJdXAtPmRjcl9ob3N0ID0gZGNyX21hcChkbiwgZGNyX2Jhc2UsIGRjcl9sZW4pOworCQlpZiAoIURDUl9NQVBfT0sodXAtPmRjcl9ob3N0KSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJDYW5ub3QgbWFwIERDUiByZXNvdXJjZXMgZm9yIE5XUFNFUklBTCIpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlyZXQgPSB1YXJ0X2FkZF9vbmVfcG9ydCgmbndwc2VyaWFsX3JlZywgJnVwLT5wb3J0KTsKKwlpZiAocmV0ID09IDApCisJCXJldCA9IHVwLT5wb3J0LmxpbmU7CisKK291dDoKKwltdXRleF91bmxvY2soJm53cHNlcmlhbF9tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChud3BzZXJpYWxfcmVnaXN0ZXJfcG9ydCk7CisKK3ZvaWQgbndwc2VyaWFsX3VucmVnaXN0ZXJfcG9ydChpbnQgbGluZSkKK3sKKwlzdHJ1Y3Qgbndwc2VyaWFsX3BvcnQgKnVwID0gJm53cHNlcmlhbF9wb3J0c1tsaW5lXTsKKwltdXRleF9sb2NrKCZud3BzZXJpYWxfbXV0ZXgpOworCXVhcnRfcmVtb3ZlX29uZV9wb3J0KCZud3BzZXJpYWxfcmVnLCAmdXAtPnBvcnQpOworCisJdXAtPnBvcnQudHlwZSA9IFBPUlRfVU5LTk9XTjsKKworCW11dGV4X3VubG9jaygmbndwc2VyaWFsX211dGV4KTsKK30KK0VYUE9SVF9TWU1CT0wobndwc2VyaWFsX3VucmVnaXN0ZXJfcG9ydCk7CisKKyNpZmRlZiBDT05GSUdfU0VSSUFMX09GX1BMQVRGT1JNX05XUFNFUklBTF9DT05TT0xFCitzdGF0aWMgaW50IF9faW5pdCBud3BzZXJpYWxfY29uc29sZV9pbml0KHZvaWQpCit7CisJc3RydWN0IG53cHNlcmlhbF9wb3J0ICp1cCA9IE5VTEw7CisJc3RydWN0IGRldmljZV9ub2RlICpkbjsKKwljb25zdCBjaGFyICpuYW1lOworCWludCBkY3JfYmFzZTsKKwlpbnQgZGNyX2xlbjsKKwlpbnQgaTsKKworCS8qIHNlYXJjaCBmb3IgYSBmcmVlIHBvcnQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTldQU0VSSUFMX05SOyBpKyspCisJCWlmIChud3BzZXJpYWxfcG9ydHNbaV0ucG9ydC50eXBlID09IFBPUlRfVU5LTk9XTikgeworCQkJdXAgPSAmbndwc2VyaWFsX3BvcnRzW2ldOworCQkJYnJlYWs7CisJCX0KKworCWlmICh1cCA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwluYW1lID0gb2ZfZ2V0X3Byb3BlcnR5KG9mX2Nob3NlbiwgImxpbnV4LHN0ZG91dC1wYXRoIiwgTlVMTCk7CisJaWYgKG5hbWUgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJZG4gPSBvZl9maW5kX25vZGVfYnlfcGF0aChuYW1lKTsKKwlpZiAoIWRuKQorCQlyZXR1cm4gLTE7CisKKwlzcGluX2xvY2tfaW5pdCgmdXAtPnBvcnQubG9jayk7CisJdXAtPnBvcnQub3BzID0gJm53cHNlcmlhbF9wb3BzOworCXVwLT5wb3J0LnR5cGUgPSBQT1JUX05XUFNFUklBTDsKKwl1cC0+cG9ydC5maWZvc2l6ZSA9IDE2OworCisJZGNyX2Jhc2UgPSBkY3JfcmVzb3VyY2Vfc3RhcnQoZG4sIDApOworCWRjcl9sZW4gPSBkY3JfcmVzb3VyY2VfbGVuKGRuLCAwKTsKKwl1cC0+cG9ydC5pb2Jhc2UgPSBkY3JfYmFzZTsKKworCXVwLT5kY3JfaG9zdCA9IGRjcl9tYXAoZG4sIGRjcl9iYXNlLCBkY3JfbGVuKTsKKwlpZiAoIURDUl9NQVBfT0sodXAtPmRjcl9ob3N0KSkgeworCQlwcmludGsoIkNhbm5vdCBtYXAgRENSIHJlc291cmNlcyBmb3IgU0VSSUFMIik7CisJCXJldHVybiAtMTsKKwl9CisJcmVnaXN0ZXJfY29uc29sZSgmbndwc2VyaWFsX2NvbnNvbGUpOworCXJldHVybiAwOworfQorY29uc29sZV9pbml0Y2FsbChud3BzZXJpYWxfY29uc29sZV9pbml0KTsKKyNlbmRpZiAvKiBDT05GSUdfU0VSSUFMX09GX1BMQVRGT1JNX05XUFNFUklBTF9DT05TT0xFICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9vZl9zZXJpYWwuYyBiL2RyaXZlcnMvc2VyaWFsL29mX3NlcmlhbC5jCmluZGV4IDhmYTBmZjUuLmE4MjFlM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL29mX3NlcmlhbC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL29mX3NlcmlhbC5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvbndwc2VyaWFsLmg+CiAKICNpbmNsdWRlIDxhc20vcHJvbS5oPgogCkBAIC05OSw5ICsxMDAsMTYgQEAKIAkJZ290byBvdXQ7CiAKIAlzd2l0Y2ggKHBvcnRfdHlwZSkgeworI2lmZGVmIENPTkZJR19TRVJJQUxfODI1MAogCWNhc2UgUE9SVF84MjUwIC4uLiBQT1JUX01BWF84MjUwOgogCQlyZXQgPSBzZXJpYWw4MjUwX3JlZ2lzdGVyX3BvcnQoJnBvcnQpOwogCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TRVJJQUxfT0ZfUExBVEZPUk1fTldQU0VSSUFMCisJY2FzZSBQT1JUX05XUFNFUklBTDoKKwkJcmV0ID0gbndwc2VyaWFsX3JlZ2lzdGVyX3BvcnQoJnBvcnQpOworCQlicmVhazsKKyNlbmRpZgogCWRlZmF1bHQ6CiAJCS8qIG5lZWQgdG8gYWRkIGNvZGUgZm9yIHRoZXNlICovCiAJY2FzZSBQT1JUX1VOS05PV046CkBAIC0xMjksOSArMTM3LDE2IEBACiB7CiAJc3RydWN0IG9mX3NlcmlhbF9pbmZvICppbmZvID0gb2ZkZXYtPmRldi5kcml2ZXJfZGF0YTsKIAlzd2l0Y2ggKGluZm8tPnR5cGUpIHsKKyNpZmRlZiBDT05GSUdfU0VSSUFMXzgyNTAKIAljYXNlIFBPUlRfODI1MCAuLi4gUE9SVF9NQVhfODI1MDoKIAkJc2VyaWFsODI1MF91bnJlZ2lzdGVyX3BvcnQoaW5mby0+bGluZSk7CiAJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1NFUklBTF9PRl9QTEFURk9STV9OV1BTRVJJQUwKKwljYXNlIFBPUlRfTldQU0VSSUFMOgorCQlud3BzZXJpYWxfdW5yZWdpc3Rlcl9wb3J0KGluZm8tPmxpbmUpOworCQlicmVhazsKKyNlbmRpZgogCWRlZmF1bHQ6CiAJCS8qIG5lZWQgdG8gYWRkIGNvZGUgZm9yIHRoZXNlICovCiAJCWJyZWFrOwpAQCAtMTQ4LDYgKzE2MywxMCBAQAogCXsgLnR5cGUgPSAic2VyaWFsIiwgLmNvbXBhdGlibGUgPSAibnMxNjQ1MCIsICAuZGF0YSA9ICh2b2lkICopUE9SVF8xNjQ1MCwgfSwKIAl7IC50eXBlID0gInNlcmlhbCIsIC5jb21wYXRpYmxlID0gIm5zMTY1NTAiLCAgLmRhdGEgPSAodm9pZCAqKVBPUlRfMTY1NTAsIH0sCiAJeyAudHlwZSA9ICJzZXJpYWwiLCAuY29tcGF0aWJsZSA9ICJuczE2NzUwIiwgIC5kYXRhID0gKHZvaWQgKilQT1JUXzE2NzUwLCB9LAorI2lmZGVmIENPTkZJR19TRVJJQUxfT0ZfUExBVEZPUk1fTldQU0VSSUFMCisJeyAudHlwZSA9ICJzZXJpYWwiLCAuY29tcGF0aWJsZSA9ICJpYm0scXBhY2UtbndwLXNlcmlhbCIsCisJCQkJCS5kYXRhID0gKHZvaWQgKilQT1JUX05XUFNFUklBTCwgfSwKKyNlbmRpZgogCXsgLnR5cGUgPSAic2VyaWFsIiwJCQkgICAgICAuZGF0YSA9ICh2b2lkICopUE9SVF9VTktOT1dOLCB9LAogCXsgLyogZW5kIG9mIGxpc3QgKi8gfSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfY29yZS5jIGIvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NvcmUuYwppbmRleCBkYzY4YjdlLi40MmY0ZTY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfY29yZS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jb3JlLmMKQEAgLTIwMzAsNyArMjAzMCw3IEBACiAJCWlmICghdHJpZXMpCiAJCQlwcmludGsoS0VSTl9FUlIgIiVzJXMlcyVkOiBVbmFibGUgdG8gZHJhaW4gIgogCQkJCQkidHJhbnNtaXR0ZXJcbiIsCi0JCQkgICAgICAgcG9ydC0+ZGV2ID8gcG9ydC0+ZGV2LT5idXNfaWQgOiAiIiwKKwkJCSAgICAgICBwb3J0LT5kZXYgPyBkZXZfbmFtZShwb3J0LT5kZXYpIDogIiIsCiAJCQkgICAgICAgcG9ydC0+ZGV2ID8gIjogIiA6ICIiLAogCQkJICAgICAgIGRydi0+ZGV2X25hbWUsCiAJCQkgICAgICAgZHJ2LT50dHlfZHJpdmVyLT5uYW1lX2Jhc2UgKyBwb3J0LT5saW5lKTsKQEAgLTIxNTYsNyArMjE1Niw3IEBACiAJfQogCiAJcHJpbnRrKEtFUk5fSU5GTyAiJXMlcyVzJWQgYXQgJXMgKGlycSA9ICVkKSBpcyBhICVzXG4iLAotCSAgICAgICBwb3J0LT5kZXYgPyBwb3J0LT5kZXYtPmJ1c19pZCA6ICIiLAorCSAgICAgICBwb3J0LT5kZXYgPyBkZXZfbmFtZShwb3J0LT5kZXYpIDogIiIsCiAJICAgICAgIHBvcnQtPmRldiA/ICI6ICIgOiAiIiwKIAkgICAgICAgZHJ2LT5kZXZfbmFtZSwKIAkgICAgICAgZHJ2LT50dHlfZHJpdmVyLT5uYW1lX2Jhc2UgKyBwb3J0LT5saW5lLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvS2NvbmZpZyBiL2RyaXZlcnMvc3BpL0tjb25maWcKaW5kZXggYjlkMGVmYi4uNGE2ZmUwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvS2NvbmZpZworKysgYi9kcml2ZXJzL3NwaS9LY29uZmlnCkBAIC03OCw3ICs3OCw3IEBACiAJICB3aWxsIGJlIGNhbGxlZCBhdTE1NTBfc3BpLgogCiBjb25maWcgU1BJX0JJVEJBTkcKLQl0cmlzdGF0ZSAiQml0YmFuZ2luZyBTUEkgbWFzdGVyIgorCXRyaXN0YXRlICJVdGlsaXRpZXMgZm9yIEJpdGJhbmdpbmcgU1BJIG1hc3RlcnMiCiAJaGVscAogCSAgV2l0aCBhIGZldyBHUElPIHBpbnMsIHlvdXIgc3lzdGVtIGNhbiBiaXRiYW5nIHRoZSBTUEkgcHJvdG9jb2wuCiAJICBTZWxlY3QgdGhpcyB0byBnZXQgU1BJIHN1cHBvcnQgdGhyb3VnaCBJL08gcGlucyAoR1BJTywgcGFyYWxsZWwKQEAgLTEwMCw2ICsxMDAsMjIgQEAKIAkgIGluZXhwZW5zaXZlIGJhdHRlcnkgcG93ZXJlZCBtaWNyb2NvbnRyb2xsZXIgZXZhbHVhdGlvbiBib2FyZC4KIAkgIFRoaXMgc2FtZSBjYWJsZSBjYW4gYmUgdXNlZCB0byBmbGFzaCBuZXcgZmlybXdhcmUuCiAKK2NvbmZpZyBTUElfR1BJTworCXRyaXN0YXRlICJHUElPLWJhc2VkIGJpdGJhbmdpbmcgU1BJIE1hc3RlciIKKwlkZXBlbmRzIG9uIEdFTkVSSUNfR1BJTworCXNlbGVjdCBTUElfQklUQkFORworCWhlbHAKKwkgIFRoaXMgc2ltcGxlIEdQSU8gYml0YmFuZ2luZyBTUEkgbWFzdGVyIHVzZXMgdGhlIGFyY2gtbmV1dHJhbCBHUElPCisJICBpbnRlcmZhY2UgdG8gbWFuYWdlIE1PU0ksIE1JU08sIFNDSywgYW5kIGNoaXBzZWxlY3Qgc2lnbmFscy4gIFNQSQorCSAgc2xhdmVzIGNvbm5lY3RlZCB0byBhIGJ1cyB1c2luZyB0aGlzIGRyaXZlciBhcmUgY29uZmlndXJlZCBhcyB1c3VhbCwKKwkgIGV4Y2VwdCB0aGF0IHRoZSBzcGlfYm9hcmRfaW5mby5jb250cm9sbGVyX2RhdGEgaG9sZHMgdGhlIEdQSU8gbnVtYmVyCisJICBmb3IgdGhlIGNoaXBzZWxlY3QgdXNlZCBieSB0aGlzIGNvbnRyb2xsZXIgZHJpdmVyLgorCisJICBOb3RlIHRoYXQgdGhpcyBkcml2ZXIgb2Z0ZW4gd29uJ3QgYWNoaWV2ZSBldmVuIDEgTWJpdC9zZWMgc3BlZWRzLAorCSAgbWFraW5nIGl0IHVudXN1YWxseSBzbG93IGZvciBTUEkuICBJZiB5b3VyIHBsYXRmb3JtIGNhbiBpbmxpbmUKKwkgIEdQSU8gb3BlcmF0aW9ucywgeW91IHNob3VsZCBiZSBhYmxlIHRvIGxldmVyYWdlIHRoYXQgZm9yIGJldHRlcgorCSAgc3BlZWQgd2l0aCBhIGN1c3RvbSB2ZXJzaW9uIG9mIHRoaXMgZHJpdmVyOyBzZWUgdGhlIHNvdXJjZSBjb2RlLgorCiBjb25maWcgU1BJX0lNWAogCXRyaXN0YXRlICJGcmVlc2NhbGUgaU1YIFNQSSBjb250cm9sbGVyIgogCWRlcGVuZHMgb24gQVJDSF9JTVggJiYgRVhQRVJJTUVOVEFMCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9NYWtlZmlsZSBiL2RyaXZlcnMvc3BpL01ha2VmaWxlCmluZGV4IGNjZjE4ZGUuLjVlOWY1MjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3BpL01ha2VmaWxlCkBAIC0xNiw2ICsxNiw3IEBACiBvYmotJChDT05GSUdfU1BJX0JJVEJBTkcpCQkrPSBzcGlfYml0YmFuZy5vCiBvYmotJChDT05GSUdfU1BJX0FVMTU1MCkJCSs9IGF1MTU1MF9zcGkubwogb2JqLSQoQ09ORklHX1NQSV9CVVRURVJGTFkpCQkrPSBzcGlfYnV0dGVyZmx5Lm8KK29iai0kKENPTkZJR19TUElfR1BJTykJCQkrPSBzcGlfZ3Bpby5vCiBvYmotJChDT05GSUdfU1BJX0lNWCkJCQkrPSBzcGlfaW14Lm8KIG9iai0kKENPTkZJR19TUElfTE03MF9MTFApCQkrPSBzcGlfbG03MGxscC5vCiBvYmotJChDT05GSUdfU1BJX1BYQTJYWCkJCSs9IHB4YTJ4eF9zcGkubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvYXRtZWxfc3BpLmMgYi9kcml2ZXJzL3NwaS9hdG1lbF9zcGkuYwppbmRleCA4YWJhZTRhLi41ZTM5YmFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9hdG1lbF9zcGkuYworKysgYi9kcml2ZXJzL3NwaS9hdG1lbF9zcGkuYwpAQCAtMzAsMTMgKzMwLDYgQEAKICAqIFRoZSBjb3JlIFNQSSB0cmFuc2ZlciBlbmdpbmUganVzdCB0YWxrcyB0byBhIHJlZ2lzdGVyIGJhbmsgdG8gc2V0IHVwCiAgKiBETUEgdHJhbnNmZXJzOyB0cmFuc2ZlciBxdWV1ZSBwcm9ncmVzcyBpcyBkcml2ZW4gYnkgSVJRcy4gIFRoZSBjbG9jawogICogZnJhbWV3b3JrIHByb3ZpZGVzIHRoZSBiYXNlIGNsb2NrLCBzdWJkaXZpZGVkIGZvciBlYWNoIHNwaV9kZXZpY2UuCi0gKgotICogTmV3ZXIgY29udHJvbGxlcnMsIG1hcmtlZCB3aXRoICJuZXdfMSIgZmxhZywgaGF2ZToKLSAqICAtIENSLkxBU1RYRkVSCi0gKiAgLSBTUElfTVIuRElWMzIgbWF5IGJlY29tZSBGRElWIG9yIG11c3QtYmUtemVybyAoaGVyZTogYWx3YXlzIHplcm8pCi0gKiAgLSBTUElfU1IuVFhFTVBUWSwgU1BJX1NSLk5TU1IgKGFuZCBjb3JyZXNwb25kaW5nIGlycXMpCi0gKiAgLSBTUElfQ1NSeC5DU0FBVAotICogIC0gU1BJX0NTUnguU0JDUiBhbGxvd3MgZmFzdGVyIGNsb2NraW5nCiAgKi8KIHN0cnVjdCBhdG1lbF9zcGkgewogCXNwaW5sb2NrX3QJCWxvY2s7CkBAIC00NSw3ICszOCw2IEBACiAJaW50CQkJaXJxOwogCXN0cnVjdCBjbGsJCSpjbGs7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZQkqcGRldjsKLQl1bnNpZ25lZAkJbmV3XzE6MTsKIAlzdHJ1Y3Qgc3BpX2RldmljZQkqc3RheTsKIAogCXU4CQkJc3RvcHBpbmc7CkBAIC01OSwxMCArNTEsMzMgQEAKIAlkbWFfYWRkcl90CQlidWZmZXJfZG1hOwogfTsKIAorLyogQ29udHJvbGxlci1zcGVjaWZpYyBwZXItc2xhdmUgc3RhdGUgKi8KK3N0cnVjdCBhdG1lbF9zcGlfZGV2aWNlIHsKKwl1bnNpZ25lZCBpbnQJCW5wY3NfcGluOworCXUzMgkJCWNzcjsKK307CisKICNkZWZpbmUgQlVGRkVSX1NJWkUJCVBBR0VfU0laRQogI2RlZmluZSBJTlZBTElEX0RNQV9BRERSRVNTCTB4ZmZmZmZmZmYKIAogLyoKKyAqIFZlcnNpb24gMiBvZiB0aGUgU1BJIGNvbnRyb2xsZXIgaGFzCisgKiAgLSBDUi5MQVNUWEZFUgorICogIC0gU1BJX01SLkRJVjMyIG1heSBiZWNvbWUgRkRJViBvciBtdXN0LWJlLXplcm8gKGhlcmU6IGFsd2F5cyB6ZXJvKQorICogIC0gU1BJX1NSLlRYRU1QVFksIFNQSV9TUi5OU1NSIChhbmQgY29ycmVzcG9uZGluZyBpcnFzKQorICogIC0gU1BJX0NTUnguQ1NBQVQKKyAqICAtIFNQSV9DU1J4LlNCQ1IgYWxsb3dzIGZhc3RlciBjbG9ja2luZworICoKKyAqIFdlIGNhbiBkZXRlcm1pbmUgdGhlIGNvbnRyb2xsZXIgdmVyc2lvbiBieSByZWFkaW5nIHRoZSBWRVJTSU9OCisgKiByZWdpc3RlciwgYnV0IEkgaGF2ZW4ndCBjaGVja2VkIHRoYXQgaXQgZXhpc3RzIG9uIGFsbCBjaGlwcywgYW5kCisgKiB0aGlzIGlzIGNoZWFwZXIgYW55d2F5LgorICovCitzdGF0aWMgYm9vbCBhdG1lbF9zcGlfaXNfdjIodm9pZCkKK3sKKwlyZXR1cm4gIWNwdV9pc19hdDkxcm05MjAwKCk7Cit9CisKKy8qCiAgKiBFYXJsaWVyIFNQSSBjb250cm9sbGVycyAoZS5nLiBvbiBhdDkxcm05MjAwKSBoYXZlIGEgZGVzaWduIGJ1ZyB3aGVyZWJ5CiAgKiB0aGV5IGFzc3VtZSB0aGF0IHNwaSBzbGF2ZSBkZXZpY2Ugc3RhdGUgd2lsbCBub3QgY2hhbmdlIG9uIGRlc2VsZWN0LCBzbwogICogdGhhdCBhdXRvbWFnaWMgZGVzZWxlY3Rpb24gaXMgT0suICAoIk5QQ1N4IHJpc2VzIGlmIG5vIGRhdGEgaXMgdG8gYmUKQEAgLTgwLDM5ICs5NSw1OCBAQAogICogTWFzdGVyIG9uIENoaXAgU2VsZWN0IDAuIikgIE5vIHdvcmthcm91bmQgZXhpc3RzIGZvciB0aGF0IC4uLiBzbyBmb3IKICAqIG5DUzAgb24gdGhhdCBjaGlwLCB3ZSAoYSkgZG9uJ3QgdXNlIHRoZSBHUElPLCAoYikgY2FuJ3Qgc3VwcG9ydCBDU19ISUdILAogICogYW5kIChjKSB3aWxsIHRyaWdnZXIgdGhhdCBmaXJzdCBlcnJhdHVtIGluIHNvbWUgY2FzZXMuCisgKgorICogVE9ETzogVGVzdCBpZiB0aGUgYXRtZWxfc3BpX2lzX3YyKCkgYnJhbmNoIGJlbG93IHdvcmtzIG9uCisgKiBBVDkxUk05MjAwIGlmIHdlIHVzZSBzb21lIG90aGVyIHJlZ2lzdGVyIHRoYW4gQ1NSMC4gSG93ZXZlciwgZG9uJ3QKKyAqIGRvIHRoaXMgdW5jb25kaXRpb25hbGx5IHNpbmNlIEFQNzAwMCBoYXMgYW4gZXJyYXRhIHdoZXJlIHRoZSBCSVRTCisgKiBmaWVsZCBpbiBDU1IwIG92ZXJyaWRlcyBhbGwgb3RoZXIgQ1NScy4KICAqLwogCiBzdGF0aWMgdm9pZCBjc19hY3RpdmF0ZShzdHJ1Y3QgYXRtZWxfc3BpICphcywgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKLQl1bnNpZ25lZCBncGlvID0gKHVuc2lnbmVkKSBzcGktPmNvbnRyb2xsZXJfZGF0YTsKKwlzdHJ1Y3QgYXRtZWxfc3BpX2RldmljZSAqYXNkID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOwogCXVuc2lnbmVkIGFjdGl2ZSA9IHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIOwogCXUzMiBtcjsKLQlpbnQgaTsKLQl1MzIgY3NyOwotCXUzMiBjcG9sID0gKHNwaS0+bW9kZSAmIFNQSV9DUE9MKSA/IFNQSV9CSVQoQ1BPTCkgOiAwOwogCi0JLyogTWFrZSBzdXJlIGNsb2NrIHBvbGFyaXR5IGlzIGNvcnJlY3QgKi8KLQlmb3IgKGkgPSAwOyBpIDwgc3BpLT5tYXN0ZXItPm51bV9jaGlwc2VsZWN0OyBpKyspIHsKLQkJY3NyID0gc3BpX3JlYWRsKGFzLCBDU1IwICsgNCAqIGkpOwotCQlpZiAoKGNzciBeIGNwb2wpICYgU1BJX0JJVChDUE9MKSkKLQkJCXNwaV93cml0ZWwoYXMsIENTUjAgKyA0ICogaSwgY3NyIF4gU1BJX0JJVChDUE9MKSk7CisJaWYgKGF0bWVsX3NwaV9pc192MigpKSB7CisJCS8qCisJCSAqIEFsd2F5cyB1c2UgQ1NSMC4gVGhpcyBlbnN1cmVzIHRoYXQgdGhlIGNsb2NrCisJCSAqIHN3aXRjaGVzIHRvIHRoZSBjb3JyZWN0IGlkbGUgcG9sYXJpdHkgYmVmb3JlIHdlCisJCSAqIHRvZ2dsZSB0aGUgQ1MuCisJCSAqLworCQlzcGlfd3JpdGVsKGFzLCBDU1IwLCBhc2QtPmNzcik7CisJCXNwaV93cml0ZWwoYXMsIE1SLCBTUElfQkYoUENTLCAweDBlKSB8IFNQSV9CSVQoTU9ERkRJUykKKwkJCQl8IFNQSV9CSVQoTVNUUikpOworCQltciA9IHNwaV9yZWFkbChhcywgTVIpOworCQlncGlvX3NldF92YWx1ZShhc2QtPm5wY3NfcGluLCBhY3RpdmUpOworCX0gZWxzZSB7CisJCXUzMiBjcG9sID0gKHNwaS0+bW9kZSAmIFNQSV9DUE9MKSA/IFNQSV9CSVQoQ1BPTCkgOiAwOworCQlpbnQgaTsKKwkJdTMyIGNzcjsKKworCQkvKiBNYWtlIHN1cmUgY2xvY2sgcG9sYXJpdHkgaXMgY29ycmVjdCAqLworCQlmb3IgKGkgPSAwOyBpIDwgc3BpLT5tYXN0ZXItPm51bV9jaGlwc2VsZWN0OyBpKyspIHsKKwkJCWNzciA9IHNwaV9yZWFkbChhcywgQ1NSMCArIDQgKiBpKTsKKwkJCWlmICgoY3NyIF4gY3BvbCkgJiBTUElfQklUKENQT0wpKQorCQkJCXNwaV93cml0ZWwoYXMsIENTUjAgKyA0ICogaSwKKwkJCQkJCWNzciBeIFNQSV9CSVQoQ1BPTCkpOworCQl9CisKKwkJbXIgPSBzcGlfcmVhZGwoYXMsIE1SKTsKKwkJbXIgPSBTUElfQkZJTlMoUENTLCB+KDEgPDwgc3BpLT5jaGlwX3NlbGVjdCksIG1yKTsKKwkJaWYgKHNwaS0+Y2hpcF9zZWxlY3QgIT0gMCkKKwkJCWdwaW9fc2V0X3ZhbHVlKGFzZC0+bnBjc19waW4sIGFjdGl2ZSk7CisJCXNwaV93cml0ZWwoYXMsIE1SLCBtcik7CiAJfQogCi0JbXIgPSBzcGlfcmVhZGwoYXMsIE1SKTsKLQltciA9IFNQSV9CRklOUyhQQ1MsIH4oMSA8PCBzcGktPmNoaXBfc2VsZWN0KSwgbXIpOwotCiAJZGV2X2RiZygmc3BpLT5kZXYsICJhY3RpdmF0ZSAldSVzLCBtciAlMDh4XG4iLAotCQkJZ3BpbywgYWN0aXZlID8gIiAoaGlnaCkiIDogIiIsCisJCQlhc2QtPm5wY3NfcGluLCBhY3RpdmUgPyAiIChoaWdoKSIgOiAiIiwKIAkJCW1yKTsKLQotCWlmICghKGNwdV9pc19hdDkxcm05MjAwKCkgJiYgc3BpLT5jaGlwX3NlbGVjdCA9PSAwKSkKLQkJZ3Bpb19zZXRfdmFsdWUoZ3BpbywgYWN0aXZlKTsKLQlzcGlfd3JpdGVsKGFzLCBNUiwgbXIpOwogfQogCiBzdGF0aWMgdm9pZCBjc19kZWFjdGl2YXRlKHN0cnVjdCBhdG1lbF9zcGkgKmFzLCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewotCXVuc2lnbmVkIGdwaW8gPSAodW5zaWduZWQpIHNwaS0+Y29udHJvbGxlcl9kYXRhOworCXN0cnVjdCBhdG1lbF9zcGlfZGV2aWNlICphc2QgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CiAJdW5zaWduZWQgYWN0aXZlID0gc3BpLT5tb2RlICYgU1BJX0NTX0hJR0g7CiAJdTMyIG1yOwogCkBAIC0xMjYsMTEgKzE2MCwxMSBAQAogCX0KIAogCWRldl9kYmcoJnNwaS0+ZGV2LCAiREVhY3RpdmF0ZSAldSVzLCBtciAlMDh4XG4iLAotCQkJZ3BpbywgYWN0aXZlID8gIiAobG93KSIgOiAiIiwKKwkJCWFzZC0+bnBjc19waW4sIGFjdGl2ZSA/ICIgKGxvdykiIDogIiIsCiAJCQltcik7CiAKLQlpZiAoIShjcHVfaXNfYXQ5MXJtOTIwMCgpICYmIHNwaS0+Y2hpcF9zZWxlY3QgPT0gMCkpCi0JCWdwaW9fc2V0X3ZhbHVlKGdwaW8sICFhY3RpdmUpOworCWlmIChhdG1lbF9zcGlfaXNfdjIoKSB8fCBzcGktPmNoaXBfc2VsZWN0ICE9IDApCisJCWdwaW9fc2V0X3ZhbHVlKGFzZC0+bnBjc19waW4sICFhY3RpdmUpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBhdG1lbF9zcGlfeGZlcl9pc19sYXN0KHN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnLApAQCAtNTAyLDYgKzUzNiw3IEBACiBzdGF0aWMgaW50IGF0bWVsX3NwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewogCXN0cnVjdCBhdG1lbF9zcGkJKmFzOworCXN0cnVjdCBhdG1lbF9zcGlfZGV2aWNlCSphc2Q7CiAJdTMyCQkJc2NiciwgY3NyOwogCXVuc2lnbmVkIGludAkJYml0cyA9IHNwaS0+Yml0c19wZXJfd29yZDsKIAl1bnNpZ25lZCBsb25nCQlidXNfaHo7CkBAIC01MzYsMTkgKzU3MSwxNiBAQAogCX0KIAogCS8qIHNlZSBub3RlcyBhYm92ZSByZSBjaGlwc2VsZWN0ICovCi0JaWYgKGNwdV9pc19hdDkxcm05MjAwKCkKKwlpZiAoIWF0bWVsX3NwaV9pc192MigpCiAJCQkmJiBzcGktPmNoaXBfc2VsZWN0ID09IDAKIAkJCSYmIChzcGktPm1vZGUgJiBTUElfQ1NfSElHSCkpIHsKIAkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXR1cDogY2FuJ3QgYmUgYWN0aXZlLWhpZ2hcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQkvKgotCSAqIFByZS1uZXdfMSBjaGlwcyBzdGFydCBvdXQgYXQgaGFsZiB0aGUgcGVyaXBoZXJhbAotCSAqIGJ1cyBzcGVlZC4KLQkgKi8KKwkvKiB2MSBjaGlwcyBzdGFydCBvdXQgYXQgaGFsZiB0aGUgcGVyaXBoZXJhbCBidXMgc3BlZWQuICovCiAJYnVzX2h6ID0gY2xrX2dldF9yYXRlKGFzLT5jbGspOwotCWlmICghYXMtPm5ld18xKQorCWlmICghYXRtZWxfc3BpX2lzX3YyKCkpCiAJCWJ1c19oeiAvPSAyOwogCiAJaWYgKHNwaS0+bWF4X3NwZWVkX2h6KSB7CkBAIC01ODksMTEgKzYyMSwyMCBAQAogCiAJLyogY2hpcHNlbGVjdCBtdXN0IGhhdmUgYmVlbiBtdXhlZCBhcyBHUElPIChlLmcuIGluIGJvYXJkIHNldHVwKSAqLwogCW5wY3NfcGluID0gKHVuc2lnbmVkIGludClzcGktPmNvbnRyb2xsZXJfZGF0YTsKLQlpZiAoIXNwaS0+Y29udHJvbGxlcl9zdGF0ZSkgeworCWFzZCA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKKwlpZiAoIWFzZCkgeworCQlhc2QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXRtZWxfc3BpX2RldmljZSksIEdGUF9LRVJORUwpOworCQlpZiAoIWFzZCkKKwkJCXJldHVybiAtRU5PTUVNOworCiAJCXJldCA9IGdwaW9fcmVxdWVzdChucGNzX3Bpbiwgc3BpLT5kZXYuYnVzX2lkKTsKLQkJaWYgKHJldCkKKwkJaWYgKHJldCkgeworCQkJa2ZyZWUoYXNkKTsKIAkJCXJldHVybiByZXQ7Ci0JCXNwaS0+Y29udHJvbGxlcl9zdGF0ZSA9ICh2b2lkICopbnBjc19waW47CisJCX0KKworCQlhc2QtPm5wY3NfcGluID0gbnBjc19waW47CisJCXNwaS0+Y29udHJvbGxlcl9zdGF0ZSA9IGFzZDsKIAkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KG5wY3NfcGluLCAhKHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKSk7CiAJfSBlbHNlIHsKIAkJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CkBAIC02MDUsMTEgKzY0NiwxNCBAQAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcy0+bG9jaywgZmxhZ3MpOwogCX0KIAorCWFzZC0+Y3NyID0gY3NyOworCiAJZGV2X2RiZygmc3BpLT5kZXYsCiAJCSJzZXR1cDogJWx1IEh6IGJwdyAldSBtb2RlIDB4JXggLT4gY3NyJWQgJTA4eFxuIiwKIAkJYnVzX2h6IC8gc2NiciwgYml0cywgc3BpLT5tb2RlLCBzcGktPmNoaXBfc2VsZWN0LCBjc3IpOwogCi0Jc3BpX3dyaXRlbChhcywgQ1NSMCArIDQgKiBzcGktPmNoaXBfc2VsZWN0LCBjc3IpOworCWlmICghYXRtZWxfc3BpX2lzX3YyKCkpCisJCXNwaV93cml0ZWwoYXMsIENTUjAgKyA0ICogc3BpLT5jaGlwX3NlbGVjdCwgY3NyKTsKIAogCXJldHVybiAwOwogfQpAQCAtNjg0LDEwICs3MjgsMTEgQEAKIHN0YXRpYyB2b2lkIGF0bWVsX3NwaV9jbGVhbnVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJc3RydWN0IGF0bWVsX3NwaQkqYXMgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwlzdHJ1Y3QgYXRtZWxfc3BpX2RldmljZQkqYXNkID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOwogCXVuc2lnbmVkCQlncGlvID0gKHVuc2lnbmVkKSBzcGktPmNvbnRyb2xsZXJfZGF0YTsKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKIAotCWlmICghc3BpLT5jb250cm9sbGVyX3N0YXRlKQorCWlmICghYXNkKQogCQlyZXR1cm47CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYXMtPmxvY2ssIGZsYWdzKTsKQEAgLTY5Nyw3ICs3NDIsOSBAQAogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcy0+bG9jaywgZmxhZ3MpOwogCisJc3BpLT5jb250cm9sbGVyX3N0YXRlID0gTlVMTDsKIAlncGlvX2ZyZWUoZ3Bpbyk7CisJa2ZyZWUoYXNkKTsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTc1NSw4ICs4MDIsNiBAQAogCQlnb3RvIG91dF9mcmVlX2J1ZmZlcjsKIAlhcy0+aXJxID0gaXJxOwogCWFzLT5jbGsgPSBjbGs7Ci0JaWYgKCFjcHVfaXNfYXQ5MXJtOTIwMCgpKQotCQlhcy0+bmV3XzEgPSAxOwogCiAJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCBhdG1lbF9zcGlfaW50ZXJydXB0LCAwLAogCQkJcGRldi0+ZGV2LmJ1c19pZCwgbWFzdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3B4YTJ4eF9zcGkuYyBiL2RyaXZlcnMvc3BpL3B4YTJ4eF9zcGkuYwppbmRleCA2MTA0ZjQ2Li5kMGZjNGNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9weGEyeHhfc3BpLmMKKysrIGIvZHJpdmVycy9zcGkvcHhhMnh4X3NwaS5jCkBAIC0xNTYxLDExICsxNTYxLDEyIEBACiBzdGF0aWMgaW50IHB4YTJ4eF9zcGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGRyaXZlcl9kYXRhICpkcnZfZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBzc3BfZGV2aWNlICpzc3AgPSBkcnZfZGF0YS0+c3NwOworCXN0cnVjdCBzc3BfZGV2aWNlICpzc3A7CiAJaW50IHN0YXR1cyA9IDA7CiAKIAlpZiAoIWRydl9kYXRhKQogCQlyZXR1cm4gMDsKKwlzc3AgPSBkcnZfZGF0YS0+c3NwOwogCiAJLyogUmVtb3ZlIHRoZSBxdWV1ZSAqLwogCXN0YXR1cyA9IGRlc3Ryb3lfcXVldWUoZHJ2X2RhdGEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLmMgYi9kcml2ZXJzL3NwaS9zcGkuYwppbmRleCAzNzM0ZGM5Li42NDM5MDhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGkuYworKysgYi9kcml2ZXJzL3NwaS9zcGkuYwpAQCAtNDcsNyArNDcsNyBAQAogewogCWNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlCSpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7CiAKLQlyZXR1cm4gc25wcmludGYoYnVmLCBCVVNfSURfU0laRSArIDEsICIlc1xuIiwgc3BpLT5tb2RhbGlhcyk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIHNwaS0+bW9kYWxpYXMpOwogfQogCiBzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgc3BpX2Rldl9hdHRyc1tdID0gewpAQCAtNjMsNyArNjMsNyBAQAogewogCWNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlCSpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7CiAKLQlyZXR1cm4gc3RybmNtcChzcGktPm1vZGFsaWFzLCBkcnYtPm5hbWUsIEJVU19JRF9TSVpFKSA9PSAwOworCXJldHVybiBzdHJjbXAoc3BpLT5tb2RhbGlhcywgZHJ2LT5uYW1lKSA9PSAwOwogfQogCiBzdGF0aWMgaW50IHNwaV91ZXZlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qga29ial91ZXZlbnRfZW52ICplbnYpCkBAIC0yNDMsOCArMjQzLDcgQEAKIAl9CiAKIAkvKiBTZXQgdGhlIGJ1cyBJRCBzdHJpbmcgKi8KLQlzbnByaW50ZihzcGktPmRldi5idXNfaWQsIHNpemVvZiBzcGktPmRldi5idXNfaWQsCi0JCQkiJXMuJXUiLCBzcGktPm1hc3Rlci0+ZGV2LmJ1c19pZCwKKwlkZXZfc2V0X25hbWUoJnNwaS0+ZGV2LCAiJXMuJXUiLCBkZXZfbmFtZSgmc3BpLT5tYXN0ZXItPmRldiksCiAJCQlzcGktPmNoaXBfc2VsZWN0KTsKIAogCkBAIC0yNTQsNyArMjUzLDcgQEAKIAkgKi8KIAltdXRleF9sb2NrKCZzcGlfYWRkX2xvY2spOwogCi0JaWYgKGJ1c19maW5kX2RldmljZV9ieV9uYW1lKCZzcGlfYnVzX3R5cGUsIE5VTEwsIHNwaS0+ZGV2LmJ1c19pZCkKKwlpZiAoYnVzX2ZpbmRfZGV2aWNlX2J5X25hbWUoJnNwaV9idXNfdHlwZSwgTlVMTCwgZGV2X25hbWUoJnNwaS0+ZGV2KSkKIAkJCSE9IE5VTEwpIHsKIAkJZGV2X2VycihkZXYsICJjaGlwc2VsZWN0ICVkIGFscmVhZHkgaW4gdXNlXG4iLAogCQkJCXNwaS0+Y2hpcF9zZWxlY3QpOwpAQCAtMjY5LDcgKzI2OCw3IEBACiAJc3RhdHVzID0gc3BpLT5tYXN0ZXItPnNldHVwKHNwaSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJZGV2X2VycihkZXYsICJjYW4ndCAlcyAlcywgc3RhdHVzICVkXG4iLAotCQkJCSJzZXR1cCIsIHNwaS0+ZGV2LmJ1c19pZCwgc3RhdHVzKTsKKwkJCQkic2V0dXAiLCBkZXZfbmFtZSgmc3BpLT5kZXYpLCBzdGF0dXMpOwogCQlnb3RvIGRvbmU7CiAJfQogCkBAIC0yNzcsOSArMjc2LDkgQEAKIAlzdGF0dXMgPSBkZXZpY2VfYWRkKCZzcGktPmRldik7CiAJaWYgKHN0YXR1cyA8IDApCiAJCWRldl9lcnIoZGV2LCAiY2FuJ3QgJXMgJXMsIHN0YXR1cyAlZFxuIiwKLQkJCQkiYWRkIiwgc3BpLT5kZXYuYnVzX2lkLCBzdGF0dXMpOworCQkJCSJhZGQiLCBkZXZfbmFtZSgmc3BpLT5kZXYpLCBzdGF0dXMpOwogCWVsc2UKLQkJZGV2X2RiZyhkZXYsICJyZWdpc3RlcmVkIGNoaWxkICVzXG4iLCBzcGktPmRldi5idXNfaWQpOworCQlkZXZfZGJnKGRldiwgInJlZ2lzdGVyZWQgY2hpbGQgJXNcbiIsIGRldl9uYW1lKCZzcGktPmRldikpOwogCiBkb25lOgogCW11dGV4X3VubG9jaygmc3BpX2FkZF9sb2NrKTsKQEAgLTUwNCwxMiArNTAzLDExIEBACiAJLyogcmVnaXN0ZXIgdGhlIGRldmljZSwgdGhlbiB1c2Vyc3BhY2Ugd2lsbCBzZWUgaXQuCiAJICogcmVnaXN0cmF0aW9uIGZhaWxzIGlmIHRoZSBidXMgSUQgaXMgaW4gdXNlLgogCSAqLwotCXNucHJpbnRmKG1hc3Rlci0+ZGV2LmJ1c19pZCwgc2l6ZW9mIG1hc3Rlci0+ZGV2LmJ1c19pZCwKLQkJInNwaSV1IiwgbWFzdGVyLT5idXNfbnVtKTsKKwlkZXZfc2V0X25hbWUoJm1hc3Rlci0+ZGV2LCAic3BpJXUiLCBtYXN0ZXItPmJ1c19udW0pOwogCXN0YXR1cyA9IGRldmljZV9hZGQoJm1hc3Rlci0+ZGV2KTsKIAlpZiAoc3RhdHVzIDwgMCkKIAkJZ290byBkb25lOwotCWRldl9kYmcoZGV2LCAicmVnaXN0ZXJlZCBtYXN0ZXIgJXMlc1xuIiwgbWFzdGVyLT5kZXYuYnVzX2lkLAorCWRldl9kYmcoZGV2LCAicmVnaXN0ZXJlZCBtYXN0ZXIgJXMlc1xuIiwgZGV2X25hbWUoJm1hc3Rlci0+ZGV2KSwKIAkJCWR5bmFtaWMgPyAiIChkeW5hbWljKSIgOiAiIik7CiAKIAkvKiBwb3B1bGF0ZSBjaGlsZHJlbiBmcm9tIGFueSBzcGkgZGV2aWNlIHRhYmxlcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpX2JpdGJhbmcuYyBiL2RyaXZlcnMvc3BpL3NwaV9iaXRiYW5nLmMKaW5kZXggOTZjYzM5ZS4uODVlNjFmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpX2JpdGJhbmcuYworKysgYi9kcml2ZXJzL3NwaS9zcGlfYml0YmFuZy5jCkBAIC00NzUsNyArNDc1LDcgQEAKIAkvKiB0aGlzIHRhc2sgaXMgdGhlIG9ubHkgdGhpbmcgdG8gdG91Y2ggdGhlIFNQSSBiaXRzICovCiAJYml0YmFuZy0+YnVzeSA9IDA7CiAJYml0YmFuZy0+d29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoCi0JCQliaXRiYW5nLT5tYXN0ZXItPmRldi5wYXJlbnQtPmJ1c19pZCk7CisJCQlkZXZfbmFtZShiaXRiYW5nLT5tYXN0ZXItPmRldi5wYXJlbnQpKTsKIAlpZiAoYml0YmFuZy0+d29ya3F1ZXVlID09IE5VTEwpIHsKIAkJc3RhdHVzID0gLUVCVVNZOwogCQlnb3RvIGVycjE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlfYnV0dGVyZmx5LmMgYi9kcml2ZXJzL3NwaS9zcGlfYnV0dGVyZmx5LmMKaW5kZXggMGVlMmIyMC4uYzIxODQ4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpX2J1dHRlcmZseS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaV9idXR0ZXJmbHkuYwpAQCAtMjg3LDcgKzI4Nyw3IEBACiAJcHAtPmRhdGFmbGFzaCA9IHNwaV9uZXdfZGV2aWNlKHBwLT5iaXRiYW5nLm1hc3RlciwgJnBwLT5pbmZvWzBdKTsKIAlpZiAocHAtPmRhdGFmbGFzaCkKIAkJcHJfZGVidWcoIiVzOiBkYXRhZmxhc2ggYXQgJXNcbiIsIHAtPm5hbWUsCi0JCQkJcHAtPmRhdGFmbGFzaC0+ZGV2LmJ1c19pZCk7CisJCQkJZGV2X25hbWUoJnBwLT5kYXRhZmxhc2gtPmRldikpOwogCiAJLy8gZGV2X2luZm8oX3doYXQ/XywgLi4uKQogCXByX2luZm8oIiVzOiBBVlIgQnV0dGVyZmx5XG4iLCBwLT5uYW1lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaV9ncGlvLmMgYi9kcml2ZXJzL3NwaS9zcGlfZ3Bpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5Njk4Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9zcGlfZ3Bpby5jCkBAIC0wLDAgKzEsMzYwIEBACisvKgorICogc3BpX2dwaW8uYyAtIFNQSSBtYXN0ZXIgZHJpdmVyIHVzaW5nIGdlbmVyaWMgYml0YmFuZ2VkIEdQSU8KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsMjAwOCBEYXZpZCBCcm93bmVsbAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKworI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpX2JpdGJhbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpX2dwaW8uaD4KKworCisvKgorICogVGhpcyBiaXRiYW5naW5nIFNQSSBtYXN0ZXIgZHJpdmVyIHNob3VsZCBoZWxwIG1ha2Ugc3lzdGVtcyB1c2FibGUKKyAqIHdoZW4gYSBuYXRpdmUgaGFyZHdhcmUgU1BJIGVuZ2luZSBpcyBub3QgYXZhaWxhYmxlLCBwZXJoYXBzIGJlY2F1c2UKKyAqIGl0cyBkcml2ZXIgaXNuJ3QgeWV0IHdvcmtpbmcgb3IgYmVjYXVzZSB0aGUgSS9PIHBpbnMgaXQgcmVxdWlyZXMKKyAqIGFyZSB1c2VkIGZvciBvdGhlciBwdXJwb3Nlcy4KKyAqCisgKiBwbGF0Zm9ybV9kZXZpY2UtPmRyaXZlcl9kYXRhIC4uLiBwb2ludHMgdG8gc3BpX2dwaW8KKyAqCisgKiBzcGktPmNvbnRyb2xsZXJfc3RhdGUgLi4uIHJlc2VydmVkIGZvciBiaXRiYW5nIGZyYW1ld29yayBjb2RlCisgKiBzcGktPmNvbnRyb2xsZXJfZGF0YSAuLi4gaG9sZHMgY2hpcHNlbGVjdCBHUElPCisgKgorICogc3BpLT5tYXN0ZXItPmRldi5kcml2ZXJfZGF0YSAuLi4gcG9pbnRzIHRvIHNwaV9ncGlvLT5iaXRiYW5nCisgKi8KKworc3RydWN0IHNwaV9ncGlvIHsKKwlzdHJ1Y3Qgc3BpX2JpdGJhbmcJCWJpdGJhbmc7CisJc3RydWN0IHNwaV9ncGlvX3BsYXRmb3JtX2RhdGEJcGRhdGE7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZQkJKnBkZXY7Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogQmVjYXVzZSB0aGUgb3ZlcmhlYWQgb2YgZ29pbmcgdGhyb3VnaCBmb3VyIEdQSU8gcHJvY2VkdXJlIGNhbGxzCisgKiBwZXIgdHJhbnNmZXJyZWQgYml0IGNhbiBtYWtlIHBlcmZvcm1hbmNlIGEgcHJvYmxlbSwgdGhpcyBjb2RlCisgKiBpcyBzZXQgdXAgc28gdGhhdCB5b3UgY2FuIHVzZSBpdCBpbiBlaXRoZXIgb2YgdHdvIHdheXM6CisgKgorICogICAtIFRoZSBzbG93IGdlbmVyaWMgd2F5OiAgc2V0IHVwIHBsYXRmb3JtX2RhdGEgdG8gaG9sZCB0aGUgR1BJTworICogICAgIG51bWJlcnMgdXNlZCBmb3IgTUlTTy9NT1NJL1NDSywgYW5kIGlzc3VlIHByb2NlZHVyZSBjYWxscyBmb3IKKyAqICAgICBlYWNoIG9mIHRoZW0uICBUaGlzIGRyaXZlciBjYW4gaGFuZGxlIHNldmVyYWwgc3VjaCBidXNzZXMuCisgKgorICogICAtIFRoZSBxdWlja2VyIGlubGluZWQgd2F5OiAgb25seSBoZWxwcyB3aXRoIHBsYXRmb3JtIEdQSU8gY29kZQorICogICAgIHRoYXQgaW5saW5lcyBvcGVyYXRpb25zIGZvciBjb25zdGFudCBHUElPcy4gIFRoaXMgY2FuIGdpdmUKKyAqICAgICB5b3UgdGlnaHQgKGZhc3QhKSBpbm5lciBsb29wcywgYnV0IGVhY2ggc3VjaCBidXMgbmVlZHMgYQorICogICAgIG5ldyBkcml2ZXIuICBZb3UnbGwgZGVmaW5lIGEgbmV3IEMgZmlsZSwgd2l0aCBNYWtlZmlsZSBhbmQKKyAqICAgICBLY29uZmlnIHN1cHBvcnQ7IHRoZSBDIGNvZGUgY2FuIGJlIGEgdG90YWwgb2Ygc2l4IGxpbmVzOgorICoKKyAqCQkjZGVmaW5lIERSSVZFUl9OQU1FCSJteWJvYXJkX3NwaTIiCisgKgkJI2RlZmluZQlTUElfTUlTT19HUElPCTExOQorICoJCSNkZWZpbmUJU1BJX01PU0lfR1BJTwkxMjAKKyAqCQkjZGVmaW5lCVNQSV9TQ0tfR1BJTwkxMjEKKyAqCQkjZGVmaW5lCVNQSV9OX0NISVBTRUwJNAorICoJCSNpbmNsdWRlICJzcGlfZ3Bpby5jIgorICovCisKKyNpZm5kZWYgRFJJVkVSX05BTUUKKyNkZWZpbmUgRFJJVkVSX05BTUUJInNwaV9ncGlvIgorCisjZGVmaW5lIEdFTkVSSUNfQklUQkFORwkvKiB2cyB0aWdodCBpbmxpbmVzICovCisKKy8qIGFsbCBmdW5jdGlvbnMgcmVmZXJlbmNpbmcgdGhlc2Ugc3ltYm9scyBtdXN0IGRlZmluZSBwZGF0YSAqLworI2RlZmluZSBTUElfTUlTT19HUElPCSgocGRhdGEpLT5taXNvKQorI2RlZmluZSBTUElfTU9TSV9HUElPCSgocGRhdGEpLT5tb3NpKQorI2RlZmluZSBTUElfU0NLX0dQSU8JKChwZGF0YSktPnNjaykKKworI2RlZmluZSBTUElfTl9DSElQU0VMCSgocGRhdGEpLT5udW1fY2hpcHNlbGVjdCkKKworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IHNwaV9ncGlvX3BsYXRmb3JtX2RhdGEgKiBfX3B1cmUKK3NwaV90b19wZGF0YShjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWNvbnN0IHN0cnVjdCBzcGlfYml0YmFuZwkqYmFuZzsKKwljb25zdCBzdHJ1Y3Qgc3BpX2dwaW8JCSpzcGlfZ3BpbzsKKworCWJhbmcgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwlzcGlfZ3BpbyA9IGNvbnRhaW5lcl9vZihiYW5nLCBzdHJ1Y3Qgc3BpX2dwaW8sIGJpdGJhbmcpOworCXJldHVybiAmc3BpX2dwaW8tPnBkYXRhOworfQorCisvKiB0aGlzIGlzICNkZWZpbmVkIHRvIGF2b2lkIHVudXNlZC12YXJpYWJsZSB3YXJuaW5ncyB3aGVuIGlubGluaW5nICovCisjZGVmaW5lIHBkYXRhCQlzcGlfdG9fcGRhdGEoc3BpKQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0c2NrKGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCBpc19vbikKK3sKKwlncGlvX3NldF92YWx1ZShTUElfU0NLX0dQSU8sIGlzX29uKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldG1vc2koY29uc3Qgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IGlzX29uKQoreworCWdwaW9fc2V0X3ZhbHVlKFNQSV9NT1NJX0dQSU8sIGlzX29uKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ2V0bWlzbyhjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXJldHVybiBncGlvX2dldF92YWx1ZShTUElfTUlTT19HUElPKTsKK30KKworI3VuZGVmIHBkYXRhCisKKy8qCisgKiBOT1RFOiAgdGhpcyBjbG9ja3MgImFzIGZhc3QgYXMgd2UgY2FuIi4gIEl0ICJzaG91bGQiIGJlIGEgZnVuY3Rpb24gb2YgdGhlCisgKiByZXF1ZXN0ZWQgZGV2aWNlIGNsb2NrLiAgU29mdHdhcmUgb3ZlcmhlYWQgbWVhbnMgd2UgdXN1YWxseSBoYXZlIHRyb3VibGUKKyAqIHJlYWNoaW5nIGV2ZW4gb25lIE1iaXQvc2VjIChleGNlcHQgd2hlbiB3ZSBjYW4gaW5saW5lIGJpdG9wcyksIHNvIGZvciBub3cKKyAqIHdlJ2xsIGp1c3QgYXNzdW1lIHdlIG5ldmVyIG5lZWQgYWRkaXRpb25hbCBwZXItYml0IHNsb3dkb3ducy4KKyAqLworI2RlZmluZSBzcGlkZWxheShuc2VjcykJZG8ge30gd2hpbGUgKDApCisKKyNkZWZpbmUJRVhQQU5EX0JJVEJBTkdfVFhSWAorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGlfYml0YmFuZy5oPgorCisvKgorICogVGhlc2UgZnVuY3Rpb25zIGNhbiBsZXZlcmFnZSBpbmxpbmUgZXhwYW5zaW9uIG9mIEdQSU8gY2FsbHMgdG8gc2hyaW5rCisgKiBjb3N0cyBmb3IgYSB0eHJ4IGJpdCwgb2Z0ZW4gYnkgZmFjdG9ycyBvZiBhcm91bmQgdGVuIChieSBpbnN0cnVjdGlvbgorICogY291bnQpLiAgVGhhdCBpcyBwYXJ0aWN1bGFybHkgdmlzaWJsZSBmb3IgbGFyZ2VyIHdvcmQgc2l6ZXMsIGJ1dCBoZWxwcworICogZXZlbiB3aXRoIGRlZmF1bHQgOC1iaXQgd29yZHMuCisgKgorICogUkVWSVNJVCBvdmVyaGVhZHMgY2FsbGluZyB0aGVzZSBmdW5jdGlvbnMgZm9yIGVhY2ggd29yZCBhbHNvIGhhdmUKKyAqIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGNvc3RzLiAgSGF2aW5nIHR4cnhfYnVmcygpIGNhbGxzIHRoYXQgaW5saW5lCisgKiB0aGUgdHhyeF93b3JkKCkgbG9naWMgd291bGQgaGVscCBwZXJmb3JtYW5jZSwgZS5nLiBvbiBsYXJnZXIgYmxvY2tzCisgKiB1c2VkIHdpdGggZmxhc2ggc3RvcmFnZSBvciBNTUMvU0QuICBUaGVyZSBzaG91bGQgYWxzbyBiZSB3YXlzIHRvIG1ha2UKKyAqIEdDQyBiZSBsZXNzIHN0dXBpZCBhYm91dCByZWxvYWRpbmcgcmVnaXN0ZXJzIGluc2lkZSB0aGUgSS9PIGxvb3BzLAorICogZXZlbiB3aXRob3V0IGlubGluZWQgR1BJTyBjYWxsczsgX19hdHRyaWJ1dGVfXygoaG90KSkgb24gR0NDIDQuMz8KKyAqLworCitzdGF0aWMgdTMyIHNwaV9ncGlvX3R4cnhfd29yZF9tb2RlMChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQl1bnNpZ25lZCBuc2VjcywgdTMyIHdvcmQsIHU4IGJpdHMpCit7CisJcmV0dXJuIGJpdGJhbmdfdHhyeF9iZV9jcGhhMChzcGksIG5zZWNzLCAwLCB3b3JkLCBiaXRzKTsKK30KKworc3RhdGljIHUzMiBzcGlfZ3Bpb190eHJ4X3dvcmRfbW9kZTEoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJdW5zaWduZWQgbnNlY3MsIHUzMiB3b3JkLCB1OCBiaXRzKQoreworCXJldHVybiBiaXRiYW5nX3R4cnhfYmVfY3BoYTEoc3BpLCBuc2VjcywgMCwgd29yZCwgYml0cyk7Cit9CisKK3N0YXRpYyB1MzIgc3BpX2dwaW9fdHhyeF93b3JkX21vZGUyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCXVuc2lnbmVkIG5zZWNzLCB1MzIgd29yZCwgdTggYml0cykKK3sKKwlyZXR1cm4gYml0YmFuZ190eHJ4X2JlX2NwaGEwKHNwaSwgbnNlY3MsIDEsIHdvcmQsIGJpdHMpOworfQorCitzdGF0aWMgdTMyIHNwaV9ncGlvX3R4cnhfd29yZF9tb2RlMyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQl1bnNpZ25lZCBuc2VjcywgdTMyIHdvcmQsIHU4IGJpdHMpCit7CisJcmV0dXJuIGJpdGJhbmdfdHhyeF9iZV9jcGhhMShzcGksIG5zZWNzLCAxLCB3b3JkLCBiaXRzKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgc3BpX2dwaW9fY2hpcHNlbGVjdChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBpbnQgaXNfYWN0aXZlKQoreworCXVuc2lnbmVkIGxvbmcgY3MgPSAodW5zaWduZWQgbG9uZykgc3BpLT5jb250cm9sbGVyX2RhdGE7CisKKwkvKiBzZXQgaW5pdGlhbCBjbG9jayBwb2xhcml0eSAqLworCWlmIChpc19hY3RpdmUpCisJCXNldHNjayhzcGksIHNwaS0+bW9kZSAmIFNQSV9DUE9MKTsKKworCS8qIFNQSSBpcyBub3JtYWxseSBhY3RpdmUtbG93ICovCisJZ3Bpb19zZXRfdmFsdWUoY3MsIChzcGktPm1vZGUgJiBTUElfQ1NfSElHSCkgPyBpc19hY3RpdmUgOiAhaXNfYWN0aXZlKTsKK30KKworc3RhdGljIGludCBzcGlfZ3Bpb19zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXVuc2lnbmVkIGxvbmcJY3MgPSAodW5zaWduZWQgbG9uZykgc3BpLT5jb250cm9sbGVyX2RhdGE7CisJaW50CQlzdGF0dXMgPSAwOworCisJaWYgKHNwaS0+Yml0c19wZXJfd29yZCA+IDMyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghc3BpLT5jb250cm9sbGVyX3N0YXRlKSB7CisJCXN0YXR1cyA9IGdwaW9fcmVxdWVzdChjcywgc3BpLT5kZXYuYnVzX2lkKTsKKwkJaWYgKHN0YXR1cykKKwkJCXJldHVybiBzdGF0dXM7CisJCXN0YXR1cyA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChjcywgc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpOworCX0KKwlpZiAoIXN0YXR1cykKKwkJc3RhdHVzID0gc3BpX2JpdGJhbmdfc2V0dXAoc3BpKTsKKwlpZiAoc3RhdHVzKSB7CisJCWlmICghc3BpLT5jb250cm9sbGVyX3N0YXRlKQorCQkJZ3Bpb19mcmVlKGNzKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHZvaWQgc3BpX2dwaW9fY2xlYW51cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXVuc2lnbmVkIGxvbmcJY3MgPSAodW5zaWduZWQgbG9uZykgc3BpLT5jb250cm9sbGVyX2RhdGE7CisKKwlncGlvX2ZyZWUoY3MpOworCXNwaV9iaXRiYW5nX2NsZWFudXAoc3BpKTsKK30KKworc3RhdGljIGludCBfX2luaXQgc3BpX2dwaW9fYWxsb2ModW5zaWduZWQgcGluLCBjb25zdCBjaGFyICpsYWJlbCwgYm9vbCBpc19pbikKK3sKKwlpbnQgdmFsdWU7CisKKwl2YWx1ZSA9IGdwaW9fcmVxdWVzdChwaW4sIGxhYmVsKTsKKwlpZiAodmFsdWUgPT0gMCkgeworCQlpZiAoaXNfaW4pCisJCQl2YWx1ZSA9IGdwaW9fZGlyZWN0aW9uX2lucHV0KHBpbik7CisJCWVsc2UKKwkJCXZhbHVlID0gZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHBpbiwgMCk7CisJfQorCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIGludCBfX2luaXQKK3NwaV9ncGlvX3JlcXVlc3Qoc3RydWN0IHNwaV9ncGlvX3BsYXRmb3JtX2RhdGEgKnBkYXRhLCBjb25zdCBjaGFyICpsYWJlbCkKK3sKKwlpbnQgdmFsdWU7CisKKwkvKiBOT1RFOiAgU1BJXypfR1BJTyBzeW1ib2xzIG1heSByZWZlcmVuY2UgInBkYXRhIiAqLworCisJdmFsdWUgPSBzcGlfZ3Bpb19hbGxvYyhTUElfTU9TSV9HUElPLCBsYWJlbCwgZmFsc2UpOworCWlmICh2YWx1ZSkKKwkJZ290byBkb25lOworCisJdmFsdWUgPSBzcGlfZ3Bpb19hbGxvYyhTUElfTUlTT19HUElPLCBsYWJlbCwgdHJ1ZSk7CisJaWYgKHZhbHVlKQorCQlnb3RvIGZyZWVfbW9zaTsKKworCXZhbHVlID0gc3BpX2dwaW9fYWxsb2MoU1BJX1NDS19HUElPLCBsYWJlbCwgZmFsc2UpOworCWlmICh2YWx1ZSkKKwkJZ290byBmcmVlX21pc287CisKKwlnb3RvIGRvbmU7CisKK2ZyZWVfbWlzbzoKKwlncGlvX2ZyZWUoU1BJX01JU09fR1BJTyk7CitmcmVlX21vc2k6CisJZ3Bpb19mcmVlKFNQSV9NT1NJX0dQSU8pOworZG9uZToKKwlyZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNwaV9ncGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50CQkJCXN0YXR1czsKKwlzdHJ1Y3Qgc3BpX21hc3RlcgkJKm1hc3RlcjsKKwlzdHJ1Y3Qgc3BpX2dwaW8JCQkqc3BpX2dwaW87CisJc3RydWN0IHNwaV9ncGlvX3BsYXRmb3JtX2RhdGEJKnBkYXRhOworCisJcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKyNpZmRlZiBHRU5FUklDX0JJVEJBTkcKKwlpZiAoIXBkYXRhIHx8ICFwZGF0YS0+bnVtX2NoaXBzZWxlY3QpCisJCXJldHVybiAtRU5PREVWOworI2VuZGlmCisKKwlzdGF0dXMgPSBzcGlfZ3Bpb19yZXF1ZXN0KHBkYXRhLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSk7CisJaWYgKHN0YXR1cyA8IDApCisJCXJldHVybiBzdGF0dXM7CisKKwltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZwZGV2LT5kZXYsIHNpemVvZiAqc3BpX2dwaW8pOworCWlmICghbWFzdGVyKSB7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gZ3Bpb19mcmVlOworCX0KKwlzcGlfZ3BpbyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBzcGlfZ3Bpbyk7CisKKwlzcGlfZ3Bpby0+cGRldiA9IHBkZXY7CisJaWYgKHBkYXRhKQorCQlzcGlfZ3Bpby0+cGRhdGEgPSAqcGRhdGE7CisKKwltYXN0ZXItPmJ1c19udW0gPSBwZGV2LT5pZDsKKwltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gU1BJX05fQ0hJUFNFTDsKKwltYXN0ZXItPnNldHVwID0gc3BpX2dwaW9fc2V0dXA7CisJbWFzdGVyLT5jbGVhbnVwID0gc3BpX2dwaW9fY2xlYW51cDsKKworCXNwaV9ncGlvLT5iaXRiYW5nLm1hc3RlciA9IHNwaV9tYXN0ZXJfZ2V0KG1hc3Rlcik7CisJc3BpX2dwaW8tPmJpdGJhbmcuY2hpcHNlbGVjdCA9IHNwaV9ncGlvX2NoaXBzZWxlY3Q7CisJc3BpX2dwaW8tPmJpdGJhbmcudHhyeF93b3JkW1NQSV9NT0RFXzBdID0gc3BpX2dwaW9fdHhyeF93b3JkX21vZGUwOworCXNwaV9ncGlvLT5iaXRiYW5nLnR4cnhfd29yZFtTUElfTU9ERV8xXSA9IHNwaV9ncGlvX3R4cnhfd29yZF9tb2RlMTsKKwlzcGlfZ3Bpby0+Yml0YmFuZy50eHJ4X3dvcmRbU1BJX01PREVfMl0gPSBzcGlfZ3Bpb190eHJ4X3dvcmRfbW9kZTI7CisJc3BpX2dwaW8tPmJpdGJhbmcudHhyeF93b3JkW1NQSV9NT0RFXzNdID0gc3BpX2dwaW9fdHhyeF93b3JkX21vZGUzOworCXNwaV9ncGlvLT5iaXRiYW5nLnNldHVwX3RyYW5zZmVyID0gc3BpX2JpdGJhbmdfc2V0dXBfdHJhbnNmZXI7CisJc3BpX2dwaW8tPmJpdGJhbmcuZmxhZ3MgPSBTUElfQ1NfSElHSDsKKworCXN0YXR1cyA9IHNwaV9iaXRiYW5nX3N0YXJ0KCZzcGlfZ3Bpby0+Yml0YmFuZyk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJc3BpX21hc3Rlcl9wdXQoc3BpX2dwaW8tPmJpdGJhbmcubWFzdGVyKTsKK2dwaW9fZnJlZToKKwkJZ3Bpb19mcmVlKFNQSV9NSVNPX0dQSU8pOworCQlncGlvX2ZyZWUoU1BJX01PU0lfR1BJTyk7CisJCWdwaW9fZnJlZShTUElfU0NLX0dQSU8pOworCQlzcGlfbWFzdGVyX3B1dChtYXN0ZXIpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgX19leGl0IHNwaV9ncGlvX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzcGlfZ3BpbwkJCSpzcGlfZ3BpbzsKKwlzdHJ1Y3Qgc3BpX2dwaW9fcGxhdGZvcm1fZGF0YQkqcGRhdGE7CisJaW50CQkJCXN0YXR1czsKKworCXNwaV9ncGlvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCS8qIHN0b3AoKSB1bnJlZ2lzdGVycyBjaGlsZCBkZXZpY2VzIHRvbyAqLworCXN0YXR1cyA9IHNwaV9iaXRiYW5nX3N0b3AoJnNwaV9ncGlvLT5iaXRiYW5nKTsKKwlzcGlfbWFzdGVyX3B1dChzcGlfZ3Bpby0+Yml0YmFuZy5tYXN0ZXIpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKKwlncGlvX2ZyZWUoU1BJX01JU09fR1BJTyk7CisJZ3Bpb19mcmVlKFNQSV9NT1NJX0dQSU8pOworCWdwaW9fZnJlZShTUElfU0NLX0dQSU8pOworCisJcmV0dXJuIHN0YXR1czsKK30KKworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybToiIERSSVZFUl9OQU1FKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc3BpX2dwaW9fZHJpdmVyID0geworCS5kcml2ZXIubmFtZQk9IERSSVZFUl9OQU1FLAorCS5kcml2ZXIub3duZXIJPSBUSElTX01PRFVMRSwKKwkucmVtb3ZlCQk9IF9fZXhpdF9wKHNwaV9ncGlvX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzcGlfZ3Bpb19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmc3BpX2dwaW9fZHJpdmVyLCBzcGlfZ3Bpb19wcm9iZSk7Cit9Cittb2R1bGVfaW5pdChzcGlfZ3Bpb19pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHNwaV9ncGlvX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc3BpX2dwaW9fZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHNwaV9ncGlvX2V4aXQpOworCisKK01PRFVMRV9ERVNDUklQVElPTigiU1BJIG1hc3RlciBkcml2ZXIgdXNpbmcgZ2VuZXJpYyBiaXRiYW5nZWQgR1BJTyAiKTsKK01PRFVMRV9BVVRIT1IoIkRhdmlkIEJyb3duZWxsIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlfbG03MGxscC5jIGIvZHJpdmVycy9zcGkvc3BpX2xtNzBsbHAuYwppbmRleCAzOWQ4ZDhhLi41NjhjNzgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGlfbG03MGxscC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaV9sbTcwbGxwLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogc3BpX2xtNzBsbHAuYyAtIGRyaXZlciBmb3IgbG03MGxscCBldmFsIGJvYXJkIGZvciB0aGUgTE03MCBzZW5zb3IKKyAqIHNwaV9sbTcwbGxwLmMgLSBkcml2ZXIgZm9yIExNNzBFVkFMLUxMUCBib2FyZCBmb3IgdGhlIExNNzAgc2Vuc29yCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA2IEthaXdhbiBOIEJpbGxpbW9yaWEgPGthaXdhbkBkZXNpZ25lcmdyYXBoaXguY29tPgogICoKQEAgLTQwLDggKzQwLDEyIEBACiAgKiBtYXN0ZXIgY29udHJvbGxlciBkcml2ZXIuICBUaGUgaHdtb24vbG03MCBkcml2ZXIgaXMgYSAiU1BJIHByb3RvY29sCiAgKiBkcml2ZXIiLCBsYXllcmVkIG9uIHRvcCBvZiB0aGlzIG9uZSBhbmQgdXNhYmxlIHdpdGhvdXQgdGhlIGxtNzBsbHAuCiAgKgorICogRGF0YXNoZWV0IGFuZCBTY2hlbWF0aWM6CiAgKiBUaGUgTE03MCBpcyBhIHRlbXBlcmF0dXJlIHNlbnNvciBjaGlwIGZyb20gTmF0aW9uYWwgU2VtaWNvbmR1Y3RvcjsgaXRzCiAgKiBkYXRhc2hlZXQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubmF0aW9uYWwuY29tL3BmL0xNL0xNNzAuaHRtbAorICogVGhlIHNjaGVtYXRpYyBmb3IgdGhpcyBwYXJ0aWN1bGFyIGJvYXJkICh0aGUgTE03MEVWQUwtTExQKSBpcworICogYXZhaWxhYmxlIChvbiBwYWdlIDQpIGhlcmU6CisgKiAgaHR0cDovL3d3dy5uYXRpb25hbC5jb20vYXBwaW5mby90ZW1wc2Vuc29ycy9maWxlcy9MTTcwTExQRVZBTG1hbnVhbC5wZGYKICAqCiAgKiBBbHNvIHNlZSBEb2N1bWVudGF0aW9uL3NwaS9zcGktbG03MGxscC4gIFRoZSBTUEk8LT5wYXJwb3J0IGNvZGUgaGVyZSBpcwogICogKGhlYXZpbHkpIGJhc2VkIG9uIHNwaS1idXR0ZXJmbHkgYnkgRGF2aWQgQnJvd25lbGwuCkBAIC02NCw3ICs2OCw3IEBACiAgKgogICogTm90ZSB0aGF0IHBhcnBvcnQgcGluIDEzIGFjdHVhbGx5IGdldHMgaW52ZXJ0ZWQgYnkgdGhlIHRyYW5zaXN0b3IKICAqIGFycmFuZ2VtZW50IHdoaWNoIGxldHMgZWl0aGVyIHRoZSBwYXJwb3J0IG9yIHRoZSBMTTcwIGRyaXZlIHRoZQotICogU0kvU08gc2lnbmFsLgorICogU0kvU08gc2lnbmFsIChzZWUgdGhlIHNjaGVtYXRpYyBmb3IgZGV0YWlscykuCiAgKi8KIAogI2RlZmluZSBEUlZOQU1FCQkic3BpLWxtNzBsbHAiCkBAIC0xMDYsMTIgKzExMCwxNiBAQAogc3RhdGljIGlubGluZSB2b2lkIGRlYXNzZXJ0Q1Moc3RydWN0IHNwaV9sbTcwbGxwICpwcCkKIHsKIAl1OCBkYXRhID0gcGFycG9ydF9yZWFkX2RhdGEocHAtPnBvcnQpOworCisJZGF0YSAmPSB+MHg4MDsJCS8qIHB1bGwgRDcvU0ktb3V0IGxvdyB3aGlsZSBkZS1hc3NlcnRlZCAqLwogCXBhcnBvcnRfd3JpdGVfZGF0YShwcC0+cG9ydCwgZGF0YSB8IG5DUyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhc3NlcnRDUyhzdHJ1Y3Qgc3BpX2xtNzBsbHAgKnBwKQogewogCXU4IGRhdGEgPSBwYXJwb3J0X3JlYWRfZGF0YShwcC0+cG9ydCk7CisKKwlkYXRhIHw9IDB4ODA7CQkvKiBwdWxsIEQ3L1NJLW91dCBoaWdoIHNvIGxtNzAgZHJpdmVzIFNPLWluICovCiAJcGFycG9ydF93cml0ZV9kYXRhKHBwLT5wb3J0LCBkYXRhICYgfm5DUyk7CiB9CiAKQEAgLTE4NCwyMiArMTkyLDcgQEAKICAqLwogc3RhdGljIHUzMiBsbTcwX3R4cngoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdW5zaWduZWQgbnNlY3MsIHUzMiB3b3JkLCB1OCBiaXRzKQogewotCXN0YXRpYyB1MzIgc2lvPTA7Ci0Jc3RhdGljIGludCBmaXJzdF90aW1lPTE7Ci0KLQkvKiBGaXJzdCB0aW1lOiBwZXJmb3JtIFNQSSBiaXRiYW5nIGFuZCByZXR1cm4gdGhlIExTQiBvZgotCSAqIHRoZSByZXN1bHQgb2YgdGhlIFNQSSBjYWxsLgotCSAqLwotCWlmIChmaXJzdF90aW1lKSB7Ci0JCXNpbyA9IGJpdGJhbmdfdHhyeF9iZV9jcGhhMChzcGksIG5zZWNzLCAwLCB3b3JkLCBiaXRzKTsKLQkJZmlyc3RfdGltZT0wOwotCQlyZXR1cm4gKHNpbyAmIDB4MDBmZik7Ci0JfQotCS8qIFJldHVybiB0aGUgTVNCIG9mIHRoZSByZXN1bHQgb2YgdGhlIFNQSSBjYWxsICovCi0JZWxzZSB7Ci0JCWZpcnN0X3RpbWU9MTsKLQkJcmV0dXJuIChzaW8gPj4gOCk7Ci0JfQorCXJldHVybiBiaXRiYW5nX3R4cnhfYmVfY3BoYTAoc3BpLCBuc2VjcywgMCwgd29yZCwgYml0cyk7CiB9CiAKIHN0YXRpYyB2b2lkIHNwaV9sbTcwbGxwX2F0dGFjaChzdHJ1Y3QgcGFycG9ydCAqcCkKQEAgLTI4NywxNiArMjgwLDE1IEBACiAJcHAtPnNwaWRldl9sbTcwID0gc3BpX25ld19kZXZpY2UocHAtPmJpdGJhbmcubWFzdGVyLCAmcHAtPmluZm8pOwogCWlmIChwcC0+c3BpZGV2X2xtNzApCiAJCWRldl9kYmcoJnBwLT5zcGlkZXZfbG03MC0+ZGV2LCAic3BpZGV2X2xtNzAgYXQgJXNcbiIsCi0JCQkJcHAtPnNwaWRldl9sbTcwLT5kZXYuYnVzX2lkKTsKKwkJCQlkZXZfbmFtZSgmcHAtPnNwaWRldl9sbTcwLT5kZXYpKTsKIAllbHNlIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHNwaV9uZXdfZGV2aWNlIGZhaWxlZFxuIiwgRFJWTkFNRSk7CiAJCXN0YXR1cyA9IC1FTk9ERVY7CiAJCWdvdG8gb3V0X2JpdGJhbmdfc3RvcDsKIAl9Ci0JcHAtPnNwaWRldl9sbTcwLT5iaXRzX3Blcl93b3JkID0gMTY7CisJcHAtPnNwaWRldl9sbTcwLT5iaXRzX3Blcl93b3JkID0gODsKIAogCWxtNzBsbHAgPSBwcDsKLQogCXJldHVybjsKIAogb3V0X2JpdGJhbmdfc3RvcDoKQEAgLTMyNiw3ICszMTgsNiBAQAogCiAJLyogcG93ZXIgZG93biAqLwogCXBhcnBvcnRfd3JpdGVfZGF0YShwcC0+cG9ydCwgMCk7Ci0JbXNsZWVwKDEwKTsKIAogCXBhcnBvcnRfcmVsZWFzZShwcC0+cGQpOwogCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UocHAtPnBkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaV9zM2MyNHh4LmMgYi9kcml2ZXJzL3NwaS9zcGlfczNjMjR4eC5jCmluZGV4IDI1NmQxODMuLmIzZWJjMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaV9zM2MyNHh4LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpX3MzYzI0eHguYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KIAogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpX2JpdGJhbmcuaD4KQEAgLTI3LDcgKzI4LDYgQEAKICNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogCi0jaW5jbHVkZSA8bWFjaC9yZWdzLWdwaW8uaD4KICNpbmNsdWRlIDxwbGF0L3JlZ3Mtc3BpLmg+CiAjaW5jbHVkZSA8bWFjaC9zcGkuaD4KIApAQCAtNjYsNyArNjYsNyBAQAogCiBzdGF0aWMgdm9pZCBzM2MyNHh4X3NwaV9ncGlvY3Moc3RydWN0IHMzYzI0MTBfc3BpX2luZm8gKnNwaSwgaW50IGNzLCBpbnQgcG9sKQogewotCXMzYzI0MTBfZ3Bpb19zZXRwaW4oc3BpLT5waW5fY3MsIHBvbCk7CisJZ3Bpb19zZXRfdmFsdWUoc3BpLT5waW5fY3MsIHBvbCk7CiB9CiAKIHN0YXRpYyB2b2lkIHMzYzI0eHhfc3BpX2NoaXBzZWwoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IHZhbHVlKQpAQCAtMjQ4LDggKzI0OCwxMyBAQAogCXdyaXRlYihTUFBJTl9ERUZBVUxULCBody0+cmVncyArIFMzQzI0MTBfU1BQSU4pOwogCXdyaXRlYihTUENPTl9ERUZBVUxULCBody0+cmVncyArIFMzQzI0MTBfU1BDT04pOwogCi0JaWYgKGh3LT5wZGF0YSAmJiBody0+cGRhdGEtPmdwaW9fc2V0dXApCi0JCWh3LT5wZGF0YS0+Z3Bpb19zZXR1cChody0+cGRhdGEsIDEpOworCWlmIChody0+cGRhdGEpIHsKKwkJaWYgKGh3LT5zZXRfY3MgPT0gczNjMjR4eF9zcGlfZ3Bpb2NzKQorCQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGh3LT5wZGF0YS0+cGluX2NzLCAxKTsKKworCQlpZiAoaHctPnBkYXRhLT5ncGlvX3NldHVwKQorCQkJaHctPnBkYXRhLT5ncGlvX3NldHVwKGh3LT5wZGF0YSwgMSk7CisJfQogfQogCiBzdGF0aWMgaW50IF9faW5pdCBzM2MyNHh4X3NwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpAQCAtMzQzLDE4ICszNDgsMjcgQEAKIAkJZ290byBlcnJfbm9fY2xrOwogCX0KIAotCXMzYzI0eHhfc3BpX2luaXRpYWxzZXR1cChodyk7Ci0KIAkvKiBzZXR1cCBhbnkgZ3BpbyB3ZSBjYW4gKi8KIAogCWlmICghcGRhdGEtPnNldF9jcykgewotCQlody0+c2V0X2NzID0gczNjMjR4eF9zcGlfZ3Bpb2NzOworCQlpZiAocGRhdGEtPnBpbl9jcyA8IDApIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIGNoaXBzZWxlY3QgcGluXG4iKTsKKwkJCWdvdG8gZXJyX3JlZ2lzdGVyOworCQl9CiAKLQkJczNjMjQxMF9ncGlvX3NldHBpbihwZGF0YS0+cGluX2NzLCAxKTsKLQkJczNjMjQxMF9ncGlvX2NmZ3BpbihwZGF0YS0+cGluX2NzLCBTM0MyNDEwX0dQSU9fT1VUUFVUKTsKKwkJZXJyID0gZ3Bpb19yZXF1ZXN0KHBkYXRhLT5waW5fY3MsIGRldl9uYW1lKCZwZGV2LT5kZXYpKTsKKwkJaWYgKGVycikgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGdldCBncGlvIGZvciBjc1xuIik7CisJCQlnb3RvIGVycl9yZWdpc3RlcjsKKwkJfQorCisJCWh3LT5zZXRfY3MgPSBzM2MyNHh4X3NwaV9ncGlvY3M7CisJCWdwaW9fZGlyZWN0aW9uX291dHB1dChwZGF0YS0+cGluX2NzLCAxKTsKIAl9IGVsc2UKIAkJaHctPnNldF9jcyA9IHBkYXRhLT5zZXRfY3M7CiAKKwlzM2MyNHh4X3NwaV9pbml0aWFsc2V0dXAoaHcpOworCiAJLyogcmVnaXN0ZXIgb3VyIHNwaSBjb250cm9sbGVyICovCiAKIAllcnIgPSBzcGlfYml0YmFuZ19zdGFydCgmaHctPmJpdGJhbmcpOwpAQCAtMzY2LDYgKzM4MCw5IEBACiAJcmV0dXJuIDA7CiAKICBlcnJfcmVnaXN0ZXI6CisJaWYgKGh3LT5zZXRfY3MgPT0gczNjMjR4eF9zcGlfZ3Bpb2NzKQorCQlncGlvX2ZyZWUocGRhdGEtPnBpbl9jcyk7CisKIAljbGtfZGlzYWJsZShody0+Y2xrKTsKIAljbGtfcHV0KGh3LT5jbGspOwogCkBAIC00MDEsNiArNDE4LDkgQEAKIAlmcmVlX2lycShody0+aXJxLCBodyk7CiAJaW91bm1hcChody0+cmVncyk7CiAKKwlpZiAoaHctPnNldF9jcyA9PSBzM2MyNHh4X3NwaV9ncGlvY3MpCisJCWdwaW9fZnJlZShody0+cGRhdGEtPnBpbl9jcyk7CisKIAlyZWxlYXNlX3Jlc291cmNlKGh3LT5pb2FyZWEpOwogCWtmcmVlKGh3LT5pb2FyZWEpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9LY29uZmlnCmluZGV4IDVkNDU3YzkuLmNlNmJhZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9LY29uZmlnCkBAIC00OSw2ICs0OSw4IEBACiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL21lNDAwMC9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9nbzcwMDcvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvdXNiaXAvS2NvbmZpZyIKQEAgLTYzLDUgKzY1LDM1IEBACiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3BvY2gvS2NvbmZpZyIKIAorc291cmNlICJkcml2ZXJzL3N0YWdpbmcvYWdueC9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9vdHVzL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9ydDI4NzAvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL3N0YWdpbmcvYmVuZXQvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL3N0YWdpbmcvY29tZWRpL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9wYW5lbC9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9hbHRwY2llY2hkbWEvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3JzcGl1c2IvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL3N0YWdpbmcvbWltaW8vS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL3N0YWdpbmcvZXBsL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvS2NvbmZpZyIKKwogZW5kaWYgIyAhU1RBR0lOR19FWENMVURFX0JVSUxECiBlbmRpZiAjIFNUQUdJTkcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9NYWtlZmlsZQppbmRleCA3MWM0ZDUzLi45ZGRjYzJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL01ha2VmaWxlCkBAIC03LDYgKzcsNyBAQAogb2JqLSQoQ09ORklHX1NMSUNPU1MpCQkrPSBzbGljb3NzLwogb2JqLSQoQ09ORklHX1NYRykJCSs9IHN4Zy8KIG9iai0kKENPTkZJR19NRTQwMDApCQkrPSBtZTQwMDAvCitvYmotJChDT05GSUdfTUVJTEhBVVMpCQkrPSBtZWlsaGF1cy8KIG9iai0kKENPTkZJR19WSURFT19HTzcwMDcpCSs9IGdvNzAwNy8KIG9iai0kKENPTkZJR19VU0JfSVBfQ09NTU9OKQkrPSB1c2JpcC8KIG9iai0kKENPTkZJR19XMzVVTkQpCQkrPSB3aW5ib25kLwpAQCAtMTQsMyArMTUsMTggQEAKIG9iai0kKENPTkZJR19FQ0hPKQkJKz0gZWNoby8KIG9iai0kKENPTkZJR19VU0JfQVRNRUwpCQkrPSBhdDc2X3VzYi8KIG9iai0kKENPTkZJR19QT0NIKQkJKz0gcG9jaC8KK29iai0kKENPTkZJR19BR05YKQkJKz0gYWdueC8KK29iai0kKENPTkZJR19PVFVTKQkJKz0gb3R1cy8KK29iai0kKENPTkZJR19SVDI4NjApCQkrPSBydDI4NjAvCitvYmotJChDT05GSUdfUlQyODcwKQkJKz0gcnQyODcwLworb2JqLSQoQ09ORklHX0JFTkVUKQkJKz0gYmVuZXQvCitvYmotJChDT05GSUdfQ09NRURJKQkJKz0gY29tZWRpLworb2JqLSQoQ09ORklHX0FTVVNfT0xFRCkJCSs9IGFzdXNfb2xlZC8KK29iai0kKENPTkZJR19QQU5FTCkJCSs9IHBhbmVsLworb2JqLSQoQ09ORklHX0FMVEVSQV9QQ0lFX0NIRE1BKQkrPSBhbHRwY2llY2hkbWEvCitvYmotJChDT05GSUdfUlRMODE4N1NFKQkJKz0gcnRsODE4N3NlLworb2JqLSQoQ09ORklHX1VTQl9SU1BJKQkJKz0gcnNwaXVzYi8KK29iai0kKENPTkZJR19JTlBVVF9NSU1JTykJKz0gbWltaW8vCitvYmotJChDT05GSUdfVFJBTlpQT1JUKQkJKz0gZnJvbnRpZXIvCitvYmotJChDT05GSUdfRVBMKQkJKz0gZXBsLworb2JqLSQoQ09ORklHX0FORFJPSUQpCQkrPSBhbmRyb2lkLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FnbngvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y0MzU0OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L0tjb25maWcKQEAgLTAsMCArMSw1IEBACitjb25maWcgQUdOWAorCXRyaXN0YXRlICJXaXJlbGVzcyBBaXJnbyBBR05YIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBXTEFOXzgwMjExICYmIE1BQzgwMjExCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhbiBleHBlcmltZW50YWwgZHJpdmVyIGZvciBBaXJnbyBBR05YMDAgd2lyZWxlc3MgY2hpcC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hZ254L01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2FnbngvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIxNjU2NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L01ha2VmaWxlCkBAIC0wLDAgKzEsOCBAQAorb2JqLSQoQ09ORklHX0FHTlgpCSs9IGFnbngubworCithZ254LW9ianMgOj0JcmYubwlcCisJCXBjaS5vCVwKKwkJeG1pdC5vCVwKKwkJdGFibGUubwlcCisJCXN0YS5vCVwKKwkJcGh5Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hZ254L1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvYWdueC9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YmVjNzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYWdueC9UT0RPCkBAIC0wLDAgKzEsMjIgQEAKKzIwMDggNy8xOAorCitUaGUgUlggaGFzIGNhbid0IHJlY2VpdmUgT0ZETSBwYWNrZXQgY29ycmVjdGx5LAorR3Vlc3MgaXQgbmVlZCBiZSBkbyBSWCBjYWxpYnJhdGUuCisKKworYmVmb3JlIDIwMDggMy8xCisKKzE6IFRoZSBSWCBnZXQgdG9vIG11Y2ggIkNSQyBmYWlsZWQiIHBha2V0cywgaXQgbWFrZSB0aGUgY2FyZCB3b3JrIHZlcnkgdW5zdGFibGUsCisyOiBBZnRlciBydW5uaW5nIGEgd2hpbGUsIHRoZSBjYXJkIHdpbGwgZ2V0IGluZmluaXR5ICJSWCBGcmFtZSIgYW5kICJFcnJvciIKK2ludGVycnVwdCwgbm90IGtub3cgdGhlIHJvb3QgcmVhc29uIHNvIGZhciwgdHJ5IHRvIGZpeCBpdAorMzogVXNpbmcgdHdvIHR4IHF1ZXVlIHR4ZCBhbmQgdHhtIGJ1dCBub3Qgb25seSB0eG0uCis0OiBTZXQgdGhlIGhkciBjb3JyZWN0bHkuCis1OiBUcnkgdG8gZG8gcmVjYWxpYnJhdGUgY29ycmV2dGx5Cis2OiBUbyBzdXBwb3J0IEcgbW9kZSBpbiBmdXR1cmUKKzc6IEZpeCB0aGUgbWFjIGFkZHJlc3MgY2FuJ3QgYmUgcmVhZGVkIGFuZCBzZXQgY29ycmVjdGx5IGluIEJFIG1hY2hpbmUuCis4OiBGaXggaW5jbHVkZSBhbmQgZXhjbHVkZSBGQ1MgaW4gcHJvbWlzb3VzIG1vZGUgYW5kIG1hbmFnZSBtb2RlCis5OiBVc2luZyBzdGFfbm90aWZ5IHRvIG5vdGljZSBzdGEgY2hhbmdlCisxMDogVHVybiBvbiBmcmFtZSByZWNlcHRpb24gYXQgdGhlIGVuZCBvZiBzdGFydAorMTE6IEd1ZXNzIHRoZSBjYXJkIHN1cHBvcnQgSFdfTVVMVElDQVNUX0ZJTFRFUgorMTI6IFRoZSB0eCBwcm9jZXNzIHNob3VsZCBiZSBpbXBsbWVudCBhdG9taWM/CisxMzogVXNpbmcgbWFjODAyMTEgZnVuY3Rpb24gdG8gY29udHJvbCB0aGUgVFgmUlggTEVELgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FnbngvYWdueC5oIGIvZHJpdmVycy9zdGFnaW5nL2FnbngvYWdueC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NWIwZGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYWdueC9hZ254LmgKQEAgLTAsMCArMSwxNTQgQEAKKyNpZm5kZWYgQUdOWF9IXworI2RlZmluZSBBR05YX0hfCisKKyNpbmNsdWRlICJ4bWl0LmgiCisKKyNkZWZpbmUgUEZYCQkJCUtCVUlMRF9NT0ROQU1FICI6ICIKKworc3RhdGljIGlubGluZSB1MzIgYWdueF9yZWFkMzIodm9pZCBfX2lvbWVtICptZW1fcmVnaW9uLCB1MzIgb2Zmc2V0KQoreworCXJldHVybiBpb3JlYWQzMihtZW1fcmVnaW9uICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFnbnhfd3JpdGUzMih2b2lkIF9faW9tZW0gKm1lbV9yZWdpb24sIHUzMiBvZmZzZXQsIHUzMiB2YWwpCit7CisJaW93cml0ZTMyKHZhbCwgbWVtX3JlZ2lvbiArIG9mZnNldCk7Cit9CisKKy8qIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgYWdueF9yYXRlc184MDIxMWJbXSA9IHsgKi8KKy8qIAl7IC5yYXRlID0gMTAsICovCisvKiAJICAudmFsID0gMHhhLCAqLworLyogCSAgLmZsYWdzID0gSUVFRTgwMjExX1JBVEVfQ0NLIH0sICovCisvKiAJeyAucmF0ZSA9IDIwLCAqLworLyogCSAgLnZhbCA9IDB4MTQsICovCisvKiAJICAuaHdfdmFsdWUgPSAtMHgxNCwgKi8KKy8qIAkgIC5mbGFncyA9IElFRUU4MDIxMV9SQVRFX0NDS18yIH0sICovCisvKiAJeyAucmF0ZSA9IDU1LCAqLworLyogCSAgLnZhbCA9IDB4MzcsICovCisvKiAJICAudmFsMiA9IC0weDM3LCAqLworLyogCSAgLmZsYWdzID0gSUVFRTgwMjExX1JBVEVfQ0NLXzIgfSwgKi8KKy8qIAl7IC5yYXRlID0gMTEwLCAqLworLyogCSAgLnZhbCA9IDB4NmUsICovCisvKiAJICAudmFsMiA9IC0weDZlLCAqLworLyogCSAgLmZsYWdzID0gSUVFRTgwMjExX1JBVEVfQ0NLXzIgfSAqLworLyogfTsgKi8KKworCitzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlIGFnbnhfcmF0ZXNfODAyMTFnW10gPSB7CisvKiAJeyAuYml0cmF0ZSA9IDEwLCAuaHdfdmFsdWUgPSAxLCAuZmxhZ3MgPSBJRUVFODAyMTFfUkFURV9TSE9SVF9QUkVBTUJMRSB9LCAqLworLyogCXsgLmJpdHJhdGUgPSAyMCwgLmh3X3ZhbHVlID0gMiwgLmZsYWdzID0gSUVFRTgwMjExX1JBVEVfU0hPUlRfUFJFQU1CTEUgfSwgKi8KKy8qIAl7IC5iaXRyYXRlID0gNTUsIC5od192YWx1ZSA9IDMsIC5mbGFncyA9IElFRUU4MDIxMV9SQVRFX1NIT1JUX1BSRUFNQkxFIH0sICovCisvKiAJeyAuYml0cmF0ZSA9IDExMCwgLmh3X3ZhbHVlID0gNCwgLmZsYWdzID0gSUVFRTgwMjExX1JBVEVfU0hPUlRfUFJFQU1CTEUgfSwgKi8KKyAJeyAuYml0cmF0ZSA9IDEwLCAuaHdfdmFsdWUgPSAxLCB9LAorIAl7IC5iaXRyYXRlID0gMjAsIC5od192YWx1ZSA9IDIsIH0sCisgCXsgLmJpdHJhdGUgPSA1NSwgLmh3X3ZhbHVlID0gMywgfSwKKyAJeyAuYml0cmF0ZSA9IDExMCwgLmh3X3ZhbHVlID0gNCx9LAorCisJeyAuYml0cmF0ZSA9IDYwLCAuaHdfdmFsdWUgPSAweEIsIH0sCisJeyAuYml0cmF0ZSA9IDkwLCAuaHdfdmFsdWUgPSAweEYsIH0sCisJeyAuYml0cmF0ZSA9IDEyMCwgLmh3X3ZhbHVlID0gMHhBIH0sCisJeyAuYml0cmF0ZSA9IDE4MCwgLmh3X3ZhbHVlID0gMHhFLCB9LAorLy8JeyAuYml0cmF0ZSA9IDI0MCwgLmh3X3ZhbHVlID0gMHhkLCB9LAorCXsgLmJpdHJhdGUgPSAzNjAsIC5od192YWx1ZSA9IDB4RCwgfSwKKwl7IC5iaXRyYXRlID0gNDgwLCAuaHdfdmFsdWUgPSAweDgsIH0sCisJeyAuYml0cmF0ZSA9IDU0MCwgLmh3X3ZhbHVlID0gMHhDLCB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCBhZ254X2NoYW5uZWxzW10gPSB7CisJeyAuY2VudGVyX2ZyZXEgPSAyNDEyLCAuaHdfdmFsdWUgPSAxLCB9LAorCXsgLmNlbnRlcl9mcmVxID0gMjQxNywgLmh3X3ZhbHVlID0gMiwgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0MjIsIC5od192YWx1ZSA9IDMsIH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDI3LCAuaHdfdmFsdWUgPSA0LCB9LAorCXsgLmNlbnRlcl9mcmVxID0gMjQzMiwgLmh3X3ZhbHVlID0gNSwgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0MzcsIC5od192YWx1ZSA9IDYsIH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDQyLCAuaHdfdmFsdWUgPSA3LCB9LAorCXsgLmNlbnRlcl9mcmVxID0gMjQ0NywgLmh3X3ZhbHVlID0gOCwgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0NTIsIC5od192YWx1ZSA9IDksIH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDU3LCAuaHdfdmFsdWUgPSAxMCwgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0NjIsIC5od192YWx1ZSA9IDExLCB9LAorCXsgLmNlbnRlcl9mcmVxID0gMjQ2NywgLmh3X3ZhbHVlID0gMTIsIH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDcyLCAuaHdfdmFsdWUgPSAxMywgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0ODQsIC5od192YWx1ZSA9IDE0LCB9LAorfTsKKworI2RlZmluZSBOVU1fRFJJVkVfTU9ERVMJMgorLyogQWdueCBvcGVyYXRlIG1vZGUgKi8KK2VudW0geworCUFHTlhfTU9ERV84MDIxMUEsCisJQUdOWF9NT0RFXzgwMjExQV9PT0IsCisJQUdOWF9NT0RFXzgwMjExQV9NSU1PLAorCUFHTlhfTU9ERV84MDIxMUJfU0hPUlQsCisJQUdOWF9NT0RFXzgwMjExQl9MT05HLAorCUFHTlhfTU9ERV84MDIxMUcsCisJQUdOWF9NT0RFXzgwMjExR19PT0IsCisJQUdOWF9NT0RFXzgwMjExR19NSU1PLAorfTsKKworZW51bSB7CisJQUdOWF9VTklOSVQsCisJQUdOWF9TVEFSVCwKKwlBR05YX1NUT1AsCit9OworCitzdHJ1Y3QgYWdueF9wcml2IHsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsKKworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CisJdW5zaWduZWQgaW50IGluaXRfc3RhdHVzOworCisJdm9pZCBfX2lvbWVtICpjdGw7CS8qIHBvaW50ZXIgdG8gYmFzZSByYW0gYWRkcmVzcyAqLworCXZvaWQgX19pb21lbSAqZGF0YTsJLyogcG9pbnRlciB0byBtZW0gcmVnaW9uICMyICovCisKKwlzdHJ1Y3QgYWdueF9yaW5nIHJ4OworCXN0cnVjdCBhZ254X3JpbmcgdHhtOworCXN0cnVjdCBhZ254X3JpbmcgdHhkOworCisJLyogTmVlZCB2b2xhdGlsZT8gKi8KKwl1MzIgaXJxX3N0YXR1czsKKworICAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrIHBlcmlvZGljX3dvcms7IC8qIFBlcmlvZGljIHRhc2tzIGxpa2UgcmVjYWxpYnJhdGUqLworCXN0cnVjdCBpZWVlODAyMTFfbG93X2xldmVsX3N0YXRzIHN0YXRzOworCisvLyAgICAgICAgdW5zaWduZWQgaW50IHBoeW1vZGU7CisJaW50IG1vZGU7CisJaW50IGNoYW5uZWw7CisJdTggYnNzaWRbRVRIX0FMRU5dOworCisJdTggbWFjX2FkZHJbRVRIX0FMRU5dOworCXU4IHJldmlkOworCisJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCBiYW5kOworfTsKKworCisjZGVmaW5lIEFHTlhfQ0hBSU5TX01BWAk2CisjZGVmaW5lIEFHTlhfUEVSSU9ESUNfREVMQVkgNjAwMDAgLyogdW5pdDogbXMgKi8KKyNkZWZpbmUgTE9DQUxfU1RBSUQJMAkvKiB0aGUgc3RhdGlvbiBlbnRyeSBmb3IgdGhlIGNhcmQgaXRzZWxmICovCisjZGVmaW5lIEJTU0lEX1NUQUlECTEJLyogdGhlIHN0YXRpb24gZW50cnkgZm9yIHRoZSBic3NzaWQgQVAgKi8KKyNkZWZpbmUJc3BpX2RlbGF5KCkJdWRlbGF5KDQwKQorI2RlZmluZSBlZXByb21fZGVsYXkoKQl1ZGVsYXkoNDApCisjZGVmaW5lCXJvdXRpbmdfdGFibGVfZGVsYXkoKQl1ZGVsYXkoNTApCisKKy8qIFBEVSBwb29sIE1FTSByZWdpb24gIzIgKi8KKyNkZWZpbmUgQUdOWF9QRFVQT09MCQkweDQwMDAwCS8qIFBEVSBwb29sICovCisjZGVmaW5lIEFHTlhfUERVUE9PTF9TSVpFCTB4ODAwMAkvKiBQRFUgcG9vbCBzaXplKi8KKyNkZWZpbmUgQUdOWF9QRFVfVFhfV1EJCTB4NDEwMDAJLyogUERVIGxpc3QgVFggd29ya3F1ZXVlICovCisjZGVmaW5lIEFHTlhfUERVX0ZSRUUJCTB4NDE4MDAJLyogRnJlZSBQb29sICovCisjZGVmaW5lIFBEVV9TSVpFCQkweDgwCS8qIEZyZWUgUG9vbCBub2RlIHNpemUgKi8KKyNkZWZpbmUgUERVX0ZSRUVfQ05UCQkweGQwIC8qIEZyZWUgcG9vbCBub2RlIGNvdW50ICovCisKKworLyogUkYgc3R1ZmZzICovCitleHRlcm4gdm9pZCByZl9jaGlwc19pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpOworZXh0ZXJuIHZvaWQgc3BpX3JjX3dyaXRlKHZvaWQgX19pb21lbSAqbWVtX3JlZ2lvbiwgdTMyIGNoaXBfaWRzLCB1MzIgc3cpOworZXh0ZXJuIHZvaWQgY2FsaWJyYXRlX29zY2lsbGF0b3Ioc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7CitleHRlcm4gdm9pZCBkb19jYWxpYnJhdGlvbihzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK2V4dGVybiB2b2lkIGFudGVubmFfY2FsaWJyYXRlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpOworZXh0ZXJuIHZvaWQgX19hbnRlbm5hX2NhbGlicmF0ZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK2V4dGVybiB2b2lkIHByaW50X29mZnNldHMoc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7CitleHRlcm4gaW50IGFnbnhfc2V0X2NoYW5uZWwoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IGNoYW5uZWwpOworCisKKyNlbmRpZiAvKiBBR05YX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWdueC9kZWJ1Zy5oIGIvZHJpdmVycy9zdGFnaW5nL2FnbngvZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2UyNWRkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FnbngvZGVidWcuaApAQCAtMCwwICsxLDQxOCBAQAorI2lmbmRlZiBBR05YX0RFQlVHX0hfCisjZGVmaW5lIEFHTlhfREVCVUdfSF8KKworI2luY2x1ZGUgImFnbnguaCIKKyNpbmNsdWRlICJwaHkuaCIKKyNpbmNsdWRlICJzdGEuaCIKKyNpbmNsdWRlICJ4bWl0LmgiCisKKyNkZWZpbmUgQUdOWF9UUkFDRSAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSIFBGWCAiZnVuY3Rpb246JXMgbGluZTolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKQorCisjZGVmaW5lIFBSSU5US19MRTE2KHByZWZpeCwgdmFyKQlwcmludGsoS0VSTl9ERUJVRyBQRlggI3ByZWZpeCAiOiAiICN2YXIgIiAweCUuNHhcbiIsIGxlMTZfdG9fY3B1KHZhcikpCisjZGVmaW5lIFBSSU5US19MRTMyKHByZWZpeCwgdmFyKQlwcmludGsoS0VSTl9ERUJVRyBQRlggI3ByZWZpeCAiOiAiICN2YXIgIiAweCUuOHhcbiIsIGxlMzJfdG9fY3B1KHZhcikpCisjZGVmaW5lIFBSSU5US19VOChwcmVmaXgsIHZhcikgCQlwcmludGsoS0VSTl9ERUJVRyBQRlggI3ByZWZpeCAiOiAiICN2YXIgIiAweCUuMnhcbiIsIHZhcikKKyNkZWZpbmUgUFJJTlRLX0JFMTYocHJlZml4LCB2YXIpCXByaW50ayhLRVJOX0RFQlVHIFBGWCAjcHJlZml4ICI6ICIgI3ZhciAiIDB4JS40eFxuIiwgYmUxNl90b19jcHUodmFyKSkKKyNkZWZpbmUgUFJJTlRLX0JFMzIocHJlZml4LCB2YXIpCXByaW50ayhLRVJOX0RFQlVHIFBGWCAjcHJlZml4ICI6ICIgI3ZhciAiIDB4JS44eFxuIiwgYmUzMl90b19jcHUodmFyKSkKKyNkZWZpbmUgUFJJTlRLX0JJVFMocHJlZml4LCBmaWVsZCkgICAgCXByaW50ayhLRVJOX0RFQlVHIFBGWCAjcHJlZml4ICI6ICIgI2ZpZWxkICI6IDB4JXhcbiIsIChyZWcgJiBmaWVsZCkgPj4gZmllbGQjI19TSElGVCkKKworc3RhdGljIGlubGluZSB2b2lkIGFnbnhfYnVnKGNoYXIgKnJlYXNvbikKK3sKKwlwcmludGsoS0VSTl9FUlIgUEZYICIlc1xuIiwgcmVhc29uKTsKKwlCVUcoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFnbnhfcHJpbnRfZGVzYyhzdHJ1Y3QgYWdueF9kZXNjICpkZXNjKQoreworICAgICAgICB1MzIgcmVnID0gYmUzMl90b19jcHUoZGVzYy0+ZnJhZyk7CisKKwlQUklOVEtfQklUUyhERVNDLCBQQUNLRVRfTEVOKTsKKworCWlmIChyZWcgJiBGSVJTVF9GUkFHKSB7CisJCVBSSU5US19CSVRTKERFU0MsIEZJUlNUX1BBQ0tFVF9NQVNLKTsKKwkJUFJJTlRLX0JJVFMoREVTQywgRklSU1RfUkVTRVJWMik7CisJCVBSSU5US19CSVRTKERFU0MsIEZJUlNUX1RLSVBfRVJST1IpOworCQlQUklOVEtfQklUUyhERVNDLCBGSVJTVF9US0lQX1BBQ0tFVCk7CisJCVBSSU5US19CSVRTKERFU0MsIEZJUlNUX1JFU0VSVjEpOworCQlQUklOVEtfQklUUyhERVNDLCBGSVJTVF9GUkFHX0xFTik7CisJfSBlbHNlIHsKKwkJUFJJTlRLX0JJVFMoREVTQywgU1VCX1JFU0VSVjIpOworCQlQUklOVEtfQklUUyhERVNDLCBTVUJfVEtJUF9FUlJPUik7CisJCVBSSU5US19CSVRTKERFU0MsIFNVQl9US0lQX1BBQ0tFVCk7CisJCVBSSU5US19CSVRTKERFU0MsIFNVQl9SRVNFUlYxKTsKKwkJUFJJTlRLX0JJVFMoREVTQywgU1VCX0ZSQUdfTEVOKTsKKwl9CisKKwlQUklOVEtfQklUUyhERVNDLCBGSVJTVF9GUkFHKTsKKwlQUklOVEtfQklUUyhERVNDLCBMQVNUX0ZSQUcpOworCVBSSU5US19CSVRTKERFU0MsIE9XTkVSKTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtcF9pZWVlODAyMTFiX3BoeV9oZHIoX19iZTMyIF8xMWIwLCBfX2JlMzIgXzExYjEpCit7CisKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFnbnhfcHJpbnRfaGRyKHN0cnVjdCBhZ254X2hkciAqaGRyKQoreworCXUzMiByZWc7CisJaW50IGk7CisKKwlyZWcgPSBiZTMyX3RvX2NwdShoZHItPnJlZzApOworCVBSSU5US19CSVRTKEhEUiwgUlRTKTsKKwlQUklOVEtfQklUUyhIRFIsIE1VTFRJQ0FTVCk7CisJUFJJTlRLX0JJVFMoSERSLCBBQ0spOworCVBSSU5US19CSVRTKEhEUiwgVE0pOworCVBSSU5US19CSVRTKEhEUiwgUkVMQVkpOworCVBSSU5US19CSVRTKEhEUiwgUkVWSVNFRF9GQ1MpOworCVBSSU5US19CSVRTKEhEUiwgTkVYVF9CVUZGRVJfQUREUik7CisKKwlyZWcgPSBiZTMyX3RvX2NwdShoZHItPnJlZzEpOworCVBSSU5US19CSVRTKEhEUiwgTUFDX0hEUl9MRU4pOworCVBSSU5US19CSVRTKEhEUiwgRFVSQVRJT05fT1ZFUklERSk7CisJUFJJTlRLX0JJVFMoSERSLCBQSFlfSERSX09WRVJJREUpOworCVBSSU5US19CSVRTKEhEUiwgQ1JDX0ZBSUwpOworCVBSSU5US19CSVRTKEhEUiwgU0VRVUVOQ0VfTlVNQkVSKTsKKwlQUklOVEtfQklUUyhIRFIsIEJVRkZfSEVBRF9BRERSKTsKKworCXJlZyA9IGJlMzJfdG9fY3B1KGhkci0+cmVnMik7CisJUFJJTlRLX0JJVFMoSERSLCBQRFVfQ09VTlQpOworCVBSSU5US19CSVRTKEhEUiwgV0VQX0tFWSk7CisJUFJJTlRLX0JJVFMoSERSLCBVU0VTX1dFUF9LRVkpOworCVBSSU5US19CSVRTKEhEUiwgS0VFUF9BTElWRSk7CisJUFJJTlRLX0JJVFMoSERSLCBCVUZGX1RBSUxfQUREUik7CisKKwlyZWcgPSBiZTMyX3RvX2NwdShoZHItPnJlZzMpOworCVBSSU5US19CSVRTKEhEUiwgQ1RTXzExRyk7CisJUFJJTlRLX0JJVFMoSERSLCBSVFNfMTFHKTsKKwlQUklOVEtfQklUUyhIRFIsIEZSQUdfU0laRSk7CisJUFJJTlRLX0JJVFMoSERSLCBQQVlMT0FEX0xFTik7CisJUFJJTlRLX0JJVFMoSERSLCBGUkFHX05VTSk7CisKKwlyZWcgPSBiZTMyX3RvX2NwdShoZHItPnJlZzQpOworCVBSSU5US19CSVRTKEhEUiwgUkVMQVlfU1RBSUQpOworCVBSSU5US19CSVRTKEhEUiwgU1RBVElPTl9JRCk7CisJUFJJTlRLX0JJVFMoSERSLCBXT1JLUVVFVUVfSUQpOworCisJcmVnID0gYmUzMl90b19jcHUoaGRyLT5yZWc1KTsKKwkvKiBwcmludGYgdGhlIHJvdXRlIGZsYWcgKi8KKwlQUklOVEtfQklUUyhIRFIsIFJPVVRFX0hPU1QpOworCVBSSU5US19CSVRTKEhEUiwgUk9VVEVfQ0FSRF9DUFUpOworCVBSSU5US19CSVRTKEhEUiwgUk9VVEVfRU5DUllQVElPTik7CisJUFJJTlRLX0JJVFMoSERSLCBST1VURV9UWCk7CisJUFJJTlRLX0JJVFMoSERSLCBST1VURV9SWDEpOworCVBSSU5US19CSVRTKEhEUiwgUk9VVEVfUlgyKTsKKwlQUklOVEtfQklUUyhIRFIsIFJPVVRFX0NPTVBSRVNTSU9OKTsKKworCVBSSU5US19CRTMyKEhEUiwgaGRyLT5fMTFnMCk7CisJUFJJTlRLX0JFMzIoSERSLCBoZHItPl8xMWcxKTsKKwlQUklOVEtfQkUzMihIRFIsIGhkci0+XzExYjApOworCVBSSU5US19CRTMyKEhEUiwgaGRyLT5fMTFiMSk7CisKKwlkdW1wX2llZWU4MDIxMWJfcGh5X2hkcihoZHItPl8xMWIwLCBoZHItPl8xMWIxKTsKKworCS8qIEZpeG1lICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaGRyLT5tYWNfaGRyKTsgaSsrKSB7CisJCWlmIChpID09IDApCisJCQlwcmludGsoS0VSTl9ERUJVRyBQRlggIklFRUU4MDIxMSBIRFI6ICIpOworCQlwcmludGsoIiUuMnggIiwgaGRyLT5tYWNfaGRyW2ldKTsKKwkJaWYgKGkgKyAxID09IEFSUkFZX1NJWkUoaGRyLT5tYWNfaGRyKSkKKwkJCXByaW50aygiXG4iKTsKKwl9CisKKwlQUklOVEtfQkUxNihIRFIsIGhkci0+cnRzX2R1cmF0aW9uKTsKKwlQUklOVEtfQkUxNihIRFIsIGhkci0+bGFzdF9kdXJhdGlvbik7CisJUFJJTlRLX0JFMTYoSERSLCBoZHItPnNlY19sYXN0X2R1cmF0aW9uKTsKKwlQUklOVEtfQkUxNihIRFIsIGhkci0+b3RoZXJfZHVyYXRpb24pOworCVBSSU5US19CRTE2KEhEUiwgaGRyLT50eF9vdGhlcl9kdXJhdGlvbik7CisJUFJJTlRLX0JFMTYoSERSLCBoZHItPmxhc3RfMTFnX2xlbik7CisJUFJJTlRLX0JFMTYoSERSLCBoZHItPm90aGVyXzExZ19sZW4pOworCVBSSU5US19CRTE2KEhEUiwgaGRyLT5sYXN0XzExYl9sZW4pOworCVBSSU5US19CRTE2KEhEUiwgaGRyLT5vdGhlcl8xMWJfbGVuKTsKKworCS8qIEZJWE1FICovCisJcmVnID0gYmUxNl90b19jcHUoaGRyLT5yZWc2KTsKKwlQUklOVEtfQklUUyhIRFIsIE1CRik7CisJUFJJTlRLX0JJVFMoSERSLCBSU1ZENCk7CisKKwlQUklOVEtfQkUxNihIRFIsIGhkci0+cnhfZnJhZ19zdGF0KTsKKworCVBSSU5US19CRTMyKEhEUiwgaGRyLT50aW1lX3N0YW1wKTsKKwlQUklOVEtfQkUzMihIRFIsIGhkci0+cGh5X3N0YXRzX2hpKTsKKwlQUklOVEtfQkUzMihIRFIsIGhkci0+cGh5X3N0YXRzX2xvKTsKKwlQUklOVEtfQkUzMihIRFIsIGhkci0+bWljX2tleTApOworCVBSSU5US19CRTMyKEhEUiwgaGRyLT5taWNfa2V5MSk7Cit9IC8qIGFnbnhfcHJpbnRfaGRyICovCisKKworc3RhdGljIGlubGluZSB2b2lkIGFnbnhfcHJpbnRfcnhfaGRyKHN0cnVjdCBhZ254X2hkciAqaGRyKQoreworCWFnbnhfcHJpbnRfaGRyKGhkcik7CisKKwlQUklOVEtfQkUxNihIRFIsIGhkci0+cngucnhfcGFja2V0X2R1cmF0aW9uKTsKKwlQUklOVEtfQkUxNihIRFIsIGhkci0+cngucmVwbGF5X2NudCk7CisKKwlQUklOVEtfVTgoSERSLCBoZHItPnJ4X2NoYW5uZWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWdueF9wcmludF90eF9oZHIoc3RydWN0IGFnbnhfaGRyICpoZHIpCit7CisJYWdueF9wcmludF9oZHIoaGRyKTsKKworCVBSSU5US19VOChIRFIsIGhkci0+dHgubG9uZ19yZXRyeV9saW1pdCk7CisJUFJJTlRLX1U4KEhEUiwgaGRyLT50eC5zaG9ydF9yZXRyeV9saW1pdCk7CisJUFJJTlRLX1U4KEhEUiwgaGRyLT50eC5sb25nX3JldHJ5X2NudCk7CisJUFJJTlRLX1U4KEhEUiwgaGRyLT50eC5zaG9ydF9yZXRyeV9jbnQpOworCisJUFJJTlRLX1U4KEhEUiwgaGRyLT5yeF9jaGFubmVsKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCithZ254X3ByaW50X3N0YV9wb3dlcihzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1bnNpZ25lZCBpbnQgc3RhX2lkeCkKK3sKKwlzdHJ1Y3QgYWdueF9zdGFfcG93ZXIgcG93ZXI7CisJdTMyIHJlZzsKKworCWdldF9zdGFfcG93ZXIocHJpdiwgJnBvd2VyLCBzdGFfaWR4KTsKKworCXJlZyA9IGxlMzJfdG9fY3B1KHBvd2VyLnJlZyk7CisJUFJJTlRLX0JJVFMoU1RBX1BPV0VSLCBTSUdOQUwpOworCVBSSU5US19CSVRTKFNUQV9QT1dFUiwgUkFURSk7CisJUFJJTlRLX0JJVFMoU1RBX1BPV0VSLCBUSUZTKTsKKwlQUklOVEtfQklUUyhTVEFfUE9XRVIsIEVEQ0YpOworCVBSSU5US19CSVRTKFNUQV9QT1dFUiwgQ0hBTk5FTF9CT05EKTsKKwlQUklOVEtfQklUUyhTVEFfUE9XRVIsIFBIWV9NT0RFKTsKKwlQUklOVEtfQklUUyhTVEFfUE9XRVIsIFBPV0VSX0xFVkVMKTsKKwlQUklOVEtfQklUUyhTVEFfUE9XRVIsIE5VTV9UUkFOU01JVFRFUlMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2FnbnhfcHJpbnRfc3RhX3R4X3dxKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCBzdGFfaWR4LCB1bnNpZ25lZCBpbnQgd3FfaWR4KQoreworCXN0cnVjdCBhZ254X3N0YV90eF93cSB0eF93cTsKKwl1MzIgcmVnOworCisJZ2V0X3N0YV90eF93cShwcml2LCAmdHhfd3EsIHN0YV9pZHgsIHdxX2lkeCk7CisKKwlyZWcgPSBsZTMyX3RvX2NwdSh0eF93cS5yZWcwKTsKKwlQUklOVEtfQklUUyhTVEFfVFhfV1EsIFRBSUxfUE9JTlRFUik7CisJUFJJTlRLX0JJVFMoU1RBX1RYX1dRLCBIRUFEX1BPSU5URVJfTE9XKTsKKworCXJlZyA9IGxlMzJfdG9fY3B1KHR4X3dxLnJlZzMpOworCVBSSU5US19CSVRTKFNUQV9UWF9XUSwgSEVBRF9QT0lOVEVSX0hJR0gpOworCVBSSU5US19CSVRTKFNUQV9UWF9XUSwgQUNLX1BPSU5URVJfTE9XKTsKKworCXJlZyA9IGxlMzJfdG9fY3B1KHR4X3dxLnJlZzEpOworCVBSSU5US19CSVRTKFNUQV9UWF9XUSwgQUNLX1BPSU5URVJfSElHSCk7CisJUFJJTlRLX0JJVFMoU1RBX1RYX1dRLCBIRUFEX1RJTU9VVF9UQUlMX1BBQ0tfQ05UKTsKKwlQUklOVEtfQklUUyhTVEFfVFhfV1EsIEFDS19USU1PVVRfVEFJTF9QQUNLX0NOVCk7CisKKwlyZWcgPSBsZTMyX3RvX2NwdSh0eF93cS5yZWcyKTsKKwlQUklOVEtfQklUUyhTVEFfVFhfV1EsIEhFQURfVElNT1VUX1dJTl9MSU1fQllURV9DTlQpOworCVBSSU5US19CSVRTKFNUQV9UWF9XUSwgSEVBRF9USU1PVVRfV0lOX0xJTV9GUkFHX0NOVCk7CisJUFJJTlRLX0JJVFMoU1RBX1RYX1dRLCBXT1JLX1FVRVVFX0FDS19UWVBFKTsKKwlQUklOVEtfQklUUyhTVEFfVFhfV1EsIFdPUktfUVVFVUVfVkFMSUQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWdueF9wcmludF9zdGFfdHJhZmZpYyhzdHJ1Y3QgYWdueF9zdGFfdHJhZmZpYyAqdHJhZmZpYykKK3sKKwl1MzIgcmVnOworCisJcmVnID0gbGUzMl90b19jcHUodHJhZmZpYy0+cmVnMCk7CisJUFJJTlRLX0JJVFMoU1RBX1RSQUZGSUMsIEFDS19USU1PVVRfQ05UKTsKKwlQUklOVEtfQklUUyhTVEFfVFJBRkZJQywgVFJBRkZJQ19BQ0tfVFlQRSk7CisJUFJJTlRLX0JJVFMoU1RBX1RSQUZGSUMsIE5FV19QQUNLRVQpOworCVBSSU5US19CSVRTKFNUQV9UUkFGRklDLCBUUkFGRklDX1ZBTElEKTsKKwlQUklOVEtfQklUUyhTVEFfVFJBRkZJQywgUlhfSERSX0RFU0NfUE9JTlRFUik7CisKKwlyZWcgPSBsZTMyX3RvX2NwdSh0cmFmZmljLT5yZWcxKTsKKwlQUklOVEtfQklUUyhTVEFfVFJBRkZJQywgUlhfUEFDS0VUX1RJTUVTVEFNUCk7CisJUFJJTlRLX0JJVFMoU1RBX1RSQUZGSUMsIFRSQUZGSUNfUkVTRVJWRUQpOworCVBSSU5US19CSVRTKFNUQV9UUkFGRklDLCBTVik7CisJUFJJTlRLX0JJVFMoU1RBX1RSQUZGSUMsIFJYX1NFUVVFTkNFX05VTSk7CisKKwlQUklOVEtfTEUzMihTVEFfVFJBRkZJQywgdHJhZmZpYy0+dHhfcmVwbGF5X2NudF9sb3cpOworCisJUFJJTlRLX0xFMTYoU1RBX1RSQUZGSUMsIHRyYWZmaWMtPnR4X3JlcGxheV9jbnRfaGlnaCk7CisJUFJJTlRLX0xFMTYoU1RBX1RSQUZGSUMsIHRyYWZmaWMtPnJ4X3JlcGxheV9jbnRfaGlnaCk7CisKKwlQUklOVEtfTEUzMihTVEFfVFJBRkZJQywgdHJhZmZpYy0+cnhfcmVwbGF5X2NudF9sb3cpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWdueF9wcmludF9zdGEoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IHN0YV9pZHgpCit7CisJc3RydWN0IGFnbnhfc3RhIHN0YXRpb247CisJc3RydWN0IGFnbnhfc3RhICpzdGEgPSAmc3RhdGlvbjsKKwl1MzIgcmVnOworCXVuc2lnbmVkIGludCBpOworCisJZ2V0X3N0YShwcml2LCBzdGEsIHN0YV9pZHgpOworCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJUFJJTlRLX0xFMzIoU1RBLCBzdGEtPnR4X3Nlc3Npb25fa2V5c1tpXSk7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJUFJJTlRLX0xFMzIoU1RBLCBzdGEtPnJ4X3Nlc3Npb25fa2V5c1tpXSk7CisKKwlyZWcgPSBsZTMyX3RvX2NwdShzdGEtPnJlZyk7CisJUFJJTlRLX0JJVFMoU1RBLCBJRF8xKTsKKwlQUklOVEtfQklUUyhTVEEsIElEXzApOworCVBSSU5US19CSVRTKFNUQSwgRU5BQkxFX0NPTkNBVEVOQVRJT04pOworCVBSSU5US19CSVRTKFNUQSwgRU5BQkxFX0RFQ09NUFJFU1NJT04pOworCVBSSU5US19CSVRTKFNUQSwgU1RBX1JFU0VSVkVEKTsKKwlQUklOVEtfQklUUyhTVEEsIEVBUCk7CisJUFJJTlRLX0JJVFMoU1RBLCBFRF9OVUxMKTsKKwlQUklOVEtfQklUUyhTVEEsIEVOQ1JZUFRJT05fUE9MSUNZKTsKKwlQUklOVEtfQklUUyhTVEEsIERFRklORURfS0VZX0lEKTsKKwlQUklOVEtfQklUUyhTVEEsIEZJWEVEX0tFWSk7CisJUFJJTlRLX0JJVFMoU1RBLCBLRVlfVkFMSUQpOworCVBSSU5US19CSVRTKFNUQSwgU1RBVElPTl9WQUxJRCk7CisKKwlQUklOVEtfTEUzMihTVEEsIHN0YS0+dHhfYWVzX2Jsa3NfdW5pY2FzdCk7CisJUFJJTlRLX0xFMzIoU1RBLCBzdGEtPnJ4X2Flc19ibGtzX3VuaWNhc3QpOworCisJUFJJTlRLX0xFMTYoU1RBLCBzdGEtPmFlc19mb3JtYXRfZXJyX3VuaWNhc3RfY250KTsKKwlQUklOVEtfTEUxNihTVEEsIHN0YS0+YWVzX3JlcGxheV91bmljYXN0KTsKKworCVBSSU5US19MRTE2KFNUQSwgc3RhLT5hZXNfZGVjcnlwdF9lcnJfdW5pY2FzdCk7CisJUFJJTlRLX0xFMTYoU1RBLCBzdGEtPmFlc19kZWNyeXB0X2Vycl9kZWZhdWx0KTsKKworCVBSSU5US19MRTE2KFNUQSwgc3RhLT5zaW5nbGVfcmV0cnlfcGFja2V0cyk7CisJUFJJTlRLX0xFMTYoU1RBLCBzdGEtPmZhaWxlZF90eF9wYWNrZXRzKTsKKworCVBSSU5US19MRTE2KFNUQSwgc3RhLT5tdXRpX3JldHJ5X3BhY2tldHMpOworCVBSSU5US19MRTE2KFNUQSwgc3RhLT5hY2tfdGltZW91dHMpOworCisJUFJJTlRLX0xFMTYoU1RBLCBzdGEtPmZyYWdfdHhfY250KTsKKwlQUklOVEtfTEUxNihTVEEsIHN0YS0+cnRzX2JycV9zZW50KTsKKworCVBSSU5US19MRTE2KFNUQSwgc3RhLT50eF9wYWNrZXRzKTsKKwlQUklOVEtfTEUxNihTVEEsIHN0YS0+Y3RzX2JhY2tfdGltZW91dCk7CisKKwlQUklOVEtfTEUzMihTVEEsIHN0YS0+cGh5X3N0YXRzX2hpZ2gpOworCVBSSU5US19MRTMyKFNUQSwgc3RhLT5waHlfc3RhdHNfbG93KTsKKworLy8JZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwlhZ254X3ByaW50X3N0YV90cmFmZmljKHN0YS0+dHJhZmZpYyArIDApOworCisJUFJJTlRLX0xFMTYoU1RBLCBzdGEtPnRyYWZmaWNfY2xhc3MwX2ZyYWdfc3VjY2Vzcyk7CisJUFJJTlRLX0xFMTYoU1RBLCBzdGEtPnRyYWZmaWNfY2xhc3MxX2ZyYWdfc3VjY2Vzcyk7CisJUFJJTlRLX0xFMTYoU1RBLCBzdGEtPnRyYWZmaWNfY2xhc3MyX2ZyYWdfc3VjY2Vzcyk7CisJUFJJTlRLX0xFMTYoU1RBLCBzdGEtPnRyYWZmaWNfY2xhc3MzX2ZyYWdfc3VjY2Vzcyk7CisJUFJJTlRLX0xFMTYoU1RBLCBzdGEtPnRyYWZmaWNfY2xhc3M0X2ZyYWdfc3VjY2Vzcyk7CisJUFJJTlRLX0xFMTYoU1RBLCBzdGEtPnRyYWZmaWNfY2xhc3M1X2ZyYWdfc3VjY2Vzcyk7CisJUFJJTlRLX0xFMTYoU1RBLCBzdGEtPnRyYWZmaWNfY2xhc3M2X2ZyYWdfc3VjY2Vzcyk7CisJUFJJTlRLX0xFMTYoU1RBLCBzdGEtPnRyYWZmaWNfY2xhc3M3X2ZyYWdfc3VjY2Vzcyk7CisKKwlQUklOVEtfTEUxNihTVEEsIHN0YS0+bnVtX2ZyYWdfbm9uX3ByaW1lX3JhdGVzKTsKKwlQUklOVEtfTEUxNihTVEEsIHN0YS0+YWNrX3RpbWVvdXRfbm9uX3ByaW1lX3JhdGVzKTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtcF9pZWVlODAyMTFfaGRyKHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsIGNoYXIgKnRhZykKK3sKKwl1MTYgZmN0bDsKKyAgICAgICAgaW50IGhkcmxlbjsKKwlERUNMQVJFX01BQ19CVUYobWFjKTsKKworICAgICAgICBmY3RsID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jb250cm9sKTsKKwlzd2l0Y2ggKGZjdGwgJiBJRUVFODAyMTFfRkNUTF9GVFlQRSkgeworCWNhc2UgSUVFRTgwMjExX0ZUWVBFX0RBVEE6CisJCXByaW50ayhQRlggIiVzIERBVEEgIiwgdGFnKTsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfRlRZUEVfQ1RMOgorCQlwcmludGsoUEZYICIlcyBDVEwgIiwgdGFnKTsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfRlRZUEVfTUdNVDoKKwkJcHJpbnRrKFBGWCAiJXMgTUdNVCAiLCB0YWcpOworCQlzd2l0Y2goZmN0bCAmIElFRUU4MDIxMV9GQ1RMX1NUWVBFKSB7CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFUToKKwkJCXByaW50aygiU3ViVHlwZTogQVNTT0NfUkVRICIpOworCQkJYnJlYWs7CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFU1A6CisJCQlwcmludGsoIlN1YlR5cGU6IEFTU09DX1JFU1AgIik7CisJCQlicmVhazsKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVE6CisJCQlwcmludGsoIlN1YlR5cGU6IFJFQVNTT0NfUkVRICIpOworCQkJYnJlYWs7CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX1JFQVNTT0NfUkVTUDoKKwkJCXByaW50aygiU3ViVHlwZTogUkVBU1NPQ19SRVNQICIpOworCQkJYnJlYWs7CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFUToKKwkJCXByaW50aygiU3ViVHlwZTogUFJPQkVfUkVRICIpOworCQkJYnJlYWs7CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1A6CisJCQlwcmludGsoIlN1YlR5cGU6IFBST0JFX1JFU1AgIik7CisJCQlicmVhazsKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfQkVBQ09OOgorCQkJcHJpbnRrKCJTdWJUeXBlOiBCRUFDT04gIik7CisJCQlicmVhazsKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfQVRJTToKKwkJCXByaW50aygiU3ViVHlwZTogQVRJTSAiKTsKKwkJCWJyZWFrOworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9ESVNBU1NPQzoKKwkJCXByaW50aygiU3ViVHlwZTogRElTQVNTT0MgIik7CisJCQlicmVhazsKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfQVVUSDoKKwkJCXByaW50aygiU3ViVHlwZTogQVVUSCAiKTsKKwkJCWJyZWFrOworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9ERUFVVEg6CisJCQlwcmludGsoIlN1YlR5cGU6IERFQVVUSCAiKTsKKwkJCWJyZWFrOworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9BQ1RJT046CisJCQlwcmludGsoIlN1YlR5cGU6IEFDVElPTiAiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKCJTdWJUeXBlOiBVbmtub3dcbiIpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhQRlggIiVzIFBhY2tldCB0eXBlOiBVbmtub3dcbiIsIHRhZyk7CisJfQorCisgICAgICAgIGhkcmxlbiA9IGllZWU4MDIxMV9oZHJsZW4oZmN0bCk7CisKKwlpZiAoaGRybGVuID49IDQpCisJCXByaW50aygiRkM9MHglMDR4IERVUj0weCUwNHgiLAorCQkgICAgICAgZmN0bCwgbGUxNl90b19jcHUoaGRyLT5kdXJhdGlvbl9pZCkpOworCWlmIChoZHJsZW4gPj0gMTApCisJCXByaW50aygiIEExPSVzIiwgcHJpbnRfbWFjKG1hYywgaGRyLT5hZGRyMSkpOworCWlmIChoZHJsZW4gPj0gMTYpCisJCXByaW50aygiIEEyPSVzIiwgcHJpbnRfbWFjKG1hYywgaGRyLT5hZGRyMikpOworCWlmIChoZHJsZW4gPj0gMjQpCisJCXByaW50aygiIEEzPSVzIiwgcHJpbnRfbWFjKG1hYywgaGRyLT5hZGRyMykpOworCWlmIChoZHJsZW4gPj0gMzApCisJCXByaW50aygiIEE0PSVzIiwgcHJpbnRfbWFjKG1hYywgaGRyLT5hZGRyNCkpOworCXByaW50aygiXG4iKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGR1bXBfdHhtX3JlZ2lzdGVycyhzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCWludCBpOworCWZvciAoaSA9IDA7IGkgPD0weDFlODsgaSArPSA0KSB7CisJCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiVFhNOiAleC0tLT4gMHglLjh4XG4iLCBpLCBpb3JlYWQzMihjdGwgKyBpKSk7CisJfQorfQorc3RhdGljIGlubGluZSB2b2lkIGR1bXBfcnhtX3JlZ2lzdGVycyhzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCWludCBpOworCWZvciAoaSA9IDA7IGkgPD0weDEwODsgaSArPSA0KQorCQlwcmludGsoS0VSTl9ERUJVRyBQRlggIlJYTTogJXgtLS0+IDB4JS44eFxuIiwgaSwgaW9yZWFkMzIoY3RsICsgMHgyMDAwICsgaSkpOworfQorc3RhdGljIGlubGluZSB2b2lkIGR1bXBfYm1fcmVnaXN0ZXJzKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8PTB4OTA7IGkgKz0gNCkKKwkJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJCTTogJXgtLS0+IDB4JS44eFxuIiwgaSwgaW9yZWFkMzIoY3RsICsgMHgyYzAwICsgaSkpOworfQorc3RhdGljIGlubGluZSB2b2lkIGR1bXBfY2lyX3JlZ2lzdGVycyhzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCWludCBpOworCWZvciAoaSA9IDA7IGkgPD0weGI4OyBpICs9IDQpCisJCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiQ0lSOiAleC0tLT4gMHglLjh4XG4iLCBpLCBpb3JlYWQzMihjdGwgKyAweDMwMDAgKyBpKSk7Cit9CisKKyNlbmRpZiAvKiBBR05YX0RFQlVHX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWdueC9wY2kuYyBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NDYzMGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYWdueC9wY2kuYwpAQCAtMCwwICsxLDY0NCBAQAorLyoqCisgKiBBaXJnbyBNSU1PIHdpcmVsZXNzIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNyBMaSBZYW5CbyA8ZHJlYW1mbHkyODFAZ21haWwuY29tPgorCisgKiBUaGFua3MgZm9yIEplZmYgV2lsbGlhbXMgPGFuZ2VsYmFuZUBnbWFpbC5jb20+IGRvIHJldmVyc2UgZW5naW5lZXIKKyAqIHdvcmtzIGFuZCBwdWJsaXNoZWQgdGhlIFNQRUNTIGF0IGh0dHA6Ly9haXJnby53ZHdjb25zdWx0aW5nLm5ldC9teW1vaW4KKworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgImFnbnguaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgInhtaXQuaCIKKyNpbmNsdWRlICJwaHkuaCIKKworTU9EVUxFX0FVVEhPUigiTGkgWWFuQm8gPGRyZWFtZmx5MjgxQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQWlyZ28gTUlNTyBQQ0kgd2lyZWxlc3MgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhZ254X3BjaV9pZF90YmxbXSBfX2RldmluaXRkYXRhID0geworCXsgUENJX0RFVklDRSgweDE3Y2IsIDB4MDAwMSkgfSwJLyogQmVrbGluIEY1ZDgwMTAsIE5ldGdlYXIgV0dNNTExIGV0YyAqLworCXsgUENJX0RFVklDRSgweDE3Y2IsIDB4MDAwMikgfSwJLyogTmV0Z2VhciBXcG50NTExICovCisJeyAwIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBhZ254X3BjaV9pZF90YmwpOworCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZ254X2ludGVycnVwdF9hY2soc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdTMyICpyZWFzb24pCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIHJlZzsKKworCWlmICggKnJlYXNvbiAmIEFHTlhfU1RBVF9SWCApIHsKKwkJLyogTWFyayBjb21wbGV0ZSBSWCAqLworCQlyZWcgPSBpb3JlYWQzMihjdGwgKyBBR05YX0NJUl9SWENUTCk7CisJCXJlZyB8PSAweDQ7CisJCWlvd3JpdGUzMihyZWcsIGN0bCArIEFHTlhfQ0lSX1JYQ1RMKTsKKwkJLyogZGlzYWJsZSBSeCBpbnRlcnJ1cHQgKi8KKwl9CisJaWYgKCAqcmVhc29uICYgQUdOWF9TVEFUX1RYICkgeworCQlyZWcgPSBpb3JlYWQzMihjdGwgKyBBR05YX0NJUl9UWERDVEwpOworCQlpZiAocmVnICYgMHg0KSB7CisJCQlpb3dyaXRlMzIocmVnLCBjdGwgKyBBR05YX0NJUl9UWERDVEwpOworCQkJKnJlYXNvbiB8PSBBR05YX1NUQVRfVFhEOworCQl9CisgCQlyZWcgPSBpb3JlYWQzMihjdGwgKyBBR05YX0NJUl9UWE1DVEwpOworCQlpZiAocmVnICYgMHg0KSB7CisJCQlpb3dyaXRlMzIocmVnLCBjdGwgKyBBR05YX0NJUl9UWE1DVEwpOworCQkJKnJlYXNvbiB8PSBBR05YX1NUQVRfVFhNOworCQl9CisJfQorCWlmICggKnJlYXNvbiAmIEFHTlhfU1RBVF9YICkgeworLyogCQlyZWcgPSBpb3JlYWQzMihjdGwgKyBBR05YX0lOVF9TVEFUKTsgKi8KKy8qIAkJaW93cml0ZTMyKHJlZywgY3RsICsgQUdOWF9JTlRfU1RBVCk7ICovCisvKiAJCS9cKiBGSVhNRSByZWluaXQgaW50ZXJydXB0IG1hc2sgKlwvICovCisvKiAJCXJlZyA9IDB4YzM5MGJmOSAmIH5JUlFfVFhfQkVBQ09OOyAqLworLyogCQlyZWcgJj0gfklSUV9UWF9ESVNBQkxFOyAqLworLyogCQlpb3dyaXRlMzIocmVnLCBjdGwgKyBBR05YX0lOVF9NQVNLKTsgKi8KKy8qIAkJaW93cml0ZTMyKDB4ODAwLCBjdGwgKyBBR05YX0NJUl9CTEtDVEwpOyAqLworCX0KK30gLyogYWdueF9pbnRlcnJ1cHRfYWNrICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhZ254X2ludGVycnVwdF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IGFnbnhfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwlpcnFyZXR1cm5fdCByZXQgPSBJUlFfTk9ORTsKKwl1MzIgaXJxX3JlYXNvbjsKKworCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CisKKy8vCXByaW50ayhLRVJOX0VSUiBQRlggIkdldCBhIGludGVycnVwdCAlc1xuIiwgX19mdW5jX18pOworCisJaWYgKHByaXYtPmluaXRfc3RhdHVzICE9IEFHTlhfU1RBUlQpCisJCWdvdG8gb3V0OworCisJLyogRmlYTUUgIEhlcmUgaGFzIG5vIGxvY2ssIElzIHRoaXMgd2lsbCBsZWFkIHRvIHJhY2U/ICovCisJaXJxX3JlYXNvbiA9IGlvcmVhZDMyKGN0bCArIEFHTlhfQ0lSX0JMS0NUTCk7CisJaWYgKCEoaXJxX3JlYXNvbiAmIDB4NykpCisJCWdvdG8gb3V0OworCisJcmV0ID0gSVJRX0hBTkRMRUQ7CisJcHJpdi0+aXJxX3N0YXR1cyA9IGlvcmVhZDMyKGN0bCArIEFHTlhfSU5UX1NUQVQpOworCisvLwlwcmludGsoUEZYICJJbnRlcnJ1cHQgcmVhc29uIGlzIDB4JXhcbiIsIGlycV9yZWFzb24pOworCS8qIE1ha2Ugc3VyZSB0aGUgdHhtIGFuZCB0eGQgZmxhZ3MgZG9uJ3QgY29uZmxpY3Qgd2l0aCBvdGhlciB1bmtub3duCisJICAgaW50ZXJydXB0IGZsYWcsIG1heWJlIGlzIG5vdCBuZWNlc3NhcnkgKi8KKwlpcnFfcmVhc29uICY9IDB4RjsKKworCWRpc2FibGVfcnhfaW50ZXJydXB0KHByaXYpOworCS8qIFRPRE8gTWFrZSBzdXJlIHRoZSBjYXJkIGZpbmlzaGVkIGluaXRpYWxpemVkICovCisJYWdueF9pbnRlcnJ1cHRfYWNrKHByaXYsICZpcnFfcmVhc29uKTsKKworCWlmICggaXJxX3JlYXNvbiAmIEFHTlhfU1RBVF9SWCApCisJCWhhbmRsZV9yeF9pcnEocHJpdik7CisJaWYgKCBpcnFfcmVhc29uICYgQUdOWF9TVEFUX1RYRCApCisJCWhhbmRsZV90eGRfaXJxKHByaXYpOworCWlmICggaXJxX3JlYXNvbiAmIEFHTlhfU1RBVF9UWE0gKQorCQloYW5kbGVfdHhtX2lycShwcml2KTsKKwlpZiAoIGlycV9yZWFzb24gJiBBR05YX1NUQVRfWCApCisJCWhhbmRsZV9vdGhlcl9pcnEocHJpdik7CisKKwllbmFibGVfcnhfaW50ZXJydXB0KHByaXYpOworb3V0OgorCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfSAvKiBhZ254X2ludGVycnVwdF9oYW5kbGVyICovCisKKworLyogRklYTUUgKi8KK3N0YXRpYyBpbnQgYWdueF90eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJQUdOWF9UUkFDRTsKKwlyZXR1cm4gX2FnbnhfdHgoZGV2LT5wcml2LCBza2IpOworfSAvKiBhZ254X3R4ICovCisKKworc3RhdGljIGludCBhZ254X2dldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiByZWc7CisJQUdOWF9UUkFDRTsKKworCS8qIEF0dGVudGlvbiEgZGlyZWN0bHkgcmVhZCB0aGUgTUFDIG9yIG90aGVyIGRhdGUgZnJvbSBFRVBST00gd2lsbAorCSBsZWFkIHRvIGNhcmRidXMoV0dNNTExKSBsb2NrIHVwIHdoZW4gd3JpdGUgdG8gUE0gUExMIHJlZ2lzdGVyICovCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCAweDM1NDQpOworCXVkZWxheSg0MCk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCAweDM1NGMpOworCXVkZWxheSg1MCk7CisJLyogR2V0IHRoZSBtYWMgYWRkcmVzcyAqLworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgMHgzNTQ0KTsKKwl1ZGVsYXkoNDApOworCisJLyogSEFDSyAqLworCXJlZyA9IGNwdV90b19sZTMyKHJlZyk7CisJcHJpdi0+bWFjX2FkZHJbMF0gPSAoKHU4ICopJnJlZylbMl07CisJcHJpdi0+bWFjX2FkZHJbMV0gPSAoKHU4ICopJnJlZylbM107CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCAweDM1NDgpOworCXVkZWxheSg1MCk7CisJKigodTMyICopKHByaXYtPm1hY19hZGRyICsgMikpID0gY3B1X3RvX2xlMzIocmVnKTsKKworCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihwcml2LT5tYWNfYWRkcikpIHsKKwkJREVDTEFSRV9NQUNfQlVGKG1idWYpOworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAicmVhZCBtYWMgJXNcbiIsIHByaW50X21hYyhtYnVmLCBwcml2LT5tYWNfYWRkcikpOworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiSW52YWxpZCBod2FkZHIhIFVzaW5nIHJhbmRvbSBod2FkZHJcbiIpOworCQlyYW5kb21fZXRoZXJfYWRkcihwcml2LT5tYWNfYWRkcik7CisJfQorCisJcmV0dXJuIDA7Cit9IC8qIGFnbnhfZ2V0X21hY19hZGRyZXNzICovCisKK3N0YXRpYyBpbnQgYWdueF9hbGxvY19yaW5ncyhzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXVuc2lnbmVkIGludCBsZW47CisJQUdOWF9UUkFDRTsKKworCS8qIEFsbG9jYXRlIFJYL1RYTS9UWEQgcmluZ3MgaW5mbyAqLworCXByaXYtPnJ4LnNpemUgPSBBR05YX1JYX1JJTkdfU0laRTsKKwlwcml2LT50eG0uc2l6ZSA9IEFHTlhfVFhNX1JJTkdfU0laRTsKKwlwcml2LT50eGQuc2l6ZSA9IEFHTlhfVFhEX1JJTkdfU0laRTsKKworCWxlbiA9IHByaXYtPnJ4LnNpemUgKyBwcml2LT50eG0uc2l6ZSArIHByaXYtPnR4ZC5zaXplOworCisvLwlwcml2LT5yeC5pbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFnbnhfaW5mbykgKiBsZW4sIEdGUF9LRVJORUwpOworCXByaXYtPnJ4LmluZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWdueF9pbmZvKSAqIGxlbiwgR0ZQX0FUT01JQyk7CisJaWYgKCFwcml2LT5yeC5pbmZvKQorCQlyZXR1cm4gLUVOT01FTTsKKwlwcml2LT50eG0uaW5mbyA9IHByaXYtPnJ4LmluZm8gKyBwcml2LT5yeC5zaXplOworCXByaXYtPnR4ZC5pbmZvID0gcHJpdi0+dHhtLmluZm8gKyBwcml2LT50eG0uc2l6ZTsKKworCS8qIEFsbG9jYXRlIFJYL1RYTS9UWEQgZGVzY3JpcHRvcnMgKi8KKwlwcml2LT5yeC5kZXNjID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocHJpdi0+cGRldiwgc2l6ZW9mKHN0cnVjdCBhZ254X2Rlc2MpICogbGVuLAorCQkJCQkgICAgICZwcml2LT5yeC5kbWEpOworCWlmICghcHJpdi0+cnguZGVzYykgeworCQlrZnJlZShwcml2LT5yeC5pbmZvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcHJpdi0+dHhtLmRlc2MgPSBwcml2LT5yeC5kZXNjICsgcHJpdi0+cnguc2l6ZTsKKwlwcml2LT50eG0uZG1hID0gcHJpdi0+cnguZG1hICsgc2l6ZW9mKHN0cnVjdCBhZ254X2Rlc2MpICogcHJpdi0+cnguc2l6ZTsKKwlwcml2LT50eGQuZGVzYyA9IHByaXYtPnR4bS5kZXNjICsgcHJpdi0+dHhtLnNpemU7CisJcHJpdi0+dHhkLmRtYSA9IHByaXYtPnR4bS5kbWEgKyBzaXplb2Yoc3RydWN0IGFnbnhfZGVzYykgKiBwcml2LT50eG0uc2l6ZTsKKworCXJldHVybiAwOworfSAvKiBhZ254X2FsbG9jX3JpbmdzICovCisKK3N0YXRpYyB2b2lkIHJpbmdzX2ZyZWUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl1bnNpZ25lZCBpbnQgbGVuID0gcHJpdi0+cnguc2l6ZSArIHByaXYtPnR4bS5zaXplICsgcHJpdi0+dHhkLnNpemU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlBR05YX1RSQUNFOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlrZnJlZShwcml2LT5yeC5pbmZvKTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHByaXYtPnBkZXYsIHNpemVvZihzdHJ1Y3QgYWdueF9kZXNjKSAqIGxlbiwKKwkJCSAgICBwcml2LT5yeC5kZXNjLCBwcml2LT5yeC5kbWEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKK30KKworI2lmIDAKK3N0YXRpYyB2b2lkIGFnbnhfcGVyaW9kaWNfd29ya19oYW5kbGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYWdueF9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhZ254X3ByaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJpb2RpY193b3JrLndvcmspOworLy8JdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIGRlbGF5OworCisJLyogZml4bWU6IHVzaW5nIG11dGV4Pz8gKi8KKy8vCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwkvKiBUT0RPIFJlY2FsaWJyYXRlKi8KKy8vCWNhbGlicmF0ZV9vc2NpbGxhdG9yKHByaXYpOworLy8JYW50ZW5uYV9jYWxpYnJhdGUocHJpdik7CisvLwlhZ254X3NlbmRfcGFja2V0KHByaXYsIDk5Nyk7CisJLyogRklYTUUgKi8KKy8qIAlpZiAoZGVidWcgPT0gMykgKi8KKy8qICAgICAgICAgICAgICAgICBkZWxheSA9IG1zZWNzX3RvX2ppZmZpZXMoQUdOWF9QRVJJT0RJQ19ERUxBWSk7ICovCisvKiAJZWxzZSAqLworCWRlbGF5ID0gbXNlY3NfdG9famlmZmllcyhBR05YX1BFUklPRElDX0RFTEFZKTsKKy8vCQlkZWxheSA9IHJvdW5kX2ppZmZpZXMoSFogKiAxNSk7CisKKwlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+aHctPndvcmtxdWV1ZSwgJnByaXYtPnBlcmlvZGljX3dvcmssIGRlbGF5KTsKKworLy8Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgYWdueF9zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYpCit7CisJc3RydWN0IGFnbnhfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKwkvKiB1bnNpZ25lZCBsb25nIGRlbGF5OyAqLworCWludCBlcnIgPSAwOworCUFHTlhfVFJBQ0U7CisKKwllcnIgPSBhZ254X2FsbG9jX3JpbmdzKHByaXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2FuJ3QgYWxsb2MgUlgvVFhNL1RYRCByaW5nc1xuIik7CisJCWdvdG8gb3V0OworCX0KKwllcnIgPSByZXF1ZXN0X2lycShwcml2LT5wZGV2LT5pcnEsICZhZ254X2ludGVycnVwdF9oYW5kbGVyLAorCQkJICBJUlFGX1NIQVJFRCwgImFnbnhfcGNpIiwgZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkZhaWxlZCB0byByZWdpc3RlciBJUlEgaGFuZGxlclxuIik7CisJCXJpbmdzX2ZyZWUocHJpdik7CisJCWdvdG8gb3V0OworCX0KKworLy8JbWRlbGF5KDUwMCk7CisKKwltaWdodF9zbGVlcCgpOworCWFnbnhfaHdfaW5pdChwcml2KTsKKworLy8JbWRlbGF5KDUwMCk7CisJbWlnaHRfc2xlZXAoKTsKKworCXByaXYtPmluaXRfc3RhdHVzID0gQUdOWF9TVEFSVDsKKy8qICAgICAgICAgSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPnBlcmlvZGljX3dvcmssIGFnbnhfcGVyaW9kaWNfd29ya19oYW5kbGVyKTsgKi8KKy8qIAlkZWxheSA9IG1zZWNzX3RvX2ppZmZpZXMoQUdOWF9QRVJJT0RJQ19ERUxBWSk7ICovCisvKiAgICAgICAgIHF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT5ody0+d29ya3F1ZXVlLCAmcHJpdi0+cGVyaW9kaWNfd29yaywgZGVsYXkpOyAqLworb3V0OgorCXJldHVybiBlcnI7Cit9IC8qIGFnbnhfc3RhcnQgKi8KKworc3RhdGljIHZvaWQgYWdueF9zdG9wKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldikKK3sKKwlzdHJ1Y3QgYWdueF9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCUFHTlhfVFJBQ0U7CisKKwlwcml2LT5pbml0X3N0YXR1cyA9IEFHTlhfU1RPUDsKKwkvKiBtYWtlIHN1cmUgaGFyZHdhcmUgd2lsbCBub3QgZ2VuZXJhdGUgaXJxICovCisJYWdueF9od19yZXNldChwcml2KTsKKwlmcmVlX2lycShwcml2LT5wZGV2LT5pcnEsIGRldik7CisgICAgICAgIGZsdXNoX3dvcmtxdWV1ZShwcml2LT5ody0+d29ya3F1ZXVlKTsKKy8vCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcHJpdi0+cGVyaW9kaWNfd29yayk7CisJdW5maWxsX3JpbmdzKHByaXYpOworCXJpbmdzX2ZyZWUocHJpdik7Cit9CisKK3N0YXRpYyBpbnQgYWdueF9jb25maWcoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LAorCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mKQoreworCXN0cnVjdCBhZ254X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisJaW50IGNoYW5uZWwgPSBpZWVlODAyMTFfZnJlcXVlbmN5X3RvX2NoYW5uZWwoY29uZi0+Y2hhbm5lbC0+Y2VudGVyX2ZyZXEpOworCUFHTlhfVFJBQ0U7CisKKwlzcGluX2xvY2soJnByaXYtPmxvY2spOworCS8qIEZJWE1FIG5lZWQgcHJpdiBsb2NrPyAqLworCWlmIChjaGFubmVsICE9IHByaXYtPmNoYW5uZWwpIHsKKwkJcHJpdi0+Y2hhbm5lbCA9IGNoYW5uZWw7CisJCWFnbnhfc2V0X2NoYW5uZWwocHJpdiwgcHJpdi0+Y2hhbm5lbCk7CisJfQorCisJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFnbnhfY29uZmlnX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsCisJCQkJIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkJIHN0cnVjdCBpZWVlODAyMTFfaWZfY29uZiAqY29uZikKK3sKKwlzdHJ1Y3QgYWdueF9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCUFHTlhfVFJBQ0U7CisKKwlzcGluX2xvY2soJnByaXYtPmxvY2spOworCisJaWYgKG1lbWNtcChjb25mLT5ic3NpZCwgcHJpdi0+YnNzaWQsIEVUSF9BTEVOKSkgeworLy8JCXUzMiByZWdoaSwgcmVnbG87CisJCWFnbnhfc2V0X2Jzc2lkKHByaXYsIGNvbmYtPmJzc2lkKTsKKwkJbWVtY3B5KHByaXYtPmJzc2lkLCBjb25mLT5ic3NpZCwgRVRIX0FMRU4pOworCQloYXNoX3dyaXRlKHByaXYsIGNvbmYtPmJzc2lkLCBCU1NJRF9TVEFJRCk7CisJCXN0YV9pbml0KHByaXYsIEJTU0lEX1NUQUlEKTsKKwkJLyogRklYTUUgbmVlZGVkPyAqLworCQlzdGFfcG93ZXJfaW5pdChwcml2LCBCU1NJRF9TVEFJRCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQk1fTVRTTSwgMHhmZiAmIH4weDEpOworCX0KKwlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7CisJcmV0dXJuIDA7Cit9IC8qIGFnbnhfY29uZmlnX2ludGVyZmFjZSAqLworCisKK3N0YXRpYyB2b2lkIGFnbnhfY29uZmlndXJlX2ZpbHRlcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsCisJCQkJICB1bnNpZ25lZCBpbnQgY2hhbmdlZF9mbGFncywKKwkJCQkgIHVuc2lnbmVkIGludCAqdG90YWxfZmxhZ3MsCisJCQkJICBpbnQgbWNfY291bnQsIHN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0KQoreworCXVuc2lnbmVkIGludCBuZXdfZmxhZ3MgPSAwOworCisJKnRvdGFsX2ZsYWdzID0gbmV3X2ZsYWdzOworCS8qIFRPRE8gKi8KK30KKworc3RhdGljIGludCBhZ254X2FkZF9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LAorCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9pZl9pbml0X2NvbmYgKmNvbmYpCit7CisJc3RydWN0IGFnbnhfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKwlBR05YX1RSQUNFOworCisJc3Bpbl9sb2NrKCZwcml2LT5sb2NrKTsKKwkvKiBGSVhNRSAqLworCWlmIChwcml2LT5tb2RlICE9IE5MODAyMTFfSUZUWVBFX01PTklUT1IpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXN3aXRjaCAoY29uZi0+dHlwZSkgeworCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKKwkJcHJpdi0+bW9kZSA9IGNvbmYtPnR5cGU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYWdueF9yZW1vdmVfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwKKwkJCQkgIHN0cnVjdCBpZWVlODAyMTFfaWZfaW5pdF9jb25mICpjb25mKQoreworCXN0cnVjdCBhZ254X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisJQUdOWF9UUkFDRTsKKworCS8qIFRPRE8gKi8KKwlwcml2LT5tb2RlID0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjsKK30KKworc3RhdGljIGludCBhZ254X2dldF9zdGF0cyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsCisJCQkgIHN0cnVjdCBpZWVlODAyMTFfbG93X2xldmVsX3N0YXRzICpzdGF0cykKK3sKKwlzdHJ1Y3QgYWdueF9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCUFHTlhfVFJBQ0U7CisJc3Bpbl9sb2NrKCZwcml2LT5sb2NrKTsKKwkvKiBUT0RPICEhICovCisJbWVtY3B5KHN0YXRzLCAmcHJpdi0+c3RhdHMsIHNpemVvZigqc3RhdHMpKTsKKwlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHU2NCBhZ254X2dldF90c2Z0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9ICgoc3RydWN0IGFnbnhfcHJpdiAqKWRldi0+cHJpdiktPmN0bDsKKwl1MzIgdHNmdGw7CisJdTY0IHRzZnQ7CisJQUdOWF9UUkFDRTsKKworCS8qIEZJWE1FICovCisJdHNmdGwgPSBpb3JlYWQzMihjdGwgKyBBR05YX1RYTV9USU1FU1RBTVBMTyk7CisJdHNmdCA9IGlvcmVhZDMyKGN0bCArIEFHTlhfVFhNX1RJTUVTVEFNUEhJKTsKKwl0c2Z0IDw8PSAzMjsKKwl0c2Z0IHw9IHRzZnRsOworCisJcmV0dXJuIHRzZnQ7Cit9CisKK3N0YXRpYyBpbnQgYWdueF9nZXRfdHhfc3RhdHMoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3R4X3F1ZXVlX3N0YXRzICpzdGF0cykKK3sKKwlzdHJ1Y3QgYWdueF9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCUFHTlhfVFJBQ0U7CisKKwkvKiBGSVhNRSBub3cgd2UganVzdCB1c2luZyB0eGQgcXVldWUsIGJ1dCBzaG91bGQgdXNpbmcgdHhtIHF1ZXVlIHRvbyAqLworCXN0YXRzWzBdLmxlbiA9IChwcml2LT50eGQuaWR4IC0gcHJpdi0+dHhkLmlkeF9zZW50KSAvIDI7CisJc3RhdHNbMF0ubGltaXQgPSBwcml2LT50eGQuc2l6ZSAtIDI7CisJc3RhdHNbMF0uY291bnQgPSBwcml2LT50eGQuaWR4IC8gMjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9vcHMgYWdueF9vcHMgPSB7CisJLnR4CQkJPSBhZ254X3R4LAorCS5zdGFydAkJCT0gYWdueF9zdGFydCwKKwkuc3RvcAkJCT0gYWdueF9zdG9wLAorCS5hZGRfaW50ZXJmYWNlCQk9IGFnbnhfYWRkX2ludGVyZmFjZSwKKwkucmVtb3ZlX2ludGVyZmFjZQk9IGFnbnhfcmVtb3ZlX2ludGVyZmFjZSwKKwkuY29uZmlnCQkJPSBhZ254X2NvbmZpZywKKwkuY29uZmlnX2ludGVyZmFjZQk9IGFnbnhfY29uZmlnX2ludGVyZmFjZSwKKyAJLmNvbmZpZ3VyZV9maWx0ZXIJPSBhZ254X2NvbmZpZ3VyZV9maWx0ZXIsCisJLmdldF9zdGF0cwkJPSBhZ254X2dldF9zdGF0cywKKwkuZ2V0X3R4X3N0YXRzCQk9IGFnbnhfZ2V0X3R4X3N0YXRzLAorCS5nZXRfdHNmCQk9IGFnbnhfZ2V0X3RzZnQKK307CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBhZ254X3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGllZWU4MDIxMV9odyAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBhZ254X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisJQUdOWF9UUkFDRTsKKworCWlmICghZGV2KQorCQlyZXR1cm47CisJaWVlZTgwMjExX3VucmVnaXN0ZXJfaHcoZGV2KTsKKwlwY2lfaW91bm1hcChwZGV2LCBwcml2LT5jdGwpOworCXBjaV9pb3VubWFwKHBkZXYsIHByaXYtPmRhdGEpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCisJaWVlZTgwMjExX2ZyZWVfaHcoZGV2KTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgYWdueF9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXY7CisJc3RydWN0IGFnbnhfcHJpdiAqcHJpdjsKKwl1MzIgbWVtX2FkZHIwLCBtZW1fbGVuMDsKKwl1MzIgbWVtX2FkZHIxLCBtZW1fbGVuMTsKKwlpbnQgZXJyOworCURFQ0xBUkVfTUFDX0JVRihtYWMpOworCisJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW4ndCBlbmFibGUgbmV3IFBDSSBkZXZpY2VcbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qIGdldCBwY2kgcmVzb3VyY2UgKi8KKwltZW1fYWRkcjAgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJbWVtX2xlbjAgPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApOworCW1lbV9hZGRyMSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKTsKKwltZW1fbGVuMSA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSk7CisJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJNZW1hZGRyMCBpcyAleCwgbGVuZ3RoIGlzICV4XG4iLCBtZW1fYWRkcjAsIG1lbV9sZW4wKTsKKwlwcmludGsoS0VSTl9ERUJVRyBQRlggIk1lbWFkZHIxIGlzICV4LCBsZW5ndGggaXMgJXhcbiIsIG1lbV9hZGRyMSwgbWVtX2xlbjEpOworCisJZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCAiYWdueC1wY2kiKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbid0IG9idGFpbiBQQ0kgcmVzb3VyY2VcbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKSB8fAorCSAgICBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIk5vIHN1aXRhYmxlIERNQSBhdmFpbGFibGVcbiIpOworCQlnb3RvIGVycl9mcmVlX3JlZzsKKwl9CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKwlwcmludGsoS0VSTl9ERUJVRyBQRlggInBkZXYtPmlycSBpcyAlZFxuIiwgcGRldi0+aXJxKTsKKworCWRldiA9IGllZWU4MDIxMV9hbGxvY19odyhzaXplb2YoKnByaXYpLCAmYWdueF9vcHMpOworCWlmICghZGV2KSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImllZWU4MDIxMSBhbGxvYyBmYWlsZWRcbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9mcmVlX3JlZzsKKwl9CisJLyogaW5pdCBwcml2ICAqLworCXByaXYgPSBkZXYtPnByaXY7CisJbWVtc2V0KHByaXYsIDAsIHNpemVvZigqcHJpdikpOworCXByaXYtPm1vZGUgPSBOTDgwMjExX0lGVFlQRV9NT05JVE9SOworCXByaXYtPnBkZXYgPSBwZGV2OworCXByaXYtPmh3ID0gZGV2OworCXNwaW5fbG9ja19pbml0KCZwcml2LT5sb2NrKTsKKwlwcml2LT5pbml0X3N0YXR1cyA9IEFHTlhfVU5JTklUOworCisJLyogTWFwIG1lbSAjMSBhbmQgIzIgKi8KKwlwcml2LT5jdGwgPSBwY2lfaW9tYXAocGRldiwgMCwgbWVtX2xlbjApOworLy8JcHJpbnRrKEtFUk5fREVCVUcgUEZYIk1FTTEgbWFwcGVkIGFkZHJlc3MgaXMgMHglcFxuIiwgcHJpdi0+Y3RsKTsKKwlpZiAoIXByaXYtPmN0bCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW4ndCBtYXAgZGV2aWNlIG1lbW9yeVxuIik7CisJCWdvdG8gZXJyX2ZyZWVfZGV2OworCX0KKwlwcml2LT5kYXRhID0gcGNpX2lvbWFwKHBkZXYsIDEsIG1lbV9sZW4xKTsKKwlwcmludGsoS0VSTl9ERUJVRyBQRlggIk1FTTIgbWFwcGVkIGFkZHJlc3MgaXMgMHglcFxuIiwgcHJpdi0+ZGF0YSk7CisJaWYgKCFwcml2LT5kYXRhKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbid0IG1hcCBkZXZpY2UgbWVtb3J5XG4iKTsKKwkJZ290byBlcnJfaW91bm1hcDI7CisJfQorCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX1JFVklTSU9OX0lELCAmcHJpdi0+cmV2aWQpOworCisJcHJpdi0+YmFuZC5jaGFubmVscyAgID0gKHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqKWFnbnhfY2hhbm5lbHM7CisJcHJpdi0+YmFuZC5uX2NoYW5uZWxzID0gQVJSQVlfU0laRShhZ254X2NoYW5uZWxzKTsKKwlwcml2LT5iYW5kLmJpdHJhdGVzICAgPSAoc3RydWN0IGllZWU4MDIxMV9yYXRlICopYWdueF9yYXRlc184MDIxMWc7CisJcHJpdi0+YmFuZC5uX2JpdHJhdGVzID0gQVJSQVlfU0laRShhZ254X3JhdGVzXzgwMjExZyk7CisKKwkvKiBJbml0IGllZWU4MDIuMTEgZGV2ICAqLworCVNFVF9JRUVFODAyMTFfREVWKGRldiwgJnBkZXYtPmRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisJZGV2LT5leHRyYV90eF9oZWFkcm9vbSA9IHNpemVvZihzdHJ1Y3QgYWdueF9oZHIpOworCisJLyogRklYTUUgSXQgb25seSBpbmNsdWRlIEZDUyBpbiBwcm9taW91cyBtb2RlIGJ1dCBub3QgbWFuYWdlIG1vZGUgKi8KKy8qICAgICAgZGV2LT5mbGFncyA9ICBJRUVFODAyMTFfSFdfUlhfSU5DTFVERVNfRkNTOyAqLworCWRldi0+Y2hhbm5lbF9jaGFuZ2VfdGltZSA9IDUwMDA7CisJZGV2LT5tYXhfc2lnbmFsID0gMTAwOworCS8qIEZJWE1FICovCisJZGV2LT5xdWV1ZXMgPSAxOworCisJYWdueF9nZXRfbWFjX2FkZHJlc3MocHJpdik7CisKKwlTRVRfSUVFRTgwMjExX1BFUk1fQUREUihkZXYsIHByaXYtPm1hY19hZGRyKTsKKworLyogCS9cKiBGSVhNRSAqXC8gKi8KKy8qIAlmb3IgKGkgPSAxOyBpIDwgTlVNX0RSSVZFX01PREVTOyBpKyspIHsgKi8KKy8qIAkJZXJyID0gaWVlZTgwMjExX3JlZ2lzdGVyX2h3bW9kZShkZXYsICZwcml2LT5tb2Rlc1tpXSk7ICovCisvKiAJCWlmIChlcnIpIHsgKi8KKy8qIAkJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbid0IHJlZ2lzdGVyIGh3bW9kZVxuIik7ICovCisvKiAJCQlnb3RvICBlcnJfaW91bm1hcDsgKi8KKy8qIAkJfSAqLworLyogCX0gKi8KKworCXByaXYtPmNoYW5uZWwgPSAxOworCWRldi0+d2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdID0gJnByaXYtPmJhbmQ7CisKKwllcnIgPSBpZWVlODAyMTFfcmVnaXN0ZXJfaHcoZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbid0IHJlZ2lzdGVyIGhhcmR3YXJlXG4iKTsKKwkJZ290byBlcnJfaW91bm1hcDsKKwl9CisKKwlhZ254X2h3X3Jlc2V0KHByaXYpOworCisKKwlwcmludGsoUEZYICIlczogaHdhZGRyICVzLCBSZXYgMHglMDJ4XG4iLCB3aXBoeV9uYW1lKGRldi0+d2lwaHkpLAorCSAgICAgICBwcmludF9tYWMobWFjLCBkZXYtPndpcGh5LT5wZXJtX2FkZHIpLCBwcml2LT5yZXZpZCk7CisJcmV0dXJuIDA7CisKKyBlcnJfaW91bm1hcDoKKwlwY2lfaW91bm1hcChwZGV2LCBwcml2LT5kYXRhKTsKKworIGVycl9pb3VubWFwMjoKKwlwY2lfaW91bm1hcChwZGV2LCBwcml2LT5jdGwpOworCisgZXJyX2ZyZWVfZGV2OgorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlpZWVlODAyMTFfZnJlZV9odyhkZXYpOworCisgZXJyX2ZyZWVfcmVnOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcmV0dXJuIGVycjsKK30gLyogYWdueF9wY2lfcHJvYmUqLworCisjaWZkZWYgQ09ORklHX1BNCisKK3N0YXRpYyBpbnQgYWdueF9wY2lfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlBR05YX1RSQUNFOworCisJaWVlZTgwMjExX3N0b3BfcXVldWVzKGRldik7CisJYWdueF9zdG9wKGRldik7CisKKwlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZ254X3BjaV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGllZWU4MDIxMV9odyAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCUFHTlhfVFJBQ0U7CisKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EMCk7CisJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisKKwlhZ254X3N0YXJ0KGRldik7CisJaWVlZTgwMjExX3dha2VfcXVldWVzKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworI2Vsc2UKKworI2RlZmluZSBhZ254X3BjaV9zdXNwZW5kIE5VTEwKKyNkZWZpbmUgYWdueF9wY2lfcmVzdW1lIE5VTEwKKworI2VuZGlmIC8qIENPTkZJR19QTSAqLworCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhZ254X3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImFnbngtcGNpIiwKKwkuaWRfdGFibGUJPSBhZ254X3BjaV9pZF90YmwsCisJLnByb2JlCQk9IGFnbnhfcGNpX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYWdueF9wY2lfcmVtb3ZlKSwKKwkuc3VzcGVuZAk9IGFnbnhfcGNpX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBhZ254X3BjaV9yZXN1bWUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhZ254X3BjaV9pbml0KHZvaWQpCit7CisJQUdOWF9UUkFDRTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmYWdueF9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFnbnhfcGNpX2V4aXQodm9pZCkKK3sKKwlBR05YX1RSQUNFOworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYWdueF9wY2lfZHJpdmVyKTsKK30KKworCittb2R1bGVfaW5pdChhZ254X3BjaV9pbml0KTsKK21vZHVsZV9leGl0KGFnbnhfcGNpX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FnbngvcGh5LmMgYi9kcml2ZXJzL3N0YWdpbmcvYWdueC9waHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYThmMTBjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FnbngvcGh5LmMKQEAgLTAsMCArMSw5NjAgQEAKKy8qKgorICogQWlyZ28gTUlNTyB3aXJlbGVzcyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgTGkgWWFuQm8gPGRyZWFtZmx5MjgxQGdtYWlsLmNvbT4KKworICogVGhhbmtzIGZvciBKZWZmIFdpbGxpYW1zIDxhbmdlbGJhbmVAZ21haWwuY29tPiBkbyByZXZlcnNlIGVuZ2luZWVyCisgKiB3b3JrcyBhbmQgcHVibGlzaGVkIHRoZSBTUEVDUyBhdCBodHRwOi8vYWlyZ28ud2R3Y29uc3VsdGluZy5uZXQvbXltb2luCisKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSAiYWdueC5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAicGh5LmgiCisjaW5jbHVkZSAidGFibGUuaCIKKyNpbmNsdWRlICJzdGEuaCIKKyNpbmNsdWRlICJ4bWl0LmgiCisKK3U4IHJlYWRfZnJvbV9lZXByb20oc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdTE2IGFkZHJlc3MpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJc3RydWN0IGFnbnhfZWVwcm9tIGNtZDsKKwl1MzIgcmVnOworCisJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwljbWQuY21kID0gRUVQUk9NX0NNRF9SRUFEIDw8IEFHTlhfRUVQUk9NX0NPTU1BTkRfU0hJRlQ7CisJY21kLmFkZHJlc3MgPSBhZGRyZXNzOworCS8qIFZlcmlmeSB0aGF0IHRoZSBTdGF0dXMgYml0IGlzIGNsZWFyICovCisJLyogUmVhZCBDb21tYW5kIGFuZCBBZGRyZXNzIGFyZSB3cml0dGVuIHRvIHRoZSBTZXJpYWwgSW50ZXJmYWNlICovCisJaW93cml0ZTMyKCooX19sZTMyICopJmNtZCwgY3RsICsgQUdOWF9DSVJfU0VSSUFMSVRGKTsKKwkvKiBXYWl0IGZvciB0aGUgU3RhdHVzIGJpdCB0byBjbGVhciBhZ2FpbiAqLworCWVlcHJvbV9kZWxheSgpOworCS8qIFJlYWQgZnJvbSBEYXRhICovCisJcmVnID0gaW9yZWFkMzIoY3RsICsgQUdOWF9DSVJfU0VSSUFMSVRGKTsKKworCWNtZCA9ICooc3RydWN0IGFnbnhfZWVwcm9tICopJnJlZzsKKworCXJldHVybiBjbWQuZGF0YTsKK30KKworc3RhdGljIGludCBjYXJkX2Z1bGxfcmVzZXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl1MzIgcmVnOworCUFHTlhfVFJBQ0U7CisKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfQ0lSX0JMS0NUTCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfQkxLQ1RMLCAweDgwKTsKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfQ0lSX0JMS0NUTCk7CisJcmV0dXJuIDA7Cit9CisKK2lubGluZSB2b2lkIGVuYWJsZV9wb3dlcl9zYXZpbmcoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl1MzIgcmVnOworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1BNX1BNQ1RMKTsKKwlyZWcgJj0gfjB4ODsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1BNX1BNQ1RMLCByZWcpOworfQorCitpbmxpbmUgdm9pZCBkaXNhYmxlX3Bvd2VyX3NhdmluZyhzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiByZWc7CisKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfUE1fUE1DVEwpOworCXJlZyB8PSAweDg7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9QTV9QTUNUTCwgcmVnKTsKK30KKworCit2b2lkIGRpc2FibGVfcmVjZWl2ZXIoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwlBR05YX1RSQUNFOworCisJLyogRklYTUUgRGlzYWJsZSB0aGUgcmVjZWl2ZXIgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9ESVNDT1ZNT0QsIDB4MCk7CisJLyogU2V0IGdhaW4gY29udHJvbCByZXNldCAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1JTVEdDVEwsIDB4MSk7CisJLyogUmVzZXQgZ2FpbiBjb250cm9sIHJlc2V0ICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlNUR0NUTCwgMHgwKTsKK30KKworCisvKiBGaXhtZSB0aGlzIHNob3VsZSBiZSBkaXNhYmxlIFJYLCBhYm92ZSBpcyBlbmFibGUgUlggKi8KK3ZvaWQgZW5hYmxlX3JlY2VpdmVyKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJQUdOWF9UUkFDRTsKKworCS8qIFNldCBhZGFwdGl2ZSBnYWluIGNvbnRyb2wgZGlzY292ZXJ5IG1vZGUgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9ESVNDT1ZNT0QsIDB4Myk7CisJLyogU2V0IGdhaW4gY29udHJvbCByZXNldCAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1JTVEdDVEwsIDB4MSk7CisJLyogQ2xlYXIgZ2FpbiBjb250cm9sIHJlc2V0ICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlNUR0NUTCwgMHgwKTsKK30KKworc3RhdGljIHZvaWQgbWFjX2FkZHJlc3Nfc2V0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTggKm1hY19hZGRyID0gcHJpdi0+bWFjX2FkZHI7CisJdTMyIHJlZzsKKworCS8qIEZJWE1FICovCisJcmVnID0gKG1hY19hZGRyWzBdIDw8IDI0KSB8IChtYWNfYWRkclsxXSA8PCAxNikgfCBtYWNfYWRkclsyXSA8PCA4IHwgbWFjX2FkZHJbM107CisJaW93cml0ZTMyKHJlZywgY3RsICsgQUdOWF9SWE1fTUFDSEkpOworIAlyZWcgPSAobWFjX2FkZHJbNF0gPDwgOCkgfCBtYWNfYWRkcls1XTsKKwlpb3dyaXRlMzIocmVnLCBjdGwgKyBBR05YX1JYTV9NQUNMTyk7Cit9CisKK3N0YXRpYyB2b2lkIHJlY2VpdmVyX2Jzc2lkX3NldChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1OCAqYnNzaWQpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIHJlZzsKKworCWRpc2FibGVfcmVjZWl2ZXIocHJpdik7CisJLyogRklYTUUgKi8KKwlyZWcgPSBic3NpZFswXSA8PCAyNCB8IChic3NpZFsxXSA8PCAxNikgfCAoYnNzaWRbMl0gPDwgOCkgfCBic3NpZFszXTsKKwlpb3dyaXRlMzIocmVnLCBjdGwgKyBBR05YX1JYTV9CU1NJREhJKTsKKyAJcmVnID0gKGJzc2lkWzRdIDw8IDgpIHwgYnNzaWRbNV07CisJaW93cml0ZTMyKHJlZywgY3RsICsgQUdOWF9SWE1fQlNTSURMTyk7CisKKwkvKiBFbmFibGUgdGhlIHJlY2VpdmVyICovCisJZW5hYmxlX3JlY2VpdmVyKHByaXYpOworCisJLyogQ2xlYXIgdGhlIFRTRiAqLworLyogCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1RTRkxPLCAweDApOyAqLworLyogCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1RTRkhJLCAweDApOyAqLworCS8qIENsZWFyIHRoZSBUQlRUICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fVEJUVExPLCAweDApOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1RCVFRISSwgMHgwKTsKKwlkaXNhYmxlX3JlY2VpdmVyKHByaXYpOworfSAvKiByZWNlaXZlcl9ic3NpZF9zZXQgKi8KKworc3RhdGljIHZvaWQgYmFuZF9tYW5hZ2VtZW50X2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl2b2lkIF9faW9tZW0gKmRhdGEgPSBwcml2LT5kYXRhOworCXUzMiByZWc7CisJaW50IGk7CisJQUdOWF9UUkFDRTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQk1fVFhXQUREUiwgQUdOWF9QRFVfVFhfV1EpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX0FERFJXSU4sIDB4MCk7CisJbWVtc2V0X2lvKGRhdGEgKyBBR05YX1BEVVBPT0wsIDB4MCwgQUdOWF9QRFVQT09MX1NJWkUpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQk1fQk1DVEwsIDB4MjAwKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQk1fQ0lQRFVXQ05ULCAweDQwKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX1NQUERVV0NOVCwgMHgyKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX1JGUFBEVVdDTlQsIDB4MCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9CTV9SSFBQRFVXQ05ULCAweDIyKTsKKworCS8qIEZJWE1FIEluaXRpYWxpemUgdGhlIEZyZWUgUG9vbCBMaW5rZWQgTGlzdCAqLworCS8qICAgIDEuIFdyaXRlIHRoZSBBZGRyZXNzIG9mIHRoZSBOZXh0IE5vZGUgKCgweDQxODAwICsgbm9kZSpzaXplKS9zaXplKQorCSAgICAgIHRvIHRoZSBmaXJzdCB3b3JkIG9mIGVhY2ggbm9kZS4gICovCisJZm9yIChpID0gMDsgaSA8IFBEVV9GUkVFX0NOVDsgaSsrKSB7CisJCWlvd3JpdGUzMigoQUdOWF9QRFVfRlJFRSArIChpKzEpKlBEVV9TSVpFKS9QRFVfU0laRSwKKwkJCSAgZGF0YSArIEFHTlhfUERVX0ZSRUUgKyAoUERVX1NJWkUgKiBpKSk7CisJCS8qIFRoZSBsYXN0IG5vZGUgc2hvdWxkIGJlIHNldCB0byAweDAgKi8KKwkJaWYgKChpICsgMSkgPT0gUERVX0ZSRUVfQ05UKQorCQkJbWVtc2V0X2lvKGRhdGEgKyBBR05YX1BEVV9GUkVFICsgKFBEVV9TSVpFICogaSksCisJCQkJICAweDAsIFBEVV9TSVpFKTsKKwl9CisKKwkvKiBIZWFkIGlzIEZpcnN0IFBvb2wgYWRkcmVzcyAoMHg0MTgwMCkgLyBzaXplICgweDgwKSAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQk1fRlBMSFAsIEFHTlhfUERVX0ZSRUUvUERVX1NJWkUpOworCS8qIFRhaWwgaXMgTGFzdCBQb29sIEFkZHJlc3MgKDB4NDdmODApIC8gc2l6ZSAoMHg4MCkgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX0ZQTFRQLCAweDQ3ZjgwL1BEVV9TSVpFKTsKKwkvKiBDb3VudCBpcyBOdW1iZXIgb2YgTm9kZXMgaW4gdGhlIFBvb2wgKDB4ZDApICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9CTV9GUENOVCwgUERVX0ZSRUVfQ05UKTsKKworCS8qIFN0YXJ0IGFsbCB3b3JrcXVldWUgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX0NJV1FDVEwsIDB4ODAwMDApOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQk1fQ1BVTFdDVEwsIDB4ODAwMDApOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQk1fQ1BVSFdDVEwsIDB4ODAwMDApOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQk1fQ1BVVFhXQ1RMLCAweDgwMDAwKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX0NQVVJYV0NUTCwgMHg4MDAwMCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9CTV9TUFJYV0NUTCwgMHg4MDAwMCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9CTV9TUFRYV0NUTCwgMHg4MDAwMCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9CTV9SRlBXQ1RMLCAweDgwMDAwKTsKKworCS8qIEVuYWJsZSB0aGUgQmFuZCBNYW5hZ2VtZW50ICovCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0JNX0JNQ1RMKTsKKwlyZWcgfD0gMHgxOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQk1fQk1DVEwsIHJlZyk7Cit9IC8qIGJhbmRfbWFuYWdtZW50X2luaXQgKi8KKworCitzdGF0aWMgdm9pZCBzeXN0ZW1faXRmX2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl1MzIgcmVnOworCUFHTlhfVFJBQ0U7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1NZU0lURl9HUElPVVQsIDB4MCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9QTV9URVNUUEhZLCAweDExZTE0M2EpOworCisJaWYgKHByaXYtPnJldmlkID09IDApIHsKKwkJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NZU0lURl9TWVNNT0RFKTsKKwkJcmVnIHw9IDB4MTE7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1lTSVRGX1NZU01PREUsIHJlZyk7CisJfQorCS8qID8/PyBXaGF0IGlzIHRoYXQgbWVhbnM/IGl0IHNob3VsZCBkaWZmZXJlbmNlIGZvciBkaWZmZXJpY2UgdHlwZQorCSBvZiBjYXJkcyAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX1NFUklBTElURiwgMHhmZmY4MTAwNik7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1NZU0lURl9HUElPSU4sIDB4MWYwMDAwKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1NZU0lURl9HUElPVVQsIDB4NSk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NZU0lURl9HUElPSU4pOworfQorCitzdGF0aWMgdm9pZCBlbmNyeXB0aW9uX2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwlBR05YX1RSQUNFOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9FTkNSWV9XRVBLRVkwLCAweDApOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfRU5DUllfV0VQS0VZMSwgMHgwKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0VOQ1JZX1dFUEtFWTIsIDB4MCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9FTkNSWV9XRVBLRVkzLCAweDApOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfRU5DUllfQ0NNUkVDVEwsIDB4OCk7Cit9CisKK3N0YXRpYyB2b2lkIHR4X21hbmFnZW1lbnRfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXZvaWQgX19pb21lbSAqZGF0YSA9IHByaXYtPmRhdGE7CisJdTMyIHJlZzsKKwlBR05YX1RSQUNFOworCisJLyogRmlsbCBvdXQgdGhlIENvbXB1dGF0aW9uYWxFbmdpbmVMb29rdXBUYWJsZQorCSAqIHN0YXJ0aW5nIGF0IG1lbW9yeSAjMiBvZmZzZXQgMHg4MDAKKwkgKi8KKwl0eF9lbmdpbmVfbG9va3VwX3RibF9pbml0KHByaXYpOworCW1lbXNldF9pbyhkYXRhICsgMHgxMDAwLCAwLCAweGZlMCk7CisJLyogRW5hYmxlIFRyYW5zbWlzc2lvbiBNYW5hZ2VtZW50IEZ1bmN0aW9ucyAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0VUTUYsIDB4M2ZmKTsKKwkvKiBXcml0ZSAweDNmIHRvIFRyYW5zbWlzc2lvbiBUZW1wbGF0ZSAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1RYVEVNUCwgMHgzZik7CisKKwlpZiAocHJpdi0+cmV2aWQgPj0gMikKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fU0lGU1BJRlMsIDB4MWUxNDBhMGIpOworCWVsc2UKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fU0lGU1BJRlMsIDB4MWUxOTBhMGIpOworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1RYTV9USUZTRUlGUyk7CisJcmVnICY9IDB4ZmYwMDsKKwlyZWcgfD0gMHhiOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1RJRlNFSUZTLCByZWcpOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9UWE1fVElGU0VJRlMpOworCXJlZyAmPSAweGZmZmYwMGZmOworCXJlZyB8PSAweGEwMDsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9USUZTRUlGUywgcmVnKTsKKwkvKiBFbmFibGUgVElGUyAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0NUTCwgMHg0MDAwMCk7CisKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfVFhNX1RJRlNFSUZTKTsKKwlyZWcgJj0gMHhmZjAwZmZmZjsKKwlyZWcgfD0gMHg1MTAwMDA7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fVElGU0VJRlMsIHJlZyk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1RYTV9QUk9CREVMQVkpOworCXJlZyAmPSAweGZmMDBmZmZmOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1BST0JERUxBWSwgcmVnKTsKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfVFhNX1RJRlNFSUZTKTsKKwlyZWcgJj0gMHgwMGZmZmZmZjsKKwlyZWcgfD0gMHgxYzAwMDAwMDsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9USUZTRUlGUywgcmVnKTsKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfVFhNX1BST0JERUxBWSk7CisJcmVnICY9IDB4MDBmZmZmZmY7CisJcmVnIHw9IDB4MDEwMDAwMDA7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fUFJPQkRFTEFZLCByZWcpOworCisJLyogIyBTZXQgRElGIDAtMSwyLTMsNC01LDYtNyB0byBkZWZhdWx0cyAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0RJRjAxLCAweDMyMWQzMjFkKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9ESUYyMywgMHgzMjFkMzIxZCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fRElGNDUsIDB4MzIxZDMyMWQpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0RJRjY3LCAweDMyMWQzMjFkKTsKKworCS8qIE1heCBBY2sgdGltZW91dCBsaW1pdCAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX01BWEFDS1RJTSwgMHgxZTE5KTsKKwkvKiBNYXggUlggRGF0YSBUaW1lb3V0IGNvdW50LCAqLworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9UWE1fTUFYUlhUSU1FKTsKKwlyZWcgJj0gMHhmZmZmMDAwMDsKKwlyZWcgfD0gMHhmZjsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9NQVhSWFRJTUUsIHJlZyk7CisKKwkvKiBDRiBwb2xsIFJYIFRpbWVvdXQgY291bnQgKi8KKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfVFhNX0NGUE9MTFJYVElNKTsKKwlyZWcgJj0gMHhmZmZmOworCXJlZyB8PSAweGZmMDAwMDsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DRlBPTExSWFRJTSwgcmVnKTsKKworCS8qIE1heCBUaW1lb3V0IEV4Y2VlZGVkIGNvdW50LCAqLworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9UWE1fTUFYVElNT1VUKTsKKwlyZWcgJj0gMHhmZjAwZmZmZjsKKwlyZWcgfD0gMHgxOTAwMDA7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fTUFYVElNT1VULCByZWcpOworCisJLyogQ0YgYWNrIHRpbWVvdXQgbGltaXQgZm9yIDExYiAqLworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9UWE1fQ0ZBQ0tUMTFCKTsKKwlyZWcgJj0gMHhmZjAwOworCXJlZyB8PSAweDFlOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0NGQUNLVDExQiwgcmVnKTsKKworCS8qIE1heCBDRiBQb2xsIFRpbWVvdXQgQ291bnQgKi8KKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfVFhNX0NGUE9MTFJYVElNKTsKKwlyZWcgJj0gMHhmZmZmMDAwMDsKKwlyZWcgfD0gMHgxOTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DRlBPTExSWFRJTSwgcmVnKTsKKwkvKiBDRiBQb2xsIFJYIFRpbWVvdXQgQ291bnQgKi8KKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfVFhNX0NGUE9MTFJYVElNKTsKKwlyZWcgJj0gMHhmZmZmMDAwMDsKKwlyZWcgfD0gMHgxZTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DRlBPTExSWFRJTSwgcmVnKTsKKworCS8qICMgd3JpdGUgZGVmYXVsdCB0byAqLworCS8qICAgIDEuIFNjaGVkdWxlIEVtcHR5IENvdW50ICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fU0NIRU1QQ05ULCAweDUpOworCS8qICAgIDIuIENGUCBQZXJpb2QgQ291bnQgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DRlBFUkNOVCwgMHgxKTsKKwkvKiAgICAzLiBDRlAgTURWICAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0NGUE1EViwgMHgxMDAwMCk7CisKKwkvKiBQcm9iZSBEZWxheSAqLworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9UWE1fUFJPQkRFTEFZKTsKKwlyZWcgJj0gMHhmZmZmMDAwMDsKKwlyZWcgfD0gMHg0MDA7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fUFJPQkRFTEFZLCByZWcpOworCisJLyogTWF4IENDQSBjb3VudCBTbG90ICovCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1RYTV9NQVhDQ0FDTlRTTE9UKTsKKwlyZWcgJj0gMHhmZmZmMDBmZjsKKwlyZWcgfD0gMHg5MDA7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fTUFYQ0NBQ05UU0xPVCwgcmVnKTsKKworCS8qIFNsb3QgbGltaXQvMSBtc2VjIExpbWl0ICovCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1RYTV9TTE9UTElNSVQpOworCXJlZyAmPSAweGZmMDBmZmZmOworCXJlZyB8PSAweDE0MDA3NzsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9TTE9UTElNSVQsIHJlZyk7CisKKwkvKiAjIFNldCBDVyAjKDAtNykgdG8gZGVmYXVsdCAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0NXMCwgMHhmZjAwMDcpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0NXMSwgMHhmZjAwMDcpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0NXMiwgMHhmZjAwMDcpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0NXMywgMHhmZjAwMDcpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0NXNCwgMHhmZjAwMDcpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0NXNSwgMHhmZjAwMDcpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0NXNiwgMHhmZjAwMDcpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0NXNywgMHhmZjAwMDcpOworCisJLyogIyBTZXQgU2hvcnQvTG9uZyBsaW1pdCAjKDAtNykgdG8gZGVmYXVsdCAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1NMQkVBTElNMCwgIDB4YTAwMGEpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1NMQkVBTElNMSwgIDB4YTAwMGEpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1NMQkVBTElNMiwgIDB4YTAwMGEpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1NMQkVBTElNMywgIDB4YTAwMGEpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1NMQkVBTElNNCwgIDB4YTAwMGEpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1NMQkVBTElNNSwgIDB4YTAwMGEpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1NMQkVBTElNNiwgIDB4YTAwMGEpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX1NMQkVBTElNNywgIDB4YTAwMGEpOworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1RYTV9DVEwpOworCXJlZyB8PSAweDE0MDA7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fQ1RMLCByZWcpOworCS8qIFdhaXQgZm9yIGJpdCAwIGluIENvbnRyb2wgUmVnIHRvIGNsZWFyICAqLworCXVkZWxheSg4MCk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1RYTV9DVEwpOworCS8qIE9yIDB4MTgwMDAgdG8gQ29udHJvbCByZWcgKi8KKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfVFhNX0NUTCk7CisJcmVnIHw9IDB4MTgwMDA7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fQ1RMLCByZWcpOworCS8qIFdhaXQgZm9yIGJpdCAwIGluIENvbnRyb2wgUmVnIHRvIGNsZWFyICovCisJdWRlbGF5KDgwKTsKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfVFhNX0NUTCk7CisKKwkvKiBTZXQgTGlzdGVuIEludGVydmFsIENvdW50IHRvIGRlZmF1bHQgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9MSVNJTlRFUkNOVCwgMHgxKTsKKwkvKiBTZXQgRFRJTSBwZXJpb2QgY291bnQgdG8gZGVmYXVsdCAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0RUSU1QRVJJQ05ULCAweDIwMDApOworfSAvKiB0eF9tYW5hZ2VtZW50X2luaXQgKi8KKworc3RhdGljIHZvaWQgcnhfbWFuYWdlbWVudF9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJQUdOWF9UUkFDRTsKKworCS8qIEluaXRpYWxpemUgdGhlIFJvdXRpbmcgVGFibGUgKi8KKwlyb3V0aW5nX3RhYmxlX2luaXQocHJpdik7CisKKwlpZiAocHJpdi0+cmV2aWQgPj0gMykgeworCQlhZ254X3dyaXRlMzIoY3RsLCAweDIwNzQsIDB4MWYxNzE3MTApOworCQlhZ254X3dyaXRlMzIoY3RsLCAweDIwNzgsIDB4MTAxMDBkMGQpOworCQlhZ254X3dyaXRlMzIoY3RsLCAweDIwN2MsIDB4MTExMTEwMTApOworCX0KKwllbHNlCisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUlhNX0RFTEFZMTEsIDB4MCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9SWE1fUkVRUkFURSwgMHg4MTk1ZTAwKTsKK30KKworCitzdGF0aWMgdm9pZCBhZ254X3RpbWVyX2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwlBR05YX1RSQUNFOworCisvKiAJL1wqIFdyaXRlIDB4MjQ5ZjAwICh0aWNrIGR1cmF0aW9uPykgdG8gVGltZXIgMSAqXC8gKi8KKy8qIAlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RJTUNUTF9USU1FUjEsIDB4MjQ5ZjAwKTsgKi8KKy8qIAkvXCogV3JpdGUgMHhlMiB0byBUaW1lciAxIENvbnRyb2wgKlwvICovCisvKiAJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9USU1DVExfVElNMUNUTCwgMHhlMik7ICovCisKKwkvKiBXcml0ZSAweDI0OWYwMCAodGljayBkdXJhdGlvbj8pIHRvIFRpbWVyIDEgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RJTUNUTF9USU1FUjEsIDB4MCk7CisJLyogV3JpdGUgMHhlMiB0byBUaW1lciAxIENvbnRyb2wgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RJTUNUTF9USU0xQ1RMLCAweDApOworCisJaW93cml0ZTMyKDB4RkZGRkZGRkYsIHByaXYtPmN0bCArIEFHTlhfVFhNX0JFQUNPTl9DVEwpOworfQorCitzdGF0aWMgdm9pZCBwb3dlcl9tYW5hZ2VfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiByZWc7CisJQUdOWF9UUkFDRTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fTUFDTVNXLCAweDFmKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1BNX1JGQ1RMLCAweDFmKTsKKworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9QTV9QTUNUTCk7CisJcmVnICY9IDB4ZjAwZjsKKwlyZWcgfD0gMHhhMDsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1BNX1BNQ1RMLCByZWcpOworCisJaWYgKHByaXYtPnJldmlkID49IDMpIHsKKwkJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1BNX1NPRlRSU1QpOworCQlyZWcgfD0gMHgxODsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9QTV9TT0ZUUlNULCByZWcpOworCX0KK30gLyogcG93ZXJfbWFuYWdlX2luaXQgKi8KKworCitzdGF0aWMgdm9pZCBnYWluX2N0bGNudF9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIHJlZzsKKwlBR05YX1RSQUNFOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVFJBQ05UNSwgMHgxMTkpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RSQUNOVDYsIDB4MTE4KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9UUkFDTlQ3LCAweDExNyk7CisKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfUE1fUE1DVEwpOworCXJlZyB8PSAweDg7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9QTV9QTUNUTCwgcmVnKTsKKworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9QTV9QTUNUTCk7CisJcmVnICY9IH4weDg7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9QTV9QTUNUTCwgcmVnKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX0FERFJXSU4sIDB4MCk7CisKKwkvKiBGSVhNRSBXcml0ZSB0aGUgaW5pdGlhbCBTdGF0aW9uIERlc2NyaXB0b3IgZm9yIHRoZSBjYXJkICovCisJc3RhX2luaXQocHJpdiwgTE9DQUxfU1RBSUQpOworCXN0YV9pbml0KHByaXYsIEJTU0lEX1NUQUlEKTsKKworCS8qIEVuYWJsZSBzdGFpb24gMCBhbmQgMSBjYW4gZG8gVFggKi8KKwkvKiBJdCBzZWVtZWQgaWYgd2Ugc2V0IG90aGVyIGJpdCB0byAxIHRoZSBiaXQgMCB3aWxsCisJICAgYmUgYXV0byBjaGFuZ2UgdG8gMCAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQk1fVFhUT1BFRVIsIDB4MiB8IDB4MSk7CisvLwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX1RYVE9QRUVSLCAweDEpOworfSAvKiBnYWluX2N0bGNudF9pbml0ICovCisKKworc3RhdGljIHZvaWQgcGh5X2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl2b2lkIF9faW9tZW0gKmRhdGEgPSBwcml2LT5kYXRhOworCXUzMiByZWc7CisJQUdOWF9UUkFDRTsKKworCS8qIExvYWQgSW5pdGlhbEdhaW5UYWJsZSAqLworCWdhaW5fdGFibGVfaW5pdChwcml2KTsKKworICAJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfQUREUldJTiwgMHgyMDAwMDAwKTsKKworCS8qIENsZWFyIHRoZSBmb2xsb3dpbmcgb2Zmc2V0cyBpbiBNZW1vcnkgUmFuZ2UgIzI6ICovCisJbWVtc2V0X2lvKGRhdGEgKyAweDUwNDAsIDAsIDB4YSAqIDQpOworCW1lbXNldF9pbyhkYXRhICsgMHg1MDgwLCAwLCAweGEgKiA0KTsKKwltZW1zZXRfaW8oZGF0YSArIDB4NTBjMCwgMCwgMHhhICogNCk7CisJbWVtc2V0X2lvKGRhdGEgKyAweDU0MDAsIDAsIDB4ODAgKiA0KTsKKwltZW1zZXRfaW8oZGF0YSArIDB4NjAwMCwgMCwgMHgyODAgKiA0KTsKKwltZW1zZXRfaW8oZGF0YSArIDB4NzAwMCwgMCwgMHgyODAgKiA0KTsKKwltZW1zZXRfaW8oZGF0YSArIDB4ODAwMCwgMCwgMHgyODAgKiA0KTsKKworCS8qIEluaXRpYWxpemUgdGhlIEZvbGxvd2luZyBSZWdpc3RlcnMgQWNjb3JkaW5nIHRvIFBDSSBSZXZpc2lvbiBJRCAqLworCWlmIChwcml2LT5yZXZpZCA9PSAwKSB7CisJCS8qIGZpeG1lIHRoZSBwYXJ0IGhhc24ndCBiZWVuIHVwZGF0ZSBidXQgYmVsb3cgaGFzIGJlZW4gdXBkYXRlCisJCSAgIGJhc2VkIG9uIFdHTTUxMSAqLworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9MRU4sIDB4Zik7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX1RJTUVSMSwgMHgxZCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX1RJTUVSMiwgMHgzKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfQUlDQ0hBME9WRSwgMHgxMSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX0FJQ0NIQTFPVkUsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBBLCAweDY0KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhEMEFMLCAweDRiKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhEMEIsIDB4NGIpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9EVU5TQVQsIDB4MTQpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9EU0FULCAweDI0KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfREZJUkNBTCwgMHg4KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfREdDVEwxMUEsIDB4MWEpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9ER0NUTDExQiwgMHgzKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfR0FJTklOSVQsIDB4ZCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RITk9TSUcsIDB4MSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0NPQVJTVEVQLCAweDcpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9TSUZTVDExQSwgMHgyOCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1NJRlNUMTFCLCAweDI4KTsKKwkJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0dDUl9DV0RFVEVDKTsKKwkJcmVnIHw9IDB4MTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQ1dERVRFQywgcmVnKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfMFgzOCwgMHgxZSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0JPQUNULCAweDI2KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfRElTQ09WTU9ELCAweDMpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9OTElTVEFOVCwgMHgzKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfTkFDVElBTlQsIDB4Myk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05NRUFTQU5ULCAweDMpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9OQ0FQVEFOVCwgMHgzKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhDQVAxMUEsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIQ0FQMTFCLCAweDApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USENBUFJYMTFBLCAweDApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USENBUFJYMTFCLCAweDApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USExFVkRSTywgMHgxMCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX01BWFJYVElNRTExQSwgMHgxKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfTUFYUlhUSU1FMTFCLCAweDEpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9DT1JSVElNRSwgMHgxOTApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9TSUdIVEgsIDB4NzgpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9TSUdMVEgsIDB4MWMpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9DT1JSRFJPUCwgMHgwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhDRCwgMHgwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfTUFYUE9XRElGRiwgMHgxKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEVTVEJVUywgMHgwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQU5UQ0ZHLCAweDFmKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhKVU1QLCAweDE0KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhQT1dFUiwgMHgwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhQT1dDTElQLCAweDMwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhEMEJURkVTVCwgMHgzMik7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIUlgxMUJQT1dNSU4sIDB4MTkpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl8wWDE0YywgMHgwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfMFgxNTAsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4OTQwMCwgMHgwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgMHg5NDBjLCAweDZmZik7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4OTQyOCwgMHhhMCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4OTQzNCwgMHgwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgMHg5YzA0LCAweDE1KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgMHg5YzBjLCAweDdmKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgMHg5YzM0LCAweDApOworCQlhZ254X3dyaXRlMzIoY3RsLCAweGMwMDAsIDB4MzhkKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgMHgxNDAxOCwgMHgwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgMHgxNjAwMCwgMHgxKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgMHgxMTAwNCwgMHgwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgMHhlYzU0LCAweGEpOworCQlhZ254X3dyaXRlMzIoY3RsLCAweGVjMWMsIDB4NSk7CisJfSBlbHNlIGlmIChwcml2LT5yZXZpZCA+IDApIHsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfTEVOLCAweGYpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9USU1FUjEsIDB4MjEpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9USU1FUjIsIDB4MjcpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9BSUNDSEEwT1ZFLCAweDExKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfQUlDQ0hBMU9WRSwgMHgwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfRFVOU0FULCAweDE0KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfRFNBVCwgMHgyNCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RGSVJDQUwsIDB4OCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RHQ1RMMTFBLCAweDFhKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfREdDVEwxMUIsIDB4Myk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0dBSU5JTklULCAweGQpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USE5PU0lHLCAweDEpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9DT0FSU1RFUCwgMHg3KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfU0lGU1QxMUEsIDB4MjgpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9TSUZTVDExQiwgMHgyOCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0NXREVURUMsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSXzBYMzgsIDB4MWUpOworLy8JCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0JPQUNULCAweDI2KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfRElTQ09WTU9ELCAweDMpOworCisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIQ0FQMTFBLCAweDMyKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhDQVAxMUIsIDB4MzIpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USENBUFJYMTFBLCAweDMyKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhDQVBSWDExQiwgMHgzMik7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RITEVWRFJPLCAweDEwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfTUFYUlhUSU1FMTFBLCAweDFhZCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX01BWFJYVElNRTExQiwgMHhhMTApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9DT1JSVElNRSwgMHgxOTApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9DT1JSRFJPUCwgMHgwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhDRCwgMHgwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhDUywgMHgwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfTUFYUE9XRElGRiwgMHg0KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEVTVEJVUywgMHgwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhKVU1QLCAweDFlKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhQT1dFUiwgMHgwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhQT1dDTElQLCAweDJhKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhEMEJURkVTVCwgMHgzYyk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIUlgxMUJQT1dNSU4sIDB4MTkpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl8wWDE0YywgMHgwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfMFgxNTAsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1JYT1ZFUklERSwgMHgwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfV0FUQ0hET0csIDB4MzcpOworCQlhZ254X3dyaXRlMzIoY3RsLCAweDk0MDAsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4OTQwYywgMHg2ZmYpOworCQlhZ254X3dyaXRlMzIoY3RsLCAweDk0MjgsIDB4YTApOworCQlhZ254X3dyaXRlMzIoY3RsLCAweDk0MzQsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4OWMwNCwgMHgxNSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4OWMwYywgMHg3Zik7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4OWMzNCwgMHgwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgMHhjMDAwLCAweDM4ZCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4MTQwMTQsIDB4MTAwMCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4MTQwMTgsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4MTYwMDAsIDB4MSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4MTEwMDQsIDB4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4ZWM1NCwgMHhhKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgMHhlYzFjLCAweDUwKTsKKwl9IGVsc2UgaWYgKHByaXYtPnJldmlkID4gMSkgeworCQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIDB4ZWMxOCk7CisJCXJlZyB8PSAweDg7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4ZWMxOCwgcmVnKTsKKwl9CisKKwkvKiBXcml0ZSB0aGUgVFggRmlyIENvZWZmaWNpZW50IFRhYmxlICovCisJdHhfZmlyX3RhYmxlX2luaXQocHJpdik7CisKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfUE1fUE1DVEwpOworCXJlZyAmPSB+MHg4OworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fUE1DVEwsIHJlZyk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1BNX1BMTENUTCk7CisJcmVnIHw9IDB4MTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1BNX1BMTENUTCwgcmVnKTsKKworLyogCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgMHgxYTAzMCk7ICovCisvKiAJcmVnICY9IH4weDQ7ICovCisvKiAJYWdueF93cml0ZTMyKGN0bCwgMHgxYTAzMCwgcmVnKTsgKi8KKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RSQUNOVDQsIDB4MTEzKTsKK30gLyogcGh5X2luaXQgKi8KKworc3RhdGljIHZvaWQgY2hpcF9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIHJlZzsKKwlBR05YX1RSQUNFOworCisJYmFuZF9tYW5hZ2VtZW50X2luaXQocHJpdik7CisKKwlyZl9jaGlwc19pbml0KHByaXYpOworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1BNX1BNQ1RMKTsKKwlyZWcgfD0gMHg4OworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fUE1DVEwsIHJlZyk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBQSFkgKi8KKwlwaHlfaW5pdChwcml2KTsKKworCWVuY3J5cHRpb25faW5pdChwcml2KTsKKworCXR4X21hbmFnZW1lbnRfaW5pdChwcml2KTsKKworCXJ4X21hbmFnZW1lbnRfaW5pdChwcml2KTsKKworCXBvd2VyX21hbmFnZV9pbml0KHByaXYpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgVGltZXJzICovCisJYWdueF90aW1lcl9pbml0KHByaXYpOworCisJLyogV3JpdGUgMHhjMzkwYmY5IHRvIEludGVycnVwdCBNYXNrIChEaXNhYmxlIFRYKSAqLworCXJlZyA9IDB4YzM5MGJmOSAmIH5JUlFfVFhfQkVBQ09OOworCXJlZyAmPSB+SVJRX1RYX0RJU0FCTEU7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9JTlRfTUFTSywgcmVnKTsKKworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9DSVJfQkxLQ1RMKTsKKwlyZWcgfD0gMHg4MDA7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfQkxLQ1RMLCByZWcpOworCisJLyogc2V0IGl0IHdoZW4gbmVlZCBnZXQgbXVsdGljYXN0IGVuYWJsZT8gKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX01UU00sIDB4ZmYpOworfSAvKiBjaGlwX2luaXQgKi8KKworCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3Byb21pc19hbmRfbWFuYWdlZChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1lTSVRGX1NZU01PREUsIDB4MTAgfCAweDIpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1lTSVRGX1NZU01PREUsIDB4MTAgfCAweDIpOworfQorc3RhdGljIGlubGluZSB2b2lkIHNldF9sZWFybl9tb2RlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TWVNJVEZfU1lTTU9ERSwgMHg4KTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfc2Nhbl9tb2RlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TWVNJVEZfU1lTTU9ERSwgMHgyMCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3Byb21pc2N1b3VzX21vZGUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwkvKiBhZ254X3dyaXRlMzIoY3RsLCBBR05YX1NZU0lURl9TWVNNT0RFLCAweDIxMCk7Ki8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1NZU0lURl9TWVNNT0RFLCAweDEwKTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfbWFuYWdlZF9tb2RlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TWVNJVEZfU1lTTU9ERSwgMHgyKTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfYWRob2NfbW9kZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1lTSVRGX1NZU01PREUsIDB4MCk7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZCB1bmtub3dfcmVnaXN0ZXJfd3JpdGUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHgwLCAweDNlKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1VOS05PV05fQkFTRSArIDB4NCwgMHhiMik7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDgsIDB4MTQwKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1VOS05PV05fQkFTRSArIDB4YywgMHgxQzApOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHgxMCwgMHgxRkYpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHgxNCwgMHgxREQpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHgxOCwgMHgxNUYpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHgxYywgMHhBMSk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDIwLCAweDNFNyk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDI0LCAweDM2Qik7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDI4LCAweDM0OCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDJjLCAweDM3RCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDMwLCAweDNERSk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDM0LCAweDM2KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1VOS05PV05fQkFTRSArIDB4MzgsIDB4NjQpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVU5LTk9XTl9CQVNFICsgMHgzYywgMHg1Nyk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDQwLCAweDIzKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1VOS05PV05fQkFTRSArIDB4NDQsIDB4M0VEKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1VOS05PV05fQkFTRSArIDB4NDgsIDB4M0M5KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1VOS05PV05fQkFTRSArIDB4NGMsIDB4M0NBKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1VOS05PV05fQkFTRSArIDB4NTAsIDB4M0U3KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1VOS05PV05fQkFTRSArIDB4NTQsIDB4OCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9VTktOT1dOX0JBU0UgKyAweDU4LCAweDFGKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1VOS05PV05fQkFTRSArIDB4NWMsIDB4MWEpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGNhcmRfaW50ZXJmYWNlX2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl1OCBic3NpZFtFVEhfQUxFTl0gPSB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07CisJdTMyIHJlZzsKKwl1bnNpZ25lZCBpbnQgaTsKKwlBR05YX1RSQUNFOworCisJbWlnaHRfc2xlZXAoKTsKKwkvKiBDbGVhciBSWCBDb250cm9sIGFuZCBFbmFibGUgUlggcXVldWVzICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfUlhDVEwsIDB4OCk7CisKKwltaWdodF9zbGVlcCgpOworCS8qIERvIGEgZnVsbCByZXNldCBvZiB0aGUgY2FyZCAqLworCWNhcmRfZnVsbF9yZXNldChwcml2KTsKKwltaWdodF9zbGVlcCgpOworCisJLyogQ2hlY2sgYW5kIHNldCBDYXJkIEVuZGlhbm5lc3MgKi8KKwlyZWcgPSBpb3JlYWQzMihwcml2LT5jdGwgKyBBR05YX0NJUl9FTkRJQU4pOworCS8qIFRPRE8gSWYgbm90IDB4QjNCMkIxQjAgc2V0IHRvIDB4QjNCMkIxQjAgKi8KKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiQ0lSX0VORElBTiBpcyAleFxuIiwgcmVnKTsKKworCisJLyogQ29uZmlnIHRoZSBlZXByb20gKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0NJUl9TRVJJQUxJVEYsIDB4NzAwMDA4Nik7CisJdWRlbGF5KDEwKTsKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfQ0lSX1NFUklBTElURik7CisKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fU09GVFJTVCwgMHg4MDAwMDAzMyk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCAweGVjNTApOworCXJlZyB8PSAweGY7CisJYWdueF93cml0ZTMyKGN0bCwgMHhlYzUwLCByZWcpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fU09GVFJTVCwgMHgwKTsKKworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NZU0lURl9HUElPSU4pOworCXVkZWxheSgxMCk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0NJUl9TRVJJQUxJVEYpOworCisJLyogRHVtcCB0aGUgZWVwcm9tICovCisJZG8geworCQljaGFyIGVlcHJvbVsweDEwMDAwMC8weDEwMF07CisKKwkJZm9yIChpID0gMDsgaSA8IDB4MTAwMDAwOyBpICs9IDB4MTAwKSB7CisJCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0NJUl9TRVJJQUxJVEYsIDB4MzAwMDAwMCArIGkpOworCQkJdWRlbGF5KDEzKTsKKwkJCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9DSVJfU0VSSUFMSVRGKTsKKwkJCXVkZWxheSg3MCk7CisJCQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfQ0lSX1NFUklBTElURik7CisJCQllZXByb21baS8weDEwMF0gPSByZWcgJiAweEZGOworCQkJdWRlbGF5KDEwKTsKKwkJfQorCQlwcmludF9oZXhfZHVtcF9ieXRlcyhQRlggIkVFUFJPTTogIiwgRFVNUF9QUkVGSVhfTk9ORSwgZWVwcm9tLAorCQkJCSAgICAgQVJSQVlfU0laRShlZXByb20pKTsKKwl9IHdoaWxlKDApOworCisJc3BpX3JjX3dyaXRlKGN0bCwgUkZfQ0hJUDAsIDB4MjYpOworICAgICAgICByZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfU1BJX1JMU1cpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgc3lzdGVtIGludGVyZmFjZSAqLworCXN5c3RlbV9pdGZfaW5pdChwcml2KTsKKworCW1pZ2h0X3NsZWVwKCk7CisJLyogQ2hpcCBJbml0aWFsaXphdGlvbiAoUG9sYXJpcykgKi8KKwljaGlwX2luaXQocHJpdik7CisJbWlnaHRfc2xlZXAoKTsKKworCS8qIENhbGlicmF0ZSB0aGUgYW50ZW5uYWUgKi8KKwlhbnRlbm5hX2NhbGlicmF0ZShwcml2KTsKKworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgMHhlYzUwKTsKKwlyZWcgJj0gfjB4NDA7CisJYWdueF93cml0ZTMyKGN0bCwgMHhlYzUwLCByZWcpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fU09GVFJTVCwgMHgwKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1BNX1BMTENUTCwgMHgxKTsKKworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9CTV9CTUNUTCk7CisJcmVnIHw9IDB4ODAwMDsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0JNX0JNQ1RMLCByZWcpOworCWVuYWJsZV9yZWNlaXZlcihwcml2KTsKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfU1lTSVRGX1NZU01PREUpOworCXJlZyB8PSAweDIwMDsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1NZU0lURl9TWVNNT0RFLCByZWcpOworCWVuYWJsZV9yZWNlaXZlcihwcml2KTsKKworCW1pZ2h0X3NsZWVwKCk7CisJLyogSW5pdGlhbGl6ZSBHYWluIENvbnRyb2wgQ291bnRzICovCisJZ2Fpbl9jdGxjbnRfaW5pdChwcml2KTsKKworCS8qIFdyaXRlIEluaXRpYWwgU3RhdGlvbiBQb3dlciBUZW1wbGF0ZSBmb3IgdGhpcyBzdGF0aW9uKCMwKSAqLworCXN0YV9wb3dlcl9pbml0KHByaXYsIExPQ0FMX1NUQUlEKTsKKworCW1pZ2h0X3NsZWVwKCk7CisJLyogSW5pdGlhbGl6ZSB0aGUgcngsdGQsdG0gcmluZ3MsIGZvciBlYWNoIG5vZGUgaW4gdGhlIHJpbmcgKi8KKwlmaWxsX3JpbmdzKHByaXYpOworCisJbWlnaHRfc2xlZXAoKTsKKworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9QTV9TT0ZUUlNULCAweDgwMDAwMDMzKTsKKwlhZ254X3dyaXRlMzIoY3RsLCAweGVjNTAsIDB4Yyk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9QTV9TT0ZUUlNULCAweDApOworCisJLyogRklYTUUgSW5pdGlhbGl6ZSB0aGUgdHJhbnNtaXQgY29udHJvbCByZWdpc3RlciAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfVFhNX0NUTCwgMHgxOTRjMSk7CisKKwllbmFibGVfcmVjZWl2ZXIocHJpdik7CisKKwltaWdodF9zbGVlcCgpOworCS8qIEZJWE1FIFNldCB0aGUgUmVjZWl2ZSBDb250cm9sIE1hYyBBZGRyZXNzIHRvIGNhcmQgYWRkcmVzcyAqLworCW1hY19hZGRyZXNzX3NldChwcml2KTsKKwllbmFibGVfcmVjZWl2ZXIocHJpdik7CisJbWlnaHRfc2xlZXAoKTsKKworCS8qIFNldCB0aGUgcmVjaWV2ZSByZXF1ZXN0IHJhdGUgKi8KKwkvKiBGSVhNRSBFbmFibGUgdGhlIHJlcXVlc3QgKi8KKwkvKiBDaGVjayBwYWNrZXQgbGVuZ3RoICovCisJLyogU2V0IG1heGltdW0gcGFja2V0IGxlbmd0aCAqLworLyogCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUlhNX1JFUVJBVEUsIDB4ODgxOTVlMDApOyAqLworLyogCWVuYWJsZV9yZWNlaXZlcihwcml2KTsgKi8KKworCS8qIFNldCB0aGUgUmVjZWl2ZXIgQlNTSUQgKi8KKwlyZWNlaXZlcl9ic3NpZF9zZXQocHJpdiwgYnNzaWQpOworCisJLyogRklYTUUgU2V0IHRvIG1hbmFnZWQgbW9kZSAqLworCXNldF9tYW5hZ2VkX21vZGUocHJpdik7CisvLwlzZXRfcHJvbWlzY3VvdXNfbW9kZShwcml2KTsKKy8qIAlzZXRfc2Nhbl9tb2RlKHByaXYpOyAqLworLyogCXNldF9sZWFybl9tb2RlKHByaXYpOyAqLworLy8gCXNldF9wcm9taXNfYW5kX21hbmFnZWQocHJpdik7CisvLyAJc2V0X2FkaG9jX21vZGUocHJpdik7CisKKwkvKiBTZXQgdGhlIHJlY2lldmUgcmVxdWVzdCByYXRlICovCisJLyogQ2hlY2sgcGFja2V0IGxlbmd0aCAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUlhNX1JFUVJBVEUsIDB4MDgwMDAwMDApOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9SWE1fUkVRUkFURSk7CisJLyogU2V0IG1heGltdW0gcGFja2V0IGxlbmd0aCAqLworCXJlZyB8PSAweDAwMTk1ZTAwOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUlhNX1JFUVJBVEUsIHJlZyk7CisKKwkvKiBDb25maWd1cmUgdGhlIFJYIGFuZCBUWCBpbnRlcnJ1cHQgKi8KKwlyZWcgPSBFTkFCTEVfUlhfSU5URVJSVVBUIHwgUlhfQ0FDSEVfTElORSB8IEZSQUdfTEVOXzIwNDggfCBGUkFHX0JFOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX1JYQ0ZHLCByZWcpOworCS8qIEZJWE1FICovCisJcmVnID0gRU5BQkxFX1RYX0lOVEVSUlVQVCB8IFRYX0NBQ0hFX0xJTkUgfCBGUkFHX0xFTl8yMDQ4IHwgRlJBR19CRTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0NJUl9UWENGRywgcmVnKTsKKworCS8qIEVuYWJsZSBSWCBUWCBJbnRlcnJ1cHRzICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfUlhDVEwsIDB4ODApOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX1RYTUNUTCwgMHg4MCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfVFhEQ1RMLCAweDgwKTsKKworCS8qIEZJWE1FIFNldCB0aGUgbWFzdGVyIGNvbnRyb2wgaW50ZXJydXB0IGluIGJsb2NrIGNvbnRyb2wgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0NJUl9CTEtDVEwsIDB4ODAwKTsKKworCS8qIEVuYWJsZSBSWCBhbmQgVFggcXVldWVzICovCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0NJUl9SWENUTCk7CisJcmVnIHw9IDB4ODsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0NJUl9SWENUTCwgcmVnKTsKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfQ0lSX1RYTUNUTCk7CisJcmVnIHw9IDB4ODsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0NJUl9UWE1DVEwsIHJlZyk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0NJUl9UWERDVEwpOworCXJlZyB8PSAweDg7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfVFhEQ1RMLCByZWcpOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TWVNJVEZfR1BJT1VULCAweDUpOworCS8qIEZJWE1FICovCisJLyogIHVua25vd19yZWdpc3Rlcl93cml0ZShwcml2KTsgKi8KKwkvKiBVcGRhdGUgbG9jYWwgY2FyZCBoYXNoIGVudHJ5ICovCisJaGFzaF93cml0ZShwcml2LCBwcml2LT5tYWNfYWRkciwgTE9DQUxfU1RBSUQpOworCisJbWlnaHRfc2xlZXAoKTsKKworCS8qIEZJWE1FICovCisJYWdueF9zZXRfY2hhbm5lbChwcml2LCAxKTsKKwltaWdodF9zbGVlcCgpOworfSAvKiBhZ254X2NhcmRfaW50ZXJmYWNlX2luaXQgKi8KKworCit2b2lkIGFnbnhfaHdfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCUFHTlhfVFJBQ0U7CisJbWlnaHRfc2xlZXAoKTsKKwljYXJkX2ludGVyZmFjZV9pbml0KHByaXYpOworfQorCitpbnQgYWdueF9od19yZXNldChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXJldHVybiBjYXJkX2Z1bGxfcmVzZXQocHJpdik7Cit9CisKK2ludCBhZ254X3NldF9zc2lkKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHU4ICpzc2lkLCBzaXplX3Qgc3NpZF9sZW4pCit7CisJQUdOWF9UUkFDRTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBhZ254X3NldF9ic3NpZChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1OCAqYnNzaWQpCit7CisJcmVjZWl2ZXJfYnNzaWRfc2V0KHByaXYsIGJzc2lkKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hZ254L3BoeS5oIGIvZHJpdmVycy9zdGFnaW5nL2FnbngvcGh5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVlMWUyMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L3BoeS5oCkBAIC0wLDAgKzEsNDA5IEBACisjaWZuZGVmIEFHTlhfUEhZX0hfCisjZGVmaW5lIEFHTlhfUEhZX0hfCisKKyNpbmNsdWRlICJhZ254LmgiCisKKy8qIFRyYW5zbWlzc2lvbiBNYW5hZ21lbnQgUmVnaXN0ZXJzICovCisjZGVmaW5lIEFHTlhfVFhNX0JBU0UJCTB4MDAwMAorI2RlZmluZSBBR05YX1RYTV9DVEwJCTB4MDAwMAkvKiBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIEFHTlhfVFhNX0VUTUYJCTB4MDAwNCAvKiBlbmFibGUgdHJhbnNtaXNzaW9uIG1hbmFnZW1lbnQgZnVuY3Rpb25zICovCisjZGVmaW5lIEFHTlhfVFhNX1RYVEVNUAkJMHgwMDA4IC8qIHRyYW5zbWlzc2lvbiB0ZW1wbGF0ZSAqLworI2RlZmluZSBBR05YX1RYTV9SRVRSWVNUQUlECTB4MDAwYyAvKiBSZXRyeSBTdGF0aW9uIElEICovCisjZGVmaW5lIEFHTlhfVFhNX1RJTUVTVEFNUExPCQkweDAwMTAJLyogVGltZXN0YW1wIExvICovCisjZGVmaW5lIEFHTlhfVFhNX1RJTUVTVEFNUEhJCQkweDAwMTQJLyogVGltZXN0YW1wIEhpICovCisjZGVmaW5lIEFHTlhfVFhNX1RYREVMQVkJMHgwMDE4ICAvKiB0eCBkZWxheSAqLworI2RlZmluZSBBR05YX1RYTV9UQlRUTE8JCTB4MDAyMAkvKiB0YnR0IExvICovCisjZGVmaW5lIEFHTlhfVFhNX1RCVFRISQkJMHgwMDI0CS8qIHRidHQgSGkgKi8KKyNkZWZpbmUgQUdOWF9UWE1fQkVBSU5URVIJMHgwMDI4IC8qIEJlYWNvbiBJbnRlcnZhbCAqLworI2RlZmluZSBBR05YX1RYTV9OQVYJCTB4MDAzMCAvKiBOQVYgKi8KKyNkZWZpbmUgQUdOWF9UWE1fQ0ZQTURWCQkweDAwMzQgLyogQ0ZQIE1EViAqLworI2RlZmluZSBBR05YX1RYTV9DRlBFUkNOVAkweDAwMzggLyogQ0ZQIHBlcmlvZCBjb3VudCAqLworI2RlZmluZSBBR05YX1RYTV9QUk9CREVMQVkJMHgwMDNjIC8qIHByb2JlIGRlbGF5ICovCisjZGVmaW5lIEFHTlhfVFhNX0xJU0lOVEVSQ05UCTB4MDA0MCAvKiBsaXN0ZW4gaW50ZXJ2YWwgY291bnQgKi8KKyNkZWZpbmUgQUdOWF9UWE1fRFRJTVBFUklDTlQJMHgwMDRjIC8qIERUSU0gcGVyaW9kIGNvdW50ICovCisKKyNkZWZpbmUgQUdOWF9UWE1fQkVBQ09OX0NUTAkweDAwNWMgLyogYmVhY29uIGNvbnRyb2wgKi8KKworI2RlZmluZSBBR05YX1RYTV9TQ0hFTVBDTlQJMHgwMDdjIC8qIHNjaGVkdWxlIGVtcHR5IGNvdW50ICovCisjZGVmaW5lIEFHTlhfVFhNX01BWFRJTU9VVAkweDAwODQgLyogbWF4IHRpbWVvdXQgZXhjZWVkIGNvdW50ICovCisjZGVmaW5lIEFHTlhfVFhNX01BWENGUFRJTQkweDAwODggLyogbWF4IENGIHBvbGwgdGltZW91dCBjb3VudCAqLworI2RlZmluZSBBR05YX1RYTV9NQVhSWFRJTUUJMHgwMDhjIC8qIG1heCBSWCB0aW1lb3V0IGNvdW50ICovCisjZGVmaW5lIEFHTlhfVFhNX01BWEFDS1RJTQkweDAwOTAJLyogbWF4IEFDSyB0aW1lb3V0IGNvdW50ICovCisjZGVmaW5lIEFHTlhfVFhNX0RJRjAxCQkweDAwYTAgLyogRElGIDAtMSAqLworI2RlZmluZSBBR05YX1RYTV9ESUYyMwkJMHgwMGE0IC8qIERJRiAyLTMgKi8KKyNkZWZpbmUgQUdOWF9UWE1fRElGNDUJCTB4MDBhOCAvKiBESUYgNC01ICovCisjZGVmaW5lIEFHTlhfVFhNX0RJRjY3CQkweDAwYWMgLyogRElGIDYtNyAqLworI2RlZmluZSBBR05YX1RYTV9TSUZTUElGUwkweDAwYjAgLyogU0lGUy9QSUZTICovCisjZGVmaW5lIEFHTlhfVFhNX1RJRlNFSUZTCTB4MDBiNCAvKiBUSUZTL0VJRlMgKi8KKyNkZWZpbmUgQUdOWF9UWE1fTUFYQ0NBQ05UU0xPVAkweDAwYjggLyogbWF4IENDQSBjb3VudCBzbG90ICovCisjZGVmaW5lIEFHTlhfVFhNX1NMT1RMSU1JVAkweDAwYmMgLyogc2xvdCBsaW1pdC8xIG1zZWMgbGltaXQgKi8KKyNkZWZpbmUgQUdOWF9UWE1fQ0ZQT0xMUlhUSU0JMHgwMGYwIC8qIENGIHBvbGwgUlggdGltZW91dCBjb3VudCAqLworI2RlZmluZSBBR05YX1RYTV9DRkFDS1QxMUIJMHgwMGY0IC8qIENGIGFjayB0aW1lb3V0IGxpbWl0IGZvciAxMWIgKi8KKyNkZWZpbmUgQUdOWF9UWE1fQ1cwCQkweDAxMDAgLyogQ1cgMCAqLworI2RlZmluZSBBR05YX1RYTV9TTEJFQUxJTTAJMHgwMTA4IC8qIHNob3J0L2xvbmcgYmVhY29uIGxpbWl0IDAgKi8KKyNkZWZpbmUgQUdOWF9UWE1fQ1cxCQkweDAxMjAgLyogQ1cgMSAqLworI2RlZmluZSBBR05YX1RYTV9TTEJFQUxJTTEJMHgwMTI4IC8qIHNob3J0L2xvbmcgYmVhY29uIGxpbWl0IDEgKi8KKyNkZWZpbmUgQUdOWF9UWE1fQ1cyCQkweDAxNDAgLyogQ1cgMiAqLworI2RlZmluZSBBR05YX1RYTV9TTEJFQUxJTTIJMHgwMTQ4IC8qIHNob3J0L2xvbmcgYmVhY29uIGxpbWl0IDIgKi8KKyNkZWZpbmUgQUdOWF9UWE1fQ1czCQkweDAxNjAgLyogQ1cgMyAqLworI2RlZmluZSBBR05YX1RYTV9TTEJFQUxJTTMJMHgwMTY4IC8qIHNob3J0L2xvbmcgYmVhY29uIGxpbWl0IDMgKi8KKyNkZWZpbmUgQUdOWF9UWE1fQ1c0CQkweDAxODAgLyogQ1cgNCAqLworI2RlZmluZSBBR05YX1RYTV9TTEJFQUxJTTQJMHgwMTg4IC8qIHNob3J0L2xvbmcgYmVhY29uIGxpbWl0IDQgKi8KKyNkZWZpbmUgQUdOWF9UWE1fQ1c1CQkweDAxYTAgLyogQ1cgNSAqLworI2RlZmluZSBBR05YX1RYTV9TTEJFQUxJTTUJMHgwMWE4IC8qIHNob3J0L2xvbmcgYmVhY29uIGxpbWl0IDUgKi8KKyNkZWZpbmUgQUdOWF9UWE1fQ1c2CQkweDAxYzAgLyogQ1cgNiAqLworI2RlZmluZSBBR05YX1RYTV9TTEJFQUxJTTYJMHgwMWM4IC8qIHNob3J0L2xvbmcgYmVhY29uIGxpbWl0IDYgKi8KKyNkZWZpbmUgQUdOWF9UWE1fQ1c3CQkweDAxZTAgLyogQ1cgNyAqLworI2RlZmluZSBBR05YX1RYTV9TTEJFQUxJTTcJMHgwMWU4IC8qIHNob3J0L2xvbmcgYmVhY29uIGxpbWl0IDcgKi8KKyNkZWZpbmUgQUdOWF9UWE1fQkVBQ09OVEVNUCAgICAgMHgxMDAwCS8qIGJlYWNvbiB0ZW1wbGF0ZSAqLworI2RlZmluZSBBR05YX1RYTV9TVEFQT1dURU1QCTB4MWEwMCAvKiAgU3RhdGlvbiBQb3dlciBUZW1wbGF0ZSAqLworCisvKiBSZWNlaXZlIE1hbmFnZW1lbnQgQ29udHJvbCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgQUdOWF9SWE1fQkFTRQkJMHgyMDAwCisjZGVmaW5lIEFHTlhfUlhNX1JFUVJBVEUJMHgyMDAwCS8qIHJlcXVlc3RlZCByYXRlICovCisjZGVmaW5lIEFHTlhfUlhNX01BQ0hJCQkweDIwMDQJLyogZmlyc3QgNCBieXRlcyBvZiBtYWMgYWRkcmVzcyAqLworI2RlZmluZSBBR05YX1JYTV9NQUNMTwkJMHgyMDA4CS8qIGxhc3QgMiBieXRlcyBvZiBtYWMgYWRkcmVzcyAqLworI2RlZmluZSBBR05YX1JYTV9CU1NJREhJCTB4MjAwYwkvKiBic3NpZCBoaSAqLworI2RlZmluZSBBR05YX1JYTV9CU1NJRExPCTB4MjAxMAkvKiBic3NpZCBsbyAqLworI2RlZmluZSBBR05YX1JYTV9IQVNIX0NNRF9GTEFHCTB4MjAxNAkvKiBGbGFncyBmb3IgdGhlIFJYIEhhc2ggQ29tbWFuZCBEZWZhdWx0OjAgKi8KKyNkZWZpbmUgQUdOWF9SWE1fSEFTSF9DTURfSElHSAkweDIwMTgJLyogVGhlIEhpZ2ggaGFsZiBvZiB0aGUgSGFzaCBDb21tYW5kICovCisjZGVmaW5lIEFHTlhfUlhNX0hBU0hfQ01EX0xPVwkweDIwMWMJLyogVGhlIExvdyBoYWxmIG9mIHRoZSBIYXNoIENvbW1hbmQgKi8KKyNkZWZpbmUgQUdOWF9SWE1fUk9VVEFCCQkweDIwMjAJLyogcm91dGluZyB0YWJsZSAqLworI2RlZmluZQkJUk9VVEFCX1NVQlRZUEVfU0hJRlQJMjQKKyNkZWZpbmUJCVJPVVRBQl9UWVBFX1NISUZUCTI4CisjZGVmaW5lCQlST1VUQUJfU1RBVFVTX1NISUZUCTMwCisjZGVmaW5lCQlST1VUQUJfUldfU0hJRlQJCTMxCisjZGVmaW5lCQlST1VUQUJfUk9VVEVfRFJPUAkweGYwMDAwMCAvKiBEcm9wICovCisjZGVmaW5lCQlST1VUQUJfUk9VVEVfQ1BVCTB4NDAwMDAwIC8qIENQVSAqLworI2RlZmluZQkJUk9VVEFCX1JPVVRFX0VOQ1JZCTB4NTAwODAwIC8qIEVuY3J5cHRpb24gKi8KKyNkZWZpbmUJCVJPVVRBQl9ST1VURV9SRlAJMHg4MDAwMDAgLyogUkZQICovCisKKyNkZWZpbmUJCVJPVVRBQl9UWVBFX01BTkFHCTB4MCAvKiBNYW5hZ2VtZW50ICovCisjZGVmaW5lCQlST1VUQUJfVFlQRV9DVEwJCTB4MSAvKiBDb250cm9sICovCisjZGVmaW5lCQlST1VUQUJfVFlQRV9EQVRBCTB4MiAvKiBEYXRhICovCisKKyNkZWZpbmUJCVJPVVRBQl9TVUJUWVBFX0RBVEEJCTB4MAorI2RlZmluZQkJUk9VVEFCX1NVQlRZUEVfREFUQUFDSwkJMHgxCisjZGVmaW5lCQlST1VUQUJfU1VCVFlQRV9EQVRBUE9MTAkJMHgyCisjZGVmaW5lCQlST1VUQUJfU1VCVFlQRV9EQVRBUE9MTEFDSwkweDMKKyNkZWZpbmUJCVJPVVRBQl9TVUJUWVBFX05VTEwJCTB4NCAvKiBOVUxMICovCisjZGVmaW5lCQlST1VUQUJfU1VCVFlQRV9OVUxMQUNLCQkweDUKKyNkZWZpbmUJCVJPVVRBQl9TVUJUWVBFX05VTExQT0xMCQkweDYKKyNkZWZpbmUJCVJPVVRBQl9TVUJUWVBFX05VTExQT0xMQUNLCTB4NworI2RlZmluZQkJUk9VVEFCX1NVQlRZUEVfUU9TREFUQQkJMHg4IC8qIFFPUyBEQVRBICovCisjZGVmaW5lCQlST1VUQUJfU1VCVFlQRV9RT1NEQVRBQUNLCTB4OQorI2RlZmluZQkJUk9VVEFCX1NVQlRZUEVfUU9TREFUQVBPTEwJMHhhCisjZGVmaW5lCQlST1VUQUJfU1VCVFlQRV9RT1NEQVRBQUNLUE9MTAkweGIKKyNkZWZpbmUJCVJPVVRBQl9TVUJUWVBFX1FPU05VTEwJCTB4YworI2RlZmluZQkJUk9VVEFCX1NVQlRZUEVfUU9TTlVMTEFDSwkweGQKKyNkZWZpbmUJCVJPVVRBQl9TVUJUWVBFX1FPU05VTExQT0xMCTB4ZQorI2RlZmluZQkJUk9VVEFCX1NVQlRZUEVfUU9TTlVMTFBPTExBQ0sJMHhmCisjZGVmaW5lIEFHTlhfUlhNX0RFTEFZMTEJICAgMHgyMDI0CS8qIGRlbGF5IDExKEFCKSAqLworI2RlZmluZSBBR05YX1JYTV9TT0ZfQ05UCSAgIDB4MjAyOAkvKiBTT0YgQ291bnQgKi8KKyNkZWZpbmUgQUdOWF9SWE1fRlJBR19DTlQJICAgMHgyMDJjCS8qIEZyYWdtZW50IENvdW50Ki8KKyNkZWZpbmUgQUdOWF9SWE1fRkNTX0NOVAkgICAweDIwMzAJLyogRkNTIENvdW50ICovCisjZGVmaW5lIEFHTlhfUlhNX0JTU0lEX01JU1NfQ05UCSAgIDB4MjAzNAkvKiBCU1NJRCBNaXNzIENvdW50ICovCisjZGVmaW5lIEFHTlhfUlhNX1BEVV9FUlJfQ05UCSAgIDB4MjAzOAkvKiBQRFUgRXJyb3IgQ291bnQgKi8KKyNkZWZpbmUgQUdOWF9SWE1fREVTVF9NSVNTX0NOVAkgICAweDIwM0MJLyogRGVzdGluYXRpb24gTWlzcyBDb3VudCAqLworI2RlZmluZSBBR05YX1JYTV9EUk9QX0NOVAkgICAweDIwNDAJLyogRHJvcCBDb3VudCAqLworI2RlZmluZSBBR05YX1JYTV9BQk9SVF9DTlQJICAgMHgyMDQ0CS8qIEFib3J0IENvdW50ICovCisjZGVmaW5lIEFHTlhfUlhNX1JFTEFZX0NOVAkgICAweDIwNDgJLyogUmVsYXkgQ291bnQgKi8KKyNkZWZpbmUgQUdOWF9SWE1fSEFTSF9NSVNTX0NOVAkgICAweDIwNGMJLyogSGFzaCBNaXNzIENvdW50ICovCisjZGVmaW5lIEFHTlhfUlhNX1NBX0hJCQkgICAweDIwNTAJLyogQWRkcmVzcyBvZiByZWNlaXZlZCBwYWNrZXQgSGkgKi8KKyNkZWZpbmUgQUdOWF9SWE1fU0FfTE8JCSAgIDB4MjA1NAkvKiBBZGRyZXNzIG9mIHJlY2VpdmVkIHBhY2tldCBMbyAqLworI2RlZmluZSBBR05YX1JYTV9IQVNIX0RVTVBfTFNUCSAgIDB4MjEwMAkvKiBDb250YWlucyBIYXNoIERhdGEgKi8KKyNkZWZpbmUgQUdOWF9SWE1fSEFTSF9EVU1QX01TVAkgICAweDIxMDQJLyogQ29udGFpbnMgSGFzaCBEYXRhICovCisjZGVmaW5lIEFHTlhfUlhNX0hBU0hfRFVNUF9EQVRBICAgIDB4MjEwOAkvKiBUaGUgU3RhdGlvbiBJRCB0byBkdW1wICovCisKKworLyogRW5jcnlwdGlvbiBNYW5hZ21lbnQgKi8KKyNkZWZpbmUgQUdOWF9FTkNSWV9CQVNFCQkweDI0MDAKKyNkZWZpbmUgQUdOWF9FTkNSWV9XRVBLRVkwCTB4MjQ0MCAvKiB3ZXAga2V5ICMwICovCisjZGVmaW5lIEFHTlhfRU5DUllfV0VQS0VZMQkweDI0NDQgLyogd2VwIGtleSAjMSAqLworI2RlZmluZSBBR05YX0VOQ1JZX1dFUEtFWTIJMHgyNDQ4IC8qIHdlcCBrZXkgIzIgKi8KKyNkZWZpbmUgQUdOWF9FTkNSWV9XRVBLRVkzCTB4MjQ0YyAvKiB3ZXAga2V5ICMzICovCisjZGVmaW5lIEFHTlhfRU5DUllfQ0NNUkVDVEwJMHgyNDYwIC8qIGNjbSByZXBsYXkgY29udHJvbCAqLworCisKKy8qIEJhbmQgTWFuYWdlbWVudCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgQUdOWF9CTV9CQVNFCQkweDJjMDAKKyNkZWZpbmUgQUdOWF9CTV9CTUNUTAkJMHgyYzAwICAvKiBiYW5kIG1hbmFnZW1lbnQgY29udHJvbCAqLworI2RlZmluZSBBR05YX0JNX1RYV0FERFIJCTB4MmMxOCAgLyogdHggd29ya3F1ZXVlIGFkZHJlc3Mgc3RhcnQgKi8KKyNkZWZpbmUgQUdOWF9CTV9UWFRPUEVFUgkweDJjMjQJLyogdHJhbnNtaXQgdG8gcGVlcnMgKi8KKyNkZWZpbmUgQUdOWF9CTV9GUExIUAkJMHgyYzJjICAvKiBmcmVlIHBvb2wgbGlzdCBoZWFkIHBvaW50ZXIgKi8KKyNkZWZpbmUgQUdOWF9CTV9GUExUUAkJMHgyYzMwICAvKiBmcmVlIHBvb2wgbGlzdCB0YWlsIHBvaW50ZXIgKi8KKyNkZWZpbmUgQUdOWF9CTV9GUENOVAkJMHgyYzM0ICAvKiBmcmVlIHBvb2wgY291bnQgKi8KKyNkZWZpbmUgQUdOWF9CTV9DSVBEVVdDTlQJMHgyYzM4ICAvKiBjYXJkIGludGVyZmFjZSBwZHUgd29ya3F1ZXVlIGNvdW50ICovCisjZGVmaW5lIEFHTlhfQk1fU1BQRFVXQ05UCTB4MmMzYyAgLyogc3AgcGR1IHdvcmtxdWV1ZSBjb3VudCAqLworI2RlZmluZSBBR05YX0JNX1JGUFBEVVdDTlQJMHgyYzQwICAvKiByZnAgcGR1IHdvcmtxdWV1ZSBjb3VudCAqLworI2RlZmluZSBBR05YX0JNX1JIUFBEVVdDTlQJMHgyYzQ0ICAvKiByaHAgcGR1IHdvcmtxdWV1ZSBjb3VudCAqLworI2RlZmluZSBBR05YX0JNX0NJV1FDVEwJCTB4MmM0OCAvKiBDYXJkIEludGVyZmFjZSBXb3JrUXVldWUgQ29udHJvbCAqLworI2RlZmluZSBBR05YX0JNX0NQVVRYV0NUTAkweDJjNTAgIC8qIGNwdSB0eCB3b3JrcXVldWUgY29udHJvbCAqLworI2RlZmluZSBBR05YX0JNX0NQVVJYV0NUTAkweDJjNTggIC8qIGNwdSByeCB3b3JrcXVldWUgY29udHJvbCAqLworI2RlZmluZSBBR05YX0JNX0NQVUxXQ1RMCTB4MmM2MCAvKiBjcHUgbG93IHdvcmtxdWV1ZSBjb250cm9sICovCisjZGVmaW5lIEFHTlhfQk1fQ1BVSFdDVEwJMHgyYzY4IC8qIGNwdSBoaWdoIHdvcmtxdWV1ZSBjb250cm9sICovCisjZGVmaW5lIEFHTlhfQk1fU1BUWFdDVEwJMHgyYzcwIC8qIHNwIHR4IHdvcmtxdWV1ZSBjb250cm9sICovCisjZGVmaW5lIEFHTlhfQk1fU1BSWFdDVEwJMHgyYzc4IC8qIHNwIHJ4IHdvcmtxdWV1ZSBjb250cm9sICovCisjZGVmaW5lIEFHTlhfQk1fUkZQV0NUTAkJMHgyYzgwIC8qIFJGUCB3b3JrcXVldWUgY29udHJvbCAqLworI2RlZmluZSBBR05YX0JNX01UU00JCTB4MmM5MCAvKiBNdWx0aWNhc3QgVHJhbnNtaXQgU3RhdGlvbiBNYXNrICovCisKKy8qIENhcmQgSW50ZXJmYWNlIFJlZ2lzdGVycyAoMzJiaXRzKSAqLworI2RlZmluZSBBR05YX0NJUl9CQVNFCQkweDMwMDAKKyNkZWZpbmUgQUdOWF9DSVJfQkxLQ1RMCQkweDMwMDAJLyogYmxvY2sgY29udHJvbCovCisjZGVmaW5lCQlBR05YX1NUQVRfVFgJMHgxCisjZGVmaW5lCQlBR05YX1NUQVRfUlgJMHgyCisjZGVmaW5lCQlBR05YX1NUQVRfWAkweDQKKy8qIEJlbG93IHR3byBpbnRlcnJ1cHQgZmxhZ3Mgd2lsbCBiZSBzZXQgYnkgb3VyIGJ1dCBub3QgQ1BVIG9yIHRoZSBjYXJkICovCisjZGVmaW5lCQlBR05YX1NUQVRfVFhECTB4MTAKKyNkZWZpbmUJCUFHTlhfU1RBVF9UWE0JMHgyMAorCisjZGVmaW5lIEFHTlhfQ0lSX0FERFJXSU4JMHgzMDA0CS8qIEFkZHJlc3NhYmxlIFdpbmRvd3MqLworI2RlZmluZSBBR05YX0NJUl9FTkRJQU4JCTB4MzAwOCAgLyogY2FyZCBlbmRpYW5uZXNzICovCisjZGVmaW5lIEFHTlhfQ0lSX1NFUklBTElURgkweDMwMjAJLyogc2VyaWFsIGludGVyZmFjZSAqLworI2RlZmluZSBBR05YX0NJUl9SWENGRwkJMHgzMDQwCS8qIHJlY2VpdmUgY29uZmlnICovCisjZGVmaW5lCQlFTkFCTEVfUlhfSU5URVJSVVBUIDB4MjAKKyNkZWZpbmUJCVJYX0NBQ0hFX0xJTkUJICAgIDB4OAorLyogdGhlIFJYIGZyYWdtZW50IGxlbmd0aCAqLworI2RlZmluZQkJRlJBR19MRU5fMjU2CTB4MCAvKiAyNTZCICovCisjZGVmaW5lCQlGUkFHX0xFTl81MTIJMHgxCisjZGVmaW5lCQlGUkFHX0xFTl8xMDI0CTB4MgorI2RlZmluZQkJRlJBR19MRU5fMjA0OAkweDMKKyNkZWZpbmUJCUZSQUdfQkUJCTB4MTAKKyNkZWZpbmUgQUdOWF9DSVJfUlhDVEwJCTB4MzA1MAkvKiByZWNlaXZlIGNvbnRyb2wgKi8KKy8qIG1lbW9yeSBhZGRyZXNzLCBjaGlwc2lkZSAqLworI2RlZmluZSBBR05YX0NJUl9SWENNU1RBUlQJMHgzMDU0CS8qIHJlY2VpdmUgY2xpZW50IG1lbW9yeSBzdGFydCAqLworI2RlZmluZSBBR05YX0NJUl9SWENNRU5ECTB4MzA1OAkvKiByZWNlaXZlIGNsaWVudCBtZW1vcnkgZW5kICovCisvKiBtZW1vcnkgYWRkcmVzcywgcGNpICovCisjZGVmaW5lIEFHTlhfQ0lSX1JYSE9TVEFERFIJMHgzMDYwCS8qIHJlY2VpdmUgaG9zdHNpZGUgYWRkcmVzcyAqLworLyogbWVtb3J5IGFkZHJlc3MsIGNoaXBzaWRlICovCisjZGVmaW5lIEFHTlhfQ0lSX1JYQ0xJQUREUgkweDMwNjQJLyogcmVjZWl2ZSBjbGllbnRzaWRlIGFkZHJlc3MgKi8KKyNkZWZpbmUgQUdOWF9DSVJfUlhETUFDVEwJMHgzMDY4CS8qIHJlY2VpdmUgZG1hIGNvbnRyb2wgKi8KKyNkZWZpbmUgQUdOWF9DSVJfVFhDRkcJCTB4MzA4MAkvKiB0cmFuc21pdCBjb25maWcgKi8KKyNkZWZpbmUgQUdOWF9DSVJfVFhNQ1RMCQkweDMwOTAgLyogVHJhbnNtaXQgTWFuYWdlbWVudCBDb250cm9sICovCisjZGVmaW5lCQlFTkFCTEVfVFhfSU5URVJSVVBUIDB4MjAKKyNkZWZpbmUJCVRYX0NBQ0hFX0xJTkUJICAgIDB4OAorI2RlZmluZSBBR05YX0NJUl9UWE1TVEFSVAkweDMwOTQgLyogVHJhbnNtaXQgTWFuYWdlbWVudCBTdGFydCAqLworI2RlZmluZSBBR05YX0NJUl9UWE1FTkQJCTB4MzA5OCAvKiBUcmFuc21pdCBNYW5hZ2VtZW50IEVuZCAqLworI2RlZmluZSBBR05YX0NJUl9UWERDVEwJCTB4MzBhMAkvKiB0cmFuc21pdCBkYXRhIGNvbnRyb2wgKi8KKy8qIG1lbWVvcnkgYWRkcmVzcywgY2hpcHNldCAqLworI2RlZmluZSBBR05YX0NJUl9UWERTVEFSVAkweDMwYTQJLyogdHJhbnNtaXQgZGF0YSBzdGFydCAqLworI2RlZmluZSBBR05YX0NJUl9UWERFTkQJCTB4MzBhOAkvKiB0cmFuc21pdCBkYXRhIGVuZCAqLworI2RlZmluZSBBR05YX0NJUl9UWE1IQUREUgkweDMwYjAgLyogVHJhbnNtaXQgTWFuYWdlbWVudCBIb3N0c2lkZSBBZGRyZXNzICovCisjZGVmaW5lIEFHTlhfQ0lSX1RYTUNBRERSCTB4MzBiNCAvKiBUcmFuc21pdCBNYW5hZ2VtZW50IENsaWVudHNpZGUgQWRkcmVzcyAqLworI2RlZmluZSBBR05YX0NJUl9UWERNQUNUTAkweDMwYjgJLyogdHJhbnNtaXQgZG1hIGNvbnRyb2wgKi8KKworCisvKiBQb3dlciBNYW5hZ21lbnQgVW5pdCAqLworI2RlZmluZSBBR05YX1BNX0JBU0UJCTB4M2MwMAorI2RlZmluZSBBR05YX1BNX1BNQ1RMCQkweDNjMDAJLyogUE0gQ29udHJvbCovCisjZGVmaW5lIEFHTlhfUE1fTUFDTVNXCQkweDNjMDggLyogTUFDIE1hbnVhbCBTbG93IFdvcmsgRW5hYmxlICovCisjZGVmaW5lIEFHTlhfUE1fUkZDVEwJCTB4M2MwYyAvKiBSRiBDb250cm9sICovCisjZGVmaW5lIEFHTlhfUE1fUEhZTVcJCTB4M2MxNAkvKiBQaHkgTWFubmFsIFdvcmsgKi8KKyNkZWZpbmUgQUdOWF9QTV9TT0ZUUlNUCQkweDNjMTgJLyogUE1VIFNvZnQgUmVzZXQgKi8KKyNkZWZpbmUgQUdOWF9QTV9QTExDVEwJCTB4M2MxYwkvKiBQTVUgUExMIGNvbnRyb2wqLworI2RlZmluZSBBR05YX1BNX1RFU1RQSFkJCTB4M2MyNCAvKiBQTVUgVGVzdCBQaHkgKi8KKworCisvKiBJbnRlcnJ1cHQgQ29udHJvbCBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgQUdOWF9JTlRfQkFTRQkJMHg0MDAwCisjZGVmaW5lIEFHTlhfSU5UX1NUQVQJCTB4NDAwMAkvKiBpbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lIEFHTlhfSU5UX01BU0sJCTB4NDAwYwkvKiBpbnRlcnJ1cHQgbWFzayAqLworLyogRklYTUUgKi8KKyNkZWZpbmUJCUlSUV9UWF9CRUFDT04JMHgxCS8qIFRYIEJlYWNvbiAqLworI2RlZmluZQkJSVJRX1RYX1JFVFJZCTB4OAkvKiBUWCBSZXRyeSBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJCUlSUV9UWF9BQ1RJVklUWQkweDEwCS8qIFRYIEFjdGl2aXR5ICovCisjZGVmaW5lCQlJUlFfUlhfQUNUSVZJVFkJMHgyMAkvKiBSWCBBY3Rpdml0eSAqLworLyogRklYTUUgSSBndWVzcyB0aGF0IGluc3RlYWQgUlggYSBub25lIGV4aXN0IHN0YWlvbidzIHBhY2tldCBvcgorICAgdGhlIHN0YXRpb24gaGFzbid0IGJlZW4gaW5pdCAqLworI2RlZmluZQkJSVJRX1JYX1gJMHg0MAorI2RlZmluZQkJSVJRX1JYX1kJMHg4MAkvKiBSWCA/ICovCisjZGVmaW5lCQlJUlFfUlhfSEFTSEhJVAkweDEwMAkvKiBSWCBIYXNoIEhpdCAqLworI2RlZmluZQkJSVJRX1JYX0ZSQU1FCTB4MjAwCS8qIFJYIEZyYW1lICovCisjZGVmaW5lCQlJUlFfRVJSX0lOVAkweDQwMAkvKiBFcnJvciBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJCUlSUV9UWF9RVUVfRlVMTAkweDgwMAkvKiBUWCBXb3JrcXVldWUgRnVsbCAqLworI2RlZmluZQkJSVJRX0JBTkRNQU5fRVJSCTB4MTAwMDAJLyogQmFuZHdpZHRoIE1hbmFnZW1lbnQgRXJyb3IgKi8KKyNkZWZpbmUJCUlSUV9UWF9ESVNBQkxFCTB4MjAwMDAJLyogVFggRGlzYWJsZSAqLworI2RlZmluZQkJSVJRX1JYX0lWQVNFU0tFWSAweDgwMDAwIC8qIFJYIEludmFsaWQgU2Vzc2lvbiBLZXkgKi8KKyNkZWZpbmUJCUlSUV9SWF9LRVlJRE1JUwkweDEwMDAwMCAvKiBSWCBrZXkgSUQgTWlzbWF0Y2ggKi8KKyNkZWZpbmUJCUlSUV9SRVBfVEhISVQJMHgyMDAwMDAgLyogUmVwbGF5IFRocmVzaG9sZCBIaXQgKi8KKyNkZWZpbmUJCUlSUV9USU1FUjEJMHg0MDAwMDAwIC8qIFRpbWVyMSAqLworI2RlZmluZQkJSVJRX1RJTUVSX0NOVAkweDEwMDAwMDAwIC8qIFRpbWVyIENvdW50ICovCisjZGVmaW5lCQlJUlFfUEhZX0ZBU1RJTlQgMHgyMDAwMDAwMCAvKiBQaHkgRmFzdCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJCUlSUV9QSFlfU0xPV0lOVAkweDQwMDAwMDAwIC8qIFBoeSBTbG93IEludGVycnVwdCAqLworI2RlZmluZQkJSVJRX09USEVSCTB4ODAwMDAwMDAgLyogVW5rbm93IGludGVycnVwdCAqLworI2RlZmluZQkJQUdOWF9JUlFfQUxMICAgCTB4ZmZmZmZmZmYKKworLyogU3lzdGVtIEludGVyZmFjZSAqLworI2RlZmluZSBBR05YX1NZU0lURl9CQVNFCTB4NDQwMAorI2RlZmluZSBBR05YX1NZU0lURl9TWVNNT0RFCTB4NDQwMAkvKiBzeXN0ZW0gbW9kZSAqLworI2RlZmluZSBBR05YX1NZU0lURl9HUElPSU4JMHg0NDEwIC8qIEdQSU8gSW4gKi8KKy8qIFBJTiBsaW5lcyBmb3IgbGVkcz8gKi8KKyNkZWZpbmUgQUdOWF9TWVNJVEZfR1BJT1VUCTB4NDQxNAkvKiBHUElPIE91dCAqLworCisvKiBUaW1lciBDb250cm9sICovCisjZGVmaW5lIEFHTlhfVElNQ1RMX1RJTUVSMQkweDQ4MDAgLyogVGltZXIgMSAqLworI2RlZmluZSBBR05YX1RJTUNUTF9USU0xQ1RMCTB4NDgwOCAvKiBUaW1lciAxIENvbnRyb2wgKi8KKworCisvKiBBbnRlbm5hIENhbGlicmF0aW9uIEludGVyZmFjZSAqLworI2RlZmluZSBBR05YX0FDSV9CQVNFCQkweDUwMDAKKyNkZWZpbmUgQUdOWF9BQ0lfTU9ERQkJMHg1MDAwIC8qIE1vZGUgKi8KKyNkZWZpbmUgQUdOWF9BQ0lfTUVBU1VSRQkweDUwMDQgLyogTWVhc3VyZSAqLworI2RlZmluZSBBR05YX0FDSV9TRUxDSEFJTgkweDUwMDggLyogU2VsZWN0IENoYWluICovCisjZGVmaW5lIEFHTlhfQUNJX0xFTgkJMHg1MDBjIC8qIExlbmd0aCAqLworI2RlZmluZSBBR05YX0FDSV9USU1FUjEJCTB4NTAxOCAvKiBUaW1lciAxICovCisjZGVmaW5lIEFHTlhfQUNJX1RJTUVSMgkJMHg1MDFjIC8qIFRpbWVyIDIgKi8KKyNkZWZpbmUgQUdOWF9BQ0lfT0ZGU0VUCQkweDUwMjAgLyogT2Zmc2V0ICovCisjZGVmaW5lIEFHTlhfQUNJX1NUQVRVUwkJMHg1MDMwIC8qIFN0YXR1cyAqLworI2RlZmluZQkJQ0FMSV9JRExFCTB4MAorI2RlZmluZQkJQ0FMSV9ET05FCTB4MQorI2RlZmluZQkJQ0FMSV9CVVNZCTB4MgorI2RlZmluZQkJQ0FMSV9FUlIJMHgzCisjZGVmaW5lIEFHTlhfQUNJX0FJQ0NIQTBPVkUJMHg1MDM0IC8qIEFJQyBDaGFubmVsIDAgT3ZlcnJpZGUgKi8KKyNkZWZpbmUgQUdOWF9BQ0lfQUlDQ0hBMU9WRQkweDUwMzggLyogQUlDIENoYW5uZWwgMSBPdmVycmlkZSAqLworCisvKiBHYWluIENvbnRyb2wgUmVnaXN0ZXJzICovCisjZGVmaW5lIEFHTlhfR0NSX0JBU0UJCTB4OTAwMAorLyogdGhyZXNob2xkIG9mIHByaW1hcnkgYW50ZW5uYSAqLworI2RlZmluZSBBR05YX0dDUl9USEQwQQkJMHg5MDAwCS8qIHRocmVzaG9sZD8gRDAgQSAqLworLyogbG93IHRocmVzaG9sZCBvZiBwcmltYXJ5IGFudGVubmEgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfVEhEMEFMCQkweDkwMDQJLyogdGhyZXNob2xkPyBEMCBBIGxvdyAqLworLyogdGhyZXNob2xkIG9mIHNlY29uZGFyeSBhbnRlbm5hICovCisjZGVmaW5lIEFHTlhfR0NSX1RIRDBCCQkweDkwMDgJLyogdGhyZXNob2xkPyBEMF9CICovCisjZGVmaW5lIEFHTlhfR0NSX0RVTlNBVAkJMHg5MDBjIC8qIGQgdW5zYXR1cmF0ZWQgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfRFNBVAkJMHg5MDEwIC8qIGQgc2F0dXJhdGVkICovCisjZGVmaW5lIEFHTlhfR0NSX0RGSVJDQUwJMHg5MDE0IC8qIEQgRmlyL0NhbCAqLworI2RlZmluZSBBR05YX0dDUl9ER0NUTDExQQkweDkwMTggLyogZCBnYWluIGNvbnRyb2wgMTFhICovCisjZGVmaW5lIEFHTlhfR0NSX0RHQ1RMMTFCCTB4OTAxYyAvKiBkIGdhaW4gY29udHJvbCAxMWIgKi8KKy8qIHN0cmVuZ3RoIG9mIGdhaW4gKi8KKyNkZWZpbmUgQUdOWF9HQ1JfR0FJTklOSVQJMHg5MDIwCS8qIGdhaW4gaW5pdGlhbGl6YXRpb24gKi8KKyNkZWZpbmUgQUdOWF9HQ1JfVEhOT1NJRwkweDkwMjQgLyogdGhyZWhvbGQgbm8gc2lnbmFsICovCisjZGVmaW5lIEFHTlhfR0NSX0NPQVJTVEVQCTB4OTAyOCAvKiBjb2Fyc2Ugc3RlcHBpbmcgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfU0lGU1QxMUEJMHg5MDJjIC8qIHNpZnggdGltZSAxMWEgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfU0lGU1QxMUIJMHg5MDMwIC8qIHNpZnggdGltZSAxMWIgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfQ1dERVRFQwkweDkwMzQgLyogY3cgZGV0ZWN0aW9uICovCisjZGVmaW5lIEFHTlhfR0NSXzBYMzgJCTB4OTAzOCAvKiA/Pz8/ICovCisjZGVmaW5lIEFHTlhfR0NSX0JPQUNUCQkweDkwM2MJLyogQk8gQWN0aXZlICovCisjZGVmaW5lIEFHTlhfR0NSX0JPSU5BQ1QJMHg5MDQwCS8qIEJPIEluYWN0aXZlICovCisjZGVmaW5lIEFHTlhfR0NSX0JPRFlOQQkJMHg5MDQ0CS8qIEJPIGR5bmFtaWMgKi8KKy8qIDgwMi4xMSBtb2RlKGEsYixnKSAqLworI2RlZmluZSBBR05YX0dDUl9ESVNDT1ZNT0QJMHg5MDQ4CS8qIGRpc2NvdmVyeSBtb2RlICovCisjZGVmaW5lIEFHTlhfR0NSX05MSVNUQU5UCTB4OTA0YwkvKiBudW1iZXIgb2YgbGlzdGVuaW5nIGFudGVubmEgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfTkFDVElBTlQJMHg5MDUwCS8qIG51bWJlciBvZiBhY3RpdmUgYW50ZW5uYSAqLworI2RlZmluZSBBR05YX0dDUl9OTUVBU0FOVAkweDkwNTQJLyogbnVtYmVyIG9mIG1lYXN1cmluZyBhbnRlbm5hICovCisjZGVmaW5lIEFHTlhfR0NSX05DQVBUQU5UCTB4OTA1OAkvKiBudW1iZXIgb2YgY2FwdHVyZSBhbnRlbm5hICovCisjZGVmaW5lIEFHTlhfR0NSX1RIQ0FQMTFBCTB4OTA1YyAvKiB0aHJlc2hvbGQgY2FwdHVyZSAxMWEgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfVEhDQVAxMUIJMHg5MDYwIC8qIHRocmVzaG9sZCBjYXB0dXJlIDExYiAqLworI2RlZmluZSBBR05YX0dDUl9USENBUFJYMTFBCTB4OTA2NCAvKiB0aHJlc2hvbGQgY2FwdHVyZSByeCAxMWEgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfVEhDQVBSWDExQgkweDkwNjggLyogdGhyZXNob2xkIGNhcHR1cmUgcnggMTFiICovCisjZGVmaW5lIEFHTlhfR0NSX1RITEVWRFJPCTB4OTA2YyAvKiB0aHJlc2hvbGQgbGV2ZWwgZHJvcCAqLworI2RlZmluZSBBR05YX0dDUl9HQUlOU0VUMAkweDkwNzAgLyogR2FpbnNldCAwICovCisjZGVmaW5lIEFHTlhfR0NSX0dBSU5TRVQxCTB4OTA3NCAvKiBHYWluc2V0IDEgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfR0FJTlNFVDIJMHg5MDc4IC8qIEdhaW5zZXQgMiAqLworI2RlZmluZSBBR05YX0dDUl9NQVhSWFRJTUUxMUEJMHg5MDdjIC8qIG1heGltdW0gcnggdGltZSAxMWEgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfTUFYUlhUSU1FMTFCCTB4OTA4MCAvKiBtYXhpbXVtIHJ4IHRpbWUgMTFiICovCisjZGVmaW5lIEFHTlhfR0NSX0NPUlJUSU1FCTB4OTA4NCAvKiBjb3JyZWN0aW9uIHRpbWUgKi8KKy8qIHJlc2V0IHRoZSBzdWJzeXN0ZW0sIDAgPSBkaXNhYmxlLCAxID0gZW5hYmxlICovCisjZGVmaW5lIEFHTlhfR0NSX1JTVEdDVEwJMHg5MDg4CS8qIHJlc2V0IGdhaW4gY29udHJvbCAqLworLyogY2hhbm5lbCByZWNlaXZpbmcgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfUlhDSEFORUwJMHg5MDhjCS8qIHJlY2VpdmUgY2hhbm5lbCAqLworI2RlZmluZSBBR05YX0dDUl9OT0lTRTAJCTB4OTA5MCAvKiBOb2lzZSAwICovCisjZGVmaW5lIEFHTlhfR0NSX05PSVNFMQkJMHg5MDk0IC8qIE5vaXNlIDEgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfTk9JU0UyCQkweDkwOTggLyogTm9pc2UgMiAqLworI2RlZmluZSBBR05YX0dDUl9TSUdIVEgJCTB4OTA5YwkvKiBTaWduYWwgSGlnaCBUaHJlc2hvbGQgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfU0lHTFRICQkweDkwYTAJLyogU2lnbmFsIExvdyBUaHJlc2hvbGQgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfQ09SUkRST1AJMHg5MGE0IC8qIGNvcnJlY3Rpb24gZHJvcCAqLworLyogdGhyZXNob2xkIG9mIHRlcnRpYXkgYW50ZW5uYSAqLworI2RlZmluZSBBR05YX0dDUl9USENECQkweDkwYTgJLyogdGhyZXNob2xkPyBDRCAqLworI2RlZmluZSBBR05YX0dDUl9USENTCQkweDkwYWMJLyogdGhyZXNob2xkPyBDUyAqLworI2RlZmluZSBBR05YX0dDUl9NQVhQT1dESUZGCTB4OTBiOCAvKiBtYXhpbXVtIHBvd2VyIGRpZmZlcmVuY2UgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfVFJBQ05UNAkweDkwZWMgLyogVHJhbnNpdGlvbiBDb3VudCA0ICovCisjZGVmaW5lIEFHTlhfR0NSX1RSQUNOVDUgICAgICAJMHg5MGYwCS8qIHRyYW5zaXRpb24gY291bnQgNSAqLworI2RlZmluZSBBR05YX0dDUl9UUkFDTlQ2ICAgICAgIAkweDkwZjQJLyogdHJhbnNpdGlvbiBjb3VudCA2ICovCisjZGVmaW5lIEFHTlhfR0NSX1RSQUNOVDcgICAgICAgCTB4OTBmOAkvKiB0cmFuc2l0aW9uIGNvdXRuIDcgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfVEVTVEJVUwkweDkxMWMgLyogdGVzdCBidXMgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfQ0hBSU5OVU0JMHg5MTIwIC8qIE51bWJlciBvZiBDaGFpbnMgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfQU5UQ0ZHCQkweDkxMjQJLyogQW50ZW5uYSBDb25maWcgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfVEhKVU1QCQkweDkxMmMgLyogdGhyZWhvbGQganVtcCAqLworI2RlZmluZSBBR05YX0dDUl9USFBPV0VSCTB4OTEzMCAvKiB0aHJlc2hvbGQgcG93ZXIgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfVEhQT1dDTElQCTB4OTEzNCAvKiB0aHJlc2hvbGQgcG93ZXIgY2xpcCovCisjZGVmaW5lIEFHTlhfR0NSX0ZPUkNFQ1RMQ0xLCTB4OTEzOCAvKiBGb3JjZSBHYWluIENvbnRyb2wgQ2xvY2sgKi8KKyNkZWZpbmUgQUdOWF9HQ1JfR0FJTlNFVFdSSVRFCTB4OTEzYyAvKiBHYWluc2V0IFdyaXRlICovCisjZGVmaW5lIEFHTlhfR0NSX1RIRDBCVEZFU1QJMHg5MTQwCS8qIHRocmVzaG9sZCBkMCBiIHRmIGVzdGltYXRlICovCisjZGVmaW5lIEFHTlhfR0NSX1RIUlgxMUJQT1dNSU4JMHg5MTQ0CS8qIHRocmVzaG9sZCByeCAxMWIgcG93ZXIgbWluaW11bSAqLworI2RlZmluZSBBR05YX0dDUl8wWDE0YwkJMHg5MTRjIC8qID8/ICovCisjZGVmaW5lIEFHTlhfR0NSXzBYMTUwCQkweDkxNTAgLyogPz8gKi8KKyNkZWZpbmUgQUdOWF9HQ1JfUlhPVkVSSURFCTB4OTE5NAkvKiByZWNpZXZlIG92ZXJyaWRlICovCisjZGVmaW5lIEFHTlhfR0NSX1dBVENIRE9HCTB4OTFiMAkvKiB3YXRjaGRvZyB0aW1lb3V0ICovCisKKworLyogU3BpIEludGVyZmFjZSAqLworI2RlZmluZSBBR05YX1NQSV9CQVNFCQkweGRjMDAKKyNkZWZpbmUgQUdOWF9TUElfQ0ZHCQkweGRjMDAgLyogc3BpIGNvbmZpZ3VyYXRpb24gKi8KKy8qIE9ubHkgYWNjZXB0IDE2IGJpdHMgKi8KKyNkZWZpbmUgQUdOWF9TUElfV01TVwkJMHhkYzA0CS8qIHdyaXRlIG1vc3Qgc2lnbmlmaWNhbnQgd29yZCAqLworLyogT25seSBhY2NlcHQgMTYgYml0cyAqLworI2RlZmluZSBBR05YX1NQSV9XTFNXCQkweGRjMDgJLyogd3JpdGUgbGVhc3Qgc2lnbmlmaWNhbnQgd29yZCAqLworI2RlZmluZSBBR05YX1NQSV9DVEwJCTB4ZGMwYwkvKiBzcGkgY29udHJvbCAqLworI2RlZmluZSBBR05YX1NQSV9STVNXCQkweGRjMTAgLyogcmVhZCBtb3N0IHNpZ25pZmljYW50IHdvcmQgKi8KKyNkZWZpbmUgQUdOWF9TUElfUkxTVwkJMHhkYzE0IC8qIHJlYWQgbGVhc3Qgc2lnbmlmaWNhbnQgd29yZCAqLworLyogU1BJIENvbnRyb2wgTWFzayAqLworI2RlZmluZQkJU1BJX1JFQURfQ1RMCQkweDQwMDAgLyogcmVhZCBjb250cm9sICovCisjZGVmaW5lCQlTUElfQlVTWV9DVEwJCTB4ODAwMCAvKiBidXN5IGNvbnRyb2wgKi8KKy8qIFJGIGFuZCBzeW50aCBjaGlwcyBpbiBzcGkgKi8KKyNkZWZpbmUJCVJGX0NISVAwCTB4NDAwCisjZGVmaW5lCQlSRl9DSElQMQkweDgwMAorI2RlZmluZQkJUkZfQ0hJUDIJMHgxMDAwCisjZGVmaW5lCQlTWU5USF9DSElQCTB4MjAwMAorCisvKiBVbmtub3duIHJlZ2lzdGVyICovCisjZGVmaW5lIEFHTlhfVU5LTk9XTl9CQVNFCTB4NzgwMAorCisvKiBGSVhNRSBNb25pdG9yR2FpbiAqLworI2RlZmluZSBBR05YX01PTkdDUl9CQVNFCTB4MTIwMDAKKworLyogR2FpbiBUYWJsZSAqLworI2RlZmluZSBBR05YX0dBSU5fVEFCTEUJCTB4MTI0MDAKKworLyogVGhlIGluaXRpYWwgRklSIGNvZWZmaWNpZW50IHRhYmxlICovCisjZGVmaW5lIEFHTlhfRklSX0JBU0UJCTB4MTk4MDQKKworI2RlZmluZSBBR05YX0VOR0lORV9MT09LVVBfVEJMCTB4ODAwCisKKy8qIGVlcHJvbSBjb21tYW5kcyAqLworI2RlZmluZSBFRVBST01fQ01EX05VTEwJCTB4MCAvKiBOVUxMICovCisjZGVmaW5lIEVFUFJPTV9DTURfV1JJVEUJMHgyIC8qIHdyaXRlICovCisjZGVmaW5lIEVFUFJPTV9DTURfUkVBRAkJMHgzIC8qIHJlYWQgKi8KKyNkZWZpbmUgRUVQUk9NX0NNRF9TVEFUVVNSRUFECTB4NSAvKiBzdGF0dXMgcmVnaXN0ZXIgcmVhZCAqLworI2RlZmluZSBFRVBST01fQ01EX1dSSVRFRU5BQkxFCTB4NiAvKiB3cml0ZSBlbmFibGUgKi8KKyNkZWZpbmUgRUVQUk9NX0NNRF9DT05GSUdVUkUJMHg3IC8qIGNvbmZpZ3VyZSAqLworCisjZGVmaW5lIEVFUFJPTV9EQVRBRk9SQ09GSUdVUkUJMHg2IC8qID8/PyAqLworCisvKiBlZXByb20gYWRkcmVzcyAqLworI2RlZmluZSBFRVBST01fQUREUl9TVUJWSUQJMHgwIC8qIFN1YiBWZW5kb3IgSUQgKi8KKyNkZWZpbmUgRUVQUk9NX0FERFJfU1VCU0lECTB4MiAvKiBTdWIgU3lzdGVtIElEICovCisjZGVmaW5lIEVFUFJPTV9BRERSX01BQ0FERFIJMHgxNDYgLyogTUFDIEFkZHJlc3MgKi8KKyNkZWZpbmUgRUVQUk9NX0FERFJfTE9UWVBFCTB4MTRmIC8qIExPIHR5cGUgKi8KKworc3RydWN0IGFnbnhfZWVwcm9tIHsKKwl1OCBkYXRhOwkvKiBkYXRlICovCisJdTE2IGFkZHJlc3M7CS8qIGFkZHJlc3MgaW4gRUVQUk9NICovCisJdTggY21kOwkJLyogY29tbWFuZCwgdW5rbm93biwgc3RhdHVzICovCit9ICBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKyNkZWZpbmUgQUdOWF9FRVBST01fQ09NTUFORF9TSElGVAk1CisjZGVmaW5lIEFHTlhfRUVQUk9NX0NPTU1BTkRfU1RBVAkweDAxCisKK3ZvaWQgZGlzYWJsZV9yZWNlaXZlcihzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK3ZvaWQgZW5hYmxlX3JlY2VpdmVyKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpOwordTggcmVhZF9mcm9tX2VlcHJvbShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1MTYgYWRkcmVzcyk7Cit2b2lkIGFnbnhfaHdfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK2ludCBhZ254X2h3X3Jlc2V0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpOworaW50IGFnbnhfc2V0X3NzaWQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdTggKnNzaWQsIHNpemVfdCBzc2lkX2xlbik7Cit2b2lkIGFnbnhfc2V0X2Jzc2lkKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHU4ICpic3NpZCk7Cit2b2lkIGVuYWJsZV9wb3dlcl9zYXZpbmcoc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7Cit2b2lkIGRpc2FibGVfcG93ZXJfc2F2aW5nKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpOwordm9pZCBjYWxpYnJhdGVfYW50ZW5uYV9wZXJpb2QodW5zaWduZWQgbG9uZyBkYXRhKTsKKworI2VuZGlmIC8qIEFHTlhfUEhZX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWdueC9yZi5jIGIvZHJpdmVycy9zdGFnaW5nL2FnbngvcmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mjk0YjZlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FnbngvcmYuYwpAQCAtMCwwICsxLDg5NCBAQAorLyoqCisgKiBBaXJnbyBNSU1PIHdpcmVsZXNzIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNyBMaSBZYW5CbyA8ZHJlYW1mbHkyODFAZ21haWwuY29tPgorCisgKiBUaGFua3MgZm9yIEplZmYgV2lsbGlhbXMgPGFuZ2VsYmFuZUBnbWFpbC5jb20+IGRvIHJldmVyc2UgZW5naW5lZXIKKyAqIHdvcmtzIGFuZCBwdWJsaXNoZWQgdGhlIFNQRUNTIGF0IGh0dHA6Ly9haXJnby53ZHdjb25zdWx0aW5nLm5ldC9teW1vaW4KKworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKKyAqLworCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlICJhZ254LmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJwaHkuaCIKKyNpbmNsdWRlICJ0YWJsZS5oIgorCisvKiBGSVhNRSEgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzcGlfd3JpdGUodm9pZCBfX2lvbWVtICpyZWdpb24sIHUzMiBjaGlwX2lkcywgdTMyIHN3LAorCQkgICAgICB1MTYgc2l6ZSwgdTMyIGNvbnRyb2wpCit7CisJdTMyIHJlZzsKKwl1MzIgbHN3ID0gc3cgJiAweGZmZmY7CQkvKiBsb3dlciAxNiBiaXRzIG9mIHN3Ki8KKwl1MzIgbXN3ID0gc3cgPj4gMTY7CQkvKiBoaWdoIDE2IGJpdHMgb2Ygc3cgKi8KKworCS8qIEZJWE1FIFdyaXRlIE1vc3QgU2lnbmlmaWNhbnQgV29yZCBvZiB0aGUgMzJiaXQgZGF0YSB0byBNU1cgKi8KKwkvKiBGSVhNRSBBbmQgTGVhc3QgU2lnbmlmaWNhbnQgV29yZCB0byBMU1cgKi8KKwlpb3dyaXRlMzIoKGxzdyksIHJlZ2lvbiArIEFHTlhfU1BJX1dMU1cpOworCWlvd3JpdGUzMigobXN3KSwgcmVnaW9uICsgQUdOWF9TUElfV01TVyk7CisJcmVnID0gY2hpcF9pZHMgfCBzaXplIHwgY29udHJvbDsKKwkvKiBXcml0ZSBjaGlwIGlkKHMpLCB3cml0ZSBzaXplIGFuZCBidXN5IGNvbnRyb2wgdG8gQ29udHJvbCBSZWdpc3RlciAqLworCWlvd3JpdGUzMigocmVnKSwgcmVnaW9uICsgQUdOWF9TUElfQ1RMKTsKKwkvKiBXYWl0IGZvciBCdXN5IGNvbnRyb2wgdG8gY2xlYXIgKi8KKwlzcGlfZGVsYXkoKTsKK30KKworLyoKKyAqIFdyaXRlIHRvIFNQSSBTeW50aCByZWdpc3RlcgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc3BpX3N5X3dyaXRlKHZvaWQgX19pb21lbSAqcmVnaW9uLCB1MzIgY2hpcF9pZHMsIHUzMiBzdykKK3sKKwkvKiBGSVhNRSB0aGUgc2l6ZSAweDE1IGlzIGEgbWFnaWMgdmFsdWUqLworCXNwaV93cml0ZShyZWdpb24sIGNoaXBfaWRzLCBzdywgMHgxNSwgU1BJX0JVU1lfQ1RMKTsKK30KKworLyoKKyAqIFdyaXRlIHRvIFNQSSBSRiByZWdpc3RlcgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc3BpX3JmX3dyaXRlKHZvaWQgX19pb21lbSAqcmVnaW9uLCB1MzIgY2hpcF9pZHMsIHUzMiBzdykKK3sKKwkvKiBGSVhNRSB0aGUgc2l6ZSAweGQgaXMgYSBtYWdpYyB2YWx1ZSovCisJc3BpX3dyaXRlKHJlZ2lvbiwgY2hpcF9pZHMsIHN3LCAweGQsIFNQSV9CVVNZX0NUTCk7Cit9IC8qIHNwaV9yZl93cml0ZSAqLworCisvKgorICogV3JpdGUgdG8gU1BJIHdpdGggUmVhZCBDb250cm9sIGJpdCBzZXQKKyAqLworaW5saW5lIHZvaWQgc3BpX3JjX3dyaXRlKHZvaWQgX19pb21lbSAqcmVnaW9uLCB1MzIgY2hpcF9pZHMsIHUzMiBzdykKK3sKKwkvKiBGSVhNRSB0aGUgc2l6ZSAweGU1IGlzIGEgbWFnaWMgdmFsdWUgKi8KKwlzcGlfd3JpdGUocmVnaW9uLCBjaGlwX2lkcywgc3csIDB4ZTUsIFNQSV9CVVNZX0NUTHxTUElfUkVBRF9DVEwpOworfQorCisvKiBHZXQgdGhlIGFjdGl2ZSBjaGFpbnMncyBjb3VudCAqLworc3RhdGljIGludCBnZXRfYWN0aXZlX2NoYWlucyhzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCWludCBudW0gPSAwOworCXUzMiByZWc7CisJQUdOWF9UUkFDRTsKKworCXNwaV9yY193cml0ZShjdGwsIFJGX0NISVAwLCAweDIxKTsKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfU1BJX1JMU1cpOworCWlmIChyZWcgPT0gMSkKKwkJbnVtKys7CisKKwlzcGlfcmNfd3JpdGUoY3RsLCBSRl9DSElQMSwgMHgyMSk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NQSV9STFNXKTsKKwlpZiAocmVnID09IDEpCisJCW51bSsrOworCisJc3BpX3JjX3dyaXRlKGN0bCwgUkZfQ0hJUDIsIDB4MjEpOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9TUElfUkxTVyk7CisJaWYgKHJlZyA9PSAxKQorCQludW0rKzsKKworCXNwaV9yY193cml0ZShjdGwsIFJGX0NISVAwLCAweDI2KTsKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfU1BJX1JMU1cpOworCWlmICgweDMzICE9IHJlZykKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIlVubWF0Y2hlZCByZiBjaGlwcyByZXN1bHRcbiIpOworCisJcmV0dXJuIG51bTsKK30gLyogZ2V0X2FjdGl2ZV9jaGFpbnMgKi8KKwordm9pZCByZl9jaGlwc19pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIHJlZzsKKwlpbnQgbnVtOworCUFHTlhfVFJBQ0U7CisKKwlpZiAocHJpdi0+cmV2aWQgPT0gMSkgeworCQlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfU1lTSVRGX0dQSU9VVCk7CisJCXJlZyB8PSAweDg7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1lTSVRGX0dQSU9VVCwgcmVnKTsKKwl9CisKKwkvKiBTZXQgU1BJIGNsb2NrIHNwZWVkIHRvIDIwME5TICovCisgICAgICAgIHJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9TUElfQ0ZHKTsKKyAgICAgICAgcmVnICY9IH4weEY7CisgICAgICAgIHJlZyB8PSAweDM7CisgICAgICAgIGFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1BJX0NGRywgcmVnKTsKKworICAgICAgICAvKiBTZXQgU1BJIGNsb2NrIHNwZWVkIHRvIDUwTlMgKi8KKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfU1BJX0NGRyk7CisJcmVnICY9IH4weEY7CisJcmVnIHw9IDB4MTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1NQSV9DRkcsIHJlZyk7CisKKwlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMXxSRl9DSElQMiwgMHgxMTAxKTsKKworCW51bSA9IGdldF9hY3RpdmVfY2hhaW5zKHByaXYpOworCXByaW50ayhLRVJOX0lORk8gUEZYICJBY3RpdmUgY2hhaW5zIGFyZSAlZFxuIiwgbnVtKTsKKworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9TUElfQ0ZHKTsKKwlyZWcgJj0gfjB4RjsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1NQSV9DRkcsIHJlZyk7CisKKwlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMXxSRl9DSElQMiwgMHgxOTA4KTsKK30gLyogcmZfY2hpcHNfaW5pdCAqLworCisKK3N0YXRpYyB1MzIgY2hhbm5lbF90YmxbMTVdWzldID0geworCXswLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCisJezEsICAweDAwLCAweDAwLCAweDYyNCwgMHgwMCwgMHgxYTQsIDB4MjgsIDB4MDAsIDB4MWV9LAorCXsyLCAgMHgwMCwgMHgwMCwgMHg2MTUsIDB4MDAsIDB4MWFlLCAweDI4LCAweDAwLCAweDFlfSwKKwl7MywgIDB4MDAsIDB4MDAsIDB4NjFhLCAweDAwLCAweDFhZSwgMHgyOCwgMHgwMCwgMHgxZX0sCisJezQsICAweDAwLCAweDAwLCAweDYxZiwgMHgwMCwgMHgxYWUsIDB4MjgsIDB4MDAsIDB4MWV9LAorCXs1LCAgMHgwMCwgMHgwMCwgMHg2MjQsIDB4MDAsIDB4MWFlLCAweDI4LCAweDAwLCAweDFlfSwKKwl7NiwgIDB4MDAsIDB4MDAsIDB4NjFmLCAweDAwLCAweDFiMywgMHgyOCwgMHgwMCwgMHgxZX0sCisJezcsICAweDAwLCAweDAwLCAweDYyNCwgMHgwMCwgMHgxYjMsIDB4MjgsIDB4MDAsIDB4MWV9LAorCXs4LCAgMHgwMCwgMHgwMCwgMHg2MjksIDB4MDAsIDB4MWIzLCAweDI4LCAweDAwLCAweDFlfSwKKwl7OSwgIDB4MDAsIDB4MDAsIDB4NjI0LCAweDAwLCAweDFiOCwgMHgyOCwgMHgwMCwgMHgxZX0sCisJezEwLCAweDAwLCAweDAwLCAweDYyOSwgMHgwMCwgMHgxYjgsIDB4MjgsIDB4MDAsIDB4MWV9LAorCXsxMSwgMHgwMCwgMHgwMCwgMHg2MmUsIDB4MDAsIDB4MWI4LCAweDI4LCAweDAwLCAweDFlfSwKKwl7MTIsIDB4MDAsIDB4MDAsIDB4NjMzLCAweDAwLCAweDFiOCwgMHgyOCwgMHgwMCwgMHgxZX0sCisJezEzLCAweDAwLCAweDAwLCAweDYyOCwgMHgwMCwgMHgxYjgsIDB4MjgsIDB4MDAsIDB4MWV9LAorCXsxNCwgMHgwMCwgMHgwMCwgMHg2NDQsIDB4MDAsIDB4MWI4LCAweDI4LCAweDAwLCAweDFlfSwKK307CisKKworc3RhdGljIGlubGluZSB2b2lkCitjaGFubmVsX3RibF93cml0ZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50IHJlZ19udW0pCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIHJlZzsKKworCXJlZyA9IGNoYW5uZWxfdGJsW2NoYW5uZWxdW3JlZ19udW1dOworCXJlZyA8PD0gNDsKKwlyZWcgfD0gcmVnX251bTsKKwlzcGlfc3lfd3JpdGUoY3RsLCBTWU5USF9DSElQLCByZWcpOworfQorCitzdGF0aWMgdm9pZCBzeW50aF9mcmVxX3NldChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl1MzIgcmVnOworCUFHTlhfVFJBQ0U7CisKKwlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMSwgMHgxMjAxKTsKKworCS8qIFNldCB0aGUgQ2xvY2sgYml0cyB0byA1ME5TICovCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NQSV9DRkcpOworCXJlZyAmPSB+MHhGOworCXJlZyB8PSAweDE7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TUElfQ0ZHLCByZWcpOworCisJLyogV3JpdGUgMHgwMGMwIHRvIExTVyBhbmQgMHgzIHRvIE1TVyBvZiBTeW50aCBDaGlwICovCisJc3BpX3N5X3dyaXRlKGN0bCwgU1lOVEhfQ0hJUCwgMHgzMDBjMCk7CisKKwlzcGlfc3lfd3JpdGUoY3RsLCBTWU5USF9DSElQLCAweDMyKTsKKworCS8qICMgV3JpdGUgdG8gUmVnaXN0ZXIgMSBvbiB0aGUgU3ludGggQ2hpcCAqLworCWNoYW5uZWxfdGJsX3dyaXRlKHByaXYsIGNoYW5uZWwsIDEpOworCS8qICMgV3JpdGUgdG8gUmVnaXN0ZXIgMyBvbiB0aGUgU3ludGggQ2hpcCAqLworCWNoYW5uZWxfdGJsX3dyaXRlKHByaXYsIGNoYW5uZWwsIDMpOworCS8qICMgV3JpdGUgdG8gUmVnaXN0ZXIgNiBvbiB0aGUgU3ludGggQ2hpcCAqLworCWNoYW5uZWxfdGJsX3dyaXRlKHByaXYsIGNoYW5uZWwsIDYpOworCS8qICMgV3JpdGUgdG8gUmVnaXN0ZXIgNSBvbiB0aGUgU3ludGggQ2hpcCAqLworCWNoYW5uZWxfdGJsX3dyaXRlKHByaXYsIGNoYW5uZWwsIDUpOworCS8qICMgV3JpdGUgdG8gcmVnaXN0ZXIgOCBvbiB0aGUgU3ludGggQ2hpcCAqLworCWNoYW5uZWxfdGJsX3dyaXRlKHByaXYsIGNoYW5uZWwsIDgpOworCisJLyogRklYTUUgQ2xlYXIgdGhlIGNsb2NrIGJpdHMgKi8KKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfU1BJX0NGRyk7CisJcmVnICY9IH4weGY7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TUElfQ0ZHLCByZWcpOworfSAvKiBzeW50aF9jaGlwX2luaXQgKi8KKworCitzdGF0aWMgdm9pZCBhbnRlbm5hX2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgaW50IG51bV9hbnRlbm5hKQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCisJc3dpdGNoIChudW1fYW50ZW5uYSkgeworCWNhc2UgMToKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfTkxJU1RBTlQsIDEpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9OTUVBU0FOVCwgMSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05BQ1RJQU5ULCAxKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfTkNBUFRBTlQsIDEpOworCisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0FOVENGRywgNyk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0JPQUNULCAzNCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0JPSU5BQ1QsIDM0KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQk9EWU5BLCAzMCk7CisKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhEMEEsIDEyNSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBBTCwgMTAwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhEMEIsIDkwKTsKKworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEQwQlRGRVNULCA4MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1NJR0hUSCwgMTAwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfU0lHTFRILCAxNik7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfTkxJU1RBTlQsIDIpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9OTUVBU0FOVCwgMik7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05BQ1RJQU5ULCAyKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfTkNBUFRBTlQsIDIpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9BTlRDRkcsIDE1KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQk9BQ1QsIDM2KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQk9JTkFDVCwgMzYpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9CT0RZTkEsIDMyKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhEMEEsIDEyMCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBBTCwgMTAwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhEMEIsIDgwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfVEhEMEJURkVTVCwgNzApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9TSUdIVEgsIDEwMCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1NJR0xUSCwgMzIpOworCQlicmVhazsKKwljYXNlIDM6CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05MSVNUQU5ULCAzKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfTk1FQVNBTlQsIDMpOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9OQUNUSUFOVCwgMyk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX05DQVBUQU5ULCAzKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQU5UQ0ZHLCAzMSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0JPQUNULCAzNik7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0JPSU5BQ1QsIDM2KTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQk9EWU5BLCAzMik7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBBLCAxMDApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEQwQUwsIDEwMCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBCLCA3MCk7CisJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBCVEZFU1QsIDcwKTsKKwkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfU0lHSFRILCAxMDApOworCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9TSUdMVEgsIDQ4KTsKKy8vCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9TSUdMVEgsIDE2KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIlVua25vdyBhbnRlbm5hIG51bWJlclxuIik7CisJfQorfSAvKiBhbnRlbm5hX2luaXQgKi8KKworc3RhdGljIHZvaWQgY2hhaW5fdXBkYXRlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHUzMiBjaGFpbikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl1MzIgcmVnOworCUFHTlhfVFJBQ0U7CisKKwlzcGlfcmNfd3JpdGUoY3RsLCBSRl9DSElQMCwgMHgyMCk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NQSV9STFNXKTsKKworCWlmIChyZWcgPT0gMHg0KQorCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMSwgcmVnfDB4MTAwMCk7CisJZWxzZSBpZiAocmVnICE9IDB4MCkKKyAgICAgCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMXxSRl9DSElQMiwgcmVnfDB4MTAwMCk7CisgICAgICAgIGVsc2UgeworCQlpZiAoY2hhaW4gPT0gMyB8fCBjaGFpbiA9PSA2KSB7CisJCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMXxSRl9DSElQMiwgcmVnfDB4MTAwMCk7CisJCQlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9SWE9WRVJJREUsIDB4MCk7CisJCX0gZWxzZSBpZiAoY2hhaW4gPT0gMiB8fCBjaGFpbiA9PSA0KSB7CisJCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMSwgcmVnfDB4MTAwMCk7CisJCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMiwgMHgxMDA1KTsKKwkJCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1JYT1ZFUklERSwgMHg4MjQpOworCQl9IGVsc2UgaWYgKGNoYWluID09IDEpIHsKKwkJCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwLCByZWd8MHgxMDAwKTsKKwkJCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAxfFJGX0NISVAyLCAweDEwMDQpOworCQkJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlhPVkVSSURFLCAweGMzNik7CisJCX0KKwl9CisKKwlzcGlfcmNfd3JpdGUoY3RsLCBSRl9DSElQMCwgMHgyMik7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NQSV9STFNXKTsKKworCXN3aXRjaCAocmVnKSB7CisJY2FzZSAwOgorCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMXxSRl9DSElQMiwgMHgxMDA1KTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMSwgMHgxMjAxKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlpZiAoY2hhaW4gPT0gNiB8fCBjaGFpbiA9PSA0KSB7CisJCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMSwgMHgxMjAyKTsKKwkJCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAyLCAweDEwMDUpOworCQl9IGVsc2UgaWYgKGNoYWluIDwgMykgeworCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDAsIDB4MTIwMik7CisJCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMXxSRl9DSElQMiwgMHgxMDA1KTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAoY2hhaW4gPT0gMykgeworCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDEsIDB4MTIwMyk7CisJCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMiwgMHgxMjAxKTsKKwkJfSBlbHNlIGlmIChjaGFpbiA9PSAyKSB7CisJCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMCwgMHgxMjAzKTsKKwkJCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAyLCAweDEyMDApOworCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDEsIDB4MTIwMSk7CisJCX0gZWxzZSBpZiAoY2hhaW4gPT0gMSkgeworCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDAsIDB4MTIwMyk7CisJCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMXxSRl9DSElQMiwgMHgxMjAwKTsKKwkJfSBlbHNlIGlmIChjaGFpbiA9PSA0KSB7CisJCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMSwgMHgxMjAzKTsKKwkJCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAyLCAweDEyMDEpOworCQl9IGVsc2UgeworCQkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDAsIDB4MTIwMyk7CisJCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMXxSRl9DSElQMiwgMHgxMjAxKTsKKwkJfQorCX0KK30gLyogY2hhaW5fdXBkYXRlICovCisKK3N0YXRpYyB2b2lkIGFudGVubmFfY29uZmlnKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIHJlZzsKKwlBR05YX1RSQUNFOworCisJLyogV3JpdGUgMHgwIHRvIHRoZSBUWCBNYW5hZ2VtZW50IENvbnRyb2wgUmVnaXN0ZXIgRW5hYmxlIGJpdCAqLworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9UWE1fQ1RMKTsKKwlyZWcgJj0gfjB4MTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1RYTV9DVEwsIHJlZyk7CisKKwkvKiBGSVhNRSAqLworCS8qIFNldCBpbml0aWFsIHZhbHVlIGJhc2VkIG9uIG51bWJlciBvZiBBbnRlbm5hZSAqLworCWFudGVubmFfaW5pdChwcml2LCAzKTsKKworCS8qIEZJWE1FIFVwZGF0ZSBQb3dlciBUZW1wbGF0ZXMgZm9yIGN1cnJlbnQgdmFsaWQgU3RhdGlvbnMgKi8KKwkvKiBzdGFfcG93ZXJfaW5pdChwcml2LCAwKTsqLworCisJLyogRklYTUUgdGhlIG51bWJlciBvZiBjaGFpbnMgc2hvdWxkIGdldCBmcm9tIGVlcHJvbSovCisJY2hhaW5fdXBkYXRlKHByaXYsIEFHTlhfQ0hBSU5TX01BWCk7Cit9IC8qIGFudGVubmFfY29uZmlnICovCisKK3ZvaWQgY2FsaWJyYXRlX29zY2lsbGF0b3Ioc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl1MzIgcmVnOworCUFHTlhfVFJBQ0U7CisKKwlzcGlfcmNfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMSwgMHgxMjAxKTsKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVQxKTsKKwlyZWcgfD0gMHgxMDsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUMSwgcmVnKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVRXUklURSwgMSk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlNUR0NUTCwgMSk7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9MRU4sIDB4M2ZmKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX1RJTUVSMSwgMHgyNyk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfVElNRVIyLCAweDI3KTsKKwkvKiAoUmVzaWR1YWwgREMgQ2FsaWJyYXRpb24pIHRvIENhbGlicmF0aW9uIE1vZGUgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9NT0RFLCAweDIpOworCisJc3BpX3JjX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDEsIDB4MTAwNCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfTEVOLCAweDNmZik7CisJLyogKFRYIExPIENhbGlicmF0aW9uKSB0byBDYWxpYnJhdGlvbiBNb2RlICovCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfTU9ERSwgMHg0KTsKKworCWRvIHsKKwkJdTMyICByZWcxLCByZWcyLCByZWczOworCQkvKiBFbmFibGUgUG93ZXIgU2F2aW5nIENvbnRyb2wgKi8KKwkJZW5hYmxlX3Bvd2VyX3NhdmluZyhwcml2KTsKKwkJLyogU2F2ZSB0aGUgZm9sbG93aW5nIHJlZ2lzdGVycyB0byByZXN0b3JlICovCisJCXJlZzEgPSBpb3JlYWQzMihjdGwgKyAweDExMDAwKTsKKwkJcmVnMiA9IGlvcmVhZDMyKGN0bCArIDB4ZWM1MCk7CisJCXJlZzMgPSBpb3JlYWQzMihjdGwgKyAweGVjNTQpOworCQl3bWIoKTsKKworCQlhZ254X3dyaXRlMzIoY3RsLCAweDExMDAwLCAweGNmZGYpOworCQlhZ254X3dyaXRlMzIoY3RsLCAweGVjNTAsIDB4NzApOworCQkvKiBSZXN0b3JlIHRoZSByZWdpc3RlcnMgKi8KKwkJYWdueF93cml0ZTMyKGN0bCwgMHgxMTAwMCwgcmVnMSk7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4ZWM1MCwgcmVnMik7CisJCWFnbnhfd3JpdGUzMihjdGwsIDB4ZWM1NCwgcmVnMyk7CisJCS8qIERpc2FibGUgUG93ZXIgU2F2aW5nIENvbnRyb2wgKi8KKwkJZGlzYWJsZV9wb3dlcl9zYXZpbmcocHJpdik7CisJfSB3aGlsZSAoMCk7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9SU1RHQ1RMLCAwKTsKK30gLyogY2FsaWJyYXRlX29zY2lsbGF0b3IgKi8KKworCitzdGF0aWMgdm9pZCByYWRpb19jaGFubmVsX3NldChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl1bnNpZ25lZCBpbnQgZnJlcSA9IHByaXYtPmJhbmQuY2hhbm5lbHNbY2hhbm5lbCAtIDFdLmNlbnRlcl9mcmVxOworCXUzMiByZWc7CisJQUdOWF9UUkFDRTsKKworCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxLCAweDEyMDEpOworCS8qIFNldCBTUEkgQ2xvY2sgdG8gNTAgTnMgKi8KKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfU1BJX0NGRyk7CisJcmVnICY9IH4weEY7CisJcmVnIHw9IDB4MTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX1NQSV9DRkcsIHJlZyk7CisKKwkvKiBDbGVhciB0aGUgRGlzYWJsZSBUeCBpbnRlcnJ1cHQgYml0IGluIEludGVycnVwdCBNYXNrICovCisvKiAJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0lOVF9NQVNLKTsgKi8KKy8qIAlyZWcgJj0gfklSUV9UWF9ESVNBQkxFOyAqLworLyogCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfSU5UX01BU0ssIHJlZyk7ICovCisKKwkvKiBCYW5kIFNlbGVjdGlvbiAqLworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9TWVNJVEZfR1BJT1VUKTsKKwlyZWcgfD0gMHg4OworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfU1lTSVRGX0dQSU9VVCwgcmVnKTsKKworCS8qIEZJWE1FIFNldCB0aGUgU2lMYWJzIENoaXAgRnJlcXVlbmN5ICovCisJc3ludGhfZnJlcV9zZXQocHJpdiwgY2hhbm5lbCk7CisKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfUE1fU09GVFJTVCk7CisJcmVnIHw9IDB4ODAxMDAwMzA7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9QTV9TT0ZUUlNULCByZWcpOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9QTV9QTExDVEwpOworCXJlZyB8PSAweDIwMDA5OworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUE1fUExMQ1RMLCByZWcpOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TWVNJVEZfR1BJT1VULCAweDUpOworCisJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDF8UkZfQ0hJUDIsIDB4MTEwMCk7CisKKwkvKiBMb2FkIHRoZSBNb25pdG9yR2FpbiBUYWJsZSAqLworCW1vbml0b3JfZ2Fpbl90YWJsZV9pbml0KHByaXYpOworCisJLyogTG9hZCB0aGUgVFggRmlyIHRhYmxlICovCisJdHhfZmlyX3RhYmxlX2luaXQocHJpdik7CisKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfUE1fUE1DVEwpOworCXJlZyB8PSAweDg7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9QTV9QTUNUTCwgcmVnKTsKKworCXNwaV9yY193cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxLCAweDIyKTsKKwl1ZGVsYXkoODApOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9TUElfUkxTVyk7CisKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1JYT1ZFUklERSwgMHhmZik7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfRElTQ09WTU9ELCAweDMpOworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCAweGVjNTApOworCXJlZyB8PSAweDRmOworCWFnbnhfd3JpdGUzMihjdGwsIDB4ZWM1MCwgcmVnKTsKKworCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxLCAweDEyMDEpOworCWFnbnhfd3JpdGUzMihjdGwsIDB4MTEwMDgsIDB4MSk7CisJYWdueF93cml0ZTMyKGN0bCwgMHgxMTAwYywgMHgwKTsKKwlhZ254X3dyaXRlMzIoY3RsLCAweDExMDA4LCAweDApOworCWFnbnhfd3JpdGUzMihjdGwsIDB4ZWM1MCwgMHhjKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RJU0NPVk1PRCwgMHgzKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9SWE9WRVJJREUsIDB4MCk7CisJYWdueF93cml0ZTMyKGN0bCwgMHgxMTAxMCwgMHg2ZSk7CisJYWdueF93cml0ZTMyKGN0bCwgMHgxMTAxNCwgMHg2Yyk7CisKKwlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMSwgMHgxMjAxKTsKKworCS8qIENhbGlicmF0ZSB0aGUgQW50ZW5uYSAqLworCS8qIGFudGVubmFfY2FsaWJyYXRlKHByaXYpOyAqLworCS8qIENhbGlicmF0ZSB0aGUgVHhMb2NhbE9zY2lsbGF0b3IgKi8KKwljYWxpYnJhdGVfb3NjaWxsYXRvcihwcml2KTsKKworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9QTV9QTUNUTCk7CisJcmVnICY9IH4weDg7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9QTV9QTUNUTCwgcmVnKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9HQUlOSU5JVCwgMHhhKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USENELCAweDApOworCisJYWdueF93cml0ZTMyKGN0bCwgMHgxMTAxOCwgMHhiKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9ESVNDT1ZNT0QsIDB4MCk7CisKKwkvKiBXcml0ZSBGcmVxdWVuY3kgdG8gR2FpbiBDb250cm9sIENoYW5uZWwgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9SWENIQU5FTCwgZnJlcSk7CisJLyogV3JpdGUgMHgxNDAwMDAvRnJlcSB0byAweDljMDggKi8KKwlyZWcgPSAweDE0MDAwMC9mcmVxOworCWFnbnhfd3JpdGUzMihjdGwsIDB4OWMwOCwgcmVnKTsKKworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9QTV9TT0ZUUlNUKTsKKwlyZWcgJj0gfjB4ODAxMDAwMzA7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9QTV9TT0ZUUlNULCByZWcpOworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1BNX1BMTENUTCk7CisJcmVnICY9IH4weDIwMDA5OworCXJlZyB8PSAweDE7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9QTV9QTExDVEwsIHJlZyk7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9NT0RFLCAweDApOworCisvKiBGSVhNRSBBY2NvcmRpbmcgdG8gTnVtYmVyIG9mIENoYWluczogKi8KKworLyogCQkJICAgMS4gMTogKi8KKy8qICAgICAgICAgIDEuIFdyaXRlIDB4MTIwMyB0byBSRiBDaGlwIDAgKi8KKy8qICAgICAgICAgIDIuIFdyaXRlIDB4MTIwMCB0byBSRiBDaGlwcyAxICsyICAqLworLyogCQkJICAgMi4gMjogKi8KKy8qICAgICAgICAgIDEuIFdyaXRlIDB4MTIwMyB0byBSRiBDaGlwIDAgKi8KKy8qICAgICAgICAgIDIuIFdyaXRlIDB4MTIwMCB0byBSRiBDaGlwIDIgKi8KKy8qICAgICAgICAgIDMuIFdyaXRlIDB4MTIwMSB0byBSRiBDaGlwIDEgICovCisvKiAJCQkgICAzLiAzOiAqLworLyogICAgICAgICAgMS4gV3JpdGUgMHgxMjAzIHRvIFJGIENoaXAgMCAqLworLyogICAgICAgICAgMi4gV3JpdGUgMHgxMjAxIHRvIFJGIENoaXAgMSArIDIgICovCisvKiAJCQkgICA0LiA0OiAqLworLyogICAgICAgICAgMS4gV3JpdGUgMHgxMjAzIHRvIFJGIENoaXAgMCArIDEgKi8KKy8qICAgICAgICAgIDIuIFdyaXRlIDB4MTIwMCB0byBSRiBDaGlwIDIgICovCisKKy8qIAkJCSAgIDUuIDY6ICovCisJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDEsIDB4MTIwMyk7CisJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDIsIDB4MTIwMSk7CisKKwlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMXxSRl9DSElQMiwgMHgxMDAwKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9SWE9WRVJJREUsIDB4MCk7CisKKwkvKiBGSVhNRSBTZXQgdGhlIERpc2FibGUgVHggaW50ZXJydXB0IGJpdCBpbiBJbnRlcnJ1cHQgTWFzaworCSAgIChPciAweDIwMDAwIHRvIEludGVycnVwdCBNYXNrKSAqLworLyogCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9JTlRfTUFTSyk7ICovCisvKiAJcmVnIHw9IElSUV9UWF9ESVNBQkxFOyAqLworLyogCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfSU5UX01BU0ssIHJlZyk7ICovCisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9SU1RHQ1RMLCAweDEpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1JTVEdDVEwsIDB4MCk7CisKKwkvKiBDb25maWd1cmUgdGhlIEFudGVubmEgKi8KKwlhbnRlbm5hX2NvbmZpZyhwcml2KTsKKworCS8qIFdyaXRlIDB4MCB0byBEaXNjb3ZlcnkgTW9kZSBFbmFibGUgZGV0ZWN0IEcsIEIsIEEgcGFja2V0PyAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0RJU0NPVk1PRCwgMCk7CisKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfUlhNX1JFUVJBVEUpOworCXJlZyB8PSAweDgwMDAwMDAwOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfUlhNX1JFUVJBVEUsIHJlZyk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlNUR0NUTCwgMHgxKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9SU1RHQ1RMLCAweDApOworCisJLyogZW5hYmxlIHJhZGlvIG9uIGFuZCB0aGUgcG93ZXIgTEVEICovCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1NZU0lURl9HUElPVVQpOworCXJlZyAmPSB+MHgxOworCXJlZyB8PSAweDI7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9TWVNJVEZfR1BJT1VULCByZWcpOworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX1RYTV9DVEwpOworCXJlZyB8PSAweDE7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9UWE1fQ1RMLCByZWcpOworfSAvKiByYWRpb19jaGFubmVsX3NldCAqLworCitzdGF0aWMgdm9pZCBiYXNlX2JhbmRfZmlsdGVyX2NhbGlicmF0ZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCisJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDF8UkZfQ0hJUDIsIDB4MTcwMCk7CisJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDF8UkZfQ0hJUDIsIDB4MTAwMSk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfRk9SQ0VDVExDTEssIDB4MCk7CisJc3BpX3JjX3dyaXRlKGN0bCwgUkZfQ0hJUDAsIDB4MjcpOworCXNwaV9yY193cml0ZShjdGwsIFJGX0NISVAxLCAweDI3KTsKKwlzcGlfcmNfd3JpdGUoY3RsLCBSRl9DSElQMiwgMHgyNyk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfRk9SQ0VDVExDTEssIDB4MSk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X29mZnNldChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1MzIgY2hhaW4pCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIG9mZnNldDsKKworCWlvd3JpdGUzMigoY2hhaW4pLCBjdGwgKyBBR05YX0FDSV9TRUxDSEFJTik7CisJdWRlbGF5KDEwKTsKKwlvZmZzZXQgPSAoaW9yZWFkMzIoY3RsICsgQUdOWF9BQ0lfT0ZGU0VUKSk7CisJcHJpbnRrKFBGWCAiQ2hhaW4gaXMgMHgleCwgT2Zmc2V0IGlzIDB4JXhcbiIsIGNoYWluLCBvZmZzZXQpOworfQorCit2b2lkIHByaW50X29mZnNldHMoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwlwcmludF9vZmZzZXQocHJpdiwgMCk7CisJcHJpbnRfb2Zmc2V0KHByaXYsIDQpOworCXByaW50X29mZnNldChwcml2LCAxKTsKKwlwcmludF9vZmZzZXQocHJpdiwgNSk7CisJcHJpbnRfb2Zmc2V0KHByaXYsIDIpOworCXByaW50X29mZnNldChwcml2LCA2KTsKK30KKworCitzdHJ1Y3QgY2hhaW5zIHsKKwl1MzIgY2FsaTsJCS8qIGNhbGlicmF0ZSAgdmFsdWUqLworCisjZGVmaW5lICBORUVEX0NBTElCUkFURQkJMAorI2RlZmluZSAgU1VDQ0VTU19DQUxJQlJBVEUJMQorCWludCBzdGF0dXM7Cit9OworCitzdGF0aWMgdm9pZCBjaGFpbl9jYWxpYnJhdGUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgc3RydWN0IGNoYWlucyAqY2hhaW5zLAorCQkJICAgIHVuc2lnbmVkIGludCBudW0pCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIGNhbGlicmEgPSBjaGFpbnNbbnVtXS5jYWxpOworCisJaWYgKG51bSA8IDMpCisJCWNhbGlicmEgfD0gMHgxNDAwOworCWVsc2UKKwkJY2FsaWJyYSB8PSAweDE1MDA7CisKKwlzd2l0Y2ggKG51bSkgeworCWNhc2UgMDoKKwljYXNlIDQ6CisJCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwLCBjYWxpYnJhKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCWNhc2UgNToKKwkJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDEsIGNhbGlicmEpOworCQlicmVhazsKKwljYXNlIDI6CisJY2FzZSA2OgorCQlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMiwgY2FsaWJyYSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KK30gLyogY2hhaW5fY2FsaWJyYXRlICovCisKKworc3RhdGljIHZvaWQgaW5saW5lIGdldF9jYWxpYnJldGVfdmFsdWUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgc3RydWN0IGNoYWlucyAqY2hhaW5zLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbnVtKQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiBvZmZzZXQ7CisKKwlpb3dyaXRlMzIoKG51bSksIGN0bCArIEFHTlhfQUNJX1NFTENIQUlOKTsKKwkvKiBGSVhNRSAqLworCXVkZWxheSgxMCk7CisJb2Zmc2V0ID0gKGlvcmVhZDMyKGN0bCArIEFHTlhfQUNJX09GRlNFVCkpOworCisJaWYgKG9mZnNldCA8IDB4ZikgeworCQljaGFpbnNbbnVtXS5zdGF0dXMgPSBTVUNDRVNTX0NBTElCUkFURTsKKwkJcmV0dXJuOworCX0KKworCWlmIChudW0gPT0gMCB8fCBudW0gPT0gMSB8fCBudW0gPT0gMikgeworCQlpZiAoIDAgPT0gY2hhaW5zW251bV0uY2FsaSkKKwkJCWNoYWluc1tudW1dLmNhbGkgPSAweGZmOworCQllbHNlCisJCQljaGFpbnNbbnVtXS5jYWxpLS07CisJfSBlbHNlCisJCWNoYWluc1tudW1dLmNhbGkrKzsKKworCWNoYWluc1tudW1dLnN0YXR1cyA9IE5FRURfQ0FMSUJSQVRFOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2FsaWJyYV9kZWxheShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiByZWc7CisJdW5zaWduZWQgaW50IGkgPSAxMDA7CisKKwl3bWIoKTsKKwl3aGlsZSAoaS0tKSB7CisJCXJlZyA9IChpb3JlYWQzMihjdGwgKyBBR05YX0FDSV9TVEFUVVMpKTsKKwkJaWYgKHJlZyA9PSAweDQwMDApCisJCQlicmVhazsKKwkJdWRlbGF5KDEwKTsKKwl9CisJaWYgKCFpKQorCQlwcmludGsoUEZYICJjYWxpYnJhdGlvbiBmYWlsZWRcbiIpOworfQorCit2b2lkIGRvX2NhbGlicmF0aW9uKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJc3RydWN0IGNoYWlucyBjaGFpbnNbN107CisJdW5zaWduZWQgaW50IGksIGo7CisJQUdOWF9UUkFDRTsKKworCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKwkJaWYgKGkgPT0gMykKKwkJCWNvbnRpbnVlOworCisJCWNoYWluc1tpXS5jYWxpID0gMHg3ZjsKKwkJY2hhaW5zW2ldLnN0YXR1cyA9IE5FRURfQ0FMSUJSQVRFOworCX0KKworCS8qIEZJWE1FIDB4MzAwIGlzIGEgbWFnaWMgbnVtYmVyICovCisJZm9yIChqID0gMDsgaiA8IDB4MzAwOyBqKyspIHsKKwkJaWYgKGNoYWluc1swXS5zdGF0dXMgPT0gU1VDQ0VTU19DQUxJQlJBVEUgJiYKKwkJICAgIGNoYWluc1sxXS5zdGF0dXMgPT0gU1VDQ0VTU19DQUxJQlJBVEUgJiYKKwkJICAgIGNoYWluc1syXS5zdGF0dXMgPT0gU1VDQ0VTU19DQUxJQlJBVEUgJiYKKwkJICAgIGNoYWluc1s0XS5zdGF0dXMgPT0gU1VDQ0VTU19DQUxJQlJBVEUgJiYKKwkJICAgIGNoYWluc1s1XS5zdGF0dXMgPT0gU1VDQ0VTU19DQUxJQlJBVEUgJiYKKwkJICAgIGNoYWluc1s2XS5zdGF0dXMgPT0gU1VDQ0VTU19DQUxJQlJBVEUpCisJCQlicmVhazsKKworCQkvKiBBdHRlbnRpb24sIHRoZXJlIGlzIG5vIGNoYWluIDMgKi8KKwkJZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworCQkJaWYgKGkgPT0gMykKKwkJCQljb250aW51ZTsKKwkJCWlmIChjaGFpbnNbaV0uc3RhdHVzID09IE5FRURfQ0FMSUJSQVRFKQorCQkJCWNoYWluX2NhbGlicmF0ZShwcml2LCBjaGFpbnMsIGkpOworCQl9CisJCS8qIFdyaXRlIDB4MSB0byBDYWxpYnJhdGlvbiBNZWFzdXJlICovCisJCWlvd3JpdGUzMigoMHgxKSwgY3RsICsgQUdOWF9BQ0lfTUVBU1VSRSk7CisJCWNhbGlicmFfZGVsYXkocHJpdik7CisKKwkJZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworCQkJaWYgKGkgPT0gMykKKwkJCQljb250aW51ZTsKKworCQkJZ2V0X2NhbGlicmV0ZV92YWx1ZShwcml2LCBjaGFpbnMsIGkpOworCQl9CisJfQorCXByaW50ayhQRlggIkNsaWJyYXRlIHRpbWVzIGlzICVkXG4iLCBqKTsKKwlwcmludF9vZmZzZXRzKHByaXYpOworfSAvKiBkb19jYWxpYnJhdGlvbiAqLworCit2b2lkIGFudGVubmFfY2FsaWJyYXRlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIHJlZzsKKwlBR05YX1RSQUNFOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfTkxJU1RBTlQsIDB4Myk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfTk1FQVNBTlQsIDB4Myk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfTkFDVElBTlQsIDB4Myk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfTkNBUFRBTlQsIDB4Myk7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9BTlRDRkcsIDB4MWYpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0JPQUNULCAweDI0KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9CT0lOQUNULCAweDI0KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9CT0RZTkEsIDB4MjApOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBBLCAweDY0KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEQwQUwsIDB4NjQpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1RIRDBCLCAweDQ2KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9USEQwQlRGRVNULCAweDNjKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9TSUdIVEgsIDB4NjQpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1NJR0xUSCwgMHgzMCk7CisKKwlzcGlfcmNfd3JpdGUoY3RsLCBSRl9DSElQMCwgMHgyMCk7CisJLyogRml4bWUgKi8KKwl1ZGVsYXkoODApOworCS8qICAgIDEuIFNob3VsZCByZWFkIDB4MCAgKi8KKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfU1BJX1JMU1cpOworCWlmICgweDAgIT0gcmVnKQorCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiVW5tYXRjaGVkIHJmIGNoaXBzIHJlc3VsdFxuIik7CisJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDF8UkZfQ0hJUDIsIDB4MTAwMCk7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9SWE9WRVJJREUsIDB4MCk7CisKKwlzcGlfcmNfd3JpdGUoY3RsLCBSRl9DSElQMCwgMHgyMik7CisJdWRlbGF5KDgwKTsKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfU1BJX1JMU1cpOworCWlmICgweDAgIT0gcmVnKQorCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiVW5tYXRjaGVkIHJmIGNoaXBzIHJlc3VsdFxuIik7CisJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDF8UkZfQ0hJUDIsIDB4MTAwNSk7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9SU1RHQ1RMLCAweDEpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX1JTVEdDVEwsIDB4MCk7CisKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfUE1fU09GVFJTVCk7CisJcmVnIHw9IDB4MWMwMDAwMzI7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9QTV9TT0ZUUlNULCByZWcpOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9QTV9QTExDVEwpOworCXJlZyB8PSAweDAwMDNmMDc7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9QTV9QTExDVEwsIHJlZyk7CisKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIDB4ZWM1MCk7CisJcmVnIHw9IDB4NDA7CisJYWdueF93cml0ZTMyKGN0bCwgMHhlYzUwLCByZWcpOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlhPVkVSSURFLCAweGZmOCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfRElTQ09WTU9ELCAweDMpOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfQ0hBSU5OVU0sIDB4Nik7CisJYWdueF93cml0ZTMyKGN0bCwgMHgxOTg3NCwgMHgwKTsKKwlzcGlfcmZfd3JpdGUoY3RsLCBSRl9DSElQMHxSRl9DSElQMXxSRl9DSElQMiwgMHgxNzAwKTsKKworCS8qIENhbGlicmF0ZSB0aGUgQmFzZUJhbmRGaWx0ZXIgKi8KKwliYXNlX2JhbmRfZmlsdGVyX2NhbGlicmF0ZShwcml2KTsKKworCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxfFJGX0NISVAyLCAweDEwMDIpOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfR0FJTlNFVDAsIDB4MWQpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVQxLCAweDFkKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUMiwgMHgxZCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfR0FJTlNFVFdSSVRFLCAweDEpOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfTU9ERSwgMHgxKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9MRU4sIDB4M2ZmKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX1RJTUVSMSwgMHgyNyk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfVElNRVIyLCAweDI3KTsKKworCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxfFJGX0NISVAyLCAweDE0MDApOworCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxfFJGX0NISVAyLCAweDE1MDApOworCisJLyogTWVhc3VyZSBDYWxpYnJhdGlvbiAqLworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX01FQVNVUkUsIDB4MSk7CisJY2FsaWJyYV9kZWxheShwcml2KTsKKworCS8qIGRvIGNhbGlicmF0aW9uICovCisJZG9fY2FsaWJyYXRpb24ocHJpdik7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9SWE9WRVJJREUsIDB4MCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfVElNRVIxLCAweDIxKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9USU1FUjIsIDB4MjcpOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQUNJX0xFTiwgMHhmKTsKKworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9HQ1JfR0FJTlNFVDApOworCXJlZyAmPSAweGY7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfR0FJTlNFVDAsIHJlZyk7CisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUMSk7CisJcmVnICY9IDB4ZjsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUMSwgcmVnKTsKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVQyKTsKKwlyZWcgJj0gMHhmOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVQyLCByZWcpOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfR0FJTlNFVFdSSVRFLCAweDApOworCWRpc2FibGVfcmVjZWl2ZXIocHJpdik7Cit9IC8qIGFudGVubmFfY2FsaWJyYXRlICovCisKK3ZvaWQgX19hbnRlbm5hX2NhbGlicmF0ZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiByZWc7CisKKwkvKiBDYWxpYnJhdGUgdGhlIEJhc2VCYW5kRmlsdGVyICovCisJLyogYmFzZV9iYW5kX2ZpbHRlcl9jYWxpYnJhdGUocHJpdik7ICovCisJc3BpX3JmX3dyaXRlKGN0bCwgUkZfQ0hJUDB8UkZfQ0hJUDF8UkZfQ0hJUDIsIDB4MTAwMik7CisKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVQwLCAweDFkKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUMSwgMHgxZCk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfR0FJTlNFVDIsIDB4MWQpOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfR0FJTlNFVFdSSVRFLCAweDEpOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfTU9ERSwgMHgxKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9MRU4sIDB4M2ZmKTsKKworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfVElNRVIxLCAweDI3KTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9USU1FUjIsIDB4MjcpOworCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxfFJGX0NISVAyLCAweDE0MDApOworCXNwaV9yZl93cml0ZShjdGwsIFJGX0NISVAwfFJGX0NISVAxfFJGX0NISVAyLCAweDE1MDApOworCS8qIE1lYXN1cmUgQ2FsaWJyYXRpb24gKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9NRUFTVVJFLCAweDEpOworCWNhbGlicmFfZGVsYXkocHJpdik7CisJZG9fY2FsaWJyYXRpb24ocHJpdik7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfUlhPVkVSSURFLCAweDApOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfVElNRVIxLCAweDIxKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0FDSV9USU1FUjIsIDB4MjcpOworCisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9BQ0lfTEVOLCAweGYpOworCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUMCk7CisJcmVnICY9IDB4ZjsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0dDUl9HQUlOU0VUMCwgcmVnKTsKKwlyZWcgPSBhZ254X3JlYWQzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVQxKTsKKwlyZWcgJj0gMHhmOworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVQxLCByZWcpOworCXJlZyA9IGFnbnhfcmVhZDMyKGN0bCwgQUdOWF9HQ1JfR0FJTlNFVDIpOworCXJlZyAmPSAweGY7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9HQ1JfR0FJTlNFVDIsIHJlZyk7CisKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfR0NSX0dBSU5TRVRXUklURSwgMHgwKTsKKworCS8qIFdyaXRlIDB4MyBHYWluIENvbnRyb2wgRGlzY292ZXJ5IE1vZGUgKi8KKwllbmFibGVfcmVjZWl2ZXIocHJpdik7Cit9CisKK2ludCBhZ254X3NldF9jaGFubmVsKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCBjaGFubmVsKQoreworCUFHTlhfVFJBQ0U7CisKKwlwcmludGsoS0VSTl9FUlIgUEZYICJDaGFubmVsIGlzICVkICVzXG4iLCBjaGFubmVsLCBfX2Z1bmNfXyk7CisJcmFkaW9fY2hhbm5lbF9zZXQocHJpdiwgY2hhbm5lbCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWdueC9zdGEuYyBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L3N0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYWM2NzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYWdueC9zdGEuYwpAQCAtMCwwICsxLDIxOSBAQAorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlICJwaHkuaCIKKyNpbmNsdWRlICJzdGEuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorCit2b2lkIGhhc2hfcmVhZChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1MzIgcmVnaGksIHUzMiByZWdsbywgdTggc3RhX2lkKQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCisJcmVnbG8gJj0gMHhGRkZGOworCXJlZ2xvIHw9IDB4MzAwMDAwMDA7CisJcmVnbG8gfD0gMHg0MDAwMDAwMDsJLyogU2V0IHN0YXR1cyBidXN5ICovCisJcmVnbG8gfD0gc3RhX2lkIDw8IDE2OworCisJaW93cml0ZTMyKDAsIGN0bCArIEFHTlhfUlhNX0hBU0hfQ01EX0ZMQUcpOworCWlvd3JpdGUzMihyZWdoaSwgY3RsICsgQUdOWF9SWE1fSEFTSF9DTURfSElHSCk7CisJaW93cml0ZTMyKHJlZ2xvLCBjdGwgKyBBR05YX1JYTV9IQVNIX0NNRF9MT1cpOworCisJcmVnaGkgPSBpb3JlYWQzMihjdGwgKyBBR05YX1JYTV9IQVNIX0NNRF9ISUdIKTsKKyAgICAgICAgcmVnbG8gPSBpb3JlYWQzMihjdGwgKyBBR05YX1JYTV9IQVNIX0NNRF9MT1cpOworCXByaW50ayhQRlggIlJYIGhhc2ggY21kIGFyZSA6ICUuOHglLjh4XG4iLCByZWdoaSwgcmVnbG8pOworfQorCit2b2lkIGhhc2hfd3JpdGUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdTggKm1hY19hZGRyLCB1OCBzdGFfaWQpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIHJlZ2hpLCByZWdsbzsKKworCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihtYWNfYWRkcikpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJVcGRhdGUgaGFzaCB0YWJsZTogSW52YWxpZCBod2FkZHIhXG4iKTsKKworCXJlZ2hpID0gbWFjX2FkZHJbMF0gPDwgMjQgfCBtYWNfYWRkclsxXSA8PCAxNiB8IG1hY19hZGRyWzJdIDw8IDggfCBtYWNfYWRkclszXTsKKwlyZWdsbyA9IG1hY19hZGRyWzRdIDw8IDggfCBtYWNfYWRkcls1XTsKKwlyZWdsbyB8PSAweDEwMDAwMDAwOwkvKiBTZXQgaGFzaCBjb21tbWFuZCAqLworCXJlZ2xvIHw9IDB4NDAwMDAwMDA7CS8qIFNldCBzdGF0dXMgYnVzeSAqLworCXJlZ2xvIHw9IHN0YV9pZCA8PCAxNjsKKworCWlvd3JpdGUzMigwLCBjdGwgKyBBR05YX1JYTV9IQVNIX0NNRF9GTEFHKTsKKwlpb3dyaXRlMzIocmVnaGksIGN0bCArIEFHTlhfUlhNX0hBU0hfQ01EX0hJR0gpOworCWlvd3JpdGUzMihyZWdsbywgY3RsICsgQUdOWF9SWE1fSEFTSF9DTURfTE9XKTsKKworICAgICAgICByZWdsbyA9IGlvcmVhZDMyKGN0bCArIEFHTlhfUlhNX0hBU0hfQ01EX0xPVyk7CisJaWYgKCEocmVnbG8gJiAweDgwMDAwMDAwKSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIlVwZGF0ZSBoYXNoIHRhYmxlIGZhaWxlZFxuIik7Cit9CisKK3ZvaWQgaGFzaF9kZWxldGUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdTMyIHJlZ2hpLCB1MzIgcmVnbG8sIHU4IHN0YV9pZCkKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKworCXJlZ2xvICY9IDB4RkZGRjsKKwlyZWdsbyB8PSAweDIwMDAwMDAwOworCXJlZ2xvIHw9IDB4NDAwMDAwMDA7CS8qIFNldCBzdGF0dXMgYnVzeSAqLworCXJlZ2xvIHw9IHN0YV9pZCA8PCAxNjsKKworCWlvd3JpdGUzMigwLCBjdGwgKyBBR05YX1JYTV9IQVNIX0NNRF9GTEFHKTsKKwlpb3dyaXRlMzIocmVnaGksIGN0bCArIEFHTlhfUlhNX0hBU0hfQ01EX0hJR0gpOworCWlvd3JpdGUzMihyZWdsbywgY3RsICsgQUdOWF9SWE1fSEFTSF9DTURfTE9XKTsKKwlyZWdoaSA9IGlvcmVhZDMyKGN0bCArIEFHTlhfUlhNX0hBU0hfQ01EX0hJR0gpOworCisgICAgICAgIHJlZ2xvID0gaW9yZWFkMzIoY3RsICsgQUdOWF9SWE1fSEFTSF9DTURfTE9XKTsKKwlwcmludGsoUEZYICJSWCBoYXNoIGNtZCBhcmUgOiAlLjh4JS44eFxuIiwgcmVnaGksIHJlZ2xvKTsKKworfQorCit2b2lkIGhhc2hfZHVtcChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1OCBzdGFfaWQpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTMyIHJlZ2hpLCByZWdsbzsKKworCXJlZ2xvID0gMHgwOwkJLyogZHVtcCBjb21tYW5kICovCisJcmVnbG98PSAweDQwMDAwMDAwOyAgCS8qIHN0YXR1cyBiaXQgKi8KKwlpb3dyaXRlMzIocmVnbG8sIGN0bCArIEFHTlhfUlhNX0hBU0hfQ01EX0xPVyk7CisJaW93cml0ZTMyKHN0YV9pZCA8PCAxNiwgY3RsICsgQUdOWF9SWE1fSEFTSF9EVU1QX0RBVEEpOworCisJdWRlbGF5KDgwKTsKKworCXJlZ2hpID0gaW9yZWFkMzIoY3RsICsgQUdOWF9SWE1fSEFTSF9DTURfSElHSCk7CisgICAgICAgIHJlZ2xvID0gaW9yZWFkMzIoY3RsICsgQUdOWF9SWE1fSEFTSF9DTURfTE9XKTsKKwlwcmludGsoUEZYICJoYXNoIGNtZCBhcmUgOiAlLjh4JS44eFxuIiwgcmVnaGksIHJlZ2xvKTsKKwlyZWdoaSA9IGlvcmVhZDMyKGN0bCArIEFHTlhfUlhNX0hBU0hfQ01EX0ZMQUcpOworCXByaW50ayhQRlggImhhc2ggZmxhZyBpcyA6ICUuOHhcbiIsIHJlZ2hpKTsKKwlyZWdoaSA9IGlvcmVhZDMyKGN0bCArIEFHTlhfUlhNX0hBU0hfRFVNUF9NU1QpOworCXJlZ2xvID0gaW9yZWFkMzIoY3RsICsgQUdOWF9SWE1fSEFTSF9EVU1QX0xTVCk7CisJcHJpbnRrKFBGWCAiaGFzaCBkdW1wIG1zdCBsc3Q6ICUuOHglLjh4XG4iLCByZWdoaSwgcmVnbG8pOworCXJlZ2hpID0gaW9yZWFkMzIoY3RsICsgQUdOWF9SWE1fSEFTSF9EVU1QX0RBVEEpOworCXByaW50ayhQRlggImhhc2ggZHVtcCBkYXRhOiAlLjh4XG4iLCByZWdoaSk7Cit9CisKK3ZvaWQgZ2V0X3N0YV9wb3dlcihzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCBzdHJ1Y3QgYWdueF9zdGFfcG93ZXIgKnBvd2VyLCB1bnNpZ25lZCBpbnQgc3RhX2lkeCkKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKyAgICAgICAgbWVtY3B5X2Zyb21pbyhwb3dlciwgY3RsICsgQUdOWF9UWE1fU1RBUE9XVEVNUCArIHNpemVvZigqcG93ZXIpICogc3RhX2lkeCwKKwkJICAgICAgc2l6ZW9mKCpwb3dlcikpOworfQorCitpbmxpbmUgdm9pZAorc2V0X3N0YV9wb3dlcihzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCBzdHJ1Y3QgYWdueF9zdGFfcG93ZXIgKnBvd2VyLCB1bnNpZ25lZCBpbnQgc3RhX2lkeCkKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwkvKiBGSVhNRSAgIDIuIFdyaXRlIFRlbXBsYXRlIHRvIG9mZnNldCArIHN0YXRpb24gbnVtYmVyICAqLworICAgICAgICBtZW1jcHlfdG9pbyhjdGwgKyBBR05YX1RYTV9TVEFQT1dURU1QICsgc2l6ZW9mKCpwb3dlcikgKiBzdGFfaWR4LAorCQkgICAgcG93ZXIsIHNpemVvZigqcG93ZXIpKTsKK30KKworCit2b2lkIGdldF9zdGFfdHhfd3Eoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgc3RydWN0IGFnbnhfc3RhX3R4X3dxICp0eF93cSwKKwkJICAgdW5zaWduZWQgaW50IHN0YV9pZHgsIHVuc2lnbmVkIGludCB3cV9pZHgpCit7CisJdm9pZCBfX2lvbWVtICpkYXRhID0gcHJpdi0+ZGF0YTsKKwltZW1jcHlfZnJvbWlvKHR4X3dxLCBkYXRhICsgQUdOWF9QRFVfVFhfV1EgKyBzaXplb2YoKnR4X3dxKSAqIFNUQV9UWF9XUV9OVU0gKiBzdGFfaWR4ICsKKwkJICAgICAgc2l6ZW9mKCp0eF93cSkgKiB3cV9pZHgsICBzaXplb2YoKnR4X3dxKSk7CisKK30KKworaW5saW5lIHZvaWQgc2V0X3N0YV90eF93cShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCBzdHJ1Y3QgYWdueF9zdGFfdHhfd3EgKnR4X3dxLAorCQkgICB1bnNpZ25lZCBpbnQgc3RhX2lkeCwgdW5zaWduZWQgaW50IHdxX2lkeCkKK3sKKwl2b2lkIF9faW9tZW0gKmRhdGEgPSBwcml2LT5kYXRhOworCW1lbWNweV90b2lvKGRhdGEgKyBBR05YX1BEVV9UWF9XUSArIHNpemVvZigqdHhfd3EpICogU1RBX1RYX1dRX05VTSAqIHN0YV9pZHggKworCQkgICAgc2l6ZW9mKCp0eF93cSkgKiB3cV9pZHgsIHR4X3dxLCBzaXplb2YoKnR4X3dxKSk7Cit9CisKKwordm9pZCBnZXRfc3RhKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHN0cnVjdCBhZ254X3N0YSAqc3RhLCB1bnNpZ25lZCBpbnQgc3RhX2lkeCkKK3sKKwl2b2lkIF9faW9tZW0gKmRhdGEgPSBwcml2LT5kYXRhOworCisJbWVtY3B5X2Zyb21pbyhzdGEsIGRhdGEgKyBBR05YX1BEVVBPT0wgKyBzaXplb2YoKnN0YSkgKiBzdGFfaWR4LAorCQkgICAgICBzaXplb2YoKnN0YSkpOworfQorCitpbmxpbmUgdm9pZCBzZXRfc3RhKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHN0cnVjdCBhZ254X3N0YSAqc3RhLCB1bnNpZ25lZCBpbnQgc3RhX2lkeCkKK3sKKwl2b2lkIF9faW9tZW0gKmRhdGEgPSBwcml2LT5kYXRhOworCisgICAgICAgIG1lbWNweV90b2lvKGRhdGEgKyBBR05YX1BEVVBPT0wgKyBzaXplb2YoKnN0YSkgKiBzdGFfaWR4LAorCQkgICAgc3RhLCBzaXplb2YoKnN0YSkpOworfQorCisvKiBGSVhNRSAqLwordm9pZCBzdGFfcG93ZXJfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1bnNpZ25lZCBpbnQgc3RhX2lkeCkKK3sKKwlzdHJ1Y3QgYWdueF9zdGFfcG93ZXIgcG93ZXI7CisJdTMyIHJlZzsKKwlBR05YX1RSQUNFOworCisJbWVtc2V0KCZwb3dlciwgMCwgc2l6ZW9mKHBvd2VyKSk7CisJcmVnID0gYWdueF9zZXRfYml0cyhFRENGLCBFRENGX1NISUZULCAweDEpOworCXBvd2VyLnJlZyA9IGNwdV90b19sZTMyKHJlZyk7CisJc2V0X3N0YV9wb3dlcihwcml2LCAmcG93ZXIsIHN0YV9pZHgpOworCXVkZWxheSg0MCk7Cit9IC8qIGFkZF9wb3dlcl90ZW1wbGF0ZSAqLworCisKKy8qIEBudW06IFRoZSAjbnVtYmVyIG9mIHN0YXRpb24gdGhhdCBpcyB2aXNpYmxlIHRvIHRoZSBjYXJkICovCitzdGF0aWMgdm9pZCBzdGFfdHhfd29ya3F1ZXVlX2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IHN0YV9pZHgpCit7CisJc3RydWN0IGFnbnhfc3RhX3R4X3dxIHR4X3dxOworCXUzMiByZWc7CisJdW5zaWduZWQgaW50IGk7CisKKwltZW1zZXQoJnR4X3dxLCAwLCBzaXplb2YodHhfd3EpKTsKKworCXJlZyA9IGFnbnhfc2V0X2JpdHMoV09SS19RVUVVRV9WQUxJRCwgV09SS19RVUVVRV9WQUxJRF9TSElGVCwgMSk7CisJcmVnIHw9IGFnbnhfc2V0X2JpdHMoV09SS19RVUVVRV9BQ0tfVFlQRSwgV09SS19RVUVVRV9BQ0tfVFlQRV9TSElGVCwgMSk7CisvLwlyZWcgfD0gYWdueF9zZXRfYml0cyhXT1JLX1FVRVVFX0FDS19UWVBFLCBXT1JLX1FVRVVFX0FDS19UWVBFX1NISUZULCAwKTsKKwl0eF93cS5yZWcyIHw9IGNwdV90b19sZTMyKHJlZyk7CisKKwkvKiBTdXBwb3NlIGFsbCA4IHRyYWZmaWMgY2xhc3MgYXJlIHVzZWQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgU1RBX1RYX1dRX05VTTsgaSsrKQorCQlzZXRfc3RhX3R4X3dxKHByaXYsICZ0eF93cSwgc3RhX2lkeCwgaSk7Cit9IC8qIHN0YV90eF93b3JrcXVldWVfaW5pdCAqLworCisKK3N0YXRpYyB2b2lkIHN0YV90cmFmZmljX2luaXQoc3RydWN0IGFnbnhfc3RhX3RyYWZmaWMgKnRyYWZmaWMpCit7CisJdTMyIHJlZzsKKwltZW1zZXQodHJhZmZpYywgMCwgc2l6ZW9mKCp0cmFmZmljKSk7CisKKwlyZWcgPSBhZ254X3NldF9iaXRzKE5FV19QQUNLRVQsIE5FV19QQUNLRVRfU0hJRlQsIDEpOworCXJlZyB8PSBhZ254X3NldF9iaXRzKFRSQUZGSUNfVkFMSUQsIFRSQUZGSUNfVkFMSURfU0hJRlQsIDEpOworLy8JcmVnIHw9IGFnbnhfc2V0X2JpdHMoVFJBRkZJQ19BQ0tfVFlQRSwgVFJBRkZJQ19BQ0tfVFlQRV9TSElGVCwgMSk7CisJdHJhZmZpYy0+cmVnMCA9IGNwdV90b19sZTMyKHJlZyk7CisKKwkvKiAJMy4gc2V0dGluZyBSWCBTZXF1ZW5jZSBOdW1iZXIgdG8gNDA5NSAqLworCXJlZyA9IGFnbnhfc2V0X2JpdHMoUlhfU0VRVUVOQ0VfTlVNLCBSWF9TRVFVRU5DRV9OVU1fU0hJRlQsIDQwOTUpOworCXRyYWZmaWMtPnJlZzEgPSBjcHVfdG9fbGUzMihyZWcpOworfQorCisKKy8qIEBudW06IFRoZSAjbnVtYmVyIG9mIHN0YXRpb24gdGhhdCBpcyB2aXNpYmxlIHRvIHRoZSBjYXJkICovCit2b2lkIHN0YV9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCBzdGFfaWR4KQoreworCS8qIEZJWE1FIHRoZSBsZW5ndGggb2Ygc3RhIGlzIDI1NiBieXRlcyBJcyB0aGF0CisJICogZGFuZ2Vyb3VzIHRvIHN0YWNrIG92ZXJmbG93PyAqLworCXN0cnVjdCBhZ254X3N0YSBzdGE7CisJdTMyIHJlZzsKKwlpbnQgaTsKKworCW1lbXNldCgmc3RhLCAwLCBzaXplb2Yoc3RhKSk7CisJLyogU2V0IHZhbGlkIHRvIDEgKi8KKwlyZWcgPSBhZ254X3NldF9iaXRzKFNUQVRJT05fVkFMSUQsIFNUQVRJT05fVkFMSURfU0hJRlQsIDEpOworCS8qIFNldCBFbmFibGUgQ29uY2F0ZW5hdGlvbiB0byAwICg/KSAqLworCXJlZyB8PSBhZ254X3NldF9iaXRzKEVOQUJMRV9DT05DQVRFTkFUSU9OLCBFTkFCTEVfQ09OQ0FURU5BVElPTl9TSElGVCwgMCk7CisJLyogU2V0IEVuYWJsZSBEZWNvbXByZXNzaW9uIHRvIDAgKD8pICovCisJcmVnIHw9IGFnbnhfc2V0X2JpdHMoRU5BQkxFX0RFQ09NUFJFU1NJT04sIEVOQUJMRV9ERUNPTVBSRVNTSU9OX1NISUZULCAwKTsKKwlzdGEucmVnID0gY3B1X3RvX2xlMzIocmVnKTsKKworCS8qIEluaXRpYWxpemUgZWFjaCBvZiB0aGUgVHJhZmZpYyBDbGFzcyBTdHJ1Y3R1cmVzIGJ5OiAqLworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCXN0YV90cmFmZmljX2luaXQoc3RhLnRyYWZmaWMgKyBpKTsKKworCXNldF9zdGEocHJpdiwgJnN0YSwgc3RhX2lkeCk7CisJc3RhX3R4X3dvcmtxdWV1ZV9pbml0KHByaXYsIHN0YV9pZHgpOworfSAvKiBzdGFfZGVzY3JpcHRvcl9pbml0ICovCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Fnbngvc3RhLmggYi9kcml2ZXJzL3N0YWdpbmcvYWdueC9zdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGQwYjEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Fnbngvc3RhLmgKQEAgLTAsMCArMSwyMjIgQEAKKyNpZm5kZWYgQUdOWF9TVEFfSF8KKyNkZWZpbmUgQUdOWF9TVEFfSF8KKworI2RlZmluZSBTVEFfVFhfV1FfTlVNCTgJLyogVGhlIG51bWJlciBvZiBUWCB3b3JrcXVldWUgb25lIFNUQSBoYXMgKi8KKworc3RydWN0IGFnbnhfaGFzaF9jbWQgeworCV9fYmUzMiBjbWRoaTsKKyNkZWZpbmUgTUFDTE8JCTB4RkZGRjAwMDAKKyNkZWZpbmUgTUFDTE9fU0hJRlQJMTYKKyNkZWZpbmUgU1RBX0lECQkweDAwMDBGRkYwCisjZGVmaW5lIFNUQV9JRF9TSElGVAk0CisjZGVmaW5lIENNRAkJMHgwMDAwMDAwQworI2RlZmluZSBDTURfU0hJRlQJMgorI2RlZmluZSBTVEFUVVMJCTB4MDAwMDAwMDIKKyNkZWZpbmUgU1RBVFVTX1NISUZUCTEKKyNkZWZpbmUgUEFTUwkJMHgwMDAwMDAwMQorI2RlZmluZSBQQVNTX1NISUZUCTEKKwlfX2JlMzIgY21kbG87Cit9X19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisKKy8qCisgKiBTdGF0aW9uIFBvd2VyIFRlbXBsYXRlCisgKiBGSVhNRSBKdXN0IGZvciBhZ24xMDAgeWV0CisgKi8KK3N0cnVjdCBhZ254X3N0YV9wb3dlciB7CisJX19sZTMyIHJlZzsKKyNkZWZpbmUgU0lHTkFMCQkJMHgwMDAwMDBGRiAvKiBzaWduYWwgKi8KKyNkZWZpbmUgU0lHTkFMX1NISUZUCQkwCisjZGVmaW5lIFJBVEUJCQkweDAwMDAwRjAwCisjZGVmaW5lIFJBVEVfU0hJRlQJCTgKKyNkZWZpbmUgVElGUwkJCTB4MDAwMDEwMDAKKyNkZWZpbmUgVElGU19TSElGVAkJMTIKKyNkZWZpbmUgRURDRgkJCTB4MDAwMDIwMDAKKyNkZWZpbmUgRURDRl9TSElGVAkJMTMKKyNkZWZpbmUgQ0hBTk5FTF9CT05ECQkweDAwMDA0MDAwCisjZGVmaW5lIENIQU5ORUxfQk9ORF9TSElGVAkxNAorI2RlZmluZSBQSFlfTU9ERQkJMHgwMDAzODAwMAorI2RlZmluZSBQSFlfTU9ERV9TSElGVAkJMTUKKyNkZWZpbmUgUE9XRVJfTEVWRUwJCTB4MDA3QzAwMDAKKyNkZWZpbmUgUE9XRVJfTEVWRUxfU0hJRlQJMTgKKyNkZWZpbmUgTlVNX1RSQU5TTUlUVEVSUwkweDAwODAwMDAwCisjZGVmaW5lIE5VTV9UUkFOU01JVFRFUlNfU0hJRlQJMjMKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisvKgorICogVFggV29ya3F1ZXVlIERlc2NyaXB0b3IKKyAqLworc3RydWN0IGFnbnhfc3RhX3R4X3dxIHsKKwlfX2xlMzIgcmVnMDsKKyNkZWZpbmUgSEVBRF9QT0lOVEVSX0xPVwkweEZGMDAwMDAwIC8qIEhlYWQgcG9pbnRlciBsb3cgKi8KKyNkZWZpbmUgSEVBRF9QT0lOVEVSX0xPV19TSElGVAkyNAorI2RlZmluZSBUQUlMX1BPSU5URVIJCTB4MDBGRkZGRkYgLyogVGFpbCBwb2ludGVyICovCisjZGVmaW5lIFRBSUxfUE9JTlRFUl9TSElGVAkwCisKKwlfX2xlMzIgcmVnMzsKKyNkZWZpbmUgQUNLX1BPSU5URVJfTE9XCSAgICAgICAgMHhGRkZGMDAwMAkvKiBBQ0sgcG9pbnRlciBsb3cgKi8KKyNkZWZpbmUgQUNLX1BPSU5URVJfTE9XX1NISUZUCTE2CisjZGVmaW5lIEhFQURfUE9JTlRFUl9ISUdICTB4MDAwMEZGRkYJLyogSGVhZCBwb2ludGVyIGhpZ2ggKi8KKyNkZWZpbmUgSEVBRF9QT0lOVEVSX0hJR0hfU0hJRlQJMAorCisJX19sZTMyIHJlZzE7CisvKiBBQ0sgdGltZW91dCB0YWlsIHBhY2tldCBjb3VudCAqLworI2RlZmluZSBBQ0tfVElNT1VUX1RBSUxfUEFDS19DTlQJMHhGRkYwMDAwMAorI2RlZmluZSBBQ0tfVElNT1VUX1RBSUxfUEFDS19DTlRfU0hJRlQJMjAKKy8qIEhlYWQgdGltZW91dCB0YWlsIHBhY2tldCBjb3VudCAqLworI2RlZmluZSBIRUFEX1RJTU9VVF9UQUlMX1BBQ0tfQ05UCTB4MDAwRkZGMDAKKyNkZWZpbmUgSEVBRF9USU1PVVRfVEFJTF9QQUNLX0NOVF9TSElGVAk4CisjZGVmaW5lIEFDS19QT0lOVEVSX0hJR0gJICAgICAgICAweDAwMDAwMEZGIC8qIEFDSyBwb2ludGVyIGhpZ2ggKi8KKyNkZWZpbmUgQUNLX1BPSU5URVJfSElHSF9TSElGVAkJMAorCisJX19sZTMyIHJlZzI7CisjZGVmaW5lIFdPUktfUVVFVUVfVkFMSUQJCTB4ODAwMDAwMDAgLyogdmFsaWQgKi8KKyNkZWZpbmUgV09SS19RVUVVRV9WQUxJRF9TSElGVAkJMzEKKyNkZWZpbmUgV09SS19RVUVVRV9BQ0tfVFlQRQkJMHg0MDAwMDAwMCAvKiBBQ0sgdHlwZSAqLworI2RlZmluZSBXT1JLX1FVRVVFX0FDS19UWVBFX1NISUZUCTMwCisvKiBIZWFkIHRpbWVvdXQgd2luZG93IGxpbWl0IGZyYWdtZW50YXRpb24gY291bnQgKi8KKyNkZWZpbmUgSEVBRF9USU1PVVRfV0lOX0xJTV9GUkFHX0NOVAkweDNGRkYwMDAwCisjZGVmaW5lIEhFQURfVElNT1VUX1dJTl9MSU1fRlJBR19DTlRfU0hJRlQJMTYKKy8qIEhlYWQgdGltZW91dCB3aW5kb3cgbGltaXQgYnl0ZSBjb3VudCAqLworI2RlZmluZSBIRUFEX1RJTU9VVF9XSU5fTElNX0JZVEVfQ05UCTB4MDAwMEZGRkYKKyNkZWZpbmUgSEVBRF9USU1PVVRfV0lOX0xJTV9CWVRFX0NOVF9TSElGVAkgMAorfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKworLyoKKyAqIFRyYWZmaWMgQ2xhc3MgU3RydWN0dXJlCisgKi8KK3N0cnVjdCBhZ254X3N0YV90cmFmZmljIHsKKwlfX2xlMzIgcmVnMDsKKyNkZWZpbmUgQUNLX1RJTU9VVF9DTlQJCTB4RkY4MDAwMDAgLyogQUNLIFRpbWVvdXQgQ291bnRzICovCisjZGVmaW5lIEFDS19USU1PVVRfQ05UX1NISUZUCTIzCisjZGVmaW5lIFRSQUZGSUNfQUNLX1RZUEUJMHgwMDYwMDAwMCAvKiBBQ0sgVHlwZSAqLworI2RlZmluZSBUUkFGRklDX0FDS19UWVBFX1NISUZUCTIxCisjZGVmaW5lIE5FV19QQUNLRVQJCTB4MDAxMDAwMDAgLyogTmV3IFBhY2tldCAgKi8KKyNkZWZpbmUgTkVXX1BBQ0tFVF9TSElGVAkyMAorI2RlZmluZSBUUkFGRklDX1ZBTElECQkweDAwMDgwMDAwIC8qIFZhbGlkICovCisjZGVmaW5lIFRSQUZGSUNfVkFMSURfU0hJRlQJMTkKKyNkZWZpbmUgUlhfSERSX0RFU0NfUE9JTlRFUgkweDAwMDdGRkZGIC8qIFJYIEhlYWRlciBEZXNjcmlwdGVyIHBvaW50ZXIgKi8KKyNkZWZpbmUgUlhfSERSX0RFU0NfUE9JTlRFUl9TSElGVAkgMAorCisJX19sZTMyIHJlZzE7CisjZGVmaW5lIFJYX1BBQ0tFVF9USU1FU1RBTVAJMHhGRkZGMDAwMCAvKiBSWCBQYWNrZXQgVGltZXN0YW1wICovCisjZGVmaW5lIFJYX1BBQ0tFVF9USU1FU1RBTVBfU0hJRlQJMTYKKyNkZWZpbmUgVFJBRkZJQ19SRVNFUlZFRAkweDAwMDBFMDAwIC8qIFJlc2VydmVkICovCisjZGVmaW5lIFRSQUZGSUNfUkVTRVJWRURfU0hJRlQgIDEzCisjZGVmaW5lIFNWCQkJMHgwMDAwMTAwMCAvKiBzdiAqLworI2RlZmluZSBTVl9TSElGVAkJMTIKKyNkZWZpbmUgUlhfU0VRVUVOQ0VfTlVNCQkweDAwMDAwRkZGIC8qIFJYIFNlcXVlbmNlIE51bWJlciAqLworI2RlZmluZSBSWF9TRVFVRU5DRV9OVU1fU0hJRlQJMAorCisJX19sZTMyIHR4X3JlcGxheV9jbnRfbG93OyAvKiBUWCBSZXBsYXkgQ291bnRlciBMb3cgKi8KKworCV9fbGUxNiB0eF9yZXBsYXlfY250X2hpZ2g7IC8qIFRYIFJlcGxheSBDb3VudGVyIEhpZ2ggKi8KKwlfX2xlMTYgcnhfcmVwbGF5X2NudF9oaWdoOyAvKiBSWCBSZXBsYXkgQ291bnRlciBIaWdoICovCisKKwlfX2JlMzIgcnhfcmVwbGF5X2NudF9sb3c7IC8qIFJYIFJlcGxheSBDb3VudGVyIExvdyAqLworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKy8qCisgKiBTdGF0aW9uIERlc2NyaXB0b3JzCisgKi8KK3N0cnVjdCBhZ254X3N0YSB7CisJX19sZTMyIHR4X3Nlc3Npb25fa2V5c1s0XTsgLyogVHJhbnNtaXQgU2Vzc2lvbiBLZXkgKDAtMykgKi8KKwlfX2xlMzIgcnhfc2Vzc2lvbl9rZXlzWzRdOyAvKiBSZWNlaXZlIFNlc3Npb24gS2V5ICgwLTMpICovCisKKwlfX2xlMzIgcmVnOworI2RlZmluZSBJRF8xCQkJMHhDMDAwMDAwMCAvKiBpZCAxICovCisjZGVmaW5lIElEXzFfU0hJRlQJCTMwCisjZGVmaW5lIElEXzAJCQkweDMwMDAwMDAwIC8qIGlkIDAgKi8KKyNkZWZpbmUgSURfMF9TSElGVAkJMjgKKyNkZWZpbmUgRU5BQkxFX0NPTkNBVEVOQVRJT04JMHgwRkYwMDAwMCAvKiBFbmFibGUgY29uY2F0ZW5hdGlvbiAqLworI2RlZmluZSBFTkFCTEVfQ09OQ0FURU5BVElPTl9TSElGVAkyMAorI2RlZmluZSBFTkFCTEVfREVDT01QUkVTU0lPTgkweDAwMEZGMDAwIC8qIEVuYWJsZSBkZWNvbXByZXNzaW9uICovCisjZGVmaW5lIEVOQUJMRV9ERUNPTVBSRVNTSU9OX1NISUZUCTEyCisjZGVmaW5lIFNUQV9SRVNFUlZFRAkJMHgwMDAwMEMwMCAvKiBSZXNlcnZlZCAqLworI2RlZmluZSBTVEFfUkVTRVJWRURfU0hJRlQJMTAKKyNkZWZpbmUgRUFQCQkJMHgwMDAwMDIwMCAvKiBFQVAgKi8KKyNkZWZpbmUgRUFQX1NISUZUCQk5CisjZGVmaW5lIEVEX05VTEwJCQkweDAwMDAwMTAwIC8qIEVEIE5VTEwgKi8KKyNkZWZpbmUgRURfTlVMTF9TSElGVAkJOAorI2RlZmluZSBFTkNSWVBUSU9OX1BPTElDWQkweDAwMDAwMEUwIC8qIEVuY3J5cHRpb24gUG9saWN5ICovCisjZGVmaW5lIEVOQ1JZUFRJT05fUE9MSUNZX1NISUZUIDUKKyNkZWZpbmUgREVGSU5FRF9LRVlfSUQJCTB4MDAwMDAwMTggLyogRGVmaW5lZCBLZXkgSUQgKi8KKyNkZWZpbmUgREVGSU5FRF9LRVlfSURfU0hJRlQJMworI2RlZmluZSBGSVhFRF9LRVkJCTB4MDAwMDAwMDQgLyogRml4ZWQgS2V5ICovCisjZGVmaW5lIEZJWEVEX0tFWV9TSElGVAkJMgorI2RlZmluZSBLRVlfVkFMSUQJCTB4MDAwMDAwMDIgLyogS2V5IFZhbGlkICovCisjZGVmaW5lIEtFWV9WQUxJRF9TSElGVAkJMQorI2RlZmluZSBTVEFUSU9OX1ZBTElECQkweDAwMDAwMDAxIC8qIFN0YXRpb24gVmFsaWQgKi8KKyNkZWZpbmUgU1RBVElPTl9WQUxJRF9TSElGVAkwCisKKwlfX2xlMzIgdHhfYWVzX2Jsa3NfdW5pY2FzdDsgLyogVFggQUVTIEJsa3MgVW5pY2FzdCAqLworCV9fbGUzMiByeF9hZXNfYmxrc191bmljYXN0OyAvKiBSWCBBRVMgQmxrcyBVbmljYXN0ICovCisKKwlfX2xlMTYgYWVzX2Zvcm1hdF9lcnJfdW5pY2FzdF9jbnQ7IC8qIEFFUyBGb3JtYXQgRXJyb3IgVW5pY2FzdCBDb3VudHMgKi8KKwlfX2xlMTYgYWVzX3JlcGxheV91bmljYXN0OyAvKiBBRVMgUmVwbGF5IFVuaWNhc3QgKi8KKworCV9fbGUxNiBhZXNfZGVjcnlwdF9lcnJfdW5pY2FzdDsJLyogQUVTIERlY3J5cHQgRXJyb3IgVW5pY2FzdCAqLworCV9fbGUxNiBhZXNfZGVjcnlwdF9lcnJfZGVmYXVsdDsJLyogQUVTIERlY3J5cHQgRXJyb3IgZGVmYXVsdCAqLworCisJX19sZTE2IHNpbmdsZV9yZXRyeV9wYWNrZXRzOyAvKiBTaW5nbGUgUmV0cnkgUGFja2V0cyAqLworCV9fbGUxNiBmYWlsZWRfdHhfcGFja2V0czsgLyogRmFpbGVkIFR4IFBhY2tldHMgKi8KKworCV9fbGUxNiBtdXRpX3JldHJ5X3BhY2tldHM7IC8qIE11bHRpcGxlIFJldHJ5IFBhY2tldHMgKi8KKwlfX2xlMTYgYWNrX3RpbWVvdXRzOwkvKiBBQ0sgVGltZW91dHMgKi8KKworCV9fbGUxNiBmcmFnX3R4X2NudDsJLyogRnJhZ21lbnQgVFggQ291bnRzICovCisJX19sZTE2IHJ0c19icnFfc2VudDsJLyogUlRTIEJycSBTZW50ICovCisKKwlfX2xlMTYgdHhfcGFja2V0czsJLyogVFggUGFja2V0cyAqLworCV9fbGUxNiBjdHNfYmFja190aW1lb3V0OyAvKiBDVFMgQmFjayBUaW1lb3V0ICovCisKKwlfX2xlMzIgcGh5X3N0YXRzX2hpZ2g7CS8qIFBIWSBTdGF0cyBIaWdoICovCisJX19sZTMyIHBoeV9zdGF0c19sb3c7CS8qIFBIWSBTdGF0cyBMb3cgKi8KKworCXN0cnVjdCBhZ254X3N0YV90cmFmZmljIHRyYWZmaWNbOF07CS8qIFRyYWZmaWMgQ2xhc3MgU3RydWN0dXJlICg4KSAqLworCisJX19sZTE2IHRyYWZmaWNfY2xhc3MwX2ZyYWdfc3VjY2VzczsgLyogVHJhZmZpYyBDbGFzcyAwIEZyYWdtZW50IFN1Y2Nlc3MgKi8KKwlfX2xlMTYgdHJhZmZpY19jbGFzczFfZnJhZ19zdWNjZXNzOyAvKiBUcmFmZmljIENsYXNzIDEgRnJhZ21lbnQgU3VjY2VzcyAqLworCV9fbGUxNiB0cmFmZmljX2NsYXNzMl9mcmFnX3N1Y2Nlc3M7IC8qIFRyYWZmaWMgQ2xhc3MgMiBGcmFnbWVudCBTdWNjZXNzICovCisJX19sZTE2IHRyYWZmaWNfY2xhc3MzX2ZyYWdfc3VjY2VzczsgLyogVHJhZmZpYyBDbGFzcyAzIEZyYWdtZW50IFN1Y2Nlc3MgKi8KKwlfX2xlMTYgdHJhZmZpY19jbGFzczRfZnJhZ19zdWNjZXNzOyAvKiBUcmFmZmljIENsYXNzIDQgRnJhZ21lbnQgU3VjY2VzcyAqLworCV9fbGUxNiB0cmFmZmljX2NsYXNzNV9mcmFnX3N1Y2Nlc3M7IC8qIFRyYWZmaWMgQ2xhc3MgNSBGcmFnbWVudCBTdWNjZXNzICovCisJX19sZTE2IHRyYWZmaWNfY2xhc3M2X2ZyYWdfc3VjY2VzczsgLyogVHJhZmZpYyBDbGFzcyA2IEZyYWdtZW50IFN1Y2Nlc3MgKi8KKwlfX2xlMTYgdHJhZmZpY19jbGFzczdfZnJhZ19zdWNjZXNzOyAvKiBUcmFmZmljIENsYXNzIDcgRnJhZ21lbnQgU3VjY2VzcyAqLworCisJX19sZTE2IG51bV9mcmFnX25vbl9wcmltZV9yYXRlczsgLyogbnVtYmVyIG9mIEZyYWdtZW50cyBmb3Igbm9uLXByaW1lIHJhdGVzICovCisJX19sZTE2IGFja190aW1lb3V0X25vbl9wcmltZV9yYXRlczsgLyogQUNLIFRpbWVvdXQgZm9yIG5vbi1wcmltZSByYXRlcyAqLworCit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworCitzdHJ1Y3QgYWdueF9iZWFjb25faGRyIHsKKwlzdHJ1Y3QgYWdueF9zdGFfcG93ZXIgcG93ZXI7IC8qIFR4IFN0YXRpb24gUG93ZXIgVGVtcGxhdGUgICovCisJdTggcGh5X2hkcls2XTsJCS8qIFBIWSBIZHIgKi8KKwl1OCBmcmFtZV9sZW5fbG87CS8qIEZyYW1lIExlbmd0aCBMbyAqLworCXU4IGZyYW1lX2xlbl9oaTsJLyogRnJhbWUgTGVuZ3RoIEhpICovCisJdTggbWFjX2hkclsyNF07CQkvKiBNQUMgSGVhZGVyICovCisJLyogRklYTUUgKi8KKwkvKiA4MDIuMTEoYWJnKSBiZWFjb24gKi8KK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCit2b2lkIGhhc2hfd3JpdGUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdTggKm1hY19hZGRyLCB1OCBzdGFfaWQpOwordm9pZCBoYXNoX2R1bXAoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdTggc3RhX2lkKTsKK3ZvaWQgaGFzaF9yZWFkKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHUzMiByZWdoaSwgdTMyIHJlZ2xvLCB1OCBzdGFfaWQpOwordm9pZCBoYXNoX2RlbGV0ZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1MzIgcmVnaGksIHUzMiByZWdsbywgdTggc3RhX2lkKTsKKwordm9pZCBnZXRfc3RhX3Bvd2VyKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHN0cnVjdCBhZ254X3N0YV9wb3dlciAqcG93ZXIsIHVuc2lnbmVkIGludCBzdGFfaWR4KTsKK3ZvaWQgc2V0X3N0YV9wb3dlcihzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCBzdHJ1Y3QgYWdueF9zdGFfcG93ZXIgKnBvd2VyLAorCQkgICB1bnNpZ25lZCBpbnQgc3RhX2lkeCk7Cit2b2lkIGdldF9zdGFfdHhfd3Eoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgc3RydWN0IGFnbnhfc3RhX3R4X3dxICp0eF93cSwKKwkJICAgdW5zaWduZWQgaW50IHN0YV9pZHgsIHVuc2lnbmVkIGludCB3cV9pZHgpOwordm9pZCBzZXRfc3RhX3R4X3dxKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHN0cnVjdCBhZ254X3N0YV90eF93cSAqdHhfd3EsCisJCSAgIHVuc2lnbmVkIGludCBzdGFfaWR4LCB1bnNpZ25lZCBpbnQgd3FfaWR4KTsKK3ZvaWQgZ2V0X3N0YShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCBzdHJ1Y3QgYWdueF9zdGEgKnN0YSwgdW5zaWduZWQgaW50IHN0YV9pZHgpOwordm9pZCBzZXRfc3RhKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHN0cnVjdCBhZ254X3N0YSAqc3RhLCB1bnNpZ25lZCBpbnQgc3RhX2lkeCk7CisKK3ZvaWQgc3RhX3Bvd2VyX2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IG51bSk7Cit2b2lkIHN0YV9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCBudW0pOworCisjZW5kaWYgLyogQUdOWF9TVEFfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hZ254L3RhYmxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvYWdueC90YWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MDA0ODQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYWdueC90YWJsZS5jCkBAIC0wLDAgKzEsMTY4IEBACisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlICJhZ254LmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJwaHkuaCIKKworc3RhdGljIGNvbnN0IHUzMgordHhfZmlyX3RhYmxlW10gPSB7IDB4MTksIDB4NWQsIDB4Y2UsIDB4MTUxLCAweDFjMywgMHgxZmYsIDB4MWVhLCAweDE3YywgMHhjZiwKKwkJICAgMHgxOSwgMHgzOGUsIDB4MzUwLCAweDM2MiwgMHgzYWQsIDB4NSwgMHg0NCwgMHg1OSwgMHg0OSwKKwkJICAgMHgyMSwgMHgzZjcsIDB4M2UwLCAweDNlMywgMHgzZjMsIDB4MCB9OworCit2b2lkIHR4X2Zpcl90YWJsZV9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0eF9maXJfdGFibGUpOyBpKyspCisJCWlvd3JpdGUzMih0eF9maXJfdGFibGVbaV0sIGN0bCArIEFHTlhfRklSX0JBU0UgKyBpKjQpOworfSAvKiBmaXJfdGFibGVfc2V0dXAgKi8KKworCitzdGF0aWMgY29uc3QgdTMyCitnYWluX3RhYmxlW10gPSB7IDB4OCwgMHg4LCAweGYsIDB4MTMsIDB4MTcsIDB4MWIsIDB4MWYsIDB4MjMsIDB4MjcsIDB4MmIsCisJCSAweDJmLCAweDMzLCAweDM3LCAweDNiLCAweDNmLCAweDQzLCAweDQ3LCAweDRiLCAweDRmLAorCQkgMHg1MywgMHg1NywgMHg1YiwgMHg1ZiwgMHg1ZiwgMHg1ZiwgMHg1ZiwgMHg1ZiwgMHg1ZiwKKwkJIDB4NWYsIDB4NWYsIDB4NWYsIDB4NWYgfTsKKwordm9pZCBnYWluX3RhYmxlX2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGdhaW5fdGFibGUpOyBpKyspIHsKKwkJaW93cml0ZTMyKGdhaW5fdGFibGVbaV0sIGN0bCArIEFHTlhfR0FJTl9UQUJMRSArIGkqNCk7CisJCWlvd3JpdGUzMihnYWluX3RhYmxlW2ldLCBjdGwgKyBBR05YX0dBSU5fVEFCTEUgKyBpKjQgKyAweDgwKTsKKwl9Cit9IC8qIGdhaW5fdGFibGVfaW5pdCAqLworCit2b2lkIG1vbml0b3JfZ2Fpbl90YWJsZV9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMHg0NDsgaSArPSA0KSB7CisJCWlvd3JpdGUzMigweDYxLCBjdGwgKyBBR05YX01PTkdDUl9CQVNFICsgaSk7CisJCWlvd3JpdGUzMigweDYxLCBjdGwgKyBBR05YX01PTkdDUl9CQVNFICsgMHgyMDAgKyBpKTsKKwl9CisJZm9yIChpID0gMHg0NDsgaSA8IDB4NjQ7IGkgKz0gNCkgeworCQlpb3dyaXRlMzIoMHg2ZSwgY3RsICsgQUdOWF9NT05HQ1JfQkFTRSArIGkpOworCQlpb3dyaXRlMzIoMHg2ZSwgY3RsICsgQUdOWF9NT05HQ1JfQkFTRSArIDB4MjAwICsgaSk7CisJfQorCWZvciAoaSA9IDB4NjQ7IGkgPCAweDk0OyBpICs9IDQpIHsKKwkJaW93cml0ZTMyKDB4N2EsIGN0bCArIEFHTlhfTU9OR0NSX0JBU0UgKyBpKTsKKwkJaW93cml0ZTMyKDB4N2EsIGN0bCArIEFHTlhfTU9OR0NSX0JBU0UgKyAweDIwMCArIGkpOworCX0KKwlmb3IgKGkgPSAweDk0OyBpIDwgMHhkYzsgaSArPSA0KSB7CisJCWlvd3JpdGUzMigweDg3LCBjdGwgKyBBR05YX01PTkdDUl9CQVNFICsgaSk7CisJCWlvd3JpdGUzMigweDg3LCBjdGwgKyBBR05YX01PTkdDUl9CQVNFICsgMHgyMDAgKyBpKTsKKwl9CisJZm9yIChpID0gMHhkYzsgaSA8IDB4MTQ4OyBpICs9IDQpIHsKKwkJaW93cml0ZTMyKDB4OTUsIGN0bCArIEFHTlhfTU9OR0NSX0JBU0UgKyBpKTsKKwkJaW93cml0ZTMyKDB4OTUsIGN0bCArIEFHTlhfTU9OR0NSX0JBU0UgKyAweDIwMCArIGkpOworCX0KKwlmb3IgKGkgPSAweDE0ODsgaSA8IDB4MWU4OyBpICs9IDQpIHsKKwkJaW93cml0ZTMyKDB4YTIsIGN0bCArIEFHTlhfTU9OR0NSX0JBU0UgKyBpKTsKKwkJaW93cml0ZTMyKDB4YTIsIGN0bCArIEFHTlhfTU9OR0NSX0JBU0UgKyAweDIwMCArIGkpOworCX0KKwlmb3IgKGkgPSAweDFlODsgaSA8PSAweDFmYzsgaSArPSA0KSB7CisJCWlvd3JpdGUzMigweGIwLCBjdGwgKyBBR05YX01PTkdDUl9CQVNFICsgaSk7CisJCWlvd3JpdGUzMigweGIwLCBjdGwgKyBBR05YX01PTkdDUl9CQVNFICsgMHgyMDAgKyBpKTsKKwl9Cit9IC8qIG1vbml0b3JfZ2Fpbl90YWJsZV9pbml0ICovCisKKwordm9pZCByb3V0aW5nX3RhYmxlX2luaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl1bnNpZ25lZCBpbnQgdHlwZSwgc3VidHlwZTsKKwl1MzIgcmVnOworCisJZGlzYWJsZV9yZWNlaXZlcihwcml2KTsKKworCWZvciAoIHR5cGUgPSAwOyB0eXBlIDwgMHgzOyB0eXBlKysgKSB7CisJCWZvciAoc3VidHlwZSA9IDA7IHN1YnR5cGUgPCAweDEwOyBzdWJ0eXBlKyspIHsKKwkJCS8qIDEuIFNldCBSb3V0aW5nIHRhYmxlIHRvIFIvVyBhbmQgdG8gUmV0dXJuIHN0YXR1cyBvbiBSZWFkICovCisJCQlyZWcgPSAodHlwZSA8PCBST1VUQUJfVFlQRV9TSElGVCkgfAorCQkJCShzdWJ0eXBlIDw8IFJPVVRBQl9TVUJUWVBFX1NISUZUKTsKKwkJCXJlZyB8PSAoMSA8PCBST1VUQUJfUldfU0hJRlQpIHwgKDEgPDwgUk9VVEFCX1NUQVRVU19TSElGVCk7CisJCQlpZiAodHlwZSA9PSBST1VUQUJfVFlQRV9EQVRBKSB7CisJCQkJLyogTlVMTCBnb2VzIHRvIFJGUCAqLworCQkJCWlmIChzdWJ0eXBlID09IFJPVVRBQl9TVUJUWVBFX05VTEwpCisvLwkJCQkJcmVnIHw9IFJPVVRBQl9ST1VURV9SRlA7CisJCQkJCXJlZyB8PSBST1VUQUJfUk9VVEVfQ1BVOworCQkJCS8qIFFPUyBOVUxMIGdvZXMgdG8gQ1BVICovCisJCQkJZWxzZSBpZiAoc3VidHlwZSA9PSBST1VUQUJfU1VCVFlQRV9RT1NOVUxMKQorCQkJCQlyZWcgfD0gUk9VVEFCX1JPVVRFX0NQVTsKKwkJCQkvKiBBbGwgRGF0YSBhbmQgUU9TIGRhdGEgc3VidHlwZXMgZ28gdG8gRW5jcnlwdGlvbiAqLworCQkJCWVsc2UgaWYgKChzdWJ0eXBlID09IFJPVVRBQl9TVUJUWVBFX0RBVEEpIHx8CisJCQkJCSAoc3VidHlwZSA9PSBST1VUQUJfU1VCVFlQRV9EQVRBQUNLKSB8fAorCQkJCQkgKHN1YnR5cGUgPT0gUk9VVEFCX1NVQlRZUEVfREFUQVBPTEwpIHx8CisJCQkJCSAoc3VidHlwZSA9PSBST1VUQUJfU1VCVFlQRV9EQVRBUE9MTEFDSykgfHwKKwkJCQkJIChzdWJ0eXBlID09IFJPVVRBQl9TVUJUWVBFX1FPU0RBVEEpIHx8CisJCQkJCSAoc3VidHlwZSA9PSBST1VUQUJfU1VCVFlQRV9RT1NEQVRBQUNLKSB8fAorCQkJCQkgKHN1YnR5cGUgPT0gUk9VVEFCX1NVQlRZUEVfUU9TREFUQVBPTEwpIHx8CisJCQkJCSAoc3VidHlwZSA9PSBST1VUQUJfU1VCVFlQRV9RT1NEQVRBQUNLUE9MTCkpCisJCQkJCXJlZyB8PSBST1VUQUJfUk9VVEVfRU5DUlk7CisvLwkJCQkJcmVnIHw9IFJPVVRBQl9ST1VURV9DUFU7CisJCQkJLypEcm9wIE5VTEwgYW5kIFFPUyBOVUxMIGFjaywgcG9sbCBhbmQgcG9sbCBhY2sqLworCQkJCWVsc2UgaWYgKChzdWJ0eXBlID09IFJPVVRBQl9TVUJUWVBFX05VTExBQ0spIHx8CisJCQkJCSAoc3VidHlwZSA9PSBST1VUQUJfU1VCVFlQRV9RT1NOVUxMQUNLKSB8fAorCQkJCQkgKHN1YnR5cGUgPT0gUk9VVEFCX1NVQlRZUEVfTlVMTFBPTEwpIHx8CisJCQkJCSAoc3VidHlwZSA9PSBST1VUQUJfU1VCVFlQRV9RT1NOVUxMUE9MTCkgfHwKKwkJCQkJIChzdWJ0eXBlID09IFJPVVRBQl9TVUJUWVBFX05VTExQT0xMQUNLKSB8fAorCQkJCQkgKHN1YnR5cGUgPT0gUk9VVEFCX1NVQlRZUEVfUU9TTlVMTFBPTExBQ0spKQorLy8JCQkJCXJlZyB8PSBST1VUQUJfUk9VVEVfRFJPUDsKKwkJCQkJcmVnIHw9IFJPVVRBQl9ST1VURV9DUFU7CisJCQl9CisJCQllbHNlCisJCQkJcmVnIHw9IChST1VUQUJfUk9VVEVfQ1BVKTsKKwkJCWlvd3JpdGUzMihyZWcsIGN0bCArIEFHTlhfUlhNX1JPVVRBQik7CisJCQkvKiBDaGVjayB0byB2ZXJpZnkgdGhhdCB0aGUgc3RhdHVzIGJpdCBjbGVhcmVkICovCisJCQlyb3V0aW5nX3RhYmxlX2RlbGF5KCk7CisJCX0KKwl9CisJZW5hYmxlX3JlY2VpdmVyKHByaXYpOworfSAvKiByb3V0aW5nX3RhYmxlX2luaXQgKi8KKwordm9pZCB0eF9lbmdpbmVfbG9va3VwX3RibF9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdm9pZCBfX2lvbWVtICpkYXRhID0gcHJpdi0+ZGF0YTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPD0gMjg7IGkgKz0gNCkKKwkJaW93cml0ZTMyKDB4YjAwYywgZGF0YSArIEFHTlhfRU5HSU5FX0xPT0tVUF9UQkwgKyBpKTsKKwlmb3IgKGkgPSAzMjsgaSA8PSAxMjA7IGkgKz0gOCkgeworCQlpb3dyaXRlMzIoMHgxZTU4LCBkYXRhICsgQUdOWF9FTkdJTkVfTE9PS1VQX1RCTCArIGkpOworCQlpb3dyaXRlMzIoMHhiMDBjLCBkYXRhICsgQUdOWF9FTkdJTkVfTE9PS1VQX1RCTCArIGkgKyA0KTsKKwl9CisKKwlmb3IgKGkgPSAxMjg7IGkgPD0gMTU2OyBpICs9IDQpCisJCWlvd3JpdGUzMigweDk4MGMsIGRhdGEgKyBBR05YX0VOR0lORV9MT09LVVBfVEJMICsgaSk7CisJZm9yIChpID0gMTYwOyBpIDw9IDI0ODsgaSArPSA4KSB7CisJCWlvd3JpdGUzMigweDE4NTgsIGRhdGEgKyBBR05YX0VOR0lORV9MT09LVVBfVEJMICsgaSk7CisJCWlvd3JpdGUzMigweDk4MGMsIGRhdGEgKyBBR05YX0VOR0lORV9MT09LVVBfVEJMICsgaSArIDQpOworCX0KKworCWZvciAoaSA9IDI1NjsgaSA8PSAyODQ7IGkgKz0gNCkKKwkJaW93cml0ZTMyKDB4OTgwYywgZGF0YSArIEFHTlhfRU5HSU5FX0xPT0tVUF9UQkwgKyBpKTsKKwlmb3IgKGkgPSAyODg7IGkgPD0gMzc2OyBpICs9IDgpIHsKKwkJaW93cml0ZTMyKDB4MWE1OCwgZGF0YSArIEFHTlhfRU5HSU5FX0xPT0tVUF9UQkwgKyBpKTsKKwkJaW93cml0ZTMyKDB4MTg1OCwgZGF0YSArIEFHTlhfRU5HSU5FX0xPT0tVUF9UQkwgKyBpICsgNCk7CisJfQorCisJZm9yIChpID0gNTEyOyBpIDw9IDU0MDsgaSArPSA0KQorCQlpb3dyaXRlMzIoMHhjMDBjLCBkYXRhICsgQUdOWF9FTkdJTkVfTE9PS1VQX1RCTCArIGkpOworCWZvciAoaSA9IDU0NDsgaSA8PSA2MzI7IGkgKz0gOCkgeworCQlpb3dyaXRlMzIoMHgyMDU4LCBkYXRhICsgQUdOWF9FTkdJTkVfTE9PS1VQX1RCTCArIGkpOworCQlpb3dyaXRlMzIoMHhjMDBjLCBkYXRhICsgQUdOWF9FTkdJTkVfTE9PS1VQX1RCTCArIGkgKyA0KTsKKwl9CisKKwlmb3IgKGkgPSA2NDA7IGkgPD0gNjY4OyBpICs9IDQpCisJCWlvd3JpdGUzMigweGM4MGMsIGRhdGEgKyBBR05YX0VOR0lORV9MT09LVVBfVEJMICsgaSk7CisJZm9yIChpID0gNjcyOyBpIDw9IDc2NDsgaSArPSA4KSB7CisJCWlvd3JpdGUzMigweDIyNTgsIGRhdGEgKyBBR05YX0VOR0lORV9MT09LVVBfVEJMICsgaSk7CisJCWlvd3JpdGUzMigweGM4MGMsIGRhdGEgKyBBR05YX0VOR0lORV9MT09LVVBfVEJMICsgaSArIDQpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FnbngvdGFibGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L3RhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA2MjZiNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L3RhYmxlLmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBBR05YX1RBQkxFX0hfCisjZGVmaW5lIEFHTlhfVEFCTEVfSF8KKwordm9pZCB0eF9maXJfdGFibGVfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK3ZvaWQgZ2Fpbl90YWJsZV9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpOwordm9pZCBtb25pdG9yX2dhaW5fdGFibGVfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK3ZvaWQgcm91dGluZ190YWJsZV9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpOwordm9pZCB0eF9lbmdpbmVfbG9va3VwX3RibF9pbml0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpOworCisjZW5kaWYgLyogQUdOWF9UQUJMRV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FnbngveG1pdC5jIGIvZHJpdmVycy9zdGFnaW5nL2FnbngveG1pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMDE1MjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYWdueC94bWl0LmMKQEAgLTAsMCArMSw4MTkgQEAKKy8qKgorICogQWlyZ28gTUlNTyB3aXJlbGVzcyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgTGkgWWFuQm8gPGRyZWFtZmx5MjgxQGdtYWlsLmNvbT4KKworICogVGhhbmtzIGZvciBKZWZmIFdpbGxpYW1zIDxhbmdlbGJhbmVAZ21haWwuY29tPiBkbyByZXZlcnNlIGVuZ2luZWVyCisgKiB3b3JrcyBhbmQgcHVibGlzaGVkIHRoZSBTUEVDUyBhdCBodHRwOi8vYWlyZ28ud2R3Y29uc3VsdGluZy5uZXQvbXltb2luCisKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSAiYWdueC5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAicGh5LmgiCisKK3Vuc2lnbmVkIGludCByeF9mcmFtZV9jbnQgPSAwOworLy91bnNpZ25lZCBpbnQgbG9jYWxfdHhfc2VudF9jbnQgPSAwOworCitzdGF0aWMgaW5saW5lIHZvaWQgZGlzYWJsZV9yeF9lbmdpbmUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwlpb3dyaXRlMzIoMHgxMDAsIGN0bCArIEFHTlhfQ0lSX1JYQ1RMKTsKKwkvKiBXYWl0IGZvciBSWCBDb250cm9sIHRvIGhhdmUgdGhlIERpc2FibGUgUnggSW50ZXJydXB0ICgweDEwMCkgc2V0ICovCisJaW9yZWFkMzIoY3RsICsgQUdOWF9DSVJfUlhDVEwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZW5hYmxlX3J4X2VuZ2luZShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCWlvd3JpdGUzMigweDgwLCBjdGwgKyBBR05YX0NJUl9SWENUTCk7CisJaW9yZWFkMzIoY3RsICsgQUdOWF9DSVJfUlhDVEwpOworfQorCitpbmxpbmUgdm9pZCBkaXNhYmxlX3J4X2ludGVycnVwdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXUzMiByZWc7CisKKwlkaXNhYmxlX3J4X2VuZ2luZShwcml2KTsKKwlyZWcgPSBpb3JlYWQzMihjdGwgKyBBR05YX0NJUl9SWENGRyk7CisJcmVnICY9IH4weDIwOworCWlvd3JpdGUzMihyZWcsIGN0bCArIEFHTlhfQ0lSX1JYQ0ZHKTsKKwlpb3JlYWQzMihjdGwgKyBBR05YX0NJUl9SWENGRyk7Cit9CisKK2lubGluZSB2b2lkIGVuYWJsZV9yeF9pbnRlcnJ1cHQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl1MzIgcmVnOworCisJcmVnID0gaW9yZWFkMzIoY3RsICsgQUdOWF9DSVJfUlhDRkcpOworCXJlZyB8PSAweDIwOworCWlvd3JpdGUzMihyZWcsIGN0bCArIEFHTlhfQ0lSX1JYQ0ZHKTsKKwlpb3JlYWQzMihjdGwgKyBBR05YX0NJUl9SWENGRyk7CisJZW5hYmxlX3J4X2VuZ2luZShwcml2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ4X2Rlc2NfaW5pdChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCB1bnNpZ25lZCBpbnQgaWR4KQoreworCXN0cnVjdCBhZ254X2Rlc2MgKmRlc2MgPSBwcml2LT5yeC5kZXNjICsgaWR4OworCXN0cnVjdCBhZ254X2luZm8gKmluZm8gPSBwcml2LT5yeC5pbmZvICsgaWR4OworCisJbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOworCisJaW5mby0+ZG1hX2xlbiA9IElFRUU4MDIxMV9NQVhfUlRTX1RIUkVTSE9MRCArIHNpemVvZihzdHJ1Y3QgYWdueF9oZHIpOworCWluZm8tPnNrYiA9IGRldl9hbGxvY19za2IoaW5mby0+ZG1hX2xlbik7CisJaWYgKGluZm8tPnNrYiA9PSBOVUxMKQorCQlhZ254X2J1ZygicmVmaWxsIGVyciIpOworCisJaW5mby0+bWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBkZXYsIHNrYl90YWlsX3BvaW50ZXIoaW5mby0+c2tiKSwKKwkJCQkgICAgICAgaW5mby0+ZG1hX2xlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwltZW1zZXQoZGVzYywgMCwgc2l6ZW9mKCpkZXNjKSk7CisJZGVzYy0+ZG1hX2FkZHIgPSBjcHVfdG9fYmUzMihpbmZvLT5tYXBwaW5nKTsKKwkvKiBTZXQgdGhlIG93bmVyIHRvIHRoZSBjYXJkICovCisJZGVzYy0+ZnJhZyA9IGNwdV90b19iZTMyKGJlMzJfdG9fY3B1KGRlc2MtPmZyYWcpIHwgT1dORVIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnhfZGVzY19yZWluaXQoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IGlkeCkKK3sKKwlzdHJ1Y3QgYWdueF9pbmZvICppbmZvID0gcHJpdi0+cnguaW5mbyArIGlkeDsKKworCS8qIENhdXNlIGllZWU4MDIxMSB3aWxsIGZyZWUgdGhlIHNrYiBidWZmZXIsIHNvIHdlIG5lZWRuJ3QgdG8gZnJlZSBpdCBhZ2Fpbj8hICovCisJcGNpX3VubWFwX3NpbmdsZShwcml2LT5wZGV2LCBpbmZvLT5tYXBwaW5nLCBpbmZvLT5kbWFfbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCXJ4X2Rlc2NfaW5pdChwcml2LCBpZHgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnhfZGVzY19yZXVzaW5nKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCBpZHgpCit7CisJc3RydWN0IGFnbnhfZGVzYyAqZGVzYyA9IHByaXYtPnJ4LmRlc2MgKyBpZHg7CisJc3RydWN0IGFnbnhfaW5mbyAqaW5mbyA9IHByaXYtPnJ4LmluZm8gKyBpZHg7CisKKwltZW1zZXQoZGVzYywgMCwgc2l6ZW9mKCpkZXNjKSk7CisJZGVzYy0+ZG1hX2FkZHIgPSBjcHVfdG9fYmUzMihpbmZvLT5tYXBwaW5nKTsKKwkvKiBTZXQgdGhlIG93bmVyIHRvIHRoZSBjYXJkICovCisJZGVzYy0+ZnJhZyA9IGNwdV90b19iZTMyKGJlMzJfdG9fY3B1KGRlc2MtPmZyYWcpIHwgT1dORVIpOworfQorCitzdGF0aWMgdm9pZCByeF9kZXNjX2ZyZWUoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IGlkeCkKK3sKKwlzdHJ1Y3QgYWdueF9kZXNjICpkZXNjID0gcHJpdi0+cnguZGVzYyArIGlkeDsKKwlzdHJ1Y3QgYWdueF9pbmZvICppbmZvID0gcHJpdi0+cnguaW5mbyArIGlkeDsKKworCUJVR19PTighZGVzYyB8fCAhaW5mbyk7CisJaWYgKGluZm8tPm1hcHBpbmcpCisJCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGRldiwgaW5mby0+bWFwcGluZywgaW5mby0+ZG1hX2xlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwlpZiAoaW5mby0+c2tiKQorCQlkZXZfa2ZyZWVfc2tiKGluZm8tPnNrYik7CisJbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOworCW1lbXNldChkZXNjLCAwLCBzaXplb2YoKmRlc2MpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fdHhfZGVzY19mcmVlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsCisJCQkJICBzdHJ1Y3QgYWdueF9kZXNjICpkZXNjLCBzdHJ1Y3QgYWdueF9pbmZvICppbmZvKQoreworCUJVR19PTighZGVzYyB8fCAhaW5mbyk7CisJLyogVE9ETyBtYWtlIHN1cmUgbWFwcGluZywgc2tiIGFuZCBsZW4gYXJlIGNvbnNpc3RlbmN5ICovCisJaWYgKGluZm8tPm1hcHBpbmcpCisJCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGRldiwgaW5mby0+bWFwcGluZywKKwkJCQkgaW5mby0+ZG1hX2xlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJaWYgKGluZm8tPnR5cGUgPT0gUEFDS0VUKQorCQlkZXZfa2ZyZWVfc2tiKGluZm8tPnNrYik7CisKKwltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKCppbmZvKSk7CisJbWVtc2V0KGRlc2MsIDAsIHNpemVvZigqZGVzYykpOworfQorCitzdGF0aWMgdm9pZCB0eG1fZGVzY19mcmVlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCBpZHgpCit7CisJc3RydWN0IGFnbnhfZGVzYyAqZGVzYyA9IHByaXYtPnR4bS5kZXNjICsgaWR4OworCXN0cnVjdCBhZ254X2luZm8gKmluZm8gPSBwcml2LT50eG0uaW5mbyArIGlkeDsKKworCV9fdHhfZGVzY19mcmVlKHByaXYsIGRlc2MsIGluZm8pOworfQorCitzdGF0aWMgdm9pZCB0eGRfZGVzY19mcmVlKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCBpZHgpCit7CisJc3RydWN0IGFnbnhfZGVzYyAqZGVzYyA9IHByaXYtPnR4ZC5kZXNjICsgaWR4OworCXN0cnVjdCBhZ254X2luZm8gKmluZm8gPSBwcml2LT50eGQuaW5mbyArIGlkeDsKKworCV9fdHhfZGVzY19mcmVlKHByaXYsIGRlc2MsIGluZm8pOworfQorCitpbnQgZmlsbF9yaW5ncyhzdHJ1Y3QgYWdueF9wcml2ICpwcml2KQoreworCXZvaWQgX19pb21lbSAqY3RsID0gcHJpdi0+Y3RsOworCXVuc2lnbmVkIGludCBpOworCXUzMiByZWc7CisJQUdOWF9UUkFDRTsKKworCXByaXYtPnR4ZC5pZHhfc2VudCA9IHByaXYtPnR4bS5pZHhfc2VudCA9IDA7CisJcHJpdi0+cnguaWR4ID0gcHJpdi0+dHhtLmlkeCA9IHByaXYtPnR4ZC5pZHggPSAwOworCisJZm9yIChpID0gMDsgaSA8IHByaXYtPnJ4LnNpemU7IGkrKykKKwkJcnhfZGVzY19pbml0KHByaXYsIGkpOworCWZvciAoaSA9IDA7IGkgPCBwcml2LT50eG0uc2l6ZTsgaSsrKSB7CisJCW1lbXNldChwcml2LT50eG0uZGVzYyArIGksIDAsIHNpemVvZihzdHJ1Y3QgYWdueF9kZXNjKSk7CisJCW1lbXNldChwcml2LT50eG0uaW5mbyArIGksIDAsIHNpemVvZihzdHJ1Y3QgYWdueF9pbmZvKSk7CisJfQorCWZvciAoaSA9IDA7IGkgPCBwcml2LT50eGQuc2l6ZTsgaSsrKSB7CisJCW1lbXNldChwcml2LT50eGQuZGVzYyArIGksIDAsIHNpemVvZihzdHJ1Y3QgYWdueF9kZXNjKSk7CisJCW1lbXNldChwcml2LT50eGQuaW5mbyArIGksIDAsIHNpemVvZihzdHJ1Y3QgYWdueF9pbmZvKSk7CisJfQorCisJLyogRklYTUUgU2V0IHRoZSBjYXJkIFJYIFRYTSBhbmQgVFhEIGFkZHJlc3MgKi8KKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0NJUl9SWENNU1RBUlQsIHByaXYtPnJ4LmRtYSk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfUlhDTUVORCwgcHJpdi0+dHhtLmRtYSk7CisKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0NJUl9UWE1TVEFSVCwgcHJpdi0+dHhtLmRtYSk7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfVFhNRU5ELCBwcml2LT50eGQuZG1hKTsKKworCWFnbnhfd3JpdGUzMihjdGwsIEFHTlhfQ0lSX1RYRFNUQVJULCBwcml2LT50eGQuZG1hKTsKKwlhZ254X3dyaXRlMzIoY3RsLCBBR05YX0NJUl9UWERFTkQsIHByaXYtPnR4ZC5kbWEgKworCQkgICAgIHNpemVvZihzdHJ1Y3QgYWdueF9kZXNjKSAqIHByaXYtPnR4ZC5zaXplKTsKKworCS8qIEZJWE1FIFJlbGlucXVpc2ggY29udHJvbCBvZiByaW5ncyB0byBjYXJkICovCisJcmVnID0gYWdueF9yZWFkMzIoY3RsLCBBR05YX0NJUl9CTEtDVEwpOworCXJlZyAmPSB+MHg4MDA7CisJYWdueF93cml0ZTMyKGN0bCwgQUdOWF9DSVJfQkxLQ1RMLCByZWcpOworCXJldHVybiAwOworfSAvKiBmaWxsX3JpbmdzICovCisKK3ZvaWQgdW5maWxsX3JpbmdzKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgaTsKKwlBR05YX1RSQUNFOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCWZvciAoaSA9IDA7IGkgPCBwcml2LT5yeC5zaXplOyBpKyspCisJCXJ4X2Rlc2NfZnJlZShwcml2LCBpKTsKKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+dHhtLnNpemU7IGkrKykKKwkJdHhtX2Rlc2NfZnJlZShwcml2LCBpKTsKKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+dHhkLnNpemU7IGkrKykKKwkJdHhkX2Rlc2NfZnJlZShwcml2LCBpKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKK30KKworLyogRXh0cmFjdCB0aGUgYml0cmF0ZSBvdXQgb2YgYSBDQ0sgUExDUCBoZWFkZXIuCisgICBjb3B5IGZyb20gYmNtNDN4eCBkcml2ZXIgKi8KK3N0YXRpYyBpbmxpbmUgdTggYWdueF9wbGNwX2dldF9iaXRyYXRlX2NjayhfX2JlMzIgKnBoeWhkcl8xMWIpCit7CisJLyogRklYTUUgKi8KKwlzd2l0Y2ggKCoodTggKilwaHloZHJfMTFiKSB7CisJY2FzZSAweDBBOgorCQlyZXR1cm4gMDsKKwljYXNlIDB4MTQ6CisJCXJldHVybiAxOworCWNhc2UgMHgzNzoKKwkJcmV0dXJuIDI7CisJY2FzZSAweDZFOgorCQlyZXR1cm4gMzsKKwl9CisJYWdueF9idWcoIldyb25nIHBsY3AgcmF0ZSIpOworCXJldHVybiAwOworfQorCisvKiBGSVhNRSAqLworc3RhdGljIGlubGluZSB1OCBhZ254X3BsY3BfZ2V0X2JpdHJhdGVfb2ZkbShfX2JlMzIgKnBoeWhkcl8xMWcpCit7CisJdTggcmF0ZSA9ICoodTggKilwaHloZHJfMTFnICYgMHhGOworCisJcHJpbnRrKFBGWCAiRyBtb2RlIHJhdGUgaXMgMHgleFxuIiwgcmF0ZSk7CisJcmV0dXJuIHJhdGU7Cit9CisKKy8qIEZJWE1FICovCitzdGF0aWMgdm9pZCBnZXRfcnhfc3RhdHMoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgc3RydWN0IGFnbnhfaGRyICpoZHIsCisJCQkgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnN0YXQpCit7CisJdm9pZCBfX2lvbWVtICpjdGwgPSBwcml2LT5jdGw7CisJdTggKnJzc2k7CisJdTMyIG5vaXNlOworCS8qIEZJWE1FIGp1c3QgZm9yIHRlc3QgKi8KKwlpbnQgc25yID0gNDA7CQkvKiBzaWduYWwtdG8tbm9pc2UgcmF0aW8gKi8KKworCW1lbXNldChzdGF0LCAwLCBzaXplb2YoKnN0YXQpKTsKKwkvKiBSU1NJICovCisJcnNzaSA9ICh1OCAqKSZoZHItPnBoeV9zdGF0c19sbzsKKy8vCXN0YXQtPnNzaSA9IChyc3NpWzBdICsgcnNzaVsxXSArIHJzc2lbMl0pIC8gMzsKKwkvKiBOb2lzZSAqLworCW5vaXNlID0gaW9yZWFkMzIoY3RsICsgQUdOWF9HQ1JfTk9JU0UwKTsKKwlub2lzZSArPSBpb3JlYWQzMihjdGwgKyBBR05YX0dDUl9OT0lTRTEpOworCW5vaXNlICs9IGlvcmVhZDMyKGN0bCArIEFHTlhfR0NSX05PSVNFMik7CisJc3RhdC0+bm9pc2UgPSBub2lzZSAvIDM7CisJLyogU2lnbmFsIHF1YWxpdHkgKi8KKwkvL3NuciA9IHN0YXQtPnNzaSAtIHN0YXQtPm5vaXNlOworCWlmIChzbnIgPj0wICYmIHNuciA8IDQwKQorCQlzdGF0LT5zaWduYWwgPSA1ICogc25yIC8gMjsKKwllbHNlIGlmIChzbnIgPj0gNDApCisJCXN0YXQtPnNpZ25hbCA9IDEwMDsKKwllbHNlCisJCXN0YXQtPnNpZ25hbCA9IDA7CisKKworCWlmIChoZHItPl8xMWIwICYmICFoZHItPl8xMWcwKSB7CisJCXN0YXQtPnJhdGVfaWR4ID0gYWdueF9wbGNwX2dldF9iaXRyYXRlX2NjaygmaGRyLT5fMTFiMCk7CisJfSBlbHNlIGlmICghaGRyLT5fMTFiMCAmJiBoZHItPl8xMWcwKSB7CisJCXByaW50ayhQRlggIlJYOiBGb3VuZCBHIG1vZGUgcGFja2V0XG4iKTsKKwkJc3RhdC0+cmF0ZV9pZHggPSBhZ254X3BsY3BfZ2V0X2JpdHJhdGVfb2ZkbSgmaGRyLT5fMTFnMCk7CisJfSBlbHNlCisJCWFnbnhfYnVnKCJVbmtub3duIHBhY2tldHMgdHlwZSIpOworCisKKwlzdGF0LT5iYW5kID0gSUVFRTgwMjExX0JBTkRfMkdIWjsKKwlzdGF0LT5mcmVxID0gYWdueF9jaGFubmVsc1twcml2LT5jaGFubmVsIC0gMV0uY2VudGVyX2ZyZXE7CisvLwlzdGF0LT5hbnRlbm5hID0gMzsKKy8vCXN0YXQtPm1hY3RpbWUgPSBiZTMyX3RvX2NwdShoZHItPnRpbWVfc3RhbXApOworLy8Jc3RhdC0+Y2hhbm5lbCA9IHByaXYtPmNoYW5uZWw7CisKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNvbWJpbmVfaGRyX2ZyYWcoc3RydWN0IGllZWU4MDIxMV9oZHIgKmllZWVoZHIsCisJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdTE2IGZjdGw7CisJdW5zaWduZWQgaW50IGhkcmxlbjsKKworCWZjdGwgPSBsZTE2X3RvX2NwdShpZWVlaGRyLT5mcmFtZV9jb250cm9sKTsKKwloZHJsZW4gPSBpZWVlODAyMTFfaGRybGVuKGZjdGwpOworCS8qIEZJWE1FICovCisJaWYgKGhkcmxlbiA8ICgyKzIrNikvKm1pbmltdW0gaGRyKi8gfHwKKwkgICAgaGRybGVuID4gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfbWdtdCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiaGRyIGxlbiBpcyAlZFxuIiwgaGRybGVuKTsKKwkJYWdueF9idWcoIldyb25nIGllZWU4MDIxMSBoZHIgZGV0ZWN0ZWQiKTsKKwl9CisJc2tiX3B1c2goc2tiLCBoZHJsZW4pOworCW1lbWNweShza2ItPmRhdGEsIGllZWVoZHIsIGhkcmxlbik7Cit9IC8qIGNvbWJpbmVfaGRyX2ZyYWcgKi8KKworc3RhdGljIGlubGluZSBpbnQgYWdueF9wYWNrZXRfY2hlY2soc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgc3RydWN0IGFnbnhfaGRyICphZ254aGRyLAorCQkJCSAgICB1bnNpZ25lZCBwYWNrZXRfbGVuKQoreworCWlmIChhZ254X2dldF9iaXRzKENSQ19GQUlMLCBDUkNfRkFJTF9TSElGVCwgYmUzMl90b19jcHUoYWdueGhkci0+cmVnMSkpID09IDEpeworCQlwcmludGsoUEZYICJSWDogQ1JDIGNoZWNrIGZhaWxcbiIpOworCQlnb3RvIGRyb3A7CisJfQorCWlmIChwYWNrZXRfbGVuID4gMjA0OCkgeworCQlwcmludGsoUEZYICJSWDogVG9vIGxvbmcgcGFja2V0IGRldGVjdGVkXG4iKTsKKwkJZ290byBkcm9wOworCX0KKworCS8qIEZJWE1FIEp1c3QgdXNhYmxlIGZvciBQcm9taW91cyBNb2RlLCBmb3IgTWFuYWdlIG1vZGUgZXhjbHVkZSBGQ1MgKi8KKy8qIAlpZiAocGFja2V0X2xlbiAtIHNpemVvZigqYWdueGhkcikgPCBGQ1NfTEVOKSB7ICovCisvKiAJCXByaW50ayhQRlggIlJYOiBUb28gc2hvcnQgcGFja2V0IGRldGVjdGVkXG4iKTsgKi8KKy8qIAkJZ290byBkcm9wOyAqLworLyogCX0gKi8KKwlyZXR1cm4gMDsKK2Ryb3A6CisJcHJpdi0+c3RhdHMuZG90MTFGQ1NFcnJvckNvdW50Kys7CisJcmV0dXJuIC0xOworfQorCit2b2lkIGhhbmRsZV9yeF9pcnEoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyBzdGF0dXM7CisJdW5zaWduZWQgaW50IGxlbjsKKy8vCUFHTlhfVFJBQ0U7CisKKwlkbyB7CisJCXN0cnVjdCBhZ254X2Rlc2MgKmRlc2M7CisJCXUzMiBmcmFnOworCQlzdHJ1Y3QgYWdueF9pbmZvICppbmZvOworCQlzdHJ1Y3QgYWdueF9oZHIgKmhkcjsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJdW5zaWduZWQgaW50IGkgPSBwcml2LT5yeC5pZHggJSBwcml2LT5yeC5zaXplOworCisJCWRlc2MgPSBwcml2LT5yeC5kZXNjICsgaTsKKwkJZnJhZyA9IGJlMzJfdG9fY3B1KGRlc2MtPmZyYWcpOworCQlpZiAoZnJhZyAmIE9XTkVSKQorCQkJYnJlYWs7CisKKwkJaW5mbyA9IHByaXYtPnJ4LmluZm8gKyBpOworCQlza2IgPSBpbmZvLT5za2I7CisJCWhkciA9IChzdHJ1Y3QgYWdueF9oZHIgKikoc2tiLT5kYXRhKTsKKworCQlsZW4gPSAoZnJhZyAmIFBBQ0tFVF9MRU4pID4+IFBBQ0tFVF9MRU5fU0hJRlQ7CisJCWlmIChhZ254X3BhY2tldF9jaGVjayhwcml2LCBoZHIsIGxlbikgPT0gLTEpIHsKKyAJCQlyeF9kZXNjX3JldXNpbmcocHJpdiwgaSk7CisJCQljb250aW51ZTsKKwkJfQorCQlza2JfcHV0KHNrYiwgbGVuKTsKKworCQlkbyB7CisJCQl1MTYgZmN0bDsKKwkJCWZjdGwgPSBsZTE2X3RvX2NwdSgoKHN0cnVjdCBpZWVlODAyMTFfaGRyICopaGRyLT5tYWNfaGRyKS0+ZnJhbWVfY29udHJvbCk7CisJCQlpZiAoKGZjdGwgJiBJRUVFODAyMTFfRkNUTF9TVFlQRSkgIT0gSUVFRTgwMjExX1NUWVBFX0JFQUNPTikvLyAmJiAhKGZjdGwgJiBJRUVFODAyMTFfU1RZUEVfQkVBQ09OKSkKKwkJCQlkdW1wX2llZWU4MDIxMV9oZHIoKHN0cnVjdCBpZWVlODAyMTFfaGRyICopaGRyLT5tYWNfaGRyLCAiUlgiKTsKKwkJfSB3aGlsZSAoMCk7CisKKwkJaWYgKGhkci0+XzExYjAgJiYgIWhkci0+XzExZzApIHsKKy8qIAkJCWludCBqOyAqLworLyogCQkJdTE2IGZjdGwgPSBsZTE2X3RvX2NwdSgoKHN0cnVjdCBpZWVlODAyMTFfaGRyICopaGRyLT5tYWNfaGRyKSAqLworLyogCQkJCQkgICAgICAgLT5mcmFtZV9jb250cm9sKTsgKi8KKy8qIAkJCWlmICggKGZjdGwgJiBJRUVFODAyMTFfRkNUTF9GVFlQRSkgPT0gIElFRUU4MDIxMV9GVFlQRV9EQVRBKSB7ICovCisvKiAJCQkJYWdueF9wcmludF9yeF9oZHIoaGRyKTsgKi8KKy8vIAkJCQlhZ254X3ByaW50X3N0YShwcml2LCBCU1NJRF9TVEFJRCk7CisvKiAJCQkJZm9yIChqID0gMDsgaiA8IDg7IGorKykgKi8KKy8qIAkJCQkJYWdueF9wcmludF9zdGFfdHhfd3EocHJpdiwgQlNTSURfU1RBSUQsIGopOwkJICovCisvKiAJCQl9ICovCisKKwkJCWdldF9yeF9zdGF0cyhwcml2LCBoZHIsICZzdGF0dXMpOworCQkJc2tiX3B1bGwoc2tiLCBzaXplb2YoKmhkcikpOworCQkJY29tYmluZV9oZHJfZnJhZygoc3RydWN0IGllZWU4MDIxMV9oZHIgKiloZHItPm1hY19oZHIsIHNrYik7CisJCX0gZWxzZSBpZiAoIWhkci0+XzExYjAgJiYgaGRyLT5fMTFnMCkgeworLy8JCQlpbnQgajsKKwkJCWFnbnhfcHJpbnRfcnhfaGRyKGhkcik7CisJCQlhZ254X3ByaW50X3N0YShwcml2LCBCU1NJRF9TVEFJRCk7CisvLwkJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspCisJCQlhZ254X3ByaW50X3N0YV90eF93cShwcml2LCBCU1NJRF9TVEFJRCwgMCk7CisKKwkJCXByaW50X2hleF9kdW1wX2J5dGVzKCJhZ254OiBSWF9QQUNLRVQ6ICIsIERVTVBfUFJFRklYX05PTkUsCisJCQkJCSAgICAgc2tiLT5kYXRhLCBza2ItPmxlbiArIDgpOworCisvLwkJCWlmIChhZ254X3BsY3BfZ2V0X2JpdHJhdGVfb2ZkbSgmaGRyLT5fMTFnMCkgPT0gMCkKKwkJCWdldF9yeF9zdGF0cyhwcml2LCBoZHIsICZzdGF0dXMpOworCQkJc2tiX3B1bGwoc2tiLCBzaXplb2YoKmhkcikpOworCQkJY29tYmluZV9oZHJfZnJhZygoc3RydWN0IGllZWU4MDIxMV9oZHIgKikKKwkJCQkJICgodm9pZCAqKSZoZHItPm1hY19oZHIpLCBza2IpOworLy8JCQlkdW1wX2llZWU4MDIxMV9oZHIoKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhLCAiUlggRyIpOworCQl9IGVsc2UKKwkJCWFnbnhfYnVnKCJVbmtub3duIHBhY2tldHMgdHlwZSIpOworCQlpZWVlODAyMTFfcnhfaXJxc2FmZShwcml2LT5odywgc2tiLCAmc3RhdHVzKTsKKwkJcnhfZGVzY19yZWluaXQocHJpdiwgaSk7CisKKwl9IHdoaWxlICggcHJpdi0+cnguaWR4KysgKTsKK30gLyogaGFuZGxlX3J4X2lycSAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgaGFuZGxlX3R4X2lycShzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCBzdHJ1Y3QgYWdueF9yaW5nICpyaW5nKQoreworCXN0cnVjdCBhZ254X2Rlc2MgKmRlc2M7CisJc3RydWN0IGFnbnhfaW5mbyAqaW5mbzsKKwl1bnNpZ25lZCBpbnQgaWR4OworCisJZm9yIChpZHggPSByaW5nLT5pZHhfc2VudDsgaWR4IDwgcmluZy0+aWR4OyBpZHgrKykgeworCQl1bnNpZ25lZCBpbnQgaSA9IGlkeCAlIHJpbmctPnNpemU7CisJCXUzMiAgZnJhZzsKKworCQlkZXNjID0gcmluZy0+ZGVzYyArIGk7CisJCWluZm8gPSByaW5nLT5pbmZvICsgaTsKKworCQlmcmFnID0gYmUzMl90b19jcHUoZGVzYy0+ZnJhZyk7CisJCWlmIChmcmFnICYgT1dORVIpIHsKKwkJCWlmIChpbmZvLT50eXBlID09IEhFQURFUikKKwkJCQlicmVhazsKKwkJCWVsc2UKKwkJCQlhZ254X2J1ZygiVFggZXJyb3IiKTsKKwkJfQorCisJCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGRldiwgaW5mby0+bWFwcGluZywgaW5mby0+ZG1hX2xlbiwgUENJX0RNQV9UT0RFVklDRSk7CisKKwkJZG8geworLy8JCQlpbnQgajsKKwkJCXNpemVfdCBsZW47CisJCQlsZW4gPSBpbmZvLT5za2ItPmxlbiAtIHNpemVvZihzdHJ1Y3QgYWdueF9oZHIpICsgaW5mby0+aGRyX2xlbjsKKwkJCS8vCWlmIChsZW4gPT0gNjE0KSB7CisvLwkJCQlhZ254X3ByaW50X2Rlc2MoZGVzYyk7CisJCQkJaWYgKGluZm8tPnR5cGUgPT0gUEFDS0VUKSB7CisvLwkJCQkJYWdueF9wcmludF90eF9oZHIoKHN0cnVjdCBhZ254X2hkciAqKWluZm8tPnNrYi0+ZGF0YSk7CisvKiAJCQkJCWFnbnhfcHJpbnRfc3RhX3Bvd2VyKHByaXYsIExPQ0FMX1NUQUlEKTsgKi8KKy8qIAkJCQkJYWdueF9wcmludF9zdGEocHJpdiwgTE9DQUxfU1RBSUQpOyAqLworLyogLy8JCQkJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspICovCisvKiAJCQkJCWFnbnhfcHJpbnRfc3RhX3R4X3dxKHByaXYsIExPQ0FMX1NUQUlELCAwKTsgKi8KKy8vCQkJCQlhZ254X3ByaW50X3N0YV9wb3dlcihwcml2LCBCU1NJRF9TVEFJRCk7CisvLwkJCQkJYWdueF9wcmludF9zdGEocHJpdiwgQlNTSURfU1RBSUQpOworLy8JCQkJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspCisvLwkJCQkJYWdueF9wcmludF9zdGFfdHhfd3EocHJpdiwgQlNTSURfU1RBSUQsIDApOworCQkJCX0KKy8vCQkJfQorCQl9IHdoaWxlICgwKTsKKworCQlpZiAoaW5mby0+dHlwZSA9PSBQQUNLRVQpIHsKKy8vCQkJZHVtcF90eG1fcmVnaXN0ZXJzKHByaXYpOworLy8JCQlkdW1wX3J4bV9yZWdpc3RlcnMocHJpdik7CisvLwkJCWR1bXBfYm1fcmVnaXN0ZXJzKHByaXYpOworLy8JCQlkdW1wX2Npcl9yZWdpc3RlcnMocHJpdik7CisJCX0KKworCQlpZiAoaW5mby0+dHlwZSA9PSBQQUNLRVQpIHsKKy8vCQkJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKwkJCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqdHhpID0gSUVFRTgwMjExX1NLQl9DQihpbmZvLT5za2IpOworCisJCQlza2JfcHVsbChpbmZvLT5za2IsIHNpemVvZihzdHJ1Y3QgYWdueF9oZHIpKTsKKwkJCW1lbWNweShza2JfcHVzaChpbmZvLT5za2IsIGluZm8tPmhkcl9sZW4pLCAmaW5mby0+aGRyLCBpbmZvLT5oZHJfbGVuKTsKKworLy8JCQlkdW1wX2llZWU4MDIxMV9oZHIoKHN0cnVjdCBpZWVlODAyMTFfaGRyICopaW5mby0+c2tiLT5kYXRhLCAiVFhfSEFORExFIik7CisvKiAJCQlwcmludF9oZXhfZHVtcF9ieXRlcygiYWdueDogVFhfSEFORExFOiAiLCBEVU1QX1BSRUZJWF9OT05FLCAqLworLyogCQkJCQkgICAgIGluZm8tPnNrYi0+ZGF0YSwgaW5mby0+c2tiLT5sZW4pOyAqLworCisJCQlpZiAoISh0eGktPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9OT19BQ0spKQorCQkJCXR4aS0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1NUQVRfQUNLOworCisJCQlpZWVlODAyMTFfdHhfc3RhdHVzX2lycXNhZmUocHJpdi0+aHcsIGluZm8tPnNrYik7CisKKworLyogCQkJCWluZm8tPnR4X3N0YXR1cy5xdWV1ZV9udW1iZXIgPSAocmluZy0+c2l6ZSAtIGkpIC8gMjsgKi8KKy8qIAkJCQlpZWVlODAyMTFfdHhfc3RhdHVzX2lycXNhZmUocHJpdi0+aHcsIGluZm8tPnNrYiwgJihpbmZvLT50eF9zdGF0dXMpKTsgKi8KKy8qIAkJCX0gZWxzZSAqLworLyogCQkJCWRldl9rZnJlZV9za2JfaXJxKGluZm8tPnNrYik7ICovCisgCQl9CisJCW1lbXNldChkZXNjLCAwLCBzaXplb2YoKmRlc2MpKTsKKwkJbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOworCX0KKworCXJpbmctPmlkeF9zZW50ID0gaWR4OworCS8qIFRPRE8gZmlsbCB0aGUgcHJpdi0+bG93X2xldmVsX3N0YXRzICovCisKKwkvKiBpZWVlODAyMTFfd2FrZV9xdWV1ZShwcml2LT5odywgMCk7ICovCit9CisKK3ZvaWQgaGFuZGxlX3R4bV9pcnEoc3RydWN0IGFnbnhfcHJpdiAqcHJpdikKK3sKKwloYW5kbGVfdHhfaXJxKHByaXYsICZwcml2LT50eG0pOworfQorCit2b2lkIGhhbmRsZV90eGRfaXJxKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisJaGFuZGxlX3R4X2lycShwcml2LCAmcHJpdi0+dHhkKTsKK30KKwordm9pZCBoYW5kbGVfb3RoZXJfaXJxKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpCit7CisvLwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl1MzIgc3RhdHVzID0gcHJpdi0+aXJxX3N0YXR1czsKKwl2b2lkIF9faW9tZW0gKmN0bCA9IHByaXYtPmN0bDsKKwl1MzIgcmVnOworCisJaWYgKHN0YXR1cyAmIElSUV9UWF9CRUFDT04pIHsKKwkJaW93cml0ZTMyKElSUV9UWF9CRUFDT04sIGN0bCArIEFHTlhfSU5UX1NUQVQpOworCQlwcmludGsoUEZYICJJUlE6IFRYIEJlYWNvbiBjb250cm9sIGlzIDBYJS44WFxuIiwgaW9yZWFkMzIoY3RsICsgQUdOWF9UWE1fQkVBQ09OX0NUTCkpOworCQlwcmludGsoUEZYICJJUlE6IFRYIEJlYWNvbiByeCBmcmFtZSBudW06ICVkXG4iLCByeF9mcmFtZV9jbnQpOworCX0KKwlpZiAoc3RhdHVzICYgSVJRX1RYX1JFVFJZKSB7CisJCXJlZyA9IGlvcmVhZDMyKGN0bCArIEFHTlhfVFhNX1JFVFJZU1RBSUQpOworCQlwcmludGsoUEZYICJJUlE6IFRYIFJldHJ5LCBSRVRSWSBTVEEgSUQgaXMgJXhcbiIsIHJlZyk7CisJfQorCWlmIChzdGF0dXMgJiBJUlFfVFhfQUNUSVZJVFkpCisJCXByaW50ayhQRlggIklSUTogVFggQWN0aXZpdHlcbiIpOworCWlmIChzdGF0dXMgJiBJUlFfUlhfQUNUSVZJVFkpCisJCXByaW50ayhQRlggIklSUTogUlggQWN0aXZpdHlcbiIpOworCWlmIChzdGF0dXMgJiBJUlFfUlhfWCkKKwkJcHJpbnRrKFBGWCAiSVJROiBSWCBYXG4iKTsKKwlpZiAoc3RhdHVzICYgSVJRX1JYX1kpIHsKKwkJcmVnID0gaW9yZWFkMzIoY3RsICsgQUdOWF9JTlRfTUFTSyk7CisJCXJlZyAmPSB+SVJRX1JYX1k7CisJCWlvd3JpdGUzMihyZWcsIGN0bCArIEFHTlhfSU5UX01BU0spOworCQlpb3dyaXRlMzIoSVJRX1JYX1ksIGN0bCArIEFHTlhfSU5UX1NUQVQpOworCQlwcmludGsoUEZYICJJUlE6IFJYIFlcbiIpOworCX0KKwlpZiAoc3RhdHVzICYgSVJRX1JYX0hBU0hISVQpICB7CisJCXJlZyA9IGlvcmVhZDMyKGN0bCArIEFHTlhfSU5UX01BU0spOworCQlyZWcgJj0gfklSUV9SWF9IQVNISElUOworCQlpb3dyaXRlMzIocmVnLCBjdGwgKyBBR05YX0lOVF9NQVNLKTsKKwkJaW93cml0ZTMyKElSUV9SWF9IQVNISElULCBjdGwgKyBBR05YX0lOVF9TVEFUKTsKKwkJcHJpbnRrKFBGWCAiSVJROiBSWCBIYXNoIEhpdFxuIik7CisKKwl9CisJaWYgKHN0YXR1cyAmIElSUV9SWF9GUkFNRSkgeworCQlyZWcgPSBpb3JlYWQzMihjdGwgKyBBR05YX0lOVF9NQVNLKTsKKwkJcmVnICY9IH5JUlFfUlhfRlJBTUU7CisJCWlvd3JpdGUzMihyZWcsIGN0bCArIEFHTlhfSU5UX01BU0spOworCQlpb3dyaXRlMzIoSVJRX1JYX0ZSQU1FLCBjdGwgKyBBR05YX0lOVF9TVEFUKTsKKwkJcHJpbnRrKFBGWCAiSVJROiBSWCBGcmFtZVxuIik7CisgCQlyeF9mcmFtZV9jbnQrKzsKKwl9CisJaWYgKHN0YXR1cyAmIElSUV9FUlJfSU5UKSB7CisJCWlvd3JpdGUzMihJUlFfRVJSX0lOVCwgY3RsICsgQUdOWF9JTlRfU1RBVCk7CisvLwkJYWdueF9od19yZXNldChwcml2KTsKKwkJcHJpbnRrKFBGWCAiSVJROiBFcnJvciBJbnRlcnJ1cHRcbiIpOworCX0KKwlpZiAoc3RhdHVzICYgSVJRX1RYX1FVRV9GVUxMKQorCQlwcmludGsoUEZYICJJUlE6IFRYIFdvcmtxdWV1ZSBGdWxsXG4iKTsKKwlpZiAoc3RhdHVzICYgSVJRX0JBTkRNQU5fRVJSKQorCQlwcmludGsoUEZYICJJUlE6IEJhbmR3aWR0aCBNYW5hZ2VtZW50IEVycm9yXG4iKTsKKwlpZiAoc3RhdHVzICYgSVJRX1RYX0RJU0FCTEUpCisJCXByaW50ayhQRlggIklSUTogVFggRGlzYWJsZVxuIik7CisJaWYgKHN0YXR1cyAmIElSUV9SWF9JVkFTRVNLRVkpCisJCXByaW50ayhQRlggIklSUTogUlggSW52YWxpZCBTZXNzaW9uIEtleVxuIik7CisJaWYgKHN0YXR1cyAmIElSUV9SRVBfVEhISVQpCisJCXByaW50ayhQRlggIklSUTogUmVwbGF5IFRocmVzaG9sZCBIaXRcbiIpOworCWlmIChzdGF0dXMgJiBJUlFfVElNRVIxKQorCQlwcmludGsoUEZYICJJUlE6IFRpbWVyMVxuIik7CisJaWYgKHN0YXR1cyAmIElSUV9USU1FUl9DTlQpCisJCXByaW50ayhQRlggIklSUTogVGltZXIgQ291bnRcbiIpOworCWlmIChzdGF0dXMgJiBJUlFfUEhZX0ZBU1RJTlQpCisJCXByaW50ayhQRlggIklSUTogUGh5IEZhc3QgSW50ZXJydXB0XG4iKTsKKwlpZiAoc3RhdHVzICYgSVJRX1BIWV9TTE9XSU5UKQorCQlwcmludGsoUEZYICJJUlE6IFBoeSBTbG93IEludGVycnVwdFxuIik7CisJaWYgKHN0YXR1cyAmIElSUV9PVEhFUikKKwkJcHJpbnRrKFBGWCAiSVJROiAweDgwMDAwMDAwXG4iKTsKK30gLyogaGFuZGxlX290aGVyX2lycSAqLworCisKK3N0YXRpYyBpbmxpbmUgdm9pZCByb3V0ZV9mbGFnX3NldChzdHJ1Y3QgYWdueF9oZHIgKnR4aGRyKQoreworLy8JdTMyIHJlZyA9IDA7CisKKwkvKiBGSVhNRSAqLworLyogIAlyZWcgPSAoMHg3IDw8IFJPVVRFX0NPTVBSRVNTSU9OX1NISUZUKSAmIFJPVVRFX0NPTVBSRVNTSU9OOyAqLworLyogCXR4aGRyLT5yZWc1ID0gY3B1X3RvX2JlMzIocmVnKTsgKi8KKyAJdHhoZHItPnJlZzUgPSAoMHhhIDw8IDB4MCkgfCAoMHg3IDw8IDB4MTgpOworLy8gCXR4aGRyLT5yZWc1ID0gY3B1X3RvX2JlMzIoKDB4YSA8PCAweDApIHwgKDB4NyA8PCAweDE4KSk7CisvLyAJdHhoZHItPnJlZzUgPSBjcHVfdG9fYmUzMigweDcgPDwgMHgwKTsKK30KKworLyogUmV0dXJuIDAgaWYgbm8gbWF0Y2ggKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGdldF9wb3dlcl9sZXZlbCh1bnNpZ25lZCBpbnQgcmF0ZSwgdW5zaWduZWQgaW50IGFudGVubmFzX251bSkKK3sKKwl1bnNpZ25lZCBpbnQgcG93ZXJfbGV2ZWw7CisKKwlzd2l0Y2ggKHJhdGUpIHsKKwljYXNlIDEwOgorCWNhc2UgMjA6CisJY2FzZSA1NToKKwljYXNlIDYwOgorCWNhc2UgOTA6CisJY2FzZSAxMjA6IHBvd2VyX2xldmVsID0gMjI7IGJyZWFrOworCWNhc2UgMTgwOiBwb3dlcl9sZXZlbCA9IDE5OyBicmVhazsKKwljYXNlIDI0MDogcG93ZXJfbGV2ZWwgPSAxODsgYnJlYWs7CisJY2FzZSAzNjA6IHBvd2VyX2xldmVsID0gMTY7IGJyZWFrOworCWNhc2UgNDgwOiBwb3dlcl9sZXZlbCA9IDE1OyBicmVhazsKKwljYXNlIDU0MDogcG93ZXJfbGV2ZWwgPSAxNDsgYnJlYWs7CisJZGVmYXVsdDoKKwkJYWdueF9idWcoIkVycm9yIHJhdGUgc2V0dGluZ1xuIik7CisJfQorCisJaWYgKHBvd2VyX2xldmVsICYmIChhbnRlbm5hc19udW0gPT0gMikpCisJCXBvd2VyX2xldmVsIC09IDM7CisKKwlyZXR1cm4gcG93ZXJfbGV2ZWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmaWxsX2FnbnhfaGRyKHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHN0cnVjdCBhZ254X2luZm8gKnR4X2luZm8pCit7CisJc3RydWN0IGFnbnhfaGRyICp0eGhkciA9IChzdHJ1Y3QgYWdueF9oZHIgKil0eF9pbmZvLT5za2ItPmRhdGE7CisJc2l6ZV90IGxlbjsKKwl1MTYgZmMgPSBsZTE2X3RvX2NwdSgqKF9fbGUxNiAqKSZ0eF9pbmZvLT5oZHIpOworCXUzMiByZWc7CisKKwltZW1zZXQodHhoZHIsIDAsIHNpemVvZigqdHhoZHIpKTsKKworLy8JcmVnID0gYWdueF9zZXRfYml0cyhTVEFUSU9OX0lELCBTVEFUSU9OX0lEX1NISUZULCBMT0NBTF9TVEFJRCk7CisJcmVnID0gYWdueF9zZXRfYml0cyhTVEFUSU9OX0lELCBTVEFUSU9OX0lEX1NISUZULCBCU1NJRF9TVEFJRCk7CisJcmVnIHw9IGFnbnhfc2V0X2JpdHMoV09SS1FVRVVFX0lELCBXT1JLUVVFVUVfSURfU0hJRlQsIDApOworCXR4aGRyLT5yZWc0ID0gY3B1X3RvX2JlMzIocmVnKTsKKworCS8qIFNldCB0aGUgSGFyZHdhcmUgU2VxdWVuY2UgTnVtYmVyIHRvIDE/ICovCisJcmVnID0gYWdueF9zZXRfYml0cyhTRVFVRU5DRV9OVU1CRVIsIFNFUVVFTkNFX05VTUJFUl9TSElGVCwgMCk7CisvLwlyZWcgPSBhZ254X3NldF9iaXRzKFNFUVVFTkNFX05VTUJFUiwgU0VRVUVOQ0VfTlVNQkVSX1NISUZULCAxKTsKKwlyZWcgfD0gYWdueF9zZXRfYml0cyhNQUNfSERSX0xFTiwgTUFDX0hEUl9MRU5fU0hJRlQsIHR4X2luZm8tPmhkcl9sZW4pOworCXR4aGRyLT5yZWcxID0gY3B1X3RvX2JlMzIocmVnKTsKKwkvKiBTZXQgdGhlIGFnbnhfaGRyJ3MgTUFDIGhlYWRlciAqLworCW1lbWNweSh0eGhkci0+bWFjX2hkciwgJnR4X2luZm8tPmhkciwgdHhfaW5mby0+aGRyX2xlbik7CisKKwlyZWcgPSBhZ254X3NldF9iaXRzKEFDSywgQUNLX1NISUZULCAxKTsKKy8vCXJlZyA9IGFnbnhfc2V0X2JpdHMoQUNLLCBBQ0tfU0hJRlQsIDApOworCXJlZyB8PSBhZ254X3NldF9iaXRzKE1VTFRJQ0FTVCwgTVVMVElDQVNUX1NISUZULCAwKTsKKy8vCXJlZyB8PSBhZ254X3NldF9iaXRzKE1VTFRJQ0FTVCwgTVVMVElDQVNUX1NISUZULCAxKTsKKwlyZWcgfD0gYWdueF9zZXRfYml0cyhSRUxBWSwgUkVMQVlfU0hJRlQsIDApOworCXJlZyB8PSBhZ254X3NldF9iaXRzKFRNLCBUTV9TSElGVCwgMCk7CisJdHhoZHItPnJlZzAgPSBjcHVfdG9fYmUzMihyZWcpOworCisJLyogU2V0IHRoZSBsb25nIGFuZCBzaG9ydCByZXRyeSBsaW1pdHMgKi8KKyAJdHhoZHItPnR4LnNob3J0X3JldHJ5X2xpbWl0ID0gdHhfaW5mby0+dHhpLT5jb250cm9sLnJhdGVzWzBdLmNvdW50OworIAl0eGhkci0+dHgubG9uZ19yZXRyeV9saW1pdCA9IHR4X2luZm8tPnR4aS0+Y29udHJvbC5yYXRlc1swXS5jb3VudDsKKworCS8qIEZJWE1FICovCisJbGVuID0gdHhfaW5mby0+c2tiLT5sZW4gLSBzaXplb2YoKnR4aGRyKSArIHR4X2luZm8tPmhkcl9sZW4gKyBGQ1NfTEVOOworCWlmIChmYyAmIElFRUU4MDIxMV9GQ1RMX1BST1RFQ1RFRCkKKwkJbGVuICs9IDg7CisJbGVuID0gMjM5ODsKKwlyZWcgPSBhZ254X3NldF9iaXRzKEZSQUdfU0laRSwgRlJBR19TSVpFX1NISUZULCBsZW4pOworCWxlbiA9IHR4X2luZm8tPnNrYi0+bGVuIC0gc2l6ZW9mKCp0eGhkcik7CisJcmVnIHw9IGFnbnhfc2V0X2JpdHMoUEFZTE9BRF9MRU4sIFBBWUxPQURfTEVOX1NISUZULCBsZW4pOworCXR4aGRyLT5yZWczID0gY3B1X3RvX2JlMzIocmVnKTsKKworCXJvdXRlX2ZsYWdfc2V0KHR4aGRyKTsKK30gLyogZmlsbF9oZHIgKi8KKworc3RhdGljIHZvaWQgdHhtX3Bvd2VyX3NldChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LAorCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKnR4aSkKK3sKKwlzdHJ1Y3QgYWdueF9zdGFfcG93ZXIgcG93ZXI7CisJdTMyIHJlZzsKKworCS8qIEZJWE1FICovCisJaWYgKHR4aS0+Y29udHJvbC5yYXRlc1swXS5pZHggPCAwKSB7CisJCS8qIEZvciBCIG1vZGUgU2hvcnQgUHJlYW1ibGUgKi8KKwkJcmVnID0gYWdueF9zZXRfYml0cyhQSFlfTU9ERSwgUEhZX01PREVfU0hJRlQsIEFHTlhfTU9ERV84MDIxMUJfU0hPUlQpOworLy8JCWNvbnRyb2wtPnR4X3JhdGUgPSAtY29udHJvbC0+dHhfcmF0ZTsKKwl9IGVsc2UKKwkJcmVnID0gYWdueF9zZXRfYml0cyhQSFlfTU9ERSwgUEhZX01PREVfU0hJRlQsIEFHTlhfTU9ERV84MDIxMUcpOworLy8JCXJlZyA9IGFnbnhfc2V0X2JpdHMoUEhZX01PREUsIFBIWV9NT0RFX1NISUZULCBBR05YX01PREVfODAyMTFCX0xPTkcpOworCXJlZyB8PSBhZ254X3NldF9iaXRzKFNJR05BTCwgU0lHTkFMX1NISUZULCAweEIpOworCXJlZyB8PSBhZ254X3NldF9iaXRzKFJBVEUsIFJBVEVfU0hJRlQsIDB4Qik7CisvLwlyZWcgfD0gYWdueF9zZXRfYml0cyhQT1dFUl9MRVZFTCwgUE9XRVJfTEVWRUxfU0hJRlQsIDE1KTsKKwlyZWcgfD0gYWdueF9zZXRfYml0cyhQT1dFUl9MRVZFTCwgUE9XRVJfTEVWRUxfU0hJRlQsIDIwKTsKKwkvKiBpZiByYXRlIDwgMTFNIHNldCBpdCB0byAwICovCisJcmVnIHw9IGFnbnhfc2V0X2JpdHMoTlVNX1RSQU5TTUlUVEVSUywgTlVNX1RSQU5TTUlUVEVSU19TSElGVCwgMSk7CisvLwlyZWcgfD0gYWdueF9zZXRfYml0cyhFRENGLCBFRENGX1NISUZULCAxKTsKKy8vCXJlZyB8PSBhZ254X3NldF9iaXRzKFRJRlMsIFRJRlNfU0hJRlQsIDEpOworCisJcG93ZXIucmVnID0gcmVnOworLy8JcG93ZXIucmVnID0gY3B1X3RvX2xlMzIocmVnKTsKKworLy8Jc2V0X3N0YV9wb3dlcihwcml2LCAmcG93ZXIsIExPQ0FMX1NUQUlEKTsKKwlzZXRfc3RhX3Bvd2VyKHByaXYsICZwb3dlciwgQlNTSURfU1RBSUQpOworfQorCitzdGF0aWMgaW5saW5lIGludCB0eF9wYWNrZXRfY2hlY2soc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1bnNpZ25lZCBpbnQgaWVlZV9sZW4gPSBpZWVlODAyMTFfZ2V0X2hkcmxlbl9mcm9tX3NrYihza2IpOworCWlmIChza2ItPmxlbiA+IDIwNDgpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAibGVuZ3RoIGlzICVkXG4iLCBza2ItPmxlbik7CisJCWFnbnhfYnVnKCJUb28gbG9uZyBUWCBza2IiKTsKKwkJcmV0dXJuIC0xOworCX0KKwkvKiBGSVhNRSAqLworCWlmIChza2ItPmxlbiA9PSBpZWVlX2xlbikgeworCQlwcmludGsoUEZYICJBIHN0cmFuZ2UgVFggcGFja2V0XG4iKTsKKwkJcmV0dXJuIC0xOworCQkvKiB0eF9mYWlsZV9pcnFzYWZlKCk7ICovCisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fYWdueF90eChzdHJ1Y3QgYWdueF9wcml2ICpwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICAgIHN0cnVjdCBhZ254X3JpbmcgKnJpbmcpCit7CisJc3RydWN0IGFnbnhfZGVzYyAqaGRyX2Rlc2MsICpmcmFnX2Rlc2M7CisJc3RydWN0IGFnbnhfaW5mbyAqaGRyX2luZm8sICpmcmFnX2luZm87CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICp0eGkgPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgaTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwkvKiBUaGUgUlggaW50ZXJydXB0IG5lZWQgYmUgRGlzYWJsZSB1bnRpbCB0aGlzIFRYIHBhY2tldAorCSAgIGlzIGhhbmRsZWQgaW4gdGhlIG5leHQgdHggaW50ZXJydXB0ICovCisJZGlzYWJsZV9yeF9pbnRlcnJ1cHQocHJpdik7CisKKwlpID0gcmluZy0+aWR4OworCXJpbmctPmlkeCArPSAyOworLyogICAJaWYgKHByaXYtPnR4bV9pZHggLSBwcml2LT50eG1faWR4X3NlbnQgPT0gQUdOWF9UWE1fUklOR19TSVpFIC0gMikgKi8KKy8qIAkJaWVlZTgwMjExX3N0b3BfcXVldWUocHJpdi0+aHcsIDApOyAqLworCisJLyogU2V0IGFnbnggaGVhZGVyJ3MgaW5mbyBhbmQgZGVzYyAqLworCWkgJT0gcmluZy0+c2l6ZTsKKwloZHJfZGVzYyA9IHJpbmctPmRlc2MgKyBpOworCWhkcl9pbmZvID0gcmluZy0+aW5mbyArIGk7CisJaGRyX2luZm8tPmhkcl9sZW4gPSBpZWVlODAyMTFfZ2V0X2hkcmxlbl9mcm9tX3NrYihza2IpOworCW1lbWNweSgmaGRyX2luZm8tPmhkciwgc2tiLT5kYXRhLCBoZHJfaW5mby0+aGRyX2xlbik7CisKKwkvKiBBZGQgdGhlIGFnbnggaGVhZGVyIHRvIHRoZSBmcm9udCBvZiB0aGUgU0tCICovCisJc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IGFnbnhfaGRyKSAtIGhkcl9pbmZvLT5oZHJfbGVuKTsKKworCWhkcl9pbmZvLT50eGkgPSB0eGk7CisJaGRyX2luZm8tPmRtYV9sZW4gPSBzaXplb2Yoc3RydWN0IGFnbnhfaGRyKTsKKwloZHJfaW5mby0+c2tiID0gc2tiOworCWhkcl9pbmZvLT50eXBlID0gSEVBREVSOworCWZpbGxfYWdueF9oZHIocHJpdiwgaGRyX2luZm8pOworCWhkcl9pbmZvLT5tYXBwaW5nID0gcGNpX21hcF9zaW5nbGUocHJpdi0+cGRldiwgc2tiLT5kYXRhLAorCQkJCQkgICBoZHJfaW5mby0+ZG1hX2xlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJZG8geworCQl1MzIgZnJhZyA9IDA7CisJCWZyYWcgfD0gYWdueF9zZXRfYml0cyhGSVJTVF9GUkFHLCBGSVJTVF9GUkFHX1NISUZULCAxKTsKKwkJZnJhZyB8PSBhZ254X3NldF9iaXRzKExBU1RfRlJBRywgTEFTVF9GUkFHX1NISUZULCAwKTsKKwkJZnJhZyB8PSBhZ254X3NldF9iaXRzKFBBQ0tFVF9MRU4sIFBBQ0tFVF9MRU5fU0hJRlQsIHNrYi0+bGVuKTsKKwkJZnJhZyB8PSBhZ254X3NldF9iaXRzKEZJUlNUX0ZSQUdfTEVOLCBGSVJTVF9GUkFHX0xFTl9TSElGVCwgMSk7CisJCWZyYWcgfD0gYWdueF9zZXRfYml0cyhPV05FUiwgT1dORVJfU0hJRlQsIDEpOworCQloZHJfZGVzYy0+ZnJhZyA9IGNwdV90b19iZTMyKGZyYWcpOworCX0gd2hpbGUgKDApOworCWhkcl9kZXNjLT5kbWFfYWRkciA9IGNwdV90b19iZTMyKGhkcl9pbmZvLT5tYXBwaW5nKTsKKworCisJLyogU2V0IEZyYWcncyBpbmZvIGFuZCBkZXNjICovCisJaSA9IChpICsgMSkgJSByaW5nLT5zaXplOworCWZyYWdfZGVzYyA9IHJpbmctPmRlc2MgKyBpOworCWZyYWdfaW5mbyA9IHJpbmctPmluZm8gKyBpOworCW1lbWNweShmcmFnX2luZm8sIGhkcl9pbmZvLCBzaXplb2Yoc3RydWN0IGFnbnhfaW5mbykpOworCWZyYWdfaW5mby0+dHlwZSA9IFBBQ0tFVDsKKwlmcmFnX2luZm8tPmRtYV9sZW4gPSBza2ItPmxlbiAtIGhkcl9pbmZvLT5kbWFfbGVuOworCWZyYWdfaW5mby0+bWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBkZXYsIHNrYi0+ZGF0YSArIGhkcl9pbmZvLT5kbWFfbGVuLAorCQkJCQkgICAgZnJhZ19pbmZvLT5kbWFfbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwlkbyB7CisJCXUzMiBmcmFnID0gMDsKKwkJZnJhZyB8PSBhZ254X3NldF9iaXRzKEZJUlNUX0ZSQUcsIEZJUlNUX0ZSQUdfU0hJRlQsIDApOworCQlmcmFnIHw9IGFnbnhfc2V0X2JpdHMoTEFTVF9GUkFHLCBMQVNUX0ZSQUdfU0hJRlQsIDEpOworCQlmcmFnIHw9IGFnbnhfc2V0X2JpdHMoUEFDS0VUX0xFTiwgUEFDS0VUX0xFTl9TSElGVCwgc2tiLT5sZW4pOworCQlmcmFnIHw9IGFnbnhfc2V0X2JpdHMoU1VCX0ZSQUdfTEVOLCBTVUJfRlJBR19MRU5fU0hJRlQsIGZyYWdfaW5mby0+ZG1hX2xlbik7CisJCWZyYWdfZGVzYy0+ZnJhZyA9IGNwdV90b19iZTMyKGZyYWcpOworCX0gd2hpbGUgKDApOworCWZyYWdfZGVzYy0+ZG1hX2FkZHIgPSBjcHVfdG9fYmUzMihmcmFnX2luZm8tPm1hcHBpbmcpOworCisJdHhtX3Bvd2VyX3NldChwcml2LCB0eGkpOworCisvKiAJZG8geyAqLworLyogCQlpbnQgajsgKi8KKy8qIAkJc2l6ZV90IGxlbjsgKi8KKy8qIAkJbGVuID0gc2tiLT5sZW4gLSBoZHJfaW5mby0+ZG1hX2xlbiArIGhkcl9pbmZvLT5oZHJfbGVuOyAgKi8KKy8qIC8vCQlpZiAobGVuID09IDYxNCkgeyAqLworLyogCQkJYWdueF9wcmludF9kZXNjKGhkcl9kZXNjKTsgKi8KKy8qIAkJCWFnbnhfcHJpbnRfZGVzYyhmcmFnX2Rlc2MpOyAqLworLyogCQkJYWdueF9wcmludF90eF9oZHIoKHN0cnVjdCBhZ254X2hkciAqKXNrYi0+ZGF0YSk7ICovCisvKiAJCQlhZ254X3ByaW50X3N0YV9wb3dlcihwcml2LCBMT0NBTF9TVEFJRCk7ICovCisvKiAJCQlhZ254X3ByaW50X3N0YShwcml2LCBMT0NBTF9TVEFJRCk7ICovCisvKiAJCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKSAqLworLyogCQkJCWFnbnhfcHJpbnRfc3RhX3R4X3dxKHByaXYsIExPQ0FMX1NUQUlELCBqKTsgKi8KKy8qIAkJCWFnbnhfcHJpbnRfc3RhX3Bvd2VyKHByaXYsIEJTU0lEX1NUQUlEKTsgKi8KKy8qIAkJCWFnbnhfcHJpbnRfc3RhKHByaXYsIEJTU0lEX1NUQUlEKTsgKi8KKy8qIAkJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspICovCisvKiAJCQkJYWdueF9wcmludF9zdGFfdHhfd3EocHJpdiwgQlNTSURfU1RBSUQsIGopOyAqLworLyogCQkJLy8JfSAqLworLyogCX0gd2hpbGUgKDApOyAqLworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJLyogRklYTUUgdWdseSBjb2RlICovCisJLyogVHJpZ2dlciBUWE0gKi8KKwlkbyB7CisJCXUzMiByZWc7CisJCXJlZyA9IChpb3JlYWQzMihwcml2LT5jdGwgKyBBR05YX0NJUl9UWE1DVEwpKTsKKwkJcmVnIHw9IDB4ODsKKwkJaW93cml0ZTMyKChyZWcpLCBwcml2LT5jdGwgKyBBR05YX0NJUl9UWE1DVEwpOworCX13aGlsZSAoMCk7CisKKwkvKiBUcmlnZ2VyIFRYRCAqLworCWRvIHsKKwkJdTMyIHJlZzsKKwkJcmVnID0gKGlvcmVhZDMyKHByaXYtPmN0bCArIEFHTlhfQ0lSX1RYRENUTCkpOworCQlyZWcgfD0gMHg4OworCQlpb3dyaXRlMzIoKHJlZyksIHByaXYtPmN0bCArIEFHTlhfQ0lSX1RYRENUTCk7CisJfXdoaWxlICgwKTsKKworCXJldHVybiAwOworfQorCitpbnQgX2FnbnhfdHgoc3RydWN0IGFnbnhfcHJpdiAqcHJpdiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1MTYgZmN0bDsKKworCWlmICh0eF9wYWNrZXRfY2hlY2soc2tiKSkKKwkJcmV0dXJuIDA7CisKKy8qIAlwcmludF9oZXhfZHVtcF9ieXRlcygiYWdueDogVFhfUEFDS0VUOiAiLCBEVU1QX1BSRUZJWF9OT05FLCAqLworLyogCQkJICAgICBza2ItPmRhdGEsIHNrYi0+bGVuKTsgKi8KKworICAgICAgICBmY3RsID0gbGUxNl90b19jcHUoKigoX19sZTE2ICopc2tiLT5kYXRhKSk7CisKKwlpZiAoIChmY3RsICYgSUVFRTgwMjExX0ZDVExfRlRZUEUpICA9PSBJRUVFODAyMTFfRlRZUEVfREFUQSApCisJCXJldHVybiBfX2FnbnhfdHgocHJpdiwgc2tiLCAmcHJpdi0+dHhkKTsKKwllbHNlCisJCXJldHVybiBfX2FnbnhfdHgocHJpdiwgc2tiLCAmcHJpdi0+dHhtKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hZ254L3htaXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9hZ254L3htaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2FjNDE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FnbngveG1pdC5oCkBAIC0wLDAgKzEsMjUwIEBACisjaWZuZGVmIEFHTlhfWE1JVF9IXworI2RlZmluZSBBR05YX1hNSVRfSF8KKworI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgorCitzdHJ1Y3QgYWdueF9wcml2OworCitzdGF0aWMgaW5saW5lIHUzMiBhZ254X3NldF9iaXRzKHUzMiBtYXNrLCB1OCBzaGlmdCwgdTMyIHZhbHVlKQoreworCXJldHVybiAodmFsdWUgPDwgc2hpZnQpICYgbWFzazsKK30KKworc3RhdGljIGlubGluZSB1MzIgYWdueF9nZXRfYml0cyh1MzIgbWFzaywgdTggc2hpZnQsIHUzMiB2YWx1ZSkKK3sKKwlyZXR1cm4gKHZhbHVlICYgbWFzaykgPj4gc2hpZnQ7Cit9CisKKworc3RydWN0IGFnbnhfcnggeworCV9fYmUxNiByeF9wYWNrZXRfZHVyYXRpb247IC8qICBSWCBQYWNrZXQgRHVyYXRpb24gKi8KKwlfX2JlMTYgcmVwbGF5X2NudDsJLyogUmVwbGF5IENvdW50ICovCit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworCitzdHJ1Y3QgYWdueF90eCB7CisJdTggbG9uZ19yZXRyeV9saW1pdDsgLyogTG9uZyBSZXRyeSBMaW1pdCAqLworCXU4IHNob3J0X3JldHJ5X2xpbWl0OyAvKiBTaG9ydCBSZXRyeSBMaW1pdCAqLworCXU4IGxvbmdfcmV0cnlfY250OwkvKiBMb25nIFJldHJ5IENvdW50ICovCisJdTggc2hvcnRfcmV0cnlfY250OyAvKiBTaG9ydCBSZXRyeSBDb3VudCAqLworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKworLyogQ29weSBmcm9tIGJjbTQzeHggKi8KKyNkZWZpbmUgUDREX0JZVDNTKG1hZ2ljLCBucl9ieXRlcykgICAgICB1OCBfX3A0ZGRpbmcjI21hZ2ljW25yX2J5dGVzXQorI2RlZmluZSBQNERfQllURVMobGluZSwgbnJfYnl0ZXMpICAgICAgIFA0RF9CWVQzUyhsaW5lLCBucl9ieXRlcykKKyNkZWZpbmUgUEFEX0JZVEVTKG5yX2J5dGVzKSAgICAgICAgICAgICBQNERfQllURVMoX19MSU5FX18sIG5yX2J5dGVzKQorCisjZGVmaW5lIFA0RF9CSVQzUyhtYWdpYywgbnJfYml0cykgICAgICAgX19iZTMyIF9fcGFkZGluZyMjbWFnaWM6bnJfYml0cworI2RlZmluZSBQNERfQklUUyhsaW5lLCBucl9iaXRzKSAgICAgICAgIFA0RF9CSVQzUyhsaW5lLCBucl9iaXRzKQorI2RlZmluZSBQQURfQklUUyhucl9iaXRzKQkgICAgICAgIFA0RF9CSVRTKF9fTElORV9fLCBucl9iaXRzKQorCisKK3N0cnVjdCBhZ254X2hkciB7CisJX19iZTMyIHJlZzA7CisjZGVmaW5lIFJUUwkJICAgICAgICAweDgwMDAwMDAwIC8qIFJUUyAqLworI2RlZmluZSBSVFNfU0hJRlQJCTMxCisjZGVmaW5lIE1VTFRJQ0FTVAkgICAgICAgIDB4NDAwMDAwMDAgLyogbXVsdGljYXN0ICovCisjZGVmaW5lIE1VTFRJQ0FTVF9TSElGVAkJMzAKKyNkZWZpbmUgQUNLCQkJMHgzMDAwMDAwMCAvKiBBQ0sgKi8KKyNkZWZpbmUgQUNLX1NISUZUCQkyOAorI2RlZmluZSBUTQkJCTB4MDgwMDAwMDAgLyogVE0gKi8KKyNkZWZpbmUgVE1fU0hJRlQJCTI3CisjZGVmaW5lIFJFTEFZCQkJMHgwNDAwMDAwMCAvKiBSZWxheSAqLworI2RlZmluZSBSRUxBWV9TSElGVAkJMjYKKy8qIAlQQURfQklUUyg0KTsgKi8KKyNkZWZpbmUgUkVWSVNFRF9GQ1MJCTB4MDAzODAwMDAgLyogcmV2aXNlZCBGQ1MgKi8KKyNkZWZpbmUgUkVWSVNFRF9GQ1NfU0hJRlQJMTkKKyNkZWZpbmUgTkVYVF9CVUZGRVJfQUREUgkweDAwMDdGRkZGIC8qIE5leHQgQnVmZmVyIEFkZHJlc3MgKi8KKyNkZWZpbmUgTkVYVF9CVUZGRVJfQUREUl9TSElGVAkwCisKKwlfX2JlMzIgcmVnMTsKKyNkZWZpbmUgTUFDX0hEUl9MRU4JCTB4RkMwMDAwMDAgLyogTUFDIEhlYWRlciBMZW5ndGggICovCisjZGVmaW5lIE1BQ19IRFJfTEVOX1NISUZUCTI2CisjZGVmaW5lIERVUkFUSU9OX09WRVJJREUJMHgwMjAwMDAwMCAvKiBEdXJhdGlvbiBPdmVycmlkZSAqLworI2RlZmluZSBEVVJBVElPTl9PVkVSSURFX1NISUZUCTI1CisjZGVmaW5lIFBIWV9IRFJfT1ZFUklERQkJMHgwMTAwMDAwMCAvKiBQSFkgSGVhZGVyIE92ZXJyaWRlICovCisjZGVmaW5lIFBIWV9IRFJfT1ZFUklERV9TSElGVAkyNAorI2RlZmluZSBDUkNfRkFJTAkJMHgwMDgwMDAwMCAvKiBDUkMgZmFpbCAqLworI2RlZmluZSBDUkNfRkFJTF9TSElGVAkJMjMKKy8qCVBBRF9CSVRTKDEpOyAqLworI2RlZmluZSBTRVFVRU5DRV9OVU1CRVIJCTB4MDAyMDAwMDAgLyogU2VxdWVuY2UgTnVtYmVyICovCisjZGVmaW5lIFNFUVVFTkNFX05VTUJFUl9TSElGVAkyMQorLyoJUEFEX0JJVFMoMik7ICovCisjZGVmaW5lIEJVRkZfSEVBRF9BRERSCQkweDAwMDdGRkZGIC8qIEJ1ZmZlciBIZWFkIEFkZHJlc3MgKi8KKyNkZWZpbmUgQlVGRl9IRUFEX0FERFJfU0hJRlQJMAorCisJX19iZTMyIHJlZzI7CisjZGVmaW5lIFBEVV9DT1VOVAkJMHhGQzAwMDAwMCAvKiBQRFUgQ291bnQgKi8KKyNkZWZpbmUgUERVX0NPVU5UX1NISUZUCQkyNgorLyogCVBBRF9CSVRTKDMpOyAqLworI2RlZmluZSBXRVBfS0VZCQkJMHgwMDYwMDAwMCAvKiBXRVAgS2V5ICMgKi8KKyNkZWZpbmUgV0VQX0tFWV9TSElGVAkJMjEKKyNkZWZpbmUgVVNFU19XRVBfS0VZCQkweDAwMTAwMDAwIC8qIFVzZXMgV0VQIEtleSAqLworI2RlZmluZSBVU0VTX1dFUF9LRVlfU0hJRlQJMjAKKyNkZWZpbmUgS0VFUF9BTElWRQkJMHgwMDA4MDAwMCAvKiBLZWVwIGFsaXZlICovCisjZGVmaW5lIEtFRVBfQUxJVkVfU0hJRlQJMTkKKyNkZWZpbmUgQlVGRl9UQUlMX0FERFIJCTB4MDAwN0ZGRkYgLyogQnVmZmVyIFRhaWwgQWRkcmVzcyAqLworI2RlZmluZSBCVUZGX1RBSUxfQUREUl9TSElGVAkwCisKKwlfX2JlMzIgcmVnMzsKKyNkZWZpbmUgQ1RTXzExRwkJCTB4ODAwMDAwMDAJLyogQ1RTIGluIDExZyAqLworI2RlZmluZSBDVFNfMTFHX1NISUZUCQkzMQorI2RlZmluZSBSVFNfMTFHCQkJMHg0MDAwMDAwMAkvKiBSVFMgaW4gMTFnICovCisjZGVmaW5lIFJUU18xMUdfU0hJRlQJCTMwCisvKiBQQURfQklUUygyKTsgKi8KKyNkZWZpbmUgRlJBR19TSVpFCQkweDBGRkYwMDAwCS8qIGZyYWdtZW50IHNpemUgKi8KKyNkZWZpbmUgRlJBR19TSVpFX1NISUZUCQkxNgorI2RlZmluZSBQQVlMT0FEX0xFTgkJMHgwMDAwRkZGMAkvKiBwYXlsb2FkIGxlbmd0aCAqLworI2RlZmluZSBQQVlMT0FEX0xFTl9TSElGVAk0CisjZGVmaW5lIEZSQUdfTlVNCQkweDAwMDAwMDBGCS8qIG51bWJlciBvZiBmcmFncyAqLworI2RlZmluZSBGUkFHX05VTV9TSElGVAkJMAorCisJX19iZTMyIHJlZzQ7CisvKiAJUEFEX0JJVFMoNCk7ICovCisjZGVmaW5lIFJFTEFZX1NUQUlECQkweDBGRkYwMDAwIC8qIHJlbGF5U3RhbGQgKi8KKyNkZWZpbmUgUkVMQVlfU1RBSURfU0hJRlQJMTYKKyNkZWZpbmUgU1RBVElPTl9JRAkJMHgwMDAwRkZGMCAvKiBTdGF0aW9uIElEICovCisjZGVmaW5lIFNUQVRJT05fSURfU0hJRlQJNAorI2RlZmluZSBXT1JLUVVFVUVfSUQJCTB4MDAwMDAwMEYgLyogV29ya3F1ZXVlIElEICovCisjZGVmaW5lIFdPUktRVUVVRV9JRF9TSElGVAkwCisKKwkvKiBGSVhNRSB0aGlzIHJlZ2lzdGVyIG1heWJlIGlzIExFPyAqLworCV9fYmUzMiByZWc1OworLyogCVBBRF9CSVRTKDQpOyAqLworI2RlZmluZSBST1VURV9IT1NUCQkweDBGMDAwMDAwCisjZGVmaW5lIFJPVVRFX0hPU1RfU0hJRlQJMjQKKyNkZWZpbmUgUk9VVEVfQ0FSRF9DUFUJCTB4MDBGMDAwMDAKKyNkZWZpbmUgUk9VVEVfQ0FSRF9DUFVfU0hJRlQJMjAKKyNkZWZpbmUgUk9VVEVfRU5DUllQVElPTgkweDAwMEYwMDAwCisjZGVmaW5lIFJPVVRFX0VOQ1JZUFRJT05fU0hJRlQJMTYKKyNkZWZpbmUgUk9VVEVfVFgJCTB4MDAwMEYwMDAKKyNkZWZpbmUgUk9VVEVfVFhfU0hJRlQJCTEyCisjZGVmaW5lIFJPVVRFX1JYMQkJMHgwMDAwMEYwMAorI2RlZmluZSBST1VURV9SWDFfU0hJRlQJCTgKKyNkZWZpbmUgUk9VVEVfUlgyCQkweDAwMDAwMEYwCisjZGVmaW5lIFJPVVRFX1JYMl9TSElGVAkJNAorI2RlZmluZSBST1VURV9DT01QUkVTU0lPTgkweDAwMDAwMDBGCisjZGVmaW5lIFJPVVRFX0NPTVBSRVNTSU9OX1NISUZUIDAKKworCV9fYmUzMiBfMTFnMDsJCQkvKiAxMWcgKi8KKwlfX2JlMzIgXzExZzE7CQkJLyogMTFnICovCisJX19iZTMyIF8xMWIwOwkJCS8qIDExYiAqLworCV9fYmUzMiBfMTFiMTsJCQkvKiAxMWIgKi8KKwl1OCBtYWNfaGRyWzMyXTsJCQkvKiBNQUMgaGVhZGVyICovCisKKwlfX2JlMTYgcnRzX2R1cmF0aW9uOwkJLyogUlRTIGR1cmF0aW9uICovCisJX19iZTE2IGxhc3RfZHVyYXRpb247CQkvKiBMYXN0IGR1cmF0aW9uICovCisJX19iZTE2IHNlY19sYXN0X2R1cmF0aW9uOwkvKiBTZWNvbmQgdG8gTGFzdCBkdXJhdGlvbiAqLworCV9fYmUxNiBvdGhlcl9kdXJhdGlvbjsJCS8qIE90aGVyIGR1cmF0aW9uICovCisJX19iZTE2IHR4X2xhc3RfZHVyYXRpb247CS8qIFRYIExhc3QgZHVyYXRpb24gKi8KKwlfX2JlMTYgdHhfb3RoZXJfZHVyYXRpb247CS8qIFRYIE90aGVyIER1cmF0aW9uICovCisJX19iZTE2IGxhc3RfMTFnX2xlbjsJCS8qIExlbmd0aCBvZiBsYXN0IDExZyAqLworCV9fYmUxNiBvdGhlcl8xMWdfbGVuOwkJLyogTGVuZ2h0IG9mIG90aGVyIDExZyAqLworCisJX19iZTE2IGxhc3RfMTFiX2xlbjsJCS8qIExlbmd0aCBvZiBsYXN0IDExYiAqLworCV9fYmUxNiBvdGhlcl8xMWJfbGVuOwkJLyogTGVuZ2h0IG9mIG90aGVyIDExYiAqLworCisKKwlfX2JlMTYgcmVnNjsKKyNkZWZpbmUgTUJGCQkJMHhGMDAwIC8qIG1iZiAqLworI2RlZmluZSBNQkZfU0hJRlQJCTEyCisjZGVmaW5lIFJTVkQ0CQkJMHgwRkZGIC8qIHJzdmQ0ICovCisjZGVmaW5lIFJTVkQ0X1NISUZUCQkwCisKKwlfX2JlMTYgcnhfZnJhZ19zdGF0OwkvKiBSWCBmcmFnbWVudGF0aW9uIHN0YXR1cyAqLworCisJX19iZTMyIHRpbWVfc3RhbXA7CS8qIFRpbWVTdGFtcCAqLworCV9fYmUzMiBwaHlfc3RhdHNfaGk7CS8qIFBIWSBzdGF0cyBoaSAqLworCV9fYmUzMiBwaHlfc3RhdHNfbG87CS8qIFBIWSBzdGF0cyBsbyAqLworCV9fYmUzMiBtaWNfa2V5MDsJLyogTUlDIGtleSAwICovCisJX19iZTMyIG1pY19rZXkxOwkvKiBNSUMga2V5IDEgKi8KKworCXVuaW9uIHsJCQkvKiBSWC9UWCBVbmlvbiAqLworCQlzdHJ1Y3QgYWdueF9yeCByeDsKKwkJc3RydWN0IGFnbnhfdHggdHg7CisJfTsKKworCXU4IHJ4X2NoYW5uZWw7CQkvKiBSZWNpZXZlIENoYW5uZWwgKi8KKwlQQURfQllURVMoMyk7CisKKwl1OCByZXNlcnZlZFs0XTsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisKK3N0cnVjdCBhZ254X2Rlc2MgeworI2RlZmluZSBQQUNLRVRfTEVOCQkweEZGRjAwMDAwCisjZGVmaW5lIFBBQ0tFVF9MRU5fU0hJRlQJMjAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBGSVJTVF9QQUNLRVRfTUFTSwkweDAwMDgwMDAwCisjZGVmaW5lIEZJUlNUX1BBQ0tFVF9NQVNLX1NISUZUCTE5CisjZGVmaW5lIEZJUlNUX1JFU0VSVjIJCTB4MDAwNDAwMDAKKyNkZWZpbmUgRklSU1RfUkVTRVJWMl9TSElGVAkxOAorI2RlZmluZSBGSVJTVF9US0lQX0VSUk9SCTB4MDAwMjAwMDAKKyNkZWZpbmUgRklSU1RfVEtJUF9FUlJPUl9TSElGVAkxNworI2RlZmluZSBGSVJTVF9US0lQX1BBQ0tFVAkweDAwMDEwMDAwCisjZGVmaW5lIEZJUlNUX1RLSVBfUEFDS0VUX1NISUZUCTE2CisjZGVmaW5lIEZJUlNUX1JFU0VSVjEJCTB4MDAwMEYwMDAKKyNkZWZpbmUgRklSU1RfUkVTRVJWMV9TSElGVAkxMgorI2RlZmluZSBGSVJTVF9GUkFHX0xFTgkJMHgwMDAwMEZGOAorI2RlZmluZSBGSVJTVF9GUkFHX0xFTl9TSElGVAkzCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgU1VCX1JFU0VSVjIJCTB4MDAwYzAwMDAKKyNkZWZpbmUgU1VCX1JFU0VSVjJfU0hJRlQJMTgKKyNkZWZpbmUgU1VCX1RLSVBfRVJST1IJCTB4MDAwMjAwMDAKKyNkZWZpbmUgU1VCX1RLSVBfRVJST1JfU0hJRlQJMTcKKyNkZWZpbmUgU1VCX1RLSVBfUEFDS0VUCQkweDAwMDEwMDAwCisjZGVmaW5lIFNVQl9US0lQX1BBQ0tFVF9TSElGVAkxNgorI2RlZmluZSBTVUJfUkVTRVJWMQkJMHgwMDAwODAwMAorI2RlZmluZSBTVUJfUkVTRVJWMV9TSElGVAkxNQorI2RlZmluZSBTVUJfRlJBR19MRU4JCTB4MDAwMDdGRjgKKyNkZWZpbmUgU1VCX0ZSQUdfTEVOX1NISUZUCTMKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBGSVJTVF9GUkFHCQkweDAwMDAwMDA0CisjZGVmaW5lIEZJUlNUX0ZSQUdfU0hJRlQJMgorI2RlZmluZSBMQVNUX0ZSQUcJCTB4MDAwMDAwMDIKKyNkZWZpbmUgTEFTVF9GUkFHX1NISUZUCQkxCisjZGVmaW5lIE9XTkVSCQkJMHgwMDAwMDAwMQorI2RlZmluZSBPV05FUl9TSElGVAkJMAorCV9fYmUzMiBmcmFnOworCV9fYmUzMiBkbWFfYWRkcjsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCitlbnVtIHtIRUFERVIsIFBBQ0tFVH07CisKK3N0cnVjdCBhZ254X2luZm8geworICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworICAgICAgICBkbWFfYWRkcl90IG1hcHBpbmc7CisJdTMyIGRtYV9sZW47CQkvKiBkbWEgYnVmZmVyIGxlbiAgKi8KKwkvKiBCZWxvdyBmaWVsZHMgb25seSB1c2Z1bCBmb3IgdHggKi8KKwl1MzIgaGRyX2xlbjsJCS8qIGllZWU4MDIxMSBoZWFkZXIgbGVuZ3RoICovCisJdW5zaWduZWQgaW50IHR5cGU7CisgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqdHhpOworICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkciBoZHI7Cit9OworCisKK3N0cnVjdCBhZ254X3JpbmcgeworCXN0cnVjdCBhZ254X2Rlc2MgKmRlc2M7CisJZG1hX2FkZHJfdCBkbWE7CisJc3RydWN0IGFnbnhfaW5mbyAqaW5mbzsKKwkvKiBXaWxsIGxlYWQgdG8gb3ZlcmZsb3cgd2hlbiBzZW50IHBhY2tldCBudW1iZXIgZW5vdWdoPyAqLworCXVuc2lnbmVkIGludCBpZHg7CisJdW5zaWduZWQgaW50IGlkeF9zZW50OwkJLyogb25seSB1c2Z1bCBmb3IgdHhkIGFuZCB0eG0gKi8KKwl1bnNpZ25lZCBpbnQgc2l6ZTsKK307CisKKyNkZWZpbmUgQUdOWF9SWF9SSU5HX1NJWkUJMTI4CisjZGVmaW5lIEFHTlhfVFhEX1JJTkdfU0laRQkyNTYKKyNkZWZpbmUgQUdOWF9UWE1fUklOR19TSVpFCTEyOAorCit2b2lkIGRpc2FibGVfcnhfaW50ZXJydXB0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpOwordm9pZCBlbmFibGVfcnhfaW50ZXJydXB0KHN0cnVjdCBhZ254X3ByaXYgKnByaXYpOworaW50IGZpbGxfcmluZ3Moc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7Cit2b2lkIHVuZmlsbF9yaW5ncyhzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK3ZvaWQgaGFuZGxlX3J4X2lycShzdHJ1Y3QgYWdueF9wcml2ICpwcml2KTsKK3ZvaWQgaGFuZGxlX3R4ZF9pcnEoc3RydWN0IGFnbnhfcHJpdiAqcHJpdik7Cit2b2lkIGhhbmRsZV90eG1faXJxKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpOwordm9pZCBoYW5kbGVfb3RoZXJfaXJxKHN0cnVjdCBhZ254X3ByaXYgKnByaXYpOworaW50IF9hZ254X3R4KHN0cnVjdCBhZ254X3ByaXYgKnByaXYsIHN0cnVjdCBza19idWZmICpza2IpOworI2VuZGlmIC8qIEFHTlhfWE1JVF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FsdHBjaWVjaGRtYS9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2FsdHBjaWVjaGRtYS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNGJmOTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYWx0cGNpZWNoZG1hL0tjb25maWcKQEAgLTAsMCArMSwxMCBAQAorY29uZmlnIEFMVEVSQV9QQ0lFX0NIRE1BCisJdHJpc3RhdGUgIkFsdGVyYSBQQ0kgRXhwcmVzcyBDaGFpbmluZyBETUEgZHJpdmVyIgorCWRlcGVuZHMgb24gUENJCisJZGVmYXVsdCBOCisJLS0taGVscC0tLQorCSAgQSByZWZlcmVuY2UgZHJpdmVyIHRoYXQgZXhlcmNpc2VzIHRoZSBDaGFpbmluZyBETUEgbG9naWMgcmVmZXJlbmNlCisJICBkZXNpZ24gZ2VuZXJhdGVkIGFsb25nIHRoZSBBbHRlcmEgRlBHQSBQQ0kgRXhwcmVzcyBzb2Z0IG9yIGhhcmQgY29yZSwKKwkgIG9ubHkgaWYgaW5zdGFudGlhdGVkIHVzaW5nIHRoZSBNZWdhV2l6YXJkLCBub3QgdGhlIFNPUEMgYnVpbGRlciwgb2YKKwkgIFF1YXJ0dXMgOC4xLgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWx0cGNpZWNoZG1hL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2FsdHBjaWVjaGRtYS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDhjODQzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FsdHBjaWVjaGRtYS9NYWtlZmlsZQpAQCAtMCwwICsxLDIgQEAKK29iai0kKENPTkZJR19BTFRFUkFfUENJRV9DSERNQSkJKz0gYWx0cGNpZWNoZG1hLm8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FsdHBjaWVjaGRtYS9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL2FsdHBjaWVjaGRtYS9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYzk0NWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYWx0cGNpZWNoZG1hL1RPRE8KQEAgLTAsMCArMSwxNSBAQAorRE9ORToKKyAgICAtIGZ1bmN0aW9uYWxpdHkgc2ltaWxhciB0byBsb2dpYyB0ZXN0YmVuY2gKKworVE9ETzoKKwktIGNoZWNrcGF0Y2gucGwgY2xlYW51cHMuCisJLSBrZWVwIHN0YXRlIG9mIERNQSBlbmdpbmVzLgorCS0ga2VlcCBkYXRhIHN0cnVjdHVyZSB0aGF0IGtlZXBzIHN0YXRlIG9mIGVhY2ggdHJhbnNmZXIuCisJLSBpbnRlcnJ1cHQgaGFuZGxlciBzaG91bGQgaXRlcmF0ZSBvdmVyIG91dHN0YW5kaW5nIGRlc2NyaXB0b3IgdGFibGVzLgorCS0gY29tcGxldGUgdXNlcnNwYWNlIGNkZXYgdG8gcmVhZC93cml0ZSB1c2luZyB0aGUgRE1BIGVuZ2luZXMuCisJLSBzcGxpdCBvZmYgdGhlIERNQSBzdXBwb3J0IGZ1bmN0aW9ucyBpbiBhIG1vZHVsZSwgcmUtdXNhYmxlIGJ5IGN1c3RvbQorCSAgZHJpdmVycy4KKworUGxlYXNlIGNvb3JkaW5hdGUgd29yayB3aXRoLCBhbmQgc2VuZCBwYXRjaGVzIHRvCitMZW9uIFdvZXN0ZW5iZXJnIDxsZW9uQHNpZGVicmFuY2guY29tPgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWx0cGNpZWNoZG1hL2FsdHBjaWVjaGRtYS5jIGIvZHJpdmVycy9zdGFnaW5nL2FsdHBjaWVjaGRtYS9hbHRwY2llY2hkbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTJiNGNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FsdHBjaWVjaGRtYS9hbHRwY2llY2hkbWEuYwpAQCAtMCwwICsxLDExODQgQEAKKy8qKgorICogRHJpdmVyIGZvciBBbHRlcmEgUENJZSBjb3JlIGNoYWluaW5nIERNQSByZWZlcmVuY2UgZGVzaWduLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBMZW9uIFdvZXN0ZW5iZXJnICA8bGVvbi53b2VzdGVuYmVyZ0BheG9uLnR2PgorICogQ29weXJpZ2h0IChDKSAyMDA4IE5pY2tvbGFzIEhlcHBlcm1hbm4gIDxoZXBwZXJtYW5ud2R0QGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqCisgKiBSYXRpb25hbGU6IFRoaXMgZHJpdmVyIGV4ZXJjaXNlcyB0aGUgY2hhaW5pbmcgRE1BIHJlYWQgYW5kIHdyaXRlIGVuZ2luZQorICogaW4gdGhlIHJlZmVyZW5jZSBkZXNpZ24uIEl0IGlzIG1lYW50IGFzIGEgY29tcGxlbWVudGFyeSByZWZlcmVuY2UKKyAqIGRyaXZlciB0aGF0IGNhbiBiZSB1c2VkIGZvciB0ZXN0aW5nIGVhcmx5IGRlc2lnbnMgYXMgd2VsbCBhcyBhIGJhc2lzIHRvCisgKiB3cml0ZSB5b3VyIGN1c3RvbSBkcml2ZXIuCisgKgorICogU3RhdHVzOiBUZXN0IHJlc3VsdHMgZnJvbSBMZW9uIFdvZXN0ZW5iZXJnICA8bGVvbi53b2VzdGVuYmVyZ0BheG9uLnR2PjoKKyAqCisgKiBTZW5kZXJvIEJvYXJkIHcvIEN5Y2xvbmUgSUkgRVAyQzM1RjY3MkM2TiwgUFgxMDExQSBQQ0llIHgxIFBIWSBvbiBhCisgKiBEZWxsIFByZWNpc2lvbiAzNzAgUEMsIHg4Niwga2VybmVsIDIuNi4yMCBmcm9tIFVidW50dSA3LjA0LgorICoKKyAqIFNlbmRlcm8gQm9hcmQgdy8gQ3ljbG9uZSBJSSBFUDJDMzVGNjcyQzZOLCBQWDEwMTFBIFBDSWUgeDEgUEhZIG9uIGEKKyAqIEZyZWVzY2FsZSBNUEM4MzEzRS1SREIgYm9hcmQsIFBvd2VyUEMsIDIuNi4yNCB3LyBGcmVlc2NhbGUgcGF0Y2hlcy4KKyAqCisgKiBEcml2ZXIgdGVzdHMgcGFzc2VkIHdpdGggUENJZSBDb21waWxlciA4LjEuIFdpdGggUENJZSA4LjAgdGhlIERNQQorICogbG9vcGJhY2sgdGVzdCBoYWQgcmVwcm9kdWNhYmxlIGNvbXBhcmUgZXJyb3JzLiBJIGFzc3VtZSBhIGNoYW5nZQorICogaW4gdGhlIGNvbXBpbGVyIG9yIHJlZmVyZW5jZSBkZXNpZ24sIGJ1dCBjb3VsZCBub3QgZmluZCBldmlkZW5jZSBub3IKKyAqIGRvY3VtZW50YXRpb24gb24gYSBjaGFuZ2Ugb3IgZml4IGluIHRoYXQgZGlyZWN0aW9uLgorICoKKyAqIFRoZSByZWZlcmVuY2UgZGVzaWduIGRvZXMgbm90IGhhdmUgcmVhZGFibGUgbG9jYXRpb25zIGFuZCB0aHVzIGEKKyAqIGR1bW15IHJlYWQsIHVzZWQgdG8gZmx1c2ggUENJIHBvc3RlZCB3cml0ZXMsIGNhbm5vdCBiZSBwZXJmb3JtZWQuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisKKy8qIGJ5IGRlZmF1bHQgZG8gbm90IGJ1aWxkIHRoZSBjaGFyYWN0ZXIgZGV2aWNlIGludGVyZmFjZSAqLworLyogWFhYIEl0IGlzIG5vbi1mdW5jdGlvbmFsIHlldCAqLworI2lmbmRlZiBBTFRQQ0lFQ0hETUFfQ0RFVgorIyAgZGVmaW5lIEFMVFBDSUVDSERNQV9DREVWIDAKKyNlbmRpZgorCisvKiBidWlsZCB0aGUgY2hhcmFjdGVyIGRldmljZSBpbnRlcmZhY2U/ICovCisjaWYgQUxUUENJRUNIRE1BX0NERVYKKyMgIGRlZmluZSBNQVhfQ0hETUFfU0laRSAoOCAqIDEwMjQgKiAxMDI0KQorIyAgaW5jbHVkZSAibWFwcGVyX3VzZXJfdG9fc2cuaCIKKyNlbmRpZgorCisvKiogZHJpdmVyIG5hbWUsIG1pbWlja3MgQWx0ZXJhIG5hbWluZyBvZiB0aGUgcmVmZXJlbmNlIGRlc2lnbiAqLworI2RlZmluZSBEUlZfTkFNRSAiYWx0cGNpZWNoZG1hIgorLyoqIG51bWJlciBvZiBCQVJzIG9uIHRoZSBkZXZpY2UgKi8KKyNkZWZpbmUgQVBFX0JBUl9OVU0gKDYpCisvKiogQkFSIG51bWJlciB3aGVyZSB0aGUgUkNTTEFWRSBtZW1vcnkgc2l0cyAqLworI2RlZmluZSBBUEVfQkFSX1JDU0xBVkUgKDApCisvKiogQkFSIG51bWJlciB3aGVyZSB0aGUgRGVzY3JpcHRvciBIZWFkZXIgc2l0cyAqLworI2RlZmluZSBBUEVfQkFSX0hFQURFUiAoMikKKworLyoqIG1heGltdW0gc2l6ZSBpbiBieXRlcyBvZiB0aGUgZGVzY3JpcHRvciB0YWJsZSwgY2hkbWEgbG9naWMgbGltaXQgKi8KKyNkZWZpbmUgQVBFX0NIRE1BX1RBQkxFX1NJWkUgKDQwOTYpCisvKiBzaW5nbGUgdHJhbnNmZXIgbXVzdCBub3QgZXhjZWVkIDI1NSB0YWJsZSBlbnRyaWVzLiB3b3JzdCBjYXNlIHRoaXMgY2FuIGJlCisgKiBhY2hpZXZlZCBieSAyNTUgc2NhdHRlcmVkIHBhZ2VzLCB3aXRoIG9ubHkgYSBzaW5nbGUgYnl0ZSBpbiB0aGUgaGVhZCBhbmQKKyAqIHRhaWwgcGFnZXMuIDI1MyAqIFBBR0VfU0laRSBpcyBhIHNhZmUgdXBwZXIgYm91bmQgZm9yIHRoZSB0cmFuc2ZlciBzaXplLgorICovCisjZGVmaW5lIEFQRV9DSERNQV9NQVhfVFJBTlNGRVJfTEVOICgyNTMgKiBQQUdFX1NJWkUpCisKKy8qKgorICogU3BlY2lmaWVzIHRob3NlIEJBUnMgdG8gYmUgbWFwcGVkIGFuZCB0aGUgbGVuZ3RoIG9mIGVhY2ggbWFwcGluZy4KKyAqCisgKiBaZXJvICgwKSBtZWFucyBkbyBub3QgbWFwLCBvdGhlcndpc2Ugc3BlY2lmaWVzIHRoZSBCQVIgbGVuZ3RocyB0byBiZSBtYXBwZWQuCisgKiBJZiB0aGUgYWN0dWFsIEJBUiBsZW5ndGggaXMgbGVzcywgdGhpcyBpcyBjb25zaWRlcmVkIGFuIGVycm9yOyB0aGVuCisgKiByZWNvbmZpZ3VyZSB5b3VyIFBDSWUgY29yZS4KKyAqCisgKiBAc2VlIHVnX3BjaV9leHByZXNzIDguMCwgdGFibGUgNy0yIGF0IHBhZ2UgNy0xMy4KKyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgYmFyX21pbl9sZW5bQVBFX0JBUl9OVU1dID0KKwl7IDMyNzY4LCAwLCAyNTYsIDAsIDMyNzY4LCAwIH07CisKKy8qKgorICogRGVzY3JpcHRvciBIZWFkZXIsIGNvbnRyb2xzIHRoZSBETUEgcmVhZCBlbmdpbmUgb3Igd3JpdGUgZW5naW5lLgorICoKKyAqIFRoZSBkZXNjcmlwdG9yIGhlYWRlciBpcyB0aGUgbWFpbiBkYXRhIHN0cnVjdHVyZSBmb3Igc3RhcnRpbmcgRE1BIHRyYW5zZmVycy4KKyAqCisgKiBJdCBzaXRzIGluIEVuZCBQb2ludCAoRlBHQSkgbWVtb3J5IEJBUlsyXSBmb3IgMzItYml0IG9yIEJBUlszOjJdIGZvciA2NC1iaXQuCisgKiBJdCByZWZlcmVuY2VzIGEgZGVzY3JpcHRvciB0YWJsZSB3aGljaCBleGlzdHMgaW4gUm9vdCBDb21wbGV4IChQQykgbWVtb3J5LgorICogV3JpdGluZyB0aGUgcmNsYXN0IGZpZWxkIHN0YXJ0cyB0aGUgRE1BIG9wZXJhdGlvbiwgdGh1cyBhbGwgb3RoZXIgc3RydWN0dXJlcworICogYW5kIGZpZWxkcyBtdXN0IGJlIHNldHVwIGJlZm9yZSBkb2luZyBzby4KKyAqCisgKiBAc2VlIHVnX3BjaV9leHByZXNzIDguMCwgdGFibGVzIDctMywgNy00IGFuZCA3LTUgYXQgcGFnZSA3LTE0LgorICogQG5vdGUgVGhpcyBoZWFkZXIgbXVzdCBiZSB3cml0dGVuIGluIGZvdXIgMzItYml0IChQQ0kgRFdPUkQpIHdyaXRlcy4KKyAqLworc3RydWN0IGFwZV9jaGRtYV9oZWFkZXIgeworCS8qKgorCSAqIHcwIGNvbnNpc3RzIG9mIHR3byAxNi1iaXQgZmllbGRzOgorCSAqIGxzYiB1MTYgbnVtYmVyOyBudW1iZXIgb2YgZGVzY3JpcHRvcnMgaW4gYXBlX2NoZG1hX3RhYmxlCisJICogbXNiIHUxNiBjb250cm9sOyBnbG9iYWwgY29udHJvbCBmbGFncworCSAqLworCXUzMiB3MDsKKwkvKiBidXMgYWRkcmVzcyB0byBhcGVfY2hkbWFfdGFibGUgaW4gUm9vdCBDb21wbGV4IG1lbW9yeSAqLworCXUzMiBiZHRfYWRkcl9oOworCXUzMiBiZHRfYWRkcl9sOworCS8qKgorCSAqIHczIGNvbnNpc3RzIG9mIHR3byAxNi1iaXQgZmllbGRzOgorCSAqIC0gbHNiIHUxNiByY2xhc3Q7IGxhc3QgZGVzY3JpcHRvciBudW1iZXIgYXZhaWxhYmxlIGluIFJvb3QgQ29tcGxleAorCSAqICAgIC0gemVybyAoMCkgbWVhbnMgdGhlIGZpcnN0IGRlc2NyaXB0b3IgaXMgcmVhZHksCisJICogICAgLSBvbmUgKDEpIG1lYW5zIHR3byBkZXNjcmlwdG9ycyBhcmUgcmVhZHksIGV0Yy4KKwkgKiAtIG1zYiB1MTYgcmVzZXJ2ZWQ7CisJICoKKwkgKiBAbm90ZSB3cml0aW5nIHRvIHRoaXMgbWVtb3J5IGxvY2F0aW9uIHN0YXJ0cyB0aGUgRE1BIG9wZXJhdGlvbiEKKwkgKi8KKwl1MzIgdzM7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoqCisgKiBEZXNjcmlwdG9yIEVudHJ5LCBkZXNjcmliaW5nIGEgKG5vbi1zY2F0dGVyZWQpIHNpbmdsZSBtZW1vcnkgYmxvY2sgdHJhbnNmZXIuCisgKgorICogVGhlcmUgaXMgb25lIGRlc2NyaXB0b3IgZm9yIGVhY2ggbWVtb3J5IGJsb2NrIGludm9sdmVkIGluIHRoZSB0cmFuc2ZlciwgYQorICogYmxvY2sgYmVpbmcgYSBjb250aWd1b3VzIGFkZHJlc3MgcmFuZ2Ugb24gdGhlIGJ1cy4KKyAqCisgKiBNdWx0aXBsZSBkZXNjcmlwdG9ycyBhcmUgY2hhaW5lZCBieSBtZWFucyBvZiB0aGUgYXBlX2NoZG1hX3RhYmxlIGRhdGEKKyAqIHN0cnVjdHVyZS4KKyAqCisgKiBAc2VlIHVnX3BjaV9leHByZXNzIDguMCwgdGFibGVzIDctNiwgNy03IGFuZCA3LTggYXQgcGFnZSA3LTE0IGFuZCBwYWdlIDctMTUuCisgKi8KK3N0cnVjdCBhcGVfY2hkbWFfZGVzYyB7CisJLyoqCisJICogdzAgY29uc2lzdHMgb2YgdHdvIDE2LWJpdCBmaWVsZHM6CisJICogbnVtYmVyIG9mIERXT1JEUyB0byB0cmFuc2ZlcgorCSAqIC0gbHNiIHUxNiBsZW5ndGg7CisJICogZ2xvYmFsIGNvbnRyb2wKKwkgKiAtIG1zYiB1MTYgY29udHJvbDsKKwkgKi8KKwl1MzIgdzA7CisJLyogYWRkcmVzcyBvZiBtZW1vcnkgaW4gdGhlIEVuZCBQb2ludCAqLworCXUzMiBlcF9hZGRyOworCS8qIGJ1cyBhZGRyZXNzIG9mIHNvdXJjZSBvciBkZXN0aW5hdGlvbiBtZW1vcnkgaW4gdGhlIFJvb3QgQ29tcGxleCAqLworCXUzMiByY19hZGRyX2g7CisJdTMyIHJjX2FkZHJfbDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKioKKyAqIERlc2NyaXB0b3IgVGFibGUsIGFuIGFycmF5IG9mIGRlc2NyaXB0b3JzIGRlc2NyaWJpbmcgYSBjaGFpbmVkIHRyYW5zZmVyLgorICoKKyAqIEFuIGFycmF5IG9mIGRlc2NyaXB0b3JzLCBwcmVjZWRlZCBieSB3b3Jrc3BhY2UgZm9yIHRoZSBFbmQgUG9pbnQuCisgKiBJdCBleGlzdHMgaW4gUm9vdCBDb21wbGV4IG1lbW9yeS4KKyAqCisgKiBUaGUgRW5kIFBvaW50IGNhbiB1cGRhdGUgaXRzIGxhc3QgY29tcGxldGVkIGRlc2NyaXB0b3IgbnVtYmVyIGluIHRoZQorICogZXBsYXN0IGZpZWxkIGlmIHJlcXVlc3RlZCBieSBzZXR0aW5nIHRoZSBFUExBU1RfRU5BIGJpdCBlaXRoZXIKKyAqIGdsb2JhbGx5IGluIHRoZSBoZWFkZXIncyBvciBsb2NhbGx5IGluIGFueSBkZXNjcmlwdG9yJ3MgY29udHJvbCBmaWVsZC4KKyAqCisgKiBAbm90ZSB0aGlzIHN0cnVjdHVyZSBtYXkgbm90IGV4Y2VlZCA0MDk2IGJ5dGVzLiBUaGlzIHJlc3VsdHMgaW4gYQorICogbWF4aW11bSBvZiA0MDk2IC8gKDQgKiA0KSAtIDEgPSAyNTUgZGVzY3JpcHRvcnMgcGVyIGNoYWluZWQgdHJhbnNmZXIuCisgKgorICogQHNlZSB1Z19wY2lfZXhwcmVzcyA4LjAsIHRhYmxlcyA3LTksIDctMTAgYW5kIDctMTEgYXQgcGFnZSA3LTE3IGFuZCBwYWdlIDctMTguCisgKi8KK3N0cnVjdCBhcGVfY2hkbWFfdGFibGUgeworCS8qIHdvcmtzcGFjZSAweDAwLTB4MGIsIHJlc2VydmVkICovCisJdTMyIHJlc2VydmVkMVszXTsKKwkvKiB3b3Jrc3BhY2UgMHgwYy0weDBmLCBsYXN0IGRlc2NyaXB0b3IgaGFuZGxlZCBieSBFbmQgUG9pbnQgKi8KKwl1MzIgdzM7CisJLyogdGhlIGFjdHVhbCBhcnJheSBvZiBkZXNjcmlwdG9ycworICAgICogMHgxMC0weDFmLCAweDIwLTB4MmYsIC4uLiAweGZmMC0weGZmZiAoMjU1IGVudHJpZXMpCisgICAgKi8KKwlzdHJ1Y3QgYXBlX2NoZG1hX2Rlc2MgZGVzY1syNTVdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qKgorICogQWx0ZXJhIFBDSSBFeHByZXNzICgnYXBlJykgYm9hcmQgc3BlY2lmaWMgYm9vayBrZWVwaW5nIGRhdGEKKyAqCisgKiBLZWVwcyBzdGF0ZSBvZiB0aGUgUENJZSBjb3JlIGFuZCB0aGUgQ2hhaW5pbmcgRE1BIGNvbnRyb2xsZXIKKyAqIGFwcGxpY2F0aW9uLgorICovCitzdHJ1Y3QgYXBlX2RldiB7CisJLyoqIHRoZSBrZXJuZWwgcGNpIGRldmljZSBkYXRhIHN0cnVjdHVyZSBwcm92aWRlZCBieSBwcm9iZSgpICovCisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7CisJLyoqCisJICoga2VybmVsIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgbWFwcGVkIEJBUiBtZW1vcnkgYW5kIElPIHJlZ2lvbnMgb2YKKwkgKiB0aGUgRW5kIFBvaW50LiBVc2VkIGJ5IG1hcF9iYXJzKCkvdW5tYXBfYmFycygpLgorCSAqLworCXZvaWQgKiBfX2lvbWVtIGJhcltBUEVfQkFSX05VTV07CisJLyoqIGtlcm5lbCB2aXJ0dWFsIGFkZHJlc3MgZm9yIERlc2NyaXB0b3IgVGFibGUgaW4gUm9vdCBDb21wbGV4IG1lbW9yeSAqLworCXN0cnVjdCBhcGVfY2hkbWFfdGFibGUgKnRhYmxlX3ZpcnQ7CisJLyoqCisJICogYnVzIGFkZHJlc3MgZm9yIHRoZSBEZXNjcmlwdG9yIFRhYmxlIGluIFJvb3QgQ29tcGxleCBtZW1vcnksIGluCisJICogQ1BVLW5hdGl2ZSBlbmRpYW5lc3MKKwkgKi8KKwlkbWFfYWRkcl90IHRhYmxlX2J1czsKKwkvKiBpZiB0aGUgZGV2aWNlIHJlZ2lvbnMgY291bGQgbm90IGJlIGFsbG9jYXRlZCwgYXNzdW1lIGFuZCByZW1lbWJlciBpdAorCSAqIGlzIGluIHVzZSBieSBhbm90aGVyIGRyaXZlcjsgdGhpcyBkcml2ZXIgbXVzdCBub3QgZGlzYWJsZSB0aGUgZGV2aWNlLgorCSAqLworCWludCBpbl91c2U7CisJLyogd2hldGhlciB0aGlzIGRyaXZlciBlbmFibGVkIG1zaSBmb3IgdGhlIGRldmljZSAqLworCWludCBtc2lfZW5hYmxlZDsKKwkvKiB3aGV0aGVyIHRoaXMgZHJpdmVyIGNvdWxkIG9idGFpbiB0aGUgcmVnaW9ucyAqLworCWludCBnb3RfcmVnaW9uczsKKwkvKiBpcnEgbGluZSBzdWNjZXNmdWxseSByZXF1ZXN0ZWQgYnkgdGhpcyBkcml2ZXIsIC0xIG90aGVyd2lzZSAqLworCWludCBpcnFfbGluZTsKKwkvKiBib2FyZCByZXZpc2lvbiAqLworCXU4IHJldmlzaW9uOworCS8qIGludGVycnVwdCBjb3VudCwgaW5jcmVtZW50ZWQgYnkgdGhlIGludGVycnVwdCBoYW5kbGVyICovCisJaW50IGlycV9jb3VudDsKKyNpZiBBTFRQQ0lFQ0hETUFfQ0RFVgorCS8qIGNoYXJhY3RlciBkZXZpY2UgKi8KKwlkZXZfdCBjZGV2bm87CisJc3RydWN0IGNkZXYgY2RldjsKKwkvKiB1c2VyIHNwYWNlIHNjYXR0ZXIgZ2F0aGVyIG1hcHBlciAqLworCXN0cnVjdCBzZ19tYXBwaW5nX3QgKnNnbTsKKyNlbmRpZgorfTsKKworLyoqCisgKiBVc2luZyB0aGUgc3Vic3lzdGVtIHZlbmRvciBpZCBhbmQgc3Vic3lzdGVtIGlkLCBpdCBpcyBwb3NzaWJsZSB0bworICogZGlzdGluZ3Vpc2ggYmV0d2VlbiBkaWZmZXJlbnQgY2FyZHMgYmFzZXMgYXJvdW5kIHRoZSBzYW1lCisgKiAodGhpcmQtcGFydHkpIGxvZ2ljIGNvcmUuCisgKgorICogRGVmYXVsdCBBbHRlcmEgdmVuZG9yIGFuZCBkZXZpY2UgSUQncywgYW5kIHNvbWUgKG5vbi1yZXNlcnZlZCkKKyAqIElEJ3MgYXJlIG5vdyB1c2VkIGhlcmUgdGhhdCBhcmUgdXNlZCBhbW9uZ3N0IHRoZSB0ZXN0ZXJzL2RldmVsb3BlcnMuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBpZHNbXSA9IHsKKwl7IFBDSV9ERVZJQ0UoMHgxMTcyLCAweEUwMDEpLCB9LAorCXsgUENJX0RFVklDRSgweDIwNzEsIDB4MjA3MSksIH0sCisJeyAwLCB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGlkcyk7CisKKyNpZiBBTFRQQ0lFQ0hETUFfQ0RFVgorLyogcHJvdG90eXBlcyBmb3IgY2hhcmFjdGVyIGRldmljZSAqLworc3RhdGljIGludCBzZ19pbml0KHN0cnVjdCBhcGVfZGV2ICphcGUpOworc3RhdGljIHZvaWQgc2dfZXhpdChzdHJ1Y3QgYXBlX2RldiAqYXBlKTsKKyNlbmRpZgorCisvKioKKyAqIGFsdHBjaWVjaGRtYV9pc3IoKSAtIEludGVycnVwdCBoYW5kbGVyCisgKgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgYWx0cGNpZWNoZG1hX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGFwZV9kZXYgKmFwZSA9IChzdHJ1Y3QgYXBlX2RldiAqKWRldl9pZDsKKwlpZiAoIWFwZSkKKwkJcmV0dXJuIElSUV9OT05FOworCWFwZS0+aXJxX2NvdW50Kys7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzY2FuX2JhcnMoc3RydWN0IGFwZV9kZXYgKmFwZSwgc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgQVBFX0JBUl9OVU07IGkrKykgeworCQl1bnNpZ25lZCBsb25nIGJhcl9zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIGkpOworCQlpZiAoYmFyX3N0YXJ0KSB7CisJCQl1bnNpZ25lZCBsb25nIGJhcl9lbmQgPSBwY2lfcmVzb3VyY2VfZW5kKGRldiwgaSk7CisJCQl1bnNpZ25lZCBsb25nIGJhcl9mbGFncyA9IHBjaV9yZXNvdXJjZV9mbGFncyhkZXYsIGkpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIkJBUiVkIDB4JTA4bHgtMHglMDhseCBmbGFncyAweCUwOGx4XG4iLAorCQkJICBpLCBiYXJfc3RhcnQsIGJhcl9lbmQsIGJhcl9mbGFncyk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogVW5tYXAgdGhlIEJBUiByZWdpb25zIHRoYXQgaGFkIGJlZW4gbWFwcGVkIGVhcmxpZXIgdXNpbmcgbWFwX2JhcnMoKQorICovCitzdGF0aWMgdm9pZCB1bm1hcF9iYXJzKHN0cnVjdCBhcGVfZGV2ICphcGUsIHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IEFQRV9CQVJfTlVNOyBpKyspIHsKKwkgIC8qIGlzIHRoaXMgQkFSIG1hcHBlZD8gKi8KKwkJaWYgKGFwZS0+YmFyW2ldKSB7CisJCQkvKiB1bm1hcCBCQVIgKi8KKwkJCXBjaV9pb3VubWFwKGRldiwgYXBlLT5iYXJbaV0pOworCQkJYXBlLT5iYXJbaV0gPSBOVUxMOworCQl9CisJfQorfQorCisvKioKKyAqIE1hcCB0aGUgZGV2aWNlIG1lbW9yeSByZWdpb25zIGludG8ga2VybmVsIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSBhZnRlcgorICogdmVyaWZ5aW5nIHRoZWlyIHNpemVzIHJlc3BlY3QgdGhlIG1pbmltdW0gc2l6ZXMgbmVlZGVkLCBnaXZlbiBieSB0aGUKKyAqIGJhcl9taW5fbGVuW10gYXJyYXkuCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IG1hcF9iYXJzKHN0cnVjdCBhcGVfZGV2ICphcGUsIHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaW50IHJjOworCWludCBpOworCS8qIGl0ZXJhdGUgdGhyb3VnaCBhbGwgdGhlIEJBUnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVBFX0JBUl9OVU07IGkrKykgeworCQl1bnNpZ25lZCBsb25nIGJhcl9zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIGkpOworCQl1bnNpZ25lZCBsb25nIGJhcl9lbmQgPSBwY2lfcmVzb3VyY2VfZW5kKGRldiwgaSk7CisJCXVuc2lnbmVkIGxvbmcgYmFyX2xlbmd0aCA9IGJhcl9lbmQgLSBiYXJfc3RhcnQgKyAxOworCQlhcGUtPmJhcltpXSA9IE5VTEw7CisJCS8qIGRvIG5vdCBtYXAsIGFuZCBza2lwLCBCQVJzIHdpdGggbGVuZ3RoIDAgKi8KKwkJaWYgKCFiYXJfbWluX2xlbltpXSkKKwkJCWNvbnRpbnVlOworCQkvKiBkbyBub3QgbWFwIEJBUnMgd2l0aCBhZGRyZXNzIDAgKi8KKwkJaWYgKCFiYXJfc3RhcnQgfHwgIWJhcl9lbmQpIHsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJCQVIgIyVkIGlzIG5vdCBwcmVzZW50PyFcbiIsIGkpOworCQkJcmMgPSAtMTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQliYXJfbGVuZ3RoID0gYmFyX2VuZCAtIGJhcl9zdGFydCArIDE7CisJCS8qIEJBUiBsZW5ndGggaXMgbGVzcyB0aGFuIGRyaXZlciByZXF1aXJlcz8gKi8KKwkJaWYgKGJhcl9sZW5ndGggPCBiYXJfbWluX2xlbltpXSkgeworICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIkJBUiAjJWQgbGVuZ3RoID0gJWx1IGJ5dGVzIGJ1dCBkcml2ZXIgIgorICAgICAgICAgICAgInJlcXVpcmVzIGF0IGxlYXN0ICVsdSBieXRlc1xuIiwgaSwgYmFyX2xlbmd0aCwgYmFyX21pbl9sZW5baV0pOworCQkJcmMgPSAtMTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQkvKiBtYXAgdGhlIGRldmljZSBtZW1vcnkgb3IgSU8gcmVnaW9uIGludG8ga2VybmVsIHZpcnR1YWwKKwkJICogYWRkcmVzcyBzcGFjZSAqLworCQlhcGUtPmJhcltpXSA9IHBjaV9pb21hcChkZXYsIGksIGJhcl9taW5fbGVuW2ldKTsKKwkJaWYgKCFhcGUtPmJhcltpXSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIkNvdWxkIG5vdCBtYXAgQkFSICMlZC5cbiIsIGkpOworCQkJcmMgPSAtMTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiQkFSWyVkXSBtYXBwZWQgYXQgMHglcCB3aXRoIGxlbmd0aCAlbHUoLyVsdSkuXG4iLCBpLAorCQkJYXBlLT5iYXJbaV0sIGJhcl9taW5fbGVuW2ldLCBiYXJfbGVuZ3RoKTsKKwl9CisJLyogc3VjY2VzZnVsbHkgbWFwcGVkIGFsbCByZXF1aXJlZCBCQVIgcmVnaW9ucyAqLworCXJjID0gMDsKKwlnb3RvIHN1Y2Nlc3M7CitmYWlsOgorCS8qIHVubWFwIGFueSBCQVJzIHRoYXQgd2UgZGlkIG1hcCAqLworCXVubWFwX2JhcnMoYXBlLCBkZXYpOworc3VjY2VzczoKKwlyZXR1cm4gcmM7Cit9CisKKyNpZiAwIC8qIG5vdCB5ZXQgaW1wbGVtZW50ZWQgZnVsbHkgRklYTUUgYWRkIG9wY29kZSAqLworc3RhdGljIHZvaWQgX19kZXZpbml0IHJjc2xhdmVfdGVzdChzdHJ1Y3QgYXBlX2RldiAqYXBlLCBzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXUzMiAqcmNzbGF2ZV9tZW0gPSAodTMyICopYXBlLT5iYXJbQVBFX0JBUl9SQ1NMQVZFXTsKKwl1MzIgcmVzdWx0ID0gMDsKKwkvKiogdGhpcyBudW1iZXIgaXMgYXNzdW1lZCB0byBiZSBkaWZmZXJlbnQgZWFjaCB0aW1lIHRoaXMgdGVzdCBydW5zICovCisJdTMyIHNlZWQgPSAodTMyKWppZmZpZXM7CisJdTMyIHZhbHVlID0gc2VlZDsKKwlpbnQgaTsKKworCS8qIHdyaXRlIGxvb3AgKi8KKwl2YWx1ZSA9IHNlZWQ7CisJZm9yIChpID0gMTAyNDsgaSA8IDMyNzY4IC8gNCA7IGkrKykgeworCQlwcmludGsoS0VSTl9ERUJVRyAiV3JpdGluZyAweCUwOHggdG8gMHglcC5cbiIsCisJCQkodTMyKXZhbHVlLCAodm9pZCAqKXJjc2xhdmVfbWVtICsgaSk7CisJCWlvd3JpdGUzMih2YWx1ZSwgcmNzbGF2ZV9tZW0gKyBpKTsKKwkJdmFsdWUrKzsKKwl9CisJLyogcmVhZC1iYWNrIGxvb3AgKi8KKwl2YWx1ZSA9IHNlZWQ7CisJZm9yIChpID0gMTAyNDsgaSA8IDMyNzY4IC8gNDsgaSsrKSB7CisJCXJlc3VsdCA9IGlvcmVhZDMyKHJjc2xhdmVfbWVtICsgaSk7CisJCWlmIChyZXN1bHQgIT0gdmFsdWUpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJXcm90ZSAweCUwOHggdG8gMHglcCwgYnV0IHJlYWQgYmFjayAweCUwOHguXG4iLAorCQkJCSh1MzIpdmFsdWUsICh2b2lkICopcmNzbGF2ZV9tZW0gKyBpLCAodTMyKXJlc3VsdCk7CisJCQlicmVhazsKKwkJfQorCQl2YWx1ZSsrOworCX0KK30KKyNlbmRpZgorCisvKiBvYnRhaW4gdGhlIDMyIG1vc3Qgc2lnbmlmaWNhbnQgKGhpZ2gpIGJpdHMgb2YgYSAzMi1iaXQgb3IgNjQtYml0IGFkZHJlc3MgKi8KKyNkZWZpbmUgcGNpX2RtYV9oKGFkZHIpICgoYWRkciA+PiAxNikgPj4gMTYpCisvKiBvYnRhaW4gdGhlIDMyIGxlYXN0IHNpZ25pZmljYW50IChsb3cpIGJpdHMgb2YgYSAzMi1iaXQgb3IgNjQtYml0IGFkZHJlc3MgKi8KKyNkZWZpbmUgcGNpX2RtYV9sKGFkZHIpIChhZGRyICYgMHhmZmZmZmZmZlVMKQorCisvKiBhcGVfZmlsbF9jaGRtYV9kZXNjKCkgLSBGaWxsIGEgQWx0ZXJhIFBDSSBFeHByZXNzIENoYWluaW5nIERNQSBkZXNjcmlwdG9yCisgKgorICogQGRlc2MgcG9pbnRlciB0byBkZXNjcmlwdG9yIHRvIGJlIGZpbGxlZAorICogQGFkZHIgcm9vdCBjb21wbGV4IGFkZHJlc3MKKyAqIEBlcF9hZGRyIGVuZCBwb2ludCBhZGRyZXNzCisgKiBAbGVuIG51bWJlciBvZiBieXRlcywgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBhcGVfY2hkbWFfZGVzY19zZXQoc3RydWN0IGFwZV9jaGRtYV9kZXNjICpkZXNjLCBkbWFfYWRkcl90IGFkZHIsIHUzMiBlcF9hZGRyLCBpbnQgbGVuKQoreworICBCVUdfT04obGVuICYgMyk7CisJZGVzYy0+dzAgPSBjcHVfdG9fbGUzMihsZW4gLyA0KTsKKwlkZXNjLT5lcF9hZGRyID0gY3B1X3RvX2xlMzIoZXBfYWRkcik7CisJZGVzYy0+cmNfYWRkcl9oID0gY3B1X3RvX2xlMzIocGNpX2RtYV9oKGFkZHIpKTsKKwlkZXNjLT5yY19hZGRyX2wgPSBjcHVfdG9fbGUzMihwY2lfZG1hX2woYWRkcikpOworfQorCisvKgorICogYXBlX3NnX3RvX2NoZG1hX3RhYmxlKCkgLSBDcmVhdGUgYSBkZXZpY2UgZGVzY3JpcHRvciB0YWJsZSBmcm9tIGEgc2NhdHRlcmxpc3QuCisgKgorICogVGhlIHNjYXR0ZXJsaXN0IG11c3QgaGF2ZSBiZWVuIG1hcHBlZCBieSBwY2lfbWFwX3NnKHNnbS0+c2dsKS4KKyAqCisgKiBAc2dsIHNjYXR0ZXJsaXN0LgorICogQG5lbnRzIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBzY2F0dGVybGlzdC4KKyAqIEBmaXJzdCBTdGFydCBpbmRleCBpbiB0aGUgc2NhdHRlcmxpc3Qgc2dtLT5zZ2wuCisgKiBAZXBfYWRkciBFbmQgUG9pbnQgYWRkcmVzcyBmb3IgdGhlIHNjYXR0ZXIvZ2F0aGVyIHRyYW5zZmVyLgorICogQGRlc2MgcG9pbnRlciB0byBmaXJzdCBkZXNjcmlwdG9yCisgKgorICogUmV0dXJucyBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgdGFibGUgb24gc3VjY2VzcywgLTEgb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgYXBlX3NnX3RvX2NoZG1hX3RhYmxlKHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsLCBpbnQgbmVudHMsIGludCBmaXJzdCwgc3RydWN0IGFwZV9jaGRtYV9kZXNjICpkZXNjLCB1MzIgZXBfYWRkcikKK3sKKwlpbnQgaSA9IGZpcnN0LCBqID0gMDsKKwkvKiBpbnNwZWN0IGZpcnN0IGVudHJ5ICovCisJZG1hX2FkZHJfdCBhZGRyID0gc2dfZG1hX2FkZHJlc3MoJnNnbFtpXSk7CisJdW5zaWduZWQgaW50IGxlbiA9IHNnX2RtYV9sZW4oJnNnbFtpXSk7CisJLyogY29udGlndW91cyBibG9jayAqLworCWRtYV9hZGRyX3QgY29udF9hZGRyID0gYWRkcjsKKwl1bnNpZ25lZCBpbnQgY29udF9sZW4gPSBsZW47CisJLyogaXRlcmF0ZSBvdmVyIHJlbWFpbmluZyBlbnRyaWVzICovCisJZm9yICg7IGogPCAyNSAmJiBpIDwgbmVudHMgLSAxOyBpKyspIHsKKwkJLyogYnVzIGFkZHJlc3Mgb2YgbmV4dCBlbnRyeSBpICsgMSAqLworCQlkbWFfYWRkcl90IG5leHQgPSBzZ19kbWFfYWRkcmVzcygmc2dsW2kgKyAxXSk7CisJCS8qIGxlbmd0aCBvZiB0aGlzIGVudHJ5IGkgKi8KKwkJbGVuID0gc2dfZG1hX2xlbigmc2dsW2ldKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiUwNGQ6IGFkZHI9MHglMDh4IGxlbmd0aD0weCUwOHhcbiIsIGksIGFkZHIsIGxlbik7CisJCS8qIGVudHJ5IGkgKyAxIGlzIG5vbi1jb250aWd1b3VzIHdpdGggZW50cnkgaT8gKi8KKwkJaWYgKG5leHQgIT0gYWRkciArIGxlbikgeworCQkJLyogVE9ETyBjcmVhdGUgZW50cnkgaGVyZSAod2UgY291bGQgb3ZlcndyaXRlIGkpICovCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJTRkOiBjb250X2FkZHI9MHglMDh4IGNvbnRfbGVuPTB4JTA4eFxuIiwgaiwgY29udF9hZGRyLCBjb250X2xlbik7CisJCQkvKiBzZXQgZGVzY3JpcHRvciBmb3IgY29udGlndW91cyB0cmFuc2ZlciAqLworCQkJYXBlX2NoZG1hX2Rlc2Nfc2V0KCZkZXNjW2pdLCBjb250X2FkZHIsIGVwX2FkZHIsIGNvbnRfbGVuKTsKKwkJCS8qIG5leHQgZW5kIHBvaW50IG1lbW9yeSBhZGRyZXNzICovCisJCQllcF9hZGRyICs9IGNvbnRfbGVuOworCQkJLyogc3RhcnQgbmV3IGNvbnRpZ3VvdXMgYmxvY2sgKi8KKwkJCWNvbnRfYWRkciA9IG5leHQ7CisJCQljb250X2xlbiA9IDA7CisJCQlqKys7CisJCX0KKwkJLyogYWRkIGVudHJ5IGkgKyAxIHRvIGN1cnJlbnQgY29udGlndW91cyBibG9jayAqLworCQljb250X2xlbiArPSBsZW47CisJCS8qIGdvdG8gZW50cnkgaSArIDEgKi8KKwkJYWRkciA9IG5leHQ7CisJfQorCS8qIFRPRE8gY3JlYXRlIGVudHJ5IGhlcmUgICh3ZSBjb3VsZCBvdmVyd3JpdGUgaSkgKi8KKwlwcmludGsoS0VSTl9ERUJVRyAiJTA0ZDogYWRkcj0weCUwOHggbGVuZ3RoPTB4JTA4eFxuIiwgaSwgYWRkciwgbGVuKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiJTRkOiBjb250X2FkZHI9MHglMDh4IGxlbmd0aD0weCUwOHhcbiIsIGosIGNvbnRfYWRkciwgY29udF9sZW4pOworCWorKzsKKwlyZXR1cm4gajsKK30KKworLyogY29tcGFyZSBidWZmZXJzICovCitzdGF0aWMgaW5saW5lIGludCBjb21wYXJlKHUzMiAqcCwgdTMyICpxLCBpbnQgbGVuKQoreworCWludCByZXN1bHQgPSAtMTsKKwlpbnQgZmFpbCA9IDA7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IGxlbiAvIDQ7IGkrKykgeworCQlpZiAoKnAgPT0gKnEpIHsKKwkJCS8qIGV2ZXJ5IHNvIG1hbnkgdTMyIHdvcmRzLCBzaG93IGVxdWFscyAqLworCQkJaWYgKChpICYgMjU1KSA9PSAwKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICJbJXBdID0gMHglMDh4ICAgIFslcF0gPSAweCUwOHhcbiIsIHAsICpwLCBxLCAqcSk7CisJCX0gZWxzZSB7CisJCQlmYWlsKys7CisJCQkvKiBzaG93IHRoZSBmaXJzdCBmZXcgbWlzY29tcGFyZXMgKi8KKwkJCWlmIChmYWlsIDwgMTApIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiWyVwXSA9IDB4JTA4eCAhPSBbJXBdID0gMHglMDh4ID8hXG4iLCBwLCAqcCwgcSwgKnEpOworICAgICAgICAgICAgLyogYnV0IHN0b3AgYWZ0ZXIgYSB3aGlsZSAqLworICAgICAgICAgICAgfSBlbHNlIGlmIChmYWlsID09IDEwKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIi0tLW1vcmUgZXJyb3JzIGZvbGxvdyEgbm90IHByaW50ZWQtLS1cbiIpOworCQkgIAl9IGVsc2UgeworCQkJCS8qIHN0b3AgY29tcGFyZSBhZnRlciB0aGlzIG1hbnkgZXJyb3JzICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisJCX0KKwkJcCsrOworCQlxKys7CisJfQorCWlmICghZmFpbCkKKwkJcmVzdWx0ID0gMDsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiBkbWFfdGVzdCgpIC0gUGVyZm9ybSBETUEgbG9vcCBiYWNrIHRlc3QgdG8gZW5kIHBvaW50IGFuZCBiYWNrIHRvIHJvb3QgY29tcGxleC4KKyAqCisgKiBBbGxvY2F0ZSBhIGNhY2hlLWNvaGVyZW50IGJ1ZmZlciBpbiBob3N0IG1lbW9yeSwgY29uc2lzdGluZyBvZiBmb3VyIHBhZ2VzLgorICoKKyAqIEZpbGwgdGhlIGZvdXIgbWVtb3J5IHBhZ2VzIHN1Y2ggdGhhdCBlYWNoIDMyLWJpdCB3b3JkIGNvbnRhaW5zIGl0cyBvd24gYWRkcmVzcy4KKyAqCisgKiBOb3cgcGVyZm9ybSBhIGxvb3AgYmFjayB0ZXN0LCBoYXZlIHRoZSBlbmQgcG9pbnQgZGV2aWNlIGNvcHkgdGhlIGZpcnN0IGJ1ZmZlcgorICogaGFsZiB0byBlbmQgcG9pbnQgbWVtb3J5LCB0aGVuIGhhdmUgaXQgY29weSBiYWNrIGludG8gdGhlIHNlY29uZCBoYWxmLgorICoKKyAqICAgQ3JlYXRlIGEgZGVzY3JpcHRvciB0YWJsZSB0byBjb3B5IHRoZSBmaXJzdCBidWZmZXIgaGFsZiBpbnRvIEVuZCBQb2ludAorICogICBtZW1vcnkuIEluc3RydWN0IHRoZSBFbmQgUG9pbnQgdG8gZG8gYSBETUEgcmVhZCB1c2luZyB0aGF0IHRhYmxlLgorICoKKyAqICAgQ3JlYXRlIGEgZGVzY3JpcHRvciB0YWJsZSB0byBjb3B5IEVuZCBQb2ludCBtZW1vcnkgdG8gdGhlIHNlY29uZCBidWZmZXIKKyAqICAgaGFsZi4gSW5zdHJ1Y3QgdGhlIEVuZCBQb2ludCB0byBkbyBhIERNQSB3cml0ZSB1c2luZyB0aGF0IHRhYmxlLgorICoKKyAqIENvbXBhcmUgcmVzdWx0cywgZmFpbCBvciBwYXNzLgorICoKKyAqLworc3RhdGljIGludCBfX2RldmluaXQgZG1hX3Rlc3Qoc3RydWN0IGFwZV9kZXYgKmFwZSwgc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwkvKiB0ZXN0IHJlc3VsdDsgZ3VpbHR5IHVudGlsIHByb3ZlbiBpbm5vY2VudCAqLworCWludCByZXN1bHQgPSAtMTsKKwkvKiB0aGUgRE1BIHJlYWQgaGVhZGVyIHNpdHMgYXQgYWRkcmVzcyAweDAwIG9mIHRoZSBETUEgZW5naW5lIEJBUiAqLworCXN0cnVjdCBhcGVfY2hkbWFfaGVhZGVyICp3cml0ZV9oZWFkZXIgPSAoc3RydWN0IGFwZV9jaGRtYV9oZWFkZXIgKilhcGUtPmJhcltBUEVfQkFSX0hFQURFUl07CisJLyogdGhlIHdyaXRlIERNQSBoZWFkZXIgc2l0cyBhZnRlciB0aGUgcmVhZCBoZWFkZXIgYXQgYWRkcmVzcyAweDEwICovCisJc3RydWN0IGFwZV9jaGRtYV9oZWFkZXIgKnJlYWRfaGVhZGVyID0gd3JpdGVfaGVhZGVyICsgMTsKKwkvKiB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIgKi8KKwl1OCAqYnVmZmVyX3ZpcnQgPSAwOworCS8qIGJ1cyBhZGRyZXNzIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyICovCisJZG1hX2FkZHJfdCBidWZmZXJfYnVzID0gMDsKKwlpbnQgaSwgbiA9IDAsIGlycV9jb3VudDsKKworCS8qIHRlbXBvcmFyeSB2YWx1ZSB1c2VkIHRvIGNvbnN0cnVjdCAzMi1iaXQgZGF0YSB3b3JkcyAqLworCXUzMiB3OworCisJcHJpbnRrKEtFUk5fREVCVUcgImJhcl90ZXN0cygpLCBQQUdFX1NJWkUgPSAweCUweFxuIiwgKGludClQQUdFX1NJWkUpOworCXByaW50ayhLRVJOX0RFQlVHICJ3cml0ZV9oZWFkZXIgPSAweCVwLlxuIiwgd3JpdGVfaGVhZGVyKTsKKwlwcmludGsoS0VSTl9ERUJVRyAicmVhZF9oZWFkZXIgPSAweCVwLlxuIiwgcmVhZF9oZWFkZXIpOworCXByaW50ayhLRVJOX0RFQlVHICImd3JpdGVfaGVhZGVyLT53MyA9IDB4JXBcbiIsICZ3cml0ZV9oZWFkZXItPnczKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiJnJlYWRfaGVhZGVyLT53MyA9IDB4JXBcbiIsICZyZWFkX2hlYWRlci0+dzMpOworCXByaW50ayhLRVJOX0RFQlVHICJhcGUtPnRhYmxlX3ZpcnQgPSAweCVwLlxuIiwgYXBlLT50YWJsZV92aXJ0KTsKKworCWlmICghd3JpdGVfaGVhZGVyIHx8ICFyZWFkX2hlYWRlciB8fCAhYXBlLT50YWJsZV92aXJ0KQorICAgICAgICBnb3RvIGZhaWw7CisKKwkvKiBhbGxvY2F0ZSBhbmQgbWFwIGNvaGVyZW50bHktY2FjaGVkIG1lbW9yeSBmb3IgYSBETUEtYWJsZSBidWZmZXIgKi8KKwkvKiBAc2VlIDIuNi4yNi4yL0RvY3VtZW50YXRpb24vRE1BLW1hcHBpbmcudHh0IGxpbmUgMzE4ICovCisJYnVmZmVyX3ZpcnQgPSAodTggKilwY2lfYWxsb2NfY29uc2lzdGVudChkZXYsIFBBR0VfU0laRSAqIDQsICZidWZmZXJfYnVzKTsKKwlpZiAoIWJ1ZmZlcl92aXJ0KSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJDb3VsZCBub3QgYWxsb2NhdGUgY29oZXJlbnQgRE1BIGJ1ZmZlci5cbiIpOworCQlnb3RvIGZhaWw7CisJfQorCXByaW50ayhLRVJOX0RFQlVHICJBbGxvY2F0ZWQgY2FjaGUtY29oZXJlbnQgRE1BIGJ1ZmZlciAodmlydHVhbCBhZGRyZXNzID0gMHglMDE2bGx4LCBidXMgYWRkcmVzcyA9IDB4JTAxNmxseCkuXG4iLAorCQkodTY0KWJ1ZmZlcl92aXJ0LCAodTY0KWJ1ZmZlcl9idXMpOworCisJLyogZmlsbCBmaXJzdCBoYWxmIG9mIGJ1ZmZlciB3aXRoIGl0cyB2aXJ0dWFsIGFkZHJlc3MgYXMgZGF0YSAqLworCWZvciAoaSA9IDA7IGkgPCA0ICogUEFHRV9TSVpFOyBpICs9IDQpCisjaWYgMAorCQkqKHUzMiAqKShidWZmZXJfdmlydCArIGkpID0gaSAvIFBBR0VfU0laRSArIDE7CisjZWxzZQorCQkqKHUzMiAqKShidWZmZXJfdmlydCArIGkpID0gKGJ1ZmZlcl92aXJ0ICsgaSk7CisjZW5kaWYKKyNpZiAwCisgIGNvbXBhcmUoKHUzMiAqKWJ1ZmZlcl92aXJ0LCAodTMyICopKGJ1ZmZlcl92aXJ0ICsgMiAqIFBBR0VfU0laRSksIDgxOTIpOworI2VuZGlmCisKKyNpZiAwCisJLyogZmlsbCBzZWNvbmQgaGFsZiBvZiBidWZmZXIgd2l0aCB6ZXJvZXMgKi8KKwlmb3IgKGkgPSAyICogUEFHRV9TSVpFOyBpIDwgNCAqIFBBR0VfU0laRTsgaSArPSA0KQorCQkqKHUzMiAqKShidWZmZXJfdmlydCArIGkpID0gMDsKKyNlbmRpZgorCisJLyogaW52YWxpZGF0ZSBFUExBU1QsIG91dHNpZGUgMC0yNTUsIDB4RkFERSBpcyBmcm9tIHRoZSB0ZXN0YmVuY2ggKi8KKwlhcGUtPnRhYmxlX3ZpcnQtPnczID0gY3B1X3RvX2xlMzIoMHgwMDAwRkFERSk7CisKKwkvKiBmaWxsIGluIGZpcnN0IGRlc2NyaXB0b3IgKi8KKwluID0gMDsKKwkvKiByZWFkIDgxOTIgYnl0ZXMgZnJvbSBSQyBidWZmZXIgdG8gRVAgYWRkcmVzcyA0MDk2ICovCisJYXBlX2NoZG1hX2Rlc2Nfc2V0KCZhcGUtPnRhYmxlX3ZpcnQtPmRlc2Nbbl0sIGJ1ZmZlcl9idXMsIDQwOTYsIDIgKiBQQUdFX1NJWkUpOworI2lmIDEKKwlmb3IgKGkgPSAwOyBpIDwgMjU1OyBpKyspIHsKKwkJYXBlX2NoZG1hX2Rlc2Nfc2V0KCZhcGUtPnRhYmxlX3ZpcnQtPmRlc2NbaV0sIGJ1ZmZlcl9idXMsIDQwOTYsIDIgKiBQQUdFX1NJWkUpOworCX0KKwkvKiBpbmRleCBvZiBsYXN0IGRlc2NyaXB0b3IgKi8KKwluID0gaSAtIDE7CisjZW5kaWYKKyNpZiAwCisJLyogZmlsbCBpbiBuZXh0IGRlc2NyaXB0b3IgKi8KKwluKys7CisJLyogcmVhZCAxMDI0IGJ5dGVzIGZyb20gUkMgYnVmZmVyIHRvIEVQIGFkZHJlc3MgNDA5NiArIDEwMjQgKi8KKwlhcGVfY2hkbWFfZGVzY19zZXQoJmFwZS0+dGFibGVfdmlydC0+ZGVzY1tuXSwgYnVmZmVyX2J1cyArIDEwMjQsIDQwOTYgKyAxMDI0LCAxMDI0KTsKKyNlbmRpZgorCisjaWYgMQorCS8qIGVuYWJsZSBNU0kgYWZ0ZXIgdGhlIGxhc3QgZGVzY3JpcHRvciBpcyBjb21wbGV0ZWQgKi8KKwlpZiAoYXBlLT5tc2lfZW5hYmxlZCkKKwkJYXBlLT50YWJsZV92aXJ0LT5kZXNjW25dLncwIHw9IGNwdV90b19sZTMyKDFVTCA8PCAxNikvKmxvY2FsIE1TSSovOworI2VuZGlmCisjaWYgMAorCS8qIGR1bXAgZGVzY3JpcHRvciB0YWJsZSBmb3IgZGVidWdnaW5nICovCisJcHJpbnRrKEtFUk5fREVCVUcgIkRlc2NyaXB0b3IgVGFibGUgKFJlYWQsIGluIFJvb3QgQ29tcGxleCBNZW1vcnksICMgPSAlZClcbiIsIG4gKyAxKTsKKwlmb3IgKGkgPSAwOyBpIDwgNCArIChuICsgMSkgKiA0OyBpICs9IDQpIHsKKwkJdTMyICpwID0gKHUzMiAqKWFwZS0+dGFibGVfdmlydDsKKwkJcCArPSBpOworCQlwcmludGsoS0VSTl9ERUJVRyAiMHglMDh4LzB4JTAyeDogMHglMDh4IChMRU49MHgleClcbiIsICh1MzIpcCwgKHUzMilwICYgMTUsICpwLCA0ICogbGUzMl90b19jcHUoKnApKTsKKwkJcCsrOworCQlwcmludGsoS0VSTl9ERUJVRyAiMHglMDh4LzB4JTAyeDogMHglMDh4IChFUEE9MHgleClcbiIsICh1MzIpcCwgKHUzMilwICYgMTUsICpwLCBsZTMyX3RvX2NwdSgqcCkpOworCQlwKys7CisJCXByaW50ayhLRVJOX0RFQlVHICIweCUwOHgvMHglMDJ4OiAweCUwOHggKFJDSD0weCV4KVxuIiwgKHUzMilwLCAodTMyKXAgJiAxNSwgKnAsIGxlMzJfdG9fY3B1KCpwKSk7CisJCXArKzsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIjB4JTA4eC8weCUwMng6IDB4JTA4eCAoUkNMPTB4JXgpXG4iLCAodTMyKXAsICh1MzIpcCAmIDE1LCAqcCwgbGUzMl90b19jcHUoKnApKTsKKwl9CisjZW5kaWYKKwkvKiBzZXQgYXZhaWxhYmxlIG51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiB0YWJsZSAqLworCXcgPSAodTMyKShuICsgMSk7CisJdyB8PSAoMVVMIDw8IDE4KS8qZ2xvYmFsIEVQTEFTVF9FTiovOworI2lmIDAKKwlpZiAoYXBlLT5tc2lfZW5hYmxlZCkKKwkJdyB8PSAoMVVMIDw8IDE3KS8qZ2xvYmFsIE1TSSovOworI2VuZGlmCisJcHJpbnRrKEtFUk5fREVCVUcgIndyaXRpbmcgMHglMDh4IHRvIDB4JXBcbiIsIHcsICh2b2lkICopJnJlYWRfaGVhZGVyLT53MCk7CisJaW93cml0ZTMyKHcsICZyZWFkX2hlYWRlci0+dzApOworCisJLyogd3JpdGUgdGFibGUgYWRkcmVzcyAoaGlnaGVyIDMyLWJpdHMpICovCisJcHJpbnRrKEtFUk5fREVCVUcgIndyaXRpbmcgMHglMDh4IHRvIDB4JXBcbiIsICh1MzIpKChhcGUtPnRhYmxlX2J1cyA+PiAxNikgPj4gMTYpLCAodm9pZCAqKSZyZWFkX2hlYWRlci0+YmR0X2FkZHJfaCk7CisJaW93cml0ZTMyKHBjaV9kbWFfaChhcGUtPnRhYmxlX2J1cyksICZyZWFkX2hlYWRlci0+YmR0X2FkZHJfaCk7CisKKwkvKiB3cml0ZSB0YWJsZSBhZGRyZXNzIChsb3dlciAzMi1iaXRzKSAqLworCXByaW50ayhLRVJOX0RFQlVHICJ3cml0aW5nIDB4JTA4eCB0byAweCVwXG4iLCAodTMyKShhcGUtPnRhYmxlX2J1cyAmIDB4ZmZmZmZmZmZVTCksICh2b2lkICopJnJlYWRfaGVhZGVyLT5iZHRfYWRkcl9sKTsKKwlpb3dyaXRlMzIocGNpX2RtYV9sKGFwZS0+dGFibGVfYnVzKSwgJnJlYWRfaGVhZGVyLT5iZHRfYWRkcl9sKTsKKworCS8qIG1lbW9yeSB3cml0ZSBiYXJyaWVyICovCisJd21iKCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIkZsdXNoIHBvc3RlZCB3cml0ZXNcbiIpOworCS8qKiBGSVhNRSBBZGQgZHVtbXkgcmVhZCB0byBmbHVzaCBwb3N0ZWQgd3JpdGVzIGJ1dCBuZWVkIGEgcmVhZGFibGUgbG9jYXRpb24hICovCisjaWYgMAorCSh2b2lkKWlvcmVhZDMyKCk7CisjZW5kaWYKKworCS8qIHJlbWVtYmVyIElSUSBjb3VudCBiZWZvcmUgdGhlIHRyYW5zZmVyICovCisJaXJxX2NvdW50ID0gYXBlLT5pcnFfY291bnQ7CisJLyogd3JpdGUgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIC0gdGhpcyBzdGFydHMgdGhlIERNQSAqLworCXByaW50ayhLRVJOX0RFQlVHICJcblN0YXJ0IERNQSByZWFkXG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAid3JpdGluZyAweCUwOHggdG8gMHglcFxuIiwgKHUzMiluLCAodm9pZCAqKSZyZWFkX2hlYWRlci0+dzMpOworCWlvd3JpdGUzMihuLCAmcmVhZF9oZWFkZXItPnczKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiRVBMQVNUID0gJWx1XG4iLCBsZTMyX3RvX2NwdSgqKHUzMiAqKSZhcGUtPnRhYmxlX3ZpcnQtPnczKSAmIDB4ZmZmZlVMKTsKKworCS8qKiBtZW1vcnkgd3JpdGUgYmFycmllciAqLworCXdtYigpOworCS8qIGR1bW15IHJlYWQgdG8gZmx1c2ggcG9zdGVkIHdyaXRlcyAqLworCS8qIEZJWE1FIE5lZWQgYSByZWFkYWJsZSBsb2NhdGlvbiEgKi8KKyNpZiAwCisJKHZvaWQpaW9yZWFkMzIoKTsKKyNlbmRpZgorCXByaW50ayhLRVJOX0RFQlVHICJQT0xMIEZPUiBSRUFEOlxuIik7CisJLyogcG9sbCBmb3IgY2hhaW4gY29tcGxldGlvbiwgMTAwMCB0aW1lcyAxIG1pbGxpc2Vjb25kICovCisJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCXZvbGF0aWxlIHUzMiAqcCA9ICZhcGUtPnRhYmxlX3ZpcnQtPnczOworCQl1MzIgZXBsYXN0ID0gbGUzMl90b19jcHUoKnApICYgMHhmZmZmVUw7CisJCXByaW50ayhLRVJOX0RFQlVHICJFUExBU1QgPSAldSwgbiA9ICVkXG4iLCBlcGxhc3QsIG4pOworCQlpZiAoZXBsYXN0ID09IG4pIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJET05FXG4iKTsKKyAgICAgICAgICAgIC8qIHByaW50IElSUSBjb3VudCBiZWZvcmUgdGhlIHRyYW5zZmVyICovCisJCQlwcmludGsoS0VSTl9ERUJVRyAiI0lSUXMgZHVyaW5nIHRyYW5zZmVyOiAlZFxuIiwgYXBlLT5pcnFfY291bnQgLSBpcnFfY291bnQpOworCQkJYnJlYWs7CisJCX0KKwkJdWRlbGF5KDEwMCk7CisJfQorCisJLyogaW52YWxpZGF0ZSBFUExBU1QsIG91dHNpZGUgMC0yNTUsIDB4RkFERSBpcyBmcm9tIHRoZSB0ZXN0YmVuY2ggKi8KKwlhcGUtPnRhYmxlX3ZpcnQtPnczID0gY3B1X3RvX2xlMzIoMHgwMDAwRkFERSk7CisKKwkvKiBzZXR1cCBmaXJzdCBkZXNjcmlwdG9yICovCisJbiA9IDA7CisJYXBlX2NoZG1hX2Rlc2Nfc2V0KCZhcGUtPnRhYmxlX3ZpcnQtPmRlc2Nbbl0sIGJ1ZmZlcl9idXMgKyA4MTkyLCA0MDk2LCAyICogUEFHRV9TSVpFKTsKKyNpZiAxCisJZm9yIChpID0gMDsgaSA8IDI1NTsgaSsrKSB7CisJCWFwZV9jaGRtYV9kZXNjX3NldCgmYXBlLT50YWJsZV92aXJ0LT5kZXNjW2ldLCBidWZmZXJfYnVzICsgODE5MiwgNDA5NiwgMiAqIFBBR0VfU0laRSk7CisJfQorCS8qIGluZGV4IG9mIGxhc3QgZGVzY3JpcHRvciAqLworCW4gPSBpIC0gMTsKKyNlbmRpZgorI2lmIDEgLyogdGVzdCB2YXJpYWJsZSwgbWFrZSBhIG1vZHVsZSBvcHRpb24gbGF0ZXIgKi8KKwlpZiAoYXBlLT5tc2lfZW5hYmxlZCkKKwkJYXBlLT50YWJsZV92aXJ0LT5kZXNjW25dLncwIHw9IGNwdV90b19sZTMyKDFVTCA8PCAxNikvKmxvY2FsIE1TSSovOworI2VuZGlmCisjaWYgMAorCS8qIGR1bXAgZGVzY3JpcHRvciB0YWJsZSBmb3IgZGVidWdnaW5nICovCisJcHJpbnRrKEtFUk5fREVCVUcgIkRlc2NyaXB0b3IgVGFibGUgKFdyaXRlLCBpbiBSb290IENvbXBsZXggTWVtb3J5LCAjID0gJWQpXG4iLCBuICsgMSk7CisJZm9yIChpID0gMDsgaSA8IDQgKyAobiArIDEpICogNDsgaSArPSA0KSB7CisJCXUzMiAqcCA9ICh1MzIgKilhcGUtPnRhYmxlX3ZpcnQ7CisJCXAgKz0gaTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIjB4JTA4eC8weCUwMng6IDB4JTA4eCAoTEVOPTB4JXgpXG4iLCAodTMyKXAsICh1MzIpcCAmIDE1LCAqcCwgNCAqIGxlMzJfdG9fY3B1KCpwKSk7CisJCXArKzsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIjB4JTA4eC8weCUwMng6IDB4JTA4eCAoRVBBPTB4JXgpXG4iLCAodTMyKXAsICh1MzIpcCAmIDE1LCAqcCwgbGUzMl90b19jcHUoKnApKTsKKwkJcCsrOworCQlwcmludGsoS0VSTl9ERUJVRyAiMHglMDh4LzB4JTAyeDogMHglMDh4IChSQ0g9MHgleClcbiIsICh1MzIpcCwgKHUzMilwICYgMTUsICpwLCBsZTMyX3RvX2NwdSgqcCkpOworCQlwKys7CisJCXByaW50ayhLRVJOX0RFQlVHICIweCUwOHgvMHglMDJ4OiAweCUwOHggKFJDTD0weCV4KVxuIiwgKHUzMilwLCAodTMyKXAgJiAxNSwgKnAsIGxlMzJfdG9fY3B1KCpwKSk7CisJfQorI2VuZGlmCisKKwkvKiBzZXQgbnVtYmVyIG9mIGF2YWlsYWJsZSBkZXNjcmlwdG9ycyBpbiB0aGUgdGFibGUgKi8KKwl3ID0gKHUzMikobiArIDEpOworCS8qIGVuYWJsZSB1cGRhdGVzIG9mIGVwbGFzdCBmb3IgZWFjaCBkZXNjcmlwdG9yIGNvbXBsZXRpb24gKi8KKwl3IHw9ICh1MzIpKDFVTCA8PCAxOCkvKmdsb2JhbCBFUExBU1RfRU4qLzsKKyNpZiAwIC8vIHRlc3QgdmFyaWFibGUsIG1ha2UgYSBtb2R1bGUgb3B0aW9uIGxhdGVyCisJLyogZW5hYmxlIE1TSSBmb3IgZWFjaCBkZXNjcmlwdG9yIGNvbXBsZXRpb24gKi8KKwlpZiAoYXBlLT5tc2lfZW5hYmxlZCkKKwkJdyB8PSAoMVVMIDw8IDE3KS8qZ2xvYmFsIE1TSSovOworI2VuZGlmCisJaW93cml0ZTMyKHcsICZ3cml0ZV9oZWFkZXItPncwKTsKKwlpb3dyaXRlMzIocGNpX2RtYV9oKGFwZS0+dGFibGVfYnVzKSwgJndyaXRlX2hlYWRlci0+YmR0X2FkZHJfaCk7CisJaW93cml0ZTMyKHBjaV9kbWFfbChhcGUtPnRhYmxlX2J1cyksICZ3cml0ZV9oZWFkZXItPmJkdF9hZGRyX2wpOworCisJLyoqIG1lbW9yeSB3cml0ZSBiYXJyaWVyIGFuZCBmbHVzaCBwb3N0ZWQgd3JpdGVzICovCisJd21iKCk7CisJLyogZHVtbXkgcmVhZCB0byBmbHVzaCBwb3N0ZWQgd3JpdGVzICovCisJLyogRklYTUUgTmVlZCBhIHJlYWRhYmxlIGxvY2F0aW9uISAqLworI2lmIDAKKwkodm9pZClpb3JlYWQzMigpOworI2VuZGlmCisJaXJxX2NvdW50ID0gYXBlLT5pcnFfY291bnQ7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiXG5TdGFydCBETUEgd3JpdGVcbiIpOworCWlvd3JpdGUzMihuLCAmd3JpdGVfaGVhZGVyLT53Myk7CisKKwkvKiogbWVtb3J5IHdyaXRlIGJhcnJpZXIgKi8KKwl3bWIoKTsKKwkvKiogZHVtbXkgcmVhZCB0byBmbHVzaCBwb3N0ZWQgd3JpdGVzICovCisJLy8odm9pZClpb3JlYWQzMigpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIlBPTEwgRk9SIFdSSVRFOlxuIik7CisJLyogcG9sbCBmb3IgY29tcGxldGlvbiwgMTAwMCB0aW1lcyAxIG1pbGxpc2Vjb25kICovCisJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCXZvbGF0aWxlIHUzMiAqcCA9ICZhcGUtPnRhYmxlX3ZpcnQtPnczOworCQl1MzIgZXBsYXN0ID0gbGUzMl90b19jcHUoKnApICYgMHhmZmZmVUw7CisJCXByaW50ayhLRVJOX0RFQlVHICJFUExBU1QgPSAldSwgbiA9ICVkXG4iLCBlcGxhc3QsIG4pOworCQlpZiAoZXBsYXN0ID09IG4pIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJET05FXG4iKTsKKwkJCS8qIHByaW50IElSUSBjb3VudCBiZWZvcmUgdGhlIHRyYW5zZmVyICovCisJCQlwcmludGsoS0VSTl9ERUJVRyAiI0lSUXMgZHVyaW5nIHRyYW5zZmVyOiAlZFxuIiwgYXBlLT5pcnFfY291bnQgLSBpcnFfY291bnQpOworCQkJYnJlYWs7CisJCX0KKwkJdWRlbGF5KDEwMCk7CisJfQorCS8qIHNvZnQtcmVzZXQgRE1BIHdyaXRlIGVuZ2luZSAqLworCWlvd3JpdGUzMigweDAwMDBmZmZmVUwsICZ3cml0ZV9oZWFkZXItPncwKTsKKwkvKiBzb2Z0LXJlc2V0IERNQSByZWFkIGVuZ2luZSAqLworCWlvd3JpdGUzMigweDAwMDBmZmZmVUwsICZyZWFkX2hlYWRlci0+dzApOworCisJLyoqIG1lbW9yeSB3cml0ZSBiYXJyaWVyICovCisJd21iKCk7CisJLyogZHVtbXkgcmVhZCB0byBmbHVzaCBwb3N0ZWQgd3JpdGVzICovCisJLyogRklYTUUgTmVlZCBhIHJlYWRhYmxlIGxvY2F0aW9uISAqLworI2lmIDAKKwkodm9pZClpb3JlYWQzMigpOworI2VuZGlmCisJLyogY29tcGFyZSBmaXJzdCBoYWxmIG9mIGJ1ZmZlciB3aXRoIHNlY29uZCBoYWxmLCBzaG91bGQgYmUgaWRlbnRpY2FsICovCisJcmVzdWx0ID0gY29tcGFyZSgodTMyICopYnVmZmVyX3ZpcnQsICh1MzIgKikoYnVmZmVyX3ZpcnQgKyAyICogUEFHRV9TSVpFKSwgODE5Mik7CisJcHJpbnRrKEtFUk5fREVCVUcgIkRNQSBsb29wIGJhY2sgdGVzdCAlcy5cbiIsIHJlc3VsdCA/ICJGQUlMRUQiIDogIlBBU1NFRCIpOworCisJcGNpX2ZyZWVfY29uc2lzdGVudChkZXYsIDQgKiBQQUdFX1NJWkUsIGJ1ZmZlcl92aXJ0LCBidWZmZXJfYnVzKTsKK2ZhaWw6CisJcHJpbnRrKEtFUk5fREVCVUcgImJhcl90ZXN0cygpIGVuZCwgcmVzdWx0ICVkXG4iLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIENhbGxlZCB3aGVuIHRoZSBQQ0kgc3ViIHN5c3RlbSB0aGlua3Mgd2UgY2FuIGNvbnRyb2wgdGhlIGdpdmVuIGRldmljZS4KKyAqIEluc3BlY3QgaWYgd2UgY2FuIHN1cHBvcnQgdGhlIGRldmljZSBhbmQgaWYgc28gdGFrZSBjb250cm9sIG9mIGl0LgorICoKKyAqIFJldHVybiAwIHdoZW4gd2UgaGF2ZSB0YWtlbiBjb250cm9sIG9mIHRoZSBnaXZlbiBkZXZpY2UuCisgKgorICogLSBhbGxvY2F0ZSBib2FyZCBzcGVjaWZpYyBib29ra2VlcGluZworICogLSBhbGxvY2F0ZSBjb2hlcmVudGx5LW1hcHBlZCBtZW1vcnkgZm9yIHRoZSBkZXNjcmlwdG9yIHRhYmxlCisgKiAtIGVuYWJsZSB0aGUgYm9hcmQKKyAqIC0gdmVyaWZ5IGJvYXJkIHJldmlzaW9uCisgKiAtIHJlcXVlc3QgcmVnaW9ucworICogLSBxdWVyeSBETUEgbWFzaworICogLSBvYnRhaW4gYW5kIHJlcXVlc3QgaXJxCisgKiAtIG1hcCByZWdpb25zIGludG8ga2VybmVsIGFkZHJlc3Mgc3BhY2UKKyAqLworc3RhdGljIGludCBfX2RldmluaXQgcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCWludCByYyA9IDA7CisJc3RydWN0IGFwZV9kZXYgKmFwZSA9IE5VTEw7CisJdTggaXJxX3BpbiwgaXJxX2xpbmU7CisJcHJpbnRrKEtFUk5fREVCVUcgInByb2JlKGRldiA9IDB4JXAsIHBjaWlkID0gMHglcClcbiIsIGRldiwgaWQpOworCisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBwZXItYm9hcmQgYm9vayBrZWVwaW5nICovCisJYXBlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFwZV9kZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFwZSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiQ291bGQgbm90IGt6YWxsb2MoKWF0ZSBtZW1vcnkuXG4iKTsKKwkJZ290byBlcnJfYXBlOworCX0KKwlhcGUtPnBjaV9kZXYgPSBkZXY7CisJZGV2LT5kZXYuZHJpdmVyX2RhdGEgPSAodm9pZCAqKWFwZTsKKwlwcmludGsoS0VSTl9ERUJVRyAicHJvYmUoKSBhcGUgPSAweCVwXG4iLCBhcGUpOworCisJcHJpbnRrKEtFUk5fREVCVUcgInNpemVvZihzdHJ1Y3QgYXBlX2NoZG1hX3RhYmxlKSA9ICVkLlxuIiwKKwkJKGludClzaXplb2Yoc3RydWN0IGFwZV9jaGRtYV90YWJsZSkpOworCS8qIHRoZSByZWZlcmVuY2UgZGVzaWduIGhhcyBhIHNpemUgcmVzdHJpY3Rpb24gb24gdGhlIHRhYmxlIHNpemUgKi8KKwlCVUdfT04oc2l6ZW9mKHN0cnVjdCBhcGVfY2hkbWFfdGFibGUpID4gQVBFX0NIRE1BX1RBQkxFX1NJWkUpOworCisJLyogYWxsb2NhdGUgYW5kIG1hcCBjb2hlcmVudGx5LWNhY2hlZCBtZW1vcnkgZm9yIGEgZGVzY3JpcHRvciB0YWJsZSAqLworCS8qIEBzZWUgTEREMyBwYWdlIDQ0NiAqLworCWFwZS0+dGFibGVfdmlydCA9IChzdHJ1Y3QgYXBlX2NoZG1hX3RhYmxlICopcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2LAorCQlBUEVfQ0hETUFfVEFCTEVfU0laRSwgJmFwZS0+dGFibGVfYnVzKTsKKwkvKiBjb3VsZCBub3QgYWxsb2NhdGUgdGFibGU/ICovCisJaWYgKCFhcGUtPnRhYmxlX3ZpcnQpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkNvdWxkIG5vdCBkbWFfYWxsb2MoKWF0ZV9jb2hlcmVudCBtZW1vcnkuXG4iKTsKKwkJZ290byBlcnJfdGFibGU7CisJfQorCisJcHJpbnRrKEtFUk5fREVCVUcgInRhYmxlX3ZpcnQgPSAweCUxNmxseCwgdGFibGVfYnVzID0gMHglMTZsbHguXG4iLAorCQkodTY0KWFwZS0+dGFibGVfdmlydCwgKHU2NClhcGUtPnRhYmxlX2J1cyk7CisKKwkvKiBlbmFibGUgZGV2aWNlICovCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShkZXYpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9ERUJVRyAicGNpX2VuYWJsZV9kZXZpY2UoKSBmYWlsZWRcbiIpOworCQlnb3RvIGVycl9lbmFibGU7CisJfQorCisJLyogZW5hYmxlIGJ1cyBtYXN0ZXIgY2FwYWJpbGl0eSBvbiBkZXZpY2UgKi8KKwlwY2lfc2V0X21hc3RlcihkZXYpOworCS8qIGVuYWJsZSBtZXNzYWdlIHNpZ25hbGVkIGludGVycnVwdHMgKi8KKwlyYyA9IHBjaV9lbmFibGVfbXNpKGRldik7CisJLyogY291bGQgbm90IHVzZSBNU0k/ICovCisJaWYgKHJjKSB7CisJCS8qIHJlc29ydCB0byBsZWdhY3kgaW50ZXJydXB0cyAqLworCQlwcmludGsoS0VSTl9ERUJVRyAiQ291bGQgbm90IGVuYWJsZSBNU0kgaW50ZXJydXB0aW5nLlxuIik7CisJCWFwZS0+bXNpX2VuYWJsZWQgPSAwOworCS8qIE1TSSBlbmFibGVkLCByZW1lbWJlciBmb3IgY2xlYW51cCAqLworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJFbmFibGVkIE1TSSBpbnRlcnJ1cHRpbmcuXG4iKTsKKwkJYXBlLT5tc2lfZW5hYmxlZCA9IDE7CisJfQorCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZhcGUtPnJldmlzaW9uKTsKKyNpZiAwIC8qIGV4YW1wbGUgKi8KKwkvKiAoZm9yIGV4YW1wbGUpIHRoaXMgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgcmV2aXNpb24gMHg0MiAqLworICAgIGlmIChhcGUtPnJldmlzaW9uID09IDB4NDIpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlJldmlzaW9uIDB4NDIgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlci5cbiIpOworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX3JldjsKKwl9CisjZW5kaWYKKwkvKiogWFhYIGNoZWNrIGZvciBuYXRpdmUgb3IgbGVnYWN5IFBDSWUgZW5kcG9pbnQ/ICovCisKKwlyYyA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMoZGV2LCBEUlZfTkFNRSk7CisJLyogY291bGQgbm90IHJlcXVlc3QgYWxsIHJlZ2lvbnM/ICovCisJaWYgKHJjKSB7CisJCS8qIGFzc3VtZSBkZXZpY2UgaXMgaW4gdXNlIChhbmQgZG8gbm90IGRpc2FibGUgaXQgbGF0ZXIhKSAqLworCQlhcGUtPmluX3VzZSA9IDE7CisJCWdvdG8gZXJyX3JlZ2lvbnM7CisJfQorCWFwZS0+Z290X3JlZ2lvbnMgPSAxOworCisjaWYgMSAvLyBAdG9kbyBGb3Igbm93LCBkaXNhYmxlIDY0LWJpdCwgYmVjYXVzZSBJIGRvIG5vdCB1bmRlcnN0YW5kIHRoZSBpbXBsaWNhdGlvbnMgKERBQyEpCisJLyogcXVlcnkgZm9yIERNQSB0cmFuc2ZlciAqLworCS8qIEBzZWUgRG9jdW1lbnRhdGlvbi9ETUEtbWFwcGluZy50eHQgKi8KKwlpZiAoIXBjaV9zZXRfZG1hX21hc2soZGV2LCBETUFfNjRCSVRfTUFTSykpIHsKKwkJcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKGRldiwgRE1BXzY0QklUX01BU0spOworCQkvKiB1c2UgNjQtYml0IERNQSAqLworCQlwcmludGsoS0VSTl9ERUJVRyAiVXNpbmcgYSA2NC1iaXQgRE1BIG1hc2suXG4iKTsKKwl9IGVsc2UKKyNlbmRpZgorCWlmICghcGNpX3NldF9kbWFfbWFzayhkZXYsIERNQV8zMkJJVF9NQVNLKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiQ291bGQgbm90IHNldCA2NC1iaXQgRE1BIG1hc2suXG4iKTsKKwkJcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKGRldiwgRE1BXzMyQklUX01BU0spOworCQkvKiB1c2UgMzItYml0IERNQSAqLworCQlwcmludGsoS0VSTl9ERUJVRyAiVXNpbmcgYSAzMi1iaXQgRE1BIG1hc2suXG4iKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9ERUJVRyAiTm8gc3VpdGFibGUgRE1BIHBvc3NpYmxlLlxuIik7CisJCS8qKiBAdG9kbyBDaG9vc2UgcHJvcGVyIGVycm9yIHJldHVybiBjb2RlICovCisJCXJjID0gLTE7CisJCWdvdG8gZXJyX21hc2s7CisJfQorCisJcmMgPSBwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfUElOLCAmaXJxX3Bpbik7CisJLyogY291bGQgbm90IHJlYWQ/ICovCisJaWYgKHJjKQorCQlnb3RvIGVycl9pcnE7CisJcHJpbnRrKEtFUk5fREVCVUcgIklSUSBwaW4gIyVkICgwPW5vbmUsIDE9SU5UQSMuLi40PUlOVEQjKS5cbiIsIGlycV9waW4pOworCisJLyogQHNlZSBMREQzLCBwYWdlIDMxOCAqLworCXJjID0gcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsICZpcnFfbGluZSk7CisJLyogY291bGQgbm90IHJlYWQ/ICovCisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJDb3VsZCBub3QgcXVlcnkgUENJX0lOVEVSUlVQVF9MSU5FLCBlcnJvciAlZFxuIiwgcmMpOworCQlnb3RvIGVycl9pcnE7CisJfQorCXByaW50ayhLRVJOX0RFQlVHICJJUlEgbGluZSAjJWQuXG4iLCBpcnFfbGluZSk7CisjaWYgMQorCWlycV9saW5lID0gZGV2LT5pcnE7CisJLyogQHNlZSBMREQzLCBwYWdlIDI1OSAqLworCXJjID0gcmVxdWVzdF9pcnEoaXJxX2xpbmUsIGFsdHBjaWVjaGRtYV9pc3IsIElSUUZfU0hBUkVELCBEUlZfTkFNRSwgKHZvaWQgKilhcGUpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9ERUJVRyAiQ291bGQgbm90IHJlcXVlc3QgSVJRICMlZCwgZXJyb3IgJWRcbiIsIGlycV9saW5lLCByYyk7CisJCWFwZS0+aXJxX2xpbmUgPSAtMTsKKwkJZ290byBlcnJfaXJxOworCX0KKwkvKiByZW1lbWJlciB3aGljaCBpcnEgd2UgYWxsb2NhdGVkICovCisJYXBlLT5pcnFfbGluZSA9IChpbnQpaXJxX2xpbmU7CisJcHJpbnRrKEtFUk5fREVCVUcgIlN1Y2Nlc2Z1bGx5IHJlcXVlc3RlZCBJUlEgIyVkIHdpdGggZGV2X2lkIDB4JXBcbiIsIGlycV9saW5lLCBhcGUpOworI2VuZGlmCisJLyogc2hvdyBCQVJzICovCisJc2Nhbl9iYXJzKGFwZSwgZGV2KTsKKwkvKiBtYXAgQkFScyAqLworCXJjID0gbWFwX2JhcnMoYXBlLCBkZXYpOworCWlmIChyYykKKwkJZ290byBlcnJfbWFwOworI2lmIEFMVFBDSUVDSERNQV9DREVWCisJLyogaW5pdGlhbGl6ZSBjaGFyYWN0ZXIgZGV2aWNlICovCisJcmMgPSBzZ19pbml0KGFwZSk7CisJaWYgKHJjKQorCQlnb3RvIGVycl9jZGV2OworI2VuZGlmCisJLyogcGVyZm9ybSBETUEgZW5naW5lcyBsb29wIGJhY2sgdGVzdCAqLworCXJjID0gZG1hX3Rlc3QoYXBlLCBkZXYpOworCSh2b2lkKXJjOworCS8qIHN1Y2Nlc2Z1bGx5IHRvb2sgdGhlIGRldmljZSAqLworCXJjID0gMDsKKwlwcmludGsoS0VSTl9ERUJVRyAicHJvYmUoKSBzdWNjZXNzZnVsLlxuIik7CisJZ290byBlbmQ7CitlcnJfY2RldjoKKwkvKiB1bm1hcCB0aGUgQkFScyAqLworCXVubWFwX2JhcnMoYXBlLCBkZXYpOworZXJyX21hcDoKKwkvKiBmcmVlIGFsbG9jYXRlZCBpcnEgKi8KKwlpZiAoYXBlLT5pcnFfbGluZSA+PSAwKQorCQlmcmVlX2lycShhcGUtPmlycV9saW5lLCAodm9pZCAqKWFwZSk7CitlcnJfaXJxOgorCWlmIChhcGUtPm1zaV9lbmFibGVkKQorCQlwY2lfZGlzYWJsZV9tc2koZGV2KTsKKwkvKiBkaXNhYmxlIHRoZSBkZXZpY2UgaWZmIGl0IGlzIG5vdCBpbiB1c2UgKi8KKwlpZiAoIWFwZS0+aW5fdXNlKQorCQlwY2lfZGlzYWJsZV9kZXZpY2UoZGV2KTsKKwlpZiAoYXBlLT5nb3RfcmVnaW9ucykKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhkZXYpOworZXJyX21hc2s6CitlcnJfcmVnaW9uczoKK2Vycl9yZXY6CisvKiBjbGVhbiB1cCBldmVyeXRoaW5nIGJlZm9yZSBkZXZpY2UgZW5hYmxlKCkgKi8KK2Vycl9lbmFibGU6CisJaWYgKGFwZS0+dGFibGVfdmlydCkKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChkZXYsIEFQRV9DSERNQV9UQUJMRV9TSVpFLCBhcGUtPnRhYmxlX3ZpcnQsIGFwZS0+dGFibGVfYnVzKTsKKy8qIGNsZWFuIHVwIGV2ZXJ5dGhpbmcgYmVmb3JlIGFsbG9jYXRpbmcgZGVzY3JpcHRvciB0YWJsZSAqLworZXJyX3RhYmxlOgorCWlmIChhcGUpCisJCWtmcmVlKGFwZSk7CitlcnJfYXBlOgorZW5kOgorCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHJlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCBhcGVfZGV2ICphcGU7CisJcHJpbnRrKEtFUk5fREVCVUcgInJlbW92ZSgweCVwKVxuIiwgZGV2KTsKKwlpZiAoKGRldiA9PSAwKSB8fCAoZGV2LT5kZXYuZHJpdmVyX2RhdGEgPT0gMCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInJlbW92ZShkZXYgPSAweCVwKSBkZXYtPmRldi5kcml2ZXJfZGF0YSA9IDB4JXBcbiIsIGRldiwgZGV2LT5kZXYuZHJpdmVyX2RhdGEpOworCQlyZXR1cm47CisJfQorCWFwZSA9IChzdHJ1Y3QgYXBlX2RldiAqKWRldi0+ZGV2LmRyaXZlcl9kYXRhOworCXByaW50ayhLRVJOX0RFQlVHICJyZW1vdmUoZGV2ID0gMHglcCkgd2hlcmUgZGV2LT5kZXYuZHJpdmVyX2RhdGEgPSAweCVwXG4iLCBkZXYsIGFwZSk7CisJaWYgKGFwZS0+cGNpX2RldiAhPSBkZXYpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImRldi0+ZGV2LmRyaXZlcl9kYXRhLT5wY2lfZGV2ICgweCUwOGx4KSAhPSBkZXYgKDB4JTA4bHgpXG4iLAorCQkodW5zaWduZWQgbG9uZylhcGUtPnBjaV9kZXYsICh1bnNpZ25lZCBsb25nKWRldik7CisJfQorCS8qIHJlbW92ZSBjaGFyYWN0ZXIgZGV2aWNlICovCisjaWYgQUxUUENJRUNIRE1BX0NERVYKKwlzZ19leGl0KGFwZSk7CisjZW5kaWYKKworCWlmIChhcGUtPnRhYmxlX3ZpcnQpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGV2LCBBUEVfQ0hETUFfVEFCTEVfU0laRSwgYXBlLT50YWJsZV92aXJ0LCBhcGUtPnRhYmxlX2J1cyk7CisKKwkvKiBmcmVlIElSUQorCSAqIEBzZWUgTEREMyBwYWdlIDI3OQorCSAqLworCWlmIChhcGUtPmlycV9saW5lID49IDApIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkZyZWVpbmcgSVJRICMlZCBmb3IgZGV2X2lkIDB4JTA4bHguXG4iLAorCQlhcGUtPmlycV9saW5lLCAodW5zaWduZWQgbG9uZylhcGUpOworCQlmcmVlX2lycShhcGUtPmlycV9saW5lLCAodm9pZCAqKWFwZSk7CisJfQorCS8qIE1TSSB3YXMgZW5hYmxlZD8gKi8KKwlpZiAoYXBlLT5tc2lfZW5hYmxlZCkgeworCQkvKiBEaXNhYmxlIE1TSSBAc2VlIERvY3VtZW50YXRpb24vTVNJLUhPV1RPLnR4dCAqLworCQlwY2lfZGlzYWJsZV9tc2koZGV2KTsKKwkJYXBlLT5tc2lfZW5hYmxlZCA9IDA7CisJfQorCS8qIHVubWFwIHRoZSBCQVJzICovCisJdW5tYXBfYmFycyhhcGUsIGRldik7CisJaWYgKCFhcGUtPmluX3VzZSkKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7CisJaWYgKGFwZS0+Z290X3JlZ2lvbnMpCisJCS8qIHRvIGJlIGNhbGxlZCBhZnRlciBkZXZpY2UgZGlzYWJsZSAqLworCQlwY2lfcmVsZWFzZV9yZWdpb25zKGRldik7Cit9CisKKyNpZiBBTFRQQ0lFQ0hETUFfQ0RFVgorCisvKgorICogQ2FsbGVkIHdoZW4gdGhlIGRldmljZSBnb2VzIGZyb20gdW51c2VkIHRvIHVzZWQuCisgKi8KK3N0YXRpYyBpbnQgc2dfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgYXBlX2RldiAqYXBlOworCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICJfb3BlbigpXG4iKTsKKwkvKiBwb2ludGVyIHRvIGNvbnRhaW5pbmcgZGF0YSBzdHJ1Y3R1cmUgb2YgdGhlIGNoYXJhY3RlciBkZXZpY2UgaW5vZGUgKi8KKwlhcGUgPSBjb250YWluZXJfb2YoaW5vZGUtPmlfY2Rldiwgc3RydWN0IGFwZV9kZXYsIGNkZXYpOworCS8qIGNyZWF0ZSBhIHJlZmVyZW5jZSB0byBvdXIgZGV2aWNlIHN0YXRlIGluIHRoZSBvcGVuZWQgZmlsZSAqLworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGFwZTsKKwkvKiBjcmVhdGUgdmlydHVhbCBtZW1vcnkgbWFwcGVyICovCisJYXBlLT5zZ20gPSBzZ19jcmVhdGVfbWFwcGVyKE1BWF9DSERNQV9TSVpFKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENhbGxlZCB3aGVuIHRoZSBkZXZpY2UgZ29lcyBmcm9tIHVzZWQgdG8gdW51c2VkLgorICovCitzdGF0aWMgaW50IHNnX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCS8qIGZldGNoIGRldmljZSBzcGVjaWZpYyBkYXRhIHN0b3JlZCBlYXJsaWVyIGR1cmluZyBvcGVuICovCisJc3RydWN0IGFwZV9kZXYgKmFwZSA9IChzdHJ1Y3QgYXBlX2RldiAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAiX2Nsb3NlKClcbiIpOworCS8qIGRlc3Ryb3kgdmlydHVhbCBtZW1vcnkgbWFwcGVyICovCisJc2dfZGVzdHJveV9tYXBwZXIoYXBlLT5zZ20pOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBzZ19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQoreworCS8qIGZldGNoIGRldmljZSBzcGVjaWZpYyBkYXRhIHN0b3JlZCBlYXJsaWVyIGR1cmluZyBvcGVuICovCisJc3RydWN0IGFwZV9kZXYgKmFwZSA9IChzdHJ1Y3QgYXBlX2RldiAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwkodm9pZClhcGU7CisJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUgIl9yZWFkKGJ1Zj0weCVwLCBjb3VudD0lbGxkLCBwb3M9JWxsdSlcbiIsIGJ1ZiwgKHM2NCljb3VudCwgKHU2NCkqcG9zKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qIHNnX3dyaXRlKCkgLSBXcml0ZSB0byB0aGUgZGV2aWNlCisgKgorICogQGJ1ZiB1c2Vyc3BhY2UgYnVmZmVyCisgKiBAY291bnQgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSB1c2Vyc3BhY2UgYnVmZmVyCisgKgorICogSXRlcmF0ZSBvdmVyIHRoZSB1c2Vyc3BhY2UgYnVmZmVyLCB0YWtpbmcgYXQgbW9zdCAyNTUgKiBQQUdFX1NJWkUgYnl0ZXMgZm9yCisgKiBlYWNoIERNQSB0cmFuc2Zlci4KKyAqICAgRm9yIGVhY2ggdHJhbnNmZXIsIGdldCB0aGUgdXNlciBwYWdlcywgYnVpbGQgYSBzZ2xpc3QsIG1hcCwgYnVpbGQgYQorICogICBkZXNjcmlwdG9yIHRhYmxlLiBzdWJtaXQgdGhlIHRyYW5zZmVyLiB3YWl0IGZvciB0aGUgaW50ZXJydXB0IGhhbmRsZXIKKyAqICAgdG8gd2FrZSB1cyBvbiBjb21wbGV0aW9uLgorICovCitzdGF0aWMgc3NpemVfdCBzZ193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKK3sKKwlpbnQgaHduZW50cywgdGVudHM7CisJc2l6ZV90IHRyYW5zZmVyX2xlbiwgcmVtYWluaW5nID0gY291bnQsIGRvbmUgPSAwOworCXU2NCB0cmFuc2Zlcl9hZGRyID0gKHU2NClidWY7CisJLyogZmV0Y2ggZGV2aWNlIHNwZWNpZmljIGRhdGEgc3RvcmVkIGVhcmxpZXIgZHVyaW5nIG9wZW4gKi8KKwlzdHJ1Y3QgYXBlX2RldiAqYXBlID0gKHN0cnVjdCBhcGVfZGV2ICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICJfd3JpdGUoYnVmPTB4JXAsIGNvdW50PSVsbGQsIHBvcz0lbGx1KVxuIiwKKwkJYnVmLCAoczY0KWNvdW50LCAodTY0KSpwb3MpOworCS8qIFRPRE8gdHJhbnNmZXIgYm91bmRhcmllcyBhdCBQQUdFX1NJWkUgZ3JhbnVsYXJpdHkgKi8KKwl3aGlsZSAocmVtYWluaW5nID4gMCkKKwl7CisJCS8qIGxpbWl0IERNQSB0cmFuc2ZlciBzaXplICovCisJCXRyYW5zZmVyX2xlbiA9IChyZW1haW5pbmcgPCBBUEVfQ0hETUFfTUFYX1RSQU5TRkVSX0xFTik/IHJlbWFpbmluZzoKKwkJCUFQRV9DSERNQV9NQVhfVFJBTlNGRVJfTEVOOworCQkvKiBnZXQgYWxsIHVzZXIgc3BhY2UgYnVmZmVyIHBhZ2VzIGFuZCBjcmVhdGUgYSBzY2F0dGVyZ2F0aGVyIGxpc3QgKi8KKwkJc2dtX21hcF91c2VyX3BhZ2VzKGFwZS0+c2dtLCB0cmFuc2Zlcl9hZGRyLCB0cmFuc2Zlcl9sZW4sIDAvKnJlYWQgZnJvbSB1c2Vyc3BhY2UqLyk7CisJCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICJtYXBwZWRfcGFnZXM9JWRcbiIsIGFwZS0+c2dtLT5tYXBwZWRfcGFnZXMpOworCQkvKiBtYXAgYWxsIGVudHJpZXMgaW4gdGhlIHNjYXR0ZXJnYXRoZXIgbGlzdCAqLworCQlod25lbnRzID0gcGNpX21hcF9zZyhhcGUtPnBjaV9kZXYsIGFwZS0+c2dtLT5zZ2wsIGFwZS0+c2dtLT5tYXBwZWRfcGFnZXMsIERNQV9UT19ERVZJQ0UpOworCQlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAiaHduZW50cz0lZFxuIiwgaHduZW50cyk7CisJCS8qIGJ1aWxkIGRldmljZSBkZXNjcmlwdG9yIHRhYmxlcyBhbmQgc3VibWl0IHRoZW0gdG8gdGhlIERNQSBlbmdpbmUgKi8KKwkJdGVudHMgPSBhcGVfc2dfdG9fY2hkbWFfdGFibGUoYXBlLT5zZ20tPnNnbCwgaHduZW50cywgMCwgJmFwZS0+dGFibGVfdmlydC0+ZGVzY1swXSwgNDA5Nik7CisJCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICJ0ZW50cz0lZFxuIiwgaHduZW50cyk7CisjaWYgMAorCQl3aGlsZSAodGFibGVzKSB7CisJCQkvKiBUT0RPIGJ1aWxkIHRhYmxlICovCisJCQkvKiBUT0RPIHN1Ym1pdCB0YWJsZSB0byB0aGUgZGV2aWNlICovCisJCQkvKiBpZiBlbmdpbmUgc3RvcHBlZCBhbmQgdW5maW5pc2hlZCB3b3JrIHRoZW4gc3RhcnQgZW5naW5lICovCisJCX0KKwkJcHV0IG91cnNlbHZlcyBvbiB3YWl0IHF1ZXVlCisjZW5kaWYKKworCQlkbWFfdW5tYXBfc2coTlVMTCwgYXBlLT5zZ20tPnNnbCwgYXBlLT5zZ20tPm1hcHBlZF9wYWdlcywgRE1BX1RPX0RFVklDRSk7CisJCS8qIGRpcnR5IGFuZCBmcmVlIHRoZSBwYWdlcyAqLworCQlzZ21fdW5tYXBfdXNlcl9wYWdlcyhhcGUtPnNnbSwgMS8qZGlydGllZCovKTsKKwkJLyogYm9vayBrZWVwaW5nICovCisJCXRyYW5zZmVyX2FkZHIgKz0gdHJhbnNmZXJfbGVuOworCQlyZW1haW5pbmcgLT0gdHJhbnNmZXJfbGVuOworCQlkb25lICs9IHRyYW5zZmVyX2xlbjsKKwl9CisJcmV0dXJuIGRvbmU7Cit9CisKKy8qCisgKiBjaGFyYWN0ZXIgZGV2aWNlIGZpbGUgb3BlcmF0aW9ucworICovCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzZ19mb3BzID0geworICAub3duZXIgPSBUSElTX01PRFVMRSwKKyAgLm9wZW4gPSBzZ19vcGVuLAorICAucmVsZWFzZSA9IHNnX2Nsb3NlLAorICAucmVhZCA9IHNnX3JlYWQsCisgIC53cml0ZSA9IHNnX3dyaXRlLAorfTsKKworLyogc2dfaW5pdCgpIC0gSW5pdGlhbGl6ZSBjaGFyYWN0ZXIgZGV2aWNlCisgKgorICogWFhYIFNob3VsZCBpZGVhbGx5IGJlIHRpZWQgdG8gdGhlIGRldmljZSwgb24gZGV2aWNlIHByb2JlLCBub3QgbW9kdWxlIGluaXQuCisgKi8KK3N0YXRpYyBpbnQgc2dfaW5pdChzdHJ1Y3QgYXBlX2RldiAqYXBlKQoreworCWludCByYzsKKwlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAiIHNnX2luaXQoKVxuIik7CisJLyogYWxsb2NhdGUgYSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgY2hhcmFjdGVyIGRldmljZSBub2RlICovCisJcmMgPSBhbGxvY19jaHJkZXZfcmVnaW9uKCZhcGUtPmNkZXZubywgMC8qcmVxdWVzdGVkIG1pbm9yKi8sIDEvKmNvdW50Ki8sIERSVl9OQU1FKTsKKwkvKiBhbGxvY2F0aW9uIGZhaWxlZD8gKi8KKwlpZiAocmMgPCAwKSB7CisJCXByaW50aygiYWxsb2NfY2hyZGV2X3JlZ2lvbigpID0gJWRcbiIsIHJjKTsKKwkJZ290byBmYWlsX2FsbG9jOworCX0KKwkvKiBjb3VwbGUgdGhlIGRldmljZSBmaWxlIG9wZXJhdGlvbnMgdG8gdGhlIGNoYXJhY3RlciBkZXZpY2UgKi8KKwljZGV2X2luaXQoJmFwZS0+Y2RldiwgJnNnX2ZvcHMpOworCWFwZS0+Y2Rldi5vd25lciA9IFRISVNfTU9EVUxFOworCS8qIGJyaW5nIGNoYXJhY3RlciBkZXZpY2UgbGl2ZSAqLworCXJjID0gY2Rldl9hZGQoJmFwZS0+Y2RldiwgYXBlLT5jZGV2bm8sIDEvKmNvdW50Ki8pOworCWlmIChyYyA8IDApIHsKKwkJcHJpbnRrKCJjZGV2X2FkZCgpID0gJWRcbiIsIHJjKTsKKwkJZ290byBmYWlsX2FkZDsKKwl9CisJcHJpbnRrKEtFUk5fREVCVUcgImFsdHBjaWVjaGRtYSA9ICVkOiVkXG4iLCBNQUpPUihhcGUtPmNkZXZubyksIE1JTk9SKGFwZS0+Y2Rldm5vKSk7CisJcmV0dXJuIDA7CitmYWlsX2FkZDoKKwkvKiBmcmVlIHRoZSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgY2hhcmFjdGVyIGRldmljZSBub2RlICovCisgICAgdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKGFwZS0+Y2Rldm5vLCAxLypjb3VudCovKTsKK2ZhaWxfYWxsb2M6CisJcmV0dXJuIC0xOworfQorCisvKiBzZ19leGl0KCkgLSBDbGVhbnVwIGNoYXJhY3RlciBkZXZpY2UKKyAqCisgKiBYWFggU2hvdWxkIGlkZWFsbHkgYmUgdGllZCB0byB0aGUgZGV2aWNlLCBvbiBkZXZpY2UgcmVtb3ZlLCBub3QgbW9kdWxlIGV4aXQuCisgKi8KKworc3RhdGljIHZvaWQgc2dfZXhpdChzdHJ1Y3QgYXBlX2RldiAqYXBlKQoreworCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICIgc2dfZXhpdCgpXG4iKTsKKwkvKiByZW1vdmUgdGhlIGNoYXJhY3RlciBkZXZpY2UgKi8KKwljZGV2X2RlbCgmYXBlLT5jZGV2KTsKKwkvKiBmcmVlIHRoZSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgY2hhcmFjdGVyIGRldmljZSBub2RlICovCisJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKGFwZS0+Y2Rldm5vLCAxLypjb3VudCovKTsKK30KKworI2VuZGlmIC8qIEFMVFBDSUVDSERNQV9DREVWICovCisKKy8qIHVzZWQgdG8gcmVnaXN0ZXIgdGhlIGRyaXZlciB3aXRoIHRoZSBQQ0kga2VybmVsIHN1YiBzeXN0ZW0KKyAqIEBzZWUgTEREMyBwYWdlIDMxMQorICovCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcGNpX2RyaXZlciA9IHsKKwkubmFtZSA9IERSVl9OQU1FLAorCS5pZF90YWJsZSA9IGlkcywKKwkucHJvYmUgPSBwcm9iZSwKKwkucmVtb3ZlID0gcmVtb3ZlLAorCS8qIHJlc3VtZSwgc3VzcGVuZCBhcmUgb3B0aW9uYWwgKi8KK307CisKKy8qKgorICogYWx0ZXJhcGNpZWNoZG1hX2luaXQoKSAtIE1vZHVsZSBpbml0aWFsaXphdGlvbiwgcmVnaXN0ZXJzIGRldmljZXMuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGFsdGVyYXBjaWVjaGRtYV9pbml0KHZvaWQpCit7CisgIGludCByYyA9IDA7CisJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUgIiBpbml0KCksIGJ1aWx0IGF0ICIgX19EQVRFX18gIiAiIF9fVElNRV9fICJcbiIpOworCS8qIHJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIFBDSSBidXMgZHJpdmVyICovCisJcmMgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZwY2lfZHJpdmVyKTsKKwlpZiAocmMgPCAwKQorCSAgcmV0dXJuIHJjOworCXJldHVybiAwOworfQorCisvKioKKyAqIGFsdGVyYXBjaWVjaGRtYV9pbml0KCkgLSBNb2R1bGUgY2xlYW51cCwgdW5yZWdpc3RlcnMgZGV2aWNlcy4KKyAqLworc3RhdGljIHZvaWQgX19leGl0IGFsdGVyYXBjaWVjaGRtYV9leGl0KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUgIiBleGl0KCksIGJ1aWx0IGF0ICIgX19EQVRFX18gIiAiIF9fVElNRV9fICJcbiIpOworCS8qIHVucmVnaXN0ZXIgdGhpcyBkcml2ZXIgZnJvbSB0aGUgUENJIGJ1cyBkcml2ZXIgKi8KKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnBjaV9kcml2ZXIpOworfQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KGFsdGVyYXBjaWVjaGRtYV9pbml0KTsKK21vZHVsZV9leGl0KGFsdGVyYXBjaWVjaGRtYV9leGl0KTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI5OTZkYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL0tjb25maWcKQEAgLTAsMCArMSw4NiBAQAorbWVudSAiQW5kcm9pZCIKKworY29uZmlnIEFORFJPSUQKKwlib29sICJBbmRyb2lkIERyaXZlcnMiCisJZGVmYXVsdCBOCisJLS0taGVscC0tLQorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHZhcmlvdXMgZHJpdmVycyBuZWVkZWQgb24gdGhlIEFuZHJvaWQgcGxhdGZvcm0KKworY29uZmlnIEFORFJPSURfQklOREVSX0lQQworCWJvb2wgIkFuZHJvaWQgQmluZGVyIElQQyBEcml2ZXIiCisJZGVmYXVsdCBuCisKK2NvbmZpZyBBTkRST0lEX0xPR0dFUgorCXRyaXN0YXRlICJBbmRyb2lkIGxvZyBkcml2ZXIiCisJZGVmYXVsdCBuCisKK2NvbmZpZyBBTkRST0lEX1JBTV9DT05TT0xFCisJYm9vbCAiQW5kcm9pZCBSQU0gYnVmZmVyIGNvbnNvbGUiCisJZGVmYXVsdCBuCisKK2NvbmZpZyBBTkRST0lEX1JBTV9DT05TT0xFX0VOQUJMRV9WRVJCT1NFCisJYm9vbCAiRW5hYmxlIHZlcmJvc2UgY29uc29sZSBtZXNzYWdlcyBvbiBBbmRyb2lkIFJBTSBjb25zb2xlIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQU5EUk9JRF9SQU1fQ09OU09MRQorCittZW51Y29uZmlnIEFORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTgorCWJvb2wgIkFuZHJvaWQgUkFNIENvbnNvbGUgRW5hYmxlIGVycm9yIGNvcnJlY3Rpb24iCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBBTkRST0lEX1JBTV9DT05TT0xFCisJc2VsZWN0IFJFRURfU09MT01PTgorCXNlbGVjdCBSRUVEX1NPTE9NT05fRU5DOAorCXNlbGVjdCBSRUVEX1NPTE9NT05fREVDOAorCitpZiBBTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT04KKworY29uZmlnIEFORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTl9EQVRBX1NJWkUKKwlpbnQgIkFuZHJvaWQgUkFNIENvbnNvbGUgRGF0YSBkYXRhIHNpemUiCisJZGVmYXVsdCAxMjgKKwloZWxwCisJICBNdXN0IGJlIGEgcG93ZXIgb2YgMi4KKworY29uZmlnIEFORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTl9FQ0NfU0laRQorCWludCAiQW5kcm9pZCBSQU0gQ29uc29sZSBFQ0Mgc2l6ZSIKKwlkZWZhdWx0IDE2CisKK2NvbmZpZyBBTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT05fU1lNQk9MX1NJWkUKKwlpbnQgIkFuZHJvaWQgUkFNIENvbnNvbGUgU3ltYm9sIHNpemUiCisJZGVmYXVsdCA4CisKK2NvbmZpZyBBTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT05fUE9MWU5PTUlBTAorCWhleCAiQW5kcm9pZCBSQU0gQ29uc29sZSBQb2x5bm9taWFsIgorCWRlZmF1bHQgMHgxOSBpZiAoQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OX1NZTUJPTF9TSVpFID0gNCkKKwlkZWZhdWx0IDB4MjkgaWYgKEFORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTl9TWU1CT0xfU0laRSA9IDUpCisJZGVmYXVsdCAweDYxIGlmIChBTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT05fU1lNQk9MX1NJWkUgPSA2KQorCWRlZmF1bHQgMHg4OSBpZiAoQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OX1NZTUJPTF9TSVpFID0gNykKKwlkZWZhdWx0IDB4MTFkIGlmIChBTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT05fU1lNQk9MX1NJWkUgPSA4KQorCitlbmRpZiAjIEFORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTgorCitjb25maWcgQU5EUk9JRF9SQU1fQ09OU09MRV9FQVJMWV9JTklUCisJYm9vbCAiU3RhcnQgQW5kcm9pZCBSQU0gY29uc29sZSBlYXJseSIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIEFORFJPSURfUkFNX0NPTlNPTEUKKworY29uZmlnIEFORFJPSURfUkFNX0NPTlNPTEVfRUFSTFlfQUREUgorCWhleCAiQW5kcm9pZCBSQU0gY29uc29sZSB2aXJ0dWFsIGFkZHJlc3MiCisJZGVmYXVsdCAwCisJZGVwZW5kcyBvbiBBTkRST0lEX1JBTV9DT05TT0xFX0VBUkxZX0lOSVQKKworY29uZmlnIEFORFJPSURfUkFNX0NPTlNPTEVfRUFSTFlfU0laRQorCWhleCAiQW5kcm9pZCBSQU0gY29uc29sZSBidWZmZXIgc2l6ZSIKKwlkZWZhdWx0IDAKKwlkZXBlbmRzIG9uIEFORFJPSURfUkFNX0NPTlNPTEVfRUFSTFlfSU5JVAorCitjb25maWcgQU5EUk9JRF9USU1FRF9HUElPCisJdHJpc3RhdGUgIkFuZHJvaWQgdGltZWQgZ3BpbyBkcml2ZXIiCisJZGVwZW5kcyBvbiBHRU5FUklDX0dQSU8KKwlkZWZhdWx0IG4KKworY29uZmlnIEFORFJPSURfTE9XX01FTU9SWV9LSUxMRVIKKwlib29sICJBbmRyb2lkIExvdyBNZW1vcnkgS2lsbGVyIgorCWRlZmF1bHQgTgorCS0tLWhlbHAtLS0KKwkgIFJlZ2lzdGVyIHByb2Nlc3NlcyB0byBiZSBraWxsZWQgd2hlbiBtZW1vcnkgaXMgbG93CisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUyMDlkNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL01ha2VmaWxlCkBAIC0wLDAgKzEsNSBAQAorb2JqLSQoQ09ORklHX0FORFJPSURfQklOREVSX0lQQykJKz0gYmluZGVyLm8KK29iai0kKENPTkZJR19BTkRST0lEX0xPR0dFUikJCSs9IGxvZ2dlci5vCitvYmotJChDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRSkJKz0gcmFtX2NvbnNvbGUubworb2JqLSQoQ09ORklHX0FORFJPSURfVElNRURfR1BJTykJKz0gdGltZWRfZ3Bpby5vCitvYmotJChDT05GSUdfQU5EUk9JRF9MT1dfTUVNT1JZX0tJTExFUikJKz0gbG93bWVtb3J5a2lsbGVyLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1OWM1YmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9UT0RPCkBAIC0wLDAgKzEsMTAgQEAKK1RPRE86CisJLSBjaGVja3BhdGNoLnBsIGNsZWFudXBzCisJLSBzcGFyc2UgZml4ZXMKKwktIHJlbmFtZSBmaWxlcyB0byBiZSBub3Qgc28gImdlbmVyaWMiCisJLSBtYWtlIHN1cmUgdGhpbmdzIGJ1aWxkIGFzIG1vZHVsZXMgcHJvcGVybHkKKwktIGFkZCBwcm9wZXIgYXJjaCBkZXBlbmRhbmNpZXMgYXMgbmVlZGVkCisJLSBhdWRpdCB1c2Vyc3BhY2UgaW50ZXJmYWNlcyB0byBtYWtlIHN1cmUgdGhleSBhcmUgc2FuZQorCitQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+IGFuZCBDYzoKK0JyaWFuIFN3ZXRsYW5kIDxzd2V0bGFuZEBnb29nbGUuY29tPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvYmluZGVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9iaW5kZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTRjZWFjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvYmluZGVyLmMKQEAgLTAsMCArMSwzNTAzIEBACisvKiBiaW5kZXIuYworICoKKyAqIEFuZHJvaWQgSVBDIFN1YnN5c3RlbQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEdvb2dsZSwgSW5jLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZkdGFibGUuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9uc3Byb3h5Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9yYnRyZWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSAiYmluZGVyLmgiCisKK3N0YXRpYyBERUZJTkVfTVVURVgoYmluZGVyX2xvY2spOworc3RhdGljIEhMSVNUX0hFQUQoYmluZGVyX3Byb2NzKTsKK3N0YXRpYyBzdHJ1Y3QgYmluZGVyX25vZGUgKmJpbmRlcl9jb250ZXh0X21ncl9ub2RlOworc3RhdGljIHVpZF90IGJpbmRlcl9jb250ZXh0X21ncl91aWQgPSAtMTsKK3N0YXRpYyBpbnQgYmluZGVyX2xhc3RfaWQ7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpiaW5kZXJfcHJvY19kaXJfZW50cnlfcm9vdDsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9wcm9jOworc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkIGJpbmRlcl9kZWFkX25vZGVzOworCitzdGF0aWMgaW50IGJpbmRlcl9yZWFkX3Byb2NfcHJvYygKKwljaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7CisKKy8qIFRoaXMgaXMgb25seSBkZWZpbmVkIGluIGluY2x1ZGUvYXNtLWFybS9zaXplcy5oICovCisjaWZuZGVmIFNaXzFLCisjZGVmaW5lIFNaXzFLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwCisjZW5kaWYKKworI2lmbmRlZiBTWl80TQorI2RlZmluZSBTWl80TSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMAorI2VuZGlmCisKKyNpZm5kZWYgX19pMzg2X18KKyNkZWZpbmUgRk9SQklEREVOX01NQVBfRkxBR1MgICAgICAgICAgICAgICAgKFZNX1dSSVRFIHwgVk1fRVhFQykKKyNlbHNlCisjZGVmaW5lIEZPUkJJRERFTl9NTUFQX0ZMQUdTICAgICAgICAgICAgICAgIChWTV9XUklURSkKKyNlbmRpZgorCisjZGVmaW5lIEJJTkRFUl9TTUFMTF9CVUZfU0laRSAoUEFHRV9TSVpFICogNjQpCisKK2VudW0geworCUJJTkRFUl9ERUJVR19VU0VSX0VSUk9SICAgICAgICAgICAgID0gMVUgPDwgMCwKKwlCSU5ERVJfREVCVUdfRkFJTEVEX1RSQU5TQUNUSU9OICAgICA9IDFVIDw8IDEsCisJQklOREVSX0RFQlVHX0RFQURfVFJBTlNBQ1RJT04gICAgICAgPSAxVSA8PCAyLAorCUJJTkRFUl9ERUJVR19PUEVOX0NMT1NFICAgICAgICAgICAgID0gMVUgPDwgMywKKwlCSU5ERVJfREVCVUdfREVBRF9CSU5ERVIgICAgICAgICAgICA9IDFVIDw8IDQsCisJQklOREVSX0RFQlVHX0RFQVRIX05PVElGSUNBVElPTiAgICAgPSAxVSA8PCA1LAorCUJJTkRFUl9ERUJVR19SRUFEX1dSSVRFICAgICAgICAgICAgID0gMVUgPDwgNiwKKwlCSU5ERVJfREVCVUdfVVNFUl9SRUZTICAgICAgICAgICAgICA9IDFVIDw8IDcsCisJQklOREVSX0RFQlVHX1RIUkVBRFMgICAgICAgICAgICAgICAgPSAxVSA8PCA4LAorCUJJTkRFUl9ERUJVR19UUkFOU0FDVElPTiAgICAgICAgICAgID0gMVUgPDwgOSwKKwlCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT05fQ09NUExFVEUgICA9IDFVIDw8IDEwLAorCUJJTkRFUl9ERUJVR19GUkVFX0JVRkZFUiAgICAgICAgICAgID0gMVUgPDwgMTEsCisJQklOREVSX0RFQlVHX0lOVEVSTkFMX1JFRlMgICAgICAgICAgPSAxVSA8PCAxMiwKKwlCSU5ERVJfREVCVUdfQlVGRkVSX0FMTE9DICAgICAgICAgICA9IDFVIDw8IDEzLAorCUJJTkRFUl9ERUJVR19QUklPUklUWV9DQVAgICAgICAgICAgID0gMVUgPDwgMTQsCisJQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQ19BU1lOQyAgICAgPSAxVSA8PCAxNSwKK307CitzdGF0aWMgdWludDMyX3QgYmluZGVyX2RlYnVnX21hc2sgPSBCSU5ERVJfREVCVUdfVVNFUl9FUlJPUiB8CisJQklOREVSX0RFQlVHX0ZBSUxFRF9UUkFOU0FDVElPTiB8IEJJTkRFUl9ERUJVR19ERUFEX1RSQU5TQUNUSU9OOworbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnX21hc2ssIGJpbmRlcl9kZWJ1Z19tYXNrLCB1aW50LCBTX0lXVVNSIHwgU19JUlVHTyk7CitzdGF0aWMgaW50IGJpbmRlcl9kZWJ1Z19ub19sb2NrOworbW9kdWxlX3BhcmFtX25hbWVkKHByb2Nfbm9fbG9jaywgYmluZGVyX2RlYnVnX25vX2xvY2ssIGJvb2wsIFNfSVdVU1IgfCBTX0lSVUdPKTsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChiaW5kZXJfdXNlcl9lcnJvcl93YWl0KTsKK3N0YXRpYyBpbnQgYmluZGVyX3N0b3Bfb25fdXNlcl9lcnJvcjsKK3N0YXRpYyBpbnQgYmluZGVyX3NldF9zdG9wX29uX3VzZXJfZXJyb3IoCisJY29uc3QgY2hhciAqdmFsLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKK3sKKwlpbnQgcmV0OworCXJldCA9IHBhcmFtX3NldF9pbnQodmFsLCBrcCk7CisJaWYgKGJpbmRlcl9zdG9wX29uX3VzZXJfZXJyb3IgPCAyKQorCQl3YWtlX3VwKCZiaW5kZXJfdXNlcl9lcnJvcl93YWl0KTsKKwlyZXR1cm4gcmV0OworfQorbW9kdWxlX3BhcmFtX2NhbGwoc3RvcF9vbl91c2VyX2Vycm9yLCBiaW5kZXJfc2V0X3N0b3Bfb25fdXNlcl9lcnJvciwKKwlwYXJhbV9nZXRfaW50LCAmYmluZGVyX3N0b3Bfb25fdXNlcl9lcnJvciwgU19JV1VTUiB8IFNfSVJVR08pOworCisjZGVmaW5lIGJpbmRlcl91c2VyX2Vycm9yKHguLi4pIFwKKwlkbyB7IFwKKwkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX1VTRVJfRVJST1IpIFwKKwkJCXByaW50ayhLRVJOX0lORk8geCk7IFwKKwkJaWYgKGJpbmRlcl9zdG9wX29uX3VzZXJfZXJyb3IpIFwKKwkJCWJpbmRlcl9zdG9wX29uX3VzZXJfZXJyb3IgPSAyOyBcCisJfSB3aGlsZSAoMCkKKworZW51bSB7CisJQklOREVSX1NUQVRfUFJPQywKKwlCSU5ERVJfU1RBVF9USFJFQUQsCisJQklOREVSX1NUQVRfTk9ERSwKKwlCSU5ERVJfU1RBVF9SRUYsCisJQklOREVSX1NUQVRfREVBVEgsCisJQklOREVSX1NUQVRfVFJBTlNBQ1RJT04sCisJQklOREVSX1NUQVRfVFJBTlNBQ1RJT05fQ09NUExFVEUsCisJQklOREVSX1NUQVRfQ09VTlQKK307CisKK3N0cnVjdCBiaW5kZXJfc3RhdHMgeworCWludCBicltfSU9DX05SKEJSX0ZBSUxFRF9SRVBMWSkgKyAxXTsKKwlpbnQgYmNbX0lPQ19OUihCQ19ERUFEX0JJTkRFUl9ET05FKSArIDFdOworCWludCBvYmpfY3JlYXRlZFtCSU5ERVJfU1RBVF9DT1VOVF07CisJaW50IG9ial9kZWxldGVkW0JJTkRFUl9TVEFUX0NPVU5UXTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmluZGVyX3N0YXRzIGJpbmRlcl9zdGF0czsKKworc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9sb2dfZW50cnkgeworCWludCBkZWJ1Z19pZDsKKwlpbnQgY2FsbF90eXBlOworCWludCBmcm9tX3Byb2M7CisJaW50IGZyb21fdGhyZWFkOworCWludCB0YXJnZXRfaGFuZGxlOworCWludCB0b19wcm9jOworCWludCB0b190aHJlYWQ7CisJaW50IHRvX25vZGU7CisJaW50IGRhdGFfc2l6ZTsKKwlpbnQgb2Zmc2V0c19zaXplOworfTsKK3N0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nIHsKKwlpbnQgbmV4dDsKKwlpbnQgZnVsbDsKKwlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2xvZ19lbnRyeSBlbnRyeVszMl07Cit9Oworc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9sb2cgYmluZGVyX3RyYW5zYWN0aW9uX2xvZzsKK3N0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nIGJpbmRlcl90cmFuc2FjdGlvbl9sb2dfZmFpbGVkOworCitzdGF0aWMgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9sb2dfZW50cnkgKmJpbmRlcl90cmFuc2FjdGlvbl9sb2dfYWRkKAorCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nICpsb2cpCit7CisJc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9sb2dfZW50cnkgKmU7CisJZSA9ICZsb2ctPmVudHJ5W2xvZy0+bmV4dF07CisJbWVtc2V0KGUsIDAsIHNpemVvZigqZSkpOworCWxvZy0+bmV4dCsrOworCWlmIChsb2ctPm5leHQgPT0gQVJSQVlfU0laRShsb2ctPmVudHJ5KSkgeworCQlsb2ctPm5leHQgPSAwOworCQlsb2ctPmZ1bGwgPSAxOworCX0KKwlyZXR1cm4gZTsKK30KKworc3RydWN0IGJpbmRlcl93b3JrIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGVudHJ5OworCWVudW0geworCQlCSU5ERVJfV09SS19UUkFOU0FDVElPTiA9IDEsCisJCUJJTkRFUl9XT1JLX1RSQU5TQUNUSU9OX0NPTVBMRVRFLAorCQlCSU5ERVJfV09SS19OT0RFLAorCQlCSU5ERVJfV09SS19ERUFEX0JJTkRFUiwKKwkJQklOREVSX1dPUktfREVBRF9CSU5ERVJfQU5EX0NMRUFSLAorCQlCSU5ERVJfV09SS19DTEVBUl9ERUFUSF9OT1RJRklDQVRJT04sCisJfSB0eXBlOworfTsKKworc3RydWN0IGJpbmRlcl9ub2RlIHsKKwlpbnQgZGVidWdfaWQ7CisJc3RydWN0IGJpbmRlcl93b3JrIHdvcms7CisJdW5pb24geworCQlzdHJ1Y3QgcmJfbm9kZSByYl9ub2RlOworCQlzdHJ1Y3QgaGxpc3Rfbm9kZSBkZWFkX25vZGU7CisJfTsKKwlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2M7CisJc3RydWN0IGhsaXN0X2hlYWQgcmVmczsKKwlpbnQgaW50ZXJuYWxfc3Ryb25nX3JlZnM7CisJaW50IGxvY2FsX3dlYWtfcmVmczsKKwlpbnQgbG9jYWxfc3Ryb25nX3JlZnM7CisJdm9pZCBfX3VzZXIgKnB0cjsKKwl2b2lkIF9fdXNlciAqY29va2llOworCXVuc2lnbmVkIGhhc19zdHJvbmdfcmVmIDogMTsKKwl1bnNpZ25lZCBwZW5kaW5nX3N0cm9uZ19yZWYgOiAxOworCXVuc2lnbmVkIGhhc193ZWFrX3JlZiA6IDE7CisJdW5zaWduZWQgcGVuZGluZ193ZWFrX3JlZiA6IDE7CisJdW5zaWduZWQgaGFzX2FzeW5jX3RyYW5zYWN0aW9uIDogMTsKKwl1bnNpZ25lZCBhY2NlcHRfZmRzIDogMTsKKwlpbnQgbWluX3ByaW9yaXR5IDogODsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGFzeW5jX3RvZG87Cit9OworCitzdHJ1Y3QgYmluZGVyX3JlZl9kZWF0aCB7CisJc3RydWN0IGJpbmRlcl93b3JrIHdvcms7CisJdm9pZCBfX3VzZXIgKmNvb2tpZTsKK307CisKK3N0cnVjdCBiaW5kZXJfcmVmIHsKKwkvKiBMb29rdXBzIG5lZWRlZDogKi8KKwkvKiAgIG5vZGUgKyBwcm9jID0+IHJlZiAodHJhbnNhY3Rpb24pICovCisJLyogICBkZXNjICsgcHJvYyA9PiByZWYgKHRyYW5zYWN0aW9uLCBpbmMvZGVjIHJlZikgKi8KKwkvKiAgIG5vZGUgPT4gcmVmcyArIHByb2NzIChwcm9jIGV4aXQpICovCisJaW50IGRlYnVnX2lkOworCXN0cnVjdCByYl9ub2RlIHJiX25vZGVfZGVzYzsKKwlzdHJ1Y3QgcmJfbm9kZSByYl9ub2RlX25vZGU7CisJc3RydWN0IGhsaXN0X25vZGUgbm9kZV9lbnRyeTsKKwlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2M7CisJc3RydWN0IGJpbmRlcl9ub2RlICpub2RlOworCXVpbnQzMl90IGRlc2M7CisJaW50IHN0cm9uZzsKKwlpbnQgd2VhazsKKwlzdHJ1Y3QgYmluZGVyX3JlZl9kZWF0aCAqZGVhdGg7Cit9OworCitzdHJ1Y3QgYmluZGVyX2J1ZmZlciB7CisJc3RydWN0IGxpc3RfaGVhZCBlbnRyeTsgLyogZnJlZSBhbmQgYWxsb2NhdGVkIGVudHJpZXMgYnkgYWRkZXNzcyAqLworCXN0cnVjdCByYl9ub2RlIHJiX25vZGU7IC8qIGZyZWUgZW50cnkgYnkgc2l6ZSBvciBhbGxvY2F0ZWQgZW50cnkgKi8KKwkJCQkvKiBieSBhZGRyZXNzICovCisJdW5zaWduZWQgZnJlZSA6IDE7CisJdW5zaWduZWQgYWxsb3dfdXNlcl9mcmVlIDogMTsKKwl1bnNpZ25lZCBhc3luY190cmFuc2FjdGlvbiA6IDE7CisJdW5zaWduZWQgZGVidWdfaWQgOiAyOTsKKworCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uOworCisJc3RydWN0IGJpbmRlcl9ub2RlICp0YXJnZXRfbm9kZTsKKwlzaXplX3QgZGF0YV9zaXplOworCXNpemVfdCBvZmZzZXRzX3NpemU7CisJdWludDhfdCBkYXRhWzBdOworfTsKKworc3RydWN0IGJpbmRlcl9wcm9jIHsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBwcm9jX25vZGU7CisJc3RydWN0IHJiX3Jvb3QgdGhyZWFkczsKKwlzdHJ1Y3QgcmJfcm9vdCBub2RlczsKKwlzdHJ1Y3QgcmJfcm9vdCByZWZzX2J5X2Rlc2M7CisJc3RydWN0IHJiX3Jvb3QgcmVmc19ieV9ub2RlOworCWludCBwaWQ7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CisJdm9pZCAqYnVmZmVyOworCXNpemVfdCB1c2VyX2J1ZmZlcl9vZmZzZXQ7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGJ1ZmZlcnM7CisJc3RydWN0IHJiX3Jvb3QgZnJlZV9idWZmZXJzOworCXN0cnVjdCByYl9yb290IGFsbG9jYXRlZF9idWZmZXJzOworCXNpemVfdCBmcmVlX2FzeW5jX3NwYWNlOworCisJc3RydWN0IHBhZ2UgKipwYWdlczsKKwlzaXplX3QgYnVmZmVyX3NpemU7CisJdWludDMyX3QgYnVmZmVyX2ZyZWU7CisJc3RydWN0IGxpc3RfaGVhZCB0b2RvOworCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CisJc3RydWN0IGJpbmRlcl9zdGF0cyBzdGF0czsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRlbGl2ZXJlZF9kZWF0aDsKKwlpbnQgbWF4X3RocmVhZHM7CisJaW50IHJlcXVlc3RlZF90aHJlYWRzOworCWludCByZXF1ZXN0ZWRfdGhyZWFkc19zdGFydGVkOworCWludCByZWFkeV90aHJlYWRzOworCWxvbmcgZGVmYXVsdF9wcmlvcml0eTsKK307CisKK2VudW0geworCUJJTkRFUl9MT09QRVJfU1RBVEVfUkVHSVNURVJFRCAgPSAweDAxLAorCUJJTkRFUl9MT09QRVJfU1RBVEVfRU5URVJFRCAgICAgPSAweDAyLAorCUJJTkRFUl9MT09QRVJfU1RBVEVfRVhJVEVEICAgICAgPSAweDA0LAorCUJJTkRFUl9MT09QRVJfU1RBVEVfSU5WQUxJRCAgICAgPSAweDA4LAorCUJJTkRFUl9MT09QRVJfU1RBVEVfV0FJVElORyAgICAgPSAweDEwLAorCUJJTkRFUl9MT09QRVJfU1RBVEVfTkVFRF9SRVRVUk4gPSAweDIwCit9OworCitzdHJ1Y3QgYmluZGVyX3RocmVhZCB7CisJc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jOworCXN0cnVjdCByYl9ub2RlIHJiX25vZGU7CisJaW50IHBpZDsKKwlpbnQgbG9vcGVyOworCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uX3N0YWNrOworCXN0cnVjdCBsaXN0X2hlYWQgdG9kbzsKKwl1aW50MzJfdCByZXR1cm5fZXJyb3I7IC8qIFdyaXRlIGZhaWxlZCwgcmV0dXJuIGVycm9yIGNvZGUgaW4gcmVhZCBidWYgKi8KKwl1aW50MzJfdCByZXR1cm5fZXJyb3IyOyAvKiBXcml0ZSBmYWlsZWQsIHJldHVybiBlcnJvciBjb2RlIGluIHJlYWQgKi8KKwkJLyogYnVmZmVyLiBVc2VkIHdoZW4gc2VuZGluZyBhIHJlcGx5IHRvIGEgZGVhZCBwcm9jZXNzIHRoYXQgKi8KKwkJLyogd2UgYXJlIGFsc28gd2FpdGluZyBvbiAqLworCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CisJc3RydWN0IGJpbmRlcl9zdGF0cyBzdGF0czsKK307CisKK3N0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24geworCWludCBkZWJ1Z19pZDsKKwlzdHJ1Y3QgYmluZGVyX3dvcmsgd29yazsKKwlzdHJ1Y3QgYmluZGVyX3RocmVhZCAqZnJvbTsKKwlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICpmcm9tX3BhcmVudDsKKwlzdHJ1Y3QgYmluZGVyX3Byb2MgKnRvX3Byb2M7CisJc3RydWN0IGJpbmRlcl90aHJlYWQgKnRvX3RocmVhZDsKKwlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICp0b19wYXJlbnQ7CisJdW5zaWduZWQgbmVlZF9yZXBseSA6IDE7CisJLyp1bnNpZ25lZCBpc19kZWFkIDogMTsqLyAvKiBub3QgdXNlZCBhdCB0aGUgbW9tZW50ICovCisKKwlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyOworCXVuc2lnbmVkIGludAljb2RlOworCXVuc2lnbmVkIGludAlmbGFnczsKKwlsb25nCXByaW9yaXR5OworCWxvbmcJc2F2ZWRfcHJpb3JpdHk7CisJdWlkX3QJc2VuZGVyX2V1aWQ7Cit9OworCisvKgorICogY29waWVkIGZyb20gZ2V0X3VudXNlZF9mZF9mbGFncworICovCitpbnQgdGFza19nZXRfdW51c2VkX2ZkX2ZsYWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMgPSBnZXRfZmlsZXNfc3RydWN0KHRzayk7CisJaW50IGZkLCBlcnJvcjsKKwlzdHJ1Y3QgZmR0YWJsZSAqZmR0OworCXVuc2lnbmVkIGxvbmcgcmxpbV9jdXI7CisKKwlpZiAoZmlsZXMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FU1JDSDsKKworCWVycm9yID0gLUVNRklMRTsKKwlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOworCityZXBlYXQ6CisJZmR0ID0gZmlsZXNfZmR0YWJsZShmaWxlcyk7CisJZmQgPSBmaW5kX25leHRfemVyb19iaXQoZmR0LT5vcGVuX2Zkcy0+ZmRzX2JpdHMsIGZkdC0+bWF4X2ZkcywKKwkJCQlmaWxlcy0+bmV4dF9mZCk7CisKKwkvKgorCSAqIE4uQi4gRm9yIGNsb25lIHRhc2tzIHNoYXJpbmcgYSBmaWxlcyBzdHJ1Y3R1cmUsIHRoaXMgdGVzdAorCSAqIHdpbGwgbGltaXQgdGhlIHRvdGFsIG51bWJlciBvZiBmaWxlcyB0aGF0IGNhbiBiZSBvcGVuZWQuCisJICovCisJcmN1X3JlYWRfbG9jaygpOworCWlmICh0c2stPnNpZ25hbCkKKwkJcmxpbV9jdXIgPSB0c2stPnNpZ25hbC0+cmxpbVtSTElNSVRfTk9GSUxFXS5ybGltX2N1cjsKKwllbHNlCisJCXJsaW1fY3VyID0gMDsKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlpZiAoZmQgPj0gcmxpbV9jdXIpCisJCWdvdG8gb3V0OworCisJLyogRG8gd2UgbmVlZCB0byBleHBhbmQgdGhlIGZkIGFycmF5IG9yIGZkIHNldD8gICovCisJZXJyb3IgPSBleHBhbmRfZmlsZXMoZmlsZXMsIGZkKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIG91dDsKKworCWlmIChlcnJvcikgeworCQkvKgorCQkgKiBJZiB3ZSBuZWVkZWQgdG8gZXhwYW5kIHRoZSBmcyBhcnJheSB3ZQorCQkgKiBtaWdodCBoYXZlIGJsb2NrZWQgLSB0cnkgYWdhaW4uCisJCSAqLworCQllcnJvciA9IC1FTUZJTEU7CisJCWdvdG8gcmVwZWF0OworCX0KKworCUZEX1NFVChmZCwgZmR0LT5vcGVuX2Zkcyk7CisJaWYgKGZsYWdzICYgT19DTE9FWEVDKQorCQlGRF9TRVQoZmQsIGZkdC0+Y2xvc2Vfb25fZXhlYyk7CisJZWxzZQorCQlGRF9DTFIoZmQsIGZkdC0+Y2xvc2Vfb25fZXhlYyk7CisJZmlsZXMtPm5leHRfZmQgPSBmZCArIDE7CisjaWYgMQorCS8qIFNhbml0eSBjaGVjayAqLworCWlmIChmZHQtPmZkW2ZkXSAhPSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImdldF91bnVzZWRfZmQ6IHNsb3QgJWQgbm90IE5VTEwhXG4iLCBmZCk7CisJCWZkdC0+ZmRbZmRdID0gTlVMTDsKKwl9CisjZW5kaWYKKwllcnJvciA9IGZkOworCitvdXQ6CisJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOworCXB1dF9maWxlc19zdHJ1Y3QoZmlsZXMpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIGNvcGllZCBmcm9tIGZkX2luc3RhbGwKKyAqLworc3RhdGljIHZvaWQgdGFza19mZF9pbnN0YWxsKAorCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB1bnNpZ25lZCBpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzID0gZ2V0X2ZpbGVzX3N0cnVjdCh0c2spOworCXN0cnVjdCBmZHRhYmxlICpmZHQ7CisKKwlpZiAoZmlsZXMgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlmZHQgPSBmaWxlc19mZHRhYmxlKGZpbGVzKTsKKwlCVUdfT04oZmR0LT5mZFtmZF0gIT0gTlVMTCk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKGZkdC0+ZmRbZmRdLCBmaWxlKTsKKwlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJcHV0X2ZpbGVzX3N0cnVjdChmaWxlcyk7Cit9CisKKy8qCisgKiBjb3BpZWQgZnJvbSBfX3B1dF91bnVzZWRfZmQgaW4gb3Blbi5jCisgKi8KK3N0YXRpYyB2b2lkIF9fcHV0X3VudXNlZF9mZChzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcywgdW5zaWduZWQgaW50IGZkKQoreworCXN0cnVjdCBmZHRhYmxlICpmZHQgPSBmaWxlc19mZHRhYmxlKGZpbGVzKTsKKwlfX0ZEX0NMUihmZCwgZmR0LT5vcGVuX2Zkcyk7CisJaWYgKGZkIDwgZmlsZXMtPm5leHRfZmQpCisJCWZpbGVzLT5uZXh0X2ZkID0gZmQ7Cit9CisKKy8qCisgKiBjb3BpZWQgZnJvbSBzeXNfY2xvc2UKKyAqLworc3RhdGljIGxvbmcgdGFza19jbG9zZV9mZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdW5zaWduZWQgaW50IGZkKQoreworCXN0cnVjdCBmaWxlICpmaWxwOworCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzID0gZ2V0X2ZpbGVzX3N0cnVjdCh0c2spOworCXN0cnVjdCBmZHRhYmxlICpmZHQ7CisJaW50IHJldHZhbDsKKworCWlmIChmaWxlcyA9PSBOVUxMKQorCQlyZXR1cm4gLUVTUkNIOworCisJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlmZHQgPSBmaWxlc19mZHRhYmxlKGZpbGVzKTsKKwlpZiAoZmQgPj0gZmR0LT5tYXhfZmRzKQorCQlnb3RvIG91dF91bmxvY2s7CisJZmlscCA9IGZkdC0+ZmRbZmRdOworCWlmICghZmlscCkKKwkJZ290byBvdXRfdW5sb2NrOworCXJjdV9hc3NpZ25fcG9pbnRlcihmZHQtPmZkW2ZkXSwgTlVMTCk7CisJRkRfQ0xSKGZkLCBmZHQtPmNsb3NlX29uX2V4ZWMpOworCV9fcHV0X3VudXNlZF9mZChmaWxlcywgZmQpOworCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlyZXR2YWwgPSBmaWxwX2Nsb3NlKGZpbHAsIGZpbGVzKTsKKworCS8qIGNhbid0IHJlc3RhcnQgY2xvc2Ugc3lzY2FsbCBiZWNhdXNlIGZpbGUgdGFibGUgZW50cnkgd2FzIGNsZWFyZWQgKi8KKwlpZiAodW5saWtlbHkocmV0dmFsID09IC1FUkVTVEFSVFNZUyB8fAorCQkgICAgIHJldHZhbCA9PSAtRVJFU1RBUlROT0lOVFIgfHwKKwkJICAgICByZXR2YWwgPT0gLUVSRVNUQVJUTk9IQU5EIHx8CisJCSAgICAgcmV0dmFsID09IC1FUkVTVEFSVF9SRVNUQVJUQkxPQ0spKQorCQlyZXR2YWwgPSAtRUlOVFI7CisKKwlwdXRfZmlsZXNfc3RydWN0KGZpbGVzKTsKKwlyZXR1cm4gcmV0dmFsOworCitvdXRfdW5sb2NrOgorCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlwdXRfZmlsZXNfc3RydWN0KGZpbGVzKTsKKwlyZXR1cm4gLUVCQURGOworfQorCitzdGF0aWMgdm9pZCBiaW5kZXJfc2V0X25pY2UobG9uZyBuaWNlKQoreworCWxvbmcgbWluX25pY2U7CisJaWYgKGNhbl9uaWNlKGN1cnJlbnQsIG5pY2UpKSB7CisJCXNldF91c2VyX25pY2UoY3VycmVudCwgbmljZSk7CisJCXJldHVybjsKKwl9CisJbWluX25pY2UgPSAyMCAtIGN1cnJlbnQtPnNpZ25hbC0+cmxpbVtSTElNSVRfTklDRV0ucmxpbV9jdXI7CisJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX1BSSU9SSVRZX0NBUCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDogbmljZSB2YWx1ZSAlbGQgbm90IGFsbG93ZWQgdXNlICIKKwkJICAgICAgICIlbGQgaW5zdGVhZFxuIiwgY3VycmVudC0+cGlkLCBuaWNlLCBtaW5fbmljZSk7CisJc2V0X3VzZXJfbmljZShjdXJyZW50LCBtaW5fbmljZSk7CisJaWYgKG1pbl9uaWNlIDwgMjApCisJCXJldHVybjsKKwliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZCBSTElNSVRfTklDRSBub3Qgc2V0XG4iLCBjdXJyZW50LT5waWQpOworfQorCitzdGF0aWMgc2l6ZV90IGJpbmRlcl9idWZmZXJfc2l6ZSgKKwlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsIHN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXIpCit7CisJaWYgKGxpc3RfaXNfbGFzdCgmYnVmZmVyLT5lbnRyeSwgJnByb2MtPmJ1ZmZlcnMpKQorCQlyZXR1cm4gcHJvYy0+YnVmZmVyICsgcHJvYy0+YnVmZmVyX3NpemUgLSAodm9pZCAqKWJ1ZmZlci0+ZGF0YTsKKwllbHNlCisJCXJldHVybiAoc2l6ZV90KWxpc3RfZW50cnkoYnVmZmVyLT5lbnRyeS5uZXh0LAorCQkJc3RydWN0IGJpbmRlcl9idWZmZXIsIGVudHJ5KSAtIChzaXplX3QpYnVmZmVyLT5kYXRhOworfQorCitzdGF0aWMgdm9pZCBiaW5kZXJfaW5zZXJ0X2ZyZWVfYnVmZmVyKAorCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgc3RydWN0IGJpbmRlcl9idWZmZXIgKm5ld19idWZmZXIpCit7CisJc3RydWN0IHJiX25vZGUgKipwID0gJnByb2MtPmZyZWVfYnVmZmVycy5yYl9ub2RlOworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOworCXN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXI7CisJc2l6ZV90IGJ1ZmZlcl9zaXplOworCXNpemVfdCBuZXdfYnVmZmVyX3NpemU7CisKKwlCVUdfT04oIW5ld19idWZmZXItPmZyZWUpOworCisJbmV3X2J1ZmZlcl9zaXplID0gYmluZGVyX2J1ZmZlcl9zaXplKHByb2MsIG5ld19idWZmZXIpOworCisJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDogYWRkIGZyZWUgYnVmZmVyLCBzaXplICV6ZCwgIgorCQkgICAgICAgImF0ICVwXG4iLCBwcm9jLT5waWQsIG5ld19idWZmZXJfc2l6ZSwgbmV3X2J1ZmZlcik7CisKKwl3aGlsZSAoKnApIHsKKwkJcGFyZW50ID0gKnA7CisJCWJ1ZmZlciA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGJpbmRlcl9idWZmZXIsIHJiX25vZGUpOworCQlCVUdfT04oIWJ1ZmZlci0+ZnJlZSk7CisKKwkJYnVmZmVyX3NpemUgPSBiaW5kZXJfYnVmZmVyX3NpemUocHJvYywgYnVmZmVyKTsKKworCQlpZiAobmV3X2J1ZmZlcl9zaXplIDwgYnVmZmVyX3NpemUpCisJCQlwID0gJnBhcmVudC0+cmJfbGVmdDsKKwkJZWxzZQorCQkJcCA9ICZwYXJlbnQtPnJiX3JpZ2h0OworCX0KKwlyYl9saW5rX25vZGUoJm5ld19idWZmZXItPnJiX25vZGUsIHBhcmVudCwgcCk7CisJcmJfaW5zZXJ0X2NvbG9yKCZuZXdfYnVmZmVyLT5yYl9ub2RlLCAmcHJvYy0+ZnJlZV9idWZmZXJzKTsKK30KKworc3RhdGljIHZvaWQgYmluZGVyX2luc2VydF9hbGxvY2F0ZWRfYnVmZmVyKAorCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgc3RydWN0IGJpbmRlcl9idWZmZXIgKm5ld19idWZmZXIpCit7CisJc3RydWN0IHJiX25vZGUgKipwID0gJnByb2MtPmFsbG9jYXRlZF9idWZmZXJzLnJiX25vZGU7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7CisJc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlcjsKKworCUJVR19PTihuZXdfYnVmZmVyLT5mcmVlKTsKKworCXdoaWxlICgqcCkgeworCQlwYXJlbnQgPSAqcDsKKwkJYnVmZmVyID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgYmluZGVyX2J1ZmZlciwgcmJfbm9kZSk7CisJCUJVR19PTihidWZmZXItPmZyZWUpOworCisJCWlmIChuZXdfYnVmZmVyIDwgYnVmZmVyKQorCQkJcCA9ICZwYXJlbnQtPnJiX2xlZnQ7CisJCWVsc2UgaWYgKG5ld19idWZmZXIgPiBidWZmZXIpCisJCQlwID0gJnBhcmVudC0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCUJVRygpOworCX0KKwlyYl9saW5rX25vZGUoJm5ld19idWZmZXItPnJiX25vZGUsIHBhcmVudCwgcCk7CisJcmJfaW5zZXJ0X2NvbG9yKCZuZXdfYnVmZmVyLT5yYl9ub2RlLCAmcHJvYy0+YWxsb2NhdGVkX2J1ZmZlcnMpOworfQorCitzdGF0aWMgc3RydWN0IGJpbmRlcl9idWZmZXIgKmJpbmRlcl9idWZmZXJfbG9va3VwKAorCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgdm9pZCBfX3VzZXIgKnVzZXJfcHRyKQoreworCXN0cnVjdCByYl9ub2RlICpuID0gcHJvYy0+YWxsb2NhdGVkX2J1ZmZlcnMucmJfbm9kZTsKKwlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyOworCXN0cnVjdCBiaW5kZXJfYnVmZmVyICprZXJuX3B0cjsKKworCWtlcm5fcHRyID0gdXNlcl9wdHIgLSBwcm9jLT51c2VyX2J1ZmZlcl9vZmZzZXQKKwkJLSBvZmZzZXRvZihzdHJ1Y3QgYmluZGVyX2J1ZmZlciwgZGF0YSk7CisKKwl3aGlsZSAobikgeworCQlidWZmZXIgPSByYl9lbnRyeShuLCBzdHJ1Y3QgYmluZGVyX2J1ZmZlciwgcmJfbm9kZSk7CisJCUJVR19PTihidWZmZXItPmZyZWUpOworCisJCWlmIChrZXJuX3B0ciA8IGJ1ZmZlcikKKwkJCW4gPSBuLT5yYl9sZWZ0OworCQllbHNlIGlmIChrZXJuX3B0ciA+IGJ1ZmZlcikKKwkJCW4gPSBuLT5yYl9yaWdodDsKKwkJZWxzZQorCQkJcmV0dXJuIGJ1ZmZlcjsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgYmluZGVyX3VwZGF0ZV9wYWdlX3JhbmdlKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgaW50IGFsbG9jYXRlLAorCXZvaWQgKnN0YXJ0LCB2b2lkICplbmQsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXZvaWQgKnBhZ2VfYWRkcjsKKwl1bnNpZ25lZCBsb25nIHVzZXJfcGFnZV9hZGRyOworCXN0cnVjdCB2bV9zdHJ1Y3QgdG1wX2FyZWE7CisJc3RydWN0IHBhZ2UgKipwYWdlOworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOworCisJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDogJXMgcGFnZXMgJXAtJXBcbiIsCisJCSAgICAgICBwcm9jLT5waWQsIGFsbG9jYXRlID8gImFsbG9jYXRlIiA6ICJmcmVlIiwgc3RhcnQsIGVuZCk7CisKKwlpZiAoZW5kIDw9IHN0YXJ0KQorCQlyZXR1cm4gMDsKKworCWlmICh2bWEpCisJCW1tID0gTlVMTDsKKwllbHNlCisJCW1tID0gZ2V0X3Rhc2tfbW0ocHJvYy0+dHNrKTsKKworCWlmIChtbSkgeworCQlkb3duX3dyaXRlKCZtbS0+bW1hcF9zZW0pOworCQl2bWEgPSBwcm9jLT52bWE7CisJfQorCisJaWYgKGFsbG9jYXRlID09IDApCisJCWdvdG8gZnJlZV9yYW5nZTsKKworCWlmICh2bWEgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogJWQ6IGJpbmRlcl9hbGxvY19idWYgZmFpbGVkIHRvICIKKwkJICAgICAgICJtYXAgcGFnZXMgaW4gdXNlcnNwYWNlLCBubyB2bWFcbiIsIHByb2MtPnBpZCk7CisJCWdvdG8gZXJyX25vX3ZtYTsKKwl9CisKKwlmb3IgKHBhZ2VfYWRkciA9IHN0YXJ0OyBwYWdlX2FkZHIgPCBlbmQ7IHBhZ2VfYWRkciArPSBQQUdFX1NJWkUpIHsKKwkJaW50IHJldDsKKwkJc3RydWN0IHBhZ2UgKipwYWdlX2FycmF5X3B0cjsKKwkJcGFnZSA9ICZwcm9jLT5wYWdlc1socGFnZV9hZGRyIC0gcHJvYy0+YnVmZmVyKSAvIFBBR0VfU0laRV07CisKKwkJQlVHX09OKCpwYWdlKTsKKwkJKnBhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTsKKwkJaWYgKCpwYWdlID09IE5VTEwpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiAlZDogYmluZGVyX2FsbG9jX2J1ZiBmYWlsZWQgIgorCQkJICAgICAgICJmb3IgcGFnZSBhdCAlcFxuIiwgcHJvYy0+cGlkLCBwYWdlX2FkZHIpOworCQkJZ290byBlcnJfYWxsb2NfcGFnZV9mYWlsZWQ7CisJCX0KKwkJdG1wX2FyZWEuYWRkciA9IHBhZ2VfYWRkcjsKKwkJdG1wX2FyZWEuc2l6ZSA9IFBBR0VfU0laRSArIFBBR0VfU0laRSAvKiBndWFyZCBwYWdlPyAqLzsKKwkJcGFnZV9hcnJheV9wdHIgPSBwYWdlOworCQlyZXQgPSBtYXBfdm1fYXJlYSgmdG1wX2FyZWEsIFBBR0VfS0VSTkVMLCAmcGFnZV9hcnJheV9wdHIpOworCQlpZiAocmV0KSB7CisJCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogJWQ6IGJpbmRlcl9hbGxvY19idWYgZmFpbGVkICIKKwkJCSAgICAgICAidG8gbWFwIHBhZ2UgYXQgJXAgaW4ga2VybmVsXG4iLAorCQkJICAgICAgIHByb2MtPnBpZCwgcGFnZV9hZGRyKTsKKwkJCWdvdG8gZXJyX21hcF9rZXJuZWxfZmFpbGVkOworCQl9CisJCXVzZXJfcGFnZV9hZGRyID0gKHNpemVfdClwYWdlX2FkZHIgKyBwcm9jLT51c2VyX2J1ZmZlcl9vZmZzZXQ7CisJCXJldCA9IHZtX2luc2VydF9wYWdlKHZtYSwgdXNlcl9wYWdlX2FkZHIsIHBhZ2VbMF0pOworCQlpZiAocmV0KSB7CisJCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogJWQ6IGJpbmRlcl9hbGxvY19idWYgZmFpbGVkICIKKwkJCSAgICAgICAidG8gbWFwIHBhZ2UgYXQgJWx4IGluIHVzZXJzcGFjZVxuIiwKKwkJCSAgICAgICBwcm9jLT5waWQsIHVzZXJfcGFnZV9hZGRyKTsKKwkJCWdvdG8gZXJyX3ZtX2luc2VydF9wYWdlX2ZhaWxlZDsKKwkJfQorCQkvKiB2bV9pbnNlcnRfcGFnZSBkb2VzIG5vdCBzZWVtIHRvIGluY3JlbWVudCB0aGUgcmVmY291bnQgKi8KKwl9CisJaWYgKG1tKSB7CisJCXVwX3dyaXRlKCZtbS0+bW1hcF9zZW0pOworCQltbXB1dChtbSk7CisJfQorCXJldHVybiAwOworCitmcmVlX3JhbmdlOgorCWZvciAocGFnZV9hZGRyID0gZW5kIC0gUEFHRV9TSVpFOyBwYWdlX2FkZHIgPj0gc3RhcnQ7CisJICAgICBwYWdlX2FkZHIgLT0gUEFHRV9TSVpFKSB7CisJCXBhZ2UgPSAmcHJvYy0+cGFnZXNbKHBhZ2VfYWRkciAtIHByb2MtPmJ1ZmZlcikgLyBQQUdFX1NJWkVdOworCQlpZiAodm1hKQorCQkJemFwX3BhZ2VfcmFuZ2Uodm1hLCAoc2l6ZV90KXBhZ2VfYWRkciArCisJCQkJcHJvYy0+dXNlcl9idWZmZXJfb2Zmc2V0LCBQQUdFX1NJWkUsIE5VTEwpOworZXJyX3ZtX2luc2VydF9wYWdlX2ZhaWxlZDoKKwkJdW5tYXBfa2VybmVsX3JhbmdlKCh1bnNpZ25lZCBsb25nKXBhZ2VfYWRkciwgUEFHRV9TSVpFKTsKK2Vycl9tYXBfa2VybmVsX2ZhaWxlZDoKKwkJX19mcmVlX3BhZ2UoKnBhZ2UpOworCQkqcGFnZSA9IE5VTEw7CitlcnJfYWxsb2NfcGFnZV9mYWlsZWQ6CisJCTsKKwl9CitlcnJfbm9fdm1hOgorCWlmIChtbSkgeworCQl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKKwkJbW1wdXQobW0pOworCX0KKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHN0cnVjdCBiaW5kZXJfYnVmZmVyICpiaW5kZXJfYWxsb2NfYnVmKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywKKwlzaXplX3QgZGF0YV9zaXplLCBzaXplX3Qgb2Zmc2V0c19zaXplLCBpbnQgaXNfYXN5bmMpCit7CisJc3RydWN0IHJiX25vZGUgKm4gPSBwcm9jLT5mcmVlX2J1ZmZlcnMucmJfbm9kZTsKKwlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyOworCXNpemVfdCBidWZmZXJfc2l6ZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqYmVzdF9maXQgPSBOVUxMOworCXZvaWQgKmhhc19wYWdlX2FkZHI7CisJdm9pZCAqZW5kX3BhZ2VfYWRkcjsKKwlzaXplX3Qgc2l6ZTsKKworCWlmIChwcm9jLT52bWEgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogJWQ6IGJpbmRlcl9hbGxvY19idWYsIG5vIHZtYVxuIiwKKwkJICAgICAgIHByb2MtPnBpZCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXNpemUgPSBBTElHTihkYXRhX3NpemUsIHNpemVvZih2b2lkICopKSArCisJCUFMSUdOKG9mZnNldHNfc2l6ZSwgc2l6ZW9mKHZvaWQgKikpOworCisJaWYgKHNpemUgPCBkYXRhX3NpemUgfHwgc2l6ZSA8IG9mZnNldHNfc2l6ZSkgeworCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDogZ290IHRyYW5zYWN0aW9uIHdpdGggaW52YWxpZCAiCisJCQkic2l6ZSAlemQtJXpkXG4iLCBwcm9jLT5waWQsIGRhdGFfc2l6ZSwgb2Zmc2V0c19zaXplKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGlzX2FzeW5jICYmCisJICAgIHByb2MtPmZyZWVfYXN5bmNfc3BhY2UgPCBzaXplICsgc2l6ZW9mKHN0cnVjdCBiaW5kZXJfYnVmZmVyKSkgeworCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfQlVGRkVSX0FMTE9DKQorCQkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6ICVkOiBiaW5kZXJfYWxsb2NfYnVmIHNpemUgJXpkIGYiCisJCQkgICAgICAgImFpbGVkLCBubyBhc3luYyBzcGFjZSBsZWZ0XG4iLCBwcm9jLT5waWQsIHNpemUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwl3aGlsZSAobikgeworCQlidWZmZXIgPSByYl9lbnRyeShuLCBzdHJ1Y3QgYmluZGVyX2J1ZmZlciwgcmJfbm9kZSk7CisJCUJVR19PTighYnVmZmVyLT5mcmVlKTsKKwkJYnVmZmVyX3NpemUgPSBiaW5kZXJfYnVmZmVyX3NpemUocHJvYywgYnVmZmVyKTsKKworCQlpZiAoc2l6ZSA8IGJ1ZmZlcl9zaXplKSB7CisJCQliZXN0X2ZpdCA9IG47CisJCQluID0gbi0+cmJfbGVmdDsKKwkJfSBlbHNlIGlmIChzaXplID4gYnVmZmVyX3NpemUpCisJCQluID0gbi0+cmJfcmlnaHQ7CisJCWVsc2UgeworCQkJYmVzdF9maXQgPSBuOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGJlc3RfZml0ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6ICVkOiBiaW5kZXJfYWxsb2NfYnVmIHNpemUgJXpkIGZhaWxlZCwgIgorCQkgICAgICAgIm5vIGFkZHJlc3Mgc3BhY2VcbiIsIHByb2MtPnBpZCwgc2l6ZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAobiA9PSBOVUxMKSB7CisJCWJ1ZmZlciA9IHJiX2VudHJ5KGJlc3RfZml0LCBzdHJ1Y3QgYmluZGVyX2J1ZmZlciwgcmJfbm9kZSk7CisJCWJ1ZmZlcl9zaXplID0gYmluZGVyX2J1ZmZlcl9zaXplKHByb2MsIGJ1ZmZlcik7CisJfQorCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19CVUZGRVJfQUxMT0MpCisJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6IGJpbmRlcl9hbGxvY19idWYgc2l6ZSAlemQgZ290IGJ1ZmYiCisJCSAgICAgICAiZXIgJXAgc2l6ZSAlemRcbiIsIHByb2MtPnBpZCwgc2l6ZSwgYnVmZmVyLCBidWZmZXJfc2l6ZSk7CisKKwloYXNfcGFnZV9hZGRyID0KKwkJKHZvaWQgKikoKChzaXplX3QpYnVmZmVyLT5kYXRhICsgYnVmZmVyX3NpemUpICYgUEFHRV9NQVNLKTsKKwlpZiAobiA9PSBOVUxMKSB7CisJCWlmIChzaXplICsgc2l6ZW9mKHN0cnVjdCBiaW5kZXJfYnVmZmVyKSArIDQgPj0gYnVmZmVyX3NpemUpCisJCQlidWZmZXJfc2l6ZSA9IHNpemU7IC8qIG5vIHJvb20gZm9yIG90aGVyIGJ1ZmZlcnMgKi8KKwkJZWxzZQorCQkJYnVmZmVyX3NpemUgPSBzaXplICsgc2l6ZW9mKHN0cnVjdCBiaW5kZXJfYnVmZmVyKTsKKwl9CisJZW5kX3BhZ2VfYWRkciA9ICh2b2lkICopUEFHRV9BTElHTigoc2l6ZV90KWJ1ZmZlci0+ZGF0YSArIGJ1ZmZlcl9zaXplKTsKKwlpZiAoZW5kX3BhZ2VfYWRkciA+IGhhc19wYWdlX2FkZHIpCisJCWVuZF9wYWdlX2FkZHIgPSBoYXNfcGFnZV9hZGRyOworCWlmIChiaW5kZXJfdXBkYXRlX3BhZ2VfcmFuZ2UocHJvYywgMSwKKwkgICAgKHZvaWQgKilQQUdFX0FMSUdOKChzaXplX3QpYnVmZmVyLT5kYXRhKSwgZW5kX3BhZ2VfYWRkciwgTlVMTCkpCisJCXJldHVybiBOVUxMOworCisJcmJfZXJhc2UoYmVzdF9maXQsICZwcm9jLT5mcmVlX2J1ZmZlcnMpOworCWJ1ZmZlci0+ZnJlZSA9IDA7CisJYmluZGVyX2luc2VydF9hbGxvY2F0ZWRfYnVmZmVyKHByb2MsIGJ1ZmZlcik7CisJaWYgKGJ1ZmZlcl9zaXplICE9IHNpemUpIHsKKwkJc3RydWN0IGJpbmRlcl9idWZmZXIgKm5ld19idWZmZXIgPSAodm9pZCAqKWJ1ZmZlci0+ZGF0YSArIHNpemU7CisJCWxpc3RfYWRkKCZuZXdfYnVmZmVyLT5lbnRyeSwgJmJ1ZmZlci0+ZW50cnkpOworCQluZXdfYnVmZmVyLT5mcmVlID0gMTsKKwkJYmluZGVyX2luc2VydF9mcmVlX2J1ZmZlcihwcm9jLCBuZXdfYnVmZmVyKTsKKwl9CisJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDogYmluZGVyX2FsbG9jX2J1ZiBzaXplICV6ZCBnb3QgIgorCQkgICAgICAgIiVwXG4iLCBwcm9jLT5waWQsIHNpemUsIGJ1ZmZlcik7CisJYnVmZmVyLT5kYXRhX3NpemUgPSBkYXRhX3NpemU7CisJYnVmZmVyLT5vZmZzZXRzX3NpemUgPSBvZmZzZXRzX3NpemU7CisJYnVmZmVyLT5hc3luY190cmFuc2FjdGlvbiA9IGlzX2FzeW5jOworCWlmIChpc19hc3luYykgeworCQlwcm9jLT5mcmVlX2FzeW5jX3NwYWNlIC09IHNpemUgKyBzaXplb2Yoc3RydWN0IGJpbmRlcl9idWZmZXIpOworCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfQlVGRkVSX0FMTE9DX0FTWU5DKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDogYmluZGVyX2FsbG9jX2J1ZiBzaXplICV6ZCAiCisJCQkgICAgICAgImFzeW5jIGZyZWUgJXpkXG4iLCBwcm9jLT5waWQsIHNpemUsCisJCQkgICAgICAgcHJvYy0+ZnJlZV9hc3luY19zcGFjZSk7CisJfQorCisJcmV0dXJuIGJ1ZmZlcjsKK30KKworc3RhdGljIHZvaWQgKmJ1ZmZlcl9zdGFydF9wYWdlKHN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXIpCit7CisJcmV0dXJuICh2b2lkICopKChzaXplX3QpYnVmZmVyICYgUEFHRV9NQVNLKTsKK30KKworc3RhdGljIHZvaWQgKmJ1ZmZlcl9lbmRfcGFnZShzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyKQoreworCXJldHVybiAodm9pZCAqKSgoKHNpemVfdCkoYnVmZmVyICsgMSkgLSAxKSAmIFBBR0VfTUFTSyk7Cit9CisKK3N0YXRpYyB2b2lkIGJpbmRlcl9kZWxldGVfZnJlZV9idWZmZXIoCisJc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLCBzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyKQoreworCXN0cnVjdCBiaW5kZXJfYnVmZmVyICpwcmV2LCAqbmV4dCA9IE5VTEw7CisJaW50IGZyZWVfcGFnZV9lbmQgPSAxOworCWludCBmcmVlX3BhZ2Vfc3RhcnQgPSAxOworCisJQlVHX09OKHByb2MtPmJ1ZmZlcnMubmV4dCA9PSAmYnVmZmVyLT5lbnRyeSk7CisJcHJldiA9IGxpc3RfZW50cnkoYnVmZmVyLT5lbnRyeS5wcmV2LCBzdHJ1Y3QgYmluZGVyX2J1ZmZlciwgZW50cnkpOworCUJVR19PTighcHJldi0+ZnJlZSk7CisJaWYgKGJ1ZmZlcl9lbmRfcGFnZShwcmV2KSA9PSBidWZmZXJfc3RhcnRfcGFnZShidWZmZXIpKSB7CisJCWZyZWVfcGFnZV9zdGFydCA9IDA7CisJCWlmIChidWZmZXJfZW5kX3BhZ2UocHJldikgPT0gYnVmZmVyX2VuZF9wYWdlKGJ1ZmZlcikpCisJCQlmcmVlX3BhZ2VfZW5kID0gMDsKKwkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQykKKwkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6IG1lcmdlIGZyZWUsIGJ1ZmZlciAlcCAiCisJCQkgICAgICAgInNoYXJlIHBhZ2Ugd2l0aCAlcFxuIiwgcHJvYy0+cGlkLCBidWZmZXIsIHByZXYpOworCX0KKworCWlmICghbGlzdF9pc19sYXN0KCZidWZmZXItPmVudHJ5LCAmcHJvYy0+YnVmZmVycykpIHsKKwkJbmV4dCA9IGxpc3RfZW50cnkoYnVmZmVyLT5lbnRyeS5uZXh0LAorCQkJCSAgc3RydWN0IGJpbmRlcl9idWZmZXIsIGVudHJ5KTsKKwkJaWYgKGJ1ZmZlcl9zdGFydF9wYWdlKG5leHQpID09IGJ1ZmZlcl9lbmRfcGFnZShidWZmZXIpKSB7CisJCQlmcmVlX3BhZ2VfZW5kID0gMDsKKwkJCWlmIChidWZmZXJfc3RhcnRfcGFnZShuZXh0KSA9PQorCQkJICAgIGJ1ZmZlcl9zdGFydF9wYWdlKGJ1ZmZlcikpCisJCQkJZnJlZV9wYWdlX3N0YXJ0ID0gMDsKKwkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19CVUZGRVJfQUxMT0MpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDogbWVyZ2UgZnJlZSwgIgorCQkJCSAgICAgICAiYnVmZmVyICVwIHNoYXJlIHBhZ2Ugd2l0aCAlcFxuIiwKKwkJCQkgICAgICAgcHJvYy0+cGlkLCBidWZmZXIsIHByZXYpOworCQl9CisJfQorCWxpc3RfZGVsKCZidWZmZXItPmVudHJ5KTsKKwlpZiAoZnJlZV9wYWdlX3N0YXJ0IHx8IGZyZWVfcGFnZV9lbmQpIHsKKwkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQykKKwkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6IG1lcmdlIGZyZWUsIGJ1ZmZlciAlcCBkbyAiCisJCQkgICAgICAgIm5vdCBzaGFyZSBwYWdlJXMlcyB3aXRoIHdpdGggJXAgb3IgJXBcbiIsCisJCQkgICAgICAgcHJvYy0+cGlkLCBidWZmZXIsIGZyZWVfcGFnZV9zdGFydCA/ICIiIDogIiBlbmQiLAorCQkJICAgICAgIGZyZWVfcGFnZV9lbmQgPyAiIiA6ICIgc3RhcnQiLCBwcmV2LCBuZXh0KTsKKwkJYmluZGVyX3VwZGF0ZV9wYWdlX3JhbmdlKHByb2MsIDAsIGZyZWVfcGFnZV9zdGFydCA/CisJCQlidWZmZXJfc3RhcnRfcGFnZShidWZmZXIpIDogYnVmZmVyX2VuZF9wYWdlKGJ1ZmZlciksCisJCQkoZnJlZV9wYWdlX2VuZCA/IGJ1ZmZlcl9lbmRfcGFnZShidWZmZXIpIDoKKwkJCWJ1ZmZlcl9zdGFydF9wYWdlKGJ1ZmZlcikpICsgUEFHRV9TSVpFLCBOVUxMKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJpbmRlcl9mcmVlX2J1ZigKKwlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsIHN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXIpCit7CisJc2l6ZV90IHNpemUsIGJ1ZmZlcl9zaXplOworCisJYnVmZmVyX3NpemUgPSBiaW5kZXJfYnVmZmVyX3NpemUocHJvYywgYnVmZmVyKTsKKworCXNpemUgPSBBTElHTihidWZmZXItPmRhdGFfc2l6ZSwgc2l6ZW9mKHZvaWQgKikpICsKKwkJQUxJR04oYnVmZmVyLT5vZmZzZXRzX3NpemUsIHNpemVvZih2b2lkICopKTsKKwlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfQlVGRkVSX0FMTE9DKQorCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiBiaW5kZXJfZnJlZV9idWYgJXAgc2l6ZSAlemQgYnVmZmVyIgorCQkgICAgICAgIl9zaXplICV6ZFxuIiwgcHJvYy0+cGlkLCBidWZmZXIsIHNpemUsIGJ1ZmZlcl9zaXplKTsKKworCUJVR19PTihidWZmZXItPmZyZWUpOworCUJVR19PTihzaXplID4gYnVmZmVyX3NpemUpOworCUJVR19PTihidWZmZXItPnRyYW5zYWN0aW9uICE9IE5VTEwpOworCUJVR19PTigodm9pZCAqKWJ1ZmZlciA8IHByb2MtPmJ1ZmZlcik7CisJQlVHX09OKCh2b2lkICopYnVmZmVyID4gcHJvYy0+YnVmZmVyICsgcHJvYy0+YnVmZmVyX3NpemUpOworCisJaWYgKGJ1ZmZlci0+YXN5bmNfdHJhbnNhY3Rpb24pIHsKKwkJcHJvYy0+ZnJlZV9hc3luY19zcGFjZSArPSBzaXplICsgc2l6ZW9mKHN0cnVjdCBiaW5kZXJfYnVmZmVyKTsKKwkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQ19BU1lOQykKKwkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6IGJpbmRlcl9mcmVlX2J1ZiBzaXplICV6ZCAiCisJCQkgICAgICAgImFzeW5jIGZyZWUgJXpkXG4iLCBwcm9jLT5waWQsIHNpemUsCisJCQkgICAgICAgcHJvYy0+ZnJlZV9hc3luY19zcGFjZSk7CisJfQorCisJYmluZGVyX3VwZGF0ZV9wYWdlX3JhbmdlKHByb2MsIDAsCisJCSh2b2lkICopUEFHRV9BTElHTigoc2l6ZV90KWJ1ZmZlci0+ZGF0YSksCisJCSh2b2lkICopKCgoc2l6ZV90KWJ1ZmZlci0+ZGF0YSArIGJ1ZmZlcl9zaXplKSAmIFBBR0VfTUFTSyksCisJCU5VTEwpOworCXJiX2VyYXNlKCZidWZmZXItPnJiX25vZGUsICZwcm9jLT5hbGxvY2F0ZWRfYnVmZmVycyk7CisJYnVmZmVyLT5mcmVlID0gMTsKKwlpZiAoIWxpc3RfaXNfbGFzdCgmYnVmZmVyLT5lbnRyeSwgJnByb2MtPmJ1ZmZlcnMpKSB7CisJCXN0cnVjdCBiaW5kZXJfYnVmZmVyICpuZXh0ID0gbGlzdF9lbnRyeShidWZmZXItPmVudHJ5Lm5leHQsCisJCQkJCQlzdHJ1Y3QgYmluZGVyX2J1ZmZlciwgZW50cnkpOworCQlpZiAobmV4dC0+ZnJlZSkgeworCQkJcmJfZXJhc2UoJm5leHQtPnJiX25vZGUsICZwcm9jLT5mcmVlX2J1ZmZlcnMpOworCQkJYmluZGVyX2RlbGV0ZV9mcmVlX2J1ZmZlcihwcm9jLCBuZXh0KTsKKwkJfQorCX0KKwlpZiAocHJvYy0+YnVmZmVycy5uZXh0ICE9ICZidWZmZXItPmVudHJ5KSB7CisJCXN0cnVjdCBiaW5kZXJfYnVmZmVyICpwcmV2ID0gbGlzdF9lbnRyeShidWZmZXItPmVudHJ5LnByZXYsCisJCQkJCQlzdHJ1Y3QgYmluZGVyX2J1ZmZlciwgZW50cnkpOworCQlpZiAocHJldi0+ZnJlZSkgeworCQkJYmluZGVyX2RlbGV0ZV9mcmVlX2J1ZmZlcihwcm9jLCBidWZmZXIpOworCQkJcmJfZXJhc2UoJnByZXYtPnJiX25vZGUsICZwcm9jLT5mcmVlX2J1ZmZlcnMpOworCQkJYnVmZmVyID0gcHJldjsKKwkJfQorCX0KKwliaW5kZXJfaW5zZXJ0X2ZyZWVfYnVmZmVyKHByb2MsIGJ1ZmZlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmluZGVyX25vZGUgKgorYmluZGVyX2dldF9ub2RlKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgdm9pZCBfX3VzZXIgKnB0cikKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbiA9IHByb2MtPm5vZGVzLnJiX25vZGU7CisJc3RydWN0IGJpbmRlcl9ub2RlICpub2RlOworCisJd2hpbGUgKG4pIHsKKwkJbm9kZSA9IHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfbm9kZSwgcmJfbm9kZSk7CisKKwkJaWYgKHB0ciA8IG5vZGUtPnB0cikKKwkJCW4gPSBuLT5yYl9sZWZ0OworCQllbHNlIGlmIChwdHIgPiBub2RlLT5wdHIpCisJCQluID0gbi0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCXJldHVybiBub2RlOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBiaW5kZXJfbm9kZSAqCitiaW5kZXJfbmV3X25vZGUoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLCB2b2lkIF9fdXNlciAqcHRyLCB2b2lkIF9fdXNlciAqY29va2llKQoreworCXN0cnVjdCByYl9ub2RlICoqcCA9ICZwcm9jLT5ub2Rlcy5yYl9ub2RlOworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOworCXN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZTsKKworCXdoaWxlICgqcCkgeworCQlwYXJlbnQgPSAqcDsKKwkJbm9kZSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGJpbmRlcl9ub2RlLCByYl9ub2RlKTsKKworCQlpZiAocHRyIDwgbm9kZS0+cHRyKQorCQkJcCA9ICYoKnApLT5yYl9sZWZ0OworCQllbHNlIGlmIChwdHIgPiBub2RlLT5wdHIpCisJCQlwID0gJigqcCktPnJiX3JpZ2h0OworCQllbHNlCisJCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlub2RlID0ga3phbGxvYyhzaXplb2YoKm5vZGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAobm9kZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwliaW5kZXJfc3RhdHMub2JqX2NyZWF0ZWRbQklOREVSX1NUQVRfTk9ERV0rKzsKKwlyYl9saW5rX25vZGUoJm5vZGUtPnJiX25vZGUsIHBhcmVudCwgcCk7CisJcmJfaW5zZXJ0X2NvbG9yKCZub2RlLT5yYl9ub2RlLCAmcHJvYy0+bm9kZXMpOworCW5vZGUtPmRlYnVnX2lkID0gKytiaW5kZXJfbGFzdF9pZDsKKwlub2RlLT5wcm9jID0gcHJvYzsKKwlub2RlLT5wdHIgPSBwdHI7CisJbm9kZS0+Y29va2llID0gY29va2llOworCW5vZGUtPndvcmsudHlwZSA9IEJJTkRFUl9XT1JLX05PREU7CisJSU5JVF9MSVNUX0hFQUQoJm5vZGUtPndvcmsuZW50cnkpOworCUlOSVRfTElTVF9IRUFEKCZub2RlLT5hc3luY190b2RvKTsKKwlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfSU5URVJOQUxfUkVGUykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDolZCBub2RlICVkIHUlcCBjJXAgY3JlYXRlZFxuIiwKKwkJICAgICAgIHByb2MtPnBpZCwgY3VycmVudC0+cGlkLCBub2RlLT5kZWJ1Z19pZCwKKwkJICAgICAgIG5vZGUtPnB0ciwgbm9kZS0+Y29va2llKTsKKwlyZXR1cm4gbm9kZTsKK30KKworc3RhdGljIGludAorYmluZGVyX2luY19ub2RlKHN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZSwgaW50IHN0cm9uZywgaW50IGludGVybmFsLAorCQlzdHJ1Y3QgbGlzdF9oZWFkICp0YXJnZXRfbGlzdCkKK3sKKwlpZiAoc3Ryb25nKSB7CisJCWlmIChpbnRlcm5hbCkgeworCQkJaWYgKHRhcmdldF9saXN0ID09IE5VTEwgJiYKKwkJCSAgICBub2RlLT5pbnRlcm5hbF9zdHJvbmdfcmVmcyA9PSAwICYmCisJCQkgICAgIShub2RlID09IGJpbmRlcl9jb250ZXh0X21ncl9ub2RlICYmCisJCQkgICAgbm9kZS0+aGFzX3N0cm9uZ19yZWYpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6IGludmFsaWQgaW5jIHN0cm9uZyAiCisJCQkJCSJub2RlIGZvciAlZFxuIiwgbm9kZS0+ZGVidWdfaWQpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJbm9kZS0+aW50ZXJuYWxfc3Ryb25nX3JlZnMrKzsKKwkJfSBlbHNlCisJCQlub2RlLT5sb2NhbF9zdHJvbmdfcmVmcysrOworCQlpZiAoIW5vZGUtPmhhc19zdHJvbmdfcmVmICYmIHRhcmdldF9saXN0KSB7CisJCQlsaXN0X2RlbF9pbml0KCZub2RlLT53b3JrLmVudHJ5KTsKKwkJCWxpc3RfYWRkX3RhaWwoJm5vZGUtPndvcmsuZW50cnksIHRhcmdldF9saXN0KTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICghaW50ZXJuYWwpCisJCQlub2RlLT5sb2NhbF93ZWFrX3JlZnMrKzsKKwkJaWYgKCFub2RlLT5oYXNfd2Vha19yZWYgJiYgbGlzdF9lbXB0eSgmbm9kZS0+d29yay5lbnRyeSkpIHsKKwkJCWlmICh0YXJnZXRfbGlzdCA9PSBOVUxMKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6IGludmFsaWQgaW5jIHdlYWsgbm9kZSAiCisJCQkJCSJmb3IgJWRcbiIsIG5vZGUtPmRlYnVnX2lkKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWxpc3RfYWRkX3RhaWwoJm5vZGUtPndvcmsuZW50cnksIHRhcmdldF9saXN0KTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYmluZGVyX2RlY19ub2RlKHN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZSwgaW50IHN0cm9uZywgaW50IGludGVybmFsKQoreworCWlmIChzdHJvbmcpIHsKKwkJaWYgKGludGVybmFsKQorCQkJbm9kZS0+aW50ZXJuYWxfc3Ryb25nX3JlZnMtLTsKKwkJZWxzZQorCQkJbm9kZS0+bG9jYWxfc3Ryb25nX3JlZnMtLTsKKwkJaWYgKG5vZGUtPmxvY2FsX3N0cm9uZ19yZWZzIHx8IG5vZGUtPmludGVybmFsX3N0cm9uZ19yZWZzKQorCQkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJaWYgKCFpbnRlcm5hbCkKKwkJCW5vZGUtPmxvY2FsX3dlYWtfcmVmcy0tOworCQlpZiAobm9kZS0+bG9jYWxfd2Vha19yZWZzIHx8ICFobGlzdF9lbXB0eSgmbm9kZS0+cmVmcykpCisJCQlyZXR1cm4gMDsKKwl9CisJaWYgKG5vZGUtPnByb2MgJiYgKG5vZGUtPmhhc19zdHJvbmdfcmVmIHx8IG5vZGUtPmhhc193ZWFrX3JlZikpIHsKKwkJaWYgKGxpc3RfZW1wdHkoJm5vZGUtPndvcmsuZW50cnkpKSB7CisJCQlsaXN0X2FkZF90YWlsKCZub2RlLT53b3JrLmVudHJ5LCAmbm9kZS0+cHJvYy0+dG9kbyk7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJm5vZGUtPnByb2MtPndhaXQpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGhsaXN0X2VtcHR5KCZub2RlLT5yZWZzKSAmJiAhbm9kZS0+bG9jYWxfc3Ryb25nX3JlZnMgJiYKKwkJICAgICFub2RlLT5sb2NhbF93ZWFrX3JlZnMpIHsKKwkJCWxpc3RfZGVsX2luaXQoJm5vZGUtPndvcmsuZW50cnkpOworCQkJaWYgKG5vZGUtPnByb2MpIHsKKwkJCQlyYl9lcmFzZSgmbm9kZS0+cmJfbm9kZSwgJm5vZGUtPnByb2MtPm5vZGVzKTsKKwkJCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfSU5URVJOQUxfUkVGUykKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiByZWZsZXNzIG5vZGUgJWQgZGVsZXRlZFxuIiwgbm9kZS0+ZGVidWdfaWQpOworCQkJfSBlbHNlIHsKKwkJCQlobGlzdF9kZWwoJm5vZGUtPmRlYWRfbm9kZSk7CisJCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0lOVEVSTkFMX1JFRlMpCisJCQkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogZGVhZCBub2RlICVkIGRlbGV0ZWRcbiIsIG5vZGUtPmRlYnVnX2lkKTsKKwkJCX0KKwkJCWtmcmVlKG5vZGUpOworCQkJYmluZGVyX3N0YXRzLm9ial9kZWxldGVkW0JJTkRFUl9TVEFUX05PREVdKys7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IGJpbmRlcl9yZWYgKgorYmluZGVyX2dldF9yZWYoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLCB1aW50MzJfdCBkZXNjKQoreworCXN0cnVjdCByYl9ub2RlICpuID0gcHJvYy0+cmVmc19ieV9kZXNjLnJiX25vZGU7CisJc3RydWN0IGJpbmRlcl9yZWYgKnJlZjsKKworCXdoaWxlIChuKSB7CisJCXJlZiA9IHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfcmVmLCByYl9ub2RlX2Rlc2MpOworCisJCWlmIChkZXNjIDwgcmVmLT5kZXNjKQorCQkJbiA9IG4tPnJiX2xlZnQ7CisJCWVsc2UgaWYgKGRlc2MgPiByZWYtPmRlc2MpCisJCQluID0gbi0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCXJldHVybiByZWY7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGJpbmRlcl9yZWYgKgorYmluZGVyX2dldF9yZWZfZm9yX25vZGUoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLCBzdHJ1Y3QgYmluZGVyX25vZGUgKm5vZGUpCit7CisJc3RydWN0IHJiX25vZGUgKm47CisJc3RydWN0IHJiX25vZGUgKipwID0gJnByb2MtPnJlZnNfYnlfbm9kZS5yYl9ub2RlOworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOworCXN0cnVjdCBiaW5kZXJfcmVmICpyZWYsICpuZXdfcmVmOworCisJd2hpbGUgKCpwKSB7CisJCXBhcmVudCA9ICpwOworCQlyZWYgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBiaW5kZXJfcmVmLCByYl9ub2RlX25vZGUpOworCisJCWlmIChub2RlIDwgcmVmLT5ub2RlKQorCQkJcCA9ICYoKnApLT5yYl9sZWZ0OworCQllbHNlIGlmIChub2RlID4gcmVmLT5ub2RlKQorCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKKwkJZWxzZQorCQkJcmV0dXJuIHJlZjsKKwl9CisJbmV3X3JlZiA9IGt6YWxsb2Moc2l6ZW9mKCpyZWYpLCBHRlBfS0VSTkVMKTsKKwlpZiAobmV3X3JlZiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwliaW5kZXJfc3RhdHMub2JqX2NyZWF0ZWRbQklOREVSX1NUQVRfUkVGXSsrOworCW5ld19yZWYtPmRlYnVnX2lkID0gKytiaW5kZXJfbGFzdF9pZDsKKwluZXdfcmVmLT5wcm9jID0gcHJvYzsKKwluZXdfcmVmLT5ub2RlID0gbm9kZTsKKwlyYl9saW5rX25vZGUoJm5ld19yZWYtPnJiX25vZGVfbm9kZSwgcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJm5ld19yZWYtPnJiX25vZGVfbm9kZSwgJnByb2MtPnJlZnNfYnlfbm9kZSk7CisKKwluZXdfcmVmLT5kZXNjID0gKG5vZGUgPT0gYmluZGVyX2NvbnRleHRfbWdyX25vZGUpID8gMCA6IDE7CisJZm9yIChuID0gcmJfZmlyc3QoJnByb2MtPnJlZnNfYnlfZGVzYyk7IG4gIT0gTlVMTDsgbiA9IHJiX25leHQobikpIHsKKwkJcmVmID0gcmJfZW50cnkobiwgc3RydWN0IGJpbmRlcl9yZWYsIHJiX25vZGVfZGVzYyk7CisJCWlmIChyZWYtPmRlc2MgPiBuZXdfcmVmLT5kZXNjKQorCQkJYnJlYWs7CisJCW5ld19yZWYtPmRlc2MgPSByZWYtPmRlc2MgKyAxOworCX0KKworCXAgPSAmcHJvYy0+cmVmc19ieV9kZXNjLnJiX25vZGU7CisJd2hpbGUgKCpwKSB7CisJCXBhcmVudCA9ICpwOworCQlyZWYgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBiaW5kZXJfcmVmLCByYl9ub2RlX2Rlc2MpOworCisJCWlmIChuZXdfcmVmLT5kZXNjIDwgcmVmLT5kZXNjKQorCQkJcCA9ICYoKnApLT5yYl9sZWZ0OworCQllbHNlIGlmIChuZXdfcmVmLT5kZXNjID4gcmVmLT5kZXNjKQorCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKKwkJZWxzZQorCQkJQlVHKCk7CisJfQorCXJiX2xpbmtfbm9kZSgmbmV3X3JlZi0+cmJfbm9kZV9kZXNjLCBwYXJlbnQsIHApOworCXJiX2luc2VydF9jb2xvcigmbmV3X3JlZi0+cmJfbm9kZV9kZXNjLCAmcHJvYy0+cmVmc19ieV9kZXNjKTsKKwlpZiAobm9kZSkgeworCQlobGlzdF9hZGRfaGVhZCgmbmV3X3JlZi0+bm9kZV9lbnRyeSwgJm5vZGUtPnJlZnMpOworCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfSU5URVJOQUxfUkVGUykKKwkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQgbmV3IHJlZiAlZCBkZXNjICVkIGZvciAiCisJCQkJIm5vZGUgJWRcbiIsIHByb2MtPnBpZCwgbmV3X3JlZi0+ZGVidWdfaWQsCisJCQkJbmV3X3JlZi0+ZGVzYywgbm9kZS0+ZGVidWdfaWQpOworCX0gZWxzZSB7CisJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19JTlRFUk5BTF9SRUZTKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZCBuZXcgcmVmICVkIGRlc2MgJWQgZm9yICIKKwkJCQkiZGVhZCBub2RlXG4iLCBwcm9jLT5waWQsIG5ld19yZWYtPmRlYnVnX2lkLAorCQkJCW5ld19yZWYtPmRlc2MpOworCX0KKwlyZXR1cm4gbmV3X3JlZjsKK30KKworc3RhdGljIHZvaWQKK2JpbmRlcl9kZWxldGVfcmVmKHN0cnVjdCBiaW5kZXJfcmVmICpyZWYpCit7CisJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0lOVEVSTkFMX1JFRlMpCisJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQgZGVsZXRlIHJlZiAlZCBkZXNjICVkIGZvciAiCisJCQkibm9kZSAlZFxuIiwgcmVmLT5wcm9jLT5waWQsIHJlZi0+ZGVidWdfaWQsCisJCQlyZWYtPmRlc2MsIHJlZi0+bm9kZS0+ZGVidWdfaWQpOworCXJiX2VyYXNlKCZyZWYtPnJiX25vZGVfZGVzYywgJnJlZi0+cHJvYy0+cmVmc19ieV9kZXNjKTsKKwlyYl9lcmFzZSgmcmVmLT5yYl9ub2RlX25vZGUsICZyZWYtPnByb2MtPnJlZnNfYnlfbm9kZSk7CisJaWYgKHJlZi0+c3Ryb25nKQorCQliaW5kZXJfZGVjX25vZGUocmVmLT5ub2RlLCAxLCAxKTsKKwlobGlzdF9kZWwoJnJlZi0+bm9kZV9lbnRyeSk7CisJYmluZGVyX2RlY19ub2RlKHJlZi0+bm9kZSwgMCwgMSk7CisJaWYgKHJlZi0+ZGVhdGgpIHsKKwkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0RFQURfQklOREVSKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZCBkZWxldGUgcmVmICVkIGRlc2MgJWQgIgorCQkJCSJoYXMgZGVhdGggbm90aWZpY2F0aW9uXG4iLCByZWYtPnByb2MtPnBpZCwKKwkJCQlyZWYtPmRlYnVnX2lkLCByZWYtPmRlc2MpOworCQlsaXN0X2RlbCgmcmVmLT5kZWF0aC0+d29yay5lbnRyeSk7CisJCWtmcmVlKHJlZi0+ZGVhdGgpOworCQliaW5kZXJfc3RhdHMub2JqX2RlbGV0ZWRbQklOREVSX1NUQVRfREVBVEhdKys7CisJfQorCWtmcmVlKHJlZik7CisJYmluZGVyX3N0YXRzLm9ial9kZWxldGVkW0JJTkRFUl9TVEFUX1JFRl0rKzsKK30KKworc3RhdGljIGludAorYmluZGVyX2luY19yZWYoCisJc3RydWN0IGJpbmRlcl9yZWYgKnJlZiwgaW50IHN0cm9uZywgc3RydWN0IGxpc3RfaGVhZCAqdGFyZ2V0X2xpc3QpCit7CisJaW50IHJldDsKKwlpZiAoc3Ryb25nKSB7CisJCWlmIChyZWYtPnN0cm9uZyA9PSAwKSB7CisJCQlyZXQgPSBiaW5kZXJfaW5jX25vZGUocmVmLT5ub2RlLCAxLCAxLCB0YXJnZXRfbGlzdCk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCX0KKwkJcmVmLT5zdHJvbmcrKzsKKwl9IGVsc2UgeworCQlpZiAocmVmLT53ZWFrID09IDApIHsKKwkJCXJldCA9IGJpbmRlcl9pbmNfbm9kZShyZWYtPm5vZGUsIDAsIDEsIHRhcmdldF9saXN0KTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCQlyZWYtPndlYWsrKzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAorYmluZGVyX2RlY19yZWYoc3RydWN0IGJpbmRlcl9yZWYgKnJlZiwgaW50IHN0cm9uZykKK3sKKwlpZiAoc3Ryb25nKSB7CisJCWlmIChyZWYtPnN0cm9uZyA9PSAwKSB7CisJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZCBpbnZhbGlkIGRlYyBzdHJvbmcsICIKKwkJCQkJICAicmVmICVkIGRlc2MgJWQgcyAlZCB3ICVkXG4iLAorCQkJCQkgIHJlZi0+cHJvYy0+cGlkLCByZWYtPmRlYnVnX2lkLAorCQkJCQkgIHJlZi0+ZGVzYywgcmVmLT5zdHJvbmcsIHJlZi0+d2Vhayk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlyZWYtPnN0cm9uZy0tOworCQlpZiAocmVmLT5zdHJvbmcgPT0gMCkgeworCQkJaW50IHJldDsKKwkJCXJldCA9IGJpbmRlcl9kZWNfbm9kZShyZWYtPm5vZGUsIHN0cm9uZywgMSk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCX0KKwl9IGVsc2UgeworCQlpZiAocmVmLT53ZWFrID09IDApIHsKKwkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkIGludmFsaWQgZGVjIHdlYWssICIKKwkJCQkJICAicmVmICVkIGRlc2MgJWQgcyAlZCB3ICVkXG4iLAorCQkJCQkgIHJlZi0+cHJvYy0+cGlkLCByZWYtPmRlYnVnX2lkLAorCQkJCQkgIHJlZi0+ZGVzYywgcmVmLT5zdHJvbmcsIHJlZi0+d2Vhayk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlyZWYtPndlYWstLTsKKwl9CisJaWYgKHJlZi0+c3Ryb25nID09IDAgJiYgcmVmLT53ZWFrID09IDApCisJCWJpbmRlcl9kZWxldGVfcmVmKHJlZik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitiaW5kZXJfcG9wX3RyYW5zYWN0aW9uKAorCXN0cnVjdCBiaW5kZXJfdGhyZWFkICp0YXJnZXRfdGhyZWFkLCBzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICp0KQoreworCWlmICh0YXJnZXRfdGhyZWFkKSB7CisJCUJVR19PTih0YXJnZXRfdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjayAhPSB0KTsKKwkJQlVHX09OKHRhcmdldF90aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrLT5mcm9tICE9IHRhcmdldF90aHJlYWQpOworCQl0YXJnZXRfdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjayA9CisJCQl0YXJnZXRfdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjay0+ZnJvbV9wYXJlbnQ7CisJCXQtPmZyb20gPSBOVUxMOworCX0KKwl0LT5uZWVkX3JlcGx5ID0gMDsKKwlpZiAodC0+YnVmZmVyKQorCQl0LT5idWZmZXItPnRyYW5zYWN0aW9uID0gTlVMTDsKKwlrZnJlZSh0KTsKKwliaW5kZXJfc3RhdHMub2JqX2RlbGV0ZWRbQklOREVSX1NUQVRfVFJBTlNBQ1RJT05dKys7Cit9CisKK3N0YXRpYyB2b2lkCitiaW5kZXJfc2VuZF9mYWlsZWRfcmVwbHkoc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdCwgdWludDMyX3QgZXJyb3JfY29kZSkKK3sKKwlzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGFyZ2V0X3RocmVhZDsKKwlCVUdfT04odC0+ZmxhZ3MgJiBURl9PTkVfV0FZKTsKKwl3aGlsZSAoMSkgeworCQl0YXJnZXRfdGhyZWFkID0gdC0+ZnJvbTsKKwkJaWYgKHRhcmdldF90aHJlYWQpIHsKKwkJCWlmICh0YXJnZXRfdGhyZWFkLT5yZXR1cm5fZXJyb3IgIT0gQlJfT0sgJiYKKwkJCSAgIHRhcmdldF90aHJlYWQtPnJldHVybl9lcnJvcjIgPT0gQlJfT0spIHsKKwkJCQl0YXJnZXRfdGhyZWFkLT5yZXR1cm5fZXJyb3IyID0KKwkJCQkJdGFyZ2V0X3RocmVhZC0+cmV0dXJuX2Vycm9yOworCQkJCXRhcmdldF90aHJlYWQtPnJldHVybl9lcnJvciA9IEJSX09LOworCQkJfQorCQkJaWYgKHRhcmdldF90aHJlYWQtPnJldHVybl9lcnJvciA9PSBCUl9PSykgeworCQkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19GQUlMRURfVFJBTlNBQ1RJT04pCisJCQkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogc2VuZCBmYWlsZWQgcmVwbHkgZm9yIHRyYW5zYWN0aW9uICVkIHRvICVkOiVkXG4iLAorCQkJCQkgICAgICAgdC0+ZGVidWdfaWQsIHRhcmdldF90aHJlYWQtPnByb2MtPnBpZCwgdGFyZ2V0X3RocmVhZC0+cGlkKTsKKworCQkJCWJpbmRlcl9wb3BfdHJhbnNhY3Rpb24odGFyZ2V0X3RocmVhZCwgdCk7CisJCQkJdGFyZ2V0X3RocmVhZC0+cmV0dXJuX2Vycm9yID0gZXJyb3JfY29kZTsKKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnRhcmdldF90aHJlYWQtPndhaXQpOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogcmVwbHkgZmFpbGVkLCB0YXJnZXQgIgorCQkJCQkidGhyZWFkLCAlZDolZCwgaGFzIGVycm9yIGNvZGUgJWQgIgorCQkJCQkiYWxyZWFkeVxuIiwgdGFyZ2V0X3RocmVhZC0+cHJvYy0+cGlkLAorCQkJCQl0YXJnZXRfdGhyZWFkLT5waWQsCisJCQkJCXRhcmdldF90aHJlYWQtPnJldHVybl9lcnJvcik7CisJCQl9CisJCQlyZXR1cm47CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICpuZXh0ID0gdC0+ZnJvbV9wYXJlbnQ7CisKKwkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19GQUlMRURfVFJBTlNBQ1RJT04pCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiBzZW5kIGZhaWxlZCByZXBseSAiCisJCQkJCSJmb3IgdHJhbnNhY3Rpb24gJWQsIHRhcmdldCBkZWFkXG4iLAorCQkJCQl0LT5kZWJ1Z19pZCk7CisKKwkJCWJpbmRlcl9wb3BfdHJhbnNhY3Rpb24odGFyZ2V0X3RocmVhZCwgdCk7CisJCQlpZiAobmV4dCA9PSBOVUxMKSB7CisJCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0RFQURfQklOREVSKQorCQkJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6IHJlcGx5IGZhaWxlZCwiCisJCQkJCQkiIG5vIHRhcmdldCB0aHJlYWQgYXQgcm9vdFxuIik7CisJCQkJcmV0dXJuOworCQkJfQorCQkJdCA9IG5leHQ7CisJCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfREVBRF9CSU5ERVIpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiByZXBseSBmYWlsZWQsIG5vIHRhcmciCisJCQkJCSJldCB0aHJlYWQgLS0gcmV0cnkgJWRcbiIsIHQtPmRlYnVnX2lkKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQKK2JpbmRlcl90cmFuc2FjdGlvbl9idWZmZXJfcmVsZWFzZShzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsCisJCQlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyLCBzaXplX3QgKmZhaWxlZF9hdCk7CisKK3N0YXRpYyB2b2lkCitiaW5kZXJfdHJhbnNhY3Rpb24oc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLCBzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGhyZWFkLAorCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSAqdHIsIGludCByZXBseSkKK3sKKwlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICp0OworCXN0cnVjdCBiaW5kZXJfd29yayAqdGNvbXBsZXRlOworCXNpemVfdCAqb2ZmcCwgKm9mZl9lbmQ7CisJc3RydWN0IGJpbmRlcl9wcm9jICp0YXJnZXRfcHJvYzsKKwlzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGFyZ2V0X3RocmVhZCA9IE5VTEw7CisJc3RydWN0IGJpbmRlcl9ub2RlICp0YXJnZXRfbm9kZSA9IE5VTEw7CisJc3RydWN0IGxpc3RfaGVhZCAqdGFyZ2V0X2xpc3Q7CisJd2FpdF9xdWV1ZV9oZWFkX3QgKnRhcmdldF93YWl0OworCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKmluX3JlcGx5X3RvID0gTlVMTDsKKwlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2xvZ19lbnRyeSAqZTsKKwl1aW50MzJfdCByZXR1cm5fZXJyb3I7CisKKwllID0gYmluZGVyX3RyYW5zYWN0aW9uX2xvZ19hZGQoJmJpbmRlcl90cmFuc2FjdGlvbl9sb2cpOworCWUtPmNhbGxfdHlwZSA9IHJlcGx5ID8gMiA6ICEhKHRyLT5mbGFncyAmIFRGX09ORV9XQVkpOworCWUtPmZyb21fcHJvYyA9IHByb2MtPnBpZDsKKwllLT5mcm9tX3RocmVhZCA9IHRocmVhZC0+cGlkOworCWUtPnRhcmdldF9oYW5kbGUgPSB0ci0+dGFyZ2V0LmhhbmRsZTsKKwllLT5kYXRhX3NpemUgPSB0ci0+ZGF0YV9zaXplOworCWUtPm9mZnNldHNfc2l6ZSA9IHRyLT5vZmZzZXRzX3NpemU7CisKKwlpZiAocmVwbHkpIHsKKwkJaW5fcmVwbHlfdG8gPSB0aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrOworCQlpZiAoaW5fcmVwbHlfdG8gPT0gTlVMTCkgeworCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgZ290IHJlcGx5IHRyYW5zYWN0aW9uICIKKwkJCQkJICAid2l0aCBubyB0cmFuc2FjdGlvbiBzdGFja1xuIiwKKwkJCQkJICBwcm9jLT5waWQsIHRocmVhZC0+cGlkKTsKKwkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKKwkJCWdvdG8gZXJyX2VtcHR5X2NhbGxfc3RhY2s7CisJCX0KKwkJYmluZGVyX3NldF9uaWNlKGluX3JlcGx5X3RvLT5zYXZlZF9wcmlvcml0eSk7CisJCWlmIChpbl9yZXBseV90by0+dG9fdGhyZWFkICE9IHRocmVhZCkgeworCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgZ290IHJlcGx5IHRyYW5zYWN0aW9uICIKKwkJCQkid2l0aCBiYWQgdHJhbnNhY3Rpb24gc3RhY2ssIgorCQkJCSIgdHJhbnNhY3Rpb24gJWQgaGFzIHRhcmdldCAlZDolZFxuIiwKKwkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBpbl9yZXBseV90by0+ZGVidWdfaWQsCisJCQkJaW5fcmVwbHlfdG8tPnRvX3Byb2MgPworCQkJCWluX3JlcGx5X3RvLT50b19wcm9jLT5waWQgOiAwLAorCQkJCWluX3JlcGx5X3RvLT50b190aHJlYWQgPworCQkJCWluX3JlcGx5X3RvLT50b190aHJlYWQtPnBpZCA6IDApOworCQkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOworCQkJaW5fcmVwbHlfdG8gPSBOVUxMOworCQkJZ290byBlcnJfYmFkX2NhbGxfc3RhY2s7CisJCX0KKwkJdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjayA9IGluX3JlcGx5X3RvLT50b19wYXJlbnQ7CisJCXRhcmdldF90aHJlYWQgPSBpbl9yZXBseV90by0+ZnJvbTsKKwkJaWYgKHRhcmdldF90aHJlYWQgPT0gTlVMTCkgeworCQkJcmV0dXJuX2Vycm9yID0gQlJfREVBRF9SRVBMWTsKKwkJCWdvdG8gZXJyX2RlYWRfYmluZGVyOworCQl9CisJCWlmICh0YXJnZXRfdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjayAhPSBpbl9yZXBseV90bykgeworCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgZ290IHJlcGx5IHRyYW5zYWN0aW9uICIKKwkJCQkid2l0aCBiYWQgdGFyZ2V0IHRyYW5zYWN0aW9uIHN0YWNrICVkLCAiCisJCQkJImV4cGVjdGVkICVkXG4iLAorCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsCisJCQkJdGFyZ2V0X3RocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2sgPworCQkJCXRhcmdldF90aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrLT5kZWJ1Z19pZCA6IDAsCisJCQkJaW5fcmVwbHlfdG8tPmRlYnVnX2lkKTsKKwkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKKwkJCWluX3JlcGx5X3RvID0gTlVMTDsKKwkJCXRhcmdldF90aHJlYWQgPSBOVUxMOworCQkJZ290byBlcnJfZGVhZF9iaW5kZXI7CisJCX0KKwkJdGFyZ2V0X3Byb2MgPSB0YXJnZXRfdGhyZWFkLT5wcm9jOworCX0gZWxzZSB7CisJCWlmICh0ci0+dGFyZ2V0LmhhbmRsZSkgeworCQkJc3RydWN0IGJpbmRlcl9yZWYgKnJlZjsKKwkJCXJlZiA9IGJpbmRlcl9nZXRfcmVmKHByb2MsIHRyLT50YXJnZXQuaGFuZGxlKTsKKwkJCWlmIChyZWYgPT0gTlVMTCkgeworCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIGdvdCAiCisJCQkJCSJ0cmFuc2FjdGlvbiB0byBpbnZhbGlkIGhhbmRsZVxuIiwKKwkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7CisJCQkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOworCQkJCWdvdG8gZXJyX2ludmFsaWRfdGFyZ2V0X2hhbmRsZTsKKwkJCX0KKwkJCXRhcmdldF9ub2RlID0gcmVmLT5ub2RlOworCQl9IGVsc2UgeworCQkJdGFyZ2V0X25vZGUgPSBiaW5kZXJfY29udGV4dF9tZ3Jfbm9kZTsKKwkJCWlmICh0YXJnZXRfbm9kZSA9PSBOVUxMKSB7CisJCQkJcmV0dXJuX2Vycm9yID0gQlJfREVBRF9SRVBMWTsKKwkJCQlnb3RvIGVycl9ub19jb250ZXh0X21ncl9ub2RlOworCQkJfQorCQl9CisJCWUtPnRvX25vZGUgPSB0YXJnZXRfbm9kZS0+ZGVidWdfaWQ7CisJCXRhcmdldF9wcm9jID0gdGFyZ2V0X25vZGUtPnByb2M7CisJCWlmICh0YXJnZXRfcHJvYyA9PSBOVUxMKSB7CisJCQlyZXR1cm5fZXJyb3IgPSBCUl9ERUFEX1JFUExZOworCQkJZ290byBlcnJfZGVhZF9iaW5kZXI7CisJCX0KKwkJaWYgKCEodHItPmZsYWdzICYgVEZfT05FX1dBWSkgJiYgdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjaykgeworCQkJc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdG1wOworCQkJdG1wID0gdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjazsKKwkJCXdoaWxlICh0bXApIHsKKwkJCQlpZiAodG1wLT5mcm9tICYmIHRtcC0+ZnJvbS0+cHJvYyA9PSB0YXJnZXRfcHJvYykKKwkJCQkJdGFyZ2V0X3RocmVhZCA9IHRtcC0+ZnJvbTsKKwkJCQl0bXAgPSB0bXAtPmZyb21fcGFyZW50OworCQkJfQorCQl9CisJfQorCWlmICh0YXJnZXRfdGhyZWFkKSB7CisJCWUtPnRvX3RocmVhZCA9IHRhcmdldF90aHJlYWQtPnBpZDsKKwkJdGFyZ2V0X2xpc3QgPSAmdGFyZ2V0X3RocmVhZC0+dG9kbzsKKwkJdGFyZ2V0X3dhaXQgPSAmdGFyZ2V0X3RocmVhZC0+d2FpdDsKKwl9IGVsc2UgeworCQl0YXJnZXRfbGlzdCA9ICZ0YXJnZXRfcHJvYy0+dG9kbzsKKwkJdGFyZ2V0X3dhaXQgPSAmdGFyZ2V0X3Byb2MtPndhaXQ7CisJfQorCWUtPnRvX3Byb2MgPSB0YXJnZXRfcHJvYy0+cGlkOworCisJLyogVE9ETzogcmV1c2UgaW5jb21pbmcgdHJhbnNhY3Rpb24gZm9yIHJlcGx5ICovCisJdCA9IGt6YWxsb2Moc2l6ZW9mKCp0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHQgPT0gTlVMTCkgeworCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7CisJCWdvdG8gZXJyX2FsbG9jX3RfZmFpbGVkOworCX0KKwliaW5kZXJfc3RhdHMub2JqX2NyZWF0ZWRbQklOREVSX1NUQVRfVFJBTlNBQ1RJT05dKys7CisKKwl0Y29tcGxldGUgPSBremFsbG9jKHNpemVvZigqdGNvbXBsZXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHRjb21wbGV0ZSA9PSBOVUxMKSB7CisJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKKwkJZ290byBlcnJfYWxsb2NfdGNvbXBsZXRlX2ZhaWxlZDsKKwl9CisJYmluZGVyX3N0YXRzLm9ial9jcmVhdGVkW0JJTkRFUl9TVEFUX1RSQU5TQUNUSU9OX0NPTVBMRVRFXSsrOworCisJdC0+ZGVidWdfaWQgPSArK2JpbmRlcl9sYXN0X2lkOworCWUtPmRlYnVnX2lkID0gdC0+ZGVidWdfaWQ7CisKKwlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT04pIHsKKwkJaWYgKHJlcGx5KQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDolZCBCQ19SRVBMWSAlZCAtPiAlZDolZCwgIgorCQkJICAgICAgICJkYXRhICVwLSVwIHNpemUgJXpkLSV6ZFxuIiwKKwkJCSAgICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCB0LT5kZWJ1Z19pZCwKKwkJCSAgICAgICB0YXJnZXRfcHJvYy0+cGlkLCB0YXJnZXRfdGhyZWFkLT5waWQsCisJCQkgICAgICAgdHItPmRhdGEucHRyLmJ1ZmZlciwgdHItPmRhdGEucHRyLm9mZnNldHMsCisJCQkgICAgICAgdHItPmRhdGFfc2l6ZSwgdHItPm9mZnNldHNfc2l6ZSk7CisJCWVsc2UKKwkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6JWQgQkNfVFJBTlNBQ1RJT04gJWQgLT4gIgorCQkJICAgICAgICIlZCAtIG5vZGUgJWQsIGRhdGEgJXAtJXAgc2l6ZSAlemQtJXpkXG4iLAorCQkJICAgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIHQtPmRlYnVnX2lkLAorCQkJICAgICAgIHRhcmdldF9wcm9jLT5waWQsIHRhcmdldF9ub2RlLT5kZWJ1Z19pZCwKKwkJCSAgICAgICB0ci0+ZGF0YS5wdHIuYnVmZmVyLCB0ci0+ZGF0YS5wdHIub2Zmc2V0cywKKwkJCSAgICAgICB0ci0+ZGF0YV9zaXplLCB0ci0+b2Zmc2V0c19zaXplKTsKKwl9CisKKwlpZiAoIXJlcGx5ICYmICEodHItPmZsYWdzICYgVEZfT05FX1dBWSkpCisJCXQtPmZyb20gPSB0aHJlYWQ7CisJZWxzZQorCQl0LT5mcm9tID0gTlVMTDsKKwl0LT5zZW5kZXJfZXVpZCA9IHByb2MtPnRzay0+Y3JlZC0+ZXVpZDsKKwl0LT50b19wcm9jID0gdGFyZ2V0X3Byb2M7CisJdC0+dG9fdGhyZWFkID0gdGFyZ2V0X3RocmVhZDsKKwl0LT5jb2RlID0gdHItPmNvZGU7CisJdC0+ZmxhZ3MgPSB0ci0+ZmxhZ3M7CisJdC0+cHJpb3JpdHkgPSB0YXNrX25pY2UoY3VycmVudCk7CisJdC0+YnVmZmVyID0gYmluZGVyX2FsbG9jX2J1Zih0YXJnZXRfcHJvYywgdHItPmRhdGFfc2l6ZSwKKwkJdHItPm9mZnNldHNfc2l6ZSwgIXJlcGx5ICYmICh0LT5mbGFncyAmIFRGX09ORV9XQVkpKTsKKwlpZiAodC0+YnVmZmVyID09IE5VTEwpIHsKKwkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOworCQlnb3RvIGVycl9iaW5kZXJfYWxsb2NfYnVmX2ZhaWxlZDsKKwl9CisJdC0+YnVmZmVyLT5hbGxvd191c2VyX2ZyZWUgPSAwOworCXQtPmJ1ZmZlci0+ZGVidWdfaWQgPSB0LT5kZWJ1Z19pZDsKKwl0LT5idWZmZXItPnRyYW5zYWN0aW9uID0gdDsKKwl0LT5idWZmZXItPnRhcmdldF9ub2RlID0gdGFyZ2V0X25vZGU7CisJaWYgKHRhcmdldF9ub2RlKQorCQliaW5kZXJfaW5jX25vZGUodGFyZ2V0X25vZGUsIDEsIDAsIE5VTEwpOworCisJb2ZmcCA9IChzaXplX3QgKikodC0+YnVmZmVyLT5kYXRhICsgQUxJR04odHItPmRhdGFfc2l6ZSwgc2l6ZW9mKHZvaWQgKikpKTsKKworCWlmIChjb3B5X2Zyb21fdXNlcih0LT5idWZmZXItPmRhdGEsIHRyLT5kYXRhLnB0ci5idWZmZXIsIHRyLT5kYXRhX3NpemUpKSB7CisJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIGdvdCB0cmFuc2FjdGlvbiB3aXRoIGludmFsaWQgIgorCQkJImRhdGEgcHRyXG4iLCBwcm9jLT5waWQsIHRocmVhZC0+cGlkKTsKKwkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOworCQlnb3RvIGVycl9jb3B5X2RhdGFfZmFpbGVkOworCX0KKwlpZiAoY29weV9mcm9tX3VzZXIob2ZmcCwgdHItPmRhdGEucHRyLm9mZnNldHMsIHRyLT5vZmZzZXRzX3NpemUpKSB7CisJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIGdvdCB0cmFuc2FjdGlvbiB3aXRoIGludmFsaWQgIgorCQkJIm9mZnNldHMgcHRyXG4iLCBwcm9jLT5waWQsIHRocmVhZC0+cGlkKTsKKwkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOworCQlnb3RvIGVycl9jb3B5X2RhdGFfZmFpbGVkOworCX0KKwlvZmZfZW5kID0gKHZvaWQgKilvZmZwICsgdHItPm9mZnNldHNfc2l6ZTsKKwlmb3IgKDsgb2ZmcCA8IG9mZl9lbmQ7IG9mZnArKykgeworCQlzdHJ1Y3QgZmxhdF9iaW5kZXJfb2JqZWN0ICpmcDsKKwkJaWYgKCpvZmZwID4gdC0+YnVmZmVyLT5kYXRhX3NpemUgLSBzaXplb2YoKmZwKSkgeworCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgZ290IHRyYW5zYWN0aW9uIHdpdGggIgorCQkJCSJpbnZhbGlkIG9mZnNldCwgJXpkXG4iLAorCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsICpvZmZwKTsKKwkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKKwkJCWdvdG8gZXJyX2JhZF9vZmZzZXQ7CisJCX0KKwkJZnAgPSAoc3RydWN0IGZsYXRfYmluZGVyX29iamVjdCAqKSh0LT5idWZmZXItPmRhdGEgKyAqb2ZmcCk7CisJCXN3aXRjaCAoZnAtPnR5cGUpIHsKKwkJY2FzZSBCSU5ERVJfVFlQRV9CSU5ERVI6CisJCWNhc2UgQklOREVSX1RZUEVfV0VBS19CSU5ERVI6IHsKKwkJCXN0cnVjdCBiaW5kZXJfcmVmICpyZWY7CisJCQlzdHJ1Y3QgYmluZGVyX25vZGUgKm5vZGUgPSBiaW5kZXJfZ2V0X25vZGUocHJvYywgZnAtPmJpbmRlcik7CisJCQlpZiAobm9kZSA9PSBOVUxMKSB7CisJCQkJbm9kZSA9IGJpbmRlcl9uZXdfbm9kZShwcm9jLCBmcC0+YmluZGVyLCBmcC0+Y29va2llKTsKKwkJCQlpZiAobm9kZSA9PSBOVUxMKSB7CisJCQkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKKwkJCQkJZ290byBlcnJfYmluZGVyX25ld19ub2RlX2ZhaWxlZDsKKwkJCQl9CisJCQkJbm9kZS0+bWluX3ByaW9yaXR5ID0gZnAtPmZsYWdzICYgRkxBVF9CSU5ERVJfRkxBR19QUklPUklUWV9NQVNLOworCQkJCW5vZGUtPmFjY2VwdF9mZHMgPSAhIShmcC0+ZmxhZ3MgJiBGTEFUX0JJTkRFUl9GTEFHX0FDQ0VQVFNfRkRTKTsKKwkJCX0KKwkJCWlmIChmcC0+Y29va2llICE9IG5vZGUtPmNvb2tpZSkgeworCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIHNlbmRpbmcgdSVwICIKKwkJCQkJIm5vZGUgJWQsIGNvb2tpZSBtaXNtYXRjaCAlcCAhPSAlcFxuIiwKKwkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKKwkJCQkJZnAtPmJpbmRlciwgbm9kZS0+ZGVidWdfaWQsCisJCQkJCWZwLT5jb29raWUsIG5vZGUtPmNvb2tpZSk7CisJCQkJZ290byBlcnJfYmluZGVyX2dldF9yZWZfZm9yX25vZGVfZmFpbGVkOworCQkJfQorCQkJcmVmID0gYmluZGVyX2dldF9yZWZfZm9yX25vZGUodGFyZ2V0X3Byb2MsIG5vZGUpOworCQkJaWYgKHJlZiA9PSBOVUxMKSB7CisJCQkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOworCQkJCWdvdG8gZXJyX2JpbmRlcl9nZXRfcmVmX2Zvcl9ub2RlX2ZhaWxlZDsKKwkJCX0KKwkJCWlmIChmcC0+dHlwZSA9PSBCSU5ERVJfVFlQRV9CSU5ERVIpCisJCQkJZnAtPnR5cGUgPSBCSU5ERVJfVFlQRV9IQU5ETEU7CisJCQllbHNlCisJCQkJZnAtPnR5cGUgPSBCSU5ERVJfVFlQRV9XRUFLX0hBTkRMRTsKKwkJCWZwLT5oYW5kbGUgPSByZWYtPmRlc2M7CisJCQliaW5kZXJfaW5jX3JlZihyZWYsIGZwLT50eXBlID09IEJJTkRFUl9UWVBFX0hBTkRMRSwgJnRocmVhZC0+dG9kbyk7CisJCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT04pCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiICAgICAgICBub2RlICVkIHUlcCAtPiByZWYgJWQgZGVzYyAlZFxuIiwKKwkJCQkgICAgICAgbm9kZS0+ZGVidWdfaWQsIG5vZGUtPnB0ciwgcmVmLT5kZWJ1Z19pZCwgcmVmLT5kZXNjKTsKKwkJfSBicmVhazsKKwkJY2FzZSBCSU5ERVJfVFlQRV9IQU5ETEU6CisJCWNhc2UgQklOREVSX1RZUEVfV0VBS19IQU5ETEU6IHsKKwkJCXN0cnVjdCBiaW5kZXJfcmVmICpyZWYgPSBiaW5kZXJfZ2V0X3JlZihwcm9jLCBmcC0+aGFuZGxlKTsKKwkJCWlmIChyZWYgPT0gTlVMTCkgeworCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIGdvdCAiCisJCQkJCSJ0cmFuc2FjdGlvbiB3aXRoIGludmFsaWQgIgorCQkJCQkiaGFuZGxlLCAlbGRcbiIsIHByb2MtPnBpZCwKKwkJCQkJdGhyZWFkLT5waWQsIGZwLT5oYW5kbGUpOworCQkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKKwkJCQlnb3RvIGVycl9iaW5kZXJfZ2V0X3JlZl9mYWlsZWQ7CisJCQl9CisJCQlpZiAocmVmLT5ub2RlLT5wcm9jID09IHRhcmdldF9wcm9jKSB7CisJCQkJaWYgKGZwLT50eXBlID09IEJJTkRFUl9UWVBFX0hBTkRMRSkKKwkJCQkJZnAtPnR5cGUgPSBCSU5ERVJfVFlQRV9CSU5ERVI7CisJCQkJZWxzZQorCQkJCQlmcC0+dHlwZSA9IEJJTkRFUl9UWVBFX1dFQUtfQklOREVSOworCQkJCWZwLT5iaW5kZXIgPSByZWYtPm5vZGUtPnB0cjsKKwkJCQlmcC0+Y29va2llID0gcmVmLT5ub2RlLT5jb29raWU7CisJCQkJYmluZGVyX2luY19ub2RlKHJlZi0+bm9kZSwgZnAtPnR5cGUgPT0gQklOREVSX1RZUEVfQklOREVSLCAwLCBOVUxMKTsKKwkJCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT04pCisJCQkJCXByaW50ayhLRVJOX0lORk8gIiAgICAgICAgcmVmICVkIGRlc2MgJWQgLT4gbm9kZSAlZCB1JXBcbiIsCisJCQkJCSAgICAgICByZWYtPmRlYnVnX2lkLCByZWYtPmRlc2MsIHJlZi0+bm9kZS0+ZGVidWdfaWQsIHJlZi0+bm9kZS0+cHRyKTsKKwkJCX0gZWxzZSB7CisJCQkJc3RydWN0IGJpbmRlcl9yZWYgKm5ld19yZWY7CisJCQkJbmV3X3JlZiA9IGJpbmRlcl9nZXRfcmVmX2Zvcl9ub2RlKHRhcmdldF9wcm9jLCByZWYtPm5vZGUpOworCQkJCWlmIChuZXdfcmVmID09IE5VTEwpIHsKKwkJCQkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOworCQkJCQlnb3RvIGVycl9iaW5kZXJfZ2V0X3JlZl9mb3Jfbm9kZV9mYWlsZWQ7CisJCQkJfQorCQkJCWZwLT5oYW5kbGUgPSBuZXdfcmVmLT5kZXNjOworCQkJCWJpbmRlcl9pbmNfcmVmKG5ld19yZWYsIGZwLT50eXBlID09IEJJTkRFUl9UWVBFX0hBTkRMRSwgTlVMTCk7CisJCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OKQorCQkJCQlwcmludGsoS0VSTl9JTkZPICIgICAgICAgIHJlZiAlZCBkZXNjICVkIC0+IHJlZiAlZCBkZXNjICVkIChub2RlICVkKVxuIiwKKwkJCQkJICAgICAgIHJlZi0+ZGVidWdfaWQsIHJlZi0+ZGVzYywgbmV3X3JlZi0+ZGVidWdfaWQsIG5ld19yZWYtPmRlc2MsIHJlZi0+bm9kZS0+ZGVidWdfaWQpOworCQkJfQorCQl9IGJyZWFrOworCisJCWNhc2UgQklOREVSX1RZUEVfRkQ6IHsKKwkJCWludCB0YXJnZXRfZmQ7CisJCQlzdHJ1Y3QgZmlsZSAqZmlsZTsKKworCQkJaWYgKHJlcGx5KSB7CisJCQkJaWYgKCEoaW5fcmVwbHlfdG8tPmZsYWdzICYgVEZfQUNDRVBUX0ZEUykpIHsKKwkJCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgZ290IHJlcGx5IHdpdGggZmQsICVsZCwgYnV0IHRhcmdldCBkb2VzIG5vdCBhbGxvdyBmZHNcbiIsCisJCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBmcC0+aGFuZGxlKTsKKwkJCQkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOworCQkJCQlnb3RvIGVycl9mZF9ub3RfYWxsb3dlZDsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKCF0YXJnZXRfbm9kZS0+YWNjZXB0X2ZkcykgeworCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIGdvdCB0cmFuc2FjdGlvbiB3aXRoIGZkLCAlbGQsIGJ1dCB0YXJnZXQgZG9lcyBub3QgYWxsb3cgZmRzXG4iLAorCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBmcC0+aGFuZGxlKTsKKwkJCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7CisJCQkJZ290byBlcnJfZmRfbm90X2FsbG93ZWQ7CisJCQl9CisKKwkJCWZpbGUgPSBmZ2V0KGZwLT5oYW5kbGUpOworCQkJaWYgKGZpbGUgPT0gTlVMTCkgeworCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIGdvdCB0cmFuc2FjdGlvbiB3aXRoIGludmFsaWQgZmQsICVsZFxuIiwKKwkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgZnAtPmhhbmRsZSk7CisJCQkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOworCQkJCWdvdG8gZXJyX2ZnZXRfZmFpbGVkOworCQkJfQorCQkJdGFyZ2V0X2ZkID0gdGFza19nZXRfdW51c2VkX2ZkX2ZsYWdzKHRhcmdldF9wcm9jLT50c2ssIE9fQ0xPRVhFQyk7CisJCQlpZiAodGFyZ2V0X2ZkIDwgMCkgeworCQkJCWZwdXQoZmlsZSk7CisJCQkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOworCQkJCWdvdG8gZXJyX2dldF91bnVzZWRfZmRfZmFpbGVkOworCQkJfQorCQkJdGFza19mZF9pbnN0YWxsKHRhcmdldF9wcm9jLT50c2ssIHRhcmdldF9mZCwgZmlsZSk7CisJCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT04pCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiICAgICAgICBmZCAlbGQgLT4gJWRcbiIsIGZwLT5oYW5kbGUsIHRhcmdldF9mZCk7CisJCQkvKiBUT0RPOiBmcHV0PyAqLworCQkJZnAtPmhhbmRsZSA9IHRhcmdldF9mZDsKKwkJfSBicmVhazsKKworCQlkZWZhdWx0OgorCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgZ290IHRyYW5zYWN0aW8iCisJCQkJIm4gd2l0aCBpbnZhbGlkIG9iamVjdCB0eXBlLCAlbHhcbiIsCisJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgZnAtPnR5cGUpOworCQkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOworCQkJZ290byBlcnJfYmFkX29iamVjdF90eXBlOworCQl9CisJfQorCWlmIChyZXBseSkgeworCQlCVUdfT04odC0+YnVmZmVyLT5hc3luY190cmFuc2FjdGlvbiAhPSAwKTsKKwkJYmluZGVyX3BvcF90cmFuc2FjdGlvbih0YXJnZXRfdGhyZWFkLCBpbl9yZXBseV90byk7CisJfSBlbHNlIGlmICghKHQtPmZsYWdzICYgVEZfT05FX1dBWSkpIHsKKwkJQlVHX09OKHQtPmJ1ZmZlci0+YXN5bmNfdHJhbnNhY3Rpb24gIT0gMCk7CisJCXQtPm5lZWRfcmVwbHkgPSAxOworCQl0LT5mcm9tX3BhcmVudCA9IHRocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2s7CisJCXRocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2sgPSB0OworCX0gZWxzZSB7CisJCUJVR19PTih0YXJnZXRfbm9kZSA9PSBOVUxMKTsKKwkJQlVHX09OKHQtPmJ1ZmZlci0+YXN5bmNfdHJhbnNhY3Rpb24gIT0gMSk7CisJCWlmICh0YXJnZXRfbm9kZS0+aGFzX2FzeW5jX3RyYW5zYWN0aW9uKSB7CisJCQl0YXJnZXRfbGlzdCA9ICZ0YXJnZXRfbm9kZS0+YXN5bmNfdG9kbzsKKwkJCXRhcmdldF93YWl0ID0gTlVMTDsKKwkJfSBlbHNlCisJCQl0YXJnZXRfbm9kZS0+aGFzX2FzeW5jX3RyYW5zYWN0aW9uID0gMTsKKwl9CisJdC0+d29yay50eXBlID0gQklOREVSX1dPUktfVFJBTlNBQ1RJT047CisJbGlzdF9hZGRfdGFpbCgmdC0+d29yay5lbnRyeSwgdGFyZ2V0X2xpc3QpOworCXRjb21wbGV0ZS0+dHlwZSA9IEJJTkRFUl9XT1JLX1RSQU5TQUNUSU9OX0NPTVBMRVRFOworCWxpc3RfYWRkX3RhaWwoJnRjb21wbGV0ZS0+ZW50cnksICZ0aHJlYWQtPnRvZG8pOworCWlmICh0YXJnZXRfd2FpdCkKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKHRhcmdldF93YWl0KTsKKwlyZXR1cm47CisKK2Vycl9nZXRfdW51c2VkX2ZkX2ZhaWxlZDoKK2Vycl9mZ2V0X2ZhaWxlZDoKK2Vycl9mZF9ub3RfYWxsb3dlZDoKK2Vycl9iaW5kZXJfZ2V0X3JlZl9mb3Jfbm9kZV9mYWlsZWQ6CitlcnJfYmluZGVyX2dldF9yZWZfZmFpbGVkOgorZXJyX2JpbmRlcl9uZXdfbm9kZV9mYWlsZWQ6CitlcnJfYmFkX29iamVjdF90eXBlOgorZXJyX2JhZF9vZmZzZXQ6CitlcnJfY29weV9kYXRhX2ZhaWxlZDoKKwliaW5kZXJfdHJhbnNhY3Rpb25fYnVmZmVyX3JlbGVhc2UodGFyZ2V0X3Byb2MsIHQtPmJ1ZmZlciwgb2ZmcCk7CisJdC0+YnVmZmVyLT50cmFuc2FjdGlvbiA9IE5VTEw7CisJYmluZGVyX2ZyZWVfYnVmKHRhcmdldF9wcm9jLCB0LT5idWZmZXIpOworZXJyX2JpbmRlcl9hbGxvY19idWZfZmFpbGVkOgorCWtmcmVlKHRjb21wbGV0ZSk7CisJYmluZGVyX3N0YXRzLm9ial9kZWxldGVkW0JJTkRFUl9TVEFUX1RSQU5TQUNUSU9OX0NPTVBMRVRFXSsrOworZXJyX2FsbG9jX3Rjb21wbGV0ZV9mYWlsZWQ6CisJa2ZyZWUodCk7CisJYmluZGVyX3N0YXRzLm9ial9kZWxldGVkW0JJTkRFUl9TVEFUX1RSQU5TQUNUSU9OXSsrOworZXJyX2FsbG9jX3RfZmFpbGVkOgorZXJyX2JhZF9jYWxsX3N0YWNrOgorZXJyX2VtcHR5X2NhbGxfc3RhY2s6CitlcnJfZGVhZF9iaW5kZXI6CitlcnJfaW52YWxpZF90YXJnZXRfaGFuZGxlOgorZXJyX25vX2NvbnRleHRfbWdyX25vZGU6CisJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0ZBSUxFRF9UUkFOU0FDVElPTikKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDolZCB0cmFuc2FjdGlvbiBmYWlsZWQgJWQsIHNpemUiCisJCQkJIiV6ZC0lemRcbiIsCisJCQkgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCByZXR1cm5fZXJyb3IsCisJCQkgICB0ci0+ZGF0YV9zaXplLCB0ci0+b2Zmc2V0c19zaXplKTsKKworCXsKKwkJc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9sb2dfZW50cnkgKmZlOworCQlmZSA9IGJpbmRlcl90cmFuc2FjdGlvbl9sb2dfYWRkKCZiaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2ZhaWxlZCk7CisJCSpmZSA9ICplOworCX0KKworCUJVR19PTih0aHJlYWQtPnJldHVybl9lcnJvciAhPSBCUl9PSyk7CisJaWYgKGluX3JlcGx5X3RvKSB7CisJCXRocmVhZC0+cmV0dXJuX2Vycm9yID0gQlJfVFJBTlNBQ1RJT05fQ09NUExFVEU7CisJCWJpbmRlcl9zZW5kX2ZhaWxlZF9yZXBseShpbl9yZXBseV90bywgcmV0dXJuX2Vycm9yKTsKKwl9IGVsc2UKKwkJdGhyZWFkLT5yZXR1cm5fZXJyb3IgPSByZXR1cm5fZXJyb3I7Cit9CisKK3N0YXRpYyB2b2lkCitiaW5kZXJfdHJhbnNhY3Rpb25fYnVmZmVyX3JlbGVhc2Uoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLCBzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyLCBzaXplX3QgKmZhaWxlZF9hdCkKK3sKKwlzaXplX3QgKm9mZnAsICpvZmZfZW5kOworCWludCBkZWJ1Z19pZCA9IGJ1ZmZlci0+ZGVidWdfaWQ7CisKKwlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT04pCisJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQgYnVmZmVyIHJlbGVhc2UgJWQsIHNpemUgJXpkLSV6ZCwgZmFpbGVkIGF0ICVwXG4iLAorCQkJICAgcHJvYy0+cGlkLCBidWZmZXItPmRlYnVnX2lkLAorCQkJICAgYnVmZmVyLT5kYXRhX3NpemUsIGJ1ZmZlci0+b2Zmc2V0c19zaXplLCBmYWlsZWRfYXQpOworCisJaWYgKGJ1ZmZlci0+dGFyZ2V0X25vZGUpCisJCWJpbmRlcl9kZWNfbm9kZShidWZmZXItPnRhcmdldF9ub2RlLCAxLCAwKTsKKworCW9mZnAgPSAoc2l6ZV90ICopKGJ1ZmZlci0+ZGF0YSArIEFMSUdOKGJ1ZmZlci0+ZGF0YV9zaXplLCBzaXplb2Yodm9pZCAqKSkpOworCWlmIChmYWlsZWRfYXQpCisJCW9mZl9lbmQgPSBmYWlsZWRfYXQ7CisJZWxzZQorCQlvZmZfZW5kID0gKHZvaWQgKilvZmZwICsgYnVmZmVyLT5vZmZzZXRzX3NpemU7CisJZm9yICg7IG9mZnAgPCBvZmZfZW5kOyBvZmZwKyspIHsKKwkJc3RydWN0IGZsYXRfYmluZGVyX29iamVjdCAqZnA7CisJCWlmICgqb2ZmcCA+IGJ1ZmZlci0+ZGF0YV9zaXplIC0gc2l6ZW9mKCpmcCkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiB0cmFuc2FjdGlvbiByZWxlYXNlICVkIGJhZCIKKwkJCQkJIm9mZnNldCAlemQsIHNpemUgJXpkXG4iLCBkZWJ1Z19pZCwgKm9mZnAsIGJ1ZmZlci0+ZGF0YV9zaXplKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWZwID0gKHN0cnVjdCBmbGF0X2JpbmRlcl9vYmplY3QgKikoYnVmZmVyLT5kYXRhICsgKm9mZnApOworCQlzd2l0Y2ggKGZwLT50eXBlKSB7CisJCWNhc2UgQklOREVSX1RZUEVfQklOREVSOgorCQljYXNlIEJJTkRFUl9UWVBFX1dFQUtfQklOREVSOiB7CisJCQlzdHJ1Y3QgYmluZGVyX25vZGUgKm5vZGUgPSBiaW5kZXJfZ2V0X25vZGUocHJvYywgZnAtPmJpbmRlcik7CisJCQlpZiAobm9kZSA9PSBOVUxMKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6IHRyYW5zYWN0aW9uIHJlbGVhc2UgJWQgYmFkIG5vZGUgJXBcbiIsIGRlYnVnX2lkLCBmcC0+YmluZGVyKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19UUkFOU0FDVElPTikKKwkJCQlwcmludGsoS0VSTl9JTkZPICIgICAgICAgIG5vZGUgJWQgdSVwXG4iLAorCQkJCSAgICAgICBub2RlLT5kZWJ1Z19pZCwgbm9kZS0+cHRyKTsKKwkJCWJpbmRlcl9kZWNfbm9kZShub2RlLCBmcC0+dHlwZSA9PSBCSU5ERVJfVFlQRV9CSU5ERVIsIDApOworCQl9IGJyZWFrOworCQljYXNlIEJJTkRFUl9UWVBFX0hBTkRMRToKKwkJY2FzZSBCSU5ERVJfVFlQRV9XRUFLX0hBTkRMRTogeworCQkJc3RydWN0IGJpbmRlcl9yZWYgKnJlZiA9IGJpbmRlcl9nZXRfcmVmKHByb2MsIGZwLT5oYW5kbGUpOworCQkJaWYgKHJlZiA9PSBOVUxMKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6IHRyYW5zYWN0aW9uIHJlbGVhc2UgJWQgYmFkIGhhbmRsZSAlbGRcbiIsIGRlYnVnX2lkLCBmcC0+aGFuZGxlKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19UUkFOU0FDVElPTikKKwkJCQlwcmludGsoS0VSTl9JTkZPICIgICAgICAgIHJlZiAlZCBkZXNjICVkIChub2RlICVkKVxuIiwKKwkJCQkgICAgICAgcmVmLT5kZWJ1Z19pZCwgcmVmLT5kZXNjLCByZWYtPm5vZGUtPmRlYnVnX2lkKTsKKwkJCWJpbmRlcl9kZWNfcmVmKHJlZiwgZnAtPnR5cGUgPT0gQklOREVSX1RZUEVfSEFORExFKTsKKwkJfSBicmVhazsKKworCQljYXNlIEJJTkRFUl9UWVBFX0ZEOgorCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiAgICAgICAgZmQgJWxkXG4iLCBmcC0+aGFuZGxlKTsKKwkJCWlmIChmYWlsZWRfYXQpCisJCQkJdGFza19jbG9zZV9mZChwcm9jLT50c2ssIGZwLT5oYW5kbGUpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiB0cmFuc2FjdGlvbiByZWxlYXNlICVkIGJhZCBvYmplY3QgdHlwZSAlbHhcbiIsIGRlYnVnX2lkLCBmcC0+dHlwZSk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworaW50CitiaW5kZXJfdGhyZWFkX3dyaXRlKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgc3RydWN0IGJpbmRlcl90aHJlYWQgKnRocmVhZCwKKwkJICAgIHZvaWQgX191c2VyICpidWZmZXIsIGludCBzaXplLCBzaWduZWQgbG9uZyAqY29uc3VtZWQpCit7CisJdWludDMyX3QgY21kOworCXZvaWQgX191c2VyICpwdHIgPSBidWZmZXIgKyAqY29uc3VtZWQ7CisJdm9pZCBfX3VzZXIgKmVuZCA9IGJ1ZmZlciArIHNpemU7CisKKwl3aGlsZSAocHRyIDwgZW5kICYmIHRocmVhZC0+cmV0dXJuX2Vycm9yID09IEJSX09LKSB7CisJCWlmIChnZXRfdXNlcihjbWQsICh1aW50MzJfdCBfX3VzZXIgKilwdHIpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXB0ciArPSBzaXplb2YodWludDMyX3QpOworCQlpZiAoX0lPQ19OUihjbWQpIDwgQVJSQVlfU0laRShiaW5kZXJfc3RhdHMuYmMpKSB7CisJCQliaW5kZXJfc3RhdHMuYmNbX0lPQ19OUihjbWQpXSsrOworCQkJcHJvYy0+c3RhdHMuYmNbX0lPQ19OUihjbWQpXSsrOworCQkJdGhyZWFkLT5zdGF0cy5iY1tfSU9DX05SKGNtZCldKys7CisJCX0KKwkJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBCQ19JTkNSRUZTOgorCQljYXNlIEJDX0FDUVVJUkU6CisJCWNhc2UgQkNfUkVMRUFTRToKKwkJY2FzZSBCQ19ERUNSRUZTOiB7CisJCQl1aW50MzJfdCB0YXJnZXQ7CisJCQlzdHJ1Y3QgYmluZGVyX3JlZiAqcmVmOworCQkJY29uc3QgY2hhciAqZGVidWdfc3RyaW5nOworCisJCQlpZiAoZ2V0X3VzZXIodGFyZ2V0LCAodWludDMyX3QgX191c2VyICopcHRyKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXB0ciArPSBzaXplb2YodWludDMyX3QpOworCQkJaWYgKHRhcmdldCA9PSAwICYmIGJpbmRlcl9jb250ZXh0X21ncl9ub2RlICYmCisJCQkgICAgKGNtZCA9PSBCQ19JTkNSRUZTIHx8IGNtZCA9PSBCQ19BQ1FVSVJFKSkgeworCQkJCXJlZiA9IGJpbmRlcl9nZXRfcmVmX2Zvcl9ub2RlKHByb2MsCisJCQkJCSAgICAgICBiaW5kZXJfY29udGV4dF9tZ3Jfbm9kZSk7CisJCQkJaWYgKHJlZi0+ZGVzYyAhPSB0YXJnZXQpIHsKKwkJCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6IgorCQkJCQkJIiVkIHRyaWVkIHRvIGFjcXVpcmUgIgorCQkJCQkJInJlZmVyZW5jZSB0byBkZXNjIDAsICIKKwkJCQkJCSJnb3QgJWQgaW5zdGVhZFxuIiwKKwkJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsCisJCQkJCQlyZWYtPmRlc2MpOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCXJlZiA9IGJpbmRlcl9nZXRfcmVmKHByb2MsIHRhcmdldCk7CisJCQlpZiAocmVmID09IE5VTEwpIHsKKwkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCByZWZjb3UiCisJCQkJCSJudCBjaGFuZ2Ugb24gaW52YWxpZCByZWYgJWRcbiIsCisJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsIHRhcmdldCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzd2l0Y2ggKGNtZCkgeworCQkJY2FzZSBCQ19JTkNSRUZTOgorCQkJCWRlYnVnX3N0cmluZyA9ICJJbmNSZWZzIjsKKwkJCQliaW5kZXJfaW5jX3JlZihyZWYsIDAsIE5VTEwpOworCQkJCWJyZWFrOworCQkJY2FzZSBCQ19BQ1FVSVJFOgorCQkJCWRlYnVnX3N0cmluZyA9ICJBY3F1aXJlIjsKKwkJCQliaW5kZXJfaW5jX3JlZihyZWYsIDEsIE5VTEwpOworCQkJCWJyZWFrOworCQkJY2FzZSBCQ19SRUxFQVNFOgorCQkJCWRlYnVnX3N0cmluZyA9ICJSZWxlYXNlIjsKKwkJCQliaW5kZXJfZGVjX3JlZihyZWYsIDEpOworCQkJCWJyZWFrOworCQkJY2FzZSBCQ19ERUNSRUZTOgorCQkJZGVmYXVsdDoKKwkJCQlkZWJ1Z19zdHJpbmcgPSAiRGVjUmVmcyI7CisJCQkJYmluZGVyX2RlY19yZWYocmVmLCAwKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19VU0VSX1JFRlMpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDolZCAlcyByZWYgJWQgZGVzYyAlZCBzICVkIHcgJWQgZm9yIG5vZGUgJWRcbiIsCisJCQkJICAgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGRlYnVnX3N0cmluZywgcmVmLT5kZWJ1Z19pZCwgcmVmLT5kZXNjLCByZWYtPnN0cm9uZywgcmVmLT53ZWFrLCByZWYtPm5vZGUtPmRlYnVnX2lkKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgQkNfSU5DUkVGU19ET05FOgorCQljYXNlIEJDX0FDUVVJUkVfRE9ORTogeworCQkJdm9pZCBfX3VzZXIgKm5vZGVfcHRyOworCQkJdm9pZCAqY29va2llOworCQkJc3RydWN0IGJpbmRlcl9ub2RlICpub2RlOworCisJCQlpZiAoZ2V0X3VzZXIobm9kZV9wdHIsICh2b2lkICogX191c2VyICopcHRyKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXB0ciArPSBzaXplb2Yodm9pZCAqKTsKKwkJCWlmIChnZXRfdXNlcihjb29raWUsICh2b2lkICogX191c2VyICopcHRyKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXB0ciArPSBzaXplb2Yodm9pZCAqKTsKKwkJCW5vZGUgPSBiaW5kZXJfZ2V0X25vZGUocHJvYywgbm9kZV9wdHIpOworCQkJaWYgKG5vZGUgPT0gTlVMTCkgeworCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkICIKKwkJCQkJIiVzIHUlcCBubyBtYXRjaFxuIiwKKwkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKKwkJCQkJY21kID09IEJDX0lOQ1JFRlNfRE9ORSA/CisJCQkJCSJCQ19JTkNSRUZTX0RPTkUiIDoKKwkJCQkJIkJDX0FDUVVJUkVfRE9ORSIsCisJCQkJCW5vZGVfcHRyKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChjb29raWUgIT0gbm9kZS0+Y29va2llKSB7CisJCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgJXMgdSVwIG5vZGUgJWQiCisJCQkJCSIgY29va2llIG1pc21hdGNoICVwICE9ICVwXG4iLAorCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLAorCQkJCQljbWQgPT0gQkNfSU5DUkVGU19ET05FID8KKwkJCQkJIkJDX0lOQ1JFRlNfRE9ORSIgOiAiQkNfQUNRVUlSRV9ET05FIiwKKwkJCQkJbm9kZV9wdHIsIG5vZGUtPmRlYnVnX2lkLAorCQkJCQljb29raWUsIG5vZGUtPmNvb2tpZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoY21kID09IEJDX0FDUVVJUkVfRE9ORSkgeworCQkJCWlmIChub2RlLT5wZW5kaW5nX3N0cm9uZ19yZWYgPT0gMCkgeworCQkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCAiCisJCQkJCQkiQkNfQUNRVUlSRV9ET05FIG5vZGUgJWQgaGFzICIKKwkJCQkJCSJubyBwZW5kaW5nIGFjcXVpcmUgcmVxdWVzdFxuIiwKKwkJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsCisJCQkJCQlub2RlLT5kZWJ1Z19pZCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlub2RlLT5wZW5kaW5nX3N0cm9uZ19yZWYgPSAwOworCQkJfSBlbHNlIHsKKwkJCQlpZiAobm9kZS0+cGVuZGluZ193ZWFrX3JlZiA9PSAwKSB7CisJCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkICIKKwkJCQkJCSJCQ19JTkNSRUZTX0RPTkUgbm9kZSAlZCBoYXMgIgorCQkJCQkJIm5vIHBlbmRpbmcgaW5jcmVmcyByZXF1ZXN0XG4iLAorCQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKKwkJCQkJCW5vZGUtPmRlYnVnX2lkKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCW5vZGUtPnBlbmRpbmdfd2Vha19yZWYgPSAwOworCQkJfQorCQkJYmluZGVyX2RlY19ub2RlKG5vZGUsIGNtZCA9PSBCQ19BQ1FVSVJFX0RPTkUsIDApOworCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX1VTRVJfUkVGUykKKwkJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiVkICVzIG5vZGUgJWQgbHMgJWQgbHcgJWRcbiIsCisJCQkJICAgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGNtZCA9PSBCQ19JTkNSRUZTX0RPTkUgPyAiQkNfSU5DUkVGU19ET05FIiA6ICJCQ19BQ1FVSVJFX0RPTkUiLCBub2RlLT5kZWJ1Z19pZCwgbm9kZS0+bG9jYWxfc3Ryb25nX3JlZnMsIG5vZGUtPmxvY2FsX3dlYWtfcmVmcyk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIEJDX0FUVEVNUFRfQUNRVUlSRToKKwkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiBCQ19BVFRFTVBUX0FDUVVJUkUgbm90IHN1cHBvcnRlZFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJY2FzZSBCQ19BQ1FVSVJFX1JFU1VMVDoKKwkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiBCQ19BQ1FVSVJFX1JFU1VMVCBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWNhc2UgQkNfRlJFRV9CVUZGRVI6IHsKKwkJCXZvaWQgX191c2VyICpkYXRhX3B0cjsKKwkJCXN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXI7CisKKwkJCWlmIChnZXRfdXNlcihkYXRhX3B0ciwgKHZvaWQgKiBfX3VzZXIgKilwdHIpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcHRyICs9IHNpemVvZih2b2lkICopOworCisJCQlidWZmZXIgPSBiaW5kZXJfYnVmZmVyX2xvb2t1cChwcm9jLCBkYXRhX3B0cik7CisJCQlpZiAoYnVmZmVyID09IE5VTEwpIHsKKwkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCAiCisJCQkJCSJCQ19GUkVFX0JVRkZFUiB1JXAgbm8gbWF0Y2hcbiIsCisJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGRhdGFfcHRyKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICghYnVmZmVyLT5hbGxvd191c2VyX2ZyZWUpIHsKKwkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCAiCisJCQkJCSJCQ19GUkVFX0JVRkZFUiB1JXAgbWF0Y2hlZCAiCisJCQkJCSJ1bnJldHVybmVkIGJ1ZmZlclxuIiwKKwkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgZGF0YV9wdHIpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0ZSRUVfQlVGRkVSKQorCQkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6JWQgQkNfRlJFRV9CVUZGRVIgdSVwIGZvdW5kIGJ1ZmZlciAlZCBmb3IgJXMgdHJhbnNhY3Rpb25cbiIsCisJCQkJICAgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGRhdGFfcHRyLCBidWZmZXItPmRlYnVnX2lkLAorCQkJCSAgICAgICBidWZmZXItPnRyYW5zYWN0aW9uID8gImFjdGl2ZSIgOiAiZmluaXNoZWQiKTsKKworCQkJaWYgKGJ1ZmZlci0+dHJhbnNhY3Rpb24pIHsKKwkJCQlidWZmZXItPnRyYW5zYWN0aW9uLT5idWZmZXIgPSBOVUxMOworCQkJCWJ1ZmZlci0+dHJhbnNhY3Rpb24gPSBOVUxMOworCQkJfQorCQkJaWYgKGJ1ZmZlci0+YXN5bmNfdHJhbnNhY3Rpb24gJiYgYnVmZmVyLT50YXJnZXRfbm9kZSkgeworCQkJCUJVR19PTighYnVmZmVyLT50YXJnZXRfbm9kZS0+aGFzX2FzeW5jX3RyYW5zYWN0aW9uKTsKKwkJCQlpZiAobGlzdF9lbXB0eSgmYnVmZmVyLT50YXJnZXRfbm9kZS0+YXN5bmNfdG9kbykpCisJCQkJCWJ1ZmZlci0+dGFyZ2V0X25vZGUtPmhhc19hc3luY190cmFuc2FjdGlvbiA9IDA7CisJCQkJZWxzZQorCQkJCQlsaXN0X21vdmVfdGFpbChidWZmZXItPnRhcmdldF9ub2RlLT5hc3luY190b2RvLm5leHQsICZ0aHJlYWQtPnRvZG8pOworCQkJfQorCQkJYmluZGVyX3RyYW5zYWN0aW9uX2J1ZmZlcl9yZWxlYXNlKHByb2MsIGJ1ZmZlciwgTlVMTCk7CisJCQliaW5kZXJfZnJlZV9idWYocHJvYywgYnVmZmVyKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBCQ19UUkFOU0FDVElPTjoKKwkJY2FzZSBCQ19SRVBMWTogeworCQkJc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhIHRyOworCisJCQlpZiAoY29weV9mcm9tX3VzZXIoJnRyLCBwdHIsIHNpemVvZih0cikpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcHRyICs9IHNpemVvZih0cik7CisJCQliaW5kZXJfdHJhbnNhY3Rpb24ocHJvYywgdGhyZWFkLCAmdHIsIGNtZCA9PSBCQ19SRVBMWSk7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgQkNfUkVHSVNURVJfTE9PUEVSOgorCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX1RIUkVBRFMpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDolZCBCQ19SRUdJU1RFUl9MT09QRVJcbiIsCisJCQkJICAgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQpOworCQkJaWYgKHRocmVhZC0+bG9vcGVyICYgQklOREVSX0xPT1BFUl9TVEFURV9FTlRFUkVEKSB7CisJCQkJdGhyZWFkLT5sb29wZXIgfD0gQklOREVSX0xPT1BFUl9TVEFURV9JTlZBTElEOworCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIEVSUk9SOiIKKwkJCQkJIiBCQ19SRUdJU1RFUl9MT09QRVIgY2FsbGVkICIKKwkJCQkJImFmdGVyIEJDX0VOVEVSX0xPT1BFUlxuIiwKKwkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7CisJCQl9IGVsc2UgaWYgKHByb2MtPnJlcXVlc3RlZF90aHJlYWRzID09IDApIHsKKwkJCQl0aHJlYWQtPmxvb3BlciB8PSBCSU5ERVJfTE9PUEVSX1NUQVRFX0lOVkFMSUQ7CisJCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgRVJST1I6IgorCQkJCQkiIEJDX1JFR0lTVEVSX0xPT1BFUiBjYWxsZWQgIgorCQkJCQkid2l0aG91dCByZXF1ZXN0XG4iLAorCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJvYy0+cmVxdWVzdGVkX3RocmVhZHMtLTsKKwkJCQlwcm9jLT5yZXF1ZXN0ZWRfdGhyZWFkc19zdGFydGVkKys7CisJCQl9CisJCQl0aHJlYWQtPmxvb3BlciB8PSBCSU5ERVJfTE9PUEVSX1NUQVRFX1JFR0lTVEVSRUQ7CisJCQlicmVhazsKKwkJY2FzZSBCQ19FTlRFUl9MT09QRVI6CisJCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfVEhSRUFEUykKKwkJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiVkIEJDX0VOVEVSX0xPT1BFUlxuIiwKKwkJCQkgICAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7CisJCQlpZiAodGhyZWFkLT5sb29wZXIgJiBCSU5ERVJfTE9PUEVSX1NUQVRFX1JFR0lTVEVSRUQpIHsKKwkJCQl0aHJlYWQtPmxvb3BlciB8PSBCSU5ERVJfTE9PUEVSX1NUQVRFX0lOVkFMSUQ7CisJCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgRVJST1I6IgorCQkJCQkiIEJDX0VOVEVSX0xPT1BFUiBjYWxsZWQgYWZ0ZXIgIgorCQkJCQkiQkNfUkVHSVNURVJfTE9PUEVSXG4iLAorCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkKTsKKwkJCX0KKwkJCXRocmVhZC0+bG9vcGVyIHw9IEJJTkRFUl9MT09QRVJfU1RBVEVfRU5URVJFRDsKKwkJCWJyZWFrOworCQljYXNlIEJDX0VYSVRfTE9PUEVSOgorCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX1RIUkVBRFMpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDolZCBCQ19FWElUX0xPT1BFUlxuIiwKKwkJCQkgICAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7CisJCQl0aHJlYWQtPmxvb3BlciB8PSBCSU5ERVJfTE9PUEVSX1NUQVRFX0VYSVRFRDsKKwkJCWJyZWFrOworCisJCWNhc2UgQkNfUkVRVUVTVF9ERUFUSF9OT1RJRklDQVRJT046CisJCWNhc2UgQkNfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OOiB7CisJCQl1aW50MzJfdCB0YXJnZXQ7CisJCQl2b2lkIF9fdXNlciAqY29va2llOworCQkJc3RydWN0IGJpbmRlcl9yZWYgKnJlZjsKKwkJCXN0cnVjdCBiaW5kZXJfcmVmX2RlYXRoICpkZWF0aDsKKworCQkJaWYgKGdldF91c2VyKHRhcmdldCwgKHVpbnQzMl90IF9fdXNlciAqKXB0cikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlwdHIgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKwkJCWlmIChnZXRfdXNlcihjb29raWUsICh2b2lkIF9fdXNlciAqIF9fdXNlciAqKXB0cikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlwdHIgKz0gc2l6ZW9mKHZvaWQgKik7CisJCQlyZWYgPSBiaW5kZXJfZ2V0X3JlZihwcm9jLCB0YXJnZXQpOworCQkJaWYgKHJlZiA9PSBOVUxMKSB7CisJCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgJXMgIgorCQkJCQkiaW52YWxpZCByZWYgJWRcbiIsCisJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsCisJCQkJCWNtZCA9PSBCQ19SRVFVRVNUX0RFQVRIX05PVElGSUNBVElPTiA/CisJCQkJCSJCQ19SRVFVRVNUX0RFQVRIX05PVElGSUNBVElPTiIgOgorCQkJCQkiQkNfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OIiwKKwkJCQkJdGFyZ2V0KTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0RFQVRIX05PVElGSUNBVElPTikKKwkJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiVkICVzICVwIHJlZiAlZCBkZXNjICVkIHMgJWQgdyAlZCBmb3Igbm9kZSAlZFxuIiwKKwkJCQkgICAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKKwkJCQkgICAgICAgY21kID09IEJDX1JFUVVFU1RfREVBVEhfTk9USUZJQ0FUSU9OID8KKwkJCQkgICAgICAgIkJDX1JFUVVFU1RfREVBVEhfTk9USUZJQ0FUSU9OIiA6CisJCQkJICAgICAgICJCQ19DTEVBUl9ERUFUSF9OT1RJRklDQVRJT04iLAorCQkJCSAgICAgICBjb29raWUsIHJlZi0+ZGVidWdfaWQsIHJlZi0+ZGVzYywKKwkJCQkgICAgICAgcmVmLT5zdHJvbmcsIHJlZi0+d2VhaywgcmVmLT5ub2RlLT5kZWJ1Z19pZCk7CisKKwkJCWlmIChjbWQgPT0gQkNfUkVRVUVTVF9ERUFUSF9OT1RJRklDQVRJT04pIHsKKwkJCQlpZiAocmVmLT5kZWF0aCkgeworCQkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolIgorCQkJCQkJImQgQkNfUkVRVUVTVF9ERUFUSF9OT1RJIgorCQkJCQkJIkZJQ0FUSU9OIGRlYXRoIG5vdGlmaWMiCisJCQkJCQkiYXRpb24gYWxyZWFkeSBzZXRcbiIsCisJCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWRlYXRoID0ga3phbGxvYyhzaXplb2YoKmRlYXRoKSwgR0ZQX0tFUk5FTCk7CisJCQkJaWYgKGRlYXRoID09IE5VTEwpIHsKKwkJCQkJdGhyZWFkLT5yZXR1cm5fZXJyb3IgPSBCUl9FUlJPUjsKKwkJCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0ZBSUxFRF9UUkFOU0FDVElPTikKKwkJCQkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6JWQgIgorCQkJCQkJCSJCQ19SRVFVRVNUX0RFQVRIX05PVElGSUNBVElPTiBmYWlsZWRcbiIsCisJCQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQliaW5kZXJfc3RhdHMub2JqX2NyZWF0ZWRbQklOREVSX1NUQVRfREVBVEhdKys7CisJCQkJSU5JVF9MSVNUX0hFQUQoJmRlYXRoLT53b3JrLmVudHJ5KTsKKwkJCQlkZWF0aC0+Y29va2llID0gY29va2llOworCQkJCXJlZi0+ZGVhdGggPSBkZWF0aDsKKwkJCQlpZiAocmVmLT5ub2RlLT5wcm9jID09IE5VTEwpIHsKKwkJCQkJcmVmLT5kZWF0aC0+d29yay50eXBlID0gQklOREVSX1dPUktfREVBRF9CSU5ERVI7CisJCQkJCWlmICh0aHJlYWQtPmxvb3BlciAmIChCSU5ERVJfTE9PUEVSX1NUQVRFX1JFR0lTVEVSRUQgfCBCSU5ERVJfTE9PUEVSX1NUQVRFX0VOVEVSRUQpKSB7CisJCQkJCQlsaXN0X2FkZF90YWlsKCZyZWYtPmRlYXRoLT53b3JrLmVudHJ5LCAmdGhyZWFkLT50b2RvKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWxpc3RfYWRkX3RhaWwoJnJlZi0+ZGVhdGgtPndvcmsuZW50cnksICZwcm9jLT50b2RvKTsKKwkJCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJvYy0+d2FpdCk7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChyZWYtPmRlYXRoID09IE5VTEwpIHsKKwkJCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JSIKKwkJCQkJCSJkIEJDX0NMRUFSX0RFQVRIX05PVElGSSIKKwkJCQkJCSJDQVRJT04gZGVhdGggbm90aWZpY2F0IgorCQkJCQkJImlvbiBub3QgYWN0aXZlXG4iLAorCQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlkZWF0aCA9IHJlZi0+ZGVhdGg7CisJCQkJaWYgKGRlYXRoLT5jb29raWUgIT0gY29va2llKSB7CisJCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiUiCisJCQkJCQkiZCBCQ19DTEVBUl9ERUFUSF9OT1RJRkkiCisJCQkJCQkiQ0FUSU9OIGRlYXRoIG5vdGlmaWNhdCIKKwkJCQkJCSJpb24gY29va2llIG1pc21hdGNoICIKKwkJCQkJCSIlcCAhPSAlcFxuIiwKKwkJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsCisJCQkJCQlkZWF0aC0+Y29va2llLCBjb29raWUpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcmVmLT5kZWF0aCA9IE5VTEw7CisJCQkJaWYgKGxpc3RfZW1wdHkoJmRlYXRoLT53b3JrLmVudHJ5KSkgeworCQkJCQlkZWF0aC0+d29yay50eXBlID0gQklOREVSX1dPUktfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OOworCQkJCQlpZiAodGhyZWFkLT5sb29wZXIgJiAoQklOREVSX0xPT1BFUl9TVEFURV9SRUdJU1RFUkVEIHwgQklOREVSX0xPT1BFUl9TVEFURV9FTlRFUkVEKSkgeworCQkJCQkJbGlzdF9hZGRfdGFpbCgmZGVhdGgtPndvcmsuZW50cnksICZ0aHJlYWQtPnRvZG8pOworCQkJCQl9IGVsc2UgeworCQkJCQkJbGlzdF9hZGRfdGFpbCgmZGVhdGgtPndvcmsuZW50cnksICZwcm9jLT50b2RvKTsKKwkJCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJvYy0+d2FpdCk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlCVUdfT04oZGVhdGgtPndvcmsudHlwZSAhPSBCSU5ERVJfV09SS19ERUFEX0JJTkRFUik7CisJCQkJCWRlYXRoLT53b3JrLnR5cGUgPSBCSU5ERVJfV09SS19ERUFEX0JJTkRFUl9BTkRfQ0xFQVI7CisJCQkJfQorCQkJfQorCQl9IGJyZWFrOworCQljYXNlIEJDX0RFQURfQklOREVSX0RPTkU6IHsKKwkJCXN0cnVjdCBiaW5kZXJfd29yayAqdzsKKwkJCXZvaWQgX191c2VyICpjb29raWU7CisJCQlzdHJ1Y3QgYmluZGVyX3JlZl9kZWF0aCAqZGVhdGggPSBOVUxMOworCQkJaWYgKGdldF91c2VyKGNvb2tpZSwgKHZvaWQgX191c2VyICogX191c2VyICopcHRyKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJcHRyICs9IHNpemVvZih2b2lkICopOworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeSh3LCAmcHJvYy0+ZGVsaXZlcmVkX2RlYXRoLCBlbnRyeSkgeworCQkJCXN0cnVjdCBiaW5kZXJfcmVmX2RlYXRoICp0bXBfZGVhdGggPSBjb250YWluZXJfb2Yodywgc3RydWN0IGJpbmRlcl9yZWZfZGVhdGgsIHdvcmspOworCQkJCWlmICh0bXBfZGVhdGgtPmNvb2tpZSA9PSBjb29raWUpIHsKKwkJCQkJZGVhdGggPSB0bXBfZGVhdGg7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19ERUFEX0JJTkRFUikKKwkJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiVkIEJDX0RFQURfQklOREVSX0RPTkUgJXAgZm91bmQgJXBcbiIsCisJCQkJICAgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGNvb2tpZSwgZGVhdGgpOworCQkJaWYgKGRlYXRoID09IE5VTEwpIHsKKwkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCBCQ19ERUFEIgorCQkJCQkiX0JJTkRFUl9ET05FICVwIG5vdCBmb3VuZFxuIiwKKwkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgY29va2llKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJbGlzdF9kZWxfaW5pdCgmZGVhdGgtPndvcmsuZW50cnkpOworCQkJaWYgKGRlYXRoLT53b3JrLnR5cGUgPT0gQklOREVSX1dPUktfREVBRF9CSU5ERVJfQU5EX0NMRUFSKSB7CisJCQkJZGVhdGgtPndvcmsudHlwZSA9IEJJTkRFUl9XT1JLX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTjsKKwkJCQlpZiAodGhyZWFkLT5sb29wZXIgJiAoQklOREVSX0xPT1BFUl9TVEFURV9SRUdJU1RFUkVEIHwgQklOREVSX0xPT1BFUl9TVEFURV9FTlRFUkVEKSkgeworCQkJCQlsaXN0X2FkZF90YWlsKCZkZWF0aC0+d29yay5lbnRyeSwgJnRocmVhZC0+dG9kbyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbGlzdF9hZGRfdGFpbCgmZGVhdGgtPndvcmsuZW50cnksICZwcm9jLT50b2RvKTsKKwkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcm9jLT53YWl0KTsKKwkJCQl9CisJCQl9CisJCX0gYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiAlZDolZCB1bmtub3duIGNvbW1hbmQgJWRcbiIsIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGNtZCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkqY29uc3VtZWQgPSBwdHIgLSBidWZmZXI7CisJfQorCXJldHVybiAwOworfQorCit2b2lkCitiaW5kZXJfc3RhdF9icihzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsIHN0cnVjdCBiaW5kZXJfdGhyZWFkICp0aHJlYWQsIHVpbnQzMl90IGNtZCkKK3sKKwlpZiAoX0lPQ19OUihjbWQpIDwgQVJSQVlfU0laRShiaW5kZXJfc3RhdHMuYnIpKSB7CisJCWJpbmRlcl9zdGF0cy5icltfSU9DX05SKGNtZCldKys7CisJCXByb2MtPnN0YXRzLmJyW19JT0NfTlIoY21kKV0rKzsKKwkJdGhyZWFkLT5zdGF0cy5icltfSU9DX05SKGNtZCldKys7CisJfQorfQorCitzdGF0aWMgaW50CitiaW5kZXJfaGFzX3Byb2Nfd29yayhzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsIHN0cnVjdCBiaW5kZXJfdGhyZWFkICp0aHJlYWQpCit7CisJcmV0dXJuICFsaXN0X2VtcHR5KCZwcm9jLT50b2RvKSB8fCAodGhyZWFkLT5sb29wZXIgJiBCSU5ERVJfTE9PUEVSX1NUQVRFX05FRURfUkVUVVJOKTsKK30KKworc3RhdGljIGludAorYmluZGVyX2hhc190aHJlYWRfd29yayhzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGhyZWFkKQoreworCXJldHVybiAhbGlzdF9lbXB0eSgmdGhyZWFkLT50b2RvKSB8fCB0aHJlYWQtPnJldHVybl9lcnJvciAhPSBCUl9PSyB8fAorCQkodGhyZWFkLT5sb29wZXIgJiBCSU5ERVJfTE9PUEVSX1NUQVRFX05FRURfUkVUVVJOKTsKK30KKworc3RhdGljIGludAorYmluZGVyX3RocmVhZF9yZWFkKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgc3RydWN0IGJpbmRlcl90aHJlYWQgKnRocmVhZCwKKwl2b2lkICBfX3VzZXIgKmJ1ZmZlciwgaW50IHNpemUsIHNpZ25lZCBsb25nICpjb25zdW1lZCwgaW50IG5vbl9ibG9jaykKK3sKKwl2b2lkIF9fdXNlciAqcHRyID0gYnVmZmVyICsgKmNvbnN1bWVkOworCXZvaWQgX191c2VyICplbmQgPSBidWZmZXIgKyBzaXplOworCisJaW50IHJldCA9IDA7CisJaW50IHdhaXRfZm9yX3Byb2Nfd29yazsKKworCWlmICgqY29uc3VtZWQgPT0gMCkgeworCQlpZiAocHV0X3VzZXIoQlJfTk9PUCwgKHVpbnQzMl90IF9fdXNlciAqKXB0cikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcHRyICs9IHNpemVvZih1aW50MzJfdCk7CisJfQorCityZXRyeToKKwl3YWl0X2Zvcl9wcm9jX3dvcmsgPSB0aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrID09IE5VTEwgJiYgbGlzdF9lbXB0eSgmdGhyZWFkLT50b2RvKTsKKworCWlmICh0aHJlYWQtPnJldHVybl9lcnJvciAhPSBCUl9PSyAmJiBwdHIgPCBlbmQpIHsKKwkJaWYgKHRocmVhZC0+cmV0dXJuX2Vycm9yMiAhPSBCUl9PSykgeworCQkJaWYgKHB1dF91c2VyKHRocmVhZC0+cmV0dXJuX2Vycm9yMiwgKHVpbnQzMl90IF9fdXNlciAqKXB0cikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlwdHIgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKwkJCWlmIChwdHIgPT0gZW5kKQorCQkJCWdvdG8gZG9uZTsKKwkJCXRocmVhZC0+cmV0dXJuX2Vycm9yMiA9IEJSX09LOworCQl9CisJCWlmIChwdXRfdXNlcih0aHJlYWQtPnJldHVybl9lcnJvciwgKHVpbnQzMl90IF9fdXNlciAqKXB0cikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcHRyICs9IHNpemVvZih1aW50MzJfdCk7CisJCXRocmVhZC0+cmV0dXJuX2Vycm9yID0gQlJfT0s7CisJCWdvdG8gZG9uZTsKKwl9CisKKworCXRocmVhZC0+bG9vcGVyIHw9IEJJTkRFUl9MT09QRVJfU1RBVEVfV0FJVElORzsKKwlpZiAod2FpdF9mb3JfcHJvY193b3JrKQorCQlwcm9jLT5yZWFkeV90aHJlYWRzKys7CisJbXV0ZXhfdW5sb2NrKCZiaW5kZXJfbG9jayk7CisJaWYgKHdhaXRfZm9yX3Byb2Nfd29yaykgeworCQlpZiAoISh0aHJlYWQtPmxvb3BlciAmIChCSU5ERVJfTE9PUEVSX1NUQVRFX1JFR0lTVEVSRUQgfAorCQkJCQlCSU5ERVJfTE9PUEVSX1NUQVRFX0VOVEVSRUQpKSkgeworCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgRVJST1I6IFRocmVhZCB3YWl0aW5nICIKKwkJCQkiZm9yIHByb2Nlc3Mgd29yayBiZWZvcmUgY2FsbGluZyBCQ19SRUdJU1RFUl8iCisJCQkJIkxPT1BFUiBvciBCQ19FTlRFUl9MT09QRVIgKHN0YXRlICV4KVxuIiwKKwkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLCB0aHJlYWQtPmxvb3Blcik7CisJCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYmluZGVyX3VzZXJfZXJyb3Jfd2FpdCwgYmluZGVyX3N0b3Bfb25fdXNlcl9lcnJvciA8IDIpOworCQl9CisJCWJpbmRlcl9zZXRfbmljZShwcm9jLT5kZWZhdWx0X3ByaW9yaXR5KTsKKwkJaWYgKG5vbl9ibG9jaykgeworCQkJaWYgKCFiaW5kZXJfaGFzX3Byb2Nfd29yayhwcm9jLCB0aHJlYWQpKQorCQkJCXJldCA9IC1FQUdBSU47CisJCX0gZWxzZQorCQkJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX2V4Y2x1c2l2ZShwcm9jLT53YWl0LCBiaW5kZXJfaGFzX3Byb2Nfd29yayhwcm9jLCB0aHJlYWQpKTsKKwl9IGVsc2UgeworCQlpZiAobm9uX2Jsb2NrKSB7CisJCQlpZiAoIWJpbmRlcl9oYXNfdGhyZWFkX3dvcmsodGhyZWFkKSkKKwkJCQlyZXQgPSAtRUFHQUlOOworCQl9IGVsc2UKKwkJCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSh0aHJlYWQtPndhaXQsIGJpbmRlcl9oYXNfdGhyZWFkX3dvcmsodGhyZWFkKSk7CisJfQorCW11dGV4X2xvY2soJmJpbmRlcl9sb2NrKTsKKwlpZiAod2FpdF9mb3JfcHJvY193b3JrKQorCQlwcm9jLT5yZWFkeV90aHJlYWRzLS07CisJdGhyZWFkLT5sb29wZXIgJj0gfkJJTkRFUl9MT09QRVJfU1RBVEVfV0FJVElORzsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl3aGlsZSAoMSkgeworCQl1aW50MzJfdCBjbWQ7CisJCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSB0cjsKKwkJc3RydWN0IGJpbmRlcl93b3JrICp3OworCQlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICp0ID0gTlVMTDsKKworCQlpZiAoIWxpc3RfZW1wdHkoJnRocmVhZC0+dG9kbykpCisJCQl3ID0gbGlzdF9maXJzdF9lbnRyeSgmdGhyZWFkLT50b2RvLCBzdHJ1Y3QgYmluZGVyX3dvcmssIGVudHJ5KTsKKwkJZWxzZSBpZiAoIWxpc3RfZW1wdHkoJnByb2MtPnRvZG8pICYmIHdhaXRfZm9yX3Byb2Nfd29yaykKKwkJCXcgPSBsaXN0X2ZpcnN0X2VudHJ5KCZwcm9jLT50b2RvLCBzdHJ1Y3QgYmluZGVyX3dvcmssIGVudHJ5KTsKKwkJZWxzZSB7CisJCQlpZiAocHRyIC0gYnVmZmVyID09IDQgJiYgISh0aHJlYWQtPmxvb3BlciAmIEJJTkRFUl9MT09QRVJfU1RBVEVfTkVFRF9SRVRVUk4pKSAvKiBubyBkYXRhIGFkZGVkICovCisJCQkJZ290byByZXRyeTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGVuZCAtIHB0ciA8IHNpemVvZih0cikgKyA0KQorCQkJYnJlYWs7CisKKwkJc3dpdGNoICh3LT50eXBlKSB7CisJCWNhc2UgQklOREVSX1dPUktfVFJBTlNBQ1RJT046IHsKKwkJCXQgPSBjb250YWluZXJfb2Yodywgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiwgd29yayk7CisJCX0gYnJlYWs7CisJCWNhc2UgQklOREVSX1dPUktfVFJBTlNBQ1RJT05fQ09NUExFVEU6IHsKKwkJCWNtZCA9IEJSX1RSQU5TQUNUSU9OX0NPTVBMRVRFOworCQkJaWYgKHB1dF91c2VyKGNtZCwgKHVpbnQzMl90IF9fdXNlciAqKXB0cikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlwdHIgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKworCQkJYmluZGVyX3N0YXRfYnIocHJvYywgdGhyZWFkLCBjbWQpOworCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OX0NPTVBMRVRFKQorCQkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6JWQgQlJfVFJBTlNBQ1RJT05fQ09NUExFVEVcbiIsCisJCQkJICAgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQpOworCisJCQlsaXN0X2RlbCgmdy0+ZW50cnkpOworCQkJa2ZyZWUodyk7CisJCQliaW5kZXJfc3RhdHMub2JqX2RlbGV0ZWRbQklOREVSX1NUQVRfVFJBTlNBQ1RJT05fQ09NUExFVEVdKys7CisJCX0gYnJlYWs7CisJCWNhc2UgQklOREVSX1dPUktfTk9ERTogeworCQkJc3RydWN0IGJpbmRlcl9ub2RlICpub2RlID0gY29udGFpbmVyX29mKHcsIHN0cnVjdCBiaW5kZXJfbm9kZSwgd29yayk7CisJCQl1aW50MzJfdCBjbWQgPSBCUl9OT09QOworCQkJY29uc3QgY2hhciAqY21kX25hbWU7CisJCQlpbnQgc3Ryb25nID0gbm9kZS0+aW50ZXJuYWxfc3Ryb25nX3JlZnMgfHwgbm9kZS0+bG9jYWxfc3Ryb25nX3JlZnM7CisJCQlpbnQgd2VhayA9ICFobGlzdF9lbXB0eSgmbm9kZS0+cmVmcykgfHwgbm9kZS0+bG9jYWxfd2Vha19yZWZzIHx8IHN0cm9uZzsKKwkJCWlmICh3ZWFrICYmICFub2RlLT5oYXNfd2Vha19yZWYpIHsKKwkJCQljbWQgPSBCUl9JTkNSRUZTOworCQkJCWNtZF9uYW1lID0gIkJSX0lOQ1JFRlMiOworCQkJCW5vZGUtPmhhc193ZWFrX3JlZiA9IDE7CisJCQkJbm9kZS0+cGVuZGluZ193ZWFrX3JlZiA9IDE7CisJCQkJbm9kZS0+bG9jYWxfd2Vha19yZWZzKys7CisJCQl9IGVsc2UgaWYgKHN0cm9uZyAmJiAhbm9kZS0+aGFzX3N0cm9uZ19yZWYpIHsKKwkJCQljbWQgPSBCUl9BQ1FVSVJFOworCQkJCWNtZF9uYW1lID0gIkJSX0FDUVVJUkUiOworCQkJCW5vZGUtPmhhc19zdHJvbmdfcmVmID0gMTsKKwkJCQlub2RlLT5wZW5kaW5nX3N0cm9uZ19yZWYgPSAxOworCQkJCW5vZGUtPmxvY2FsX3N0cm9uZ19yZWZzKys7CisJCQl9IGVsc2UgaWYgKCFzdHJvbmcgJiYgbm9kZS0+aGFzX3N0cm9uZ19yZWYpIHsKKwkJCQljbWQgPSBCUl9SRUxFQVNFOworCQkJCWNtZF9uYW1lID0gIkJSX1JFTEVBU0UiOworCQkJCW5vZGUtPmhhc19zdHJvbmdfcmVmID0gMDsKKwkJCX0gZWxzZSBpZiAoIXdlYWsgJiYgbm9kZS0+aGFzX3dlYWtfcmVmKSB7CisJCQkJY21kID0gQlJfREVDUkVGUzsKKwkJCQljbWRfbmFtZSA9ICJCUl9ERUNSRUZTIjsKKwkJCQlub2RlLT5oYXNfd2Vha19yZWYgPSAwOworCQkJfQorCQkJaWYgKGNtZCAhPSBCUl9OT09QKSB7CisJCQkJaWYgKHB1dF91c2VyKGNtZCwgKHVpbnQzMl90IF9fdXNlciAqKXB0cikpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCXB0ciArPSBzaXplb2YodWludDMyX3QpOworCQkJCWlmIChwdXRfdXNlcihub2RlLT5wdHIsICh2b2lkICogX191c2VyICopcHRyKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJcHRyICs9IHNpemVvZih2b2lkICopOworCQkJCWlmIChwdXRfdXNlcihub2RlLT5jb29raWUsICh2b2lkICogX191c2VyICopcHRyKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJcHRyICs9IHNpemVvZih2b2lkICopOworCisJCQkJYmluZGVyX3N0YXRfYnIocHJvYywgdGhyZWFkLCBjbWQpOworCQkJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19VU0VSX1JFRlMpCisJCQkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6JWQgJXMgJWQgdSVwIGMlcFxuIiwKKwkJCQkJICAgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGNtZF9uYW1lLCBub2RlLT5kZWJ1Z19pZCwgbm9kZS0+cHRyLCBub2RlLT5jb29raWUpOworCQkJfSBlbHNlIHsKKwkJCQlsaXN0X2RlbF9pbml0KCZ3LT5lbnRyeSk7CisJCQkJaWYgKCF3ZWFrICYmICFzdHJvbmcpIHsKKwkJCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0lOVEVSTkFMX1JFRlMpCisJCQkJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiVkIG5vZGUgJWQgdSVwIGMlcCBkZWxldGVkXG4iLAorCQkJCQkJICAgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIG5vZGUtPmRlYnVnX2lkLCBub2RlLT5wdHIsIG5vZGUtPmNvb2tpZSk7CisJCQkJCXJiX2VyYXNlKCZub2RlLT5yYl9ub2RlLCAmcHJvYy0+bm9kZXMpOworCQkJCQlrZnJlZShub2RlKTsKKwkJCQkJYmluZGVyX3N0YXRzLm9ial9kZWxldGVkW0JJTkRFUl9TVEFUX05PREVdKys7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0lOVEVSTkFMX1JFRlMpCisJCQkJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiVkIG5vZGUgJWQgdSVwIGMlcCBzdGF0ZSB1bmNoYW5nZWRcbiIsCisJCQkJCQkgICAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgbm9kZS0+ZGVidWdfaWQsIG5vZGUtPnB0ciwgbm9kZS0+Y29va2llKTsKKwkJCQl9CisJCQl9CisJCX0gYnJlYWs7CisJCWNhc2UgQklOREVSX1dPUktfREVBRF9CSU5ERVI6CisJCWNhc2UgQklOREVSX1dPUktfREVBRF9CSU5ERVJfQU5EX0NMRUFSOgorCQljYXNlIEJJTkRFUl9XT1JLX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTjogeworCQkJc3RydWN0IGJpbmRlcl9yZWZfZGVhdGggKmRlYXRoID0gY29udGFpbmVyX29mKHcsIHN0cnVjdCBiaW5kZXJfcmVmX2RlYXRoLCB3b3JrKTsKKwkJCXVpbnQzMl90IGNtZDsKKwkJCWlmICh3LT50eXBlID09IEJJTkRFUl9XT1JLX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTikKKwkJCQljbWQgPSBCUl9DTEVBUl9ERUFUSF9OT1RJRklDQVRJT05fRE9ORTsKKwkJCWVsc2UKKwkJCQljbWQgPSBCUl9ERUFEX0JJTkRFUjsKKwkJCWlmIChwdXRfdXNlcihjbWQsICh1aW50MzJfdCBfX3VzZXIgKilwdHIpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcHRyICs9IHNpemVvZih1aW50MzJfdCk7CisJCQlpZiAocHV0X3VzZXIoZGVhdGgtPmNvb2tpZSwgKHZvaWQgKiBfX3VzZXIgKilwdHIpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcHRyICs9IHNpemVvZih2b2lkICopOworCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0RFQVRIX05PVElGSUNBVElPTikKKwkJCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiVkICVzICVwXG4iLAorCQkJCSAgICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLAorCQkJCSAgICAgICBjbWQgPT0gQlJfREVBRF9CSU5ERVIgPworCQkJCSAgICAgICAiQlJfREVBRF9CSU5ERVIiIDoKKwkJCQkgICAgICAgIkJSX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTl9ET05FIiwKKwkJCQkgICAgICAgZGVhdGgtPmNvb2tpZSk7CisKKwkJCWlmICh3LT50eXBlID09IEJJTkRFUl9XT1JLX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTikgeworCQkJCWxpc3RfZGVsKCZ3LT5lbnRyeSk7CisJCQkJa2ZyZWUoZGVhdGgpOworCQkJCWJpbmRlcl9zdGF0cy5vYmpfZGVsZXRlZFtCSU5ERVJfU1RBVF9ERUFUSF0rKzsKKwkJCX0gZWxzZQorCQkJCWxpc3RfbW92ZSgmdy0+ZW50cnksICZwcm9jLT5kZWxpdmVyZWRfZGVhdGgpOworCQkJaWYgKGNtZCA9PSBCUl9ERUFEX0JJTkRFUikKKwkJCQlnb3RvIGRvbmU7IC8qIERFQURfQklOREVSIG5vdGlmaWNhdGlvbnMgY2FuIGNhdXNlIHRyYW5zYWN0aW9ucyAqLworCQl9IGJyZWFrOworCQl9CisKKwkJaWYgKCF0KQorCQkJY29udGludWU7CisKKwkJQlVHX09OKHQtPmJ1ZmZlciA9PSBOVUxMKTsKKwkJaWYgKHQtPmJ1ZmZlci0+dGFyZ2V0X25vZGUpIHsKKwkJCXN0cnVjdCBiaW5kZXJfbm9kZSAqdGFyZ2V0X25vZGUgPSB0LT5idWZmZXItPnRhcmdldF9ub2RlOworCQkJdHIudGFyZ2V0LnB0ciA9IHRhcmdldF9ub2RlLT5wdHI7CisJCQl0ci5jb29raWUgPSAgdGFyZ2V0X25vZGUtPmNvb2tpZTsKKwkJCXQtPnNhdmVkX3ByaW9yaXR5ID0gdGFza19uaWNlKGN1cnJlbnQpOworCQkJaWYgKHQtPnByaW9yaXR5IDwgdGFyZ2V0X25vZGUtPm1pbl9wcmlvcml0eSAmJgorCQkJICAgICEodC0+ZmxhZ3MgJiBURl9PTkVfV0FZKSkKKwkJCQliaW5kZXJfc2V0X25pY2UodC0+cHJpb3JpdHkpOworCQkJZWxzZSBpZiAoISh0LT5mbGFncyAmIFRGX09ORV9XQVkpIHx8CisJCQkJIHQtPnNhdmVkX3ByaW9yaXR5ID4gdGFyZ2V0X25vZGUtPm1pbl9wcmlvcml0eSkKKwkJCQliaW5kZXJfc2V0X25pY2UodGFyZ2V0X25vZGUtPm1pbl9wcmlvcml0eSk7CisJCQljbWQgPSBCUl9UUkFOU0FDVElPTjsKKwkJfSBlbHNlIHsKKwkJCXRyLnRhcmdldC5wdHIgPSBOVUxMOworCQkJdHIuY29va2llID0gTlVMTDsKKwkJCWNtZCA9IEJSX1JFUExZOworCQl9CisJCXRyLmNvZGUgPSB0LT5jb2RlOworCQl0ci5mbGFncyA9IHQtPmZsYWdzOworCQl0ci5zZW5kZXJfZXVpZCA9IHQtPnNlbmRlcl9ldWlkOworCisJCWlmICh0LT5mcm9tKSB7CisJCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnNlbmRlciA9IHQtPmZyb20tPnByb2MtPnRzazsKKwkJCXRyLnNlbmRlcl9waWQgPSB0YXNrX3RnaWRfbnJfbnMoc2VuZGVyLCBjdXJyZW50LT5uc3Byb3h5LT5waWRfbnMpOworCQl9IGVsc2UgeworCQkJdHIuc2VuZGVyX3BpZCA9IDA7CisJCX0KKworCQl0ci5kYXRhX3NpemUgPSB0LT5idWZmZXItPmRhdGFfc2l6ZTsKKwkJdHIub2Zmc2V0c19zaXplID0gdC0+YnVmZmVyLT5vZmZzZXRzX3NpemU7CisJCXRyLmRhdGEucHRyLmJ1ZmZlciA9ICh2b2lkICopKCh2b2lkICopdC0+YnVmZmVyLT5kYXRhICsgcHJvYy0+dXNlcl9idWZmZXJfb2Zmc2V0KTsKKwkJdHIuZGF0YS5wdHIub2Zmc2V0cyA9IHRyLmRhdGEucHRyLmJ1ZmZlciArIEFMSUdOKHQtPmJ1ZmZlci0+ZGF0YV9zaXplLCBzaXplb2Yodm9pZCAqKSk7CisKKwkJaWYgKHB1dF91c2VyKGNtZCwgKHVpbnQzMl90IF9fdXNlciAqKXB0cikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcHRyICs9IHNpemVvZih1aW50MzJfdCk7CisJCWlmIChjb3B5X3RvX3VzZXIocHRyLCAmdHIsIHNpemVvZih0cikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXB0ciArPSBzaXplb2YodHIpOworCisJCWJpbmRlcl9zdGF0X2JyKHByb2MsIHRocmVhZCwgY21kKTsKKwkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDolZCAlcyAlZCAlZDolZCwgY21kICVkIgorCQkJCSJzaXplICV6ZC0lemQgcHRyICVwLSVwXG4iLAorCQkJICAgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsCisJCQkgICAgICAgKGNtZCA9PSBCUl9UUkFOU0FDVElPTikgPyAiQlJfVFJBTlNBQ1RJT04iIDogIkJSX1JFUExZIiwKKwkJCSAgICAgICB0LT5kZWJ1Z19pZCwgdC0+ZnJvbSA/IHQtPmZyb20tPnByb2MtPnBpZCA6IDAsCisJCQkgICAgICAgdC0+ZnJvbSA/IHQtPmZyb20tPnBpZCA6IDAsIGNtZCwKKwkJCSAgICAgICB0LT5idWZmZXItPmRhdGFfc2l6ZSwgdC0+YnVmZmVyLT5vZmZzZXRzX3NpemUsCisJCQkgICAgICAgdHIuZGF0YS5wdHIuYnVmZmVyLCB0ci5kYXRhLnB0ci5vZmZzZXRzKTsKKworCQlsaXN0X2RlbCgmdC0+d29yay5lbnRyeSk7CisJCXQtPmJ1ZmZlci0+YWxsb3dfdXNlcl9mcmVlID0gMTsKKwkJaWYgKGNtZCA9PSBCUl9UUkFOU0FDVElPTiAmJiAhKHQtPmZsYWdzICYgVEZfT05FX1dBWSkpIHsKKwkJCXQtPnRvX3BhcmVudCA9IHRocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2s7CisJCQl0LT50b190aHJlYWQgPSB0aHJlYWQ7CisJCQl0aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrID0gdDsKKwkJfSBlbHNlIHsKKwkJCXQtPmJ1ZmZlci0+dHJhbnNhY3Rpb24gPSBOVUxMOworCQkJa2ZyZWUodCk7CisJCQliaW5kZXJfc3RhdHMub2JqX2RlbGV0ZWRbQklOREVSX1NUQVRfVFJBTlNBQ1RJT05dKys7CisJCX0KKwkJYnJlYWs7CisJfQorCitkb25lOgorCisJKmNvbnN1bWVkID0gcHRyIC0gYnVmZmVyOworCWlmIChwcm9jLT5yZXF1ZXN0ZWRfdGhyZWFkcyArIHByb2MtPnJlYWR5X3RocmVhZHMgPT0gMCAmJgorCSAgICBwcm9jLT5yZXF1ZXN0ZWRfdGhyZWFkc19zdGFydGVkIDwgcHJvYy0+bWF4X3RocmVhZHMgJiYKKwkgICAgKHRocmVhZC0+bG9vcGVyICYgKEJJTkRFUl9MT09QRVJfU1RBVEVfUkVHSVNURVJFRCB8CisJICAgICBCSU5ERVJfTE9PUEVSX1NUQVRFX0VOVEVSRUQpKSAvKiB0aGUgdXNlci1zcGFjZSBjb2RlIGZhaWxzIHRvICovCisJICAgICAvKnNwYXduIGEgbmV3IHRocmVhZCBpZiB3ZSBsZWF2ZSB0aGlzIG91dCAqLykgeworCQlwcm9jLT5yZXF1ZXN0ZWRfdGhyZWFkcysrOworCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfVEhSRUFEUykKKwkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6JWQgQlJfU1BBV05fTE9PUEVSXG4iLAorCQkJICAgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQpOworCQlpZiAocHV0X3VzZXIoQlJfU1BBV05fTE9PUEVSLCAodWludDMyX3QgX191c2VyICopYnVmZmVyKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYmluZGVyX3JlbGVhc2Vfd29yayhzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQoreworCXN0cnVjdCBiaW5kZXJfd29yayAqdzsKKwl3aGlsZSAoIWxpc3RfZW1wdHkobGlzdCkpIHsKKwkJdyA9IGxpc3RfZmlyc3RfZW50cnkobGlzdCwgc3RydWN0IGJpbmRlcl93b3JrLCBlbnRyeSk7CisJCWxpc3RfZGVsX2luaXQoJnctPmVudHJ5KTsKKwkJc3dpdGNoICh3LT50eXBlKSB7CisJCWNhc2UgQklOREVSX1dPUktfVFJBTlNBQ1RJT046IHsKKwkJCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKnQgPSBjb250YWluZXJfb2Yodywgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiwgd29yayk7CisJCQlpZiAodC0+YnVmZmVyLT50YXJnZXRfbm9kZSAmJiAhKHQtPmZsYWdzICYgVEZfT05FX1dBWSkpCisJCQkJYmluZGVyX3NlbmRfZmFpbGVkX3JlcGx5KHQsIEJSX0RFQURfUkVQTFkpOworCQl9IGJyZWFrOworCQljYXNlIEJJTkRFUl9XT1JLX1RSQU5TQUNUSU9OX0NPTVBMRVRFOiB7CisJCQlrZnJlZSh3KTsKKwkJCWJpbmRlcl9zdGF0cy5vYmpfZGVsZXRlZFtCSU5ERVJfU1RBVF9UUkFOU0FDVElPTl9DT01QTEVURV0rKzsKKwkJfSBicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCit9CisKK3N0YXRpYyBzdHJ1Y3QgYmluZGVyX3RocmVhZCAqYmluZGVyX2dldF90aHJlYWQoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jKQoreworCXN0cnVjdCBiaW5kZXJfdGhyZWFkICp0aHJlYWQgPSBOVUxMOworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOworCXN0cnVjdCByYl9ub2RlICoqcCA9ICZwcm9jLT50aHJlYWRzLnJiX25vZGU7CisKKwl3aGlsZSAoKnApIHsKKwkJcGFyZW50ID0gKnA7CisJCXRocmVhZCA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGJpbmRlcl90aHJlYWQsIHJiX25vZGUpOworCisJCWlmIChjdXJyZW50LT5waWQgPCB0aHJlYWQtPnBpZCkKKwkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKKwkJZWxzZSBpZiAoY3VycmVudC0+cGlkID4gdGhyZWFkLT5waWQpCisJCQlwID0gJigqcCktPnJiX3JpZ2h0OworCQllbHNlCisJCQlicmVhazsKKwl9CisJaWYgKCpwID09IE5VTEwpIHsKKwkJdGhyZWFkID0ga3phbGxvYyhzaXplb2YoKnRocmVhZCksIEdGUF9LRVJORUwpOworCQlpZiAodGhyZWFkID09IE5VTEwpCisJCQlyZXR1cm4gTlVMTDsKKwkJYmluZGVyX3N0YXRzLm9ial9jcmVhdGVkW0JJTkRFUl9TVEFUX1RIUkVBRF0rKzsKKwkJdGhyZWFkLT5wcm9jID0gcHJvYzsKKwkJdGhyZWFkLT5waWQgPSBjdXJyZW50LT5waWQ7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRocmVhZC0+d2FpdCk7CisJCUlOSVRfTElTVF9IRUFEKCZ0aHJlYWQtPnRvZG8pOworCQlyYl9saW5rX25vZGUoJnRocmVhZC0+cmJfbm9kZSwgcGFyZW50LCBwKTsKKwkJcmJfaW5zZXJ0X2NvbG9yKCZ0aHJlYWQtPnJiX25vZGUsICZwcm9jLT50aHJlYWRzKTsKKwkJdGhyZWFkLT5sb29wZXIgfD0gQklOREVSX0xPT1BFUl9TVEFURV9ORUVEX1JFVFVSTjsKKwkJdGhyZWFkLT5yZXR1cm5fZXJyb3IgPSBCUl9PSzsKKwkJdGhyZWFkLT5yZXR1cm5fZXJyb3IyID0gQlJfT0s7CisJfQorCXJldHVybiB0aHJlYWQ7Cit9CisKK3N0YXRpYyBpbnQgYmluZGVyX2ZyZWVfdGhyZWFkKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgc3RydWN0IGJpbmRlcl90aHJlYWQgKnRocmVhZCkKK3sKKwlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICp0OworCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKnNlbmRfcmVwbHkgPSBOVUxMOworCWludCBhY3RpdmVfdHJhbnNhY3Rpb25zID0gMDsKKworCXJiX2VyYXNlKCZ0aHJlYWQtPnJiX25vZGUsICZwcm9jLT50aHJlYWRzKTsKKwl0ID0gdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjazsKKwlpZiAodCAmJiB0LT50b190aHJlYWQgPT0gdGhyZWFkKQorCQlzZW5kX3JlcGx5ID0gdDsKKwl3aGlsZSAodCkgeworCQlhY3RpdmVfdHJhbnNhY3Rpb25zKys7CisJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19ERUFEX1RSQU5TQUNUSU9OKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiByZWxlYXNlICVkOiVkIHRyYW5zYWN0aW9uICVkICVzLCBzdGlsbCBhY3RpdmVcbiIsCisJCQkgICAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgdC0+ZGVidWdfaWQsICh0LT50b190aHJlYWQgPT0gdGhyZWFkKSA/ICJpbiIgOiAib3V0Iik7CisJCWlmICh0LT50b190aHJlYWQgPT0gdGhyZWFkKSB7CisJCQl0LT50b19wcm9jID0gTlVMTDsKKwkJCXQtPnRvX3RocmVhZCA9IE5VTEw7CisJCQlpZiAodC0+YnVmZmVyKSB7CisJCQkJdC0+YnVmZmVyLT50cmFuc2FjdGlvbiA9IE5VTEw7CisJCQkJdC0+YnVmZmVyID0gTlVMTDsKKwkJCX0KKwkJCXQgPSB0LT50b19wYXJlbnQ7CisJCX0gZWxzZSBpZiAodC0+ZnJvbSA9PSB0aHJlYWQpIHsKKwkJCXQtPmZyb20gPSBOVUxMOworCQkJdCA9IHQtPmZyb21fcGFyZW50OworCQl9IGVsc2UKKwkJCUJVRygpOworCX0KKwlpZiAoc2VuZF9yZXBseSkKKwkJYmluZGVyX3NlbmRfZmFpbGVkX3JlcGx5KHNlbmRfcmVwbHksIEJSX0RFQURfUkVQTFkpOworCWJpbmRlcl9yZWxlYXNlX3dvcmsoJnRocmVhZC0+dG9kbyk7CisJa2ZyZWUodGhyZWFkKTsKKwliaW5kZXJfc3RhdHMub2JqX2RlbGV0ZWRbQklOREVSX1NUQVRfVEhSRUFEXSsrOworCXJldHVybiBhY3RpdmVfdHJhbnNhY3Rpb25zOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGJpbmRlcl9wb2xsKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBiaW5kZXJfdGhyZWFkICp0aHJlYWQgPSBOVUxMOworCWludCB3YWl0X2Zvcl9wcm9jX3dvcms7CisKKwltdXRleF9sb2NrKCZiaW5kZXJfbG9jayk7CisJdGhyZWFkID0gYmluZGVyX2dldF90aHJlYWQocHJvYyk7CisKKwl3YWl0X2Zvcl9wcm9jX3dvcmsgPSB0aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrID09IE5VTEwgJiYKKwkJbGlzdF9lbXB0eSgmdGhyZWFkLT50b2RvKSAmJiB0aHJlYWQtPnJldHVybl9lcnJvciA9PSBCUl9PSzsKKwltdXRleF91bmxvY2soJmJpbmRlcl9sb2NrKTsKKworCWlmICh3YWl0X2Zvcl9wcm9jX3dvcmspIHsKKwkJaWYgKGJpbmRlcl9oYXNfcHJvY193b3JrKHByb2MsIHRocmVhZCkpCisJCQlyZXR1cm4gUE9MTElOOworCQlwb2xsX3dhaXQoZmlscCwgJnByb2MtPndhaXQsIHdhaXQpOworCQlpZiAoYmluZGVyX2hhc19wcm9jX3dvcmsocHJvYywgdGhyZWFkKSkKKwkJCXJldHVybiBQT0xMSU47CisJfSBlbHNlIHsKKwkJaWYgKGJpbmRlcl9oYXNfdGhyZWFkX3dvcmsodGhyZWFkKSkKKwkJCXJldHVybiBQT0xMSU47CisJCXBvbGxfd2FpdChmaWxwLCAmdGhyZWFkLT53YWl0LCB3YWl0KTsKKwkJaWYgKGJpbmRlcl9oYXNfdGhyZWFkX3dvcmsodGhyZWFkKSkKKwkJCXJldHVybiBQT0xMSU47CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgbG9uZyBiaW5kZXJfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCByZXQ7CisJc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBiaW5kZXJfdGhyZWFkICp0aHJlYWQ7CisJdW5zaWduZWQgaW50IHNpemUgPSBfSU9DX1NJWkUoY21kKTsKKwl2b2lkIF9fdXNlciAqdWJ1ZiA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCS8qcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyX2lvY3RsOiAlZDolZCAleCAlbHhcbiIsIHByb2MtPnBpZCwgY3VycmVudC0+cGlkLCBjbWQsIGFyZyk7Ki8KKworCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShiaW5kZXJfdXNlcl9lcnJvcl93YWl0LCBiaW5kZXJfc3RvcF9vbl91c2VyX2Vycm9yIDwgMik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW11dGV4X2xvY2soJmJpbmRlcl9sb2NrKTsKKwl0aHJlYWQgPSBiaW5kZXJfZ2V0X3RocmVhZChwcm9jKTsKKwlpZiAodGhyZWFkID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQorCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEJJTkRFUl9XUklURV9SRUFEOiB7CisJCXN0cnVjdCBiaW5kZXJfd3JpdGVfcmVhZCBid3I7CisJCWlmIChzaXplICE9IHNpemVvZihzdHJ1Y3QgYmluZGVyX3dyaXRlX3JlYWQpKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnI7CisJCX0KKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZid3IsIHVidWYsIHNpemVvZihid3IpKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gZXJyOworCQl9CisJCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19SRUFEX1dSSVRFKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZDolZCB3cml0ZSAlbGQgYXQgJTA4bHgsIHJlYWQgJWxkIGF0ICUwOGx4XG4iLAorCQkJICAgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGJ3ci53cml0ZV9zaXplLCBid3Iud3JpdGVfYnVmZmVyLCBid3IucmVhZF9zaXplLCBid3IucmVhZF9idWZmZXIpOworCQlpZiAoYndyLndyaXRlX3NpemUgPiAwKSB7CisJCQlyZXQgPSBiaW5kZXJfdGhyZWFkX3dyaXRlKHByb2MsIHRocmVhZCwgKHZvaWQgX191c2VyICopYndyLndyaXRlX2J1ZmZlciwgYndyLndyaXRlX3NpemUsICZid3Iud3JpdGVfY29uc3VtZWQpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlid3IucmVhZF9jb25zdW1lZCA9IDA7CisJCQkJaWYgKGNvcHlfdG9fdXNlcih1YnVmLCAmYndyLCBzaXplb2YoYndyKSkpCisJCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJZ290byBlcnI7CisJCQl9CisJCX0KKwkJaWYgKGJ3ci5yZWFkX3NpemUgPiAwKSB7CisJCQlyZXQgPSBiaW5kZXJfdGhyZWFkX3JlYWQocHJvYywgdGhyZWFkLCAodm9pZCBfX3VzZXIgKilid3IucmVhZF9idWZmZXIsIGJ3ci5yZWFkX3NpemUsICZid3IucmVhZF9jb25zdW1lZCwgZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCQkJaWYgKCFsaXN0X2VtcHR5KCZwcm9jLT50b2RvKSkKKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnByb2MtPndhaXQpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlpZiAoY29weV90b191c2VyKHVidWYsICZid3IsIHNpemVvZihid3IpKSkKKwkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfUkVBRF9XUklURSkKKwkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6JWQgd3JvdGUgJWxkIG9mICVsZCwgcmVhZCByZXR1cm4gJWxkIG9mICVsZFxuIiwKKwkJCSAgICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBid3Iud3JpdGVfY29uc3VtZWQsIGJ3ci53cml0ZV9zaXplLCBid3IucmVhZF9jb25zdW1lZCwgYndyLnJlYWRfc2l6ZSk7CisJCWlmIChjb3B5X3RvX3VzZXIodWJ1ZiwgJmJ3ciwgc2l6ZW9mKGJ3cikpKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBlcnI7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgQklOREVSX1NFVF9NQVhfVEhSRUFEUzoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZwcm9jLT5tYXhfdGhyZWFkcywgdWJ1Ziwgc2l6ZW9mKHByb2MtPm1heF90aHJlYWRzKSkpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycjsKKwkJfQorCQlicmVhazsKKwljYXNlIEJJTkRFUl9TRVRfQ09OVEVYVF9NR1I6CisJCWlmIChiaW5kZXJfY29udGV4dF9tZ3Jfbm9kZSAhPSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogQklOREVSX1NFVF9DT05URVhUX01HUiBhbHJlYWR5IHNldFxuIik7CisJCQlyZXQgPSAtRUJVU1k7CisJCQlnb3RvIGVycjsKKwkJfQorCQlpZiAoYmluZGVyX2NvbnRleHRfbWdyX3VpZCAhPSAtMSkgeworCQkJaWYgKGJpbmRlcl9jb250ZXh0X21ncl91aWQgIT0gY3VycmVudC0+Y3JlZC0+ZXVpZCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiBCSU5ERVJfU0VUXyIKKwkJCQkgICAgICAgIkNPTlRFWFRfTUdSIGJhZCB1aWQgJWQgIT0gJWRcbiIsCisJCQkJICAgICAgIGN1cnJlbnQtPmNyZWQtPmV1aWQsCisJCQkJICAgICAgIGJpbmRlcl9jb250ZXh0X21ncl91aWQpOworCQkJCXJldCA9IC1FUEVSTTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJfSBlbHNlCisJCQliaW5kZXJfY29udGV4dF9tZ3JfdWlkID0gY3VycmVudC0+Y3JlZC0+ZXVpZDsKKwkJYmluZGVyX2NvbnRleHRfbWdyX25vZGUgPSBiaW5kZXJfbmV3X25vZGUocHJvYywgTlVMTCwgTlVMTCk7CisJCWlmIChiaW5kZXJfY29udGV4dF9tZ3Jfbm9kZSA9PSBOVUxMKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBlcnI7CisJCX0KKwkJYmluZGVyX2NvbnRleHRfbWdyX25vZGUtPmxvY2FsX3dlYWtfcmVmcysrOworCQliaW5kZXJfY29udGV4dF9tZ3Jfbm9kZS0+bG9jYWxfc3Ryb25nX3JlZnMrKzsKKwkJYmluZGVyX2NvbnRleHRfbWdyX25vZGUtPmhhc19zdHJvbmdfcmVmID0gMTsKKwkJYmluZGVyX2NvbnRleHRfbWdyX25vZGUtPmhhc193ZWFrX3JlZiA9IDE7CisJCWJyZWFrOworCWNhc2UgQklOREVSX1RIUkVBRF9FWElUOgorCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfVEhSRUFEUykKKwkJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQ6JWQgZXhpdFxuIiwKKwkJCSAgICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkKTsKKwkJYmluZGVyX2ZyZWVfdGhyZWFkKHByb2MsIHRocmVhZCk7CisJCXRocmVhZCA9IE5VTEw7CisJCWJyZWFrOworCWNhc2UgQklOREVSX1ZFUlNJT046CisJCWlmIChzaXplICE9IHNpemVvZihzdHJ1Y3QgYmluZGVyX3ZlcnNpb24pKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnI7CisJCX0KKwkJaWYgKHB1dF91c2VyKEJJTkRFUl9DVVJSRU5UX1BST1RPQ09MX1ZFUlNJT04sICYoKHN0cnVjdCBiaW5kZXJfdmVyc2lvbiAqKXVidWYpLT5wcm90b2NvbF92ZXJzaW9uKSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKwlyZXQgPSAwOworZXJyOgorCWlmICh0aHJlYWQpCisJCXRocmVhZC0+bG9vcGVyICY9IH5CSU5ERVJfTE9PUEVSX1NUQVRFX05FRURfUkVUVVJOOworCW11dGV4X3VubG9jaygmYmluZGVyX2xvY2spOworCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShiaW5kZXJfdXNlcl9lcnJvcl93YWl0LCBiaW5kZXJfc3RvcF9vbl91c2VyX2Vycm9yIDwgMik7CisJaWYgKHJldCAmJiByZXQgIT0gLUVSRVNUQVJUU1lTKQorCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiVkIGlvY3RsICV4ICVseCByZXR1cm5lZCAlZFxuIiwgcHJvYy0+cGlkLCBjdXJyZW50LT5waWQsIGNtZCwgYXJnLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGJpbmRlcl92bWFfb3BlbihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MgPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKKwlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfT1BFTl9DTE9TRSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiAlZCBvcGVuIHZtIGFyZWEgJWx4LSVseCAoJWxkIEspIHZtYSAlbHggcGFnZXAgJWx4XG4iLCBwcm9jLT5waWQsIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kLCAodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSAvIFNaXzFLLCB2bWEtPnZtX2ZsYWdzLCB2bWEtPnZtX3BhZ2VfcHJvdC5wZ3Byb3QpOworCWR1bXBfc3RhY2soKTsKK30KK3N0YXRpYyB2b2lkIGJpbmRlcl92bWFfY2xvc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jID0gdm1hLT52bV9wcml2YXRlX2RhdGE7CisJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX09QRU5fQ0xPU0UpCisJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcjogJWQgY2xvc2Ugdm0gYXJlYSAlbHgtJWx4ICglbGQgSykgdm1hICVseCBwYWdlcCAlbHhcbiIsIHByb2MtPnBpZCwgdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQsICh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpIC8gU1pfMUssIHZtYS0+dm1fZmxhZ3MsIHZtYS0+dm1fcGFnZV9wcm90LnBncHJvdCk7CisJcHJvYy0+dm1hID0gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBiaW5kZXJfdm1fb3BzID0geworCS5vcGVuID0gYmluZGVyX3ZtYV9vcGVuLAorCS5jbG9zZSA9IGJpbmRlcl92bWFfY2xvc2UsCit9OworCitzdGF0aWMgaW50IGJpbmRlcl9tbWFwKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWE7CisJc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWNvbnN0IGNoYXIgKmZhaWx1cmVfc3RyaW5nOworCXN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXI7CisKKwlpZiAoKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkgPiBTWl80TSkKKwkJdm1hLT52bV9lbmQgPSB2bWEtPnZtX3N0YXJ0ICsgU1pfNE07CisKKwlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfT1BFTl9DTE9TRSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyX21tYXA6ICVkICVseC0lbHggKCVsZCBLKSB2bWEgJWx4IHBhZ2VwICVseFxuIiwgcHJvYy0+cGlkLCB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCwgKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkgLyBTWl8xSywgdm1hLT52bV9mbGFncywgdm1hLT52bV9wYWdlX3Byb3QucGdwcm90KTsKKworCWlmICh2bWEtPnZtX2ZsYWdzICYgRk9SQklEREVOX01NQVBfRkxBR1MpIHsKKwkJcmV0ID0gLUVQRVJNOworCQlmYWlsdXJlX3N0cmluZyA9ICJiYWQgdm1fZmxhZ3MiOworCQlnb3RvIGVycl9iYWRfYXJnOworCX0KKwl2bWEtPnZtX2ZsYWdzID0gKHZtYS0+dm1fZmxhZ3MgfCBWTV9ET05UQ09QWSkgJiB+Vk1fTUFZV1JJVEU7CisKKwlhcmVhID0gZ2V0X3ZtX2FyZWEodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LCBWTV9JT1JFTUFQKTsKKwlpZiAoYXJlYSA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWZhaWx1cmVfc3RyaW5nID0gImdldF92bV9hcmVhIjsKKwkJZ290byBlcnJfZ2V0X3ZtX2FyZWFfZmFpbGVkOworCX0KKwlwcm9jLT5idWZmZXIgPSBhcmVhLT5hZGRyOworCXByb2MtPnVzZXJfYnVmZmVyX29mZnNldCA9IHZtYS0+dm1fc3RhcnQgLSAoc2l6ZV90KXByb2MtPmJ1ZmZlcjsKKworI2lmZGVmIENPTkZJR19DUFVfQ0FDSEVfVklQVAorCWlmIChjYWNoZV9pc192aXB0X2FsaWFzaW5nKCkpIHsKKwkJd2hpbGUgKENBQ0hFX0NPTE9VUigodm1hLT52bV9zdGFydCBeICh1aW50MzJfdClwcm9jLT5idWZmZXIpKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyX21tYXA6ICVkICVseC0lbHggbWFwcyAlcCBiYWQgYWxpZ25tZW50XG4iLCBwcm9jLT5waWQsIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kLCBwcm9jLT5idWZmZXIpOworCQkJdm1hLT52bV9zdGFydCArPSBQQUdFX1NJWkU7CisJCX0KKwl9CisjZW5kaWYKKwlwcm9jLT5wYWdlcyA9IGt6YWxsb2Moc2l6ZW9mKHByb2MtPnBhZ2VzWzBdKSAqICgodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSAvIFBBR0VfU0laRSksIEdGUF9LRVJORUwpOworCWlmIChwcm9jLT5wYWdlcyA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWZhaWx1cmVfc3RyaW5nID0gImFsbG9jIHBhZ2UgYXJyYXkiOworCQlnb3RvIGVycl9hbGxvY19wYWdlc19mYWlsZWQ7CisJfQorCXByb2MtPmJ1ZmZlcl9zaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OworCisJdm1hLT52bV9vcHMgPSAmYmluZGVyX3ZtX29wczsKKwl2bWEtPnZtX3ByaXZhdGVfZGF0YSA9IHByb2M7CisKKwlpZiAoYmluZGVyX3VwZGF0ZV9wYWdlX3JhbmdlKHByb2MsIDEsIHByb2MtPmJ1ZmZlciwgcHJvYy0+YnVmZmVyICsgUEFHRV9TSVpFLCB2bWEpKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWZhaWx1cmVfc3RyaW5nID0gImFsbG9jIHNtYWxsIGJ1ZiI7CisJCWdvdG8gZXJyX2FsbG9jX3NtYWxsX2J1Zl9mYWlsZWQ7CisJfQorCWJ1ZmZlciA9IHByb2MtPmJ1ZmZlcjsKKwlJTklUX0xJU1RfSEVBRCgmcHJvYy0+YnVmZmVycyk7CisJbGlzdF9hZGQoJmJ1ZmZlci0+ZW50cnksICZwcm9jLT5idWZmZXJzKTsKKwlidWZmZXItPmZyZWUgPSAxOworCWJpbmRlcl9pbnNlcnRfZnJlZV9idWZmZXIocHJvYywgYnVmZmVyKTsKKwlwcm9jLT5mcmVlX2FzeW5jX3NwYWNlID0gcHJvYy0+YnVmZmVyX3NpemUgLyAyOworCWJhcnJpZXIoKTsKKwlwcm9jLT52bWEgPSB2bWE7CisKKwkvKnByaW50ayhLRVJOX0lORk8gImJpbmRlcl9tbWFwOiAlZCAlbHgtJWx4IG1hcHMgJXBcbiIsIHByb2MtPnBpZCwgdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQsIHByb2MtPmJ1ZmZlcik7Ki8KKwlyZXR1cm4gMDsKKworZXJyX2FsbG9jX3NtYWxsX2J1Zl9mYWlsZWQ6CisJa2ZyZWUocHJvYy0+cGFnZXMpOworZXJyX2FsbG9jX3BhZ2VzX2ZhaWxlZDoKKwl2ZnJlZShwcm9jLT5idWZmZXIpOworZXJyX2dldF92bV9hcmVhX2ZhaWxlZDoKKwltdXRleF91bmxvY2soJmJpbmRlcl9sb2NrKTsKK2Vycl9iYWRfYXJnOgorCXByaW50ayhLRVJOX0VSUiAiYmluZGVyX21tYXA6ICVkICVseC0lbHggJXMgZmFpbGVkICVkXG4iLCBwcm9jLT5waWQsIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kLCBmYWlsdXJlX3N0cmluZywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGJpbmRlcl9vcGVuKHN0cnVjdCBpbm9kZSAqbm9kcCwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jOworCisJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX09QRU5fQ0xPU0UpCisJCXByaW50ayhLRVJOX0lORk8gImJpbmRlcl9vcGVuOiAlZDolZFxuIiwgY3VycmVudC0+Z3JvdXBfbGVhZGVyLT5waWQsIGN1cnJlbnQtPnBpZCk7CisKKwlwcm9jID0ga3phbGxvYyhzaXplb2YoKnByb2MpLCBHRlBfS0VSTkVMKTsKKwlpZiAocHJvYyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlnZXRfdGFza19zdHJ1Y3QoY3VycmVudCk7CisJcHJvYy0+dHNrID0gY3VycmVudDsKKwlJTklUX0xJU1RfSEVBRCgmcHJvYy0+dG9kbyk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcHJvYy0+d2FpdCk7CisJcHJvYy0+ZGVmYXVsdF9wcmlvcml0eSA9IHRhc2tfbmljZShjdXJyZW50KTsKKwltdXRleF9sb2NrKCZiaW5kZXJfbG9jayk7CisJYmluZGVyX3N0YXRzLm9ial9jcmVhdGVkW0JJTkRFUl9TVEFUX1BST0NdKys7CisJaGxpc3RfYWRkX2hlYWQoJnByb2MtPnByb2Nfbm9kZSwgJmJpbmRlcl9wcm9jcyk7CisJcHJvYy0+cGlkID0gY3VycmVudC0+Z3JvdXBfbGVhZGVyLT5waWQ7CisJSU5JVF9MSVNUX0hFQUQoJnByb2MtPmRlbGl2ZXJlZF9kZWF0aCk7CisJZmlscC0+cHJpdmF0ZV9kYXRhID0gcHJvYzsKKwltdXRleF91bmxvY2soJmJpbmRlcl9sb2NrKTsKKworCWlmIChiaW5kZXJfcHJvY19kaXJfZW50cnlfcHJvYykgeworCQljaGFyIHN0cmJ1ZlsxMV07CisJCXNucHJpbnRmKHN0cmJ1Ziwgc2l6ZW9mKHN0cmJ1ZiksICIldSIsIHByb2MtPnBpZCk7CisJCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoc3RyYnVmLCBTX0lSVUdPLCBiaW5kZXJfcHJvY19kaXJfZW50cnlfcHJvYywgYmluZGVyX3JlYWRfcHJvY19wcm9jLCBwcm9jKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiaW5kZXJfZmx1c2goc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpCit7CisJc3RydWN0IHJiX25vZGUgKm47CisJc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWludCB3YWtlX2NvdW50ID0gMDsKKworCW11dGV4X2xvY2soJmJpbmRlcl9sb2NrKTsKKwlmb3IgKG4gPSByYl9maXJzdCgmcHJvYy0+dGhyZWFkcyk7IG4gIT0gTlVMTDsgbiA9IHJiX25leHQobikpIHsKKwkJc3RydWN0IGJpbmRlcl90aHJlYWQgKnRocmVhZCA9IHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfdGhyZWFkLCByYl9ub2RlKTsKKwkJdGhyZWFkLT5sb29wZXIgfD0gQklOREVSX0xPT1BFUl9TVEFURV9ORUVEX1JFVFVSTjsKKwkJaWYgKHRocmVhZC0+bG9vcGVyICYgQklOREVSX0xPT1BFUl9TVEFURV9XQUlUSU5HKSB7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnRocmVhZC0+d2FpdCk7CisJCQl3YWtlX2NvdW50Kys7CisJCX0KKwl9CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmcHJvYy0+d2FpdCk7CisJbXV0ZXhfdW5sb2NrKCZiaW5kZXJfbG9jayk7CisKKwlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfT1BFTl9DTE9TRSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyX2ZsdXNoOiAlZCB3b2tlICVkIHRocmVhZHNcbiIsIHByb2MtPnBpZCwgd2FrZV9jb3VudCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiaW5kZXJfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKm5vZHAsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7CisJc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdDsKKwlzdHJ1Y3QgcmJfbm9kZSAqbjsKKwlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJaW50IHRocmVhZHMsIG5vZGVzLCBpbmNvbWluZ19yZWZzLCBvdXRnb2luZ19yZWZzLCBidWZmZXJzLCBhY3RpdmVfdHJhbnNhY3Rpb25zLCBwYWdlX2NvdW50OworCisJaWYgKGJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9wcm9jKSB7CisJCWNoYXIgc3RyYnVmWzExXTsKKwkJc25wcmludGYoc3RyYnVmLCBzaXplb2Yoc3RyYnVmKSwgIiV1IiwgcHJvYy0+cGlkKTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoc3RyYnVmLCBiaW5kZXJfcHJvY19kaXJfZW50cnlfcHJvYyk7CisJfQorCW11dGV4X2xvY2soJmJpbmRlcl9sb2NrKTsKKwlobGlzdF9kZWwoJnByb2MtPnByb2Nfbm9kZSk7CisJaWYgKGJpbmRlcl9jb250ZXh0X21ncl9ub2RlICYmIGJpbmRlcl9jb250ZXh0X21ncl9ub2RlLT5wcm9jID09IHByb2MpIHsKKwkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0RFQURfQklOREVSKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyX3JlbGVhc2U6ICVkIGNvbnRleHRfbWdyX25vZGUgZ29uZVxuIiwgcHJvYy0+cGlkKTsKKwkJYmluZGVyX2NvbnRleHRfbWdyX25vZGUgPSBOVUxMOworCX0KKworCXRocmVhZHMgPSAwOworCWFjdGl2ZV90cmFuc2FjdGlvbnMgPSAwOworCXdoaWxlICgobiA9IHJiX2ZpcnN0KCZwcm9jLT50aHJlYWRzKSkpIHsKKwkJc3RydWN0IGJpbmRlcl90aHJlYWQgKnRocmVhZCA9IHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfdGhyZWFkLCByYl9ub2RlKTsKKwkJdGhyZWFkcysrOworCQlhY3RpdmVfdHJhbnNhY3Rpb25zICs9IGJpbmRlcl9mcmVlX3RocmVhZChwcm9jLCB0aHJlYWQpOworCX0KKwlub2RlcyA9IDA7CisJaW5jb21pbmdfcmVmcyA9IDA7CisJd2hpbGUgKChuID0gcmJfZmlyc3QoJnByb2MtPm5vZGVzKSkpIHsKKwkJc3RydWN0IGJpbmRlcl9ub2RlICpub2RlID0gcmJfZW50cnkobiwgc3RydWN0IGJpbmRlcl9ub2RlLCByYl9ub2RlKTsKKworCQlub2RlcysrOworCQlyYl9lcmFzZSgmbm9kZS0+cmJfbm9kZSwgJnByb2MtPm5vZGVzKTsKKwkJbGlzdF9kZWxfaW5pdCgmbm9kZS0+d29yay5lbnRyeSk7CisJCWlmIChobGlzdF9lbXB0eSgmbm9kZS0+cmVmcykpIHsKKwkJCWtmcmVlKG5vZGUpOworCQkJYmluZGVyX3N0YXRzLm9ial9kZWxldGVkW0JJTkRFUl9TVEFUX05PREVdKys7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgYmluZGVyX3JlZiAqcmVmOworCQkJaW50IGRlYXRoID0gMDsKKworCQkJbm9kZS0+cHJvYyA9IE5VTEw7CisJCQlub2RlLT5sb2NhbF9zdHJvbmdfcmVmcyA9IDA7CisJCQlub2RlLT5sb2NhbF93ZWFrX3JlZnMgPSAwOworCQkJaGxpc3RfYWRkX2hlYWQoJm5vZGUtPmRlYWRfbm9kZSwgJmJpbmRlcl9kZWFkX25vZGVzKTsKKworCQkJaGxpc3RfZm9yX2VhY2hfZW50cnkocmVmLCBwb3MsICZub2RlLT5yZWZzLCBub2RlX2VudHJ5KSB7CisJCQkJaW5jb21pbmdfcmVmcysrOworCQkJCWlmIChyZWYtPmRlYXRoKSB7CisJCQkJCWRlYXRoKys7CisJCQkJCWlmIChsaXN0X2VtcHR5KCZyZWYtPmRlYXRoLT53b3JrLmVudHJ5KSkgeworCQkJCQkJcmVmLT5kZWF0aC0+d29yay50eXBlID0gQklOREVSX1dPUktfREVBRF9CSU5ERVI7CisJCQkJCQlsaXN0X2FkZF90YWlsKCZyZWYtPmRlYXRoLT53b3JrLmVudHJ5LCAmcmVmLT5wcm9jLT50b2RvKTsKKwkJCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcmVmLT5wcm9jLT53YWl0KTsKKwkJCQkJfSBlbHNlCisJCQkJCQlCVUcoKTsKKwkJCQl9CisJCQl9CisJCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfREVBRF9CSU5ERVIpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyOiBub2RlICVkIG5vdyBkZWFkLCByZWZzICVkLCBkZWF0aCAlZFxuIiwgbm9kZS0+ZGVidWdfaWQsIGluY29taW5nX3JlZnMsIGRlYXRoKTsKKwkJfQorCX0KKwlvdXRnb2luZ19yZWZzID0gMDsKKwl3aGlsZSAoKG4gPSByYl9maXJzdCgmcHJvYy0+cmVmc19ieV9kZXNjKSkpIHsKKwkJc3RydWN0IGJpbmRlcl9yZWYgKnJlZiA9IHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfcmVmLCByYl9ub2RlX2Rlc2MpOworCQlvdXRnb2luZ19yZWZzKys7CisJCWJpbmRlcl9kZWxldGVfcmVmKHJlZik7CisJfQorCWJpbmRlcl9yZWxlYXNlX3dvcmsoJnByb2MtPnRvZG8pOworCWJ1ZmZlcnMgPSAwOworCisJd2hpbGUgKChuID0gcmJfZmlyc3QoJnByb2MtPmFsbG9jYXRlZF9idWZmZXJzKSkpIHsKKwkJc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlciA9IHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfYnVmZmVyLCByYl9ub2RlKTsKKwkJdCA9IGJ1ZmZlci0+dHJhbnNhY3Rpb247CisJCWlmICh0KSB7CisJCQl0LT5idWZmZXIgPSBOVUxMOworCQkJYnVmZmVyLT50cmFuc2FjdGlvbiA9IE5VTEw7CisJCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogcmVsZWFzZSBwcm9jICVkLCB0cmFuc2FjdGlvbiAlZCwgbm90IGZyZWVkXG4iLCBwcm9jLT5waWQsIHQtPmRlYnVnX2lkKTsKKwkJCS8qQlVHKCk7Ki8KKwkJfQorCQliaW5kZXJfZnJlZV9idWYocHJvYywgYnVmZmVyKTsKKwkJYnVmZmVycysrOworCX0KKworCWJpbmRlcl9zdGF0cy5vYmpfZGVsZXRlZFtCSU5ERVJfU1RBVF9QUk9DXSsrOworCW11dGV4X3VubG9jaygmYmluZGVyX2xvY2spOworCisJcGFnZV9jb3VudCA9IDA7CisJaWYgKHByb2MtPnBhZ2VzKSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgcHJvYy0+YnVmZmVyX3NpemUgLyBQQUdFX1NJWkU7IGkrKykgeworCQkJaWYgKHByb2MtPnBhZ2VzW2ldKSB7CisJCQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQykKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYmluZGVyX3JlbGVhc2U6ICVkOiBwYWdlICVkIGF0ICVwIG5vdCBmcmVlZFxuIiwgcHJvYy0+cGlkLCBpLCBwcm9jLT5idWZmZXIgKyBpICogUEFHRV9TSVpFKTsKKwkJCQlfX2ZyZWVfcGFnZShwcm9jLT5wYWdlc1tpXSk7CisJCQkJcGFnZV9jb3VudCsrOworCQkJfQorCQl9CisJCWtmcmVlKHByb2MtPnBhZ2VzKTsKKwkJdmZyZWUocHJvYy0+YnVmZmVyKTsKKwl9CisKKwlwdXRfdGFza19zdHJ1Y3QocHJvYy0+dHNrKTsKKworCWlmIChiaW5kZXJfZGVidWdfbWFzayAmIEJJTkRFUl9ERUJVR19PUEVOX0NMT1NFKQorCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXJfcmVsZWFzZTogJWQgdGhyZWFkcyAlZCwgbm9kZXMgJWQgKHJlZiAlZCksIHJlZnMgJWQsIGFjdGl2ZSB0cmFuc2FjdGlvbnMgJWQsIGJ1ZmZlcnMgJWQsIHBhZ2VzICVkXG4iLAorCQkgICAgICAgcHJvYy0+cGlkLCB0aHJlYWRzLCBub2RlcywgaW5jb21pbmdfcmVmcywgb3V0Z29pbmdfcmVmcywgYWN0aXZlX3RyYW5zYWN0aW9ucywgYnVmZmVycywgcGFnZV9jb3VudCk7CisKKwlrZnJlZShwcm9jKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNoYXIgKnByaW50X2JpbmRlcl90cmFuc2FjdGlvbihjaGFyICpidWYsIGNoYXIgKmVuZCwgY29uc3QgY2hhciAqcHJlZml4LCBzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICp0KQoreworCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiVzICVkOiAlcCBmcm9tICVkOiVkIHRvICVkOiVkIGNvZGUgJXggZmxhZ3MgJXggcHJpICVsZCByJWQiLAorCQkJcHJlZml4LCB0LT5kZWJ1Z19pZCwgdCwgdC0+ZnJvbSA/IHQtPmZyb20tPnByb2MtPnBpZCA6IDAsCisJCQl0LT5mcm9tID8gdC0+ZnJvbS0+cGlkIDogMCwKKwkJCXQtPnRvX3Byb2MgPyB0LT50b19wcm9jLT5waWQgOiAwLAorCQkJdC0+dG9fdGhyZWFkID8gdC0+dG9fdGhyZWFkLT5waWQgOiAwLAorCQkJdC0+Y29kZSwgdC0+ZmxhZ3MsIHQtPnByaW9yaXR5LCB0LT5uZWVkX3JlcGx5KTsKKwlpZiAoYnVmID49IGVuZCkKKwkJcmV0dXJuIGJ1ZjsKKwlpZiAodC0+YnVmZmVyID09IE5VTEwpIHsKKwkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiIGJ1ZmZlciBmcmVlXG4iKTsKKwkJcmV0dXJuIGJ1ZjsKKwl9CisJaWYgKHQtPmJ1ZmZlci0+dGFyZ2V0X25vZGUpIHsKKwkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiIG5vZGUgJWQiLAorCQkJCXQtPmJ1ZmZlci0+dGFyZ2V0X25vZGUtPmRlYnVnX2lkKTsKKwkJaWYgKGJ1ZiA+PSBlbmQpCisJCQlyZXR1cm4gYnVmOworCX0KKwlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIgc2l6ZSAlemQ6JXpkIGRhdGEgJXBcbiIsCisJCQl0LT5idWZmZXItPmRhdGFfc2l6ZSwgdC0+YnVmZmVyLT5vZmZzZXRzX3NpemUsCisJCQl0LT5idWZmZXItPmRhdGEpOworCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyBjaGFyICpwcmludF9iaW5kZXJfYnVmZmVyKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLCBjb25zdCBjaGFyICpwcmVmaXgsIHN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXIpCit7CisJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiJXMgJWQ6ICVwIHNpemUgJXpkOiV6ZCAlc1xuIiwKKwkJCXByZWZpeCwgYnVmZmVyLT5kZWJ1Z19pZCwgYnVmZmVyLT5kYXRhLAorCQkJYnVmZmVyLT5kYXRhX3NpemUsIGJ1ZmZlci0+b2Zmc2V0c19zaXplLAorCQkJYnVmZmVyLT50cmFuc2FjdGlvbiA/ICJhY3RpdmUiIDogImRlbGl2ZXJlZCIpOworCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyBjaGFyICpwcmludF9iaW5kZXJfd29yayhjaGFyICpidWYsIGNoYXIgKmVuZCwgY29uc3QgY2hhciAqcHJlZml4LAorCWNvbnN0IGNoYXIgKnRyYW5zYWN0aW9uX3ByZWZpeCwgc3RydWN0IGJpbmRlcl93b3JrICp3KQoreworCXN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICp0OworCisJc3dpdGNoICh3LT50eXBlKSB7CisJY2FzZSBCSU5ERVJfV09SS19UUkFOU0FDVElPTjoKKwkJdCA9IGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uLCB3b3JrKTsKKwkJYnVmID0gcHJpbnRfYmluZGVyX3RyYW5zYWN0aW9uKGJ1ZiwgZW5kLCB0cmFuc2FjdGlvbl9wcmVmaXgsIHQpOworCQlicmVhazsKKwljYXNlIEJJTkRFUl9XT1JLX1RSQU5TQUNUSU9OX0NPTVBMRVRFOgorCQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsCisJCQkJIiVzdHJhbnNhY3Rpb24gY29tcGxldGVcbiIsIHByZWZpeCk7CisJCWJyZWFrOworCWNhc2UgQklOREVSX1dPUktfTk9ERToKKwkJbm9kZSA9IGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgYmluZGVyX25vZGUsIHdvcmspOworCQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIlc25vZGUgd29yayAlZDogdSVwIGMlcFxuIiwKKwkJCQlwcmVmaXgsIG5vZGUtPmRlYnVnX2lkLCBub2RlLT5wdHIsIG5vZGUtPmNvb2tpZSk7CisJCWJyZWFrOworCWNhc2UgQklOREVSX1dPUktfREVBRF9CSU5ERVI6CisJCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiVzaGFzIGRlYWQgYmluZGVyXG4iLCBwcmVmaXgpOworCQlicmVhazsKKwljYXNlIEJJTkRFUl9XT1JLX0RFQURfQklOREVSX0FORF9DTEVBUjoKKwkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLAorCQkJCSIlc2hhcyBjbGVhcmVkIGRlYWQgYmluZGVyXG4iLCBwcmVmaXgpOworCQlicmVhazsKKwljYXNlIEJJTkRFUl9XT1JLX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTjoKKwkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLAorCQkJCSIlc2hhcyBjbGVhcmVkIGRlYXRoIG5vdGlmaWNhdGlvblxuIiwgcHJlZml4KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiJXN1bmtub3duIHdvcms6IHR5cGUgJWRcbiIsCisJCQkJcHJlZml4LCB3LT50eXBlKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyBjaGFyICpwcmludF9iaW5kZXJfdGhyZWFkKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLCBzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGhyZWFkLCBpbnQgcHJpbnRfYWx3YXlzKQoreworCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKnQ7CisJc3RydWN0IGJpbmRlcl93b3JrICp3OworCWNoYXIgKnN0YXJ0X2J1ZiA9IGJ1ZjsKKwljaGFyICpoZWFkZXJfYnVmOworCisJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiICB0aHJlYWQgJWQ6IGwgJTAyeFxuIiwgdGhyZWFkLT5waWQsIHRocmVhZC0+bG9vcGVyKTsKKwloZWFkZXJfYnVmID0gYnVmOworCXQgPSB0aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrOworCXdoaWxlICh0KSB7CisJCWlmIChidWYgPj0gZW5kKQorCQkJYnJlYWs7CisJCWlmICh0LT5mcm9tID09IHRocmVhZCkgeworCQkJYnVmID0gcHJpbnRfYmluZGVyX3RyYW5zYWN0aW9uKGJ1ZiwgZW5kLCAiICAgIG91dGdvaW5nIHRyYW5zYWN0aW9uIiwgdCk7CisJCQl0ID0gdC0+ZnJvbV9wYXJlbnQ7CisJCX0gZWxzZSBpZiAodC0+dG9fdGhyZWFkID09IHRocmVhZCkgeworCQkJYnVmID0gcHJpbnRfYmluZGVyX3RyYW5zYWN0aW9uKGJ1ZiwgZW5kLCAiICAgIGluY29taW5nIHRyYW5zYWN0aW9uIiwgdCk7CisJCQl0ID0gdC0+dG9fcGFyZW50OworCQl9IGVsc2UgeworCQkJYnVmID0gcHJpbnRfYmluZGVyX3RyYW5zYWN0aW9uKGJ1ZiwgZW5kLCAiICAgIGJhZCB0cmFuc2FjdGlvbiIsIHQpOworCQkJdCA9IE5VTEw7CisJCX0KKwl9CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh3LCAmdGhyZWFkLT50b2RvLCBlbnRyeSkgeworCQlpZiAoYnVmID49IGVuZCkKKwkJCWJyZWFrOworCQlidWYgPSBwcmludF9iaW5kZXJfd29yayhidWYsIGVuZCwgIiAgICAiLAorCQkJCQkiICAgIHBlbmRpbmcgdHJhbnNhY3Rpb24iLCB3KTsKKwl9CisJaWYgKCFwcmludF9hbHdheXMgJiYgYnVmID09IGhlYWRlcl9idWYpCisJCWJ1ZiA9IHN0YXJ0X2J1ZjsKKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgY2hhciAqcHJpbnRfYmluZGVyX25vZGUoY2hhciAqYnVmLCBjaGFyICplbmQsIHN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgYmluZGVyX3JlZiAqcmVmOworCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7CisJc3RydWN0IGJpbmRlcl93b3JrICp3OworCWludCBjb3VudDsKKwljb3VudCA9IDA7CisJaGxpc3RfZm9yX2VhY2hfZW50cnkocmVmLCBwb3MsICZub2RlLT5yZWZzLCBub2RlX2VudHJ5KQorCQljb3VudCsrOworCisJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiICBub2RlICVkOiB1JXAgYyVwIGhzICVkIGh3ICVkIGxzICVkIGx3ICVkIGlzICVkIGl3ICVkIiwKKwkJCW5vZGUtPmRlYnVnX2lkLCBub2RlLT5wdHIsIG5vZGUtPmNvb2tpZSwKKwkJCW5vZGUtPmhhc19zdHJvbmdfcmVmLCBub2RlLT5oYXNfd2Vha19yZWYsCisJCQlub2RlLT5sb2NhbF9zdHJvbmdfcmVmcywgbm9kZS0+bG9jYWxfd2Vha19yZWZzLAorCQkJbm9kZS0+aW50ZXJuYWxfc3Ryb25nX3JlZnMsIGNvdW50KTsKKwlpZiAoYnVmID49IGVuZCkKKwkJcmV0dXJuIGJ1ZjsKKwlpZiAoY291bnQpIHsKKwkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiIHByb2MiKTsKKwkJaWYgKGJ1ZiA+PSBlbmQpCisJCQlyZXR1cm4gYnVmOworCQlobGlzdF9mb3JfZWFjaF9lbnRyeShyZWYsIHBvcywgJm5vZGUtPnJlZnMsIG5vZGVfZW50cnkpIHsKKwkJCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiAlZCIsIHJlZi0+cHJvYy0+cGlkKTsKKwkJCWlmIChidWYgPj0gZW5kKQorCQkJCXJldHVybiBidWY7CisJCX0KKwl9CisJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiXG4iKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHcsICZub2RlLT5hc3luY190b2RvLCBlbnRyeSkgeworCQlpZiAoYnVmID49IGVuZCkKKwkJCWJyZWFrOworCQlidWYgPSBwcmludF9iaW5kZXJfd29yayhidWYsIGVuZCwgIiAgICAiLAorCQkJCQkiICAgIHBlbmRpbmcgYXN5bmMgdHJhbnNhY3Rpb24iLCB3KTsKKwl9CisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIGNoYXIgKnByaW50X2JpbmRlcl9yZWYoY2hhciAqYnVmLCBjaGFyICplbmQsIHN0cnVjdCBiaW5kZXJfcmVmICpyZWYpCit7CisJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiICByZWYgJWQ6IGRlc2MgJWQgJXNub2RlICVkIHMgJWQgdyAlZCBkICVwXG4iLAorCQkJcmVmLT5kZWJ1Z19pZCwgcmVmLT5kZXNjLCByZWYtPm5vZGUtPnByb2MgPyAiIiA6ICJkZWFkICIsCisJCQlyZWYtPm5vZGUtPmRlYnVnX2lkLCByZWYtPnN0cm9uZywgcmVmLT53ZWFrLCByZWYtPmRlYXRoKTsKKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgY2hhciAqcHJpbnRfYmluZGVyX3Byb2MoY2hhciAqYnVmLCBjaGFyICplbmQsIHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgaW50IHByaW50X2FsbCkKK3sKKwlzdHJ1Y3QgYmluZGVyX3dvcmsgKnc7CisJc3RydWN0IHJiX25vZGUgKm47CisJY2hhciAqc3RhcnRfYnVmID0gYnVmOworCWNoYXIgKmhlYWRlcl9idWY7CisKKwlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICJwcm9jICVkXG4iLCBwcm9jLT5waWQpOworCWhlYWRlcl9idWYgPSBidWY7CisKKwlmb3IgKG4gPSByYl9maXJzdCgmcHJvYy0+dGhyZWFkcyk7IG4gIT0gTlVMTCAmJiBidWYgPCBlbmQ7IG4gPSByYl9uZXh0KG4pKQorCQlidWYgPSBwcmludF9iaW5kZXJfdGhyZWFkKGJ1ZiwgZW5kLCByYl9lbnRyeShuLCBzdHJ1Y3QgYmluZGVyX3RocmVhZCwgcmJfbm9kZSksIHByaW50X2FsbCk7CisJZm9yIChuID0gcmJfZmlyc3QoJnByb2MtPm5vZGVzKTsgbiAhPSBOVUxMICYmIGJ1ZiA8IGVuZDsgbiA9IHJiX25leHQobikpIHsKKwkJc3RydWN0IGJpbmRlcl9ub2RlICpub2RlID0gcmJfZW50cnkobiwgc3RydWN0IGJpbmRlcl9ub2RlLCByYl9ub2RlKTsKKwkJaWYgKHByaW50X2FsbCB8fCBub2RlLT5oYXNfYXN5bmNfdHJhbnNhY3Rpb24pCisJCQlidWYgPSBwcmludF9iaW5kZXJfbm9kZShidWYsIGVuZCwgbm9kZSk7CisJfQorCWlmIChwcmludF9hbGwpIHsKKwkJZm9yIChuID0gcmJfZmlyc3QoJnByb2MtPnJlZnNfYnlfZGVzYyk7IG4gIT0gTlVMTCAmJiBidWYgPCBlbmQ7IG4gPSByYl9uZXh0KG4pKQorCQkJYnVmID0gcHJpbnRfYmluZGVyX3JlZihidWYsIGVuZCwgcmJfZW50cnkobiwgc3RydWN0IGJpbmRlcl9yZWYsIHJiX25vZGVfZGVzYykpOworCX0KKwlmb3IgKG4gPSByYl9maXJzdCgmcHJvYy0+YWxsb2NhdGVkX2J1ZmZlcnMpOyBuICE9IE5VTEwgJiYgYnVmIDwgZW5kOyBuID0gcmJfbmV4dChuKSkKKwkJYnVmID0gcHJpbnRfYmluZGVyX2J1ZmZlcihidWYsIGVuZCwgIiAgYnVmZmVyIiwgcmJfZW50cnkobiwgc3RydWN0IGJpbmRlcl9idWZmZXIsIHJiX25vZGUpKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHcsICZwcm9jLT50b2RvLCBlbnRyeSkgeworCQlpZiAoYnVmID49IGVuZCkKKwkJCWJyZWFrOworCQlidWYgPSBwcmludF9iaW5kZXJfd29yayhidWYsIGVuZCwgIiAgIiwKKwkJCQkJIiAgcGVuZGluZyB0cmFuc2FjdGlvbiIsIHcpOworCX0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHcsICZwcm9jLT5kZWxpdmVyZWRfZGVhdGgsIGVudHJ5KSB7CisJCWlmIChidWYgPj0gZW5kKQorCQkJYnJlYWs7CisJCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiAgaGFzIGRlbGl2ZXJlZCBkZWFkIGJpbmRlclxuIik7CisJCWJyZWFrOworCX0KKwlpZiAoIXByaW50X2FsbCAmJiBidWYgPT0gaGVhZGVyX2J1ZikKKwkJYnVmID0gc3RhcnRfYnVmOworCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpiaW5kZXJfcmV0dXJuX3N0cmluZ3NbXSA9IHsKKwkiQlJfRVJST1IiLAorCSJCUl9PSyIsCisJIkJSX1RSQU5TQUNUSU9OIiwKKwkiQlJfUkVQTFkiLAorCSJCUl9BQ1FVSVJFX1JFU1VMVCIsCisJIkJSX0RFQURfUkVQTFkiLAorCSJCUl9UUkFOU0FDVElPTl9DT01QTEVURSIsCisJIkJSX0lOQ1JFRlMiLAorCSJCUl9BQ1FVSVJFIiwKKwkiQlJfUkVMRUFTRSIsCisJIkJSX0RFQ1JFRlMiLAorCSJCUl9BVFRFTVBUX0FDUVVJUkUiLAorCSJCUl9OT09QIiwKKwkiQlJfU1BBV05fTE9PUEVSIiwKKwkiQlJfRklOSVNIRUQiLAorCSJCUl9ERUFEX0JJTkRFUiIsCisJIkJSX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTl9ET05FIiwKKwkiQlJfRkFJTEVEX1JFUExZIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmJpbmRlcl9jb21tYW5kX3N0cmluZ3NbXSA9IHsKKwkiQkNfVFJBTlNBQ1RJT04iLAorCSJCQ19SRVBMWSIsCisJIkJDX0FDUVVJUkVfUkVTVUxUIiwKKwkiQkNfRlJFRV9CVUZGRVIiLAorCSJCQ19JTkNSRUZTIiwKKwkiQkNfQUNRVUlSRSIsCisJIkJDX1JFTEVBU0UiLAorCSJCQ19ERUNSRUZTIiwKKwkiQkNfSU5DUkVGU19ET05FIiwKKwkiQkNfQUNRVUlSRV9ET05FIiwKKwkiQkNfQVRURU1QVF9BQ1FVSVJFIiwKKwkiQkNfUkVHSVNURVJfTE9PUEVSIiwKKwkiQkNfRU5URVJfTE9PUEVSIiwKKwkiQkNfRVhJVF9MT09QRVIiLAorCSJCQ19SRVFVRVNUX0RFQVRIX05PVElGSUNBVElPTiIsCisJIkJDX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTiIsCisJIkJDX0RFQURfQklOREVSX0RPTkUiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqYmluZGVyX29ianN0YXRfc3RyaW5nc1tdID0geworCSJwcm9jIiwKKwkidGhyZWFkIiwKKwkibm9kZSIsCisJInJlZiIsCisJImRlYXRoIiwKKwkidHJhbnNhY3Rpb24iLAorCSJ0cmFuc2FjdGlvbl9jb21wbGV0ZSIKK307CisKK3N0YXRpYyBjaGFyICpwcmludF9iaW5kZXJfc3RhdHMoY2hhciAqYnVmLCBjaGFyICplbmQsIGNvbnN0IGNoYXIgKnByZWZpeCwgc3RydWN0IGJpbmRlcl9zdGF0cyAqc3RhdHMpCit7CisJaW50IGk7CisKKwlCVUlMRF9CVUdfT04oQVJSQVlfU0laRShzdGF0cy0+YmMpICE9IEFSUkFZX1NJWkUoYmluZGVyX2NvbW1hbmRfc3RyaW5ncykpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHN0YXRzLT5iYyk7IGkrKykgeworCQlpZiAoc3RhdHMtPmJjW2ldKQorCQkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiJXMlczogJWRcbiIsIHByZWZpeCwKKwkJCQkJYmluZGVyX2NvbW1hbmRfc3RyaW5nc1tpXSwgc3RhdHMtPmJjW2ldKTsKKwkJaWYgKGJ1ZiA+PSBlbmQpCisJCQlyZXR1cm4gYnVmOworCX0KKworCUJVSUxEX0JVR19PTihBUlJBWV9TSVpFKHN0YXRzLT5icikgIT0gQVJSQVlfU0laRShiaW5kZXJfcmV0dXJuX3N0cmluZ3MpKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdGF0cy0+YnIpOyBpKyspIHsKKwkJaWYgKHN0YXRzLT5icltpXSkKKwkJCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiVzJXM6ICVkXG4iLCBwcmVmaXgsCisJCQkJCWJpbmRlcl9yZXR1cm5fc3RyaW5nc1tpXSwgc3RhdHMtPmJyW2ldKTsKKwkJaWYgKGJ1ZiA+PSBlbmQpCisJCQlyZXR1cm4gYnVmOworCX0KKworCUJVSUxEX0JVR19PTihBUlJBWV9TSVpFKHN0YXRzLT5vYmpfY3JlYXRlZCkgIT0gQVJSQVlfU0laRShiaW5kZXJfb2Jqc3RhdF9zdHJpbmdzKSk7CisJQlVJTERfQlVHX09OKEFSUkFZX1NJWkUoc3RhdHMtPm9ial9jcmVhdGVkKSAhPSBBUlJBWV9TSVpFKHN0YXRzLT5vYmpfZGVsZXRlZCkpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHN0YXRzLT5vYmpfY3JlYXRlZCk7IGkrKykgeworCQlpZiAoc3RhdHMtPm9ial9jcmVhdGVkW2ldIHx8IHN0YXRzLT5vYmpfZGVsZXRlZFtpXSkKKwkJCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiVzJXM6IGFjdGl2ZSAlZCB0b3RhbCAlZFxuIiwgcHJlZml4LAorCQkJCQliaW5kZXJfb2Jqc3RhdF9zdHJpbmdzW2ldLAorCQkJCQlzdGF0cy0+b2JqX2NyZWF0ZWRbaV0gLSBzdGF0cy0+b2JqX2RlbGV0ZWRbaV0sCisJCQkJCXN0YXRzLT5vYmpfY3JlYXRlZFtpXSk7CisJCWlmIChidWYgPj0gZW5kKQorCQkJcmV0dXJuIGJ1ZjsKKwl9CisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIGNoYXIgKnByaW50X2JpbmRlcl9wcm9jX3N0YXRzKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLCBzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MpCit7CisJc3RydWN0IGJpbmRlcl93b3JrICp3OworCXN0cnVjdCByYl9ub2RlICpuOworCWludCBjb3VudCwgc3Ryb25nLCB3ZWFrOworCisJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAicHJvYyAlZFxuIiwgcHJvYy0+cGlkKTsKKwlpZiAoYnVmID49IGVuZCkKKwkJcmV0dXJuIGJ1ZjsKKwljb3VudCA9IDA7CisJZm9yIChuID0gcmJfZmlyc3QoJnByb2MtPnRocmVhZHMpOyBuICE9IE5VTEw7IG4gPSByYl9uZXh0KG4pKQorCQljb3VudCsrOworCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiAgdGhyZWFkczogJWRcbiIsIGNvdW50KTsKKwlpZiAoYnVmID49IGVuZCkKKwkJcmV0dXJuIGJ1ZjsKKwlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIgIHJlcXVlc3RlZCB0aHJlYWRzOiAlZCslZC8lZFxuIgorCQkJIiAgcmVhZHkgdGhyZWFkcyAlZFxuIgorCQkJIiAgZnJlZSBhc3luYyBzcGFjZSAlemRcbiIsIHByb2MtPnJlcXVlc3RlZF90aHJlYWRzLAorCQkJcHJvYy0+cmVxdWVzdGVkX3RocmVhZHNfc3RhcnRlZCwgcHJvYy0+bWF4X3RocmVhZHMsCisJCQlwcm9jLT5yZWFkeV90aHJlYWRzLCBwcm9jLT5mcmVlX2FzeW5jX3NwYWNlKTsKKwlpZiAoYnVmID49IGVuZCkKKwkJcmV0dXJuIGJ1ZjsKKwljb3VudCA9IDA7CisJZm9yIChuID0gcmJfZmlyc3QoJnByb2MtPm5vZGVzKTsgbiAhPSBOVUxMOyBuID0gcmJfbmV4dChuKSkKKwkJY291bnQrKzsKKwlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIgIG5vZGVzOiAlZFxuIiwgY291bnQpOworCWlmIChidWYgPj0gZW5kKQorCQlyZXR1cm4gYnVmOworCWNvdW50ID0gMDsKKwlzdHJvbmcgPSAwOworCXdlYWsgPSAwOworCWZvciAobiA9IHJiX2ZpcnN0KCZwcm9jLT5yZWZzX2J5X2Rlc2MpOyBuICE9IE5VTEw7IG4gPSByYl9uZXh0KG4pKSB7CisJCXN0cnVjdCBiaW5kZXJfcmVmICpyZWYgPSByYl9lbnRyeShuLCBzdHJ1Y3QgYmluZGVyX3JlZiwgcmJfbm9kZV9kZXNjKTsKKwkJY291bnQrKzsKKwkJc3Ryb25nICs9IHJlZi0+c3Ryb25nOworCQl3ZWFrICs9IHJlZi0+d2VhazsKKwl9CisJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiICByZWZzOiAlZCBzICVkIHcgJWRcbiIsIGNvdW50LCBzdHJvbmcsIHdlYWspOworCWlmIChidWYgPj0gZW5kKQorCQlyZXR1cm4gYnVmOworCisJY291bnQgPSAwOworCWZvciAobiA9IHJiX2ZpcnN0KCZwcm9jLT5hbGxvY2F0ZWRfYnVmZmVycyk7IG4gIT0gTlVMTDsgbiA9IHJiX25leHQobikpCisJCWNvdW50Kys7CisJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiICBidWZmZXJzOiAlZFxuIiwgY291bnQpOworCWlmIChidWYgPj0gZW5kKQorCQlyZXR1cm4gYnVmOworCisJY291bnQgPSAwOworCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJnByb2MtPnRvZG8sIGVudHJ5KSB7CisJCXN3aXRjaCAody0+dHlwZSkgeworCQljYXNlIEJJTkRFUl9XT1JLX1RSQU5TQUNUSU9OOgorCQkJY291bnQrKzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiICBwZW5kaW5nIHRyYW5zYWN0aW9uczogJWRcbiIsIGNvdW50KTsKKwlpZiAoYnVmID49IGVuZCkKKwkJcmV0dXJuIGJ1ZjsKKworCWJ1ZiA9IHByaW50X2JpbmRlcl9zdGF0cyhidWYsIGVuZCwgIiAgIiwgJnByb2MtPnN0YXRzKTsKKworCXJldHVybiBidWY7Cit9CisKKworc3RhdGljIGludCBiaW5kZXJfcmVhZF9wcm9jX3N0YXRlKAorCWNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYzsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zOworCXN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZTsKKwlpbnQgbGVuID0gMDsKKwljaGFyICpidWYgPSBwYWdlOworCWNoYXIgKmVuZCA9IHBhZ2UgKyBQQUdFX1NJWkU7CisJaW50IGRvX2xvY2sgPSAhYmluZGVyX2RlYnVnX25vX2xvY2s7CisKKwlpZiAob2ZmKQorCQlyZXR1cm4gMDsKKworCWlmIChkb19sb2NrKQorCQltdXRleF9sb2NrKCZiaW5kZXJfbG9jayk7CisKKwlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICJiaW5kZXIgc3RhdGU6XG4iKTsKKworCWlmICghaGxpc3RfZW1wdHkoJmJpbmRlcl9kZWFkX25vZGVzKSkKKwkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiZGVhZCBub2RlczpcbiIpOworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KG5vZGUsIHBvcywgJmJpbmRlcl9kZWFkX25vZGVzLCBkZWFkX25vZGUpIHsKKwkJaWYgKGJ1ZiA+PSBlbmQpCisJCQlicmVhazsKKwkJYnVmID0gcHJpbnRfYmluZGVyX25vZGUoYnVmLCBlbmQsIG5vZGUpOworCX0KKworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHByb2MsIHBvcywgJmJpbmRlcl9wcm9jcywgcHJvY19ub2RlKSB7CisJCWlmIChidWYgPj0gZW5kKQorCQkJYnJlYWs7CisJCWJ1ZiA9IHByaW50X2JpbmRlcl9wcm9jKGJ1ZiwgZW5kLCBwcm9jLCAxKTsKKwl9CisJaWYgKGRvX2xvY2spCisJCW11dGV4X3VubG9jaygmYmluZGVyX2xvY2spOworCWlmIChidWYgPiBwYWdlICsgUEFHRV9TSVpFKQorCQlidWYgPSBwYWdlICsgUEFHRV9TSVpFOworCisJKnN0YXJ0ID0gcGFnZSArIG9mZjsKKworCWxlbiA9IGJ1ZiAtIHBhZ2U7CisJaWYgKGxlbiA+IG9mZikKKwkJbGVuIC09IG9mZjsKKwllbHNlCisJCWxlbiA9IDA7CisKKwlyZXR1cm4gbGVuIDwgY291bnQgPyBsZW4gIDogY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgYmluZGVyX3JlYWRfcHJvY19zdGF0cygKKwljaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2M7CisJc3RydWN0IGhsaXN0X25vZGUgKnBvczsKKwlpbnQgbGVuID0gMDsKKwljaGFyICpwID0gcGFnZTsKKwlpbnQgZG9fbG9jayA9ICFiaW5kZXJfZGVidWdfbm9fbG9jazsKKworCWlmIChvZmYpCisJCXJldHVybiAwOworCisJaWYgKGRvX2xvY2spCisJCW11dGV4X2xvY2soJmJpbmRlcl9sb2NrKTsKKworCXAgKz0gc25wcmludGYocCwgUEFHRV9TSVpFLCAiYmluZGVyIHN0YXRzOlxuIik7CisKKwlwID0gcHJpbnRfYmluZGVyX3N0YXRzKHAsIHBhZ2UgKyBQQUdFX1NJWkUsICIiLCAmYmluZGVyX3N0YXRzKTsKKworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHByb2MsIHBvcywgJmJpbmRlcl9wcm9jcywgcHJvY19ub2RlKSB7CisJCWlmIChwID49IHBhZ2UgKyBQQUdFX1NJWkUpCisJCQlicmVhazsKKwkJcCA9IHByaW50X2JpbmRlcl9wcm9jX3N0YXRzKHAsIHBhZ2UgKyBQQUdFX1NJWkUsIHByb2MpOworCX0KKwlpZiAoZG9fbG9jaykKKwkJbXV0ZXhfdW5sb2NrKCZiaW5kZXJfbG9jayk7CisJaWYgKHAgPiBwYWdlICsgUEFHRV9TSVpFKQorCQlwID0gcGFnZSArIFBBR0VfU0laRTsKKworCSpzdGFydCA9IHBhZ2UgKyBvZmY7CisKKwlsZW4gPSBwIC0gcGFnZTsKKwlpZiAobGVuID4gb2ZmKQorCQlsZW4gLT0gb2ZmOworCWVsc2UKKwkJbGVuID0gMDsKKworCXJldHVybiBsZW4gPCBjb3VudCA/IGxlbiAgOiBjb3VudDsKK30KKworc3RhdGljIGludCBiaW5kZXJfcmVhZF9wcm9jX3RyYW5zYWN0aW9ucygKKwljaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2M7CisJc3RydWN0IGhsaXN0X25vZGUgKnBvczsKKwlpbnQgbGVuID0gMDsKKwljaGFyICpidWYgPSBwYWdlOworCWNoYXIgKmVuZCA9IHBhZ2UgKyBQQUdFX1NJWkU7CisJaW50IGRvX2xvY2sgPSAhYmluZGVyX2RlYnVnX25vX2xvY2s7CisKKwlpZiAob2ZmKQorCQlyZXR1cm4gMDsKKworCWlmIChkb19sb2NrKQorCQltdXRleF9sb2NrKCZiaW5kZXJfbG9jayk7CisKKwlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICJiaW5kZXIgdHJhbnNhY3Rpb25zOlxuIik7CisJaGxpc3RfZm9yX2VhY2hfZW50cnkocHJvYywgcG9zLCAmYmluZGVyX3Byb2NzLCBwcm9jX25vZGUpIHsKKwkJaWYgKGJ1ZiA+PSBlbmQpCisJCQlicmVhazsKKwkJYnVmID0gcHJpbnRfYmluZGVyX3Byb2MoYnVmLCBlbmQsIHByb2MsIDApOworCX0KKwlpZiAoZG9fbG9jaykKKwkJbXV0ZXhfdW5sb2NrKCZiaW5kZXJfbG9jayk7CisJaWYgKGJ1ZiA+IHBhZ2UgKyBQQUdFX1NJWkUpCisJCWJ1ZiA9IHBhZ2UgKyBQQUdFX1NJWkU7CisKKwkqc3RhcnQgPSBwYWdlICsgb2ZmOworCisJbGVuID0gYnVmIC0gcGFnZTsKKwlpZiAobGVuID4gb2ZmKQorCQlsZW4gLT0gb2ZmOworCWVsc2UKKwkJbGVuID0gMDsKKworCXJldHVybiBsZW4gPCBjb3VudCA/IGxlbiAgOiBjb3VudDsKK30KKworc3RhdGljIGludCBiaW5kZXJfcmVhZF9wcm9jX3Byb2MoCisJY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jID0gZGF0YTsKKwlpbnQgbGVuID0gMDsKKwljaGFyICpwID0gcGFnZTsKKwlpbnQgZG9fbG9jayA9ICFiaW5kZXJfZGVidWdfbm9fbG9jazsKKworCWlmIChvZmYpCisJCXJldHVybiAwOworCisJaWYgKGRvX2xvY2spCisJCW11dGV4X2xvY2soJmJpbmRlcl9sb2NrKTsKKwlwICs9IHNucHJpbnRmKHAsIFBBR0VfU0laRSwgImJpbmRlciBwcm9jIHN0YXRlOlxuIik7CisJcCA9IHByaW50X2JpbmRlcl9wcm9jKHAsIHBhZ2UgKyBQQUdFX1NJWkUsIHByb2MsIDEpOworCWlmIChkb19sb2NrKQorCQltdXRleF91bmxvY2soJmJpbmRlcl9sb2NrKTsKKworCWlmIChwID4gcGFnZSArIFBBR0VfU0laRSkKKwkJcCA9IHBhZ2UgKyBQQUdFX1NJWkU7CisJKnN0YXJ0ID0gcGFnZSArIG9mZjsKKworCWxlbiA9IHAgLSBwYWdlOworCWlmIChsZW4gPiBvZmYpCisJCWxlbiAtPSBvZmY7CisJZWxzZQorCQlsZW4gPSAwOworCisJcmV0dXJuIGxlbiA8IGNvdW50ID8gbGVuICA6IGNvdW50OworfQorCitzdGF0aWMgY2hhciAqcHJpbnRfYmluZGVyX3RyYW5zYWN0aW9uX2xvZ19lbnRyeShjaGFyICpidWYsIGNoYXIgKmVuZCwgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9sb2dfZW50cnkgKmUpCit7CisJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiJWQ6ICVzIGZyb20gJWQ6JWQgdG8gJWQ6JWQgbm9kZSAlZCBoYW5kbGUgJWQgc2l6ZSAlZDolZFxuIiwKKwkJCWUtPmRlYnVnX2lkLCAoZS0+Y2FsbF90eXBlID09IDIpID8gInJlcGx5IiA6CisJCQkoKGUtPmNhbGxfdHlwZSA9PSAxKSA/ICJhc3luYyIgOiAiY2FsbCAiKSwgZS0+ZnJvbV9wcm9jLAorCQkJZS0+ZnJvbV90aHJlYWQsIGUtPnRvX3Byb2MsIGUtPnRvX3RocmVhZCwgZS0+dG9fbm9kZSwKKwkJCWUtPnRhcmdldF9oYW5kbGUsIGUtPmRhdGFfc2l6ZSwgZS0+b2Zmc2V0c19zaXplKTsKKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgaW50IGJpbmRlcl9yZWFkX3Byb2NfdHJhbnNhY3Rpb25fbG9nKAorCWNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nICpsb2cgPSBkYXRhOworCWludCBsZW4gPSAwOworCWludCBpOworCWNoYXIgKmJ1ZiA9IHBhZ2U7CisJY2hhciAqZW5kID0gcGFnZSArIFBBR0VfU0laRTsKKworCWlmIChvZmYpCisJCXJldHVybiAwOworCisJaWYgKGxvZy0+ZnVsbCkgeworCQlmb3IgKGkgPSBsb2ctPm5leHQ7IGkgPCBBUlJBWV9TSVpFKGxvZy0+ZW50cnkpOyBpKyspIHsKKwkJCWlmIChidWYgPj0gZW5kKQorCQkJCWJyZWFrOworCQkJYnVmID0gcHJpbnRfYmluZGVyX3RyYW5zYWN0aW9uX2xvZ19lbnRyeShidWYsIGVuZCwgJmxvZy0+ZW50cnlbaV0pOworCQl9CisJfQorCWZvciAoaSA9IDA7IGkgPCBsb2ctPm5leHQ7IGkrKykgeworCQlpZiAoYnVmID49IGVuZCkKKwkJCWJyZWFrOworCQlidWYgPSBwcmludF9iaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2VudHJ5KGJ1ZiwgZW5kLCAmbG9nLT5lbnRyeVtpXSk7CisJfQorCisJKnN0YXJ0ID0gcGFnZSArIG9mZjsKKworCWxlbiA9IGJ1ZiAtIHBhZ2U7CisJaWYgKGxlbiA+IG9mZikKKwkJbGVuIC09IG9mZjsKKwllbHNlCisJCWxlbiA9IDA7CisKKwlyZXR1cm4gbGVuIDwgY291bnQgPyBsZW4gIDogY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJpbmRlcl9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5wb2xsID0gYmluZGVyX3BvbGwsCisJLnVubG9ja2VkX2lvY3RsID0gYmluZGVyX2lvY3RsLAorCS5tbWFwID0gYmluZGVyX21tYXAsCisJLm9wZW4gPSBiaW5kZXJfb3BlbiwKKwkuZmx1c2ggPSBiaW5kZXJfZmx1c2gsCisJLnJlbGVhc2UgPSBiaW5kZXJfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBiaW5kZXJfbWlzY2RldiA9IHsKKwkubWlub3IgPSBNSVNDX0RZTkFNSUNfTUlOT1IsCisJLm5hbWUgPSAiYmluZGVyIiwKKwkuZm9wcyA9ICZiaW5kZXJfZm9wcworfTsKKworc3RhdGljIGludCBfX2luaXQgYmluZGVyX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJYmluZGVyX3Byb2NfZGlyX2VudHJ5X3Jvb3QgPSBwcm9jX21rZGlyKCJiaW5kZXIiLCBOVUxMKTsKKwlpZiAoYmluZGVyX3Byb2NfZGlyX2VudHJ5X3Jvb3QpCisJCWJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9wcm9jID0gcHJvY19ta2RpcigicHJvYyIsIGJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9yb290KTsKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZiaW5kZXJfbWlzY2Rldik7CisJaWYgKGJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9yb290KSB7CisJCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInN0YXRlIiwgU19JUlVHTywgYmluZGVyX3Byb2NfZGlyX2VudHJ5X3Jvb3QsIGJpbmRlcl9yZWFkX3Byb2Nfc3RhdGUsIE5VTEwpOworCQljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJzdGF0cyIsIFNfSVJVR08sIGJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9yb290LCBiaW5kZXJfcmVhZF9wcm9jX3N0YXRzLCBOVUxMKTsKKwkJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgidHJhbnNhY3Rpb25zIiwgU19JUlVHTywgYmluZGVyX3Byb2NfZGlyX2VudHJ5X3Jvb3QsIGJpbmRlcl9yZWFkX3Byb2NfdHJhbnNhY3Rpb25zLCBOVUxMKTsKKwkJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgidHJhbnNhY3Rpb25fbG9nIiwgU19JUlVHTywgYmluZGVyX3Byb2NfZGlyX2VudHJ5X3Jvb3QsIGJpbmRlcl9yZWFkX3Byb2NfdHJhbnNhY3Rpb25fbG9nLCAmYmluZGVyX3RyYW5zYWN0aW9uX2xvZyk7CisJCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoImZhaWxlZF90cmFuc2FjdGlvbl9sb2ciLCBTX0lSVUdPLCBiaW5kZXJfcHJvY19kaXJfZW50cnlfcm9vdCwgYmluZGVyX3JlYWRfcHJvY190cmFuc2FjdGlvbl9sb2csICZiaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2ZhaWxlZCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK2RldmljZV9pbml0Y2FsbChiaW5kZXJfaW5pdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2JpbmRlci5oIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvYmluZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYzYWUxYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2JpbmRlci5oCkBAIC0wLDAgKzEsMzMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSwgSW5jLgorICoKKyAqIEJhc2VkIG9uLCBidXQgbm8gbG9uZ2VyIGNvbXBhdGlibGUgd2l0aCwgdGhlIG9yaWdpbmFsCisgKiBPcGVuQmluZGVyLm9yZyBiaW5kZXIgZHJpdmVyIGludGVyZmFjZSwgd2hpY2ggaXM6CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA1IFBhbG1zb3VyY2UsIEluYy4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIF9MSU5VWF9CSU5ERVJfSAorI2RlZmluZSBfTElOVVhfQklOREVSX0gKKworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKKyNkZWZpbmUgQl9QQUNLX0NIQVJTKGMxLCBjMiwgYzMsIGM0KSBcCisJKCgoKGMxKTw8MjQpKSB8ICgoKGMyKTw8MTYpKSB8ICgoKGMzKTw8OCkpIHwgKGM0KSkKKyNkZWZpbmUgQl9UWVBFX0xBUkdFIDB4ODUKKworZW51bSB7CisJQklOREVSX1RZUEVfQklOREVSCT0gQl9QQUNLX0NIQVJTKCdzJywgJ2InLCAnKicsIEJfVFlQRV9MQVJHRSksCisJQklOREVSX1RZUEVfV0VBS19CSU5ERVIJPSBCX1BBQ0tfQ0hBUlMoJ3cnLCAnYicsICcqJywgQl9UWVBFX0xBUkdFKSwKKwlCSU5ERVJfVFlQRV9IQU5ETEUJPSBCX1BBQ0tfQ0hBUlMoJ3MnLCAnaCcsICcqJywgQl9UWVBFX0xBUkdFKSwKKwlCSU5ERVJfVFlQRV9XRUFLX0hBTkRMRQk9IEJfUEFDS19DSEFSUygndycsICdoJywgJyonLCBCX1RZUEVfTEFSR0UpLAorCUJJTkRFUl9UWVBFX0ZECQk9IEJfUEFDS19DSEFSUygnZicsICdkJywgJyonLCBCX1RZUEVfTEFSR0UpLAorfTsKKworZW51bSB7CisJRkxBVF9CSU5ERVJfRkxBR19QUklPUklUWV9NQVNLID0gMHhmZiwKKwlGTEFUX0JJTkRFUl9GTEFHX0FDQ0VQVFNfRkRTID0gMHgxMDAsCit9OworCisvKgorICogVGhpcyBpcyB0aGUgZmxhdHRlbmVkIHJlcHJlc2VudGF0aW9uIG9mIGEgQmluZGVyIG9iamVjdCBmb3IgdHJhbnNmZXIKKyAqIGJldHdlZW4gcHJvY2Vzc2VzLiAgVGhlICdvZmZzZXRzJyBzdXBwbGllZCBhcyBwYXJ0IG9mIGEgYmluZGVyIHRyYW5zYWN0aW9uCisgKiBjb250YWlucyBvZmZzZXRzIGludG8gdGhlIGRhdGEgd2hlcmUgdGhlc2Ugc3RydWN0dXJlcyBvY2N1ci4gIFRoZSBCaW5kZXIKKyAqIGRyaXZlciB0YWtlcyBjYXJlIG9mIHJlLXdyaXRpbmcgdGhlIHN0cnVjdHVyZSB0eXBlIGFuZCBkYXRhIGFzIGl0IG1vdmVzCisgKiBiZXR3ZWVuIHByb2Nlc3Nlcy4KKyAqLworc3RydWN0IGZsYXRfYmluZGVyX29iamVjdCB7CisJLyogOCBieXRlcyBmb3IgbGFyZ2VfZmxhdF9oZWFkZXIuICovCisJdW5zaWduZWQgbG9uZwkJdHlwZTsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKworCS8qIDggYnl0ZXMgb2YgZGF0YS4gKi8KKwl1bmlvbiB7CisJCXZvaWQJCSpiaW5kZXI7CS8qIGxvY2FsIG9iamVjdCAqLworCQlzaWduZWQgbG9uZwloYW5kbGU7CQkvKiByZW1vdGUgb2JqZWN0ICovCisJfTsKKworCS8qIGV4dHJhIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGxvY2FsIG9iamVjdCAqLworCXZvaWQJCQkqY29va2llOworfTsKKworLyoKKyAqIE9uIDY0LWJpdCBwbGF0Zm9ybXMgd2hlcmUgdXNlciBjb2RlIG1heSBydW4gaW4gMzItYml0cyB0aGUgZHJpdmVyIG11c3QKKyAqIHRyYW5zbGF0ZSB0aGUgYnVmZmVyIChhbmQgbG9jYWwgYmluZGVyKSBhZGRyZXNzZXMgYXByb3ByaWF0ZWx5LgorICovCisKK3N0cnVjdCBiaW5kZXJfd3JpdGVfcmVhZCB7CisJc2lnbmVkIGxvbmcJd3JpdGVfc2l6ZTsJLyogYnl0ZXMgdG8gd3JpdGUgKi8KKwlzaWduZWQgbG9uZwl3cml0ZV9jb25zdW1lZDsJLyogYnl0ZXMgY29uc3VtZWQgYnkgZHJpdmVyICovCisJdW5zaWduZWQgbG9uZwl3cml0ZV9idWZmZXI7CisJc2lnbmVkIGxvbmcJcmVhZF9zaXplOwkvKiBieXRlcyB0byByZWFkICovCisJc2lnbmVkIGxvbmcJcmVhZF9jb25zdW1lZDsJLyogYnl0ZXMgY29uc3VtZWQgYnkgZHJpdmVyICovCisJdW5zaWduZWQgbG9uZwlyZWFkX2J1ZmZlcjsKK307CisKKy8qIFVzZSB3aXRoIEJJTkRFUl9WRVJTSU9OLCBkcml2ZXIgZmlsbHMgaW4gZmllbGRzLiAqLworc3RydWN0IGJpbmRlcl92ZXJzaW9uIHsKKwkvKiBkcml2ZXIgcHJvdG9jb2wgdmVyc2lvbiAtLSBpbmNyZW1lbnQgd2l0aCBpbmNvbXBhdGlibGUgY2hhbmdlICovCisJc2lnbmVkIGxvbmcJcHJvdG9jb2xfdmVyc2lvbjsKK307CisKKy8qIFRoaXMgaXMgdGhlIGN1cnJlbnQgcHJvdG9jb2wgdmVyc2lvbi4gKi8KKyNkZWZpbmUgQklOREVSX0NVUlJFTlRfUFJPVE9DT0xfVkVSU0lPTiA3CisKKyNkZWZpbmUgQklOREVSX1dSSVRFX1JFQUQgICAJCV9JT1dSKCdiJywgMSwgc3RydWN0IGJpbmRlcl93cml0ZV9yZWFkKQorI2RlZmluZQlCSU5ERVJfU0VUX0lETEVfVElNRU9VVAkJX0lPVygnYicsIDMsIGludDY0X3QpCisjZGVmaW5lCUJJTkRFUl9TRVRfTUFYX1RIUkVBRFMJCV9JT1coJ2InLCA1LCBzaXplX3QpCisjZGVmaW5lCUJJTkRFUl9TRVRfSURMRV9QUklPUklUWQlfSU9XKCdiJywgNiwgaW50KQorI2RlZmluZQlCSU5ERVJfU0VUX0NPTlRFWFRfTUdSCQlfSU9XKCdiJywgNywgaW50KQorI2RlZmluZQlCSU5ERVJfVEhSRUFEX0VYSVQJCV9JT1coJ2InLCA4LCBpbnQpCisjZGVmaW5lIEJJTkRFUl9WRVJTSU9OCQkJX0lPV1IoJ2InLCA5LCBzdHJ1Y3QgYmluZGVyX3ZlcnNpb24pCisKKy8qCisgKiBOT1RFOiBUd28gc3BlY2lhbCBlcnJvciBjb2RlcyB5b3Ugc2hvdWxkIGNoZWNrIGZvciB3aGVuIGNhbGxpbmcKKyAqIGluIHRvIHRoZSBkcml2ZXIgYXJlOgorICoKKyAqIEVJTlRSIC0tIFRoZSBvcGVyYXRpb24gaGFzIGJlZW4gaW50ZXJ1cHRlZC4gIFRoaXMgc2hvdWxkIGJlCisgKiBoYW5kbGVkIGJ5IHJldHJ5aW5nIHRoZSBpb2N0bCgpIHVudGlsIGEgZGlmZmVyZW50IGVycm9yIGNvZGUKKyAqIGlzIHJldHVybmVkLgorICoKKyAqIEVDT05OUkVGVVNFRCAtLSBUaGUgZHJpdmVyIGlzIG5vIGxvbmdlciBhY2NlcHRpbmcgb3BlcmF0aW9ucworICogZnJvbSB5b3VyIHByb2Nlc3MuICBUaGF0IGlzLCB0aGUgcHJvY2VzcyBpcyBiZWluZyBkZXN0cm95ZWQuCisgKiBZb3Ugc2hvdWxkIGhhbmRsZSB0aGlzIGJ5IGV4aXRpbmcgZnJvbSB5b3VyIHByb2Nlc3MuICBOb3RlCisgKiB0aGF0IG9uY2UgdGhpcyBlcnJvciBjb2RlIGlzIHJldHVybmVkLCBhbGwgZnVydGhlciBjYWxscyB0bworICogdGhlIGRyaXZlciBmcm9tIGFueSB0aHJlYWQgd2lsbCByZXR1cm4gdGhpcyBzYW1lIGNvZGUuCisgKi8KKworZW51bSB0cmFuc2FjdGlvbl9mbGFncyB7CisJVEZfT05FX1dBWQk9IDB4MDEsCS8qIHRoaXMgaXMgYSBvbmUtd2F5IGNhbGw6IGFzeW5jLCBubyByZXR1cm4gKi8KKwlURl9ST09UX09CSkVDVAk9IDB4MDQsCS8qIGNvbnRlbnRzIGFyZSB0aGUgY29tcG9uZW50J3Mgcm9vdCBvYmplY3QgKi8KKwlURl9TVEFUVVNfQ09ERQk9IDB4MDgsCS8qIGNvbnRlbnRzIGFyZSBhIDMyLWJpdCBzdGF0dXMgY29kZSAqLworCVRGX0FDQ0VQVF9GRFMJPSAweDEwLAkvKiBhbGxvdyByZXBsaWVzIHdpdGggZmlsZSBkZXNjcmlwdG9ycyAqLworfTsKKworc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhIHsKKwkvKiBUaGUgZmlyc3QgdHdvIGFyZSBvbmx5IHVzZWQgZm9yIGJjVFJBTlNBQ1RJT04gYW5kIGJyVFJBTlNBQ1RJT04sCisJICogaWRlbnRpZnlpbmcgdGhlIHRhcmdldCBhbmQgY29udGVudHMgb2YgdGhlIHRyYW5zYWN0aW9uLgorCSAqLworCXVuaW9uIHsKKwkJc2l6ZV90CWhhbmRsZTsJLyogdGFyZ2V0IGRlc2NyaXB0b3Igb2YgY29tbWFuZCB0cmFuc2FjdGlvbiAqLworCQl2b2lkCSpwdHI7CS8qIHRhcmdldCBkZXNjcmlwdG9yIG9mIHJldHVybiB0cmFuc2FjdGlvbiAqLworCX0gdGFyZ2V0OworCXZvaWQJCSpjb29raWU7CS8qIHRhcmdldCBvYmplY3QgY29va2llICovCisJdW5zaWduZWQgaW50CWNvZGU7CQkvKiB0cmFuc2FjdGlvbiBjb21tYW5kICovCisKKwkvKiBHZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0cmFuc2FjdGlvbi4gKi8KKwl1bnNpZ25lZCBpbnQJZmxhZ3M7CisJcGlkX3QJCXNlbmRlcl9waWQ7CisJdWlkX3QJCXNlbmRlcl9ldWlkOworCXNpemVfdAkJZGF0YV9zaXplOwkvKiBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSAqLworCXNpemVfdAkJb2Zmc2V0c19zaXplOwkvKiBudW1iZXIgb2YgYnl0ZXMgb2Ygb2Zmc2V0cyAqLworCisJLyogSWYgdGhpcyB0cmFuc2FjdGlvbiBpcyBpbmxpbmUsIHRoZSBkYXRhIGltbWVkaWF0ZWx5CisJICogZm9sbG93cyBoZXJlOyBvdGhlcndpc2UsIGl0IGVuZHMgd2l0aCBhIHBvaW50ZXIgdG8KKwkgKiB0aGUgZGF0YSBidWZmZXIuCisJICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJLyogdHJhbnNhY3Rpb24gZGF0YSAqLworCQkJY29uc3Qgdm9pZAkqYnVmZmVyOworCQkJLyogb2Zmc2V0cyBmcm9tIGJ1ZmZlciB0byBmbGF0X2JpbmRlcl9vYmplY3Qgc3RydWN0cyAqLworCQkJY29uc3Qgdm9pZAkqb2Zmc2V0czsKKwkJfSBwdHI7CisJCXVpbnQ4X3QJYnVmWzhdOworCX0gZGF0YTsKK307CisKK3N0cnVjdCBiaW5kZXJfcHRyX2Nvb2tpZSB7CisJdm9pZCAqcHRyOworCXZvaWQgKmNvb2tpZTsKK307CisKK3N0cnVjdCBiaW5kZXJfcHJpX2Rlc2MgeworCWludCBwcmlvcml0eTsKKwlpbnQgZGVzYzsKK307CisKK3N0cnVjdCBiaW5kZXJfcHJpX3B0cl9jb29raWUgeworCWludCBwcmlvcml0eTsKKwl2b2lkICpwdHI7CisJdm9pZCAqY29va2llOworfTsKKworZW51bSBCaW5kZXJEcml2ZXJSZXR1cm5Qcm90b2NvbCB7CisJQlJfRVJST1IgPSBfSU9SKCdyJywgMCwgaW50KSwKKwkvKgorCSAqIGludDogZXJyb3IgY29kZQorCSAqLworCisJQlJfT0sgPSBfSU8oJ3InLCAxKSwKKwkvKiBObyBwYXJhbWV0ZXJzISAqLworCisJQlJfVFJBTlNBQ1RJT04gPSBfSU9SKCdyJywgMiwgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhKSwKKwlCUl9SRVBMWSA9IF9JT1IoJ3InLCAzLCBzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2RhdGEpLAorCS8qCisJICogYmluZGVyX3RyYW5zYWN0aW9uX2RhdGE6IHRoZSByZWNlaXZlZCBjb21tYW5kLgorCSAqLworCisJQlJfQUNRVUlSRV9SRVNVTFQgPSBfSU9SKCdyJywgNCwgaW50KSwKKwkvKgorCSAqIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkCisJICogaW50OiAwIGlmIHRoZSBsYXN0IGJjQVRURU1QVF9BQ1FVSVJFIHdhcyBub3Qgc3VjY2Vzc2Z1bC4KKwkgKiBFbHNlIHRoZSByZW1vdGUgb2JqZWN0IGhhcyBhY3F1aXJlZCBhIHByaW1hcnkgcmVmZXJlbmNlLgorCSAqLworCisJQlJfREVBRF9SRVBMWSA9IF9JTygncicsIDUpLAorCS8qCisJICogVGhlIHRhcmdldCBvZiB0aGUgbGFzdCB0cmFuc2FjdGlvbiAoZWl0aGVyIGEgYmNUUkFOU0FDVElPTiBvcgorCSAqIGEgYmNBVFRFTVBUX0FDUVVJUkUpIGlzIG5vIGxvbmdlciB3aXRoIHVzLiAgTm8gcGFyYW1ldGVycy4KKwkgKi8KKworCUJSX1RSQU5TQUNUSU9OX0NPTVBMRVRFID0gX0lPKCdyJywgNiksCisJLyoKKwkgKiBObyBwYXJhbWV0ZXJzLi4uIGFsd2F5cyByZWZlcnMgdG8gdGhlIGxhc3QgdHJhbnNhY3Rpb24gcmVxdWVzdGVkCisJICogKGluY2x1ZGluZyByZXBsaWVzKS4gIE5vdGUgdGhhdCB0aGlzIHdpbGwgYmUgc2VudCBldmVuIGZvcgorCSAqIGFzeW5jaHJvbm91cyB0cmFuc2FjdGlvbnMuCisJICovCisKKwlCUl9JTkNSRUZTID0gX0lPUigncicsIDcsIHN0cnVjdCBiaW5kZXJfcHRyX2Nvb2tpZSksCisJQlJfQUNRVUlSRSA9IF9JT1IoJ3InLCA4LCBzdHJ1Y3QgYmluZGVyX3B0cl9jb29raWUpLAorCUJSX1JFTEVBU0UgPSBfSU9SKCdyJywgOSwgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKKwlCUl9ERUNSRUZTID0gX0lPUigncicsIDEwLCBzdHJ1Y3QgYmluZGVyX3B0cl9jb29raWUpLAorCS8qCisJICogdm9pZCAqOglwdHIgdG8gYmluZGVyCisJICogdm9pZCAqOiBjb29raWUgZm9yIGJpbmRlcgorCSAqLworCisJQlJfQVRURU1QVF9BQ1FVSVJFID0gX0lPUigncicsIDExLCBzdHJ1Y3QgYmluZGVyX3ByaV9wdHJfY29va2llKSwKKwkvKgorCSAqIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkCisJICogaW50Oglwcmlvcml0eQorCSAqIHZvaWQgKjogcHRyIHRvIGJpbmRlcgorCSAqIHZvaWQgKjogY29va2llIGZvciBiaW5kZXIKKwkgKi8KKworCUJSX05PT1AgPSBfSU8oJ3InLCAxMiksCisJLyoKKwkgKiBObyBwYXJhbWV0ZXJzLiAgRG8gbm90aGluZyBhbmQgZXhhbWluZSB0aGUgbmV4dCBjb21tYW5kLiAgSXQgZXhpc3RzCisJICogcHJpbWFyaWx5IHNvIHRoYXQgd2UgY2FuIHJlcGxhY2UgaXQgd2l0aCBhIEJSX1NQQVdOX0xPT1BFUiBjb21tYW5kLgorCSAqLworCisJQlJfU1BBV05fTE9PUEVSID0gX0lPKCdyJywgMTMpLAorCS8qCisJICogTm8gcGFyYW1ldGVycy4gIFRoZSBkcml2ZXIgaGFzIGRldGVybWluZWQgdGhhdCBhIHByb2Nlc3MgaGFzIG5vCisJICogdGhyZWFkcyB3YWl0aW5nIHRvIHNlcnZpY2UgaW5jb21taW5nIHRyYW5zYWN0aW9ucy4gIFdoZW4gYSBwcm9jZXNzCisJICogcmVjZWl2ZXMgdGhpcyBjb21tYW5kLCBpdCBtdXN0IHNwYXduIGEgbmV3IHNlcnZpY2UgdGhyZWFkIGFuZAorCSAqIHJlZ2lzdGVyIGl0IHZpYSBiY0VOVEVSX0xPT1BFUi4KKwkgKi8KKworCUJSX0ZJTklTSEVEID0gX0lPKCdyJywgMTQpLAorCS8qCisJICogbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQKKwkgKiBzdG9wIHRocmVhZHBvb2wgdGhyZWFkCisJICovCisKKwlCUl9ERUFEX0JJTkRFUiA9IF9JT1IoJ3InLCAxNSwgdm9pZCAqKSwKKwkvKgorCSAqIHZvaWQgKjogY29va2llCisJICovCisJQlJfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OX0RPTkUgPSBfSU9SKCdyJywgMTYsIHZvaWQgKiksCisJLyoKKwkgKiB2b2lkICo6IGNvb2tpZQorCSAqLworCisJQlJfRkFJTEVEX1JFUExZID0gX0lPKCdyJywgMTcpLAorCS8qCisJICogVGhlIHRoZSBsYXN0IHRyYW5zYWN0aW9uIChlaXRoZXIgYSBiY1RSQU5TQUNUSU9OIG9yCisJICogYSBiY0FUVEVNUFRfQUNRVUlSRSkgZmFpbGVkIChlLmcuIG91dCBvZiBtZW1vcnkpLiAgTm8gcGFyYW1ldGVycy4KKwkgKi8KK307CisKK2VudW0gQmluZGVyRHJpdmVyQ29tbWFuZFByb3RvY29sIHsKKwlCQ19UUkFOU0FDVElPTiA9IF9JT1coJ2MnLCAwLCBzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2RhdGEpLAorCUJDX1JFUExZID0gX0lPVygnYycsIDEsIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSksCisJLyoKKwkgKiBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YTogdGhlIHNlbnQgY29tbWFuZC4KKwkgKi8KKworCUJDX0FDUVVJUkVfUkVTVUxUID0gX0lPVygnYycsIDIsIGludCksCisJLyoKKwkgKiBub3QgY3VycmVudGx5IHN1cHBvcnRlZAorCSAqIGludDogIDAgaWYgdGhlIGxhc3QgQlJfQVRURU1QVF9BQ1FVSVJFIHdhcyBub3Qgc3VjY2Vzc2Z1bC4KKwkgKiBFbHNlIHlvdSBoYXZlIGFjcXVpcmVkIGEgcHJpbWFyeSByZWZlcmVuY2Ugb24gdGhlIG9iamVjdC4KKwkgKi8KKworCUJDX0ZSRUVfQlVGRkVSID0gX0lPVygnYycsIDMsIGludCksCisJLyoKKwkgKiB2b2lkICo6IHB0ciB0byB0cmFuc2FjdGlvbiBkYXRhIHJlY2VpdmVkIG9uIGEgcmVhZAorCSAqLworCisJQkNfSU5DUkVGUyA9IF9JT1coJ2MnLCA0LCBpbnQpLAorCUJDX0FDUVVJUkUgPSBfSU9XKCdjJywgNSwgaW50KSwKKwlCQ19SRUxFQVNFID0gX0lPVygnYycsIDYsIGludCksCisJQkNfREVDUkVGUyA9IF9JT1coJ2MnLCA3LCBpbnQpLAorCS8qCisJICogaW50OglkZXNjcmlwdG9yCisJICovCisKKwlCQ19JTkNSRUZTX0RPTkUgPSBfSU9XKCdjJywgOCwgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKKwlCQ19BQ1FVSVJFX0RPTkUgPSBfSU9XKCdjJywgOSwgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKKwkvKgorCSAqIHZvaWQgKjogcHRyIHRvIGJpbmRlcgorCSAqIHZvaWQgKjogY29va2llIGZvciBiaW5kZXIKKwkgKi8KKworCUJDX0FUVEVNUFRfQUNRVUlSRSA9IF9JT1coJ2MnLCAxMCwgc3RydWN0IGJpbmRlcl9wcmlfZGVzYyksCisJLyoKKwkgKiBub3QgY3VycmVudGx5IHN1cHBvcnRlZAorCSAqIGludDogcHJpb3JpdHkKKwkgKiBpbnQ6IGRlc2NyaXB0b3IKKwkgKi8KKworCUJDX1JFR0lTVEVSX0xPT1BFUiA9IF9JTygnYycsIDExKSwKKwkvKgorCSAqIE5vIHBhcmFtZXRlcnMuCisJICogUmVnaXN0ZXIgYSBzcGF3bmVkIGxvb3BlciB0aHJlYWQgd2l0aCB0aGUgZGV2aWNlLgorCSAqLworCisJQkNfRU5URVJfTE9PUEVSID0gX0lPKCdjJywgMTIpLAorCUJDX0VYSVRfTE9PUEVSID0gX0lPKCdjJywgMTMpLAorCS8qCisJICogTm8gcGFyYW1ldGVycy4KKwkgKiBUaGVzZSB0d28gY29tbWFuZHMgYXJlIHNlbnQgYXMgYW4gYXBwbGljYXRpb24tbGV2ZWwgdGhyZWFkCisJICogZW50ZXJzIGFuZCBleGl0cyB0aGUgYmluZGVyIGxvb3AsIHJlc3BlY3RpdmVseS4gIFRoZXkgYXJlCisJICogdXNlZCBzbyB0aGUgYmluZGVyIGNhbiBoYXZlIGFuIGFjY3VyYXRlIGNvdW50IG9mIHRoZSBudW1iZXIKKwkgKiBvZiBsb29waW5nIHRocmVhZHMgaXQgaGFzIGF2YWlsYWJsZS4KKwkgKi8KKworCUJDX1JFUVVFU1RfREVBVEhfTk9USUZJQ0FUSU9OID0gX0lPVygnYycsIDE0LCBzdHJ1Y3QgYmluZGVyX3B0cl9jb29raWUpLAorCS8qCisJICogdm9pZCAqOiBwdHIgdG8gYmluZGVyCisJICogdm9pZCAqOiBjb29raWUKKwkgKi8KKworCUJDX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTiA9IF9JT1coJ2MnLCAxNSwgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKKwkvKgorCSAqIHZvaWQgKjogcHRyIHRvIGJpbmRlcgorCSAqIHZvaWQgKjogY29va2llCisJICovCisKKwlCQ19ERUFEX0JJTkRFUl9ET05FID0gX0lPVygnYycsIDE2LCB2b2lkICopLAorCS8qCisJICogdm9pZCAqOiBjb29raWUKKwkgKi8KK307CisKKyNlbmRpZiAvKiBfTElOVVhfQklOREVSX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG9nZ2VyLmMgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9sb2dnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjMyMDAzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG9nZ2VyLmMKQEAgLTAsMCArMSw2MDcgQEAKKy8qCisgKiBkcml2ZXJzL21pc2MvbG9nZ2VyLmMKKyAqCisgKiBBIExvZ2dpbmcgU3Vic3lzdGVtCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggR29vZ2xlLCBJbmMuCisgKgorICogUm9iZXJ0IExvdmUgPHJsb3ZlQGdvb2dsZS5jb20+CisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSAibG9nZ2VyLmgiCisKKyNpbmNsdWRlIDxhc20vaW9jdGxzLmg+CisKKy8qCisgKiBzdHJ1Y3QgbG9nZ2VyX2xvZyAtIHJlcHJlc2VudHMgYSBzcGVjaWZpYyBsb2csIHN1Y2ggYXMgJ21haW4nIG9yICdyYWRpbycKKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBsaXZlcyBmcm9tIG1vZHVsZSBpbnNlcnRpb24gdW50aWwgbW9kdWxlIHJlbW92YWwsIHNvIGl0IGRvZXMKKyAqIG5vdCBuZWVkIGFkZGl0aW9uYWwgcmVmZXJlbmNlIGNvdW50aW5nLiBUaGUgc3RydWN0dXJlIGlzIHByb3RlY3RlZCBieSB0aGUKKyAqIG11dGV4ICdtdXRleCcuCisgKi8KK3N0cnVjdCBsb2dnZXJfbG9nIHsKKwl1bnNpZ25lZCBjaGFyICoJCWJ1ZmZlcjsJLyogdGhlIHJpbmcgYnVmZmVyIGl0c2VsZiAqLworCXN0cnVjdCBtaXNjZGV2aWNlCW1pc2M7CS8qIG1pc2MgZGV2aWNlIHJlcHJlc2VudGluZyB0aGUgbG9nICovCisJd2FpdF9xdWV1ZV9oZWFkX3QJd3E7CS8qIHdhaXQgcXVldWUgZm9yIHJlYWRlcnMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCXJlYWRlcnM7IC8qIHRoaXMgbG9nJ3MgcmVhZGVycyAqLworCXN0cnVjdCBtdXRleAkJbXV0ZXg7CS8qIG11dGV4IHByb3RlY3RpbmcgYnVmZmVyICovCisJc2l6ZV90CQkJd19vZmY7CS8qIGN1cnJlbnQgd3JpdGUgaGVhZCBvZmZzZXQgKi8KKwlzaXplX3QJCQloZWFkOwkvKiBuZXcgcmVhZGVycyBzdGFydCBoZXJlICovCisJc2l6ZV90CQkJc2l6ZTsJLyogc2l6ZSBvZiB0aGUgbG9nICovCit9OworCisvKgorICogc3RydWN0IGxvZ2dlcl9yZWFkZXIgLSBhIGxvZ2dpbmcgZGV2aWNlIG9wZW4gZm9yIHJlYWRpbmcKKyAqCisgKiBUaGlzIG9iamVjdCBsaXZlcyBmcm9tIG9wZW4gdG8gcmVsZWFzZSwgc28gd2UgZG9uJ3QgbmVlZCBhZGRpdGlvbmFsCisgKiByZWZlcmVuY2UgY291bnRpbmcuIFRoZSBzdHJ1Y3R1cmUgaXMgcHJvdGVjdGVkIGJ5IGxvZy0+bXV0ZXguCisgKi8KK3N0cnVjdCBsb2dnZXJfcmVhZGVyIHsKKwlzdHJ1Y3QgbG9nZ2VyX2xvZyAqCWxvZzsJLyogYXNzb2NpYXRlZCBsb2cgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CS8qIGVudHJ5IGluIGxvZ2dlcl9sb2cncyBsaXN0ICovCisJc2l6ZV90CQkJcl9vZmY7CS8qIGN1cnJlbnQgcmVhZCBoZWFkIG9mZnNldCAqLworfTsKKworLyogbG9nZ2VyX29mZnNldCAtIHJldHVybnMgaW5kZXggJ24nIGludG8gdGhlIGxvZyB2aWEgKG9wdGltaXplZCkgbW9kdWx1cyAqLworI2RlZmluZSBsb2dnZXJfb2Zmc2V0KG4pCSgobikgJiAobG9nLT5zaXplIC0gMSkpCisKKy8qCisgKiBmaWxlX2dldF9sb2cgLSBHaXZlbiBhIGZpbGUgc3RydWN0dXJlLCByZXR1cm4gdGhlIGFzc29jaWF0ZWQgbG9nCisgKgorICogVGhpcyBpc24ndCBhZXN0aGV0aWMuIFdlIGhhdmUgc2V2ZXJhbCBnb2FsczoKKyAqCisgKiAJMSkgTmVlZCB0byBxdWlja2x5IG9idGFpbiB0aGUgYXNzb2NpYXRlZCBsb2cgZHVyaW5nIGFuIEkvTyBvcGVyYXRpb24KKyAqIAkyKSBSZWFkZXJzIG5lZWQgdG8gbWFpbnRhaW4gc3RhdGUgKGxvZ2dlcl9yZWFkZXIpCisgKiAJMykgV3JpdGVycyBuZWVkIHRvIGJlIHZlcnkgZmFzdCAob3BlbigpIHNob3VsZCBiZSBhIG5lYXIgbm8tb3ApCisgKgorICogSW4gdGhlIHJlYWRlciBjYXNlLCB3ZSBjYW4gdHJpdmlhbGx5IGdvIGZpbGUtPmxvZ2dlcl9yZWFkZXItPmxvZ2dlcl9sb2cuCisgKiBGb3IgYSB3cml0ZXIsIHdlIGRvbid0IHdhbnQgdG8gbWFpbnRhaW4gYSBsb2dnZXJfcmVhZGVyLCBzbyB3ZSBqdXN0IGdvCisgKiBmaWxlLT5sb2dnZXJfbG9nLiBUaHVzIHdoYXQgZmlsZS0+cHJpdmF0ZV9kYXRhIHBvaW50cyBhdCBkZXBlbmRzIG9uIHdoZXRoZXIKKyAqIG9yIG5vdCB0aGUgZmlsZSB3YXMgb3BlbmVkIGZvciByZWFkaW5nLiBUaGlzIGZ1bmN0aW9uIGhpZGVzIHRoYXQgZGlydGluZXNzLgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBsb2dnZXJfbG9nICogZmlsZV9nZXRfbG9nKHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCXN0cnVjdCBsb2dnZXJfcmVhZGVyICpyZWFkZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJCXJldHVybiByZWFkZXItPmxvZzsKKwl9IGVsc2UKKwkJcmV0dXJuIGZpbGUtPnByaXZhdGVfZGF0YTsKK30KKworLyoKKyAqIGdldF9lbnRyeV9sZW4gLSBHcmFicyB0aGUgbGVuZ3RoIG9mIHRoZSBwYXlsb2FkIG9mIHRoZSBuZXh0IGVudHJ5IHN0YXJ0aW5nCisgKiBmcm9tICdvZmYnLgorICoKKyAqIENhbGxlciBuZWVkcyB0byBob2xkIGxvZy0+bXV0ZXguCisgKi8KK3N0YXRpYyBfX3UzMiBnZXRfZW50cnlfbGVuKHN0cnVjdCBsb2dnZXJfbG9nICpsb2csIHNpemVfdCBvZmYpCit7CisJX191MTYgdmFsOworCisJc3dpdGNoIChsb2ctPnNpemUgLSBvZmYpIHsKKwljYXNlIDE6CisJCW1lbWNweSgmdmFsLCBsb2ctPmJ1ZmZlciArIG9mZiwgMSk7CisJCW1lbWNweSgoKGNoYXIgKikgJnZhbCkgKyAxLCBsb2ctPmJ1ZmZlciwgMSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW1lbWNweSgmdmFsLCBsb2ctPmJ1ZmZlciArIG9mZiwgMik7CisJfQorCisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgbG9nZ2VyX2VudHJ5KSArIHZhbDsKK30KKworLyoKKyAqIGRvX3JlYWRfbG9nX3RvX3VzZXIgLSByZWFkcyBleGFjdGx5ICdjb3VudCcgYnl0ZXMgZnJvbSAnbG9nJyBpbnRvIHRoZQorICogdXNlci1zcGFjZSBidWZmZXIgJ2J1ZicuIFJldHVybnMgJ2NvdW50JyBvbiBzdWNjZXNzLgorICoKKyAqIENhbGxlciBtdXN0IGhvbGQgbG9nLT5tdXRleC4KKyAqLworc3RhdGljIHNzaXplX3QgZG9fcmVhZF9sb2dfdG9fdXNlcihzdHJ1Y3QgbG9nZ2VyX2xvZyAqbG9nLAorCQkJCSAgIHN0cnVjdCBsb2dnZXJfcmVhZGVyICpyZWFkZXIsCisJCQkJICAgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkgICBzaXplX3QgY291bnQpCit7CisJc2l6ZV90IGxlbjsKKworCS8qCisJICogV2UgcmVhZCBmcm9tIHRoZSBsb2cgaW4gdHdvIGRpc2pvaW50IG9wZXJhdGlvbnMuIEZpcnN0LCB3ZSByZWFkIGZyb20KKwkgKiB0aGUgY3VycmVudCByZWFkIGhlYWQgb2Zmc2V0IHVwIHRvICdjb3VudCcgYnl0ZXMgb3IgdG8gdGhlIGVuZCBvZgorCSAqIHRoZSBsb2csIHdoaWNoZXZlciBjb21lcyBmaXJzdC4KKwkgKi8KKwlsZW4gPSBtaW4oY291bnQsIGxvZy0+c2l6ZSAtIHJlYWRlci0+cl9vZmYpOworCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBsb2ctPmJ1ZmZlciArIHJlYWRlci0+cl9vZmYsIGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJLyoKKwkgKiBTZWNvbmQsIHdlIHJlYWQgYW55IHJlbWFpbmluZyBieXRlcywgc3RhcnRpbmcgYmFjayBhdCB0aGUgaGVhZCBvZgorCSAqIHRoZSBsb2cuCisJICovCisJaWYgKGNvdW50ICE9IGxlbikKKwkJaWYgKGNvcHlfdG9fdXNlcihidWYgKyBsZW4sIGxvZy0+YnVmZmVyLCBjb3VudCAtIGxlbikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCXJlYWRlci0+cl9vZmYgPSBsb2dnZXJfb2Zmc2V0KHJlYWRlci0+cl9vZmYgKyBjb3VudCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qCisgKiBsb2dnZXJfcmVhZCAtIG91ciBsb2cncyByZWFkKCkgbWV0aG9kCisgKgorICogQmVoYXZpb3I6CisgKgorICogCS0gT19OT05CTE9DSyB3b3JrcworICogCS0gSWYgdGhlcmUgYXJlIG5vIGxvZyBlbnRyaWVzIHRvIHJlYWQsIGJsb2NrcyB1bnRpbCBsb2cgaXMgd3JpdHRlbiB0bworICogCS0gQXRvbWljYWxseSByZWFkcyBleGFjdGx5IG9uZSBsb2cgZW50cnkKKyAqCisgKiBPcHRpbWFsIHJlYWQgc2l6ZSBpcyBMT0dHRVJfRU5UUllfTUFYX0xFTi4gV2lsbCBzZXQgZXJybm8gdG8gRUlOVkFMIGlmIHJlYWQKKyAqIGJ1ZmZlciBpcyBpbnN1ZmZpY2llbnQgdG8gaG9sZCBuZXh0IGVudHJ5LgorICovCitzdGF0aWMgc3NpemVfdCBsb2dnZXJfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGxvZ2dlcl9yZWFkZXIgKnJlYWRlciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbG9nZ2VyX2xvZyAqbG9nID0gcmVhZGVyLT5sb2c7CisJc3NpemVfdCByZXQ7CisJREVGSU5FX1dBSVQod2FpdCk7CisKK3N0YXJ0OgorCXdoaWxlICgxKSB7CisJCXByZXBhcmVfdG9fd2FpdCgmbG9nLT53cSwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisKKwkJbXV0ZXhfbG9jaygmbG9nLT5tdXRleCk7CisJCXJldCA9IChsb2ctPndfb2ZmID09IHJlYWRlci0+cl9vZmYpOworCQltdXRleF91bmxvY2soJmxvZy0+bXV0ZXgpOworCQlpZiAoIXJldCkKKwkJCWJyZWFrOworCisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJcmV0ID0gLUVBR0FJTjsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyZXQgPSAtRUlOVFI7CisJCQlicmVhazsKKwkJfQorCisJCXNjaGVkdWxlKCk7CisJfQorCisJZmluaXNoX3dhaXQoJmxvZy0+d3EsICZ3YWl0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbXV0ZXhfbG9jaygmbG9nLT5tdXRleCk7CisKKwkvKiBpcyB0aGVyZSBzdGlsbCBzb21ldGhpbmcgdG8gcmVhZCBvciBkaWQgd2UgcmFjZT8gKi8KKwlpZiAodW5saWtlbHkobG9nLT53X29mZiA9PSByZWFkZXItPnJfb2ZmKSkgeworCQltdXRleF91bmxvY2soJmxvZy0+bXV0ZXgpOworCQlnb3RvIHN0YXJ0OworCX0KKworCS8qIGdldCB0aGUgc2l6ZSBvZiB0aGUgbmV4dCBlbnRyeSAqLworCXJldCA9IGdldF9lbnRyeV9sZW4obG9nLCByZWFkZXItPnJfb2ZmKTsKKwlpZiAoY291bnQgPCByZXQpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJLyogZ2V0IGV4YWN0bHkgb25lIGVudHJ5IGZyb20gdGhlIGxvZyAqLworCXJldCA9IGRvX3JlYWRfbG9nX3RvX3VzZXIobG9nLCByZWFkZXIsIGJ1ZiwgcmV0KTsKKworb3V0OgorCW11dGV4X3VubG9jaygmbG9nLT5tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogZ2V0X25leHRfZW50cnkgLSByZXR1cm4gdGhlIG9mZnNldCBvZiB0aGUgZmlyc3QgdmFsaWQgZW50cnkgYXQgbGVhc3QgJ2xlbicKKyAqIGJ5dGVzIGFmdGVyICdvZmYnLgorICoKKyAqIENhbGxlciBtdXN0IGhvbGQgbG9nLT5tdXRleC4KKyAqLworc3RhdGljIHNpemVfdCBnZXRfbmV4dF9lbnRyeShzdHJ1Y3QgbG9nZ2VyX2xvZyAqbG9nLCBzaXplX3Qgb2ZmLCBzaXplX3QgbGVuKQoreworCXNpemVfdCBjb3VudCA9IDA7CisKKwlkbyB7CisJCXNpemVfdCBuciA9IGdldF9lbnRyeV9sZW4obG9nLCBvZmYpOworCQlvZmYgPSBsb2dnZXJfb2Zmc2V0KG9mZiArIG5yKTsKKwkJY291bnQgKz0gbnI7CisJfSB3aGlsZSAoY291bnQgPCBsZW4pOworCisJcmV0dXJuIG9mZjsKK30KKworLyoKKyAqIGNsb2NrX2ludGVydmFsIC0gaXMgYSA8IGMgPCBiIGluIG1vZC1zcGFjZT8gUHV0IGFub3RoZXIgd2F5LCBkb2VzIHRoZSBsaW5lCisgKiBmcm9tIGEgdG8gYiBjcm9zcyBjPworICovCitzdGF0aWMgaW5saW5lIGludCBjbG9ja19pbnRlcnZhbChzaXplX3QgYSwgc2l6ZV90IGIsIHNpemVfdCBjKQoreworCWlmIChiIDwgYSkgeworCQlpZiAoYSA8IGMgfHwgYiA+PSBjKQorCQkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJaWYgKGEgPCBjICYmIGIgPj0gYykKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogZml4X3VwX3JlYWRlcnMgLSB3YWxrIHRoZSBsaXN0IG9mIGFsbCByZWFkZXJzIGFuZCAiZml4IHVwIiBhbnkgd2hvIHdlcmUKKyAqIGxhcHBlZCBieSB0aGUgd3JpdGVyOyBhbHNvIGRvIHRoZSBzYW1lIGZvciB0aGUgZGVmYXVsdCAic3RhcnQgaGVhZCIuCisgKiBXZSBkbyB0aGlzIGJ5ICJwdWxsaW5nIGZvcndhcmQiIHRoZSByZWFkZXJzIGFuZCBzdGFydCBoZWFkIHRvIHRoZSBmaXJzdAorICogZW50cnkgYWZ0ZXIgdGhlIG5ldyB3cml0ZSBoZWFkLgorICoKKyAqIFRoZSBjYWxsZXIgbmVlZHMgdG8gaG9sZCBsb2ctPm11dGV4LgorICovCitzdGF0aWMgdm9pZCBmaXhfdXBfcmVhZGVycyhzdHJ1Y3QgbG9nZ2VyX2xvZyAqbG9nLCBzaXplX3QgbGVuKQoreworCXNpemVfdCBvbGQgPSBsb2ctPndfb2ZmOworCXNpemVfdCBuZXcgPSBsb2dnZXJfb2Zmc2V0KG9sZCArIGxlbik7CisJc3RydWN0IGxvZ2dlcl9yZWFkZXIgKnJlYWRlcjsKKworCWlmIChjbG9ja19pbnRlcnZhbChvbGQsIG5ldywgbG9nLT5oZWFkKSkKKwkJbG9nLT5oZWFkID0gZ2V0X25leHRfZW50cnkobG9nLCBsb2ctPmhlYWQsIGxlbik7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlYWRlciwgJmxvZy0+cmVhZGVycywgbGlzdCkKKwkJaWYgKGNsb2NrX2ludGVydmFsKG9sZCwgbmV3LCByZWFkZXItPnJfb2ZmKSkKKwkJCXJlYWRlci0+cl9vZmYgPSBnZXRfbmV4dF9lbnRyeShsb2csIHJlYWRlci0+cl9vZmYsIGxlbik7Cit9CisKKy8qCisgKiBkb193cml0ZV9sb2cgLSB3cml0ZXMgJ2xlbicgYnl0ZXMgZnJvbSAnYnVmJyB0byAnbG9nJworICoKKyAqIFRoZSBjYWxsZXIgbmVlZHMgdG8gaG9sZCBsb2ctPm11dGV4LgorICovCitzdGF0aWMgdm9pZCBkb193cml0ZV9sb2coc3RydWN0IGxvZ2dlcl9sb2cgKmxvZywgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc2l6ZV90IGxlbjsKKworCWxlbiA9IG1pbihjb3VudCwgbG9nLT5zaXplIC0gbG9nLT53X29mZik7CisJbWVtY3B5KGxvZy0+YnVmZmVyICsgbG9nLT53X29mZiwgYnVmLCBsZW4pOworCisJaWYgKGNvdW50ICE9IGxlbikKKwkJbWVtY3B5KGxvZy0+YnVmZmVyLCBidWYgKyBsZW4sIGNvdW50IC0gbGVuKTsKKworCWxvZy0+d19vZmYgPSBsb2dnZXJfb2Zmc2V0KGxvZy0+d19vZmYgKyBjb3VudCk7CisKK30KKworLyoKKyAqIGRvX3dyaXRlX2xvZ191c2VyIC0gd3JpdGVzICdsZW4nIGJ5dGVzIGZyb20gdGhlIHVzZXItc3BhY2UgYnVmZmVyICdidWYnIHRvCisgKiB0aGUgbG9nICdsb2cnCisgKgorICogVGhlIGNhbGxlciBuZWVkcyB0byBob2xkIGxvZy0+bXV0ZXguCisgKgorICogUmV0dXJucyAnY291bnQnIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIHNzaXplX3QgZG9fd3JpdGVfbG9nX2Zyb21fdXNlcihzdHJ1Y3QgbG9nZ2VyX2xvZyAqbG9nLAorCQkJCSAgICAgIGNvbnN0IHZvaWQgX191c2VyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzaXplX3QgbGVuOworCisJbGVuID0gbWluKGNvdW50LCBsb2ctPnNpemUgLSBsb2ctPndfb2ZmKTsKKwlpZiAobGVuICYmIGNvcHlfZnJvbV91c2VyKGxvZy0+YnVmZmVyICsgbG9nLT53X29mZiwgYnVmLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChjb3VudCAhPSBsZW4pCisJCWlmIChjb3B5X2Zyb21fdXNlcihsb2ctPmJ1ZmZlciwgYnVmICsgbGVuLCBjb3VudCAtIGxlbikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCWxvZy0+d19vZmYgPSBsb2dnZXJfb2Zmc2V0KGxvZy0+d19vZmYgKyBjb3VudCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qCisgKiBsb2dnZXJfYWlvX3dyaXRlIC0gb3VyIHdyaXRlIG1ldGhvZCwgaW1wbGVtZW50aW5nIHN1cHBvcnQgZm9yIHdyaXRlKCksCisgKiB3cml0ZXYoKSwgYW5kIGFpb193cml0ZSgpLiBXcml0ZXMgYXJlIG91ciBmYXN0IHBhdGgsIGFuZCB3ZSB0cnkgdG8gb3B0aW1pemUKKyAqIHRoZW0gYWJvdmUgYWxsIGVsc2UuCisgKi8KK3NzaXplX3QgbG9nZ2VyX2Fpb193cml0ZShzdHJ1Y3Qga2lvY2IgKmlvY2IsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAorCQkJIHVuc2lnbmVkIGxvbmcgbnJfc2VncywgbG9mZl90IHBwb3MpCit7CisJc3RydWN0IGxvZ2dlcl9sb2cgKmxvZyA9IGZpbGVfZ2V0X2xvZyhpb2NiLT5raV9maWxwKTsKKwlzaXplX3Qgb3JpZyA9IGxvZy0+d19vZmY7CisJc3RydWN0IGxvZ2dlcl9lbnRyeSBoZWFkZXI7CisJc3RydWN0IHRpbWVzcGVjIG5vdzsKKwlzc2l6ZV90IHJldCA9IDA7CisKKwlub3cgPSBjdXJyZW50X2tlcm5lbF90aW1lKCk7CisKKwloZWFkZXIucGlkID0gY3VycmVudC0+dGdpZDsKKwloZWFkZXIudGlkID0gY3VycmVudC0+cGlkOworCWhlYWRlci5zZWMgPSBub3cudHZfc2VjOworCWhlYWRlci5uc2VjID0gbm93LnR2X25zZWM7CisJaGVhZGVyLmxlbiA9IG1pbl90KHNpemVfdCwgaW9jYi0+a2lfbGVmdCwgTE9HR0VSX0VOVFJZX01BWF9QQVlMT0FEKTsKKworCS8qIG51bGwgd3JpdGVzIHN1Y2NlZWQsIHJldHVybiB6ZXJvICovCisJaWYgKHVubGlrZWx5KCFoZWFkZXIubGVuKSkKKwkJcmV0dXJuIDA7CisKKwltdXRleF9sb2NrKCZsb2ctPm11dGV4KTsKKworCS8qCisJICogRml4IHVwIGFueSByZWFkZXJzLCBwdWxsaW5nIHRoZW0gZm9yd2FyZCB0byB0aGUgZmlyc3QgcmVhZGFibGUKKwkgKiBlbnRyeSBhZnRlciAod2hhdCB3aWxsIGJlKSB0aGUgbmV3IHdyaXRlIG9mZnNldC4gV2UgZG8gdGhpcyBub3cKKwkgKiBiZWNhdXNlIGlmIHdlIHBhcnRpYWxseSBmYWlsLCB3ZSBjYW4gZW5kIHVwIHdpdGggY2xvYmJlcmVkIGxvZworCSAqIGVudHJpZXMgdGhhdCBlbmNyb2FjaCBvbiByZWFkYWJsZSBidWZmZXIuCisJICovCisJZml4X3VwX3JlYWRlcnMobG9nLCBzaXplb2Yoc3RydWN0IGxvZ2dlcl9lbnRyeSkgKyBoZWFkZXIubGVuKTsKKworCWRvX3dyaXRlX2xvZyhsb2csICZoZWFkZXIsIHNpemVvZihzdHJ1Y3QgbG9nZ2VyX2VudHJ5KSk7CisKKwl3aGlsZSAobnJfc2Vncy0tID4gMCkgeworCQlzaXplX3QgbGVuOworCQlzc2l6ZV90IG5yOworCisJCS8qIGZpZ3VyZSBvdXQgaG93IG11Y2ggb2YgdGhpcyB2ZWN0b3Igd2UgY2FuIGtlZXAgKi8KKwkJbGVuID0gbWluX3Qoc2l6ZV90LCBpb3YtPmlvdl9sZW4sIGhlYWRlci5sZW4gLSByZXQpOworCisJCS8qIHdyaXRlIG91dCB0aGlzIHNlZ21lbnQncyBwYXlsb2FkICovCisJCW5yID0gZG9fd3JpdGVfbG9nX2Zyb21fdXNlcihsb2csIGlvdi0+aW92X2Jhc2UsIGxlbik7CisJCWlmICh1bmxpa2VseShuciA8IDApKSB7CisJCQlsb2ctPndfb2ZmID0gb3JpZzsKKwkJCW11dGV4X3VubG9jaygmbG9nLT5tdXRleCk7CisJCQlyZXR1cm4gbnI7CisJCX0KKworCQlpb3YrKzsKKwkJcmV0ICs9IG5yOworCX0KKworCW11dGV4X3VubG9jaygmbG9nLT5tdXRleCk7CisKKwkvKiB3YWtlIHVwIGFueSBibG9ja2VkIHJlYWRlcnMgKi8KKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmxvZy0+d3EpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBsb2dnZXJfbG9nICogZ2V0X2xvZ19mcm9tX21pbm9yKGludCk7CisKKy8qCisgKiBsb2dnZXJfb3BlbiAtIHRoZSBsb2cncyBvcGVuKCkgZmlsZSBvcGVyYXRpb24KKyAqCisgKiBOb3RlIGhvdyBuZWFyIGEgbm8tb3AgdGhpcyBpcyBpbiB0aGUgd3JpdGUtb25seSBjYXNlLiBLZWVwIGl0IHRoYXQgd2F5IQorICovCitzdGF0aWMgaW50IGxvZ2dlcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBsb2dnZXJfbG9nICpsb2c7CisJaW50IHJldDsKKworCXJldCA9IG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlsb2cgPSBnZXRfbG9nX2Zyb21fbWlub3IoTUlOT1IoaW5vZGUtPmlfcmRldikpOworCWlmICghbG9nKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCXN0cnVjdCBsb2dnZXJfcmVhZGVyICpyZWFkZXI7CisKKwkJcmVhZGVyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxvZ2dlcl9yZWFkZXIpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFyZWFkZXIpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlyZWFkZXItPmxvZyA9IGxvZzsKKwkJSU5JVF9MSVNUX0hFQUQoJnJlYWRlci0+bGlzdCk7CisKKwkJbXV0ZXhfbG9jaygmbG9nLT5tdXRleCk7CisJCXJlYWRlci0+cl9vZmYgPSBsb2ctPmhlYWQ7CisJCWxpc3RfYWRkX3RhaWwoJnJlYWRlci0+bGlzdCwgJmxvZy0+cmVhZGVycyk7CisJCW11dGV4X3VubG9jaygmbG9nLT5tdXRleCk7CisKKwkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gcmVhZGVyOworCX0gZWxzZQorCQlmaWxlLT5wcml2YXRlX2RhdGEgPSBsb2c7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGxvZ2dlcl9yZWxlYXNlIC0gdGhlIGxvZydzIHJlbGVhc2UgZmlsZSBvcGVyYXRpb24KKyAqCisgKiBOb3RlIHRoaXMgaXMgYSB0b3RhbCBuby1vcCBpbiB0aGUgd3JpdGUtb25seSBjYXNlLiBLZWVwIGl0IHRoYXQgd2F5IQorICovCitzdGF0aWMgaW50IGxvZ2dlcl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaWdub3JlZCwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJc3RydWN0IGxvZ2dlcl9yZWFkZXIgKnJlYWRlciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwkJbGlzdF9kZWwoJnJlYWRlci0+bGlzdCk7CisJCWtmcmVlKHJlYWRlcik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBsb2dnZXJfcG9sbCAtIHRoZSBsb2cncyBwb2xsIGZpbGUgb3BlcmF0aW9uLCBmb3IgcG9sbC9zZWxlY3QvZXBvbGwKKyAqCisgKiBOb3RlIHdlIGFsd2F5cyByZXR1cm4gUE9MTE9VVCwgYmVjYXVzZSB5b3UgY2FuIGFsd2F5cyB3cml0ZSgpIHRvIHRoZSBsb2cuCisgKiBOb3RlIGFsc28gdGhhdCwgc3RyaWN0bHkgc3BlYWtpbmcsIGEgcmV0dXJuIHZhbHVlIG9mIFBPTExJTiBkb2VzIG5vdAorICogZ3VhcmFudGVlIHRoYXQgdGhlIGxvZyBpcyByZWFkYWJsZSB3aXRob3V0IGJsb2NraW5nLCBhcyB0aGVyZSBpcyBhIHNtYWxsCisgKiBjaGFuY2UgdGhhdCB0aGUgd3JpdGVyIGNhbiBsYXAgdGhlIHJlYWRlciBpbiB0aGUgaW50ZXJpbSBiZXR3ZWVuIHBvbGwoKQorICogcmV0dXJuaW5nIGFuZCB0aGUgcmVhZCgpIHJlcXVlc3QuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbG9nZ2VyX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJc3RydWN0IGxvZ2dlcl9yZWFkZXIgKnJlYWRlcjsKKwlzdHJ1Y3QgbG9nZ2VyX2xvZyAqbG9nOworCXVuc2lnbmVkIGludCByZXQgPSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKworCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQorCQlyZXR1cm4gcmV0OworCisJcmVhZGVyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWxvZyA9IHJlYWRlci0+bG9nOworCisJcG9sbF93YWl0KGZpbGUsICZsb2ctPndxLCB3YWl0KTsKKworCW11dGV4X2xvY2soJmxvZy0+bXV0ZXgpOworCWlmIChsb2ctPndfb2ZmICE9IHJlYWRlci0+cl9vZmYpCisJCXJldCB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCW11dGV4X3VubG9jaygmbG9nLT5tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgbG9uZyBsb2dnZXJfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBsb2dnZXJfbG9nICpsb2cgPSBmaWxlX2dldF9sb2coZmlsZSk7CisJc3RydWN0IGxvZ2dlcl9yZWFkZXIgKnJlYWRlcjsKKwlsb25nIHJldCA9IC1FTk9UVFk7CisKKwltdXRleF9sb2NrKCZsb2ctPm11dGV4KTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBMT0dHRVJfR0VUX0xPR19CVUZfU0laRToKKwkJcmV0ID0gbG9nLT5zaXplOworCQlicmVhazsKKwljYXNlIExPR0dFUl9HRVRfTE9HX0xFTjoKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKKwkJCXJldCA9IC1FQkFERjsKKwkJCWJyZWFrOworCQl9CisJCXJlYWRlciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwkJaWYgKGxvZy0+d19vZmYgPj0gcmVhZGVyLT5yX29mZikKKwkJCXJldCA9IGxvZy0+d19vZmYgLSByZWFkZXItPnJfb2ZmOworCQllbHNlCisJCQlyZXQgPSAobG9nLT5zaXplIC0gcmVhZGVyLT5yX29mZikgKyBsb2ctPndfb2ZmOworCQlicmVhazsKKwljYXNlIExPR0dFUl9HRVRfTkVYVF9FTlRSWV9MRU46CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7CisJCQlyZXQgPSAtRUJBREY7CisJCQlicmVhazsKKwkJfQorCQlyZWFkZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJCWlmIChsb2ctPndfb2ZmICE9IHJlYWRlci0+cl9vZmYpCisJCQlyZXQgPSBnZXRfZW50cnlfbGVuKGxvZywgcmVhZGVyLT5yX29mZik7CisJCWVsc2UKKwkJCXJldCA9IDA7CisJCWJyZWFrOworCWNhc2UgTE9HR0VSX0ZMVVNIX0xPRzoKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKSB7CisJCQlyZXQgPSAtRUJBREY7CisJCQlicmVhazsKKwkJfQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlYWRlciwgJmxvZy0+cmVhZGVycywgbGlzdCkKKwkJCXJlYWRlci0+cl9vZmYgPSBsb2ctPndfb2ZmOworCQlsb2ctPmhlYWQgPSBsb2ctPndfb2ZmOworCQlyZXQgPSAwOworCQlicmVhazsKKwl9CisKKwltdXRleF91bmxvY2soJmxvZy0+bXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbG9nZ2VyX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLnJlYWQgPSBsb2dnZXJfcmVhZCwKKwkuYWlvX3dyaXRlID0gbG9nZ2VyX2Fpb193cml0ZSwKKwkucG9sbCA9IGxvZ2dlcl9wb2xsLAorCS51bmxvY2tlZF9pb2N0bCA9IGxvZ2dlcl9pb2N0bCwKKwkuY29tcGF0X2lvY3RsID0gbG9nZ2VyX2lvY3RsLAorCS5vcGVuID0gbG9nZ2VyX29wZW4sCisJLnJlbGVhc2UgPSBsb2dnZXJfcmVsZWFzZSwKK307CisKKy8qCisgKiBEZWZpbmVzIGEgbG9nIHN0cnVjdHVyZSB3aXRoIG5hbWUgJ05BTUUnIGFuZCBhIHNpemUgb2YgJ1NJWkUnIGJ5dGVzLCB3aGljaAorICogbXVzdCBiZSBhIHBvd2VyIG9mIHR3bywgZ3JlYXRlciB0aGFuIExPR0dFUl9FTlRSWV9NQVhfTEVOLCBhbmQgbGVzcyB0aGFuCisgKiBMT05HX01BWCBtaW51cyBMT0dHRVJfRU5UUllfTUFYX0xFTi4KKyAqLworI2RlZmluZSBERUZJTkVfTE9HR0VSX0RFVklDRShWQVIsIE5BTUUsIFNJWkUpIFwKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIF9idWZfICMjIFZBUltTSVpFXTsgXAorc3RhdGljIHN0cnVjdCBsb2dnZXJfbG9nIFZBUiA9IHsgXAorCS5idWZmZXIgPSBfYnVmXyAjIyBWQVIsIFwKKwkubWlzYyA9IHsgXAorCQkubWlub3IgPSBNSVNDX0RZTkFNSUNfTUlOT1IsIFwKKwkJLm5hbWUgPSBOQU1FLCBcCisJCS5mb3BzID0gJmxvZ2dlcl9mb3BzLCBcCisJCS5wYXJlbnQgPSBOVUxMLCBcCisJfSwgXAorCS53cSA9IF9fV0FJVF9RVUVVRV9IRUFEX0lOSVRJQUxJWkVSKFZBUiAud3EpLCBcCisJLnJlYWRlcnMgPSBMSVNUX0hFQURfSU5JVChWQVIgLnJlYWRlcnMpLCBcCisJLm11dGV4ID0gX19NVVRFWF9JTklUSUFMSVpFUihWQVIgLm11dGV4KSwgXAorCS53X29mZiA9IDAsIFwKKwkuaGVhZCA9IDAsIFwKKwkuc2l6ZSA9IFNJWkUsIFwKK307CisKK0RFRklORV9MT0dHRVJfREVWSUNFKGxvZ19tYWluLCBMT0dHRVJfTE9HX01BSU4sIDY0KjEwMjQpCitERUZJTkVfTE9HR0VSX0RFVklDRShsb2dfZXZlbnRzLCBMT0dHRVJfTE9HX0VWRU5UUywgMjU2KjEwMjQpCitERUZJTkVfTE9HR0VSX0RFVklDRShsb2dfcmFkaW8sIExPR0dFUl9MT0dfUkFESU8sIDY0KjEwMjQpCisKK3N0YXRpYyBzdHJ1Y3QgbG9nZ2VyX2xvZyAqIGdldF9sb2dfZnJvbV9taW5vcihpbnQgbWlub3IpCit7CisJaWYgKGxvZ19tYWluLm1pc2MubWlub3IgPT0gbWlub3IpCisJCXJldHVybiAmbG9nX21haW47CisJaWYgKGxvZ19ldmVudHMubWlzYy5taW5vciA9PSBtaW5vcikKKwkJcmV0dXJuICZsb2dfZXZlbnRzOworCWlmIChsb2dfcmFkaW8ubWlzYy5taW5vciA9PSBtaW5vcikKKwkJcmV0dXJuICZsb2dfcmFkaW87CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbG9nKHN0cnVjdCBsb2dnZXJfbG9nICpsb2cpCit7CisJaW50IHJldDsKKworCXJldCA9IG1pc2NfcmVnaXN0ZXIoJmxvZy0+bWlzYyk7CisJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJsb2dnZXI6IGZhaWxlZCB0byByZWdpc3RlciBtaXNjICIKKwkJICAgICAgICJkZXZpY2UgZm9yIGxvZyAnJXMnIVxuIiwgbG9nLT5taXNjLm5hbWUpOworCQlyZXR1cm4gcmV0OworCX0KKworCXByaW50ayhLRVJOX0lORk8gImxvZ2dlcjogY3JlYXRlZCAlbHVLIGxvZyAnJXMnXG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZykgbG9nLT5zaXplID4+IDEwLCBsb2ctPm1pc2MubmFtZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgbG9nZ2VyX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaW5pdF9sb2coJmxvZ19tYWluKTsKKwlpZiAodW5saWtlbHkocmV0KSkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBpbml0X2xvZygmbG9nX2V2ZW50cyk7CisJaWYgKHVubGlrZWx5KHJldCkpCisJCWdvdG8gb3V0OworCisJcmV0ID0gaW5pdF9sb2coJmxvZ19yYWRpbyk7CisJaWYgKHVubGlrZWx5KHJldCkpCisJCWdvdG8gb3V0OworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KK2RldmljZV9pbml0Y2FsbChsb2dnZXJfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9sb2dnZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2xvZ2dlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NjI0MzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9sb2dnZXIuaApAQCAtMCwwICsxLDQ4IEBACisvKiBpbmNsdWRlL2xpbnV4L2xvZ2dlci5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggR29vZ2xlLCBJbmMuCisgKiBBdXRob3I6IFJvYmVydCBMb3ZlIDxybG92ZUBhbmRyb2lkLmNvbT4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIF9MSU5VWF9MT0dHRVJfSAorI2RlZmluZSBfTElOVVhfTE9HR0VSX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworc3RydWN0IGxvZ2dlcl9lbnRyeSB7CisJX191MTYJCWxlbjsJLyogbGVuZ3RoIG9mIHRoZSBwYXlsb2FkICovCisJX191MTYJCV9fcGFkOwkvKiBubyBtYXR0ZXIgd2hhdCwgd2UgZ2V0IDIgYnl0ZXMgb2YgcGFkZGluZyAqLworCV9fczMyCQlwaWQ7CS8qIGdlbmVyYXRpbmcgcHJvY2VzcydzIHBpZCAqLworCV9fczMyCQl0aWQ7CS8qIGdlbmVyYXRpbmcgcHJvY2VzcydzIHRpZCAqLworCV9fczMyCQlzZWM7CS8qIHNlY29uZHMgc2luY2UgRXBvY2ggKi8KKwlfX3MzMgkJbnNlYzsJLyogbmFub3NlY29uZHMgKi8KKwljaGFyCQltc2dbMF07CS8qIHRoZSBlbnRyeSdzIHBheWxvYWQgKi8KK307CisKKyNkZWZpbmUgTE9HR0VSX0xPR19SQURJTwkibG9nX3JhZGlvIgkvKiByYWRpby1yZWxhdGVkIG1lc3NhZ2VzICovCisjZGVmaW5lIExPR0dFUl9MT0dfRVZFTlRTCSJsb2dfZXZlbnRzIgkvKiBzeXN0ZW0vaGFyZHdhcmUgZXZlbnRzICovCisjZGVmaW5lIExPR0dFUl9MT0dfTUFJTgkJImxvZ19tYWluIgkvKiBldmVyeXRoaW5nIGVsc2UgKi8KKworI2RlZmluZSBMT0dHRVJfRU5UUllfTUFYX0xFTgkJKDQqMTAyNCkKKyNkZWZpbmUgTE9HR0VSX0VOVFJZX01BWF9QQVlMT0FECVwKKwkoTE9HR0VSX0VOVFJZX01BWF9MRU4gLSBzaXplb2Yoc3RydWN0IGxvZ2dlcl9lbnRyeSkpCisKKyNkZWZpbmUgX19MT0dHRVJJTwkweEFFCisKKyNkZWZpbmUgTE9HR0VSX0dFVF9MT0dfQlVGX1NJWkUJCV9JTyhfX0xPR0dFUklPLCAxKSAvKiBzaXplIG9mIGxvZyAqLworI2RlZmluZSBMT0dHRVJfR0VUX0xPR19MRU4JCV9JTyhfX0xPR0dFUklPLCAyKSAvKiB1c2VkIGxvZyBsZW4gKi8KKyNkZWZpbmUgTE9HR0VSX0dFVF9ORVhUX0VOVFJZX0xFTglfSU8oX19MT0dHRVJJTywgMykgLyogbmV4dCBlbnRyeSBsZW4gKi8KKyNkZWZpbmUgTE9HR0VSX0ZMVVNIX0xPRwkJX0lPKF9fTE9HR0VSSU8sIDQpIC8qIGZsdXNoIGxvZyAqLworCisjZW5kaWYgLyogX0xJTlVYX0xPR0dFUl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9sb3dtZW1vcnlraWxsZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2xvd21lbW9yeWtpbGxlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MTVkNTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9sb3dtZW1vcnlraWxsZXIuYwpAQCAtMCwwICsxLDExOSBAQAorLyogZHJpdmVycy9taXNjL2xvd21lbW9yeWtpbGxlci5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggR29vZ2xlLCBJbmMuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvb29tLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworc3RhdGljIGludCBsb3dtZW1fc2hyaW5rKGludCBucl90b19zY2FuLCBnZnBfdCBnZnBfbWFzayk7CisKK3N0YXRpYyBzdHJ1Y3Qgc2hyaW5rZXIgbG93bWVtX3Nocmlua2VyID0geworCS5zaHJpbmsgPSBsb3dtZW1fc2hyaW5rLAorCS5zZWVrcyA9IERFRkFVTFRfU0VFS1MgKiAxNgorfTsKK3N0YXRpYyB1aW50MzJfdCBsb3dtZW1fZGVidWdfbGV2ZWwgPSAyOworc3RhdGljIGludCBsb3dtZW1fYWRqWzZdID0geworCTAsCisJMSwKKwk2LAorCTEyLAorfTsKK3N0YXRpYyBpbnQgbG93bWVtX2Fkal9zaXplID0gNDsKK3N0YXRpYyBzaXplX3QgbG93bWVtX21pbmZyZWVbNl0gPSB7CisJMyo1MTIsIC8vIDZNQgorCTIqMTAyNCwgLy8gOE1CCisJNCoxMDI0LCAvLyAxNk1CCisJMTYqMTAyNCwgLy8gNjRNQgorfTsKK3N0YXRpYyBpbnQgbG93bWVtX21pbmZyZWVfc2l6ZSA9IDQ7CisKKyNkZWZpbmUgbG93bWVtX3ByaW50KGxldmVsLCB4Li4uKSBkbyB7IGlmKGxvd21lbV9kZWJ1Z19sZXZlbCA+PSAobGV2ZWwpKSBwcmludGsoeCk7IH0gd2hpbGUoMCkKKworbW9kdWxlX3BhcmFtX25hbWVkKGNvc3QsIGxvd21lbV9zaHJpbmtlci5zZWVrcywgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7Cittb2R1bGVfcGFyYW1fYXJyYXlfbmFtZWQoYWRqLCBsb3dtZW1fYWRqLCBpbnQsICZsb3dtZW1fYWRqX3NpemUsIFNfSVJVR08gfCBTX0lXVVNSKTsKK21vZHVsZV9wYXJhbV9hcnJheV9uYW1lZChtaW5mcmVlLCBsb3dtZW1fbWluZnJlZSwgdWludCwgJmxvd21lbV9taW5mcmVlX3NpemUsIFNfSVJVR08gfCBTX0lXVVNSKTsKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1Z19sZXZlbCwgbG93bWVtX2RlYnVnX2xldmVsLCB1aW50LCBTX0lSVUdPIHwgU19JV1VTUik7CisKK3N0YXRpYyBpbnQgbG93bWVtX3NocmluayhpbnQgbnJfdG9fc2NhbiwgZ2ZwX3QgZ2ZwX21hc2spCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICpwOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqc2VsZWN0ZWQgPSBOVUxMOworCWludCByZW0gPSAwOworCWludCB0YXNrc2l6ZTsKKwlpbnQgaTsKKwlpbnQgbWluX2FkaiA9IE9PTV9BREpVU1RfTUFYICsgMTsKKwlpbnQgc2VsZWN0ZWRfdGFza3NpemUgPSAwOworCWludCBhcnJheV9zaXplID0gQVJSQVlfU0laRShsb3dtZW1fYWRqKTsKKwlpbnQgb3RoZXJfZnJlZSA9IGdsb2JhbF9wYWdlX3N0YXRlKE5SX0ZSRUVfUEFHRVMpICsgZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfRklMRV9QQUdFUyk7CisJaWYobG93bWVtX2Fkal9zaXplIDwgYXJyYXlfc2l6ZSkKKwkJYXJyYXlfc2l6ZSA9IGxvd21lbV9hZGpfc2l6ZTsKKwlpZihsb3dtZW1fbWluZnJlZV9zaXplIDwgYXJyYXlfc2l6ZSkKKwkJYXJyYXlfc2l6ZSA9IGxvd21lbV9taW5mcmVlX3NpemU7CisJZm9yKGkgPSAwOyBpIDwgYXJyYXlfc2l6ZTsgaSsrKSB7CisJCWlmKG90aGVyX2ZyZWUgPCBsb3dtZW1fbWluZnJlZVtpXSkgeworCQkJbWluX2FkaiA9IGxvd21lbV9hZGpbaV07CisJCQlicmVhazsKKwkJfQorCX0KKwlpZihucl90b19zY2FuID4gMCkKKwkJbG93bWVtX3ByaW50KDMsICJsb3dtZW1fc2hyaW5rICVkLCAleCwgb2ZyZWUgJWQsIG1hICVkXG4iLCBucl90b19zY2FuLCBnZnBfbWFzaywgb3RoZXJfZnJlZSwgbWluX2Fkaik7CisJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlmb3JfZWFjaF9wcm9jZXNzKHApIHsKKwkJaWYocC0+b29ta2lsbGFkaiA+PSAwICYmIHAtPm1tKSB7CisJCQl0YXNrc2l6ZSA9IGdldF9tbV9yc3MocC0+bW0pOworCQkJaWYobnJfdG9fc2NhbiA+IDAgJiYgdGFza3NpemUgPiAwICYmIHAtPm9vbWtpbGxhZGogPj0gbWluX2FkaikgeworCQkJCWlmKHNlbGVjdGVkID09IE5VTEwgfHwKKwkJCQkgICBwLT5vb21raWxsYWRqID4gc2VsZWN0ZWQtPm9vbWtpbGxhZGogfHwKKwkJCQkgICAocC0+b29ta2lsbGFkaiA9PSBzZWxlY3RlZC0+b29ta2lsbGFkaiAmJgorCQkJCSAgICB0YXNrc2l6ZSA+IHNlbGVjdGVkX3Rhc2tzaXplKSkgeworCQkJCQlzZWxlY3RlZCA9IHA7CisJCQkJCXNlbGVjdGVkX3Rhc2tzaXplID0gdGFza3NpemU7CisJCQkJCWxvd21lbV9wcmludCgyLCAic2VsZWN0ICVkICglcyksIGFkaiAlZCwgc2l6ZSAlZCwgdG8ga2lsbFxuIiwKKwkJCQkJICAgICAgICAgICAgIHAtPnBpZCwgcC0+Y29tbSwgcC0+b29ta2lsbGFkaiwgdGFza3NpemUpOworCQkJCX0KKwkJCX0KKwkJCXJlbSArPSB0YXNrc2l6ZTsKKwkJfQorCX0KKwlpZihzZWxlY3RlZCAhPSBOVUxMKSB7CisJCWxvd21lbV9wcmludCgxLCAic2VuZCBzaWdraWxsIHRvICVkICglcyksIGFkaiAlZCwgc2l6ZSAlZFxuIiwKKwkJICAgICAgICAgICAgIHNlbGVjdGVkLT5waWQsIHNlbGVjdGVkLT5jb21tLAorCQkgICAgICAgICAgICAgc2VsZWN0ZWQtPm9vbWtpbGxhZGosIHNlbGVjdGVkX3Rhc2tzaXplKTsKKwkJZm9yY2Vfc2lnKFNJR0tJTEwsIHNlbGVjdGVkKTsKKwkJcmVtIC09IHNlbGVjdGVkX3Rhc2tzaXplOworCX0KKwlsb3dtZW1fcHJpbnQoNCwgImxvd21lbV9zaHJpbmsgJWQsICV4LCByZXR1cm4gJWRcbiIsIG5yX3RvX3NjYW4sIGdmcF9tYXNrLCByZW0pOworCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlyZXR1cm4gcmVtOworfQorCitzdGF0aWMgaW50IF9faW5pdCBsb3dtZW1faW5pdCh2b2lkKQoreworCXJlZ2lzdGVyX3Nocmlua2VyKCZsb3dtZW1fc2hyaW5rZXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbG93bWVtX2V4aXQodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX3Nocmlua2VyKCZsb3dtZW1fc2hyaW5rZXIpOworfQorCittb2R1bGVfaW5pdChsb3dtZW1faW5pdCk7Cittb2R1bGVfZXhpdChsb3dtZW1fZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvcmFtX2NvbnNvbGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3JhbV9jb25zb2xlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYwMDY4NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3JhbV9jb25zb2xlLmMKQEAgLTAsMCArMSwzOTUgQEAKKy8qIGRyaXZlcnMvYW5kcm9pZC9yYW1fY29uc29sZS5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggR29vZ2xlLCBJbmMuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2lmZGVmIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT04KKyNpbmNsdWRlIDxsaW51eC9yc2xpYi5oPgorI2VuZGlmCisKK3N0cnVjdCByYW1fY29uc29sZV9idWZmZXIgeworCXVpbnQzMl90ICAgIHNpZzsKKwl1aW50MzJfdCAgICBzdGFydDsKKwl1aW50MzJfdCAgICBzaXplOworCXVpbnQ4X3QgICAgIGRhdGFbMF07Cit9OworCisjZGVmaW5lIFJBTV9DT05TT0xFX1NJRyAoMHg0MzQ3NDI0NCkgLyogREJHQyAqLworCisjaWZkZWYgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRUFSTFlfSU5JVAorc3RhdGljIGNoYXIgX19pbml0ZGF0YQorCXJhbV9jb25zb2xlX29sZF9sb2dfaW5pdF9idWZmZXJbQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRUFSTFlfU0laRV07CisjZW5kaWYKK3N0YXRpYyBjaGFyICpyYW1fY29uc29sZV9vbGRfbG9nOworc3RhdGljIHNpemVfdCByYW1fY29uc29sZV9vbGRfbG9nX3NpemU7CisKK3N0YXRpYyBzdHJ1Y3QgcmFtX2NvbnNvbGVfYnVmZmVyICpyYW1fY29uc29sZV9idWZmZXI7CitzdGF0aWMgc2l6ZV90IHJhbV9jb25zb2xlX2J1ZmZlcl9zaXplOworI2lmZGVmIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT04KK3N0YXRpYyBjaGFyICpyYW1fY29uc29sZV9wYXJfYnVmZmVyOworc3RhdGljIHN0cnVjdCByc19jb250cm9sICpyYW1fY29uc29sZV9yc19kZWNvZGVyOworc3RhdGljIGludCByYW1fY29uc29sZV9jb3JyZWN0ZWRfYnl0ZXM7CitzdGF0aWMgaW50IHJhbV9jb25zb2xlX2JhZF9ibG9ja3M7CisjZGVmaW5lIEVDQ19CTE9DS19TSVpFIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT05fREFUQV9TSVpFCisjZGVmaW5lIEVDQ19TSVpFIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT05fRUNDX1NJWkUKKyNkZWZpbmUgRUNDX1NZTVNJWkUgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTl9TWU1CT0xfU0laRQorI2RlZmluZSBFQ0NfUE9MWSBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OX1BPTFlOT01JQUwKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTgorc3RhdGljIHZvaWQgcmFtX2NvbnNvbGVfZW5jb2RlX3JzOCh1aW50OF90ICpkYXRhLCBzaXplX3QgbGVuLCB1aW50OF90ICplY2MpCit7CisJaW50IGk7CisJdWludDE2X3QgcGFyW0VDQ19TSVpFXTsKKwkvKiBJbml0aWFsaXplIHRoZSBwYXJpdHkgYnVmZmVyICovCisJbWVtc2V0KHBhciwgMCwgc2l6ZW9mKHBhcikpOworCWVuY29kZV9yczgocmFtX2NvbnNvbGVfcnNfZGVjb2RlciwgZGF0YSwgbGVuLCBwYXIsIDApOworCWZvciAoaSA9IDA7IGkgPCBFQ0NfU0laRTsgaSsrKQorCQllY2NbaV0gPSBwYXJbaV07Cit9CisKK3N0YXRpYyBpbnQgcmFtX2NvbnNvbGVfZGVjb2RlX3JzOCh2b2lkICpkYXRhLCBzaXplX3QgbGVuLCB1aW50OF90ICplY2MpCit7CisJaW50IGk7CisJdWludDE2X3QgcGFyW0VDQ19TSVpFXTsKKwlmb3IgKGkgPSAwOyBpIDwgRUNDX1NJWkU7IGkrKykKKwkJcGFyW2ldID0gZWNjW2ldOworCXJldHVybiBkZWNvZGVfcnM4KHJhbV9jb25zb2xlX3JzX2RlY29kZXIsIGRhdGEsIHBhciwgbGVuLAorCQkJCU5VTEwsIDAsIE5VTEwsIDAsIE5VTEwpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHJhbV9jb25zb2xlX3VwZGF0ZShjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJc3RydWN0IHJhbV9jb25zb2xlX2J1ZmZlciAqYnVmZmVyID0gcmFtX2NvbnNvbGVfYnVmZmVyOworI2lmZGVmIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT04KKwl1aW50OF90ICpidWZmZXJfZW5kID0gYnVmZmVyLT5kYXRhICsgcmFtX2NvbnNvbGVfYnVmZmVyX3NpemU7CisJdWludDhfdCAqYmxvY2s7CisJdWludDhfdCAqcGFyOworCWludCBzaXplID0gRUNDX0JMT0NLX1NJWkU7CisjZW5kaWYKKwltZW1jcHkoYnVmZmVyLT5kYXRhICsgYnVmZmVyLT5zdGFydCwgcywgY291bnQpOworI2lmZGVmIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT04KKwlibG9jayA9IGJ1ZmZlci0+ZGF0YSArIChidWZmZXItPnN0YXJ0ICYgfihFQ0NfQkxPQ0tfU0laRSAtIDEpKTsKKwlwYXIgPSByYW1fY29uc29sZV9wYXJfYnVmZmVyICsKKwkgICAgICAoYnVmZmVyLT5zdGFydCAvIEVDQ19CTE9DS19TSVpFKSAqIEVDQ19TSVpFOworCWRvIHsKKwkJaWYgKGJsb2NrICsgRUNDX0JMT0NLX1NJWkUgPiBidWZmZXJfZW5kKQorCQkJc2l6ZSA9IGJ1ZmZlcl9lbmQgLSBibG9jazsKKwkJcmFtX2NvbnNvbGVfZW5jb2RlX3JzOChibG9jaywgc2l6ZSwgcGFyKTsKKwkJYmxvY2sgKz0gRUNDX0JMT0NLX1NJWkU7CisJCXBhciArPSBFQ0NfU0laRTsKKwl9IHdoaWxlIChibG9jayA8IGJ1ZmZlci0+ZGF0YSArIGJ1ZmZlci0+c3RhcnQgKyBjb3VudCk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgcmFtX2NvbnNvbGVfdXBkYXRlX2hlYWRlcih2b2lkKQoreworI2lmZGVmIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT04KKwlzdHJ1Y3QgcmFtX2NvbnNvbGVfYnVmZmVyICpidWZmZXIgPSByYW1fY29uc29sZV9idWZmZXI7CisJdWludDhfdCAqcGFyOworCXBhciA9IHJhbV9jb25zb2xlX3Bhcl9idWZmZXIgKworCSAgICAgIERJVl9ST1VORF9VUChyYW1fY29uc29sZV9idWZmZXJfc2l6ZSwgRUNDX0JMT0NLX1NJWkUpICogRUNDX1NJWkU7CisJcmFtX2NvbnNvbGVfZW5jb2RlX3JzOCgodWludDhfdCAqKWJ1ZmZlciwgc2l6ZW9mKCpidWZmZXIpLCBwYXIpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCityYW1fY29uc29sZV93cml0ZShzdHJ1Y3QgY29uc29sZSAqY29uc29sZSwgY29uc3QgY2hhciAqcywgdW5zaWduZWQgaW50IGNvdW50KQoreworCWludCByZW07CisJc3RydWN0IHJhbV9jb25zb2xlX2J1ZmZlciAqYnVmZmVyID0gcmFtX2NvbnNvbGVfYnVmZmVyOworCisJaWYgKGNvdW50ID4gcmFtX2NvbnNvbGVfYnVmZmVyX3NpemUpIHsKKwkJcyArPSBjb3VudCAtIHJhbV9jb25zb2xlX2J1ZmZlcl9zaXplOworCQljb3VudCA9IHJhbV9jb25zb2xlX2J1ZmZlcl9zaXplOworCX0KKwlyZW0gPSByYW1fY29uc29sZV9idWZmZXJfc2l6ZSAtIGJ1ZmZlci0+c3RhcnQ7CisJaWYgKHJlbSA8IGNvdW50KSB7CisJCXJhbV9jb25zb2xlX3VwZGF0ZShzLCByZW0pOworCQlzICs9IHJlbTsKKwkJY291bnQgLT0gcmVtOworCQlidWZmZXItPnN0YXJ0ID0gMDsKKwkJYnVmZmVyLT5zaXplID0gcmFtX2NvbnNvbGVfYnVmZmVyX3NpemU7CisJfQorCXJhbV9jb25zb2xlX3VwZGF0ZShzLCBjb3VudCk7CisKKwlidWZmZXItPnN0YXJ0ICs9IGNvdW50OworCWlmIChidWZmZXItPnNpemUgPCByYW1fY29uc29sZV9idWZmZXJfc2l6ZSkKKwkJYnVmZmVyLT5zaXplICs9IGNvdW50OworCXJhbV9jb25zb2xlX3VwZGF0ZV9oZWFkZXIoKTsKK30KKworc3RhdGljIHN0cnVjdCBjb25zb2xlIHJhbV9jb25zb2xlID0geworCS5uYW1lCT0gInJhbSIsCisJLndyaXRlCT0gcmFtX2NvbnNvbGVfd3JpdGUsCisJLmZsYWdzCT0gQ09OX1BSSU5UQlVGRkVSIHwgQ09OX0VOQUJMRUQsCisJLmluZGV4CT0gLTEsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQKK3JhbV9jb25zb2xlX3NhdmVfb2xkKHN0cnVjdCByYW1fY29uc29sZV9idWZmZXIgKmJ1ZmZlciwgY2hhciAqZGVzdCkKK3sKKwlzaXplX3Qgb2xkX2xvZ19zaXplID0gYnVmZmVyLT5zaXplOworI2lmZGVmIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT04KKwl1aW50OF90ICpibG9jazsKKwl1aW50OF90ICpwYXI7CisJY2hhciBzdHJidWZbODBdOworCWludCBzdHJidWZfbGVuOworCisJYmxvY2sgPSBidWZmZXItPmRhdGE7CisJcGFyID0gcmFtX2NvbnNvbGVfcGFyX2J1ZmZlcjsKKwl3aGlsZSAoYmxvY2sgPCBidWZmZXItPmRhdGEgKyBidWZmZXItPnNpemUpIHsKKwkJaW50IG51bWVycjsKKwkJaW50IHNpemUgPSBFQ0NfQkxPQ0tfU0laRTsKKwkJaWYgKGJsb2NrICsgc2l6ZSA+IGJ1ZmZlci0+ZGF0YSArIHJhbV9jb25zb2xlX2J1ZmZlcl9zaXplKQorCQkJc2l6ZSA9IGJ1ZmZlci0+ZGF0YSArIHJhbV9jb25zb2xlX2J1ZmZlcl9zaXplIC0gYmxvY2s7CisJCW51bWVyciA9IHJhbV9jb25zb2xlX2RlY29kZV9yczgoYmxvY2ssIHNpemUsIHBhcik7CisJCWlmIChudW1lcnIgPiAwKSB7CisjaWYgMAorCQkJcHJpbnRrKEtFUk5fSU5GTyAicmFtX2NvbnNvbGU6IGVycm9yIGluIGJsb2NrICVwLCAlZFxuIiwKKwkJCSAgICAgICBibG9jaywgbnVtZXJyKTsKKyNlbmRpZgorCQkJcmFtX2NvbnNvbGVfY29ycmVjdGVkX2J5dGVzICs9IG51bWVycjsKKwkJfSBlbHNlIGlmIChudW1lcnIgPCAwKSB7CisjaWYgMAorCQkJcHJpbnRrKEtFUk5fSU5GTyAicmFtX2NvbnNvbGU6IHVuY29ycmVjdGFibGUgZXJyb3IgaW4gIgorCQkJICAgICAgICJibG9jayAlcFxuIiwgYmxvY2spOworI2VuZGlmCisJCQlyYW1fY29uc29sZV9iYWRfYmxvY2tzKys7CisJCX0KKwkJYmxvY2sgKz0gRUNDX0JMT0NLX1NJWkU7CisJCXBhciArPSBFQ0NfU0laRTsKKwl9CisJaWYgKHJhbV9jb25zb2xlX2NvcnJlY3RlZF9ieXRlcyB8fCByYW1fY29uc29sZV9iYWRfYmxvY2tzKQorCQlzdHJidWZfbGVuID0gc25wcmludGYoc3RyYnVmLCBzaXplb2Yoc3RyYnVmKSwKKwkJCSJcbiVkIENvcnJlY3RlZCBieXRlcywgJWQgdW5yZWNvdmVyYWJsZSBibG9ja3NcbiIsCisJCQlyYW1fY29uc29sZV9jb3JyZWN0ZWRfYnl0ZXMsIHJhbV9jb25zb2xlX2JhZF9ibG9ja3MpOworCWVsc2UKKwkJc3RyYnVmX2xlbiA9IHNucHJpbnRmKHN0cmJ1Ziwgc2l6ZW9mKHN0cmJ1ZiksCisJCQkJICAgICAgIlxuTm8gZXJyb3JzIGRldGVjdGVkXG4iKTsKKwlpZiAoc3RyYnVmX2xlbiA+PSBzaXplb2Yoc3RyYnVmKSkKKwkJc3RyYnVmX2xlbiA9IHNpemVvZihzdHJidWYpIC0gMTsKKwlvbGRfbG9nX3NpemUgKz0gc3RyYnVmX2xlbjsKKyNlbmRpZgorCisJaWYgKGRlc3QgPT0gTlVMTCkgeworCQlkZXN0ID0ga21hbGxvYyhvbGRfbG9nX3NpemUsIEdGUF9LRVJORUwpOworCQlpZiAoZGVzdCA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAicmFtX2NvbnNvbGU6IGZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXJcbiIpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJcmFtX2NvbnNvbGVfb2xkX2xvZyA9IGRlc3Q7CisJcmFtX2NvbnNvbGVfb2xkX2xvZ19zaXplID0gb2xkX2xvZ19zaXplOworCW1lbWNweShyYW1fY29uc29sZV9vbGRfbG9nLAorCSAgICAgICAmYnVmZmVyLT5kYXRhW2J1ZmZlci0+c3RhcnRdLCBidWZmZXItPnNpemUgLSBidWZmZXItPnN0YXJ0KTsKKwltZW1jcHkocmFtX2NvbnNvbGVfb2xkX2xvZyArIGJ1ZmZlci0+c2l6ZSAtIGJ1ZmZlci0+c3RhcnQsCisJICAgICAgICZidWZmZXItPmRhdGFbMF0sIGJ1ZmZlci0+c3RhcnQpOworI2lmZGVmIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT04KKwltZW1jcHkocmFtX2NvbnNvbGVfb2xkX2xvZyArIG9sZF9sb2dfc2l6ZSAtIHN0cmJ1Zl9sZW4sCisJICAgICAgIHN0cmJ1Ziwgc3RyYnVmX2xlbik7CisjZW5kaWYKK30KKworc3RhdGljIGludCBfX2luaXQgcmFtX2NvbnNvbGVfaW5pdChzdHJ1Y3QgcmFtX2NvbnNvbGVfYnVmZmVyICpidWZmZXIsCisJCQkJICAgc2l6ZV90IGJ1ZmZlcl9zaXplLCBjaGFyICpvbGRfYnVmKQoreworI2lmZGVmIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT04KKwlpbnQgbnVtZXJyOworCXVpbnQ4X3QgKnBhcjsKKyNlbmRpZgorCXJhbV9jb25zb2xlX2J1ZmZlciA9IGJ1ZmZlcjsKKwlyYW1fY29uc29sZV9idWZmZXJfc2l6ZSA9CisJCWJ1ZmZlcl9zaXplIC0gc2l6ZW9mKHN0cnVjdCByYW1fY29uc29sZV9idWZmZXIpOworCisjaWZkZWYgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTgorCXJhbV9jb25zb2xlX2J1ZmZlcl9zaXplIC09IChESVZfUk9VTkRfVVAocmFtX2NvbnNvbGVfYnVmZmVyX3NpemUsCisJCQkJCQlFQ0NfQkxPQ0tfU0laRSkgKyAxKSAqIEVDQ19TSVpFOworCXJhbV9jb25zb2xlX3Bhcl9idWZmZXIgPSBidWZmZXItPmRhdGEgKyByYW1fY29uc29sZV9idWZmZXJfc2l6ZTsKKworCisJLyogZmlyc3QgY29uc2VjdXRpdmUgcm9vdCBpcyAwCisJICogcHJpbWl0aXZlIGVsZW1lbnQgdG8gZ2VuZXJhdGUgcm9vdHMgPSAxCisJICovCisJcmFtX2NvbnNvbGVfcnNfZGVjb2RlciA9IGluaXRfcnMoRUNDX1NZTVNJWkUsIEVDQ19QT0xZLCAwLCAxLCBFQ0NfU0laRSk7CisJaWYgKHJhbV9jb25zb2xlX3JzX2RlY29kZXIgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9JTkZPICJyYW1fY29uc29sZTogaW5pdF9ycyBmYWlsZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyYW1fY29uc29sZV9jb3JyZWN0ZWRfYnl0ZXMgPSAwOworCXJhbV9jb25zb2xlX2JhZF9ibG9ja3MgPSAwOworCisJcGFyID0gcmFtX2NvbnNvbGVfcGFyX2J1ZmZlciArCisJICAgICAgRElWX1JPVU5EX1VQKHJhbV9jb25zb2xlX2J1ZmZlcl9zaXplLCBFQ0NfQkxPQ0tfU0laRSkgKiBFQ0NfU0laRTsKKworCW51bWVyciA9IHJhbV9jb25zb2xlX2RlY29kZV9yczgoYnVmZmVyLCBzaXplb2YoKmJ1ZmZlciksIHBhcik7CisJaWYgKG51bWVyciA+IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicmFtX2NvbnNvbGU6IGVycm9yIGluIGhlYWRlciwgJWRcbiIsIG51bWVycik7CisJCXJhbV9jb25zb2xlX2NvcnJlY3RlZF9ieXRlcyArPSBudW1lcnI7CisJfSBlbHNlIGlmIChudW1lcnIgPCAwKSB7CisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICJyYW1fY29uc29sZTogdW5jb3JyZWN0YWJsZSBlcnJvciBpbiBoZWFkZXJcbiIpOworCQlyYW1fY29uc29sZV9iYWRfYmxvY2tzKys7CisJfQorI2VuZGlmCisKKwlpZiAoYnVmZmVyLT5zaWcgPT0gUkFNX0NPTlNPTEVfU0lHKSB7CisJCWlmIChidWZmZXItPnNpemUgPiByYW1fY29uc29sZV9idWZmZXJfc2l6ZQorCQkgICAgfHwgYnVmZmVyLT5zdGFydCA+IGJ1ZmZlci0+c2l6ZSkKKwkJCXByaW50ayhLRVJOX0lORk8gInJhbV9jb25zb2xlOiBmb3VuZCBleGlzdGluZyBpbnZhbGlkICIKKwkJCSAgICAgICAiYnVmZmVyLCBzaXplICVkLCBzdGFydCAlZFxuIiwKKwkJCSAgICAgICBidWZmZXItPnNpemUsIGJ1ZmZlci0+c3RhcnQpOworCQllbHNlIHsKKwkJCXByaW50ayhLRVJOX0lORk8gInJhbV9jb25zb2xlOiBmb3VuZCBleGlzdGluZyBidWZmZXIsICIKKwkJCSAgICAgICAic2l6ZSAlZCwgc3RhcnQgJWRcbiIsCisJCQkgICAgICAgYnVmZmVyLT5zaXplLCBidWZmZXItPnN0YXJ0KTsKKwkJCXJhbV9jb25zb2xlX3NhdmVfb2xkKGJ1ZmZlciwgb2xkX2J1Zik7CisJCX0KKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPICJyYW1fY29uc29sZTogbm8gdmFsaWQgZGF0YSBpbiBidWZmZXIgIgorCQkgICAgICAgIihzaWcgPSAweCUwOHgpXG4iLCBidWZmZXItPnNpZyk7CisJfQorCisJYnVmZmVyLT5zaWcgPSBSQU1fQ09OU09MRV9TSUc7CisJYnVmZmVyLT5zdGFydCA9IDA7CisJYnVmZmVyLT5zaXplID0gMDsKKworCXJlZ2lzdGVyX2NvbnNvbGUoJnJhbV9jb25zb2xlKTsKKyNpZmRlZiBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FTkFCTEVfVkVSQk9TRQorCWNvbnNvbGVfdmVyYm9zZSgpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FQVJMWV9JTklUCitzdGF0aWMgaW50IF9faW5pdCByYW1fY29uc29sZV9lYXJseV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHJhbV9jb25zb2xlX2luaXQoKHN0cnVjdCByYW1fY29uc29sZV9idWZmZXIgKikKKwkJQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRUFSTFlfQUREUiwKKwkJQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRUFSTFlfU0laRSwKKwkJcmFtX2NvbnNvbGVfb2xkX2xvZ19pbml0X2J1ZmZlcik7Cit9CisjZWxzZQorc3RhdGljIGludCByYW1fY29uc29sZV9kcml2ZXJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IHBkZXYtPnJlc291cmNlOworCXNpemVfdCBzdGFydDsKKwlzaXplX3QgYnVmZmVyX3NpemU7CisJdm9pZCAqYnVmZmVyOworCisJaWYgKHJlcyA9PSBOVUxMIHx8IHBkZXYtPm51bV9yZXNvdXJjZXMgIT0gMSB8fAorCSAgICAhKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJyYW1fY29uc29sZTogaW52YWxpZCByZXNvdXJjZSwgJXAgJWQgZmxhZ3MgIgorCQkgICAgICAgIiVseFxuIiwgcmVzLCBwZGV2LT5udW1fcmVzb3VyY2VzLCByZXMgPyByZXMtPmZsYWdzIDogMCk7CisJCXJldHVybiAtRU5YSU87CisJfQorCWJ1ZmZlcl9zaXplID0gcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMTsKKwlzdGFydCA9IHJlcy0+c3RhcnQ7CisJcHJpbnRrKEtFUk5fSU5GTyAicmFtX2NvbnNvbGU6IGdvdCBidWZmZXIgYXQgJXgsIHNpemUgJXhcbiIsCisJICAgICAgIHN0YXJ0LCBidWZmZXJfc2l6ZSk7CisJYnVmZmVyID0gaW9yZW1hcChyZXMtPnN0YXJ0LCBidWZmZXJfc2l6ZSk7CisJaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAicmFtX2NvbnNvbGU6IGZhaWxlZCB0byBtYXAgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0dXJuIHJhbV9jb25zb2xlX2luaXQoYnVmZmVyLCBidWZmZXJfc2l6ZSwgTlVMTC8qIGFsbG9jYXRlICovKTsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcmFtX2NvbnNvbGVfZHJpdmVyID0geworCS5wcm9iZSA9IHJhbV9jb25zb2xlX2RyaXZlcl9wcm9iZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAicmFtX2NvbnNvbGUiLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCByYW1fY29uc29sZV9tb2R1bGVfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisJZXJyID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZyYW1fY29uc29sZV9kcml2ZXIpOworCXJldHVybiBlcnI7Cit9CisjZW5kaWYKKworc3RhdGljIHNzaXplX3QgcmFtX2NvbnNvbGVfcmVhZF9vbGQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkJICAgIHNpemVfdCBsZW4sIGxvZmZfdCAqb2Zmc2V0KQoreworCWxvZmZfdCBwb3MgPSAqb2Zmc2V0OworCXNzaXplX3QgY291bnQ7CisKKwlpZiAocG9zID49IHJhbV9jb25zb2xlX29sZF9sb2dfc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwljb3VudCA9IG1pbihsZW4sIChzaXplX3QpKHJhbV9jb25zb2xlX29sZF9sb2dfc2l6ZSAtIHBvcykpOworCWlmIChjb3B5X3RvX3VzZXIoYnVmLCByYW1fY29uc29sZV9vbGRfbG9nICsgcG9zLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCisJKm9mZnNldCArPSBjb3VudDsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJhbV9jb25zb2xlX2ZpbGVfb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5yZWFkID0gcmFtX2NvbnNvbGVfcmVhZF9vbGQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCByYW1fY29uc29sZV9sYXRlX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5OworCisJaWYgKHJhbV9jb25zb2xlX29sZF9sb2cgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisjaWZkZWYgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRUFSTFlfSU5JVAorCXJhbV9jb25zb2xlX29sZF9sb2cgPSBrbWFsbG9jKHJhbV9jb25zb2xlX29sZF9sb2dfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKHJhbV9jb25zb2xlX29sZF9sb2cgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJyYW1fY29uc29sZTogZmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciBmb3Igb2xkIGxvZ1xuIik7CisJCXJhbV9jb25zb2xlX29sZF9sb2dfc2l6ZSA9IDA7CisJCXJldHVybiAwOworCX0KKwltZW1jcHkocmFtX2NvbnNvbGVfb2xkX2xvZywKKwkgICAgICAgcmFtX2NvbnNvbGVfb2xkX2xvZ19pbml0X2J1ZmZlciwgcmFtX2NvbnNvbGVfb2xkX2xvZ19zaXplKTsKKyNlbmRpZgorCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoImxhc3Rfa21zZyIsIFNfSUZSRUcgfCBTX0lSVUdPLCBOVUxMKTsKKwlpZiAoIWVudHJ5KSB7CisJCXByaW50ayhLRVJOX0VSUiAicmFtX2NvbnNvbGU6IGZhaWxlZCB0byBjcmVhdGUgcHJvYyBlbnRyeVxuIik7CisJCWtmcmVlKHJhbV9jb25zb2xlX29sZF9sb2cpOworCQlyYW1fY29uc29sZV9vbGRfbG9nID0gTlVMTDsKKwkJcmV0dXJuIDA7CisJfQorCisJZW50cnktPnByb2NfZm9wcyA9ICZyYW1fY29uc29sZV9maWxlX29wczsKKwllbnRyeS0+c2l6ZSA9IHJhbV9jb25zb2xlX29sZF9sb2dfc2l6ZTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VBUkxZX0lOSVQKK2NvbnNvbGVfaW5pdGNhbGwocmFtX2NvbnNvbGVfZWFybHlfaW5pdCk7CisjZWxzZQorbW9kdWxlX2luaXQocmFtX2NvbnNvbGVfbW9kdWxlX2luaXQpOworI2VuZGlmCitsYXRlX2luaXRjYWxsKHJhbV9jb25zb2xlX2xhdGVfaW5pdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3RpbWVkX2dwaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3RpbWVkX2dwaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWE2OGM5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdGltZWRfZ3Bpby5jCkBAIC0wLDAgKzEsMTc3IEBACisvKiBkcml2ZXJzL21pc2MvdGltZWRfZ3Bpby5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSwgSW5jLgorICogQXV0aG9yOiBNaWtlIExvY2t3b29kIDxsb2Nrd29vZEBhbmRyb2lkLmNvbT4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaHJ0aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KKworI2luY2x1ZGUgInRpbWVkX2dwaW8uaCIKKworCitzdGF0aWMgc3RydWN0IGNsYXNzICp0aW1lZF9ncGlvX2NsYXNzOworCitzdHJ1Y3QgdGltZWRfZ3Bpb19kYXRhIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IGhydGltZXIgdGltZXI7CisJc3BpbmxvY2tfdCBsb2NrOworCXVuc2lnbmVkIAlncGlvOworCWludCAJCW1heF90aW1lb3V0OworCXU4IAkJYWN0aXZlX2xvdzsKK307CisKK3N0YXRpYyBlbnVtIGhydGltZXJfcmVzdGFydCBncGlvX3RpbWVyX2Z1bmMoc3RydWN0IGhydGltZXIgKnRpbWVyKQoreworCXN0cnVjdCB0aW1lZF9ncGlvX2RhdGEgKmdwaW9fZGF0YSA9IGNvbnRhaW5lcl9vZih0aW1lciwgc3RydWN0IHRpbWVkX2dwaW9fZGF0YSwgdGltZXIpOworCisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGdwaW9fZGF0YS0+Z3BpbywgZ3Bpb19kYXRhLT5hY3RpdmVfbG93ID8gMSA6IDApOworCXJldHVybiBIUlRJTUVSX05PUkVTVEFSVDsKK30KKworc3RhdGljIHNzaXplX3QgZ3Bpb19lbmFibGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHRpbWVkX2dwaW9fZGF0YSAqZ3Bpb19kYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJlbWFpbmluZzsKKworCWlmIChocnRpbWVyX2FjdGl2ZSgmZ3Bpb19kYXRhLT50aW1lcikpIHsKKwkJa3RpbWVfdCByID0gaHJ0aW1lcl9nZXRfcmVtYWluaW5nKCZncGlvX2RhdGEtPnRpbWVyKTsKKwkJcmVtYWluaW5nID0gci50di5zZWMgKiAxMDAwICsgci50di5uc2VjIC8gMTAwMDAwMDsKKwl9IGVsc2UKKwkJcmVtYWluaW5nID0gMDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCByZW1haW5pbmcpOworfQorCitzdGF0aWMgc3NpemVfdCBncGlvX2VuYWJsZV9zdG9yZSgKKwkJc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgdGltZWRfZ3Bpb19kYXRhICpncGlvX2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgdmFsdWU7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNzY2FuZihidWYsICIlZCIsICZ2YWx1ZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19kYXRhLT5sb2NrLCBmbGFncyk7CisKKwkvKiBjYW5jZWwgcHJldmlvdXMgdGltZXIgYW5kIHNldCBHUElPIGFjY29yZGluZyB0byB2YWx1ZSAqLworCWhydGltZXJfY2FuY2VsKCZncGlvX2RhdGEtPnRpbWVyKTsKKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZ3Bpb19kYXRhLT5ncGlvLCBncGlvX2RhdGEtPmFjdGl2ZV9sb3cgPyAhdmFsdWUgOiAhIXZhbHVlKTsKKworCWlmICh2YWx1ZSA+IDApIHsKKwkJaWYgKHZhbHVlID4gZ3Bpb19kYXRhLT5tYXhfdGltZW91dCkKKwkJCXZhbHVlID0gZ3Bpb19kYXRhLT5tYXhfdGltZW91dDsKKworCQlocnRpbWVyX3N0YXJ0KCZncGlvX2RhdGEtPnRpbWVyLAorCQkJCQkJa3RpbWVfc2V0KHZhbHVlIC8gMTAwMCwgKHZhbHVlICUgMTAwMCkgKiAxMDAwMDAwKSwKKwkJCQkJCUhSVElNRVJfTU9ERV9SRUwpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fZGF0YS0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihlbmFibGUsIFNfSVJVR08gfCBTX0lXVVNSLCBncGlvX2VuYWJsZV9zaG93LCBncGlvX2VuYWJsZV9zdG9yZSk7CisKK3N0YXRpYyBpbnQgdGltZWRfZ3Bpb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB0aW1lZF9ncGlvX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHRpbWVkX2dwaW8gKmN1cl9ncGlvOworCXN0cnVjdCB0aW1lZF9ncGlvX2RhdGEgKmdwaW9fZGF0YSwgKmdwaW9fZGF0OworCWludCBpLCByZXQgPSAwOworCisJaWYgKCFwZGF0YSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWdwaW9fZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0aW1lZF9ncGlvX2RhdGEpICogcGRhdGEtPm51bV9ncGlvcywgR0ZQX0tFUk5FTCk7CisJaWYgKCFncGlvX2RhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fZ3Bpb3M7IGkrKykgeworCQljdXJfZ3BpbyA9ICZwZGF0YS0+Z3Bpb3NbaV07CisJCWdwaW9fZGF0ID0gJmdwaW9fZGF0YVtpXTsKKworCQlocnRpbWVyX2luaXQoJmdwaW9fZGF0LT50aW1lciwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfUkVMKTsKKwkJZ3Bpb19kYXQtPnRpbWVyLmZ1bmN0aW9uID0gZ3Bpb190aW1lcl9mdW5jOworCQlzcGluX2xvY2tfaW5pdCgmZ3Bpb19kYXQtPmxvY2spOworCisJCWdwaW9fZGF0LT5ncGlvID0gY3VyX2dwaW8tPmdwaW87CisJCWdwaW9fZGF0LT5tYXhfdGltZW91dCA9IGN1cl9ncGlvLT5tYXhfdGltZW91dDsKKwkJZ3Bpb19kYXQtPmFjdGl2ZV9sb3cgPSBjdXJfZ3Bpby0+YWN0aXZlX2xvdzsKKwkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGdwaW9fZGF0LT5ncGlvLCBncGlvX2RhdC0+YWN0aXZlX2xvdyk7CisKKwkJZ3Bpb19kYXQtPmRldiA9IGRldmljZV9jcmVhdGUodGltZWRfZ3Bpb19jbGFzcywgJnBkZXYtPmRldiwgMCwgIiVzIiwgY3VyX2dwaW8tPm5hbWUpOworCQlpZiAodW5saWtlbHkoSVNfRVJSKGdwaW9fZGF0LT5kZXYpKSkKKwkJCXJldHVybiBQVFJfRVJSKGdwaW9fZGF0LT5kZXYpOworCisJCWRldl9zZXRfZHJ2ZGF0YShncGlvX2RhdC0+ZGV2LCBncGlvX2RhdCk7CisJCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZShncGlvX2RhdC0+ZGV2LCAmZGV2X2F0dHJfZW5hYmxlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZ3Bpb19kYXRhKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRpbWVkX2dwaW9fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHRpbWVkX2dwaW9fcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgdGltZWRfZ3Bpb19kYXRhICpncGlvX2RhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+bnVtX2dwaW9zOyBpKyspIHsKKwkJZGV2aWNlX3JlbW92ZV9maWxlKGdwaW9fZGF0YVtpXS5kZXYsICZkZXZfYXR0cl9lbmFibGUpOworCQlkZXZpY2VfdW5yZWdpc3RlcihncGlvX2RhdGFbaV0uZGV2KTsKKwl9CisKKwlrZnJlZShncGlvX2RhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHRpbWVkX2dwaW9fZHJpdmVyID0geworCS5wcm9iZQkJPSB0aW1lZF9ncGlvX3Byb2JlLAorCS5yZW1vdmUJCT0gdGltZWRfZ3Bpb19yZW1vdmUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCQk9ICJ0aW1lZC1ncGlvIiwKKwkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0aW1lZF9ncGlvX2luaXQodm9pZCkKK3sKKwl0aW1lZF9ncGlvX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAidGltZWRfb3V0cHV0Iik7CisJaWYgKElTX0VSUih0aW1lZF9ncGlvX2NsYXNzKSkKKwkJcmV0dXJuIFBUUl9FUlIodGltZWRfZ3Bpb19jbGFzcyk7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmdGltZWRfZ3Bpb19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdGltZWRfZ3Bpb19leGl0KHZvaWQpCit7CisJY2xhc3NfZGVzdHJveSh0aW1lZF9ncGlvX2NsYXNzKTsKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdGltZWRfZ3Bpb19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh0aW1lZF9ncGlvX2luaXQpOworbW9kdWxlX2V4aXQodGltZWRfZ3Bpb19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTWlrZSBMb2Nrd29vZCA8bG9ja3dvb2RAYW5kcm9pZC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oInRpbWVkIGdwaW8gZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC90aW1lZF9ncGlvLmggYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC90aW1lZF9ncGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg0NDliMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3RpbWVkX2dwaW8uaApAQCAtMCwwICsxLDMxIEBACisvKiBpbmNsdWRlL2xpbnV4L3RpbWVkX2dwaW8uaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyovCisKKyNpZm5kZWYgX0xJTlVYX1RJTUVEX0dQSU9fSAorI2RlZmluZSBfTElOVVhfVElNRURfR1BJT19ICisKK3N0cnVjdCB0aW1lZF9ncGlvIHsKKwljb25zdCBjaGFyICpuYW1lOworCXVuc2lnbmVkIAlncGlvOworCWludCAgICAgbWF4X3RpbWVvdXQ7CisJdTggCQlhY3RpdmVfbG93OworfTsKKworc3RydWN0IHRpbWVkX2dwaW9fcGxhdGZvcm1fZGF0YSB7CisJaW50IAkJbnVtX2dwaW9zOworCXN0cnVjdCB0aW1lZF9ncGlvICpncGlvczsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NmRiYjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL0tjb25maWcKQEAgLTAsMCArMSw2IEBACitjb25maWcgQVNVU19PTEVECisJdHJpc3RhdGUgIkFzdXMgT0xFRCBkcml2ZXIiCisJZGVwZW5kcyBvbiBVU0IKKwlkZWZhdWx0IE4KKwktLS1oZWxwLS0tCisJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIE9MRUQgZGlzcGxheSBwcmVzZW50IGluIHNvbWUgQXN1cyBsYXB0b3BzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcxZjlhYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvTWFrZWZpbGUKQEAgLTAsMCArMSBAQAorb2JqLSQoQ09ORklHX0FTVVNfT0xFRCkJCSs9IGFzdXNfb2xlZC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL1JFQURNRSBiL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2Yjk3MTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL1JFQURNRQpAQCAtMCwwICsxLDE1NiBAQAorCisgICAgRHJpdmVyIGZvciBBc3VzIE9MRUQgZGlzcGxheSBwcmVzZW50IGluIHNvbWUgQXN1cyBsYXB0b3BzLgorCisgICAgVGhlIGNvZGUgb2YgdGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gJ2FzdXNvbGVkJyBwcm9ncmFtIHRha2VuIGZyb20KKyAgICBodHRwczovL2xhdW5jaHBhZC5uZXQvYXN1c29sZWQvLiBJIGp1c3Qgd2FudGVkIHRvIGhhdmUgYSBzaW1wbGUKKyAgICBrZXJuZWwgZHJpdmVyIGZvciBjb250cm9sbGluZyB0aGlzIGRldmljZSwgYnV0IEkgZGlkbid0IGtub3cgaG93CisgICAgdG8gZG8gdGhhdC4gTm93IEkga25vdyA7KSBBbHNvLCB0aGF0IHByb2dyYW0gY2FuIG5vdCBiZSB1c2VkCisgICAgd2l0aCB1c2JoaWQgbG9hZGVkLCB3aGljaCBtZWFucyBubyBVU0IgbW91c2Uva2V5Ym9hcmQgd2hpbGUKKyAgICBjb250cm9sbGluZyBPTEVEIGRpc3BsYXkgOigKKworICAgIEl0IGhhcyBiZWVuIHRlc3RlZCBvbiBBc3VzIEcxIGFuZCBkaWRuJ3QgY2F1c2UgYW55IHByb2JsZW1zLAorICAgIGJ1dCBJIGRvbid0IGd1YXJhbnRlZSB0aGF0IGl0IHdvbid0IGRvIGFueXRoaW5nIHdyb25nIDopCisKKyAgICBJdCBjYW4gKGFuZCBwcm9iYWJseSBkb2VzKSBoYXZlIGVycm9ycy4gSXQgaXMgdXNhYmxlCisgICAgaW4gbXkgY2FzZSwgYW5kIEkgaG9wZSBvdGhlcnMgd2lsbCBmaW5kIGl0IHVzZWZ1bCB0b28hCisKKyoqKioqKioKKworQnVpbGRpbmcgdGhlIG1vZHVsZQorCisgICBUbyBidWlsZCB0aGUgbW9kdWxlIHlvdSBuZWVkIGtlcm5lbCAyLjYgaW5jbHVkZSBmaWxlcyBhbmQgc29tZSBDIGNvbXBpbGVyLgorCisgICBKdXN0IHJ1bjoKKyAgIG1ha2UKKyAgIG1ha2UgaW5zdGFsbCAoYXMgYSByb290KQorCisgICBJdCB3aWxsIGJ1aWxkIChob3BlZnVsbHkpIHRoZSBtb2R1bGUgYW5kIGluc3RhbGwgaXQgaW4KKyAgIC9saWIvbW9kdWxlcy8ndW5hbWUgLXInL2V4dHJhL2FzdXNfb2xlZC5rby4KKworICAgVG8gbG9hZCBpdCBqdXN0IHVzZToKKyAgIG1vZHByb2JlIGFzdXNfb2xlZAorCisgICBZb3UgY2FuIGNoZWNrIGlmIGl0IGhhcyBkZXRlY3RlZCB5b3VyIE9MRUQgZGlzcGxheSBieSBsb29raW5nIGludG8gZG1lc2cgb3V0cHV0LgorICAgVGhlcmUgc2hvdWxkIGJlIHNvbWV0aGluZyBsaWtlIHRoaXM6CisgICBhc3VzLW9sZWQgMi03OjEuMDogQXR0YWNoZWQgQXN1cyBPTEVEIGRldmljZQorCisgICBJZiBpdCBkb2Vzbid0IGZpbmQgeW91ciBkaXNwbGF5LCB5b3UgY2FuIHRyeSByZW1vdmluZyB1c2JoaWQgbW9kdWxlLgorICAgSWYgeW91IGFkZCBhc3VzX29sZWQgaW50byB0aGUgbGlzdCBvZiBtb2R1bGVzIGxvYWRlZCBkdXJpbmcgc3lzdGVtIGJvb3QKKyAgIGJlZm9yZSB1c2JoaWQsIGl0IHdpbGwgd29yayBldmVuIHdoZW4gdXNiaGlkIGlzIHByZXNlbnQuCisKKyAgIElmIGl0IHN0aWxsIGRvZXNuJ3QgZGV0ZWN0IHlvdXIgaGFyZHdhcmUsIGNoZWNrIGxzdXNiIG91dHB1dC4KKyAgIFRoZXJlIHNob3VsZCBiZSBzaW1pbGFyIGxpbmU6CisgICBCdXMgMDAyIERldmljZSAwMDU6IElEIDBiMDU6MTcyNiBBU1VTVGVrIENvbXB1dGVyLCBJbmMuCisKKyAgIElmIHlvdSBkb24ndCBzZWUgYW55IGxpbmVzIHdpdGggJzBiMDU6MTcyNicgaXQgbWVhbnMgdGhhdCB5b3UgaGF2ZSBkaWZmZXJlbnQKKyAgIHR5cGUgb2YgaGFyZHdhcmUgdGhhdCBpcyBub3QgZGV0ZWN0ZWQgKGl0IG1heSBvciBtYXkgbm90IHdvcmssIGJ1dCB0aGUgZHJpdmVyCisgICBrbm93cyBvbmx5ICcwYjA1OjE3MjYnIGRldmljZSkuCisKKyoqKioqKioKKworQ29uZmlndXJhdGlvbgorCisgICBUaGVyZSBpcyBvbmx5IG9uZSBvcHRpb246IHN0YXJ0X29mZi4KKyAgIFlvdSBjYW4gdXNlIGl0IGJ5OiAnbW9kcHJvYmUgYXN1c19vbGVkIHN0YXJ0X29mZj0xJywgb3IgYnkgYWRkaW5nIHRoaXMKKyAgIGxpbmUgdG8gL2V0Yy9tb2Rwcm9iZS5jb25mOgorICAgb3B0aW9ucyBhc3VzX29sZWQgc3RhcnRfb2ZmPTEKKworICAgV2l0aCB0aGlzIG9wdGlvbiBwcm92aWRlZCwgYXN1c19vbGVkIGRyaXZlciB3aWxsIHN3aXRjaCBvZmYgdGhlIGRpc3BsYXkKKyAgIHdoZW4gaXQgaXMgZGV0ZWN0ZWQgYW5kIGF0dGFjaGVkLiBJdCBpcyBuaWNlIGZlYXR1cmUgdG8ganVzdCBzd2l0Y2ggb2ZmIHRoZSAnQVNVUycKKyAgIGxvZ28uIElmIHlvdSBkb24ndCB1c2UgdGhlIGRpc3BsYXksIGl0IGlzIHByb2JhYmx5IHRoZSBnb29kIGlkZWEgdG8gc3dpdGNoIGl0IG9mZiwKKyAgIHRvIHByb3RlY3QgT0xFRHMgZnJvbSAid2VhcmluZyBvZmYiLgorCisqKioqKioqCisKK1VzYWdlCisKKyAgIFRoaXMgbW9kdWxlIGNhbiBiZSBjb250cm9sbGVkIHdpdGggdHdvIHNwZWNpYWwgZmlsZXM6CisgICAvc3lzL2NsYXNzL2FzdXNfb2xlZC9vbGVkX04vZW5hYmxlZAorICAgL3N5cy9jbGFzcy9hc3VzX29sZWQvb2xlZF9OL3BpY3R1cmUKKworICAgKE4gaXMgdGhlIGRldmljZSBudW1iZXIsIHRoZSBmaXJzdCwgYW5kIHByb2JhYmx5IHRoZSBvbmx5LCBoYXMgbnVtYmVyIDEsCisgICAgc28gaXQgaXMgL3N5cy9jbGFzcy9hc3VzX29sZWQvb2xlZF8xL2VuYWJsZWQKKyAgICBhbmQgL3N5cy9jbGFzcy9hc3VzX29sZWQvb2xlZF8xL3BpY3R1cmUpCisKKyAgICdlbmFibGVkJyBmaWxlcyBpcyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZywgJ3BpY3R1cmUnIGlzIHdyaXRlYWJsZSBvbmx5LgorCisgICBZb3UgY2FuIHdyaXRlIDAgb3IgMSB0byAnZW5hYmxlZCcgZmlsZSwgd2hpY2ggd2lsbCBzd2l0Y2gKKyAgIG9uIGFuZCBvZmYgdGhlIGRpc3BsYXkuIFJlYWRpbmcgZnJvbSB0aGlzIGZpbGUgd2lsbCB0ZWxsIHlvdSB0aGUgbGFzdAorICAgc3RhdHVzIHNldCwgZWl0aGVyIDAgb3IgMS4gQnkgZGVmYXVsdCBpdCBpcyAxLCBzbyBpZiB0aGUgZGV2aWNlIHdhcyBzZXQgdG8gJ29mZicsCisgICBhbmQgdGhlIGNvbXB1dGVyIHdhcyByZWJvb3RlZCB3aXRob3V0IHBvd2VyLW9mZiwgdGhpcyBmaWxlIHdpbGwgY29udGFpbiB3cm9uZworICAgdmFsdWUgLSBiZWNhdXNlIHRoZSBkZXZpY2UgaXMgb2ZmLCBidXQgaGFzbid0IGJlZW4gZGlzYWJsZWQgdGhpcyB0aW1lIGFuZCBpcworICAgYXNzdW1lZCB0byBiZSBvbi4uLgorCisgICBUbyAncGljdHVyZScgZmlsZSB5b3Ugd3JpdGUgcGljdHVyZXMgdG8gYmUgZGlzcGxheWVkIGJ5IHRoZSBPTEVEIGRldmljZS4KKyAgIFRoZSBmb3JtYXQgb2YgdGhlIGZpbGU6CisgICA8TTpXeEg+CisgICAwMDAwMTExMDAxMDExMTAwMAorICAgMDAwMTAxMDEwMTAxMDEwMTAKKyAgIC4uLi4KKworICAgRmlyc3QgbGluZSBpcyBhIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyLiBNZWFuaW5nIG9mIGZpZWxkcyBpbiA8TTpXeEg+OgorICAgTSAtIHBpY3R1cmUgbW9kZS4gSXQgY2FuIGJlIGVpdGhlciAncycgZm9yIHN0YXRpYyBwaWN0dXJlcywKKyAgICAgICAncicgZm9yIHJvbGxpbmcgcGljdHVyZXMsIGFuZCAnZicgZm9yIGZsYXNoaW5nIHBpY3R1cmVzLgorICAgVyAtIHdpZHRoIG9mIHRoZSBwaWN0dXJlLiBNYXkgYmUgYmV0d2VlbiAxIGFuZCAxNzkyCisgICBIIC0gaGVpZ2h0IG9mIHRoZSBwaWN0dXJlLiBNYXkgYmUgYmV0d2VlbiAxIGFuZCAzMgorCisgICBGb3IgZXhhbXBsZSA8czoxMjh4MzI+IG1lYW5zIHN0YXRpYyBwaWN0dXJlLCAxMjggcGl4ZWxzIGxvbmcgYW5kIDMyIHBpeGVscyBoaWdoLgorCisgICBUaGUgcGh5c2ljYWwgc2l6ZSBvZiB0aGUgZGlzcGxheSBpcyAxMjh4MzIgcGl4ZWxzLiBTdGF0aWMgYW5kIGZsYXNoaW5nIHBpY3R1cmVzCisgICBjYW4ndCBiZSBsYXJnZXIgdGhhbiB0aGF0IChhY3R1YWxseSB0aGV5IGNhbiwgYnV0IG9ubHkgcGFydCBvZiB0aGVtIHdpbGwgYmUgZGlzcGxheWVkIDspICkKKworICAgSWYgdGhlIHBpY3R1cmUgaXMgc21hbGxlciB0aGFuIDEyOHgzMiBpdCB3aWxsIGJlIGNlbnRlcmVkLiBSb2xsaW5nIHBpY3R1cmVzIHdpZGVyIHRoYW4KKyAgIDEyOCBwaXhlbHMgd2lsbCBiZSBjZW50ZXJlZCB0b28sIHVubGVzcyB0aGVpciB3aWR0aCA9IG4qMTI4LiBWZXJ0aWNhbGx5IHRoZXkgd2lsbCBiZQorICAgY2VudGVyZWQganVzdCBsaWtlIHN0YXRpYyBwaWN0dXJlcywgaWYgdGhlaXIgaGVpZ2h0IGlzIHNtYWxsZXIgdGhhbiAzMi4KKworICAgRmxhc2hpbmcgcGljdHVyZXMgd2lsbCBiZSBjZW50ZXJlZCBob3Jpem9udGFsbHkgaWYgdGhlaXIgd2lkdGggPCAxMjgsIGJ1dCB0aGV5IHdlcmUKKyAgIGNlbnRlcmVkIHZlcnRpY2FsbHkgaW4gYSBkaWZmZXJlbnQgd2F5LiBJZiB0aGVpciBoZWlnaHQgPCAxNiwgdGhleSB3aWxsIGJlIGNlbnRlcmVkCisgICBpbiB0aGUgdXBwZXIgaGFsZiBvZiB0aGUgZGlzcGxheSAocm93cyAwLTE1KS4gVGhpcyBpcyBiZWNhdXNlIG9ubHkgdGhlIGZpcnN0IGhhbGYKKyAgIG9mIGZsYXNoaW5nIHBpY3R1cmVzIGlzIHVzZWQgZm9yIGZsYXNoaW5nLiBXaGVuIHRoZSBwaWN0dXJlIHdpdGggaGVpZ2ggPSAzMiBpcworICAgZGlzcGxheWVkIGluIGZsYXNoaW5nIG1vZGUsIGl0cyB1cHBlciAxNiByb3dzIHdpbGwgYmUgZmxhc2hpbmcgaW4gdGhlIHVwcGVyIGhhbGYKKyAgIG9mIHRoZSBkaXNwbGF5LCBhbmQgdGhlIGxvd2VyIGhhbGYgd2lsbCBiZSBlbXB0eS4gQWZ0ZXIgZmV3IHNlY29uZHMgdXBwZXIgcGFydCB3aWxsCisgICBzdG9wIGZsYXNoaW5nIChidXQgdGhhdCBwYXJ0IG9mIHRoZSBwaWN0dXJlIHdpbGwgcmVtYWluIHRoZXJlKSwgYW5kIHRoZSBsb3dlcgorICAgaGFsZiBvZiB0aGUgZGlzcGxheSB3aWxsIHN0YXJ0IGRpc3BsYXlpbiB0aGUgbG93ZXIgaGFsZiBvZiB0aGUgcGljdHVyZQorICAgaW4gcm9sbGluZyBtb2RlLCB1bmxlc3MgaXQgaXMgZW1wdHksIG9yIHRoZSBwaWN0dXJlIHdhcyBzbWFsbCBlbm91Z2ggdG8gZml0IGluCisgICB1cHBlciBwYXJ0LiBJdCBpcyBub3QgbWluZSBpZGVhLCB0aGlzIGlzIGp1c3QgdGhlIHdheSBBc3VzJyBkaXNwbGF5IHdvcmsgOykKKyAgIFNvIGlmIHlvdSBuZWVkIGp1c3QgZmxhc2hpbmcsIHVzZSBhdCBtb3N0IDEyOHgxNiBwaWN0dXJlLiBJZiB5b3UgbmVlZCBmbGFzaGluZyBhbmQKKyAgIHJvbGxpbmcsIHVzZSB3aG9sZSBzaXplIG9mIHRoZSBkaXNwbGF5LgorCisgICBMaW5lcyBmb2xsb3dpbmcgdGhlIGZpcnN0LCBjb25maWd1cmF0aW9uLCBsaW5lIGFyZSBwaWN0dXJlIGRhdGEuIEVhY2ggJzEnIG1lYW5zCisgICB0aGF0IHRoZSBwaXhlbCBpcyBsaXQsIGFuZCAnMCcgbWVhbnMgdGhhdCBpdCBpcyBub3QuIFlvdSBjYW4gYWxzbyB1c2UgJyMnIGFzIE9OLAorICAgYW5kICcgJyAoc3BhY2UpIGFzIE9GRi4gRW1wdHkgbGluZXMgYW5kIGFsbCBvdGhlciBjaGFyYWN0ZXJzIGFyZSBpZ25vcmVkLgorCisgICBJdCBpcyBwb3NzaWJsZSB0byB3cml0ZSBldmVyeXRoaW5nIGluIG9uZSBsaW5lIDxNOld4SD4wMTAxMDEwMTAxMDEwMTAxMC4uLiwKKyAgIGFuZCBXKkggY2hhcmFjdGVycyB3aWxsIGJlIHVzZWQuIElmIHRoZXJlIGlzIG5vdCBlbm91Z2ggY2hhcmFjdGVycywgbm90aGluZyB3aWxsIGJlCisgICBkaXNwbGF5ZWQuIEhvd2V2ZXIsIHRoZSAnbGluZSBtb2RlJyBpcyBlYXNpZXIgdG8gcmVhZCAoYW5kIHdyaXRlKSwgYW5kIGl0IGFsc28KKyAgIGxldHMgdG8gb21pdCBwYXJ0cyBvZiBkYXRhLiBXaGVuZXZlciBFbmQtT2YtTGluZSBjaGFyYWN0ZXIgaXMgZm91bmQsIGJ1dAorICAgdGhlIGxpbmUgaXMgbm90IFcgY2hhcmFjdGVycyBsb25nLCBpdCBpcyBhc3N1bWVkIHRoYXQgYWxsIG1pc3NpbmcgY2hhcmFjdGVycworICAgYXJlIGVxdWFsIHRvIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgbGluZS4KKworICAgRm9sbG93aW5nIGxpbmUgcmVwcmVzZW50cyAnMCcsICcxJyBhbmQgYSBsb3RzIG9mICcwJ3MsIGRlcGVuZG5nIG9uIHRoZSB3aWR0aCBvZiB0aGUgcGljdHVyZQorICAgcHJvdmlkZWQgaW4gY29uZmlndXJhdGlvbiBkYXRhOgorICAgMDEwCisKKyAgIFNvIGlmIHlvdSBuZWVkIGVtcHR5IGxpbmUsIGl0IGlzIHN1ZmZpY2llbnQgdG8gd3JpdGUgbGluZSB3aXRoIG9ubHkgb25lICcwJyBpbiBpdC4KKyAgIFRoZSBzYW1lIHdvcmtzIHdpdGggJzEnIChvciAnICcgYW5kICcjJykuCisKKyAgIElmIHRoZXJlIGFyZSB0b28gbWFueSBkYXRhIGluIHRoZSBmaWxlLCB0aGV5IHdpbGwgYmUgaWdub3JlZC4gSWYgeW91IGFyZSBub3Qgc3VyZQorICAgaG93IG1hbnkgY2hhcmFjdGVycyB5b3UgYXJlIG1pc3NpbmcsIHlvdSBjYW4gYWRkIGZldyBsaW5lcyB3aXRoIG9uZSB6ZXJvIGluIGVhY2ggb2YgdGhlbS4KKworICAgVGhlcmUgYXJlIHNvbWUgZXhhbXBsZSBwaWN0dXJlcyBpbiAudHh0IGZvcm1hdCwgdGhhdCBjYW4gYmUgdXNlZCBhcyBmb2xsb3dzOgorICAgY2F0IGZvby50eHQgPiAvc3lzL2NsYXNzL2FzdXNfb2xlZC9vbGVkXzEvcGljdHVyZQorCisgICBJZiB0aGUgZGlzcGxheSBpcyBzd2l0Y2hlZCBvZmYgeW91IGFsc28gbmVlZCB0byBydW46CisgICBlY2hvIDEgPiAvc3lzL2NsYXNzL2FzdXNfb2xlZC9vbGVkXzEvZW5hYmxlZAorICAgVG8gc3dpdGNoIGl0IG9mZiwganVzdCB1c2U6CisgICBlY2hvIDAgPiAvc3lzL2NsYXNzL2FzdXNfb2xlZC9vbGVkXzEvZW5hYmxlZAorCisKKyoqKioqKioKKworICAgRm9yIGFueSBhZGRpdGlvbmFsIGluZm8gcGxlYXNlIGhhdmUgYSBsb29rIGF0IGh0dHA6Ly9sYXBzdXMuYmVybGlvcy5kZS9hc3VzX29sZWQuaHRtbAorCisKKworICAgSmFrdWIgU2NobWlkdGtlIChzamFrdWJAZ21haWwuY29tKQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUxNDEzMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvVE9ETwpAQCAtMCwwICsxLDEwIEBACitUT0RPOgorCS0gY2hlY2twYXRjaC5wbCBjbGVhbnVwcworCS0gc3BhcnNlIGZpeGVzCisJLSBhdWRpdCB0aGUgdXNlcnNwYWNlIGludGVyZmFjZQorCQktIHN5c2ZzIHZzLiBjaGFyPworCS0gRG9jdW1lbnRhdGlvbi9BQkkvIG5lZWRzIHRvIGJlIGFkZGVkCisJLSBwdXQgdGhlIHNhbXBsZSAudHh0IGZpbGVzIGFuZCBSRUFETUUgZmlsZSBzb21ld2hlcmUuCisKK1BsZWFzZSBzZW5kIHBhdGNoZXMgdG8gR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4gYW5kCitDYzogSmFrdWIgU2NobWlkdGtlIDxzamFrdWJAZ21haWwuY29tPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC9hc3VzX29sZWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvYXN1c19vbGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY2YTE4NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvYXN1c19vbGVkLmMKQEAgLTAsMCArMSw3NDUgQEAKKy8qCisgKiAgQXN1cyBPTEVEIFVTQiBkcml2ZXIKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3LDIwMDggSmFrdWIgU2NobWlkdGtlIChzamFrdWJAZ21haWwuY29tKQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqCisgKgorICogIFRoaXMgbW9kdWxlIGlzIGJhc2VkIG9uIHVzYmxlZCBhbmQgYXN1cy1sYXB0b3AgbW9kdWxlcy4KKyAqCisgKgorICogIEFzdXMgT0xFRCBzdXBwb3J0IGlzIGJhc2VkIG9uIGFzdXNvbGVkIHByb2dyYW0gdGFrZW4gZnJvbQorICogIGh0dHBzOi8vbGF1bmNocGFkLm5ldC9hc3Vzb2xlZC8uCisgKgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisKKyNkZWZpbmUgQVNVU19PTEVEX1ZFUlNJT04JCSIwLjA0LWRldiIKKyNkZWZpbmUgQVNVU19PTEVEX05BTUUJCQkiYXN1cy1vbGVkIgorI2RlZmluZSBBU1VTX09MRURfVU5ERVJTQ09SRV9OQU1FCSJhc3VzX29sZWQiCisKKyNkZWZpbmUgQVNVU19PTEVEX0VSUk9SCQkJIkFzdXMgT0xFRCBEaXNwbGF5IEVycm9yOiAiCisKKyNkZWZpbmUgQVNVU19PTEVEX1NUQVRJQwkJJ3MnCisjZGVmaW5lIEFTVVNfT0xFRF9ST0xMCQkJJ3InCisjZGVmaW5lIEFTVVNfT0xFRF9GTEFTSAkJCSdmJworCisjZGVmaW5lIEFTVVNfT0xFRF9NQVhfV0lEVEgJCTE3OTIKKyNkZWZpbmUgQVNVU19PTEVEX0RJU1BfSEVJR0hUCQkzMgorI2RlZmluZSBBU1VTX09MRURfUEFDS0VUX0JVRl9TSVpFCTI1NgorCitNT0RVTEVfQVVUSE9SKCJKYWt1YiBTY2htaWR0a2UsIHNqYWt1YkBnbWFpbC5jb20iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQXN1cyBPTEVEIERyaXZlciB2IiBBU1VTX09MRURfVkVSU0lPTik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgKm9sZWRfY2xhc3MgPSAwOworc3RhdGljIGludCBvbGVkX251bSA9IDA7CisKK3N0YXRpYyB1aW50IHN0YXJ0X29mZiA9IDA7CisKK21vZHVsZV9wYXJhbShzdGFydF9vZmYsIHVpbnQsIDA2NDQpOworCitNT0RVTEVfUEFSTV9ERVNDKHN0YXJ0X29mZiwgIlNldCB0byAxIHRvIHN3aXRjaCBvZmYgT0xFRCBkaXNwbGF5IGFmdGVyIGl0IGlzIGF0dGFjaGVkIik7CisKK3R5cGVkZWYgZW51bSB7CisJUEFDS19NT0RFX0cxLAorCVBBQ0tfTU9ERV9HNTAsCisJUEFDS19NT0RFX0xBU1QKK30gb2xlZF9wYWNrX21vZGVfdDsKKworc3RydWN0IG9sZWRfZGV2X2Rlc2Nfc3RyIHsKKwl1aW50MTZfdAkJaWRWZW5kb3I7CisJdWludDE2X3QJCWlkUHJvZHVjdDsKKwl1aW50MTZfdAkJZGV2V2lkdGg7IC8vIHdpZHRoIG9mIGRpc3BsYXkKKwlvbGVkX3BhY2tfbW9kZV90CXBhY2tNb2RlOyAvLyBmb3JtdWxhIHRvIGJlIHVzZWQgd2hpbGUgcGFja2luZyB0aGUgcGljdHVyZQorCWNvbnN0IGNoYXIJCSpkZXZEZXNjOworfTsKKworLyogdGFibGUgb2YgZGV2aWNlcyB0aGF0IHdvcmsgd2l0aCB0aGlzIGRyaXZlciAqLworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGlkX3RhYmxlIFtdID0geworCXsgVVNCX0RFVklDRSgweDBiMDUsIDB4MTcyNikgfSwgLy8gQXN1cyBHMS9HMiAoYW5kIHZhcmlhbnRzKQorCXsgVVNCX0RFVklDRSgweDBiMDUsIDB4MTc1YikgfSwgLy8gQXN1cyBHNTBWIChhbmQgcG9zc2libHkgb3RoZXJzIC0gRzcwPyBHNzE/KQorCXsgfSwKK307CisKKy8qIHBhcmFtZXRlcnMgb2Ygc3BlY2lmaWMgZGV2aWNlcyAqLworc3RhdGljIHN0cnVjdCBvbGVkX2Rldl9kZXNjX3N0ciBvbGVkX2Rldl9kZXNjX3RhYmxlIFtdID0geworCXsgMHgwYjA1LCAweDE3MjYsIDEyOCwgUEFDS19NT0RFX0cxLCAiRzEvRzIiIH0sCisJeyAweDBiMDUsIDB4MTc1YiwgMjU2LCBQQUNLX01PREVfRzUwLCAiRzUwIiB9LAorCXsgfSwKK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUgKHVzYiwgaWRfdGFibGUpOworCisjZGVmaW5lIFNFVFVQX1BBQ0tFVF9IRUFERVIocGFja2V0LCB2YWwxLCB2YWwyLCB2YWwzLCB2YWw0LCB2YWw1LCB2YWw2LCB2YWw3KSBcCisJZG8gewkJCQkJXAorCQltZW1zZXQocGFja2V0LCAwLCBzaXplb2Yoc3RydWN0IGFzdXNfb2xlZF9oZWFkZXIpKTsJCVwKKwkJcGFja2V0LT5oZWFkZXIubWFnaWMxID0gMHg1NTsJCVwKKwkJcGFja2V0LT5oZWFkZXIubWFnaWMyID0gMHhhYTsJCVwKKwkJcGFja2V0LT5oZWFkZXIuZmxhZ3MgPSB2YWwxOwkJXAorCQlwYWNrZXQtPmhlYWRlci52YWx1ZTMgPSB2YWwyOwkJXAorCQlwYWNrZXQtPmhlYWRlci5idWZmZXIxID0gdmFsMzsJCVwKKwkJcGFja2V0LT5oZWFkZXIuYnVmZmVyMiA9IHZhbDQ7CQlcCisJCXBhY2tldC0+aGVhZGVyLnZhbHVlNiA9IHZhbDU7CQlcCisJCXBhY2tldC0+aGVhZGVyLnZhbHVlNyA9IHZhbDY7CQlcCisJCXBhY2tldC0+aGVhZGVyLnZhbHVlOCA9IHZhbDc7CQlcCisJfSB3aGlsZSgwKTsKKworc3RydWN0IGFzdXNfb2xlZF9oZWFkZXIgeworCXVpbnQ4X3QJCW1hZ2ljMTsKKwl1aW50OF90CQltYWdpYzI7CisJdWludDhfdAkJZmxhZ3M7CisJdWludDhfdAkJdmFsdWUzOworCXVpbnQ4X3QJCWJ1ZmZlcjE7CisJdWludDhfdAkJYnVmZmVyMjsKKwl1aW50OF90CQl2YWx1ZTY7CisJdWludDhfdAkJdmFsdWU3OworCXVpbnQ4X3QJCXZhbHVlODsKKwl1aW50OF90CQlwYWRkaW5nMls3XTsKK30gX19hdHRyaWJ1dGUoKHBhY2tlZCkpOworCitzdHJ1Y3QgYXN1c19vbGVkX3BhY2tldCB7CisJc3RydWN0IGFzdXNfb2xlZF9oZWFkZXIJCWhlYWRlcjsKKwl1aW50OF90CQkJCWJpdG1hcFtBU1VTX09MRURfUEFDS0VUX0JVRl9TSVpFXTsKK30gX19hdHRyaWJ1dGUoKHBhY2tlZCkpOworCitzdHJ1Y3QgYXN1c19vbGVkX2RldiB7CisJc3RydWN0IHVzYl9kZXZpY2UgKgl1ZGV2OworCXVpbnQ4X3QJCQlwaWNfbW9kZTsKKwl1aW50MTZfdAkJZGV2X3dpZHRoOworCW9sZWRfcGFja19tb2RlX3QJcGFja19tb2RlOworCXNpemVfdAkJCWhlaWdodDsKKwlzaXplX3QJCQl3aWR0aDsKKwlzaXplX3QJCQl4X3NoaWZ0OworCXNpemVfdAkJCXlfc2hpZnQ7CisJc2l6ZV90CQkJYnVmX29mZnM7CisJdWludDhfdAkJCWxhc3RfdmFsOworCXNpemVfdAkJCWJ1Zl9zaXplOworCWNoYXIJCQkqYnVmOworCXVpbnQ4X3QJCQllbmFibGVkOworCXN0cnVjdCBkZXZpY2UJCSpkZXY7Cit9OworCitzdGF0aWMgdm9pZCBlbmFibGVfb2xlZChzdHJ1Y3QgYXN1c19vbGVkX2RldiAqb2RldiwgdWludDhfdCBlbmFibCkKK3sKKwlpbnQgYTsKKwlpbnQgcmV0dmFsOworCWludCBhY3RfbGVuOworCXN0cnVjdCBhc3VzX29sZWRfcGFja2V0ICogcGFja2V0OworCisJcGFja2V0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFzdXNfb2xlZF9wYWNrZXQpLCBHRlBfS0VSTkVMKTsKKworCWlmICghcGFja2V0KSB7CisJCWRldl9lcnIoJm9kZXYtPnVkZXYtPmRldiwgIm91dCBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm47CisJfQorCisJU0VUVVBfUEFDS0VUX0hFQURFUihwYWNrZXQsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDApOworCisJaWYgKGVuYWJsKSBwYWNrZXQtPmJpdG1hcFswXSA9IDB4YWY7CisJZWxzZSBwYWNrZXQtPmJpdG1hcFswXSA9IDB4YWU7CisKKwlmb3IgKGE9MDsgYTwxOyBhKyspIHsKKwkJcmV0dmFsID0gdXNiX2J1bGtfbXNnKG9kZXYtPnVkZXYsCisJCQl1c2Jfc25kYnVsa3BpcGUob2Rldi0+dWRldiwgMiksCisJCQlwYWNrZXQsCisJCQlzaXplb2Yoc3RydWN0IGFzdXNfb2xlZF9oZWFkZXIpICsgMSwKKwkJCSZhY3RfbGVuLAorCQkJLTEpOworCisJCWlmIChyZXR2YWwpCisJCQlkZXZfZGJnKCZvZGV2LT51ZGV2LT5kZXYsICJyZXR2YWwgPSAlZFxuIiwgcmV0dmFsKTsKKwl9CisKKwlvZGV2LT5lbmFibGVkID0gZW5hYmw7CisKKwlrZnJlZShwYWNrZXQpOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfZW5hYmxlZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsKKwlzdHJ1Y3QgYXN1c19vbGVkX2RldiAqb2RldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJaW50IHRlbXAgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKworCWVuYWJsZV9vbGVkKG9kZXYsIHRlbXApOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBjbGFzc19zZXRfZW5hYmxlZChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgYXN1c19vbGVkX2RldiAqb2RldiA9IChzdHJ1Y3QgYXN1c19vbGVkX2RldiAqKSBkZXZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKKworCWludCB0ZW1wID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisKKwllbmFibGVfb2xlZChvZGV2LCB0ZW1wKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgZ2V0X2VuYWJsZWQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOworCXN0cnVjdCBhc3VzX29sZWRfZGV2ICpvZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBvZGV2LT5lbmFibGVkKTsKK30KKworc3RhdGljIHNzaXplX3QgY2xhc3NfZ2V0X2VuYWJsZWQoc3RydWN0IGRldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBhc3VzX29sZWRfZGV2ICpvZGV2ID0gKHN0cnVjdCBhc3VzX29sZWRfZGV2ICopIGRldl9nZXRfZHJ2ZGF0YShkZXZpY2UpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIG9kZXYtPmVuYWJsZWQpOworfQorCitzdGF0aWMgdm9pZCBzZW5kX3BhY2tldHMoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHN0cnVjdCBhc3VzX29sZWRfcGFja2V0ICpwYWNrZXQsCisJY2hhciAqYnVmLCB1aW50OF90IHBfdHlwZSwgc2l6ZV90IHBfbnVtKQoreworCXNpemVfdCBpOworCWludCBhY3RfbGVuOworCisJZm9yIChpID0gMDsgaSA8IHBfbnVtOyBpKyspIHsKKwkJaW50IHJldHZhbDsKKworCQlzd2l0Y2ggKHBfdHlwZSkgeworCQkJY2FzZSBBU1VTX09MRURfUk9MTDoKKwkJCQlTRVRVUF9QQUNLRVRfSEVBREVSKHBhY2tldCwgMHg0MCwgMHg4MCwgcF9udW0sIGkgKyAxLCAweDAwLCAweDAxLCAweGZmKTsKKwkJCWJyZWFrOworCQkJY2FzZSBBU1VTX09MRURfU1RBVElDOgorCQkJCVNFVFVQX1BBQ0tFVF9IRUFERVIocGFja2V0LCAweDEwICsgaSwgMHg4MCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCk7CisJCQlicmVhazsKKwkJCWNhc2UgQVNVU19PTEVEX0ZMQVNIOgorCQkJCVNFVFVQX1BBQ0tFVF9IRUFERVIocGFja2V0LCAweDEwICsgaSwgMHg4MCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHhmZik7CisJCQlicmVhazsKKwkJfQorCisJCW1lbWNweShwYWNrZXQtPmJpdG1hcCwgYnVmICsgKEFTVVNfT0xFRF9QQUNLRVRfQlVGX1NJWkUqaSksIEFTVVNfT0xFRF9QQUNLRVRfQlVGX1NJWkUpOworCisJCXJldHZhbCA9IHVzYl9idWxrX21zZyh1ZGV2LAorCQkJdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDIpLAorCQkJcGFja2V0LAorCQkJc2l6ZW9mKHN0cnVjdCBhc3VzX29sZWRfcGFja2V0KSwKKwkJCSZhY3RfbGVuLAorCQkJLTEpOworCisJCWlmIChyZXR2YWwpCisJCQlkZXZfZGJnKCZ1ZGV2LT5kZXYsICJyZXR2YWwgPSAlZFxuIiwgcmV0dmFsKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfcGFja2V0KHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBzdHJ1Y3QgYXN1c19vbGVkX3BhY2tldCAqcGFja2V0LCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbGVuLCBjaGFyICpidWYsIHVpbnQ4X3QgYjEsIHVpbnQ4X3QgYjIsIHVpbnQ4X3QgYjMsIHVpbnQ4X3QgYjQsIHVpbnQ4X3QgYjUsIHVpbnQ4X3QgYjYpeworCWludCByZXR2YWw7CisJaW50IGFjdF9sZW47CisKKwlTRVRVUF9QQUNLRVRfSEVBREVSKHBhY2tldCwgYjEsIGIyLCBiMywgYjQsIGI1LCBiNiwgMHgwMCk7CisJbWVtY3B5KHBhY2tldC0+Yml0bWFwLCBidWYgKyBvZmZzZXQsIGxlbik7CisKKwlyZXR2YWwgPSB1c2JfYnVsa19tc2codWRldiwKKwkJCXVzYl9zbmRjdHJscGlwZSh1ZGV2LCAyKSwKKwkJCXBhY2tldCwKKwkJCXNpemVvZihzdHJ1Y3QgYXN1c19vbGVkX3BhY2tldCksCisJCQkmYWN0X2xlbiwKKwkJCS0xKTsKKworCWlmIChyZXR2YWwpCisJCWRldl9kYmcoJnVkZXYtPmRldiwgInJldHZhbCA9ICVkXG4iLCByZXR2YWwpOworfQorCisKK3N0YXRpYyB2b2lkIHNlbmRfcGFja2V0c19nNTAoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHN0cnVjdCBhc3VzX29sZWRfcGFja2V0ICpwYWNrZXQsIGNoYXIgKmJ1ZikKK3sKKwlzZW5kX3BhY2tldCh1ZGV2LCBwYWNrZXQsICAgICAwLCAweDEwMCwgYnVmLCAweDEwLCAweDAwLCAweDAyLCAweDAxLCAweDAwLCAweDAxKTsKKwlzZW5kX3BhY2tldCh1ZGV2LCBwYWNrZXQsIDB4MTAwLCAweDA4MCwgYnVmLCAweDEwLCAweDAwLCAweDAyLCAweDAyLCAweDgwLCAweDAwKTsKKworCXNlbmRfcGFja2V0KHVkZXYsIHBhY2tldCwgMHgxODAsIDB4MTAwLCBidWYsIDB4MTEsIDB4MDAsIDB4MDMsIDB4MDEsIDB4MDAsIDB4MDEpOworCXNlbmRfcGFja2V0KHVkZXYsIHBhY2tldCwgMHgyODAsIDB4MTAwLCBidWYsIDB4MTEsIDB4MDAsIDB4MDMsIDB4MDIsIDB4MDAsIDB4MDEpOworCXNlbmRfcGFja2V0KHVkZXYsIHBhY2tldCwgMHgzODAsIDB4MDgwLCBidWYsIDB4MTEsIDB4MDAsIDB4MDMsIDB4MDMsIDB4ODAsIDB4MDApOworfQorCisKK3N0YXRpYyB2b2lkIHNlbmRfZGF0YShzdHJ1Y3QgYXN1c19vbGVkX2RldiAqb2RldikKK3sKKwlzaXplX3QgcGFja2V0X251bSA9IG9kZXYtPmJ1Zl9zaXplIC8gQVNVU19PTEVEX1BBQ0tFVF9CVUZfU0laRTsKKwlzdHJ1Y3QgYXN1c19vbGVkX3BhY2tldCAqIHBhY2tldDsKKworCXBhY2tldCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhc3VzX29sZWRfcGFja2V0KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXBhY2tldCkgeworCQlkZXZfZXJyKCZvZGV2LT51ZGV2LT5kZXYsICJvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChvZGV2LT5wYWNrX21vZGU9PVBBQ0tfTU9ERV9HMSl7CisJCS8vIFdoZW4gc2VuZGluZyByb2xsLW1vZGUgZGF0YSB0aGUgZGlzcGxheSB1cGRhdGVkIG9ubHkgZmlyc3QgcGFja2V0LgorCQkvLyBJIGhhdmUgbm8gaWRlYSB3aHksIGJ1dCB3aGVuIHN0YXRpYyBwaWN0dXJlIGlzIHNlbmQganVzdCBiZWZvcmUKKwkJLy8gcm9sbGluZyBwaWN0dXJlIC0gZXZlcnl0aGluZyB3b3JrcyBmaW5lLgorCQlpZiAob2Rldi0+cGljX21vZGUgPT0gQVNVU19PTEVEX1JPTEwpCisJCQlzZW5kX3BhY2tldHMob2Rldi0+dWRldiwgcGFja2V0LCBvZGV2LT5idWYsIEFTVVNfT0xFRF9TVEFUSUMsIDIpOworCisJCS8vIE9ubHkgUk9MTCBtb2RlIGNhbiB1c2UgbW9yZSB0aGFuIDIgcGFja2V0cy4KKwkJaWYgKG9kZXYtPnBpY19tb2RlICE9IEFTVVNfT0xFRF9ST0xMICYmIHBhY2tldF9udW0gPiAyKQorCQkJcGFja2V0X251bSA9IDI7CisKKwkJc2VuZF9wYWNrZXRzKG9kZXYtPnVkZXYsIHBhY2tldCwgb2Rldi0+YnVmLCBvZGV2LT5waWNfbW9kZSwgcGFja2V0X251bSk7CisJfQorCWVsc2UKKwlpZiAob2Rldi0+cGFja19tb2RlPT1QQUNLX01PREVfRzUwKXsKKwkJc2VuZF9wYWNrZXRzX2c1MChvZGV2LT51ZGV2LCBwYWNrZXQsIG9kZXYtPmJ1Zik7CisJfQorCisJa2ZyZWUocGFja2V0KTsKK30KKworc3RhdGljIGludCBhcHBlbmRfdmFsdWVzKHN0cnVjdCBhc3VzX29sZWRfZGV2ICpvZGV2LCB1aW50OF90IHZhbCwgc2l6ZV90IGNvdW50KQoreworCXdoaWxlIChjb3VudC0tID4gMCkgeworCQlpZiAodmFsKSB7CisJCQlzaXplX3QgeCA9IG9kZXYtPmJ1Zl9vZmZzICUgb2Rldi0+d2lkdGg7CisJCQlzaXplX3QgeSA9IG9kZXYtPmJ1Zl9vZmZzIC8gb2Rldi0+d2lkdGg7CisJCQlzaXplX3QgaTsKKworCQkJeCArPSBvZGV2LT54X3NoaWZ0OworCQkJeSArPSBvZGV2LT55X3NoaWZ0OworCisJCQlzd2l0Y2gob2Rldi0+cGFja19tb2RlKQorCQkJeworCQkJCWNhc2UgUEFDS19NT0RFX0cxOgorCQkJCQkvLyBpID0gKHgvMTI4KSo2NDAgKyAxMjcgLSB4ICsgKHkvOCkqMTI4OworCQkJCQkvLyBUaGlzIG9uZSBmb3IgMTI4IGlzIHRoZSBzYW1lLCBidXQgbWlnaHQgYmUgYmV0dGVyIGZvciBkaWZmZXJlbnQgd2lkdGhzPworCQkJCQlpID0gKHgvb2Rldi0+ZGV2X3dpZHRoKSo2NDAgKyBvZGV2LT5kZXZfd2lkdGggLSAxIC0geCArICh5LzgpKm9kZXYtPmRldl93aWR0aDsKKwkJCQlicmVhazsKKworCQkJCWNhc2UgUEFDS19NT0RFX0c1MDoKKwkJCQkJaSA9ICAob2Rldi0+ZGV2X3dpZHRoIC0gMSAtIHgpLzggKyB5Km9kZXYtPmRldl93aWR0aC84OworCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoKKwkJCQkJaSA9IDA7CisJCQkJCXByaW50ayhBU1VTX09MRURfRVJST1IgIlVua25vd24gT0xFRCBQYWNrIE1vZGU6ICVkIVxuIiwgb2Rldi0+cGFja19tb2RlKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKGkgPj0gb2Rldi0+YnVmX3NpemUpIHsKKwkJCQlwcmludGsoQVNVU19PTEVEX0VSUk9SICJCdWZmZXIgb3ZlcmZsb3chIFJlcG9ydCBhIGJ1ZyBpbiB0aGUgZHJpdmVyOiBvZmZzOiAlZCA+PSAlZCBpOiAlZCAoeDogJWQgeTogJWQpXG4iLAorCQkJCQkoaW50KSBvZGV2LT5idWZfb2ZmcywgKGludCkgb2Rldi0+YnVmX3NpemUsIChpbnQpIGksIChpbnQpIHgsIChpbnQpIHkpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCisJCQlzd2l0Y2ggKG9kZXYtPnBhY2tfbW9kZSkKKwkJCXsKKwkJCQljYXNlIFBBQ0tfTU9ERV9HMToKKwkJCQkJb2Rldi0+YnVmW2ldICY9IH4oMTw8KHklOCkpOworCQkJCWJyZWFrOworCisJCQkJY2FzZSBQQUNLX01PREVfRzUwOgorCQkJCQlvZGV2LT5idWZbaV0gJj0gfigxPDwoeCU4KSk7CisJCQkJYnJlYWs7CisKKwkJCQlkZWZhdWx0OgorCQkJCQkvLyBjYW5ub3QgZ2V0IGhlcmU7IHN0b3BzIGdjYyBjb21wbGFpbmluZworCQkJCTsKKwkJCX0KKwkJfQorCisJCW9kZXYtPmxhc3RfdmFsID0gdmFsOworCQlvZGV2LT5idWZfb2ZmcysrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBvZGV2X3NldF9waWN0dXJlKHN0cnVjdCBhc3VzX29sZWRfZGV2ICpvZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzaXplX3Qgb2ZmcyA9IDAsIG1heF9vZmZzOworCisJaWYgKGNvdW50IDwgMSkgcmV0dXJuIDA7CisKKwlpZiAodG9sb3dlcihidWZbMF0pID09ICdiJyl7CisJICAgIC8vIGJpbmFyeSBtb2RlLCBzZXQgdGhlIGVudGlyZSBtZW1vcnkKKworCSAgICBzaXplX3QgaTsKKworCSAgICBvZGV2LT5idWZfc2l6ZSA9IChvZGV2LT5kZXZfd2lkdGggKiBBU1VTX09MRURfRElTUF9IRUlHSFQpIC8gODsKKworCSAgICBpZiAob2Rldi0+YnVmKSBrZnJlZShvZGV2LT5idWYpOworCSAgICBvZGV2LT5idWYgPSBrbWFsbG9jKG9kZXYtPmJ1Zl9zaXplLCBHRlBfS0VSTkVMKTsKKworCSAgICBtZW1zZXQob2Rldi0+YnVmLCAweGZmLCBvZGV2LT5idWZfc2l6ZSk7CisKKwkgICAgZm9yIChpPTE7IGkgPCBjb3VudCAmJiBpPD0zMiozMjsgaSsrKXsKKwkJb2Rldi0+YnVmW2ktMV0gPSBidWZbaV07CisJCW9kZXYtPmJ1Zl9vZmZzID0gaS0xOworCSAgICB9CisKKwkgICAgb2Rldi0+d2lkdGg9b2Rldi0+ZGV2X3dpZHRoIC8gODsKKwkgICAgb2Rldi0+aGVpZ2h0PUFTVVNfT0xFRF9ESVNQX0hFSUdIVDsKKwkgICAgb2Rldi0+eF9zaGlmdD0wOworCSAgICBvZGV2LT55X3NoaWZ0PTA7CisJICAgIG9kZXYtPmxhc3RfdmFsPTA7CisKKwkgICAgc2VuZF9kYXRhKG9kZXYpOworCisJICAgIHJldHVybiBjb3VudDsKKwl9CisKKwlpZiAoYnVmWzBdID09ICc8JykgeworCQlzaXplX3QgaTsKKwkJc2l6ZV90IHcgPSAwLCBoID0gMDsKKwkJc2l6ZV90IHdfbWVtLCBoX21lbTsKKworCQlpZiAoY291bnQgPCAxMCB8fCBidWZbMl0gIT0gJzonKSB7CisJCQlnb3RvIGVycm9yX2hlYWRlcjsKKwkJfQorCisJCXN3aXRjaCh0b2xvd2VyKGJ1ZlsxXSkpIHsKKwkJCWNhc2UgQVNVU19PTEVEX1NUQVRJQzoKKwkJCWNhc2UgQVNVU19PTEVEX1JPTEw6CisJCQljYXNlIEFTVVNfT0xFRF9GTEFTSDoKKwkJCQlvZGV2LT5waWNfbW9kZSA9IGJ1ZlsxXTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRrKEFTVVNfT0xFRF9FUlJPUiAiV3JvbmcgcGljdHVyZSBtb2RlOiAnJWMnLlxuIiwgYnVmWzFdKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCQlicmVhazsKKwkJfQorCisJCWZvciAoaSA9IDM7IGkgPCBjb3VudDsgKytpKSB7CisJCQlpZiAoYnVmW2ldID49ICcwJyAmJiBidWZbaV0gPD0gJzknKSB7CisJCQkJdyA9IDEwKncgKyAoYnVmW2ldIC0gJzAnKTsKKworCQkJCWlmICh3ID4gQVNVU19PTEVEX01BWF9XSURUSCkgZ290byBlcnJvcl93aWR0aDsKKwkJCX0KKwkJCWVsc2UgaWYgKHRvbG93ZXIoYnVmW2ldKSA9PSAneCcpIGJyZWFrOworCQkJZWxzZSBnb3RvIGVycm9yX3dpZHRoOworCQl9CisKKwkJZm9yICgrK2k7IGkgPCBjb3VudDsgKytpKSB7CisJCQlpZiAoYnVmW2ldID49ICcwJyAmJiBidWZbaV0gPD0gJzknKSB7CisJCQkJaCA9IDEwKmggKyAoYnVmW2ldIC0gJzAnKTsKKworCQkJCWlmIChoID4gQVNVU19PTEVEX0RJU1BfSEVJR0hUKSBnb3RvIGVycm9yX2hlaWdodDsKKwkJCX0KKwkJCWVsc2UgaWYgKHRvbG93ZXIoYnVmW2ldKSA9PSAnPicpIGJyZWFrOworCQkJZWxzZSBnb3RvIGVycm9yX2hlaWdodDsKKwkJfQorCisJCWlmICh3IDwgMSB8fCB3ID4gQVNVU19PTEVEX01BWF9XSURUSCkgZ290byBlcnJvcl93aWR0aDsKKworCQlpZiAoaCA8IDEgfHwgaCA+IEFTVVNfT0xFRF9ESVNQX0hFSUdIVCkgZ290byBlcnJvcl9oZWlnaHQ7CisKKwkJaWYgKGkgPj0gY291bnQgfHwgYnVmW2ldICE9ICc+JykgZ290byBlcnJvcl9oZWFkZXI7CisKKwkJb2ZmcyA9IGkrMTsKKworCQlpZiAodyAlIChvZGV2LT5kZXZfd2lkdGgpICE9IDApCisJCQl3X21lbSA9ICh3LyhvZGV2LT5kZXZfd2lkdGgpICsgMSkqKG9kZXYtPmRldl93aWR0aCk7CisJCWVsc2UKKwkJCXdfbWVtID0gdzsKKworCQlpZiAoaCA8IEFTVVNfT0xFRF9ESVNQX0hFSUdIVCkKKwkJCWhfbWVtID0gQVNVU19PTEVEX0RJU1BfSEVJR0hUOworCQllbHNlCisJCQloX21lbSA9IGg7CisKKwkJb2Rldi0+YnVmX3NpemUgPSB3X21lbSAqIGhfbWVtIC8gODsKKworCQlpZiAob2Rldi0+YnVmKSBrZnJlZShvZGV2LT5idWYpOworCQlvZGV2LT5idWYgPSBrbWFsbG9jKG9kZXYtPmJ1Zl9zaXplLCBHRlBfS0VSTkVMKTsKKworCQlpZiAob2Rldi0+YnVmID09IE5VTEwpIHsKKwkJCW9kZXYtPmJ1Zl9zaXplID0gMDsKKwkJCXByaW50ayhBU1VTX09MRURfRVJST1IgIk91dCBvZiBtZW1vcnkhXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJbWVtc2V0KG9kZXYtPmJ1ZiwgMHhmZiwgb2Rldi0+YnVmX3NpemUpOworCisJCW9kZXYtPmJ1Zl9vZmZzID0gMDsKKwkJb2Rldi0+d2lkdGggPSB3OworCQlvZGV2LT5oZWlnaHQgPSBoOworCQlvZGV2LT54X3NoaWZ0ID0gMDsKKwkJb2Rldi0+eV9zaGlmdCA9IDA7CisJCW9kZXYtPmxhc3RfdmFsID0gMDsKKworCQlpZiAob2Rldi0+cGljX21vZGUgPT0gQVNVU19PTEVEX0ZMQVNIKSB7CisJCQlpZiAoaCA8IEFTVVNfT0xFRF9ESVNQX0hFSUdIVC8yKQorCQkJCW9kZXYtPnlfc2hpZnQgPSAoQVNVU19PTEVEX0RJU1BfSEVJR0hULzIgLSBoKS8yOworCQl9CisJCWVsc2UgeworCQkJaWYgKGggPCBBU1VTX09MRURfRElTUF9IRUlHSFQpCisJCQkJb2Rldi0+eV9zaGlmdCA9IChBU1VTX09MRURfRElTUF9IRUlHSFQgLSBoKS8yOworCQl9CisKKwkJaWYgKHcgPCAob2Rldi0+ZGV2X3dpZHRoKSkKKwkJCW9kZXYtPnhfc2hpZnQgPSAoKG9kZXYtPmRldl93aWR0aCkgLSB3KS8yOworCX0KKworCW1heF9vZmZzID0gb2Rldi0+d2lkdGggKiBvZGV2LT5oZWlnaHQ7CisKKwl3aGlsZSAob2ZmcyA8IGNvdW50ICYmIG9kZXYtPmJ1Zl9vZmZzIDwgbWF4X29mZnMpIHsKKwkJaW50IHJldDsKKworCQlpZiAoYnVmW29mZnNdID09ICcxJyB8fCBidWZbb2Zmc10gPT0gJyMnKSB7CisJCQlpZiAoIChyZXQgPSBhcHBlbmRfdmFsdWVzKG9kZXYsIDEsIDEpKSA8IDApIHJldHVybiByZXQ7CisJCX0KKwkJZWxzZSBpZiAoYnVmW29mZnNdID09ICcwJyB8fCBidWZbb2Zmc10gPT0gJyAnKSB7CisJCQlpZiAoIChyZXQgPSBhcHBlbmRfdmFsdWVzKG9kZXYsIDAsIDEpKSA8IDApIHJldHVybiByZXQ7CisJCX0KKwkJZWxzZSBpZiAoYnVmW29mZnNdID09ICdcbicpIHsKKwkJCS8vIE5ldyBsaW5lIGRldGVjdGVkLiBMZXRzIGFzc3VtZSwgdGhhdCBhbGwgY2hhcmFjdGVycyB0aWxsIHRoZSBlbmQgb2YgdGhlCisJCQkvLyBsaW5lIHdlcmUgZXF1YWwgdG8gdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoaXMgbGluZS4KKwkJCWlmIChvZGV2LT5idWZfb2ZmcyAlIG9kZXYtPndpZHRoICE9IDApCisJCQkJaWYgKCAocmV0ID0gYXBwZW5kX3ZhbHVlcyhvZGV2LCBvZGV2LT5sYXN0X3ZhbCwKKwkJCQkgICAgICBvZGV2LT53aWR0aCAtIChvZGV2LT5idWZfb2ZmcyAlIG9kZXYtPndpZHRoKSkpIDwgMCkgcmV0dXJuIHJldDsKKwkJfQorCisJCW9mZnMrKzsKKwl9CisKKwlpZiAob2Rldi0+YnVmX29mZnMgPj0gbWF4X29mZnMpIHNlbmRfZGF0YShvZGV2KTsKKworCXJldHVybiBjb3VudDsKKworZXJyb3Jfd2lkdGg6CisJcHJpbnRrKEFTVVNfT0xFRF9FUlJPUiAiV3JvbmcgcGljdHVyZSB3aWR0aCBzcGVjaWZpZWQuXG4iKTsKKwlyZXR1cm4gLUVJTzsKKworZXJyb3JfaGVpZ2h0OgorCXByaW50ayhBU1VTX09MRURfRVJST1IgIldyb25nIHBpY3R1cmUgaGVpZ2h0IHNwZWNpZmllZC5cbiIpOworCXJldHVybiAtRUlPOworCitlcnJvcl9oZWFkZXI6CisJcHJpbnRrKEFTVVNfT0xFRF9FUlJPUiAiV3JvbmcgcGljdHVyZSBoZWFkZXIuXG4iKTsKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X3BpY3R1cmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CisKKwlyZXR1cm4gb2Rldl9zZXRfcGljdHVyZSh1c2JfZ2V0X2ludGZkYXRhKGludGYpLCBidWYsIGNvdW50KTsKK30KKworc3RhdGljIHNzaXplX3QgY2xhc3Nfc2V0X3BpY3R1cmUoc3RydWN0IGRldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIG9kZXZfc2V0X3BpY3R1cmUoKHN0cnVjdCBhc3VzX29sZWRfZGV2ICopIGRldl9nZXRfZHJ2ZGF0YShkZXZpY2UpLCBidWYsIGNvdW50KTsKK30KKworI2RlZmluZSBBU1VTX09MRURfREVWSUNFX0FUVFIoX2ZpbGUpCQlkZXZfYXR0cl9hc3VzX29sZWRfIyNfZmlsZQorCitzdGF0aWMgREVWSUNFX0FUVFIoYXN1c19vbGVkX2VuYWJsZWQsIFNfSVdVR08gfCBTX0lSVUdPLCBnZXRfZW5hYmxlZCwgc2V0X2VuYWJsZWQpOworc3RhdGljIERFVklDRV9BVFRSKGFzdXNfb2xlZF9waWN0dXJlLCBTX0lXVUdPICwgTlVMTCwgc2V0X3BpY3R1cmUpOworCitzdGF0aWMgREVWSUNFX0FUVFIoZW5hYmxlZCwgU19JV1VHTyB8IFNfSVJVR08sIGNsYXNzX2dldF9lbmFibGVkLCBjbGFzc19zZXRfZW5hYmxlZCk7CitzdGF0aWMgREVWSUNFX0FUVFIocGljdHVyZSwgU19JV1VHTywgTlVMTCwgY2xhc3Nfc2V0X3BpY3R1cmUpOworCitzdGF0aWMgaW50IGFzdXNfb2xlZF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSk7CisJc3RydWN0IGFzdXNfb2xlZF9kZXYgKm9kZXYgPSBOVUxMOworCWludCByZXR2YWwgPSAtRU5PTUVNOworCXVpbnQxNl90IGRldl93aWR0aCA9IDA7CisJb2xlZF9wYWNrX21vZGVfdCBwYWNrX21vZGUgPSBQQUNLX01PREVfTEFTVDsKKwljb25zdCBzdHJ1Y3Qgb2xlZF9kZXZfZGVzY19zdHIgKiBkZXZfZGVzYyA9IG9sZWRfZGV2X2Rlc2NfdGFibGU7CisJY29uc3QgY2hhciAqZGVzYyA9IDA7CisKKwlpZiAoaWQgPT0gMCkgeworCQkvLyBFdmVuIHBvc3NpYmxlPyBKdXN0IHRvIG1ha2Ugc3VyZS4uLgorCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIk5vIHVzYl9kZXZpY2VfaWQgcHJvdmlkZWQhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZm9yICg7IGRldl9kZXNjLT5pZFZlbmRvcjsgZGV2X2Rlc2MrKykKKwl7CisJCWlmIChkZXZfZGVzYy0+aWRWZW5kb3IgPT0gaWQtPmlkVmVuZG9yCisJCQkmJiBkZXZfZGVzYy0+aWRQcm9kdWN0ID09IGlkLT5pZFByb2R1Y3QpCisJCXsKKwkJCWRldl93aWR0aCA9IGRldl9kZXNjLT5kZXZXaWR0aDsKKwkJCWRlc2MgPSBkZXZfZGVzYy0+ZGV2RGVzYzsKKwkJCXBhY2tfbW9kZSA9IGRldl9kZXNjLT5wYWNrTW9kZTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCAhZGVzYyB8fCBkZXZfd2lkdGggPCAxIHx8IHBhY2tfbW9kZSA9PSBQQUNLX01PREVfTEFTVCkgeworCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIk1pc3Npbmcgb3IgaW5jb21wbGV0ZSBkZXZpY2UgZGVzY3JpcHRpb24hXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJb2RldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhc3VzX29sZWRfZGV2KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAob2RldiA9PSBOVUxMKSB7CisJCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiT3V0IG9mIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW9kZXYtPnVkZXYgPSB1c2JfZ2V0X2Rldih1ZGV2KTsKKwlvZGV2LT5waWNfbW9kZSA9IEFTVVNfT0xFRF9TVEFUSUM7CisJb2Rldi0+ZGV2X3dpZHRoID0gZGV2X3dpZHRoOworCW9kZXYtPnBhY2tfbW9kZSA9IHBhY2tfbW9kZTsKKwlvZGV2LT5oZWlnaHQgPSAwOworCW9kZXYtPndpZHRoID0gMDsKKwlvZGV2LT54X3NoaWZ0ID0gMDsKKwlvZGV2LT55X3NoaWZ0ID0gMDsKKwlvZGV2LT5idWZfb2ZmcyA9IDA7CisJb2Rldi0+YnVmX3NpemUgPSAwOworCW9kZXYtPmxhc3RfdmFsID0gMDsKKwlvZGV2LT5idWYgPSBOVUxMOworCW9kZXYtPmVuYWJsZWQgPSAxOworCW9kZXYtPmRldiA9IDA7CisKKwl1c2Jfc2V0X2ludGZkYXRhIChpbnRlcmZhY2UsIG9kZXYpOworCisJaWYgKChyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmQVNVU19PTEVEX0RFVklDRV9BVFRSKGVuYWJsZWQpKSkpIHsKKwkJZ290byBlcnJfZmlsZXM7CisJfQorCisJaWYgKChyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmQVNVU19PTEVEX0RFVklDRV9BVFRSKHBpY3R1cmUpKSkpIHsKKwkJZ290byBlcnJfZmlsZXM7CisJfQorCisJb2Rldi0+ZGV2ID0gZGV2aWNlX2NyZWF0ZShvbGVkX2NsYXNzLCAmaW50ZXJmYWNlLT5kZXYsIE1LREVWKDAsMCksCisJCQkJTlVMTCwib2xlZF8lZCIsICsrb2xlZF9udW0pOworCisJaWYgKElTX0VSUihvZGV2LT5kZXYpKSB7CisJCXJldHZhbCA9IFBUUl9FUlIob2Rldi0+ZGV2KTsKKwkJZ290byBlcnJfZmlsZXM7CisJfQorCisJZGV2X3NldF9kcnZkYXRhKG9kZXYtPmRldiwgb2Rldik7CisKKwlpZiAoIChyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUob2Rldi0+ZGV2LCAmZGV2X2F0dHJfZW5hYmxlZCkpKSB7CisJCWdvdG8gZXJyX2NsYXNzX2VuYWJsZWQ7CisJfQorCisJaWYgKCAocmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKG9kZXYtPmRldiwgJmRldl9hdHRyX3BpY3R1cmUpKSkgeworCQlnb3RvIGVycl9jbGFzc19waWN0dXJlOworCX0KKworCWRldl9pbmZvKCZpbnRlcmZhY2UtPmRldiwgIkF0dGFjaGVkIEFzdXMgT0xFRCBkZXZpY2U6ICVzIFt3aWR0aCAldSwgcGFja19tb2RlICVkXVxuIiwgZGVzYywgb2Rldi0+ZGV2X3dpZHRoLCBvZGV2LT5wYWNrX21vZGUpOworCisJaWYgKHN0YXJ0X29mZikKKwkJZW5hYmxlX29sZWQob2RldiwgMCk7CisKKwlyZXR1cm4gMDsKKworZXJyX2NsYXNzX3BpY3R1cmU6CisJZGV2aWNlX3JlbW92ZV9maWxlKG9kZXYtPmRldiwgJmRldl9hdHRyX3BpY3R1cmUpOworCitlcnJfY2xhc3NfZW5hYmxlZDoKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUob2Rldi0+ZGV2LCAmZGV2X2F0dHJfZW5hYmxlZCk7CisJZGV2aWNlX3VucmVnaXN0ZXIob2Rldi0+ZGV2KTsKKworZXJyX2ZpbGVzOgorCWRldmljZV9yZW1vdmVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZBU1VTX09MRURfREVWSUNFX0FUVFIoZW5hYmxlZCkpOworCWRldmljZV9yZW1vdmVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZBU1VTX09MRURfREVWSUNFX0FUVFIocGljdHVyZSkpOworCisJdXNiX3NldF9pbnRmZGF0YSAoaW50ZXJmYWNlLCBOVUxMKTsKKwl1c2JfcHV0X2RldihvZGV2LT51ZGV2KTsKKwlrZnJlZShvZGV2KTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGFzdXNfb2xlZF9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCit7CisJc3RydWN0IGFzdXNfb2xlZF9kZXYgKm9kZXY7CisKKwlvZGV2ID0gdXNiX2dldF9pbnRmZGF0YSAoaW50ZXJmYWNlKTsKKwl1c2Jfc2V0X2ludGZkYXRhIChpbnRlcmZhY2UsIE5VTEwpOworCisJZGV2aWNlX3JlbW92ZV9maWxlKG9kZXYtPmRldiwgJmRldl9hdHRyX3BpY3R1cmUpOworCWRldmljZV9yZW1vdmVfZmlsZShvZGV2LT5kZXYsICZkZXZfYXR0cl9lbmFibGVkKTsKKwlkZXZpY2VfdW5yZWdpc3RlcihvZGV2LT5kZXYpOworCisJZGV2aWNlX3JlbW92ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJiBBU1VTX09MRURfREVWSUNFX0FUVFIocGljdHVyZSkpOworCWRldmljZV9yZW1vdmVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICYgQVNVU19PTEVEX0RFVklDRV9BVFRSKGVuYWJsZWQpKTsKKworCXVzYl9wdXRfZGV2KG9kZXYtPnVkZXYpOworCisJaWYgKG9kZXYtPmJ1Zikga2ZyZWUob2Rldi0+YnVmKTsKKworCWtmcmVlKG9kZXYpOworCisJZGV2X2luZm8oJmludGVyZmFjZS0+ZGV2LCAiRGlzY29ubmVjdGVkIEFzdXMgT0xFRCBkZXZpY2VcbiIpOworfQorCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgb2xlZF9kcml2ZXIgPSB7CisJLm5hbWUgPQkJQVNVU19PTEVEX05BTUUsCisJLnByb2JlID0JYXN1c19vbGVkX3Byb2JlLAorCS5kaXNjb25uZWN0ID0JYXN1c19vbGVkX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlID0JaWRfdGFibGUsCit9OworCitzdGF0aWMgc3NpemVfdCB2ZXJzaW9uX3Nob3coc3RydWN0IGNsYXNzICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsIEFTVVNfT0xFRF9VTkRFUlNDT1JFX05BTUUgIiAlc1xuIiwgQVNVU19PTEVEX1ZFUlNJT04pOworfQorCitzdGF0aWMgQ0xBU1NfQVRUUih2ZXJzaW9uLCBTX0lSVUdPLCB2ZXJzaW9uX3Nob3csIE5VTEwpOworCitzdGF0aWMgaW50IF9faW5pdCBhc3VzX29sZWRfaW5pdCh2b2lkKQoreworCWludCByZXR2YWwgPSAwOworCW9sZWRfY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsIEFTVVNfT0xFRF9VTkRFUlNDT1JFX05BTUUpOworCisJaWYgKElTX0VSUihvbGVkX2NsYXNzKSkgeworCQllcnIoIkVycm9yIGNyZWF0aW5nICIgQVNVU19PTEVEX1VOREVSU0NPUkVfTkFNRSAiIGNsYXNzIik7CisJCXJldHVybiBQVFJfRVJSKG9sZWRfY2xhc3MpOworCX0KKworCWlmICgocmV0dmFsID0gY2xhc3NfY3JlYXRlX2ZpbGUob2xlZF9jbGFzcywgJmNsYXNzX2F0dHJfdmVyc2lvbikpKSB7CisJCWVycigiRXJyb3IgY3JlYXRpbmcgY2xhc3MgdmVyc2lvbiBmaWxlIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0dmFsID0gdXNiX3JlZ2lzdGVyKCZvbGVkX2RyaXZlcik7CisKKwlpZiAocmV0dmFsKSB7CisJCWVycigidXNiX3JlZ2lzdGVyIGZhaWxlZC4gRXJyb3IgbnVtYmVyICVkIiwgcmV0dmFsKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworCitlcnJvcjoKKwljbGFzc19kZXN0cm95KG9sZWRfY2xhc3MpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhc3VzX29sZWRfZXhpdCh2b2lkKQoreworCWNsYXNzX3JlbW92ZV9maWxlKG9sZWRfY2xhc3MsICZjbGFzc19hdHRyX3ZlcnNpb24pOworCWNsYXNzX2Rlc3Ryb3kob2xlZF9jbGFzcyk7CisKKwl1c2JfZGVyZWdpc3Rlcigmb2xlZF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCAoYXN1c19vbGVkX2luaXQpOworbW9kdWxlX2V4aXQgKGFzdXNfb2xlZF9leGl0KTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC9saW51eC50eHQgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL2xpbnV4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzc1OGIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC9saW51eC50eHQKQEAgLTAsMCArMSwzMyBAQAorPHM6NzR4MzI+CiswCiswCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDExMTExMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDExMTExMTAwMDAwMDAwMDAwMDAwMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMTExMTAwMDAwMDAwMDAwMDAwMDExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAxMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAxMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDExMTEwMDAwMDAwMDAwMDAwMTExMDAwMDExMTExMTExMTExMDAwMDAxMTExMTAwMTExMTExMDAwMTExMTExMDExMTEwMDAKKzAwMDAxMTExMDAwMDAwMDAwMDAwMTExMTEwMDAwMDExMTExMDAwMTExMDAwMTExMTEwMDAwMTExMTAwMDAxMTExMDAwMTEwMDAwCiswMDAwMTExMTAwMDAwMDAwMDAwMTEwMTExMDAwMDAxMTExMTAwMDExMTAwMDAwMTExMTAwMDExMTEwMDAwMDExMTEwMDEwMDAwMAorMDAwMDExMTEwMDAwMDAwMDAwMDEwMDExMTAwMDAwMTExMTAwMDAxMTExMDAwMDExMTEwMDAxMTExMDAwMDAxMTExMDExMDAwMDAKKzAwMDAxMTExMDAwMDAwMDAwMTAwMDAxMTEwMDAwMDExMTEwMDAwMTExMTAwMDAxMTExMDAwMTExMTAwMDAwMDExMTExMDAwMDAwCiswMDAwMTExMTAwMDAwMDAwMDEwMDAxMTExMDAwMDAxMTExMDAwMDExMTEwMDAwMTExMTAwMDExMTEwMDAwMDAwMTExMTAwMDAwMAorMDAwMDExMTEwMDAwMDAwMDAxMDAwMTExMTAwMDAwMTExMTAwMDAxMTExMDAwMDExMTEwMDAxMTExMDAwMDAwMDExMTEwMDAwMDAKKzAwMDAxMTExMDAwMDAwMDAwMTAwMDExMTAwMTAwMDExMTEwMDAwMTExMTAwMDAxMTExMDAwMTExMTAwMDAwMDAxMTExMTAwMDAwCiswMDAwMTExMTAwMDAwMDAwMTEwMDExMTEwMDEwMDAxMTExMDAwMDExMTEwMDAwMTExMTAwMDExMTEwMDAwMDAwMTExMTExMDAwMAorMDAwMDExMTEwMDAwMDAwMDExMDAxMTExMDExMDAwMTExMTAwMDAxMTExMDAwMDExMTEwMDAxMTExMDAwMDAwMTEwMTExMTAwMDAKKzAwMDAxMTExMDAwMDAwMDExMTAwMTExMTAxMDAwMDExMTEwMDAwMTExMTAwMDAxMTExMDAwMTExMTAwMDAwMDEwMDAxMTExMDAwCiswMDAxMTExMTAwMDAwMTExMTEwMDExMTAxMTAwMDAxMTExMDAwMDExMTEwMDAwMTExMTAwMTExMTEwMDAwMDExMDAwMDExMTEwMAorMTExMTExMTExMTExMTExMTExMDAwMTExMTAwMDExMTExMTEwMTExMTExMTAwMDAxMTExMTAxMTExMTEwMTExMTEwMTExMTExMTAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAKKzAKKzAKKzAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvbGludXhfZi50eHQgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL2xpbnV4X2YudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YmI4NWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL2xpbnV4X2YudHh0CkBAIC0wLDAgKzEsMTggQEAKKzxmOjEyOHgxNj4KKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDAwMDAwMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDAwMDExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDAwMTEwMDAxMTExMTExMTExMDAwMDExMTEwMDExMTExMDAxMTExMTAxMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMTExMTAwMDAxMTExMDAwMTEwMDAxMTExMDAwMTExMTAwMDExMTAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDAwMTAxMTEwMDAwMTExMTAwMDExMTAwMDExMTEwMDExMTEwMDAwMTExMDExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDAwMTExMDAwMDExMTAwMDAxMTEwMDAxMTExMDAxMTExMDAwMDExMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMTAwMDExMTAwMDAxMTEwMDAwMTExMDAwMTExMTAwMTExMTAwMDAwMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDEwMDAxMTEwMDAwMTExMDAwMDExMTAwMDExMTEwMDExMTEwMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAxMDAxMTEwMDEwMDExMTAwMDAxMTEwMDAxMTExMDAxMTExMDAwMDAxMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAxMTAwMTExMDExMDAxMTEwMDAwMTExMDAwMTExMTAwMTExMTAwMDAwMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMTEwMDExMTAxMDAwMTExMDAwMDExMTAwMDExMTEwMDExMTEwMDAwMDEwMDExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAxMTExMDAxMTAxMTAwMDExMTAwMDAxMTEwMDAxMTExMDAxMTExMDAwMDEwMDAwMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMTExMTExMTExMTAwMTExMTAwMTExMTExMDExMTExMTAwMDExMTEwMTExMTEwMTExMTAxMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvbGludXhfZnIudHh0IGIvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC9saW51eF9mci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg4ZTJiMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvbGludXhfZnIudHh0CkBAIC0wLDAgKzEsMzMgQEAKKzxmOjEyOHgzMj4KKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDAwMDAwMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDAwMDExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDAwMTEwMDAxMTExMTExMTExMDAwMDExMTEwMDExMTExMDAxMTExMTAxMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAwMTExMTAwMDAxMTExMDAwMTEwMDAxMTExMDAwMTExMTAwMDExMTAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDAwMTAxMTEwMDAwMTExMTAwMDExMTAwMDExMTEwMDExMTEwMDAwMTExMDExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDAwMTExMDAwMDExMTAwMDAxMTEwMDAxMTExMDAxMTExMDAwMDExMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMTAwMDExMTAwMDAxMTEwMDAwMTExMDAwMTExMTAwMTExMTAwMDAwMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMDEwMDAxMTEwMDAwMTExMDAwMDExMTAwMDExMTEwMDExMTEwMDAwMDExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAxMDAxMTEwMDEwMDExMTAwMDAxMTEwMDAxMTExMDAxMTExMDAwMDAxMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAxMTAwMTExMDExMDAxMTEwMDAwMTExMDAwMTExMTAwMTExMTAwMDAwMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMDAwMDAwMTEwMDExMTAxMDAwMTExMDAwMDExMTAwMDExMTEwMDExMTEwMDAwMDEwMDExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAxMTExMDAxMTAxMTAwMDExMTAwMDAxMTEwMDAxMTExMDAxMTExMDAwMDEwMDAwMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMTExMTExMTExMTAwMTExMTAwMTExMTExMDExMTExMTAwMDExMTEwMTExMTEwMTExMTAxMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC90dXgudHh0IGIvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC90dXgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMjA1MjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL3R1eC50eHQKQEAgLTAsMCArMSwzMyBAQAorPHM6MzJ4MzI+CiswMDAwMDAwMDAwMDAwMTExMTExMTAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMSAgICAgICAxMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMSAgICAgICAgIDEwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDEgICAgICAgICAxMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAxICAgICAgICAgMTAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMSAxICAxMTEgIDEwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDEgICAgMSAxICAgMTAwMDAwMDAwMAorMDAwMDAwMDAwMDAxICAxMTEgICAgIDEwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMSAxMTExMTEgICAxMDAwMDAwMDAwCiswMDAwMDAwMDAwMDEgMTExMTExICAgMTAwMDAwMDAwMAorMDAwMDAwMDAwMDAxICAgIDEgMSAgICAxMDAwMDAwMDAKKzAwMDAwMDAwMDAxICAgICAgMTEgICAgMTAwMDAwMDAwCiswMDAwMDAwMDAwMSAxMTExMTExMSAgICAxMDAwMDAwMAorMDAwMDAwMDAwMSAgMTExMTExMTEgICAgIDEwMDAwMDAKKzAwMDAwMDAwMSAgIDExMTExMTExMSAgICAxMDAwMDAwCiswMDAwMDAwMDEgIDExMTExMTExMTEgICAgIDEwMDAwMAorMDAwMDAwMDEgICAxMTExMTExMTExMSAgICAxMDAwMDAKKzAwMDAwMDAxICAxMTExMTExMTExMTEgICAgIDEwMDAwCiswMDAwMDAxICAgMTExMTExMTExMTExICAgICAxMDAwMAorMDAwMDAwMSAgIDExMTExMTExMTExMSAgICAgMTAwMDAKKzAwMDAwMDEgICAxMTExMTExMTExMTEgICAgIDEwMDAwCiswMDAwMDAxICAgMTExMTExMTExMTExICAgICAxMDAwMAorMDAwMDAwMDExIDExMTExMTExMTExICAgICAgMTAwMDAKKzAwMDAxMSAxMSAgMTExMTExMTExMTEgICAgMTAwMDAwCiswMDAxICAxMTExICAxMTExMTExMTExMTExMTEgMTAwMAorMDAxIDExMTExMTEgIDExMTExMTExMTExMTExIDEwMDAKKzAwMSAxMTExMTExICAxMTExMTExICAxMTExMTEgMTAwCiswMDEgMTExMTExMTEgMTExMTExICAgMTExMTExMSAxMAorMDAxIDExMTExMTExICAgICAgICAgIDExMTExICAxMDAKKzAwMSAgMTExMTExMSAgICAgICAgICAxMTEgIDExMTAwCiswMDAxMTEgICAxMTEgICAxMTExMSAgMTEgIDEwMDAwMAorMDAwMDAwMTExICAgMTExMTExMTExICAgIDEwMDAwMDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvdHV4X3IudHh0IGIvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC90dXhfci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ4MWEzZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvdHV4X3IudHh0CkBAIC0wLDAgKzEsMzMgQEAKKzxyOjMyeDMyPgorMDAwMDAwMDAwMDAwMDExMTExMTEwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDEgICAgICAgMTAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDEgICAgICAgICAxMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAxICAgICAgICAgMTAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMSAgICAgICAgIDEwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDEgMSAgMTExICAxMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAxICAgIDEgMSAgIDEwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMSAgMTExICAgICAxMDAwMDAwMDAwCiswMDAwMDAwMDAwMDEgMTExMTExICAgMTAwMDAwMDAwMAorMDAwMDAwMDAwMDAxIDExMTExMSAgIDEwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMSAgICAxIDEgICAgMTAwMDAwMDAwCiswMDAwMDAwMDAwMSAgICAgIDExICAgIDEwMDAwMDAwMAorMDAwMDAwMDAwMDEgMTExMTExMTEgICAgMTAwMDAwMDAKKzAwMDAwMDAwMDEgIDExMTExMTExICAgICAxMDAwMDAwCiswMDAwMDAwMDEgICAxMTExMTExMTEgICAgMTAwMDAwMAorMDAwMDAwMDAxICAxMTExMTExMTExICAgICAxMDAwMDAKKzAwMDAwMDAxICAgMTExMTExMTExMTEgICAgMTAwMDAwCiswMDAwMDAwMSAgMTExMTExMTExMTExICAgICAxMDAwMAorMDAwMDAwMSAgIDExMTExMTExMTExMSAgICAgMTAwMDAKKzAwMDAwMDEgICAxMTExMTExMTExMTEgICAgIDEwMDAwCiswMDAwMDAxICAgMTExMTExMTExMTExICAgICAxMDAwMAorMDAwMDAwMSAgIDExMTExMTExMTExMSAgICAgMTAwMDAKKzAwMDAwMDAxMSAxMTExMTExMTExMSAgICAgIDEwMDAwCiswMDAwMTEgMTEgIDExMTExMTExMTExICAgIDEwMDAwMAorMDAwMSAgMTExMSAgMTExMTExMTExMTExMTExIDEwMDAKKzAwMSAxMTExMTExICAxMTExMTExMTExMTExMSAxMDAwCiswMDEgMTExMTExMSAgMTExMTExMSAgMTExMTExIDEwMAorMDAxIDExMTExMTExIDExMTExMSAgIDExMTExMTEgMTAKKzAwMSAxMTExMTExMSAgICAgICAgICAxMTExMSAgMTAwCiswMDEgIDExMTExMTEgICAgICAgICAgMTExICAxMTEwMAorMDAwMTExICAgMTExICAgMTExMTEgIDExICAxMDAwMDAKKzAwMDAwMDExMSAgIDExMTExMTExMSAgICAxMDAwMDAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL3R1eF9yMi50eHQgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL3R1eF9yMi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk0ZDg0ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvdHV4X3IyLnR4dApAQCAtMCwwICsxLDMzIEBACis8cjoyNTZ4MzI+CiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgICAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgICAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgICAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgICAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxIDEgIDExMSAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgIDEgMSAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTExMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAxMTEgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTExMTEwMDAwMDAwMDAwMDAwMDExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxIDExMTExMSAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDAwMDAwMDExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxIDExMTExMSAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDAwMDAwMDExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgIDEgMSAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgICAgICAxMSAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgMTExMTExMTEgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDAwMDAxMTEwMDAwMTExMTExMTExMTEwMDAwMDExMTExMDAxMTExMTEwMDAxMTExMTEwMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgMTExMTExMTEgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDAwMDExMTExMDAwMDAxMTExMTAwMDExMTAwMDExMTExMDAwMDExMTEwMDAwMTExMTAwMDExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgMTExMTExMTExICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDAwMTEwMTExMDAwMDAxMTExMTAwMDExMTAwMDAwMTExMTAwMDExMTEwMDAwMDExMTEwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAxMTExMTExMTExICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDAwMTAwMTExMDAwMDAxMTExMDAwMDExMTEwMDAwMTExMTAwMDExMTEwMDAwMDExMTEwMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgICAxMTExMTExMTExMSAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDEwMDAwMTExMDAwMDAxMTExMDAwMDExMTEwMDAwMTExMTAwMDExMTEwMDAwMDAxMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgIDExMTExMTExMTExMSAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTAwMDAwMDAwMDEwMDAxMTExMDAwMDAxMTExMDAwMDExMTEwMDAwMTExMTAwMDExMTEwMDAwMDAwMTExMTAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgICAxMTExMTExMTExMTEgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAxMDAwMTExMTAwMDAwMTExMTAwMDAxMTExMDAwMDExMTEwMDAxMTExMDAwMDAwMDExMTEwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgICAxMTExMTExMTExMTEgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDAxMDAwMTExMDAxMDAwMTExMTAwMDAxMTExMDAwMDExMTEwMDAxMTExMDAwMDAwMDExMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgICAxMTExMTExMTExMTEgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDExMDAxMTExMDAxMDAwMTExMTAwMDAxMTExMDAwMDExMTEwMDAxMTExMDAwMDAwMDExMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgICAxMTExMTExMTExMTEgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMDExMDAxMTExMDExMDAwMTExMTAwMDAxMTExMDAwMDExMTEwMDAxMTExMDAwMDAwMTEwMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMSAxMTExMTExMTExMSAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTEwMDAwMDAwMTExMDAxMTExMDEwMDAwMTExMTAwMDAxMTExMDAwMDExMTEwMDAxMTExMDAwMDAwMTAwMDExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMSAxMSAgMTExMTExMTExMTEgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTEwMDAwMDExMTExMDAxMTEwMTEwMDAwMTExMTAwMDAxMTExMDAwMDExMTEwMDExMTExMDAwMDAxMTAwMDAxMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgIDExMTEgIDExMTExMTExMTExMTExMSAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExMTExMTExMTExMTExMTExMDAwMTExMTAwMDExMTExMTEwMTExMTExMTAwMDAxMTExMTAxMTExMTEwMTExMTEwMTExMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAxMTExMTExICAxMTExMTExMTExMTExMSAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAxMTExMTExICAxMTExMTExICAxMTExMTEgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAxMTExMTExMSAxMTExMTEgICAxMTExMTExIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAxMTExMTExMSAgICAgICAgICAxMTExMSAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAxMTExMTExICAgICAgICAgIDExMSAgMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTEgICAxMTEgICAxMTExMSAgMTEgIDEwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTEgICAxMTExMTExMTEgICAgMTAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvemlnLnR4dCBiL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvemlnLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTU3M2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC96aWcudHh0CkBAIC0wLDAgKzEsMzMgQEAKKzxyOjEyOHgzMj4KKzEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxCiswMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMAorMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAKKzAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwCiswMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMAorMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAKKzAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwCiswMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMAorMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAKKzAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwCiswMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiswMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2F0NzZfdXNiL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvYXQ3Nl91c2IvS2NvbmZpZwppbmRleCA4NjA2Zjk2Li40YzBlNTVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYXQ3Nl91c2IvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvYXQ3Nl91c2IvS2NvbmZpZwpAQCAtMSw2ICsxLDYgQEAKIGNvbmZpZyBVU0JfQVRNRUwKIAl0cmlzdGF0ZSAiQXRtZWwgYXQ3NmM1MDMvYXQ3NmM1MDUvYXQ3NmM1MDVhIFVTQiBjYXJkcyIKLQlkZXBlbmRzIG9uIFdMQU5fODAyMTEgJiYgVVNCCisJZGVwZW5kcyBvbiBNQUM4MDIxMSAmJiBXTEFOXzgwMjExICYmIFVTQgogCWRlZmF1bHQgTgogCXNlbGVjdCBGV19MT0FERVIKIAktLS1oZWxwLS0tCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYXQ3Nl91c2IvYXQ3Nl91c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9hdDc2X3VzYi9hdDc2X3VzYi5jCmluZGV4IDE3NGUyYmUuLjE4NTUzM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hdDc2X3VzYi9hdDc2X3VzYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hdDc2X3VzYi9hdDc2X3VzYi5jCkBAIC02LDYgKzYsNyBAQAogICogQ29weXJpZ2h0IChjKSAyMDA0IE5pY2sgSm9uZXMKICAqIENvcHlyaWdodCAoYykgMjAwNCBCYWxpbnQgU2VlYmVyIDxuMF81cDRtX3AxMzQ1M0Bob3RtYWlsLmNvbT4KICAqIENvcHlyaWdodCAoYykgMjAwNyBHdWlkbyBHdWVudGhlciA8YWd4QHNpZ3hjcHUub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDA3IEthbGxlIFZhbG8gPGthbGxlLnZhbG9AaWtpLmZpPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCkBAIC0xNiw2ICsxNywxMyBAQAogICogQXRtZWwgQVQ3NkM1MDNBLzUwNS81MDVBLgogICoKICAqIFNvbWUgaXdfaGFuZGxlciBjb2RlIHdhcyB0YWtlbiBmcm9tIGFpcm8uYywgKEMpIDE5OTkgQmVuamFtaW4gUmVlZAorICoKKyAqIFRPRE8gZm9yIHRoZSBtYWM4MDIxMSBwb3J0OgorICogbyBhZGhvYyBzdXBwb3J0CisgKiBvIFJUUy9DVFMgc3VwcG9ydAorICogbyBQb3dlciBTYXZlIE1vZGUgc3VwcG9ydAorICogbyBzdXBwb3J0IGZvciBzaG9ydC9sb25nIHByZWFtYmxlcworICogbyBleHBvcnQgdmFyaWFibGVzIHRocm91Z2ggZGVidWdmcy9zeXNmcwogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0zNiw3ICs0NCw3IEBACiAjaW5jbHVkZSA8bmV0L2llZWU4MDIxMV9yYWRpb3RhcC5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvbGVkcy5oPgotI2luY2x1ZGUgPG5ldC9pZWVlODAyMTEuaD4KKyNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KIAogI2luY2x1ZGUgImF0NzZfdXNiLmgiCiAKQEAgLTc2LDMxICs4NCw0MyBAQAogI2RlZmluZSBEQkdfV0VfRVZFTlRTCQkweDA4MDAwMDAwCS8qIGR1bXAgd2lyZWxlc3MgZXZlbnRzICovCiAjZGVmaW5lIERCR19GVwkJCTB4MTAwMDAwMDAJLyogZmlybXdhcmUgZG93bmxvYWQgKi8KICNkZWZpbmUgREJHX0RGVQkJCTB4MjAwMDAwMDAJLyogZGV2aWNlIGZpcm13YXJlIHVwZ3JhZGUgKi8KKyNkZWZpbmUgREJHX0NNRAkJCTB4NDAwMDAwMDAKKyNkZWZpbmUgREJHX01BQzgwMjExCQkweDgwMDAwMDAwCiAKICNkZWZpbmUgREJHX0RFRkFVTFRTCQkwCiAKIC8qIFVzZSBvdXIgb3duIGRiZyBtYWNybyAqLwogI2RlZmluZSBhdDc2X2RiZyhiaXRzLCBmb3JtYXQsIGFyZy4uLikgXAotCWRvIHsgXAotCQlpZiAoYXQ3Nl9kZWJ1ZyAmIChiaXRzKSkgXAorZG8gewlcCisJaWYgKGF0NzZfZGVidWcgJiAoYml0cykpCVwKIAkJcHJpbnRrKEtFUk5fREVCVUcgRFJJVkVSX05BTUUgIjogIiBmb3JtYXQgIlxuIiAsICMjIGFyZyk7IFwKLQl9IHdoaWxlICgwKQorfSB3aGlsZSAoMCkKKworI2RlZmluZSBhdDc2X2RiZ19kdW1wKGJpdHMsIGJ1ZiwgbGVuLCBmb3JtYXQsIGFyZy4uLikJXAorZG8gewlcCisJaWYgKGF0NzZfZGVidWcgJiAoYml0cykpIHsJXAorCQlwcmludGsoS0VSTl9ERUJVRyBEUklWRVJfTkFNRSAiOiAiIGZvcm1hdCAiXG4iICwgIyMgYXJnKTsgXAorCQlwcmludF9oZXhfZHVtcF9ieXRlcygiIiwgRFVNUF9QUkVGSVhfT0ZGU0VULCBidWYsIGxlbik7CVwKKwkJfQkJCQkJCQlcCit9IHdoaWxlICgwKQogCiBzdGF0aWMgaW50IGF0NzZfZGVidWcgPSBEQkdfREVGQVVMVFM7CiAKKyNkZWZpbmUgRklSTVdBUkVfSVNfV1BBKHZlcikgKCh2ZXIubWFqb3IgPT0gMSkgJiYgKHZlci5taW5vciA9PSAxMDMpKQorCiAvKiBQcm90ZWN0IGFnYWluc3QgY29uY3VycmVudCBmaXJtd2FyZSBsb2FkaW5nIGFuZCBwYXJzaW5nICovCiBzdGF0aWMgc3RydWN0IG11dGV4IGZ3X211dGV4OwogCiBzdGF0aWMgc3RydWN0IGZ3ZW50cnkgZmlybXdhcmVzW10gPSB7Ci0JWzBdID0geyIifSwKLQlbQk9BUkRfNTAzX0lTTDM4NjFdID0geyJhdG1lbF9hdDc2YzUwMy1pMzg2MS5iaW4ifSwKLQlbQk9BUkRfNTAzX0lTTDM4NjNdID0geyJhdG1lbF9hdDc2YzUwMy1pMzg2My5iaW4ifSwKLQlbQk9BUkRfNTAzXSA9IHsiYXRtZWxfYXQ3NmM1MDMtcmZtZC5iaW4ifSwKLQlbQk9BUkRfNTAzX0FDQ10gPSB7ImF0bWVsX2F0NzZjNTAzLXJmbWQtYWNjLmJpbiJ9LAotCVtCT0FSRF81MDVdID0geyJhdG1lbF9hdDc2YzUwNS1yZm1kLmJpbiJ9LAotCVtCT0FSRF81MDVfMjk1OF0gPSB7ImF0bWVsX2F0NzZjNTA1LXJmbWQyOTU4LmJpbiJ9LAotCVtCT0FSRF81MDVBXSA9IHsiYXRtZWxfYXQ3NmM1MDVhLXJmbWQyOTU4LmJpbiJ9LAotCVtCT0FSRF81MDVBTVhdID0geyJhdG1lbF9hdDc2YzUwNWFteC1yZm1kLmJpbiJ9LAorCVswXSA9IHsgIiIgfSwKKwlbQk9BUkRfNTAzX0lTTDM4NjFdID0geyAiYXRtZWxfYXQ3NmM1MDMtaTM4NjEuYmluIiB9LAorCVtCT0FSRF81MDNfSVNMMzg2M10gPSB7ICJhdG1lbF9hdDc2YzUwMy1pMzg2My5iaW4iIH0sCisJW0JPQVJEXzUwM10gPSB7ICJhdG1lbF9hdDc2YzUwMy1yZm1kLmJpbiIgfSwKKwlbQk9BUkRfNTAzX0FDQ10gPSB7ICJhdG1lbF9hdDc2YzUwMy1yZm1kLWFjYy5iaW4iIH0sCisJW0JPQVJEXzUwNV0gPSB7ICJhdG1lbF9hdDc2YzUwNS1yZm1kLmJpbiIgfSwKKwlbQk9BUkRfNTA1XzI5NThdID0geyAiYXRtZWxfYXQ3NmM1MDUtcmZtZDI5NTguYmluIiB9LAorCVtCT0FSRF81MDVBXSA9IHsgImF0bWVsX2F0NzZjNTA1YS1yZm1kMjk1OC5iaW4iIH0sCisJW0JPQVJEXzUwNUFNWF0gPSB7ICJhdG1lbF9hdDc2YzUwNWFteC1yZm1kLmJpbiIgfSwKIH07CiAKICNkZWZpbmUgVVNCX0RFVklDRV9EQVRBKF9fb3BzKQkuZHJpdmVyX2luZm8gPSAoa2VybmVsX3Vsb25nX3QpKF9fb3BzKQpAQCAtMTEwLDEzMyArMTMwLDEzMyBAQAogCSAqIGF0NzZjNTAzLWkzODYxCiAJICovCiAJLyogR2VuZXJpYyBBVDc2QzUwMy8zODYxIGRldmljZSAqLwotCXtVU0JfREVWSUNFKDB4MDNlYiwgMHg3NjAzKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKX0sCisJeyBVU0JfREVWSUNFKDB4MDNlYiwgMHg3NjAzKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKSB9LAogCS8qIExpbmtzeXMgV1VTQjExIHYyLjEvdjIuNiAqLwotCXtVU0JfREVWSUNFKDB4MDY2YiwgMHgyMjExKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKX0sCisJeyBVU0JfREVWSUNFKDB4MDY2YiwgMHgyMjExKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKSB9LAogCS8qIE5ldGdlYXIgTUExMDEgcmV2LiBBICovCi0Je1VTQl9ERVZJQ0UoMHgwODY0LCAweDQxMDApLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjEpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwODY0LCAweDQxMDApLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjEpIH0sCiAJLyogVGVrcmFtIFUzMDBDIC8gQWxsbmV0IEFMTDAxOTMgKi8KLQl7VVNCX0RFVklDRSgweDBiM2IsIDB4MTYxMiksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MSl9LAorCXsgVVNCX0RFVklDRSgweDBiM2IsIDB4MTYxMiksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MSkgfSwKIAkvKiBIUCBITjIxMFcgSjc4MDFBICovCi0Je1VTQl9ERVZJQ0UoMHgwM2YwLCAweDAxMWMpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjEpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwM2YwLCAweDAxMWMpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjEpIH0sCiAJLyogU2l0ZWNvbS9aLUNvbS9aeXhlbCBNNFktNzUwICovCi0Je1VTQl9ERVZJQ0UoMHgwY2RlLCAweDAwMDEpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjEpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwY2RlLCAweDAwMDEpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjEpIH0sCiAJLyogRHluYWxpbmsvQXNrZXkgV0xMMDEzIChpbnRlcnNpbCkgKi8KLQl7VVNCX0RFVklDRSgweDA2OWEsIDB4MDMyMCksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MSl9LAorCXsgVVNCX0RFVklDRSgweDA2OWEsIDB4MDMyMCksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MSkgfSwKIAkvKiBFWiBjb25uZWN0IDExTXBicyBXaXJlbGVzcyBVU0IgQWRhcHRlciBTTUMyNjYyVyB2MSAqLwotCXtVU0JfREVWSUNFKDB4MGQ1YywgMHhhMDAxKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKX0sCisJeyBVU0JfREVWSUNFKDB4MGQ1YywgMHhhMDAxKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKSB9LAogCS8qIEJlblEgQVdMMzAwICovCi0Je1VTQl9ERVZJQ0UoMHgwNGE1LCAweDkwMDApLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjEpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNGE1LCAweDkwMDApLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjEpIH0sCiAJLyogQWRkdHJvbiBBV1UtMTIwLCBDb21wZXggV0xVMTEgKi8KLQl7VVNCX0RFVklDRSgweDA1ZGQsIDB4ZmYzMSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MSl9LAorCXsgVVNCX0RFVklDRSgweDA1ZGQsIDB4ZmYzMSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MSkgfSwKIAkvKiBJbnRlbCBBUDMxMCBBbnlQb2ludCBJSSBVU0IgKi8KLQl7VVNCX0RFVklDRSgweDgwODYsIDB4MDIwMCksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MSl9LAorCXsgVVNCX0RFVklDRSgweDgwODYsIDB4MDIwMCksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MSkgfSwKIAkvKiBEeW5hbGluayBMMTFVICovCi0Je1VTQl9ERVZJQ0UoMHgwZDhlLCAweDcxMDApLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjEpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwZDhlLCAweDcxMDApLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjEpIH0sCiAJLyogQXJlc2NvbSBXTC0yMTAsIEZDQyBpZCAwN0otR0wyNDExVVNCICovCi0Je1VTQl9ERVZJQ0UoMHgwZDhlLCAweDcxMTApLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjEpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwZDhlLCAweDcxMTApLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjEpIH0sCiAJLyogSS1PIERBVEEgV04tQjExL1VTQiAqLwotCXtVU0JfREVWSUNFKDB4MDRiYiwgMHgwOTE5KSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKX0sCisJeyBVU0JfREVWSUNFKDB4MDRiYiwgMHgwOTE5KSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKSB9LAogCS8qIEJUIFZveWFnZXIgMTAxMCAqLwotCXtVU0JfREVWSUNFKDB4MDY5YSwgMHgwODIxKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKX0sCisJeyBVU0JfREVWSUNFKDB4MDY5YSwgMHgwODIxKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19JU0wzODYxKSB9LAogCS8qCiAJICogYXQ3NmM1MDMtaTM4NjMKIAkgKi8KIAkvKiBHZW5lcmljIEFUNzZDNTAzLzM4NjMgZGV2aWNlICovCi0Je1VTQl9ERVZJQ0UoMHgwM2ViLCAweDc2MDQpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjMpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwM2ViLCAweDc2MDQpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0lTTDM4NjMpIH0sCiAJLyogU2Ftc3VuZyBTV0wtMjEwMFUgKi8KLQl7VVNCX0RFVklDRSgweDA1NWQsIDB4YTAwMCksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2Myl9LAorCXsgVVNCX0RFVklDRSgweDA1NWQsIDB4YTAwMCksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfSVNMMzg2MykgfSwKIAkvKgogCSAqIGF0NzZjNTAzLXJmbWQKIAkgKi8KIAkvKiBHZW5lcmljIEFUNzZDNTAzL1JGTUQgZGV2aWNlICovCi0Je1VTQl9ERVZJQ0UoMHgwM2ViLCAweDc2MDUpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKX0sCisJeyBVU0JfREVWSUNFKDB4MDNlYiwgMHg3NjA1KSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMykgfSwKIAkvKiBEeW5hbGluay9Bc2tleSBXTEwwMTMgKHJmbWQpICovCi0Je1VTQl9ERVZJQ0UoMHgwNjlhLCAweDAzMjEpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKX0sCisJeyBVU0JfREVWSUNFKDB4MDY5YSwgMHgwMzIxKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMykgfSwKIAkvKiBMaW5rc3lzIFdVU0IxMSB2Mi42ICovCi0Je1VTQl9ERVZJQ0UoMHgwNzdiLCAweDIyMTkpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKX0sCisJeyBVU0JfREVWSUNFKDB4MDc3YiwgMHgyMjE5KSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMykgfSwKIAkvKiBOZXR3b3JrIEV2ZXJ5d2hlcmUgTldVMTFCICovCi0Je1VTQl9ERVZJQ0UoMHgwNzdiLCAweDIyMjcpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKX0sCisJeyBVU0JfREVWSUNFKDB4MDc3YiwgMHgyMjI3KSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMykgfSwKIAkvKiBOZXRnZWFyIE1BMTAxIHJldi4gQiAqLwotCXtVU0JfREVWSUNFKDB4MDg2NCwgMHg0MTAyKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDA4NjQsIDB4NDEwMiksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogRC1MaW5rIERXTC0xMjAgcmV2LiBFICovCi0Je1VTQl9ERVZJQ0UoMHgyMDAxLCAweDMyMDApLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKX0sCisJeyBVU0JfREVWSUNFKDB4MjAwMSwgMHgzMjAwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMykgfSwKIAkvKiBBY3Rpb250ZWMgODAyVUFUMSwgSFdVMDExNTAtMDFVSyAqLwotCXtVU0JfREVWSUNFKDB4MTY2OCwgMHg3NjA1KSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDE2NjgsIDB4NzYwNSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogQWlyVmFzdCBXLUJ1ZGRpZSBXTjIxMCAqLwotCXtVU0JfREVWSUNFKDB4MDNlYiwgMHg0MTAyKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDAzZWIsIDB4NDEwMiksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogRGljayBTbWl0aCBFbGVjdHJvbmljcyBYSDExNTMgODAyLjExYiBVU0IgYWRhcHRlciAqLwotCXtVU0JfREVWSUNFKDB4MTM3MSwgMHg1NzQzKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDEzNzEsIDB4NTc0MyksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogQ05ldCBDTlVTQjYxMSAqLwotCXtVU0JfREVWSUNFKDB4MTM3MSwgMHgwMDAxKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDEzNzEsIDB4MDAwMSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogRmliZXJMaW5lIEZMLVdMMjAwVSAqLwotCXtVU0JfREVWSUNFKDB4MTM3MSwgMHgwMDAyKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDEzNzEsIDB4MDAwMiksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogQmVuUSBBV0w0MDAgVVNCIHN0aWNrICovCi0Je1VTQl9ERVZJQ0UoMHgwNGE1LCAweDkwMDEpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKX0sCisJeyBVU0JfREVWSUNFKDB4MDRhNSwgMHg5MDAxKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMykgfSwKIAkvKiAzQ29tIDNDUlNIRVc2OTYgKi8KLQl7VVNCX0RFVklDRSgweDA1MDYsIDB4MGEwMSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNTA2LCAweDBhMDEpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKSB9LAogCS8qIFNpZW1lbnMgU2FudGlzIEFEU0wgV0xBTiBVU0IgYWRhcHRlciBXTEwgMDEzICovCi0Je1VTQl9ERVZJQ0UoMHgwNjgxLCAweDAwMWIpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKX0sCisJeyBVU0JfREVWSUNFKDB4MDY4MSwgMHgwMDFiKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMykgfSwKIAkvKiBCZWxraW4gRjVENjA1MCwgdmVyc2lvbiAyICovCi0Je1VTQl9ERVZJQ0UoMHgwNTBkLCAweDAwNTApLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKX0sCisJeyBVU0JfREVWSUNFKDB4MDUwZCwgMHgwMDUwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMykgfSwKIAkvKiBpQmxpdHp6LCBCV1U2MTMgKG5vdCAqQiBvciAqU0IpICovCi0Je1VTQl9ERVZJQ0UoMHgwN2I4LCAweGIwMDApLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKX0sCisJeyBVU0JfREVWSUNFKDB4MDdiOCwgMHhiMDAwKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMykgfSwKIAkvKiBHaWdhYnl0ZSBHTi1XTEJNMTAxICovCi0Je1VTQl9ERVZJQ0UoMHgxMDQ0LCAweDgwMDMpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKX0sCisJeyBVU0JfREVWSUNFKDB4MTA0NCwgMHg4MDAzKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMykgfSwKIAkvKiBQbGFuZXggR1ctVVMxMVMgKi8KLQl7VVNCX0RFVklDRSgweDIwMTksIDB4MzIyMCksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpfSwKKwl7IFVTQl9ERVZJQ0UoMHgyMDE5LCAweDMyMjApLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKSB9LAogCS8qIEludGVybmFsIFdMQU4gYWRhcHRlciBpbiBoNVs0LDVdeHggc2VyaWVzIGlQQVFzICovCi0Je1VTQl9ERVZJQ0UoMHgwNDlmLCAweDAwMzIpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKX0sCisJeyBVU0JfREVWSUNFKDB4MDQ5ZiwgMHgwMDMyKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMykgfSwKIAkvKiBDb3JlZ2EgV2lyZWxlc3MgTEFOIFVTQi0xMSBtaW5pICovCi0Je1VTQl9ERVZJQ0UoMHgwN2FhLCAweDAwMTEpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzKX0sCisJeyBVU0JfREVWSUNFKDB4MDdhYSwgMHgwMDExKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMykgfSwKIAkvKiBDb3JlZ2EgV2lyZWxlc3MgTEFOIFVTQi0xMSBtaW5pMiAqLwotCXtVU0JfREVWSUNFKDB4MDdhYSwgMHgwMDE4KSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDA3YWEsIDB4MDAxOCksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyogVW5pZGVuIFBDVzEwMCAqLwotCXtVU0JfREVWSUNFKDB4MDVkZCwgMHhmZjM1KSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwMyl9LAorCXsgVVNCX0RFVklDRSgweDA1ZGQsIDB4ZmYzNSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDMpIH0sCiAJLyoKIAkgKiBhdDc2YzUwMy1yZm1kLWFjYwogCSAqLwogCS8qIFNNQzI2NjRXICovCi0Je1VTQl9ERVZJQ0UoMHgwODNhLCAweDM1MDEpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTAzX0FDQyl9LAorCXsgVVNCX0RFVklDRSgweDA4M2EsIDB4MzUwMSksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfQUNDKSB9LAogCS8qIEJlbGtpbiBGNUQ2MDUwLCBTTUMyNjYyVyB2MiwgU01DMjY2MlctQVIgKi8KLQl7VVNCX0RFVklDRSgweDBkNWMsIDB4YTAwMiksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDNfQUNDKX0sCisJeyBVU0JfREVWSUNFKDB4MGQ1YywgMHhhMDAyKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwM19BQ0MpIH0sCiAJLyoKIAkgKiBhdDc2YzUwNS1yZm1kCiAJICovCiAJLyogR2VuZXJpYyBBVDc2QzUwNS9SRk1EICovCi0Je1VTQl9ERVZJQ0UoMHgwM2ViLCAweDc2MDYpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTA1KX0sCisJeyBVU0JfREVWSUNFKDB4MDNlYiwgMHg3NjA2KSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNSkgfSwKIAkvKgogCSAqIGF0NzZjNTA1LXJmbWQyOTU4CiAJICovCiAJLyogR2VuZXJpYyBBVDc2QzUwNS9SRk1ELCBPdmlzTGluayBXTC0xMTMwVVNCICovCi0Je1VTQl9ERVZJQ0UoMHgwM2ViLCAweDc2MTMpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTA1XzI5NTgpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwM2ViLCAweDc2MTMpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTA1XzI5NTgpIH0sCiAJLyogRmliZXJsaW5lIEZMLVdMMjQwVSAqLwotCXtVU0JfREVWSUNFKDB4MTM3MSwgMHgwMDE0KSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNV8yOTU4KX0sCisJeyBVU0JfREVWSUNFKDB4MTM3MSwgMHgwMDE0KSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNV8yOTU4KSB9LAogCS8qIENOZXQgQ05VU0ItNjExRyAqLwotCXtVU0JfREVWSUNFKDB4MTM3MSwgMHgwMDEzKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNV8yOTU4KX0sCisJeyBVU0JfREVWSUNFKDB4MTM3MSwgMHgwMDEzKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNV8yOTU4KSB9LAogCS8qIExpbmtzeXMgV1VTQjExIHYyLjggKi8KLQl7VVNCX0RFVklDRSgweDE5MTUsIDB4MjIzMyksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDVfMjk1OCl9LAorCXsgVVNCX0RFVklDRSgweDE5MTUsIDB4MjIzMyksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDVfMjk1OCkgfSwKIAkvKiBYdGVyYXN5cyBYTi0yMTIyQiwgSUJsaXR6eiBCV1U2MTNCL0JXVTYxM1NCICovCi0Je1VTQl9ERVZJQ0UoMHgxMmZkLCAweDEwMDEpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTA1XzI5NTgpfSwKKwl7IFVTQl9ERVZJQ0UoMHgxMmZkLCAweDEwMDEpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTA1XzI5NTgpIH0sCiAJLyogQ29yZWdhIFdMQU4gVVNCIFN0aWNrIDExICovCi0Je1VTQl9ERVZJQ0UoMHgwN2FhLCAweDc2MTMpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTA1XzI5NTgpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwN2FhLCAweDc2MTMpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTA1XzI5NTgpIH0sCiAJLyogTWljcm9zdGFyIE1TSSBCb3ggTVM2OTc4ICovCi0Je1VTQl9ERVZJQ0UoMHgwZGIwLCAweDEwMjApLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTA1XzI5NTgpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwZGIwLCAweDEwMjApLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTA1XzI5NTgpIH0sCiAJLyoKIAkgKiBhdDc2YzUwNWEtcmZtZDI5NTgKIAkgKi8KIAkvKiBHZW5lcmljIEFUNzZDNTA1QSBkZXZpY2UgKi8KLQl7VVNCX0RFVklDRSgweDAzZWIsIDB4NzYxNCksIFVTQl9ERVZJQ0VfREFUQShCT0FSRF81MDVBKX0sCisJeyBVU0JfREVWSUNFKDB4MDNlYiwgMHg3NjE0KSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNUEpIH0sCiAJLyogR2VuZXJpYyBBVDc2QzUwNUFTIGRldmljZSAqLwotCXtVU0JfREVWSUNFKDB4MDNlYiwgMHg3NjE3KSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNUEpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwM2ViLCAweDc2MTcpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTA1QSkgfSwKIAkvKiBTaWVtZW5zIEdpZ2FzZXQgVVNCIFdMQU4gQWRhcHRlciAxMSAqLwotCXtVU0JfREVWSUNFKDB4MTY5MCwgMHgwNzAxKSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNUEpfSwKKwl7IFVTQl9ERVZJQ0UoMHgxNjkwLCAweDA3MDEpLCBVU0JfREVWSUNFX0RBVEEoQk9BUkRfNTA1QSkgfSwKIAkvKgogCSAqIGF0NzZjNTA1YW14LXJmbWQKIAkgKi8KIAkvKiBHZW5lcmljIEFUNzZDNTA1QU1YIGRldmljZSAqLwotCXtVU0JfREVWSUNFKDB4MDNlYiwgMHg3NjE1KSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNUFNWCl9LAotCXt9CisJeyBVU0JfREVWSUNFKDB4MDNlYiwgMHg3NjE1KSwgVVNCX0RFVklDRV9EQVRBKEJPQVJEXzUwNUFNWCkgfSwKKwl7IH0KIH07CiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBkZXZfdGFibGUpOwpAQCAtMjQ0LDI2ICsyNjQsOCBAQAogLyogU3VwcG9ydGVkIHJhdGVzIG9mIHRoaXMgaGFyZHdhcmUsIGJpdCA3IG1hcmtzIGJhc2ljIHJhdGVzICovCiBzdGF0aWMgY29uc3QgdTggaHdfcmF0ZXNbXSA9IHsgMHg4MiwgMHg4NCwgMHgwYiwgMHgxNiB9OwogCi0vKiBGcmVxdWVuY3kgb2YgZWFjaCBjaGFubmVsIGluIE1IeiAqLwotc3RhdGljIGNvbnN0IGxvbmcgY2hhbm5lbF9mcmVxdWVuY3lbXSA9IHsKLQkyNDEyLCAyNDE3LCAyNDIyLCAyNDI3LCAyNDMyLCAyNDM3LCAyNDQyLAotCTI0NDcsIDI0NTIsIDI0NTcsIDI0NjIsIDI0NjcsIDI0NzIsIDI0ODQKLX07Ci0KLSNkZWZpbmUgTlVNX0NIQU5ORUxTIEFSUkFZX1NJWkUoY2hhbm5lbF9mcmVxdWVuY3kpCi0KIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBwcmVhbWJsZXNbXSA9IHsgImxvbmciLCAic2hvcnQiLCAiYXV0byIgfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1hY19zdGF0ZXNbXSA9IHsKLQlbTUFDX0lOSVRdID0gIklOSVQiLAotCVtNQUNfU0NBTk5JTkddID0gIlNDQU5OSU5HIiwKLQlbTUFDX0FVVEhdID0gIkFVVEgiLAotCVtNQUNfQVNTT0NdID0gIkFTU09DIiwKLQlbTUFDX0pPSU5JTkddID0gIkpPSU5JTkciLAotCVtNQUNfQ09OTkVDVEVEXSA9ICJDT05ORUNURUQiLAotCVtNQUNfT1dOX0lCU1NdID0gIk9XTl9JQlNTIgotfTsKLQogLyogRmlybXdhcmUgZG93bmxvYWQgKi8KIC8qIERGVSBzdGF0ZXMgKi8KICNkZWZpbmUgU1RBVEVfSURMRQkJCTB4MDAKQEAgLTI5OCwxNyArMzAwLDMwIEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IGF0NzZfaXNfaW50ZXJzaWwoZW51bSBib2FyZF90eXBlIGJvYXJkKQogewotCXJldHVybiAoYm9hcmQgPT0gQk9BUkRfNTAzX0lTTDM4NjEgfHwgYm9hcmQgPT0gQk9BUkRfNTAzX0lTTDM4NjMpOworCWlmIChib2FyZCA9PSBCT0FSRF81MDNfSVNMMzg2MSB8fCBib2FyZCA9PSBCT0FSRF81MDNfSVNMMzg2MykKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGF0NzZfaXNfNTAzcmZtZChlbnVtIGJvYXJkX3R5cGUgYm9hcmQpCiB7Ci0JcmV0dXJuIChib2FyZCA9PSBCT0FSRF81MDMgfHwgYm9hcmQgPT0gQk9BUkRfNTAzX0FDQyk7CisJaWYgKGJvYXJkID09IEJPQVJEXzUwMyB8fCBib2FyZCA9PSBCT0FSRF81MDNfQUNDKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXQ3Nl9pc181MDUoZW51bSBib2FyZF90eXBlIGJvYXJkKQoreworCWlmIChib2FyZCA9PSBCT0FSRF81MDUgfHwgYm9hcmQgPT0gQk9BUkRfNTA1XzI5NTgpCisJCXJldHVybiAxOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBhdDc2X2lzXzUwNWEoZW51bSBib2FyZF90eXBlIGJvYXJkKQogewotCXJldHVybiAoYm9hcmQgPT0gQk9BUkRfNTA1QSB8fCBib2FyZCA9PSBCT0FSRF81MDVBTVgpOworCWlmIChib2FyZCA9PSBCT0FSRF81MDVBIHx8IGJvYXJkID09IEJPQVJEXzUwNUFNWCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7CiB9CiAKIC8qIExvYWQgYSBibG9jayBvZiB0aGUgZmlyc3QgKGludGVybmFsKSBwYXJ0IG9mIHRoZSBmaXJtd2FyZSAqLwpAQCAtNDg5LDQxICs1MDQsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qIFJlcG9ydCB0aGF0IHRoZSBzY2FuIHJlc3VsdHMgYXJlIHJlYWR5ICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYXQ3Nl9pd2V2ZW50X3NjYW5fY29tcGxldGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKLXsKLQl1bmlvbiBpd3JlcV9kYXRhIHdycXU7Ci0Jd3JxdS5kYXRhLmxlbmd0aCA9IDA7Ci0Jd3JxdS5kYXRhLmZsYWdzID0gMDsKLQl3aXJlbGVzc19zZW5kX2V2ZW50KG5ldGRldiwgU0lPQ0dJV1NDQU4sICZ3cnF1LCBOVUxMKTsKLQlhdDc2X2RiZyhEQkdfV0VfRVZFTlRTLCAiJXM6IFNJT0NHSVdTQ0FOIHNlbnQiLCBuZXRkZXYtPm5hbWUpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYXQ3Nl9pd2V2ZW50X2Jzc19jb25uZWN0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJCSAgICB1OCAqYnNzaWQpCi17Ci0JdW5pb24gaXdyZXFfZGF0YSB3cnF1OwotCXdycXUuZGF0YS5sZW5ndGggPSAwOwotCXdycXUuZGF0YS5mbGFncyA9IDA7Ci0JbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBic3NpZCwgRVRIX0FMRU4pOwotCXdycXUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0Jd2lyZWxlc3Nfc2VuZF9ldmVudChuZXRkZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOwotCWF0NzZfZGJnKERCR19XRV9FVkVOVFMsICIlczogJXM6IFNJT0NHSVdBUCBzZW50IiwgbmV0ZGV2LT5uYW1lLAotCQkgX19mdW5jX18pOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYXQ3Nl9pd2V2ZW50X2Jzc19kaXNjb25uZWN0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCi17Ci0JdW5pb24gaXdyZXFfZGF0YSB3cnF1OwotCXdycXUuZGF0YS5sZW5ndGggPSAwOwotCXdycXUuZGF0YS5mbGFncyA9IDA7Ci0JbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBFVEhfQUxFTik7Ci0Jd3JxdS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKLQl3aXJlbGVzc19zZW5kX2V2ZW50KG5ldGRldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7Ci0JYXQ3Nl9kYmcoREJHX1dFX0VWRU5UUywgIiVzOiAlczogU0lPQ0dJV0FQIHNlbnQiLCBuZXRkZXYtPm5hbWUsCi0JCSBfX2Z1bmNfXyk7Ci19Ci0KICNkZWZpbmUgSEVYMlNUUl9CVUZGRVJTIDQKICNkZWZpbmUgSEVYMlNUUl9NQVhfTEVOIDY0CiAjZGVmaW5lIEJJTjJIRVgoeCkgKCh4KSA8IDEwID8gJzAnICsgKHgpIDogKHgpICsgJ0EnIC0gMTApCkBAIC01OTUsMzcgKzU3NSw2IEBACiAJCW1vZF90aW1lcigmbGVkdHJpZ190eF90aW1lciwgamlmZmllcyArIEhaIC8gNCk7CiB9CiAKLS8qIENoZWNrIGlmIHRoZSBnaXZlbiBzc2lkIGlzIGhpZGRlbiAqLwotc3RhdGljIGlubGluZSBpbnQgYXQ3Nl9pc19oaWRkZW5fc3NpZCh1OCAqc3NpZCwgaW50IGxlbmd0aCkKLXsKLQlzdGF0aWMgY29uc3QgdTggemVyb3NbMzJdOwotCi0JaWYgKGxlbmd0aCA9PSAwKQotCQlyZXR1cm4gMTsKLQotCWlmIChsZW5ndGggPT0gMSAmJiBzc2lkWzBdID09ICcgJykKLQkJcmV0dXJuIDE7Ci0KLQlyZXR1cm4gKG1lbWNtcChzc2lkLCB6ZXJvcywgbGVuZ3RoKSA9PSAwKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGF0NzZfZnJlZV9ic3NfbGlzdChzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2KQotewotCXN0cnVjdCBsaXN0X2hlYWQgKm5leHQsICpwdHI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5ic3NfbGlzdF9zcGlubG9jaywgZmxhZ3MpOwotCi0JcHJpdi0+Y3Vycl9ic3MgPSBOVUxMOwotCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJnByaXYtPmJzc19saXN0KSB7Ci0JCWxpc3RfZGVsKHB0cik7Ci0JCWtmcmVlKGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgYnNzX2luZm8sIGxpc3QpKTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5ic3NfbGlzdF9zcGlubG9jaywgZmxhZ3MpOwotfQotCiBzdGF0aWMgaW50IGF0NzZfcmVtYXAoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCiB7CiAJaW50IHJldDsKQEAgLTY0MSwxOCArNTkwLDI1IEBACiBzdGF0aWMgaW50IGF0NzZfZ2V0X29wX21vZGUoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCiB7CiAJaW50IHJldDsKLQl1OCBvcF9tb2RlOworCXU4IHNhdmVkOworCXU4ICpvcF9tb2RlOwogCisJb3BfbW9kZSA9IGttYWxsb2MoMSwgR0ZQX05PSU8pOworCWlmICghb3BfbW9kZSkKKwkJcmV0dXJuIC1FTk9NRU07CiAJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9yY3ZjdHJscGlwZSh1ZGV2LCAwKSwgMHgzMywKIAkJCSAgICAgIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9ESVJfSU4gfAogCQkJICAgICAgVVNCX1JFQ0lQX0lOVEVSRkFDRSwgMHgwMSwgMCwgJm9wX21vZGUsIDEsCiAJCQkgICAgICBVU0JfQ1RSTF9HRVRfVElNRU9VVCk7CisJc2F2ZWQgPSAqb3BfbW9kZTsKKwlrZnJlZShvcF9tb2RlKTsKKwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCWVsc2UgaWYgKHJldCA8IDEpCiAJCXJldHVybiAtRUlPOwogCWVsc2UKLQkJcmV0dXJuIG9wX21vZGU7CisJCXJldHVybiBzYXZlZDsKIH0KIAogLyogTG9hZCBhIGJsb2NrIG9mIHRoZSBzZWNvbmQgKCJleHRlcm5hbCIpIHBhcnQgb2YgdGhlIGZpcm13YXJlICovCkBAIC03MjAsNyArNjc2LDcgQEAKIAlrZnJlZShod2NmZyk7CiAJaWYgKHJldCA8IDApCiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbm5vdCBnZXQgSFcgQ29uZmlnIChlcnJvciAlZClcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7CisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNzI5LDE1ICs2ODUsMTUgQEAKIHsKIAlpbnQgaTsKIAlzdGF0aWMgc3RydWN0IHJlZ19kb21haW4gY29uc3QgZmRfdGFiW10gPSB7Ci0JCXsweDEwLCAiRkNDIChVU0EpIiwgMHg3ZmZ9LAkvKiBjaCAxLTExICovCi0JCXsweDIwLCAiSUMgKENhbmFkYSkiLCAweDdmZn0sCS8qIGNoIDEtMTEgKi8KLQkJezB4MzAsICJFVFNJIChtb3N0IG9mIEV1cm9wZSkiLCAweDFmZmZ9LAkvKiBjaCAxLTEzICovCi0JCXsweDMxLCAiU3BhaW4iLCAweDYwMH0sCS8qIGNoIDEwLTExICovCi0JCXsweDMyLCAiRnJhbmNlIiwgMHgxZTAwfSwJLyogY2ggMTAtMTMgKi8KLQkJezB4NDAsICJNS0sgKEphcGFuKSIsIDB4MjAwMH0sCS8qIGNoIDE0ICovCi0JCXsweDQxLCAiTUtLMSAoSmFwYW4pIiwgMHgzZmZmfSwJLyogY2ggMS0xNCAqLwotCQl7MHg1MCwgIklzcmFlbCIsIDB4M2ZjfSwJLyogY2ggMy05ICovCi0JCXsweDAwLCAiPHVua25vd24+IiwgMHhmZmZmZmZmZn0JLyogY2ggMS0zMiAqLworCQl7IDB4MTAsICJGQ0MgKFVTQSkiLCAweDdmZiB9LAkvKiBjaCAxLTExICovCisJCXsgMHgyMCwgIklDIChDYW5hZGEpIiwgMHg3ZmYgfSwJLyogY2ggMS0xMSAqLworCQl7IDB4MzAsICJFVFNJIChtb3N0IG9mIEV1cm9wZSkiLCAweDFmZmYgfSwJLyogY2ggMS0xMyAqLworCQl7IDB4MzEsICJTcGFpbiIsIDB4NjAwIH0sCS8qIGNoIDEwLTExICovCisJCXsgMHgzMiwgIkZyYW5jZSIsIDB4MWUwMCB9LAkvKiBjaCAxMC0xMyAqLworCQl7IDB4NDAsICJNS0sgKEphcGFuKSIsIDB4MjAwMCB9LAkvKiBjaCAxNCAqLworCQl7IDB4NDEsICJNS0sxIChKYXBhbikiLCAweDNmZmYgfSwJLyogY2ggMS0xNCAqLworCQl7IDB4NTAsICJJc3JhZWwiLCAweDNmYyB9LAkvKiBjaCAzLTkgKi8KKwkJeyAweDAwLCAiPHVua25vd24+IiwgMHhmZmZmZmZmZiB9CS8qIGNoIDEtMzIgKi8KIAl9OwogCiAJLyogTGFzdCBlbnRyeSBpcyBmYWxsYmFjayBmb3IgdW5rbm93biBkb21haW4gY29kZSAqLwpAQCAtNzY1LDIwICs3MjEsNDMgQEAKIC8qIFJldHVybiBwb3NpdGl2ZSBudW1iZXIgZm9yIHN0YXR1cywgbmVnYXRpdmUgZm9yIGFuIGVycm9yICovCiBzdGF0aWMgaW5saW5lIGludCBhdDc2X2dldF9jbWRfc3RhdHVzKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCB1OCBjbWQpCiB7Ci0JdTggc3RhdF9idWZbNDBdOworCXU4ICpzdGF0X2J1ZjsKIAlpbnQgcmV0OwogCisJc3RhdF9idWYgPSBrbWFsbG9jKDQwLCBHRlBfTk9JTyk7CisJaWYgKCFzdGF0X2J1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlyZXQgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3JjdmN0cmxwaXBlKHVkZXYsIDApLCAweDIyLAogCQkJICAgICAgVVNCX1RZUEVfVkVORE9SIHwgVVNCX0RJUl9JTiB8CiAJCQkgICAgICBVU0JfUkVDSVBfSU5URVJGQUNFLCBjbWQsIDAsIHN0YXRfYnVmLAogCQkJICAgICAgc2l6ZW9mKHN0YXRfYnVmKSwgVVNCX0NUUkxfR0VUX1RJTUVPVVQpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCWlmIChyZXQgPj0gMCkKKwkJcmV0ID0gc3RhdF9idWZbNV07CisJa2ZyZWUoc3RhdF9idWYpOwogCi0JcmV0dXJuIHN0YXRfYnVmWzVdOworCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgYXQ3Nl9zZXRfY2FyZF9jb21tYW5kKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBpbnQgY21kLCB2b2lkICpidWYsCisjZGVmaW5lIE1BS0VfQ01EX0NBU0UoYykgY2FzZSAoYyk6IHJldHVybiAjYworCitzdGF0aWMgY29uc3QgY2hhciAqYXQ3Nl9nZXRfY21kX3N0cmluZyh1OCBjbWRfc3RhdHVzKQoreworCXN3aXRjaCAoY21kX3N0YXR1cykgeworCQlNQUtFX0NNRF9DQVNFKENNRF9TRVRfTUlCKTsKKwkJTUFLRV9DTURfQ0FTRShDTURfR0VUX01JQik7CisJCU1BS0VfQ01EX0NBU0UoQ01EX1NDQU4pOworCQlNQUtFX0NNRF9DQVNFKENNRF9KT0lOKTsKKwkJTUFLRV9DTURfQ0FTRShDTURfU1RBUlRfSUJTUyk7CisJCU1BS0VfQ01EX0NBU0UoQ01EX1JBRElPX09OKTsKKwkJTUFLRV9DTURfQ0FTRShDTURfUkFESU9fT0ZGKTsKKwkJTUFLRV9DTURfQ0FTRShDTURfU1RBUlRVUCk7CisJfQorCisJcmV0dXJuICJVTktOT1dOIjsKK30KKworc3RhdGljIGludCBhdDc2X3NldF9jYXJkX2NvbW1hbmQoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHU4IGNtZCwgdm9pZCAqYnVmLAogCQkJCSBpbnQgYnVmX3NpemUpCiB7CiAJaW50IHJldDsKQEAgLTc5Myw2ICs3NzIsMTAgQEAKIAljbWRfYnVmLT5zaXplID0gY3B1X3RvX2xlMTYoYnVmX3NpemUpOwogCW1lbWNweShjbWRfYnVmLT5kYXRhLCBidWYsIGJ1Zl9zaXplKTsKIAorCWF0NzZfZGJnX2R1bXAoREJHX0NNRCwgY21kX2J1Ziwgc2l6ZW9mKHN0cnVjdCBhdDc2X2NvbW1hbmQpICsgYnVmX3NpemUsCisJCSAgICAgICJpc3N1aW5nIGNvbW1hbmQgJXMgKDB4JTAyeCkiLAorCQkgICAgICBhdDc2X2dldF9jbWRfc3RyaW5nKGNtZCksIGNtZCk7CisKIAlyZXQgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLCAweDBlLAogCQkJICAgICAgVVNCX1RZUEVfVkVORE9SIHwgVVNCX0RJUl9PVVQgfCBVU0JfUkVDSVBfREVWSUNFLAogCQkJICAgICAgMCwgMCwgY21kX2J1ZiwKQEAgLTgzMCwxMyArODEzLDEzIEBACiAJCXN0YXR1cyA9IGF0NzZfZ2V0X2NtZF9zdGF0dXMocHJpdi0+dWRldiwgY21kKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGF0NzZfZ2V0X2NtZF9zdGF0dXMgZmFpbGVkOiAlZFxuIiwKLQkJCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHN0YXR1cyk7CisJCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCBzdGF0dXMpOwogCQkJYnJlYWs7CiAJCX0KIAogCQlhdDc2X2RiZyhEQkdfV0FJVF9DT01QTEVURSwKIAkJCSAiJXM6IFdhaXRpbmcgb24gY21kICVkLCBzdGF0dXMgPSAlZCAoJXMpIiwKLQkJCSBwcml2LT5uZXRkZXYtPm5hbWUsIGNtZCwgc3RhdHVzLAorCQkJIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgY21kLCBzdGF0dXMsCiAJCQkgYXQ3Nl9nZXRfY21kX3N0YXR1c19zdHJpbmcoc3RhdHVzKSk7CiAKIAkJaWYgKHN0YXR1cyAhPSBDTURfU1RBVFVTX0lOX1BST0dSRVNTCkBAIC04NDcsNyArODMwLDcgQEAKIAkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKIAkJCXByaW50ayhLRVJOX0VSUgogCQkJICAgICAgICIlczogY29tcGxldGlvbiB0aW1lb3V0IGZvciBjb21tYW5kICVkXG4iLAotCQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgY21kKTsKKwkJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIGNtZCk7CiAJCQlzdGF0dXMgPSAtRVRJTUVET1VUOwogCQkJYnJlYWs7CiAJCX0KQEAgLTg3MCw3ICs4NTMsNyBAQAogCWlmIChyZXQgIT0gQ01EX1NUQVRVU19DT01QTEVURSkgewogCQlwcmludGsoS0VSTl9JTkZPCiAJCSAgICAgICAiJXM6IHNldF9taWI6IGF0NzZfd2FpdF9jb21wbGV0aW9uIGZhaWxlZCAiCi0JCSAgICAgICAid2l0aCAlZFxuIiwgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOworCQkgICAgICAgIndpdGggJWRcbiIsIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgcmV0KTsKIAkJcmV0ID0gLUVJTzsKIAl9CiAKQEAgLTg5MSw3ICs4NzQsNyBAQAogCXJldCA9IGF0NzZfc2V0X2NhcmRfY29tbWFuZChwcml2LT51ZGV2LCBjbWQsIE5VTEwsIDApOwogCWlmIChyZXQgPCAwKQogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhdDc2X3NldF9jYXJkX2NvbW1hbmQoJWQpIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIGNtZCwgcmV0KTsKKwkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgY21kLCByZXQpOwogCWVsc2UKIAkJcmV0ID0gMTsKIApAQCAtOTEyLDQ0ICs4OTUsNyBAQAogCXJldCA9IGF0NzZfc2V0X21pYihwcml2LCAmcHJpdi0+bWliX2J1Zik7CiAJaWYgKHJldCA8IDApCiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IHNldF9taWIgKHBtX21vZGUpIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKiBTZXQgdGhlIGFzc29jaWF0aW9uIGlkIGZvciBwb3dlciBzYXZlIG1vZGUgKi8KLXN0YXRpYyBpbnQgYXQ3Nl9zZXRfYXNzb2NpZChzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2LCB1MTYgaWQpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlwcml2LT5taWJfYnVmLnR5cGUgPSBNSUJfTUFDX01HTVQ7Ci0JcHJpdi0+bWliX2J1Zi5zaXplID0gMjsKLQlwcml2LT5taWJfYnVmLmluZGV4ID0gb2Zmc2V0b2Yoc3RydWN0IG1pYl9tYWNfbWdtdCwgc3RhdGlvbl9pZCk7Ci0JcHJpdi0+bWliX2J1Zi5kYXRhLndvcmQgPSBjcHVfdG9fbGUxNihpZCk7Ci0KLQlyZXQgPSBhdDc2X3NldF9taWIocHJpdiwgJnByaXYtPm1pYl9idWYpOwotCWlmIChyZXQgPCAwKQotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBzZXRfbWliIChhc3NvY2lkKSBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyogU2V0IHRoZSBsaXN0ZW4gaW50ZXJ2YWwgZm9yIHBvd2VyIHNhdmUgbW9kZSAqLwotc3RhdGljIGludCBhdDc2X3NldF9saXN0ZW5faW50ZXJ2YWwoc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwgdTE2IGludGVydmFsKQotewotCWludCByZXQgPSAwOwotCi0JcHJpdi0+bWliX2J1Zi50eXBlID0gTUlCX01BQzsKLQlwcml2LT5taWJfYnVmLnNpemUgPSAyOwotCXByaXYtPm1pYl9idWYuaW5kZXggPSBvZmZzZXRvZihzdHJ1Y3QgbWliX21hYywgbGlzdGVuX2ludGVydmFsKTsKLQlwcml2LT5taWJfYnVmLmRhdGEud29yZCA9IGNwdV90b19sZTE2KGludGVydmFsKTsKLQotCXJldCA9IGF0NzZfc2V0X21pYihwcml2LCAmcHJpdi0+bWliX2J1Zik7Ci0JaWYgKHJldCA8IDApCi0JCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgIiVzOiBzZXRfbWliIChsaXN0ZW5faW50ZXJ2YWwpIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7CisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtOTY2LDcgKzkxMiw3IEBACiAJcmV0ID0gYXQ3Nl9zZXRfbWliKHByaXYsICZwcml2LT5taWJfYnVmKTsKIAlpZiAocmV0IDwgMCkKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogc2V0X21pYiAocHJlYW1ibGUpIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7CisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtOTgzLDcgKzkyOSw3IEBACiAJcmV0ID0gYXQ3Nl9zZXRfbWliKHByaXYsICZwcml2LT5taWJfYnVmKTsKIAlpZiAocmV0IDwgMCkKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogc2V0X21pYiAoZnJhZyB0aHJlc2hvbGQpIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7CisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTAwMCw3ICs5NDYsNyBAQAogCXJldCA9IGF0NzZfc2V0X21pYihwcml2LCAmcHJpdi0+bWliX2J1Zik7CiAJaWYgKHJldCA8IDApCiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IHNldF9taWIgKHJ0cykgZmFpbGVkOiAlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgcmV0KTsKKwkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgcmV0KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xMDE3LDI0ICs5NjMsNDEgQEAKIAlyZXQgPSBhdDc2X3NldF9taWIocHJpdiwgJnByaXYtPm1pYl9idWYpOwogCWlmIChyZXQgPCAwKQogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBzZXRfbWliIChhdXRvcmF0ZSBmYWxsYmFjaykgZmFpbGVkOiAlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgcmV0KTsKKwkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgcmV0KTsKIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgYXQ3Nl9hZGRfbWFjX2FkZHJlc3Moc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwgdm9pZCAqYWRkcikKK3N0YXRpYyBpbnQgYXQ3Nl9zZXRfdGtpcF9ic3NpZChzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2LCBjb25zdCB2b2lkICphZGRyKQogewogCWludCByZXQgPSAwOwogCi0JcHJpdi0+bWliX2J1Zi50eXBlID0gTUlCX01BQ19BRERSOworCXByaXYtPm1pYl9idWYudHlwZSA9IE1JQl9NQUNfRU5DUllQVElPTjsKIAlwcml2LT5taWJfYnVmLnNpemUgPSBFVEhfQUxFTjsKLQlwcml2LT5taWJfYnVmLmluZGV4ID0gb2Zmc2V0b2Yoc3RydWN0IG1pYl9tYWNfYWRkciwgbWFjX2FkZHIpOworCXByaXYtPm1pYl9idWYuaW5kZXggPSBvZmZzZXRvZihzdHJ1Y3QgbWliX21hY19lbmNyeXB0aW9uLCB0a2lwX2Jzc2lkKTsKIAltZW1jcHkocHJpdi0+bWliX2J1Zi5kYXRhLmFkZHIsIGFkZHIsIEVUSF9BTEVOKTsKIAogCXJldCA9IGF0NzZfc2V0X21pYihwcml2LCAmcHJpdi0+bWliX2J1Zik7CiAJaWYgKHJldCA8IDApCi0JCXByaW50ayhLRVJOX0VSUiAiJXM6IHNldF9taWIgKE1BQ19BRERSLCBtYWNfYWRkcikgZmFpbGVkOiAlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgcmV0KTsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogc2V0X21pYiAoTUFDX0VOQ1JZUFRJT04sIHRraXBfYnNzaWQpIGZhaWxlZDogJWRcbiIsCisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF0NzZfcmVzZXRfcnNjKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYpCit7CisJaW50IHJldCA9IDA7CisKKwlwcml2LT5taWJfYnVmLnR5cGUgPSBNSUJfTUFDX0VOQ1JZUFRJT047CisJcHJpdi0+bWliX2J1Zi5zaXplID0gNCAqIDg7CisJcHJpdi0+bWliX2J1Zi5pbmRleCA9IG9mZnNldG9mKHN0cnVjdCBtaWJfbWFjX2VuY3J5cHRpb24sIGtleV9yc2MpOworCW1lbXNldChwcml2LT5taWJfYnVmLmRhdGEuZGF0YSwgMCAsIHByaXYtPm1pYl9idWYuc2l6ZSk7CisKKwlyZXQgPSBhdDc2X3NldF9taWIocHJpdiwgJnByaXYtPm1pYl9idWYpOworCWlmIChyZXQgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBzZXRfbWliIChNQUNfRU5DUllQVElPTiwga2V5X3JzYykgZmFpbGVkOiAlZFxuIiwKKwkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgcmV0KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xMDUzLDE2ICsxMDE2LDE2IEBACiAJCQkgICBzaXplb2Yoc3RydWN0IG1pYl9tYWNfYWRkcikpOwogCWlmIChyZXQgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGF0NzZfZ2V0X21pYiAoTUFDX0FERFIpIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7CisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlhdDc2X2RiZyhEQkdfTUlCLCAiJXM6IE1JQiBNQUNfQUREUjogbWFjX2FkZHIgJXMgcmVzIDB4JXggMHgleCIsCi0JCSBwcml2LT5uZXRkZXYtPm5hbWUsCisJCSB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksCiAJCSBtYWMyc3RyKG0tPm1hY19hZGRyKSwgbS0+cmVzWzBdLCBtLT5yZXNbMV0pOwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG0tPmdyb3VwX2FkZHIpOyBpKyspCiAJCWF0NzZfZGJnKERCR19NSUIsICIlczogTUlCIE1BQ19BRERSOiBncm91cCBhZGRyICVkOiAlcywgIgotCQkJICJzdGF0dXMgJWQiLCBwcml2LT5uZXRkZXYtPm5hbWUsIGksCisJCQkgInN0YXR1cyAlZCIsIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgaSwKIAkJCSBtYWMyc3RyKG0tPmdyb3VwX2FkZHJbaV0pLCBtLT5ncm91cF9hZGRyX3N0YXR1c1tpXSk7CiBleGl0OgogCWtmcmVlKG0pOwpAQCAtMTA4MiwxMyArMTA0NSwxMyBAQAogCQkJICAgc2l6ZW9mKHN0cnVjdCBtaWJfbWFjX3dlcCkpOwogCWlmIChyZXQgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGF0NzZfZ2V0X21pYiAoTUFDX1dFUCkgZmFpbGVkOiAlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgcmV0KTsKKwkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgcmV0KTsKIAkJZ290byBleGl0OwogCX0KIAogCWF0NzZfZGJnKERCR19NSUIsICIlczogTUlCIE1BQ19XRVA6IHByaXZfaW52b2tlZCAldSBkZWZfa2V5X2lkICV1ICIKIAkJICJrZXlfbGVuICV1IGV4Y2xfdW5lbmNyICV1IHdlcF9pY3ZfZXJyICV1IHdlcF9leGNsdWRlZCAldSAiCi0JCSAiZW5jcl9sZXZlbCAldSBrZXkgJWQiLCBwcml2LT5uZXRkZXYtPm5hbWUsCisJCSAiZW5jcl9sZXZlbCAldSBrZXkgJWQiLCB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksCiAJCSBtLT5wcml2YWN5X2ludm9rZWQsIG0tPndlcF9kZWZhdWx0X2tleV9pZCwKIAkJIG0tPndlcF9rZXlfbWFwcGluZ19sZW4sIG0tPmV4Y2x1ZGVfdW5lbmNyeXB0ZWQsCiAJCSBsZTMyX3RvX2NwdShtLT53ZXBfaWN2X2Vycm9yX2NvdW50KSwKQEAgLTExMDAsMTIgKzEwNjMsNTUgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBXRVBfS0VZUzsgaSsrKQogCQlhdDc2X2RiZyhEQkdfTUlCLCAiJXM6IE1JQiBNQUNfV0VQOiBrZXkgJWQ6ICVzIiwKLQkJCSBwcml2LT5uZXRkZXYtPm5hbWUsIGksCisJCQkgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCBpLAogCQkJIGhleDJzdHIobS0+d2VwX2RlZmF1bHRfa2V5dmFsdWVbaV0sIGtleV9sZW4pKTsKIGV4aXQ6CiAJa2ZyZWUobSk7CiB9CiAKK3N0YXRpYyB2b2lkIGF0NzZfZHVtcF9taWJfbWFjX2VuY3J5cHRpb24oc3RydWN0IGF0NzZfcHJpdiAqcHJpdikKK3sKKwlpbnQgaTsKKwlpbnQgcmV0OworCS8qaW50IGtleV9sZW47Ki8KKwlzdHJ1Y3QgbWliX21hY19lbmNyeXB0aW9uICptOworCisJbSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtaWJfbWFjX2VuY3J5cHRpb24pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW0pCisJCXJldHVybjsKKworCXJldCA9IGF0NzZfZ2V0X21pYihwcml2LT51ZGV2LCBNSUJfTUFDX0VOQ1JZUFRJT04sIG0sCisJCQkgICBzaXplb2Yoc3RydWN0IG1pYl9tYWNfZW5jcnlwdGlvbikpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnByaXYtPnVkZXYtPmRldiwKKwkJCSIlczogYXQ3Nl9nZXRfbWliIChNQUNfRU5DUllQVElPTikgZmFpbGVkOiAlZFxuIiwKKwkJCXdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgcmV0KTsKKwkJZ290byBleGl0OworCX0KKworCWF0NzZfZGJnKERCR19NSUIsCisJCSAiJXM6IE1JQiBNQUNfRU5DUllQVElPTjogdGtpcF9ic3NpZCAlcyBwcml2X2ludm9rZWQgJXUgIgorCQkgImNpcGhfa2V5X2lkICV1IGdycF9rZXlfaWQgJXUgZXhjbF91bmVuY3IgJXUgIgorCQkgImNraXBfa2V5X3Blcm0gJXUgd2VwX2ljdl9lcnIgJXUgd2VwX2V4Y2x1ZGVkICV1IiwKKwkJIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgbWFjMnN0cihtLT50a2lwX2Jzc2lkKSwKKwkJIG0tPnByaXZhY3lfaW52b2tlZCwgbS0+Y2lwaGVyX2RlZmF1bHRfa2V5X2lkLAorCQkgbS0+Y2lwaGVyX2RlZmF1bHRfZ3JvdXBfa2V5X2lkLCBtLT5leGNsdWRlX3VuZW5jcnlwdGVkLAorCQkgbS0+Y2tpcF9rZXlfcGVybXV0YXRpb24sCisJCSBsZTMyX3RvX2NwdShtLT53ZXBfaWN2X2Vycm9yX2NvdW50KSwKKwkJIGxlMzJfdG9fY3B1KG0tPndlcF9leGNsdWRlZF9jb3VudCkpOworCisJLyprZXlfbGVuID0gKG0tPmVuY3J5cHRpb25fbGV2ZWwgPT0gMSkgPworCSAgICBXRVBfU01BTExfS0VZX0xFTiA6IFdFUF9MQVJHRV9LRVlfTEVOOyovCisKKwlmb3IgKGkgPSAwOyBpIDwgQ0lQSEVSX0tFWVM7IGkrKykKKwkJYXQ3Nl9kYmcoREJHX01JQiwgIiVzOiBNSUIgTUFDX0VOQ1JZUFRJT046IGtleSAlZDogJXMiLAorCQkJIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgaSwKKwkJCSBoZXgyc3RyKG0tPmNpcGhlcl9kZWZhdWx0X2tleXZhbHVlW2ldLAorCQkJCSBDSVBIRVJfS0VZX0xFTikpOworZXhpdDoKKwlrZnJlZShtKTsKK30KKwogc3RhdGljIHZvaWQgYXQ3Nl9kdW1wX21pYl9tYWNfbWdtdChzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2KQogewogCWludCByZXQ7CkBAIC0xMTE5LDcgKzExMjUsNyBAQAogCQkJICAgc2l6ZW9mKHN0cnVjdCBtaWJfbWFjX21nbXQpKTsKIAlpZiAocmV0IDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhdDc2X2dldF9taWIgKE1BQ19NR01UKSBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOworCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCByZXQpOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC0xMTMwLDcgKzExMzYsNyBAQAogCQkgInBtX21vZGUgJWQgaWJzc19jaGFuZ2UgJWQgcmVzICVkICIKIAkJICJtdWx0aV9kb21haW5fY2FwYWJpbGl0eV9pbXBsZW1lbnRlZCAlZCAiCiAJCSAiaW50ZXJuYXRpb25hbF9yb2FtaW5nICVkIGNvdW50cnlfc3RyaW5nICUuM3MiLAotCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBsZTE2X3RvX2NwdShtLT5iZWFjb25fcGVyaW9kKSwKKwkJIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgbGUxNl90b19jcHUobS0+YmVhY29uX3BlcmlvZCksCiAJCSBsZTE2X3RvX2NwdShtLT5DRlBfbWF4X2R1cmF0aW9uKSwKIAkJIGxlMTZfdG9fY3B1KG0tPm1lZGl1bV9vY2N1cGFuY3lfbGltaXQpLAogCQkgbGUxNl90b19jcHUobS0+c3RhdGlvbl9pZCksIGxlMTZfdG9fY3B1KG0tPkFUSU1fd2luZG93KSwKQEAgLTExNTUsNyArMTE2MSw3IEBACiAJcmV0ID0gYXQ3Nl9nZXRfbWliKHByaXYtPnVkZXYsIE1JQl9NQUMsIG0sIHNpemVvZihzdHJ1Y3QgbWliX21hYykpOwogCWlmIChyZXQgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGF0NzZfZ2V0X21pYiAoTUFDKSBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOworCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCByZXQpOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC0xMTY1LDcgKzExNzEsOCBAQAogCQkgInNjYW5fdHlwZSAlZCBzY2FuX2NoYW5uZWwgJWQgcHJvYmVfZGVsYXkgJXUgIgogCQkgIm1pbl9jaGFubmVsX3RpbWUgJWQgbWF4X2NoYW5uZWxfdGltZSAlZCBsaXN0ZW5faW50ICVkICIKIAkJICJkZXNpcmVkX3NzaWQgJXMgZGVzaXJlZF9ic3NpZCAlcyBkZXNpcmVkX2Jzc3R5cGUgJWQiLAotCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBsZTMyX3RvX2NwdShtLT5tYXhfdHhfbXNkdV9saWZldGltZSksCisJCSB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksCisJCSBsZTMyX3RvX2NwdShtLT5tYXhfdHhfbXNkdV9saWZldGltZSksCiAJCSBsZTMyX3RvX2NwdShtLT5tYXhfcnhfbGlmZXRpbWUpLAogCQkgbGUxNl90b19jcHUobS0+ZnJhZ190aHJlc2hvbGQpLCBsZTE2X3RvX2NwdShtLT5ydHNfdGhyZXNob2xkKSwKIAkJIGxlMTZfdG9fY3B1KG0tPmN3bWluKSwgbGUxNl90b19jcHUobS0+Y3dtYXgpLApAQCAtMTE5MSw3ICsxMTk4LDcgQEAKIAlyZXQgPSBhdDc2X2dldF9taWIocHJpdi0+dWRldiwgTUlCX1BIWSwgbSwgc2l6ZW9mKHN0cnVjdCBtaWJfcGh5KSk7CiAJaWYgKHJldCA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogYXQ3Nl9nZXRfbWliIChQSFkpIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7CisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTEyMDAsNyArMTIwNyw3IEBACiAJCSAibXBkdV9tYXhfbGVuZ3RoICVkIGNjYV9tb2RlX3N1cHBvcnRlZCAlZCBvcGVyYXRpb25fcmF0ZV9zZXQgIgogCQkgIjB4JXggMHgleCAweCV4IDB4JXggY2hhbm5lbF9pZCAlZCBjdXJyZW50X2NjYV9tb2RlICVkICIKIAkJICJwaHlfdHlwZSAlZCBjdXJyZW50X3JlZ19kb21haW4gJWQiLAotCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBsZTMyX3RvX2NwdShtLT5lZF90aHJlc2hvbGQpLAorCQkgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCBsZTMyX3RvX2NwdShtLT5lZF90aHJlc2hvbGQpLAogCQkgbGUxNl90b19jcHUobS0+c2xvdF90aW1lKSwgbGUxNl90b19jcHUobS0+c2lmc190aW1lKSwKIAkJIGxlMTZfdG9fY3B1KG0tPnByZWFtYmxlX2xlbmd0aCksCiAJCSBsZTE2X3RvX2NwdShtLT5wbGNwX2hlYWRlcl9sZW5ndGgpLApAQCAtMTIyNCwxMyArMTIzMSwxNCBAQAogCXJldCA9IGF0NzZfZ2V0X21pYihwcml2LT51ZGV2LCBNSUJfTE9DQUwsIG0sIHNpemVvZihzdHJ1Y3QgbWliX2xvY2FsKSk7CiAJaWYgKHJldCA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogYXQ3Nl9nZXRfbWliIChMT0NBTCkgZmFpbGVkOiAlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgcmV0KTsKKwkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgcmV0KTsKIAkJZ290byBleGl0OwogCX0KIAogCWF0NzZfZGJnKERCR19NSUIsICIlczogTUlCIExPQ0FMOiBiZWFjb25fZW5hYmxlICVkICIKIAkJICJ0eGF1dG9yYXRlX2ZhbGxiYWNrICVkIHNzaWRfc2l6ZSAlZCBwcm9taXNjdW91c19tb2RlICVkICIKLQkJICJwcmVhbWJsZV90eXBlICVkIiwgcHJpdi0+bmV0ZGV2LT5uYW1lLCBtLT5iZWFjb25fZW5hYmxlLAorCQkgInByZWFtYmxlX3R5cGUgJWQiLCB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksCisJCSBtLT5iZWFjb25fZW5hYmxlLAogCQkgbS0+dHhhdXRvcmF0ZV9mYWxsYmFjaywgbS0+c3NpZF9zaXplLCBtLT5wcm9taXNjdW91c19tb2RlLAogCQkgbS0+cHJlYW1ibGVfdHlwZSk7CiBleGl0OgpAQCAtMTI0OSwxMTggKzEyNTcsMjEgQEAKIAkJCSAgIHNpemVvZihzdHJ1Y3QgbWliX21kb21haW4pKTsKIAlpZiAocmV0IDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhdDc2X2dldF9taWIgKE1ET01BSU4pIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7CisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHJldCk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlhdDc2X2RiZyhEQkdfTUlCLCAiJXM6IE1JQiBNRE9NQUlOOiBjaGFubmVsX2xpc3QgJXMiLAotCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLAorCQkgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLAogCQkgaGV4MnN0cihtLT5jaGFubmVsX2xpc3QsIHNpemVvZihtLT5jaGFubmVsX2xpc3QpKSk7CiAKIAlhdDc2X2RiZyhEQkdfTUlCLCAiJXM6IE1JQiBNRE9NQUlOOiB0eF9wb3dlcmxldmVsICVzIiwKLQkJIHByaXYtPm5ldGRldi0+bmFtZSwKKwkJIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwKIAkJIGhleDJzdHIobS0+dHhfcG93ZXJsZXZlbCwgc2l6ZW9mKG0tPnR4X3Bvd2VybGV2ZWwpKSk7CiBleGl0OgogCWtmcmVlKG0pOwogfQogCi1zdGF0aWMgaW50IGF0NzZfZ2V0X2N1cnJlbnRfYnNzaWQoc3RydWN0IGF0NzZfcHJpdiAqcHJpdikKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgbWliX21hY19tZ210ICptYWNfbWdtdCA9Ci0JICAgIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtaWJfbWFjX21nbXQpLCBHRlBfS0VSTkVMKTsKLQotCWlmICghbWFjX21nbXQpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBleGl0OwotCX0KLQotCXJldCA9IGF0NzZfZ2V0X21pYihwcml2LT51ZGV2LCBNSUJfTUFDX01HTVQsIG1hY19tZ210LAotCQkJICAgc2l6ZW9mKHN0cnVjdCBtaWJfbWFjX21nbXQpKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhdDc2X2dldF9taWIgZmFpbGVkOiAlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgcmV0KTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JbWVtY3B5KHByaXYtPmJzc2lkLCBtYWNfbWdtdC0+Y3VycmVudF9ic3NpZCwgRVRIX0FMRU4pOwotCXByaW50ayhLRVJOX0lORk8gIiVzOiB1c2luZyBCU1NJRCAlc1xuIiwgcHJpdi0+bmV0ZGV2LT5uYW1lLAotCSAgICAgICBtYWMyc3RyKHByaXYtPmJzc2lkKSk7Ci1lcnJvcjoKLQlrZnJlZShtYWNfbWdtdCk7Ci1leGl0OgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9nZXRfY3VycmVudF9jaGFubmVsKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IG1pYl9waHkgKnBoeSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtaWJfcGh5KSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIXBoeSkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGV4aXQ7Ci0JfQotCXJldCA9IGF0NzZfZ2V0X21pYihwcml2LT51ZGV2LCBNSUJfUEhZLCBwaHksIHNpemVvZihzdHJ1Y3QgbWliX3BoeSkpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGF0NzZfZ2V0X21pYihNSUJfUEhZKSBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOwotCQlnb3RvIGVycm9yOwotCX0KLQlwcml2LT5jaGFubmVsID0gcGh5LT5jaGFubmVsX2lkOwotZXJyb3I6Ci0Ja2ZyZWUocGh5KTsKLWV4aXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBhdDc2X3N0YXJ0X3NjYW4gLSBzdGFydCBhIHNjYW4KLSAqCi0gKiBAdXNlX2Vzc2lkIC0gdXNlIHRoZSBjb25maWd1cmVkIEVTU0lEIGluIG5vbiBwYXNzaXZlIG1vZGUKLSAqLwotc3RhdGljIGludCBhdDc2X3N0YXJ0X3NjYW4oc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwgaW50IHVzZV9lc3NpZCkKLXsKLQlzdHJ1Y3QgYXQ3Nl9yZXFfc2NhbiBzY2FuOwotCi0JbWVtc2V0KCZzY2FuLCAwLCBzaXplb2Yoc3RydWN0IGF0NzZfcmVxX3NjYW4pKTsKLQltZW1zZXQoc2Nhbi5ic3NpZCwgMHhmZiwgRVRIX0FMRU4pOwotCi0JaWYgKHVzZV9lc3NpZCkgewotCQltZW1jcHkoc2Nhbi5lc3NpZCwgcHJpdi0+ZXNzaWQsIElXX0VTU0lEX01BWF9TSVpFKTsKLQkJc2Nhbi5lc3NpZF9zaXplID0gcHJpdi0+ZXNzaWRfc2l6ZTsKLQl9IGVsc2UKLQkJc2Nhbi5lc3NpZF9zaXplID0gMDsKLQotCS8qIGphbDogd2h5IHNob3VsZCB3ZSBzdGFydCBhdCBhIGNlcnRhaW4gY2hhbm5lbD8gd2UgZG8gc2NhbiB0aGUgd2hvbGUKLQkgICByYW5nZSBhbGxvd2VkIGJ5IHJlZyBkb21haW4uICovCi0Jc2Nhbi5jaGFubmVsID0gcHJpdi0+Y2hhbm5lbDsKLQotCS8qIGF0bWVsd2xhbmRyaXZlciBkaWZmZXJzIGJldHdlZW4gc2NhbiB0eXBlIDAgYW5kIDEgKGFjdGl2ZS9wYXNzaXZlKQotCSAgIEZvciBhZC1ob2MgbW9kZSwgaXQgdXNlcyB0eXBlIDAgb25seS4gKi8KLQlzY2FuLnNjYW5fdHlwZSA9IHByaXYtPnNjYW5fbW9kZTsKLQotCS8qIElORk86IEZvciBwcm9iZV9kZWxheSwgbm90IG11bHRpcGx5aW5nIGJ5IDEwMjQgYXMgdGhpcyB3aWxsIGJlCi0JICAgc2xpZ2h0bHkgbGVzcyB0aGFuIG1pbl9jaGFubmVsX3RpbWUKLQkgICAocGVyIHNwZWM6IHByb2JlIGRlbGF5IDwgbWluLiBjaGFubmVsIHRpbWUpICovCi0Jc2Nhbi5taW5fY2hhbm5lbF90aW1lID0gY3B1X3RvX2xlMTYocHJpdi0+c2Nhbl9taW5fdGltZSk7Ci0Jc2Nhbi5tYXhfY2hhbm5lbF90aW1lID0gY3B1X3RvX2xlMTYocHJpdi0+c2Nhbl9tYXhfdGltZSk7Ci0Jc2Nhbi5wcm9iZV9kZWxheSA9IGNwdV90b19sZTE2KHByaXYtPnNjYW5fbWluX3RpbWUgKiAxMDAwKTsKLQlzY2FuLmludGVybmF0aW9uYWxfc2NhbiA9IDA7Ci0KLQkvKiBvdGhlciB2YWx1ZXMgYXJlIHNldCB0byAwIGZvciB0eXBlIDAgKi8KLQotCWF0NzZfZGJnKERCR19QUk9HUkVTUywgIiVzOiBzdGFydF9zY2FuICh1c2VfZXNzaWQgPSAlZCwgaW50bCA9ICVkLCAiCi0JCSAiY2hhbm5lbCA9ICVkLCBwcm9iZV9kZWxheSA9ICVkLCBzY2FuX21pbl90aW1lID0gJWQsICIKLQkJICJzY2FuX21heF90aW1lID0gJWQpIiwKLQkJIHByaXYtPm5ldGRldi0+bmFtZSwgdXNlX2Vzc2lkLAotCQkgc2Nhbi5pbnRlcm5hdGlvbmFsX3NjYW4sIHNjYW4uY2hhbm5lbCwKLQkJIGxlMTZfdG9fY3B1KHNjYW4ucHJvYmVfZGVsYXkpLAotCQkgbGUxNl90b19jcHUoc2Nhbi5taW5fY2hhbm5lbF90aW1lKSwKLQkJIGxlMTZfdG9fY3B1KHNjYW4ubWF4X2NoYW5uZWxfdGltZSkpOwotCi0JcmV0dXJuIGF0NzZfc2V0X2NhcmRfY29tbWFuZChwcml2LT51ZGV2LCBDTURfU0NBTiwgJnNjYW4sIHNpemVvZihzY2FuKSk7Ci19Ci0KIC8qIEVuYWJsZSBtb25pdG9yIG1vZGUgKi8KIHN0YXRpYyBpbnQgYXQ3Nl9zdGFydF9tb25pdG9yKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYpCiB7CkBAIC0xMzgxLDg2ICsxMjkyLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGF0NzZfc3RhcnRfaWJzcyhzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2KQotewotCXN0cnVjdCBhdDc2X3JlcV9pYnNzIGJzczsKLQlpbnQgcmV0OwotCi0JV0FSTl9PTihwcml2LT5tYWNfc3RhdGUgIT0gTUFDX09XTl9JQlNTKTsKLQlpZiAocHJpdi0+bWFjX3N0YXRlICE9IE1BQ19PV05fSUJTUykKLQkJcmV0dXJuIC1FQlVTWTsKLQotCW1lbXNldCgmYnNzLCAwLCBzaXplb2Yoc3RydWN0IGF0NzZfcmVxX2lic3MpKTsKLQltZW1zZXQoYnNzLmJzc2lkLCAweGZmLCBFVEhfQUxFTik7Ci0JbWVtY3B5KGJzcy5lc3NpZCwgcHJpdi0+ZXNzaWQsIElXX0VTU0lEX01BWF9TSVpFKTsKLQlic3MuZXNzaWRfc2l6ZSA9IHByaXYtPmVzc2lkX3NpemU7Ci0JYnNzLmJzc190eXBlID0gQURIT0NfTU9ERTsKLQlic3MuY2hhbm5lbCA9IHByaXYtPmNoYW5uZWw7Ci0KLQlyZXQgPSBhdDc2X3NldF9jYXJkX2NvbW1hbmQocHJpdi0+dWRldiwgQ01EX1NUQVJUX0lCU1MsICZic3MsCi0JCQkJICAgIHNpemVvZihzdHJ1Y3QgYXQ3Nl9yZXFfaWJzcykpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IHN0YXJ0X2lic3MgZmFpbGVkOiAlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXQgPSBhdDc2X3dhaXRfY29tcGxldGlvbihwcml2LCBDTURfU1RBUlRfSUJTUyk7Ci0JaWYgKHJldCAhPSBDTURfU1RBVFVTX0NPTVBMRVRFKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IHN0YXJ0X2lic3MgZmFpbGVkIHRvIGNvbXBsZXRlLCAlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXQgPSBhdDc2X2dldF9jdXJyZW50X2Jzc2lkKHByaXYpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gYXQ3Nl9nZXRfY3VycmVudF9jaGFubmVsKHByaXYpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JLyogbm90IHN1cmUgd2hhdCB0aGlzIGlzIGdvb2QgZm9yID8/PyAqLwotCXByaXYtPm1pYl9idWYudHlwZSA9IE1JQl9NQUNfTUdNVDsKLQlwcml2LT5taWJfYnVmLnNpemUgPSAxOwotCXByaXYtPm1pYl9idWYuaW5kZXggPSBvZmZzZXRvZihzdHJ1Y3QgbWliX21hY19tZ210LCBpYnNzX2NoYW5nZSk7Ci0JcHJpdi0+bWliX2J1Zi5kYXRhLmJ5dGUgPSAwOwotCi0JcmV0ID0gYXQ3Nl9zZXRfbWliKHByaXYsICZwcml2LT5taWJfYnVmKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBzZXRfbWliIChpYnNzIGNoYW5nZSBvaykgZmFpbGVkOiAlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQluZXRpZl9jYXJyaWVyX29uKHByaXYtPm5ldGRldik7Ci0JbmV0aWZfc3RhcnRfcXVldWUocHJpdi0+bmV0ZGV2KTsKLQlyZXR1cm4gMDsKLX0KLQotLyogUmVxdWVzdCBjYXJkIHRvIGpvaW4gQlNTIGluIG1hbmFnZWQgb3IgYWQtaG9jIG1vZGUgKi8KLXN0YXRpYyBpbnQgYXQ3Nl9qb2luX2JzcyhzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2LCBzdHJ1Y3QgYnNzX2luZm8gKnB0cikKLXsKLQlzdHJ1Y3QgYXQ3Nl9yZXFfam9pbiBqb2luOwotCi0JQlVHX09OKCFwdHIpOwotCi0JbWVtc2V0KCZqb2luLCAwLCBzaXplb2Yoc3RydWN0IGF0NzZfcmVxX2pvaW4pKTsKLQltZW1jcHkoam9pbi5ic3NpZCwgcHRyLT5ic3NpZCwgRVRIX0FMRU4pOwotCW1lbWNweShqb2luLmVzc2lkLCBwdHItPnNzaWQsIHB0ci0+c3NpZF9sZW4pOwotCWpvaW4uZXNzaWRfc2l6ZSA9IHB0ci0+c3NpZF9sZW47Ci0Jam9pbi5ic3NfdHlwZSA9IChwcml2LT5pd19tb2RlID09IElXX01PREVfQURIT0MgPyAxIDogMik7Ci0Jam9pbi5jaGFubmVsID0gcHRyLT5jaGFubmVsOwotCWpvaW4udGltZW91dCA9IGNwdV90b19sZTE2KDIwMDApOwotCi0JYXQ3Nl9kYmcoREJHX1BST0dSRVNTLAotCQkgIiVzIGpvaW4gYWRkciAlcyBzc2lkICVzIHR5cGUgJWQgY2ggJWQgdGltZW91dCAlZCIsCi0JCSBwcml2LT5uZXRkZXYtPm5hbWUsIG1hYzJzdHIoam9pbi5ic3NpZCksIGpvaW4uZXNzaWQsCi0JCSBqb2luLmJzc190eXBlLCBqb2luLmNoYW5uZWwsIGxlMTZfdG9fY3B1KGpvaW4udGltZW91dCkpOwotCXJldHVybiBhdDc2X3NldF9jYXJkX2NvbW1hbmQocHJpdi0+dWRldiwgQ01EX0pPSU4sICZqb2luLAotCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBhdDc2X3JlcV9qb2luKSk7Ci19Ci0KIC8qIENhbGN1bGF0ZSBwYWRkaW5nIGZyb20gdHhidWYtPndsZW5ndGggKHdoaWNoIGV4Y2x1ZGVzIHRoZSBVU0IgVFggaGVhZGVyKSwKICAgIGxpa2VseSB0byBjb21wZW5zYXRlIGEgZmxhdyBpbiB0aGUgQVQ3NkM1MDNBIFVTQiBwYXJ0IC4uLiAqLwogc3RhdGljIGlubGluZSBpbnQgYXQ3Nl9jYWxjX3BhZGRpbmcoaW50IHdsZW4pCkBAIC0xNDc5LDE0ICsxMzEwLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogV2UgYXJlIGRvaW5nIGEgbG90IG9mIHRoaW5ncyBoZXJlIGluIGFuIGludGVycnVwdC4gTmVlZAotICAgYSBiaCBoYW5kbGVyIChXYXRjaGluZyBUViB3aXRoIGEgVFYgY2FyZCBpcyBwcm9iYWJseQotICAgYSBnb29kIHRlc3Q6IGlmIHlvdSBzZWUgZmxpY2tlcnMsIHdlIGFyZSBkb2luZyB0b28gbXVjaC4KLSAgIEN1cnJlbnRseSBJIGRvIHNlZSBmbGlja2Vycy4uLiBldmVuIHdpdGggb3VyIHRhc2tsZXQgOi0oICkKLSAgIE1heWJlIGJlY2F1c2UgdGhlIGJ0dHYgZHJpdmVyIGFuZCB1c2ItdWhjaSB1c2UgdGhlIHNhbWUgaW50ZXJydXB0Ci0qLwotLyogT3IgbWF5YmUgYmVjYXVzZSBvdXIgQkggaGFuZGxlciBpcyBwcmVlbXB0aW5nIGJ0dHYncyBCSCBoYW5kbGVyLi4gQkhzIGRvbid0Ci0gKiBzb2x2ZSBldmVyeXRoaW5nLi4gKGFsZXgpICovCiBzdGF0aWMgdm9pZCBhdDc2X3J4X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKIAlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gdXJiLT5jb250ZXh0OwpAQCAtMTQ5NiwxNzU4ICsxMzE5LDYgQEAKIAlyZXR1cm47CiB9CiAKLXN0YXRpYyB2b2lkIGF0NzZfdHhfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSB1cmItPmNvbnRleHQ7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJnByaXYtPnN0YXRzOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGF0NzZfdHhfYnVmZmVyICptZ210X2J1ZjsKLQlpbnQgcmV0OwotCi0Jc3dpdGNoICh1cmItPnN0YXR1cykgewotCWNhc2UgMDoKLQkJc3RhdHMtPnR4X3BhY2tldHMrKzsKLQkJYnJlYWs7Ci0JY2FzZSAtRU5PRU5UOgotCWNhc2UgLUVDT05OUkVTRVQ6Ci0JCS8qIHVyYiBoYXMgYmVlbiB1bmxpbmtlZCAqLwotCQlyZXR1cm47Ci0JZGVmYXVsdDoKLQkJYXQ3Nl9kYmcoREJHX1VSQiwgIiVzIC0gbm9uemVybyB0eCBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJCSBfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOwotCQlzdGF0cy0+dHhfZXJyb3JzKys7Ci0JCWJyZWFrOwotCX0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5tZ210X3NwaW5sb2NrLCBmbGFncyk7Ci0JbWdtdF9idWYgPSBwcml2LT5uZXh0X21nbXRfYnVsazsKLQlwcml2LT5uZXh0X21nbXRfYnVsayA9IE5VTEw7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bWdtdF9zcGlubG9jaywgZmxhZ3MpOwotCi0JaWYgKCFtZ210X2J1ZikgewotCQluZXRpZl93YWtlX3F1ZXVlKHByaXYtPm5ldGRldik7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiB3ZSBkb24ndCBjb3B5IHRoZSBwYWRkaW5nIGJ5dGVzLCBidXQgYWRkIHRoZW0KLQkgICB0byB0aGUgbGVuZ3RoICovCi0JbWVtY3B5KHByaXYtPmJ1bGtfb3V0X2J1ZmZlciwgbWdtdF9idWYsCi0JICAgICAgIGxlMTZfdG9fY3B1KG1nbXRfYnVmLT53bGVuZ3RoKSArIEFUNzZfVFhfSERSTEVOKTsKLQl1c2JfZmlsbF9idWxrX3VyYihwcml2LT50eF91cmIsIHByaXYtPnVkZXYsIHByaXYtPnR4X3BpcGUsCi0JCQkgIHByaXYtPmJ1bGtfb3V0X2J1ZmZlciwKLQkJCSAgbGUxNl90b19jcHUobWdtdF9idWYtPndsZW5ndGgpICsgbWdtdF9idWYtPnBhZGRpbmcgKwotCQkJICBBVDc2X1RYX0hEUkxFTiwgYXQ3Nl90eF9jYWxsYmFjaywgcHJpdik7Ci0JcmV0ID0gdXNiX3N1Ym1pdF91cmIocHJpdi0+dHhfdXJiLCBHRlBfQVRPTUlDKTsKLQlpZiAocmV0KQotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvciBpbiB0eCBzdWJtaXQgdXJiOiAlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgcmV0KTsKLQotCWtmcmVlKG1nbXRfYnVmKTsKLX0KLQotLyogU2VuZCBhIG1hbmFnZW1lbnQgZnJhbWUgb24gYnVsay1vdXQuICB0eGJ1Zi0+d2xlbmd0aCBtdXN0IGJlIHNldCAqLwotc3RhdGljIGludCBhdDc2X3R4X21nbXQoc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwgc3RydWN0IGF0NzZfdHhfYnVmZmVyICp0eGJ1ZikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXQ7Ci0JaW50IHVyYl9zdGF0dXM7Ci0Jdm9pZCAqb2xkYnVmID0gTlVMTDsKLQotCW5ldGlmX2NhcnJpZXJfb2ZmKHByaXYtPm5ldGRldik7CS8qIHN0b3AgbmV0ZGV2IHdhdGNoZG9nICovCi0JbmV0aWZfc3RvcF9xdWV1ZShwcml2LT5uZXRkZXYpOwkvKiBzdG9wIHR4IGRhdGEgcGFja2V0cyAqLwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPm1nbXRfc3BpbmxvY2ssIGZsYWdzKTsKLQotCXVyYl9zdGF0dXMgPSBwcml2LT50eF91cmItPnN0YXR1czsKLQlpZiAodXJiX3N0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIHsKLQkJLyogY2Fubm90IHRyYW5zbWl0IG5vdywgcHV0IGluIHRoZSBxdWV1ZSAqLwotCQlvbGRidWYgPSBwcml2LT5uZXh0X21nbXRfYnVsazsKLQkJcHJpdi0+bmV4dF9tZ210X2J1bGsgPSB0eGJ1ZjsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bWdtdF9zcGlubG9jaywgZmxhZ3MpOwotCi0JaWYgKG9sZGJ1ZikgewotCQkvKiBhIGRhdGEvbWdtdCB0eCBpcyBhbHJlYWR5IHBlbmRpbmcgaW4gdGhlIFVSQiAtCi0JCSAgIGlmIHRoaXMgaXMgbm8gZXJyb3IgaW4gc29tZSBzaXR1YXRpb25zIHdlIG11c3QKLQkJICAgaW1wbGVtZW50IGEgcXVldWUgb3Igc2lsZW50bHkgbW9kaWZ5IHRoZSBvbGQgbXNnICovCi0JCXByaW50ayhLRVJOX0VSUiAiJXM6IHJlbW92ZWQgcGVuZGluZyBtZ210IGJ1ZmZlciAlc1xuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgaGV4MnN0cihvbGRidWYsIDY0KSk7Ci0JCWtmcmVlKG9sZGJ1Zik7Ci0JCXJldHVybiAwOwotCX0KLQotCXR4YnVmLT50eF9yYXRlID0gVFhfUkFURV8xTUJJVDsKLQl0eGJ1Zi0+cGFkZGluZyA9IGF0NzZfY2FsY19wYWRkaW5nKGxlMTZfdG9fY3B1KHR4YnVmLT53bGVuZ3RoKSk7Ci0JbWVtc2V0KHR4YnVmLT5yZXNlcnZlZCwgMCwgc2l6ZW9mKHR4YnVmLT5yZXNlcnZlZCkpOwotCi0JaWYgKHByaXYtPm5leHRfbWdtdF9idWxrKQotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVUkIgc3RhdHVzICVkLCBidXQgbWdtdCBpcyBwZW5kaW5nXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCB1cmJfc3RhdHVzKTsKLQotCWF0NzZfZGJnKERCR19UWF9NR01ULAotCQkgIiVzOiB0eCBtZ210OiB3bGVuICVkIHR4X3JhdGUgJWQgcGFkICVkICVzIiwKLQkJIHByaXYtPm5ldGRldi0+bmFtZSwgbGUxNl90b19jcHUodHhidWYtPndsZW5ndGgpLAotCQkgdHhidWYtPnR4X3JhdGUsIHR4YnVmLT5wYWRkaW5nLAotCQkgaGV4MnN0cih0eGJ1Zi0+cGFja2V0LCBsZTE2X3RvX2NwdSh0eGJ1Zi0+d2xlbmd0aCkpKTsKLQotCS8qIHR4YnVmIHdhcyBub3QgY29uc3VtZWQgYWJvdmUgLT4gc2VuZCBtZ210IG1zZyBpbW1lZGlhdGVseSAqLwotCW1lbWNweShwcml2LT5idWxrX291dF9idWZmZXIsIHR4YnVmLAotCSAgICAgICBsZTE2X3RvX2NwdSh0eGJ1Zi0+d2xlbmd0aCkgKyBBVDc2X1RYX0hEUkxFTik7Ci0JdXNiX2ZpbGxfYnVsa191cmIocHJpdi0+dHhfdXJiLCBwcml2LT51ZGV2LCBwcml2LT50eF9waXBlLAotCQkJICBwcml2LT5idWxrX291dF9idWZmZXIsCi0JCQkgIGxlMTZfdG9fY3B1KHR4YnVmLT53bGVuZ3RoKSArIHR4YnVmLT5wYWRkaW5nICsKLQkJCSAgQVQ3Nl9UWF9IRFJMRU4sIGF0NzZfdHhfY2FsbGJhY2ssIHByaXYpOwotCXJldCA9IHVzYl9zdWJtaXRfdXJiKHByaXYtPnR4X3VyYiwgR0ZQX0FUT01JQyk7Ci0JaWYgKHJldCkKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3IgaW4gdHggc3VibWl0IHVyYjogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7Ci0KLQlrZnJlZSh0eGJ1Zik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKiBHbyB0byB0aGUgbmV4dCBpbmZvcm1hdGlvbiBlbGVtZW50ICovCi1zdGF0aWMgaW5saW5lIHZvaWQgbmV4dF9pZShzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCAqKmllKQotewotCSppZSA9IChzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCAqKSgmKCppZSktPmRhdGFbKCppZSktPmxlbl0pOwotfQotCi0vKiBDaGFsbGVuZ2UgaXMgdGhlIGNoYWxsZW5nZSBzdHJpbmcgKGluIFRMViBmb3JtYXQpCi0gICB3ZSBnb3Qgd2l0aCBzZXFfbnIgMiBmb3Igc2hhcmVkIHNlY3JldCBhdXRoZW50aWNhdGlvbiBvbmx5IGFuZAotICAgc2VuZCBpbiBzZXFfbnIgMyBXRVAgZW5jcnlwdGVkIHRvIHByb3ZlIHdlIGhhdmUgdGhlIGNvcnJlY3QgV0VQIGtleTsKLSAgIG90aGVyd2lzZSBpdCBpcyBOVUxMICovCi1zdGF0aWMgaW50IGF0NzZfYXV0aF9yZXEoc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwgc3RydWN0IGJzc19pbmZvICpic3MsCi0JCQkgaW50IHNlcV9uciwgc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgKmNoYWxsZW5nZSkKLXsKLQlzdHJ1Y3QgYXQ3Nl90eF9idWZmZXIgKnR4X2J1ZmZlcjsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqbWdtdDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2F1dGggKnJlcTsKLQlpbnQgYnVmX2xlbiA9IChzZXFfbnIgIT0gMyA/IEFVVEhfRlJBTUVfU0laRSA6Ci0JCSAgICAgICBBVVRIX0ZSQU1FX1NJWkUgKyAxICsgMSArIGNoYWxsZW5nZS0+bGVuKTsKLQotCUJVR19PTighYnNzKTsKLQlCVUdfT04oc2VxX25yID09IDMgJiYgIWNoYWxsZW5nZSk7Ci0JdHhfYnVmZmVyID0ga21hbGxvYyhidWZfbGVuICsgTUFYX1BBRERJTkdfU0laRSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCF0eF9idWZmZXIpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmVxID0gKHN0cnVjdCBpZWVlODAyMTFfYXV0aCAqKXR4X2J1ZmZlci0+cGFja2V0OwotCW1nbXQgPSAmcmVxLT5oZWFkZXI7Ci0KLQkvKiBtYWtlIHdpcmVsZXNzIGhlYWRlciAqLwotCS8qIGZpcnN0IGF1dGggbXNnIGlzIG5vdCBlbmNyeXB0ZWQsIG9ubHkgdGhlIHNlY29uZCAoc2VxX25yID09IDMpICovCi0JbWdtdC0+ZnJhbWVfY3RsID0KLQkgICAgY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX01HTVQgfCBJRUVFODAyMTFfU1RZUEVfQVVUSCB8Ci0JCQkoc2VxX25yID09IDMgPyBJRUVFODAyMTFfRkNUTF9QUk9URUNURUQgOiAwKSk7Ci0KLQltZ210LT5kdXJhdGlvbl9pZCA9IGNwdV90b19sZTE2KDB4ODAwMCk7Ci0JbWVtY3B5KG1nbXQtPmFkZHIxLCBic3MtPmJzc2lkLCBFVEhfQUxFTik7Ci0JbWVtY3B5KG1nbXQtPmFkZHIyLCBwcml2LT5uZXRkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7Ci0JbWVtY3B5KG1nbXQtPmFkZHIzLCBic3MtPmJzc2lkLCBFVEhfQUxFTik7Ci0JbWdtdC0+c2VxX2N0bCA9IGNwdV90b19sZTE2KDApOwotCi0JcmVxLT5hbGdvcml0aG0gPSBjcHVfdG9fbGUxNihwcml2LT5hdXRoX21vZGUpOwotCXJlcS0+dHJhbnNhY3Rpb24gPSBjcHVfdG9fbGUxNihzZXFfbnIpOwotCXJlcS0+c3RhdHVzID0gY3B1X3RvX2xlMTYoMCk7Ci0KLQlpZiAoc2VxX25yID09IDMpCi0JCW1lbWNweShyZXEtPmluZm9fZWxlbWVudCwgY2hhbGxlbmdlLCAxICsgMSArIGNoYWxsZW5nZS0+bGVuKTsKLQotCS8qIGluaXQuIGF0NzZfcHJpdiB0eCBoZWFkZXIgKi8KLQl0eF9idWZmZXItPndsZW5ndGggPSBjcHVfdG9fbGUxNihidWZfbGVuIC0gQVQ3Nl9UWF9IRFJMRU4pOwotCWF0NzZfZGJnKERCR19UWF9NR01ULCAiJXM6IEF1dGhSZXEgYnNzaWQgJXMgYWxnICVkIHNlcV9uciAlZCIsCi0JCSBwcml2LT5uZXRkZXYtPm5hbWUsIG1hYzJzdHIobWdtdC0+YWRkcjMpLAotCQkgbGUxNl90b19jcHUocmVxLT5hbGdvcml0aG0pLCBsZTE2X3RvX2NwdShyZXEtPnRyYW5zYWN0aW9uKSk7Ci0JaWYgKHNlcV9uciA9PSAzKQotCQlhdDc2X2RiZyhEQkdfVFhfTUdNVCwgIiVzOiBBdXRoUmVxIGNoYWxsZW5nZTogJXMgLi4uIiwKLQkJCSBwcml2LT5uZXRkZXYtPm5hbWUsIGhleDJzdHIocmVxLT5pbmZvX2VsZW1lbnQsIDE4KSk7Ci0KLQkvKiBlaXRoZXIgc2VuZCBpbW1lZGlhdGVseSAoaWYgbm8gZGF0YSB0eCBpcyBwZW5kaW5nCi0JICAgb3IgcHV0IGl0IGluIHBlbmRpbmcgbGlzdCAqLwotCXJldHVybiBhdDc2X3R4X21nbXQocHJpdiwgdHhfYnVmZmVyKTsKLX0KLQotc3RhdGljIGludCBhdDc2X2Fzc29jX3JlcShzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2LCBzdHJ1Y3QgYnNzX2luZm8gKmJzcykKLXsKLQlzdHJ1Y3QgYXQ3Nl90eF9idWZmZXIgKnR4X2J1ZmZlcjsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqbWdtdDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3JlcXVlc3QgKnJlcTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCAqaWU7Ci0JY2hhciAqZXNzaWQ7Ci0JaW50IGVzc2lkX2xlbjsKLQl1MTYgY2FwYTsKLQotCUJVR19PTighYnNzKTsKLQotCXR4X2J1ZmZlciA9IGttYWxsb2MoQVNTT0NSRVFfTUFYX1NJWkUgKyBNQVhfUEFERElOR19TSVpFLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXR4X2J1ZmZlcikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlyZXEgPSAoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0ICopdHhfYnVmZmVyLT5wYWNrZXQ7Ci0JbWdtdCA9ICZyZXEtPmhlYWRlcjsKLQlpZSA9IHJlcS0+aW5mb19lbGVtZW50OwotCi0JLyogbWFrZSB3aXJlbGVzcyBoZWFkZXIgKi8KLQltZ210LT5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8Ci0JCQkJICAgICAgSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFUSk7Ci0KLQltZ210LT5kdXJhdGlvbl9pZCA9IGNwdV90b19sZTE2KDB4ODAwMCk7Ci0JbWVtY3B5KG1nbXQtPmFkZHIxLCBic3MtPmJzc2lkLCBFVEhfQUxFTik7Ci0JbWVtY3B5KG1nbXQtPmFkZHIyLCBwcml2LT5uZXRkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7Ci0JbWVtY3B5KG1nbXQtPmFkZHIzLCBic3MtPmJzc2lkLCBFVEhfQUxFTik7Ci0JbWdtdC0+c2VxX2N0bCA9IGNwdV90b19sZTE2KDApOwotCi0JLyogd2UgbXVzdCBzZXQgdGhlIFByaXZhY3kgYml0IGluIHRoZSBjYXBhYmlsaXRpZXMgdG8gYXNzdXJlIGFuCi0JICAgQWdlcmUtYmFzZWQgQVAgd2l0aCBvcHRpb25hbCBXRVAgdHJhbnNtaXRzIGVuY3J5cHRlZCBmcmFtZXMKLQkgICB0byB1cy4gIEFQIG9ubHkgc2V0IHRoZSBQcml2YWN5IGJpdCBpbiB0aGVpciBjYXBhYmlsaXRpZXMKLQkgICBpZiBXRVAgaXMgbWFuZGF0b3J5IGluIHRoZSBCU1MhICovCi0JY2FwYSA9IGJzcy0+Y2FwYTsKLQlpZiAocHJpdi0+d2VwX2VuYWJsZWQpCi0JCWNhcGEgfD0gV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1k7Ci0JaWYgKHByaXYtPnByZWFtYmxlX3R5cGUgIT0gUFJFQU1CTEVfVFlQRV9MT05HKQotCQljYXBhIHw9IFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRTsKLQlyZXEtPmNhcGFiaWxpdHkgPSBjcHVfdG9fbGUxNihjYXBhKTsKLQotCXJlcS0+bGlzdGVuX2ludGVydmFsID0gY3B1X3RvX2xlMTYoMiAqIGJzcy0+YmVhY29uX2ludGVydmFsKTsKLQotCS8qIHdyaXRlIFRMViBkYXRhIGVsZW1lbnRzICovCi0KLQlpZS0+aWQgPSBNRklFX1RZUEVfU1NJRDsKLQlpZS0+bGVuID0gYnNzLT5zc2lkX2xlbjsKLQltZW1jcHkoaWUtPmRhdGEsIGJzcy0+c3NpZCwgYnNzLT5zc2lkX2xlbik7Ci0JbmV4dF9pZSgmaWUpOwotCi0JaWUtPmlkID0gTUZJRV9UWVBFX1JBVEVTOwotCWllLT5sZW4gPSBzaXplb2YoaHdfcmF0ZXMpOwotCW1lbWNweShpZS0+ZGF0YSwgaHdfcmF0ZXMsIHNpemVvZihod19yYXRlcykpOwotCW5leHRfaWUoJmllKTsJCS8qIGllIHBvaW50cyBiZWhpbmQgdGhlIHN1cHBfcmF0ZXMgZmllbGQgKi8KLQotCS8qIGluaXQuIGF0NzZfcHJpdiB0eCBoZWFkZXIgKi8KLQl0eF9idWZmZXItPndsZW5ndGggPSBjcHVfdG9fbGUxNigodTggKilpZSAtICh1OCAqKW1nbXQpOwotCi0JaWUgPSByZXEtPmluZm9fZWxlbWVudDsKLQllc3NpZCA9IGllLT5kYXRhOwotCWVzc2lkX2xlbiA9IG1pbl90KGludCwgSVdfRVNTSURfTUFYX1NJWkUsIGllLT5sZW4pOwotCi0JbmV4dF9pZSgmaWUpOwkJLyogcG9pbnRzIHRvIElFIG9mIHJhdGVzIG5vdyAqLwotCWF0NzZfZGJnKERCR19UWF9NR01ULAotCQkgIiVzOiBBc3NvY1JlcSBic3NpZCAlcyBjYXBhIDB4JTA0eCBzc2lkICUuKnMgcmF0ZXMgJXMiLAotCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBtYWMyc3RyKG1nbXQtPmFkZHIzKSwKLQkJIGxlMTZfdG9fY3B1KHJlcS0+Y2FwYWJpbGl0eSksIGVzc2lkX2xlbiwgZXNzaWQsCi0JCSBoZXgyc3RyKGllLT5kYXRhLCBpZS0+bGVuKSk7Ci0KLQkvKiBlaXRoZXIgc2VuZCBpbW1lZGlhdGVseSAoaWYgbm8gZGF0YSB0eCBpcyBwZW5kaW5nCi0JICAgb3IgcHV0IGl0IGluIHBlbmRpbmcgbGlzdCAqLwotCXJldHVybiBhdDc2X3R4X21nbXQocHJpdiwgdHhfYnVmZmVyKTsKLX0KLQotLyogV2UgZ290IHRvIGNoZWNrIHRoZSBic3NfbGlzdCBmb3Igb2xkIGVudHJpZXMgKi8KLXN0YXRpYyB2b2lkIGF0NzZfYnNzX2xpc3RfdGltZW91dCh1bnNpZ25lZCBsb25nIHBhcikKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gKHN0cnVjdCBhdDc2X3ByaXYgKilwYXI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpscHRyLCAqbnB0cjsKLQlzdHJ1Y3QgYnNzX2luZm8gKnB0cjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5ic3NfbGlzdF9zcGlubG9jaywgZmxhZ3MpOwotCi0JbGlzdF9mb3JfZWFjaF9zYWZlKGxwdHIsIG5wdHIsICZwcml2LT5ic3NfbGlzdCkgewotCi0JCXB0ciA9IGxpc3RfZW50cnkobHB0ciwgc3RydWN0IGJzc19pbmZvLCBsaXN0KTsKLQotCQlpZiAocHRyICE9IHByaXYtPmN1cnJfYnNzCi0JCSAgICAmJiB0aW1lX2FmdGVyKGppZmZpZXMsIHB0ci0+bGFzdF9yeCArIEJTU19MSVNUX1RJTUVPVVQpKSB7Ci0JCQlhdDc2X2RiZyhEQkdfQlNTX1RBQkxFX1JNLAotCQkJCSAiJXM6IGJzc19saXN0OiByZW1vdmluZyBvbGQgQlNTICVzIGNoICVkIiwKLQkJCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBtYWMyc3RyKHB0ci0+YnNzaWQpLAotCQkJCSBwdHItPmNoYW5uZWwpOwotCQkJbGlzdF9kZWwoJnB0ci0+bGlzdCk7Ci0JCQlrZnJlZShwdHIpOwotCQl9Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmJzc19saXN0X3NwaW5sb2NrLCBmbGFncyk7Ci0JLyogcmVzdGFydCB0aGUgdGltZXIgKi8KLQltb2RfdGltZXIoJnByaXYtPmJzc19saXN0X3RpbWVyLCBqaWZmaWVzICsgQlNTX0xJU1RfVElNRU9VVCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhdDc2X3NldF9tYWNfc3RhdGUoc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwKLQkJCQkgICAgICBlbnVtIG1hY19zdGF0ZSBtYWNfc3RhdGUpCi17Ci0JYXQ3Nl9kYmcoREJHX01BQ19TVEFURSwgIiVzIHN0YXRlOiAlcyIsIHByaXYtPm5ldGRldi0+bmFtZSwKLQkJIG1hY19zdGF0ZXNbbWFjX3N0YXRlXSk7Ci0JcHJpdi0+bWFjX3N0YXRlID0gbWFjX3N0YXRlOwotfQotCi1zdGF0aWMgdm9pZCBhdDc2X2R1bXBfYnNzX3RhYmxlKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGJzc19pbmZvICpwdHI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpscHRyOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmJzc19saXN0X3NwaW5sb2NrLCBmbGFncyk7Ci0KLQlhdDc2X2RiZyhEQkdfQlNTX1RBQkxFLCAiJXMgQlNTIHRhYmxlIChjdXJyPSVwKToiLCBwcml2LT5uZXRkZXYtPm5hbWUsCi0JCSBwcml2LT5jdXJyX2Jzcyk7Ci0KLQlsaXN0X2Zvcl9lYWNoKGxwdHIsICZwcml2LT5ic3NfbGlzdCkgewotCQlwdHIgPSBsaXN0X2VudHJ5KGxwdHIsIHN0cnVjdCBic3NfaW5mbywgbGlzdCk7Ci0JCWF0NzZfZGJnKERCR19CU1NfVEFCTEUsICIweCVwOiBic3NpZCAlcyBjaGFubmVsICVkIHNzaWQgJS4qcyAiCi0JCQkgIiglcykgY2FwYSAweCUwNHggcmF0ZXMgJXMgcnNzaSAlZCBsaW5rICVkIG5vaXNlICVkIiwKLQkJCSBwdHIsIG1hYzJzdHIocHRyLT5ic3NpZCksIHB0ci0+Y2hhbm5lbCwgcHRyLT5zc2lkX2xlbiwKLQkJCSBwdHItPnNzaWQsIGhleDJzdHIocHRyLT5zc2lkLCBwdHItPnNzaWRfbGVuKSwKLQkJCSBwdHItPmNhcGEsIGhleDJzdHIocHRyLT5yYXRlcywgcHRyLT5yYXRlc19sZW4pLAotCQkJIHB0ci0+cnNzaSwgcHRyLT5saW5rX3F1YWwsIHB0ci0+bm9pc2VfbGV2ZWwpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5ic3NfbGlzdF9zcGlubG9jaywgZmxhZ3MpOwotfQotCi0vKiBDYWxsZWQgdXBvbiBzdWNjZXNzZnVsIGFzc29jaWF0aW9uIHRvIG1hcmsgaW50ZXJmYWNlIGFzIGNvbm5lY3RlZCAqLwotc3RhdGljIHZvaWQgYXQ3Nl93b3JrX2Fzc29jX2RvbmUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0NzZfcHJpdiwKLQkJCQkJICAgICAgd29ya19hc3NvY19kb25lKTsKLQotCW11dGV4X2xvY2soJnByaXYtPm10eCk7Ci0KLQlXQVJOX09OKHByaXYtPm1hY19zdGF0ZSAhPSBNQUNfQVNTT0MpOwotCVdBUk5fT04oIXByaXYtPmN1cnJfYnNzKTsKLQlpZiAocHJpdi0+bWFjX3N0YXRlICE9IE1BQ19BU1NPQyB8fCAhcHJpdi0+Y3Vycl9ic3MpCi0JCWdvdG8gZXhpdDsKLQotCWlmIChwcml2LT5pd19tb2RlID09IElXX01PREVfSU5GUkEpIHsKLQkJaWYgKHByaXYtPnBtX21vZGUgIT0gQVQ3Nl9QTV9PRkYpIHsKLQkJCS8qIGNhbGN1bGF0ZSB0aGUgbGlzdGVuIGludGVydmFsIGluIHVuaXRzIG9mCi0JCQkgICBiZWFjb24gaW50ZXJ2YWxzIG9mIHRoZSBjdXJyX2JzcyAqLwotCQkJdTMyIHBtX3BlcmlvZF9iZWFjb24gPSAocHJpdi0+cG1fcGVyaW9kID4+IDEwKSAvCi0JCQkgICAgcHJpdi0+Y3Vycl9ic3MtPmJlYWNvbl9pbnRlcnZhbDsKLQotCQkJcG1fcGVyaW9kX2JlYWNvbiA9IG1heChwbV9wZXJpb2RfYmVhY29uLCAydSk7Ci0JCQlwbV9wZXJpb2RfYmVhY29uID0gbWluKHBtX3BlcmlvZF9iZWFjb24sIDB4ZmZmZnUpOwotCi0JCQlhdDc2X2RiZyhEQkdfUE0sCi0JCQkJICIlczogcG1fbW9kZSAlZCBhc3NvYyBpZCAweCV4IGxpc3RlbiBpbnQgJWQiLAotCQkJCSBwcml2LT5uZXRkZXYtPm5hbWUsIHByaXYtPnBtX21vZGUsCi0JCQkJIHByaXYtPmFzc29jX2lkLCBwbV9wZXJpb2RfYmVhY29uKTsKLQotCQkJYXQ3Nl9zZXRfYXNzb2NpZChwcml2LCBwcml2LT5hc3NvY19pZCk7Ci0JCQlhdDc2X3NldF9saXN0ZW5faW50ZXJ2YWwocHJpdiwgKHUxNilwbV9wZXJpb2RfYmVhY29uKTsKLQkJfQotCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX2JlYWNvbiwgQkVBQ09OX1RJTUVPVVQpOwotCX0KLQlhdDc2X3NldF9wbV9tb2RlKHByaXYpOwotCi0JbmV0aWZfY2Fycmllcl9vbihwcml2LT5uZXRkZXYpOwotCW5ldGlmX3dha2VfcXVldWUocHJpdi0+bmV0ZGV2KTsKLQlhdDc2X3NldF9tYWNfc3RhdGUocHJpdiwgTUFDX0NPTk5FQ1RFRCk7Ci0JYXQ3Nl9pd2V2ZW50X2Jzc19jb25uZWN0KHByaXYtPm5ldGRldiwgcHJpdi0+Y3Vycl9ic3MtPmJzc2lkKTsKLQlhdDc2X2RiZyhEQkdfUFJPR1JFU1MsICIlczogY29ubmVjdGVkIHRvIEJTU0lEICVzIiwKLQkJIHByaXYtPm5ldGRldi0+bmFtZSwgbWFjMnN0cihwcml2LT5jdXJyX2Jzcy0+YnNzaWQpKTsKLQotZXhpdDoKLQltdXRleF91bmxvY2soJnByaXYtPm10eCk7Ci19Ci0KLS8qIFdlIG9ubHkgc3RvcmUgdGhlIG5ldyBtYWMgYWRkcmVzcyBpbiBuZXRkZXYgc3RydWN0LAotICAgaXQgZ2V0cyBzZXQgd2hlbiB0aGUgbmV0ZGV2IGlzIG9wZW5lZC4gKi8KLXN0YXRpYyBpbnQgYXQ3Nl9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdm9pZCAqYWRkcikKLXsKLQlzdHJ1Y3Qgc29ja2FkZHIgKm1hYyA9IGFkZHI7Ci0JbWVtY3B5KG5ldGRldi0+ZGV2X2FkZHIsIG1hYy0+c2FfZGF0YSwgRVRIX0FMRU4pOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmF0NzZfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JcmV0dXJuICZwcml2LT5zdGF0czsKLX0KLQotc3RhdGljIHN0cnVjdCBpd19zdGF0aXN0aWNzICphdDc2X2dldF93aXJlbGVzc19zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiUkVUVVJOIHF1YWwgJWQgbGV2ZWwgJWQgbm9pc2UgJWQgdXBkYXRlZCAlZCIsCi0JCSBwcml2LT53c3RhdHMucXVhbC5xdWFsLCBwcml2LT53c3RhdHMucXVhbC5sZXZlbCwKLQkJIHByaXYtPndzdGF0cy5xdWFsLm5vaXNlLCBwcml2LT53c3RhdHMucXVhbC51cGRhdGVkKTsKLQotCXJldHVybiAmcHJpdi0+d3N0YXRzOwotfQotCi1zdGF0aWMgdm9pZCBhdDc2X3NldF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgcHJvbWlzYzsKLQotCXByb21pc2MgPSAoKG5ldGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgIT0gMCk7Ci0JaWYgKHByb21pc2MgIT0gcHJpdi0+cHJvbWlzYykgewotCQkvKiBUaGlzIGdldHMgY2FsbGVkIGluIGludGVycnVwdCwgbXVzdCByZXNjaGVkdWxlICovCi0JCXByaXYtPnByb21pc2MgPSBwcm9taXNjOwotCQlzY2hlZHVsZV93b3JrKCZwcml2LT53b3JrX3NldF9wcm9taXNjKTsKLQl9Ci19Ci0KLS8qIFN0b3AgYWxsIG5ldHdvcmsgYWN0aXZpdHksIGZsdXNoIGFsbCBwZW5kaW5nIHRhc2tzICovCi1zdGF0aWMgdm9pZCBhdDc2X3F1aWVzY2Uoc3RydWN0IGF0NzZfcHJpdiAqcHJpdikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbmV0aWZfc3RvcF9xdWV1ZShwcml2LT5uZXRkZXYpOwotCW5ldGlmX2NhcnJpZXJfb2ZmKHByaXYtPm5ldGRldik7Ci0KLQlhdDc2X3NldF9tYWNfc3RhdGUocHJpdiwgTUFDX0lOSVQpOwotCi0JY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfZ2V0X3NjYW4pOwotCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX2JlYWNvbik7Ci0JY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfYXV0aCk7Ci0JY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfYXNzb2MpOwotCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX3Jlc3RhcnQpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPm1nbXRfc3BpbmxvY2ssIGZsYWdzKTsKLQlrZnJlZShwcml2LT5uZXh0X21nbXRfYnVsayk7Ci0JcHJpdi0+bmV4dF9tZ210X2J1bGsgPSBOVUxMOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPm1nbXRfc3BpbmxvY2ssIGZsYWdzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGF0NzZfcHJpdiBpbXBsZW1lbnRhdGlvbnMgb2YgaXdfaGFuZGxlciBmdW5jdGlvbnM6Ci0gKi8KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX2NvbW1pdChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgIHZvaWQgKm51bGwsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXMgJXM6IHJlc3RhcnRpbmcgdGhlIGRldmljZSIsIG5ldGRldi0+bmFtZSwKLQkJIF9fZnVuY19fKTsKLQotCWlmIChwcml2LT5tYWNfc3RhdGUgIT0gTUFDX0lOSVQpCi0JCWF0NzZfcXVpZXNjZShwcml2KTsKLQotCS8qIFdhaXQgaGFsZiBzZWNvbmQgYmVmb3JlIHRoZSByZXN0YXJ0IHRvIHByb2Nlc3Mgc3Vic2VxdWVudAotCSAqIHJlcXVlc3RzIGZyb20gdGhlIHNhbWUgaXdjb25maWcgaW4gYSBzaW5nbGUgcmVzdGFydCAqLwotCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfcmVzdGFydCwgSFogLyAyKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfaGFuZGxlcl9nZXRfbmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgICBjaGFyICpuYW1lLCBjaGFyICpleHRyYSkKLXsKLQlzdHJjcHkobmFtZSwgIklFRUUgODAyLjExYiIpOwotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DR0lXTkFNRSAtIG5hbWUgJXMiLCBuZXRkZXYtPm5hbWUsIG5hbWUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfaGFuZGxlcl9zZXRfZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgICBzdHJ1Y3QgaXdfZnJlcSAqZnJlcSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JaW50IGNoYW4gPSAtMTsKLQlpbnQgcmV0ID0gLUVJV0NPTU1JVDsKLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogU0lPQ1NJV0ZSRVEgLSBmcmVxLm0gJWQgZnJlcS5lICVkIiwKLQkJIG5ldGRldi0+bmFtZSwgZnJlcS0+bSwgZnJlcS0+ZSk7Ci0KLQlpZiAoKGZyZXEtPmUgPT0gMCkgJiYgKGZyZXEtPm0gPD0gMTAwMCkpCi0JCS8qIFNldHRpbmcgYnkgY2hhbm5lbCBudW1iZXIgKi8KLQkJY2hhbiA9IGZyZXEtPm07Ci0JZWxzZSB7Ci0JCS8qIFNldHRpbmcgYnkgZnJlcXVlbmN5IC0gc2VhcmNoIHRoZSB0YWJsZSAqLwotCQlpbnQgbXVsdCA9IDE7Ci0JCWludCBpOwotCi0JCWZvciAoaSA9IDA7IGkgPCAoNiAtIGZyZXEtPmUpOyBpKyspCi0JCQltdWx0ICo9IDEwOwotCi0JCWZvciAoaSA9IDA7IGkgPCBOVU1fQ0hBTk5FTFM7IGkrKykgewotCQkJaWYgKGZyZXEtPm0gPT0gKGNoYW5uZWxfZnJlcXVlbmN5W2ldICogbXVsdCkpCi0JCQkJY2hhbiA9IGkgKyAxOwotCQl9Ci0JfQotCi0JaWYgKGNoYW4gPCAxIHx8ICFwcml2LT5kb21haW4pCi0JCS8qIG5vbi1wb3NpdGl2ZSBjaGFubmVscyBhcmUgaW52YWxpZAotCQkgKiB3ZSBuZWVkIGEgZG9tYWluIGluZm8gdG8gc2V0IHRoZSBjaGFubmVsCi0JCSAqIGVpdGhlciB0aGF0IG9yIGFuIGludmFsaWQgZnJlcXVlbmN5IHdhcwotCQkgKiBwcm92aWRlZCBieSB0aGUgdXNlciAqLwotCQlyZXQgPSAtRUlOVkFMOwotCWVsc2UgaWYgKCEocHJpdi0+ZG9tYWluLT5jaGFubmVsX21hcCAmICgxIDw8IChjaGFuIC0gMSkpKSkgewotCQlwcmludGsoS0VSTl9JTkZPICIlczogY2hhbm5lbCAlZCBub3QgYWxsb3dlZCBmb3IgZG9tYWluICVzXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCBjaGFuLCBwcml2LT5kb21haW4tPm5hbWUpOwotCQlyZXQgPSAtRUlOVkFMOwotCX0KLQotCWlmIChyZXQgPT0gLUVJV0NPTU1JVCkgewotCQlwcml2LT5jaGFubmVsID0gY2hhbjsKLQkJYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NTSVdGUkVRIC0gY2ggJWQiLCBuZXRkZXYtPm5hbWUsCi0JCQkgY2hhbik7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfZ2V0X2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgc3RydWN0IGl3X2ZyZXEgKmZyZXEsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCi0JZnJlcS0+bSA9IHByaXYtPmNoYW5uZWw7Ci0JZnJlcS0+ZSA9IDA7Ci0KLQlpZiAocHJpdi0+Y2hhbm5lbCkKLQkJYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NHSVdGUkVRIC0gZnJlcSAlbGQgeCAxMGUlZCIsCi0JCQkgbmV0ZGV2LT5uYW1lLCBjaGFubmVsX2ZyZXF1ZW5jeVtwcml2LT5jaGFubmVsIC0gMV0sIDYpOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NHSVdGUkVRIC0gY2ggJWQiLCBuZXRkZXYtPm5hbWUsCi0JCSBwcml2LT5jaGFubmVsKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfaGFuZGxlcl9zZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgICBfX3UzMiAqbW9kZSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0KLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogU0lPQ1NJV01PREUgLSAlZCIsIG5ldGRldi0+bmFtZSwgKm1vZGUpOwotCi0JaWYgKCgqbW9kZSAhPSBJV19NT0RFX0FESE9DKSAmJiAoKm1vZGUgIT0gSVdfTU9ERV9JTkZSQSkgJiYKLQkgICAgKCptb2RlICE9IElXX01PREVfTU9OSVRPUikpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcHJpdi0+aXdfbW9kZSA9ICptb2RlOwotCWlmIChwcml2LT5pd19tb2RlICE9IElXX01PREVfSU5GUkEpCi0JCXByaXYtPnBtX21vZGUgPSBBVDc2X1BNX09GRjsKLQotCXJldHVybiAtRUlXQ09NTUlUOwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfaGFuZGxlcl9nZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgICBfX3UzMiAqbW9kZSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0KLQkqbW9kZSA9IHByaXYtPml3X21vZGU7Ci0KLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogU0lPQ0dJV01PREUgLSAlZCIsIG5ldGRldi0+bmFtZSwgKm1vZGUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX2dldF9yYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCi17Ci0JLyogaW5zcGlyZWQgYnkgYXRtZWwuYyAqLwotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXN0cnVjdCBpd19yYW5nZSAqcmFuZ2UgPSAoc3RydWN0IGl3X3JhbmdlICopZXh0cmE7Ci0JaW50IGk7Ci0KLQlkYXRhLT5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKTsKLQltZW1zZXQocmFuZ2UsIDAsIHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpKTsKLQotCS8qIFRPRE86IHJhbmdlLT50aHJvdWdocHV0ID0geHh4eHh4OyAqLwotCi0JcmFuZ2UtPm1pbl9ud2lkID0gMHgwMDAwOwotCXJhbmdlLT5tYXhfbndpZCA9IDB4MDAwMDsKLQotCS8qIHRoaXMgZHJpdmVyIGRvZXNuJ3QgbWFpbnRhaW4gc2Vuc2l0aXZpdHkgaW5mb3JtYXRpb24gKi8KLQlyYW5nZS0+c2Vuc2l0aXZpdHkgPSAwOwotCi0JcmFuZ2UtPm1heF9xdWFsLnF1YWwgPSAxMDA7Ci0JcmFuZ2UtPm1heF9xdWFsLmxldmVsID0gMTAwOwotCXJhbmdlLT5tYXhfcXVhbC5ub2lzZSA9IDA7Ci0JcmFuZ2UtPm1heF9xdWFsLnVwZGF0ZWQgPSBJV19RVUFMX05PSVNFX0lOVkFMSUQ7Ci0KLQlyYW5nZS0+YXZnX3F1YWwucXVhbCA9IDUwOwotCXJhbmdlLT5hdmdfcXVhbC5sZXZlbCA9IDUwOwotCXJhbmdlLT5hdmdfcXVhbC5ub2lzZSA9IDA7Ci0JcmFuZ2UtPmF2Z19xdWFsLnVwZGF0ZWQgPSBJV19RVUFMX05PSVNFX0lOVkFMSUQ7Ci0KLQlyYW5nZS0+Yml0cmF0ZVswXSA9IDEwMDAwMDA7Ci0JcmFuZ2UtPmJpdHJhdGVbMV0gPSAyMDAwMDAwOwotCXJhbmdlLT5iaXRyYXRlWzJdID0gNTUwMDAwMDsKLQlyYW5nZS0+Yml0cmF0ZVszXSA9IDExMDAwMDAwOwotCXJhbmdlLT5udW1fYml0cmF0ZXMgPSA0OwotCi0JcmFuZ2UtPm1pbl9ydHMgPSAwOwotCXJhbmdlLT5tYXhfcnRzID0gTUFYX1JUU19USFJFU0hPTEQ7Ci0KLQlyYW5nZS0+bWluX2ZyYWcgPSBNSU5fRlJBR19USFJFU0hPTEQ7Ci0JcmFuZ2UtPm1heF9mcmFnID0gTUFYX0ZSQUdfVEhSRVNIT0xEOwotCi0JcmFuZ2UtPnBtcF9mbGFncyA9IElXX1BPV0VSX1BFUklPRDsKLQlyYW5nZS0+cG10X2ZsYWdzID0gSVdfUE9XRVJfT047Ci0JcmFuZ2UtPnBtX2NhcGEgPSBJV19QT1dFUl9QRVJJT0QgfCBJV19QT1dFUl9BTExfUjsKLQotCXJhbmdlLT5lbmNvZGluZ19zaXplWzBdID0gV0VQX1NNQUxMX0tFWV9MRU47Ci0JcmFuZ2UtPmVuY29kaW5nX3NpemVbMV0gPSBXRVBfTEFSR0VfS0VZX0xFTjsKLQlyYW5nZS0+bnVtX2VuY29kaW5nX3NpemVzID0gMjsKLQlyYW5nZS0+bWF4X2VuY29kaW5nX3Rva2VucyA9IFdFUF9LRVlTOwotCi0JLyogYm90aCBXTC0yNDBVIGFuZCBMaW5rc3lzIFdVU0IxMSB2Mi42IHNwZWNpZnkgMTUgZEJtIGFzIG91dHB1dCBwb3dlcgotCSAgIC0gdGFrZSB0aGlzIGZvciBhbGwgKGlnbm9yZSBhbnRlbm5hIGdhaW5zKSAqLwotCXJhbmdlLT50eHBvd2VyWzBdID0gMTU7Ci0JcmFuZ2UtPm51bV90eHBvd2VyID0gMTsKLQlyYW5nZS0+dHhwb3dlcl9jYXBhID0gSVdfVFhQT1dfREJNOwotCi0JcmFuZ2UtPndlX3ZlcnNpb25fc291cmNlID0gV0lSRUxFU1NfRVhUOwotCXJhbmdlLT53ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOwotCi0JLyogc2FtZSBhcyB0aGUgdmFsdWVzIHVzZWQgaW4gYXRtZWwuYyAqLwotCXJhbmdlLT5yZXRyeV9jYXBhID0gSVdfUkVUUllfTElNSVQ7Ci0JcmFuZ2UtPnJldHJ5X2ZsYWdzID0gSVdfUkVUUllfTElNSVQ7Ci0JcmFuZ2UtPnJfdGltZV9mbGFncyA9IDA7Ci0JcmFuZ2UtPm1pbl9yZXRyeSA9IDE7Ci0JcmFuZ2UtPm1heF9yZXRyeSA9IDI1NTsKLQotCXJhbmdlLT5udW1fY2hhbm5lbHMgPSBOVU1fQ0hBTk5FTFM7Ci0JcmFuZ2UtPm51bV9mcmVxdWVuY3kgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IE5VTV9DSEFOTkVMUzsgaSsrKSB7Ci0JCS8qIHRlc3QgaWYgY2hhbm5lbCBtYXAgYml0IGlzIHJhaXNlZCAqLwotCQlpZiAocHJpdi0+ZG9tYWluLT5jaGFubmVsX21hcCAmICgweDEgPDwgaSkpIHsKLQkJCXJhbmdlLT5udW1fZnJlcXVlbmN5ICs9IDE7Ci0KLQkJCXJhbmdlLT5mcmVxW2ldLmkgPSBpICsgMTsKLQkJCXJhbmdlLT5mcmVxW2ldLm0gPSBjaGFubmVsX2ZyZXF1ZW5jeVtpXSAqIDEwMDAwMDsKLQkJCXJhbmdlLT5mcmVxW2ldLmUgPSAxOwkvKiBmcmVxICogMTBeMSAqLwotCQl9Ci0JfQotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NHSVdSQU5HRSIsIG5ldGRldi0+bmFtZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfc2V0X3NweShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgcmV0ID0gMDsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DU0lXU1BZIC0gbnVtYmVyIG9mIGFkZHJlc3NlcyAlZCIsCi0JCSBuZXRkZXYtPm5hbWUsIGRhdGEtPmxlbmd0aCk7Ci0KLQlzcGluX2xvY2tfYmgoJnByaXYtPnNweV9zcGlubG9jayk7Ci0JcmV0ID0gaXdfaGFuZGxlcl9zZXRfc3B5KHByaXYtPm5ldGRldiwgaW5mbywgKHVuaW9uIGl3cmVxX2RhdGEgKilkYXRhLAotCQkJCSBleHRyYSk7Ci0Jc3Bpbl91bmxvY2tfYmgoJnByaXYtPnNweV9zcGlubG9jayk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfaGFuZGxlcl9nZXRfc3B5KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQotewotCi0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JaW50IHJldCA9IDA7Ci0KLQlzcGluX2xvY2tfYmgoJnByaXYtPnNweV9zcGlubG9jayk7Ci0JcmV0ID0gaXdfaGFuZGxlcl9nZXRfc3B5KHByaXYtPm5ldGRldiwgaW5mbywKLQkJCQkgKHVuaW9uIGl3cmVxX2RhdGEgKilkYXRhLCBleHRyYSk7Ci0Jc3Bpbl91bmxvY2tfYmgoJnByaXYtPnNweV9zcGlubG9jayk7Ci0KLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogU0lPQ0dJV1NQWSAtIG51bWJlciBvZiBhZGRyZXNzZXMgJWQiLAotCQkgbmV0ZGV2LT5uYW1lLCBkYXRhLT5sZW5ndGgpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfc2V0X3RocnNweShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICAgICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgcmV0OwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NTSVdUSFJTUFkgLSBudW1iZXIgb2YgYWRkcmVzc2VzICVkKSIsCi0JCSBuZXRkZXYtPm5hbWUsIGRhdGEtPmxlbmd0aCk7Ci0KLQlzcGluX2xvY2tfYmgoJnByaXYtPnNweV9zcGlubG9jayk7Ci0JcmV0ID0gaXdfaGFuZGxlcl9zZXRfdGhyc3B5KG5ldGRldiwgaW5mbywgKHVuaW9uIGl3cmVxX2RhdGEgKilkYXRhLAotCQkJCSAgICBleHRyYSk7Ci0Jc3Bpbl91bmxvY2tfYmgoJnByaXYtPnNweV9zcGlubG9jayk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfaGFuZGxlcl9nZXRfdGhyc3B5KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCWludCByZXQ7Ci0KLQlzcGluX2xvY2tfYmgoJnByaXYtPnNweV9zcGlubG9jayk7Ci0JcmV0ID0gaXdfaGFuZGxlcl9nZXRfdGhyc3B5KG5ldGRldiwgaW5mbywgKHVuaW9uIGl3cmVxX2RhdGEgKilkYXRhLAotCQkJCSAgICBleHRyYSk7Ci0Jc3Bpbl91bmxvY2tfYmgoJnByaXYtPnNweV9zcGlubG9jayk7Ci0KLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogU0lPQ0dJV1RIUlNQWSAtIG51bWJlciBvZiBhZGRyZXNzZXMgJWQpIiwKLQkJIG5ldGRldi0+bmFtZSwgZGF0YS0+bGVuZ3RoKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX3NldF93YXAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgIHN0cnVjdCBzb2NrYWRkciAqYXBfYWRkciwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0KLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogU0lPQ1NJV0FQIC0gd2FwL2Jzc2lkICVzIiwgbmV0ZGV2LT5uYW1lLAotCQkgbWFjMnN0cihhcF9hZGRyLT5zYV9kYXRhKSk7Ci0KLQkvKiBpZiB0aGUgaW5jb21pbmcgYWRkcmVzcyA9PSBmZjpmZjpmZjpmZjpmZjpmZiwgdGhlIHVzZXIgaGFzCi0JICAgY2hvc2VuIGFueSBvciBhdXRvIEFQIHByZWZlcmVuY2UgKi8KLQlpZiAoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoYXBfYWRkci0+c2FfZGF0YSkKLQkgICAgfHwgaXNfemVyb19ldGhlcl9hZGRyKGFwX2FkZHItPnNhX2RhdGEpKQotCQlwcml2LT53YW50ZWRfYnNzaWRfdmFsaWQgPSAwOwotCWVsc2UgewotCQkvKiB1c2VyIHdhbnRzIHRvIHNldCBhIHByZWZlcnJlZCBBUCBhZGRyZXNzICovCi0JCXByaXYtPndhbnRlZF9ic3NpZF92YWxpZCA9IDE7Ci0JCW1lbWNweShwcml2LT53YW50ZWRfYnNzaWQsIGFwX2FkZHItPnNhX2RhdGEsIEVUSF9BTEVOKTsKLQl9Ci0KLQlyZXR1cm4gLUVJV0NPTU1JVDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfZ2V0X3dhcChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICAgc3RydWN0IHNvY2thZGRyICphcF9hZGRyLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQotCWFwX2FkZHItPnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKLQltZW1jcHkoYXBfYWRkci0+c2FfZGF0YSwgcHJpdi0+YnNzaWQsIEVUSF9BTEVOKTsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DR0lXQVAgLSB3YXAvYnNzaWQgJXMiLCBuZXRkZXYtPm5hbWUsCi0JCSBtYWMyc3RyKGFwX2FkZHItPnNhX2RhdGEpKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfaGFuZGxlcl9zZXRfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgcmV0ID0gMDsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DU0lXU0NBTiIsIG5ldGRldi0+bmFtZSk7Ci0KLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZwcml2LT5tdHgpKQotCQlyZXR1cm4gLUVJTlRSOwotCi0JaWYgKCFuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKLQkJcmV0ID0gLUVORVRET1dOOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JLyogamFsOiB3ZSBkb24ndCBhbGxvdyAiaXdsaXN0IGV0aFggc2NhbiIgd2hpbGUgd2UgYXJlCi0JICAgaW4gbW9uaXRvciBtb2RlICovCi0JaWYgKHByaXYtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKSB7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBleGl0OwotCX0KLQotCS8qIERpc2NhcmQgb2xkIHNjYW4gcmVzdWx0cyAqLwotCWlmICgoamlmZmllcyAtIHByaXYtPmxhc3Rfc2NhbikgPiAoMjAgKiBIWikpCi0JCXByaXYtPnNjYW5fc3RhdGUgPSBTQ0FOX0lETEU7Ci0JcHJpdi0+bGFzdF9zY2FuID0gamlmZmllczsKLQotCS8qIEluaXRpYXRlIGEgc2NhbiBjb21tYW5kICovCi0JaWYgKHByaXYtPnNjYW5fc3RhdGUgPT0gU0NBTl9JTl9QUk9HUkVTUykgewotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlwcml2LT5zY2FuX3N0YXRlID0gU0NBTl9JTl9QUk9HUkVTUzsKLQotCWF0NzZfcXVpZXNjZShwcml2KTsKLQotCS8qIFRyeSB0byBkbyBwYXNzaXZlIG9yIGFjdGl2ZSBzY2FuIGlmIFdFIGFza3MgYXMuICovCi0JaWYgKHdycXUtPmRhdGEubGVuZ3RoCi0JICAgICYmIHdycXUtPmRhdGEubGVuZ3RoID09IHNpemVvZihzdHJ1Y3QgaXdfc2Nhbl9yZXEpKSB7Ci0JCXN0cnVjdCBpd19zY2FuX3JlcSAqcmVxID0gKHN0cnVjdCBpd19zY2FuX3JlcSAqKWV4dHJhOwotCi0JCWlmIChyZXEtPnNjYW5fdHlwZSA9PSBJV19TQ0FOX1RZUEVfUEFTU0lWRSkKLQkJCXByaXYtPnNjYW5fbW9kZSA9IFNDQU5fVFlQRV9QQVNTSVZFOwotCQllbHNlIGlmIChyZXEtPnNjYW5fdHlwZSA9PSBJV19TQ0FOX1RZUEVfQUNUSVZFKQotCQkJcHJpdi0+c2Nhbl9tb2RlID0gU0NBTl9UWVBFX0FDVElWRTsKLQotCQkvKiBTYW5pdHkgY2hlY2sgdmFsdWVzPyAqLwotCQlpZiAocmVxLT5taW5fY2hhbm5lbF90aW1lID4gMCkKLQkJCXByaXYtPnNjYW5fbWluX3RpbWUgPSByZXEtPm1pbl9jaGFubmVsX3RpbWU7Ci0KLQkJaWYgKHJlcS0+bWF4X2NoYW5uZWxfdGltZSA+IDApCi0JCQlwcml2LT5zY2FuX21heF90aW1lID0gcmVxLT5tYXhfY2hhbm5lbF90aW1lOwotCX0KLQotCS8qIGNoYW5nZSB0byBzY2FubmluZyBzdGF0ZSAqLwotCWF0NzZfc2V0X21hY19zdGF0ZShwcml2LCBNQUNfU0NBTk5JTkcpOwotCXNjaGVkdWxlX3dvcmsoJnByaXYtPndvcmtfc3RhcnRfc2Nhbik7Ci0KLWV4aXQ6Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdHgpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX2dldF9zY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpscHRyLCAqbnB0cjsKLQlzdHJ1Y3QgYnNzX2luZm8gKmN1cnJfYnNzOwotCXN0cnVjdCBpd19ldmVudCAqaXdlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGl3X2V2ZW50KSwgR0ZQX0tFUk5FTCk7Ci0JY2hhciAqY3Vycl92YWwsICpjdXJyX3BvcyA9IGV4dHJhOwotCWludCBpOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NHSVdTQ0FOIiwgbmV0ZGV2LT5uYW1lKTsKLQotCWlmICghaXdlKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWlmIChwcml2LT5zY2FuX3N0YXRlICE9IFNDQU5fQ09NUExFVEVEKSB7Ci0JCS8qIHNjYW4gbm90IHlldCBmaW5pc2hlZCAqLwotCQlrZnJlZShpd2UpOwotCQlyZXR1cm4gLUVBR0FJTjsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+YnNzX2xpc3Rfc3BpbmxvY2ssIGZsYWdzKTsKLQotCWxpc3RfZm9yX2VhY2hfc2FmZShscHRyLCBucHRyLCAmcHJpdi0+YnNzX2xpc3QpIHsKLQkJY3Vycl9ic3MgPSBsaXN0X2VudHJ5KGxwdHIsIHN0cnVjdCBic3NfaW5mbywgbGlzdCk7Ci0KLQkJaXdlLT5jbWQgPSBTSU9DR0lXQVA7Ci0JCWl3ZS0+dS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKLQkJbWVtY3B5KGl3ZS0+dS5hcF9hZGRyLnNhX2RhdGEsIGN1cnJfYnNzLT5ic3NpZCwgNik7Ci0JCWN1cnJfcG9zID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoaW5mbywgY3Vycl9wb3MsCi0JCQkJCQlleHRyYSArIElXX1NDQU5fTUFYX0RBVEEsIGl3ZSwKLQkJCQkJCUlXX0VWX0FERFJfTEVOKTsKLQotCQlpd2UtPnUuZGF0YS5sZW5ndGggPSBjdXJyX2Jzcy0+c3NpZF9sZW47Ci0JCWl3ZS0+Y21kID0gU0lPQ0dJV0VTU0lEOwotCQlpd2UtPnUuZGF0YS5mbGFncyA9IDE7Ci0KLQkJY3Vycl9wb3MgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBjdXJyX3BvcywKLQkJCQkJCWV4dHJhICsgSVdfU0NBTl9NQVhfREFUQSwgaXdlLAotCQkJCQkJY3Vycl9ic3MtPnNzaWQpOwotCi0JCWl3ZS0+Y21kID0gU0lPQ0dJV01PREU7Ci0JCWl3ZS0+dS5tb2RlID0gKGN1cnJfYnNzLT5jYXBhICYgV0xBTl9DQVBBQklMSVRZX0lCU1MpID8KLQkJICAgIElXX01PREVfQURIT0MgOgotCQkgICAgKGN1cnJfYnNzLT5jYXBhICYgV0xBTl9DQVBBQklMSVRZX0VTUykgPwotCQkgICAgSVdfTU9ERV9NQVNURVIgOiBJV19NT0RFX0FVVE87Ci0JCS8qIElXX01PREVfQVVUTyA9IDAgd2hpY2ggSSB0aG91Z2h0IGlzCi0JCSAqIHRoZSBtb3N0IGxvZ2ljYWwgdmFsdWUgdG8gcmV0dXJuIGluIHRoaXMgY2FzZSAqLwotCQljdXJyX3BvcyA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sIGN1cnJfcG9zLAotCQkJCQkJZXh0cmEgKyBJV19TQ0FOX01BWF9EQVRBLCBpd2UsCi0JCQkJCQlJV19FVl9VSU5UX0xFTik7Ci0KLQkJaXdlLT5jbWQgPSBTSU9DR0lXRlJFUTsKLQkJaXdlLT51LmZyZXEubSA9IGN1cnJfYnNzLT5jaGFubmVsOwotCQlpd2UtPnUuZnJlcS5lID0gMDsKLQkJY3Vycl9wb3MgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBjdXJyX3BvcywKLQkJCQkJCWV4dHJhICsgSVdfU0NBTl9NQVhfREFUQSwgaXdlLAotCQkJCQkJSVdfRVZfRlJFUV9MRU4pOwotCi0JCWl3ZS0+Y21kID0gU0lPQ0dJV0VOQ09ERTsKLQkJaWYgKGN1cnJfYnNzLT5jYXBhICYgV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpCi0JCQlpd2UtPnUuZGF0YS5mbGFncyA9IElXX0VOQ09ERV9FTkFCTEVEIHwgSVdfRU5DT0RFX05PS0VZOwotCQllbHNlCi0JCQlpd2UtPnUuZGF0YS5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRDsKLQotCQlpd2UtPnUuZGF0YS5sZW5ndGggPSAwOwotCQljdXJyX3BvcyA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIGN1cnJfcG9zLAotCQkJCQkJZXh0cmEgKyBJV19TQ0FOX01BWF9EQVRBLCBpd2UsCi0JCQkJCQlOVUxMKTsKLQotCQkvKiBBZGQgcXVhbGl0eSBzdGF0aXN0aWNzICovCi0JCWl3ZS0+Y21kID0gSVdFVlFVQUw7Ci0JCWl3ZS0+dS5xdWFsLm5vaXNlID0gMDsKLQkJaXdlLT51LnF1YWwudXBkYXRlZCA9Ci0JCSAgICBJV19RVUFMX05PSVNFX0lOVkFMSUQgfCBJV19RVUFMX0xFVkVMX1VQREFURUQ7Ci0JCWl3ZS0+dS5xdWFsLmxldmVsID0gKGN1cnJfYnNzLT5yc3NpICogMTAwIC8gNDIpOwotCQlpZiAoaXdlLT51LnF1YWwubGV2ZWwgPiAxMDApCi0JCQlpd2UtPnUucXVhbC5sZXZlbCA9IDEwMDsKLQkJaWYgKGF0NzZfaXNfaW50ZXJzaWwocHJpdi0+Ym9hcmRfdHlwZSkpCi0JCQlpd2UtPnUucXVhbC5xdWFsID0gY3Vycl9ic3MtPmxpbmtfcXVhbDsKLQkJZWxzZSB7Ci0JCQlpd2UtPnUucXVhbC5xdWFsID0gMDsKLQkJCWl3ZS0+dS5xdWFsLnVwZGF0ZWQgfD0gSVdfUVVBTF9RVUFMX0lOVkFMSUQ7Ci0JCX0KLQkJLyogQWRkIG5ldyB2YWx1ZSB0byBldmVudCAqLwotCQljdXJyX3BvcyA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sIGN1cnJfcG9zLAotCQkJCQkJZXh0cmEgKyBJV19TQ0FOX01BWF9EQVRBLCBpd2UsCi0JCQkJCQlJV19FVl9RVUFMX0xFTik7Ci0KLQkJLyogUmF0ZTogc3R1ZmZpbmcgbXVsdGlwbGUgdmFsdWVzIGluIGEgc2luZ2xlIGV2ZW50IHJlcXVpcmVzCi0JCSAqIGEgYml0IG1vcmUgb2YgbWFnaWMgLSBKZWFuIElJICovCi0JCWN1cnJfdmFsID0gY3Vycl9wb3MgKyBJV19FVl9MQ1BfTEVOOwotCi0JCWl3ZS0+Y21kID0gU0lPQ0dJV1JBVEU7Ci0JCS8qIFRob3NlIHR3byBmbGFncyBhcmUgaWdub3JlZC4uLiAqLwotCQlpd2UtPnUuYml0cmF0ZS5maXhlZCA9IDA7Ci0JCWl3ZS0+dS5iaXRyYXRlLmRpc2FibGVkID0gMDsKLQkJLyogTWF4IDggdmFsdWVzICovCi0JCWZvciAoaSA9IDA7IGkgPCBjdXJyX2Jzcy0+cmF0ZXNfbGVuOyBpKyspIHsKLQkJCS8qIEJpdCByYXRlIGdpdmVuIGluIDUwMCBrYi9zIHVuaXRzICgrIDB4ODApICovCi0JCQlpd2UtPnUuYml0cmF0ZS52YWx1ZSA9Ci0JCQkgICAgKChjdXJyX2Jzcy0+cmF0ZXNbaV0gJiAweDdmKSAqIDUwMDAwMCk7Ci0JCQkvKiBBZGQgbmV3IHZhbHVlIHRvIGV2ZW50ICovCi0JCQljdXJyX3ZhbCA9IGl3ZV9zdHJlYW1fYWRkX3ZhbHVlKGluZm8sIGN1cnJfcG9zLAotCQkJCQkJCWN1cnJfdmFsLAotCQkJCQkJCWV4dHJhICsKLQkJCQkJCQlJV19TQ0FOX01BWF9EQVRBLCBpd2UsCi0JCQkJCQkJSVdfRVZfUEFSQU1fTEVOKTsKLQkJfQotCi0JCS8qIENoZWNrIGlmIHdlIGFkZGVkIGFueSBldmVudCAqLwotCQlpZiAoKGN1cnJfdmFsIC0gY3Vycl9wb3MpID4gSVdfRVZfTENQX0xFTikKLQkJCWN1cnJfcG9zID0gY3Vycl92YWw7Ci0KLQkJLyogbW9yZSBpbmZvcm1hdGlvbiBtYXkgYmUgc2VudCBiYWNrIHVzaW5nIElXRUNVU1RPTSAqLwotCi0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+YnNzX2xpc3Rfc3BpbmxvY2ssIGZsYWdzKTsKLQotCWRhdGEtPmxlbmd0aCA9IChjdXJyX3BvcyAtIGV4dHJhKTsKLQlkYXRhLT5mbGFncyA9IDA7Ci0KLQlrZnJlZShpd2UpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfaGFuZGxlcl9zZXRfZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NTSVdFU1NJRCAtICVzIiwgbmV0ZGV2LT5uYW1lLCBleHRyYSk7Ci0KLQlpZiAoZGF0YS0+ZmxhZ3MpIHsKLQkJbWVtY3B5KHByaXYtPmVzc2lkLCBleHRyYSwgZGF0YS0+bGVuZ3RoKTsKLQkJcHJpdi0+ZXNzaWRfc2l6ZSA9IGRhdGEtPmxlbmd0aDsKLQl9IGVsc2UKLQkJcHJpdi0+ZXNzaWRfc2l6ZSA9IDA7CS8qIFVzZSBhbnkgU1NJRCAqLwotCi0JcmV0dXJuIC1FSVdDT01NSVQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX2dldF9lc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0KLQlpZiAocHJpdi0+ZXNzaWRfc2l6ZSkgewotCQkvKiBub3QgdGhlIEFOWSBzc2lkIGluIHByaXYtPmVzc2lkICovCi0JCWRhdGEtPmZsYWdzID0gMTsKLQkJZGF0YS0+bGVuZ3RoID0gcHJpdi0+ZXNzaWRfc2l6ZTsKLQkJbWVtY3B5KGV4dHJhLCBwcml2LT5lc3NpZCwgZGF0YS0+bGVuZ3RoKTsKLQl9IGVsc2UgewotCQkvKiB0aGUgQU5ZIHNzaWQgd2FzIHNwZWNpZmllZCAqLwotCQlpZiAocHJpdi0+bWFjX3N0YXRlID09IE1BQ19DT05ORUNURUQgJiYgcHJpdi0+Y3Vycl9ic3MpIHsKLQkJCS8qIHJlcG9ydCB0aGUgU1NJRCB3ZSBoYXZlIGZvdW5kICovCi0JCQlkYXRhLT5mbGFncyA9IDE7Ci0JCQlkYXRhLT5sZW5ndGggPSBwcml2LT5jdXJyX2Jzcy0+c3NpZF9sZW47Ci0JCQltZW1jcHkoZXh0cmEsIHByaXYtPmN1cnJfYnNzLT5zc2lkLCBkYXRhLT5sZW5ndGgpOwotCQl9IGVsc2UgewotCQkJLyogcmVwb3J0IEFOWSBiYWNrICovCi0JCQlkYXRhLT5mbGFncyA9IDA7Ci0JCQlkYXRhLT5sZW5ndGggPSAwOwotCQl9Ci0JfQotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NHSVdFU1NJRCAtICUuKnMiLCBuZXRkZXYtPm5hbWUsCi0JCSBkYXRhLT5sZW5ndGgsIGV4dHJhKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfaGFuZGxlcl9zZXRfcmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgICBzdHJ1Y3QgaXdfcGFyYW0gKmJpdHJhdGUsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCWludCByZXQgPSAtRUlXQ09NTUlUOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NTSVdSQVRFIC0gJWQiLCBuZXRkZXYtPm5hbWUsCi0JCSBiaXRyYXRlLT52YWx1ZSk7Ci0KLQlzd2l0Y2ggKGJpdHJhdGUtPnZhbHVlKSB7Ci0JY2FzZSAtMToKLQkJcHJpdi0+dHhyYXRlID0gVFhfUkFURV9BVVRPOwotCQlicmVhazsJCS8qIGF1dG8gcmF0ZSAqLwotCWNhc2UgMTAwMDAwMDoKLQkJcHJpdi0+dHhyYXRlID0gVFhfUkFURV8xTUJJVDsKLQkJYnJlYWs7Ci0JY2FzZSAyMDAwMDAwOgotCQlwcml2LT50eHJhdGUgPSBUWF9SQVRFXzJNQklUOwotCQlicmVhazsKLQljYXNlIDU1MDAwMDA6Ci0JCXByaXYtPnR4cmF0ZSA9IFRYX1JBVEVfNV81TUJJVDsKLQkJYnJlYWs7Ci0JY2FzZSAxMTAwMDAwMDoKLQkJcHJpdi0+dHhyYXRlID0gVFhfUkFURV8xMU1CSVQ7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldCA9IC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfZ2V0X3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgc3RydWN0IGl3X3BhcmFtICpiaXRyYXRlLCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgcmV0ID0gMDsKLQotCXN3aXRjaCAocHJpdi0+dHhyYXRlKSB7Ci0JCS8qIHJldHVybiBtYXggcmF0ZSBpZiBSQVRFX0FVVE8gKi8KLQljYXNlIFRYX1JBVEVfQVVUTzoKLQkJYml0cmF0ZS0+dmFsdWUgPSAxMTAwMDAwMDsKLQkJYnJlYWs7Ci0JY2FzZSBUWF9SQVRFXzFNQklUOgotCQliaXRyYXRlLT52YWx1ZSA9IDEwMDAwMDA7Ci0JCWJyZWFrOwotCWNhc2UgVFhfUkFURV8yTUJJVDoKLQkJYml0cmF0ZS0+dmFsdWUgPSAyMDAwMDAwOwotCQlicmVhazsKLQljYXNlIFRYX1JBVEVfNV81TUJJVDoKLQkJYml0cmF0ZS0+dmFsdWUgPSA1NTAwMDAwOwotCQlicmVhazsKLQljYXNlIFRYX1JBVEVfMTFNQklUOgotCQliaXRyYXRlLT52YWx1ZSA9IDExMDAwMDAwOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXQgPSAtRUlOVkFMOwotCX0KLQotCWJpdHJhdGUtPmZpeGVkID0gKHByaXYtPnR4cmF0ZSAhPSBUWF9SQVRFX0FVVE8pOwotCWJpdHJhdGUtPmRpc2FibGVkID0gMDsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DR0lXUkFURSAtICVkIiwgbmV0ZGV2LT5uYW1lLAotCQkgYml0cmF0ZS0+dmFsdWUpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfc2V0X3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICAgc3RydWN0IGl3X3BhcmFtICpydHMsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCWludCByZXQgPSAtRUlXQ09NTUlUOwotCWludCBydGhyID0gcnRzLT52YWx1ZTsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DU0lXUlRTIC0gdmFsdWUgJWQgZGlzYWJsZWQgJXMiLAotCQkgbmV0ZGV2LT5uYW1lLCBydHMtPnZhbHVlLCAocnRzLT5kaXNhYmxlZCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLQotCWlmIChydHMtPmRpc2FibGVkKQotCQlydGhyID0gTUFYX1JUU19USFJFU0hPTEQ7Ci0KLQlpZiAoKHJ0aHIgPCAwKSB8fCAocnRociA+IE1BWF9SVFNfVEhSRVNIT0xEKSkKLQkJcmV0ID0gLUVJTlZBTDsKLQllbHNlCi0JCXByaXYtPnJ0c190aHJlc2hvbGQgPSBydGhyOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfZ2V0X3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICAgc3RydWN0IGl3X3BhcmFtICpydHMsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCi0JcnRzLT52YWx1ZSA9IHByaXYtPnJ0c190aHJlc2hvbGQ7Ci0JcnRzLT5kaXNhYmxlZCA9IChydHMtPnZhbHVlID49IE1BWF9SVFNfVEhSRVNIT0xEKTsKLQlydHMtPmZpeGVkID0gMTsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBTSU9DR0lXUlRTIC0gdmFsdWUgJWQgZGlzYWJsZWQgJXMiLAotCQkgbmV0ZGV2LT5uYW1lLCBydHMtPnZhbHVlLCAocnRzLT5kaXNhYmxlZCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfaGFuZGxlcl9zZXRfZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgICBzdHJ1Y3QgaXdfcGFyYW0gKmZyYWcsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCWludCByZXQgPSAtRUlXQ09NTUlUOwotCWludCBmdGhyID0gZnJhZy0+dmFsdWU7Ci0KLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogU0lPQ1NJV0ZSQUcgLSB2YWx1ZSAlZCwgZGlzYWJsZWQgJXMiLAotCQkgbmV0ZGV2LT5uYW1lLCBmcmFnLT52YWx1ZSwKLQkJIChmcmFnLT5kaXNhYmxlZCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLQotCWlmIChmcmFnLT5kaXNhYmxlZCkKLQkJZnRociA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKLQotCWlmICgoZnRociA8IE1JTl9GUkFHX1RIUkVTSE9MRCkgfHwgKGZ0aHIgPiBNQVhfRlJBR19USFJFU0hPTEQpKQotCQlyZXQgPSAtRUlOVkFMOwotCWVsc2UKLQkJcHJpdi0+ZnJhZ190aHJlc2hvbGQgPSBmdGhyICYgfjB4MTsJLyogZ2V0IGFuIGV2ZW4gdmFsdWUgKi8KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX2dldF9mcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICAgIHN0cnVjdCBpd19wYXJhbSAqZnJhZywgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0KLQlmcmFnLT52YWx1ZSA9IHByaXYtPmZyYWdfdGhyZXNob2xkOwotCWZyYWctPmRpc2FibGVkID0gKGZyYWctPnZhbHVlID49IE1BWF9GUkFHX1RIUkVTSE9MRCk7Ci0JZnJhZy0+Zml4ZWQgPSAxOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NHSVdGUkFHIC0gdmFsdWUgJWQsIGRpc2FibGVkICVzIiwKLQkJIG5ldGRldi0+bmFtZSwgZnJhZy0+dmFsdWUsCi0JCSAoZnJhZy0+ZGlzYWJsZWQpID8gInRydWUiIDogImZhbHNlIik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfZ2V0X3R4cG93KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgICAgc3RydWN0IGl3X3BhcmFtICpwb3dlciwgY2hhciAqZXh0cmEpCi17Ci0JcG93ZXItPnZhbHVlID0gMTU7Ci0JcG93ZXItPmZpeGVkID0gMTsJLyogTm8gcG93ZXIgY29udHJvbCAqLwotCXBvd2VyLT5kaXNhYmxlZCA9IDA7Ci0JcG93ZXItPmZsYWdzID0gSVdfVFhQT1dfREJNOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NHSVdUWFBPVyAtIHR4cG93ICVkIGRCbSIsIG5ldGRldi0+bmFtZSwKLQkJIHBvd2VyLT52YWx1ZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogamFsOiBzaG9ydCByZXRyeSBpcyBoYW5kbGVkIGJ5IHRoZSBmaXJtd2FyZSAoYXQgbGVhc3QgMC45MC54KSwKLSAgIHdoaWxlIGxvbmcgcmV0cnkgaXMgbm90ICg/KSAqLwotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfc2V0X3JldHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgICAgc3RydWN0IGl3X3BhcmFtICpyZXRyeSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JaW50IHJldCA9IC1FSVdDT01NSVQ7Ci0KLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogU0lPQ1NJV1JFVFJZIGRpc2FibGVkICVkIGZsYWdzIDB4JXggdmFsICVkIiwKLQkJIG5ldGRldi0+bmFtZSwgcmV0cnktPmRpc2FibGVkLCByZXRyeS0+ZmxhZ3MsIHJldHJ5LT52YWx1ZSk7Ci0KLQlpZiAoIXJldHJ5LT5kaXNhYmxlZCAmJiAocmV0cnktPmZsYWdzICYgSVdfUkVUUllfTElNSVQpKSB7Ci0JCWlmICgocmV0cnktPmZsYWdzICYgSVdfUkVUUllfTUlOKSB8fAotCQkgICAgIShyZXRyeS0+ZmxhZ3MgJiBJV19SRVRSWV9NQVgpKQotCQkJcHJpdi0+c2hvcnRfcmV0cnlfbGltaXQgPSByZXRyeS0+dmFsdWU7Ci0JCWVsc2UKLQkJCXJldCA9IC1FSU5WQUw7Ci0JfSBlbHNlCi0JCXJldCA9IC1FSU5WQUw7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKiBBZGFwdGVkIChyaXBwZWQpIGZyb20gYXRtZWwuYyAqLwotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfZ2V0X3JldHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgICAgc3RydWN0IGl3X3BhcmFtICpyZXRyeSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0KLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogU0lPQ0dJV1JFVFJZIiwgbmV0ZGV2LT5uYW1lKTsKLQotCXJldHJ5LT5kaXNhYmxlZCA9IDA7CS8qIENhbid0IGJlIGRpc2FibGVkICovCi0JcmV0cnktPmZsYWdzID0gSVdfUkVUUllfTElNSVQ7Ci0JcmV0cnktPnZhbHVlID0gcHJpdi0+c2hvcnRfcmV0cnlfbGltaXQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfc2V0X2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICAgICAgc3RydWN0IGl3X3BvaW50ICplbmNvZGluZywgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JaW50IGluZGV4ID0gKGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOwotCWludCBsZW4gPSBlbmNvZGluZy0+bGVuZ3RoOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NTSVdFTkNPREUgLSBlbmMuZmxhZ3MgJTA4eCAiCi0JCSAicG9pbnRlciAlcCBsZW4gJWQiLCBuZXRkZXYtPm5hbWUsIGVuY29kaW5nLT5mbGFncywKLQkJIGVuY29kaW5nLT5wb2ludGVyLCBlbmNvZGluZy0+bGVuZ3RoKTsKLQlhdDc2X2RiZyhEQkdfSU9DVEwsCi0JCSAiJXM6IFNJT0NTSVdFTkNPREUgLSBvbGQgd2Vwc3RhdGU6IGVuYWJsZWQgJXMga2V5X2lkICVkICIKLQkJICJhdXRoX21vZGUgJXMiLCBuZXRkZXYtPm5hbWUsCi0JCSAocHJpdi0+d2VwX2VuYWJsZWQpID8gInRydWUiIDogImZhbHNlIiwgcHJpdi0+d2VwX2tleV9pZCwKLQkJIChwcml2LT5hdXRoX21vZGUgPT0KLQkJICBXTEFOX0FVVEhfU0hBUkVEX0tFWSkgPyAicmVzdHJpY3RlZCIgOiAib3BlbiIpOwotCi0JLyogdGFrZSB0aGUgb2xkIGRlZmF1bHQga2V5IGlmIGluZGV4IGlzIGludmFsaWQgKi8KLQlpZiAoKGluZGV4IDwgMCkgfHwgKGluZGV4ID49IFdFUF9LRVlTKSkKLQkJaW5kZXggPSBwcml2LT53ZXBfa2V5X2lkOwotCi0JaWYgKGxlbiA+IDApIHsKLQkJaWYgKGxlbiA+IFdFUF9MQVJHRV9LRVlfTEVOKQotCQkJbGVuID0gV0VQX0xBUkdFX0tFWV9MRU47Ci0KLQkJbWVtc2V0KHByaXYtPndlcF9rZXlzW2luZGV4XSwgMCwgV0VQX0tFWV9MRU4pOwotCQltZW1jcHkocHJpdi0+d2VwX2tleXNbaW5kZXhdLCBleHRyYSwgbGVuKTsKLQkJcHJpdi0+d2VwX2tleXNfbGVuW2luZGV4XSA9IChsZW4gPD0gV0VQX1NNQUxMX0tFWV9MRU4pID8KLQkJICAgIFdFUF9TTUFMTF9LRVlfTEVOIDogV0VQX0xBUkdFX0tFWV9MRU47Ci0JCXByaXYtPndlcF9lbmFibGVkID0gMTsKLQl9Ci0KLQlwcml2LT53ZXBfa2V5X2lkID0gaW5kZXg7Ci0JcHJpdi0+d2VwX2VuYWJsZWQgPSAoKGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkgPT0gMCk7Ci0KLQlpZiAoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX1JFU1RSSUNURUQpCi0JCXByaXYtPmF1dGhfbW9kZSA9IFdMQU5fQVVUSF9TSEFSRURfS0VZOwotCWlmIChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfT1BFTikKLQkJcHJpdi0+YXV0aF9tb2RlID0gV0xBTl9BVVRIX09QRU47Ci0KLQlhdDc2X2RiZyhEQkdfSU9DVEwsCi0JCSAiJXM6IFNJT0NTSVdFTkNPREUgLSBuZXcgd2Vwc3RhdGU6IGVuYWJsZWQgJXMga2V5X2lkICVkICIKLQkJICJrZXlfbGVuICVkIGF1dGhfbW9kZSAlcyIsIG5ldGRldi0+bmFtZSwKLQkJIChwcml2LT53ZXBfZW5hYmxlZCkgPyAidHJ1ZSIgOiAiZmFsc2UiLCBwcml2LT53ZXBfa2V5X2lkICsgMSwKLQkJIHByaXYtPndlcF9rZXlzX2xlbltwcml2LT53ZXBfa2V5X2lkXSwKLQkJIChwcml2LT5hdXRoX21vZGUgPT0KLQkJICBXTEFOX0FVVEhfU0hBUkVEX0tFWSkgPyAicmVzdHJpY3RlZCIgOiAib3BlbiIpOwotCi0JcmV0dXJuIC1FSVdDT01NSVQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX2dldF9lbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgICAgIHN0cnVjdCBpd19wb2ludCAqZW5jb2RpbmcsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCWludCBpbmRleCA9IChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKLQotCWlmICgoaW5kZXggPCAwKSB8fCAoaW5kZXggPj0gV0VQX0tFWVMpKQotCQlpbmRleCA9IHByaXYtPndlcF9rZXlfaWQ7Ci0KLQllbmNvZGluZy0+ZmxhZ3MgPQotCSAgICAocHJpdi0+YXV0aF9tb2RlID09IFdMQU5fQVVUSF9TSEFSRURfS0VZKSA/Ci0JICAgIElXX0VOQ09ERV9SRVNUUklDVEVEIDogSVdfRU5DT0RFX09QRU47Ci0KLQlpZiAoIXByaXYtPndlcF9lbmFibGVkKQotCQllbmNvZGluZy0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0RJU0FCTEVEOwotCi0JaWYgKGVuY29kaW5nLT5wb2ludGVyKSB7Ci0JCWVuY29kaW5nLT5sZW5ndGggPSBwcml2LT53ZXBfa2V5c19sZW5baW5kZXhdOwotCi0JCW1lbWNweShleHRyYSwgcHJpdi0+d2VwX2tleXNbaW5kZXhdLCBwcml2LT53ZXBfa2V5c19sZW5baW5kZXhdKTsKLQotCQllbmNvZGluZy0+ZmxhZ3MgfD0gKGluZGV4ICsgMSk7Ci0JfQotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NHSVdFTkNPREUgLSBlbmMuZmxhZ3MgJTA4eCAiCi0JCSAicG9pbnRlciAlcCBsZW4gJWQiLCBuZXRkZXYtPm5hbWUsIGVuY29kaW5nLT5mbGFncywKLQkJIGVuY29kaW5nLT5wb2ludGVyLCBlbmNvZGluZy0+bGVuZ3RoKTsKLQlhdDc2X2RiZyhEQkdfSU9DVEwsCi0JCSAiJXM6IFNJT0NHSVdFTkNPREUgLSB3ZXBzdGF0ZTogZW5hYmxlZCAlcyBrZXlfaWQgJWQgIgotCQkgImtleV9sZW4gJWQgYXV0aF9tb2RlICVzIiwgbmV0ZGV2LT5uYW1lLAotCQkgKHByaXYtPndlcF9lbmFibGVkKSA/ICJ0cnVlIiA6ICJmYWxzZSIsIHByaXYtPndlcF9rZXlfaWQgKyAxLAotCQkgcHJpdi0+d2VwX2tleXNfbGVuW3ByaXYtPndlcF9rZXlfaWRdLAotCQkgKHByaXYtPmF1dGhfbW9kZSA9PQotCQkgIFdMQU5fQVVUSF9TSEFSRURfS0VZKSA/ICJyZXN0cmljdGVkIiA6ICJvcGVuIik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2hhbmRsZXJfc2V0X3Bvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgICAgc3RydWN0IGl3X3BhcmFtICpwcnEsIGNoYXIgKmV4dHJhKQotewotCWludCBlcnIgPSAtRUlXQ09NTUlUOwotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLAotCQkgIiVzOiBTSU9DU0lXUE9XRVIgLSBkaXNhYmxlZCAlcyBmbGFncyAweCV4IHZhbHVlIDB4JXgiLAotCQkgbmV0ZGV2LT5uYW1lLCAocHJxLT5kaXNhYmxlZCkgPyAidHJ1ZSIgOiAiZmFsc2UiLCBwcnEtPmZsYWdzLAotCQkgcHJxLT52YWx1ZSk7Ci0KLQlpZiAocHJxLT5kaXNhYmxlZCkKLQkJcHJpdi0+cG1fbW9kZSA9IEFUNzZfUE1fT0ZGOwotCWVsc2UgewotCQlzd2l0Y2ggKHBycS0+ZmxhZ3MgJiBJV19QT1dFUl9NT0RFKSB7Ci0JCWNhc2UgSVdfUE9XRVJfQUxMX1I6Ci0JCWNhc2UgSVdfUE9XRVJfT046Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWVyciA9IC1FSU5WQUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQkJaWYgKHBycS0+ZmxhZ3MgJiBJV19QT1dFUl9QRVJJT0QpCi0JCQlwcml2LT5wbV9wZXJpb2QgPSBwcnEtPnZhbHVlOwotCi0JCWlmIChwcnEtPmZsYWdzICYgSVdfUE9XRVJfVElNRU9VVCkgewotCQkJZXJyID0gLUVJTlZBTDsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCQlwcml2LT5wbV9tb2RlID0gQVQ3Nl9QTV9PTjsKLQl9Ci1leGl0OgotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19oYW5kbGVyX2dldF9wb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICAgIHN0cnVjdCBpd19wYXJhbSAqcG93ZXIsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCi0JcG93ZXItPmRpc2FibGVkID0gKHByaXYtPnBtX21vZGUgPT0gQVQ3Nl9QTV9PRkYpOwotCWlmICghcG93ZXItPmRpc2FibGVkKSB7Ci0JCXBvd2VyLT5mbGFncyA9IElXX1BPV0VSX1BFUklPRCB8IElXX1BPV0VSX0FMTF9SOwotCQlwb3dlci0+dmFsdWUgPSBwcml2LT5wbV9wZXJpb2Q7Ci0JfQotCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IFNJT0NHSVdQT1dFUiAtICVzIGZsYWdzIDB4JXggdmFsdWUgMHgleCIsCi0JCSBuZXRkZXYtPm5hbWUsIHBvd2VyLT5kaXNhYmxlZCA/ICJkaXNhYmxlZCIgOiAiZW5hYmxlZCIsCi0JCSBwb3dlci0+ZmxhZ3MsIHBvd2VyLT52YWx1ZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFByaXZhdGUgSU9DVExTCi0gKi8KLXN0YXRpYyBpbnQgYXQ3Nl9pd19zZXRfc2hvcnRfcHJlYW1ibGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCBjaGFyICpuYW1lLAotCQkJCSAgICAgIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCWludCB2YWwgPSAqKChpbnQgKiluYW1lKTsKLQlpbnQgcmV0ID0gLUVJV0NPTU1JVDsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBBVDc2X1NFVF9TSE9SVF9QUkVBTUJMRSwgJWQiLAotCQkgbmV0ZGV2LT5uYW1lLCB2YWwpOwotCi0JaWYgKHZhbCA8IFBSRUFNQkxFX1RZUEVfTE9ORyB8fCB2YWwgPiBQUkVBTUJMRV9UWVBFX0FVVE8pCi0JCXJldCA9IC1FSU5WQUw7Ci0JZWxzZQotCQlwcml2LT5wcmVhbWJsZV90eXBlID0gdmFsOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2dldF9zaG9ydF9wcmVhbWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0KLQlzbnByaW50Zih3cnF1LT5uYW1lLCBzaXplb2Yod3JxdS0+bmFtZSksICIlcyAoJWQpIiwKLQkJIHByZWFtYmxlc1twcml2LT5wcmVhbWJsZV90eXBlXSwgcHJpdi0+cHJlYW1ibGVfdHlwZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19zZXRfZGVidWcoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKLXsKLQljaGFyICpwdHI7Ci0JdTMyIHZhbDsKLQotCWlmIChkYXRhLT5sZW5ndGggPiAwKSB7Ci0JCXZhbCA9IHNpbXBsZV9zdHJ0b2woZXh0cmEsICZwdHIsIDApOwotCi0JCWlmIChwdHIgPT0gZXh0cmEpCi0JCQl2YWwgPSBEQkdfREVGQVVMVFM7Ci0KLQkJYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IEFUNzZfU0VUX0RFQlVHIGlucHV0ICVkOiAlcyAtPiAweCV4IiwKLQkJCSBuZXRkZXYtPm5hbWUsIGRhdGEtPmxlbmd0aCwgZXh0cmEsIHZhbCk7Ci0JfSBlbHNlCi0JCXZhbCA9IERCR19ERUZBVUxUUzsKLQotCWF0NzZfZGJnKERCR19JT0NUTCwgIiVzOiBBVDc2X1NFVF9ERUJVRywgb2xkIDB4JXgsIG5ldyAweCV4IiwKLQkJIG5ldGRldi0+bmFtZSwgYXQ3Nl9kZWJ1ZywgdmFsKTsKLQotCS8qIGphbDogc29tZSBtb3JlIG91dHB1dCB0byBwaW4gZG93biBsb2NrdXBzICovCi0JYXQ3Nl9kYmcoREJHX0lPQ1RMLCAiJXM6IG5ldGlmIHJ1bm5pbmcgJWQgcXVldWVfc3RvcHBlZCAlZCAiCi0JCSAiY2Fycmllcl9vayAlZCIsIG5ldGRldi0+bmFtZSwgbmV0aWZfcnVubmluZyhuZXRkZXYpLAotCQkgbmV0aWZfcXVldWVfc3RvcHBlZChuZXRkZXYpLCBuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpOwotCi0JYXQ3Nl9kZWJ1ZyA9IHZhbDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfZ2V0X2RlYnVnKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQotewotCXNucHJpbnRmKHdycXUtPm5hbWUsIHNpemVvZih3cnF1LT5uYW1lKSwgIjB4JTA4eCIsIGF0NzZfZGVidWcpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfc2V0X3Bvd2Vyc2F2ZV9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgY2hhciAqbmFtZSwKLQkJCQkgICAgICBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgdmFsID0gKigoaW50ICopbmFtZSk7Ci0JaW50IHJldCA9IC1FSVdDT01NSVQ7Ci0KLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogQVQ3Nl9TRVRfUE9XRVJTQVZFX01PREUsICVkICglcykiLAotCQkgbmV0ZGV2LT5uYW1lLCB2YWwsCi0JCSB2YWwgPT0gQVQ3Nl9QTV9PRkYgPyAiYWN0aXZlIiA6IHZhbCA9PSBBVDc2X1BNX09OID8gInNhdmUiIDoKLQkJIHZhbCA9PSBBVDc2X1BNX1NNQVJUID8gInNtYXJ0IHNhdmUiIDogIjxpbnZhbGlkPiIpOwotCWlmICh2YWwgPCBBVDc2X1BNX09GRiB8fCB2YWwgPiBBVDc2X1BNX1NNQVJUKQotCQlyZXQgPSAtRUlOVkFMOwotCWVsc2UKLQkJcHJpdi0+cG1fbW9kZSA9IHZhbDsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19nZXRfcG93ZXJzYXZlX21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCWludCAqcGFyYW0gPSAoaW50ICopZXh0cmE7Ci0KLQlwYXJhbVswXSA9IHByaXYtPnBtX21vZGU7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19zZXRfc2Nhbl90aW1lcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgY2hhciAqbmFtZSwKLQkJCQkgIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCWludCBtaW50ID0gKigoaW50ICopbmFtZSk7Ci0JaW50IG1heHQgPSAqKChpbnQgKiluYW1lICsgMSk7Ci0JaW50IHJldCA9IC1FSVdDT01NSVQ7Ci0KLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogQVQ3Nl9TRVRfU0NBTl9USU1FUyAtIG1pbiAlZCBtYXggJWQiLAotCQkgbmV0ZGV2LT5uYW1lLCBtaW50LCBtYXh0KTsKLQlpZiAobWludCA8PSAwIHx8IG1heHQgPD0gMCB8fCBtaW50ID4gbWF4dCkKLQkJcmV0ID0gLUVJTlZBTDsKLQllbHNlIHsKLQkJcHJpdi0+c2Nhbl9taW5fdGltZSA9IG1pbnQ7Ci0JCXByaXYtPnNjYW5fbWF4X3RpbWUgPSBtYXh0OwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9pd19nZXRfc2Nhbl90aW1lcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCWludCAqcGFyYW0gPSAoaW50ICopZXh0cmE7Ci0KLQlwYXJhbVswXSA9IHByaXYtPnNjYW5fbWluX3RpbWU7Ci0JcGFyYW1bMV0gPSBwcml2LT5zY2FuX21heF90aW1lOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF0NzZfaXdfc2V0X3NjYW5fbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCBjaGFyICpuYW1lLAotCQkJCSBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgdmFsID0gKigoaW50ICopbmFtZSk7Ci0JaW50IHJldCA9IC1FSVdDT01NSVQ7Ci0KLQlhdDc2X2RiZyhEQkdfSU9DVEwsICIlczogQVQ3Nl9TRVRfU0NBTl9NT0RFIC0gbW9kZSAlcyIsCi0JCSBuZXRkZXYtPm5hbWUsICh2YWwgPSBTQ0FOX1RZUEVfQUNUSVZFKSA/ICJhY3RpdmUiIDoKLQkJICh2YWwgPSBTQ0FOX1RZUEVfUEFTU0lWRSkgPyAicGFzc2l2ZSIgOiAiPGludmFsaWQ+Iik7Ci0KLQlpZiAodmFsICE9IFNDQU5fVFlQRV9BQ1RJVkUgJiYgdmFsICE9IFNDQU5fVFlQRV9QQVNTSVZFKQotCQlyZXQgPSAtRUlOVkFMOwotCWVsc2UKLQkJcHJpdi0+c2Nhbl9tb2RlID0gdmFsOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhdDc2X2l3X2dldF9zY2FuX21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JaW50ICpwYXJhbSA9IChpbnQgKilleHRyYTsKLQotCXBhcmFtWzBdID0gcHJpdi0+c2Nhbl9tb2RlOwotCXJldHVybiAwOwotfQotCi0jZGVmaW5lIEFUNzZfU0VUX0hBTkRMRVIoaCwgZikgW2ggLSBTSU9DSVdGSVJTVF0gPSAoaXdfaGFuZGxlcikgZgotCi0vKiBTdGFuZGFyZCB3aXJlbGVzcyBoYW5kbGVycyAqLwotc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIgYXQ3Nl9oYW5kbGVyc1tdID0gewotCUFUNzZfU0VUX0hBTkRMRVIoU0lPQ1NJV0NPTU1JVCwgYXQ3Nl9pd19oYW5kbGVyX2NvbW1pdCksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DR0lXTkFNRSwgYXQ3Nl9pd19oYW5kbGVyX2dldF9uYW1lKSwKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NTSVdGUkVRLCBhdDc2X2l3X2hhbmRsZXJfc2V0X2ZyZXEpLAotCUFUNzZfU0VUX0hBTkRMRVIoU0lPQ0dJV0ZSRVEsIGF0NzZfaXdfaGFuZGxlcl9nZXRfZnJlcSksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DU0lXTU9ERSwgYXQ3Nl9pd19oYW5kbGVyX3NldF9tb2RlKSwKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NHSVdNT0RFLCBhdDc2X2l3X2hhbmRsZXJfZ2V0X21vZGUpLAotCUFUNzZfU0VUX0hBTkRMRVIoU0lPQ0dJV1JBTkdFLCBhdDc2X2l3X2hhbmRsZXJfZ2V0X3JhbmdlKSwKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NTSVdTUFksIGF0NzZfaXdfaGFuZGxlcl9zZXRfc3B5KSwKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NHSVdTUFksIGF0NzZfaXdfaGFuZGxlcl9nZXRfc3B5KSwKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NTSVdUSFJTUFksIGF0NzZfaXdfaGFuZGxlcl9zZXRfdGhyc3B5KSwKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NHSVdUSFJTUFksIGF0NzZfaXdfaGFuZGxlcl9nZXRfdGhyc3B5KSwKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NTSVdBUCwgYXQ3Nl9pd19oYW5kbGVyX3NldF93YXApLAotCUFUNzZfU0VUX0hBTkRMRVIoU0lPQ0dJV0FQLCBhdDc2X2l3X2hhbmRsZXJfZ2V0X3dhcCksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DU0lXU0NBTiwgYXQ3Nl9pd19oYW5kbGVyX3NldF9zY2FuKSwKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NHSVdTQ0FOLCBhdDc2X2l3X2hhbmRsZXJfZ2V0X3NjYW4pLAotCUFUNzZfU0VUX0hBTkRMRVIoU0lPQ1NJV0VTU0lELCBhdDc2X2l3X2hhbmRsZXJfc2V0X2Vzc2lkKSwKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NHSVdFU1NJRCwgYXQ3Nl9pd19oYW5kbGVyX2dldF9lc3NpZCksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DU0lXUkFURSwgYXQ3Nl9pd19oYW5kbGVyX3NldF9yYXRlKSwKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NHSVdSQVRFLCBhdDc2X2l3X2hhbmRsZXJfZ2V0X3JhdGUpLAotCUFUNzZfU0VUX0hBTkRMRVIoU0lPQ1NJV1JUUywgYXQ3Nl9pd19oYW5kbGVyX3NldF9ydHMpLAotCUFUNzZfU0VUX0hBTkRMRVIoU0lPQ0dJV1JUUywgYXQ3Nl9pd19oYW5kbGVyX2dldF9ydHMpLAotCUFUNzZfU0VUX0hBTkRMRVIoU0lPQ1NJV0ZSQUcsIGF0NzZfaXdfaGFuZGxlcl9zZXRfZnJhZyksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DR0lXRlJBRywgYXQ3Nl9pd19oYW5kbGVyX2dldF9mcmFnKSwKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NHSVdUWFBPVywgYXQ3Nl9pd19oYW5kbGVyX2dldF90eHBvdyksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DU0lXUkVUUlksIGF0NzZfaXdfaGFuZGxlcl9zZXRfcmV0cnkpLAotCUFUNzZfU0VUX0hBTkRMRVIoU0lPQ0dJV1JFVFJZLCBhdDc2X2l3X2hhbmRsZXJfZ2V0X3JldHJ5KSwKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NTSVdFTkNPREUsIGF0NzZfaXdfaGFuZGxlcl9zZXRfZW5jb2RlKSwKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NHSVdFTkNPREUsIGF0NzZfaXdfaGFuZGxlcl9nZXRfZW5jb2RlKSwKLQlBVDc2X1NFVF9IQU5ETEVSKFNJT0NTSVdQT1dFUiwgYXQ3Nl9pd19oYW5kbGVyX3NldF9wb3dlciksCi0JQVQ3Nl9TRVRfSEFORExFUihTSU9DR0lXUE9XRVIsIGF0NzZfaXdfaGFuZGxlcl9nZXRfcG93ZXIpCi19OwotCi0jZGVmaW5lIEFUNzZfU0VUX1BSSVYoaCwgZikgW2ggLSBTSU9DSVdGSVJTVFBSSVZdID0gKGl3X2hhbmRsZXIpIGYKLQotLyogUHJpdmF0ZSB3aXJlbGVzcyBoYW5kbGVycyAqLwotc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIgYXQ3Nl9wcml2X2hhbmRsZXJzW10gPSB7Ci0JQVQ3Nl9TRVRfUFJJVihBVDc2X1NFVF9TSE9SVF9QUkVBTUJMRSwgYXQ3Nl9pd19zZXRfc2hvcnRfcHJlYW1ibGUpLAotCUFUNzZfU0VUX1BSSVYoQVQ3Nl9HRVRfU0hPUlRfUFJFQU1CTEUsIGF0NzZfaXdfZ2V0X3Nob3J0X3ByZWFtYmxlKSwKLQlBVDc2X1NFVF9QUklWKEFUNzZfU0VUX0RFQlVHLCBhdDc2X2l3X3NldF9kZWJ1ZyksCi0JQVQ3Nl9TRVRfUFJJVihBVDc2X0dFVF9ERUJVRywgYXQ3Nl9pd19nZXRfZGVidWcpLAotCUFUNzZfU0VUX1BSSVYoQVQ3Nl9TRVRfUE9XRVJTQVZFX01PREUsIGF0NzZfaXdfc2V0X3Bvd2Vyc2F2ZV9tb2RlKSwKLQlBVDc2X1NFVF9QUklWKEFUNzZfR0VUX1BPV0VSU0FWRV9NT0RFLCBhdDc2X2l3X2dldF9wb3dlcnNhdmVfbW9kZSksCi0JQVQ3Nl9TRVRfUFJJVihBVDc2X1NFVF9TQ0FOX1RJTUVTLCBhdDc2X2l3X3NldF9zY2FuX3RpbWVzKSwKLQlBVDc2X1NFVF9QUklWKEFUNzZfR0VUX1NDQU5fVElNRVMsIGF0NzZfaXdfZ2V0X3NjYW5fdGltZXMpLAotCUFUNzZfU0VUX1BSSVYoQVQ3Nl9TRVRfU0NBTl9NT0RFLCBhdDc2X2l3X3NldF9zY2FuX21vZGUpLAotCUFUNzZfU0VUX1BSSVYoQVQ3Nl9HRVRfU0NBTl9NT0RFLCBhdDc2X2l3X2dldF9zY2FuX21vZGUpLAotfTsKLQotLyogTmFtZXMgYW5kIGFyZ3VtZW50cyBvZiBwcml2YXRlIHdpcmVsZXNzIGhhbmRsZXJzICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGl3X3ByaXZfYXJncyBhdDc2X3ByaXZfYXJnc1tdID0gewotCS8qIDAgLSBsb25nLCAxIC0gc2hvcnQgKi8KLQl7QVQ3Nl9TRVRfU0hPUlRfUFJFQU1CTEUsCi0JIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAic2V0X3ByZWFtYmxlIn0sCi0KLQl7QVQ3Nl9HRVRfU0hPUlRfUFJFQU1CTEUsCi0JIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMTAsICJnZXRfcHJlYW1ibGUifSwKLQotCS8qIHdlIG11c3QgcGFzcyB0aGUgbmV3IGRlYnVnIG1hc2sgYXMgYSBzdHJpbmcsIGJlY2F1c2UgaXdwcml2IGNhbm5vdAotCSAqIHBhcnNlIGhleCBudW1iZXJzIHN0YXJ0aW5nIHdpdGggMHggOi0oICAqLwotCXtBVDc2X1NFVF9ERUJVRywKLQkgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMCwgMCwgInNldF9kZWJ1ZyJ9LAotCi0Je0FUNzZfR0VUX0RFQlVHLAotCSAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEwLCAiZ2V0X2RlYnVnIn0sCi0KLQkvKiAxIC0gYWN0aXZlLCAyIC0gcG93ZXIgc2F2ZSwgMyAtIHNtYXJ0IHBvd2VyIHNhdmUgKi8KLQl7QVQ3Nl9TRVRfUE9XRVJTQVZFX01PREUsCi0JIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAic2V0X3Bvd2Vyc2F2ZSJ9LAotCi0Je0FUNzZfR0VUX1BPV0VSU0FWRV9NT0RFLAotCSAwLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgImdldF9wb3dlcnNhdmUifSwKLQotCS8qIG1pbl9jaGFubmVsX3RpbWUsIG1heF9jaGFubmVsX3RpbWUgKi8KLQl7QVQ3Nl9TRVRfU0NBTl9USU1FUywKLQkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDIsIDAsICJzZXRfc2Nhbl90aW1lcyJ9LAotCi0Je0FUNzZfR0VUX1NDQU5fVElNRVMsCi0JIDAsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAyLCAiZ2V0X3NjYW5fdGltZXMifSwKLQotCS8qIDAgLSBhY3RpdmUsIDEgLSBwYXNzaXZlIHNjYW4gKi8KLQl7QVQ3Nl9TRVRfU0NBTl9NT0RFLAotCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgInNldF9zY2FuX21vZGUifSwKLQotCXtBVDc2X0dFVF9TQ0FOX01PREUsCi0JIDAsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiZ2V0X3NjYW5fbW9kZSJ9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZiBhdDc2X2hhbmRsZXJfZGVmID0gewotCS5udW1fc3RhbmRhcmQgPSBBUlJBWV9TSVpFKGF0NzZfaGFuZGxlcnMpLAotCS5udW1fcHJpdmF0ZSA9IEFSUkFZX1NJWkUoYXQ3Nl9wcml2X2hhbmRsZXJzKSwKLQkubnVtX3ByaXZhdGVfYXJncyA9IEFSUkFZX1NJWkUoYXQ3Nl9wcml2X2FyZ3MpLAotCS5zdGFuZGFyZCA9IGF0NzZfaGFuZGxlcnMsCi0JLnByaXZhdGUgPSBhdDc2X3ByaXZfaGFuZGxlcnMsCi0JLnByaXZhdGVfYXJncyA9IGF0NzZfcHJpdl9hcmdzLAotCS5nZXRfd2lyZWxlc3Nfc3RhdHMgPSBhdDc2X2dldF93aXJlbGVzc19zdGF0cywKLX07Ci0KLXN0YXRpYyBjb25zdCB1OCBzbmFwc2lnW10gPSB7IDB4YWEsIDB4YWEsIDB4MDMgfTsKLQotLyogUkZDIDEwNDIgZW5jYXBzdWxhdGVzIEV0aGVybmV0IGZyYW1lcyBpbiA4MDIuMiBTTkFQICgweGFhLCAweGFhLCAweDAzKSB3aXRoCi0gKiBhIFNOQVAgT0lEIG9mIDAgKDB4MDAsIDB4MDAsIDB4MDApICovCi1zdGF0aWMgY29uc3QgdTggcmZjMTA0MnNpZ1tdID0geyAweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweDAwIH07Ci0KLXN0YXRpYyBpbnQgYXQ3Nl90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZwcml2LT5zdGF0czsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgd2xlbjsKLQlpbnQgc3VibWl0X2xlbjsKLQlzdHJ1Y3QgYXQ3Nl90eF9idWZmZXIgKnR4X2J1ZmZlciA9IHByaXYtPmJ1bGtfb3V0X2J1ZmZlcjsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqaTgwMl8xMV9oZHIgPQotCSAgICAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKil0eF9idWZmZXItPnBhY2tldDsKLQl1OCAqcGF5bG9hZCA9IGk4MDJfMTFfaGRyLT5wYXlsb2FkOwotCXN0cnVjdCBldGhoZHIgKmVoID0gKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGE7Ci0KLQlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChuZXRkZXYpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzIGNhbGxlZCB3aGlsZSBuZXRkZXYgaXMgc3RvcHBlZFxuIiwKLQkJICAgICAgIG5ldGRldi0+bmFtZSwgX19mdW5jX18pOwotCQkvKiBza2lwIHRoaXMgcGFja2V0ICovCi0JCWRldl9rZnJlZV9za2Ioc2tiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKHByaXYtPnR4X3VyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlcyBjYWxsZWQgd2hpbGUgdHggdXJiIGlzIHBlbmRpbmdcbiIsCi0JCSAgICAgICBuZXRkZXYtPm5hbWUsIF9fZnVuY19fKTsKLQkJLyogc2tpcCB0aGlzIHBhY2tldCAqLwotCQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChza2ItPmxlbiA8IEVUSF9ITEVOKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzOiBza2IgdG9vIHNob3J0ICglZClcbiIsCi0JCSAgICAgICBuZXRkZXYtPm5hbWUsIF9fZnVuY19fLCBza2ItPmxlbik7Ci0JCWRldl9rZnJlZV9za2Ioc2tiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JYXQ3Nl9sZWR0cmlnX3R4X2FjdGl2aXR5KCk7CS8qIHRlbGwgbGVkdHJpZ2dlciB3ZSBzZW5kIGEgcGFja2V0ICovCi0KLQkvKiB3ZSBjYW4gZ2V0IHJpZCBvZiBtZW1jcHkgaWYgd2Ugc2V0IG5ldGRldi0+aGFyZF9oZWFkZXJfbGVuIHRvCi0JICAgcmVzZXJ2ZSBlbm91Z2ggc3BhY2UsIGJ1dCB3ZSB3b3VsZCBuZWVkIHRvIGtlZXAgdGhlIHNrYiBhcm91bmQgKi8KLQotCWlmIChudG9ocyhlaC0+aF9wcm90bykgPD0gRVRIX0RBVEFfTEVOKSB7Ci0JCS8qIHRoaXMgaXMgYSA4MDIuMyBwYWNrZXQgKi8KLQkJaWYgKHNrYi0+bGVuID49IEVUSF9ITEVOICsgc2l6ZW9mKHJmYzEwNDJzaWcpCi0JCSAgICAmJiBza2ItPmRhdGFbRVRIX0hMRU5dID09IHJmYzEwNDJzaWdbMF0KLQkJICAgICYmIHNrYi0+ZGF0YVtFVEhfSExFTiArIDFdID09IHJmYzEwNDJzaWdbMV0pIHsKLQkJCS8qIGhpZ2hlciBsYXllciBkZWxpdmVyZWQgU05BUCBoZWFkZXIgLSBrZWVwIGl0ICovCi0JCQltZW1jcHkocGF5bG9hZCwgc2tiLT5kYXRhICsgRVRIX0hMRU4sCi0JCQkgICAgICAgc2tiLT5sZW4gLSBFVEhfSExFTik7Ci0JCQl3bGVuID0gSUVFRTgwMjExXzNBRERSX0xFTiArIHNrYi0+bGVuIC0gRVRIX0hMRU47Ci0JCX0gZWxzZSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBkcm9wcGluZyBub24tU05BUCA4MDIuMiBwYWNrZXQgIgotCQkJICAgICAgICIoRFNBUCAweCUwMnggU1NBUCAweCUwMnggY250cmwgMHglMDJ4KVxuIiwKLQkJCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHNrYi0+ZGF0YVtFVEhfSExFTl0sCi0JCQkgICAgICAgc2tiLT5kYXRhW0VUSF9ITEVOICsgMV0sCi0JCQkgICAgICAgc2tiLT5kYXRhW0VUSF9ITEVOICsgMl0pOwotCQkJZGV2X2tmcmVlX3NrYihza2IpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBhZGQgUkZDIDEwNDIgaGVhZGVyIGluIGZyb250ICovCi0JCW1lbWNweShwYXlsb2FkLCByZmMxMDQyc2lnLCBzaXplb2YocmZjMTA0MnNpZykpOwotCQltZW1jcHkocGF5bG9hZCArIHNpemVvZihyZmMxMDQyc2lnKSwgJmVoLT5oX3Byb3RvLAotCQkgICAgICAgc2tiLT5sZW4gLSBvZmZzZXRvZihzdHJ1Y3QgZXRoaGRyLCBoX3Byb3RvKSk7Ci0JCXdsZW4gPSBJRUVFODAyMTFfM0FERFJfTEVOICsgc2l6ZW9mKHJmYzEwNDJzaWcpICsgc2tiLT5sZW4gLQotCQkgICAgb2Zmc2V0b2Yoc3RydWN0IGV0aGhkciwgaF9wcm90byk7Ci0JfQotCi0JLyogbWFrZSB3aXJlbGVzcyBoZWFkZXIgKi8KLQlpODAyXzExX2hkci0+ZnJhbWVfY3RsID0KLQkgICAgY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX0RBVEEgfAotCQkJKHByaXYtPndlcF9lbmFibGVkID8gSUVFRTgwMjExX0ZDVExfUFJPVEVDVEVEIDogMCkgfAotCQkJKHByaXYtPml3X21vZGUgPT0KLQkJCSBJV19NT0RFX0lORlJBID8gSUVFRTgwMjExX0ZDVExfVE9EUyA6IDApKTsKLQotCWlmIChwcml2LT5pd19tb2RlID09IElXX01PREVfQURIT0MpIHsKLQkJbWVtY3B5KGk4MDJfMTFfaGRyLT5hZGRyMSwgZWgtPmhfZGVzdCwgRVRIX0FMRU4pOwotCQltZW1jcHkoaTgwMl8xMV9oZHItPmFkZHIyLCBlaC0+aF9zb3VyY2UsIEVUSF9BTEVOKTsKLQkJbWVtY3B5KGk4MDJfMTFfaGRyLT5hZGRyMywgcHJpdi0+YnNzaWQsIEVUSF9BTEVOKTsKLQl9IGVsc2UgaWYgKHByaXYtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkgewotCQltZW1jcHkoaTgwMl8xMV9oZHItPmFkZHIxLCBwcml2LT5ic3NpZCwgRVRIX0FMRU4pOwotCQltZW1jcHkoaTgwMl8xMV9oZHItPmFkZHIyLCBlaC0+aF9zb3VyY2UsIEVUSF9BTEVOKTsKLQkJbWVtY3B5KGk4MDJfMTFfaGRyLT5hZGRyMywgZWgtPmhfZGVzdCwgRVRIX0FMRU4pOwotCX0KLQotCWk4MDJfMTFfaGRyLT5kdXJhdGlvbl9pZCA9IGNwdV90b19sZTE2KDApOwotCWk4MDJfMTFfaGRyLT5zZXFfY3RsID0gY3B1X3RvX2xlMTYoMCk7Ci0KLQkvKiBzZXR1cCAnQXRtZWwnIGhlYWRlciAqLwotCXR4X2J1ZmZlci0+d2xlbmd0aCA9IGNwdV90b19sZTE2KHdsZW4pOwotCXR4X2J1ZmZlci0+dHhfcmF0ZSA9IHByaXYtPnR4cmF0ZTsKLQkvKiBmb3IgYnJvYWRjYXN0IGRlc3RpbmF0aW9uIGFkZHJlc3NlcywgdGhlIGZpcm13YXJlIDAuMTAwLngKLQkgICBzZWVtcyB0byBjaG9vc2UgdGhlIGhpZ2hlc3QgcmF0ZSBzZXQgd2l0aCBDTURfU1RBUlRVUCBpbgotCSAgIGJhc2ljX3JhdGVfc2V0IHJlcGxhY2luZyB0aGlzIHZhbHVlICovCi0KLQltZW1zZXQodHhfYnVmZmVyLT5yZXNlcnZlZCwgMCwgc2l6ZW9mKHR4X2J1ZmZlci0+cmVzZXJ2ZWQpKTsKLQotCXR4X2J1ZmZlci0+cGFkZGluZyA9IGF0NzZfY2FsY19wYWRkaW5nKHdsZW4pOwotCXN1Ym1pdF9sZW4gPSB3bGVuICsgQVQ3Nl9UWF9IRFJMRU4gKyB0eF9idWZmZXItPnBhZGRpbmc7Ci0KLQlhdDc2X2RiZyhEQkdfVFhfREFUQV9DT05URU5ULCAiJXMgc2tiLT5kYXRhICVzIiwgcHJpdi0+bmV0ZGV2LT5uYW1lLAotCQkgaGV4MnN0cihza2ItPmRhdGEsIDMyKSk7Ci0JYXQ3Nl9kYmcoREJHX1RYX0RBVEEsICIlcyB0eDogd2xlbiAweCV4IHBhZCAweCV4IHJhdGUgJWQgaGRyICVzIiwKLQkJIHByaXYtPm5ldGRldi0+bmFtZSwKLQkJIGxlMTZfdG9fY3B1KHR4X2J1ZmZlci0+d2xlbmd0aCksCi0JCSB0eF9idWZmZXItPnBhZGRpbmcsIHR4X2J1ZmZlci0+dHhfcmF0ZSwKLQkJIGhleDJzdHIoaTgwMl8xMV9oZHIsIHNpemVvZigqaTgwMl8xMV9oZHIpKSk7Ci0JYXQ3Nl9kYmcoREJHX1RYX0RBVEFfQ09OVEVOVCwgIiVzIHBheWxvYWQgJXMiLCBwcml2LT5uZXRkZXYtPm5hbWUsCi0JCSBoZXgyc3RyKHBheWxvYWQsIDQ4KSk7Ci0KLQkvKiBzZW5kIHN0dWZmICovCi0JbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOwotCW5ldGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwotCi0JdXNiX2ZpbGxfYnVsa191cmIocHJpdi0+dHhfdXJiLCBwcml2LT51ZGV2LCBwcml2LT50eF9waXBlLCB0eF9idWZmZXIsCi0JCQkgIHN1Ym1pdF9sZW4sIGF0NzZfdHhfY2FsbGJhY2ssIHByaXYpOwotCXJldCA9IHVzYl9zdWJtaXRfdXJiKHByaXYtPnR4X3VyYiwgR0ZQX0FUT01JQyk7Ci0JaWYgKHJldCkgewotCQlzdGF0cy0+dHhfZXJyb3JzKys7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGVycm9yIGluIHR4IHN1Ym1pdCB1cmI6ICVkXG4iLAotCQkgICAgICAgbmV0ZGV2LT5uYW1lLCByZXQpOwotCQlpZiAocmV0ID09IC1FSU5WQUwpCi0JCQlwcmludGsoS0VSTl9FUlIKLQkJCSAgICAgICAiJXM6IC1FSU5WQUw6IHR4IHVyYiAlcCBoY3ByaXYgJXAgY29tcGxldGUgJXBcbiIsCi0JCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCBwcml2LT50eF91cmIsCi0JCQkgICAgICAgcHJpdi0+dHhfdXJiLT5oY3ByaXYsIHByaXYtPnR4X3VyYi0+Y29tcGxldGUpOwotCX0gZWxzZSB7Ci0JCXN0YXRzLT50eF9ieXRlcyArPSBza2ItPmxlbjsKLQkJZGV2X2tmcmVlX3NrYihza2IpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGF0NzZfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCi0JaWYgKCFwcml2KQotCQlyZXR1cm47Ci0JZGV2X3dhcm4oJm5ldGRldi0+ZGV2LCAidHggdGltZW91dC4iKTsKLQotCXVzYl91bmxpbmtfdXJiKHByaXYtPnR4X3VyYik7Ci0JcHJpdi0+c3RhdHMudHhfZXJyb3JzKys7Ci19Ci0KIHN0YXRpYyBpbnQgYXQ3Nl9zdWJtaXRfcnhfdXJiKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYpCiB7CiAJaW50IHJldDsKQEAgLTMyNTYsNyArMTMyNyw3IEBACiAKIAlpZiAoIXByaXYtPnJ4X3VyYikgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlczogcHJpdi0+cnhfdXJiIGlzIE5VTExcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIF9fZnVuY19fKTsKKwkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKQEAgLTMyNjQsNyArMTMzNSw3IEBACiAJCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKHN0cnVjdCBhdDc2X3J4X2J1ZmZlcikpOwogCQlpZiAoIXNrYikgewogCQkJcHJpbnRrKEtFUk5fRVJSICIlczogY2Fubm90IGFsbG9jYXRlIHJ4IHNrYnVmZlxuIiwKLQkJCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUpOworCQkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSk7CiAJCQlyZXQgPSAtRU5PTUVNOwogCQkJZ290byBleGl0OwogCQl9CkBAIC0zMjg0LDExMCArMTM1NSwxOCBAQAogCQkJCSAidXNiX3N1Ym1pdF91cmIgcmV0dXJuZWQgLUVOT0RFViIpOwogCQllbHNlCiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiByeCwgdXNiX3N1Ym1pdF91cmIgZmFpbGVkOiAlZFxuIiwKLQkJCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7CisJCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCByZXQpOwogCX0KIAogZXhpdDoKIAlpZiAocmV0IDwgMCAmJiByZXQgIT0gLUVOT0RFVikKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogY2Fubm90IHN1Ym1pdCByeCB1cmIgLSBwbGVhc2UgdW5sb2FkIHRoZSAiCiAJCSAgICAgICAiZHJpdmVyIGFuZC9vciBwb3dlciBjeWNsZSB0aGUgZGV2aWNlXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lKTsKKwkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSk7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGF0NzZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCWludCByZXQgPSAwOwotCi0JYXQ3Nl9kYmcoREJHX1BST0NfRU5UUlksICIlcygpOiBlbnRyeSIsIF9fZnVuY19fKTsKLQotCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnByaXYtPm10eCkpCi0JCXJldHVybiAtRUlOVFI7Ci0KLQkvKiBpZiBuZXRkZXYtPmRldl9hZGRyICE9IHByaXYtPm1hY19hZGRyIHdlIG11c3QKLQkgICBzZXQgdGhlIG1hYyBhZGRyZXNzIGluIHRoZSBkZXZpY2UgISAqLwotCWlmIChjb21wYXJlX2V0aGVyX2FkZHIobmV0ZGV2LT5kZXZfYWRkciwgcHJpdi0+bWFjX2FkZHIpKSB7Ci0JCWlmIChhdDc2X2FkZF9tYWNfYWRkcmVzcyhwcml2LCBuZXRkZXYtPmRldl9hZGRyKSA+PSAwKQotCQkJYXQ3Nl9kYmcoREJHX1BST0dSRVNTLCAiJXM6IHNldCBuZXcgTUFDIGFkZHIgJXMiLAotCQkJCSBuZXRkZXYtPm5hbWUsIG1hYzJzdHIobmV0ZGV2LT5kZXZfYWRkcikpOwotCX0KLQotCXByaXYtPnNjYW5fc3RhdGUgPSBTQ0FOX0lETEU7Ci0JcHJpdi0+bGFzdF9zY2FuID0gamlmZmllczsKLQotCXJldCA9IGF0NzZfc3VibWl0X3J4X3VyYihwcml2KTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBvcGVuOiBzdWJtaXRfcnhfdXJiIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBuZXRkZXYtPm5hbWUsIHJldCk7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19yZXN0YXJ0LCAwKTsKLQotCWF0NzZfZGJnKERCR19QUk9DX0VOVFJZLCAiJXMoKTogZW5kIiwgX19mdW5jX18pOwotZXJyb3I6Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdHgpOwotCXJldHVybiByZXQgPCAwID8gcmV0IDogMDsKLX0KLQotc3RhdGljIGludCBhdDc2X3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQotCWF0NzZfZGJnKERCR19ERVZTVEFSVCwgIiVzOiBFTlRFUiIsIF9fZnVuY19fKTsKLQotCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnByaXYtPm10eCkpCi0JCXJldHVybiAtRUlOVFI7Ci0KLQlhdDc2X3F1aWVzY2UocHJpdik7Ci0KLQlpZiAoIXByaXYtPmRldmljZV91bnBsdWdnZWQpIHsKLQkJLyogV2UgYXJlIGNhbGxlZCBieSAiaWZjb25maWcgZXRoWCBkb3duIiwgbm90IGJlY2F1c2UgdGhlCi0JCSAqIGRldmljZSBpcyBub3QgYXZhaWxhYmxlIGFueW1vcmUuICovCi0JCWF0NzZfc2V0X3JhZGlvKHByaXYsIDApOwotCi0JCS8qIFdlIHVubGluayByeF91cmIgYmVjYXVzZSBhdDc2X29wZW4oKSByZS1zdWJtaXRzIGl0LgotCQkgKiBJZiB1bnBsdWdnZWQsIGF0NzZfZGVsZXRlX2RldmljZSgpIHRha2VzIGNhcmUgb2YgaXQuICovCi0JCXVzYl9raWxsX3VyYihwcml2LT5yeF91cmIpOwotCX0KLQotCS8qIGZyZWUgdGhlIGJzc19saXN0ICovCi0JYXQ3Nl9mcmVlX2Jzc19saXN0KHByaXYpOwotCi0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdHgpOwotCWF0NzZfZGJnKERCR19ERVZTVEFSVCwgIiVzOiBFWElUIiwgX19mdW5jX18pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGF0NzZfZXRodG9vbF9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQotCXN0cm5jcHkoaW5mby0+ZHJpdmVyLCBEUklWRVJfTkFNRSwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOwotCXN0cm5jcHkoaW5mby0+dmVyc2lvbiwgRFJJVkVSX1ZFUlNJT04sIHNpemVvZihpbmZvLT52ZXJzaW9uKSk7Ci0KLQl1c2JfbWFrZV9wYXRoKHByaXYtPnVkZXYsIGluZm8tPmJ1c19pbmZvLCBzaXplb2YoaW5mby0+YnVzX2luZm8pKTsKLQotCXNucHJpbnRmKGluZm8tPmZ3X3ZlcnNpb24sIHNpemVvZihpbmZvLT5md192ZXJzaW9uKSwgIiVkLiVkLiVkLSVkIiwKLQkJIHByaXYtPmZ3X3ZlcnNpb24ubWFqb3IsIHByaXYtPmZ3X3ZlcnNpb24ubWlub3IsCi0JCSBwcml2LT5md192ZXJzaW9uLnBhdGNoLCBwcml2LT5md192ZXJzaW9uLmJ1aWxkKTsKLX0KLQotc3RhdGljIHUzMiBhdDc2X2V0aHRvb2xfZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKLXsKLQlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlyZXR1cm4gcHJpdi0+bWFjX3N0YXRlID09IE1BQ19DT05ORUNURUQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgYXQ3Nl9ldGh0b29sX29wcyA9IHsKLQkuZ2V0X2RydmluZm8gPSBhdDc2X2V0aHRvb2xfZ2V0X2RydmluZm8sCi0JLmdldF9saW5rID0gYXQ3Nl9ldGh0b29sX2dldF9saW5rLAotfTsKLQogLyogRG93bmxvYWQgZXh0ZXJuYWwgZmlybXdhcmUgKi8KIHN0YXRpYyBpbnQgYXQ3Nl9sb2FkX2V4dGVybmFsX2Z3KHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBzdHJ1Y3QgZndlbnRyeSAqZndlKQogewpAQCAtMzQ4NCw0MDYgKzE0NjMsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgYXQ3Nl9tYXRjaF9lc3NpZChzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2LCBzdHJ1Y3QgYnNzX2luZm8gKnB0cikKLXsKLQkvKiBjb21tb24gY3JpdGVyaWEgZm9yIGJvdGggbW9kaSAqLwotCi0JaW50IHJldCA9IChwcml2LT5lc3NpZF9zaXplID09IDAgLyogQU5ZIHNzaWQgKi8gIHx8Ci0JCSAgIChwcml2LT5lc3NpZF9zaXplID09IHB0ci0+c3NpZF9sZW4gJiYKLQkJICAgICFtZW1jbXAocHJpdi0+ZXNzaWQsIHB0ci0+c3NpZCwgcHRyLT5zc2lkX2xlbikpKTsKLQlpZiAoIXJldCkKLQkJYXQ3Nl9kYmcoREJHX0JTU19NQVRDSCwKLQkJCSAiJXMgYnNzIHRhYmxlIGVudHJ5ICVwOiBlc3NpZCBkaWRuJ3QgbWF0Y2giLAotCQkJIHByaXYtPm5ldGRldi0+bmFtZSwgcHRyKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW5saW5lIGludCBhdDc2X21hdGNoX21vZGUoc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwgc3RydWN0IGJzc19pbmZvICpwdHIpCi17Ci0JaW50IHJldDsKLQotCWlmIChwcml2LT5pd19tb2RlID09IElXX01PREVfQURIT0MpCi0JCXJldCA9IHB0ci0+Y2FwYSAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTOwotCWVsc2UKLQkJcmV0ID0gcHRyLT5jYXBhICYgV0xBTl9DQVBBQklMSVRZX0VTUzsKLQlpZiAoIXJldCkKLQkJYXQ3Nl9kYmcoREJHX0JTU19NQVRDSCwKLQkJCSAiJXMgYnNzIHRhYmxlIGVudHJ5ICVwOiBtb2RlIGRpZG4ndCBtYXRjaCIsCi0JCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBwdHIpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ3Nl9tYXRjaF9yYXRlcyhzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2LCBzdHJ1Y3QgYnNzX2luZm8gKnB0cikKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBwdHItPnJhdGVzX2xlbjsgaSsrKSB7Ci0JCXU4IHJhdGUgPSBwdHItPnJhdGVzW2ldOwotCi0JCWlmICghKHJhdGUgJiAweDgwKSkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIHRoaXMgaXMgYSBiYXNpYyByYXRlIHdlIGhhdmUgdG8gc3VwcG9ydAotCQkgICAoc2VlIElFRUU4MDIuMTEsIGNoLiA3LjMuMi4yKSAqLwotCQlpZiAocmF0ZSAhPSAoMHg4MCB8IGh3X3JhdGVzWzBdKQotCQkgICAgJiYgcmF0ZSAhPSAoMHg4MCB8IGh3X3JhdGVzWzFdKQotCQkgICAgJiYgcmF0ZSAhPSAoMHg4MCB8IGh3X3JhdGVzWzJdKQotCQkgICAgJiYgcmF0ZSAhPSAoMHg4MCB8IGh3X3JhdGVzWzNdKSkgewotCQkJYXQ3Nl9kYmcoREJHX0JTU19NQVRDSCwKLQkJCQkgIiVzOiBic3MgdGFibGUgZW50cnkgJXA6IGJhc2ljIHJhdGUgJTAyeCBub3QgIgotCQkJCSAic3VwcG9ydGVkIiwgcHJpdi0+bmV0ZGV2LT5uYW1lLCBwdHIsIHJhdGUpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQkvKiBpZiB3ZSB1c2Ugc2hvcnQgcHJlYW1ibGUsIHRoZSBic3MgbXVzdCBzdXBwb3J0IGl0ICovCi0JaWYgKHByaXYtPnByZWFtYmxlX3R5cGUgPT0gUFJFQU1CTEVfVFlQRV9TSE9SVCAmJgotCSAgICAhKHB0ci0+Y2FwYSAmIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRSkpIHsKLQkJYXQ3Nl9kYmcoREJHX0JTU19NQVRDSCwKLQkJCSAiJXM6ICVwIGRvZXMgbm90IHN1cHBvcnQgc2hvcnQgcHJlYW1ibGUiLAotCQkJIHByaXYtPm5ldGRldi0+bmFtZSwgcHRyKTsKLQkJcmV0dXJuIDA7Ci0JfSBlbHNlCi0JCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBhdDc2X21hdGNoX3dlcChzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2LCBzdHJ1Y3QgYnNzX2luZm8gKnB0cikKLXsKLQlpZiAoIXByaXYtPndlcF9lbmFibGVkICYmIHB0ci0+Y2FwYSAmIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKSB7Ci0JCS8qIHdlIGhhdmUgZGlzYWJsZWQgV0VQLCBidXQgdGhlIEJTUyBzaWduYWxzIHByaXZhY3kgKi8KLQkJYXQ3Nl9kYmcoREJHX0JTU19NQVRDSCwKLQkJCSAiJXM6IGJzcyB0YWJsZSBlbnRyeSAlcDogcmVxdWlyZXMgZW5jcnlwdGlvbiIsCi0JCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBwdHIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JLyogb3RoZXJ3aXNlIGlmIHRoZSBCU1MgZG9lcyBub3Qgc2lnbmFsIHByaXZhY3kgaXQgbWF5IHdlbGwKLQkgICBhY2NlcHQgZW5jcnlwdGVkIHBhY2tldHMgZnJvbSB1cyAuLi4gKi8KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYXQ3Nl9tYXRjaF9ic3NpZChzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2LCBzdHJ1Y3QgYnNzX2luZm8gKnB0cikKLXsKLQlpZiAoIXByaXYtPndhbnRlZF9ic3NpZF92YWxpZCB8fAotCSAgICAhY29tcGFyZV9ldGhlcl9hZGRyKHB0ci0+YnNzaWQsIHByaXYtPndhbnRlZF9ic3NpZCkpCi0JCXJldHVybiAxOwotCi0JYXQ3Nl9kYmcoREJHX0JTU19NQVRDSCwKLQkJICIlczogcmVxdWVzdGVkIGJzc2lkIC0gJXMgZG9lcyBub3QgbWF0Y2giLAotCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBtYWMyc3RyKHByaXYtPndhbnRlZF9ic3NpZCkpOwotCWF0NzZfZGJnKERCR19CU1NfTUFUQ0gsCi0JCSAiICAgICAgQVAgYnNzaWQgLSAlcyBvZiBic3MgdGFibGUgZW50cnkgJXAiLAotCQkgbWFjMnN0cihwdHItPmJzc2lkKSwgcHRyKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBhdDc2X21hdGNoX2JzcyAtIHRyeSB0byBmaW5kIGEgbWF0Y2hpbmcgYnNzIGluIHByaXYtPmJzcwotICoKLSAqIGxhc3QgLSBsYXN0IGJzcyB0cmllZAotICoKLSAqIGxhc3QgPT0gTlVMTCBzaWduYWxzIGEgbmV3IHJvdW5kIHN0YXJ0aW5nIHdpdGggcHJpdi0+YnNzX2xpc3QubmV4dAotICogdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbnNpZGUgYW4gYWNxdWlyZWQgcHJpdi0+YnNzX2xpc3Rfc3BpbmxvY2sKLSAqIG90aGVyd2lzZSB0aGUgdGltZW91dCBvbiBic3MgbWF5IHJlbW92ZSB0aGUgbmV3bHkgY2hvc2VuIGVudHJ5Ci0gKi8KLXN0YXRpYyBzdHJ1Y3QgYnNzX2luZm8gKmF0NzZfbWF0Y2hfYnNzKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYsCi0JCQkJICAgICAgIHN0cnVjdCBic3NfaW5mbyAqbGFzdCkKLXsKLQlzdHJ1Y3QgYnNzX2luZm8gKnB0ciA9IE5VTEw7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqY3VycjsKLQotCWN1cnIgPSBsYXN0ID8gbGFzdC0+bGlzdC5uZXh0IDogcHJpdi0+YnNzX2xpc3QubmV4dDsKLQl3aGlsZSAoY3VyciAhPSAmcHJpdi0+YnNzX2xpc3QpIHsKLQkJcHRyID0gbGlzdF9lbnRyeShjdXJyLCBzdHJ1Y3QgYnNzX2luZm8sIGxpc3QpOwotCQlpZiAoYXQ3Nl9tYXRjaF9lc3NpZChwcml2LCBwdHIpICYmIGF0NzZfbWF0Y2hfbW9kZShwcml2LCBwdHIpCi0JCSAgICAmJiBhdDc2X21hdGNoX3dlcChwcml2LCBwdHIpICYmIGF0NzZfbWF0Y2hfcmF0ZXMocHJpdiwgcHRyKQotCQkgICAgJiYgYXQ3Nl9tYXRjaF9ic3NpZChwcml2LCBwdHIpKQotCQkJYnJlYWs7Ci0JCWN1cnIgPSBjdXJyLT5uZXh0OwotCX0KLQotCWlmIChjdXJyID09ICZwcml2LT5ic3NfbGlzdCkKLQkJcHRyID0gTlVMTDsKLQkvKiBvdGhlcndpc2UgcHRyIHBvaW50cyB0byB0aGUgc3RydWN0IGJzc19pbmZvIHdlIGhhdmUgY2hvc2VuICovCi0KLQlhdDc2X2RiZyhEQkdfQlNTX1RBQkxFLCAiJXMgJXM6IHJldHVybmVkICVwIiwgcHJpdi0+bmV0ZGV2LT5uYW1lLAotCQkgX19mdW5jX18sIHB0cik7Ci0JcmV0dXJuIHB0cjsKLX0KLQotLyogU3RhcnQgam9pbmluZyBhIG1hdGNoaW5nIEJTUywgb3IgY3JlYXRlIG93biBJQlNTICovCi1zdGF0aWMgdm9pZCBhdDc2X3dvcmtfam9pbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYXQ3Nl9wcml2LAotCQkJCQkgICAgICB3b3JrX2pvaW4pOwotCWludCByZXQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCW11dGV4X2xvY2soJnByaXYtPm10eCk7Ci0KLQlXQVJOX09OKHByaXYtPm1hY19zdGF0ZSAhPSBNQUNfSk9JTklORyk7Ci0JaWYgKHByaXYtPm1hY19zdGF0ZSAhPSBNQUNfSk9JTklORykKLQkJZ290byBleGl0OwotCi0JLyogc2VjdXJlIHRoZSBhY2Nlc3MgdG8gcHJpdi0+Y3Vycl9ic3MgISAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5ic3NfbGlzdF9zcGlubG9jaywgZmxhZ3MpOwotCXByaXYtPmN1cnJfYnNzID0gYXQ3Nl9tYXRjaF9ic3MocHJpdiwgcHJpdi0+Y3Vycl9ic3MpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmJzc19saXN0X3NwaW5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoIXByaXYtPmN1cnJfYnNzKSB7Ci0JCS8qIGhlcmUgd2UgaGF2ZW4ndCBmb3VuZCBhIG1hdGNoaW5nIChpKWJzcyAuLi4gKi8KLQkJaWYgKHByaXYtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykgewotCQkJYXQ3Nl9zZXRfbWFjX3N0YXRlKHByaXYsIE1BQ19PV05fSUJTUyk7Ci0JCQlhdDc2X3N0YXJ0X2lic3MocHJpdik7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQkJLyogaGF2ZW4ndCBmb3VuZCBhIG1hdGNoaW5nIEJTUyBpbiBpbmZyYSBtb2RlIC0gdHJ5IGFnYWluICovCi0JCWF0NzZfc2V0X21hY19zdGF0ZShwcml2LCBNQUNfU0NBTk5JTkcpOwotCQlzY2hlZHVsZV93b3JrKCZwcml2LT53b3JrX3N0YXJ0X3NjYW4pOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcmV0ID0gYXQ3Nl9qb2luX2Jzcyhwcml2LCBwcml2LT5jdXJyX2Jzcyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogam9pbl9ic3MgZmFpbGVkIHdpdGggJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlyZXQgPSBhdDc2X3dhaXRfY29tcGxldGlvbihwcml2LCBDTURfSk9JTik7Ci0JaWYgKHJldCAhPSBDTURfU1RBVFVTX0NPTVBMRVRFKSB7Ci0JCWlmIChyZXQgIT0gQ01EX1NUQVRVU19USU1FX09VVCkKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGpvaW5fYnNzIGNvbXBsZXRlZCB3aXRoICVkXG4iLAotCQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgcmV0KTsKLQkJZWxzZQotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGpvaW5fYnNzIHNzaWQgJXMgdGltZWQgb3V0XG4iLAotCQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwKLQkJCSAgICAgICBtYWMyc3RyKHByaXYtPmN1cnJfYnNzLT5ic3NpZCkpOwotCi0JCS8qIHJldHJ5IG5leHQgQlNTIGltbWVkaWF0ZWx5ICovCi0JCXNjaGVkdWxlX3dvcmsoJnByaXYtPndvcmtfam9pbik7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQkvKiBoZXJlIHdlIGhhdmUgam9pbmVkIHRoZSAoSSlCU1MgKi8KLQlpZiAocHJpdi0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKSB7Ci0JCXN0cnVjdCBic3NfaW5mbyAqYnB0ciA9IHByaXYtPmN1cnJfYnNzOwotCQlhdDc2X3NldF9tYWNfc3RhdGUocHJpdiwgTUFDX0NPTk5FQ1RFRCk7Ci0JCS8qIGdldCBFU1NJRCwgQlNTSUQgYW5kIGNoYW5uZWwgZm9yIHByaXYtPmN1cnJfYnNzICovCi0JCXByaXYtPmVzc2lkX3NpemUgPSBicHRyLT5zc2lkX2xlbjsKLQkJbWVtY3B5KHByaXYtPmVzc2lkLCBicHRyLT5zc2lkLCBicHRyLT5zc2lkX2xlbik7Ci0JCW1lbWNweShwcml2LT5ic3NpZCwgYnB0ci0+YnNzaWQsIEVUSF9BTEVOKTsKLQkJcHJpdi0+Y2hhbm5lbCA9IGJwdHItPmNoYW5uZWw7Ci0JCWF0NzZfaXdldmVudF9ic3NfY29ubmVjdChwcml2LT5uZXRkZXYsIGJwdHItPmJzc2lkKTsKLQkJbmV0aWZfY2Fycmllcl9vbihwcml2LT5uZXRkZXYpOwotCQluZXRpZl9zdGFydF9xdWV1ZShwcml2LT5uZXRkZXYpOwotCQkvKiBqdXN0IHRvIGJlIHN1cmUgKi8KLQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfZ2V0X3NjYW4pOwotCQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19hdXRoKTsKLQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfYXNzb2MpOwotCX0gZWxzZSB7Ci0JCS8qIHNlbmQgYXV0aCByZXEgKi8KLQkJcHJpdi0+cmV0cmllcyA9IEFVVEhfUkVUUklFUzsKLQkJYXQ3Nl9zZXRfbWFjX3N0YXRlKHByaXYsIE1BQ19BVVRIKTsKLQkJYXQ3Nl9hdXRoX3JlcShwcml2LCBwcml2LT5jdXJyX2JzcywgMSwgTlVMTCk7Ci0JCWF0NzZfZGJnKERCR19NR01UX1RJTUVSLAotCQkJICIlczolZDogc3RhcnRpbmcgbWdtdF90aW1lciArIEhaIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19hdXRoLCBBVVRIX1RJTUVPVVQpOwotCX0KLQotZXhpdDoKLQltdXRleF91bmxvY2soJnByaXYtPm10eCk7Ci19Ci0KLS8qIFJlYXAgc2NhbiByZXN1bHRzICovCi1zdGF0aWMgdm9pZCBhdDc2X2R3b3JrX2dldF9zY2FuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlpbnQgc3RhdHVzOwotCWludCByZXQ7Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYXQ3Nl9wcml2LAotCQkJCQkgICAgICBkd29ya19nZXRfc2Nhbi53b3JrKTsKLQotCW11dGV4X2xvY2soJnByaXYtPm10eCk7Ci0JV0FSTl9PTihwcml2LT5tYWNfc3RhdGUgIT0gTUFDX1NDQU5OSU5HKTsKLQlpZiAocHJpdi0+bWFjX3N0YXRlICE9IE1BQ19TQ0FOTklORykKLQkJZ290byBleGl0OwotCi0Jc3RhdHVzID0gYXQ3Nl9nZXRfY21kX3N0YXR1cyhwcml2LT51ZGV2LCBDTURfU0NBTik7Ci0JaWYgKHN0YXR1cyA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogJXM6IGF0NzZfZ2V0X2NtZF9zdGF0dXMgZmFpbGVkIHdpdGggJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIF9fZnVuY19fLCBzdGF0dXMpOwotCQlzdGF0dXMgPSBDTURfU1RBVFVTX0lOX1BST0dSRVNTOwotCQkvKiBJTkZPOiBIb3BlIGl0IHdhcyBhIG9uZSBvZmYgZXJyb3IgLSBpZiBub3QsIHNjYW5uaW5nCi0JCSAgIGZ1cnRoZXIgZG93biB0aGUgbGluZSBhbmQgc3RvcCB0aGlzIGN5Y2xlICovCi0JfQotCWF0NzZfZGJnKERCR19QUk9HUkVTUywKLQkJICIlcyAlczogZ290IGNtZF9zdGF0dXMgJWQgKHN0YXRlICVzLCBuZWVkX2FueSAlZCkiLAotCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBfX2Z1bmNfXywgc3RhdHVzLAotCQkgbWFjX3N0YXRlc1twcml2LT5tYWNfc3RhdGVdLCBwcml2LT5zY2FuX25lZWRfYW55KTsKLQotCWlmIChzdGF0dXMgIT0gQ01EX1NUQVRVU19DT01QTEVURSkgewotCQlpZiAoKHN0YXR1cyAhPSBDTURfU1RBVFVTX0lOX1BST0dSRVNTKSAmJgotCQkgICAgKHN0YXR1cyAhPSBDTURfU1RBVFVTX0lETEUpKQotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogJXM6IEJhZCBzY2FuIHN0YXR1czogJXNcbiIsCi0JCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCBfX2Z1bmNfXywKLQkJCSAgICAgICBhdDc2X2dldF9jbWRfc3RhdHVzX3N0cmluZyhzdGF0dXMpKTsKLQotCQkvKiB0aGUgZmlyc3QgY21kIHN0YXR1cyBhZnRlciBzY2FuIHN0YXJ0IGlzIGFsd2F5cyBhIElETEUgLT4KLQkJICAgc3RhcnQgdGhlIHRpbWVyIHRvIHBvbGwgYWdhaW4gdW50aWwgQ09NUExFVEVEICovCi0JCWF0NzZfZGJnKERCR19NR01UX1RJTUVSLAotCQkJICIlczolZDogc3RhcnRpbmcgbWdtdF90aW1lciBmb3IgJWQgdGlja3MiLAotCQkJIF9fZnVuY19fLCBfX0xJTkVfXywgU0NBTl9QT0xMX0lOVEVSVkFMKTsKLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19nZXRfc2NhbiwKLQkJCQkgICAgICBTQ0FOX1BPTExfSU5URVJWQUwpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaWYgKGF0NzZfZGVidWcgJiBEQkdfQlNTX1RBQkxFKQotCQlhdDc2X2R1bXBfYnNzX3RhYmxlKHByaXYpOwotCi0JaWYgKHByaXYtPnNjYW5fbmVlZF9hbnkpIHsKLQkJcmV0ID0gYXQ3Nl9zdGFydF9zY2FuKHByaXYsIDApOwotCQlpZiAocmV0IDwgMCkKLQkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgICIlczogJXM6IHN0YXJ0X3NjYW4gKEFOWSkgZmFpbGVkIHdpdGggJWRcbiIsCi0JCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCBfX2Z1bmNfXywgcmV0KTsKLQkJYXQ3Nl9kYmcoREJHX01HTVRfVElNRVIsCi0JCQkgIiVzOiVkOiBzdGFydGluZyBtZ210X3RpbWVyIGZvciAlZCB0aWNrcyIsIF9fZnVuY19fLAotCQkJIF9fTElORV9fLCBTQ0FOX1BPTExfSU5URVJWQUwpOwotCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX2dldF9zY2FuLAotCQkJCSAgICAgIFNDQU5fUE9MTF9JTlRFUlZBTCk7Ci0JCXByaXYtPnNjYW5fbmVlZF9hbnkgPSAwOwotCX0gZWxzZSB7Ci0JCXByaXYtPnNjYW5fc3RhdGUgPSBTQ0FOX0NPTVBMRVRFRDsKLQkJLyogcmVwb3J0IHRoZSBlbmQgb2Ygc2NhbiB0byB1c2VyIHNwYWNlICovCi0JCWF0NzZfaXdldmVudF9zY2FuX2NvbXBsZXRlKHByaXYtPm5ldGRldik7Ci0JCWF0NzZfc2V0X21hY19zdGF0ZShwcml2LCBNQUNfSk9JTklORyk7Ci0JCXNjaGVkdWxlX3dvcmsoJnByaXYtPndvcmtfam9pbik7Ci0JfQotCi1leGl0OgotCW11dGV4X3VubG9jaygmcHJpdi0+bXR4KTsKLX0KLQotLyogSGFuZGxlIGxvc3Mgb2YgYmVhY29ucyBmcm9tIHRoZSBBUCAqLwotc3RhdGljIHZvaWQgYXQ3Nl9kd29ya19iZWFjb24oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0NzZfcHJpdiwKLQkJCQkJICAgICAgZHdvcmtfYmVhY29uLndvcmspOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXR4KTsKLQlpZiAocHJpdi0+bWFjX3N0YXRlICE9IE1BQ19DT05ORUNURUQgfHwgcHJpdi0+aXdfbW9kZSAhPSBJV19NT0RFX0lORlJBKQotCQlnb3RvIGV4aXQ7Ci0KLQkvKiBXZSBoYXZlbid0IHJlY2VpdmVkIGFueSBiZWFjb25zIGZyb20gb3V0IEFQIGZvciBCRUFDT05fVElNRU9VVCAqLwotCXByaW50ayhLRVJOX0lORk8gIiVzOiBsb3N0IGJlYWNvbiBic3NpZCAlc1xuIiwKLQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCBtYWMyc3RyKHByaXYtPmN1cnJfYnNzLT5ic3NpZCkpOwotCi0JbmV0aWZfY2Fycmllcl9vZmYocHJpdi0+bmV0ZGV2KTsKLQluZXRpZl9zdG9wX3F1ZXVlKHByaXYtPm5ldGRldik7Ci0JYXQ3Nl9pd2V2ZW50X2Jzc19kaXNjb25uZWN0KHByaXYtPm5ldGRldik7Ci0JYXQ3Nl9zZXRfbWFjX3N0YXRlKHByaXYsIE1BQ19TQ0FOTklORyk7Ci0Jc2NoZWR1bGVfd29yaygmcHJpdi0+d29ya19zdGFydF9zY2FuKTsKLQotZXhpdDoKLQltdXRleF91bmxvY2soJnByaXYtPm10eCk7Ci19Ci0KLS8qIEhhbmRsZSBhdXRoZW50aWNhdGlvbiByZXNwb25zZSB0aW1lb3V0ICovCi1zdGF0aWMgdm9pZCBhdDc2X2R3b3JrX2F1dGgoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0NzZfcHJpdiwKLQkJCQkJICAgICAgZHdvcmtfYXV0aC53b3JrKTsKLQotCW11dGV4X2xvY2soJnByaXYtPm10eCk7Ci0JV0FSTl9PTihwcml2LT5tYWNfc3RhdGUgIT0gTUFDX0FVVEgpOwotCWlmIChwcml2LT5tYWNfc3RhdGUgIT0gTUFDX0FVVEgpCi0JCWdvdG8gZXhpdDsKLQotCWF0NzZfZGJnKERCR19QUk9HUkVTUywgIiVzOiBhdXRoZW50aWNhdGlvbiByZXNwb25zZSB0aW1lb3V0IiwKLQkJIHByaXYtPm5ldGRldi0+bmFtZSk7Ci0KLQlpZiAocHJpdi0+cmV0cmllcy0tID49IDApIHsKLQkJYXQ3Nl9hdXRoX3JlcShwcml2LCBwcml2LT5jdXJyX2JzcywgMSwgTlVMTCk7Ci0JCWF0NzZfZGJnKERCR19NR01UX1RJTUVSLCAiJXM6JWQ6IHN0YXJ0aW5nIG1nbXRfdGltZXIgKyBIWiIsCi0JCQkgX19mdW5jX18sIF9fTElORV9fKTsKLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19hdXRoLCBBVVRIX1RJTUVPVVQpOwotCX0gZWxzZSB7Ci0JCS8qIHRyeSB0byBnZXQgbmV4dCBtYXRjaGluZyBCU1MgKi8KLQkJYXQ3Nl9zZXRfbWFjX3N0YXRlKHByaXYsIE1BQ19KT0lOSU5HKTsKLQkJc2NoZWR1bGVfd29yaygmcHJpdi0+d29ya19qb2luKTsKLQl9Ci0KLWV4aXQ6Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdHgpOwotfQotCi0vKiBIYW5kbGUgYXNzb2NpYXRpb24gcmVzcG9uc2UgdGltZW91dCAqLwotc3RhdGljIHZvaWQgYXQ3Nl9kd29ya19hc3NvYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYXQ3Nl9wcml2LAotCQkJCQkgICAgICBkd29ya19hc3NvYy53b3JrKTsKLQotCW11dGV4X2xvY2soJnByaXYtPm10eCk7Ci0JV0FSTl9PTihwcml2LT5tYWNfc3RhdGUgIT0gTUFDX0FTU09DKTsKLQlpZiAocHJpdi0+bWFjX3N0YXRlICE9IE1BQ19BU1NPQykKLQkJZ290byBleGl0OwotCi0JYXQ3Nl9kYmcoREJHX1BST0dSRVNTLCAiJXM6IGFzc29jaWF0aW9uIHJlc3BvbnNlIHRpbWVvdXQiLAotCQkgcHJpdi0+bmV0ZGV2LT5uYW1lKTsKLQotCWlmIChwcml2LT5yZXRyaWVzLS0gPj0gMCkgewotCQlhdDc2X2Fzc29jX3JlcShwcml2LCBwcml2LT5jdXJyX2Jzcyk7Ci0JCWF0NzZfZGJnKERCR19NR01UX1RJTUVSLCAiJXM6JWQ6IHN0YXJ0aW5nIG1nbXRfdGltZXIgKyBIWiIsCi0JCQkgX19mdW5jX18sIF9fTElORV9fKTsKLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19hc3NvYywgQVNTT0NfVElNRU9VVCk7Ci0JfSBlbHNlIHsKLQkJLyogdHJ5IHRvIGdldCBuZXh0IG1hdGNoaW5nIEJTUyAqLwotCQlhdDc2X3NldF9tYWNfc3RhdGUocHJpdiwgTUFDX0pPSU5JTkcpOwotCQlzY2hlZHVsZV93b3JrKCZwcml2LT53b3JrX2pvaW4pOwotCX0KLQotZXhpdDoKLQltdXRleF91bmxvY2soJnByaXYtPm10eCk7Ci19Ci0KLS8qIFJlYWQgbmV3IGJzc2lkIGluIGFkLWhvYyBtb2RlICovCi1zdGF0aWMgdm9pZCBhdDc2X3dvcmtfbmV3X2JzcyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYXQ3Nl9wcml2LAotCQkJCQkgICAgICB3b3JrX25ld19ic3MpOwotCWludCByZXQ7Ci0Jc3RydWN0IG1pYl9tYWNfbWdtdCBtYWNfbWdtdDsKLQotCW11dGV4X2xvY2soJnByaXYtPm10eCk7Ci0KLQlyZXQgPSBhdDc2X2dldF9taWIocHJpdi0+dWRldiwgTUlCX01BQ19NR01ULCAmbWFjX21nbXQsCi0JCQkgICBzaXplb2Yoc3RydWN0IG1pYl9tYWNfbWdtdCkpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGF0NzZfZ2V0X21pYiBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCByZXQpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JYXQ3Nl9kYmcoREJHX1BST0dSRVNTLCAiaWJzc19jaGFuZ2UgPSAweCUyeCIsIG1hY19tZ210Lmlic3NfY2hhbmdlKTsKLQltZW1jcHkocHJpdi0+YnNzaWQsIG1hY19tZ210LmN1cnJlbnRfYnNzaWQsIEVUSF9BTEVOKTsKLQlhdDc2X2RiZyhEQkdfUFJPR1JFU1MsICJ1c2luZyBCU1NJRCAlcyIsIG1hYzJzdHIocHJpdi0+YnNzaWQpKTsKLQotCWF0NzZfaXdldmVudF9ic3NfY29ubmVjdChwcml2LT5uZXRkZXYsIHByaXYtPmJzc2lkKTsKLQotCXByaXYtPm1pYl9idWYudHlwZSA9IE1JQl9NQUNfTUdNVDsKLQlwcml2LT5taWJfYnVmLnNpemUgPSAxOwotCXByaXYtPm1pYl9idWYuaW5kZXggPSBvZmZzZXRvZihzdHJ1Y3QgbWliX21hY19tZ210LCBpYnNzX2NoYW5nZSk7Ci0JcHJpdi0+bWliX2J1Zi5kYXRhLmJ5dGUgPSAwOwotCi0JcmV0ID0gYXQ3Nl9zZXRfbWliKHByaXYsICZwcml2LT5taWJfYnVmKTsKLQlpZiAocmV0IDwgMCkKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogc2V0X21pYiAoaWJzcyBjaGFuZ2Ugb2spIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIHJldCk7Ci0KLWV4aXQ6Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdHgpOwotfQotCiBzdGF0aWMgaW50IGF0NzZfc3RhcnR1cF9kZXZpY2Uoc3RydWN0IGF0NzZfcHJpdiAqcHJpdikKIHsKIAlzdHJ1Y3QgYXQ3Nl9jYXJkX2NvbmZpZyAqY2NmZyA9ICZwcml2LT5jYXJkX2NvbmZpZzsKQEAgLTM4OTEsMTQgKzE0NzAsMTQgQEAKIAogCWF0NzZfZGJnKERCR19QQVJBTVMsCiAJCSAiJXMgcGFyYW06IHNzaWQgJS4qcyAoJXMpIG1vZGUgJXMgY2ggJWQgd2VwICVzIGtleSAlZCAiCi0JCSAia2V5bGVuICVkIiwgcHJpdi0+bmV0ZGV2LT5uYW1lLCBwcml2LT5lc3NpZF9zaXplLCBwcml2LT5lc3NpZCwKLQkJIGhleDJzdHIocHJpdi0+ZXNzaWQsIElXX0VTU0lEX01BWF9TSVpFKSwKKwkJICJrZXlsZW4gJWQiLCB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIHByaXYtPmVzc2lkX3NpemUsCisJCSBwcml2LT5lc3NpZCwgaGV4MnN0cihwcml2LT5lc3NpZCwgSVdfRVNTSURfTUFYX1NJWkUpLAogCQkgcHJpdi0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DID8gImFkaG9jIiA6ICJpbmZyYSIsCiAJCSBwcml2LT5jaGFubmVsLCBwcml2LT53ZXBfZW5hYmxlZCA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIsCiAJCSBwcml2LT53ZXBfa2V5X2lkLCBwcml2LT53ZXBfa2V5c19sZW5bcHJpdi0+d2VwX2tleV9pZF0pOwogCWF0NzZfZGJnKERCR19QQVJBTVMsCiAJCSAiJXMgcGFyYW06IHByZWFtYmxlICVzIHJ0cyAlZCByZXRyeSAlZCBmcmFnICVkICIKLQkJICJ0eHJhdGUgJXMgYXV0aF9tb2RlICVkIiwgcHJpdi0+bmV0ZGV2LT5uYW1lLAorCQkgInR4cmF0ZSAlcyBhdXRoX21vZGUgJWQiLCB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksCiAJCSBwcmVhbWJsZXNbcHJpdi0+cHJlYW1ibGVfdHlwZV0sIHByaXYtPnJ0c190aHJlc2hvbGQsCiAJCSBwcml2LT5zaG9ydF9yZXRyeV9saW1pdCwgcHJpdi0+ZnJhZ190aHJlc2hvbGQsCiAJCSBwcml2LT50eHJhdGUgPT0gVFhfUkFURV8xTUJJVCA/ICIxTUJpdCIgOiBwcml2LT50eHJhdGUgPT0KQEAgLTM5MDksNyArMTQ4OCw3IEBACiAJYXQ3Nl9kYmcoREJHX1BBUkFNUywKIAkJICIlcyBwYXJhbTogcG1fbW9kZSAlZCBwbV9wZXJpb2QgJWQgYXV0aF9tb2RlICVzICIKIAkJICJzY2FuX3RpbWVzICVkICVkIHNjYW5fbW9kZSAlcyIsCi0JCSBwcml2LT5uZXRkZXYtPm5hbWUsIHByaXYtPnBtX21vZGUsIHByaXYtPnBtX3BlcmlvZCwKKwkJIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgcHJpdi0+cG1fbW9kZSwgcHJpdi0+cG1fcGVyaW9kLAogCQkgcHJpdi0+YXV0aF9tb2RlID09IFdMQU5fQVVUSF9PUEVOID8gIm9wZW4iIDogInNoYXJlZF9zZWNyZXQiLAogCQkgcHJpdi0+c2Nhbl9taW5fdGltZSwgcHJpdi0+c2Nhbl9tYXhfdGltZSwKIAkJIHByaXYtPnNjYW5fbW9kZSA9PSBTQ0FOX1RZUEVfQUNUSVZFID8gImFjdGl2ZSIgOiAicGFzc2l2ZSIpOwpAQCAtMzk0Myw3ICsxNTIyLDggQEAKIAljY2ZnLT5zc2lkX2xlbiA9IHByaXYtPmVzc2lkX3NpemU7CiAKIAljY2ZnLT53ZXBfZGVmYXVsdF9rZXlfaWQgPSBwcml2LT53ZXBfa2V5X2lkOwotCW1lbWNweShjY2ZnLT53ZXBfZGVmYXVsdF9rZXlfdmFsdWUsIHByaXYtPndlcF9rZXlzLCA0ICogV0VQX0tFWV9MRU4pOworCW1lbWNweShjY2ZnLT53ZXBfZGVmYXVsdF9rZXlfdmFsdWUsIHByaXYtPndlcF9rZXlzLAorCSAgICAgICBzaXplb2YocHJpdi0+d2VwX2tleXMpKTsKIAogCWNjZmctPnNob3J0X3ByZWFtYmxlID0gcHJpdi0+cHJlYW1ibGVfdHlwZTsKIAljY2ZnLT5iZWFjb25fcGVyaW9kID0gY3B1X3RvX2xlMTYocHJpdi0+YmVhY29uX3BlcmlvZCk7CkBAIC0zOTUyLDcgKzE1MzIsNyBAQAogCQkJCSAgICBzaXplb2Yoc3RydWN0IGF0NzZfY2FyZF9jb25maWcpKTsKIAlpZiAocmV0IDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhdDc2X3NldF9jYXJkX2NvbW1hbmQgZmFpbGVkOiAlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgcmV0KTsKKwkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTM5OTgsNjkgKzE1NzgsNiBAQAogCXJldHVybiAwOwogfQogCi0vKiBSZXN0YXJ0IHRoZSBpbnRlcmZhY2UgKi8KLXN0YXRpYyB2b2lkIGF0NzZfZHdvcmtfcmVzdGFydChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYXQ3Nl9wcml2LAotCQkJCQkgICAgICBkd29ya19yZXN0YXJ0LndvcmspOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXR4KTsKLQotCW5ldGlmX2NhcnJpZXJfb2ZmKHByaXYtPm5ldGRldik7CS8qIHN0b3AgbmV0ZGV2IHdhdGNoZG9nICovCi0JbmV0aWZfc3RvcF9xdWV1ZShwcml2LT5uZXRkZXYpOwkvKiBzdG9wIHR4IGRhdGEgcGFja2V0cyAqLwotCi0JYXQ3Nl9zdGFydHVwX2RldmljZShwcml2KTsKLQotCWlmIChwcml2LT5pd19tb2RlICE9IElXX01PREVfTU9OSVRPUikgewotCQlwcml2LT5uZXRkZXYtPnR5cGUgPSBBUlBIUkRfRVRIRVI7Ci0JCWF0NzZfc2V0X21hY19zdGF0ZShwcml2LCBNQUNfU0NBTk5JTkcpOwotCQlzY2hlZHVsZV93b3JrKCZwcml2LT53b3JrX3N0YXJ0X3NjYW4pOwotCX0gZWxzZSB7Ci0JCXByaXYtPm5ldGRldi0+dHlwZSA9IEFSUEhSRF9JRUVFODAyMTFfUkFESU9UQVA7Ci0JCWF0NzZfc3RhcnRfbW9uaXRvcihwcml2KTsKLQl9Ci0KLQltdXRleF91bmxvY2soJnByaXYtPm10eCk7Ci19Ci0KLS8qIEluaXRpYXRlIHNjYW5uaW5nICovCi1zdGF0aWMgdm9pZCBhdDc2X3dvcmtfc3RhcnRfc2NhbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYXQ3Nl9wcml2LAotCQkJCQkgICAgICB3b3JrX3N0YXJ0X3NjYW4pOwotCWludCByZXQ7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdHgpOwotCi0JV0FSTl9PTihwcml2LT5tYWNfc3RhdGUgIT0gTUFDX1NDQU5OSU5HKTsKLQlpZiAocHJpdi0+bWFjX3N0YXRlICE9IE1BQ19TQ0FOTklORykKLQkJZ290byBleGl0OwotCi0JLyogb25seSBjbGVhciB0aGUgYnNzIGxpc3Qgd2hlbiBhIHNjYW4gaXMgYWN0aXZlbHkgaW5pdGlhdGVkLAotCSAqIG90aGVyd2lzZSBzaW1wbHkgcmVseSBvbiBhdDc2X2Jzc19saXN0X3RpbWVvdXQgKi8KLQlpZiAocHJpdi0+c2Nhbl9zdGF0ZSA9PSBTQ0FOX0lOX1BST0dSRVNTKSB7Ci0JCWF0NzZfZnJlZV9ic3NfbGlzdChwcml2KTsKLQkJcHJpdi0+c2Nhbl9uZWVkX2FueSA9IDE7Ci0JfSBlbHNlCi0JCXByaXYtPnNjYW5fbmVlZF9hbnkgPSAwOwotCi0JcmV0ID0gYXQ3Nl9zdGFydF9zY2FuKHByaXYsIDEpOwotCi0JaWYgKHJldCA8IDApCi0JCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzOiBzdGFydF9zY2FuIGZhaWxlZCB3aXRoICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCBfX2Z1bmNfXywgcmV0KTsKLQllbHNlIHsKLQkJYXQ3Nl9kYmcoREJHX01HTVRfVElNRVIsCi0JCQkgIiVzOiVkOiBzdGFydGluZyBtZ210X3RpbWVyIGZvciAlZCB0aWNrcyIsCi0JCQkgX19mdW5jX18sIF9fTElORV9fLCBTQ0FOX1BPTExfSU5URVJWQUwpOwotCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX2dldF9zY2FuLAotCQkJCSAgICAgIFNDQU5fUE9MTF9JTlRFUlZBTCk7Ci0JfQotCi1leGl0OgotCW11dGV4X3VubG9jaygmcHJpdi0+bXR4KTsKLX0KLQogLyogRW5hYmxlIG9yIGRpc2FibGUgcHJvbWlzY3VvdXMgbW9kZSAqLwogc3RhdGljIHZvaWQgYXQ3Nl93b3JrX3NldF9wcm9taXNjKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKQEAgLTQwNzgsNyArMTU5NSw3IEBACiAJcmV0ID0gYXQ3Nl9zZXRfbWliKHByaXYsICZwcml2LT5taWJfYnVmKTsKIAlpZiAocmV0IDwgMCkKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogc2V0X21pYiAocHJvbWlzY3VvdXNfbW9kZSkgZmFpbGVkOiAlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgcmV0KTsKKwkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgcmV0KTsKIAogCW11dGV4X3VubG9jaygmcHJpdi0+bXR4KTsKIH0KQEAgLTQwOTQsODk0ICsxNjExLDEyIEBACiAJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdHgpOwogfQogCi0vKiBXZSBnb3QgYW4gYXNzb2NpYXRpb24gcmVzcG9uc2UgKi8KLXN0YXRpYyB2b2lkIGF0NzZfcnhfbWdtdF9hc3NvYyhzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2LAotCQkJICAgICAgIHN0cnVjdCBhdDc2X3J4X2J1ZmZlciAqYnVmKQotewotCXN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2UgKnJlc3AgPQotCSAgICAoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZSAqKWJ1Zi0+cGFja2V0OwotCXUxNiBhc3NvY19pZCA9IGxlMTZfdG9fY3B1KHJlc3AtPmFpZCk7Ci0JdTE2IHN0YXR1cyA9IGxlMTZfdG9fY3B1KHJlc3AtPnN0YXR1cyk7Ci0KLQlhdDc2X2RiZyhEQkdfUlhfTUdNVCwgIiVzOiByeCBBc3NvY1Jlc3AgYnNzaWQgJXMgY2FwYSAweCUwNHggc3RhdHVzICIKLQkJICIweCUwNHggYXNzb2NfaWQgMHglMDR4IHJhdGVzICVzIiwgcHJpdi0+bmV0ZGV2LT5uYW1lLAotCQkgbWFjMnN0cihyZXNwLT5oZWFkZXIuYWRkcjMpLCBsZTE2X3RvX2NwdShyZXNwLT5jYXBhYmlsaXR5KSwKLQkJIHN0YXR1cywgYXNzb2NfaWQsIGhleDJzdHIocmVzcC0+aW5mb19lbGVtZW50LT5kYXRhLAotCQkJCQkgICByZXNwLT5pbmZvX2VsZW1lbnQtPmxlbikpOwotCi0JaWYgKHByaXYtPm1hY19zdGF0ZSAhPSBNQUNfQVNTT0MpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEFzc29jUmVzcCBpbiBzdGF0ZSAlcyBpZ25vcmVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCBtYWNfc3RhdGVzW3ByaXYtPm1hY19zdGF0ZV0pOwotCQlyZXR1cm47Ci0JfQotCi0JQlVHX09OKCFwcml2LT5jdXJyX2Jzcyk7Ci0KLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19hc3NvYyk7Ci0JaWYgKHN0YXR1cyA9PSBXTEFOX1NUQVRVU19TVUNDRVNTKSB7Ci0JCXN0cnVjdCBic3NfaW5mbyAqcHRyID0gcHJpdi0+Y3Vycl9ic3M7Ci0JCXByaXYtPmFzc29jX2lkID0gYXNzb2NfaWQgJiAweDNmZmY7Ci0JCS8qIHVwZGF0ZSBpd2NvbmZpZyBwYXJhbXMgKi8KLQkJbWVtY3B5KHByaXYtPmJzc2lkLCBwdHItPmJzc2lkLCBFVEhfQUxFTik7Ci0JCW1lbWNweShwcml2LT5lc3NpZCwgcHRyLT5zc2lkLCBwdHItPnNzaWRfbGVuKTsKLQkJcHJpdi0+ZXNzaWRfc2l6ZSA9IHB0ci0+c3NpZF9sZW47Ci0JCXByaXYtPmNoYW5uZWwgPSBwdHItPmNoYW5uZWw7Ci0JCXNjaGVkdWxlX3dvcmsoJnByaXYtPndvcmtfYXNzb2NfZG9uZSk7Ci0JfSBlbHNlIHsKLQkJYXQ3Nl9zZXRfbWFjX3N0YXRlKHByaXYsIE1BQ19KT0lOSU5HKTsKLQkJc2NoZWR1bGVfd29yaygmcHJpdi0+d29ya19qb2luKTsKLQl9Ci19Ci0KLS8qIFByb2Nlc3MgZGlzYXNzb2NpYXRpb24gcmVxdWVzdCBmcm9tIHRoZSBBUCAqLwotc3RhdGljIHZvaWQgYXQ3Nl9yeF9tZ210X2Rpc2Fzc29jKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYsCi0JCQkJICBzdHJ1Y3QgYXQ3Nl9yeF9idWZmZXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2Rpc2Fzc29jICpyZXNwID0KLQkgICAgKHN0cnVjdCBpZWVlODAyMTFfZGlzYXNzb2MgKilidWYtPnBhY2tldDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqbWdtdCA9ICZyZXNwLT5oZWFkZXI7Ci0KLQlhdDc2X2RiZyhEQkdfUlhfTUdNVCwKLQkJICIlczogcnggRGlzQXNzb2MgYnNzaWQgJXMgcmVhc29uIDB4JTA0eCBkZXN0aW5hdGlvbiAlcyIsCi0JCSBwcml2LT5uZXRkZXYtPm5hbWUsIG1hYzJzdHIobWdtdC0+YWRkcjMpLAotCQkgbGUxNl90b19jcHUocmVzcC0+cmVhc29uKSwgbWFjMnN0cihtZ210LT5hZGRyMSkpOwotCi0JLyogV2UgYXJlIG5vdCBjb25uZWN0ZWQsIGlnbm9yZSAqLwotCWlmIChwcml2LT5tYWNfc3RhdGUgPT0gTUFDX1NDQU5OSU5HIHx8IHByaXYtPm1hY19zdGF0ZSA9PSBNQUNfSU5JVAotCSAgICB8fCAhcHJpdi0+Y3Vycl9ic3MpCi0JCXJldHVybjsKLQotCS8qIE5vdCBvdXIgQlNTSUQsIGlnbm9yZSAqLwotCWlmIChjb21wYXJlX2V0aGVyX2FkZHIobWdtdC0+YWRkcjMsIHByaXYtPmN1cnJfYnNzLT5ic3NpZCkpCi0JCXJldHVybjsKLQotCS8qIE5vdCBmb3Igb3VyIFNUQSBhbmQgbm90IGJyb2FkY2FzdCwgaWdub3JlICovCi0JaWYgKGNvbXBhcmVfZXRoZXJfYWRkcihwcml2LT5uZXRkZXYtPmRldl9hZGRyLCBtZ210LT5hZGRyMSkKLQkgICAgJiYgIWlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKG1nbXQtPmFkZHIxKSkKLQkJcmV0dXJuOwotCi0JaWYgKHByaXYtPm1hY19zdGF0ZSAhPSBNQUNfQVNTT0MgJiYgcHJpdi0+bWFjX3N0YXRlICE9IE1BQ19DT05ORUNURUQKLQkgICAgJiYgcHJpdi0+bWFjX3N0YXRlICE9IE1BQ19KT0lOSU5HKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBEaXNBc3NvYyBpbiBzdGF0ZSAlcyBpZ25vcmVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCBtYWNfc3RhdGVzW3ByaXYtPm1hY19zdGF0ZV0pOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKHByaXYtPm1hY19zdGF0ZSA9PSBNQUNfQ09OTkVDVEVEKSB7Ci0JCW5ldGlmX2NhcnJpZXJfb2ZmKHByaXYtPm5ldGRldik7Ci0JCW5ldGlmX3N0b3BfcXVldWUocHJpdi0+bmV0ZGV2KTsKLQkJYXQ3Nl9pd2V2ZW50X2Jzc19kaXNjb25uZWN0KHByaXYtPm5ldGRldik7Ci0JfQotCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX2dldF9zY2FuKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19iZWFjb24pOwotCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX2F1dGgpOwotCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX2Fzc29jKTsKLQlhdDc2X3NldF9tYWNfc3RhdGUocHJpdiwgTUFDX0pPSU5JTkcpOwotCXNjaGVkdWxlX3dvcmsoJnByaXYtPndvcmtfam9pbik7Ci19Ci0KLXN0YXRpYyB2b2lkIGF0NzZfcnhfbWdtdF9hdXRoKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYsCi0JCQkgICAgICBzdHJ1Y3QgYXQ3Nl9yeF9idWZmZXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2F1dGggKnJlc3AgPSAoc3RydWN0IGllZWU4MDIxMV9hdXRoICopYnVmLT5wYWNrZXQ7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKm1nbXQgPSAmcmVzcC0+aGVhZGVyOwotCWludCBzZXFfbnIgPSBsZTE2X3RvX2NwdShyZXNwLT50cmFuc2FjdGlvbik7Ci0JaW50IGFsZyA9IGxlMTZfdG9fY3B1KHJlc3AtPmFsZ29yaXRobSk7Ci0JaW50IHN0YXR1cyA9IGxlMTZfdG9fY3B1KHJlc3AtPnN0YXR1cyk7Ci0KLQlhdDc2X2RiZyhEQkdfUlhfTUdNVCwKLQkJICIlczogcnggQXV0aEZyYW1lIGJzc2lkICVzIGFsZyAlZCBzZXFfbnIgJWQgc3RhdHVzICVkICIKLQkJICJkZXN0aW5hdGlvbiAlcyIsIHByaXYtPm5ldGRldi0+bmFtZSwgbWFjMnN0cihtZ210LT5hZGRyMyksCi0JCSBhbGcsIHNlcV9uciwgc3RhdHVzLCBtYWMyc3RyKG1nbXQtPmFkZHIxKSk7Ci0KLQlpZiAoYWxnID09IFdMQU5fQVVUSF9TSEFSRURfS0VZICYmIHNlcV9uciA9PSAyKQotCQlhdDc2X2RiZyhEQkdfUlhfTUdNVCwgIiVzOiBBdXRoRnJhbWUgY2hhbGxlbmdlICVzIC4uLiIsCi0JCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBoZXgyc3RyKHJlc3AtPmluZm9fZWxlbWVudCwgMTgpKTsKLQotCWlmIChwcml2LT5tYWNfc3RhdGUgIT0gTUFDX0FVVEgpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGlnbm9yZWQgQXV0aEZyYW1lIGluIHN0YXRlICVzXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCBtYWNfc3RhdGVzW3ByaXYtPm1hY19zdGF0ZV0pOwotCQlyZXR1cm47Ci0JfQotCWlmIChwcml2LT5hdXRoX21vZGUgIT0gYWxnKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBpZ25vcmVkIEF1dGhGcmFtZSBmb3IgYWxnICVkXG4iLAotCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCBhbGcpOwotCQlyZXR1cm47Ci0JfQotCi0JQlVHX09OKCFwcml2LT5jdXJyX2Jzcyk7Ci0KLQkvKiBOb3Qgb3VyIEJTU0lEIG9yIG5vdCBmb3Igb3VyIFNUQSwgaWdub3JlICovCi0JaWYgKGNvbXBhcmVfZXRoZXJfYWRkcihtZ210LT5hZGRyMywgcHJpdi0+Y3Vycl9ic3MtPmJzc2lkKQotCSAgICB8fCBjb21wYXJlX2V0aGVyX2FkZHIocHJpdi0+bmV0ZGV2LT5kZXZfYWRkciwgbWdtdC0+YWRkcjEpKQotCQlyZXR1cm47Ci0KLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19hdXRoKTsKLQlpZiAoc3RhdHVzICE9IFdMQU5fU1RBVFVTX1NVQ0NFU1MpIHsKLQkJLyogdHJ5IHRvIGpvaW4gbmV4dCBic3MgKi8KLQkJYXQ3Nl9zZXRfbWFjX3N0YXRlKHByaXYsIE1BQ19KT0lOSU5HKTsKLQkJc2NoZWR1bGVfd29yaygmcHJpdi0+d29ya19qb2luKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChwcml2LT5hdXRoX21vZGUgPT0gV0xBTl9BVVRIX09QRU4gfHwgc2VxX25yID09IDQpIHsKLQkJcHJpdi0+cmV0cmllcyA9IEFTU09DX1JFVFJJRVM7Ci0JCWF0NzZfc2V0X21hY19zdGF0ZShwcml2LCBNQUNfQVNTT0MpOwotCQlhdDc2X2Fzc29jX3JlcShwcml2LCBwcml2LT5jdXJyX2Jzcyk7Ci0JCWF0NzZfZGJnKERCR19NR01UX1RJTUVSLAotCQkJICIlczolZDogc3RhcnRpbmcgbWdtdF90aW1lciArIEhaIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19hc3NvYywgQVNTT0NfVElNRU9VVCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlXQVJOX09OKHNlcV9uciAhPSAyKTsKLQlhdDc2X2F1dGhfcmVxKHByaXYsIHByaXYtPmN1cnJfYnNzLCBzZXFfbnIgKyAxLCByZXNwLT5pbmZvX2VsZW1lbnQpOwotCWF0NzZfZGJnKERCR19NR01UX1RJTUVSLCAiJXM6JWQ6IHN0YXJ0aW5nIG1nbXRfdGltZXIgKyBIWiIsIF9fZnVuY19fLAotCQkgX19MSU5FX18pOwotCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfYXV0aCwgQVVUSF9USU1FT1VUKTsKLX0KLQotc3RhdGljIHZvaWQgYXQ3Nl9yeF9tZ210X2RlYXV0aChzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2LAotCQkJCXN0cnVjdCBhdDc2X3J4X2J1ZmZlciAqYnVmKQotewotCXN0cnVjdCBpZWVlODAyMTFfZGlzYXNzb2MgKnJlc3AgPQotCSAgICAoc3RydWN0IGllZWU4MDIxMV9kaXNhc3NvYyAqKWJ1Zi0+cGFja2V0OwotCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICptZ210ID0gJnJlc3AtPmhlYWRlcjsKLQotCWF0NzZfZGJnKERCR19SWF9NR01UIHwgREJHX1BST0dSRVNTLAotCQkgIiVzOiByeCBEZUF1dGggYnNzaWQgJXMgcmVhc29uIDB4JTA0eCBkZXN0aW5hdGlvbiAlcyIsCi0JCSBwcml2LT5uZXRkZXYtPm5hbWUsIG1hYzJzdHIobWdtdC0+YWRkcjMpLAotCQkgbGUxNl90b19jcHUocmVzcC0+cmVhc29uKSwgbWFjMnN0cihtZ210LT5hZGRyMSkpOwotCi0JaWYgKHByaXYtPm1hY19zdGF0ZSAhPSBNQUNfQVVUSCAmJiBwcml2LT5tYWNfc3RhdGUgIT0gTUFDX0FTU09DCi0JICAgICYmIHByaXYtPm1hY19zdGF0ZSAhPSBNQUNfQ09OTkVDVEVEKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBEZUF1dGggaW4gc3RhdGUgJXMgaWdub3JlZFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgbWFjX3N0YXRlc1twcml2LT5tYWNfc3RhdGVdKTsKLQkJcmV0dXJuOwotCX0KLQotCUJVR19PTighcHJpdi0+Y3Vycl9ic3MpOwotCi0JLyogTm90IG91ciBCU1NJRCwgaWdub3JlICovCi0JaWYgKGNvbXBhcmVfZXRoZXJfYWRkcihtZ210LT5hZGRyMywgcHJpdi0+Y3Vycl9ic3MtPmJzc2lkKSkKLQkJcmV0dXJuOwotCi0JLyogTm90IGZvciBvdXIgU1RBIGFuZCBub3QgYnJvYWRjYXN0LCBpZ25vcmUgKi8KLQlpZiAoY29tcGFyZV9ldGhlcl9hZGRyKHByaXYtPm5ldGRldi0+ZGV2X2FkZHIsIG1nbXQtPmFkZHIxKQotCSAgICAmJiAhaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIobWdtdC0+YWRkcjEpKQotCQlyZXR1cm47Ci0KLQlpZiAocHJpdi0+bWFjX3N0YXRlID09IE1BQ19DT05ORUNURUQpCi0JCWF0NzZfaXdldmVudF9ic3NfZGlzY29ubmVjdChwcml2LT5uZXRkZXYpOwotCi0JYXQ3Nl9zZXRfbWFjX3N0YXRlKHByaXYsIE1BQ19KT0lOSU5HKTsKLQlzY2hlZHVsZV93b3JrKCZwcml2LT53b3JrX2pvaW4pOwotCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX2dldF9zY2FuKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19iZWFjb24pOwotCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX2F1dGgpOwotCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX2Fzc29jKTsKLX0KLQotc3RhdGljIHZvaWQgYXQ3Nl9yeF9tZ210X2JlYWNvbihzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2LAotCQkJCXN0cnVjdCBhdDc2X3J4X2J1ZmZlciAqYnVmKQotewotCWludCB2YXJwYXJfbGVuOwotCS8qIGJlYWNvbiBjb250ZW50ICovCi0Jc3RydWN0IGllZWU4MDIxMV9iZWFjb24gKmJkYXRhID0gKHN0cnVjdCBpZWVlODAyMTFfYmVhY29uICopYnVmLT5wYWNrZXQ7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKm1nbXQgPSAmYmRhdGEtPmhlYWRlcjsKLQotCXN0cnVjdCBsaXN0X2hlYWQgKmxwdHI7Ci0Jc3RydWN0IGJzc19pbmZvICptYXRjaDsJLyogZW50cnkgbWF0Y2hpbmcgYWRkcjMgd2l0aCBpdHMgYnNzaWQgKi8KLQlpbnQgbmV3X2VudHJ5ID0gMDsKLQlpbnQgbGVuOwotCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50ICppZTsKLQlpbnQgaGF2ZV9zc2lkID0gMDsKLQlpbnQgaGF2ZV9yYXRlcyA9IDA7Ci0JaW50IGhhdmVfY2hhbm5lbCA9IDA7Ci0JaW50IGtlZXBfZ29pbmcgPSAxOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+YnNzX2xpc3Rfc3BpbmxvY2ssIGZsYWdzKTsKLQlpZiAocHJpdi0+bWFjX3N0YXRlID09IE1BQ19DT05ORUNURUQpIHsKLQkJLyogaW4gc3RhdGUgTUFDX0NPTk5FQ1RFRCB3ZSB1c2UgdGhlIG1nbXRfdGltZXIgdG8gY29udHJvbAotCQkgICB0aGUgYmVhY29uIG9mIHRoZSBCU1MgKi8KLQkJQlVHX09OKCFwcml2LT5jdXJyX2Jzcyk7Ci0KLQkJaWYgKCFjb21wYXJlX2V0aGVyX2FkZHIocHJpdi0+Y3Vycl9ic3MtPmJzc2lkLCBtZ210LT5hZGRyMykpIHsKLQkJCS8qIFdlIGdvdCBvdXIgQVAncyBiZWFjb24sIGRlZmVyIHRoZSB0aW1lb3V0IGhhbmRsZXIuCi0JCQkgICBLaWxsIHBlbmRpbmcgd29yayBmaXJzdCwgYXMgc2NoZWR1bGVfZGVsYXllZF93b3JrKCkKLQkJCSAgIHdvbid0IGRvIGl0LiAqLwotCQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfYmVhY29uKTsKLQkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcHJpdi0+ZHdvcmtfYmVhY29uLAotCQkJCQkgICAgICBCRUFDT05fVElNRU9VVCk7Ci0JCQlwcml2LT5jdXJyX2Jzcy0+cnNzaSA9IGJ1Zi0+cnNzaTsKLQkJCXByaXYtPmJlYWNvbnNfcmVjZWl2ZWQrKzsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCX0KLQotCS8qIGxvb2sgaWYgd2UgaGF2ZSB0aGlzIEJTUyBhbHJlYWR5IGluIHRoZSBsaXN0ICovCi0JbWF0Y2ggPSBOVUxMOwotCi0JaWYgKCFsaXN0X2VtcHR5KCZwcml2LT5ic3NfbGlzdCkpIHsKLQkJbGlzdF9mb3JfZWFjaChscHRyLCAmcHJpdi0+YnNzX2xpc3QpIHsKLQkJCXN0cnVjdCBic3NfaW5mbyAqYnNzX3B0ciA9Ci0JCQkgICAgbGlzdF9lbnRyeShscHRyLCBzdHJ1Y3QgYnNzX2luZm8sIGxpc3QpOwotCQkJaWYgKCFjb21wYXJlX2V0aGVyX2FkZHIoYnNzX3B0ci0+YnNzaWQsIG1nbXQtPmFkZHIzKSkgewotCQkJCW1hdGNoID0gYnNzX3B0cjsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCWlmICghbWF0Y2gpIHsKLQkJLyogQlNTIG5vdCBpbiB0aGUgbGlzdCAtIGFwcGVuZCBpdCAqLwotCQltYXRjaCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBic3NfaW5mbyksIEdGUF9BVE9NSUMpOwotCQlpZiAoIW1hdGNoKSB7Ci0JCQlhdDc2X2RiZyhEQkdfQlNTX1RBQkxFLAotCQkJCSAiJXM6IGNhbm5vdCBrbWFsbG9jIG5ldyBic3MgaW5mbyAoJXpkIGJ5dGUpIiwKLQkJCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBzaXplb2Yoc3RydWN0IGJzc19pbmZvKSk7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQkJbmV3X2VudHJ5ID0gMTsKLQkJbGlzdF9hZGRfdGFpbCgmbWF0Y2gtPmxpc3QsICZwcml2LT5ic3NfbGlzdCk7Ci0JfQotCi0JbWF0Y2gtPmNhcGEgPSBsZTE2X3RvX2NwdShiZGF0YS0+Y2FwYWJpbGl0eSk7Ci0JbWF0Y2gtPmJlYWNvbl9pbnRlcnZhbCA9IGxlMTZfdG9fY3B1KGJkYXRhLT5iZWFjb25faW50ZXJ2YWwpOwotCW1hdGNoLT5yc3NpID0gYnVmLT5yc3NpOwotCW1hdGNoLT5saW5rX3F1YWwgPSBidWYtPmxpbmtfcXVhbGl0eTsKLQltYXRjaC0+bm9pc2VfbGV2ZWwgPSBidWYtPm5vaXNlX2xldmVsOwotCW1lbWNweShtYXRjaC0+YnNzaWQsIG1nbXQtPmFkZHIzLCBFVEhfQUxFTik7Ci0JYXQ3Nl9kYmcoREJHX1JYX0JFQUNPTiwgIiVzOiBic3NpZCAlcyIsIHByaXYtPm5ldGRldi0+bmFtZSwKLQkJIG1hYzJzdHIobWF0Y2gtPmJzc2lkKSk7Ci0KLQlpZSA9IGJkYXRhLT5pbmZvX2VsZW1lbnQ7Ci0KLQkvKiBsZW5ndGggb2YgdmFyIGxlbmd0aCBiZWFjb24gcGFyYW1ldGVycyAqLwotCXZhcnBhcl9sZW4gPSBtaW5fdChpbnQsIGxlMTZfdG9fY3B1KGJ1Zi0+d2xlbmd0aCkgLQotCQkJICAgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYmVhY29uKSwKLQkJCSAgIEJFQUNPTl9NQVhfREFUQV9MRU5HVEgpOwotCi0JLyogVGhpcyByb3V0aW5lIHN0ZXBzIHRocm91Z2ggdGhlIGJkYXRhLT5kYXRhIGFycmF5IHRvIGdldAotCSAqIHNvbWUgdXNlZnVsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhY2Nlc3MgcG9pbnQuCi0JICogQ3VycmVudGx5LCB0aGlzIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIHJlY2VpcHQgb2Y6IFNTSUQsCi0JICogc3VwcG9ydGVkIHRyYW5zZmVyIHJhdGVzIGFuZCBjaGFubmVsLCBpbiBhbnkgb3JkZXIsIHdpdGggc29tZQotCSAqIHRvbGVyYW5jZSBmb3IgaW50ZXJtaXR0ZW50IHVua25vd24gY29kZXMgKGFsdGhvdWdoIHRoaXMKLQkgKiBmdW5jdGlvbmFsaXR5IG1heSBub3QgYmUgbmVjZXNzYXJ5IGFzIHRoZSB1c2VmdWwgaW5mb3JtYXRpb24gd2lsbAotCSAqIHVzdWFsbHkgYXJyaXZlIGluIGNvbnNlY3V0aXZlbHksIGJ1dCB0aGVyZSBoYXZlIGJlZW4gc29tZQotCSAqIHJlcG9ydHMgb2Ygc29tZSBvZiB0aGUgdXNlZnVsIGluZm9ybWF0aW9uIGZpZWxkcyBhcnJpdmluZyBpbiBhCi0JICogZGlmZmVyZW50IG9yZGVyKS4KLQkgKiBJdCBkb2VzIG5vdCBzdXBwb3J0IGFueSBtb3JlIElFIHR5cGVzIGFsdGhvdWdoIE1GSUVfVFlQRV9USU0gbWF5Ci0JICogYmUgc3VwcG9ydGVkIChvbiBteSBBUCBhdCBsZWFzdCkuCi0JICogVGhlIGJkYXRhLT5kYXRhIGFycmF5IGlzIGFib3V0IDE1MDAgYnl0ZXMgbG9uZyBidXQgb25seSB+MzYgb2YgdGhvc2UKLQkgKiBieXRlcyBhcmUgdXNlZnVsLCBoZW5jZSB0aGUgaGF2ZV9zc2lkIGV0YyBvcHRpbWl6YXRpb25zLiAqLwotCi0Jd2hpbGUgKGtlZXBfZ29pbmcgJiYKLQkgICAgICAgKCgmaWUtPmRhdGFbaWUtPmxlbl0gLSAodTggKiliZGF0YS0+aW5mb19lbGVtZW50KSA8PQotCQl2YXJwYXJfbGVuKSkgewotCi0JCXN3aXRjaCAoaWUtPmlkKSB7Ci0KLQkJY2FzZSBNRklFX1RZUEVfU1NJRDoKLQkJCWlmIChoYXZlX3NzaWQpCi0JCQkJYnJlYWs7Ci0KLQkJCWxlbiA9IG1pbl90KGludCwgSVdfRVNTSURfTUFYX1NJWkUsIGllLT5sZW4pOwotCi0JCQkvKiB3ZSBjb3B5IG9ubHkgaWYgdGhpcyBpcyBhIG5ldyBlbnRyeSwKLQkJCSAgIG9yIHRoZSBpbmNvbWluZyBTU0lEIGlzIG5vdCBhIGhpZGRlbiBTU0lELiBUaGlzCi0JCQkgICB3aWxsIHByb3RlY3QgdXMgZnJvbSBvdmVyd3JpdGluZyBhIHJlYWwgU1NJRCByZWFkCi0JCQkgICBpbiBhIFByb2JlUmVzcG9uc2Ugd2l0aCBhIGhpZGRlbiBvbmUgZnJvbSBhCi0JCQkgICBmb2xsb3dpbmcgYmVhY29uLiAqLwotCQkJaWYgKCFuZXdfZW50cnkgJiYgYXQ3Nl9pc19oaWRkZW5fc3NpZChpZS0+ZGF0YSwgbGVuKSkgewotCQkJCWhhdmVfc3NpZCA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCW1hdGNoLT5zc2lkX2xlbiA9IGxlbjsKLQkJCW1lbWNweShtYXRjaC0+c3NpZCwgaWUtPmRhdGEsIGxlbik7Ci0JCQlhdDc2X2RiZyhEQkdfUlhfQkVBQ09OLCAiJXM6IFNTSUQgLSAlLipzIiwKLQkJCQkgcHJpdi0+bmV0ZGV2LT5uYW1lLCBsZW4sIG1hdGNoLT5zc2lkKTsKLQkJCWhhdmVfc3NpZCA9IDE7Ci0JCQlicmVhazsKLQotCQljYXNlIE1GSUVfVFlQRV9SQVRFUzoKLQkJCWlmIChoYXZlX3JhdGVzKQotCQkJCWJyZWFrOwotCi0JCQltYXRjaC0+cmF0ZXNfbGVuID0KLQkJCSAgICBtaW5fdChpbnQsIHNpemVvZihtYXRjaC0+cmF0ZXMpLCBpZS0+bGVuKTsKLQkJCW1lbWNweShtYXRjaC0+cmF0ZXMsIGllLT5kYXRhLCBtYXRjaC0+cmF0ZXNfbGVuKTsKLQkJCWhhdmVfcmF0ZXMgPSAxOwotCQkJYXQ3Nl9kYmcoREJHX1JYX0JFQUNPTiwgIiVzOiBTVVBQT1JURUQgUkFURVMgJXMiLAotCQkJCSBwcml2LT5uZXRkZXYtPm5hbWUsCi0JCQkJIGhleDJzdHIoaWUtPmRhdGEsIGllLT5sZW4pKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgTUZJRV9UWVBFX0RTX1NFVDoKLQkJCWlmIChoYXZlX2NoYW5uZWwpCi0JCQkJYnJlYWs7Ci0KLQkJCW1hdGNoLT5jaGFubmVsID0gaWUtPmRhdGFbMF07Ci0JCQloYXZlX2NoYW5uZWwgPSAxOwotCQkJYXQ3Nl9kYmcoREJHX1JYX0JFQUNPTiwgIiVzOiBDSEFOTkVMIC0gJWQiLAotCQkJCSBwcml2LT5uZXRkZXYtPm5hbWUsIG1hdGNoLT5jaGFubmVsKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgTUZJRV9UWVBFX0NGX1NFVDoKLQkJY2FzZSBNRklFX1RZUEVfVElNOgotCQljYXNlIE1GSUVfVFlQRV9JQlNTX1NFVDoKLQkJZGVmYXVsdDoKLQkJCWF0NzZfZGJnKERCR19SWF9CRUFDT04sICIlczogYmVhY29uIElFIGlkICVkIGxlbiAlZCAlcyIsCi0JCQkJIHByaXYtPm5ldGRldi0+bmFtZSwgaWUtPmlkLCBpZS0+bGVuLAotCQkJCSBoZXgyc3RyKGllLT5kYXRhLCBpZS0+bGVuKSk7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIGFkdmFuY2UgdG8gdGhlIG5leHQgaW5mb3JtYXRpb25hbCBlbGVtZW50ICovCi0JCW5leHRfaWUoJmllKTsKLQotCQkvKiBPcHRpbWl6YXRpb246IGFmdGVyIGFsbCwgdGhlIGJkYXRhLT5kYXRhIGFycmF5IGlzCi0JCSAqIHZhcnBhcl9sZW4gYnl0ZXMgbG9uZywgd2hlcmVhcyB3ZSBnZXQgYWxsIG9mIHRoZSB1c2VmdWwKLQkJICogaW5mb3JtYXRpb24gYWZ0ZXIgb25seSB+MzYgYnl0ZXMsIHRoaXMgc2F2ZXMgdXMgYSBsb3Qgb2YKLQkJICogdGltZSAoYW5kIHRyb3VibGUgYXMgdGhlIHJlbWFpbmluZyBwb3J0aW9uIG9mIHRoZSBhcnJheQotCQkgKiBjb3VsZCBiZSBmdWxsIG9mIGp1bmspCi0JCSAqIENvbW1lbnQgdGhpcyBvdXQgaWYgeW91IHdhbnQgdG8gc2VlIHdoYXQgb3RoZXIgaW5mb3JtYXRpb24KLQkJICogY29tZXMgZnJvbSB0aGUgQVAgLSBhbHRob3VnaCBsaXR0bGUgb2YgaXQgbWF5IGJlIHVzZWZ1bCAqLwotCX0KLQotCWF0NzZfZGJnKERCR19SWF9CRUFDT04sICIlczogRmluaXNoZWQgcHJvY2Vzc2luZyBiZWFjb24gZGF0YSIsCi0JCSBwcml2LT5uZXRkZXYtPm5hbWUpOwotCi0JbWF0Y2gtPmxhc3RfcnggPSBqaWZmaWVzOwkvKiByZWNvcmQgbGFzdCByeCBvZiBiZWFjb24gKi8KLQotZXhpdDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5ic3NfbGlzdF9zcGlubG9jaywgZmxhZ3MpOwotfQotCi0vKiBDYWxjdWxhdGUgdGhlIGxpbmsgbGV2ZWwgZnJvbSBhIGdpdmVuIHJ4X2J1ZmZlciAqLwotc3RhdGljIHZvaWQgYXQ3Nl9jYWxjX2xldmVsKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYsIHN0cnVjdCBhdDc2X3J4X2J1ZmZlciAqYnVmLAotCQkJICAgIHN0cnVjdCBpd19xdWFsaXR5ICpxdWFsKQotewotCS8qIGp1c3QgYSBndWVzcyBmb3Igbm93LCBtaWdodCBiZSBkaWZmZXJlbnQgZm9yIG90aGVyIGNoaXBzICovCi0JaW50IG1heF9yc3NpID0gNDI7Ci0KLQlxdWFsLT5sZXZlbCA9IChidWYtPnJzc2kgKiAxMDAgLyBtYXhfcnNzaSk7Ci0JaWYgKHF1YWwtPmxldmVsID4gMTAwKQotCQlxdWFsLT5sZXZlbCA9IDEwMDsKLQlxdWFsLT51cGRhdGVkIHw9IElXX1FVQUxfTEVWRUxfVVBEQVRFRDsKLX0KLQotLyogQ2FsY3VsYXRlIHRoZSBsaW5rIHF1YWxpdHkgZnJvbSBhIGdpdmVuIHJ4X2J1ZmZlciAqLwotc3RhdGljIHZvaWQgYXQ3Nl9jYWxjX3F1YWwoc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwgc3RydWN0IGF0NzZfcnhfYnVmZmVyICpidWYsCi0JCQkgICBzdHJ1Y3QgaXdfcXVhbGl0eSAqcXVhbCkKLXsKLQlpZiAoYXQ3Nl9pc19pbnRlcnNpbChwcml2LT5ib2FyZF90eXBlKSkKLQkJcXVhbC0+cXVhbCA9IGJ1Zi0+bGlua19xdWFsaXR5OwotCWVsc2UgewotCQl1bnNpZ25lZCBsb25nIGVsYXBzZWQ7Ci0KLQkJLyogVXBkYXRlIHF1YWwgYXQgbW9zdCBvbmNlIGEgc2Vjb25kICovCi0JCWVsYXBzZWQgPSBqaWZmaWVzIC0gcHJpdi0+YmVhY29uc19sYXN0X3F1YWw7Ci0JCWlmIChlbGFwc2VkIDwgMSAqIEhaKQotCQkJcmV0dXJuOwotCi0JCXF1YWwtPnF1YWwgPSBxdWFsLT5sZXZlbCAqIHByaXYtPmJlYWNvbnNfcmVjZWl2ZWQgKgotCQkgICAgbXNlY3NfdG9famlmZmllcyhwcml2LT5iZWFjb25fcGVyaW9kKSAvIGVsYXBzZWQ7Ci0KLQkJcHJpdi0+YmVhY29uc19sYXN0X3F1YWwgPSBqaWZmaWVzOwotCQlwcml2LT5iZWFjb25zX3JlY2VpdmVkID0gMDsKLQl9Ci0JcXVhbC0+cXVhbCA9IChxdWFsLT5xdWFsID4gMTAwKSA/IDEwMCA6IHF1YWwtPnF1YWw7Ci0JcXVhbC0+dXBkYXRlZCB8PSBJV19RVUFMX1FVQUxfVVBEQVRFRDsKLX0KLQotLyogQ2FsY3VsYXRlIHRoZSBub2lzZSBxdWFsaXR5IGZyb20gYSBnaXZlbiByeF9idWZmZXIgKi8KLXN0YXRpYyB2b2lkIGF0NzZfY2FsY19ub2lzZShzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2LCBzdHJ1Y3QgYXQ3Nl9yeF9idWZmZXIgKmJ1ZiwKLQkJCSAgICBzdHJ1Y3QgaXdfcXVhbGl0eSAqcXVhbCkKLXsKLQlxdWFsLT5ub2lzZSA9IDA7Ci0JcXVhbC0+dXBkYXRlZCB8PSBJV19RVUFMX05PSVNFX0lOVkFMSUQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGF0NzZfdXBkYXRlX3dzdGF0cyhzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2LAotCQkJICAgICAgIHN0cnVjdCBhdDc2X3J4X2J1ZmZlciAqYnVmKQotewotCXN0cnVjdCBpd19xdWFsaXR5ICpxdWFsID0gJnByaXYtPndzdGF0cy5xdWFsOwotCi0JaWYgKGJ1Zi0+cnNzaSAmJiBwcml2LT5tYWNfc3RhdGUgPT0gTUFDX0NPTk5FQ1RFRCkgewotCQlxdWFsLT51cGRhdGVkID0gMDsKLQkJYXQ3Nl9jYWxjX2xldmVsKHByaXYsIGJ1ZiwgcXVhbCk7Ci0JCWF0NzZfY2FsY19xdWFsKHByaXYsIGJ1ZiwgcXVhbCk7Ci0JCWF0NzZfY2FsY19ub2lzZShwcml2LCBidWYsIHF1YWwpOwotCX0gZWxzZSB7Ci0JCXF1YWwtPnF1YWwgPSAwOwotCQlxdWFsLT5sZXZlbCA9IDA7Ci0JCXF1YWwtPm5vaXNlID0gMDsKLQkJcXVhbC0+dXBkYXRlZCA9IElXX1FVQUxfQUxMX0lOVkFMSUQ7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBhdDc2X3J4X21nbXQoc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwgc3RydWN0IGF0NzZfcnhfYnVmZmVyICpidWYpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKm1nbXQgPQotCSAgICAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKilidWYtPnBhY2tldDsKLQl1MTYgZnJhbWVjdGwgPSBsZTE2X3RvX2NwdShtZ210LT5mcmFtZV9jdGwpOwotCi0JLyogdXBkYXRlIHdzdGF0cyAqLwotCWlmIChwcml2LT5tYWNfc3RhdGUgIT0gTUFDX0lOSVQgJiYgcHJpdi0+bWFjX3N0YXRlICE9IE1BQ19TQ0FOTklORykgewotCQkvKiBqYWw6IHRoaXMgaXMgYSBkaXJ0eSBoYWNrIG5lZWRlZCBieSBUaW0gaW4gYWQtaG9jIG1vZGUgKi8KLQkJLyogRGF0YSBwYWNrZXRzIGFsd2F5cyBzZWVtIHRvIGhhdmUgYSAwIGxpbmsgbGV2ZWwsIHNvIHdlCi0JCSAgIG9ubHkgcmVhZCBsaW5rIHF1YWxpdHkgaW5mbyBmcm9tIG1hbmFnZW1lbnQgcGFja2V0cy4KLQkJICAgQXRtZWwgZHJpdmVyIGFjdHVhbGx5IGF2ZXJhZ2VzIHRoZSBwcmVzZW50LCBhbmQgcHJldmlvdXMKLQkJICAgdmFsdWVzLCB3ZSBqdXN0IHByZXNlbnQgdGhlIHJhdyB2YWx1ZSBhdCB0aGUgbW9tZW50IC0gVEpTICovCi0JCWlmIChwcml2LT5pd19tb2RlID09IElXX01PREVfQURIT0MKLQkJICAgIHx8IChwcml2LT5jdXJyX2JzcwotCQkJJiYgIWNvbXBhcmVfZXRoZXJfYWRkcihtZ210LT5hZGRyMywKLQkJCQkJICAgICAgIHByaXYtPmN1cnJfYnNzLT5ic3NpZCkpKQotCQkJYXQ3Nl91cGRhdGVfd3N0YXRzKHByaXYsIGJ1Zik7Ci0JfQotCi0JYXQ3Nl9kYmcoREJHX1JYX01HTVRfQ09OVEVOVCwgIiVzIHJ4IG1nbXQgZnJhbWVjdGwgMHgleCAlcyIsCi0JCSBwcml2LT5uZXRkZXYtPm5hbWUsIGZyYW1lY3RsLAotCQkgaGV4MnN0cihtZ210LCBsZTE2X3RvX2NwdShidWYtPndsZW5ndGgpKSk7Ci0KLQlzd2l0Y2ggKGZyYW1lY3RsICYgSUVFRTgwMjExX0ZDVExfU1RZUEUpIHsKLQljYXNlIElFRUU4MDIxMV9TVFlQRV9CRUFDT046Ci0JY2FzZSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUDoKLQkJYXQ3Nl9yeF9tZ210X2JlYWNvbihwcml2LCBidWYpOwotCQlicmVhazsKLQotCWNhc2UgSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFU1A6Ci0JCWF0NzZfcnhfbWdtdF9hc3NvYyhwcml2LCBidWYpOwotCQlicmVhazsKLQotCWNhc2UgSUVFRTgwMjExX1NUWVBFX0RJU0FTU09DOgotCQlhdDc2X3J4X21nbXRfZGlzYXNzb2MocHJpdiwgYnVmKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElFRUU4MDIxMV9TVFlQRV9BVVRIOgotCQlhdDc2X3J4X21nbXRfYXV0aChwcml2LCBidWYpOwotCQlicmVhazsKLQotCWNhc2UgSUVFRTgwMjExX1NUWVBFX0RFQVVUSDoKLQkJYXQ3Nl9yeF9tZ210X2RlYXV0aChwcml2LCBidWYpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0RFQlVHICIlczogaWdub3JpbmcgZnJhbWUgd2l0aCBmcmFtZWN0bCAweCUwNHhcbiIsCi0JCSAgICAgICBwcml2LT5uZXRkZXYtPm5hbWUsIGZyYW1lY3RsKTsKLQl9Ci0KLQlyZXR1cm47Ci19Ci0KLS8qIENvbnZlcnQgdGhlIDgwMi4xMSBoZWFkZXIgaW50byBhbiBldGhlcm5ldC1zdHlsZSBoZWFkZXIsIG1ha2Ugc2tiCi0gKiByZWFkeSBmb3IgY29uc3VtcHRpb24gYnkgbmV0aWZfcngoKSAqLwotc3RhdGljIHZvaWQgYXQ3Nl9pZWVlODAyMTFfdG9fZXRoKHN0cnVjdCBza19idWZmICpza2IsIGludCBpd19tb2RlKQotewotCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICppODAyXzExX2hkcjsKLQlzdHJ1Y3QgZXRoaGRyICpldGhfaGRyX3A7Ci0JdTggKnNyY19hZGRyOwotCXU4ICpkZXN0X2FkZHI7Ci0KLQlpODAyXzExX2hkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqKXNrYi0+ZGF0YTsKLQotCS8qIFRoYXQgd291bGQgYmUgdGhlIGV0aGVybmV0IGhlYWRlciBpZiB0aGUgaGFyZHdhcmUgY29udmVydGVkCi0JICogdGhlIGZyYW1lIGZvciB1cy4gIE1ha2Ugc3VyZSB0aGUgc291cmNlIGFuZCB0aGUgZGVzdGluYXRpb24KLQkgKiBtYXRjaCB0aGUgODAyLjExIGhlYWRlci4gIFdoaWNoIGhhcmR3YXJlIGRvZXMgaXQ/ICovCi0JZXRoX2hkcl9wID0gKHN0cnVjdCBldGhoZHIgKilza2JfcHVsbChza2IsIElFRUU4MDIxMV8zQUREUl9MRU4pOwotCi0JZGVzdF9hZGRyID0gaTgwMl8xMV9oZHItPmFkZHIxOwotCWlmIChpd19tb2RlID09IElXX01PREVfQURIT0MpCi0JCXNyY19hZGRyID0gaTgwMl8xMV9oZHItPmFkZHIyOwotCWVsc2UKLQkJc3JjX2FkZHIgPSBpODAyXzExX2hkci0+YWRkcjM7Ci0KLQlpZiAoIWNvbXBhcmVfZXRoZXJfYWRkcihldGhfaGRyX3AtPmhfc291cmNlLCBzcmNfYWRkcikgJiYKLQkgICAgIWNvbXBhcmVfZXRoZXJfYWRkcihldGhfaGRyX3AtPmhfZGVzdCwgZGVzdF9hZGRyKSkKLQkJLyogWWVzLCB3ZSBhbHJlYWR5IGhhdmUgYW4gZXRoZXJuZXQgaGVhZGVyICovCi0JCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7Ci0JZWxzZSB7Ci0JCXUxNiBsZW47Ci0KLQkJLyogTmVlZCB0byBidWlsZCBhbiBldGhlcm5ldCBoZWFkZXIgKi8KLQkJaWYgKCFtZW1jbXAoc2tiLT5kYXRhLCBzbmFwc2lnLCBzaXplb2Yoc25hcHNpZykpKSB7Ci0JCQkvKiBTTkFQIGZyYW1lIC0gZGVjYXBzdWxhdGUsIGtlZXAgcHJvdG8gKi8KLQkJCXNrYl9wdXNoKHNrYiwgb2Zmc2V0b2Yoc3RydWN0IGV0aGhkciwgaF9wcm90bykgLQotCQkJCSBzaXplb2YocmZjMTA0MnNpZykpOwotCQkJbGVuID0gMDsKLQkJfSBlbHNlIHsKLQkJCS8qIDgwMi4zIGZyYW1lLCBwcm90byBpcyBsZW5ndGggKi8KLQkJCWxlbiA9IHNrYi0+bGVuOwotCQkJc2tiX3B1c2goc2tiLCBFVEhfSExFTik7Ci0JCX0KLQotCQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwotCQlldGhfaGRyX3AgPSBldGhfaGRyKHNrYik7Ci0JCS8qIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBpbiB0aGlzIG9yZGVyIChldGhfaGRyX3AtPmhfZGVzdCBtYXkKLQkJICogb3ZlcmxhcCBzcmNfYWRkcikgKi8KLQkJbWVtY3B5KGV0aF9oZHJfcC0+aF9zb3VyY2UsIHNyY19hZGRyLCBFVEhfQUxFTik7Ci0JCW1lbWNweShldGhfaGRyX3AtPmhfZGVzdCwgZGVzdF9hZGRyLCBFVEhfQUxFTik7Ci0JCWlmIChsZW4pCi0JCQlldGhfaGRyX3AtPmhfcHJvdG8gPSBodG9ucyhsZW4pOwotCX0KLQotCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHNrYi0+ZGV2KTsKLX0KLQotLyogQ2hlY2sgZm9yIGZyYWdtZW50ZWQgZGF0YSBpbiBwcml2LT5yeF9za2IuIElmIHRoZSBwYWNrZXQgd2FzIG5vIGZyYWdtZW50Ci0gICBvciBpdCB3YXMgdGhlIGxhc3Qgb2YgYSBmcmFnbWVudCBzZXQgYSBza2IgY29udGFpbmluZyB0aGUgd2hvbGUgcGFja2V0Ci0gICBpcyByZXR1cm5lZCBmb3IgZnVydGhlciBwcm9jZXNzaW5nLiBPdGhlcndpc2Ugd2UgZ2V0IE5VTEwgYW5kIGFyZQotICAgZG9uZSBhbmQgdGhlIHBhY2tldCBpcyBlaXRoZXIgc3RvcmVkIGluc2lkZSB0aGUgZnJhZ21lbnQgYnVmZmVyCi0gICBvciB0aHJvd24gYXdheS4gIEV2ZXJ5IHJldHVybmVkIHNrYiBzdGFydHMgd2l0aCB0aGUgaWVlZTgwMl8xMSBoZWFkZXIKLSAgIGFuZCBjb250YWlucyBfbm9fIEZDUyBhdCB0aGUgZW5kICovCi1zdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmF0NzZfY2hlY2tfZm9yX3J4X2ZyYWdzKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHByaXYtPnJ4X3NrYjsKLQlzdHJ1Y3QgYXQ3Nl9yeF9idWZmZXIgKmJ1ZiA9IChzdHJ1Y3QgYXQ3Nl9yeF9idWZmZXIgKilza2ItPmRhdGE7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKmk4MDJfMTFfaGRyID0KLQkgICAgKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopYnVmLT5wYWNrZXQ7Ci0JLyogc2VxX2N0cmwsIGZyYWdtZW50X251bWJlciwgc2VxdWVuY2UgbnVtYmVyIG9mIG5ldyBwYWNrZXQgKi8KLQl1MTYgc2N0bCA9IGxlMTZfdG9fY3B1KGk4MDJfMTFfaGRyLT5zZXFfY3RsKTsKLQl1MTYgZnJhZ25yID0gc2N0bCAmIDB4ZjsKLQl1MTYgc2VxbnIgPSBzY3RsID4+IDQ7Ci0JdTE2IGZyYW1lX2N0bCA9IGxlMTZfdG9fY3B1KGk4MDJfMTFfaGRyLT5mcmFtZV9jdGwpOwotCi0JLyogTGVuZ3RoIGluY2x1ZGluZyB0aGUgSUVFRTgwMi4xMSBoZWFkZXIsIGJ1dCB3aXRob3V0IHRoZSB0cmFpbGluZwotCSAqIEZDUyBhbmQgd2l0aG91dCB0aGUgQXRtZWwgUnggaGVhZGVyICovCi0JaW50IGxlbmd0aCA9IGxlMTZfdG9fY3B1KGJ1Zi0+d2xlbmd0aCkgLSBJRUVFODAyMTFfRkNTX0xFTjsKLQotCS8qIHdoZXJlIGRvZXMgdGhlIGRhdGEgcGF5bG9hZCBzdGFydCBpbiBza2ItPmRhdGEgPyAqLwotCXU4ICpkYXRhID0gaTgwMl8xMV9oZHItPnBheWxvYWQ7Ci0KLQkvKiBsZW5ndGggb2YgcGF5bG9hZCwgZXhjbC4gdGhlIHRyYWlsaW5nIEZDUyAqLwotCWludCBkYXRhX2xlbiA9IGxlbmd0aCAtIElFRUU4MDIxMV8zQUREUl9MRU47Ci0KLQlpbnQgaTsKLQlzdHJ1Y3QgcnhfZGF0YV9idWYgKmJwdHIsICpvcHRyOwotCXVuc2lnbmVkIGxvbmcgb2xkZXN0ID0gfjBVTDsKLQotCWF0NzZfZGJnKERCR19SWF9GUkFHUywKLQkJICIlczogcnggZGF0YSBmcmFtZV9jdGwgJTA0eCBhZGRyMiAlcyBzZXEvZnJhZyAlZC8lZCAiCi0JCSAibGVuZ3RoICVkIGRhdGEgJWQ6ICVzIC4uLiIsIHByaXYtPm5ldGRldi0+bmFtZSwgZnJhbWVfY3RsLAotCQkgbWFjMnN0cihpODAyXzExX2hkci0+YWRkcjIpLCBzZXFuciwgZnJhZ25yLCBsZW5ndGgsIGRhdGFfbGVuLAotCQkgaGV4MnN0cihkYXRhLCAzMikpOwotCi0JYXQ3Nl9kYmcoREJHX1JYX0ZSQUdTX1NLQiwgIiVzOiBpbmNvbWluZyBza2I6IGhlYWQgJXAgZGF0YSAlcCAiCi0JCSAidGFpbCAlcCBlbmQgJXAgbGVuICVkIiwgcHJpdi0+bmV0ZGV2LT5uYW1lLCBza2ItPmhlYWQsCi0JCSBza2ItPmRhdGEsIHNrYl90YWlsX3BvaW50ZXIoc2tiKSwgc2tiX2VuZF9wb2ludGVyKHNrYiksCi0JCSBza2ItPmxlbik7Ci0KLQlpZiAoZGF0YV9sZW4gPCAwKSB7Ci0JCS8qIG1ha2Ugc3VyZSBkYXRhIHN0YXJ0cyBpbiB0aGUgYnVmZmVyICovCi0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBkYXRhIGZyYW1lIHRvbyBzaG9ydFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCVdBUk5fT04obGVuZ3RoIDw9IEFUNzZfUlhfSERSTEVOKTsKLQlpZiAobGVuZ3RoIDw9IEFUNzZfUlhfSERSTEVOKQotCQlyZXR1cm4gTlVMTDsKLQotCS8qIHJlbW92ZSB0aGUgYXQ3Nl9yeF9idWZmZXIgaGVhZGVyIC0gd2UgZG9uJ3QgbmVlZCBpdCBhbnltb3JlICovCi0JLyogd2UgbmVlZCB0aGUgSUVFRTgwMi4xMSBoZWFkZXIgKGZvciB0aGUgYWRkcmVzc2VzKSBpZiB0aGlzIHBhY2tldAotCSAgIGlzIHRoZSBmaXJzdCBvZiBhIGNoYWluICovCi0Jc2tiX3B1bGwoc2tiLCBBVDc2X1JYX0hEUkxFTik7Ci0KLQkvKiByZW1vdmUgRkNTIGF0IGVuZCAqLwotCXNrYl90cmltKHNrYiwgbGVuZ3RoKTsKLQotCWF0NzZfZGJnKERCR19SWF9GUkFHU19TS0IsICIlczogdHJpbW1lZCBza2I6IGhlYWQgJXAgZGF0YSAlcCB0YWlsICVwICIKLQkJICJlbmQgJXAgbGVuICVkIGRhdGEgJXAgZGF0YV9sZW4gJWQiLCBwcml2LT5uZXRkZXYtPm5hbWUsCi0JCSBza2ItPmhlYWQsIHNrYi0+ZGF0YSwgc2tiX3RhaWxfcG9pbnRlcihza2IpLAotCQkgc2tiX2VuZF9wb2ludGVyKHNrYiksIHNrYi0+bGVuLCBkYXRhLCBkYXRhX2xlbik7Ci0KLQlpZiAoZnJhZ25yID09IDAgJiYgIShmcmFtZV9jdGwgJiBJRUVFODAyMTFfRkNUTF9NT1JFRlJBR1MpKSB7Ci0JCS8qIHVuZnJhZ21lbnRlZCBwYWNrZXQgcmVjZWl2ZWQgKi8KLQkJLyogVXNlIGEgbmV3IHNrYiBmb3IgdGhlIG5leHQgcmVjZWl2ZSAqLwotCQlwcml2LT5yeF9za2IgPSBOVUxMOwotCQlhdDc2X2RiZyhEQkdfUlhfRlJBR1MsICIlczogdW5mcmFnbWVudGVkIiwgcHJpdi0+bmV0ZGV2LT5uYW1lKTsKLQkJcmV0dXJuIHNrYjsKLQl9Ci0KLQkvKiBsb29rIGlmIHdlJ3ZlIGdvdCBhIGNoYWluIGZvciB0aGUgc2VuZGVyIGFkZHJlc3MuCi0JICAgYWZ0ZXJ3YXJkcyBvcHRyIHBvaW50cyB0byBmaXJzdCBmcmVlIG9yIHRoZSBvbGRlc3QgZW50cnksCi0JICAgb3IsIGlmIGkgPCBOUl9SWF9EQVRBX0JVRiwgYnB0ciBwb2ludHMgdG8gdGhlIGVudHJ5IGZvciB0aGUKLQkgICBzZW5kZXIgYWRkcmVzcyAqLwotCS8qIGRldGVybWluaW5nIHRoZSBvbGRlc3QgZW50cnkgZG9lc24ndCBjb3BlIHdpdGggamlmZmllcyB3cmFwcGluZwotCSAgIGJ1dCBJIGRvbid0IGNhcmUgdG8gZGVsZXRlIGEgeW91bmcgZW50cnkgYXQgdGhlc2UgcmFyZSBtb21lbnRzIC4uLiAqLwotCi0JYnB0ciA9IHByaXYtPnJ4X2RhdGE7Ci0Jb3B0ciA9IE5VTEw7Ci0JZm9yIChpID0gMDsgaSA8IE5SX1JYX0RBVEFfQlVGOyBpKyssIGJwdHIrKykgewotCQlpZiAoIWJwdHItPnNrYikgewotCQkJb3B0ciA9IGJwdHI7Ci0JCQlvbGRlc3QgPSAwVUw7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmICghY29tcGFyZV9ldGhlcl9hZGRyKGk4MDJfMTFfaGRyLT5hZGRyMiwgYnB0ci0+c2VuZGVyKSkKLQkJCWJyZWFrOwotCi0JCWlmICghb3B0cikgewotCQkJb3B0ciA9IGJwdHI7Ci0JCQlvbGRlc3QgPSBicHRyLT5sYXN0X3J4OwotCQl9IGVsc2UgaWYgKGJwdHItPmxhc3RfcnggPCBvbGRlc3QpCi0JCQlvcHRyID0gYnB0cjsKLQl9Ci0KLQlpZiAoaSA8IE5SX1JYX0RBVEFfQlVGKSB7Ci0KLQkJYXQ3Nl9kYmcoREJHX1JYX0ZSQUdTLCAiJXM6ICVkLiBjYWNoZWVudHJ5IChzZXEvZnJhZyA9ICVkLyVkKSAiCi0JCQkgIm1hdGNoZWQgc2VuZGVyIGFkZHIiLAotCQkJIHByaXYtPm5ldGRldi0+bmFtZSwgaSwgYnB0ci0+c2VxbnIsIGJwdHItPmZyYWducik7Ci0KLQkJLyogYnB0ciBwb2ludHMgdG8gYW4gZW50cnkgZm9yIHRoZSBzZW5kZXIgYWRkcmVzcyAqLwotCQlpZiAoYnB0ci0+c2VxbnIgPT0gc2VxbnIpIHsKLQkJCWludCBsZWZ0OwotCQkJLyogdGhlIGZyYWdtZW50IGhhcyB0aGUgY3VycmVudCBzZXF1ZW5jZSBudW1iZXIgKi8KLQkJCWlmICgoKGJwdHItPmZyYWduciArIDEpICYgMHhmKSAhPSBmcmFnbnIpIHsKLQkJCQkvKiB3cm9uZyBmcmFnbWVudCBudW1iZXIgLT4gaWdub3JlIGl0ICovCi0JCQkJLyogaXMgJiAweGYgbmVjZXNzYXJ5IGFib3ZlID8/PyAqLwotCQkJCWF0NzZfZGJnKERCR19SWF9GUkFHUywKLQkJCQkJICIlczogZnJhZyBuciBtaXNtYXRjaDogJWQgKyAxICE9ICVkIiwKLQkJCQkJIHByaXYtPm5ldGRldi0+bmFtZSwgYnB0ci0+ZnJhZ25yLAotCQkJCQkgZnJhZ25yKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCWJwdHItPmxhc3RfcnggPSBqaWZmaWVzOwotCQkJLyogdGhlIG5leHQgZm9sbG93aW5nIGZyYWdtZW50IG51bWJlciAtPgotCQkJICAgYWRkIHRoZSBkYXRhIGF0IHRoZSBlbmQgKi8KLQotCQkJLyogZm9yIHRlc3Qgb25seSA/Pz8gKi8KLQkJCWxlZnQgPSBza2JfdGFpbHJvb20oYnB0ci0+c2tiKTsKLQkJCWlmIChsZWZ0IDwgZGF0YV9sZW4pCi0JCQkJcHJpbnRrKEtFUk5fSU5GTwotCQkJCSAgICAgICAiJXM6IG9ubHkgJWQgYnl0ZSBmcmVlIChuZWVkICVkKVxuIiwKLQkJCQkgICAgICAgcHJpdi0+bmV0ZGV2LT5uYW1lLCBsZWZ0LCBkYXRhX2xlbik7Ci0JCQllbHNlCi0JCQkJbWVtY3B5KHNrYl9wdXQoYnB0ci0+c2tiLCBkYXRhX2xlbiksIGRhdGEsCi0JCQkJICAgICAgIGRhdGFfbGVuKTsKLQotCQkJYnB0ci0+ZnJhZ25yID0gZnJhZ25yOwotCQkJaWYgKGZyYW1lX2N0bCAmIElFRUU4MDIxMV9GQ1RMX01PUkVGUkFHUykKLQkJCQlyZXR1cm4gTlVMTDsKLQotCQkJLyogdGhpcyB3YXMgdGhlIGxhc3QgZnJhZ21lbnQgLSBzZW5kIGl0ICovCi0JCQlza2IgPSBicHRyLT5za2I7Ci0JCQlicHRyLT5za2IgPSBOVUxMOwkvKiBmcmVlIHRoZSBlbnRyeSAqLwotCQkJYXQ3Nl9kYmcoREJHX1JYX0ZSQUdTLCAiJXM6IGxhc3QgZnJhZyBvZiBzZXEgJWQiLAotCQkJCSBwcml2LT5uZXRkZXYtPm5hbWUsIHNlcW5yKTsKLQkJCXJldHVybiBza2I7Ci0JCX0KLQotCQkvKiBnb3QgYW5vdGhlciBzZXF1ZW5jZSBudW1iZXIgKi8KLQkJaWYgKGZyYWduciA9PSAwKSB7Ci0JCQkvKiBpdCdzIHRoZSBzdGFydCBvZiBhIG5ldyBjaGFpbiAtIHJlcGxhY2UgdGhlCi0JCQkgICBvbGQgb25lIGJ5IHRoaXMgKi8KLQkJCS8qIGJwdHItPnNlbmRlciBoYXMgdGhlIGNvcnJlY3QgdmFsdWUgYWxyZWFkeSAqLwotCQkJYXQ3Nl9kYmcoREJHX1JYX0ZSQUdTLAotCQkJCSAiJXM6IHN0YXJ0IG9mIG5ldyBzZXEgJWQsIHJlbW92aW5nIG9sZCBzZXEgJWQiLAotCQkJCSBwcml2LT5uZXRkZXYtPm5hbWUsIHNlcW5yLCBicHRyLT5zZXFucik7Ci0JCQlicHRyLT5zZXFuciA9IHNlcW5yOwotCQkJYnB0ci0+ZnJhZ25yID0gMDsKLQkJCWJwdHItPmxhc3RfcnggPSBqaWZmaWVzOwotCQkJLyogc3dhcCBicHRyLT5za2IgYW5kIHByaXYtPnJ4X3NrYiAqLwotCQkJc2tiID0gYnB0ci0+c2tiOwotCQkJYnB0ci0+c2tiID0gcHJpdi0+cnhfc2tiOwotCQkJcHJpdi0+cnhfc2tiID0gc2tiOwotCQl9IGVsc2UgewotCQkJLyogaXQgZnJvbSB0aGUgbWlkZGxlIG9mIGEgbmV3IGNoYWluIC0+Ci0JCQkgICBkZWxldGUgdGhlIG9sZCBlbnRyeSBhbmQgc2tpcCB0aGUgbmV3IG9uZSAqLwotCQkJYXQ3Nl9kYmcoREJHX1JYX0ZSQUdTLAotCQkJCSAiJXM6IG1pZGRsZSBvZiBuZXcgc2VxICVkICglZCkgIgotCQkJCSAicmVtb3Zpbmcgb2xkIHNlcSAlZCIsCi0JCQkJIHByaXYtPm5ldGRldi0+bmFtZSwgc2VxbnIsIGZyYWduciwKLQkJCQkgYnB0ci0+c2VxbnIpOwotCQkJZGV2X2tmcmVlX3NrYihicHRyLT5za2IpOwotCQkJYnB0ci0+c2tiID0gTlVMTDsKLQkJfQotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQkvKiBpZiB3ZSBkaWRuJ3QgZmluZCBhIGNoYWluIGZvciB0aGUgc2VuZGVyIGFkZHJlc3MsIG9wdHIKLQkgICBwb2ludHMgZWl0aGVyIHRvIHRoZSBmaXJzdCBmcmVlIG9yIHRoZSBvbGRlc3QgZW50cnkgKi8KLQotCWlmIChmcmFnbnIgIT0gMCkgewotCQkvKiB0aGlzIGlzIG5vdCB0aGUgYmVnaW4gb2YgYSBmcmFnbWVudCBjaGFpbiAuLi4gKi8KLQkJYXQ3Nl9kYmcoREJHX1JYX0ZSQUdTLAotCQkJICIlczogbm8gY2hhaW4gZm9yIG5vbi1maXJzdCBmcmFnbWVudCAoJWQpIiwKLQkJCSBwcml2LT5uZXRkZXYtPm5hbWUsIGZyYWducik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCUJVR19PTighb3B0cik7Ci0JaWYgKG9wdHItPnNrYikgewotCQkvKiBzd2FwIHRoZSBza2IncyAqLwotCQlza2IgPSBvcHRyLT5za2I7Ci0JCW9wdHItPnNrYiA9IHByaXYtPnJ4X3NrYjsKLQkJcHJpdi0+cnhfc2tiID0gc2tiOwotCi0JCWF0NzZfZGJnKERCR19SWF9GUkFHUywKLQkJCSAiJXM6IGZyZWUgb2xkIGNvbnRlbnRzOiBzZW5kZXIgJXMgc2VxL2ZyYWcgJWQvJWQiLAotCQkJIHByaXYtPm5ldGRldi0+bmFtZSwgbWFjMnN0cihvcHRyLT5zZW5kZXIpLAotCQkJIG9wdHItPnNlcW5yLCBvcHRyLT5mcmFnbnIpOwotCi0JfSBlbHNlIHsKLQkJLyogdGFrZSB0aGUgc2tiIGZyb20gcHJpdi0+cnhfc2tiICovCi0JCW9wdHItPnNrYiA9IHByaXYtPnJ4X3NrYjsKLQkJLyogbGV0IGF0NzZfc3VibWl0X3J4X3VyYigpIGFsbG9jYXRlIGEgbmV3IHNrYiAqLwotCQlwcml2LT5yeF9za2IgPSBOVUxMOwotCi0JCWF0NzZfZGJnKERCR19SWF9GUkFHUywgIiVzOiB1c2UgYSBmcmVlIGVudHJ5IiwKLQkJCSBwcml2LT5uZXRkZXYtPm5hbWUpOwotCX0KLQltZW1jcHkob3B0ci0+c2VuZGVyLCBpODAyXzExX2hkci0+YWRkcjIsIEVUSF9BTEVOKTsKLQlvcHRyLT5zZXFuciA9IHNlcW5yOwotCW9wdHItPmZyYWduciA9IDA7Ci0Jb3B0ci0+bGFzdF9yeCA9IGppZmZpZXM7Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotLyogUnggaW50ZXJydXB0OiB3ZSBleHBlY3QgdGhlIGNvbXBsZXRlIGRhdGEgYnVmZmVyIGluIHByaXYtPnJ4X3NrYiAqLwotc3RhdGljIHZvaWQgYXQ3Nl9yeF9kYXRhKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHByaXYtPm5ldGRldjsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmcHJpdi0+c3RhdHM7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHByaXYtPnJ4X3NrYjsKLQlzdHJ1Y3QgYXQ3Nl9yeF9idWZmZXIgKmJ1ZiA9IChzdHJ1Y3QgYXQ3Nl9yeF9idWZmZXIgKilza2ItPmRhdGE7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKmk4MDJfMTFfaGRyOwotCWludCBsZW5ndGggPSBsZTE2X3RvX2NwdShidWYtPndsZW5ndGgpOwotCi0JYXQ3Nl9kYmcoREJHX1JYX0RBVEEsICIlcyByZWNlaXZlZCBkYXRhIHBhY2tldDogJXMiLCBuZXRkZXYtPm5hbWUsCi0JCSBoZXgyc3RyKHNrYi0+ZGF0YSwgQVQ3Nl9SWF9IRFJMRU4pKTsKLQotCWF0NzZfZGJnKERCR19SWF9EQVRBX0NPTlRFTlQsICJyeCBwYWNrZXQ6ICVzIiwKLQkJIGhleDJzdHIoc2tiLT5kYXRhICsgQVQ3Nl9SWF9IRFJMRU4sIGxlbmd0aCkpOwotCi0Jc2tiID0gYXQ3Nl9jaGVja19mb3JfcnhfZnJhZ3MocHJpdik7Ci0JaWYgKCFza2IpCi0JCXJldHVybjsKLQotCS8qIEF0bWVsIGhlYWRlciBhbmQgdGhlIEZDUyBhcmUgYWxyZWFkeSByZW1vdmVkICovCi0JaTgwMl8xMV9oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKilza2ItPmRhdGE7Ci0KLQlza2ItPmRldiA9IG5ldGRldjsKLQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CS8qIFRPRE86IHNob3VsZCBjaGVjayBDUkMgKi8KLQotCWlmIChpc19icm9hZGNhc3RfZXRoZXJfYWRkcihpODAyXzExX2hkci0+YWRkcjEpKSB7Ci0JCWlmICghY29tcGFyZV9ldGhlcl9hZGRyKGk4MDJfMTFfaGRyLT5hZGRyMSwgbmV0ZGV2LT5icm9hZGNhc3QpKQotCQkJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9CUk9BRENBU1Q7Ci0JCWVsc2UKLQkJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfTVVMVElDQVNUOwotCX0gZWxzZSBpZiAoY29tcGFyZV9ldGhlcl9hZGRyKGk4MDJfMTFfaGRyLT5hZGRyMSwgbmV0ZGV2LT5kZXZfYWRkcikpCi0JCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfT1RIRVJIT1NUOwotCi0JYXQ3Nl9pZWVlODAyMTFfdG9fZXRoKHNrYiwgcHJpdi0+aXdfbW9kZSk7Ci0KLQluZXRkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwotCW5ldGlmX3J4KHNrYik7Ci0Jc3RhdHMtPnJ4X3BhY2tldHMrKzsKLQlzdGF0cy0+cnhfYnl0ZXMgKz0gbGVuZ3RoOwotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCBhdDc2X3J4X21vbml0b3JfbW9kZShzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2KQotewotCXN0cnVjdCBhdDc2X3J4X3JhZGlvdGFwICpydDsKLQl1OCAqcGF5bG9hZDsKLQlpbnQgc2tibGVuOwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwcml2LT5uZXRkZXY7Ci0Jc3RydWN0IGF0NzZfcnhfYnVmZmVyICpidWYgPQotCSAgICAoc3RydWN0IGF0NzZfcnhfYnVmZmVyICopcHJpdi0+cnhfc2tiLT5kYXRhOwotCS8qIGxlbmd0aCBpbmNsdWRpbmcgdGhlIElFRUU4MDIuMTEgaGVhZGVyIGFuZCB0aGUgdHJhaWxpbmcgRkNTLAotCSAgIGJ1dCBub3QgYXQ3Nl9yeF9idWZmZXIgKi8KLQlpbnQgbGVuZ3RoID0gbGUxNl90b19jcHUoYnVmLT53bGVuZ3RoKTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJpdi0+cnhfc2tiOwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZwcml2LT5zdGF0czsKLQotCWlmIChsZW5ndGggPCBJRUVFODAyMTFfRkNTX0xFTikgewotCQkvKiBidWZmZXIgY29udGFpbnMgbm8gZGF0YSAqLwotCQlhdDc2X2RiZyhEQkdfTU9OSVRPUl9NT0RFLAotCQkJICIlczogTU9OSVRPUiBNT0RFOiByeCBza2Igd2l0aG91dCBkYXRhIiwKLQkJCSBwcml2LT5uZXRkZXYtPm5hbWUpOwotCQlyZXR1cm47Ci0JfQotCi0Jc2tibGVuID0gc2l6ZW9mKHN0cnVjdCBhdDc2X3J4X3JhZGlvdGFwKSArIGxlbmd0aDsKLQotCXNrYiA9IGRldl9hbGxvY19za2Ioc2tibGVuKTsKLQlpZiAoIXNrYikgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBNT05JVE9SIE1PREU6IGRldl9hbGxvY19za2IgZm9yIHJhZGlvdGFwICIKLQkJICAgICAgICJoZWFkZXIgcmV0dXJuZWQgTlVMTFxuIiwgcHJpdi0+bmV0ZGV2LT5uYW1lKTsKLQkJcmV0dXJuOwotCX0KLQotCXNrYl9wdXQoc2tiLCBza2JsZW4pOwotCi0JcnQgPSAoc3RydWN0IGF0NzZfcnhfcmFkaW90YXAgKilza2ItPmRhdGE7Ci0JcGF5bG9hZCA9IHNrYi0+ZGF0YSArIHNpemVvZihzdHJ1Y3QgYXQ3Nl9yeF9yYWRpb3RhcCk7Ci0KLQlydC0+cnRfaGRyLml0X3ZlcnNpb24gPSAwOwotCXJ0LT5ydF9oZHIuaXRfcGFkID0gMDsKLQlydC0+cnRfaGRyLml0X2xlbiA9IGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgYXQ3Nl9yeF9yYWRpb3RhcCkpOwotCXJ0LT5ydF9oZHIuaXRfcHJlc2VudCA9IGNwdV90b19sZTMyKEFUNzZfUlhfUkFESU9UQVBfUFJFU0VOVCk7Ci0KLQlydC0+cnRfdHNmdCA9IGNwdV90b19sZTY0KGxlMzJfdG9fY3B1KGJ1Zi0+cnhfdGltZSkpOwotCXJ0LT5ydF9yYXRlID0gaHdfcmF0ZXNbYnVmLT5yeF9yYXRlXSAmICh+MHg4MCk7Ci0JcnQtPnJ0X3NpZ25hbCA9IGJ1Zi0+cnNzaTsKLQlydC0+cnRfbm9pc2UgPSBidWYtPm5vaXNlX2xldmVsOwotCXJ0LT5ydF9mbGFncyA9IElFRUU4MDIxMV9SQURJT1RBUF9GX0ZDUzsKLQlpZiAoYnVmLT5mcmFnbWVudGF0aW9uKQotCQlydC0+cnRfZmxhZ3MgfD0gSUVFRTgwMjExX1JBRElPVEFQX0ZfRlJBRzsKLQotCW1lbWNweShwYXlsb2FkLCBidWYtPnBhY2tldCwgbGVuZ3RoKTsKLQlza2ItPmRldiA9IG5ldGRldjsKLQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7Ci0Jc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKLQlza2ItPnBrdF90eXBlID0gUEFDS0VUX09USEVSSE9TVDsKLQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfODAyXzIpOwotCi0JbmV0ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKLQluZXRpZl9yeChza2IpOwotCXN0YXRzLT5yeF9wYWNrZXRzKys7Ci0Jc3RhdHMtPnJ4X2J5dGVzICs9IGxlbmd0aDsKLX0KLQotLyogQ2hlY2sgaWYgd2Ugc3B5IG9uIHRoZSBzZW5kZXIgYWRkcmVzcyBpbiBidWYgYW5kIHVwZGF0ZSBzdGF0cyAqLwotc3RhdGljIHZvaWQgYXQ3Nl9pd3NweV91cGRhdGUoc3RydWN0IGF0NzZfcHJpdiAqcHJpdiwKLQkJCSAgICAgIHN0cnVjdCBhdDc2X3J4X2J1ZmZlciAqYnVmKQotewotCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICpoZHIgPQotCSAgICAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKilidWYtPnBhY2tldDsKLQlzdHJ1Y3QgaXdfcXVhbGl0eSBxdWFsOwotCi0JLyogV2UgY2FuIG9ubHkgc2V0IHRoZSBsZXZlbCBoZXJlICovCi0JcXVhbC51cGRhdGVkID0gSVdfUVVBTF9RVUFMX0lOVkFMSUQgfCBJV19RVUFMX05PSVNFX0lOVkFMSUQ7Ci0JcXVhbC5sZXZlbCA9IDA7Ci0JcXVhbC5ub2lzZSA9IDA7Ci0JYXQ3Nl9jYWxjX2xldmVsKHByaXYsIGJ1ZiwgJnF1YWwpOwotCi0Jc3Bpbl9sb2NrX2JoKCZwcml2LT5zcHlfc3BpbmxvY2spOwotCi0JaWYgKHByaXYtPnNweV9kYXRhLnNweV9udW1iZXIgPiAwKQotCQl3aXJlbGVzc19zcHlfdXBkYXRlKHByaXYtPm5ldGRldiwgaGRyLT5hZGRyMiwgJnF1YWwpOwotCi0Jc3Bpbl91bmxvY2tfYmgoJnByaXYtPnNweV9zcGlubG9jayk7Ci19Ci0KIHN0YXRpYyB2b2lkIGF0NzZfcnhfdGFza2xldCh1bnNpZ25lZCBsb25nIHBhcmFtKQogewogCXN0cnVjdCB1cmIgKnVyYiA9IChzdHJ1Y3QgdXJiICopcGFyYW07CiAJc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IHVyYi0+Y29udGV4dDsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcHJpdi0+bmV0ZGV2OwogCXN0cnVjdCBhdDc2X3J4X2J1ZmZlciAqYnVmOwotCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICppODAyXzExX2hkcjsKLQl1MTYgZnJhbWVfY3RsOworCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzIHJ4X3N0YXR1cyA9IHsgMCB9OwogCiAJaWYgKHByaXYtPmRldmljZV91bnBsdWdnZWQpIHsKIAkJYXQ3Nl9kYmcoREJHX0RFVlNUQVJULCAiZGV2aWNlIHVucGx1Z2dlZCIpOwpAQCAtNDk5MCw2MyArMTYyNSw0NCBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKCFwcml2LT5yeF9za2IgfHwgIW5ldGRldiB8fCAhcHJpdi0+cnhfc2tiLT5kYXRhKQorCWlmICghcHJpdi0+cnhfc2tiIHx8ICFwcml2LT5yeF9za2ItPmRhdGEpCiAJCXJldHVybjsKIAogCWJ1ZiA9IChzdHJ1Y3QgYXQ3Nl9yeF9idWZmZXIgKilwcml2LT5yeF9za2ItPmRhdGE7CiAKLQlpODAyXzExX2hkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqKWJ1Zi0+cGFja2V0OwotCi0JZnJhbWVfY3RsID0gbGUxNl90b19jcHUoaTgwMl8xMV9oZHItPmZyYW1lX2N0bCk7Ci0KIAlpZiAodXJiLT5zdGF0dXMgIT0gMCkgewogCQlpZiAodXJiLT5zdGF0dXMgIT0gLUVOT0VOVCAmJiB1cmItPnN0YXR1cyAhPSAtRUNPTk5SRVNFVCkKIAkJCWF0NzZfZGJnKERCR19VUkIsCiAJCQkJICIlcyAlczogLSBub256ZXJvIFJ4IGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsCi0JCQkJIF9fZnVuY19fLCBuZXRkZXYtPm5hbWUsIHVyYi0+c3RhdHVzKTsKKwkJCQkgX19mdW5jX18sIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwKKwkJCQkgdXJiLT5zdGF0dXMpOwogCQlyZXR1cm47CiAJfQogCiAJYXQ3Nl9kYmcoREJHX1JYX0FUTUVMX0hEUiwKLQkJICIlczogcnggZnJhbWU6IHJhdGUgJWQgcnNzaSAlZCBub2lzZSAlZCBsaW5rICVkICVzIiwKLQkJIHByaXYtPm5ldGRldi0+bmFtZSwgYnVmLT5yeF9yYXRlLCBidWYtPnJzc2ksIGJ1Zi0+bm9pc2VfbGV2ZWwsCi0JCSBidWYtPmxpbmtfcXVhbGl0eSwgaGV4MnN0cihpODAyXzExX2hkciwgNDgpKTsKLQlpZiAocHJpdi0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpIHsKLQkJYXQ3Nl9yeF9tb25pdG9yX21vZGUocHJpdik7Ci0JCWdvdG8gZXhpdDsKLQl9CisJCSAiJXM6IHJ4IGZyYW1lOiByYXRlICVkIHJzc2kgJWQgbm9pc2UgJWQgbGluayAlZCIsCisJCSB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIGJ1Zi0+cnhfcmF0ZSwgYnVmLT5yc3NpLAorCQkgYnVmLT5ub2lzZV9sZXZlbCwgYnVmLT5saW5rX3F1YWxpdHkpOwogCi0JLyogdGhlcmUgaXMgYSBuZXcgYnNzaWQgYXJvdW5kLCBhY2NlcHQgaXQ6ICovCi0JaWYgKGJ1Zi0+bmV3YnNzICYmIHByaXYtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykgewotCQlhdDc2X2RiZyhEQkdfUFJPR1JFU1MsICIlczogcnggbmV3YnNzIiwgbmV0ZGV2LT5uYW1lKTsKLQkJc2NoZWR1bGVfd29yaygmcHJpdi0+d29ya19uZXdfYnNzKTsKLQl9CisJc2tiX3RyaW0ocHJpdi0+cnhfc2tiLCBsZTE2X3RvX2NwdShidWYtPndsZW5ndGgpICsgQVQ3Nl9SWF9IRFJMRU4pOworCWF0NzZfZGJnX2R1bXAoREJHX1JYX0RBVEEsICZwcml2LT5yeF9za2ItPmRhdGFbQVQ3Nl9SWF9IRFJMRU5dLAorCQkgICAgICBwcml2LT5yeF9za2ItPmxlbiwgIlJYOiBsZW49JWQiLAorCQkgICAgICAoaW50KShwcml2LT5yeF9za2ItPmxlbiAtIEFUNzZfUlhfSERSTEVOKSk7CiAKLQlzd2l0Y2ggKGZyYW1lX2N0bCAmIElFRUU4MDIxMV9GQ1RMX0ZUWVBFKSB7Ci0JY2FzZSBJRUVFODAyMTFfRlRZUEVfREFUQToKLQkJYXQ3Nl9yeF9kYXRhKHByaXYpOwotCQlicmVhazsKKwlyeF9zdGF0dXMuc2lnbmFsID0gYnVmLT5yc3NpOworCS8qIEZJWE1FOiBpcyByYXRlX2lkeCBzdGlsbCBwcmVzZW50IGluIHN0cnVjdHVyZT8gKi8KKwlyeF9zdGF0dXMucmF0ZV9pZHggPSBidWYtPnJ4X3JhdGU7CisJcnhfc3RhdHVzLmZsYWcgfD0gUlhfRkxBR19ERUNSWVBURUQ7CisJcnhfc3RhdHVzLmZsYWcgfD0gUlhfRkxBR19JVl9TVFJJUFBFRDsKIAotCWNhc2UgSUVFRTgwMjExX0ZUWVBFX01HTVQ6Ci0JCS8qIGphbDogVE9ETzogZmluZCBvdXQgaWYgd2UgY2FuIHVwZGF0ZSBpd3NweSBhbHNvIG9uCi0JCSAgIG90aGVyIGZyYW1lcyB0aGFuIG1hbmFnZW1lbnQgKG1pZ2h0IGRlcGVuZCBvbiB0aGUKLQkJICAgcmFkaW8gY2hpcCAvIGZpcm13YXJlIHZlcnNpb24gISkgKi8KKwlza2JfcHVsbChwcml2LT5yeF9za2IsIEFUNzZfUlhfSERSTEVOKTsKKwlhdDc2X2RiZyhEQkdfTUFDODAyMTEsICJjYWxsaW5nIGllZWU4MDIxMV9yeF9pcnFzYWZlKCk6ICVkLyVkIiwKKwkJIHByaXYtPnJ4X3NrYi0+bGVuLCBwcml2LT5yeF9za2ItPmRhdGFfbGVuKTsKKwlpZWVlODAyMTFfcnhfaXJxc2FmZShwcml2LT5odywgcHJpdi0+cnhfc2tiLCAmcnhfc3RhdHVzKTsKIAotCQlhdDc2X2l3c3B5X3VwZGF0ZShwcml2LCBidWYpOworCS8qIFVzZSBhIG5ldyBza2IgZm9yIHRoZSBuZXh0IHJlY2VpdmUgKi8KKwlwcml2LT5yeF9za2IgPSBOVUxMOwogCi0JCWF0NzZfcnhfbWdtdChwcml2LCBidWYpOwotCQlicmVhazsKLQotCWNhc2UgSUVFRTgwMjExX0ZUWVBFX0NUTDoKLQkJYXQ3Nl9kYmcoREJHX1JYX0NUUkwsICIlczogaWdub3JlZCBjdHJsIGZyYW1lOiAlMDR4IiwKLQkJCSBwcml2LT5uZXRkZXYtPm5hbWUsIGZyYW1lX2N0bCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpZ25vcmluZyBmcmFtZSB3aXRoIGZyYW1lY3RsIDB4JTA0eFxuIiwKLQkJICAgICAgIHByaXYtPm5ldGRldi0+bmFtZSwgZnJhbWVfY3RsKTsKLQl9Ci1leGl0OgogCWF0NzZfc3VibWl0X3J4X3VyYihwcml2KTsKIH0KIApAQCAtNTA3Myw3ICsxNjg5LDcgQEAKIAkJCSAgIGZ3ZS0+ZnduYW1lKTsKIAkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnVkZXYtPmRldiwKIAkJCSAgICJ5b3UgbWF5IG5lZWQgdG8gZG93bmxvYWQgdGhlIGZpcm13YXJlIGZyb20gIgotCQkJICAgImh0dHA6Ly9kZXZlbG9wZXIuYmVybGlvcy5kZS9wcm9qZWN0cy9hdDc2YzUwM2EvIik7CisJCQkgICAiaHR0cDovL2RldmVsb3Blci5iZXJsaW9zLmRlL3Byb2plY3RzL2F0NzZjNTAzYS9cbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC01MTI2LDU2ICsxNzQyLDYyOCBAQAogCQlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIHZvaWQgYXQ3Nl9tYWM4MDIxMV90eF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHByaXYtPnR4X3NrYik7CisKKwlhdDc2X2RiZyhEQkdfTUFDODAyMTEsICIlcygpIiwgX19mdW5jX18pOworCisJc3dpdGNoICh1cmItPnN0YXR1cykgeworCWNhc2UgMDoKKwkJLyogc3VjY2VzcyAqLworCQkvKiBGSVhNRToKKwkJICogaXMgdGhlIGZyYW1lIHJlYWxseSBBQ0tlZCB3aGVuIHR4X2NhbGxiYWNrIGlzIGNhbGxlZCA/ICovCisJCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9TVEFUX0FDSzsKKwkJYnJlYWs7CisJY2FzZSAtRU5PRU5UOgorCWNhc2UgLUVDT05OUkVTRVQ6CisJCS8qIGZhaWwsIHVyYiBoYXMgYmVlbiB1bmxpbmtlZCAqLworCQkvKiBGSVhNRTogYWRkIGVycm9yIG1lc3NhZ2UgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYXQ3Nl9kYmcoREJHX1VSQiwgIiVzIC0gbm9uemVybyB0eCBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKKwkJCSBfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOworCQlicmVhazsKKwl9CisKKwltZW1zZXQoJmluZm8tPnN0YXR1cywgMCwgc2l6ZW9mKGluZm8tPnN0YXR1cykpOworCisJaWVlZTgwMjExX3R4X3N0YXR1c19pcnFzYWZlKHByaXYtPmh3LCBwcml2LT50eF9za2IpOworCisJcHJpdi0+dHhfc2tiID0gTlVMTDsKKworCWllZWU4MDIxMV93YWtlX3F1ZXVlcyhwcml2LT5odyk7Cit9CisKK3N0YXRpYyBpbnQgYXQ3Nl9tYWM4MDIxMV90eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gaHctPnByaXY7CisJc3RydWN0IGF0NzZfdHhfYnVmZmVyICp0eF9idWZmZXIgPSBwcml2LT5idWxrX291dF9idWZmZXI7CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOworCWludCBwYWRkaW5nLCBzdWJtaXRfbGVuLCByZXQ7CisKKwlhdDc2X2RiZyhEQkdfTUFDODAyMTEsICIlcygpIiwgX19mdW5jX18pOworCisJaWYgKHByaXYtPnR4X3VyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlcyBjYWxsZWQgd2hpbGUgdHggdXJiIGlzIHBlbmRpbmdcbiIsCisJCSAgICAgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksIF9fZnVuY19fKTsKKwkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOworCX0KKworCWllZWU4MDIxMV9zdG9wX3F1ZXVlcyhodyk7CisKKwlhdDc2X2xlZHRyaWdfdHhfYWN0aXZpdHkoKTsJLyogdGVsbCBsZWR0cmlnZ2VyIHdlIHNlbmQgYSBwYWNrZXQgKi8KKworCVdBUk5fT04ocHJpdi0+dHhfc2tiICE9IE5VTEwpOworCisJcHJpdi0+dHhfc2tiID0gc2tiOworCXBhZGRpbmcgPSBhdDc2X2NhbGNfcGFkZGluZyhza2ItPmxlbik7CisJc3VibWl0X2xlbiA9IEFUNzZfVFhfSERSTEVOICsgc2tiLT5sZW4gKyBwYWRkaW5nOworCisJLyogc2V0dXAgJ0F0bWVsJyBoZWFkZXIgKi8KKwltZW1zZXQodHhfYnVmZmVyLCAwLCBzaXplb2YoKnR4X2J1ZmZlcikpOworCXR4X2J1ZmZlci0+cGFkZGluZyA9IHBhZGRpbmc7CisJdHhfYnVmZmVyLT53bGVuZ3RoID0gY3B1X3RvX2xlMTYoc2tiLT5sZW4pOworCXR4X2J1ZmZlci0+dHhfcmF0ZSA9IGllZWU4MDIxMV9nZXRfdHhfcmF0ZShodywgaW5mbyktPmh3X3ZhbHVlOworCWlmIChGSVJNV0FSRV9JU19XUEEocHJpdi0+ZndfdmVyc2lvbikgJiYgaW5mby0+Y29udHJvbC5od19rZXkpIHsKKwkJdHhfYnVmZmVyLT5rZXlfaWQgPSAoaW5mby0+Y29udHJvbC5od19rZXktPmtleWlkeCk7CisJCXR4X2J1ZmZlci0+Y2lwaGVyX3R5cGUgPQorCQkJcHJpdi0+a2V5c1tpbmZvLT5jb250cm9sLmh3X2tleS0+a2V5aWR4XS5jaXBoZXI7CisJCXR4X2J1ZmZlci0+Y2lwaGVyX2xlbmd0aCA9CisJCQlwcml2LT5rZXlzW2luZm8tPmNvbnRyb2wuaHdfa2V5LT5rZXlpZHhdLmtleWxlbjsKKwkJdHhfYnVmZmVyLT5yZXNlcnZlZCA9IDA7CisJfSBlbHNlIHsKKwkJdHhfYnVmZmVyLT5rZXlfaWQgPSAwOworCQl0eF9idWZmZXItPmNpcGhlcl90eXBlID0gMDsKKwkJdHhfYnVmZmVyLT5jaXBoZXJfbGVuZ3RoID0gMDsKKwkJdHhfYnVmZmVyLT5yZXNlcnZlZCA9IDA7CisJfTsKKwkvKiBtZW1zZXQodHhfYnVmZmVyLT5yZXNlcnZlZCwgMCwgc2l6ZW9mKHR4X2J1ZmZlci0+cmVzZXJ2ZWQpKTsgKi8KKwltZW1jcHkodHhfYnVmZmVyLT5wYWNrZXQsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCisJYXQ3Nl9kYmcoREJHX1RYX0RBVEEsICIlcyB0eDogd2xlbiAweCV4IHBhZCAweCV4IHJhdGUgJWQgaGRyIiwKKwkJIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgbGUxNl90b19jcHUodHhfYnVmZmVyLT53bGVuZ3RoKSwKKwkJIHR4X2J1ZmZlci0+cGFkZGluZywgdHhfYnVmZmVyLT50eF9yYXRlKTsKKworCS8qIHNlbmQgc3R1ZmYgKi8KKwlhdDc2X2RiZ19kdW1wKERCR19UWF9EQVRBX0NPTlRFTlQsIHR4X2J1ZmZlciwgc3VibWl0X2xlbiwKKwkJICAgICAgIiVzKCk6IHR4X2J1ZmZlciAlZCBieXRlczoiLCBfX2Z1bmNfXywgc3VibWl0X2xlbik7CisJdXNiX2ZpbGxfYnVsa191cmIocHJpdi0+dHhfdXJiLCBwcml2LT51ZGV2LCBwcml2LT50eF9waXBlLCB0eF9idWZmZXIsCisJCQkgIHN1Ym1pdF9sZW4sIGF0NzZfbWFjODAyMTFfdHhfY2FsbGJhY2ssIHByaXYpOworCXJldCA9IHVzYl9zdWJtaXRfdXJiKHByaXYtPnR4X3VyYiwgR0ZQX0FUT01JQyk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvciBpbiB0eCBzdWJtaXQgdXJiOiAlZFxuIiwKKwkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgcmV0KTsKKwkJaWYgKHJldCA9PSAtRUlOVkFMKQorCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgIiVzOiAtRUlOVkFMOiB0eCB1cmIgJXAgaGNwcml2ICVwIGNvbXBsZXRlICVwXG4iLAorCQkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgcHJpdi0+dHhfdXJiLAorCQkJICAgICAgIHByaXYtPnR4X3VyYi0+aGNwcml2LCBwcml2LT50eF91cmItPmNvbXBsZXRlKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdDc2X21hYzgwMjExX3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlpbnQgcmV0OworCisJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiJXMoKSIsIF9fZnVuY19fKTsKKworCW11dGV4X2xvY2soJnByaXYtPm10eCk7CisKKwlyZXQgPSBhdDc2X3N1Ym1pdF9yeF91cmIocHJpdik7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogb3Blbjogc3VibWl0X3J4X3VyYiBmYWlsZWQ6ICVkXG4iLAorCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCByZXQpOworCQlnb3RvIGVycm9yOworCX0KKworCWF0NzZfc3RhcnR1cF9kZXZpY2UocHJpdik7CisKKwlhdDc2X3N0YXJ0X21vbml0b3IocHJpdik7CisKK2Vycm9yOgorCW11dGV4X3VubG9jaygmcHJpdi0+bXR4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhdDc2X21hYzgwMjExX3N0b3Aoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCisJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiJXMoKSIsIF9fZnVuY19fKTsKKworCW11dGV4X2xvY2soJnByaXYtPm10eCk7CisKKwlpZiAoIXByaXYtPmRldmljZV91bnBsdWdnZWQpIHsKKwkJLyogV2UgYXJlIGNhbGxlZCBieSAiaWZjb25maWcgZXRoWCBkb3duIiwgbm90IGJlY2F1c2UgdGhlCisJCSAqIGRldmljZSBpcyBub3QgYXZhaWxhYmxlIGFueW1vcmUuICovCisJCWlmIChhdDc2X3NldF9yYWRpbyhwcml2LCAwKSA9PSAxKQorCQkJYXQ3Nl93YWl0X2NvbXBsZXRpb24ocHJpdiwgQ01EX1JBRElPX09OKTsKKworCQkvKiBXZSB1bmxpbmsgcnhfdXJiIGJlY2F1c2UgYXQ3Nl9vcGVuKCkgcmUtc3VibWl0cyBpdC4KKwkJICogSWYgdW5wbHVnZ2VkLCBhdDc2X2RlbGV0ZV9kZXZpY2UoKSB0YWtlcyBjYXJlIG9mIGl0LiAqLworCQl1c2Jfa2lsbF91cmIocHJpdi0+cnhfdXJiKTsKKwl9CisKKwltdXRleF91bmxvY2soJnByaXYtPm10eCk7Cit9CisKK3N0YXRpYyBpbnQgYXQ3Nl9hZGRfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9pZl9pbml0X2NvbmYgKmNvbmYpCit7CisJc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCWludCByZXQgPSAwOworCisJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiJXMoKSIsIF9fZnVuY19fKTsKKworCW11dGV4X2xvY2soJnByaXYtPm10eCk7CisKKwlzd2l0Y2ggKGNvbmYtPnR5cGUpIHsKKwljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CisJCXByaXYtPml3X21vZGUgPSBJV19NT0RFX0lORlJBOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJZ290byBleGl0OworCX0KKworZXhpdDoKKwltdXRleF91bmxvY2soJnByaXYtPm10eCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBhdDc2X3JlbW92ZV9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2lmX2luaXRfY29uZiAqY29uZikKK3sKKwlhdDc2X2RiZyhEQkdfTUFDODAyMTEsICIlcygpIiwgX19mdW5jX18pOworfQorCitzdGF0aWMgaW50IGF0NzZfam9pbihzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2KQoreworCXN0cnVjdCBhdDc2X3JlcV9qb2luIGpvaW47CisJaW50IHJldDsKKworCW1lbXNldCgmam9pbiwgMCwgc2l6ZW9mKHN0cnVjdCBhdDc2X3JlcV9qb2luKSk7CisJbWVtY3B5KGpvaW4uZXNzaWQsIHByaXYtPmVzc2lkLCBwcml2LT5lc3NpZF9zaXplKTsKKwlqb2luLmVzc2lkX3NpemUgPSBwcml2LT5lc3NpZF9zaXplOworCW1lbWNweShqb2luLmJzc2lkLCBwcml2LT5ic3NpZCwgRVRIX0FMRU4pOworCWpvaW4uYnNzX3R5cGUgPSBJTkZSQVNUUlVDVFVSRV9NT0RFOworCWpvaW4uY2hhbm5lbCA9IHByaXYtPmNoYW5uZWw7CisJam9pbi50aW1lb3V0ID0gY3B1X3RvX2xlMTYoMjAwMCk7CisKKwlhdDc2X2RiZyhEQkdfTUFDODAyMTEsICIlczogc2VuZGluZyBDTURfSk9JTiIsIF9fZnVuY19fKTsKKwlyZXQgPSBhdDc2X3NldF9jYXJkX2NvbW1hbmQocHJpdi0+dWRldiwgQ01EX0pPSU4sICZqb2luLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IGF0NzZfcmVxX2pvaW4pKTsKKworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGF0NzZfc2V0X2NhcmRfY29tbWFuZCBmYWlsZWQ6ICVkXG4iLAorCQkgICAgICAgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLCByZXQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXQgPSBhdDc2X3dhaXRfY29tcGxldGlvbihwcml2LCBDTURfSk9JTik7CisJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiJXM6IENNRF9KT0lOIHJldHVybmVkOiAweCUwMngiLCBfX2Z1bmNfXywgcmV0KTsKKwlpZiAocmV0ICE9IENNRF9TVEFUVVNfQ09NUExFVEUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogYXQ3Nl93YWl0X2NvbXBsZXRpb24gZmFpbGVkOiAlZFxuIiwKKwkJICAgICAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSwgcmV0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJYXQ3Nl9zZXRfdGtpcF9ic3NpZChwcml2LCBwcml2LT5ic3NpZCk7CisJYXQ3Nl9zZXRfcG1fbW9kZShwcml2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhdDc2X2R3b3JrX2h3X3NjYW4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0NzZfcHJpdiwKKwkJCQkJICAgICAgZHdvcmtfaHdfc2Nhbi53b3JrKTsKKwlpbnQgcmV0OworCisJcmV0ID0gYXQ3Nl9nZXRfY21kX3N0YXR1cyhwcml2LT51ZGV2LCBDTURfU0NBTik7CisJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiJXM6IENNRF9TQ0FOIHN0YXR1cyAweCUwMngiLCBfX2Z1bmNfXywgcmV0KTsKKworCS8qIEZJWE1FOiBhZGQgbWF4aW11bSB0aW1lIGZvciBzY2FuIHRvIGNvbXBsZXRlICovCisKKwlpZiAocmV0ICE9IENNRF9TVEFUVVNfQ09NUExFVEUpIHsKKwkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPmh3LT53b3JrcXVldWUsICZwcml2LT5kd29ya19od19zY2FuLAorCQkJCSAgIFNDQU5fUE9MTF9JTlRFUlZBTCk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZWVlODAyMTFfc2Nhbl9jb21wbGV0ZWQocHJpdi0+aHcpOworCisJaWYgKGlzX3ZhbGlkX2V0aGVyX2FkZHIocHJpdi0+YnNzaWQpKSB7CisJCWllZWU4MDIxMV93YWtlX3F1ZXVlcyhwcml2LT5odyk7CisJCWF0NzZfam9pbihwcml2KTsKKwl9CisKKwlpZWVlODAyMTFfd2FrZV9xdWV1ZXMocHJpdi0+aHcpOworCitleGl0OgorCXJldHVybjsKK30KKworc3RhdGljIGludCBhdDc2X2h3X3NjYW4oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4ICpzc2lkLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlzdHJ1Y3QgYXQ3Nl9yZXFfc2NhbiBzY2FuOworCWludCByZXQ7CisKKwlhdDc2X2RiZyhEQkdfTUFDODAyMTEsICIlcygpOiIsIF9fZnVuY19fKTsKKwlhdDc2X2RiZ19kdW1wKERCR19NQUM4MDIxMSwgc3NpZCwgbGVuLCAic3NpZCAlemQgYnl0ZXM6IiwgbGVuKTsKKworCW11dGV4X2xvY2soJnByaXYtPm10eCk7CisKKwlpZWVlODAyMTFfc3RvcF9xdWV1ZXMoaHcpOworCisJbWVtc2V0KCZzY2FuLCAwLCBzaXplb2Yoc3RydWN0IGF0NzZfcmVxX3NjYW4pKTsKKwltZW1zZXQoc2Nhbi5ic3NpZCwgMHhGRiwgRVRIX0FMRU4pOworCXNjYW4uc2Nhbl90eXBlID0gU0NBTl9UWVBFX0FDVElWRTsKKwlpZiAocHJpdi0+ZXNzaWRfc2l6ZSA+IDApIHsKKwkJbWVtY3B5KHNjYW4uZXNzaWQsIHNzaWQsIGxlbik7CisJCXNjYW4uZXNzaWRfc2l6ZSA9IGxlbjsKKwl9CisJc2Nhbi5taW5fY2hhbm5lbF90aW1lID0gY3B1X3RvX2xlMTYocHJpdi0+c2Nhbl9taW5fdGltZSk7CisJc2Nhbi5tYXhfY2hhbm5lbF90aW1lID0gY3B1X3RvX2xlMTYocHJpdi0+c2Nhbl9tYXhfdGltZSk7CisJc2Nhbi5wcm9iZV9kZWxheSA9IGNwdV90b19sZTE2KHByaXYtPnNjYW5fbWluX3RpbWUgKiAxMDAwKTsKKwlzY2FuLmludGVybmF0aW9uYWxfc2NhbiA9IDA7CisKKwlhdDc2X2RiZyhEQkdfTUFDODAyMTEsICIlczogc2VuZGluZyBDTURfU0NBTiIsIF9fZnVuY19fKTsKKwlyZXQgPSBhdDc2X3NldF9jYXJkX2NvbW1hbmQocHJpdi0+dWRldiwgQ01EX1NDQU4sICZzY2FuLCBzaXplb2Yoc2NhbikpOworCisJaWYgKHJldCA8IDApIHsKKwkJZXJyKCJDTURfU0NBTiBmYWlsZWQ6ICVkIiwgcmV0KTsKKwkJZ290byBleGl0OworCX0KKworCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT5ody0+d29ya3F1ZXVlLCAmcHJpdi0+ZHdvcmtfaHdfc2NhbiwKKwkJCSAgIFNDQU5fUE9MTF9JTlRFUlZBTCk7CisKK2V4aXQ6CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdHgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXQ3Nl9jb25maWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiBjaGFuZ2VkKQoreworCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSAmaHctPmNvbmY7CisKKwlhdDc2X2RiZyhEQkdfTUFDODAyMTEsICIlcygpOiBjaGFubmVsICVkIHJhZGlvICVkIiwKKwkJIF9fZnVuY19fLCBjb25mLT5jaGFubmVsLT5od192YWx1ZSwgY29uZi0+cmFkaW9fZW5hYmxlZCk7CisJYXQ3Nl9kYmdfZHVtcChEQkdfTUFDODAyMTEsIHByaXYtPmVzc2lkLCBwcml2LT5lc3NpZF9zaXplLCAic3NpZDoiKTsKKwlhdDc2X2RiZ19kdW1wKERCR19NQUM4MDIxMSwgcHJpdi0+YnNzaWQsIEVUSF9BTEVOLCAiYnNzaWQ6Iik7CisKKwltdXRleF9sb2NrKCZwcml2LT5tdHgpOworCisJcHJpdi0+Y2hhbm5lbCA9IGNvbmYtPmNoYW5uZWwtPmh3X3ZhbHVlOworCisJaWYgKGlzX3ZhbGlkX2V0aGVyX2FkZHIocHJpdi0+YnNzaWQpKSB7CisJCWF0NzZfam9pbihwcml2KTsKKwkJaWVlZTgwMjExX3dha2VfcXVldWVzKHByaXYtPmh3KTsKKwl9IGVsc2UgeworCQlpZWVlODAyMTFfc3RvcF9xdWV1ZXMocHJpdi0+aHcpOworCQlhdDc2X3N0YXJ0X21vbml0b3IocHJpdik7CisJfTsKKworCW11dGV4X3VubG9jaygmcHJpdi0+bXR4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0NzZfY29uZmlnX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCQkgc3RydWN0IGllZWU4MDIxMV9pZl9jb25mICpjb25mKQoreworCXN0cnVjdCBhdDc2X3ByaXYgKnByaXYgPSBody0+cHJpdjsKKworCWF0NzZfZGJnX2R1bXAoREJHX01BQzgwMjExLCBjb25mLT5ic3NpZCwgRVRIX0FMRU4sICJic3NpZDoiKTsKKworCW11dGV4X2xvY2soJnByaXYtPm10eCk7CisKKwltZW1jcHkocHJpdi0+YnNzaWQsIGNvbmYtPmJzc2lkLCBFVEhfQUxFTik7CisvLwltZW1jcHkocHJpdi0+ZXNzaWQsIGNvbmYtPnNzaWQsIGNvbmYtPnNzaWRfbGVuKTsKKy8vCXByaXYtPmVzc2lkX3NpemUgPSBjb25mLT5zc2lkX2xlbjsKKworCWlmIChpc192YWxpZF9ldGhlcl9hZGRyKHByaXYtPmJzc2lkKSkgeworCQkvKiBtYWM4MDIxMSBpcyBqb2luaW5nIGEgYnNzICovCisJCWllZWU4MDIxMV93YWtlX3F1ZXVlcyhwcml2LT5odyk7CisJCWF0NzZfam9pbihwcml2KTsKKwl9IGVsc2UKKwkJaWVlZTgwMjExX3N0b3BfcXVldWVzKHByaXYtPmh3KTsKKworCW11dGV4X3VubG9jaygmcHJpdi0+bXR4KTsKKworCXJldHVybiAwOworfQorCisvKiBtdXN0IGJlIGF0b21pYyAqLworc3RhdGljIHZvaWQgYXQ3Nl9jb25maWd1cmVfZmlsdGVyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgdW5zaWduZWQgaW50IGNoYW5nZWRfZmxhZ3MsCisJCQkJICB1bnNpZ25lZCBpbnQgKnRvdGFsX2ZsYWdzLCBpbnQgbWNfY291bnQsCisJCQkJICBzdHJ1Y3QgZGV2X2FkZHJfbGlzdCAqbWNfbGlzdCkKK3sKKwlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gaHctPnByaXY7CisJaW50IGZsYWdzOworCisJYXQ3Nl9kYmcoREJHX01BQzgwMjExLCAiJXMoKTogY2hhbmdlZF9mbGFncz0weCUwOHggIgorCQkgInRvdGFsX2ZsYWdzPTB4JTA4eCBtY19jb3VudD0lZCIsCisJCSBfX2Z1bmNfXywgY2hhbmdlZF9mbGFncywgKnRvdGFsX2ZsYWdzLCBtY19jb3VudCk7CisKKwlmbGFncyA9IGNoYW5nZWRfZmxhZ3MgJiBBVDc2X1NVUFBPUlRFRF9GSUxURVJTOworCSp0b3RhbF9mbGFncyA9IEFUNzZfU1VQUE9SVEVEX0ZJTFRFUlM7CisKKwkvKiBGSVhNRTogYWNjZXNzIHRvIHByaXYtPnByb21pc2Mgc2hvdWxkIGJlIHByb3RlY3RlZCB3aXRoCisJICogcHJpdi0+bXR4LCBidXQgaXQncyBpbXBvc3NpYmxlIGJlY2F1c2UgdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBiZQorCSAqIGF0b21pYyAqLworCisJaWYgKGZsYWdzICYmICFwcml2LT5wcm9taXNjKSB7CisJCS8qIG1hYzgwMjExIHdhbnRzIHVzIHRvIGVuYWJsZSBwcm9taXNjdW91cyBtb2RlICovCisJCXByaXYtPnByb21pc2MgPSAxOworCX0gZWxzZSBpZiAoIWZsYWdzICYmIHByaXYtPnByb21pc2MpIHsKKwkJLyogd2UgbmVlZCB0byBkaXNhYmxlIHByb21pc2N1b3VzIG1vZGUgKi8KKwkJcHJpdi0+cHJvbWlzYyA9IDA7CisJfSBlbHNlCisJCXJldHVybjsKKworCXF1ZXVlX3dvcmsoaHctPndvcmtxdWV1ZSwgJnByaXYtPndvcmtfc2V0X3Byb21pc2MpOworfQorCitzdGF0aWMgaW50IGF0NzZfc2V0X2tleV9vbGRmdyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgZW51bSBzZXRfa2V5X2NtZCBjbWQsCisJCQljb25zdCB1OCAqbG9jYWxfYWRkcmVzcywgY29uc3QgdTggKmFkZHJlc3MsCisJCQlzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXkpCit7CisJc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCisJaW50IGk7CisKKwlhdDc2X2RiZyhEQkdfTUFDODAyMTEsICIlcygpOiBjbWQgJWQga2V5LT5hbGcgJWQga2V5LT5rZXlpZHggJWQgIgorCQkgImtleS0+a2V5bGVuICVkIiwKKwkJIF9fZnVuY19fLCBjbWQsIGtleS0+YWxnLCBrZXktPmtleWlkeCwga2V5LT5rZXlsZW4pOworCisJaWYgKGtleS0+YWxnICE9IEFMR19XRVApCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWtleS0+aHdfa2V5X2lkeCA9IGtleS0+a2V5aWR4OworCisJbXV0ZXhfbG9jaygmcHJpdi0+bXR4KTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTRVRfS0VZOgorCQltZW1jcHkocHJpdi0+d2VwX2tleXNba2V5LT5rZXlpZHhdLCBrZXktPmtleSwga2V5LT5rZXlsZW4pOworCQlwcml2LT53ZXBfa2V5c19sZW5ba2V5LT5rZXlpZHhdID0ga2V5LT5rZXlsZW47CisKKwkJLyogRklYTUU6IGZpbmQgb3V0IGhvdyB0byBkbyB0aGlzIHByb3Blcmx5ICovCisJCXByaXYtPndlcF9rZXlfaWQgPSBrZXktPmtleWlkeDsKKworCQlicmVhazsKKwljYXNlIERJU0FCTEVfS0VZOgorCWRlZmF1bHQ6CisJCXByaXYtPndlcF9rZXlzX2xlbltrZXktPmtleWlkeF0gPSAwOworCQlicmVhazsKKwl9CisKKwlwcml2LT53ZXBfZW5hYmxlZCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgV0VQX0tFWVM7IGkrKykgeworCQlpZiAocHJpdi0+d2VwX2tleXNfbGVuW2ldICE9IDApCisJCQlwcml2LT53ZXBfZW5hYmxlZCA9IDE7CisJfQorCisJYXQ3Nl9zdGFydHVwX2RldmljZShwcml2KTsKKworCW11dGV4X3VubG9jaygmcHJpdi0+bXR4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0NzZfc2V0X2tleV9uZXdmdyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgZW51bSBzZXRfa2V5X2NtZCBjbWQsCisJCQljb25zdCB1OCAqbG9jYWxfYWRkcmVzcywgY29uc3QgdTggKmFkZHJlc3MsCisJCQlzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXkpCit7CisJc3RydWN0IGF0NzZfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCWludCByZXQgPSAtRU9QTk9UU1VQUDsKKworCWF0NzZfZGJnKERCR19NQUM4MDIxMSwgIiVzKCk6IGNtZCAlZCBrZXktPmFsZyAlZCBrZXktPmtleWlkeCAlZCAiCisJCSAia2V5LT5rZXlsZW4gJWQiLAorCQkgX19mdW5jX18sIGNtZCwga2V5LT5hbGcsIGtleS0+a2V5aWR4LCBrZXktPmtleWxlbik7CisKKwltdXRleF9sb2NrKCZwcml2LT5tdHgpOworCisJcHJpdi0+bWliX2J1Zi50eXBlID0gTUlCX01BQ19FTkNSWVBUSU9OOworCisJaWYgKGNtZCA9PSBESVNBQkxFX0tFWSkgeworCQlwcml2LT5taWJfYnVmLnNpemUgPSBDSVBIRVJfS0VZX0xFTjsKKwkJcHJpdi0+bWliX2J1Zi5pbmRleCA9IG9mZnNldG9mKHN0cnVjdCBtaWJfbWFjX2VuY3J5cHRpb24sCisJCQkJY2lwaGVyX2RlZmF1bHRfa2V5dmFsdWVba2V5LT5rZXlpZHhdKTsKKwkJbWVtc2V0KHByaXYtPm1pYl9idWYuZGF0YS5kYXRhLCAwLCBDSVBIRVJfS0VZX0xFTik7CisJCWlmIChhdDc2X3NldF9taWIocHJpdiwgJnByaXYtPm1pYl9idWYpICE9IENNRF9TVEFUVVNfQ09NUExFVEUpCisJCQlyZXQgPSAtRU9QTk9UU1VQUDsgLyogLUVJTyB3b3VsZCBiZSBwcm9iYWJseSBiZXR0ZXIgKi8KKwkJZWxzZSB7CisKKwkJCXByaXYtPmtleXNba2V5LT5rZXlpZHhdLmNpcGhlciA9IENJUEhFUl9OT05FOworCQkJcHJpdi0+a2V5c1trZXktPmtleWlkeF0ua2V5bGVuID0gMDsKKwkJfTsKKwkJaWYgKHByaXYtPmRlZmF1bHRfZ3JvdXBfa2V5ID09IGtleS0+a2V5aWR4KQorCQkJcHJpdi0+ZGVmYXVsdF9ncm91cF9rZXkgPSAweGZmOworCisJCWlmIChwcml2LT5kZWZhdWx0X3BhaXJ3aXNlX2tleSA9PSBrZXktPmtleWlkeCkKKwkJCXByaXYtPmRlZmF1bHRfcGFpcndpc2Vfa2V5ID0gMHhmZjsKKwkJLyogSWYgZGVmYXVsdCBwYWlyd2lzZSBrZXkgaXMgcmVtb3ZlZCwgZmFsbCBiYWNrIHRvCisJCSAqIGdyb3VwIGtleT8gKi8KKwkJcmV0ID0gMDsKKwkJZ290byBleGl0OworCX07CisKKwlpZiAoY21kID09IFNFVF9LRVkpIHsKKwkJLyogc3RvcmUga2V5IGludG8gTUlCICovCisJCXByaXYtPm1pYl9idWYuc2l6ZSA9IENJUEhFUl9LRVlfTEVOOworCQlwcml2LT5taWJfYnVmLmluZGV4ID0gb2Zmc2V0b2Yoc3RydWN0IG1pYl9tYWNfZW5jcnlwdGlvbiwKKwkJCQljaXBoZXJfZGVmYXVsdF9rZXl2YWx1ZVtrZXktPmtleWlkeF0pOworCQltZW1zZXQocHJpdi0+bWliX2J1Zi5kYXRhLmRhdGEsIDAsIENJUEhFUl9LRVlfTEVOKTsKKwkJbWVtY3B5KHByaXYtPm1pYl9idWYuZGF0YS5kYXRhLCBrZXktPmtleSwga2V5LT5rZXlsZW4pOworCisJCXN3aXRjaCAoa2V5LT5hbGcpIHsKKwkJY2FzZSBBTEdfV0VQOgorCQkJaWYgKGtleS0+a2V5bGVuID09IDUpIHsKKwkJCQlwcml2LT5rZXlzW2tleS0+a2V5aWR4XS5jaXBoZXIgPQorCQkJCQlDSVBIRVJfV0VQNjQ7CisJCQkJcHJpdi0+a2V5c1trZXktPmtleWlkeF0ua2V5bGVuID0gODsKKwkJCX0gZWxzZSBpZiAoa2V5LT5rZXlsZW4gPT0gMTMpIHsKKwkJCQlwcml2LT5rZXlzW2tleS0+a2V5aWR4XS5jaXBoZXIgPQorCQkJCQlDSVBIRVJfV0VQMTI4OworCQkJCS8qIEZpcm13YXJlIG5lZWRzIHRoaXMgKi8KKwkJCQlwcml2LT5rZXlzW2tleS0+a2V5aWR4XS5rZXlsZW4gPSA4OworCQkJfSBlbHNlIHsKKwkJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJCQlnb3RvIGV4aXQ7CisJCQl9OworCQkJYnJlYWs7CisJCWNhc2UgQUxHX1RLSVA6CisJCQlrZXktPmZsYWdzIHw9IElFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9NTUlDOworCQkJcHJpdi0+a2V5c1trZXktPmtleWlkeF0uY2lwaGVyID0gQ0lQSEVSX1RLSVA7CisJCQlwcml2LT5rZXlzW2tleS0+a2V5aWR4XS5rZXlsZW4gPSAxMjsKKwkJCWJyZWFrOworCisJCWNhc2UgQUxHX0NDTVA6CisJCQlpZiAoIWF0NzZfaXNfNTA1YShwcml2LT5ib2FyZF90eXBlKSkgeworCQkJCXJldCA9IC1FT1BOT1RTVVBQOworCQkJCWdvdG8gZXhpdDsKKwkJCX07CisJCQlrZXktPmZsYWdzIHw9IElFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9NTUlDOworCQkJcHJpdi0+a2V5c1trZXktPmtleWlkeF0uY2lwaGVyID0gQ0lQSEVSX0NDTVA7CisJCQlwcml2LT5rZXlzW2tleS0+a2V5aWR4XS5rZXlsZW4gPSAxNjsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJCWdvdG8gZXhpdDsKKwkJfTsKKworCQlwcml2LT5taWJfYnVmLmRhdGEuZGF0YVszOF0gPSBwcml2LT5rZXlzW2tleS0+a2V5aWR4XS5jaXBoZXI7CisJCXByaXYtPm1pYl9idWYuZGF0YS5kYXRhWzM5XSA9IDE7IC8qIFRha2VuIGZyb20gYXRtZWx3bGFuZHJpdmVyLAorCQkJCQkJICAgIG5vdCBkb2N1bWVudGVkICovCisKKwkJaWYgKGlzX3ZhbGlkX2V0aGVyX2FkZHIoYWRkcmVzcykpCisJCQkvKiBQYWlyd2lzZSBrZXkgKi8KKwkJCXByaXYtPm1pYl9idWYuZGF0YS5kYXRhWzM5XSB8PSAoS0VZX1BBSVJXSVNFIHwgS0VZX1RYKTsKKwkJZWxzZSBpZiAoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoYWRkcmVzcykpCisJCQkvKiBHcm91cCBrZXkgKi8KKwkJCXByaXYtPm1pYl9idWYuZGF0YS5kYXRhWzM5XSB8PSAoS0VZX1RYKTsKKwkJZWxzZQkvKiBLZXkgdXNlZCBvbmx5IGZvciB0cmFuc21pc3Npb24gPz8/ICovCisJCQlwcml2LT5taWJfYnVmLmRhdGEuZGF0YVszOV0gfD0gKEtFWV9UWCk7CisKKwkJaWYgKGF0NzZfc2V0X21pYihwcml2LCAmcHJpdi0+bWliX2J1ZikgIT0KKwkJCQlDTURfU1RBVFVTX0NPTVBMRVRFKSB7CisJCQlyZXQgPSAtRU9QTk9UU1VQUDsgLyogLUVJTyB3b3VsZCBiZSBwcm9iYWJseSBiZXR0ZXIgKi8KKwkJCWdvdG8gZXhpdDsKKwkJfTsKKworCQlpZiAoKGtleS0+YWxnID09IEFMR19US0lQKSB8fCAoa2V5LT5hbGcgPT0gQUxHX0NDTVApKQorCQkJYXQ3Nl9yZXNldF9yc2MocHJpdik7CisKKwkJa2V5LT5od19rZXlfaWR4ID0ga2V5LT5rZXlpZHg7CisKKwkJLyogU2V0IHVwIGRlZmF1bHQga2V5cyAqLworCQlpZiAoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoYWRkcmVzcykpCisJCQlwcml2LT5kZWZhdWx0X2dyb3VwX2tleSA9IGtleS0+a2V5aWR4OworCQlpZiAoaXNfdmFsaWRfZXRoZXJfYWRkcihhZGRyZXNzKSkKKwkJCXByaXYtPmRlZmF1bHRfcGFpcndpc2Vfa2V5ID0ga2V5LT5rZXlpZHg7CisKKwkJLyogU2V0IHVwIGVuY3J5cHRpb24gTUlCcyAqLworCisJCS8qIGZpcnN0IGJsb2NrIG9mIHNldHRpbmdzICovCisJCXByaXYtPm1pYl9idWYuc2l6ZSA9IDM7CisJCXByaXYtPm1pYl9idWYuaW5kZXggPSBvZmZzZXRvZihzdHJ1Y3QgbWliX21hY19lbmNyeXB0aW9uLAorCQkJCXByaXZhY3lfaW52b2tlZCk7CisJCXByaXYtPm1pYl9idWYuZGF0YS5kYXRhWzBdID0gMTsJLyogcHJpdmFjeV9pbnZva2VkICovCisJCXByaXYtPm1pYl9idWYuZGF0YS5kYXRhWzFdID0gcHJpdi0+ZGVmYXVsdF9wYWlyd2lzZV9rZXk7CisJCXByaXYtPm1pYl9idWYuZGF0YS5kYXRhWzJdID0gcHJpdi0+ZGVmYXVsdF9ncm91cF9rZXk7CisKKwkJcmV0ID0gYXQ3Nl9zZXRfbWliKHByaXYsICZwcml2LT5taWJfYnVmKTsKKwkJaWYgKHJldCAhPSBDTURfU1RBVFVTX0NPTVBMRVRFKQorCQkJZ290byBleGl0OworCisJCS8qIHNlY29uZCBibG9jayBvZiBzZXR0aW5ncyAqLworCQlwcml2LT5taWJfYnVmLnNpemUgPSAzOworCQlwcml2LT5taWJfYnVmLmluZGV4ID0gb2Zmc2V0b2Yoc3RydWN0IG1pYl9tYWNfZW5jcnlwdGlvbiwKKwkJCQlleGNsdWRlX3VuZW5jcnlwdGVkKTsKKwkJcHJpdi0+bWliX2J1Zi5kYXRhLmRhdGFbMF0gPSAxOwkvKiBleGNsdWRlX3VuZW5jcnlwdGVkICovCisJCXByaXYtPm1pYl9idWYuZGF0YS5kYXRhWzFdID0gMDsJLyogd2VwX2VuY3J5cHRpb25fdHlwZSAqLworCQlwcml2LT5taWJfYnVmLmRhdGEuZGF0YVsyXSA9IDA7CS8qIGNraXBfa2V5X3Blcm11dGF0aW9uICovCisKKwkJcmV0ID0gYXQ3Nl9zZXRfbWliKHByaXYsICZwcml2LT5taWJfYnVmKTsKKwkJaWYgKHJldCAhPSBDTURfU1RBVFVTX0NPTVBMRVRFKQorCQkJZ290byBleGl0OworCQlyZXQgPSAwOworCX07CitleGl0OgorCWF0NzZfZHVtcF9taWJfbWFjX2VuY3J5cHRpb24ocHJpdik7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdHgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXQ3Nl9zZXRfa2V5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBlbnVtIHNldF9rZXlfY21kIGNtZCwKKwkJCWNvbnN0IHU4ICpsb2NhbF9hZGRyZXNzLCBjb25zdCB1OCAqYWRkcmVzcywKKwkJCXN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSkKK3sKKwlzdHJ1Y3QgYXQ3Nl9wcml2ICpwcml2ID0gaHctPnByaXY7CisKKwlhdDc2X2RiZyhEQkdfTUFDODAyMTEsICIlcygpOiBjbWQgJWQga2V5LT5hbGcgJWQga2V5LT5rZXlpZHggJWQgIgorCQkgImtleS0+a2V5bGVuICVkIiwKKwkJIF9fZnVuY19fLCBjbWQsIGtleS0+YWxnLCBrZXktPmtleWlkeCwga2V5LT5rZXlsZW4pOworCisJaWYgKEZJUk1XQVJFX0lTX1dQQShwcml2LT5md192ZXJzaW9uKSkKKwkJcmV0dXJuIGF0NzZfc2V0X2tleV9uZXdmdyhodywgY21kLCBsb2NhbF9hZGRyZXNzLCBhZGRyZXNzLCBrZXkpOworCWVsc2UKKwkJcmV0dXJuIGF0NzZfc2V0X2tleV9vbGRmdyhodywgY21kLCBsb2NhbF9hZGRyZXNzLCBhZGRyZXNzLCBrZXkpOworCit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX29wcyBhdDc2X29wcyA9IHsKKwkudHggPSBhdDc2X21hYzgwMjExX3R4LAorCS5hZGRfaW50ZXJmYWNlID0gYXQ3Nl9hZGRfaW50ZXJmYWNlLAorCS5yZW1vdmVfaW50ZXJmYWNlID0gYXQ3Nl9yZW1vdmVfaW50ZXJmYWNlLAorCS5jb25maWcgPSBhdDc2X2NvbmZpZywKKwkuY29uZmlnX2ludGVyZmFjZSA9IGF0NzZfY29uZmlnX2ludGVyZmFjZSwKKwkuY29uZmlndXJlX2ZpbHRlciA9IGF0NzZfY29uZmlndXJlX2ZpbHRlciwKKwkuc3RhcnQgPSBhdDc2X21hYzgwMjExX3N0YXJ0LAorCS5zdG9wID0gYXQ3Nl9tYWM4MDIxMV9zdG9wLAorCS5od19zY2FuID0gYXQ3Nl9od19zY2FuLAorCS5zZXRfa2V5ID0gYXQ3Nl9zZXRfa2V5LAorfTsKKwogLyogQWxsb2NhdGUgbmV0d29yayBkZXZpY2UgYW5kIGluaXRpYWxpemUgcHJpdmF0ZSBkYXRhICovCiBzdGF0aWMgc3RydWN0IGF0NzZfcHJpdiAqYXQ3Nl9hbGxvY19uZXdfZGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHc7CiAJc3RydWN0IGF0NzZfcHJpdiAqcHJpdjsKLQlpbnQgaTsKIAotCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3Igb3VyIGRldmljZSBzdGF0ZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLwotCW5ldGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgYXQ3Nl9wcml2KSk7Ci0JaWYgKCFuZXRkZXYpIHsKLQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnVkZXYtPmRldiwgIm91dCBvZiBtZW1vcnlcbiIpOworCWh3ID0gaWVlZTgwMjExX2FsbG9jX2h3KHNpemVvZihzdHJ1Y3QgYXQ3Nl9wcml2KSwgJmF0NzZfb3BzKTsKKwlpZiAoIWh3KSB7CisJCXByaW50ayhLRVJOX0VSUiBEUklWRVJfTkFNRSAiOiBjb3VsZCBub3QgcmVnaXN0ZXIiCisJCSAgICAgICAiIGllZWU4MDIxMV9od1xuIik7CiAJCXJldHVybiBOVUxMOwogCX0KIAotCXByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXByaXYgPSBody0+cHJpdjsKKwlwcml2LT5odyA9IGh3OwogCiAJcHJpdi0+dWRldiA9IHVkZXY7Ci0JcHJpdi0+bmV0ZGV2ID0gbmV0ZGV2OwogCiAJbXV0ZXhfaW5pdCgmcHJpdi0+bXR4KTsKLQlJTklUX1dPUksoJnByaXYtPndvcmtfYXNzb2NfZG9uZSwgYXQ3Nl93b3JrX2Fzc29jX2RvbmUpOwotCUlOSVRfV09SSygmcHJpdi0+d29ya19qb2luLCBhdDc2X3dvcmtfam9pbik7Ci0JSU5JVF9XT1JLKCZwcml2LT53b3JrX25ld19ic3MsIGF0NzZfd29ya19uZXdfYnNzKTsKLQlJTklUX1dPUksoJnByaXYtPndvcmtfc3RhcnRfc2NhbiwgYXQ3Nl93b3JrX3N0YXJ0X3NjYW4pOwogCUlOSVRfV09SSygmcHJpdi0+d29ya19zZXRfcHJvbWlzYywgYXQ3Nl93b3JrX3NldF9wcm9taXNjKTsKIAlJTklUX1dPUksoJnByaXYtPndvcmtfc3VibWl0X3J4LCBhdDc2X3dvcmtfc3VibWl0X3J4KTsKLQlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+ZHdvcmtfcmVzdGFydCwgYXQ3Nl9kd29ya19yZXN0YXJ0KTsKLQlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+ZHdvcmtfZ2V0X3NjYW4sIGF0NzZfZHdvcmtfZ2V0X3NjYW4pOwotCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5kd29ya19iZWFjb24sIGF0NzZfZHdvcmtfYmVhY29uKTsKLQlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+ZHdvcmtfYXV0aCwgYXQ3Nl9kd29ya19hdXRoKTsKLQlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+ZHdvcmtfYXNzb2MsIGF0NzZfZHdvcmtfYXNzb2MpOwotCi0Jc3Bpbl9sb2NrX2luaXQoJnByaXYtPm1nbXRfc3BpbmxvY2spOwotCXByaXYtPm5leHRfbWdtdF9idWxrID0gTlVMTDsKLQlwcml2LT5tYWNfc3RhdGUgPSBNQUNfSU5JVDsKLQotCS8qIGluaXRpYWxpemUgZW1wdHkgQlNTIGxpc3QgKi8KLQlwcml2LT5jdXJyX2JzcyA9IE5VTEw7Ci0JSU5JVF9MSVNUX0hFQUQoJnByaXYtPmJzc19saXN0KTsKLQlzcGluX2xvY2tfaW5pdCgmcHJpdi0+YnNzX2xpc3Rfc3BpbmxvY2spOwotCi0JaW5pdF90aW1lcigmcHJpdi0+YnNzX2xpc3RfdGltZXIpOwotCXByaXYtPmJzc19saXN0X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylwcml2OwotCXByaXYtPmJzc19saXN0X3RpbWVyLmZ1bmN0aW9uID0gYXQ3Nl9ic3NfbGlzdF90aW1lb3V0OwotCi0Jc3Bpbl9sb2NrX2luaXQoJnByaXYtPnNweV9zcGlubG9jayk7Ci0KLQkvKiBtYXJrIGFsbCByeCBkYXRhIGVudHJpZXMgYXMgdW51c2VkICovCi0JZm9yIChpID0gMDsgaSA8IE5SX1JYX0RBVEFfQlVGOyBpKyspCi0JCXByaXYtPnJ4X2RhdGFbaV0uc2tiID0gTlVMTDsKKwlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+ZHdvcmtfaHdfc2NhbiwgYXQ3Nl9kd29ya19od19zY2FuKTsKIAogCXByaXYtPnJ4X3Rhc2tsZXQuZnVuYyA9IGF0NzZfcnhfdGFza2xldDsKIAlwcml2LT5yeF90YXNrbGV0LmRhdGEgPSAwOwpAQCAtNTE4Myw2ICsyMzcxLDkgQEAKIAlwcml2LT5wbV9tb2RlID0gQVQ3Nl9QTV9PRkY7CiAJcHJpdi0+cG1fcGVyaW9kID0gMDsKIAorCS8qIHVuaXQgdXMgKi8KKwlwcml2LT5ody0+Y2hhbm5lbF9jaGFuZ2VfdGltZSA9IDEwMDAwMDsKKwogCXJldHVybiBwcml2OwogfQogCkBAIC01MjQ1LDExICsyNDM2LDQyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgYXQ3Nl9yYXRlc1tdID0geworCXsgLmJpdHJhdGUgPSAxMCwgLmh3X3ZhbHVlID0gVFhfUkFURV8xTUJJVCwgfSwKKwl7IC5iaXRyYXRlID0gMjAsIC5od192YWx1ZSA9IFRYX1JBVEVfMk1CSVQsIH0sCisJeyAuYml0cmF0ZSA9IDU1LCAuaHdfdmFsdWUgPSBUWF9SQVRFXzVfNU1CSVQsIH0sCisJeyAuYml0cmF0ZSA9IDExMCwgLmh3X3ZhbHVlID0gVFhfUkFURV8xMU1CSVQsIH0sCit9OworCitzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsIGF0NzZfY2hhbm5lbHNbXSA9IHsKKwl7IC5jZW50ZXJfZnJlcSA9IDI0MTIsIC5od192YWx1ZSA9IDEgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0MTcsIC5od192YWx1ZSA9IDIgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0MjIsIC5od192YWx1ZSA9IDMgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0MjcsIC5od192YWx1ZSA9IDQgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0MzIsIC5od192YWx1ZSA9IDUgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0MzcsIC5od192YWx1ZSA9IDYgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0NDIsIC5od192YWx1ZSA9IDcgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0NDcsIC5od192YWx1ZSA9IDggfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0NTIsIC5od192YWx1ZSA9IDkgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0NTcsIC5od192YWx1ZSA9IDEwIH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDYyLCAuaHdfdmFsdWUgPSAxMSB9LAorCXsgLmNlbnRlcl9mcmVxID0gMjQ2NywgLmh3X3ZhbHVlID0gMTIgfSwKKwl7IC5jZW50ZXJfZnJlcSA9IDI0NzIsIC5od192YWx1ZSA9IDEzIH0sCisJeyAuY2VudGVyX2ZyZXEgPSAyNDg0LCAuaHdfdmFsdWUgPSAxNCB9Cit9OworCitzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCBhdDc2X3N1cHBvcnRlZF9iYW5kID0geworCS5jaGFubmVscyA9IGF0NzZfY2hhbm5lbHMsCisJLm5fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKGF0NzZfY2hhbm5lbHMpLAorCS5iaXRyYXRlcyA9IGF0NzZfcmF0ZXMsCisJLm5fYml0cmF0ZXMgPSBBUlJBWV9TSVpFKGF0NzZfcmF0ZXMpLAorfTsKKwogLyogUmVnaXN0ZXIgbmV0d29yayBkZXZpY2UgYW5kIGluaXRpYWxpemUgdGhlIGhhcmR3YXJlICovCiBzdGF0aWMgaW50IGF0NzZfaW5pdF9uZXdfZGV2aWNlKHN0cnVjdCBhdDc2X3ByaXYgKnByaXYsCiAJCQkJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcHJpdi0+bmV0ZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpbnRlcmZhY2UtPmRldjsKIAlpbnQgcmV0OwogCiAJLyogc2V0IHVwIHRoZSBlbmRwb2ludCBpbmZvcm1hdGlvbiAqLwpAQCAtNTI2NSwxNCArMjQ4NywxMSBAQAogCS8qIE1BQyBhZGRyZXNzICovCiAJcmV0ID0gYXQ3Nl9nZXRfaHdfY29uZmlnKHByaXYpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9wcmludGsoS0VSTl9FUlIsICZpbnRlcmZhY2UtPmRldiwKLQkJCSAgICJjYW5ub3QgZ2V0IE1BQyBhZGRyZXNzXG4iKTsKKwkJZGV2X2VycihkZXYsICJjYW5ub3QgZ2V0IE1BQyBhZGRyZXNzXG4iKTsKIAkJZ290byBleGl0OwogCX0KIAogCXByaXYtPmRvbWFpbiA9IGF0NzZfZ2V0X3JlZ19kb21haW4ocHJpdi0+cmVndWxhdG9yeV9kb21haW4pOwotCS8qIGluaXQuIG5ldGRldi0+ZGV2X2FkZHIgKi8KLQltZW1jcHkobmV0ZGV2LT5kZXZfYWRkciwgcHJpdi0+bWFjX2FkZHIsIEVUSF9BTEVOKTsKIAogCXByaXYtPmNoYW5uZWwgPSBERUZfQ0hBTk5FTDsKIAlwcml2LT5pd19tb2RlID0gSVdfTU9ERV9JTkZSQTsKQEAgLTUyODIsNDcgKzI1MDEsNTQgQEAKIAlwcml2LT50eHJhdGUgPSBUWF9SQVRFX0FVVE87CiAJcHJpdi0+cHJlYW1ibGVfdHlwZSA9IFBSRUFNQkxFX1RZUEVfTE9ORzsKIAlwcml2LT5iZWFjb25fcGVyaW9kID0gMTAwOwotCXByaXYtPmJlYWNvbnNfbGFzdF9xdWFsID0gamlmZmllczsKIAlwcml2LT5hdXRoX21vZGUgPSBXTEFOX0FVVEhfT1BFTjsKIAlwcml2LT5zY2FuX21pbl90aW1lID0gREVGX1NDQU5fTUlOX1RJTUU7CiAJcHJpdi0+c2Nhbl9tYXhfdGltZSA9IERFRl9TQ0FOX01BWF9USU1FOwogCXByaXYtPnNjYW5fbW9kZSA9IFNDQU5fVFlQRV9BQ1RJVkU7CisJcHJpdi0+ZGVmYXVsdF9wYWlyd2lzZV9rZXkgPSAweGZmOworCXByaXYtPmRlZmF1bHRfZ3JvdXBfa2V5ID0gMHhmZjsKIAotCW5ldGRldi0+ZmxhZ3MgJj0gfklGRl9NVUxUSUNBU1Q7CS8qIG5vdCB5ZXQgb3IgbmV2ZXIgKi8KLQluZXRkZXYtPm9wZW4gPSBhdDc2X29wZW47Ci0JbmV0ZGV2LT5zdG9wID0gYXQ3Nl9zdG9wOwotCW5ldGRldi0+Z2V0X3N0YXRzID0gYXQ3Nl9nZXRfc3RhdHM7Ci0JbmV0ZGV2LT5ldGh0b29sX29wcyA9ICZhdDc2X2V0aHRvb2xfb3BzOworCS8qIG1hYzgwMjExIGluaXRpYWxpc2F0aW9uICovCisJcHJpdi0+aHctPndpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXSA9ICZhdDc2X3N1cHBvcnRlZF9iYW5kOwogCi0JLyogQWRkIHBvaW50ZXJzIHRvIGVuYWJsZSBpd3NweSBzdXBwb3J0LiAqLwotCXByaXYtPndpcmVsZXNzX2RhdGEuc3B5X2RhdGEgPSAmcHJpdi0+c3B5X2RhdGE7Ci0JbmV0ZGV2LT53aXJlbGVzc19kYXRhID0gJnByaXYtPndpcmVsZXNzX2RhdGE7CisJaWYgKEZJUk1XQVJFX0lTX1dQQShwcml2LT5md192ZXJzaW9uKSAmJgorCQkoYXQ3Nl9pc181MDNyZm1kKHByaXYtPmJvYXJkX3R5cGUpIHx8CisJCSBhdDc2X2lzXzUwNShwcml2LT5ib2FyZF90eXBlKSkpCisJCXByaXYtPmh3LT5mbGFncyA9IElFRUU4MDIxMV9IV19TSUdOQUxfVU5TUEVDOworCWVsc2UKKwkJcHJpdi0+aHctPmZsYWdzID0gSUVFRTgwMjExX0hXX1JYX0lOQ0xVREVTX0ZDUyB8CisJCQkJICBJRUVFODAyMTFfSFdfU0lHTkFMX1VOU1BFQzsKIAotCW5ldGRldi0+aGFyZF9zdGFydF94bWl0ID0gYXQ3Nl90eDsKLQluZXRkZXYtPnR4X3RpbWVvdXQgPSBhdDc2X3R4X3RpbWVvdXQ7Ci0JbmV0ZGV2LT53YXRjaGRvZ190aW1lbyA9IDIgKiBIWjsKLQluZXRkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gJmF0NzZfaGFuZGxlcl9kZWY7Ci0JbmV0ZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBhdDc2X3NldF9tdWx0aWNhc3Q7Ci0JbmV0ZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBhdDc2X3NldF9tYWNfYWRkcmVzczsKLQlkZXZfYWxsb2NfbmFtZShuZXRkZXYsICJ3bGFuJWQiKTsKKwlwcml2LT5ody0+d2lwaHktPmludGVyZmFjZV9tb2RlcyA9IEJJVChOTDgwMjExX0lGVFlQRV9TVEFUSU9OKTsKIAotCXJldCA9IHJlZ2lzdGVyX25ldGRldihwcml2LT5uZXRkZXYpOworCVNFVF9JRUVFODAyMTFfREVWKHByaXYtPmh3LCAmaW50ZXJmYWNlLT5kZXYpOworCVNFVF9JRUVFODAyMTFfUEVSTV9BRERSKHByaXYtPmh3LCBwcml2LT5tYWNfYWRkcik7CisKKwlyZXQgPSBpZWVlODAyMTFfcmVnaXN0ZXJfaHcocHJpdi0+aHcpOwogCWlmIChyZXQpIHsKLQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJmludGVyZmFjZS0+ZGV2LAotCQkJICAgImNhbm5vdCByZWdpc3RlciBuZXRkZXZpY2UgKHN0YXR1cyAlZCkhXG4iLCByZXQpOworCQlkZXZfZXJyKGRldiwgImNhbm5vdCByZWdpc3RlciBtYWM4MDIxMSBodyAoc3RhdHVzICVkKSFcbiIsIHJldCk7CiAJCWdvdG8gZXhpdDsKIAl9Ci0JcHJpdi0+bmV0ZGV2X3JlZ2lzdGVyZWQgPSAxOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVTQiAlcywgTUFDICVzLCBmaXJtd2FyZSAlZC4lZC4lZC0lZFxuIiwKLQkgICAgICAgbmV0ZGV2LT5uYW1lLCBpbnRlcmZhY2UtPmRldi5idXNfaWQsIG1hYzJzdHIocHJpdi0+bWFjX2FkZHIpLAotCSAgICAgICBwcml2LT5md192ZXJzaW9uLm1ham9yLCBwcml2LT5md192ZXJzaW9uLm1pbm9yLAotCSAgICAgICBwcml2LT5md192ZXJzaW9uLnBhdGNoLCBwcml2LT5md192ZXJzaW9uLmJ1aWxkKTsKLQlwcmludGsoS0VSTl9JTkZPICIlczogcmVndWxhdG9yeSBkb21haW4gMHglMDJ4OiAlc1xuIiwgbmV0ZGV2LT5uYW1lLAotCSAgICAgICBwcml2LT5yZWd1bGF0b3J5X2RvbWFpbiwgcHJpdi0+ZG9tYWluLT5uYW1lKTsKKwlwcml2LT5tYWM4MDIxMV9yZWdpc3RlcmVkID0gMTsKIAotCS8qIHdlIGxldCB0aGlzIHRpbWVyIHJ1biB0aGUgd2hvbGUgdGltZSB0aGlzIGRyaXZlciBpbnN0YW5jZSBsaXZlcyAqLwotCW1vZF90aW1lcigmcHJpdi0+YnNzX2xpc3RfdGltZXIsIGppZmZpZXMgKyBCU1NfTElTVF9USU1FT1VUKTsKKwlkZXZfaW5mbyhkZXYsICIlczogVVNCICVzLCBNQUMgJXMsIGZpcm13YXJlICVkLiVkLiVkLSVkXG4iLAorCQkgd2lwaHlfbmFtZShwcml2LT5ody0+d2lwaHkpLAorCQkgZGV2X25hbWUoJmludGVyZmFjZS0+ZGV2KSwgbWFjMnN0cihwcml2LT5tYWNfYWRkciksCisJCSBwcml2LT5md192ZXJzaW9uLm1ham9yLCBwcml2LT5md192ZXJzaW9uLm1pbm9yLAorCQkgcHJpdi0+ZndfdmVyc2lvbi5wYXRjaCwgcHJpdi0+ZndfdmVyc2lvbi5idWlsZCk7CisJZGV2X2luZm8oZGV2LCAiJXM6IHJlZ3VsYXRvcnkgZG9tYWluIDB4JTAyeDogJXNcbiIsCisJCSB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSksCisJCSBwcml2LT5yZWd1bGF0b3J5X2RvbWFpbiwgcHJpdi0+ZG9tYWluLT5uYW1lKTsKKwlkZXZfaW5mbyhkZXYsICIlczogV1BBIHN1cHBvcnQ6ICIsIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSk7CisJaWYgKCFGSVJNV0FSRV9JU19XUEEocHJpdi0+ZndfdmVyc2lvbikpCisJCXByaW50aygibm9uZVxuIik7CisJZWxzZSB7CisJCWlmICghYXQ3Nl9pc181MDVhKHByaXYtPmJvYXJkX3R5cGUpKQorCQkJcHJpbnRrKCJUS0lQXG4iKTsKKwkJZWxzZQorCQkJcHJpbnRrKCJUS0lQLCBBRVMvQ0NNUFxuIik7CisJfTsKIAogZXhpdDoKIAlyZXR1cm4gcmV0OwpAQCAtNTMzMCwxNSArMjU1NiwxMyBAQAogCiBzdGF0aWMgdm9pZCBhdDc2X2RlbGV0ZV9kZXZpY2Uoc3RydWN0IGF0NzZfcHJpdiAqcHJpdikKIHsKLQlpbnQgaTsKLQogCWF0NzZfZGJnKERCR19QUk9DX0VOVFJZLCAiJXM6IEVOVEVSIiwgX19mdW5jX18pOwogCiAJLyogVGhlIGRldmljZSBpcyBnb25lLCBkb24ndCBib3RoZXIgdHVybmluZyBpdCBvZmYgKi8KIAlwcml2LT5kZXZpY2VfdW5wbHVnZ2VkID0gMTsKIAotCWlmIChwcml2LT5uZXRkZXZfcmVnaXN0ZXJlZCkKLQkJdW5yZWdpc3Rlcl9uZXRkZXYocHJpdi0+bmV0ZGV2KTsKKwlpZiAocHJpdi0+bWFjODAyMTFfcmVnaXN0ZXJlZCkKKwkJaWVlZTgwMjExX3VucmVnaXN0ZXJfaHcocHJpdi0+aHcpOwogCiAJLyogYXNzdW1pbmcgd2UgdXNlZCBrZXZlbnRkLCBpdCBtdXN0IHF1aWVzY2UgdG9vICovCiAJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKQEAgLTUzNTksMjUgKzI1ODMsMTEgQEAKIAlpZiAocHJpdi0+cnhfc2tiKQogCQlrZnJlZV9za2IocHJpdi0+cnhfc2tiKTsKIAotCWF0NzZfZnJlZV9ic3NfbGlzdChwcml2KTsKLQlkZWxfdGltZXJfc3luYygmcHJpdi0+YnNzX2xpc3RfdGltZXIpOwotCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX2dldF9zY2FuKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5kd29ya19iZWFjb24pOwotCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX2F1dGgpOwotCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmR3b3JrX2Fzc29jKTsKLQotCWlmIChwcml2LT5tYWNfc3RhdGUgPT0gTUFDX0NPTk5FQ1RFRCkKLQkJYXQ3Nl9pd2V2ZW50X2Jzc19kaXNjb25uZWN0KHByaXYtPm5ldGRldik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlJfUlhfREFUQV9CVUY7IGkrKykKLQkJaWYgKHByaXYtPnJ4X2RhdGFbaV0uc2tiKSB7Ci0JCQlkZXZfa2ZyZWVfc2tiKHByaXYtPnJ4X2RhdGFbaV0uc2tiKTsKLQkJCXByaXYtPnJ4X2RhdGFbaV0uc2tiID0gTlVMTDsKLQkJfQogCXVzYl9wdXRfZGV2KHByaXYtPnVkZXYpOwogCi0JYXQ3Nl9kYmcoREJHX1BST0NfRU5UUlksICIlczogYmVmb3JlIGZyZWVpbmcgcHJpdi9uZXRkZXYiLCBfX2Z1bmNfXyk7Ci0JZnJlZV9uZXRkZXYocHJpdi0+bmV0ZGV2KTsJLyogcHJpdiBpcyBpbiBuZXRkZXYgKi8KKwlhdDc2X2RiZyhEQkdfUFJPQ19FTlRSWSwgIiVzOiBiZWZvcmUgZnJlZWluZyBwcml2L2llZWU4MDIxMV9odyIsCisJCSBfX2Z1bmNfXyk7CisJaWVlZTgwMjExX2ZyZWVfaHcocHJpdi0+aHcpOwogCiAJYXQ3Nl9kYmcoREJHX1BST0NfRU5UUlksICIlczogRVhJVCIsIF9fZnVuY19fKTsKIH0KQEAgLTU0MTEsOCArMjYyMSw4IEBACiAJICAgd2UgZ2V0IDIwNCB3aXRoIDIuNC4yMywgRmliZXJsaW5lIEZMLVdMMjQwdSAoNTA1QStSRk1EMjk1OCkgPz8/ICovCiAKIAlpZiAob3BfbW9kZSA9PSBPUE1PREVfSFdfQ09ORklHX01PREUpIHsKLQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJmludGVyZmFjZS0+ZGV2LAotCQkJICAgImNhbm5vdCBoYW5kbGUgYSBkZXZpY2UgaW4gSFdfQ09ORklHX01PREVcbiIpOworCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwKKwkJCSJjYW5ub3QgaGFuZGxlIGEgZGV2aWNlIGluIEhXX0NPTkZJR19NT0RFXG4iKTsKIAkJcmV0ID0gLUVCVVNZOwogCQlnb3RvIGVycm9yOwogCX0KQEAgLTU0MjAsMTMgKzI2MzAsMTIgQEAKIAlpZiAob3BfbW9kZSAhPSBPUE1PREVfTk9STUFMX05JQ19XSVRIX0ZMQVNICiAJICAgICYmIG9wX21vZGUgIT0gT1BNT0RFX05PUk1BTF9OSUNfV0lUSE9VVF9GTEFTSCkgewogCQkvKiBkb3dubG9hZCBpbnRlcm5hbCBmaXJtd2FyZSBwYXJ0ICovCi0JCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmludGVyZmFjZS0+ZGV2LAotCQkJICAgImRvd25sb2FkaW5nIGludGVybmFsIGZpcm13YXJlXG4iKTsKKwkJZGV2X2RiZygmaW50ZXJmYWNlLT5kZXYsICJkb3dubG9hZGluZyBpbnRlcm5hbCBmaXJtd2FyZVxuIik7CiAJCXJldCA9IGF0NzZfbG9hZF9pbnRlcm5hbF9mdyh1ZGV2LCBmd2UpOwogCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJmludGVyZmFjZS0+ZGV2LAotCQkJCSAgICJlcnJvciAlZCBkb3dubG9hZGluZyBpbnRlcm5hbCBmaXJtd2FyZVxuIiwKLQkJCQkgICByZXQpOworCQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsCisJCQkJImVycm9yICVkIGRvd25sb2FkaW5nIGludGVybmFsIGZpcm13YXJlXG4iLAorCQkJCXJldCk7CiAJCQlnb3RvIGVycm9yOwogCQl9CiAJCXVzYl9wdXRfZGV2KHVkZXYpOwpAQCAtNTQ1MSw4ICsyNjYwLDcgQEAKIAkJbmVlZF9leHRfZncgPSAxOwogCiAJaWYgKG5lZWRfZXh0X2Z3KSB7Ci0JCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmludGVyZmFjZS0+ZGV2LAotCQkJICAgImRvd25sb2FkaW5nIGV4dGVybmFsIGZpcm13YXJlXG4iKTsKKwkJZGV2X2RiZygmaW50ZXJmYWNlLT5kZXYsICJkb3dubG9hZGluZyBleHRlcm5hbCBmaXJtd2FyZVxuIik7CiAKIAkJcmV0ID0gYXQ3Nl9sb2FkX2V4dGVybmFsX2Z3KHVkZXYsIGZ3ZSk7CiAJCWlmIChyZXQpCkBAIC01NDYxLDggKzI2NjksOCBAQAogCQkvKiBSZS1jaGVjayBmaXJtd2FyZSB2ZXJzaW9uICovCiAJCXJldCA9IGF0NzZfZ2V0X21pYih1ZGV2LCBNSUJfRldfVkVSU0lPTiwgJmZ3diwgc2l6ZW9mKGZ3dikpOwogCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJmludGVyZmFjZS0+ZGV2LAotCQkJCSAgICJlcnJvciAlZCBnZXR0aW5nIGZpcm13YXJlIHZlcnNpb25cbiIsIHJldCk7CisJCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwKKwkJCQkiZXJyb3IgJWQgZ2V0dGluZyBmaXJtd2FyZSB2ZXJzaW9uXG4iLCByZXQpOwogCQkJZ290byBlcnJvcjsKIAkJfQogCX0KQEAgLTU0NzMsNyArMjY4MSw2IEBACiAJCWdvdG8gZXJyb3I7CiAJfQogCi0JU0VUX05FVERFVl9ERVYocHJpdi0+bmV0ZGV2LCAmaW50ZXJmYWNlLT5kZXYpOwogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBwcml2KTsKIAogCW1lbWNweSgmcHJpdi0+ZndfdmVyc2lvbiwgJmZ3diwgc2l6ZW9mKHN0cnVjdCBtaWJfZndfdmVyc2lvbikpOwpAQCAtNTUwMSw3ICsyNzA4LDcgQEAKIAlpZiAoIXByaXYpCiAJCXJldHVybjsKIAotCXByaW50ayhLRVJOX0lORk8gIiVzOiBkaXNjb25uZWN0aW5nXG4iLCBwcml2LT5uZXRkZXYtPm5hbWUpOworCXByaW50ayhLRVJOX0lORk8gIiVzOiBkaXNjb25uZWN0aW5nXG4iLCB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSkpOwogCWF0NzZfZGVsZXRlX2RldmljZShwcml2KTsKIAlkZXZfcHJpbnRrKEtFUk5fSU5GTywgJmludGVyZmFjZS0+ZGV2LCAiZGlzY29ubmVjdGVkXG4iKTsKIH0KQEAgLTU1NTcsNSArMjc2NCw4IEBACiBNT0RVTEVfQVVUSE9SKCJOaWNrIEpvbmVzIik7CiBNT0RVTEVfQVVUSE9SKCJCYWxpbnQgU2VlYmVyIDxuMF81cDRtX3AxMzQ1M0Bob3RtYWlsLmNvbT4iKTsKIE1PRFVMRV9BVVRIT1IoIlBhdmVsIFJvc2tpbiA8cHJvc2tpQGdudS5vcmc+Iik7CitNT0RVTEVfQVVUSE9SKCJHdWlkbyBHdWVudGhlciA8YWd4QHNpZ3hjcHUub3JnPiIpOworTU9EVUxFX0FVVEhPUigiS2FsbGUgVmFsbyA8a2FsbGUudmFsb0Bpa2kuZmk+Iik7CitNT0RVTEVfQVVUSE9SKCJNaWxhbiBQbHppayA8bWlsYW4ucGx6aWtAZ21haWwuY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hdDc2X3VzYi9hdDc2X3VzYi5oIGIvZHJpdmVycy9zdGFnaW5nL2F0NzZfdXNiL2F0NzZfdXNiLmgKaW5kZXggYjIwYmU5ZC4uOGJiMzUyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2F0NzZfdXNiL2F0NzZfdXNiLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2F0NzZfdXNiL2F0NzZfdXNiLmgKQEAgLTM0LDIzICszNCw2IEBACiAJQk9BUkRfNTA1QU1YID0gOAogfTsKIAotLyogb3VyIHByaXZhdGUgaW9jdGwncyAqLwotLyogcHJlYW1ibGUgbGVuZ3RoICgwIC0gbG9uZywgMSAtIHNob3J0LCAyIC0gYXV0bykgKi8KLSNkZWZpbmUgQVQ3Nl9TRVRfU0hPUlRfUFJFQU1CTEUJCShTSU9DSVdGSVJTVFBSSVYgKyAwKQotI2RlZmluZSBBVDc2X0dFVF9TSE9SVF9QUkVBTUJMRQkJKFNJT0NJV0ZJUlNUUFJJViArIDEpCi0vKiB3aGljaCBkZWJ1ZyBjaGFubmVscyBhcmUgZW5hYmxlZCAqLwotI2RlZmluZSBBVDc2X1NFVF9ERUJVRwkJCShTSU9DSVdGSVJTVFBSSVYgKyAyKQotI2RlZmluZSBBVDc2X0dFVF9ERUJVRwkJCShTSU9DSVdGSVJTVFBSSVYgKyAzKQotLyogcG93ZXIgc2F2ZSBtb2RlIChpbmNsLiB0aGUgQXRtZWwgcHJvcHJpZXRhcnkgc21hcnQgc2F2ZSBtb2RlKSAqLwotI2RlZmluZSBBVDc2X1NFVF9QT1dFUlNBVkVfTU9ERQkJKFNJT0NJV0ZJUlNUUFJJViArIDQpCi0jZGVmaW5lIEFUNzZfR0VUX1BPV0VSU0FWRV9NT0RFCQkoU0lPQ0lXRklSU1RQUklWICsgNSkKLS8qIG1pbiBhbmQgbWF4IGNoYW5uZWwgdGltZXMgZm9yIHNjYW4gKi8KLSNkZWZpbmUgQVQ3Nl9TRVRfU0NBTl9USU1FUwkJKFNJT0NJV0ZJUlNUUFJJViArIDYpCi0jZGVmaW5lIEFUNzZfR0VUX1NDQU5fVElNRVMJCShTSU9DSVdGSVJTVFBSSVYgKyA3KQotLyogc2NhbiBtb2RlICgwIC0gYWN0aXZlLCAxIC0gcGFzc2l2ZSkgKi8KLSNkZWZpbmUgQVQ3Nl9TRVRfU0NBTl9NT0RFCQkoU0lPQ0lXRklSU1RQUklWICsgOCkKLSNkZWZpbmUgQVQ3Nl9HRVRfU0NBTl9NT0RFCQkoU0lPQ0lXRklSU1RQUklWICsgOSkKLQogI2RlZmluZSBDTURfU1RBVFVTX0lETEUJCQkJMHgwMAogI2RlZmluZSBDTURfU1RBVFVTX0NPTVBMRVRFCQkJMHgwMQogI2RlZmluZSBDTURfU1RBVFVTX1VOS05PV04JCQkweDAyCkBAIC04Miw2ICs2NSw3IEBACiAjZGVmaW5lIE1JQl9NQUMJCQkweDAzCiAjZGVmaW5lIE1JQl9NQUNfTUdNVAkJMHgwNQogI2RlZmluZSBNSUJfTUFDX1dFUAkJMHgwNgorI2RlZmluZSBNSUJfTUFDX0VOQ1JZUFRJT04JMHgwNgogI2RlZmluZSBNSUJfUEhZCQkJMHgwNwogI2RlZmluZSBNSUJfRldfVkVSU0lPTgkJMHgwOAogI2RlZmluZSBNSUJfTURPTUFJTgkJMHgwOQpAQCAtMTA2LDYgKzkwLDI2IEBACiAjZGVmaW5lIEFUNzZfUE1fT04JCTIKICNkZWZpbmUgQVQ3Nl9QTV9TTUFSVAkJMwogCisvKiBjaXBoZXIgdmFsdWVzIGZvciBlbmNyeXB0aW9uIGtleXMgKi8KKyNkZWZpbmUgQ0lQSEVSX05PTkUJCTAJLyogdGhpcyB2YWx1ZSBpcyBvbmx5IGd1ZXNzZWQgKi8KKyNkZWZpbmUgQ0lQSEVSX1dFUDY0CQkxCisjZGVmaW5lIENJUEhFUl9US0lQCQkyCisjZGVmaW5lIENJUEhFUl9DQ01QCQkzCisjZGVmaW5lIENJUEhFUl9DQ1gJCTQJLyogZm9yIGNvbnNpc3RlbmN5IHNha2Ugb25seSAqLworI2RlZmluZSBDSVBIRVJfV0VQMTI4CQk1CisKKy8qIGJpdCBmbGFncyBrZXkgdHlwZXMgZm9yIGVuY3J5cHRpb24ga2V5cyAqLworI2RlZmluZSBLRVlfUEFJUldJU0UJCTIKKyNkZWZpbmUgS0VZX1RYCQkJNAorCisjZGVmaW5lIENJUEhFUl9LRVlTCQkoNCkKKyNkZWZpbmUgQ0lQSEVSX0tFWV9MRU4JCSg0MCkKKworc3RydWN0IGtleV9jb25maWcgeworCXU4IGNpcGhlcjsKKwl1OCBrZXlsZW47Cit9OworCiBzdHJ1Y3QgaHdjZmdfcjUwNSB7CiAJdTggY3IzOV92YWx1ZXNbMTRdOwogCXU4IHJlc2VydmVkMVsxNF07CkBAIC0xNDcsNiArMTUxLDkgQEAKIAogI2RlZmluZSBXRVBfU01BTExfS0VZX0xFTgkoNDAgLyA4KQogI2RlZmluZSBXRVBfTEFSR0VfS0VZX0xFTgkoMTA0IC8gOCkKKyNkZWZpbmUgV0VQX0tFWVMJCSg0KQorCisKIAogc3RydWN0IGF0NzZfY2FyZF9jb25maWcgewogCXU4IGV4Y2x1ZGVfdW5lbmNyeXB0ZWQ7CkBAIC0xNjEsNyArMTY4LDcgQEAKIAl1OCBwcml2YWN5X2ludm9rZWQ7CiAJdTggd2VwX2RlZmF1bHRfa2V5X2lkOwkvKiAwLi4zICovCiAJdTggY3VycmVudF9zc2lkWzMyXTsKLQl1OCB3ZXBfZGVmYXVsdF9rZXlfdmFsdWVbNF1bV0VQX0tFWV9MRU5dOworCXU4IHdlcF9kZWZhdWx0X2tleV92YWx1ZVs0XVtXRVBfTEFSR0VfS0VZX0xFTl07CiAJdTggc3NpZF9sZW47CiAJdTggc2hvcnRfcHJlYW1ibGU7CiAJX19sZTE2IGJlYWNvbl9wZXJpb2Q7CkBAIC0xODYsNyArMTkzLDcgQEAKIAl1OCBsaW5rX3F1YWxpdHk7CiAJdTggbm9pc2VfbGV2ZWw7CiAJX19sZTMyIHJ4X3RpbWU7Ci0JdTggcGFja2V0W0lFRUU4MDIxMV9GUkFNRV9MRU4gKyBJRUVFODAyMTFfRkNTX0xFTl07CisJdTggcGFja2V0W0lFRUU4MDIxMV9NQVhfRlJBR19USFJFU0hPTERdOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyogTGVuZ3RoIG9mIEF0bWVsLXNwZWNpZmljIFR4IGhlYWRlciBiZWZvcmUgODAyLjExIGZyYW1lICovCkBAIC0xOTYsOCArMjAzLDExIEBACiAJX19sZTE2IHdsZW5ndGg7CiAJdTggdHhfcmF0ZTsKIAl1OCBwYWRkaW5nOwotCXU4IHJlc2VydmVkWzRdOwotCXU4IHBhY2tldFtJRUVFODAyMTFfRlJBTUVfTEVOICsgSUVFRTgwMjExX0ZDU19MRU5dOworCXU4IGtleV9pZDsKKwl1OCBjaXBoZXJfdHlwZTsKKwl1OCBjaXBoZXJfbGVuZ3RoOworCXU4IHJlc2VydmVkOworCXU4IHBhY2tldFtJRUVFODAyMTFfTUFYX0ZSQUdfVEhSRVNIT0xEXTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qIGRlZmluZXMgZm9yIHNjYW5fdHlwZSBiZWxvdyAqLwpAQCAtMjQ0LDYgKzI1NCw3IEBACiAJCXU4IGJ5dGU7CiAJCV9fbGUxNiB3b3JkOwogCQl1OCBhZGRyW0VUSF9BTEVOXTsKKwkJdTggZGF0YVsyNTZdOwkvKiB3ZSBuZWVkIG1vcmUgc3BhY2UgZm9yIG1pYl9tYWNfZW5jcnlwdGlvbiAqLwogCX0gZGF0YTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKQEAgLTMxNywxMCArMzI4LDI0IEBACiAJdTggZXhjbHVkZV91bmVuY3J5cHRlZDsKIAlfX2xlMzIgd2VwX2ljdl9lcnJvcl9jb3VudDsKIAlfX2xlMzIgd2VwX2V4Y2x1ZGVkX2NvdW50OwotCXU4IHdlcF9kZWZhdWx0X2tleXZhbHVlW1dFUF9LRVlTXVtXRVBfS0VZX0xFTl07CisJdTggd2VwX2RlZmF1bHRfa2V5dmFsdWVbV0VQX0tFWVNdW1dFUF9MQVJHRV9LRVlfTEVOXTsKIAl1OCBlbmNyeXB0aW9uX2xldmVsOwkvKiAxIGZvciA0MGJpdCwgMiBmb3IgMTA0Yml0IGVuY3J5cHRpb24gKi8KIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKK3N0cnVjdCBtaWJfbWFjX2VuY3J5cHRpb24geworCXU4IGNpcGhlcl9kZWZhdWx0X2tleXZhbHVlW0NJUEhFUl9LRVlTXVtDSVBIRVJfS0VZX0xFTl07CisJdTggdGtpcF9ic3NpZFs2XTsKKwl1OCBwcml2YWN5X2ludm9rZWQ7CisJdTggY2lwaGVyX2RlZmF1bHRfa2V5X2lkOworCXU4IGNpcGhlcl9kZWZhdWx0X2dyb3VwX2tleV9pZDsKKwl1OCBleGNsdWRlX3VuZW5jcnlwdGVkOworCXU4IHdlcF9lbmNyeXB0aW9uX3R5cGU7CisJdTggY2tpcF9rZXlfcGVybXV0YXRpb247CS8qIGJvb2wgKi8KKwlfX2xlMzIgd2VwX2ljdl9lcnJvcl9jb3VudDsKKwlfX2xlMzIgd2VwX2V4Y2x1ZGVkX2NvdW50OworCXU4IGtleV9yc2NbQ0lQSEVSX0tFWVNdWzhdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKwogc3RydWN0IG1pYl9waHkgewogCV9fbGUzMiBlZF90aHJlc2hvbGQ7CiAKQEAgLTM2NCwxNiArMzg5LDYgQEAKIAlfX2xlMzIgZXh0X2Z3X2xlbjsJLyogZXh0ZXJuYWwgZmlybXdhcmUgaW1hZ2UgbGVuZ3RoICovCiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCi1lbnVtIG1hY19zdGF0ZSB7Ci0JTUFDX0lOSVQsCi0JTUFDX1NDQU5OSU5HLAotCU1BQ19BVVRILAotCU1BQ19BU1NPQywKLQlNQUNfSk9JTklORywKLQlNQUNfQ09OTkVDVEVELAotCU1BQ19PV05fSUJTUwotfTsKLQogLyogYSBkZXNjcmlwdGlvbiBvZiBhIHJlZ3VsYXRvcnkgZG9tYWluIGFuZCB0aGUgYWxsb3dlZCBjaGFubmVscyAqLwogc3RydWN0IHJlZ19kb21haW4gewogCXUxNiBjb2RlOwpAQCAtMzgxLDQ3ICszOTYsNiBAQAogCXUzMiBjaGFubmVsX21hcDsJLyogaWYgYml0IE4gaXMgc2V0LCBjaGFubmVsIChOKzEpIGlzIGFsbG93ZWQgKi8KIH07CiAKLS8qIGhvdyBsb25nIGRvIHdlIGtlZXAgYSAoSSlCU1MgaW4gdGhlIGJzc19saXN0IGluIGppZmZpZXMKLSAgIHRoaXMgc2hvdWxkIGJlIGxvbmcgZW5vdWdoIGZvciB0aGUgdXNlciB0byByZXRyaWV2ZSB0aGUgdGFibGUKLSAgIChieSBpd2xpc3QgPykgYWZ0ZXIgdGhlIGRldmljZSBzdGFydGVkLCBiZWNhdXNlIGFsbCBlbnRyaWVzIGZyb20KLSAgIG90aGVyIGNoYW5uZWxzIHRoYW4gdGhlIG9uZSB0aGUgZGV2aWNlIGxvY2tzIG9uIGdldCByZW1vdmVkLCB0b28gKi8KLSNkZWZpbmUgQlNTX0xJU1RfVElNRU9VVAkoMTIwICogSFopCi0vKiBzdHJ1Y3QgdG8gc3RvcmUgQlNTIGluZm8gZm91bmQgZHVyaW5nIHNjYW4gKi8KLSNkZWZpbmUgQlNTX0xJU1RfTUFYX1JBVEVfTEVOCTMyCS8qIDMyIHJhdGVzIHNob3VsZCBiZSBlbm91Z2ggLi4uICovCi0KLXN0cnVjdCBic3NfaW5mbyB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCi0JdTggYnNzaWRbRVRIX0FMRU5dOwkvKiBic3NpZCAqLwotCXU4IHNzaWRbSVdfRVNTSURfTUFYX1NJWkVdOwkvKiBlc3NpZCAqLwotCXU4IHNzaWRfbGVuOwkJLyogbGVuZ3RoIG9mIHNzaWQgYWJvdmUgKi8KLQl1OCBjaGFubmVsOwotCXUxNiBjYXBhOwkJLyogQlNTIGNhcGFiaWxpdGllcyAqLwotCXUxNiBiZWFjb25faW50ZXJ2YWw7CS8qIGJlYWNvbiBpbnRlcnZhbCwgS3VzICgxMDI0IG1pY3Jvc2Vjb25kcykgKi8KLQl1OCByYXRlc1tCU1NfTElTVF9NQVhfUkFURV9MRU5dOwkvKiBzdXBwb3J0ZWQgcmF0ZXMgaW4gdW5pdHMgb2YKLQkJCQkJCSAgIDUwMCBrYnBzLCBPUmVkIHdpdGggMHg4MCBmb3IKLQkJCQkJCSAgIGJhc2ljIHJhdGVzICovCi0JdTggcmF0ZXNfbGVuOwotCi0JLyogcXVhbGl0eSBvZiByZWNlaXZlZCBiZWFjb24gKi8KLQl1OCByc3NpOwotCXU4IGxpbmtfcXVhbDsKLQl1OCBub2lzZV9sZXZlbDsKLQotCXVuc2lnbmVkIGxvbmcgbGFzdF9yeDsJLyogdGltZSAoamlmZmllcykgb2YgbGFzdCBiZWFjb24gcmVjZWl2ZWQgKi8KLX07Ci0KLS8qIGEgcnggZGF0YSBidWZmZXIgdG8gY29sbGVjdCByeCBmcmFnbWVudHMgKi8KLXN0cnVjdCByeF9kYXRhX2J1ZiB7Ci0JdTggc2VuZGVyW0VUSF9BTEVOXTsJLyogc2VuZGVyIGFkZHJlc3MgKi8KLQl1MTYgc2VxbnI7CQkvKiBzZXF1ZW5jZSBudW1iZXIgKi8KLQl1MTYgZnJhZ25yOwkJLyogbGFzdCBmcmFnbWVudCByZWNlaXZlZCAqLwotCXVuc2lnbmVkIGxvbmcgbGFzdF9yeDsJLyogamlmZmllcyBvZiBsYXN0IHJ4ICovCi0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsJLyogPT0gTlVMTCBpZiBlbnRyeSBpcyBmcmVlICovCi19OwotCi0jZGVmaW5lIE5SX1JYX0RBVEFfQlVGCQk4Ci0KIC8qIERhdGEgZm9yIG9uZSBsb2FkZWQgZmlybXdhcmUgZmlsZSAqLwogc3RydWN0IGZ3ZW50cnkgewogCWNvbnN0IGNoYXIgKmNvbnN0IGZ3bmFtZTsKQEAgLTQzOCwxMSArNDEyLDkgQEAKIAogc3RydWN0IGF0NzZfcHJpdiB7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CS8qIFVTQiBkZXZpY2UgcG9pbnRlciAqLwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CS8qIG5ldCBkZXZpY2UgcG9pbnRlciAqLwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwkvKiBuZXQgZGV2aWNlIHN0YXRzICovCi0Jc3RydWN0IGl3X3N0YXRpc3RpY3Mgd3N0YXRzOwkvKiB3aXJlbGVzcyBzdGF0cyAqLwogCiAJc3RydWN0IHNrX2J1ZmYgKnJ4X3NrYjsJLyogc2tidWZmIGZvciByZWNlaXZpbmcgZGF0YSAqLworCXN0cnVjdCBza19idWZmICp0eF9za2I7CS8qIHNrYnVmZiBmb3IgdHJhbnNtaXR0aW5nIGRhdGEgKi8KIAl2b2lkICpidWxrX291dF9idWZmZXI7CS8qIGJ1ZmZlciBmb3Igc2VuZGluZyBkYXRhICovCiAKIAlzdHJ1Y3QgdXJiICp0eF91cmI7CS8qIFVSQiBmb3Igc2VuZGluZyBkYXRhICovCkBAIC00NTQsMjYgKzQyNiwxNyBAQAogCXN0cnVjdCBtdXRleCBtdHg7CS8qIGxvY2tzIHRoaXMgc3RydWN0dXJlICovCiAKIAkvKiB3b3JrIHF1ZXVlcyAqLwotCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrX2Fzc29jX2RvbmU7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHdvcmtfam9pbjsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29ya19uZXdfYnNzOwotCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrX3N0YXJ0X3NjYW47CiAJc3RydWN0IHdvcmtfc3RydWN0IHdvcmtfc2V0X3Byb21pc2M7CiAJc3RydWN0IHdvcmtfc3RydWN0IHdvcmtfc3VibWl0X3J4OwotCXN0cnVjdCBkZWxheWVkX3dvcmsgZHdvcmtfcmVzdGFydDsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIGR3b3JrX2dldF9zY2FuOwotCXN0cnVjdCBkZWxheWVkX3dvcmsgZHdvcmtfYmVhY29uOwotCXN0cnVjdCBkZWxheWVkX3dvcmsgZHdvcmtfYXV0aDsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIGR3b3JrX2Fzc29jOworCXN0cnVjdCBkZWxheWVkX3dvcmsgZHdvcmtfaHdfc2NhbjsKIAogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCByeF90YXNrbGV0OwogCiAJLyogdGhlIFdFUCBzdHVmZiAqLwogCWludCB3ZXBfZW5hYmxlZDsJLyogMSBpZiBXRVAgaXMgZW5hYmxlZCAqLwogCWludCB3ZXBfa2V5X2lkOwkJLyoga2V5IGlkIHRvIGJlIHVzZWQgKi8KLQl1OCB3ZXBfa2V5c1tXRVBfS0VZU11bV0VQX0tFWV9MRU5dOwkvKiB0aGUgZm91ciBXRVAga2V5cywKLQkJCQkJCSAgIDUgb3IgMTMgYnl0ZXMgYXJlIHVzZWQgKi8KLQl1OCB3ZXBfa2V5c19sZW5bV0VQX0tFWVNdOwkvKiB0aGUgbGVuZ3RoIG9mIHRoZSBhYm92ZSBrZXlzICovCisJdTggd2VwX2tleXNbV0VQX0tFWVNdW1dFUF9MQVJHRV9LRVlfTEVOXTsJLyogV0VQIGtleXMgKi8KKwl1OCB3ZXBfa2V5c19sZW5bV0VQX0tFWVNdOwkvKiBsZW5ndGggb2YgV0VQIGtleXMgKi8KIAogCWludCBjaGFubmVsOwogCWludCBpd19tb2RlOwpAQCAtNDk1LDQ0ICs0NTgsMTMgQEAKIAlpbnQgc2Nhbl9tb2RlOwkJLyogU0NBTl9UWVBFX0FDVElWRSwgU0NBTl9UWVBFX1BBU1NJVkUgKi8KIAlpbnQgc2Nhbl9uZWVkX2FueTsJLyogaWYgc2V0LCBuZWVkIHRvIHNjYW4gZm9yIGFueSBFU1NJRCAqLwogCi0JLyogdGhlIGxpc3Qgd2UgZ290IGZyb20gc2Nhbm5pbmcgKi8KLQlzcGlubG9ja190IGJzc19saXN0X3NwaW5sb2NrOwkvKiBwcm90ZWN0cyBic3NfbGlzdCBvcGVyYXRpb25zICovCi0Jc3RydWN0IGxpc3RfaGVhZCBic3NfbGlzdDsJLyogbGlzdCBvZiBCU1Mgd2UgZ290IGJlYWNvbnMgZnJvbSAqLwotCXN0cnVjdCB0aW1lcl9saXN0IGJzc19saXN0X3RpbWVyOwkvKiB0aW1lciB0byBwdXJnZSBvbGQgZW50cmllcwotCQkJCQkJICAgZnJvbSBic3NfbGlzdCAqLwotCXN0cnVjdCBic3NfaW5mbyAqY3Vycl9ic3M7CS8qIGN1cnJlbnQgQlNTICovCiAJdTE2IGFzc29jX2lkOwkJLyogY3VycmVudCBhc3NvY2lhdGlvbiBJRCwgaWYgYXNzb2NpYXRlZCAqLwogCi0JdTggd2FudGVkX2Jzc2lkW0VUSF9BTEVOXTsKLQlpbnQgd2FudGVkX2Jzc2lkX3ZhbGlkOwkvKiAhPSAwIGlmIHdhbnRlZF9ic3NpZCBpcyB0byBiZSB1c2VkICovCi0KLQkvKiBzb21lIGRhdGEgZm9yIGluZnJhc3RydWN0dXJlIG1vZGUgb25seSAqLwotCXNwaW5sb2NrX3QgbWdtdF9zcGlubG9jazsJLyogdGhpcyBzcGlubG9jayBwcm90ZWN0cyBhY2Nlc3MgdG8KLQkJCQkJICAgbmV4dF9tZ210X2J1bGsgKi8KLQotCXN0cnVjdCBhdDc2X3R4X2J1ZmZlciAqbmV4dF9tZ210X2J1bGs7CS8qIHBlbmRpbmcgbWFuYWdlbWVudCBtc2cgdG8KLQkJCQkJCSAgIHNlbmQgdmlhIGJ1bGsgb3V0ICovCi0JZW51bSBtYWNfc3RhdGUgbWFjX3N0YXRlOwotCWVudW0gewotCQlTQ0FOX0lETEUsCi0JCVNDQU5fSU5fUFJPR1JFU1MsCi0JCVNDQU5fQ09NUExFVEVECi0JfSBzY2FuX3N0YXRlOwotCXRpbWVfdCBsYXN0X3NjYW47Ci0KLQlpbnQgcmV0cmllczsJCS8qIHJlbWFpbmluZyByZXRyaWVzIGluIGNhc2Ugb2YgdGltZW91dCB3aGVuCi0JCQkJICogc2VuZGluZyBBdXRoUmVxIG9yIEFzc29jUmVxICovCiAJdTggcG1fbW9kZTsJCS8qIHBvd2VyIG1hbmFnZW1lbnQgbW9kZSAqLwogCXUzMiBwbV9wZXJpb2Q7CQkvKiBwb3dlciBtYW5hZ2VtZW50IHBlcmlvZCBpbiBtaWNyb3NlY29uZHMgKi8KIAogCXN0cnVjdCByZWdfZG9tYWluIGNvbnN0ICpkb21haW47CS8qIHJlZyBkb21haW4gZGVzY3JpcHRpb24gKi8KIAotCS8qIGl3c3B5IHN1cHBvcnQgKi8KLQlzcGlubG9ja190IHNweV9zcGlubG9jazsKLQlzdHJ1Y3QgaXdfc3B5X2RhdGEgc3B5X2RhdGE7Ci0KLQlzdHJ1Y3QgaXdfcHVibGljX2RhdGEgd2lyZWxlc3NfZGF0YTsKLQogCS8qIFRoZXNlIGZpZWxkcyBjb250YWluIEhXIGNvbmZpZyBwcm92aWRlZCBieSB0aGUgZGV2aWNlIChub3QgYWxsIG9mCiAJICogdGhlc2UgZmllbGRzIGFyZSB1c2VkIGJ5IGFsbCBib2FyZCB0eXBlcykgKi8KIAl1OCBtYWNfYWRkcltFVEhfQUxFTl07CkBAIC01NDAsOSArNDcyLDYgQEAKIAogCXN0cnVjdCBhdDc2X2NhcmRfY29uZmlnIGNhcmRfY29uZmlnOwogCi0JLyogc3RvcmUgcnggZnJhZ21lbnRzIHVudGlsIGNvbXBsZXRlICovCi0Jc3RydWN0IHJ4X2RhdGFfYnVmIHJ4X2RhdGFbTlJfUlhfREFUQV9CVUZdOwotCiAJZW51bSBib2FyZF90eXBlIGJvYXJkX3R5cGU7CiAJc3RydWN0IG1pYl9md192ZXJzaW9uIGZ3X3ZlcnNpb247CiAKQEAgLTU1MCw1OCArNDc5LDIwIEBACiAJdW5zaWduZWQgaW50IG5ldGRldl9yZWdpc3RlcmVkOjE7CiAJc3RydWN0IHNldF9taWJfYnVmZmVyIG1pYl9idWY7CS8qIGdsb2JhbCBidWZmZXIgZm9yIHNldF9taWIgY2FsbHMgKi8KIAotCS8qIGJlYWNvbiBjb3VudGluZyAqLwogCWludCBiZWFjb25fcGVyaW9kOwkvKiBwZXJpb2Qgb2YgbWdtdCBiZWFjb25zLCBLdXMgKi8KLQlpbnQgYmVhY29uc19yZWNlaXZlZDsKLQl1bnNpZ25lZCBsb25nIGJlYWNvbnNfbGFzdF9xdWFsOwkvKiB0aW1lIHdlIHJlc3RhcnRlZCBjb3VudGluZwotCQkJCQkJICAgYmVhY29ucyAqLworCisJc3RydWN0IGllZWU4MDIxMV9odyAqaHc7CisJaW50IG1hYzgwMjExX3JlZ2lzdGVyZWQ7CisKKwlzdHJ1Y3Qga2V5X2NvbmZpZyBrZXlzWzRdOwkvKiBpbnN0YWxsZWQga2V5IHR5cGVzICovCisJdTggZGVmYXVsdF9wYWlyd2lzZV9rZXk7CisJdTggZGVmYXVsdF9ncm91cF9rZXk7CiB9OwogCi1zdHJ1Y3QgYXQ3Nl9yeF9yYWRpb3RhcCB7Ci0Jc3RydWN0IGllZWU4MDIxMV9yYWRpb3RhcF9oZWFkZXIgcnRfaGRyOwotCV9fbGU2NCBydF90c2Z0OwotCXU4IHJ0X2ZsYWdzOwotCXU4IHJ0X3JhdGU7Ci0JczggcnRfc2lnbmFsOwotCXM4IHJ0X25vaXNlOwotfTsKKyNkZWZpbmUgQVQ3Nl9TVVBQT1JURURfRklMVEVSUyBGSUZfUFJPTUlTQ19JTl9CU1MKIAotI2RlZmluZSBBVDc2X1JYX1JBRElPVEFQX1BSRVNFTlQJCSAgXAotCSgoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfVFNGVCkJCXwgXAotCSgxIDw8IElFRUU4MDIxMV9SQURJT1RBUF9GTEFHUykJCXwgXAotCSgxIDw8IElFRUU4MDIxMV9SQURJT1RBUF9SQVRFKQkJfCBcCi0JKDEgPDwgSUVFRTgwMjExX1JBRElPVEFQX0RCX0FOVFNJR05BTCkJfCBcCi0JKDEgPDwgSUVFRTgwMjExX1JBRElPVEFQX0RCX0FOVE5PSVNFKSkKLQotI2RlZmluZSBCRUFDT05fTUFYX0RBVEFfTEVOR1RICTE1MDAKLQotLyogdGhlIG1heGltdW0gc2l6ZSBvZiBhbiBBc3NvY1JlcSBwYWNrZXQgKi8KLSNkZWZpbmUgQVNTT0NSRVFfTUFYX1NJWkUgXAotICAoQVQ3Nl9UWF9IRFJMRU4gKyBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0KSArIFwKLSAgIDEgKyAxICsgSVdfRVNTSURfTUFYX1NJWkUgKyAxICsgMSArIDQpCi0KLS8qIGZvciBzaGFyZWQgc2VjcmV0IGF1dGgsIGFkZCB0aGUgY2hhbGxlbmdlIHRleHQgc2l6ZSAqLwotI2RlZmluZSBBVVRIX0ZSQU1FX1NJWkUgKEFUNzZfVFhfSERSTEVOICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aCkpCi0KLS8qIE1heGltYWwgbnVtYmVyIG9mIEF1dGhSZXEgcmV0cmllcyAqLwotI2RlZmluZSBBVVRIX1JFVFJJRVMJCTMKLQotLyogTWF4aW1hbCBudW1iZXIgb2YgQXNzb2NSZXEgcmV0cmllcyAqLwotI2RlZmluZSBBU1NPQ19SRVRSSUVTCQkzCi0KLS8qIEJlYWNvbiB0aW1lb3V0IGluIG1hbmFnZWQgbW9kZSB3aGVuIHdlIGFyZSBjb25uZWN0ZWQgKi8KLSNkZWZpbmUgQkVBQ09OX1RJTUVPVVQJCSgxMCAqIEhaKQotCi0vKiBUaW1lb3V0IGZvciBhdXRoZW50aWNhdGlvbiByZXNwb25zZSAqLwotI2RlZmluZSBBVVRIX1RJTUVPVVQJCSgxICogSFopCi0KLS8qIFRpbWVvdXQgZm9yIGFzc29jaWF0aW9uIHJlc3BvbnNlICovCi0jZGVmaW5lIEFTU09DX1RJTUVPVVQJCSgxICogSFopCi0KLS8qIFBvbGxpbmcgaW50ZXJ2YWwgd2hlbiBzY2FuIGlzIHJ1bm5pbmcgKi8KICNkZWZpbmUgU0NBTl9QT0xMX0lOVEVSVkFMCShIWiAvIDQpCiAKLS8qIENvbW1hbmQgY29tcGxldGlvbiB0aW1lb3V0ICovCiAjZGVmaW5lIENNRF9DT01QTEVUSU9OX1RJTUVPVVQJKDUgKiBIWikKIAogI2RlZmluZSBERUZfUlRTX1RIUkVTSE9MRAkxNTM2CkBAIC02MTEsOCArNTAyLDYgQEAKICNkZWZpbmUgREVGX1NDQU5fTUlOX1RJTUUJMTAKICNkZWZpbmUgREVGX1NDQU5fTUFYX1RJTUUJMTIwCiAKLSNkZWZpbmUgTUFYX1JUU19USFJFU0hPTEQJKE1BWF9GUkFHX1RIUkVTSE9MRCArIDEpCi0KIC8qIHRoZSBtYXggcGFkZGluZyBzaXplIGZvciB0eCBpbiBieXRlcyAoc2VlIGNhbGNfcGFkZGluZykgKi8KICNkZWZpbmUgTUFYX1BBRERJTkdfU0laRQk1MwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ODA2MDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvS2NvbmZpZwpAQCAtMCwwICsxLDcgQEAKK2NvbmZpZyBCRU5FVAorCXRyaXN0YXRlICJTZXJ2ZXJFbmdpbmVzIDEwR2IgTklDIC0gQmxhZGVFbmdpbmUiCisJZGVwZW5kcyBvbiBQQ0kgJiYgSU5FVAorCXNlbGVjdCBJTkVUX0xSTworCWhlbHAKKwkgIFRoaXMgZHJpdmVyIGltcGxlbWVudHMgdGhlIE5JQyBmdW5jdGlvbmFsaXR5IGZvciBTZXJ2ZXJFbmdpbmVzCisJICAxMEdiIG5ldHdvcmsgYWRhcHRlciBCbGFkZUVuZ2luZSAoRUMgMzIxMCkuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvTUFJTlRBSU5FUlMgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvTUFJTlRBSU5FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVjZTM0MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9NQUlOVEFJTkVSUwpAQCAtMCwwICsxLDYgQEAKK1NFUlZFUiBFTkdJTkVTIDEwR2JlIE5JQyAtIEJMQURFLUVOR0lORQorUDoJU3ViYnUgU2VldGhhcmFtYW4KK006CXN1YmJ1c0BzZXJ2ZXJlbmdpbmVzLmNvbQorTDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZworVzoJaHR0cDovL3d3dy5zZXJ2ZXJlbmdpbmVzLmNvbQorUzoJU3VwcG9ydGVkCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYwYjkyMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9NYWtlZmlsZQpAQCAtMCwwICsxLDE0IEBACisjCisjIE1ha2VmaWxlIHRvIGJ1aWxkIHRoZSBuZXR3b3JrIGRyaXZlciBmb3IgU2VydmVyRW5naW5lJ3MgQmxhZGVFbmdpbmUKKyMKK29iai0kKENPTkZJR19CRU5FVCkgKz0gYmVuZXQubworCitiZW5ldC15IDo9ICBiZV9pbml0Lm8gXAorCQkJYmVfaW50Lm8gXAorCQkJYmVfbmV0aWYubyBcCisJCQliZV9ldGh0b29sLm8gXAorCQkJZnVuY29iai5vIFwKKwkJCWNxLm8gXAorCQkJZXEubyBcCisJCQltcHUubyBcCisJCQlldGgubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTFkZmI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L1RPRE8KQEAgLTAsMCArMSw2IEBACitUT0RPOgorCS0gcmVtb3ZlIHdyYXBwZXJzIGFyb3VuZCBjb21tb24gaW93cml0ZSBmdW5jdGlvbnMKKwktIGZ1bGwgbmV0ZGV2IGF1ZGl0IG9mIGNvbW1vbiBwcm9ibGVtcy9pc3N1ZXMKKworUGxlYXNlIHNlbmQgYWxsIHBhdGNoZXMgYW5kIHF1ZXN0aW9ucyB0byBTdWJidSBTZWV0aGFyYW1hbgorPHN1YmJ1c0BzZXJ2ZXJlbmdpbmVzLmNvbT4gYW5kIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvYXN5bmNtZXNnLmggYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvYXN5bmNtZXNnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFlNzc5YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9hc3luY21lc2cuaApAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisvKgorICogQXV0b2dlbmVyYXRlZCBieSBzcmNnZW4gdmVyc2lvbjogMDEyNworICovCisjaWZuZGVmIF9fYXN5bmNtZXNnX2FtYXBfaF9fCisjZGVmaW5lIF9fYXN5bmNtZXNnX2FtYXBfaF9fCisjaW5jbHVkZSAiZndjbWRfY29tbW9uLmgiCisKKy8qIC0tLSBBU1lOQ19FVkVOVF9DT0RFUyAtLS0gKi8KKyNkZWZpbmUgQVNZTkNfRVZFTlRfQ09ERV9MSU5LX1NUQVRFICAgICAoMSkKKyNkZWZpbmUgQVNZTkNfRVZFTlRfQ09ERV9JU0NTSSAgICAgICAgICAoMikKKworLyogLS0tIEFTWU5DX0xJTktfU1RBVEVTIC0tLSAqLworI2RlZmluZSBBU1lOQ19FVkVOVF9MSU5LX0RPV04gICAgICAgICAgICgwKQkvKiBMaW5rIERvd24gb24gYSBwb3J0ICovCisjZGVmaW5lIEFTWU5DX0VWRU5UX0xJTktfVVAgICAgICAgICAgICAgKDEpCS8qIExpbmsgVXAgb24gYSBwb3J0ICovCisKKy8qCisgKiBUaGUgbGFzdCA0IGJ5dGVzIG9mIHRoZSBhc3luYyBldmVudHMgaGF2ZSB0aGlzIGNvbW1vbiBmb3JtYXQuICBJdCBhbGxvd3MKKyAqIHRoZSBkcml2ZXIgdG8gZGlzdGluZ3Vpc2ggW2xpbmtdTUNDX0NRX0VOVFJZWy9saW5rXSBzdHJ1Y3RzIGZyb20KKyAqIGFzeW5jaHJvbm91cyBldmVudHMuICBCb3RoIGFycml2ZSBvbiB0aGUgc2FtZSBjb21wbGV0aW9uIHF1ZXVlLiAgVGhpcworICogc3RydWN0dXJlIGFsc28gY29udGFpbnMgdGhlIGNvbW1vbiBmaWVsZHMgdXNlZCB0byBkZWNvZGUgdGhlIGFzeW5jIGV2ZW50LgorICovCitzdHJ1Y3QgQkVfQVNZTkNfRVZFTlRfVFJBSUxFUl9BTUFQIHsKKwl1OCByc3ZkMFs4XTsJLyogRFdPUkQgMCAqLworCXU4IGV2ZW50X2NvZGVbOF07CS8qIERXT1JEIDAgKi8KKwl1OCBldmVudF90eXBlWzhdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDFbNl07CS8qIERXT1JEIDAgKi8KKwl1OCBhc3luY19ldmVudDsJLyogRFdPUkQgMCAqLworCXU4IHZhbGlkOwkJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBBU1lOQ19FVkVOVF9UUkFJTEVSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qCisgKiBBcHBsaWNhYmxlIGluIEluaXRpYXRvciwgVGFyZ2V0IGFuZCBOSUMgbW9kZXMuCisgKiBBIGxpbmsgc3RhdGUgYXN5bmMgZXZlbnQgaXMgc2VlbiBieSBhbGwgZGV2aWNlIGRyaXZlcnMgYXMgc29vbiB0aGV5CisgKiBjcmVhdGUgYW4gTUNDIHJpbmcuIFRoZXJlYWZ0ZXIsIGFueXRpbWUgdGhlIGxpbmsgc3RhdHVzIGNoYW5nZXMgdGhlCisgKiBkcml2ZXJzIHdpbGwgcmVjZWl2ZSBhIGxpbmsgc3RhdGUgYXN5bmMgZXZlbnQuIE5vdGlmaWNhdGlvbnMgY29udGludWUgdG8KKyAqIGJlIHNlbnQgdW50aWwgYSBkcml2ZXIgZGVzdHJveXMgaXRzIE1DQyByaW5nLiBBIGxpbmsgZG93biBldmVudCBpcworICogcmVwb3J0ZWQgd2hlbiBlaXRoZXIgcG9ydCBsb3NlcyBsaW5rLiBBIGxpbmsgdXAgZXZlbnQgaXMgcmVwb3J0ZWQKKyAqIHdoZW4gZWl0aGVyIHBvcnQgcmVnYWlucyBsaW5rLiBXaGVuIEJFJ3MgZmFpbG92ZXIgbWVjaGFuaXNtIGlzIGVuYWJsZWQsIGEKKyAqIGxpbmsgZG93biBvbiB0aGUgYWN0aXZlIHBvcnQgY2F1c2VzIHRyYWZmaWMgdG8gYmUgZGl2ZXJ0ZWQgdG8gdGhlIHN0YW5kYnkKKyAqIHBvcnQgYnkgdGhlIEJFJ3MgQVJNIGZpcm13YXJlIChhc3N1bWluZyB0aGUgc3RhbmRieSBwb3J0IGhhcyBsaW5rKS4gSW4KKyAqIHRoaXMgY2FzZSwgdGhlIHN0YW5keSBwb3J0IGFzc3VtZXMgdGhlIGFjdGl2ZSBzdGF0dXMuIE5vdGU6IHdoZW4gbGluayBpcworICogcmVzdG9yZWQgb24gdGhlIGZhaWxlZCBwb3J0LCB0cmFmZmljIGNvbnRpbnVlcyBvbiB0aGUgY3VycmVudGx5IGFjdGl2ZQorICogcG9ydC4gVGhlIEFSTSBmaXJtd2FyZSBkb2VzIG5vdCBhdHRlbXB0IHRvICdmYWlsIGJhY2snIHRyYWZmaWMgdG8KKyAqIHRoZSByZXN0b3JlZCBwb3J0LgorICovCitzdHJ1Y3QgQkVfQVNZTkNfRVZFTlRfTElOS19TVEFURV9BTUFQIHsKKwl1OCBwb3J0MF9saW5rX3N0YXR1c1s4XTsKKwl1OCBwb3J0MV9saW5rX3N0YXR1c1s4XTsKKwl1OCBhY3RpdmVfcG9ydFs4XTsKKwl1OCByc3ZkMFs4XTsJLyogRFdPUkQgMCAqLworCXU4IHBvcnQwX2R1cGxleFs4XTsKKwl1OCBwb3J0MF9zcGVlZFs4XTsKKwl1OCBwb3J0MV9kdXBsZXhbOF07CisJdTggcG9ydDFfc3BlZWRbOF07CisJdTggcG9ydDBfZmF1bHRbOF07CisJdTggcG9ydDFfZmF1bHRbOF07CisJdTggcnN2ZDFbMl1bOF07CS8qIERXT1JEIDIgKi8KKwlzdHJ1Y3QgQkVfQVNZTkNfRVZFTlRfVFJBSUxFUl9BTUFQIHRyYWlsZXI7Cit9IF9fcGFja2VkOworc3RydWN0IEFTWU5DX0VWRU5UX0xJTktfU1RBVEVfQU1BUCB7CisJdTMyIGR3WzRdOworfTsKKyNlbmRpZiAvKiBfX2FzeW5jbWVzZ19hbWFwX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2JlX2NtLmggYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvYmVfY20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2ExZGZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2JlX2NtLmgKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKy8qCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IHNyY2dlbiB2ZXJzaW9uOiAwMTI3CisgKi8KKyNpZm5kZWYgX19iZV9jbV9hbWFwX2hfXworI2RlZmluZSBfX2JlX2NtX2FtYXBfaF9fCisjaW5jbHVkZSAiYmVfY29tbW9uLmgiCisjaW5jbHVkZSAiZXR4X2NvbnRleHQuaCIKKyNpbmNsdWRlICJtcHVfY29udGV4dC5oIgorCisvKgorICogLS0tIENFVl9XQVRFUk1BUktfRU5VTSAtLS0KKyAqIENRL0VRIFdhdGVybWFyayBFbmNvZGluZ3MuIEVuY29kZWQgYXMgbnVtYmVyIG9mIGZyZWUgZW50cmllcyBpbgorICogUXVldWUgd2hlbiBXYXRlcm1hcmsgaXMgcmVhY2hlZC4KKyAqLworI2RlZmluZSBDRVZfV01BUktfMCAgICAgICAgKDApCS8qIFdhdGVybWFyayB3aGVuIFF1ZXVlIGZ1bGwgKi8KKyNkZWZpbmUgQ0VWX1dNQVJLXzE2ICAgICAgICgxKQkvKiBXYXRlcm1hcmsgYXQgMTYgZnJlZSBlbnRyaWVzICovCisjZGVmaW5lIENFVl9XTUFSS18zMiAgICAgICAoMikJLyogV2F0ZXJtYXJrIGF0IDMyIGZyZWUgZW50cmllcyAqLworI2RlZmluZSBDRVZfV01BUktfNDggICAgICAgKDMpCS8qIFdhdGVybWFyayBhdCA0OCBmcmVlIGVudHJpZXMgKi8KKyNkZWZpbmUgQ0VWX1dNQVJLXzY0ICAgICAgICg0KQkvKiBXYXRlcm1hcmsgYXQgNjQgZnJlZSBlbnRyaWVzICovCisjZGVmaW5lIENFVl9XTUFSS184MCAgICAgICAoNSkJLyogV2F0ZXJtYXJrIGF0IDgwIGZyZWUgZW50cmllcyAqLworI2RlZmluZSBDRVZfV01BUktfOTYgICAgICAgKDYpCS8qIFdhdGVybWFyayBhdCA5NiBmcmVlIGVudHJpZXMgKi8KKyNkZWZpbmUgQ0VWX1dNQVJLXzExMiAgICAgICg3KQkvKiBXYXRlcm1hcmsgYXQgMTEyIGZyZWUgZW50cmllcyAqLworI2RlZmluZSBDRVZfV01BUktfMTI4ICAgICAgKDgpCS8qIFdhdGVybWFyayBhdCAxMjggZnJlZSBlbnRyaWVzICovCisjZGVmaW5lIENFVl9XTUFSS18xNDQgICAgICAoOSkJLyogV2F0ZXJtYXJrIGF0IDE0NCBmcmVlIGVudHJpZXMgKi8KKyNkZWZpbmUgQ0VWX1dNQVJLXzE2MCAgICAgICgxMCkJLyogV2F0ZXJtYXJrIGF0IDE2MCBmcmVlIGVudHJpZXMgKi8KKyNkZWZpbmUgQ0VWX1dNQVJLXzE3NiAgICAgICgxMSkJLyogV2F0ZXJtYXJrIGF0IDE3NiBmcmVlIGVudHJpZXMgKi8KKyNkZWZpbmUgQ0VWX1dNQVJLXzE5MiAgICAgICgxMikJLyogV2F0ZXJtYXJrIGF0IDE5MiBmcmVlIGVudHJpZXMgKi8KKyNkZWZpbmUgQ0VWX1dNQVJLXzIwOCAgICAgICgxMykJLyogV2F0ZXJtYXJrIGF0IDIwOCBmcmVlIGVudHJpZXMgKi8KKyNkZWZpbmUgQ0VWX1dNQVJLXzIyNCAgICAgICgxNCkJLyogV2F0ZXJtYXJrIGF0IDIyNCBmcmVlIGVudHJpZXMgKi8KKyNkZWZpbmUgQ0VWX1dNQVJLXzI0MCAgICAgICgxNSkJLyogV2F0ZXJtYXJrIGF0IDI0MCBmcmVlIGVudHJpZXMgKi8KKworLyoKKyAqIC0tLSBDUV9DTlRfRU5VTSAtLS0KKyAqIENvbXBsZXRpb24gUXVldWUgQ291bnQgRW5jb2RpbmdzLgorICovCisjZGVmaW5lIENFVl9DUV9DTlRfMjU2ICAgICAgICAgICAgICAgICAgKDApCS8qIENRIGhhcyAyNTYgZW50cmllcyAqLworI2RlZmluZSBDRVZfQ1FfQ05UXzUxMiAgICAgICAgICAgICAgICAgICgxKQkvKiBDUSBoYXMgNTEyIGVudHJpZXMgKi8KKyNkZWZpbmUgQ0VWX0NRX0NOVF8xMDI0ICAgICAgICAgICAgICAgICAoMikJLyogQ1EgaGFzIDEwMjQgZW50cmllcyAqLworCisvKgorICogLS0tIEVRX0NOVF9FTlVNIC0tLQorICogRXZlbnQgUXVldWUgQ291bnQgRW5jb2RpbmdzLgorICovCisjZGVmaW5lIENFVl9FUV9DTlRfMjU2ICAgICAoMCkJLyogRVEgaGFzIDI1NiBlbnRyaWVzICgxNi1ieXRlIEVRRXMgb25seSkgKi8KKyNkZWZpbmUgQ0VWX0VRX0NOVF81MTIgICAgICgxKQkvKiBFUSBoYXMgNTEyIGVudHJpZXMgKDE2LWJ5dGUgRVFFcyBvbmx5KSAqLworI2RlZmluZSBDRVZfRVFfQ05UXzEwMjQgICAgKDIpCS8qIEVRIGhhcyAxMDI0IGVudHJpZXMgKDQtYnl0ZSBvciAqLworCQkJCS8qIDE2LWJ5dGUgRVFFcyBvbmx5KSAqLworI2RlZmluZSBDRVZfRVFfQ05UXzIwNDggICAgKDMpCS8qIEVRIGhhcyAyMDQ4IGVudHJpZXMgKDQtYnl0ZSBvciAqLworCQkJCS8qIDE2LWJ5dGUgRVFFcyBvbmx5KSAqLworI2RlZmluZSBDRVZfRVFfQ05UXzQwOTYgICAgKDQpCS8qIEVRIGhhcyA0MDk2IGVudHJpZXMgKDQtYnl0ZSBFUUVzIG9ubHkpICovCisKKy8qCisgKiAtLS0gRVFfU0laRV9FTlVNIC0tLQorICogRXZlbnQgUXVldWUgRW50cnkgU2l6ZSBFbmNvZGluZy4KKyAqLworI2RlZmluZSBDRVZfRVFfU0laRV80ICAgICAgICAgICAgICAgICAgICgwKQkvKiBFUUUgaXMgNCBieXRlcyAqLworI2RlZmluZSBDRVZfRVFfU0laRV8xNiAgICAgICAgICAgICAgICAgICgxKQkvKiBFUUUgaXMgMTYgYnl0ZXMgKi8KKworLyoKKyAqIENvbXBsZXRpb24gUXVldWUgQ29udGV4dCBUYWJsZSBFbnRyeS4gQ29udGFpbnMgdGhlIHN0YXRlIG9mIGEgQ1EuCisgKiBMb2NhdGVkIGluIFJBTSB3aXRoaW4gdGhlIENFViBibG9jay4KKyAqLworc3RydWN0IEJFX0NRX0NPTlRFWFRfQU1BUCB7CisJdTggQ2lkeFsxMV07CS8qIERXT1JEIDAgKi8KKwl1OCBXYXRlcm1hcmtbNF07CS8qIERXT1JEIDAgKi8KKwl1OCBOb0RlbGF5OwkJLyogRFdPUkQgMCAqLworCXU4IEVQSWR4WzExXTsJLyogRFdPUkQgMCAqLworCXU4IENvdW50WzJdOwkvKiBEV09SRCAwICovCisJdTggdmFsaWQ7CQkvKiBEV09SRCAwICovCisJdTggU29sRXZlbnQ7CS8qIERXT1JEIDAgKi8KKwl1OCBFdmVudGFibGU7CS8qIERXT1JEIDAgKi8KKwl1OCBQaWR4WzExXTsJLyogRFdPUkQgMSAqLworCXU4IFBEWzEwXTsJCS8qIERXT1JEIDEgKi8KKwl1OCBFUUlEWzddOwkJLyogRFdPUkQgMSAqLworCXU4IEZ1bmM7CQkvKiBEV09SRCAxICovCisJdTggV01FOwkJLyogRFdPUkQgMSAqLworCXU4IFN0YWxsZWQ7CQkvKiBEV09SRCAxICovCisJdTggQXJtZWQ7CQkvKiBEV09SRCAxICovCit9IF9fcGFja2VkOworc3RydWN0IENRX0NPTlRFWFRfQU1BUCB7CisJdTMyIGR3WzJdOworfTsKKworLyoKKyAqIEV2ZW50IFF1ZXVlIENvbnRleHQgVGFibGUgRW50cnkuIENvbnRhaW5zIHRoZSBzdGF0ZSBvZiBhbiBFUS4KKyAqIExvY2F0ZWQgaW4gUkFNIGluIHRoZSBDRVYgYmxvY2suCisgKi8KK3N0cnVjdCBCRV9FUV9DT05URVhUX0FNQVAgeworCXU4IENpZHhbMTNdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDBbMl07CS8qIERXT1JEIDAgKi8KKwl1OCBGdW5jOwkJLyogRFdPUkQgMCAqLworCXU4IEVQSWR4WzEzXTsJLyogRFdPUkQgMCAqLworCXU4IHZhbGlkOwkJLyogRFdPUkQgMCAqLworCXU4IHJzdmQxOwkJLyogRFdPUkQgMCAqLworCXU4IFNpemU7CQkvKiBEV09SRCAwICovCisJdTggUGlkeFsxM107CS8qIERXT1JEIDEgKi8KKwl1OCByc3ZkMlszXTsJLyogRFdPUkQgMSAqLworCXU4IFBEWzEwXTsJCS8qIERXT1JEIDEgKi8KKwl1OCBDb3VudFszXTsJLyogRFdPUkQgMSAqLworCXU4IFNvbEV2ZW50OwkvKiBEV09SRCAxICovCisJdTggU3RhbGxlZDsJCS8qIERXT1JEIDEgKi8KKwl1OCBBcm1lZDsJCS8qIERXT1JEIDEgKi8KKwl1OCBXYXRlcm1hcmtbNF07CS8qIERXT1JEIDIgKi8KKwl1OCBXTUU7CQkvKiBEV09SRCAyICovCisJdTggcnN2ZDNbM107CS8qIERXT1JEIDIgKi8KKwl1OCBFdmVudFZlY3RbNl07CS8qIERXT1JEIDIgKi8KKwl1OCByc3ZkNFsyXTsJLyogRFdPUkQgMiAqLworCXU4IERlbGF5WzhdOwkvKiBEV09SRCAyICovCisJdTggcnN2ZDVbNl07CS8qIERXT1JEIDIgKi8KKwl1OCBUTVI7CQkvKiBEV09SRCAyICovCisJdTggcnN2ZDY7CQkvKiBEV09SRCAyICovCisJdTggcnN2ZDdbMzJdOwkvKiBEV09SRCAzICovCit9IF9fcGFja2VkOworc3RydWN0IEVRX0NPTlRFWFRfQU1BUCB7CisJdTMyIGR3WzRdOworfTsKKworI2VuZGlmIC8qIF9fYmVfY21fYW1hcF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZV9jb21tb24uaCBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZV9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTYzZGM1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2JlX2NvbW1vbi5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKy8qCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IHNyY2dlbiB2ZXJzaW9uOiAwMTI3CisgKi8KKyNpZm5kZWYgX19iZV9jb21tb25fYW1hcF9oX18KKyNkZWZpbmUgX19iZV9jb21tb25fYW1hcF9oX18KKworLyogUGh5c2ljYWwgQWRkcmVzcy4gKi8KK3N0cnVjdCBCRV9QSFlTX0FERFJfQU1BUCB7CisJdTggbG9bMzJdOwkJLyogRFdPUkQgMCAqLworCXU4IGhpWzMyXTsJCS8qIERXT1JEIDEgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUEhZU19BRERSX0FNQVAgeworCXUzMiBkd1syXTsKK307CisKKy8qIFZpcnR1YWwgQWRkcmVzcy4gKi8KK3N0cnVjdCBCRV9WSVJUX0FERFJfQU1BUCB7CisJdTggbG9bMzJdOwkJLyogRFdPUkQgMCAqLworCXU4IGhpWzMyXTsJCS8qIERXT1JEIDEgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgVklSVF9BRERSX0FNQVAgeworCXUzMiBkd1syXTsKK307CisKKy8qIFNjYXR0ZXIgZ2F0aGVyIGVsZW1lbnQuICovCitzdHJ1Y3QgQkVfU0dFX0FNQVAgeworCXU4IGFkZHJfaGlbMzJdOwkvKiBEV09SRCAwICovCisJdTggYWRkcl9sb1szMl07CS8qIERXT1JEIDEgKi8KKwl1OCByc3ZkMFszMl07CS8qIERXT1JEIDIgKi8KKwl1OCBsZW5bMTZdOwkJLyogRFdPUkQgMyAqLworCXU4IHJzdmQxWzE2XTsJLyogRFdPUkQgMyAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBTR0VfQU1BUCB7CisJdTMyIGR3WzRdOworfTsKKworI2VuZGlmIC8qIF9fYmVfY29tbW9uX2FtYXBfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvYmVfZXRodG9vbC5jIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2JlX2V0aHRvb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjdhZjg1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2JlX2V0aHRvb2wuYwpAQCAtMCwwICsxLDM0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworLyoKKyAqIGJlX2V0aHRvb2wuYworICoKKyAqIAlUaGlzIGZpbGUgY29udGFpbnMgdmFyaW91cyBmdW5jdGlvbnMgdGhhdCBldGh0b29sIGNhbiB1c2UKKyAqIAl0byB0YWxrIHRvIHRoZSBkcml2ZXIgYW5kIHRoZSBCRSBIL1cuCisgKi8KKworI2luY2x1ZGUgImJlbmV0LmgiCisKKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisKK3N0YXRpYyBjb25zdCBjaGFyIGJlbmV0X2dzdHJpbmdzX3N0YXRzW11bRVRIX0dTVFJJTkdfTEVOXSA9IHsKKy8qIG5ldF9kZXZpY2Vfc3RhdHMgKi8KKwkicnhfcGFja2V0cyIsCisJInR4X3BhY2tldHMiLAorCSJyeF9ieXRlcyIsCisJInR4X2J5dGVzIiwKKwkicnhfZXJyb3JzIiwKKwkidHhfZXJyb3JzIiwKKwkicnhfZHJvcHBlZCIsCisJInR4X2Ryb3BwZWQiLAorCSJtdWx0aWNhc3QiLAorCSJjb2xsaXNpb25zIiwKKwkicnhfbGVuZ3RoX2Vycm9ycyIsCisJInJ4X292ZXJfZXJyb3JzIiwKKwkicnhfY3JjX2Vycm9ycyIsCisJInJ4X2ZyYW1lX2Vycm9ycyIsCisJInJ4X2ZpZm9fZXJyb3JzIiwKKwkicnhfbWlzc2VkX2Vycm9ycyIsCisJInR4X2Fib3J0ZWRfZXJyb3JzIiwKKwkidHhfY2Fycmllcl9lcnJvcnMiLAorCSJ0eF9maWZvX2Vycm9ycyIsCisJInR4X2hlYXJ0YmVhdF9lcnJvcnMiLAorCSJ0eF93aW5kb3dfZXJyb3JzIiwKKwkicnhfY29tcHJlc3NlZCIsCisJInRjX2NvbXByZXNzZWQiLAorLyogQkUgZHJpdmVyIFN0YXRzICovCisJImJlc190eF9yZXFzIiwKKwkiYmVzX3R4X2ZhaWxzIiwKKwkiYmVzX2Z3ZF9yZXFzIiwKKwkiYmVzX3R4X3dyYnMiLAorCSJiZXNfaW50ZXJydXB0cyIsCisJImJlc19ldmVudHMiLAorCSJiZXNfdHhfZXZlbnRzIiwKKwkiYmVzX3J4X2V2ZW50cyIsCisJImJlc190eF9jb21wbCIsCisJImJlc19yeF9jb21wbCIsCisJImJlc19ldGhyeF9wb3N0X2ZhaWwiLAorCSJiZXNfODAyXzNfZHJvcHBlZF9mcmFtZXMiLAorCSJiZXNfODAyXzNfbWFsZm9ybWVkX2ZyYW1lcyIsCisJImJlc19yeF9taXNjX3BrdHMiLAorCSJiZXNfZXRoX3R4X3JhdGUiLAorCSJiZXNfZXRoX3J4X3JhdGUiLAorCSJOdW0gUGFja2V0cyBjb2xsZWN0ZWQiLAorCSJOdW0gVGltZXMgRmx1c2hlZCIsCit9OworCisjZGVmaW5lIE5FVF9ERVZfU1RBVFNfTEVOIFwKKwkoc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKS9zaXplb2YodW5zaWduZWQgbG9uZykpCisKKyNkZWZpbmUgQkVORVRfU1RBVFNfTEVOICBBUlJBWV9TSVpFKGJlbmV0X2dzdHJpbmdzX3N0YXRzKQorCitzdGF0aWMgdm9pZAorYmVfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqZHJ2aW5mbykKK3sKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwbm9iLT5hZGFwdGVyOworCisJc3RybmNweShkcnZpbmZvLT5kcml2ZXIsIGJlX2RyaXZlcl9uYW1lLCAzMik7CisJc3RybmNweShkcnZpbmZvLT52ZXJzaW9uLCBiZV9kcnZyX3ZlciwgMzIpOworCXN0cm5jcHkoZHJ2aW5mby0+ZndfdmVyc2lvbiwgYmVfZndfdmVyLCAzMik7CisJc3RyY3B5KGRydmluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShhZGFwdGVyLT5wZGV2KSk7CisJZHJ2aW5mby0+dGVzdGluZm9fbGVuID0gMDsKKwlkcnZpbmZvLT5yZWdkdW1wX2xlbiA9IDA7CisJZHJ2aW5mby0+ZWVkdW1wX2xlbiA9IDA7Cit9CisKK3N0YXRpYyBpbnQKK2JlX2dldF9jb2FsZXNjZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqY29hbGVzY2UpCit7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gcG5vYi0+YWRhcHRlcjsKKworCWNvYWxlc2NlLT5yeF9tYXhfY29hbGVzY2VkX2ZyYW1lcyA9IGFkYXB0ZXItPm1heF9yeF9jb2FsOworCisJY29hbGVzY2UtPnJ4X2NvYWxlc2NlX3VzZWNzID0gYWRhcHRlci0+Y3VyX2VxZDsKKwljb2FsZXNjZS0+cnhfY29hbGVzY2VfdXNlY3NfaGlnaCA9IGFkYXB0ZXItPm1heF9lcWQ7CisJY29hbGVzY2UtPnJ4X2NvYWxlc2NlX3VzZWNzX2xvdyA9IGFkYXB0ZXItPm1pbl9lcWQ7CisKKwljb2FsZXNjZS0+dHhfY29hbGVzY2VfdXNlY3MgPSBhZGFwdGVyLT5jdXJfZXFkOworCWNvYWxlc2NlLT50eF9jb2FsZXNjZV91c2Vjc19oaWdoID0gYWRhcHRlci0+bWF4X2VxZDsKKwljb2FsZXNjZS0+dHhfY29hbGVzY2VfdXNlY3NfbG93ID0gYWRhcHRlci0+bWluX2VxZDsKKworCWNvYWxlc2NlLT51c2VfYWRhcHRpdmVfcnhfY29hbGVzY2UgPSBhZGFwdGVyLT5lbmFibGVfYWljOworCWNvYWxlc2NlLT51c2VfYWRhcHRpdmVfdHhfY29hbGVzY2UgPSBhZGFwdGVyLT5lbmFibGVfYWljOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgdXNlZCB0byBzZXQgaW50ZXJydXAgY29hbGVzY2luZyBkZWxheSAqYXMgd2VsbCBhcyoKKyAqIHRoZSBudW1iZXIgb2YgcGt0cyB0byBjb2FsZXNjZSBmb3IgTFJPLgorICovCitzdGF0aWMgaW50CitiZV9zZXRfY29hbGVzY2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmNvYWxlc2NlKQoreworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IHBub2ItPmFkYXB0ZXI7CisJc3RydWN0IGJlX2VxX29iamVjdCAqZXFfb2JqZWN0cDsKKwl1MzIgbWF4LCBtaW4sIGN1cjsKKwlpbnQgc3RhdHVzOworCisJYWRhcHRlci0+bWF4X3J4X2NvYWwgPSBjb2FsZXNjZS0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXM7CisJaWYgKGFkYXB0ZXItPm1heF9yeF9jb2FsID49IEJFX0xST19NQVhfUEtUUykKKwkJYWRhcHRlci0+bWF4X3J4X2NvYWwgPSBCRV9MUk9fTUFYX1BLVFM7CisKKwlpZiAoYWRhcHRlci0+ZW5hYmxlX2FpYyA9PSAwICYmCisJCWNvYWxlc2NlLT51c2VfYWRhcHRpdmVfcnhfY29hbGVzY2UgPT0gMSkgeworCQkvKiBpZiBBSUMgaXMgYmVpbmcgdHVybmVkIG9uIG5vdywgc3RhcnQgd2l0aCBhbiBFUUQgb2YgMCAqLworCQlhZGFwdGVyLT5jdXJfZXFkID0gMDsKKwl9CisJYWRhcHRlci0+ZW5hYmxlX2FpYyA9IGNvYWxlc2NlLT51c2VfYWRhcHRpdmVfcnhfY29hbGVzY2U7CisKKwkvKiByb3VuZCBvZmYgdG8gbmVhcmVzdCBtdWx0aXBsZSBvZiA4ICovCisJbWF4ID0gKCgoY29hbGVzY2UtPnJ4X2NvYWxlc2NlX3VzZWNzX2hpZ2ggKyA0KSA+PiAzKSA8PCAzKTsKKwltaW4gPSAoKChjb2FsZXNjZS0+cnhfY29hbGVzY2VfdXNlY3NfbG93ICsgNCkgPj4gMykgPDwgMyk7CisJY3VyID0gKCgoY29hbGVzY2UtPnJ4X2NvYWxlc2NlX3VzZWNzICsgNCkgPj4gMykgPDwgMyk7CisKKwlpZiAoYWRhcHRlci0+ZW5hYmxlX2FpYykgeworCQkvKiBhY2NlcHQgbG93IGFuZCBoaWdoIGlmIEFJQyBpcyBlbmFibGVkICovCisJCWlmIChtYXggPiBNQVhfRVFEKQorCQkJbWF4ID0gTUFYX0VRRDsKKwkJaWYgKG1pbiA+IG1heCkKKwkJCW1pbiA9IG1heDsKKwkJYWRhcHRlci0+bWF4X2VxZCA9IG1heDsKKwkJYWRhcHRlci0+bWluX2VxZCA9IG1pbjsKKwkJaWYgKGFkYXB0ZXItPmN1cl9lcWQgPiBtYXgpCisJCQlhZGFwdGVyLT5jdXJfZXFkID0gbWF4OworCQlpZiAoYWRhcHRlci0+Y3VyX2VxZCA8IG1pbikKKwkJCWFkYXB0ZXItPmN1cl9lcWQgPSBtaW47CisJfSBlbHNlIHsKKwkJLyogYWNjZXB0IHNwZWNpZmllZCBjb2FsZXNjZV91c2VjcyBvbmx5IGlmIEFJQyBpcyBkaXNhYmxlZCAqLworCQlpZiAoY3VyID4gTUFYX0VRRCkKKwkJCWN1ciA9IE1BWF9FUUQ7CisJCWVxX29iamVjdHAgPSAmcG5vYi0+ZXZlbnRfcV9vYmo7CisJCXN0YXR1cyA9CisJCSAgICBiZV9lcV9tb2RpZnlfZGVsYXkoJnBub2ItPmZuX29iaiwgMSwgJmVxX29iamVjdHAsICZjdXIsCisJCQkJICAgICAgIE5VTEwsIE5VTEwsIE5VTEwpOworCQlpZiAoc3RhdHVzID09IEJFX1NVQ0NFU1MpCisJCQlhZGFwdGVyLT5jdXJfZXFkID0gY3VyOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUzMiBiZV9nZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IHBub2ItPmFkYXB0ZXI7CisJcmV0dXJuIGFkYXB0ZXItPnJ4X2NzdW07Cit9CisKK3N0YXRpYyBpbnQgYmVfc2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdWludDMyX3QgZGF0YSkKK3sKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwbm9iLT5hZGFwdGVyOworCisJaWYgKGRhdGEpCisJCWFkYXB0ZXItPnJ4X2NzdW0gPSAxOworCWVsc2UKKwkJYWRhcHRlci0+cnhfY3N1bSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2JlX2dldF9zdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHVpbnQzMl90IHN0cmluZ3NldCwgdWludDhfdCAqZGF0YSkKK3sKKwlzd2l0Y2ggKHN0cmluZ3NldCkgeworCWNhc2UgRVRIX1NTX1NUQVRTOgorCQltZW1jcHkoZGF0YSwgKmJlbmV0X2dzdHJpbmdzX3N0YXRzLAorCQkgICAgICAgc2l6ZW9mKGJlbmV0X2dzdHJpbmdzX3N0YXRzKSk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBiZV9nZXRfc3RhdHNfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlyZXR1cm4gQkVORVRfU1RBVFNfTEVOOworfQorCitzdGF0aWMgdm9pZAorYmVfZ2V0X2V0aHRvb2xfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJICAgICBzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqc3RhdHMsIHVpbnQ2NF90ICpkYXRhKQoreworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IHBub2ItPmFkYXB0ZXI7CisJaW50IGk7CisKKwliZW5ldF9nZXRfc3RhdHMobmV0ZGV2KTsKKworCWZvciAoaSA9IDA7IGkgPD0gTkVUX0RFVl9TVEFUU19MRU47IGkrKykKKwkJZGF0YVtpXSA9ICgodW5zaWduZWQgbG9uZyAqKSZhZGFwdGVyLT5iZW5ldF9zdGF0cylbaV07CisKKwlkYXRhW2ldID0gYWRhcHRlci0+YmVfc3RhdC5iZXNfdHhfcmVxczsKKwlkYXRhW2krK10gPSBhZGFwdGVyLT5iZV9zdGF0LmJlc190eF9mYWlsczsKKwlkYXRhW2krK10gPSBhZGFwdGVyLT5iZV9zdGF0LmJlc19md2RfcmVxczsKKwlkYXRhW2krK10gPSBhZGFwdGVyLT5iZV9zdGF0LmJlc190eF93cmJzOworCisJZGF0YVtpKytdID0gYWRhcHRlci0+YmVfc3RhdC5iZXNfaW50czsKKwlkYXRhW2krK10gPSBhZGFwdGVyLT5iZV9zdGF0LmJlc19ldmVudHM7CisJZGF0YVtpKytdID0gYWRhcHRlci0+YmVfc3RhdC5iZXNfdHhfZXZlbnRzOworCWRhdGFbaSsrXSA9IGFkYXB0ZXItPmJlX3N0YXQuYmVzX3J4X2V2ZW50czsKKwlkYXRhW2krK10gPSBhZGFwdGVyLT5iZV9zdGF0LmJlc190eF9jb21wbDsKKwlkYXRhW2krK10gPSBhZGFwdGVyLT5iZV9zdGF0LmJlc19yeF9jb21wbDsKKwlkYXRhW2krK10gPSBhZGFwdGVyLT5iZV9zdGF0LmJlc19ldGhyeF9wb3N0X2ZhaWw7CisJZGF0YVtpKytdID0gYWRhcHRlci0+YmVfc3RhdC5iZXNfODAyXzNfZHJvcHBlZF9mcmFtZXM7CisJZGF0YVtpKytdID0gYWRhcHRlci0+YmVfc3RhdC5iZXNfODAyXzNfbWFsZm9ybWVkX2ZyYW1lczsKKwlkYXRhW2krK10gPSBhZGFwdGVyLT5iZV9zdGF0LmJlc19yeF9taXNjX3BrdHM7CisJZGF0YVtpKytdID0gYWRhcHRlci0+YmVfc3RhdC5iZXNfZXRoX3R4X3JhdGU7CisJZGF0YVtpKytdID0gYWRhcHRlci0+YmVfc3RhdC5iZXNfZXRoX3J4X3JhdGU7CisJZGF0YVtpKytdID0gYWRhcHRlci0+YmVfc3RhdC5iZXNfcnhfY29hbDsKKwlkYXRhW2krK10gPSBhZGFwdGVyLT5iZV9zdGF0LmJlc19yeF9mbHVzaDsKKworfQorCitzdGF0aWMgaW50IGJlX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCit7CisJZWNtZC0+c3BlZWQgPSBTUEVFRF8xMDAwMDsKKwllY21kLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwllY21kLT5hdXRvbmVnID0gQVVUT05FR19ESVNBQkxFOworCXJldHVybiAwOworfQorCisvKiBHZXQgdGhlIFJpbmcgcGFyYW1ldGVycyBmcm9tIHRoZSBwbm9iICovCitzdGF0aWMgdm9pZAorYmVfZ2V0X3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKnJpbmcpCit7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJLyogUHJlIFNldCBNYXhpbXMgKi8KKwlyaW5nLT5yeF9tYXhfcGVuZGluZyA9IHBub2ItPnJ4X3FfbGVuOworCXJpbmctPnJ4X21pbmlfbWF4X3BlbmRpbmcgPSByaW5nLT5yeF9taW5pX21heF9wZW5kaW5nOworCXJpbmctPnJ4X2p1bWJvX21heF9wZW5kaW5nID0gcmluZy0+cnhfanVtYm9fbWF4X3BlbmRpbmc7CisJcmluZy0+dHhfbWF4X3BlbmRpbmcgPSBwbm9iLT50eF9xX2xlbjsKKworCS8qIEN1cnJlbnQgaGFyZHdhcmUgU2V0dGluZ3MgICAgICAgICAgICAgICAgKi8KKwlyaW5nLT5yeF9wZW5kaW5nID0gYXRvbWljX3JlYWQoJnBub2ItPnJ4X3FfcG9zdGVkKTsKKwlyaW5nLT5yeF9taW5pX3BlbmRpbmcgPSByaW5nLT5yeF9taW5pX3BlbmRpbmc7CisJcmluZy0+cnhfanVtYm9fcGVuZGluZyA9IHJpbmctPnJ4X2p1bWJvX3BlbmRpbmc7CisJcmluZy0+dHhfcGVuZGluZyA9IGF0b21pY19yZWFkKCZwbm9iLT50eF9xX3VzZWQpOworCit9CisKK3N0YXRpYyB2b2lkCitiZV9nZXRfcGF1c2VwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgZXRodG9vbF9wYXVzZXBhcmFtICplY21kKQoreworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlib29sIHJ4ZmMsIHR4ZmM7CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGJlX2V0aF9nZXRfZmxvd19jb250cm9sKCZwbm9iLT5mbl9vYmosICZ0eGZjLCAmcnhmYyk7CisJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTKSB7CisJCWRldl9pbmZvKCZuZXRkZXYtPmRldiwgIlVuYWJsZSB0byBnZXQgcGF1c2UgZnJhbWUgc2V0dGluZ3NcbiIpOworCQkvKiByZXR1cm4gZGVmYXVsdHMgKi8KKwkJZWNtZC0+cnhfcGF1c2UgPSAxOworCQllY21kLT50eF9wYXVzZSA9IDA7CisJCWVjbWQtPmF1dG9uZWcgPSBBVVRPTkVHX0VOQUJMRTsKKwkJcmV0dXJuOworCX0KKworCWlmICh0eGZjID09IHRydWUpCisJCWVjbWQtPnR4X3BhdXNlID0gMTsKKwllbHNlCisJCWVjbWQtPnR4X3BhdXNlID0gMDsKKworCWlmIChyeGZjID09IHRydWUpCisJCWVjbWQtPnJ4X3BhdXNlID0gMTsKKwllbHNlCisJCWVjbWQtPnJ4X3BhdXNlID0gMDsKKworCWVjbWQtPmF1dG9uZWcgPSBBVVRPTkVHX0VOQUJMRTsKK30KKworc3RhdGljIGludAorYmVfc2V0X3BhdXNlcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqZWNtZCkKK3sKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJYm9vbCB0eGZjLCByeGZjOworCWludCBzdGF0dXM7CisKKwlpZiAoZWNtZC0+YXV0b25lZyAhPSBBVVRPTkVHX0VOQUJMRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZWNtZC0+dHhfcGF1c2UpCisJCXR4ZmMgPSB0cnVlOworCWVsc2UKKwkJdHhmYyA9IGZhbHNlOworCisJaWYgKGVjbWQtPnJ4X3BhdXNlKQorCQlyeGZjID0gdHJ1ZTsKKwllbHNlCisJCXJ4ZmMgPSBmYWxzZTsKKworCXN0YXR1cyA9IGJlX2V0aF9zZXRfZmxvd19jb250cm9sKCZwbm9iLT5mbl9vYmosIHR4ZmMsIHJ4ZmMpOworCWlmIChzdGF0dXMgIT0gQkVfU1VDQ0VTUykgeworCQlkZXZfaW5mbygmbmV0ZGV2LT5kZXYsICJVbmFibGUgdG8gc2V0IHBhdXNlIGZyYW1lIHNldHRpbmdzXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGV0aHRvb2xfb3BzIGJlX2V0aHRvb2xfb3BzID0geworCS5nZXRfc2V0dGluZ3MgPSBiZV9nZXRfc2V0dGluZ3MsCisJLmdldF9kcnZpbmZvID0gYmVfZ2V0X2RydmluZm8sCisJLmdldF9saW5rID0gZXRodG9vbF9vcF9nZXRfbGluaywKKwkuZ2V0X2NvYWxlc2NlID0gYmVfZ2V0X2NvYWxlc2NlLAorCS5zZXRfY29hbGVzY2UgPSBiZV9zZXRfY29hbGVzY2UsCisJLmdldF9yaW5ncGFyYW0gPSBiZV9nZXRfcmluZ3BhcmFtLAorCS5nZXRfcGF1c2VwYXJhbSA9IGJlX2dldF9wYXVzZXBhcmFtLAorCS5zZXRfcGF1c2VwYXJhbSA9IGJlX3NldF9wYXVzZXBhcmFtLAorCS5nZXRfcnhfY3N1bSA9IGJlX2dldF9yeF9jc3VtLAorCS5zZXRfcnhfY3N1bSA9IGJlX3NldF9yeF9jc3VtLAorCS5nZXRfdHhfY3N1bSA9IGV0aHRvb2xfb3BfZ2V0X3R4X2NzdW0sCisJLnNldF90eF9jc3VtID0gZXRodG9vbF9vcF9zZXRfdHhfY3N1bSwKKwkuZ2V0X3NnID0gZXRodG9vbF9vcF9nZXRfc2csCisJLnNldF9zZyA9IGV0aHRvb2xfb3Bfc2V0X3NnLAorCS5nZXRfdHNvID0gZXRodG9vbF9vcF9nZXRfdHNvLAorCS5zZXRfdHNvID0gZXRodG9vbF9vcF9zZXRfdHNvLAorCS5nZXRfc3RyaW5ncyA9IGJlX2dldF9zdHJpbmdzLAorCS5nZXRfc3RhdHNfY291bnQgPSBiZV9nZXRfc3RhdHNfY291bnQsCisJLmdldF9ldGh0b29sX3N0YXRzID0gYmVfZ2V0X2V0aHRvb2xfc3RhdHMsCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2JlX2luaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZV9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJhMDI2YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZV9pbml0LmMKQEAgLTAsMCArMSwxMzgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlICJiZW5ldC5oIgorCisjZGVmaW5lICBEUlZSX1ZFUlNJT04gICIxLjAuNzI4IgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgYmVfZGV2aWNlX2lkX3RhYmxlW10gPSB7CisJe1BDSV9ERVZJQ0UoMHgxOWEyLCAweDAyMDEpfSwKKwl7MH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBiZV9kZXZpY2VfaWRfdGFibGUpOworCitNT0RVTEVfVkVSU0lPTihEUlZSX1ZFUlNJT04pOworCisjZGVmaW5lIERSVl9ERVNDUklQVElPTiAiU2VydmVyRW5naW5lcyBCbGFkZUVuZ2luZSBOZXR3b3JrIERyaXZlciBWZXJzaW9uICIKKworTU9EVUxFX0RFU0NSSVBUSU9OKERSVl9ERVNDUklQVElPTiBEUlZSX1ZFUlNJT04pOworTU9EVUxFX0FVVEhPUigiU2VydmVyRW5naW5lcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgdW5zaWduZWQgaW50IG1zaXggPSAxOworbW9kdWxlX3BhcmFtKG1zaXgsIHVpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhtc2l4LCAiVXNlIE1TSS14IGludGVycnVwdHMiKTsKKworc3RhdGljIHVuc2lnbmVkIGludCByeGJ1Zl9zaXplID0gMjA0ODsJLyogRGVmYXVsdCBSWCBmcmFnIHNpemUgKi8KK21vZHVsZV9wYXJhbShyeGJ1Zl9zaXplLCB1aW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MocnhidWZfc2l6ZSwgIlNpemUgb2YgYnVmZmVycyB0byBob2xkIFJ4IGRhdGEiKTsKKworY29uc3QgY2hhciBiZV9kcnZyX3ZlcltdID0gRFJWUl9WRVJTSU9OOworY2hhciBiZV9md192ZXJbMzJdOwkJLyogRi9XIHZlcnNpb24gZmlsbGVkIGluIGJ5IGJlX3Byb2JlICovCitjaGFyIGJlX2RyaXZlcl9uYW1lW10gPSAiYmVuZXQiOworCisvKgorICogTnVtYmVyIG9mIGVudHJpZXMgaW4gZWFjaCBxdWV1ZS4KKyAqLworI2RlZmluZSBFVkVOVF9RX0xFTgkJMTAyNAorI2RlZmluZSBFVEhfVFhRX0xFTgkJMjA0OAorI2RlZmluZSBFVEhfVFhDUV9MRU4JCTEwMjQKKyNkZWZpbmUgRVRIX1JYUV9MRU4JCTEwMjQJLyogRG9lcyBub3Qgc3VwcG9ydCBhbnkgb3RoZXIgdmFsdWUgKi8KKyNkZWZpbmUgRVRIX1VDX1JYQ1FfTEVOCQkxMDI0CisjZGVmaW5lIEVUSF9CQ19SWENRX0xFTgkJMjU2CisjZGVmaW5lIE1DQ19RX0xFTiAgICAgICAgICAgICAgIDY0CS8qIHRvdGFsIHNpemUgbm90IHRvIGV4Y2VlZCA4IHBhZ2VzICovCisjZGVmaW5lIE1DQ19DUV9MRU4gICAgICAgICAgICAgIDI1NgorCisvKiBCaXQgbWFzayBkZXNjcmliaW5nIGV2ZW50cyBvZiBpbnRlcmVzdCB0byBiZSB0cmFjZWQgKi8KK3Vuc2lnbmVkIGludCB0cmFjZV9sZXZlbDsKKworc3RhdGljIGludAoraW5pdF9wY2lfYmVfZnVuY3Rpb24oc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXU2NCBwYTsKKworCS8qIENTUiAqLworCXBhID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDIpOworCWFkYXB0ZXItPmNzcl92YSA9IGlvcmVtYXBfbm9jYWNoZShwYSwgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAyKSk7CisJaWYgKGFkYXB0ZXItPmNzcl92YSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIERvb3IgQmVsbCAqLworCXBhID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDQpOworCWFkYXB0ZXItPmRiX3ZhID0gaW9yZW1hcF9ub2NhY2hlKHBhLCAoMTI4ICogMTAyNCkpOworCWlmIChhZGFwdGVyLT5kYl92YSA9PSBOVUxMKSB7CisJCWlvdW5tYXAoYWRhcHRlci0+Y3NyX3ZhKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogUENJICovCisJcGEgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSk7CisJYWRhcHRlci0+cGNpX3ZhID0gaW9yZW1hcF9ub2NhY2hlKHBhLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDEpKTsKKwlpZiAoYWRhcHRlci0+cGNpX3ZhID09IE5VTEwpIHsKKwkJaW91bm1hcChhZGFwdGVyLT5jc3JfdmEpOworCQlpb3VubWFwKGFkYXB0ZXItPmRiX3ZhKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJldHVybiAwOworfQorCisvKgorICAgVGhpcyBmdW5jdGlvbiBlbmFibGVzIHRoZSBpbnRlcnJ1cHQgY29ycmVzcG9uZGluZyB0byB0aGUgRXZlbnQKKyAgIHF1ZXVlIElEIGZvciB0aGUgZ2l2ZW4gTmV0T2JqZWN0CisqLwordm9pZCBiZV9lbmFibGVfZXFfaW50cihzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYikKK3sKKwlzdHJ1Y3QgQ1FfREJfQU1BUCBjcWRiOworCWNxZGIuZHdbMF0gPSAwOworCUFNQVBfU0VUX0JJVFNfUFRSKENRX0RCLCBldmVudCwgJmNxZGIsIDEpOworCUFNQVBfU0VUX0JJVFNfUFRSKENRX0RCLCByZWFybSwgJmNxZGIsIDEpOworCUFNQVBfU0VUX0JJVFNfUFRSKENRX0RCLCBudW1fcG9wcGVkLCAmY3FkYiwgMCk7CisJQU1BUF9TRVRfQklUU19QVFIoQ1FfREIsIHFpZCwgJmNxZGIsIHBub2ItPmV2ZW50X3FfaWQpOworCVBEX1dSSVRFKCZwbm9iLT5mbl9vYmosIGNxX2RiLCBjcWRiLmR3WzBdKTsKK30KKworLyoKKyAgIFRoaXMgZnVuY3Rpb24gZGlzYWJsZXMgdGhlIGludGVycnVwdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBFdmVudAorICAgcXVldWUgSUQgZm9yIHRoZSBnaXZlbiBOZXRPYmplY3QKKyovCit2b2lkIGJlX2Rpc2FibGVfZXFfaW50cihzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYikKK3sKKwlzdHJ1Y3QgQ1FfREJfQU1BUCBjcWRiOworCWNxZGIuZHdbMF0gPSAwOworCUFNQVBfU0VUX0JJVFNfUFRSKENRX0RCLCBldmVudCwgJmNxZGIsIDEpOworCUFNQVBfU0VUX0JJVFNfUFRSKENRX0RCLCByZWFybSwgJmNxZGIsIDApOworCUFNQVBfU0VUX0JJVFNfUFRSKENRX0RCLCBudW1fcG9wcGVkLCAmY3FkYiwgMCk7CisJQU1BUF9TRVRfQklUU19QVFIoQ1FfREIsIHFpZCwgJmNxZGIsIHBub2ItPmV2ZW50X3FfaWQpOworCVBEX1dSSVRFKCZwbm9iLT5mbl9vYmosIGNxX2RiLCBjcWRiLmR3WzBdKTsKK30KKworLyoKKyAgICBUaGlzIGZ1bmN0aW9uIGVuYWJsZXMgdGhlIGludGVycnVwdCBmcm9tIHRoZSAgbmV0d29yayBmdW5jdGlvbgorICAgIG9mIHRoZSBCbGFkZUVuZ2luZS4gVXNlIHRoZSBmdW5jdGlvbiBiZV9kaXNhYmxlX2VxX2ludHIoKQorICAgIHRvIGVuYWJsZSB0aGUgaW50ZXJydXB0IGZyb20gdGhlIGV2ZW50IHF1ZXVlIG9mIG9ubHkgb25lIHNwZWNpZmljCisgICAgTmV0T2JqZWN0CisqLwordm9pZCBiZV9lbmFibGVfaW50cihzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYikKK3sKKwlzdHJ1Y3QgUENJQ0ZHX0hPU1RfVElNRVJfSU5UX0NUUkxfQ1NSX0FNQVAgY3RybDsKKwl1MzIgaG9zdF9pbnRyOworCisJY3RybC5kd1swXSA9IFBDSUNGRzFfUkVBRCgmcG5vYi0+Zm5fb2JqLCBob3N0X3RpbWVyX2ludF9jdHJsKTsKKwlob3N0X2ludHIgPSBBTUFQX0dFVF9CSVRTX1BUUihQQ0lDRkdfSE9TVF9USU1FUl9JTlRfQ1RSTF9DU1IsCisJCQkJCQkJaG9zdGludHIsIGN0cmwuZHcpOworCWlmICghaG9zdF9pbnRyKSB7CisJCUFNQVBfU0VUX0JJVFNfUFRSKFBDSUNGR19IT1NUX1RJTUVSX0lOVF9DVFJMX0NTUiwKKwkJCWhvc3RpbnRyLCBjdHJsLmR3LCAxKTsKKwkJUENJQ0ZHMV9XUklURSgmcG5vYi0+Zm5fb2JqLCBob3N0X3RpbWVyX2ludF9jdHJsLAorCQkJY3RybC5kd1swXSk7CisJfQorfQorCisvKgorICAgVGhpcyBmdW5jdGlvbiBkaXNhYmxlcyB0aGUgaW50ZXJydXB0IGZyb20gdGhlIG5ldHdvcmsgZnVuY3Rpb24gb2YKKyAgIHRoZSBCbGFkZUVuZ2luZS4gIFVzZSB0aGUgZnVuY3Rpb24gYmVfZGlzYWJsZV9lcV9pbnRyKCkgdG8KKyAgIGRpc2FibGUgdGhlIGludGVycnVwdCBmcm9tIHRoZSBldmVudCBxdWV1ZSBvZiBvbmx5IG9uZSBzcGVjaWZpYyBOZXRPYmplY3QKKyovCit2b2lkIGJlX2Rpc2FibGVfaW50cihzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYikKK3sKKworCXN0cnVjdCBQQ0lDRkdfSE9TVF9USU1FUl9JTlRfQ1RSTF9DU1JfQU1BUCBjdHJsOworCXUzMiBob3N0X2ludHI7CisJY3RybC5kd1swXSA9IFBDSUNGRzFfUkVBRCgmcG5vYi0+Zm5fb2JqLCBob3N0X3RpbWVyX2ludF9jdHJsKTsKKwlob3N0X2ludHIgPSBBTUFQX0dFVF9CSVRTX1BUUihQQ0lDRkdfSE9TVF9USU1FUl9JTlRfQ1RSTF9DU1IsCisJCQkJCQkJaG9zdGludHIsIGN0cmwuZHcpOworCWlmIChob3N0X2ludHIpIHsKKwkJQU1BUF9TRVRfQklUU19QVFIoUENJQ0ZHX0hPU1RfVElNRVJfSU5UX0NUUkxfQ1NSLCBob3N0aW50ciwKKwkJCWN0cmwuZHcsIDApOworCQlQQ0lDRkcxX1dSSVRFKCZwbm9iLT5mbl9vYmosIGhvc3RfdGltZXJfaW50X2N0cmwsCisJCQljdHJsLmR3WzBdKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYmVfZW5hYmxlX21zaXgoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IGksIHJldDsKKworCWlmICghbXNpeCkKKwkJcmV0dXJuIC0xOworCisJZm9yIChpID0gMDsgaSA8IEJFX01BWF9SRVFfTVNJWF9WRUNUT1JTOyBpKyspCisJCWFkYXB0ZXItPm1zaXhfZW50cmllc1tpXS5lbnRyeSA9IGk7CisKKwlyZXQgPSBwY2lfZW5hYmxlX21zaXgoYWRhcHRlci0+cGRldiwgYWRhcHRlci0+bXNpeF9lbnRyaWVzLAorCQlCRV9NQVhfUkVRX01TSVhfVkVDVE9SUyk7CisKKwlpZiAocmV0ID09IDApCisJCWFkYXB0ZXItPm1zaXhfZW5hYmxlZCA9IDE7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBiZV9yZWdpc3Rlcl9pc3Ioc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwbm9iLT5uZXRkZXY7CisJaW50IGludHggPSAwLCByOworCisJbmV0ZGV2LT5pcnEgPSBhZGFwdGVyLT5wZGV2LT5pcnE7CisJciA9IGJlX2VuYWJsZV9tc2l4KGFkYXB0ZXIpOworCisJaWYgKHIgPT0gMCkgeworCQlyID0gcmVxdWVzdF9pcnEoYWRhcHRlci0+bXNpeF9lbnRyaWVzWzBdLnZlY3RvciwKKwkJCQliZV9pbnQsIElSUUZfU0hBUkVELCBuZXRkZXYtPm5hbWUsIG5ldGRldik7CisJCWlmIChyKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJIk1TSVggUmVxdWVzdCBJUlEgZmFpbGVkIC0gRXJybm8gJWRcbiIsIHIpOworCQkJaW50eCA9IDE7CisJCQlwY2lfZGlzYWJsZV9tc2l4KGFkYXB0ZXItPnBkZXYpOworCQkJYWRhcHRlci0+bXNpeF9lbmFibGVkID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCWludHggPSAxOworCX0KKworCWlmIChpbnR4KSB7CisJCXIgPSByZXF1ZXN0X2lycShuZXRkZXYtPmlycSwgYmVfaW50LCBJUlFGX1NIQVJFRCwKKwkJCQluZXRkZXYtPm5hbWUsIG5ldGRldik7CisJCWlmIChyKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJIklOVHggUmVxdWVzdCBJUlEgZmFpbGVkIC0gRXJybm8gJWRcbiIsIHIpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCWFkYXB0ZXItPmlzcl9yZWdpc3RlcmVkID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYmVfdW5yZWdpc3Rlcl9pc3Ioc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldnA7CisJaWYgKGFkYXB0ZXItPmlzcl9yZWdpc3RlcmVkKSB7CisJCWlmIChhZGFwdGVyLT5tc2l4X2VuYWJsZWQpIHsKKwkJCWZyZWVfaXJxKGFkYXB0ZXItPm1zaXhfZW50cmllc1swXS52ZWN0b3IsIG5ldGRldik7CisJCQlwY2lfZGlzYWJsZV9tc2l4KGFkYXB0ZXItPnBkZXYpOworCQkJYWRhcHRlci0+bXNpeF9lbmFibGVkID0gMDsKKwkJfSBlbHNlIHsKKwkJCWZyZWVfaXJxKG5ldGRldi0+aXJxLCBuZXRkZXYpOworCQl9CisJCWFkYXB0ZXItPmlzcl9yZWdpc3RlcmVkID0gMDsKKwl9Cit9CisKKy8qCisgICAgVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgdGhlIEZsdXNoIENvbXBsZXRpb25zIHRoYXQgYXJlIGlzc3VlZCBieSB0aGUKKyAgICBBUk0gRi9XLCB3aGVuIGEgUmVjdiBSaW5nIGlzIGRlc3Ryb3llZC4gIEEgZmx1c2ggY29tcGxldGlvbiBpcworICAgIGlkZW50aWZpZWQgd2hlbiBhIFJ4IENPbXBsIGRlc2NyaXB0b3IgaGFzIHRoZSB0Y3Bja3N1bSBhbmQgdWRwY2tzdW0KKyAgICBzZXQgYW5kIHRoZSBwa3RzaXplIGlzIDMyLiAgVGhlc2UgY29tcGxldGlvbnMgYXJlIHJlY2VpdmVkIG9uIHRoZQorICAgIFJ4IENvbXBsZXRpb24gUXVldWUuCisqLworc3RhdGljIHUzMiBiZV9wcm9jZXNzX3J4X2ZsdXNoX2NtcGwoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJc3RydWN0IEVUSF9SWF9DT01QTF9BTUFQICpyeGNwOworCXVuc2lnbmVkIGludCBpID0gMDsKKwl3aGlsZSAoKHJ4Y3AgPSBiZV9nZXRfcnhfY21wbChwbm9iKSkgIT0gTlVMTCkgeworCQliZV9ub3RpZnlfY21wbChwbm9iLCAxLCBwbm9iLT5yeF9jcV9pZCwgMSk7CisJCWkrKzsKKwl9CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyB2b2lkIGJlX3R4X3FfY2xlYW4oc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJd2hpbGUgKGF0b21pY19yZWFkKCZwbm9iLT50eF9xX3VzZWQpKQorCQlwcm9jZXNzX29uZV90eF9jb21wbChwbm9iLCB0eF9jb21wbF9sYXN0d3JiX2lkeF9nZXQocG5vYikpOworfQorCitzdGF0aWMgdm9pZCBiZV9yeF9xX2NsZWFuKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iKQoreworCWlmIChwbm9iLT5yeF9jdHh0KSB7CisJCWludCBpOworCQlzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvICpyeF9wYWdlX2luZm87CisJCWZvciAoaSA9IDA7IGkgPCBwbm9iLT5yeF9xX2xlbjsgaSsrKSB7CisJCQlyeF9wYWdlX2luZm8gPSAmKHBub2ItPnJ4X3BhZ2VfaW5mb1tpXSk7CisJCQlpZiAoIXBub2ItPnJ4X3BnX3NoYXJlZCB8fCByeF9wYWdlX2luZm8tPnBhZ2Vfb2Zmc2V0KSB7CisJCQkJcGNpX3VubWFwX3BhZ2UocG5vYi0+YWRhcHRlci0+cGRldiwKKwkJCQkgICAgICAgcGNpX3VubWFwX2FkZHIocnhfcGFnZV9pbmZvLCBidXMpLAorCQkJCQkgICAgICAgcG5vYi0+cnhfYnVmX3NpemUsCisJCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJfQorCQkJaWYgKHJ4X3BhZ2VfaW5mby0+cGFnZSkKKwkJCQlwdXRfcGFnZShyeF9wYWdlX2luZm8tPnBhZ2UpOworCQkJbWVtc2V0KHJ4X3BhZ2VfaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBiZV9yeF9wYWdlX2luZm8pKTsKKwkJfQorCQlwbm9iLT5yeF9wZ19pbmZvX2hkID0gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJlX2Rlc3Ryb3lfbmV0b2JqKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iKQoreworCWludCBzdGF0dXM7CisKKwlpZiAocG5vYi0+dHhfcV9jcmVhdGVkKSB7CisJCXN0YXR1cyA9IGJlX2V0aF9zcV9kZXN0cm95KCZwbm9iLT50eF9xX29iaik7CisJCXBub2ItPnR4X3FfY3JlYXRlZCA9IDA7CisJfQorCisJaWYgKHBub2ItPnJ4X3FfY3JlYXRlZCkgeworCQlzdGF0dXMgPSBiZV9ldGhfcnFfZGVzdHJveSgmcG5vYi0+cnhfcV9vYmopOworCQlpZiAoc3RhdHVzICE9IDApIHsKKwkJCXN0YXR1cyA9IGJlX2V0aF9ycV9kZXN0cm95X29wdGlvbnMoJnBub2ItPnJ4X3Ffb2JqLCAwLAorCQkJCQkJICAgICAgTlVMTCwgTlVMTCk7CisJCQlCVUdfT04oc3RhdHVzKTsKKwkJfQorCQlwbm9iLT5yeF9xX2NyZWF0ZWQgPSAwOworCX0KKworCWJlX3Byb2Nlc3NfcnhfZmx1c2hfY21wbChwbm9iKTsKKworCWlmIChwbm9iLT50eF9jcV9jcmVhdGVkKSB7CisJCXN0YXR1cyA9IGJlX2NxX2Rlc3Ryb3koJnBub2ItPnR4X2NxX29iaik7CisJCXBub2ItPnR4X2NxX2NyZWF0ZWQgPSAwOworCX0KKworCWlmIChwbm9iLT5yeF9jcV9jcmVhdGVkKSB7CisJCXN0YXR1cyA9IGJlX2NxX2Rlc3Ryb3koJnBub2ItPnJ4X2NxX29iaik7CisJCXBub2ItPnJ4X2NxX2NyZWF0ZWQgPSAwOworCX0KKworCWlmIChwbm9iLT5tY2NfcV9jcmVhdGVkKSB7CisJCXN0YXR1cyA9IGJlX21jY19yaW5nX2Rlc3Ryb3koJnBub2ItPm1jY19xX29iaik7CisJCXBub2ItPm1jY19xX2NyZWF0ZWQgPSAwOworCX0KKwlpZiAocG5vYi0+bWNjX2NxX2NyZWF0ZWQpIHsKKwkJc3RhdHVzID0gYmVfY3FfZGVzdHJveSgmcG5vYi0+bWNjX2NxX29iaik7CisJCXBub2ItPm1jY19jcV9jcmVhdGVkID0gMDsKKwl9CisKKwlpZiAocG5vYi0+ZXZlbnRfcV9jcmVhdGVkKSB7CisJCXN0YXR1cyA9IGJlX2VxX2Rlc3Ryb3koJnBub2ItPmV2ZW50X3Ffb2JqKTsKKwkJcG5vYi0+ZXZlbnRfcV9jcmVhdGVkID0gMDsKKwl9CisJYmVfZnVuY3Rpb25fY2xlYW51cCgmcG5vYi0+Zm5fb2JqKTsKK30KKworLyoKKyAqIGZyZWUgYWxsIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggYSBwbm9iCisgKiBDYWxsZWQgYXQgdGhlIHRpbWUgb2YgbW9kdWxlIGNsZWFudXAgYXMgd2VsbCBhIGFueSBlcnJvciBkdXJpbmcKKyAqIG1vZHVsZSBpbml0LiAgU29tZSByZXNvdXJjZXMgbWF5IGJlIHBhcnRpYWxseSBhbGxvY2F0ZWQgaW4gYSBOZXRPYmouCisgKi8KK3N0YXRpYyB2b2lkIG5ldG9iamVjdF9jbGVhbnVwKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLAorCQkJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldnA7CisKKwlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKSB7CisJCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKwkJYmVfd2FpdF9uaWNfdHhfY21wbHhfY21wbChwbm9iKTsKKwkJYmVfZGlzYWJsZV9lcV9pbnRyKHBub2IpOworCX0KKworCWJlX3VucmVnaXN0ZXJfaXNyKGFkYXB0ZXIpOworCisJaWYgKGFkYXB0ZXItPnRhc2tsZXRfc3RhcnRlZCkgeworCQl0YXNrbGV0X2tpbGwoJihhZGFwdGVyLT5zdHNfaGFuZGxlcikpOworCQlhZGFwdGVyLT50YXNrbGV0X3N0YXJ0ZWQgPSAwOworCX0KKwlpZiAocG5vYi0+Zm5fb2JqX2NyZWF0ZWQpCisJCWJlX2Rpc2FibGVfaW50cihwbm9iKTsKKworCWlmIChhZGFwdGVyLT5kZXZfc3RhdGUgIT0gQkVfREVWX1NUQVRFX05PTkUpCisJCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CisKKwlpZiAocG5vYi0+Zm5fb2JqX2NyZWF0ZWQpCisJCWJlX2Rlc3Ryb3lfbmV0b2JqKHBub2IpOworCisJYWRhcHRlci0+bmV0X29iaiA9IE5VTEw7CisJYWRhcHRlci0+bmV0ZGV2cCA9IE5VTEw7CisKKwliZV9yeF9xX2NsZWFuKHBub2IpOworCWlmIChwbm9iLT5yeF9jdHh0KSB7CisJCWtmcmVlKHBub2ItPnJ4X3BhZ2VfaW5mbyk7CisJCWtmcmVlKHBub2ItPnJ4X2N0eHQpOworCX0KKworCWJlX3R4X3FfY2xlYW4ocG5vYik7CisJa2ZyZWUocG5vYi0+dHhfY3R4dCk7CisKKwlpZiAocG5vYi0+bWNjX3EpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgcG5vYi0+bWNjX3Ffc2l6ZSwKKwkJCXBub2ItPm1jY19xLCBwbm9iLT5tY2NfcV9idXMpOworCisJaWYgKHBub2ItPm1jY193cmJfY3R4dCkKKwkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylwbm9iLT5tY2Nfd3JiX2N0eHQsCisJCQkgICBnZXRfb3JkZXIocG5vYi0+bWNjX3dyYl9jdHh0X3NpemUpKTsKKworCWlmIChwbm9iLT5tY2NfY3EpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgcG5vYi0+bWNjX2NxX3NpemUsCisJCQlwbm9iLT5tY2NfY3EsIHBub2ItPm1jY19jcV9idXMpOworCisJaWYgKHBub2ItPmV2ZW50X3EpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgcG5vYi0+ZXZlbnRfcV9zaXplLAorCQkJcG5vYi0+ZXZlbnRfcSwgcG5vYi0+ZXZlbnRfcV9idXMpOworCisJaWYgKHBub2ItPnR4X2NxKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIHBub2ItPnR4X2NxX3NpemUsCisJCQlwbm9iLT50eF9jcSwgcG5vYi0+dHhfY3FfYnVzKTsKKworCWlmIChwbm9iLT50eF9xKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIHBub2ItPnR4X3Ffc2l6ZSwKKwkJCXBub2ItPnR4X3EsIHBub2ItPnR4X3FfYnVzKTsKKworCWlmIChwbm9iLT5yeF9xKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIHBub2ItPnJ4X3Ffc2l6ZSwKKwkJCXBub2ItPnJ4X3EsIHBub2ItPnJ4X3FfYnVzKTsKKworCWlmIChwbm9iLT5yeF9jcSkKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBwbm9iLT5yeF9jcV9zaXplLAorCQkJcG5vYi0+cnhfY3EsIHBub2ItPnJ4X2NxX2J1cyk7CisKKworCWlmIChwbm9iLT5tYl9wdHIpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgcG5vYi0+bWJfc2l6ZSwgcG5vYi0+bWJfcHRyLAorCQkJcG5vYi0+bWJfYnVzKTsKKworCWZyZWVfbmV0ZGV2KG5ldGRldik7Cit9CisKKworc3RhdGljIGludCBiZV9ub2JfcmluZ19hbGxvYyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYikKK3sKKwl1MzIgc2l6ZTsKKworCS8qIE1haWwgYm94IHJkOyBtYWlsYm94IHBvaW50ZXIgbmVlZHMgdG8gYmUgMTYgYnl0ZSBhbGlnbmVkICovCisJcG5vYi0+bWJfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgTUNDX01BSUxCT1hfQU1BUCkgKyAxNjsKKwlwbm9iLT5tYl9wdHIgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBwbm9iLT5tYl9zaXplLAorCQkJCSZwbm9iLT5tYl9idXMpOworCWlmICghcG5vYi0+bWJfYnVzKQorCQlyZXR1cm4gLTE7CisJbWVtc2V0KHBub2ItPm1iX3B0ciwgMCwgcG5vYi0+bWJfc2l6ZSk7CisJcG5vYi0+bWJfcmQudmEgPSBQVFJfQUxJR04ocG5vYi0+bWJfcHRyLCAxNik7CisJcG5vYi0+bWJfcmQucGEgPSBQVFJfQUxJR04ocG5vYi0+bWJfYnVzLCAxNik7CisJcG5vYi0+bWJfcmQubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBNQ0NfTUFJTEJPWF9BTUFQKTsKKwkvKgorCSAqIEV2ZW50IHF1ZXVlCisJICovCisJcG5vYi0+ZXZlbnRfcV9sZW4gPSBFVkVOVF9RX0xFTjsKKwlwbm9iLT5ldmVudF9xX3NpemUgPSBwbm9iLT5ldmVudF9xX2xlbiAqIHNpemVvZihzdHJ1Y3QgRVFfRU5UUllfQU1BUCk7CisJcG5vYi0+ZXZlbnRfcSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIHBub2ItPmV2ZW50X3Ffc2l6ZSwKKwkJCQkmcG5vYi0+ZXZlbnRfcV9idXMpOworCWlmICghcG5vYi0+ZXZlbnRfcV9idXMpCisJCXJldHVybiAtMTsKKwltZW1zZXQocG5vYi0+ZXZlbnRfcSwgMCwgcG5vYi0+ZXZlbnRfcV9zaXplKTsKKwkvKgorCSAqIEV0aCBUWCBxdWV1ZQorCSAqLworCXBub2ItPnR4X3FfbGVuID0gRVRIX1RYUV9MRU47CisJcG5vYi0+dHhfcV9wb3J0ID0gMDsKKwlwbm9iLT50eF9xX3NpemUgPSAgcG5vYi0+dHhfcV9sZW4gKiBzaXplb2Yoc3RydWN0IEVUSF9XUkJfQU1BUCk7CisJcG5vYi0+dHhfcSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIHBub2ItPnR4X3Ffc2l6ZSwKKwkJCQkmcG5vYi0+dHhfcV9idXMpOworCWlmICghcG5vYi0+dHhfcV9idXMpCisJCXJldHVybiAtMTsKKwltZW1zZXQocG5vYi0+dHhfcSwgMCwgcG5vYi0+dHhfcV9zaXplKTsKKwkvKgorCSAqIEV0aCBUWCBDb21wbCBxdWV1ZQorCSAqLworCXBub2ItPnR4Y3FfbGVuID0gRVRIX1RYQ1FfTEVOOworCXBub2ItPnR4X2NxX3NpemUgPSBwbm9iLT50eGNxX2xlbiAqIHNpemVvZihzdHJ1Y3QgRVRIX1RYX0NPTVBMX0FNQVApOworCXBub2ItPnR4X2NxID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgcG5vYi0+dHhfY3Ffc2l6ZSwKKwkJCQkmcG5vYi0+dHhfY3FfYnVzKTsKKwlpZiAoIXBub2ItPnR4X2NxX2J1cykKKwkJcmV0dXJuIC0xOworCW1lbXNldChwbm9iLT50eF9jcSwgMCwgcG5vYi0+dHhfY3Ffc2l6ZSk7CisJLyoKKwkgKiBFdGggUlggcXVldWUKKwkgKi8KKwlwbm9iLT5yeF9xX2xlbiA9IEVUSF9SWFFfTEVOOworCXBub2ItPnJ4X3Ffc2l6ZSA9ICBwbm9iLT5yeF9xX2xlbiAqIHNpemVvZihzdHJ1Y3QgRVRIX1JYX0RfQU1BUCk7CisJcG5vYi0+cnhfcSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIHBub2ItPnJ4X3Ffc2l6ZSwKKwkJCQkmcG5vYi0+cnhfcV9idXMpOworCWlmICghcG5vYi0+cnhfcV9idXMpCisJCXJldHVybiAtMTsKKwltZW1zZXQocG5vYi0+cnhfcSwgMCwgcG5vYi0+cnhfcV9zaXplKTsKKwkvKgorCSAqIEV0aCBVbmljYXN0IFJYIENvbXBsIHF1ZXVlCisJICovCisJcG5vYi0+cnhfY3FfbGVuID0gRVRIX1VDX1JYQ1FfTEVOOworCXBub2ItPnJ4X2NxX3NpemUgPSAgcG5vYi0+cnhfY3FfbGVuICoKKwkJCXNpemVvZihzdHJ1Y3QgRVRIX1JYX0NPTVBMX0FNQVApOworCXBub2ItPnJ4X2NxID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgcG5vYi0+cnhfY3Ffc2l6ZSwKKwkJCQkmcG5vYi0+cnhfY3FfYnVzKTsKKwlpZiAoIXBub2ItPnJ4X2NxX2J1cykKKwkJcmV0dXJuIC0xOworCW1lbXNldChwbm9iLT5yeF9jcSwgMCwgcG5vYi0+cnhfY3Ffc2l6ZSk7CisKKwkvKiBUWCByZXNvdXJjZXMgKi8KKwlzaXplID0gcG5vYi0+dHhfcV9sZW4gKiBzaXplb2Yodm9pZCAqKik7CisJcG5vYi0+dHhfY3R4dCA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKHBub2ItPnR4X2N0eHQgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJLyogUlggcmVzb3VyY2VzICovCisJc2l6ZSA9IHBub2ItPnJ4X3FfbGVuICogc2l6ZW9mKHZvaWQgKik7CisJcG5vYi0+cnhfY3R4dCA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKHBub2ItPnJ4X2N0eHQgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJc2l6ZSA9IChwbm9iLT5yeF9xX2xlbiAqIHNpemVvZihzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvKSk7CisJcG5vYi0+cnhfcGFnZV9pbmZvID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAocG5vYi0+cnhfcGFnZV9pbmZvID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWFkYXB0ZXItPmV0aF9zdGF0c3AgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgRldDTURfRVRIX0dFVF9TVEFUSVNUSUNTKSwKKwkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoYWRhcHRlci0+ZXRoX3N0YXRzcCA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJcG5vYi0+cnhfYnVmX3NpemUgPSByeGJ1Zl9zaXplOworCXJldHVybiAwOworfQorCisvKgorICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIGJlX25ldF9vYmplY3QgZm9yIHN1YnNlcXVlbnQKKyAgICBuZXR3b3JrIG9wZXJhdGlvbnMuCisKKyAgICBCZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLCB0aGUgZHJpdmVyICBtdXN0IGhhdmUgYWxsb2NhdGVkCisgICAgc3BhY2UgZm9yIHRoZSBOZXRPYmplY3Qgc3RydWN0dXJlLCBpbml0aWFsaXplZCB0aGUgc3RydWN0dXJlLAorICAgIGFsbG9jYXRlZCBETUFhYmxlIG1lbW9yeSBmb3IgYWxsIHRoZSBuZXR3b3JrIHF1ZXVlcyB0aGF0IGZvcm0KKyAgICBwYXJ0IG9mIHRoZSBOZXRPYmplY3QgYW5kIHBvcHVsYXRlZCB0aGUgc3RhcnQgYWRkcmVzcyAodmlydHVhbCkKKyAgICBhbmQgbnVtYmVyIG9mIGVudHJpZXMgYWxsb2NhdGVkIGZvciBlYWNoIHF1ZXVlIGluIHRoZSBOZXRPYmplY3Qgc3RydWN0dXJlLgorCisgICAgVGhlIGRyaXZlciBtdXN0IGFsc28gaGF2ZSBhbGxvY2F0ZWQgbWVtb3J5IHRvIGhvbGQgdGhlCisgICAgbWFpbGJveCBzdHJ1Y3R1cmUgKE1DQ19NQUlMQk9YKSBhbmQgcG9zdCB0aGUgcGh5c2ljYWwgYWRkcmVzcywKKyAgICB2aXJ0dWFsIGFkZHJlc3NlcyBhbmQgdGhlIHNpemUgb2YgdGhlIG1haWxib3ggbWVtb3J5IGluIHRoZQorICAgIE5ldE9iai5tYl9yZC4gIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgYnkgQkVDTElCIGZvcgorICAgIGluaXRpYWwgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBlbWJlZGRlZCBNQ0MgcHJvY2Vzc29yLiBCRUNMSUIKKyAgICB1c2VzIHRoZSBtYWlsYm94IHVudGlsIE1DQyByaW5ncyBhcmUgY3JlYXRlZCBmb3IgIG1vcmUgIGVmZmljaWVudAorICAgIGNvbW11bmljYXRpb24gd2l0aCB0aGUgTUNDIHByb2Nlc3Nvci4KKworICAgIElmIHRoZSBkcml2ZXIgd2FudHMgdG8gY3JlYXRlIG11bHRpcGxlIG5ldHdvcmsgaW50ZXJmYWNlIGZvciBtb3JlCisgICAgdGhhbiBvbmUgcHJvdGVjdGlvbiBkb21haW4sIGl0IGNhbiBjYWxsIGJlX2NyZWF0ZV9uZXRvYmooKQorICAgIG11bHRpcGxlIHRpbWVzICBvbmNlIGZvciBlYWNoIHByb3RlY3Rpb24gZG9tYWluLiAgQSBNYXhpbXVtIG9mCisgICAgMzIgcHJvdGVjdGlvbiBkb21haW5zIGFyZSBzdXBwb3J0ZWQuCisKKyovCitzdGF0aWMgaW50CitiZV9jcmVhdGVfbmV0b2JqKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iLCB1OCBfX2lvbWVtICpjc3JfdmEsCisJdTggX19pb21lbSAqZGJfdmEsIHU4IF9faW9tZW0gKnBjaV92YSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlib29sICBldmVudGFibGUgPSBmYWxzZSwgdHhfbm9fZGVsYXkgPSBmYWxzZSwgcnhfbm9fZGVsYXkgPSBmYWxzZTsKKwlzdHJ1Y3QgYmVfZXFfb2JqZWN0ICplcV9vYmplY3RwID0gTlVMTDsKKwlzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iID0gJnBub2ItPmZuX29iajsKKwlzdHJ1Y3QgcmluZ19kZXNjIHJkOworCXUzMiBzZXRfcnhidWZfc2l6ZTsKKwl1MzIgdHhfY21wbF93bSA9IENFVl9XTUFSS185NjsJLyogMHhmZmZmZmZmZiB0byBkaXNhYmxlICovCisJdTMyIHJ4X2NtcGxfd20gPSBDRVZfV01BUktfMTYwOwkvKiAweGZmZmZmZmZmIHRvIGRpc2FibGUgKi8KKwl1MzIgZXFfZGVsYXkgPSAwOyAvKiBkZWxheSBpbiA4dXNlYyB1bml0cy4gMHhmZmZmZmZmZiB0byBkaXNhYmxlICovCisKKwltZW1zZXQoJnJkLCAwLCBzaXplb2Yoc3RydWN0IHJpbmdfZGVzYykpOworCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fb2JqZWN0X2NyZWF0ZShjc3JfdmEsIGRiX3ZhLCBwY2lfdmEsCisJCQlCRV9GVU5DVElPTl9UWVBFX05FVFdPUkssICZwbm9iLT5tYl9yZCwgcGZvYik7CisJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTKQorCQlyZXR1cm4gc3RhdHVzOworCXBub2ItPmZuX29ial9jcmVhdGVkID0gdHJ1ZTsKKworCWlmICh0eF9jbXBsX3dtID09IDB4ZmZmZmZmZmYpCisJCXR4X25vX2RlbGF5ID0gdHJ1ZTsKKwlpZiAocnhfY21wbF93bSA9PSAweGZmZmZmZmZmKQorCQlyeF9ub19kZWxheSA9IHRydWU7CisJLyoKKwkgKiBub3cgY3JlYXRlIHRoZSBuZWNlc3NhcnkgcmluZ3MKKwkgKiBFdmVudCBRdWV1ZSBmaXJzdC4KKwkgKi8KKwlpZiAocG5vYi0+ZXZlbnRfcV9sZW4pIHsKKwkJcmQudmEgPSBwbm9iLT5ldmVudF9xOworCQlyZC5wYSA9IHBub2ItPmV2ZW50X3FfYnVzOworCQlyZC5sZW5ndGggPSBwbm9iLT5ldmVudF9xX3NpemU7CisKKwkJc3RhdHVzID0gYmVfZXFfY3JlYXRlKHBmb2IsICZyZCwgNCwgcG5vYi0+ZXZlbnRfcV9sZW4sCisJCQkJKHUzMikgLTEsCS8qIENFVl9XTUFSS18qIG9yIC0xICovCisJCQkJZXFfZGVsYXksCS8qIGluIDh1cyB1bml0cywgb3IgLTEgKi8KKwkJCQkmcG5vYi0+ZXZlbnRfcV9vYmopOworCQlpZiAoc3RhdHVzICE9IEJFX1NVQ0NFU1MpCisJCQlnb3RvIGVycm9yX3JldDsKKwkJcG5vYi0+ZXZlbnRfcV9pZCA9IHBub2ItPmV2ZW50X3Ffb2JqLmVxX2lkOworCQlwbm9iLT5ldmVudF9xX2NyZWF0ZWQgPSAxOworCQlldmVudGFibGUgPSB0cnVlOworCQllcV9vYmplY3RwID0gJnBub2ItPmV2ZW50X3Ffb2JqOworCX0KKwkvKgorCSAqIE5vdyBFdGggVHggQ29tcGwuIHF1ZXVlLgorCSAqLworCWlmIChwbm9iLT50eGNxX2xlbikgeworCQlyZC52YSA9IHBub2ItPnR4X2NxOworCQlyZC5wYSA9IHBub2ItPnR4X2NxX2J1czsKKwkJcmQubGVuZ3RoID0gcG5vYi0+dHhfY3Ffc2l6ZTsKKworCQlzdGF0dXMgPSBiZV9jcV9jcmVhdGUocGZvYiwgJnJkLAorCQkJcG5vYi0+dHhjcV9sZW4gKiBzaXplb2Yoc3RydWN0IEVUSF9UWF9DT01QTF9BTUFQKSwKKwkJCWZhbHNlLAkvKiBzb2xpY3RlZCBldmVudHMsICAqLworCQkJdHhfbm9fZGVsYXksCS8qIG5vZGVsYXkgICovCisJCQl0eF9jbXBsX3dtLAkvKiBXYXRlcm1hcmsgZW5jb2RpbmdzICovCisJCQllcV9vYmplY3RwLCAmcG5vYi0+dHhfY3Ffb2JqKTsKKwkJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTKQorCQkJZ290byBlcnJvcl9yZXQ7CisKKwkJcG5vYi0+dHhfY3FfaWQgPSBwbm9iLT50eF9jcV9vYmouY3FfaWQ7CisJCXBub2ItPnR4X2NxX2NyZWF0ZWQgPSAxOworCX0KKwkvKgorCSAqIEV0aCBUeCBxdWV1ZQorCSAqLworCWlmIChwbm9iLT50eF9xX2xlbikgeworCQlzdHJ1Y3QgYmVfZXRoX3NxX3BhcmFtZXRlcnMgZXhfcGFyYW1zID0geyAwIH07CisJCXUzMiB0eXBlOworCisJCWlmIChwbm9iLT50eF9xX3BvcnQpIHsKKwkJCS8qIFRYUSB0byBiZSBib3VuZCB0byBhIHNwZWNpZmljIHBvcnQgKi8KKwkJCXR5cGUgPSBCRV9FVEhfVFhfUklOR19UWVBFX0JPVU5EOworCQkJZXhfcGFyYW1zLnBvcnQgPSBwbm9iLT50eF9xX3BvcnQgLSAxOworCQl9IGVsc2UKKwkJCXR5cGUgPSBCRV9FVEhfVFhfUklOR19UWVBFX1NUQU5EQVJEOworCisJCXJkLnZhID0gcG5vYi0+dHhfcTsKKwkJcmQucGEgPSBwbm9iLT50eF9xX2J1czsKKwkJcmQubGVuZ3RoID0gcG5vYi0+dHhfcV9zaXplOworCisJCXN0YXR1cyA9IGJlX2V0aF9zcV9jcmVhdGVfZXgocGZvYiwgJnJkLAorCQkJCXBub2ItPnR4X3FfbGVuICogc2l6ZW9mKHN0cnVjdCBFVEhfV1JCX0FNQVApLAorCQkJCXR5cGUsIDIsICZwbm9iLT50eF9jcV9vYmosCisJCQkJJmV4X3BhcmFtcywgJnBub2ItPnR4X3Ffb2JqKTsKKworCQlpZiAoc3RhdHVzICE9IEJFX1NVQ0NFU1MpCisJCQlnb3RvIGVycm9yX3JldDsKKworCQlwbm9iLT50eF9xX2lkID0gcG5vYi0+dHhfcV9vYmouYmlkOworCQlwbm9iLT50eF9xX2NyZWF0ZWQgPSAxOworCX0KKwkvKgorCSAqIE5vdyBFdGggUnggY29tcGwuIHF1ZXVlLiAgQWx3YXlzIG5lZWRlZC4KKwkgKi8KKwlyZC52YSA9IHBub2ItPnJ4X2NxOworCXJkLnBhID0gcG5vYi0+cnhfY3FfYnVzOworCXJkLmxlbmd0aCA9IHBub2ItPnJ4X2NxX3NpemU7CisKKwlzdGF0dXMgPSBiZV9jcV9jcmVhdGUocGZvYiwgJnJkLAorCQkJcG5vYi0+cnhfY3FfbGVuICogc2l6ZW9mKHN0cnVjdCBFVEhfUlhfQ09NUExfQU1BUCksCisJCQlmYWxzZSwJLyogc29saWN0ZWQgZXZlbnRzLCAgKi8KKwkJCXJ4X25vX2RlbGF5LAkvKiBub2RlbGF5ICAqLworCQkJcnhfY21wbF93bSwJLyogV2F0ZXJtYXJrIGVuY29kaW5ncyAqLworCQkJZXFfb2JqZWN0cCwgJnBub2ItPnJ4X2NxX29iaik7CisJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTKQorCQlnb3RvIGVycm9yX3JldDsKKworCXBub2ItPnJ4X2NxX2lkID0gcG5vYi0+cnhfY3Ffb2JqLmNxX2lkOworCXBub2ItPnJ4X2NxX2NyZWF0ZWQgPSAxOworCisJc3RhdHVzID0gYmVfZXRoX3JxX3NldF9mcmFnX3NpemUocGZvYiwgcG5vYi0+cnhfYnVmX3NpemUsCisJCQkodTMyICopICZzZXRfcnhidWZfc2l6ZSk7CisJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTKSB7CisJCWJlX2V0aF9ycV9nZXRfZnJhZ19zaXplKHBmb2IsICh1MzIgKikgJnBub2ItPnJ4X2J1Zl9zaXplKTsKKwkJaWYgKChwbm9iLT5yeF9idWZfc2l6ZSAhPSAyMDQ4KSAmJiAocG5vYi0+cnhfYnVmX3NpemUgIT0gNDA5NikKKwkJICAgICYmIChwbm9iLT5yeF9idWZfc2l6ZSAhPSA4MTkyKSkKKwkJCWdvdG8gZXJyb3JfcmV0OworCX0gZWxzZSB7CisJCWlmIChwbm9iLT5yeF9idWZfc2l6ZSAhPSBzZXRfcnhidWZfc2l6ZSkKKwkJCXBub2ItPnJ4X2J1Zl9zaXplID0gc2V0X3J4YnVmX3NpemU7CisJfQorCS8qCisJICogRXRoIFJYIHF1ZXVlLiBiZV9ldGhfcnFfY3JlYXRlKCkgYWx3YXlzIGFzc3VtZXMgMiBwYWdlcyBzaXplCisJICovCisJcmQudmEgPSBwbm9iLT5yeF9xOworCXJkLnBhID0gcG5vYi0+cnhfcV9idXM7CisJcmQubGVuZ3RoID0gcG5vYi0+cnhfcV9zaXplOworCisJc3RhdHVzID0gYmVfZXRoX3JxX2NyZWF0ZShwZm9iLCAmcmQsICZwbm9iLT5yeF9jcV9vYmosCisJCQkgICAgICZwbm9iLT5yeF9jcV9vYmosICZwbm9iLT5yeF9xX29iaik7CisKKwlpZiAoc3RhdHVzICE9IEJFX1NVQ0NFU1MpCisJCWdvdG8gZXJyb3JfcmV0OworCisJcG5vYi0+cnhfcV9pZCA9IHBub2ItPnJ4X3Ffb2JqLnJpZDsKKwlwbm9iLT5yeF9xX2NyZWF0ZWQgPSAxOworCisJcmV0dXJuIEJFX1NVQ0NFU1M7CS8qIEFsbCByZXF1aXJlZCBxdWV1ZXMgY3JlYXRlZC4gKi8KKworZXJyb3JfcmV0OgorCWJlX2Rlc3Ryb3lfbmV0b2JqKHBub2IpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgYmVfbm9iX3JpbmdfaW5pdChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwKKwkJCQlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYikKK3sKKwlpbnQgc3RhdHVzOworCisJcG5vYi0+ZXZlbnRfcV90bCA9IDA7CisKKwlwbm9iLT50eF9xX2hkID0gMDsKKwlwbm9iLT50eF9xX3RsID0gMDsKKworCXBub2ItPnR4X2NxX3RsID0gMDsKKworCXBub2ItPnJ4X2NxX3RsID0gMDsKKworCW1lbXNldChwbm9iLT5ldmVudF9xLCAwLCBwbm9iLT5ldmVudF9xX3NpemUpOworCW1lbXNldChwbm9iLT50eF9jcSwgMCwgcG5vYi0+dHhfY3Ffc2l6ZSk7CisJbWVtc2V0KHBub2ItPnR4X2N0eHQsIDAsIHBub2ItPnR4X3FfbGVuICogc2l6ZW9mKHZvaWQgKiopKTsKKwltZW1zZXQocG5vYi0+cnhfY3R4dCwgMCwgcG5vYi0+cnhfcV9sZW4gKiBzaXplb2Yodm9pZCAqKSk7CisJcG5vYi0+cnhfcGdfaW5mb19oZCA9IDA7CisJcG5vYi0+cnhfcV9oZCA9IDA7CisJYXRvbWljX3NldCgmcG5vYi0+cnhfcV9wb3N0ZWQsIDApOworCisJc3RhdHVzID0gYmVfY3JlYXRlX25ldG9iaihwbm9iLCBhZGFwdGVyLT5jc3JfdmEsIGFkYXB0ZXItPmRiX3ZhLAorCQkJCWFkYXB0ZXItPnBjaV92YSk7CisJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTKQorCQlyZXR1cm4gLTE7CisKKwliZV9wb3N0X2V0aF9yeF9idWZmcyhwbm9iKTsKKwlyZXR1cm4gMDsKK30KKworLyogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIGFzeW5jIGNhbGxiYWNrIGZvciBsaW5rIHN0YXR1cyAqLworc3RhdGljIHZvaWQKK2JlX2xpbmtfc3RhdHVzX2FzeW5jX2NhbGxiYWNrKHZvaWQgKmNvbnRleHQsIHUzMiBldmVudF9jb2RlLCB2b2lkICpldmVudCkKK3sKKwlzdHJ1Y3QgQVNZTkNfRVZFTlRfTElOS19TVEFURV9BTUFQICpsaW5rX3N0YXR1cyA9IGV2ZW50OworCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gY29udGV4dDsKKwlib29sIGxpbmtfZW5hYmxlID0gZmFsc2U7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2I7CisJc3RydWN0IEFTWU5DX0VWRU5UX1RSQUlMRVJfQU1BUCAqYXN5bmNfdHJhaWxlcjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXUzMiBhc3luY19ldmVudF9jb2RlLCBhc3luY19ldmVudF90eXBlLCBhY3RpdmVfcG9ydDsKKwl1MzIgcG9ydDBfbGlua19zdGF0dXMsIHBvcnQxX2xpbmtfc3RhdHVzLCBwb3J0MF9kdXBsZXgsIHBvcnQxX2R1cGxleDsKKwl1MzIgcG9ydDBfc3BlZWQsIHBvcnQxX3NwZWVkOworCisJaWYgKGV2ZW50X2NvZGUgIT0gQVNZTkNfRVZFTlRfQ09ERV9MSU5LX1NUQVRFKSB7CisJCS8qIE5vdCBvdXIgZXZlbnQgdG8gaGFuZGxlICovCisJCXJldHVybjsKKwl9CisJYXN5bmNfdHJhaWxlciA9IChzdHJ1Y3QgQVNZTkNfRVZFTlRfVFJBSUxFUl9BTUFQICopCisJICAgICgodTggKikgZXZlbnQgKyBzaXplb2Yoc3RydWN0IE1DQ19DUV9FTlRSWV9BTUFQKSAtCisJICAgICBzaXplb2Yoc3RydWN0IEFTWU5DX0VWRU5UX1RSQUlMRVJfQU1BUCkpOworCisJYXN5bmNfZXZlbnRfY29kZSA9IEFNQVBfR0VUX0JJVFNfUFRSKEFTWU5DX0VWRU5UX1RSQUlMRVIsIGV2ZW50X2NvZGUsCisJCQkJCSAgICAgYXN5bmNfdHJhaWxlcik7CisJQlVHX09OKGFzeW5jX2V2ZW50X2NvZGUgIT0gQVNZTkNfRVZFTlRfQ09ERV9MSU5LX1NUQVRFKTsKKworCXBub2IgPSBhZGFwdGVyLT5uZXRfb2JqOworCW5ldGRldiA9IHBub2ItPm5ldGRldjsKKworCS8qIERldGVybWluZSBpZiB0aGlzIGV2ZW50IGlzIGEgc3dpdGNoIFZMRCBvciBhIHBoeXNpY2FsIGxpbmsgZXZlbnQgKi8KKwlhc3luY19ldmVudF90eXBlID0gQU1BUF9HRVRfQklUU19QVFIoQVNZTkNfRVZFTlRfVFJBSUxFUiwgZXZlbnRfdHlwZSwKKwkJCQkJICAgICBhc3luY190cmFpbGVyKTsKKwlhY3RpdmVfcG9ydCA9IEFNQVBfR0VUX0JJVFNfUFRSKEFTWU5DX0VWRU5UX0xJTktfU1RBVEUsCisJCQkJCWFjdGl2ZV9wb3J0LCBsaW5rX3N0YXR1cyk7CisJcG9ydDBfbGlua19zdGF0dXMgPSBBTUFQX0dFVF9CSVRTX1BUUihBU1lOQ19FVkVOVF9MSU5LX1NUQVRFLAorCQkJCQkgICAgICBwb3J0MF9saW5rX3N0YXR1cywgbGlua19zdGF0dXMpOworCXBvcnQxX2xpbmtfc3RhdHVzID0gQU1BUF9HRVRfQklUU19QVFIoQVNZTkNfRVZFTlRfTElOS19TVEFURSwKKwkJCQkJICAgICAgcG9ydDFfbGlua19zdGF0dXMsIGxpbmtfc3RhdHVzKTsKKwlwb3J0MF9kdXBsZXggPSBBTUFQX0dFVF9CSVRTX1BUUihBU1lOQ19FVkVOVF9MSU5LX1NUQVRFLAorCQkJCQkgcG9ydDBfZHVwbGV4LCBsaW5rX3N0YXR1cyk7CisJcG9ydDFfZHVwbGV4ID0gQU1BUF9HRVRfQklUU19QVFIoQVNZTkNfRVZFTlRfTElOS19TVEFURSwKKwkJCQkJIHBvcnQxX2R1cGxleCwgbGlua19zdGF0dXMpOworCXBvcnQwX3NwZWVkID0gQU1BUF9HRVRfQklUU19QVFIoQVNZTkNfRVZFTlRfTElOS19TVEFURSwKKwkJCQkJcG9ydDBfc3BlZWQsIGxpbmtfc3RhdHVzKTsKKwlwb3J0MV9zcGVlZCA9IEFNQVBfR0VUX0JJVFNfUFRSKEFTWU5DX0VWRU5UX0xJTktfU1RBVEUsCisJCQkJCXBvcnQxX3NwZWVkLCBsaW5rX3N0YXR1cyk7CisJaWYgKGFzeW5jX2V2ZW50X3R5cGUgPT0gTlRXS19MSU5LX1RZUEVfVklSVFVBTCkgeworCQlhZGFwdGVyLT5iZV9zdGF0LmJlc19saW5rX2NoYW5nZV92aXJ0dWFsKys7CisJCWlmIChhZGFwdGVyLT5iZV9saW5rX3N0cy0+YWN0aXZlX3BvcnQgIT0gYWN0aXZlX3BvcnQpIHsKKwkJCWRldl9ub3RpY2UoJm5ldGRldi0+ZGV2LAorCQkJICAgICAgICJBY3RpdmUgcG9ydCBjaGFuZ2VkIGR1ZSB0byBWTEQgb24gc3dpdGNoXG4iKTsKKwkJfSBlbHNlIHsKKwkJCWRldl9ub3RpY2UoJm5ldGRldi0+ZGV2LCAiTGluayBzdGF0dXMgdXBkYXRlXG4iKTsKKwkJfQorCisJfSBlbHNlIHsKKwkJYWRhcHRlci0+YmVfc3RhdC5iZXNfbGlua19jaGFuZ2VfcGh5c2ljYWwrKzsKKwkJaWYgKGFkYXB0ZXItPmJlX2xpbmtfc3RzLT5hY3RpdmVfcG9ydCAhPSBhY3RpdmVfcG9ydCkgeworCQkJZGV2X25vdGljZSgmbmV0ZGV2LT5kZXYsCisJCQkgICAgICAgIkFjdGl2ZSBwb3J0IGNoYW5nZWQgZHVlIHRvIHBvcnQgbGluayIKKwkJCSAgICAgICAiIHN0YXR1cyBjaGFuZ2VcbiIpOworCQl9IGVsc2UgeworCQkJZGV2X25vdGljZSgmbmV0ZGV2LT5kZXYsICJMaW5rIHN0YXR1cyB1cGRhdGVcbiIpOworCQl9CisJfQorCisJbWVtc2V0KGFkYXB0ZXItPmJlX2xpbmtfc3RzLCAwLCBzaXplb2YoYWRhcHRlci0+YmVfbGlua19zdHMpKTsKKworCWlmICgocG9ydDBfbGlua19zdGF0dXMgPT0gQVNZTkNfRVZFTlRfTElOS19VUCkgfHwKKwkgICAgKHBvcnQxX2xpbmtfc3RhdHVzID09IEFTWU5DX0VWRU5UX0xJTktfVVApKSB7CisJCWlmICgoYWRhcHRlci0+cG9ydDBfbGlua19zdHMgPT0gQkVfUE9SVF9MSU5LX0RPV04pICYmCisJCSAgICAoYWRhcHRlci0+cG9ydDFfbGlua19zdHMgPT0gQkVfUE9SVF9MSU5LX0RPV04pKSB7CisJCQkvKiBFYXJsaWVyIGJvdGggdGhlIHBvcnRzIGFyZSBkb3duIFNvIGxpbmsgaXMgdXAgKi8KKwkJCWxpbmtfZW5hYmxlID0gdHJ1ZTsKKwkJfQorCisJCWlmIChwb3J0MF9saW5rX3N0YXR1cyA9PSBBU1lOQ19FVkVOVF9MSU5LX1VQKSB7CisJCQlhZGFwdGVyLT5wb3J0MF9saW5rX3N0cyA9IEJFX1BPUlRfTElOS19VUDsKKwkJCWFkYXB0ZXItPmJlX2xpbmtfc3RzLT5tYWMwX2R1cGxleCA9IHBvcnQwX2R1cGxleDsKKwkJCWFkYXB0ZXItPmJlX2xpbmtfc3RzLT5tYWMwX3NwZWVkID0gcG9ydDBfc3BlZWQ7CisJCQlpZiAoYWN0aXZlX3BvcnQgPT0gTlRXS19QT1JUX0EpCisJCQkJYWRhcHRlci0+YmVfbGlua19zdHMtPmFjdGl2ZV9wb3J0ID0gMDsKKwkJfSBlbHNlCisJCQlhZGFwdGVyLT5wb3J0MF9saW5rX3N0cyA9IEJFX1BPUlRfTElOS19ET1dOOworCisJCWlmIChwb3J0MV9saW5rX3N0YXR1cyA9PSBBU1lOQ19FVkVOVF9MSU5LX1VQKSB7CisJCQlhZGFwdGVyLT5wb3J0MV9saW5rX3N0cyA9IEJFX1BPUlRfTElOS19VUDsKKwkJCWFkYXB0ZXItPmJlX2xpbmtfc3RzLT5tYWMxX2R1cGxleCA9IHBvcnQxX2R1cGxleDsKKwkJCWFkYXB0ZXItPmJlX2xpbmtfc3RzLT5tYWMxX3NwZWVkID0gcG9ydDFfc3BlZWQ7CisJCQlpZiAoYWN0aXZlX3BvcnQgPT0gTlRXS19QT1JUX0IpCisJCQkJYWRhcHRlci0+YmVfbGlua19zdHMtPmFjdGl2ZV9wb3J0ID0gMTsKKwkJfSBlbHNlCisJCQlhZGFwdGVyLT5wb3J0MV9saW5rX3N0cyA9IEJFX1BPUlRfTElOS19ET1dOOworCisJCXByaW50ayhLRVJOX0lORk8gIkxpbmsgUHJvcGVydGllcyBmb3IgJXM6XG4iLCBuZXRkZXYtPm5hbWUpOworCQlkZXZfaW5mbygmbmV0ZGV2LT5kZXYsICJMaW5rIFByb3BlcnRpZXM6XG4iKTsKKwkJYmVfcHJpbnRfbGlua19pbmZvKGFkYXB0ZXItPmJlX2xpbmtfc3RzKTsKKworCQlpZiAoIWxpbmtfZW5hYmxlKQorCQkJcmV0dXJuOworCQkvKgorCQkgKiBCb3RoIHBvcnRzIHdlcmUgZG93biBwcmV2aW91c2x5LCBidXQgYXRsZWFzdCBvbmUgb2YKKwkJICogdGhlbSBoYXMgY29tZSB1cCBpZiB0aGlzIG5ldGRldmljZSdzIGNhcnJpZXIgaXMgbm90IHVwLAorCQkgKiB0aGVuIGluZGljYXRlIHRvIHN0YWNrCisJCSAqLworCQlpZiAoIW5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgeworCQkJbmV0aWZfc3RhcnRfcXVldWUobmV0ZGV2KTsKKwkJCW5ldGlmX2NhcnJpZXJfb24obmV0ZGV2KTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJLyogTm93IGJvdGggdGhlIHBvcnRzIGFyZSBkb3duLiBUZWxsIHRoZSBzdGFjayBhYm91dCBpdCAqLworCWRldl9pbmZvKCZuZXRkZXYtPmRldiwgIkJvdGggcG9ydHMgYXJlIGRvd25cbiIpOworCWFkYXB0ZXItPnBvcnQwX2xpbmtfc3RzID0gQkVfUE9SVF9MSU5LX0RPV047CisJYWRhcHRlci0+cG9ydDFfbGlua19zdHMgPSBCRV9QT1JUX0xJTktfRE9XTjsKKwlpZiAobmV0aWZfY2Fycmllcl9vayhuZXRkZXYpKSB7CisJCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CisJCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKwl9CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IGJlX21jY19jcmVhdGUoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2I7CisKKwlwbm9iID0gYWRhcHRlci0+bmV0X29iajsKKwkvKgorCSAqIENyZWF0ZSB0aGUgTUNDIHJpbmcgc28gdGhhdCBhbGwgZnVydGhlciBjb21tdW5pY2F0aW9uIHdpdGgKKwkgKiBNQ0MgY2FuIGdvIHRocnUgdGhlIHJpbmcuIHdlIGRvIHRoaXMgYXQgdGhlIGVuZCBzaW5jZQorCSAqIHdlIGRvIG5vdCB3YW50IHRvIGJlIGRlYWxpbmcgd2l0aCBpbnRlcnJ1cHRzIHVudGlsIHRoZQorCSAqIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlLgorCSAqLworCXBub2ItPm1jY19xX2xlbiA9IE1DQ19RX0xFTjsKKwlwbm9iLT5tY2NfcV9zaXplID0gcG5vYi0+bWNjX3FfbGVuICogc2l6ZW9mKHN0cnVjdCBNQ0NfV1JCX0FNQVApOworCXBub2ItPm1jY19xID0gIHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIHBub2ItPm1jY19xX3NpemUsCisJCQkJJnBub2ItPm1jY19xX2J1cyk7CisJaWYgKCFwbm9iLT5tY2NfcV9idXMpCisJCXJldHVybiAtMTsKKwkvKgorCSAqIHNwYWNlIGZvciBNQ0MgV1JCIGNvbnRleHQKKwkgKi8KKwlwbm9iLT5tY2Nfd3JiX2N0eHRMZW4gPSBNQ0NfUV9MRU47CisJcG5vYi0+bWNjX3dyYl9jdHh0X3NpemUgPSAgcG5vYi0+bWNjX3dyYl9jdHh0TGVuICoKKwkJc2l6ZW9mKHN0cnVjdCBiZV9tY2Nfd3JiX2NvbnRleHQpOworCXBub2ItPm1jY193cmJfY3R4dCA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLAorCQlnZXRfb3JkZXIocG5vYi0+bWNjX3dyYl9jdHh0X3NpemUpKTsKKwlpZiAocG5vYi0+bWNjX3dyYl9jdHh0ID09IE5VTEwpCisJCXJldHVybiAtMTsKKwkvKgorCSAqIFNwYWNlIGZvciBNQ0MgY29tcGwuIHJpbmcKKwkgKi8KKwlwbm9iLT5tY2NfY3FfbGVuID0gTUNDX0NRX0xFTjsKKwlwbm9iLT5tY2NfY3Ffc2l6ZSA9IHBub2ItPm1jY19jcV9sZW4gKiBzaXplb2Yoc3RydWN0IE1DQ19DUV9FTlRSWV9BTUFQKTsKKwlwbm9iLT5tY2NfY3EgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBwbm9iLT5tY2NfY3Ffc2l6ZSwKKwkJCQkmcG5vYi0+bWNjX2NxX2J1cyk7CisJaWYgKCFwbm9iLT5tY2NfY3FfYnVzKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgICAgVGhpcyBmdW5jdGlvbiBjcmVhdGVzIHRoZSBNQ0MgcmVxdWVzdCBhbmQgY29tcGxldGlvbiByaW5nIHJlcXVpcmVkCisgICAgZm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgQVJNIHByb2Nlc3Nvci4gIFRoZSBjYWxsZXIgbXVzdCBoYXZlCisgICAgYWxsb2NhdGVkIHJlcXVpcmVkIGFtb3VudCBvZiBtZW1vcnkgZm9yIHRoZSBNQ0MgcmluZyBhbmQgTUNDCisgICAgY29tcGxldGlvbiByaW5nIGFuZCBwb3N0ZWQgdGhlIHZpcnR1YWwgYWRkcmVzcyBhbmQgbnVtYmVyIG9mCisgICAgZW50cmllcyBpbiB0aGUgY29ycmVzcG9uZGluZyBtZW1iZXJzIChtY2NfcSBhbmQgbWNjX2NxKSBpbiB0aGUKKyAgICBOZXRPYmplY3Qgc3RydXR1cmUuCisKKyAgICBXaGVuIHRoaXMgY2FsbCBpcyBjb21wbGV0ZWQsIGFsbCBmdXJ0aGVyIGNvbW11bmljYXRpb24gd2l0aAorICAgIEFSTSB3aWxsIHN3aXRjaCBmcm9tIG1haWxib3ggdG8gdGhpcyByaW5nLgorCisgICAgcG5vYgktIFBvaW50ZXIgdG8gdGhlIE5ldE9iamVjdCBzdHJ1Y3R1cmUuIFRoaXMgTmV0T2JqZWN0IHNob3VsZAorCQkgIGhhdmUgYmVlbiBjcmVhdGVkIHVzaW5nIGEgcHJldmlvdXMgY2FsbCB0byBiZV9jcmVhdGVfbmV0b2JqKCkKKyovCitpbnQgYmVfY3JlYXRlX21jY19yaW5ncyhzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYikKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgcmluZ19kZXNjIHJkOworCXN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IgPSAmcG5vYi0+Zm5fb2JqOworCisJbWVtc2V0KCZyZCwgMCwgc2l6ZW9mKHN0cnVjdCByaW5nX2Rlc2MpKTsKKwlpZiAocG5vYi0+bWNjX2NxX2xlbikgeworCQlyZC52YSA9IHBub2ItPm1jY19jcTsKKwkJcmQucGEgPSBwbm9iLT5tY2NfY3FfYnVzOworCQlyZC5sZW5ndGggPSBwbm9iLT5tY2NfY3Ffc2l6ZTsKKworCQlzdGF0dXMgPSBiZV9jcV9jcmVhdGUocGZvYiwgJnJkLAorCQkJcG5vYi0+bWNjX2NxX2xlbiAqIHNpemVvZihzdHJ1Y3QgTUNDX0NRX0VOVFJZX0FNQVApLAorCQkJZmFsc2UsCS8qIHNvbGljdGVkIGV2ZW50cywgICovCisJCQl0cnVlLAkvKiBub2RlbGF5ICAqLworCQkJMCwJLyogMCBXYXRlcm1hcmsgc2luY2UgTm9kZWxheSBpcyB0cnVlICovCisJCQkmcG5vYi0+ZXZlbnRfcV9vYmosCisJCQkmcG5vYi0+bWNjX2NxX29iaik7CisKKwkJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTKQorCQkJcmV0dXJuIHN0YXR1czsKKworCQlwbm9iLT5tY2NfY3FfaWQgPSBwbm9iLT5tY2NfY3Ffb2JqLmNxX2lkOworCQlwbm9iLT5tY2NfY3FfY3JlYXRlZCA9IDE7CisJfQorCWlmIChwbm9iLT5tY2NfcV9sZW4pIHsKKwkJcmQudmEgPSBwbm9iLT5tY2NfcTsKKwkJcmQucGEgPSBwbm9iLT5tY2NfcV9idXM7CisJCXJkLmxlbmd0aCA9IHBub2ItPm1jY19xX3NpemU7CisKKwkJc3RhdHVzID0gYmVfbWNjX3JpbmdfY3JlYXRlKHBmb2IsICZyZCwKKwkJCQlwbm9iLT5tY2NfcV9sZW4gKiBzaXplb2Yoc3RydWN0IE1DQ19XUkJfQU1BUCksCisJCQkJcG5vYi0+bWNjX3dyYl9jdHh0LCBwbm9iLT5tY2Nfd3JiX2N0eHRMZW4sCisJCQkJJnBub2ItPm1jY19jcV9vYmosICZwbm9iLT5tY2NfcV9vYmopOworCisJCWlmIChzdGF0dXMgIT0gQkVfU1VDQ0VTUykKKwkJCXJldHVybiBzdGF0dXM7CisKKwkJcG5vYi0+bWNjX3FfY3JlYXRlZCA9IDE7CisJfQorCXJldHVybiBCRV9TVUNDRVNTOworfQorCitzdGF0aWMgaW50IGJlX21jY19pbml0KHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQoreworCXUzMiByOworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iOworCisJcG5vYiA9IGFkYXB0ZXItPm5ldF9vYmo7CisJbWVtc2V0KHBub2ItPm1jY19xLCAwLCBwbm9iLT5tY2NfcV9zaXplKTsKKwlwbm9iLT5tY2NfcV9oZCA9IDA7CisKKwltZW1zZXQocG5vYi0+bWNjX3dyYl9jdHh0LCAwLCBwbm9iLT5tY2Nfd3JiX2N0eHRfc2l6ZSk7CisKKwltZW1zZXQocG5vYi0+bWNjX2NxLCAwLCBwbm9iLT5tY2NfY3Ffc2l6ZSk7CisJcG5vYi0+bWNjX2NxX3RsID0gMDsKKworCXIgPSBiZV9jcmVhdGVfbWNjX3JpbmdzKGFkYXB0ZXItPm5ldF9vYmopOworCWlmIChyICE9IEJFX1NVQ0NFU1MpCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBiZV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2I7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXI7CisKKwlhZGFwdGVyID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCWlmICghYWRhcHRlcikKKwkJcmV0dXJuOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCXBub2IgPSAoc3RydWN0IGJlX25ldF9vYmplY3QgKilhZGFwdGVyLT5uZXRfb2JqOworCisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKworCWlmIChwbm9iKSB7CisJCS8qIFVucmVnaXN0ZXIgYXN5bmMgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGxpbmsgc3RhdHVzIHVwZGF0ZXMgKi8KKwkJaWYgKHBub2ItPm1jY19xX2NyZWF0ZWQpCisJCQliZV9tY2NfYWRkX2FzeW5jX2V2ZW50X2NhbGxiYWNrKCZwbm9iLT5tY2NfcV9vYmosCisJCQkJCQkJCU5VTEwsIE5VTEwpOworCQluZXRvYmplY3RfY2xlYW51cChhZGFwdGVyLCBwbm9iKTsKKwl9CisKKwlpZiAoYWRhcHRlci0+Y3NyX3ZhKQorCQlpb3VubWFwKGFkYXB0ZXItPmNzcl92YSk7CisJaWYgKGFkYXB0ZXItPmRiX3ZhKQorCQlpb3VubWFwKGFkYXB0ZXItPmRiX3ZhKTsKKwlpZiAoYWRhcHRlci0+cGNpX3ZhKQorCQlpb3VubWFwKGFkYXB0ZXItPnBjaV92YSk7CisKKwlwY2lfcmVsZWFzZV9yZWdpb25zKGFkYXB0ZXItPnBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShhZGFwdGVyLT5wZGV2KTsKKworCWtmcmVlKGFkYXB0ZXItPmJlX2xpbmtfc3RzKTsKKwlrZnJlZShhZGFwdGVyLT5ldGhfc3RhdHNwKTsKKworCWlmIChhZGFwdGVyLT50aW1lcl9jdHh0LmdldF9zdGF0c190aW1lci5mdW5jdGlvbikKKwkJZGVsX3RpbWVyX3N5bmMoJmFkYXB0ZXItPnRpbWVyX2N0eHQuZ2V0X3N0YXRzX3RpbWVyKTsKKwlrZnJlZShhZGFwdGVyKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBQQ0kgc3ViLXN5c3RlbSB3aGVuIGl0IGZpbmRzIGEgUENJCisgKiBkZXZpY2Ugd2l0aCBkZXYvdmVuZG9yIElEcyB0aGF0IG1hdGNoIHdpdGggb25lIG9mIG91ciBkZXZpY2VzLgorICogQWxsIG9mIHRoZSBkcml2ZXIgaW5pdGlhbGl6YXRpb24gaXMgZG9uZSBpbiB0aGlzIGZ1bmN0aW9uLgorICovCitzdGF0aWMgaW50IGJlX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGRldl9pZCkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcjsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0dFVF9GV19WRVJTSU9OX1JFU1BPTlNFX1BBWUxPQUQgZ2V0X2Z3djsKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCisJc3RhdHVzID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHN0YXR1cykKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgYmVfZHJpdmVyX25hbWUpOworCWlmIChzdGF0dXMpCisJCWdvdG8gZXJyb3JfcGNpX3JlcTsKKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCWFkYXB0ZXIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYmVfYWRhcHRlciksIEdGUF9LRVJORUwpOworCWlmIChhZGFwdGVyID09IE5VTEwpIHsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9hZGFwdGVyOworCX0KKwlhZGFwdGVyLT5kZXZfc3RhdGUgPSBCRV9ERVZfU1RBVEVfTk9ORTsKKwlhZGFwdGVyLT5wZGV2ID0gcGRldjsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgYWRhcHRlcik7CisKKwlhZGFwdGVyLT5lbmFibGVfYWljID0gMTsKKwlhZGFwdGVyLT5tYXhfZXFkID0gTUFYX0VRRDsKKwlhZGFwdGVyLT5taW5fZXFkID0gMDsKKwlhZGFwdGVyLT5jdXJfZXFkID0gMDsKKworCXN0YXR1cyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzY0QklUX01BU0spOworCWlmICghc3RhdHVzKSB7CisJCWFkYXB0ZXItPmRtYV82NGJpdF9jYXAgPSB0cnVlOworCX0gZWxzZSB7CisJCWFkYXB0ZXItPmRtYV82NGJpdF9jYXAgPSBmYWxzZTsKKwkJc3RhdHVzID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSyk7CisJCWlmIChzdGF0dXMgIT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3Qgc2V0IFBDSSBETUEgTWFza1xuIik7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKwl9CisKKwlzdGF0dXMgPSBpbml0X3BjaV9iZV9mdW5jdGlvbihhZGFwdGVyLCBwZGV2KTsKKwlpZiAoc3RhdHVzICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gbWFwIFBDSSBCQVJTXG4iKTsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCWJlX3RyYWNlX3NldF9sZXZlbChETF9BTFdBWVMgfCBETF9FUlIpOworCisJYWRhcHRlci0+YmVfbGlua19zdHMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgQkVfTElOS19TVEFUVVMpLAorCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoYWRhcHRlci0+YmVfbGlua19zdHMgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIk1lbW9yeSBhbGxvY2F0aW9uIGZvciBsaW5rIHN0YXR1cyAiCisJCSAgICAgICAiYnVmZmVyIGZhaWxlZFxuIik7CisJCWdvdG8gY2xlYW51cDsKKwl9CisJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPnR4cV9sb2NrKTsKKworCW5ldGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgYmVfbmV0X29iamVjdCkpOworCWlmIChuZXRkZXYgPT0gTlVMTCkgeworCQlzdGF0dXMgPSAtRU5PTUVNOworCQlnb3RvIGNsZWFudXA7CisJfQorCXBub2IgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWFkYXB0ZXItPm5ldF9vYmogPSBwbm9iOworCWFkYXB0ZXItPm5ldGRldnAgPSBuZXRkZXY7CisJcG5vYi0+YWRhcHRlciA9IGFkYXB0ZXI7CisJcG5vYi0+bmV0ZGV2ID0gbmV0ZGV2OworCisJc3RhdHVzID0gYmVfbm9iX3JpbmdfYWxsb2MoYWRhcHRlciwgcG5vYik7CisJaWYgKHN0YXR1cyAhPSAwKQorCQlnb3RvIGNsZWFudXA7CisKKwlzdGF0dXMgPSBiZV9ub2JfcmluZ19pbml0KGFkYXB0ZXIsIHBub2IpOworCWlmIChzdGF0dXMgIT0gMCkKKwkJZ290byBjbGVhbnVwOworCisJYmVfcnhmX21hY19hZGRyZXNzX3JlYWRfd3JpdGUoJnBub2ItPmZuX29iaiwgZmFsc2UsIGZhbHNlLCBmYWxzZSwKKwkJZmFsc2UsIGZhbHNlLCBuZXRkZXYtPmRldl9hZGRyLCBOVUxMLCBOVUxMKTsKKworCW5ldGRldi0+aW5pdCA9ICZiZW5ldF9pbml0OworCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CisJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCisJU0VUX05FVERFVl9ERVYobmV0ZGV2LCAmKGFkYXB0ZXItPnBkZXYtPmRldikpOworCisJbmV0aWZfbmFwaV9hZGQobmV0ZGV2LCAmcG5vYi0+bmFwaSwgYmVfcG9sbCwgNjQpOworCisJLyogaWYgdGhlIHJ4X2ZyYWcgc2l6ZSBpZiAySywgb25lIHBhZ2UgaXMgc2hhcmVkIGFzIHR3byBSWCBmcmFncyAqLworCXBub2ItPnJ4X3BnX3NoYXJlZCA9CisJCShwbm9iLT5yeF9idWZfc2l6ZSA8PSBQQUdFX1NJWkUgLyAyKSA/IHRydWUgOiBmYWxzZTsKKwlpZiAocG5vYi0+cnhfYnVmX3NpemUgIT0gcnhidWZfc2l6ZSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiQ291bGQgbm90IHNldCBSeCBidWZmZXIgc2l6ZSB0byAlZC4gVXNpbmcgJWRcbiIsCisJCQkJICAgICAgIHJ4YnVmX3NpemUsIHBub2ItPnJ4X2J1Zl9zaXplKTsKKwkJcnhidWZfc2l6ZSA9IHBub2ItPnJ4X2J1Zl9zaXplOworCX0KKworCXRhc2tsZXRfaW5pdCgmKGFkYXB0ZXItPnN0c19oYW5kbGVyKSwgYmVfcHJvY2Vzc19pbnRyLAorCQkgICAgICh1bnNpZ25lZCBsb25nKWFkYXB0ZXIpOworCWFkYXB0ZXItPnRhc2tsZXRfc3RhcnRlZCA9IDE7CisJc3Bpbl9sb2NrX2luaXQoJihhZGFwdGVyLT5pbnRfbG9jaykpOworCisJc3RhdHVzID0gYmVfcmVnaXN0ZXJfaXNyKGFkYXB0ZXIsIHBub2IpOworCWlmIChzdGF0dXMgIT0gMCkKKwkJZ290byBjbGVhbnVwOworCisJYWRhcHRlci0+cnhfY3N1bSA9IDE7CisJYWRhcHRlci0+bWF4X3J4X2NvYWwgPSBCRV9MUk9fTUFYX1BLVFM7CisKKwltZW1zZXQoJmdldF9md3YsIDAsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgRldDTURfQ09NTU9OX0dFVF9GV19WRVJTSU9OX1JFU1BPTlNFX1BBWUxPQUQpKTsKKwlwcmludGsoS0VSTl9JTkZPICJCbGFkZUVuZ2luZSBEcml2ZXIgdmVyc2lvbjolcy4gIgorCSAgICAgICAiQ29weXJpZ2h0IFNlcnZlckVuZ2luZXMsIENvcnBvcmF0aW9uIDIwMDUgLSAyMDA4XG4iLAorCQkJICAgICAgIGJlX2RydnJfdmVyKTsKKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9nZXRfZndfdmVyc2lvbigmcG5vYi0+Zm5fb2JqLCAmZ2V0X2Z3diwgTlVMTCwKKwkJCQkJICAgIE5VTEwpOworCWlmIChzdGF0dXMgPT0gQkVfU1VDQ0VTUykgeworCQlzdHJuY3B5KGJlX2Z3X3ZlciwgZ2V0X2Z3di5maXJtd2FyZV92ZXJzaW9uX3N0cmluZywgMzIpOworCQlwcmludGsoS0VSTl9JTkZPICJCbGFkZUVuZ2luZSBGaXJtd2FyZSBWZXJzaW9uOiVzXG4iLAorCQkgICAgICAgZ2V0X2Z3di5maXJtd2FyZV92ZXJzaW9uX3N0cmluZyk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVW5hYmxlIHRvIGdldCBCRSBGaXJtd2FyZSBWZXJzaW9uXG4iKTsKKwl9CisKKwlzZW1hX2luaXQoJmFkYXB0ZXItPmdldF9ldGhfc3RhdF9zZW0sIDApOworCWluaXRfdGltZXIoJmFkYXB0ZXItPnRpbWVyX2N0eHQuZ2V0X3N0YXRzX3RpbWVyKTsKKwlhdG9taWNfc2V0KCZhZGFwdGVyLT50aW1lcl9jdHh0LmdldF9zdGF0X2ZsYWcsIDApOworCWFkYXB0ZXItPnRpbWVyX2N0eHQuZ2V0X3N0YXRzX3RpbWVyLmZ1bmN0aW9uID0KKwkgICAgJmJlX2dldF9zdGF0c190aW1lcl9oYW5kbGVyOworCisJc3RhdHVzID0gYmVfbWNjX2NyZWF0ZShhZGFwdGVyKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBjbGVhbnVwOworCXN0YXR1cyA9IGJlX21jY19pbml0KGFkYXB0ZXIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGNsZWFudXA7CisKKworCXN0YXR1cyA9IGJlX21jY19hZGRfYXN5bmNfZXZlbnRfY2FsbGJhY2soJmFkYXB0ZXItPm5ldF9vYmotPm1jY19xX29iaiwKKwkJCSBiZV9saW5rX3N0YXR1c19hc3luY19jYWxsYmFjaywgKHZvaWQgKilhZGFwdGVyKTsKKwlpZiAoc3RhdHVzICE9IEJFX1NVQ0NFU1MpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWRkX2FzeW5jX2V2ZW50X2NhbGxiYWNrIGZhaWxlZCIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiTGluayBzdGF0dXMgY2hhbmdlcyBtYXkgbm90IGJlIHJlZmxlY3RlZFxuIik7CisJfQorCisJc3RhdHVzID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CisJaWYgKHN0YXR1cyAhPSAwKQorCQlnb3RvIGNsZWFudXA7CisJYmVfdXBkYXRlX2xpbmtfc3RhdHVzKGFkYXB0ZXIpOworCWFkYXB0ZXItPmRldl9zdGF0ZSA9IEJFX0RFVl9TVEFURV9JTklUOworCXJldHVybiAwOworCitjbGVhbnVwOgorCWJlX3JlbW92ZShwZGV2KTsKKwlyZXR1cm4gc3RhdHVzOworZXJyb3JfYWRhcHRlcjoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworZXJyb3JfcGNpX3JlcToKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CitlcnJvcjoKKwlwcmludGsoS0VSTl9FUlIgIkJsYWRlRW5naW5lIGluaXRhbGl6YXRpb24gZmFpbGVkXG4iKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogR2V0IHRoZSBjdXJyZW50IGxpbmsgc3RhdHVzIGFuZCBwcmludCB0aGUgc3RhdHVzIG9uIGNvbnNvbGUKKyAqLwordm9pZCBiZV91cGRhdGVfbGlua19zdGF0dXMoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiA9IGFkYXB0ZXItPm5ldF9vYmo7CisKKwlzdGF0dXMgPSBiZV9yeGZfbGlua19zdGF0dXMoJnBub2ItPmZuX29iaiwgYWRhcHRlci0+YmVfbGlua19zdHMsIE5VTEwsCisJCQlOVUxMLCBOVUxMKTsKKwlpZiAoc3RhdHVzID09IEJFX1NVQ0NFU1MpIHsKKwkJaWYgKGFkYXB0ZXItPmJlX2xpbmtfc3RzLT5tYWMwX3NwZWVkICYmCisJCSAgICBhZGFwdGVyLT5iZV9saW5rX3N0cy0+bWFjMF9kdXBsZXgpCisJCQlhZGFwdGVyLT5wb3J0MF9saW5rX3N0cyA9IEJFX1BPUlRfTElOS19VUDsKKwkJZWxzZQorCQkJYWRhcHRlci0+cG9ydDBfbGlua19zdHMgPSBCRV9QT1JUX0xJTktfRE9XTjsKKworCQlpZiAoYWRhcHRlci0+YmVfbGlua19zdHMtPm1hYzFfc3BlZWQgJiYKKwkJICAgIGFkYXB0ZXItPmJlX2xpbmtfc3RzLT5tYWMxX2R1cGxleCkKKwkJCWFkYXB0ZXItPnBvcnQxX2xpbmtfc3RzID0gQkVfUE9SVF9MSU5LX1VQOworCQllbHNlCisJCQlhZGFwdGVyLT5wb3J0MV9saW5rX3N0cyA9IEJFX1BPUlRfTElOS19ET1dOOworCisJCWRldl9pbmZvKCZwbm9iLT5uZXRkZXYtPmRldiwgIkxpbmsgUHJvcGVydGllczpcbiIpOworCQliZV9wcmludF9saW5rX2luZm8oYWRhcHRlci0+YmVfbGlua19zdHMpOworCQlyZXR1cm47CisJfQorCWRldl9pbmZvKCZwbm9iLT5uZXRkZXYtPmRldiwgIkNvdWxkIG5vdCBnZXQgbGluayBzdGF0dXNcbiIpOworCXJldHVybjsKK30KKworCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgdm9pZAorYmVfcG1fY2xlYW51cChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwKKwkgICAgICBzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOworCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKworCWJlX3dhaXRfbmljX3R4X2NtcGx4X2NtcGwocG5vYik7CisJYmVfZGlzYWJsZV9lcV9pbnRyKHBub2IpOworCisJaWYgKGFkYXB0ZXItPnRhc2tsZXRfc3RhcnRlZCkgeworCQl0YXNrbGV0X2tpbGwoJmFkYXB0ZXItPnN0c19oYW5kbGVyKTsKKwkJYWRhcHRlci0+dGFza2xldF9zdGFydGVkID0gMDsKKwl9CisKKwliZV91bnJlZ2lzdGVyX2lzcihhZGFwdGVyKTsKKwliZV9kaXNhYmxlX2ludHIocG5vYik7CisKKwliZV90eF9xX2NsZWFuKHBub2IpOworCWJlX3J4X3FfY2xlYW4ocG5vYik7CisKKwliZV9kZXN0cm95X25ldG9iaihwbm9iKTsKK30KKworc3RhdGljIGludCBiZV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9ICBhZGFwdGVyLT5uZXRkZXZwOworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCWFkYXB0ZXItPmRldl9wbV9zdGF0ZSA9IGFkYXB0ZXItPmRldl9zdGF0ZTsKKwlhZGFwdGVyLT5kZXZfc3RhdGUgPSBCRV9ERVZfU1RBVEVfU1VTUEVORDsKKworCW5ldGlmX2RldmljZV9kZXRhY2gobmV0ZGV2KTsKKwlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKQorCQliZV9wbV9jbGVhbnVwKGFkYXB0ZXIsIHBub2IsIG5ldGRldik7CisKKwlwY2lfZW5hYmxlX3dha2UocGRldiwgMywgMSk7CisJcGNpX2VuYWJsZV93YWtlKHBkZXYsIDQsIDEpOwkvKiBEMyBDb2xkID0gNCAqLworCXBjaV9zYXZlX3N0YXRlKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYmVfdXAoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IgPSBhZGFwdGVyLT5uZXRfb2JqOworCisJaWYgKHBub2ItPm51bV92bGFucyAhPSAwKQorCQliZV9yeGZfdmxhbl9jb25maWcoJnBub2ItPmZuX29iaiwgZmFsc2UsIHBub2ItPm51bV92bGFucywKKwkJCXBub2ItPnZsYW5fdGFnLCBOVUxMLCBOVUxMLCBOVUxMKTsKKworfQorCitzdGF0aWMgaW50IGJlX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gIGFkYXB0ZXItPm5ldGRldnA7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJbmV0aWZfZGV2aWNlX2RldGFjaChuZXRkZXYpOworCisJc3RhdHVzID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgMCk7CisJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisJcGNpX2VuYWJsZV93YWtlKHBkZXYsIDMsIDApOworCXBjaV9lbmFibGVfd2FrZShwZGV2LCA0LCAwKTsJLyogNCBpcyBEMyBjb2xkICovCisKKwluZXRpZl9jYXJyaWVyX29uKG5ldGRldik7CisJbmV0aWZfc3RhcnRfcXVldWUobmV0ZGV2KTsKKworCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKKwkJYmVfcnhmX21hY19hZGRyZXNzX3JlYWRfd3JpdGUoJnBub2ItPmZuX29iaiwgZmFsc2UsIGZhbHNlLAorCQkJZmFsc2UsIHRydWUsIGZhbHNlLCBuZXRkZXYtPmRldl9hZGRyLCBOVUxMLCBOVUxMKTsKKworCQlzdGF0dXMgPSBiZV9ub2JfcmluZ19pbml0KGFkYXB0ZXIsIHBub2IpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCXJldHVybiBzdGF0dXM7CisKKwkJdGFza2xldF9pbml0KCYoYWRhcHRlci0+c3RzX2hhbmRsZXIpLCBiZV9wcm9jZXNzX2ludHIsCisJCQkgICAgICh1bnNpZ25lZCBsb25nKWFkYXB0ZXIpOworCQlhZGFwdGVyLT50YXNrbGV0X3N0YXJ0ZWQgPSAxOworCisJCWlmIChiZV9yZWdpc3Rlcl9pc3IoYWRhcHRlciwgcG5vYikgIT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJiZV9yZWdpc3Rlcl9pc3IgZmFpbGVkXG4iKTsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKworCisJCXN0YXR1cyA9IGJlX21jY19pbml0KGFkYXB0ZXIpOworCQlpZiAoc3RhdHVzIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJiZV9tY2NfaW5pdCBmYWlsZWRcbiIpOworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCQliZV91cGRhdGVfbGlua19zdGF0dXMoYWRhcHRlcik7CisJCS8qCisJCSAqIFJlZ2lzdGVyIGFzeW5jIGNhbGwgYmFjayBmdW5jdGlvbiB0byBoYW5kbGUgbGluaworCQkgKiBzdGF0dXMgdXBkYXRlcworCQkgKi8KKwkJc3RhdHVzID0gYmVfbWNjX2FkZF9hc3luY19ldmVudF9jYWxsYmFjaygKKwkJCQkmYWRhcHRlci0+bmV0X29iai0+bWNjX3Ffb2JqLAorCQkJCWJlX2xpbmtfc3RhdHVzX2FzeW5jX2NhbGxiYWNrLCAodm9pZCAqKWFkYXB0ZXIpOworCQlpZiAoc3RhdHVzICE9IEJFX1NVQ0NFU1MpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImFkZF9hc3luY19ldmVudF9jYWxsYmFjayBmYWlsZWQiKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiTGluayBzdGF0dXMgY2hhbmdlcyBtYXkgbm90IGJlIHJlZmxlY3RlZFxuIik7CisJCX0KKwkJYmVfZW5hYmxlX2ludHIocG5vYik7CisJCWJlX2VuYWJsZV9lcV9pbnRyKHBub2IpOworCQliZV91cChhZGFwdGVyKTsKKwl9CisJbmV0aWZfZGV2aWNlX2F0dGFjaChuZXRkZXYpOworCWFkYXB0ZXItPmRldl9zdGF0ZSA9IGFkYXB0ZXItPmRldl9wbV9zdGF0ZTsKKwlyZXR1cm4gMDsKKworfQorCisjZW5kaWYKKworLyogV2FpdCB1bnRpbCBubyBtb3JlIHBlbmRpbmcgdHJhbnNtaXRzICAqLwordm9pZCBiZV93YWl0X25pY190eF9jbXBseF9jbXBsKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iKQoreworCWludCBpOworCisJLyogV2FpdCBmb3IgMjB1cyAqIDUwMDAwICg9IDFzKSBhbmQgbm8gbW9yZSAqLworCWkgPSAwOworCXdoaWxlICgocG5vYi0+dHhfcV90bCAhPSBwbm9iLT50eF9xX2hkKSAmJiAoaSA8IDUwMDAwKSkgeworCQkrK2k7CisJCXVkZWxheSgyMCk7CisJfQorCisJLyogQ2hlY2sgZm9yIG5vIG1vcmUgcGVuZGluZyB0cmFuc21pdHMgKi8KKwlpZiAoaSA+PSA1MDAwMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiRGlkIG5vdCByZWNlaXZlIGNvbXBsZXRpb25zIGZvciBhbGwgVFggcmVxdWVzdHNcbiIpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGJlX2RyaXZlciA9IHsKKwkubmFtZSA9IGJlX2RyaXZlcl9uYW1lLAorCS5pZF90YWJsZSA9IGJlX2RldmljZV9pZF90YWJsZSwKKwkucHJvYmUgPSBiZV9wcm9iZSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZCA9IGJlX3N1c3BlbmQsCisJLnJlc3VtZSA9IGJlX3Jlc3VtZSwKKyNlbmRpZgorCS5yZW1vdmUgPSBiZV9yZW1vdmUKK307CisKKy8qCisgKiBNb2R1bGUgaW5pdCBlbnRyeSBwb2ludC4gUmVnaXN0ZXJzIG91ciBvdXIgZGV2aWNlIGFuZCByZXR1cm4uCisgKiBPdXIgcHJvYmUgd2lsbCBiZSBjYWxsZWQgaWYgdGhlIGRldmljZSBpcyBmb3VuZC4KKyAqLworc3RhdGljIGludCBfX2luaXQgYmVfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgcmV0OworCisJaWYgKHJ4YnVmX3NpemUgIT0gODE5MiAmJiByeGJ1Zl9zaXplICE9IDQwOTYgJiYgcnhidWZfc2l6ZSAhPSAyMDQ4KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJVbnN1cHBvcnRlZCByZWNlaXZlIGJ1ZmZlciBzaXplICglZCkgcmVxdWVzdGVkXG4iLAorCQkgICAgICAgcnhidWZfc2l6ZSk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJNdXN0IGJlIDIwNDgsIDQwOTYgb3IgODE5Mi4gRGVmYXVsdGluZyB0byAyMDQ4XG4iKTsKKwkJcnhidWZfc2l6ZSA9IDIwNDg7CisJfQorCisJcmV0ID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmYmVfZHJpdmVyKTsKKworCXJldHVybiByZXQ7Cit9CisKK21vZHVsZV9pbml0KGJlX2luaXRfbW9kdWxlKTsKKworLyoKKyAqIGJlX2V4aXRfbW9kdWxlIC0gRHJpdmVyIEV4aXQgQ2xlYW51cCBSb3V0aW5lCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBiZV9leGl0X21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYmVfZHJpdmVyKTsKK30KKworbW9kdWxlX2V4aXQoYmVfZXhpdF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2JlX2ludC5jIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2JlX2ludC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYTk1ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvYmVfaW50LmMKQEAgLTAsMCArMSw4NjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldF9scm8uaD4KKworI2luY2x1ZGUgImJlbmV0LmgiCisKKy8qIG51bWJlciBvZiBieXRlcyBvZiBSWCBmcmFtZSB0aGF0IGFyZSBjb3BpZWQgdG8gc2tiLT5kYXRhICovCisjZGVmaW5lIEJFX0hEUl9MRU4gNjQKKworI2RlZmluZSBORVRJRl9SWChza2IpIG5ldGlmX3JlY2VpdmVfc2tiKHNrYikKKyNkZWZpbmUgVkxBTl9BQ0NFTF9SWChza2IsIHBub2IsIHZ0KSBcCisJCXZsYW5faHdhY2NlbF9yeChza2IsIHBub2ItPnZsYW5fZ3JwLCB2dCkKKworLyoKKyAgICBUaGlzIGZ1bmN0aW9uIG5vdGlmaWVzIEJsYWRlRW5naW5lIG9mIHRoZSBudW1iZXIgb2YgY29tcGxldGlvbgorICAgIGVudHJpZXMgcHJvY2Vzc2VkIGZyb20gdGhlIHNwZWNpZmllZCBjb21wbGV0aW9uIHF1ZXVlIGJ5IHdyaXRpbmcKKyAgICB0aGUgbnVtYmVyIG9mIHBvcHBlZCBlbnRyaWVzIHRvIHRoZSBkb29yIGJlbGwuCisKKyAgICBwbm9iCS0gUG9pbnRlciB0byB0aGUgTmV0T2JqZWN0IHN0cnVjdHVyZQorICAgIG4JCS0gTnVtYmVyIG9mIGNvbXBsZXRpb24gZW50cmllcyBwcm9jZXNzZWQKKyAgICBjcV9pZAktIFF1ZXVlIElEIG9mIHRoZSBjb21wbGV0aW9uIHF1ZXVlIGZvciB3aGljaCBub3RpZmljYXRpb24KKwkJCWlzIGJlaW5nIGRvbmUuCisgICAgcmVfYXJtCS0gMSAgLSByZWFybSB0aGUgY29tcGxldGlvbiByaW5nIHRvIGdlbmVyYXRlIGFuIGV2ZW50LgorCQktIDAgIC0gZG9udCByZWFybSB0aGUgY29tcGxldGlvbiByaW5nIHRvIGdlbmVyYXRlIGFuIGV2ZW50CisqLwordm9pZCBiZV9ub3RpZnlfY21wbChzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiwgaW50IG4sIGludCBjcV9pZCwgaW50IHJlX2FybSkKK3sKKwlzdHJ1Y3QgQ1FfREJfQU1BUCBjcWRiOworCisJY3FkYi5kd1swXSA9IDA7CisJQU1BUF9TRVRfQklUU19QVFIoQ1FfREIsIHFpZCwgJmNxZGIsIGNxX2lkKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgcmVhcm0sICZjcWRiLCByZV9hcm0pOworCUFNQVBfU0VUX0JJVFNfUFRSKENRX0RCLCBudW1fcG9wcGVkLCAmY3FkYiwgbik7CisJUERfV1JJVEUoJnBub2ItPmZuX29iaiwgY3FfZGIsIGNxZGIuZHdbMF0pOworfQorCisvKgorICogYWRkcyBhZGRpdGlvbmFsIHJlY2VpdmUgZnJhZ3MgaW5kaWNhdGVkIGJ5IEJFIHN0YXJ0aW5nIGZyb20gZ2l2ZW4KKyAqIGZyYWcgaW5kZXggKGZpKSB0byBzcGVjaWZpZWQgc2tiJ3MgZnJhZyBsaXN0CisgKi8KK3N0YXRpYyB2b2lkCithZGRfc2tiX2ZyYWdzKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCSAgICAgIHUzMiBucmVzaWQsIHUzMiBmaSkKK3sKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IHBub2ItPmFkYXB0ZXI7CisJdTMyIHNrX2ZyYWdfaWR4LCBuOworCXN0cnVjdCBiZV9yeF9wYWdlX2luZm8gKnJ4X3BhZ2VfaW5mbzsKKwl1MzIgZnJhZ19zeiA9IHBub2ItPnJ4X2J1Zl9zaXplOworCisJc2tfZnJhZ19pZHggPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOworCXdoaWxlIChucmVzaWQpIHsKKwkJaW5kZXhfaW5jKCZmaSwgcG5vYi0+cnhfcV9sZW4pOworCisJCXJ4X3BhZ2VfaW5mbyA9IChzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvICopcG5vYi0+cnhfY3R4dFtmaV07CisJCXBub2ItPnJ4X2N0eHRbZmldID0gTlVMTDsKKwkJaWYgKChyeF9wYWdlX2luZm8tPnBhZ2Vfb2Zmc2V0KSB8fAorCQkgICAgKHBub2ItPnJ4X3BnX3NoYXJlZCA9PSBmYWxzZSkpIHsKKwkJCXBjaV91bm1hcF9wYWdlKGFkYXB0ZXItPnBkZXYsCisJCQkJICAgICAgIHBjaV91bm1hcF9hZGRyKHJ4X3BhZ2VfaW5mbywgYnVzKSwKKwkJCQkgICAgICAgZnJhZ19zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJfQorCisJCW4gPSBtaW4obnJlc2lkLCBmcmFnX3N6KTsKKwkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tza19mcmFnX2lkeF0ucGFnZSA9IHJ4X3BhZ2VfaW5mby0+cGFnZTsKKwkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tza19mcmFnX2lkeF0ucGFnZV9vZmZzZXQKKwkJICAgID0gcnhfcGFnZV9pbmZvLT5wYWdlX29mZnNldDsKKwkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tza19mcmFnX2lkeF0uc2l6ZSA9IG47CisKKwkJc2tfZnJhZ19pZHgrKzsKKwkJc2tiLT5sZW4gKz0gbjsKKwkJc2tiLT5kYXRhX2xlbiArPSBuOworCQlza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzKys7CisJCW5yZXNpZCAtPSBuOworCisJCW1lbXNldChyeF9wYWdlX2luZm8sIDAsIHNpemVvZihzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvKSk7CisJCWF0b21pY19kZWMoJnBub2ItPnJ4X3FfcG9zdGVkKTsKKwl9Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyBpbmNvbWluZyBuaWMgcGFja2V0cyBvdmVyIHZhcmlvdXMgUnggcXVldWVzLgorICogVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgYWRhcHRlciwgdGhlIGN1cnJlbnQgUnggc3RhdHVzIGRlc2NyaXB0b3IKKyAqIGVudHJ5IGFuZCB0aGUgUnggY29tcGxldGlvbiBxdWV1ZSBJRCBhcyBhcmd1bWVudC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgcHJvY2Vzc19uaWNfcnhfY29tcGxldGlvbihzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiwKKwkJCQkJICAgIHN0cnVjdCBFVEhfUlhfQ09NUExfQU1BUCAqcnhjcCkKK3sKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IHBub2ItPmFkYXB0ZXI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgdWRwY2tzbSwgdGNwY2tzbTsKKwlpbnQgbjsKKwl1MzIgbnJlc2lkLCBmaTsKKwl1MzIgZnJhZ19zeiA9IHBub2ItPnJ4X2J1Zl9zaXplOworCXU4ICp2YTsKKwlzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvICpyeF9wYWdlX2luZm87CisJdTMyIG51bWZyYWdzLCB2dHAsIHZ0bSwgdmxhbl90YWcsIHBrdHNpemU7CisKKwlmaSA9IEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9SWF9DT01QTCwgZnJhZ25keCwgcnhjcCk7CisJQlVHX09OKGZpID49IChpbnQpcG5vYi0+cnhfcV9sZW4pOworCUJVR19PTihmaSA8IDApOworCisJcnhfcGFnZV9pbmZvID0gKHN0cnVjdCBiZV9yeF9wYWdlX2luZm8gKilwbm9iLT5yeF9jdHh0W2ZpXTsKKwlCVUdfT04oIXJ4X3BhZ2VfaW5mby0+cGFnZSk7CisJcG5vYi0+cnhfY3R4dFtmaV0gPSBOVUxMOworCisJLyoKKwkgKiBJZiBvbmUgcGFnZSBpcyB1c2VkIHBlciBmcmFnbWVudCBvciBpZiB0aGlzIGlzIHRoZSBzZWNvbmQgaGFsZiBvZgorCSAqICBvZiB0aGUgcGFnZSwgdW5tYXAgdGhlIHBhZ2UgaGVyZQorCSAqLworCWlmICgocnhfcGFnZV9pbmZvLT5wYWdlX29mZnNldCkgfHwgKHBub2ItPnJ4X3BnX3NoYXJlZCA9PSBmYWxzZSkpIHsKKwkJcGNpX3VubWFwX3BhZ2UoYWRhcHRlci0+cGRldiwKKwkJCSAgICAgICBwY2lfdW5tYXBfYWRkcihyeF9wYWdlX2luZm8sIGJ1cyksIGZyYWdfc3osCisJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwl9CisKKwlhdG9taWNfZGVjKCZwbm9iLT5yeF9xX3Bvc3RlZCk7CisJdWRwY2tzbSA9IEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9SWF9DT01QTCwgdWRwY2tzbSwgcnhjcCk7CisJdGNwY2tzbSA9IEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9SWF9DT01QTCwgdGNwY2tzbSwgcnhjcCk7CisJcGt0c2l6ZSA9IEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9SWF9DT01QTCwgcGt0c2l6ZSwgcnhjcCk7CisJLyoKKwkgKiBnZXQgcmlkIG9mIFJYIGZsdXNoIGNvbXBsZXRpb25zIGZpcnN0LgorCSAqLworCWlmICgodGNwY2tzbSkgJiYgKHVkcGNrc20pICYmIChwa3RzaXplID09IDMyKSkgeworCQlwdXRfcGFnZShyeF9wYWdlX2luZm8tPnBhZ2UpOworCQltZW1zZXQocnhfcGFnZV9pbmZvLCAwLCBzaXplb2Yoc3RydWN0IGJlX3J4X3BhZ2VfaW5mbykpOworCQlyZXR1cm4gMDsKKwl9CisJc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihwbm9iLT5uZXRkZXYsIEJFX0hEUl9MRU4gKyBORVRfSVBfQUxJR04pOworCWlmIChza2IgPT0gTlVMTCkgeworCQlkZXZfaW5mbygmcG5vYi0+bmV0ZGV2LT5kZXYsICJhbGxvY19za2IoKSBmYWlsZWRcbiIpOworCQlwdXRfcGFnZShyeF9wYWdlX2luZm8tPnBhZ2UpOworCQltZW1zZXQocnhfcGFnZV9pbmZvLCAwLCBzaXplb2Yoc3RydWN0IGJlX3J4X3BhZ2VfaW5mbykpOworCQlnb3RvIGZyZWVfZnJhZ3M7CisJfQorCXNrYl9yZXNlcnZlKHNrYiwgTkVUX0lQX0FMSUdOKTsKKworCXNrYi0+ZGV2ID0gcG5vYi0+bmV0ZGV2OworCisJbiA9IG1pbihwa3RzaXplLCBmcmFnX3N6KTsKKworCXZhID0gcGFnZV9hZGRyZXNzKHJ4X3BhZ2VfaW5mby0+cGFnZSkgKyByeF9wYWdlX2luZm8tPnBhZ2Vfb2Zmc2V0OworCXByZWZldGNoKHZhKTsKKworCXNrYi0+bGVuID0gbjsKKwlza2ItPmRhdGFfbGVuID0gbjsKKwlpZiAobiA8PSBCRV9IRFJfTEVOKSB7CisJCW1lbWNweShza2ItPmRhdGEsIHZhLCBuKTsKKwkJcHV0X3BhZ2UocnhfcGFnZV9pbmZvLT5wYWdlKTsKKwkJc2tiLT5kYXRhX2xlbiAtPSBuOworCQlza2ItPnRhaWwgKz0gbjsKKwl9IGVsc2UgeworCisJCS8qIFNldHVwIHRoZSBTS0Igd2l0aCBwYWdlIGJ1ZmZlciBpbmZvcm1hdGlvbiAqLworCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzWzBdLnBhZ2UgPSByeF9wYWdlX2luZm8tPnBhZ2U7CisJCXNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MrKzsKKworCQkvKiBDb3B5IHRoZSBoZWFkZXIgaW50byB0aGUgc2tiX2RhdGEgKi8KKwkJbWVtY3B5KHNrYi0+ZGF0YSwgdmEsIEJFX0hEUl9MRU4pOworCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzWzBdLnBhZ2Vfb2Zmc2V0ID0KKwkJICAgIHJ4X3BhZ2VfaW5mby0+cGFnZV9vZmZzZXQgKyBCRV9IRFJfTEVOOworCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzWzBdLnNpemUgPSBuIC0gQkVfSERSX0xFTjsKKwkJc2tiLT5kYXRhX2xlbiAtPSBCRV9IRFJfTEVOOworCQlza2ItPnRhaWwgKz0gQkVfSERSX0xFTjsKKwl9CisJbWVtc2V0KHJ4X3BhZ2VfaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBiZV9yeF9wYWdlX2luZm8pKTsKKwlucmVzaWQgPSBwa3RzaXplIC0gbjsKKworCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHBub2ItPm5ldGRldik7CisKKwlpZiAoKHRjcGNrc20gfHwgdWRwY2tzbSkgJiYgYWRhcHRlci0+cnhfY3N1bSkKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwllbHNlCisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwkvKgorCSAqIGlmIHdlIGhhdmUgbW9yZSBieXRlcyBsZWZ0LCB0aGUgZnJhbWUgaGFzIGJlZW4KKwkgKiBnaXZlbiB0byB1cyBpbiBtdWx0aXBsZSBmcmFnbWVudHMuICBUaGlzIGhhcHBlbnMKKwkgKiB3aXRoIEp1bWJvIGZyYW1lcy4gQWRkIHRoZSByZW1haW5pbmcgZnJhZ21lbnRzIHRvCisJICogc2tiLT5mcmFnc1tdIGFycmF5LgorCSAqLworCWlmIChucmVzaWQpCisJCWFkZF9za2JfZnJhZ3MocG5vYiwgc2tiLCBucmVzaWQsIGZpKTsKKworCS8qIHVwZGF0ZSB0aGUgdGhlIHRydWUgc2l6ZSBvZiB0aGUgc2tiLiAqLworCXNrYi0+dHJ1ZXNpemUgPSBza2ItPmxlbiArIHNpemVvZihzdHJ1Y3Qgc2tfYnVmZik7CisKKwkvKgorCSAqIElmIGEgODAyLjMgZnJhbWUgb3IgODAyLjIgTExDIGZyYW1lCisJICogKGkuZSkgY29udGFpbnMgbGVuZ3RoIGZpZWxkIGluIE1BQyBIZHIKKwkgKiBhbmQgZnJhbWUgbGVuIGlzIGdyZWF0ZXIgdGhhbiA2NCBieXRlcworCSAqLworCWlmICgoKHNrYi0+cHJvdG9jb2wgPT0gbnRvaHMoRVRIX1BfODAyXzIpKSB8fAorCSAgICAgKHNrYi0+cHJvdG9jb2wgPT0gbnRvaHMoRVRIX1BfODAyXzMpKSkKKwkgICAgJiYgKHBrdHNpemUgPiBCRV9IRFJfTEVOKSkgeworCQkvKgorCQkgKiBJZiB0aGUgbGVuZ3RoIGdpdmVuIGluIE1hYyBIZHIgaXMgbGVzcyB0aGFuIGZyYW1lIHNpemUKKwkJICogRXJyYW5lb3VzIGZyYW1lLCBEcm9wIGl0CisJCSAqLworCQlpZiAoKG50b2hzKCoodTE2ICopICh2YSArIDEyKSkgKyBFVEhfSExFTikgPCBwa3RzaXplKSB7CisJCQkvKiBJbmNyZW1lbnQgTm9uIEV0aGVyIHR5cGUgSUkgZnJhbWVzIGRyb3BwZWQgKi8KKwkJCWFkYXB0ZXItPmJlX3N0YXQuYmVzXzgwMl8zX2Ryb3BwZWRfZnJhbWVzKys7CisKKwkJCWtmcmVlX3NrYihza2IpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJLyoKKwkJICogZWxzZSBpZiB0aGUgbGVuZ3RoIGdpdmVuIGluIE1hYyBIZHIgaXMgZ3JlYXRlciB0aGFuCisJCSAqIGZyYW1lIHNpemUsIHNob3VsZCBub3QgYmUgc2VlaW5nIHRoaXMgc29ydCBvZiBmcmFtZXMKKwkJICogZHVtcCB0aGUgcGt0IGFuZCBwYXNzIHRvIHN0YWNrCisJCSAqLworCQllbHNlIGlmICgobnRvaHMoKih1MTYgKikgKHZhICsgMTIpKSArIEVUSF9ITEVOKSA+IHBrdHNpemUpIHsKKwkJCS8qIEluY3JlbWVudCBOb24gRXRoZXIgdHlwZSBJSSBmcmFtZXMgbWFsZm9ybWVkICovCisJCQlhZGFwdGVyLT5iZV9zdGF0LmJlc184MDJfM19tYWxmb3JtZWRfZnJhbWVzKys7CisJCX0KKwl9CisKKwl2dHAgPSBBTUFQX0dFVF9CSVRTX1BUUihFVEhfUlhfQ09NUEwsIHZ0cCwgcnhjcCk7CisJdnRtID0gQU1BUF9HRVRfQklUU19QVFIoRVRIX1JYX0NPTVBMLCB2dG0sIHJ4Y3ApOworCWlmICh2dHAgJiYgdnRtKSB7CisJCS8qIFZsYW4gdGFnIHByZXNlbnQgaW4gcGt0IGFuZCBCRSBmb3VuZAorCQkgKiB0aGF0IHRoZSB0YWcgbWF0Y2hlZCBhbiBlbnRyeSBpbiBWTEFOIHRhYmxlCisJCSAqLworCQlpZiAoIXBub2ItPnZsYW5fZ3JwIHx8IHBub2ItPm51bV92bGFucyA9PSAwKSB7CisJCQkvKiBCdXQgd2UgaGF2ZSBubyBWTEFOcyBjb25maWd1cmVkLgorCQkJICogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAgRHJvcCB0aGUgcGFja2V0LgorCQkJICovCisJCQlkZXZfaW5mbygmcG5vYi0+bmV0ZGV2LT5kZXYsCisJCQkgICAgICAgIkJsYWRlRW5naW5lOiBVbmV4cGVjdGVkIHZsYW4gdGFnZ2VkIHBhY2tldFxuIik7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiAwOworCQl9CisJCS8qIHBhc3MgdGhlIFZMQU4gcGFja2V0IHRvIHN0YWNrICovCisJCXZsYW5fdGFnID0gQU1BUF9HRVRfQklUU19QVFIoRVRIX1JYX0NPTVBMLCB2bGFuX3RhZywgcnhjcCk7CisJCVZMQU5fQUNDRUxfUlgoc2tiLCBwbm9iLCBiZTE2X3RvX2NwdSh2bGFuX3RhZykpOworCisJfSBlbHNlIHsKKwkJTkVUSUZfUlgoc2tiKTsKKwl9CisJcmV0dXJuIDA7CisKK2ZyZWVfZnJhZ3M6CisJLyogZnJlZSBhbGwgZnJhZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IHJ4Y3AgKi8KKwludW1mcmFncyA9IEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9SWF9DT01QTCwgbnVtZnJhZ3MsIHJ4Y3ApOworCXdoaWxlIChudW1mcmFncy0tID4gMSkgeworCQlpbmRleF9pbmMoJmZpLCBwbm9iLT5yeF9xX2xlbik7CisKKwkJcnhfcGFnZV9pbmZvID0gKHN0cnVjdCBiZV9yeF9wYWdlX2luZm8gKikKKwkJICAgIHBub2ItPnJ4X2N0eHRbZmldOworCQlwbm9iLT5yeF9jdHh0W2ZpXSA9ICh2b2lkICopTlVMTDsKKwkJaWYgKHJ4X3BhZ2VfaW5mby0+cGFnZV9vZmZzZXQgfHwgIXBub2ItPnJ4X3BnX3NoYXJlZCkgeworCQkJcGNpX3VubWFwX3BhZ2UoYWRhcHRlci0+cGRldiwKKwkJCQkgICAgICAgcGNpX3VubWFwX2FkZHIocnhfcGFnZV9pbmZvLCBidXMpLAorCQkJCSAgICAgICBmcmFnX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQl9CisKKwkJcHV0X3BhZ2UocnhfcGFnZV9pbmZvLT5wYWdlKTsKKwkJbWVtc2V0KHJ4X3BhZ2VfaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBiZV9yeF9wYWdlX2luZm8pKTsKKwkJYXRvbWljX2RlYygmcG5vYi0+cnhfcV9wb3N0ZWQpOworCX0KKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc19uaWNfcnhfY29tcGxldGlvbl9scm8oc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IsCisJCQkJCSAgc3RydWN0IEVUSF9SWF9DT01QTF9BTUFQICpyeGNwKQoreworCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gcG5vYi0+YWRhcHRlcjsKKwlzdHJ1Y3Qgc2tiX2ZyYWdfc3RydWN0IHJ4X2ZyYWdzW0JFX01BWF9GUkFHU19QRVJfRlJBTUVdOworCXVuc2lnbmVkIGludCB1ZHBja3NtLCB0Y3Bja3NtOworCXUzMiBudW1mcmFncywgdmxhbmYsIHZ0bSwgdmxhbl90YWcsIG5yZXNpZDsKKwl1MTYgdmxhbnQ7CisJdW5zaWduZWQgaW50IGZpLCBpZHgsIG47CisJc3RydWN0IGJlX3J4X3BhZ2VfaW5mbyAqcnhfcGFnZV9pbmZvOworCXUzMiBmcmFnX3N6ID0gcG5vYi0+cnhfYnVmX3NpemUsIHBrdHNpemU7CisJYm9vbCByeF9jb2FsID0gKGFkYXB0ZXItPm1heF9yeF9jb2FsIDw9IDEpID8gMCA6IDE7CisJdTggZXJyLCAqdmE7CisJX193c3VtIGNzdW0gPSAwOworCisJaWYgKEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9SWF9DT01QTCwgaXBzZWMsIHJ4Y3ApKSB7CisJCS8qICBEcm9wIHRoZSBwa3QgYW5kIG1vdmUgdG8gdGhlIG5leHQgY29tcGxldGlvbi4gICovCisJCWFkYXB0ZXItPmJlX3N0YXQuYmVzX3J4X21pc2NfcGt0cysrOworCQlyZXR1cm47CisJfQorCWVyciA9IEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9SWF9DT01QTCwgZXJyLCByeGNwKTsKKwlpZiAoZXJyIHx8ICFyeF9jb2FsKSB7CisJCS8qIFdlIHdvbid0IGNvYWxlc2NlIFJ4IHBrdHMgaWYgdGhlIGVyciBiaXQgc2V0LgorCQkgKiB0YWtlIHRoZSBwYXRoIG9mIG5vcm1hbCBjb21wbGV0aW9uIHByb2Nlc3NpbmcgKi8KKwkJcHJvY2Vzc19uaWNfcnhfY29tcGxldGlvbihwbm9iLCByeGNwKTsKKwkJcmV0dXJuOworCX0KKworCWZpID0gQU1BUF9HRVRfQklUU19QVFIoRVRIX1JYX0NPTVBMLCBmcmFnbmR4LCByeGNwKTsKKwlCVUdfT04oZmkgPj0gKGludClwbm9iLT5yeF9xX2xlbik7CisJQlVHX09OKGZpIDwgMCk7CisJcnhfcGFnZV9pbmZvID0gKHN0cnVjdCBiZV9yeF9wYWdlX2luZm8gKilwbm9iLT5yeF9jdHh0W2ZpXTsKKwlCVUdfT04oIXJ4X3BhZ2VfaW5mby0+cGFnZSk7CisJcG5vYi0+cnhfY3R4dFtmaV0gPSAodm9pZCAqKU5VTEw7CisJLyogIElmIG9uZSBwYWdlIGlzIHVzZWQgcGVyIGZyYWdtZW50IG9yIGlmIHRoaXMgaXMgdGhlCisJICogc2Vjb25kIGhhbGYgb2YgdGhlIHBhZ2UsIHVubWFwIHRoZSBwYWdlIGhlcmUKKwkgKi8KKwlpZiAocnhfcGFnZV9pbmZvLT5wYWdlX29mZnNldCB8fCAhcG5vYi0+cnhfcGdfc2hhcmVkKSB7CisJCXBjaV91bm1hcF9wYWdlKGFkYXB0ZXItPnBkZXYsCisJCQkgICAgICAgcGNpX3VubWFwX2FkZHIocnhfcGFnZV9pbmZvLCBidXMpLAorCQkJICAgICAgIGZyYWdfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CisJfQorCisJbnVtZnJhZ3MgPSBBTUFQX0dFVF9CSVRTX1BUUihFVEhfUlhfQ09NUEwsIG51bWZyYWdzLCByeGNwKTsKKwl1ZHBja3NtID0gQU1BUF9HRVRfQklUU19QVFIoRVRIX1JYX0NPTVBMLCB1ZHBja3NtLCByeGNwKTsKKwl0Y3Bja3NtID0gQU1BUF9HRVRfQklUU19QVFIoRVRIX1JYX0NPTVBMLCB0Y3Bja3NtLCByeGNwKTsKKwl2bGFuX3RhZyA9IEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9SWF9DT01QTCwgdmxhbl90YWcsIHJ4Y3ApOworCXZsYW50ID0gYmUxNl90b19jcHUodmxhbl90YWcpOworCXZsYW5mID0gQU1BUF9HRVRfQklUU19QVFIoRVRIX1JYX0NPTVBMLCB2dHAsIHJ4Y3ApOworCXZ0bSA9IEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9SWF9DT01QTCwgdnRtLCByeGNwKTsKKwlwa3RzaXplID0gQU1BUF9HRVRfQklUU19QVFIoRVRIX1JYX0NPTVBMLCBwa3RzaXplLCByeGNwKTsKKworCWF0b21pY19kZWMoJnBub2ItPnJ4X3FfcG9zdGVkKTsKKworCWlmICh0Y3Bja3NtICYmIHVkcGNrc20gJiYgcGt0c2l6ZSA9PSAzMikgeworCQkvKiBmbHVzaCBjb21wbGV0aW9uIGVudHJpZXMgKi8KKwkJcHV0X3BhZ2UocnhfcGFnZV9pbmZvLT5wYWdlKTsKKwkJbWVtc2V0KHJ4X3BhZ2VfaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBiZV9yeF9wYWdlX2luZm8pKTsKKwkJcmV0dXJuOworCX0KKwkvKiBPbmx5IG9uZSBvZiB1ZHBja3N1bSBhbmQgdGNwY2tzdW0gY2FuIGJlIHNldCAqLworCUJVR19PTih1ZHBja3NtICYmIHRjcGNrc20pOworCisJLyoganVtYm8gZnJhbWVzIGNvdWxkIGNvbWUgaW4gbXVsdGlwbGUgZnJhZ21lbnRzICovCisJQlVHX09OKG51bWZyYWdzICE9ICgocGt0c2l6ZSArIChmcmFnX3N6IC0gMSkpIC8gZnJhZ19zeikpOworCW4gPSBtaW4ocGt0c2l6ZSwgZnJhZ19zeik7CisJbnJlc2lkID0gcGt0c2l6ZSAtIG47CS8qIHdpbGwgYmUgdXNlZnVsIGZvciBqdW1ibyBwa3RzICovCisJaWR4ID0gMDsKKworCXZhID0gcGFnZV9hZGRyZXNzKHJ4X3BhZ2VfaW5mby0+cGFnZSkgKyByeF9wYWdlX2luZm8tPnBhZ2Vfb2Zmc2V0OworCXByZWZldGNoKHZhKTsKKwlyeF9mcmFnc1tpZHhdLnBhZ2UgPSByeF9wYWdlX2luZm8tPnBhZ2U7CisJcnhfZnJhZ3NbaWR4XS5wYWdlX29mZnNldCA9IChyeF9wYWdlX2luZm8tPnBhZ2Vfb2Zmc2V0KTsKKwlyeF9mcmFnc1tpZHhdLnNpemUgPSBuOworCW1lbXNldChyeF9wYWdlX2luZm8sIDAsIHNpemVvZihzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvKSk7CisKKwkvKiBJZiB3ZSBnb3QgbXVsdGlwbGUgZnJhZ21lbnRzLCB3ZSBoYXZlIG1vcmUgZGF0YS4gKi8KKwl3aGlsZSAobnJlc2lkKSB7CisJCWlkeCsrOworCQlpbmRleF9pbmMoJmZpLCBwbm9iLT5yeF9xX2xlbik7CisKKwkJcnhfcGFnZV9pbmZvID0gKHN0cnVjdCBiZV9yeF9wYWdlX2luZm8gKilwbm9iLT5yeF9jdHh0W2ZpXTsKKwkJcG5vYi0+cnhfY3R4dFtmaV0gPSAodm9pZCAqKU5VTEw7CisJCWlmIChyeF9wYWdlX2luZm8tPnBhZ2Vfb2Zmc2V0IHx8ICFwbm9iLT5yeF9wZ19zaGFyZWQpIHsKKwkJCXBjaV91bm1hcF9wYWdlKGFkYXB0ZXItPnBkZXYsCisJCQkJICAgICAgIHBjaV91bm1hcF9hZGRyKHJ4X3BhZ2VfaW5mbywgYnVzKSwKKwkJCQkgICAgICAgZnJhZ19zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJfQorCisJCW4gPSBtaW4obnJlc2lkLCBmcmFnX3N6KTsKKwkJcnhfZnJhZ3NbaWR4XS5wYWdlID0gcnhfcGFnZV9pbmZvLT5wYWdlOworCQlyeF9mcmFnc1tpZHhdLnBhZ2Vfb2Zmc2V0ID0gKHJ4X3BhZ2VfaW5mby0+cGFnZV9vZmZzZXQpOworCQlyeF9mcmFnc1tpZHhdLnNpemUgPSBuOworCisJCW5yZXNpZCAtPSBuOworCQltZW1zZXQocnhfcGFnZV9pbmZvLCAwLCBzaXplb2Yoc3RydWN0IGJlX3J4X3BhZ2VfaW5mbykpOworCQlhdG9taWNfZGVjKCZwbm9iLT5yeF9xX3Bvc3RlZCk7CisJfQorCisJaWYgKGxpa2VseSghKHZsYW5mICYmIHZ0bSkpKSB7CisJCWxyb19yZWNlaXZlX2ZyYWdzKCZwbm9iLT5scm9fbWdyLCByeF9mcmFncywKKwkJCQkgIHBrdHNpemUsIHBrdHNpemUsCisJCQkJICAodm9pZCAqKSh1bnNpZ25lZCBsb25nKWNzdW0sIGNzdW0pOworCX0gZWxzZSB7CisJCS8qIFZsYW4gdGFnIHByZXNlbnQgaW4gcGt0IGFuZCBCRSBmb3VuZAorCQkgKiB0aGF0IHRoZSB0YWcgbWF0Y2hlZCBhbiBlbnRyeSBpbiBWTEFOIHRhYmxlCisJCSAqLworCQlpZiAodW5saWtlbHkoIXBub2ItPnZsYW5fZ3JwIHx8IHBub2ItPm51bV92bGFucyA9PSAwKSkgeworCQkJLyogQnV0IHdlIGhhdmUgbm8gVkxBTnMgY29uZmlndXJlZC4KKwkJCSAqIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gIERyb3AgdGhlIHBhY2tldC4KKwkJCSAqLworCQkJZGV2X2luZm8oJnBub2ItPm5ldGRldi0+ZGV2LAorCQkJICAgICAgICJCbGFkZUVuZ2luZTogVW5leHBlY3RlZCB2bGFuIHRhZ2dlZCBwYWNrZXRcbiIpOworCQkJcmV0dXJuOworCQl9CisJCS8qIHBhc3MgdGhlIFZMQU4gcGFja2V0IHRvIHN0YWNrICovCisJCWxyb192bGFuX2h3YWNjZWxfcmVjZWl2ZV9mcmFncygmcG5vYi0+bHJvX21nciwKKwkJCQkJICAgICAgIHJ4X2ZyYWdzLCBwa3RzaXplLCBwa3RzaXplLAorCQkJCQkgICAgICAgcG5vYi0+dmxhbl9ncnAsIHZsYW50LAorCQkJCQkgICAgICAgKHZvaWQgKikodW5zaWduZWQgbG9uZyljc3VtLAorCQkJCQkgICAgICAgY3N1bSk7CisJfQorCisJYWRhcHRlci0+YmVfc3RhdC5iZXNfcnhfY29hbCsrOworfQorCitzdHJ1Y3QgRVRIX1JYX0NPTVBMX0FNQVAgKmJlX2dldF9yeF9jbXBsKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iKQoreworCXN0cnVjdCBFVEhfUlhfQ09NUExfQU1BUCAqcnhjcCA9ICZwbm9iLT5yeF9jcVtwbm9iLT5yeF9jcV90bF07CisJdTMyIHZhbGlkLCBjdDsKKworCXZhbGlkID0gQU1BUF9HRVRfQklUU19QVFIoRVRIX1JYX0NPTVBMLCB2YWxpZCwgcnhjcCk7CisJaWYgKHZhbGlkID09IDApCisJCXJldHVybiBOVUxMOworCisJY3QgPSBBTUFQX0dFVF9CSVRTX1BUUihFVEhfUlhfQ09NUEwsIGN0LCByeGNwKTsKKwlpZiAoY3QgIT0gMCkgeworCQkvKiBJbnZhbGlkIGNodXRlICMuIHRyZWF0IGFzIGVycm9yICovCisJCUFNQVBfU0VUX0JJVFNfUFRSKEVUSF9SWF9DT01QTCwgZXJyLCByeGNwLCAxKTsKKwl9CisKKwliZV9hZHZfcnhjcV90bChwbm9iKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihFVEhfUlhfQ09NUEwsIHZhbGlkLCByeGNwLCAwKTsKKwlyZXR1cm4gcnhjcDsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX3J4X3JhdGUoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJLyogdXBkYXRlIHRoZSByYXRlIG9uY2UgaW4gdHdvIHNlY29uZHMgKi8KKwlpZiAoKGppZmZpZXMgLSBhZGFwdGVyLT5ldGhfcnhfamlmZmllcykgPiAyICogKEhaKSkgeworCQl1MzIgcjsKKwkJciA9IGFkYXB0ZXItPmV0aF9yeF9ieXRlcyAvCisJCSAgICAoKGppZmZpZXMgLSBhZGFwdGVyLT5ldGhfcnhfamlmZmllcykgLyAoSFopKTsKKwkJciA9IChyIC8gMTAwMDAwMCk7CS8qIE1CL1NlYyAqLworCisJCS8qIE1lZ2EgQml0cy9TZWMgKi8KKwkJYWRhcHRlci0+YmVfc3RhdC5iZXNfZXRoX3J4X3JhdGUgPSAociAqIDgpOworCQlhZGFwdGVyLT5ldGhfcnhfamlmZmllcyA9IGppZmZpZXM7CisJCWFkYXB0ZXItPmV0aF9yeF9ieXRlcyA9IDA7CisJfQorfQorCitzdGF0aWMgaW50IHByb2Nlc3NfcnhfY29tcGxldGlvbnMoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IsIGludCBtYXhfd29yaykKK3sKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IHBub2ItPmFkYXB0ZXI7CisJc3RydWN0IEVUSF9SWF9DT01QTF9BTUFQICpyeGNwOworCXUzMiBuYyA9IDA7CisJdW5zaWduZWQgaW50IHBrdHNpemU7CisKKwl3aGlsZSAobWF4X3dvcmsgJiYgKHJ4Y3AgPSBiZV9nZXRfcnhfY21wbChwbm9iKSkpIHsKKwkJcHJlZmV0Y2gocnhjcCk7CisJCXBrdHNpemUgPSBBTUFQX0dFVF9CSVRTX1BUUihFVEhfUlhfQ09NUEwsIHBrdHNpemUsIHJ4Y3ApOworCQlwcm9jZXNzX25pY19yeF9jb21wbGV0aW9uX2xybyhwbm9iLCByeGNwKTsKKwkJYWRhcHRlci0+ZXRoX3J4X2J5dGVzICs9IHBrdHNpemU7CisJCXVwZGF0ZV9yeF9yYXRlKGFkYXB0ZXIpOworCQluYysrOworCQltYXhfd29yay0tOworCQlhZGFwdGVyLT5iZV9zdGF0LmJlc19yeF9jb21wbCsrOworCX0KKwlpZiAobGlrZWx5KGFkYXB0ZXItPm1heF9yeF9jb2FsID4gMSkpIHsKKwkJYWRhcHRlci0+YmVfc3RhdC5iZXNfcnhfZmx1c2grKzsKKwkJbHJvX2ZsdXNoX2FsbCgmcG5vYi0+bHJvX21ncik7CisJfQorCisJLyogUmVmaWxsIHRoZSBxdWV1ZSAqLworCWlmIChhdG9taWNfcmVhZCgmcG5vYi0+cnhfcV9wb3N0ZWQpIDwgOTAwKQorCQliZV9wb3N0X2V0aF9yeF9idWZmcyhwbm9iKTsKKworCXJldHVybiBuYzsKK30KKworc3RhdGljIHN0cnVjdCBFVEhfVFhfQ09NUExfQU1BUCAqYmVfZ2V0X3R4X2NtcGwoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJc3RydWN0IEVUSF9UWF9DT01QTF9BTUFQICp0eGNwID0gJnBub2ItPnR4X2NxW3Bub2ItPnR4X2NxX3RsXTsKKwl1MzIgdmFsaWQ7CisKKwl2YWxpZCA9IEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9UWF9DT01QTCwgdmFsaWQsIHR4Y3ApOworCWlmICh2YWxpZCA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCUFNQVBfU0VUX0JJVFNfUFRSKEVUSF9UWF9DT01QTCwgdmFsaWQsIHR4Y3AsIDApOworCWJlX2Fkdl90eGNxX3RsKHBub2IpOworCXJldHVybiB0eGNwOworCit9CisKK3ZvaWQgcHJvY2Vzc19vbmVfdHhfY29tcGwoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IsIHUzMiBlbmRfaWR4KQoreworCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gcG5vYi0+YWRhcHRlcjsKKwlpbnQgY3VyX2luZGV4LCB0eF93cmJzX2NvbXBsZXRlZCA9IDA7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1NjQgYnVzYWRkciwgcGEsIHBhX2xvLCBwYV9oaTsKKwlzdHJ1Y3QgRVRIX1dSQl9BTUFQICp3cmI7CisJdTMyIGZyYWdfbGVuLCBsYXN0X2luZGV4LCBqOworCisJbGFzdF9pbmRleCA9IHR4X2NvbXBsX2xhc3R3cmJfaWR4X2dldChwbm9iKTsKKwlCVUdfT04obGFzdF9pbmRleCAhPSBlbmRfaWR4KTsKKwlwbm9iLT50eF9jdHh0W3Bub2ItPnR4X3FfdGxdID0gTlVMTDsKKwlkbyB7CisJCWN1cl9pbmRleCA9IHBub2ItPnR4X3FfdGw7CisJCXdyYiA9ICZwbm9iLT50eF9xW2N1cl9pbmRleF07CisJCXBhX2hpID0gQU1BUF9HRVRfQklUU19QVFIoRVRIX1dSQiwgZnJhZ19wYV9oaSwgd3JiKTsKKwkJcGFfbG8gPSBBTUFQX0dFVF9CSVRTX1BUUihFVEhfV1JCLCBmcmFnX3BhX2xvLCB3cmIpOworCQlmcmFnX2xlbiA9IEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9XUkIsIGZyYWdfbGVuLCB3cmIpOworCQlidXNhZGRyID0gKHBhX2hpIDw8IDMyKSB8IHBhX2xvOworCQlpZiAoYnVzYWRkciAhPSAwKSB7CisJCQlwYSA9IGxlNjRfdG9fY3B1KGJ1c2FkZHIpOworCQkJcGNpX3VubWFwX3NpbmdsZShhZGFwdGVyLT5wZGV2LCBwYSwKKwkJCQkJIGZyYWdfbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJfQorCQlpZiAoY3VyX2luZGV4ID09IGxhc3RfaW5kZXgpIHsKKwkJCXNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKXBub2ItPnR4X2N0eHRbY3VyX2luZGV4XTsKKwkJCUJVR19PTighc2tiKTsKKwkJCWZvciAoaiA9IDA7IGogPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBqKyspIHsKKwkJCQlzdHJ1Y3Qgc2tiX2ZyYWdfc3RydWN0ICpmcmFnOworCQkJCWZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tqXTsKKwkJCQlwY2lfdW5tYXBfcGFnZShhZGFwdGVyLT5wZGV2LAorCQkJCQkgICAgICAgKHVsb25nKSBmcmFnLT5wYWdlLCBmcmFnLT5zaXplLAorCQkJCQkgICAgICAgUENJX0RNQV9UT0RFVklDRSk7CisJCQl9CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXBub2ItPnR4X2N0eHRbY3VyX2luZGV4XSA9IE5VTEw7CisJCX0gZWxzZSB7CisJCQlCVUdfT04ocG5vYi0+dHhfY3R4dFtjdXJfaW5kZXhdKTsKKwkJfQorCQl0eF93cmJzX2NvbXBsZXRlZCsrOworCQliZV9hZHZfdHhxX3RsKHBub2IpOworCX0gd2hpbGUgKGN1cl9pbmRleCAhPSBsYXN0X2luZGV4KTsKKwlhdG9taWNfc3ViKHR4X3dyYnNfY29tcGxldGVkLCAmcG5vYi0+dHhfcV91c2VkKTsKK30KKworLyogdGhlcmUgaXMgbm8gbmVlZCB0byB0YWtlIGFuIFNNUCBsb2NrIGhlcmUgc2luY2UgY3VycmVudGx5CisgKiB3ZSBoYXZlIG9ubHkgb25lIGluc3RhbmNlIG9mIHRoZSB0YXNrbGV0IHRoYXQgZG9lcyBjb21wbGV0aW9uCisgKiBwcm9jZXNzaW5nLgorICovCitzdGF0aWMgdm9pZCBwcm9jZXNzX25pY190eF9jb21wbGV0aW9ucyhzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYikKK3sKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IHBub2ItPmFkYXB0ZXI7CisJc3RydWN0IEVUSF9UWF9DT01QTF9BTUFQICp0eGNwOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwbm9iLT5uZXRkZXY7CisJdTMyIGVuZF9pZHgsIG51bV9wcm9jZXNzZWQgPSAwOworCisJYWRhcHRlci0+YmVfc3RhdC5iZXNfdHhfZXZlbnRzKys7CisKKwl3aGlsZSAoKHR4Y3AgPSBiZV9nZXRfdHhfY21wbChwbm9iKSkpIHsKKwkJZW5kX2lkeCA9IEFNQVBfR0VUX0JJVFNfUFRSKEVUSF9UWF9DT01QTCwgd3JiX2luZGV4LCB0eGNwKTsKKwkJcHJvY2Vzc19vbmVfdHhfY29tcGwocG5vYiwgZW5kX2lkeCk7CisJCW51bV9wcm9jZXNzZWQrKzsKKwkJYWRhcHRlci0+YmVfc3RhdC5iZXNfdHhfY29tcGwrKzsKKwl9CisJYmVfbm90aWZ5X2NtcGwocG5vYiwgbnVtX3Byb2Nlc3NlZCwgcG5vYi0+dHhfY3FfaWQsIDEpOworCS8qCisJICogV2UgZ290IFR4IGNvbXBsZXRpb25zIGFuZCBoYXZlIHVzYWJsZSBXUkJzLgorCSAqIElmIHRoZSBuZXRkZXYncyBxdWV1ZSBoYXMgYmVlbiBzdG9wcGVkCisJICogYmVjYXVzZSB3ZSBoYWQgcnVuIG91dCBvZiBXUkJzLCB3YWtlIGl0IG5vdy4KKwkgKi8KKwlzcGluX2xvY2soJmFkYXB0ZXItPnR4cV9sb2NrKTsKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChuZXRkZXYpCisJICAgICYmIGF0b21pY19yZWFkKCZwbm9iLT50eF9xX3VzZWQpIDwgcG5vYi0+dHhfcV9sZW4gLyAyKSB7CisJCW5ldGlmX3dha2VfcXVldWUobmV0ZGV2KTsKKwl9CisJc3Bpbl91bmxvY2soJmFkYXB0ZXItPnR4cV9sb2NrKTsKK30KKworc3RhdGljIHUzMiBwb3N0X3J4X2J1ZmZzKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iLCBzdHJ1Y3QgbGlzdF9oZWFkICpyeGJsKQoreworCXUzMiBucG9zdGVkID0gMDsKKwlzdHJ1Y3QgRVRIX1JYX0RfQU1BUCAqcnhkID0gTlVMTDsKKwlzdHJ1Y3QgYmVfcmVjdl9idWZmZXIgKnJ4YnA7CisJdm9pZCAqKnJ4X2N0eHA7CisJc3RydWN0IFJRX0RCX0FNQVAgcnFkYjsKKworCXJ4X2N0eHAgPSBwbm9iLT5yeF9jdHh0OworCisJd2hpbGUgKCFsaXN0X2VtcHR5KHJ4YmwpICYmCisJICAgICAgIChyeF9jdHhwW3Bub2ItPnJ4X3FfaGRdID09IE5VTEwpICYmIG5wb3N0ZWQgPCAyNTUpIHsKKworCQlyeGJwID0gbGlzdF9maXJzdF9lbnRyeShyeGJsLCBzdHJ1Y3QgYmVfcmVjdl9idWZmZXIsIHJ4Yl9saXN0KTsKKwkJbGlzdF9kZWwoJnJ4YnAtPnJ4Yl9saXN0KTsKKwkJcnhkID0gcG5vYi0+cnhfcSArIHBub2ItPnJ4X3FfaGQ7CisJCUFNQVBfU0VUX0JJVFNfUFRSKEVUSF9SWF9ELCBmcmFncGFfbG8sIHJ4ZCwgcnhicC0+cnhiX3BhX2xvKTsKKwkJQU1BUF9TRVRfQklUU19QVFIoRVRIX1JYX0QsIGZyYWdwYV9oaSwgcnhkLCByeGJwLT5yeGJfcGFfaGkpOworCisJCXJ4X2N0eHBbcG5vYi0+cnhfcV9oZF0gPSByeGJwLT5yeGJfY3R4dDsKKwkJYmVfYWR2X3J4cV9oZChwbm9iKTsKKwkJbnBvc3RlZCsrOworCX0KKworCWlmIChucG9zdGVkKSB7CisJCS8qIE5vdyBwcmVzcyB0aGUgZG9vciBiZWxsIHRvIG5vdGlmeSBCbGFkZUVuZ2luZS4gKi8KKwkJcnFkYi5kd1swXSA9IDA7CisJCUFNQVBfU0VUX0JJVFNfUFRSKFJRX0RCLCBudW1Qb3N0ZWQsICZycWRiLCBucG9zdGVkKTsKKwkJQU1BUF9TRVRfQklUU19QVFIoUlFfREIsIHJxLCAmcnFkYiwgcG5vYi0+cnhfcV9pZCk7CisJCVBEX1dSSVRFKCZwbm9iLT5mbl9vYmosIGVyeF9ycV9kYiwgcnFkYi5kd1swXSk7CisJfQorCWF0b21pY19hZGQobnBvc3RlZCwgJnBub2ItPnJ4X3FfcG9zdGVkKTsKKwlyZXR1cm4gbnBvc3RlZDsKK30KKwordm9pZCBiZV9wb3N0X2V0aF9yeF9idWZmcyhzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYikKK3sKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IHBub2ItPmFkYXB0ZXI7CisJdTMyIG51bV9idWZzLCByOworCXU2NCBidXNhZGRyID0gMCwgdG1wX3BhOworCXUzMiBtYXhfYnVmcywgcGdfaGQ7CisJdTMyIGZyYWdfc2l6ZTsKKwlzdHJ1Y3QgYmVfcmVjdl9idWZmZXIgKnJ4YnA7CisJc3RydWN0IGxpc3RfaGVhZCByeGJsOworCXN0cnVjdCBiZV9yeF9wYWdlX2luZm8gKnJ4X3BhZ2VfaW5mbzsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7CisJdTMyIHBhZ2Vfb3JkZXIgPSAwOworCWdmcF90IGFsbG9jX2ZsYWdzID0gR0ZQX0FUT01JQzsKKworCUJVR19PTighYWRhcHRlcik7CisKKwltYXhfYnVmcyA9IDY0OwkJLyogc2hvdWxkIGJlIGV2ZW4gIyA8PSAyNTUuICovCisKKwlmcmFnX3NpemUgPSBwbm9iLT5yeF9idWZfc2l6ZTsKKwlwYWdlX29yZGVyID0gZ2V0X29yZGVyKGZyYWdfc2l6ZSk7CisKKwlpZiAoZnJhZ19zaXplID09IDgxOTIpCisJCWFsbG9jX2ZsYWdzIHw9IChnZnBfdCkgX19HRlBfQ09NUDsKKwkvKgorCSAqIEZvcm0gYSBsaW5rZWQgbGlzdCBvZiBSRUNWX0JVRkZGRVIgc3RydWN0dXJlIHRvIGJlIGJlIHBvc3RlZC4KKwkgKiBXZSB3aWxsIHBvc3QgZXZlbiBudW1iZXIgb2YgYnVmZmVyIHNvIHRoYXQgcGFnZXMgY2FuIGJlCisJICogc2hhcmVkLgorCSAqLworCUlOSVRfTElTVF9IRUFEKCZyeGJsKTsKKworCWZvciAobnVtX2J1ZnMgPSAwOyBudW1fYnVmcyA8IG1heF9idWZzICYmCisJCSFwbm9iLT5yeF9wYWdlX2luZm9bcG5vYi0+cnhfcGdfaW5mb19oZF0ucGFnZTsgKytudW1fYnVmcykgeworCisJCXJ4YnAgPSAmcG5vYi0+ZXRoX3J4X2J1ZnNbbnVtX2J1ZnNdOworCQlwZ19oZCA9IHBub2ItPnJ4X3BnX2luZm9faGQ7CisJCXJ4X3BhZ2VfaW5mbyA9ICZwbm9iLT5yeF9wYWdlX2luZm9bcGdfaGRdOworCisJCWlmICghcGFnZSkgeworCQkJcGFnZSA9IGFsbG9jX3BhZ2VzKGFsbG9jX2ZsYWdzLCBwYWdlX29yZGVyKTsKKwkJCWlmICh1bmxpa2VseShwYWdlID09IE5VTEwpKSB7CisJCQkJYWRhcHRlci0+YmVfc3RhdC5iZXNfZXRocnhfcG9zdF9mYWlsKys7CisJCQkJcG5vYi0+cnhidWZfcG9zdF9mYWlsKys7CisJCQkJYnJlYWs7CisJCQl9CisJCQlwbm9iLT5yeGJ1Zl9wb3N0X2ZhaWwgPSAwOworCQkJYnVzYWRkciA9IHBjaV9tYXBfcGFnZShhZGFwdGVyLT5wZGV2LCBwYWdlLCAwLAorCQkJCQkgICAgICAgZnJhZ19zaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJcnhfcGFnZV9pbmZvLT5wYWdlX29mZnNldCA9IDA7CisJCQlyeF9wYWdlX2luZm8tPnBhZ2UgPSBwYWdlOworCQkJLyoKKwkJCSAqIElmIHdlIGFyZSBzaGFyaW5nIGEgcGFnZSBhbW9uZyB0d28gc2ticywKKwkJCSAqIGFsbG9jIGEgbmV3IG9uZSBvbiB0aGUgbmV4dCBpdGVyYXRpb24KKwkJCSAqLworCQkJaWYgKHBub2ItPnJ4X3BnX3NoYXJlZCA9PSBmYWxzZSkKKwkJCQlwYWdlID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCWdldF9wYWdlKHBhZ2UpOworCQkJcnhfcGFnZV9pbmZvLT5wYWdlX29mZnNldCArPSBmcmFnX3NpemU7CisJCQlyeF9wYWdlX2luZm8tPnBhZ2UgPSBwYWdlOworCQkJLyoKKwkJCSAqIFdlIGFyZSBmaW5pc2hlZCB3aXRoIHRoZSBhbGxvY2VkIHBhZ2UsCisJCQkgKiBBbGxvYyBhIG5ldyBvbmUgb24gdGhlIG5leHQgaXRlcmF0aW9uCisJCQkgKi8KKwkJCXBhZ2UgPSBOVUxMOworCQl9CisJCXJ4YnAtPnJ4Yl9jdHh0ID0gKHZvaWQgKilyeF9wYWdlX2luZm87CisJCWluZGV4X2luYygmcG5vYi0+cnhfcGdfaW5mb19oZCwgcG5vYi0+cnhfcV9sZW4pOworCisJCXBjaV91bm1hcF9hZGRyX3NldChyeF9wYWdlX2luZm8sIGJ1cywgYnVzYWRkcik7CisJCXRtcF9wYSA9IGJ1c2FkZHIgKyByeF9wYWdlX2luZm8tPnBhZ2Vfb2Zmc2V0OworCQlyeGJwLT5yeGJfcGFfbG8gPSAodG1wX3BhICYgMHhGRkZGRkZGRik7CisJCXJ4YnAtPnJ4Yl9wYV9oaSA9ICh0bXBfcGEgPj4gMzIpOworCQlyeGJwLT5yeGJfbGVuID0gZnJhZ19zaXplOworCQlsaXN0X2FkZF90YWlsKCZyeGJwLT5yeGJfbGlzdCwgJnJ4YmwpOworCX0JCQkvKiBFbmQgb2YgZm9yICovCisKKwlyID0gcG9zdF9yeF9idWZmcyhwbm9iLCAmcnhibCk7CisJQlVHX09OKHIgIT0gbnVtX2J1ZnMpOworCXJldHVybjsKK30KKworLyoKKyAqIEludGVycnVwdCBzZXJ2aWNlIGZvciBuZXR3b3JrIGZ1bmN0aW9uLiAgV2UganVzdCBzY2hlZHVsZSB0aGUKKyAqIHRhc2tsZXQgd2hpY2ggZG9lcyBhbGwgY29tcGxldGlvbiBwcm9jZXNzaW5nLgorICovCitpcnFyZXR1cm5fdCBiZV9pbnQoaW50IGlycSwgdm9pZCAqZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBkZXY7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gcG5vYi0+YWRhcHRlcjsKKwl1MzIgaXNyOworCisJaXNyID0gQ1NSX1JFQUQoJnBub2ItPmZuX29iaiwgY2V2LmlzcjEpOworCWlmICh1bmxpa2VseSghaXNyKSkKKwkJcmV0dXJuIElSUV9OT05FOworCisJc3Bpbl9sb2NrKCZhZGFwdGVyLT5pbnRfbG9jayk7CisJYWRhcHRlci0+aXNyIHw9IGlzcjsKKwlzcGluX3VubG9jaygmYWRhcHRlci0+aW50X2xvY2spOworCisJYWRhcHRlci0+YmVfc3RhdC5iZXNfaW50cysrOworCisJdGFza2xldF9zY2hlZHVsZSgmYWRhcHRlci0+c3RzX2hhbmRsZXIpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoKKyAqIFBvbGwgZnVuY3Rpb24gY2FsbGVkIGJ5IE5BUEkgd2l0aCBhIHdvcmsgYnVkZ2V0LgorICogV2UgcHJvY2VzcyBhcyBtYW55IFVDLiBCQyBhbmQgTUMgcmVjZWl2ZSBjb21wbGV0aW9ucworICogYXMgdGhlIGJ1ZGdldCBhbGxvd3MgYW5kIHJldHVybiB0aGUgYWN0dWFsIG51bWJlciBvZgorICogUlggc3RzdHV0c2VzIHByb2Nlc3NlZC4KKyAqLworaW50IGJlX3BvbGwoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgYnVkZ2V0KQoreworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0KKwkJCWNvbnRhaW5lcl9vZihuYXBpLCBzdHJ1Y3QgYmVfbmV0X29iamVjdCwgbmFwaSk7CisJdTMyIHdvcmtfZG9uZTsKKworCXBub2ItPmFkYXB0ZXItPmJlX3N0YXQuYmVzX3BvbGxzKys7CisJd29ya19kb25lID0gcHJvY2Vzc19yeF9jb21wbGV0aW9ucyhwbm9iLCBidWRnZXQpOworCUJVR19PTih3b3JrX2RvbmUgPiBidWRnZXQpOworCisJLyogQWxsIGNvbnN1bWVkICovCisJaWYgKHdvcmtfZG9uZSA8IGJ1ZGdldCkgeworCQluZXRpZl9yeF9jb21wbGV0ZShuYXBpKTsKKwkJLyogZW5hYmxlIGludHIgKi8KKwkJYmVfbm90aWZ5X2NtcGwocG5vYiwgd29ya19kb25lLCBwbm9iLT5yeF9jcV9pZCwgMSk7CisJfSBlbHNlIHsKKwkJLyogTW9yZSB0byBiZSBjb25zdW1lZDsgY29udGludWUgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkICovCisJCWJlX25vdGlmeV9jbXBsKHBub2IsIHdvcmtfZG9uZSwgcG5vYi0+cnhfY3FfaWQsIDApOworCX0KKwlyZXR1cm4gd29ya19kb25lOworfQorCitzdGF0aWMgc3RydWN0IEVRX0VOVFJZX0FNQVAgKmdldF9ldmVudChzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYikKK3sKKwlzdHJ1Y3QgRVFfRU5UUllfQU1BUCAqZXFwID0gJihwbm9iLT5ldmVudF9xW3Bub2ItPmV2ZW50X3FfdGxdKTsKKwlpZiAoIUFNQVBfR0VUX0JJVFNfUFRSKEVRX0VOVFJZLCBWYWxpZCwgZXFwKSkKKwkJcmV0dXJuIE5VTEw7CisJYmVfYWR2X2VxX3RsKHBub2IpOworCXJldHVybiBlcXA7Cit9CisKKy8qCisgKiBQcm9jZXNzZXMgYWxsIHZhbGlkIGV2ZW50cyBpbiB0aGUgZXZlbnQgcmluZyBhc3NvY2lhdGVkIHdpdGggZ2l2ZW4KKyAqIE5ldE9iamVjdC4gIEFsc28sIG5vdGlmaWVzIEJFIHRoZSBudW1iZXIgb2YgZXZlbnRzIHByb2Nlc3NlZC4KKyAqLworc3RhdGljIGlubGluZSB1MzIgcHJvY2Vzc19ldmVudHMoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwbm9iLT5hZGFwdGVyOworCXN0cnVjdCBFUV9FTlRSWV9BTUFQICplcXA7CisJdTMyIHJpZCwgbnVtX2V2ZW50cyA9IDA7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBub2ItPm5ldGRldjsKKworCXdoaWxlICgoZXFwID0gZ2V0X2V2ZW50KHBub2IpKSAhPSBOVUxMKSB7CisJCWFkYXB0ZXItPmJlX3N0YXQuYmVzX2V2ZW50cysrOworCQlyaWQgPSBBTUFQX0dFVF9CSVRTX1BUUihFUV9FTlRSWSwgUmVzb3VyY2VJRCwgZXFwKTsKKwkJaWYgKHJpZCA9PSBwbm9iLT5yeF9jcV9pZCkgeworCQkJYWRhcHRlci0+YmVfc3RhdC5iZXNfcnhfZXZlbnRzKys7CisJCQluZXRpZl9yeF9zY2hlZHVsZSgmcG5vYi0+bmFwaSk7CisJCX0gZWxzZSBpZiAocmlkID09IHBub2ItPnR4X2NxX2lkKSB7CisJCQlwcm9jZXNzX25pY190eF9jb21wbGV0aW9ucyhwbm9iKTsKKwkJfSBlbHNlIGlmIChyaWQgPT0gcG5vYi0+bWNjX2NxX2lkKSB7CisJCQliZV9tY2NfcHJvY2Vzc19jcSgmcG5vYi0+bWNjX3Ffb2JqLCAxKTsKKwkJfSBlbHNlIHsKKwkJCWRldl9pbmZvKCZuZXRkZXYtPmRldiwKKwkJCQkJIkludmFsaWQgRVEgUmVzb3VyY2VJRCAlZFxuIiwgcmlkKTsKKwkJfQorCQlBTUFQX1NFVF9CSVRTX1BUUihFUV9FTlRSWSwgVmFsaWQsIGVxcCwgMCk7CisJCUFNQVBfU0VUX0JJVFNfUFRSKEVRX0VOVFJZLCBSZXNvdXJjZUlELCBlcXAsIDApOworCQludW1fZXZlbnRzKys7CisJfQorCXJldHVybiBudW1fZXZlbnRzOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfZXFkKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYikKK3sKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBiZV9lcV9vYmplY3QgKmVxX29iamVjdHA7CisKKwkvKiB1cGRhdGUgb25jZSBhIHNlY29uZCAqLworCWlmICgoamlmZmllcyAtIGFkYXB0ZXItPmlwc19qaWZmaWVzKSA+IDEgKiAoSFopKSB7CisJCS8qIE9uZSBzZWNvbmQgZWxhcHNlZCBzaW5jZSBsYXN0IHVwZGF0ZSAgKi8KKwkJdTMyIHIsIG5ld19lcWQgPSAtMTsKKwkJciA9IGFkYXB0ZXItPmJlX3N0YXQuYmVzX2ludHMgLSBhZGFwdGVyLT5iZV9zdGF0LmJlc19wcmV2X2ludHM7CisJCXIgPSByIC8gKChqaWZmaWVzIC0gYWRhcHRlci0+aXBzX2ppZmZpZXMpIC8gKEhaKSk7CisJCWFkYXB0ZXItPmJlX3N0YXQuYmVzX2lwcyA9IHI7CisJCWFkYXB0ZXItPmlwc19qaWZmaWVzID0gamlmZmllczsKKwkJYWRhcHRlci0+YmVfc3RhdC5iZXNfcHJldl9pbnRzID0gYWRhcHRlci0+YmVfc3RhdC5iZXNfaW50czsKKwkJaWYgKHIgPiBJUFNfSElfV00gJiYgYWRhcHRlci0+Y3VyX2VxZCA8IGFkYXB0ZXItPm1heF9lcWQpCisJCQluZXdfZXFkID0gKGFkYXB0ZXItPmN1cl9lcWQgKyA4KTsKKwkJaWYgKHIgPCBJUFNfTE9fV00gJiYgYWRhcHRlci0+Y3VyX2VxZCA+IGFkYXB0ZXItPm1pbl9lcWQpCisJCQluZXdfZXFkID0gKGFkYXB0ZXItPmN1cl9lcWQgLSA4KTsKKwkJaWYgKGFkYXB0ZXItPmVuYWJsZV9haWMgJiYgbmV3X2VxZCAhPSAtMSkgeworCQkJZXFfb2JqZWN0cCA9ICZwbm9iLT5ldmVudF9xX29iajsKKwkJCXN0YXR1cyA9IGJlX2VxX21vZGlmeV9kZWxheSgmcG5vYi0+Zm5fb2JqLCAxLAorCQkJCQkJICAgICZlcV9vYmplY3RwLCAmbmV3X2VxZCwgTlVMTCwKKwkJCQkJCSAgICBOVUxMLCBOVUxMKTsKKwkJCWlmIChzdGF0dXMgPT0gQkVfU1VDQ0VTUykKKwkJCQlhZGFwdGVyLT5jdXJfZXFkID0gbmV3X2VxZDsKKwkJfQorCX0KK30KKworLyoKKyAgICBUaGlzIGZ1bmN0aW9uIG5vdGlmaWVzIEJsYWRlRW5naW5lIG9mIGhvdyBtYW55IGV2ZW50cyB3ZXJlIHByb2Nlc3NlZAorICAgIGZyb20gdGhlIGV2ZW50IHF1ZXVlIGJ5IHJpbmdpbmcgdGhlIGNvcnJlc3BvbmRpbmcgZG9vciBiZWxsIGFuZAorICAgIG9wdGlvbmFsbHkgcmUtYXJtcyB0aGUgZXZlbnQgcXVldWUuCisgICAgbgkJLSBudW1iZXIgb2YgZXZlbnRzIHByb2Nlc3NlZAorICAgIHJlX2FybQktIDEgLSByZS1hcm0gdGhlIEVRLCAwIC0gZG8gbm90IHJlLWFybSB0aGUgRVEKKworKi8KK3N0YXRpYyB2b2lkIGJlX25vdGlmeV9ldmVudChzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiwgaW50IG4sIGludCByZV9hcm0pCit7CisJc3RydWN0IENRX0RCX0FNQVAgZXFkYjsKKwllcWRiLmR3WzBdID0gMDsKKworCUFNQVBfU0VUX0JJVFNfUFRSKENRX0RCLCBxaWQsICZlcWRiLCBwbm9iLT5ldmVudF9xX2lkKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgcmVhcm0sICZlcWRiLCByZV9hcm0pOworCUFNQVBfU0VUX0JJVFNfUFRSKENRX0RCLCBldmVudCwgJmVxZGIsIDEpOworCUFNQVBfU0VUX0JJVFNfUFRSKENRX0RCLCBudW1fcG9wcGVkLCAmZXFkYiwgbik7CisJLyoKKwkgKiBVbmRlciBzb21lIHNpdHVhdGlvbnMgd2Ugc2VlIGFuIGludGVycnVwdCBhbmQgbm8gdmFsaWQKKwkgKiBFUSBlbnRyeS4gIFRvIGtlZXAgZ29pbmcsIHdlIG5lZWQgdG8gcmluZyB0aGUgREIgZXZlbiBpZgorCSAqIG51bVBPc3RlZCBpcyAwLgorCSAqLworCVBEX1dSSVRFKCZwbm9iLT5mbl9vYmosIGNxX2RiLCBlcWRiLmR3WzBdKTsKKwlyZXR1cm47Cit9CisKKy8qCisgKiBDYWxsZWQgZnJvbSB0aGUgdGFza2xldCBzY2hlZHVsZWQgYnkgSVNSLiAgQWxsIHJlYWwgaW50ZXJydXB0IHByb2Nlc3NpbmcKKyAqIGlzIGRvbmUgaGVyZS4KKyAqLwordm9pZCBiZV9wcm9jZXNzX2ludHIodW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBiZV9hZGFwdGVyICopY29udGV4dDsKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiA9IGFkYXB0ZXItPm5ldF9vYmo7CisJdTMyIGlzciwgbjsKKwl1bG9uZyBmbGFncyA9IDA7CisKKwlpc3IgPSBhZGFwdGVyLT5pc3I7CisKKwkvKgorCSAqIHdlIGNyZWF0ZSBvbmx5IG9uZSBOSUMgZXZlbnQgcXVldWUgaW4gTGludXguIEV2ZW50IGlzCisJICogZXhwZWN0ZWQgb25seSBpbiB0aGUgZmlyc3QgZXZlbnQgcXVldWUKKwkgKi8KKwlCVUdfT04oaXNyICYgMHhmZmZmZmZmZSk7CisJaWYgKChpc3IgJiAxKSA9PSAwKQorCQlyZXR1cm47CQkvKiBub3Qgb3VyIGludGVycnVwdCAqLworCW4gPSBwcm9jZXNzX2V2ZW50cyhwbm9iKTsKKwkvKgorCSAqIENsZWFyIHRoZSBldmVudCBiaXQuIGFkYXB0ZXItPmlzciBpcyAgc2V0IGJ5CisJICogaGFyZCBpbnRlcnJ1cHQuICBQcmV2ZW50IHJhY2Ugd2l0aCBsb2NrLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5pbnRfbG9jaywgZmxhZ3MpOworCWFkYXB0ZXItPmlzciAmPSB+MTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5pbnRfbG9jaywgZmxhZ3MpOworCWJlX25vdGlmeV9ldmVudChwbm9iLCBuLCAxKTsKKwkvKgorCSAqIElmIHByZXZpb3VzIGFsbG9jYXRpb24gYXR0ZW1wdHMgaGFkIGZhaWxlZCBhbmQKKwkgKiBCRSBoYXMgdXNlZCB1cCBhbGwgcG9zdGVkIGJ1ZmZlcnMsIHBvc3QgUlggYnVmZmVycyBoZXJlCisJICovCisJaWYgKHBub2ItPnJ4YnVmX3Bvc3RfZmFpbCAmJiBhdG9taWNfcmVhZCgmcG5vYi0+cnhfcV9wb3N0ZWQpID09IDApCisJCWJlX3Bvc3RfZXRoX3J4X2J1ZmZzKHBub2IpOworCXVwZGF0ZV9lcWQoYWRhcHRlciwgcG5vYik7CisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2JlX25ldGlmLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvYmVfbmV0aWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjhkYWY2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2JlX25ldGlmLmMKQEAgLTAsMCArMSw3MDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKy8qCisgKiBiZV9uZXRpZi5jCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHZhcmlvdXMgZW50cnkgcG9pbnRzIG9mIGRyaXZlcnMgc2VlbiBieSB0Y3AvaXAgc3RhY2suCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgImJlbmV0LmgiCisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0X2xyby5oPgorCisvKiBTdHJpbmdzIHRvIHByaW50IExpbmsgcHJvcGVydGllcyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmxpbmtfc3BlZWRbXSA9IHsKKwkiSW52YWxpZCBsaW5rIFNwZWVkIFZhbHVlIiwKKwkiMTAgTWJwcyIsCisJIjEwMCBNYnBzIiwKKwkiMSBHYnBzIiwKKwkiMTAgR2JwcyIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpsaW5rX2R1cGxleFtdID0geworCSJJbnZhbGlkIER1cGxleCBWYWx1ZSIsCisJIkhhbGYgRHVwbGV4IiwKKwkiRnVsbCBEdXBsZXgiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqbGlua19zdGF0ZVtdID0geworCSIiLAorCSIoYWN0aXZlKSIKK307CisKK3ZvaWQgYmVfcHJpbnRfbGlua19pbmZvKHN0cnVjdCBCRV9MSU5LX1NUQVRVUyAqbG5rX3N0YXR1cykKK3sKKwl1MTYgc2ksIGRpLCBhaTsKKworCS8qIFBvcnQgMCAqLworCWlmIChsbmtfc3RhdHVzLT5tYWMwX3NwZWVkICYmIGxua19zdGF0dXMtPm1hYzBfZHVwbGV4KSB7CisJCS8qIFBvcnQgaXMgdXAgYW5kIHJ1bm5pbmcgKi8KKwkJc2kgPSAobG5rX3N0YXR1cy0+bWFjMF9zcGVlZCA8IDUpID8gbG5rX3N0YXR1cy0+bWFjMF9zcGVlZCA6IDA7CisJCWRpID0gKGxua19zdGF0dXMtPm1hYzBfZHVwbGV4IDwgMykgPworCQkgICAgbG5rX3N0YXR1cy0+bWFjMF9kdXBsZXggOiAwOworCQlhaSA9IChsbmtfc3RhdHVzLT5hY3RpdmVfcG9ydCA9PSAwKSA/IDEgOiAwOworCQlwcmludGsoS0VSTl9JTkZPICJQb3J0Tm8uIDA6IFNwZWVkIC0gJXMgJXMgJXNcbiIsCisJCSAgICAgICBsaW5rX3NwZWVkW3NpXSwgbGlua19kdXBsZXhbZGldLCBsaW5rX3N0YXRlW2FpXSk7CisJfSBlbHNlCisJCXByaW50ayhLRVJOX0lORk8gIlBvcnROby4gMDogRG93blxuIik7CisKKwkvKiBQb3J0IDEgKi8KKwlpZiAobG5rX3N0YXR1cy0+bWFjMV9zcGVlZCAmJiBsbmtfc3RhdHVzLT5tYWMxX2R1cGxleCkgeworCQkvKiBQb3J0IGlzIHVwIGFuZCBydW5uaW5nICovCisJCXNpID0gKGxua19zdGF0dXMtPm1hYzFfc3BlZWQgPCA1KSA/IGxua19zdGF0dXMtPm1hYzFfc3BlZWQgOiAwOworCQlkaSA9IChsbmtfc3RhdHVzLT5tYWMxX2R1cGxleCA8IDMpID8KKwkJICAgIGxua19zdGF0dXMtPm1hYzFfZHVwbGV4IDogMDsKKwkJYWkgPSAobG5rX3N0YXR1cy0+YWN0aXZlX3BvcnQgPT0gMCkgPyAxIDogMDsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUG9ydE5vLiAxOiBTcGVlZCAtICVzICVzICVzXG4iLAorCQkgICAgICAgbGlua19zcGVlZFtzaV0sIGxpbmtfZHVwbGV4W2RpXSwgbGlua19zdGF0ZVthaV0pOworCX0gZWxzZQorCQlwcmludGsoS0VSTl9JTkZPICJQb3J0Tm8uIDE6IERvd25cbiIpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgaW50CitiZV9nZXRfZnJhZ19oZWFkZXIoc3RydWN0IHNrYl9mcmFnX3N0cnVjdCAqZnJhZywgdm9pZCAqKm1hY19oZHIsCisJCSAgIHZvaWQgKippcF9oZHIsIHZvaWQgKip0Y3B1ZHBfaGRyLAorCQkgICB1NjQgKmhkcl9mbGFncywgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgZXRoaGRyICplaDsKKwlzdHJ1Y3Qgdmxhbl9ldGhoZHIgKnZlaDsKKwlzdHJ1Y3QgaXBoZHIgKmlwaDsKKwl1OCAqdmEgPSBwYWdlX2FkZHJlc3MoZnJhZy0+cGFnZSkgKyBmcmFnLT5wYWdlX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIGxsX2hsZW47CisKKwkvKiBmaW5kIHRoZSBtYWMgaGVhZGVyLCBhYm9ydCBpZiBub3QgSVB2NCAqLworCisJcHJlZmV0Y2godmEpOworCWVoID0gKHN0cnVjdCBldGhoZHIgKil2YTsKKwkqbWFjX2hkciA9IGVoOworCWxsX2hsZW4gPSBFVEhfSExFTjsKKwlpZiAoZWgtPmhfcHJvdG8gIT0gaHRvbnMoRVRIX1BfSVApKSB7CisJCWlmIChlaC0+aF9wcm90byA9PSBodG9ucyhFVEhfUF84MDIxUSkpIHsKKwkJCXZlaCA9IChzdHJ1Y3Qgdmxhbl9ldGhoZHIgKil2YTsKKwkJCWlmICh2ZWgtPmhfdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG8gIT0gaHRvbnMoRVRIX1BfSVApKQorCQkJCXJldHVybiAtMTsKKworCQkJbGxfaGxlbiArPSBWTEFOX0hMRU47CisKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwkqaGRyX2ZsYWdzID0gTFJPX0lQVjQ7CisKKwlpcGggPSAoc3RydWN0IGlwaGRyICopKHZhICsgbGxfaGxlbik7CisJKmlwX2hkciA9IGlwaDsKKwlpZiAoaXBoLT5wcm90b2NvbCAhPSBJUFBST1RPX1RDUCkKKwkJcmV0dXJuIC0xOworCSpoZHJfZmxhZ3MgfD0gTFJPX1RDUDsKKwkqdGNwdWRwX2hkciA9ICh1OCAqKSAoKmlwX2hkcikgKyAoaXBoLT5paGwgPDwgMik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiZW5ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gcG5vYi0+YWRhcHRlcjsKKwlzdHJ1Y3QgbmV0X2xyb19tZ3IgKmxyb19tZ3I7CisKKwlpZiAoYWRhcHRlci0+ZGV2X3N0YXRlIDwgQkVfREVWX1NUQVRFX0lOSVQpCisJCXJldHVybiAtRUFHQUlOOworCisJbHJvX21nciA9ICZwbm9iLT5scm9fbWdyOworCWxyb19tZ3ItPmRldiA9IG5ldGRldjsKKworCWxyb19tZ3ItPmZlYXR1cmVzID0gTFJPX0ZfTkFQSTsKKwlscm9fbWdyLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwlscm9fbWdyLT5pcF9zdW1tZWRfYWdnciA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCWxyb19tZ3ItPm1heF9kZXNjID0gQkVfTUFYX0xST19ERVNDUklQVE9SUzsKKwlscm9fbWdyLT5scm9fYXJyID0gcG5vYi0+bHJvX2Rlc2M7CisJbHJvX21nci0+Z2V0X2ZyYWdfaGVhZGVyID0gYmVfZ2V0X2ZyYWdfaGVhZGVyOworCWxyb19tZ3ItPm1heF9hZ2dyID0gYWRhcHRlci0+bWF4X3J4X2NvYWw7CisJbHJvX21nci0+ZnJhZ19hbGlnbl9wYWQgPSAyOworCWlmIChscm9fbWdyLT5tYXhfYWdnciA+IE1BWF9TS0JfRlJBR1MpCisJCWxyb19tZ3ItPm1heF9hZ2dyID0gTUFYX1NLQl9GUkFHUzsKKworCWFkYXB0ZXItPm1heF9yeF9jb2FsID0gQkVfTFJPX01BWF9QS1RTOworCisJYmVfdXBkYXRlX2xpbmtfc3RhdHVzKGFkYXB0ZXIpOworCisJLyoKKwkgKiBTZXQgY2FycmllciBvbiBvbmx5IGlmIFBoeXNpY2FsIExpbmsgdXAKKwkgKiBFaXRoZXIgb2YgdGhlIHBvcnQgbGluayBzdGF0dXMgdXAgc2lnbmlmaWVzIHRoaXMKKwkgKi8KKwlpZiAoKGFkYXB0ZXItPnBvcnQwX2xpbmtfc3RzID09IEJFX1BPUlRfTElOS19VUCkgfHwKKwkgICAgKGFkYXB0ZXItPnBvcnQxX2xpbmtfc3RzID09IEJFX1BPUlRfTElOS19VUCkpIHsKKwkJbmV0aWZfc3RhcnRfcXVldWUobmV0ZGV2KTsKKwkJbmV0aWZfY2Fycmllcl9vbihuZXRkZXYpOworCX0KKworCWFkYXB0ZXItPmRldl9zdGF0ZSA9IEJFX0RFVl9TVEFURV9PUEVOOworCW5hcGlfZW5hYmxlKCZwbm9iLT5uYXBpKTsKKwliZV9lbmFibGVfaW50cihwbm9iKTsKKwliZV9lbmFibGVfZXFfaW50cihwbm9iKTsKKwkvKgorCSAqIFJYIGNvbXBsZXRpb24gcXVldWUgbWF5IGJlIGluIGRpcy1hcm1lZCBzdGF0ZS4gQXJtIGl0LgorCSAqLworCWJlX25vdGlmeV9jbXBsKHBub2IsIDAsIHBub2ItPnJ4X2NxX2lkLCAxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJlbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gcG5vYi0+YWRhcHRlcjsKKworCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKwlzeW5jaHJvbml6ZV9pcnEobmV0ZGV2LT5pcnEpOworCisJYmVfd2FpdF9uaWNfdHhfY21wbHhfY21wbChwbm9iKTsKKwlhZGFwdGVyLT5kZXZfc3RhdGUgPSBCRV9ERVZfU1RBVEVfSU5JVDsKKwluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOworCisJYWRhcHRlci0+cG9ydDBfbGlua19zdHMgPSBCRV9QT1JUX0xJTktfRE9XTjsKKwlhZGFwdGVyLT5wb3J0MV9saW5rX3N0cyA9IEJFX1BPUlRfTElOS19ET1dOOworCWJlX2Rpc2FibGVfaW50cihwbm9iKTsKKwliZV9kaXNhYmxlX2VxX2ludHIocG5vYik7CisJbmFwaV9kaXNhYmxlKCZwbm9iLT5uYXBpKTsKKworCXJldHVybiAwOworfQorCisvKgorICogU2V0dGluZyBhIE1hYyBBZGRyZXNzIGZvciBCRQorICogVGFrZXMgbmV0ZGV2IGFuZCBhIHZvaWQgcG9pbnRlciBhcyBhcmd1bWVudHMuCisgKiBUaGUgcG9pbnRlciBob2xkcyB0aGUgbmV3IGFkZHJlcyB0byBiZSB1c2VkLgorICovCitzdGF0aWMgaW50IGJlbmV0X3NldF9tYWNfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB2b2lkICpwKQoreworCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHA7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJbWVtY3B5KG5ldGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIG5ldGRldi0+YWRkcl9sZW4pOworCWJlX3J4Zl9tYWNfYWRkcmVzc19yZWFkX3dyaXRlKCZwbm9iLT5mbl9vYmosIDAsIDAsIGZhbHNlLCB0cnVlLCBmYWxzZSwKKwkJCQluZXRkZXYtPmRldl9hZGRyLCBOVUxMLCBOVUxMKTsKKwkvKgorCSAqIFNpbmNlIHdlIGFyZSBkb2luZyBBY3RpdmUtUGFzc2l2ZSBmYWlsb3ZlciwgYm90aAorCSAqIHBvcnRzIHNob3VsZCBoYXZlIG1hdGNoaW5nIE1BQyBhZGRyZXNzZXMgZXZlcnl0aW1lLgorCSAqLworCWJlX3J4Zl9tYWNfYWRkcmVzc19yZWFkX3dyaXRlKCZwbm9iLT5mbl9vYmosIDEsIDAsIGZhbHNlLCB0cnVlLCBmYWxzZSwKKwkJCQkgICAgICBuZXRkZXYtPmRldl9hZGRyLCBOVUxMLCBOVUxMKTsKKworCXJldHVybiAwOworfQorCit2b2lkIGJlX2dldF9zdGF0c190aW1lcl9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwlzdHJ1Y3QgYmVfdGltZXJfY3R4dCAqY3R4dCA9IChzdHJ1Y3QgYmVfdGltZXJfY3R4dCAqKWNvbnRleHQ7CisKKwlpZiAoYXRvbWljX3JlYWQoJmN0eHQtPmdldF9zdGF0X2ZsYWcpKSB7CisJCWF0b21pY19kZWMoJmN0eHQtPmdldF9zdGF0X2ZsYWcpOworCQl1cCgodm9pZCAqKWN0eHQtPmdldF9zdGF0X3NlbV9hZGRyKTsKKwl9CisJZGVsX3RpbWVyKCZjdHh0LT5nZXRfc3RhdHNfdGltZXIpOworCXJldHVybjsKK30KKwordm9pZCBiZV9nZXRfc3RhdF9jYih2b2lkICpjb250ZXh0LCBpbnQgc3RhdHVzLAorCQkgICAgc3RydWN0IE1DQ19XUkJfQU1BUCAqb3B0aW9uYWxfd3JiKQoreworCXN0cnVjdCBiZV90aW1lcl9jdHh0ICpjdHh0ID0gKHN0cnVjdCBiZV90aW1lcl9jdHh0ICopY29udGV4dDsKKwkvKgorCSAqIGp1c3QgdXAgdGhlIHNlbWFwaG9yZSBpZiB0aGUgZ2V0X3N0YXRfZmxhZworCSAqIHJlYWRzIDEuIHNvIHRoYXQgdGhlIHdhaXRlciBjYW4gY29udGludWUuCisJICogSWYgaXQgaXMgMCwgdGhlbiBpdCB3YXMgaGFuZGxlZCBieSB0aGUgdGltZXIgaGFuZGxlci4KKwkgKi8KKwlkZWxfdGltZXIoJmN0eHQtPmdldF9zdGF0c190aW1lcik7CisJaWYgKGF0b21pY19yZWFkKCZjdHh0LT5nZXRfc3RhdF9mbGFnKSkgeworCQlhdG9taWNfZGVjKCZjdHh0LT5nZXRfc3RhdF9mbGFnKTsKKwkJdXAoKHZvaWQgKiljdHh0LT5nZXRfc3RhdF9zZW1fYWRkcik7CisJfQorfQorCitzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYmVuZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gcG5vYi0+YWRhcHRlcjsKKwl1NjQgcGE7CisJc3RydWN0IGJlX3RpbWVyX2N0eHQgKmN0eHQgPSAmYWRhcHRlci0+dGltZXJfY3R4dDsKKworCWlmIChhZGFwdGVyLT5kZXZfc3RhdGUgIT0gQkVfREVWX1NUQVRFX09QRU4pIHsKKwkJLyogUmV0dXJuIHByZXZpb3VzbHkgcmVhZCBzdGF0cyAqLworCQlyZXR1cm4gJihhZGFwdGVyLT5iZW5ldF9zdGF0cyk7CisJfQorCS8qIEdldCBQaHlzaWNhbCBBZGRyICovCisJcGEgPSBwY2lfbWFwX3NpbmdsZShhZGFwdGVyLT5wZGV2LCBhZGFwdGVyLT5ldGhfc3RhdHNwLAorCQkJICAgIHNpemVvZihzdHJ1Y3QgRldDTURfRVRIX0dFVF9TVEFUSVNUSUNTKSwKKwkJCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCWN0eHQtPmdldF9zdGF0X3NlbV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpJmFkYXB0ZXItPmdldF9ldGhfc3RhdF9zZW07CisJYXRvbWljX2luYygmY3R4dC0+Z2V0X3N0YXRfZmxhZyk7CisKKwliZV9yeGZfcXVlcnlfZXRoX3N0YXRpc3RpY3MoJnBub2ItPmZuX29iaiwgYWRhcHRlci0+ZXRoX3N0YXRzcCwKKwkJCQkgICAgY3B1X3RvX2xlNjQocGEpLCBiZV9nZXRfc3RhdF9jYiwgY3R4dCwKKwkJCQkgICAgTlVMTCk7CisKKwljdHh0LT5nZXRfc3RhdHNfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWN0eHQ7CisJbW9kX3RpbWVyKCZjdHh0LT5nZXRfc3RhdHNfdGltZXIsIChqaWZmaWVzICsgKEhaICogMikpKTsKKwlkb3duKCh2b2lkICopY3R4dC0+Z2V0X3N0YXRfc2VtX2FkZHIpOwkvKiBjYWxsYmFjayB3aWxsIHVuYmxvY2sgdXMgKi8KKworCS8qIEFkZGluZyBwb3J0MCBhbmQgcG9ydDEgc3RhdHMuICovCisJYWRhcHRlci0+YmVuZXRfc3RhdHMucnhfcGFja2V0cyA9CisJICAgIGFkYXB0ZXItPmV0aF9zdGF0c3AtPnBhcmFtcy5yZXNwb25zZS5wMHJlY3ZkdG90YWxmcmFtZXMgKworCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDFyZWN2ZHRvdGFsZnJhbWVzOworCWFkYXB0ZXItPmJlbmV0X3N0YXRzLnR4X3BhY2tldHMgPQorCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDB4bWl0dW5pY2FzdGZyYW1lcyArCisJICAgIGFkYXB0ZXItPmV0aF9zdGF0c3AtPnBhcmFtcy5yZXNwb25zZS5wMXhtaXR1bmljYXN0ZnJhbWVzOworCWFkYXB0ZXItPmJlbmV0X3N0YXRzLnR4X2J5dGVzID0KKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAweG1pdGJ5dGVzbHNkICsKKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAxeG1pdGJ5dGVzbHNkOworCWFkYXB0ZXItPmJlbmV0X3N0YXRzLnJ4X2Vycm9ycyA9CisJICAgIGFkYXB0ZXItPmV0aF9zdGF0c3AtPnBhcmFtcy5yZXNwb25zZS5wMGNyY2Vycm9ycyArCisJICAgIGFkYXB0ZXItPmV0aF9zdGF0c3AtPnBhcmFtcy5yZXNwb25zZS5wMWNyY2Vycm9yczsKKwlhZGFwdGVyLT5iZW5ldF9zdGF0cy5yeF9lcnJvcnMgKz0KKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAwYWxpZ25tZW50c3ltZXJycyArCisJICAgIGFkYXB0ZXItPmV0aF9zdGF0c3AtPnBhcmFtcy5yZXNwb25zZS5wMWFsaWdubWVudHN5bWVycnM7CisJYWRhcHRlci0+YmVuZXRfc3RhdHMucnhfZXJyb3JzICs9CisJICAgIGFkYXB0ZXItPmV0aF9zdGF0c3AtPnBhcmFtcy5yZXNwb25zZS5wMGlucmFuZ2VsZW5lcnJvcnMgKworCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDFpbnJhbmdlbGVuZXJyb3JzOworCWFkYXB0ZXItPmJlbmV0X3N0YXRzLnJ4X2J5dGVzID0KKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAwcmVjdmR0b3RhbGJ5dGVzTFNEICsKKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAxcmVjdmR0b3RhbGJ5dGVzTFNEOworCWFkYXB0ZXItPmJlbmV0X3N0YXRzLnJ4X2NyY19lcnJvcnMgPQorCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDBjcmNlcnJvcnMgKworCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDFjcmNlcnJvcnM7CisKKwlhZGFwdGVyLT5iZW5ldF9zdGF0cy50eF9wYWNrZXRzICs9CisJICAgIGFkYXB0ZXItPmV0aF9zdGF0c3AtPnBhcmFtcy5yZXNwb25zZS5wMHhtaXRtdWx0aWNhc3RmcmFtZXMgKworCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDF4bWl0bXVsdGljYXN0ZnJhbWVzOworCWFkYXB0ZXItPmJlbmV0X3N0YXRzLnR4X3BhY2tldHMgKz0KKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAweG1pdGJyb2FkY2FzdGZyYW1lcyArCisJICAgIGFkYXB0ZXItPmV0aF9zdGF0c3AtPnBhcmFtcy5yZXNwb25zZS5wMXhtaXRicm9hZGNhc3RmcmFtZXM7CisJYWRhcHRlci0+YmVuZXRfc3RhdHMudHhfZXJyb3JzID0gMDsKKworCWFkYXB0ZXItPmJlbmV0X3N0YXRzLm11bHRpY2FzdCA9CisJICAgIGFkYXB0ZXItPmV0aF9zdGF0c3AtPnBhcmFtcy5yZXNwb25zZS5wMHhtaXRtdWx0aWNhc3RmcmFtZXMgKworCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDF4bWl0bXVsdGljYXN0ZnJhbWVzOworCisJYWRhcHRlci0+YmVuZXRfc3RhdHMucnhfZmlmb19lcnJvcnMgPQorCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDByeGZpZm9vdmVyZmxvd2Ryb3BwZWQgKworCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDFyeGZpZm9vdmVyZmxvd2Ryb3BwZWQ7CisJYWRhcHRlci0+YmVuZXRfc3RhdHMucnhfZnJhbWVfZXJyb3JzID0KKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAwYWxpZ25tZW50c3ltZXJycyArCisJICAgIGFkYXB0ZXItPmV0aF9zdGF0c3AtPnBhcmFtcy5yZXNwb25zZS5wMWFsaWdubWVudHN5bWVycnM7CisJYWRhcHRlci0+YmVuZXRfc3RhdHMucnhfbGVuZ3RoX2Vycm9ycyA9CisJICAgIGFkYXB0ZXItPmV0aF9zdGF0c3AtPnBhcmFtcy5yZXNwb25zZS5wMGlucmFuZ2VsZW5lcnJvcnMgKworCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDFpbnJhbmdlbGVuZXJyb3JzOworCWFkYXB0ZXItPmJlbmV0X3N0YXRzLnJ4X2xlbmd0aF9lcnJvcnMgKz0KKwkgICAgYWRhcHRlci0+ZXRoX3N0YXRzcC0+cGFyYW1zLnJlc3BvbnNlLnAwb3V0cmFuZ2VlcnJvcnMgKworCSAgICBhZGFwdGVyLT5ldGhfc3RhdHNwLT5wYXJhbXMucmVzcG9uc2UucDFvdXRyYW5nZWVycm9yczsKKwlhZGFwdGVyLT5iZW5ldF9zdGF0cy5yeF9sZW5ndGhfZXJyb3JzICs9CisJICAgIGFkYXB0ZXItPmV0aF9zdGF0c3AtPnBhcmFtcy5yZXNwb25zZS5wMGZyYW1ldG9vbG9uZ2Vycm9ycyArCisJICAgIGFkYXB0ZXItPmV0aF9zdGF0c3AtPnBhcmFtcy5yZXNwb25zZS5wMWZyYW1ldG9vbG9uZ2Vycm9yczsKKworCXBjaV91bm1hcF9zaW5nbGUoYWRhcHRlci0+cGRldiwgKHVsb25nKSBhZGFwdGVyLT5ldGhfc3RhdHNwLAorCQkJIHNpemVvZihzdHJ1Y3QgRldDTURfRVRIX0dFVF9TVEFUSVNUSUNTKSwKKwkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCXJldHVybiAmKGFkYXB0ZXItPmJlbmV0X3N0YXRzKTsKKworfQorCitzdGF0aWMgdm9pZCBiZV9zdGFydF90eChzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiwgdTMyIG5wb3N0ZWQpCit7CisjZGVmaW5lIENTUl9FVEhfTUFYX1NRUE9TVFMgMjU1CisJc3RydWN0IFNRX0RCX0FNQVAgc3FkYjsKKworCXNxZGIuZHdbMF0gPSAwOworCisJQU1BUF9TRVRfQklUU19QVFIoU1FfREIsIGNpZCwgJnNxZGIsIHBub2ItPnR4X3FfaWQpOworCXdoaWxlIChucG9zdGVkKSB7CisJCWlmIChucG9zdGVkID4gQ1NSX0VUSF9NQVhfU1FQT1NUUykgeworCQkJQU1BUF9TRVRfQklUU19QVFIoU1FfREIsIG51bVBvc3RlZCwgJnNxZGIsCisJCQkJCSAgQ1NSX0VUSF9NQVhfU1FQT1NUUyk7CisJCQlucG9zdGVkIC09IENTUl9FVEhfTUFYX1NRUE9TVFM7CisJCX0gZWxzZSB7CisJCQlBTUFQX1NFVF9CSVRTX1BUUihTUV9EQiwgbnVtUG9zdGVkLCAmc3FkYiwgbnBvc3RlZCk7CisJCQlucG9zdGVkID0gMDsKKwkJfQorCQlQRF9XUklURSgmcG5vYi0+Zm5fb2JqLCBldHhfc3FfZGIsIHNxZGIuZHdbMF0pOworCX0KKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX3R4X3JhdGUoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJLyogdXBkYXRlIHRoZSByYXRlIG9uY2UgaW4gdHdvIHNlY29uZHMgKi8KKwlpZiAoKGppZmZpZXMgLSBhZGFwdGVyLT5ldGhfdHhfamlmZmllcykgPiAyICogKEhaKSkgeworCQl1MzIgcjsKKwkJciA9IGFkYXB0ZXItPmV0aF90eF9ieXRlcyAvCisJCSAgICAoKGppZmZpZXMgLSBhZGFwdGVyLT5ldGhfdHhfamlmZmllcykgLyAoSFopKTsKKwkJciA9IChyIC8gMTAwMDAwMCk7CS8qIE0gYnl0ZXMvcyAqLworCQlhZGFwdGVyLT5iZV9zdGF0LmJlc19ldGhfdHhfcmF0ZSA9IChyICogOCk7IC8qIE0gYml0cy9zICovCisJCWFkYXB0ZXItPmV0aF90eF9qaWZmaWVzID0gamlmZmllczsKKwkJYWRhcHRlci0+ZXRoX3R4X2J5dGVzID0gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgd3JiX2NudF9pbl9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgY250ID0gMDsKKwl3aGlsZSAoc2tiKSB7CisJCWlmIChza2ItPmxlbiA+IHNrYi0+ZGF0YV9sZW4pCisJCQljbnQrKzsKKwkJY250ICs9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CisJCXNrYiA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0OworCX0KKwlCVUdfT04oY250ID4gQkVfTUFYX1RYX0ZSQUdfQ09VTlQpOworCXJldHVybiBjbnQ7Cit9CisKK3N0YXRpYyB2b2lkIHdyYl9maWxsKHN0cnVjdCBFVEhfV1JCX0FNQVAgKndyYiwgdTY0IGFkZHIsIGludCBsZW4pCit7CisJQU1BUF9TRVRfQklUU19QVFIoRVRIX1dSQiwgZnJhZ19wYV9oaSwgd3JiLCBhZGRyID4+IDMyKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihFVEhfV1JCLCBmcmFnX3BhX2xvLCB3cmIsIGFkZHIgJiAweEZGRkZGRkZGKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihFVEhfV1JCLCBmcmFnX2xlbiwgd3JiLCBsZW4pOworfQorCitzdGF0aWMgdm9pZCB3cmJfZmlsbF9leHRyYShzdHJ1Y3QgRVRIX1dSQl9BTUFQICp3cmIsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICBzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYikKK3sKKwl3cmItPmR3WzJdID0gMDsKKwl3cmItPmR3WzNdID0gMDsKKwlBTUFQX1NFVF9CSVRTX1BUUihFVEhfV1JCLCBjcmMsIHdyYiwgMSk7CisJaWYgKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NlZ3MgPiAxICYmIHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUpIHsKKwkJQU1BUF9TRVRfQklUU19QVFIoRVRIX1dSQiwgbHNvLCB3cmIsIDEpOworCQlBTUFQX1NFVF9CSVRTX1BUUihFVEhfV1JCLCBsc29fbXNzLCB3cmIsCisJCQkJICBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplKTsKKwl9IGVsc2UgaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpIHsKKwkJdTggcHJvdG8gPSAoKHN0cnVjdCBpcGhkciAqKWlwX2hkcihza2IpKS0+cHJvdG9jb2w7CisJCWlmIChwcm90byA9PSBJUFBST1RPX1RDUCkKKwkJCUFNQVBfU0VUX0JJVFNfUFRSKEVUSF9XUkIsIHRjcGNzLCB3cmIsIDEpOworCQllbHNlIGlmIChwcm90byA9PSBJUFBST1RPX1VEUCkKKwkJCUFNQVBfU0VUX0JJVFNfUFRSKEVUSF9XUkIsIHVkcGNzLCB3cmIsIDEpOworCX0KKwlpZiAocG5vYi0+dmxhbl9ncnAgJiYgdmxhbl90eF90YWdfcHJlc2VudChza2IpKSB7CisJCUFNQVBfU0VUX0JJVFNfUFRSKEVUSF9XUkIsIHZsYW4sIHdyYiwgMSk7CisJCUFNQVBfU0VUX0JJVFNfUFRSKEVUSF9XUkIsIHZsYW5fdGFnLCB3cmIsIHZsYW5fdHhfdGFnX2dldChza2IpKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cmJfY29weV9leHRyYShzdHJ1Y3QgRVRIX1dSQl9BTUFQICp0bywKKwkJCQkgIHN0cnVjdCBFVEhfV1JCX0FNQVAgKmZyb20pCit7CisKKwl0by0+ZHdbMl0gPSBmcm9tLT5kd1syXTsKKwl0by0+ZHdbM10gPSBmcm9tLT5kd1szXTsKK30KKworLyogUmV0dXJucyB0aGUgYWN0dWFsIGNvdW50IG9mIHdyYnMgdXNlZCBpbmNsdWRpbmcgYSBwb3NzaWJsZSBkdW1teSAqLworc3RhdGljIGludCBjb3B5X3NrYl90b190eHEoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICB1MzIgd3JiX2NudCwgdTMyICpjb3BpZWQpCit7CisJdTY0IGJ1c2FkZHI7CisJc3RydWN0IEVUSF9XUkJfQU1BUCAqd3JiID0gTlVMTCwgKmZpcnN0ID0gTlVMTDsKKwl1MzIgaTsKKwlib29sIGR1bW15ID0gdHJ1ZTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHBub2ItPmFkYXB0ZXItPnBkZXY7CisKKwlpZiAod3JiX2NudCAmIDEpCisJCXdyYl9jbnQrKzsKKwllbHNlCisJCWR1bW15ID0gZmFsc2U7CisKKwlhdG9taWNfYWRkKHdyYl9jbnQsICZwbm9iLT50eF9xX3VzZWQpOworCisJd2hpbGUgKHNrYikgeworCQlpZiAoc2tiLT5sZW4gPiBza2ItPmRhdGFfbGVuKSB7CisJCQlpbnQgbGVuID0gc2tiLT5sZW4gLSBza2ItPmRhdGFfbGVuOworCQkJYnVzYWRkciA9IHBjaV9tYXBfc2luZ2xlKHBkZXYsIHNrYi0+ZGF0YSwgbGVuLAorCQkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJYnVzYWRkciA9IGNwdV90b19sZTY0KGJ1c2FkZHIpOworCQkJd3JiID0gJnBub2ItPnR4X3FbcG5vYi0+dHhfcV9oZF07CisJCQlpZiAoZmlyc3QgPT0gTlVMTCkgeworCQkJCXdyYl9maWxsX2V4dHJhKHdyYiwgc2tiLCBwbm9iKTsKKwkJCQlmaXJzdCA9IHdyYjsKKwkJCX0gZWxzZSB7CisJCQkJd3JiX2NvcHlfZXh0cmEod3JiLCBmaXJzdCk7CisJCQl9CisJCQl3cmJfZmlsbCh3cmIsIGJ1c2FkZHIsIGxlbik7CisJCQliZV9hZHZfdHhxX2hkKHBub2IpOworCQkJKmNvcGllZCArPSBsZW47CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgaSsrKSB7CisJCQlzdHJ1Y3Qgc2tiX2ZyYWdfc3RydWN0ICpmcmFnID0KKwkJCSAgICAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXTsKKwkJCWJ1c2FkZHIgPSBwY2lfbWFwX3BhZ2UocGRldiwgZnJhZy0+cGFnZSwKKwkJCQkJICAgICAgIGZyYWctPnBhZ2Vfb2Zmc2V0LCBmcmFnLT5zaXplLAorCQkJCQkgICAgICAgUENJX0RNQV9UT0RFVklDRSk7CisJCQlidXNhZGRyID0gY3B1X3RvX2xlNjQoYnVzYWRkcik7CisJCQl3cmIgPSAmcG5vYi0+dHhfcVtwbm9iLT50eF9xX2hkXTsKKwkJCWlmIChmaXJzdCA9PSBOVUxMKSB7CisJCQkJd3JiX2ZpbGxfZXh0cmEod3JiLCBza2IsIHBub2IpOworCQkJCWZpcnN0ID0gd3JiOworCQkJfSBlbHNlIHsKKwkJCQl3cmJfY29weV9leHRyYSh3cmIsIGZpcnN0KTsKKwkJCX0KKwkJCXdyYl9maWxsKHdyYiwgYnVzYWRkciwgZnJhZy0+c2l6ZSk7CisJCQliZV9hZHZfdHhxX2hkKHBub2IpOworCQkJKmNvcGllZCArPSBmcmFnLT5zaXplOworCQl9CisJCXNrYiA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0OworCX0KKworCWlmIChkdW1teSkgeworCQl3cmIgPSAmcG5vYi0+dHhfcVtwbm9iLT50eF9xX2hkXTsKKwkJQlVHX09OKGZpcnN0ID09IE5VTEwpOworCQl3cmJfY29weV9leHRyYSh3cmIsIGZpcnN0KTsKKwkJd3JiX2ZpbGwod3JiLCAwLCAwKTsKKwkJYmVfYWR2X3R4cV9oZChwbm9iKTsKKwl9CisJQU1BUF9TRVRfQklUU19QVFIoRVRIX1dSQiwgY29tcGxldGUsIHdyYiwgMSk7CisJQU1BUF9TRVRfQklUU19QVFIoRVRIX1dSQiwgbGFzdCwgd3JiLCAxKTsKKwlyZXR1cm4gd3JiX2NudDsKK30KKworLyogRm9yIGVhY2ggc2tiIHRyYW5zbWl0dGVkLCB0eF9jdHh0IHN0b3JlcyB0aGUgbnVtIG9mIHdyYnMgaW4gdGhlCisgKiBzdGFydCBpbmRleCBhbmQgc2tiIHBvaW50ZXIgaW4gdGhlIGVuZCBpbmRleAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmVfdHhfd3JiX2luZm9fcmVtZW1iZXIoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IsCisJCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IsIGludCB3cmJfY250LAorCQkJCQkgICB1MzIgc3RhcnQpCit7CisJKih1MzIgKikgKCZwbm9iLT50eF9jdHh0W3N0YXJ0XSkgPSB3cmJfY250OworCWluZGV4X2Fkdigmc3RhcnQsIHdyYl9jbnQgLSAxLCBwbm9iLT50eF9xX2xlbik7CisJcG5vYi0+dHhfY3R4dFtzdGFydF0gPSBza2I7Cit9CisKK3N0YXRpYyBpbnQgYmVuZXRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IHBub2ItPmFkYXB0ZXI7CisJdTMyIHdyYl9jbnQsIGNvcGllZCA9IDA7CisJdTMyIHN0YXJ0ID0gcG5vYi0+dHhfcV9oZDsKKworCWFkYXB0ZXItPmJlX3N0YXQuYmVzX3R4X3JlcXMrKzsKKworCXdyYl9jbnQgPSB3cmJfY250X2luX3NrYihza2IpOworCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+dHhxX2xvY2spOworCWlmICgocG5vYi0+dHhfcV9sZW4gLSAyIC0gYXRvbWljX3JlYWQoJnBub2ItPnR4X3FfdXNlZCkpIDw9IHdyYl9jbnQpIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShwbm9iLT5uZXRkZXYpOworCQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+dHhxX2xvY2spOworCQlhZGFwdGVyLT5iZV9zdGF0LmJlc190eF9mYWlscysrOworCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT50eHFfbG9jayk7CisKKwl3cmJfY250ID0gY29weV9za2JfdG9fdHhxKHBub2IsIHNrYiwgd3JiX2NudCwgJmNvcGllZCk7CisJYmVfdHhfd3JiX2luZm9fcmVtZW1iZXIocG5vYiwgc2tiLCB3cmJfY250LCBzdGFydCk7CisKKwliZV9zdGFydF90eChwbm9iLCB3cmJfY250KTsKKworCWFkYXB0ZXItPmV0aF90eF9ieXRlcyArPSBjb3BpZWQ7CisJYWRhcHRlci0+YmVfc3RhdC5iZXNfdHhfd3JicyArPSB3cmJfY250OworCXVwZGF0ZV90eF9yYXRlKGFkYXB0ZXIpOworCW5ldGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJcmV0dXJuIE5FVERFVl9UWF9PSzsKK30KKworLyoKKyAqIFRoaXMgaXMgdGhlIGRyaXZlciBlbnRyeSBwb2ludCB0byBjaGFuZ2UgdGhlIG10dSBvZiB0aGUgZGV2aWNlCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MgYW5kIGVycm5vIGZvciBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGJlbmV0X2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IG5ld19tdHUpCit7CisJLyoKKwkgKiBCRSBzdXBwb3J0cyBqdW1ibyBmcmFtZSBzaXplIHVwdG8gOTAwMCBieXRlcyBpbmNsdWRpbmcgdGhlIGxpbmsgbGF5ZXIKKwkgKiBoZWFkZXIuIENvbnNpZGVyaW5nIHRoZSBkaWZmZXJlbnQgdmFyaWFudHMgb2YgZnJhbWUgZm9ybWF0cyBwb3NzaWJsZQorCSAqIGxpa2UgVkxBTiwgU05BUC9MTEMsIHRoZSBtYXhpbXVtIHBvc3NpYmxlIHZhbHVlIGZvciBNVFUgaXMgODk3NCBieXRlcworCSAqLworCisJaWYgKG5ld19tdHUgPCAoRVRIX1pMRU4gKyBFVEhfRkNTX0xFTikgfHwgKG5ld19tdHUgPiBCRV9NQVhfTVRVKSkgeworCQlkZXZfaW5mbygmbmV0ZGV2LT5kZXYsICJJbnZhbGlkIE1UVSByZXF1ZXN0ZWQuICIKKwkJCSAgICAgICAiTXVzdCBiZSBiZXR3ZWVuICVkIGFuZCAlZCBieXRlc1xuIiwKKwkJCQkgICAgICAgKEVUSF9aTEVOICsgRVRIX0ZDU19MRU4pLCBCRV9NQVhfTVRVKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWRldl9pbmZvKCZuZXRkZXYtPmRldiwgIk1UVSBjaGFuZ2VkIGZyb20gJWQgdG8gJWRcbiIsCisJCQkJCQluZXRkZXYtPm10dSwgbmV3X210dSk7CisJbmV0ZGV2LT5tdHUgPSBuZXdfbXR1OworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBpcyB0aGUgZHJpdmVyIGVudHJ5IHBvaW50IHRvIHJlZ2lzdGVyIGEgdmxhbiB3aXRoIHRoZSBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgYmVuZXRfdmxhbl9yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJCXN0cnVjdCB2bGFuX2dyb3VwICpncnApCit7CisJc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJYmVfZGlzYWJsZV9lcV9pbnRyKHBub2IpOworCXBub2ItPnZsYW5fZ3JwID0gZ3JwOworCXBub2ItPm51bV92bGFucyA9IDA7CisJYmVfZW5hYmxlX2VxX2ludHIocG5vYik7Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBkcml2ZXIgZW50cnkgcG9pbnQgdG8gYWRkIGEgdmxhbiB2bGFuX2lkCisgKiB3aXRoIHRoZSBkZXZpY2UgbmV0ZGV2CisgKi8KK3N0YXRpYyB2b2lkIGJlbmV0X3ZsYW5fYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MTYgdmxhbl9pZCkKK3sKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlpZiAocG5vYi0+bnVtX3ZsYW5zID09IChCRV9OVU1fVkxBTl9TVVBQT1JURUQgLSAxKSkgeworCQkvKiBubyAgd2F5IHRvIHJldHVybiBhbiBlcnJvciAqLworCQlkZXZfaW5mbygmbmV0ZGV2LT5kZXYsCisJCSAgICAgICAiQmxhZGVFbmdpbmU6IENhbm5vdCBjb25maWd1cmUgbW9yZSB0aGFuICVkIFZsYW5zXG4iLAorCQkJICAgICAgIEJFX05VTV9WTEFOX1NVUFBPUlRFRCk7CisJCXJldHVybjsKKwl9CisJLyogVGhlIG5ldyB2bGFuIHRhZyB3aWxsIGJlIGluIHRoZSBzbG90IGluZGljYXRlZCBieSBudW1fdmxhbnMuICovCisJcG5vYi0+dmxhbl90YWdbcG5vYi0+bnVtX3ZsYW5zKytdID0gdmxhbl9pZDsKKwliZV9yeGZfdmxhbl9jb25maWcoJnBub2ItPmZuX29iaiwgZmFsc2UsIHBub2ItPm51bV92bGFucywKKwkJCSAgIHBub2ItPnZsYW5fdGFnLCBOVUxMLCBOVUxMLCBOVUxMKTsKK30KKworLyoKKyAqIFRoaXMgaXMgdGhlIGRyaXZlciBlbnRyeSBwb2ludCB0byByZW1vdmUgYSB2bGFuIHZsYW5faWQKKyAqIHdpdGggdGhlIGRldmljZSBuZXRkZXYKKyAqLworc3RhdGljIHZvaWQgYmVuZXRfdmxhbl9yZW1fdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUxNiB2bGFuX2lkKQoreworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCXUzMiBpLCB2YWx1ZTsKKworCS8qCisJICogSW4gQmxhZGUgRW5naW5lLCB3ZSBzdXBwb3J0IDMyIHZsYW4gdGFnIGZpbHRlcnMgYWNyb3NzIGJvdGggcG9ydHMuCisJICogVG8gcHJvZ3JhbSBhIHZsYW4gdGFnLCB0aGUgUlhGX1JUUFJfQ1NSIHJlZ2lzdGVyIGlzIHVzZWQuCisJICogRWFjaCAzMi1iaXQgdmFsdWUgb2YgUlhGX1JURFJfQ1NSIGNhbiBhZGRyZXNzIDIgdmxhbiB0YWcgZW50cmllcy4KKwkgKiBUaGUgVmxhbiB0YWJsZSBpcyBvZiBkZXB0aCAxNi4gdGh1cyB3ZSBzdXBwb3J0IDMyIHRhZ3MuCisJICovCisKKwl2YWx1ZSA9IHZsYW5faWQgfCBWTEFOX1ZBTElEX0JJVDsKKwlmb3IgKGkgPSAwOyBpIDwgQkVfTlVNX1ZMQU5fU1VQUE9SVEVEOyBpKyspIHsKKwkJaWYgKHBub2ItPnZsYW5fdGFnW2ldID09IHZsYW5faWQpCisJCQlicmVhazsKKwl9CisKKwlpZiAoaSA9PSBCRV9OVU1fVkxBTl9TVVBQT1JURUQpCisJCXJldHVybjsKKwkvKiBOb3cgY29tcGFjdCB0aGUgdmxhbiB0YWcgYXJyYXkgYnkgcmVtb3ZpbmcgaG9sZSBjcmVhdGVkLiAqLworCXdoaWxlICgoaSArIDEpIDwgQkVfTlVNX1ZMQU5fU1VQUE9SVEVEKSB7CisJCXBub2ItPnZsYW5fdGFnW2ldID0gcG5vYi0+dmxhbl90YWdbaSArIDFdOworCQlpKys7CisJfQorCWlmICgoaSArIDEpID09IEJFX05VTV9WTEFOX1NVUFBPUlRFRCkKKwkJcG5vYi0+dmxhbl90YWdbaV0gPSAodTE2KSAweDA7CisJcG5vYi0+bnVtX3ZsYW5zLS07CisJYmVfcnhmX3ZsYW5fY29uZmlnKCZwbm9iLT5mbl9vYmosIGZhbHNlLCBwbm9iLT5udW1fdmxhbnMsCisJCQkgICBwbm9iLT52bGFuX3RhZywgTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9ncmFtIG11bHRpY2FzdAorICogYWRkcmVzcyBpbiB0aGUgbXVsdGljYXN0IGZpbHRlciBvZiB0aGUgQVNJQy4KKyAqLworc3RhdGljIHZvaWQgYmVfc2V0X211bHRpY2FzdF9maWx0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGRldl9tY19saXN0ICptY19wdHI7CisJdTggbWFjX2FkZHJbMzJdW0VUSF9BTEVOXTsKKwlpbnQgaTsKKworCWlmIChuZXRkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB7CisJCS8qIHNldCBCRSBpbiBNdWx0aWNhc3QgcHJvbWlzY3VvdXMgKi8KKwkJYmVfcnhmX211bHRpY2FzdF9jb25maWcoJnBub2ItPmZuX29iaiwgdHJ1ZSwgMCwgTlVMTCwgTlVMTCwKKwkJCQkJTlVMTCwgTlVMTCk7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKG1jX3B0ciA9IG5ldGRldi0+bWNfbGlzdCwgaSA9IDA7IG1jX3B0cjsKKwkgICAgIG1jX3B0ciA9IG1jX3B0ci0+bmV4dCwgaSsrKSB7CisJCW1lbWNweSgmbWFjX2FkZHJbaV1bMF0sIG1jX3B0ci0+ZG1pX2FkZHIsIEVUSF9BTEVOKTsKKwl9CisKKwkvKiByZXNldCB0aGUgcHJvbWlzY3VvdXMgbW9kZSBhbHNvLiAqLworCWJlX3J4Zl9tdWx0aWNhc3RfY29uZmlnKCZwbm9iLT5mbl9vYmosIGZhbHNlLCBpLAorCQkJCSZtYWNfYWRkclswXVswXSwgTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBkcml2ZXIgZW50cnkgcG9pbnQgdG8gc2V0IG11bHRpY2FzdCBsaXN0CisgKiB3aXRoIHRoZSBkZXZpY2UgbmV0ZGV2LiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgdXNlZCB0bworICogc2V0IHByb21pc2N1b3VzIG1vZGUgb3IgbXVsdGljYXN0IHByb21pc2N1b3VzIG1vZGUKKyAqIG9yIG11bHRpY2FzdCBtb2RlLi4uLgorICovCitzdGF0aWMgdm9pZCBiZW5ldF9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYiA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCWJlX3J4Zl9wcm9taXNjdW91cygmcG5vYi0+Zm5fb2JqLCAxLCAxLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwl9IGVsc2UgeworCQliZV9yeGZfcHJvbWlzY3VvdXMoJnBub2ItPmZuX29iaiwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJCWJlX3NldF9tdWx0aWNhc3RfZmlsdGVyKG5ldGRldik7CisJfQorfQorCitpbnQgYmVuZXRfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IHBub2ItPmFkYXB0ZXI7CisKKwlldGhlcl9zZXR1cChuZXRkZXYpOworCisJbmV0ZGV2LT5vcGVuID0gJmJlbmV0X29wZW47CisJbmV0ZGV2LT5zdG9wID0gJmJlbmV0X2Nsb3NlOworCW5ldGRldi0+aGFyZF9zdGFydF94bWl0ID0gJmJlbmV0X3htaXQ7CisKKwluZXRkZXYtPmdldF9zdGF0cyA9ICZiZW5ldF9nZXRfc3RhdHM7CisKKwluZXRkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZiZW5ldF9zZXRfbXVsdGljYXN0X2xpc3Q7CisKKwluZXRkZXYtPmNoYW5nZV9tdHUgPSAmYmVuZXRfY2hhbmdlX210dTsKKwluZXRkZXYtPnNldF9tYWNfYWRkcmVzcyA9ICZiZW5ldF9zZXRfbWFjX2FkZHI7CisKKwluZXRkZXYtPnZsYW5fcnhfcmVnaXN0ZXIgPSBiZW5ldF92bGFuX3JlZ2lzdGVyOworCW5ldGRldi0+dmxhbl9yeF9hZGRfdmlkID0gYmVuZXRfdmxhbl9hZGRfdmlkOworCW5ldGRldi0+dmxhbl9yeF9raWxsX3ZpZCA9IGJlbmV0X3ZsYW5fcmVtX3ZpZDsKKworCW5ldGRldi0+ZmVhdHVyZXMgPQorCSAgICBORVRJRl9GX1NHIHwgTkVUSUZfRl9ISUdIRE1BIHwgTkVUSUZfRl9IV19WTEFOX1JYIHwgTkVUSUZfRl9UU08gfAorCSAgICBORVRJRl9GX0hXX1ZMQU5fVFggfCBORVRJRl9GX0hXX1ZMQU5fRklMVEVSIHwgTkVUSUZfRl9JUF9DU1VNOworCisJbmV0ZGV2LT5mbGFncyB8PSBJRkZfTVVMVElDQVNUOworCisJLyogSWYgZGV2aWNlIGlzIERBQyBDYXBhYmxlLCBzZXQgdGhlIEhJR0hETUEgZmxhZyBmb3IgbmV0ZGV2aWNlLiAqLworCWlmIChhZGFwdGVyLT5kbWFfNjRiaXRfY2FwKQorCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSElHSERNQTsKKworCVNFVF9FVEhUT09MX09QUyhuZXRkZXYsICZiZV9ldGh0b29sX29wcyk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvYmVuZXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9iZW5ldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YTFmMDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvYmVuZXQuaApAQCAtMCwwICsxLDQyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworI2lmbmRlZiBfQkVORVRfSF8KKyNkZWZpbmUgX0JFTkVUX0hfCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0X2xyby5oPgorI2luY2x1ZGUgImh3bGliLmgiCisKKyNkZWZpbmUgX1NBX01PRFVMRV9OQU1FICJuZXQtZHJpdmVyIgorCisjZGVmaW5lIFZMQU5fVkFMSURfQklUCQkweDgwMDAKKyNkZWZpbmUgQkVfTlVNX1ZMQU5fU1VQUE9SVEVECTMyCisjZGVmaW5lIEJFX1BPUlRfTElOS19ET1dOICAgICAgIDAwMDAKKyNkZWZpbmUgQkVfUE9SVF9MSU5LX1VQICAgICAgICAgMDAwMQorI2RlZmluZQlCRV9NQVhfVFhfRlJBR19DT1VOVAkJKDMwKQorCisvKiBGbGFnIGJpdHMgZm9yIHNlbmQgb3BlcmF0aW9uICovCisjZGVmaW5lIElQQ1MgICAgICAgICAgICAoMSA8PCAwKQkvKiBFbmFibGUgSVAgY2hlY2tzdW0gb2ZmbG9hZCAqLworI2RlZmluZSBVRFBDUyAgICAgICAgICAgKDEgPDwgMSkJLyogRW5hYmxlIFVEUCBjaGVja3N1bSBvZmZsb2FkICovCisjZGVmaW5lIFRDUENTICAgICAgICAgICAoMSA8PCAyKQkvKiBFbmFibGUgVENQIGNoZWNrc3VtIG9mZmxvYWQgKi8KKyNkZWZpbmUgTFNPICAgICAgICAgICAgICgxIDw8IDMpCS8qIEVuYWJsZSBMYXJnZSBTZWdtZW50ICBvZmZsb2FkICovCisjZGVmaW5lIEVUSFZMQU4gICAgICAgICAoMSA8PCA0KQkvKiBFbmFibGUgVkxBTiBpbnNlcnQgKi8KKyNkZWZpbmUgRVRIRVZFTlQgICAgICAgICgxIDw8IDUpCS8qIEdlbmVyYXRlICBldmVudCBvbiBjb21wbGV0aW9uICovCisjZGVmaW5lIEVUSENPTVBMRVRFICAgICAoMSA8PCA2KQkvKiBHZW5lcmF0ZSBjb21wbGV0aW9uIHdoZW4gZG9uZSAqLworI2RlZmluZSBJUFNFQyAgICAgICAgICAgKDEgPDwgNykJLyogRW5hYmxlIElQU0VDICovCisjZGVmaW5lIEZPUldBUkQgICAgICAgICAoMSA8PCA4KQkvKiBTZW5kIHRoZSBwYWNrZXQgaW4gZm9yd2FyZGluZyBwYXRoICovCisjZGVmaW5lIEZJTiAgICAgICAgICAgICAoMSA8PCA5KQkvKiBJc3N1ZSBGSU4gc2VnbWVudCAqLworCisjZGVmaW5lIEJFX01BWF9NVFUJODk3NAorCisjZGVmaW5lIEJFX01BWF9MUk9fREVTQ1JJUFRPUlMJCQk4CisjZGVmaW5lIEJFX0xST19NQVhfUEtUUwkJCQk2NAorI2RlZmluZSBCRV9NQVhfRlJBR1NfUEVSX0ZSQU1FCQkJNgorCitleHRlcm4gY29uc3QgY2hhciBiZV9kcnZyX3ZlcltdOworZXh0ZXJuIGNoYXIgYmVfZndfdmVyW107CitleHRlcm4gY2hhciBiZV9kcml2ZXJfbmFtZVtdOworCitleHRlcm4gc3RydWN0IGV0aHRvb2xfb3BzIGJlX2V0aHRvb2xfb3BzOworCisjZGVmaW5lIEJFX0RFVl9TVEFURV9OT05FIDAKKyNkZWZpbmUgQkVfREVWX1NUQVRFX0lOSVQgMQorI2RlZmluZSBCRV9ERVZfU1RBVEVfT1BFTiAyCisjZGVmaW5lIEJFX0RFVl9TVEFURV9TVVNQRU5EIDMKKworLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBkZXNjcmliZSBwaHlzaWNhbCBmcmFnbWVudHMgdG8gdXNlCisgKiBmb3IgRE1BaW5nIGRhdGEgZnJvbSBOSUMuCisgKi8KK3N0cnVjdCBiZV9yZWN2X2J1ZmZlciB7CisJc3RydWN0IGxpc3RfaGVhZCByeGJfbGlzdDsJLyogZm9yIG1haW50YWluaW5nIGEgbGlua2VkIGxpc3QgKi8KKwl2b2lkICpyeGJfdmE7CQkvKiBidWZmZXIgdmlydHVhbCBhZGRyZXNzICovCisJdTMyIHJ4Yl9wYV9sbzsJCS8qIGxvdyBwYXJ0IG9mIHBoeXNpY2FsIGFkZHJlc3MgKi8KKwl1MzIgcnhiX3BhX2hpOwkJLyogaGlnaCBwYXJ0IG9mIHBoeXNpY2FsIGFkZHJlc3MgKi8KKwl1MzIgcnhiX2xlbjsJCS8qIGxlbmd0aCBvZiByZWN2IGJ1ZmZlciAqLworCXZvaWQgKnJ4Yl9jdHh0OwkJLyogY29udGV4dCBmb3IgT1NNIGRyaXZlciB0byB1c2UgKi8KK307CisKKy8qCisgKiBmcmFnbWVudCBsaXN0IHRvIGRlc2NyaWJlIHNjYXR0ZXJlZCBkYXRhLgorICovCitzdHJ1Y3QgYmVfdHhfZnJhZ19saXN0IHsKKwl1MzIgdHhiX2xlbjsJCS8qIFNpemUgb2YgdGhpcyBmcmFnbWVudCAqLworCXUzMiB0eGJfcGFfbG87CQkvKiBMb3dlciAzMiBiaXRzIG9mIDY0IGJpdCBwaHlzaWNhbCBhZGRyICovCisJdTMyIHR4Yl9wYV9oaTsJCS8qIEhpZ2hlciAzMiBiaXRzIG9mIDY0IGJpdCBwaHlzaWNhbCBhZGRyICovCit9OworCitzdHJ1Y3QgYmVfcnhfcGFnZV9pbmZvIHsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlkbWFfYWRkcl90IGJ1czsKKwl1MTYgcGFnZV9vZmZzZXQ7Cit9OworCisvKgorICogIFRoaXMgc3RydWN0dXJlIGlzIHRoZSBtYWluIHRyYWNraW5nIHN0cnVjdHVyZSBmb3IgYSBOSUMgaW50ZXJmYWNlLgorICovCitzdHJ1Y3QgYmVfbmV0X29iamVjdCB7CisJLyogTUNDIFJpbmcgLSB1c2VkIHRvIHNlbmQgZndjbWRzIHRvIGVtYmVkZGVkIEFSTSBwcm9jZXNzb3IgKi8KKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICptY2NfcTsJLyogVkEgb2YgdGhlIHN0YXJ0IG9mIHRoZSByaW5nICovCisJdTMyIG1jY19xX2xlbjsJCQkvKiAjIG9mIFdSQiBlbnRyaWVzIGluIHRoaXMgcmluZyAqLworCXUzMiBtY2NfcV9zaXplOworCXUzMiBtY2NfcV9oZDsJCQkvKiBNQ0MgcmluZyBoZWFkICovCisJdTggbWNjX3FfY3JlYXRlZDsJCS8qIGZsYWcgdG8gaGVscCBjbGVhbnVwICovCisJc3RydWN0IGJlX21jY19vYmplY3QgbWNjX3Ffb2JqOwkvKiBCRUNMSUIncyBNQ0MgcmluZyBPYmplY3QgKi8KKwlkbWFfYWRkcl90IG1jY19xX2J1czsJCS8qIERNQSdibGUgYnVzIGFkZHJlc3MgKi8KKworCS8qIE1DQyBDb21wbGV0aW9uIFJpbmcgLSBGVyByZXNwb25zZXMgdG8gZndjbWRzIHNlbnQgZnJvbSBNQ0MgcmluZyAqLworCXN0cnVjdCBNQ0NfQ1FfRU5UUllfQU1BUCAqbWNjX2NxOyAvKiBWQSBvZiB0aGUgc3RhcnQgb2YgdGhlIHJpbmcgKi8KKwl1MzIgbWNjX2NxX2xlbjsJCQkvKiAjIG9mIGNvbXBsLiBlbnRyaWVzIGluIHRoaXMgcmluZyAqLworCXUzMiBtY2NfY3Ffc2l6ZTsKKwl1MzIgbWNjX2NxX3RsOwkJCS8qIGNvbXBsLiByaW5nIHRhaWwgKi8KKwl1OCBtY2NfY3FfY3JlYXRlZDsJCS8qIGZsYWcgdG8gaGVscCBjbGVhbnVwICovCisJc3RydWN0IGJlX2NxX29iamVjdCBtY2NfY3Ffb2JqOwkvKiBCRUNMSUIncyBNQ0MgY29tcGwuIHJpbmcgb2JqZWN0ICovCisJdTMyIG1jY19jcV9pZDsJCQkvKiBNQ0MgcmluZyBJRCAqLworCWRtYV9hZGRyX3QgbWNjX2NxX2J1czsJCS8qIERNQSdibGUgYnVzIGFkZHJlc3MgKi8KKworCXN0cnVjdCByaW5nX2Rlc2MgbWJfcmQ7CQkvKiBSRCBmb3IgTUNDX01BSUxfQk9YICovCisJdm9pZCAqbWJfcHRyOwkJCS8qIG1haWxib3ggcHRyIHRvIGJlIGZyZWVkICAqLworCWRtYV9hZGRyX3QgbWJfYnVzOwkJLyogRE1BJ2JsZSBidXMgYWRkcmVzcyAqLworCXUzMiBtYl9zaXplOworCisJLyogQkVDbGliIHVzZXMgYW4gYXJyYXkgb2YgY29udGV4dCBvYmplY3RzIHRvIHRyYWNrIG91dHN0YW5kaW5nCisJICogcmVxdWVzdHMgdG8gdGhlIE1DQy4gIFdlIG5lZWQgYWxsb2NhdGUgdGhlIHNhbWUgbnVtYmVyIG9mCisJICogY29uZXh0IGVudHJpZXMgYXMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBNQ0MgV1JCIHJpbmcKKwkgKi8KKwl1MzIgbWNjX3dyYl9jdHh0X3NpemU7CisJdm9pZCAqbWNjX3dyYl9jdHh0OwkJLyogcG9pbnRlciB0byB0aGUgY29udGV4dCBhcmVhICovCisJdTMyIG1jY193cmJfY3R4dExlbjsJCS8qIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBjb250ZXh0ICovCisJLyoKKwkgKiBOSUMgc2VuZCByZXF1ZXN0IHJpbmcgLSB1c2VkIGZvciB4bWl0dGluZyByYXcgZXRoZXIgZnJhbWVzLgorCSAqLworCXN0cnVjdCBFVEhfV1JCX0FNQVAgKnR4X3E7CS8qIFZBIG9mIHRoZSBzdGFydCBvZiB0aGUgcmluZyAqLworCXUzMiB0eF9xX2xlbjsJCQkvKiAjIGlmIGVudHJpZXMgaW4gdGhlIHNlbmQgcmluZyAqLworCXUzMiB0eF9xX3NpemU7CisJdTMyIHR4X3FfaGQ7CQkJLyogSGVhZCBpbmRleC4gTmV4dCByZXEuIGdvZXMgaGVyZSAqLworCXUzMiB0eF9xX3RsOwkJCS8qIFRhaWwgaW5keC4gb2xkZXN0IG91dHN0YW5kaW5nIHJlcS4gKi8KKwl1OCB0eF9xX2NyZWF0ZWQ7CQkvKiBmbGFnIHRvIGhlbHAgY2xlYW51cCAqLworCXN0cnVjdCBiZV9ldGhzcV9vYmplY3QgdHhfcV9vYmo7LyogQkVDTElCJ3Mgc2VuZCBRIGhhbmRsZSAqLworCWRtYV9hZGRyX3QgdHhfcV9idXM7CQkvKiBETUEnYmxlIGJ1cyBhZGRyZXNzICovCisJdTMyIHR4X3FfaWQ7CQkJLyogc2VuZCBxdWV1ZSByaW5nIElEICovCisJdTMyIHR4X3FfcG9ydDsJCQkvKiAwIG5vIGJpbmRpbmcsIDEgcG9ydCBBLCAgMiBwb3J0IEIgKi8KKwlhdG9taWNfdCB0eF9xX3VzZWQ7CQkvKiAjIG9mIFdSQnMgdXNlZCAqLworCS8qIHB0ciB0byBhbiBhcnJheSBpbiB3aGljaCB3ZSBzdG9yZSBjb250ZXh0IGluZm8gZm9yIGVhY2ggc2VuZCByZXEuICovCisJdm9pZCAqKnR4X2N0eHQ7CisJLyoKKwkgKiBOSUMgU2VuZCBjb21wbC4gcmluZyAtIGNvbXBsZXRpb24gc3RhdHVzIGZvciBhbGwgTklDIGZyYW1lcyB4bWl0dGVkLgorCSAqLworCXN0cnVjdCBFVEhfVFhfQ09NUExfQU1BUCAqdHhfY3E7LyogVkEgb2Ygc3RhcnQgb2YgdGhlIHJpbmcgKi8KKwl1MzIgdHhjcV9sZW47CQkJLyogIyBvZiBlbnRyaWVzIGluIHRoZSByaW5nICovCisJdTMyIHR4X2NxX3NpemU7CisJLyoKKwkgKiBpbmRleCBpbnRvIGNvbXBsIHJpbmcgd2hlcmUgdGhlIGhvc3QgZXhwZWN0cyBuZXh0IGNvbXBsZXRpb24gZW50cnkKKwkgKi8KKwl1MzIgdHhfY3FfdGw7CisJdTMyIHR4X2NxX2lkOwkJCS8qIGNvbXBsZXRpb24gcXVldWUgaWQgKi8KKwl1OCB0eF9jcV9jcmVhdGVkOwkJLyogZmxhZyB0byBoZWxwIGNsZWFudXAgKi8KKwlzdHJ1Y3QgYmVfY3Ffb2JqZWN0IHR4X2NxX29iajsKKwlkbWFfYWRkcl90IHR4X2NxX2J1czsJCS8qIERNQSdibGUgYnVzIGFkZHJlc3MgKi8KKwkvKgorCSAqIEV2ZW50IFF1ZXVlIC0gYWxsIGNvbXBsZXRpb24gZW50cmllcyBwb3N0IGV2ZW50cyBoZXJlLgorCSAqLworCXN0cnVjdCBFUV9FTlRSWV9BTUFQICpldmVudF9xOwkvKiBWQSBvZiBzdGFydCBvZiBldmVudCBxdWV1ZSAqLworCXUzMiBldmVudF9xX2xlbjsJCS8qICMgb2YgZW50cmllcyAqLworCXUzMiBldmVudF9xX3NpemU7CisJdTMyIGV2ZW50X3FfdGw7CQkJLyogVGFpbCBvZiB0aGUgZXZlbnQgcXVldWUgKi8KKwl1MzIgZXZlbnRfcV9pZDsJCQkvKiBFdmVudCBxdWV1ZSBJRCAqLworCXU4IGV2ZW50X3FfY3JlYXRlZDsJCS8qIGZsYWcgdG8gaGVscCBjbGVhbnVwICovCisJc3RydWN0IGJlX2VxX29iamVjdCBldmVudF9xX29iajsgLyogUXVldWUgaGFuZGxlICovCisJZG1hX2FkZHJfdCBldmVudF9xX2J1czsJCS8qIERNQSdibGUgYnVzIGFkZHJlc3MgKi8KKwkvKgorCSAqIE5JQyByZWNlaXZlIHF1ZXVlIC0gRGF0YSBidWZmZXJzIHRvIGJlIHVzZWQgZm9yIHJlY2VpdmluZyB1bmljYXN0LAorCSAqIGJyb2FkY2FzdCBhbmQgbXVsdGktY2FzdCBmcmFtZXMgIGFyZSBwb3N0ZWQgaGVyZS4KKwkgKi8KKwlzdHJ1Y3QgRVRIX1JYX0RfQU1BUCAqcnhfcTsJLyogVkEgb2Ygc3RhcnQgb2YgdGhlIHF1ZXVlICovCisJdTMyIHJ4X3FfbGVuOwkJCS8qICMgb2YgZW50cmllcyAqLworCXUzMiByeF9xX3NpemU7CisJdTMyIHJ4X3FfaGQ7CQkJLyogSGVhZCBvZiB0aGUgcXVldWUgKi8KKwlhdG9taWNfdCByeF9xX3Bvc3RlZDsJCS8qIG51bWJlciBvZiBwb3N0ZWQgYnVmZmVycyAqLworCXUzMiByeF9xX2lkOwkJCS8qIHF1ZXVlIElEICovCisJdTggcnhfcV9jcmVhdGVkOwkJLyogZmxhZyB0byBoZWxwIGNsZWFudXAgKi8KKwlzdHJ1Y3QgYmVfZXRocnFfb2JqZWN0IHJ4X3Ffb2JqOwkvKiBOSUMgUlggcXVldWUgaGFuZGxlICovCisJZG1hX2FkZHJfdCByeF9xX2J1czsJCS8qIERNQSdibGUgYnVzIGFkZHJlc3MgKi8KKwkvKgorCSAqIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2Ygb3BhcXVlIGNvbnRleHQgb2JqZWN0IGZvciB1c2UgYnkgT1NNIGRyaXZlcgorCSAqLworCXZvaWQgKipyeF9jdHh0OworCS8qCisJICogTklDIHVuaWNhc3QgUlggY29tcGxldGlvbiBxdWV1ZSAtIGFsbCB1bmljYXN0IGV0aGVyIGZyYW1lIGNvbXBsZXRpb24KKwkgKiBzdGF0dXNlcyBmcm9tIEJFIGNvbWUgaGVyZS4KKwkgKi8KKwlzdHJ1Y3QgRVRIX1JYX0NPTVBMX0FNQVAgKnJ4X2NxOwkvKiBWQSBvZiBzdGFydCBvZiB0aGUgcXVldWUgKi8KKwl1MzIgcnhfY3FfbGVuOwkJLyogIyBvZiBlbnRyaWVzICovCisJdTMyIHJ4X2NxX3NpemU7CisJdTMyIHJ4X2NxX3RsOwkJCS8qIFRhaWwgb2YgdGhlIHF1ZXVlICovCisJdTMyIHJ4X2NxX2lkOwkJCS8qIHF1ZXVlIElEICovCisJdTggcnhfY3FfY3JlYXRlZDsJCS8qIGZsYWcgdG8gaGVscCBjbGVhbnVwICovCisJc3RydWN0IGJlX2NxX29iamVjdCByeF9jcV9vYmo7CS8qIHF1ZXVlIGhhbmRsZSAqLworCWRtYV9hZGRyX3QgcnhfY3FfYnVzOwkJLyogRE1BJ2JsZSBidXMgYWRkcmVzcyAqLworCXN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgZm5fb2JqOwkvKiBmdW5jdGlvbiBvYmplY3QgICAqLworCWJvb2wJZm5fb2JqX2NyZWF0ZWQ7CisJdTMyIHJ4X2J1Zl9zaXplOwkJLyogU2l6ZSBvZiB0aGUgUlggYnVmZmVycyAqLworCisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3QgYmVfcmVjdl9idWZmZXIgZXRoX3J4X2J1ZnNbMjU2XTsJLyogdG8gcGFzcyBSeCBidWZmZXIKKwkJCQkJCQkgICBhZGRyZXNzZXMgKi8KKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcjsJLyogUG9pbnRlciB0byBPU00gYWRhcHRlciAqLworCXUzMiBkZXZubzsJCS8qIE9TTSwgbmV0d29yayBkZXYgbm8uICovCisJdTMyIHVzZV9wb3J0OwkJLyogQ3VycmVudCBhY3RpdmUgcG9ydCAqLworCXN0cnVjdCBiZV9yeF9wYWdlX2luZm8gKnJ4X3BhZ2VfaW5mbzsJLyogQXJyYXkgb2YgUnggYnVmIHBhZ2VzICovCisJdTMyIHJ4X3BnX2luZm9faGQ7CS8qIEhlYWQgb2YgcXVldWUgKi8KKwlpbnQgcnhidWZfcG9zdF9mYWlsOwkvKiBSeEJ1ZmYgcG9zdGluZyBmYWlsIGNvdW50ICovCisJYm9vbCByeF9wZ19zaGFyZWQ7CS8qIElzIGFuIGFsbG9jc3RlZCBwYWdlIHNoYXJlZCBhcyB0d28gZnJhZ3MgPyAqLworCXN0cnVjdCB2bGFuX2dyb3VwICp2bGFuX2dycDsKKwl1MzIgbnVtX3ZsYW5zOwkJLyogTnVtYmVyIG9mIHZsYW5zIGluIEJFJ3MgZmlsdGVyICovCisJdTE2IHZsYW5fdGFnW0JFX05VTV9WTEFOX1NVUFBPUlRFRF07IC8qIHZsYW5zIGN1cnJlbnRseSBjb25maWd1cmVkICovCisJc3RydWN0IG5hcGlfc3RydWN0IG5hcGk7CisJc3RydWN0IG5ldF9scm9fbWdyIGxyb19tZ3I7CisJc3RydWN0IG5ldF9scm9fZGVzYyBscm9fZGVzY1tCRV9NQVhfTFJPX0RFU0NSSVBUT1JTXTsKK307CisKKyNkZWZpbmUgTkVUX0ZIKG5wKSAgICAgICAoJihucCktPmZuX29iaikKKworLyoKKyAqIEJFIGRyaXZlciBzdGF0aXN0aWNzLgorICovCitzdHJ1Y3QgYmVfZHJ2cl9zdGF0IHsKKwl1MzIgYmVzX3R4X3JlcXM7CS8qIG51bWJlciBvZiBUWCByZXF1ZXN0cyBpbml0aWF0ZWQgKi8KKwl1MzIgYmVzX3R4X2ZhaWxzOwkvKiBudW1iZXIgb2YgVFggcmVxdWVzdHMgdGhhdCBmYWlsZWQgKi8KKwl1MzIgYmVzX2Z3ZF9yZXFzOwkvKiBudW1iZXIgb2Ygc2VuZCByZXFzIHRocm91Z2ggZm9yd2FyZGluZyBpL2YgKi8KKwl1MzIgYmVzX3R4X3dyYnM7CS8qIG51bWJlciBvZiB0eCBXUkJzIHVzZWQgKi8KKworCXUzMiBiZXNfaW50czsJCS8qIG51bWJlciBvZiBpbnRlcnJ1cHRzICovCisJdTMyIGJlc19wb2xsczsJCS8qIG51bWJlciBvZiB0aW1lcyBOQVBJIGNhbGxlZCBwb2xsIGZ1bmN0aW9uICovCisJdTMyIGJlc19ldmVudHM7CQkvKiB0b3RhbCBldmV0IGVudHJpZXMgcHJvY2Vzc2VkICovCisJdTMyIGJlc190eF9ldmVudHM7CS8qIG51bWJlciBvZiB0eCBjb21wbGV0aW9uIGV2ZW50cyAgKi8KKwl1MzIgYmVzX3J4X2V2ZW50czsJLyogbnVtYmVyIG9mIHVjYXN0IHJ4IGNvbXBsZXRpb24gZXZlbnRzICAqLworCXUzMiBiZXNfdHhfY29tcGw7CS8qIG51bWJlciBvZiB0eCBjb21wbGV0aW9uIGVudHJpZXMgcHJvY2Vzc2VkICovCisJdTMyIGJlc19yeF9jb21wbDsJLyogbnVtYmVyIG9mIHJ4IGNvbXBsZXRpb24gZW50cmllcworCQkJCSAgIHByb2Nlc3NlZCAqLworCXUzMiBiZXNfZXRocnhfcG9zdF9mYWlsOwkvKiBudW1iZXIgb2YgZXRocnggYnVmZmVyIGFsbG9jCisJCQkJCSAgIGZhaWx1cmVzICovCisJLyoKKwkgKiBudW1iZXIgb2Ygbm9uIGV0aGVyIHR5cGUgSUkgZnJhbWVzIGRyb3BwZWQgd2hlcmUKKwkgKiBmcmFtZSBsZW4gPiBsZW5ndGggZmllbGQgb2YgTWFjIEhkcgorCSAqLworCXUzMiBiZXNfODAyXzNfZHJvcHBlZF9mcmFtZXM7CisJLyoKKwkgKiBudW1iZXIgb2Ygbm9uIGV0aGVyIHR5cGUgSUkgZnJhbWVzIG1hbGZvcm1lZCB3aGVyZQorCSAqIGluIGZyYW1lIGxlbiA8IGxlbmd0aCBmaWVsZCBvZiBNYWMgSGRyCisJICovCisJdTMyIGJlc184MDJfM19tYWxmb3JtZWRfZnJhbWVzOworCXUzMiBiZXNfaXBzOwkJLyogIGludGVycnVwdHMgLyBzZWMgKi8KKwl1MzIgYmVzX3ByZXZfaW50czsJLyogYmVzX2ludHMgYXQgbGFzdCBJUFMgY2FsY3VsYXRpb24gICovCisJdTE2IGJlc19ldGhfdHhfcmF0ZTsJLyogIEVUSCBUWCByYXRlIC0gTWIvc2VjICovCisJdTE2IGJlc19ldGhfcnhfcmF0ZTsJLyogIEVUSCBSWCByYXRlIC0gTWIvc2VjICovCisJdTMyIGJlc19yeF9jb2FsOwkvKiBOdW0gcGt0cyBjb2FsYXNjZWQgKi8KKwl1MzIgYmVzX3J4X2ZsdXNoOwkvKiBOdW0gdGltZXMgY29hbGFzY2VkICovCisJdTMyIGJlc19saW5rX2NoYW5nZV9waHlzaWNhbDsJLypOdW0gb2YgdGltZXMgcGh5c2ljYWwgbGluayBjaGFuZ2VkICovCisJdTMyIGJlc19saW5rX2NoYW5nZV92aXJ0dWFsOwkvKk51bSBvZiB0aW1lcyB2aXJ0dWFsIGxpbmsgY2hhbmdlZCAqLworCXUzMiBiZXNfcnhfbWlzY19wa3RzOwkvKiBNaXNjIHBrdHMgcmVjZWl2ZWQgKi8KK307CisKKy8qIE1heGltdW0gaW50ZXJydXB0IGRlbGF5IChpbiBtaWNyb3NlY29uZHMpIGFsbG93ZWQgKi8KKyNkZWZpbmUgTUFYX0VRRAkJCQkxMjAKKworLyoKKyAqIHRpbWVyIHRvIHByZXZlbnQgc3lzdGVtIHNodXRkb3duIGhhbmcgZm9yIGV2ZXIgaWYgaC93IHN0b3BzIHJlc3BvbmRpbmcKKyAqLworc3RydWN0IGJlX3RpbWVyX2N0eHQgeworCWF0b21pY190IGdldF9zdGF0X2ZsYWc7CisJc3RydWN0IHRpbWVyX2xpc3QgZ2V0X3N0YXRzX3RpbWVyOworCXVuc2lnbmVkIGxvbmcgZ2V0X3N0YXRfc2VtX2FkZHI7Cit9IDsKKworLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdGhlIG1haW4gQmxhZGVFbmdpbmUgZHJpdmVyIGNvbnRleHQuICAqLworc3RydWN0IGJlX2FkYXB0ZXIgeworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXZwOworCXN0cnVjdCBiZV9kcnZyX3N0YXQgYmVfc3RhdDsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBiZW5ldF9zdGF0czsKKworCS8qIFBDSSBCQVIgbWFwcGVkIGFkZHJlc3NlcyAqLworCXU4IF9faW9tZW0gKmNzcl92YTsJLyogQ1NSICovCisJdTggX19pb21lbSAqZGJfdmE7CS8qIERvb3IgIEJlbGwgICovCisJdTggX19pb21lbSAqcGNpX3ZhOwkvKiBQQ0kgQ29uZmlnICovCisKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3Qgc3RzX2hhbmRsZXI7CisJc3RydWN0IHRpbWVyX2xpc3QgY3FfdGltZXI7CisJc3BpbmxvY2tfdCBpbnRfbG9jazsJLyogdG8gcHJvdGVjdCB0aGUgaXNyIGZpZWxkIGluIGFkYXB0ZXIgKi8KKworCXN0cnVjdCBGV0NNRF9FVEhfR0VUX1NUQVRJU1RJQ1MgKmV0aF9zdGF0c3A7CisJLyoKKwkgKiBUaGlzIHdpbGwgZW5hYmxlIHRoZSB1c2Ugb2YgZXRodG9vbCB0byBlbmFibGUgb3IgZGlzYWJsZQorCSAqIENoZWNrc3VtIG9uIFJ4IHBrdHMgdG8gYmUgb2JleWVkIG9yIGRpc29iZXllZC4KKwkgKiBJZiB0aGlzIGlzIHRydWUgPSAxLCB0aGVuIHdoYXRldmVyIGlzIHRoZSBjaGVja3N1bSBvbiB0aGUKKwkgKiBSZWNlaXZlZCBwa3QgYXMgcGVyIEJFLCBpdCB3aWxsIGJlIGdpdmVuIHRvIHRoZSBzdGFjay4KKwkgKiBFbHNlIHRoZSBzdGFjayB3aWxsIHJlIGNhbGN1bGF0ZSBpdC4KKwkgKi8KKwlib29sIHJ4X2NzdW07CisJLyoKKwkgKiBUaGlzIHdpbGwgZW5hYmxlIHRoZSB1c2Ugb2YgZXRodG9vbCB0byBlbmFibGUgb3IgZGlzYWJsZQorCSAqIENvYWxlc2Ugb24gUnggcGt0cyB0byBiZSBvYmV5ZWQgb3IgZGlzb2JleWVkLgorCSAqIElmIHRoaXMgaXMgZ3JhdGVyIHRoYW4gMCBhbmQgbGVzcyB0aGFuIDE2IHRoZW4gY29hbGFzY2luZworCSAqIGlzIGVuYWJsZWQgZWxzZSBpdCBpcyBkaXNhYmxlZAorCSAqLworCXUzMiBtYXhfcnhfY29hbDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsJLyogUG9pbnRlciB0byBPUydzIFBDSSBkdmljZSAqLworCisJc3BpbmxvY2tfdCB0eHFfbG9jazsJLyogdG8gc3RvcC93YWtlIHF1ZXVlIGJhc2VkIG9uIHR4X3FfdXNlZCAqLworCisJdTMyIGlzcjsJCS8qIGNvcHkgb2YgSW50ciBzdGF0dXMgcmVnLiAqLworCisJdTMyIHBvcnQwX2xpbmtfc3RzOwkvKiBQb3J0IDAgbGluayBzdGF0dXMgKi8KKwl1MzIgcG9ydDFfbGlua19zdHM7CS8qIHBvcnQgMSBsaXN0IHN0YXR1cyAqLworCXN0cnVjdCBCRV9MSU5LX1NUQVRVUyAqYmVfbGlua19zdHM7CisKKwkvKiBwb2ludGVyIHRvIHRoZSBmaXJzdCBuZXRvYmplY3Qgb2YgdGhpcyBhZGFwdGVyICovCisJc3RydWN0IGJlX25ldF9vYmplY3QgKm5ldF9vYmo7CisKKwkvKiAgRmxhZ3MgdG8gaW5kaWNhdGUgd2hhdCB0byBjbGVhbiB1cCAqLworCWJvb2wgdGFza2xldF9zdGFydGVkOworCWJvb2wgaXNyX3JlZ2lzdGVyZWQ7CisJLyoKKwkgKiBhZGFwdGl2ZSBpbnRlcnJ1cHQgY29hbGVzY2luZyAoQUlDKSByZWxhdGVkCisJICovCisJYm9vbCBlbmFibGVfYWljOwkvKiAxIGlmIEFJQyBpcyBlbmFibGVkICovCisJdTE2IG1pbl9lcWQ7CQkvKiBtaW5pbXVtIEVRIGRlbGF5IGluIHVzZWMgKi8KKwl1MTYgbWF4X2VxZDsJCS8qIG1pbmltdW0gRVEgZGVsYXkgaW4gdXNlYyAqLworCXUxNiBjdXJfZXFkOwkJLyogY3VycmVudCBFUSBkZWxheSBpbiB1c2VjICovCisJLyoKKwkgKiBib29rIGtlZXBpbmcgZm9yIGludGVycnVwdCAvIHNlYyBhbmQgVFgvUlggcmF0ZSBjYWxjdWxhdGlvbgorCSAqLworCXVsb25nIGlwc19qaWZmaWVzOwkvKiBqaWZmaWVzIGF0IGxhc3QgSVBTIGNhbGMgKi8KKwl1MzIgZXRoX3R4X2J5dGVzOworCXVsb25nIGV0aF90eF9qaWZmaWVzOworCXUzMiBldGhfcnhfYnl0ZXM7CisJdWxvbmcgZXRoX3J4X2ppZmZpZXM7CisKKwlzdHJ1Y3Qgc2VtYXBob3JlIGdldF9ldGhfc3RhdF9zZW07CisKKwkvKiB0aW1lciBjdHh0IHRvIHByZXZlbnQgc2h1dGRvd24gaGFuZ2luZyBkdWUgdG8gdW4tcmVzcG9uc2l2ZSBCRSAqLworCXN0cnVjdCBiZV90aW1lcl9jdHh0IHRpbWVyX2N0eHQ7CisKKyNkZWZpbmUgQkVfTUFYX01TSVhfVkVDVE9SUyAgICAgICAgICAgICAzMgorI2RlZmluZSBCRV9NQVhfUkVRX01TSVhfVkVDVE9SUyAgICAgICAgIDEgLyogb25seSBvbmUgRVEgaW4gTGludXggZHJpdmVyICovCisJc3RydWN0IG1zaXhfZW50cnkgbXNpeF9lbnRyaWVzW0JFX01BWF9NU0lYX1ZFQ1RPUlNdOworCWJvb2wgbXNpeF9lbmFibGVkOworCWJvb2wgZG1hXzY0Yml0X2NhcDsJLyogdGhlIERldmljZSBEQUMgY2FwYWJsZSAgb3Igbm90ICovCisJdTggZGV2X3N0YXRlOwkvKiBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgZGV2aWNlICovCisJdTggZGV2X3BtX3N0YXRlOyAvKiBUaGUgU3RhdGUgb2YgZGV2aWNlIGJlZm9yZSBnb2luZyB0byBzdXNwZW5kICovCit9OworCisvKgorICogRXZlcnkgc2Vjb25kIHdlIGxvb2sgYXQgdGhlIGludHMvc2VjIGFuZCBhZGp1c3QgZXFfZGVsYXkKKyAqIGJldHdlZW4gYWRhcHRlci0+bWluX2VxZCBhbmQgYWRhcHRlci0+bWF4X2VxZCB0byBrZWVwIHRoZSBpbnRzL3NlYyBiZXR3ZWVuCisgKiBJUFNfSElfV00gYW5kIElQU19MT19XTS4KKyAqLworI2RlZmluZSBJUFNfSElfV00JMTgwMDAKKyNkZWZpbmUgSVBTX0xPX1dNCTgwMDAKKworCitzdGF0aWMgaW5saW5lIHZvaWQgaW5kZXhfYWR2KHUzMiAqaW5kZXgsIHUzMiB2YWwsICB1MzIgbGltaXQpCit7CisJQlVHX09OKGxpbWl0ICYgKGxpbWl0LTEpKTsKKwkqaW5kZXggPSAoKmluZGV4ICsgdmFsKSAmIChsaW1pdCAtIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW5kZXhfaW5jKHUzMiAqaW5kZXgsIHUzMiBsaW1pdCkKK3sKKwlCVUdfT04obGltaXQgJiAobGltaXQtMSkpOworCSppbmRleCA9ICgqaW5kZXggKyAxKSAmIChsaW1pdCAtIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmVfYWR2X2VxX3RsKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iKQoreworCWluZGV4X2luYygmcG5vYi0+ZXZlbnRfcV90bCwgcG5vYi0+ZXZlbnRfcV9sZW4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmVfYWR2X3R4cV9oZChzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYikKK3sKKwlpbmRleF9pbmMoJnBub2ItPnR4X3FfaGQsIHBub2ItPnR4X3FfbGVuKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJlX2Fkdl90eHFfdGwoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJaW5kZXhfaW5jKCZwbm9iLT50eF9xX3RsLCBwbm9iLT50eF9xX2xlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiZV9hZHZfdHhjcV90bChzdHJ1Y3QgYmVfbmV0X29iamVjdCAqcG5vYikKK3sKKwlpbmRleF9pbmMoJnBub2ItPnR4X2NxX3RsLCBwbm9iLT50eGNxX2xlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiZV9hZHZfcnhxX2hkKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iKQoreworCWluZGV4X2luYygmcG5vYi0+cnhfcV9oZCwgcG5vYi0+cnhfcV9sZW4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmVfYWR2X3J4Y3FfdGwoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IpCit7CisJaW5kZXhfaW5jKCZwbm9iLT5yeF9jcV90bCwgcG5vYi0+cnhfY3FfbGVuKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgdHhfY29tcGxfbGFzdHdyYl9pZHhfZ2V0KHN0cnVjdCBiZV9uZXRfb2JqZWN0ICpwbm9iKQoreworCXJldHVybiAocG5vYi0+dHhfcV90bCArICoodTMyICopJnBub2ItPnR4X2N0eHRbcG5vYi0+dHhfcV90bF0gLSAxKQorCQkgICAgJiAocG5vYi0+dHhfcV9sZW4gLSAxKTsKK30KKworaW50IGJlbmV0X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKik7CitpbnQgYmVfZXRodG9vbF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgaWZyZXEgKik7CitzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYmVuZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICopOwordm9pZCBiZV9wcm9jZXNzX2ludHIodW5zaWduZWQgbG9uZyBjb250ZXh0KTsKK2lycXJldHVybl90IGJlX2ludChpbnQgaXJxLCB2b2lkICpkZXYpOwordm9pZCBiZV9wb3N0X2V0aF9yeF9idWZmcyhzdHJ1Y3QgYmVfbmV0X29iamVjdCAqKTsKK3ZvaWQgYmVfZ2V0X3N0YXRfY2Iodm9pZCAqLCBpbnQsIHN0cnVjdCBNQ0NfV1JCX0FNQVAgKik7Cit2b2lkIGJlX2dldF9zdGF0c190aW1lcl9oYW5kbGVyKHVuc2lnbmVkIGxvbmcpOwordm9pZCBiZV93YWl0X25pY190eF9jbXBseF9jbXBsKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICopOwordm9pZCBiZV9wcmludF9saW5rX2luZm8oc3RydWN0IEJFX0xJTktfU1RBVFVTICopOwordm9pZCBiZV91cGRhdGVfbGlua19zdGF0dXMoc3RydWN0IGJlX2FkYXB0ZXIgKik7Cit2b2lkIGJlX2luaXRfcHJvY2ZzKHN0cnVjdCBiZV9hZGFwdGVyICopOwordm9pZCBiZV9jbGVhbnVwX3Byb2NmcyhzdHJ1Y3QgYmVfYWRhcHRlciAqKTsKK2ludCBiZV9wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqLCBpbnQpOworc3RydWN0IEVUSF9SWF9DT01QTF9BTUFQICpiZV9nZXRfcnhfY21wbChzdHJ1Y3QgYmVfbmV0X29iamVjdCAqKTsKK3ZvaWQgYmVfbm90aWZ5X2NtcGwoc3RydWN0IGJlX25ldF9vYmplY3QgKiwgaW50LCBpbnQsIGludCk7Cit2b2lkIGJlX2VuYWJsZV9pbnRyKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICopOwordm9pZCBiZV9lbmFibGVfZXFfaW50cihzdHJ1Y3QgYmVfbmV0X29iamVjdCAqKTsKK3ZvaWQgYmVfZGlzYWJsZV9pbnRyKHN0cnVjdCBiZV9uZXRfb2JqZWN0ICopOwordm9pZCBiZV9kaXNhYmxlX2VxX2ludHIoc3RydWN0IGJlX25ldF9vYmplY3QgKik7CitpbnQgYmVfc2V0X3VjX21hY19hZHIoc3RydWN0IGJlX25ldF9vYmplY3QgKiwgdTgsIHU4LCB1OCwKKwkJICAgIHU4ICosIG1jY193cmJfY3FlX2NhbGxiYWNrLCB2b2lkICopOworaW50IGJlX2dldF9mbG93X2N0bChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwRm5PYmosIGJvb2wgKiwgYm9vbCAqKTsKK3ZvaWQgcHJvY2Vzc19vbmVfdHhfY29tcGwoc3RydWN0IGJlX25ldF9vYmplY3QgKnBub2IsIHUzMiBlbmRfaWR4KTsKKworI2VuZGlmIC8qIF9CRU5FVF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Jlc3RhdHVzLmggYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvYmVzdGF0dXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWM3YTRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Jlc3RhdHVzLmgKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKyNpZm5kZWYgX0JFU1RBVFVTX0hfCisjZGVmaW5lIF9CRVNUQVRVU19IXworCisjZGVmaW5lIEJFX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBMKQorLyoKKyAqIE1lc3NhZ2VJZDogQkVfUEVORElORworICogIFRoZSBCbGFkZUVuZ2luZSBEcml2ZXIgY2FsbCBzdWNjZWVkZWQsIGFuZCBwZW5kZWQgb3BlcmF0aW9uLgorICovCisjZGVmaW5lIEJFX1BFTkRJTkcgICAgICAgICAgICAgICAgICAgICAgICgweDIwMDcwMDAxTCkKKyNkZWZpbmUgQkVfU1RBVFVTX1BFTkRJTkcgICAgICAgICAgICAgICAgKEJFX1BFTkRJTkcpCisvKgorICogTWVzc2FnZUlkOiBCRV9OT1RfT0sKKyAqICBBbiBlcnJvciBvY2N1cnJlZC4KKyAqLworI2RlZmluZSBCRV9OT1RfT0sgICAgICAgICAgICAgICAgICAgICAgICAoMHhFMDA3MDAwMkwpCisvKgorICogTWVzc2FnZUlkOiBCRV9TVEFUVVNfU1lTVEVNX1JFU09VUkNFUworICogIEluc3VmZmljaWVudCBob3N0IHN5c3RlbSByZXNvdXJjZXMgZXhpc3QgdG8gY29tcGxldGUgdGhlIEFQSS4KKyAqLworI2RlZmluZSBCRV9TVEFUVVNfU1lTVEVNX1JFU09VUkNFUyAgICAgICAoMHhFMDA3MDAwM0wpCisvKgorICogTWVzc2FnZUlkOiBCRV9TVEFUVVNfQ0hJUF9SRVNPVVJDRVMKKyAqICBJbnN1ZmZpY2llbnQgY2hpcCByZXNvdXJjZXMgZXhpc3QgdG8gY29tcGxldGUgdGhlIEFQSS4KKyAqLworI2RlZmluZSBCRV9TVEFUVVNfQ0hJUF9SRVNPVVJDRVMgICAgICAgICAoMHhFMDA3MDAwNEwpCisvKgorICogTWVzc2FnZUlkOiBCRV9TVEFUVVNfTk9fUkVTT1VSQ0UKKyAqICBJbnN1ZmZpY2llbnQgcmVzb3VyY2VzIHRvIGNvbXBsZXRlIHJlcXVlc3QuCisgKi8KKyNkZWZpbmUgQkVfU1RBVFVTX05PX1JFU09VUkNFICAgICAgICAgICAgKDB4RTAwNzAwMDVMKQorLyoKKyAqIE1lc3NhZ2VJZDogQkVfU1RBVFVTX0JVU1kKKyAqICBSZXNvdXJjZSBpcyBjdXJyZW50bHkgYnVzeS4KKyAqLworI2RlZmluZSBCRV9TVEFUVVNfQlVTWSAgICAgICAgICAgICAgICAgICAoMHhFMDA3MDAwNkwpCisvKgorICogTWVzc2FnZUlkOiBCRV9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVIKKyAqICBJbnZhbGlkIFBhcmFtZXRlciBpbiByZXF1ZXN0LgorICovCisjZGVmaW5lIEJFX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUiAgICAgICgweEUwMDAwMDA3TCkKKy8qCisgKiBNZXNzYWdlSWQ6IEJFX1NUQVRVU19OT1RfU1VQUE9SVEVECisgKiAgUmVxdWVzdGVkIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkLgorICovCisjZGVmaW5lIEJFX1NUQVRVU19OT1RfU1VQUE9SVEVEICAgICAgICAgICgweEUwMDAwMDBETCkKKworLyoKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICBFIFQgSCBFIFIgTiBFIFQgICBTIFQgQSBUIFUgUworICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoKKyAqIE1lc3NhZ2VJZDogQkVfRVRIX1RYX0VSUk9SCisgKiAgVGhlIEV0aGVybmV0IGRldmljZSBkcml2ZXIgZmFpbGVkIHRvIHRyYW5zbWl0IGEgcGFja2V0LgorICovCisjZGVmaW5lIEJFX0VUSF9UWF9FUlJPUiAgICAgICAgICAgICAgICAgICgweEUwMDcwMTAxTCkKKworLyoKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICBTIEggQSBSIEUgRCAgIFMgVCBBIFQgVSBTCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKgorICogTWVzc2FnZUlkOiBCRV9TVEFUVVNfVkJEX0lOVkFMSURfVkVSU0lPTgorICogIFRoZSBkZXZpY2UgZHJpdmVyIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhpcyB2ZXJzaW9uIG9mIHRoZSBWQkQuCisgKi8KKyNkZWZpbmUgQkVfU1RBVFVTX0lOVkFMSURfVkVSU0lPTiAgICAoMHhFMDA3MDQwMkwpCisvKgorICogTWVzc2FnZUlkOiBCRV9TVEFUVVNfRE9NQUlOX0RFTklFRAorICogIFRoZSBvcGVyYXRpb24gZmFpbGVkIHRvIGNvbXBsZXRlIGR1ZSB0byBpbnN1ZmZpY2llbnQgYWNjZXNzCisgKiAgcmlnaHRzIGZvciB0aGUgcmVxdWVzdGluZyBkb21haW4uCisgKi8KKyNkZWZpbmUgQkVfU1RBVFVTX0RPTUFJTl9ERU5JRUQgICAgICAgICAgKDB4RTAwNzA0MDNMKQorLyoKKyAqIE1lc3NhZ2VJZDogQkVfU1RBVFVTX1RDUF9OT1RfU1RBUlRFRAorICogIFRoZSBlbWJlZGRlZCBUQ1AvSVAgc3RhY2sgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQuCisgKi8KKyNkZWZpbmUgQkVfU1RBVFVTX1RDUF9OT1RfU1RBUlRFRCAgICAgICAgKDB4RTAwNzA0MDlMKQorLyoKKyAqIE1lc3NhZ2VJZDogQkVfU1RBVFVTX05PX01DQ19XUkIKKyAqICBObyBmcmVlIE1DQyBXUkIgYXJlIGF2YWlsYWJsZSBmb3IgcG9zdGluZyB0aGUgcmVxdWVzdC4KKyAqLworI2RlZmluZSBCRV9TVEFUVVNfTk9fTUNDX1dSQiAgICAgICAgICAgICAgICAgKDB4RTAwNzA0MTRMKQorCisjZW5kaWYgLyogX0JFU1RBVFVTXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Nldi5oIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Nldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwOTk2OTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvY2V2LmgKQEAgLTAsMCArMSwyNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKy8qCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IHNyY2dlbiB2ZXJzaW9uOiAwMTI3CisgKi8KKyNpZm5kZWYgX19jZXZfYW1hcF9oX18KKyNkZWZpbmUgX19jZXZfYW1hcF9oX18KKyNpbmNsdWRlICJlcC5oIgorCisvKgorICogSG9zdCBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyIDAuIFRoZSBmaXJzdCBvZiBmb3VyIGFwcGxpY2F0aW9uCisgKiBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVycy4gVGhpcyByZWdpc3RlciBjb250YWlucyB0aGUgaW50ZXJydXB0cworICogZm9yIEV2ZW50IFF1ZXVlcyBFUTAgdGhyb3VnaCBFUTMxLgorICovCitzdHJ1Y3QgQkVfQ0VWX0lTUjBfQ1NSX0FNQVAgeworCXU4IGludGVycnVwdDA7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDM7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ0OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDY7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ3OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0ODsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDk7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxMDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDExOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTI7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxMzsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDE0OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTU7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxNjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDE3OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTg7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQxOTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDIwOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MjE7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQyMjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDIzOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MjQ7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQyNTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDI2OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0Mjc7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQyODsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDI5OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MzA7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQzMTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBDRVZfSVNSMF9DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyoKKyAqIEhvc3QgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAxLiBUaGUgc2Vjb25kIG9mIGZvdXIgYXBwbGljYXRpb24KKyAqIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXJzLiBUaGlzIHJlZ2lzdGVyIGNvbnRhaW5zIHRoZSBpbnRlcnJ1cHRzCisgKiBmb3IgRXZlbnQgUXVldWVzIEVRMzIgdGhyb3VnaCBFUTYzLgorICovCitzdHJ1Y3QgQkVfQ0VWX0lTUjFfQ1NSX0FNQVAgeworCXU4IGludGVycnVwdDMyOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MzM7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQzNDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDM1OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MzY7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQzNzsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDM4OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0Mzk7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ0MDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDQxOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NDI7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ0MzsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDQ0OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NDU7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ0NjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDQ3OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NDg7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ0OTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDUwOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NTE7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ1MjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDUzOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NTQ7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ1NTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDU2OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NTc7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ1ODsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDU5OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NjA7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ2MTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDYyOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NjM7CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgQ0VWX0lTUjFfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisvKgorICogSG9zdCBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyIDIuIFRoZSB0aGlyZCBvZiBmb3VyIGFwcGxpY2F0aW9uCisgKiBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVycy4gVGhpcyByZWdpc3RlciBjb250YWlucyB0aGUgaW50ZXJydXB0cworICogZm9yIEV2ZW50IFF1ZXVlcyBFUTY0IHRocm91Z2ggRVE5NS4KKyAqLworc3RydWN0IEJFX0NFVl9JU1IyX0NTUl9BTUFQIHsKKwl1OCBpbnRlcnJ1cHQ2NDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDY1OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NjY7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ2NzsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDY4OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0Njk7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ3MDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDcxOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NzI7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ3MzsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDc0OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0NzU7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ3NjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDc3OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0Nzg7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ3OTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDgwOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0ODE7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ4MjsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDgzOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0ODQ7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ4NTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDg2OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0ODc7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ4ODsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDg5OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0OTA7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ5MTsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDkyOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0OTM7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ5NDsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDk1OwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IENFVl9JU1IyX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKgorICogSG9zdCBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyIDMuIFRoZSBmb3VydGggb2YgZm91ciBhcHBsaWNhdGlvbgorICogaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlcnMuIFRoaXMgcmVnaXN0ZXIgY29udGFpbnMgdGhlIGludGVycnVwdHMKKyAqIGZvciBFdmVudCBRdWV1ZXMgRVE5NiB0aHJvdWdoIEVRMTI3LgorICovCitzdHJ1Y3QgQkVfQ0VWX0lTUjNfQ1NSX0FNQVAgeworCXU4IGludGVycnVwdDk2OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0OTc7CS8qIERXT1JEIDAgKi8KKwl1OCBpbnRlcnJ1cHQ5ODsJLyogRFdPUkQgMCAqLworCXU4IGludGVycnVwdDk5OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTAwOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTAxOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTAyOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTAzOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTA0OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTA1OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTA2OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTA3OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTA4OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTA5OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTEwOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTExOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTEyOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTEzOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTE0OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTE1OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTE2OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTE3OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTE4OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTE5OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTIwOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTIxOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTIyOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTIzOwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTI0OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTI1OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTI2OwkvKiBEV09SRCAwICovCisJdTggaW50ZXJydXB0MTI3OwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IENFVl9JU1IzX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiAgQ29tcGxldGlvbnMgYW5kIEV2ZW50cyBibG9jayBSZWdpc3RlcnMuICAqLworc3RydWN0IEJFX0NFVl9DU1JNQVBfQU1BUCB7CisJdTggcnN2ZDBbMzJdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDFbMzJdOwkvKiBEV09SRCAxICovCisJdTggcnN2ZDJbMzJdOwkvKiBEV09SRCAyICovCisJdTggcnN2ZDNbMzJdOwkvKiBEV09SRCAzICovCisJc3RydWN0IEJFX0NFVl9JU1IwX0NTUl9BTUFQIGlzcjA7CisJc3RydWN0IEJFX0NFVl9JU1IxX0NTUl9BTUFQIGlzcjE7CisJc3RydWN0IEJFX0NFVl9JU1IyX0NTUl9BTUFQIGlzcjI7CisJc3RydWN0IEJFX0NFVl9JU1IzX0NTUl9BTUFQIGlzcjM7CisJdTggcnN2ZDRbMzJdOwkvKiBEV09SRCA4ICovCisJdTggcnN2ZDVbMzJdOwkvKiBEV09SRCA5ICovCisJdTggcnN2ZDZbMzJdOwkvKiBEV09SRCAxMCAqLworCXU4IHJzdmQ3WzMyXTsJLyogRFdPUkQgMTEgKi8KKwl1OCByc3ZkOFszMl07CS8qIERXT1JEIDEyICovCisJdTggcnN2ZDlbMzJdOwkvKiBEV09SRCAxMyAqLworCXU4IHJzdmQxMFszMl07CS8qIERXT1JEIDE0ICovCisJdTggcnN2ZDExWzMyXTsJLyogRFdPUkQgMTUgKi8KKwl1OCByc3ZkMTJbMzJdOwkvKiBEV09SRCAxNiAqLworCXU4IHJzdmQxM1szMl07CS8qIERXT1JEIDE3ICovCisJdTggcnN2ZDE0WzMyXTsJLyogRFdPUkQgMTggKi8KKwl1OCByc3ZkMTVbMzJdOwkvKiBEV09SRCAxOSAqLworCXU4IHJzdmQxNlszMl07CS8qIERXT1JEIDIwICovCisJdTggcnN2ZDE3WzMyXTsJLyogRFdPUkQgMjEgKi8KKwl1OCByc3ZkMThbMzJdOwkvKiBEV09SRCAyMiAqLworCXU4IHJzdmQxOVszMl07CS8qIERXT1JEIDIzICovCisJdTggcnN2ZDIwWzMyXTsJLyogRFdPUkQgMjQgKi8KKwl1OCByc3ZkMjFbMzJdOwkvKiBEV09SRCAyNSAqLworCXU4IHJzdmQyMlszMl07CS8qIERXT1JEIDI2ICovCisJdTggcnN2ZDIzWzMyXTsJLyogRFdPUkQgMjcgKi8KKwl1OCByc3ZkMjRbMzJdOwkvKiBEV09SRCAyOCAqLworCXU4IHJzdmQyNVszMl07CS8qIERXT1JEIDI5ICovCisJdTggcnN2ZDI2WzMyXTsJLyogRFdPUkQgMzAgKi8KKwl1OCByc3ZkMjdbMzJdOwkvKiBEV09SRCAzMSAqLworCXU4IHJzdmQyOFszMl07CS8qIERXT1JEIDMyICovCisJdTggcnN2ZDI5WzMyXTsJLyogRFdPUkQgMzMgKi8KKwl1OCByc3ZkMzBbMTkyXTsJLyogRFdPUkQgMzQgKi8KKwl1OCByc3ZkMzFbMTkyXTsJLyogRFdPUkQgNDAgKi8KKwl1OCByc3ZkMzJbMTYwXTsJLyogRFdPUkQgNDYgKi8KKwl1OCByc3ZkMzNbMTYwXTsJLyogRFdPUkQgNTEgKi8KKwl1OCByc3ZkMzRbMTYwXTsJLyogRFdPUkQgNTYgKi8KKwl1OCByc3ZkMzVbOTZdOwkvKiBEV09SRCA2MSAqLworCXU4IHJzdmQzNlsxOTJdWzMyXTsJLyogRFdPUkQgNjQgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgQ0VWX0NTUk1BUF9BTUFQIHsKKwl1MzIgZHdbMjU2XTsKK307CisKKyNlbmRpZiAvKiBfX2Nldl9hbWFwX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2NxLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvY3EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTA0NTg2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2NxLmMKQEAgLTAsMCArMSwyMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKyNpbmNsdWRlICJod2xpYi5oIgorI2luY2x1ZGUgImJlc3RhdHVzLmgiCisKKy8qCisgKiBDb21wbGV0aW9uIFF1ZXVlIE9iamVjdHMKKyAqLworLyoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogICAgICAgICAgICAgICAgICBQIFUgQiBMIEkgQyAgUiBPIFUgVCBJIE4gRSBTCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKgorICAgIFRoaXMgcm91dGluZSBjcmVhdGVzIGEgY29tcGxldGlvbiBxdWV1ZSBiYXNlZCBvbiB0aGUgY2xpZW50IGNvbXBsZXRpb24KKyAgICBxdWV1ZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgorCisKKyAgICBGdW5jdGlvbk9iamVjdCAgICAgIC0gSGFuZGxlIHRvIGEgZnVuY3Rpb24gb2JqZWN0CisgICAgQ3FCYXNlVmEgICAgICAgICAgICAtIEJhc2UgVkEgZm9yIGEgdGhlIENRIHJpbmcKKyAgICBOdW1FbnRyaWVzICAgICAgICAgIC0gQ0VWX0NRX0NOVF8qIHZhbHVlcworICAgIHNvbEV2ZW50RW5hYmxlICAgICAgLSAwID0gQWxsIENRRXMgY2FuIGdlbmVyYXRlIEV2ZW50cyBpZiBDUSBpcyBldmVudGFibGUKKwkJCTEgPSBvbmx5IENRRXMgd2l0aCBzb2xpY2l0ZWQgYml0IHNldCBhcmUgZXZlbnRhYmxlCisgICAgZXZlbnRhYmxlICAgICAgICAgICAtIEV2ZW50YWJsZSBDUSwgZ2VuZXJhdGVzIGludGVycnVwdHMuCisgICAgbm9kZWxheSAgICAgICAgICAgICAtIDEgPSBGb3JjZSBpbnRlcnJ1cHQsIHJlbGV2ZW50IGlmIENRIGV2ZW50YWJsZS4KKwkJCUludGVycnVwdCBpcyBhc3NlcnRlZCBpbW1lZGlhdGVseSBhZnRlciBFUUUKKwkJCXdyaXRlIGlzIGNvbmZpcm1lZCwgcmVnYXJkbGVzcyBvZiBFUSBUaW1lcgorCQkJb3Igd2F0ZXJtYXJrIHNldHRpbmdzLgorICAgIHdtZSAgICAgICAgICAgICAgICAgLSBFbmFibGUgd2F0ZXJtYXJrIGJhc2VkIGNvYWxlc2NpbmcKKyAgICB3bVRocmVzaCAgICAgICAgICAgIC0gSGlnaCB3YXRlcm1hcmsoQ1EgZnVsbG5lc3MgYXQgd2hpY2ggZXZlbnQKKwkJCW9yIGludGVycnVwdCBzaG91bGQgYmUgYXNzZXJ0ZWQpLiAgVGhlc2UgYXJlIHRoZQorCQkJQ0VWX1dBVEVSTUFSSyBlbmNvZGVkIHZhbHVlcy4KKyAgICBFcU9iamVjdCAgICAgICAgICAgIC0gRVEgSGFuZGxlIHRvIGFzc2lnbiB0byB0aGlzIENRCisgICAgcHBDcU9iamVjdCAgICAgICAgICAtIEludGVybmFsIENRIEhhbmRsZSByZXR1cm5lZC4KKworICAgIFJldHVybnMgQkVfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsbCwgb3RoZXJ3aXNlIGEgdXNlZnVsIGVycm9yIGNvZGUgaXMKKwlyZXR1cm5lZC4KKworICAgIElSUUwgPCBESVNQQVRDSF9MRVZFTAorCisqLworaW50IGJlX2NxX2NyZWF0ZShzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCXN0cnVjdCByaW5nX2Rlc2MgKnJkLCB1MzIgbGVuZ3RoLCBib29sIHNvbGljaXRlZF9ldmVudGFibGUsCisJYm9vbCBub19kZWxheSwgdTMyIHdtX3RocmVzaCwKKwlzdHJ1Y3QgYmVfZXFfb2JqZWN0ICplcV9vYmplY3QsIHN0cnVjdCBiZV9jcV9vYmplY3QgKmNxX29iamVjdCkKK3sKKwlpbnQgc3RhdHVzID0gQkVfU1VDQ0VTUzsKKwl1MzIgbnVtX2VudHJpZXNfZW5jb2Rpbmc7CisJdTMyIG51bV9lbnRyaWVzID0gbGVuZ3RoIC8gc2l6ZW9mKHN0cnVjdCBNQ0NfQ1FfRU5UUllfQU1BUCk7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9DUV9DUkVBVEUgKmZ3Y21kID0gTlVMTDsKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIgPSBOVUxMOworCXUzMiBuOworCXVuc2lnbmVkIGxvbmcgaXJxbDsKKworCUFTU0VSVChyZCk7CisJQVNTRVJUKGNxX29iamVjdCk7CisJQVNTRVJUKGxlbmd0aCAlIHNpemVvZihzdHJ1Y3QgTUNDX0NRX0VOVFJZX0FNQVApID09IDApOworCisJc3dpdGNoIChudW1fZW50cmllcykgeworCWNhc2UgMjU2OgorCQludW1fZW50cmllc19lbmNvZGluZyA9IENFVl9DUV9DTlRfMjU2OworCQlicmVhazsKKwljYXNlIDUxMjoKKwkJbnVtX2VudHJpZXNfZW5jb2RpbmcgPSBDRVZfQ1FfQ05UXzUxMjsKKwkJYnJlYWs7CisJY2FzZSAxMDI0OgorCQludW1fZW50cmllc19lbmNvZGluZyA9IENFVl9DUV9DTlRfMTAyNDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQVNTRVJUKDApOworCQlyZXR1cm4gQkVfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOworCX0KKworCS8qCisJICogQWxsIGNxIGVudHJpZXMgYWxsIHRoZSBzYW1lIHNpemUuICBVc2UgaVNDU0kgdmVyc2lvbgorCSAqIGFzIGEgdGVzdCBmb3IgdGhlIHByb3BlciByZCBsZW5ndGguCisJICovCisJbWVtc2V0KGNxX29iamVjdCwgMCwgc2l6ZW9mKCpjcV9vYmplY3QpKTsKKworCWF0b21pY19zZXQoJmNxX29iamVjdC0+cmVmX2NvdW50LCAwKTsKKwljcV9vYmplY3QtPnBhcmVudF9mdW5jdGlvbiA9IHBmb2I7CisJY3Ffb2JqZWN0LT5lcV9vYmplY3QgPSBlcV9vYmplY3Q7CisJY3Ffb2JqZWN0LT5udW1fZW50cmllcyA9IG51bV9lbnRyaWVzOworCS8qIHNhdmUgZm9yIE1DQyBjcSBwcm9jZXNzaW5nICovCisJY3Ffb2JqZWN0LT52YSA9IHJkLT52YTsKKworCS8qIG1hcCBpbnRvIFVULiAqLworCWxlbmd0aCA9IG51bV9lbnRyaWVzICogc2l6ZW9mKHN0cnVjdCBNQ0NfQ1FfRU5UUllfQU1BUCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCXdyYiA9IGJlX2Z1bmN0aW9uX3BlZWtfbWNjX3dyYihwZm9iKTsKKwlpZiAoIXdyYikgeworCQlBU1NFUlQod3JiKTsKKwkJVFJBQ0UoRExfRVJSLCAiTm8gZnJlZSBNQ0MgV1JCcyBpbiBjcmVhdGUgRVEuIik7CisJCXN0YXR1cyA9IEJFX1NUQVRVU19OT19NQ0NfV1JCOworCQlnb3RvIEVycm9yOworCX0KKwkvKiBQcmVwYXJlcyBhbiBlbWJlZGRlZCBmd2NtZCwgaW5jbHVkaW5nIHJlcXVlc3QvcmVzcG9uc2Ugc2l6ZXMuICovCisJZndjbWQgPSBCRV9QUkVQQVJFX0VNQkVEREVEX0ZXQ01EKHBmb2IsIHdyYiwgQ09NTU9OX0NRX0NSRUFURSk7CisKKwlmd2NtZC0+cGFyYW1zLnJlcXVlc3QubnVtX3BhZ2VzID0gUEFHRVNfU1BBTk5FRChPRkZTRVRfSU5fUEFHRShyZC0+dmEpLAorCQkJCQkJCQkJbGVuZ3RoKTsKKworCUFNQVBfU0VUX0JJVFNfUFRSKENRX0NPTlRFWFQsIHZhbGlkLCAmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIDEpOworCW4gPSBwZm9iLT5wY2lfZnVuY3Rpb25fbnVtYmVyOworCUFNQVBfU0VUX0JJVFNfUFRSKENRX0NPTlRFWFQsIEZ1bmMsICZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgbik7CisKKwluID0gKGVxX29iamVjdCAhPSBOVUxMKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9DT05URVhULCBFdmVudGFibGUsCisJCQkJJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCBuKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9DT05URVhULCBBcm1lZCwgJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCAxKTsKKworCW4gPSBlcV9vYmplY3QgPyBlcV9vYmplY3QtPmVxX2lkIDogMDsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9DT05URVhULCBFUUlELCAmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIG4pOworCUFNQVBfU0VUX0JJVFNfUFRSKENRX0NPTlRFWFQsIENvdW50LAorCQkJJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCBudW1fZW50cmllc19lbmNvZGluZyk7CisKKwluID0gMDsgLyogUHJvdGVjdGlvbiBEb21haW4gaXMgYWx3YXlzIDAgaW4gIExpbnV4ICBkcml2ZXIgKi8KKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9DT05URVhULCBQRCwgJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCBuKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihDUV9DT05URVhULCBOb0RlbGF5LAorCQkJCSZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgbm9fZGVsYXkpOworCUFNQVBfU0VUX0JJVFNfUFRSKENRX0NPTlRFWFQsIFNvbEV2ZW50LAorCQkJJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCBzb2xpY2l0ZWRfZXZlbnRhYmxlKTsKKworCW4gPSAod21fdGhyZXNoICE9IDB4RkZGRkZGRkYpOworCUFNQVBfU0VUX0JJVFNfUFRSKENRX0NPTlRFWFQsIFdNRSwgJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCBuKTsKKworCW4gPSAobiA/IHdtX3RocmVzaCA6IDApOworCUFNQVBfU0VUX0JJVFNfUFRSKENRX0NPTlRFWFQsIFdhdGVybWFyaywKKwkJCQkmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIG4pOworCS8qIENyZWF0ZSBhIHBhZ2UgbGlzdCBmb3IgdGhlIEZXQ01ELiAqLworCWJlX3JkX3RvX3BhX2xpc3QocmQsIGZ3Y21kLT5wYXJhbXMucmVxdWVzdC5wYWdlcywKKwkJCSAgQVJSQVlfU0laRShmd2NtZC0+cGFyYW1zLnJlcXVlc3QucGFnZXMpKTsKKworCS8qIFBvc3QgdGhlIGYvdyBjb21tYW5kICovCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fcG9zdF9tY2Nfd3JiKHBmb2IsIHdyYiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJCU5VTEwsIE5VTEwsIGZ3Y21kLCBOVUxMKTsKKwlpZiAoc3RhdHVzICE9IEJFX1NVQ0NFU1MpIHsKKwkJVFJBQ0UoRExfRVJSLCAiTUNDIHRvIGNyZWF0ZSBDUSBmYWlsZWQuIik7CisJCWdvdG8gRXJyb3I7CisJfQorCS8qIFJlbWVtYmVyIHRoZSBDUSBpZC4gKi8KKwljcV9vYmplY3QtPmNxX2lkID0gZndjbWQtPnBhcmFtcy5yZXNwb25zZS5jcV9pZDsKKworCS8qIGluc2VydCB0aGlzIGNxIGludG8gZXFfb2JqZWN0IHJlZmVyZW5jZSAqLworCWlmIChlcV9vYmplY3QpIHsKKwkJYXRvbWljX2luYygmZXFfb2JqZWN0LT5yZWZfY291bnQpOworCQlsaXN0X2FkZF90YWlsKCZjcV9vYmplY3QtPmNxbGlzdF9mb3JfZXEsCisJCQkJCSZlcV9vYmplY3QtPmNxX2xpc3RfaGVhZCk7CisJfQorCitFcnJvcjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJaWYgKHBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyAmJiBwZm9iLT5tY2MpIHsKKwkJcGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nID0gMDsKKwkJYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShwZm9iLT5tY2MpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorCisgICAgRGVmZXJlbmNlcyB0aGUgZ2l2ZW4gb2JqZWN0LiBPbmNlIHRoZSBvYmplY3QncyByZWZlcmVuY2UgY291bnQgZHJvcHMgdG8KKyAgICB6ZXJvLCB0aGUgb2JqZWN0IGlzIGRlc3Ryb3llZCBhbmQgYWxsIHJlc291cmNlcyB0aGF0IGFyZSBoZWxkIGJ5IHRoaXMgb2JqZWN0CisgICAgYXJlIHJlbGVhc2VkLiAgVGhlIG9uLWNoaXAgY29udGV4dCBpcyBhbHNvIGRlc3Ryb3llZCBhbG9uZyB3aXRoIHRoZSBxdWV1ZQorICAgIElELCBhbmQgYW55IG1hcHBpbmdzIG1hZGUgaW50byB0aGUgVVQuCisKKyAgICBjcV9vYmplY3QgICAgICAgICAgICAtIENRIGhhbmRsZSByZXR1cm5lZCBmcm9tIGNxX29iamVjdF9jcmVhdGUuCisKKyAgICByZXR1cm5zIHRoZSBjdXJyZW50IHJlZmVyZW5jZSBjb3VudCBvbiB0aGUgb2JqZWN0CisKKyAgICBJUlFMOiBJUlFMIDwgRElTUEFUQ0hfTEVWRUwKKyovCitpbnQgYmVfY3FfZGVzdHJveShzdHJ1Y3QgYmVfY3Ffb2JqZWN0ICpjcV9vYmplY3QpCit7CisJaW50IHN0YXR1cyA9IDA7CisKKwkvKiBOb3RoaW5nIHNob3VsZCByZWZlcmVuY2UgdGhpcyBDUSBhdCB0aGlzIHBvaW50LiAqLworCUFTU0VSVChhdG9taWNfcmVhZCgmY3Ffb2JqZWN0LT5yZWZfY291bnQpID09IDApOworCisJLyogU2VuZCBmd2NtZCB0byBkZXN0cm95IHRoZSBDUS4gKi8KKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9yaW5nX2Rlc3Ryb3koY3Ffb2JqZWN0LT5wYXJlbnRfZnVuY3Rpb24sCisJCSAgICAgY3Ffb2JqZWN0LT5jcV9pZCwgRldDTURfUklOR19UWVBFX0NRLAorCQkJCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwlBU1NFUlQoc3RhdHVzID09IDApOworCisJLyogUmVtb3ZlIHJlZmVyZW5jZSBpZiB0aGlzIGlzIGFuIGV2ZW50YWJsZSBDUS4gKi8KKwlpZiAoY3Ffb2JqZWN0LT5lcV9vYmplY3QpIHsKKwkJYXRvbWljX2RlYygmY3Ffb2JqZWN0LT5lcV9vYmplY3QtPnJlZl9jb3VudCk7CisJCWxpc3RfZGVsKCZjcV9vYmplY3QtPmNxbGlzdF9mb3JfZXEpOworCX0KKwlyZXR1cm4gQkVfU1VDQ0VTUzsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Rlc2NyaXB0b3JzLmggYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZGVzY3JpcHRvcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGE0MzhjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Rlc2NyaXB0b3JzLmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworLyoKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgc3JjZ2VuIHZlcnNpb246IDAxMjcKKyAqLworI2lmbmRlZiBfX2Rlc2NyaXB0b3JzX2FtYXBfaF9fCisjZGVmaW5lIF9fZGVzY3JpcHRvcnNfYW1hcF9oX18KKworLyoKKyAqIC0tLSBJUENfTk9ERV9JRF9FTlVNIC0tLQorICogSVBDIHByb2Nlc3NvciBpZCB2YWx1ZXMKKyAqLworI2RlZmluZSBUUE9TVF9OT0RFX0lEICAgICAgICAgICAgICAgICAgICgwKQkvKiBUUE9TVCBJRCAqLworI2RlZmluZSBUUFJFX05PREVfSUQgICAgICAgICAgICAgICAgICAgICgxKQkvKiBUUFJFIElEICovCisjZGVmaW5lIFRYVUxQMF9OT0RFX0lEICAgICAgICAgICAgICAgICAgKDIpCS8qIFRYVUxQMCBJRCAqLworI2RlZmluZSBUWFVMUDFfTk9ERV9JRCAgICAgICAgICAgICAgICAgICgzKQkvKiBUWFVMUDEgSUQgKi8KKyNkZWZpbmUgVFhVTFAyX05PREVfSUQgICAgICAgICAgICAgICAgICAoNCkJLyogVFhVTFAyIElEICovCisjZGVmaW5lIFJYVUxQMF9OT0RFX0lEICAgICAgICAgICAgICAgICAgKDUpCS8qIFJYVUxQMCBJRCAqLworI2RlZmluZSBSWFVMUDFfTk9ERV9JRCAgICAgICAgICAgICAgICAgICg2KQkvKiBSWFVMUDEgSUQgKi8KKyNkZWZpbmUgUlhVTFAyX05PREVfSUQgICAgICAgICAgICAgICAgICAoNykJLyogUlhVTFAyIElEICovCisjZGVmaW5lIE1QVV9OT0RFX0lEICAgICAgICAgICAgICAgICAgICAgKDE1KQkvKiBNUFUgSUQgKi8KKworLyoKKyAqIC0tLSBNQUNfSURfRU5VTSAtLS0KKyAqIE1lYW5pbmcgb2YgdGhlIG1hY19pZCBmaWVsZCBpbiByeHBwX2V0aF9kCisgKi8KKyNkZWZpbmUgUE9SVDBfSE9TVF9NQUMwICAgICgwKSAgLyogUEQgMCwgUG9ydCAwLCBob3N0IG5ldHdvcmtpbmcsIE1BQyAwLiAqLworI2RlZmluZSBQT1JUMF9IT1NUX01BQzEgICAgKDEpCS8qIFBEIDAsIFBvcnQgMCwgaG9zdCBuZXR3b3JraW5nLCBNQUMgMS4gKi8KKyNkZWZpbmUgUE9SVDBfU1RPUkFHRV9NQUMwICgyKQkvKiBQRCAwLCBQb3J0IDAsIGhvc3Qgc3RvcmFnZSwgTUFDIDAuICovCisjZGVmaW5lIFBPUlQwX1NUT1JBR0VfTUFDMSAoMykJLyogUEQgMCwgUG9ydCAwLCBob3N0IHN0b3JhZ2UsIE1BQyAxLiAqLworI2RlZmluZSBQT1JUMV9IT1NUX01BQzAgICAgKDQpCS8qIFBEIDAsIFBvcnQgMSBob3N0IG5ldHdvcmtpbmcsIE1BQyAwLiAqLworI2RlZmluZSBQT1JUMV9IT1NUX01BQzEgICAgKDUpCS8qIFBEIDAsIFBvcnQgMSBob3N0IG5ldHdvcmtpbmcsIE1BQyAxLiAqLworI2RlZmluZSBQT1JUMV9TVE9SQUdFX01BQzAgKDYpCS8qIFBEIDAsIFBvcnQgMSBob3N0IHN0b3JhZ2UsIE1BQyAwLiAqLworI2RlZmluZSBQT1JUMV9TVE9SQUdFX01BQzEgKDcpCS8qIFBEIDAsIFBvcnQgMSBob3N0IHN0b3JhZ2UsIE1BQyAxLiAqLworI2RlZmluZSBGSVJTVF9WTV9NQUMgICAgICAgKDgpCS8qIFBEIDEgTUFDLiBQcm90ZWN0aW9uIGRvbWFpbnMgaGF2ZSBJRHMgKi8KKwkJCQkvKiBmcm9tIDB4OC0weDI2LCBvbmUgcGVyIFBELiAqLworI2RlZmluZSBMQVNUX1ZNX01BQyAgICAgICAgKDM4KQkvKiBQRCAzMSBNQUMuICovCisjZGVmaW5lIE1HTVRfTUFDICAgICAgICAgICAoMzkpCS8qIE1hbmFnZW1lbnQgcG9ydCBNQUMuICovCisjZGVmaW5lIE1BUkJMRV9NQUMwICAgICAgICAoNTkpCS8qIFVzZWQgZm9yIGZsdXNoaW5nIGZ1bmN0aW9uIDAgcmVjZWl2ZSAqLworCQkJCSAgLyoKKwkJCQkgICAqIHF1ZXVlcyBiZWZvcmUgcmUtdXNpbmcgYSB0b3JuLWRvd24KKwkJCQkgICAqIHJlY2VpdmUgcmluZy4gdGhlIERBID0KKwkJCQkgICAqIDAwLTAwLTAwLTAwLTAwLTAwLCBhbmQgdGhlIE1TQiBvZiB0aGUKKwkJCQkgICAqIFNBID0gMDAKKwkJCQkgICAqLworI2RlZmluZSBNQVJCTEVfTUFDMSAgICAgICAgKDYwKQkvKiBVc2VkIGZvciBmbHVzaGluZyBmdW5jdGlvbiAxIHJlY2VpdmUgKi8KKwkJCQkgIC8qCisJCQkJICAgKiBxdWV1ZXMgYmVmb3JlIHJlLXVzaW5nIGEgdG9ybi1kb3duCisJCQkJICAgKiByZWNlaXZlIHJpbmcuIHRoZSBEQSA9CisJCQkJICAgKiAwMC0wMC0wMC0wMC0wMC0wMCwgYW5kIHRoZSBNU0Igb2YgdGhlCisJCQkJICAgKiBTQSAhPSAwMAorCQkJCSAgICovCisjZGVmaW5lIE5VTExfTUFDICAgICAgICAgICAoNjEpCS8qIFByb21pc2N1b3VzIG1vZGUsIGluZGljYXRlcyBubyBtYXRjaCAqLworI2RlZmluZSBNQ0FTVF9NQUMgICAgICAgICAgKDYyKQkvKiBNdWx0aWNhc3QgbWF0Y2guICovCisjZGVmaW5lIEJDQVNUX01BVENIICAgICAgICAoNjMpCS8qIEJyb2FkY2FzdCBtYXRjaC4gKi8KKworI2VuZGlmIC8qIF9fZGVzY3JpcHRvcnNfYW1hcF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9kb29yYmVsbHMuaCBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9kb29yYmVsbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTBjYzRkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Rvb3JiZWxscy5oCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisvKgorICogQXV0b2dlbmVyYXRlZCBieSBzcmNnZW4gdmVyc2lvbjogMDEyNworICovCisjaWZuZGVmIF9fZG9vcmJlbGxzX2FtYXBfaF9fCisjZGVmaW5lIF9fZG9vcmJlbGxzX2FtYXBfaF9fCisKKy8qIFRoZSBUWC9SRE1BIHNlbmQgcXVldWUgZG9vcmJlbGwuICovCitzdHJ1Y3QgQkVfU1FfREJfQU1BUCB7CisJdTggY2lkWzExXTsJCS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFs1XTsJLyogRFdPUkQgMCAqLworCXU4IG51bVBvc3RlZFsxNF07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMVsyXTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBTUV9EQl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBUaGUgcmVjZWl2ZSBxdWV1ZSBkb29yYmVsbC4gKi8KK3N0cnVjdCBCRV9SUV9EQl9BTUFQIHsKKwl1OCBycVsxMF07CQkvKiBEV09SRCAwICovCisJdTggcnN2ZDBbMTNdOwkvKiBEV09SRCAwICovCisJdTggSW52YWxpZGF0ZTsJLyogRFdPUkQgMCAqLworCXU4IG51bVBvc3RlZFs4XTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBSUV9EQl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKgorICogVGhlIENRL0VRIGRvb3JiZWxsLiBTb2Z0d2FyZSBNVVNUIHNldCByZXNlcnZlZCBmaWVsZHMgaW4gdGhpcworICogZGVzY3JpcHRvciB0byB6ZXJvLCBvdGhlcndpc2UgKENFVikgaGFyZHdhcmUgd2lsbCBub3QgZXhlY3V0ZSB0aGUKKyAqIGRvb3JiZWxsIChmbGFnZ2luZyBhIGJhZF9kYl9xaWQgZXJyb3IgaW5zdGVhZCkuCisgKi8KK3N0cnVjdCBCRV9DUV9EQl9BTUFQIHsKKwl1OCBxaWRbMTBdOwkJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwWzRdOwkvKiBEV09SRCAwICovCisJdTggcmVhcm07CQkvKiBEV09SRCAwICovCisJdTggZXZlbnQ7CQkvKiBEV09SRCAwICovCisJdTggbnVtX3BvcHBlZFsxM107CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMVszXTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBDUV9EQl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCitzdHJ1Y3QgQkVfVFBNX1JRX0RCX0FNQVAgeworCXU4IHFpZFsxMF07CQkvKiBEV09SRCAwICovCisJdTggcnN2ZDBbNl07CS8qIERXT1JEIDAgKi8KKwl1OCBudW1Qb3N0ZWRbMTFdOwkvKiBEV09SRCAwICovCisJdTggbXNzX2NudFs1XTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBUUE1fUlFfREJfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyoKKyAqIFBvc3QgV1JCIFF1ZXVlIERvb3JiZWxsIFJlZ2lzdGVyIHVzZWQgYnkgdGhlIGhvc3QgU3RvcmFnZSBzdGFjaworICogdG8gbm90aWZ5IHRoZSBjb250cm9sbGVyIG9mIGEgcG9zdGVkIFdvcmsgUmVxdWVzdCBCbG9jaworICovCitzdHJ1Y3QgQkVfV1JCX1BPU1RfREJfQU1BUCB7CisJdTggd3JiX2NpZFsxMF07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFs2XTsJLyogRFdPUkQgMCAqLworCXU4IHdyYl9pbmRleFs4XTsJLyogRFdPUkQgMCAqLworCXU4IG51bWJlclBvc3RlZFs4XTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBXUkJfUE9TVF9EQl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKgorICogVXBkYXRlIERlZmF1bHQgUERVIFF1ZXVlIERvb3JiZWxsIFJlZ2lzdGVyIHVzZWQgdG8gY29tbXVuaWNhdGUKKyAqIHRvIHRoZSBjb250cm9sbGVyIHRoYXQgdGhlIGRyaXZlciBoYXMgc3RvcHBlZCBwcm9jZXNzaW5nIHRoZSBxdWV1ZQorICogYW5kIHdoZXJlIGluIHRoZSBxdWV1ZSBpdCBzdG9wcGVkLCB0aGlzIGlzCisgKiBhIENRIEVudHJ5IFR5cGUuIFVzZWQgYnkgc3RvcmFnZSBkcml2ZXIuCisgKi8KK3N0cnVjdCBCRV9ERUZBVUxUX1BEVV9EQl9BTUFQIHsKKwl1OCBxaWRbMTBdOwkJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwWzRdOwkvKiBEV09SRCAwICovCisJdTggcmVhcm07CQkvKiBEV09SRCAwICovCisJdTggZXZlbnQ7CQkvKiBEV09SRCAwICovCisJdTggY3Fwcm9jWzE0XTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQxWzJdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IERFRkFVTFRfUERVX0RCX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIE1hbmFnZW1lbnQgQ29tbWFuZCBhbmQgQ29udHJvbGxlciBkZWZhdWx0IGZyYWdtZW50IHJpbmcgKi8KK3N0cnVjdCBCRV9NQ0NfREJfQU1BUCB7CisJdTggcmlkWzExXTsJCS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFs1XTsJLyogRFdPUkQgMCAqLworCXU4IG51bVBvc3RlZFsxNF07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMVsyXTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBNQ0NfREJfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyoKKyAqIFVzZWQgZm9yIGJvb3RzdHJhcHBpbmcgdGhlIEhvc3QgaW50ZXJmYWNlLiBUaGlzIHJlZ2lzdGVyIGlzCisgKiB1c2VkIGZvciBkcml2ZXIgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBNUFUgd2hlbiBubyBNQ0MgUmluZ3MgZXhpc3QuCisgKiBUaGUgc29mdHdhcmUgbXVzdCB3cml0ZSB0aGlzIHJlZ2lzdGVyIHR3aWNlIHRvIHBvc3QgYW55IE1DQworICogY29tbWFuZC4gRmlyc3QsIGl0IHdyaXRlcyB0aGUgcmVnaXN0ZXIgd2l0aCBoaT0xIGFuZCB0aGUgdXBwZXIgYml0cyBvZgorICogdGhlICBwaHlzaWNhbCBhZGRyZXNzIGZvciB0aGUgTUNDX01BSUxCT1ggc3RydWN0dXJlLiAgU29mdHdhcmUgbXVzdCBwb2xsCisgKiB0aGUgcmVhZHkgYml0IHVudGlsIHRoaXMgaXMgYWNrbm93bGVkZ2VkLiAgVGhlbiwgc290d2FyZSB3cml0ZXMgdGhlCisgKiByZWdpc3RlciB3aXRoIGhpPTAgd2l0aCB0aGUgbG93ZXIgYml0cyBpbiB0aGUgYWRkcmVzcy4gIEl0IG11c3QKKyAqIHBvbGwgdGhlIHJlYWR5IGJpdCB1bnRpbCB0aGUgTUNDIGNvbW1hbmQgaXMgY29tcGxldGUuICBVcG9uIGNvbXBsZXRpb24sCisgKiB0aGUgTUNDX01BSUxCT1ggd2lsbCBjb250YWluIGEgdmFsaWQgY29tcGxldGlvbiBxdWV1ZSAgZW50cnkuCisgKi8KK3N0cnVjdCBCRV9NUFVfTUFJTEJPWF9EQl9BTUFQIHsKKwl1OCByZWFkeTsJCS8qIERXT1JEIDAgKi8KKwl1OCBoaTsJCS8qIERXT1JEIDAgKi8KKwl1OCBhZGRyZXNzWzMwXTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBNUFVfTUFJTEJPWF9EQl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKgorICogIFRoaXMgaXMgdGhlIHByb3RlY3Rpb24gZG9tYWluIGRvb3JiZWxsIHJlZ2lzdGVyIG1hcC4gTm90ZSB0aGF0CisgKiAgd2hpbGUgdGhpcyBtYXAgc2hvd3MgZG9vcmJlbGxzIGZvciBhbGwgQmxhZGUgRW5naW5lIHN1cHBvcnRlZAorICogIHByb3RvY29scywgbm90IGFsbCBvZiB0aGVzZSBtYXkgYmUgdmFsaWQgaW4gYSBnaXZlbiBmdW5jdGlvbiBvcgorICogIHByb3RlY3Rpb24gZG9tYWluLiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGFwcGxpY2F0aW9uCisgKiAgYWNjZXNzaW5nIHRoZSBkb29yYmVsbHMgdG8ga25vdyB3aGljaCBhcmUgdmFsaWQuIEVhY2ggZG9vcmJlbGwKKyAqICBvY2N1cGllcyAzMiBieXRlcyBvZiBzcGFjZSwgYnV0IHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLAorICogIG9ubHkgdGhlIGZpcnN0IDQgYnl0ZXMgc2hvdWxkIGJlIHdyaXR0ZW4uICBUaGVyZSBhcmUgMzIgaW5zdGFuY2VzCisgKiAgb2YgdGhlc2UgZG9vcmJlbGxzIGZvciB0aGUgaG9zdCBhbmQgMzEgdmlydHVhbCBtYWNoaW5lcyByZXNwZWN0aXZlbHkuCisgKiAgVGhlIGhvc3QgYW5kIFZNcyB3aWxsIG9ubHkgbWFwIHRoZSBkb29yYmVsbCBwYWdlcyBiZWxvbmdpbmcgdG8gaXRzCisgKiAgcHJvdGVjdGlvbiBkb21haW4uIEl0IHdpbGwgbm90IGJlIGFibGUgdG8gdG91Y2ggdGhlIGRvb3JiZWxscyBmb3IKKyAqICBhbm90aGVyIFZNLiBUaGUgZG9vcmJlbGxzIGFyZSB0aGUgb25seSByZWdpc3RlcnMgZGlyZWN0bHkgYWNjZXNzaWJsZQorICogIGJ5IGEgdmlydHVhbCBtYWNoaW5lLiBTaW1pbGFybHksIHRoZXJlIGFyZSA1MTEgYWRkaXRpb25hbAorICogIGRvb3JiZWxscyBmb3IgUkRNQSBwcm90ZWN0aW9uIGRvbWFpbnMuIFBEIDAgZm9yIFJETUEgc2hhcmVzCisgKiAgdGhlIHNhbWUgcGh5c2ljYWwgcHJvdGVjdGlvbiBkb21haW4gZG9vcmJlbGwgcGFnZSBhcyBFVEgvaVNDU0kuCisgKgorICovCitzdHJ1Y3QgQkVfUFJPVEVDVElPTl9ET01BSU5fREJNQVBfQU1BUCB7CisJdTggcnN2ZDBbNTEyXTsJLyogRFdPUkQgMCAqLworCXN0cnVjdCBCRV9TUV9EQl9BTUFQIHJkbWFfc3FfZGI7CisJdTggcnN2ZDFbN11bMzJdOwkvKiBEV09SRCAxNyAqLworCXN0cnVjdCBCRV9XUkJfUE9TVF9EQl9BTUFQIGlzY3NpX3dyYl9wb3N0X2RiOworCXU4IHJzdmQyWzddWzMyXTsJLyogRFdPUkQgMjUgKi8KKwlzdHJ1Y3QgQkVfU1FfREJfQU1BUCBldHhfc3FfZGI7CisJdTggcnN2ZDNbN11bMzJdOwkvKiBEV09SRCAzMyAqLworCXN0cnVjdCBCRV9SUV9EQl9BTUFQIHJkbWFfcnFfZGI7CisJdTggcnN2ZDRbN11bMzJdOwkvKiBEV09SRCA0MSAqLworCXN0cnVjdCBCRV9ERUZBVUxUX1BEVV9EQl9BTUFQIGlzY3NpX2RlZmF1bHRfcGR1X2RiOworCXU4IHJzdmQ1WzddWzMyXTsJLyogRFdPUkQgNDkgKi8KKwlzdHJ1Y3QgQkVfVFBNX1JRX0RCX0FNQVAgdHBtX3JxX2RiOworCXU4IHJzdmQ2WzddWzMyXTsJLyogRFdPUkQgNTcgKi8KKwlzdHJ1Y3QgQkVfUlFfREJfQU1BUCBlcnhfcnFfZGI7CisJdTggcnN2ZDdbN11bMzJdOwkvKiBEV09SRCA2NSAqLworCXN0cnVjdCBCRV9DUV9EQl9BTUFQIGNxX2RiOworCXU4IHJzdmQ4WzddWzMyXTsJLyogRFdPUkQgNzMgKi8KKwlzdHJ1Y3QgQkVfTUNDX0RCX0FNQVAgbXB1X21jY19kYjsKKwl1OCByc3ZkOVs3XVszMl07CS8qIERXT1JEIDgxICovCisJc3RydWN0IEJFX01QVV9NQUlMQk9YX0RCX0FNQVAgbWNjX2Jvb3RzdHJhcF9kYjsKKwl1OCByc3ZkMTBbOTM1XVszMl07CS8qIERXT1JEIDg5ICovCit9IF9fcGFja2VkOworc3RydWN0IFBST1RFQ1RJT05fRE9NQUlOX0RCTUFQX0FNQVAgeworCXUzMiBkd1sxMDI0XTsKK307CisKKyNlbmRpZiAvKiBfX2Rvb3JiZWxsc19hbWFwX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2VwLmggYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmZjZjY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2VwLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworLyoKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgc3JjZ2VuIHZlcnNpb246IDAxMjcKKyAqLworI2lmbmRlZiBfX2VwX2FtYXBfaF9fCisjZGVmaW5lIF9fZXBfYW1hcF9oX18KKworLyogR2VuZXJhbCBDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXIuICovCitzdHJ1Y3QgQkVfRVBfQ09OVFJPTF9DU1JfQU1BUCB7CisJdTggbTBfUnhQYnVmOwkvKiBEV09SRCAwICovCisJdTggbTFfUnhQYnVmOwkvKiBEV09SRCAwICovCisJdTggbTJfUnhQYnVmOwkvKiBEV09SRCAwICovCisJdTggZmZfZW47CQkvKiBEV09SRCAwICovCisJdTggcnN2ZDBbMjddOwkvKiBEV09SRCAwICovCisJdTggQ1BVX3Jlc2V0OwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IEVQX0NPTlRST0xfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIFNlbWFwaG9yZSBSZWdpc3Rlci4gKi8KK3N0cnVjdCBCRV9FUF9TRU1BUEhPUkVfQ1NSX0FNQVAgeworCXU4IHZhbHVlWzMyXTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBFUF9TRU1BUEhPUkVfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIEVtYmVkZGVkIFByb2Nlc3NvciBTcGVjaWZpYyBSZWdpc3RlcnMuICovCitzdHJ1Y3QgQkVfRVBfQ1NSTUFQX0FNQVAgeworCXN0cnVjdCBCRV9FUF9DT05UUk9MX0NTUl9BTUFQIGVwX2NvbnRyb2w7CisJdTggcnN2ZDBbMzJdOwkvKiBEV09SRCAxICovCisJdTggcnN2ZDFbMzJdOwkvKiBEV09SRCAyICovCisJdTggcnN2ZDJbMzJdOwkvKiBEV09SRCAzICovCisJdTggcnN2ZDNbMzJdOwkvKiBEV09SRCA0ICovCisJdTggcnN2ZDRbMzJdOwkvKiBEV09SRCA1ICovCisJdTggcnN2ZDVbOF1bMTI4XTsJLyogRFdPUkQgNiAqLworCXU4IHJzdmQ2WzMyXTsJLyogRFdPUkQgMzggKi8KKwl1OCByc3ZkN1szMl07CS8qIERXT1JEIDM5ICovCisJdTggcnN2ZDhbMzJdOwkvKiBEV09SRCA0MCAqLworCXU4IHJzdmQ5WzMyXTsJLyogRFdPUkQgNDEgKi8KKwl1OCByc3ZkMTBbMzJdOwkvKiBEV09SRCA0MiAqLworCXN0cnVjdCBCRV9FUF9TRU1BUEhPUkVfQ1NSX0FNQVAgZXBfc2VtYXBob3JlOworCXU4IHJzdmQxMVszMl07CS8qIERXT1JEIDQ0ICovCisJdTggcnN2ZDEyWzE5XVszMl07CS8qIERXT1JEIDQ1ICovCit9IF9fcGFja2VkOworc3RydWN0IEVQX0NTUk1BUF9BTUFQIHsKKwl1MzIgZHdbNjRdOworfTsKKworI2VuZGlmIC8qIF9fZXBfYW1hcF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9lcS5jIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2VxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI5MmNjZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9lcS5jCkBAIC0wLDAgKzEsMjk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisjaW5jbHVkZSAiaHdsaWIuaCIKKyNpbmNsdWRlICJiZXN0YXR1cy5oIgorLyoKKyAgICBUaGlzIHJvdXRpbmUgY3JlYXRlcyBhbiBldmVudCBxdWV1ZSBiYXNlZCBvbiB0aGUgY2xpZW50IGNvbXBsZXRpb24KKyAgICBxdWV1ZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgorCisgICAgRnVuY3Rpb25PYmplY3QgICAgICAtIEhhbmRsZSB0byBhIGZ1bmN0aW9uIG9iamVjdAorICAgIEVxQmFzZVZhICAgICAgICAgICAgLSBCYXNlIFZBIGZvciBhIHRoZSBFUSByaW5nCisgICAgU2l6ZUVuY29kaW5nICAgICAgICAtIFRoZSBlbmNvZGVkIHNpemUgZm9yIHRoZSBFUSBlbnRyaWVzLiBUaGlzIHZhbHVlIGlzCisJCQllaXRoZXIgQ0VWX0VRX1NJWkVfNCBvciBDRVZfRVFfU0laRV8xNgorICAgIE51bUVudHJpZXMgICAgICAgICAgLSBDRVZfQ1FfQ05UXyogdmFsdWVzLgorICAgIFdhdGVybWFyayAgICAgICAgICAgLSBFbmFibGVzIHdhdGVybWFyayBiYXNlZCBjb2FsZXNjaW5nLiAgVGhpcyBwYXJhbWV0ZXIKKwkJCW11c3QgYmUgb2YgdGhlIHR5cGUgQ0VWX1dNQVJLXyogaWYgd2F0ZXJtYXJrcworCQkJYXJlIGVuYWJsZWQuICBJZiB3YXRlcm1hcmtzIHRvIHRvIGJlIGRpc2FibGVkCisJCQl0aGlzIHZhbHVlIHNob3VsZCBiZS0xLgorICAgIFRpbWVyRGVsYXkgICAgICAgICAgLSBJZiBhIHRpbWVyIGRlbGF5IGlzIGVuYWJsZWQgdGhpcyB2YWx1ZSBzaG91bGQgYmUgdGhlCisJCQl0aW1lIG9mIHRoZSBkZWxheSBpbiA4IG1pY3Jvc2Vjb25kIHVuaXRzLiAgSWYKKwkJCWRlbGF5cyBhcmUgbm90IHVzZWQgdGhpcyBwYXJhbWV0ZXIgc2hvdWxkIGJlCisJCQlzZXQgdG8gLTEuCisgICAgcHBFcU9iamVjdCAgICAgICAgICAtIEludGVybmFsIEVRIEhhbmRsZSByZXR1cm5lZC4KKworICAgIFJldHVybnMgQkVfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsbCwsIG90aGVyd2lzZSBhIHVzZWZ1bCBlcnJvciBjb2RlCisJaXMgcmV0dXJuZWQuCisKKyAgICBJUlFMIDwgRElTUEFUQ0hfTEVWRUwKKyovCitpbnQKK2JlX2VxX2NyZWF0ZShzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQlzdHJ1Y3QgcmluZ19kZXNjICpyZCwgdTMyIGVxZV9zaXplLCB1MzIgbnVtX2VudHJpZXMsCisJCXUzMiB3YXRlcm1hcmssCS8qIENFVl9XTUFSS18qIG9yIC0xICovCisJCXUzMiB0aW1lcl9kZWxheSwJLyogaW4gOHVzIHVuaXRzLCBvciAtMSAqLworCQlzdHJ1Y3QgYmVfZXFfb2JqZWN0ICplcV9vYmplY3QpCit7CisJaW50IHN0YXR1cyA9IEJFX1NVQ0NFU1M7CisJdTMyIG51bV9lbnRyaWVzX2VuY29kaW5nLCBlcWVfc2l6ZV9lbmNvZGluZywgbGVuZ3RoOworCXN0cnVjdCBGV0NNRF9DT01NT05fRVFfQ1JFQVRFICpmd2NtZCA9IE5VTEw7CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiID0gTlVMTDsKKwl1MzIgbjsKKwl1bnNpZ25lZCBsb25nIGlycWw7CisKKwlBU1NFUlQocmQpOworCUFTU0VSVChlcV9vYmplY3QpOworCisJc3dpdGNoIChudW1fZW50cmllcykgeworCWNhc2UgMjU2OgorCQludW1fZW50cmllc19lbmNvZGluZyA9IENFVl9FUV9DTlRfMjU2OworCQlicmVhazsKKwljYXNlIDUxMjoKKwkJbnVtX2VudHJpZXNfZW5jb2RpbmcgPSBDRVZfRVFfQ05UXzUxMjsKKwkJYnJlYWs7CisJY2FzZSAxMDI0OgorCQludW1fZW50cmllc19lbmNvZGluZyA9IENFVl9FUV9DTlRfMTAyNDsKKwkJYnJlYWs7CisJY2FzZSAyMDQ4OgorCQludW1fZW50cmllc19lbmNvZGluZyA9IENFVl9FUV9DTlRfMjA0ODsKKwkJYnJlYWs7CisJY2FzZSA0MDk2OgorCQludW1fZW50cmllc19lbmNvZGluZyA9IENFVl9FUV9DTlRfNDA5NjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQVNTRVJUKDApOworCQlyZXR1cm4gQkVfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOworCX0KKworCXN3aXRjaCAoZXFlX3NpemUpIHsKKwljYXNlIDQ6CisJCWVxZV9zaXplX2VuY29kaW5nID0gQ0VWX0VRX1NJWkVfNDsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJZXFlX3NpemVfZW5jb2RpbmcgPSBDRVZfRVFfU0laRV8xNjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQVNTRVJUKDApOworCQlyZXR1cm4gQkVfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSOworCX0KKworCWlmICgoZXFlX3NpemUgPT0gNCAmJiBudW1fZW50cmllcyA8IDEwMjQpIHx8CisJICAgIChlcWVfc2l6ZSA9PSAxNiAmJiBudW1fZW50cmllcyA9PSA0MDk2KSkgeworCQlUUkFDRShETF9FUlIsICJCYWQgRVEgc2l6ZS4gZXFlX3NpemU6JWQgbnVtX2VudHJpZXM6JWQiLAorCQkgICAgICBlcWVfc2l6ZSwgbnVtX2VudHJpZXMpOworCQlBU1NFUlQoMCk7CisJCXJldHVybiBCRV9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CisJfQorCisJbWVtc2V0KGVxX29iamVjdCwgMCwgc2l6ZW9mKCplcV9vYmplY3QpKTsKKworCWF0b21pY19zZXQoJmVxX29iamVjdC0+cmVmX2NvdW50LCAwKTsKKwllcV9vYmplY3QtPnBhcmVudF9mdW5jdGlvbiA9IHBmb2I7CisJZXFfb2JqZWN0LT5lcV9pZCA9IDB4RkZGRkZGRkY7CisKKwlJTklUX0xJU1RfSEVBRCgmZXFfb2JqZWN0LT5jcV9saXN0X2hlYWQpOworCisJbGVuZ3RoID0gbnVtX2VudHJpZXMgKiBlcWVfc2l6ZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJd3JiID0gYmVfZnVuY3Rpb25fcGVla19tY2Nfd3JiKHBmb2IpOworCWlmICghd3JiKSB7CisJCUFTU0VSVCh3cmIpOworCQlUUkFDRShETF9FUlIsICJObyBmcmVlIE1DQyBXUkJzIGluIGNyZWF0ZSBFUS4iKTsKKwkJc3RhdHVzID0gQkVfU1RBVFVTX05PX01DQ19XUkI7CisJCWdvdG8gRXJyb3I7CisJfQorCS8qIFByZXBhcmVzIGFuIGVtYmVkZGVkIGZ3Y21kLCBpbmNsdWRpbmcgcmVxdWVzdC9yZXNwb25zZSBzaXplcy4gKi8KKwlmd2NtZCA9IEJFX1BSRVBBUkVfRU1CRURERURfRldDTUQocGZvYiwgd3JiLCBDT01NT05fRVFfQ1JFQVRFKTsKKworCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5udW1fcGFnZXMgPSBQQUdFU19TUEFOTkVEKE9GRlNFVF9JTl9QQUdFKHJkLT52YSksCisJCQkJCQkJCQlsZW5ndGgpOworCW4gPSBwZm9iLT5wY2lfZnVuY3Rpb25fbnVtYmVyOworCUFNQVBfU0VUX0JJVFNfUFRSKEVRX0NPTlRFWFQsIEZ1bmMsICZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgbik7CisKKwlBTUFQX1NFVF9CSVRTX1BUUihFUV9DT05URVhULCB2YWxpZCwgJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCAxKTsKKworCUFNQVBfU0VUX0JJVFNfUFRSKEVRX0NPTlRFWFQsIFNpemUsCisJCQkmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIGVxZV9zaXplX2VuY29kaW5nKTsKKworCW4gPSAwOyAvKiBQcm90ZWN0aW9uIERvbWFpbiBpcyBhbHdheXMgMCBpbiAgTGludXggIGRyaXZlciAqLworCUFNQVBfU0VUX0JJVFNfUFRSKEVRX0NPTlRFWFQsIFBELCAmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIG4pOworCisJLyogTGV0IHRoZSBjYWxsZXIgQVJNIHRoZSBFUSB3aXRoIHRoZSBkb29yYmVsbC4gKi8KKwlBTUFQX1NFVF9CSVRTX1BUUihFUV9DT05URVhULCBBcm1lZCwgJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCAwKTsKKworCUFNQVBfU0VUX0JJVFNfUFRSKEVRX0NPTlRFWFQsIENvdW50LCAmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsCisJCQkJCW51bV9lbnRyaWVzX2VuY29kaW5nKTsKKworCW4gPSBwZm9iLT5wY2lfZnVuY3Rpb25fbnVtYmVyICogMzI7CisJQU1BUF9TRVRfQklUU19QVFIoRVFfQ09OVEVYVCwgRXZlbnRWZWN0LAorCQkJCSZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgbik7CisJaWYgKHdhdGVybWFyayAhPSAtMSkgeworCQlBTUFQX1NFVF9CSVRTX1BUUihFUV9DT05URVhULCBXTUUsCisJCQkJJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCAxKTsKKwkJQU1BUF9TRVRfQklUU19QVFIoRVFfQ09OVEVYVCwgV2F0ZXJtYXJrLAorCQkJCSZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgd2F0ZXJtYXJrKTsKKwkJQVNTRVJUKHdhdGVybWFyayA8PSBDRVZfV01BUktfMjQwKTsKKwl9IGVsc2UKKwkJQU1BUF9TRVRfQklUU19QVFIoRVFfQ09OVEVYVCwgV01FLAorCQkJCQkmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIDApOworCWlmICh0aW1lcl9kZWxheSAhPSAtMSkgeworCQlBTUFQX1NFVF9CSVRTX1BUUihFUV9DT05URVhULCBUTVIsCisJCQkJCSZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgMSk7CisKKwkJQVNTRVJUKHRpbWVyX2RlbGF5IDw9IDI1MCk7CS8qIG1heCB2YWx1ZSBhY2NvcmRpbmcgdG8gRUFTICovCisJCXRpbWVyX2RlbGF5ID0gbWluKHRpbWVyX2RlbGF5LCAodTMyKTI1MCk7CisKKwkJQU1BUF9TRVRfQklUU19QVFIoRVFfQ09OVEVYVCwgRGVsYXksCisJCQkJJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCB0aW1lcl9kZWxheSk7CisJfSBlbHNlIHsKKwkJQU1BUF9TRVRfQklUU19QVFIoRVFfQ09OVEVYVCwgVE1SLAorCQkJCSZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgMCk7CisJfQorCS8qIENyZWF0ZSBhIHBhZ2UgbGlzdCBmb3IgdGhlIEZXQ01ELiAqLworCWJlX3JkX3RvX3BhX2xpc3QocmQsIGZ3Y21kLT5wYXJhbXMucmVxdWVzdC5wYWdlcywKKwkJCSAgQVJSQVlfU0laRShmd2NtZC0+cGFyYW1zLnJlcXVlc3QucGFnZXMpKTsKKworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihwZm9iLCB3cmIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCQkJCU5VTEwsIE5VTEwsIGZ3Y21kLCBOVUxMKTsKKwlpZiAoc3RhdHVzICE9IEJFX1NVQ0NFU1MpIHsKKwkJVFJBQ0UoRExfRVJSLCAiTUNDIHRvIGNyZWF0ZSBFUSBmYWlsZWQuIik7CisJCWdvdG8gRXJyb3I7CisJfQorCS8qIEdldCB0aGUgRVEgaWQuICBUaGUgTVBVIGFsbG9jYXRlcyB0aGUgSURzLiAqLworCWVxX29iamVjdC0+ZXFfaWQgPSBmd2NtZC0+cGFyYW1zLnJlc3BvbnNlLmVxX2lkOworCitFcnJvcjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJaWYgKHBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyAmJiBwZm9iLT5tY2MpIHsKKwkJcGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nID0gMDsKKwkJYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShwZm9iLT5tY2MpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICAgIERlZmVyZW5jZXMgdGhlIGdpdmVuIG9iamVjdC4gT25jZSB0aGUgb2JqZWN0J3MgcmVmZXJlbmNlIGNvdW50IGRyb3BzIHRvCisgICAgemVybywgdGhlIG9iamVjdCBpcyBkZXN0cm95ZWQgYW5kIGFsbCByZXNvdXJjZXMgdGhhdCBhcmUgaGVsZCBieSB0aGlzCisgICAgb2JqZWN0IGFyZSByZWxlYXNlZC4gIFRoZSBvbi1jaGlwIGNvbnRleHQgaXMgYWxzbyBkZXN0cm95ZWQgYWxvbmcgd2l0aAorICAgIHRoZSBxdWV1ZSBJRCwgYW5kIGFueSBtYXBwaW5ncyBtYWRlIGludG8gdGhlIFVULgorCisgICAgZXFfb2JqZWN0ICAgICAgICAgICAgLSBFUSBoYW5kbGUgcmV0dXJuZWQgZnJvbSBlcV9vYmplY3RfY3JlYXRlLgorCisgICAgUmV0dXJucyBCRV9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWxsLCBvdGhlcndpc2UgYSB1c2VmdWwgZXJyb3IgY29kZQorCWlzIHJldHVybmVkLgorCisgICAgSVJRTDogSVJRTCA8IERJU1BBVENIX0xFVkVMCisqLworaW50IGJlX2VxX2Rlc3Ryb3koc3RydWN0IGJlX2VxX29iamVjdCAqZXFfb2JqZWN0KQoreworCWludCBzdGF0dXMgPSAwOworCisJQVNTRVJUKGF0b21pY19yZWFkKCZlcV9vYmplY3QtPnJlZl9jb3VudCkgPT0gMCk7CisJLyogbm8gQ1FzIHNob3VsZCByZWZlcmVuY2UgdGhpcyBFUSBub3cgKi8KKwlBU1NFUlQobGlzdF9lbXB0eSgmZXFfb2JqZWN0LT5jcV9saXN0X2hlYWQpKTsKKworCS8qIFNlbmQgZndjbWQgdG8gZGVzdHJveSB0aGUgRVEuICovCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fcmluZ19kZXN0cm95KGVxX29iamVjdC0+cGFyZW50X2Z1bmN0aW9uLAorCQkJICAgICBlcV9vYmplY3QtPmVxX2lkLCBGV0NNRF9SSU5HX1RZUEVfRVEsCisJCQkJCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworCUFTU0VSVChzdGF0dXMgPT0gMCk7CisKKwlyZXR1cm4gQkVfU1VDQ0VTUzsKK30KKy8qCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246IGJlX2VxX21vZGlmeV9kZWxheQorICogICBDaGFuZ2VzIHRoZSBFUSBkZWxheSBmb3IgYSBncm91cCBvZiBFUXMuCisgKiBudW1fZXEgICAgICAgICAgICAgLSBUaGUgbnVtYmVyIG9mIEVRcyBpbiB0aGUgZXFfYXJyYXkgdG8gYWRqdXN0LgorICogCQkJVGhpcyBhbHNvIGlzIHRoZSBudW1iZXIgb2YgZGVsYXkgdmFsdWVzIGluCisgKiAJCQl0aGUgZXFfZGVsYXlfYXJyYXkuCisgKiBlcV9hcnJheSAgICAgICAgICAgLSBBcnJheSBvZiBzdHJ1Y3QgYmVfZXFfb2JqZWN0IHBvaW50ZXJzIHRvIGFkanVzdC4KKyAqIGVxX2RlbGF5X2FycmF5ICAgICAtIEFycmF5IG9mICJudW1fZXEiIHRpbWVyIGRlbGF5cyBpbiB1bml0cworICogCQkJb2YgbWljcm9zZWNvbmRzLiBUaGUgYmVfZXFfcXVlcnlfZGVsYXlfcmFuZ2UKKyAqIAkJCWZ3Y21kIHJldHVybnMgdGhlIHJlc29sdXRpb24gYW5kIHJhbmdlIG9mCisgKiAgICAgICAgICAgICAgICAgICAgICBsZWdhbCBFUSBkZWxheXMuCisgKiBjYiAgICAgICAgICAgLQorICogY2JfY29udGV4dCAgIC0KKyAqIHFfY3R4dCAgICAgICAgICAgICAtIE9wdGlvbmFsLiBQb2ludGVyIHRvIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQKKyAqIAkJCXN0cnVjdC4gSWYgdGhlIE1DQyBXUkIgcmluZyBpcyBmdWxsLCB0aGlzCisgKiAJCQlzdHJ1Y3R1cmUgaXMgdXNlZCB0byBxdWV1ZSB0aGUgb3BlcmF0aW9uLiBJdAorICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBwb3N0ZWQgdG8gdGhlIE1DQyByaW5nIHdoZW4gc3BhY2UKKyAqICAgICAgICAgICAgICAgICAgICAgIGJlY29tZXMgYXZhaWxhYmxlLiBBbGwgcXVldWVkIGNvbW1hbmRzIHdpbGwKKyAqICAgICAgICAgICAgICAgICAgICAgIGJlIHBvc3RlZCB0byB0aGUgcmluZyBpbiB0aGUgb3JkZXIgdGhleSBhcmUKKyAqICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkLiBJdCBpcyBhbHdheXMgdmFsaWQgdG8gcGFzcyBhIHBvaW50ZXIgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgIGEgZ2VuZXJpYyBiZV9nZW5lcmljX3FfY250eHQuIEhvd2V2ZXIsCisgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgc3BlY2lmaWMgY29udGV4dCBzdHJ1Y3RzCisgKiAgICAgICAgICAgICAgICAgICAgICBhcmUgZ2VuZXJhbGx5IHNtYWxsZXIgdGhhbiB0aGUgZ2VuZXJpYyBzdHJ1Y3QuCisgKiByZXR1cm4gcGVuZF9zdGF0dXMgLSBCRV9TVUNDRVNTICgwKSBvbiBzdWNjZXNzLgorICogCQkJQkVfUEVORElORyAocG9zdGl2ZSB2YWx1ZSkgaWYgdGhlIEZXQ01ECisgKiAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uIGlzIHBlbmRpbmcuIE5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbnQKK2JlX2VxX21vZGlmeV9kZWxheShzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkgICB1MzIgbnVtX2VxLCBzdHJ1Y3QgYmVfZXFfb2JqZWN0ICoqZXFfYXJyYXksCisJCSAgIHUzMiAqZXFfZGVsYXlfYXJyYXksIG1jY193cmJfY3FlX2NhbGxiYWNrIGNiLAorCQkgICB2b2lkICpjYl9jb250ZXh0LCBzdHJ1Y3QgYmVfZXFfbW9kaWZ5X2RlbGF5X3FfY3R4dCAqcV9jdHh0KQoreworCXN0cnVjdCBGV0NNRF9DT01NT05fTU9ESUZZX0VRX0RFTEFZICpmd2NtZCA9IE5VTEw7CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgYmVfZ2VuZXJpY19xX2N0eHQgKmdlbl9jdHh0ID0gTlVMTDsKKwl1MzIgaTsKKwl1bnNpZ25lZCBsb25nIGlycWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCXdyYiA9IGJlX2Z1bmN0aW9uX3BlZWtfbWNjX3dyYihwZm9iKTsKKwlpZiAoIXdyYikgeworCQlpZiAocV9jdHh0ICYmIGNiKSB7CisJCQl3cmIgPSAoc3RydWN0IE1DQ19XUkJfQU1BUCAqKSAmcV9jdHh0LT53cmJfaGVhZGVyOworCQkJZ2VuX2N0eHQgPSAoc3RydWN0IGJlX2dlbmVyaWNfcV9jdHh0ICopIHFfY3R4dDsKKwkJCWdlbl9jdHh0LT5jb250ZXh0LmJ5dGVzID0gc2l6ZW9mKCpxX2N0eHQpOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gQkVfU1RBVFVTX05PX01DQ19XUkI7CisJCQlnb3RvIEVycm9yOworCQl9CisJfQorCS8qIFByZXBhcmVzIGFuIGVtYmVkZGVkIGZ3Y21kLCBpbmNsdWRpbmcgcmVxdWVzdC9yZXNwb25zZSBzaXplcy4gKi8KKwlmd2NtZCA9IEJFX1BSRVBBUkVfRU1CRURERURfRldDTUQocGZvYiwgd3JiLCBDT01NT05fTU9ESUZZX0VRX0RFTEFZKTsKKworCUFTU0VSVChudW1fZXEgPiAwKTsKKwlBU1NFUlQobnVtX2VxIDw9IEFSUkFZX1NJWkUoZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmRlbGF5KSk7CisJZndjbWQtPnBhcmFtcy5yZXF1ZXN0Lm51bV9lcSA9IG51bV9lcTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VxOyBpKyspIHsKKwkJZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmRlbGF5W2ldLmVxX2lkID0gZXFfYXJyYXlbaV0tPmVxX2lkOworCQlmd2NtZC0+cGFyYW1zLnJlcXVlc3QuZGVsYXlbaV0uZGVsYXlfaW5fbWljcm9zZWNvbmRzID0KKwkJICAgIGVxX2RlbGF5X2FycmF5W2ldOworCX0KKworCS8qIFBvc3QgdGhlIGYvdyBjb21tYW5kICovCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fcG9zdF9tY2Nfd3JiKHBmb2IsIHdyYiwgZ2VuX2N0eHQsCisJCQljYiwgY2JfY29udGV4dCwgTlVMTCwgTlVMTCwgZndjbWQsIE5VTEwpOworCitFcnJvcjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJaWYgKHBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyAmJiBwZm9iLT5tY2MpIHsKKwkJcGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nID0gMDsKKwkJYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShwZm9iLT5tY2MpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZXRoLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY0MWI2MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9ldGguYwpAQCAtMCwwICsxLDEyNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgImh3bGliLmgiCisjaW5jbHVkZSAiYmVzdGF0dXMuaCIKKworLyoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbjogYmVfZXRoX3NxX2NyZWF0ZV9leAorICogICBDcmVhdGVzIGFuIGV0aGVybmV0IHNlbmQgcmluZyAtIGV4dGVuZGVkIHZlcnNpb24gd2l0aAorICogICBhZGRpdGlvbmFsIHBhcmFtZXRlcnMuCisgKiBwZm9iIC0KKyAqIHJkICAgICAgICAgICAgIC0gcmluZyBhZGRyZXNzCisgKiBsZW5ndGhfaW5fYnl0ZXMgLQorICogdHlwZSAgICAgICAgICAgIC0gVGhlIHR5cGUgb2YgcmluZyB0byBjcmVhdGUuCisgKiB1bHAgICAgICAgICAgICAgLSBUaGUgcmVxdWVzdGVkIFVMUCBudW1iZXIgZm9yIHRoZSByaW5nLgorICogCQkgICAgIFRoaXMgc2hvdWxkIGJlIHplcm8gYmFzZWQsIGkuZS4gMCwxLDIuIFRoaXMgbXVzdAorICogCQkgICAgIGJlIHZhbGlkIE5JQyBVTFAgYmFzZWQgb24gdGhlIGZpcm13YXJlIGNvbmZpZy4KKyAqICAgICAgICAgICAgICAgICAgIEFsbCBkb29yYmVsbHMgZm9yIHRoaXMgcmluZyBtdXN0IGJlIHNlbnQgdG8KKyAqICAgICAgICAgICAgICAgICAgIHRoaXMgVUxQLiBUaGUgZmlyc3QgbmV0d29yayByaW5nIGFsbG9jYXRlZCBmb3IKKyAqICAgICAgICAgICAgICAgICAgIGVhY2ggVUxQIGFyZSBoaWdoZXIgcGVyZm9ybWFuY2UgdGhhbiBzdWJzZXF1ZW50IHJpbmdzLgorICogY3Ffb2JqZWN0ICAgICAgIC0gY3Egb2JqZWN0IGZvciBjb21wbGV0aW9ucworICogZXhfcGFyYW1ldGVycyAgIC0gQWRkaXRpb25hbCBwYXJhbWV0ZXJzICh0aGF0IG1heSBpbmNyZWFzZSBpbgorICogCQkgICAgIGZ1dHVyZSByZXZpc2lvbnMpLiBUaGVzZSBwYXJhbWV0ZXJzIGFyZSBvbmx5IHVzZWQKKyAqIAkJICAgICBmb3IgY2VydGFpbiByaW5nIHR5cGVzIC0tIHNlZQorICogICAgICAgICAgICAgICAgICAgc3RydWN0IGJlX2V0aF9zcV9wYXJhbWV0ZXJzIGZvciBkZXRhaWxzLgorICogZXRoX3NxICAgICAgICAgIC0KKyAqIHJldHVybiBzdGF0dXMgICAtIEJFX1NVQ0NFU1MgKDApIG9uIHN1Y2Nlc3MuIE5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2ludAorYmVfZXRoX3NxX2NyZWF0ZV9leChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLCBzdHJ1Y3QgcmluZ19kZXNjICpyZCwKKwkJdTMyIGxlbmd0aCwgdTMyIHR5cGUsIHUzMiB1bHAsIHN0cnVjdCBiZV9jcV9vYmplY3QgKmNxX29iamVjdCwKKwkJc3RydWN0IGJlX2V0aF9zcV9wYXJhbWV0ZXJzICpleF9wYXJhbWV0ZXJzLAorCQlzdHJ1Y3QgYmVfZXRoc3Ffb2JqZWN0ICpldGhfc3EpCit7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9FVEhfVFhfQ1JFQVRFICpmd2NtZCA9IE5VTEw7CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gMDsKKwl1MzIgbjsKKwl1bnNpZ25lZCBsb25nIGlycWw7CisKKwlBU1NFUlQocmQpOworCUFTU0VSVChldGhfc3EpOworCUFTU0VSVChleF9wYXJhbWV0ZXJzKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJbWVtc2V0KGV0aF9zcSwgMCwgc2l6ZW9mKCpldGhfc3EpKTsKKworCWV0aF9zcS0+cGFyZW50X2Z1bmN0aW9uID0gcGZvYjsKKwlldGhfc3EtPmJpZCA9IDB4RkZGRkZGRkY7CisJZXRoX3NxLT5jcV9vYmplY3QgPSBjcV9vYmplY3Q7CisKKwkvKiBUcmFuc2xhdGUgaHdsaWIgaW50ZXJmYWNlIHRvIGFybSBpbnRlcmZhY2UuICovCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBCRV9FVEhfVFhfUklOR19UWVBFX0ZPUldBUkRJTkc6CisJCXR5cGUgPSBFVEhfVFhfUklOR19UWVBFX0ZPUldBUkRJTkc7CisJCWJyZWFrOworCWNhc2UgQkVfRVRIX1RYX1JJTkdfVFlQRV9TVEFOREFSRDoKKwkJdHlwZSA9IEVUSF9UWF9SSU5HX1RZUEVfU1RBTkRBUkQ7CisJCWJyZWFrOworCWNhc2UgQkVfRVRIX1RYX1JJTkdfVFlQRV9CT1VORDoKKwkJQVNTRVJUKGV4X3BhcmFtZXRlcnMtPnBvcnQgPCAyKTsKKwkJdHlwZSA9IEVUSF9UWF9SSU5HX1RZUEVfQk9VTkQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVRSQUNFKERMX0VSUiwgIkludmFsaWQgZXRoIHR4IHJpbmcgdHlwZTolZCIsIHR5cGUpOworCQlyZXR1cm4gQkVfTk9UX09LOworCQlicmVhazsKKwl9CisKKwl3cmIgPSBiZV9mdW5jdGlvbl9wZWVrX21jY193cmIocGZvYik7CisJaWYgKCF3cmIpIHsKKwkJQVNTRVJUKHdyYik7CisJCVRSQUNFKERMX0VSUiwgIk5vIGZyZWUgTUNDIFdSQnMgaW4gY3JlYXRlIEVRLiIpOworCQlzdGF0dXMgPSBCRV9TVEFUVVNfTk9fTUNDX1dSQjsKKwkJZ290byBFcnJvcjsKKwl9CisJLyogTklDIG11c3QgYmUgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IGNvbmZpZy4gKi8KKwlBU1NFUlQocGZvYi0+ZndfY29uZmlnLm5pY191bHBfbWFzayk7CisKKwkvKgorCSAqIFRoZSB1bHAgcGFyYW1ldGVyIG11c3Qgc2VsZWN0IGEgdmFsaWQgTklDIFVMUAorCSAqIGZvciB0aGUgY3VycmVudCBjb25maWcuCisJICovCisJQVNTRVJUKCgxIDw8IHVscCkgJiBwZm9iLT5md19jb25maWcubmljX3VscF9tYXNrKTsKKworCS8qIFByZXBhcmVzIGFuIGVtYmVkZGVkIGZ3Y21kLCBpbmNsdWRpbmcgcmVxdWVzdC9yZXNwb25zZSBzaXplcy4gKi8KKwlmd2NtZCA9IEJFX1BSRVBBUkVfRU1CRURERURfRldDTUQocGZvYiwgd3JiLCBDT01NT05fRVRIX1RYX0NSRUFURSk7CisJZndjbWQtPmhlYWRlci5yZXF1ZXN0LnBvcnRfbnVtYmVyID0gZXhfcGFyYW1ldGVycy0+cG9ydDsKKworCUFNQVBfU0VUX0JJVFNfUFRSKEVUWF9DT05URVhULCBwZF9pZCwKKwkJCQkmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIDApOworCisJbiA9IGJlX3JpbmdfbGVuZ3RoX3RvX2VuY29kaW5nKGxlbmd0aCwgc2l6ZW9mKHN0cnVjdCBFVEhfV1JCX0FNQVApKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihFVFhfQ09OVEVYVCwgdHhfcmluZ19zaXplLAorCQkJCQkmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIG4pOworCisJQU1BUF9TRVRfQklUU19QVFIoRVRYX0NPTlRFWFQsIGNxX2lkX3NlbmQsCisJCQkmZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmNvbnRleHQsIGNxX29iamVjdC0+Y3FfaWQpOworCisJbiA9IHBmb2ItPnBjaV9mdW5jdGlvbl9udW1iZXI7CisJQU1BUF9TRVRfQklUU19QVFIoRVRYX0NPTlRFWFQsIGZ1bmMsICZmd2NtZC0+cGFyYW1zLnJlcXVlc3QuY29udGV4dCwgbik7CisKKwlmd2NtZC0+cGFyYW1zLnJlcXVlc3QudHlwZSA9IHR5cGU7CisJZndjbWQtPnBhcmFtcy5yZXF1ZXN0LnVscF9udW0gID0gKDEgPDwgdWxwKTsKKwlmd2NtZC0+cGFyYW1zLnJlcXVlc3QubnVtX3BhZ2VzID0gRElWX1JPVU5EX1VQKGxlbmd0aCwgUEFHRV9TSVpFKTsKKwlBU1NFUlQoUEFHRVNfU1BBTk5FRChyZC0+dmEsIHJkLT5sZW5ndGgpID49CisJCQkJZndjbWQtPnBhcmFtcy5yZXF1ZXN0Lm51bV9wYWdlcyk7CisKKwkvKiBDcmVhdGUgYSBwYWdlIGxpc3QgZm9yIHRoZSBGV0NNRC4gKi8KKwliZV9yZF90b19wYV9saXN0KHJkLCBmd2NtZC0+cGFyYW1zLnJlcXVlc3QucGFnZXMsCisJCQkgIEFSUkFZX1NJWkUoZndjbWQtPnBhcmFtcy5yZXF1ZXN0LnBhZ2VzKSk7CisKKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9wb3N0X21jY193cmIocGZvYiwgd3JiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkJCQlOVUxMLCBOVUxMLCBmd2NtZCwgTlVMTCk7CisJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTKSB7CisJCVRSQUNFKERMX0VSUiwgIk1DQyB0byBjcmVhdGUgZXR4IHF1ZXVlIGZhaWxlZC4iKTsKKwkJZ290byBFcnJvcjsKKwl9CisJLyogc2F2ZSB0aGUgYnV0bGVyIElEICovCisJZXRoX3NxLT5iaWQgPSBmd2NtZC0+cGFyYW1zLnJlc3BvbnNlLmNpZDsKKworCS8qIGFkZCBhIHJlZmVyZW5jZSB0byB0aGUgY29ycmVzcG9uZGluZyBDUSAqLworCWF0b21pY19pbmMoJmNxX29iamVjdC0+cmVmX2NvdW50KTsKKworRXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCWlmIChwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgJiYgcGZvYi0+bWNjKSB7CisJCXBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyA9IDA7CisJCWJlX2RyaXZlX21jY193cmJfcXVldWUocGZvYi0+bWNjKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworCisvKgorICAgIFRoaXMgcm91dGluZSBkZXN0cm95cyBhbiBldGhlcm5ldCBzZW5kIHF1ZXVlCisKKyAgICBFdGhTcSAtIEV0aFNxIEhhbmRsZSByZXR1cm5lZCBmcm9tIEV0aFNxQ3JlYXRlCisKKyAgICBUaGlzIGZ1bmN0aW9uIGFsd2F5cyByZXR1cm4gQkVfU1VDQ0VTUy4KKworICAgIFRoaXMgZnVuY3Rpb24gZnJlZXMgbWVtb3J5IGFsbG9jYXRlZCBieSBFdGhTcUNyZWF0ZSBmb3IgdGhlIEV0aFNxIE9iamVjdC4KKworKi8KK2ludCBiZV9ldGhfc3FfZGVzdHJveShzdHJ1Y3QgYmVfZXRoc3Ffb2JqZWN0ICpldGhfc3EpCit7CisJaW50IHN0YXR1cyA9IDA7CisKKwkvKiBTZW5kIGZ3Y21kIHRvIGRlc3Ryb3kgdGhlIHF1ZXVlLiAqLworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3JpbmdfZGVzdHJveShldGhfc3EtPnBhcmVudF9mdW5jdGlvbiwgZXRoX3NxLT5iaWQsCisJCSAgICAgRldDTURfUklOR19UWVBFX0VUSF9UWCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJQVNTRVJUKHN0YXR1cyA9PSAwKTsKKworCS8qIERlcmVmZW5jZSBhbnkgYXNzb2NpYXRlZCBDUXMuICovCisJYXRvbWljX2RlYygmZXRoX3NxLT5jcV9vYmplY3QtPnJlZl9jb3VudCk7CisJcmV0dXJuIHN0YXR1czsKK30KKy8qCisgICAgVGhpcyByb3V0aW5lIGF0dGVtcHRzIHRvIHNldCB0aGUgdHJhbnNtaXQgZmxvdyBjb250cm9sIHBhcmFtZXRlcnMuCisKKyAgICBGdW5jdGlvbk9iamVjdCAgICAgIC0gSGFuZGxlIHRvIGEgZnVuY3Rpb24gb2JqZWN0CisKKyAgICB0eGZjX2VuYWJsZSAgICAgICAgIC0gdHJhbnNtaXQgZmxvdyBjb250cm9sIGVuYWJsZSAtIHRydWUgZm9yCisJCQkgIGVuYWJsZSwgZmFsc2UgZm9yIGRpc2FibGUKKworICAgIHJ4ZmNfZW5hYmxlICAgICAgICAgLSByZWNlaXZlIGZsb3cgY29udHJvbCBlbmFibGUgLSB0cnVlIGZvcgorCQkJCWVuYWJsZSwgZmFsc2UgZm9yIGRpc2FibGUKKworICAgIFJldHVybnMgQkVfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsbCwgb3RoZXJ3aXNlIGEgdXNlZnVsIGludCBlcnJvcgorICAgIGNvZGUgaXMgcmV0dXJuZWQuCisKKyAgICBJUlFMOiA8IERJU1BBVENIX0xFVkVMCisKKyAgICBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBmYWlscyBpbiBub24tcHJpdmlsZWdlZCBtYWNoaW5lIGNvbnRleHQuCisqLworaW50CitiZV9ldGhfc2V0X2Zsb3dfY29udHJvbChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkJYm9vbCB0eGZjX2VuYWJsZSwgYm9vbCByeGZjX2VuYWJsZSkKK3sKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX1NFVF9GTE9XX0NPTlRST0wgKmZ3Y21kID0gTlVMTDsKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIgPSBOVUxMOworCWludCBzdGF0dXMgPSAwOworCXVuc2lnbmVkIGxvbmcgaXJxbDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJd3JiID0gYmVfZnVuY3Rpb25fcGVla19tY2Nfd3JiKHBmb2IpOworCWlmICghd3JiKSB7CisJCVRSQUNFKERMX0VSUiwgIk1DQyB3cmIgcGVlayBmYWlsZWQuIik7CisJCXN0YXR1cyA9IEJFX1NUQVRVU19OT19NQ0NfV1JCOworCQlnb3RvIGVycm9yOworCX0KKwkvKiBQcmVwYXJlcyBhbiBlbWJlZGRlZCBmd2NtZCwgaW5jbHVkaW5nIHJlcXVlc3QvcmVzcG9uc2Ugc2l6ZXMuICovCisJZndjbWQgPSBCRV9QUkVQQVJFX0VNQkVEREVEX0ZXQ01EKHBmb2IsIHdyYiwgQ09NTU9OX1NFVF9GTE9XX0NPTlRST0wpOworCisJZndjbWQtPnBhcmFtcy5yZXF1ZXN0LnJ4X2Zsb3dfY29udHJvbCA9IHJ4ZmNfZW5hYmxlOworCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC50eF9mbG93X2NvbnRyb2wgPSB0eGZjX2VuYWJsZTsKKworCS8qIFBvc3QgdGhlIGYvdyBjb21tYW5kICovCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fcG9zdF9tY2Nfd3JiKHBmb2IsIHdyYiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJCQkJTlVMTCwgTlVMTCwgZndjbWQsIE5VTEwpOworCisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCVRSQUNFKERMX0VSUiwgInNldCBmbG93IGNvbnRyb2wgZndjbWQgZmFpbGVkLiIpOworCQlnb3RvIGVycm9yOworCX0KKworZXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCWlmIChwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgJiYgcGZvYi0+bWNjKSB7CisJCXBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyA9IDA7CisJCWJlX2RyaXZlX21jY193cmJfcXVldWUocGZvYi0+bWNjKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAgICBUaGlzIHJvdXRpbmUgYXR0ZW1wdHMgdG8gZ2V0IHRoZSB0cmFuc21pdCBmbG93IGNvbnRyb2wgcGFyYW1ldGVycy4KKworICAgIHBmb2IgICAgICAtIEhhbmRsZSB0byBhIGZ1bmN0aW9uIG9iamVjdAorCisgICAgdHhmY19lbmFibGUgICAgICAgICAtIHRyYW5zbWl0IGZsb3cgY29udHJvbCBlbmFibGUgLSB0cnVlIGZvcgorCQkJZW5hYmxlLCBmYWxzZSBmb3IgZGlzYWJsZQorCisgICAgcnhmY19lbmFibGUgICAgICAgICAtIHJlY2VpdmUgZmxvdyBjb250cm9sIGVuYWJsZSAtIHRydWUgZm9yIGVuYWJsZSwKKwkJCWZhbHNlIGZvciBkaXNhYmxlCisKKyAgICBSZXR1cm5zIEJFX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bGwsIG90aGVyd2lzZSBhIHVzZWZ1bCBpbnQgZXJyb3IgY29kZQorCQkJaXMgcmV0dXJuZWQuCisKKyAgICBJUlFMOiA8IERJU1BBVENIX0xFVkVMCisKKyAgICBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBmYWlscyBpbiBub24tcHJpdmlsZWdlZCBtYWNoaW5lIGNvbnRleHQuCisqLworaW50CitiZV9ldGhfZ2V0X2Zsb3dfY29udHJvbChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkJYm9vbCAqdHhmY19lbmFibGUsIGJvb2wgKnJ4ZmNfZW5hYmxlKQoreworCXN0cnVjdCBGV0NNRF9DT01NT05fR0VUX0ZMT1dfQ09OVFJPTCAqZndjbWQgPSBOVUxMOworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiA9IE5VTEw7CisJaW50IHN0YXR1cyA9IDA7CisJdW5zaWduZWQgbG9uZyBpcnFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwl3cmIgPSBiZV9mdW5jdGlvbl9wZWVrX21jY193cmIocGZvYik7CisJaWYgKCF3cmIpIHsKKwkJVFJBQ0UoRExfRVJSLCAiTUNDIHdyYiBwZWVrIGZhaWxlZC4iKTsKKwkJc3RhdHVzID0gQkVfU1RBVFVTX05PX01DQ19XUkI7CisJCWdvdG8gZXJyb3I7CisJfQorCS8qIFByZXBhcmVzIGFuIGVtYmVkZGVkIGZ3Y21kLCBpbmNsdWRpbmcgcmVxdWVzdC9yZXNwb25zZSBzaXplcy4gKi8KKwlmd2NtZCA9IEJFX1BSRVBBUkVfRU1CRURERURfRldDTUQocGZvYiwgd3JiLCBDT01NT05fR0VUX0ZMT1dfQ09OVFJPTCk7CisKKwkvKiBQb3N0IHRoZSBmL3cgY29tbWFuZCAqLworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihwZm9iLCB3cmIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCQkJCQlOVUxMLCBOVUxMLCBmd2NtZCwgTlVMTCk7CisKKwlpZiAoc3RhdHVzICE9IDApIHsKKwkJVFJBQ0UoRExfRVJSLCAiZ2V0IGZsb3cgY29udHJvbCBmd2NtZCBmYWlsZWQuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJKnR4ZmNfZW5hYmxlID0gZndjbWQtPnBhcmFtcy5yZXNwb25zZS50eF9mbG93X2NvbnRyb2w7CisJKnJ4ZmNfZW5hYmxlID0gZndjbWQtPnBhcmFtcy5yZXNwb25zZS5yeF9mbG93X2NvbnRyb2w7CisKK2Vycm9yOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwlpZiAocGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nICYmIHBmb2ItPm1jYykgeworCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAwOworCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHBmb2ItPm1jYyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246IGJlX2V0aF9zZXRfcW9zCisgKiAgIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgZXRoZXJuZXQgdHJhbnNtaXQgUXVhbGl0eSBvZiBTZXJ2aWNlIChRb1MpCisgKiAgIGNoYXJhY3RlcmlzdGljcyBvZiBCbGFkZUVuZ2luZSBmb3IgdGhlIGRvbWFpbi4gQWxsIGV0aGVybmV0CisgKiAgIHRyYW5zbWl0IHJpbmdzIG9mIHRoZSBkb21haW4gd2lsbCBldmVubHkgc2hhcmUgdGhlIGJhbmR3aWR0aC4KKyAqICAgVGhlIGV4ZWNlcHRpb24gdG8gc2hhcmluZyBpcyB0aGUgaG9zdCBwcmltYXJ5IChzdXBlcikgZXRoZXJuZXQKKyAqICAgdHJhbnNtaXQgcmluZyBhcyB3ZWxsIGFzIHRoZSBob3N0IGV0aGVybmV0IGZvcndhcmRpbmcgcmluZworICogICBmb3IgbWlzc2VkIG9mZmxvYWQgZGF0YS4KKyAqIHBmb2IgLQorICogbWF4X2JwcyAgICAgICAgIC0gdGhlIG1heGltdW0gYml0cyBwZXIgc2Vjb25kIGluIHVuaXRzIG9mCisgKiAJCQkxMCBNYnBzICh2YWxpZCAwLTEwMCkKKyAqIG1heF9wcHMgICAgICAgICAtIHRoZSBtYXhpbXVtIHBhY2tldHMgcGVyIHNlY29uZCBpbiB1bml0cworICogCQkJb2YgMSBLcHBzICgwIGluZGljYXRlcyBubyBsaW1pdCkKKyAqIHJldHVybiBzdGF0dXMgICAtIEJFX1NVQ0NFU1MgKDApIG9uIHN1Y2Nlc3MuIE5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2ludAorYmVfZXRoX3NldF9xb3Moc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwgdTMyIG1heF9icHMsIHUzMiBtYXhfcHBzKQoreworCXN0cnVjdCBGV0NNRF9DT01NT05fU0VUX1FPUyAqZndjbWQgPSBOVUxMOworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiA9IE5VTEw7CisJaW50IHN0YXR1cyA9IDA7CisJdW5zaWduZWQgbG9uZyBpcnFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwl3cmIgPSBiZV9mdW5jdGlvbl9wZWVrX21jY193cmIocGZvYik7CisJaWYgKCF3cmIpIHsKKwkJVFJBQ0UoRExfRVJSLCAiTUNDIHdyYiBwZWVrIGZhaWxlZC4iKTsKKwkJc3RhdHVzID0gQkVfU1RBVFVTX05PX01DQ19XUkI7CisJCWdvdG8gZXJyb3I7CisJfQorCS8qIFByZXBhcmVzIGFuIGVtYmVkZGVkIGZ3Y21kLCBpbmNsdWRpbmcgcmVxdWVzdC9yZXNwb25zZSBzaXplcy4gKi8KKwlmd2NtZCA9IEJFX1BSRVBBUkVfRU1CRURERURfRldDTUQocGZvYiwgd3JiLCBDT01NT05fU0VUX1FPUyk7CisKKwkvKiBTZXQgZmllbGRzIGluIGZ3Y21kICovCisJZndjbWQtPnBhcmFtcy5yZXF1ZXN0Lm1heF9iaXRzX3Blcl9zZWNvbmRfTklDID0gbWF4X2JwczsKKwlmd2NtZC0+cGFyYW1zLnJlcXVlc3QubWF4X3BhY2tldHNfcGVyX3NlY29uZF9OSUMgPSBtYXhfcHBzOworCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC52YWxpZF9mbGFncyA9IFFPU19CSVRTX05JQyB8IFFPU19QS1RTX05JQzsKKworCS8qIFBvc3QgdGhlIGYvdyBjb21tYW5kICovCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fcG9zdF9tY2Nfd3JiKHBmb2IsIHdyYiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJCQkJTlVMTCwgTlVMTCwgZndjbWQsIE5VTEwpOworCisJaWYgKHN0YXR1cyAhPSAwKQorCQlUUkFDRShETF9FUlIsICJuZXR3b3JrIHNldCBxb3MgZndjbWQgZmFpbGVkLiIpOworCitlcnJvcjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCWlmIChwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgJiYgcGZvYi0+bWNjKSB7CisJCXBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyA9IDA7CisJCWJlX2RyaXZlX21jY193cmJfcXVldWUocGZvYi0+bWNjKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbjogYmVfZXRoX2dldF9xb3MKKyAqICAgVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIGV0aGVybmV0IHRyYW5zbWl0IFF1YWxpdHkgb2YgU2VydmljZSAoUW9TKQorICogICBjaGFyYWN0ZXJpc3RpY3MgZm9yIHRoZSBkb21haW4uCisgKiBtYXhfYnBzICAgICAgICAgLSB0aGUgbWF4aW11bSBiaXRzIHBlciBzZWNvbmQgaW4gdW5pdHMgb2YKKyAqIAkJCTEwIE1icHMgKHZhbGlkIDAtMTAwKQorICogbWF4X3BwcyAgICAgICAgIC0gdGhlIG1heGltdW0gcGFja2V0cyBwZXIgc2Vjb25kIGluIHVuaXRzIG9mCisgKiAJCQkxIEtwcHMgKDAgaW5kaWNhdGVzIG5vIGxpbWl0KQorICogcmV0dXJuIHN0YXR1cyAgIC0gQkVfU1VDQ0VTUyAoMCkgb24gc3VjY2Vzcy4gTmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworaW50CitiZV9ldGhfZ2V0X3FvcyhzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLCB1MzIgKm1heF9icHMsIHUzMiAqbWF4X3BwcykKK3sKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0dFVF9RT1MgKmZ3Y21kID0gTlVMTDsKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIgPSBOVUxMOworCWludCBzdGF0dXMgPSAwOworCXVuc2lnbmVkIGxvbmcgaXJxbDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJd3JiID0gYmVfZnVuY3Rpb25fcGVla19tY2Nfd3JiKHBmb2IpOworCWlmICghd3JiKSB7CisJCVRSQUNFKERMX0VSUiwgIk1DQyB3cmIgcGVlayBmYWlsZWQuIik7CisJCXN0YXR1cyA9IEJFX1NUQVRVU19OT19NQ0NfV1JCOworCQlnb3RvIGVycm9yOworCX0KKwkvKiBQcmVwYXJlcyBhbiBlbWJlZGRlZCBmd2NtZCwgaW5jbHVkaW5nIHJlcXVlc3QvcmVzcG9uc2Ugc2l6ZXMuICovCisJZndjbWQgPSBCRV9QUkVQQVJFX0VNQkVEREVEX0ZXQ01EKHBmb2IsIHdyYiwgQ09NTU9OX0dFVF9RT1MpOworCisJLyogUG9zdCB0aGUgZi93IGNvbW1hbmQgKi8KKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9wb3N0X21jY193cmIocGZvYiwgd3JiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkJCQlOVUxMLCBOVUxMLCBmd2NtZCwgTlVMTCk7CisKKwlpZiAoc3RhdHVzICE9IDApIHsKKwkJVFJBQ0UoRExfRVJSLCAibmV0d29yayBnZXQgcW9zIGZ3Y21kIGZhaWxlZC4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkqbWF4X2JwcyA9IGZ3Y21kLT5wYXJhbXMucmVzcG9uc2UubWF4X2JpdHNfcGVyX3NlY29uZF9OSUM7CisJKm1heF9wcHMgPSBmd2NtZC0+cGFyYW1zLnJlc3BvbnNlLm1heF9wYWNrZXRzX3Blcl9zZWNvbmRfTklDOworCitlcnJvcjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCWlmIChwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgJiYgcGZvYi0+bWNjKSB7CisJCXBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyA9IDA7CisJCWJlX2RyaXZlX21jY193cmJfcXVldWUocGZvYi0+bWNjKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbjogYmVfZXRoX3NldF9mcmFtZV9zaXplCisgKiAgIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgZXRoZXJuZXQgbWF4aW11bSBmcmFtZSBzaXplLiBUaGUgcHJldmlvdXMKKyAqICAgdmFsdWVzIGFyZSByZXR1cm5lZC4KKyAqIHBmb2IgLQorICogdHhfZnJhbWVfc2l6ZSAgIC0gbWF4aW11bSB0cmFuc21pdCBmcmFtZSBzaXplIGluIGJ5dGVzCisgKiByeF9mcmFtZV9zaXplICAgLSBtYXhpbXVtIHJlY2VpdmUgZnJhbWUgc2l6ZSBpbiBieXRlcworICogcmV0dXJuIHN0YXR1cyAgIC0gQkVfU1VDQ0VTUyAoMCkgb24gc3VjY2Vzcy4gTmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworaW50CitiZV9ldGhfc2V0X2ZyYW1lX3NpemUoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJICAgICAgdTMyICp0eF9mcmFtZV9zaXplLCB1MzIgKnJ4X2ZyYW1lX3NpemUpCit7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9TRVRfRlJBTUVfU0laRSAqZndjbWQgPSBOVUxMOworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiA9IE5VTEw7CisJaW50IHN0YXR1cyA9IDA7CisJdW5zaWduZWQgbG9uZyBpcnFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwl3cmIgPSBiZV9mdW5jdGlvbl9wZWVrX21jY193cmIocGZvYik7CisJaWYgKCF3cmIpIHsKKwkJVFJBQ0UoRExfRVJSLCAiTUNDIHdyYiBwZWVrIGZhaWxlZC4iKTsKKwkJc3RhdHVzID0gQkVfU1RBVFVTX05PX01DQ19XUkI7CisJCWdvdG8gZXJyb3I7CisJfQorCS8qIFByZXBhcmVzIGFuIGVtYmVkZGVkIGZ3Y21kLCBpbmNsdWRpbmcgcmVxdWVzdC9yZXNwb25zZSBzaXplcy4gKi8KKwlmd2NtZCA9IEJFX1BSRVBBUkVfRU1CRURERURfRldDTUQocGZvYiwgd3JiLCBDT01NT05fU0VUX0ZSQU1FX1NJWkUpOworCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5tYXhfdHhfZnJhbWVfc2l6ZSA9ICp0eF9mcmFtZV9zaXplOworCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5tYXhfcnhfZnJhbWVfc2l6ZSA9ICpyeF9mcmFtZV9zaXplOworCisJLyogUG9zdCB0aGUgZi93IGNvbW1hbmQgKi8KKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9wb3N0X21jY193cmIocGZvYiwgd3JiLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkJCQkJTlVMTCwgTlVMTCwgZndjbWQsIE5VTEwpOworCisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCVRSQUNFKERMX0VSUiwgIm5ldHdvcmsgc2V0IGZyYW1lIHNpemUgZndjbWQgZmFpbGVkLiIpOworCQlnb3RvIGVycm9yOworCX0KKworCSp0eF9mcmFtZV9zaXplID0gZndjbWQtPnBhcmFtcy5yZXNwb25zZS5jaGlwX21heF90eF9mcmFtZV9zaXplOworCSpyeF9mcmFtZV9zaXplID0gZndjbWQtPnBhcmFtcy5yZXNwb25zZS5jaGlwX21heF9yeF9mcmFtZV9zaXplOworCitlcnJvcjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCWlmIChwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgJiYgcGZvYi0+bWNjKSB7CisJCXBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyA9IDA7CisJCWJlX2RyaXZlX21jY193cmJfcXVldWUocGZvYi0+bWNjKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworCisvKgorICAgIFRoaXMgcm91dGluZSBjcmVhdGVzIGEgRXRoZXJuZXQgcmVjZWl2ZSByaW5nLgorCisgICAgcGZvYiAgICAgIC0gaGFuZGxlIHRvIGEgZnVuY3Rpb24gb2JqZWN0CisgICAgcnFfYmFzZV92YSAgICAgICAgICAgIC0gYmFzZSBWQSBmb3IgdGhlIGRlZmF1bHQgcmVjZWl2ZSByaW5nLiB0aGlzIG11c3QgYmUKKwkJCWV4YWN0bHkgOEsgaW4gbGVuZ3RoIGFuZCBjb250aW5ndW91cyBwaHlzaWNhbCBtZW1vcnkuCisgICAgY3Ffb2JqZWN0ICAgICAgICAgICAgLSBoYW5kbGUgdG8gYSBwcmV2aW91c2x5IGNyZWF0ZWQgQ1EgdG8gYmUgYXNzb2NpYXRlZAorCQkJd2l0aCB0aGUgUlEuCisgICAgcHBfZXRoX3JxICAgICAgICAgICAgIC0gcG9pbnRlciB0byBhbiBvcHFhdWUgaGFuZGxlIHdoZXJlIGFuIGV0aAorCQkJcmVjZWl2ZSBvYmplY3QgaXMgcmV0dXJuZWQuCisgICAgUmV0dXJucyBCRV9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWxsLCAsIG90aGVyd2lzZSBhIHVzZWZ1bAorICAgIGludCBlcnJvciBjb2RlIGlzIHJldHVybmVkLgorCisgICAgSVJRTDogPCBESVNQQVRDSF9MRVZFTAorICAgIHRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGEgc3RydWN0IGJlX2V0aHJxX29iamVjdCAqb2JqZWN0LgorICAgIHRoZXJlIG11c3QgYmUgbm8gbW9yZSB0aGFuIDEgb2YgdGhlc2UgcGVyIGZ1bmN0aW9uIG9iamVjdCwgdW5sZXNzIHRoZQorICAgIGZ1bmN0aW9uIG9iamVjdCBzdXBwb3J0cyBSU1MgKGlzIG5ldHdvcmtpbmcgYW5kIG9uIHRoZSBob3N0KS4KKyAgICB0aGUgcnFfYmFzZV92YSBtdXN0IHBvaW50IHRvIGEgYnVmZmVyIG9mIGV4YWN0bHkgOEsuCisgICAgdGhlIGVyeDo6aG9zdF9jcWlkIChvciBob3N0X3N0b3JfY3FpZCkgcmVnaXN0ZXIgYW5kIGVyeDo6cmluZ19wYWdlIHJlZ2lzdGVycworICAgIHdpbGwgYmUgdXBkYXRlZCBhcyBhcHByb3ByaWF0ZSBvbiByZXR1cm4KKyovCitpbnQKK2JlX2V0aF9ycV9jcmVhdGUoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJCXN0cnVjdCByaW5nX2Rlc2MgKnJkLCBzdHJ1Y3QgYmVfY3Ffb2JqZWN0ICpjcV9vYmplY3QsCisJCQlzdHJ1Y3QgYmVfY3Ffb2JqZWN0ICpiY21jX2NxX29iamVjdCwKKwkJCXN0cnVjdCBiZV9ldGhycV9vYmplY3QgKmV0aF9ycSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIgPSBOVUxMOworCXN0cnVjdCBGV0NNRF9DT01NT05fRVRIX1JYX0NSRUFURSAqZndjbWQgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgaXJxbDsKKworCS8qIE1QVSB3aWxsIHNldCB0aGUgICovCisJQVNTRVJUKHJkKTsKKwlBU1NFUlQoZXRoX3JxKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJZXRoX3JxLT5wYXJlbnRfZnVuY3Rpb24gPSBwZm9iOworCWV0aF9ycS0+Y3Ffb2JqZWN0ID0gY3Ffb2JqZWN0OworCisJd3JiID0gYmVfZnVuY3Rpb25fcGVla19tY2Nfd3JiKHBmb2IpOworCWlmICghd3JiKSB7CisJCVRSQUNFKERMX0VSUiwgIk1DQyB3cmIgcGVlayBmYWlsZWQuIik7CisJCXN0YXR1cyA9IEJFX1NUQVRVU19OT19NQ0NfV1JCOworCQlnb3RvIEVycm9yOworCX0KKwkvKiBQcmVwYXJlcyBhbiBlbWJlZGRlZCBmd2NtZCwgaW5jbHVkaW5nIHJlcXVlc3QvcmVzcG9uc2Ugc2l6ZXMuICovCisJZndjbWQgPSBCRV9QUkVQQVJFX0VNQkVEREVEX0ZXQ01EKHBmb2IsIHdyYiwgQ09NTU9OX0VUSF9SWF9DUkVBVEUpOworCisJZndjbWQtPnBhcmFtcy5yZXF1ZXN0Lm51bV9wYWdlcyA9IDI7CS8qIHJlcXVpcmVkIGxlbmd0aCAqLworCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jcV9pZCA9IGNxX29iamVjdC0+Y3FfaWQ7CisKKwlpZiAoYmNtY19jcV9vYmplY3QpCisJCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5iY21jX2NxX2lkID0gYmNtY19jcV9vYmplY3QtPmNxX2lkOworCWVsc2UKKwkJZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmJjbWNfY3FfaWQgPSAweEZGRkY7CisKKwkvKiBDcmVhdGUgYSBwYWdlIGxpc3QgZm9yIHRoZSBGV0NNRC4gKi8KKwliZV9yZF90b19wYV9saXN0KHJkLCBmd2NtZC0+cGFyYW1zLnJlcXVlc3QucGFnZXMsCisJCQkgIEFSUkFZX1NJWkUoZndjbWQtPnBhcmFtcy5yZXF1ZXN0LnBhZ2VzKSk7CisKKwkvKiBQb3N0IHRoZSBmL3cgY29tbWFuZCAqLworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihwZm9iLCB3cmIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCQkJCQlOVUxMLCBOVUxMLCBmd2NtZCwgTlVMTCk7CisJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTKSB7CisJCVRSQUNFKERMX0VSUiwgImZ3Y21kIHRvIG1hcCBldGggcnhxIGZyYWdzIGZhaWxlZC4iKTsKKwkJZ290byBFcnJvcjsKKwl9CisJLyogU2F2ZSB0aGUgcmluZyBJRCBmb3IgY2xlYW51cC4gKi8KKwlldGhfcnEtPnJpZCA9IGZ3Y21kLT5wYXJhbXMucmVzcG9uc2UuaWQ7CisKKwlhdG9taWNfaW5jKCZjcV9vYmplY3QtPnJlZl9jb3VudCk7CisKK0Vycm9yOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwlpZiAocGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nICYmIHBmb2ItPm1jYykgeworCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAwOworCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHBmb2ItPm1jYyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgICAgVGhpcyByb3V0aW5lIGRlc3Ryb3lzIGFuIEV0aGVybmV0IHJlY2VpdmUgcXVldWUKKworICAgIGV0aF9ycSAtIGV0aGVybmV0IHJlY2VpdmUgcXVldWUgaGFuZGxlIHJldHVybmVkIGZyb20gZXRoX3JxX2NyZWF0ZQorCisgICAgUmV0dXJucyBCRV9TVUNDRVNTIG9uIHN1Y2Nlc3MgYW5kIGFuIGFwcHJvcHJpYXRlIGludCBvbiBmYWlsdXJlLgorCisgICAgVGhpcyBmdW5jdGlvbiBmcmVlcyByZXNvdXJjcyBhbGxvY2F0ZWQgYnkgRXRoUnFDcmVhdGUuCisgICAgVGhlIGVyeDo6aG9zdF9jcWlkIChvciBob3N0X3N0b3JfY3FpZCkgcmVnaXN0ZXIgYW5kIGVyeDo6cmluZ19wYWdlCisgICAgcmVnaXN0ZXJzIHdpbGwgYmUgdXBkYXRlZCBhcyBhcHByb3ByaWF0ZSBvbiByZXR1cm4KKyAgICBJUlFMOiA8IERJU1BBVENIX0xFVkVMCisqLworCitzdGF0aWMgdm9pZCBiZV9ldGhfcnFfZGVzdHJveV9pbnRlcm5hbF9jYih2b2lkICpjb250ZXh0LCBpbnQgc3RhdHVzLAorCQkJCQkgc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiKQoreworCXN0cnVjdCBiZV9ldGhycV9vYmplY3QgKmV0aF9ycSA9IChzdHJ1Y3QgYmVfZXRocnFfb2JqZWN0ICopIGNvbnRleHQ7CisKKwlpZiAoc3RhdHVzICE9IEJFX1NVQ0NFU1MpIHsKKwkJVFJBQ0UoRExfRVJSLCAiRGVzdHJveSBldGggcnEgZmFpbGVkIGluIGludGVybmFsIGNhbGxiYWNrLlxuIik7CisJfSBlbHNlIHsKKwkJLyogRGVyZWZlcmVuY2UgYW55IENRcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBxdWV1ZS4gKi8KKwkJYXRvbWljX2RlYygmZXRoX3JxLT5jcV9vYmplY3QtPnJlZl9jb3VudCk7CisJfQorCisJcmV0dXJuOworfQorCitpbnQgYmVfZXRoX3JxX2Rlc3Ryb3koc3RydWN0IGJlX2V0aHJxX29iamVjdCAqZXRoX3JxKQoreworCWludCBzdGF0dXMgPSBCRV9TVUNDRVNTOworCisJLyogU2VuZCBmd2NtZCB0byBkZXN0cm95IHRoZSBSUS4gKi8KKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9yaW5nX2Rlc3Ryb3koZXRoX3JxLT5wYXJlbnRfZnVuY3Rpb24sCisJCQlldGhfcnEtPnJpZCwgRldDTURfUklOR19UWVBFX0VUSF9SWCwgTlVMTCwgTlVMTCwKKwkJCWJlX2V0aF9ycV9kZXN0cm95X2ludGVybmFsX2NiLCBldGhfcnEpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbjogYmVfZXRoX3JxX2Rlc3Ryb3lfb3B0aW9ucworICogICBEZXN0cm95cyBhbiBldGhlcm5ldCByZWNlaXZlIHJpbmcgd2l0aCBmaW5lciBncmFudWxhcml0eSBvcHRpb25zCisgKiAgIHRoYW4gdGhlIHN0YW5kYXJkIGJlX2V0aF9ycV9kZXN0cm95KCkgQVBJIGZ1bmN0aW9uLgorICogZXRoX3JxICAgICAgICAgICAtCisgKiBmbHVzaCAgICAgICAgICAgIC0gU2V0IHRvIDEgdG8gZmx1c2ggdGhlIHJpbmcsIHNldCB0byAwIHRvIGJ5cGFzcyB0aGUgZmx1c2gKKyAqIGNiICAgICAgICAgICAgICAgLSBDYWxsYmFjayBmdW5jdGlvbiBvbiBjb21wbGV0aW9uCisgKiBjYl9jb250ZXh0ICAgICAgIC0gQ2FsbGJhY2sgY29udGV4dAorICogcmV0dXJuIHN0YXR1cyAgICAtIEJFX1NVQ0NFU1MgKDApIG9uIHN1Y2Nlc3MuIE5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbnQKK2JlX2V0aF9ycV9kZXN0cm95X29wdGlvbnMoc3RydWN0IGJlX2V0aHJxX29iamVjdCAqZXRoX3JxLCBib29sIGZsdXNoLAorCQltY2Nfd3JiX2NxZV9jYWxsYmFjayBjYiwgdm9pZCAqY2JfY29udGV4dCkKK3sKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX1JJTkdfREVTVFJPWSAqZndjbWQgPSBOVUxMOworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiA9IE5VTEw7CisJaW50IHN0YXR1cyA9IEJFX1NVQ0NFU1M7CisJc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBpcnFsOworCisJcGZvYiA9IGV0aF9ycS0+cGFyZW50X2Z1bmN0aW9uOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwlUUkFDRShETF9JTkZPLCAiRGVzdHJveSBldGhfcnEgcmluZyBpZDolZCwgZmx1c2g6JWQiLCBldGhfcnEtPnJpZCwKKwkgICAgICBmbHVzaCk7CisKKwl3cmIgPSBiZV9mdW5jdGlvbl9wZWVrX21jY193cmIocGZvYik7CisJaWYgKCF3cmIpIHsKKwkJQVNTRVJUKHdyYik7CisJCVRSQUNFKERMX0VSUiwgIk5vIGZyZWUgTUNDIFdSQnMgaW4gZGVzdHJveSBldGhfcnEgcmluZy4iKTsKKwkJc3RhdHVzID0gQkVfU1RBVFVTX05PX01DQ19XUkI7CisJCWdvdG8gRXJyb3I7CisJfQorCS8qIFByZXBhcmVzIGFuIGVtYmVkZGVkIGZ3Y21kLCBpbmNsdWRpbmcgcmVxdWVzdC9yZXNwb25zZSBzaXplcy4gKi8KKwlmd2NtZCA9IEJFX1BSRVBBUkVfRU1CRURERURfRldDTUQocGZvYiwgd3JiLCBDT01NT05fUklOR19ERVNUUk9ZKTsKKworCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5pZCA9IGV0aF9ycS0+cmlkOworCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5yaW5nX3R5cGUgPSBGV0NNRF9SSU5HX1RZUEVfRVRIX1JYOworCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5ieXBhc3NfZmx1c2ggPSAoKDAgPT0gZmx1c2gpID8gMSA6IDApOworCisJLyogUG9zdCB0aGUgZi93IGNvbW1hbmQgKi8KKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9wb3N0X21jY193cmIocGZvYiwgd3JiLCBOVUxMLCBjYiwgY2JfY29udGV4dCwKKwkJCWJlX2V0aF9ycV9kZXN0cm95X2ludGVybmFsX2NiLCBldGhfcnEsIGZ3Y21kLCBOVUxMKTsKKworCWlmIChzdGF0dXMgIT0gQkVfU1VDQ0VTUyAmJiBzdGF0dXMgIT0gQkVfUEVORElORykgeworCQlUUkFDRShETF9FUlIsICJldGhfcnEgcmluZyBkZXN0cm95IGZhaWxlZC4gaWQ6JWQsIGZsdXNoOiVkIiwKKwkJICAgICAgZXRoX3JxLT5yaWQsIGZsdXNoKTsKKwkJZ290byBFcnJvcjsKKwl9CisKK0Vycm9yOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwlpZiAocGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nICYmIHBmb2ItPm1jYykgeworCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAwOworCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHBmb2ItPm1jYyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgICAgVGhpcyByb3V0aW5lIHF1ZXJpZXMgdGhlIGZyYWcgc2l6ZSBmb3IgZXJ4LgorCisgICAgcGZvYiAgICAgIC0gaGFuZGxlIHRvIGEgZnVuY3Rpb24gb2JqZWN0CisKKyAgICBmcmFnX3NpemVfYnl0ZXMgICAgICAgLSBlcnggZnJhZyBzaXplIGluIGJ5dGVzIHRoYXQgaXMvd2FzIHNldC4KKworICAgIFJldHVybnMgQkVfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsbCwgb3RoZXJ3aXNlIGEgdXNlZnVsIGludCBlcnJvcgorICAgIGNvZGUgaXMgcmV0dXJuZWQuCisKKyAgICBJUlFMOiA8IERJU1BBVENIX0xFVkVMCisKKyovCitpbnQKK2JlX2V0aF9ycV9nZXRfZnJhZ19zaXplKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsIHUzMiAqZnJhZ19zaXplX2J5dGVzKQoreworCXN0cnVjdCBGV0NNRF9FVEhfR0VUX1JYX0ZSQUdfU0laRSAqZndjbWQgPSBOVUxMOworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiA9IE5VTEw7CisJaW50IHN0YXR1cyA9IDA7CisJdW5zaWduZWQgbG9uZyBpcnFsOworCisJQVNTRVJUKGZyYWdfc2l6ZV9ieXRlcyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCXdyYiA9IGJlX2Z1bmN0aW9uX3BlZWtfbWNjX3dyYihwZm9iKTsKKwlpZiAoIXdyYikgeworCQlUUkFDRShETF9FUlIsICJNQ0Mgd3JiIHBlZWsgZmFpbGVkLiIpOworCQlyZXR1cm4gQkVfU1RBVFVTX05PX01DQ19XUkI7CisJfQorCS8qIFByZXBhcmVzIGFuIGVtYmVkZGVkIGZ3Y21kLCBpbmNsdWRpbmcgcmVxdWVzdC9yZXNwb25zZSBzaXplcy4gKi8KKwlmd2NtZCA9IEJFX1BSRVBBUkVfRU1CRURERURfRldDTUQocGZvYiwgd3JiLCBFVEhfR0VUX1JYX0ZSQUdfU0laRSk7CisKKwkvKiBQb3N0IHRoZSBmL3cgY29tbWFuZCAqLworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihwZm9iLCB3cmIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCQkJTlVMTCwgTlVMTCwgZndjbWQsIE5VTEwpOworCisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCVRSQUNFKERMX0VSUiwgImdldCBmcmFnIHNpemUgZndjbWQgZmFpbGVkLiIpOworCQlnb3RvIGVycm9yOworCX0KKworCSpmcmFnX3NpemVfYnl0ZXMgPSAxIDw8IGZ3Y21kLT5wYXJhbXMucmVzcG9uc2UuYWN0dWFsX2ZyYWdzaXplX2xvZzI7CisKK2Vycm9yOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwlpZiAocGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nICYmIHBmb2ItPm1jYykgeworCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAwOworCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHBmb2ItPm1jYyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgICAgVGhpcyByb3V0aW5lIGF0dGVtcHRzIHRvIHNldCB0aGUgZnJhZyBzaXplIGZvciBlcnguICBJZiB0aGUgZnJhZyBzaXplIGlzCisgICAgYWxyZWFkeSBzZXQsIHRoZSBhdHRlbXB0IGZhaWxzIGFuZCB0aGUgY3VycmVudCBmcmFnIHNpemUgaXMgcmV0dXJuZWQuCisKKyAgICBwZm9iICAgICAgLSBIYW5kbGUgdG8gYSBmdW5jdGlvbiBvYmplY3QKKworICAgIGZyYWdfc2l6ZSAgICAgICAtIEVyeCBmcmFnIHNpemUgaW4gYnl0ZXMgdGhhdCBpcy93YXMgc2V0LgorCisgICAgY3VycmVudF9mcmFnX3NpemVfYnl0ZXMgICAgLSBQb2ludGVyIHRvIGxvY2F0aW9uIHdoZXJlIGN1cnJyZW50IGZyYWcKKwkJCQkgaXMgdG8gYmUgcnR1cm5lZAorCisgICAgUmV0dXJucyBCRV9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWxsLCBvdGhlcndpc2UgYSB1c2VmdWwgaW50IGVycm9yCisgICAgY29kZSBpcyByZXR1cm5lZC4KKworICAgIElSUUw6IDwgRElTUEFUQ0hfTEVWRUwKKworICAgIFRoaXMgZnVuY3Rpb24gYWx3YXlzIGZhaWxzIGluIG5vbi1wcml2aWxlZ2VkIG1hY2hpbmUgY29udGV4dC4KKyovCitpbnQKK2JlX2V0aF9ycV9zZXRfZnJhZ19zaXplKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCQl1MzIgZnJhZ19zaXplLCB1MzIgKmZyYWdfc2l6ZV9ieXRlcykKK3sKKwlzdHJ1Y3QgRldDTURfRVRIX1NFVF9SWF9GUkFHX1NJWkUgKmZ3Y21kID0gTlVMTDsKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIgPSBOVUxMOworCWludCBzdGF0dXMgPSAwOworCXVuc2lnbmVkIGxvbmcgaXJxbDsKKworCUFTU0VSVChmcmFnX3NpemVfYnl0ZXMpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwl3cmIgPSBiZV9mdW5jdGlvbl9wZWVrX21jY193cmIocGZvYik7CisJaWYgKCF3cmIpIHsKKwkJVFJBQ0UoRExfRVJSLCAiTUNDIHdyYiBwZWVrIGZhaWxlZC4iKTsKKwkJc3RhdHVzID0gQkVfU1RBVFVTX05PX01DQ19XUkI7CisJCWdvdG8gZXJyb3I7CisJfQorCS8qIFByZXBhcmVzIGFuIGVtYmVkZGVkIGZ3Y21kLCBpbmNsdWRpbmcgcmVxdWVzdC9yZXNwb25zZSBzaXplcy4gKi8KKwlmd2NtZCA9IEJFX1BSRVBBUkVfRU1CRURERURfRldDTUQocGZvYiwgd3JiLCBFVEhfU0VUX1JYX0ZSQUdfU0laRSk7CisKKwlBU1NFUlQoZnJhZ19zaXplID49IDEyOCAmJiBmcmFnX3NpemUgPD0gMTYgKiAxMDI0KTsKKworCS8qIFRoaXMgaXMgdGhlIGxvZzIgb2YgdGhlIGZyYWdzaXplLiAgVGhpcyBpcyBub3QgdGhlIGV4YWN0CisJICogRVJYIGVuY29kaW5nLiAqLworCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5uZXdfZnJhZ3NpemVfbG9nMiA9IF9faWxvZzJfdTMyKGZyYWdfc2l6ZSk7CisKKwkvKiBQb3N0IHRoZSBmL3cgY29tbWFuZCAqLworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihwZm9iLCB3cmIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCQkJTlVMTCwgTlVMTCwgZndjbWQsIE5VTEwpOworCisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCVRSQUNFKERMX0VSUiwgInNldCBmcmFnIHNpemUgZndjbWQgZmFpbGVkLiIpOworCQlnb3RvIGVycm9yOworCX0KKworCSpmcmFnX3NpemVfYnl0ZXMgPSAxIDw8IGZ3Y21kLT5wYXJhbXMucmVzcG9uc2UuYWN0dWFsX2ZyYWdzaXplX2xvZzI7CitlcnJvcjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJaWYgKHBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyAmJiBwZm9iLT5tY2MpIHsKKwkJcGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nID0gMDsKKwkJYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShwZm9iLT5tY2MpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisKKy8qCisgICAgVGhpcyByb3V0aW5lIGdldHMgb3Igc2V0cyBhIG1hYyBhZGRyZXNzIGZvciBhIGRvbWFpbgorICAgIGdpdmVuIHRoZSBwb3J0IGFuZCBtYWMuCisKKyAgICBGdW5jdGlvbk9iamVjdCAgLSBGdW5jdGlvbiBvYmplY3QgaGFuZGxlLgorICAgIHBvcnQxICAgICAgICAgICAtIFNldCB0byBUUlVFIGlmIHRoaXMgZnVuY3Rpb24gd2lsbCBzZXQvZ2V0IHRoZSBQb3J0IDEKKwkJCWFkZHJlc3MuICBPbmx5IHRoZSBob3N0IG1heSBzZXQgdGhpcyB0byBUUlVFLgorICAgIG1hYzEgICAgICAgICAgICAtIFNldCB0byBUUlVFIGlmIHRoaXMgZnVuY3Rpb24gd2lsbCBzZXQvZ2V0IHRoZQorCQkJTUFDIDEgYWRkcmVzcy4gIE9ubHkgdGhlIGhvc3QgbWF5IHNldCB0aGlzIHRvIFRSVUUuCisgICAgd3JpdGUgICAgICAgICAgIC0gU2V0IHRvIFRSVUUgaWYgdGhpcyBmdW5jdGlvbiBzaG91bGQgd3JpdGUgdGhlIG1hYyBhZGRyZXNzLgorICAgIG1hY19hZGRyZXNzICAgICAgLSBCdWZmZXIgb2YgdGhlIG1hYyBhZGRyZXNzIHRvIHJlYWQgb3Igd3JpdGUuCisKKyAgICBSZXR1cm5zIEJFX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bGwsIG90aGVyd2lzZSBhIHVzZWZ1bCBpbnQgaXMgcmV0dXJuZWQuCisKKyAgICBJUlFMOiA8IERJU1BBVENIX0xFVkVMCisqLworaW50IGJlX3J4Zl9tYWNfYWRkcmVzc19yZWFkX3dyaXRlKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCWJvb2wgcG9ydDEsCS8qIFZNIG11c3QgYWx3YXlzIHNldCB0byBmYWxzZSAqLworCQlib29sIG1hYzEsCS8qIFZNIG11c3QgYWx3YXlzIHNldCB0byBmYWxzZSAqLworCQlib29sIG1nbXQsIGJvb2wgd3JpdGUsCisJCWJvb2wgcGVybWFuZW50LCB1OCAqbWFjX2FkZHJlc3MsCisJCW1jY193cmJfY3FlX2NhbGxiYWNrIGNiLAkvKiBvcHRpb25hbCAqLworCQl2b2lkICpjYl9jb250ZXh0KQkvKiBvcHRpb25hbCAqLworeworCWludCBzdGF0dXMgPSBCRV9TVUNDRVNTOworCXVuaW9uIHsKKwkJc3RydWN0IEZXQ01EX0NPTU1PTl9OVFdLX01BQ19RVUVSWSAqcXVlcnk7CisJCXN0cnVjdCBGV0NNRF9DT01NT05fTlRXS19NQUNfU0VUICpzZXQ7CisJfSBmd2NtZCA9IHtOVUxMfTsKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIgPSBOVUxMOworCXUzMiB0eXBlID0gMDsKKwl1bnNpZ25lZCBsb25nIGlycWw7CisJc3RydWN0IGJlX21jY193cmJfcmVzcG9uc2VfY29weSByYzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJQVNTRVJUKG1hY19hZGRyZXNzKTsKKworCUFTU0VSVChwb3J0MSA9PSBmYWxzZSk7CisJQVNTRVJUKG1hYzEgPT0gZmFsc2UpOworCisJd3JiID0gYmVfZnVuY3Rpb25fcGVla19tY2Nfd3JiKHBmb2IpOworCWlmICghd3JiKSB7CisJCVRSQUNFKERMX0VSUiwgIk1DQyB3cmIgcGVlayBmYWlsZWQuIik7CisJCXN0YXR1cyA9IEJFX1NUQVRVU19OT19NQ0NfV1JCOworCQlnb3RvIEVycm9yOworCX0KKworCWlmIChtZ210KSB7CisJCXR5cGUgPSBNQUNfQUREUkVTU19UWVBFX01BTkFHRU1FTlQ7CisJfSBlbHNlIHsKKwkJaWYgKHBmb2ItPnR5cGUgPT0gQkVfRlVOQ1RJT05fVFlQRV9ORVRXT1JLKQorCQkJdHlwZSA9IE1BQ19BRERSRVNTX1RZUEVfTkVUV09SSzsKKwkJZWxzZQorCQkJdHlwZSA9IE1BQ19BRERSRVNTX1RZUEVfU1RPUkFHRTsKKwl9CisKKwlpZiAod3JpdGUpIHsKKwkJLyogUHJlcGFyZXMgYW4gZW1iZWRkZWQgZndjbWQsIGluY2x1ZGluZworCQkgKiByZXF1ZXN0L3Jlc3BvbnNlIHNpemVzLgorCQkgKi8KKwkJZndjbWQuc2V0ID0gQkVfUFJFUEFSRV9FTUJFRERFRF9GV0NNRChwZm9iLAorCQkJCQkgICAgICAgd3JiLCBDT01NT05fTlRXS19NQUNfU0VUKTsKKworCQlmd2NtZC5zZXQtPnBhcmFtcy5yZXF1ZXN0LmludmFsaWRhdGUgPSAwOworCQlmd2NtZC5zZXQtPnBhcmFtcy5yZXF1ZXN0Lm1hYzEgPSAobWFjMSA/IDEgOiAwKTsKKwkJZndjbWQuc2V0LT5wYXJhbXMucmVxdWVzdC5wb3J0ID0gKHBvcnQxID8gMSA6IDApOworCQlmd2NtZC5zZXQtPnBhcmFtcy5yZXF1ZXN0LnR5cGUgPSB0eXBlOworCisJCS8qIENvcHkgdGhlIG1hYyBhZGRyZXNzIHRvIHNldC4gKi8KKwkJZndjbWQuc2V0LT5wYXJhbXMucmVxdWVzdC5tYWMuU2l6ZU9mU3RydWN0dXJlID0KKwkJCSAgICBzaXplb2YoZndjbWQuc2V0LT5wYXJhbXMucmVxdWVzdC5tYWMpOworCQltZW1jcHkoZndjbWQuc2V0LT5wYXJhbXMucmVxdWVzdC5tYWMuTUFDQWRkcmVzcywKKwkJCW1hY19hZGRyZXNzLCBFVEhfQUxFTik7CisKKwkJLyogUG9zdCB0aGUgZi93IGNvbW1hbmQgKi8KKwkJc3RhdHVzID0gYmVfZnVuY3Rpb25fcG9zdF9tY2Nfd3JiKHBmb2IsIHdyYiwgTlVMTCwKKwkJCQljYiwgY2JfY29udGV4dCwgTlVMTCwgTlVMTCwgZndjbWQuc2V0LCBOVUxMKTsKKworCX0gZWxzZSB7CisKKwkJLyoKKwkJICogUHJlcGFyZXMgYW4gZW1iZWRkZWQgZndjbWQsIGluY2x1ZGluZworCQkgKiByZXF1ZXN0L3Jlc3BvbnNlIHNpemVzLgorCQkgKi8KKwkJZndjbWQucXVlcnkgPSBCRV9QUkVQQVJFX0VNQkVEREVEX0ZXQ01EKHBmb2IsCisJCQkJCSAgICAgICB3cmIsIENPTU1PTl9OVFdLX01BQ19RVUVSWSk7CisKKwkJZndjbWQucXVlcnktPnBhcmFtcy5yZXF1ZXN0Lm1hYzEgPSAobWFjMSA/IDEgOiAwKTsKKwkJZndjbWQucXVlcnktPnBhcmFtcy5yZXF1ZXN0LnBvcnQgPSAocG9ydDEgPyAxIDogMCk7CisJCWZ3Y21kLnF1ZXJ5LT5wYXJhbXMucmVxdWVzdC50eXBlID0gdHlwZTsKKwkJZndjbWQucXVlcnktPnBhcmFtcy5yZXF1ZXN0LnBlcm1hbmVudCA9IHBlcm1hbmVudDsKKworCQlyYy5sZW5ndGggPSBGSUVMRF9TSVpFT0Yoc3RydWN0IEZXQ01EX0NPTU1PTl9OVFdLX01BQ19RVUVSWSwKKwkJCQkJCXBhcmFtcy5yZXNwb25zZS5tYWMuTUFDQWRkcmVzcyk7CisJCXJjLmZ3Y21kX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBGV0NNRF9DT01NT05fTlRXS19NQUNfUVVFUlksCisJCQkJCQlwYXJhbXMucmVzcG9uc2UubWFjLk1BQ0FkZHJlc3MpOworCQlyYy52YSA9IG1hY19hZGRyZXNzOworCQkvKiBQb3N0IHRoZSBmL3cgY29tbWFuZCAod2l0aCBhIGNvcHkgZm9yIHRoZSByZXNwb25zZSkgKi8KKwkJc3RhdHVzID0gYmVfZnVuY3Rpb25fcG9zdF9tY2Nfd3JiKHBmb2IsIHdyYiwgTlVMTCwgY2IsCisJCQkJY2JfY29udGV4dCwgTlVMTCwgTlVMTCwgZndjbWQucXVlcnksICZyYyk7CisJfQorCisJaWYgKHN0YXR1cyA8IDApIHsKKwkJVFJBQ0UoRExfRVJSLCAibWFjIHNldC9xdWVyeSBmYWlsZWQuIik7CisJCWdvdG8gRXJyb3I7CisJfQorCitFcnJvcjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCWlmIChwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgJiYgcGZvYi0+bWNjKSB7CisJCXBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyA9IDA7CisJCWJlX2RyaXZlX21jY193cmJfcXVldWUocGZvYi0+bWNjKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAgICBUaGlzIHJvdXRpbmUgd3JpdGVzIGRhdGEgdG8gY29udGV4dCBtZW1vcnkuCisKKyAgICBwZm9iICAtIEZ1bmN0aW9uIG9iamVjdCBoYW5kbGUuCisgICAgbWFjX3RhYmxlICAgICAtIFNldCB0byB0aGUgMTI4LWJpdCBtdWx0aWNhc3QgYWRkcmVzcyBoYXNoIHRhYmxlLgorCisgICAgUmV0dXJucyBCRV9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWxsLCBvdGhlcndpc2UgYSB1c2VmdWwgaW50IGlzIHJldHVybmVkLgorCisgICAgSVJRTDogPCBESVNQQVRDSF9MRVZFTAorKi8KKworaW50IGJlX3J4Zl9tdWx0aWNhc3RfY29uZmlnKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCWJvb2wgcHJvbWlzY3VvdXMsIHUzMiBudW0sIHU4ICptYWNfdGFibGUsCisJCW1jY193cmJfY3FlX2NhbGxiYWNrIGNiLAkvKiBvcHRpb25hbCAqLworCQl2b2lkICpjYl9jb250ZXh0LAorCQlzdHJ1Y3QgYmVfbXVsdGljYXN0X3FfY3R4dCAqcV9jdHh0KQoreworCWludCBzdGF0dXMgPSBCRV9TVUNDRVNTOworCXN0cnVjdCBGV0NNRF9DT01NT05fTlRXS19NVUxUSUNBU1RfU0VUICpmd2NtZCA9IE5VTEw7CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiID0gTlVMTDsKKwlzdHJ1Y3QgYmVfZ2VuZXJpY19xX2N0eHQgKmdlbmVyaWNfY3R4dCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBpcnFsOworCisJQVNTRVJUKG51bSA8PSBBUlJBWV9TSVpFKGZ3Y21kLT5wYXJhbXMucmVxdWVzdC5tYWMpKTsKKworCWlmIChudW0gPiBBUlJBWV9TSVpFKGZ3Y21kLT5wYXJhbXMucmVxdWVzdC5tYWMpKSB7CisJCVRSQUNFKERMX0VSUiwgIlRvbyBtYW55IG11bHRpY2FzdCBhZGRyZXNzZXMuIEJFIHN1cHBvcnRzICVkLiIsCisJCSAgICAgIChpbnQpIEFSUkFZX1NJWkUoZndjbWQtPnBhcmFtcy5yZXF1ZXN0Lm1hYykpOworCQlyZXR1cm4gQkVfTk9UX09LOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJd3JiID0gYmVfZnVuY3Rpb25fcGVla19tY2Nfd3JiKHBmb2IpOworCWlmICghd3JiKSB7CisJCWlmIChxX2N0eHQgJiYgY2IpIHsKKwkJCXdyYiA9IChzdHJ1Y3QgTUNDX1dSQl9BTUFQICopICZxX2N0eHQtPndyYl9oZWFkZXI7CisJCQlnZW5lcmljX2N0eHQgPSAoc3RydWN0IGJlX2dlbmVyaWNfcV9jdHh0ICopIHFfY3R4dDsKKwkJCWdlbmVyaWNfY3R4dC0+Y29udGV4dC5ieXRlcyA9IHNpemVvZigqcV9jdHh0KTsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IEJFX1NUQVRVU19OT19NQ0NfV1JCOworCQkJZ290byBFcnJvcjsKKwkJfQorCX0KKwkvKiBQcmVwYXJlcyBhbiBlbWJlZGRlZCBmd2NtZCwgaW5jbHVkaW5nIHJlcXVlc3QvcmVzcG9uc2Ugc2l6ZXMuICovCisJZndjbWQgPSBCRV9QUkVQQVJFX0VNQkVEREVEX0ZXQ01EKHBmb2IsIHdyYiwgQ09NTU9OX05UV0tfTVVMVElDQVNUX1NFVCk7CisKKwlmd2NtZC0+cGFyYW1zLnJlcXVlc3QucHJvbWlzY3VvdXMgPSBwcm9taXNjdW91czsKKwlpZiAoIXByb21pc2N1b3VzKSB7CisJCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5udW1fbWFjID0gbnVtOworCQlpZiAobnVtID4gMCkgeworCQkJQVNTRVJUKG1hY190YWJsZSk7CisJCQltZW1jcHkoZndjbWQtPnBhcmFtcy5yZXF1ZXN0Lm1hYywKKwkJCQkJCW1hY190YWJsZSwgRVRIX0FMRU4gKiBudW0pOworCQl9CisJfQorCisJLyogUG9zdCB0aGUgZi93IGNvbW1hbmQgKi8KKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9wb3N0X21jY193cmIocGZvYiwgd3JiLCBnZW5lcmljX2N0eHQsCisJCQljYiwgY2JfY29udGV4dCwgTlVMTCwgTlVMTCwgZndjbWQsIE5VTEwpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCVRSQUNFKERMX0VSUiwgIm11bHRpY2FzdCBmd2NtZCBmYWlsZWQuIik7CisJCWdvdG8gRXJyb3I7CisJfQorCitFcnJvcjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCWlmIChwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgJiYgcGZvYi0+bWNjKSB7CisJCXBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyA9IDA7CisJCWJlX2RyaXZlX21jY193cmJfcXVldWUocGZvYi0+bWNjKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAgICBUaGlzIHJvdXRpbmUgYWRkcyBvciByZW1vdmVzIGEgdmxhbiB0YWcgZnJvbSB0aGUgcnhmIHRhYmxlLgorCisgICAgRnVuY3Rpb25PYmplY3QgIC0gRnVuY3Rpb24gb2JqZWN0IGhhbmRsZS4KKyAgICBWTGFuVGFnICAgICAgICAgLSBWTGFuIHRhZyB0byBhZGQgb3IgcmVtb3ZlLgorICAgIEFkZCAgICAgICAgICAgICAtIFNldCB0byBUUlVFIGlmIHRoaXMgd2lsbCBhZGQgYSB2bGFuIHRhZworCisgICAgUmV0dXJucyBCRV9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWxsLCBvdGhlcndpc2UgYSB1c2VmdWwgaW50IGlzIHJldHVybmVkLgorCisgICAgSVJRTDogPCBESVNQQVRDSF9MRVZFTAorKi8KK2ludCBiZV9yeGZfdmxhbl9jb25maWcoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJYm9vbCBwcm9taXNjdW91cywgdTMyIG51bSwgdTE2ICp2bGFuX3RhZ19hcnJheSwKKwkJbWNjX3dyYl9jcWVfY2FsbGJhY2sgY2IsCS8qIG9wdGlvbmFsICovCisJCXZvaWQgKmNiX2NvbnRleHQsCisJCXN0cnVjdCBiZV92bGFuX3FfY3R4dCAqcV9jdHh0KQkvKiBvcHRpb25hbCAqLworeworCWludCBzdGF0dXMgPSBCRV9TVUNDRVNTOworCXN0cnVjdCBGV0NNRF9DT01NT05fTlRXS19WTEFOX0NPTkZJRyAqZndjbWQgPSBOVUxMOworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiA9IE5VTEw7CisJc3RydWN0IGJlX2dlbmVyaWNfcV9jdHh0ICpnZW5lcmljX2N0eHQgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgaXJxbDsKKworCWlmIChudW0gPiBBUlJBWV9TSVpFKGZ3Y21kLT5wYXJhbXMucmVxdWVzdC52bGFuX3RhZykpIHsKKwkJVFJBQ0UoRExfRVJSLCAiVG9vIG1hbnkgVkxBTiB0YWdzLiIpOworCQlyZXR1cm4gQkVfTk9UX09LOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJd3JiID0gYmVfZnVuY3Rpb25fcGVla19tY2Nfd3JiKHBmb2IpOworCWlmICghd3JiKSB7CisJCWlmIChxX2N0eHQgJiYgY2IpIHsKKwkJCXdyYiA9IChzdHJ1Y3QgTUNDX1dSQl9BTUFQICopICZxX2N0eHQtPndyYl9oZWFkZXI7CisJCQlnZW5lcmljX2N0eHQgPSAoc3RydWN0IGJlX2dlbmVyaWNfcV9jdHh0ICopIHFfY3R4dDsKKwkJCWdlbmVyaWNfY3R4dC0+Y29udGV4dC5ieXRlcyA9IHNpemVvZigqcV9jdHh0KTsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IEJFX1NUQVRVU19OT19NQ0NfV1JCOworCQkJZ290byBFcnJvcjsKKwkJfQorCX0KKwkvKiBQcmVwYXJlcyBhbiBlbWJlZGRlZCBmd2NtZCwgaW5jbHVkaW5nIHJlcXVlc3QvcmVzcG9uc2Ugc2l6ZXMuICovCisJZndjbWQgPSBCRV9QUkVQQVJFX0VNQkVEREVEX0ZXQ01EKHBmb2IsIHdyYiwgQ09NTU9OX05UV0tfVkxBTl9DT05GSUcpOworCisJZndjbWQtPnBhcmFtcy5yZXF1ZXN0LnByb21pc2N1b3VzID0gcHJvbWlzY3VvdXM7CisJaWYgKCFwcm9taXNjdW91cykgeworCQlmd2NtZC0+cGFyYW1zLnJlcXVlc3QubnVtX3ZsYW4gPSBudW07CisKKwkJaWYgKG51bSA+IDApIHsKKwkJCUFTU0VSVCh2bGFuX3RhZ19hcnJheSk7CisJCQltZW1jcHkoZndjbWQtPnBhcmFtcy5yZXF1ZXN0LnZsYW5fdGFnLCB2bGFuX3RhZ19hcnJheSwKKwkJCQkgIG51bSAqIHNpemVvZih2bGFuX3RhZ19hcnJheVswXSkpOworCQl9CisJfQorCisJLyogUG9zdCB0aGUgY29tbWFkbiAqLworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihwZm9iLCB3cmIsIGdlbmVyaWNfY3R4dCwKKwkJCWNiLCBjYl9jb250ZXh0LCBOVUxMLCBOVUxMLCBmd2NtZCwgTlVMTCk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJVFJBQ0UoRExfRVJSLCAidmxhbiBmd2NtZCBmYWlsZWQuIik7CisJCWdvdG8gRXJyb3I7CisJfQorCitFcnJvcjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCWlmIChwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgJiYgcGZvYi0+bWNjKSB7CisJCXBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyA9IDA7CisJCWJlX2RyaXZlX21jY193cmJfcXVldWUocGZvYi0+bWNjKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworCitpbnQgYmVfcnhmX2xpbmtfc3RhdHVzKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCXN0cnVjdCBCRV9MSU5LX1NUQVRVUyAqbGlua19zdGF0dXMsCisJCW1jY193cmJfY3FlX2NhbGxiYWNrIGNiLAorCQl2b2lkICpjYl9jb250ZXh0LAorCQlzdHJ1Y3QgYmVfbGlua19zdGF0dXNfcV9jdHh0ICpxX2N0eHQpCit7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9OVFdLX0xJTktfU1RBVFVTX1FVRVJZICpmd2NtZCA9IE5VTEw7CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgYmVfZ2VuZXJpY19xX2N0eHQgKmdlbmVyaWNfY3R4dCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBpcnFsOworCXN0cnVjdCBiZV9tY2Nfd3JiX3Jlc3BvbnNlX2NvcHkgcmM7CisKKwlBU1NFUlQobGlua19zdGF0dXMpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwl3cmIgPSBiZV9mdW5jdGlvbl9wZWVrX21jY193cmIocGZvYik7CisKKwlpZiAoIXdyYikgeworCQlpZiAocV9jdHh0ICYmIGNiKSB7CisJCQl3cmIgPSAoc3RydWN0IE1DQ19XUkJfQU1BUCAqKSAmcV9jdHh0LT53cmJfaGVhZGVyOworCQkJZ2VuZXJpY19jdHh0ID0gKHN0cnVjdCBiZV9nZW5lcmljX3FfY3R4dCAqKSBxX2N0eHQ7CisJCQlnZW5lcmljX2N0eHQtPmNvbnRleHQuYnl0ZXMgPSBzaXplb2YoKnFfY3R4dCk7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSBCRV9TVEFUVVNfTk9fTUNDX1dSQjsKKwkJCWdvdG8gRXJyb3I7CisJCX0KKwl9CisJLyogUHJlcGFyZXMgYW4gZW1iZWRkZWQgZndjbWQsIGluY2x1ZGluZyByZXF1ZXN0L3Jlc3BvbnNlIHNpemVzLiAqLworCWZ3Y21kID0gQkVfUFJFUEFSRV9FTUJFRERFRF9GV0NNRChwZm9iLCB3cmIsCisJCQkJCSAgICAgICBDT01NT05fTlRXS19MSU5LX1NUQVRVU19RVUVSWSk7CisKKwlyYy5sZW5ndGggPSBGSUVMRF9TSVpFT0Yoc3RydWN0IEZXQ01EX0NPTU1PTl9OVFdLX0xJTktfU1RBVFVTX1FVRVJZLAorCQkJCQlwYXJhbXMucmVzcG9uc2UpOworCXJjLmZ3Y21kX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBGV0NNRF9DT01NT05fTlRXS19MSU5LX1NUQVRVU19RVUVSWSwKKwkJCQkJcGFyYW1zLnJlc3BvbnNlKTsKKwlyYy52YSA9IGxpbmtfc3RhdHVzOworCS8qIFBvc3Qgb3IgcXVldWUgdGhlIGYvdyBjb21tYW5kICovCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fcG9zdF9tY2Nfd3JiKHBmb2IsIHdyYiwgZ2VuZXJpY19jdHh0LAorCQkJY2IsIGNiX2NvbnRleHQsIE5VTEwsIE5VTEwsIGZ3Y21kLCAmcmMpOworCisJaWYgKHN0YXR1cyA8IDApIHsKKwkJVFJBQ0UoRExfRVJSLCAibGluayBzdGF0dXMgZndjbWQgZmFpbGVkLiIpOworCQlnb3RvIEVycm9yOworCX0KKworRXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKwlpZiAocGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nICYmIHBmb2ItPm1jYykgeworCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAwOworCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHBmb2ItPm1jYyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK2ludAorYmVfcnhmX3F1ZXJ5X2V0aF9zdGF0aXN0aWNzKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCSAgICBzdHJ1Y3QgRldDTURfRVRIX0dFVF9TVEFUSVNUSUNTICp2YV9mb3JfZndjbWQsCisJCSAgICB1NjQgcGFfZm9yX2Z3Y21kLCBtY2Nfd3JiX2NxZV9jYWxsYmFjayBjYiwKKwkJICAgIHZvaWQgKmNiX2NvbnRleHQsCisJCSAgICBzdHJ1Y3QgYmVfbm9uZW1iZWRkZWRfcV9jdHh0ICpxX2N0eHQpCit7CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgYmVfZ2VuZXJpY19xX2N0eHQgKmdlbmVyaWNfY3R4dCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBpcnFsOworCisJQVNTRVJUKHZhX2Zvcl9md2NtZCk7CisJQVNTRVJUKHBhX2Zvcl9md2NtZCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCXdyYiA9IGJlX2Z1bmN0aW9uX3BlZWtfbWNjX3dyYihwZm9iKTsKKworCWlmICghd3JiKSB7CisJCWlmIChxX2N0eHQgJiYgY2IpIHsKKwkJCXdyYiA9IChzdHJ1Y3QgTUNDX1dSQl9BTUFQICopICZxX2N0eHQtPndyYl9oZWFkZXI7CisJCQlnZW5lcmljX2N0eHQgPSAoc3RydWN0IGJlX2dlbmVyaWNfcV9jdHh0ICopIHFfY3R4dDsKKwkJCWdlbmVyaWNfY3R4dC0+Y29udGV4dC5ieXRlcyA9IHNpemVvZigqcV9jdHh0KTsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IEJFX1NUQVRVU19OT19NQ0NfV1JCOworCQkJZ290byBFcnJvcjsKKwkJfQorCX0KKworCVRSQUNFKERMX0lORk8sICJRdWVyeSBldGggc3RhdHMuIGZ3Y21kIHZhOiVwIHBhOjB4JTA4eF8lMDh4IiwKKwkgICAgICB2YV9mb3JfZndjbWQsIHVwcGVyXzMyX2JpdHMocGFfZm9yX2Z3Y21kKSwgKHUzMilwYV9mb3JfZndjbWQpOworCisJLyogUHJlcGFyZXMgYW4gZW1iZWRkZWQgZndjbWQsIGluY2x1ZGluZyByZXF1ZXN0L3Jlc3BvbnNlIHNpemVzLiAqLworCXZhX2Zvcl9md2NtZCA9IEJFX1BSRVBBUkVfTk9ORU1CRURERURfRldDTUQocGZvYiwgd3JiLAorCQkJICB2YV9mb3JfZndjbWQsIHBhX2Zvcl9md2NtZCwgRVRIX0dFVF9TVEFUSVNUSUNTKTsKKworCS8qIFBvc3QgdGhlIGYvdyBjb21tYW5kICovCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fcG9zdF9tY2Nfd3JiKHBmb2IsIHdyYiwgZ2VuZXJpY19jdHh0LAorCQljYiwgY2JfY29udGV4dCwgTlVMTCwgTlVMTCwgdmFfZm9yX2Z3Y21kLCBOVUxMKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlUUkFDRShETF9FUlIsICJldGggc3RhdHMgZndjbWQgZmFpbGVkLiIpOworCQlnb3RvIEVycm9yOworCX0KKworRXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKwlpZiAocGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nICYmIHBmb2ItPm1jYykgeworCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAwOworCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHBmb2ItPm1jYyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK2ludAorYmVfcnhmX3Byb21pc2N1b3VzKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCSAgIGJvb2wgZW5hYmxlX3BvcnQwLCBib29sIGVuYWJsZV9wb3J0MSwKKwkJICAgbWNjX3dyYl9jcWVfY2FsbGJhY2sgY2IsIHZvaWQgKmNiX2NvbnRleHQsCisJCSAgIHN0cnVjdCBiZV9wcm9taXNjdW91c19xX2N0eHQgKnFfY3R4dCkKK3sKKwlzdHJ1Y3QgRldDTURfRVRIX1BST01JU0NVT1VTICpmd2NtZCA9IE5VTEw7CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgYmVfZ2VuZXJpY19xX2N0eHQgKmdlbmVyaWNfY3R4dCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBpcnFsOworCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCXdyYiA9IGJlX2Z1bmN0aW9uX3BlZWtfbWNjX3dyYihwZm9iKTsKKworCWlmICghd3JiKSB7CisJCWlmIChxX2N0eHQgJiYgY2IpIHsKKwkJCXdyYiA9IChzdHJ1Y3QgTUNDX1dSQl9BTUFQICopICZxX2N0eHQtPndyYl9oZWFkZXI7CisJCQlnZW5lcmljX2N0eHQgPSAoc3RydWN0IGJlX2dlbmVyaWNfcV9jdHh0ICopIHFfY3R4dDsKKwkJCWdlbmVyaWNfY3R4dC0+Y29udGV4dC5ieXRlcyA9IHNpemVvZigqcV9jdHh0KTsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IEJFX1NUQVRVU19OT19NQ0NfV1JCOworCQkJZ290byBFcnJvcjsKKwkJfQorCX0KKwkvKiBQcmVwYXJlcyBhbiBlbWJlZGRlZCBmd2NtZCwgaW5jbHVkaW5nIHJlcXVlc3QvcmVzcG9uc2Ugc2l6ZXMuICovCisJZndjbWQgPSBCRV9QUkVQQVJFX0VNQkVEREVEX0ZXQ01EKHBmb2IsIHdyYiwgRVRIX1BST01JU0NVT1VTKTsKKworCWZ3Y21kLT5wYXJhbXMucmVxdWVzdC5wb3J0MF9wcm9taXNjdW91cyA9IGVuYWJsZV9wb3J0MDsKKwlmd2NtZC0+cGFyYW1zLnJlcXVlc3QucG9ydDFfcHJvbWlzY3VvdXMgPSBlbmFibGVfcG9ydDE7CisKKwkvKiBQb3N0IHRoZSBmL3cgY29tbWFuZCAqLworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihwZm9iLCB3cmIsIGdlbmVyaWNfY3R4dCwKKwkJCWNiLCBjYl9jb250ZXh0LCBOVUxMLCBOVUxMLCBmd2NtZCwgTlVMTCk7CisKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlUUkFDRShETF9FUlIsICJwcm9taXNjdW91cyBmd2NtZCBmYWlsZWQuIik7CisJCWdvdG8gRXJyb3I7CisJfQorCitFcnJvcjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCWlmIChwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgJiYgcGZvYi0+bWNjKSB7CisJCXBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyA9IDA7CisJCWJlX2RyaXZlX21jY193cmJfcXVldWUocGZvYi0+bWNjKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworCisvKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbjogYmVfcnhmX2ZpbHRlcl9jb25maWcKKyAqICAgQ29uZmlndXJlcyBCbGFkZUVuZ2luZSBldGhlcm5ldCByZWNlaXZlIGZpbHRlciBzZXR0aW5ncy4KKyAqIHBmb2IgICAgLQorICogc2V0dGluZ3MgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgcmVxdWVzdGVkIGZpbHRlciBzZXR0aW5ncy4KKyAqIAkJCVRoZSByZXNwb25zZSBmcm9tIEJsYWRlRW5naW5lIHdpbGwgYmUgcGxhY2VkIGJhY2sKKyAqIAkJCWluIHRoaXMgc3RydWN0dXJlLgorICogY2IgICAgICAgICAgICAgICAgIC0gb3B0aW9uYWwKKyAqIGNiX2NvbnRleHQgICAgICAgICAtIG9wdGlvbmFsCisgKiBxX2N0eHQgICAgICAgICAgICAgLSBPcHRpb25hbC4gUG9pbnRlciB0byBhIHByZXZpb3VzbHkgYWxsb2NhdGVkIHN0cnVjdC4KKyAqIAkJCUlmIHRoZSBNQ0MgV1JCIHJpbmcgaXMgZnVsbCwgdGhpcyBzdHJ1Y3R1cmUgaXMKKyAqIAkJCXVzZWQgdG8gcXVldWUgdGhlIG9wZXJhdGlvbi4gSXQgd2lsbCBiZSBwb3N0ZWQKKyAqIAkJCXRvIHRoZSBNQ0MgcmluZyB3aGVuIHNwYWNlIGJlY29tZXMgYXZhaWxhYmxlLiBBbGwKKyAqICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlZCBjb21tYW5kcyB3aWxsIGJlIHBvc3RlZCB0byB0aGUgcmluZyBpbgorICogICAgICAgICAgICAgICAgICAgICAgdGhlIG9yZGVyIHRoZXkgYXJlIHJlY2VpdmVkLiBJdCBpcyBhbHdheXMgdmFsaWQKKyAqICAgICAgICAgICAgICAgICAgICAgIHRvIHBhc3MgYSBwb2ludGVyIHRvIGEgZ2VuZXJpYworICogICAgICAgICAgICAgICAgICAgICAgYmVfZ2VuZXJpY19xX2N0eHQuIEhvd2V2ZXIsIHRoZSBzcGVjaWZpYworICogICAgICAgICAgICAgICAgICAgICAgY29udGV4dCBzdHJ1Y3RzIGFyZSBnZW5lcmFsbHkgc21hbGxlciB0aGFuCisgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgZ2VuZXJpYyBzdHJ1Y3QuCisgKiByZXR1cm4gcGVuZF9zdGF0dXMgLSBCRV9TVUNDRVNTICgwKSBvbiBzdWNjZXNzLgorICogCQkJQkVfUEVORElORyAocG9zdGl2ZSB2YWx1ZSkgaWYgdGhlIEZXQ01ECisgKiAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uIGlzIHBlbmRpbmcuIE5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2ludAorYmVfcnhmX2ZpbHRlcl9jb25maWcoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJICAgICBzdHJ1Y3QgTlRXS19SWF9GSUxURVJfU0VUVElOR1MgKnNldHRpbmdzLAorCQkgICAgIG1jY193cmJfY3FlX2NhbGxiYWNrIGNiLCB2b2lkICpjYl9jb250ZXh0LAorCQkgICAgIHN0cnVjdCBiZV9yeGZfZmlsdGVyX3FfY3R4dCAqcV9jdHh0KQoreworCXN0cnVjdCBGV0NNRF9DT01NT05fTlRXS19SWF9GSUxURVIgKmZ3Y21kID0gTlVMTDsKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIgPSBOVUxMOworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBiZV9nZW5lcmljX3FfY3R4dCAqZ2VuZXJpY19jdHh0ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGlycWw7CisJc3RydWN0IGJlX21jY193cmJfcmVzcG9uc2VfY29weSByYzsKKworCUFTU0VSVChzZXR0aW5ncyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCXdyYiA9IGJlX2Z1bmN0aW9uX3BlZWtfbWNjX3dyYihwZm9iKTsKKworCWlmICghd3JiKSB7CisJCWlmIChxX2N0eHQgJiYgY2IpIHsKKwkJCXdyYiA9IChzdHJ1Y3QgTUNDX1dSQl9BTUFQICopICZxX2N0eHQtPndyYl9oZWFkZXI7CisJCQlnZW5lcmljX2N0eHQgPSAoc3RydWN0IGJlX2dlbmVyaWNfcV9jdHh0ICopIHFfY3R4dDsKKwkJCWdlbmVyaWNfY3R4dC0+Y29udGV4dC5ieXRlcyA9IHNpemVvZigqcV9jdHh0KTsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IEJFX1NUQVRVU19OT19NQ0NfV1JCOworCQkJZ290byBFcnJvcjsKKwkJfQorCX0KKwkvKiBQcmVwYXJlcyBhbiBlbWJlZGRlZCBmd2NtZCwgaW5jbHVkaW5nIHJlcXVlc3QvcmVzcG9uc2Ugc2l6ZXMuICovCisJZndjbWQgPSBCRV9QUkVQQVJFX0VNQkVEREVEX0ZXQ01EKHBmb2IsIHdyYiwgQ09NTU9OX05UV0tfUlhfRklMVEVSKTsKKwltZW1jcHkoJmZ3Y21kLT5wYXJhbXMucmVxdWVzdCwgc2V0dGluZ3MsIHNpemVvZigqc2V0dGluZ3MpKTsKKworCXJjLmxlbmd0aCA9IEZJRUxEX1NJWkVPRihzdHJ1Y3QgRldDTURfQ09NTU9OX05UV0tfUlhfRklMVEVSLAorCQkJCQlwYXJhbXMucmVzcG9uc2UpOworCXJjLmZ3Y21kX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBGV0NNRF9DT01NT05fTlRXS19SWF9GSUxURVIsCisJCQkJCXBhcmFtcy5yZXNwb25zZSk7CisJcmMudmEgPSBzZXR0aW5nczsKKwkvKiBQb3N0IG9yIHF1ZXVlIHRoZSBmL3cgY29tbWFuZCAqLworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihwZm9iLCB3cmIsIGdlbmVyaWNfY3R4dCwKKwkJCWNiLCBjYl9jb250ZXh0LCBOVUxMLCBOVUxMLCBmd2NtZCwgJnJjKTsKKworCWlmIChzdGF0dXMgPCAwKSB7CisJCVRSQUNFKERMX0VSUiwgIlJYRi9FUlggZmlsdGVyIGNvbmZpZyBmd2NtZCBmYWlsZWQuIik7CisJCWdvdG8gRXJyb3I7CisJfQorCitFcnJvcjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCWlmIChwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgJiYgcGZvYi0+bWNjKSB7CisJCXBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyA9IDA7CisJCWJlX2RyaXZlX21jY193cmJfcXVldWUocGZvYi0+bWNjKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9ldHhfY29udGV4dC5oIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2V0eF9jb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU0ZmJlNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9ldHhfY29udGV4dC5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKy8qCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IHNyY2dlbiB2ZXJzaW9uOiAwMTI3CisgKi8KKyNpZm5kZWYgX19ldHhfY29udGV4dF9hbWFwX2hfXworI2RlZmluZSBfX2V0eF9jb250ZXh0X2FtYXBfaF9fCisKKy8qIEVUWCByaW5nICBjb250ZXh0IHN0cnVjdHVyZS4gKi8KK3N0cnVjdCBCRV9FVFhfQ09OVEVYVF9BTUFQIHsKKwl1OCB0eF9jaWR4WzExXTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwWzVdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDFbMTZdOwkvKiBEV09SRCAwICovCisJdTggdHhfcGlkeFsxMV07CS8qIERXT1JEIDEgKi8KKwl1OCByc3ZkMjsJCS8qIERXT1JEIDEgKi8KKwl1OCB0eF9yaW5nX3NpemVbNF07CS8qIERXT1JEIDEgKi8KKwl1OCBwZF9pZFs1XTsJLyogRFdPUkQgMSAqLworCXU4IHBkX2lkX25vdF92YWxpZDsJLyogRFdPUkQgMSAqLworCXU4IGNxX2lkX3NlbmRbMTBdOwkvKiBEV09SRCAxICovCisJdTggcnN2ZDNbMzJdOwkvKiBEV09SRCAyICovCisJdTggcnN2ZDRbMzJdOwkvKiBEV09SRCAzICovCisJdTggY3VyX2J5dGVzWzMyXTsJLyogRFdPUkQgNCAqLworCXU4IG1heF9ieXRlc1szMl07CS8qIERXT1JEIDUgKi8KKwl1OCB0aW1lX3N0YW1wWzMyXTsJLyogRFdPUkQgNiAqLworCXU4IHJzdmQ1WzExXTsJLyogRFdPUkQgNyAqLworCXU4IGZ1bmM7CQkvKiBEV09SRCA3ICovCisJdTggcnN2ZDZbMjBdOwkvKiBEV09SRCA3ICovCisJdTggY3VyX3R4ZF9jb3VudFszMl07CS8qIERXT1JEIDggKi8KKwl1OCBtYXhfdHhkX2NvdW50WzMyXTsJLyogRFdPUkQgOSAqLworCXU4IHJzdmQ3WzMyXTsJLyogRFdPUkQgMTAgKi8KKwl1OCByc3ZkOFszMl07CS8qIERXT1JEIDExICovCisJdTggcnN2ZDlbMzJdOwkvKiBEV09SRCAxMiAqLworCXU4IHJzdmQxMFszMl07CS8qIERXT1JEIDEzICovCisJdTggcnN2ZDExWzMyXTsJLyogRFdPUkQgMTQgKi8KKwl1OCByc3ZkMTJbMzJdOwkvKiBEV09SRCAxNSAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBFVFhfQ09OVEVYVF9BTUFQIHsKKwl1MzIgZHdbMTZdOworfTsKKworI2VuZGlmIC8qIF9fZXR4X2NvbnRleHRfYW1hcF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9mdW5jb2JqLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZnVuY29iai5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNTdlYjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZnVuY29iai5jCkBAIC0wLDAgKzEsNTY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisjaW5jbHVkZSAiaHdsaWIuaCIKKyNpbmNsdWRlICJiZXN0YXR1cy5oIgorCisKK2ludAorYmVfZnVuY3Rpb25faW50ZXJuYWxfcXVlcnlfZmlybXdhcmVfY29uZmlnKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCQkJICAgc3RydWN0IEJFX0ZJUk1XQVJFX0NPTkZJRyAqY29uZmlnKQoreworCXN0cnVjdCBGV0NNRF9DT01NT05fRklSTVdBUkVfQ09ORklHICpmd2NtZCA9IE5VTEw7CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gMDsKKwl1bnNpZ25lZCBsb25nIGlycWw7CisJc3RydWN0IGJlX21jY193cmJfcmVzcG9uc2VfY29weSByYzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJd3JiID0gYmVfZnVuY3Rpb25fcGVla19tY2Nfd3JiKHBmb2IpOworCWlmICghd3JiKSB7CisJCVRSQUNFKERMX0VSUiwgIk1DQyB3cmIgcGVlayBmYWlsZWQuIik7CisJCXN0YXR1cyA9IEJFX1NUQVRVU19OT19NQ0NfV1JCOworCQlnb3RvIGVycm9yOworCX0KKwkvKiBQcmVwYXJlcyBhbiBlbWJlZGRlZCBmd2NtZCwgaW5jbHVkaW5nIHJlcXVlc3QvcmVzcG9uc2Ugc2l6ZXMuICovCisJZndjbWQgPSBCRV9QUkVQQVJFX0VNQkVEREVEX0ZXQ01EKHBmb2IsIHdyYiwgQ09NTU9OX0ZJUk1XQVJFX0NPTkZJRyk7CisKKwlyYy5sZW5ndGggPSBGSUVMRF9TSVpFT0Yoc3RydWN0IEZXQ01EX0NPTU1PTl9GSVJNV0FSRV9DT05GSUcsCisJCQkJCXBhcmFtcy5yZXNwb25zZSk7CisJcmMuZndjbWRfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IEZXQ01EX0NPTU1PTl9GSVJNV0FSRV9DT05GSUcsCisJCQkJCXBhcmFtcy5yZXNwb25zZSk7CisJcmMudmEgPSBjb25maWc7CisKKwkvKiBQb3N0IHRoZSBmL3cgY29tbWFuZCAqLworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihwZm9iLCB3cmIsIE5VTEwsIE5VTEwsCisJCQkJCU5VTEwsIE5VTEwsIE5VTEwsIGZ3Y21kLCAmcmMpOworZXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKwlpZiAocGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nICYmIHBmb2ItPm1jYykgeworCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAwOworCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHBmb2ItPm1jYyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgICAgVGhpcyBhbGxvY2F0ZXMgYW5kIGluaXRpYWxpemVzIGEgZnVuY3Rpb24gb2JqZWN0IGJhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbgorICAgIHByb3ZpZGVkIGJ5IHVwcGVyIGxheWVyIGRyaXZlcnMuCisKKyAgICBSZXR1cm5zIEJFX1NVQ0NFU1Mgb24gc3VjY2VzcyBhbmQgYW4gYXBwcm9wcmlhdGUgaW50IG9uIGZhaWx1cmUuCisKKyAgICBBIGZ1bmN0aW9uIG9iamVjdCByZXByZXNlbnRzIGEgc2luZ2xlIEJsYWRlRW5naW5lIChsb2dpY2FsKSBQQ0kgZnVuY3Rpb24uCisgICAgVGhhdCBpcyBhIGZ1bmN0aW9uIG9iamVjdCBlaXRoZXIgcmVwcmVzZW50cworICAgIHRoZSBuZXR3b3JraW5nIHNpZGUgb2YgQmxhZGVFbmdpbmUgb3IgdGhlIGlTQ1NJIHNpZGUgb2YgQmxhZGVFbmdpbmUuCisKKyAgICBUaGlzIHJvdXRpbmUgd2lsbCBhbHNvIGRldGVjdCBhbmQgY3JlYXRlIGFuIGFwcHJvcHJpYXRlIFBEIG9iamVjdCBmb3IgdGhlCisgICAgUENJIGZ1bmN0aW9uIGFzIG5lZWRlZC4KKyovCitpbnQKK2JlX2Z1bmN0aW9uX29iamVjdF9jcmVhdGUodTggX19pb21lbSAqY3NyX3ZhLCB1OCBfX2lvbWVtICpkYl92YSwKKwkJdTggX19pb21lbSAqcGNpX3ZhLCB1MzIgZnVuY3Rpb25fdHlwZSwKKwkJc3RydWN0IHJpbmdfZGVzYyAqbWFpbGJveCwgc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYikKK3sKKwlpbnQgc3RhdHVzOworCisJQVNTRVJUKHBmb2IpOwkvKiBub3QgYSBtYWdpYyBhc3NlcnQgKi8KKwlBU1NFUlQoZnVuY3Rpb25fdHlwZSA8PSAyKTsKKworCVRSQUNFKERMX0lORk8sICJDcmVhdGUgZnVuY3Rpb24gb2JqZWN0LiB0eXBlOiVzIG9iamVjdDoweCVwIiwKKwkgICAgICAoZnVuY3Rpb25fdHlwZSA9PSBCRV9GVU5DVElPTl9UWVBFX0lTQ1NJID8gImlTQ1NJIiA6CisJICAgICAgIChmdW5jdGlvbl90eXBlID09IEJFX0ZVTkNUSU9OX1RZUEVfTkVUV09SSyA/ICJOZXR3b3JrIiA6CisJCSJBcm0iKSksIHBmb2IpOworCisJbWVtc2V0KHBmb2IsIDAsIHNpemVvZigqcGZvYikpOworCisJcGZvYi0+dHlwZSA9IGZ1bmN0aW9uX3R5cGU7CisJcGZvYi0+Y3NyX3ZhID0gY3NyX3ZhOworCXBmb2ItPmRiX3ZhID0gZGJfdmE7CisJcGZvYi0+cGNpX3ZhID0gcGNpX3ZhOworCisJc3Bpbl9sb2NrX2luaXQoJnBmb2ItPmNxX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZwZm9iLT5wb3N0X2xvY2spOworCXNwaW5fbG9ja19pbml0KCZwZm9iLT5tY2NfY29udGV4dF9sb2NrKTsKKworCisJcGZvYi0+cGNpX2Z1bmN0aW9uX251bWJlciA9IDE7CisKKworCXBmb2ItPmVtdWxhdGUgPSBmYWxzZTsKKwlUUkFDRShETF9OT1RFLCAiTm9uLWVtdWxhdGlvbiBtb2RlIik7CisJc3RhdHVzID0gYmVfZHJpdmVfUE9TVChwZm9iKTsKKwlpZiAoc3RhdHVzICE9IEJFX1NVQ0NFU1MpIHsKKwkJVFJBQ0UoRExfRVJSLCAiQmxhZGVFbmdpbmUgUE9TVCBmYWlsZWQuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogSW5pdGlhbGl6ZSB0aGUgbWFpbGJveCAqLworCXN0YXR1cyA9IGJlX21wdV9pbml0X21haWxib3gocGZvYiwgbWFpbGJveCk7CisJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTKSB7CisJCVRSQUNFKERMX0VSUiwgIkZhaWxlZCB0byBpbml0aWFsaXplIG1haWxib3guIik7CisJCWdvdG8gZXJyb3I7CisJfQorCS8qCisJICogQ2FjaGUgdGhlIGZpcm13YXJlIGNvbmZpZyBmb3IgQVNTRVJUcyBpbiBod2NsaWIgYW5kIGxhdGVyCisJICogZHJpdmVyIHF1ZXJpZXMuCisJICovCisJc3RhdHVzID0gYmVfZnVuY3Rpb25faW50ZXJuYWxfcXVlcnlfZmlybXdhcmVfY29uZmlnKHBmb2IsCisJCQkJCSAgICAgICAmcGZvYi0+ZndfY29uZmlnKTsKKwlpZiAoc3RhdHVzICE9IEJFX1NVQ0NFU1MpIHsKKwkJVFJBQ0UoRExfRVJSLCAiRmFpbGVkIHRvIHF1ZXJ5IGZpcm13YXJlIGNvbmZpZy4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKK2Vycm9yOgorCWlmIChzdGF0dXMgIT0gQkVfU1VDQ0VTUykgeworCQkvKiBObyBjbGVhbnVwIG5lY2Vzc2FyeSAqLworCQlUUkFDRShETF9FUlIsICJGYWlsZWQgdG8gY3JlYXRlIGZ1bmN0aW9uLiIpOworCQltZW1zZXQocGZvYiwgMCwgc2l6ZW9mKCpwZm9iKSk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgICAgVGhpcyByb3V0aW5lIGRyb3BzIHRoZSByZWZlcmVuY2UgY291bnQgb24gYSBnaXZlbiBmdW5jdGlvbiBvYmplY3QuIE9uY2UKKyAgICB0aGUgcmVmZXJlbmNlIGNvdW50IGZhbGxzIHRvIHplcm8sIHRoZSBmdW5jdGlvbiBvYmplY3QgaXMgZGVzdHJveWVkIGFuZCBhbGwKKyAgICByZXNvdXJjZXMgaGVsZCBhcmUgZnJlZWQuCisKKyAgICBGdW5jdGlvbk9iamVjdCAgICAgIC0gVGhlIGZ1bmN0aW9uIG9iamVjdCB0byBkcm9wIHRoZSByZWZlcmVuY2UgdG8uCisqLworaW50IGJlX2Z1bmN0aW9uX29iamVjdF9kZXN0cm95KHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IpCit7CisJVFJBQ0UoRExfSU5GTywgIkRlc3Ryb3kgcGZvYi4gT2JqZWN0OjB4JXAiLAorCSAgICAgIHBmb2IpOworCisKKwlBU1NFUlQocGZvYi0+bWNjID09IE5VTEwpOworCisJcmV0dXJuIEJFX1NVQ0NFU1M7Cit9CisKK2ludCBiZV9mdW5jdGlvbl9jbGVhbnVwKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IpCit7CisJaW50IHN0YXR1cyA9IDA7CisJdTMyIGlzcjsKKwl1MzIgaG9zdF9pbnRyOworCXN0cnVjdCBQQ0lDRkdfSE9TVF9USU1FUl9JTlRfQ1RSTF9DU1JfQU1BUCBjdHJsOworCisKKwlpZiAocGZvYi0+dHlwZSA9PSBCRV9GVU5DVElPTl9UWVBFX05FVFdPUkspIHsKKwkJc3RhdHVzID0gYmVfcnhmX211bHRpY2FzdF9jb25maWcocGZvYiwgZmFsc2UsIDAsCisJCQkJCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwkJQVNTRVJUKHN0YXR1cyA9PSBCRV9TVUNDRVNTKTsKKwl9CisJLyogVkxBTiAqLworCXN0YXR1cyA9IGJlX3J4Zl92bGFuX2NvbmZpZyhwZm9iLCBmYWxzZSwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJQVNTRVJUKHN0YXR1cyA9PSBCRV9TVUNDRVNTKTsKKwkvKgorCSAqIE1DQyBRdWV1ZSAtLSBTd2l0Y2hlcyB0byBtYWlsYm94IG1vZGUuICBNYXkgd2FudCB0byBkZXN0cm95CisJICogYWxsIGJ1dCB0aGUgTUNDIENRIGJlZm9yZSB0aGlzIGNhbGwgaWYgcG9sbGluZyBDUSBpcyBtdWNoIGJldHRlcgorCSAqIHBlcmZvcm1hbmNlIHRoYW4gcG9sbGluZyBtYWlsYm94IHJlZ2lzdGVyLgorCSAqLworCWlmIChwZm9iLT5tY2MpCisJCXN0YXR1cyA9IGJlX21jY19yaW5nX2Rlc3Ryb3kocGZvYi0+bWNjKTsKKwkvKgorCSAqIElmIGludGVycnVwdHMgYXJlIGRpc2FibGVkLCBjbGVhciBhbnkgQ0VWIGludGVycnVwdCBhc3NlcnRpb25zIHRoYXQKKwkgKiBmaXJlZCBhZnRlciB3ZSBzdG9wcGVkIHByb2Nlc3NpbmcgRVFzLgorCSAqLworCWN0cmwuZHdbMF0gPSBQQ0lDRkcxX1JFQUQocGZvYiwgaG9zdF90aW1lcl9pbnRfY3RybCk7CisJaG9zdF9pbnRyID0gQU1BUF9HRVRfQklUU19QVFIoUENJQ0ZHX0hPU1RfVElNRVJfSU5UX0NUUkxfQ1NSLAorCQkJCQkJCWhvc3RpbnRyLCBjdHJsLmR3KTsKKwlpZiAoIWhvc3RfaW50cikKKwkJaWYgKHBmb2ItPnR5cGUgPT0gQkVfRlVOQ1RJT05fVFlQRV9ORVRXT1JLKQorCQkJaXNyID0gQ1NSX1JFQUQocGZvYiwgY2V2LmlzcjEpOworCQllbHNlCisJCQlpc3IgPSBDU1JfUkVBRChwZm9iLCBjZXYuaXNyMCk7CisJZWxzZQorCQkvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uLi4gKi8KKwkJVFJBQ0UoRExfRVJSLCAiZnVuY3Rpb25fY2xlYW51cCBjYWxsZWQgd2l0aCBpbnRlcnJ1cHQgZW5hYmxlZCIpOworCS8qIEZ1bmN0aW9uIG9iamVjdCBkZXN0cm95ICovCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fb2JqZWN0X2Rlc3Ryb3kocGZvYik7CisJQVNTRVJUKHN0YXR1cyA9PSBCRV9TVUNDRVNTKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKwordm9pZCAqCitiZV9mdW5jdGlvbl9wcmVwYXJlX2VtYmVkZGVkX2Z3Y21kKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiLCB1MzIgcGF5bGRfbGVuLCB1MzIgcmVxdWVzdF9sZW5ndGgsCisJdTMyIHJlc3BvbnNlX2xlbmd0aCwgdTMyIG9wY29kZSwgdTMyIHN1YnN5c3RlbSkKK3sKKwlzdHJ1Y3QgRldDTURfUkVRVUVTVF9IRUFERVIgKmhlYWRlciA9IE5VTEw7CisJdTMyIG47CisKKwlBU1NFUlQod3JiKTsKKworCW4gPSBvZmZzZXRvZihzdHJ1Y3QgQkVfTUNDX1dSQl9BTUFQLCBwYXlsb2FkKS84OworCUFNQVBfU0VUX0JJVFNfUFRSKE1DQ19XUkIsIGVtYmVkZGVkLCB3cmIsIDEpOworCUFNQVBfU0VUX0JJVFNfUFRSKE1DQ19XUkIsIHBheWxvYWRfbGVuZ3RoLCB3cmIsIG1pbihwYXlsZF9sZW4sIG4pKTsKKwloZWFkZXIgPSAoc3RydWN0IEZXQ01EX1JFUVVFU1RfSEVBREVSICopKCh1OCAqKXdyYiArIG4pOworCisJaGVhZGVyLT50aW1lb3V0ID0gMDsKKwloZWFkZXItPmRvbWFpbiA9IDA7CisJaGVhZGVyLT5yZXF1ZXN0X2xlbmd0aCA9IG1heChyZXF1ZXN0X2xlbmd0aCwgcmVzcG9uc2VfbGVuZ3RoKTsKKwloZWFkZXItPm9wY29kZSA9IG9wY29kZTsKKwloZWFkZXItPnN1YnN5c3RlbSA9IHN1YnN5c3RlbTsKKworCXJldHVybiBoZWFkZXI7Cit9CisKK3ZvaWQgKgorYmVfZnVuY3Rpb25fcHJlcGFyZV9ub25lbWJlZGRlZF9md2NtZChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiwKKwl2b2lkICpmd2NtZF92YSwgdTY0IGZ3Y21kX3BhLAorCXUzMiBwYXlsZF9sZW4sCisJdTMyIHJlcXVlc3RfbGVuZ3RoLAorCXUzMiByZXNwb25zZV9sZW5ndGgsCisJdTMyIG9wY29kZSwgdTMyIHN1YnN5c3RlbSkKK3sKKwlzdHJ1Y3QgRldDTURfUkVRVUVTVF9IRUFERVIgKmhlYWRlciA9IE5VTEw7CisJdTMyIG47CisJc3RydWN0IE1DQ19XUkJfUEFZTE9BRF9BTUFQICpwbHA7CisKKwlBU1NFUlQod3JiKTsKKwlBU1NFUlQoZndjbWRfdmEpOworCisJaGVhZGVyID0gKHN0cnVjdCBGV0NNRF9SRVFVRVNUX0hFQURFUiAqKSBmd2NtZF92YTsKKworCUFNQVBfU0VUX0JJVFNfUFRSKE1DQ19XUkIsIGVtYmVkZGVkLCB3cmIsIDApOworCUFNQVBfU0VUX0JJVFNfUFRSKE1DQ19XUkIsIHBheWxvYWRfbGVuZ3RoLCB3cmIsIHBheWxkX2xlbik7CisKKwkvKgorCSAqIEFzc3VtZSBvbmUgZnJhZ21lbnQuIFRoZSBjYWxsZXIgbWF5IG92ZXJyaWRlIHRoZSBTR0wgYnkKKwkgKiByZXdyaXRpbmcgdGhlIDB0aCBsZW5ndGggYW5kIGFkZGluZyBtb3JlIGVudHJpZXMuICBUaGV5CisJICogd2lsbCBhbHNvIG5lZWQgdG8gdXBkYXRlIHRoZSBzZ2VfY291bnQuCisJICovCisJQU1BUF9TRVRfQklUU19QVFIoTUNDX1dSQiwgc2dlX2NvdW50LCB3cmIsIDEpOworCisJbiA9IG9mZnNldG9mKHN0cnVjdCBCRV9NQ0NfV1JCX0FNQVAsIHBheWxvYWQpLzg7CisJcGxwID0gKHN0cnVjdCBNQ0NfV1JCX1BBWUxPQURfQU1BUCAqKSgodTggKil3cmIgKyBuKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihNQ0NfV1JCX1BBWUxPQUQsIHNnbFswXS5sZW5ndGgsIHBscCwgcGF5bGRfbGVuKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihNQ0NfV1JCX1BBWUxPQUQsIHNnbFswXS5wYV9sbywgcGxwLCAodTMyKWZ3Y21kX3BhKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihNQ0NfV1JCX1BBWUxPQUQsIHNnbFswXS5wYV9oaSwgcGxwLAorCQkJCQl1cHBlcl8zMl9iaXRzKGZ3Y21kX3BhKSk7CisKKwloZWFkZXItPnRpbWVvdXQgPSAwOworCWhlYWRlci0+ZG9tYWluID0gMDsKKwloZWFkZXItPnJlcXVlc3RfbGVuZ3RoID0gbWF4KHJlcXVlc3RfbGVuZ3RoLCByZXNwb25zZV9sZW5ndGgpOworCWhlYWRlci0+b3Bjb2RlID0gb3Bjb2RlOworCWhlYWRlci0+c3Vic3lzdGVtID0gc3Vic3lzdGVtOworCisJcmV0dXJuIGhlYWRlcjsKK30KKworc3RydWN0IE1DQ19XUkJfQU1BUCAqCitiZV9mdW5jdGlvbl9wZWVrX21jY193cmIoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYikKK3sKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIgPSBOVUxMOworCXUzMiBvZmZzZXQ7CisKKwlpZiAocGZvYi0+bWNjKQorCQl3cmIgPSBfYmVfbXB1X3BlZWtfcmluZ193cmIocGZvYi0+bWNjLCBmYWxzZSk7CisJZWxzZSB7CisJCW9mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBCRV9NQ0NfTUFJTEJPWF9BTUFQLCB3cmIpLzg7CisJCXdyYiA9IChzdHJ1Y3QgTUNDX1dSQl9BTUFQICopICgodTggKikgcGZvYi0+bWFpbGJveC52YSArCisJCQkJb2Zmc2V0KTsKKwl9CisKKwlpZiAod3JiKQorCQltZW1zZXQod3JiLCAwLCBzaXplb2Yoc3RydWN0IE1DQ19XUkJfQU1BUCkpOworCisJcmV0dXJuIHdyYjsKK30KKworI2lmIGRlZmluZWQoQkVfREVCVUcpCit2b2lkIGJlX2Z1bmN0aW9uX2RlYnVnX3ByaW50X3dyYihzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIsIHZvaWQgKm9wdGlvbmFsX2Z3Y21kX3ZhLAorCQlzdHJ1Y3QgYmVfbWNjX3dyYl9jb250ZXh0ICp3cmJfY29udGV4dCkKK3sKKworCXN0cnVjdCBGV0NNRF9SRVFVRVNUX0hFQURFUiAqaGVhZGVyID0gTlVMTDsKKwl1OCBlbWJlZGRlZDsKKwl1MzIgbjsKKworCWVtYmVkZGVkID0gQU1BUF9HRVRfQklUU19QVFIoTUNDX1dSQiwgZW1iZWRkZWQsIHdyYik7CisKKwlpZiAoZW1iZWRkZWQpIHsKKwkJbiA9IG9mZnNldG9mKHN0cnVjdCBCRV9NQ0NfV1JCX0FNQVAsIHBheWxvYWQpLzg7CisJCWhlYWRlciA9IChzdHJ1Y3QgRldDTURfUkVRVUVTVF9IRUFERVIgKikoKHU4ICopd3JiICsgbik7CisJfSBlbHNlIHsKKwkJaGVhZGVyID0gKHN0cnVjdCBGV0NNRF9SRVFVRVNUX0hFQURFUiAqKSBvcHRpb25hbF9md2NtZF92YTsKKwl9CisKKwkvKiBTYXZlIHRoZSBjb21wbGV0ZWQgY291bnQgYmVmb3JlIHBvc3RpbmcgZm9yIGEgZGVidWcgYXNzZXJ0LiAqLworCisJaWYgKGhlYWRlcikgeworCQl3cmJfY29udGV4dC0+b3Bjb2RlID0gaGVhZGVyLT5vcGNvZGU7CisJCXdyYl9jb250ZXh0LT5zdWJzeXN0ZW0gPSBoZWFkZXItPnN1YnN5c3RlbTsKKworCX0gZWxzZSB7CisJCXdyYl9jb250ZXh0LT5vcGNvZGUgPSAwOworCQl3cmJfY29udGV4dC0+c3Vic3lzdGVtID0gMDsKKwl9Cit9CisjZWxzZQorI2RlZmluZSBiZV9mdW5jdGlvbl9kZWJ1Z19wcmludF93cmIoYV8sIGJfLCBjXywgZF8pCisjZW5kaWYKKworaW50CitiZV9mdW5jdGlvbl9wb3N0X21jY193cmIoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiLAorCQlzdHJ1Y3QgYmVfZ2VuZXJpY19xX2N0eHQgKnFfY3R4dCwKKwkJbWNjX3dyYl9jcWVfY2FsbGJhY2sgY2IsIHZvaWQgKmNiX2NvbnRleHQsCisJCW1jY193cmJfY3FlX2NhbGxiYWNrIGludGVybmFsX2NiLAorCQl2b2lkICppbnRlcm5hbF9jYl9jb250ZXh0LCB2b2lkICpvcHRpb25hbF9md2NtZF92YSwKKwkJc3RydWN0IGJlX21jY193cmJfcmVzcG9uc2VfY29weSAqcmMpCit7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3QgYmVfbWNjX3dyYl9jb250ZXh0ICp3cmJfY29udGV4dCA9IE5VTEw7CisJdTY0ICpwOworCisJaWYgKHFfY3R4dCkgeworCQkvKiBJbml0aWFsaXplIGNvbnRleHQuICAgICAgICAgKi8KKwkJcV9jdHh0LT5jb250ZXh0LmludGVybmFsX2NiID0gaW50ZXJuYWxfY2I7CisJCXFfY3R4dC0+Y29udGV4dC5pbnRlcm5hbF9jYl9jb250ZXh0ID0gaW50ZXJuYWxfY2JfY29udGV4dDsKKwkJcV9jdHh0LT5jb250ZXh0LmNiID0gY2I7CisJCXFfY3R4dC0+Y29udGV4dC5jYl9jb250ZXh0ID0gY2JfY29udGV4dDsKKwkJaWYgKHJjKSB7CisJCQlxX2N0eHQtPmNvbnRleHQuY29weS5sZW5ndGggPSByYy0+bGVuZ3RoOworCQkJcV9jdHh0LT5jb250ZXh0LmNvcHkuZndjbWRfb2Zmc2V0ID0gcmMtPmZ3Y21kX29mZnNldDsKKwkJCXFfY3R4dC0+Y29udGV4dC5jb3B5LnZhID0gcmMtPnZhOworCQl9IGVsc2UKKwkJCXFfY3R4dC0+Y29udGV4dC5jb3B5Lmxlbmd0aCA9IDA7CisKKwkJcV9jdHh0LT5jb250ZXh0Lm9wdGlvbmFsX2Z3Y21kX3ZhID0gb3B0aW9uYWxfZndjbWRfdmE7CisKKwkJLyogUXVldWUgdGhpcyByZXF1ZXN0ICovCisJCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3F1ZXVlX21jY193cmIocGZvYiwgcV9jdHh0KTsKKworCQlnb3RvIEVycm9yOworCX0KKwkvKgorCSAqIEFsbG9jYXRlIGEgV1JCIGNvbnRleHQgc3RydWN0IHRvIGhvbGQgdGhlIGNhbGxiYWNrIHBvaW50ZXJzLAorCSAqIHN0YXR1cywgZXRjLiAgVGhpcyBpcyByZXF1aXJlZCBpZiBjb21tYW5kcyBjb21wbGV0ZSBvdXQgb2Ygb3JkZXIuCisJICovCisJd3JiX2NvbnRleHQgPSBfYmVfbWNjX2FsbG9jYXRlX3dyYl9jb250ZXh0KHBmb2IpOworCWlmICghd3JiX2NvbnRleHQpIHsKKwkJVFJBQ0UoRExfV0FSTiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBNQ0MgV1JCIGNvbnRleHQuIik7CisJCXN0YXR1cyA9IEJFX1NUQVRVU19TWVNURU1fUkVTT1VSQ0VTOworCQlnb3RvIEVycm9yOworCX0KKwkvKiBJbml0aWFsaXplIGNvbnRleHQuICovCisJbWVtc2V0KHdyYl9jb250ZXh0LCAwLCBzaXplb2YoKndyYl9jb250ZXh0KSk7CisJd3JiX2NvbnRleHQtPmludGVybmFsX2NiID0gaW50ZXJuYWxfY2I7CisJd3JiX2NvbnRleHQtPmludGVybmFsX2NiX2NvbnRleHQgPSBpbnRlcm5hbF9jYl9jb250ZXh0OworCXdyYl9jb250ZXh0LT5jYiA9IGNiOworCXdyYl9jb250ZXh0LT5jYl9jb250ZXh0ID0gY2JfY29udGV4dDsKKwlpZiAocmMpIHsKKwkJd3JiX2NvbnRleHQtPmNvcHkubGVuZ3RoID0gcmMtPmxlbmd0aDsKKwkJd3JiX2NvbnRleHQtPmNvcHkuZndjbWRfb2Zmc2V0ID0gcmMtPmZ3Y21kX29mZnNldDsKKwkJd3JiX2NvbnRleHQtPmNvcHkudmEgPSByYy0+dmE7CisJfSBlbHNlCisJCXdyYl9jb250ZXh0LT5jb3B5Lmxlbmd0aCA9IDA7CisJd3JiX2NvbnRleHQtPndyYiA9IHdyYjsKKworCS8qCisJICogQ29weSB0aGUgY29udGV4dCBwb2ludGVyIGludG8gdGhlIFdSQiBvcGFxdWUgdGFnIGZpZWxkLgorCSAqIFZlcmlmeSBhc3N1bXB0aW9uIG9mIDY0LWJpdCB0YWcgd2l0aCBhIGNvbXBpbGUgdGltZSBhc3NlcnQuCisJICovCisJcCA9ICh1NjQgKikgKCh1OCAqKXdyYiArIG9mZnNldG9mKHN0cnVjdCBCRV9NQ0NfV1JCX0FNQVAsIHRhZykvOCk7CisJKnAgPSAodTY0KShzaXplX3Qpd3JiX2NvbnRleHQ7CisKKwkvKiBQcmludCBpbmZvIGFib3V0IHRoaXMgRldDTUQgZm9yIGRlYnVnIGJ1aWxkcy4gKi8KKwliZV9mdW5jdGlvbl9kZWJ1Z19wcmludF93cmIocGZvYiwgd3JiLCBvcHRpb25hbF9md2NtZF92YSwgd3JiX2NvbnRleHQpOworCisJLyoKKwkgKiBpc3N1ZSB0aGUgV1JCIHRvIHRoZSBNUFUgYXMgYXBwcm9wcmlhdGUKKwkgKi8KKwlpZiAocGZvYi0+bWNjKSB7CisJCS8qCisJCSAqIHdlJ3JlIGluIFdSQiBtb2RlLCBwYXNzIHRvIHRoZSBtY2MgbGF5ZXIKKwkJICovCisJCXN0YXR1cyA9IF9iZV9tcHVfcG9zdF93cmJfcmluZyhwZm9iLT5tY2MsIHdyYiwgd3JiX2NvbnRleHQpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIHdlJ3JlIGluIG1haWxib3ggbW9kZQorCQkgKi8KKwkJc3RhdHVzID0gX2JlX21wdV9wb3N0X3dyYl9tYWlsYm94KHBmb2IsIHdyYiwgd3JiX2NvbnRleHQpOworCisJCS8qIG1haWxib3ggbW9kZSBhbHdheXMgY29tcGxldGVzIHN5bmNocm9ub3VzbHkgKi8KKwkJQVNTRVJUKHN0YXR1cyAhPSBCRV9TVEFUVVNfUEVORElORyk7CisJfQorCitFcnJvcjoKKworCXJldHVybiBzdGF0dXM7Cit9CisKK2ludAorYmVfZnVuY3Rpb25fcmluZ19kZXN0cm95KHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCXUzMiBpZCwgdTMyIHJpbmdfdHlwZSwgbWNjX3dyYl9jcWVfY2FsbGJhY2sgY2IsCisJCXZvaWQgKmNiX2NvbnRleHQsIG1jY193cmJfY3FlX2NhbGxiYWNrIGludGVybmFsX2NiLAorCQl2b2lkICppbnRlcm5hbF9jYl9jb250ZXh0KQoreworCisJc3RydWN0IEZXQ01EX0NPTU1PTl9SSU5HX0RFU1RST1kgKmZ3Y21kID0gTlVMTDsKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIgPSBOVUxMOworCWludCBzdGF0dXMgPSAwOworCXVuc2lnbmVkIGxvbmcgaXJxbDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJVFJBQ0UoRExfSU5GTywgIkRlc3Ryb3kgcmluZyBpZDolZCB0eXBlOiVkIiwgaWQsIHJpbmdfdHlwZSk7CisKKwl3cmIgPSBiZV9mdW5jdGlvbl9wZWVrX21jY193cmIocGZvYik7CisJaWYgKCF3cmIpIHsKKwkJQVNTRVJUKHdyYik7CisJCVRSQUNFKERMX0VSUiwgIk5vIGZyZWUgTUNDIFdSQnMgaW4gZGVzdHJveSByaW5nLiIpOworCQlzdGF0dXMgPSBCRV9TVEFUVVNfTk9fTUNDX1dSQjsKKwkJZ290byBFcnJvcjsKKwl9CisJLyogUHJlcGFyZXMgYW4gZW1iZWRkZWQgZndjbWQsIGluY2x1ZGluZyByZXF1ZXN0L3Jlc3BvbnNlIHNpemVzLiAqLworCWZ3Y21kID0gQkVfUFJFUEFSRV9FTUJFRERFRF9GV0NNRChwZm9iLCB3cmIsIENPTU1PTl9SSU5HX0RFU1RST1kpOworCisJZndjbWQtPnBhcmFtcy5yZXF1ZXN0LmlkID0gaWQ7CisJZndjbWQtPnBhcmFtcy5yZXF1ZXN0LnJpbmdfdHlwZSA9IHJpbmdfdHlwZTsKKworCS8qIFBvc3QgdGhlIGYvdyBjb21tYW5kICovCisJc3RhdHVzID0gYmVfZnVuY3Rpb25fcG9zdF9tY2Nfd3JiKHBmb2IsIHdyYiwgTlVMTCwgY2IsIGNiX2NvbnRleHQsCisJCQkJaW50ZXJuYWxfY2IsIGludGVybmFsX2NiX2NvbnRleHQsIGZ3Y21kLCBOVUxMKTsKKwlpZiAoc3RhdHVzICE9IEJFX1NVQ0NFU1MgJiYgc3RhdHVzICE9IEJFX1BFTkRJTkcpIHsKKwkJVFJBQ0UoRExfRVJSLCAiUmluZyBkZXN0cm95IGZ3Y21kIGZhaWxlZC4gaWQ6JWQgcmluZ190eXBlOiVkIiwKKwkJCWlkLCByaW5nX3R5cGUpOworCQlnb3RvIEVycm9yOworCX0KKworRXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKwlpZiAocGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nICYmIHBmb2ItPm1jYykgeworCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAwOworCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHBmb2ItPm1jYyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQKK2JlX3JkX3RvX3BhX2xpc3Qoc3RydWN0IHJpbmdfZGVzYyAqcmQsIHN0cnVjdCBQSFlTX0FERFIgKnBhX2xpc3QsIHUzMiBtYXhfbnVtKQoreworCXUzMiBudW1fcGFnZXMgPSBQQUdFU19TUEFOTkVEKHJkLT52YSwgcmQtPmxlbmd0aCk7CisJdTMyIGkgPSAwOworCXU2NCBwYSA9IHJkLT5wYTsKKwlfX2xlNjQgbGVwYTsKKworCUFTU0VSVChwYV9saXN0KTsKKwlBU1NFUlQocGEpOworCisJZm9yIChpID0gMDsgaSA8IG1pbihudW1fcGFnZXMsIG1heF9udW0pOyBpKyspIHsKKwkJbGVwYSA9IGNwdV90b19sZTY0KHBhKTsKKwkJcGFfbGlzdFtpXS5sbyA9ICh1MzIpbGVwYTsKKwkJcGFfbGlzdFtpXS5oaSA9IHVwcGVyXzMyX2JpdHMobGVwYSk7CisJCXBhICs9IFBBR0VfU0laRTsKKwl9Cit9CisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbjogYmVfZnVuY3Rpb25fZ2V0X2Z3X3ZlcnNpb24KKyAqICAgUmV0cmlldmVzIHRoZSBmaXJtd2FyZSB2ZXJzaW9uIG9uIHRoZSBhZHBhdGVyLiBJZiB0aGUgY2FsbGJhY2sgaXMKKyAqICAgTlVMTCB0aGlzIGNhbGwgZXhlY3V0ZXMgc3luY2hyb25vdXNseS4gSWYgdGhlIGNhbGxiYWNrIGlzIG5vdCBOVUxMLAorICogICB0aGUgcmV0dXJuZWQgc3RhdHVzIHdpbGwgYmUgQkVfUEVORElORyBpZiB0aGUgY29tbWFuZCB3YXMgaXNzdWVkCisgKiAgIHN1Y2Nlc3NmdWxseS4KKyAqIHBmb2IgICAgLQorICogZnd2ICAgICAgICAgLSBQb2ludGVyIHRvIHJlc3BvbnNlIGJ1ZmZlciBpZiBjYWxsYmFjayBpcyBOVUxMLgorICogY2IgICAgICAgICAgIC0gQ2FsbGJhY2sgZnVuY3Rpb24gaW52b2tlZCB3aGVuIHRoZSBGV0NNRCBjb21wbGV0ZXMuCisgKiBjYl9jb250ZXh0ICAgLSBQYXNzZWQgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLgorICogcmV0dXJuIHBlbmRfc3RhdHVzIC0gQkVfU1VDQ0VTUyAoMCkgb24gc3VjY2Vzcy4KKyAqIAkJCUJFX1BFTkRJTkcgKHBvc3RpdmUgdmFsdWUpIGlmIHRoZSBGV0NNRAorICogICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbiBpcyBwZW5kaW5nLiBOZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbnQKK2JlX2Z1bmN0aW9uX2dldF9md192ZXJzaW9uKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCXN0cnVjdCBGV0NNRF9DT01NT05fR0VUX0ZXX1ZFUlNJT05fUkVTUE9OU0VfUEFZTE9BRCAqZnd2LAorCQltY2Nfd3JiX2NxZV9jYWxsYmFjayBjYiwgdm9pZCAqY2JfY29udGV4dCkKK3sKKwlpbnQgc3RhdHVzID0gQkVfU1VDQ0VTUzsKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIgPSBOVUxMOworCXN0cnVjdCBGV0NNRF9DT01NT05fR0VUX0ZXX1ZFUlNJT04gKmZ3Y21kID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGlycWw7CisJc3RydWN0IGJlX21jY193cmJfcmVzcG9uc2VfY29weSByYzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJd3JiID0gYmVfZnVuY3Rpb25fcGVla19tY2Nfd3JiKHBmb2IpOworCWlmICghd3JiKSB7CisJCVRSQUNFKERMX0VSUiwgIk1DQyB3cmIgcGVlayBmYWlsZWQuIik7CisJCXN0YXR1cyA9IEJFX1NUQVRVU19OT19NQ0NfV1JCOworCQlnb3RvIEVycm9yOworCX0KKworCWlmICghY2IgJiYgIWZ3dikgeworCQlUUkFDRShETF9FUlIsICJjYWxsYmFjayBhbmQgcmVzcG9uc2UgYnVmZmVyIE5VTEwhIik7CisJCXN0YXR1cyA9IEJFX05PVF9PSzsKKwkJZ290byBFcnJvcjsKKwl9CisJLyogUHJlcGFyZXMgYW4gZW1iZWRkZWQgZndjbWQsIGluY2x1ZGluZyByZXF1ZXN0L3Jlc3BvbnNlIHNpemVzLiAqLworCWZ3Y21kID0gQkVfUFJFUEFSRV9FTUJFRERFRF9GV0NNRChwZm9iLCB3cmIsIENPTU1PTl9HRVRfRldfVkVSU0lPTik7CisKKwlyYy5sZW5ndGggPSBGSUVMRF9TSVpFT0Yoc3RydWN0IEZXQ01EX0NPTU1PTl9HRVRfRldfVkVSU0lPTiwKKwkJCQkJcGFyYW1zLnJlc3BvbnNlKTsKKwlyYy5md2NtZF9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgRldDTURfQ09NTU9OX0dFVF9GV19WRVJTSU9OLAorCQkJCQlwYXJhbXMucmVzcG9uc2UpOworCXJjLnZhID0gZnd2OworCisJLyogUG9zdCB0aGUgZi93IGNvbW1hbmQgKi8KKwlzdGF0dXMgPSBiZV9mdW5jdGlvbl9wb3N0X21jY193cmIocGZvYiwgd3JiLCBOVUxMLCBjYiwKKwkJCQljYl9jb250ZXh0LCBOVUxMLCBOVUxMLCBmd2NtZCwgJnJjKTsKKworRXJyb3I6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKwlpZiAocGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nICYmIHBmb2ItPm1jYykgeworCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAwOworCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHBmb2ItPm1jYyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK2ludAorYmVfZnVuY3Rpb25fcXVldWVfbWNjX3dyYihzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkJICBzdHJ1Y3QgYmVfZ2VuZXJpY19xX2N0eHQgKnFfY3R4dCkKK3sKKwlpbnQgc3RhdHVzOworCisJQVNTRVJUKHFfY3R4dCk7CisKKwkvKgorCSAqIGlzc3VlIHRoZSBXUkIgdG8gdGhlIE1QVSBhcyBhcHByb3ByaWF0ZQorCSAqLworCWlmIChwZm9iLT5tY2MpIHsKKworCQkvKiBXZSdyZSBpbiByaW5nIG1vZGUuICBRdWV1ZSB0aGlzIGl0ZW0uICovCisJCXBmb2ItPm1jYy0+YmFja2xvZ19sZW5ndGgrKzsKKwkJbGlzdF9hZGRfdGFpbCgmcV9jdHh0LT5jb250ZXh0Lmxpc3QsICZwZm9iLT5tY2MtPmJhY2tsb2cpOworCQlzdGF0dXMgPSBCRV9QRU5ESU5HOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IEJFX05PVF9PSzsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Z3Y21kX2NvbW1vbi5oIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Z3Y21kX2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNmUwZDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZndjbWRfY29tbW9uLmgKQEAgLTAsMCArMSwyMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKy8qCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IHNyY2dlbiB2ZXJzaW9uOiAwMTI3CisgKi8KKyNpZm5kZWYgX19md2NtZF9jb21tb25fYW1hcF9oX18KKyNkZWZpbmUgX19md2NtZF9jb21tb25fYW1hcF9oX18KKyNpbmNsdWRlICJob3N0X3N0cnVjdC5oIgorCisvKiAtLS0gUEhZX0xJTktfRFVQTEVYX0VOVU0gLS0tICovCisjZGVmaW5lIFBIWV9MSU5LX0RVUExFWF9OT05FICAgICAgICAgICAgKDApCisjZGVmaW5lIFBIWV9MSU5LX0RVUExFWF9IQUxGICAgICAgICAgICAgKDEpCisjZGVmaW5lIFBIWV9MSU5LX0RVUExFWF9GVUxMICAgICAgICAgICAgKDIpCisKKy8qIC0tLSBQSFlfTElOS19TUEVFRF9FTlVNIC0tLSAqLworI2RlZmluZSBQSFlfTElOS19TUEVFRF9aRVJPICAgICAgICAgICAgICgwKQkvKiBObyBsaW5rLiAqLworI2RlZmluZSBQSFlfTElOS19TUEVFRF8xME1CUFMgICAgICAgICAgICgxKQkvKiAxMCBNYnBzICovCisjZGVmaW5lIFBIWV9MSU5LX1NQRUVEXzEwME1CUFMgICAgICAgICAgKDIpCS8qIDEwMCBNYnBzICovCisjZGVmaW5lIFBIWV9MSU5LX1NQRUVEXzFHQlBTICAgICAgICAgICAgKDMpCS8qIDEgR2JwcyAqLworI2RlZmluZSBQSFlfTElOS19TUEVFRF8xMEdCUFMgICAgICAgICAgICg0KQkvKiAxMCBHYnBzICovCisKKy8qIC0tLSBQSFlfTElOS19GQVVMVF9FTlVNIC0tLSAqLworI2RlZmluZSBQSFlfTElOS19GQVVMVF9OT05FICAgICAgICAgICAgICgwKQkvKiBObyBmYXVsdCBzdGF0dXMKKwkJCQkJCQlhdmFpbGFibGUgb3IgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgUEhZX0xJTktfRkFVTFRfTE9DQUwgICAgICAgICAgICAoMSkJLyogTG9jYWwgZmF1bHQgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgUEhZX0xJTktfRkFVTFRfUkVNT1RFICAgICAgICAgICAoMikJLyogUmVtb3RlIGZhdWx0IGRldGVjdGVkICovCisKKy8qIC0tLSBCRV9VTFBfTUFTSyAtLS0gKi8KKyNkZWZpbmUgQkVfVUxQMF9NQVNLICAgICAgICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgQkVfVUxQMV9NQVNLICAgICAgICAgICAgICAgICAgICAoMikKKyNkZWZpbmUgQkVfVUxQMl9NQVNLICAgICAgICAgICAgICAgICAgICAoNCkKKworLyogLS0tIE5UV0tfQUNUSVZFX1BPUlQgLS0tICovCisjZGVmaW5lIE5UV0tfUE9SVF9BICAgICAgICAgICAgICAgICAgICAgKDApCS8qIFBvcnQgQSBpcyBjdXJyZW50bHkgYWN0aXZlICovCisjZGVmaW5lIE5UV0tfUE9SVF9CICAgICAgICAgICAgICAgICAgICAgKDEpCS8qIFBvcnQgQiBpcyBjdXJyZW50bHkgYWN0aXZlICovCisjZGVmaW5lIE5UV0tfTk9fQUNUSVZFX1BPUlQgICAgICAgICAgICAgKDE1KQkvKiBCb3RoIHBvcnRzIGhhdmUgbG9zdCBsaW5rICovCisKKy8qIC0tLSBOVFdLX0xJTktfVFlQRSAtLS0gKi8KKyNkZWZpbmUgTlRXS19MSU5LX1RZUEVfUEhZU0lDQUwgICAgICAgICAoMCkJLyogbGluayB1cC9kb3duIGV2ZW50CisJCQkJCQkgICBhcHBsaWVzIHRvIEJsYWRlRW5naW5lJ3MKKwkJCQkJCSAgIFBoeXNpY2FsIFBvcnRzCisJCQkJCQkgICAqLworI2RlZmluZSBOVFdLX0xJTktfVFlQRV9WSVJUVUFMICAgICAgICAgICgxKQkvKiBWaXJ0dWFsIGxpbmsgdXAvZG93biBldmVudAorCQkJCQkJICAgcmVwb3J0ZWQgYnkgQmxhZGVFeGNoYW5nZS4KKwkJCQkJCSAgIFRoaXMgYXBwbGllcyBvbmx5IHdoZW4gdGhlCisJCQkJCQkgICBWTEQgZmVhdHVyZSBpcyBlbmFibGVkCisJCQkJCQkgICAqLworCisvKgorICogLS0tIEZXQ01EX01BQ19UWVBFX0VOVU0gLS0tCisgKiBUaGlzIGVudW0gZGVmaW5lcyB0aGUgdHlwZXMgb2YgTUFDIGFkZHJlc3NlcyBpbiB0aGUgUlhGIE1BQyBBZGRyZXNzIFRhYmxlLgorICovCisjZGVmaW5lIE1BQ19BRERSRVNTX1RZUEVfU1RPUkFHRSAgICAgICAgKDApCS8qIFN0b3JhZ2UgTUFDIEFkZHJlc3MgKi8KKyNkZWZpbmUgTUFDX0FERFJFU1NfVFlQRV9ORVRXT1JLICAgICAgICAoMSkJLyogTmV0d29yayBNQUMgQWRkcmVzcyAqLworI2RlZmluZSBNQUNfQUREUkVTU19UWVBFX1BEICAgICAgICAgICAgICgyKQkvKiBQcm90ZWN0aW9uIERvbWFpbiBNQUMgQWRkciAqLworI2RlZmluZSBNQUNfQUREUkVTU19UWVBFX01BTkFHRU1FTlQgICAgICgzKQkvKiBNYW5hZ21lbnQgTUFDIEFkZHJlc3MgKi8KKworCisvKiAtLS0gRldDTURfUklOR19UWVBFX0VOVU0gLS0tICovCisjZGVmaW5lIEZXQ01EX1JJTkdfVFlQRV9FVEhfUlggICAgICAgICAgKDEpCS8qIFJpbmcgY3JlYXRlZCB3aXRoICovCisJCQkJCS8qIEZXQ01EX0NPTU1PTl9FVEhfUlhfQ1JFQVRFLiAqLworI2RlZmluZSBGV0NNRF9SSU5HX1RZUEVfRVRIX1RYICAgICAgICAgICgyKQkvKiBSaW5nIGNyZWF0ZWQgd2l0aCAqLworCQkJCQkvKiBGV0NNRF9DT01NT05fRVRIX1RYX0NSRUFURS4gKi8KKyNkZWZpbmUgRldDTURfUklOR19UWVBFX0lTQ1NJX1dSQlEgICAgICAoMykJLyogUmluZyBjcmVhdGVkIHdpdGggKi8KKwkJCQkJLyogRldDTURfQ09NTU9OX0lTQ1NJX1dSQlFfQ1JFQVRFLiAqLworI2RlZmluZSBGV0NNRF9SSU5HX1RZUEVfSVNDU0lfREVGUSAgICAgICg0KQkvKiBSaW5nIGNyZWF0ZWQgd2l0aCAqLworCQkJCQkvKiBGV0NNRF9DT01NT05fSVNDU0lfREVGUV9DUkVBVEUuICovCisjZGVmaW5lIEZXQ01EX1JJTkdfVFlQRV9UUE1fV1JCUSAgICAgICAgKDUpCS8qIFJpbmcgY3JlYXRlZCB3aXRoICovCisJCQkJCS8qIEZXQ01EX0NPTU1PTl9UUE1fV1JCUV9DUkVBVEUuICovCisjZGVmaW5lIEZXQ01EX1JJTkdfVFlQRV9UUE1fREVGUSAgICAgICAgKDYpCS8qIFJpbmcgY3JlYXRlZCB3aXRoICovCisJCQkJCS8qIEZXQ01EX0NPTU1PTlRQTV9UREVGUV9DUkVBVEUuICovCisjZGVmaW5lIEZXQ01EX1JJTkdfVFlQRV9UUE1fUlEgICAgICAgICAgKDcpCS8qIFJpbmcgY3JlYXRlZCB3aXRoICovCisJCQkJCS8qIEZXQ01EX0NPTU1PTl9UUE1fUlFfQ1JFQVRFLiAqLworI2RlZmluZSBGV0NNRF9SSU5HX1RZUEVfTUNDICAgICAgICAgICAgICg4KQkvKiBSaW5nIGNyZWF0ZWQgd2l0aCAqLworCQkJCQkvKiBGV0NNRF9DT01NT05fTUNDX0NSRUFURS4gKi8KKyNkZWZpbmUgRldDTURfUklOR19UWVBFX0NRICAgICAgICAgICAgICAoOSkJLyogUmluZyBjcmVhdGVkIHdpdGggKi8KKwkJCQkJLyogRldDTURfQ09NTU9OX0NRX0NSRUFURS4gKi8KKyNkZWZpbmUgRldDTURfUklOR19UWVBFX0VRICAgICAgICAgICAgICAoMTApCS8qIFJpbmcgY3JlYXRlZCB3aXRoICovCisJCQkJCS8qIEZXQ01EX0NPTU1PTl9FUV9DUkVBVEUuICovCisjZGVmaW5lIEZXQ01EX1JJTkdfVFlQRV9RUCAgICAgICAgICAgICAgKDExKQkvKiBSaW5nIGNyZWF0ZWQgd2l0aCAqLworCQkJCQkvKiBGV0NNRF9SRE1BX1FQX0NSRUFURS4gKi8KKworCisvKiAtLS0gRVRIX1RYX1JJTkdfVFlQRV9FTlVNIC0tLSAqLworI2RlZmluZSBFVEhfVFhfUklOR19UWVBFX0ZPUldBUkRJTkcgICAgICgxKQkvKiBFdGhlcm5ldCByaW5nIGZvcgorCQkJCQkJICAgZm9yd2FyZGluZyBwYWNrZXRzICovCisjZGVmaW5lIEVUSF9UWF9SSU5HX1RZUEVfU1RBTkRBUkQgICAgICAgKDIpCS8qIEV0aGVybmV0IHJpbmcgZm9yIHNlbmRpbmcKKwkJCQkJCSAgIG5ldHdvcmsgcGFja2V0cy4gKi8KKyNkZWZpbmUgRVRIX1RYX1JJTkdfVFlQRV9CT1VORCAgICAgICAgICAoMykJLyogRXRoZXJuZXQgcmluZyBib3VuZCB0byB0aGUKKwkJCQkJCSAgIHBvcnQgc3BlY2lmaWVkIGluIHRoZSBjb21tYW5kCisJCQkJCQkgICBoZWFkZXIucG9ydF9udW1iZXIgZmllbGQuCisJCQkJCQkgICBSaW5ncyBvZiB0aGlzIHR5cGUgYXJlCisJCQkJCQkgICBOT1Qgc3ViamVjdCB0byB0aGUKKwkJCQkJCSAgIGZhaWxvdmVyIGxvZ2ljIGltcGxlbWVudGVkCisJCQkJCQkgICBpbiB0aGUgQmxhZGVFbmdpbmUuCisJCQkJCQkgICAqLworCisvKiAtLS0gRldDTURfQ09NTU9OX1FPU19UWVBFX0VOVU0gLS0tICovCisjZGVmaW5lIFFPU19CSVRTX05JQyAgICAgICAgICAgICAgICAgICAgKDEpCS8qIG1heF9iaXRzX3Blcl9zZWNvbmRfTklDICovCisJCQkJCQkgIC8qIGZpZWxkIGlzIHZhbGlkLiAgKi8KKyNkZWZpbmUgUU9TX1BLVFNfTklDICAgICAgICAgICAgICAgICAgICAoMikJLyogbWF4X3BhY2tldHNfcGVyX3NlY29uZF9OSUMgKi8KKwkJCQkJCSAgLyogZmllbGQgaXMgdmFsaWQuICAqLworI2RlZmluZSBRT1NfSU9QU19JU0NTSSAgICAgICAgICAgICAgICAgICg0KQkvKiBtYXhfaW9zX3Blcl9zZWNvbmRfaVNDU0kgKi8KKwkJCQkJCSAgLypmaWVsZCBpcyB2YWxpZC4gICovCisjZGVmaW5lIFFPU19WTEFOX1RBRyAgICAgICAgICAgICAgICAgICAgKDgpCS8qIGRvbWFpbl9WTEFOX3RhZyBmaWVsZAorCQkJCQkJICAgaXMgdmFsaWQuICovCisjZGVmaW5lIFFPU19GQUJSSUNfSUQgICAgICAgICAgICAgICAgICAgKDE2KQkvKiBmYWJyaWNfZG9tYWluX0lEIGZpZWxkCisJCQkJCQkgICBpcyB2YWxpZC4gKi8KKyNkZWZpbmUgUU9TX09FTV9QQVJBTVMgICAgICAgICAgICAgICAgICAoMzIpCS8qIHFvc19wYXJhbXNfb2VtIGZpZWxkCisJCQkJCQkgICBpcyB2YWxpZC4gKi8KKyNkZWZpbmUgUU9TX1RQVVRfSVNDU0kgICAgICAgICAgICAgICAgICAoNjQpCS8qIG1heF9ieXRlc19wZXJfc2Vjb25kX2lTQ1NJCisJCQkJCQkgICBmaWVsZCAgaXMgdmFsaWQuICAqLworCisKKy8qCisgKiAtLS0gRkFJTE9WRVJfQ09ORklHX0VOVU0gLS0tCisgKiBGYWlsb3ZlciBjb25maWd1cmF0aW9uIHNldHRpbmcgdXNlZCBpbiBGV0NNRF9DT01NT05fRk9SQ0VfRkFJTE9WRVIKKyAqLworI2RlZmluZSBGQUlMT1ZFUl9DT05GSUdfTk9fQ0hBTkdFICAgICAgICgwKQkvKiBObyBjaGFuZ2UgdG8gYXV0b21hdGljICovCisJCQkJCQkgIC8qIHBvcnQgZmFpbG92ZXIgc2V0dGluZy4gKi8KKyNkZWZpbmUgRkFJTE9WRVJfQ09ORklHX09OICAgICAgICAgICAgICAoMSkJLyogQXV0b21hdGljIHBvcnQgZmFpbG92ZXIKKwkJCQkJCSAgIG9uIGxpbmsgZG93biAgaXMgZW5hYmxlZC4gKi8KKyNkZWZpbmUgRkFJTE9WRVJfQ09ORklHX09GRiAgICAgICAgICAgICAoMikJLyogQXV0b21hdGljIHBvcnQgZmFpbG92ZXIKKwkJCQkJCSAgIG9uIGxpbmsgZG93biBpcyBkaXNhYmxlZC4gKi8KKworLyoKKyAqIC0tLSBGQUlMT1ZFUl9QT1JUX0VOVU0gLS0tCisgKiBGYWlsb3ZlciBwb3J0IHNldHRpbmcgdXNlZCBpbiBGV0NNRF9DT01NT05fRk9SQ0VfRkFJTE9WRVIKKyAqLworI2RlZmluZSBGQUlMT1ZFUl9QT1JUX0EgICAgICAgICAgICAgICAgICgwKQkvKiBTZWxlY3RzIHBvcnQgQS4gKi8KKyNkZWZpbmUgRkFJTE9WRVJfUE9SVF9CICAgICAgICAgICAgICAgICAoMSkJLyogU2VsZWN0cyBwb3J0IEIuICovCisjZGVmaW5lIEZBSUxPVkVSX1BPUlRfTk9ORSAgICAgICAgICAgICAgKDE1KQkvKiBObyBwb3J0IGNoYW5nZSByZXF1ZXN0ZWQuICovCisKKworLyoKKyAqIC0tLSBNR01UX0ZMQVNIUk9NX09QQ09ERSAtLS0KKyAqIEZsYXNoIFJPTSBvcGVyYXRpb24gY29kZQorICovCisjZGVmaW5lIE1HTVRfRkxBU0hST01fT1BDT0RFX0ZMQVNIICAgICAgKDEpCS8qIENvbW1pdCBkb3dubG9hZGVkIGRhdGEKKwkJCQkJCSAgIHRvIEZsYXNoIFJPTSAqLworI2RlZmluZSBNR01UX0ZMQVNIUk9NX09QQ09ERV9TQVZFICAgICAgICgyKQkvKiBTYXZlIGRvd25sb2FkZWQgZGF0YSB0bworCQkJCQkJICAgQVJNJ3MgRERSIC0gZG8gbm90IGZsYXNoICovCisjZGVmaW5lIE1HTVRfRkxBU0hST01fT1BDT0RFX0NMRUFSICAgICAgKDMpCS8qIEVyYXNlIHNwZWNpZmllZCBjb21wb25lbnQKKwkJCQkJCSAgIGZyb20gRmxhc2hST00gKi8KKyNkZWZpbmUgTUdNVF9GTEFTSFJPTV9PUENPREVfUkVQT1JUICAgICAoNCkJLyogUmVhZCBzcGVjaWZpZWQgY29tcG9uZW50CisJCQkJCQkgICBmcm9tIEZsYXNoIFJPTSAqLworI2RlZmluZSBNR01UX0ZMQVNIUk9NX09QQ09ERV9JTUFHRV9JTkZPICg1KQkvKiBSZXR1cm5zIHNpemUgb2YgYQorCQkJCQkJICAgY29tcG9uZW50ICovCisKKy8qCisgKiAtLS0gTUdNVF9GTEFTSFJPTV9PUFRZUEUgLS0tCisgKiBGbGFzaCBST00gb3BlcmF0aW9uIHR5cGUKKyAqLworI2RlZmluZSBNR01UX0ZMQVNIUk9NX09QVFlQRV9DT0RFX0ZJUk1XQVJFICgwKQkvKiBJbmNsdWRlcyBBUk0gZmlybXdhcmUsCisJCQkJCQkgICBJUFNlYyAob3B0aW9uYWwpIGFuZCBFUAorCQkJCQkJICAgZmlybXdhcmUgICovCisjZGVmaW5lIE1HTVRfRkxBU0hST01fT1BUWVBFX0NPREVfUkVEQk9PVCAoMSkKKyNkZWZpbmUgTUdNVF9GTEFTSFJPTV9PUFRZUEVfQ09ERV9CSU9TICAoMikKKyNkZWZpbmUgTUdNVF9GTEFTSFJPTV9PUFRZUEVfQ09ERV9QWEVfQklPUyAoMykKKyNkZWZpbmUgTUdNVF9GTEFTSFJPTV9PUFRZUEVfQ09ERV9DVFJMUyAoNCkKKyNkZWZpbmUgTUdNVF9GTEFTSFJPTV9PUFRZUEVfQ0ZHX0lQU0VDICAoNSkKKyNkZWZpbmUgTUdNVF9GTEFTSFJPTV9PUFRZUEVfQ0ZHX0lOSSAgICAoNikKKyNkZWZpbmUgTUdNVF9GTEFTSFJPTV9PUFRZUEVfUk9NX09GRlNFVF9TUEVDSUZJRUQgKDcpCisKKy8qCisgKiAtLS0gRkxBU0hST01fVFlQRSAtLS0KKyAqIEZsYXNoIFJPTSBtYW51ZmFjdHVyZXJzIHN1cHBvcnRlZCBpbiB0aGUgZi93CisgKi8KKyNkZWZpbmUgSU5URUwgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgU1BBTlNJT04gICAgICAgICAgICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgTUlDUk9OICAgICAgICAgICAgICAgICAgICAgICAgICAoMikKKworLyogLS0tIEREUl9DQVNfVFlQRSAtLS0gKi8KKyNkZWZpbmUgQ0FTXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgQ0FTXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgQ0FTXzUgICAgICAgICAgICAgICAgICAgICAgICAgICAoMikKKworLyogLS0tIEREUl9TSVpFX1RZUEUgLS0tICovCisjZGVmaW5lIFNJWkVfMjU2TUIgICAgICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIFNJWkVfNTEyTUIgICAgICAgICAgICAgICAgICAgICAgKDEpCisKKy8qIC0tLSBERFJfTU9ERV9UWVBFIC0tLSAqLworI2RlZmluZSBERFJfTk9fRUNDICAgICAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBERFJfRUNDICAgICAgICAgICAgICAgICAgICAgICAgICgxKQorCisvKiAtLS0gSU5URVJGQUNFXzEwR0JfVFlQRSAtLS0gKi8KKyNkZWZpbmUgQ1g0X1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgWEZQX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAoMSkKKworLyogLS0tIEJFX0NISVBfTUFYX01UVSAtLS0gKi8KKyNkZWZpbmUgQ0hJUF9NQVhfTVRVICAgICAgICAgICAgICAgICAgICAoOTAwMCkKKworLyogLS0tIFhBVUlfU1RBVEVfRU5VTSAtLS0gKi8KKyNkZWZpbmUgWEFVSV9TVEFURV9FTkFCTEUgICAgICAgICAgICAgICAoMCkJLyogVGhpcyBNVVNUIGJlIHRoZSBkZWZhdWx0CisJCQkJCQkgICB2YWx1ZSBmb3IgYWxsIHJlcXVlc3RzCisJCQkJCQkgICB3aGljaCBzZXQvY2hhbmdlCisJCQkJCQkgICBlcXVhbGl6YXRpb24gcGFyYW1ldGVyLiAgKi8KKyNkZWZpbmUgWEFVSV9TVEFURV9ESVNBQkxFICAgICAgICAgICAgICAoMjU1KQkvKiBUaGUgWEFVSSBmb3IgYm90aCBwb3J0cworCQkJCQkJICAgbWF5IGJlIGRpc2FibGVkIGZvciBFTUkKKwkJCQkJCSAgIHRlc3RzLiBUaGVyZSBpcyBubworCQkJCQkJICAgcHJvdmlzaW9uIGZvciB0dXJuaW5nIG9mZgorCQkJCQkJICAgaW5kaXZpZHVhbCBwb3J0cy4KKwkJCQkJCSAgICovCisvKiAtLS0gQkVfQVNJQ19SRVZJU0lPTiAtLS0gKi8KKyNkZWZpbmUgQkVfQVNJQ19SRVZfQTAgICAgICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgQkVfQVNJQ19SRVZfQTEgICAgICAgICAgICAgICAgICAoMikKKworI2VuZGlmIC8qIF9fZndjbWRfY29tbW9uX2FtYXBfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZndjbWRfY29tbW9uX2JtYXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9md2NtZF9jb21tb25fYm1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMDdjZjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZndjbWRfY29tbW9uX2JtYXAuaApAQCAtMCwwICsxLDcxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworLyoKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgc3JjZ2VuIHZlcnNpb246IDAxMjcKKyAqLworI2lmbmRlZiBfX2Z3Y21kX2NvbW1vbl9ibWFwX2hfXworI2RlZmluZSBfX2Z3Y21kX2NvbW1vbl9ibWFwX2hfXworI2luY2x1ZGUgImZ3Y21kX3R5cGVzX2JtYXAuaCIKKyNpbmNsdWRlICJmd2NtZF9oZHJfYm1hcC5oIgorCisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisgICAvKiBQaHlzaWNhbCBBZGRyZXNzLiAqLworc3RydWN0IFBIWVNfQUREUiB7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdTMyIGxvOwkvKiBEV09SRCAwICovCisJCQl1MzIgaGk7CS8qIERXT1JEIDEgKi8KKwkJfSBfX3BhY2tlZDsJLyogdW5uYW1lZCBzdHJ1Y3QgKi8KKwkJdTMyIGR3WzJdOwkvKiBkd29yZCB1bmlvbiAqLworCX07CQkJLyogdW5uYW1lZCB1bmlvbiAqLworfSBfX3BhY2tlZCA7CisKKworI2Vsc2UKKyAgIC8qIFBoeXNpY2FsIEFkZHJlc3MuICovCitzdHJ1Y3QgUEhZU19BRERSIHsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1MzIgbG87CS8qIERXT1JEIDAgKi8KKwkJCXUzMiBoaTsJLyogRFdPUkQgMSAqLworCQl9IF9fcGFja2VkOwkvKiB1bm5hbWVkIHN0cnVjdCAqLworCQl1MzIgZHdbMl07CS8qIGR3b3JkIHVuaW9uICovCisJfTsJCQkvKiB1bm5hbWVkIHVuaW9uICovCit9IF9fcGFja2VkIDsKKworc3RydWN0IEJFX0xJTktfU1RBVFVTIHsKKwl1OCBtYWMwX2R1cGxleDsKKwl1OCBtYWMwX3NwZWVkOworCXU4IG1hYzFfZHVwbGV4OworCXU4IG1hYzFfc3BlZWQ7CisJdTggbWdtdF9tYWNfZHVwbGV4OworCXU4IG1nbXRfbWFjX3NwZWVkOworCXU4IGFjdGl2ZV9wb3J0OworCXU4IHJzdmQwOworCXU4IG1hYzBfZmF1bHQ7CisJdTggbWFjMV9mYXVsdDsKKwl1MTYgcnN2ZDE7Cit9IF9fcGFja2VkOworI2VuZGlmCisKK3N0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8xNzBfUkVRVUVTVCB7CisJdTMyIHJzdmQwOworfSBfX3BhY2tlZDsKKwordW5pb24gTElOS19TVEFUVVNfUVVFUllfUEFSQU1TIHsKKwlzdHJ1Y3QgQkVfTElOS19TVEFUVVMgcmVzcG9uc2U7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzE3MF9SRVFVRVNUIHJlcXVlc3Q7Cit9IF9fcGFja2VkOworCisvKgorICogIFF1ZXJpZXMgdGhlIHRoZSBsaW5rIHN0YXR1cyBmb3IgYWxsIHBvcnRzLiAgVGhlIHZhbGlkIHZhbHVlcyBiZWxvdworICogIERPIE5PVCBpbmRpY2F0ZSB0aGF0ICBhIHBhcnRpY3VsYXIgZHVwbGV4IG9yIHNwZWVkIGlzIHN1cHBvcnRlZCBieQorICogIEJsYWRlRW5naW5lLiBUaGVzZSBlbnVtZXJhdGlvbnMgc2ltcGx5ICBsaXN0IGFsbCBwb3NzaWJsZSBkdXBsZXhlcworICogIGFuZCBzcGVlZHMgZm9yIGFueSBwb3J0LiBDb25zdWx0IEJsYWRlRW5naW5lIHByb2R1Y3QgIGRvY3VtZW50YXRpb24KKyAqICBmb3IgdGhlIHN1cHBvcnRlZCBwYXJhbWV0ZXJzLgorICovCitzdHJ1Y3QgRldDTURfQ09NTU9OX05UV0tfTElOS19TVEFUVVNfUVVFUlkgeworCXVuaW9uIEZXQ01EX0hFQURFUiBoZWFkZXI7CisJdW5pb24gTElOS19TVEFUVVNfUVVFUllfUEFSQU1TIHBhcmFtczsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8xNzFfUkVRVUVTVCB7CisJdTggdHlwZTsKKwl1OCBwb3J0OworCXU4IG1hYzE7CisJdTggcGVybWFuZW50OworfSBfX3BhY2tlZDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzE3Ml9SRVNQT05TRSB7CisJc3RydWN0IE1BQ19BRERSRVNTX0ZPUk1BVCBtYWM7Cit9IF9fcGFja2VkOworCit1bmlvbiBOVFdLX01BQ19RVUVSWV9QQVJBTVMgeworCXN0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8xNzFfUkVRVUVTVCByZXF1ZXN0OworCXN0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8xNzJfUkVTUE9OU0UgcmVzcG9uc2U7Cit9IF9fcGFja2VkOworCisvKiBRdWVyaWVzIG9uZSBNQUMgYWRkcmVzcy4gICovCitzdHJ1Y3QgRldDTURfQ09NTU9OX05UV0tfTUFDX1FVRVJZIHsKKwl1bmlvbiBGV0NNRF9IRUFERVIgaGVhZGVyOworCXVuaW9uIE5UV0tfTUFDX1FVRVJZX1BBUkFNUyBwYXJhbXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgTUFDX1NFVF9QQVJBTVNfSU4geworCXU4IHR5cGU7CisJdTggcG9ydDsKKwl1OCBtYWMxOworCXU4IGludmFsaWRhdGU7CisJc3RydWN0IE1BQ19BRERSRVNTX0ZPUk1BVCBtYWM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgTUFDX1NFVF9QQVJBTVNfT1VUIHsKKwl1MzIgcnN2ZDA7Cit9IF9fcGFja2VkOworCit1bmlvbiBNQUNfU0VUX1BBUkFNUyB7CisJc3RydWN0IE1BQ19TRVRfUEFSQU1TX0lOIHJlcXVlc3Q7CisJc3RydWN0IE1BQ19TRVRfUEFSQU1TX09VVCByZXNwb25zZTsKK30gX19wYWNrZWQ7CisKKy8qIFNldHMgYSBNQUMgYWRkcmVzcy4gICovCitzdHJ1Y3QgRldDTURfQ09NTU9OX05UV0tfTUFDX1NFVCB7CisJdW5pb24gRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBNQUNfU0VUX1BBUkFNUyBwYXJhbXM7Cit9IF9fcGFja2VkOworCisvKiBNQUMgYWRkcmVzcyBsaXN0LiAqLworc3RydWN0IE5UV0tfTVVMVElDQVNUX01BQ19MSVNUIHsKKwl1OCBieXRlWzZdOworfSBfX3BhY2tlZDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9OVFdLX01VTFRJQ0FTVF9TRVRfUkVRVUVTVF9QQVlMT0FEIHsKKwl1MTYgbnVtX21hYzsKKwl1OCBwcm9taXNjdW91czsKKwl1OCByc3ZkMDsKKwlzdHJ1Y3QgTlRXS19NVUxUSUNBU1RfTUFDX0xJU1QgbWFjWzMyXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8xNzRfUkVTUE9OU0UgeworCXUzMiByc3ZkMDsKK30gX19wYWNrZWQ7CisKK3VuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzE3M19QQVJBTVMgeworCXN0cnVjdCBGV0NNRF9DT01NT05fTlRXS19NVUxUSUNBU1RfU0VUX1JFUVVFU1RfUEFZTE9BRCByZXF1ZXN0OworCXN0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8xNzRfUkVTUE9OU0UgcmVzcG9uc2U7Cit9IF9fcGFja2VkOworCisvKgorICogIFNldHMgbXVsdGljYXN0IGFkZHJlc3MgaGFzaC4gVGhlIE1QVSB3aWxsIG1lcmdlIHRoZSBNQUMgYWRkcmVzcyBsaXN0cworICogIGZyb20gYWxsIGNsaWVudHMsICBpbmNsdWRpbmcgdGhlIG5ldHdvcmtpbmcgYW5kIHN0b3JhZ2UgZnVuY3Rpb25zLgorICogIFRoaXMgY29tbWFuZCBtYXkgZmFpbCBpZiB0aGUgZmluYWwgbWVyZ2VkICBsaXN0IG9mIE1BQyBhZGRyZXNzZXMgZXhjZWVkcworICogIDMyIGVudHJpZXMuCisgKi8KK3N0cnVjdCBGV0NNRF9DT01NT05fTlRXS19NVUxUSUNBU1RfU0VUIHsKKwl1bmlvbiBGV0NNRF9IRUFERVIgaGVhZGVyOworCXVuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzE3M19QQVJBTVMgcGFyYW1zOworfSBfX3BhY2tlZDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9OVFdLX1ZMQU5fQ09ORklHX1JFUVVFU1RfUEFZTE9BRCB7CisJdTE2IG51bV92bGFuOworCXU4IHByb21pc2N1b3VzOworCXU4IHJzdmQwOworCXUxNiB2bGFuX3RhZ1szMl07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMTc2X1JFU1BPTlNFIHsKKwl1MzIgcnN2ZDA7Cit9IF9fcGFja2VkOworCit1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8xNzVfUEFSQU1TIHsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX05UV0tfVkxBTl9DT05GSUdfUkVRVUVTVF9QQVlMT0FEIHJlcXVlc3Q7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzE3Nl9SRVNQT05TRSByZXNwb25zZTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiAgU2V0cyBWTEFOIHRhZyBmaWx0ZXIuIFRoZSBNUFUgd2lsbCBtZXJnZSB0aGUgVkxBTiB0YWcgbGlzdCBmcm9tIGFsbAorICogIGNsaWVudHMsIGluY2x1ZGluZyAgdGhlIG5ldHdvcmtpbmcgYW5kIHN0b3JhZ2UgZnVuY3Rpb25zLiBUaGlzIGNvbW1hbmQKKyAqICBtYXkgZmFpbCBpZiB0aGUgZmluYWwgdmxhbl90YWcgYXJyYXkgIChmcm9tIGFsbCBmdW5jdGlvbnMpIGlzIGxvbmdlcgorICogIHRoYW4gMzIgZW50cmllcy4KKyAqLworc3RydWN0IEZXQ01EX0NPTU1PTl9OVFdLX1ZMQU5fQ09ORklHIHsKKwl1bmlvbiBGV0NNRF9IRUFERVIgaGVhZGVyOworCXVuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzE3NV9QQVJBTVMgcGFyYW1zOworfSBfX3BhY2tlZDsKKworc3RydWN0IFJJTkdfREVTVFJPWV9SRVFVRVNUIHsKKwl1MTYgcmluZ190eXBlOworCXUxNiBpZDsKKwl1OCBieXBhc3NfZmx1c2g7CisJdTggcnN2ZDA7CisJdTE2IHJzdmQxOworfSBfX3BhY2tlZDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzE5MF9SRVNQT05TRSB7CisJdTMyIHJzdmQwOworfSBfX3BhY2tlZDsKKwordW5pb24gRldDTURfQ09NTU9OX0FOT05fMTg5X1BBUkFNUyB7CisJc3RydWN0IFJJTkdfREVTVFJPWV9SRVFVRVNUIHJlcXVlc3Q7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzE5MF9SRVNQT05TRSByZXNwb25zZTsKK30gX19wYWNrZWQ7CisvKgorICogIENvbW1hbmQgZm9yIGRlc3Ryb3lpbmcgYW55IHJpbmcuIFRoZSBjb25uZWN0aW9uKHMpIHVzaW5nIHRoZSByaW5nIHNob3VsZAorICogIGJlIHF1aWVzY2VkICBiZWZvcmUgZGVzdHJveWluZyB0aGUgcmluZy4KKyAqLworc3RydWN0IEZXQ01EX0NPTU1PTl9SSU5HX0RFU1RST1kgeworCXVuaW9uIEZXQ01EX0hFQURFUiBoZWFkZXI7CisJdW5pb24gRldDTURfQ09NTU9OX0FOT05fMTg5X1BBUkFNUyBwYXJhbXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMTkyX1JFUVVFU1QgeworCXUxNiBudW1fcGFnZXM7CisJdTE2IHJzdmQwOworCXN0cnVjdCBDUV9DT05URVhUX0FNQVAgY29udGV4dDsKKwlzdHJ1Y3QgUEhZU19BRERSIHBhZ2VzWzRdOworfSBfX3BhY2tlZCA7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8xOTNfUkVTUE9OU0UgeworCXUxNiBjcV9pZDsKK30gX19wYWNrZWQgOworCit1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8xOTFfUEFSQU1TIHsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMTkyX1JFUVVFU1QgcmVxdWVzdDsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMTkzX1JFU1BPTlNFIHJlc3BvbnNlOworfSBfX3BhY2tlZCA7CisKKy8qCisgKiAgQ29tbWFuZCBmb3IgY3JlYXRpbmcgYSBjb21wbGV0aW9uIHF1ZXVlLiBBIENvbXBsZXRpb24gUXVldWUgbXVzdCBzcGFuCisgKiAgYXQgbGVhc3QgMSBwYWdlIGFuZCAgYXQgbW9zdCA0IHBhZ2VzLiBFYWNoIGNvbXBsZXRpb24gcXVldWUgZW50cnkKKyAqICBpcyAxNiBieXRlcyByZWdhcmRsZXNzIG9mIENRIGVudHJ5IGZvcm1hdC4gIFRodXMgdGhlIHJpbmcgbXVzdCBiZQorICogIGF0IGxlYXN0IDI1NiBlbnRyaWVzIGRlZXAgKGNvcnJlc3BvbmRpbmcgdG8gMSBwYWdlKSBhbmQgY2FuIGJlIGF0CisgKiAgIG1vc3QgMTAyNCBlbnRyaWVzIGRlZXAgKGNvcnJlc3BvbmRpbmcgdG8gNCBwYWdlcykuIFRoZSBudW1iZXIgb2YKKyAqICBwYWdlcyBwb3N0ZWQgbXVzdCAgY29udGFpbiB0aGUgQ1EgcmluZyBzaXplIGFzIGVuY29kZWQgaW4gdGhlIGNvbnRleHQuCisgKgorICovCitzdHJ1Y3QgRldDTURfQ09NTU9OX0NRX0NSRUFURSB7CisJdW5pb24gRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8xOTFfUEFSQU1TIHBhcmFtczsKK30gX19wYWNrZWQgOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMTk4X1JFUVVFU1QgeworCXUxNiBudW1fcGFnZXM7CisJdTE2IHJzdmQwOworCXN0cnVjdCBFUV9DT05URVhUX0FNQVAgY29udGV4dDsKKwlzdHJ1Y3QgUEhZU19BRERSIHBhZ2VzWzhdOworfSBfX3BhY2tlZCA7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8xOTlfUkVTUE9OU0UgeworCXUxNiBlcV9pZDsKK30gX19wYWNrZWQgOworCit1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8xOTdfUEFSQU1TIHsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMTk4X1JFUVVFU1QgcmVxdWVzdDsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMTk5X1JFU1BPTlNFIHJlc3BvbnNlOworfSBfX3BhY2tlZCA7CisKKy8qCisgKiAgQ29tbWFuZCBmb3IgY3JlYXRpbmcgYSBldmVudCBxdWV1ZS4gQW4gRXZlbnQgUXVldWUgbXVzdCBzcGFuIGF0IGxlYXN0CisgKiAgMSBwYWdlIGFuZCBhdCBtb3N0ICA4IHBhZ2VzLiBUaGUgbnVtYmVyIG9mIHBhZ2VzIHBvc3RlZCBtdXN0IGNvbnRhaW4KKyAqICB0aGUgRVEgcmluZy4gVGhlIHJpbmcgaXMgZGVmaW5lZCBieSAgdGhlIHNpemUgb2YgdGhlIEVRIGVudHJpZXMgKGVuY29kZWQKKyAqICBpbiB0aGUgY29udGV4dCkgYW5kIHRoZSBudW1iZXIgb2YgRVEgZW50cmllcyAoYWxzbyAgZW5jb2RlZCBpbiB0aGUKKyAqICBjb250ZXh0KS4KKyAqLworc3RydWN0IEZXQ01EX0NPTU1PTl9FUV9DUkVBVEUgeworCXVuaW9uICBGV0NNRF9IRUFERVIgaGVhZGVyOworCXVuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzE5N19QQVJBTVMgcGFyYW1zOworfSBfX3BhY2tlZCA7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yMDFfUkVRVUVTVCB7CisJdTE2IGNxX2lkOworCXUxNiBiY21jX2NxX2lkOworCXUxNiBudW1fcGFnZXM7CisJdTE2IHJzdmQwOworCXN0cnVjdCBQSFlTX0FERFIgcGFnZXNbMl07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjAyX1JFU1BPTlNFIHsKKwl1MTYgaWQ7Cit9IF9fcGFja2VkOworCit1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8yMDBfUEFSQU1TIHsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjAxX1JFUVVFU1QgcmVxdWVzdDsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjAyX1JFU1BPTlNFIHJlc3BvbnNlOworfSBfX3BhY2tlZDsKKworLyoKKyAqICBDb21tYW5kIGZvciBjcmVhdGluZyBFdGhlcm5ldCByZWNlaXZlIHJpbmcuICBBbiBFUlggcmluZyBjb250YWlucyBFVEhfUlhfRAorICogIGVudHJpZXMgKDggIGJ5dGVzIGVhY2gpLiBBbiBFUlggcmluZyBtdXN0IGJlIDEwMjQgZW50cmllcyBkZWVwCisgKiAgKGNvcnJlc3BvbmRpbmcgdG8gMiBwYWdlcykuCisgKi8KK3N0cnVjdCBGV0NNRF9DT01NT05fRVRIX1JYX0NSRUFURSB7CisJdW5pb24gRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8yMDBfUEFSQU1TIHBhcmFtczsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yMDRfUkVRVUVTVCB7CisJdTE2IG51bV9wYWdlczsKKwl1OCB1bHBfbnVtOworCXU4IHR5cGU7CisJc3RydWN0IEVUWF9DT05URVhUX0FNQVAgY29udGV4dDsKKwlzdHJ1Y3QgUEhZU19BRERSIHBhZ2VzWzhdOworfSBfX3BhY2tlZCA7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yMDVfUkVTUE9OU0UgeworCXUxNiBjaWQ7CisJdTggdWxwX251bTsKKwl1OCByc3ZkMDsKK30gX19wYWNrZWQgOworCit1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8yMDNfUEFSQU1TIHsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjA0X1JFUVVFU1QgcmVxdWVzdDsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjA1X1JFU1BPTlNFIHJlc3BvbnNlOworfSBfX3BhY2tlZCA7CisKKy8qCisgKiAgQ29tbWFuZCBmb3IgY3JlYXRpbmcgYW4gRXRoZXJuZXQgdHJhbnNtaXQgcmluZy4gIEFuIEVUWCByaW5nIGNvbnRhaW5zCisgKiAgRVRIX1dSQiBlbnRyaWVzICgxNiAgYnl0ZXMgZWFjaCkuIEFuIEVUWCByaW5nIG11c3QgYmUgYXQgbGVhc3QgMjU2CisgKiAgZW50cmllcyBkZWVwIChjb3JyZXNwb25kaW5nIHRvIDEgcGFnZSkgIGFuZCBhdCBtb3N0IDJrIGVudHJpZXMgZGVlcAorICogIChjb3JyZXNwb25kaW5nIHRvIDggcGFnZXMpLgorICovCitzdHJ1Y3QgRldDTURfQ09NTU9OX0VUSF9UWF9DUkVBVEUgeworCXVuaW9uIEZXQ01EX0hFQURFUiBoZWFkZXI7CisJdW5pb24gRldDTURfQ09NTU9OX0FOT05fMjAzX1BBUkFNUyBwYXJhbXM7Cit9IF9fcGFja2VkIDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzIyMl9SRVFVRVNUIHsKKwl1MTYgbnVtX3BhZ2VzOworCXUxNiByc3ZkMDsKKwlzdHJ1Y3QgTUNDX1JJTkdfQ09OVEVYVF9BTUFQIGNvbnRleHQ7CisJc3RydWN0IFBIWVNfQUREUiBwYWdlc1s4XTsKK30gX19wYWNrZWQgOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjIzX1JFU1BPTlNFIHsKKwl1MTYgaWQ7Cit9IF9fcGFja2VkIDsKKwordW5pb24gRldDTURfQ09NTU9OX0FOT05fMjIxX1BBUkFNUyB7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzIyMl9SRVFVRVNUIHJlcXVlc3Q7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzIyM19SRVNQT05TRSByZXNwb25zZTsKK30gX19wYWNrZWQgOworCisvKgorICogIENvbW1hbmQgZm9yIGNyZWF0aW5nIHRoZSBNQ0MgcmluZy4gQW4gTUNDIHJpbmcgbXVzdCBiZSBhdCBsZWFzdCAxNgorICogIGVudHJpZXMgZGVlcCAgKGNvcnJlc3BvbmRpbmcgdG8gMSBwYWdlKSBhbmQgYXQgbW9zdCAxMjggZW50cmllcyBkZWVwCisgKiAgKGNvcnJlc3BvbmRpbmcgdG8gOCBwYWdlcykuCisgKi8KK3N0cnVjdCBGV0NNRF9DT01NT05fTUNDX0NSRUFURSB7CisJdW5pb24gRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8yMjFfUEFSQU1TIHBhcmFtczsKK30gX19wYWNrZWQgOworCitzdHJ1Y3QgR0VUX1FPU19JTiB7CisJdTMyIHFvc19wYXJhbXNfcnN2ZDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBHRVRfUU9TX09VVCB7CisJdTMyIG1heF9iaXRzX3Blcl9zZWNvbmRfTklDOworCXUzMiBtYXhfcGFja2V0c19wZXJfc2Vjb25kX05JQzsKKwl1MzIgbWF4X2lvc19wZXJfc2Vjb25kX2lTQ1NJOworCXUzMiBtYXhfYnl0ZXNfcGVyX3NlY29uZF9pU0NTSTsKKwl1MTYgZG9tYWluX1ZMQU5fdGFnOworCXUxNiBmYWJyaWNfZG9tYWluX0lEOworCXUzMiBxb3NfcGFyYW1zX29lbVs0XTsKK30gX19wYWNrZWQ7CisKK3VuaW9uIEdFVF9RT1NfUEFSQU1TIHsKKwlzdHJ1Y3QgR0VUX1FPU19JTiByZXF1ZXN0OworCXN0cnVjdCBHRVRfUU9TX09VVCByZXNwb25zZTsKK30gX19wYWNrZWQ7CisKKy8qIFFPUy9CYW5kd2lkdGggc2V0dGluZ3MgcGVyIGRvbWFpbi4gQXBwbGljYWJsZSBvbmx5IGluIFZNcy4gICovCitzdHJ1Y3QgRldDTURfQ09NTU9OX0dFVF9RT1MgeworCXVuaW9uIEZXQ01EX0hFQURFUiBoZWFkZXI7CisJdW5pb24gR0VUX1FPU19QQVJBTVMgcGFyYW1zOworfSBfX3BhY2tlZDsKKworc3RydWN0IFNFVF9RT1NfSU4geworCXUzMiB2YWxpZF9mbGFnczsKKwl1MzIgbWF4X2JpdHNfcGVyX3NlY29uZF9OSUM7CisJdTMyIG1heF9wYWNrZXRzX3Blcl9zZWNvbmRfTklDOworCXUzMiBtYXhfaW9zX3Blcl9zZWNvbmRfaVNDU0k7CisJdTMyIG1heF9ieXRlc19wZXJfc2Vjb25kX2lTQ1NJOworCXUxNiBkb21haW5fVkxBTl90YWc7CisJdTE2IGZhYnJpY19kb21haW5fSUQ7CisJdTMyIHFvc19wYXJhbXNfb2VtWzRdOworfSBfX3BhY2tlZDsKKworc3RydWN0IFNFVF9RT1NfT1VUIHsKKwl1MzIgcW9zX3BhcmFtc19yc3ZkOworfSBfX3BhY2tlZDsKKwordW5pb24gU0VUX1FPU19QQVJBTVMgeworCXN0cnVjdCBTRVRfUU9TX0lOIHJlcXVlc3Q7CisJc3RydWN0IFNFVF9RT1NfT1VUIHJlc3BvbnNlOworfSBfX3BhY2tlZDsKKworLyogUU9TL0JhbmR3aWR0aCBzZXR0aW5ncyBwZXIgZG9tYWluLiBBcHBsaWNhYmxlIG9ubHkgaW4gVk1zLiAgKi8KK3N0cnVjdCBGV0NNRF9DT01NT05fU0VUX1FPUyB7CisJdW5pb24gRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBTRVRfUU9TX1BBUkFNUyBwYXJhbXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgU0VUX0ZSQU1FX1NJWkVfSU4geworCXUzMiBtYXhfdHhfZnJhbWVfc2l6ZTsKKwl1MzIgbWF4X3J4X2ZyYW1lX3NpemU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgU0VUX0ZSQU1FX1NJWkVfT1VUIHsKKwl1MzIgY2hpcF9tYXhfdHhfZnJhbWVfc2l6ZTsKKwl1MzIgY2hpcF9tYXhfcnhfZnJhbWVfc2l6ZTsKK30gX19wYWNrZWQ7CisKK3VuaW9uIFNFVF9GUkFNRV9TSVpFX1BBUkFNUyB7CisJc3RydWN0IFNFVF9GUkFNRV9TSVpFX0lOIHJlcXVlc3Q7CisJc3RydWN0IFNFVF9GUkFNRV9TSVpFX09VVCByZXNwb25zZTsKK30gX19wYWNrZWQ7CisKKy8qIFNldCBmcmFtZSBzaXplIGNvbW1hbmQuIE9ubHkgaG9zdCBkb21haW4gbWF5IGlzc3VlIHRoaXMgY29tbWFuZC4gICovCitzdHJ1Y3QgRldDTURfQ09NTU9OX1NFVF9GUkFNRV9TSVpFIHsKKwl1bmlvbiBGV0NNRF9IRUFERVIgaGVhZGVyOworCXVuaW9uIFNFVF9GUkFNRV9TSVpFX1BBUkFNUyBwYXJhbXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRk9SQ0VfRkFJTE9WRVJfSU4geworCXUzMiBtb3ZlX3RvX3BvcnQ7CisJdTMyIGZhaWxvdmVyX2NvbmZpZzsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yMzFfUkVTUE9OU0UgeworCXUzMiByc3ZkMDsKK30gX19wYWNrZWQ7CisKK3VuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzIzMF9QQVJBTVMgeworCXN0cnVjdCBGT1JDRV9GQUlMT1ZFUl9JTiByZXF1ZXN0OworCXN0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yMzFfUkVTUE9OU0UgcmVzcG9uc2U7Cit9IF9fcGFja2VkOworCisvKgorICogIFVzZSB0aGlzIGNvbW1hbmQgdG8gY29udHJvbCBmYWlsb3ZlciBpbiBCbGFkZUVuZ2luZS4gSXQgbWF5IGJlIHVzZWQKKyAqICB0byBmYWlsYmFjayB0byBhICByZXN0b3JlZCBwb3J0IG9yIHRvIGZvcmNpYmx5IG1vdmUgdHJhZmZpYyBmcm9tCisgKiAgb25lIHBvcnQgdG8gYW5vdGhlci4gSXQgbWF5IGFsc28gYmUgdXNlZCAgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlCisgKiAgYXV0b21hdGljIGZhaWxvdmVyIGZlYXR1cmUuIFRoaXMgY29tbWFuZCBjYW4gb25seSBiZSBpc3N1ZWQgYnkgIGRvbWFpbgorICogIDAuCisgKi8KK3N0cnVjdCBGV0NNRF9DT01NT05fRk9SQ0VfRkFJTE9WRVIgeworCXVuaW9uIEZXQ01EX0hFQURFUiBoZWFkZXI7CisJdW5pb24gRldDTURfQ09NTU9OX0FOT05fMjMwX1BBUkFNUyBwYXJhbXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjQwX1JFUVVFU1QgeworCXU2NCBjb250ZXh0OworfSBfX3BhY2tlZDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzI0MV9SRVNQT05TRSB7CisJdTY0IGNvbnRleHQ7Cit9IF9fcGFja2VkOworCit1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8yMzlfUEFSQU1TIHsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjQwX1JFUVVFU1QgcmVxdWVzdDsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjQxX1JFU1BPTlNFIHJlc3BvbnNlOworfSBfX3BhY2tlZDsKKworLyoKKyAqICBUaGlzIGNvbW1hbmQgY2FuIGJlIHVzZWQgYnkgY2xpZW50cyBhcyBhIG5vLW9wZXJhdGlvbiByZXF1ZXN0LiBUeXBpY2FsCisgKiAgdXNlcyBmb3IgZHJpdmVycyAgYXJlIGFzIGEgaGVhcnRiZWF0IG1lY2hhbmlzbSwgb3IgZGVmZXJyZWQgcHJvY2Vzc2luZworICogIGNhdGFseXN0LiBUaGUgQVJNIHdpbGwgYWx3YXlzICBjb21wbGV0ZSB0aGlzIGNvbW1hbmQgd2l0aCBhIGdvb2QgY29tcGxldGlvbi4KKyAqICBUaGUgNjQtYml0IHBhcmFtZXRlciBpcyBub3QgdG91Y2hlZCBieSB0aGUgIEFSTSBwcm9jZXNzb3IuCisgKi8KK3N0cnVjdCBGV0NNRF9DT01NT05fTk9QIHsKKwl1bmlvbiBGV0NNRF9IRUFERVIgaGVhZGVyOworCXVuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzIzOV9QQVJBTVMgcGFyYW1zOworfSBfX3BhY2tlZDsKKworc3RydWN0IE5UV0tfUlhfRklMVEVSX1NFVFRJTkdTIHsKKwl1OCBwcm9taXNjdW91czsKKwl1OCBpcF9ja3N1bTsKKwl1OCB0Y3BfY2tzdW07CisJdTggdWRwX2Nrc3VtOworCXU4IHBhc3NfZXJyOworCXU4IHBhc3NfY2tlcnI7CisJdTggc3RyaXBfY3JjOworCXU4IG1jYXN0X2VuOworCXU4IGJjYXN0X2VuOworCXU4IG1jYXN0X3Byb21pc2N1b3VzX2VuOworCXU4IHVuaWNhc3RfZW47CisJdTggdmxhbl9wcm9taXNjdW91czsKK30gX19wYWNrZWQ7CisKK3VuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzI0Ml9QQVJBTVMgeworCXN0cnVjdCBOVFdLX1JYX0ZJTFRFUl9TRVRUSU5HUyByZXF1ZXN0OworCXN0cnVjdCBOVFdLX1JYX0ZJTFRFUl9TRVRUSU5HUyByZXNwb25zZTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiAgVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gbW9kaWZ5IHRoZSBldGhlcm5ldCByZWNlaXZlIGZpbHRlciBjb25maWd1cmF0aW9uLgorICogIE9ubHkgZG9tYWluIDAgIG5ldHdvcmsgZnVuY3Rpb24gZHJpdmVycyBtYXkgaXNzdWUgdGhpcyBjb21tYW5kLiBUaGUKKyAqICBhcHBsaWVkIGNvbmZpZ3VyYXRpb24gaXMgcmV0dXJuZWQgaW4gIHRoZSByZXNwb25zZSBwYXlsb2FkLiBOb3RlOgorICogIFNvbWUgcmVjZWl2ZSBwYWNrZXQgZmlsdGVyIHNldHRpbmdzIGFyZSBnbG9iYWwgb24gIEJsYWRlRW5naW5lIGFuZAorICogIGNhbiBhZmZlY3QgYm90aCB0aGUgc3RvcmFnZSBhbmQgbmV0d29yayBmdW5jdGlvbiBjbGllbnRzIHRoYXQgdGhlCisgKiAgIEJsYWRlRW5naW5lIGhhcmR3YXJlIGFuZCBmaXJtd2FyZSBzZXJ2ZS4gQWRkaXRpb25hbHksIGRlcGVuZGluZworICogIG9uIHRoZSByZXZpc2lvbiBvZiAgQmxhZGVFbmdpbmUsIHNvbWUgZXRoZXJuZXQgcmVjZWl2ZSBmaWx0ZXIgc2V0dGluZ3MKKyAqICBhcmUgZGVwZW5kZW50IG9uIG90aGVycy4gSWYgYSAgZGVwZW5kZW5jeSBleGlzdHMgYmV0d2VlbiBzZXR0aW5ncworICogIGZvciB0aGUgQmxhZGVFbmdpbmUgcmV2aXNpb24sIGFuZCB0aGUgY29tbWFuZCByZXF1ZXN0ICBzZXR0aW5ncyBkbworICogIG5vdCBtZWV0IHRoZSBkZXBlbmRlbmN5IHJlcXVpcmVtZW50LCB0aGUgaW52YWxpZCBzZXR0aW5ncyB3aWxsIG5vdAorICogIGJlICBhcHBsaWVkIGRlc3BpdGUgdGhlIGNvbWFuZCBzdWNjZWVkaW5nLiBGb3IgZXhhbXBsZTogYSBkcml2ZXIgbWF5CisgKiAgcmVxdWVzdCB0byBlbmFibGUgIGJyb2FkY2FzdCBwYWNrZXRzLCBidXQgbm90IGVuYWJsZSBtdWx0aWNhc3QgcGFja2V0cy4KKyAqICBPbiBlYXJseSByZXZpc2lvbnMgb2YgQmxhZGVFbmdpbmUsICB0aGVyZSBtYXkgYmUgbm8gZGlzdGluY3Rpb24gYmV0d2VlbgorICogIGJyb2FkY2FzdCBhbmQgbXVsdGljYXN0IGZpbHRlcnMsIHNvIGJyb2FkY2FzdCBjb3VsZCAgbm90IGJlIGVuYWJsZWQKKyAqICB3aXRob3V0IGVuYWJsaW5nIG11bHRpY2FzdC4gSW4gdGhpcyBzY2VuYXJpbywgdGhlIGNvbWFuZCB3b3VsZCBzdGlsbAorICogICBzdWNjZWVkLCBidXQgdGhlIHJlc3BvbnNlIHBheWxvYWQgd291bGQgaW5kaWNhdGUgdGhlIHByZXZpb3VzbHkKKyAqICBjb25maWd1cmVkIGJyb2FkY2FzdCAgYW5kIG11bHRpY2FzdCBzZXR0aW5nLgorICovCitzdHJ1Y3QgRldDTURfQ09NTU9OX05UV0tfUlhfRklMVEVSIHsKKwl1bmlvbiBGV0NNRF9IRUFERVIgaGVhZGVyOworCXVuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzI0Ml9QQVJBTVMgcGFyYW1zOworfSBfX3BhY2tlZDsKKworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjQ0X1JFUVVFU1QgeworCXUzMiByc3ZkMDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fR0VUX0ZXX1ZFUlNJT05fUkVTUE9OU0VfUEFZTE9BRCB7CisJdTggZmlybXdhcmVfdmVyc2lvbl9zdHJpbmdbMzJdOworCXU4IGZ3X29uX2ZsYXNoX3ZlcnNpb25fc3RyaW5nWzMyXTsKK30gX19wYWNrZWQ7CisKK3VuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzI0M19QQVJBTVMgeworCXN0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yNDRfUkVRVUVTVCByZXF1ZXN0OworCXN0cnVjdCBGV0NNRF9DT01NT05fR0VUX0ZXX1ZFUlNJT05fUkVTUE9OU0VfUEFZTE9BRCByZXNwb25zZTsKK30gX19wYWNrZWQ7CisKKy8qIFRoaXMgY29tYW5kIHJldHJpZXZlcyB0aGUgZmlybXdhcmUgdmVyc2lvbi4gICovCitzdHJ1Y3QgRldDTURfQ09NTU9OX0dFVF9GV19WRVJTSU9OIHsKKwl1bmlvbiBGV0NNRF9IRUFERVIgaGVhZGVyOworCXVuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzI0M19QQVJBTVMgcGFyYW1zOworfSBfX3BhY2tlZDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzI0Nl9SRVFVRVNUIHsKKwl1MTYgdHhfZmxvd19jb250cm9sOworCXUxNiByeF9mbG93X2NvbnRyb2w7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjQ3X1JFU1BPTlNFIHsKKwl1MzIgcnN2ZDA7Cit9IF9fcGFja2VkOworCit1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8yNDVfUEFSQU1TIHsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjQ2X1JFUVVFU1QgcmVxdWVzdDsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjQ3X1JFU1BPTlNFIHJlc3BvbnNlOworfSBfX3BhY2tlZDsKKworLyoKKyAqICBUaGlzIGNvbWFuZCBpcyB1c2VkIHRvIHByb2dyYW0gQmxhZGVFbmdpbmUgZmxvdyBjb250cm9sIGJlaGF2aW9yLgorICogIE9ubHkgdGhlIGhvc3QgIG5ldHdvcmtpbmcgZHJpdmVyIGlzIGFsbG93ZWQgdG8gdXNlIHRoaXMgY29tYW5kLgorICovCitzdHJ1Y3QgRldDTURfQ09NTU9OX1NFVF9GTE9XX0NPTlRST0wgeworCXVuaW9uIEZXQ01EX0hFQURFUiBoZWFkZXI7CisJdW5pb24gRldDTURfQ09NTU9OX0FOT05fMjQ1X1BBUkFNUyBwYXJhbXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjQ5X1JFUVVFU1QgeworCXUzMiByc3ZkMDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yNTBfUkVTUE9OU0UgeworCXUxNiB0eF9mbG93X2NvbnRyb2w7CisJdTE2IHJ4X2Zsb3dfY29udHJvbDsKK30gX19wYWNrZWQ7CisKK3VuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzI0OF9QQVJBTVMgeworCXN0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yNDlfUkVRVUVTVCByZXF1ZXN0OworCXN0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yNTBfUkVTUE9OU0UgcmVzcG9uc2U7Cit9IF9fcGFja2VkOworCisvKiBUaGlzIGNvbWFuZCBpcyB1c2VkIHRvIHJlYWQgQmxhZGVFbmdpbmUgZmxvdyBjb250cm9sIHNldHRpbmdzLiAgKi8KK3N0cnVjdCBGV0NNRF9DT01NT05fR0VUX0ZMT1dfQ09OVFJPTCB7CisJdW5pb24gRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8yNDhfUEFSQU1TIHBhcmFtczsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBFUV9ERUxBWV9QQVJBTVMgeworCXUzMiBlcV9pZDsKKwl1MzIgZGVsYXlfaW5fbWljcm9zZWNvbmRzOworfSBfX3BhY2tlZDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzI1N19SRVFVRVNUIHsKKwl1MzIgbnVtX2VxOworCXUzMiByc3ZkMDsKKwlzdHJ1Y3QgRVFfREVMQVlfUEFSQU1TIGRlbGF5WzE2XTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yNThfUkVTUE9OU0UgeworCXUzMiBkZWxheV9yZXNvbHV0aW9uX2luX21pY3Jvc2Vjb25kczsKKwl1MzIgZGVsYXlfbWF4X2luX21pY3Jvc2Vjb25kczsKK30gX19wYWNrZWQ7CisKK3VuaW9uIE1PRElGWV9FUV9ERUxBWV9QQVJBTVMgeworCXN0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yNTdfUkVRVUVTVCByZXF1ZXN0OworCXN0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yNThfUkVTUE9OU0UgcmVzcG9uc2U7Cit9IF9fcGFja2VkOworCisvKiBUaGlzIGNvbWFuZCBjaGFuZ2VzIHRoZSBFUSBkZWxheSBmb3IgYSBnaXZlbiBzZXQgb2YgRVFzLiAgKi8KK3N0cnVjdCBGV0NNRF9DT01NT05fTU9ESUZZX0VRX0RFTEFZIHsKKwl1bmlvbiBGV0NNRF9IRUFERVIgaGVhZGVyOworCXVuaW9uIE1PRElGWV9FUV9ERUxBWV9QQVJBTVMgcGFyYW1zOworfSBfX3BhY2tlZDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzI2MF9SRVFVRVNUIHsKKwl1MzIgcnN2ZDA7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgQkVfRklSTVdBUkVfQ09ORklHIHsKKwl1MTYgYmVfY29uZmlnX251bWJlcjsKKwl1MTYgYXNpY19yZXZpc2lvbjsKKwl1MzIgbmljX3VscF9tYXNrOworCXUzMiB0dWxwX21hc2s7CisJdTMyIGlzY3NpX3VscF9tYXNrOworCXUzMiByZG1hX3VscF9tYXNrOworCXUzMiByc3ZkMFs0XTsKKwl1MzIgZXRoX3R4X2lkX3N0YXJ0OworCXUzMiBldGhfdHhfaWRfY291bnQ7CisJdTMyIGV0aF9yeF9pZF9zdGFydDsKKwl1MzIgZXRoX3J4X2lkX2NvdW50OworCXUzMiB0cG1fd3JicV9pZF9zdGFydDsKKwl1MzIgdHBtX3dyYnFfaWRfY291bnQ7CisJdTMyIHRwbV9kZWZxX2lkX3N0YXJ0OworCXUzMiB0cG1fZGVmcV9pZF9jb3VudDsKKwl1MzIgaXNjc2lfd3JicV9pZF9zdGFydDsKKwl1MzIgaXNjc2lfd3JicV9pZF9jb3VudDsKKwl1MzIgaXNjc2lfZGVmcV9pZF9zdGFydDsKKwl1MzIgaXNjc2lfZGVmcV9pZF9jb3VudDsKKwl1MzIgcmRtYV9xcF9pZF9zdGFydDsKKwl1MzIgcmRtYV9xcF9pZF9jb3VudDsKKwl1MzIgcnN2ZDFbOF07Cit9IF9fcGFja2VkOworCit1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8yNTlfUEFSQU1TIHsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjYwX1JFUVVFU1QgcmVxdWVzdDsKKwlzdHJ1Y3QgQkVfRklSTVdBUkVfQ09ORklHIHJlc3BvbnNlOworfSBfX3BhY2tlZDsKKworLyoKKyAqICBUaGlzIGNvbWFuZCBxdWVyaWVzIHRoZSBjdXJyZW50IGZpcm13YXJlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KKyAqICAgVGhlIHN0YXRpYyAgY29uZmlndXJhdGlvbiB0eXBlIGlzIGRlZmluZWQgYnkgYmVfY29uZmlnX251bWJlci4gVGhpcworICogIGRpZmZlcmVudGlhdGVzIGRpZmZlcmVudCAgQmxhZGVFbmdpbmUgYnVpbGRzLCBzdWNoIGFzIGlTQ1NJIEluaXRpYXRvcgorICogIHZlcnN1cyBpU0NTSSBUYXJnZXQuICBGb3IgYSBnaXZlbiBzdGF0aWMgIGNvbmZpZ3VyYXRpb24sIHRoZSBVcHBlcgorICogIExheWVyIFByb3RvY29sIChVTFApIHByb2Nlc3NvcnMgbWF5IGJlIHJlY29uZmlndXJlZCB0byBzdXBwb3J0ICBkaWZmZXJlbnQKKyAqICBwcm90b2NvbHMuIEVhY2ggVUxQIHByb2Nlc3NvciBzdXBwb3J0cyBvbmUgb3IgbW9yZSBwcm90b2NvbHMuIFRoZQorICogIG1hc2tzICBpbmRpY2F0ZSB3aGljaCBwcm9jZXNzb3JzIGFyZSBjb25maWd1cmVkIGZvciBlYWNoIHByb3RvY29sLgorICogICBGb3IgYSBnaXZlbiBzdGF0aWMgIGNvbmZpZ3VyYXRpb24sIHRoZSBudW1iZXIgb2YgVENQIGNvbm5lY3Rpb25zCisgKiAgc3VwcG9ydGVkIGZvciBlYWNoIHByb3RvY29sIG1heSB2YXJ5LiBUaGUgICpfaWRfc3RhcnQgYW5kICpfaWRfY291bnQKKyAqICB2YXJpYWJsZXMgZGVmaW5lIGEgbGluZWFyIHJhbmdlIG9mIElEcyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yICBlYWNoCisgKiAgc3VwcG9ydGVkIHByb3RvY29sLiBUaGUgKl9pZF9jb3VudCBtYXkgYmUgdXNlZCBieSB0aGUgZHJpdmVyIHRvIGFsbG9jYXRlCisgKiAgdGhlICBhcHByb3ByaWF0ZSBudW1iZXIgb2YgY29ubmVjdGlvbiByZXNvdXJjZXMuIFRoZSAqX2lkX3N0YXJ0IG1heQorICogIGJlIHVzZWQgdG8gbWFwIHRoZSAgYXJiaXRyYXJ5IHJhbmdlIG9mIElEcyB0byBhIHplcm8tYmFzZWQgcmFuZ2UKKyAqICBvZiBpbmRpY2VzLgorICovCitzdHJ1Y3QgRldDTURfQ09NTU9OX0ZJUk1XQVJFX0NPTkZJRyB7CisJdW5pb24gRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8yNTlfUEFSQU1TIHBhcmFtczsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fUE9SVF9FUVVBTElaQVRJT05fUEFSQU1TIHsKKwl1MzIgZW1waF9sZXZfc2VsX3BvcnQwOworCXUzMiBlbXBoX2xldl9zZWxfcG9ydDE7CisJdTggeGF1aV92b19zZWw7CisJdTggeGF1aV9zdGF0ZTsKKwl1MTYgcnN2ZDA7CisJdTMyIHhhdWlfZXFfdmVjdG9yOworfSBfX3BhY2tlZDsKKworc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzI2Ml9SRVFVRVNUIHsKKwl1MzIgcnN2ZDA7Cit9IF9fcGFja2VkOworCit1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8yNjFfUEFSQU1TIHsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0FOT05fMjYyX1JFUVVFU1QgcmVxdWVzdDsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX1BPUlRfRVFVQUxJWkFUSU9OX1BBUkFNUyByZXNwb25zZTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiAgVGhpcyBjb21hbmQgY2FuIGJlIHVzZWQgdG8gcmVhZCBYQVVJIGVxdWFsaXphdGlvbiBwYXJhbWV0ZXJzLiBUaGUKKyAqICBBUk0gZmlybXdhcmUgYXBwbGllcyAgZGVmYXVsdCBlcXVhbGl6YXRpb24gcGFyYW1ldGVycyBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCisgKiAgVGhlc2UgcGFyYW1ldGVycyBtYXkgYmUgIGN1c3RvbWVyLXNwZWNpZmljIHdoZW4gZGVyaXZlZCBmcm9tIHRoZQorICogIFNFRVBST00uIFNlZSBTRUVQUk9NX0RBVEEgZm9yIGVxdWFsaXphdGlvbiAgc3BlY2lmaWMgZmllbGRzLgorICovCitzdHJ1Y3QgRldDTURfQ09NTU9OX0dFVF9QT1JUX0VRVUFMSVpBVElPTiB7CisJdW5pb24gRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBGV0NNRF9DT01NT05fQU5PTl8yNjFfUEFSQU1TIHBhcmFtczsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9DT01NT05fQU5PTl8yNjRfUkVTUE9OU0UgeworCXUzMiByc3ZkMDsKK30gX19wYWNrZWQ7CisKK3VuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzI2M19QQVJBTVMgeworCXN0cnVjdCBGV0NNRF9DT01NT05fUE9SVF9FUVVBTElaQVRJT05fUEFSQU1TIHJlcXVlc3Q7CisJc3RydWN0IEZXQ01EX0NPTU1PTl9BTk9OXzI2NF9SRVNQT05TRSByZXNwb25zZTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiAgVGhpcyBjb21hbmQgY2FuIGJlIHVzZWQgdG8gc2V0IFhBVUkgZXF1YWxpemF0aW9uIHBhcmFtZXRlcnMuIFRoZSBBUk0KKyAqICBmaXJtd2FyZSBhcHBsaWVzICBkZWZhdWx0IGVxdWFsaXphdGlvbiBwYXJhbWV0ZXJzIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKyAqICBUaGVzZSBwYXJhbWV0ZXJzIG1heSBiZSAgY3VzdG9tZXItc3BlY2lmaWMgd2hlbiBkZXJpdmVkIGZyb20gdGhlCisgKiAgU0VFUFJPTS4gU2VlIFNFRVBST01fREFUQSBmb3IgZXF1YWxpemF0aW9uICBzcGVjaWZpYyBmaWVsZHMuCisgKi8KK3N0cnVjdCBGV0NNRF9DT01NT05fU0VUX1BPUlRfRVFVQUxJWkFUSU9OIHsKKwl1bmlvbiBGV0NNRF9IRUFERVIgaGVhZGVyOworCXVuaW9uIEZXQ01EX0NPTU1PTl9BTk9OXzI2M19QQVJBTVMgcGFyYW1zOworfSBfX3BhY2tlZDsKKworI2VuZGlmIC8qIF9fZndjbWRfY29tbW9uX2JtYXBfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZndjbWRfZXRoX2JtYXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9md2NtZF9ldGhfYm1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNGIxNzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZndjbWRfZXRoX2JtYXAuaApAQCAtMCwwICsxLDI4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworLyoKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgc3JjZ2VuIHZlcnNpb246IDAxMjcKKyAqLworI2lmbmRlZiBfX2Z3Y21kX2V0aF9ibWFwX2hfXworI2RlZmluZSBfX2Z3Y21kX2V0aF9ibWFwX2hfXworI2luY2x1ZGUgImZ3Y21kX2hkcl9ibWFwLmgiCisjaW5jbHVkZSAiZndjbWRfdHlwZXNfYm1hcC5oIgorCitzdHJ1Y3QgTUlCX0VUSF9TVEFUSVNUSUNTX1BBUkFNU19JTiB7CisJdTMyIHJzdmQwOworfSBfX3BhY2tlZDsKKworc3RydWN0IEJFX1JYRl9TVEFUUyB7CisJdTMyIHAwcmVjdmR0b3RhbGJ5dGVzTFNEOwkvKiBEV09SRCAwICovCisJdTMyIHAwcmVjdmR0b3RhbGJ5dGVzTVNEOwkvKiBEV09SRCAxICovCisJdTMyIHAwcmVjdmR0b3RhbGZyYW1lczsJLyogRFdPUkQgMiAqLworCXUzMiBwMHJlY3ZkdW5pY2FzdGZyYW1lczsJLyogRFdPUkQgMyAqLworCXUzMiBwMHJlY3ZkbXVsdGljYXN0ZnJhbWVzOwkvKiBEV09SRCA0ICovCisJdTMyIHAwcmVjdmRicm9hZGNhc3RmcmFtZXM7CS8qIERXT1JEIDUgKi8KKwl1MzIgcDBjcmNlcnJvcnM7CS8qIERXT1JEIDYgKi8KKwl1MzIgcDBhbGlnbm1lbnRzeW1lcnJzOwkvKiBEV09SRCA3ICovCisJdTMyIHAwcGF1c2VmcmFtZXNyZWN2ZDsJLyogRFdPUkQgOCAqLworCXUzMiBwMGNvbnRyb2xmcmFtZXNyZWN2ZDsJLyogRFdPUkQgOSAqLworCXUzMiBwMGlucmFuZ2VsZW5lcnJvcnM7CS8qIERXT1JEIDEwICovCisJdTMyIHAwb3V0cmFuZ2VlcnJvcnM7CS8qIERXT1JEIDExICovCisJdTMyIHAwZnJhbWV0b29sb25nZXJyb3JzOwkvKiBEV09SRCAxMiAqLworCXUzMiBwMGRyb3BwZWRhZGRyZXNzbWF0Y2g7CS8qIERXT1JEIDEzICovCisJdTMyIHAwZHJvcHBlZHZsYW5taXNtYXRjaDsJLyogRFdPUkQgMTQgKi8KKwl1MzIgcDBpcGRyb3BwZWR0b29zbWFsbDsJLyogRFdPUkQgMTUgKi8KKwl1MzIgcDBpcGRyb3BwZWR0b29zaG9ydDsJLyogRFdPUkQgMTYgKi8KKwl1MzIgcDBpcGRyb3BwZWRoZHJ0b29zbWFsbDsJLyogRFdPUkQgMTcgKi8KKwl1MzIgcDB0Y3Bkcm9wcGVkbGVuOwkvKiBEV09SRCAxOCAqLworCXUzMiBwMGRyb3BwZWRydW50OwkvKiBEV09SRCAxOSAqLworCXUzMiBwMHJlY3ZkNjQ7CQkvKiBEV09SRCAyMCAqLworCXUzMiBwMHJlY3ZkNjVfMTI3OwkvKiBEV09SRCAyMSAqLworCXUzMiBwMHJlY3ZkMTI4XzI1NjsJLyogRFdPUkQgMjIgKi8KKwl1MzIgcDByZWN2ZDI1Nl81MTE7CS8qIERXT1JEIDIzICovCisJdTMyIHAwcmVjdmQ1MTJfMTAyMzsJLyogRFdPUkQgMjQgKi8KKwl1MzIgcDByZWN2ZDE1MThfMTUyMjsJLyogRFdPUkQgMjUgKi8KKwl1MzIgcDByZWN2ZDE1MjJfMjA0NzsJLyogRFdPUkQgMjYgKi8KKwl1MzIgcDByZWN2ZDIwNDhfNDA5NTsJLyogRFdPUkQgMjcgKi8KKwl1MzIgcDByZWN2ZDQwOTZfODE5MTsJLyogRFdPUkQgMjggKi8KKwl1MzIgcDByZWN2ZDgxOTJfOTIxNjsJLyogRFdPUkQgMjkgKi8KKwl1MzIgcDByY3ZkaXBja3NtZXJyczsJLyogRFdPUkQgMzAgKi8KKwl1MzIgcDByZWN2ZHRjcGNrc21lcnJzOwkvKiBEV09SRCAzMSAqLworCXUzMiBwMHJlY3ZkdWRwY2tzbWVycnM7CS8qIERXT1JEIDMyICovCisJdTMyIHAwcmVjdmRub25yc3NwYWNrZXRzOwkvKiBEV09SRCAzMyAqLworCXUzMiBwMHJlY3ZkaXBwYWNrZXRzOwkvKiBEV09SRCAzNCAqLworCXUzMiBwMHJlY3ZkY2h1dGUxcGFja2V0czsJLyogRFdPUkQgMzUgKi8KKwl1MzIgcDByZWN2ZGNodXRlMnBhY2tldHM7CS8qIERXT1JEIDM2ICovCisJdTMyIHAwcmVjdmRjaHV0ZTNwYWNrZXRzOwkvKiBEV09SRCAzNyAqLworCXUzMiBwMHJlY3ZkaXBzZWNwYWNrZXRzOwkvKiBEV09SRCAzOCAqLworCXUzMiBwMHJlY3ZkbWFuYWdlbWVudHBhY2tldHM7CS8qIERXT1JEIDM5ICovCisJdTMyIHAweG1pdGJ5dGVzbHNkOwkvKiBEV09SRCA0MCAqLworCXUzMiBwMHhtaXRieXRlc21zZDsJLyogRFdPUkQgNDEgKi8KKwl1MzIgcDB4bWl0dW5pY2FzdGZyYW1lczsJLyogRFdPUkQgNDIgKi8KKwl1MzIgcDB4bWl0bXVsdGljYXN0ZnJhbWVzOwkvKiBEV09SRCA0MyAqLworCXUzMiBwMHhtaXRicm9hZGNhc3RmcmFtZXM7CS8qIERXT1JEIDQ0ICovCisJdTMyIHAweG1pdHBhdXNlZnJhbWVzOwkvKiBEV09SRCA0NSAqLworCXUzMiBwMHhtaXRjb250cm9sZnJhbWVzOwkvKiBEV09SRCA0NiAqLworCXUzMiBwMHhtaXQ2NDsJCS8qIERXT1JEIDQ3ICovCisJdTMyIHAweG1pdDY1XzEyNzsJLyogRFdPUkQgNDggKi8KKwl1MzIgcDB4bWl0MTI4XzI1NjsJLyogRFdPUkQgNDkgKi8KKwl1MzIgcDB4bWl0MjU2XzUxMTsJLyogRFdPUkQgNTAgKi8KKwl1MzIgcDB4bWl0NTEyXzEwMjM7CS8qIERXT1JEIDUxICovCisJdTMyIHAweG1pdDE1MThfMTUyMjsJLyogRFdPUkQgNTIgKi8KKwl1MzIgcDB4bWl0MTUyMl8yMDQ3OwkvKiBEV09SRCA1MyAqLworCXUzMiBwMHhtaXQyMDQ4XzQwOTU7CS8qIERXT1JEIDU0ICovCisJdTMyIHAweG1pdDQwOTZfODE5MTsJLyogRFdPUkQgNTUgKi8KKwl1MzIgcDB4bWl0ODE5Ml85MjE2OwkvKiBEV09SRCA1NiAqLworCXUzMiBwMHJ4Zmlmb292ZXJmbG93ZHJvcHBlZDsJLyogRFdPUkQgNTcgKi8KKwl1MzIgcDBpcHNlY2xvb2t1cGZhaWxlZGRyb3BwZWQ7CS8qIERXT1JEIDU4ICovCisJdTMyIHAxcmVjdmR0b3RhbGJ5dGVzTFNEOwkvKiBEV09SRCA1OSAqLworCXUzMiBwMXJlY3ZkdG90YWxieXRlc01TRDsJLyogRFdPUkQgNjAgKi8KKwl1MzIgcDFyZWN2ZHRvdGFsZnJhbWVzOwkvKiBEV09SRCA2MSAqLworCXUzMiBwMXJlY3ZkdW5pY2FzdGZyYW1lczsJLyogRFdPUkQgNjIgKi8KKwl1MzIgcDFyZWN2ZG11bHRpY2FzdGZyYW1lczsJLyogRFdPUkQgNjMgKi8KKwl1MzIgcDFyZWN2ZGJyb2FkY2FzdGZyYW1lczsJLyogRFdPUkQgNjQgKi8KKwl1MzIgcDFjcmNlcnJvcnM7CS8qIERXT1JEIDY1ICovCisJdTMyIHAxYWxpZ25tZW50c3ltZXJyczsJLyogRFdPUkQgNjYgKi8KKwl1MzIgcDFwYXVzZWZyYW1lc3JlY3ZkOwkvKiBEV09SRCA2NyAqLworCXUzMiBwMWNvbnRyb2xmcmFtZXNyZWN2ZDsJLyogRFdPUkQgNjggKi8KKwl1MzIgcDFpbnJhbmdlbGVuZXJyb3JzOwkvKiBEV09SRCA2OSAqLworCXUzMiBwMW91dHJhbmdlZXJyb3JzOwkvKiBEV09SRCA3MCAqLworCXUzMiBwMWZyYW1ldG9vbG9uZ2Vycm9yczsJLyogRFdPUkQgNzEgKi8KKwl1MzIgcDFkcm9wcGVkYWRkcmVzc21hdGNoOwkvKiBEV09SRCA3MiAqLworCXUzMiBwMWRyb3BwZWR2bGFubWlzbWF0Y2g7CS8qIERXT1JEIDczICovCisJdTMyIHAxaXBkcm9wcGVkdG9vc21hbGw7CS8qIERXT1JEIDc0ICovCisJdTMyIHAxaXBkcm9wcGVkdG9vc2hvcnQ7CS8qIERXT1JEIDc1ICovCisJdTMyIHAxaXBkcm9wcGVkaGRydG9vc21hbGw7CS8qIERXT1JEIDc2ICovCisJdTMyIHAxdGNwZHJvcHBlZGxlbjsJLyogRFdPUkQgNzcgKi8KKwl1MzIgcDFkcm9wcGVkcnVudDsJLyogRFdPUkQgNzggKi8KKwl1MzIgcDFyZWN2ZDY0OwkJLyogRFdPUkQgNzkgKi8KKwl1MzIgcDFyZWN2ZDY1XzEyNzsJLyogRFdPUkQgODAgKi8KKwl1MzIgcDFyZWN2ZDEyOF8yNTY7CS8qIERXT1JEIDgxICovCisJdTMyIHAxcmVjdmQyNTZfNTExOwkvKiBEV09SRCA4MiAqLworCXUzMiBwMXJlY3ZkNTEyXzEwMjM7CS8qIERXT1JEIDgzICovCisJdTMyIHAxcmVjdmQxNTE4XzE1MjI7CS8qIERXT1JEIDg0ICovCisJdTMyIHAxcmVjdmQxNTIyXzIwNDc7CS8qIERXT1JEIDg1ICovCisJdTMyIHAxcmVjdmQyMDQ4XzQwOTU7CS8qIERXT1JEIDg2ICovCisJdTMyIHAxcmVjdmQ0MDk2XzgxOTE7CS8qIERXT1JEIDg3ICovCisJdTMyIHAxcmVjdmQ4MTkyXzkyMTY7CS8qIERXT1JEIDg4ICovCisJdTMyIHAxcmN2ZGlwY2tzbWVycnM7CS8qIERXT1JEIDg5ICovCisJdTMyIHAxcmVjdmR0Y3Bja3NtZXJyczsJLyogRFdPUkQgOTAgKi8KKwl1MzIgcDFyZWN2ZHVkcGNrc21lcnJzOwkvKiBEV09SRCA5MSAqLworCXUzMiBwMXJlY3Zkbm9ucnNzcGFja2V0czsJLyogRFdPUkQgOTIgKi8KKwl1MzIgcDFyZWN2ZGlwcGFja2V0czsJLyogRFdPUkQgOTMgKi8KKwl1MzIgcDFyZWN2ZGNodXRlMXBhY2tldHM7CS8qIERXT1JEIDk0ICovCisJdTMyIHAxcmVjdmRjaHV0ZTJwYWNrZXRzOwkvKiBEV09SRCA5NSAqLworCXUzMiBwMXJlY3ZkY2h1dGUzcGFja2V0czsJLyogRFdPUkQgOTYgKi8KKwl1MzIgcDFyZWN2ZGlwc2VjcGFja2V0czsJLyogRFdPUkQgOTcgKi8KKwl1MzIgcDFyZWN2ZG1hbmFnZW1lbnRwYWNrZXRzOwkvKiBEV09SRCA5OCAqLworCXUzMiBwMXhtaXRieXRlc2xzZDsJLyogRFdPUkQgOTkgKi8KKwl1MzIgcDF4bWl0Ynl0ZXNtc2Q7CS8qIERXT1JEIDEwMCAqLworCXUzMiBwMXhtaXR1bmljYXN0ZnJhbWVzOwkvKiBEV09SRCAxMDEgKi8KKwl1MzIgcDF4bWl0bXVsdGljYXN0ZnJhbWVzOwkvKiBEV09SRCAxMDIgKi8KKwl1MzIgcDF4bWl0YnJvYWRjYXN0ZnJhbWVzOwkvKiBEV09SRCAxMDMgKi8KKwl1MzIgcDF4bWl0cGF1c2VmcmFtZXM7CS8qIERXT1JEIDEwNCAqLworCXUzMiBwMXhtaXRjb250cm9sZnJhbWVzOwkvKiBEV09SRCAxMDUgKi8KKwl1MzIgcDF4bWl0NjQ7CQkvKiBEV09SRCAxMDYgKi8KKwl1MzIgcDF4bWl0NjVfMTI3OwkvKiBEV09SRCAxMDcgKi8KKwl1MzIgcDF4bWl0MTI4XzI1NjsJLyogRFdPUkQgMTA4ICovCisJdTMyIHAxeG1pdDI1Nl81MTE7CS8qIERXT1JEIDEwOSAqLworCXUzMiBwMXhtaXQ1MTJfMTAyMzsJLyogRFdPUkQgMTEwICovCisJdTMyIHAxeG1pdDE1MThfMTUyMjsJLyogRFdPUkQgMTExICovCisJdTMyIHAxeG1pdDE1MjJfMjA0NzsJLyogRFdPUkQgMTEyICovCisJdTMyIHAxeG1pdDIwNDhfNDA5NTsJLyogRFdPUkQgMTEzICovCisJdTMyIHAxeG1pdDQwOTZfODE5MTsJLyogRFdPUkQgMTE0ICovCisJdTMyIHAxeG1pdDgxOTJfOTIxNjsJLyogRFdPUkQgMTE1ICovCisJdTMyIHAxcnhmaWZvb3ZlcmZsb3dkcm9wcGVkOwkvKiBEV09SRCAxMTYgKi8KKwl1MzIgcDFpcHNlY2xvb2t1cGZhaWxlZGRyb3BwZWQ7CS8qIERXT1JEIDExNyAqLworCXUzMiBweGRyb3BwZWRub3BidWY7CS8qIERXT1JEIDExOCAqLworCXUzMiBweGRyb3BwZWRub3R4cGI7CS8qIERXT1JEIDExOSAqLworCXUzMiBweGRyb3BwZWRub2lwc2VjYnVmOwkvKiBEV09SRCAxMjAgKi8KKwl1MzIgcHhkcm9wcGVkbm9lcnhkZXNjcjsJLyogRFdPUkQgMTIxICovCisJdTMyIHB4ZHJvcHBlZG5vdHByZWRlc2NyOwkvKiBEV09SRCAxMjIgKi8KKwl1MzIgcHhyZWN2ZG1hbmFnZW1lbnRwb3J0cGFja2V0czsJLyogRFdPUkQgMTIzICovCisJdTMyIHB4cmVjdmRtYW5hZ2VtZW50cG9ydGJ5dGVzOwkvKiBEV09SRCAxMjQgKi8KKwl1MzIgcHhyZWN2ZG1hbmFnZW1lbnRwb3J0cGF1c2VmcmFtZXM7CS8qIERXT1JEIDEyNSAqLworCXUzMiBweHJlY3ZkbWFuYWdlbWVudHBvcnRlcnJvcnM7CS8qIERXT1JEIDEyNiAqLworCXUzMiBweHhtaXRtYW5hZ2VtZW50cG9ydHBhY2tldHM7CS8qIERXT1JEIDEyNyAqLworCXUzMiBweHhtaXRtYW5hZ2VtZW50cG9ydGJ5dGVzOwkvKiBEV09SRCAxMjggKi8KKwl1MzIgcHh4bWl0bWFuYWdlbWVudHBvcnRwYXVzZTsJLyogRFdPUkQgMTI5ICovCisJdTMyIHB4eG1pdG1hbmFnZW1lbnRwb3J0cnhmaWZvb3ZlcmZsb3c7CS8qIERXT1JEIDEzMCAqLworCXUzMiBweHJlY3ZkaXBzZWNpcGNrc21lcnJzOwkvKiBEV09SRCAxMzEgKi8KKwl1MzIgcHhyZWN2ZHRjcHNlY2lwY2tzbWVycnM7CS8qIERXT1JEIDEzMiAqLworCXUzMiBweHJlY3ZkdWRwc2VjaXBja3NtZXJyczsJLyogRFdPUkQgMTMzICovCisJdTMyIHB4aXBzZWNydW50OwkvKiBEV09SRCAxMzQgKi8KKwl1MzIgcHhpcHNlY2FkZHJlc3NtaXNtYXRjaGRyb3BwZWQ7CS8qIERXT1JEIDEzNSAqLworCXUzMiBweGlwc2VjcnhmaWZvb3ZlcmZsb3dkcm9wcGVkOwkvKiBEV09SRCAxMzYgKi8KKwl1MzIgcHhpcHNlY2ZyYW1lc3Rvb2xvbmc7CS8qIERXT1JEIDEzNyAqLworCXUzMiBweGlwc2VjdG90YWxpcGZyYW1lczsJLyogRFdPUkQgMTM4ICovCisJdTMyIHB4aXBzZWNpcHRvb3NtYWxsOwkvKiBEV09SRCAxMzkgKi8KKwl1MzIgcHhpcHNlY2lwdG9vc2hvcnQ7CS8qIERXT1JEIDE0MCAqLworCXUzMiBweGlwc2VjaXBoZHJ0b29zbWFsbDsJLyogRFdPUkQgMTQxICovCisJdTMyIHB4aXBzZWN0Y3BoZHJiYWQ7CS8qIERXT1JEIDE0MiAqLworCXUzMiBweHJlY3ZkaXBzZWNjaHV0ZTE7CS8qIERXT1JEIDE0MyAqLworCXUzMiBweHJlY3ZkaXBzZWNjaHV0ZTI7CS8qIERXT1JEIDE0NCAqLworCXUzMiBweHJlY3ZkaXBzZWNjaHV0ZTM7CS8qIERXT1JEIDE0NSAqLworCXUzMiBweGRyb3BwZWQ3ZnJhZ3M7CS8qIERXT1JEIDE0NiAqLworCXUzMiBweGRyb3BwZWRmcmFnczsJLyogRFdPUkQgMTQ3ICovCisJdTMyIHB4ZHJvcHBlZGludmFsaWRmcmFncmluZzsJLyogRFdPUkQgMTQ4ICovCisJdTMyIHB4bnVtZm9yd2FyZGVkcGFja2V0czsJLyogRFdPUkQgMTQ5ICovCit9IF9fcGFja2VkOworCit1bmlvbiBNSUJfRVRIX1NUQVRJU1RJQ1NfUEFSQU1TIHsKKwlzdHJ1Y3QgTUlCX0VUSF9TVEFUSVNUSUNTX1BBUkFNU19JTiByZXF1ZXN0OworCXN0cnVjdCBCRV9SWEZfU1RBVFMgcmVzcG9uc2U7Cit9IF9fcGFja2VkOworCisvKgorICogIFF1ZXJ5IGV0aGVybmV0IHN0YXRpc3RpY3MuIEFsbCBkb21haW5zIG1heSBpc3N1ZSB0aGlzIGNvbW1hbmQuIFRoZQorICogIGhvc3QgZG9tYWluIGRyaXZlcnMgIG1heSBvcHRpb25hbGx5IHJlc2V0IGludGVybmFsIHN0YXRpc3RpYyBjb3VudGVycworICogIHdpdGggYSBxdWVyeS4KKyAqLworc3RydWN0IEZXQ01EX0VUSF9HRVRfU1RBVElTVElDUyB7CisJdW5pb24gRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBNSUJfRVRIX1NUQVRJU1RJQ1NfUEFSQU1TIHBhcmFtczsKK30gX19wYWNrZWQ7CisKKworc3RydWN0IEZXQ01EX0VUSF9BTk9OXzE3NV9SRVFVRVNUIHsKKwl1OCBwb3J0MF9wcm9taXNjdW91czsKKwl1OCBwb3J0MV9wcm9taXNjdW91czsKKwl1MTYgcnN2ZDA7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfRVRIX0FOT05fMTc2X1JFU1BPTlNFIHsKKwl1MzIgcnN2ZDA7Cit9IF9fcGFja2VkOworCit1bmlvbiBGV0NNRF9FVEhfQU5PTl8xNzRfUEFSQU1TIHsKKwlzdHJ1Y3QgRldDTURfRVRIX0FOT05fMTc1X1JFUVVFU1QgcmVxdWVzdDsKKwlzdHJ1Y3QgRldDTURfRVRIX0FOT05fMTc2X1JFU1BPTlNFIHJlc3BvbnNlOworfSBfX3BhY2tlZDsKKworLyogRW5hYmxlcy9EaXNhYmxlcyBwcm9taXNjdW91cyBldGhlcm5ldCByZWNlaXZlIG1vZGUuICAqLworc3RydWN0IEZXQ01EX0VUSF9QUk9NSVNDVU9VUyB7CisJdW5pb24gRldDTURfSEVBREVSIGhlYWRlcjsKKwl1bmlvbiBGV0NNRF9FVEhfQU5PTl8xNzRfUEFSQU1TIHBhcmFtczsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGV0NNRF9FVEhfQU5PTl8xNzhfUkVRVUVTVCB7CisJdTMyIG5ld19mcmFnc2l6ZV9sb2cyOworfSBfX3BhY2tlZDsKKworc3RydWN0IEZXQ01EX0VUSF9BTk9OXzE3OV9SRVNQT05TRSB7CisJdTMyIGFjdHVhbF9mcmFnc2l6ZV9sb2cyOworfSBfX3BhY2tlZDsKKwordW5pb24gRldDTURfRVRIX0FOT05fMTc3X1BBUkFNUyB7CisJc3RydWN0IEZXQ01EX0VUSF9BTk9OXzE3OF9SRVFVRVNUIHJlcXVlc3Q7CisJc3RydWN0IEZXQ01EX0VUSF9BTk9OXzE3OV9SRVNQT05TRSByZXNwb25zZTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiAgU2V0cyB0aGUgRXRoZXJuZXQgUlggZnJhZ21lbnQgc2l6ZS4gT25seSBob3N0IChkb21haW4gMCkgbmV0d29ya2luZworICogIGRyaXZlcnMgbWF5IGlzc3VlICB0aGlzIGNvbW1hbmQuICBUaGlzIGNhbGwgd2lsbCBmYWlsIGZvciBub24taG9zdAorICogIHByb3RlY3Rpb24gZG9tYWlucy4gSW4gdGhpcyBzaXR1YXRpb24gdGhlICBNQ0MgQ1Egc3RhdHVzIHdpbGwgaW5kaWNhdGUKKyAqICBhIGZhaWx1cmUgZHVlIHRvIGluc3VmZmljaWVudCBwcml2aWxlZGdlcy4gVGhlIHJlc3BvbnNlICBzaG91bGQgYmUKKyAqICBpZ25vcmVkLCBhbmQgdGhlIGRyaXZlciBzaG91bGQgdXNlIHRoZSBGV0NNRF9FVEhfR0VUX0ZSQUdfU0laRSB0bworICogIHF1ZXJ5IHRoZSAgZXhpc3RpbmcgZXRoZXJuZXQgcmVjZWl2ZSBmcmFnbWVudCBzaXplLiBJdCBtdXN0IHVzZSB0aGlzCisgKiAgZnJhZ21lbnQgc2l6ZSBmb3IgYWxsICBmcmFnbWVudHMgaW4gdGhlIGV0aGVybmV0IHJlY2VpdmUgcmluZy4gIElmCisgKiAgdGhlIGNvbW1hbmQgc3VjY2VlZHMsIHRoZSBkcml2ZXIgbXVzdCB1c2UgdGhlICBmcmFnIHNpemUgaW5kaWNhdGVkCisgKiAgaW4gdGhlIGNvbW1hbmQgcmVzcG9uc2Ugc2luY2UgdGhlIHJlcXVlc3RlZCBmcmFnIHNpemUgbWF5IG5vdCBiZSAgYXBwbGllZAorICogIHVudGlsIHRoZSBuZXh0IHJlYm9vdC4gV2hlbiB0aGUgcmVxdWVzdGVkIGZyYWdzaXplIG1hdGNoZXMgdGhlIHJlc3BvbnNlCisgKiAgIGZyYWdzaXplLCB0aGlzIGluZGljYXRlcyB0aGUgcmVxdWVzdCB3YXMgYXBwbGllZCBpbW1lZGlhdGVseS4KKyAqLworc3RydWN0IEZXQ01EX0VUSF9TRVRfUlhfRlJBR19TSVpFIHsKKwl1bmlvbiBGV0NNRF9IRUFERVIgaGVhZGVyOworCXVuaW9uIEZXQ01EX0VUSF9BTk9OXzE3N19QQVJBTVMgcGFyYW1zOworfSBfX3BhY2tlZDsKKworc3RydWN0IEZXQ01EX0VUSF9BTk9OXzE4MV9SRVFVRVNUIHsKKwl1MzIgcnN2ZDA7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgRldDTURfRVRIX0FOT05fMTgyX1JFU1BPTlNFIHsKKwl1MzIgYWN0dWFsX2ZyYWdzaXplX2xvZzI7Cit9IF9fcGFja2VkOworCit1bmlvbiBGV0NNRF9FVEhfQU5PTl8xODBfUEFSQU1TIHsKKwlzdHJ1Y3QgRldDTURfRVRIX0FOT05fMTgxX1JFUVVFU1QgcmVxdWVzdDsKKwlzdHJ1Y3QgRldDTURfRVRIX0FOT05fMTgyX1JFU1BPTlNFIHJlc3BvbnNlOworfSBfX3BhY2tlZDsKKworLyoKKyAqICBRdWVyaWVzIHRoZSBFdGhlcm5ldCBSWCBmcmFnbWVudCBzaXplLiBBbGwgZG9tYWlucyBtYXkgaXNzdWUgdGhpcworICogIGNvbW1hbmQuICBUaGUgZHJpdmVyICBzaG91bGQgY2FsbCB0aGlzIGNvbW1hbmQgdG8gZGV0ZXJtaW5lIHRoZSBtaW5pbXVtCisgKiAgcmVxdWlyZWQgZnJhZ21lbnQgc2l6ZSBmb3IgdGhlIGV0aGVybmV0ICBSWCByaW5nIGJ1ZmZlcnMuIERyaXZlcnMKKyAqICBtYXkgY2hvb3NlIHRvIHVzZSBhIGxhcmdlciBzaXplIGZvciBlYWNoIGZyYWdtZW50IGJ1ZmZlciwgYnV0ICBCbGFkZUVuZ2luZQorICogIHdpbGwgdXNlIHVwIHRvIHRoZSBjb25maWd1cmVkIG1pbmltdW0gcmVxdWlyZWQgZnJhZ3NpemUgaW4gZWFjaCBldGhlcm5ldAorICogICByZWNlaXZlIGZyYWdtZW50IGJ1ZmZlci4gRm9yIGV4YW1wbGUsIGlmIHRoZSBldGhlcm5ldCByZWNlaXZlIGZyYWdtZW50CisgKiAgc2l6ZSBpcyAgY29uZmlndXJlZCB0byA0a0IsIGFuZCBhIGRyaXZlciB1c2VzIDhrQiBmcmFnbWVudHMsIGEgNmtCCisgKiAgZXRoZXJuZXQgcGFja2V0IHJlY2VpdmVkIGJ5ICBCbGFkZUVuZ2luZSB3aWxsIGJlIHNwbGl0IGFjY3Jvc3MgdHdvCisgKiAgb2YgdGhlIGRyaXZlcidzIHJlY2VpdmUgZnJhbWdlbnRzICg0a0IgaW4gb25lICBmcmFnbWVudCBidWZmZXIsIGFuZAorICogIDJrQiBpbiB0aGUgc3Vic2VxdWVudCBmcmFnbWVudCBidWZmZXIpLgorICovCitzdHJ1Y3QgRldDTURfRVRIX0dFVF9SWF9GUkFHX1NJWkUgeworCXVuaW9uIEZXQ01EX0hFQURFUiBoZWFkZXI7CisJdW5pb24gRldDTURfRVRIX0FOT05fMTgwX1BBUkFNUyBwYXJhbXM7Cit9IF9fcGFja2VkOworCisjZW5kaWYgLyogX19md2NtZF9ldGhfYm1hcF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9md2NtZF9oZHJfYm1hcC5oIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Z3Y21kX2hkcl9ibWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhiNDUzMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9md2NtZF9oZHJfYm1hcC5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKy8qCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IHNyY2dlbiB2ZXJzaW9uOiAwMTI3CisgKi8KKyNpZm5kZWYgX19md2NtZF9oZHJfYm1hcF9oX18KKyNkZWZpbmUgX19md2NtZF9oZHJfYm1hcF9oX18KKworc3RydWN0IEZXQ01EX1JFUVVFU1RfSEVBREVSIHsKKwl1OCBvcGNvZGU7CisJdTggc3Vic3lzdGVtOworCXU4IHBvcnRfbnVtYmVyOworCXU4IGRvbWFpbjsKKwl1MzIgdGltZW91dDsKKwl1MzIgcmVxdWVzdF9sZW5ndGg7CisJdTMyIHJzdmQwOworfSBfX3BhY2tlZDsKKworc3RydWN0IEZXQ01EX1JFU1BPTlNFX0hFQURFUiB7CisJdTggb3Bjb2RlOworCXU4IHN1YnN5c3RlbTsKKwl1OCByc3ZkMDsKKwl1OCBkb21haW47CisJdTggc3RhdHVzOworCXU4IGFkZGl0aW9uYWxfc3RhdHVzOworCXUxNiByc3ZkMTsKKwl1MzIgcmVzcG9uc2VfbGVuZ3RoOworCXUzMiBhY3R1YWxfcmVzcG9uc2VfbGVuZ3RoOworfSBfX3BhY2tlZDsKKworLyoKKyAqICBUaGUgZmlybXdhcmUvZHJpdmVyIG92ZXJ3cml0ZXMgdGhlIGlucHV0IEZXQ01EX1JFUVVFU1RfSEVBREVSIHdpdGgKKyAqICB0aGUgb3V0cHV0ICBGV0NNRF9SRVNQT05TRV9IRUFERVIuCisgKi8KK3VuaW9uIEZXQ01EX0hFQURFUiB7CisJc3RydWN0IEZXQ01EX1JFUVVFU1RfSEVBREVSIHJlcXVlc3Q7CisJc3RydWN0IEZXQ01EX1JFU1BPTlNFX0hFQURFUiByZXNwb25zZTsKK30gX19wYWNrZWQ7CisKKyNlbmRpZiAvKiBfX2Z3Y21kX2hkcl9ibWFwX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Z3Y21kX21jYy5oIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Z3Y21kX21jYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZWNhODcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvZndjbWRfbWNjLmgKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworLyoKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgc3JjZ2VuIHZlcnNpb246IDAxMjcKKyAqLworI2lmbmRlZiBfX2Z3Y21kX21jY19hbWFwX2hfXworI2RlZmluZSBfX2Z3Y21kX21jY19hbWFwX2hfXworI2luY2x1ZGUgImZ3Y21kX29wY29kZXMuaCIKKy8qCisgKiBXaGVyZSBhcHBsaWNhYmxlLCBhIFdSQiwgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIFNjYXR0ZXItZ2F0aGVyIGVsZW1lbnRzLgorICogRWFjaCBlbGVtZW50IHN1cHBvcnRzIGEgNjQgYml0IGFkZHJlc3MgYW5kIGEgMzJiaXQgbGVuZ3RoIGZpZWxkLgorICovCitzdHJ1Y3QgQkVfTUNDX1NHRV9BTUFQIHsKKwl1OCBwYV9sb1szMl07CS8qIERXT1JEIDAgKi8KKwl1OCBwYV9oaVszMl07CS8qIERXT1JEIDEgKi8KKwl1OCBsZW5ndGhbMzJdOwkvKiBEV09SRCAyICovCit9IF9fcGFja2VkOworc3RydWN0IE1DQ19TR0VfQU1BUCB7CisJdTMyIGR3WzNdOworfTsKKy8qCisgKiBUaGUgZGVzaWduIG9mIGFuIE1DQ19TR0UgYWxsb3dzIHVwIHRvIDE5IGVsZW1lbnRzIHRvIGJlIGVtYmVkZGVkCisgKiBpbiBhIFdSQiwgc3VwcG9ydGluZyA2NEtCIGRhdGEgdHJhbnNmZXJzIChhc3N1bWluZyBhIDRLQiBwYWdlIHNpemUpLgorICovCitzdHJ1Y3QgQkVfTUNDX1dSQl9QQVlMT0FEX0FNQVAgeworCXVuaW9uIHsKKwkJc3RydWN0IEJFX01DQ19TR0VfQU1BUCBzZ2xbMTldOworCQl1OCBlbWJlZGRlZFs1OV1bMzJdOwkvKiBEV09SRCAwICovCisJfTsKK30gX19wYWNrZWQ7CitzdHJ1Y3QgTUNDX1dSQl9QQVlMT0FEX0FNQVAgeworCXUzMiBkd1s1OV07Cit9OworCisvKgorICogVGhpcyBpcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBNQ0MgQ29tbWFuZCBXUkIgZm9yIGNvbW1hbmRzCisgKiBzZW50IHRvIHRoZSBNYW5hZ2VtZW50IFByb2Nlc3NpbmcgVW5pdCAoTVBVKS4gU2VlIHNlY3Rpb24KKyAqIGZvciB1c2FnZSBpbiBlbWJlZGRlZCBhbmQgbm9uLWVtYmVkZGVkIG1vZGVzLgorICovCitzdHJ1Y3QgQkVfTUNDX1dSQl9BTUFQIHsKKwl1OCBlbWJlZGRlZDsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwWzJdOwkvKiBEV09SRCAwICovCisJdTggc2dlX2NvdW50WzVdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDFbMTZdOwkvKiBEV09SRCAwICovCisJdTggc3BlY2lhbFs4XTsJLyogRFdPUkQgMCAqLworCXU4IHBheWxvYWRfbGVuZ3RoWzMyXTsJLyogRFdPUkQgMSAqLworCXU4IHRhZ1syXVszMl07CS8qIERXT1JEIDIgKi8KKwl1OCByc3ZkMlszMl07CS8qIERXT1JEIDQgKi8KKwlzdHJ1Y3QgQkVfTUNDX1dSQl9QQVlMT0FEX0FNQVAgcGF5bG9hZDsKK30gX19wYWNrZWQ7CitzdHJ1Y3QgTUNDX1dSQl9BTUFQIHsKKwl1MzIgZHdbNjRdOworfTsKKworLyogIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgTUNDIENvbXBsZXRpb24gcXVldWUgZW50cnkgICovCitzdHJ1Y3QgQkVfTUNDX0NRX0VOVFJZX0FNQVAgeworCXU4IGNvbXBsZXRpb25fc3RhdHVzWzE2XTsJLyogRFdPUkQgMCAqLworCXU4IGV4dGVuZGVkX3N0YXR1c1sxNl07CS8qIERXT1JEIDAgKi8KKwl1OCBtY2NfdGFnWzJdWzMyXTsJLyogRFdPUkQgMSAqLworCXU4IHJzdmQwWzI3XTsJLyogRFdPUkQgMyAqLworCXU4IGNvbnN1bWVkOwkvKiBEV09SRCAzICovCisJdTggY29tcGxldGVkOwkvKiBEV09SRCAzICovCisJdTggaHBpX2J1ZmZlcl9jb21wbGV0aW9uOwkvKiBEV09SRCAzICovCisJdTggYXN5bmNfZXZlbnQ7CS8qIERXT1JEIDMgKi8KKwl1OCB2YWxpZDsJCS8qIERXT1JEIDMgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgTUNDX0NRX0VOVFJZX0FNQVAgeworCXUzMiBkd1s0XTsKK307CisKKy8qIE1haWxib3ggc3RydWN0dXJlcyB1c2VkIGJ5IHRoZSBNUFUgZHVyaW5nIGJvb3RzdHJhcCAqLworc3RydWN0IEJFX01DQ19NQUlMQk9YX0FNQVAgeworCXN0cnVjdCBCRV9NQ0NfV1JCX0FNQVAgd3JiOworCXN0cnVjdCBCRV9NQ0NfQ1FfRU5UUllfQU1BUCBjcTsKK30gX19wYWNrZWQ7CitzdHJ1Y3QgTUNDX01BSUxCT1hfQU1BUCB7CisJdTMyIGR3WzY4XTsKK307CisKKyNlbmRpZiAvKiBfX2Z3Y21kX21jY19hbWFwX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Z3Y21kX29wY29kZXMuaCBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9md2NtZF9vcGNvZGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNkNTY5MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9md2NtZF9vcGNvZGVzLmgKQEAgLTAsMCArMSwyNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKy8qCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IHNyY2dlbiB2ZXJzaW9uOiAwMTI3CisgKi8KKyNpZm5kZWYgX19md2NtZF9vcGNvZGVzX2FtYXBfaF9fCisjZGVmaW5lIF9fZndjbWRfb3Bjb2Rlc19hbWFwX2hfXworCisvKgorICogLS0tIEZXQ01EX1NVQlNZU1RFTVMgLS0tCisgKiBUaGUgY29tbWFuZHMgYXJlIGdyb3VwZWQgaW50byB0aGUgZm9sbG93aW5nIHN1YnN5c3RlbXMuIFRoZSBzdWJzeXN0ZW0KKyAqIGNvZGUgYWxvbmcgd2l0aCB0aGUgb3Bjb2RlIHVuaXF1ZWx5IGlkZW50aWZ5IGEgcGFydGljdWxhciBmd2NtZC4KKyAqLworI2RlZmluZSBGV0NNRF9TVUJTWVNURU1fUlNWRCAgKDApCS8qIFRoaXMgc3Vic3lzdGVtIGlzIHJlc2VydmVkLiBJdCBpcyAqLworCQkJCQkJICAvKiBuZXZlciB1c2VkLiAqLworI2RlZmluZSBGV0NNRF9TVUJTWVNURU1fQ09NTU9OICgxKQkvKiBDTURzIGluIHRoaXMgZ3JvdXAgYXJlIGNvbW1vbiB0bworCQkJCQkqIGFsbCBzdWJzeXN0ZW1zLiBTZWUKKwkJCQkJKiBDT01NT05fU1VCU1lTVEVNX09QQ09ERVMgZm9yIG9wY29kZXMKKwkJCQkJKiBhbmQgQ29tbW9uIEhvc3QgQ29uZmlndXJhdGlvbiBDTURzCisJCQkJCSogZm9yIHRoZSBGV0NNRCBkZXNjcmlwdGlvbnMuCisJCQkJCSovCisjZGVmaW5lIEZXQ01EX1NVQlNZU1RFTV9DT01NT05fSVNDU0kgICAgKDIpIC8qIENNRHMgaW4gdGhpcyBncm91cCBhcmUgKi8KKwkJCQkJLyoKKwkJCQkJKiBjb21tb24gdG8gSW5pdGlhdG9yIGFuZCBUYXJnZXQuIFNlZQorCQkJCQkqIENPTU1PTl9JU0NTSV9TVUJTWVNURU1fT1BDT0RFUyBhbmQKKwkJCQkJKiBDb21tb24gaVNDU0kgSW5pdGlhdG9yIGFuZCBUYXJnZXQKKwkJCQkJKiBDTURzIGZvciB0aGUgY29tbWFuZCBkZXNjcmlwdGlvbnMuCisJCQkJCSovCisjZGVmaW5lIEZXQ01EX1NVQlNZU1RFTV9FVEggICAgICAgICAgICAgKDMpCS8qIFRoaXMgc3Vic3lzdGVtIGlzIHVzZWQgdG8KKwkJCQkJCWV4ZWN1dGUgIEV0aGVybmV0IGNvbW1hbmRzLiAgKi8KKworI2RlZmluZSBGV0NNRF9TVUJTWVNURU1fVFBNICAgICAgICAgICAgICg0KQkvKiBUaGlzIHN1YnN5c3RlbSBpcyB1c2VkCisJCQkJCQkgdG8gZXhlY3V0ZSBUUE0gIGNvbW1hbmRzLiAgKi8KKyNkZWZpbmUgRldDTURfU1VCU1lTVEVNX1BYRV9VTkRJICAgICAgICAoNSkJLyogVGhpcyBzdWJzeXN0ZW0gaXMgdXNlZAorCQkJCQkJKiB0byBleGVjdXRlIFBYRQorCQkJCQkJKiBhbmQgVU5ESSBzcGVjaWZpYyBjb21tYW5kcy4KKwkJCQkJCSovCisKKyNkZWZpbmUgRldDTURfU1VCU1lTVEVNX0lTQ1NJX0lOSSAgICAgICAoNikJLyogVGhpcyBzdWJzeXN0ZW0gaXMgdXNlZCB0bworCQkJCQkJZXhlY3V0ZSBJU0NTSSBJbml0aWF0b3IKKwkJCQkJCXNwZWNpZmljIGNvbW1hbmRzLgorCQkJCQkJKi8KKyNkZWZpbmUgRldDTURfU1VCU1lTVEVNX0lTQ1NJX1RHVCAgICAgICAoNykJLyogVGhpcyBzdWJzeXN0ZW0gaXMgdXNlZAorCQkJCQkJdG8gZXhlY3V0ZSBpU0NTSSBUYXJnZXQKKwkJCQkJCXNwZWNpZmljIGNvbW1hbmRzLmJldHdlZW4KKwkJCQkJCVBUTCBhbmQgQVJNIGZpcm13YXJlLgorCQkJCQkJKi8KKyNkZWZpbmUgRldDTURfU1VCU1lTVEVNX01JTElfUFRMICAgICAgICAoOCkJLyogVGhpcyBzdWJzeXN0ZW0gaXMgdXNlZCB0bworCQkJCQkJZXhlY3V0ZSBpU0NTSSBUYXJnZXQgc3BlY2lmaWMKKwkJCQkJCWNvbW1hbmRzLmJldHdlZW4gTUlMSQorCQkJCQkJYW5kIFBUTC4gICovCisjZGVmaW5lIEZXQ01EX1NVQlNZU1RFTV9NSUxJX1RNRCAgICAgICAgKDkpCS8qIFRoaXMgc3Vic3lzdGVtIGlzIHVzZWQgdG8KKwkJCQkJCWV4ZWN1dGUgaVNDU0kgVGFyZ2V0IHNwZWNpZmljCisJCQkJCQljb21tYW5kcyBiZXR3ZWVuIE1JTEkKKwkJCQkJCWFuZCBUTUQuICAqLworI2RlZmluZSBGV0NNRF9TVUJTWVNURU1fUFJPWFkgICAgICAgICAgICgxMSkJLyogVGhpcyBzdWJzeXN0ZW0gaXMgdXNlZAorCQkJCQkJdG8gZXhlY3V0ZSBwcm94aWVkIGNvbW1hbmRzCisJCQkJCQl3aXRoaW4gdGhlIGhvc3QgYXQgdGhlCisJCQkJCQlleHBsaWNpdCByZXF1ZXN0IG9mIGEKKwkJCQkJCW5vbiBwcml2aWxlZGdlZCBkb21haW4uCisJCQkJCQlUaGlzICdzdWJzeXN0ZW0nIGlzIGVudGlyZWx5CisJCQkJCQl2aXJ0dWFsIGZyb20gdGhlIGNvbnRyb2xsZXIKKwkJCQkJCWFuZCBmaXJtd2FyZSBwZXJzcGVjdGl2ZSBhcworCQkJCQkJaXQgaXMgaW1wbGVtZW50ZWQgaW4gaG9zdAorCQkJCQkJZHJpdmVycy4KKwkJCQkJCSovCisKKy8qCisgKiAtLS0gQ09NTU9OX1NVQlNZU1RFTV9PUENPREVTIC0tLQorICogVGhlc2Ugb3Bjb2RlcyBhcmUgY29tbW9uIHRvIGJvdGggbmV0d29ya2luZyBhbmQgc3RvcmFnZSBQQ0kKKyAqIGZ1bmN0aW9ucy4gVGhleSBhcmUgdXNlZCB0byByZXNlcnZlIHJlc291cmNlcyBhbmQgY29uZmlndXJlCisgKiBCbGFkZUVuZ2luZS4gVGhlc2Ugb3Bjb2RlcyBhbGwgdXNlIHRoZSBGV0NNRF9TVUJTWVNURU1fQ09NTU9OCisgKiBzdWJzeXN0ZW0gY29kZS4KKyAqLworI2RlZmluZSBPUENPREVfQ09NTU9OX05UV0tfTUFDX1FVRVJZICAgICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX05UV0tfTUFDX1FVRVJZICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX05UV0tfTUFDX1NFVCAgICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX05UV0tfTVVMVElDQVNUX1NFVCAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9OVFdLX1ZMQU5fQ09ORklHICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX05UV0tfTElOS19TVEFUVVNfUVVFUlkgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fUkVBRF9GTEFTSFJPTSAgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fV1JJVEVfRkxBU0hST00gKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fUVVFUllfTUFYX0ZXQ01EX0JVRkZFUl9TSVpFICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX0FERF9QQUdFX1RBQkxFUyAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9SRU1PVkVfUEFHRV9UQUJMRVMgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fUklOR19ERVNUUk9ZICAgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fQ1FfQ1JFQVRFICAgICAgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fRVFfQ1JFQVRFICAgICAgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fRVRIX1JYX0NSRUFURSAgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fRVRIX1RYX0NSRUFURSAgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fSVNDU0lfREVGUV9DUkVBVEUgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fSVNDU0lfV1JCUV9DUkVBVEUgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fTUNDX0NSRUFURSAgICAgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fSkVMTF9DT05GSUcgICAgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fRk9SQ0VfRkFJTE9WRVIgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fQUREX1RFTVBMQVRFX0hFQURFUl9CVUZGRVJTICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX1JFTU9WRV9URU1QTEFURV9IRUFERVJfQlVGRkVSUyAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9QT1NUX1pFUk9fQlVGRkVSICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX0dFVF9RT1MgICAgICAgICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX1NFVF9RT1MgICAgICAgICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX1RDUF9HRVRfU1RBVElTVElDUyAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9TRUVQUk9NX1JFQUQgICAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9UQ1BfU1RBVEVfUVVFUlkgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fR0VUX0NOVExfQVRUUklCVVRFUyAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9OT1AgICAgICAgICAgICAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9OVFdLX1JYX0ZJTFRFUiAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9HRVRfRldfVkVSU0lPTiAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9TRVRfRkxPV19DT05UUk9MICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX0dFVF9GTE9XX0NPTlRST0wgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fU0VUX1RDUF9QQVJBTUVURVJTICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX1NFVF9GUkFNRV9TSVpFICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX0dFVF9GQVQgICAgICAgICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX01PRElGWV9FUV9ERUxBWSAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9GSVJNV0FSRV9DT05GSUcgKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fRU5BQkxFX0RJU0FCTEVfRE9NQUlOUyAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9HRVRfRE9NQUlOX0NPTkZJRyAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9TRVRfVkxEX0NPTkZJRyAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9HRVRfVkxEX0NPTkZJRyAoMSkKKyNkZWZpbmUgU1VCU1lTVEVNX0NPTU1PTl9HRVRfUE9SVF9FUVVBTElaQVRJT04gKDEpCisjZGVmaW5lIFNVQlNZU1RFTV9DT01NT05fU0VUX1BPUlRfRVFVQUxJWkFUSU9OICgxKQorI2RlZmluZSBTVUJTWVNURU1fQ09NTU9OX1JFRF9DT05GSUcgICAgICgxKQorI2RlZmluZSBPUENPREVfQ09NTU9OX05UV0tfTUFDX1NFVCAgICAgICgyKQorI2RlZmluZSBPUENPREVfQ09NTU9OX05UV0tfTVVMVElDQVNUX1NFVCAoMykKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9OVFdLX1ZMQU5fQ09ORklHICAoNCkKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9OVFdLX0xJTktfU1RBVFVTX1FVRVJZICg1KQorI2RlZmluZSBPUENPREVfQ09NTU9OX1JFQURfRkxBU0hST00gICAgICg2KQorI2RlZmluZSBPUENPREVfQ09NTU9OX1dSSVRFX0ZMQVNIUk9NICAgICg3KQorI2RlZmluZSBPUENPREVfQ09NTU9OX1FVRVJZX01BWF9GV0NNRF9CVUZGRVJfU0laRSAoOCkKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9BRERfUEFHRV9UQUJMRVMgICAoOSkKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9SRU1PVkVfUEFHRV9UQUJMRVMgKDEwKQorI2RlZmluZSBPUENPREVfQ09NTU9OX1JJTkdfREVTVFJPWSAgICAgICgxMSkKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9DUV9DUkVBVEUgICAgICAgICAoMTIpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fRVFfQ1JFQVRFICAgICAgICAgKDEzKQorI2RlZmluZSBPUENPREVfQ09NTU9OX0VUSF9SWF9DUkVBVEUgICAgICgxNCkKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9FVEhfVFhfQ1JFQVRFICAgICAoMTUpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fTkVUX1JFU0VSVkVEMCAgICAgKDE2KQkvKiBSZXNlcnZlZCAqLworI2RlZmluZSBPUENPREVfQ09NTU9OX05FVF9SRVNFUlZFRDEgICAgICgxNykJLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9ORVRfUkVTRVJWRUQyICAgICAoMTgpCS8qIFJlc2VydmVkICovCisjZGVmaW5lIE9QQ09ERV9DT01NT05fSVNDU0lfREVGUV9DUkVBVEUgKDE5KQorI2RlZmluZSBPUENPREVfQ09NTU9OX0lTQ1NJX1dSQlFfQ1JFQVRFICgyMCkKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9NQ0NfQ1JFQVRFICAgICAgICAoMjEpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fSkVMTF9DT05GSUcgICAgICAgKDIyKQorI2RlZmluZSBPUENPREVfQ09NTU9OX0ZPUkNFX0ZBSUxPVkVSICAgICgyMykKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9BRERfVEVNUExBVEVfSEVBREVSX0JVRkZFUlMgKDI0KQorI2RlZmluZSBPUENPREVfQ09NTU9OX1JFTU9WRV9URU1QTEFURV9IRUFERVJfQlVGRkVSUyAoMjUpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fUE9TVF9aRVJPX0JVRkZFUiAgKDI2KQorI2RlZmluZSBPUENPREVfQ09NTU9OX0dFVF9RT1MgICAgICAgICAgICgyNykKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9TRVRfUU9TICAgICAgICAgICAoMjgpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fVENQX0dFVF9TVEFUSVNUSUNTICgyOSkKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9TRUVQUk9NX1JFQUQgICAgICAoMzApCisjZGVmaW5lIE9QQ09ERV9DT01NT05fVENQX1NUQVRFX1FVRVJZICAgKDMxKQorI2RlZmluZSBPUENPREVfQ09NTU9OX0dFVF9DTlRMX0FUVFJJQlVURVMgKDMyKQorI2RlZmluZSBPUENPREVfQ09NTU9OX05PUCAgICAgICAgICAgICAgICgzMykKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9OVFdLX1JYX0ZJTFRFUiAgICAoMzQpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fR0VUX0ZXX1ZFUlNJT04gICAgKDM1KQorI2RlZmluZSBPUENPREVfQ09NTU9OX1NFVF9GTE9XX0NPTlRST0wgICgzNikKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9HRVRfRkxPV19DT05UUk9MICAoMzcpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fU0VUX1RDUF9QQVJBTUVURVJTICgzOCkKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9TRVRfRlJBTUVfU0laRSAgICAoMzkpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fR0VUX0ZBVCAgICAgICAgICAgKDQwKQorI2RlZmluZSBPUENPREVfQ09NTU9OX01PRElGWV9FUV9ERUxBWSAgICg0MSkKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9GSVJNV0FSRV9DT05GSUcgICAoNDIpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fRU5BQkxFX0RJU0FCTEVfRE9NQUlOUyAoNDMpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fR0VUX0RPTUFJTl9DT05GSUcgKDQ0KQorI2RlZmluZSBPUENPREVfQ09NTU9OX1NFVF9WTERfQ09ORklHICAgICg0NSkKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9HRVRfVkxEX0NPTkZJRyAgICAoNDYpCisjZGVmaW5lIE9QQ09ERV9DT01NT05fR0VUX1BPUlRfRVFVQUxJWkFUSU9OICg0NykKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9TRVRfUE9SVF9FUVVBTElaQVRJT04gKDQ4KQorI2RlZmluZSBPUENPREVfQ09NTU9OX1JFRF9DT05GSUcgICAgICAgICg0OSkKKworCisKKy8qCisgKiAtLS0gRVRIX1NVQlNZU1RFTV9PUENPREVTIC0tLQorICogVGhlc2Ugb3Bjb2RlcyBhcmUgdXNlZCBmb3IgY29uZmlndXJpbmcgdGhlIEV0aGVybmV0IGludGVyZmFjZXMuIFRoZXNlCisgKiBvcGNvZGVzIGFsbCB1c2UgdGhlIEZXQ01EX1NVQlNZU1RFTV9FVEggc3Vic3lzdGVtIGNvZGUuCisgKi8KKyNkZWZpbmUgT1BDT0RFX0VUSF9SU1NfQ09ORklHICAgICAgICAgICAoMSkKKyNkZWZpbmUgT1BDT0RFX0VUSF9BQ1BJX0NPTkZJRyAgICAgICAgICAoMikKKyNkZWZpbmUgU1VCU1lTVEVNX0VUSF9SU1NfQ09ORklHICAgICAgICAoMykKKyNkZWZpbmUgU1VCU1lTVEVNX0VUSF9BQ1BJX0NPTkZJRyAgICAgICAoMykKKyNkZWZpbmUgT1BDT0RFX0VUSF9QUk9NSVNDVU9VUyAgICAgICAgICAoMykKKyNkZWZpbmUgU1VCU1lTVEVNX0VUSF9QUk9NSVNDVU9VUyAgICAgICAoMykKKyNkZWZpbmUgU1VCU1lTVEVNX0VUSF9HRVRfU1RBVElTVElDUyAgICAoMykKKyNkZWZpbmUgU1VCU1lTVEVNX0VUSF9HRVRfUlhfRlJBR19TSVpFICAoMykKKyNkZWZpbmUgU1VCU1lTVEVNX0VUSF9TRVRfUlhfRlJBR19TSVpFICAoMykKKyNkZWZpbmUgT1BDT0RFX0VUSF9HRVRfU1RBVElTVElDUyAgICAgICAoNCkKKyNkZWZpbmUgT1BDT0RFX0VUSF9HRVRfUlhfRlJBR19TSVpFICAgICAoNSkKKyNkZWZpbmUgT1BDT0RFX0VUSF9TRVRfUlhfRlJBR19TSVpFICAgICAoNikKKworCisKKworCisvKgorICogLS0tIE1DQ19TVEFUVVNfQ09ERSAtLS0KKyAqIFRoZXNlIGFyZSB0aGUgZ2xvYmFsIHN0YXR1cyBjb2RlcyB1c2VkIGJ5IGFsbCBzdWJzeXN0ZW1zCisgKi8KKyNkZWZpbmUgTUNDX1NUQVRVU19TVUNDRVNTICAgICAgICAgICAgICAoMCkJLyogSW5kaWNhdGVzIGEgc3VjY2Vzc2Z1bAorCQkJCQkJY29tcGxldGlvbiBvZiAgdGhlIGNvbW1hbmQgKi8KKyNkZWZpbmUgTUNDX1NUQVRVU19JTlNVRkZJQ0lFTlRfUFJJVklMRUdFUyAoMSkJLyogVGhlIGNsaWVudCBkb2VzIG5vdCBoYXZlCisJCQkJCQlzdWZmaWNpZW50IHByaXZpbGVnZXMgdG8KKwkJCQkJCWV4ZWN1dGUgdGhlIGNvbW1hbmQgKi8KKyNkZWZpbmUgTUNDX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUiAgICAoMikJLyogQSBwYXJhbWV0ZXIgaW4gdGhlIGNvbW1hbmQKKwkJCQkJCXdhcyBpbnZhbGlkLiBUaGUgZXh0ZW5kZWQKKwkJCQkJCXN0YXR1cyBjb250YWlucyB0aGUgaW5kZXgKKwkJCQkJCW9mIHRoZSBwYXJhbWV0ZXIgKi8KKyNkZWZpbmUgTUNDX1NUQVRVU19JTlNVRkZJQ0lFTlRfUkVTT1VSQ0VTICgzKQkvKiBUaGVyZSBhcmUgaW5zdWZmaWNpZW50CisJCQkJCQljaGlwIHJlc291cmNlcyB0byBleGVjdXRlCisJCQkJCQl0aGUgY29tbWFuZCAqLworI2RlZmluZSBNQ0NfU1RBVFVTX1FVRVVFX0ZMVVNISU5HICAgICAgICg0KQkvKiBUaGUgY29tbWFuZCBpcyBjb21wbGV0aW5nCisJCQkJCQliZWNhdXNlIHRoZSBxdWV1ZSB3YXMKKwkJCQkJCWdldHRpbmcgZmx1c2hlZCAqLworI2RlZmluZSBNQ0NfU1RBVFVTX0RNQV9GQUlMRUQgICAgICAgICAgICg1KQkvKiBUaGUgY29tbWFuZCBpcyBjb21wbGV0aW5nCisJCQkJCQl3aXRoIGEgRE1BIGVycm9yICovCisKKy8qCisgKiAtLS0gTUdNVF9FUlJPUl9DT0RFUyAtLS0KKyAqIEVycm9yIENvZGVzIHJldHVybmVkIGluIHRoZSBzdGF0dXMgZmllbGQgb2YgdGhlIEZXQ01EIHJlc3BvbnNlIGhlYWRlcgorICovCisjZGVmaW5lIE1HTVRfU1RBVFVTX1NVQ0NFU1MgICAgICAgICAgICAgKDApCS8qIFRoZSBGV0NNRCBjb21wbGV0ZWQKKwkJCQkJCXdpdGhvdXQgZXJyb3JzICovCisjZGVmaW5lIE1HTVRfU1RBVFVTX0ZBSUxFRCAgICAgICAgICAgICAgKDEpCS8qIEVycm9yIHN0YXR1cyBpbiB0aGUgU3RhdHVzCisJCQkJCQlmaWVsZCBvZiAgdGhlCisJCQkJCQlzdHJ1Y3QgRldDTURfUkVTUE9OU0VfSEVBREVSICovCisjZGVmaW5lIE1HTVRfU1RBVFVTX0lMTEVHQUxfUkVRVUVTVCAgICAgKDIpCS8qIEludmFsaWQgRldDTUQgb3Bjb2RlICovCisjZGVmaW5lIE1HTVRfU1RBVFVTX0lMTEVHQUxfRklFTEQgICAgICAgKDMpCS8qIEludmFsaWQgcGFyYW1ldGVyIGluCisJCQkJCQl0aGUgRldDTUQgIHBheWxvYWQgKi8KKworI2VuZGlmIC8qIF9fZndjbWRfb3Bjb2Rlc19hbWFwX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2Z3Y21kX3R5cGVzX2JtYXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9md2NtZF90eXBlc19ibWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIyMTdhZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9md2NtZF90eXBlc19ibWFwLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworLyoKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgc3JjZ2VuIHZlcnNpb246IDAxMjcKKyAqLworI2lmbmRlZiBfX2Z3Y21kX3R5cGVzX2JtYXBfaF9fCisjZGVmaW5lIF9fZndjbWRfdHlwZXNfYm1hcF9oX18KKworLyogTUFDIGFkZHJlc3MgZm9ybWF0ICAqLworc3RydWN0IE1BQ19BRERSRVNTX0ZPUk1BVCB7CisJdTE2IFNpemVPZlN0cnVjdHVyZTsKKwl1OCBNQUNBZGRyZXNzWzZdOworfSBfX3BhY2tlZDsKKworI2VuZGlmIC8qIF9fZndjbWRfdHlwZXNfYm1hcF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9ob3N0X3N0cnVjdC5oIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L2hvc3Rfc3RydWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RlNjcyMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9ob3N0X3N0cnVjdC5oCkBAIC0wLDAgKzEsMTgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisvKgorICogQXV0b2dlbmVyYXRlZCBieSBzcmNnZW4gdmVyc2lvbjogMDEyNworICovCisjaWZuZGVmIF9faG9zdF9zdHJ1Y3RfYW1hcF9oX18KKyNkZWZpbmUgX19ob3N0X3N0cnVjdF9hbWFwX2hfXworI2luY2x1ZGUgImJlX2NtLmgiCisjaW5jbHVkZSAiYmVfY29tbW9uLmgiCisjaW5jbHVkZSAiZGVzY3JpcHRvcnMuaCIKKworLyogLS0tIEVRX0NPTVBMRVRJT05fTUFKT1JfQ09ERV9FTlVNIC0tLSAqLworI2RlZmluZSBFUV9NQUpPUl9DT0RFX0NPTVBMRVRJT04gICAgICAgICgwKQkvKiBDb21wbGV0aW9uIGV2ZW50IG9uIGEgKi8KKwkJCQkJCSAgLyogcWNvbXBsZXRpb24gdWV1ZS4gKi8KKyNkZWZpbmUgRVFfTUFKT1JfQ09ERV9FVEggICAgICAgICAgICAgICAoMSkJLyogQWZmaWxpYXRlZCBFdGhlcm5ldCBFdmVudC4gKi8KKyNkZWZpbmUgRVFfTUFKT1JfQ09ERV9SRVNFUlZFRCAgICAgICAgICAoMikJLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgRVFfTUFKT1JfQ09ERV9SRE1BICAgICAgICAgICAgICAoMykJLyogQWZmaWxpYXRlZCBSRE1BIEV2ZW50LiAqLworI2RlZmluZSBFUV9NQUpPUl9DT0RFX0lTQ1NJICAgICAgICAgICAgICg0KQkvKiBBZmZpbGlhdGVkIElTQ1NJIEV2ZW50ICovCisjZGVmaW5lIEVRX01BSk9SX0NPREVfVU5BRkZJTElBVEVEICAgICAgKDUpCS8qIFVuYWZmaWxpYXRlZCBFdmVudCAqLworCisvKiAtLS0gRVFfQ09NUExFVElPTl9NSU5PUl9DT0RFX0VOVU0gLS0tICovCisjZGVmaW5lIEVRX01JTk9SX0NPREVfQ09NUExFVElPTiAgICAgICAgKDApCS8qIENvbXBsZXRpb24gZXZlbnQgb24gYSAqLworCQkJCQkJICAvKiBjb21wbGV0aW9uIHF1ZXVlLiAqLworI2RlZmluZSBFUV9NSU5PUl9DT0RFX09USEVSICAgICAgICAgICAgICgxKQkvKiBPdGhlciBFdmVudCAoVEJEKS4gKi8KKworLyogUXVldWUgRW50cnkgRGVmaW5pdGlvbiBmb3IgYWxsIDQgYnl0ZSBldmVudCBxdWV1ZSB0eXBlcy4gKi8KK3N0cnVjdCBCRV9FUV9FTlRSWV9BTUFQIHsKKwl1OCBWYWxpZDsJCS8qIERXT1JEIDAgKi8KKwl1OCBNYWpvckNvZGVbM107CS8qIERXT1JEIDAgKi8KKwl1OCBNaW5vckNvZGVbMTJdOwkvKiBEV09SRCAwICovCisJdTggUmVzb3VyY2VJRFsxNl07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgRVFfRU5UUllfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyoKKyAqIC0tLSBFVEhfRVZFTlRfQ09ERSAtLS0KKyAqIFRoZXNlIGNvZGVzIGFyZSByZXR1cm5lZCBieSB0aGUgTVBVIHdoZW4gb25lIG9mIHRoZXNlIGV2ZW50cyBoYXMgb2NjdXJyZWQsCisgKiBhbmQgdGhlIGV2ZW50IGlzIGNvbmZpZ3VyZWQgdG8gcmVwb3J0IHRvIGFuIEV2ZW50IFF1ZXVlIHdoZW4gYW4gZXZlbnQKKyAqIGlzIGRldGVjdGVkLgorICovCisjZGVmaW5lIEVUSF9FUV9MSU5LX1NUQVRVUyAgICAgICAgICAgICAgKDApCS8qIExpbmsgc3RhdHVzIGNoYW5nZSBldmVudCAqLworCQkJCQkJICAvKiBkZXRlY3RlZC4gKi8KKyNkZWZpbmUgRVRIX0VRX1dBVEVSTUFSSyAgICAgICAgICAgICAgICAoMSkJLyogd2F0ZXJtYXJrIGV2ZW50IGRldGVjdGVkLiAqLworI2RlZmluZSBFVEhfRVFfTUFHSUNfUEtUICAgICAgICAgICAgICAgICgyKQkvKiBtYWdpYyBwa3QgZXZlbnQgZGV0ZWN0ZWQuICovCisjZGVmaW5lIEVUSF9FUV9BQ1BJX1BLVDAgICAgICAgICAgICAgICAgKDMpCS8qIEFDUEkgaW50ZXJlc3RpbmcgcGFja2V0ICovCisJCQkJCQkgIC8qIGRldGVjdGVkLiAqLworI2RlZmluZSBFVEhfRVFfQUNQSV9QS1QxICAgICAgICAgICAgICAgICgzKQkvKiBBQ1BJIGludGVyZXN0aW5nIHBhY2tldCAqLworCQkJCQkJICAvKiBkZXRlY3RlZC4gKi8KKyNkZWZpbmUgRVRIX0VRX0FDUElfUEtUMiAgICAgICAgICAgICAgICAoMykJLyogQUNQSSBpbnRlcmVzdGluZyBwYWNrZXQgKi8KKwkJCQkJCSAgLyogZGV0ZWN0ZWQuICovCisjZGVmaW5lIEVUSF9FUV9BQ1BJX1BLVDMgICAgICAgICAgICAgICAgKDMpCS8qIEFDUEkgaW50ZXJlc3RpbmcgcGFja2V0ICovCisJCQkJCQkgIC8qIGRldGVjdGVkLiAqLworCisvKgorICogLS0tIEVUSF9UWF9DT01QTF9TVEFUVVNfRU5VTSAtLS0KKyAqIFN0YXR1cyBjb2RlcyBjb250YWluZWQgaW4gRXRoZXJuZXQgVFggY29tcGxldGlvbiBkZXNjcmlwdG9ycy4KKyAqLworI2RlZmluZSBFVEhfQ09NUF9WQUxJRCAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBFVEhfQ09NUF9FUlJPUiAgICAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBFVEhfQ09NUF9JTlZBTElEICAgICAgICAgICAgICAgICgxNSkKKworLyoKKyAqIC0tLSBFVEhfVFhfQ09NUExfUE9SVF9FTlVNIC0tLQorICogUG9ydCBpbmRpY2F0b3IgY29udGFpbmVkIGluIEV0aGVybmV0IFRYIGNvbXBsZXRpb24gZGVzY3JpcHRvcnMuCisgKi8KKyNkZWZpbmUgRVRIX0NPTVBfUE9SVDAgICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgRVRIX0NPTVBfUE9SVDEgICAgICAgICAgICAgICAgICAoMSkKKyNkZWZpbmUgRVRIX0NPTVBfTUdNVCAgICAgICAgICAgICAgICAgICAoMikKKworLyoKKyAqIC0tLSBFVEhfVFhfQ09NUExfQ1RfRU5VTSAtLS0KKyAqIENvbXBsZXRpb24gdHlwZSBpbmRpY2F0b3IgY29udGFpbmVkIGluIEV0aGVybmV0IFRYIGNvbXBsZXRpb24gZGVzY3JpcHRvcnMuCisgKi8KKyNkZWZpbmUgRVRIX0NPTVBfRVRIICAgICAgICAgICAgICAgICAgICAoMCkKKworLyoKKyAqIFdvcmsgcmVxdWVzdCBibG9jayB0aGF0IHRoZSBkcml2ZXIgaXNzdWVzIHRvIHRoZSBjaGlwIGZvcgorICogRXRoZXJuZXQgdHJhbnNtaXNzaW9ucy4gQWxsIGNvbnRyb2wgZmllbGRzIG11c3QgYmUgdmFsaWQgaW4gZWFjaCBXUkIgZm9yCisgKiBhIG1lc3NhZ2UuIFRoZSBjb250cm9sbGVyLCBhcyBzcGVjaWZpZWQgYnkgdGhlIGZsYWdzLCBvcHRpb25hbGx5IHdyaXRlcworICogYW4gZW50cnkgdG8gdGhlIENvbXBsZXRpb24gUmluZyBhbmQgZ2VuZXJhdGUgYW4gZXZlbnQuCisgKi8KK3N0cnVjdCBCRV9FVEhfV1JCX0FNQVAgeworCXU4IGZyYWdfcGFfaGlbMzJdOwkvKiBEV09SRCAwICovCisJdTggZnJhZ19wYV9sb1szMl07CS8qIERXT1JEIDEgKi8KKwl1OCBjb21wbGV0ZTsJLyogRFdPUkQgMiAqLworCXU4IGV2ZW50OwkJLyogRFdPUkQgMiAqLworCXU4IGNyYzsJCS8qIERXT1JEIDIgKi8KKwl1OCBmb3J3YXJkOwkJLyogRFdPUkQgMiAqLworCXU4IGlwc2VjOwkJLyogRFdPUkQgMiAqLworCXU4IG1nbXQ7CQkvKiBEV09SRCAyICovCisJdTggaXBjczsJCS8qIERXT1JEIDIgKi8KKwl1OCB1ZHBjczsJCS8qIERXT1JEIDIgKi8KKwl1OCB0Y3BjczsJCS8qIERXT1JEIDIgKi8KKwl1OCBsc287CQkvKiBEV09SRCAyICovCisJdTggbGFzdDsJCS8qIERXT1JEIDIgKi8KKwl1OCB2bGFuOwkJLyogRFdPUkQgMiAqLworCXU4IGRiZ1szXTsJCS8qIERXT1JEIDIgKi8KKwl1OCBoYXNoX3ZhbFszXTsJLyogRFdPUkQgMiAqLworCXU4IGxzb19tc3NbMTRdOwkvKiBEV09SRCAyICovCisJdTggZnJhZ19sZW5bMTZdOwkvKiBEV09SRCAzICovCisJdTggdmxhbl90YWdbMTZdOwkvKiBEV09SRCAzICovCit9IF9fcGFja2VkOworc3RydWN0IEVUSF9XUkJfQU1BUCB7CisJdTMyIGR3WzRdOworfTsKKworLyogVGhpcyBpcyBhbiBFdGhlcm5ldCB0cmFuc21pdCBjb21wbGV0aW9uIGRlc2NyaXB0b3IgKi8KK3N0cnVjdCBCRV9FVEhfVFhfQ09NUExfQU1BUCB7CisJdTggdXNlcl9ieXRlc1sxNl07CS8qIERXT1JEIDAgKi8KKwl1OCBud2hfYnl0ZXNbOF07CS8qIERXT1JEIDAgKi8KKwl1OCBsc287CQkvKiBEV09SRCAwICovCisJdTggcnN2ZDBbN107CS8qIERXT1JEIDAgKi8KKwl1OCB3cmJfaW5kZXhbMTZdOwkvKiBEV09SRCAxICovCisJdTggY3RbMl07CQkvKiBEV09SRCAxICovCisJdTggcG9ydFsyXTsJCS8qIERXT1JEIDEgKi8KKwl1OCByc3ZkMVs4XTsJLyogRFdPUkQgMSAqLworCXU4IHN0YXR1c1s0XTsJLyogRFdPUkQgMSAqLworCXU4IHJzdmQyWzE2XTsJLyogRFdPUkQgMiAqLworCXU4IHJpbmdpZFsxMV07CS8qIERXT1JEIDIgKi8KKwl1OCBoYXNoX3ZhbFs0XTsJLyogRFdPUkQgMiAqLworCXU4IHZhbGlkOwkJLyogRFdPUkQgMiAqLworCXU4IHJzdmQzWzMyXTsJLyogRFdPUkQgMyAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBFVEhfVFhfQ09NUExfQU1BUCB7CisJdTMyIGR3WzRdOworfTsKKworLyogRXRoZXJuZXQgUmVjZWl2ZSBCdWZmZXIgZGVzY3JpcHRvciAqLworc3RydWN0IEJFX0VUSF9SWF9EX0FNQVAgeworCXU4IGZyYWdwYV9oaVszMl07CS8qIERXT1JEIDAgKi8KKwl1OCBmcmFncGFfbG9bMzJdOwkvKiBEV09SRCAxICovCit9IF9fcGFja2VkOworc3RydWN0IEVUSF9SWF9EX0FNQVAgeworCXUzMiBkd1syXTsKK307CisKKy8qIFRoaXMgaXMgYW4gRXRoZXJuZXQgUmVjZWl2ZSBDb21wbGV0aW9uIERlc2NyaXB0b3IgKi8KK3N0cnVjdCBCRV9FVEhfUlhfQ09NUExfQU1BUCB7CisJdTggdmxhbl90YWdbMTZdOwkvKiBEV09SRCAwICovCisJdTggcGt0c2l6ZVsxNF07CS8qIERXT1JEIDAgKi8KKwl1OCBwb3J0OwkJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwOwkJLyogRFdPUkQgMCAqLworCXU4IGVycjsJCS8qIERXT1JEIDEgKi8KKwl1OCByc3NocDsJCS8qIERXT1JEIDEgKi8KKwl1OCBpcGY7CQkvKiBEV09SRCAxICovCisJdTggdGNwZjsJCS8qIERXT1JEIDEgKi8KKwl1OCB1ZHBmOwkJLyogRFdPUkQgMSAqLworCXU4IGlwY2tzbTsJCS8qIERXT1JEIDEgKi8KKwl1OCB0Y3Bja3NtOwkJLyogRFdPUkQgMSAqLworCXU4IHVkcGNrc207CQkvKiBEV09SRCAxICovCisJdTggbWFjZHN0WzZdOwkvKiBEV09SRCAxICovCisJdTggdnRwOwkJLyogRFdPUkQgMSAqLworCXU4IHZ0bTsJCS8qIERXT1JEIDEgKi8KKwl1OCBmcmFnbmR4WzEwXTsJLyogRFdPUkQgMSAqLworCXU4IGN0WzJdOwkJLyogRFdPUkQgMSAqLworCXU4IGlwc2VjOwkJLyogRFdPUkQgMSAqLworCXU4IG51bWZyYWdzWzNdOwkvKiBEV09SRCAxICovCisJdTggcnN2ZDFbMzFdOwkvKiBEV09SRCAyICovCisJdTggdmFsaWQ7CQkvKiBEV09SRCAyICovCisJdTggcnNzaGFzaFszMl07CS8qIERXT1JEIDMgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgRVRIX1JYX0NPTVBMX0FNQVAgeworCXUzMiBkd1s0XTsKK307CisKKyNlbmRpZiAvKiBfX2hvc3Rfc3RydWN0X2FtYXBfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvaHdsaWIuaCBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9od2xpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZWRmNGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvaHdsaWIuaApAQCAtMCwwICsxLDgzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworI2lmbmRlZiBfX2h3bGliX2hfXworI2RlZmluZSBfX2h3bGliX2hfXworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgInJlZ21hcC5oIgkJLyogc3JjZ2VuIGFycmF5IG1hcCBvdXRwdXQgKi8KKworI2luY2x1ZGUgImFzeW5jbWVzZy5oIgorI2luY2x1ZGUgImZ3Y21kX29wY29kZXMuaCIKKyNpbmNsdWRlICJwb3N0X2NvZGVzLmgiCisjaW5jbHVkZSAiZndjbWRfbWNjLmgiCisKKyNpbmNsdWRlICJmd2NtZF90eXBlc19ibWFwLmgiCisjaW5jbHVkZSAiZndjbWRfY29tbW9uX2JtYXAuaCIKKyNpbmNsdWRlICJmd2NtZF9ldGhfYm1hcC5oIgorI2luY2x1ZGUgImJlc3RhdHVzLmgiCisvKgorICoKKyAqIE1hY3JvcyBmb3IgcmVhZGluZy93cml0aW5nIGEgcHJvdGVjdGlvbiBkb21haW4gb3IgQ1NSIHJlZ2lzdGVycworICogaW4gQmxhZGVFbmdpbmUuCisgKi8KKyNkZWZpbmUgUERfUkVBRChmbywgZmllbGQpCWlvcmVhZDMyKChmbyktPmRiX3ZhICsgXAorCQlvZmZzZXRvZihzdHJ1Y3QgQkVfUFJPVEVDVElPTl9ET01BSU5fREJNQVBfQU1BUCwgZmllbGQpLzgpCisKKyNkZWZpbmUgUERfV1JJVEUoZm8sIGZpZWxkLCB2YWwpIGlvd3JpdGUzMih2YWwsIChmbyktPmRiX3ZhICsgXAorCQlvZmZzZXRvZihzdHJ1Y3QgQkVfUFJPVEVDVElPTl9ET01BSU5fREJNQVBfQU1BUCwgZmllbGQpLzgpCisKKyNkZWZpbmUgQ1NSX1JFQUQoZm8sIGZpZWxkKQlpb3JlYWQzMigoZm8pLT5jc3JfdmEgKyBcCisJCW9mZnNldG9mKHN0cnVjdCBCRV9CTEFERV9FTkdJTkVfQ1NSTUFQX0FNQVAsIGZpZWxkKS84KQorCisjZGVmaW5lIENTUl9XUklURShmbywgZmllbGQsIHZhbCkJaW93cml0ZTMyKHZhbCwgKGZvKS0+Y3NyX3ZhICsgXAorCQlvZmZzZXRvZihzdHJ1Y3QgQkVfQkxBREVfRU5HSU5FX0NTUk1BUF9BTUFQLCBmaWVsZCkvOCkKKworI2RlZmluZSBQQ0lDRkcwX1JFQUQoZm8sIGZpZWxkKQlpb3JlYWQzMigoZm8pLT5wY2lfdmEgKyBcCisJCW9mZnNldG9mKHN0cnVjdCBCRV9QQ0lDRkcwX0NTUk1BUF9BTUFQLCBmaWVsZCkvOCkKKworI2RlZmluZSBQQ0lDRkcwX1dSSVRFKGZvLCBmaWVsZCwgdmFsKQlpb3dyaXRlMzIodmFsLCAoZm8pLT5wY2lfdmEgKyBcCisJCW9mZnNldG9mKHN0cnVjdCBCRV9QQ0lDRkcwX0NTUk1BUF9BTUFQLCBmaWVsZCkvOCkKKworI2RlZmluZSBQQ0lDRkcxX1JFQUQoZm8sIGZpZWxkKQlpb3JlYWQzMigoZm8pLT5wY2lfdmEgKyBcCisJCW9mZnNldG9mKHN0cnVjdCBCRV9QQ0lDRkcxX0NTUk1BUF9BTUFQLCBmaWVsZCkvOCkKKworI2RlZmluZSBQQ0lDRkcxX1dSSVRFKGZvLCBmaWVsZCwgdmFsKQlpb3dyaXRlMzIodmFsLCAoZm8pLT5wY2lfdmEgKyBcCisJCW9mZnNldG9mKHN0cnVjdCBCRV9QQ0lDRkcxX0NTUk1BUF9BTUFQLCBmaWVsZCkvOCkKKworI2lmZGVmIEJFX0RFQlVHCisjZGVmaW5lIEFTU0VSVChjKSAgICAgICBCVUdfT04oIShjKSk7CisjZWxzZQorI2RlZmluZSBBU1NFUlQoYykKKyNlbmRpZgorCisvKiBkZWJ1ZyBsZXZlbHMgKi8KK2VudW0gQkVfREVCVUdfTEVWRUxTIHsKKwlETF9BTFdBWVMgPSAwLAkJLyogY2Fubm90IGJlIG1hc2tlZCAqLworCURMX0VSUiA9IDB4MSwJCS8qIGVycm9ycyB0aGF0IHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwlETF9XQVJOID0gMHgyLAkJLyogc29tZXRoaW5nIHF1ZXN0aW9uYWJsZS4KKwkJCQkgICByZWNvdmVyYWJsZSBlcnJvcnMgKi8KKwlETF9OT1RFID0gMHg0LAkJLyogaW5mcmVxdWVudCwgaW1wb3J0YW50IGRlYnVnIGluZm8gKi8KKwlETF9JTkZPID0gMHg4LAkJLyogZGVidWcgaW5mb3JtYXRpb24gKi8KKwlETF9WRVJCT1NFID0gMHgxMCwJLyogZGV0YWlsZWQgaW5mbywgc3VjaCBhcyBidWZmZXIgdHJhY2VzICovCisJQkVfRExfTUlOX1ZBTFVFID0gMHgxLAkvKiB0aGlzIGlzIHRoZSBtaW4gdmFsdWUgdXNlZCAqLworCUJFX0RMX01BWF9WQUxVRSA9IDB4ODAJLyogdGhpcyBpcyB0aGUgaGlnaGVzZXQgdmFsdWUgdXNlZCAqLworfSA7CisKK2V4dGVybiB1bnNpZ25lZCBpbnQgdHJhY2VfbGV2ZWw7CisKKyNkZWZpbmUgVFJBQ0UobG0sIGZtdCwgYXJncy4uLikgIHsJCQkJXAorCQlpZiAodHJhY2VfbGV2ZWwgJiBsbSkgewkJCQlcCisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIkJFOiAlczolZCBcbiIgZm10LAlcCisJCQlfX0ZJTEVfXyAsIF9fTElORV9fICwgIyMgYXJncyk7CQlcCisJCX0JCQkJCQlcCisJfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBiZV90cmFjZV9zZXRfbGV2ZWwodW5zaWduZWQgaW50IGxldmVsKQoreworCXVuc2lnbmVkIGludCBvbGRfbGV2ZWwgPSB0cmFjZV9sZXZlbDsKKwl0cmFjZV9sZXZlbCA9IGxldmVsOworCXJldHVybiBvbGRfbGV2ZWw7Cit9CisKKyNkZWZpbmUgYmVfdHJhY2VfZ2V0X2xldmVsKCkgCXRyYWNlX2xldmVsCisvKgorICogUmV0dXJucyBudW1iZXIgb2YgcGFnZXMgc3Bhbm5lZCBieSB0aGUgc2l6ZSBvZiBkYXRhCisgKiBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gYWRkcmVzcy4KKyAqLworI2RlZmluZSBQQUdFU19TUEFOTkVEKF9hZGRyZXNzLCBfc2l6ZSkgXAorICAgKCh1MzIpKCgoKHNpemVfdCkoX2FkZHJlc3MpICYgKFBBR0VfU0laRSAtIDEpKSArIFwKKwkJKF9zaXplKSArIChQQUdFX1NJWkUgLSAxKSkgPj4gUEFHRV9TSElGVCkpCisvKiBCeXRlIG9mZnNldCBpbnRvIHRoZSBwYWdlIGNvcnJlc3BvbmRpbmcgdG8gZ2l2ZW4gYWRkcmVzcyAqLworI2RlZmluZSBPRkZTRVRfSU5fUEFHRShfYWRkcl8pICgoc2l6ZV90KShfYWRkcl8pICYgKFBBR0VfU0laRS0xKSkKKworLyoKKyAqIGNpcmN1bGFyIHN1YnRyYWN0LgorICogUmV0dXJucyBhIC0gYiBhc3N1bWluZyBhIGNpcmN1bGFyIG51bWJlciBzeXN0ZW0sIHdoZXJlIGEgYW5kIGIgYXJlCisgKiBpbiByYW5nZSAoMCwgbWF4VmFsdWUtMSkuIElmIGE9PWIsIHplcm8gaXMgcmV0dXJuZWQgc28gdGhlCisgKiBoaWdoZXN0IHZhbHVlIHBvc3NpYmxlIHdpdGggdGhpcyBzdWJ0cmFjdGlvbiBpcyBtYXhWYWx1ZS0xLgorICovCitzdGF0aWMgaW5saW5lIHUzMiBiZV9zdWJjKHUzMiBhLCB1MzIgYiwgdTMyIG1heCkKK3sKKwlBU1NFUlQoYSA8PSBtYXggJiYgYiA8PSBtYXgpOworCUFTU0VSVChtYXggPiAwKTsKKwlyZXR1cm4gYSA+PSBiID8gKGEgLSBiKSA6IChtYXggLSBiICsgYSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGJlX2FkZGModTMyIGEsIHUzMiBiLCB1MzIgbWF4KQoreworCUFTU0VSVChhIDwgbWF4KTsKKwlBU1NFUlQobWF4ID4gMCk7CisJcmV0dXJuIChtYXggLSBhID4gYikgPyAoYSArIGIpIDogKGIgKyBhIC0gbWF4KTsKK30KKworLyogZGVzY3JpcHRvciBmb3IgYSBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgbWVtb3J5IHVzZWQgZm9yIHJpbmcgKi8KK3N0cnVjdCByaW5nX2Rlc2MgeworCXUzMiBsZW5ndGg7CS8qIGxlbmd0aCBpbiBieXRlcyAqLworCXZvaWQgKnZhOyAJLyogdmlydHVhbCBhZGRyZXNzICovCisJdTY0IHBhOwkJLyogYnVzIGFkZHJlc3MgKi8KK30gOworCisvKgorICogVGhpcyBzdHJ1Y3R1cmUgc3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IGEgcmluZyBzaGFyZWQgYmV0d2VlbiBoYXJkd2FyZQorICogYW5kIHNvZnR3YXJlLiAgRWFjaCByaW5nIGlzIGFsbG9jYXRlZCBieSB0aGUgZHJpdmVyIGluIHRoZSB1bmNhY2hlZAorICogZXh0ZW5zaW9uIGFuZCBtYXBwZWQgaW50byBCbGFkZUVuZ2luZSdzIHVuaWZpZWQgdGFibGUuCisgKi8KK3N0cnVjdCBtcF9yaW5nIHsKKwl1MzIgcGFnZXM7CQkvKiBxdWV1ZSBzaXplIGluIHBhZ2VzICovCisJdTMyIGlkOwkJCS8qIHF1ZXVlIGlkIGFzc2lnbmVkIGJ5IGJla2xpYiAqLworCXUzMiBudW07CQkvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gcXVldWUgKi8KKwl1MzIgY2lkeDsJCS8qIGNvbnN1bWVyIGluZGV4ICovCisJdTMyIHBpZHg7CQkvKiBwcm9kdWNlciBpbmRleCAtLSBub3QgdXNlZCBieSBtb3N0IHJpbmdzICovCisJdTMyIGl0ZW1TaXplOwkJLyogc2l6ZSBpbiBieXRlcyBvZiBvbmUgb2JqZWN0ICovCisKKwl2b2lkICp2YTsJCS8qIFRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIHJpbmcuCisJCQkJICAgVGhpcyBzaG91bGQgYmUgbGFzdCB0byBhbGxvdyAzMiAmIDY0CisJCQkJICAgYml0IGRlYnVnZ2VyIGV4dGVuc2lvbnMgdG8gd29yay4gKi8KK30gOworCisvKi0tLS0tLS0tLS0tICBhbWFwIGJpdCBmaWxlZCBnZXQgLyBzZXQgbWFjcm9zIGFuZCBmdW5jdGlvbnMgLS0tLS0qLworLyoKKyAqIFN0cnVjdHVyZXMgZGVmaW5lZCBpbiB0aGUgbWFwIGhlYWRlciBmaWxlcyAodW5kZXIgZncvYW1hcC8pIHdpdGggbmFtZXMKKyAqIGluIHRoZSBmb3JtYXQgQkVfPG5hbWU+X0FNQVAgYXJlIHBzZXVkbyBzdHJ1Y3R1cmVzIHdpdGggbWVtYmVycworICogb2YgdHlwZSB1OC4gVGhlc2Ugc3RydWN0dXJlcyBhcmUgdGVtcGxhdGVzIHRoYXQgYXJlIHVzZWQgaW4KKyAqIGNvbmp1bnRpb24gd2l0aCB0aGUgc3RydWN0dXJlcyB3aXRoIG5hbWVzIGluIHRoZSBmb3JtYXQKKyAqIDxuYW1lPl9BTUFQIHRvIGNhbGN1bGF0ZSB0aGUgYml0IG1hc2tzIGFuZCBiaXQgb2Zmc2V0cyB0byBnZXQgb3Igc2V0CisgKiBiaXQgZmllbGRzIGluIHN0cnVjdHVyZXMuIFRoZSBzdHJ1Y3R1cmVzIDxuYW1lPl9BTUFQIGFyZSBhcnJheXMKKyAqIG9mIDMyIGJpdHMgd29yZHMgYW5kIGhhdmUgdGhlIGNvcnJlY3Qgc2l6ZS4gIFRoZSBmb2xsb3dpbmcgbWFjcm9zCisgKiBwcm92aWRlIGNvbnZlbmllbnQgd2F5cyB0byBnZXQgYW5kIHNldCB0aGUgdmFyaW91cyBtZW1iZXJzCisgKiBpbiB0aGUgc3RydWN0dXJlcyB3aXRob3V0IHVzaW5nIHN0cnVjY3R1cmVzIHdpdGggYml0IGZpZWxkcy4KKyAqIEFsd2F5cyB1c2UgdGhlIG1hY3JvcyBBTUFQX0dFVF9CSVRTX1BUUiBhbmQgQU1BUF9TRVRfQklUU19QVFIKKyAqIG1hY3JvcyB0byBleHRyYWN0IGFuZCBzZXQgdmFyaW91cyBtZW1iZXJzLgorICovCisKKy8qCisgKiBSZXR1cm5zIHRoZSBhIGJpdCBtYXNrIGZvciB0aGUgcmVnaXN0ZXIgdGhhdCBpcyBOT1Qgc2hpZnRlZCBpbnRvIGxvY2F0aW9uLgorICogVGhhdCBtZWFucyByZXR1cm4gdmFsdWVzIGFsd2F5cyBsb29rIGxpa2U6IDB4MSwgMHhGRiwgMHg3RkYsIGV0Yy4uLgorICovCitzdGF0aWMgaW5saW5lIHUzMiBhbWFwX21hc2sodTMyIGJpdF9zaXplKQoreworCXJldHVybiBiaXRfc2l6ZSA9PSAzMiA/IDB4RkZGRkZGRkYgOiAoMSA8PCBiaXRfc2l6ZSkgLSAxOworfQorCisjZGVmaW5lIEFNQVBfQklUX01BU0soX3N0cnVjdF8sIGZpZWxkKSAgICAgICBcCisJYW1hcF9tYXNrKEFNQVBfQklUX1NJWkUoX3N0cnVjdF8sIGZpZWxkKSkKKworLyoKKyAqIG5vbi1vcHRpbWl6ZWQgc2V0IGJpdHMgZnVuY3Rpb24uIEZpcnN0IGNsZWFycyB0aGUgYml0cyBhbmQgdGhlbiBhc3NpZ25zIHRoZW0uCisgKiBUaGlzIGRvZXMgbm90IHJlcXVpcmUga25vd2xlZGdlIG9mIHRoZSBwYXJ0aWN1bGFyIERXT1JEIHlvdSBhcmUgc2V0dGluZy4KKyAqIGUuZy4gQU1BUF9TRVRfQklUU19QVFIgKHN0cnVjdCwgZmllbGQxLCAmY29udGV4dE1lbW9yeSwgMTIzKTsKKyAqLworc3RhdGljIGlubGluZSB2b2lkCithbWFwX3NldCh2b2lkICpwdHIsIHUzMiBkd19vZmZzZXQsIHUzMiBtYXNrLCB1MzIgb2Zmc2V0LCB1MzIgdmFsdWUpCit7CisJdTMyICpkdyA9ICh1MzIgKilwdHI7CisJKihkdyArIGR3X29mZnNldCkgJj0gfihtYXNrIDw8IG9mZnNldCk7CisJKihkdyArIGR3X29mZnNldCkgfD0gKG1hc2sgJiB2YWx1ZSkgPDwgb2Zmc2V0OworfQorCisjZGVmaW5lIEFNQVBfU0VUX0JJVFNfUFRSKF9zdHJ1Y3RfLCBmaWVsZCwgX3N0cnVjdFB0cl8sIHZhbCkJXAorCWFtYXBfc2V0KF9zdHJ1Y3RQdHJfLCBBTUFQX1dPUkRfT0ZGU0VUKF9zdHJ1Y3RfLCBmaWVsZCksXAorCQlBTUFQX0JJVF9NQVNLKF9zdHJ1Y3RfLCBmaWVsZCksCQkJXAorCQlBTUFQX0JJVF9PRkZTRVQoX3N0cnVjdF8sIGZpZWxkKSwgdmFsKQorLyoKKyAqIE5vbi1vcHRpbWl6ZWQgcm91dGluZSB0aGF0IGdldHMgdGhlIGJpdHMgd2l0aG91dCBrbm93aW5nIHRoZSBjb3JyZWN0IERXT1JELgorICogZS5nLiBmaWVsZFZhbHVlID0gQU1BUF9HRVRfQklUU19QVFIgKHN0cnVjdCwgZmllbGQxLCAmY29udGV4dE1lbW9yeSk7CisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyCithbWFwX2dldCh2b2lkICpwdHIsIHUzMiBkd19vZmZzZXQsIHUzMiBtYXNrLCB1MzIgb2Zmc2V0KQoreworCXUzMiAqZHcgPSAodTMyICopcHRyOworCXJldHVybiBtYXNrICYgKCooZHcgKyBkd19vZmZzZXQpID4+IG9mZnNldCk7Cit9CisjZGVmaW5lIEFNQVBfR0VUX0JJVFNfUFRSKF9zdHJ1Y3RfLCBmaWVsZCwgX3N0cnVjdFB0cl8pCQkJXAorCWFtYXBfZ2V0KF9zdHJ1Y3RQdHJfLCBBTUFQX1dPUkRfT0ZGU0VUKF9zdHJ1Y3RfLCBmaWVsZCksCVwKKwkJQU1BUF9CSVRfTUFTSyhfc3RydWN0XywgZmllbGQpLAkJCQlcCisJCUFNQVBfQklUX09GRlNFVChfc3RydWN0XywgZmllbGQpKQorCisvKiBSZXR1cm5zIDAtMzEgcmVwcmVzZW50aW5nIGJpdCBvZmZzZXQgd2l0aGluIGEgRFdPUkQgb2YgYSBiaXRmaWVsZC4gKi8KKyNkZWZpbmUgQU1BUF9CSVRfT0ZGU0VUKF9zdHJ1Y3RfLCBmaWVsZCkgICAgICAgICAgICAgICAgICBcCisJKG9mZnNldG9mKHN0cnVjdCBCRV8gIyMgX3N0cnVjdF8gIyMgX0FNQVAsIGZpZWxkKSAlIDMyKQorCisvKiBSZXR1cm5zIDAtbiByZXByZXNlbnRpbmcgRFdPUkQgb2Zmc2V0IG9mIGJpdGZpZWxkIHdpdGhpbiB0aGUgc3RydWN0dXJlLiAqLworI2RlZmluZSBBTUFQX1dPUkRfT0ZGU0VUKF9zdHJ1Y3RfLCBmaWVsZCkgIFwKKwkJICAob2Zmc2V0b2Yoc3RydWN0IEJFXyAjIyBfc3RydWN0XyAjIyBfQU1BUCwgZmllbGQpLzMyKQorCisvKiBSZXR1cm5zIHNpemUgb2YgYml0ZmllbGQgaW4gYml0cy4gKi8KKyNkZWZpbmUgQU1BUF9CSVRfU0laRShfc3RydWN0XywgZmllbGQpIFwKKwkJc2l6ZW9mKCgoc3RydWN0IEJFXyAjIyBfc3RydWN0XyAjIyBfQU1BUCopMCktPmZpZWxkKQorCitzdHJ1Y3QgYmVfbWNjX3dyYl9yZXNwb25zZV9jb3B5IHsKKwl1MTYgbGVuZ3RoOwkJLyogYnl0ZXMgaW4gcmVzcG9uc2UgKi8KKwl1MTYgZndjbWRfb2Zmc2V0OwkvKiBvZmZzZXQgd2l0aGluIHRoZSB3cmIgb2YgdGhlIHJlc3BvbnNlICovCisJdm9pZCAqdmE7CQkvKiB1c2VyJ3MgdmEgdG8gY29weSByZXNwb25zZSBpbnRvICovCisKK30gOwordHlwZWRlZiB2b2lkICgqbWNjX3dyYl9jcWVfY2FsbGJhY2spICh2b2lkICpjb250ZXh0LCBpbnQgc3RhdHVzLAorCQkJCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKm9wdGlvbmFsX3dyYik7CitzdHJ1Y3QgYmVfbWNjX3dyYl9jb250ZXh0IHsKKworCW1jY193cmJfY3FlX2NhbGxiYWNrIGludGVybmFsX2NiOwkvKiBGdW5jdGlvbiB0byBjYWxsIG9uCisJCQkJCQljb21wbGV0aW9uICovCisJdm9pZCAqaW50ZXJuYWxfY2JfY29udGV4dDsJLyogUGFyYW1ldGVyIHRvIHBhc3MKKwkJCQkJCSAgIHRvIGNvbXBsZXRpb24gZnVuY3Rpb24gKi8KKworCW1jY193cmJfY3FlX2NhbGxiYWNrIGNiOwkvKiBGdW5jdGlvbiB0byBjYWxsIG9uIGNvbXBsZXRpb24gKi8KKwl2b2lkICpjYl9jb250ZXh0OwkvKiBQYXJhbWV0ZXIgdG8gcGFzcyB0byBjb21wbGV0aW9uIGZ1bmN0aW9uICovCisKKwlpbnQgKnVzZXJzX2ZpbmFsX3N0YXR1czsJLyogcG9pbnRlciB0byBhIGxvY2FsCisJCQkJCQl2YXJpYWJsZSBmb3Igc3luY2hyb25vdXMKKwkJCQkJCWNvbW1hbmRzICovCisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiOwkvKiBwb2ludGVyIHRvIG9yaWdpbmFsIHdyYiBmb3IgZW1iZWRkZWQKKwkJCQkJCWNvbW1hbmRzIG9ubHkgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIG5leHQ7CS8qIGxpbmtzIGNvbnRleHQgc3RydWN0cyB0b2dldGhlciBpbgorCQkJCSAgIGZyZWUgbGlzdCAqLworCisJc3RydWN0IGJlX21jY193cmJfcmVzcG9uc2VfY29weSBjb3B5OwkvKiBPcHRpb25hbCBwYXJhbWV0ZXJzIHRvIGNvcHkKKwkJCQkJICAgZW1iZWRkZWQgcmVzcG9uc2UgdG8gdXNlcidzIHZhICovCisKKyNpZiBkZWZpbmVkKEJFX0RFQlVHKQorCXUxNiBzdWJzeXN0ZW0sIG9wY29kZTsJLyogVHJhY2sgdGhpcyBGV0NNRCBmb3IgZGVidWcgYnVpbGRzLiAqLworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKnJpbmdfd3JiOworCXUzMiBjb25zdW1lZF9jb3VudDsKKyNlbmRpZgorfSA7CisKKy8qCisgICAgUmVwcmVzZW50cyBhIGZ1bmN0aW9uIG9iamVjdCBmb3IgbmV0d29yayBvciBzdG9yYWdlLiAgVGhpcworICAgIGlzIHVzZWQgdG8gbWFuYWdlIHBlci1mdW5jdGlvbiByZXNvdXJjZXMgbGlrZSBNQ0MgQ1FzLCBldGMuCisqLworc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCB7CisKKwl1MzIgbWFnaWM7CQkvKiE8IG1hZ2ljIGZvciBkZXRlY3RpbmcgbWVtb3J5IGNvcnJ1cHRpb24uICovCisKKwkvKiBQQ0kgQkFSIG1hcHBlZCBhZGRyZXNzZXMgKi8KKwl1OCBfX2lvbWVtICpjc3JfdmE7CS8qIENTUiAqLworCXU4IF9faW9tZW0gKmRiX3ZhOwkvKiBEb29yIEJlbGwgKi8KKwl1OCBfX2lvbWVtICpwY2lfdmE7CS8qIFBDSSBjb25maWcgc3BhY2UgKi8KKwl1MzIgZW11bGF0ZTsJCS8qIGlmIHNldCwgTVBVIGlzIG5vdCBhdmFpbGFibGUuCisJCQkJICBFbXVsYXRlIGV2ZXJ5dGhpbmcuICAgICAqLworCXUzMiBwZW5kX3F1ZXVlX2RyaXZpbmc7CS8qIGlmIHNldCwgZHJpdmUgdGhlIHF1ZXVlZCBXUkJzCisJCQkJICAgYWZ0ZXIgcmVsZWFzaW5nIHRoZSBXUkIgbG9jayAqLworCisJc3BpbmxvY2tfdCBwb3N0X2xvY2s7CS8qIGxvY2sgZm9yIHZlcmlmeWluZyBvbmUgdGhyZWFkIHBvc3Rpbmcgd3JicyAqLworCXNwaW5sb2NrX3QgY3FfbG9jazsJLyogbG9jayBmb3IgdmVyaWZ5aW5nIG9uZSB0aHJlYWQKKwkJCQkgICBwcm9jZXNzaW5nIGNxICovCisJc3BpbmxvY2tfdCBtY2NfY29udGV4dF9sb2NrOwkvKiBsb2NrIGZvciBwcm90ZWN0aW5nIG1jYworCQkJCQkgICBjb250ZXh0IGZyZWUgbGlzdCAqLworCXVuc2lnbmVkIGxvbmcgcG9zdF9pcnE7CisJdW5zaWduZWQgbG9uZyBjcV9pcnE7CisKKwl1MzIgdHlwZTsKKwl1MzIgcGNpX2Z1bmN0aW9uX251bWJlcjsKKworCXN0cnVjdCBiZV9tY2Nfb2JqZWN0ICptY2M7CS8qIG1jYyByaW5ncy4gKi8KKworCXN0cnVjdCB7CisJCXN0cnVjdCBNQ0NfTUFJTEJPWF9BTUFQICp2YTsJLyogVkEgdG8gdGhlIG1haWxib3ggKi8KKwkJdTY0IHBhOwkvKiBQQSB0byB0aGUgbWFpbGJveCAqLworCQl1MzIgbGVuZ3RoOwkvKiBieXRlIGxlbmd0aCBvZiBtYWlsYm94ICovCisKKwkJLyogT25lIGRlZmF1bHQgY29udGV4dCBzdHJ1Y3QgdXNlZCBmb3IgcG9zdGluZyBhdAorCQkgKiBsZWFzdCBvbmUgTUNDX1dSQgorCQkgKi8KKwkJc3RydWN0IGJlX21jY193cmJfY29udGV4dCBkZWZhdWx0X2NvbnRleHQ7CisJCWJvb2wgZGVmYXVsdF9jb250ZXh0X2FsbG9jYXRlZDsKKwl9IG1haWxib3g7CisKKwlzdHJ1Y3QgeworCisJCS8qIFdha2Ugb24gbGFucyBjb25maWd1cmVkLiAqLworCQl1MzIgd29sX2JpdG1hc2s7CS8qIGJpdHMgMCwxLDIsMyBhcmUgc2V0IGlmCisJCQkJCSAgIGNvcnJlc3BvbmRpbmcgaW5kZXggaXMgZW5hYmxlZCAqLworCX0gY29uZmlnOworCisKKwlzdHJ1Y3QgQkVfRklSTVdBUkVfQ09ORklHIGZ3X2NvbmZpZzsKK30gOworCisvKgorICAgICAgUmVwcmVzZW50cyBhbiBFdmVudCBRdWV1ZQorKi8KK3N0cnVjdCBiZV9lcV9vYmplY3QgeworCXUzMiBtYWdpYzsKKwlhdG9taWNfdCByZWZfY291bnQ7CisKKwlzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwYXJlbnRfZnVuY3Rpb247CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGVxX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBjcV9saXN0X2hlYWQ7CisKKwl1MzIgZXFfaWQ7CisJdm9pZCAqY2JfY29udGV4dDsKKworfSA7CisKKy8qCisgICAgTWFuYWdlcyBhIGNvbXBsZXRpb24gcXVldWUKKyovCitzdHJ1Y3QgYmVfY3Ffb2JqZWN0IHsKKwl1MzIgbWFnaWM7CisJYXRvbWljX3QgcmVmX2NvdW50OworCisJc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGFyZW50X2Z1bmN0aW9uOworCXN0cnVjdCBiZV9lcV9vYmplY3QgKmVxX29iamVjdDsKKworCXN0cnVjdCBsaXN0X2hlYWQgY3FfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNxbGlzdF9mb3JfZXE7CisKKwl2b2lkICp2YTsKKwl1MzIgbnVtX2VudHJpZXM7CisKKwl2b2lkICpjYl9jb250ZXh0OworCisJdTMyIGNxX2lkOworCit9IDsKKworLyoKKyAgICBNYW5hZ2VzIGFuIGV0aGVybmV0IHNlbmQgcXVldWUKKyovCitzdHJ1Y3QgYmVfZXRoc3Ffb2JqZWN0IHsKKwl1MzIgbWFnaWM7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwlzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwYXJlbnRfZnVuY3Rpb247CisJc3RydWN0IGJlX2NxX29iamVjdCAqY3Ffb2JqZWN0OworCXUzMiBiaWQ7CisKK30gOworCisvKgorQGJyaWVmCisgICAgTWFuYWdlcyBhbiBldGhlcm5ldCByZWNlaXZlIHF1ZXVlCisqLworc3RydWN0IGJlX2V0aHJxX29iamVjdCB7CisJdTMyIG1hZ2ljOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwYXJlbnRfZnVuY3Rpb247CisJdTMyIHJpZDsKKwlzdHJ1Y3QgYmVfY3Ffb2JqZWN0ICpjcV9vYmplY3Q7CisJc3RydWN0IGJlX2NxX29iamVjdCAqcnNzX2NxX29iamVjdFs0XTsKKworfSA7CisKKy8qCisgICAgTWFuYWdlcyBhbiBNQ0MKKyovCit0eXBlZGVmIHZvaWQgKCptY2NfYXN5bmNfZXZlbnRfY2FsbGJhY2spICh2b2lkICpjb250ZXh0LCB1MzIgZXZlbnRfY29kZSwKKwkJCQl2b2lkICpldmVudCk7CitzdHJ1Y3QgYmVfbWNjX29iamVjdCB7CisJdTMyIG1hZ2ljOworCisJc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGFyZW50X2Z1bmN0aW9uOworCXN0cnVjdCBsaXN0X2hlYWQgbWNjX2xpc3Q7CisKKwlzdHJ1Y3QgYmVfY3Ffb2JqZWN0ICpjcV9vYmplY3Q7CisKKwkvKiBBc3luYyBldmVudCBjYWxsYmFjayBmb3IgTUNDIENRLiAqLworCW1jY19hc3luY19ldmVudF9jYWxsYmFjayBhc3luY19jYjsKKwl2b2lkICphc3luY19jb250ZXh0OworCisJc3RydWN0IHsKKwkJc3RydWN0IGJlX21jY193cmJfY29udGV4dCAqYmFzZTsKKwkJdTMyIG51bTsKKwkJc3RydWN0IGxpc3RfaGVhZCBsaXN0X2hlYWQ7CisJfSB3cmJfY29udGV4dDsKKworCXN0cnVjdCB7CisJCXN0cnVjdCByaW5nX2Rlc2MgKnJkOworCQlzdHJ1Y3QgbXBfcmluZyByaW5nOworCX0gc3E7CisKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgbXBfcmluZyByaW5nOworCX0gY3E7CisKKwl1MzIgcHJvY2Vzc2luZzsJCS8qIGZsYWcgaW5kaWNhdGluZyB0aGF0IG9uZSB0aHJlYWQKKwkJCQkgICBpcyBwcm9jZXNzaW5nIENRICovCisJdTMyIHJlYXJtOwkJLyogZG9vcmJlbGwgcmVhcm0gc2V0dGluZyB0byBtYWtlCisJCQkJICAgc3VyZSB0aGUgYWN0aXZlIHByb2Nlc3NpbmcgdGhyZWFkICovCisJLyogcmVhcm1zIHRoZSBDUSBpZiBhbnkgb2YgdGhlIHRocmVhZHMgcmVxdWVzdGVkIGl0LiAqLworCisJc3RydWN0IGxpc3RfaGVhZCBiYWNrbG9nOworCXUzMiBiYWNrbG9nX2xlbmd0aDsKKwl1MzIgZHJpdmluZ19iYWNrbG9nOworCXUzMiBjb25zdW1lZF9pbmRleDsKKworfSA7CisKKworLyogUXVldWUgY29udGV4dCBoZWFkZXIgLS0gdGhlIHJlcXVpcmVkIHNvZnR3YXJlIGluZm9ybWF0aW9uIGZvcgorICogcXVldWVpbmcgYSBXUkIuCisgKi8KK3N0cnVjdCBiZV9xdWV1ZV9kcml2ZXJfY29udGV4dCB7CisJbWNjX3dyYl9jcWVfY2FsbGJhY2sgaW50ZXJuYWxfY2I7CS8qIEZ1bmN0aW9uIHRvIGNhbGwgb24KKwkJCQkJCSAgIGNvbXBsZXRpb24gKi8KKwl2b2lkICppbnRlcm5hbF9jYl9jb250ZXh0OwkvKiBQYXJhbWV0ZXIgdG8gcGFzcworCQkJCQkJICAgdG8gY29tcGxldGlvbiBmdW5jdGlvbiAqLworCisJbWNjX3dyYl9jcWVfY2FsbGJhY2sgY2I7CS8qIEZ1bmN0aW9uIHRvIGNhbGwgb24gY29tcGxldGlvbiAqLworCXZvaWQgKmNiX2NvbnRleHQ7CS8qIFBhcmFtZXRlciB0byBwYXNzIHRvIGNvbXBsZXRpb24gZnVuY3Rpb24gKi8KKworCXN0cnVjdCBiZV9tY2Nfd3JiX3Jlc3BvbnNlX2NvcHkgY29weTsJLyogT3B0aW9uYWwgcGFyYW1ldGVycyB0byBjb3B5CisJCQkJCSAgIGVtYmVkZGVkIHJlc3BvbnNlIHRvIHVzZXIncyB2YSAqLworCXZvaWQgKm9wdGlvbmFsX2Z3Y21kX3ZhOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1MzIgYnl0ZXM7Cit9IDsKKworLyoKKyAqIENvbW1vbiBNQ0MgV1JCIGhlYWRlciB0aGF0IGFsbCBjb21tYW5kcyByZXF1aXJlLgorICovCitzdHJ1Y3QgYmVfbWNjX3dyYl9oZWFkZXIgeworCXU4IHJzdmRbb2Zmc2V0b2Yoc3RydWN0IEJFX01DQ19XUkJfQU1BUCwgcGF5bG9hZCkvOF07Cit9IDsKKworLyoKKyAqIEFsbCBub24gZW1iZWRkZWQgY29tbWFuZHMgc3VwcG9ydGVkIGJ5IGh3bGliIGZ1bmN0aW9ucyBvbmx5IGFsbG93CisgKiAxIFNHRS4gIFRoaXMgcXVldWUgY29udGV4dCBoYW5kbGVzIHRoZW0gYWxsLgorICovCitzdHJ1Y3QgYmVfbm9uZW1iZWRkZWRfcV9jdHh0IHsKKwlzdHJ1Y3QgYmVfcXVldWVfZHJpdmVyX2NvbnRleHQgY29udGV4dDsKKwlzdHJ1Y3QgYmVfbWNjX3dyYl9oZWFkZXIgd3JiX2hlYWRlcjsKKwlzdHJ1Y3QgTUNDX1NHRV9BTUFQIHNnZVsxXTsKK30gOworCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSBzcGVjaWZpYyBxdWV1ZSBzdHJ1Y3QgZm9yIGVhY2ggY29tbWFuZC4KKyAqICBUaGUgdXNlciBjb3VsZCBhbHdheXMgcHJvdmlkZSBhIGJlX2dlbmVyaWNfcV9jdHh0IGJ1dCB0aGlzIGlzIGEKKyAqICByYXRoZXIgbGFyZ2Ugc3RydWN0LiAgQnkgdXNpbmcgdGhlIHNwZWNpZmljIHN0cnVjdCwgbWVtb3J5IGNvbnN1bXB0aW9uCisgKiAgY2FuIGJlIHJlZHVjZWQuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCitzdHJ1Y3QgYmVfbGlua19zdGF0dXNfcV9jdHh0IHsKKwlzdHJ1Y3QgYmVfcXVldWVfZHJpdmVyX2NvbnRleHQgY29udGV4dDsKKwlzdHJ1Y3QgYmVfbWNjX3dyYl9oZWFkZXIgd3JiX2hlYWRlcjsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX05UV0tfTElOS19TVEFUVVNfUVVFUlkgZndjbWQ7Cit9IDsKKworc3RydWN0IGJlX211bHRpY2FzdF9xX2N0eHQgeworCXN0cnVjdCBiZV9xdWV1ZV9kcml2ZXJfY29udGV4dCBjb250ZXh0OworCXN0cnVjdCBiZV9tY2Nfd3JiX2hlYWRlciB3cmJfaGVhZGVyOworCXN0cnVjdCBGV0NNRF9DT01NT05fTlRXS19NVUxUSUNBU1RfU0VUIGZ3Y21kOworfSA7CisKKworc3RydWN0IGJlX3ZsYW5fcV9jdHh0IHsKKwlzdHJ1Y3QgYmVfcXVldWVfZHJpdmVyX2NvbnRleHQgY29udGV4dDsKKwlzdHJ1Y3QgYmVfbWNjX3dyYl9oZWFkZXIgd3JiX2hlYWRlcjsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX05UV0tfVkxBTl9DT05GSUcgZndjbWQ7Cit9IDsKKworc3RydWN0IGJlX3Byb21pc2N1b3VzX3FfY3R4dCB7CisJc3RydWN0IGJlX3F1ZXVlX2RyaXZlcl9jb250ZXh0IGNvbnRleHQ7CisJc3RydWN0IGJlX21jY193cmJfaGVhZGVyIHdyYl9oZWFkZXI7CisJc3RydWN0IEZXQ01EX0VUSF9QUk9NSVNDVU9VUyBmd2NtZDsKK30gOworCitzdHJ1Y3QgYmVfZm9yY2VfZmFpbG92ZXJfcV9jdHh0IHsKKwlzdHJ1Y3QgYmVfcXVldWVfZHJpdmVyX2NvbnRleHQgY29udGV4dDsKKwlzdHJ1Y3QgYmVfbWNjX3dyYl9oZWFkZXIgd3JiX2hlYWRlcjsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0ZPUkNFX0ZBSUxPVkVSIGZ3Y21kOworfSA7CisKKworc3RydWN0IGJlX3J4Zl9maWx0ZXJfcV9jdHh0IHsKKwlzdHJ1Y3QgYmVfcXVldWVfZHJpdmVyX2NvbnRleHQgY29udGV4dDsKKwlzdHJ1Y3QgYmVfbWNjX3dyYl9oZWFkZXIgd3JiX2hlYWRlcjsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX05UV0tfUlhfRklMVEVSIGZ3Y21kOworfSA7CisKK3N0cnVjdCBiZV9lcV9tb2RpZnlfZGVsYXlfcV9jdHh0IHsKKwlzdHJ1Y3QgYmVfcXVldWVfZHJpdmVyX2NvbnRleHQgY29udGV4dDsKKwlzdHJ1Y3QgYmVfbWNjX3dyYl9oZWFkZXIgd3JiX2hlYWRlcjsKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX01PRElGWV9FUV9ERUxBWSBmd2NtZDsKK30gOworCisvKgorICogVGhlIGdlbmVyaWMgY29udGV4dCBpcyB0aGUgbGFyZ2VzdCBzaXplIHRoYXQgd291bGQgYmUgcmVxdWlyZWQuCisgKiBJdCBpcyB0aGUgc29mdHdhcmUgY29udGV4dCBwbHVzIGFuIGVudGlyZSBXUkIuCisgKi8KK3N0cnVjdCBiZV9nZW5lcmljX3FfY3R4dCB7CisJc3RydWN0IGJlX3F1ZXVlX2RyaXZlcl9jb250ZXh0IGNvbnRleHQ7CisJc3RydWN0IGJlX21jY193cmJfaGVhZGVyIHdyYl9oZWFkZXI7CisJc3RydWN0IE1DQ19XUkJfUEFZTE9BRF9BTUFQIHBheWxvYWQ7Cit9IDsKKworLyoKKyAqIFR5cGVzIGZvciB0aGUgQkVfUVVFVUVfQ09OVEVYVCBvYmplY3QuCisgKi8KKyNkZWZpbmUgQkVfUVVFVUVfSU5WQUxJRAkoMCkKKyNkZWZpbmUgQkVfUVVFVUVfTElOS19TVEFUVVMJKDB4QTAwNikKKyNkZWZpbmUgQkVfUVVFVUVfRVRIX1NUQVRTCSgweEEwMDcpCisjZGVmaW5lIEJFX1FVRVVFX1RQTV9TVEFUUwkoMHhBMDA4KQorI2RlZmluZSBCRV9RVUVVRV9UQ1BfU1RBVFMJKDB4QTAwOSkKKyNkZWZpbmUgQkVfUVVFVUVfTVVMVElDQVNUCSgweEEwMEEpCisjZGVmaW5lIEJFX1FVRVVFX1ZMQU4JCSgweEEwMEIpCisjZGVmaW5lIEJFX1FVRVVFX1JTUwkJKDB4QTAwQykKKyNkZWZpbmUgQkVfUVVFVUVfRk9SQ0VfRkFJTE9WRVIJKDB4QTAwRCkKKyNkZWZpbmUgQkVfUVVFVUVfUFJPTUlTQ1VPVVMJKDB4QTAwRSkKKyNkZWZpbmUgQkVfUVVFVUVfV0FLRV9PTl9MQU4JKDB4QTAwRikKKyNkZWZpbmUgQkVfUVVFVUVfTk9QCQkoMHhBMDEwKQorCisvKiAtLS0gQkVfRlVOQ1RJT05fRU5VTSAtLS0gKi8KKyNkZWZpbmUgQkVfRlVOQ1RJT05fVFlQRV9JU0NTSSAgICAgICAgICAoMCkKKyNkZWZpbmUgQkVfRlVOQ1RJT05fVFlQRV9ORVRXT1JLICAgICAgICAoMSkKKyNkZWZpbmUgQkVfRlVOQ1RJT05fVFlQRV9BUk0gICAgICAgICAgICAoMikKKworLyogLS0tIEJFX0VUSF9UWF9SSU5HX1RZUEVfRU5VTSAtLS0gKi8KKyNkZWZpbmUgQkVfRVRIX1RYX1JJTkdfVFlQRV9GT1JXQVJESU5HICAoMSkgCS8qIEV0aGVyIHJpbmcgZm9yIGZvcndhcmRpbmcgKi8KKyNkZWZpbmUgQkVfRVRIX1RYX1JJTkdfVFlQRV9TVEFOREFSRCAgICAoMikJLyogRXRoZXIgcmluZyBmb3Igc2VuZGluZyAqLworCQkJCQkJLyogbmV0d29yayBwYWNrZXRzLiAqLworI2RlZmluZSBCRV9FVEhfVFhfUklOR19UWVBFX0JPVU5EICAgICAgICgzKQkvKiBFdGhlcm5ldCByaW5nIGZvciBzZW5kaW5nICovCisJCQkJCQkvKiBuZXR3b3JrIHBhY2tldHMsIGJvdW5kICovCisJCQkJCQkvKiB0byBhIHBoeXNpY2FsIHBvcnQuICovCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICBBUEkgTUFDUk9TCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNkZWZpbmUgQkVfRldDTURfTkFNRShfc2hvcnRfbmFtZV8pICAgICBzdHJ1Y3QgRldDTURfIyNfc2hvcnRfbmFtZV8KKyNkZWZpbmUgQkVfT1BDT0RFX05BTUUoX3Nob3J0X25hbWVfKSAgICBPUENPREVfIyNfc2hvcnRfbmFtZV8KKyNkZWZpbmUgQkVfU1VCU1lTVEVNX05BTUUoX3Nob3J0X25hbWVfKSBTVUJTWVNURU1fIyNfc2hvcnRfbmFtZV8KKworCisjZGVmaW5lIEJFX1BSRVBBUkVfRU1CRURERURfRldDTUQoX3Bmb2JfLCBfd3JiXywgX3Nob3J0X25hbWVfKQlcCisJKChCRV9GV0NNRF9OQU1FKF9zaG9ydF9uYW1lXykgKikJCQkJXAorCWJlX2Z1bmN0aW9uX3ByZXBhcmVfZW1iZWRkZWRfZndjbWQoX3Bmb2JfLCBfd3JiXywJXAorCQlzaXplb2YoQkVfRldDTURfTkFNRShfc2hvcnRfbmFtZV8pKSwJCVwKKwkJRklFTERfU0laRU9GKEJFX0ZXQ01EX05BTUUoX3Nob3J0X25hbWVfKSwgcGFyYW1zLnJlcXVlc3QpLCBcCisJCUZJRUxEX1NJWkVPRihCRV9GV0NNRF9OQU1FKF9zaG9ydF9uYW1lXyksIHBhcmFtcy5yZXNwb25zZSksIFwKKwkJQkVfT1BDT0RFX05BTUUoX3Nob3J0X25hbWVfKSwJCQkJXAorCQlCRV9TVUJTWVNURU1fTkFNRShfc2hvcnRfbmFtZV8pKSk7CisKKyNkZWZpbmUgQkVfUFJFUEFSRV9OT05FTUJFRERFRF9GV0NNRChfcGZvYl8sIF93cmJfLCBfaXZhXywgX2lwYV8sIF9zaG9ydF9uYW1lXylcCisJKChCRV9GV0NNRF9OQU1FKF9zaG9ydF9uYW1lXykgKikJCQkJXAorCWJlX2Z1bmN0aW9uX3ByZXBhcmVfbm9uZW1iZWRkZWRfZndjbWQoX3Bmb2JfLCBfd3JiXywgKF9pdmFfKSwgKF9pcGFfKSwgXAorCQlzaXplb2YoQkVfRldDTURfTkFNRShfc2hvcnRfbmFtZV8pKSwJCVwKKwkJRklFTERfU0laRU9GKEJFX0ZXQ01EX05BTUUoX3Nob3J0X25hbWVfKSwgcGFyYW1zLnJlcXVlc3QpLCBcCisJCUZJRUxEX1NJWkVPRihCRV9GV0NNRF9OQU1FKF9zaG9ydF9uYW1lXyksIHBhcmFtcy5yZXNwb25zZSksIFwKKwkJQkVfT1BDT0RFX05BTUUoX3Nob3J0X25hbWVfKSwJCQkJXAorCQlCRV9TVUJTWVNURU1fTkFNRShfc2hvcnRfbmFtZV8pKSk7CisKK2ludCBiZV9mdW5jdGlvbl9vYmplY3RfY3JlYXRlKHU4IF9faW9tZW0gKmNzcl92YSwgdTggX19pb21lbSAqZGJfdmEsCisJdTggX19pb21lbSAqcGNpX3ZhLCB1MzIgZnVuY3Rpb25fdHlwZSwgc3RydWN0IHJpbmdfZGVzYyAqbWFpbGJveF9yZCwKKwkgIHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IpOworCitpbnQgYmVfZnVuY3Rpb25fb2JqZWN0X2Rlc3Ryb3koc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYik7CitpbnQgYmVfZnVuY3Rpb25fY2xlYW51cChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iKTsKKworCitpbnQgYmVfZnVuY3Rpb25fZ2V0X2Z3X3ZlcnNpb24oc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwlzdHJ1Y3QgRldDTURfQ09NTU9OX0dFVF9GV19WRVJTSU9OX1JFU1BPTlNFX1BBWUxPQUQgKmZ3X3ZlcnNpb24sCisJbWNjX3dyYl9jcWVfY2FsbGJhY2sgY2IsIHZvaWQgKmNiX2NvbnRleHQpOworCisKK2ludCBiZV9lcV9tb2RpZnlfZGVsYXkoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJICAgdTMyIG51bV9lcSwgc3RydWN0IGJlX2VxX29iamVjdCAqKmVxX2FycmF5LAorCQkgICB1MzIgKmVxX2RlbGF5X2FycmF5LCBtY2Nfd3JiX2NxZV9jYWxsYmFjayBjYiwKKwkJICAgdm9pZCAqY2JfY29udGV4dCwKKwkJICAgc3RydWN0IGJlX2VxX21vZGlmeV9kZWxheV9xX2N0eHQgKnFfY3R4dCk7CisKKworCitpbnQgYmVfZXFfY3JlYXRlKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJICAgICBzdHJ1Y3QgcmluZ19kZXNjICpyZCwgdTMyIGVxZV9zaXplLCB1MzIgbnVtX2VudHJpZXMsCisJICAgICB1MzIgd2F0ZXJtYXJrLCB1MzIgdGltZXJfZGVsYXksIHN0cnVjdCBiZV9lcV9vYmplY3QgKmVxX29iamVjdCk7CisKK2ludCBiZV9lcV9kZXN0cm95KHN0cnVjdCBiZV9lcV9vYmplY3QgKmVxKTsKKworaW50IGJlX2NxX2NyZWF0ZShzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCXN0cnVjdCByaW5nX2Rlc2MgKnJkLCB1MzIgbGVuZ3RoLAorCWJvb2wgc29saWNpdGVkX2V2ZW50YWJsZSwgYm9vbCBub19kZWxheSwKKwl1MzIgd21fdGhyZXNoLCBzdHJ1Y3QgYmVfZXFfb2JqZWN0ICplcV9vYmplY3QsCisJc3RydWN0IGJlX2NxX29iamVjdCAqY3Ffb2JqZWN0KTsKKworaW50IGJlX2NxX2Rlc3Ryb3koc3RydWN0IGJlX2NxX29iamVjdCAqY3EpOworCitpbnQgYmVfbWNjX3JpbmdfY3JlYXRlKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCSAgIHN0cnVjdCByaW5nX2Rlc2MgKnJkLCB1MzIgbGVuZ3RoLAorCQkgICBzdHJ1Y3QgYmVfbWNjX3dyYl9jb250ZXh0ICpjb250ZXh0X2FycmF5LAorCQkgICB1MzIgbnVtX2NvbnRleHRfZW50cmllcywKKwkJICAgc3RydWN0IGJlX2NxX29iamVjdCAqY3EsIHN0cnVjdCBiZV9tY2Nfb2JqZWN0ICptY2MpOworaW50IGJlX21jY19yaW5nX2Rlc3Ryb3koc3RydWN0IGJlX21jY19vYmplY3QgKm1jY19vYmplY3QpOworCitpbnQgYmVfbWNjX3Byb2Nlc3NfY3Eoc3RydWN0IGJlX21jY19vYmplY3QgKm1jY19vYmplY3QsIGJvb2wgcmVhcm0pOworCitpbnQgYmVfbWNjX2FkZF9hc3luY19ldmVudF9jYWxsYmFjayhzdHJ1Y3QgYmVfbWNjX29iamVjdCAqbWNjX29iamVjdCwKKwkJbWNjX2FzeW5jX2V2ZW50X2NhbGxiYWNrIGNiLCB2b2lkICpjYl9jb250ZXh0KTsKKworaW50IGJlX3BjaV9zb2Z0X3Jlc2V0KHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IpOworCisKK2ludCBiZV9kcml2ZV9QT1NUKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IpOworCisKK2ludCBiZV9ldGhfc3FfY3JlYXRlKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCXN0cnVjdCByaW5nX2Rlc2MgKnJkLCB1MzIgbGVuZ3RoX2luX2J5dGVzLAorCQl1MzIgdHlwZSwgdTMyIHVscCwgc3RydWN0IGJlX2NxX29iamVjdCAqY3Ffb2JqZWN0LAorCQlzdHJ1Y3QgYmVfZXRoc3Ffb2JqZWN0ICpldGhfc3EpOworCitzdHJ1Y3QgYmVfZXRoX3NxX3BhcmFtZXRlcnMgeworCXUzMiBwb3J0OworCXUzMiByc3ZkMFsyXTsKK30gOworCitpbnQgYmVfZXRoX3NxX2NyZWF0ZV9leChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkgICAgc3RydWN0IHJpbmdfZGVzYyAqcmQsIHUzMiBsZW5ndGhfaW5fYnl0ZXMsCisJCSAgICB1MzIgdHlwZSwgdTMyIHVscCwgc3RydWN0IGJlX2NxX29iamVjdCAqY3Ffb2JqZWN0LAorCQkgICAgc3RydWN0IGJlX2V0aF9zcV9wYXJhbWV0ZXJzICpleF9wYXJhbWV0ZXJzLAorCQkgICAgc3RydWN0IGJlX2V0aHNxX29iamVjdCAqZXRoX3NxKTsKK2ludCBiZV9ldGhfc3FfZGVzdHJveShzdHJ1Y3QgYmVfZXRoc3Ffb2JqZWN0ICpldGhfc3EpOworCitpbnQgYmVfZXRoX3NldF9mbG93X2NvbnRyb2woc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJCWJvb2wgdHhmY19lbmFibGUsIGJvb2wgcnhmY19lbmFibGUpOworCitpbnQgYmVfZXRoX2dldF9mbG93X2NvbnRyb2woc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJCWJvb2wgKnR4ZmNfZW5hYmxlLCBib29sICpyeGZjX2VuYWJsZSk7CitpbnQgYmVfZXRoX3NldF9xb3Moc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwgdTMyIG1heF9icHMsIHUzMiBtYXhfcHBzKTsKKworaW50IGJlX2V0aF9nZXRfcW9zKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsIHUzMiAqbWF4X2JwcywgdTMyICptYXhfcHBzKTsKKworaW50IGJlX2V0aF9zZXRfZnJhbWVfc2l6ZShzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkgICAgICB1MzIgKnR4X2ZyYW1lX3NpemUsIHUzMiAqcnhfZnJhbWVfc2l6ZSk7CisKK2ludCBiZV9ldGhfcnFfY3JlYXRlKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCSBzdHJ1Y3QgcmluZ19kZXNjICpyZCwgc3RydWN0IGJlX2NxX29iamVjdCAqY3Ffb2JqZWN0LAorCQkgc3RydWN0IGJlX2NxX29iamVjdCAqYmNtY19jcV9vYmplY3QsCisJCSBzdHJ1Y3QgYmVfZXRocnFfb2JqZWN0ICpldGhfcnEpOworCitpbnQgYmVfZXRoX3JxX2Rlc3Ryb3koc3RydWN0IGJlX2V0aHJxX29iamVjdCAqZXRoX3JxKTsKKworaW50IGJlX2V0aF9ycV9kZXN0cm95X29wdGlvbnMoc3RydWN0IGJlX2V0aHJxX29iamVjdCAqZXRoX3JxLCBib29sIGZsdXNoLAorCQltY2Nfd3JiX2NxZV9jYWxsYmFjayBjYiwgdm9pZCAqY2JfY29udGV4dCk7CitpbnQgYmVfZXRoX3JxX3NldF9mcmFnX3NpemUoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJdTMyIG5ld19mcmFnX3NpemVfYnl0ZXMsIHUzMiAqYWN0dWFsX2ZyYWdfc2l6ZV9ieXRlcyk7CitpbnQgYmVfZXRoX3JxX2dldF9mcmFnX3NpemUoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJCQkJCXUzMiAqZnJhZ19zaXplX2J5dGVzKTsKKwordm9pZCAqYmVfZnVuY3Rpb25fcHJlcGFyZV9lbWJlZGRlZF9md2NtZChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkgICBzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIsCisJCSAgIHUzMiBwYXlsb2FkX2xlbmd0aCwgdTMyIHJlcXVlc3RfbGVuZ3RoLAorCQkgICB1MzIgcmVzcG9uc2VfbGVuZ3RoLCB1MzIgb3Bjb2RlLCB1MzIgc3Vic3lzdGVtKTsKK3ZvaWQgKmJlX2Z1bmN0aW9uX3ByZXBhcmVfbm9uZW1iZWRkZWRfZndjbWQoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIsIHZvaWQgKmZ3Y21kX2hlYWRlcl92YSwgdTY0IGZ3Y21kX2hlYWRlcl9wYSwKKwl1MzIgcGF5bG9hZF9sZW5ndGgsIHUzMiByZXF1ZXN0X2xlbmd0aCwgdTMyIHJlc3BvbnNlX2xlbmd0aCwKKwl1MzIgb3Bjb2RlLCB1MzIgc3Vic3lzdGVtKTsKKworCitzdHJ1Y3QgTUNDX1dSQl9BTUFQICoKK2JlX2Z1bmN0aW9uX3BlZWtfbWNjX3dyYihzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iKTsKKworaW50IGJlX3J4Zl9tYWNfYWRkcmVzc19yZWFkX3dyaXRlKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJICAgICAgYm9vbCBwb3J0MSwgYm9vbCBtYWMxLCBib29sIG1nbXQsCisJICAgICAgYm9vbCB3cml0ZSwgYm9vbCBwZXJtYW5lbnQsIHU4ICptYWNfYWRkcmVzcywKKwkgICAgICBtY2Nfd3JiX2NxZV9jYWxsYmFjayBjYiwKKwkgICAgICB2b2lkICpjYl9jb250ZXh0KTsKKworaW50IGJlX3J4Zl9tdWx0aWNhc3RfY29uZmlnKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCQlib29sIHByb21pc2N1b3VzLCB1MzIgbnVtLCB1OCAqbWFjX3RhYmxlLAorCQkJbWNjX3dyYl9jcWVfY2FsbGJhY2sgY2IsCisJCQl2b2lkICpjYl9jb250ZXh0LAorCQkJc3RydWN0IGJlX211bHRpY2FzdF9xX2N0eHQgKnFfY3R4dCk7CisKK2ludCBiZV9yeGZfdmxhbl9jb25maWcoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkgICBib29sIHByb21pc2N1b3VzLCB1MzIgbnVtLCB1MTYgKnZsYW5fdGFnX2FycmF5LAorCSAgIG1jY193cmJfY3FlX2NhbGxiYWNrIGNiLCB2b2lkICpjYl9jb250ZXh0LAorCSAgIHN0cnVjdCBiZV92bGFuX3FfY3R4dCAqcV9jdHh0KTsKKworCitpbnQgYmVfcnhmX2xpbmtfc3RhdHVzKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCSAgIHN0cnVjdCBCRV9MSU5LX1NUQVRVUyAqbGlua19zdGF0dXMsCisJCSAgIG1jY193cmJfY3FlX2NhbGxiYWNrIGNiLAorCQkgICB2b2lkICpjYl9jb250ZXh0LAorCQkgICBzdHJ1Y3QgYmVfbGlua19zdGF0dXNfcV9jdHh0ICpxX2N0eHQpOworCisKK2ludCBiZV9yeGZfcXVlcnlfZXRoX3N0YXRpc3RpY3Moc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJc3RydWN0IEZXQ01EX0VUSF9HRVRfU1RBVElTVElDUyAqdmFfZm9yX2Z3Y21kLAorCQl1NjQgcGFfZm9yX2Z3Y21kLCBtY2Nfd3JiX2NxZV9jYWxsYmFjayBjYiwKKwkJdm9pZCAqY2JfY29udGV4dCwKKwkJc3RydWN0IGJlX25vbmVtYmVkZGVkX3FfY3R4dCAqcV9jdHh0KTsKKworaW50IGJlX3J4Zl9wcm9taXNjdW91cyhzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkgICBib29sIGVuYWJsZV9wb3J0MCwgYm9vbCBlbmFibGVfcG9ydDEsCisJCSAgIG1jY193cmJfY3FlX2NhbGxiYWNrIGNiLCB2b2lkICpjYl9jb250ZXh0LAorCQkgICBzdHJ1Y3QgYmVfcHJvbWlzY3VvdXNfcV9jdHh0ICpxX2N0eHQpOworCisKK2ludCBiZV9yeGZfZmlsdGVyX2NvbmZpZyhzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkgICAgIHN0cnVjdCBOVFdLX1JYX0ZJTFRFUl9TRVRUSU5HUyAqc2V0dGluZ3MsCisJCSAgICAgbWNjX3dyYl9jcWVfY2FsbGJhY2sgY2IsCisJCSAgICAgdm9pZCAqY2JfY29udGV4dCwKKwkJICAgICBzdHJ1Y3QgYmVfcnhmX2ZpbHRlcl9xX2N0eHQgKnFfY3R4dCk7CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBpbnRlcm5hbCBmdW5jdGlvbnMgdXNlZCBieSBod2xpYgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworCitpbnQgYmVfZnVuY3Rpb25fcmluZ19kZXN0cm95KHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCSAgICAgICB1MzIgaWQsIHUzMiByaW5nX3R5cGUsIG1jY193cmJfY3FlX2NhbGxiYWNrIGNiLAorCQkgICAgICAgdm9pZCAqY2JfY29udGV4dCwKKwkJICAgICAgIG1jY193cmJfY3FlX2NhbGxiYWNrIGludGVybmFsX2NiLAorCQkgICAgICAgdm9pZCAqaW50ZXJuYWxfY2FsbGJhY2tfY29udGV4dCk7CisKK2ludCBiZV9mdW5jdGlvbl9wb3N0X21jY193cmIoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiLAorCQlzdHJ1Y3QgYmVfZ2VuZXJpY19xX2N0eHQgKnFfY3R4dCwKKwkJbWNjX3dyYl9jcWVfY2FsbGJhY2sgY2IsIHZvaWQgKmNiX2NvbnRleHQsCisJCW1jY193cmJfY3FlX2NhbGxiYWNrIGludGVybmFsX2NiLAorCQl2b2lkICppbnRlcm5hbF9jYl9jb250ZXh0LCB2b2lkICpvcHRpb25hbF9md2NtZF92YSwKKwkJc3RydWN0IGJlX21jY193cmJfcmVzcG9uc2VfY29weSAqcmVzcG9uc2VfY29weSk7CisKK2ludCBiZV9mdW5jdGlvbl9xdWV1ZV9tY2Nfd3JiKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCQkgIHN0cnVjdCBiZV9nZW5lcmljX3FfY3R4dCAqcV9jdHh0KTsKKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIE1DQyBRVUVVRQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworaW50IGJlX21wdV9pbml0X21haWxib3goc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwgc3RydWN0IHJpbmdfZGVzYyAqcmQpOworCisKK3N0cnVjdCBNQ0NfV1JCX0FNQVAgKgorX2JlX21wdV9wZWVrX3Jpbmdfd3JiKHN0cnVjdCBiZV9tY2Nfb2JqZWN0ICptY2MsIGJvb2wgZHJpdmluZ19xdWV1ZSk7CisKK3N0cnVjdCBiZV9tY2Nfd3JiX2NvbnRleHQgKgorX2JlX21jY19hbGxvY2F0ZV93cmJfY29udGV4dChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iKTsKKwordm9pZCBfYmVfbWNjX2ZyZWVfd3JiX2NvbnRleHQoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJCSBzdHJ1Y3QgYmVfbWNjX3dyYl9jb250ZXh0ICpjb250ZXh0KTsKKworaW50IF9iZV9tcHVfcG9zdF93cmJfbWFpbGJveChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCSBzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIsIHN0cnVjdCBiZV9tY2Nfd3JiX2NvbnRleHQgKndyYl9jb250ZXh0KTsKKworaW50IF9iZV9tcHVfcG9zdF93cmJfcmluZyhzdHJ1Y3QgYmVfbWNjX29iamVjdCAqbWNjLAorCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiwgc3RydWN0IGJlX21jY193cmJfY29udGV4dCAqd3JiX2NvbnRleHQpOworCit2b2lkIGJlX2RyaXZlX21jY193cmJfcXVldWUoc3RydWN0IGJlX21jY19vYmplY3QgKm1jYyk7CisKKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIFJpbmcgU2l6ZXMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgaW5saW5lIHUzMiBiZV9yaW5nX2VuY29kaW5nX3RvX2xlbmd0aCh1MzIgZW5jb2RpbmcsIHUzMiBvYmplY3Rfc2l6ZSkKK3sKKworCUFTU0VSVChlbmNvZGluZyAhPSAxKTsJLyogMSBpcyByc3ZkICovCisJQVNTRVJUKGVuY29kaW5nIDwgMTYpOworCUFTU0VSVChvYmplY3Rfc2l6ZSA+IDApOworCisJaWYgKGVuY29kaW5nID09IDApCS8qIDMyayBkZWVwICovCisJCWVuY29kaW5nID0gMTY7CisKKwlyZXR1cm4gKDEgPDwgKGVuY29kaW5nIC0gMSkpICogb2JqZWN0X3NpemU7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3UzMiBiZV9yaW5nX2xlbmd0aF90b19lbmNvZGluZyh1MzIgbGVuZ3RoX2luX2J5dGVzLCB1MzIgb2JqZWN0X3NpemUpCit7CisKKwl1MzIgY291bnQsIGVuY29kaW5nOworCisJQVNTRVJUKG9iamVjdF9zaXplID4gMCk7CisJQVNTRVJUKGxlbmd0aF9pbl9ieXRlcyAlIG9iamVjdF9zaXplID09IDApOworCisJY291bnQgPSBsZW5ndGhfaW5fYnl0ZXMgLyBvYmplY3Rfc2l6ZTsKKworCUFTU0VSVChjb3VudCA+IDEpOworCUFTU0VSVChjb3VudCA8PSAzMiAqIDEwMjQpOworCUFTU0VSVChsZW5ndGhfaW5fYnl0ZXMgPD0gOCAqIFBBR0VfU0laRSk7IC8qIG1heCByaW5nIHNpemUgaW4gVVQgKi8KKworCWVuY29kaW5nID0gX19pbG9nMl91MzIoY291bnQpICsgMTsKKworCWlmIChlbmNvZGluZyA9PSAxNikKKwkJZW5jb2RpbmcgPSAwOwkvKiAzMmsgZGVlcCAqLworCisJcmV0dXJuIGVuY29kaW5nOworfQorCit2b2lkIGJlX3JkX3RvX3BhX2xpc3Qoc3RydWN0IHJpbmdfZGVzYyAqcmQsIHN0cnVjdCBQSFlTX0FERFIgKnBhX2xpc3QsCisJCQkJCQl1MzIgbWF4X251bSk7CisjZW5kaWYgLyogX19od2xpYl9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9tcHUuYyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9tcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjljYzExCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L21wdS5jCkBAIC0wLDAgKzEsMTM2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSAiaHdsaWIuaCIKKyNpbmNsdWRlICJiZXN0YXR1cy5oIgorCitzdGF0aWMKK2lubGluZSB2b2lkIG1wX3JpbmdfY3JlYXRlKHN0cnVjdCBtcF9yaW5nICpyaW5nLCB1MzIgbnVtLCB1MzIgc2l6ZSwgdm9pZCAqdmEpCit7CisJQVNTRVJUKHJpbmcpOworCW1lbXNldChyaW5nLCAwLCBzaXplb2Yoc3RydWN0IG1wX3JpbmcpKTsKKwlyaW5nLT5udW0gPSBudW07CisJcmluZy0+cGFnZXMgPSBESVZfUk9VTkRfVVAobnVtICogc2l6ZSwgUEFHRV9TSVpFKTsKKwlyaW5nLT5pdGVtU2l6ZSA9IHNpemU7CisJcmluZy0+dmEgPSB2YTsKK30KKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbnRlcmZhY2UgZm9yIDIgaW5kZXggcmluZ3MuIGkuZS4gY29uc3VtZXIvcHJvZHVjZXIgcmluZ3MKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyogUmV0dXJucyBudW1iZXIgaXRlbXMgcGVuZGluZyBvbiByaW5nLiAqLworc3RhdGljIGlubGluZSB1MzIgbXBfcmluZ19udW1fcGVuZGluZyhzdHJ1Y3QgbXBfcmluZyAqcmluZykKK3sKKwlBU1NFUlQocmluZyk7CisJaWYgKHJpbmctPm51bSA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gYmVfc3ViYyhyaW5nLT5waWR4LCByaW5nLT5jaWR4LCByaW5nLT5udW0pOworfQorCisvKiBSZXR1cm5zIG51bWJlciBpdGVtcyBmcmVlIG9uIHJpbmcuICovCitzdGF0aWMgaW5saW5lIHUzMiBtcF9yaW5nX251bV9lbXB0eShzdHJ1Y3QgbXBfcmluZyAqcmluZykKK3sKKwlBU1NFUlQocmluZyk7CisJcmV0dXJuIHJpbmctPm51bSAtIDEgLSBtcF9yaW5nX251bV9wZW5kaW5nKHJpbmcpOworfQorCisvKiBDb25zdW1lIDEgaXRlbSAqLworc3RhdGljIGlubGluZSB2b2lkIG1wX3JpbmdfY29uc3VtZShzdHJ1Y3QgbXBfcmluZyAqcmluZykKK3sKKwlBU1NFUlQocmluZyk7CisJQVNTRVJUKHJpbmctPnBpZHggIT0gcmluZy0+Y2lkeCk7CisKKwlyaW5nLT5jaWR4ID0gYmVfYWRkYyhyaW5nLT5jaWR4LCAxLCByaW5nLT5udW0pOworfQorCisvKiBQcm9kdWNlIDEgaXRlbSAqLworc3RhdGljIGlubGluZSB2b2lkIG1wX3JpbmdfcHJvZHVjZShzdHJ1Y3QgbXBfcmluZyAqcmluZykKK3sKKwlBU1NFUlQocmluZyk7CisJcmluZy0+cGlkeCA9IGJlX2FkZGMocmluZy0+cGlkeCwgMSwgcmluZy0+bnVtKTsKK30KKworLyogQ29uc3VtZSBjb3VudCBpdGVtcyAqLworc3RhdGljIGlubGluZSB2b2lkIG1wX3JpbmdfY29uc3VtZV9tdWx0aXBsZShzdHJ1Y3QgbXBfcmluZyAqcmluZywgdTMyIGNvdW50KQoreworCUFTU0VSVChyaW5nKTsKKwlBU1NFUlQobXBfcmluZ19udW1fcGVuZGluZyhyaW5nKSA+PSBjb3VudCk7CisJcmluZy0+Y2lkeCA9IGJlX2FkZGMocmluZy0+Y2lkeCwgY291bnQsIHJpbmctPm51bSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqbXBfcmluZ19pdGVtKHN0cnVjdCBtcF9yaW5nICpyaW5nLCB1MzIgaW5kZXgpCit7CisJQVNTRVJUKHJpbmcpOworCUFTU0VSVChpbmRleCA8IHJpbmctPm51bSk7CisJQVNTRVJUKHJpbmctPml0ZW1TaXplID4gMCk7CisJcmV0dXJuICh1OCAqKSByaW5nLT52YSArIGluZGV4ICogcmluZy0+aXRlbVNpemU7Cit9CisKKy8qIFB0ciB0byBwcm9kdWNlIGl0ZW0gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqbXBfcmluZ19wcm9kdWNlcl9wdHIoc3RydWN0IG1wX3JpbmcgKnJpbmcpCit7CisJQVNTRVJUKHJpbmcpOworCXJldHVybiBtcF9yaW5nX2l0ZW0ocmluZywgcmluZy0+cGlkeCk7Cit9CisKKy8qCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiB0aGUgcmluZy4KKyAqIFRoaXMgaXMgdXNlZCBmb3IgcmluZ3Mgd2l0aCAxIGluZGV4LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKm1wX3JpbmdfY3VycmVudChzdHJ1Y3QgbXBfcmluZyAqcmluZykKK3sKKwlBU1NFUlQocmluZyk7CisJQVNTRVJUKHJpbmctPnBpZHggPT0gMCk7CS8qIG5vdCB1c2VkICovCisKKwlyZXR1cm4gbXBfcmluZ19pdGVtKHJpbmcsIHJpbmctPmNpZHgpOworfQorCisvKgorICogSW5jcmVtZW50IGluZGV4IGZvciByaW5ncyB3aXRoIG9ubHkgMSBpbmRleC4KKyAqIFRoaXMgaXMgdXNlZCBmb3IgcmluZ3Mgd2l0aCAxIGluZGV4LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKm1wX3JpbmdfbmV4dChzdHJ1Y3QgbXBfcmluZyAqcmluZykKK3sKKwlBU1NFUlQocmluZyk7CisJQVNTRVJUKHJpbmctPm51bSA+IDApOworCUFTU0VSVChyaW5nLT5waWR4ID09IDApOwkvKiBub3QgdXNlZCAqLworCisJcmluZy0+Y2lkeCA9IGJlX2FkZGMocmluZy0+Y2lkeCwgMSwgcmluZy0+bnVtKTsKKwlyZXR1cm4gbXBfcmluZ19jdXJyZW50KHJpbmcpOworfQorCisvKgorICAgIFRoaXMgcm91dGluZSB3YWl0cyBmb3IgYSBwcmV2aW91c2x5IHBvc3RlZCBtYWlsYm94IFdSQiB0byBiZSBjb21wbGV0ZWQuCisgICAgU3BlY2lmaWNhbGx5IGl0IHdhaXRzIGZvciB0aGUgbWFpbGJveCB0byBzYXkgdGhhdCBpdCdzIHJlYWR5IHRvIGFjY2VwdAorICAgIG1vcmUgZGF0YSBieSBzZXR0aW5nIHRoZSBMU0Igb2YgdGhlIG1haWxib3ggcGQgcmVnaXN0ZXIgdG8gMS4KKworICAgIHBjb250cm9sbGVyICAgICAgLSBUaGUgZnVuY3Rpb24gb2JqZWN0IHRvIHBvc3QgdGhpcyBkYXRhIHRvCisKKyAgICBJUlFMIDwgRElTUEFUQ0hfTEVWRUwKKyovCitzdGF0aWMgdm9pZCBiZV9tY2NfbWFpbGJveF93YWl0KHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IpCit7CisJc3RydWN0IE1QVV9NQUlMQk9YX0RCX0FNQVAgbWFpbGJveF9kYjsKKwl1MzIgaSA9IDA7CisJdTMyIHJlYWR5OworCisJaWYgKHBmb2ItPmVtdWxhdGUpIHsKKwkJLyogTm8gd2FpdGluZyBmb3IgbWFpbGJveCBpbiBlbXVsYXRlZCBtb2RlLiAqLworCQlyZXR1cm47CisJfQorCisJbWFpbGJveF9kYi5kd1swXSA9IFBEX1JFQUQocGZvYiwgbWNjX2Jvb3RzdHJhcF9kYik7CisJcmVhZHkgPSBBTUFQX0dFVF9CSVRTX1BUUihNUFVfTUFJTEJPWF9EQiwgcmVhZHksICZtYWlsYm94X2RiKTsKKworCXdoaWxlIChyZWFkeSA9PSBmYWxzZSkgeworCQlpZiAoKCsraSAmIDB4M0ZGRkYpID09IDApIHsKKwkJCVRSQUNFKERMX1dBUk4sICJXYWl0aW5nIGZvciBtYWlsYm94IHJlYWR5IC0gJWRrIHBvbGxzIiwKKwkJCQkJCQkJaSAvIDEwMDApOworCQl9CisJCXVkZWxheSgxKTsKKwkJbWFpbGJveF9kYi5kd1swXSA9IFBEX1JFQUQocGZvYiwgbWNjX2Jvb3RzdHJhcF9kYik7CisJCXJlYWR5ID0gQU1BUF9HRVRfQklUU19QVFIoTVBVX01BSUxCT1hfREIsIHJlYWR5LCAmbWFpbGJveF9kYik7CisJfQorfQorCisvKgorICAgIFRoaXMgcm91dGluZSB0ZWxscyB0aGUgTUNDIG1haWxib3ggdGhhdCB0aGVyZSBpcyBkYXRhIHRvIHByb2Nlc3NlZAorICAgIGluIHRoZSBtYWlsYm94LiBJdCBkb2VzIHRoaXMgYnkgc2V0dGluZyB0aGUgcGh5c2ljYWwgYWRkcmVzcyBmb3IgdGhlCisgICAgbWFpbGJveCBsb2NhdGlvbiBhbmQgY2xlYXJpbmcgdGhlIExTQi4gIFRoaXMgcm91dGluZSByZXR1cm5zIGltbWVkaWF0ZWx5CisgICAgYW5kIGRvZXMgbm90IHdhaXQgZm9yIHRoZSBXUkIgdG8gYmUgcHJvY2Vzc2VkLgorCisgICAgcGNvbnRyb2xsZXIgICAgICAtIFRoZSBmdW5jdGlvbiBvYmplY3QgdG8gcG9zdCB0aGlzIGRhdGEgdG8KKworICAgIElSUUwgPCBESVNQQVRDSF9MRVZFTAorCisqLworc3RhdGljIHZvaWQgYmVfbWNjX21haWxib3hfbm90aWZ5KHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IpCit7CisJc3RydWN0IE1QVV9NQUlMQk9YX0RCX0FNQVAgbWFpbGJveF9kYjsKKwl1MzIgcGE7CisKKwlBU1NFUlQocGZvYi0+bWFpbGJveC5wYSk7CisJQVNTRVJUKHBmb2ItPm1haWxib3gudmEpOworCisJLyogSWYgZW11bGF0ZWQsIGRvIG5vdCByaW5nIHRoZSBtYWlsYm94ICovCisJaWYgKHBmb2ItPmVtdWxhdGUpIHsKKwkJVFJBQ0UoRExfV0FSTiwgIk1QVSBkaXNhYmxlZC4gU2tpcHBpbmcgbWFpbGJveCBub3RpZnkuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBmb3JtIHRoZSBoaWdoZXIgYml0cyBpbiB0aGUgYWRkcmVzcyAqLworCW1haWxib3hfZGIuZHdbMF0gPSAwOwkvKiBpbml0ICovCisJQU1BUF9TRVRfQklUU19QVFIoTVBVX01BSUxCT1hfREIsIGhpLCAmbWFpbGJveF9kYiwgMSk7CisJQU1BUF9TRVRfQklUU19QVFIoTVBVX01BSUxCT1hfREIsIHJlYWR5LCAmbWFpbGJveF9kYiwgMCk7CisKKwkvKiBiaXRzIDM0IHRvIDYzICovCisJcGEgPSAodTMyKSAocGZvYi0+bWFpbGJveC5wYSA+PiAzNCk7CisJQU1BUF9TRVRfQklUU19QVFIoTVBVX01BSUxCT1hfREIsIGFkZHJlc3MsICZtYWlsYm94X2RiLCBwYSk7CisKKwkvKiBXYWl0IGZvciB0aGUgTVBVIHRvIGJlIHJlYWR5ICovCisJYmVfbWNjX21haWxib3hfd2FpdChwZm9iKTsKKworCS8qIFJpbmcgZG9vcmJlbGwgMXN0IHRpbWUgKi8KKwlQRF9XUklURShwZm9iLCBtY2NfYm9vdHN0cmFwX2RiLCBtYWlsYm94X2RiLmR3WzBdKTsKKworCS8qIFdhaXQgZm9yIDFzdCB3cml0ZSB0byBiZSBhY2tub3dsZWRnZWQuICovCisJYmVfbWNjX21haWxib3hfd2FpdChwZm9iKTsKKworCS8qIGxvd2VyIGJpdHMgMzAgYml0cyBmcm9tIDR0aCBiaXQgKGJpdHMgNCB0byAzMykqLworCXBhID0gKHUzMikgKHBmb2ItPm1haWxib3gucGEgPj4gNCkgJiAweDNGRkZGRkZGOworCisJQU1BUF9TRVRfQklUU19QVFIoTVBVX01BSUxCT1hfREIsIGhpLCAmbWFpbGJveF9kYiwgMCk7CisJQU1BUF9TRVRfQklUU19QVFIoTVBVX01BSUxCT1hfREIsIHJlYWR5LCAmbWFpbGJveF9kYiwgMCk7CisJQU1BUF9TRVRfQklUU19QVFIoTVBVX01BSUxCT1hfREIsIGFkZHJlc3MsICZtYWlsYm94X2RiLCBwYSk7CisKKwkvKiBSaW5nIGRvb3JiZWxsIDJuZCB0aW1lICovCisJUERfV1JJVEUocGZvYiwgbWNjX2Jvb3RzdHJhcF9kYiwgbWFpbGJveF9kYi5kd1swXSk7Cit9CisKKy8qCisgICAgVGhpcyByb3V0aW5lIHRlbGxzIHRoZSBNQ0MgbWFpbGJveCB0aGF0IHRoZXJlIGlzIGRhdGEgdG8gcHJvY2Vzc2VkCisgICAgaW4gdGhlIG1haWxib3guIEl0IGRvZXMgdGhpcyBieSBzZXR0aW5nIHRoZSBwaHlzaWNhbCBhZGRyZXNzIGZvciB0aGUKKyAgICBtYWlsYm94IGxvY2F0aW9uIGFuZCBjbGVhcmluZyB0aGUgTFNCLiAgVGhpcyByb3V0aW5lIHNwaW5zIHVudGlsIHRoZQorICAgIE1QVSB3cml0ZXMgYSAxIGludG8gdGhlIExTQiBpbmRpY2F0aW5nIHRoYXQgdGhlIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQKKyAgICBhbmQgaXMgcmVhZHkgdG8gYmUgcHJvY2Vzc2VkLgorCisgICAgcGNvbnRyb2xsZXIgICAgICAtIFRoZSBmdW5jdGlvbiBvYmplY3QgdG8gcG9zdCB0aGlzIGRhdGEgdG8KKworICAgIElSUUwgPCBESVNQQVRDSF9MRVZFTAorKi8KK3N0YXRpYyB2b2lkCitiZV9tY2NfbWFpbGJveF9ub3RpZnlfYW5kX3dhaXQoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYikKK3sKKwkvKgorCSAqIE5vdGlmeSBpdAorCSAqLworCWJlX21jY19tYWlsYm94X25vdGlmeShwZm9iKTsKKwkvKgorCSAqIE5vdyB3YWl0IGZvciBjb21wbGV0aW9uIG9mIFdSQgorCSAqLworCWJlX21jY19tYWlsYm94X3dhaXQocGZvYik7Cit9CisKK3ZvaWQKK2JlX21jY19wcm9jZXNzX2NxZShzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLAorCQkJCXN0cnVjdCBNQ0NfQ1FfRU5UUllfQU1BUCAqY3FlKQoreworCXN0cnVjdCBiZV9tY2Nfd3JiX2NvbnRleHQgKndyYl9jb250ZXh0ID0gTlVMTDsKKwl1MzIgb2Zmc2V0LCBzdGF0dXM7CisJdTggKnA7CisKKwlBU1NFUlQoY3FlKTsKKwkvKgorCSAqIEEgY29tbWFuZCBjb21wbGV0ZWQuICBDb21tYW5kcyBjb21wbGV0ZSBvdXQtb2Ytb3JkZXIuCisJICogRGV0ZXJtaW5lIHdoaWNoIGNvbW1hbmQgY29tcGxldGVkIGZyb20gdGhlIFRBRy4KKwkgKi8KKwlvZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgQkVfTUNDX0NRX0VOVFJZX0FNQVAsIG1jY190YWcpLzg7CisJcCA9ICh1OCAqKSBjcWUgKyBvZmZzZXQ7CisJd3JiX2NvbnRleHQgPSAoc3RydWN0IGJlX21jY193cmJfY29udGV4dCAqKSh2b2lkICopKHNpemVfdCkoKih1NjQgKilwKTsKKwlBU1NFUlQod3JiX2NvbnRleHQpOworCisJLyoKKwkgKiBQZXJmb3JtIGEgcmVzcG9uc2UgY29weSBpZiByZXF1ZXN0ZWQuCisJICogT25seSBjb3B5IGRhdGEgaWYgdGhlIEZXQ01EIGlzIHN1Y2Nlc3NmdWwuCisJICovCisJc3RhdHVzID0gQU1BUF9HRVRfQklUU19QVFIoTUNDX0NRX0VOVFJZLCBjb21wbGV0aW9uX3N0YXR1cywgY3FlKTsKKwlpZiAoc3RhdHVzID09IE1HTVRfU1RBVFVTX1NVQ0NFU1MgJiYgd3JiX2NvbnRleHQtPmNvcHkubGVuZ3RoID4gMCkgeworCQlBU1NFUlQod3JiX2NvbnRleHQtPndyYik7CisJCUFTU0VSVCh3cmJfY29udGV4dC0+Y29weS52YSk7CisJCXAgPSAodTggKil3cmJfY29udGV4dC0+d3JiICsKKwkJCQlvZmZzZXRvZihzdHJ1Y3QgQkVfTUNDX1dSQl9BTUFQLCBwYXlsb2FkKS84OworCQltZW1jcHkod3JiX2NvbnRleHQtPmNvcHkudmEsCisJCQkgICh1OCAqKXAgKyB3cmJfY29udGV4dC0+Y29weS5md2NtZF9vZmZzZXQsCisJCQkgIHdyYl9jb250ZXh0LT5jb3B5Lmxlbmd0aCk7CisJfQorCisJaWYgKHN0YXR1cykKKwkJc3RhdHVzID0gQkVfTk9UX09LOworCS8qIGludGVybmFsIGNhbGxiYWNrICovCisJaWYgKHdyYl9jb250ZXh0LT5pbnRlcm5hbF9jYikgeworCQl3cmJfY29udGV4dC0+aW50ZXJuYWxfY2Iod3JiX2NvbnRleHQtPmludGVybmFsX2NiX2NvbnRleHQsCisJCQkJCQlzdGF0dXMsIHdyYl9jb250ZXh0LT53cmIpOworCX0KKworCS8qIGNhbGxiYWNrICovCisJaWYgKHdyYl9jb250ZXh0LT5jYikgeworCQl3cmJfY29udGV4dC0+Y2Iod3JiX2NvbnRleHQtPmNiX2NvbnRleHQsCisJCQkJCSAgICAgIHN0YXR1cywgd3JiX2NvbnRleHQtPndyYik7CisJfQorCS8qIEZyZWUgdGhlIGNvbnRleHQgc3RydWN0dXJlICovCisJX2JlX21jY19mcmVlX3dyYl9jb250ZXh0KHBmb2IsIHdyYl9jb250ZXh0KTsKK30KKwordm9pZCBiZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKHN0cnVjdCBiZV9tY2Nfb2JqZWN0ICptY2MpCit7CisJc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiA9IE5VTEw7CisJaW50IHN0YXR1cyA9IEJFX1BFTkRJTkc7CisJc3RydWN0IGJlX2dlbmVyaWNfcV9jdHh0ICpxX2N0eHQ7CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiOworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKnF1ZXVlX3dyYjsKKwl1MzIgbGVuZ3RoLCBwYXlsb2FkX2xlbmd0aCwgc2dlX2NvdW50LCBlbWJlZGRlZDsKKwl1bnNpZ25lZCBsb25nIGlycWw7CisKKwlCVUlMRF9CVUdfT04oKHNpemVvZihzdHJ1Y3QgYmVfZ2VuZXJpY19xX2N0eHQpIDwKKwkJCSAgc2l6ZW9mKHN0cnVjdCBiZV9xdWV1ZV9kcml2ZXJfY29udGV4dCkgKworCQkJCQlzaXplb2Yoc3RydWN0IE1DQ19XUkJfQU1BUCkpKTsKKwlwZm9iID0gbWNjLT5wYXJlbnRfZnVuY3Rpb247CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+cG9zdF9sb2NrLCBpcnFsKTsKKworCWlmIChtY2MtPmRyaXZpbmdfYmFja2xvZykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCQlpZiAocGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nICYmIHBmb2ItPm1jYykgeworCQkJcGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nID0gMDsKKwkJCWJlX2RyaXZlX21jY193cmJfcXVldWUocGZvYi0+bWNjKTsKKwkJfQorCQlyZXR1cm47CisJfQorCS8qIEFjcXVpcmUgdGhlIGZsYWcgdG8gbGltaXQgMSB0aHJlYWQgdG8gcmVkcml2ZSBwb3N0cy4gKi8KKwltY2MtPmRyaXZpbmdfYmFja2xvZyA9IDE7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJm1jYy0+YmFja2xvZykpIHsKKwkJd3JiID0gX2JlX21wdV9wZWVrX3Jpbmdfd3JiKG1jYywgdHJ1ZSk7CS8qIERyaXZpbmcgdGhlIHF1ZXVlICovCisJCWlmICghd3JiKQorCQkJYnJlYWs7CS8qIE5vIHNwYWNlIGluIHRoZSByaW5nIHlldC4gKi8KKwkJLyogR2V0IHRoZSBuZXh0IHF1ZXVlZCBlbnRyeSB0byBwcm9jZXNzLiAqLworCQlxX2N0eHQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZtY2MtPmJhY2tsb2csCisJCQkJc3RydWN0IGJlX2dlbmVyaWNfcV9jdHh0LCBjb250ZXh0Lmxpc3QpOworCQlsaXN0X2RlbCgmcV9jdHh0LT5jb250ZXh0Lmxpc3QpOworCQlwZm9iLT5tY2MtPmJhY2tsb2dfbGVuZ3RoLS07CisJCS8qCisJCSAqIENvbXB1dGUgdGhlIHJlcXVpcmVkIGxlbmd0aCBvZiB0aGUgV1JCLgorCQkgKiBTaW5jZSB0aGUgcXVldWUgZWxlbWVudCBtYXkgYmUgc21hbGxlciB0aGFuCisJCSAqIHRoZSBjb21wbGV0ZSBXUkIsIGNvcHkgb25seSB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIGJ5dGVzLgorCQkgKi8KKwkJcXVldWVfd3JiID0gKHN0cnVjdCBNQ0NfV1JCX0FNQVAgKikgJnFfY3R4dC0+d3JiX2hlYWRlcjsKKwkJZW1iZWRkZWQgPSBBTUFQX0dFVF9CSVRTX1BUUihNQ0NfV1JCLCBlbWJlZGRlZCwgcXVldWVfd3JiKTsKKwkJaWYgKGVtYmVkZGVkKSB7CisJCQlwYXlsb2FkX2xlbmd0aCA9IEFNQVBfR0VUX0JJVFNfUFRSKE1DQ19XUkIsCisJCQkJCQlwYXlsb2FkX2xlbmd0aCwgcXVldWVfd3JiKTsKKwkJCWxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgYmVfbWNjX3dyYl9oZWFkZXIpICsKKwkJCQkJCQkJcGF5bG9hZF9sZW5ndGg7CisJCX0gZWxzZSB7CisJCQlzZ2VfY291bnQgPSBBTUFQX0dFVF9CSVRTX1BUUihNQ0NfV1JCLCBzZ2VfY291bnQsCisJCQkJCQkJCXF1ZXVlX3dyYik7CisJCQlBU1NFUlQoc2dlX2NvdW50ID09IDEpOyAvKiBvbmx5IDEgZnJhZy4gKi8KKwkJCWxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgYmVfbWNjX3dyYl9oZWFkZXIpICsKKwkJCSAgICBzZ2VfY291bnQgKiBzaXplb2Yoc3RydWN0IE1DQ19TR0VfQU1BUCk7CisJCX0KKworCQkvKgorCQkgKiBUcnVuY2F0ZSB0aGUgbGVuZ3RoIGJhc2VkIG9uIHRoZSBzaXplIG9mIHRoZQorCQkgKiBxdWV1ZSBlbGVtZW50LiAgU29tZSBlbGVtZW50cyB0aGF0IGhhdmUgb3V0cHV0IHBhcmFtZXRlcnMKKwkJICogY2FuIGJlIHNtYWxsZXIgdGhhbiB0aGUgcGF5bG9hZF9sZW5ndGggZmllbGQgd291bGQKKwkJICogaW5kaWNhdGUuICBXZSByZWFsbHkgb25seSBuZWVkIHRvIGNvcHkgdGhlIHJlcXVlc3QKKwkJICogcGFyYW1ldGVycywgbm90IHRoZSByZXNwb25zZS4KKwkJICovCisJCWxlbmd0aCA9IG1pbihsZW5ndGgsICh1MzIpIChxX2N0eHQtPmNvbnRleHQuYnl0ZXMgLQorCQkJb2Zmc2V0b2Yoc3RydWN0IGJlX2dlbmVyaWNfcV9jdHh0LCB3cmJfaGVhZGVyKSkpOworCisJCS8qIENvcHkgdGhlIHF1ZXVlIGVsZW1lbnQgV1JCIGludG8gdGhlIHJpbmcuICovCisJCW1lbWNweSh3cmIsICZxX2N0eHQtPndyYl9oZWFkZXIsIGxlbmd0aCk7CisKKwkJLyogUG9zdCB0aGUgd3JiLiAgVGhpcyBzaG91bGQgbm90IGZhaWwgYXNzdW1pbmcgd2UgaGF2ZQorCQkgKiBlbm91Z2ggY29udGV4dCBzdHJ1Y3RzLiAqLworCQlzdGF0dXMgPSBiZV9mdW5jdGlvbl9wb3N0X21jY193cmIocGZvYiwgd3JiLCBOVUxMLAorCQkJICAgcV9jdHh0LT5jb250ZXh0LmNiLCBxX2N0eHQtPmNvbnRleHQuY2JfY29udGV4dCwKKwkJCSAgIHFfY3R4dC0+Y29udGV4dC5pbnRlcm5hbF9jYiwKKwkJCSAgIHFfY3R4dC0+Y29udGV4dC5pbnRlcm5hbF9jYl9jb250ZXh0LAorCQkJICAgcV9jdHh0LT5jb250ZXh0Lm9wdGlvbmFsX2Z3Y21kX3ZhLAorCQkJICAgJnFfY3R4dC0+Y29udGV4dC5jb3B5KTsKKworCQlpZiAoc3RhdHVzID09IEJFX1NVQ0NFU1MpIHsKKwkJCS8qCisJCQkgKiBTeW5jaHJvbm91cyBjb21wbGV0aW9uLiBTaW5jZSBpdCB3YXMgcXVldWVkLAorCQkJICogd2Ugd2lsbCBpbnZva2UgdGhlIGNhbGxiYWNrLgorCQkJICogVG8gdGhlIHVzZXIsIHRoaXMgaXMgYW4gYXN5bmNocm9ub3VzIHJlcXVlc3QuCisJCQkgKi8KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisJCQlpZiAocGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nICYmIHBmb2ItPm1jYykgeworCQkJCXBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyA9IDA7CisJCQkJYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShwZm9iLT5tY2MpOworCQkJfQorCisJCQlBU1NFUlQocV9jdHh0LT5jb250ZXh0LmNiKTsKKworCQkJcV9jdHh0LT5jb250ZXh0LmNiKAorCQkJCXFfY3R4dC0+Y29udGV4dC5jYl9jb250ZXh0LAorCQkJCQkJQkVfU1VDQ0VTUywgTlVMTCk7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworCisJCX0gZWxzZSBpZiAoc3RhdHVzICE9IEJFX1BFTkRJTkcpIHsKKwkJCS8qCisJCQkgKiBBbm90aGVyIHJlc291cmNlIGZhaWxlZC4gIFNob3VsZCBuZXZlciBoYXBwZW4KKwkJCSAqIGlmIHdlIGhhdmUgc3VmZmljaWVudCBNQ0NfV1JCX0NPTlRFWFQgc3RydWN0cy4KKwkJCSAqIFJldHVybiB0byBoZWFkIG9mIHRoZSBxdWV1ZS4KKwkJCSAqLworCQkJVFJBQ0UoRExfV0FSTiwgIkZhaWxlZCB0byBwb3N0IGEgcXVldWVkIFdSQi4gMHgleCIsCisJCQkgICAgICBzdGF0dXMpOworCQkJbGlzdF9hZGQoJnFfY3R4dC0+Y29udGV4dC5saXN0LCAmbWNjLT5iYWNrbG9nKTsKKwkJCXBmb2ItPm1jYy0+YmFja2xvZ19sZW5ndGgrKzsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogRnJlZSB0aGUgZmxhZyB0byBsaW1pdCAxIHRocmVhZCB0byByZWRyaXZlIHBvc3RzLiAqLworCW1jYy0+ZHJpdmluZ19iYWNrbG9nID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZm9iLT5wb3N0X2xvY2ssIGlycWwpOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGFzc2VydHMgdGhhdCB0aGUgV1JCIHdhcyBjb25zdW1lZCBpbiBvcmRlci4gKi8KKyNpZmRlZiBCRV9ERUJVRwordTMyIGJlX21jY193cmJfY29uc3VtZWRfaW5fb3JkZXIoc3RydWN0IGJlX21jY19vYmplY3QgKm1jYywKKwkJCQkJc3RydWN0IE1DQ19DUV9FTlRSWV9BTUFQICpjcWUpCit7CisJc3RydWN0IGJlX21jY193cmJfY29udGV4dCAqd3JiX2NvbnRleHQgPSBOVUxMOworCXUzMiB3cmJfaW5kZXg7CisJdTMyIHdyYl9jb25zdW1lZF9pbl9vcmRlcjsKKwl1MzIgb2Zmc2V0OworCXU4ICpwOworCisJQVNTRVJUKGNxZSk7CisJLyoKKwkgKiBBIGNvbW1hbmQgY29tcGxldGVkLiAgQ29tbWFuZHMgY29tcGxldGUgb3V0LW9mLW9yZGVyLgorCSAqIERldGVybWluZSB3aGljaCBjb21tYW5kIGNvbXBsZXRlZCBmcm9tIHRoZSBUQUcuCisJICovCisJb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IEJFX01DQ19DUV9FTlRSWV9BTUFQLCBtY2NfdGFnKS84OworCXAgPSAodTggKikgY3FlICsgb2Zmc2V0OworCXdyYl9jb250ZXh0ID0gKHN0cnVjdCBiZV9tY2Nfd3JiX2NvbnRleHQgKikodm9pZCAqKShzaXplX3QpKCoodTY0ICopcCk7CisKKwlBU1NFUlQod3JiX2NvbnRleHQpOworCisJd3JiX2luZGV4ID0gKHUzMikgKCgodTY0KShzaXplX3Qpd3JiX2NvbnRleHQtPnJpbmdfd3JiIC0KKwkJKHU2NCkoc2l6ZV90KW1jYy0+c3EucmluZy52YSkgLyBzaXplb2Yoc3RydWN0IE1DQ19XUkJfQU1BUCkpOworCisJQVNTRVJUKHdyYl9pbmRleCA8IG1jYy0+c3EucmluZy5udW0pOworCisJd3JiX2NvbnN1bWVkX2luX29yZGVyID0gKHUzMikgKHdyYl9pbmRleCA9PSBtY2MtPmNvbnN1bWVkX2luZGV4KTsKKwltY2MtPmNvbnN1bWVkX2luZGV4ID0gYmVfYWRkYyhtY2MtPmNvbnN1bWVkX2luZGV4LCAxLCBtY2MtPnNxLnJpbmcubnVtKTsKKwlyZXR1cm4gd3JiX2NvbnN1bWVkX2luX29yZGVyOworfQorI2VuZGlmCisKK2ludCBiZV9tY2NfcHJvY2Vzc19jcShzdHJ1Y3QgYmVfbWNjX29iamVjdCAqbWNjLCBib29sIHJlYXJtKQoreworCXN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IgPSBOVUxMOworCXN0cnVjdCBNQ0NfQ1FfRU5UUllfQU1BUCAqY3FlOworCXN0cnVjdCBDUV9EQl9BTUFQIGRiOworCXN0cnVjdCBtcF9yaW5nICpjcV9yaW5nID0gJm1jYy0+Y3EucmluZzsKKwlzdHJ1Y3QgbXBfcmluZyAqbXBfcmluZyA9ICZtY2MtPnNxLnJpbmc7CisJdTMyIG51bV9wcm9jZXNzZWQgPSAwOworCXUzMiBjb25zdW1lZCA9IDAsIHZhbGlkLCBjb21wbGV0ZWQsIGNxZV9jb25zdW1lZCwgYXN5bmNfZXZlbnQ7CisKKwlwZm9iID0gbWNjLT5wYXJlbnRfZnVuY3Rpb247CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+Y3FfbG9jaywgcGZvYi0+Y3FfaXJxKTsKKworCS8qCisJICogVmVyaWZ5IHRoYXQgb25seSBvbmUgdGhyZWFkIGlzIHByb2Nlc3NpbmcgdGhlIENRIGF0IG9uY2UuCisJICogV2UgY2Fubm90IGhvbGQgdGhlIGxvY2sgd2hpbGUgcHJvY2Vzc2luZyB0aGUgQ1EgZHVlIHRvCisJICogdGhlIGNhbGxiYWNrcyBpbnRvIHRoZSBPUy4gIFRoZXJlZm9yZSwgdGhpcyBmbGFnIGlzIHVzZWQKKwkgKiB0byBjb250cm9sIGl0LiAgSWYgYW55IG9mIHRoZSB0aHJlYWRzIHdhbnQgdG8KKwkgKiByZWFybSB0aGUgQ1EsIHdlIG5lZWQgdG8gaG9ub3IgdGhhdC4KKwkgKi8KKwlpZiAobWNjLT5wcm9jZXNzaW5nICE9IDApIHsKKwkJbWNjLT5yZWFybSA9IG1jYy0+cmVhcm0gfHwgcmVhcm07CisJCWdvdG8gRXJyb3I7CisJfSBlbHNlIHsKKwkJbWNjLT5wcm9jZXNzaW5nID0gMTsJLyogbG9jayBwcm9jZXNzaW5nIGZvciB0aGlzIHRocmVhZC4gKi8KKwkJbWNjLT5yZWFybSA9IHJlYXJtOwkvKiBzZXQgb3VyIHJlYXJtIHNldHRpbmcgKi8KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZm9iLT5jcV9sb2NrLCBwZm9iLT5jcV9pcnEpOworCisJY3FlID0gbXBfcmluZ19jdXJyZW50KGNxX3JpbmcpOworCXZhbGlkID0gQU1BUF9HRVRfQklUU19QVFIoTUNDX0NRX0VOVFJZLCB2YWxpZCwgY3FlKTsKKwl3aGlsZSAodmFsaWQpIHsKKworCQlpZiAobnVtX3Byb2Nlc3NlZCA+PSA4KSB7CisJCQkvKiBjb2FsZXNjZSBkb29yYmVsbHMsIGJ1dCBmcmVlIHNwYWNlIGluIGNxCisJCQkgKiByaW5nIHdoaWxlIHByb2Nlc3NpbmcuICovCisJCQlkYi5kd1swXSA9IDA7CS8qIGNsZWFyICovCisJCQlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgcWlkLCAmZGIsIGNxX3JpbmctPmlkKTsKKwkJCUFNQVBfU0VUX0JJVFNfUFRSKENRX0RCLCByZWFybSwgJmRiLCBmYWxzZSk7CisJCQlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgZXZlbnQsICZkYiwgZmFsc2UpOworCQkJQU1BUF9TRVRfQklUU19QVFIoQ1FfREIsIG51bV9wb3BwZWQsICZkYiwKKwkJCQkJCQludW1fcHJvY2Vzc2VkKTsKKwkJCW51bV9wcm9jZXNzZWQgPSAwOworCisJCQlQRF9XUklURShwZm9iLCBjcV9kYiwgZGIuZHdbMF0pOworCQl9CisKKwkJYXN5bmNfZXZlbnQgPSBBTUFQX0dFVF9CSVRTX1BUUihNQ0NfQ1FfRU5UUlksIGFzeW5jX2V2ZW50LCBjcWUpOworCQlpZiAoYXN5bmNfZXZlbnQpIHsKKwkJCS8qIFRoaXMgaXMgYW4gYXN5bmNocm9ub3VzIGV2ZW50LiAqLworCQkJc3RydWN0IEFTWU5DX0VWRU5UX1RSQUlMRVJfQU1BUCAqYXN5bmNfdHJhaWxlciA9CisJCQkgICAgKHN0cnVjdCBBU1lOQ19FVkVOVF9UUkFJTEVSX0FNQVAgKikKKwkJCSAgICAoKHU4ICopIGNxZSArIHNpemVvZihzdHJ1Y3QgTUNDX0NRX0VOVFJZX0FNQVApIC0KKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBBU1lOQ19FVkVOVF9UUkFJTEVSX0FNQVApKTsKKwkJCXUzMiBldmVudF9jb2RlOworCQkJYXN5bmNfZXZlbnQgPSBBTUFQX0dFVF9CSVRTX1BUUihBU1lOQ19FVkVOVF9UUkFJTEVSLAorCQkJCQkJYXN5bmNfZXZlbnQsIGFzeW5jX3RyYWlsZXIpOworCQkJQVNTRVJUKGFzeW5jX2V2ZW50ID09IDEpOworCisKKwkJCXZhbGlkID0gQU1BUF9HRVRfQklUU19QVFIoQVNZTkNfRVZFTlRfVFJBSUxFUiwKKwkJCQkJCXZhbGlkLCBhc3luY190cmFpbGVyKTsKKwkJCUFTU0VSVCh2YWxpZCA9PSAxKTsKKworCQkJLyogQ2FsbCB0aGUgYXN5bmMgZXZlbnQgaGFuZGxlciBpZiBpdCBpcyBpbnN0YWxsZWQuICovCisJCQlpZiAobWNjLT5hc3luY19jYikgeworCQkJCWV2ZW50X2NvZGUgPQorCQkJCQlBTUFQX0dFVF9CSVRTX1BUUihBU1lOQ19FVkVOVF9UUkFJTEVSLAorCQkJCQkJZXZlbnRfY29kZSwgYXN5bmNfdHJhaWxlcik7CisJCQkJbWNjLT5hc3luY19jYihtY2MtPmFzeW5jX2NvbnRleHQsCisJCQkJCSAgICAodTMyKSBldmVudF9jb2RlLCAodm9pZCAqKSBjcWUpOworCQkJfQorCisJCX0gZWxzZSB7CisJCQkvKiBUaGlzIGlzIGEgY29tcGxldGlvbiBlbnRyeS4gKi8KKworCQkJLyogTm8gdm0gZm9yd2FyZGluZyBpbiB0aGlzIGRyaXZlci4gKi8KKworCQkJY3FlX2NvbnN1bWVkID0gQU1BUF9HRVRfQklUU19QVFIoTUNDX0NRX0VOVFJZLAorCQkJCQkJY29uc3VtZWQsIGNxZSk7CisJCQlpZiAoY3FlX2NvbnN1bWVkKSB7CisJCQkJLyoKKwkJCQkgKiBBIGNvbW1hbmQgb24gdGhlIE1DQyByaW5nIHdhcyBjb25zdW1lZC4KKwkJCQkgKiBVcGRhdGUgdGhlIGNvbnN1bWVyIGluZGV4LgorCQkJCSAqIFRoZXNlIG9jY3VyIGluIG9yZGVyLgorCQkJCSAqLworCQkJCUFTU0VSVChiZV9tY2Nfd3JiX2NvbnN1bWVkX2luX29yZGVyKG1jYywgY3FlKSk7CisJCQkJY29uc3VtZWQrKzsKKwkJCX0KKworCQkJY29tcGxldGVkID0gQU1BUF9HRVRfQklUU19QVFIoTUNDX0NRX0VOVFJZLAorCQkJCQljb21wbGV0ZWQsIGNxZSk7CisJCQlpZiAoY29tcGxldGVkKSB7CisJCQkJLyogQSBjb21tYW5kIGNvbXBsZXRlZC4gIFVzZSB0YWcgdG8KKwkJCQkgKiBkZXRlcm1pbmUgd2hpY2ggY29tbWFuZC4gICovCisJCQkJYmVfbWNjX3Byb2Nlc3NfY3FlKHBmb2IsIGNxZSk7CisJCQl9CisJCX0KKworCQkvKiBSZXNldCB0aGUgQ1FFICovCisJCUFNQVBfU0VUX0JJVFNfUFRSKE1DQ19DUV9FTlRSWSwgdmFsaWQsIGNxZSwgZmFsc2UpOworCQludW1fcHJvY2Vzc2VkKys7CisKKwkJLyogVXBkYXRlIG91ciB0cmFja2luZyBmb3IgdGhlIENRIHJpbmcuICovCisJCWNxZSA9IG1wX3JpbmdfbmV4dChjcV9yaW5nKTsKKwkJdmFsaWQgPSBBTUFQX0dFVF9CSVRTX1BUUihNQ0NfQ1FfRU5UUlksIHZhbGlkLCBjcWUpOworCX0KKworCVRSQUNFKERMX0lORk8sICJudW1fcHJvY2Vzc2VkOjB4JXgsIGFuZCBjb25zdW1lZDoweCV4IiwKKwkgICAgICBudW1fcHJvY2Vzc2VkLCBjb25zdW1lZCk7CisJLyoKKwkgKiBHcmFiIHRoZSBDUSBsb2NrIHRvIHN5bmNocm9uaXplIHRoZSAicmVhcm0iIHNldHRpbmcgZm9yCisJICogdGhlIGRvb3JiZWxsLCBhbmQgZm9yIGNsZWFyaW5nIHRoZSAicHJvY2Vzc2luZyIgZmxhZy4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+Y3FfbG9jaywgcGZvYi0+Y3FfaXJxKTsKKworCS8qCisJICogUmVhcm0gdGhlIGNxLiAgVGhpcyBpcyBkb25lIGJhc2VkIG9uIHRoZSBnbG9iYWwgbWNjLT5yZWFybQorCSAqIGZsYWcgd2hpY2ggY29tYmluZXMgdGhlIHJlYXJtIHBhcmFtZXRlciBmcm9tIHRoZSBjdXJyZW50CisJICogY2FsbCB0byBwcm9jZXNzX2NxIGFuZCBhbnkgb3RoZXIgdGhyZWFkcworCSAqIHRoYXQgdHJpZWQgdG8gcHJvY2VzcyB0aGUgQ1Egd2hpbGUgdGhpcyBvbmUgd2FzIGFjdGl2ZS4KKwkgKiBUaGlzIGhhbmRsZXMgdGhlIHNpdHVhdGlvbiB3aGVyZSBhIHN5bmMuIGZ3Y21kIHdhcyBwcm9jZXNzaW5nCisJICogdGhlIENRIHdoaWxlIHRoZSBpbnRlcnJ1cHQvZHBjIHRyaWVzIHRvIHByb2Nlc3MgaXQuCisJICogVGhlIHN5bmMgcHJvY2VzcyBnZXRzIHRvIGNvbnRpbnVlIC0tIGJ1dCBpdCBpcyBub3cKKwkgKiByZXNwb25zaWJsZSBmb3IgdGhlIHJlYXJtaW5nLgorCSAqLworCWlmIChudW1fcHJvY2Vzc2VkID4gMCB8fCBtY2MtPnJlYXJtID09IHRydWUpIHsKKwkJZGIuZHdbMF0gPSAwOwkvKiBjbGVhciAqLworCQlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgcWlkLCAmZGIsIGNxX3JpbmctPmlkKTsKKwkJQU1BUF9TRVRfQklUU19QVFIoQ1FfREIsIHJlYXJtLCAmZGIsIG1jYy0+cmVhcm0pOworCQlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgZXZlbnQsICZkYiwgZmFsc2UpOworCQlBTUFQX1NFVF9CSVRTX1BUUihDUV9EQiwgbnVtX3BvcHBlZCwgJmRiLCBudW1fcHJvY2Vzc2VkKTsKKworCQlQRF9XUklURShwZm9iLCBjcV9kYiwgZGIuZHdbMF0pOworCX0KKwkvKgorCSAqIFVwZGF0ZSB0aGUgY29uc3VtZXIgaW5kZXggYWZ0ZXIgcmluZ2luZyB0aGUgQ1EgZG9vcmJlbGwuCisJICogV2UgZG9uJ3Qgd2FudCBhbm90aGVyIHRocmVhZCB0byBwb3N0IG1vcmUgV1JCcyBiZWZvcmUgd2UKKwkgKiBoYXZlIENRIHNwYWNlIGF2YWlsYWJsZS4KKwkgKi8KKwltcF9yaW5nX2NvbnN1bWVfbXVsdGlwbGUobXBfcmluZywgY29uc3VtZWQpOworCisJLyogQ2xlYXIgdGhlIHByb2Nlc3NpbmcgZmxhZy4gKi8KKwltY2MtPnByb2Nlc3NpbmcgPSAwOworCitFcnJvcjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZm9iLT5jcV9sb2NrLCBwZm9iLT5jcV9pcnEpOworCS8qCisJICogVXNlIHRoZSBsb2NhbCB2YXJpYWJsZSB0byBkZXRlY3QgaWYgdGhlIGN1cnJlbnQgdGhyZWFkCisJICogaG9sZHMgdGhlIFdSQiBwb3N0IGxvY2suICBJZiByZWFybSBpcyBmYWxzZSwgdGhpcyBpcworCSAqIGVpdGhlciBhIHN5bmNocm9ub3VzIGNvbW1hbmQsIG9yIHRoZSB1cHBlciBsYXllciBkcml2ZXIgaXMgcG9sbGluZworCSAqIGZyb20gYSB0aHJlYWQuICBXZSBkbyBub3QgZHJpdmUgdGhlIHF1ZXVlIGZyb20gdGhhdAorCSAqIGNvbnRleHQgc2luY2UgdGhlIGRyaXZlciBtYXkgaG9sZCB0aGUKKwkgKiB3cmIgcG9zdCBsb2NrIGFscmVhZHkuCisJICovCisJaWYgKHJlYXJtKQorCQliZV9kcml2ZV9tY2Nfd3JiX3F1ZXVlKG1jYyk7CisJZWxzZQorCQlwZm9iLT5wZW5kX3F1ZXVlX2RyaXZpbmcgPSAxOworCisJcmV0dXJuIEJFX1NVQ0NFU1M7Cit9CisKKy8qCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICAgICAgICAgICAgICAgICAgUCBVIEIgTCBJIEMgIFIgTyBVIFQgSSBOIEUgUworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyoKKyAgICBUaGlzIHJvdXRpbmUgY3JlYXRlcyBhbiBNQ0Mgb2JqZWN0LiAgVGhpcyBvYmplY3QgY29udGFpbnMgYW4gTUNDIHNlbmQgcXVldWUKKyAgICBhbmQgYSBDUSBwcml2YXRlIHRvIHRoZSBNQ0MuCisKKyAgICBwY29udHJvbGxlciAgICAgIC0gSGFuZGxlIHRvIGEgZnVuY3Rpb24gb2JqZWN0CisKKyAgICBFcU9iamVjdCAgICAgICAgICAgIC0gRVEgb2JqZWN0IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGRpc3BhdGNoIHRoaXMgTUNDCisKKyAgICBwcE1jY09iamVjdCAgICAgICAgIC0gUG9pbnRlciB0byBhbiBpbnRlcm5hbCBNY2MgT2JqZWN0IHJldHVybmVkLgorCisgICAgUmV0dXJucyBCRV9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWxsLCwgb3RoZXJ3aXNlIGEgdXNlZnVsIGVycm9yIGNvZGUKKwlpcyByZXR1cm5lZC4KKworICAgIElSUUwgPCBESVNQQVRDSF9MRVZFTAorCisqLworaW50CitiZV9tY2NfcmluZ19jcmVhdGUoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkJICAgc3RydWN0IHJpbmdfZGVzYyAqcmQsIHUzMiBsZW5ndGgsCisJCSAgIHN0cnVjdCBiZV9tY2Nfd3JiX2NvbnRleHQgKmNvbnRleHRfYXJyYXksCisJCSAgIHUzMiBudW1fY29udGV4dF9lbnRyaWVzLAorCQkgICBzdHJ1Y3QgYmVfY3Ffb2JqZWN0ICpjcSwgc3RydWN0IGJlX21jY19vYmplY3QgKm1jYykKK3sKKwlpbnQgc3RhdHVzID0gMDsKKworCXN0cnVjdCBGV0NNRF9DT01NT05fTUNDX0NSRUFURSAqZndjbWQgPSBOVUxMOworCXN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYiA9IE5VTEw7CisJdTMyIG51bV9lbnRyaWVzX2VuY29kZWQsIG4sIGk7CisJdm9pZCAqdmEgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgaXJxbDsKKworCWlmIChsZW5ndGggPCBzaXplb2Yoc3RydWN0IE1DQ19XUkJfQU1BUCkgKiAyKSB7CisJCVRSQUNFKERMX0VSUiwgIkludmFsaWQgTUNDIHJpbmcgbGVuZ3RoOiVkIiwgbGVuZ3RoKTsKKwkJcmV0dXJuIEJFX05PVF9PSzsKKwl9CisJLyoKKwkgKiBSZWR1Y2UgdGhlIGFjdHVhbCByaW5nIHNpemUgdG8gYmUgbGVzcyB0aGFuIHRoZSBudW1iZXIKKwkgKiBvZiBjb250ZXh0IGVudHJpZXMuICBUaGlzIGVuc3VyZXMgdGhhdCB3ZSBydW4gb3V0IG9mCisJICogcmluZyBXUkJzIGZpcnN0IHNvIHRoZSBxdWV1aW5nIHdvcmtzIGNvcnJlY3RseS4gIFdlIG5ldmVyCisJICogcXVldWUgYmFzZWQgb24gY29udGV4dCBzdHJ1Y3RzLgorCSAqLworCWlmIChudW1fY29udGV4dF9lbnRyaWVzICsgMSA8CisJCQlsZW5ndGggLyBzaXplb2Yoc3RydWN0IE1DQ19XUkJfQU1BUCkgLSAxKSB7CisKKwkJdTMyIG1heF9sZW5ndGggPQorCQkgICAgKG51bV9jb250ZXh0X2VudHJpZXMgKyAyKSAqIHNpemVvZihzdHJ1Y3QgTUNDX1dSQl9BTUFQKTsKKworCQlpZiAoaXNfcG93ZXJfb2ZfMihtYXhfbGVuZ3RoKSkKKwkJCWxlbmd0aCA9IF9fcm91bmR1cF9wb3dfb2ZfdHdvKG1heF9sZW5ndGgrMSkgLyAyOworCQllbHNlCisJCQlsZW5ndGggPSBfX3JvdW5kdXBfcG93X29mX3R3byhtYXhfbGVuZ3RoKSAvIDI7CisKKwkJQVNTRVJUKGxlbmd0aCA8PSBtYXhfbGVuZ3RoKTsKKworCQlUUkFDRShETF9XQVJOLAorCQkJIk1DQyByaW5nIGxlbmd0aCByZWR1Y2VkIGJhc2VkIG9uIGNvbnRleHQgZW50cmllcy4iCisJCQkiIGxlbmd0aDolZCB3cmJzOiVkIGNvbnRleHRfZW50cmllczolZCIsIGxlbmd0aCwKKwkJCShpbnQpIChsZW5ndGggLyBzaXplb2Yoc3RydWN0IE1DQ19XUkJfQU1BUCkpLAorCQkJbnVtX2NvbnRleHRfZW50cmllcyk7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisKKwludW1fZW50cmllc19lbmNvZGVkID0KKwkgICAgYmVfcmluZ19sZW5ndGhfdG9fZW5jb2RpbmcobGVuZ3RoLCBzaXplb2Yoc3RydWN0IE1DQ19XUkJfQU1BUCkpOworCisJLyogSW5pdCBNQ0Mgb2JqZWN0LiAqLworCW1lbXNldChtY2MsIDAsIHNpemVvZigqbWNjKSk7CisJbWNjLT5wYXJlbnRfZnVuY3Rpb24gPSBwZm9iOworCW1jYy0+Y3Ffb2JqZWN0ID0gY3E7CisKKwlJTklUX0xJU1RfSEVBRCgmbWNjLT5iYWNrbG9nKTsKKworCXdyYiA9IGJlX2Z1bmN0aW9uX3BlZWtfbWNjX3dyYihwZm9iKTsKKwlpZiAoIXdyYikgeworCQlBU1NFUlQod3JiKTsKKwkJVFJBQ0UoRExfRVJSLCAiTm8gZnJlZSBNQ0MgV1JCcyBpbiBjcmVhdGUgRVEuIik7CisJCXN0YXR1cyA9IEJFX1NUQVRVU19OT19NQ0NfV1JCOworCQlnb3RvIGVycm9yOworCX0KKwkvKiBQcmVwYXJlcyBhbiBlbWJlZGRlZCBmd2NtZCwgaW5jbHVkaW5nIHJlcXVlc3QvcmVzcG9uc2Ugc2l6ZXMuICovCisJZndjbWQgPSBCRV9QUkVQQVJFX0VNQkVEREVEX0ZXQ01EKHBmb2IsIHdyYiwgQ09NTU9OX01DQ19DUkVBVEUpOworCisJZndjbWQtPnBhcmFtcy5yZXF1ZXN0Lm51bV9wYWdlcyA9IERJVl9ST1VORF9VUChsZW5ndGgsIFBBR0VfU0laRSk7CisJLyoKKwkgKiBQcm9ncmFtIE1DQyByaW5nIGNvbnRleHQKKwkgKi8KKwlBTUFQX1NFVF9CSVRTX1BUUihNQ0NfUklOR19DT05URVhULCBwZGlkLAorCQkJJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCAwKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihNQ0NfUklOR19DT05URVhULCBpbnZhbGlkLAorCQkJJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCBmYWxzZSk7CisJQU1BUF9TRVRfQklUU19QVFIoTUNDX1JJTkdfQ09OVEVYVCwgcmluZ19zaXplLAorCQkJJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCBudW1fZW50cmllc19lbmNvZGVkKTsKKworCW4gPSBjcS0+Y3FfaWQ7CisJQU1BUF9TRVRfQklUU19QVFIoTUNDX1JJTkdfQ09OVEVYVCwKKwkJCQljcV9pZCwgJmZ3Y21kLT5wYXJhbXMucmVxdWVzdC5jb250ZXh0LCBuKTsKKwliZV9yZF90b19wYV9saXN0KHJkLCBmd2NtZC0+cGFyYW1zLnJlcXVlc3QucGFnZXMsCisJCQkJQVJSQVlfU0laRShmd2NtZC0+cGFyYW1zLnJlcXVlc3QucGFnZXMpKTsKKwkvKiBQb3N0IHRoZSBmL3cgY29tbWFuZCAqLworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3Bvc3RfbWNjX3dyYihwZm9iLCB3cmIsIE5VTEwsIE5VTEwsIE5VTEwsCisJCQkJCQlOVUxMLCBOVUxMLCBmd2NtZCwgTlVMTCk7CisJaWYgKHN0YXR1cyAhPSBCRV9TVUNDRVNTKSB7CisJCVRSQUNFKERMX0VSUiwgIk1DQyB0byBjcmVhdGUgQ1EgZmFpbGVkLiIpOworCQlnb3RvIGVycm9yOworCX0KKwkvKgorCSAqIENyZWF0ZSBhIGxpbmtlZCBsaXN0IG9mIGNvbnRleHQgc3RydWN0dXJlcworCSAqLworCW1jYy0+d3JiX2NvbnRleHQuYmFzZSA9IGNvbnRleHRfYXJyYXk7CisJbWNjLT53cmJfY29udGV4dC5udW0gPSBudW1fY29udGV4dF9lbnRyaWVzOworCUlOSVRfTElTVF9IRUFEKCZtY2MtPndyYl9jb250ZXh0Lmxpc3RfaGVhZCk7CisJbWVtc2V0KGNvbnRleHRfYXJyYXksIDAsCisJCSAgICBzaXplb2Yoc3RydWN0IGJlX21jY193cmJfY29udGV4dCkgKiBudW1fY29udGV4dF9lbnRyaWVzKTsKKwlmb3IgKGkgPSAwOyBpIDwgbWNjLT53cmJfY29udGV4dC5udW07IGkrKykgeworCQlsaXN0X2FkZF90YWlsKCZjb250ZXh0X2FycmF5W2ldLm5leHQsCisJCQkJCSZtY2MtPndyYl9jb250ZXh0Lmxpc3RfaGVhZCk7CisJfQorCisJLyoKKwkgKgorCSAqIENyZWF0ZSBhbiBtY2NfcmluZyBmb3IgdHJhY2tpbmcgV1JCIGh3IHJpbmcKKwkgKi8KKwl2YSA9IHJkLT52YTsKKwlBU1NFUlQodmEpOworCW1wX3JpbmdfY3JlYXRlKCZtY2MtPnNxLnJpbmcsIGxlbmd0aCAvIHNpemVvZihzdHJ1Y3QgTUNDX1dSQl9BTUFQKSwKKwkJCQlzaXplb2Yoc3RydWN0IE1DQ19XUkJfQU1BUCksIHZhKTsKKwltY2MtPnNxLnJpbmcuaWQgPSBmd2NtZC0+cGFyYW1zLnJlc3BvbnNlLmlkOworCS8qCisJICogSW5pdCBhIG1jY19yaW5nIGZvciB0cmFja2luZyB0aGUgTUNDIENRLgorCSAqLworCUFTU0VSVChjcS0+dmEpOworCW1wX3JpbmdfY3JlYXRlKCZtY2MtPmNxLnJpbmcsIGNxLT5udW1fZW50cmllcywKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgTUNDX0NRX0VOVFJZX0FNQVApLCBjcS0+dmEpOworCW1jYy0+Y3EucmluZy5pZCA9IGNxLT5jcV9pZDsKKworCS8qIEZvcmNlIHplcm9pbmcgb2YgQ1EuICovCisJbWVtc2V0KGNxLT52YSwgMCwgY3EtPm51bV9lbnRyaWVzICogc2l6ZW9mKHN0cnVjdCBNQ0NfQ1FfRU5UUllfQU1BUCkpOworCisJLyogSW5pdGlhbGl6ZSBkZWJ1ZyBpbmRleC4gKi8KKwltY2MtPmNvbnN1bWVkX2luZGV4ID0gMDsKKworCWF0b21pY19pbmMoJmNxLT5yZWZfY291bnQpOworCXBmb2ItPm1jYyA9IG1jYzsKKworCVRSQUNFKERMX0lORk8sICJNQ0MgcmluZyBjcmVhdGVkLiBpZDolZCBieXRlczolZCBjcV9pZDolZCBjcV9lbnRyaWVzOiVkIgorCSAgICAgICIgbnVtX2NvbnRleHQ6JWQiLCBtY2MtPnNxLnJpbmcuaWQsIGxlbmd0aCwKKwkgICAgICBjcS0+Y3FfaWQsIGNxLT5udW1fZW50cmllcywgbnVtX2NvbnRleHRfZW50cmllcyk7CisKK2Vycm9yOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPnBvc3RfbG9jaywgaXJxbCk7CisJaWYgKHBmb2ItPnBlbmRfcXVldWVfZHJpdmluZyAmJiBwZm9iLT5tY2MpIHsKKwkJcGZvYi0+cGVuZF9xdWV1ZV9kcml2aW5nID0gMDsKKwkJYmVfZHJpdmVfbWNjX3dyYl9xdWV1ZShwZm9iLT5tY2MpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICAgIFRoaXMgcm91dGluZSBkZXN0cm95cyBhbiBNQ0Mgc2VuZCBxdWV1ZQorCisgICAgTWNjT2JqZWN0ICAgICAgICAgLSBJbnRlcm5hbCBNY2MgT2JqZWN0IHRvIGJlIGRlc3Ryb3llZC4KKworICAgIFJldHVybnMgQkVfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsbCwgb3RoZXJ3aXNlIGFuIGVycm9yIGNvZGUgaXMgcmV0dXJuZWQuCisKKyAgICBJUlFMIDwgRElTUEFUQ0hfTEVWRUwKKworICAgIFRoZSBjYWxsZXIgb2YgdGhpcyByb3V0aW5lIG11c3QgZW5zdXJlIHRoYXQgbm8gb3RoZXIgV1JCIG1heSBiZSBwb3N0ZWQKKyAgICB1bnRpbCB0aGlzIHJvdXRpbmUgcmV0dXJucy4KKworKi8KK2ludCBiZV9tY2NfcmluZ19kZXN0cm95KHN0cnVjdCBiZV9tY2Nfb2JqZWN0ICptY2MpCit7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiA9IG1jYy0+cGFyZW50X2Z1bmN0aW9uOworCisKKwlBU1NFUlQobWNjLT5wcm9jZXNzaW5nID09IDApOworCisJLyoKKwkgKiBSZW1vdmUgdGhlIHJpbmcgZnJvbSB0aGUgZnVuY3Rpb24gb2JqZWN0LgorCSAqIFRoaXMgdHJhbnNpdGlvbnMgYmFjayB0byBtYWlsYm94IG1vZGUuCisJICovCisJcGZvYi0+bWNjID0gTlVMTDsKKworCS8qIFNlbmQgZndjbWQgdG8gZGVzdHJveSB0aGUgcXVldWUuICAoVXNpbmcgdGhlIG1haWxib3guKSAqLworCXN0YXR1cyA9IGJlX2Z1bmN0aW9uX3JpbmdfZGVzdHJveShtY2MtPnBhcmVudF9mdW5jdGlvbiwgbWNjLT5zcS5yaW5nLmlkLAorCQkJICAgICBGV0NNRF9SSU5HX1RZUEVfTUNDLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwlBU1NFUlQoc3RhdHVzID09IDApOworCisJLyogUmVsZWFzZSB0aGUgU1EgcmVmZXJlbmNlIHRvIHRoZSBDUSAqLworCWF0b21pY19kZWMoJm1jYy0+Y3Ffb2JqZWN0LT5yZWZfY291bnQpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHZvaWQKK21jY193cmJfc3luY19jYih2b2lkICpjb250ZXh0LCBpbnQgc3RhdXMsIHN0cnVjdCBNQ0NfV1JCX0FNQVAgKndyYikKK3sKKwlzdHJ1Y3QgYmVfbWNjX3dyYl9jb250ZXh0ICp3cmJfY29udGV4dCA9CisJCQkJKHN0cnVjdCBiZV9tY2Nfd3JiX2NvbnRleHQgKikgY29udGV4dDsKKwlBU1NFUlQod3JiX2NvbnRleHQpOworCSp3cmJfY29udGV4dC0+dXNlcnNfZmluYWxfc3RhdHVzID0gc3RhdXM7Cit9CisKKy8qCisgICAgVGhpcyByb3V0aW5lIHBvc3RzIGEgY29tbWFuZCB0byB0aGUgTUNDIHNlbmQgcXVldWUKKworICAgIG1jYyAgICAgICAtIEludGVybmFsIE1jYyBPYmplY3QgdG8gYmUgZGVzdHJveWVkLgorCisgICAgd3JiICAgICAgICAgICAgIC0gd3JiIHRvIHBvc3QuCisKKyAgICBSZXR1cm5zIEJFX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bGwsIG90aGVyd2lzZSBhbiBlcnJvciBjb2RlIGlzIHJldHVybmVkLgorCisgICAgSVJRTCA8IERJU1BBVENIX0xFVkVMIGlmIENvbXBsZXRpb25DYWxsYmFjayBpcyBub3QgTlVMTAorICAgIElSUUwgPD1ESVNQQVRDSF9MRVZFTCBpZiBDb21wbGV0aW9uQ2FsbGJhY2sgaXMgIE5VTEwKKworICAgIElmIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2l0aCBDb21wbGV0aW9uQ2FsbGJhY2sgIT0gTlVMTCB0aGUKKyAgICBjYWxsIGlzIGNvbnNpZGVyZWQgdG8gYmUgYXN5bmNocm9ub3VzIGFuZCB3aWxsIHJldHVybiBhcyBzb29uCisgICAgYXMgdGhlIFdSQiBpcyBwb3N0ZWQgdG8gdGhlIE1DQyB3aXRoIEJFX1BFTkRJTkcuCisKKyAgICBJZiBDb21wbGV0aW9uQ2FsbGJhY2sgaXMgTlVMTCwgdGhlbiB0aGlzIHJvdXRpbmUgd2lsbCBub3QgcmV0dXJuIHVudGlsCisgICAgYSBjb21wbGV0aW9uIGZvciB0aGlzIE1DQyBjb21tYW5kIGhhcyBiZWVuIHByb2Nlc3NlZC4KKyAgICBJZiBjYWxsZWQgYXQgRElTUEFUQ0hfTEVWRUwgdGhlIENvbXBsZXRpb25DYWxsYmFjayBtdXN0IGJlIE5VTEwuCisKKyAgICBUaGlzIHJvdXRpbmUgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIHRoZSBNUFUgaGFzIGJlZW4gYm9vc3RyYXBlZCBwYXN0CisgICAgbWFpbGJveCBtb2RlLgorCisKKyovCitpbnQKK19iZV9tcHVfcG9zdF93cmJfcmluZyhzdHJ1Y3QgYmVfbWNjX29iamVjdCAqbWNjLCBzdHJ1Y3QgTUNDX1dSQl9BTUFQICp3cmIsCisJCQkJc3RydWN0IGJlX21jY193cmJfY29udGV4dCAqd3JiX2NvbnRleHQpCit7CisKKwlzdHJ1Y3QgTUNDX1dSQl9BTUFQICpyaW5nX3dyYiA9IE5VTEw7CisJaW50IHN0YXR1cyA9IEJFX1BFTkRJTkc7CisJaW50IGZpbmFsX3N0YXR1cyA9IEJFX1BFTkRJTkc7CisJbWNjX3dyYl9jcWVfY2FsbGJhY2sgY2IgPSBOVUxMOworCXN0cnVjdCBNQ0NfREJfQU1BUCBtY2NfZGI7CisJdTMyIGVtYmVkZGVkOworCisJQVNTRVJUKG1wX3JpbmdfbnVtX2VtcHR5KCZtY2MtPnNxLnJpbmcpID4gMCk7CisJLyoKKwkgKiBJbnB1dCB3cmIgaXMgbW9zdCBsaWtlbHkgdGhlIG5leHQgd3JiIGluIHRoZSByaW5nLCBzaW5jZSB0aGUgY2xpZW50CisJICogY2FuIHBlZWsgYXQgdGhlIGFkZHJlc3MuCisJICovCisJcmluZ193cmIgPSBtcF9yaW5nX3Byb2R1Y2VyX3B0cigmbWNjLT5zcS5yaW5nKTsKKwlpZiAod3JiICE9IHJpbmdfd3JiKSB7CisJCS8qIElmIG5vdCBlcXVhbCwgY29weSBpdCBpbnRvIHRoZSByaW5nLiAqLworCQltZW1jcHkocmluZ193cmIsIHdyYiwgc2l6ZW9mKHN0cnVjdCBNQ0NfV1JCX0FNQVApKTsKKwl9CisjaWZkZWYgQkVfREVCVUcKKwl3cmJfY29udGV4dC0+cmluZ193cmIgPSByaW5nX3dyYjsKKyNlbmRpZgorCWVtYmVkZGVkID0gQU1BUF9HRVRfQklUU19QVFIoTUNDX1dSQiwgZW1iZWRkZWQsIHJpbmdfd3JiKTsKKwlpZiAoZW1iZWRkZWQpIHsKKwkJLyogZW1iZWRkZWQgY29tbWFuZHMgd2lsbCBoYXZlIHRoZSByZXNwb25zZSB3aXRoaW4gdGhlIFdSQi4gKi8KKwkJd3JiX2NvbnRleHQtPndyYiA9IHJpbmdfd3JiOworCX0gZWxzZSB7CisJCS8qCisJCSAqIG5vbi1lbWJlZGRlZCBjb21tYW5kcyB3aWxsIG5vdCBoYXZlIHRoZSByZXNwb25zZQorCQkgKiB3aXRoaW4gdGhlIFdSQiwgYW5kIHRoZXkgbWF5IGNvbXBsZXRlIG91dC1vZi1vcmRlci4KKwkJICogVGhlIFdSQiB3aWxsIG5vdCBiZSB2YWxpZCB0byBpbnNwZWN0CisJCSAqIGR1cmluZyB0aGUgY29tcGxldGlvbi4KKwkJICovCisJCXdyYl9jb250ZXh0LT53cmIgPSBOVUxMOworCX0KKwljYiA9IHdyYl9jb250ZXh0LT5jYjsKKworCWlmIChjYiA9PSBOVUxMKSB7CisJCS8qIEFzc2lnbiBvdXIgaW50ZXJuYWwgY2FsbGJhY2sgaWYgdGhpcyBpcyBhCisJCSAqIHN5bmNocm9ub3VzIGNhbGwuICovCisJCXdyYl9jb250ZXh0LT5jYiA9IG1jY193cmJfc3luY19jYjsKKwkJd3JiX2NvbnRleHQtPmNiX2NvbnRleHQgPSB3cmJfY29udGV4dDsKKwkJd3JiX2NvbnRleHQtPnVzZXJzX2ZpbmFsX3N0YXR1cyA9ICZmaW5hbF9zdGF0dXM7CisJfQorCS8qIEluY3JlbWVudCBwcm9kdWNlciBpbmRleCAqLworCisJbWNjX2RiLmR3WzBdID0gMDsJCS8qIGluaXRpYWxpemUgKi8KKwlBTUFQX1NFVF9CSVRTX1BUUihNQ0NfREIsIHJpZCwgJm1jY19kYiwgbWNjLT5zcS5yaW5nLmlkKTsKKwlBTUFQX1NFVF9CSVRTX1BUUihNQ0NfREIsIG51bVBvc3RlZCwgJm1jY19kYiwgMSk7CisKKwltcF9yaW5nX3Byb2R1Y2UoJm1jYy0+c3EucmluZyk7CisJUERfV1JJVEUobWNjLT5wYXJlbnRfZnVuY3Rpb24sIG1wdV9tY2NfZGIsIG1jY19kYi5kd1swXSk7CisJVFJBQ0UoRExfSU5GTywgInBpZHg6ICV4IGFuZCBjaWR4OiAleC4iLCBtY2MtPnNxLnJpbmcucGlkeCwKKwkgICAgICBtY2MtPnNxLnJpbmcuY2lkeCk7CisKKwlpZiAoY2IgPT0gTlVMTCkgeworCQlpbnQgcG9sbHMgPSAwOwkvKiBBdCA+PSAxIHVzIHBlciBwb2xsICAgKi8KKwkJLyogV2FpdCB1bnRpbCB0aGlzIGNvbW1hbmQgY29tcGxldGVzLCBwb2xsaW5nIHRoZSBDUS4gKi8KKwkJZG8geworCQkJVFJBQ0UoRExfSU5GTywgIkZXQ01EIHN1Ym1pdHRlZCBpbiB0aGUgcG9sbCBtb2RlLiIpOworCQkJLyogRG8gbm90IHJlYXJtIENRIGluIHRoaXMgY29udGV4dC4gKi8KKwkJCWJlX21jY19wcm9jZXNzX2NxKG1jYywgZmFsc2UpOworCisJCQlpZiAoZmluYWxfc3RhdHVzID09IEJFX1BFTkRJTkcpIHsKKwkJCQlpZiAoKCsrcG9sbHMgJiAweDdGRkZGKSA9PSAwKSB7CisJCQkJCVRSQUNFKERMX1dBUk4sCisJCQkJCSAgICAgICJXYXJuaW5nIDogcG9sbGluZyBNQ0MgQ1EgZm9yICVkIgorCQkJCQkgICAgICAibXMuIiwgcG9sbHMgLyAxMDAwKTsKKwkJCQl9CisKKwkJCQl1ZGVsYXkoMSk7CisJCQl9CisKKwkJCS8qIGZpbmFsX3N0YXR1cyBjaGFuZ2VkIHdoZW4gdGhlIGNvbW1hbmQgY29tcGxldGVzICovCisJCX0gd2hpbGUgKGZpbmFsX3N0YXR1cyA9PSBCRV9QRU5ESU5HKTsKKworCQlzdGF0dXMgPSBmaW5hbF9zdGF0dXM7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RydWN0IE1DQ19XUkJfQU1BUCAqCitfYmVfbXB1X3BlZWtfcmluZ193cmIoc3RydWN0IGJlX21jY19vYmplY3QgKm1jYywgYm9vbCBkcml2aW5nX3F1ZXVlKQoreworCS8qIElmIHdlIGhhdmUgcXVldWVkIGl0ZW1zLCBkbyBub3QgYWxsb3cgYSBwb3N0IHRvIGJ5cGFzcyB0aGUgcXVldWUuICovCisJaWYgKCFkcml2aW5nX3F1ZXVlICYmICFsaXN0X2VtcHR5KCZtY2MtPmJhY2tsb2cpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChtcF9yaW5nX251bV9lbXB0eSgmbWNjLT5zcS5yaW5nKSA8PSAwKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gKHN0cnVjdCBNQ0NfV1JCX0FNQVAgKikgbXBfcmluZ19wcm9kdWNlcl9wdHIoJm1jYy0+c3EucmluZyk7Cit9CisKK2ludAorYmVfbXB1X2luaXRfbWFpbGJveChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iLCBzdHJ1Y3QgcmluZ19kZXNjICptYWlsYm94KQoreworCUFTU0VSVChtYWlsYm94KTsKKwlwZm9iLT5tYWlsYm94LnZhID0gbWFpbGJveC0+dmE7CisJcGZvYi0+bWFpbGJveC5wYSA9ICBjcHVfdG9fbGU2NChtYWlsYm94LT5wYSk7CisJcGZvYi0+bWFpbGJveC5sZW5ndGggPSBtYWlsYm94LT5sZW5ndGg7CisKKwlBU1NFUlQoKCh1MzIpKHNpemVfdClwZm9iLT5tYWlsYm94LnZhICYgMHhmKSA9PSAwKTsKKwlBU1NFUlQoKCh1MzIpKHNpemVfdClwZm9iLT5tYWlsYm94LnBhICYgMHhmKSA9PSAwKTsKKwkvKgorCSAqIElzc3VlIHRoZSBXUkIgdG8gc2V0IE1QVSBlbmRpYW5uZXNzCisJICovCisJeworCQl1NjQgKmVuZGlhbl9jaGVjayA9ICh1NjQgKikgKHBmb2ItPm1haWxib3gudmEgKworCQkJCW9mZnNldG9mKHN0cnVjdCBCRV9NQ0NfTUFJTEJPWF9BTUFQLCB3cmIpLzgpOworCQkqZW5kaWFuX2NoZWNrID0gMHhGRjEyMzRGRkZGNTY3OEZGVUxMOworCX0KKworCWJlX21jY19tYWlsYm94X25vdGlmeV9hbmRfd2FpdChwZm9iKTsKKworCXJldHVybiBCRV9TVUNDRVNTOworfQorCisKKy8qCisgICAgVGhpcyByb3V0aW5lIHBvc3RzIGEgY29tbWFuZCB0byB0aGUgTUNDIG1haWxib3guCisKKyAgICBGdW5jT2JqICAgICAgICAgLSBGdW5jdGlvbiBPYmplY3QgdG8gcG9zdCB0aGUgV1JCIG9uIGJlaGFsZiBvZi4KKyAgICB3cmIgICAgICAgICAgICAgLSB3cmIgdG8gcG9zdC4KKyAgICBDb21wbGV0aW9uQ2FsbGJhY2sgIC0gQWRkcmVzcyBvZiBhIGNhbGxiYWNrIHJvdXRpbmUgdG8gaW52b2tlIG9uY2UgdGhlIFdSQgorCQkJCWlzIGNvbXBsZXRlZC4KKyAgICBDb21wbGV0aW9uQ2FsbGJhY2tDb250ZXh0IC0gT3BhcXVlIGNvbnRleHQgdG8gYmUgcGFzc2VkIGR1cmluZyB0aGUgY2FsbCB0bworCQkJCXRoZSBDb21wbGV0aW9uQ2FsbGJhY2suCisgICAgUmV0dXJucyBCRV9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWxsLCBvdGhlcndpc2UgYW4gZXJyb3IgY29kZSBpcyByZXR1cm5lZC4KKworICAgIElSUUwgPD1ESVNQQVRDSF9MRVZFTCBpZiBDb21wbGV0aW9uQ2FsbGJhY2sgaXMgIE5VTEwKKworICAgIFRoaXMgcm91dGluZSB3aWxsIGJsb2NrIHVudGlsIGEgY29tcGxldGlvbiBmb3IgdGhpcyBNQ0MgY29tbWFuZCBoYXMgYmVlbgorICAgIHByb2Nlc3NlZC4gSWYgY2FsbGVkIGF0IERJU1BBVENIX0xFVkVMIHRoZSBDb21wbGV0aW9uQ2FsbGJhY2sgbXVzdCBiZSBOVUxMLgorCisgICAgVGhpcyByb3V0aW5lIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpZiB0aGUgTVBVIGhhcyBub3QgYmVlbiBib29zdHJhcGVkIHBhc3QKKyAgICBtYWlsYm94IG1vZGUuCisqLworaW50CitfYmVfbXB1X3Bvc3Rfd3JiX21haWxib3goc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYiwKKwkgc3RydWN0IE1DQ19XUkJfQU1BUCAqd3JiLCBzdHJ1Y3QgYmVfbWNjX3dyYl9jb250ZXh0ICp3cmJfY29udGV4dCkKK3sKKwlzdHJ1Y3QgTUNDX01BSUxCT1hfQU1BUCAqbWFpbGJveCA9IE5VTEw7CisJc3RydWN0IE1DQ19XUkJfQU1BUCAqbWJfd3JiOworCXN0cnVjdCBNQ0NfQ1FfRU5UUllfQU1BUCAqbWJfY3E7CisJdTMyIG9mZnNldCwgc3RhdHVzOworCisJQVNTRVJUKHBmb2ItPm1jYyA9PSBOVUxMKTsKKwltYWlsYm94ID0gcGZvYi0+bWFpbGJveC52YTsKKwlBU1NFUlQobWFpbGJveCk7CisKKwlvZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgQkVfTUNDX01BSUxCT1hfQU1BUCwgd3JiKS84OworCW1iX3dyYiA9IChzdHJ1Y3QgTUNDX1dSQl9BTUFQICopICh1OCAqKW1haWxib3ggKyBvZmZzZXQ7CisJaWYgKG1iX3dyYiAhPSB3cmIpIHsKKwkJbWVtc2V0KG1haWxib3gsIDAsIHNpemVvZigqbWFpbGJveCkpOworCQltZW1jcHkobWJfd3JiLCB3cmIsIHNpemVvZihzdHJ1Y3QgTUNDX1dSQl9BTUFQKSk7CisJfQorCS8qIFRoZSBjYWxsYmFjayBjYW4gaW5zcGVjdCB0aGUgZmluYWwgV1JCIHRvIGdldCBvdXRwdXQgcGFyYW1ldGVycy4gKi8KKwl3cmJfY29udGV4dC0+d3JiID0gbWJfd3JiOworCisJYmVfbWNjX21haWxib3hfbm90aWZ5X2FuZF93YWl0KHBmb2IpOworCisJLyogQSBjb21tYW5kIGNvbXBsZXRlZC4gIFVzZSB0YWcgdG8gZGV0ZXJtaW5lIHdoaWNoIGNvbW1hbmQuICovCisJb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IEJFX01DQ19NQUlMQk9YX0FNQVAsIGNxKS84OworCW1iX2NxID0gKHN0cnVjdCBNQ0NfQ1FfRU5UUllfQU1BUCAqKSAoKHU4ICopbWFpbGJveCArIG9mZnNldCk7CisJYmVfbWNjX3Byb2Nlc3NfY3FlKHBmb2IsIG1iX2NxKTsKKworCXN0YXR1cyA9IEFNQVBfR0VUX0JJVFNfUFRSKE1DQ19DUV9FTlRSWSwgY29tcGxldGlvbl9zdGF0dXMsIG1iX2NxKTsKKwlpZiAoc3RhdHVzKQorCQlzdGF0dXMgPSBCRV9OT1RfT0s7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RydWN0IGJlX21jY193cmJfY29udGV4dCAqCitfYmVfbWNjX2FsbG9jYXRlX3dyYl9jb250ZXh0KHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IpCit7CisJc3RydWN0IGJlX21jY193cmJfY29udGV4dCAqY29udGV4dCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBpcnE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGZvYi0+bWNjX2NvbnRleHRfbG9jaywgaXJxKTsKKworCWlmICghcGZvYi0+bWFpbGJveC5kZWZhdWx0X2NvbnRleHRfYWxsb2NhdGVkKSB7CisJCS8qIFVzZSB0aGUgc2luZ2xlIGRlZmF1bHQgY29udGV4dCB0aGF0IHdlCisJCSAqIGFsd2F5cyBoYXZlIGFsbG9jYXRlZC4gKi8KKwkJcGZvYi0+bWFpbGJveC5kZWZhdWx0X2NvbnRleHRfYWxsb2NhdGVkID0gdHJ1ZTsKKwkJY29udGV4dCA9ICZwZm9iLT5tYWlsYm94LmRlZmF1bHRfY29udGV4dDsKKwl9IGVsc2UgaWYgKHBmb2ItPm1jYykgeworCQkvKiBHZXQgYSBjb250ZXh0IGZyb20gdGhlIGZyZWUgbGlzdC4gSWYgYW55IGFyZSBhdmFpbGFibGUuICovCisJCWlmICghbGlzdF9lbXB0eSgmcGZvYi0+bWNjLT53cmJfY29udGV4dC5saXN0X2hlYWQpKSB7CisJCQljb250ZXh0ID0gbGlzdF9maXJzdF9lbnRyeSgKKwkJCQkmcGZvYi0+bWNjLT53cmJfY29udGV4dC5saXN0X2hlYWQsCisJCQkJCSBzdHJ1Y3QgYmVfbWNjX3dyYl9jb250ZXh0LCBuZXh0KTsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmb2ItPm1jY19jb250ZXh0X2xvY2ssIGlycSk7CisKKwlyZXR1cm4gY29udGV4dDsKK30KKwordm9pZAorX2JlX21jY19mcmVlX3dyYl9jb250ZXh0KHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IsCisJCQkgc3RydWN0IGJlX21jY193cmJfY29udGV4dCAqY29udGV4dCkKK3sKKwl1bnNpZ25lZCBsb25nIGlycTsKKworCUFTU0VSVChjb250ZXh0KTsKKwkvKgorCSAqIFplcm8gZHVyaW5nIGZyZWUgdG8gdHJ5IGFuZCBjYXRjaCBhbnkgYnVncyB3aGVyZSB0aGUgY29udGV4dAorCSAqIGlzIGFjY2Vzc2VkIGFmdGVyIGEgZnJlZS4KKwkgKi8KKwltZW1zZXQoY29udGV4dCwgMCwgc2l6ZW9mKGNvbnRleHQpKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZm9iLT5tY2NfY29udGV4dF9sb2NrLCBpcnEpOworCisJaWYgKGNvbnRleHQgPT0gJnBmb2ItPm1haWxib3guZGVmYXVsdF9jb250ZXh0KSB7CisJCS8qIEZyZWUgdGhlIGRlZmF1bHQgY29udGV4dC4gKi8KKwkJQVNTRVJUKHBmb2ItPm1haWxib3guZGVmYXVsdF9jb250ZXh0X2FsbG9jYXRlZCk7CisJCXBmb2ItPm1haWxib3guZGVmYXVsdF9jb250ZXh0X2FsbG9jYXRlZCA9IGZhbHNlOworCX0gZWxzZSB7CisJCS8qIEFkZCB0byBmcmVlIGxpc3QuICovCisJCUFTU0VSVChwZm9iLT5tY2MpOworCQlsaXN0X2FkZF90YWlsKCZjb250ZXh0LT5uZXh0LAorCQkJCSZwZm9iLT5tY2MtPndyYl9jb250ZXh0Lmxpc3RfaGVhZCk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZvYi0+bWNjX2NvbnRleHRfbG9jaywgaXJxKTsKK30KKworaW50CitiZV9tY2NfYWRkX2FzeW5jX2V2ZW50X2NhbGxiYWNrKHN0cnVjdCBiZV9tY2Nfb2JqZWN0ICptY2Nfb2JqZWN0LAorCQltY2NfYXN5bmNfZXZlbnRfY2FsbGJhY2sgY2IsIHZvaWQgKmNiX2NvbnRleHQpCit7CisJLyogTG9jayBhZ2FpbnN0IGFueW9uZSB0cnlpbmcgdG8gY2hhbmdlIHRoZSBjYWxsYmFjay9jb250ZXh0IHBvaW50ZXJzCisJICogd2hpbGUgYmVpbmcgdXNlZC4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWNjX29iamVjdC0+cGFyZW50X2Z1bmN0aW9uLT5jcV9sb2NrLAorCQltY2Nfb2JqZWN0LT5wYXJlbnRfZnVuY3Rpb24tPmNxX2lycSk7CisKKwkvKiBBc3NpZ24gdGhlIGFzeW5jIGNhbGxiYWNrLiAqLworCW1jY19vYmplY3QtPmFzeW5jX2NvbnRleHQgPSBjYl9jb250ZXh0OworCW1jY19vYmplY3QtPmFzeW5jX2NiID0gY2I7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtY2Nfb2JqZWN0LT5wYXJlbnRfZnVuY3Rpb24tPmNxX2xvY2ssCisJCQkJCW1jY19vYmplY3QtPnBhcmVudF9mdW5jdGlvbi0+Y3FfaXJxKTsKKworCXJldHVybiBCRV9TVUNDRVNTOworfQorCisjZGVmaW5lIE1QVV9FUF9DT05UUk9MIDAKKyNkZWZpbmUgTVBVX0VQX1NFTUFQSE9SRSAweGFjCisKKy8qCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOiBiZV93YWl0X2Zvcl9QT1NUX2NvbXBsZXRlCisgKiAgIFdhaXRzIHVudGlsIHRoZSBCbGFkZUVuZ2luZSBQT1NUIGNvbXBsZXRlcyAoZWl0aGVyIGluIGVycm9yIG9yIHN1Y2Nlc3MpLgorICogcGZvYiAtCisgKiByZXR1cm4gc3RhdHVzICAgLSBCRV9TVUNDRVNTICgwKSBvbiBzdWNjZXNzLiBOZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIGludCBiZV93YWl0X2Zvcl9QT1NUX2NvbXBsZXRlKHN0cnVjdCBiZV9mdW5jdGlvbl9vYmplY3QgKnBmb2IpCit7CisJc3RydWN0IE1HTVRfSEJBX1BPU1RfU1RBVFVTX1NUUlVDVF9BTUFQIHN0YXR1czsKKwlpbnQgczsKKwl1MzIgcG9zdF9lcnJvciwgcG9zdF9zdGFnZTsKKworCWNvbnN0IHUzMiB1c19wZXJfbG9vcCA9IDEwMDA7CS8qIDEwMDB1cyAqLworCWNvbnN0IHUzMiBwcmludF9mcmVxdWVuY3lfbG9vcHMgPSAxMDAwMDAwIC8gdXNfcGVyX2xvb3A7CisJY29uc3QgdTMyIG1heF9sb29wcyA9IDYwICogcHJpbnRfZnJlcXVlbmN5X2xvb3BzOworCXUzMiBsb29wcyA9IDA7CisKKwkvKgorCSAqIFdhaXQgZm9yIGFybSBmdyBpbmRpY2F0aW5nIGl0IGlzIGRvbmUgb3IgYSBmYXRhbCBlcnJvciBoYXBwZW5lZC4KKwkgKiBOb3RlOiBQT1NUIGNhbiB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBkZXBlbmRpbmcgb24gY29uZmlndXJhdGlvbgorCSAqIHNldHRpbmdzIChjb25zaWRlciBBUk0gYXR0ZW1wdHMgdG8gYWNxdWlyZSBhbiBJUCBhZGRyZXNzCisJICogb3ZlciBESENQISEhKS4KKwkgKgorCSAqLworCWRvIHsKKwkJc3RhdHVzLmR3WzBdID0gaW9yZWFkMzIocGZvYi0+Y3NyX3ZhICsgTVBVX0VQX1NFTUFQSE9SRSk7CisJCXBvc3RfZXJyb3IgPSBBTUFQX0dFVF9CSVRTX1BUUihNR01UX0hCQV9QT1NUX1NUQVRVU19TVFJVQ1QsCisJCQkJCQllcnJvciwgJnN0YXR1cyk7CisJCXBvc3Rfc3RhZ2UgPSBBTUFQX0dFVF9CSVRTX1BUUihNR01UX0hCQV9QT1NUX1NUQVRVU19TVFJVQ1QsCisJCQkJCQlzdGFnZSwgJnN0YXR1cyk7CisJCWlmICgwID09IChsb29wcyAlIHByaW50X2ZyZXF1ZW5jeV9sb29wcykpIHsKKwkJCS8qIFByaW50IGN1cnJlbnQgc3RhdHVzICovCisJCQlUUkFDRShETF9JTkZPLCAiUE9TVCBzdGF0dXMgPSAweCV4IChzdGFnZSA9IDB4JXgpIiwKKwkJCQlzdGF0dXMuZHdbMF0sIHBvc3Rfc3RhZ2UpOworCQl9CisJCXVkZWxheSh1c19wZXJfbG9vcCk7CisJfSB3aGlsZSAoKHBvc3RfZXJyb3IgIT0gMSkgJiYKKwkJIChwb3N0X3N0YWdlICE9IFBPU1RfU1RBR0VfQVJNRldfUkVBRFkpICYmCisJCSAoKytsb29wcyA8IG1heF9sb29wcykpOworCisJaWYgKHBvc3RfZXJyb3IgPT0gMSkgeworCQlUUkFDRShETF9FUlIsICJQT1NUIGVycm9yISBTdGF0dXMgPSAweCV4IChzdGFnZSA9IDB4JXgpIiwKKwkJICAgICAgc3RhdHVzLmR3WzBdLCBwb3N0X3N0YWdlKTsKKwkJcyA9IEJFX05PVF9PSzsKKwl9IGVsc2UgaWYgKHBvc3Rfc3RhZ2UgIT0gUE9TVF9TVEFHRV9BUk1GV19SRUFEWSkgeworCQlUUkFDRShETF9FUlIsICJQT1NUIHRpbWUtb3V0ISBTdGF0dXMgPSAweCV4IChzdGFnZSA9IDB4JXgpIiwKKwkJICAgICAgc3RhdHVzLmR3WzBdLCBwb3N0X3N0YWdlKTsKKwkJcyA9IEJFX05PVF9PSzsKKwl9IGVsc2UgeworCQlzID0gQkVfU1VDQ0VTUzsKKwl9CisJcmV0dXJuIHM7Cit9CisKKy8qCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOiBiZV9raWNrb2ZmX2FuZF93YWl0X2Zvcl9QT1NUCisgKiAgIEludGVyYWN0cyB3aXRoIHRoZSBCbGFkZUVuZ2luZSBtYW5hZ2VtZW50IHByb2Nlc3NvciB0byBpbml0aWF0ZSBQT1NULCBhbmQKKyAqICAgc3Vic2VxdWVudGx5IHdhaXRzIHVudGlsIFBPU1QgY29tcGxldGVzIChlaXRoZXIgaW4gZXJyb3Igb3Igc3VjY2VzcykuCisgKiAgIFRoZSBjYWxsZXIgbXVzdCBhY3F1aXJlIHRoZSByZXNldCBzZW1hcGhvcmUgYmVmb3JlIGluaXRpYXRpbmcgUE9TVAorICogICB0byBwcmV2ZW50IG11bHRpcGxlIGRyaXZlcnMgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgbWFuYWdlbWVudCBwcm9jZXNzb3IuCisgKiAgIE9uY2UgUE9TVCBpcyBjb21wbGV0ZSB0aGUgY2FsbGVyIG11c3QgcmVsZWFzZSB0aGUgcmVzZXQgc2VtYXBob3JlLgorICogICBDYWxsZXJzIHdobyBvbmx5IHdhbnQgdG8gd2FpdCBmb3IgUE9TVCBjb21wbGV0ZSBtYXkgY2FsbAorICogICBiZV93YWl0X2Zvcl9QT1NUX2NvbXBsZXRlLgorICogcGZvYiAtCisgKiByZXR1cm4gc3RhdHVzICAgLSBCRV9TVUNDRVNTICgwKSBvbiBzdWNjZXNzLiBOZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIGludAorYmVfa2lja29mZl9hbmRfd2FpdF9mb3JfUE9TVChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iKQoreworCXN0cnVjdCBNR01UX0hCQV9QT1NUX1NUQVRVU19TVFJVQ1RfQU1BUCBzdGF0dXM7CisJaW50IHM7CisKKwljb25zdCB1MzIgdXNfcGVyX2xvb3AgPSAxMDAwOwkvKiAxMDAwdXMgKi8KKwljb25zdCB1MzIgcHJpbnRfZnJlcXVlbmN5X2xvb3BzID0gMTAwMDAwMCAvIHVzX3Blcl9sb29wOworCWNvbnN0IHUzMiBtYXhfbG9vcHMgPSA1ICogcHJpbnRfZnJlcXVlbmN5X2xvb3BzOworCXUzMiBsb29wcyA9IDA7CisJdTMyIHBvc3RfZXJyb3IsIHBvc3Rfc3RhZ2U7CisKKwkvKiBXYWl0IGZvciBhcm0gZncgYXdhaXRpbmcgaG9zdCByZWFkeSBvciBhIGZhdGFsIGVycm9yIGhhcHBlbmVkLiAqLworCVRSQUNFKERMX0lORk8sICJXYWl0IGZvciBCbGFkZUVuZ2luZSByZWFkeSB0byBQT1NUIik7CisJZG8geworCQlzdGF0dXMuZHdbMF0gPSBpb3JlYWQzMihwZm9iLT5jc3JfdmEgKyBNUFVfRVBfU0VNQVBIT1JFKTsKKwkJcG9zdF9lcnJvciA9IEFNQVBfR0VUX0JJVFNfUFRSKE1HTVRfSEJBX1BPU1RfU1RBVFVTX1NUUlVDVCwKKwkJCQkJCWVycm9yLCAmc3RhdHVzKTsKKwkJcG9zdF9zdGFnZSA9IEFNQVBfR0VUX0JJVFNfUFRSKE1HTVRfSEJBX1BPU1RfU1RBVFVTX1NUUlVDVCwKKwkJCQkJCXN0YWdlLCAmc3RhdHVzKTsKKwkJaWYgKDAgPT0gKGxvb3BzICUgcHJpbnRfZnJlcXVlbmN5X2xvb3BzKSkgeworCQkJLyogUHJpbnQgY3VycmVudCBzdGF0dXMgKi8KKwkJCVRSQUNFKERMX0lORk8sICJQT1NUIHN0YXR1cyA9IDB4JXggKHN0YWdlID0gMHgleCkiLAorCQkJICAgICAgc3RhdHVzLmR3WzBdLCBwb3N0X3N0YWdlKTsKKwkJfQorCQl1ZGVsYXkodXNfcGVyX2xvb3ApOworCX0gd2hpbGUgKChwb3N0X2Vycm9yICE9IDEpICYmCisJCSAocG9zdF9zdGFnZSA8IFBPU1RfU1RBR0VfQVdBSVRJTkdfSE9TVF9SRFkpICYmCisJCSAoKytsb29wcyA8IG1heF9sb29wcykpOworCisJaWYgKHBvc3RfZXJyb3IgPT0gMSkgeworCQlUUkFDRShETF9FUlIsICJQcmUtUE9TVCBlcnJvciEgU3RhdHVzID0gMHgleCAoc3RhZ2UgPSAweCV4KSIsCisJCSAgICAgIHN0YXR1cy5kd1swXSwgcG9zdF9zdGFnZSk7CisJCXMgPSBCRV9OT1RfT0s7CisJfSBlbHNlIGlmIChwb3N0X3N0YWdlID09IFBPU1RfU1RBR0VfQVdBSVRJTkdfSE9TVF9SRFkpIHsKKwkJaW93cml0ZTMyKFBPU1RfU1RBR0VfSE9TVF9SRFksIHBmb2ItPmNzcl92YSArIE1QVV9FUF9TRU1BUEhPUkUpOworCisJCS8qIFdhaXQgZm9yIFBPU1QgdG8gY29tcGxldGUgKi8KKwkJcyA9IGJlX3dhaXRfZm9yX1BPU1RfY29tcGxldGUocGZvYik7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogRWl0aGVyIGEgdGltZW91dCB3YWl0aW5nIGZvciBob3N0IHJlYWR5IHNpZ25hbCBvciBQT1NUIGhhcworCQkgKiBtb3ZlZCBhaGVhZCB3aXRob3V0IHJlcXVpcmluZyBhIGhvc3QgcmVhZHkgc2lnbmFsLgorCQkgKiBNaWdodCBhcyB3ZWxsIGdpdmUgUE9TVCBhIGNoYW5jZSB0byBjb21wbGV0ZQorCQkgKiAob3IgdGltZW91dCBhZ2FpbikuCisJCSAqLworCQlzID0gYmVfd2FpdF9mb3JfUE9TVF9jb21wbGV0ZShwZm9iKTsKKwl9CisJcmV0dXJuIHM7Cit9CisKKy8qCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOiBiZV9wY2lfc29mdF9yZXNldAorICogICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBpc3N1ZSBhIEJsYWRlRW5naW5lIHNvZnQgcmVzZXQuCisgKiAgIENhbGxlcnMgc2hvdWxkIGFjcXVpcmUgdGhlIHNvZnQgcmVzZXQgc2VtYXBob3JlIGJlZm9yZSBjYWxsaW5nIHRoaXMKKyAqICAgZnVuY3Rpb24uIEFkZGl0aW9uYWx5LCBjYWxsZXJzIHNob3VsZCBlbnN1cmUgdGhleSBjYW5ub3QgYmUgcHJlLWVtcHRlZAorICogICB3aGlsZSB0aGUgcm91dGluZSBleGVjdXRlcy4gVXBvbiBjb21wbGV0aW9uIG9mIHRoaXMgcm91dGluZSwgY2FsbGVycworICogICBzaG91bGQgcmVsZWFzZSB0aGUgcmVzZXQgc2VtYXBob3JlLiBUaGlzIHJvdXRpbmUgaW1wbGljaXRseSB3YWl0cworICogICBmb3IgQmxhZGVFbmdpbmUgUE9TVCB0byBjb21wbGV0ZS4KKyAqIHBmb2IgLQorICogcmV0dXJuIHN0YXR1cyAgIC0gQkVfU1VDQ0VTUyAoMCkgb24gc3VjY2Vzcy4gTmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2ludCBiZV9wY2lfc29mdF9yZXNldChzdHJ1Y3QgYmVfZnVuY3Rpb25fb2JqZWN0ICpwZm9iKQoreworCXN0cnVjdCBQQ0lDRkdfU09GVF9SRVNFVF9DU1JfQU1BUCBzb2Z0X3Jlc2V0OworCXN0cnVjdCBQQ0lDRkdfT05MSU5FMF9DU1JfQU1BUCBwY2lPbmxpbmUwOworCXN0cnVjdCBQQ0lDRkdfT05MSU5FMV9DU1JfQU1BUCBwY2lPbmxpbmUxOworCXN0cnVjdCBFUF9DT05UUk9MX0NTUl9BTUFQIGVwQ29udHJvbENzcjsKKwlpbnQgc3RhdHVzID0gQkVfU1VDQ0VTUzsKKwl1MzIgaSwgc29mdF9yZXNldF9iaXQ7CisKKwlUUkFDRShETF9OT1RFLCAiUENJIHJlc2V0Li4uIik7CisKKwkvKiBJc3N1ZSBzb2Z0IHJlc2V0ICMxIHRvIGdldCBCbGFkZUVuZ2luZSBpbnRvIGEga25vd24gc3RhdGUuICovCisJc29mdF9yZXNldC5kd1swXSA9IFBDSUNGRzBfUkVBRChwZm9iLCBzb2Z0X3Jlc2V0KTsKKwlBTUFQX1NFVF9CSVRTX1BUUihQQ0lDRkdfU09GVF9SRVNFVF9DU1IsIHNvZnRyZXNldCwgc29mdF9yZXNldC5kdywgMSk7CisJUENJQ0ZHMF9XUklURShwZm9iLCBob3N0X3RpbWVyX2ludF9jdHJsLCBzb2Z0X3Jlc2V0LmR3WzBdKTsKKwkvKgorCSAqIHdhaXQgdGlsIHNvZnQgcmVzZXQgaXMgZGVhc3NlcnRlZCAtIGhhcmR3YXJlCisJICogZGVhc3NlcnRzIGFmdGVyIHNvbWUgdGltZS4KKwkgKi8KKwlpID0gMDsKKwlkbyB7CisJCXVkZWxheSg1MCk7CisJCXNvZnRfcmVzZXQuZHdbMF0gPSBQQ0lDRkcwX1JFQUQocGZvYiwgc29mdF9yZXNldCk7CisJCXNvZnRfcmVzZXRfYml0ID0gQU1BUF9HRVRfQklUU19QVFIoUENJQ0ZHX1NPRlRfUkVTRVRfQ1NSLAorCQkJCQlzb2Z0cmVzZXQsIHNvZnRfcmVzZXQuZHcpOworCX0gd2hpbGUgKHNvZnRfcmVzZXRfYml0ICAmJiAoaSsrIDwgMTAyNCkpOworCWlmIChzb2Z0X3Jlc2V0X2JpdCAhPSAwKSB7CisJCVRSQUNFKERMX0VSUiwgIlNvZnQtcmVzZXQgIzEgZGlkIG5vdCBkZWFzc2VydCBhcyBleHBlY3RlZC4iKTsKKwkJc3RhdHVzID0gQkVfTk9UX09LOworCQlnb3RvIEVycm9yX2xhYmVsOworCX0KKwkvKiBNYXNrIGV2ZXJ5dGhpbmcgICovCisJUENJQ0ZHMF9XUklURShwZm9iLCB1ZV9zdGF0dXNfbG93X21hc2ssIDB4RkZGRkZGRkYpOworCVBDSUNGRzBfV1JJVEUocGZvYiwgdWVfc3RhdHVzX2hpX21hc2ssIDB4RkZGRkZGRkYpOworCS8qCisJICogU2V0IGV2ZXJ5dGhpbmcgb2ZmbGluZSBleGNlcHQgTVBVIElSQU0gKGl0IGlzIG9mZmxpbmUgd2l0aAorCSAqIHRoZSBzb2Z0LXJlc2V0LCBidXQgc29mdC1yZXNldCBkb2VzIG5vdCByZXNldCB0aGUgUENJQ0ZHIHJlZ2lzdGVycyEpCisJICovCisJcGNpT25saW5lMC5kd1swXSA9IDA7CisJcGNpT25saW5lMS5kd1swXSA9IDA7CisJQU1BUF9TRVRfQklUU19QVFIoUENJQ0ZHX09OTElORTFfQ1NSLCBtcHVfaXJhbV9vbmxpbmUsCisJCQkJcGNpT25saW5lMS5kdywgMSk7CisJUENJQ0ZHMF9XUklURShwZm9iLCBvbmxpbmUwLCBwY2lPbmxpbmUwLmR3WzBdKTsKKwlQQ0lDRkcwX1dSSVRFKHBmb2IsIG9ubGluZTEsIHBjaU9ubGluZTEuZHdbMF0pOworCisJdWRlbGF5KDIwMDAwKTsKKworCS8qIElzc3VlIHNvZnQgcmVzZXQgIzIuICovCisJQU1BUF9TRVRfQklUU19QVFIoUENJQ0ZHX1NPRlRfUkVTRVRfQ1NSLCBzb2Z0cmVzZXQsIHNvZnRfcmVzZXQuZHcsIDEpOworCVBDSUNGRzBfV1JJVEUocGZvYiwgaG9zdF90aW1lcl9pbnRfY3RybCwgc29mdF9yZXNldC5kd1swXSk7CisJLyoKKwkgKiB3YWl0IHRpbCBzb2Z0IHJlc2V0IGlzIGRlYXNzZXJ0ZWQgLSBoYXJkd2FyZQorCSAqIGRlYXNzZXJ0cyBhZnRlciBzb21lIHRpbWUuCisJICovCisJaSA9IDA7CisJZG8geworCQl1ZGVsYXkoNTApOworCQlzb2Z0X3Jlc2V0LmR3WzBdID0gUENJQ0ZHMF9SRUFEKHBmb2IsIHNvZnRfcmVzZXQpOworCQlzb2Z0X3Jlc2V0X2JpdCA9IEFNQVBfR0VUX0JJVFNfUFRSKFBDSUNGR19TT0ZUX1JFU0VUX0NTUiwKKwkJCQkJc29mdHJlc2V0LCBzb2Z0X3Jlc2V0LmR3KTsKKwl9IHdoaWxlIChzb2Z0X3Jlc2V0X2JpdCAgJiYgKGkrKyA8IDEwMjQpKTsKKwlpZiAoc29mdF9yZXNldF9iaXQgIT0gMCkgeworCQlUUkFDRShETF9FUlIsICJTb2Z0LXJlc2V0ICMxIGRpZCBub3QgZGVhc3NlcnQgYXMgZXhwZWN0ZWQuIik7CisJCXN0YXR1cyA9IEJFX05PVF9PSzsKKwkJZ290byBFcnJvcl9sYWJlbDsKKwl9CisKKworCXVkZWxheSgyMDAwMCk7CisKKwkvKiBUYWtlIE1QVSBvdXQgb2YgcmVzZXQuICovCisKKwllcENvbnRyb2xDc3IuZHdbMF0gPSBpb3JlYWQzMihwZm9iLT5jc3JfdmEgKyBNUFVfRVBfQ09OVFJPTCk7CisJQU1BUF9TRVRfQklUU19QVFIoRVBfQ09OVFJPTF9DU1IsIENQVV9yZXNldCwgJmVwQ29udHJvbENzciwgMCk7CisJaW93cml0ZTMyKCh1MzIpZXBDb250cm9sQ3NyLmR3WzBdLCBwZm9iLT5jc3JfdmEgKyBNUFVfRVBfQ09OVFJPTCk7CisKKwkvKiBLaWNrb2ZmIEJFIFBPU1QgYW5kIHdhaXQgZm9yIGNvbXBsZXRpb24gKi8KKwlzdGF0dXMgPSBiZV9raWNrb2ZmX2FuZF93YWl0X2Zvcl9QT1NUKHBmb2IpOworCitFcnJvcl9sYWJlbDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisKKy8qCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOiBiZV9wY2lfcmVzZXRfcmVxdWlyZWQKKyAqICAgVGhpcyBwcml2YXRlIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBkZXRlY3QgaWYgYSBob3N0IGVudGl0eSBpcworICogICByZXF1aXJlZCB0byBpc3N1ZSBhIFBDSSBzb2Z0IHJlc2V0IGFuZCBzdWJzZXF1ZW50bHkgZHJpdmUKKyAqICAgQmxhZGVFbmdpbmUgUE9TVC4gU2NlbmFyaW9zIHdoZXJlIHRoaXMgaXMgcmVxdWlyZWQ6CisgKiAgIDEpIEJJT1MtbGVzcyBjb25maWd1cmF0aW9uCisgKiAgIDIpIEhvdC1zd2FwL3BsdWcvcG93ZXItb24KKyAqIHBmb2IgLQorICogcmV0dXJuICAgdHJ1ZSBpZiBhIHJlc2V0IGlzIHJlcXVpcmVkLCBmYWxzZSBvdGhlcndpc2UKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgYm9vbCBiZV9wY2lfcmVzZXRfcmVxdWlyZWQoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYikKK3sKKwlzdHJ1Y3QgTUdNVF9IQkFfUE9TVF9TVEFUVVNfU1RSVUNUX0FNQVAgc3RhdHVzOworCWJvb2wgZG9fcmVzZXQgPSBmYWxzZTsKKwl1MzIgcG9zdF9lcnJvciwgcG9zdF9zdGFnZTsKKworCS8qCisJICogUmVhZCB0aGUgUE9TVCBzdGF0dXMgcmVnaXN0ZXIKKwkgKi8KKwlzdGF0dXMuZHdbMF0gPSBpb3JlYWQzMihwZm9iLT5jc3JfdmEgKyBNUFVfRVBfU0VNQVBIT1JFKTsKKwlwb3N0X2Vycm9yID0gQU1BUF9HRVRfQklUU19QVFIoTUdNVF9IQkFfUE9TVF9TVEFUVVNfU1RSVUNULCBlcnJvciwKKwkJCQkJCQkJJnN0YXR1cyk7CisJcG9zdF9zdGFnZSA9IEFNQVBfR0VUX0JJVFNfUFRSKE1HTVRfSEJBX1BPU1RfU1RBVFVTX1NUUlVDVCwgc3RhZ2UsCisJCQkJCQkJCSZzdGF0dXMpOworCWlmIChwb3N0X3N0YWdlIDw9IFBPU1RfU1RBR0VfQVdBSVRJTkdfSE9TVF9SRFkpIHsKKwkJLyoKKwkJICogSWYgQmxhZGVFbmdpbmUgaXMgd2FpdGluZyBmb3IgaG9zdCByZWFkeSBpbmRpY2F0aW9uLAorCQkgKiB3ZSB3YW50IHRvIGRvIGEgUENJIHJlc2V0LgorCQkgKi8KKwkJZG9fcmVzZXQgPSB0cnVlOworCX0KKworCXJldHVybiBkb19yZXNldDsKK30KKworLyoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246IGJlX2RyaXZlX1BPU1QKKyAqICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZHJpdmUgQmxhZGVFbmdpbmUgUE9TVC4gVGhlCisgKiAgIGNhbGxlciBzaG91bGQgZW5zdXJlIHRoZXkgY2Fubm90IGJlIHByZS1lbXB0ZWQgd2hpbGUgdGhpcyByb3V0aW5lIGV4ZWN1dGVzLgorICogcGZvYiAtCisgKiByZXR1cm4gc3RhdHVzICAgLSBCRV9TVUNDRVNTICgwKSBvbiBzdWNjZXNzLiBOZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworaW50IGJlX2RyaXZlX1BPU1Qoc3RydWN0IGJlX2Z1bmN0aW9uX29iamVjdCAqcGZvYikKK3sKKwlpbnQgc3RhdHVzOworCisJaWYgKGZhbHNlICE9IGJlX3BjaV9yZXNldF9yZXF1aXJlZChwZm9iKSkgeworCQkvKiBQQ0kgcmVzZXQgaXMgbmVlZGVkIChpbXBsaWNpdGx5IHN0YXJ0cyBhbmQgd2FpdHMgZm9yIFBPU1QpICovCisJCXN0YXR1cyA9IGJlX3BjaV9zb2Z0X3Jlc2V0KHBmb2IpOworCX0gZWxzZSB7CisJCS8qIE5vIFBDSSByZXNldCBpcyBuZWVkZWQsIHN0YXJ0IFBPU1QgKi8KKwkJc3RhdHVzID0gYmVfa2lja29mZl9hbmRfd2FpdF9mb3JfUE9TVChwZm9iKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JlbmV0L21wdS5oIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L21wdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZjNmODcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvbXB1LmgKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworLyoKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgc3JjZ2VuIHZlcnNpb246IDAxMjcKKyAqLworI2lmbmRlZiBfX21wdV9hbWFwX2hfXworI2RlZmluZSBfX21wdV9hbWFwX2hfXworI2luY2x1ZGUgImVwLmgiCisKKy8qIFByb3ZpZGUgY29udHJvbCBwYXJhbWV0ZXJzIGZvciB0aGUgTWFuYWdtZW50IFByb2Nlc3NvciBVbml0LiAqLworc3RydWN0IEJFX01QVV9DU1JNQVBfQU1BUCB7CisJc3RydWN0IEJFX0VQX0NTUk1BUF9BTUFQIGVwOworCXU4IHJzdmQwWzEyOF07CS8qIERXT1JEIDY0ICovCisJdTggcnN2ZDFbMzJdOwkvKiBEV09SRCA2OCAqLworCXU4IHJzdmQyWzE5Ml07CS8qIERXT1JEIDY5ICovCisJdTggcnN2ZDNbMTkyXTsJLyogRFdPUkQgNzUgKi8KKwl1OCByc3ZkNFszMl07CS8qIERXT1JEIDgxICovCisJdTggcnN2ZDVbMzJdOwkvKiBEV09SRCA4MiAqLworCXU4IHJzdmQ2WzMyXTsJLyogRFdPUkQgODMgKi8KKwl1OCByc3ZkN1szMl07CS8qIERXT1JEIDg0ICovCisJdTggcnN2ZDhbMzJdOwkvKiBEV09SRCA4NSAqLworCXU4IHJzdmQ5WzMyXTsJLyogRFdPUkQgODYgKi8KKwl1OCByc3ZkMTBbMzJdOwkvKiBEV09SRCA4NyAqLworCXU4IHJzdmQxMVszMl07CS8qIERXT1JEIDg4ICovCisJdTggcnN2ZDEyWzMyXTsJLyogRFdPUkQgODkgKi8KKwl1OCByc3ZkMTNbMzJdOwkvKiBEV09SRCA5MCAqLworCXU4IHJzdmQxNFszMl07CS8qIERXT1JEIDkxICovCisJdTggcnN2ZDE1WzMyXTsJLyogRFdPUkQgOTIgKi8KKwl1OCByc3ZkMTZbMzJdOwkvKiBEV09SRCA5MyAqLworCXU4IHJzdmQxN1szMl07CS8qIERXT1JEIDk0ICovCisJdTggcnN2ZDE4WzMyXTsJLyogRFdPUkQgOTUgKi8KKwl1OCByc3ZkMTlbMzJdOwkvKiBEV09SRCA5NiAqLworCXU4IHJzdmQyMFszMl07CS8qIERXT1JEIDk3ICovCisJdTggcnN2ZDIxWzMyXTsJLyogRFdPUkQgOTggKi8KKwl1OCByc3ZkMjJbMzJdOwkvKiBEV09SRCA5OSAqLworCXU4IHJzdmQyM1szMl07CS8qIERXT1JEIDEwMCAqLworCXU4IHJzdmQyNFszMl07CS8qIERXT1JEIDEwMSAqLworCXU4IHJzdmQyNVszMl07CS8qIERXT1JEIDEwMiAqLworCXU4IHJzdmQyNlszMl07CS8qIERXT1JEIDEwMyAqLworCXU4IHJzdmQyN1szMl07CS8qIERXT1JEIDEwNCAqLworCXU4IHJzdmQyOFs5Nl07CS8qIERXT1JEIDEwNSAqLworCXU4IHJzdmQyOVszMl07CS8qIERXT1JEIDEwOCAqLworCXU4IHJzdmQzMFszMl07CS8qIERXT1JEIDEwOSAqLworCXU4IHJzdmQzMVszMl07CS8qIERXT1JEIDExMCAqLworCXU4IHJzdmQzMlszMl07CS8qIERXT1JEIDExMSAqLworCXU4IHJzdmQzM1szMl07CS8qIERXT1JEIDExMiAqLworCXU4IHJzdmQzNFs5Nl07CS8qIERXT1JEIDExMyAqLworCXU4IHJzdmQzNVszMl07CS8qIERXT1JEIDExNiAqLworCXU4IHJzdmQzNlszMl07CS8qIERXT1JEIDExNyAqLworCXU4IHJzdmQzN1szMl07CS8qIERXT1JEIDExOCAqLworCXU4IHJzdmQzOFszMl07CS8qIERXT1JEIDExOSAqLworCXU4IHJzdmQzOVszMl07CS8qIERXT1JEIDEyMCAqLworCXU4IHJzdmQ0MFszMl07CS8qIERXT1JEIDEyMSAqLworCXU4IHJzdmQ0MVsxMzRdWzMyXTsJLyogRFdPUkQgMTIyICovCit9IF9fcGFja2VkOworc3RydWN0IE1QVV9DU1JNQVBfQU1BUCB7CisJdTMyIGR3WzI1Nl07Cit9OworCisjZW5kaWYgLyogX19tcHVfYW1hcF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9tcHVfY29udGV4dC5oIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L21wdV9jb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNlOTBmOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9tcHVfY29udGV4dC5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKy8qCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IHNyY2dlbiB2ZXJzaW9uOiAwMTI3CisgKi8KKyNpZm5kZWYgX19tcHVfY29udGV4dF9hbWFwX2hfXworI2RlZmluZSBfX21wdV9jb250ZXh0X2FtYXBfaF9fCisKKy8qCisgKiBNYW5hZ2VtZW50IGNvbW1hbmQgYW5kIGNvbnRyb2wgcmluZyBjb250ZXh0LiBUaGUgTVBVcyBCVExSX0NUUkwxIENTUgorICogY29udHJvbHMgdGhlIHdyaXRlYmFjayBiZWhhdmlvciBvZiB0aGUgcHJvZHVjZXIgYW5kIGNvbnN1bWVyIGluZGV4IHZhbHVlcy4KKyAqLworc3RydWN0IEJFX01DQ19SSU5HX0NPTlRFWFRfQU1BUCB7CisJdTggY29uX2luZGV4WzE2XTsJLyogRFdPUkQgMCAqLworCXU4IHJpbmdfc2l6ZVs0XTsJLyogRFdPUkQgMCAqLworCXU4IGNxX2lkWzExXTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwOwkJLyogRFdPUkQgMCAqLworCXU4IHByb2RfaW5kZXhbMTZdOwkvKiBEV09SRCAxICovCisJdTggcGRpZFsxNV07CS8qIERXT1JEIDEgKi8KKwl1OCBpbnZhbGlkOwkJLyogRFdPUkQgMSAqLworCXU4IGNtZF9wZW5kaW5nX2N1cnJlbnRbN107CS8qIERXT1JEIDIgKi8KKwl1OCByc3ZkMVsyNV07CS8qIERXT1JEIDIgKi8KKwl1OCBocGlfcG9ydF9jcV9pZFsxMV07CS8qIERXT1JEIDMgKi8KKwl1OCByc3ZkMls1XTsJLyogRFdPUkQgMyAqLworCXU4IGNtZF9wZW5kaW5nX21heFs3XTsJLyogRFdPUkQgMyAqLworCXU4IHJzdmQzWzldOwkvKiBEV09SRCAzICovCit9IF9fcGFja2VkOworc3RydWN0IE1DQ19SSU5HX0NPTlRFWFRfQU1BUCB7CisJdTMyIGR3WzRdOworfTsKKworI2VuZGlmIC8qIF9fbXB1X2NvbnRleHRfYW1hcF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9wY2ljZmcuaCBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9wY2ljZmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzE1Njg0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L3BjaWNmZy5oCkBAIC0wLDAgKzEsODI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOCBTZXJ2ZXJFbmdpbmVzCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIGxpbnV4LWRyaXZlcnNAc2VydmVyZW5naW5lcy5jb20KKyAqCisgKiBTZXJ2ZXJFbmdpbmVzCisgKiAyMDkgTi4gRmFpciBPYWtzIEF2ZQorICogU3Vubnl2YWxlLCBDQSA5NDA4NQorICovCisvKgorICogQXV0b2dlbmVyYXRlZCBieSBzcmNnZW4gdmVyc2lvbjogMDEyNworICovCisjaWZuZGVmIF9fcGNpY2ZnX2FtYXBfaF9fCisjZGVmaW5lIF9fcGNpY2ZnX2FtYXBfaF9fCisKKy8qIFZlbmRvciBhbmQgRGV2aWNlIElEIFJlZ2lzdGVyLiAqLworc3RydWN0IEJFX1BDSUNGR19JRF9DU1JfQU1BUCB7CisJdTggdmVuZG9yaWRbMTZdOwkvKiBEV09SRCAwICovCisJdTggZGV2aWNlaWRbMTZdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19JRF9DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogSU8gQmFyIFJlZ2lzdGVyLiAqLworc3RydWN0IEJFX1BDSUNGR19JT0JBUl9DU1JfQU1BUCB7CisJdTggaW9zcGFjZTsJCS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFs3XTsJLyogRFdPUkQgMCAqLworCXU4IGlvYmFyWzI0XTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfSU9CQVJfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIE1lbW9yeSBCQVIgMCBSZWdpc3Rlci4gKi8KK3N0cnVjdCBCRV9QQ0lDRkdfTUVNQkFSMF9DU1JfQU1BUCB7CisJdTggbWVtc3BhY2U7CS8qIERXT1JEIDAgKi8KKwl1OCB0eXBlWzJdOwkJLyogRFdPUkQgMCAqLworCXU4IHBmOwkJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwWzEwXTsJLyogRFdPUkQgMCAqLworCXU4IG1lbWJhcjBbMThdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19NRU1CQVIwX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBNZW1vcnkgQkFSIDEgLSBMb3cgQWRkcmVzcyBSZWdpc3Rlci4gKi8KK3N0cnVjdCBCRV9QQ0lDRkdfTUVNQkFSMV9MT19DU1JfQU1BUCB7CisJdTggbWVtc3BhY2U7CS8qIERXT1JEIDAgKi8KKwl1OCB0eXBlWzJdOwkJLyogRFdPUkQgMCAqLworCXU4IHBmOwkJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwWzEzXTsJLyogRFdPUkQgMCAqLworCXU4IG1lbWJhcjFsb1sxNV07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX01FTUJBUjFfTE9fQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIE1lbW9yeSBCQVIgMSAtIEhpZ2ggQWRkcmVzcyBSZWdpc3Rlci4gKi8KK3N0cnVjdCBCRV9QQ0lDRkdfTUVNQkFSMV9ISV9DU1JfQU1BUCB7CisJdTggbWVtYmFyMWhpWzMyXTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfTUVNQkFSMV9ISV9DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogTWVtb3J5IEJBUiAyIC0gTG93IEFkZHJlc3MgUmVnaXN0ZXIuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX01FTUJBUjJfTE9fQ1NSX0FNQVAgeworCXU4IG1lbXNwYWNlOwkvKiBEV09SRCAwICovCisJdTggdHlwZVsyXTsJCS8qIERXT1JEIDAgKi8KKwl1OCBwZjsJCS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFsxN107CS8qIERXT1JEIDAgKi8KKwl1OCBtZW1iYXIybG9bMTFdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19NRU1CQVIyX0xPX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBNZW1vcnkgQkFSIDIgLSBIaWdoIEFkZHJlc3MgUmVnaXN0ZXIuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX01FTUJBUjJfSElfQ1NSX0FNQVAgeworCXU4IG1lbWJhcjJoaVszMl07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX01FTUJBUjJfSElfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIFN1YnN5c3RlbSBWZW5kb3IgYW5kIElEIChGdW5jdGlvbiAwKSBSZWdpc3Rlci4gKi8KK3N0cnVjdCBCRV9QQ0lDRkdfU1VCU1lTVEVNX0lEX0YwX0NTUl9BTUFQIHsKKwl1OCBzdWJzeXNfdmVuZG9yX2lkWzE2XTsJLyogRFdPUkQgMCAqLworCXU4IHN1YnN5c19pZFsxNl07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX1NVQlNZU1RFTV9JRF9GMF9DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogU3Vic3lzdGVtIFZlbmRvciBhbmQgSUQgKEZ1bmN0aW9uIDEpIFJlZ2lzdGVyLiAqLworc3RydWN0IEJFX1BDSUNGR19TVUJTWVNURU1fSURfRjFfQ1NSX0FNQVAgeworCXU4IHN1YnN5c192ZW5kb3JfaWRbMTZdOwkvKiBEV09SRCAwICovCisJdTggc3Vic3lzX2lkWzE2XTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfU1VCU1lTVEVNX0lEX0YxX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBTZW1hcGhvcmUgUmVnaXN0ZXIuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX1NFTUFQSE9SRV9DU1JfQU1BUCB7CisJdTggbG9ja2VkOwkJLyogRFdPUkQgMCAqLworCXU4IHJzdmQwWzMxXTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfU0VNQVBIT1JFX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBTb2Z0IFJlc2V0IFJlZ2lzdGVyLiAqLworc3RydWN0IEJFX1BDSUNGR19TT0ZUX1JFU0VUX0NTUl9BTUFQIHsKKwl1OCByc3ZkMFs3XTsJLyogRFdPUkQgMCAqLworCXU4IHNvZnRyZXNldDsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQxWzE2XTsJLyogRFdPUkQgMCAqLworCXU4IG5lY19sbF9yY3ZkZXRlY3RfaVs4XTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfU09GVF9SRVNFVF9DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogVW5yZWNvdmVyYWJsZSBFcnJvciBTdGF0dXMgKExvdykgUmVnaXN0ZXIuIEVhY2ggYml0IGNvcnJlc3BvbmRzIHRvCisgKiBhbiBpbnRlcm5hbCBVbnJlY292ZXJhYmxlIEVycm9yLiAgVGhlc2UgYXJlIHNldCBieSBoYXJkd2FyZSBhbmQgbWF5IGJlCisgKiBjbGVhcmVkIGJ5IHdyaXRpbmcgYSBvbmUgdG8gdGhlIHJlc3BlY3RpdmUgYml0KHMpIHRvIGJlIGNsZWFyZWQuICBBbnkKKyAqIGJpdCBiZWluZyBzZXQgdGhhdCBpcyBhbHNvIHVubWFza2VkIHdpbGwgcmVzdWx0IGluIFVucmVjb3ZlcmFibGUgRXJyb3IKKyAqIGludGVycnVwdCBub3RpZmljYXRpb24gdG8gdGhlIGhvc3QgQ1BVIGFuZC9vciBTZXJ2ZXIgTWFuYWdlbWVudCBjaGlwCisgKiBhbmQgdGhlIHRyYW5zaXRpb25pbmcgb2YgQmxhZGVFbmdpbmUgdG8gYW4gT2ZmbGluZSBzdGF0ZS4KKyAqLworc3RydWN0IEJFX1BDSUNGR19VRV9TVEFUVVNfTE9XX0NTUl9BTUFQIHsKKwl1OCBjZXZfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggY3R4X3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IGRidWZfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggZXJ4X3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IGhvc3RfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggbXB1X3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IG5kbWFfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggcHRjX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHJkbWFfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggcnhmX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHJ4aXBzX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHJ4dWxwMF91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCByeHVscDFfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggcnh1bHAyX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHRpbV91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCB0cG9zdF91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCB0cHJlX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHR4aXBzX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHR4dWxwMF91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCB0eHVscDFfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggdWNfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggd2RtYV91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCB0eHVscDJfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggaG9zdDFfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggcDBfb2JfbGlua191ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBwMV9vYl9saW5rX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IGhvc3RfZ3Bpb191ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBtYm94X25ldHdfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggbWJveF9zdG9yX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IGF4Z21hYzBfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggYXhnbWFjMV91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBtcHVfaW50cGVuZF91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX1VFX1NUQVRVU19MT1dfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIFVucmVjb3ZlcmFibGUgRXJyb3IgU3RhdHVzIChIaWdoKSBSZWdpc3Rlci4gRWFjaCBiaXQgY29ycmVzcG9uZHMgdG8KKyAqIGFuIGludGVybmFsIFVucmVjb3ZlcmFibGUgRXJyb3IuICBUaGVzZSBhcmUgc2V0IGJ5IGhhcmR3YXJlIGFuZCBtYXkgYmUKKyAqIGNsZWFyZWQgYnkgd3JpdGluZyBhIG9uZSB0byB0aGUgcmVzcGVjdGl2ZSBiaXQocykgdG8gYmUgY2xlYXJlZC4gIEFueQorICogYml0IGJlaW5nIHNldCB0aGF0IGlzIGFsc28gdW5tYXNrZWQgd2lsbCByZXN1bHQgaW4gVW5yZWNvdmVyYWJsZSBFcnJvcgorICogaW50ZXJydXB0IG5vdGlmaWNhdGlvbiB0byB0aGUgaG9zdCBDUFUgYW5kL29yIFNlcnZlciBNYW5hZ2VtZW50IGNoaXA7CisgKiBhbmQgdGhlIHRyYW5zaXRpb25pbmcgb2YgQmxhZGVFbmdpbmUgdG8gYW4gT2ZmbGluZSBzdGF0ZS4KKyAqLworc3RydWN0IEJFX1BDSUNGR19VRV9TVEFUVVNfSElfQ1NSX0FNQVAgeworCXU4IGp0YWdfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggbHBjbWVtaG9zdF91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBtZ210X21hY191ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBtcHVfaXJhbV91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBwY3Mwb25saW5lX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHBjczFvbmxpbmVfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggcGN0bDBfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggcGN0bDFfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggcG1lbV91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCBycl91ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCByeHBwX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHR4cGJfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggdHhwX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IHhhdWlfdWVfc3RhdHVzOwkvKiBEV09SRCAwICovCisJdTggYXJtX3VlX3N0YXR1czsJLyogRFdPUkQgMCAqLworCXU4IGlwY191ZV9zdGF0dXM7CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFsxNl07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX1VFX1NUQVRVU19ISV9DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogVW5yZWNvdmVyYWJsZSBFcnJvciBNYXNrIChMb3cpIFJlZ2lzdGVyLiBFYWNoIGJpdCwgd2hlbiBzZXQgdG8gb25lLAorICogd2lsbCBtYXNrIHRoZSBhc3NvY2lhdGVkIFVucmVjb3ZlcmFibGUgIEVycm9yIHN0YXR1cyBiaXQgZnJvbSBub3RpZmljYXRpb24KKyAqIG9mIFVucmVjb3ZlcmFibGUgRXJyb3IgdG8gdGhlIGhvc3QgQ1BVIGFuZC9vciBTZXJ2ZXIgTWFuYWdtZW50IGNoaXAgYW5kIHRoZQorICogdHJhbnNpdGlvbmluZyBvZiBhbGwgQmxhZGVFbmdpbmUgdW5pdHMgdG8gYW4gT2ZmbGluZSBzdGF0ZS4KKyAqLworc3RydWN0IEJFX1BDSUNGR19VRV9TVEFUVVNfTE9XX01BU0tfQ1NSX0FNQVAgeworCXU4IGNldl91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggY3R4X3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCBkYnVmX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCBlcnhfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IGhvc3RfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IG1wdV91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggbmRtYV91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggcHRjX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCByZG1hX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCByeGZfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHJ4aXBzX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCByeHVscDBfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHJ4dWxwMV91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggcnh1bHAyX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCB0aW1fdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHRwb3N0X3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCB0cHJlX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCB0eGlwc191ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggdHh1bHAwX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCB0eHVscDFfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHVjX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCB3ZG1hX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCB0eHVscDJfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IGhvc3QxX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCBwMF9vYl9saW5rX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCBwMV9vYl9saW5rX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCBob3N0X2dwaW9fdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IG1ib3hfbmV0d191ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggbWJveF9zdG9yX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCBheGdtYWMwX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCBheGdtYWMxX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCBtcHVfaW50cGVuZF91ZV9tYXNrOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19VRV9TVEFUVVNfTE9XX01BU0tfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIFVucmVjb3ZlcmFibGUgRXJyb3IgTWFzayAoSGlnaCkgUmVnaXN0ZXIuIEVhY2ggYml0LCB3aGVuIHNldCB0byBvbmUsCisgKiB3aWxsIG1hc2sgdGhlIGFzc29jaWF0ZWQgVW5yZWNvdmVyYWJsZSBFcnJvciBzdGF0dXMgYml0IGZyb20gbm90aWZpY2F0aW9uCisgKiBvZiBVbnJlY292ZXJhYmxlIEVycm9yIHRvIHRoZSBob3N0IENQVSBhbmQvb3IgU2VydmVyIE1hbmFnbWVudCBjaGlwIGFuZCB0aGUKKyAqIHRyYW5zaXRpb25pbmcgb2YgYWxsIEJsYWRlRW5naW5lIHVuaXRzIHRvIGFuIE9mZmxpbmUgc3RhdGUuCisgKi8KK3N0cnVjdCBCRV9QQ0lDRkdfVUVfU1RBVFVTX0hJX01BU0tfQ1NSX0FNQVAgeworCXU4IGp0YWdfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IGxwY21lbWhvc3RfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IG1nbXRfbWFjX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCBtcHVfaXJhbV91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggcGNzMG9ubGluZV91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggcGNzMW9ubGluZV91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggcGN0bDBfdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IHBjdGwxX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCBwbWVtX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCBycl91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggcnhwcF91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggdHhwYl91ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggdHhwX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCB4YXVpX3VlX21hc2s7CS8qIERXT1JEIDAgKi8KKwl1OCBhcm1fdWVfbWFzazsJLyogRFdPUkQgMCAqLworCXU4IGlwY191ZV9tYXNrOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDBbMTZdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19VRV9TVEFUVVNfSElfTUFTS19DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogT25saW5lIENvbnRyb2wgUmVnaXN0ZXIgMC4gVGhpcyByZWdpc3RlciBjb250cm9scyB2YXJpb3VzIHVuaXRzIHdpdGhpbgorICogQmxhZGVFbmdpbmUgYmVpbmcgaW4gYW4gT25saW5lIG9yIE9mZmxpbmUgc3RhdGUuCisgKi8KK3N0cnVjdCBCRV9QQ0lDRkdfT05MSU5FMF9DU1JfQU1BUCB7CisJdTggY2V2X29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IGN0eF9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCBkYnVmX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IGVyeF9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCBob3N0X29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IG1wdV9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCBuZG1hX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IHB0Y19vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCByZG1hX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IHJ4Zl9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCByeGlwc19vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCByeHVscDBfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggcnh1bHAxX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IHJ4dWxwMl9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCB0aW1fb25saW5lOwkvKiBEV09SRCAwICovCisJdTggdHBvc3Rfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggdHByZV9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCB0eGlwc19vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCB0eHVscDBfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggdHh1bHAxX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IHVjX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IHdkbWFfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggdHh1bHAyX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IGhvc3QxX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IHAwX29iX2xpbmtfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggcDFfb2JfbGlua19vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCBob3N0X2dwaW9fb25saW5lOwkvKiBEV09SRCAwICovCisJdTggbWJveF9uZXR3X29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IG1ib3hfc3Rvcl9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCBheGdtYWMwX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IGF4Z21hYzFfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggbXB1X2ludHBlbmRfb25saW5lOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19PTkxJTkUwX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBPbmxpbmUgQ29udHJvbCBSZWdpc3RlciAxLiBUaGlzIHJlZ2lzdGVyIGNvbnRyb2xzIHZhcmlvdXMgdW5pdHMgd2l0aGluCisgKiBCbGFkZUVuZ2luZSBiZWluZyBpbiBhbiBPbmxpbmUgb3IgT2ZmbGluZSBzdGF0ZS4KKyAqLworc3RydWN0IEJFX1BDSUNGR19PTkxJTkUxX0NTUl9BTUFQIHsKKwl1OCBqdGFnX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IGxwY21lbWhvc3Rfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggbWdtdF9tYWNfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggbXB1X2lyYW1fb25saW5lOwkvKiBEV09SRCAwICovCisJdTggcGNzMG9ubGluZV9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCBwY3Mxb25saW5lX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IHBjdGwwX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IHBjdGwxX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IHBtZW1fb25saW5lOwkvKiBEV09SRCAwICovCisJdTggcnJfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggcnhwcF9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCB0eHBiX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IHR4cF9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCB4YXVpX29ubGluZTsJLyogRFdPUkQgMCAqLworCXU4IGFybV9vbmxpbmU7CS8qIERXT1JEIDAgKi8KKwl1OCBpcGNfb25saW5lOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDBbMTZdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19PTkxJTkUxX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBIb3N0IFRpbWVyIFJlZ2lzdGVyLiAqLworc3RydWN0IEJFX1BDSUNGR19IT1NUX1RJTUVSX0lOVF9DVFJMX0NTUl9BTUFQIHsKKwl1OCBob3N0dGltZXJbMjRdOwkvKiBEV09SRCAwICovCisJdTggaG9zdGludHI7CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFs3XTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfSE9TVF9USU1FUl9JTlRfQ1RSTF9DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogU2NyYXRjaHBhZCBSZWdpc3RlciAoZm9yIHNvZnR3YXJlIHVzZSkuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX1NDUkFUQ0hQQURfQ1NSX0FNQVAgeworCXU4IHNjcmF0Y2hwYWRbMzJdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19TQ1JBVENIUEFEX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBQQ0kgRXhwcmVzcyBDYXBhYmlsaXRpZXMgUmVnaXN0ZXIuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX1BDSUVfQ0FQX0NTUl9BTUFQIHsKKwl1OCBjYXBpZFs4XTsJLyogRFdPUkQgMCAqLworCXU4IG5leHRjYXBbOF07CS8qIERXT1JEIDAgKi8KKwl1OCBjYXB2ZXJbNF07CS8qIERXT1JEIDAgKi8KKwl1OCBkZXZwb3J0WzRdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDBbNl07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMVsyXTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfUENJRV9DQVBfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIFBDSSBFeHByZXNzIERldmljZSBDYXBhYmlsaXRpZXMgUmVnaXN0ZXIuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX1BDSUVfREVWQ0FQX0NTUl9BTUFQIHsKKwl1OCBwYXlsb2FkWzNdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDBbM107CS8qIERXT1JEIDAgKi8KKwl1OCBsb19sYXRbM107CS8qIERXT1JEIDAgKi8KKwl1OCBsMV9sYXRbM107CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMVszXTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQyWzNdOwkvKiBEV09SRCAwICovCisJdTggcHdyX3ZhbHVlWzhdOwkvKiBEV09SRCAwICovCisJdTggcHdyX3NjYWxlWzJdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDNbNF07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX1BDSUVfREVWQ0FQX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBQQ0kgRXhwcmVzcyBEZXZpY2UgQ29udHJvbC9TdGF0dXMgUmVnaXN0ZXJzLiAqLworc3RydWN0IEJFX1BDSUNGR19QQ0lFX0NPTlRST0xfU1RBVFVTX0NTUl9BTUFQIHsKKwl1OCBDb3JyRXJyUmVwb3J0RW47CS8qIERXT1JEIDAgKi8KKwl1OCBOb25GYXRhbEVyclJlcG9ydEVuOwkvKiBEV09SRCAwICovCisJdTggRmF0YWxFcnJSZXBvcnRFbjsJLyogRFdPUkQgMCAqLworCXU4IFVuc3VwcFJlcVJlcG9ydEVuOwkvKiBEV09SRCAwICovCisJdTggRW5hYmxlUmVsYXhPcmRlcjsJLyogRFdPUkQgMCAqLworCXU4IE1heF9QYXlsb2FkX1NpemVbM107CS8qIERXT1JEIDAgKi8KKwl1OCBFeHRlbmRUYWdGaWVsZEVuYWJsZTsJLyogRFdPUkQgMCAqLworCXU4IFBoYW50b21GbkVuYWJsZTsJLyogRFdPUkQgMCAqLworCXU4IEF1eFB3clBNRW5hYmxlOwkvKiBEV09SRCAwICovCisJdTggRW5hYmxlTm9Tbm9vcDsJLyogRFdPUkQgMCAqLworCXU4IE1heF9SZWFkX1JlcV9TaXplWzNdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDA7CQkvKiBEV09SRCAwICovCisJdTggQ29yckVyckRldGVjdDsJLyogRFdPUkQgMCAqLworCXU4IE5vbkZhdGFsRXJyRGV0ZWN0OwkvKiBEV09SRCAwICovCisJdTggRmF0YWxFcnJEZXRlY3Q7CS8qIERXT1JEIDAgKi8KKwl1OCBVbnN1cHBSZXFEZXRlY3Q7CS8qIERXT1JEIDAgKi8KKwl1OCBBdXhQd3JEZXRlY3Q7CS8qIERXT1JEIDAgKi8KKwl1OCBUcmFuc1BlbmRpbmc7CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMVsxMF07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX1BDSUVfQ09OVFJPTF9TVEFUVVNfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIFBDSSBFeHByZXNzIExpbmsgQ2FwYWJpbGl0aWVzIFJlZ2lzdGVyLiAqLworc3RydWN0IEJFX1BDSUNGR19QQ0lFX0xJTktfQ0FQX0NTUl9BTUFQIHsKKwl1OCBNYXhMaW5rU3BlZWRbNF07CS8qIERXT1JEIDAgKi8KKwl1OCBNYXhMaW5rV2lkdGhbNl07CS8qIERXT1JEIDAgKi8KKwl1OCBBU1BNU3VwcG9ydFsyXTsJLyogRFdPUkQgMCAqLworCXU4IEwwc0V4aXRMYXRbM107CS8qIERXT1JEIDAgKi8KKwl1OCBMMUV4aXRMYXRbM107CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFs2XTsJLyogRFdPUkQgMCAqLworCXU4IFBvcnROdW1bOF07CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX1BDSUVfTElOS19DQVBfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIFBDSSBFeHByZXNzIExpbmsgU3RhdHVzIFJlZ2lzdGVyLiAqLworc3RydWN0IEJFX1BDSUNGR19QQ0lFX0xJTktfU1RBVFVTX0NTUl9BTUFQIHsKKwl1OCBBU1BNQ3RsWzJdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDA7CQkvKiBEV09SRCAwICovCisJdTggUmVhZENtcGxCbmRyeTsJLyogRFdPUkQgMCAqLworCXU4IExpbmtEaXNhYmxlOwkvKiBEV09SRCAwICovCisJdTggUmV0cmFpbkxpbms7CS8qIERXT1JEIDAgKi8KKwl1OCBDb21tb25DbGtDb25maWc7CS8qIERXT1JEIDAgKi8KKwl1OCBFeHRlbmRTeW5jOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDFbOF07CS8qIERXT1JEIDAgKi8KKwl1OCBMaW5rU3BlZWRbNF07CS8qIERXT1JEIDAgKi8KKwl1OCBOZWdMaW5rV2lkdGhbNl07CS8qIERXT1JEIDAgKi8KKwl1OCBMaW5rVHJhaW5FcnI7CS8qIERXT1JEIDAgKi8KKwl1OCBMaW5rVHJhaW47CS8qIERXT1JEIDAgKi8KKwl1OCBTbG90Q2xrQ29uZmlnOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDJbM107CS8qIERXT1JEIDAgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX1BDSUVfTElOS19TVEFUVVNfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIFBDSSBFeHByZXNzIE1TSSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyLiAqLworc3RydWN0IEJFX1BDSUNGR19NU0lfQ1NSX0FNQVAgeworCXU4IGNhcGlkWzhdOwkvKiBEV09SRCAwICovCisJdTggbmV4dHB0cls4XTsJLyogRFdPUkQgMCAqLworCXU4IHRhYmxlc2l6ZVsxMV07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMFszXTsJLyogRFdPUkQgMCAqLworCXU4IGZ1bmNtYXNrOwkvKiBEV09SRCAwICovCisJdTggZW47CQkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19NU0lfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIE1TSS1YIFRhYmxlIE9mZnNldCBSZWdpc3Rlci4gKi8KK3N0cnVjdCBCRV9QQ0lDRkdfTVNJWF9UQUJMRV9DU1JfQU1BUCB7CisJdTggdGFibGViaXJbM107CS8qIERXT1JEIDAgKi8KKwl1OCBvZmZzZXRbMjldOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19NU0lYX1RBQkxFX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBNU0ktWCBQQkEgT2Zmc2V0IFJlZ2lzdGVyLiAqLworc3RydWN0IEJFX1BDSUNGR19NU0lYX1BCQV9DU1JfQU1BUCB7CisJdTggcGJhYmlyWzNdOwkvKiBEV09SRCAwICovCisJdTggb2Zmc2V0WzI5XTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfTVNJWF9QQkFfQ1NSX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKKy8qIFBDSSBFeHByZXNzIE1TSS1YIE1lc3NhZ2UgVmVjdG9yIENvbnRyb2wgUmVnaXN0ZXIuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX01TSVhfVkVDVE9SX0NPTlRST0xfQ1NSX0FNQVAgeworCXU4IHZlY3Rvcl9jb250cm9sOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDBbMzFdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19NU0lYX1ZFQ1RPUl9DT05UUk9MX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBQQ0kgRXhwcmVzcyBNU0ktWCBNZXNzYWdlIERhdGEgUmVnaXN0ZXIuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX01TSVhfTVNHX0RBVEFfQ1NSX0FNQVAgeworCXU4IGRhdGFbMTZdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDBbMTZdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19NU0lYX01TR19EQVRBX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBQQ0kgRXhwcmVzcyBNU0ktWCBNZXNzYWdlIEFkZHJlc3MgUmVnaXN0ZXIgLSBIaWdoIFBhcnQuICovCitzdHJ1Y3QgQkVfUENJQ0ZHX01TSVhfTVNHX0FERFJfSElfQ1NSX0FNQVAgeworCXU4IGFkZHJbMzJdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19NU0lYX01TR19BRERSX0hJX0NTUl9BTUFQIHsKKwl1MzIgZHdbMV07Cit9OworCisvKiBQQ0kgRXhwcmVzcyBNU0ktWCBNZXNzYWdlIEFkZHJlc3MgUmVnaXN0ZXIgLSBMb3cgUGFydC4gKi8KK3N0cnVjdCBCRV9QQ0lDRkdfTVNJWF9NU0dfQUREUl9MT19DU1JfQU1BUCB7CisJdTggcnN2ZDBbMl07CS8qIERXT1JEIDAgKi8KKwl1OCBhZGRyWzMwXTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfTVNJWF9NU0dfQUREUl9MT19DU1JfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworc3RydWN0IEJFX1BDSUNGR19BTk9OXzE4X1JTVkRfQU1BUCB7CisJdTggcnN2ZDBbMzJdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19BTk9OXzE4X1JTVkRfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworc3RydWN0IEJFX1BDSUNGR19BTk9OXzE5X1JTVkRfQU1BUCB7CisJdTggcnN2ZDBbMzJdOwkvKiBEV09SRCAwICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19BTk9OXzE5X1JTVkRfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworc3RydWN0IEJFX1BDSUNGR19BTk9OXzIwX1JTVkRfQU1BUCB7CisJdTggcnN2ZDBbMzJdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDFbMjVdWzMyXTsJLyogRFdPUkQgMSAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfQU5PTl8yMF9SU1ZEX0FNQVAgeworCXUzMiBkd1syNl07Cit9OworCitzdHJ1Y3QgQkVfUENJQ0ZHX0FOT05fMjFfUlNWRF9BTUFQIHsKKwl1OCByc3ZkMFszMl07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMVsxOTE5XVszMl07CS8qIERXT1JEIDEgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX0FOT05fMjFfUlNWRF9BTUFQIHsKKwl1MzIgZHdbMTkyMF07Cit9OworCitzdHJ1Y3QgQkVfUENJQ0ZHX0FOT05fMjJfTUVTU0FHRV9BTUFQIHsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX01TSVhfVkVDVE9SX0NPTlRST0xfQ1NSX0FNQVAgdmVjX2N0cmw7CisJc3RydWN0IEJFX1BDSUNGR19NU0lYX01TR19EQVRBX0NTUl9BTUFQIG1zZ19kYXRhOworCXN0cnVjdCBCRV9QQ0lDRkdfTVNJWF9NU0dfQUREUl9ISV9DU1JfQU1BUCBhZGRyX2hpOworCXN0cnVjdCBCRV9QQ0lDRkdfTVNJWF9NU0dfQUREUl9MT19DU1JfQU1BUCBhZGRyX2xvdzsKK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX0FOT05fMjJfTUVTU0FHRV9BTUFQIHsKKwl1MzIgZHdbNF07Cit9OworCitzdHJ1Y3QgQkVfUENJQ0ZHX0FOT05fMjNfUlNWRF9BTUFQIHsKKwl1OCByc3ZkMFszMl07CS8qIERXT1JEIDAgKi8KKwl1OCByc3ZkMVs4OTVdWzMyXTsJLyogRFdPUkQgMSAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfQU5PTl8yM19SU1ZEX0FNQVAgeworCXUzMiBkd1s4OTZdOworfTsKKworLyogVGhlc2UgUENJIENvbmZpZ3VyYXRpb24gU3BhY2UgcmVnaXN0ZXJzIGFyZSBmb3IgdGhlIFN0b3JhZ2UgIEZ1bmN0aW9uIG9mCisgKiBCbGFkZUVuZ2luZSAoRnVuY3Rpb24gMCkuIEluIHRoZSBtZW1vcnkgbWFwIG9mIHRoZSByZWdpc3RlcnMgYmVsb3cgdGhlaXIKKyAqIHRhYmxlLAorICovCitzdHJ1Y3QgQkVfUENJQ0ZHMF9DU1JNQVBfQU1BUCB7CisJc3RydWN0IEJFX1BDSUNGR19JRF9DU1JfQU1BUCBpZDsKKwl1OCByc3ZkMFszMl07CS8qIERXT1JEIDEgKi8KKwl1OCByc3ZkMVszMl07CS8qIERXT1JEIDIgKi8KKwl1OCByc3ZkMlszMl07CS8qIERXT1JEIDMgKi8KKwlzdHJ1Y3QgQkVfUENJQ0ZHX0lPQkFSX0NTUl9BTUFQIGlvYmFyOworCXN0cnVjdCBCRV9QQ0lDRkdfTUVNQkFSMF9DU1JfQU1BUCBtZW1iYXIwOworCXN0cnVjdCBCRV9QQ0lDRkdfTUVNQkFSMV9MT19DU1JfQU1BUCBtZW1iYXIxX2xvOworCXN0cnVjdCBCRV9QQ0lDRkdfTUVNQkFSMV9ISV9DU1JfQU1BUCBtZW1iYXIxX2hpOworCXN0cnVjdCBCRV9QQ0lDRkdfTUVNQkFSMl9MT19DU1JfQU1BUCBtZW1iYXIyX2xvOworCXN0cnVjdCBCRV9QQ0lDRkdfTUVNQkFSMl9ISV9DU1JfQU1BUCBtZW1iYXIyX2hpOworCXU4IHJzdmQzWzMyXTsJLyogRFdPUkQgMTAgKi8KKwlzdHJ1Y3QgQkVfUENJQ0ZHX1NVQlNZU1RFTV9JRF9GMF9DU1JfQU1BUCBzdWJzeXN0ZW1faWQ7CisJdTggcnN2ZDRbMzJdOwkvKiBEV09SRCAxMiAqLworCXU4IHJzdmQ1WzMyXTsJLyogRFdPUkQgMTMgKi8KKwl1OCByc3ZkNlszMl07CS8qIERXT1JEIDE0ICovCisJdTggcnN2ZDdbMzJdOwkvKiBEV09SRCAxNSAqLworCXN0cnVjdCBCRV9QQ0lDRkdfU0VNQVBIT1JFX0NTUl9BTUFQIHNlbWFwaG9yZVs0XTsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX1NPRlRfUkVTRVRfQ1NSX0FNQVAgc29mdF9yZXNldDsKKwl1OCByc3ZkOFszMl07CS8qIERXT1JEIDIxICovCisJc3RydWN0IEJFX1BDSUNGR19TQ1JBVENIUEFEX0NTUl9BTUFQIHNjcmF0Y2hwYWQ7CisJdTggcnN2ZDlbMzJdOwkvKiBEV09SRCAyMyAqLworCXU4IHJzdmQxMFszMl07CS8qIERXT1JEIDI0ICovCisJdTggcnN2ZDExWzMyXTsJLyogRFdPUkQgMjUgKi8KKwl1OCByc3ZkMTJbMzJdOwkvKiBEV09SRCAyNiAqLworCXU4IHJzdmQxM1szMl07CS8qIERXT1JEIDI3ICovCisJdTggcnN2ZDE0WzJdWzMyXTsJLyogRFdPUkQgMjggKi8KKwl1OCByc3ZkMTVbMzJdOwkvKiBEV09SRCAzMCAqLworCXU4IHJzdmQxNlszMl07CS8qIERXT1JEIDMxICovCisJdTggcnN2ZDE3WzhdWzMyXTsJLyogRFdPUkQgMzIgKi8KKwlzdHJ1Y3QgQkVfUENJQ0ZHX1VFX1NUQVRVU19MT1dfQ1NSX0FNQVAgdWVfc3RhdHVzX2xvdzsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX1VFX1NUQVRVU19ISV9DU1JfQU1BUCB1ZV9zdGF0dXNfaGk7CisJc3RydWN0IEJFX1BDSUNGR19VRV9TVEFUVVNfTE9XX01BU0tfQ1NSX0FNQVAgdWVfc3RhdHVzX2xvd19tYXNrOworCXN0cnVjdCBCRV9QQ0lDRkdfVUVfU1RBVFVTX0hJX01BU0tfQ1NSX0FNQVAgdWVfc3RhdHVzX2hpX21hc2s7CisJc3RydWN0IEJFX1BDSUNGR19PTkxJTkUwX0NTUl9BTUFQIG9ubGluZTA7CisJc3RydWN0IEJFX1BDSUNGR19PTkxJTkUxX0NTUl9BTUFQIG9ubGluZTE7CisJdTggcnN2ZDE4WzMyXTsJLyogRFdPUkQgNDYgKi8KKwl1OCByc3ZkMTlbMzJdOwkvKiBEV09SRCA0NyAqLworCXU4IHJzdmQyMFszMl07CS8qIERXT1JEIDQ4ICovCisJdTggcnN2ZDIxWzMyXTsJLyogRFdPUkQgNDkgKi8KKwlzdHJ1Y3QgQkVfUENJQ0ZHX0hPU1RfVElNRVJfSU5UX0NUUkxfQ1NSX0FNQVAgaG9zdF90aW1lcl9pbnRfY3RybDsKKwl1OCByc3ZkMjJbMzJdOwkvKiBEV09SRCA1MSAqLworCXN0cnVjdCBCRV9QQ0lDRkdfUENJRV9DQVBfQ1NSX0FNQVAgcGNpZV9jYXA7CisJc3RydWN0IEJFX1BDSUNGR19QQ0lFX0RFVkNBUF9DU1JfQU1BUCBwY2llX2RldmNhcDsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX1BDSUVfQ09OVFJPTF9TVEFUVVNfQ1NSX0FNQVAgcGNpZV9jb250cm9sX3N0YXR1czsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX1BDSUVfTElOS19DQVBfQ1NSX0FNQVAgcGNpZV9saW5rX2NhcDsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX1BDSUVfTElOS19TVEFUVVNfQ1NSX0FNQVAgcGNpZV9saW5rX3N0YXR1czsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX01TSV9DU1JfQU1BUCBtc2k7CisJc3RydWN0IEJFX1BDSUNGR19NU0lYX1RBQkxFX0NTUl9BTUFQIG1zaXhfdGFibGVfb2Zmc2V0OworCXN0cnVjdCBCRV9QQ0lDRkdfTVNJWF9QQkFfQ1NSX0FNQVAgbXNpeF9wYmFfb2Zmc2V0OworCXU4IHJzdmQyM1szMl07CS8qIERXT1JEIDYwICovCisJdTggcnN2ZDI0WzMyXTsJLyogRFdPUkQgNjEgKi8KKwl1OCByc3ZkMjVbMzJdOwkvKiBEV09SRCA2MiAqLworCXU4IHJzdmQyNlszMl07CS8qIERXT1JEIDYzICovCisJdTggcnN2ZDI3WzMyXTsJLyogRFdPUkQgNjQgKi8KKwl1OCByc3ZkMjhbMzJdOwkvKiBEV09SRCA2NSAqLworCXU4IHJzdmQyOVszMl07CS8qIERXT1JEIDY2ICovCisJdTggcnN2ZDMwWzMyXTsJLyogRFdPUkQgNjcgKi8KKwl1OCByc3ZkMzFbMzJdOwkvKiBEV09SRCA2OCAqLworCXU4IHJzdmQzMlszMl07CS8qIERXT1JEIDY5ICovCisJdTggcnN2ZDMzWzMyXTsJLyogRFdPUkQgNzAgKi8KKwl1OCByc3ZkMzRbMzJdOwkvKiBEV09SRCA3MSAqLworCXU4IHJzdmQzNVszMl07CS8qIERXT1JEIDcyICovCisJdTggcnN2ZDM2WzMyXTsJLyogRFdPUkQgNzMgKi8KKwl1OCByc3ZkMzdbMzJdOwkvKiBEV09SRCA3NCAqLworCXU4IHJzdmQzOFszMl07CS8qIERXT1JEIDc1ICovCisJdTggcnN2ZDM5WzMyXTsJLyogRFdPUkQgNzYgKi8KKwl1OCByc3ZkNDBbMzJdOwkvKiBEV09SRCA3NyAqLworCXU4IHJzdmQ0MVszMl07CS8qIERXT1JEIDc4ICovCisJdTggcnN2ZDQyWzMyXTsJLyogRFdPUkQgNzkgKi8KKwl1OCByc3ZkNDNbMzJdOwkvKiBEV09SRCA4MCAqLworCXU4IHJzdmQ0NFszMl07CS8qIERXT1JEIDgxICovCisJdTggcnN2ZDQ1WzMyXTsJLyogRFdPUkQgODIgKi8KKwl1OCByc3ZkNDZbMzJdOwkvKiBEV09SRCA4MyAqLworCXU4IHJzdmQ0N1szMl07CS8qIERXT1JEIDg0ICovCisJdTggcnN2ZDQ4WzMyXTsJLyogRFdPUkQgODUgKi8KKwl1OCByc3ZkNDlbMzJdOwkvKiBEV09SRCA4NiAqLworCXU4IHJzdmQ1MFszMl07CS8qIERXT1JEIDg3ICovCisJdTggcnN2ZDUxWzMyXTsJLyogRFdPUkQgODggKi8KKwl1OCByc3ZkNTJbMzJdOwkvKiBEV09SRCA4OSAqLworCXU4IHJzdmQ1M1szMl07CS8qIERXT1JEIDkwICovCisJdTggcnN2ZDU0WzMyXTsJLyogRFdPUkQgOTEgKi8KKwl1OCByc3ZkNTVbMzJdOwkvKiBEV09SRCA5MiAqLworCXU4IHJzdmQ1Nls4MzJdOwkvKiBEV09SRCA5MyAqLworCXU4IHJzdmQ1N1szMl07CS8qIERXT1JEIDExOSAqLworCXU4IHJzdmQ1OFszMl07CS8qIERXT1JEIDEyMCAqLworCXU4IHJzdmQ1OVszMl07CS8qIERXT1JEIDEyMSAqLworCXU4IHJzdmQ2MFszMl07CS8qIERXT1JEIDEyMiAqLworCXU4IHJzdmQ2MVszMl07CS8qIERXT1JEIDEyMyAqLworCXU4IHJzdmQ2MlszMl07CS8qIERXT1JEIDEyNCAqLworCXU4IHJzdmQ2M1szMl07CS8qIERXT1JEIDEyNSAqLworCXU4IHJzdmQ2NFszMl07CS8qIERXT1JEIDEyNiAqLworCXU4IHJzdmQ2NVszMl07CS8qIERXT1JEIDEyNyAqLworCXU4IHJzdmQ2Nls2MTQ0MF07CS8qIERXT1JEIDEyOCAqLworCXN0cnVjdCBCRV9QQ0lDRkdfQU5PTl8yMl9NRVNTQUdFX0FNQVAgbWVzc2FnZVszMl07CisJdTggcnN2ZDY3WzI4NjcyXTsJLyogRFdPUkQgMjE3NiAqLworCXU4IHJzdmQ2OFszMl07CS8qIERXT1JEIDMwNzIgKi8KKwl1OCByc3ZkNjlbMTAyM11bMzJdOwkvKiBEV09SRCAzMDczICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGRzBfQ1NSTUFQX0FNQVAgeworCXUzMiBkd1s0MDk2XTsKK307CisKK3N0cnVjdCBCRV9QQ0lDRkdfQU5PTl8yNF9SU1ZEX0FNQVAgeworCXU4IHJzdmQwWzMyXTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfQU5PTl8yNF9SU1ZEX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKK3N0cnVjdCBCRV9QQ0lDRkdfQU5PTl8yNV9SU1ZEX0FNQVAgeworCXU4IHJzdmQwWzMyXTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfQU5PTl8yNV9SU1ZEX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKK3N0cnVjdCBCRV9QQ0lDRkdfQU5PTl8yNl9SU1ZEX0FNQVAgeworCXU4IHJzdmQwWzMyXTsJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfQU5PTl8yNl9SU1ZEX0FNQVAgeworCXUzMiBkd1sxXTsKK307CisKK3N0cnVjdCBCRV9QQ0lDRkdfQU5PTl8yN19SU1ZEX0FNQVAgeworCXU4IHJzdmQwWzMyXTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQxWzMyXTsJLyogRFdPUkQgMSAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfQU5PTl8yN19SU1ZEX0FNQVAgeworCXUzMiBkd1syXTsKK307CisKK3N0cnVjdCBCRV9QQ0lDRkdfQU5PTl8yOF9SU1ZEX0FNQVAgeworCXU4IHJzdmQwWzMyXTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQxWzNdWzMyXTsJLyogRFdPUkQgMSAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBQQ0lDRkdfQU5PTl8yOF9SU1ZEX0FNQVAgeworCXUzMiBkd1s0XTsKK307CisKK3N0cnVjdCBCRV9QQ0lDRkdfQU5PTl8yOV9SU1ZEX0FNQVAgeworCXU4IHJzdmQwWzMyXTsJLyogRFdPUkQgMCAqLworCXU4IHJzdmQxWzM2XVszMl07CS8qIERXT1JEIDEgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX0FOT05fMjlfUlNWRF9BTUFQIHsKKwl1MzIgZHdbMzddOworfTsKKworc3RydWN0IEJFX1BDSUNGR19BTk9OXzMwX1JTVkRfQU1BUCB7CisJdTggcnN2ZDBbMzJdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDFbMTkzMF1bMzJdOwkvKiBEV09SRCAxICovCit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19BTk9OXzMwX1JTVkRfQU1BUCB7CisJdTMyIGR3WzE5MzFdOworfTsKKworc3RydWN0IEJFX1BDSUNGR19BTk9OXzMxX01FU1NBR0VfQU1BUCB7CisJc3RydWN0IEJFX1BDSUNGR19NU0lYX1ZFQ1RPUl9DT05UUk9MX0NTUl9BTUFQIHZlY19jdHJsOworCXN0cnVjdCBCRV9QQ0lDRkdfTVNJWF9NU0dfREFUQV9DU1JfQU1BUCBtc2dfZGF0YTsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX01TSVhfTVNHX0FERFJfSElfQ1NSX0FNQVAgYWRkcl9oaTsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX01TSVhfTVNHX0FERFJfTE9fQ1NSX0FNQVAgYWRkcl9sb3c7Cit9IF9fcGFja2VkOworc3RydWN0IFBDSUNGR19BTk9OXzMxX01FU1NBR0VfQU1BUCB7CisJdTMyIGR3WzRdOworfTsKKworc3RydWN0IEJFX1BDSUNGR19BTk9OXzMyX1JTVkRfQU1BUCB7CisJdTggcnN2ZDBbMzJdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDFbODk1XVszMl07CS8qIERXT1JEIDEgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHX0FOT05fMzJfUlNWRF9BTUFQIHsKKwl1MzIgZHdbODk2XTsKK307CisKKy8qIFRoaXMgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UgcmVnaXN0ZXIgbWFwIGlzIGZvciB0aGUgIE5ldHdvcmtpbmcgRnVuY3Rpb24gb2YKKyAqIEJsYWRlRW5naW5lIChGdW5jdGlvbiAxKS4KKyAqLworc3RydWN0IEJFX1BDSUNGRzFfQ1NSTUFQX0FNQVAgeworCXN0cnVjdCBCRV9QQ0lDRkdfSURfQ1NSX0FNQVAgaWQ7CisJdTggcnN2ZDBbMzJdOwkvKiBEV09SRCAxICovCisJdTggcnN2ZDFbMzJdOwkvKiBEV09SRCAyICovCisJdTggcnN2ZDJbMzJdOwkvKiBEV09SRCAzICovCisJc3RydWN0IEJFX1BDSUNGR19JT0JBUl9DU1JfQU1BUCBpb2JhcjsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX01FTUJBUjBfQ1NSX0FNQVAgbWVtYmFyMDsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX01FTUJBUjFfTE9fQ1NSX0FNQVAgbWVtYmFyMV9sbzsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX01FTUJBUjFfSElfQ1NSX0FNQVAgbWVtYmFyMV9oaTsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX01FTUJBUjJfTE9fQ1NSX0FNQVAgbWVtYmFyMl9sbzsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX01FTUJBUjJfSElfQ1NSX0FNQVAgbWVtYmFyMl9oaTsKKwl1OCByc3ZkM1szMl07CS8qIERXT1JEIDEwICovCisJc3RydWN0IEJFX1BDSUNGR19TVUJTWVNURU1fSURfRjFfQ1NSX0FNQVAgc3Vic3lzdGVtX2lkOworCXU4IHJzdmQ0WzMyXTsJLyogRFdPUkQgMTIgKi8KKwl1OCByc3ZkNVszMl07CS8qIERXT1JEIDEzICovCisJdTggcnN2ZDZbMzJdOwkvKiBEV09SRCAxNCAqLworCXU4IHJzdmQ3WzMyXTsJLyogRFdPUkQgMTUgKi8KKwlzdHJ1Y3QgQkVfUENJQ0ZHX1NFTUFQSE9SRV9DU1JfQU1BUCBzZW1hcGhvcmVbNF07CisJc3RydWN0IEJFX1BDSUNGR19TT0ZUX1JFU0VUX0NTUl9BTUFQIHNvZnRfcmVzZXQ7CisJdTggcnN2ZDhbMzJdOwkvKiBEV09SRCAyMSAqLworCXN0cnVjdCBCRV9QQ0lDRkdfU0NSQVRDSFBBRF9DU1JfQU1BUCBzY3JhdGNocGFkOworCXU4IHJzdmQ5WzMyXTsJLyogRFdPUkQgMjMgKi8KKwl1OCByc3ZkMTBbMzJdOwkvKiBEV09SRCAyNCAqLworCXU4IHJzdmQxMVszMl07CS8qIERXT1JEIDI1ICovCisJdTggcnN2ZDEyWzMyXTsJLyogRFdPUkQgMjYgKi8KKwl1OCByc3ZkMTNbMzJdOwkvKiBEV09SRCAyNyAqLworCXU4IHJzdmQxNFsyXVszMl07CS8qIERXT1JEIDI4ICovCisJdTggcnN2ZDE1WzMyXTsJLyogRFdPUkQgMzAgKi8KKwl1OCByc3ZkMTZbMzJdOwkvKiBEV09SRCAzMSAqLworCXU4IHJzdmQxN1s4XVszMl07CS8qIERXT1JEIDMyICovCisJc3RydWN0IEJFX1BDSUNGR19VRV9TVEFUVVNfTE9XX0NTUl9BTUFQIHVlX3N0YXR1c19sb3c7CisJc3RydWN0IEJFX1BDSUNGR19VRV9TVEFUVVNfSElfQ1NSX0FNQVAgdWVfc3RhdHVzX2hpOworCXN0cnVjdCBCRV9QQ0lDRkdfVUVfU1RBVFVTX0xPV19NQVNLX0NTUl9BTUFQIHVlX3N0YXR1c19sb3dfbWFzazsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX1VFX1NUQVRVU19ISV9NQVNLX0NTUl9BTUFQIHVlX3N0YXR1c19oaV9tYXNrOworCXN0cnVjdCBCRV9QQ0lDRkdfT05MSU5FMF9DU1JfQU1BUCBvbmxpbmUwOworCXN0cnVjdCBCRV9QQ0lDRkdfT05MSU5FMV9DU1JfQU1BUCBvbmxpbmUxOworCXU4IHJzdmQxOFszMl07CS8qIERXT1JEIDQ2ICovCisJdTggcnN2ZDE5WzMyXTsJLyogRFdPUkQgNDcgKi8KKwl1OCByc3ZkMjBbMzJdOwkvKiBEV09SRCA0OCAqLworCXU4IHJzdmQyMVszMl07CS8qIERXT1JEIDQ5ICovCisJc3RydWN0IEJFX1BDSUNGR19IT1NUX1RJTUVSX0lOVF9DVFJMX0NTUl9BTUFQIGhvc3RfdGltZXJfaW50X2N0cmw7CisJdTggcnN2ZDIyWzMyXTsJLyogRFdPUkQgNTEgKi8KKwlzdHJ1Y3QgQkVfUENJQ0ZHX1BDSUVfQ0FQX0NTUl9BTUFQIHBjaWVfY2FwOworCXN0cnVjdCBCRV9QQ0lDRkdfUENJRV9ERVZDQVBfQ1NSX0FNQVAgcGNpZV9kZXZjYXA7CisJc3RydWN0IEJFX1BDSUNGR19QQ0lFX0NPTlRST0xfU1RBVFVTX0NTUl9BTUFQIHBjaWVfY29udHJvbF9zdGF0dXM7CisJc3RydWN0IEJFX1BDSUNGR19QQ0lFX0xJTktfQ0FQX0NTUl9BTUFQIHBjaWVfbGlua19jYXA7CisJc3RydWN0IEJFX1BDSUNGR19QQ0lFX0xJTktfU1RBVFVTX0NTUl9BTUFQIHBjaWVfbGlua19zdGF0dXM7CisJc3RydWN0IEJFX1BDSUNGR19NU0lfQ1NSX0FNQVAgbXNpOworCXN0cnVjdCBCRV9QQ0lDRkdfTVNJWF9UQUJMRV9DU1JfQU1BUCBtc2l4X3RhYmxlX29mZnNldDsKKwlzdHJ1Y3QgQkVfUENJQ0ZHX01TSVhfUEJBX0NTUl9BTUFQIG1zaXhfcGJhX29mZnNldDsKKwl1OCByc3ZkMjNbNjRdOwkvKiBEV09SRCA2MCAqLworCXU4IHJzdmQyNFszMl07CS8qIERXT1JEIDYyICovCisJdTggcnN2ZDI1WzMyXTsJLyogRFdPUkQgNjMgKi8KKwl1OCByc3ZkMjZbMzJdOwkvKiBEV09SRCA2NCAqLworCXU4IHJzdmQyN1szMl07CS8qIERXT1JEIDY1ICovCisJdTggcnN2ZDI4WzMyXTsJLyogRFdPUkQgNjYgKi8KKwl1OCByc3ZkMjlbMzJdOwkvKiBEV09SRCA2NyAqLworCXU4IHJzdmQzMFszMl07CS8qIERXT1JEIDY4ICovCisJdTggcnN2ZDMxWzMyXTsJLyogRFdPUkQgNjkgKi8KKwl1OCByc3ZkMzJbMzJdOwkvKiBEV09SRCA3MCAqLworCXU4IHJzdmQzM1szMl07CS8qIERXT1JEIDcxICovCisJdTggcnN2ZDM0WzMyXTsJLyogRFdPUkQgNzIgKi8KKwl1OCByc3ZkMzVbMzJdOwkvKiBEV09SRCA3MyAqLworCXU4IHJzdmQzNlszMl07CS8qIERXT1JEIDc0ICovCisJdTggcnN2ZDM3WzEyOF07CS8qIERXT1JEIDc1ICovCisJdTggcnN2ZDM4WzMyXTsJLyogRFdPUkQgNzkgKi8KKwl1OCByc3ZkMzlbMTE4NF07CS8qIERXT1JEIDgwICovCisJdTggcnN2ZDQwWzYxNzkyXTsJLyogRFdPUkQgMTE3ICovCisJc3RydWN0IEJFX1BDSUNGR19BTk9OXzMxX01FU1NBR0VfQU1BUCBtZXNzYWdlWzMyXTsKKwl1OCByc3ZkNDFbMjg2NzJdOwkvKiBEV09SRCAyMTc2ICovCisJdTggcnN2ZDQyWzMyXTsJLyogRFdPUkQgMzA3MiAqLworCXU4IHJzdmQ0M1sxMDIzXVszMl07CS8qIERXT1JEIDMwNzMgKi8KK30gX19wYWNrZWQ7CitzdHJ1Y3QgUENJQ0ZHMV9DU1JNQVBfQU1BUCB7CisJdTMyIGR3WzQwOTZdOworfTsKKworI2VuZGlmIC8qIF9fcGNpY2ZnX2FtYXBfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmVuZXQvcG9zdF9jb2Rlcy5oIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L3Bvc3RfY29kZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDE2MjFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L3Bvc3RfY29kZXMuaApAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDggU2VydmVyRW5naW5lcworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBsaW51eC1kcml2ZXJzQHNlcnZlcmVuZ2luZXMuY29tCisgKgorICogU2VydmVyRW5naW5lcworICogMjA5IE4uIEZhaXIgT2FrcyBBdmUKKyAqIFN1bm55dmFsZSwgQ0EgOTQwODUKKyAqLworLyoKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgc3JjZ2VuIHZlcnNpb246IDAxMjcKKyAqLworI2lmbmRlZiBfX3Bvc3RfY29kZXNfYW1hcF9oX18KKyNkZWZpbmUgX19wb3N0X2NvZGVzX2FtYXBfaF9fCisKKy8qIC0tLSBNR01UX0hCQV9QT1NUX1NUQUdFX0VOVU0gLS0tICovCisjZGVmaW5lIFBPU1RfU1RBR0VfUE9XRVJfT05fUkVTRVQgICAoMCkJLyogU3RhdGUgYWZ0ZXIgYSBjb2xkIG9yIHdhcm0gYm9vdC4gKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9BV0FJVElOR19IT1NUX1JEWSAoMSkJLyogQVJNIGJvb3QgY29kZSBhd2FpdGluZyBhCisJCQkJCQlnby1haGVkIGZyb20gIHRoZSBob3N0LiAqLworI2RlZmluZSBQT1NUX1NUQUdFX0hPU1RfUkRZICgyKQkvKiBIb3N0IGhhcyBnaXZlbiBnby1haGVkIHRvIEFSTS4gKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9CRV9SRVNFVCAoMykJLyogSG9zdCB3YW50cyB0byByZXNldCBjaGlwLCB0aGlzIGlzIGEgIGNoaXAKKwkJCQkJCXdvcmthcm91bmQgICovCisjZGVmaW5lIFBPU1RfU1RBR0VfU0VFUFJPTV9DU19TVEFSVCAoMjU2KQkvKiBTRUVQUk9NIGNoZWNrc3VtCisJCQkJCQl0ZXN0IHN0YXJ0LiAqLworI2RlZmluZSBQT1NUX1NUQUdFX1NFRVBST01fQ1NfRE9ORSAgKDI1NykJLyogU0VFUFJPTSBjaGVja3N1bSB0ZXN0CisJCQkJCQkJZG9uZS4gKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9ERFJfQ09ORklHX1NUQVJUICg1MTIpCS8qIEREUiBjb25maWd1cmF0aW9uIHN0YXJ0LiAqLworI2RlZmluZSBQT1NUX1NUQUdFX0REUl9DT05GSUdfRE9ORSAgKDUxMykJLyogRERSIGNvbmZpZ3VyYXRpb24gZG9uZS4gKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9ERFJfQ0FMSUJSQVRFX1NUQVJUICAoNzY4KQkvKiBERFIgY2FsaWJyYXRpb24gc3RhcnQuICovCisjZGVmaW5lIFBPU1RfU1RBR0VfRERSX0NBTElCUkFURV9ET05FICAgKDc2OSkJLyogRERSIGNhbGlicmF0aW9uIGRvbmUuICovCisjZGVmaW5lIFBPU1RfU1RBR0VfRERSX1RFU1RfU1RBUlQgICAoMTAyNCkJLyogRERSIG1lbW9yeSB0ZXN0IHN0YXJ0LiAqLworI2RlZmluZSBQT1NUX1NUQUdFX0REUl9URVNUX0RPTkUgICAgKDEwMjUpCS8qIEREUiBtZW1vcnkgdGVzdCBkb25lLiAqLworI2RlZmluZSBQT1NUX1NUQUdFX1JFREJPT1RfSU5JVF9TVEFSVCAgICgxNTM2KQkvKiBSZWRib290IHN0YXJ0cyBleGVjdXRpb24uICovCisjZGVmaW5lIFBPU1RfU1RBR0VfUkVEQk9PVF9JTklUX0RPTkUgKDE1MzcpCS8qIFJlZGJvb3QgZG9uZSBleGVjdXRpb24uICovCisjZGVmaW5lIFBPU1RfU1RBR0VfRldfSU1BR0VfTE9BRF9TVEFSVCAoMTc5MikJLyogRmlybXdhcmUgaW1hZ2UgbG9hZCB0bworCQkJCQkJCUREUiBzdGFydC4gKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9GV19JTUFHRV9MT0FEX0RPTkUgICAoMTc5MykJLyogRmlybXdhcmUgaW1hZ2UgbG9hZAorCQkJCQkJCXRvIEREUiBkb25lLiAqLworI2RlZmluZSBQT1NUX1NUQUdFX0FSTUZXX1NUQVJUICAgICAgICAgICgyMDQ4KQkvKiBBUk1mdyBydW50aW1lIGNvZGUKKwkJCQkJCXN0YXJ0cyBleGVjdXRpb24uICovCisjZGVmaW5lIFBPU1RfU1RBR0VfREhDUF9RVUVSWV9TVEFSVCAgICAgKDIzMDQpCS8qIERIQ1Agc2VydmVyIHF1ZXJ5IHN0YXJ0LiAqLworI2RlZmluZSBQT1NUX1NUQUdFX0RIQ1BfUVVFUllfRE9ORSAgICAgICgyMzA1KQkvKiBESENQIHNlcnZlciBxdWVyeSBkb25lLiAqLworI2RlZmluZSBQT1NUX1NUQUdFX0JPT1RfVEFSR0VUX0RJU0NPVkVSWV9TVEFSVCAoMjU2MCkJLyogQm9vdCBUYXJnZXQKKwkJCQkJCURpc2NvdmVyeSBTdGFydC4gKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9CT09UX1RBUkdFVF9ESVNDT1ZFUllfRE9ORSAoMjU2MSkJLyogQm9vdCBUYXJnZXQKKwkJCQkJCURpc2NvdmVyeSBEb25lLiAqLworI2RlZmluZSBQT1NUX1NUQUdFX1JDX09QVElPTl9TRVQgICAgICAgICgyODE2KQkvKiBSZW1vdGUgY29uZmlndXJhdGlvbgorCQkJCQkJb3B0aW9uIGlzIHNldCBpbiAgU0VFUFJPTSAgKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9TV0lUQ0hfTElOSyAgICAgICAgICAoMjgxNykJLyogV2FpdCBmb3IgbGluayB1cCBvbiBzd2l0Y2ggKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9TRU5EX0lDRFNfTUVTU0FHRSAgICAoMjgxOCkJLyogU2VuZCB0aGUgSUNEUyBtZXNzYWdlCisJCQkJCQl0byBzd2l0Y2ggKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9QRVJGUk9NX1RGVFAgICAgICAgICAoMjgxOSkJLyogRG93bmxvYWQgeG1sIHVzaW5nIFRGVFAgKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9QQVJTRV9YTUwgICAgICAgICAgICAoMjgyMCkJLyogUGFyc2UgWE1MIGZpbGUgKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9ET1dOTE9BRF9JTUFHRSAgICAgICAoMjgyMSkJLyogRG93bmxvYWQgSU1BR0UgZnJvbQorCQkJCQkJVEZUUCBzZXJ2ZXIgKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9GTEFTSF9JTUFHRSAgICAgICAgICAoMjgyMikJLyogRmxhc2ggdGhlIElNQUdFICovCisjZGVmaW5lIFBPU1RfU1RBR0VfUkNfRE9ORSAgICAgICAgICAgICAgKDI4MjMpCS8qIFJlbW90ZSBjb25maWd1cmF0aW9uCisJCQkJCQljb21wbGV0ZSAqLworI2RlZmluZSBQT1NUX1NUQUdFX1JFQk9PVF9TWVNURU0gICAgICAgICgyODI0KQkvKiBVcGdyYWRlIElNQUdFIGRvbmUsCisJCQkJCQlyZWJvb3QgcmVxdWlyZWQgKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9NQUNfQUREUkVTUyAgICAgICAgICAoMzA3MikJLyogTUFDIEFkZHJlc3MgQ2hlY2sgKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9BUk1GV19SRUFEWSAgICAgICAgICAoNDkxNTIpCS8qIEFSTWZ3IGlzIGRvbmUgd2l0aCBQT1NUCisJCQkJCQlhbmQgcmVhZHkuICovCisjZGVmaW5lIFBPU1RfU1RBR0VfQVJNRldfVUUgICAgICAgICAgICAgKDYxNDQwKQkvKiBBUk1mdyBoYXMgYXNzZXJ0ZWQgYW4KKwkJCQkJCXVucmVjb3ZlcmFibGUgZXJyb3IuIFRoZQorCQkJCQkJbG93ZXIgMyBoZXggZGlnaXRzIG9mIHRoZQorCQkJCQkJc3RhZ2UgY29kZSBpZGVudGlmeSB0aGUKKwkJCQkJCXVuaXF1ZSBlcnJvciBjb2RlLgorCQkJCQkJKi8KKworLyogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgZm9ybWF0IG9mIHRoZSBNUFUgc2VtYXBob3JlCisgKiByZWdpc3RlciB3aGVuIHVzZWQgZm9yIFBPU1QuCisgKi8KK3N0cnVjdCBCRV9NR01UX0hCQV9QT1NUX1NUQVRVU19TVFJVQ1RfQU1BUCB7CisJdTggc3RhZ2VbMTZdOwkvKiBEV09SRCAwICovCisJdTggcnN2ZDBbMTBdOwkvKiBEV09SRCAwICovCisJdTggaXNjc2lfZHJpdmVyX2xvYWRlZDsJLyogRFdPUkQgMCAqLworCXU4IG9wdGlvbl9yb21faW5zdGFsbGVkOwkvKiBEV09SRCAwICovCisJdTggaXNjc2lfaXBfY29uZmxpY3Q7CS8qIERXT1JEIDAgKi8KKwl1OCBpc2NzaV9ub19pcDsJLyogRFdPUkQgMCAqLworCXU4IGJhY2t1cF9mdzsJLyogRFdPUkQgMCAqLworCXU4IGVycm9yOwkJLyogRFdPUkQgMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBNR01UX0hCQV9QT1NUX1NUQVRVU19TVFJVQ1RfQU1BUCB7CisJdTMyIGR3WzFdOworfTsKKworLyogLS0tIE1HTVRfSEJBX1BPU1RfRFVNTVlfQklUU19FTlVNIC0tLSAqLworI2RlZmluZSBQT1NUX0JJVF9JU0NTSV9MT0FERUQgICAgICAgICAgICgyNikKKyNkZWZpbmUgUE9TVF9CSVRfT1BUUk9NX0lOU1QgICAgICAgICAgICAoMjcpCisjZGVmaW5lIFBPU1RfQklUX0JBRF9JUF9BRERSICAgICAgICAgICAgKDI4KQorI2RlZmluZSBQT1NUX0JJVF9OT19JUF9BRERSICAgICAgICAgICAgICgyOSkKKyNkZWZpbmUgUE9TVF9CSVRfQkFDS1VQX0ZXICAgICAgICAgICAgICAoMzApCisjZGVmaW5lIFBPU1RfQklUX0VSUk9SICAgICAgICAgICAgICAgICAgKDMxKQorCisvKiAtLS0gTUdNVF9IQkFfUE9TVF9EVU1NWV9WQUxVRVNfRU5VTSAtLS0gKi8KKyNkZWZpbmUgUE9TVF9JU0NTSV9EUklWRVJfTE9BREVEICAgICAgICAoNjcxMDg4NjQpCisjZGVmaW5lIFBPU1RfT1BUUk9NX0lOU1RBTExFRCAgICAgICAgICAgKDEzNDIxNzcyOCkKKyNkZWZpbmUgUE9TVF9JU0NTSV9JUF9BRERSRVNTX0NPTkZMSUNUICAoMjY4NDM1NDU2KQorI2RlZmluZSBQT1NUX0lTQ1NJX05PX0lQX0FERFJFU1MgICAgICAgICg1MzY4NzA5MTIpCisjZGVmaW5lIFBPU1RfQkFDS1VQX0ZXX0xPQURFRCAgICAgICAgICAgKDEwNzM3NDE4MjQpCisjZGVmaW5lIFBPU1RfRkFUQUxfRVJST1IgICAgICAgICAgICAgICAgKDIxNDc0ODM2NDgpCisKKyNlbmRpZiAvKiBfX3Bvc3RfY29kZXNfYW1hcF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9yZWdtYXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9iZW5ldC9yZWdtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODE2YmEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JlbmV0L3JlZ21hcC5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA4IFNlcnZlckVuZ2luZXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogbGludXgtZHJpdmVyc0BzZXJ2ZXJlbmdpbmVzLmNvbQorICoKKyAqIFNlcnZlckVuZ2luZXMKKyAqIDIwOSBOLiBGYWlyIE9ha3MgQXZlCisgKiBTdW5ueXZhbGUsIENBIDk0MDg1CisgKi8KKy8qCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IHNyY2dlbiB2ZXJzaW9uOiAwMTI3CisgKi8KKyNpZm5kZWYgX19yZWdtYXBfYW1hcF9oX18KKyNkZWZpbmUgX19yZWdtYXBfYW1hcF9oX18KKyNpbmNsdWRlICJwY2ljZmcuaCIKKyNpbmNsdWRlICJlcC5oIgorI2luY2x1ZGUgImNldi5oIgorI2luY2x1ZGUgIm1wdS5oIgorI2luY2x1ZGUgImRvb3JiZWxscy5oIgorCisvKgorICogVGhpcyBpcyB0aGUgY29udHJvbCBhbmQgc3RhdHVzIHJlZ2lzdGVyIG1hcCBmb3IgQmxhZGVFbmdpbmUsIHNob3dpbmcKKyAqIHRoZSByZWxhdGl2ZSBzaXplIGFuZCBvZmZzZXQgb2YgZWFjaCBzdWItbW9kdWxlLiBUaGUgQ1NSIHJlZ2lzdGVycworICogYXJlIGlkZW50aWNhbCBmb3IgdGhlIG5ldHdvcmsgYW5kIHN0b3JhZ2UgUENJIGZ1bmN0aW9ucy4gVGhlCisgKiBDU1IgbWFwIGlzIHNob3duIGJlbG93LCBmb2xsb3dlZCBieSBkZXRhaWxzIG9mIGVhY2ggYmxvY2ssCisgKiBpbiBzdWItc2VjdGlvbnMuICBUaGUgc3ViLXNlY3Rpb25zIGJlZ2luIHdpdGggYSBkZXNjcmlwdGlvbgorICogb2YgQ1NScyB0aGF0IGFyZSBpbnN0YW50aWF0ZWQgaW4gbXVsdGlwbGUgYmxvY2tzLgorICovCitzdHJ1Y3QgQkVfQkxBREVfRU5HSU5FX0NTUk1BUF9BTUFQIHsKKwlzdHJ1Y3QgQkVfTVBVX0NTUk1BUF9BTUFQIG1wdTsKKwl1OCByc3ZkMFs4MTkyXTsJLyogRFdPUkQgMjU2ICovCisJdTggcnN2ZDFbODE5Ml07CS8qIERXT1JEIDUxMiAqLworCXN0cnVjdCBCRV9DRVZfQ1NSTUFQX0FNQVAgY2V2OworCXU4IHJzdmQyWzgxOTJdOwkvKiBEV09SRCAxMDI0ICovCisJdTggcnN2ZDNbODE5Ml07CS8qIERXT1JEIDEyODAgKi8KKwl1OCByc3ZkNFs4MTkyXTsJLyogRFdPUkQgMTUzNiAqLworCXU4IHJzdmQ1WzgxOTJdOwkvKiBEV09SRCAxNzkyICovCisJdTggcnN2ZDZbODE5Ml07CS8qIERXT1JEIDIwNDggKi8KKwl1OCByc3ZkN1s4MTkyXTsJLyogRFdPUkQgMjMwNCAqLworCXU4IHJzdmQ4WzgxOTJdOwkvKiBEV09SRCAyNTYwICovCisJdTggcnN2ZDlbODE5Ml07CS8qIERXT1JEIDI4MTYgKi8KKwl1OCByc3ZkMTBbODE5Ml07CS8qIERXT1JEIDMwNzIgKi8KKwl1OCByc3ZkMTFbODE5Ml07CS8qIERXT1JEIDMzMjggKi8KKwl1OCByc3ZkMTJbODE5Ml07CS8qIERXT1JEIDM1ODQgKi8KKwl1OCByc3ZkMTNbODE5Ml07CS8qIERXT1JEIDM4NDAgKi8KKwl1OCByc3ZkMTRbODE5Ml07CS8qIERXT1JEIDQwOTYgKi8KKwl1OCByc3ZkMTVbODE5Ml07CS8qIERXT1JEIDQzNTIgKi8KKwl1OCByc3ZkMTZbODE5Ml07CS8qIERXT1JEIDQ2MDggKi8KKwl1OCByc3ZkMTdbODE5Ml07CS8qIERXT1JEIDQ4NjQgKi8KKwl1OCByc3ZkMThbODE5Ml07CS8qIERXT1JEIDUxMjAgKi8KKwl1OCByc3ZkMTlbODE5Ml07CS8qIERXT1JEIDUzNzYgKi8KKwl1OCByc3ZkMjBbODE5Ml07CS8qIERXT1JEIDU2MzIgKi8KKwl1OCByc3ZkMjFbODE5Ml07CS8qIERXT1JEIDU4ODggKi8KKwl1OCByc3ZkMjJbODE5Ml07CS8qIERXT1JEIDYxNDQgKi8KKwl1OCByc3ZkMjNbMTcxNTJdWzMyXTsJLyogRFdPUkQgNjQwMCAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBCTEFERV9FTkdJTkVfQ1NSTUFQX0FNQVAgeworCXUzMiBkd1syMzU1Ml07Cit9OworCisjZW5kaWYgLyogX19yZWdtYXBfYW1hcF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTAxYmZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9LY29uZmlnCkBAIC0wLDAgKzEsMjcgQEAKK2NvbmZpZyBDT01FREkKKwl0cmlzdGF0ZSAiRGF0YSBBY3F1aXNpb24gc3VwcG9ydCAoY29tZWRpKSIKKwlkZWZhdWx0IE4KKwktLS1oZWxwLS0tCisJICBFbmFibGUgc3VwcG9ydCBhIHdpZGUgcmFuZ2Ugb2YgZGF0YSBhY3F1aXNpb24gZGV2aWNlcworCSAgZm9yIExpbnV4LgorCitjb25maWcgQ09NRURJX1JUCisJdHJpc3RhdGUgIkNvbWVkaSBSZWFsLXRpbWUgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIENPTUVESSAmJiBSVAorCWRlZmF1bHQgTgorCS0tLWhlbHAtLS0KKwkgIEVuYWJsZSBSZWFsIHRpbWUgc3VwcG9ydCBmb3IgdGhlIENvbWVkaSBjb3JlLgorCitjb25maWcgQ09NRURJX1BDSV9EUklWRVJTCisJdHJpc3RhdGUgIkNvbWVkaSBQQ0kgZHJpdmVycyIKKwlkZXBlbmRzIG9uIENPTUVESSAmJiBQQ0kKKwlkZWZhdWx0IE4KKwktLS1oZWxwLS0tCisJICBFbmFibGUgbG90cyBvZiBjb21lZGkgUENJIGRyaXZlcnMgdG8gYmUgYnVpbHQKKworY29uZmlnIENPTUVESV9VU0JfRFJJVkVSUworCXRyaXN0YXRlICJDb21lZGkgVVNCIGRyaXZlcnMiCisJZGVwZW5kcyBvbiBDT01FREkgJiYgVVNCCisJZGVmYXVsdCBOCisJLS0taGVscC0tLQorCSAgRW5hYmxlIGxvdHMgb2YgY29tZWRpIFVTQiBkcml2ZXJzIHRvIGJlIGJ1aWx0CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmQxYTE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9NYWtlZmlsZQpAQCAtMCwwICsxLDE3IEBACitvYmotJChDT05GSUdfQ09NRURJKSArPSBjb21lZGkubworb2JqLSQoQ09ORklHX0NPTUVESV9SVCkgKz0gY29tZWRpX3J0Lm8KKworb2JqLSQoQ09ORklHX0NPTUVESSkJKz0ga2NvbWVkaWxpYi8KK29iai0kKENPTkZJR19DT01FREkpCSs9IGRyaXZlcnMvCisKK2NvbWVkaS1vYmpzIDo9CQlcCisJY29tZWRpX2ZvcHMubwlcCisJcHJvYy5vCQlcCisJcmFuZ2UubwkJXAorCWRyaXZlcnMubwlcCisJY29tZWRpX2NvbXBhdDMyLm8gXAorCWNvbWVkaV9rc3ltcy5vCVwKKworY29tZWRpX3J0LW9ianMgOj0JXAorCXJ0X3BlbmRfdHEubwlcCisJcnQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NzgxMjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL1RPRE8KQEAgLTAsMCArMSwxNCBAQAorVE9ETzoKKwktIGNoZWNrcGF0Y2gucGwgY2xlYW51cHMKKwktIExpbmRlbnQKKwktIHJlbW92ZSBhbGwgd3JhcHBlcnMKKwktIHJlbW92ZSB0eXBlZGVmcworCS0gYXVkaXQgdXNlcnNwYWNlIGludGVyZmFjZQorCS0gcmVzZXJ2ZSBtYWpvciBudW1iZXIKKwktIGNsZWFudXAgdGhlIGluZGl2aWR1YWwgY29tZWRpIGRyaXZlcnMgYXMgd2VsbAorCitQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+IGFuZAorY29weToKKwlJYW4gQWJib3R0IDxhYmJvdHRpQG1ldi5jby51az4KKwlGcmFuayBNb3JpIEhlc3MgPGZtaGVzc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisJRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaS5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmQyZTFiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGkuaApAQCAtMCwwICsxLDkxNiBAQAorLyoKKyAgICBpbmNsdWRlL2NvbWVkaS5oIChpbnN0YWxsZWQgYXMgL3Vzci9pbmNsdWRlL2NvbWVkaS5oKQorICAgIGhlYWRlciBmaWxlIGZvciBjb21lZGkKKworICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMSBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI2lmbmRlZiBfQ09NRURJX0gKKyNkZWZpbmUgX0NPTUVESV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBDT01FRElfTUFKT1JWRVJTSU9OCTAKKyNkZWZpbmUgQ09NRURJX01JTk9SVkVSU0lPTgk3CisjZGVmaW5lIENPTUVESV9NSUNST1ZFUlNJT04JNzYKKyNkZWZpbmUgVkVSU0lPTgkiMC43Ljc2IgorCisvKiBjb21lZGkncyBtYWpvciBkZXZpY2UgbnVtYmVyICovCisjZGVmaW5lIENPTUVESV9NQUpPUiA5OAorCisvKgorICAgbWF4aW11bSBudW1iZXIgb2YgbWlub3IgZGV2aWNlcy4gIFRoaXMgY2FuIGJlIGluY3JlYXNlZCwgYWx0aG91Z2gKKyAgIGtlcm5lbCBzdHJ1Y3R1cmVzIGFyZSBjdXJyZW50bHkgc3RhdGljYWxseSBhbGxvY2F0ZWQsIHRodXMgeW91CisgICBkb24ndCB3YW50IHRoaXMgdG8gYmUgbXVjaCBtb3JlIHRoYW4geW91IGFjdHVhbGx5IHVzZS4KKyAqLworI2RlZmluZSBDT01FRElfTkRFVklDRVMgMTYKKworLyogbnVtYmVyIG9mIGNvbmZpZyBvcHRpb25zIGluIHRoZSBjb25maWcgc3RydWN0dXJlICovCisjZGVmaW5lIENPTUVESV9OREVWQ09ORk9QVFMgMzIKKy8qbGVuZ3RoIG9mIG50aCBjaHVuayBvZiBmaXJtd2FyZSBkYXRhKi8KKyNkZWZpbmUgQ09NRURJX0RFVkNPTkZfQVVYX0RBVEEzX0xFTkdUSAkJMjUKKyNkZWZpbmUgQ09NRURJX0RFVkNPTkZfQVVYX0RBVEEyX0xFTkdUSAkJMjYKKyNkZWZpbmUgQ09NRURJX0RFVkNPTkZfQVVYX0RBVEExX0xFTkdUSAkJMjcKKyNkZWZpbmUgQ09NRURJX0RFVkNPTkZfQVVYX0RBVEEwX0xFTkdUSAkJMjgKKyNkZWZpbmUgQ09NRURJX0RFVkNPTkZfQVVYX0RBVEFfSEkJCTI5CS8qIG1vc3Qgc2lnbmlmaWNhbnQgMzIgYml0cyBvZiBwb2ludGVyIGFkZHJlc3MgKGlmIG5lZWRlZCkgKi8KKyNkZWZpbmUgQ09NRURJX0RFVkNPTkZfQVVYX0RBVEFfTE8JCTMwCS8qIGxlYXN0IHNpZ25pZmljYW50IDMyIGJpdHMgb2YgcG9pbnRlciBhZGRyZXNzICovCisjZGVmaW5lIENPTUVESV9ERVZDT05GX0FVWF9EQVRBX0xFTkdUSAkJMzEJLyogdG90YWwgZGF0YSBsZW5ndGggKi8KKworLyogbWF4IGxlbmd0aCBvZiBkZXZpY2UgYW5kIGRyaXZlciBuYW1lcyAqLworI2RlZmluZSBDT01FRElfTkFNRUxFTiAyMAorCisJdHlwZWRlZiB1bnNpZ25lZCBpbnQgbHNhbXBsX3Q7CisJdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBzYW1wbF90OworCisvKiBwYWNrcyBhbmQgdW5wYWNrcyBhIGNoYW5uZWwvcmFuZ2UgbnVtYmVyICovCisKKyNkZWZpbmUgQ1JfUEFDSyhjaGFuLCBybmcsIGFyZWYpCQkoKCgoYXJlZikmMHgzKTw8MjQpIHwgKCgocm5nKSYweGZmKTw8MTYpIHwgKGNoYW4pKQorI2RlZmluZSBDUl9QQUNLX0ZMQUdTKGNoYW4sIHJhbmdlLCBhcmVmLCBmbGFncykJKENSX1BBQ0soY2hhbiwgcmFuZ2UsIGFyZWYpIHwgKChmbGFncykgJiBDUl9GTEFHU19NQVNLKSkKKworI2RlZmluZSBDUl9DSEFOKGEpCSgoYSkmMHhmZmZmKQorI2RlZmluZSBDUl9SQU5HRShhKQkoKChhKT4+MTYpJjB4ZmYpCisjZGVmaW5lIENSX0FSRUYoYSkJKCgoYSk+PjI0KSYweDAzKQorCisjZGVmaW5lIENSX0ZMQUdTX01BU0sJMHhmYzAwMDAwMAorI2RlZmluZSBDUl9BTFRfRklMVEVSCSgxPDwyNikKKyNkZWZpbmUgQ1JfRElUSEVSCUNSX0FMVF9GSUxURVIKKyNkZWZpbmUgQ1JfREVHTElUQ0gJQ1JfQUxUX0ZJTFRFUgorI2RlZmluZSBDUl9BTFRfU09VUkNFCSgxPDwyNykKKyNkZWZpbmUgQ1JfRURHRQkJKDE8PDMwKQorI2RlZmluZSBDUl9JTlZFUlQJKDE8PDMxKQorCisjZGVmaW5lIEFSRUZfR1JPVU5ECTB4MDAJLyogYW5hbG9nIHJlZiA9IGFuYWxvZyBncm91bmQgKi8KKyNkZWZpbmUgQVJFRl9DT01NT04JMHgwMQkvKiBhbmFsb2cgcmVmID0gYW5hbG9nIGNvbW1vbiAqLworI2RlZmluZSBBUkVGX0RJRkYJMHgwMgkvKiBhbmFsb2cgcmVmID0gZGlmZmVyZW50aWFsICovCisjZGVmaW5lIEFSRUZfT1RIRVIJMHgwMwkvKiBhbmFsb2cgcmVmID0gb3RoZXIgKHVuZGVmaW5lZCkgKi8KKworLyogY291bnRlcnMgLS0gdGhlc2UgYXJlIGFyYml0cmFyeSB2YWx1ZXMgKi8KKyNkZWZpbmUgR1BDVF9SRVNFVAkJMHgwMDAxCisjZGVmaW5lIEdQQ1RfU0VUX1NPVVJDRQkJMHgwMDAyCisjZGVmaW5lIEdQQ1RfU0VUX0dBVEUJCTB4MDAwNAorI2RlZmluZSBHUENUX1NFVF9ESVJFQ1RJT04JMHgwMDA4CisjZGVmaW5lIEdQQ1RfU0VUX09QRVJBVElPTgkweDAwMTAKKyNkZWZpbmUgR1BDVF9BUk0JCTB4MDAyMAorI2RlZmluZSBHUENUX0RJU0FSTQkJMHgwMDQwCisjZGVmaW5lIEdQQ1RfR0VUX0lOVF9DTEtfRlJRCTB4MDA4MAorCisjZGVmaW5lIEdQQ1RfSU5UX0NMT0NLCQkweDAwMDEKKyNkZWZpbmUgR1BDVF9FWFRfUElOCQkweDAwMDIKKyNkZWZpbmUgR1BDVF9OT19HQVRFCQkweDAwMDQKKyNkZWZpbmUgR1BDVF9VUAkJCTB4MDAwOAorI2RlZmluZSBHUENUX0RPV04JCTB4MDAxMAorI2RlZmluZSBHUENUX0hXVUQJCTB4MDAyMAorI2RlZmluZSBHUENUX1NJTVBMRV9FVkVOVAkweDAwNDAKKyNkZWZpbmUgR1BDVF9TSU5HTEVfUEVSSU9ECTB4MDA4MAorI2RlZmluZSBHUENUX1NJTkdMRV9QVwkJMHgwMTAwCisjZGVmaW5lIEdQQ1RfQ09OVF9QVUxTRV9PVVQJMHgwMjAwCisjZGVmaW5lIEdQQ1RfU0lOR0xFX1BVTFNFX09VVAkweDA0MDAKKworLyogaW5zdHJ1Y3Rpb25zICovCisKKyNkZWZpbmUgSU5TTl9NQVNLX1dSSVRFCQkweDgwMDAwMDAKKyNkZWZpbmUgSU5TTl9NQVNLX1JFQUQJCTB4NDAwMDAwMAorI2RlZmluZSBJTlNOX01BU0tfU1BFQ0lBTAkweDIwMDAwMDAKKworI2RlZmluZSBJTlNOX1JFQUQJCSgwIHwgSU5TTl9NQVNLX1JFQUQpCisjZGVmaW5lIElOU05fV1JJVEUJCSgxIHwgSU5TTl9NQVNLX1dSSVRFKQorI2RlZmluZSBJTlNOX0JJVFMJCSgyIHwgSU5TTl9NQVNLX1JFQUR8SU5TTl9NQVNLX1dSSVRFKQorI2RlZmluZSBJTlNOX0NPTkZJRwkJKDMgfCBJTlNOX01BU0tfUkVBRHxJTlNOX01BU0tfV1JJVEUpCisjZGVmaW5lIElOU05fR1RPRAkJKDQgfCBJTlNOX01BU0tfUkVBRHxJTlNOX01BU0tfU1BFQ0lBTCkKKyNkZWZpbmUgSU5TTl9XQUlUCQkoNSB8IElOU05fTUFTS19XUklURXxJTlNOX01BU0tfU1BFQ0lBTCkKKyNkZWZpbmUgSU5TTl9JTlRUUklHCQkoNiB8IElOU05fTUFTS19XUklURXxJTlNOX01BU0tfU1BFQ0lBTCkKKworLyogdHJpZ2dlciBmbGFncyAqLworLyogVGhlc2UgZmxhZ3MgYXJlIHVzZWQgaW4gY29tZWRpX3RyaWcgc3RydWN0dXJlcyAqLworCisjZGVmaW5lIFRSSUdfQk9HVVMJMHgwMDAxCS8qIGRvIHRoZSBtb3Rpb25zICovCisjZGVmaW5lIFRSSUdfRElUSEVSCTB4MDAwMgkvKiBlbmFibGUgZGl0aGVyaW5nICovCisjZGVmaW5lIFRSSUdfREVHTElUQ0gJMHgwMDA0CS8qIGVuYWJsZSBkZWdsaXRjaGluZyAqLworLyojZGVmaW5lIFRSSUdfUlQgICAgICAgMHgwMDA4ICovCS8qIHBlcmZvcm0gb3AgaW4gcmVhbCB0aW1lICovCisjZGVmaW5lIFRSSUdfQ09ORklHCTB4MDAxMAkvKiBwZXJmb3JtIGNvbmZpZ3VyYXRpb24sIG5vdCB0cmlnZ2VyaW5nICovCisjZGVmaW5lIFRSSUdfV0FLRV9FT1MJMHgwMDIwCS8qIHdha2UgdXAgb24gZW5kLW9mLXNjYW4gZXZlbnRzICovCisvKiNkZWZpbmUgVFJJR19XUklURSAgICAweDAwNDAqLwkvKiB3cml0ZSB0byBiaWRpcmVjdGlvbmFsIGRldmljZXMgKi8KKworLyogY29tbWFuZCBmbGFncyAqLworLyogVGhlc2UgZmxhZ3MgYXJlIHVzZWQgaW4gY29tZWRpX2NtZCBzdHJ1Y3R1cmVzICovCisKKyNkZWZpbmUgQ01ERl9QUklPUklUWQkJMHgwMDAwMDAwOAkvKiB0cnkgdG8gdXNlIGEgcmVhbC10aW1lIGludGVycnVwdCB3aGlsZSBwZXJmb3JtaW5nIGNvbW1hbmQgKi8KKworI2RlZmluZSBUUklHX1JUCQlDTURGX1BSSU9SSVRZCS8qIGNvbXBhdGliaWxpdHkgZGVmaW5pdGlvbiAqLworCisjZGVmaW5lIENNREZfV1JJVEUJCTB4MDAwMDAwNDAKKyNkZWZpbmUgVFJJR19XUklURQlDTURGX1dSSVRFCS8qIGNvbXBhdGliaWxpdHkgZGVmaW5pdGlvbiAqLworCisjZGVmaW5lIENNREZfUkFXREFUQQkJMHgwMDAwMDA4MAorCisjZGVmaW5lIENPTUVESV9FVl9TVEFSVAkJMHgwMDA0MDAwMAorI2RlZmluZSBDT01FRElfRVZfU0NBTl9CRUdJTgkweDAwMDgwMDAwCisjZGVmaW5lIENPTUVESV9FVl9DT05WRVJUCTB4MDAxMDAwMDAKKyNkZWZpbmUgQ09NRURJX0VWX1NDQU5fRU5ECTB4MDAyMDAwMDAKKyNkZWZpbmUgQ09NRURJX0VWX1NUT1AJCTB4MDA0MDAwMDAKKworI2RlZmluZSBUUklHX1JPVU5EX01BU0sJCTB4MDAwMzAwMDAKKyNkZWZpbmUgVFJJR19ST1VORF9ORUFSRVNUCTB4MDAwMDAwMDAKKyNkZWZpbmUgVFJJR19ST1VORF9ET1dOCQkweDAwMDEwMDAwCisjZGVmaW5lIFRSSUdfUk9VTkRfVVAJCTB4MDAwMjAwMDAKKyNkZWZpbmUgVFJJR19ST1VORF9VUF9ORVhUCTB4MDAwMzAwMDAKKworLyogdHJpZ2dlciBzb3VyY2VzICovCisKKyNkZWZpbmUgVFJJR19BTlkJMHhmZmZmZmZmZgorI2RlZmluZSBUUklHX0lOVkFMSUQJMHgwMDAwMDAwMAorCisjZGVmaW5lIFRSSUdfTk9ORQkweDAwMDAwMDAxCS8qIG5ldmVyIHRyaWdnZXIgKi8KKyNkZWZpbmUgVFJJR19OT1cJMHgwMDAwMDAwMgkvKiB0cmlnZ2VyIG5vdyArIE4gbnMgKi8KKyNkZWZpbmUgVFJJR19GT0xMT1cJMHgwMDAwMDAwNAkvKiB0cmlnZ2VyIG9uIG5leHQgbG93ZXIgbGV2ZWwgdHJpZyAqLworI2RlZmluZSBUUklHX1RJTUUJMHgwMDAwMDAwOAkvKiB0cmlnZ2VyIGF0IHRpbWUgTiBucyAqLworI2RlZmluZSBUUklHX1RJTUVSCTB4MDAwMDAwMTAJLyogdHJpZ2dlciBhdCByYXRlIE4gbnMgKi8KKyNkZWZpbmUgVFJJR19DT1VOVAkweDAwMDAwMDIwCS8qIHRyaWdnZXIgd2hlbiBjb3VudCByZWFjaGVzIE4gKi8KKyNkZWZpbmUgVFJJR19FWFQJMHgwMDAwMDA0MAkvKiB0cmlnZ2VyIG9uIGV4dGVybmFsIHNpZ25hbCBOICovCisjZGVmaW5lIFRSSUdfSU5UCTB4MDAwMDAwODAJLyogdHJpZ2dlciBvbiBjb21lZGktaW50ZXJuYWwgc2lnbmFsIE4gKi8KKyNkZWZpbmUgVFJJR19PVEhFUgkweDAwMDAwMTAwCS8qIGRyaXZlciBkZWZpbmVkICovCisKKy8qIHN1YmRldmljZSBmbGFncyAqLworCisjZGVmaW5lIFNERl9CVVNZCTB4MDAwMQkvKiBkZXZpY2UgaXMgYnVzeSAqLworI2RlZmluZSBTREZfQlVTWV9PV05FUgkweDAwMDIJLyogZGV2aWNlIGlzIGJ1c3kgd2l0aCB5b3VyIGpvYiAqLworI2RlZmluZSBTREZfTE9DS0VECTB4MDAwNAkvKiBzdWJkZXZpY2UgaXMgbG9ja2VkICovCisjZGVmaW5lIFNERl9MT0NLX09XTkVSCTB4MDAwOAkvKiB5b3Ugb3duIGxvY2sgKi8KKyNkZWZpbmUgU0RGX01BWERBVEEJMHgwMDEwCS8qIG1heGRhdGEgZGVwZW5kcyBvbiBjaGFubmVsICovCisjZGVmaW5lIFNERl9GTEFHUwkweDAwMjAJLyogZmxhZ3MgZGVwZW5kIG9uIGNoYW5uZWwgKi8KKyNkZWZpbmUgU0RGX1JBTkdFVFlQRQkweDAwNDAJLyogcmFuZ2UgdHlwZSBkZXBlbmRzIG9uIGNoYW5uZWwgKi8KKyNkZWZpbmUgU0RGX01PREUwCTB4MDA4MAkvKiBjYW4gZG8gbW9kZSAwICovCisjZGVmaW5lIFNERl9NT0RFMQkweDAxMDAJLyogY2FuIGRvIG1vZGUgMSAqLworI2RlZmluZSBTREZfTU9ERTIJMHgwMjAwCS8qIGNhbiBkbyBtb2RlIDIgKi8KKyNkZWZpbmUgU0RGX01PREUzCTB4MDQwMAkvKiBjYW4gZG8gbW9kZSAzICovCisjZGVmaW5lIFNERl9NT0RFNAkweDA4MDAJLyogY2FuIGRvIG1vZGUgNCAqLworI2RlZmluZSBTREZfQ01ECQkweDEwMDAJLyogY2FuIGRvIGNvbW1hbmRzIChkZXByZWNhdGVkKSAqLworI2RlZmluZSBTREZfU09GVF9DQUxJQlJBVEVECTB4MjAwMAkvKiBzdWJkZXZpY2UgdXNlcyBzb2Z0d2FyZSBjYWxpYnJhdGlvbiAqLworI2RlZmluZSBTREZfQ01EX1dSSVRFCQkweDQwMDAJLyogY2FuIGRvIG91dHB1dCBjb21tYW5kcyAqLworI2RlZmluZSBTREZfQ01EX1JFQUQJCTB4ODAwMAkvKiBjYW4gZG8gaW5wdXQgY29tbWFuZHMgKi8KKworI2RlZmluZSBTREZfUkVBREFCTEUJMHgwMDAxMDAwMAkvKiBzdWJkZXZpY2UgY2FuIGJlIHJlYWQgKGUuZy4gYW5hbG9nIGlucHV0KSAqLworI2RlZmluZSBTREZfV1JJVEFCTEUJMHgwMDAyMDAwMAkvKiBzdWJkZXZpY2UgY2FuIGJlIHdyaXR0ZW4gKGUuZy4gYW5hbG9nIG91dHB1dCkgKi8KKyNkZWZpbmUgU0RGX1dSSVRFQUJMRQlTREZfV1JJVEFCTEUJLyogc3BlbGxpbmcgZXJyb3IgaW4gQVBJICovCisjZGVmaW5lIFNERl9JTlRFUk5BTAkweDAwMDQwMDAwCS8qIHN1YmRldmljZSBkb2VzIG5vdCBoYXZlIGV4dGVybmFsbHkgdmlzaWJsZSBsaW5lcyAqLworI2RlZmluZSBTREZfUlQJCTB4MDAwODAwMDAJLyogREVQUkVDQVRFRDogc3ViZGV2aWNlIGlzIFJUIGNhcGFibGUgKi8KKyNkZWZpbmUgU0RGX0dST1VORAkweDAwMTAwMDAwCS8qIGNhbiBkbyBhcmVmPWdyb3VuZCAqLworI2RlZmluZSBTREZfQ09NTU9OCTB4MDAyMDAwMDAJLyogY2FuIGRvIGFyZWY9Y29tbW9uICovCisjZGVmaW5lIFNERl9ESUZGCTB4MDA0MDAwMDAJLyogY2FuIGRvIGFyZWY9ZGlmZiAqLworI2RlZmluZSBTREZfT1RIRVIJMHgwMDgwMDAwMAkvKiBjYW4gZG8gYXJlZj1vdGhlciAqLworI2RlZmluZSBTREZfRElUSEVSCTB4MDEwMDAwMDAJLyogY2FuIGRvIGRpdGhlcmluZyAqLworI2RlZmluZSBTREZfREVHTElUQ0gJMHgwMjAwMDAwMAkvKiBjYW4gZG8gZGVnbGl0Y2hpbmcgKi8KKyNkZWZpbmUgU0RGX01NQVAJMHgwNDAwMDAwMAkvKiBjYW4gZG8gbW1hcCgpICovCisjZGVmaW5lIFNERl9SVU5OSU5HCTB4MDgwMDAwMDAJLyogc3ViZGV2aWNlIGlzIGFjcXVpcmluZyBkYXRhICovCisjZGVmaW5lIFNERl9MU0FNUEwJMHgxMDAwMDAwMAkvKiBzdWJkZXZpY2UgdXNlcyAzMi1iaXQgc2FtcGxlcyAqLworI2RlZmluZSBTREZfUEFDS0VECTB4MjAwMDAwMDAJLyogc3ViZGV2aWNlIGNhbiBkbyBwYWNrZWQgRElPICovCisvKiByZSByZWN5bGUgdGhlc2UgZmxhZ3MgZm9yIFBXTSAqLworI2RlZmluZSBTREZfUFdNX0NPVU5URVIgU0RGX01PREUwICAgICAgIC8qIFBXTSBjYW4gYXV0b21hdGljYWxseSBzd2l0Y2ggb2ZmICovCisjZGVmaW5lIFNERl9QV01fSEJSSURHRSBTREZfTU9ERTEgICAgICAgLyogUFdNIGlzIHNpZ25lZCAoSC1icmlkZ2UpICovCisKKworCisvKiBzdWJkZXZpY2UgdHlwZXMgKi8KKworZW51bSBjb21lZGlfc3ViZGV2aWNlX3R5cGUgeworCUNPTUVESV9TVUJEX1VOVVNFRCwJLyogdW51c2VkIGJ5IGRyaXZlciAqLworCUNPTUVESV9TVUJEX0FJLAkvKiBhbmFsb2cgaW5wdXQgKi8KKwlDT01FRElfU1VCRF9BTywJLyogYW5hbG9nIG91dHB1dCAqLworCUNPTUVESV9TVUJEX0RJLAkvKiBkaWdpdGFsIGlucHV0ICovCisJQ09NRURJX1NVQkRfRE8sCS8qIGRpZ2l0YWwgb3V0cHV0ICovCisJQ09NRURJX1NVQkRfRElPLAkvKiBkaWdpdGFsIGlucHV0L291dHB1dCAqLworCUNPTUVESV9TVUJEX0NPVU5URVIsCS8qIGNvdW50ZXIgKi8KKwlDT01FRElfU1VCRF9USU1FUiwJLyogdGltZXIgKi8KKwlDT01FRElfU1VCRF9NRU1PUlksCS8qIG1lbW9yeSwgRUVQUk9NLCBEUFJBTSAqLworCUNPTUVESV9TVUJEX0NBTElCLAkvKiBjYWxpYnJhdGlvbiBEQUNzICovCisJQ09NRURJX1NVQkRfUFJPQywJLyogcHJvY2Vzc29yLCBEU1AgKi8KKwlDT01FRElfU1VCRF9TRVJJQUwsCS8qIHNlcmlhbCBJTyAqLworCUNPTUVESV9TVUJEX1BXTSAgICAgICAgIC8qIFBXTSAqLworfTsKKworLyogY29uZmlndXJhdGlvbiBpbnN0cnVjdGlvbnMgKi8KKworZW51bSBjb25maWd1cmF0aW9uX2lkcyB7CisJSU5TTl9DT05GSUdfRElPX0lOUFVUID0gMCwKKwlJTlNOX0NPTkZJR19ESU9fT1VUUFVUID0gMSwKKwlJTlNOX0NPTkZJR19ESU9fT1BFTkRSQUlOID0gMiwKKwlJTlNOX0NPTkZJR19BTkFMT0dfVFJJRyA9IDE2LAorLyoJSU5TTl9DT05GSUdfV0FWRUZPUk0gPSAxNywgKi8KKy8qCUlOU05fQ09ORklHX1RSSUcgPSAxOCwgKi8KKy8qCUlOU05fQ09ORklHX0NPVU5URVIgPSAxOSwgKi8KKwlJTlNOX0NPTkZJR19BTFRfU09VUkNFID0gMjAsCisJSU5TTl9DT05GSUdfRElHSVRBTF9UUklHID0gMjEsCisJSU5TTl9DT05GSUdfQkxPQ0tfU0laRSA9IDIyLAorCUlOU05fQ09ORklHX1RJTUVSXzEgPSAyMywKKwlJTlNOX0NPTkZJR19GSUxURVIgPSAyNCwKKwlJTlNOX0NPTkZJR19DSEFOR0VfTk9USUZZID0gMjUsCisKKwkgLypBTFBIQSovIElOU05fQ09ORklHX1NFUklBTF9DTE9DSyA9IDI2LAorCUlOU05fQ09ORklHX0JJRElSRUNUSU9OQUxfREFUQSA9IDI3LAorCUlOU05fQ09ORklHX0RJT19RVUVSWSA9IDI4LAorCUlOU05fQ09ORklHX1BXTV9PVVRQVVQgPSAyOSwKKwlJTlNOX0NPTkZJR19HRVRfUFdNX09VVFBVVCA9IDMwLAorCUlOU05fQ09ORklHX0FSTSA9IDMxLAorCUlOU05fQ09ORklHX0RJU0FSTSA9IDMyLAorCUlOU05fQ09ORklHX0dFVF9DT1VOVEVSX1NUQVRVUyA9IDMzLAorCUlOU05fQ09ORklHX1JFU0VUID0gMzQsCisJSU5TTl9DT05GSUdfR1BDVF9TSU5HTEVfUFVMU0VfR0VORVJBVE9SID0gMTAwMSwJLyogVXNlIENUUiBhcyBzaW5nbGUgcHVsc2VnZW5lcmF0b3IgKi8KKwlJTlNOX0NPTkZJR19HUENUX1BVTFNFX1RSQUlOX0dFTkVSQVRPUiA9IDEwMDIsCS8qIFVzZSBDVFIgYXMgcHVsc2V0cmFpbmdlbmVyYXRvciAqLworCUlOU05fQ09ORklHX0dQQ1RfUVVBRFJBVFVSRV9FTkNPREVSID0gMTAwMywJLyogVXNlIHRoZSBjb3VudGVyIGFzIGVuY29kZXIgKi8KKwlJTlNOX0NPTkZJR19TRVRfR0FURV9TUkMgPSAyMDAxLAkvKiBTZXQgZ2F0ZSBzb3VyY2UgKi8KKwlJTlNOX0NPTkZJR19HRVRfR0FURV9TUkMgPSAyMDAyLAkvKiBHZXQgZ2F0ZSBzb3VyY2UgKi8KKwlJTlNOX0NPTkZJR19TRVRfQ0xPQ0tfU1JDID0gMjAwMywJLyogU2V0IG1hc3RlciBjbG9jayBzb3VyY2UgKi8KKwlJTlNOX0NPTkZJR19HRVRfQ0xPQ0tfU1JDID0gMjAwNCwJLyogR2V0IG1hc3RlciBjbG9jayBzb3VyY2UgKi8KKwlJTlNOX0NPTkZJR19TRVRfT1RIRVJfU1JDID0gMjAwNSwJLyogU2V0IG90aGVyIHNvdXJjZSAqLworLyoJSU5TTl9DT05GSUdfR0VUX09USEVSX1NSQyA9IDIwMDYsKi8JLyogR2V0IG90aGVyIHNvdXJjZSAqLworCUlOU05fQ09ORklHX0dFVF9IQVJEV0FSRV9CVUZGRVJfU0laRSwJLyogR2V0IHNpemUgaW4gYnl0ZXMgb2YKKwkJCQkJCSAgc3ViZGV2aWNlJ3Mgb24tYm9hcmQgZmlmb3MKKwkJCQkJCSAgdXNlZCBkdXJpbmcgc3RyZWFtaW5nCisJCQkJCQkgIGlucHV0L291dHB1dCAqLworCUlOU05fQ09ORklHX1NFVF9DT1VOVEVSX01PREUgPSA0MDk3LAorCUlOU05fQ09ORklHXzgyNTRfU0VUX01PREUgPSBJTlNOX0NPTkZJR19TRVRfQ09VTlRFUl9NT0RFLAkvKiBkZXByZWNhdGVkICovCisJSU5TTl9DT05GSUdfODI1NF9SRUFEX1NUQVRVUyA9IDQwOTgsCisJSU5TTl9DT05GSUdfU0VUX1JPVVRJTkcgPSA0MDk5LAorCUlOU05fQ09ORklHX0dFVF9ST1VUSU5HID0gNDEwOSwKKy8qIFBXTSAqLworCUlOU05fQ09ORklHX1BXTV9TRVRfUEVSSU9EID0gNTAwMCwgICAvKiBzZXRzIGZyZXF1ZW5jeSAqLworCUlOU05fQ09ORklHX1BXTV9HRVRfUEVSSU9EID0gNTAwMSwgICAvKiBnZXRzIGZyZXF1ZW5jeSAqLworCUlOU05fQ09ORklHX0dFVF9QV01fU1RBVFVTID0gNTAwMiwgICAgICAgICAgLyogaXMgaXQgcnVubmluZz8gKi8KKwlJTlNOX0NPTkZJR19QV01fU0VUX0hfQlJJREdFID0gNTAwMywgLyogc2V0cyBIIGJyaWRnZTogZHV0eSBjeWNsZSBhbmQgc2lnbiBiaXQgZm9yIGEgcmVsYXkgIGF0IHRoZSBzYW1lIHRpbWUqLworCUlOU05fQ09ORklHX1BXTV9HRVRfSF9CUklER0UgPSA1MDA0ICAvKiBnZXRzIEggYnJpZGdlIGRhdGE6IGR1dHkgY3ljbGUgYW5kIHRoZSBzaWduIGJpdCAqLworfTsKKworZW51bSBjb21lZGlfaW9fZGlyZWN0aW9uIHsKKwlDT01FRElfSU5QVVQgPSAwLAorCUNPTUVESV9PVVRQVVQgPSAxLAorCUNPTUVESV9PUEVORFJBSU4gPSAyCit9OworCitlbnVtIGNvbWVkaV9zdXBwb3J0X2xldmVsIHsKKwlDT01FRElfVU5LTk9XTl9TVVBQT1JUID0gMCwKKwlDT01FRElfU1VQUE9SVEVELAorCUNPTUVESV9VTlNVUFBPUlRFRAorfTsKKworLyogaW9jdGxzICovCisKKyNkZWZpbmUgQ0lPICdkJworI2RlZmluZSBDT01FRElfREVWQ09ORklHIF9JT1coQ0lPLCAwLCBjb21lZGlfZGV2Y29uZmlnKQorI2RlZmluZSBDT01FRElfREVWSU5GTyBfSU9SKENJTywgMSwgY29tZWRpX2RldmluZm8pCisjZGVmaW5lIENPTUVESV9TVUJESU5GTyBfSU9SKENJTywgMiwgY29tZWRpX3N1YmRpbmZvKQorI2RlZmluZSBDT01FRElfQ0hBTklORk8gX0lPUihDSU8sIDMsIGNvbWVkaV9jaGFuaW5mbykKKyNkZWZpbmUgQ09NRURJX1RSSUcgX0lPV1IoQ0lPLCA0LCBjb21lZGlfdHJpZykKKyNkZWZpbmUgQ09NRURJX0xPQ0sgX0lPKENJTywgNSkKKyNkZWZpbmUgQ09NRURJX1VOTE9DSyBfSU8oQ0lPLCA2KQorI2RlZmluZSBDT01FRElfQ0FOQ0VMIF9JTyhDSU8sIDcpCisjZGVmaW5lIENPTUVESV9SQU5HRUlORk8gX0lPUihDSU8sIDgsIGNvbWVkaV9yYW5nZWluZm8pCisjZGVmaW5lIENPTUVESV9DTUQgX0lPUihDSU8sIDksIGNvbWVkaV9jbWQpCisjZGVmaW5lIENPTUVESV9DTURURVNUIF9JT1IoQ0lPLCAxMCwgY29tZWRpX2NtZCkKKyNkZWZpbmUgQ09NRURJX0lOU05MSVNUIF9JT1IoQ0lPLCAxMSwgY29tZWRpX2luc25saXN0KQorI2RlZmluZSBDT01FRElfSU5TTiBfSU9SKENJTywgMTIsIGNvbWVkaV9pbnNuKQorI2RlZmluZSBDT01FRElfQlVGQ09ORklHIF9JT1IoQ0lPLCAxMywgY29tZWRpX2J1ZmNvbmZpZykKKyNkZWZpbmUgQ09NRURJX0JVRklORk8gX0lPV1IoQ0lPLCAxNCwgY29tZWRpX2J1ZmluZm8pCisjZGVmaW5lIENPTUVESV9QT0xMIF9JTyhDSU8sIDE1KQorCisvKiBzdHJ1Y3R1cmVzICovCisKK3R5cGVkZWYgc3RydWN0IGNvbWVkaV90cmlnX3N0cnVjdCBjb21lZGlfdHJpZzsKK3R5cGVkZWYgc3RydWN0IGNvbWVkaV9jbWRfc3RydWN0IGNvbWVkaV9jbWQ7Cit0eXBlZGVmIHN0cnVjdCBjb21lZGlfaW5zbl9zdHJ1Y3QgY29tZWRpX2luc247Cit0eXBlZGVmIHN0cnVjdCBjb21lZGlfaW5zbmxpc3Rfc3RydWN0IGNvbWVkaV9pbnNubGlzdDsKK3R5cGVkZWYgc3RydWN0IGNvbWVkaV9jaGFuaW5mb19zdHJ1Y3QgY29tZWRpX2NoYW5pbmZvOwordHlwZWRlZiBzdHJ1Y3QgY29tZWRpX3N1YmRpbmZvX3N0cnVjdCBjb21lZGlfc3ViZGluZm87Cit0eXBlZGVmIHN0cnVjdCBjb21lZGlfZGV2aW5mb19zdHJ1Y3QgY29tZWRpX2RldmluZm87Cit0eXBlZGVmIHN0cnVjdCBjb21lZGlfZGV2Y29uZmlnX3N0cnVjdCBjb21lZGlfZGV2Y29uZmlnOwordHlwZWRlZiBzdHJ1Y3QgY29tZWRpX3JhbmdlaW5mb19zdHJ1Y3QgY29tZWRpX3JhbmdlaW5mbzsKK3R5cGVkZWYgc3RydWN0IGNvbWVkaV9rcmFuZ2Vfc3RydWN0IGNvbWVkaV9rcmFuZ2U7Cit0eXBlZGVmIHN0cnVjdCBjb21lZGlfYnVmY29uZmlnX3N0cnVjdCBjb21lZGlfYnVmY29uZmlnOwordHlwZWRlZiBzdHJ1Y3QgY29tZWRpX2J1ZmluZm9fc3RydWN0IGNvbWVkaV9idWZpbmZvOworCitzdHJ1Y3QgY29tZWRpX3RyaWdfc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgc3ViZGV2OwkvKiBzdWJkZXZpY2UgKi8KKwl1bnNpZ25lZCBpbnQgbW9kZTsJLyogbW9kZSAqLworCXVuc2lnbmVkIGludCBmbGFnczsKKwl1bnNpZ25lZCBpbnQgbl9jaGFuOwkvKiBudW1iZXIgb2YgY2hhbm5lbHMgKi8KKwl1bnNpZ25lZCBpbnQgKmNoYW5saXN0OwkvKiBjaGFubmVsL3JhbmdlIGxpc3QgKi8KKwlzYW1wbF90ICpkYXRhOwkvKiBkYXRhIGxpc3QsIHNpemUgZGVwZW5kcyBvbiBzdWJkIGZsYWdzICovCisJdW5zaWduZWQgaW50IG47CS8qIG51bWJlciBvZiBzY2FucyAqLworCXVuc2lnbmVkIGludCB0cmlnc3JjOworCXVuc2lnbmVkIGludCB0cmlndmFyOworCXVuc2lnbmVkIGludCB0cmlndmFyMTsKKwl1bnNpZ25lZCBpbnQgZGF0YV9sZW47CisJdW5zaWduZWQgaW50IHVudXNlZFszXTsKK307CisKK3N0cnVjdCBjb21lZGlfaW5zbl9zdHJ1Y3QgeworCXVuc2lnbmVkIGludCBpbnNuOworCXVuc2lnbmVkIGludCBuOworCWxzYW1wbF90ICpkYXRhOworCXVuc2lnbmVkIGludCBzdWJkZXY7CisJdW5zaWduZWQgaW50IGNoYW5zcGVjOworCXVuc2lnbmVkIGludCB1bnVzZWRbM107Cit9OworCitzdHJ1Y3QgY29tZWRpX2luc25saXN0X3N0cnVjdCB7CisJdW5zaWduZWQgaW50IG5faW5zbnM7CisJY29tZWRpX2luc24gKmluc25zOworfTsKKworc3RydWN0IGNvbWVkaV9jbWRfc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgc3ViZGV2OworCXVuc2lnbmVkIGludCBmbGFnczsKKworCXVuc2lnbmVkIGludCBzdGFydF9zcmM7CisJdW5zaWduZWQgaW50IHN0YXJ0X2FyZzsKKworCXVuc2lnbmVkIGludCBzY2FuX2JlZ2luX3NyYzsKKwl1bnNpZ25lZCBpbnQgc2Nhbl9iZWdpbl9hcmc7CisKKwl1bnNpZ25lZCBpbnQgY29udmVydF9zcmM7CisJdW5zaWduZWQgaW50IGNvbnZlcnRfYXJnOworCisJdW5zaWduZWQgaW50IHNjYW5fZW5kX3NyYzsKKwl1bnNpZ25lZCBpbnQgc2Nhbl9lbmRfYXJnOworCisJdW5zaWduZWQgaW50IHN0b3Bfc3JjOworCXVuc2lnbmVkIGludCBzdG9wX2FyZzsKKworCXVuc2lnbmVkIGludCAqY2hhbmxpc3Q7CS8qIGNoYW5uZWwvcmFuZ2UgbGlzdCAqLworCXVuc2lnbmVkIGludCBjaGFubGlzdF9sZW47CisKKwlzYW1wbF90ICpkYXRhOwkvKiBkYXRhIGxpc3QsIHNpemUgZGVwZW5kcyBvbiBzdWJkIGZsYWdzICovCisJdW5zaWduZWQgaW50IGRhdGFfbGVuOworfTsKKworc3RydWN0IGNvbWVkaV9jaGFuaW5mb19zdHJ1Y3QgeworCXVuc2lnbmVkIGludCBzdWJkZXY7CisJbHNhbXBsX3QgKm1heGRhdGFfbGlzdDsKKwl1bnNpZ25lZCBpbnQgKmZsYWdsaXN0OworCXVuc2lnbmVkIGludCAqcmFuZ2VsaXN0OworCXVuc2lnbmVkIGludCB1bnVzZWRbNF07Cit9OworCitzdHJ1Y3QgY29tZWRpX3JhbmdlaW5mb19zdHJ1Y3QgeworCXVuc2lnbmVkIGludCByYW5nZV90eXBlOworCXZvaWQgKnJhbmdlX3B0cjsKK307CisKK3N0cnVjdCBjb21lZGlfa3JhbmdlX3N0cnVjdCB7CisJaW50IG1pbjsJLyogZml4ZWQgcG9pbnQsIG11bHRpcGx5IGJ5IDFlLTYgKi8KKwlpbnQgbWF4OwkvKiBmaXhlZCBwb2ludCwgbXVsdGlwbHkgYnkgMWUtNiAqLworCXVuc2lnbmVkIGludCBmbGFnczsKK307CisKKworc3RydWN0IGNvbWVkaV9zdWJkaW5mb19zdHJ1Y3QgeworCXVuc2lnbmVkIGludCB0eXBlOworCXVuc2lnbmVkIGludCBuX2NoYW47CisJdW5zaWduZWQgaW50IHN1YmRfZmxhZ3M7CisJdW5zaWduZWQgaW50IHRpbWVyX3R5cGU7CisJdW5zaWduZWQgaW50IGxlbl9jaGFubGlzdDsKKwlsc2FtcGxfdCBtYXhkYXRhOworCXVuc2lnbmVkIGludCBmbGFnczsJLyogY2hhbm5lbCBmbGFncyAqLworCXVuc2lnbmVkIGludCByYW5nZV90eXBlOwkvKiBsb29rdXAgaW4ga2VybmVsICovCisJdW5zaWduZWQgaW50IHNldHRsaW5nX3RpbWVfMDsKKwl1bnNpZ25lZCBpbnNuX2JpdHNfc3VwcG9ydDsJLyogc2VlIHN1cHBvcnRfbGV2ZWwgZW51bSBmb3IgdmFsdWVzKi8KKwl1bnNpZ25lZCBpbnQgdW51c2VkWzhdOworfTsKKworc3RydWN0IGNvbWVkaV9kZXZpbmZvX3N0cnVjdCB7CisJdW5zaWduZWQgaW50IHZlcnNpb25fY29kZTsKKwl1bnNpZ25lZCBpbnQgbl9zdWJkZXZzOworCWNoYXIgZHJpdmVyX25hbWVbQ09NRURJX05BTUVMRU5dOworCWNoYXIgYm9hcmRfbmFtZVtDT01FRElfTkFNRUxFTl07CisJaW50IHJlYWRfc3ViZGV2aWNlOworCWludCB3cml0ZV9zdWJkZXZpY2U7CisJaW50IHVudXNlZFszMF07Cit9OworCitzdHJ1Y3QgY29tZWRpX2RldmNvbmZpZ19zdHJ1Y3QgeworCWNoYXIgYm9hcmRfbmFtZVtDT01FRElfTkFNRUxFTl07CisJaW50IG9wdGlvbnNbQ09NRURJX05ERVZDT05GT1BUU107Cit9OworCitzdHJ1Y3QgY29tZWRpX2J1ZmNvbmZpZ19zdHJ1Y3QgeworCXVuc2lnbmVkIGludCBzdWJkZXZpY2U7CisJdW5zaWduZWQgaW50IGZsYWdzOworCisJdW5zaWduZWQgaW50IG1heGltdW1fc2l6ZTsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKworCXVuc2lnbmVkIGludCB1bnVzZWRbNF07Cit9OworCitzdHJ1Y3QgY29tZWRpX2J1ZmluZm9fc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgc3ViZGV2aWNlOworCXVuc2lnbmVkIGludCBieXRlc19yZWFkOworCisJdW5zaWduZWQgaW50IGJ1Zl93cml0ZV9wdHI7CisJdW5zaWduZWQgaW50IGJ1Zl9yZWFkX3B0cjsKKwl1bnNpZ25lZCBpbnQgYnVmX3dyaXRlX2NvdW50OworCXVuc2lnbmVkIGludCBidWZfcmVhZF9jb3VudDsKKworCXVuc2lnbmVkIGludCBieXRlc193cml0dGVuOworCisJdW5zaWduZWQgaW50IHVudXNlZFs0XTsKK307CisKKy8qIHJhbmdlIHN0dWZmICovCisKKyNkZWZpbmUgX19SQU5HRShhLCBiKQkoKCgoYSkmMHhmZmZmKTw8MTYpfCgoYikmMHhmZmZmKSkKKworI2RlZmluZSBSQU5HRV9PRkZTRVQoYSkJCSgoKGEpPj4xNikmMHhmZmZmKQorI2RlZmluZSBSQU5HRV9MRU5HVEgoYikJCSgoYikmMHhmZmZmKQorCisjZGVmaW5lIFJGX1VOSVQoZmxhZ3MpCQkoKGZsYWdzKSYweGZmKQorI2RlZmluZSBSRl9FWFRFUk5BTAkJKDE8PDgpCisKKyNkZWZpbmUgVU5JVF92b2x0CQkwCisjZGVmaW5lIFVOSVRfbUEJCQkxCisjZGVmaW5lIFVOSVRfbm9uZQkJMgorCisjZGVmaW5lIENPTUVESV9NSU5fU1BFRUQJKCh1bnNpZ25lZCBpbnQpMHhmZmZmZmZmZikKKworLyogY2FsbGJhY2sgc3R1ZmYgKi8KKy8qIG9ubHkgcmVsZXZhbnQgdG8ga2VybmVsIG1vZHVsZXMuICovCisKKyNkZWZpbmUgQ09NRURJX0NCX0VPUwkJMQkvKiBlbmQgb2Ygc2NhbiAqLworI2RlZmluZSBDT01FRElfQ0JfRU9BCQkyCS8qIGVuZCBvZiBhY3F1aXNpdGlvbiAqLworI2RlZmluZSBDT01FRElfQ0JfQkxPQ0sJCTQJLyogREVQUkVDQVRFRDogY29udmVuaWVudCBibG9jayBzaXplICovCisjZGVmaW5lIENPTUVESV9DQl9FT0JVRgkJOAkvKiBERVBSRUNBVEVEOiBlbmQgb2YgYnVmZmVyICovCisjZGVmaW5lIENPTUVESV9DQl9FUlJPUgkJMTYJLyogY2FyZCBlcnJvciBkdXJpbmcgYWNxdWlzaXRpb24gKi8KKyNkZWZpbmUgQ09NRURJX0NCX09WRVJGTE9XCTMyCS8qIGJ1ZmZlciBvdmVyZmxvdy91bmRlcmZsb3cgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBldmVyeXRoaW5nIGFmdGVyIHRoaXMgbGluZSBpcyBBTFBIQSAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgIDgyNTQgc3BlY2lmaWMgY29uZmlndXJhdGlvbi4KKworICBJdCBzdXBwb3J0cyB0d28gY29uZmlnIGNvbW1hbmRzOgorCisgIDAgSUQ6IElOU05fQ09ORklHX1NFVF9DT1VOVEVSX01PREUKKyAgMSA4MjU0IE1vZGUKKyAgICBJODI1NF9NT0RFMCwgSTgyNTRfTU9ERTEsIC4uLiwgSTgyNTRfTU9ERTUKKyAgICBPUidlZCB3aXRoOgorICAgIEk4MjU0X0JDRCwgSTgyNTRfQklOQVJZCisKKyAgMCBJRDogSU5TTl9DT05GSUdfODI1NF9SRUFEX1NUQVRVUworICAxIDwtLSBTdGF0dXMgYnl0ZSByZXR1cm5lZCBoZXJlLgorICAgIEI3ID0gT3V0cHV0CisgICAgQjYgPSBOVUxMIENvdW50CisgICAgQjUgLSBCMCBDdXJyZW50IG1vZGUuCisKKyovCisKK2VudW0gaTgyNTRfbW9kZSB7CisJSTgyNTRfTU9ERTAgPSAoMCA8PCAxKSwJLyogSW50ZXJydXB0IG9uIHRlcm1pbmFsIGNvdW50ICovCisJSTgyNTRfTU9ERTEgPSAoMSA8PCAxKSwJLyogSGFyZHdhcmUgcmV0cmlnZ2VyYWJsZSBvbmUtc2hvdCAqLworCUk4MjU0X01PREUyID0gKDIgPDwgMSksCS8qIFJhdGUgZ2VuZXJhdG9yICovCisJSTgyNTRfTU9ERTMgPSAoMyA8PCAxKSwJLyogU3F1YXJlIHdhdmUgbW9kZSAqLworCUk4MjU0X01PREU0ID0gKDQgPDwgMSksCS8qIFNvZnR3YXJlIHRyaWdnZXJlZCBzdHJvYmUgKi8KKwlJODI1NF9NT0RFNSA9ICg1IDw8IDEpLAkvKiBIYXJkd2FyZSB0cmlnZ2VyZWQgc3Ryb2JlIChyZXRyaWdnZXJhYmxlKSAqLworCUk4MjU0X0JDRCA9IDEsCS8qIHVzZSBiaW5hcnktY29kZWQgZGVjaW1hbCBpbnN0ZWFkIG9mIGJpbmFyeSAocHJldHR5IHVzZWxlc3MpICovCisJSTgyNTRfQklOQVJZID0gMAorfTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBOSV9VU1VBTF9QRklfU0VMRUNUKHVuc2lnbmVkIHBmaV9jaGFubmVsKQoreworCWlmIChwZmlfY2hhbm5lbCA8IDEwKQorCQlyZXR1cm4gMHgxICsgcGZpX2NoYW5uZWw7CisJZWxzZQorCQlyZXR1cm4gMHhiICsgcGZpX2NoYW5uZWw7Cit9CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIE5JX1VTVUFMX1JUU0lfU0VMRUNUKHVuc2lnbmVkIHJ0c2lfY2hhbm5lbCkKK3sKKwlpZiAocnRzaV9jaGFubmVsIDwgNykKKwkJcmV0dXJuIDB4YiArIHJ0c2lfY2hhbm5lbDsKKwllbHNlCisJCXJldHVybiAweDFiOworfQorLyogbW9kZSBiaXRzIGZvciBOSSBnZW5lcmFsLXB1cnBvc2UgY291bnRlcnMsIHNldCB3aXRoCisgKiBJTlNOX0NPTkZJR19TRVRfQ09VTlRFUl9NT0RFICovCisjZGVmaW5lIE5JX0dQQ1RfQ09VTlRJTkdfTU9ERV9TSElGVCAxNgorI2RlZmluZSBOSV9HUENUX0lOREVYX1BIQVNFX0JJVFNISUZUIDIwCisjZGVmaW5lIE5JX0dQQ1RfQ09VTlRJTkdfRElSRUNUSU9OX1NISUZUIDI0CitlbnVtIG5pX2dwY3RfbW9kZV9iaXRzIHsKKwlOSV9HUENUX0dBVEVfT05fQk9USF9FREdFU19CSVQgPSAweDQsCisJTklfR1BDVF9FREdFX0dBVEVfTU9ERV9NQVNLID0gMHgxOCwKKwlOSV9HUENUX0VER0VfR0FURV9TVEFSVFNfU1RPUFNfQklUUyA9IDB4MCwKKwlOSV9HUENUX0VER0VfR0FURV9TVE9QU19TVEFSVFNfQklUUyA9IDB4OCwKKwlOSV9HUENUX0VER0VfR0FURV9TVEFSVFNfQklUUyA9IDB4MTAsCisJTklfR1BDVF9FREdFX0dBVEVfTk9fU1RBUlRTX05PX1NUT1BTX0JJVFMgPSAweDE4LAorCU5JX0dQQ1RfU1RPUF9NT0RFX01BU0sgPSAweDYwLAorCU5JX0dQQ1RfU1RPUF9PTl9HQVRFX0JJVFMgPSAweDAwLAorCU5JX0dQQ1RfU1RPUF9PTl9HQVRFX09SX1RDX0JJVFMgPSAweDIwLAorCU5JX0dQQ1RfU1RPUF9PTl9HQVRFX09SX1NFQ09ORF9UQ19CSVRTID0gMHg0MCwKKwlOSV9HUENUX0xPQURfQl9TRUxFQ1RfQklUID0gMHg4MCwKKwlOSV9HUENUX09VVFBVVF9NT0RFX01BU0sgPSAweDMwMCwKKwlOSV9HUENUX09VVFBVVF9UQ19QVUxTRV9CSVRTID0gMHgxMDAsCisJTklfR1BDVF9PVVRQVVRfVENfVE9HR0xFX0JJVFMgPSAweDIwMCwKKwlOSV9HUENUX09VVFBVVF9UQ19PUl9HQVRFX1RPR0dMRV9CSVRTID0gMHgzMDAsCisJTklfR1BDVF9IQVJEV0FSRV9ESVNBUk1fTUFTSyA9IDB4YzAwLAorCU5JX0dQQ1RfTk9fSEFSRFdBUkVfRElTQVJNX0JJVFMgPSAweDAwMCwKKwlOSV9HUENUX0RJU0FSTV9BVF9UQ19CSVRTID0gMHg0MDAsCisJTklfR1BDVF9ESVNBUk1fQVRfR0FURV9CSVRTID0gMHg4MDAsCisJTklfR1BDVF9ESVNBUk1fQVRfVENfT1JfR0FURV9CSVRTID0gMHhjMDAsCisJTklfR1BDVF9MT0FESU5HX09OX1RDX0JJVCA9IDB4MTAwMCwKKwlOSV9HUENUX0xPQURJTkdfT05fR0FURV9CSVQgPSAweDQwMDAsCisJTklfR1BDVF9DT1VOVElOR19NT0RFX01BU0sgPSAweDcgPDwgTklfR1BDVF9DT1VOVElOR19NT0RFX1NISUZULAorCU5JX0dQQ1RfQ09VTlRJTkdfTU9ERV9OT1JNQUxfQklUUyA9CisJCTB4MCA8PCBOSV9HUENUX0NPVU5USU5HX01PREVfU0hJRlQsCisJTklfR1BDVF9DT1VOVElOR19NT0RFX1FVQURSQVRVUkVfWDFfQklUUyA9CisJCTB4MSA8PCBOSV9HUENUX0NPVU5USU5HX01PREVfU0hJRlQsCisJTklfR1BDVF9DT1VOVElOR19NT0RFX1FVQURSQVRVUkVfWDJfQklUUyA9CisJCTB4MiA8PCBOSV9HUENUX0NPVU5USU5HX01PREVfU0hJRlQsCisJTklfR1BDVF9DT1VOVElOR19NT0RFX1FVQURSQVRVUkVfWDRfQklUUyA9CisJCTB4MyA8PCBOSV9HUENUX0NPVU5USU5HX01PREVfU0hJRlQsCisJTklfR1BDVF9DT1VOVElOR19NT0RFX1RXT19QVUxTRV9CSVRTID0KKwkJMHg0IDw8IE5JX0dQQ1RfQ09VTlRJTkdfTU9ERV9TSElGVCwKKwlOSV9HUENUX0NPVU5USU5HX01PREVfU1lOQ19TT1VSQ0VfQklUUyA9CisJCTB4NiA8PCBOSV9HUENUX0NPVU5USU5HX01PREVfU0hJRlQsCisJTklfR1BDVF9JTkRFWF9QSEFTRV9NQVNLID0gMHgzIDw8IE5JX0dQQ1RfSU5ERVhfUEhBU0VfQklUU0hJRlQsCisJTklfR1BDVF9JTkRFWF9QSEFTRV9MT1dfQV9MT1dfQl9CSVRTID0KKwkJMHgwIDw8IE5JX0dQQ1RfSU5ERVhfUEhBU0VfQklUU0hJRlQsCisJTklfR1BDVF9JTkRFWF9QSEFTRV9MT1dfQV9ISUdIX0JfQklUUyA9CisJCTB4MSA8PCBOSV9HUENUX0lOREVYX1BIQVNFX0JJVFNISUZULAorCU5JX0dQQ1RfSU5ERVhfUEhBU0VfSElHSF9BX0xPV19CX0JJVFMgPQorCQkweDIgPDwgTklfR1BDVF9JTkRFWF9QSEFTRV9CSVRTSElGVCwKKwlOSV9HUENUX0lOREVYX1BIQVNFX0hJR0hfQV9ISUdIX0JfQklUUyA9CisJCTB4MyA8PCBOSV9HUENUX0lOREVYX1BIQVNFX0JJVFNISUZULAorCU5JX0dQQ1RfSU5ERVhfRU5BQkxFX0JJVCA9IDB4NDAwMDAwLAorCU5JX0dQQ1RfQ09VTlRJTkdfRElSRUNUSU9OX01BU0sgPQorCQkweDMgPDwgTklfR1BDVF9DT1VOVElOR19ESVJFQ1RJT05fU0hJRlQsCisJTklfR1BDVF9DT1VOVElOR19ESVJFQ1RJT05fRE9XTl9CSVRTID0KKwkJMHgwMCA8PCBOSV9HUENUX0NPVU5USU5HX0RJUkVDVElPTl9TSElGVCwKKwlOSV9HUENUX0NPVU5USU5HX0RJUkVDVElPTl9VUF9CSVRTID0KKwkJMHgxIDw8IE5JX0dQQ1RfQ09VTlRJTkdfRElSRUNUSU9OX1NISUZULAorCU5JX0dQQ1RfQ09VTlRJTkdfRElSRUNUSU9OX0hXX1VQX0RPV05fQklUUyA9CisJCTB4MiA8PCBOSV9HUENUX0NPVU5USU5HX0RJUkVDVElPTl9TSElGVCwKKwlOSV9HUENUX0NPVU5USU5HX0RJUkVDVElPTl9IV19HQVRFX0JJVFMgPQorCQkweDMgPDwgTklfR1BDVF9DT1VOVElOR19ESVJFQ1RJT05fU0hJRlQsCisJTklfR1BDVF9SRUxPQURfU09VUkNFX01BU0sgPSAweGMwMDAwMDAsCisJTklfR1BDVF9SRUxPQURfU09VUkNFX0ZJWEVEX0JJVFMgPSAweDAsCisJTklfR1BDVF9SRUxPQURfU09VUkNFX1NXSVRDSElOR19CSVRTID0gMHg0MDAwMDAwLAorCU5JX0dQQ1RfUkVMT0FEX1NPVVJDRV9HQVRFX1NFTEVDVF9CSVRTID0gMHg4MDAwMDAwLAorCU5JX0dQQ1RfT1JfR0FURV9CSVQgPSAweDEwMDAwMDAwLAorCU5JX0dQQ1RfSU5WRVJUX09VVFBVVF9CSVQgPSAweDIwMDAwMDAwCit9OworCisvKiBCaXRzIGZvciBzZXR0aW5nIGEgY2xvY2sgc291cmNlIHdpdGgKKyAqIElOU05fQ09ORklHX1NFVF9DTE9DS19TUkMgd2hlbiB1c2luZyBOSSBnZW5lcmFsLXB1cnBvc2UgY291bnRlcnMuICovCitlbnVtIG5pX2dwY3RfY2xvY2tfc291cmNlX2JpdHMgeworCU5JX0dQQ1RfQ0xPQ0tfU1JDX1NFTEVDVF9NQVNLID0gMHgzZiwKKwlOSV9HUENUX1RJTUVCQVNFXzFfQ0xPQ0tfU1JDX0JJVFMgPSAweDAsCisJTklfR1BDVF9USU1FQkFTRV8yX0NMT0NLX1NSQ19CSVRTID0gMHgxLAorCU5JX0dQQ1RfVElNRUJBU0VfM19DTE9DS19TUkNfQklUUyA9IDB4MiwKKwlOSV9HUENUX0xPR0lDX0xPV19DTE9DS19TUkNfQklUUyA9IDB4MywKKwlOSV9HUENUX05FWFRfR0FURV9DTE9DS19TUkNfQklUUyA9IDB4NCwKKwlOSV9HUENUX05FWFRfVENfQ0xPQ0tfU1JDX0JJVFMgPSAweDUsCisJTklfR1BDVF9TT1VSQ0VfUElOX2lfQ0xPQ0tfU1JDX0JJVFMgPSAweDYsCS8qIE5JIDY2MHgtc3BlY2lmaWMgKi8KKwlOSV9HUENUX1BYSTEwX0NMT0NLX1NSQ19CSVRTID0gMHg3LAorCU5JX0dQQ1RfUFhJX1NUQVJfVFJJR0dFUl9DTE9DS19TUkNfQklUUyA9IDB4OCwKKwlOSV9HUENUX0FOQUxPR19UUklHR0VSX09VVF9DTE9DS19TUkNfQklUUyA9IDB4OSwKKwlOSV9HUENUX1BSRVNDQUxFX01PREVfQ0xPQ0tfU1JDX01BU0sgPSAweDMwMDAwMDAwLAorCU5JX0dQQ1RfTk9fUFJFU0NBTEVfQ0xPQ0tfU1JDX0JJVFMgPSAweDAsCisJTklfR1BDVF9QUkVTQ0FMRV9YMl9DTE9DS19TUkNfQklUUyA9IDB4MTAwMDAwMDAsIC8qIGRpdmlkZSBzb3VyY2UgYnkgMiAqLworCU5JX0dQQ1RfUFJFU0NBTEVfWDhfQ0xPQ0tfU1JDX0JJVFMgPSAweDIwMDAwMDAwLCAvKiBkaXZpZGUgc291cmNlIGJ5IDggKi8KKwlOSV9HUENUX0lOVkVSVF9DTE9DS19TUkNfQklUID0gMHg4MDAwMDAwMAorfTsKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgTklfR1BDVF9TT1VSQ0VfUElOX0NMT0NLX1NSQ19CSVRTKHVuc2lnbmVkIG4pCit7CisJLyogTkkgNjYweC1zcGVjaWZpYyAqLworCXJldHVybiAweDEwICsgbjsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgTklfR1BDVF9SVFNJX0NMT0NLX1NSQ19CSVRTKHVuc2lnbmVkIG4pCit7CisJcmV0dXJuIDB4MTggKyBuOworfQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBOSV9HUENUX1BGSV9DTE9DS19TUkNfQklUUyh1bnNpZ25lZCBuKQoreworCS8qIG5vIHBmaSBvbiBOSSA2NjB4ICovCisJcmV0dXJuIDB4MjAgKyBuOworfQorCisvKiBQb3NzaWJpbGl0aWVzIGZvciBzZXR0aW5nIGEgZ2F0ZSBzb3VyY2Ugd2l0aAorSU5TTl9DT05GSUdfU0VUX0dBVEVfU1JDIHdoZW4gdXNpbmcgTkkgZ2VuZXJhbC1wdXJwb3NlIGNvdW50ZXJzLgorTWF5IGJlIGJpdHdpc2Utb3InZCB3aXRoIENSX0VER0Ugb3IgQ1JfSU5WRVJULiAqLworZW51bSBuaV9ncGN0X2dhdGVfc2VsZWN0IHsKKwkvKiBtLXNlcmllcyBnYXRlcyAqLworCU5JX0dQQ1RfVElNRVNUQU1QX01VWF9HQVRFX1NFTEVDVCA9IDB4MCwKKwlOSV9HUENUX0FJX1NUQVJUMl9HQVRFX1NFTEVDVCA9IDB4MTIsCisJTklfR1BDVF9QWElfU1RBUl9UUklHR0VSX0dBVEVfU0VMRUNUID0gMHgxMywKKwlOSV9HUENUX05FWFRfT1VUX0dBVEVfU0VMRUNUID0gMHgxNCwKKwlOSV9HUENUX0FJX1NUQVJUMV9HQVRFX1NFTEVDVCA9IDB4MWMsCisJTklfR1BDVF9ORVhUX1NPVVJDRV9HQVRFX1NFTEVDVCA9IDB4MWQsCisJTklfR1BDVF9BTkFMT0dfVFJJR0dFUl9PVVRfR0FURV9TRUxFQ1QgPSAweDFlLAorCU5JX0dQQ1RfTE9HSUNfTE9XX0dBVEVfU0VMRUNUID0gMHgxZiwKKwkvKiBtb3JlIGdhdGVzIGZvciA2NjB4ICovCisJTklfR1BDVF9TT1VSQ0VfUElOX2lfR0FURV9TRUxFQ1QgPSAweDEwMCwKKwlOSV9HUENUX0dBVEVfUElOX2lfR0FURV9TRUxFQ1QgPSAweDEwMSwKKwkvKiBtb3JlIGdhdGVzIGZvciA2NjB4ICJzZWNvbmQgZ2F0ZSIgKi8KKwlOSV9HUENUX1VQX0RPV05fUElOX2lfR0FURV9TRUxFQ1QgPSAweDIwMSwKKwlOSV9HUENUX1NFTEVDVEVEX0dBVEVfR0FURV9TRUxFQ1QgPSAweDIxZSwKKwkvKiBtLXNlcmllcyAic2Vjb25kIGdhdGUiIHNvdXJjZXMgYXJlIHVua25vd24sCisJICAgd2Ugc2hvdWxkIGFkZCB0aGVtIGhlcmUgd2l0aCBhbiBvZmZzZXQgb2YgMHgzMDAgd2hlbiBrbm93bi4gKi8KKwlOSV9HUENUX0RJU0FCTEVEX0dBVEVfU0VMRUNUID0gMHg4MDAwLAorfTsKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgTklfR1BDVF9HQVRFX1BJTl9HQVRFX1NFTEVDVCh1bnNpZ25lZCBuKQoreworCXJldHVybiAweDEwMiArIG47Cit9CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIE5JX0dQQ1RfUlRTSV9HQVRFX1NFTEVDVCh1bnNpZ25lZCBuKQoreworCXJldHVybiBOSV9VU1VBTF9SVFNJX1NFTEVDVChuKTsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgTklfR1BDVF9QRklfR0FURV9TRUxFQ1QodW5zaWduZWQgbikKK3sKKwlyZXR1cm4gTklfVVNVQUxfUEZJX1NFTEVDVChuKTsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgTklfR1BDVF9VUF9ET1dOX1BJTl9HQVRFX1NFTEVDVCh1bnNpZ25lZCBuKQoreworCXJldHVybiAweDIwMiArIG47Cit9CisKKy8qIFBvc3NpYmlsaXRpZXMgZm9yIHNldHRpbmcgYSBzb3VyY2Ugd2l0aAorSU5TTl9DT05GSUdfU0VUX09USEVSX1NSQyB3aGVuIHVzaW5nIE5JIGdlbmVyYWwtcHVycG9zZSBjb3VudGVycy4gKi8KK2VudW0gbmlfZ3BjdF9vdGhlcl9pbmRleCB7CisJTklfR1BDVF9TT1VSQ0VfRU5DT0RFUl9BLAorCU5JX0dQQ1RfU09VUkNFX0VOQ09ERVJfQiwKKwlOSV9HUENUX1NPVVJDRV9FTkNPREVSX1oKK307CitlbnVtIG5pX2dwY3Rfb3RoZXJfc2VsZWN0IHsKKwkvKiBtLXNlcmllcyBnYXRlcyAqLworCS8qIFN0aWxsIHVua25vd24sIHByb2JhYmx5IG9ubHkgbmVlZCBOSV9HUENUX1BGSV9PVEhFUl9TRUxFQ1QgKi8KKwlOSV9HUENUX0RJU0FCTEVEX09USEVSX1NFTEVDVCA9IDB4ODAwMCwKK307CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIE5JX0dQQ1RfUEZJX09USEVSX1NFTEVDVCh1bnNpZ25lZCBuKQoreworCXJldHVybiBOSV9VU1VBTF9QRklfU0VMRUNUKG4pOworfQorCisvKiBzdGFydCBzb3VyY2VzIGZvciBuaSBnZW5lcmFsLXB1cnBvc2UgY291bnRlcnMgZm9yIHVzZSB3aXRoCitJTlNOX0NPTkZJR19BUk0gKi8KK2VudW0gbmlfZ3BjdF9hcm1fc291cmNlIHsKKwlOSV9HUENUX0FSTV9JTU1FRElBVEUgPSAweDAsCisJTklfR1BDVF9BUk1fUEFJUkVEX0lNTUVESUFURSA9IDB4MSwJLyogU3RhcnQgYm90aCB0aGUgY291bnRlciBhbmQKKwkJCQkJCSAgIHRoZSBhZGphY2VudCBwYWlyZWQgY291bnRlcgorCQkJCQkJICAgc2ltdWx0YW5lb3VzbHkgKi8KKwkvKiBOSSBkb2Vzbid0IGRvY3VtZW50IGJpdHMgZm9yIHNlbGVjdGluZyBoYXJkd2FyZSBhcm0gdHJpZ2dlcnMuICBJZgorCSAqIHRoZSBOSV9HUENUX0FSTV9VTktOT1dOIGJpdCBpcyBzZXQsIHdlIHdpbGwgcGFzcyB0aGUgbGVhc3QKKwkgKiBzaWduaWZpY2FudCBiaXRzICgzIGJpdHMgZm9yIDY2MHggb3IgNSBiaXRzIGZvciBtLXNlcmllcykgdGhyb3VnaCB0bworCSAqIHRoZSBoYXJkd2FyZS4gIFRoaXMgd2lsbCBhdCBsZWFzdCBhbGxvdyBzb21lb25lIHRvIGZpZ3VyZSBvdXQgd2hhdAorCSAqIHRoZSBiaXRzIGRvIGxhdGVyLiAqLworCU5JX0dQQ1RfQVJNX1VOS05PV04gPSAweDEwMDAsCit9OworCisvKiBkaWdpdGFsIGZpbHRlcmluZyBvcHRpb25zIGZvciBuaSA2NjB4IGZvciB1c2Ugd2l0aCBJTlNOX0NPTkZJR19GSUxURVIuICovCitlbnVtIG5pX2dwY3RfZmlsdGVyX3NlbGVjdCB7CisJTklfR1BDVF9GSUxURVJfT0ZGID0gMHgwLAorCU5JX0dQQ1RfRklMVEVSX1RJTUVCQVNFXzNfU1lOQyA9IDB4MSwKKwlOSV9HUENUX0ZJTFRFUl8xMDB4X1RJTUVCQVNFXzEgPSAweDIsCisJTklfR1BDVF9GSUxURVJfMjB4X1RJTUVCQVNFXzEgPSAweDMsCisJTklfR1BDVF9GSUxURVJfMTB4X1RJTUVCQVNFXzEgPSAweDQsCisJTklfR1BDVF9GSUxURVJfMnhfVElNRUJBU0VfMSA9IDB4NSwKKwlOSV9HUENUX0ZJTFRFUl8yeF9USU1FQkFTRV8zID0gMHg2Cit9OworCisvKiBQRkkgZGlnaXRhbCBmaWx0ZXJpbmcgb3B0aW9ucyBmb3IgbmkgbS1zZXJpZXMgZm9yIHVzZSB3aXRoCisgKiBJTlNOX0NPTkZJR19GSUxURVIuICovCitlbnVtIG5pX3BmaV9maWx0ZXJfc2VsZWN0IHsKKwlOSV9QRklfRklMVEVSX09GRiA9IDB4MCwKKwlOSV9QRklfRklMVEVSXzEyNW5zID0gMHgxLAorCU5JX1BGSV9GSUxURVJfNjQyNW5zID0gMHgyLAorCU5JX1BGSV9GSUxURVJfMjU1MHVzID0gMHgzCit9OworCisvKiBtYXN0ZXIgY2xvY2sgc291cmNlcyBmb3IgbmkgbWlvIGJvYXJkcyBhbmQgSU5TTl9DT05GSUdfU0VUX0NMT0NLX1NSQyAqLworZW51bSBuaV9taW9fY2xvY2tfc291cmNlIHsKKwlOSV9NSU9fSU5URVJOQUxfQ0xPQ0sgPSAwLAorCU5JX01JT19SVFNJX0NMT0NLID0gMSwJLyogZG9lc24ndCB3b3JrIGZvciBtLXNlcmllcywgdXNlCisJCQkJICAgTklfTUlPX1BMTF9SVFNJX0NMT0NLKCkgKi8KKwkvKiB0aGUgTklfTUlPX1BMTF8qIHNvdXJjZXMgYXJlIG0tc2VyaWVzIG9ubHkgKi8KKwlOSV9NSU9fUExMX1BYSV9TVEFSX1RSSUdHRVJfQ0xPQ0sgPSAyLAorCU5JX01JT19QTExfUFhJMTBfQ0xPQ0sgPSAzLAorCU5JX01JT19QTExfUlRTSTBfQ0xPQ0sgPSA0Cit9Oworc3RhdGljIGlubGluZSB1bnNpZ25lZCBOSV9NSU9fUExMX1JUU0lfQ0xPQ0sodW5zaWduZWQgcnRzaV9jaGFubmVsKQoreworCXJldHVybiBOSV9NSU9fUExMX1JUU0kwX0NMT0NLICsgcnRzaV9jaGFubmVsOworfQorCisvKiBTaWduYWxzIHdoaWNoIGNhbiBiZSByb3V0ZWQgdG8gYW4gTkkgUlRTSSBwaW4gd2l0aCBJTlNOX0NPTkZJR19TRVRfUk9VVElORy4KKyBUaGUgbnVtYmVycyBhc3NpZ25lZCBhcmUgbm90IGFyYml0cmFyeSwgdGhleSBjb3JyZXNwb25kIHRvIHRoZSBiaXRzIHJlcXVpcmVkCisgdG8gcHJvZ3JhbSB0aGUgYm9hcmQuICovCitlbnVtIG5pX3J0c2lfcm91dGluZyB7CisJTklfUlRTSV9PVVRQVVRfQURSX1NUQVJUMSA9IDAsCisJTklfUlRTSV9PVVRQVVRfQURSX1NUQVJUMiA9IDEsCisJTklfUlRTSV9PVVRQVVRfU0NMS0cgPSAyLAorCU5JX1JUU0lfT1VUUFVUX0RBQ1VQRE4gPSAzLAorCU5JX1JUU0lfT1VUUFVUX0RBX1NUQVJUMSA9IDQsCisJTklfUlRTSV9PVVRQVVRfR19TUkMwID0gNSwKKwlOSV9SVFNJX09VVFBVVF9HX0dBVEUwID0gNiwKKwlOSV9SVFNJX09VVFBVVF9SR09VVDAgPSA3LAorCU5JX1JUU0lfT1VUUFVUX1JUU0lfQlJEXzAgPSA4LAorCU5JX1JUU0lfT1VUUFVUX1JUU0lfT1NDID0gMTIJLyogcHJlLW0tc2VyaWVzIGFsd2F5cyBoYXZlIFJUU0kgY2xvY2sKKwkJCQkJICAgb24gbGluZSA3ICovCit9Oworc3RhdGljIGlubGluZSB1bnNpZ25lZCBOSV9SVFNJX09VVFBVVF9SVFNJX0JSRCh1bnNpZ25lZCBuKQoreworCXJldHVybiBOSV9SVFNJX09VVFBVVF9SVFNJX0JSRF8wICsgbjsKK30KKworLyogU2lnbmFscyB3aGljaCBjYW4gYmUgcm91dGVkIHRvIGFuIE5JIFBGSSBwaW4gb24gYW4gbS1zZXJpZXMgYm9hcmQgd2l0aAorICogSU5TTl9DT05GSUdfU0VUX1JPVVRJTkcuICBUaGVzZSBudW1iZXJzIGFyZSBhbHNvIHJldHVybmVkIGJ5CisgKiBJTlNOX0NPTkZJR19HRVRfUk9VVElORyBvbiBwcmUtbS1zZXJpZXMgYm9hcmRzLCBldmVuIHRob3VnaCB0aGVpciByb3V0aW5nCisgKiBjYW5ub3QgYmUgY2hhbmdlZC4gIFRoZSBudW1iZXJzIGFzc2lnbmVkIGFyZSBub3QgYXJiaXRyYXJ5LCB0aGV5IGNvcnJlc3BvbmQKKyAqIHRvIHRoZSBiaXRzIHJlcXVpcmVkIHRvIHByb2dyYW0gdGhlIGJvYXJkLiAqLworZW51bSBuaV9wZmlfcm91dGluZyB7CisJTklfUEZJX09VVFBVVF9QRklfREVGQVVMVCA9IDAsCisJTklfUEZJX09VVFBVVF9BSV9TVEFSVDEgPSAxLAorCU5JX1BGSV9PVVRQVVRfQUlfU1RBUlQyID0gMiwKKwlOSV9QRklfT1VUUFVUX0FJX0NPTlZFUlQgPSAzLAorCU5JX1BGSV9PVVRQVVRfR19TUkMxID0gNCwKKwlOSV9QRklfT1VUUFVUX0dfR0FURTEgPSA1LAorCU5JX1BGSV9PVVRQVVRfQU9fVVBEQVRFX04gPSA2LAorCU5JX1BGSV9PVVRQVVRfQU9fU1RBUlQxID0gNywKKwlOSV9QRklfT1VUUFVUX0FJX1NUQVJUX1BVTFNFID0gOCwKKwlOSV9QRklfT1VUUFVUX0dfU1JDMCA9IDksCisJTklfUEZJX09VVFBVVF9HX0dBVEUwID0gMTAsCisJTklfUEZJX09VVFBVVF9FWFRfU1RST0JFID0gMTEsCisJTklfUEZJX09VVFBVVF9BSV9FWFRfTVVYX0NMSyA9IDEyLAorCU5JX1BGSV9PVVRQVVRfR09VVDAgPSAxMywKKwlOSV9QRklfT1VUUFVUX0dPVVQxID0gMTQsCisJTklfUEZJX09VVFBVVF9GUkVRX09VVCA9IDE1LAorCU5JX1BGSV9PVVRQVVRfUEZJX0RPID0gMTYsCisJTklfUEZJX09VVFBVVF9JX0FUUklHID0gMTcsCisJTklfUEZJX09VVFBVVF9SVFNJMCA9IDE4LAorCU5JX1BGSV9PVVRQVVRfUFhJX1NUQVJfVFJJR0dFUl9JTiA9IDI2LAorCU5JX1BGSV9PVVRQVVRfU0NYSV9UUklHMSA9IDI3LAorCU5JX1BGSV9PVVRQVVRfRElPX0NIQU5HRV9ERVRFQ1RfUlRTSSA9IDI4LAorCU5JX1BGSV9PVVRQVVRfQ0RJX1NBTVBMRSA9IDI5LAorCU5JX1BGSV9PVVRQVVRfQ0RPX1VQREFURSA9IDMwCit9Oworc3RhdGljIGlubGluZSB1bnNpZ25lZCBOSV9QRklfT1VUUFVUX1JUU0kodW5zaWduZWQgcnRzaV9jaGFubmVsKQoreworCXJldHVybiBOSV9QRklfT1VUUFVUX1JUU0kwICsgcnRzaV9jaGFubmVsOworfQorCisvKiBTaWduYWxzIHdoaWNoIGNhbiBiZSByb3V0ZWQgdG8gb3V0cHV0IG9uIGEgTkkgUEZJIHBpbiBvbiBhIDY2MHggYm9hcmQKKyB3aXRoIElOU05fQ09ORklHX1NFVF9ST1VUSU5HLiAgVGhlIG51bWJlcnMgYXNzaWduZWQgYXJlCisgbm90IGFyYml0cmFyeSwgdGhleSBjb3JyZXNwb25kIHRvIHRoZSBiaXRzIHJlcXVpcmVkCisgdG8gcHJvZ3JhbSB0aGUgYm9hcmQuICBMaW5lcyAwIHRvIDcgY2FuIG9ubHkgYmUgc2V0IHRvCisgTklfNjYwWF9QRklfT1VUUFVUX0RJTy4gIExpbmVzIDMyIHRvIDM5IGNhbiBvbmx5IGJlIHNldCB0bworIE5JXzY2MFhfUEZJX09VVFBVVF9DT1VOVEVSLiAqLworZW51bSBuaV82NjB4X3BmaV9yb3V0aW5nIHsKKwlOSV82NjBYX1BGSV9PVVRQVVRfQ09VTlRFUiA9IDEsCS8qIGNvdW50ZXIgKi8KKwlOSV82NjBYX1BGSV9PVVRQVVRfRElPID0gMiwJLyogc3RhdGljIGRpZ2l0YWwgb3V0cHV0ICovCit9OworCisvKiBOSSBFeHRlcm5hbCBUcmlnZ2VyIGxpbmVzLiAgVGhlc2UgdmFsdWVzIGFyZSBub3QgYXJiaXRyYXJ5LCBidXQgYXJlIHJlbGF0ZWQKKyAqIHRvIHRoZSBiaXRzIHJlcXVpcmVkIHRvIHByb2dyYW0gdGhlIGJvYXJkIChvZmZzZXQgYnkgMSBmb3IgaGlzdG9yaWNhbAorICogcmVhc29ucykuICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIE5JX0VYVF9QRkkodW5zaWduZWQgcGZpX2NoYW5uZWwpCit7CisJcmV0dXJuIE5JX1VTVUFMX1BGSV9TRUxFQ1QocGZpX2NoYW5uZWwpIC0gMTsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgTklfRVhUX1JUU0kodW5zaWduZWQgcnRzaV9jaGFubmVsKQoreworCXJldHVybiBOSV9VU1VBTF9SVFNJX1NFTEVDVChydHNpX2NoYW5uZWwpIC0gMTsKK30KKworLyogc3RhdHVzIGJpdHMgZm9yIElOU05fQ09ORklHX0dFVF9DT1VOVEVSX1NUQVRVUyAqLworZW51bSBjb21lZGlfY291bnRlcl9zdGF0dXNfZmxhZ3MgeworCUNPTUVESV9DT1VOVEVSX0FSTUVEID0gMHgxLAorCUNPTUVESV9DT1VOVEVSX0NPVU5USU5HID0gMHgyLAorCUNPTUVESV9DT1VOVEVSX1RFUk1JTkFMX0NPVU5UID0gMHg0LAorfTsKKworLyogQ2xvY2sgc291cmNlcyBmb3IgQ0RJTyBzdWJkZXZpY2Ugb24gTkkgbS1zZXJpZXMgYm9hcmRzLiAgVXNlZCBhcyB0aGUKKyAqIHNjYW5fYmVnaW5fYXJnIGZvciBhIGNvbWVkaV9jb21tYW5kLiBUaGVzZSBzb3VyY2VzIG1heSBhbHNvIGJlIGJpdHdpc2Utb3InZAorICogd2l0aCBDUl9JTlZFUlQgdG8gY2hhbmdlIHBvbGFyaXR5LiAqLworZW51bSBuaV9tX3Nlcmllc19jZGlvX3NjYW5fYmVnaW5fc3JjIHsKKwlOSV9DRElPX1NDQU5fQkVHSU5fU1JDX0dST1VORCA9IDAsCisJTklfQ0RJT19TQ0FOX0JFR0lOX1NSQ19BSV9TVEFSVCA9IDE4LAorCU5JX0NESU9fU0NBTl9CRUdJTl9TUkNfQUlfQ09OVkVSVCA9IDE5LAorCU5JX0NESU9fU0NBTl9CRUdJTl9TUkNfUFhJX1NUQVJfVFJJR0dFUiA9IDIwLAorCU5JX0NESU9fU0NBTl9CRUdJTl9TUkNfRzBfT1VUID0gMjgsCisJTklfQ0RJT19TQ0FOX0JFR0lOX1NSQ19HMV9PVVQgPSAyOSwKKwlOSV9DRElPX1NDQU5fQkVHSU5fU1JDX0FOQUxPR19UUklHR0VSID0gMzAsCisJTklfQ0RJT19TQ0FOX0JFR0lOX1NSQ19BT19VUERBVEUgPSAzMSwKKwlOSV9DRElPX1NDQU5fQkVHSU5fU1JDX0ZSRVFfT1VUID0gMzIsCisJTklfQ0RJT19TQ0FOX0JFR0lOX1NSQ19ESU9fQ0hBTkdFX0RFVEVDVF9JUlEgPSAzMworfTsKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgTklfQ0RJT19TQ0FOX0JFR0lOX1NSQ19QRkkodW5zaWduZWQgcGZpX2NoYW5uZWwpCit7CisJcmV0dXJuIE5JX1VTVUFMX1BGSV9TRUxFQ1QocGZpX2NoYW5uZWwpOworfQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBOSV9DRElPX1NDQU5fQkVHSU5fU1JDX1JUU0kodW5zaWduZWQgcnRzaV9jaGFubmVsKQoreworCXJldHVybiBOSV9VU1VBTF9SVFNJX1NFTEVDVChydHNpX2NoYW5uZWwpOworfQorCisvKiBzY2FuX2JlZ2luX3NyYyBmb3Igc2Nhbl9iZWdpbl9hcmc9PVRSSUdfRVhUIHdpdGggYW5hbG9nIG91dHB1dCBjb21tYW5kIG9uIE5JCisgKiBib2FyZHMuICBUaGVzZSBzY2FuIGJlZ2luIHNvdXJjZXMgY2FuIGFsc28gYmUgYml0d2lzZS1vcidkIHdpdGggQ1JfSU5WRVJUIHRvCisgKiBjaGFuZ2UgcG9sYXJpdHkuICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIE5JX0FPX1NDQU5fQkVHSU5fU1JDX1BGSSh1bnNpZ25lZCBwZmlfY2hhbm5lbCkKK3sKKwlyZXR1cm4gTklfVVNVQUxfUEZJX1NFTEVDVChwZmlfY2hhbm5lbCk7Cit9CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIE5JX0FPX1NDQU5fQkVHSU5fU1JDX1JUU0kodW5zaWduZWQgcnRzaV9jaGFubmVsKQoreworCXJldHVybiBOSV9VU1VBTF9SVFNJX1NFTEVDVChydHNpX2NoYW5uZWwpOworfQorCisvKiBCaXRzIGZvciBzZXR0aW5nIGEgY2xvY2sgc291cmNlIHdpdGgKKyAqIElOU05fQ09ORklHX1NFVF9DTE9DS19TUkMgd2hlbiB1c2luZyBOSSBmcmVxdWVuY3kgb3V0cHV0IHN1YmRldmljZS4gKi8KK2VudW0gbmlfZnJlcV9vdXRfY2xvY2tfc291cmNlX2JpdHMgeworCU5JX0ZSRVFfT1VUX1RJTUVCQVNFXzFfRElWXzJfQ0xPQ0tfU1JDLAkvKiAxMCBNSHogKi8KKwlOSV9GUkVRX09VVF9USU1FQkFTRV8yX0NMT0NLX1NSQwkvKiAxMDAgS0h6ICovCit9OworCisvKiBWYWx1ZXMgZm9yIHNldHRpbmcgYSBjbG9jayBzb3VyY2Ugd2l0aCBJTlNOX0NPTkZJR19TRVRfQ0xPQ0tfU1JDIGZvcgorICogODI1NCBjb3VudGVyIHN1YmRldmljZXMgb24gQW1wbGljb24gRElPIGJvYXJkcyAoYW1wbGNfZGlvMjAwIGRyaXZlcikuICovCisJZW51bSBhbXBsY19kaW9fY2xvY2tfc291cmNlIHsKKwkJQU1QTENfRElPX0NMS19DTEtOLAkvKiBwZXIgY2hhbm5lbCBleHRlcm5hbCBjbG9jaworCQkJCQkgICBpbnB1dC9vdXRwdXQgcGluIChwaW4gaXMgb25seSBhbgorCQkJCQkgICBpbnB1dCB3aGVuIGNsb2NrIHNvdXJjZSBzZXQgdG8gdGhpcworCQkJCQkgICB2YWx1ZSwgb3RoZXJ3aXNlIGl0IGlzIGFuIG91dHB1dCkgKi8KKwkJQU1QTENfRElPX0NMS18xME1IWiwJLyogMTAgTUh6IGludGVybmFsIGNsb2NrICovCisJCUFNUExDX0RJT19DTEtfMU1IWiwJLyogMSBNSHogaW50ZXJuYWwgY2xvY2sgKi8KKwkJQU1QTENfRElPX0NMS18xMDBLSFosCS8qIDEwMCBrSHogaW50ZXJuYWwgY2xvY2sgKi8KKwkJQU1QTENfRElPX0NMS18xMEtIWiwJLyogMTAga0h6IGludGVybmFsIGNsb2NrICovCisJCUFNUExDX0RJT19DTEtfMUtIWiwJLyogMSBrSHogaW50ZXJuYWwgY2xvY2sgKi8KKwkJQU1QTENfRElPX0NMS19PVVROTTEsCS8qIG91dHB1dCBvZiBwcmVjZWRpbmcgY291bnRlciBjaGFubmVsCisJCQkJCSAgIChmb3IgY2hhbm5lbCAwLCBwcmVjZWRpbmcgY291bnRlcgorCQkJCQkgICBjaGFubmVsIGlzIGNoYW5uZWwgMiBvbiBwcmVjZWRpbmcKKwkJCQkJICAgY291bnRlciBzdWJkZXZpY2UsIGZvciBmaXJzdCBjb3VudGVyCisJCQkJCSAgIHN1YmRldmljZSwgcHJlY2VkaW5nIGNvdW50ZXIKKwkJCQkJICAgc3ViZGV2aWNlIGlzIHRoZSBsYXN0IGNvdW50ZXIKKwkJCQkJICAgc3ViZGV2aWNlKSAqLworCQlBTVBMQ19ESU9fQ0xLX0VYVAkvKiBwZXIgY2hpcCBleHRlcm5hbCBpbnB1dCBwaW4gKi8KKwl9OworCisvKiBWYWx1ZXMgZm9yIHNldHRpbmcgYSBnYXRlIHNvdXJjZSB3aXRoIElOU05fQ09ORklHX1NFVF9HQVRFX1NSQyBmb3IKKyAqIDgyNTQgY291bnRlciBzdWJkZXZpY2VzIG9uIEFtcGxpY29uIERJTyBib2FyZHMgKGFtcGxjX2RpbzIwMCBkcml2ZXIpLiAqLworCWVudW0gYW1wbGNfZGlvX2dhdGVfc291cmNlIHsKKwkJQU1QTENfRElPX0dBVF9WQ0MsCS8qIGludGVybmFsIGhpZ2ggbG9naWMgbGV2ZWwgKi8KKwkJQU1QTENfRElPX0dBVF9HTkQsCS8qIGludGVybmFsIGxvdyBsb2dpYyBsZXZlbCAqLworCQlBTVBMQ19ESU9fR0FUX0dBVE4sCS8qIHBlciBjaGFubmVsIGV4dGVybmFsIGdhdGUgaW5wdXQgKi8KKwkJQU1QTENfRElPX0dBVF9OT1VUTk0yLAkvKiBuZWdhdGVkIG91dHB1dCBvZiBjb3VudGVyIGNoYW5uZWwKKwkJCQkJICAgbWludXMgMiAoZm9yIGNoYW5uZWxzIDAgb3IgMSwKKwkJCQkJICAgY2hhbm5lbCBtaW51cyAyIGlzIGNoYW5uZWwgMSBvciAyIG9uCisJCQkJCSAgIHRoZSBwcmVjZWRpbmcgY291bnRlciBzdWJkZXZpY2UsIGZvcgorCQkJCQkgICB0aGUgZmlyc3QgY291bnRlciBzdWJkZXZpY2UgdGhlCisJCQkJCSAgIHByZWNlZGluZyBjb3VudGVyIHN1YmRldmljZSBpcyB0aGUKKwkJCQkJICAgbGFzdCBjb3VudGVyIHN1YmRldmljZSkgKi8KKwkJQU1QTENfRElPX0dBVF9SRVNFUlZFRDQsCisJCUFNUExDX0RJT19HQVRfUkVTRVJWRUQ1LAorCQlBTVBMQ19ESU9fR0FUX1JFU0VSVkVENiwKKwkJQU1QTENfRElPX0dBVF9SRVNFUlZFRDcKKwl9OworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX0NPTUVESV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9jb21wYXQzMi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfY29tcGF0MzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDAxMTZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfY29tcGF0MzIuYwpAQCAtMCwwICsxLDU5NyBAQAorLyoKKyAgICBjb21lZGkvY29tZWRpX2NvbXBhdDMyLmMKKyAgICAzMi1iaXQgaW9jdGwgY29tcGF0aWJpbGl0eSBmb3IgNjQtYml0IGNvbWVkaSBrZXJuZWwgbW9kdWxlLgorCisgICAgQXV0aG9yOiBJYW4gQWJib3R0LCBNRVYgTHRkLiA8YWJib3R0aUBtZXYuY28udWs+CisgICAgQ29weXJpZ2h0IChDKSAyMDA3IE1FViBMdGQuIDxodHRwOi8vd3d3Lm1ldi5jby51ay8+CisKKyAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDcgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI2RlZmluZSBfX05PX1ZFUlNJT05fXworI2luY2x1ZGUgImNvbWVkaS5oIgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgImNvbWVkaV9jb21wYXQzMi5oIgorCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCisjaWZuZGVmIEhBVkVfQ09NUEFUX0lPQ1RMCisjaW5jbHVkZSA8bGludXgvaW9jdGwzMi5oPgkvKiBmb3IgKHVuKXJlZ2lzdGVyX2lvY3RsMzJfY29udmVyc2lvbiAqLworI2VuZGlmCisKKyNkZWZpbmUgQ09NRURJMzJfQ0hBTklORk8gX0lPUihDSU8sMyxjb21lZGkzMl9jaGFuaW5mbykKKyNkZWZpbmUgQ09NRURJMzJfUkFOR0VJTkZPIF9JT1IoQ0lPLDgsY29tZWRpMzJfcmFuZ2VpbmZvKQorLyogTi5CLiBDT01FREkzMl9DTUQgYW5kIENPTUVESV9DTUQgb3VnaHQgdG8gdXNlIF9JT1dSLCBub3QgX0lPUi4KKyAqIEl0J3MgdG9vIGxhdGUgdG8gY2hhbmdlIGl0IG5vdywgYnV0IGl0IG9ubHkgYWZmZWN0cyB0aGUgY29tbWFuZCBudW1iZXIuICovCisjZGVmaW5lIENPTUVESTMyX0NNRCBfSU9SKENJTyw5LGNvbWVkaTMyX2NtZCkKKy8qIE4uQi4gQ09NRURJMzJfQ01EVEVTVCBhbmQgQ09NRURJX0NNRFRFU1Qgb3VnaHQgdG8gdXNlIF9JT1dSLCBub3QgX0lPUi4KKyAqIEl0J3MgdG9vIGxhdGUgdG8gY2hhbmdlIGl0IG5vdywgYnV0IGl0IG9ubHkgYWZmZWN0cyB0aGUgY29tbWFuZCBudW1iZXIuICovCisjZGVmaW5lIENPTUVESTMyX0NNRFRFU1QgX0lPUihDSU8sMTAsY29tZWRpMzJfY21kKQorI2RlZmluZSBDT01FREkzMl9JTlNOTElTVCBfSU9SKENJTywxMSxjb21lZGkzMl9pbnNubGlzdCkKKyNkZWZpbmUgQ09NRURJMzJfSU5TTiBfSU9SKENJTywxMixjb21lZGkzMl9pbnNuKQorCit0eXBlZGVmIHN0cnVjdCBjb21lZGkzMl9jaGFuaW5mb19zdHJ1Y3QgeworCXVuc2lnbmVkIGludCBzdWJkZXY7CisJY29tcGF0X3VwdHJfdCBtYXhkYXRhX2xpc3Q7CS8qIDMyLWJpdCAnbHNhbXBsX3QgKicgKi8KKwljb21wYXRfdXB0cl90IGZsYWdsaXN0OwkJLyogMzItYml0ICd1bnNpZ25lZCBpbnQgKicgKi8KKwljb21wYXRfdXB0cl90IHJhbmdlbGlzdDsJLyogMzItYml0ICd1bnNpZ25lZCBpbnQgKicgKi8KKwl1bnNpZ25lZCBpbnQgdW51c2VkWzRdOworfSBjb21lZGkzMl9jaGFuaW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgY29tZWRpMzJfcmFuZ2VpbmZvX3N0cnVjdCB7CisJdW5zaWduZWQgaW50IHJhbmdlX3R5cGU7CisJY29tcGF0X3VwdHJfdCByYW5nZV9wdHI7CS8qIDMyLWJpdCAndm9pZCAqJyAqLworfSBjb21lZGkzMl9yYW5nZWluZm87CisKK3R5cGVkZWYgc3RydWN0IGNvbWVkaTMyX2NtZF9zdHJ1Y3QgeworCXVuc2lnbmVkIGludCBzdWJkZXY7CisJdW5zaWduZWQgaW50IGZsYWdzOworCXVuc2lnbmVkIGludCBzdGFydF9zcmM7CisJdW5zaWduZWQgaW50IHN0YXJ0X2FyZzsKKwl1bnNpZ25lZCBpbnQgc2Nhbl9iZWdpbl9zcmM7CisJdW5zaWduZWQgaW50IHNjYW5fYmVnaW5fYXJnOworCXVuc2lnbmVkIGludCBjb252ZXJ0X3NyYzsKKwl1bnNpZ25lZCBpbnQgY29udmVydF9hcmc7CisJdW5zaWduZWQgaW50IHNjYW5fZW5kX3NyYzsKKwl1bnNpZ25lZCBpbnQgc2Nhbl9lbmRfYXJnOworCXVuc2lnbmVkIGludCBzdG9wX3NyYzsKKwl1bnNpZ25lZCBpbnQgc3RvcF9hcmc7CisJY29tcGF0X3VwdHJfdCBjaGFubGlzdDsJCS8qIDMyLWJpdCAndW5zaWduZWQgaW50IConICovCisJdW5zaWduZWQgaW50IGNoYW5saXN0X2xlbjsKKwljb21wYXRfdXB0cl90IGRhdGE7CQkvKiAzMi1iaXQgJ3NhbXBsX3QgKicgKi8KKwl1bnNpZ25lZCBpbnQgZGF0YV9sZW47Cit9IGNvbWVkaTMyX2NtZDsKKwordHlwZWRlZiBzdHJ1Y3QgY29tZWRpMzJfaW5zbl9zdHJ1Y3QgeworCXVuc2lnbmVkIGludCBpbnNuOworCXVuc2lnbmVkIGludCBuOworCWNvbXBhdF91cHRyX3QgZGF0YTsJCS8qIDMyLWJpdCAnbHNhbXBsX3QgKicgKi8KKwl1bnNpZ25lZCBpbnQgc3ViZGV2OworCXVuc2lnbmVkIGludCBjaGFuc3BlYzsKKwl1bnNpZ25lZCBpbnQgdW51c2VkWzNdOworfSBjb21lZGkzMl9pbnNuOworCit0eXBlZGVmIHN0cnVjdCBjb21lZGkzMl9pbnNubGlzdF9zdHJ1Y3QgeworCXVuc2lnbmVkIGludCBuX2luc25zOworCWNvbXBhdF91cHRyX3QgaW5zbnM7CQkvKiAzMi1iaXQgJ2NvbWVkaV9pbnNuIConICovCit9IGNvbWVkaTMyX2luc25saXN0OworCisvKiBIYW5kbGUgdHJhbnNsYXRlZCBpb2N0bC4gKi8KK3N0YXRpYyBpbnQgdHJhbnNsYXRlZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaWYgKCFmaWxlLT5mX29wKSB7CisJCXJldHVybiAtRU5PVFRZOworCX0KKyNpZmRlZiBIQVZFX1VOTE9DS0VEX0lPQ1RMCisJaWYgKGZpbGUtPmZfb3AtPnVubG9ja2VkX2lvY3RsKSB7CisJCWludCByYyA9IChpbnQpKCpmaWxlLT5mX29wLT51bmxvY2tlZF9pb2N0bCkoZmlsZSwgY21kLCBhcmcpOworCQlpZiAocmMgPT0gLUVOT0lPQ1RMQ01EKSB7CisJCQlyYyA9IC1FTk9UVFk7CisJCX0KKwkJcmV0dXJuIHJjOworCX0KKyNlbmRpZgorCWlmIChmaWxlLT5mX29wLT5pb2N0bCkgeworCQlpbnQgcmM7CisJCWxvY2tfa2VybmVsKCk7CisJCXJjID0gKCpmaWxlLT5mX29wLT5pb2N0bCkoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsCisJCQkJZmlsZSwgY21kLCBhcmcpOworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiByYzsKKwl9CisJcmV0dXJuIC1FTk9UVFk7Cit9CisKKy8qIEhhbmRsZSAzMi1iaXQgQ09NRURJX0NIQU5JTkZPIGlvY3RsLiAqLworc3RhdGljIGludCBjb21wYXRfY2hhbmluZm8oc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWNvbWVkaV9jaGFuaW5mbyBfX3VzZXIgKmNoYW5pbmZvOworCWNvbWVkaTMyX2NoYW5pbmZvIF9fdXNlciAqY2hhbmluZm8zMjsKKwlpbnQgZXJyOworCXVuaW9uIHsKKwkJdW5zaWduZWQgaW50IHVpbnQ7CisJCWNvbXBhdF91cHRyX3QgdXB0cjsKKwl9IHRlbXA7CisKKwljaGFuaW5mbzMyID0gY29tcGF0X3B0cihhcmcpOworCWNoYW5pbmZvID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpjaGFuaW5mbykpOworCisJLyogQ29weSBjaGFuaW5mbyBzdHJ1Y3R1cmUuICBJZ25vcmUgdW51c2VkIG1lbWJlcnMuICovCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGNoYW5pbmZvMzIsIHNpemVvZigqY2hhbmluZm8zMikpCisJCQl8fCAhYWNjZXNzX29rKFZFUklGWV9XUklURSwgY2hhbmluZm8sCisJCQkJc2l6ZW9mKCpjaGFuaW5mbykpKSB7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwllcnIgPSAwOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAudWludCwgJmNoYW5pbmZvMzItPnN1YmRldik7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcC51aW50LCAmY2hhbmluZm8tPnN1YmRldik7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcC51cHRyLCAmY2hhbmluZm8zMi0+bWF4ZGF0YV9saXN0KTsKKwllcnIgfD0gX19wdXRfdXNlcihjb21wYXRfcHRyKHRlbXAudXB0ciksICZjaGFuaW5mby0+bWF4ZGF0YV9saXN0KTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVwdHIsICZjaGFuaW5mbzMyLT5mbGFnbGlzdCk7CisJZXJyIHw9IF9fcHV0X3VzZXIoY29tcGF0X3B0cih0ZW1wLnVwdHIpLCAmY2hhbmluZm8tPmZsYWdsaXN0KTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVwdHIsICZjaGFuaW5mbzMyLT5yYW5nZWxpc3QpOworCWVyciB8PSBfX3B1dF91c2VyKGNvbXBhdF9wdHIodGVtcC51cHRyKSwgJmNoYW5pbmZvLT5yYW5nZWxpc3QpOworCWlmIChlcnIpIHsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIHRyYW5zbGF0ZWRfaW9jdGwoZmlsZSwgQ09NRURJX0NIQU5JTkZPLCAodW5zaWduZWQgbG9uZyljaGFuaW5mbyk7Cit9CisKKy8qIEhhbmRsZSAzMi1iaXQgQ09NRURJX1JBTkdFSU5GTyBpb2N0bC4gKi8KK3N0YXRpYyBpbnQgY29tcGF0X3JhbmdlaW5mbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJY29tZWRpX3JhbmdlaW5mbyBfX3VzZXIgKnJhbmdlaW5mbzsKKwljb21lZGkzMl9yYW5nZWluZm8gX191c2VyICpyYW5nZWluZm8zMjsKKwlpbnQgZXJyOworCXVuaW9uIHsKKwkJdW5zaWduZWQgaW50IHVpbnQ7CisJCWNvbXBhdF91cHRyX3QgdXB0cjsKKwl9IHRlbXA7CisKKwlyYW5nZWluZm8zMiA9IGNvbXBhdF9wdHIoYXJnKTsKKwlyYW5nZWluZm8gPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnJhbmdlaW5mbykpOworCisJLyogQ29weSByYW5nZWluZm8gc3RydWN0dXJlLiAqLworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCByYW5nZWluZm8zMiwgc2l6ZW9mKCpyYW5nZWluZm8zMikpCisJCQl8fCAhYWNjZXNzX29rKFZFUklGWV9XUklURSwgcmFuZ2VpbmZvLAorCQkJCXNpemVvZigqcmFuZ2VpbmZvKSkpIHsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWVyciA9IDA7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcC51aW50LCAmcmFuZ2VpbmZvMzItPnJhbmdlX3R5cGUpOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAudWludCwgJnJhbmdlaW5mby0+cmFuZ2VfdHlwZSk7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcC51cHRyLCAmcmFuZ2VpbmZvMzItPnJhbmdlX3B0cik7CisJZXJyIHw9IF9fcHV0X3VzZXIoY29tcGF0X3B0cih0ZW1wLnVwdHIpLCAmcmFuZ2VpbmZvLT5yYW5nZV9wdHIpOworCWlmIChlcnIpIHsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIHRyYW5zbGF0ZWRfaW9jdGwoZmlsZSwgQ09NRURJX1JBTkdFSU5GTywKKwkJCSh1bnNpZ25lZCBsb25nKXJhbmdlaW5mbyk7Cit9CisKKy8qIENvcHkgMzItYml0IGNtZCBzdHJ1Y3R1cmUgdG8gbmF0aXZlIGNtZCBzdHJ1Y3R1cmUuICovCitzdGF0aWMgaW50IGdldF9jb21wYXRfY21kKGNvbWVkaV9jbWQgX191c2VyICpjbWQsCisJCWNvbWVkaTMyX2NtZCBfX3VzZXIgKmNtZDMyKQoreworCWludCBlcnI7CisJdW5pb24geworCQl1bnNpZ25lZCBpbnQgdWludDsKKwkJY29tcGF0X3VwdHJfdCB1cHRyOworCX0gdGVtcDsKKworCS8qIENvcHkgY21kIHN0cnVjdHVyZS4gKi8KKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgY21kMzIsIHNpemVvZigqY21kMzIpKQorCQkJfHwgIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGNtZCwgc2l6ZW9mKCpjbWQpKSkgeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJZXJyID0gMDsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVpbnQsICZjbWQzMi0+c3ViZGV2KTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLnVpbnQsICZjbWQtPnN1YmRldik7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcC51aW50LCAmY21kMzItPmZsYWdzKTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLnVpbnQsICZjbWQtPmZsYWdzKTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVpbnQsICZjbWQzMi0+c3RhcnRfc3JjKTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLnVpbnQsICZjbWQtPnN0YXJ0X3NyYyk7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcC51aW50LCAmY21kMzItPnN0YXJ0X2FyZyk7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcC51aW50LCAmY21kLT5zdGFydF9hcmcpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAudWludCwgJmNtZDMyLT5zY2FuX2JlZ2luX3NyYyk7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcC51aW50LCAmY21kLT5zY2FuX2JlZ2luX3NyYyk7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcC51aW50LCAmY21kMzItPnNjYW5fYmVnaW5fYXJnKTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLnVpbnQsICZjbWQtPnNjYW5fYmVnaW5fYXJnKTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVpbnQsICZjbWQzMi0+Y29udmVydF9zcmMpOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAudWludCwgJmNtZC0+Y29udmVydF9zcmMpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAudWludCwgJmNtZDMyLT5jb252ZXJ0X2FyZyk7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcC51aW50LCAmY21kLT5jb252ZXJ0X2FyZyk7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcC51aW50LCAmY21kMzItPnNjYW5fZW5kX3NyYyk7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcC51aW50LCAmY21kLT5zY2FuX2VuZF9zcmMpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAudWludCwgJmNtZDMyLT5zY2FuX2VuZF9hcmcpOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAudWludCwgJmNtZC0+c2Nhbl9lbmRfYXJnKTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVpbnQsICZjbWQzMi0+c3RvcF9zcmMpOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAudWludCwgJmNtZC0+c3RvcF9zcmMpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAudWludCwgJmNtZDMyLT5zdG9wX2FyZyk7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcC51aW50LCAmY21kLT5zdG9wX2FyZyk7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcC51cHRyLCAmY21kMzItPmNoYW5saXN0KTsKKwllcnIgfD0gX19wdXRfdXNlcihjb21wYXRfcHRyKHRlbXAudXB0ciksICZjbWQtPmNoYW5saXN0KTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVpbnQsICZjbWQzMi0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLnVpbnQsICZjbWQtPmNoYW5saXN0X2xlbik7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcC51cHRyLCAmY21kMzItPmRhdGEpOworCWVyciB8PSBfX3B1dF91c2VyKGNvbXBhdF9wdHIodGVtcC51cHRyKSwgJmNtZC0+ZGF0YSk7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcC51aW50LCAmY21kMzItPmRhdGFfbGVuKTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLnVpbnQsICZjbWQtPmRhdGFfbGVuKTsKKwlyZXR1cm4gZXJyID8gLUVGQVVMVCA6IDA7Cit9CisKKy8qIENvcHkgbmF0aXZlIGNtZCBzdHJ1Y3R1cmUgdG8gMzItYml0IGNtZCBzdHJ1Y3R1cmUuICovCitzdGF0aWMgaW50IHB1dF9jb21wYXRfY21kKGNvbWVkaTMyX2NtZCBfX3VzZXIgKmNtZDMyLCBjb21lZGlfY21kIF9fdXNlciAqY21kKQoreworCWludCBlcnI7CisJdW5zaWduZWQgaW50IHRlbXA7CisKKwkvKiBDb3B5IGJhY2sgbW9zdCBvZiBjbWQgc3RydWN0dXJlLiAqLworCS8qIEFzc3VtZSB0aGUgcG9pbnRlciB2YWx1ZXMgYXJlIGFscmVhZHkgdmFsaWQuICovCisJLyogKENvdWxkIHVzZSBwdHJfdG9fY29tcGF0KCkgdG8gc2V0IHRoZW0sIGJ1dCB0aGF0IHdhc24ndCBpbXBsZW1lbnRlZAorCSAqIHVudGlsIGtlcm5lbCB2ZXJzaW9uIDIuNi4xMS4pICovCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGNtZCwgc2l6ZW9mKCpjbWQpKQorCQkJfHwgIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGNtZDMyLCBzaXplb2YoKmNtZDMyKSkpIHsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWVyciA9IDA7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcCwgJmNtZC0+c3ViZGV2KTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLCAmY21kMzItPnN1YmRldik7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcCwgJmNtZC0+ZmxhZ3MpOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAsICZjbWQzMi0+ZmxhZ3MpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAsICZjbWQtPnN0YXJ0X3NyYyk7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcCwgJmNtZDMyLT5zdGFydF9zcmMpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAsICZjbWQtPnN0YXJ0X2FyZyk7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcCwgJmNtZDMyLT5zdGFydF9hcmcpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAsICZjbWQtPnNjYW5fYmVnaW5fc3JjKTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLCAmY21kMzItPnNjYW5fYmVnaW5fc3JjKTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLCAmY21kLT5zY2FuX2JlZ2luX2FyZyk7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcCwgJmNtZDMyLT5zY2FuX2JlZ2luX2FyZyk7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcCwgJmNtZC0+Y29udmVydF9zcmMpOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAsICZjbWQzMi0+Y29udmVydF9zcmMpOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAsICZjbWQtPmNvbnZlcnRfYXJnKTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLCAmY21kMzItPmNvbnZlcnRfYXJnKTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLCAmY21kLT5zY2FuX2VuZF9zcmMpOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAsICZjbWQzMi0+c2Nhbl9lbmRfc3JjKTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLCAmY21kLT5zY2FuX2VuZF9hcmcpOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAsICZjbWQzMi0+c2Nhbl9lbmRfYXJnKTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLCAmY21kLT5zdG9wX3NyYyk7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcCwgJmNtZDMyLT5zdG9wX3NyYyk7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcCwgJmNtZC0+c3RvcF9hcmcpOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAsICZjbWQzMi0+c3RvcF9hcmcpOworCS8qIEFzc3VtZSBjaGFubGlzdCBwb2ludGVyIGlzIHVuY2hhbmdlZC4gKi8KKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLCAmY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAsICZjbWQzMi0+Y2hhbmxpc3RfbGVuKTsKKwkvKiBBc3N1bWUgZGF0YSBwb2ludGVyIGlzIHVuY2hhbmdlZC4gKi8KKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLCAmY21kLT5kYXRhX2xlbik7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcCwgJmNtZDMyLT5kYXRhX2xlbik7CisJcmV0dXJuIGVyciA/IC1FRkFVTFQgOiAwOworfQorCisvKiBIYW5kbGUgMzItYml0IENPTUVESV9DTUQgaW9jdGwuICovCitzdGF0aWMgaW50IGNvbXBhdF9jbWQoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWNvbWVkaV9jbWQgX191c2VyICpjbWQ7CisJY29tZWRpMzJfY21kIF9fdXNlciAqY21kMzI7CisJaW50IHJjOworCisJY21kMzIgPSBjb21wYXRfcHRyKGFyZyk7CisJY21kID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpjbWQpKTsKKworCXJjID0gZ2V0X2NvbXBhdF9jbWQoY21kLCBjbWQzMik7CisJaWYgKHJjKSB7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gdHJhbnNsYXRlZF9pb2N0bChmaWxlLCBDT01FRElfQ01ELCAodW5zaWduZWQgbG9uZyljbWQpOworfQorCisvKiBIYW5kbGUgMzItYml0IENPTUVESV9DTURURVNUIGlvY3RsLiAqLworc3RhdGljIGludCBjb21wYXRfY21kdGVzdChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJY29tZWRpX2NtZCBfX3VzZXIgKmNtZDsKKwljb21lZGkzMl9jbWQgX191c2VyICpjbWQzMjsKKwlpbnQgcmMsIGVycjsKKworCWNtZDMyID0gY29tcGF0X3B0cihhcmcpOworCWNtZCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqY21kKSk7CisKKwlyYyA9IGdldF9jb21wYXRfY21kKGNtZCwgY21kMzIpOworCWlmIChyYykgeworCQlyZXR1cm4gcmM7CisJfQorCisJcmMgPSB0cmFuc2xhdGVkX2lvY3RsKGZpbGUsIENPTUVESV9DTURURVNULCAodW5zaWduZWQgbG9uZyljbWQpOworCWlmIChyYyA8IDApIHsKKwkJcmV0dXJuIHJjOworCX0KKworCWVyciA9IHB1dF9jb21wYXRfY21kKGNtZDMyLCBjbWQpOworCWlmIChlcnIpIHsKKwkJcmMgPSBlcnI7CisJfQorCXJldHVybiByYzsKK30KKworLyogQ29weSAzMi1iaXQgaW5zbiBzdHJ1Y3R1cmUgdG8gbmF0aXZlIGluc24gc3RydWN0dXJlLiAqLworc3RhdGljIGludCBnZXRfY29tcGF0X2luc24oY29tZWRpX2luc24gX191c2VyICppbnNuLAorCQljb21lZGkzMl9pbnNuIF9fdXNlciAqaW5zbjMyKQoreworCWludCBlcnI7CisJdW5pb24geworCQl1bnNpZ25lZCBpbnQgdWludDsKKwkJY29tcGF0X3VwdHJfdCB1cHRyOworCX0gdGVtcDsKKworCS8qIENvcHkgaW5zbiBzdHJ1Y3R1cmUuICBJZ25vcmUgdGhlIHVudXNlZCBtZW1iZXJzLiAqLworCWVyciA9IDA7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGluc24zMiwgc2l6ZW9mKCppbnNuMzIpKQorCQkJfHwgIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGluc24sIHNpemVvZigqaW5zbikpKSB7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVpbnQsICZpbnNuMzItPmluc24pOworCWVyciB8PSBfX3B1dF91c2VyKHRlbXAudWludCwgJmluc24tPmluc24pOworCWVyciB8PSBfX2dldF91c2VyKHRlbXAudWludCwgJmluc24zMi0+bik7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcC51aW50LCAmaW5zbi0+bik7CisJZXJyIHw9IF9fZ2V0X3VzZXIodGVtcC51cHRyLCAmaW5zbjMyLT5kYXRhKTsKKwllcnIgfD0gX19wdXRfdXNlcihjb21wYXRfcHRyKHRlbXAudXB0ciksICZpbnNuLT5kYXRhKTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVpbnQsICZpbnNuMzItPnN1YmRldik7CisJZXJyIHw9IF9fcHV0X3VzZXIodGVtcC51aW50LCAmaW5zbi0+c3ViZGV2KTsKKwllcnIgfD0gX19nZXRfdXNlcih0ZW1wLnVpbnQsICZpbnNuMzItPmNoYW5zcGVjKTsKKwllcnIgfD0gX19wdXRfdXNlcih0ZW1wLnVpbnQsICZpbnNuLT5jaGFuc3BlYyk7CisJcmV0dXJuIGVyciA/IC1FRkFVTFQgOiAwOworfQorCisvKiBIYW5kbGUgMzItYml0IENPTUVESV9JTlNOTElTVCBpb2N0bC4gKi8KK3N0YXRpYyBpbnQgY29tcGF0X2luc25saXN0KHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgY29tYmluZWRfaW5zbmxpc3QgeworCQljb21lZGlfaW5zbmxpc3QgaW5zbmxpc3Q7CisJCWNvbWVkaV9pbnNuIGluc25bMV07CisJfSBfX3VzZXIgKnM7CisJY29tZWRpMzJfaW5zbmxpc3QgX191c2VyICppbnNubGlzdDMyOworCWNvbWVkaTMyX2luc24gX191c2VyICppbnNuMzI7CisJY29tcGF0X3VwdHJfdCB1cHRyOworCXVuc2lnbmVkIGludCBuX2luc25zLCBuOworCWludCBlcnIsIHJjOworCisJaW5zbmxpc3QzMiA9IGNvbXBhdF9wdHIoYXJnKTsKKworCS8qIEdldCAzMi1iaXQgaW5zbmxpc3Qgc3RydWN0dXJlLiAgKi8KKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgaW5zbmxpc3QzMiwgc2l6ZW9mKCppbnNubGlzdDMyKSkpIHsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWVyciA9IDA7CisJZXJyIHw9IF9fZ2V0X3VzZXIobl9pbnNucywgJmluc25saXN0MzItPm5faW5zbnMpOworCWVyciB8PSBfX2dldF91c2VyKHVwdHIsICZpbnNubGlzdDMyLT5pbnNucyk7CisJaW5zbjMyID0gY29tcGF0X3B0cih1cHRyKTsKKwlpZiAoZXJyKSB7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCS8qIEFsbG9jYXRlIHVzZXIgbWVtb3J5IHRvIGNvcHkgaW5zbmxpc3QgYW5kIGluc25zIGludG8uICovCisJcyA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKG9mZnNldG9mKHN0cnVjdCBjb21iaW5lZF9pbnNubGlzdCwKKwkJCQlpbnNuW25faW5zbnNdKSk7CisKKwkvKiBTZXQgbmF0aXZlIGluc25saXN0IHN0cnVjdHVyZS4gKi8KKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsICZzLT5pbnNubGlzdCwgc2l6ZW9mKHMtPmluc25saXN0KSkpIHsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWVyciB8PSBfX3B1dF91c2VyKG5faW5zbnMsICZzLT5pbnNubGlzdC5uX2luc25zKTsKKwllcnIgfD0gX19wdXRfdXNlcigmcy0+aW5zblswXSwgJnMtPmluc25saXN0Lmluc25zKTsKKwlpZiAoZXJyKSB7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCS8qIENvcHkgaW5zbiBzdHJ1Y3R1cmVzLiAqLworCWZvciAobiA9IDA7IG4gPCBuX2luc25zOyBuKyspIHsKKwkJcmMgPSBnZXRfY29tcGF0X2luc24oJnMtPmluc25bbl0sICZpbnNuMzJbbl0pOworCQlpZiAocmMpIHsKKwkJCXJldHVybiByYzsKKwkJfQorCX0KKworCXJldHVybiB0cmFuc2xhdGVkX2lvY3RsKGZpbGUsIENPTUVESV9JTlNOTElTVCwKKwkJCSh1bnNpZ25lZCBsb25nKSZzLT5pbnNubGlzdCk7Cit9CisKKy8qIEhhbmRsZSAzMi1iaXQgQ09NRURJX0lOU04gaW9jdGwuICovCitzdGF0aWMgaW50IGNvbXBhdF9pbnNuKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwljb21lZGlfaW5zbiBfX3VzZXIgKmluc247CisJY29tZWRpMzJfaW5zbiBfX3VzZXIgKmluc24zMjsKKwlpbnQgcmM7CisKKwlpbnNuMzIgPSBjb21wYXRfcHRyKGFyZyk7CisJaW5zbiA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqaW5zbikpOworCisJcmMgPSBnZXRfY29tcGF0X2luc24oaW5zbiwgaW5zbjMyKTsKKwlpZiAocmMpIHsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiB0cmFuc2xhdGVkX2lvY3RsKGZpbGUsIENPTUVESV9JTlNOLCAodW5zaWduZWQgbG9uZylpbnNuKTsKK30KKworLyogUHJvY2VzcyB1bnRyYW5zbGF0ZWQgaW9jdGwuICovCisvKiBSZXR1cm5zIC1FTk9JT0NUTENNRCBmb3IgdW5yZWNvZ25pc2VkIGlvY3RsIGNvZGVzLiAqLworc3RhdGljIGlubGluZSBpbnQgcmF3X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgcmM7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQ09NRURJX0RFVkNPTkZJRzoKKwljYXNlIENPTUVESV9ERVZJTkZPOgorCWNhc2UgQ09NRURJX1NVQkRJTkZPOgorCWNhc2UgQ09NRURJX0JVRkNPTkZJRzoKKwljYXNlIENPTUVESV9CVUZJTkZPOgorCQkvKiBKdXN0IG5lZWQgdG8gdHJhbnNsYXRlIHRoZSBwb2ludGVyIGFyZ3VtZW50LiAqLworCQlhcmcgPSAodW5zaWduZWQgbG9uZyljb21wYXRfcHRyKGFyZyk7CisJCXJjID0gdHJhbnNsYXRlZF9pb2N0bChmaWxlLCBjbWQsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgQ09NRURJX0xPQ0s6CisJY2FzZSBDT01FRElfVU5MT0NLOgorCWNhc2UgQ09NRURJX0NBTkNFTDoKKwljYXNlIENPTUVESV9QT0xMOgorCQkvKiBObyB0cmFuc2xhdGlvbiBuZWVkZWQuICovCisJCXJjID0gdHJhbnNsYXRlZF9pb2N0bChmaWxlLCBjbWQsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgQ09NRURJMzJfQ0hBTklORk86CisJCXJjID0gY29tcGF0X2NoYW5pbmZvKGZpbGUsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgQ09NRURJMzJfUkFOR0VJTkZPOgorCQlyYyA9IGNvbXBhdF9yYW5nZWluZm8oZmlsZSwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBDT01FREkzMl9DTUQ6CisJCXJjID0gY29tcGF0X2NtZChmaWxlLCBhcmcpOworCQlicmVhazsKKwljYXNlIENPTUVESTMyX0NNRFRFU1Q6CisJCXJjID0gY29tcGF0X2NtZHRlc3QoZmlsZSwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBDT01FREkzMl9JTlNOTElTVDoKKwkJcmMgPSBjb21wYXRfaW5zbmxpc3QoZmlsZSwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBDT01FREkzMl9JTlNOOgorCQlyYyA9IGNvbXBhdF9pbnNuKGZpbGUsIGFyZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJjID0gLUVOT0lPQ1RMQ01EOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJjOworfQorCisjaWZkZWYgSEFWRV9DT01QQVRfSU9DVEwJLyogZGVmaW5lZCBpbiA8bGludXgvZnMuaD4gMi42LjExIG9ud2FyZHMgKi8KKworLyogY29tcGF0X2lvY3RsIGZpbGUgb3BlcmF0aW9uLiAqLworLyogUmV0dXJucyAtRU5PSU9DVExDTUQgZm9yIHVucmVjb2duaXNlZCBpb2N0bCBjb2Rlcy4gKi8KK2xvbmcgY29tZWRpX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIHJhd19pb2N0bChmaWxlLCBjbWQsIGFyZyk7Cit9CisKKyNlbHNlIC8qIEhBVkVfQ09NUEFUX0lPQ1RMICovCisKKy8qCisgKiBCcmFpbi1kZWFkIGlvY3RsIGNvbXBhdGliaWxpdHkgZm9yIDIuNi4xMCBhbmQgZWFybGllci4KKyAqCisgKiBJdCdzIGJyYWluLWRlYWQgYmVjYXVzZSBjbWQgbnVtYmVycyBuZWVkIHRvIGJlIHVuaXF1ZSBzeXN0ZW0td2lkZSEKKyAqIFRoZSBjb21lZGkgZHJpdmVyIGNvdWxkIGVuZCB1cCBhdHRlbXB0aW5nIHRvIGV4ZWN1dGUgaW9jdGxzIGZvciBub24tQ29tZWRpCisgKiBkZXZpY2VzIGJlY2F1c2UgaXQgcmVnaXN0ZXJlZCB0aGUgc3lzdGVtLXdpZGUgY21kIGNvZGUgZmlyc3QuICBTaW1pbGFybHksCisgKiBhbm90aGVyIGRyaXZlciBjb3VsZCBlbmQgdXAgYXR0ZW1wdGluZyB0byBleGVjdXRlIGlvY3RscyBmb3IgYSBDb21lZGkKKyAqIGRldmljZSBiZWNhdXNlIGl0IHJlZ2lzdGVyZWQgdGhlIGNtZCBjb2RlIGZpcnN0LiAgQ2hhb3MgZW5zdWVzLgorICovCisKKy8qIEhhbmRsZXIgZm9yIGFsbCAzMi1iaXQgaW9jdGwgY29kZXMgcmVnaXN0ZXJlZCBieSB0aGlzIGRyaXZlci4gKi8KK3N0YXRpYyBpbnQgbWFwcGVkX2lvY3RsKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcsCisJCXN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCByYzsKKworCS8qIE1ha2Ugc3VyZSB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgQ29tZWRpIGRldmljZS4gKi8KKwlpZiAoaW1ham9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKSAhPSBDT01FRElfTUFKT1IpIHsKKwkJcmV0dXJuIC1FTk9UVFk7CisJfQorCXJjID0gcmF3X2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKKwkvKiBEbyBub3QgcmV0dXJuIC1FTk9JT0NUTENNRC4gKi8KKwlpZiAocmMgPT0gLUVOT0lPQ1RMQ01EKSB7CisJCXJjID0gLUVOT1RUWTsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdHJ1Y3QgaW9jdGwzMl9tYXAgeworCXVuc2lnbmVkIGludCBjbWQ7CisJaW50ICgqaGFuZGxlcikodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcsCisJCQlzdHJ1Y3QgZmlsZSAqKTsKKwlpbnQgcmVnaXN0ZXJlZDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW9jdGwzMl9tYXAgY29tZWRpX2lvY3RsMzJfbWFwW10gPSB7CisJeyBDT01FRElfREVWQ09ORklHLCBtYXBwZWRfaW9jdGwsIDAgfSwKKwl7IENPTUVESV9ERVZJTkZPLCBtYXBwZWRfaW9jdGwsIDAgfSwKKwl7IENPTUVESV9TVUJESU5GTywgbWFwcGVkX2lvY3RsLCAwIH0sCisJeyBDT01FRElfQlVGQ09ORklHLCBtYXBwZWRfaW9jdGwsIDAgfSwKKwl7IENPTUVESV9CVUZJTkZPLCBtYXBwZWRfaW9jdGwsIDAgfSwKKwl7IENPTUVESV9MT0NLLCBtYXBwZWRfaW9jdGwsIDAgfSwKKwl7IENPTUVESV9VTkxPQ0ssIG1hcHBlZF9pb2N0bCwgMCB9LAorCXsgQ09NRURJX0NBTkNFTCwgbWFwcGVkX2lvY3RsLCAwIH0sCisJeyBDT01FRElfUE9MTCwgbWFwcGVkX2lvY3RsLCAwIH0sCisJeyBDT01FREkzMl9DSEFOSU5GTywgbWFwcGVkX2lvY3RsLCAwIH0sCisJeyBDT01FREkzMl9SQU5HRUlORk8sIG1hcHBlZF9pb2N0bCwgMCB9LAorCXsgQ09NRURJMzJfQ01ELCBtYXBwZWRfaW9jdGwsIDAgfSwKKwl7IENPTUVESTMyX0NNRFRFU1QsIG1hcHBlZF9pb2N0bCwgMCB9LAorCXsgQ09NRURJMzJfSU5TTkxJU1QsIG1hcHBlZF9pb2N0bCwgMCB9LAorCXsgQ09NRURJMzJfSU5TTiwgbWFwcGVkX2lvY3RsLCAwIH0sCit9OworCisjZGVmaW5lIE5VTV9JT0NUTDMyX01BUFMgQVJSQVlfU0laRShjb21lZGlfaW9jdGwzMl9tYXApCisKKy8qIFJlZ2lzdGVyIHN5c3RlbS13aWRlIDMyLWJpdCBpb2N0bCBoYW5kbGVycy4gKi8KK3ZvaWQgY29tZWRpX3JlZ2lzdGVyX2lvY3RsMzIodm9pZCkKK3sKKwlpbnQgbiwgcmM7CisKKwlmb3IgKG4gPSAwOyBuIDwgTlVNX0lPQ1RMMzJfTUFQUzsgbisrKSB7CisJCXJjID0gcmVnaXN0ZXJfaW9jdGwzMl9jb252ZXJzaW9uKGNvbWVkaV9pb2N0bDMyX21hcFtuXS5jbWQsCisJCQkJY29tZWRpX2lvY3RsMzJfbWFwW25dLmhhbmRsZXIpOworCQlpZiAocmMpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkJImNvbWVkaTogZmFpbGVkIHRvIHJlZ2lzdGVyIDMyLWJpdCAiCisJCQkJCSJjb21wYXRpYmxlIGlvY3RsIGhhbmRsZXIgZm9yIDB4JVggLSAiCisJCQkJCSJleHBlY3QgYmFkIHRoaW5ncyB0byBoYXBwZW4hXG4iLAorCQkJCQljb21lZGlfaW9jdGwzMl9tYXBbbl0uY21kKTsKKwkJfQorCQljb21lZGlfaW9jdGwzMl9tYXBbbl0ucmVnaXN0ZXJlZCA9ICFyYzsKKwl9Cit9CisKKy8qIFVucmVnaXN0ZXIgc3lzdGVtLXdpZGUgMzItYml0IGlvY3RsIHRyYW5zbGF0aW9ucy4gKi8KK3ZvaWQgY29tZWRpX3VucmVnaXN0ZXJfaW9jdGwzMih2b2lkKQoreworCWludCBuLCByYzsKKworCWZvciAobiA9IDA7IG4gPCBOVU1fSU9DVEwzMl9NQVBTOyBuKyspIHsKKwkJaWYgKGNvbWVkaV9pb2N0bDMyX21hcFtuXS5yZWdpc3RlcmVkKSB7CisJCQlyYyA9IHVucmVnaXN0ZXJfaW9jdGwzMl9jb252ZXJzaW9uKAorCQkJCQljb21lZGlfaW9jdGwzMl9tYXBbbl0uY21kLAorCQkJCQljb21lZGlfaW9jdGwzMl9tYXBbbl0uaGFuZGxlcik7CisJCQlpZiAocmMpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkJImNvbWVkaTogZmFpbGVkIHRvIHVucmVnaXN0ZXIgMzItYml0ICIKKwkJCQkJImNvbXBhdGlibGUgaW9jdGwgaGFuZGxlciBmb3IgMHglWCAtICIKKwkJCQkJImV4cGVjdCBrZXJuZWwgT29wcyFcbiIsCisJCQkJCWNvbWVkaV9pb2N0bDMyX21hcFtuXS5jbWQpOworCQkJfSBlbHNlIHsKKwkJCQljb21lZGlfaW9jdGwzMl9tYXBbbl0ucmVnaXN0ZXJlZCA9IDA7CisJCQl9CisJCX0KKwl9Cit9CisKKyNlbmRpZgkvKiBIQVZFX0NPTVBBVF9JT0NUTCAqLworCisjZW5kaWYJLyogQ09ORklHX0NPTVBBVCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfY29tcGF0MzIuaCBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2NvbXBhdDMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNhMDE2NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2NvbXBhdDMyLmgKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAgICBjb21lZGkvY29tZWRpX2NvbXBhdDMyLmgKKyAgICAzMi1iaXQgaW9jdGwgY29tcGF0aWJpbGl0eSBmb3IgNjQtYml0IGNvbWVkaSBrZXJuZWwgbW9kdWxlLgorCisgICAgQXV0aG9yOiBJYW4gQWJib3R0LCBNRVYgTHRkLiA8YWJib3R0aUBtZXYuY28udWs+CisgICAgQ29weXJpZ2h0IChDKSAyMDA3IE1FViBMdGQuIDxodHRwOi8vd3d3Lm1ldi5jby51ay8+CisKKyAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDcgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI2lmbmRlZiBfQ09NRURJX0NPTVBBVDMyX0gKKyNkZWZpbmUgX0NPTUVESV9DT01QQVQzMl9ICisKKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgkvKiBGb3IgSEFWRV9DT01QQVRfSU9DVEwgYW5kIEhBVkVfVU5MT0NLRURfSU9DVEwgKi8KKworI2lmZGVmIENPTkZJR19DT01QQVQKKworI2lmZGVmIEhBVkVfQ09NUEFUX0lPQ1RMCisKK2V4dGVybiBsb25nIGNvbWVkaV9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCXVuc2lnbmVkIGxvbmcgYXJnKTsKKyNkZWZpbmUgY29tZWRpX3JlZ2lzdGVyX2lvY3RsMzIoKSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgY29tZWRpX3VucmVnaXN0ZXJfaW9jdGwzMigpIGRvIHt9IHdoaWxlICgwKQorCisjZWxzZSAvKiBIQVZFX0NPTVBBVF9JT0NUTCAqLworCisjZGVmaW5lIGNvbWVkaV9jb21wYXRfaW9jdGwgMAkvKiBOVUxMICovCitleHRlcm4gdm9pZCBjb21lZGlfcmVnaXN0ZXJfaW9jdGwzMih2b2lkKTsKK2V4dGVybiB2b2lkIGNvbWVkaV91bnJlZ2lzdGVyX2lvY3RsMzIodm9pZCk7CisKKyNlbmRpZiAvKiBIQVZFX0NPTVBBVF9JT0NUTCAqLworCisjZWxzZSAvKiBDT05GSUdfQ09NUEFUICovCisKKyNkZWZpbmUgY29tZWRpX2NvbXBhdF9pb2N0bCAwCS8qIE5VTEwgKi8KKyNkZWZpbmUgY29tZWRpX3JlZ2lzdGVyX2lvY3RsMzIoKSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgY29tZWRpX3VucmVnaXN0ZXJfaW9jdGwzMigpIGRvIHt9IHdoaWxlICgwKQorCisjZW5kaWYgLyogQ09ORklHX0NPTVBBVCAqLworCisjZW5kaWYgLyogX0NPTUVESV9DT01QQVQzMl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9mb3BzLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9mb3BzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE4Yzk2NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2ZvcHMuYwpAQCAtMCwwICsxLDIyNDQgQEAKKy8qCisgICAgY29tZWRpL2NvbWVkaV9mb3BzLmMKKyAgICBjb21lZGkga2VybmVsIG1vZHVsZQorCisgICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDAwIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisKKyN1bmRlZiBERUJVRworCisjZGVmaW5lIF9fTk9fVkVSU0lPTl9fCisjaW5jbHVkZSAiY29tZWRpX2ZvcHMuaCIKKyNpbmNsdWRlICJjb21lZGlfY29tcGF0MzIuaCIKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSAiY29tZWRpZGV2LmgiCisjaW5jbHVkZSA8bGludXgvY2Rldi5oPgorCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisKKy8qICNpbmNsdWRlICJrdm1lbS5oIiAqLworCitNT0RVTEVfQVVUSE9SKCJodHRwOi8vd3d3LmNvbWVkaS5vcmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGNvcmUgbW9kdWxlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNpZmRlZiBDT05GSUdfQ09NRURJX0RFQlVHCitpbnQgY29tZWRpX2RlYnVnOworbW9kdWxlX3BhcmFtKGNvbWVkaV9kZWJ1ZywgaW50LCAwNjQ0KTsKKyNlbmRpZgorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGNvbWVkaV9maWxlX2luZm9fdGFibGVfbG9jayk7CitzdGF0aWMgc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvCisgICAgKmNvbWVkaV9maWxlX2luZm9fdGFibGVbQ09NRURJX05VTV9NSU5PUlNdOworCitzdGF0aWMgaW50IGRvX2RldmNvbmZpZ19pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9kZXZjb25maWcgKmFyZyk7CitzdGF0aWMgaW50IGRvX2J1ZmNvbmZpZ19pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIHZvaWQgKmFyZyk7CitzdGF0aWMgaW50IGRvX2RldmluZm9faW9jdGwoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfZGV2aW5mbyAqYXJnLAorCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBpbnQgZG9fc3ViZGluZm9faW9jdGwoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGluZm8gKmFyZywKKwkJCSAgICAgdm9pZCAqZmlsZSk7CitzdGF0aWMgaW50IGRvX2NoYW5pbmZvX2lvY3RsKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX2NoYW5pbmZvICphcmcpOworc3RhdGljIGludCBkb19idWZpbmZvX2lvY3RsKGNvbWVkaV9kZXZpY2UgKmRldiwgdm9pZCAqYXJnKTsKK3N0YXRpYyBpbnQgZG9fY21kX2lvY3RsKGNvbWVkaV9kZXZpY2UgKmRldiwgdm9pZCAqYXJnLCB2b2lkICpmaWxlKTsKK3N0YXRpYyBpbnQgZG9fbG9ja19pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBhcmcsIHZvaWQgKmZpbGUpOworc3RhdGljIGludCBkb191bmxvY2tfaW9jdGwoY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgYXJnLCB2b2lkICpmaWxlKTsKK3N0YXRpYyBpbnQgZG9fY2FuY2VsX2lvY3RsKGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGFyZywgdm9pZCAqZmlsZSk7CitzdGF0aWMgaW50IGRvX2NtZHRlc3RfaW9jdGwoY29tZWRpX2RldmljZSAqZGV2LCB2b2lkICphcmcsIHZvaWQgKmZpbGUpOworc3RhdGljIGludCBkb19pbnNubGlzdF9pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIHZvaWQgKmFyZywgdm9pZCAqZmlsZSk7CitzdGF0aWMgaW50IGRvX2luc25faW9jdGwoY29tZWRpX2RldmljZSAqZGV2LCB2b2lkICphcmcsIHZvaWQgKmZpbGUpOworc3RhdGljIGludCBkb19wb2xsX2lvY3RsKGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHN1YmQsIHZvaWQgKmZpbGUpOworCitleHRlcm4gdm9pZCBkb19iZWNvbWVfbm9uYnVzeShjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMpOworc3RhdGljIGludCBkb19jYW5jZWwoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzKTsKKworc3RhdGljIGludCBjb21lZGlfZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKmZpbGUsIGludCBvbik7CisKK3N0YXRpYyBpbnQgaXNfZGV2aWNlX2J1c3koY29tZWRpX2RldmljZSAqZGV2KTsKKworI2lmZGVmIEhBVkVfVU5MT0NLRURfSU9DVEwKK3N0YXRpYyBsb25nIGNvbWVkaV91bmxvY2tlZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgYXJnKQorI2Vsc2UKK3N0YXRpYyBpbnQgY29tZWRpX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCisjZW5kaWYKK3sKKwljb25zdCB1bnNpZ25lZCBtaW5vciA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICpkZXZfZmlsZV9pbmZvID0KKwkgICAgY29tZWRpX2dldF9kZXZpY2VfZmlsZV9pbmZvKG1pbm9yKTsKKwljb21lZGlfZGV2aWNlICpkZXYgPSBkZXZfZmlsZV9pbmZvLT5kZXZpY2U7CisJaW50IHJjOworCisJbXV0ZXhfbG9jaygmZGV2LT5tdXRleCk7CisKKwkvKiBEZXZpY2UgY29uZmlnIGlzIHNwZWNpYWwsIGJlY2F1c2UgaXQgbXVzdCB3b3JrIG9uCisJICogYW4gdW5jb25maWd1cmVkIGRldmljZS4gKi8KKwlpZiAoY21kID09IENPTUVESV9ERVZDT05GSUcpIHsKKwkJcmMgPSBkb19kZXZjb25maWdfaW9jdGwoZGV2LCAodm9pZCAqKWFyZyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoIWRldi0+YXR0YWNoZWQpIHsKKwkJRFBSSU5USygibm8gZHJpdmVyIGNvbmZpZ3VyZWQgb24gL2Rldi9jb21lZGklaVxuIiwgZGV2LT5taW5vcik7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBkb25lOworCX0KKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBDT01FRElfQlVGQ09ORklHOgorCQlyYyA9IGRvX2J1ZmNvbmZpZ19pb2N0bChkZXYsICh2b2lkICopYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBDT01FRElfREVWSU5GTzoKKwkJcmMgPSBkb19kZXZpbmZvX2lvY3RsKGRldiwgKHZvaWQgKilhcmcsIGZpbGUpOworCQlicmVhazsKKwljYXNlIENPTUVESV9TVUJESU5GTzoKKwkJcmMgPSBkb19zdWJkaW5mb19pb2N0bChkZXYsICh2b2lkICopYXJnLCBmaWxlKTsKKwkJYnJlYWs7CisJY2FzZSBDT01FRElfQ0hBTklORk86CisJCXJjID0gZG9fY2hhbmluZm9faW9jdGwoZGV2LCAodm9pZCAqKWFyZyk7CisJCWJyZWFrOworCWNhc2UgQ09NRURJX1JBTkdFSU5GTzoKKwkJcmMgPSBkb19yYW5nZWluZm9faW9jdGwoZGV2LCAodm9pZCAqKWFyZyk7CisJCWJyZWFrOworCWNhc2UgQ09NRURJX0JVRklORk86CisJCXJjID0gZG9fYnVmaW5mb19pb2N0bChkZXYsICh2b2lkICopYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBDT01FRElfTE9DSzoKKwkJcmMgPSBkb19sb2NrX2lvY3RsKGRldiwgYXJnLCBmaWxlKTsKKwkJYnJlYWs7CisJY2FzZSBDT01FRElfVU5MT0NLOgorCQlyYyA9IGRvX3VubG9ja19pb2N0bChkZXYsIGFyZywgZmlsZSk7CisJCWJyZWFrOworCWNhc2UgQ09NRURJX0NBTkNFTDoKKwkJcmMgPSBkb19jYW5jZWxfaW9jdGwoZGV2LCBhcmcsIGZpbGUpOworCQlicmVhazsKKwljYXNlIENPTUVESV9DTUQ6CisJCXJjID0gZG9fY21kX2lvY3RsKGRldiwgKHZvaWQgKilhcmcsIGZpbGUpOworCQlicmVhazsKKwljYXNlIENPTUVESV9DTURURVNUOgorCQlyYyA9IGRvX2NtZHRlc3RfaW9jdGwoZGV2LCAodm9pZCAqKWFyZywgZmlsZSk7CisJCWJyZWFrOworCWNhc2UgQ09NRURJX0lOU05MSVNUOgorCQlyYyA9IGRvX2luc25saXN0X2lvY3RsKGRldiwgKHZvaWQgKilhcmcsIGZpbGUpOworCQlicmVhazsKKwljYXNlIENPTUVESV9JTlNOOgorCQlyYyA9IGRvX2luc25faW9jdGwoZGV2LCAodm9pZCAqKWFyZywgZmlsZSk7CisJCWJyZWFrOworCWNhc2UgQ09NRURJX1BPTEw6CisJCXJjID0gZG9fcG9sbF9pb2N0bChkZXYsIGFyZywgZmlsZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJjID0gLUVOT1RUWTsKKwkJYnJlYWs7CisJfQorCitkb25lOgorCW11dGV4X3VubG9jaygmZGV2LT5tdXRleCk7CisJcmV0dXJuIHJjOworfQorCisvKgorCUNPTUVESV9ERVZDT05GSUcKKwlkZXZpY2UgY29uZmlnIGlvY3RsCisKKwlhcmc6CisJCXBvaW50ZXIgdG8gZGV2Y29uZmlnIHN0cnVjdHVyZQorCisJcmVhZHM6CisJCWRldmNvbmZpZyBzdHJ1Y3R1cmUgYXQgYXJnCisKKwl3cml0ZXM6CisJCW5vbmUKKyovCitzdGF0aWMgaW50IGRvX2RldmNvbmZpZ19pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9kZXZjb25maWcgKmFyZykKK3sKKwljb21lZGlfZGV2Y29uZmlnIGl0OworCWludCByZXQ7CisJdW5zaWduZWQgY2hhciAqYXV4X2RhdGEgPSBOVUxMOworCWludCBhdXhfbGVuOworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKGFyZyA9PSBOVUxMKSB7CisJCWlmIChpc19kZXZpY2VfYnVzeShkZXYpKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJaWYgKGRldi0+YXR0YWNoZWQpIHsKKwkJCXN0cnVjdCBtb2R1bGUgKmRyaXZlcl9tb2R1bGUgPSBkZXYtPmRyaXZlci0+bW9kdWxlOworCQkJY29tZWRpX2RldmljZV9kZXRhY2goZGV2KTsKKwkJCW1vZHVsZV9wdXQoZHJpdmVyX21vZHVsZSk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKCZpdCwgYXJnLCBzaXplb2YoY29tZWRpX2RldmNvbmZpZykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWl0LmJvYXJkX25hbWVbQ09NRURJX05BTUVMRU4gLSAxXSA9IDA7CisKKwlpZiAoY29tZWRpX2F1eF9kYXRhKGl0Lm9wdGlvbnMsIDApICYmCisJICAgIGl0Lm9wdGlvbnNbQ09NRURJX0RFVkNPTkZfQVVYX0RBVEFfTEVOR1RIXSkgeworCQlpbnQgYml0X3NoaWZ0OworCQlhdXhfbGVuID0gaXQub3B0aW9uc1tDT01FRElfREVWQ09ORl9BVVhfREFUQV9MRU5HVEhdOworCQlpZiAoYXV4X2xlbiA8IDApCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlhdXhfZGF0YSA9IHZtYWxsb2MoYXV4X2xlbik7CisJCWlmICghYXV4X2RhdGEpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoYXV4X2RhdGEsCisJCQkJICAgY29tZWRpX2F1eF9kYXRhKGl0Lm9wdGlvbnMsIDApLCBhdXhfbGVuKSkgeworCQkJdmZyZWUoYXV4X2RhdGEpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJaXQub3B0aW9uc1tDT01FRElfREVWQ09ORl9BVVhfREFUQV9MT10gPQorCQkgICAgKHVuc2lnbmVkIGxvbmcpYXV4X2RhdGE7CisJCWlmIChzaXplb2Yodm9pZCAqKSA+IHNpemVvZihpbnQpKSB7CisJCQliaXRfc2hpZnQgPSBzaXplb2YoaW50KSAqIDg7CisJCQlpdC5vcHRpb25zW0NPTUVESV9ERVZDT05GX0FVWF9EQVRBX0hJXSA9CisJCQkgICAgKCh1bnNpZ25lZCBsb25nKWF1eF9kYXRhKSA+PiBiaXRfc2hpZnQ7CisJCX0gZWxzZQorCQkJaXQub3B0aW9uc1tDT01FRElfREVWQ09ORl9BVVhfREFUQV9ISV0gPSAwOworCX0KKworCXJldCA9IGNvbWVkaV9kZXZpY2VfYXR0YWNoKGRldiwgJml0KTsKKwlpZiAocmV0ID09IDApIHsKKwkJaWYgKCF0cnlfbW9kdWxlX2dldChkZXYtPmRyaXZlci0+bW9kdWxlKSkgeworCQkJY29tZWRpX2RldmljZV9kZXRhY2goZGV2KTsKKwkJCXJldHVybiAtRU5PU1lTOworCQl9CisJfQorCisJaWYgKGF1eF9kYXRhKQorCQl2ZnJlZShhdXhfZGF0YSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorCUNPTUVESV9CVUZDT05GSUcKKwlidWZmZXIgY29uZmlndXJhdGlvbiBpb2N0bAorCisJYXJnOgorCQlwb2ludGVyIHRvIGJ1ZmNvbmZpZyBzdHJ1Y3R1cmUKKworCXJlYWRzOgorCQlidWZjb25maWcgYXQgYXJnCisKKwl3cml0ZXM6CisJCW1vZGlmaWVkIGJ1ZmNvbmZpZyBhdCBhcmcKKworKi8KK3N0YXRpYyBpbnQgZG9fYnVmY29uZmlnX2lvY3RsKGNvbWVkaV9kZXZpY2UgKmRldiwgdm9pZCAqYXJnKQoreworCWNvbWVkaV9idWZjb25maWcgYmM7CisJY29tZWRpX2FzeW5jICphc3luYzsKKwljb21lZGlfc3ViZGV2aWNlICpzOworCWludCByZXQgPSAwOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZiYywgYXJnLCBzaXplb2YoY29tZWRpX2J1ZmNvbmZpZykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChiYy5zdWJkZXZpY2UgPj0gZGV2LT5uX3N1YmRldmljZXMgfHwgYmMuc3ViZGV2aWNlIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgYmMuc3ViZGV2aWNlOworCWFzeW5jID0gcy0+YXN5bmM7CisKKwlpZiAoIWFzeW5jKSB7CisJCURQUklOVEsoInN1YmRldmljZSBkb2VzIG5vdCBoYXZlIGFzeW5jIGNhcGFiaWxpdHlcbiIpOworCQliYy5zaXplID0gMDsKKwkJYmMubWF4aW11bV9zaXplID0gMDsKKwkJZ290byBjb3B5YmFjazsKKwl9CisKKwlpZiAoYmMubWF4aW11bV9zaXplKSB7CisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJYXN5bmMtPm1heF9idWZzaXplID0gYmMubWF4aW11bV9zaXplOworCX0KKworCWlmIChiYy5zaXplKSB7CisJCWlmIChiYy5zaXplID4gYXN5bmMtPm1heF9idWZzaXplKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQlpZiAocy0+YnVzeSkgeworCQkJRFBSSU5USygic3ViZGV2aWNlIGlzIGJ1c3ksIGNhbm5vdCByZXNpemUgYnVmZmVyXG4iKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJaWYgKGFzeW5jLT5tbWFwX2NvdW50KSB7CisJCQlEUFJJTlRLKCJzdWJkZXZpY2UgaXMgbW1hcHBlZCwgY2Fubm90IHJlc2l6ZSBidWZmZXJcbiIpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCisJCWlmICghYXN5bmMtPnByZWFsbG9jX2J1ZikKKwkJCXJldHVybiAtRUlOVkFMOworCisJCS8qIG1ha2Ugc3VyZSBidWZmZXIgaXMgYW4gaW50ZWdyYWwgbnVtYmVyIG9mIHBhZ2VzCisJCSAqICh3ZSByb3VuZCB1cCkgKi8KKwkJYmMuc2l6ZSA9IChiYy5zaXplICsgUEFHRV9TSVpFIC0gMSkgJiBQQUdFX01BU0s7CisKKwkJcmV0ID0gY29tZWRpX2J1Zl9hbGxvYyhkZXYsIHMsIGJjLnNpemUpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJaWYgKHMtPmJ1Zl9jaGFuZ2UpIHsKKwkJCXJldCA9IHMtPmJ1Zl9jaGFuZ2UoZGV2LCBzLCBiYy5zaXplKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisJCX0KKworCQlEUFJJTlRLKCJjb21lZGklaSBzdWJkICVkIGJ1ZmZlciByZXNpemVkIHRvICVpIGJ5dGVzXG4iLAorCQkJZGV2LT5taW5vciwgYmMuc3ViZGV2aWNlLCBhc3luYy0+cHJlYWxsb2NfYnVmc3opOworCX0KKworCWJjLnNpemUgPSBhc3luYy0+cHJlYWxsb2NfYnVmc3o7CisJYmMubWF4aW11bV9zaXplID0gYXN5bmMtPm1heF9idWZzaXplOworCitjb3B5YmFjazoKKwlpZiAoY29weV90b191c2VyKGFyZywgJmJjLCBzaXplb2YoY29tZWRpX2J1ZmNvbmZpZykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCisvKgorCUNPTUVESV9ERVZJTkZPCisJZGV2aWNlIGluZm8gaW9jdGwKKworCWFyZzoKKwkJcG9pbnRlciB0byBkZXZpbmZvIHN0cnVjdHVyZQorCisJcmVhZHM6CisJCW5vbmUKKworCXdyaXRlczoKKwkJZGV2aW5mbyBzdHJ1Y3R1cmUKKworKi8KK3N0YXRpYyBpbnQgZG9fZGV2aW5mb19pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9kZXZpbmZvICphcmcsCisJCQkgICAgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJY29tZWRpX2RldmluZm8gZGV2aW5mbzsKKwljb25zdCB1bnNpZ25lZCBtaW5vciA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICpkZXZfZmlsZV9pbmZvID0KKwkgICAgY29tZWRpX2dldF9kZXZpY2VfZmlsZV9pbmZvKG1pbm9yKTsKKwljb21lZGlfc3ViZGV2aWNlICpyZWFkX3N1YmRldiA9CisJICAgIGNvbWVkaV9nZXRfcmVhZF9zdWJkZXZpY2UoZGV2X2ZpbGVfaW5mbyk7CisJY29tZWRpX3N1YmRldmljZSAqd3JpdGVfc3ViZGV2ID0KKwkgICAgY29tZWRpX2dldF93cml0ZV9zdWJkZXZpY2UoZGV2X2ZpbGVfaW5mbyk7CisKKwltZW1zZXQoJmRldmluZm8sIDAsIHNpemVvZihkZXZpbmZvKSk7CisKKwkvKiBmaWxsIGRldmluZm8gc3RydWN0dXJlICovCisJZGV2aW5mby52ZXJzaW9uX2NvZGUgPSBDT01FRElfVkVSU0lPTl9DT0RFOworCWRldmluZm8ubl9zdWJkZXZzID0gZGV2LT5uX3N1YmRldmljZXM7CisJbWVtY3B5KGRldmluZm8uZHJpdmVyX25hbWUsIGRldi0+ZHJpdmVyLT5kcml2ZXJfbmFtZSwgQ09NRURJX05BTUVMRU4pOworCW1lbWNweShkZXZpbmZvLmJvYXJkX25hbWUsIGRldi0+Ym9hcmRfbmFtZSwgQ09NRURJX05BTUVMRU4pOworCisJaWYgKHJlYWRfc3ViZGV2KQorCQlkZXZpbmZvLnJlYWRfc3ViZGV2aWNlID0gcmVhZF9zdWJkZXYgLSBkZXYtPnN1YmRldmljZXM7CisJZWxzZQorCQlkZXZpbmZvLnJlYWRfc3ViZGV2aWNlID0gLTE7CisKKwlpZiAod3JpdGVfc3ViZGV2KQorCQlkZXZpbmZvLndyaXRlX3N1YmRldmljZSA9IHdyaXRlX3N1YmRldiAtIGRldi0+c3ViZGV2aWNlczsKKwllbHNlCisJCWRldmluZm8ud3JpdGVfc3ViZGV2aWNlID0gLTE7CisKKwlpZiAoY29weV90b191c2VyKGFyZywgJmRldmluZm8sIHNpemVvZihjb21lZGlfZGV2aW5mbykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCisvKgorCUNPTUVESV9TVUJESU5GTworCXN1YmRldmljZSBpbmZvIGlvY3RsCisKKwlhcmc6CisJCXBvaW50ZXIgdG8gYXJyYXkgb2Ygc3ViZGV2aWNlIGluZm8gc3RydWN0dXJlcworCisJcmVhZHM6CisJCW5vbmUKKworCXdyaXRlczoKKwkJYXJyYXkgb2Ygc3ViZGV2aWNlIGluZm8gc3RydWN0dXJlcyBhdCBhcmcKKworKi8KK3N0YXRpYyBpbnQgZG9fc3ViZGluZm9faW9jdGwoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGluZm8gKmFyZywKKwkJCSAgICAgdm9pZCAqZmlsZSkKK3sKKwlpbnQgcmV0LCBpOworCWNvbWVkaV9zdWJkaW5mbyAqdG1wLCAqdXM7CisJY29tZWRpX3N1YmRldmljZSAqczsKKworCXRtcCA9IGtjYWxsb2MoZGV2LT5uX3N1YmRldmljZXMsIHNpemVvZihjb21lZGlfc3ViZGluZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRtcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBmaWxsIHN1YmRpbmZvIHN0cnVjdHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5uX3N1YmRldmljZXM7IGkrKykgeworCQlzID0gZGV2LT5zdWJkZXZpY2VzICsgaTsKKwkJdXMgPSB0bXAgKyBpOworCisJCXVzLT50eXBlID0gcy0+dHlwZTsKKwkJdXMtPm5fY2hhbiA9IHMtPm5fY2hhbjsKKwkJdXMtPnN1YmRfZmxhZ3MgPSBzLT5zdWJkZXZfZmxhZ3M7CisJCWlmIChjb21lZGlfZ2V0X3N1YmRldmljZV9ydW5mbGFncyhzKSAmIFNSRl9SVU5OSU5HKQorCQkJdXMtPnN1YmRfZmxhZ3MgfD0gU0RGX1JVTk5JTkc7CisjZGVmaW5lIFRJTUVSX25hbm9zZWMgNQkJLyogYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KKwkJdXMtPnRpbWVyX3R5cGUgPSBUSU1FUl9uYW5vc2VjOworCQl1cy0+bGVuX2NoYW5saXN0ID0gcy0+bGVuX2NoYW5saXN0OworCQl1cy0+bWF4ZGF0YSA9IHMtPm1heGRhdGE7CisJCWlmIChzLT5yYW5nZV90YWJsZSkgeworCQkJdXMtPnJhbmdlX3R5cGUgPQorCQkJICAgIChpIDw8IDI0KSB8ICgwIDw8IDE2KSB8IChzLT5yYW5nZV90YWJsZS0+bGVuZ3RoKTsKKwkJfSBlbHNlIHsKKwkJCXVzLT5yYW5nZV90eXBlID0gMDsJLyogWFhYICovCisJCX0KKwkJdXMtPmZsYWdzID0gcy0+ZmxhZ3M7CisKKwkJaWYgKHMtPmJ1c3kpCisJCQl1cy0+c3ViZF9mbGFncyB8PSBTREZfQlVTWTsKKwkJaWYgKHMtPmJ1c3kgPT0gZmlsZSkKKwkJCXVzLT5zdWJkX2ZsYWdzIHw9IFNERl9CVVNZX09XTkVSOworCQlpZiAocy0+bG9jaykKKwkJCXVzLT5zdWJkX2ZsYWdzIHw9IFNERl9MT0NLRUQ7CisJCWlmIChzLT5sb2NrID09IGZpbGUpCisJCQl1cy0+c3ViZF9mbGFncyB8PSBTREZfTE9DS19PV05FUjsKKwkJaWYgKCFzLT5tYXhkYXRhICYmIHMtPm1heGRhdGFfbGlzdCkKKwkJCXVzLT5zdWJkX2ZsYWdzIHw9IFNERl9NQVhEQVRBOworCQlpZiAocy0+ZmxhZ2xpc3QpCisJCQl1cy0+c3ViZF9mbGFncyB8PSBTREZfRkxBR1M7CisJCWlmIChzLT5yYW5nZV90YWJsZV9saXN0KQorCQkJdXMtPnN1YmRfZmxhZ3MgfD0gU0RGX1JBTkdFVFlQRTsKKwkJaWYgKHMtPmRvX2NtZCkKKwkJCXVzLT5zdWJkX2ZsYWdzIHw9IFNERl9DTUQ7CisKKwkJaWYgKHMtPmluc25fYml0cyAhPSAmaW5zbl9pbnZhbCkKKwkJCXVzLT5pbnNuX2JpdHNfc3VwcG9ydCA9IENPTUVESV9TVVBQT1JURUQ7CisJCWVsc2UKKwkJCXVzLT5pbnNuX2JpdHNfc3VwcG9ydCA9IENPTUVESV9VTlNVUFBPUlRFRDsKKworCQl1cy0+c2V0dGxpbmdfdGltZV8wID0gcy0+c2V0dGxpbmdfdGltZV8wOworCX0KKworCXJldCA9IGNvcHlfdG9fdXNlcihhcmcsIHRtcCwKKwkJCSAgIGRldi0+bl9zdWJkZXZpY2VzICogc2l6ZW9mKGNvbWVkaV9zdWJkaW5mbykpOworCisJa2ZyZWUodG1wKTsKKworCXJldHVybiByZXQgPyAtRUZBVUxUIDogMDsKK30KKworLyoKKwlDT01FRElfQ0hBTklORk8KKwlzdWJkZXZpY2UgaW5mbyBpb2N0bAorCisJYXJnOgorCQlwb2ludGVyIHRvIGNoYW5pbmZvIHN0cnVjdHVyZQorCisJcmVhZHM6CisJCWNoYW5pbmZvIHN0cnVjdHVyZSBhdCBhcmcKKworCXdyaXRlczoKKwkJYXJyYXlzIGF0IGVsZW1lbnRzIG9mIGNoYW5pbmZvIHN0cnVjdHVyZQorCisqLworc3RhdGljIGludCBkb19jaGFuaW5mb19pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9jaGFuaW5mbyAqYXJnKQoreworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisJY29tZWRpX2NoYW5pbmZvIGl0OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZpdCwgYXJnLCBzaXplb2YoY29tZWRpX2NoYW5pbmZvKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGl0LnN1YmRldiA+PSBkZXYtPm5fc3ViZGV2aWNlcykKKwkJcmV0dXJuIC1FSU5WQUw7CisJcyA9IGRldi0+c3ViZGV2aWNlcyArIGl0LnN1YmRldjsKKworCWlmIChpdC5tYXhkYXRhX2xpc3QpIHsKKwkJaWYgKHMtPm1heGRhdGEgfHwgIXMtPm1heGRhdGFfbGlzdCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoY29weV90b191c2VyKGl0Lm1heGRhdGFfbGlzdCwgcy0+bWF4ZGF0YV9saXN0LAorCQkJCSBzLT5uX2NoYW4gKiBzaXplb2YobHNhbXBsX3QpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmIChpdC5mbGFnbGlzdCkgeworCQlpZiAoIXMtPmZsYWdsaXN0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChjb3B5X3RvX3VzZXIoaXQuZmxhZ2xpc3QsIHMtPmZsYWdsaXN0LAorCQkJCSBzLT5uX2NoYW4gKiBzaXplb2YodW5zaWduZWQgaW50KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoaXQucmFuZ2VsaXN0KSB7CisJCWludCBpOworCisJCWlmICghcy0+cmFuZ2VfdGFibGVfbGlzdCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlmb3IgKGkgPSAwOyBpIDwgcy0+bl9jaGFuOyBpKyspIHsKKwkJCWludCB4OworCisJCQl4ID0gKGRldi0+bWlub3IgPDwgMjgpIHwgKGl0LnN1YmRldiA8PCAyNCkgfCAoaSA8PCAxNikgfAorCQkJICAgIChzLT5yYW5nZV90YWJsZV9saXN0W2ldLT5sZW5ndGgpOworCQkJcHV0X3VzZXIoeCwgaXQucmFuZ2VsaXN0ICsgaSk7CisJCX0KKyNpZiAwCisJCWlmIChjb3B5X3RvX3VzZXIoaXQucmFuZ2VsaXN0LCBzLT5yYW5nZV90eXBlX2xpc3QsCisJCQkJIHMtPm5fY2hhbipzaXplb2YodW5zaWduZWQgaW50KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKyNlbmRpZgorCX0KKworCXJldHVybiAwOworfQorCisgLyoKKyAgICBDT01FRElfQlVGSU5GTworICAgIGJ1ZmZlciBpbmZvcm1hdGlvbiBpb2N0bAorCisgICAgYXJnOgorICAgIHBvaW50ZXIgdG8gYnVmaW5mbyBzdHJ1Y3R1cmUKKworICAgIHJlYWRzOgorICAgIGJ1ZmluZm8gYXQgYXJnCisKKyAgICB3cml0ZXM6CisgICAgbW9kaWZpZWQgYnVmaW5mbyBhdCBhcmcKKworICAqLworc3RhdGljIGludCBkb19idWZpbmZvX2lvY3RsKGNvbWVkaV9kZXZpY2UgKmRldiwgdm9pZCAqYXJnKQoreworCWNvbWVkaV9idWZpbmZvIGJpOworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisJY29tZWRpX2FzeW5jICphc3luYzsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmYmksIGFyZywgc2l6ZW9mKGNvbWVkaV9idWZpbmZvKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGJpLnN1YmRldmljZSA+PSBkZXYtPm5fc3ViZGV2aWNlcyB8fCBiaS5zdWJkZXZpY2UgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXMgPSBkZXYtPnN1YmRldmljZXMgKyBiaS5zdWJkZXZpY2U7CisJYXN5bmMgPSBzLT5hc3luYzsKKworCWlmICghYXN5bmMpIHsKKwkJRFBSSU5USygic3ViZGV2aWNlIGRvZXMgbm90IGhhdmUgYXN5bmMgY2FwYWJpbGl0eVxuIik7CisJCWJpLmJ1Zl93cml0ZV9wdHIgPSAwOworCQliaS5idWZfcmVhZF9wdHIgPSAwOworCQliaS5idWZfd3JpdGVfY291bnQgPSAwOworCQliaS5idWZfcmVhZF9jb3VudCA9IDA7CisJCWdvdG8gY29weWJhY2s7CisJfQorCisJaWYgKGJpLmJ5dGVzX3JlYWQgJiYgKHMtPnN1YmRldl9mbGFncyAmIFNERl9DTURfUkVBRCkpIHsKKwkJYmkuYnl0ZXNfcmVhZCA9IGNvbWVkaV9idWZfcmVhZF9hbGxvYyhhc3luYywgYmkuYnl0ZXNfcmVhZCk7CisJCWNvbWVkaV9idWZfcmVhZF9mcmVlKGFzeW5jLCBiaS5ieXRlc19yZWFkKTsKKworCQlpZiAoIShjb21lZGlfZ2V0X3N1YmRldmljZV9ydW5mbGFncyhzKSAmIChTUkZfRVJST1IgfAorCQkJCQkJCSAgU1JGX1JVTk5JTkcpKQorCQkgICAgJiYgYXN5bmMtPmJ1Zl93cml0ZV9jb3VudCA9PSBhc3luYy0+YnVmX3JlYWRfY291bnQpIHsKKwkJCWRvX2JlY29tZV9ub25idXN5KGRldiwgcyk7CisJCX0KKwl9CisKKwlpZiAoYmkuYnl0ZXNfd3JpdHRlbiAmJiAocy0+c3ViZGV2X2ZsYWdzICYgU0RGX0NNRF9XUklURSkpIHsKKwkJYmkuYnl0ZXNfd3JpdHRlbiA9CisJCSAgICBjb21lZGlfYnVmX3dyaXRlX2FsbG9jKGFzeW5jLCBiaS5ieXRlc193cml0dGVuKTsKKwkJY29tZWRpX2J1Zl93cml0ZV9mcmVlKGFzeW5jLCBiaS5ieXRlc193cml0dGVuKTsKKwl9CisKKwliaS5idWZfd3JpdGVfY291bnQgPSBhc3luYy0+YnVmX3dyaXRlX2NvdW50OworCWJpLmJ1Zl93cml0ZV9wdHIgPSBhc3luYy0+YnVmX3dyaXRlX3B0cjsKKwliaS5idWZfcmVhZF9jb3VudCA9IGFzeW5jLT5idWZfcmVhZF9jb3VudDsKKwliaS5idWZfcmVhZF9wdHIgPSBhc3luYy0+YnVmX3JlYWRfcHRyOworCitjb3B5YmFjazoKKwlpZiAoY29weV90b191c2VyKGFyZywgJmJpLCBzaXplb2YoY29tZWRpX2J1ZmluZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV9pbnNuKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhLAorCQkgICAgICB2b2lkICpmaWxlKTsKKy8qCisgKiAJQ09NRURJX0lOU05MSVNUCisgKiAJc3luY2hyb25vdXMgaW5zdHJ1Y3Rpb25zCisgKgorICogCWFyZzoKKyAqIAkJcG9pbnRlciB0byBzeW5jIGNtZCBzdHJ1Y3R1cmUKKyAqCisgKiAJcmVhZHM6CisgKiAJCXN5bmMgY21kIHN0cnVjdCBhdCBhcmcKKyAqIAkJaW5zdHJ1Y3Rpb24gbGlzdAorICogCQlkYXRhIChmb3Igd3JpdGVzKQorICoKKyAqIAl3cml0ZXM6CisgKiAJCWRhdGEgKGZvciByZWFkcykKKyAqLworLyogYXJiaXRyYXJ5IGxpbWl0cyAqLworI2RlZmluZSBNQVhfU0FNUExFUyAyNTYKK3N0YXRpYyBpbnQgZG9faW5zbmxpc3RfaW9jdGwoY29tZWRpX2RldmljZSAqZGV2LCB2b2lkICphcmcsIHZvaWQgKmZpbGUpCit7CisJY29tZWRpX2luc25saXN0IGluc25saXN0OworCWNvbWVkaV9pbnNuICppbnNucyA9IE5VTEw7CisJbHNhbXBsX3QgKmRhdGEgPSBOVUxMOworCWludCBpID0gMDsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmaW5zbmxpc3QsIGFyZywgc2l6ZW9mKGNvbWVkaV9pbnNubGlzdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRhdGEgPSBrbWFsbG9jKHNpemVvZihsc2FtcGxfdCkgKiBNQVhfU0FNUExFUywgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKSB7CisJCURQUklOVEsoImttYWxsb2MgZmFpbGVkXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpbnNucyA9IGttYWxsb2Moc2l6ZW9mKGNvbWVkaV9pbnNuKSAqIGluc25saXN0Lm5faW5zbnMsIEdGUF9LRVJORUwpOworCWlmICghaW5zbnMpIHsKKwkJRFBSSU5USygia21hbGxvYyBmYWlsZWRcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcihpbnNucywgaW5zbmxpc3QuaW5zbnMsCisJCQkgICBzaXplb2YoY29tZWRpX2luc24pICogaW5zbmxpc3Qubl9pbnNucykpIHsKKwkJRFBSSU5USygiY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iKTsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5zbmxpc3Qubl9pbnNuczsgaSsrKSB7CisJCWlmIChpbnNuc1tpXS5uID4gTUFYX1NBTVBMRVMpIHsKKwkJCURQUklOVEsoIm51bWJlciBvZiBzYW1wbGVzIHRvbyBsYXJnZVxuIik7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlpZiAoaW5zbnNbaV0uaW5zbiAmIElOU05fTUFTS19XUklURSkgeworCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRhdGEsIGluc25zW2ldLmRhdGEsCisJCQkJCSAgIGluc25zW2ldLm4gKiBzaXplb2YobHNhbXBsX3QpKSkgeworCQkJCURQUklOVEsoImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7CisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCQl9CisJCXJldCA9IHBhcnNlX2luc24oZGV2LCBpbnNucyArIGksIGRhdGEsIGZpbGUpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWlmIChpbnNuc1tpXS5pbnNuICYgSU5TTl9NQVNLX1JFQUQpIHsKKwkJCWlmIChjb3B5X3RvX3VzZXIoaW5zbnNbaV0uZGF0YSwgZGF0YSwKKwkJCQkJIGluc25zW2ldLm4gKiBzaXplb2YobHNhbXBsX3QpKSkgeworCQkJCURQUklOVEsoImNvcHlfdG9fdXNlciBmYWlsZWRcbiIpOworCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJfQorCQlpZiAobmVlZF9yZXNjaGVkKCkpCisJCQlzY2hlZHVsZSgpOworCX0KKworZXJyb3I6CisJa2ZyZWUoaW5zbnMpOworCWtmcmVlKGRhdGEpOworCisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfaW5zbl9jb25maWdfbGVuZ3RoKGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwlpZiAoaW5zbi0+biA8IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChkYXRhWzBdKSB7CisJY2FzZSBJTlNOX0NPTkZJR19ESU9fT1VUUFVUOgorCWNhc2UgSU5TTl9DT05GSUdfRElPX0lOUFVUOgorCWNhc2UgSU5TTl9DT05GSUdfRElTQVJNOgorCWNhc2UgSU5TTl9DT05GSUdfUkVTRVQ6CisJCWlmIChpbnNuLT5uID09IDEpCisJCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJY2FzZSBJTlNOX0NPTkZJR19BUk06CisJY2FzZSBJTlNOX0NPTkZJR19ESU9fUVVFUlk6CisJY2FzZSBJTlNOX0NPTkZJR19CTE9DS19TSVpFOgorCWNhc2UgSU5TTl9DT05GSUdfRklMVEVSOgorCWNhc2UgSU5TTl9DT05GSUdfU0VSSUFMX0NMT0NLOgorCWNhc2UgSU5TTl9DT05GSUdfQklESVJFQ1RJT05BTF9EQVRBOgorCWNhc2UgSU5TTl9DT05GSUdfQUxUX1NPVVJDRToKKwljYXNlIElOU05fQ09ORklHX1NFVF9DT1VOVEVSX01PREU6CisJY2FzZSBJTlNOX0NPTkZJR184MjU0X1JFQURfU1RBVFVTOgorCWNhc2UgSU5TTl9DT05GSUdfU0VUX1JPVVRJTkc6CisJY2FzZSBJTlNOX0NPTkZJR19HRVRfUk9VVElORzoKKwljYXNlIElOU05fQ09ORklHX0dFVF9QV01fU1RBVFVTOgorCWNhc2UgSU5TTl9DT05GSUdfUFdNX1NFVF9QRVJJT0Q6CisJY2FzZSBJTlNOX0NPTkZJR19QV01fR0VUX1BFUklPRDoKKwkJaWYgKGluc24tPm4gPT0gMikKKwkJCXJldHVybiAwOworCQlicmVhazsKKwljYXNlIElOU05fQ09ORklHX1NFVF9HQVRFX1NSQzoKKwljYXNlIElOU05fQ09ORklHX0dFVF9HQVRFX1NSQzoKKwljYXNlIElOU05fQ09ORklHX1NFVF9DTE9DS19TUkM6CisJY2FzZSBJTlNOX0NPTkZJR19HRVRfQ0xPQ0tfU1JDOgorCWNhc2UgSU5TTl9DT05GSUdfU0VUX09USEVSX1NSQzoKKwljYXNlIElOU05fQ09ORklHX0dFVF9DT1VOVEVSX1NUQVRVUzoKKwljYXNlIElOU05fQ09ORklHX1BXTV9TRVRfSF9CUklER0U6CisJY2FzZSBJTlNOX0NPTkZJR19QV01fR0VUX0hfQlJJREdFOgorCWNhc2UgSU5TTl9DT05GSUdfR0VUX0hBUkRXQVJFX0JVRkZFUl9TSVpFOgorCQlpZiAoaW5zbi0+biA9PSAzKQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCWNhc2UgSU5TTl9DT05GSUdfUFdNX09VVFBVVDoKKwljYXNlIElOU05fQ09ORklHX0FOQUxPR19UUklHOgorCQlpZiAoaW5zbi0+biA9PSA1KQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCS8qIGJ5IGRlZmF1bHQgd2UgYWxsb3cgdGhlIGluc24gc2luY2Ugd2UgZG9uJ3QgaGF2ZSBjaGVja3MgZm9yCisJICogYWxsIHBvc3NpYmxlIGNhc2VzIHlldCAqLworCWRlZmF1bHQ6CisJCXJ0X3ByaW50aygiY29tZWRpOiBubyBjaGVjayBmb3IgZGF0YSBsZW5ndGggb2YgY29uZmlnIGluc24gaWQgIgorCQkJICAiJWkgaXMgaW1wbGVtZW50ZWQuXG4iCisJCQkgICIgQWRkIGEgY2hlY2sgdG8gJXMgaW4gJXMuXG4iCisJCQkgICIgQXNzdW1pbmcgbj0laSBpcyBjb3JyZWN0LlxuIiwgZGF0YVswXSwgX19mdW5jX18sCisJCQkgIF9fRklMRV9fLCBpbnNuLT5uKTsKKwkJcmV0dXJuIDA7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBwYXJzZV9pbnNuKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhLAorCQkgICAgICB2b2lkICpmaWxlKQoreworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisJaW50IHJldCA9IDA7CisJaW50IGk7CisKKwlpZiAoaW5zbi0+aW5zbiAmIElOU05fTUFTS19TUEVDSUFMKSB7CisJCS8qIGEgbm9uLXN1YmRldmljZSBpbnN0cnVjdGlvbiAqLworCisJCXN3aXRjaCAoaW5zbi0+aW5zbikgeworCQljYXNlIElOU05fR1RPRDoKKwkJCXsKKwkJCQlzdHJ1Y3QgdGltZXZhbCB0djsKKworCQkJCWlmIChpbnNuLT5uICE9IDIpIHsKKwkJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJZG9fZ2V0dGltZW9mZGF5KCZ0dik7CisJCQkJZGF0YVswXSA9IHR2LnR2X3NlYzsKKwkJCQlkYXRhWzFdID0gdHYudHZfdXNlYzsKKwkJCQlyZXQgPSAyOworCisJCQkJYnJlYWs7CisJCQl9CisJCWNhc2UgSU5TTl9XQUlUOgorCQkJaWYgKGluc24tPm4gIT0gMSB8fCBkYXRhWzBdID49IDEwMDAwMCkgeworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCQl1ZGVsYXkoZGF0YVswXSAvIDEwMDApOworCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlIElOU05fSU5UVFJJRzoKKwkJCWlmIChpbnNuLT5uICE9IDEpIHsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGluc24tPnN1YmRldiA+PSBkZXYtPm5fc3ViZGV2aWNlcykgeworCQkJCURQUklOVEsoIiVkIG5vdCB1c2FibGUgc3ViZGV2aWNlXG4iLAorCQkJCQlpbnNuLT5zdWJkZXYpOworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzID0gZGV2LT5zdWJkZXZpY2VzICsgaW5zbi0+c3ViZGV2OworCQkJaWYgKCFzLT5hc3luYykgeworCQkJCURQUklOVEsoIm5vIGFzeW5jXG4iKTsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFzLT5hc3luYy0+aW50dHJpZykgeworCQkJCURQUklOVEsoIm5vIGludHRyaWdcbiIpOworCQkJCXJldCA9IC1FQUdBSU47CisJCQkJYnJlYWs7CisJCQl9CisJCQlyZXQgPSBzLT5hc3luYy0+aW50dHJpZyhkZXYsIHMsIGluc24tPmRhdGFbMF0pOworCQkJaWYgKHJldCA+PSAwKQorCQkJCXJldCA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURQUklOVEsoImludmFsaWQgaW5zblxuIik7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQkvKiBhIHN1YmRldmljZSBpbnN0cnVjdGlvbiAqLworCQlsc2FtcGxfdCBtYXhkYXRhOworCisJCWlmIChpbnNuLT5zdWJkZXYgPj0gZGV2LT5uX3N1YmRldmljZXMpIHsKKwkJCURQUklOVEsoInN1YmRldmljZSAlZCBvdXQgb2YgcmFuZ2VcbiIsIGluc24tPnN1YmRldik7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKwkJcyA9IGRldi0+c3ViZGV2aWNlcyArIGluc24tPnN1YmRldjsKKworCQlpZiAocy0+dHlwZSA9PSBDT01FRElfU1VCRF9VTlVTRUQpIHsKKwkJCURQUklOVEsoIiVkIG5vdCB1c2FibGUgc3ViZGV2aWNlXG4iLCBpbnNuLT5zdWJkZXYpOworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogYXJlIHdlIGxvY2tlZD8gKGlvY3RsIGxvY2spICovCisJCWlmIChzLT5sb2NrICYmIHMtPmxvY2sgIT0gZmlsZSkgeworCQkJRFBSSU5USygiZGV2aWNlIGxvY2tlZFxuIik7CisJCQlyZXQgPSAtRUFDQ0VTOworCQkJZ290byBvdXQ7CisJCX0KKworCQlyZXQgPSBjaGVja19jaGFubGlzdChzLCAxLCAmaW5zbi0+Y2hhbnNwZWMpOworCQlpZiAocmV0IDwgMCkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCURQUklOVEsoImJhZCBjaGFuc3BlY1xuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChzLT5idXN5KSB7CisJCQlyZXQgPSAtRUJVU1k7CisJCQlnb3RvIG91dDsKKwkJfQorCQkvKiBUaGlzIGxvb2tzIGFyYml0cmFyeS4gIEl0IGlzLiAqLworCQlzLT5idXN5ID0gJnBhcnNlX2luc247CisJCXN3aXRjaCAoaW5zbi0+aW5zbikgeworCQljYXNlIElOU05fUkVBRDoKKwkJCXJldCA9IHMtPmluc25fcmVhZChkZXYsIHMsIGluc24sIGRhdGEpOworCQkJYnJlYWs7CisJCWNhc2UgSU5TTl9XUklURToKKwkJCW1heGRhdGEgPSBzLT5tYXhkYXRhX2xpc3QKKwkJCSAgICA/IHMtPm1heGRhdGFfbGlzdFtDUl9DSEFOKGluc24tPmNoYW5zcGVjKV0KKwkJCSAgICA6IHMtPm1heGRhdGE7CisJCQlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgKytpKSB7CisJCQkJaWYgKGRhdGFbaV0gPiBtYXhkYXRhKSB7CisJCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJCURQUklOVEsoImJhZCBkYXRhIHZhbHVlKHMpXG4iKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJaWYgKHJldCA9PSAwKQorCQkJCXJldCA9IHMtPmluc25fd3JpdGUoZGV2LCBzLCBpbnNuLCBkYXRhKTsKKwkJCWJyZWFrOworCQljYXNlIElOU05fQklUUzoKKwkJCWlmIChpbnNuLT5uICE9IDIpIHsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCQkJcmV0ID0gcy0+aW5zbl9iaXRzKGRldiwgcywgaW5zbiwgZGF0YSk7CisJCQlicmVhazsKKwkJY2FzZSBJTlNOX0NPTkZJRzoKKwkJCXJldCA9IGNoZWNrX2luc25fY29uZmlnX2xlbmd0aChpbnNuLCBkYXRhKTsKKwkJCWlmIChyZXQpCisJCQkJYnJlYWs7CisJCQlyZXQgPSBzLT5pbnNuX2NvbmZpZyhkZXYsIHMsIGluc24sIGRhdGEpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKworCQlzLT5idXN5ID0gTlVMTDsKKwl9CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogCUNPTUVESV9JTlNOCisgKiAJc3luY2hyb25vdXMgaW5zdHJ1Y3Rpb25zCisgKgorICogCWFyZzoKKyAqIAkJcG9pbnRlciB0byBpbnNuCisgKgorICogCXJlYWRzOgorICogCQljb21lZGlfaW5zbiBzdHJ1Y3QgYXQgYXJnCisgKiAJCWRhdGEgKGZvciB3cml0ZXMpCisgKgorICogCXdyaXRlczoKKyAqIAkJZGF0YSAoZm9yIHJlYWRzKQorICovCitzdGF0aWMgaW50IGRvX2luc25faW9jdGwoY29tZWRpX2RldmljZSAqZGV2LCB2b2lkICphcmcsIHZvaWQgKmZpbGUpCit7CisJY29tZWRpX2luc24gaW5zbjsKKwlsc2FtcGxfdCAqZGF0YSA9IE5VTEw7CisJaW50IHJldCA9IDA7CisKKwlkYXRhID0ga21hbGxvYyhzaXplb2YobHNhbXBsX3QpICogTUFYX1NBTVBMRVMsIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcigmaW5zbiwgYXJnLCBzaXplb2YoY29tZWRpX2luc24pKSkgeworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGVycm9yOworCX0KKworCS8qIFRoaXMgaXMgd2hlcmUgdGhlIGJlaGF2aW9yIG9mIGluc24gYW5kIGluc25saXN0IGRldmlhdGUuICovCisJaWYgKGluc24ubiA+IE1BWF9TQU1QTEVTKQorCQlpbnNuLm4gPSBNQVhfU0FNUExFUzsKKwlpZiAoaW5zbi5pbnNuICYgSU5TTl9NQVNLX1dSSVRFKSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcihkYXRhLCBpbnNuLmRhdGEsIGluc24ubiAqIHNpemVvZihsc2FtcGxfdCkpKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBlcnJvcjsKKwkJfQorCX0KKwlyZXQgPSBwYXJzZV9pbnNuKGRldiwgJmluc24sIGRhdGEsIGZpbGUpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCWlmIChpbnNuLmluc24gJiBJTlNOX01BU0tfUkVBRCkgeworCQlpZiAoY29weV90b191c2VyKGluc24uZGF0YSwgZGF0YSwgaW5zbi5uICogc2l6ZW9mKGxzYW1wbF90KSkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIGVycm9yOworCQl9CisJfQorCXJldCA9IGluc24ubjsKKworZXJyb3I6CisJa2ZyZWUoZGF0YSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorCUNPTUVESV9DTUQKKwljb21tYW5kIGlvY3RsCisKKwlhcmc6CisJCXBvaW50ZXIgdG8gY21kIHN0cnVjdHVyZQorCisJcmVhZHM6CisJCWNtZCBzdHJ1Y3R1cmUgYXQgYXJnCisJCWNoYW5uZWwvcmFuZ2UgbGlzdAorCisJd3JpdGVzOgorCQltb2RpZmllZCBjbWQgc3RydWN0dXJlIGF0IGFyZworCisqLworc3RhdGljIGludCBkb19jbWRfaW9jdGwoY29tZWRpX2RldmljZSAqZGV2LCB2b2lkICphcmcsIHZvaWQgKmZpbGUpCit7CisJY29tZWRpX2NtZCB1c2VyX2NtZDsKKwljb21lZGlfc3ViZGV2aWNlICpzOworCWNvbWVkaV9hc3luYyAqYXN5bmM7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgaW50ICpjaGFubGlzdF9zYXZlciA9IE5VTEw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnVzZXJfY21kLCBhcmcsIHNpemVvZihjb21lZGlfY21kKSkpIHsKKwkJRFBSSU5USygiYmFkIGNtZCBhZGRyZXNzXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCS8qIHNhdmUgdXNlcidzIGNoYW5saXN0IHBvaW50ZXIgc28gaXQgY2FuIGJlIHJlc3RvcmVkIGxhdGVyICovCisJY2hhbmxpc3Rfc2F2ZXIgPSB1c2VyX2NtZC5jaGFubGlzdDsKKworCWlmICh1c2VyX2NtZC5zdWJkZXYgPj0gZGV2LT5uX3N1YmRldmljZXMpIHsKKwkJRFBSSU5USygiJWQgbm8gc3VjaCBzdWJkZXZpY2VcbiIsIHVzZXJfY21kLnN1YmRldik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXMgPSBkZXYtPnN1YmRldmljZXMgKyB1c2VyX2NtZC5zdWJkZXY7CisJYXN5bmMgPSBzLT5hc3luYzsKKworCWlmIChzLT50eXBlID09IENPTUVESV9TVUJEX1VOVVNFRCkgeworCQlEUFJJTlRLKCIlZCBub3QgdmFsaWQgc3ViZGV2aWNlXG4iLCB1c2VyX2NtZC5zdWJkZXYpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAoIXMtPmRvX2NtZCB8fCAhcy0+ZG9fY21kdGVzdCB8fCAhcy0+YXN5bmMpIHsKKwkJRFBSSU5USygic3ViZGV2aWNlICVpIGRvZXMgbm90IHN1cHBvcnQgY29tbWFuZHNcbiIsCisJCQl1c2VyX2NtZC5zdWJkZXYpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBhcmUgd2UgbG9ja2VkPyAoaW9jdGwgbG9jaykgKi8KKwlpZiAocy0+bG9jayAmJiBzLT5sb2NrICE9IGZpbGUpIHsKKwkJRFBSSU5USygic3ViZGV2aWNlIGxvY2tlZFxuIik7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKworCS8qIGFyZSB3ZSBidXN5PyAqLworCWlmIChzLT5idXN5KSB7CisJCURQUklOVEsoInN1YmRldmljZSBidXN5XG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJcy0+YnVzeSA9IGZpbGU7CisKKwkvKiBtYWtlIHN1cmUgY2hhbm5lbC9nYWluIGxpc3QgaXNuJ3QgdG9vIGxvbmcgKi8KKwlpZiAodXNlcl9jbWQuY2hhbmxpc3RfbGVuID4gcy0+bGVuX2NoYW5saXN0KSB7CisJCURQUklOVEsoImNoYW5uZWwvZ2FpbiBsaXN0IHRvbyBsb25nICV1ID4gJWRcbiIsCisJCQl1c2VyX2NtZC5jaGFubGlzdF9sZW4sIHMtPmxlbl9jaGFubGlzdCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKiBtYWtlIHN1cmUgY2hhbm5lbC9nYWluIGxpc3QgaXNuJ3QgdG9vIHNob3J0ICovCisJaWYgKHVzZXJfY21kLmNoYW5saXN0X2xlbiA8IDEpIHsKKwkJRFBSSU5USygiY2hhbm5lbC9nYWluIGxpc3QgdG9vIHNob3J0ICV1IDwgMVxuIiwKKwkJCXVzZXJfY21kLmNoYW5saXN0X2xlbik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlrZnJlZShhc3luYy0+Y21kLmNoYW5saXN0KTsKKwlhc3luYy0+Y21kID0gdXNlcl9jbWQ7CisJYXN5bmMtPmNtZC5kYXRhID0gTlVMTDsKKwkvKiBsb2FkIGNoYW5uZWwvZ2FpbiBsaXN0ICovCisJYXN5bmMtPmNtZC5jaGFubGlzdCA9CisJICAgIGttYWxsb2MoYXN5bmMtPmNtZC5jaGFubGlzdF9sZW4gKiBzaXplb2YoaW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhc3luYy0+Y21kLmNoYW5saXN0KSB7CisJCURQUklOVEsoImFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcihhc3luYy0+Y21kLmNoYW5saXN0LCB1c2VyX2NtZC5jaGFubGlzdCwKKwkJCSAgIGFzeW5jLT5jbWQuY2hhbmxpc3RfbGVuICogc2l6ZW9mKGludCkpKSB7CisJCURQUklOVEsoImZhdWx0IHJlYWRpbmcgY2hhbmxpc3RcbiIpOworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJLyogbWFrZSBzdXJlIGVhY2ggZWxlbWVudCBpbiBjaGFubmVsL2dhaW4gbGlzdCBpcyB2YWxpZCAqLworCXJldCA9IGNoZWNrX2NoYW5saXN0KHMsIGFzeW5jLT5jbWQuY2hhbmxpc3RfbGVuLCBhc3luYy0+Y21kLmNoYW5saXN0KTsKKwlpZiAocmV0IDwgMCkgeworCQlEUFJJTlRLKCJiYWQgY2hhbmxpc3RcbiIpOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJcmV0ID0gcy0+ZG9fY21kdGVzdChkZXYsIHMsICZhc3luYy0+Y21kKTsKKworCWlmIChhc3luYy0+Y21kLmZsYWdzICYgVFJJR19CT0dVUyB8fCByZXQpIHsKKwkJRFBSSU5USygidGVzdCByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKwkJdXNlcl9jbWQgPSBhc3luYy0+Y21kOworCQkvKiByZXN0b3JlIGNoYW5saXN0IHBvaW50ZXIgYmVmb3JlIGNvcHlpbmcgYmFjayAqLworCQl1c2VyX2NtZC5jaGFubGlzdCA9IGNoYW5saXN0X3NhdmVyOworCQl1c2VyX2NtZC5kYXRhID0gTlVMTDsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZ1c2VyX2NtZCwgc2l6ZW9mKGNvbWVkaV9jbWQpKSkgeworCQkJRFBSSU5USygiZmF1bHQgd3JpdGluZyBjbWRcbiIpOworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCQlyZXQgPSAtRUFHQUlOOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJaWYgKCFhc3luYy0+cHJlYWxsb2NfYnVmc3opIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJRFBSSU5USygibm8gYnVmZmVyICg/KVxuIik7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwljb21lZGlfcmVzZXRfYXN5bmNfYnVmKGFzeW5jKTsKKworCWFzeW5jLT5jYl9tYXNrID0KKwkgICAgQ09NRURJX0NCX0VPQSB8IENPTUVESV9DQl9CTE9DSyB8IENPTUVESV9DQl9FUlJPUiB8CisJICAgIENPTUVESV9DQl9PVkVSRkxPVzsKKwlpZiAoYXN5bmMtPmNtZC5mbGFncyAmIFRSSUdfV0FLRV9FT1MpCisJCWFzeW5jLT5jYl9tYXNrIHw9IENPTUVESV9DQl9FT1M7CisKKwljb21lZGlfc2V0X3N1YmRldmljZV9ydW5mbGFncyhzLCB+MCwgU1JGX1VTRVIgfCBTUkZfUlVOTklORyk7CisKKyNpZmRlZiBDT05GSUdfQ09NRURJX1JUCisJaWYgKGFzeW5jLT5jbWQuZmxhZ3MgJiBUUklHX1JUKSB7CisJCWlmIChjb21lZGlfc3dpdGNoX3RvX3J0KGRldikgPT0gMCkKKwkJCWNvbWVkaV9zZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHMsIFNSRl9SVCwgU1JGX1JUKTsKKwl9CisjZW5kaWYKKworCXJldCA9IHMtPmRvX2NtZChkZXYsIHMpOworCWlmIChyZXQgPT0gMCkKKwkJcmV0dXJuIDA7CisKK2NsZWFudXA6CisJZG9fYmVjb21lX25vbmJ1c3koZGV2LCBzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisJQ09NRURJX0NNRFRFU1QKKwljb21tYW5kIHRlc3RpbmcgaW9jdGwKKworCWFyZzoKKwkJcG9pbnRlciB0byBjbWQgc3RydWN0dXJlCisKKwlyZWFkczoKKwkJY21kIHN0cnVjdHVyZSBhdCBhcmcKKwkJY2hhbm5lbC9yYW5nZSBsaXN0CisKKwl3cml0ZXM6CisJCW1vZGlmaWVkIGNtZCBzdHJ1Y3R1cmUgYXQgYXJnCisKKyovCitzdGF0aWMgaW50IGRvX2NtZHRlc3RfaW9jdGwoY29tZWRpX2RldmljZSAqZGV2LCB2b2lkICphcmcsIHZvaWQgKmZpbGUpCit7CisJY29tZWRpX2NtZCB1c2VyX2NtZDsKKwljb21lZGlfc3ViZGV2aWNlICpzOworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGludCAqY2hhbmxpc3QgPSBOVUxMOworCXVuc2lnbmVkIGludCAqY2hhbmxpc3Rfc2F2ZXIgPSBOVUxMOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ1c2VyX2NtZCwgYXJnLCBzaXplb2YoY29tZWRpX2NtZCkpKSB7CisJCURQUklOVEsoImJhZCBjbWQgYWRkcmVzc1xuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwkvKiBzYXZlIHVzZXIncyBjaGFubGlzdCBwb2ludGVyIHNvIGl0IGNhbiBiZSByZXN0b3JlZCBsYXRlciAqLworCWNoYW5saXN0X3NhdmVyID0gdXNlcl9jbWQuY2hhbmxpc3Q7CisKKwlpZiAodXNlcl9jbWQuc3ViZGV2ID49IGRldi0+bl9zdWJkZXZpY2VzKSB7CisJCURQUklOVEsoIiVkIG5vIHN1Y2ggc3ViZGV2aWNlXG4iLCB1c2VyX2NtZC5zdWJkZXYpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgdXNlcl9jbWQuc3ViZGV2OworCWlmIChzLT50eXBlID09IENPTUVESV9TVUJEX1VOVVNFRCkgeworCQlEUFJJTlRLKCIlZCBub3QgdmFsaWQgc3ViZGV2aWNlXG4iLCB1c2VyX2NtZC5zdWJkZXYpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAoIXMtPmRvX2NtZCB8fCAhcy0+ZG9fY21kdGVzdCkgeworCQlEUFJJTlRLKCJzdWJkZXZpY2UgJWkgZG9lcyBub3Qgc3VwcG9ydCBjb21tYW5kc1xuIiwKKwkJCXVzZXJfY21kLnN1YmRldik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIG1ha2Ugc3VyZSBjaGFubmVsL2dhaW4gbGlzdCBpc24ndCB0b28gbG9uZyAqLworCWlmICh1c2VyX2NtZC5jaGFubGlzdF9sZW4gPiBzLT5sZW5fY2hhbmxpc3QpIHsKKwkJRFBSSU5USygiY2hhbm5lbC9nYWluIGxpc3QgdG9vIGxvbmcgJWQgPiAlZFxuIiwKKwkJCXVzZXJfY21kLmNoYW5saXN0X2xlbiwgcy0+bGVuX2NoYW5saXN0KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qIGxvYWQgY2hhbm5lbC9nYWluIGxpc3QgKi8KKwlpZiAodXNlcl9jbWQuY2hhbmxpc3QpIHsKKwkJY2hhbmxpc3QgPQorCQkgICAga21hbGxvYyh1c2VyX2NtZC5jaGFubGlzdF9sZW4gKiBzaXplb2YoaW50KSwgR0ZQX0tFUk5FTCk7CisJCWlmICghY2hhbmxpc3QpIHsKKwkJCURQUklOVEsoImFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKworCQlpZiAoY29weV9mcm9tX3VzZXIoY2hhbmxpc3QsIHVzZXJfY21kLmNoYW5saXN0LAorCQkJCSAgIHVzZXJfY21kLmNoYW5saXN0X2xlbiAqIHNpemVvZihpbnQpKSkgeworCQkJRFBSSU5USygiZmF1bHQgcmVhZGluZyBjaGFubGlzdFxuIik7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBjbGVhbnVwOworCQl9CisKKwkJLyogbWFrZSBzdXJlIGVhY2ggZWxlbWVudCBpbiBjaGFubmVsL2dhaW4gbGlzdCBpcyB2YWxpZCAqLworCQlyZXQgPSBjaGVja19jaGFubGlzdChzLCB1c2VyX2NtZC5jaGFubGlzdF9sZW4sIGNoYW5saXN0KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCURQUklOVEsoImJhZCBjaGFubGlzdFxuIik7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKworCQl1c2VyX2NtZC5jaGFubGlzdCA9IGNoYW5saXN0OworCX0KKworCXJldCA9IHMtPmRvX2NtZHRlc3QoZGV2LCBzLCAmdXNlcl9jbWQpOworCisJLyogcmVzdG9yZSBjaGFubGlzdCBwb2ludGVyIGJlZm9yZSBjb3B5aW5nIGJhY2sgKi8KKwl1c2VyX2NtZC5jaGFubGlzdCA9IGNoYW5saXN0X3NhdmVyOworCisJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZ1c2VyX2NtZCwgc2l6ZW9mKGNvbWVkaV9jbWQpKSkgeworCQlEUFJJTlRLKCJiYWQgY21kIGFkZHJlc3NcbiIpOworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGNsZWFudXA7CisJfQorY2xlYW51cDoKKwlrZnJlZShjaGFubGlzdCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorCUNPTUVESV9MT0NLCisJbG9jayBzdWJkZXZpY2UKKworCWFyZzoKKwkJc3ViZGV2aWNlIG51bWJlcgorCisJcmVhZHM6CisJCW5vbmUKKworCXdyaXRlczoKKwkJbm9uZQorCisqLworCitzdGF0aWMgaW50IGRvX2xvY2tfaW9jdGwoY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgYXJnLCB2b2lkICpmaWxlKQoreworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJY29tZWRpX3N1YmRldmljZSAqczsKKworCWlmIChhcmcgPj0gZGV2LT5uX3N1YmRldmljZXMpCisJCXJldHVybiAtRUlOVkFMOworCXMgPSBkZXYtPnN1YmRldmljZXMgKyBhcmc7CisKKwljb21lZGlfc3Bpbl9sb2NrX2lycXNhdmUoJnMtPnNwaW5fbG9jaywgZmxhZ3MpOworCWlmIChzLT5idXN5IHx8IHMtPmxvY2spCisJCXJldCA9IC1FQlVTWTsKKwllbHNlCisJCXMtPmxvY2sgPSBmaWxlOworCWNvbWVkaV9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5zcGluX2xvY2ssIGZsYWdzKTsKKworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisjaWYgMAorCWlmIChzLT5sb2NrX2YpCisJCXJldCA9IHMtPmxvY2tfZihkZXYsIHMpOworI2VuZGlmCisKKwlyZXR1cm4gcmV0OworfQorCisvKgorCUNPTUVESV9VTkxPQ0sKKwl1bmxvY2sgc3ViZGV2aWNlCisKKwlhcmc6CisJCXN1YmRldmljZSBudW1iZXIKKworCXJlYWRzOgorCQlub25lCisKKwl3cml0ZXM6CisJCW5vbmUKKworCVRoaXMgZnVuY3Rpb24gaXNuJ3QgcHJvdGVjdGVkIGJ5IHRoZSBzZW1hcGhvcmUsIHNpbmNlCisJd2UgYWxyZWFkeSBvd24gdGhlIGxvY2suCisqLworc3RhdGljIGludCBkb191bmxvY2tfaW9jdGwoY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgYXJnLCB2b2lkICpmaWxlKQoreworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisKKwlpZiAoYXJnID49IGRldi0+bl9zdWJkZXZpY2VzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgYXJnOworCisJaWYgKHMtPmJ1c3kpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAocy0+bG9jayAmJiBzLT5sb2NrICE9IGZpbGUpCisJCXJldHVybiAtRUFDQ0VTOworCisJaWYgKHMtPmxvY2sgPT0gZmlsZSkgeworI2lmIDAKKwkJaWYgKHMtPnVubG9jaykKKwkJCXMtPnVubG9jayhkZXYsIHMpOworI2VuZGlmCisKKwkJcy0+bG9jayA9IE5VTEw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisJQ09NRURJX0NBTkNFTAorCWNhbmNlbCBhY3F1aXNpdGlvbiBpb2N0bAorCisJYXJnOgorCQlzdWJkZXZpY2UgbnVtYmVyCisKKwlyZWFkczoKKwkJbm90aGluZworCisJd3JpdGVzOgorCQlub3RoaW5nCisKKyovCitzdGF0aWMgaW50IGRvX2NhbmNlbF9pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBhcmcsIHZvaWQgKmZpbGUpCit7CisJY29tZWRpX3N1YmRldmljZSAqczsKKworCWlmIChhcmcgPj0gZGV2LT5uX3N1YmRldmljZXMpCisJCXJldHVybiAtRUlOVkFMOworCXMgPSBkZXYtPnN1YmRldmljZXMgKyBhcmc7CisJaWYgKHMtPmFzeW5jID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHMtPmxvY2sgJiYgcy0+bG9jayAhPSBmaWxlKQorCQlyZXR1cm4gLUVBQ0NFUzsKKworCWlmICghcy0+YnVzeSkKKwkJcmV0dXJuIDA7CisKKwlpZiAocy0+YnVzeSAhPSBmaWxlKQorCQlyZXR1cm4gLUVCVVNZOworCisJcmV0dXJuIGRvX2NhbmNlbChkZXYsIHMpOworfQorCisvKgorCUNPTUVESV9QT0xMIGlvY3RsCisJaW5zdHJ1Y3RzIGRyaXZlciB0byBzeW5jaHJvbml6ZSBidWZmZXJzCisKKwlhcmc6CisJCXN1YmRldmljZSBudW1iZXIKKworCXJlYWRzOgorCQlub3RoaW5nCisKKwl3cml0ZXM6CisJCW5vdGhpbmcKKworKi8KK3N0YXRpYyBpbnQgZG9fcG9sbF9pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBhcmcsIHZvaWQgKmZpbGUpCit7CisJY29tZWRpX3N1YmRldmljZSAqczsKKworCWlmIChhcmcgPj0gZGV2LT5uX3N1YmRldmljZXMpCisJCXJldHVybiAtRUlOVkFMOworCXMgPSBkZXYtPnN1YmRldmljZXMgKyBhcmc7CisKKwlpZiAocy0+bG9jayAmJiBzLT5sb2NrICE9IGZpbGUpCisJCXJldHVybiAtRUFDQ0VTOworCisJaWYgKCFzLT5idXN5KQorCQlyZXR1cm4gMDsKKworCWlmIChzLT5idXN5ICE9IGZpbGUpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAocy0+cG9sbCkKKwkJcmV0dXJuIHMtPnBvbGwoZGV2LCBzKTsKKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGRvX2NhbmNlbChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoKGNvbWVkaV9nZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHMpICYgU1JGX1JVTk5JTkcpICYmIHMtPmNhbmNlbCkKKwkJcmV0ID0gcy0+Y2FuY2VsKGRldiwgcyk7CisKKwlkb19iZWNvbWVfbm9uYnVzeShkZXYsIHMpOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBjb21lZGlfdW5tYXAoc3RydWN0IHZtX2FyZWFfc3RydWN0ICphcmVhKQoreworCWNvbWVkaV9hc3luYyAqYXN5bmM7CisJY29tZWRpX2RldmljZSAqZGV2OworCisJYXN5bmMgPSBhcmVhLT52bV9wcml2YXRlX2RhdGE7CisJZGV2ID0gYXN5bmMtPnN1YmRldmljZS0+ZGV2aWNlOworCisJbXV0ZXhfbG9jaygmZGV2LT5tdXRleCk7CisJYXN5bmMtPm1tYXBfY291bnQtLTsKKwltdXRleF91bmxvY2soJmRldi0+bXV0ZXgpOworfQorCitzdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGNvbWVkaV92bV9vcHMgPSB7CisJLmNsb3NlID0JY29tZWRpX3VubWFwLAorfTsKKworc3RhdGljIGludCBjb21lZGlfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJY29uc3QgdW5zaWduZWQgbWlub3IgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqZGV2X2ZpbGVfaW5mbyA9CisJICAgIGNvbWVkaV9nZXRfZGV2aWNlX2ZpbGVfaW5mbyhtaW5vcik7CisJY29tZWRpX2RldmljZSAqZGV2ID0gZGV2X2ZpbGVfaW5mby0+ZGV2aWNlOworCWNvbWVkaV9hc3luYyAqYXN5bmMgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSB2bWEtPnZtX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwlpbnQgbl9wYWdlczsKKwlpbnQgaTsKKwlpbnQgcmV0dmFsOworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisKKwltdXRleF9sb2NrKCZkZXYtPm11dGV4KTsKKwlpZiAoIWRldi0+YXR0YWNoZWQpIHsKKwkJRFBSSU5USygibm8gZHJpdmVyIGNvbmZpZ3VyZWQgb24gY29tZWRpJWlcbiIsIGRldi0+bWlub3IpOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGRvbmU7CisJfQorCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpCisJCXMgPSBjb21lZGlfZ2V0X3dyaXRlX3N1YmRldmljZShkZXZfZmlsZV9pbmZvKTsKKwllbHNlCisJCXMgPSBjb21lZGlfZ2V0X3JlYWRfc3ViZGV2aWNlKGRldl9maWxlX2luZm8pOworCisJaWYgKHMgPT0gTlVMTCkgeworCQlyZXR2YWwgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCWFzeW5jID0gcy0+YXN5bmM7CisJaWYgKGFzeW5jID09IE5VTEwpIHsKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmICh2bWEtPnZtX3Bnb2ZmICE9IDApIHsKKwkJRFBSSU5USygiY29tZWRpOiBtbWFwKCkgb2Zmc2V0IG11c3QgYmUgMC5cbiIpOworCQlyZXR2YWwgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKwlpZiAoc2l6ZSA+IGFzeW5jLT5wcmVhbGxvY19idWZzeikgeworCQlyZXR2YWwgPSAtRUZBVUxUOworCQlnb3RvIGRvbmU7CisJfQorCWlmIChzaXplICYgKH5QQUdFX01BU0spKSB7CisJCXJldHZhbCA9IC1FRkFVTFQ7CisJCWdvdG8gZG9uZTsKKwl9CisKKwluX3BhZ2VzID0gc2l6ZSA+PiBQQUdFX1NISUZUOworCWZvciAoaSA9IDA7IGkgPCBuX3BhZ2VzOyArK2kpIHsKKwkJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHN0YXJ0LAorCQkJCSAgICBwYWdlX3RvX3Bmbih2aXJ0X3RvX3BhZ2UoYXN5bmMtPgorCQkJCQkJCSAgICAgYnVmX3BhZ2VfbGlzdFtpXS4KKwkJCQkJCQkgICAgIHZpcnRfYWRkcikpLAorCQkJCSAgICBQQUdFX1NJWkUsIFBBR0VfU0hBUkVEKSkgeworCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQlzdGFydCArPSBQQUdFX1NJWkU7CisJfQorCisJdm1hLT52bV9vcHMgPSAmY29tZWRpX3ZtX29wczsKKwl2bWEtPnZtX3ByaXZhdGVfZGF0YSA9IGFzeW5jOworCisJYXN5bmMtPm1tYXBfY291bnQrKzsKKworCXJldHZhbCA9IDA7Citkb25lOgorCW11dGV4X3VubG9jaygmZGV2LT5tdXRleCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBjb21lZGlfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisJY29uc3QgdW5zaWduZWQgbWlub3IgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqZGV2X2ZpbGVfaW5mbyA9CisJICAgIGNvbWVkaV9nZXRfZGV2aWNlX2ZpbGVfaW5mbyhtaW5vcik7CisJY29tZWRpX2RldmljZSAqZGV2ID0gZGV2X2ZpbGVfaW5mby0+ZGV2aWNlOworCWNvbWVkaV9zdWJkZXZpY2UgKnJlYWRfc3ViZGV2OworCWNvbWVkaV9zdWJkZXZpY2UgKndyaXRlX3N1YmRldjsKKworCW11dGV4X2xvY2soJmRldi0+bXV0ZXgpOworCWlmICghZGV2LT5hdHRhY2hlZCkgeworCQlEUFJJTlRLKCJubyBkcml2ZXIgY29uZmlndXJlZCBvbiBjb21lZGklaVxuIiwgZGV2LT5taW5vcik7CisJCW11dGV4X3VubG9jaygmZGV2LT5tdXRleCk7CisJCXJldHVybiAwOworCX0KKworCW1hc2sgPSAwOworCXJlYWRfc3ViZGV2ID0gY29tZWRpX2dldF9yZWFkX3N1YmRldmljZShkZXZfZmlsZV9pbmZvKTsKKwlpZiAocmVhZF9zdWJkZXYpIHsKKwkJcG9sbF93YWl0KGZpbGUsICZyZWFkX3N1YmRldi0+YXN5bmMtPndhaXRfaGVhZCwgd2FpdCk7CisJCWlmICghcmVhZF9zdWJkZXYtPmJ1c3kKKwkJICAgIHx8IGNvbWVkaV9idWZfcmVhZF9uX2F2YWlsYWJsZShyZWFkX3N1YmRldi0+YXN5bmMpID4gMAorCQkgICAgfHwgIShjb21lZGlfZ2V0X3N1YmRldmljZV9ydW5mbGFncyhyZWFkX3N1YmRldikgJgorCQkJIFNSRl9SVU5OSU5HKSkgeworCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCQl9CisJfQorCXdyaXRlX3N1YmRldiA9IGNvbWVkaV9nZXRfd3JpdGVfc3ViZGV2aWNlKGRldl9maWxlX2luZm8pOworCWlmICh3cml0ZV9zdWJkZXYpIHsKKwkJcG9sbF93YWl0KGZpbGUsICZ3cml0ZV9zdWJkZXYtPmFzeW5jLT53YWl0X2hlYWQsIHdhaXQpOworCQljb21lZGlfYnVmX3dyaXRlX2FsbG9jKHdyaXRlX3N1YmRldi0+YXN5bmMsCisJCQkJICAgICAgIHdyaXRlX3N1YmRldi0+YXN5bmMtPnByZWFsbG9jX2J1ZnN6KTsKKwkJaWYgKCF3cml0ZV9zdWJkZXYtPmJ1c3kKKwkJICAgIHx8ICEoY29tZWRpX2dldF9zdWJkZXZpY2VfcnVuZmxhZ3Mod3JpdGVfc3ViZGV2KSAmCisJCQkgU1JGX1JVTk5JTkcpCisJCSAgICB8fCBjb21lZGlfYnVmX3dyaXRlX25fYWxsb2NhdGVkKHdyaXRlX3N1YmRldi0+YXN5bmMpID49CisJCSAgICBieXRlc19wZXJfc2FtcGxlKHdyaXRlX3N1YmRldi0+YXN5bmMtPnN1YmRldmljZSkpIHsKKwkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJCX0KKwl9CisKKwltdXRleF91bmxvY2soJmRldi0+bXV0ZXgpOworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgc3NpemVfdCBjb21lZGlfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IG5ieXRlcywKKwkJCSAgICBsb2ZmX3QgKm9mZnNldCkKK3sKKwljb21lZGlfc3ViZGV2aWNlICpzOworCWNvbWVkaV9hc3luYyAqYXN5bmM7CisJaW50IG4sIG0sIGNvdW50ID0gMCwgcmV0dmFsID0gMDsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwljb25zdCB1bnNpZ25lZCBtaW5vciA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICpkZXZfZmlsZV9pbmZvID0KKwkgICAgY29tZWRpX2dldF9kZXZpY2VfZmlsZV9pbmZvKG1pbm9yKTsKKwljb21lZGlfZGV2aWNlICpkZXYgPSBkZXZfZmlsZV9pbmZvLT5kZXZpY2U7CisKKwlpZiAoIWRldi0+YXR0YWNoZWQpIHsKKwkJRFBSSU5USygibm8gZHJpdmVyIGNvbmZpZ3VyZWQgb24gY29tZWRpJWlcbiIsIGRldi0+bWlub3IpOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGRvbmU7CisJfQorCisJcyA9IGNvbWVkaV9nZXRfd3JpdGVfc3ViZGV2aWNlKGRldl9maWxlX2luZm8pOworCWlmIChzID09IE5VTEwpIHsKKwkJcmV0dmFsID0gLUVJTzsKKwkJZ290byBkb25lOworCX0KKwlhc3luYyA9IHMtPmFzeW5jOworCisJaWYgKCFuYnl0ZXMpIHsKKwkJcmV0dmFsID0gMDsKKwkJZ290byBkb25lOworCX0KKwlpZiAoIXMtPmJ1c3kpIHsKKwkJcmV0dmFsID0gMDsKKwkJZ290byBkb25lOworCX0KKwlpZiAocy0+YnVzeSAhPSBmaWxlKSB7CisJCXJldHZhbCA9IC1FQUNDRVM7CisJCWdvdG8gZG9uZTsKKwl9CisJYWRkX3dhaXRfcXVldWUoJmFzeW5jLT53YWl0X2hlYWQsICZ3YWl0KTsKKwl3aGlsZSAobmJ5dGVzID4gMCAmJiAhcmV0dmFsKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisKKwkJbiA9IG5ieXRlczsKKworCQltID0gbjsKKwkJaWYgKGFzeW5jLT5idWZfd3JpdGVfcHRyICsgbSA+IGFzeW5jLT5wcmVhbGxvY19idWZzeikKKwkJCW0gPSBhc3luYy0+cHJlYWxsb2NfYnVmc3ogLSBhc3luYy0+YnVmX3dyaXRlX3B0cjsKKwkJY29tZWRpX2J1Zl93cml0ZV9hbGxvYyhhc3luYywgYXN5bmMtPnByZWFsbG9jX2J1ZnN6KTsKKwkJaWYgKG0gPiBjb21lZGlfYnVmX3dyaXRlX25fYWxsb2NhdGVkKGFzeW5jKSkKKwkJCW0gPSBjb21lZGlfYnVmX3dyaXRlX25fYWxsb2NhdGVkKGFzeW5jKTsKKwkJaWYgKG0gPCBuKQorCQkJbiA9IG07CisKKwkJaWYgKG4gPT0gMCkgeworCQkJaWYgKCEoY29tZWRpX2dldF9zdWJkZXZpY2VfcnVuZmxhZ3MocykgJiBTUkZfUlVOTklORykpIHsKKwkJCQlpZiAoY29tZWRpX2dldF9zdWJkZXZpY2VfcnVuZmxhZ3MocykgJgorCQkJCSAgICBTUkZfRVJST1IpIHsKKwkJCQkJcmV0dmFsID0gLUVQSVBFOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHZhbCA9IDA7CisJCQkJfQorCQkJCWRvX2JlY29tZV9ub25idXN5KGRldiwgcyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlyZXR2YWwgPSAtRUFHQUlOOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQkJCWJyZWFrOworCQkJfQorCQkJc2NoZWR1bGUoKTsKKwkJCWlmICghcy0+YnVzeSkKKwkJCQlicmVhazsKKwkJCWlmIChzLT5idXN5ICE9IGZpbGUpIHsKKwkJCQlyZXR2YWwgPSAtRUFDQ0VTOworCQkJCWJyZWFrOworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQltID0gY29weV9mcm9tX3VzZXIoYXN5bmMtPnByZWFsbG9jX2J1ZiArIGFzeW5jLT5idWZfd3JpdGVfcHRyLAorCQkJCSAgIGJ1Ziwgbik7CisJCWlmIChtKSB7CisJCQluIC09IG07CisJCQlyZXR2YWwgPSAtRUZBVUxUOworCQl9CisJCWNvbWVkaV9idWZfd3JpdGVfZnJlZShhc3luYywgbik7CisKKwkJY291bnQgKz0gbjsKKwkJbmJ5dGVzIC09IG47CisKKwkJYnVmICs9IG47CisJCWJyZWFrOwkJLyogbWFrZXMgZGV2aWNlIHdvcmsgbGlrZSBhIHBpcGUgKi8KKwl9CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmYXN5bmMtPndhaXRfaGVhZCwgJndhaXQpOworCitkb25lOgorCXJldHVybiBjb3VudCA/IGNvdW50IDogcmV0dmFsOworfQorCitzdGF0aWMgc3NpemVfdCBjb21lZGlfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3QgbmJ5dGVzLAorCQkJICAgbG9mZl90ICpvZmZzZXQpCit7CisJY29tZWRpX3N1YmRldmljZSAqczsKKwljb21lZGlfYXN5bmMgKmFzeW5jOworCWludCBuLCBtLCBjb3VudCA9IDAsIHJldHZhbCA9IDA7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJY29uc3QgdW5zaWduZWQgbWlub3IgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqZGV2X2ZpbGVfaW5mbyA9CisJICAgIGNvbWVkaV9nZXRfZGV2aWNlX2ZpbGVfaW5mbyhtaW5vcik7CisJY29tZWRpX2RldmljZSAqZGV2ID0gZGV2X2ZpbGVfaW5mby0+ZGV2aWNlOworCisJaWYgKCFkZXYtPmF0dGFjaGVkKSB7CisJCURQUklOVEsoIm5vIGRyaXZlciBjb25maWd1cmVkIG9uIGNvbWVkaSVpXG4iLCBkZXYtPm1pbm9yKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBkb25lOworCX0KKworCXMgPSBjb21lZGlfZ2V0X3JlYWRfc3ViZGV2aWNlKGRldl9maWxlX2luZm8pOworCWlmIChzID09IE5VTEwpIHsKKwkJcmV0dmFsID0gLUVJTzsKKwkJZ290byBkb25lOworCX0KKwlhc3luYyA9IHMtPmFzeW5jOworCWlmICghbmJ5dGVzKSB7CisJCXJldHZhbCA9IDA7CisJCWdvdG8gZG9uZTsKKwl9CisJaWYgKCFzLT5idXN5KSB7CisJCXJldHZhbCA9IDA7CisJCWdvdG8gZG9uZTsKKwl9CisJaWYgKHMtPmJ1c3kgIT0gZmlsZSkgeworCQlyZXR2YWwgPSAtRUFDQ0VTOworCQlnb3RvIGRvbmU7CisJfQorCisJYWRkX3dhaXRfcXVldWUoJmFzeW5jLT53YWl0X2hlYWQsICZ3YWl0KTsKKwl3aGlsZSAobmJ5dGVzID4gMCAmJiAhcmV0dmFsKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisKKwkJbiA9IG5ieXRlczsKKworCQltID0gY29tZWRpX2J1Zl9yZWFkX25fYXZhaWxhYmxlKGFzeW5jKTsKKwkJLyogcHJpbnRrKCIlZCBhdmFpbGFibGVcbiIsbSk7ICovCisJCWlmIChhc3luYy0+YnVmX3JlYWRfcHRyICsgbSA+IGFzeW5jLT5wcmVhbGxvY19idWZzeikKKwkJCW0gPSBhc3luYy0+cHJlYWxsb2NfYnVmc3ogLSBhc3luYy0+YnVmX3JlYWRfcHRyOworCQkvKiBwcmludGsoIiVkIGNvbnRpZ3VvdXNcbiIsbSk7ICovCisJCWlmIChtIDwgbikKKwkJCW4gPSBtOworCisJCWlmIChuID09IDApIHsKKwkJCWlmICghKGNvbWVkaV9nZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHMpICYgU1JGX1JVTk5JTkcpKSB7CisJCQkJZG9fYmVjb21lX25vbmJ1c3koZGV2LCBzKTsKKwkJCQlpZiAoY29tZWRpX2dldF9zdWJkZXZpY2VfcnVuZmxhZ3MocykgJgorCQkJCSAgICBTUkZfRVJST1IpIHsKKwkJCQkJcmV0dmFsID0gLUVQSVBFOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHZhbCA9IDA7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNjaGVkdWxlKCk7CisJCQlpZiAoIXMtPmJ1c3kpIHsKKwkJCQlyZXR2YWwgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHMtPmJ1c3kgIT0gZmlsZSkgeworCQkJCXJldHZhbCA9IC1FQUNDRVM7CisJCQkJYnJlYWs7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQltID0gY29weV90b191c2VyKGJ1ZiwgYXN5bmMtPnByZWFsbG9jX2J1ZiArCisJCQkJIGFzeW5jLT5idWZfcmVhZF9wdHIsIG4pOworCQlpZiAobSkgeworCQkJbiAtPSBtOworCQkJcmV0dmFsID0gLUVGQVVMVDsKKwkJfQorCisJCWNvbWVkaV9idWZfcmVhZF9hbGxvYyhhc3luYywgbik7CisJCWNvbWVkaV9idWZfcmVhZF9mcmVlKGFzeW5jLCBuKTsKKworCQljb3VudCArPSBuOworCQluYnl0ZXMgLT0gbjsKKworCQlidWYgKz0gbjsKKwkJYnJlYWs7CQkvKiBtYWtlcyBkZXZpY2Ugd29yayBsaWtlIGEgcGlwZSAqLworCX0KKwlpZiAoIShjb21lZGlfZ2V0X3N1YmRldmljZV9ydW5mbGFncyhzKSAmIChTUkZfRVJST1IgfCBTUkZfUlVOTklORykpICYmCisJICAgIGFzeW5jLT5idWZfcmVhZF9jb3VudCAtIGFzeW5jLT5idWZfd3JpdGVfY291bnQgPT0gMCkgeworCQlkb19iZWNvbWVfbm9uYnVzeShkZXYsIHMpOworCX0KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZhc3luYy0+d2FpdF9oZWFkLCAmd2FpdCk7CisKK2RvbmU6CisJcmV0dXJuIGNvdW50ID8gY291bnQgOiByZXR2YWw7Cit9CisKKy8qCisgICBUaGlzIGZ1bmN0aW9uIHJlc3RvcmVzIGEgc3ViZGV2aWNlIHRvIGFuIGlkbGUgc3RhdGUuCisgKi8KK3ZvaWQgZG9fYmVjb21lX25vbmJ1c3koY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzKQoreworCWNvbWVkaV9hc3luYyAqYXN5bmMgPSBzLT5hc3luYzsKKworCWNvbWVkaV9zZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHMsIFNSRl9SVU5OSU5HLCAwKTsKKyNpZmRlZiBDT05GSUdfQ09NRURJX1JUCisJaWYgKGNvbWVkaV9nZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHMpICYgU1JGX1JUKSB7CisJCWNvbWVkaV9zd2l0Y2hfdG9fbm9uX3J0KGRldik7CisJCWNvbWVkaV9zZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHMsIFNSRl9SVCwgMCk7CisJfQorI2VuZGlmCisJaWYgKGFzeW5jKSB7CisJCWNvbWVkaV9yZXNldF9hc3luY19idWYoYXN5bmMpOworCQlhc3luYy0+aW50dHJpZyA9IE5VTEw7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiQlVHOiAoPykgZG9fYmVjb21lX25vbmJ1c3kgY2FsbGVkIHdpdGggYXN5bmM9MFxuIik7CisJfQorCisJcy0+YnVzeSA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgY29tZWRpX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJY2hhciBtb2RbMzJdOworCWNvbnN0IHVuc2lnbmVkIG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlzdHJ1Y3QgY29tZWRpX2RldmljZV9maWxlX2luZm8gKmRldl9maWxlX2luZm8gPQorCSAgICBjb21lZGlfZ2V0X2RldmljZV9maWxlX2luZm8obWlub3IpOworCWNvbWVkaV9kZXZpY2UgKmRldiA9IGRldl9maWxlX2luZm8tPmRldmljZTsKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJRFBSSU5USygiaW52YWxpZCBtaW5vciBudW1iZXJcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBUaGlzIGlzIHNsaWdodGx5IGhhY2t5LCBidXQgd2Ugd2FudCBtb2R1bGUgYXV0b2xvYWRpbmcKKwkgKiB0byB3b3JrIGZvciByb290LgorCSAqIGNhc2U6IHVzZXIgb3BlbnMgZGV2aWNlLCBhdHRhY2hlZCAtPiBvaworCSAqIGNhc2U6IHVzZXIgb3BlbnMgZGV2aWNlLCB1bmF0dGFjaGVkLCBpbl9yZXF1ZXN0X21vZHVsZT0wIC0+IGF1dG9sb2FkCisJICogY2FzZTogdXNlciBvcGVucyBkZXZpY2UsIHVuYXR0YWNoZWQsIGluX3JlcXVlc3RfbW9kdWxlPTEgLT4gZmFpbAorCSAqIGNhc2U6IHJvb3Qgb3BlbnMgZGV2aWNlLCBhdHRhY2hlZCAtPiBvaworCSAqIGNhc2U6IHJvb3Qgb3BlbnMgZGV2aWNlLCB1bmF0dGFjaGVkLCBpbl9yZXF1ZXN0X21vZHVsZT0xIC0+IG9rCisJICogICAodHlwaWNhbGx5IGNhbGxlZCBmcm9tIG1vZHByb2JlKQorCSAqIGNhc2U6IHJvb3Qgb3BlbnMgZGV2aWNlLCB1bmF0dGFjaGVkLCBpbl9yZXF1ZXN0X21vZHVsZT0wIC0+IGF1dG9sb2FkCisJICoKKwkgKiBUaGUgbGFzdCBjb3VsZCBiZSBjaGFuZ2VkIHRvICItPiBvayIsIHdoaWNoIHdvdWxkIGRlbnkgcm9vdAorCSAqIGF1dG9sb2FkaW5nLgorCSAqLworCW11dGV4X2xvY2soJmRldi0+bXV0ZXgpOworCWlmIChkZXYtPmF0dGFjaGVkKQorCQlnb3RvIG9rOworCWlmICghY2FwYWJsZShDQVBfU1lTX01PRFVMRSkgJiYgZGV2LT5pbl9yZXF1ZXN0X21vZHVsZSkgeworCQlEUFJJTlRLKCJpbiByZXF1ZXN0IG1vZHVsZVxuIik7CisJCW11dGV4X3VubG9jaygmZGV2LT5tdXRleCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAoY2FwYWJsZShDQVBfU1lTX01PRFVMRSkgJiYgZGV2LT5pbl9yZXF1ZXN0X21vZHVsZSkKKwkJZ290byBvazsKKworCWRldi0+aW5fcmVxdWVzdF9tb2R1bGUgPSAxOworCisJc3ByaW50Zihtb2QsICJjaGFyLW1ham9yLSVpLSVpIiwgQ09NRURJX01BSk9SLCBkZXYtPm1pbm9yKTsKKyNpZmRlZiBDT05GSUdfS01PRAorCW11dGV4X3VubG9jaygmZGV2LT5tdXRleCk7CisJcmVxdWVzdF9tb2R1bGUobW9kKTsKKwltdXRleF9sb2NrKCZkZXYtPm11dGV4KTsKKyNlbmRpZgorCisJZGV2LT5pbl9yZXF1ZXN0X21vZHVsZSA9IDA7CisKKwlpZiAoIWRldi0+YXR0YWNoZWQgJiYgIWNhcGFibGUoQ0FQX1NZU19NT0RVTEUpKSB7CisJCURQUklOVEsoIm5vdCBhdHRhY2hlZCBhbmQgbm90IENBUF9TWVNfTU9EVUxFXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorb2s6CisJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKKworCWlmIChkZXYtPmF0dGFjaGVkKSB7CisJCWlmICghdHJ5X21vZHVsZV9nZXQoZGV2LT5kcml2ZXItPm1vZHVsZSkpIHsKKwkJCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworCQkJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKKwkJCXJldHVybiAtRU5PU1lTOworCQl9CisJfQorCisJaWYgKGRldi0+YXR0YWNoZWQgJiYgZGV2LT51c2VfY291bnQgPT0gMCAmJiBkZXYtPm9wZW4pCisJCWRldi0+b3BlbihkZXYpOworCisJZGV2LT51c2VfY291bnQrKzsKKworCW11dGV4X3VubG9jaygmZGV2LT5tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb21lZGlfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJY29uc3QgdW5zaWduZWQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCXN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqZGV2X2ZpbGVfaW5mbyA9CisJICAgIGNvbWVkaV9nZXRfZGV2aWNlX2ZpbGVfaW5mbyhtaW5vcik7CisJY29tZWRpX2RldmljZSAqZGV2ID0gZGV2X2ZpbGVfaW5mby0+ZGV2aWNlOworCWNvbWVkaV9zdWJkZXZpY2UgKnMgPSBOVUxMOworCWludCBpOworCisJbXV0ZXhfbG9jaygmZGV2LT5tdXRleCk7CisKKwlpZiAoZGV2LT5zdWJkZXZpY2VzKSB7CisJCWZvciAoaSA9IDA7IGkgPCBkZXYtPm5fc3ViZGV2aWNlczsgaSsrKSB7CisJCQlzID0gZGV2LT5zdWJkZXZpY2VzICsgaTsKKworCQkJaWYgKHMtPmJ1c3kgPT0gZmlsZSkKKwkJCQlkb19jYW5jZWwoZGV2LCBzKTsKKwkJCWlmIChzLT5sb2NrID09IGZpbGUpCisJCQkJcy0+bG9jayA9IE5VTEw7CisJCX0KKwl9CisJaWYgKGRldi0+YXR0YWNoZWQgJiYgZGV2LT51c2VfY291bnQgPT0gMSAmJiBkZXYtPmNsb3NlKQorCQlkZXYtPmNsb3NlKGRldik7CisKKwltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKKwlpZiAoZGV2LT5hdHRhY2hlZCkKKwkJbW9kdWxlX3B1dChkZXYtPmRyaXZlci0+bW9kdWxlKTsKKworCWRldi0+dXNlX2NvdW50LS07CisKKwltdXRleF91bmxvY2soJmRldi0+bXV0ZXgpOworCisJaWYgKGZpbGUtPmZfZmxhZ3MgJiBGQVNZTkMpCisJCWNvbWVkaV9mYXN5bmMoLTEsIGZpbGUsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29tZWRpX2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgb24pCit7CisJY29uc3QgdW5zaWduZWQgbWlub3IgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqZGV2X2ZpbGVfaW5mbyA9CisJICAgIGNvbWVkaV9nZXRfZGV2aWNlX2ZpbGVfaW5mbyhtaW5vcik7CisKKwljb21lZGlfZGV2aWNlICpkZXYgPSBkZXZfZmlsZV9pbmZvLT5kZXZpY2U7CisKKwlyZXR1cm4gZmFzeW5jX2hlbHBlcihmZCwgZmlsZSwgb24sICZkZXYtPmFzeW5jX3F1ZXVlKTsKK30KKworY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjb21lZGlfZm9wcyA9IHsKKyAgICAgIC5vd25lciA9CQlUSElTX01PRFVMRSwKKyNpZmRlZiBIQVZFX1VOTE9DS0VEX0lPQ1RMCisgICAgICAudW5sb2NrZWRfaW9jdGwgPQljb21lZGlfdW5sb2NrZWRfaW9jdGwsCisjZWxzZQorICAgICAgLmlvY3RsID0JCWNvbWVkaV9pb2N0bCwKKyNlbmRpZgorI2lmZGVmIEhBVkVfQ09NUEFUX0lPQ1RMCisgICAgICAuY29tcGF0X2lvY3RsID0JY29tZWRpX2NvbXBhdF9pb2N0bCwKKyNlbmRpZgorICAgICAgLm9wZW4gPQkJY29tZWRpX29wZW4sCisgICAgICAucmVsZWFzZSA9CWNvbWVkaV9jbG9zZSwKKyAgICAgIC5yZWFkID0JCWNvbWVkaV9yZWFkLAorICAgICAgLndyaXRlID0JCWNvbWVkaV93cml0ZSwKKyAgICAgIC5tbWFwID0JCWNvbWVkaV9tbWFwLAorICAgICAgLnBvbGwgPQkJY29tZWRpX3BvbGwsCisgICAgICAuZmFzeW5jID0JCWNvbWVkaV9mYXN5bmMsCit9OworCitzdHJ1Y3QgY2xhc3MgKmNvbWVkaV9jbGFzczsKK3N0YXRpYyBzdHJ1Y3QgY2RldiBjb21lZGlfY2RldjsKKworc3RhdGljIHZvaWQgY29tZWRpX2NsZWFudXBfbGVnYWN5X21pbm9ycyh2b2lkKQoreworCXVuc2lnbmVkIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ09NRURJX05VTV9MRUdBQ1lfTUlOT1JTOyBpKyspCisJCWNvbWVkaV9mcmVlX2JvYXJkX21pbm9yKGkpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBjb21lZGlfaW5pdCh2b2lkKQoreworCWludCBpOworCWludCByZXR2YWw7CisKKwlwcmludGsoS0VSTl9JTkZPICJjb21lZGk6IHZlcnNpb24gIiBDT01FRElfUkVMRUFTRQorCSAgICAgICAiIC0gaHR0cDovL3d3dy5jb21lZGkub3JnXG4iKTsKKworCW1lbXNldChjb21lZGlfZmlsZV9pbmZvX3RhYmxlLCAwLAorCSAgICAgICBzaXplb2Yoc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICopICogQ09NRURJX05VTV9NSU5PUlMpOworCisJcmV0dmFsID0gcmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihNS0RFVihDT01FRElfTUFKT1IsIDApLAorCQkJCQlDT01FRElfTlVNX01JTk9SUywgImNvbWVkaSIpOworCWlmIChyZXR2YWwpCisJCXJldHVybiAtRUlPOworCWNkZXZfaW5pdCgmY29tZWRpX2NkZXYsICZjb21lZGlfZm9wcyk7CisJY29tZWRpX2NkZXYub3duZXIgPSBUSElTX01PRFVMRTsKKwlrb2JqZWN0X3NldF9uYW1lKCZjb21lZGlfY2Rldi5rb2JqLCAiY29tZWRpIik7CisJaWYgKGNkZXZfYWRkKCZjb21lZGlfY2RldiwgTUtERVYoQ09NRURJX01BSk9SLCAwKSwgQ09NRURJX05VTV9NSU5PUlMpKSB7CisJCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihNS0RFVihDT01FRElfTUFKT1IsIDApLAorCQkJCQkgQ09NRURJX05VTV9NSU5PUlMpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJY29tZWRpX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAiY29tZWRpIik7CisJaWYgKElTX0VSUihjb21lZGlfY2xhc3MpKSB7CisJCXByaW50aygiY29tZWRpOiBmYWlsZWQgdG8gY3JlYXRlIGNsYXNzIik7CisJCWNkZXZfZGVsKCZjb21lZGlfY2Rldik7CisJCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihNS0RFVihDT01FRElfTUFKT1IsIDApLAorCQkJCQkgQ09NRURJX05VTV9NSU5PUlMpOworCQlyZXR1cm4gUFRSX0VSUihjb21lZGlfY2xhc3MpOworCX0KKworCS8qIFhYWCByZXF1aXJlcyAvcHJvYyBpbnRlcmZhY2UgKi8KKwljb21lZGlfcHJvY19pbml0KCk7CisKKwkvKiBjcmVhdGUgZGV2aWNlcyBmaWxlcyBmb3IgbGVnYWN5L21hbnVhbCB1c2UgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQ09NRURJX05VTV9MRUdBQ1lfTUlOT1JTOyBpKyspIHsKKwkJaW50IG1pbm9yOworCQltaW5vciA9IGNvbWVkaV9hbGxvY19ib2FyZF9taW5vcihOVUxMKTsKKwkJaWYgKG1pbm9yIDwgMCkgeworCQkJY29tZWRpX2NsZWFudXBfbGVnYWN5X21pbm9ycygpOworCQkJY2Rldl9kZWwoJmNvbWVkaV9jZGV2KTsKKwkJCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihNS0RFVihDT01FRElfTUFKT1IsIDApLAorCQkJCQkJIENPTUVESV9OVU1fTUlOT1JTKTsKKwkJCXJldHVybiBtaW5vcjsKKwkJfQorCX0KKworCWNvbWVkaV9ydF9pbml0KCk7CisKKwljb21lZGlfcmVnaXN0ZXJfaW9jdGwzMigpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjb21lZGlfY2xlYW51cCh2b2lkKQoreworCWludCBpOworCisJY29tZWRpX2NsZWFudXBfbGVnYWN5X21pbm9ycygpOworCWZvciAoaSA9IDA7IGkgPCBDT01FRElfTlVNX01JTk9SUzsgKytpKQorCQlCVUdfT04oY29tZWRpX2ZpbGVfaW5mb190YWJsZVtpXSk7CisKKworCWNsYXNzX2Rlc3Ryb3koY29tZWRpX2NsYXNzKTsKKwljZGV2X2RlbCgmY29tZWRpX2NkZXYpOworCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihNS0RFVihDT01FRElfTUFKT1IsIDApLCBDT01FRElfTlVNX01JTk9SUyk7CisKKwljb21lZGlfcHJvY19jbGVhbnVwKCk7CisKKwljb21lZGlfcnRfY2xlYW51cCgpOworCisJY29tZWRpX3VucmVnaXN0ZXJfaW9jdGwzMigpOworfQorCittb2R1bGVfaW5pdChjb21lZGlfaW5pdCk7Cittb2R1bGVfZXhpdChjb21lZGlfY2xlYW51cCk7CisKK3ZvaWQgY29tZWRpX2Vycm9yKGNvbnN0IGNvbWVkaV9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqcykKK3sKKwlydF9wcmludGsoImNvbWVkaSVkOiAlczogJXNcbiIsIGRldi0+bWlub3IsIGRldi0+ZHJpdmVyLT5kcml2ZXJfbmFtZSwKKwkJICBzKTsKK30KKwordm9pZCBjb21lZGlfZXZlbnQoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzKQoreworCWNvbWVkaV9hc3luYyAqYXN5bmMgPSBzLT5hc3luYzsKKwl1bnNpZ25lZCBydW5mbGFncyA9IDA7CisJdW5zaWduZWQgcnVuZmxhZ3NfbWFzayA9IDA7CisKKwkvKiBEUFJJTlRLKCJjb21lZGlfZXZlbnQgMHgleFxuIixtYXNrKTsgKi8KKworCWlmICgoY29tZWRpX2dldF9zdWJkZXZpY2VfcnVuZmxhZ3MocykgJiBTUkZfUlVOTklORykgPT0gMCkKKwkJcmV0dXJuOworCisJaWYgKHMtPmFzeW5jLT4KKwkgICAgZXZlbnRzICYgKENPTUVESV9DQl9FT0EgfCBDT01FRElfQ0JfRVJST1IgfCBDT01FRElfQ0JfT1ZFUkZMT1cpKSB7CisJCXJ1bmZsYWdzX21hc2sgfD0gU1JGX1JVTk5JTkc7CisJfQorCS8qIHJlbWVtYmVyIGlmIGFuIGVycm9yIGV2ZW50IGhhcyBvY2N1cmVkLCBzbyBhbiBlcnJvcgorCSAqIGNhbiBiZSByZXR1cm5lZCB0aGUgbmV4dCB0aW1lIHRoZSB1c2VyIGRvZXMgYSByZWFkKCkgKi8KKwlpZiAocy0+YXN5bmMtPmV2ZW50cyAmIChDT01FRElfQ0JfRVJST1IgfCBDT01FRElfQ0JfT1ZFUkZMT1cpKSB7CisJCXJ1bmZsYWdzX21hc2sgfD0gU1JGX0VSUk9SOworCQlydW5mbGFncyB8PSBTUkZfRVJST1I7CisJfQorCWlmIChydW5mbGFnc19tYXNrKSB7CisJCS8qc2V0cyBTUkZfRVJST1IgYW5kIFNSRl9SVU5OSU5HIHRvZ2V0aGVyIGF0b21pY2FsbHkgKi8KKwkJY29tZWRpX3NldF9zdWJkZXZpY2VfcnVuZmxhZ3MocywgcnVuZmxhZ3NfbWFzaywgcnVuZmxhZ3MpOworCX0KKworCWlmIChhc3luYy0+Y2JfbWFzayAmIHMtPmFzeW5jLT5ldmVudHMpIHsKKwkJaWYgKGNvbWVkaV9nZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHMpICYgU1JGX1VTRVIpIHsKKworCQkJaWYgKGRldi0+cnQpIHsKKyNpZmRlZiBDT05GSUdfQ09NRURJX1JUCisJCQkJLyogcGVuZCB3YWtlIHVwICovCisJCQkJY29tZWRpX3J0X3BlbmRfd2FrZXVwKCZhc3luYy0+d2FpdF9oZWFkKTsKKyNlbHNlCisJCQkJcHJpbnRrCisJCQkJICAgICgiQlVHOiBjb21lZGlfZXZlbnQoKSBjb2RlIHVucmVhY2hhYmxlXG4iKTsKKyNlbmRpZgorCQkJfSBlbHNlIHsKKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmFzeW5jLT53YWl0X2hlYWQpOworCQkJCWlmIChzLT5zdWJkZXZfZmxhZ3MgJiBTREZfQ01EX1JFQUQpIHsKKwkJCQkJa2lsbF9mYXN5bmMoJmRldi0+YXN5bmNfcXVldWUsIFNJR0lPLAorCQkJCQkJICAgIFBPTExfSU4pOworCQkJCX0KKwkJCQlpZiAocy0+c3ViZGV2X2ZsYWdzICYgU0RGX0NNRF9XUklURSkgeworCQkJCQlraWxsX2Zhc3luYygmZGV2LT5hc3luY19xdWV1ZSwgU0lHSU8sCisJCQkJCQkgICAgUE9MTF9PVVQpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChhc3luYy0+Y2JfZnVuYykKKwkJCQlhc3luYy0+Y2JfZnVuYyhzLT5hc3luYy0+ZXZlbnRzLCBhc3luYy0+Y2JfYXJnKTsKKwkJCS8qIFhYWCBidWcgaGVyZS4gIElmIHN1YmRldmljZSBBIGlzIHJ0LCBhbmQKKwkJCSAqIHN1YmRldmljZSBCIHRyaWVzIHRvIGNhbGxiYWNrIHRvIGEgbm9ybWFsCisJCQkgKiBsaW51eCBrZXJuZWwgZnVuY3Rpb24sIGl0IHdpbGwgYmUgYXQgdGhlCisJCQkgKiB3cm9uZyBwcmlvcml0eS4gIFNpbmNlIHRoaXMgaXNuJ3QgdmVyeQorCQkJICogY29tbW9uLCBJJ20gbm90IGdvaW5nIHRvIHdvcnJ5IGFib3V0IGl0LiAqLworCQl9CisJfQorCXMtPmFzeW5jLT5ldmVudHMgPSAwOworfQorCit2b2lkIGNvbWVkaV9zZXRfc3ViZGV2aWNlX3J1bmZsYWdzKGNvbWVkaV9zdWJkZXZpY2UgKnMsIHVuc2lnbmVkIG1hc2ssCisJCQkJICAgdW5zaWduZWQgYml0cykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJY29tZWRpX3NwaW5fbG9ja19pcnFzYXZlKCZzLT5zcGluX2xvY2ssIGZsYWdzKTsKKwlzLT5ydW5mbGFncyAmPSB+bWFzazsKKwlzLT5ydW5mbGFncyB8PSAoYml0cyAmIG1hc2spOworCWNvbWVkaV9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5zcGluX2xvY2ssIGZsYWdzKTsKK30KKwordW5zaWduZWQgY29tZWRpX2dldF9zdWJkZXZpY2VfcnVuZmxhZ3MoY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHJ1bmZsYWdzOworCisJY29tZWRpX3NwaW5fbG9ja19pcnFzYXZlKCZzLT5zcGluX2xvY2ssIGZsYWdzKTsKKwlydW5mbGFncyA9IHMtPnJ1bmZsYWdzOworCWNvbWVkaV9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5zcGluX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcnVuZmxhZ3M7Cit9CisKK3N0YXRpYyBpbnQgaXNfZGV2aWNlX2J1c3koY29tZWRpX2RldmljZSAqZGV2KQoreworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisJaW50IGk7CisKKwlpZiAoIWRldi0+YXR0YWNoZWQpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IGRldi0+bl9zdWJkZXZpY2VzOyBpKyspIHsKKwkJcyA9IGRldi0+c3ViZGV2aWNlcyArIGk7CisJCWlmIChzLT5idXN5KQorCQkJcmV0dXJuIDE7CisJCWlmIChzLT5hc3luYyAmJiBzLT5hc3luYy0+bW1hcF9jb3VudCkKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCit2b2lkIGNvbWVkaV9kZXZpY2VfaW5pdChjb21lZGlfZGV2aWNlICpkZXYpCit7CisJbWVtc2V0KGRldiwgMCwgc2l6ZW9mKGNvbWVkaV9kZXZpY2UpKTsKKwlzcGluX2xvY2tfaW5pdCgmZGV2LT5zcGlubG9jayk7CisJbXV0ZXhfaW5pdCgmZGV2LT5tdXRleCk7CisJZGV2LT5taW5vciA9IC0xOworfQorCit2b2lkIGNvbWVkaV9kZXZpY2VfY2xlYW51cChjb21lZGlfZGV2aWNlICpkZXYpCit7CisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm47CisJbXV0ZXhfbG9jaygmZGV2LT5tdXRleCk7CisJY29tZWRpX2RldmljZV9kZXRhY2goZGV2KTsKKwltdXRleF91bmxvY2soJmRldi0+bXV0ZXgpOworCW11dGV4X2Rlc3Ryb3koJmRldi0+bXV0ZXgpOworfQorCitpbnQgY29tZWRpX2FsbG9jX2JvYXJkX21pbm9yKHN0cnVjdCBkZXZpY2UgKmhhcmR3YXJlX2RldmljZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqaW5mbzsKKwlkZXZpY2VfY3JlYXRlX3Jlc3VsdF90eXBlICpjc2RldjsKKwl1bnNpZ25lZCBpOworCisJaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyksIEdGUF9LRVJORUwpOworCWlmIChpbmZvID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWluZm8tPmRldmljZSA9IGt6YWxsb2Moc2l6ZW9mKGNvbWVkaV9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoaW5mby0+ZGV2aWNlID09IE5VTEwpIHsKKwkJa2ZyZWUoaW5mbyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwljb21lZGlfZGV2aWNlX2luaXQoaW5mby0+ZGV2aWNlKTsKKwljb21lZGlfc3Bpbl9sb2NrX2lycXNhdmUoJmNvbWVkaV9maWxlX2luZm9fdGFibGVfbG9jaywgZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBDT01FRElfTlVNX0JPQVJEX01JTk9SUzsgKytpKSB7CisJCWlmIChjb21lZGlfZmlsZV9pbmZvX3RhYmxlW2ldID09IE5VTEwpIHsKKwkJCWNvbWVkaV9maWxlX2luZm9fdGFibGVbaV0gPSBpbmZvOworCQkJYnJlYWs7CisJCX0KKwl9CisJY29tZWRpX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbWVkaV9maWxlX2luZm9fdGFibGVfbG9jaywgZmxhZ3MpOworCWlmIChpID09IENPTUVESV9OVU1fQk9BUkRfTUlOT1JTKSB7CisJCWNvbWVkaV9kZXZpY2VfY2xlYW51cChpbmZvLT5kZXZpY2UpOworCQlrZnJlZShpbmZvLT5kZXZpY2UpOworCQlrZnJlZShpbmZvKTsKKwkJcnRfcHJpbnRrCisJCSAgICAoImNvbWVkaTogZXJyb3I6IHJhbiBvdXQgb2YgbWlub3IgbnVtYmVycyBmb3IgYm9hcmQgZGV2aWNlIGZpbGVzLlxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWluZm8tPmRldmljZS0+bWlub3IgPSBpOworCWNzZGV2ID0gQ09NRURJX0RFVklDRV9DUkVBVEUoY29tZWRpX2NsYXNzLCBOVUxMLAorCQkJCSAgICAgTUtERVYoQ09NRURJX01BSk9SLCBpKSwgTlVMTCwKKwkJCQkgICAgIGhhcmR3YXJlX2RldmljZSwgImNvbWVkaSVpIiwgaSk7CisJaWYgKCFJU19FUlIoY3NkZXYpKQorCQlpbmZvLT5kZXZpY2UtPmNsYXNzX2RldiA9IGNzZGV2OworCisJcmV0dXJuIGk7Cit9CisKK3ZvaWQgY29tZWRpX2ZyZWVfYm9hcmRfbWlub3IodW5zaWduZWQgbWlub3IpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgY29tZWRpX2RldmljZV9maWxlX2luZm8gKmluZm87CisKKwlCVUdfT04obWlub3IgPj0gQ09NRURJX05VTV9CT0FSRF9NSU5PUlMpOworCWNvbWVkaV9zcGluX2xvY2tfaXJxc2F2ZSgmY29tZWRpX2ZpbGVfaW5mb190YWJsZV9sb2NrLCBmbGFncyk7CisJaW5mbyA9IGNvbWVkaV9maWxlX2luZm9fdGFibGVbbWlub3JdOworCWNvbWVkaV9maWxlX2luZm9fdGFibGVbbWlub3JdID0gTlVMTDsKKwljb21lZGlfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29tZWRpX2ZpbGVfaW5mb190YWJsZV9sb2NrLCBmbGFncyk7CisKKwlpZiAoaW5mbykgeworCQljb21lZGlfZGV2aWNlICpkZXYgPSBpbmZvLT5kZXZpY2U7CisJCWlmIChkZXYpIHsKKwkJCWlmIChkZXYtPmNsYXNzX2RldikgeworCQkJCWRldmljZV9kZXN0cm95KGNvbWVkaV9jbGFzcywKKwkJCQkJICAgICAgIE1LREVWKENPTUVESV9NQUpPUiwgZGV2LT5taW5vcikpOworCQkJfQorCQkJY29tZWRpX2RldmljZV9jbGVhbnVwKGRldik7CisJCQlrZnJlZShkZXYpOworCQl9CisJCWtmcmVlKGluZm8pOworCX0KK30KKworaW50IGNvbWVkaV9hbGxvY19zdWJkZXZpY2VfbWlub3IoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICppbmZvOworCWRldmljZV9jcmVhdGVfcmVzdWx0X3R5cGUgKmNzZGV2OworCXVuc2lnbmVkIGk7CisKKwlpbmZvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGluZm8gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJaW5mby0+ZGV2aWNlID0gZGV2OworCWluZm8tPnJlYWRfc3ViZGV2aWNlID0gczsKKwlpbmZvLT53cml0ZV9zdWJkZXZpY2UgPSBzOworCWNvbWVkaV9zcGluX2xvY2tfaXJxc2F2ZSgmY29tZWRpX2ZpbGVfaW5mb190YWJsZV9sb2NrLCBmbGFncyk7CisJZm9yIChpID0gQ09NRURJX0ZJUlNUX1NVQkRFVklDRV9NSU5PUjsgaSA8IENPTUVESV9OVU1fQk9BUkRfTUlOT1JTOyArK2kpIHsKKwkJaWYgKGNvbWVkaV9maWxlX2luZm9fdGFibGVbaV0gPT0gTlVMTCkgeworCQkJY29tZWRpX2ZpbGVfaW5mb190YWJsZVtpXSA9IGluZm87CisJCQlicmVhazsKKwkJfQorCX0KKwljb21lZGlfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29tZWRpX2ZpbGVfaW5mb190YWJsZV9sb2NrLCBmbGFncyk7CisJaWYgKGkgPT0gQ09NRURJX05VTV9NSU5PUlMpIHsKKwkJa2ZyZWUoaW5mbyk7CisJCXJ0X3ByaW50aworCQkgICAgKCJjb21lZGk6IGVycm9yOiByYW4gb3V0IG9mIG1pbm9yIG51bWJlcnMgZm9yIGJvYXJkIGRldmljZSBmaWxlcy5cbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlzLT5taW5vciA9IGk7CisJY3NkZXYgPSBDT01FRElfREVWSUNFX0NSRUFURShjb21lZGlfY2xhc3MsIGRldi0+Y2xhc3NfZGV2LAorCQkJCSAgICAgTUtERVYoQ09NRURJX01BSk9SLCBpKSwgTlVMTCwgTlVMTCwKKwkJCQkgICAgICJjb21lZGklaV9zdWJkJWkiLCBkZXYtPm1pbm9yLAorCQkJCSAgICAgKGludCkocyAtIGRldi0+c3ViZGV2aWNlcykpOworCWlmICghSVNfRVJSKGNzZGV2KSkKKwkJcy0+Y2xhc3NfZGV2ID0gY3NkZXY7CisKKwlyZXR1cm4gaTsKK30KKwordm9pZCBjb21lZGlfZnJlZV9zdWJkZXZpY2VfbWlub3IoY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqaW5mbzsKKworCWlmIChzID09IE5VTEwpCisJCXJldHVybjsKKwlpZiAocy0+bWlub3IgPCAwKQorCQlyZXR1cm47CisKKwlCVUdfT04ocy0+bWlub3IgPj0gQ09NRURJX05VTV9NSU5PUlMpOworCUJVR19PTihzLT5taW5vciA8IENPTUVESV9GSVJTVF9TVUJERVZJQ0VfTUlOT1IpOworCisJY29tZWRpX3NwaW5fbG9ja19pcnFzYXZlKCZjb21lZGlfZmlsZV9pbmZvX3RhYmxlX2xvY2ssIGZsYWdzKTsKKwlpbmZvID0gY29tZWRpX2ZpbGVfaW5mb190YWJsZVtzLT5taW5vcl07CisJY29tZWRpX2ZpbGVfaW5mb190YWJsZVtzLT5taW5vcl0gPSBOVUxMOworCWNvbWVkaV9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb21lZGlfZmlsZV9pbmZvX3RhYmxlX2xvY2ssIGZsYWdzKTsKKworCWlmIChzLT5jbGFzc19kZXYpIHsKKwkJZGV2aWNlX2Rlc3Ryb3koY29tZWRpX2NsYXNzLCBNS0RFVihDT01FRElfTUFKT1IsIHMtPm1pbm9yKSk7CisJCXMtPmNsYXNzX2RldiA9IE5VTEw7CisJfQorCWtmcmVlKGluZm8pOworfQorCitzdHJ1Y3QgY29tZWRpX2RldmljZV9maWxlX2luZm8gKmNvbWVkaV9nZXRfZGV2aWNlX2ZpbGVfaW5mbyh1bnNpZ25lZCBtaW5vcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqaW5mbzsKKworCUJVR19PTihtaW5vciA+PSBDT01FRElfTlVNX01JTk9SUyk7CisJY29tZWRpX3NwaW5fbG9ja19pcnFzYXZlKCZjb21lZGlfZmlsZV9pbmZvX3RhYmxlX2xvY2ssIGZsYWdzKTsKKwlpbmZvID0gY29tZWRpX2ZpbGVfaW5mb190YWJsZVttaW5vcl07CisJY29tZWRpX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbWVkaV9maWxlX2luZm9fdGFibGVfbG9jaywgZmxhZ3MpOworCXJldHVybiBpbmZvOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfZm9wcy5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfZm9wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZjhkZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9mb3BzLmgKQEAgLTAsMCArMSw4IEBACisKKyNpZm5kZWYgX0NPTUVESV9GT1BTX0gKKyNkZWZpbmUgX0NPTUVESV9GT1BTX0gKKworZXh0ZXJuIHN0cnVjdCBjbGFzcyAqY29tZWRpX2NsYXNzOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY29tZWRpX2ZvcHM7CisKKyNlbmRpZiAvKiBfQ09NRURJX0ZPUFNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfa3N5bXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2tzeW1zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBkNTcyOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2tzeW1zLmMKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAgICBtb2R1bGUvZXhwX2lvY3RsLmMKKyAgICBleHBvcnRlZCBjb21lZGkgZnVuY3Rpb25zCisKKyAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTggRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI2RlZmluZSBfX05PX1ZFUlNJT05fXworI2lmbmRlZiBFWFBPUlRfU1lNVEFCCisjZGVmaW5lIEVYUE9SVF9TWU1UQUIKKyNlbmRpZgorCisjaW5jbHVkZSAiY29tZWRpZGV2LmgiCisKKy8qIGZvciBkcml2ZXJzICovCitFWFBPUlRfU1lNQk9MKGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChjb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIpOworLy9FWFBPUlRfU1lNQk9MKGNvbWVkaV9idWZjaGVjayk7CisvL0VYUE9SVF9TWU1CT0woY29tZWRpX2RvbmUpOworLy9FWFBPUlRfU1lNQk9MKGNvbWVkaV9lcnJvcl9kb25lKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2Vycm9yKTsKKy8vRVhQT1JUX1NZTUJPTChjb21lZGlfZW9idWYpOworLy9FWFBPUlRfU1lNQk9MKGNvbWVkaV9lb3MpOworRVhQT1JUX1NZTUJPTChjb21lZGlfZXZlbnQpOworRVhQT1JUX1NZTUJPTChjb21lZGlfZ2V0X3N1YmRldmljZV9ydW5mbGFncyk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9zZXRfc3ViZGV2aWNlX3J1bmZsYWdzKTsKK0VYUE9SVF9TWU1CT0wocmFuZ2VfYmlwb2xhcjEwKTsKK0VYUE9SVF9TWU1CT0wocmFuZ2VfYmlwb2xhcjUpOworRVhQT1JUX1NZTUJPTChyYW5nZV9iaXBvbGFyMl81KTsKK0VYUE9SVF9TWU1CT0wocmFuZ2VfdW5pcG9sYXIxMCk7CitFWFBPUlRfU1lNQk9MKHJhbmdlX3VuaXBvbGFyNSk7CitFWFBPUlRfU1lNQk9MKHJhbmdlX3Vua25vd24pOworI2lmZGVmIENPTkZJR19DT01FRElfUlQKK0VYUE9SVF9TWU1CT0woY29tZWRpX2ZyZWVfaXJxKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX3JlcXVlc3RfaXJxKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX3N3aXRjaF90b19ydCk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9zd2l0Y2hfdG9fbm9uX3J0KTsKK0VYUE9SVF9TWU1CT0wocnRfcGVuZF9jYWxsKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DT01FRElfREVCVUcKK0VYUE9SVF9TWU1CT0woY29tZWRpX2RlYnVnKTsKKyNlbmRpZgorRVhQT1JUX1NZTUJPTF9HUEwoY29tZWRpX2FsbG9jX2JvYXJkX21pbm9yKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGNvbWVkaV9mcmVlX2JvYXJkX21pbm9yKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGNvbWVkaV9wY2lfYXV0b19jb25maWcpOworRVhQT1JUX1NZTUJPTF9HUEwoY29tZWRpX3BjaV9hdXRvX3VuY29uZmlnKTsKKworLyogZm9yIGtjb21lZGlsaWIgKi8KK0VYUE9SVF9TWU1CT0woY2hlY2tfY2hhbmxpc3QpOworRVhQT1JUX1NZTUJPTF9HUEwoY29tZWRpX2dldF9kZXZpY2VfZmlsZV9pbmZvKTsKKworRVhQT1JUX1NZTUJPTChjb21lZGlfYnVmX3B1dCk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9idWZfZ2V0KTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2J1Zl9yZWFkX25fYXZhaWxhYmxlKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2J1Zl93cml0ZV9mcmVlKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2J1Zl93cml0ZV9hbGxvYyk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9idWZfcmVhZF9mcmVlKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2J1Zl9yZWFkX2FsbG9jKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2J1Zl9tZW1jcHlfdG8pOworRVhQT1JUX1NZTUJPTChjb21lZGlfYnVmX21lbWNweV9mcm9tKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX3Jlc2V0X2FzeW5jX2J1Zik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9ydC5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTg1MmJmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfcnQuaApAQCAtMCwwICsxLDE1MCBAQAorLyoKKyAgICBtb2R1bGUvY29tZWRpX3J0LmgKKyAgICBoZWFkZXIgZmlsZSBmb3IgcmVhbC10aW1lIHN0cnVjdHVyZXMsIHZhcmlhYmxlcywgYW5kIGNvbnN0YW50cworCisgICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDAwIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisKKyNpZm5kZWYgX0NPTUVESV9SVF9ICisjZGVmaW5lIF9DT01FRElfUlRfSAorCisjaWZuZGVmIF9DT01FRElERVZfSAorI2Vycm9yIGNvbWVkaV9ydC5oIHNob3VsZCBvbmx5IGJlIGluY2x1ZGVkIGJ5IGNvbWVkaWRldi5oCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpZmRlZiBDT05GSUdfQ09NRURJX1JUCisKKyNpZmRlZiBDT05GSUdfQ09NRURJX1JUQUkKKyNpbmNsdWRlIDxydGFpLmg+CisjaW5jbHVkZSA8cnRhaV9zY2hlZC5oPgorI2luY2x1ZGUgPHJ0YWlfdmVyc2lvbi5oPgorI2VuZGlmCisjaWZkZWYgQ09ORklHX0NPTUVESV9SVEwKKyNpbmNsdWRlIDxydGxfY29yZS5oPgorI2luY2x1ZGUgPHJ0bF90aW1lLmg+CisvKiAjaWZkZWYgUlRMSU5VWF9WRVJTSU9OX0NPREUgKi8KKyNpbmNsdWRlIDxydGxfc3luYy5oPgorLyogI2VuZGlmICovCisjZGVmaW5lIHJ0X3ByaW50ayBydGxfcHJpbnRmCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ09NRURJX0ZVU0lPTgorI2RlZmluZSBydF9wcmludGsoZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoZm9ybWF0ICwgIyMgYXJncykKKyNlbmRpZiAvKiBDT05GSUdfQ09NRURJX0ZVU0lPTiAqLworI2lmZGVmIENPTkZJR19QUklPUklUWV9JUlEKKyNkZWZpbmUgcnRfcHJpbnRrIHByaW50aworI2VuZGlmCisKK2ludCBjb21lZGlfcmVxdWVzdF9pcnEodW5zaWduZWQgaW50IGlycSwgaXJxcmV0dXJuX3QoKmhhbmRsZXIpIChpbnQsCisJCXZvaWQgKlBUX1JFR1NfQVJHKSwgdW5zaWduZWQgbG9uZyBmbGFncywgY29uc3QgY2hhciAqZGV2aWNlLAorCQljb21lZGlfZGV2aWNlICpkZXZfaWQpOwordm9pZCBjb21lZGlfZnJlZV9pcnEodW5zaWduZWQgaW50IGlycSwgY29tZWRpX2RldmljZSAqZGV2X2lkKTsKK3ZvaWQgY29tZWRpX3J0X2luaXQodm9pZCk7Cit2b2lkIGNvbWVkaV9ydF9jbGVhbnVwKHZvaWQpOworaW50IGNvbWVkaV9zd2l0Y2hfdG9fcnQoY29tZWRpX2RldmljZSAqZGV2KTsKK3ZvaWQgY29tZWRpX3N3aXRjaF90b19ub25fcnQoY29tZWRpX2RldmljZSAqZGV2KTsKK3ZvaWQgY29tZWRpX3J0X3BlbmRfd2FrZXVwKHdhaXRfcXVldWVfaGVhZF90ICpxKTsKK2V4dGVybiBpbnQgcnRfcGVuZF9jYWxsKHZvaWQgKCpmdW5jKSAoaW50IGFyZzEsIHZvaWQgKmFyZzIpLCBpbnQgYXJnMSwKKwl2b2lkICphcmcyKTsKKworI2Vsc2UKKworI2RlZmluZSBjb21lZGlfcmVxdWVzdF9pcnEoYSwgYiwgYywgZCwgZSkgcmVxdWVzdF9pcnEoYSwgYiwgYywgZCwgZSkKKyNkZWZpbmUgY29tZWRpX2ZyZWVfaXJxKGEsIGIpIGZyZWVfaXJxKGEsIGIpCisjZGVmaW5lIGNvbWVkaV9ydF9pbml0KCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGNvbWVkaV9ydF9jbGVhbnVwKCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGNvbWVkaV9zd2l0Y2hfdG9fcnQoYSkgKC0xKQorI2RlZmluZSBjb21lZGlfc3dpdGNoX3RvX25vbl9ydChhKSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgY29tZWRpX3J0X3BlbmRfd2FrZXVwKGEpIGRvIHt9IHdoaWxlICgwKQorCisjZGVmaW5lIHJ0X3ByaW50ayhmb3JtYXQsIGFyZ3MuLi4pCXByaW50ayhmb3JtYXQsICMjYXJncykKKworI2VuZGlmCisKKy8qIERlZmluZSBhIHNwaW5fbG9ja19pcnFzYXZlIGZ1bmN0aW9uIHRoYXQgd2lsbCB3b3JrIHdpdGggcnQgb3Igd2l0aG91dC4KKyAqIFVzZSBpbmxpbmUgZnVuY3Rpb25zIGluc3RlYWQgb2YganVzdCBtYWNyb3MgdG8gZW5mb3JjZSBzb21lIHR5cGUgY2hlY2tpbmcuCisgKi8KKyNkZWZpbmUgY29tZWRpX3NwaW5fbG9ja19pcnFzYXZlKGxvY2tfcHRyLCBmbGFncykgXAorCShmbGFncyA9IF9fY29tZWRpX3NwaW5fbG9ja19pcnFzYXZlKGxvY2tfcHRyKSkKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fY29tZWRpX3NwaW5fbG9ja19pcnFzYXZlKHNwaW5sb2NrX3QgKmxvY2tfcHRyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyNpZiBkZWZpbmVkKENPTkZJR19DT01FRElfUlRBSSkKKwlmbGFncyA9IHJ0X3NwaW5fbG9ja19pcnFzYXZlKGxvY2tfcHRyKTsKKworI2VsaWYgZGVmaW5lZChDT05GSUdfQ09NRURJX1JUTCkKKwlydGxfc3Bpbl9sb2NrX2lycXNhdmUobG9ja19wdHIsIGZsYWdzKTsKKworI2VsaWYgZGVmaW5lZChDT05GSUdfQ09NRURJX1JUTF9WMSkKKwlydGxfc3Bpbl9sb2NrX2lycXNhdmUobG9ja19wdHIsIGZsYWdzKTsKKworI2VsaWYgZGVmaW5lZChDT05GSUdfQ09NRURJX0ZVU0lPTikKKwlydGhhbF9zcGluX2xvY2tfaXJxc2F2ZShsb2NrX3B0ciwgZmxhZ3MpOworI2Vsc2UKKwlzcGluX2xvY2tfaXJxc2F2ZShsb2NrX3B0ciwgZmxhZ3MpOworCisjZW5kaWYKKworCXJldHVybiBmbGFnczsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNvbWVkaV9zcGluX3VubG9ja19pcnFyZXN0b3JlKHNwaW5sb2NrX3QgKmxvY2tfcHRyLAorCXVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisKKyNpZiBkZWZpbmVkKENPTkZJR19DT01FRElfUlRBSSkKKwlydF9zcGluX3VubG9ja19pcnFyZXN0b3JlKGZsYWdzLCBsb2NrX3B0cik7CisKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NPTUVESV9SVEwpCisJcnRsX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUobG9ja19wdHIsIGZsYWdzKTsKKworI2VsaWYgZGVmaW5lZChDT05GSUdfQ09NRURJX1JUTF9WMSkKKwlydGxfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShsb2NrX3B0ciwgZmxhZ3MpOworI2VsaWYgZGVmaW5lZChDT05GSUdfQ09NRURJX0ZVU0lPTikKKwlydGhhbF9zcGluX3VubG9ja19pcnFyZXN0b3JlKGxvY2tfcHRyLCBmbGFncyk7CisjZWxzZQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobG9ja19wdHIsIGZsYWdzKTsKKworI2VuZGlmCisKK30KKworLyogZGVmaW5lIGEgUlQgc2FmZSB1ZGVsYXkgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjb21lZGlfdWRlbGF5KHVuc2lnbmVkIGludCB1c2VjKQoreworI2lmIGRlZmluZWQoQ09ORklHX0NPTUVESV9SVEFJKQorCXN0YXRpYyBjb25zdCBpbnQgbmFub3NlY19wZXJfdXNlYyA9IDEwMDA7CisJcnRfYnVzeV9zbGVlcCh1c2VjICogbmFub3NlY19wZXJfdXNlYyk7CisjZWxpZiBkZWZpbmVkKENPTkZJR19DT01FRElfUlRMKQorCXN0YXRpYyBjb25zdCBpbnQgbmFub3NlY19wZXJfdXNlYyA9IDEwMDA7CisJcnRsX2RlbGF5KHVzZWMgKiBuYW5vc2VjX3Blcl91c2VjKTsKKyNlbHNlCisJdWRlbGF5KHVzZWMpOworI2VuZGlmCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlkZXYuaCBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzczNTM1NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpZGV2LmgKQEAgLTAsMCArMSw1MzcgQEAKKy8qCisgICAgaW5jbHVkZS9saW51eC9jb21lZGlkZXYuaAorICAgIGhlYWRlciBmaWxlIGZvciBrZXJuZWwtb25seSBzdHJ1Y3R1cmVzLCB2YXJpYWJsZXMsIGFuZCBjb25zdGFudHMKKworICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisjaWZuZGVmIF9DT01FRElERVZfSAorI2RlZmluZSBfQ09NRURJREVWX0gKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgImludGVycnVwdC5oIgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlICJjb21lZGkuaCIKKworI2RlZmluZSBEUFJJTlRLKGZvcm1hdCwgYXJncy4uLikJZG8gewkJXAorCWlmIChjb21lZGlfZGVidWcpCQkJCVwKKwkJcHJpbnRrKEtFUk5fREVCVUcgImNvbWVkaTogIiBmb3JtYXQgLCAjIyBhcmdzKTsJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDT01FRElfVkVSU0lPTihhLCBiLCBjKSAoKChhKSA8PCAxNikgKyAoKGIpIDw8IDgpICsgKGMpKQorI2RlZmluZSBDT01FRElfVkVSU0lPTl9DT0RFIENPTUVESV9WRVJTSU9OKENPTUVESV9NQUpPUlZFUlNJT04sIENPTUVESV9NSU5PUlZFUlNJT04sIENPTUVESV9NSUNST1ZFUlNJT04pCisjZGVmaW5lIENPTUVESV9SRUxFQVNFIFZFUlNJT04KKworI2RlZmluZSBDT01FRElfSU5JVENMRUFOVVBfTk9NT0RVTEUoeCkJCQkJCVwKKwlzdGF0aWMgaW50IF9faW5pdCB4ICMjIF9pbml0X21vZHVsZSh2b2lkKQkJCVwKKwkJe3JldHVybiBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCYoeCkpO30JCQlcCisJc3RhdGljIHZvaWQgX19leGl0IHggIyMgX2NsZWFudXBfbW9kdWxlKHZvaWQpCQkJXAorCQl7Y29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCYoeCkpO30gCQkJXAorCW1vZHVsZV9pbml0KHggIyMgX2luaXRfbW9kdWxlKTsJCQkJCVwKKwltb2R1bGVfZXhpdCh4ICMjIF9jbGVhbnVwX21vZHVsZSk7CQkJCQlcCisKKyNkZWZpbmUgQ09NRURJX01PRFVMRV9NQUNST1MJCQkJCQlcCisJTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOwkJXAorCU1PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsJCQlcCisJTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwkJCQkJCVwKKworI2RlZmluZSBDT01FRElfSU5JVENMRUFOVVAoeCkJCQkJCQlcCisJQ09NRURJX01PRFVMRV9NQUNST1MJCVwKKwlDT01FRElfSU5JVENMRUFOVVBfTk9NT0RVTEUoeCkKKworI2RlZmluZSBDT01FRElfUENJX0lOSVRDTEVBTlVQX05PTU9EVUxFKGNvbWVkaV9kcml2ZXIsIHBjaV9pZF90YWJsZSkgXAorCXN0YXRpYyBpbnQgX19kZXZpbml0IGNvbWVkaV9kcml2ZXIgIyMgX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBcCisJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpIFwKKwl7IFwKKwkJcmV0dXJuIGNvbWVkaV9wY2lfYXV0b19jb25maWcoZGV2LCBjb21lZGlfZHJpdmVyLmRyaXZlcl9uYW1lKTsgXAorCX0gXAorCXN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBjb21lZGlfZHJpdmVyICMjIF9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpIFwKKwl7IFwKKwkJY29tZWRpX3BjaV9hdXRvX3VuY29uZmlnKGRldik7IFwKKwl9IFwKKwlzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgY29tZWRpX2RyaXZlciAjIyBfcGNpX2RyaXZlciA9IFwKKwl7IFwKKwkJLmlkX3RhYmxlID0gcGNpX2lkX3RhYmxlLCBcCisJCS5wcm9iZSA9ICZjb21lZGlfZHJpdmVyICMjIF9wY2lfcHJvYmUsIFwKKwkJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKCZjb21lZGlfZHJpdmVyICMjIF9wY2lfcmVtb3ZlKSBcCisJfTsgXAorCXN0YXRpYyBpbnQgX19pbml0IGNvbWVkaV9kcml2ZXIgIyMgX2luaXRfbW9kdWxlKHZvaWQpIFwKKwl7IFwKKwkJaW50IHJldHZhbDsgXAorCQlyZXR2YWwgPSBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZjb21lZGlfZHJpdmVyKTsgXAorCQlpZiAocmV0dmFsIDwgMCkgXAorCQkJcmV0dXJuIHJldHZhbDsgXAorCQljb21lZGlfZHJpdmVyICMjIF9wY2lfZHJpdmVyLm5hbWUgPSAoY2hhciAqKWNvbWVkaV9kcml2ZXIuZHJpdmVyX25hbWU7IFwKKwkJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmNvbWVkaV9kcml2ZXIgIyMgX3BjaV9kcml2ZXIpOyBcCisJfSBcCisJc3RhdGljIHZvaWQgX19leGl0IGNvbWVkaV9kcml2ZXIgIyMgX2NsZWFudXBfbW9kdWxlKHZvaWQpIFwKKwl7IFwKKwkJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZjb21lZGlfZHJpdmVyICMjIF9wY2lfZHJpdmVyKTsgXAorCQljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmNvbWVkaV9kcml2ZXIpOyBcCisJfSBcCisJbW9kdWxlX2luaXQoY29tZWRpX2RyaXZlciAjIyBfaW5pdF9tb2R1bGUpOyBcCisJbW9kdWxlX2V4aXQoY29tZWRpX2RyaXZlciAjIyBfY2xlYW51cF9tb2R1bGUpOworCisjZGVmaW5lIENPTUVESV9QQ0lfSU5JVENMRUFOVVAoY29tZWRpX2RyaXZlciwgcGNpX2lkX3RhYmxlKSBcCisJQ09NRURJX01PRFVMRV9NQUNST1MgXAorCUNPTUVESV9QQ0lfSU5JVENMRUFOVVBfTk9NT0RVTEUoY29tZWRpX2RyaXZlciwgcGNpX2lkX3RhYmxlKQorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfSU5PVkEJCTB4MTA0YworI2RlZmluZSBQQ0lfVkVORE9SX0lEX05BVElOU1QJCTB4MTA5MworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0RBVFgJCTB4MTExNgorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0NPTVBVVEVSQk9BUkRTCTB4MTMwNworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FEVkFOVEVDSAkJMHgxM2ZlCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfUlRECQkweDE0MzUKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BTVBMSUNPTgkJMHgxNGRjCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQURMSU5LCQkweDE0NGEKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9JQ1AJCTB4MTA0YworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0NPTlRFQwkJMHgxMjIxCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTUVJTEhBVVMJCTB4MTQwMgorCisjZGVmaW5lIENPTUVESV9OVU1fTUlOT1JTIDB4MTAwCisjZGVmaW5lIENPTUVESV9OVU1fTEVHQUNZX01JTk9SUyAweDEwCisjZGVmaW5lIENPTUVESV9OVU1fQk9BUkRfTUlOT1JTIDB4MzAKKyNkZWZpbmUgQ09NRURJX0ZJUlNUX1NVQkRFVklDRV9NSU5PUiBDT01FRElfTlVNX0JPQVJEX01JTk9SUworCit0eXBlZGVmIHN0cnVjdCBjb21lZGlfZGV2aWNlX3N0cnVjdCBjb21lZGlfZGV2aWNlOwordHlwZWRlZiBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZV9zdHJ1Y3QgY29tZWRpX3N1YmRldmljZTsKK3R5cGVkZWYgc3RydWN0IGNvbWVkaV9hc3luY19zdHJ1Y3QgY29tZWRpX2FzeW5jOwordHlwZWRlZiBzdHJ1Y3QgY29tZWRpX2RyaXZlcl9zdHJ1Y3QgY29tZWRpX2RyaXZlcjsKK3R5cGVkZWYgc3RydWN0IGNvbWVkaV9scmFuZ2Vfc3RydWN0IGNvbWVkaV9scmFuZ2U7CisKK3R5cGVkZWYgc3RydWN0IGRldmljZSBkZXZpY2VfY3JlYXRlX3Jlc3VsdF90eXBlOworCisjZGVmaW5lIENPTUVESV9ERVZJQ0VfQ1JFQVRFKGNzLCBwYXJlbnQsIGRldnQsIGRydmRhdGEsIGRldmljZSwgZm10Li4uKSBcCisJZGV2aWNlX2NyZWF0ZShjcywgKChwYXJlbnQpID8gKHBhcmVudCkgOiAoZGV2aWNlKSksIGRldnQsIGRydmRhdGEsIGZtdCkKKworc3RydWN0IGNvbWVkaV9zdWJkZXZpY2Vfc3RydWN0IHsKKwljb21lZGlfZGV2aWNlICpkZXZpY2U7CisJaW50IHR5cGU7CisJaW50IG5fY2hhbjsKKwl2b2xhdGlsZSBpbnQgc3ViZGV2X2ZsYWdzOworCWludCBsZW5fY2hhbmxpc3Q7CS8qIG1heGltdW0gbGVuZ3RoIG9mIGNoYW5uZWwvZ2FpbiBsaXN0ICovCisKKwl2b2lkICpwcml2YXRlOworCisJY29tZWRpX2FzeW5jICphc3luYzsKKworCXZvaWQgKmxvY2s7CisJdm9pZCAqYnVzeTsKKwl1bnNpZ25lZCBydW5mbGFnczsKKwlzcGlubG9ja190IHNwaW5fbG9jazsKKworCWludCBpb19iaXRzOworCisJbHNhbXBsX3QgbWF4ZGF0YTsJLyogaWYgbWF4ZGF0YT09MCwgdXNlIGxpc3QgKi8KKwljb25zdCBsc2FtcGxfdCAqbWF4ZGF0YV9saXN0OwkvKiBsaXN0IGlzIGNoYW5uZWwgc3BlY2lmaWMgKi8KKworCXVuc2lnbmVkIGludCBmbGFnczsKKwljb25zdCB1bnNpZ25lZCBpbnQgKmZsYWdsaXN0OworCisJdW5zaWduZWQgaW50IHNldHRsaW5nX3RpbWVfMDsKKworCWNvbnN0IGNvbWVkaV9scmFuZ2UgKnJhbmdlX3RhYmxlOworCWNvbnN0IGNvbWVkaV9scmFuZ2UgKmNvbnN0ICpyYW5nZV90YWJsZV9saXN0OworCisJdW5zaWduZWQgaW50ICpjaGFubGlzdDsJLyogZHJpdmVyLW93bmVkIGNoYW5saXN0IChub3QgdXNlZCkgKi8KKworCWludCAoKmluc25fcmVhZCkgKGNvbWVkaV9kZXZpY2UgKiwgY29tZWRpX3N1YmRldmljZSAqLCBjb21lZGlfaW5zbiAqLAorCQlsc2FtcGxfdCAqKTsKKwlpbnQgKCppbnNuX3dyaXRlKSAoY29tZWRpX2RldmljZSAqLCBjb21lZGlfc3ViZGV2aWNlICosIGNvbWVkaV9pbnNuICosCisJCWxzYW1wbF90ICopOworCWludCAoKmluc25fYml0cykgKGNvbWVkaV9kZXZpY2UgKiwgY29tZWRpX3N1YmRldmljZSAqLCBjb21lZGlfaW5zbiAqLAorCQlsc2FtcGxfdCAqKTsKKwlpbnQgKCppbnNuX2NvbmZpZykgKGNvbWVkaV9kZXZpY2UgKiwgY29tZWRpX3N1YmRldmljZSAqLCBjb21lZGlfaW5zbiAqLAorCQlsc2FtcGxfdCAqKTsKKworCWludCAoKmRvX2NtZCkgKGNvbWVkaV9kZXZpY2UgKiwgY29tZWRpX3N1YmRldmljZSAqKTsKKwlpbnQgKCpkb19jbWR0ZXN0KSAoY29tZWRpX2RldmljZSAqLCBjb21lZGlfc3ViZGV2aWNlICosIGNvbWVkaV9jbWQgKik7CisJaW50ICgqcG9sbCkgKGNvbWVkaV9kZXZpY2UgKiwgY29tZWRpX3N1YmRldmljZSAqKTsKKwlpbnQgKCpjYW5jZWwpIChjb21lZGlfZGV2aWNlICosIGNvbWVkaV9zdWJkZXZpY2UgKik7CisJLyogaW50ICgqZG9fbG9jaykoY29tZWRpX2RldmljZSAqLGNvbWVkaV9zdWJkZXZpY2UgKik7ICovCisJLyogaW50ICgqZG9fdW5sb2NrKShjb21lZGlfZGV2aWNlICosY29tZWRpX3N1YmRldmljZSAqKTsgKi8KKworCS8qIGNhbGxlZCB3aGVuIHRoZSBidWZmZXIgY2hhbmdlcyAqLworCWludCAoKmJ1Zl9jaGFuZ2UpIChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCXVuc2lnbmVkIGxvbmcgbmV3X3NpemUpOworCisJdm9pZCAoKm11bmdlKSAoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLCB2b2lkICpkYXRhLAorCQl1bnNpZ25lZCBpbnQgbnVtX2J5dGVzLCB1bnNpZ25lZCBpbnQgc3RhcnRfY2hhbl9pbmRleCk7CisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gYXN5bmNfZG1hX2RpcjsKKworCXVuc2lnbmVkIGludCBzdGF0ZTsKKworCWRldmljZV9jcmVhdGVfcmVzdWx0X3R5cGUgKmNsYXNzX2RldjsKKwlpbnQgbWlub3I7Cit9OworCitzdHJ1Y3QgY29tZWRpX2J1Zl9wYWdlIHsKKwl2b2lkICp2aXJ0X2FkZHI7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKK307CisKK3N0cnVjdCBjb21lZGlfYXN5bmNfc3RydWN0IHsKKwljb21lZGlfc3ViZGV2aWNlICpzdWJkZXZpY2U7CisKKwl2b2lkICpwcmVhbGxvY19idWY7CS8qIHByZS1hbGxvY2F0ZWQgYnVmZmVyICovCisJdW5zaWduZWQgaW50IHByZWFsbG9jX2J1ZnN6OwkvKiBidWZmZXIgc2l6ZSwgaW4gYnl0ZXMgKi8KKwlzdHJ1Y3QgY29tZWRpX2J1Zl9wYWdlICpidWZfcGFnZV9saXN0OwkvKiB2aXJ0dWFsIGFuZCBkbWEgYWRkcmVzcyBvZiBlYWNoIHBhZ2UgKi8KKwl1bnNpZ25lZCBuX2J1Zl9wYWdlczsJLyogbnVtIGVsZW1lbnRzIGluIGJ1Zl9wYWdlX2xpc3QgKi8KKworCXVuc2lnbmVkIGludCBtYXhfYnVmc2l6ZTsJLyogbWF4aW11bSBidWZmZXIgc2l6ZSwgYnl0ZXMgKi8KKwl1bnNpZ25lZCBpbnQgbW1hcF9jb3VudDsJLyogY3VycmVudCBudW1iZXIgb2YgbW1hcHMgb2YgcHJlYWxsb2NfYnVmICovCisKKwl1bnNpZ25lZCBpbnQgYnVmX3dyaXRlX2NvdW50OwkvKiBieXRlIGNvdW50IGZvciB3cml0ZXIgKHdyaXRlIGNvbXBsZXRlZCkgKi8KKwl1bnNpZ25lZCBpbnQgYnVmX3dyaXRlX2FsbG9jX2NvdW50OwkvKiBieXRlIGNvdW50IGZvciB3cml0ZXIgKGFsbG9jYXRlZCBmb3Igd3JpdGluZykgKi8KKwl1bnNpZ25lZCBpbnQgYnVmX3JlYWRfY291bnQ7CS8qIGJ5dGUgY291bnQgZm9yIHJlYWRlciAocmVhZCBjb21wbGV0ZWQpICovCisJdW5zaWduZWQgaW50IGJ1Zl9yZWFkX2FsbG9jX2NvdW50OwkvKiBieXRlIGNvdW50IGZvciByZWFkZXIgKGFsbG9jYXRlZCBmb3IgcmVhZGluZykgKi8KKworCXVuc2lnbmVkIGludCBidWZfd3JpdGVfcHRyOwkvKiBidWZmZXIgbWFya2VyIGZvciB3cml0ZXIgKi8KKwl1bnNpZ25lZCBpbnQgYnVmX3JlYWRfcHRyOwkvKiBidWZmZXIgbWFya2VyIGZvciByZWFkZXIgKi8KKworCXVuc2lnbmVkIGludCBjdXJfY2hhbjsJLyogdXNlbGVzcyBjaGFubmVsIG1hcmtlciBmb3IgaW50ZXJydXB0ICovCisJLyogbnVtYmVyIG9mIGJ5dGVzIHRoYXQgaGF2ZSBiZWVuIHJlY2VpdmVkIGZvciBjdXJyZW50IHNjYW4gKi8KKwl1bnNpZ25lZCBpbnQgc2Nhbl9wcm9ncmVzczsKKwkvKiBrZWVwcyB0cmFjayBvZiB3aGVyZSB3ZSBhcmUgaW4gY2hhbmxpc3QgYXMgZm9yIG11bmdpbmcgKi8KKwl1bnNpZ25lZCBpbnQgbXVuZ2VfY2hhbjsKKwkvKiBudW1iZXIgb2YgYnl0ZXMgdGhhdCBoYXZlIGJlZW4gbXVuZ2VkICovCisJdW5zaWduZWQgaW50IG11bmdlX2NvdW50OworCS8qIGJ1ZmZlciBtYXJrZXIgZm9yIG11bmdpbmcgKi8KKwl1bnNpZ25lZCBpbnQgbXVuZ2VfcHRyOworCisJdW5zaWduZWQgaW50IGV2ZW50czsJLyogZXZlbnRzIHRoYXQgaGF2ZSBvY2N1cnJlZCAqLworCisJY29tZWRpX2NtZCBjbWQ7CisKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X2hlYWQ7CisKKwkvKiBjYWxsYmFjayBzdHVmZiAqLworCXVuc2lnbmVkIGludCBjYl9tYXNrOworCWludCAoKmNiX2Z1bmMpICh1bnNpZ25lZCBpbnQgZmxhZ3MsIHZvaWQgKik7CisJdm9pZCAqY2JfYXJnOworCisJaW50ICgqaW50dHJpZykgKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCXVuc2lnbmVkIGludCB4KTsKK307CisKK3N0cnVjdCBjb21lZGlfZHJpdmVyX3N0cnVjdCB7CisJc3RydWN0IGNvbWVkaV9kcml2ZXJfc3RydWN0ICpuZXh0OworCisJY29uc3QgY2hhciAqZHJpdmVyX25hbWU7CisJc3RydWN0IG1vZHVsZSAqbW9kdWxlOworCWludCAoKmF0dGFjaCkgKGNvbWVkaV9kZXZpY2UgKiwgY29tZWRpX2RldmNvbmZpZyAqKTsKKwlpbnQgKCpkZXRhY2gpIChjb21lZGlfZGV2aWNlICopOworCisJLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIGJvYXJkX25hbWUgYW5kIGJvYXJkX2lkIGFycmF5cyAqLworCXVuc2lnbmVkIGludCBudW1fbmFtZXM7CisJY29uc3QgY2hhciAqY29uc3QgKmJvYXJkX25hbWU7CisJLyogb2Zmc2V0IGluIGJ5dGVzIGZyb20gb25lIGJvYXJkIG5hbWUgcG9pbnRlciB0byB0aGUgbmV4dCAqLworCWludCBvZmZzZXQ7Cit9OworCitzdHJ1Y3QgY29tZWRpX2RldmljZV9zdHJ1Y3QgeworCWludCB1c2VfY291bnQ7CisJY29tZWRpX2RyaXZlciAqZHJpdmVyOworCXZvaWQgKnByaXZhdGU7CisKKwlkZXZpY2VfY3JlYXRlX3Jlc3VsdF90eXBlICpjbGFzc19kZXY7CisJaW50IG1pbm9yOworCS8qIGh3X2RldiBpcyBwYXNzZWQgdG8gZG1hX2FsbG9jX2NvaGVyZW50IHdoZW4gYWxsb2NhdGluZyBhc3luYyBidWZmZXJzCisJICogZm9yIHN1YmRldmljZXMgdGhhdCBoYXZlIGFzeW5jX2RtYV9kaXIgc2V0IHRvIHNvbWV0aGluZyBvdGhlciB0aGFuCisJICogRE1BX05PTkUgKi8KKwlzdHJ1Y3QgZGV2aWNlICpod19kZXY7CisKKwljb25zdCBjaGFyICpib2FyZF9uYW1lOworCWNvbnN0IHZvaWQgKmJvYXJkX3B0cjsKKwlpbnQgYXR0YWNoZWQ7CisJaW50IHJ0OworCXNwaW5sb2NrX3Qgc3BpbmxvY2s7CisJc3RydWN0IG11dGV4IG11dGV4OworCWludCBpbl9yZXF1ZXN0X21vZHVsZTsKKworCWludCBuX3N1YmRldmljZXM7CisJY29tZWRpX3N1YmRldmljZSAqc3ViZGV2aWNlczsKKworCS8qIGR1bWIgKi8KKwl1bnNpZ25lZCBsb25nIGlvYmFzZTsKKwl1bnNpZ25lZCBpbnQgaXJxOworCisJY29tZWRpX3N1YmRldmljZSAqcmVhZF9zdWJkZXY7CisJY29tZWRpX3N1YmRldmljZSAqd3JpdGVfc3ViZGV2OworCisJc3RydWN0IGZhc3luY19zdHJ1Y3QgKmFzeW5jX3F1ZXVlOworCisJdm9pZCAoKm9wZW4pIChjb21lZGlfZGV2aWNlICpkZXYpOworCXZvaWQgKCpjbG9zZSkgKGNvbWVkaV9kZXZpY2UgKmRldik7Cit9OworCitzdHJ1Y3QgY29tZWRpX2RldmljZV9maWxlX2luZm8geworCWNvbWVkaV9kZXZpY2UgKmRldmljZTsKKwljb21lZGlfc3ViZGV2aWNlICpyZWFkX3N1YmRldmljZTsKKwljb21lZGlfc3ViZGV2aWNlICp3cml0ZV9zdWJkZXZpY2U7Cit9OworCisjaWZkZWYgQ09ORklHX0NPTUVESV9ERUJVRworZXh0ZXJuIGludCBjb21lZGlfZGVidWc7CisjZWxzZQorc3RhdGljIGNvbnN0IGludCBjb21lZGlfZGVidWc7CisjZW5kaWYKKworLyoKKyAqIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAqLworCit2b2lkIGNvbWVkaV9ldmVudChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMpOwordm9pZCBjb21lZGlfZXJyb3IoY29uc3QgY29tZWRpX2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpzKTsKKworLyogd2UgY2FuIGV4cGFuZCB0aGUgbnVtYmVyIG9mIGJpdHMgdXNlZCB0byBlbmNvZGUgZGV2aWNlcy9zdWJkZXZpY2VzIGludG8KKyB0aGUgbWlub3IgbnVtYmVyIHNvb24sIGFmdGVyIG1vcmUgZGlzdHJvcyBzdXBwb3J0ID4gOCBiaXQgbWlub3IgbnVtYmVycworIChsaWtlIGFmdGVyIERlYmlhbiBFdGNoIGdldHMgcmVsZWFzZWQpICovCitlbnVtIGNvbWVkaV9taW5vcl9iaXRzIHsKKwlDT01FRElfREVWSUNFX01JTk9SX01BU0sgPSAweGYsCisJQ09NRURJX1NVQkRFVklDRV9NSU5PUl9NQVNLID0gMHhmMAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBDT01FRElfU1VCREVWSUNFX01JTk9SX1NISUZUID0gNDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBDT01FRElfU1VCREVWSUNFX01JTk9SX09GRlNFVCA9IDE7CisKK3N0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqY29tZWRpX2dldF9kZXZpY2VfZmlsZV9pbmZvKHVuc2lnbmVkIG1pbm9yKTsKKworc3RhdGljIGlubGluZSBjb21lZGlfc3ViZGV2aWNlICpjb21lZGlfZ2V0X3JlYWRfc3ViZGV2aWNlKAorCQkJCWNvbnN0IHN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqaW5mbykKK3sKKwlpZiAoaW5mby0+cmVhZF9zdWJkZXZpY2UpCisJCXJldHVybiBpbmZvLT5yZWFkX3N1YmRldmljZTsKKwlpZiAoaW5mby0+ZGV2aWNlID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCXJldHVybiBpbmZvLT5kZXZpY2UtPnJlYWRfc3ViZGV2OworfQorCitzdGF0aWMgaW5saW5lIGNvbWVkaV9zdWJkZXZpY2UgKmNvbWVkaV9nZXRfd3JpdGVfc3ViZGV2aWNlKAorCQkJCWNvbnN0IHN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqaW5mbykKK3sKKwlpZiAoaW5mby0+d3JpdGVfc3ViZGV2aWNlKQorCQlyZXR1cm4gaW5mby0+d3JpdGVfc3ViZGV2aWNlOworCWlmIChpbmZvLT5kZXZpY2UgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGluZm8tPmRldmljZS0+d3JpdGVfc3ViZGV2OworfQorCit2b2lkIGNvbWVkaV9kZXZpY2VfZGV0YWNoKGNvbWVkaV9kZXZpY2UgKmRldik7CitpbnQgY29tZWRpX2RldmljZV9hdHRhY2goY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfZGV2Y29uZmlnICppdCk7CitpbnQgY29tZWRpX2RyaXZlcl9yZWdpc3Rlcihjb21lZGlfZHJpdmVyICopOworaW50IGNvbWVkaV9kcml2ZXJfdW5yZWdpc3Rlcihjb21lZGlfZHJpdmVyICopOworCit2b2lkIGluaXRfcG9sbGluZyh2b2lkKTsKK3ZvaWQgY2xlYW51cF9wb2xsaW5nKHZvaWQpOwordm9pZCBzdGFydF9wb2xsaW5nKGNvbWVkaV9kZXZpY2UgKik7Cit2b2lkIHN0b3BfcG9sbGluZyhjb21lZGlfZGV2aWNlICopOworCitpbnQgY29tZWRpX2J1Zl9hbGxvYyhjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsIHVuc2lnbmVkIGxvbmcKKwluZXdfc2l6ZSk7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUwordm9pZCBjb21lZGlfcHJvY19pbml0KHZvaWQpOwordm9pZCBjb21lZGlfcHJvY19jbGVhbnVwKHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb21lZGlfcHJvY19pbml0KHZvaWQpCit7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgY29tZWRpX3Byb2NfY2xlYW51cCh2b2lkKQoreworfQorI2VuZGlmCisKKy8qIHN1YmRldmljZSBydW5mbGFncyAqLworZW51bSBzdWJkZXZpY2VfcnVuZmxhZ3MgeworCVNSRl9VU0VSID0gMHgwMDAwMDAwMSwKKwlTUkZfUlQgPSAweDAwMDAwMDAyLAorCS8qIGluZGljYXRlcyBhbiBDT01FRElfQ0JfRVJST1IgZXZlbnQgaGFzIG9jY3VycmVkIHNpbmNlIHRoZSBsYXN0CisJICogY29tbWFuZCB3YXMgc3RhcnRlZCAqLworCVNSRl9FUlJPUiA9IDB4MDAwMDAwMDQsCisJU1JGX1JVTk5JTkcgPSAweDA4MDAwMDAwCit9OworCisvKgorICAgdmFyaW91cyBpbnRlcm5hbCBjb21lZGkgZnVuY3Rpb25zCisgKi8KKworaW50IGRvX3JhbmdlaW5mb19pb2N0bChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9yYW5nZWluZm8gKmFyZyk7CitpbnQgY2hlY2tfY2hhbmxpc3QoY29tZWRpX3N1YmRldmljZSAqcywgaW50IG4sIHVuc2lnbmVkIGludCAqY2hhbmxpc3QpOwordm9pZCBjb21lZGlfc2V0X3N1YmRldmljZV9ydW5mbGFncyhjb21lZGlfc3ViZGV2aWNlICpzLCB1bnNpZ25lZCBtYXNrLAorCXVuc2lnbmVkIGJpdHMpOwordW5zaWduZWQgY29tZWRpX2dldF9zdWJkZXZpY2VfcnVuZmxhZ3MoY29tZWRpX3N1YmRldmljZSAqcyk7CitpbnQgaW5zbl9pbnZhbChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKTsKKworLyogcmFuZ2Ugc3R1ZmYgKi8KKworI2RlZmluZSBSQU5HRShhLCBiKQkJeyhhKSoxZTYsIChiKSoxZTYsIDB9CisjZGVmaW5lIFJBTkdFX2V4dChhLCBiKQkJeyhhKSoxZTYsIChiKSoxZTYsIFJGX0VYVEVSTkFMfQorI2RlZmluZSBSQU5HRV9tQShhLCBiKQkJeyhhKSoxZTYsIChiKSoxZTYsIFVOSVRfbUF9CisjZGVmaW5lIFJBTkdFX3VuaXRsZXNzKGEsIGIpCXsoYSkqMWU2LCAoYikqMWU2LCAwfQkvKiBYWFggKi8KKyNkZWZpbmUgQklQX1JBTkdFKGEpCQl7LShhKSoxZTYsIChhKSoxZTYsIDB9CisjZGVmaW5lIFVOSV9SQU5HRShhKQkJezAsIChhKSoxZTYsIDB9CisKK2V4dGVybiBjb25zdCBjb21lZGlfbHJhbmdlIHJhbmdlX2JpcG9sYXIxMDsKK2V4dGVybiBjb25zdCBjb21lZGlfbHJhbmdlIHJhbmdlX2JpcG9sYXI1OworZXh0ZXJuIGNvbnN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VfYmlwb2xhcjJfNTsKK2V4dGVybiBjb25zdCBjb21lZGlfbHJhbmdlIHJhbmdlX3VuaXBvbGFyMTA7CitleHRlcm4gY29uc3QgY29tZWRpX2xyYW5nZSByYW5nZV91bmlwb2xhcjU7CitleHRlcm4gY29uc3QgY29tZWRpX2xyYW5nZSByYW5nZV91bmtub3duOworCisjZGVmaW5lIHJhbmdlX2RpZ2l0YWwJCXJhbmdlX3VuaXBvbGFyNQorCisjaWYgX19HTlVDX18gPj0gMworI2RlZmluZSBHQ0NfWkVST19MRU5HVEhfQVJSQVkKKyNlbHNlCisjZGVmaW5lIEdDQ19aRVJPX0xFTkdUSF9BUlJBWSAwCisjZW5kaWYKKworc3RydWN0IGNvbWVkaV9scmFuZ2Vfc3RydWN0IHsKKwlpbnQgbGVuZ3RoOworCWNvbWVkaV9rcmFuZ2UgcmFuZ2VbR0NDX1pFUk9fTEVOR1RIX0FSUkFZXTsKK307CisKKy8qIHNvbWUgc2lsbHkgbGl0dGxlIGlubGluZSBmdW5jdGlvbnMgKi8KKworc3RhdGljIGlubGluZSBpbnQgYWxsb2Nfc3ViZGV2aWNlcyhjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICAgdW5zaWduZWQgaW50IG51bV9zdWJkZXZpY2VzKQoreworCXVuc2lnbmVkIGk7CisKKwlkZXYtPm5fc3ViZGV2aWNlcyA9IG51bV9zdWJkZXZpY2VzOworCWRldi0+c3ViZGV2aWNlcyA9CisJCWtjYWxsb2MobnVtX3N1YmRldmljZXMsIHNpemVvZihjb21lZGlfc3ViZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYtPnN1YmRldmljZXMpCisJCXJldHVybiAtRU5PTUVNOworCWZvciAoaSA9IDA7IGkgPCBudW1fc3ViZGV2aWNlczsgKytpKSB7CisJCWRldi0+c3ViZGV2aWNlc1tpXS5kZXZpY2UgPSBkZXY7CisJCWRldi0+c3ViZGV2aWNlc1tpXS5hc3luY19kbWFfZGlyID0gRE1BX05PTkU7CisJCXNwaW5fbG9ja19pbml0KCZkZXYtPnN1YmRldmljZXNbaV0uc3Bpbl9sb2NrKTsKKwkJZGV2LT5zdWJkZXZpY2VzW2ldLm1pbm9yID0gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBhbGxvY19wcml2YXRlKGNvbWVkaV9kZXZpY2UgKmRldiwgaW50IHNpemUpCit7CisJZGV2LT5wcml2YXRlID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldi0+cHJpdmF0ZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGJ5dGVzX3Blcl9zYW1wbGUoY29uc3QgY29tZWRpX3N1YmRldmljZSAqc3ViZCkKK3sKKwlpZiAoc3ViZC0+c3ViZGV2X2ZsYWdzICYgU0RGX0xTQU1QTCkKKwkJcmV0dXJuIHNpemVvZihsc2FtcGxfdCk7CisJZWxzZQorCQlyZXR1cm4gc2l6ZW9mKHNhbXBsX3QpOworfQorCisvKiBtdXN0IGJlIHVzZWQgaW4gYXR0YWNoIHRvIHNldCBkZXYtPmh3X2RldiBpZiB5b3Ugd2lzaCB0byBkbWEgZGlyZWN0bHkKK2ludG8gY29tZWRpJ3MgYnVmZmVyICovCitzdGF0aWMgaW5saW5lIHZvaWQgY29tZWRpX3NldF9od19kZXYoY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICpod19kZXYpCit7CisJaWYgKGRldi0+aHdfZGV2KQorCQlwdXRfZGV2aWNlKGRldi0+aHdfZGV2KTsKKworCWRldi0+aHdfZGV2ID0gaHdfZGV2OworCWlmIChkZXYtPmh3X2RldikgeworCQlkZXYtPmh3X2RldiA9IGdldF9kZXZpY2UoZGV2LT5od19kZXYpOworCQlCVUdfT04oZGV2LT5od19kZXYgPT0gTlVMTCk7CisJfQorfQorCitpbnQgY29tZWRpX2J1Zl9wdXQoY29tZWRpX2FzeW5jICphc3luYywgc2FtcGxfdCB4KTsKK2ludCBjb21lZGlfYnVmX2dldChjb21lZGlfYXN5bmMgKmFzeW5jLCBzYW1wbF90ICp4KTsKKwordW5zaWduZWQgaW50IGNvbWVkaV9idWZfd3JpdGVfbl9hdmFpbGFibGUoY29tZWRpX2FzeW5jICphc3luYyk7Cit1bnNpZ25lZCBpbnQgY29tZWRpX2J1Zl93cml0ZV9hbGxvYyhjb21lZGlfYXN5bmMgKmFzeW5jLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKTsKK3Vuc2lnbmVkIGludCBjb21lZGlfYnVmX3dyaXRlX2FsbG9jX3N0cmljdChjb21lZGlfYXN5bmMgKmFzeW5jLAorCXVuc2lnbmVkIGludCBuYnl0ZXMpOwordW5zaWduZWQgY29tZWRpX2J1Zl93cml0ZV9mcmVlKGNvbWVkaV9hc3luYyAqYXN5bmMsIHVuc2lnbmVkIGludCBuYnl0ZXMpOwordW5zaWduZWQgY29tZWRpX2J1Zl9yZWFkX2FsbG9jKGNvbWVkaV9hc3luYyAqYXN5bmMsIHVuc2lnbmVkIG5ieXRlcyk7Cit1bnNpZ25lZCBjb21lZGlfYnVmX3JlYWRfZnJlZShjb21lZGlfYXN5bmMgKmFzeW5jLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKTsKK3Vuc2lnbmVkIGludCBjb21lZGlfYnVmX3JlYWRfbl9hdmFpbGFibGUoY29tZWRpX2FzeW5jICphc3luYyk7Cit2b2lkIGNvbWVkaV9idWZfbWVtY3B5X3RvKGNvbWVkaV9hc3luYyAqYXN5bmMsIHVuc2lnbmVkIGludCBvZmZzZXQsCisJY29uc3Qgdm9pZCAqc291cmNlLCB1bnNpZ25lZCBpbnQgbnVtX2J5dGVzKTsKK3ZvaWQgY29tZWRpX2J1Zl9tZW1jcHlfZnJvbShjb21lZGlfYXN5bmMgKmFzeW5jLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCXZvaWQgKmRlc3RpbmF0aW9uLCB1bnNpZ25lZCBpbnQgbnVtX2J5dGVzKTsKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY29tZWRpX2J1Zl93cml0ZV9uX2FsbG9jYXRlZChjb21lZGlfYXN5bmMgKmFzeW5jKQoreworCXJldHVybiBhc3luYy0+YnVmX3dyaXRlX2FsbG9jX2NvdW50IC0gYXN5bmMtPmJ1Zl93cml0ZV9jb3VudDsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY29tZWRpX2J1Zl9yZWFkX25fYWxsb2NhdGVkKGNvbWVkaV9hc3luYyAqYXN5bmMpCit7CisJcmV0dXJuIGFzeW5jLT5idWZfcmVhZF9hbGxvY19jb3VudCAtIGFzeW5jLT5idWZfcmVhZF9jb3VudDsKK30KKwordm9pZCBjb21lZGlfcmVzZXRfYXN5bmNfYnVmKGNvbWVkaV9hc3luYyAqYXN5bmMpOworCitzdGF0aWMgaW5saW5lIHZvaWQgKmNvbWVkaV9hdXhfZGF0YShpbnQgb3B0aW9uc1tdLCBpbnQgbikKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CisJdW5zaWduZWQgbG9uZyBhZGRyZXNzTG93OworCWludCBiaXRfc2hpZnQ7CisJaWYgKHNpemVvZihpbnQpID49IHNpemVvZih2b2lkICopKQorCQlhZGRyZXNzID0gb3B0aW9uc1tDT01FRElfREVWQ09ORl9BVVhfREFUQV9MT107CisJZWxzZSB7CisJCWFkZHJlc3MgPSBvcHRpb25zW0NPTUVESV9ERVZDT05GX0FVWF9EQVRBX0hJXTsKKwkJYml0X3NoaWZ0ID0gc2l6ZW9mKGludCkgKiA4OworCQlhZGRyZXNzIDw8PSBiaXRfc2hpZnQ7CisJCWFkZHJlc3NMb3cgPSBvcHRpb25zW0NPTUVESV9ERVZDT05GX0FVWF9EQVRBX0xPXTsKKwkJYWRkcmVzc0xvdyAmPSAoMVVMIDw8IGJpdF9zaGlmdCkgLSAxOworCQlhZGRyZXNzIHw9IGFkZHJlc3NMb3c7CisJfQorCWlmIChuID49IDEpCisJCWFkZHJlc3MgKz0gb3B0aW9uc1tDT01FRElfREVWQ09ORl9BVVhfREFUQTBfTEVOR1RIXTsKKwlpZiAobiA+PSAyKQorCQlhZGRyZXNzICs9IG9wdGlvbnNbQ09NRURJX0RFVkNPTkZfQVVYX0RBVEExX0xFTkdUSF07CisJaWYgKG4gPj0gMykKKwkJYWRkcmVzcyArPSBvcHRpb25zW0NPTUVESV9ERVZDT05GX0FVWF9EQVRBMl9MRU5HVEhdOworCUJVR19PTihuID4gMyk7CisJcmV0dXJuICh2b2lkICopYWRkcmVzczsKK30KKworaW50IGNvbWVkaV9hbGxvY19ib2FyZF9taW5vcihzdHJ1Y3QgZGV2aWNlICpoYXJkd2FyZV9kZXZpY2UpOwordm9pZCBjb21lZGlfZnJlZV9ib2FyZF9taW5vcih1bnNpZ25lZCBtaW5vcik7CitpbnQgY29tZWRpX2FsbG9jX3N1YmRldmljZV9taW5vcihjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMpOwordm9pZCBjb21lZGlfZnJlZV9zdWJkZXZpY2VfbWlub3IoY29tZWRpX3N1YmRldmljZSAqcyk7CitpbnQgY29tZWRpX3BjaV9hdXRvX2NvbmZpZyhzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LCBjb25zdCBjaGFyICpib2FyZF9uYW1lKTsKK3ZvaWQgY29tZWRpX3BjaV9hdXRvX3VuY29uZmlnKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYpOworCisjaW5jbHVkZSAiY29tZWRpX3J0LmgiCisKKyNlbmRpZiAvKiBfQ09NRURJREVWX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpbGliLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaWxpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNWZjMDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaWxpYi5oCkBAIC0wLDAgKzEsMTkyIEBACisvKgorICAgIGxpbnV4L2luY2x1ZGUvY29tZWRpbGliLmgKKyAgICBoZWFkZXIgZmlsZSBmb3Iga2NvbWVkaWxpYgorCisgICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICAgIENvcHlyaWdodCAoQykgMTk5OC0yMDAxIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisKKyNpZm5kZWYgX0xJTlVYX0NPTUVESUxJQl9ICisjZGVmaW5lIF9MSU5VWF9DT01FRElMSUJfSAorCisjaW5jbHVkZSAiY29tZWRpLmgiCisKKy8qIEtlcm5lbCBpbnRlcm5hbCBzdHVmZi4gIE5lZWRlZCBieSByZWFsLXRpbWUgbW9kdWxlcyBhbmQgc3VjaC4gKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjZXJyb3IgbGludXgvY29tZWRpbGliLmggc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBieSBub24ta2VybmVsLXNwYWNlIGNvZGUKKyNlbmRpZgorCisvKiBleHBvcnRlZCBmdW5jdGlvbnMgKi8KKworI2lmbmRlZiBLQ09NRURJTElCX0RFUFJFQ0FURUQKKwordHlwZWRlZiB2b2lkIGNvbWVkaV90OworCisvKiB0aGVzZSBmdW5jdGlvbnMgbWF5IG5vdCBiZSBjYWxsZWQgYXQgcmVhbC10aW1lIHByaW9yaXR5ICovCisKK2NvbWVkaV90ICpjb21lZGlfb3Blbihjb25zdCBjaGFyICpwYXRoKTsKK2ludCBjb21lZGlfY2xvc2UoY29tZWRpX3QgKmRldik7CisKKy8qIHRoZXNlIGZ1bmN0aW9ucyBtYXkgYmUgY2FsbGVkIGF0IGFueSBwcmlvcml0eSwgYnV0IG1heSBmYWlsIGF0CisgICByZWFsLXRpbWUgcHJpb3JpdHkgKi8KKworaW50IGNvbWVkaV9sb2NrKGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYpOworaW50IGNvbWVkaV91bmxvY2soY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldik7CisKKy8qIHRoZXNlIGZ1bmN0aW9ucyBtYXkgYmUgY2FsbGVkIGF0IGFueSBwcmlvcml0eSwgYnV0IHlvdSBtdXN0IGhvbGQKKyAgIHRoZSBsb2NrIGZvciB0aGUgc3ViZGV2aWNlICovCisKK2ludCBjb21lZGlfbG9nbGV2ZWwoaW50IGxvZ2xldmVsKTsKK3ZvaWQgY29tZWRpX3BlcnJvcihjb25zdCBjaGFyICpzKTsKK2NoYXIgKmNvbWVkaV9zdHJlcnJvcihpbnQgZXJybnVtKTsKK2ludCBjb21lZGlfZXJybm8odm9pZCk7CitpbnQgY29tZWRpX2ZpbGVubyhjb21lZGlfdCAqZGV2KTsKKworaW50IGNvbWVkaV9jYW5jZWwoY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldik7CitpbnQgY29tZWRpX3JlZ2lzdGVyX2NhbGxiYWNrKGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsCisJdW5zaWduZWQgaW50IG1hc2ssIGludCAoKmNiKSAodW5zaWduZWQgaW50LCB2b2lkICopLCB2b2lkICphcmcpOworCitpbnQgY29tZWRpX2NvbW1hbmQoY29tZWRpX3QgKmRldiwgY29tZWRpX2NtZCAqY21kKTsKK2ludCBjb21lZGlfY29tbWFuZF90ZXN0KGNvbWVkaV90ICpkZXYsIGNvbWVkaV9jbWQgKmNtZCk7CitpbnQgY29tZWRpX3RyaWdnZXIoY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldiwgY29tZWRpX3RyaWcgKml0KTsKK2ludCBfX2NvbWVkaV90cmlnZ2VyKGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsIGNvbWVkaV90cmlnICppdCk7CitpbnQgY29tZWRpX2RhdGFfd3JpdGUoY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldiwgdW5zaWduZWQgaW50IGNoYW4sCisJdW5zaWduZWQgaW50IHJhbmdlLCB1bnNpZ25lZCBpbnQgYXJlZiwgbHNhbXBsX3QgZGF0YSk7CitpbnQgY29tZWRpX2RhdGFfcmVhZChjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2LCB1bnNpZ25lZCBpbnQgY2hhbiwKKwl1bnNpZ25lZCBpbnQgcmFuZ2UsIHVuc2lnbmVkIGludCBhcmVmLCBsc2FtcGxfdCAqZGF0YSk7CitpbnQgY29tZWRpX2RhdGFfcmVhZF9oaW50KGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsCisJdW5zaWduZWQgaW50IGNoYW4sIHVuc2lnbmVkIGludCByYW5nZSwgdW5zaWduZWQgaW50IGFyZWYpOworaW50IGNvbWVkaV9kYXRhX3JlYWRfZGVsYXllZChjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2LAorCXVuc2lnbmVkIGludCBjaGFuLCB1bnNpZ25lZCBpbnQgcmFuZ2UsIHVuc2lnbmVkIGludCBhcmVmLAorCWxzYW1wbF90ICpkYXRhLCB1bnNpZ25lZCBpbnQgbmFub19zZWMpOworaW50IGNvbWVkaV9kaW9fY29uZmlnKGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsIHVuc2lnbmVkIGludCBjaGFuLAorCXVuc2lnbmVkIGludCBpbyk7CitpbnQgY29tZWRpX2Rpb19yZWFkKGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsIHVuc2lnbmVkIGludCBjaGFuLAorCXVuc2lnbmVkIGludCAqdmFsKTsKK2ludCBjb21lZGlfZGlvX3dyaXRlKGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsIHVuc2lnbmVkIGludCBjaGFuLAorCXVuc2lnbmVkIGludCB2YWwpOworaW50IGNvbWVkaV9kaW9fYml0ZmllbGQoY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldiwgdW5zaWduZWQgaW50IG1hc2ssCisJdW5zaWduZWQgaW50ICpiaXRzKTsKK2ludCBjb21lZGlfZ2V0X25fc3ViZGV2aWNlcyhjb21lZGlfdCAqZGV2KTsKK2ludCBjb21lZGlfZ2V0X3ZlcnNpb25fY29kZShjb21lZGlfdCAqZGV2KTsKK2NvbnN0IGNoYXIgKmNvbWVkaV9nZXRfZHJpdmVyX25hbWUoY29tZWRpX3QgKmRldik7Citjb25zdCBjaGFyICpjb21lZGlfZ2V0X2JvYXJkX25hbWUoY29tZWRpX3QgKmRldik7CitpbnQgY29tZWRpX2dldF9zdWJkZXZpY2VfdHlwZShjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlKTsKK2ludCBjb21lZGlfZmluZF9zdWJkZXZpY2VfYnlfdHlwZShjb21lZGlfdCAqZGV2LCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IHN1YmQpOworaW50IGNvbWVkaV9nZXRfbl9jaGFubmVscyhjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlKTsKK2xzYW1wbF90IGNvbWVkaV9nZXRfbWF4ZGF0YShjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlLCB1bnNpZ25lZAorCWludCBjaGFuKTsKK2ludCBjb21lZGlfZ2V0X25fcmFuZ2VzKGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UsIHVuc2lnbmVkIGludAorCWNoYW4pOworaW50IGNvbWVkaV9kb19pbnNuKGNvbWVkaV90ICpkZXYsIGNvbWVkaV9pbnNuICppbnNuKTsKK2ludCBjb21lZGlfcG9sbChjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2KTsKKworLyogREVQUkVDQVRFRCBmdW5jdGlvbnMgKi8KK2ludCBjb21lZGlfZ2V0X3JhbmdldHlwZShjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlLAorCXVuc2lnbmVkIGludCBjaGFuKTsKKworLyogQUxQSEEgZnVuY3Rpb25zICovCit1bnNpZ25lZCBpbnQgY29tZWRpX2dldF9zdWJkZXZpY2VfZmxhZ3MoY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldmljZSk7CitpbnQgY29tZWRpX2dldF9sZW5fY2hhbmxpc3QoY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldmljZSk7CitpbnQgY29tZWRpX2dldF9rcmFuZ2UoY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldmljZSwgdW5zaWduZWQgaW50CisJY2hhbiwgdW5zaWduZWQgaW50IHJhbmdlLCBjb21lZGlfa3JhbmdlICprcmFuZ2UpOwordW5zaWduZWQgaW50IGNvbWVkaV9nZXRfYnVmX2hlYWRfcG9zKGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UpOworaW50IGNvbWVkaV9zZXRfdXNlcl9pbnRfY291bnQoY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldmljZSwKKwl1bnNpZ25lZCBpbnQgYnVmX3VzZXJfY291bnQpOworaW50IGNvbWVkaV9tYXAoY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldiwgdm9pZCAqcHRyKTsKK2ludCBjb21lZGlfdW5tYXAoY29tZWRpX3QgKmRldiwgdW5zaWduZWQgaW50IHN1YmRldik7CitpbnQgY29tZWRpX2dldF9idWZmZXJfc2l6ZShjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2KTsKK2ludCBjb21lZGlfbWFya19idWZmZXJfcmVhZChjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlLAorCXVuc2lnbmVkIGludCBudW1fYnl0ZXMpOworaW50IGNvbWVkaV9tYXJrX2J1ZmZlcl93cml0dGVuKGNvbWVkaV90ICpkLCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlLAorCXVuc2lnbmVkIGludCBudW1fYnl0ZXMpOworaW50IGNvbWVkaV9nZXRfYnVmZmVyX2NvbnRlbnRzKGNvbWVkaV90ICpkZXYsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UpOworaW50IGNvbWVkaV9nZXRfYnVmZmVyX29mZnNldChjb21lZGlfdCAqZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlKTsKKworI2Vsc2UKKworLyogdGhlc2UgZnVuY3Rpb25zIG1heSBub3QgYmUgY2FsbGVkIGF0IHJlYWwtdGltZSBwcmlvcml0eSAqLworCitpbnQgY29tZWRpX29wZW4odW5zaWduZWQgaW50IG1pbm9yKTsKK3ZvaWQgY29tZWRpX2Nsb3NlKHVuc2lnbmVkIGludCBtaW5vcik7CisKKy8qIHRoZXNlIGZ1bmN0aW9ucyBtYXkgYmUgY2FsbGVkIGF0IGFueSBwcmlvcml0eSwgYnV0IG1heSBmYWlsIGF0CisgICByZWFsLXRpbWUgcHJpb3JpdHkgKi8KKworaW50IGNvbWVkaV9sb2NrKHVuc2lnbmVkIGludCBtaW5vciwgdW5zaWduZWQgaW50IHN1YmRldik7CitpbnQgY29tZWRpX3VubG9jayh1bnNpZ25lZCBpbnQgbWlub3IsIHVuc2lnbmVkIGludCBzdWJkZXYpOworCisvKiB0aGVzZSBmdW5jdGlvbnMgbWF5IGJlIGNhbGxlZCBhdCBhbnkgcHJpb3JpdHksIGJ1dCB5b3UgbXVzdCBob2xkCisgICB0aGUgbG9jayBmb3IgdGhlIHN1YmRldmljZSAqLworCitpbnQgY29tZWRpX2NhbmNlbCh1bnNpZ25lZCBpbnQgbWlub3IsIHVuc2lnbmVkIGludCBzdWJkZXYpOworaW50IGNvbWVkaV9yZWdpc3Rlcl9jYWxsYmFjayh1bnNpZ25lZCBpbnQgbWlub3IsIHVuc2lnbmVkIGludCBzdWJkZXYsCisJdW5zaWduZWQgaW50IG1hc2ssIGludCAoKmNiKSAodW5zaWduZWQgaW50LCB2b2lkICopLCB2b2lkICphcmcpOworCitpbnQgY29tZWRpX2NvbW1hbmQodW5zaWduZWQgaW50IG1pbm9yLCBjb21lZGlfY21kICpjbWQpOworaW50IGNvbWVkaV9jb21tYW5kX3Rlc3QodW5zaWduZWQgaW50IG1pbm9yLCBjb21lZGlfY21kICpjbWQpOworaW50IGNvbWVkaV90cmlnZ2VyKHVuc2lnbmVkIGludCBtaW5vciwgdW5zaWduZWQgaW50IHN1YmRldiwgY29tZWRpX3RyaWcgKml0KTsKK2ludCBfX2NvbWVkaV90cmlnZ2VyKHVuc2lnbmVkIGludCBtaW5vciwgdW5zaWduZWQgaW50IHN1YmRldiwgY29tZWRpX3RyaWcgKml0KTsKK2ludCBjb21lZGlfZGF0YV93cml0ZSh1bnNpZ25lZCBpbnQgZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2LCB1bnNpZ25lZCBpbnQgY2hhbiwKKwl1bnNpZ25lZCBpbnQgcmFuZ2UsIHVuc2lnbmVkIGludCBhcmVmLCBsc2FtcGxfdCBkYXRhKTsKK2ludCBjb21lZGlfZGF0YV9yZWFkKHVuc2lnbmVkIGludCBkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsIHVuc2lnbmVkIGludCBjaGFuLAorCXVuc2lnbmVkIGludCByYW5nZSwgdW5zaWduZWQgaW50IGFyZWYsIGxzYW1wbF90ICpkYXRhKTsKK2ludCBjb21lZGlfZGlvX2NvbmZpZyh1bnNpZ25lZCBpbnQgZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2LCB1bnNpZ25lZCBpbnQgY2hhbiwKKwl1bnNpZ25lZCBpbnQgaW8pOworaW50IGNvbWVkaV9kaW9fcmVhZCh1bnNpZ25lZCBpbnQgZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2LCB1bnNpZ25lZCBpbnQgY2hhbiwKKwl1bnNpZ25lZCBpbnQgKnZhbCk7CitpbnQgY29tZWRpX2Rpb193cml0ZSh1bnNpZ25lZCBpbnQgZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2LCB1bnNpZ25lZCBpbnQgY2hhbiwKKwl1bnNpZ25lZCBpbnQgdmFsKTsKK2ludCBjb21lZGlfZGlvX2JpdGZpZWxkKHVuc2lnbmVkIGludCBkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsCisJdW5zaWduZWQgaW50IG1hc2ssIHVuc2lnbmVkIGludCAqYml0cyk7CitpbnQgY29tZWRpX2dldF9uX3N1YmRldmljZXModW5zaWduZWQgaW50IGRldik7CitpbnQgY29tZWRpX2dldF92ZXJzaW9uX2NvZGUodW5zaWduZWQgaW50IGRldik7CitjaGFyICpjb21lZGlfZ2V0X2RyaXZlcl9uYW1lKHVuc2lnbmVkIGludCBkZXYpOworY2hhciAqY29tZWRpX2dldF9ib2FyZF9uYW1lKHVuc2lnbmVkIGludCBtaW5vcik7CitpbnQgY29tZWRpX2dldF9zdWJkZXZpY2VfdHlwZSh1bnNpZ25lZCBpbnQgbWlub3IsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UpOworaW50IGNvbWVkaV9maW5kX3N1YmRldmljZV9ieV90eXBlKHVuc2lnbmVkIGludCBtaW5vciwgaW50IHR5cGUsCisJdW5zaWduZWQgaW50IHN1YmQpOworaW50IGNvbWVkaV9nZXRfbl9jaGFubmVscyh1bnNpZ25lZCBpbnQgbWlub3IsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UpOworbHNhbXBsX3QgY29tZWRpX2dldF9tYXhkYXRhKHVuc2lnbmVkIGludCBtaW5vciwgdW5zaWduZWQgaW50IHN1YmRldmljZSwgdW5zaWduZWQKKwlpbnQgY2hhbik7CitpbnQgY29tZWRpX2dldF9uX3Jhbmdlcyh1bnNpZ25lZCBpbnQgbWlub3IsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UsIHVuc2lnbmVkIGludAorCWNoYW4pOworaW50IGNvbWVkaV9kb19pbnNuKHVuc2lnbmVkIGludCBtaW5vciwgY29tZWRpX2luc24gKmluc24pOworaW50IGNvbWVkaV9wb2xsKHVuc2lnbmVkIGludCBtaW5vciwgdW5zaWduZWQgaW50IHN1YmRldik7CisKKy8qIERFUFJFQ0FURUQgZnVuY3Rpb25zICovCitpbnQgY29tZWRpX2dldF9yYW5nZXR5cGUodW5zaWduZWQgaW50IG1pbm9yLCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlLAorCXVuc2lnbmVkIGludCBjaGFuKTsKKworLyogQUxQSEEgZnVuY3Rpb25zICovCit1bnNpZ25lZCBpbnQgY29tZWRpX2dldF9zdWJkZXZpY2VfZmxhZ3ModW5zaWduZWQgaW50IG1pbm9yLCB1bnNpZ25lZCBpbnQKKwlzdWJkZXZpY2UpOworaW50IGNvbWVkaV9nZXRfbGVuX2NoYW5saXN0KHVuc2lnbmVkIGludCBtaW5vciwgdW5zaWduZWQgaW50IHN1YmRldmljZSk7CitpbnQgY29tZWRpX2dldF9rcmFuZ2UodW5zaWduZWQgaW50IG1pbm9yLCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlLCB1bnNpZ25lZCBpbnQKKwljaGFuLCB1bnNpZ25lZCBpbnQgcmFuZ2UsIGNvbWVkaV9rcmFuZ2UgKmtyYW5nZSk7Cit1bnNpZ25lZCBpbnQgY29tZWRpX2dldF9idWZfaGVhZF9wb3ModW5zaWduZWQgaW50IG1pbm9yLCB1bnNpZ25lZCBpbnQKKwlzdWJkZXZpY2UpOworaW50IGNvbWVkaV9zZXRfdXNlcl9pbnRfY291bnQodW5zaWduZWQgaW50IG1pbm9yLCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlLAorCXVuc2lnbmVkIGludCBidWZfdXNlcl9jb3VudCk7CitpbnQgY29tZWRpX21hcCh1bnNpZ25lZCBpbnQgbWlub3IsIHVuc2lnbmVkIGludCBzdWJkZXYsIHZvaWQgKipwdHIpOworaW50IGNvbWVkaV91bm1hcCh1bnNpZ25lZCBpbnQgbWlub3IsIHVuc2lnbmVkIGludCBzdWJkZXYpOworCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YTkzYjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMuYwpAQCAtMCwwICsxLDg0NiBAQAorLyoKKyAgICBtb2R1bGUvZHJpdmVycy5jCisgICAgZnVuY3Rpb25zIGZvciBtYW5pcHVsYXRpbmcgZHJpdmVycworCisgICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDAwIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisKKyNkZWZpbmUgX0dOVV9TT1VSQ0UKKworI2RlZmluZSBfX05PX1ZFUlNJT05fXworI2luY2x1ZGUgImNvbWVkaV9mb3BzLmgiCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlICJjb21lZGlkZXYuaCIKKyNpbmNsdWRlICJ3cmFwcGVyLmgiCisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgkvKiBmb3IgU3VTRSBicm9rZW5uZXNzICovCisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCitzdGF0aWMgaW50IHBvc3Rjb25maWcoY29tZWRpX2RldmljZSAqIGRldik7CitzdGF0aWMgaW50IGluc25fcndfZW11bGF0ZV9iaXRzKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKTsKK3N0YXRpYyB2b2lkICpjb21lZGlfcmVjb2duaXplKGNvbWVkaV9kcml2ZXIgKiBkcml2LCBjb25zdCBjaGFyICpuYW1lKTsKK3N0YXRpYyB2b2lkIGNvbWVkaV9yZXBvcnRfYm9hcmRzKGNvbWVkaV9kcml2ZXIgKiBkcml2KTsKK3N0YXRpYyBpbnQgcG9sbF9pbnZhbGlkKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzKTsKK2ludCBjb21lZGlfYnVmX2FsbG9jKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCXVuc2lnbmVkIGxvbmcgbmV3X3NpemUpOworCitjb21lZGlfZHJpdmVyICpjb21lZGlfZHJpdmVyczsKKworaW50IGNvbWVkaV9tb2Rwcm9iZShpbnQgbWlub3IpCit7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFudXBfZGV2aWNlKGNvbWVkaV9kZXZpY2UgKiBkZXYpCit7CisJaW50IGk7CisJY29tZWRpX3N1YmRldmljZSAqczsKKworCWlmIChkZXYtPnN1YmRldmljZXMpIHsKKwkJZm9yIChpID0gMDsgaSA8IGRldi0+bl9zdWJkZXZpY2VzOyBpKyspIHsKKwkJCXMgPSBkZXYtPnN1YmRldmljZXMgKyBpOworCQkJY29tZWRpX2ZyZWVfc3ViZGV2aWNlX21pbm9yKHMpOworCQkJaWYgKHMtPmFzeW5jKSB7CisJCQkJY29tZWRpX2J1Zl9hbGxvYyhkZXYsIHMsIDApOworCQkJCWtmcmVlKHMtPmFzeW5jKTsKKwkJCX0KKwkJfQorCQlrZnJlZShkZXYtPnN1YmRldmljZXMpOworCQlkZXYtPnN1YmRldmljZXMgPSBOVUxMOworCQlkZXYtPm5fc3ViZGV2aWNlcyA9IDA7CisJfQorCWlmIChkZXYtPnByaXZhdGUpIHsKKwkJa2ZyZWUoZGV2LT5wcml2YXRlKTsKKwkJZGV2LT5wcml2YXRlID0gTlVMTDsKKwl9CisJZGV2LT5kcml2ZXIgPSAwOworCWRldi0+Ym9hcmRfbmFtZSA9IE5VTEw7CisJZGV2LT5ib2FyZF9wdHIgPSBOVUxMOworCWRldi0+aW9iYXNlID0gMDsKKwlkZXYtPmlycSA9IDA7CisJZGV2LT5yZWFkX3N1YmRldiA9IE5VTEw7CisJZGV2LT53cml0ZV9zdWJkZXYgPSBOVUxMOworCWRldi0+b3BlbiA9IE5VTEw7CisJZGV2LT5jbG9zZSA9IE5VTEw7CisJY29tZWRpX3NldF9od19kZXYoZGV2LCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQgX19jb21lZGlfZGV2aWNlX2RldGFjaChjb21lZGlfZGV2aWNlICogZGV2KQoreworCWRldi0+YXR0YWNoZWQgPSAwOworCWlmIChkZXYtPmRyaXZlcikgeworCQlkZXYtPmRyaXZlci0+ZGV0YWNoKGRldik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCJCVUc6IGRldi0+ZHJpdmVyPU5VTEwgaW4gY29tZWRpX2RldmljZV9kZXRhY2goKVxuIik7CisJfQorCWNsZWFudXBfZGV2aWNlKGRldik7Cit9CisKK3ZvaWQgY29tZWRpX2RldmljZV9kZXRhY2goY29tZWRpX2RldmljZSAqIGRldikKK3sKKwlpZiAoIWRldi0+YXR0YWNoZWQpCisJCXJldHVybjsKKwlfX2NvbWVkaV9kZXZpY2VfZGV0YWNoKGRldik7Cit9CisKK2ludCBjb21lZGlfZGV2aWNlX2F0dGFjaChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfZGV2Y29uZmlnICogaXQpCit7CisJY29tZWRpX2RyaXZlciAqZHJpdjsKKwlpbnQgcmV0OworCisJaWYgKGRldi0+YXR0YWNoZWQpCisJCXJldHVybiAtRUJVU1k7CisKKwlmb3IgKGRyaXYgPSBjb21lZGlfZHJpdmVyczsgZHJpdjsgZHJpdiA9IGRyaXYtPm5leHQpIHsKKwkJaWYgKCF0cnlfbW9kdWxlX2dldChkcml2LT5tb2R1bGUpKSB7CisJCQlwcmludGsoImNvbWVkaTogZmFpbGVkIHRvIGluY3JlbWVudCBtb2R1bGUgY291bnQsIHNraXBwaW5nXG4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChkcml2LT5udW1fbmFtZXMpIHsKKwkJCWRldi0+Ym9hcmRfcHRyID0gY29tZWRpX3JlY29nbml6ZShkcml2LCBpdC0+Ym9hcmRfbmFtZSk7CisJCQlpZiAoZGV2LT5ib2FyZF9wdHIgPT0gTlVMTCkgeworCQkJCW1vZHVsZV9wdXQoZHJpdi0+bW9kdWxlKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChzdHJjbXAoZHJpdi0+ZHJpdmVyX25hbWUsIGl0LT5ib2FyZF9uYW1lKSkgeworCQkJCW1vZHVsZV9wdXQoZHJpdi0+bW9kdWxlKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQkvL2luaXRpYWxpemUgZGV2LT5kcml2ZXIgaGVyZSBzbyBjb21lZGlfZXJyb3IoKSBjYW4gYmUgY2FsbGVkIGZyb20gYXR0YWNoCisJCWRldi0+ZHJpdmVyID0gZHJpdjsKKwkJcmV0ID0gZHJpdi0+YXR0YWNoKGRldiwgaXQpOworCQlpZiAocmV0IDwgMCkgeworCQkJbW9kdWxlX3B1dChkZXYtPmRyaXZlci0+bW9kdWxlKTsKKwkJCV9fY29tZWRpX2RldmljZV9kZXRhY2goZGV2KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJZ290byBhdHRhY2hlZDsKKwl9CisKKwkvLyByZWNvZ25pemUgaGFzIGZhaWxlZCBpZiB3ZSBnZXQgaGVyZQorCS8vIHJlcG9ydCB2YWxpZCBib2FyZCBuYW1lcyBiZWZvcmUgcmV0dXJuaW5nIGVycm9yCisJZm9yIChkcml2ID0gY29tZWRpX2RyaXZlcnM7IGRyaXY7IGRyaXYgPSBkcml2LT5uZXh0KSB7CisJCWlmICghdHJ5X21vZHVsZV9nZXQoZHJpdi0+bW9kdWxlKSkgeworCQkJcHJpbnRrKCJjb21lZGk6IGZhaWxlZCB0byBpbmNyZW1lbnQgbW9kdWxlIGNvdW50XG4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWNvbWVkaV9yZXBvcnRfYm9hcmRzKGRyaXYpOworCQltb2R1bGVfcHV0KGRyaXYtPm1vZHVsZSk7CisJfQorCXJldHVybiAtRUlPOworCithdHRhY2hlZDoKKwkvKiBkbyBhIGxpdHRsZSBwb3N0LWNvbmZpZyBjbGVhbnVwICovCisJcmV0ID0gcG9zdGNvbmZpZyhkZXYpOworCW1vZHVsZV9wdXQoZGV2LT5kcml2ZXItPm1vZHVsZSk7CisJaWYgKHJldCA8IDApIHsKKwkJX19jb21lZGlfZGV2aWNlX2RldGFjaChkZXYpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmICghZGV2LT5ib2FyZF9uYW1lKSB7CisJCXByaW50aygiQlVHOiBkZXYtPmJvYXJkX25hbWU9PCVwPlxuIiwgZGV2LT5ib2FyZF9uYW1lKTsKKwkJZGV2LT5ib2FyZF9uYW1lID0gIkJVRyI7CisJfQorCXNtcF93bWIoKTsKKwlkZXYtPmF0dGFjaGVkID0gMTsKKworCXJldHVybiAwOworfQorCitpbnQgY29tZWRpX2RyaXZlcl9yZWdpc3Rlcihjb21lZGlfZHJpdmVyICogZHJpdmVyKQoreworCWRyaXZlci0+bmV4dCA9IGNvbWVkaV9kcml2ZXJzOworCWNvbWVkaV9kcml2ZXJzID0gZHJpdmVyOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoY29tZWRpX2RyaXZlciAqIGRyaXZlcikKK3sKKwljb21lZGlfZHJpdmVyICpwcmV2OworCWludCBpOworCisJLyogY2hlY2sgZm9yIGRldmljZXMgdXNpbmcgdGhpcyBkcml2ZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQ09NRURJX05VTV9CT0FSRF9NSU5PUlM7IGkrKykgeworCQlzdHJ1Y3QgY29tZWRpX2RldmljZV9maWxlX2luZm8gKmRldl9maWxlX2luZm8gPSBjb21lZGlfZ2V0X2RldmljZV9maWxlX2luZm8oaSk7CisJCWNvbWVkaV9kZXZpY2UgKmRldjsKKworCQlpZihkZXZfZmlsZV9pbmZvID09IE5VTEwpIGNvbnRpbnVlOworCQlkZXYgPSBkZXZfZmlsZV9pbmZvLT5kZXZpY2U7CisKKwkJbXV0ZXhfbG9jaygmZGV2LT5tdXRleCk7CisJCWlmIChkZXYtPmF0dGFjaGVkICYmIGRldi0+ZHJpdmVyID09IGRyaXZlcikgeworCQkJaWYgKGRldi0+dXNlX2NvdW50KQorCQkJCXByaW50aygiQlVHISBkZXRhY2hpbmcgZGV2aWNlIHdpdGggdXNlX2NvdW50PSVkXG4iLCBkZXYtPnVzZV9jb3VudCk7CisJCQljb21lZGlfZGV2aWNlX2RldGFjaChkZXYpOworCQl9CisJCW11dGV4X3VubG9jaygmZGV2LT5tdXRleCk7CisJfQorCisJaWYgKGNvbWVkaV9kcml2ZXJzID09IGRyaXZlcikgeworCQljb21lZGlfZHJpdmVycyA9IGRyaXZlci0+bmV4dDsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChwcmV2ID0gY29tZWRpX2RyaXZlcnM7IHByZXYtPm5leHQ7IHByZXYgPSBwcmV2LT5uZXh0KSB7CisJCWlmIChwcmV2LT5uZXh0ID09IGRyaXZlcikgeworCQkJcHJldi0+bmV4dCA9IGRyaXZlci0+bmV4dDsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHBvc3Rjb25maWcoY29tZWRpX2RldmljZSAqIGRldikKK3sKKwlpbnQgaTsKKwljb21lZGlfc3ViZGV2aWNlICpzOworCWNvbWVkaV9hc3luYyAqYXN5bmMgPSBOVUxMOworCWludCByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5uX3N1YmRldmljZXM7IGkrKykgeworCQlzID0gZGV2LT5zdWJkZXZpY2VzICsgaTsKKworCQlpZiAocy0+dHlwZSA9PSBDT01FRElfU1VCRF9VTlVTRUQpCisJCQljb250aW51ZTsKKworCQlpZiAocy0+bGVuX2NoYW5saXN0ID09IDApCisJCQlzLT5sZW5fY2hhbmxpc3QgPSAxOworCisJCWlmIChzLT5kb19jbWQpIHsKKwkJCUJVR19PTigocy0+c3ViZGV2X2ZsYWdzICYgKFNERl9DTURfUkVBRCB8CisJCQkJU0RGX0NNRF9XUklURSkpID09IDApOworCQkJQlVHX09OKCFzLT5kb19jbWR0ZXN0KTsKKworCQkJYXN5bmMgPSBremFsbG9jKHNpemVvZihjb21lZGlfYXN5bmMpLCBHRlBfS0VSTkVMKTsKKwkJCWlmIChhc3luYyA9PSBOVUxMKSB7CisJCQkJcHJpbnRrKCJmYWlsZWQgdG8gYWxsb2NhdGUgYXN5bmMgc3RydWN0XG4iKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmFzeW5jLT53YWl0X2hlYWQpOworCQkJYXN5bmMtPnN1YmRldmljZSA9IHM7CisJCQlzLT5hc3luYyA9IGFzeW5jOworCisjZGVmaW5lIERFRkFVTFRfQlVGX01BWFNJWkUgKDY0KjEwMjQpCisjZGVmaW5lIERFRkFVTFRfQlVGX1NJWkUgKDY0KjEwMjQpCisKKwkJCWFzeW5jLT5tYXhfYnVmc2l6ZSA9IERFRkFVTFRfQlVGX01BWFNJWkU7CisKKwkJCWFzeW5jLT5wcmVhbGxvY19idWYgPSBOVUxMOworCQkJYXN5bmMtPnByZWFsbG9jX2J1ZnN6ID0gMDsKKwkJCWlmIChjb21lZGlfYnVmX2FsbG9jKGRldiwgcywgREVGQVVMVF9CVUZfU0laRSkgPCAwKSB7CisJCQkJcHJpbnRrKCJCdWZmZXIgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJaWYgKHMtPmJ1Zl9jaGFuZ2UpIHsKKwkJCQlyZXQgPSBzLT5idWZfY2hhbmdlKGRldiwgcywgREVGQVVMVF9CVUZfU0laRSk7CisJCQkJaWYgKHJldCA8IDApCisJCQkJCXJldHVybiByZXQ7CisJCQl9CisJCQljb21lZGlfYWxsb2Nfc3ViZGV2aWNlX21pbm9yKGRldiwgcyk7CisJCX0KKworCQlpZiAoIXMtPnJhbmdlX3RhYmxlICYmICFzLT5yYW5nZV90YWJsZV9saXN0KQorCQkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfdW5rbm93bjsKKworCQlpZiAoIXMtPmluc25fcmVhZCAmJiBzLT5pbnNuX2JpdHMpCisJCQlzLT5pbnNuX3JlYWQgPSBpbnNuX3J3X2VtdWxhdGVfYml0czsKKwkJaWYgKCFzLT5pbnNuX3dyaXRlICYmIHMtPmluc25fYml0cykKKwkJCXMtPmluc25fd3JpdGUgPSBpbnNuX3J3X2VtdWxhdGVfYml0czsKKworCQlpZiAoIXMtPmluc25fcmVhZCkKKwkJCXMtPmluc25fcmVhZCA9IGluc25faW52YWw7CisJCWlmICghcy0+aW5zbl93cml0ZSkKKwkJCXMtPmluc25fd3JpdGUgPSBpbnNuX2ludmFsOworCQlpZiAoIXMtPmluc25fYml0cykKKwkJCXMtPmluc25fYml0cyA9IGluc25faW52YWw7CisJCWlmICghcy0+aW5zbl9jb25maWcpCisJCQlzLT5pbnNuX2NvbmZpZyA9IGluc25faW52YWw7CisKKwkJaWYgKCFzLT5wb2xsKQorCQkJcy0+cG9sbCA9IHBvbGxfaW52YWxpZDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLy8gZ2VuZXJpYyByZWNvZ25pemUgZnVuY3Rpb24gZm9yIGRyaXZlcnMgdGhhdCByZWdpc3RlciB0aGVpciBzdXBwb3J0ZWQgYm9hcmQgbmFtZXMKK3ZvaWQgKmNvbWVkaV9yZWNvZ25pemUoY29tZWRpX2RyaXZlciAqIGRyaXYsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJdW5zaWduZWQgaTsKKwljb25zdCBjaGFyICpjb25zdCAqbmFtZV9wdHIgPSBkcml2LT5ib2FyZF9uYW1lOworCWZvciAoaSA9IDA7IGkgPCBkcml2LT5udW1fbmFtZXM7IGkrKykgeworCQlpZiAoc3RyY21wKCpuYW1lX3B0ciwgbmFtZSkgPT0gMCkKKwkJCXJldHVybiAodm9pZCAqKW5hbWVfcHRyOworCQluYW1lX3B0ciA9CisJCQkoY29uc3QgY2hhciAqY29uc3QgKikoKGNvbnN0IGNoYXIgKiluYW1lX3B0ciArCisJCQlkcml2LT5vZmZzZXQpOworCX0KKworCXJldHVybiBOVUxMOworfQorCit2b2lkIGNvbWVkaV9yZXBvcnRfYm9hcmRzKGNvbWVkaV9kcml2ZXIgKiBkcml2KQoreworCXVuc2lnbmVkIGludCBpOworCWNvbnN0IGNoYXIgKmNvbnN0ICpuYW1lX3B0cjsKKworCXByaW50aygiY29tZWRpOiB2YWxpZCBib2FyZCBuYW1lcyBmb3IgJXMgZHJpdmVyIGFyZTpcbiIsCisJCWRyaXYtPmRyaXZlcl9uYW1lKTsKKworCW5hbWVfcHRyID0gZHJpdi0+Ym9hcmRfbmFtZTsKKwlmb3IgKGkgPSAwOyBpIDwgZHJpdi0+bnVtX25hbWVzOyBpKyspIHsKKwkJcHJpbnRrKCIgJXNcbiIsICpuYW1lX3B0cik7CisJCW5hbWVfcHRyID0gKGNvbnN0IGNoYXIgKiopKChjaGFyICopbmFtZV9wdHIgKyBkcml2LT5vZmZzZXQpOworCX0KKworCWlmIChkcml2LT5udW1fbmFtZXMgPT0gMCkKKwkJcHJpbnRrKCIgJXNcbiIsIGRyaXYtPmRyaXZlcl9uYW1lKTsKK30KKworc3RhdGljIGludCBwb2xsX2ludmFsaWQoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMpCit7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK2ludCBpbnNuX2ludmFsKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGluc25fcndfZW11bGF0ZV9iaXRzKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworCWNvbWVkaV9pbnNuIG5ld19pbnNuOworCWludCByZXQ7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYW5uZWxzX3Blcl9iaXRmaWVsZCA9IDMyOworCisJdW5zaWduZWQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCWNvbnN0IHVuc2lnbmVkIGJhc2VfYml0ZmllbGRfY2hhbm5lbCA9CisJCShjaGFuIDwgY2hhbm5lbHNfcGVyX2JpdGZpZWxkKSA/IDAgOiBjaGFuOworCWxzYW1wbF90IG5ld19kYXRhWzJdOworCW1lbXNldChuZXdfZGF0YSwgMCwgc2l6ZW9mKG5ld19kYXRhKSk7CisJbWVtc2V0KCZuZXdfaW5zbiwgMCwgc2l6ZW9mKG5ld19pbnNuKSk7CisJbmV3X2luc24uaW5zbiA9IElOU05fQklUUzsKKwluZXdfaW5zbi5jaGFuc3BlYyA9IGJhc2VfYml0ZmllbGRfY2hhbm5lbDsKKwluZXdfaW5zbi5uID0gMjsKKwluZXdfaW5zbi5kYXRhID0gbmV3X2RhdGE7CisJbmV3X2luc24uc3ViZGV2ID0gaW5zbi0+c3ViZGV2OworCisJaWYgKGluc24tPmluc24gPT0gSU5TTl9XUklURSkgeworCQlpZiAoIShzLT5zdWJkZXZfZmxhZ3MgJiBTREZfV1JJVEFCTEUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCW5ld19kYXRhWzBdID0gMSA8PCAoY2hhbiAtIGJhc2VfYml0ZmllbGRfY2hhbm5lbCk7CS8qIG1hc2sgKi8KKwkJbmV3X2RhdGFbMV0gPSBkYXRhWzBdID8gKDEgPDwgKGNoYW4gLSBiYXNlX2JpdGZpZWxkX2NoYW5uZWwpKSA6IDA7CS8qIGJpdHMgKi8KKwl9CisKKwlyZXQgPSBzLT5pbnNuX2JpdHMoZGV2LCBzLCAmbmV3X2luc24sIG5ld19kYXRhKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChpbnNuLT5pbnNuID09IElOU05fUkVBRCkgeworCQlkYXRhWzBdID0gKG5ld19kYXRhWzFdID4+IChjaGFuIC0gYmFzZV9iaXRmaWVsZF9jaGFubmVsKSkgJiAxOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdXZpcnRfdG9fa3ZhKHBnZF90ICogcGdkLCB1bnNpZ25lZCBsb25nIGFkcikKK3sKKwl1bnNpZ25lZCBsb25nIHJldCA9IDBVTDsKKwlwbWRfdCAqcG1kOworCXB0ZV90ICpwdGVwLCBwdGU7CisJcHVkX3QgKnB1ZDsKKworCWlmICghcGdkX25vbmUoKnBnZCkpIHsKKwkJcHVkID0gcHVkX29mZnNldChwZ2QsIGFkcik7CisJCXBtZCA9IHBtZF9vZmZzZXQocHVkLCBhZHIpOworCQlpZiAoIXBtZF9ub25lKCpwbWQpKSB7CisJCQlwdGVwID0gcHRlX29mZnNldF9rZXJuZWwocG1kLCBhZHIpOworCQkJcHRlID0gKnB0ZXA7CisJCQlpZiAocHRlX3ByZXNlbnQocHRlKSkgeworCQkJCXJldCA9ICh1bnNpZ25lZCBsb25nKQorCQkJCQlwYWdlX2FkZHJlc3MocHRlX3BhZ2UocHRlKSk7CisJCQkJcmV0IHw9IChhZHIgJiAoUEFHRV9TSVpFIC0gMSkpOworCQkJfQorCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBrdmlydF90b19rdmEodW5zaWduZWQgbG9uZyBhZHIpCit7CisJdW5zaWduZWQgbG9uZyB2YSwga3ZhOworCisJdmEgPSBhZHI7CisJa3ZhID0gdXZpcnRfdG9fa3ZhKHBnZF9vZmZzZXRfayh2YSksIHZhKTsKKworCXJldHVybiBrdmE7Cit9CisKK2ludCBjb21lZGlfYnVmX2FsbG9jKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCXVuc2lnbmVkIGxvbmcgbmV3X3NpemUpCit7CisJY29tZWRpX2FzeW5jICphc3luYyA9IHMtPmFzeW5jOworCisJLyogUm91bmQgdXAgbmV3X3NpemUgdG8gbXVsdGlwbGUgb2YgUEFHRV9TSVpFICovCisJbmV3X3NpemUgPSAobmV3X3NpemUgKyBQQUdFX1NJWkUgLSAxKSAmIFBBR0VfTUFTSzsKKworCS8qIGlmIG5vIGNoYW5nZSBpcyByZXF1aXJlZCwgZG8gbm90aGluZyAqLworCWlmIChhc3luYy0+cHJlYWxsb2NfYnVmICYmIGFzeW5jLT5wcmVhbGxvY19idWZzeiA9PSBuZXdfc2l6ZSkgeworCQlyZXR1cm4gMDsKKwl9CisJLy8gZGVhbGxvY2F0ZSBvbGQgYnVmZmVyCisJaWYgKGFzeW5jLT5wcmVhbGxvY19idWYpIHsKKwkJdnVubWFwKGFzeW5jLT5wcmVhbGxvY19idWYpOworCQlhc3luYy0+cHJlYWxsb2NfYnVmID0gTlVMTDsKKwkJYXN5bmMtPnByZWFsbG9jX2J1ZnN6ID0gMDsKKwl9CisJaWYgKGFzeW5jLT5idWZfcGFnZV9saXN0KSB7CisJCXVuc2lnbmVkIGk7CisJCWZvciAoaSA9IDA7IGkgPCBhc3luYy0+bl9idWZfcGFnZXM7ICsraSkgeworCQkJaWYgKGFzeW5jLT5idWZfcGFnZV9saXN0W2ldLnZpcnRfYWRkcikgeworCQkJCW1lbV9tYXBfdW5yZXNlcnZlKHZpcnRfdG9fcGFnZShhc3luYy0+CisJCQkJCQlidWZfcGFnZV9saXN0W2ldLnZpcnRfYWRkcikpOworCQkJCWlmIChzLT5hc3luY19kbWFfZGlyICE9IERNQV9OT05FKSB7CisJCQkJCWRtYV9mcmVlX2NvaGVyZW50KGRldi0+aHdfZGV2LAorCQkJCQkJUEFHRV9TSVpFLAorCQkJCQkJYXN5bmMtPmJ1Zl9wYWdlX2xpc3RbaV0uCisJCQkJCQl2aXJ0X2FkZHIsCisJCQkJCQlhc3luYy0+YnVmX3BhZ2VfbGlzdFtpXS4KKwkJCQkJCWRtYV9hZGRyKTsKKwkJCQl9IGVsc2UgeworCQkJCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYXN5bmMtPgorCQkJCQkJYnVmX3BhZ2VfbGlzdFtpXS52aXJ0X2FkZHIpOworCQkJCX0KKwkJCX0KKwkJfQorCQl2ZnJlZShhc3luYy0+YnVmX3BhZ2VfbGlzdCk7CisJCWFzeW5jLT5idWZfcGFnZV9saXN0ID0gTlVMTDsKKwkJYXN5bmMtPm5fYnVmX3BhZ2VzID0gMDsKKwl9CisJLy8gYWxsb2NhdGUgbmV3IGJ1ZmZlcgorCWlmIChuZXdfc2l6ZSkgeworCQl1bnNpZ25lZCBpID0gMDsKKwkJdW5zaWduZWQgbl9wYWdlcyA9IG5ld19zaXplID4+IFBBR0VfU0hJRlQ7CisJCXN0cnVjdCBwYWdlICoqcGFnZXMgPSBOVUxMOworCisJCWFzeW5jLT5idWZfcGFnZV9saXN0ID0KKwkJCXZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBjb21lZGlfYnVmX3BhZ2UpICogbl9wYWdlcyk7CisJCWlmIChhc3luYy0+YnVmX3BhZ2VfbGlzdCkgeworCQkJbWVtc2V0KGFzeW5jLT5idWZfcGFnZV9saXN0LCAwLAorCQkJCXNpemVvZihzdHJ1Y3QgY29tZWRpX2J1Zl9wYWdlKSAqIG5fcGFnZXMpOworCQkJcGFnZXMgPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgcGFnZSAqKSAqIG5fcGFnZXMpOworCQl9CisJCWlmIChwYWdlcykgeworCQkJZm9yIChpID0gMDsgaSA8IG5fcGFnZXM7IGkrKykgeworCQkJCWlmIChzLT5hc3luY19kbWFfZGlyICE9IERNQV9OT05FKSB7CisJCQkJCWFzeW5jLT5idWZfcGFnZV9saXN0W2ldLnZpcnRfYWRkciA9CisJCQkJCQlkbWFfYWxsb2NfY29oZXJlbnQoZGV2LT5od19kZXYsCisJCQkJCQlQQUdFX1NJWkUsCisJCQkJCQkmYXN5bmMtPmJ1Zl9wYWdlX2xpc3RbaV0uCisJCQkJCQlkbWFfYWRkciwKKwkJCQkJCUdGUF9LRVJORUwgfCBfX0dGUF9DT01QKTsKKwkJCQl9IGVsc2UgeworCQkJCQlhc3luYy0+YnVmX3BhZ2VfbGlzdFtpXS52aXJ0X2FkZHIgPQorCQkJCQkJKHZvaWQgKikKKwkJCQkJCWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwkJCQl9CisJCQkJaWYgKGFzeW5jLT5idWZfcGFnZV9saXN0W2ldLnZpcnRfYWRkciA9PSBOVUxMKSB7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQltZW1fbWFwX3Jlc2VydmUodmlydF90b19wYWdlKGFzeW5jLT4KKwkJCQkJCWJ1Zl9wYWdlX2xpc3RbaV0udmlydF9hZGRyKSk7CisJCQkJcGFnZXNbaV0gPQorCQkJCQl2aXJ0X3RvX3BhZ2UoYXN5bmMtPmJ1Zl9wYWdlX2xpc3RbaV0uCisJCQkJCXZpcnRfYWRkcik7CisJCQl9CisJCX0KKwkJaWYgKGkgPT0gbl9wYWdlcykgeworCQkJYXN5bmMtPnByZWFsbG9jX2J1ZiA9CisJCQkJdm1hcChwYWdlcywgbl9wYWdlcywgVk1fTUFQLAorCQkJCVBBR0VfS0VSTkVMX05PQ0FDSEUpOworCQl9CisJCWlmIChwYWdlcykgeworCQkJdmZyZWUocGFnZXMpOworCQl9CisJCWlmIChhc3luYy0+cHJlYWxsb2NfYnVmID09IE5VTEwpIHsKKwkJCS8qIFNvbWUgYWxsb2NhdGlvbiBmYWlsZWQgYWJvdmUuICovCisJCQlpZiAoYXN5bmMtPmJ1Zl9wYWdlX2xpc3QpIHsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgbl9wYWdlczsgaSsrKSB7CisJCQkJCWlmIChhc3luYy0+YnVmX3BhZ2VfbGlzdFtpXS52aXJ0X2FkZHIgPT0KKwkJCQkJCU5VTEwpIHsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCW1lbV9tYXBfdW5yZXNlcnZlKHZpcnRfdG9fcGFnZShhc3luYy0+CisJCQkJCQkJYnVmX3BhZ2VfbGlzdFtpXS4KKwkJCQkJCQl2aXJ0X2FkZHIpKTsKKwkJCQkJaWYgKHMtPmFzeW5jX2RtYV9kaXIgIT0gRE1BX05PTkUpIHsKKwkJCQkJCWRtYV9mcmVlX2NvaGVyZW50KGRldi0+aHdfZGV2LAorCQkJCQkJCVBBR0VfU0laRSwKKwkJCQkJCQlhc3luYy0+YnVmX3BhZ2VfbGlzdFtpXS4KKwkJCQkJCQl2aXJ0X2FkZHIsCisJCQkJCQkJYXN5bmMtPmJ1Zl9wYWdlX2xpc3RbaV0uCisJCQkJCQkJZG1hX2FkZHIpOworCQkJCQl9IGVsc2UgeworCQkJCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWFzeW5jLT4KKwkJCQkJCQlidWZfcGFnZV9saXN0W2ldLgorCQkJCQkJCXZpcnRfYWRkcik7CisJCQkJCX0KKwkJCQl9CisJCQkJdmZyZWUoYXN5bmMtPmJ1Zl9wYWdlX2xpc3QpOworCQkJCWFzeW5jLT5idWZfcGFnZV9saXN0ID0gTlVMTDsKKwkJCX0KKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCWFzeW5jLT5uX2J1Zl9wYWdlcyA9IG5fcGFnZXM7CisJfQorCWFzeW5jLT5wcmVhbGxvY19idWZzeiA9IG5ld19zaXplOworCisJcmV0dXJuIDA7Cit9CisKKy8qIG11bmdpbmcgaXMgYXBwbGllZCB0byBkYXRhIGJ5IGNvcmUgYXMgaXQgcGFzc2VzIGJldHdlZW4gdXNlcgorICogYW5kIGtlcm5lbCBzcGFjZSAqLwordW5zaWduZWQgaW50IGNvbWVkaV9idWZfbXVuZ2UoY29tZWRpX2FzeW5jICogYXN5bmMsIHVuc2lnbmVkIGludCBudW1fYnl0ZXMpCit7CisJY29tZWRpX3N1YmRldmljZSAqcyA9IGFzeW5jLT5zdWJkZXZpY2U7CisJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKKwljb25zdCB1bnNpZ25lZCBudW1fc2FtcGxlX2J5dGVzID0gYnl0ZXNfcGVyX3NhbXBsZShzKTsKKworCWlmIChzLT5tdW5nZSA9PSBOVUxMIHx8IChhc3luYy0+Y21kLmZsYWdzICYgQ01ERl9SQVdEQVRBKSkgeworCQlhc3luYy0+bXVuZ2VfY291bnQgKz0gbnVtX2J5dGVzOworCQlpZiAoKGludCkoYXN5bmMtPm11bmdlX2NvdW50IC0gYXN5bmMtPmJ1Zl93cml0ZV9jb3VudCkgPiAwKQorCQkJQlVHKCk7CisJCXJldHVybiBudW1fYnl0ZXM7CisJfQorCS8qIGRvbid0IG11bmdlIHBhcnRpYWwgc2FtcGxlcyAqLworCW51bV9ieXRlcyAtPSBudW1fYnl0ZXMgJSBudW1fc2FtcGxlX2J5dGVzOworCXdoaWxlIChjb3VudCA8IG51bV9ieXRlcykgeworCQlpbnQgYmxvY2tfc2l6ZTsKKworCQlibG9ja19zaXplID0gbnVtX2J5dGVzIC0gY291bnQ7CisJCWlmIChibG9ja19zaXplIDwgMCkgeworCQkJcnRfcHJpbnRrKCIlczogJXM6IGJ1ZyEgYmxvY2tfc2l6ZSBpcyBuZWdhdGl2ZVxuIiwKKwkJCQlfX0ZJTEVfXywgX19mdW5jX18pOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKChpbnQpKGFzeW5jLT5tdW5nZV9wdHIgKyBibG9ja19zaXplIC0KKwkJCQlhc3luYy0+cHJlYWxsb2NfYnVmc3opID4gMCkKKwkJCWJsb2NrX3NpemUgPSBhc3luYy0+cHJlYWxsb2NfYnVmc3ogLSBhc3luYy0+bXVuZ2VfcHRyOworCisJCXMtPm11bmdlKHMtPmRldmljZSwgcywgYXN5bmMtPnByZWFsbG9jX2J1ZiArIGFzeW5jLT5tdW5nZV9wdHIsCisJCQlibG9ja19zaXplLCBhc3luYy0+bXVuZ2VfY2hhbik7CisKKwkJc21wX3dtYigpOwkvL2JhcnJpZXIgaW5zdXJlcyBkYXRhIGlzIG11bmdlZCBpbiBidWZmZXIgYmVmb3JlIG11bmdlX2NvdW50IGlzIGluY3JlbWVudGVkCisKKwkJYXN5bmMtPm11bmdlX2NoYW4gKz0gYmxvY2tfc2l6ZSAvIG51bV9zYW1wbGVfYnl0ZXM7CisJCWFzeW5jLT5tdW5nZV9jaGFuICU9IGFzeW5jLT5jbWQuY2hhbmxpc3RfbGVuOworCQlhc3luYy0+bXVuZ2VfY291bnQgKz0gYmxvY2tfc2l6ZTsKKwkJYXN5bmMtPm11bmdlX3B0ciArPSBibG9ja19zaXplOworCQlhc3luYy0+bXVuZ2VfcHRyICU9IGFzeW5jLT5wcmVhbGxvY19idWZzejsKKwkJY291bnQgKz0gYmxvY2tfc2l6ZTsKKwl9CisJaWYgKChpbnQpKGFzeW5jLT5tdW5nZV9jb3VudCAtIGFzeW5jLT5idWZfd3JpdGVfY291bnQpID4gMCkKKwkJQlVHKCk7CisJcmV0dXJuIGNvdW50OworfQorCit1bnNpZ25lZCBpbnQgY29tZWRpX2J1Zl93cml0ZV9uX2F2YWlsYWJsZShjb21lZGlfYXN5bmMgKiBhc3luYykKK3sKKwl1bnNpZ25lZCBpbnQgZnJlZV9lbmQ7CisJdW5zaWduZWQgaW50IG5ieXRlczsKKworCWlmIChhc3luYyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWZyZWVfZW5kID0gYXN5bmMtPmJ1Zl9yZWFkX2NvdW50ICsgYXN5bmMtPnByZWFsbG9jX2J1ZnN6OworCW5ieXRlcyA9IGZyZWVfZW5kIC0gYXN5bmMtPmJ1Zl93cml0ZV9hbGxvY19jb3VudDsKKwluYnl0ZXMgLT0gbmJ5dGVzICUgYnl0ZXNfcGVyX3NhbXBsZShhc3luYy0+c3ViZGV2aWNlKTsKKwkvKiBiYXJyaWVyIGluc3VyZXMgdGhlIHJlYWQgb2YgYnVmX3JlYWRfY291bnQgaW4gdGhpcworCSAgIHF1ZXJ5IG9jY3VycyBiZWZvcmUgYW55IGZvbGxvd2luZyB3cml0ZXMgdG8gdGhlIGJ1ZmZlciB3aGljaAorCSAgIG1pZ2h0IGJlIGJhc2VkIG9uIHRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGlzIHF1ZXJ5LgorCSAqLworCXNtcF9tYigpOworCXJldHVybiBuYnl0ZXM7Cit9CisKKy8qIGFsbG9jYXRlcyBjaHVuayBmb3IgdGhlIHdyaXRlciBmcm9tIGZyZWUgYnVmZmVyIHNwYWNlICovCit1bnNpZ25lZCBpbnQgY29tZWRpX2J1Zl93cml0ZV9hbGxvYyhjb21lZGlfYXN5bmMgKiBhc3luYywgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwl1bnNpZ25lZCBpbnQgZnJlZV9lbmQgPSBhc3luYy0+YnVmX3JlYWRfY291bnQgKyBhc3luYy0+cHJlYWxsb2NfYnVmc3o7CisKKwlpZiAoKGludCkoYXN5bmMtPmJ1Zl93cml0ZV9hbGxvY19jb3VudCArIG5ieXRlcyAtIGZyZWVfZW5kKSA+IDApIHsKKwkJbmJ5dGVzID0gZnJlZV9lbmQgLSBhc3luYy0+YnVmX3dyaXRlX2FsbG9jX2NvdW50OworCX0KKwlhc3luYy0+YnVmX3dyaXRlX2FsbG9jX2NvdW50ICs9IG5ieXRlczsKKwkvKiBiYXJyaWVyIGluc3VyZXMgdGhlIHJlYWQgb2YgYnVmX3JlYWRfY291bnQgYWJvdmUgb2NjdXJzIGJlZm9yZQorCSAgIHdlIHdyaXRlIGRhdGEgdG8gdGhlIHdyaXRlLWFsbG9jJ2VkIGJ1ZmZlciBzcGFjZSAqLworCXNtcF9tYigpOworCXJldHVybiBuYnl0ZXM7Cit9CisKKy8qIGFsbG9jYXRlcyBub3RoaW5nIHVubGVzcyBpdCBjYW4gY29tcGxldGVseSBmdWxmaWxsIHRoZSByZXF1ZXN0ICovCit1bnNpZ25lZCBpbnQgY29tZWRpX2J1Zl93cml0ZV9hbGxvY19zdHJpY3QoY29tZWRpX2FzeW5jICogYXN5bmMsCisJdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwl1bnNpZ25lZCBpbnQgZnJlZV9lbmQgPSBhc3luYy0+YnVmX3JlYWRfY291bnQgKyBhc3luYy0+cHJlYWxsb2NfYnVmc3o7CisKKwlpZiAoKGludCkoYXN5bmMtPmJ1Zl93cml0ZV9hbGxvY19jb3VudCArIG5ieXRlcyAtIGZyZWVfZW5kKSA+IDApIHsKKwkJbmJ5dGVzID0gMDsKKwl9CisJYXN5bmMtPmJ1Zl93cml0ZV9hbGxvY19jb3VudCArPSBuYnl0ZXM7CisJLyogYmFycmllciBpbnN1cmVzIHRoZSByZWFkIG9mIGJ1Zl9yZWFkX2NvdW50IGFib3ZlIG9jY3VycyBiZWZvcmUKKwkgICB3ZSB3cml0ZSBkYXRhIHRvIHRoZSB3cml0ZS1hbGxvYydlZCBidWZmZXIgc3BhY2UgKi8KKwlzbXBfbWIoKTsKKwlyZXR1cm4gbmJ5dGVzOworfQorCisvKiB0cmFuc2ZlcnMgYSBjaHVuayBmcm9tIHdyaXRlciB0byBmaWxsZWQgYnVmZmVyIHNwYWNlICovCit1bnNpZ25lZCBjb21lZGlfYnVmX3dyaXRlX2ZyZWUoY29tZWRpX2FzeW5jICogYXN5bmMsIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJaWYgKChpbnQpKGFzeW5jLT5idWZfd3JpdGVfY291bnQgKyBuYnl0ZXMgLQorCQkJYXN5bmMtPmJ1Zl93cml0ZV9hbGxvY19jb3VudCkgPiAwKSB7CisJCXJ0X3ByaW50aworCQkJKCJjb21lZGk6IGF0dGVtcHRlZCB0byB3cml0ZS1mcmVlIG1vcmUgYnl0ZXMgdGhhbiBoYXZlIGJlZW4gd3JpdGUtYWxsb2NhdGVkLlxuIik7CisJCW5ieXRlcyA9IGFzeW5jLT5idWZfd3JpdGVfYWxsb2NfY291bnQgLSBhc3luYy0+YnVmX3dyaXRlX2NvdW50OworCX0KKwlhc3luYy0+YnVmX3dyaXRlX2NvdW50ICs9IG5ieXRlczsKKwlhc3luYy0+YnVmX3dyaXRlX3B0ciArPSBuYnl0ZXM7CisJY29tZWRpX2J1Zl9tdW5nZShhc3luYywgYXN5bmMtPmJ1Zl93cml0ZV9jb3VudCAtIGFzeW5jLT5tdW5nZV9jb3VudCk7CisJaWYgKGFzeW5jLT5idWZfd3JpdGVfcHRyID49IGFzeW5jLT5wcmVhbGxvY19idWZzeikgeworCQlhc3luYy0+YnVmX3dyaXRlX3B0ciAlPSBhc3luYy0+cHJlYWxsb2NfYnVmc3o7CisJfQorCXJldHVybiBuYnl0ZXM7Cit9CisKKy8qIGFsbG9jYXRlcyBhIGNodW5rIGZvciB0aGUgcmVhZGVyIGZyb20gZmlsbGVkIChhbmQgbXVuZ2VkKSBidWZmZXIgc3BhY2UgKi8KK3Vuc2lnbmVkIGNvbWVkaV9idWZfcmVhZF9hbGxvYyhjb21lZGlfYXN5bmMgKiBhc3luYywgdW5zaWduZWQgbmJ5dGVzKQoreworCWlmICgoaW50KShhc3luYy0+YnVmX3JlYWRfYWxsb2NfY291bnQgKyBuYnl0ZXMgLSBhc3luYy0+bXVuZ2VfY291bnQpID4KKwkJMCkgeworCQluYnl0ZXMgPSBhc3luYy0+bXVuZ2VfY291bnQgLSBhc3luYy0+YnVmX3JlYWRfYWxsb2NfY291bnQ7CisJfQorCWFzeW5jLT5idWZfcmVhZF9hbGxvY19jb3VudCArPSBuYnl0ZXM7CisJLyogYmFycmllciBpbnN1cmVzIHJlYWQgb2YgbXVuZ2VfY291bnQgb2NjdXJzIGJlZm9yZSB3ZSBhY3R1YWxseSByZWFkCisJICAgZGF0YSBvdXQgb2YgYnVmZmVyICovCisJc21wX3JtYigpOworCXJldHVybiBuYnl0ZXM7Cit9CisKKy8qIHRyYW5zZmVycyBjb250cm9sIG9mIGEgY2h1bmsgZnJvbSByZWFkZXIgdG8gZnJlZSBidWZmZXIgc3BhY2UgKi8KK3Vuc2lnbmVkIGNvbWVkaV9idWZfcmVhZF9mcmVlKGNvbWVkaV9hc3luYyAqIGFzeW5jLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCS8vIGJhcnJpZXIgaW5zdXJlcyBkYXRhIGhhcyBiZWVuIHJlYWQgb3V0IG9mIGJ1ZmZlciBiZWZvcmUgcmVhZCBjb3VudCBpcyBpbmNyZW1lbnRlZAorCXNtcF9tYigpOworCWlmICgoaW50KShhc3luYy0+YnVmX3JlYWRfY291bnQgKyBuYnl0ZXMgLQorCQkJYXN5bmMtPmJ1Zl9yZWFkX2FsbG9jX2NvdW50KSA+IDApIHsKKwkJcnRfcHJpbnRrCisJCQkoImNvbWVkaTogYXR0ZW1wdGVkIHRvIHJlYWQtZnJlZSBtb3JlIGJ5dGVzIHRoYW4gaGF2ZSBiZWVuIHJlYWQtYWxsb2NhdGVkLlxuIik7CisJCW5ieXRlcyA9IGFzeW5jLT5idWZfcmVhZF9hbGxvY19jb3VudCAtIGFzeW5jLT5idWZfcmVhZF9jb3VudDsKKwl9CisJYXN5bmMtPmJ1Zl9yZWFkX2NvdW50ICs9IG5ieXRlczsKKwlhc3luYy0+YnVmX3JlYWRfcHRyICs9IG5ieXRlczsKKwlhc3luYy0+YnVmX3JlYWRfcHRyICU9IGFzeW5jLT5wcmVhbGxvY19idWZzejsKKwlyZXR1cm4gbmJ5dGVzOworfQorCit2b2lkIGNvbWVkaV9idWZfbWVtY3B5X3RvKGNvbWVkaV9hc3luYyAqIGFzeW5jLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCWNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBudW1fYnl0ZXMpCit7CisJdW5zaWduZWQgaW50IHdyaXRlX3B0ciA9IGFzeW5jLT5idWZfd3JpdGVfcHRyICsgb2Zmc2V0OworCisJaWYgKHdyaXRlX3B0ciA+PSBhc3luYy0+cHJlYWxsb2NfYnVmc3opCisJCXdyaXRlX3B0ciAlPSBhc3luYy0+cHJlYWxsb2NfYnVmc3o7CisKKwl3aGlsZSAobnVtX2J5dGVzKSB7CisJCXVuc2lnbmVkIGludCBibG9ja19zaXplOworCisJCWlmICh3cml0ZV9wdHIgKyBudW1fYnl0ZXMgPiBhc3luYy0+cHJlYWxsb2NfYnVmc3opCisJCQlibG9ja19zaXplID0gYXN5bmMtPnByZWFsbG9jX2J1ZnN6IC0gd3JpdGVfcHRyOworCQllbHNlCisJCQlibG9ja19zaXplID0gbnVtX2J5dGVzOworCisJCW1lbWNweShhc3luYy0+cHJlYWxsb2NfYnVmICsgd3JpdGVfcHRyLCBkYXRhLCBibG9ja19zaXplKTsKKworCQlkYXRhICs9IGJsb2NrX3NpemU7CisJCW51bV9ieXRlcyAtPSBibG9ja19zaXplOworCisJCXdyaXRlX3B0ciA9IDA7CisJfQorfQorCit2b2lkIGNvbWVkaV9idWZfbWVtY3B5X2Zyb20oY29tZWRpX2FzeW5jICogYXN5bmMsIHVuc2lnbmVkIGludCBvZmZzZXQsCisJdm9pZCAqZGVzdCwgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwl2b2lkICpzcmM7CisJdW5zaWduZWQgaW50IHJlYWRfcHRyID0gYXN5bmMtPmJ1Zl9yZWFkX3B0ciArIG9mZnNldDsKKworCWlmIChyZWFkX3B0ciA+PSBhc3luYy0+cHJlYWxsb2NfYnVmc3opCisJCXJlYWRfcHRyICU9IGFzeW5jLT5wcmVhbGxvY19idWZzejsKKworCXdoaWxlIChuYnl0ZXMpIHsKKwkJdW5zaWduZWQgaW50IGJsb2NrX3NpemU7CisKKwkJc3JjID0gYXN5bmMtPnByZWFsbG9jX2J1ZiArIHJlYWRfcHRyOworCisJCWlmIChuYnl0ZXMgPj0gYXN5bmMtPnByZWFsbG9jX2J1ZnN6IC0gcmVhZF9wdHIpCisJCQlibG9ja19zaXplID0gYXN5bmMtPnByZWFsbG9jX2J1ZnN6IC0gcmVhZF9wdHI7CisJCWVsc2UKKwkJCWJsb2NrX3NpemUgPSBuYnl0ZXM7CisKKwkJbWVtY3B5KGRlc3QsIHNyYywgYmxvY2tfc2l6ZSk7CisJCW5ieXRlcyAtPSBibG9ja19zaXplOworCQlkZXN0ICs9IGJsb2NrX3NpemU7CisJCXJlYWRfcHRyID0gMDsKKwl9Cit9CisKK3Vuc2lnbmVkIGludCBjb21lZGlfYnVmX3JlYWRfbl9hdmFpbGFibGUoY29tZWRpX2FzeW5jICogYXN5bmMpCit7CisJdW5zaWduZWQgbnVtX2J5dGVzOworCisJaWYgKGFzeW5jID09IE5VTEwpCisJCXJldHVybiAwOworCW51bV9ieXRlcyA9IGFzeW5jLT5tdW5nZV9jb3VudCAtIGFzeW5jLT5idWZfcmVhZF9jb3VudDsKKwkvKiBiYXJyaWVyIGluc3VyZXMgdGhlIHJlYWQgb2YgbXVuZ2VfY291bnQgaW4gdGhpcworCSAgIHF1ZXJ5IG9jY3VycyBiZWZvcmUgYW55IGZvbGxvd2luZyByZWFkcyBvZiB0aGUgYnVmZmVyIHdoaWNoCisJICAgbWlnaHQgYmUgYmFzZWQgb24gdGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoaXMgcXVlcnkuCisJICovCisJc21wX3JtYigpOworCXJldHVybiBudW1fYnl0ZXM7Cit9CisKK2ludCBjb21lZGlfYnVmX2dldChjb21lZGlfYXN5bmMgKiBhc3luYywgc2FtcGxfdCAqIHgpCit7CisJdW5zaWduZWQgaW50IG4gPSBjb21lZGlfYnVmX3JlYWRfbl9hdmFpbGFibGUoYXN5bmMpOworCisJaWYgKG4gPCBzaXplb2Yoc2FtcGxfdCkpCisJCXJldHVybiAwOworCWNvbWVkaV9idWZfcmVhZF9hbGxvYyhhc3luYywgc2l6ZW9mKHNhbXBsX3QpKTsKKwkqeCA9ICooc2FtcGxfdCAqKSAoYXN5bmMtPnByZWFsbG9jX2J1ZiArIGFzeW5jLT5idWZfcmVhZF9wdHIpOworCWNvbWVkaV9idWZfcmVhZF9mcmVlKGFzeW5jLCBzaXplb2Yoc2FtcGxfdCkpOworCXJldHVybiAxOworfQorCitpbnQgY29tZWRpX2J1Zl9wdXQoY29tZWRpX2FzeW5jICogYXN5bmMsIHNhbXBsX3QgeCkKK3sKKwl1bnNpZ25lZCBpbnQgbiA9IGNvbWVkaV9idWZfd3JpdGVfYWxsb2Nfc3RyaWN0KGFzeW5jLCBzaXplb2Yoc2FtcGxfdCkpOworCisJaWYgKG4gPCBzaXplb2Yoc2FtcGxfdCkpIHsKKwkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1I7CisJCXJldHVybiAwOworCX0KKwkqKHNhbXBsX3QgKikgKGFzeW5jLT5wcmVhbGxvY19idWYgKyBhc3luYy0+YnVmX3dyaXRlX3B0cikgPSB4OworCWNvbWVkaV9idWZfd3JpdGVfZnJlZShhc3luYywgc2l6ZW9mKHNhbXBsX3QpKTsKKwlyZXR1cm4gMTsKK30KKwordm9pZCBjb21lZGlfcmVzZXRfYXN5bmNfYnVmKGNvbWVkaV9hc3luYyAqIGFzeW5jKQoreworCWFzeW5jLT5idWZfd3JpdGVfYWxsb2NfY291bnQgPSAwOworCWFzeW5jLT5idWZfd3JpdGVfY291bnQgPSAwOworCWFzeW5jLT5idWZfcmVhZF9hbGxvY19jb3VudCA9IDA7CisJYXN5bmMtPmJ1Zl9yZWFkX2NvdW50ID0gMDsKKworCWFzeW5jLT5idWZfd3JpdGVfcHRyID0gMDsKKwlhc3luYy0+YnVmX3JlYWRfcHRyID0gMDsKKworCWFzeW5jLT5jdXJfY2hhbiA9IDA7CisJYXN5bmMtPnNjYW5fcHJvZ3Jlc3MgPSAwOworCWFzeW5jLT5tdW5nZV9jaGFuID0gMDsKKwlhc3luYy0+bXVuZ2VfY291bnQgPSAwOworCWFzeW5jLT5tdW5nZV9wdHIgPSAwOworCisJYXN5bmMtPmV2ZW50cyA9IDA7Cit9CisKK2ludCBjb21lZGlfYXV0b19jb25maWcoc3RydWN0IGRldmljZSAqaGFyZHdhcmVfZGV2aWNlLCBjb25zdCBjaGFyICpib2FyZF9uYW1lLCBjb25zdCBpbnQgKm9wdGlvbnMsIHVuc2lnbmVkIG51bV9vcHRpb25zKQoreworCWNvbWVkaV9kZXZjb25maWcgaXQ7CisJaW50IG1pbm9yOworCXN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqZGV2X2ZpbGVfaW5mbzsKKwlpbnQgcmV0dmFsOworCisJbWlub3IgPSBjb21lZGlfYWxsb2NfYm9hcmRfbWlub3IoaGFyZHdhcmVfZGV2aWNlKTsKKwlpZihtaW5vciA8IDApIHJldHVybiBtaW5vcjsKKwlkZXZfc2V0X2RydmRhdGEoaGFyZHdhcmVfZGV2aWNlLCAodm9pZCopKHVuc2lnbmVkIGxvbmcpbWlub3IpOworCisJZGV2X2ZpbGVfaW5mbyA9IGNvbWVkaV9nZXRfZGV2aWNlX2ZpbGVfaW5mbyhtaW5vcik7CisKKwltZW1zZXQoJml0LCAwLCBzaXplb2YoaXQpKTsKKwlzdHJuY3B5KGl0LmJvYXJkX25hbWUsIGJvYXJkX25hbWUsIENPTUVESV9OQU1FTEVOKTsKKwlpdC5ib2FyZF9uYW1lW0NPTUVESV9OQU1FTEVOIC0gMV0gPSAnXDAnOworCUJVR19PTihudW1fb3B0aW9ucyA+IENPTUVESV9OREVWQ09ORk9QVFMpOworCW1lbWNweShpdC5vcHRpb25zLCBvcHRpb25zLCBudW1fb3B0aW9ucyAqIHNpemVvZihpbnQpKTsKKworCW11dGV4X2xvY2soJmRldl9maWxlX2luZm8tPmRldmljZS0+bXV0ZXgpOworCXJldHZhbCA9IGNvbWVkaV9kZXZpY2VfYXR0YWNoKGRldl9maWxlX2luZm8tPmRldmljZSwgJml0KTsKKwltdXRleF91bmxvY2soJmRldl9maWxlX2luZm8tPmRldmljZS0+bXV0ZXgpOworCWlmKHJldHZhbCA8IDApCisJeworCQljb21lZGlfZnJlZV9ib2FyZF9taW5vcihtaW5vcik7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKK3ZvaWQgY29tZWRpX2F1dG9fdW5jb25maWcoc3RydWN0IGRldmljZSAqaGFyZHdhcmVfZGV2aWNlKQoreworCXVuc2lnbmVkIGxvbmcgbWlub3IgPSAodW5zaWduZWQgbG9uZylkZXZfZ2V0X2RydmRhdGEoaGFyZHdhcmVfZGV2aWNlKTsKKworCUJVR19PTihtaW5vciA+PSBDT01FRElfTlVNX0JPQVJEX01JTk9SUyk7CisKKwljb21lZGlfZnJlZV9ib2FyZF9taW5vcihtaW5vcik7Cit9CisKK2ludCBjb21lZGlfcGNpX2F1dG9fY29uZmlnKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsIGNvbnN0IGNoYXIgKmJvYXJkX25hbWUpCit7CisJaW50IG9wdGlvbnNbMl07CisKKwkvLyBwY2kgYnVzCisJb3B0aW9uc1swXSA9IHBjaWRldi0+YnVzLT5udW1iZXI7CisJLy8gcGNpIHNsb3QKKwlvcHRpb25zWzFdID0gUENJX1NMT1QocGNpZGV2LT5kZXZmbik7CisKKwlyZXR1cm4gY29tZWRpX2F1dG9fY29uZmlnKCZwY2lkZXYtPmRldiwgYm9hcmRfbmFtZSwgb3B0aW9ucywgc2l6ZW9mKG9wdGlvbnMpIC8gc2l6ZW9mKG9wdGlvbnNbMF0pKTsKK30KKwordm9pZCBjb21lZGlfcGNpX2F1dG9fdW5jb25maWcoc3RydWN0IHBjaV9kZXYgKnBjaWRldikKK3sKKwljb21lZGlfYXV0b191bmNvbmZpZygmcGNpZGV2LT5kZXYpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViN2E2MTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvTWFrZWZpbGUKQEAgLTAsMCArMSwyMSBAQAorIyBNYWtlZmlsZSBmb3IgaW5kaXZpZHVhbCBjb21lZGkgZHJpdmVycworIworCisjIENvbWVkaSAiaGVscGVyIiBtb2R1bGVzCitvYmotJChDT05GSUdfQ09NRURJKQkJCSs9IGNvbWVkaV9mYy5vCitvYmotJChDT05GSUdfQ09NRURJKQkJCSs9IGNvbWVkaV9ib25kLm8KK29iai0kKENPTkZJR19DT01FREkpCQkJKz0gY29tZWRpX3Rlc3Qubworb2JqLSQoQ09ORklHX0NPTUVESSkJCQkrPSBjb21lZGlfcGFycG9ydC5vCisKKyMgQ29tZWRpIFBDSSBkcml2ZXJzCitvYmotJChDT05GSUdfQ09NRURJX1BDSV9EUklWRVJTKQkrPSBtaXRlLm8KK29iai0kKENPTkZJR19DT01FRElfUENJX0RSSVZFUlMpCSs9IGljcF9tdWx0aS5vCitvYmotJChDT05GSUdfQ09NRURJX1BDSV9EUklWRVJTKQkrPSBtZV9kYXEubworb2JqLSQoQ09ORklHX0NPTUVESV9QQ0lfRFJJVkVSUykJKz0gbWU0MDAwLm8KK29iai0kKENPTkZJR19DT01FRElfUENJX0RSSVZFUlMpCSs9IHJ0ZDUyMC5vCitvYmotJChDT05GSUdfQ09NRURJX1BDSV9EUklWRVJTKQkrPSBzNjI2Lm8KKworIyBDb21lZGkgVVNCIGRyaXZlcnMKK29iai0kKENPTkZJR19DT01FRElfVVNCX0RSSVZFUlMpCSs9IHVzYmR1eC5vCitvYmotJChDT05GSUdfQ09NRURJX1VTQl9EUklWRVJTKQkrPSB1c2JkdXhmYXN0Lm8KK29iai0kKENPTkZJR19DT01FRElfVVNCX0RSSVZFUlMpCSs9IGR0OTgxMi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2JvbmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfYm9uZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNTQ5NmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2JvbmQuYwpAQCAtMCwwICsxLDUzNSBAQAorLyoKKyAgICBjb21lZGkvZHJpdmVycy9jb21lZGlfYm9uZC5jCisgICAgQSBDb21lZGkgZHJpdmVyIHRvICdib25kJyBvciBtZXJnZSBtdWx0aXBsZSBkcml2ZXJzIGFuZCBkZXZpY2VzIGFzIG9uZS4KKworICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDAgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgICAgQ29weXJpZ2h0IChDKSAyMDA1IENhbGluIEEuIEN1bGlhbnUgPGNhbGluQGFqdmFyLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworLyoKK0RyaXZlcjogY29tZWRpX2JvbmQKK0Rlc2NyaXB0aW9uOiBBIGRyaXZlciB0byAnYm9uZCcgKG1lcmdlKSBtdWx0aXBsZSBzdWJkZXZpY2VzIGZyb20gbXVsdGlwbGUKKwkgICAgIGRldmljZXMgdG9nZXRoZXIgYXMgb25lLgorRGV2aWNlczoKK0F1dGhvcjogZHMKK1VwZGF0ZWQ6IE1vbiwgMTAgT2N0IDAwOjE4OjI1IC0wNTAwCitTdGF0dXM6IHdvcmtzCisKK1RoaXMgZHJpdmVyIGFsbG93cyB5b3UgdG8gJ2JvbmQnIChtZXJnZSkgbXVsdGlwbGUgY29tZWRpIHN1YmRldmljZXMKKyhjb21pbmcgZnJvbSBwb3NzaWJseSBkaWZmZXJlbmNlIGJvYXJkcyBhbmQvb3IgZHJpdmVycykgdG9nZXRoZXIuICBGb3IKK2V4YW1wbGUsIGlmIHlvdSBoYWQgYSBib2FyZCB3aXRoIDIgZGlmZmVyZW50IERJTyBzdWJkZXZpY2VzLCBhbmQKK2Fub3RoZXIgd2l0aCAxIERJTyBzdWJkZXZpY2UsIHlvdSBjb3VsZCAnYm9uZCcgdGhlbSB3aXRoIHRoaXMgZHJpdmVyCitzbyB0aGF0IHRoZXkgbG9vayBsaWtlIG9uZSBiaWcgZmF0IERJTyBzdWJkZXZpY2UuICBUaGlzIG1ha2VzIHdyaXRpbmcKK2FwcGxpY2F0aW9ucyBzbGlnaHRseSBlYXNpZXIgYXMgeW91IGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgbWFuYWdpbmcKK2RpZmZlcmVudCBzdWJkZXZpY2VzIGluIHRoZSBhcHBsaWNhdGlvbiAtLSB5b3UganVzdCB3b3JyeSBhYm91dAoraW5kZXhpbmcgb25lIGxpbmVhciBhcnJheSBvZiBjaGFubmVsIGlkJ3MuCisKK1JpZ2h0IG5vdyBvbmx5IERJTyBzdWJkZXZpY2VzIGFyZSBzdXBwb3J0ZWQgYXMgdGhhdCdzIHRoZSBwZXJzb25hbCBpdGNoCitJIGFtIHNjcmF0Y2hpbmcgd2l0aCB0aGlzIGRyaXZlci4gIElmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBBSSBhbmQgQU8KK3N1YmRldnMsIGdvIHJpZ2h0IG9uIGFoZWFkIGFuZCBkbyBzbyEKKworQ29tbWFuZHMgYXJlbid0IHN1cHBvcnRlZCAtLSBhbHRob3VnaCBpdCB3b3VsZCBiZSBjb29sIGlmIHRoZXkgd2VyZS4KKworQ29uZmlndXJhdGlvbiBPcHRpb25zOgorICBMaXN0IG9mIGNvbWVkaS1taW5vcnMgdG8gYm9uZC4gIEFsbCBzdWJkZXZpY2VzIG9mIHRoZSBzYW1lIHR5cGUKKyAgd2l0aGluIGVhY2ggbWlub3Igd2lsbCBiZSBjb25jYXRlbmF0ZWQgdG9nZXRoZXIgaW4gdGhlIG9yZGVyIGdpdmVuIGhlcmUuCisqLworCisvKgorICogVGhlIHByZXZpb3VzIGJsb2NrIGNvbW1lbnQgaXMgdXNlZCB0byBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlCisgKiBkb2N1bWVudGF0aW9uIGluIENvbWVkaSBhbmQgQ29tZWRpbGliLiAgVGhlIGZpZWxkczoKKyAqCisgKiBEcml2ZXI6IHRoZSBuYW1lIG9mIHRoZSBkcml2ZXIKKyAqIERlc2NyaXB0aW9uOiBhIHNob3J0IHBocmFzZSBkZXNjcmliaW5nIHRoZSBkcml2ZXIuICBEb24ndCBsaXN0IGJvYXJkcy4KKyAqIERldmljZXM6IGEgZnVsbCBsaXN0IG9mIHRoZSBib2FyZHMgdGhhdCBhdHRlbXB0IHRvIGJlIHN1cHBvcnRlZCBieQorICogICB0aGUgZHJpdmVyLiAgRm9ybWF0IGlzICIobWFudWZhY3R1cmVyKSBib2FyZCBuYW1lIFtjb21lZGkgbmFtZV0iLAorICogICB3aGVyZSBjb21lZGlfbmFtZSBpcyB0aGUgbmFtZSB0aGF0IGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBib2FyZC4KKyAqICAgU2VlIHRoZSBjb21tZW50IG5lYXIgYm9hcmRfbmFtZTogaW4gdGhlIGNvbWVkaV9kcml2ZXIgc3RydWN0dXJlCisgKiAgIGJlbG93LiAgSWYgKG1hbnVmYWN0dXJlcikgb3IgW2NvbWVkaSBuYW1lXSBpcyBtaXNzaW5nLCB0aGUgcHJldmlvdXMKKyAqICAgdmFsdWUgaXMgdXNlZC4KKyAqIEF1dGhvcjogeW91CisgKiBVcGRhdGVkOiBkYXRlIHdoZW4gdGhlIF9kb2N1bWVudGF0aW9uXyB3YXMgbGFzdCB1cGRhdGVkLiAgVXNlICdkYXRlIC1SJworICogICB0byBnZXQgYSB2YWx1ZSBmb3IgdGhpcy4KKyAqIFN0YXR1czogYSBvbmUtd29yZCBkZXNjcmlwdGlvbiBvZiB0aGUgc3RhdHVzLiAgVmFsaWQgdmFsdWVzIGFyZToKKyAqICAgd29ya3MgLSBkcml2ZXIgd29ya3MgY29ycmVjdGx5IG9uIG1vc3QgYm9hcmRzIHN1cHBvcnRlZCwgYW5kCisgKiAgICAgcGFzc2VzIGNvbWVkaV90ZXN0LgorICogICB1bmtub3duIC0gdW5rbm93bi4gIFVzdWFsbHkgcHV0IHRoZXJlIGJ5IGRzLgorICogICBleHBlcmltZW50YWwgLSBtYXkgbm90IHdvcmsgaW4gYW55IHBhcnRpY3VsYXIgcmVsZWFzZS4gIEF1dGhvcgorICogICAgIHByb2JhYmx5IHdhbnRzIGFzc2lzdGFuY2UgdGVzdGluZyBpdC4KKyAqICAgYml0cm90dGVuIC0gZHJpdmVyIGhhcyBub3QgYmVlbiB1cGRhdGUgaW4gYSBsb25nIHRpbWUsIHByb2JhYmx5CisgKiAgICAgZG9lc24ndCB3b3JrLCBhbmQgcHJvYmFibHkgaXMgbWlzc2luZyBzdXBwb3J0IGZvciBzaWduaWZpY2FudAorICogICAgIENvbWVkaSBpbnRlcmZhY2UgZmVhdHVyZXMuCisgKiAgIHVudGVzdGVkIC0gYXV0aG9yIHByb2JhYmx5IHdyb3RlIGl0ICJibGluZCIsIGFuZCBpcyBiZWxpZXZlZCB0bworICogICAgIHdvcmssIGJ1dCBubyBjb25maXJtYXRpb24uCisgKgorICogVGhlc2UgaGVhZGVycyBzaG91bGQgYmUgZm9sbG93ZWQgYnkgYSBibGFuayBsaW5lLCBhbmQgYW55IGNvbW1lbnRzCisgKiB5b3Ugd2lzaCB0byBzYXkgYWJvdXQgdGhlIGRyaXZlci4gIFRoZSBjb21tZW50IGFyZWEgaXMgdGhlIHBsYWNlCisgKiB0byBwdXQgYW55IGtub3duIGJ1Z3MsIGxpbWl0YXRpb25zLCB1bnN1cHBvcnRlZCBmZWF0dXJlcywgc3VwcG9ydGVkCisgKiBjb21tYW5kIHRyaWdnZXJzLCB3aGV0aGVyIG9yIG5vdCBjb21tYW5kcyBhcmUgc3VwcG9ydGVkIG9uIHBhcnRpY3VsYXIKKyAqIHN1YmRldmljZXMsIGV0Yy4KKyAqCisgKiBTb21ld2hlcmUgaW4gdGhlIGNvbW1lbnQgc2hvdWxkIGJlIGluZm9ybWF0aW9uIGFib3V0IGNvbmZpZ3VyYXRpb24KKyAqIG9wdGlvbnMgdGhhdCBhcmUgdXNlZCB3aXRoIGNvbWVkaV9jb25maWcuCisgKi8KKworI2luY2x1ZGUgIi4uL2NvbWVkaWxpYi5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCisvKiBUaGUgbWF4aXVtdW0gbnVtYmVyIG9mIGNoYW5uZWxzIHBlciBzdWJkZXZpY2UuICovCisjZGVmaW5lIE1BWF9DSEFOUyAyNTYKKworI2RlZmluZSBNT0RVTEVfTkFNRSAiY29tZWRpX2JvbmQiCisjaWZkZWYgTU9EVUxFX0xJQ0VOU0UKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKyNlbmRpZgorI2lmbmRlZiBTVFIKKyMgIGRlZmluZSBTVFIxKHgpICN4CisjICBkZWZpbmUgU1RSKHgpIFNUUjEoeCkKKyNlbmRpZgorCitzdGF0aWMgaW50IGRlYnVnOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIklmIHRydWUsIHByaW50IGV4dHJhIGNyeXB0aWMgZGVidWdnaW5nIG91dHB1dCB1c2VmdWwiCisJCSAib25seSB0byBkZXZlbG9wZXJzLiIpOworCisjZGVmaW5lIExPR19NU0coeC4uLikgcHJpbnRrKEtFUk5fSU5GTyBNT0RVTEVfTkFNRSI6ICJ4KQorI2RlZmluZSBERUJVRyh4Li4uKQkJCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlpZiAoZGVidWcpCQkJCQkJXAorCQkJcHJpbnRrKEtFUk5fREVCVUcgTU9EVUxFX05BTUUiOiBERUJVRzogIngpOwlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgV0FSTklORyh4Li4uKSAgcHJpbnRrKEtFUk5fV0FSTklORyBNT0RVTEVfTkFNRSAiOiBXQVJOSU5HOiAieCkKKyNkZWZpbmUgRVJST1IoeC4uLikgIHByaW50ayhLRVJOX0VSUiBNT0RVTEVfTkFNRSAiOiBJTlRFUk5BTCBFUlJPUjogIngpCitNT0RVTEVfQVVUSE9SKCJDYWxpbiBBLiBDdWxpYW51Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oTU9EVUxFX05BTUUgIkEgZHJpdmVyIGZvciBDT01FREkgdG8gYm9uZCBtdWx0aXBsZSBDT01FREkgIgorCQkgICAiZGV2aWNlcyB0b2dldGhlciBhcyBvbmUuICBJbiB0aGUgd29yZHMgb2YgSm9obiBMZW5ub246ICIKKwkJICAgIidBbmQgdGhlIHdvcmxkIHdpbGwgbGl2ZSBhcyBvbmUuLi4nIik7CisKKy8qCisgKiBCb2FyZCBkZXNjcmlwdGlvbnMgZm9yIHR3byBpbWFnaW5hcnkgYm9hcmRzLiAgRGVzY3JpYmluZyB0aGUKKyAqIGJvYXJkcyBpbiB0aGlzIHdheSBpcyBvcHRpb25hbCwgYW5kIGNvbXBsZXRlbHkgZHJpdmVyLWRlcGVuZGVudC4KKyAqIFNvbWUgZHJpdmVycyB1c2UgYXJyYXlzIHN1Y2ggYXMgdGhpcywgb3RoZXIgZG8gbm90LgorICovCitzdHJ1Y3QgQm9uZGluZ0JvYXJkIHsKKwljb25zdCBjaGFyICpuYW1lOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBCb25kaW5nQm9hcmQgYm9uZGluZ0JvYXJkc1tdID0geworCXsKKwkJLm5hbWUgPQlNT0RVTEVfTkFNRSwKKwl9LAorfTsKKworLyoKKyAqIFVzZWZ1bCBmb3Igc2hvcnRoYW5kIGFjY2VzcyB0byB0aGUgcGFydGljdWxhciBib2FyZCBzdHJ1Y3R1cmUKKyAqLworI2RlZmluZSB0aGlzYm9hcmQgKChjb25zdCBzdHJ1Y3QgQm9uZGluZ0JvYXJkICopZGV2LT5ib2FyZF9wdHIpCisKK3N0cnVjdCBCb25kZWREZXZpY2UgeworCWNvbWVkaV90ICpkZXY7CisJdW5zaWduZWQgbWlub3I7CisJdW5zaWduZWQgc3ViZGV2OworCXVuc2lnbmVkIHN1YmRldl90eXBlOworCXVuc2lnbmVkIG5jaGFuczsKKwl1bnNpZ25lZCBjaGFuaWRfb2Zmc2V0OwkvKiBUaGUgb2Zmc2V0IGludG8gb3VyIHVuaWZpZWQgbGluZWFyCisJCQkJICAgY2hhbm5lbC1pZCdzIG9mIGNoYW5pZCAwIG9uIHRoaXMKKwkJCQkgICBzdWJkZXZpY2UuICovCit9OworCisvKiB0aGlzIHN0cnVjdHVyZSBpcyBmb3IgZGF0YSB1bmlxdWUgdG8gdGhpcyBoYXJkd2FyZSBkcml2ZXIuICBJZgorICAgc2V2ZXJhbCBoYXJkd2FyZSBkcml2ZXJzIGtlZXAgc2ltaWxhciBpbmZvcm1hdGlvbiBpbiB0aGlzIHN0cnVjdHVyZSwKKyAgIGZlZWwgZnJlZSB0byBzdWdnZXN0IG1vdmluZyB0aGUgdmFyaWFibGUgdG8gdGhlIGNvbWVkaV9kZXZpY2Ugc3RydWN0LiAgKi8KK3N0cnVjdCBQcml2YXRlIHsKKyMgZGVmaW5lIE1BWF9CT0FSRF9OQU1FIDI1NgorCWNoYXIgbmFtZVtNQVhfQk9BUkRfTkFNRV07CisJc3RydWN0IEJvbmRlZERldmljZSAqKmRldnM7CisJdW5zaWduZWQgbmRldnM7CisJc3RydWN0IEJvbmRlZERldmljZSAqY2hhbklkRGV2TWFwW01BWF9DSEFOU107CisJdW5zaWduZWQgbmNoYW5zOworfTsKKworLyoKKyAqIG1vc3QgZHJpdmVycyBkZWZpbmUgdGhlIGZvbGxvd2luZyBtYWNybyB0byBtYWtlIGl0IGVhc3kgdG8KKyAqIGFjY2VzcyB0aGUgcHJpdmF0ZSBzdHJ1Y3R1cmUuCisgKi8KKyNkZWZpbmUgZGV2cHJpdiAoKHN0cnVjdCBQcml2YXRlICopZGV2LT5wcml2YXRlKQorCisvKgorICogVGhlIGNvbWVkaV9kcml2ZXIgc3RydWN0dXJlIHRlbGxzIHRoZSBDb21lZGkgY29yZSBtb2R1bGUKKyAqIHdoaWNoIGZ1bmN0aW9ucyB0byBjYWxsIHRvIGNvbmZpZ3VyZS9kZWNvbmZpZ3VyZSAoYXR0YWNoL2RldGFjaCkKKyAqIHRoZSBib2FyZCwgYW5kIGFsc28gYWJvdXQgdGhlIGtlcm5lbCBtb2R1bGUgdGhhdCBjb250YWlucworICogdGhlIGRldmljZSBjb2RlLgorICovCitzdGF0aWMgaW50IGJvbmRpbmdfYXR0YWNoKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX2RldmNvbmZpZyAqaXQpOworc3RhdGljIGludCBib25kaW5nX2RldGFjaChjb21lZGlfZGV2aWNlICpkZXYpOworLyoqIEJ1aWxkIFByaXZhdGUgYXJyYXkgb2YgYWxsIGRldmljZXMuLiAqLworc3RhdGljIGludCBkb0RldkNvbmZpZyhjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9kZXZjb25maWcgKml0KTsKK3N0YXRpYyB2b2lkIGRvRGV2VW5jb25maWcoY29tZWRpX2RldmljZSAqZGV2KTsKKy8qIFVnbHkgaW1wbGVtZW50YXRpb24gb2YgcmVhbGxvYyB0aGF0IGFsd2F5cyBjb3BpZXMgbWVtb3J5IGFyb3VuZCAtLSBJJ20gbGF6eSwKKyAqIHdoYXQgY2FuIEkgc2F5PyAgSSBsaWtlIHRvIGRvIHdhc3RlZnVsIG1lbWNvcGllcy4uIDopICovCitzdGF0aWMgdm9pZCAqUmVhbGxvYyhjb25zdCB2b2lkICpwdHIsIHNpemVfdCBsZW4sIHNpemVfdCBvbGRfbGVuKTsKKworc3RhdGljIGNvbWVkaV9kcml2ZXIgZHJpdmVyX2JvbmRpbmcgPSB7CisgICAgICAuZHJpdmVyX25hbWUgPQlNT0RVTEVfTkFNRSwKKyAgICAgIC5tb2R1bGUgPQkJVEhJU19NT0RVTEUsCisgICAgICAuYXR0YWNoID0JCWJvbmRpbmdfYXR0YWNoLAorICAgICAgLmRldGFjaCA9CQlib25kaW5nX2RldGFjaCwKKwkvKiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIG1lbWJlcnMgaWYgeW91IGFyZQorCSAqIHdyaXRpbmcgYSBkcml2ZXIgZm9yIGEgSVNBIFBuUCBvciBQQ0kgY2FyZCAqLworCS8qIE1vc3QgZHJpdmVycyB3aWxsIHN1cHBvcnQgbXVsdGlwbGUgdHlwZXMgb2YgYm9hcmRzIGJ5CisJICogaGF2aW5nIGFuIGFycmF5IG9mIGJvYXJkIHN0cnVjdHVyZXMuICBUaGVzZSB3ZXJlIGRlZmluZWQKKwkgKiBpbiBza2VsX2JvYXJkc1tdIGFib3ZlLiAgTm90ZSB0aGF0IHRoZSBlbGVtZW50ICduYW1lJworCSAqIHdhcyBmaXJzdCBpbiB0aGUgc3RydWN0dXJlIC0tIENvbWVkaSB1c2VzIHRoaXMgZmFjdCB0bworCSAqIGV4dHJhY3QgdGhlIG5hbWUgb2YgdGhlIGJvYXJkIHdpdGhvdXQga25vd2luZyBhbnkgZGV0YWlscworCSAqIGFib3V0IHRoZSBzdHJ1Y3R1cmUgZXhjZXB0IGZvciBpdHMgbGVuZ3RoLgorCSAqIFdoZW4gYSBkZXZpY2UgaXMgYXR0YWNoZWQgKGJ5IGNvbWVkaV9jb25maWcpLCB0aGUgbmFtZQorCSAqIG9mIHRoZSBkZXZpY2UgaXMgZ2l2ZW4gdG8gQ29tZWRpLCBhbmQgQ29tZWRpIHRyaWVzIHRvCisJICogbWF0Y2ggaXQgYnkgZ29pbmcgdGhyb3VnaCB0aGUgbGlzdCBvZiBib2FyZCBuYW1lcy4gIElmCisJICogdGhlcmUgaXMgYSBtYXRjaCwgdGhlIGFkZHJlc3Mgb2YgdGhlIHBvaW50ZXIgaXMgcHV0CisJICogaW50byBkZXYtPmJvYXJkX3B0ciBhbmQgZHJpdmVyLT5hdHRhY2goKSBpcyBjYWxsZWQuCisJICoKKwkgKiBOb3RlIHRoYXQgdGhlc2UgYXJlIG5vdCBuZWNlc3NhcnkgaWYgeW91IGNhbiBkZXRlcm1pbmUKKwkgKiB0aGUgdHlwZSBvZiBib2FyZCBpbiBzb2Z0d2FyZS4gIElTQSBQblAsIFBDSSwgYW5kIFBDTUNJQQorCSAqIGRldmljZXMgYXJlIHN1Y2ggYm9hcmRzLgorCSAqLworICAgICAgLmJvYXJkX25hbWUgPQkmYm9uZGluZ0JvYXJkc1swXS5uYW1lLAorICAgICAgLm9mZnNldCA9CQlzaXplb2Yoc3RydWN0IEJvbmRpbmdCb2FyZCksCisgICAgICAubnVtX25hbWVzID0Jc2l6ZW9mKGJvbmRpbmdCb2FyZHMpIC8gc2l6ZW9mKHN0cnVjdCBCb25kaW5nQm9hcmQpLAorfTsKKworc3RhdGljIGludCBib25kaW5nX2Rpb19pbnNuX2JpdHMoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpOworc3RhdGljIGludCBib25kaW5nX2Rpb19pbnNuX2NvbmZpZyhjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJICAgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKTsKKworLyoKKyAqIEF0dGFjaCBpcyBjYWxsZWQgYnkgdGhlIENvbWVkaSBjb3JlIHRvIGNvbmZpZ3VyZSB0aGUgZHJpdmVyCisgKiBmb3IgYSBwYXJ0aWN1bGFyIGJvYXJkLiAgSWYgeW91IHNwZWNpZmllZCBhIGJvYXJkX25hbWUgYXJyYXkKKyAqIGluIHRoZSBkcml2ZXIgc3RydWN0dXJlLCBkZXYtPmJvYXJkX3B0ciBjb250YWlucyB0aGF0CisgKiBhZGRyZXNzLgorICovCitzdGF0aWMgaW50IGJvbmRpbmdfYXR0YWNoKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX2RldmNvbmZpZyAqaXQpCit7CisJY29tZWRpX3N1YmRldmljZSAqczsKKworCUxPR19NU0coImNvbWVkaSVkXG4iLCBkZXYtPm1pbm9yKTsKKworCS8qCisJICogQWxsb2NhdGUgdGhlIHByaXZhdGUgc3RydWN0dXJlIGFyZWEuICBhbGxvY19wcml2YXRlKCkgaXMgYQorCSAqIGNvbnZlbmllbnQgbWFjcm8gZGVmaW5lZCBpbiBjb21lZGlkZXYuaC4KKwkgKi8KKwlpZiAoYWxsb2NfcHJpdmF0ZShkZXYsIHNpemVvZihzdHJ1Y3QgUHJpdmF0ZSkpIDwgMCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKgorCSAqIFNldHVwIG91ciBib25kaW5nIGZyb20gY29uZmlnIHBhcmFtcy4uIHNldHMgdXAgb3VyIFByaXZhdGUgc3RydWN0Li4KKwkgKi8KKwlpZiAoIWRvRGV2Q29uZmlnKGRldiwgaXQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qCisJICogSW5pdGlhbGl6ZSBkZXYtPmJvYXJkX25hbWUuICBOb3RlIHRoYXQgd2UgY2FuIHVzZSB0aGUgInRoaXNib2FyZCIKKwkgKiBtYWNybyBub3csIHNpbmNlIHdlIGp1c3QgaW5pdGlhbGl6ZWQgaXQgaW4gdGhlIGxhc3QgbGluZS4KKwkgKi8KKwlkZXYtPmJvYXJkX25hbWUgPSBkZXZwcml2LT5uYW1lOworCisJLyoKKwkgKiBBbGxvY2F0ZSB0aGUgc3ViZGV2aWNlIHN0cnVjdHVyZXMuICBhbGxvY19zdWJkZXZpY2UoKSBpcyBhCisJICogY29udmVuaWVudCBtYWNybyBkZWZpbmVkIGluIGNvbWVkaWRldi5oLgorCSAqLworCWlmIChhbGxvY19zdWJkZXZpY2VzKGRldiwgMSkgPCAwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXMgPSBkZXYtPnN1YmRldmljZXMgKyAwOworCXMtPnR5cGUgPSBDT01FRElfU1VCRF9ESU87CisJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFIHwgU0RGX1dSSVRBQkxFOworCXMtPm5fY2hhbiA9IGRldnByaXYtPm5jaGFuczsKKwlzLT5tYXhkYXRhID0gMTsKKwlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOworCXMtPmluc25fYml0cyA9IGJvbmRpbmdfZGlvX2luc25fYml0czsKKwlzLT5pbnNuX2NvbmZpZyA9IGJvbmRpbmdfZGlvX2luc25fY29uZmlnOworCisJTE9HX01TRygiYXR0YWNoZWQgd2l0aCAldSBESU8gY2hhbm5lbHMgY29taW5nIGZyb20gJXUgZGlmZmVyZW50ICIKKwkJInN1YmRldmljZXMgYWxsIGJvbmRlZCB0b2dldGhlci4gICIKKwkJIkpvaG4gTGVubm9uIHdvdWxkIGJlIHByb3VkIVxuIiwKKwkJZGV2cHJpdi0+bmNoYW5zLCBkZXZwcml2LT5uZGV2cyk7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIF9kZXRhY2ggaXMgY2FsbGVkIHRvIGRlY29uZmlndXJlIGEgZGV2aWNlLiAgSXQgc2hvdWxkIGRlYWxsb2NhdGUKKyAqIHJlc291cmNlcy4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgYWxzbyBjYWxsZWQgd2hlbiBfYXR0YWNoKCkgZmFpbHMsIHNvIGl0IHNob3VsZCBiZQorICogY2FyZWZ1bCBub3QgdG8gcmVsZWFzZSByZXNvdXJjZXMgdGhhdCB3ZXJlIG5vdCBuZWNlc3NhcmlseQorICogYWxsb2NhdGVkIGJ5IF9hdHRhY2goKS4gIGRldi0+cHJpdmF0ZSBhbmQgZGV2LT5zdWJkZXZpY2VzIGFyZQorICogZGVhbGxvY2F0ZWQgYXV0b21hdGljYWxseSBieSB0aGUgY29yZS4KKyAqLworc3RhdGljIGludCBib25kaW5nX2RldGFjaChjb21lZGlfZGV2aWNlICpkZXYpCit7CisJTE9HX01TRygiY29tZWRpJWQ6IHJlbW92ZVxuIiwgZGV2LT5taW5vcik7CisJZG9EZXZVbmNvbmZpZyhkZXYpOworCXJldHVybiAwOworfQorCisvKiBESU8gZGV2aWNlcyBhcmUgc2xpZ2h0bHkgc3BlY2lhbC4gIEFsdGhvdWdoIGl0IGlzIHBvc3NpYmxlIHRvCisgKiBpbXBsZW1lbnQgdGhlIGluc25fcmVhZC9pbnNuX3dyaXRlIGludGVyZmFjZSwgaXQgaXMgbXVjaCBtb3JlCisgKiB1c2VmdWwgdG8gYXBwbGljYXRpb25zIGlmIHlvdSBpbXBsZW1lbnQgdGhlIGluc25fYml0cyBpbnRlcmZhY2UuCisgKiBUaGlzIGFsbG93cyBwYWNrZWQgcmVhZGluZy93cml0aW5nIG9mIHRoZSBESU8gY2hhbm5lbHMuICBUaGUKKyAqIGNvbWVkaSBjb3JlIGNhbiBjb252ZXJ0IGJldHdlZW4gaW5zbl9iaXRzIGFuZCBpbnNuX3JlYWQvd3JpdGUgKi8KK3N0YXRpYyBpbnQgYm9uZGluZ19kaW9faW5zbl9iaXRzKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworI2RlZmluZSBMU0FNUExfQklUUyAoc2l6ZW9mKGxzYW1wbF90KSo4KQorCXVuc2lnbmVkIG5jaGFucyA9IExTQU1QTF9CSVRTLCBudW1fZG9uZSA9IDAsIGk7CisJaWYgKGluc24tPm4gIT0gMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZGV2cHJpdi0+bmNoYW5zIDwgbmNoYW5zKQorCQluY2hhbnMgPSBkZXZwcml2LT5uY2hhbnM7CisKKwkvKiBUaGUgaW5zbiBkYXRhIGlzIGEgbWFzayBpbiBkYXRhWzBdIGFuZCB0aGUgbmV3IGRhdGEKKwkgKiBpbiBkYXRhWzFdLCBlYWNoIGNoYW5uZWwgY29vcmVzcG9uZGluZyB0byBhIGJpdC4gKi8KKwlmb3IgKGkgPSAwOyBudW1fZG9uZSA8IG5jaGFucyAmJiBpIDwgZGV2cHJpdi0+bmRldnM7ICsraSkgeworCQlzdHJ1Y3QgQm9uZGVkRGV2aWNlICpiZGV2ID0gZGV2cHJpdi0+ZGV2c1tpXTsKKwkJLyogR3JhYiB0aGUgY2hhbm5lbCBtYXNrIGFuZCBkYXRhIG9mIG9ubHkgdGhlIGJpdHMgY29ycmVzcG9uZGluZworCQkgICB0byB0aGlzIHN1YmRldmljZS4uIG5lZWQgdG8gc2hpZnQgdGhlbSB0byB6ZXJvIHBvc2l0aW9uIG9mCisJCSAgIGNvdXJzZS4gKi8KKwkJLyogQml0cyBjb3JyZXNwb25kaW5nIHRvIHRoaXMgc3ViZGV2LiAqLworCQlsc2FtcGxfdCBzdWJkZXZNYXNrID0gKCgxIDw8IGJkZXYtPm5jaGFucykgLSAxKTsKKwkJbHNhbXBsX3Qgd3JpdGVNYXNrLCBkYXRhQml0czsKKworCQkvKiBBcmdoLCB3ZSBoYXZlID49IExTQU1QTF9CSVRTIGNoYW5zLi4gdGFrZSBhbGwgYml0cyAqLworCQlpZiAoYmRldi0+bmNoYW5zID49IExTQU1QTF9CSVRTKQorCQkJc3ViZGV2TWFzayA9IChsc2FtcGxfdCkgKC0xKTsKKworCQl3cml0ZU1hc2sgPSAoZGF0YVswXSA+PiBudW1fZG9uZSkgJiBzdWJkZXZNYXNrOworCQlkYXRhQml0cyA9IChkYXRhWzFdID4+IG51bV9kb25lKSAmIHN1YmRldk1hc2s7CisKKwkJLyogUmVhZC9Xcml0ZSB0aGUgbmV3IGRpZ2l0YWwgbGluZXMgKi8KKwkJaWYgKGNvbWVkaV9kaW9fYml0ZmllbGQoYmRldi0+ZGV2LCBiZGV2LT5zdWJkZXYsIHdyaXRlTWFzaywKKwkJCQkmZGF0YUJpdHMpICE9IDIpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkvKiBNYWtlIHJvb20gZm9yIHRoZSBuZXcgYml0cyBpbiBkYXRhWzFdLCB0aGUgcmV0dXJuIHZhbHVlICovCisJCWRhdGFbMV0gJj0gfihzdWJkZXZNYXNrIDw8IG51bV9kb25lKTsKKwkJLyogUHV0IHRoZSBiaXRzIGluIHRoZSByZXR1cm4gdmFsdWUgKi8KKwkJZGF0YVsxXSB8PSAoZGF0YUJpdHMgJiBzdWJkZXZNYXNrKSA8PCBudW1fZG9uZTsKKwkJLyogU2F2ZSB0aGUgbmV3IGJpdHMgdG8gdGhlIHNhdmVkIHN0YXRlLi4gKi8KKwkJcy0+c3RhdGUgPSBkYXRhWzFdOworCisJCW51bV9kb25lICs9IGJkZXYtPm5jaGFuczsKKwl9CisKKwlyZXR1cm4gaW5zbi0+bjsKK30KKworc3RhdGljIGludCBib25kaW5nX2Rpb19pbnNuX2NvbmZpZyhjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJICAgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyksIHJldCwgaW9fYml0cyA9IHMtPmlvX2JpdHM7CisJdW5zaWduZWQgaW50IGlvOworCXN0cnVjdCBCb25kZWREZXZpY2UgKmJkZXY7CisKKwlpZiAoY2hhbiA8IDAgfHwgY2hhbiA+PSBkZXZwcml2LT5uY2hhbnMpCisJCXJldHVybiAtRUlOVkFMOworCWJkZXYgPSBkZXZwcml2LT5jaGFuSWREZXZNYXBbY2hhbl07CisKKwkvKiBUaGUgaW5wdXQgb3Igb3V0cHV0IGNvbmZpZ3VyYXRpb24gb2YgZWFjaCBkaWdpdGFsIGxpbmUgaXMKKwkgKiBjb25maWd1cmVkIGJ5IGEgc3BlY2lhbCBpbnNuX2NvbmZpZyBpbnN0cnVjdGlvbi4gIGNoYW5zcGVjCisJICogY29udGFpbnMgdGhlIGNoYW5uZWwgdG8gYmUgY2hhbmdlZCwgYW5kIGRhdGFbMF0gY29udGFpbnMgdGhlCisJICogdmFsdWUgQ09NRURJX0lOUFVUIG9yIENPTUVESV9PVVRQVVQuICovCisJc3dpdGNoIChkYXRhWzBdKSB7CisJY2FzZSBJTlNOX0NPTkZJR19ESU9fT1VUUFVUOgorCQlpbyA9IENPTUVESV9PVVRQVVQ7CS8qIGlzIHRoaXMgcmVhbGx5IG5lY2Vzc2FyeT8gKi8KKwkJaW9fYml0cyB8PSAxIDw8IGNoYW47CisJCWJyZWFrOworCWNhc2UgSU5TTl9DT05GSUdfRElPX0lOUFVUOgorCQlpbyA9IENPTUVESV9JTlBVVDsJLyogaXMgdGhpcyByZWFsbHkgbmVjZXNzYXJ5PyAqLworCQlpb19iaXRzICY9IH4oMSA8PCBjaGFuKTsKKwkJYnJlYWs7CisJY2FzZSBJTlNOX0NPTkZJR19ESU9fUVVFUlk6CisJCWRhdGFbMV0gPQorCQkJKGlvX2JpdHMgJiAoMSA8PCBjaGFuKSkgPyBDT01FRElfT1VUUFVUIDogQ09NRURJX0lOUFVUOworCQlyZXR1cm4gaW5zbi0+bjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwkvKiAncmVhbCcgY2hhbm5lbCBpZCBmb3IgdGhpcyBzdWJkZXYuLiAqLworCWNoYW4gLT0gYmRldi0+Y2hhbmlkX29mZnNldDsKKwlyZXQgPSBjb21lZGlfZGlvX2NvbmZpZyhiZGV2LT5kZXYsIGJkZXYtPnN1YmRldiwgY2hhbiwgaW8pOworCWlmIChyZXQgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJLyogRmluYWxseSwgc2F2ZSB0aGUgbmV3IGlvX2JpdHMgdmFsdWVzIHNpbmNlIHdlIGRpZG4ndCBnZXQKKwkgICBhbiBlcnJvciBhYm92ZS4gKi8KKwlzLT5pb19iaXRzID0gaW9fYml0czsKKwlyZXR1cm4gaW5zbi0+bjsKK30KKworc3RhdGljIHZvaWQgKlJlYWxsb2MoY29uc3Qgdm9pZCAqb2xkbWVtLCBzaXplX3QgbmV3bGVuLCBzaXplX3Qgb2xkbGVuKQoreworCXZvaWQgKm5ld21lbSA9IGttYWxsb2MobmV3bGVuLCBHRlBfS0VSTkVMKTsKKworCWlmIChuZXdtZW0gJiYgb2xkbWVtKQorCQltZW1jcHkobmV3bWVtLCBvbGRtZW0sIG1pbihvbGRsZW4sIG5ld2xlbikpOworCWtmcmVlKG9sZG1lbSk7CisJcmV0dXJuIG5ld21lbTsKK30KKworc3RhdGljIGludCBkb0RldkNvbmZpZyhjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9kZXZjb25maWcgKml0KQoreworCWludCBpOworCWNvbWVkaV90ICpkZXZzX29wZW5lZFtDT01FRElfTlVNX0JPQVJEX01JTk9SU107CisKKwltZW1zZXQoZGV2c19vcGVuZWQsIDAsIHNpemVvZihkZXZzX29wZW5lZCkpOworCWRldnByaXYtPm5hbWVbMF0gPSAwOzsKKwkvKiBMb29wIHRocm91Z2ggYWxsIGNvbWVkaSBkZXZpY2VzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZC1saW5lLAorCSAgIGJ1aWxkaW5nIG91ciBkZXZpY2UgbGlzdCAqLworCWZvciAoaSA9IDA7IGkgPCBDT01FRElfTkRFVkNPTkZPUFRTICYmICghaSB8fCBpdC0+b3B0aW9uc1tpXSk7ICsraSkgeworCQljaGFyIGZpbGVbXSA9ICIvZGV2L2NvbWVkaVhYWFhYWCI7CisJCWludCBtaW5vciA9IGl0LT5vcHRpb25zW2ldOworCQljb21lZGlfdCAqZDsKKwkJaW50IHNkZXYgPSAtMSwgbmNoYW5zLCB0bXA7CisJCXN0cnVjdCBCb25kZWREZXZpY2UgKmJkZXYgPSBOVUxMOworCisJCWlmIChtaW5vciA8IDAgfHwgbWlub3IgPiBDT01FRElfTlVNX0JPQVJEX01JTk9SUykgeworCQkJRVJST1IoIk1pbm9yICVkIGlzIGludmFsaWQhXG4iLCBtaW5vcik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAobWlub3IgPT0gZGV2LT5taW5vcikgeworCQkJRVJST1IoIkNhbm5vdCBib25kIHRoaXMgZHJpdmVyIHRvIGl0c2VsZiFcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKGRldnNfb3BlbmVkW21pbm9yXSkgeworCQkJRVJST1IoIk1pbm9yICVkIHNwZWNpZmllZCBtb3JlIHRoYW4gb25jZSFcbiIsIG1pbm9yKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJc25wcmludGYoZmlsZSwgc2l6ZW9mKGZpbGUpLCAiL2Rldi9jb21lZGkldSIsIG1pbm9yKTsKKwkJZmlsZVtzaXplb2YoZmlsZSkgLSAxXSA9IDA7CisKKwkJZCA9IGRldnNfb3BlbmVkW21pbm9yXSA9IGNvbWVkaV9vcGVuKGZpbGUpOworCisJCWlmICghZCkgeworCQkJRVJST1IoIk1pbm9yICV1IGNvdWxkIG5vdCBiZSBvcGVuZWRcbiIsIG1pbm9yKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogRG8gRElPLCBhcyB0aGF0J3MgYWxsIHdlIHN1cHBvcnQgbm93Li4gKi8KKwkJd2hpbGUgKChzZGV2ID0gY29tZWRpX2ZpbmRfc3ViZGV2aWNlX2J5X3R5cGUoZCwgQ09NRURJX1NVQkRfRElPLAorCQkJCQlzZGV2ICsgMSkpID4gLTEpIHsKKwkJCW5jaGFucyA9IGNvbWVkaV9nZXRfbl9jaGFubmVscyhkLCBzZGV2KTsKKwkJCWlmIChuY2hhbnMgPD0gMCkgeworCQkJCUVSUk9SKCJjb21lZGlfZ2V0X25fY2hhbm5lbHMoKSByZXR1cm5lZCAlZCAiCisJCQkJICAgICAgIm9uIG1pbm9yICV1IHN1YmRldiAlZCFcbiIsCisJCQkJICAgICAgbmNoYW5zLCBtaW5vciwgc2Rldik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQliZGV2ID0ga21hbGxvYyhzaXplb2YoKmJkZXYpLCBHRlBfS0VSTkVMKTsKKwkJCWlmICghYmRldikgeworCQkJCUVSUk9SKCJPdXQgb2YgbWVtb3J5LlxuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQliZGV2LT5kZXYgPSBkOworCQkJYmRldi0+bWlub3IgPSBtaW5vcjsKKwkJCWJkZXYtPnN1YmRldiA9IHNkZXY7CisJCQliZGV2LT5zdWJkZXZfdHlwZSA9IENPTUVESV9TVUJEX0RJTzsKKwkJCWJkZXYtPm5jaGFucyA9IG5jaGFuczsKKwkJCWJkZXYtPmNoYW5pZF9vZmZzZXQgPSBkZXZwcml2LT5uY2hhbnM7CisKKwkJCS8qIG1hcCBjaGFubmVsIGlkJ3MgdG8gQm9uZGVkRGV2aWNlICogcG9pbnRlci4uICovCisJCQl3aGlsZSAobmNoYW5zLS0pCisJCQkJZGV2cHJpdi0+Y2hhbklkRGV2TWFwW2RldnByaXYtPm5jaGFucysrXSA9IGJkZXY7CisKKwkJCS8qIE5vdyBwdXQgYmRldiBwb2ludGVyIGF0IGVuZCBvZiBkZXZwcml2LT5kZXZzIGFycmF5CisJCQkgKiBsaXN0Li4gKi8KKworCQkJLyogZXJnaC4uIHVnbHkuLiB3ZSBuZWVkIHRvIHJlYWxsb2MgOiggICovCisJCQl0bXAgPSBkZXZwcml2LT5uZGV2cyAqIHNpemVvZihiZGV2KTsKKwkJCWRldnByaXYtPmRldnMgPQorCQkJCVJlYWxsb2MoZGV2cHJpdi0+ZGV2cywKKwkJCQkrK2RldnByaXYtPm5kZXZzICogc2l6ZW9mKGJkZXYpLCB0bXApOworCQkJaWYgKCFkZXZwcml2LT5kZXZzKSB7CisJCQkJRVJST1IoIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkuICIKKwkJCQkgICAgICAiT3V0IG9mIG1lbW9yeT8iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJZGV2cHJpdi0+ZGV2c1tkZXZwcml2LT5uZGV2cyAtIDFdID0gYmRldjsKKwkJCXsKKwkvKiogQXBwZW5kIGRldjpzdWJkZXYgdG8gZGV2cHJpdi0+bmFtZSAqLworCQkJCWNoYXIgYnVmWzIwXTsKKwkJCQlpbnQgbGVmdCA9CisJCQkJCU1BWF9CT0FSRF9OQU1FIC0gc3RybGVuKGRldnByaXYtPm5hbWUpIC0KKwkJCQkJMTsKKwkJCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJWQ6JWQgIiwgZGV2LT5taW5vciwKKwkJCQkJYmRldi0+c3ViZGV2KTsKKwkJCQlidWZbc2l6ZW9mKGJ1ZikgLSAxXSA9IDA7CisJCQkJc3RybmNhdChkZXZwcml2LT5uYW1lLCBidWYsIGxlZnQpOworCQkJfQorCisJCX0KKwl9CisKKwlpZiAoIWRldnByaXYtPm5jaGFucykgeworCQlFUlJPUigiTm8gY2hhbm5lbHMgZm91bmQhXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGRvRGV2VW5jb25maWcoY29tZWRpX2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZGV2c19jbG9zZWQgPSAwOworCisJaWYgKGRldnByaXYpIHsKKwkJd2hpbGUgKGRldnByaXYtPm5kZXZzLS0gJiYgZGV2cHJpdi0+ZGV2cykgeworCQkJc3RydWN0IEJvbmRlZERldmljZSAqYmRldjsKKworCQkJYmRldiA9IGRldnByaXYtPmRldnNbZGV2cHJpdi0+bmRldnNdOworCQkJaWYgKCFiZGV2KQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCEoZGV2c19jbG9zZWQgJiAoMHgxIDw8IGJkZXYtPm1pbm9yKSkpIHsKKwkJCQljb21lZGlfY2xvc2UoYmRldi0+ZGV2KTsKKwkJCQlkZXZzX2Nsb3NlZCB8PSAoMHgxIDw8IGJkZXYtPm1pbm9yKTsKKwkJCX0KKwkJCWtmcmVlKGJkZXYpOworCQl9CisJCWtmcmVlKGRldnByaXYtPmRldnMpOworCQlkZXZwcml2LT5kZXZzID0gTlVMTDsKKwkJa2ZyZWUoZGV2cHJpdik7CisJCWRldi0+cHJpdmF0ZSA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJcmV0dXJuIGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmRyaXZlcl9ib25kaW5nKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXAodm9pZCkKK3sKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcl9ib25kaW5nKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChjbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfZmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfZmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDc0ZGJlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9mYy5jCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICAgIGNvbWVkaS9kcml2ZXJzL2NvbWVkaV9mYy5jCisKKyAgICBUaGlzIGlzIGEgcGxhY2UgZm9yIGNvZGUgZHJpdmVyIHdyaXRlcnMgd2lzaCB0byBzaGFyZSBiZXR3ZWVuCisgICAgdHdvIG9yIG1vcmUgZHJpdmVycy4gIGZjIGlzIHNob3J0CisgICAgZm9yIGZyYW5rLWNvbW1vbi4KKworICAgIEF1dGhvcjogIEZyYW5rIE1vcmkgSGVzcyA8Zm1oZXNzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDIgRnJhbmsgTW9yaSBIZXNzCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisKKyNpbmNsdWRlICJjb21lZGlfZmMuaCIKKworc3RhdGljIHZvaWQgaW5jcmVtZW50X3NjYW5fcHJvZ3Jlc3MoY29tZWRpX3N1YmRldmljZSAqc3ViZCwKKwkJCQkgICAgdW5zaWduZWQgaW50IG51bV9ieXRlcykKK3sKKwljb21lZGlfYXN5bmMgKmFzeW5jID0gc3ViZC0+YXN5bmM7CisJdW5zaWduZWQgaW50IHNjYW5fbGVuZ3RoID0gY2ZjX2J5dGVzX3Blcl9zY2FuKHN1YmQpOworCisJYXN5bmMtPnNjYW5fcHJvZ3Jlc3MgKz0gbnVtX2J5dGVzOworCWlmIChhc3luYy0+c2Nhbl9wcm9ncmVzcyA+PSBzY2FuX2xlbmd0aCkgeworCQlhc3luYy0+c2Nhbl9wcm9ncmVzcyAlPSBzY2FuX2xlbmd0aDsKKwkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9TOworCX0KK30KKworLyogV3JpdGVzIGFuIGFycmF5IG9mIGRhdGEgcG9pbnRzIHRvIGNvbWVkaSdzIGJ1ZmZlciAqLwordW5zaWduZWQgaW50IGNmY193cml0ZV9hcnJheV90b19idWZmZXIoY29tZWRpX3N1YmRldmljZSAqc3ViZCwgdm9pZCAqZGF0YSwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IG51bV9ieXRlcykKK3sKKwljb21lZGlfYXN5bmMgKmFzeW5jID0gc3ViZC0+YXN5bmM7CisJdW5zaWduZWQgaW50IHJldHZhbDsKKworCWlmIChudW1fYnl0ZXMgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlyZXR2YWwgPSBjb21lZGlfYnVmX3dyaXRlX2FsbG9jKGFzeW5jLCBudW1fYnl0ZXMpOworCWlmIChyZXR2YWwgIT0gbnVtX2J5dGVzKSB7CisJCXJ0X3ByaW50aygiY29tZWRpOiBidWZmZXIgb3ZlcnJ1blxuIik7CisJCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX09WRVJGTE9XOworCQlyZXR1cm4gMDsKKwl9CisKKwljb21lZGlfYnVmX21lbWNweV90byhhc3luYywgMCwgZGF0YSwgbnVtX2J5dGVzKTsKKwljb21lZGlfYnVmX3dyaXRlX2ZyZWUoYXN5bmMsIG51bV9ieXRlcyk7CisJaW5jcmVtZW50X3NjYW5fcHJvZ3Jlc3Moc3ViZCwgbnVtX2J5dGVzKTsKKwlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9CTE9DSzsKKworCXJldHVybiBudW1fYnl0ZXM7Cit9CitFWFBPUlRfU1lNQk9MKGNmY193cml0ZV9hcnJheV90b19idWZmZXIpOworCit1bnNpZ25lZCBpbnQgY2ZjX3JlYWRfYXJyYXlfZnJvbV9idWZmZXIoY29tZWRpX3N1YmRldmljZSAqc3ViZCwgdm9pZCAqZGF0YSwKKwkJCQkJdW5zaWduZWQgaW50IG51bV9ieXRlcykKK3sKKwljb21lZGlfYXN5bmMgKmFzeW5jID0gc3ViZC0+YXN5bmM7CisKKwlpZiAobnVtX2J5dGVzID09IDApCisJCXJldHVybiAwOworCisJbnVtX2J5dGVzID0gY29tZWRpX2J1Zl9yZWFkX2FsbG9jKGFzeW5jLCBudW1fYnl0ZXMpOworCWNvbWVkaV9idWZfbWVtY3B5X2Zyb20oYXN5bmMsIDAsIGRhdGEsIG51bV9ieXRlcyk7CisJY29tZWRpX2J1Zl9yZWFkX2ZyZWUoYXN5bmMsIG51bV9ieXRlcyk7CisJaW5jcmVtZW50X3NjYW5fcHJvZ3Jlc3Moc3ViZCwgbnVtX2J5dGVzKTsKKwlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9CTE9DSzsKKworCXJldHVybiBudW1fYnl0ZXM7Cit9CitFWFBPUlRfU1lNQk9MKGNmY19yZWFkX2FycmF5X2Zyb21fYnVmZmVyKTsKKwordW5zaWduZWQgaW50IGNmY19oYW5kbGVfZXZlbnRzKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqc3ViZCkKK3sKKwl1bnNpZ25lZCBpbnQgZXZlbnRzID0gc3ViZC0+YXN5bmMtPmV2ZW50czsKKworCWlmIChldmVudHMgPT0gMCkKKwkJcmV0dXJuIGV2ZW50czsKKworCWlmIChldmVudHMgJiAoQ09NRURJX0NCX0VPQSB8IENPTUVESV9DQl9FUlJPUiB8IENPTUVESV9DQl9PVkVSRkxPVykpCisJCXN1YmQtPmNhbmNlbChkZXYsIHN1YmQpOworCisJY29tZWRpX2V2ZW50KGRldiwgc3ViZCk7CisKKwlyZXR1cm4gZXZlbnRzOworfQorRVhQT1JUX1NZTUJPTChjZmNfaGFuZGxlX2V2ZW50cyk7CisKK01PRFVMRV9BVVRIT1IoIkZyYW5rIE1vcmkgSGVzcyA8Zm1oZXNzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU2hhcmVkIGZ1bmN0aW9ucyBmb3IgQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXJzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBpbnQgX19pbml0IGNvbWVkaV9mY19pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY29tZWRpX2ZjX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7Cit9CisKK21vZHVsZV9pbml0KGNvbWVkaV9mY19pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChjb21lZGlfZmNfY2xlYW51cF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9mYy5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9mYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NTJmZTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2ZjLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAgICBjb21lZGlfZmMuaAorCisgICAgVGhpcyBpcyBhIHBsYWNlIGZvciBjb2RlIGRyaXZlciB3cml0ZXJzIHdpc2ggdG8gc2hhcmUgYmV0d2VlbgorICAgIHR3byBvciBtb3JlIGRyaXZlcnMuIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbWVhbnQgdG8gYmUgdXNlZCBvbmx5CisgICAgYnkgZHJpdmVycywgdGhleSBhcmUgTk9UIHBhcnQgb2YgdGhlIGtjb21lZGlsaWIgQVBJIQorCisgICAgQXV0aG9yOiAgRnJhbmsgTW9yaSBIZXNzIDxmbWhlc3NAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICAgIENvcHlyaWdodCAoQykgMjAwMiBGcmFuayBNb3JpIEhlc3MKKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0NPTUVESV9GQ19ICisjZGVmaW5lIF9DT01FRElfRkNfSAorCisjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisKKy8qIFdyaXRlcyBhbiBhcnJheSBvZiBkYXRhIHBvaW50cyB0byBjb21lZGkncyBidWZmZXIgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgY2ZjX3dyaXRlX2FycmF5X3RvX2J1ZmZlcihjb21lZGlfc3ViZGV2aWNlICpzdWJkLAorCQkJCQkgICAgICB2b2lkICpkYXRhLAorCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgbnVtX2J5dGVzKTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY2ZjX3dyaXRlX3RvX2J1ZmZlcihjb21lZGlfc3ViZGV2aWNlICpzdWJkLAorCQkJCQkgICAgICAgc2FtcGxfdCBkYXRhKQoreworCXJldHVybiBjZmNfd3JpdGVfYXJyYXlfdG9fYnVmZmVyKHN1YmQsICZkYXRhLCBzaXplb2YoZGF0YSkpOworfTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY2ZjX3dyaXRlX2xvbmdfdG9fYnVmZmVyKGNvbWVkaV9zdWJkZXZpY2UgKnN1YmQsCisJCQkJCQkgICAgbHNhbXBsX3QgZGF0YSkKK3sKKwlyZXR1cm4gY2ZjX3dyaXRlX2FycmF5X3RvX2J1ZmZlcihzdWJkLCAmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKK307CisKK2V4dGVybiB1bnNpZ25lZCBpbnQgY2ZjX3JlYWRfYXJyYXlfZnJvbV9idWZmZXIoY29tZWRpX3N1YmRldmljZSAqc3ViZCwKKwkJCQkJICAgICAgIHZvaWQgKmRhdGEsCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbnVtX2J5dGVzKTsKKworZXh0ZXJuIHVuc2lnbmVkIGludCBjZmNfaGFuZGxlX2V2ZW50cyhjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICAgICAgY29tZWRpX3N1YmRldmljZSAqc3ViZCk7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNmY19ieXRlc19wZXJfc2Nhbihjb21lZGlfc3ViZGV2aWNlICpzdWJkKQoreworCWludCBudW1fc2FtcGxlczsKKwlpbnQgYml0c19wZXJfc2FtcGxlOworCisJc3dpdGNoIChzdWJkLT50eXBlKSB7CisJY2FzZSBDT01FRElfU1VCRF9ESToKKwljYXNlIENPTUVESV9TVUJEX0RPOgorCWNhc2UgQ09NRURJX1NVQkRfRElPOgorCQliaXRzX3Blcl9zYW1wbGUgPSA4ICogYnl0ZXNfcGVyX3NhbXBsZShzdWJkKTsKKwkJbnVtX3NhbXBsZXMgPSAoc3ViZC0+YXN5bmMtPmNtZC5jaGFubGlzdF9sZW4gKworCQkJICAgICAgIGJpdHNfcGVyX3NhbXBsZSAtIDEpIC8gYml0c19wZXJfc2FtcGxlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQludW1fc2FtcGxlcyA9IHN1YmQtPmFzeW5jLT5jbWQuY2hhbmxpc3RfbGVuOworCQlicmVhazsKKwl9CisJcmV0dXJuIG51bV9zYW1wbGVzICogYnl0ZXNfcGVyX3NhbXBsZShzdWJkKTsKK30KKworI2VuZGlmIC8qIF9DT01FRElfRkNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9wYXJwb3J0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX3BhcnBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTgzOGZmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9wYXJwb3J0LmMKQEAgLTAsMCArMSwzOTAgQEAKKy8qCisgICAgY29tZWRpL2RyaXZlcnMvY29tZWRpX3BhcnBvcnQuYworICAgIGhhcmR3YXJlIGRyaXZlciBmb3Igc3RhbmRhcmQgcGFyYWxsZWwgcG9ydAorCisgICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICAgIENvcHlyaWdodCAoQykgMTk5OCwyMDAxIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisvKgorRHJpdmVyOiBjb21lZGlfcGFycG9ydAorRGVzY3JpcHRpb246IFN0YW5kYXJkIFBDIHBhcmFsbGVsIHBvcnQKK0F1dGhvcjogZHMKK1N0YXR1czogd29ya3MgaW4gaW1tZWRpYXRlIG1vZGUKK0RldmljZXM6IFtzdGFuZGFyZF0gcGFyYWxsZWwgcG9ydCAoY29tZWRpX3BhcnBvcnQpCitVcGRhdGVkOiBUdWUsIDMwIEFwciAyMDAyIDIxOjExOjQ1IC0wNzAwCisKK0EgY2hlYXAgYW5kIGVhc3kgd2F5IHRvIGdldCBhIGZldyBtb3JlIGRpZ2l0YWwgSS9PIGxpbmVzLiAgU3RlYWwKK2FkZGl0aW9uYWwgcGFyYWxsZWwgcG9ydHMgZnJvbSBvbGQgY29tcHV0ZXJzIG9yIHlvdXIgbmVpZ2hib3JzJworY29tcHV0ZXJzLgorCitPcHRpb24gbGlzdDoKKyAwOiBJL08gcG9ydCBiYXNlIGZvciB0aGUgcGFyYWxsZWwgcG9ydC4KKyAxOiBJUlEKKworUGFyYWxsZWwgUG9ydCBMaW5lczoKKworcGluICAgICBzdWJkZXYgIGNoYW4gICAgYWthCistLS0gICAgIC0tLS0tLSAgLS0tLSAgICAtLS0KKzEgICAgICAgMiAgICAgICAwICAgICAgIHN0cm9iZQorMiAgICAgICAwICAgICAgIDAgICAgICAgZGF0YSAwCiszICAgICAgIDAgICAgICAgMSAgICAgICBkYXRhIDEKKzQgICAgICAgMCAgICAgICAyICAgICAgIGRhdGEgMgorNSAgICAgICAwICAgICAgIDMgICAgICAgZGF0YSAzCis2ICAgICAgIDAgICAgICAgNCAgICAgICBkYXRhIDQKKzcgICAgICAgMCAgICAgICA1ICAgICAgIGRhdGEgNQorOCAgICAgICAwICAgICAgIDYgICAgICAgZGF0YSA2Cis5ICAgICAgIDAgICAgICAgNyAgICAgICBkYXRhIDcKKzEwICAgICAgMSAgICAgICAzICAgICAgIGFja25vd2xlZGdlCisxMSAgICAgIDEgICAgICAgNCAgICAgICBidXN5CisxMiAgICAgIDEgICAgICAgMiAgICAgICBvdXRwdXQKKzEzICAgICAgMSAgICAgICAxICAgICAgIHByaW50ZXIgc2VsZWN0ZWQKKzE0ICAgICAgMiAgICAgICAxICAgICAgIGF1dG8gTEYKKzE1ICAgICAgMSAgICAgICAwICAgICAgIGVycm9yCisxNiAgICAgIDIgICAgICAgMiAgICAgICBpbml0CisxNyAgICAgIDIgICAgICAgMyAgICAgICBzZWxlY3QgcHJpbnRlcgorMTgtMjUgICBncm91bmQKKworTm90ZXM6CisKK1N1YmRldmljZXMgMCBpcyBkaWdpdGFsIEkvTywgc3ViZGV2aWNlIDEgaXMgZGlnaXRhbCBpbnB1dCwgYW5kCitzdWJkZXZpY2UgMiBpcyBkaWdpdGFsIG91dHB1dC4gIFVubGlrZSBvdGhlciBDb21lZGkgZGV2aWNlcywKK3N1YmRldmljZSAwIGRlZmF1bHRzIHRvIG91dHB1dC4KKworUGlucyAxMyBhbmQgMTQgYXJlIGludmVydGVkIG9uY2UgYnkgQ29tZWRpIGFuZCBvbmNlIGJ5IHRoZQoraGFyZHdhcmUsIHRodXMgY2FuY2VsbGluZyB0aGUgZWZmZWN0LgorCitQaW4gMSBpcyBhIHN0cm9iZSwgdGh1cyBhY3RzIGxpa2Ugb25lLiAgVGhlcmUncyBubyB3YXkgaW4gc29mdHdhcmUKK3RvIGNoYW5nZSB0aGlzLCBhdCBsZWFzdCBvbiBhIHN0YW5kYXJkIHBhcmFsbGVsIHBvcnQuCisKK1N1YmRldmljZSAzIHByZXRlbmRzIHRvIGJlIGEgZGlnaXRhbCBpbnB1dCBzdWJkZXZpY2UsIGJ1dCBpdCBhbHdheXMKK3JldHVybnMgMCB3aGVuIHJlYWQuICBIb3dldmVyLCBpZiB5b3UgcnVuIGEgY29tbWFuZCB3aXRoCitzY2FuX2JlZ2luX3NyYz1UUklHX0VYVCwgaXQgdXNlcyBwaW4gMTAgYXMgYSBleHRlcm5hbCB0cmlnZ2VyaW5nCitwaW4sIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHdha2UgdXAgdGFza3MuCisqLworLyoKKyAgIHNlZSBodHRwOi8vd3d3LmJleW9uZGxvZ2ljLm9yZy8gZm9yIGluZm9ybWF0aW9uLgorICAgb3IgaHR0cDovL3d3dy5saW51eC1tYWdhemluLmRlL2F1c2dhYmUvMTk5OS8xMC9JTy9pby5odG1sCisgKi8KKworI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorCisjZGVmaW5lIFBBUlBPUlRfU0laRSAzCisKKyNkZWZpbmUgUEFSUE9SVF9BIDAKKyNkZWZpbmUgUEFSUE9SVF9CIDEKKyNkZWZpbmUgUEFSUE9SVF9DIDIKKworc3RhdGljIGludCBwYXJwb3J0X2F0dGFjaChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9kZXZjb25maWcgKml0KTsKK3N0YXRpYyBpbnQgcGFycG9ydF9kZXRhY2goY29tZWRpX2RldmljZSAqZGV2KTsKK3N0YXRpYyBjb21lZGlfZHJpdmVyIGRyaXZlcl9wYXJwb3J0ID0geworICAgICAgLmRyaXZlcl9uYW1lID0JImNvbWVkaV9wYXJwb3J0IiwKKyAgICAgIC5tb2R1bGUgPQkJVEhJU19NT0RVTEUsCisgICAgICAuYXR0YWNoID0JCXBhcnBvcnRfYXR0YWNoLAorICAgICAgLmRldGFjaCA9CQlwYXJwb3J0X2RldGFjaCwKK307CisKK0NPTUVESV9JTklUQ0xFQU5VUChkcml2ZXJfcGFycG9ydCk7CisKK3N0cnVjdCBwYXJwb3J0X3ByaXZhdGUgeworCXVuc2lnbmVkIGludCBhX2RhdGE7CisJdW5zaWduZWQgaW50IGNfZGF0YTsKKwlpbnQgZW5hYmxlX2lycTsKK307CisjZGVmaW5lIGRldnByaXYgKChzdHJ1Y3QgcGFycG9ydF9wcml2YXRlICopKGRldi0+cHJpdmF0ZSkpCisKK3N0YXRpYyBpbnQgcGFycG9ydF9pbnNuX2EoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpCit7CisJaWYgKGRhdGFbMF0pIHsKKwkJZGV2cHJpdi0+YV9kYXRhICY9IH5kYXRhWzBdOworCQlkZXZwcml2LT5hX2RhdGEgfD0gKGRhdGFbMF0gJiBkYXRhWzFdKTsKKworCQlvdXRiKGRldnByaXYtPmFfZGF0YSwgZGV2LT5pb2Jhc2UgKyBQQVJQT1JUX0EpOworCX0KKworCWRhdGFbMV0gPSBpbmIoZGV2LT5pb2Jhc2UgKyBQQVJQT1JUX0EpOworCisJcmV0dXJuIDI7Cit9CisKK3N0YXRpYyBpbnQgcGFycG9ydF9pbnNuX2NvbmZpZ19hKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCWlmIChkYXRhWzBdKSB7CisJCXMtPmlvX2JpdHMgPSAweGZmOworCQlkZXZwcml2LT5jX2RhdGEgJj0gfigxIDw8IDUpOworCX0gZWxzZSB7CisJCXMtPmlvX2JpdHMgPSAwOworCQlkZXZwcml2LT5jX2RhdGEgfD0gKDEgPDwgNSk7CisJfQorCW91dGIoZGV2cHJpdi0+Y19kYXRhLCBkZXYtPmlvYmFzZSArIFBBUlBPUlRfQyk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBwYXJwb3J0X2luc25fYihjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwlpZiAoZGF0YVswXSkgeworCQkvKiBzaG91bGQgd3JpdGVzIGJlIGlnbm9yZWQ/ICovCisJCS8qIGFueW9uZT8/PyAqLworCX0KKworCWRhdGFbMV0gPSAoaW5iKGRldi0+aW9iYXNlICsgUEFSUE9SVF9CKSA+PiAzKTsKKworCXJldHVybiAyOworfQorCitzdGF0aWMgaW50IHBhcnBvcnRfaW5zbl9jKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCWRhdGFbMF0gJj0gMHgwZjsKKwlpZiAoZGF0YVswXSkgeworCQlkZXZwcml2LT5jX2RhdGEgJj0gfmRhdGFbMF07CisJCWRldnByaXYtPmNfZGF0YSB8PSAoZGF0YVswXSAmIGRhdGFbMV0pOworCisJCW91dGIoZGV2cHJpdi0+Y19kYXRhLCBkZXYtPmlvYmFzZSArIFBBUlBPUlRfQyk7CisJfQorCisJZGF0YVsxXSA9IGRldnByaXYtPmNfZGF0YSAmIDB4ZjsKKworCXJldHVybiAyOworfQorCitzdGF0aWMgaW50IHBhcnBvcnRfaW50cl9pbnNuKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCWlmIChpbnNuLT5uIDwgMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkYXRhWzFdID0gMDsKKwlyZXR1cm4gMjsKK30KKworc3RhdGljIGludCBwYXJwb3J0X2ludHJfY21kdGVzdChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJY29tZWRpX2NtZCAqY21kKQoreworCWludCBlcnIgPSAwOworCWludCB0bXA7CisKKwkvKiBzdGVwIDEgKi8KKworCXRtcCA9IGNtZC0+c3RhcnRfc3JjOworCWNtZC0+c3RhcnRfc3JjICY9IFRSSUdfTk9XOworCWlmICghY21kLT5zdGFydF9zcmMgfHwgdG1wICE9IGNtZC0+c3RhcnRfc3JjKQorCQllcnIrKzsKKworCXRtcCA9IGNtZC0+c2Nhbl9iZWdpbl9zcmM7CisJY21kLT5zY2FuX2JlZ2luX3NyYyAmPSBUUklHX0VYVDsKKwlpZiAoIWNtZC0+c2Nhbl9iZWdpbl9zcmMgfHwgdG1wICE9IGNtZC0+c2Nhbl9iZWdpbl9zcmMpCisJCWVycisrOworCisJdG1wID0gY21kLT5jb252ZXJ0X3NyYzsKKwljbWQtPmNvbnZlcnRfc3JjICY9IFRSSUdfRk9MTE9XOworCWlmICghY21kLT5jb252ZXJ0X3NyYyB8fCB0bXAgIT0gY21kLT5jb252ZXJ0X3NyYykKKwkJZXJyKys7CisKKwl0bXAgPSBjbWQtPnNjYW5fZW5kX3NyYzsKKwljbWQtPnNjYW5fZW5kX3NyYyAmPSBUUklHX0NPVU5UOworCWlmICghY21kLT5zY2FuX2VuZF9zcmMgfHwgdG1wICE9IGNtZC0+c2Nhbl9lbmRfc3JjKQorCQllcnIrKzsKKworCXRtcCA9IGNtZC0+c3RvcF9zcmM7CisJY21kLT5zdG9wX3NyYyAmPSBUUklHX05PTkU7CisJaWYgKCFjbWQtPnN0b3Bfc3JjIHx8IHRtcCAhPSBjbWQtPnN0b3Bfc3JjKQorCQllcnIrKzsKKworCWlmIChlcnIpCisJCXJldHVybiAxOworCisJLyogc3RlcCAyOiBpZ25vcmVkICovCisKKwlpZiAoZXJyKQorCQlyZXR1cm4gMjsKKworCS8qIHN0ZXAgMzogKi8KKworCWlmIChjbWQtPnN0YXJ0X2FyZyAhPSAwKSB7CisJCWNtZC0+c3RhcnRfYXJnID0gMDsKKwkJZXJyKys7CisJfQorCWlmIChjbWQtPnNjYW5fYmVnaW5fYXJnICE9IDApIHsKKwkJY21kLT5zY2FuX2JlZ2luX2FyZyA9IDA7CisJCWVycisrOworCX0KKwlpZiAoY21kLT5jb252ZXJ0X2FyZyAhPSAwKSB7CisJCWNtZC0+Y29udmVydF9hcmcgPSAwOworCQllcnIrKzsKKwl9CisJaWYgKGNtZC0+c2Nhbl9lbmRfYXJnICE9IDEpIHsKKwkJY21kLT5zY2FuX2VuZF9hcmcgPSAxOworCQllcnIrKzsKKwl9CisJaWYgKGNtZC0+c3RvcF9hcmcgIT0gMCkgeworCQljbWQtPnN0b3BfYXJnID0gMDsKKwkJZXJyKys7CisJfQorCisJaWYgKGVycikKKwkJcmV0dXJuIDM7CisKKwkvKiBzdGVwIDQ6IGlnbm9yZWQgKi8KKworCWlmIChlcnIpCisJCXJldHVybiA0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFycG9ydF9pbnRyX2NtZChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJZGV2cHJpdi0+Y19kYXRhIHw9IDB4MTA7CisJb3V0YihkZXZwcml2LT5jX2RhdGEsIGRldi0+aW9iYXNlICsgUEFSUE9SVF9DKTsKKworCWRldnByaXYtPmVuYWJsZV9pcnEgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFycG9ydF9pbnRyX2NhbmNlbChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJcHJpbnRrKEtFUk5fREVCVUcgInBhcnBvcnRfaW50cl9jYW5jZWwoKVxuIik7CisKKwlkZXZwcml2LT5jX2RhdGEgJj0gfjB4MTA7CisJb3V0YihkZXZwcml2LT5jX2RhdGEsIGRldi0+aW9iYXNlICsgUEFSUE9SVF9DKTsKKworCWRldnByaXYtPmVuYWJsZV9pcnEgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBwYXJwb3J0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkIFBUX1JFR1NfQVJHKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IGQ7CisJY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+c3ViZGV2aWNlcyArIDM7CisKKwlpZiAoIWRldnByaXYtPmVuYWJsZV9pcnEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjb21lZGlfcGFycG9ydDogYm9ndXMgaXJxLCBpZ25vcmVkXG4iKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWNvbWVkaV9idWZfcHV0KHMtPmFzeW5jLCAwKTsKKwlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9CTE9DSyB8IENPTUVESV9DQl9FT1M7CisKKwljb21lZGlfZXZlbnQoZGV2LCBzKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgcGFycG9ydF9hdHRhY2goY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfZGV2Y29uZmlnICppdCkKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCBpcnE7CisJdW5zaWduZWQgbG9uZyBpb2Jhc2U7CisJY29tZWRpX3N1YmRldmljZSAqczsKKworCWlvYmFzZSA9IGl0LT5vcHRpb25zWzBdOworCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSVkOiBwYXJwb3J0OiAweCUwNGx4ICIsIGRldi0+bWlub3IsIGlvYmFzZSk7CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2Jhc2UsIFBBUlBPUlRfU0laRSwgInBhcnBvcnQgKGNvbWVkaSkiKSkgeworCQlwcmludGsoIkkvTyBwb3J0IGNvbmZsaWN0XG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWRldi0+aW9iYXNlID0gaW9iYXNlOworCisJaXJxID0gaXQtPm9wdGlvbnNbMV07CisJaWYgKGlycSkgeworCQlwcmludGsoIiBpcnE9JXUiLCBpcnEpOworCQlyZXQgPSBjb21lZGlfcmVxdWVzdF9pcnEoaXJxLCBwYXJwb3J0X2ludGVycnVwdCwgMCwKKwkJCSJjb21lZGlfcGFycG9ydCIsIGRldik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcmludGsoIiBpcnEgbm90IGF2YWlsYWJsZVxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlkZXYtPmlycSA9IGlycTsKKwl9CisJZGV2LT5ib2FyZF9uYW1lID0gInBhcnBvcnQiOworCisJcmV0ID0gYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIDQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXJldCA9IGFsbG9jX3ByaXZhdGUoZGV2LCBzaXplb2Yoc3RydWN0IHBhcnBvcnRfcHJpdmF0ZSkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIDA7CisJcy0+dHlwZSA9IENPTUVESV9TVUJEX0RJTzsKKwlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfUkVBREFCTEUgfCBTREZfV1JJVEFCTEU7CisJcy0+bl9jaGFuID0gODsKKwlzLT5tYXhkYXRhID0gMTsKKwlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOworCXMtPmluc25fYml0cyA9IHBhcnBvcnRfaW5zbl9hOworCXMtPmluc25fY29uZmlnID0gcGFycG9ydF9pbnNuX2NvbmZpZ19hOworCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIDE7CisJcy0+dHlwZSA9IENPTUVESV9TVUJEX0RJOworCXMtPnN1YmRldl9mbGFncyA9IFNERl9SRUFEQUJMRTsKKwlzLT5uX2NoYW4gPSA1OworCXMtPm1heGRhdGEgPSAxOworCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2RpZ2l0YWw7CisJcy0+aW5zbl9iaXRzID0gcGFycG9ydF9pbnNuX2I7CisKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgMjsKKwlzLT50eXBlID0gQ09NRURJX1NVQkRfRE87CisJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1dSSVRBQkxFOworCXMtPm5fY2hhbiA9IDQ7CisJcy0+bWF4ZGF0YSA9IDE7CisJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfZGlnaXRhbDsKKwlzLT5pbnNuX2JpdHMgPSBwYXJwb3J0X2luc25fYzsKKworCXMgPSBkZXYtPnN1YmRldmljZXMgKyAzOworCWlmIChpcnEpIHsKKwkJZGV2LT5yZWFkX3N1YmRldiA9IHM7CisJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9ESTsKKwkJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFIHwgU0RGX0NNRF9SRUFEOworCQlzLT5uX2NoYW4gPSAxOworCQlzLT5tYXhkYXRhID0gMTsKKwkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfZGlnaXRhbDsKKwkJcy0+aW5zbl9iaXRzID0gcGFycG9ydF9pbnRyX2luc247CisJCXMtPmRvX2NtZHRlc3QgPSBwYXJwb3J0X2ludHJfY21kdGVzdDsKKwkJcy0+ZG9fY21kID0gcGFycG9ydF9pbnRyX2NtZDsKKwkJcy0+Y2FuY2VsID0gcGFycG9ydF9pbnRyX2NhbmNlbDsKKwl9IGVsc2UgeworCQlzLT50eXBlID0gQ09NRURJX1NVQkRfVU5VU0VEOworCX0KKworCWRldnByaXYtPmFfZGF0YSA9IDA7CisJb3V0YihkZXZwcml2LT5hX2RhdGEsIGRldi0+aW9iYXNlICsgUEFSUE9SVF9BKTsKKwlkZXZwcml2LT5jX2RhdGEgPSAwOworCW91dGIoZGV2cHJpdi0+Y19kYXRhLCBkZXYtPmlvYmFzZSArIFBBUlBPUlRfQyk7CisKKwlwcmludGsoIlxuIik7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcGFycG9ydF9kZXRhY2goY29tZWRpX2RldmljZSAqZGV2KQoreworCXByaW50aygiY29tZWRpJWQ6IHBhcnBvcnQ6IHJlbW92ZVxuIiwgZGV2LT5taW5vcik7CisKKwlpZiAoZGV2LT5pb2Jhc2UpCisJCXJlbGVhc2VfcmVnaW9uKGRldi0+aW9iYXNlLCBQQVJQT1JUX1NJWkUpOworCisJaWYgKGRldi0+aXJxKQorCQljb21lZGlfZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfcGNpLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX3BjaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNGEwMzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX3BjaS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgICAgY29tZWRpL2RyaXZlcnMvY29tZWRpX3BjaS5oCisgICAgVmFyaW91cyBQQ0kgZnVuY3Rpb25zIGZvciBkcml2ZXJzLgorCisgICAgQ29weXJpZ2h0IChDKSAyMDA3IE1FViBMdGQuIDxodHRwOi8vd3d3Lm1ldi5jby51ay8+CisKKyAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgICAgQ29weXJpZ2h0IChDKSAyMDAwIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisKKyNpZm5kZWYgX0NPTUVESV9QQ0lfSF8KKyNkZWZpbmUgX0NPTUVESV9QQ0lfSF8KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisvKgorICogRW5hYmxlIHRoZSBQQ0kgZGV2aWNlIGFuZCByZXF1ZXN0IHRoZSByZWdpb25zLgorICovCitzdGF0aWMgaW5saW5lIGludCBjb21lZGlfcGNpX2VuYWJsZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3QgY2hhciAqcmVzX25hbWUpCit7CisJaW50IHJjOworCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgcmVzX25hbWUpOworCWlmIChyYyA8IDApCisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKworCXJldHVybiByYzsKK30KKworLyoKKyAqIFJlbGVhc2UgdGhlIHJlZ2lvbnMgYW5kIGRpc2FibGUgdGhlIFBDSSBkZXZpY2UuCisgKgorICogVGhpcyBtdXN0IGJlIG1hdGNoZWQgd2l0aCBhIHByZXZpb3VzIHN1Y2Nlc3NmdWwgY2FsbCB0byBjb21lZGlfcGNpX2VuYWJsZSgpLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY29tZWRpX3BjaV9kaXNhYmxlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfdGVzdC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI0YzM3ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfdGVzdC5jCkBAIC0wLDAgKzEsNTI3IEBACisvKgorICAgIGNvbWVkaS9kcml2ZXJzL2NvbWVkaV90ZXN0LmMKKworICAgIEdlbmVyYXRlcyBmYWtlIHdhdmVmb3JtIHNpZ25hbHMgdGhhdCBjYW4gYmUgcmVhZCB0aHJvdWdoCisgICAgdGhlIGNvbW1hbmQgaW50ZXJmYWNlLiAgSXQgZG9lcyBfbm90XyByZWFkIGZyb20gYW55IGJvYXJkOworICAgIGl0IGp1c3QgZ2VuZXJhdGVzIGRldGVybWluaXN0aWMgd2F2ZWZvcm1zLgorICAgIFVzZWZ1bCBmb3IgdmFyaW91cyB0ZXN0aW5nIHB1cnBvc2VzLgorCisgICAgQ29weXJpZ2h0IChDKSAyMDAyIEpvYWNoaW0gV3V0dGtlIDxKb2FjaGltLld1dHRrZUBpY24uc2llbWVucy5kZT4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDIgRnJhbmsgTW9yaSBIZXNzIDxmbWhlc3NAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCisgICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICAgIENvcHlyaWdodCAoQykgMjAwMCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorRHJpdmVyOiBjb21lZGlfdGVzdAorRGVzY3JpcHRpb246IGdlbmVyYXRlcyBmYWtlIHdhdmVmb3JtcworQXV0aG9yOiBKb2FjaGltIFd1dHRrZSA8Sm9hY2hpbS5XdXR0a2VAaWNuLnNpZW1lbnMuZGU+LCBGcmFuayBNb3JpIEhlc3MKKyAgPGZtaGVzc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+LCBkcworRGV2aWNlczoKK1N0YXR1czogd29ya3MKK1VwZGF0ZWQ6IFNhdCwgMTYgTWFyIDIwMDIgMTc6MzQ6NDggLTA4MDAKKworVGhpcyBkcml2ZXIgaXMgbWFpbmx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzLCBidXQgY2FuIGFsc28gYmUgdXNlZCB0bworZ2VuZXJhdGUgc2FtcGxlIHdhdmVmb3JtcyBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3QgaGF2ZSBkYXRhIGFjcXVpc2l0aW9uCitoYXJkd2FyZS4KKworQ29uZmlndXJhdGlvbiBvcHRpb25zOgorICBbMF0gLSBBbXBsaXR1ZGUgaW4gbWljcm92b2x0cyBmb3IgZmFrZSB3YXZlZm9ybXMgKGRlZmF1bHQgMSB2b2x0KQorICBbMV0gLSBQZXJpb2QgaW4gbWljcm9zZWNvbmRzIGZvciBmYWtlIHdhdmVmb3JtcyAoZGVmYXVsdCAwLjEgc2VjKQorCitHZW5lcmF0ZXMgYSBzYXd0b290aCB3YXZlIG9uIGNoYW5uZWwgMCwgc3F1YXJlIHdhdmUgb24gY2hhbm5lbCAxLCBhZGRpdGlvbmFsCit3YXZlZm9ybXMgY291bGQgYmUgYWRkZWQgdG8gb3RoZXIgY2hhbm5lbHMgKGN1cnJlbnRseSB0aGV5IHJldHVybiBmbGF0bGluZQoremVybyB2b2x0cykuCisKKyovCisKKyNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKworI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorCisjaW5jbHVkZSAiY29tZWRpX2ZjLmgiCisKKy8qIEJvYXJkIGRlc2NyaXB0aW9ucyAqLworc3RydWN0IHdhdmVmb3JtX2JvYXJkIHsKKwljb25zdCBjaGFyICpuYW1lOworCWludCBhaV9jaGFuczsKKwlpbnQgYWlfYml0czsKKwlpbnQgaGF2ZV9kaW87Cit9OworCisjZGVmaW5lIE5fQ0hBTlMgOAorCitzdGF0aWMgY29uc3Qgc3RydWN0IHdhdmVmb3JtX2JvYXJkIHdhdmVmb3JtX2JvYXJkc1tdID0geworCXsKKwkJLm5hbWUgPQkJImNvbWVkaV90ZXN0IiwKKwkJLmFpX2NoYW5zID0JTl9DSEFOUywKKwkJLmFpX2JpdHMgPQkxNiwKKwkJLmhhdmVfZGlvID0JMCwKKwl9LAorfTsKKworI2RlZmluZSB0aGlzYm9hcmQgKChjb25zdCBzdHJ1Y3Qgd2F2ZWZvcm1fYm9hcmQgKilkZXYtPmJvYXJkX3B0cikKKworLyogRGF0YSB1bmlxdWUgdG8gdGhpcyBkcml2ZXIgKi8KK3N0cnVjdCB3YXZlZm9ybV9wcml2YXRlIHsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwlzdHJ1Y3QgdGltZXZhbCBsYXN0OwkvKiB0aW1lIGF0IHdoaWNoIGxhc3QgdGltZXIgaW50ZXJydXB0IG9jY3VyZWQgKi8KKwl1bnNpZ25lZCBpbnQgdXZvbHRfYW1wbGl0dWRlOwkvKiB3YXZlZm9ybSBhbXBsaXR1ZGUgaW4gbWljcm92b2x0cyAqLworCXVuc2lnbmVkIGxvbmcgdXNlY19wZXJpb2Q7CS8qIHdhdmVmb3JtIHBlcmlvZCBpbiBtaWNyb3NlY29uZHMgKi8KKwl1bnNpZ25lZCBsb25nIHVzZWNfY3VycmVudDsgLyogY3VycmVudCB0aW1lIChtb2R1bG8gd2F2ZWZvcm0gcGVyaW9kKSAqLworCXVuc2lnbmVkIGxvbmcgdXNlY19yZW1haW5kZXI7CS8qIHVzZWMgc2luY2UgbGFzdCBzY2FuOyAqLworCXVuc2lnbmVkIGxvbmcgYWlfY291bnQ7CS8qIG51bWJlciBvZiBjb252ZXJzaW9ucyByZW1haW5pbmcgKi8KKwl1bnNpZ25lZCBpbnQgc2Nhbl9wZXJpb2Q7CS8qIHNjYW4gcGVyaW9kIGluIHVzZWMgKi8KKwl1bnNpZ25lZCBpbnQgY29udmVydF9wZXJpb2Q7CS8qIGNvbnZlcnNpb24gcGVyaW9kIGluIHVzZWMgKi8KKwl1bnNpZ25lZCB0aW1lcl9ydW5uaW5nOjE7CisJbHNhbXBsX3QgYW9fbG9vcGJhY2tzW05fQ0hBTlNdOworfTsKKyNkZWZpbmUgZGV2cHJpdiAoKHN0cnVjdCB3YXZlZm9ybV9wcml2YXRlICopZGV2LT5wcml2YXRlKQorCitzdGF0aWMgaW50IHdhdmVmb3JtX2F0dGFjaChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9kZXZjb25maWcgKml0KTsKK3N0YXRpYyBpbnQgd2F2ZWZvcm1fZGV0YWNoKGNvbWVkaV9kZXZpY2UgKmRldik7CitzdGF0aWMgY29tZWRpX2RyaXZlciBkcml2ZXJfd2F2ZWZvcm0gPSB7CisgICAgICAuZHJpdmVyX25hbWUgPQkiY29tZWRpX3Rlc3QiLAorICAgICAgLm1vZHVsZSA9CQlUSElTX01PRFVMRSwKKyAgICAgIC5hdHRhY2ggPQkJd2F2ZWZvcm1fYXR0YWNoLAorICAgICAgLmRldGFjaCA9CQl3YXZlZm9ybV9kZXRhY2gsCisgICAgICAuYm9hcmRfbmFtZSA9CSZ3YXZlZm9ybV9ib2FyZHNbMF0ubmFtZSwKKyAgICAgIC5vZmZzZXQgPQkJc2l6ZW9mKHN0cnVjdCB3YXZlZm9ybV9ib2FyZCksCisgICAgICAubnVtX25hbWVzID0Jc2l6ZW9mKHdhdmVmb3JtX2JvYXJkcykgLyBzaXplb2Yoc3RydWN0IHdhdmVmb3JtX2JvYXJkKSwKK307CisKK0NPTUVESV9JTklUQ0xFQU5VUChkcml2ZXJfd2F2ZWZvcm0pOworCitzdGF0aWMgaW50IHdhdmVmb3JtX2FpX2NtZHRlc3QoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgIGNvbWVkaV9jbWQgKmNtZCk7CitzdGF0aWMgaW50IHdhdmVmb3JtX2FpX2NtZChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMpOworc3RhdGljIGludCB3YXZlZm9ybV9haV9jYW5jZWwoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzKTsKK3N0YXRpYyBpbnQgd2F2ZWZvcm1fYWlfaW5zbl9yZWFkKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKTsKK3N0YXRpYyBpbnQgd2F2ZWZvcm1fYW9faW5zbl93cml0ZShjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJICBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpOworc3RhdGljIHNhbXBsX3QgZmFrZV9zYXd0b290aChjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByYW5nZSwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBjdXJyZW50X3RpbWUpOworc3RhdGljIHNhbXBsX3QgZmFrZV9zcXVhcmV3YXZlKGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJhbmdlLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgY3VycmVudF90aW1lKTsKK3N0YXRpYyBzYW1wbF90IGZha2VfZmxhdGxpbmUoY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmFuZ2UsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgY3VycmVudF90aW1lKTsKK3N0YXRpYyBzYW1wbF90IGZha2Vfd2F2ZWZvcm0oY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgY2hhbm5lbCwKKwkJCSAgICAgdW5zaWduZWQgaW50IHJhbmdlLCB1bnNpZ25lZCBsb25nIGN1cnJlbnRfdGltZSk7CisKKy8qIDEwMDAgbmFub3NlYyBpbiBhIG1pY3Jvc2VjICovCitzdGF0aWMgY29uc3QgaW50IG5hbm9fcGVyX21pY3JvID0gMTAwMDsKKworLyogZmFrZSBhbmFsb2cgaW5wdXQgcmFuZ2VzICovCitzdGF0aWMgY29uc3QgY29tZWRpX2xyYW5nZSB3YXZlZm9ybV9haV9yYW5nZXMgPSB7CisJMiwKKwl7CisJCQlCSVBfUkFOR0UoMTApLAorCQkJQklQX1JBTkdFKDUpLAorCQl9Cit9OworCisvKgorICAgVGhpcyBpcyB0aGUgYmFja2dyb3VuZCByb3V0aW5lIHVzZWQgdG8gZ2VuZXJhdGUgYXJiaXRyYXJ5IGRhdGEuCisgICBJdCBzaG91bGQgcnVuIGluIHRoZSBiYWNrZ3JvdW5kOyB0aGVyZWZvcmUgaXQgaXMgc2NoZWR1bGVkIGJ5CisgICBhIHRpbWVyIG1lY2hhbmlzbS4KKyovCitzdGF0aWMgdm9pZCB3YXZlZm9ybV9haV9pbnRlcnJ1cHQodW5zaWduZWQgbG9uZyBhcmcpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgYXJnOworCWNvbWVkaV9hc3luYyAqYXN5bmMgPSBkZXYtPnJlYWRfc3ViZGV2LT5hc3luYzsKKwljb21lZGlfY21kICpjbWQgPSAmYXN5bmMtPmNtZDsKKwl1bnNpZ25lZCBpbnQgaSwgajsKKwkvKiBhbGwgdGltZXMgaW4gbWljcm9zZWMgKi8KKwl1bnNpZ25lZCBsb25nIGVsYXBzZWRfdGltZTsKKwl1bnNpZ25lZCBpbnQgbnVtX3NjYW5zOworCXN0cnVjdCB0aW1ldmFsIG5vdzsKKworCWRvX2dldHRpbWVvZmRheSgmbm93KTsKKworCWVsYXBzZWRfdGltZSA9CisJCTEwMDAwMDAgKiAobm93LnR2X3NlYyAtIGRldnByaXYtPmxhc3QudHZfc2VjKSArIG5vdy50dl91c2VjIC0KKwkJZGV2cHJpdi0+bGFzdC50dl91c2VjOworCWRldnByaXYtPmxhc3QgPSBub3c7CisJbnVtX3NjYW5zID0KKwkJKGRldnByaXYtPnVzZWNfcmVtYWluZGVyICsgZWxhcHNlZF90aW1lKSAvIGRldnByaXYtPnNjYW5fcGVyaW9kOworCWRldnByaXYtPnVzZWNfcmVtYWluZGVyID0KKwkJKGRldnByaXYtPnVzZWNfcmVtYWluZGVyICsgZWxhcHNlZF90aW1lKSAlIGRldnByaXYtPnNjYW5fcGVyaW9kOworCWFzeW5jLT5ldmVudHMgPSAwOworCisJZm9yIChpID0gMDsgaSA8IG51bV9zY2FuczsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBjbWQtPmNoYW5saXN0X2xlbjsgaisrKSB7CisJCQljZmNfd3JpdGVfdG9fYnVmZmVyKGRldi0+cmVhZF9zdWJkZXYsCisJCQkJZmFrZV93YXZlZm9ybShkZXYsIENSX0NIQU4oY21kLT5jaGFubGlzdFtqXSksCisJCQkJCUNSX1JBTkdFKGNtZC0+Y2hhbmxpc3Rbal0pLAorCQkJCQlkZXZwcml2LT51c2VjX2N1cnJlbnQgKworCQkJCQlpICogZGV2cHJpdi0+c2Nhbl9wZXJpb2QgKworCQkJCQlqICogZGV2cHJpdi0+Y29udmVydF9wZXJpb2QpKTsKKwkJfQorCQlkZXZwcml2LT5haV9jb3VudCsrOworCQlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UCisJCQkmJiBkZXZwcml2LT5haV9jb3VudCA+PSBjbWQtPnN0b3BfYXJnKSB7CisJCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CisJCQlicmVhazsKKwkJfQorCX0KKworCWRldnByaXYtPnVzZWNfY3VycmVudCArPSBlbGFwc2VkX3RpbWU7CisJZGV2cHJpdi0+dXNlY19jdXJyZW50ICU9IGRldnByaXYtPnVzZWNfcGVyaW9kOworCisJaWYgKChhc3luYy0+ZXZlbnRzICYgQ09NRURJX0NCX0VPQSkgPT0gMCAmJiBkZXZwcml2LT50aW1lcl9ydW5uaW5nKQorCQltb2RfdGltZXIoJmRldnByaXYtPnRpbWVyLCBqaWZmaWVzICsgMSk7CisJZWxzZQorCQlkZWxfdGltZXIoJmRldnByaXYtPnRpbWVyKTsKKworCWNvbWVkaV9ldmVudChkZXYsIGRldi0+cmVhZF9zdWJkZXYpOworfQorCitzdGF0aWMgaW50IHdhdmVmb3JtX2F0dGFjaChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9kZXZjb25maWcgKml0KQoreworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisJaW50IGFtcGxpdHVkZSA9IGl0LT5vcHRpb25zWzBdOworCWludCBwZXJpb2QgPSBpdC0+b3B0aW9uc1sxXTsKKwlpbnQgaTsKKworCWRldi0+Ym9hcmRfbmFtZSA9IHRoaXNib2FyZC0+bmFtZTsKKworCWlmIChhbGxvY19wcml2YXRlKGRldiwgc2l6ZW9mKHN0cnVjdCB3YXZlZm9ybV9wcml2YXRlKSkgPCAwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIHNldCBkZWZhdWx0IGFtcGxpdHVkZSBhbmQgcGVyaW9kICovCisJaWYgKGFtcGxpdHVkZSA8PSAwKQorCQlhbXBsaXR1ZGUgPSAxMDAwMDAwOwkvKiAxIHZvbHQgKi8KKwlpZiAocGVyaW9kIDw9IDApCisJCXBlcmlvZCA9IDEwMDAwMDsJLyogMC4xIHNlYyAqLworCisJZGV2cHJpdi0+dXZvbHRfYW1wbGl0dWRlID0gYW1wbGl0dWRlOworCWRldnByaXYtPnVzZWNfcGVyaW9kID0gcGVyaW9kOworCisJZGV2LT5uX3N1YmRldmljZXMgPSAyOworCWlmIChhbGxvY19zdWJkZXZpY2VzKGRldiwgZGV2LT5uX3N1YmRldmljZXMpIDwgMCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgMDsKKwlkZXYtPnJlYWRfc3ViZGV2ID0gczsKKwkvKiBhbmFsb2cgaW5wdXQgc3ViZGV2aWNlICovCisJcy0+dHlwZSA9IENPTUVESV9TVUJEX0FJOworCXMtPnN1YmRldl9mbGFncyA9IFNERl9SRUFEQUJMRSB8IFNERl9HUk9VTkQgfCBTREZfQ01EX1JFQUQ7CisJcy0+bl9jaGFuID0gdGhpc2JvYXJkLT5haV9jaGFuczsKKwlzLT5tYXhkYXRhID0gKDEgPDwgdGhpc2JvYXJkLT5haV9iaXRzKSAtIDE7CisJcy0+cmFuZ2VfdGFibGUgPSAmd2F2ZWZvcm1fYWlfcmFuZ2VzOworCXMtPmxlbl9jaGFubGlzdCA9IHMtPm5fY2hhbiAqIDI7CisJcy0+aW5zbl9yZWFkID0gd2F2ZWZvcm1fYWlfaW5zbl9yZWFkOworCXMtPmRvX2NtZCA9IHdhdmVmb3JtX2FpX2NtZDsKKwlzLT5kb19jbWR0ZXN0ID0gd2F2ZWZvcm1fYWlfY21kdGVzdDsKKwlzLT5jYW5jZWwgPSB3YXZlZm9ybV9haV9jYW5jZWw7CisKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgMTsKKwlkZXYtPndyaXRlX3N1YmRldiA9IHM7CisJLyogYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgKGxvb3BiYWNrKSAqLworCXMtPnR5cGUgPSBDT01FRElfU1VCRF9BTzsKKwlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfV1JJVEVBQkxFIHwgU0RGX0dST1VORDsKKwlzLT5uX2NoYW4gPSB0aGlzYm9hcmQtPmFpX2NoYW5zOworCXMtPm1heGRhdGEgPSAoMSA8PCB0aGlzYm9hcmQtPmFpX2JpdHMpIC0gMTsKKwlzLT5yYW5nZV90YWJsZSA9ICZ3YXZlZm9ybV9haV9yYW5nZXM7CisJcy0+bGVuX2NoYW5saXN0ID0gcy0+bl9jaGFuICogMjsKKwlzLT5pbnNuX3dyaXRlID0gd2F2ZWZvcm1fYW9faW5zbl93cml0ZTsKKwlzLT5kb19jbWQgPSBOVUxMOworCXMtPmRvX2NtZHRlc3QgPSBOVUxMOworCXMtPmNhbmNlbCA9IE5VTEw7CisKKwkvKiBPdXIgZGVmYXVsdCBsb29wYmFjayB2YWx1ZSBpcyBqdXN0IGEgMFYgZmxhdGxpbmUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcy0+bl9jaGFuOyBpKyspCisJCWRldnByaXYtPmFvX2xvb3BiYWNrc1tpXSA9IHMtPm1heGRhdGEgLyAyOworCisJaW5pdF90aW1lcigmKGRldnByaXYtPnRpbWVyKSk7CisJZGV2cHJpdi0+dGltZXIuZnVuY3Rpb24gPSB3YXZlZm9ybV9haV9pbnRlcnJ1cHQ7CisJZGV2cHJpdi0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKKworCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSVkOiBjb21lZGlfdGVzdDogIgorCQkiJWkgbWljcm92b2x0LCAlbGkgbWljcm9zZWNvbmQgd2F2ZWZvcm0gYXR0YWNoZWRcbiIsIGRldi0+bWlub3IsCisJCWRldnByaXYtPnV2b2x0X2FtcGxpdHVkZSwgZGV2cHJpdi0+dXNlY19wZXJpb2QpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHdhdmVmb3JtX2RldGFjaChjb21lZGlfZGV2aWNlICpkZXYpCit7CisJcHJpbnRrKCJjb21lZGklZDogY29tZWRpX3Rlc3Q6IHJlbW92ZVxuIiwgZGV2LT5taW5vcik7CisKKwlpZiAoZGV2LT5wcml2YXRlKQorCQl3YXZlZm9ybV9haV9jYW5jZWwoZGV2LCBkZXYtPnJlYWRfc3ViZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdhdmVmb3JtX2FpX2NtZHRlc3QoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgIGNvbWVkaV9jbWQgKmNtZCkKK3sKKwlpbnQgZXJyID0gMDsKKwlpbnQgdG1wOworCisJLyogc3RlcCAxOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KKworCXRtcCA9IGNtZC0+c3RhcnRfc3JjOworCWNtZC0+c3RhcnRfc3JjICY9IFRSSUdfTk9XOworCWlmICghY21kLT5zdGFydF9zcmMgfHwgdG1wICE9IGNtZC0+c3RhcnRfc3JjKQorCQllcnIrKzsKKworCXRtcCA9IGNtZC0+c2Nhbl9iZWdpbl9zcmM7CisJY21kLT5zY2FuX2JlZ2luX3NyYyAmPSBUUklHX1RJTUVSOworCWlmICghY21kLT5zY2FuX2JlZ2luX3NyYyB8fCB0bXAgIT0gY21kLT5zY2FuX2JlZ2luX3NyYykKKwkJZXJyKys7CisKKwl0bXAgPSBjbWQtPmNvbnZlcnRfc3JjOworCWNtZC0+Y29udmVydF9zcmMgJj0gVFJJR19OT1cgfCBUUklHX1RJTUVSOworCWlmICghY21kLT5jb252ZXJ0X3NyYyB8fCB0bXAgIT0gY21kLT5jb252ZXJ0X3NyYykKKwkJZXJyKys7CisKKwl0bXAgPSBjbWQtPnNjYW5fZW5kX3NyYzsKKwljbWQtPnNjYW5fZW5kX3NyYyAmPSBUUklHX0NPVU5UOworCWlmICghY21kLT5zY2FuX2VuZF9zcmMgfHwgdG1wICE9IGNtZC0+c2Nhbl9lbmRfc3JjKQorCQllcnIrKzsKKworCXRtcCA9IGNtZC0+c3RvcF9zcmM7CisJY21kLT5zdG9wX3NyYyAmPSBUUklHX0NPVU5UIHwgVFJJR19OT05FOworCWlmICghY21kLT5zdG9wX3NyYyB8fCB0bXAgIT0gY21kLT5zdG9wX3NyYykKKwkJZXJyKys7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gMTsKKworCS8qCisJICogc3RlcCAyOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgYW5kIG11dHVhbGx5IGNvbXBhdGlibGUKKwkgKi8KKworCWlmIChjbWQtPmNvbnZlcnRfc3JjICE9IFRSSUdfTk9XICYmIGNtZC0+Y29udmVydF9zcmMgIT0gVFJJR19USU1FUikKKwkJZXJyKys7CisJaWYgKGNtZC0+c3RvcF9zcmMgIT0gVFJJR19DT1VOVCAmJiBjbWQtPnN0b3Bfc3JjICE9IFRSSUdfTk9ORSkKKwkJZXJyKys7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gMjsKKworCS8qIHN0ZXAgMzogbWFrZSBzdXJlIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IGNvbXBhdGlibGUgKi8KKworCWlmIChjbWQtPnN0YXJ0X2FyZyAhPSAwKSB7CisJCWNtZC0+c3RhcnRfYXJnID0gMDsKKwkJZXJyKys7CisJfQorCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfTk9XKSB7CisJCWlmIChjbWQtPmNvbnZlcnRfYXJnICE9IDApIHsKKwkJCWNtZC0+Y29udmVydF9hcmcgPSAwOworCQkJZXJyKys7CisJCX0KKwl9CisJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgeworCQlpZiAoY21kLT5zY2FuX2JlZ2luX2FyZyA8IG5hbm9fcGVyX21pY3JvKSB7CisJCQljbWQtPnNjYW5fYmVnaW5fYXJnID0gbmFub19wZXJfbWljcm87CisJCQllcnIrKzsKKwkJfQorCQlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSICYmCisJCQljbWQtPnNjYW5fYmVnaW5fYXJnIDwKKwkJCWNtZC0+Y29udmVydF9hcmcgKiBjbWQtPmNoYW5saXN0X2xlbikgeworCQkJY21kLT5zY2FuX2JlZ2luX2FyZyA9CisJCQkJY21kLT5jb252ZXJ0X2FyZyAqIGNtZC0+Y2hhbmxpc3RfbGVuOworCQkJZXJyKys7CisJCX0KKwl9CisJLyoKKwkgKiBYWFggdGhlc2UgY2hlY2tzIGFyZSBnZW5lcmljIGFuZCBzaG91bGQgZ28gaW4gY29yZSBpZiBub3QgdGhlcmUKKwkgKiBhbHJlYWR5CisJICovCisJaWYgKCFjbWQtPmNoYW5saXN0X2xlbikgeworCQljbWQtPmNoYW5saXN0X2xlbiA9IDE7CisJCWVycisrOworCX0KKwlpZiAoY21kLT5zY2FuX2VuZF9hcmcgIT0gY21kLT5jaGFubGlzdF9sZW4pIHsKKwkJY21kLT5zY2FuX2VuZF9hcmcgPSBjbWQtPmNoYW5saXN0X2xlbjsKKwkJZXJyKys7CisJfQorCisJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkgeworCQlpZiAoIWNtZC0+c3RvcF9hcmcpIHsKKwkJCWNtZC0+c3RvcF9hcmcgPSAxOworCQkJZXJyKys7CisJCX0KKwl9IGVsc2UgewkJLyogVFJJR19OT05FICovCisJCWlmIChjbWQtPnN0b3BfYXJnICE9IDApIHsKKwkJCWNtZC0+c3RvcF9hcmcgPSAwOworCQkJZXJyKys7CisJCX0KKwl9CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gMzsKKworCS8qIHN0ZXAgNDogZml4IHVwIGFueSBhcmd1bWVudHMgKi8KKworCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKKwkJdG1wID0gY21kLT5zY2FuX2JlZ2luX2FyZzsKKwkJLyogcm91bmQgdG8gbmVhcmVzdCBtaWNyb3NlYyAqLworCQljbWQtPnNjYW5fYmVnaW5fYXJnID0KKwkJCW5hbm9fcGVyX21pY3JvICogKCh0bXAgKworCQkJCShuYW5vX3Blcl9taWNybyAvIDIpKSAvIG5hbm9fcGVyX21pY3JvKTsKKwkJaWYgKHRtcCAhPSBjbWQtPnNjYW5fYmVnaW5fYXJnKQorCQkJZXJyKys7CisJfQorCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKKwkJdG1wID0gY21kLT5jb252ZXJ0X2FyZzsKKwkJLyogcm91bmQgdG8gbmVhcmVzdCBtaWNyb3NlYyAqLworCQljbWQtPmNvbnZlcnRfYXJnID0KKwkJCW5hbm9fcGVyX21pY3JvICogKCh0bXAgKworCQkJCShuYW5vX3Blcl9taWNybyAvIDIpKSAvIG5hbm9fcGVyX21pY3JvKTsKKwkJaWYgKHRtcCAhPSBjbWQtPmNvbnZlcnRfYXJnKQorCQkJZXJyKys7CisJfQorCisJaWYgKGVycikKKwkJcmV0dXJuIDQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3YXZlZm9ybV9haV9jbWQoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzKQoreworCWNvbWVkaV9jbWQgKmNtZCA9ICZzLT5hc3luYy0+Y21kOworCisJaWYgKGNtZC0+ZmxhZ3MgJiBUUklHX1JUKSB7CisJCWNvbWVkaV9lcnJvcihkZXYsCisJCQkiY29tbWFuZHMgYXQgUlQgcHJpb3JpdHkgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGRyaXZlciIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZGV2cHJpdi0+dGltZXJfcnVubmluZyA9IDE7CisJZGV2cHJpdi0+YWlfY291bnQgPSAwOworCWRldnByaXYtPnNjYW5fcGVyaW9kID0gY21kLT5zY2FuX2JlZ2luX2FyZyAvIG5hbm9fcGVyX21pY3JvOworCisJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19OT1cpCisJCWRldnByaXYtPmNvbnZlcnRfcGVyaW9kID0gMDsKKwllbHNlIGlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpCisJCWRldnByaXYtPmNvbnZlcnRfcGVyaW9kID0gY21kLT5jb252ZXJ0X2FyZyAvIG5hbm9fcGVyX21pY3JvOworCWVsc2UgeworCQljb21lZGlfZXJyb3IoZGV2LCAiYnVnIHNldHRpbmcgY29udmVyc2lvbiBwZXJpb2QiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWRvX2dldHRpbWVvZmRheSgmZGV2cHJpdi0+bGFzdCk7CisJZGV2cHJpdi0+dXNlY19jdXJyZW50ID0gZGV2cHJpdi0+bGFzdC50dl91c2VjICUgZGV2cHJpdi0+dXNlY19wZXJpb2Q7CisJZGV2cHJpdi0+dXNlY19yZW1haW5kZXIgPSAwOworCisJZGV2cHJpdi0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAxOworCWFkZF90aW1lcigmZGV2cHJpdi0+dGltZXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdhdmVmb3JtX2FpX2NhbmNlbChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJZGV2cHJpdi0+dGltZXJfcnVubmluZyA9IDA7CisJZGVsX3RpbWVyKCZkZXZwcml2LT50aW1lcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzYW1wbF90IGZha2Vfc2F3dG9vdGgoY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmFuZ2VfaW5kZXgsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgY3VycmVudF90aW1lKQoreworCWNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnJlYWRfc3ViZGV2OworCXVuc2lnbmVkIGludCBvZmZzZXQgPSBzLT5tYXhkYXRhIC8gMjsKKwl1NjQgdmFsdWU7CisJY29uc3QgY29tZWRpX2tyYW5nZSAqa3JhbmdlID0gJnMtPnJhbmdlX3RhYmxlLT5yYW5nZVtyYW5nZV9pbmRleF07CisJdTY0IGJpbmFyeV9hbXBsaXR1ZGU7CisKKwliaW5hcnlfYW1wbGl0dWRlID0gcy0+bWF4ZGF0YTsKKwliaW5hcnlfYW1wbGl0dWRlICo9IGRldnByaXYtPnV2b2x0X2FtcGxpdHVkZTsKKwlkb19kaXYoYmluYXJ5X2FtcGxpdHVkZSwga3JhbmdlLT5tYXggLSBrcmFuZ2UtPm1pbik7CisKKwljdXJyZW50X3RpbWUgJT0gZGV2cHJpdi0+dXNlY19wZXJpb2Q7CisJdmFsdWUgPSBjdXJyZW50X3RpbWU7CisJdmFsdWUgKj0gYmluYXJ5X2FtcGxpdHVkZSAqIDI7CisJZG9fZGl2KHZhbHVlLCBkZXZwcml2LT51c2VjX3BlcmlvZCk7CisJdmFsdWUgLT0gYmluYXJ5X2FtcGxpdHVkZTsJLyogZ2V0IHJpZCBvZiBzYXd0b290aCdzIGRjIG9mZnNldCAqLworCisJcmV0dXJuIG9mZnNldCArIHZhbHVlOworfQorc3RhdGljIHNhbXBsX3QgZmFrZV9zcXVhcmV3YXZlKGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJhbmdlX2luZGV4LAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgY3VycmVudF90aW1lKQoreworCWNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnJlYWRfc3ViZGV2OworCXVuc2lnbmVkIGludCBvZmZzZXQgPSBzLT5tYXhkYXRhIC8gMjsKKwl1NjQgdmFsdWU7CisJY29uc3QgY29tZWRpX2tyYW5nZSAqa3JhbmdlID0gJnMtPnJhbmdlX3RhYmxlLT5yYW5nZVtyYW5nZV9pbmRleF07CisJY3VycmVudF90aW1lICU9IGRldnByaXYtPnVzZWNfcGVyaW9kOworCisJdmFsdWUgPSBzLT5tYXhkYXRhOworCXZhbHVlICo9IGRldnByaXYtPnV2b2x0X2FtcGxpdHVkZTsKKwlkb19kaXYodmFsdWUsIGtyYW5nZS0+bWF4IC0ga3JhbmdlLT5taW4pOworCisJaWYgKGN1cnJlbnRfdGltZSA8IGRldnByaXYtPnVzZWNfcGVyaW9kIC8gMikKKwkJdmFsdWUgKj0gLTE7CisKKwlyZXR1cm4gb2Zmc2V0ICsgdmFsdWU7Cit9CisKK3N0YXRpYyBzYW1wbF90IGZha2VfZmxhdGxpbmUoY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmFuZ2VfaW5kZXgsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgY3VycmVudF90aW1lKQoreworCXJldHVybiBkZXYtPnJlYWRfc3ViZGV2LT5tYXhkYXRhIC8gMjsKK30KKworLyogZ2VuZXJhdGVzIGEgZGlmZmVyZW50IHdhdmVmb3JtIGRlcGVuZGluZyBvbiB3aGF0IGNoYW5uZWwgaXMgcmVhZCAqLworc3RhdGljIHNhbXBsX3QgZmFrZV93YXZlZm9ybShjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBjaGFubmVsLAorCQkJICAgICB1bnNpZ25lZCBpbnQgcmFuZ2UsIHVuc2lnbmVkIGxvbmcgY3VycmVudF90aW1lKQoreworCWVudW0geworCQlTQVdUT09USF9DSEFOLAorCQlTUVVBUkVfQ0hBTiwKKwl9OworCXN3aXRjaCAoY2hhbm5lbCkgeworCWNhc2UgU0FXVE9PVEhfQ0hBTjoKKwkJcmV0dXJuIGZha2Vfc2F3dG9vdGgoZGV2LCByYW5nZSwgY3VycmVudF90aW1lKTsKKwkJYnJlYWs7CisJY2FzZSBTUVVBUkVfQ0hBTjoKKwkJcmV0dXJuIGZha2Vfc3F1YXJld2F2ZShkZXYsIHJhbmdlLCBjdXJyZW50X3RpbWUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZmFrZV9mbGF0bGluZShkZXYsIHJhbmdlLCBjdXJyZW50X3RpbWUpOworfQorCitzdGF0aWMgaW50IHdhdmVmb3JtX2FpX2luc25fcmVhZChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwlpbnQgaSwgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykKKwkJZGF0YVtpXSA9IGRldnByaXYtPmFvX2xvb3BiYWNrc1tjaGFuXTsKKworCXJldHVybiBpbnNuLT5uOworfQorCitzdGF0aWMgaW50IHdhdmVmb3JtX2FvX2luc25fd3JpdGUoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSAgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCWludCBpLCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKQorCQlkZXZwcml2LT5hb19sb29wYmFja3NbY2hhbl0gPSBkYXRhW2ldOworCisJcmV0dXJuIGluc24tPm47Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQ5ODEyLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQ5ODEyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJkMjE3MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDk4MTIuYwpAQCAtMCwwICsxLDExNjIgQEAKKy8qCisgKiBjb21lZGkvZHJpdmVycy9kdDk4MTIuYworICogICBDT01FREkgZHJpdmVyIGZvciBEYXRhVHJhbnNsYXRpb24gRFQ5ODEyIFVTQiBtb2R1bGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgQW5kZXJzIEJsb21kZWxsIDxhbmRlcnMuYmxvbWRlbGxAY29udHJvbC5sdGguc2U+CisgKgorICogQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisKKy8qCitEcml2ZXI6IGR0OTgxMgorRGVzY3JpcHRpb246IERhdGEgVHJhbnNsYXRpb24gRFQ5ODEyIFVTQiBtb2R1bGUKK0F1dGhvcjogYW5kZXJzLmJsb21kZWxsQGNvbnRyb2wubHRoLnNlIChBbmRlcnMgQmxvbWRlbGwpCitTdGF0dXM6IGluIGRldmVsb3BtZW50CitEZXZpY2VzOiBbRGF0YSBUcmFuc2xhdGlvbl0gRFQ5ODEyIChkdDk4MTIpCitVcGRhdGVkOiBTdW4gTm92IDIwIDIwOjE4OjM0IEVTVCAyMDA1CisKK1RoaXMgZHJpdmVyIHdvcmtzLCBidXQgYnVsayB0cmFuc2ZlcnMgbm90IGltcGxlbWVudGVkLiBNaWdodCBiZSBhIHN0YXJ0aW5nIHBvaW50Citmb3Igc29tZW9uZSBlbHNlLiBJIGZvdW5kIG91dCB0b28gbGF0ZSB0aGF0IFVTQiBoYXMgdG9vIGhpZ2ggbGF0ZW5jaWVzICg+MSBtcykKK2ZvciBteSBuZWVkcy4KKyovCisKKy8qCisgKiBOb3RhIEJlbmU6CisgKiAgIDEuIEFsbCB3cml0ZXMgdG8gY29tbWFuZCBwaXBlIGhhcyB0byBiZSAzMiBieXRlcyAoSVNQMTE4MUIgU0hSVFA9MCA/KQorICogICAyLiBUaGUgRERLIHNvdXJjZSAoYXMgb2Ygc2VwIDIwMDUpIGlzIGluIGVycm9yIHJlZ2FyZGluZyB0aGUKKyAqICAgICAgaW5wdXQgTVVYIGJpdHMgKGV4YW1wbGUgY29kZSBzYXlzIFA0LCBidXQgZmlybXdhcmUgc2NoZW1hdGljcworICogICAgICBzYXlzIFAxKS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisKKyNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKworI2RlZmluZSBEVDk4MTJfRElBR1NfQk9BUkRfSU5GT19BRERSCTB4RkJGRgorI2RlZmluZSBEVDk4MTJfTUFYX1dSSVRFX0NNRF9QSVBFX1NJWkUJMzIKKyNkZWZpbmUgRFQ5ODEyX01BWF9SRUFEX0NNRF9QSVBFX1NJWkUJMzIKKworLyoKKyAqIFNlZSBTaWxpY2FuIExhYm9yYXRvcmllcyBDODA1MUYwMjAvMS8yLzMgbWFudWFsCisgKi8KKyNkZWZpbmUgRjAyMF9TRlJfUDQJCQkweDg0CisjZGVmaW5lIEYwMjBfU0ZSX1AxCQkJMHg5MAorI2RlZmluZSBGMDIwX1NGUl9QMgkJCTB4YTAKKyNkZWZpbmUgRjAyMF9TRlJfUDMJCQkweGIwCisjZGVmaW5lIEYwMjBfU0ZSX0FNWDBDRgkJCTB4YmEKKyNkZWZpbmUgRjAyMF9TRlJfQU1YMFNMCQkJMHhiYgorI2RlZmluZSBGMDIwX1NGUl9BREMwQ0YJCQkweGJjCisjZGVmaW5lIEYwMjBfU0ZSX0FEQzBMCQkJMHhiZQorI2RlZmluZSBGMDIwX1NGUl9BREMwSAkJCTB4YmYKKyNkZWZpbmUgRjAyMF9TRlJfREFDMEwJCQkweGQyCisjZGVmaW5lIEYwMjBfU0ZSX0RBQzBICQkJMHhkMworI2RlZmluZSBGMDIwX1NGUl9EQUMwQ04JCQkweGQ0CisjZGVmaW5lIEYwMjBfU0ZSX0RBQzFMCQkJMHhkNQorI2RlZmluZSBGMDIwX1NGUl9EQUMxSAkJCTB4ZDYKKyNkZWZpbmUgRjAyMF9TRlJfREFDMUNOCQkJMHhkNworI2RlZmluZSBGMDIwX1NGUl9BREMwQ04JCQkweGU4CisKKyNkZWZpbmUgRjAyMF9NQVNLX0FEQzBDRl9BTVAwR04wCTB4MDEKKyNkZWZpbmUgRjAyMF9NQVNLX0FEQzBDRl9BTVAwR04xCTB4MDIKKyNkZWZpbmUgRjAyMF9NQVNLX0FEQzBDRl9BTVAwR04yCTB4MDQKKworI2RlZmluZSBGMDIwX01BU0tfQURDMENOX0FEMEVOCQkweDgwCisjZGVmaW5lIEYwMjBfTUFTS19BREMwQ05fQUQwSU5UCQkweDIwCisjZGVmaW5lIEYwMjBfTUFTS19BREMwQ05fQUQwQlVTWQkweDEwCisKKyNkZWZpbmUgRjAyMF9NQVNLX0RBQ3hDTl9EQUN4RU4JCTB4ODAKKworZW51bSB7CisJCQkJLyogQS9EICBEL0EgIERJICBETyAgQ1QgKi8KKwlEVDk4MTJfREVWSURfRFQ5ODEyXzEwLAkvKiAgOCAgICAyICAgOCAgIDggICAxICArLy0gMTBWICovCisJRFQ5ODEyX0RFVklEX0RUOTgxMl8yUFQ1LC8qIDggICAgMiAgIDggICA4ICAgMSAgMC0yLjQ0ViAqLworI2lmIDAKKwlEVDk4MTJfREVWSURfRFQ5ODEzLAkvKiAgMTYgICAyICAgNCAgIDQgICAxICArLy0gMTBWICovCisJRFQ5ODEyX0RFVklEX0RUOTgxNAkvKiAgMjQgICAyICAgMCAgIDAgICAxICArLy0gMTBWICovCisjZW5kaWYKK307CisKK2VudW0gZHQ5ODEyX2dhaW4geworCURUOTgxMl9HQUlOXzBQVDI1ID0gMSwKKwlEVDk4MTJfR0FJTl8wUFQ1ID0gMiwKKwlEVDk4MTJfR0FJTl8xID0gNCwKKwlEVDk4MTJfR0FJTl8yID0gOCwKKwlEVDk4MTJfR0FJTl80ID0gMTYsCisJRFQ5ODEyX0dBSU5fOCA9IDMyLAorCURUOTgxMl9HQUlOXzE2ID0gNjQsCit9OworCitlbnVtIHsKKwlEVDk4MTJfTEVBU1RfVVNCX0ZJUk1XQVJFX0NNRF9DT0RFID0gMCwKKwkvKiBXcml0ZSBGbGFzaCBtZW1vcnkgKi8KKwlEVDk4MTJfV19GTEFTSF9EQVRBID0gMCwKKwkvKiBSZWFkIEZsYXNoIG1lbW9yeSBtaXNjIGNvbmZpZyBpbmZvICovCisJRFQ5ODEyX1JfRkxBU0hfREFUQSA9IDEsCisKKwkvKgorCSAqIFJlZ2lzdGVyIHJlYWQvd3JpdGUgY29tbWFuZHMgZm9yIHByb2Nlc3NvcgorCSAqLworCisJLyogUmVhZCBhIHNpbmdsZSBieXRlIG9mIFVTQiBtZW1vcnkgKi8KKwlEVDk4MTJfUl9TSU5HTEVfQllURV9SRUcgPSAyLAorCS8qIFdyaXRlIGEgc2luZ2xlIGJ5dGUgb2YgVVNCIG1lbW9yeSAqLworCURUOTgxMl9XX1NJTkdMRV9CWVRFX1JFRyA9IDMsCisJLyogTXVsdGlwbGUgUmVhZHMgb2YgVVNCIG1lbW9yeSAqLworCURUOTgxMl9SX01VTFRJX0JZVEVfUkVHID0gNCwKKwkvKiBNdWx0aXBsZSBXcml0ZXMgb2YgVVNCIG1lbW9yeSAqLworCURUOTgxMl9XX01VTFRJX0JZVEVfUkVHID0gNSwKKwkvKiBSZWFkLCAoQU5EKSB3aXRoIG1hc2ssIE9SIHZhbHVlLCB0aGVuIHdyaXRlIChzaW5nbGUpICovCisJRFQ5ODEyX1JNV19TSU5HTEVfQllURV9SRUcgPSA2LAorCS8qIFJlYWQsIChBTkQpIHdpdGggbWFzaywgT1IgdmFsdWUsIHRoZW4gd3JpdGUgKG11bHRpcGxlKSAqLworCURUOTgxMl9STVdfTVVMVElfQllURV9SRUcgPSA3LAorCisJLyoKKwkgKiBSZWdpc3RlciByZWFkL3dyaXRlIGNvbW1hbmRzIGZvciBTTUJ1cworCSAqLworCisJLyogUmVhZCBhIHNpbmdsZSBieXRlIG9mIFNNQnVzICovCisJRFQ5ODEyX1JfU0lOR0xFX0JZVEVfU01CVVMgPSA4LAorCS8qIFdyaXRlIGEgc2luZ2xlIGJ5dGUgb2YgU01CdXMgKi8KKwlEVDk4MTJfV19TSU5HTEVfQllURV9TTUJVUyA9IDksCisJLyogTXVsdGlwbGUgUmVhZHMgb2YgU01CdXMgKi8KKwlEVDk4MTJfUl9NVUxUSV9CWVRFX1NNQlVTID0gMTAsCisJLyogTXVsdGlwbGUgV3JpdGVzIG9mIFNNQnVzICovCisJRFQ5ODEyX1dfTVVMVElfQllURV9TTUJVUyA9IDExLAorCisJLyoKKwkgKiBSZWdpc3RlciByZWFkL3dyaXRlIGNvbW1hbmRzIGZvciBhIGRldmljZQorCSAqLworCisJLyogUmVhZCBhIHNpbmdsZSBieXRlIG9mIGEgZGV2aWNlICovCisJRFQ5ODEyX1JfU0lOR0xFX0JZVEVfREVWID0gMTIsCisJLyogV3JpdGUgYSBzaW5nbGUgYnl0ZSBvZiBhIGRldmljZSAqLworCURUOTgxMl9XX1NJTkdMRV9CWVRFX0RFViA9IDEzLAorCS8qIE11bHRpcGxlIFJlYWRzIG9mIGEgZGV2aWNlICovCisJRFQ5ODEyX1JfTVVMVElfQllURV9ERVYgPSAxNCwKKwkvKiBNdWx0aXBsZSBXcml0ZXMgb2YgYSBkZXZpY2UgKi8KKwlEVDk4MTJfV19NVUxUSV9CWVRFX0RFViA9IDE1LAorCisJLyogTm90IHN1cmUgaWYgd2UnbGwgbmVlZCB0aGlzICovCisJRFQ5ODEyX1dfREFDX1RIUkVTSE9MRCA9IDE2LAorCisJLyogU2V0IGludGVycnVwdCBvbiBjaGFuZ2UgbWFzayAqLworCURUOTgxMl9XX0lOVF9PTl9DSEFOR0VfTUFTSyA9IDE3LAorCisJLyogV3JpdGUgKG9yIENsZWFyKSB0aGUgQ0dMIGZvciB0aGUgQURDICovCisJRFQ5ODEyX1dfQ0dMID0gMTgsCisJLyogTXVsdGlwbGUgUmVhZHMgb2YgVVNCIG1lbW9yeSAqLworCURUOTgxMl9SX01VTFRJX0JZVEVfVVNCTUVNID0gMTksCisJLyogTXVsdGlwbGUgV3JpdGVzIHRvIFVTQiBtZW1vcnkgKi8KKwlEVDk4MTJfV19NVUxUSV9CWVRFX1VTQk1FTSA9IDIwLAorCisJLyogSXNzdWUgYSBzdGFydCBjb21tYW5kIHRvIGEgZ2l2ZW4gc3Vic3lzdGVtICovCisJRFQ5ODEyX1NUQVJUX1NVQlNZU1RFTSA9IDIxLAorCS8qIElzc3VlIGEgc3RvcCBjb21tYW5kIHRvIGEgZ2l2ZW4gc3Vic3lzdGVtICovCisJRFQ5ODEyX1NUT1BfU1VCU1lTVEVNID0gMjIsCisKKwkvKiBjYWxpYnJhdGUgdGhlIGJvYXJkIHVzaW5nIENBTF9QT1RfQ01EICovCisJRFQ5ODEyX0NBTElCUkFURV9QT1QgPSAyMywKKwkvKiBzZXQgdGhlIERBQyBGSUZPIHNpemUgKi8KKwlEVDk4MTJfV19EQUNfRklGT19TSVpFID0gMjQsCisJLyogV3JpdGUgb3IgQ2xlYXIgdGhlIENHTCBmb3IgdGhlIERBQyAqLworCURUOTgxMl9XX0NHTF9EQUMgPSAyNSwKKwkvKiBSZWFkIGEgc2luZ2xlIHZhbHVlIGZyb20gYSBzdWJzeXN0ZW0gKi8KKwlEVDk4MTJfUl9TSU5HTEVfVkFMVUVfQ01EID0gMjYsCisJLyogV3JpdGUgYSBzaW5nbGUgdmFsdWUgdG8gYSBzdWJzeXN0ZW0gKi8KKwlEVDk4MTJfV19TSU5HTEVfVkFMVUVfQ01EID0gMjcsCisJLyogVmFsaWQgRFQ5ODEyX1VTQl9GSVJNV0FSRV9DTURfQ09ERSdzIHdpbGwgYmUgbGVzcyB0aGFuIHRoaXMgbnVtYmVyICovCisJRFQ5ODEyX01BWF9VU0JfRklSTVdBUkVfQ01EX0NPREUsCit9OworCitzdHJ1Y3QgZHQ5ODEyX2ZsYXNoX2RhdGEgeworCXUxNiBudW1ieXRlczsKKwl1MTYgYWRkcmVzczsKK307CisKKyNkZWZpbmUgRFQ5ODEyX01BWF9OVU1fTVVMVElfQllURV9SRFMgIFwKKyAgICAoKERUOTgxMl9NQVhfV1JJVEVfQ01EX1BJUEVfU0laRSAtIDQgLSAxKSAvIHNpemVvZih1OCkpCisKK3N0cnVjdCBkdDk4MTJfcmVhZF9tdWx0aSB7CisJdTggY291bnQ7CisJdTggYWRkcmVzc1tEVDk4MTJfTUFYX05VTV9NVUxUSV9CWVRFX1JEU107Cit9OworCitzdHJ1Y3QgZHQ5ODEyX3dyaXRlX2J5dGUgeworCXU4IGFkZHJlc3M7CisJdTggdmFsdWU7Cit9OworCisjZGVmaW5lIERUOTgxMl9NQVhfTlVNX01VTFRJX0JZVEVfV1JUUyAgXAorICAgICgoRFQ5ODEyX01BWF9XUklURV9DTURfUElQRV9TSVpFIC0gNCAtIDEpIC8gXAorICAgICAgc2l6ZW9mKHN0cnVjdCBkdDk4MTJfd3JpdGVfYnl0ZSkpCisKK3N0cnVjdCBkdDk4MTJfd3JpdGVfbXVsdGkgeworCXU4IGNvdW50OworCXN0cnVjdCBkdDk4MTJfd3JpdGVfYnl0ZSB3cml0ZVtEVDk4MTJfTUFYX05VTV9NVUxUSV9CWVRFX1dSVFNdOworfTsKKworc3RydWN0IGR0OTgxMl9ybXdfYnl0ZSB7CisJdTggYWRkcmVzczsKKwl1OCBhbmRfbWFzazsKKwl1OCBvcl92YWx1ZTsKK307CisKKyNkZWZpbmUgRFQ5ODEyX01BWF9OVU1fTVVMVElfQllURV9STVdTICBcCisgICAgKChEVDk4MTJfTUFYX1dSSVRFX0NNRF9QSVBFX1NJWkUgLSA0IC0gMSkgLyBzaXplb2Yoc3RydWN0IGR0OTgxMl9ybXdfYnl0ZSkpCisKK3N0cnVjdCBkdDk4MTJfcm13X211bHRpIHsKKwl1OCBjb3VudDsKKwlzdHJ1Y3QgZHQ5ODEyX3Jtd19ieXRlIHJtd1tEVDk4MTJfTUFYX05VTV9NVUxUSV9CWVRFX1JNV1NdOworfTsKKworc3RydWN0IGR0OTgxMl91c2JfY21kIHsKKwl1MzIgY21kOworCXVuaW9uIHsKKwkJc3RydWN0IGR0OTgxMl9mbGFzaF9kYXRhIGZsYXNoX2RhdGFfaW5mbzsKKwkJc3RydWN0IGR0OTgxMl9yZWFkX211bHRpIHJlYWRfbXVsdGlfaW5mbzsKKwkJc3RydWN0IGR0OTgxMl93cml0ZV9tdWx0aSB3cml0ZV9tdWx0aV9pbmZvOworCQlzdHJ1Y3QgZHQ5ODEyX3Jtd19tdWx0aSBybXdfbXVsdGlfaW5mbzsKKwl9IHU7CisjaWYgMAorCVdSSVRFX0JZVEVfSU5GTyBXcml0ZUJ5dGVJbmZvOworCVJFQURfQllURV9JTkZPIFJlYWRCeXRlSW5mbzsKKwlXUklURV9NVUxUSV9JTkZPIFdyaXRlTXVsdGlJbmZvOworCVJFQURfTVVMVElfSU5GTyBSZWFkTXVsdGlJbmZvOworCVJNV19CWVRFX0lORk8gUk1XQnl0ZUluZm87CisJUk1XX01VTFRJX0lORk8gUk1XTXVsdGlJbmZvOworCURBQ19USFJFU0hPTERfSU5GTyBEYWNUaHJlc2hvbGRJbmZvOworCUlOVF9PTl9DSEFOR0VfTUFTS19JTkZPIEludE9uQ2hhbmdlTWFza0luZm87CisJQ0dMX0lORk8gQ2dsSW5mbzsKKwlTVUJTWVNURU1fSU5GTyBTdWJzeXN0ZW1JbmZvOworCUNBTF9QT1RfQ01EIENhbFBvdENtZDsKKwlXUklURV9ERVZfQllURV9JTkZPIFdyaXRlRGV2Qnl0ZUluZm87CisJUkVBRF9ERVZfQllURV9JTkZPIFJlYWREZXZCeXRlSW5mbzsKKwlXUklURV9ERVZfTVVMVElfSU5GTyBXcml0ZURldk11bHRpSW5mbzsKKwlSRUFEX0RFVl9NVUxUSV9JTkZPIFJlYWREZXZNdWx0aUluZm87CisJUkVBRF9TSU5HTEVfVkFMVUVfSU5GTyBSZWFkU2luZ2xlVmFsdWVJbmZvOworCVdSSVRFX1NJTkdMRV9WQUxVRV9JTkZPIFdyaXRlU2luZ2xlVmFsdWVJbmZvOworI2VuZGlmCit9OworCisjZGVmaW5lIERUOTgxMl9OVU1fU0xPVFMJMTYKKworc3RhdGljIERFQ0xBUkVfTVVURVgoZHQ5ODEyX211dGV4KTsKKworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGR0OTgxMl90YWJsZVtdID0geworCXtVU0JfREVWSUNFKDB4MDg2NywgMHg5ODEyKX0sCisJeyB9CQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBkdDk4MTJfdGFibGUpOworCitzdHJ1Y3QgdXNiX2R0OTgxMiB7CisJc3RydWN0IHNsb3RfZHQ5ODEyICpzbG90OworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2U7CisJdTE2IHZlbmRvcjsKKwl1MTYgcHJvZHVjdDsKKwl1MTYgZGV2aWNlOworCXUzMiBzZXJpYWw7CisJc3RydWN0IHsKKwkJX191OCBhZGRyOworCQlzaXplX3Qgc2l6ZTsKKwl9IG1lc3NhZ2VfcGlwZSwgY29tbWFuZF93cml0ZSwgY29tbWFuZF9yZWFkLCB3cml0ZV9zdHJlYW0sIHJlYWRfc3RyZWFtOworCXN0cnVjdCBrcmVmIGtyZWY7CisJdTE2IGFuYWxvZ19vdXRfc2hhZG93WzJdOworCXU4IGRpZ2l0YWxfb3V0X3NoYWRvdzsKK307CisKK3N0cnVjdCBjb21lZGlfZHQ5ODEyIHsKKwlzdHJ1Y3Qgc2xvdF9kdDk4MTIgKnNsb3Q7CisJdTMyIHNlcmlhbDsKK307CisKK3N0cnVjdCBzbG90X2R0OTgxMiB7CisJc3RydWN0IHNlbWFwaG9yZSBtdXRleDsKKwl1MzIgc2VyaWFsOworCXN0cnVjdCB1c2JfZHQ5ODEyICp1c2I7CisJc3RydWN0IGNvbWVkaV9kdDk4MTIgKmNvbWVkaTsKK307CisKK3N0YXRpYyBjb25zdCBjb21lZGlfbHJhbmdlIGR0OTgxMl8xMF9haW5fcmFuZ2UgPSB7IDEsIHsKKwkJCUJJUF9SQU5HRSgxMCksCisJfQorfTsKKworc3RhdGljIGNvbnN0IGNvbWVkaV9scmFuZ2UgZHQ5ODEyXzJwdDVfYWluX3JhbmdlID0geyAxLCB7CisJCQlVTklfUkFOR0UoMi41KSwKKwl9Cit9OworCitzdGF0aWMgY29uc3QgY29tZWRpX2xyYW5nZSBkdDk4MTJfMTBfYW91dF9yYW5nZSA9IHsgMSwgeworCQkJQklQX1JBTkdFKDEwKSwKKwl9Cit9OworCitzdGF0aWMgY29uc3QgY29tZWRpX2xyYW5nZSBkdDk4MTJfMnB0NV9hb3V0X3JhbmdlID0geyAxLCB7CisJCQlVTklfUkFOR0UoMi41KSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHNsb3RfZHQ5ODEyIGR0OTgxMltEVDk4MTJfTlVNX1NMT1RTXTsKKworLyogVXNlZnVsIHNob3J0aGFuZCBhY2Nlc3MgdG8gcHJpdmF0ZSBkYXRhICovCisjZGVmaW5lIGRldnByaXYgKChzdHJ1Y3QgY29tZWRpX2R0OTgxMiAqKWRldi0+cHJpdmF0ZSkKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdXNiX2R0OTgxMiAqdG9fZHQ5ODEyX2RldihzdHJ1Y3Qga3JlZiAqZCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGQsIHN0cnVjdCB1c2JfZHQ5ODEyLCBrcmVmKTsKK30KKworc3RhdGljIHZvaWQgZHQ5ODEyX2RlbGV0ZShzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1Y3QgdXNiX2R0OTgxMiAqZGV2ID0gdG9fZHQ5ODEyX2RldihrcmVmKTsKKworCXVzYl9wdXRfZGV2KGRldi0+dWRldik7CisJa2ZyZWUoZGV2KTsKK30KKworc3RhdGljIGludCBkdDk4MTJfcmVhZF9pbmZvKHN0cnVjdCB1c2JfZHQ5ODEyICpkZXYsIGludCBvZmZzZXQsIHZvaWQgKmJ1ZiwKKwkJCSAgICBzaXplX3QgYnVmX3NpemUpCit7CisJc3RydWN0IGR0OTgxMl91c2JfY21kIGNtZDsKKwlpbnQgY291bnQsIHJldHZhbDsKKworCWNtZC5jbWQgPSBjcHVfdG9fbGUzMihEVDk4MTJfUl9GTEFTSF9EQVRBKTsKKwljbWQudS5mbGFzaF9kYXRhX2luZm8uYWRkcmVzcyA9CisJCWNwdV90b19sZTE2KERUOTgxMl9ESUFHU19CT0FSRF9JTkZPX0FERFIgKyBvZmZzZXQpOworCWNtZC51LmZsYXNoX2RhdGFfaW5mby5udW1ieXRlcyA9IGNwdV90b19sZTE2KGJ1Zl9zaXplKTsKKworCS8qIERUOTgxMiBvbmx5IHJlc3BvbmRzIHRvIDMyIGJ5dGUgd3JpdGVzISEgKi8KKwljb3VudCA9IDMyOworCXJldHZhbCA9IHVzYl9idWxrX21zZyhkZXYtPnVkZXYsCisJCQkgICAgICB1c2Jfc25kYnVsa3BpcGUoZGV2LT51ZGV2LAorCQkJCQkgICAgICBkZXYtPmNvbW1hbmRfd3JpdGUuYWRkciksCisJCQkgICAgICAmY21kLCAzMiwgJmNvdW50LCBIWiAqIDEpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcmV0dmFsID0gdXNiX2J1bGtfbXNnKGRldi0+dWRldiwKKwkJCSAgICAgIHVzYl9yY3ZidWxrcGlwZShkZXYtPnVkZXYsCisJCQkJCSAgICAgIGRldi0+Y29tbWFuZF9yZWFkLmFkZHIpLAorCQkJICAgICAgYnVmLCBidWZfc2l6ZSwgJmNvdW50LCBIWiAqIDEpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgZHQ5ODEyX3JlYWRfbXVsdGlwbGVfcmVnaXN0ZXJzKHN0cnVjdCB1c2JfZHQ5ODEyICpkZXYsIGludCByZWdfY291bnQsCisJCQkJCSAgdTggKmFkZHJlc3MsIHU4ICp2YWx1ZSkKK3sKKwlzdHJ1Y3QgZHQ5ODEyX3VzYl9jbWQgY21kOworCWludCBpLCBjb3VudCwgcmV0dmFsOworCisJY21kLmNtZCA9IGNwdV90b19sZTMyKERUOTgxMl9SX01VTFRJX0JZVEVfUkVHKTsKKwljbWQudS5yZWFkX211bHRpX2luZm8uY291bnQgPSByZWdfY291bnQ7CisJZm9yIChpID0gMDsgaSA8IHJlZ19jb3VudDsgaSsrKQorCQljbWQudS5yZWFkX211bHRpX2luZm8uYWRkcmVzc1tpXSA9IGFkZHJlc3NbaV07CisKKwkvKiBEVDk4MTIgb25seSByZXNwb25kcyB0byAzMiBieXRlIHdyaXRlcyEhICovCisJY291bnQgPSAzMjsKKwlyZXR2YWwgPSB1c2JfYnVsa19tc2coZGV2LT51ZGV2LAorCQkJICAgICAgdXNiX3NuZGJ1bGtwaXBlKGRldi0+dWRldiwKKwkJCQkJICAgICAgZGV2LT5jb21tYW5kX3dyaXRlLmFkZHIpLAorCQkJICAgICAgJmNtZCwgMzIsICZjb3VudCwgSFogKiAxKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCXJldHZhbCA9IHVzYl9idWxrX21zZyhkZXYtPnVkZXYsCisJCQkgICAgICB1c2JfcmN2YnVsa3BpcGUoZGV2LT51ZGV2LAorCQkJCQkgICAgICBkZXYtPmNvbW1hbmRfcmVhZC5hZGRyKSwKKwkJCSAgICAgIHZhbHVlLCByZWdfY291bnQsICZjb3VudCwgSFogKiAxKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IGR0OTgxMl93cml0ZV9tdWx0aXBsZV9yZWdpc3RlcnMoc3RydWN0IHVzYl9kdDk4MTIgKmRldiwKKwkJCQkJICAgaW50IHJlZ19jb3VudCwgdTggKmFkZHJlc3MsCisJCQkJCSAgIHU4ICp2YWx1ZSkKK3sKKwlzdHJ1Y3QgZHQ5ODEyX3VzYl9jbWQgY21kOworCWludCBpLCBjb3VudCwgcmV0dmFsOworCisJY21kLmNtZCA9IGNwdV90b19sZTMyKERUOTgxMl9XX01VTFRJX0JZVEVfUkVHKTsKKwljbWQudS5yZWFkX211bHRpX2luZm8uY291bnQgPSByZWdfY291bnQ7CisJZm9yIChpID0gMDsgaSA8IHJlZ19jb3VudDsgaSsrKSB7CisJCWNtZC51LndyaXRlX211bHRpX2luZm8ud3JpdGVbaV0uYWRkcmVzcyA9IGFkZHJlc3NbaV07CisJCWNtZC51LndyaXRlX211bHRpX2luZm8ud3JpdGVbaV0udmFsdWUgPSB2YWx1ZVtpXTsKKwl9CisJLyogRFQ5ODEyIG9ubHkgcmVzcG9uZHMgdG8gMzIgYnl0ZSB3cml0ZXMhISAqLworCXJldHZhbCA9IHVzYl9idWxrX21zZyhkZXYtPnVkZXYsCisJCQkgICAgICB1c2Jfc25kYnVsa3BpcGUoZGV2LT51ZGV2LAorCQkJCQkgICAgICBkZXYtPmNvbW1hbmRfd3JpdGUuYWRkciksCisJCQkgICAgICAmY21kLCAzMiwgJmNvdW50LCBIWiAqIDEpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgZHQ5ODEyX3Jtd19tdWx0aXBsZV9yZWdpc3RlcnMoc3RydWN0IHVzYl9kdDk4MTIgKmRldiwgaW50IHJlZ19jb3VudCwKKwkJCQkJIHN0cnVjdCBkdDk4MTJfcm13X2J5dGUgKnJtdykKK3sKKwlzdHJ1Y3QgZHQ5ODEyX3VzYl9jbWQgY21kOworCWludCBpLCBjb3VudCwgcmV0dmFsOworCisJY21kLmNtZCA9IGNwdV90b19sZTMyKERUOTgxMl9STVdfTVVMVElfQllURV9SRUcpOworCWNtZC51LnJtd19tdWx0aV9pbmZvLmNvdW50ID0gcmVnX2NvdW50OworCWZvciAoaSA9IDA7IGkgPCByZWdfY291bnQ7IGkrKykKKwkJY21kLnUucm13X211bHRpX2luZm8ucm13W2ldID0gcm13W2ldOworCisJLyogRFQ5ODEyIG9ubHkgcmVzcG9uZHMgdG8gMzIgYnl0ZSB3cml0ZXMhISAqLworCXJldHZhbCA9IHVzYl9idWxrX21zZyhkZXYtPnVkZXYsCisJCQkgICAgICB1c2Jfc25kYnVsa3BpcGUoZGV2LT51ZGV2LAorCQkJCQkgICAgICBkZXYtPmNvbW1hbmRfd3JpdGUuYWRkciksCisJCQkgICAgICAmY21kLCAzMiwgJmNvdW50LCBIWiAqIDEpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgZHQ5ODEyX2RpZ2l0YWxfaW4oc3RydWN0IHNsb3RfZHQ5ODEyICpzbG90LCB1OCAqYml0cykKK3sKKwlpbnQgcmVzdWx0ID0gLUVOT0RFVjsKKworCWRvd24oJnNsb3QtPm11dGV4KTsKKwlpZiAoc2xvdC0+dXNiKSB7CisJCXU4IHJlZ1syXSA9IHsgRjAyMF9TRlJfUDMsIEYwMjBfU0ZSX1AxIH07CisJCXU4IHZhbHVlWzJdOworCisJCXJlc3VsdCA9IGR0OTgxMl9yZWFkX211bHRpcGxlX3JlZ2lzdGVycyhzbG90LT51c2IsIDIsIHJlZywKKwkJCQkJCQl2YWx1ZSk7CisJCWlmIChyZXN1bHQgPT0gMCkgeworCQkJLyoKKwkJCSAqIGJpdHMgMC02IGluIEYwMjBfU0ZSX1AzIGFyZSBiaXRzIDAtNiBpbiB0aGUgZGlnaXRhbAorCQkJICogaW5wdXQgcG9ydCBiaXQgMyBpbiBGMDIwX1NGUl9QMSBpcyBiaXQgNyBpbiB0aGUKKwkJCSAqIGRpZ2l0YWwgaW5wdXQgcG9ydAorCQkJICovCisJCQkqYml0cyA9ICh2YWx1ZVswXSAmIDB4N2YpIHwgKCh2YWx1ZVsxXSAmIDB4MDgpIDw8IDQpOworCQkJLyogcHJpbnRrKCIlMi4yeCwgJTIuMnggLT4gJTIuMnhcbiIsCisJCQkJICB2YWx1ZVswXSwgdmFsdWVbMV0sICpiaXRzKTsgKi8KKwkJfQorCX0KKwl1cCgmc2xvdC0+bXV0ZXgpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBkdDk4MTJfZGlnaXRhbF9vdXQoc3RydWN0IHNsb3RfZHQ5ODEyICpzbG90LCB1OCBiaXRzKQoreworCWludCByZXN1bHQgPSAtRU5PREVWOworCisJZG93bigmc2xvdC0+bXV0ZXgpOworCWlmIChzbG90LT51c2IpIHsKKwkJdTggcmVnWzFdOworCQl1OCB2YWx1ZVsxXTsKKworCQlyZWdbMF0gPSBGMDIwX1NGUl9QMjsKKwkJdmFsdWVbMF0gPSBiaXRzOworCQlyZXN1bHQgPSBkdDk4MTJfd3JpdGVfbXVsdGlwbGVfcmVnaXN0ZXJzKHNsb3QtPnVzYiwgMSwgcmVnLAorCQkJCQkJCSB2YWx1ZSk7CisJCXNsb3QtPnVzYi0+ZGlnaXRhbF9vdXRfc2hhZG93ID0gYml0czsKKwl9CisJdXAoJnNsb3QtPm11dGV4KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IGR0OTgxMl9kaWdpdGFsX291dF9zaGFkb3coc3RydWN0IHNsb3RfZHQ5ODEyICpzbG90LCB1OCAqYml0cykKK3sKKwlpbnQgcmVzdWx0ID0gLUVOT0RFVjsKKworCWRvd24oJnNsb3QtPm11dGV4KTsKKwlpZiAoc2xvdC0+dXNiKSB7CisJCSpiaXRzID0gc2xvdC0+dXNiLT5kaWdpdGFsX291dF9zaGFkb3c7CisJCXJlc3VsdCA9IDA7CisJfQorCXVwKCZzbG90LT5tdXRleCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgZHQ5ODEyX2NvbmZpZ3VyZV9tdXgoc3RydWN0IHVzYl9kdDk4MTIgKmRldiwKKwkJCQkgc3RydWN0IGR0OTgxMl9ybXdfYnl0ZSAqcm13LCBpbnQgY2hhbm5lbCkKK3sKKwlpZiAoZGV2LT5kZXZpY2UgPT0gRFQ5ODEyX0RFVklEX0RUOTgxMl8xMCkgeworCQkvKiBJbiB0aGUgRFQ5ODEyLzEwViBNVVggaXMgc2VsZWN0ZWQgYnkgUDEuNS03ICovCisJCXJtdy0+YWRkcmVzcyA9IEYwMjBfU0ZSX1AxOworCQlybXctPmFuZF9tYXNrID0gMHhlMDsKKwkJcm13LT5vcl92YWx1ZSA9IGNoYW5uZWwgPDwgNTsKKwl9IGVsc2UgeworCQkvKiBJbiB0aGUgRFQ5ODEyLzIuNVYsIGludGVybmFsIG11eCBpcyBzZWxlY3RlZCBieSBiaXRzIDA6MiAqLworCQlybXctPmFkZHJlc3MgPSBGMDIwX1NGUl9BTVgwU0w7CisJCXJtdy0+YW5kX21hc2sgPSAweGZmOworCQlybXctPm9yX3ZhbHVlID0gY2hhbm5lbCAmIDB4MDc7CisJfQorfQorCitzdGF0aWMgdm9pZCBkdDk4MTJfY29uZmlndXJlX2dhaW4oc3RydWN0IHVzYl9kdDk4MTIgKmRldiwKKwkJCQkgIHN0cnVjdCBkdDk4MTJfcm13X2J5dGUgKnJtdywKKwkJCQkgIGVudW0gZHQ5ODEyX2dhaW4gZ2FpbikKK3sKKwlpZiAoZGV2LT5kZXZpY2UgPT0gRFQ5ODEyX0RFVklEX0RUOTgxMl8xMCkgeworCQkvKiBJbiB0aGUgRFQ5ODEyLzEwViwgdGhlcmUgaXMgYW4gZXh0ZXJuYWwgZ2FpbiBvZiAwLjUgKi8KKwkJZ2FpbiA8PD0gMTsKKwl9CisKKwlybXctPmFkZHJlc3MgPSBGMDIwX1NGUl9BREMwQ0Y7CisJcm13LT5hbmRfbWFzayA9IEYwMjBfTUFTS19BREMwQ0ZfQU1QMEdOMiB8CisJCQlGMDIwX01BU0tfQURDMENGX0FNUDBHTjEgfAorCQkJRjAyMF9NQVNLX0FEQzBDRl9BTVAwR04wOworCXN3aXRjaCAoZ2FpbikgeworCQkvKgorCQkgKiAwMDAgLT4gR2FpbiA9ICAxCisJCSAqIDAwMSAtPiBHYWluID0gIDIKKwkJICogMDEwIC0+IEdhaW4gPSAgNAorCQkgKiAwMTEgLT4gR2FpbiA9ICA4CisJCSAqIDEweCAtPiBHYWluID0gMTYKKwkJICogMTF4IC0+IEdhaW4gPSAgMC41CisJCSAqLworCWNhc2UgRFQ5ODEyX0dBSU5fMFBUNToKKwkJcm13LT5vcl92YWx1ZSA9IEYwMjBfTUFTS19BREMwQ0ZfQU1QMEdOMiB8fAorCQkJCUYwMjBfTUFTS19BREMwQ0ZfQU1QMEdOMTsKKwkJYnJlYWs7CisJY2FzZSBEVDk4MTJfR0FJTl8xOgorCQlybXctPm9yX3ZhbHVlID0gMHgwMDsKKwkJYnJlYWs7CisJY2FzZSBEVDk4MTJfR0FJTl8yOgorCQlybXctPm9yX3ZhbHVlID0gRjAyMF9NQVNLX0FEQzBDRl9BTVAwR04wOworCQlicmVhazsKKwljYXNlIERUOTgxMl9HQUlOXzQ6CisJCXJtdy0+b3JfdmFsdWUgPSBGMDIwX01BU0tfQURDMENGX0FNUDBHTjE7CisJCWJyZWFrOworCWNhc2UgRFQ5ODEyX0dBSU5fODoKKwkJcm13LT5vcl92YWx1ZSA9IEYwMjBfTUFTS19BREMwQ0ZfQU1QMEdOMSB8fAorCQkJCUYwMjBfTUFTS19BREMwQ0ZfQU1QMEdOMDsKKwkJYnJlYWs7CisJY2FzZSBEVDk4MTJfR0FJTl8xNjoKKwkJcm13LT5vcl92YWx1ZSA9IEYwMjBfTUFTS19BREMwQ0ZfQU1QMEdOMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyKCJJbGxlZ2FsIGdhaW4gJWRcbiIsIGdhaW4pOworCisJfQorfQorCitzdGF0aWMgaW50IGR0OTgxMl9hbmFsb2dfaW4oc3RydWN0IHNsb3RfZHQ5ODEyICpzbG90LCBpbnQgY2hhbm5lbCwgdTE2ICp2YWx1ZSwKKwkJCSAgICBlbnVtIGR0OTgxMl9nYWluIGdhaW4pCit7CisJc3RydWN0IGR0OTgxMl9ybXdfYnl0ZSBybXdbM107CisJdTggcmVnWzNdID0geworCQlGMDIwX1NGUl9BREMwQ04sCisJCUYwMjBfU0ZSX0FEQzBILAorCQlGMDIwX1NGUl9BREMwTAorCX07CisJdTggdmFsWzNdOworCWludCByZXN1bHQgPSAtRU5PREVWOworCisJZG93bigmc2xvdC0+bXV0ZXgpOworCWlmICghc2xvdC0+dXNiKQorCQlnb3RvIGV4aXQ7CisKKwkvKiAxIHNlbGVjdCB0aGUgZ2FpbiAqLworCWR0OTgxMl9jb25maWd1cmVfZ2FpbihzbG90LT51c2IsICZybXdbMF0sIGdhaW4pOworCisJLyogMiBzZXQgdGhlIE1VWCB0byBzZWxlY3QgdGhlIGNoYW5uZWwgKi8KKwlkdDk4MTJfY29uZmlndXJlX211eChzbG90LT51c2IsICZybXdbMV0sIGNoYW5uZWwpOworCisJLyogMyBzdGFydCBjb252ZXJzaW9uICovCisJcm13WzJdLmFkZHJlc3MgPSBGMDIwX1NGUl9BREMwQ047CisJcm13WzJdLmFuZF9tYXNrID0gMHhmZjsKKwlybXdbMl0ub3JfdmFsdWUgPSBGMDIwX01BU0tfQURDMENOX0FEMEVOIHwgRjAyMF9NQVNLX0FEQzBDTl9BRDBCVVNZOworCisJcmVzdWx0ID0gZHQ5ODEyX3Jtd19tdWx0aXBsZV9yZWdpc3RlcnMoc2xvdC0+dXNiLCAzLCBybXcpOworCWlmIChyZXN1bHQpCisJCWdvdG8gZXhpdDsKKworCS8qIHJlYWQgdGhlIHN0YXR1cyBhbmQgQURDICovCisJcmVzdWx0ID0gZHQ5ODEyX3JlYWRfbXVsdGlwbGVfcmVnaXN0ZXJzKHNsb3QtPnVzYiwgMywgcmVnLCB2YWwpOworCWlmIChyZXN1bHQpCisJCWdvdG8gZXhpdDsKKwkvKgorCSAqIEFuIEFEQyBjb252ZXJzaW9uIHRha2VzIDE2IFNBUiBjbG9ja3MgY3ljbGVzLCBpLmUuIGFib3V0IDl1cy4KKwkgKiBUaGVyZWZvcmUsIGJldHdlZW4gdGhlIGluc3RhbnQgdGhhdCBBRDBCVVNZIHdhcyBzZXQgdmlhCisJICogZHQ5ODEyX3Jtd19tdWx0aXBsZV9yZWdpc3RlcnMgYW5kIHRoZSByZWFkIG9mIEFEMEJVU1kgdmlhCisJICogZHQ5ODEyX3JlYWRfbXVsdGlwbGVfcmVnaXN0ZXJzLCB0aGUgY29udmVyc2lvbiBzaG91bGQgYmUgY29tcGxldGUKKwkgKiBzaW5jZSB0aGVzZSB0d28gb3BlcmF0aW9ucyByZXF1aXJlIHR3byBVU0IgdHJhbnNhY3Rpb25zIGVhY2ggdGFraW5nCisJICogYXQgbGVhc3QgYSBtaWxsaXNlY29uZCB0byBjb21wbGV0ZS4gIEhvd2V2ZXIsIGxldHMgbWFrZSBzdXJlIHRoYXQKKwkgKiBjb252ZXJzaW9uIGlzIGZpbmlzaGVkLgorCSAqLworCWlmICgodmFsWzBdICYgKEYwMjBfTUFTS19BREMwQ05fQUQwSU5UIHwgRjAyMF9NQVNLX0FEQzBDTl9BRDBCVVNZKSkgPT0KKwkgICAgRjAyMF9NQVNLX0FEQzBDTl9BRDBJTlQpIHsKKwkJc3dpdGNoIChzbG90LT51c2ItPmRldmljZSkgeworCQljYXNlIERUOTgxMl9ERVZJRF9EVDk4MTJfMTA6CisJCQkvKgorCQkJICogRm9yIERUOTgxMi0xMFYgdGhlIHBlcnNvbmFsaXR5IG1vZHVsZSBzZXQgdGhlCisJCQkgKiBlbmNvZGluZyB0byAyJ3MgY29tcGxlbWVudC4gSGVuY2UsIGNvbnZlcnQgaXQgYmVmb3JlCisJCQkgKiByZXR1cm5pbmcgaXQKKwkJCSAqLworCQkJKnZhbHVlID0gKCh2YWxbMV0gPDwgOCkgfCB2YWxbMl0pICsgMHg4MDA7CisJCQlicmVhazsKKwkJY2FzZSBEVDk4MTJfREVWSURfRFQ5ODEyXzJQVDU6CisJCQkqdmFsdWUgPSAodmFsWzFdIDw8IDgpIHwgdmFsWzJdOworCQkJYnJlYWs7CisJCX0KKwl9CisKK2V4aXQ6CisJdXAoJnNsb3QtPm11dGV4KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IGR0OTgxMl9hbmFsb2dfb3V0X3NoYWRvdyhzdHJ1Y3Qgc2xvdF9kdDk4MTIgKnNsb3QsIGludCBjaGFubmVsLAorCQkJCSAgICB1MTYgKnZhbHVlKQoreworCWludCByZXN1bHQgPSAtRU5PREVWOworCisJZG93bigmc2xvdC0+bXV0ZXgpOworCWlmIChzbG90LT51c2IpIHsKKwkJKnZhbHVlID0gc2xvdC0+dXNiLT5hbmFsb2dfb3V0X3NoYWRvd1tjaGFubmVsXTsKKwkJcmVzdWx0ID0gMDsKKwl9CisJdXAoJnNsb3QtPm11dGV4KTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgZHQ5ODEyX2FuYWxvZ19vdXQoc3RydWN0IHNsb3RfZHQ5ODEyICpzbG90LCBpbnQgY2hhbm5lbCwgdTE2IHZhbHVlKQoreworCWludCByZXN1bHQgPSAtRU5PREVWOworCisJZG93bigmc2xvdC0+bXV0ZXgpOworCWlmIChzbG90LT51c2IpIHsKKwkJc3RydWN0IGR0OTgxMl9ybXdfYnl0ZSBybXdbM107CisKKwkJc3dpdGNoIChjaGFubmVsKSB7CisJCWNhc2UgMDoKKwkJCS8qIDEuIFNldCBEQUMgbW9kZSAqLworCQkJcm13WzBdLmFkZHJlc3MgPSBGMDIwX1NGUl9EQUMwQ047CisJCQlybXdbMF0uYW5kX21hc2sgPSAweGZmOworCQkJcm13WzBdLm9yX3ZhbHVlID0gRjAyMF9NQVNLX0RBQ3hDTl9EQUN4RU47CisKKwkJCS8qIDIgbG9hZCBsb3cgYnl0ZSBvZiBEQUMgdmFsdWUgZmlyc3QgKi8KKwkJCXJtd1sxXS5hZGRyZXNzID0gRjAyMF9TRlJfREFDMEw7CisJCQlybXdbMV0uYW5kX21hc2sgPSAweGZmOworCQkJcm13WzFdLm9yX3ZhbHVlID0gdmFsdWUgJiAweGZmOworCisJCQkvKiAzIGxvYWQgaGlnaCBieXRlIG9mIERBQyB2YWx1ZSBuZXh0IHRvIGxhdGNoIHRoZQorCQkJICAgMTItYml0IHZhbHVlICovCisJCQlybXdbMl0uYWRkcmVzcyA9IEYwMjBfU0ZSX0RBQzBIOworCQkJcm13WzJdLmFuZF9tYXNrID0gMHhmZjsKKwkJCXJtd1syXS5vcl92YWx1ZSA9ICh2YWx1ZSA+PiA4KSAmIDB4ZjsKKwkJCWJyZWFrOworCisJCWNhc2UgMToKKwkJCS8qIDEuIFNldCBEQUMgbW9kZSAqLworCQkJcm13WzBdLmFkZHJlc3MgPSBGMDIwX1NGUl9EQUMxQ047CisJCQlybXdbMF0uYW5kX21hc2sgPSAweGZmOworCQkJcm13WzBdLm9yX3ZhbHVlID0gRjAyMF9NQVNLX0RBQ3hDTl9EQUN4RU47CisKKwkJCS8qIDIgbG9hZCBsb3cgYnl0ZSBvZiBEQUMgdmFsdWUgZmlyc3QgKi8KKwkJCXJtd1sxXS5hZGRyZXNzID0gRjAyMF9TRlJfREFDMUw7CisJCQlybXdbMV0uYW5kX21hc2sgPSAweGZmOworCQkJcm13WzFdLm9yX3ZhbHVlID0gdmFsdWUgJiAweGZmOworCisJCQkvKiAzIGxvYWQgaGlnaCBieXRlIG9mIERBQyB2YWx1ZSBuZXh0IHRvIGxhdGNoIHRoZQorCQkJICAgMTItYml0IHZhbHVlICovCisJCQlybXdbMl0uYWRkcmVzcyA9IEYwMjBfU0ZSX0RBQzFIOworCQkJcm13WzJdLmFuZF9tYXNrID0gMHhmZjsKKwkJCXJtd1syXS5vcl92YWx1ZSA9ICh2YWx1ZSA+PiA4KSAmIDB4ZjsKKwkJCWJyZWFrOworCQl9CisJCXJlc3VsdCA9IGR0OTgxMl9ybXdfbXVsdGlwbGVfcmVnaXN0ZXJzKHNsb3QtPnVzYiwgMywgcm13KTsKKwkJc2xvdC0+dXNiLT5hbmFsb2dfb3V0X3NoYWRvd1tjaGFubmVsXSA9IHZhbHVlOworCX0KKwl1cCgmc2xvdC0+bXV0ZXgpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIFVTQiBmcmFtZXdvcmsgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBkdDk4MTJfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSwKKwkJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmV0dmFsID0gLUVOT01FTTsKKwlzdHJ1Y3QgdXNiX2R0OTgxMiAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppZmFjZV9kZXNjOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CisJaW50IGk7CisJdTggZnc7CisKKwkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIG91ciBkZXZpY2Ugc3RhdGUgYW5kIGluaXRpYWxpemUgaXQgKi8KKwlkZXYgPSBremFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRldiA9PSBOVUxMKSB7CisJCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiT3V0IG9mIG1lbW9yeVxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCWtyZWZfaW5pdCgmZGV2LT5rcmVmKTsKKworCWRldi0+dWRldiA9IHVzYl9nZXRfZGV2KGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKSk7CisJZGV2LT5pbnRlcmZhY2UgPSBpbnRlcmZhY2U7CisKKwkvKiBDaGVjayBlbmRwb2ludHMgKi8KKwlpZmFjZV9kZXNjID0gaW50ZXJmYWNlLT5jdXJfYWx0c2V0dGluZzsKKworCWlmIChpZmFjZV9kZXNjLT5kZXNjLmJOdW1FbmRwb2ludHMgIT0gNSkgeworCQllcnIoIldyb25nIG51bWJlciBvZiBlbmRwaW50cy4iKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyArK2kpIHsKKwkJaW50IGRpcmVjdGlvbiA9IC0xOworCQllbmRwb2ludCA9ICZpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjOworCQlzd2l0Y2ggKGkpIHsKKwkJY2FzZSAwOgorCQkJZGlyZWN0aW9uID0gVVNCX0RJUl9JTjsKKwkJCWRldi0+bWVzc2FnZV9waXBlLmFkZHIgPSBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKKwkJCWRldi0+bWVzc2FnZV9waXBlLnNpemUgPQorCQkJCQlsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpOworCisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJZGlyZWN0aW9uID0gVVNCX0RJUl9PVVQ7CisJCQlkZXYtPmNvbW1hbmRfd3JpdGUuYWRkciA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOworCQkJZGV2LT5jb21tYW5kX3dyaXRlLnNpemUgPQorCQkJCQlsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWRpcmVjdGlvbiA9IFVTQl9ESVJfSU47CisJCQlkZXYtPmNvbW1hbmRfcmVhZC5hZGRyID0gZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7CisJCQlkZXYtPmNvbW1hbmRfcmVhZC5zaXplID0KKwkJCQkJbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlkaXJlY3Rpb24gPSBVU0JfRElSX09VVDsKKwkJCWRldi0+d3JpdGVfc3RyZWFtLmFkZHIgPSBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKKwkJCWRldi0+d3JpdGVfc3RyZWFtLnNpemUgPQorCQkJCQlsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCWRpcmVjdGlvbiA9IFVTQl9ESVJfSU47CisJCQlkZXYtPnJlYWRfc3RyZWFtLmFkZHIgPSBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKKwkJCWRldi0+cmVhZF9zdHJlYW0uc2l6ZSA9CisJCQkJCWxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikgIT0gZGlyZWN0aW9uKSB7CisJCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwKKwkJCQkiRW5kcG9pbnQgaGFzIHdyb25nIGRpcmVjdGlvbi5cbiIpOworCQkJcmV0dmFsID0gLUVOT0RFVjsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwl9CisJaWYgKGR0OTgxMl9yZWFkX2luZm8oZGV2LCAwLCAmZncsIHNpemVvZihmdykpICE9IDApIHsKKwkJLyoKKwkJICogU2VlbXMgbGlrZSBhIGNvbmZpZ3VyYXRpb24gcmVzZXQgaXMgbmVjZXNzYXJ5IGlmIGRyaXZlciBpcworCQkgKiByZWxvYWRlZCB3aGlsZSBkZXZpY2UgaXMgYXR0YWNoZWQKKwkJICovCisJCXVzYl9yZXNldF9jb25maWd1cmF0aW9uKGRldi0+dWRldik7CisJCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCQlyZXR2YWwgPSBkdDk4MTJfcmVhZF9pbmZvKGRldiwgMSwgJmZ3LCBzaXplb2YoZncpKTsKKwkJCWlmIChyZXR2YWwgPT0gMCkgeworCQkJCWRldl9pbmZvKCZpbnRlcmZhY2UtPmRldiwKKwkJCQkJICJ1c2JfcmVzZXRfY29uZmlndXJhdGlvbiBzdWNjZWRlZCAiCisJCQkJCSAiYWZ0ZXIgJWQgaXRlcmF0aW9uc1xuIiwgaSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoZHQ5ODEyX3JlYWRfaW5mbyhkZXYsIDEsICZkZXYtPnZlbmRvciwgc2l6ZW9mKGRldi0+dmVuZG9yKSkgIT0gMCkgeworCQllcnIoIkZhaWxlZCB0byByZWFkIHZlbmRvci4iKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcjsKKwl9CisJaWYgKGR0OTgxMl9yZWFkX2luZm8oZGV2LCAzLCAmZGV2LT5wcm9kdWN0LAorCQkJICAgICBzaXplb2YoZGV2LT5wcm9kdWN0KSkgIT0gMCkgeworCQllcnIoIkZhaWxlZCB0byByZWFkIHByb2R1Y3QuIik7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyb3I7CisJfQorCWlmIChkdDk4MTJfcmVhZF9pbmZvKGRldiwgNSwgJmRldi0+ZGV2aWNlLCBzaXplb2YoZGV2LT5kZXZpY2UpKSAhPSAwKSB7CisJCWVycigiRmFpbGVkIHRvIHJlYWQgZGV2aWNlLiIpOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGVycm9yOworCX0KKwlpZiAoZHQ5ODEyX3JlYWRfaW5mbyhkZXYsIDcsICZkZXYtPnNlcmlhbCwgc2l6ZW9mKGRldi0+c2VyaWFsKSkgIT0gMCkgeworCQllcnIoIkZhaWxlZCB0byByZWFkIHNlcmlhbC4iKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlkZXYtPnZlbmRvciA9IGxlMTZfdG9fY3B1KGRldi0+dmVuZG9yKTsKKwlkZXYtPnByb2R1Y3QgPSBsZTE2X3RvX2NwdShkZXYtPnByb2R1Y3QpOworCWRldi0+ZGV2aWNlID0gbGUxNl90b19jcHUoZGV2LT5kZXZpY2UpOworCWRldi0+c2VyaWFsID0gbGUzMl90b19jcHUoZGV2LT5zZXJpYWwpOworCXN3aXRjaCAoZGV2LT5kZXZpY2UpIHsKKwljYXNlIERUOTgxMl9ERVZJRF9EVDk4MTJfMTA6CisJCWRldi0+YW5hbG9nX291dF9zaGFkb3dbMF0gPSAweDA4MDA7CisJCWRldi0+YW5hbG9nX291dF9zaGFkb3dbMV0gPSAweDgwMDsKKwkJYnJlYWs7CisJY2FzZSBEVDk4MTJfREVWSURfRFQ5ODEyXzJQVDU6CisJCWRldi0+YW5hbG9nX291dF9zaGFkb3dbMF0gPSAweDAwMDA7CisJCWRldi0+YW5hbG9nX291dF9zaGFkb3dbMV0gPSAweDAwMDA7CisJCWJyZWFrOworCX0KKwlkZXYtPmRpZ2l0YWxfb3V0X3NoYWRvdyA9IDA7CisKKwkvKiBzYXZlIG91ciBkYXRhIHBvaW50ZXIgaW4gdGhpcyBpbnRlcmZhY2UgZGV2aWNlICovCisJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIGRldik7CisKKwkvKiBsZXQgdGhlIHVzZXIga25vdyB3aGF0IG5vZGUgdGhpcyBkZXZpY2UgaXMgbm93IGF0dGFjaGVkIHRvICovCisJZGV2X2luZm8oJmludGVyZmFjZS0+ZGV2LCAiVVNCIERUOTgxMiAoJTQuNHguJTQuNHguJTQuNHgpICMweCU4Ljh4XG4iLAorCQkgZGV2LT52ZW5kb3IsIGRldi0+cHJvZHVjdCwgZGV2LT5kZXZpY2UsIGRldi0+c2VyaWFsKTsKKworCWRvd24oJmR0OTgxMl9tdXRleCk7CisJeworCQkvKiBGaW5kIGEgc2xvdCBmb3IgdGhlIFVTQiBkZXZpY2UgKi8KKwkJc3RydWN0IHNsb3RfZHQ5ODEyICpmaXJzdCA9IE5VTEw7CisJCXN0cnVjdCBzbG90X2R0OTgxMiAqYmVzdCA9IE5VTEw7CisKKwkJZm9yIChpID0gMDsgaSA8IERUOTgxMl9OVU1fU0xPVFM7IGkrKykgeworCQkJaWYgKCFmaXJzdCAmJiAhZHQ5ODEyW2ldLnVzYiAmJiBkdDk4MTJbaV0uc2VyaWFsID09IDApCisJCQkJZmlyc3QgPSAmZHQ5ODEyW2ldOworCQkJaWYgKCFiZXN0ICYmIGR0OTgxMltpXS5zZXJpYWwgPT0gZGV2LT5zZXJpYWwpCisJCQkJYmVzdCA9ICZkdDk4MTJbaV07CisJCX0KKworCQlpZiAoIWJlc3QpCisJCQliZXN0ID0gZmlyc3Q7CisKKwkJaWYgKGJlc3QpIHsKKwkJCWRvd24oJmJlc3QtPm11dGV4KTsKKwkJCWJlc3QtPnVzYiA9IGRldjsKKwkJCWRldi0+c2xvdCA9IGJlc3Q7CisJCQl1cCgmYmVzdC0+bXV0ZXgpOworCQl9CisJfQorCXVwKCZkdDk4MTJfbXV0ZXgpOworCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCWlmIChkZXYpCisJCWtyZWZfcHV0KCZkZXYtPmtyZWYsIGR0OTgxMl9kZWxldGUpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGR0OTgxMl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCit7CisJc3RydWN0IHVzYl9kdDk4MTIgKmRldjsKKwlpbnQgbWlub3IgPSBpbnRlcmZhY2UtPm1pbm9yOworCisJZG93bigmZHQ5ODEyX211dGV4KTsKKwlkZXYgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CisJaWYgKGRldi0+c2xvdCkgeworCQlkb3duKCZkZXYtPnNsb3QtPm11dGV4KTsKKwkJZGV2LT5zbG90LT51c2IgPSBOVUxMOworCQl1cCgmZGV2LT5zbG90LT5tdXRleCk7CisJCWRldi0+c2xvdCA9IE5VTEw7CisJfQorCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKKwl1cCgmZHQ5ODEyX211dGV4KTsKKworCS8qIHF1ZXVlIGZpbmFsIGRlc3RydWN0aW9uICovCisJa3JlZl9wdXQoJmRldi0+a3JlZiwgZHQ5ODEyX2RlbGV0ZSk7CisKKwlkZXZfaW5mbygmaW50ZXJmYWNlLT5kZXYsICJVU0IgRHQ5ODEyICMlZCBub3cgZGlzY29ubmVjdGVkXG4iLCBtaW5vcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBkdDk4MTJfdXNiX2RyaXZlciA9IHsKKwkubmFtZSA9ICJkdDk4MTIiLAorCS5wcm9iZSA9IGR0OTgxMl9wcm9iZSwKKwkuZGlzY29ubmVjdCA9IGR0OTgxMl9kaXNjb25uZWN0LAorCS5pZF90YWJsZSA9IGR0OTgxMl90YWJsZSwKK307CisKKy8qCisgKiBDb21lZGkgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIHZvaWQgZHQ5ODEyX2NvbWVkaV9vcGVuKGNvbWVkaV9kZXZpY2UgKmRldikKK3sKKwlkb3duKCZkZXZwcml2LT5zbG90LT5tdXRleCk7CisJaWYgKGRldnByaXYtPnNsb3QtPnVzYikgeworCQkvKiBXZSBoYXZlIGFuIGF0dGFjaGVkIGRldmljZSwgZmlsbCBpbiBjdXJyZW50IHJhbmdlIGluZm8gKi8KKwkJY29tZWRpX3N1YmRldmljZSAqczsKKworCQlzID0gJmRldi0+c3ViZGV2aWNlc1swXTsKKwkJcy0+bl9jaGFuID0gODsKKwkJcy0+bWF4ZGF0YSA9IDE7CisKKwkJcyA9ICZkZXYtPnN1YmRldmljZXNbMV07CisJCXMtPm5fY2hhbiA9IDg7CisJCXMtPm1heGRhdGEgPSAxOworCisJCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzJdOworCQlzLT5uX2NoYW4gPSA4OworCQlzd2l0Y2ggKGRldnByaXYtPnNsb3QtPnVzYi0+ZGV2aWNlKSB7CisJCWNhc2UgMDp7CisJCQkJcy0+bWF4ZGF0YSA9IDQwOTU7CisJCQkJcy0+cmFuZ2VfdGFibGUgPSAmZHQ5ODEyXzEwX2Fpbl9yYW5nZTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDE6eworCQkJCXMtPm1heGRhdGEgPSA0MDk1OworCQkJCXMtPnJhbmdlX3RhYmxlID0gJmR0OTgxMl8ycHQ1X2Fpbl9yYW5nZTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJcyA9ICZkZXYtPnN1YmRldmljZXNbM107CisJCXMtPm5fY2hhbiA9IDI7CisJCXN3aXRjaCAoZGV2cHJpdi0+c2xvdC0+dXNiLT5kZXZpY2UpIHsKKwkJY2FzZSAwOnsKKwkJCQlzLT5tYXhkYXRhID0gNDA5NTsKKwkJCQlzLT5yYW5nZV90YWJsZSA9ICZkdDk4MTJfMTBfYW91dF9yYW5nZTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDE6eworCQkJCXMtPm1heGRhdGEgPSA0MDk1OworCQkJCXMtPnJhbmdlX3RhYmxlID0gJmR0OTgxMl8ycHQ1X2FvdXRfcmFuZ2U7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KKwl1cCgmZGV2cHJpdi0+c2xvdC0+bXV0ZXgpOworfQorCitzdGF0aWMgaW50IGR0OTgxMl9kaV9yaW5zbihjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpCit7CisJaW50IG47CisJdTggYml0cyA9IDA7CisKKwlkdDk4MTJfZGlnaXRhbF9pbihkZXZwcml2LT5zbG90LCAmYml0cyk7CisJZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykKKwkJZGF0YVtuXSA9ICgoMSA8PCBpbnNuLT5jaGFuc3BlYykgJiBiaXRzKSAhPSAwOworCXJldHVybiBuOworfQorCitzdGF0aWMgaW50IGR0OTgxMl9kb193aW5zbihjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpCit7CisJaW50IG47CisJdTggYml0cyA9IDA7CisKKwlkdDk4MTJfZGlnaXRhbF9vdXRfc2hhZG93KGRldnByaXYtPnNsb3QsICZiaXRzKTsKKwlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKSB7CisJCXU4IG1hc2sgPSAxIDw8IGluc24tPmNoYW5zcGVjOworCisJCWJpdHMgJj0gfm1hc2s7CisJCWlmIChkYXRhW25dKQorCQkJYml0cyB8PSBtYXNrOworCX0KKwlkdDk4MTJfZGlnaXRhbF9vdXQoZGV2cHJpdi0+c2xvdCwgYml0cyk7CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBpbnQgZHQ5ODEyX2FpX3JpbnNuKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwlpbnQgbjsKKworCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspIHsKKwkJdTE2IHZhbHVlID0gMDsKKworCQlkdDk4MTJfYW5hbG9nX2luKGRldnByaXYtPnNsb3QsIGluc24tPmNoYW5zcGVjLCAmdmFsdWUsCisJCQkJIERUOTgxMl9HQUlOXzEpOworCQlkYXRhW25dID0gdmFsdWU7CisJfQorCXJldHVybiBuOworfQorCitzdGF0aWMgaW50IGR0OTgxMl9hb19yaW5zbihjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpCit7CisJaW50IG47CisJdTE2IHZhbHVlOworCisJZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykgeworCQl2YWx1ZSA9IDA7CisJCWR0OTgxMl9hbmFsb2dfb3V0X3NoYWRvdyhkZXZwcml2LT5zbG90LCBpbnNuLT5jaGFuc3BlYywgJnZhbHVlKTsKKwkJZGF0YVtuXSA9IHZhbHVlOworCX0KKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGludCBkdDk4MTJfYW9fd2luc24oY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCWludCBuOworCisJZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykKKwkJZHQ5ODEyX2FuYWxvZ19vdXQoZGV2cHJpdi0+c2xvdCwgaW5zbi0+Y2hhbnNwZWMsIGRhdGFbbl0pOworCXJldHVybiBuOworfQorCitzdGF0aWMgaW50IGR0OTgxMl9hdHRhY2goY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfZGV2Y29uZmlnICppdCkKK3sKKwlpbnQgaTsKKwljb21lZGlfc3ViZGV2aWNlICpzOworCisJZGV2LT5ib2FyZF9uYW1lID0gImR0OTgxMiI7CisKKwlpZiAoYWxsb2NfcHJpdmF0ZShkZXYsIHNpemVvZihzdHJ1Y3QgY29tZWRpX2R0OTgxMikpIDwgMCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKgorCSAqIFNwZWNpYWwgb3BlbiByb3V0aW5lLCBzaW5jZSBVU0IgdW5pdCBtYXkgYmUgdW5hdHRhY2hlZCBhdAorCSAqIGNvbWVkaV9jb25maWcgdGltZSwgaGVuY2UgcmFuZ2UgY2FuIG5vdCBiZSBkZXRlcm1pbmVkCisJICovCisJZGV2LT5vcGVuID0gZHQ5ODEyX2NvbWVkaV9vcGVuOworCisJZGV2cHJpdi0+c2VyaWFsID0gaXQtPm9wdGlvbnNbMF07CisKKwkvKiBBbGxvY2F0ZSBzdWJkZXZpY2VzICovCisJaWYgKGFsbG9jX3N1YmRldmljZXMoZGV2LCA0KSA8IDApCisJCXJldHVybiAtRU5PTUVNOworCisJLyogZGlnaXRhbCBpbnB1dCBzdWJkZXZpY2UgKi8KKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgMDsKKwlzLT50eXBlID0gQ09NRURJX1NVQkRfREk7CisJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFOworCXMtPm5fY2hhbiA9IDA7CisJcy0+bWF4ZGF0YSA9IDE7CisJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfZGlnaXRhbDsKKwlzLT5pbnNuX3JlYWQgPSAmZHQ5ODEyX2RpX3JpbnNuOworCisJLyogZGlnaXRhbCBvdXRwdXQgc3ViZGV2aWNlICovCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIDE7CisJcy0+dHlwZSA9IENPTUVESV9TVUJEX0RPOworCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklURUFCTEU7CisJcy0+bl9jaGFuID0gMDsKKwlzLT5tYXhkYXRhID0gMTsKKwlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOworCXMtPmluc25fd3JpdGUgPSAmZHQ5ODEyX2RvX3dpbnNuOworCisJLyogYW5hbG9nIGlucHV0IHN1YmRldmljZSAqLworCXMgPSBkZXYtPnN1YmRldmljZXMgKyAyOworCXMtPnR5cGUgPSBDT01FRElfU1VCRF9BSTsKKwlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfUkVBREFCTEUgfCBTREZfR1JPVU5EOworCXMtPm5fY2hhbiA9IDA7CisJcy0+bWF4ZGF0YSA9IDE7CisJcy0+cmFuZ2VfdGFibGUgPSBOVUxMOworCXMtPmluc25fcmVhZCA9ICZkdDk4MTJfYWlfcmluc247CisKKwkvKiBhbmFsb2cgb3V0cHV0IHN1YmRldmljZSAqLworCXMgPSBkZXYtPnN1YmRldmljZXMgKyAzOworCXMtPnR5cGUgPSBDT01FRElfU1VCRF9BTzsKKwlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfV1JJVEVBQkxFOworCXMtPm5fY2hhbiA9IDA7CisJcy0+bWF4ZGF0YSA9IDE7CisJcy0+cmFuZ2VfdGFibGUgPSBOVUxMOworCXMtPmluc25fd3JpdGUgPSAmZHQ5ODEyX2FvX3dpbnNuOworCXMtPmluc25fcmVhZCA9ICZkdDk4MTJfYW9fcmluc247CisKKwlwcmludGsoS0VSTl9JTkZPICJjb21lZGklZDogc3VjY2Vzc2Z1bGx5IGF0dGFjaGVkIHRvIGR0OTgxMi5cbiIsCisJICAgICAgIGRldi0+bWlub3IpOworCisJZG93bigmZHQ5ODEyX211dGV4KTsKKwkvKiBGaW5kIGEgc2xvdCBmb3IgdGhlIGNvbWVkaSBkZXZpY2UgKi8KKwl7CisJCXN0cnVjdCBzbG90X2R0OTgxMiAqZmlyc3QgPSBOVUxMOworCQlzdHJ1Y3Qgc2xvdF9kdDk4MTIgKmJlc3QgPSBOVUxMOworCQlmb3IgKGkgPSAwOyBpIDwgRFQ5ODEyX05VTV9TTE9UUzsgaSsrKSB7CisJCQlpZiAoIWZpcnN0ICYmICFkdDk4MTJbaV0uY29tZWRpKSB7CisJCQkJLyogRmlyc3QgZnJlZSBzbG90IGZyb20gY29tZWRpIHNpZGUgKi8KKwkJCQlmaXJzdCA9ICZkdDk4MTJbaV07CisJCQl9CisJCQlpZiAoIWJlc3QgJiYKKwkJCSAgICBkdDk4MTJbaV0udXNiICYmCisJCQkgICAgZHQ5ODEyW2ldLnVzYi0+c2VyaWFsID09IGRldnByaXYtPnNlcmlhbCkgeworCQkJCS8qIFdlIGhhdmUgYW4gYXR0YWNlZCBkZXZpY2Ugd2l0aCBtYXRjaGluZyBJRCAqLworCQkJCWJlc3QgPSAmZHQ5ODEyW2ldOworCQkJfQorCQl9CisJCWlmICghYmVzdCkKKwkJCWJlc3QgPSBmaXJzdDsKKwkJaWYgKGJlc3QpIHsKKwkJCWRvd24oJmJlc3QtPm11dGV4KTsKKwkJCWJlc3QtPmNvbWVkaSA9IGRldnByaXY7CisJCQliZXN0LT5zZXJpYWwgPSBkZXZwcml2LT5zZXJpYWw7CisJCQlkZXZwcml2LT5zbG90ID0gYmVzdDsKKwkJCXVwKCZiZXN0LT5tdXRleCk7CisJCX0KKwl9CisJdXAoJmR0OTgxMl9tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkdDk4MTJfZGV0YWNoKGNvbWVkaV9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbWVkaV9kcml2ZXIgZHQ5ODEyX2NvbWVkaV9kcml2ZXIgPSB7CisJLm1vZHVsZSA9IFRISVNfTU9EVUxFLAorCS5kcml2ZXJfbmFtZSA9ICJkdDk4MTIiLAorCS5hdHRhY2ggPSBkdDk4MTJfYXR0YWNoLAorCS5kZXRhY2ggPSBkdDk4MTJfZGV0YWNoLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdXNiX2R0OTgxMl9pbml0KHZvaWQpCit7CisJaW50IHJlc3VsdCwgaTsKKworCS8qIEluaXRpYWxpemUgYWxsIGRyaXZlciBzbG90cyAqLworCWZvciAoaSA9IDA7IGkgPCBEVDk4MTJfTlVNX1NMT1RTOyBpKyspIHsKKwkJaW5pdF9NVVRFWCgmZHQ5ODEyW2ldLm11dGV4KTsKKwkJZHQ5ODEyW2ldLnNlcmlhbCA9IDA7CisJCWR0OTgxMltpXS51c2IgPSBOVUxMOworCQlkdDk4MTJbaV0uY29tZWRpID0gTlVMTDsKKwl9CisJZHQ5ODEyWzEyXS5zZXJpYWwgPSAweDA7CisKKwkvKiByZWdpc3RlciB3aXRoIHRoZSBVU0Igc3Vic3lzdGVtICovCisJcmVzdWx0ID0gdXNiX3JlZ2lzdGVyKCZkdDk4MTJfdXNiX2RyaXZlcik7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIgS0JVSUxEX01PRE5BTUUKKwkJICAgICAgICI6IHVzYl9yZWdpc3RlciBmYWlsZWQuIEVycm9yIG51bWJlciAlZFxuIiwgcmVzdWx0KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJLyogcmVnaXN0ZXIgd2l0aCBjb21lZGkgKi8KKwlyZXN1bHQgPSBjb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkdDk4MTJfY29tZWRpX2RyaXZlcik7CisJaWYgKHJlc3VsdCkgeworCQl1c2JfZGVyZWdpc3RlcigmZHQ5ODEyX3VzYl9kcml2ZXIpOworCQllcnIoImNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIgZmFpbGVkLiBFcnJvciBudW1iZXIgJWQiLCByZXN1bHQpOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1c2JfZHQ5ODEyX2V4aXQodm9pZCkKK3sKKwkvKiB1bnJlZ2lzdGVyIHdpdGggY29tZWRpICovCisJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCZkdDk4MTJfY29tZWRpX2RyaXZlcik7CisKKwkvKiBkZXJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIFVTQiBzdWJzeXN0ZW0gKi8KKwl1c2JfZGVyZWdpc3RlcigmZHQ5ODEyX3VzYl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh1c2JfZHQ5ODEyX2luaXQpOworbW9kdWxlX2V4aXQodXNiX2R0OTgxMl9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQW5kZXJzIEJsb21kZWxsIDxhbmRlcnMuYmxvbWRlbGxAY29udHJvbC5sdGguc2U+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBEVDk4MTIgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvaWNwX211bHRpLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvaWNwX211bHRpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkxNDRkNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9pY3BfbXVsdGkuYwpAQCAtMCwwICsxLDEwODUgQEAKKy8qCisgICAgY29tZWRpL2RyaXZlcnMvaWNwX211bHRpLmMKKworICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMiBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisvKgorRHJpdmVyOiBpY3BfbXVsdGkKK0Rlc2NyaXB0aW9uOiBJbm92YSBJQ1BfTVVMVEkKK0F1dGhvcjogQW5uZSBTbW9ydGhpdCA8YW5uZS5zbW9ydGhpdEBzZnd0ZS5jaD4KK0RldmljZXM6IFtJbm92YV0gSUNQX01VTFRJIChpY3BfbXVsdGkpCitTdGF0dXM6IHdvcmtzCisKK1RoZSBkcml2ZXIgd29ya3MgZm9yIGFuYWxvZyBpbnB1dCBhbmQgb3V0cHV0IGFuZCBkaWdpdGFsIGlucHV0IGFuZCBvdXRwdXQuCitJdCBkb2VzIG5vdCB3b3JrIHdpdGggaW50ZXJydXB0cyBvciB3aXRoIHRoZSBjb3VudGVycy4gIEN1cnJlbnRseSBubyBzdXBwb3J0Citmb3IgRE1BLgorCitJdCBoYXMgMTYgc2luZ2xlLWVuZGVkIG9yIDggZGlmZmVyZW50aWFsIEFuYWxvZ3VlIElucHV0IGNoYW5uZWxzIHdpdGggMTItYml0CityZXNvbHV0aW9uLiAgUmFuZ2VzIDogNVYsIDEwViwgKy8tNVYsICsvLTEwViwgMC4uMjBtQSBhbmQgNC4uMjBtQS4gIElucHV0CityYW5nZXMgY2FuIGJlIGluZGl2aWR1YWxseSBwcm9ncmFtbWVkIGZvciBlYWNoIGNoYW5uZWwuICBWb2x0YWdlIG9yIGN1cnJlbnQKK21lYXN1cmVtZW50IGlzIHNlbGVjdGVkIGJ5IGp1bXBlci4KKworVGhlcmUgYXJlIDQgeCAxMi1iaXQgQW5hbG9ndWUgT3V0cHV0cy4gIFJhbmdlcyA6IDVWLCAxMFYsICsvLTVWLCArLy0xMFYKKworMTYgeCBEaWdpdGFsIElucHV0cywgMjRWCisKKzggeCBEaWdpdGFsIE91dHB1dHMsIDI0ViwgMUEKKworNCB4IDE2LWJpdCBjb3VudGVycworCitPcHRpb25zOgorIFswXSAtIFBDSSBidXMgbnVtYmVyIC0gaWYgYnVzIG51bWJlciBhbmQgc2xvdCBudW1iZXIgYXJlIDAsCisgICAgICAgICAgICAgICAgICAgICAgICB0aGVuIGRyaXZlciBzZWFyY2ggZm9yIGZpcnN0IHVudXNlZCBjYXJkCisgWzFdIC0gUENJIHNsb3QgbnVtYmVyCisqLworCisjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSAiaWNwX211bHRpLmgiCisKKyNkZWZpbmUgREVWSUNFX0lECTB4ODAwMAkvKiBEZXZpY2UgSUQgKi8KKworI2RlZmluZSBJQ1BfTVVMVElfRVhUREVCVUcKKworLy8gSGFyZHdhcmUgdHlwZXMgb2YgdGhlIGNhcmRzCisjZGVmaW5lIFRZUEVfSUNQX01VTFRJCTAKKworI2RlZmluZSBJT1JBTkdFX0lDUF9NVUxUSSAJMzIKKworI2RlZmluZSBJQ1BfTVVMVElfQURDX0NTUgkwCS8qIFIvVzogQURDIGNvbW1hbmQvc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIElDUF9NVUxUSV9BSQkJMgkvKiBSOiAgIEFuYWxvZ3VlIGlucHV0IGRhdGEgKi8KKyNkZWZpbmUgSUNQX01VTFRJX0RBQ19DU1IJNAkvKiBSL1c6IERBQyBjb21tYW5kL3N0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBJQ1BfTVVMVElfQU8JCTYJLyogUi9XOiBBbmFsb2d1ZSBvdXRwdXQgZGF0YSAqLworI2RlZmluZSBJQ1BfTVVMVElfREkJCTgJLyogUi9XOiBEaWdpdGFsIGlub3V0cyAqLworI2RlZmluZSBJQ1BfTVVMVElfRE8JCTB4MEEJLyogUi9XOiBEaWdpdGFsIG91dHB1dHMgKi8KKyNkZWZpbmUgSUNQX01VTFRJX0lOVF9FTgkweDBDCS8qIFIvVzogSW50ZXJydXB0IGVuYWJsZSByZWdpc3RlciAqLworI2RlZmluZSBJQ1BfTVVMVElfSU5UX1NUQVQJMHgwRQkvKiBSL1c6IEludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgSUNQX01VTFRJX0NOVFIwCQkweDEwCS8qIFIvVzogQ291bnRlciAwICovCisjZGVmaW5lIElDUF9NVUxUSV9DTlRSMQkJMHgxMgkvKiBSL1c6IGNvdW50ZXIgMSAqLworI2RlZmluZSBJQ1BfTVVMVElfQ05UUjIJCTB4MTQJLyogUi9XOiBDb3VudGVyIDIgKi8KKyNkZWZpbmUgSUNQX01VTFRJX0NOVFIzCQkweDE2CS8qIFIvVzogQ291bnRlciAzICovCisKKyNkZWZpbmUgSUNQX01VTFRJX1NJWkUJCTB4MjAJLyogMzIgYnl0ZXMgKi8KKworLy8gRGVmaW5lIGJpdHMgZnJvbSBBREMgY29tbWFuZC9zdGF0dXMgcmVnaXN0ZXIKKyNkZWZpbmUJQURDX1NUCQkweDAwMDEJLyogU3RhcnQgQURDICovCisjZGVmaW5lCUFEQ19CU1kJCTB4MDAwMQkvKiBBREMgYnVzeSAqLworI2RlZmluZSBBRENfQkkJCTB4MDAxMAkvKiBCaXBvbGFyIGlucHV0IHJhbmdlIDEgPSBiaXBvbGFyICovCisjZGVmaW5lIEFEQ19SQQkJMHgwMDIwCS8qIElucHV0IHJhbmdlIDAgPSA1ViwgMSA9IDEwViAqLworI2RlZmluZQlBRENfREkJCTB4MDA0MAkvKiBEaWZmZXJlbnRpYWwgaW5wdXQgbW9kZSAxID0gZGlmZmVyZW50aWFsICovCisKKy8vIERlZmluZSBiaXRzIGZyb20gREFDIGNvbW1hbmQvc3RhdHVzIHJlZ2lzdGVyCisjZGVmaW5lCURBQ19TVAkJMHgwMDAxCS8qIFN0YXJ0IERBQyAqLworI2RlZmluZSBEQUNfQlNZCQkweDAwMDEJLyogREFDIGJ1c3kgKi8KKyNkZWZpbmUJREFDX0JJCQkweDAwMTAJLyogQmlwb2xhciBpbnB1dCByYW5nZSAxID0gYmlwb2xhciAqLworI2RlZmluZQlEQUNfUkEJCTB4MDAyMAkvKiBJbnB1dCByYW5nZSAwID0gNVYsIDEgPSAxMFYgKi8KKworLy8gRGVmaW5lIGJpdHMgZnJvbSBpbnRlcnJ1cHQgZW5hYmxlL3N0YXR1cyByZWdpc3RlcnMKKyNkZWZpbmUJQURDX1JFQURZCTB4MDAwMQkvKiBBL2QgY29udmVyc2lvbiByZWFkeSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUJREFDX1JFQURZCTB4MDAwMgkvKiBEL2EgY29udmVyc2lvbiByZWFkeSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUJRE9VVF9FUlJPUgkweDAwMDQJLyogRGlnaXRhbCBvdXRwdXQgZXJyb3IgaW50ZXJydXB0ICovCisjZGVmaW5lCURJTl9TVEFUVVMJMHgwMDA4CS8qIERpZ2l0YWwgaW5wdXQgc3RhdHVzIGNoYW5nZSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUJQ0lFMAkJMHgwMDEwCS8qIENvdW50ZXIgMCBvdmVycnVuIGludGVycnVwdCAqLworI2RlZmluZQlDSUUxCQkweDAwMjAJLyogQ291bnRlciAxIG92ZXJydW4gaW50ZXJydXB0ICovCisjZGVmaW5lCUNJRTIJCTB4MDA0MAkvKiBDb3VudGVyIDIgb3ZlcnJ1biBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUJQ0lFMwkJMHgwMDgwCS8qIENvdW50ZXIgMyBvdmVycnVuIGludGVycnVwdCAqLworCisvLyBVc2VmdWwgZGVmaW5pdGlvbnMKKyNkZWZpbmUJU3RhdHVzX0lSUQkweDAwZmYJLy8gQWxsIGludGVycnVwdHMKKworLy8gRGVmaW5lIGFuYWxvZ3VlIHJhbmdlCitzdGF0aWMgY29uc3QgY29tZWRpX2xyYW5nZSByYW5nZV9hbmFsb2cgPSB7IDQsIHsKKwkJCVVOSV9SQU5HRSg1KSwKKwkJCVVOSV9SQU5HRSgxMCksCisJCQlCSVBfUkFOR0UoNSksCisJCQlCSVBfUkFOR0UoMTApCisJfQorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgcmFuZ2VfY29kZXNfYW5hbG9nW10gPSB7IDB4MDAsIDB4MjAsIDB4MTAsIDB4MzAgfTsKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCUZvcndhcmQgZGVjbGFyYXRpb25zCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgaW50IGljcF9tdWx0aV9hdHRhY2goY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX2RldmNvbmZpZyAqIGl0KTsKK3N0YXRpYyBpbnQgaWNwX211bHRpX2RldGFjaChjb21lZGlfZGV2aWNlICogZGV2KTsKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURhdGEgJiBTdHJ1Y3R1cmUgZGVjbGFyYXRpb25zCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcGNpX2xpc3RfYnVpbGRlZCA9IDA7CS8qPjAgbGlzdCBvZiBjYXJkIGlzIGtub3duICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwljb25zdCBjaGFyICpuYW1lOwkvLyBkcml2ZXIgbmFtZQorCWludCBkZXZpY2VfaWQ7CisJaW50IGlvcmFuZ2U7CQkvLyBJL08gcmFuZ2UgbGVuCisJY2hhciBoYXZlX2lycTsJCS8vIDE9Y2FyZCBzdXBwb3J0IElSUQorCWNoYXIgY2FyZHR5cGU7CQkvLyAwPUlDUCBNdWx0aQorCWludCBuX2FpY2hhbjsJCS8vIG51bSBvZiBBL0QgY2hhbnMKKwlpbnQgbl9haWNoYW5kOwkJLy8gbnVtIG9mIEEvRCBjaGFucyBpbiBkaWZmIG1vZGUKKwlpbnQgbl9hb2NoYW47CQkvLyBudW0gb2YgRC9BIGNoYW5zCisJaW50IG5fZGljaGFuOwkJLy8gbnVtIG9mIERJIGNoYW5zCisJaW50IG5fZG9jaGFuOwkJLy8gbnVtIG9mIERPIGNoYW5zCisJaW50IG5fY3RyczsJCS8vIG51bSBvZiBjb3VudGVycworCWludCBhaV9tYXhkYXRhOwkJLy8gcmVzb2x1dGlvbiBvZiBBL0QKKwlpbnQgYW9fbWF4ZGF0YTsJCS8vIHJlc29sdXRpb24gb2YgRC9BCisJY29uc3QgY29tZWRpX2xyYW5nZSAqcmFuZ2VsaXN0X2FpOwkvLyByYW5nZWxpc3QgZm9yIEEvRAorCWNvbnN0IGNoYXIgKnJhbmdlY29kZTsJLy8gcmFuZ2UgY29kZXMgZm9yIHByb2dyYW1taW5nCisJY29uc3QgY29tZWRpX2xyYW5nZSAqcmFuZ2VsaXN0X2FvOwkvLyByYW5nZWxpc3QgZm9yIEQvQQorfSBib2FyZHR5cGU7CisKK3N0YXRpYyBjb25zdCBib2FyZHR5cGUgYm9hcmR0eXBlc1tdID0geworCXsiaWNwX211bHRpIiwJCS8vIERyaXZlciBuYW1lCisJCQlERVZJQ0VfSUQsCS8vIFBDSSBkZXZpY2UgSUQKKwkJCUlPUkFOR0VfSUNQX01VTFRJLAkvLyBJL08gcmFuZ2UgbGVuZ3RoCisJCQkxLAkvLyAxPUNhcmQgc3VwcG9ydHMgaW50ZXJydXB0cworCQkJVFlQRV9JQ1BfTVVMVEksCS8vIENhcmQgdHlwZSA9IElDUCBNVUxUSQorCQkJMTYsCS8vIE51bSBvZiBBL0QgY2hhbm5lbHMKKwkJCTgsCS8vIE51bSBvZiBBL0QgY2hhbm5lbHMgaW4gZGlmZiBtb2RlCisJCQk0LAkvLyBOdW0gb2YgRC9BIGNoYW5uZWxzCisJCQkxNiwJLy8gTnVtIG9mIGRpZ2l0YWwgaW5wdXRzCisJCQk4LAkvLyBOdW0gb2YgZGlnaXRhbCBvdXRwdXRzCisJCQk0LAkvLyBOdW0gb2YgY291bnRlcnMKKwkJCTB4MGZmZiwJLy8gUmVzb2x1dGlvbiBvZiBBL0QKKwkJCTB4MGZmZiwJLy8gUmVzb2x1dGlvbiBvZiBEL0EKKwkJCSZyYW5nZV9hbmFsb2csCS8vIFJhbmdlbGlzdCBmb3IgQS9ECisJCQlyYW5nZV9jb2Rlc19hbmFsb2csCS8vIFJhbmdlIGNvZGVzIGZvciBwcm9ncmFtbWluZworCQkmcmFuZ2VfYW5hbG9nfSwJLy8gUmFuZ2VsaXN0IGZvciBEL0EKK307CisKKyNkZWZpbmUgbl9ib2FyZHR5cGVzIChzaXplb2YoYm9hcmR0eXBlcykvc2l6ZW9mKGJvYXJkdHlwZSkpCisKK3N0YXRpYyBjb21lZGlfZHJpdmVyIGRyaXZlcl9pY3BfbXVsdGkgPSB7CisgICAgICBkcml2ZXJfbmFtZToiaWNwX211bHRpIiwKKyAgICAgIG1vZHVsZTpUSElTX01PRFVMRSwKKyAgICAgIGF0dGFjaDppY3BfbXVsdGlfYXR0YWNoLAorICAgICAgZGV0YWNoOmljcF9tdWx0aV9kZXRhY2gsCisgICAgICBudW1fbmFtZXM6bl9ib2FyZHR5cGVzLAorICAgICAgYm9hcmRfbmFtZTomYm9hcmR0eXBlc1swXS5uYW1lLAorICAgICAgb2Zmc2V0OnNpemVvZihib2FyZHR5cGUpLAorfTsKKworQ09NRURJX0lOSVRDTEVBTlVQKGRyaXZlcl9pY3BfbXVsdGkpOworCit0eXBlZGVmIHN0cnVjdCB7CisJc3RydWN0IHBjaWxzdF9zdHJ1Y3QgKmNhcmQ7CS8vIHBvaW50ZXIgdG8gY2FyZAorCWNoYXIgdmFsaWQ7CQkvLyBjYXJkIGlzIHVzYWJsZQorCXZvaWQgKmlvX2FkZHI7CQkvLyBQb2ludGVyIHRvIG1hcHBlZCBpbyBhZGRyZXNzCisJcmVzb3VyY2Vfc2l6ZV90IHBoeXNfaW9iYXNlOwkvLyBQaHlzaWNhbCBpbyBhZGRyZXNzCisJdW5zaWduZWQgaW50IEFkY0NtZFN0YXR1czsJLy8gQURDIENvbW1hbmQvU3RhdHVzIHJlZ2lzdGVyCisJdW5zaWduZWQgaW50IERhY0NtZFN0YXR1czsJLy8gREFDIENvbW1hbmQvU3RhdHVzIHJlZ2lzdGVyCisJdW5zaWduZWQgaW50IEludEVuYWJsZTsJLy8gSW50ZXJydXB0IEVuYWJsZSByZWdpc3RlcgorCXVuc2lnbmVkIGludCBJbnRTdGF0dXM7CS8vIEludGVycnVwdCBTdGF0dXMgcmVnaXN0ZXIKKwl1bnNpZ25lZCBpbnQgYWN0X2NoYW5saXN0WzMyXTsJLy8gbGlzdCBvZiBzY2FuZWQgY2hhbm5lbAorCXVuc2lnbmVkIGNoYXIgYWN0X2NoYW5saXN0X2xlbjsJLy8gbGVuIG9mIHNjYW5saXN0CisJdW5zaWduZWQgY2hhciBhY3RfY2hhbmxpc3RfcG9zOwkvLyBhY3R1YWwgcG9zaXRpb24gaW4gTVVYIGxpc3QKKwl1bnNpZ25lZCBpbnQgKmFpX2NoYW5saXN0OwkvLyBhY3RhdWwgY2hhbmxpc3QKKwlzYW1wbF90ICphaV9kYXRhOwkvLyBkYXRhIGJ1ZmZlcgorCXNhbXBsX3QgYW9fZGF0YVs0XTsJLy8gZGF0YSBvdXRwdXQgYnVmZmVyCisJc2FtcGxfdCBkaV9kYXRhOwkvLyBEaWdpdGFsIGlucHV0IGRhdGEKKwl1bnNpZ25lZCBpbnQgZG9fZGF0YTsJLy8gUmVtZW1iZXIgZGlnaXRhbCBvdXRwdXQgZGF0YQorfSBpY3BfbXVsdGlfcHJpdmF0ZTsKKworI2RlZmluZSBkZXZwcml2ICgoaWNwX211bHRpX3ByaXZhdGUgKilkZXYtPnByaXZhdGUpCisjZGVmaW5lIHRoaXNfYm9hcmQgKChjb25zdCBib2FyZHR5cGUgKilkZXYtPmJvYXJkX3B0cikKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCU1vcmUgZm9yd2FyZCBkZWNsYXJhdGlvbnMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworI2lmIDAKK3N0YXRpYyBpbnQgY2hlY2tfY2hhbm5lbF9saXN0KGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCXVuc2lnbmVkIGludCAqY2hhbmxpc3QsIHVuc2lnbmVkIGludCBuX2NoYW4pOworI2VuZGlmCitzdGF0aWMgdm9pZCBzZXR1cF9jaGFubmVsX2xpc3QoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJdW5zaWduZWQgaW50ICpjaGFubGlzdCwgdW5zaWduZWQgaW50IG5fY2hhbik7CitzdGF0aWMgaW50IGljcF9tdWx0aV9yZXNldChjb21lZGlfZGV2aWNlICogZGV2KTsKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCUZ1bmN0aW9ucworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlOYW1lOglpY3BfbXVsdGlfaW5zbl9yZWFkX2FpCisKKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyBmdW5jdGlvbiByZWFkcyBhIHNpbmdsZSBhbmFsb2d1ZSBpbnB1dC4KKworCVBhcmFtZXRlcnM6CisJCWNvbWVkaV9kZXZpY2UgKmRldglQb2ludGVyIHRvIGN1cnJlbnQgZGV2aWNlIHN0cnVjdHVyZQorCQljb21lZGlfc3ViZGV2aWNlICpzCVBvaW50ZXIgdG8gY3VycmVudCBzdWJkZXZpY2Ugc3RydWN0dXJlCisJCWNvbWVkaV9pbnNuICppbnNuCVBvaW50ZXIgdG8gY3VycmVudCBjb21lZGkgaW5zdHJ1Y3Rpb24KKwkJbHNhbXBsX3QgKmRhdGEJCVBvaW50ZXIgdG8gYW5hbG9ndWUgaW5wdXQgZGF0YQorCisJUmV0dXJuczppbnQJCQlObXViZXIgb2YgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBpbnQgaWNwX211bHRpX2luc25fcmVhZF9haShjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKwlpbnQgbiwgdGltZW91dDsKKworI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRworCXByaW50aygiaWNwIG11bHRpIEVEQkc6IEJHTjogaWNwX211bHRpX2luc25fcmVhZF9haSguLi4pXG4iKTsKKyNlbmRpZgorCS8vIERpc2FibGUgQS9EIGNvbnZlcnNpb24gcmVhZHkgaW50ZXJydXB0CisJZGV2cHJpdi0+SW50RW5hYmxlICY9IH5BRENfUkVBRFk7CisJd3JpdGV3KGRldnByaXYtPkludEVuYWJsZSwgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9JTlRfRU4pOworCisJLy8gQ2xlYXIgaW50ZXJydXB0IHN0YXR1cworCWRldnByaXYtPkludFN0YXR1cyB8PSBBRENfUkVBRFk7CisJd3JpdGV3KGRldnByaXYtPkludFN0YXR1cywgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9JTlRfU1RBVCk7CisKKwkvLyBTZXQgdXAgYXBwcm9wcmlhdGUgY2hhbm5lbCwgbW9kZSBhbmQgcmFuZ2UgZGF0YSwgZm9yIHNwZWNpZmllZCBjaGFubmVsCisJc2V0dXBfY2hhbm5lbF9saXN0KGRldiwgcywgJmluc24tPmNoYW5zcGVjLCAxKTsKKworI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRworCXByaW50aygiaWNwX211bHRpIEEgU1Q9JTR4IElPPSVwXG4iLAorCQlyZWFkdyhkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0FEQ19DU1IpLAorCQlkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0FEQ19DU1IpOworI2VuZGlmCisKKwlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKSB7CisJCS8vIFNldCBzdGFydCBBREMgYml0CisJCWRldnByaXYtPkFkY0NtZFN0YXR1cyB8PSBBRENfU1Q7CisJCXdyaXRldyhkZXZwcml2LT5BZGNDbWRTdGF0dXMsCisJCQlkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0FEQ19DU1IpOworCQlkZXZwcml2LT5BZGNDbWRTdGF0dXMgJj0gfkFEQ19TVDsKKworI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRworCQlwcmludGsoImljcCBtdWx0aSBCIG49JWQgU1Q9JTR4XG4iLCBuLAorCQkJcmVhZHcoZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9BRENfQ1NSKSk7CisjZW5kaWYKKworCQljb21lZGlfdWRlbGF5KDEpOworCisjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCisJCXByaW50aygiaWNwIG11bHRpIEMgbj0lZCBTVD0lNHhcbiIsIG4sCisJCQlyZWFkdyhkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0FEQ19DU1IpKTsKKyNlbmRpZgorCisJCS8vIFdhaXQgZm9yIGNvbnZlcnNpb24gdG8gY29tcGxldGUsIG9yIGdldCBmZWQgdXAgd2FpdGluZworCQl0aW1lb3V0ID0gMTAwOworCQl3aGlsZSAodGltZW91dC0tKSB7CisJCQlpZiAoIShyZWFkdyhkZXZwcml2LT5pb19hZGRyICsKKwkJCQkJCUlDUF9NVUxUSV9BRENfQ1NSKSAmIEFEQ19CU1kpKQorCQkJCWdvdG8gY29udl9maW5pc2g7CisKKyNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKKwkJCWlmICghKHRpbWVvdXQgJSAxMCkpCisJCQkJcHJpbnRrKCJpY3AgbXVsdGkgRCBuPSVkIHRtPSVkIFNUPSU0eFxuIiwgbiwKKwkJCQkJdGltZW91dCwKKwkJCQkJcmVhZHcoZGV2cHJpdi0+aW9fYWRkciArCisJCQkJCQlJQ1BfTVVMVElfQURDX0NTUikpOworI2VuZGlmCisKKwkJCWNvbWVkaV91ZGVsYXkoMSk7CisJCX0KKworCQkvLyBJZiB3ZSByZWFjaCBoZXJlLCBhIHRpbWVvdXQgaGFzIG9jY3VycmVkCisJCWNvbWVkaV9lcnJvcihkZXYsICJBL0QgaW5zbiB0aW1lb3V0Iik7CisKKwkJLy8gRGlzYWJsZSBpbnRlcnJ1cHQKKwkJZGV2cHJpdi0+SW50RW5hYmxlICY9IH5BRENfUkVBRFk7CisJCXdyaXRldyhkZXZwcml2LT5JbnRFbmFibGUsIGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfSU5UX0VOKTsKKworCQkvLyBDbGVhciBpbnRlcnJ1cHQgc3RhdHVzCisJCWRldnByaXYtPkludFN0YXR1cyB8PSBBRENfUkVBRFk7CisJCXdyaXRldyhkZXZwcml2LT5JbnRTdGF0dXMsCisJCQlkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0lOVF9TVEFUKTsKKworCQkvLyBDbGVhciBkYXRhIHJlY2VpdmVkCisJCWRhdGFbbl0gPSAwOworCisjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCisJCXByaW50aygiaWNwIG11bHRpIEVEQkc6IEVORDogaWNwX211bHRpX2luc25fcmVhZF9haSguLi4pIG49JWRcbiIsIG4pOworI2VuZGlmCisJCXJldHVybiAtRVRJTUU7CisKKwkgICAgICBjb252X2ZpbmlzaDoKKwkJZGF0YVtuXSA9CisJCQkocmVhZHcoZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9BSSkgPj4gNCkgJiAweDBmZmY7CisJfQorCisJLy8gRGlzYWJsZSBpbnRlcnJ1cHQKKwlkZXZwcml2LT5JbnRFbmFibGUgJj0gfkFEQ19SRUFEWTsKKwl3cml0ZXcoZGV2cHJpdi0+SW50RW5hYmxlLCBkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0lOVF9FTik7CisKKwkvLyBDbGVhciBpbnRlcnJ1cHQgc3RhdHVzCisJZGV2cHJpdi0+SW50U3RhdHVzIHw9IEFEQ19SRUFEWTsKKwl3cml0ZXcoZGV2cHJpdi0+SW50U3RhdHVzLCBkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0lOVF9TVEFUKTsKKworI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRworCXByaW50aygiaWNwIG11bHRpIEVEQkc6IEVORDogaWNwX211bHRpX2luc25fcmVhZF9haSguLi4pIG49JWRcbiIsIG4pOworI2VuZGlmCisJcmV0dXJuIG47Cit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCU5hbWU6CWljcF9tdWx0aV9pbnNuX3dyaXRlX2FvCisKKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyBmdW5jdGlvbiB3cml0ZXMgYSBzaW5nbGUgYW5hbG9ndWUgb3V0cHV0LgorCisJUGFyYW1ldGVyczoKKwkJY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2Ugc3RydWN0dXJlCisJCWNvbWVkaV9zdWJkZXZpY2UgKnMJUG9pbnRlciB0byBjdXJyZW50IHN1YmRldmljZSBzdHJ1Y3R1cmUKKwkJY29tZWRpX2luc24gKmluc24JUG9pbnRlciB0byBjdXJyZW50IGNvbWVkaSBpbnN0cnVjdGlvbgorCQlsc2FtcGxfdCAqZGF0YQkJUG9pbnRlciB0byBhbmFsb2d1ZSBvdXRwdXQgZGF0YQorCisJUmV0dXJuczppbnQJCQlObXViZXIgb2YgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBpbnQgaWNwX211bHRpX2luc25fd3JpdGVfYW8oY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisJaW50IG4sIGNoYW4sIHJhbmdlLCB0aW1lb3V0OworCisjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCisJcHJpbnRrKCJpY3AgbXVsdGkgRURCRzogQkdOOiBpY3BfbXVsdGlfaW5zbl93cml0ZV9hbyguLi4pXG4iKTsKKyNlbmRpZgorCS8vIERpc2FibGUgRC9BIGNvbnZlcnNpb24gcmVhZHkgaW50ZXJydXB0CisJZGV2cHJpdi0+SW50RW5hYmxlICY9IH5EQUNfUkVBRFk7CisJd3JpdGV3KGRldnByaXYtPkludEVuYWJsZSwgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9JTlRfRU4pOworCisJLy8gQ2xlYXIgaW50ZXJydXB0IHN0YXR1cworCWRldnByaXYtPkludFN0YXR1cyB8PSBEQUNfUkVBRFk7CisJd3JpdGV3KGRldnByaXYtPkludFN0YXR1cywgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9JTlRfU1RBVCk7CisKKwkvLyBHZXQgY2hhbm5lbCBudW1iZXIgYW5kIHJhbmdlCisJY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCXJhbmdlID0gQ1JfUkFOR0UoaW5zbi0+Y2hhbnNwZWMpOworCisJLy8gU2V0IHVwIHJhbmdlIGFuZCBjaGFubmVsIGRhdGEKKwkvLyBCaXQgNCA9IDEgOiBCaXBvbGFyCisJLy8gQml0IDUgPSAwIDogNVYKKwkvLyBCaXQgNSA9IDEgOiAxMFYKKwkvLyBCaXRzIDgtOSA6IENoYW5uZWwgbnVtYmVyCisJZGV2cHJpdi0+RGFjQ21kU3RhdHVzICY9IDB4ZmNjZjsKKwlkZXZwcml2LT5EYWNDbWRTdGF0dXMgfD0gdGhpc19ib2FyZC0+cmFuZ2Vjb2RlW3JhbmdlXTsKKwlkZXZwcml2LT5EYWNDbWRTdGF0dXMgfD0gKGNoYW4gPDwgOCk7CisKKwl3cml0ZXcoZGV2cHJpdi0+RGFjQ21kU3RhdHVzLCBkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0RBQ19DU1IpOworCisJZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykgeworCQkvLyBXYWl0IGZvciBhbmFsb2d1ZSBvdXRwdXQgZGF0YSByZWdpc3RlciB0byBiZSByZWFkeSBmb3IgbmV3IGRhdGEsIG9yIGdldCBmZWQgdXAgd2FpdGluZworCQl0aW1lb3V0ID0gMTAwOworCQl3aGlsZSAodGltZW91dC0tKSB7CisJCQlpZiAoIShyZWFkdyhkZXZwcml2LT5pb19hZGRyICsKKwkJCQkJCUlDUF9NVUxUSV9EQUNfQ1NSKSAmIERBQ19CU1kpKQorCQkJCWdvdG8gZGFjX3JlYWR5OworCisjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCisJCQlpZiAoISh0aW1lb3V0ICUgMTApKQorCQkJCXByaW50aygiaWNwIG11bHRpIEEgbj0lZCB0bT0lZCBTVD0lNHhcbiIsIG4sCisJCQkJCXRpbWVvdXQsCisJCQkJCXJlYWR3KGRldnByaXYtPmlvX2FkZHIgKworCQkJCQkJSUNQX01VTFRJX0RBQ19DU1IpKTsKKyNlbmRpZgorCisJCQljb21lZGlfdWRlbGF5KDEpOworCQl9CisKKwkJLy8gSWYgd2UgcmVhY2ggaGVyZSwgYSB0aW1lb3V0IGhhcyBvY2N1cnJlZAorCQljb21lZGlfZXJyb3IoZGV2LCAiRC9BIGluc24gdGltZW91dCIpOworCisJCS8vIERpc2FibGUgaW50ZXJydXB0CisJCWRldnByaXYtPkludEVuYWJsZSAmPSB+REFDX1JFQURZOworCQl3cml0ZXcoZGV2cHJpdi0+SW50RW5hYmxlLCBkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0lOVF9FTik7CisKKwkJLy8gQ2xlYXIgaW50ZXJydXB0IHN0YXR1cworCQlkZXZwcml2LT5JbnRTdGF0dXMgfD0gREFDX1JFQURZOworCQl3cml0ZXcoZGV2cHJpdi0+SW50U3RhdHVzLAorCQkJZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9JTlRfU1RBVCk7CisKKwkJLy8gQ2xlYXIgZGF0YSByZWNlaXZlZAorCQlkZXZwcml2LT5hb19kYXRhW2NoYW5dID0gMDsKKworI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRworCQlwcmludGsoImljcCBtdWx0aSBFREJHOiBFTkQ6IGljcF9tdWx0aV9pbnNuX3dyaXRlX2FvKC4uLikgbj0lZFxuIiwgbik7CisjZW5kaWYKKwkJcmV0dXJuIC1FVElNRTsKKworCSAgICAgIGRhY19yZWFkeToKKwkJLy8gV3JpdGUgZGF0YSB0byBhbmFsb2d1ZSBvdXRwdXQgZGF0YSByZWdpc3RlcgorCQl3cml0ZXcoZGF0YVtuXSwgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9BTyk7CisKKwkJLy8gU2V0IERBQ19TVCBiaXQgdG8gd3JpdGUgdGhlIGRhdGEgdG8gc2VsZWN0ZWQgY2hhbm5lbAorCQlkZXZwcml2LT5EYWNDbWRTdGF0dXMgfD0gREFDX1NUOworCQl3cml0ZXcoZGV2cHJpdi0+RGFjQ21kU3RhdHVzLAorCQkJZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9EQUNfQ1NSKTsKKwkJZGV2cHJpdi0+RGFjQ21kU3RhdHVzICY9IH5EQUNfU1Q7CisKKwkJLy8gU2F2ZSBhbmFsb2d1ZSBvdXRwdXQgZGF0YQorCQlkZXZwcml2LT5hb19kYXRhW2NoYW5dID0gZGF0YVtuXTsKKwl9CisKKyNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKKwlwcmludGsoImljcCBtdWx0aSBFREJHOiBFTkQ6IGljcF9tdWx0aV9pbnNuX3dyaXRlX2FvKC4uLikgbj0lZFxuIiwgbik7CisjZW5kaWYKKwlyZXR1cm4gbjsKK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJTmFtZToJaWNwX211bHRpX2luc25fcmVhZF9hbworCisJRGVzY3JpcHRpb246CisJCVRoaXMgZnVuY3Rpb24gcmVhZHMgYSBzaW5nbGUgYW5hbG9ndWUgb3V0cHV0LgorCisJUGFyYW1ldGVyczoKKwkJY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2Ugc3RydWN0dXJlCisJCWNvbWVkaV9zdWJkZXZpY2UgKnMJUG9pbnRlciB0byBjdXJyZW50IHN1YmRldmljZSBzdHJ1Y3R1cmUKKwkJY29tZWRpX2luc24gKmluc24JUG9pbnRlciB0byBjdXJyZW50IGNvbWVkaSBpbnN0cnVjdGlvbgorCQlsc2FtcGxfdCAqZGF0YQkJUG9pbnRlciB0byBhbmFsb2d1ZSBvdXRwdXQgZGF0YQorCisJUmV0dXJuczppbnQJCQlObXViZXIgb2YgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBpbnQgaWNwX211bHRpX2luc25fcmVhZF9hbyhjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKwlpbnQgbiwgY2hhbjsKKworCS8vIEdldCBjaGFubmVsIG51bWJlcgorCWNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKworCS8vIFJlYWQgYW5hbG9ndWUgb3V0cHV0cworCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspCisJCWRhdGFbbl0gPSBkZXZwcml2LT5hb19kYXRhW2NoYW5dOworCisJcmV0dXJuIG47Cit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCU5hbWU6CWljcF9tdWx0aV9pbnNuX2JpdHNfZGkKKworCURlc2NyaXB0aW9uOgorCQlUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBkaWdpdGFsIGlucHV0cy4KKworCVBhcmFtZXRlcnM6CisJCWNvbWVkaV9kZXZpY2UgKmRldglQb2ludGVyIHRvIGN1cnJlbnQgZGV2aWNlIHN0cnVjdHVyZQorCQljb21lZGlfc3ViZGV2aWNlICpzCVBvaW50ZXIgdG8gY3VycmVudCBzdWJkZXZpY2Ugc3RydWN0dXJlCisJCWNvbWVkaV9pbnNuICppbnNuCVBvaW50ZXIgdG8gY3VycmVudCBjb21lZGkgaW5zdHJ1Y3Rpb24KKwkJbHNhbXBsX3QgKmRhdGEJCVBvaW50ZXIgdG8gYW5hbG9ndWUgb3V0cHV0IGRhdGEKKworCVJldHVybnM6aW50CQkJTm11YmVyIG9mIGluc3RydWN0aW9ucyBleGVjdXRlZAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgaW50IGljcF9tdWx0aV9pbnNuX2JpdHNfZGkoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisJZGF0YVsxXSA9IHJlYWR3KGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfREkpOworCisJcmV0dXJuIDI7Cit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCU5hbWU6CWljcF9tdWx0aV9pbnNuX2JpdHNfZG8KKworCURlc2NyaXB0aW9uOgorCQlUaGlzIGZ1bmN0aW9uIHdyaXRlcyB0aGUgYXBwcm9wcmlhdGUgZGlnaXRhbCBvdXRwdXRzLgorCisJUGFyYW1ldGVyczoKKwkJY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2Ugc3RydWN0dXJlCisJCWNvbWVkaV9zdWJkZXZpY2UgKnMJUG9pbnRlciB0byBjdXJyZW50IHN1YmRldmljZSBzdHJ1Y3R1cmUKKwkJY29tZWRpX2luc24gKmluc24JUG9pbnRlciB0byBjdXJyZW50IGNvbWVkaSBpbnN0cnVjdGlvbgorCQlsc2FtcGxfdCAqZGF0YQkJUG9pbnRlciB0byBhbmFsb2d1ZSBvdXRwdXQgZGF0YQorCisJUmV0dXJuczppbnQJCQlObXViZXIgb2YgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBpbnQgaWNwX211bHRpX2luc25fYml0c19kbyhjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKyNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKKwlwcmludGsoImljcCBtdWx0aSBFREJHOiBCR046IGljcF9tdWx0aV9pbnNuX2JpdHNfZG8oLi4uKVxuIik7CisjZW5kaWYKKworCWlmIChkYXRhWzBdKSB7CisJCXMtPnN0YXRlICY9IH5kYXRhWzBdOworCQlzLT5zdGF0ZSB8PSAoZGF0YVswXSAmIGRhdGFbMV0pOworCisJCXByaW50aygiRGlnaXRhbCBvdXRwdXRzID0gJTR4IFxuIiwgcy0+c3RhdGUpOworCisJCXdyaXRldyhzLT5zdGF0ZSwgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9ETyk7CisJfQorCisJZGF0YVsxXSA9IHJlYWR3KGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfREkpOworCisjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCisJcHJpbnRrKCJpY3AgbXVsdGkgRURCRzogRU5EOiBpY3BfbXVsdGlfaW5zbl9iaXRzX2RvKC4uLilcbiIpOworI2VuZGlmCisJcmV0dXJuIDI7Cit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCU5hbWU6CWljcF9tdWx0aV9pbnNuX3JlYWRfY3RyCisKKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgc3BlY2lmaWVkIGNvdW50ZXIuCisKKwlQYXJhbWV0ZXJzOgorCQljb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IGRldmljZSBzdHJ1Y3R1cmUKKwkJY29tZWRpX3N1YmRldmljZSAqcwlQb2ludGVyIHRvIGN1cnJlbnQgc3ViZGV2aWNlIHN0cnVjdHVyZQorCQljb21lZGlfaW5zbiAqaW5zbglQb2ludGVyIHRvIGN1cnJlbnQgY29tZWRpIGluc3RydWN0aW9uCisJCWxzYW1wbF90ICpkYXRhCQlQb2ludGVyIHRvIGNvdW50ZXIgZGF0YQorCisJUmV0dXJuczppbnQJCQlObXViZXIgb2YgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBpbnQgaWNwX211bHRpX2luc25fcmVhZF9jdHIoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCU5hbWU6CWljcF9tdWx0aV9pbnNuX3dyaXRlX2N0cgorCisJRGVzY3JpcHRpb246CisJCVRoaXMgZnVuY3Rpb24gd3JpdGUgdG8gdGhlIHNwZWNpZmllZCBjb3VudGVyLgorCisJUGFyYW1ldGVyczoKKwkJY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2Ugc3RydWN0dXJlCisJCWNvbWVkaV9zdWJkZXZpY2UgKnMJUG9pbnRlciB0byBjdXJyZW50IHN1YmRldmljZSBzdHJ1Y3R1cmUKKwkJY29tZWRpX2luc24gKmluc24JUG9pbnRlciB0byBjdXJyZW50IGNvbWVkaSBpbnN0cnVjdGlvbgorCQlsc2FtcGxfdCAqZGF0YQkJUG9pbnRlciB0byBjb3VudGVyIGRhdGEKKworCVJldHVybnM6aW50CQkJTm11YmVyIG9mIGluc3RydWN0aW9ucyBleGVjdXRlZAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgaW50IGljcF9tdWx0aV9pbnNuX3dyaXRlX2N0cihjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJTmFtZToJaW50ZXJydXB0X3NlcnZpY2VfaWNwX211bHRpCisKKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyBmdW5jdGlvbiBpcyB0aGUgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBmb3IgYWxsCisJCWludGVycnVwdHMgZ2VuZXJhdGVkIGJ5IHRoZSBpY3AgbXVsdGkgYm9hcmQuCisKKwlQYXJhbWV0ZXJzOgorCQlpbnQgaXJxCisJCXZvaWQgKmQJCQlQb2ludGVyIHRvIGN1cnJlbnQgZGV2aWNlCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBpbnRlcnJ1cHRfc2VydmljZV9pY3BfbXVsdGkoaW50IGlycSwgdm9pZCAqZCBQVF9SRUdTX0FSRykKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSBkOworCWludCBpbnRfbm87CisKKyNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKKwlwcmludGsoImljcCBtdWx0aSBFREJHOiBCR046IGludGVycnVwdF9zZXJ2aWNlX2ljcF9tdWx0aSglZCwuLi4pXG4iLAorCQlpcnEpOworI2VuZGlmCisKKwkvLyBJcyB0aGlzIGludGVycnVwdCBmcm9tIG91ciBib2FyZD8KKwlpbnRfbm8gPSByZWFkdyhkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0lOVF9TVEFUKSAmIFN0YXR1c19JUlE7CisJaWYgKCFpbnRfbm8pCisJCS8vIE5vLCBleGl0CisJCXJldHVybiBJUlFfTk9ORTsKKworI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRworCXByaW50aygiaWNwIG11bHRpIEVEQkc6IGludGVycnVwdF9zZXJ2aWNlX2ljcF9tdWx0aSgpIFNUOiAlNHhcbiIsCisJCXJlYWR3KGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfSU5UX1NUQVQpKTsKKyNlbmRpZgorCisJLy8gRGV0ZXJtaW5lIHdoaWNoIGludGVycnVwdCBpcyBhY3RpdmUgJiBoYW5kbGUgaXQKKwlzd2l0Y2ggKGludF9ubykgeworCWNhc2UgQURDX1JFQURZOgorCQlicmVhazsKKwljYXNlIERBQ19SRUFEWToKKwkJYnJlYWs7CisJY2FzZSBET1VUX0VSUk9SOgorCQlicmVhazsKKwljYXNlIERJTl9TVEFUVVM6CisJCWJyZWFrOworCWNhc2UgQ0lFMDoKKwkJYnJlYWs7CisJY2FzZSBDSUUxOgorCQlicmVhazsKKwljYXNlIENJRTI6CisJCWJyZWFrOworCWNhc2UgQ0lFMzoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisKKwl9CisKKyNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKKwlwcmludGsoImljcCBtdWx0aSBFREJHOiBFTkQ6IGludGVycnVwdF9zZXJ2aWNlX2ljcF9tdWx0aSguLi4pXG4iKTsKKyNlbmRpZgorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworI2lmIDAKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCU5hbWU6CWNoZWNrX2NoYW5uZWxfbGlzdAorCisJRGVzY3JpcHRpb246CisJCVRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZSBjaGFubmVsIGxpc3QsIHByb3ZpZGVkIGJ5IHVzZXIKKwkJaXMgYnVpbHQgY29ycmVjdGx5CisKKwlQYXJhbWV0ZXJzOgorCQljb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IHNldmljZSBzdHJ1Y3R1cmUKKwkJY29tZWRpX3N1YmRldmljZSAqcwlQb2ludGVyIHRvIGN1cnJlbnQgc3ViZGV2aWNlIHN0cnVjdHVyZQorCQl1bnNpZ25lZCBpbnQgKmNoYW5saXN0CVBvaW50ZXIgdG8gcGFja2VkIGNoYW5uZWwgbGlzdAorCQl1bnNpZ25lZCBpbnQgbl9jaGFuCU51bWJlciBvZiBjaGFubmVscyB0byBzY2FuCisKKwlSZXR1cm5zOmludCAwID0gZmFpbHVyZQorCQkgICAgMSA9IHN1Y2Nlc3MKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIGludCBjaGVja19jaGFubmVsX2xpc3QoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJdW5zaWduZWQgaW50ICpjaGFubGlzdCwgdW5zaWduZWQgaW50IG5fY2hhbikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRworCXByaW50aygiaWNwIG11bHRpIEVEQkc6ICBjaGVja19jaGFubmVsX2xpc3QoLi4uLCVkKVxuIiwgbl9jaGFuKTsKKyNlbmRpZgorCS8vIENoZWNrIHRoYXQgd2UgYXQgbGVhc3QgaGF2ZSBvbmUgY2hhbm5lbCB0byBjaGVjaworCWlmIChuX2NoYW4gPCAxKSB7CisJCWNvbWVkaV9lcnJvcihkZXYsICJyYW5nZS9jaGFubmVsIGxpc3QgaXMgZW1wdHkhIik7CisJCXJldHVybiAwOworCX0KKwkvLyBDaGVjayBhbGwgY2hhbm5lbHMKKwlmb3IgKGkgPSAwOyBpIDwgbl9jaGFuOyBpKyspIHsKKwkJLy8gQ2hlY2sgdGhhdCBjaGFubmVsIG51bWJlciBpcyA8IG1heGltdW0KKwkJaWYgKENSX0FSRUYoY2hhbmxpc3RbaV0pID09IEFSRUZfRElGRikgeworCQkJaWYgKENSX0NIQU4oY2hhbmxpc3RbaV0pID4gdGhpc19ib2FyZC0+bl9haWNoYW5kKSB7CisJCQkJY29tZWRpX2Vycm9yKGRldiwKKwkJCQkJIkluY29ycmVjdCBkaWZmZXJlbnRpYWwgYWkgY2hhbm5lbCBudW1iZXIiKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChDUl9DSEFOKGNoYW5saXN0W2ldKSA+IHRoaXNfYm9hcmQtPm5fYWljaGFuKSB7CisJCQkJY29tZWRpX2Vycm9yKGRldiwKKwkJCQkJIkluY29ycmVjdCBhaSBjaGFubmVsIG51bWJlciIpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJfQorCXJldHVybiAxOworfQorI2VuZGlmCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCU5hbWU6CXNldHVwX2NoYW5uZWxfbGlzdAorCisJRGVzY3JpcHRpb246CisJCVRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgYXBwcm9wcmlhdGUgY2hhbm5lbCBzZWxlY3Rpb24sCisJCWRpZmZlcmVudGlhbCBpbnB1dCBtb2RlIGFuZCByYW5nZSBiaXRzIGluIHRoZSBBREMgQ29tbWFuZC8KKwkJU3RhdHVzIHJlZ2lzdGVyLgorCisJUGFyYW1ldGVyczoKKwkJY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBzZXZpY2Ugc3RydWN0dXJlCisJCWNvbWVkaV9zdWJkZXZpY2UgKnMJUG9pbnRlciB0byBjdXJyZW50IHN1YmRldmljZSBzdHJ1Y3R1cmUKKwkJdW5zaWduZWQgaW50ICpjaGFubGlzdAlQb2ludGVyIHRvIHBhY2tlZCBjaGFubmVsIGxpc3QKKwkJdW5zaWduZWQgaW50IG5fY2hhbglOdW1iZXIgb2YgY2hhbm5lbHMgdG8gc2NhbgorCisJUmV0dXJuczpWb2lkCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyB2b2lkIHNldHVwX2NoYW5uZWxfbGlzdChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwl1bnNpZ25lZCBpbnQgKmNoYW5saXN0LCB1bnNpZ25lZCBpbnQgbl9jaGFuKQoreworCXVuc2lnbmVkIGludCBpLCByYW5nZSwgY2hhbnByb2c7CisJdW5zaWduZWQgaW50IGRpZmY7CisKKyNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKKwlwcmludGsoImljcCBtdWx0aSBFREJHOiAgc2V0dXBfY2hhbm5lbF9saXN0KC4uLiwlZClcbiIsIG5fY2hhbik7CisjZW5kaWYKKwlkZXZwcml2LT5hY3RfY2hhbmxpc3RfbGVuID0gbl9jaGFuOworCWRldnByaXYtPmFjdF9jaGFubGlzdF9wb3MgPSAwOworCisJZm9yIChpID0gMDsgaSA8IG5fY2hhbjsgaSsrKSB7CisJCS8vIEdldCBjaGFubmVsCisJCWNoYW5wcm9nID0gQ1JfQ0hBTihjaGFubGlzdFtpXSk7CisKKwkJLy8gRGV0ZXJtaW5lIGlmIGl0IGlzIGEgZGlmZmVyZW50aWFsIGNoYW5uZWwgKEJpdCAxNSAgPSAxKQorCQlpZiAoQ1JfQVJFRihjaGFubGlzdFtpXSkgPT0gQVJFRl9ESUZGKSB7CisJCQlkaWZmID0gMTsKKwkJCWNoYW5wcm9nICY9IDB4MDAwNzsKKwkJfSBlbHNlIHsKKwkJCWRpZmYgPSAwOworCQkJY2hhbnByb2cgJj0gMHgwMDBmOworCQl9CisKKwkJLy8gQ2xlYXIgY2hhbm5lbCwgcmFuZ2UgYW5kIGlucHV0IG1vZGUgYml0cyBpbiBBL0QgY29tbWFuZC9zdGF0dXMgcmVnaXN0ZXIKKwkJZGV2cHJpdi0+QWRjQ21kU3RhdHVzICY9IDB4ZjAwZjsKKworCQkvLyBTZXQgY2hhbm5lbCBudW1iZXIgYW5kIGRpZmZlcmVudGlhbCBtb2RlIHN0YXR1cyBiaXQKKwkJaWYgKGRpZmYpIHsKKwkJCS8vIFNldCBjaGFubmVsIG51bWJlciwgYml0cyA5LTExICYgbW9kZSwgYml0IDYKKwkJCWRldnByaXYtPkFkY0NtZFN0YXR1cyB8PSAoY2hhbnByb2cgPDwgOSk7CisJCQlkZXZwcml2LT5BZGNDbWRTdGF0dXMgfD0gQURDX0RJOworCQl9IGVsc2UKKwkJCS8vIFNldCBjaGFubmVsIG51bWJlciwgYml0cyA4LTExCisJCQlkZXZwcml2LT5BZGNDbWRTdGF0dXMgfD0gKGNoYW5wcm9nIDw8IDgpOworCisJCS8vIEdldCByYW5nZSBmb3IgY3VycmVudCBjaGFubmVsCisJCXJhbmdlID0gdGhpc19ib2FyZC0+cmFuZ2Vjb2RlW0NSX1JBTkdFKGNoYW5saXN0W2ldKV07CisJCS8vIFNldCByYW5nZS4gYml0cyA0LTUKKwkJZGV2cHJpdi0+QWRjQ21kU3RhdHVzIHw9IHJhbmdlOworCisJCS8qIE91dHB1dCBjaGFubmVsLCByYW5nZSwgbW9kZSB0byBJQ1AgTXVsdGkgKi8KKwkJd3JpdGV3KGRldnByaXYtPkFkY0NtZFN0YXR1cywKKwkJCWRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfQURDX0NTUik7CisKKyNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKKwkJcHJpbnRrKCJHUzogJTJkLiBbJTR4XT0lNHggJTR4XG4iLCBpLCBjaGFucHJvZywgcmFuZ2UsCisJCQlkZXZwcml2LT5hY3RfY2hhbmxpc3RbaV0pOworI2VuZGlmCisJfQorCit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCU5hbWU6CWljcF9tdWx0aV9yZXNldAorCisJRGVzY3JpcHRpb246CisJCVRoaXMgZnVuY3Rpb24gcmVzZXRzIHRoZSBpY3AgbXVsdGkgZGV2aWNlIHRvIGEgJ3NhZmUnIHN0YXRlCisKKwlQYXJhbWV0ZXJzOgorCQljb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IHNldmljZSBzdHJ1Y3R1cmUKKworCVJldHVybnM6aW50CTAgPSBzdWNjZXNzCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBpbnQgaWNwX211bHRpX3Jlc2V0KGNvbWVkaV9kZXZpY2UgKiBkZXYpCit7CisJdW5zaWduZWQgaW50IGk7CisKKyNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKKwlwcmludGsoImljcF9tdWx0aSBFREJHOiBCR046IGljcF9tdWx0aV9yZXNldCguLi4pXG4iKTsKKyNlbmRpZgorCS8vIENsZWFyIElOVCBlbmFibGVzIGFuZCByZXF1ZXN0cworCXdyaXRldygwLCBkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0lOVF9FTik7CisJd3JpdGV3KDB4MDBmZiwgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9JTlRfU1RBVCk7CisKKwlpZiAodGhpc19ib2FyZC0+bl9hb2NoYW4pCisJCS8vIFNldCBEQUNzIHRvIDAuLjVWIHJhbmdlIGFuZCAwViBvdXRwdXQKKwkJZm9yIChpID0gMDsgaSA8IHRoaXNfYm9hcmQtPm5fYW9jaGFuOyBpKyspIHsKKwkJCWRldnByaXYtPkRhY0NtZFN0YXR1cyAmPSAweGZjY2U7CisKKwkJCS8vIFNldCBjaGFubmVsIG51bWJlcgorCQkJZGV2cHJpdi0+RGFjQ21kU3RhdHVzIHw9IChpIDw8IDgpOworCisJCQkvLyBPdXRwdXQgMFYKKwkJCXdyaXRldygwLCBkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0FPKTsKKworCQkJLy8gU2V0IHN0YXJ0IGNvbnZlcnNpb24gYml0CisJCQlkZXZwcml2LT5EYWNDbWRTdGF0dXMgfD0gREFDX1NUOworCisJCQkvLyBPdXRwdXQgdG8gY29tbWFuZCAvIHN0YXR1cyByZWdpc3RlcgorCQkJd3JpdGV3KGRldnByaXYtPkRhY0NtZFN0YXR1cywKKwkJCQlkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0RBQ19DU1IpOworCisJCQkvLyBEZWxheSB0byBhbGxvdyBEQUMgdGltZSB0byByZWNvdmVyCisJCQljb21lZGlfdWRlbGF5KDEpOworCQl9CisJLy8gRGlnaXRhbCBvdXRwdXRzIHRvIDAKKwl3cml0ZXcoMCwgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9ETyk7CisKKyNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKKwlwcmludGsoImljcCBtdWx0aSBFREJHOiBFTkQ6IGljcF9tdWx0aV9yZXNldCguLi4pXG4iKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlOYW1lOglpY3BfbXVsdGlfYXR0YWNoCisKKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyBmdW5jdGlvbiBzZXRzIHVwIGFsbCB0aGUgYXBwcm9wcmlhdGUgZGF0YSBmb3IgdGhlIGN1cnJlbnQKKwkJZGV2aWNlLgorCisJUGFyYW1ldGVyczoKKwkJY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2Ugc3RydWN0dXJlCisJCWNvbWVkaV9kZXZjb25maWcgKml0CVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2UgY29uZmlndXJhdGlvbgorCisJUmV0dXJuczppbnQJMCA9IHN1Y2Nlc3MKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIGludCBpY3BfbXVsdGlfYXR0YWNoKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9kZXZjb25maWcgKiBpdCkKK3sKKwljb21lZGlfc3ViZGV2aWNlICpzOworCWludCByZXQsIHN1YmRldiwgbl9zdWJkZXZpY2VzOworCXVuc2lnbmVkIGludCBpcnE7CisJc3RydWN0IHBjaWxzdF9zdHJ1Y3QgKmNhcmQgPSBOVUxMOworCXJlc291cmNlX3NpemVfdCBpb19hZGRyWzVdLCBpb2Jhc2U7CisJdW5zaWduZWQgY2hhciBwY2lfYnVzLCBwY2lfc2xvdCwgcGNpX2Z1bmM7CisKKwlwcmludGsoImljcF9tdWx0aSBFREJHOiBCR046IGljcF9tdWx0aV9hdHRhY2goLi4uKVxuIik7CisKKwkvLyBBbG9jYXRlIHByaXZhdGUgZGF0YSBzdG9yYWdlIHNwYWNlCisJaWYgKChyZXQgPSBhbGxvY19wcml2YXRlKGRldiwgc2l6ZW9mKGljcF9tdWx0aV9wcml2YXRlKSkpIDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8vIEluaXRpYWxpc2UgbGlzdCBvZiBQQ0kgY2FyZHMgaW4gc3lzdGVtLCBpZiBub3QgYWxyZWFkeSBkb25lIHNvCisJaWYgKHBjaV9saXN0X2J1aWxkZWQrKyA9PSAwKSB7CisJCXBjaV9jYXJkX2xpc3RfaW5pdChQQ0lfVkVORE9SX0lEX0lDUCwKKyNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKKwkJCTEKKyNlbHNlCisJCQkwCisjZW5kaWYKKwkJCSk7CisJfQorCisJcHJpbnRrKCJBbm5lJ3MgY29tZWRpJWQ6IGljcF9tdWx0aTogYm9hcmQ9JXMiLCBkZXYtPm1pbm9yLAorCQl0aGlzX2JvYXJkLT5uYW1lKTsKKworCWlmICgoY2FyZCA9IHNlbGVjdF9hbmRfYWxsb2NfcGNpX2NhcmQoUENJX1ZFTkRPUl9JRF9JQ1AsCisJCQkJdGhpc19ib2FyZC0+ZGV2aWNlX2lkLCBpdC0+b3B0aW9uc1swXSwKKwkJCQlpdC0+b3B0aW9uc1sxXSkpID09IE5VTEwpCisJCXJldHVybiAtRUlPOworCisJZGV2cHJpdi0+Y2FyZCA9IGNhcmQ7CisKKwlpZiAoKHBjaV9jYXJkX2RhdGEoY2FyZCwgJnBjaV9idXMsICZwY2lfc2xvdCwgJnBjaV9mdW5jLCAmaW9fYWRkclswXSwKKwkJCQkmaXJxKSkgPCAwKSB7CisJCXByaW50aygiIC0gQ2FuJ3QgZ2V0IGNvbmZpZ3VyYXRpb24gZGF0YSFcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpb2Jhc2UgPSBpb19hZGRyWzJdOworCWRldnByaXYtPnBoeXNfaW9iYXNlID0gaW9iYXNlOworCisJcHJpbnRrKCIsIGI6czpmPSVkOiVkOiVkLCBpbz0weCU4bGx4IFxuIiwgcGNpX2J1cywgcGNpX3Nsb3QsIHBjaV9mdW5jLAorCQkodW5zaWduZWQgbG9uZyBsb25nKWlvYmFzZSk7CisKKwlkZXZwcml2LT5pb19hZGRyID0gaW9yZW1hcChpb2Jhc2UsIElDUF9NVUxUSV9TSVpFKTsKKworCWlmIChkZXZwcml2LT5pb19hZGRyID09IE5VTEwpIHsKKwkJcHJpbnRrKCJpb3JlbWFwIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCisJcHJpbnRrKCIweCUwOGxseCBtYXBwZWQgdG8gJXAsICIsICh1bnNpZ25lZCBsb25nIGxvbmcpaW9iYXNlLAorCQlkZXZwcml2LT5pb19hZGRyKTsKKyNlbmRpZgorCisJZGV2LT5ib2FyZF9uYW1lID0gdGhpc19ib2FyZC0+bmFtZTsKKworCW5fc3ViZGV2aWNlcyA9IDA7CisJaWYgKHRoaXNfYm9hcmQtPm5fYWljaGFuKQorCQluX3N1YmRldmljZXMrKzsKKwlpZiAodGhpc19ib2FyZC0+bl9hb2NoYW4pCisJCW5fc3ViZGV2aWNlcysrOworCWlmICh0aGlzX2JvYXJkLT5uX2RpY2hhbikKKwkJbl9zdWJkZXZpY2VzKys7CisJaWYgKHRoaXNfYm9hcmQtPm5fZG9jaGFuKQorCQluX3N1YmRldmljZXMrKzsKKwlpZiAodGhpc19ib2FyZC0+bl9jdHJzKQorCQluX3N1YmRldmljZXMrKzsKKworCWlmICgocmV0ID0gYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIG5fc3ViZGV2aWNlcykpIDwgMCkgeworCQlyZXR1cm4gcmV0OworCX0KKworCWljcF9tdWx0aV9yZXNldChkZXYpOworCisJaWYgKHRoaXNfYm9hcmQtPmhhdmVfaXJxKSB7CisJCWlmIChpcnEpIHsKKwkJCWlmIChjb21lZGlfcmVxdWVzdF9pcnEoaXJxLCBpbnRlcnJ1cHRfc2VydmljZV9pY3BfbXVsdGksCisJCQkJCUlSUUZfU0hBUkVELCAiSW5vdmEgSWNwIE11bHRpIiwgZGV2KSkgeworCQkJCXByaW50aygiLCB1bmFibGUgdG8gYWxsb2NhdGUgSVJRICV1LCBESVNBQkxJTkcgSVQiLCBpcnEpOworCQkJCWlycSA9IDA7CS8qIENhbid0IHVzZSBJUlEgKi8KKwkJCX0gZWxzZQorCQkJCXByaW50aygiLCBpcnE9JXUiLCBpcnEpOworCQl9IGVsc2UKKwkJCXByaW50aygiLCBJUlEgZGlzYWJsZWQiKTsKKwl9IGVsc2UKKwkJaXJxID0gMDsKKworCWRldi0+aXJxID0gaXJxOworCisJcHJpbnRrKCIuXG4iKTsKKworCXN1YmRldiA9IDA7CisKKwlpZiAodGhpc19ib2FyZC0+bl9haWNoYW4pIHsKKwkJcyA9IGRldi0+c3ViZGV2aWNlcyArIHN1YmRldjsKKwkJZGV2LT5yZWFkX3N1YmRldiA9IHM7CisJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9BSTsKKwkJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFIHwgU0RGX0NPTU1PTiB8IFNERl9HUk9VTkQ7CisJCWlmICh0aGlzX2JvYXJkLT5uX2FpY2hhbmQpCisJCQlzLT5zdWJkZXZfZmxhZ3MgfD0gU0RGX0RJRkY7CisJCXMtPm5fY2hhbiA9IHRoaXNfYm9hcmQtPm5fYWljaGFuOworCQlzLT5tYXhkYXRhID0gdGhpc19ib2FyZC0+YWlfbWF4ZGF0YTsKKwkJcy0+bGVuX2NoYW5saXN0ID0gdGhpc19ib2FyZC0+bl9haWNoYW47CisJCXMtPnJhbmdlX3RhYmxlID0gdGhpc19ib2FyZC0+cmFuZ2VsaXN0X2FpOworCQlzLT5pbnNuX3JlYWQgPSBpY3BfbXVsdGlfaW5zbl9yZWFkX2FpOworCQlzdWJkZXYrKzsKKwl9CisKKwlpZiAodGhpc19ib2FyZC0+bl9hb2NoYW4pIHsKKwkJcyA9IGRldi0+c3ViZGV2aWNlcyArIHN1YmRldjsKKwkJcy0+dHlwZSA9IENPTUVESV9TVUJEX0FPOworCQlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfV1JJVEFCTEUgfCBTREZfR1JPVU5EIHwgU0RGX0NPTU1PTjsKKwkJcy0+bl9jaGFuID0gdGhpc19ib2FyZC0+bl9hb2NoYW47CisJCXMtPm1heGRhdGEgPSB0aGlzX2JvYXJkLT5hb19tYXhkYXRhOworCQlzLT5sZW5fY2hhbmxpc3QgPSB0aGlzX2JvYXJkLT5uX2FvY2hhbjsKKwkJcy0+cmFuZ2VfdGFibGUgPSB0aGlzX2JvYXJkLT5yYW5nZWxpc3RfYW87CisJCXMtPmluc25fd3JpdGUgPSBpY3BfbXVsdGlfaW5zbl93cml0ZV9hbzsKKwkJcy0+aW5zbl9yZWFkID0gaWNwX211bHRpX2luc25fcmVhZF9hbzsKKwkJc3ViZGV2Kys7CisJfQorCisJaWYgKHRoaXNfYm9hcmQtPm5fZGljaGFuKSB7CisJCXMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXY7CisJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9ESTsKKwkJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFOworCQlzLT5uX2NoYW4gPSB0aGlzX2JvYXJkLT5uX2RpY2hhbjsKKwkJcy0+bWF4ZGF0YSA9IDE7CisJCXMtPmxlbl9jaGFubGlzdCA9IHRoaXNfYm9hcmQtPm5fZGljaGFuOworCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOworCQlzLT5pb19iaXRzID0gMDsKKwkJcy0+aW5zbl9iaXRzID0gaWNwX211bHRpX2luc25fYml0c19kaTsKKwkJc3ViZGV2Kys7CisJfQorCisJaWYgKHRoaXNfYm9hcmQtPm5fZG9jaGFuKSB7CisJCXMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXY7CisJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9ETzsKKwkJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1dSSVRBQkxFIHwgU0RGX1JFQURBQkxFOworCQlzLT5uX2NoYW4gPSB0aGlzX2JvYXJkLT5uX2RvY2hhbjsKKwkJcy0+bWF4ZGF0YSA9IDE7CisJCXMtPmxlbl9jaGFubGlzdCA9IHRoaXNfYm9hcmQtPm5fZG9jaGFuOworCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOworCQlzLT5pb19iaXRzID0gKDEgPDwgdGhpc19ib2FyZC0+bl9kb2NoYW4pIC0gMTsKKwkJcy0+c3RhdGUgPSAwOworCQlzLT5pbnNuX2JpdHMgPSBpY3BfbXVsdGlfaW5zbl9iaXRzX2RvOworCQlzdWJkZXYrKzsKKwl9CisKKwlpZiAodGhpc19ib2FyZC0+bl9jdHJzKSB7CisJCXMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXY7CisJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9DT1VOVEVSOworCQlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfV1JJVEFCTEUgfCBTREZfR1JPVU5EIHwgU0RGX0NPTU1PTjsKKwkJcy0+bl9jaGFuID0gdGhpc19ib2FyZC0+bl9jdHJzOworCQlzLT5tYXhkYXRhID0gMHhmZmZmOworCQlzLT5sZW5fY2hhbmxpc3QgPSB0aGlzX2JvYXJkLT5uX2N0cnM7CisJCXMtPnN0YXRlID0gMDsKKwkJcy0+aW5zbl9yZWFkID0gaWNwX211bHRpX2luc25fcmVhZF9jdHI7CisJCXMtPmluc25fd3JpdGUgPSBpY3BfbXVsdGlfaW5zbl93cml0ZV9jdHI7CisJCXN1YmRldisrOworCX0KKworCWRldnByaXYtPnZhbGlkID0gMTsKKworI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRworCXByaW50aygiaWNwIG11bHRpIEVEQkc6IEVORDogaWNwX211bHRpX2F0dGFjaCguLi4pXG4iKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCU5hbWU6CWljcF9tdWx0aV9kZXRhY2gKKworCURlc2NyaXB0aW9uOgorCQlUaGlzIGZ1bmN0aW9uIHJlbGVhc2VzIGFsbCB0aGUgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIGN1cnJlbnQKKwkJZGV2aWNlLgorCisJUGFyYW1ldGVyczoKKwkJY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2Ugc3RydWN0dXJlCisKKwlSZXR1cm5zOmludAkwID0gc3VjY2VzcworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgaW50IGljcF9tdWx0aV9kZXRhY2goY29tZWRpX2RldmljZSAqIGRldikKK3sKKworCWlmIChkZXYtPnByaXZhdGUpCisJCWlmIChkZXZwcml2LT52YWxpZCkKKwkJCWljcF9tdWx0aV9yZXNldChkZXYpOworCisJaWYgKGRldi0+aXJxKQorCQljb21lZGlfZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwlpZiAoZGV2LT5wcml2YXRlICYmIGRldnByaXYtPmlvX2FkZHIpCisJCWlvdW5tYXAoZGV2cHJpdi0+aW9fYWRkcik7CisKKwlpZiAoZGV2LT5wcml2YXRlICYmIGRldnByaXYtPmNhcmQpCisJCXBjaV9jYXJkX2ZyZWUoZGV2cHJpdi0+Y2FyZCk7CisKKwlpZiAoLS1wY2lfbGlzdF9idWlsZGVkID09IDApIHsKKwkJcGNpX2NhcmRfbGlzdF9jbGVhbnVwKFBDSV9WRU5ET1JfSURfSUNQKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9pY3BfbXVsdGkuaCBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9pY3BfbXVsdGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGY0YThkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2ljcF9tdWx0aS5oCkBAIC0wLDAgKzEsMjc4IEBACisvKgorICAgIGNvbWVkaS9kcml2ZXJzL2ljcF9tdWx0aS5oCisKKyAgICBTdHVmZiBmb3IgSUNQIE11bHRpCisKKyAgICBBdXRob3I6IEFubmUgU21vcnRoaXQgPGFubmUuc21vcnRoaXRAc2Z3dGUuY2g+CisKKyovCisKKyNpZm5kZWYgX0lDUF9NVUxUSV9IXworI2RlZmluZSBfSUNQX01VTFRJX0hfCisKKyNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlICJjb21lZGlfcGNpLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgcGNpbHN0X3N0cnVjdCB7CisJc3RydWN0IHBjaWxzdF9zdHJ1Y3QgKm5leHQ7CisJaW50IHVzZWQ7CisJc3RydWN0IHBjaV9kZXYgKnBjaWRldjsKKwl1bnNpZ25lZCBzaG9ydCB2ZW5kb3I7CisJdW5zaWduZWQgc2hvcnQgZGV2aWNlOworCXVuc2lnbmVkIGNoYXIgcGNpX2J1czsKKwl1bnNpZ25lZCBjaGFyIHBjaV9zbG90OworCXVuc2lnbmVkIGNoYXIgcGNpX2Z1bmM7CisJcmVzb3VyY2Vfc2l6ZV90IGlvX2FkZHJbNV07CisJdW5zaWduZWQgaW50IGlycTsKK307CisKK3N0cnVjdCBwY2lsc3Rfc3RydWN0ICppbm92YV9kZXZpY2VzOwkvLyBwdHIgdG8gcm9vdCBsaXN0IG9mIGFsbCBJbm92YSBkZXZpY2VzCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBwY2lfY2FyZF9saXN0X2luaXQodW5zaWduZWQgc2hvcnQgcGNpX3ZlbmRvciwgY2hhciBkaXNwbGF5KTsKK3N0YXRpYyB2b2lkIHBjaV9jYXJkX2xpc3RfY2xlYW51cCh1bnNpZ25lZCBzaG9ydCBwY2lfdmVuZG9yKTsKK3N0YXRpYyBzdHJ1Y3QgcGNpbHN0X3N0cnVjdCAqZmluZF9mcmVlX3BjaV9jYXJkX2J5X2RldmljZSh1bnNpZ25lZCBzaG9ydAorCXZlbmRvcl9pZCwgdW5zaWduZWQgc2hvcnQgZGV2aWNlX2lkKTsKK3N0YXRpYyBpbnQgZmluZF9mcmVlX3BjaV9jYXJkX2J5X3Bvc2l0aW9uKHVuc2lnbmVkIHNob3J0IHZlbmRvcl9pZCwKKwl1bnNpZ25lZCBzaG9ydCBkZXZpY2VfaWQsIHVuc2lnbmVkIHNob3J0IHBjaV9idXMsCisJdW5zaWduZWQgc2hvcnQgcGNpX3Nsb3QsIHN0cnVjdCBwY2lsc3Rfc3RydWN0ICoqY2FyZCk7CitzdGF0aWMgc3RydWN0IHBjaWxzdF9zdHJ1Y3QgKnNlbGVjdF9hbmRfYWxsb2NfcGNpX2NhcmQodW5zaWduZWQgc2hvcnQgdmVuZG9yX2lkLAorCXVuc2lnbmVkIHNob3J0IGRldmljZV9pZCwgdW5zaWduZWQgc2hvcnQgcGNpX2J1cywKKwl1bnNpZ25lZCBzaG9ydCBwY2lfc2xvdCk7CisKK3N0YXRpYyBpbnQgcGNpX2NhcmRfYWxsb2Moc3RydWN0IHBjaWxzdF9zdHJ1Y3QgKmFtY2MpOworc3RhdGljIGludCBwY2lfY2FyZF9mcmVlKHN0cnVjdCBwY2lsc3Rfc3RydWN0ICphbWNjKTsKK3N0YXRpYyB2b2lkIHBjaV9jYXJkX2xpc3RfZGlzcGxheSh2b2lkKTsKK3N0YXRpYyBpbnQgcGNpX2NhcmRfZGF0YShzdHJ1Y3QgcGNpbHN0X3N0cnVjdCAqYW1jYywKKwl1bnNpZ25lZCBjaGFyICpwY2lfYnVzLCB1bnNpZ25lZCBjaGFyICpwY2lfc2xvdCwKKwl1bnNpZ25lZCBjaGFyICpwY2lfZnVuYywgcmVzb3VyY2Vfc2l6ZV90ICogaW9fYWRkciwgdW5zaWduZWQgaW50ICppcnEpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogYnVpbGQgbGlzdCBvZiBJbm92YSBjYXJkcyBpbiB0aGlzIHN5c3RlbSAqLworc3RhdGljIHZvaWQgcGNpX2NhcmRfbGlzdF9pbml0KHVuc2lnbmVkIHNob3J0IHBjaV92ZW5kb3IsIGNoYXIgZGlzcGxheSkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2OworCXN0cnVjdCBwY2lsc3Rfc3RydWN0ICppbm92YSwgKmxhc3Q7CisJaW50IGk7CisKKwlpbm92YV9kZXZpY2VzID0gTlVMTDsKKwlsYXN0ID0gTlVMTDsKKworCWZvciAocGNpZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgTlVMTCk7CisJCXBjaWRldiAhPSBOVUxMOworCQlwY2lkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwY2lkZXYpKSB7CisJCWlmIChwY2lkZXYtPnZlbmRvciA9PSBwY2lfdmVuZG9yKSB7CisJCQlpbm92YSA9IGttYWxsb2Moc2l6ZW9mKCppbm92YSksIEdGUF9LRVJORUwpOworCQkJaWYgKCFpbm92YSkgeworCQkJCXByaW50aygiaWNwX211bHRpOiBwY2lfY2FyZF9saXN0X2luaXQ6IGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJCQlwY2lfZGV2X3B1dChwY2lkZXYpOworCQkJCWJyZWFrOworCQkJfQorCQkJbWVtc2V0KGlub3ZhLCAwLCBzaXplb2YoKmlub3ZhKSk7CisKKwkJCWlub3ZhLT5wY2lkZXYgPSBwY2lfZGV2X2dldChwY2lkZXYpOworCQkJaWYgKGxhc3QpIHsKKwkJCQlsYXN0LT5uZXh0ID0gaW5vdmE7CisJCQl9IGVsc2UgeworCQkJCWlub3ZhX2RldmljZXMgPSBpbm92YTsKKwkJCX0KKwkJCWxhc3QgPSBpbm92YTsKKworCQkJaW5vdmEtPnZlbmRvciA9IHBjaWRldi0+dmVuZG9yOworCQkJaW5vdmEtPmRldmljZSA9IHBjaWRldi0+ZGV2aWNlOworCQkJaW5vdmEtPnBjaV9idXMgPSBwY2lkZXYtPmJ1cy0+bnVtYmVyOworCQkJaW5vdmEtPnBjaV9zbG90ID0gUENJX1NMT1QocGNpZGV2LT5kZXZmbik7CisJCQlpbm92YS0+cGNpX2Z1bmMgPSBQQ0lfRlVOQyhwY2lkZXYtPmRldmZuKTsKKwkJCS8qIE5vdGU6IHJlc291cmNlcyBtYXkgYmUgaW52YWxpZCBpZiBQQ0kgZGV2aWNlCisJCQkgKiBub3QgZW5hYmxlZCwgYnV0IHRoZXkgYXJlIGNvcnJlY3RlZCBpbgorCQkJICogcGNpX2NhcmRfYWxsb2MuICovCisJCQlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQkJCWlub3ZhLT5pb19hZGRyW2ldID0KKwkJCQkJcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgaSk7CisJCQlpbm92YS0+aXJxID0gcGNpZGV2LT5pcnE7CisJCX0KKwl9CisKKwlpZiAoZGlzcGxheSkKKwkJcGNpX2NhcmRfbGlzdF9kaXNwbGF5KCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZnJlZSB1cCBsaXN0IG9mIGFtY2MgY2FyZHMgaW4gdGhpcyBzeXN0ZW0gKi8KK3N0YXRpYyB2b2lkIHBjaV9jYXJkX2xpc3RfY2xlYW51cCh1bnNpZ25lZCBzaG9ydCBwY2lfdmVuZG9yKQoreworCXN0cnVjdCBwY2lsc3Rfc3RydWN0ICppbm92YSwgKm5leHQ7CisKKwlmb3IgKGlub3ZhID0gaW5vdmFfZGV2aWNlczsgaW5vdmE7IGlub3ZhID0gbmV4dCkgeworCQluZXh0ID0gaW5vdmEtPm5leHQ7CisJCXBjaV9kZXZfcHV0KGlub3ZhLT5wY2lkZXYpOworCQlrZnJlZShpbm92YSk7CisJfQorCisJaW5vdmFfZGV2aWNlcyA9IE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZmluZCBmaXJzdCB1bnVzZWQgY2FyZCB3aXRoIHRoaXMgZGV2aWNlX2lkICovCitzdGF0aWMgc3RydWN0IHBjaWxzdF9zdHJ1Y3QgKmZpbmRfZnJlZV9wY2lfY2FyZF9ieV9kZXZpY2UodW5zaWduZWQgc2hvcnQKKwl2ZW5kb3JfaWQsIHVuc2lnbmVkIHNob3J0IGRldmljZV9pZCkKK3sKKwlzdHJ1Y3QgcGNpbHN0X3N0cnVjdCAqaW5vdmEsICpuZXh0OworCisJZm9yIChpbm92YSA9IGlub3ZhX2RldmljZXM7IGlub3ZhOyBpbm92YSA9IG5leHQpIHsKKwkJbmV4dCA9IGlub3ZhLT5uZXh0OworCQlpZiAoKCFpbm92YS0+dXNlZCkgJiYgKGlub3ZhLT5kZXZpY2UgPT0gZGV2aWNlX2lkKQorCQkJJiYgKGlub3ZhLT52ZW5kb3IgPT0gdmVuZG9yX2lkKSkKKwkJCXJldHVybiBpbm92YTsKKworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGZpbmQgY2FyZCBvbiByZXF1ZXN0ZWQgcG9zaXRpb24gKi8KK3N0YXRpYyBpbnQgZmluZF9mcmVlX3BjaV9jYXJkX2J5X3Bvc2l0aW9uKHVuc2lnbmVkIHNob3J0IHZlbmRvcl9pZCwKKwl1bnNpZ25lZCBzaG9ydCBkZXZpY2VfaWQsIHVuc2lnbmVkIHNob3J0IHBjaV9idXMsCisJdW5zaWduZWQgc2hvcnQgcGNpX3Nsb3QsIHN0cnVjdCBwY2lsc3Rfc3RydWN0ICoqY2FyZCkKK3sKKwlzdHJ1Y3QgcGNpbHN0X3N0cnVjdCAqaW5vdmEsICpuZXh0OworCisJKmNhcmQgPSBOVUxMOworCWZvciAoaW5vdmEgPSBpbm92YV9kZXZpY2VzOyBpbm92YTsgaW5vdmEgPSBuZXh0KSB7CisJCW5leHQgPSBpbm92YS0+bmV4dDsKKwkJaWYgKChpbm92YS0+dmVuZG9yID09IHZlbmRvcl9pZCkgJiYgKGlub3ZhLT5kZXZpY2UgPT0gZGV2aWNlX2lkKQorCQkJJiYgKGlub3ZhLT5wY2lfYnVzID09IHBjaV9idXMpCisJCQkmJiAoaW5vdmEtPnBjaV9zbG90ID09IHBjaV9zbG90KSkgeworCQkJaWYgKCEoaW5vdmEtPnVzZWQpKSB7CisJCQkJKmNhcmQgPSBpbm92YTsKKwkJCQlyZXR1cm4gMDsJLy8gb2ssIGNhcmQgaXMgZm91bmQKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIDI7CS8vIGNhcmQgZXhpc3QgYnV0IGlzIHVzZWQKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAxOwkJLy8gbm8gY2FyZCBmb3VuZAorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIG1hcmsgY2FyZCBhcyB1c2VkICovCitzdGF0aWMgaW50IHBjaV9jYXJkX2FsbG9jKHN0cnVjdCBwY2lsc3Rfc3RydWN0ICppbm92YSkKK3sKKwlpbnQgaTsKKworCWlmICghaW5vdmEpIHsKKwkJcnRfcHJpbnRrKCIgLSBCVUchISBpbm92YSBpcyBOVUxMIVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoaW5vdmEtPnVzZWQpCisJCXJldHVybiAxOworCWlmIChjb21lZGlfcGNpX2VuYWJsZShpbm92YS0+cGNpZGV2LCAiaWNwX211bHRpIikpIHsKKwkJcnRfcHJpbnRrKCIgLSBDYW4ndCBlbmFibGUgUENJIGRldmljZSBhbmQgcmVxdWVzdCByZWdpb25zIVxuIik7CisJCXJldHVybiAtMTsKKwl9CisJLyogUmVzb3VyY2VzIHdpbGwgYmUgYWNjdXJhdGUgbm93LiAqLworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisJCWlub3ZhLT5pb19hZGRyW2ldID0gcGNpX3Jlc291cmNlX3N0YXJ0KGlub3ZhLT5wY2lkZXYsIGkpOworCWlub3ZhLT5pcnEgPSBpbm92YS0+cGNpZGV2LT5pcnE7CisJaW5vdmEtPnVzZWQgPSAxOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIG1hcmsgY2FyZCBhcyBmcmVlICovCitzdGF0aWMgaW50IHBjaV9jYXJkX2ZyZWUoc3RydWN0IHBjaWxzdF9zdHJ1Y3QgKmlub3ZhKQoreworCWlmICghaW5vdmEpCisJCXJldHVybiAtMTsKKworCWlmICghaW5vdmEtPnVzZWQpCisJCXJldHVybiAxOworCWlub3ZhLT51c2VkID0gMDsKKwljb21lZGlfcGNpX2Rpc2FibGUoaW5vdmEtPnBjaWRldik7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZGlzcGxheSBsaXN0IG9mIGZvdW5kIGNhcmRzICovCitzdGF0aWMgdm9pZCBwY2lfY2FyZF9saXN0X2Rpc3BsYXkodm9pZCkKK3sKKwlzdHJ1Y3QgcGNpbHN0X3N0cnVjdCAqaW5vdmEsICpuZXh0OworCisJcHJpbnRrKCJBbm5lJ3MgTGlzdCBvZiBwY2kgY2FyZHNcbiIpOworCXByaW50aygiYnVzOnNsb3Q6ZnVuYyB2ZW5kb3IgZGV2aWNlIGlvX2lub3ZhIGlvX2RhcSBpcnEgdXNlZFxuIik7CisKKwlmb3IgKGlub3ZhID0gaW5vdmFfZGV2aWNlczsgaW5vdmE7IGlub3ZhID0gbmV4dCkgeworCQluZXh0ID0gaW5vdmEtPm5leHQ7CisJCXByaW50aygiJTJkICAgJTJkICAgJTJkICAweCU0eCAweCU0eCAgIDB4JThsbHggMHglOGxseCAgJTJ1ICAlMmRcbiIsIGlub3ZhLT5wY2lfYnVzLCBpbm92YS0+cGNpX3Nsb3QsIGlub3ZhLT5wY2lfZnVuYywgaW5vdmEtPnZlbmRvciwgaW5vdmEtPmRldmljZSwgKHVuc2lnbmVkIGxvbmcgbG9uZylpbm92YS0+aW9fYWRkclswXSwgKHVuc2lnbmVkIGxvbmcgbG9uZylpbm92YS0+aW9fYWRkclsyXSwgaW5vdmEtPmlycSwgaW5vdmEtPnVzZWQpOworCisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHJldHVybiBhbGwgY2FyZCBpbmZvcm1hdGlvbiBmb3IgZHJpdmVyICovCitzdGF0aWMgaW50IHBjaV9jYXJkX2RhdGEoc3RydWN0IHBjaWxzdF9zdHJ1Y3QgKmlub3ZhLAorCXVuc2lnbmVkIGNoYXIgKnBjaV9idXMsIHVuc2lnbmVkIGNoYXIgKnBjaV9zbG90LAorCXVuc2lnbmVkIGNoYXIgKnBjaV9mdW5jLCByZXNvdXJjZV9zaXplX3QgKiBpb19hZGRyLCB1bnNpZ25lZCBpbnQgKmlycSkKK3sKKwlpbnQgaTsKKworCWlmICghaW5vdmEpCisJCXJldHVybiAtMTsKKwkqcGNpX2J1cyA9IGlub3ZhLT5wY2lfYnVzOworCSpwY2lfc2xvdCA9IGlub3ZhLT5wY2lfc2xvdDsKKwkqcGNpX2Z1bmMgPSBpbm92YS0+cGNpX2Z1bmM7CisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwkJaW9fYWRkcltpXSA9IGlub3ZhLT5pb19hZGRyW2ldOworCSppcnEgPSBpbm92YS0+aXJxOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHNlbGVjdCBhbmQgYWxsb2MgY2FyZCAqLworc3RhdGljIHN0cnVjdCBwY2lsc3Rfc3RydWN0ICpzZWxlY3RfYW5kX2FsbG9jX3BjaV9jYXJkKHVuc2lnbmVkIHNob3J0IHZlbmRvcl9pZCwKKwl1bnNpZ25lZCBzaG9ydCBkZXZpY2VfaWQsIHVuc2lnbmVkIHNob3J0IHBjaV9idXMsCisJdW5zaWduZWQgc2hvcnQgcGNpX3Nsb3QpCit7CisJc3RydWN0IHBjaWxzdF9zdHJ1Y3QgKmNhcmQ7CisJaW50IGVycjsKKworCWlmICgocGNpX2J1cyA8IDEpICYgKHBjaV9zbG90IDwgMSkpIHsJLy8gdXNlIGF1dG9kZXRlY3Rpb24KKwkJaWYgKChjYXJkID0gZmluZF9mcmVlX3BjaV9jYXJkX2J5X2RldmljZSh2ZW5kb3JfaWQsCisJCQkJCWRldmljZV9pZCkpID09IE5VTEwpIHsKKwkJCXJ0X3ByaW50aygiIC0gVW51c2VkIGNhcmQgbm90IGZvdW5kIGluIHN5c3RlbSFcbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9IGVsc2UgeworCQlzd2l0Y2ggKGZpbmRfZnJlZV9wY2lfY2FyZF9ieV9wb3NpdGlvbih2ZW5kb3JfaWQsIGRldmljZV9pZCwKKwkJCQlwY2lfYnVzLCBwY2lfc2xvdCwgJmNhcmQpKSB7CisJCWNhc2UgMToKKwkJCXJ0X3ByaW50aworCQkJCSgiIC0gQ2FyZCBub3QgZm91bmQgb24gcmVxdWVzdGVkIHBvc2l0aW9uIGI6cyAlZDolZCFcbiIsCisJCQkJcGNpX2J1cywgcGNpX3Nsb3QpOworCQkJcmV0dXJuIE5VTEw7CisJCWNhc2UgMjoKKwkJCXJ0X3ByaW50aworCQkJCSgiIC0gQ2FyZCBvbiByZXF1ZXN0ZWQgcG9zaXRpb24gaXMgdXNlZCBiOnMgJWQ6JWQhXG4iLAorCQkJCXBjaV9idXMsIHBjaV9zbG90KTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCisJaWYgKChlcnIgPSBwY2lfY2FyZF9hbGxvYyhjYXJkKSkgIT0gMCkgeworCQlpZiAoZXJyID4gMCkKKwkJCXJ0X3ByaW50aygiIC0gQ2FuJ3QgYWxsb2NhdGUgY2FyZCFcbiIpOworCQkvKiBlbHNlOiBlcnJvciBhbHJlYWR5IHByaW50ZWQuICovCisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBjYXJkOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZTQwMDAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZTQwMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDMyYWE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21lNDAwMC5jCkBAIC0wLDAgKzEsMjM2MiBAQAorLyoKKyAgIGNvbWVkaS9kcml2ZXJzL21lNDAwMC5jCisgICBTb3VyY2UgY29kZSBmb3IgdGhlIE1laWxoYXVzIE1FLTQwMDAgYm9hcmQgZmFtaWx5LgorCisgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgICBDb3B5cmlnaHQgKEMpIDIwMDAgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqLworLyoKK0RyaXZlcjogbWU0MDAwCitEZXNjcmlwdGlvbjogTWVpbGhhdXMgTUUtNDAwMCBzZXJpZXMgYm9hcmRzCitEZXZpY2VzOiBbTWVpbGhhdXNdIE1FLTQ2NTAgKG1lNDAwMCksIE1FLTQ2NzBpLCBNRS00NjgwLCBNRS00NjgwaSwgTUUtNDY4MGlzCitBdXRob3I6IGdnIChHdWVudGVyIEdlYmhhcmR0IDxnLmdlYmhhcmR0QG1laWxoYXVzLmNvbT4pCitVcGRhdGVkOiBNb24sIDE4IE1hciAyMDAyIDE1OjM0OjAxIC0wODAwCitTdGF0dXM6IGJyb2tlbiAobm8gc3VwcG9ydCBmb3IgbG9hZGluZyBmaXJtd2FyZSkKKworU3VwcG9ydHM6CisKKyAgICAtIEFuYWxvZyBJbnB1dAorICAgIC0gQW5hbG9nIE91dHB1dAorICAgIC0gRGlnaXRhbCBJL08KKyAgICAtIENvdW50ZXIKKworQ29uZmlndXJhdGlvbiBPcHRpb25zOgorCisgICAgWzBdIC0gUENJIGJ1cyBudW1iZXIgKG9wdGlvbmFsKQorICAgIFsxXSAtIFBDSSBzbG90IG51bWJlciAob3B0aW9uYWwpCisKKyAgICBJZiBidXMvc2xvdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgZmlyc3QgYXZhaWxhYmxlIFBDSQorICAgIGRldmljZSB3aWxsIGJlIHVzZWQuCisKK1RoZSBmaXJtd2FyZSByZXF1aXJlZCBieSB0aGVzZSBib2FyZHMgaXMgYXZhaWxhYmxlIGluIHRoZQorY29tZWRpX25vbmZyZWVfZmlybXdhcmUgdGFyYmFsbCBhdmFpbGFibGUgZnJvbQoraHR0cDovL3d3dy5jb21lZGkub3JnLiAgSG93ZXZlciwgdGhlIGRyaXZlcidzIHN1cHBvcnQgZm9yCitsb2FkaW5nIHRoZSBmaXJtd2FyZSB0aHJvdWdoIGNvbWVkaV9jb25maWcgaXMgY3VycmVudGx5Citicm9rZW4uCisKKyAqLworCisjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSAiY29tZWRpX3BjaS5oIgorI2luY2x1ZGUgIm1lNDAwMC5oIgorI2lmIDAKKy8qIGZpbGUgcmVtb3ZlZCBkdWUgdG8gR1BMIGluY29tcGF0aWJpbGl0eSAqLworI2luY2x1ZGUgIm1lNDAwMF9mdy5oIgorI2VuZGlmCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgUENJIGRldmljZSB0YWJsZS4KKyAgVGhpcyBpcyB1c2VkIGJ5IG1vZHByb2JlIHRvIHRyYW5zbGF0ZSBQQ0kgSURzIHRvIGRyaXZlcnMuCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRShtZTQwMDBfcGNpX3RhYmxlKSA9IHsKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgMHg0NjUwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCAweDQ2NjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCAweDQ2NjEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCAweDQ2NjIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCAweDQ2NjMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIDB4NDY3MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIDB4NDY3MSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIDB4NDY3MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIDB4NDY3MywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgMHg0NjgwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgMHg0NjgxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgMHg0NjgyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgMHg0NjgzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCXswfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG1lNDAwMF9wY2lfdGFibGUpOworCitzdGF0aWMgY29uc3QgbWU0MDAwX2JvYXJkX3QgbWU0MDAwX2JvYXJkc1tdID0geworCXsiTUUtNDY1MCIsIDB4NDY1MCwgezAsIDB9LCB7MTYsIDAsIDAsIDB9LCB7NH0sIHswfX0sCisKKwl7Ik1FLTQ2NjAiLCAweDQ2NjAsIHswLCAwfSwgezMyLCAwLCAxNiwgMH0sIHs0fSwgezN9fSwKKwl7Ik1FLTQ2NjBpIiwgMHg0NjYxLCB7MCwgMH0sIHszMiwgMCwgMTYsIDB9LCB7NH0sIHszfX0sCisJeyJNRS00NjYwcyIsIDB4NDY2MiwgezAsIDB9LCB7MzIsIDgsIDE2LCAwfSwgezR9LCB7M319LAorCXsiTUUtNDY2MGlzIiwgMHg0NjYzLCB7MCwgMH0sIHszMiwgOCwgMTYsIDB9LCB7NH0sIHszfX0sCisKKwl7Ik1FLTQ2NzAiLCAweDQ2NzAsIHs0LCAwfSwgezMyLCAwLCAxNiwgMX0sIHs0fSwgezN9fSwKKwl7Ik1FLTQ2NzBpIiwgMHg0NjcxLCB7NCwgMH0sIHszMiwgMCwgMTYsIDF9LCB7NH0sIHszfX0sCisJeyJNRS00NjcwcyIsIDB4NDY3MiwgezQsIDB9LCB7MzIsIDgsIDE2LCAxfSwgezR9LCB7M319LAorCXsiTUUtNDY3MGlzIiwgMHg0NjczLCB7NCwgMH0sIHszMiwgOCwgMTYsIDF9LCB7NH0sIHszfX0sCisKKwl7Ik1FLTQ2ODAiLCAweDQ2ODAsIHs0LCA0fSwgezMyLCAwLCAxNiwgMX0sIHs0fSwgezN9fSwKKwl7Ik1FLTQ2ODBpIiwgMHg0NjgxLCB7NCwgNH0sIHszMiwgMCwgMTYsIDF9LCB7NH0sIHszfX0sCisJeyJNRS00NjgwcyIsIDB4NDY4MiwgezQsIDR9LCB7MzIsIDgsIDE2LCAxfSwgezR9LCB7M319LAorCXsiTUUtNDY4MGlzIiwgMHg0NjgzLCB7NCwgNH0sIHszMiwgOCwgMTYsIDF9LCB7NH0sIHszfX0sCisKKwl7MH0sCit9OworCisjZGVmaW5lIE1FNDAwMF9CT0FSRF9WRVJTSU9OUyAoc2l6ZW9mKG1lNDAwMF9ib2FyZHMpIC8gc2l6ZW9mKG1lNDAwMF9ib2FyZF90KSAtIDEpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgQ29tZWRpIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgbWU0MDAwX2F0dGFjaChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfZGV2Y29uZmlnICogaXQpOworc3RhdGljIGludCBtZTQwMDBfZGV0YWNoKGNvbWVkaV9kZXZpY2UgKiBkZXYpOworc3RhdGljIGNvbWVkaV9kcml2ZXIgZHJpdmVyX21lNDAwMCA9IHsKKyAgICAgIGRyaXZlcl9uYW1lOiJtZTQwMDAiLAorICAgICAgbW9kdWxlOlRISVNfTU9EVUxFLAorICAgICAgYXR0YWNoOm1lNDAwMF9hdHRhY2gsCisgICAgICBkZXRhY2g6bWU0MDAwX2RldGFjaCwKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgTWVpbGhhdXMgZnVuY3Rpb24gcHJvdG90eXBlcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBtZTQwMDBfcHJvYmUoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX2RldmNvbmZpZyAqIGl0KTsKK3N0YXRpYyBpbnQgZ2V0X3JlZ2lzdGVycyhjb21lZGlfZGV2aWNlICogZGV2LCBzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldl9wKTsKK3N0YXRpYyBpbnQgaW5pdF9ib2FyZF9pbmZvKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2X3ApOworc3RhdGljIGludCBpbml0X2FvX2NvbnRleHQoY29tZWRpX2RldmljZSAqIGRldik7CitzdGF0aWMgaW50IGluaXRfYWlfY29udGV4dChjb21lZGlfZGV2aWNlICogZGV2KTsKK3N0YXRpYyBpbnQgaW5pdF9kaW9fY29udGV4dChjb21lZGlfZGV2aWNlICogZGV2KTsKK3N0YXRpYyBpbnQgaW5pdF9jbnRfY29udGV4dChjb21lZGlfZGV2aWNlICogZGV2KTsKK3N0YXRpYyBpbnQgeGlsaW54X2Rvd25sb2FkKGNvbWVkaV9kZXZpY2UgKiBkZXYpOworc3RhdGljIGludCByZXNldF9ib2FyZChjb21lZGlfZGV2aWNlICogZGV2KTsKKworc3RhdGljIGludCBtZTQwMDBfZGlvX2luc25fYml0cyhjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCBjb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSk7CisKK3N0YXRpYyBpbnQgbWU0MDAwX2Rpb19pbnNuX2NvbmZpZyhjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCBjb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSk7CisKK3N0YXRpYyBpbnQgY250X3Jlc2V0KGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCBjaGFubmVsKTsKKworc3RhdGljIGludCBjbnRfY29uZmlnKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJdW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBtb2RlKTsKKworc3RhdGljIGludCBtZTQwMDBfY250X2luc25fY29uZmlnKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKTsKKworc3RhdGljIGludCBtZTQwMDBfY250X2luc25fd3JpdGUoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywgY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpOworCitzdGF0aWMgaW50IG1lNDAwMF9jbnRfaW5zbl9yZWFkKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKTsKKworc3RhdGljIGludCBtZTQwMDBfYWlfaW5zbl9yZWFkKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHN1YmRldmljZSwgY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpOworCitzdGF0aWMgaW50IG1lNDAwMF9haV9jYW5jZWwoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMpOworCitzdGF0aWMgaW50IGFpX2NoZWNrX2NoYW5saXN0KGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9jbWQgKiBjbWQpOworCitzdGF0aWMgaW50IGFpX3JvdW5kX2NtZF9hcmdzKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2NtZCAqIGNtZCwKKwl1bnNpZ25lZCBpbnQgKmluaXRfdGlja3MsCisJdW5zaWduZWQgaW50ICpzY2FuX3RpY2tzLCB1bnNpZ25lZCBpbnQgKmNoYW5fdGlja3MpOworCitzdGF0aWMgaW50IGFpX3ByZXBhcmUoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfY21kICogY21kLAorCXVuc2lnbmVkIGludCBpbml0X3RpY2tzLAorCXVuc2lnbmVkIGludCBzY2FuX3RpY2tzLCB1bnNpZ25lZCBpbnQgY2hhbl90aWNrcyk7CisKK3N0YXRpYyBpbnQgYWlfd3JpdGVfY2hhbmxpc3QoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywgY29tZWRpX2NtZCAqIGNtZCk7CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTQwMDBfYWlfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCBQVF9SRUdTX0FSRyk7CisKK3N0YXRpYyBpbnQgbWU0MDAwX2FpX2RvX2NtZF90ZXN0KGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9jbWQgKiBjbWQpOworCitzdGF0aWMgaW50IG1lNDAwMF9haV9kb19jbWQoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMpOworCitzdGF0aWMgaW50IG1lNDAwMF9hb19pbnNuX3dyaXRlKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKTsKKworc3RhdGljIGludCBtZTQwMDBfYW9faW5zbl9yZWFkKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBNZWlsaGF1cyBpbmxpbmUgZnVuY3Rpb25zCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZTQwMDBfb3V0Yihjb21lZGlfZGV2aWNlICogZGV2LCB1bnNpZ25lZCBjaGFyIHZhbHVlLAorCXVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwlQT1JUX1BERUJVRygiLS0+IDB4JTAyWCBwb3J0IDB4JTA0bFhcbiIsIHZhbHVlLCBwb3J0KTsKKwlvdXRiKHZhbHVlLCBwb3J0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1lNDAwMF9vdXRsKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGxvbmcgdmFsdWUsCisJdW5zaWduZWQgbG9uZyBwb3J0KQoreworCVBPUlRfUERFQlVHKCItLT4gMHglMDhsWCBwb3J0IDB4JTA0bFhcbiIsIHZhbHVlLCBwb3J0KTsKKwlvdXRsKHZhbHVlLCBwb3J0KTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG1lNDAwMF9pbmwoY29tZWRpX2RldmljZSAqIGRldiwgdW5zaWduZWQgbG9uZyBwb3J0KQoreworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJdmFsdWUgPSBpbmwocG9ydCk7CisJUE9SVF9QREVCVUcoIjwtLSAweCUwOGxYIHBvcnQgMHglMDRsWFxuIiwgdmFsdWUsIHBvcnQpOworCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIG1lNDAwMF9pbmIoY29tZWRpX2RldmljZSAqIGRldiwgdW5zaWduZWQgbG9uZyBwb3J0KQoreworCXVuc2lnbmVkIGNoYXIgdmFsdWU7CisJdmFsdWUgPSBpbmIocG9ydCk7CisJUE9SVF9QREVCVUcoIjwtLSAweCUwOFggcG9ydCAweCUwNGxYXG4iLCB2YWx1ZSwgcG9ydCk7CisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgY29uc3QgY29tZWRpX2xyYW5nZSBtZTQwMDBfYWlfcmFuZ2UgPSB7CisJNCwKKwl7CisJCQlVTklfUkFOR0UoMi41KSwKKwkJCVVOSV9SQU5HRSgxMCksCisJCQlCSVBfUkFOR0UoMi41KSwKKwkJCUJJUF9SQU5HRSgxMCksCisJCX0KK307CisKK3N0YXRpYyBjb25zdCBjb21lZGlfbHJhbmdlIG1lNDAwMF9hb19yYW5nZSA9IHsKKwkxLAorCXsKKwkJCUJJUF9SQU5HRSgxMCksCisJCX0KK307CisKK3N0YXRpYyBpbnQgbWU0MDAwX2F0dGFjaChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfZGV2Y29uZmlnICogaXQpCit7CisJY29tZWRpX3N1YmRldmljZSAqczsKKwlpbnQgcmVzdWx0OworCisJQ0FMTF9QREVCVUcoIkluIG1lNDAwMF9hdHRhY2goKVxuIik7CisKKwlyZXN1bHQgPSBtZTQwMDBfcHJvYmUoZGV2LCBpdCk7CisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCS8qCisJICogQWxsb2NhdGUgdGhlIHN1YmRldmljZSBzdHJ1Y3R1cmVzLiAgYWxsb2Nfc3ViZGV2aWNlKCkgaXMgYQorCSAqIGNvbnZlbmllbnQgbWFjcm8gZGVmaW5lZCBpbiBjb21lZGlkZXYuaC4gIEl0IHJlbGllcyBvbgorCSAqIG5fc3ViZGV2aWNlcyBiZWluZyBzZXQgY29ycmVjdGx5LgorCSAqLworCWlmIChhbGxvY19zdWJkZXZpY2VzKGRldiwgNCkgPCAwKQorCQlyZXR1cm4gLUVOT01FTTsKKworICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgQW5hbG9nIGlucHV0IHN1YmRldmljZQorICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCXMgPSBkZXYtPnN1YmRldmljZXMgKyAwOworCisJaWYgKHRoaXNib2FyZC0+YWkuY291bnQpIHsKKwkJcy0+dHlwZSA9IENPTUVESV9TVUJEX0FJOworCQlzLT5zdWJkZXZfZmxhZ3MgPQorCQkJU0RGX1JFQURBQkxFIHwgU0RGX0NPTU1PTiB8IFNERl9HUk9VTkQgfCBTREZfRElGRjsKKwkJcy0+bl9jaGFuID0gdGhpc2JvYXJkLT5haS5jb3VudDsKKwkJcy0+bWF4ZGF0YSA9IDB4RkZGRjsJLy8gMTYgYml0IEFEQworCQlzLT5sZW5fY2hhbmxpc3QgPSBNRTQwMDBfQUlfQ0hBTk5FTF9MSVNUX0NPVU5UOworCQlzLT5yYW5nZV90YWJsZSA9ICZtZTQwMDBfYWlfcmFuZ2U7CisJCXMtPmluc25fcmVhZCA9IG1lNDAwMF9haV9pbnNuX3JlYWQ7CisKKwkJaWYgKGluZm8tPmlycSA+IDApIHsKKwkJCWlmIChjb21lZGlfcmVxdWVzdF9pcnEoaW5mby0+aXJxLCBtZTQwMDBfYWlfaXNyLAorCQkJCQlJUlFGX1NIQVJFRCwgIk1FLTQwMDAiLCBkZXYpKSB7CisJCQkJcHJpbnRrKCJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYXR0YWNoKCk6IFVuYWJsZSB0byBhbGxvY2F0ZSBpcnFcbiIsIGRldi0+bWlub3IpOworCQkJfSBlbHNlIHsKKwkJCQlkZXYtPnJlYWRfc3ViZGV2ID0gczsKKwkJCQlzLT5zdWJkZXZfZmxhZ3MgfD0gU0RGX0NNRF9SRUFEOworCQkJCXMtPmNhbmNlbCA9IG1lNDAwMF9haV9jYW5jZWw7CisJCQkJcy0+ZG9fY21kdGVzdCA9IG1lNDAwMF9haV9kb19jbWRfdGVzdDsKKwkJCQlzLT5kb19jbWQgPSBtZTQwMDBfYWlfZG9fY21kOworCQkJfQorCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYXR0YWNoKCk6IE5vIGludGVycnVwdCBhdmFpbGFibGVcbiIsCisJCQkJZGV2LT5taW5vcik7CisJCX0KKwl9IGVsc2UgeworCQlzLT50eXBlID0gQ09NRURJX1NVQkRfVU5VU0VEOworCX0KKworICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgQW5hbG9nIG91dHB1dCBzdWJkZXZpY2UKKyAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgMTsKKworCWlmICh0aGlzYm9hcmQtPmFvLmNvdW50KSB7CisJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9BTzsKKwkJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1dSSVRFQUJMRSB8IFNERl9DT01NT04gfCBTREZfR1JPVU5EOworCQlzLT5uX2NoYW4gPSB0aGlzYm9hcmQtPmFvLmNvdW50OworCQlzLT5tYXhkYXRhID0gMHhGRkZGOwkvLyAxNiBiaXQgREFDCisJCXMtPnJhbmdlX3RhYmxlID0gJm1lNDAwMF9hb19yYW5nZTsKKwkJcy0+aW5zbl93cml0ZSA9IG1lNDAwMF9hb19pbnNuX3dyaXRlOworCQlzLT5pbnNuX3JlYWQgPSBtZTQwMDBfYW9faW5zbl9yZWFkOworCX0gZWxzZSB7CisJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9VTlVTRUQ7CisJfQorCisgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBEaWdpdGFsIEkvTyBzdWJkZXZpY2UKKyAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgMjsKKworCWlmICh0aGlzYm9hcmQtPmRpby5jb3VudCkgeworCQlzLT50eXBlID0gQ09NRURJX1NVQkRfRElPOworCQlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfUkVBREFCTEUgfCBTREZfV1JJVEFCTEU7CisJCXMtPm5fY2hhbiA9IHRoaXNib2FyZC0+ZGlvLmNvdW50ICogODsKKwkJcy0+bWF4ZGF0YSA9IDE7CisJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2RpZ2l0YWw7CisJCXMtPmluc25fYml0cyA9IG1lNDAwMF9kaW9faW5zbl9iaXRzOworCQlzLT5pbnNuX2NvbmZpZyA9IG1lNDAwMF9kaW9faW5zbl9jb25maWc7CisJfSBlbHNlIHsKKwkJcy0+dHlwZSA9IENPTUVESV9TVUJEX1VOVVNFRDsKKwl9CisKKwkvKgorCSAqIENoZWNrIGZvciBvcHRvaXNvbGF0ZWQgTUUtNDAwMCB2ZXJzaW9uLiBJZiBvbmUgdGhlIGZpcnN0CisJICogcG9ydCBpcyBhIGZpeGVkIG91dHB1dCBwb3J0IGFuZCB0aGUgc2Vjb25kIGlzIGEgZml4ZWQgaW5wdXQgcG9ydC4KKwkgKi8KKwlpZiAoIW1lNDAwMF9pbmwoZGV2LCBpbmZvLT5kaW9fY29udGV4dC5kaXJfcmVnKSkgeworCQlzLT5pb19iaXRzIHw9IDB4RkY7CisJCW1lNDAwMF9vdXRsKGRldiwgTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzAsCisJCQlpbmZvLT5kaW9fY29udGV4dC5kaXJfcmVnKTsKKwl9CisKKyAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIENvdW50ZXIgc3ViZGV2aWNlCisgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIDM7CisKKwlpZiAodGhpc2JvYXJkLT5jbnQuY291bnQpIHsKKwkJcy0+dHlwZSA9IENPTUVESV9TVUJEX0NPVU5URVI7CisJCXMtPnN1YmRldl9mbGFncyA9IFNERl9SRUFEQUJMRSB8IFNERl9XUklUQUJMRTsKKwkJcy0+bl9jaGFuID0gdGhpc2JvYXJkLT5jbnQuY291bnQ7CisJCXMtPm1heGRhdGEgPSAweEZGRkY7CS8vIDE2IGJpdCBjb3VudGVycworCQlzLT5pbnNuX3JlYWQgPSBtZTQwMDBfY250X2luc25fcmVhZDsKKwkJcy0+aW5zbl93cml0ZSA9IG1lNDAwMF9jbnRfaW5zbl93cml0ZTsKKwkJcy0+aW5zbl9jb25maWcgPSBtZTQwMDBfY250X2luc25fY29uZmlnOworCX0gZWxzZSB7CisJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9VTlVTRUQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWU0MDAwX3Byb2JlKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9kZXZjb25maWcgKiBpdCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldmljZTsKKwlpbnQgcmVzdWx0LCBpOworCW1lNDAwMF9ib2FyZF90ICpib2FyZDsKKworCUNBTExfUERFQlVHKCJJbiBtZTQwMDBfcHJvYmUoKVxuIik7CisKKwkvKiBBbGxvY2F0ZSBwcml2YXRlIG1lbW9yeSAqLworCWlmIChhbGxvY19wcml2YXRlKGRldiwgc2l6ZW9mKG1lNDAwMF9pbmZvX3QpKSA8IDApIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCS8qCisJICogUHJvYmUgdGhlIGRldmljZSB0byBkZXRlcm1pbmUgd2hhdCBkZXZpY2UgaW4gdGhlIHNlcmllcyBpdCBpcy4KKwkgKi8KKwlmb3IgKHBjaV9kZXZpY2UgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBOVUxMKTsKKwkJcGNpX2RldmljZSAhPSBOVUxMOworCQlwY2lfZGV2aWNlID0KKwkJcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGNpX2RldmljZSkpIHsKKwkJaWYgKHBjaV9kZXZpY2UtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX01FSUxIQVVTKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgTUU0MDAwX0JPQVJEX1ZFUlNJT05TOyBpKyspIHsKKwkJCQlpZiAobWU0MDAwX2JvYXJkc1tpXS5kZXZpY2VfaWQgPT0KKwkJCQkJcGNpX2RldmljZS0+ZGV2aWNlKSB7CisJCQkJCS8qIFdhcyBhIHBhcnRpY3VsYXIgYnVzL3Nsb3QgcmVxdWVzdGVkPyAqLworCQkJCQlpZiAoKGl0LT5vcHRpb25zWzBdICE9IDApCisJCQkJCQl8fCAoaXQtPm9wdGlvbnNbMV0gIT0gMCkpIHsKKwkJCQkJCS8qIEFyZSB3ZSBvbiB0aGUgd3JvbmcgYnVzL3Nsb3Q/ICovCisJCQkJCQlpZiAocGNpX2RldmljZS0+YnVzLT5udW1iZXIgIT0KKwkJCQkJCQlpdC0+b3B0aW9uc1swXQorCQkJCQkJCXx8IFBDSV9TTE9UKHBjaV9kZXZpY2UtPgorCQkJCQkJCQlkZXZmbikgIT0KKwkJCQkJCQlpdC0+b3B0aW9uc1sxXSkgeworCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWRldi0+Ym9hcmRfcHRyID0gbWU0MDAwX2JvYXJkcyArIGk7CisJCQkJCWJvYXJkID0gKG1lNDAwMF9ib2FyZF90ICopIGRldi0+CisJCQkJCQlib2FyZF9wdHI7CisJCQkJCWluZm8tPnBjaV9kZXZfcCA9IHBjaV9kZXZpY2U7CisJCQkJCWdvdG8gZm91bmQ7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHJpbnRrKEtFUk5fRVJSCisJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfcHJvYmUoKTogTm8gc3VwcG9ydGVkIGJvYXJkIGZvdW5kIChyZXEuIGJ1cy9zbG90IDogJWQvJWQpXG4iLAorCQlkZXYtPm1pbm9yLCBpdC0+b3B0aW9uc1swXSwgaXQtPm9wdGlvbnNbMV0pOworCXJldHVybiAtRU5PREVWOworCisgICAgICBmb3VuZDoKKworCXByaW50ayhLRVJOX0lORk8KKwkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9wcm9iZSgpOiBGb3VuZCAlcyBhdCBQQ0kgYnVzICVkLCBzbG90ICVkXG4iLAorCQlkZXYtPm1pbm9yLCBtZTQwMDBfYm9hcmRzW2ldLm5hbWUsIHBjaV9kZXZpY2UtPmJ1cy0+bnVtYmVyLAorCQlQQ0lfU0xPVChwY2lfZGV2aWNlLT5kZXZmbikpOworCisJLyogU2V0IGRhdGEgaW4gZGV2aWNlIHN0cnVjdHVyZSAqLworCWRldi0+Ym9hcmRfbmFtZSA9IGJvYXJkLT5uYW1lOworCisJLyogRW5hYmxlIFBDSSBkZXZpY2UgYW5kIHJlcXVlc3QgcmVnaW9ucyAqLworCXJlc3VsdCA9IGNvbWVkaV9wY2lfZW5hYmxlKHBjaV9kZXZpY2UsIGRldi0+Ym9hcmRfbmFtZSk7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfcHJvYmUoKTogQ2Fubm90IGVuYWJsZSBQQ0kgZGV2aWNlIGFuZCByZXF1ZXN0IEkvTyByZWdpb25zXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyogR2V0IHRoZSBQQ0kgYmFzZSByZWdpc3RlcnMgKi8KKwlyZXN1bHQgPSBnZXRfcmVnaXN0ZXJzKGRldiwgcGNpX2RldmljZSk7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfcHJvYmUoKTogQ2Fubm90IGdldCByZWdpc3RlcnNcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJLyogSW5pdGlhbGl6ZSBib2FyZCBpbmZvICovCisJcmVzdWx0ID0gaW5pdF9ib2FyZF9pbmZvKGRldiwgcGNpX2RldmljZSk7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfcHJvYmUoKTogQ2Fubm90IGluaXQgYmFvcmQgaW5mb1xuIiwKKwkJCWRldi0+bWlub3IpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qIEluaXQgYW5hbG9nIG91dHB1dCBjb250ZXh0ICovCisJcmVzdWx0ID0gaW5pdF9hb19jb250ZXh0KGRldik7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfcHJvYmUoKTogQ2Fubm90IGluaXQgYW8gY29udGV4dFxuIiwKKwkJCWRldi0+bWlub3IpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qIEluaXQgYW5hbG9nIGlucHV0IGNvbnRleHQgKi8KKwlyZXN1bHQgPSBpbml0X2FpX2NvbnRleHQoZGV2KTsKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9wcm9iZSgpOiBDYW5ub3QgaW5pdCBhaSBjb250ZXh0XG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyogSW5pdCBkaWdpdGFsIEkvTyBjb250ZXh0ICovCisJcmVzdWx0ID0gaW5pdF9kaW9fY29udGV4dChkZXYpOworCWlmIChyZXN1bHQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX3Byb2JlKCk6IENhbm5vdCBpbml0IGRpbyBjb250ZXh0XG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyogSW5pdCBjb3VudGVyIGNvbnRleHQgKi8KKwlyZXN1bHQgPSBpbml0X2NudF9jb250ZXh0KGRldik7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfcHJvYmUoKTogQ2Fubm90IGluaXQgY250IGNvbnRleHRcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKiBEb3dubG9hZCB0aGUgeGlsaW54IGZpcm13YXJlICovCisJcmVzdWx0ID0geGlsaW54X2Rvd25sb2FkKGRldik7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfcHJvYmUoKTogQ2FuJ3QgZG93bmxvYWQgZmlybXdhcmVcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKiBNYWtlIGEgaGFyZHdhcmUgcmVzZXQgKi8KKwlyZXN1bHQgPSByZXNldF9ib2FyZChkZXYpOworCWlmIChyZXN1bHQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX3Byb2JlKCk6IENhbid0IHJlc2V0IGJvYXJkXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3JlZ2lzdGVycyhjb21lZGlfZGV2aWNlICogZGV2LCBzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldl9wKQoreworCisJQ0FMTF9QREVCVUcoIkluIGdldF9yZWdpc3RlcnMoKVxuIik7CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwbHggcmVnYmFzZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJaW5mby0+cGx4X3JlZ2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2Rldl9wLCAxKTsKKwlpZiAoaW5mby0+cGx4X3JlZ2Jhc2UgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBnZXRfcmVnaXN0ZXJzKCk6IFBDSSBiYXNlIGFkZHJlc3MgMSBpcyBub3QgYXZhaWxhYmxlXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpbmZvLT5wbHhfcmVnYmFzZV9zaXplID0gcGNpX3Jlc291cmNlX2xlbihwY2lfZGV2X3AsIDEpOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbWU0MDAwIHJlZ2Jhc2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCWluZm8tPm1lNDAwMF9yZWdiYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXZfcCwgMik7CisJaWYgKGluZm8tPm1lNDAwMF9yZWdiYXNlID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogZ2V0X3JlZ2lzdGVycygpOiBQQ0kgYmFzZSBhZGRyZXNzIDIgaXMgbm90IGF2YWlsYWJsZVxuIiwKKwkJCWRldi0+bWlub3IpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaW5mby0+bWU0MDAwX3JlZ2Jhc2Vfc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4ocGNpX2Rldl9wLCAyKTsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHRpbWVyIHJlZ2Jhc2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCWluZm8tPnRpbWVyX3JlZ2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2Rldl9wLCAzKTsKKwlpZiAoaW5mby0+dGltZXJfcmVnYmFzZSA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IGdldF9yZWdpc3RlcnMoKTogUENJIGJhc2UgYWRkcmVzcyAzIGlzIG5vdCBhdmFpbGFibGVcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWluZm8tPnRpbWVyX3JlZ2Jhc2Vfc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4ocGNpX2Rldl9wLCAzKTsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHByb2dyYW0gcmVnYmFzZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJaW5mby0+cHJvZ3JhbV9yZWdiYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXZfcCwgNSk7CisJaWYgKGluZm8tPnByb2dyYW1fcmVnYmFzZSA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IGdldF9yZWdpc3RlcnMoKTogUENJIGJhc2UgYWRkcmVzcyA1IGlzIG5vdCBhdmFpbGFibGVcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWluZm8tPnByb2dyYW1fcmVnYmFzZV9zaXplID0gcGNpX3Jlc291cmNlX2xlbihwY2lfZGV2X3AsIDUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9ib2FyZF9pbmZvKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2X3ApCit7CisJaW50IHJlc3VsdDsKKworCUNBTExfUERFQlVHKCJJbiBpbml0X2JvYXJkX2luZm8oKVxuIik7CisKKwkvKiBJbml0IHNwaW4gbG9ja3MgKi8KKwkvL3NwaW5fbG9ja19pbml0KCZpbmZvLT5wcmVsb2FkX2xvY2spOworCS8vc3Bpbl9sb2NrX2luaXQoJmluZm8tPmFpX2N0cmxfbG9jayk7CisKKwkvKiBHZXQgdGhlIHNlcmlhbCBudW1iZXIgKi8KKwlyZXN1bHQgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpX2Rldl9wLCAweDJDLCAmaW5mby0+c2VyaWFsX25vKTsKKwlpZiAocmVzdWx0ICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCkgeworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qIEdldCB0aGUgaGFyZHdhcmUgcmV2aXNpb24gKi8KKwlyZXN1bHQgPSBwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZGV2X3AsIDB4MDgsICZpbmZvLT5od19yZXZpc2lvbik7CisJaWYgKHJlc3VsdCAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpIHsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKiBHZXQgdGhlIHZlbmRvciBpZCAqLworCWluZm8tPnZlbmRvcl9pZCA9IHBjaV9kZXZfcC0+dmVuZG9yOworCisJLyogR2V0IHRoZSBkZXZpY2UgaWQgKi8KKwlpbmZvLT5kZXZpY2VfaWQgPSBwY2lfZGV2X3AtPmRldmljZTsKKworCS8qIEdldCB0aGUgaXJxIGFzc2lnbmVkIHRvIHRoZSBib2FyZCAqLworCWluZm8tPmlycSA9IHBjaV9kZXZfcC0+aXJxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9hb19jb250ZXh0KGNvbWVkaV9kZXZpY2UgKiBkZXYpCit7CisJaW50IGk7CisKKwlDQUxMX1BERUJVRygiSW4gaW5pdF9hb19jb250ZXh0KClcbiIpOworCisJZm9yIChpID0gMDsgaSA8IHRoaXNib2FyZC0+YW8uY291bnQ7IGkrKykgeworCQkvL3NwaW5fbG9ja19pbml0KCZpbmZvLT5hb19jb250ZXh0W2ldLnVzZV9sb2NrKTsKKwkJaW5mby0+YW9fY29udGV4dFtpXS5pcnEgPSBpbmZvLT5pcnE7CisKKwkJc3dpdGNoIChpKSB7CisJCWNhc2UgMDoKKwkJCWluZm8tPmFvX2NvbnRleHRbaV0uY3RybF9yZWcgPQorCQkJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPXzAwX0NUUkxfUkVHOworCQkJaW5mby0+YW9fY29udGV4dFtpXS5zdGF0dXNfcmVnID0KKwkJCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT18wMF9TVEFUVVNfUkVHOworCQkJaW5mby0+YW9fY29udGV4dFtpXS5maWZvX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDBfRklGT19SRUc7CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLnNpbmdsZV9yZWcgPQorCQkJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPXzAwX1NJTkdMRV9SRUc7CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLnRpbWVyX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDBfVElNRVJfUkVHOworCQkJaW5mby0+YW9fY29udGV4dFtpXS5pcnFfc3RhdHVzX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfSVJRX1NUQVRVU19SRUc7CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLnByZWxvYWRfcmVnID0KKwkJCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT19MT0FEU0VUUkVHX1hYOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWluZm8tPmFvX2NvbnRleHRbaV0uY3RybF9yZWcgPQorCQkJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPXzAxX0NUUkxfUkVHOworCQkJaW5mby0+YW9fY29udGV4dFtpXS5zdGF0dXNfcmVnID0KKwkJCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT18wMV9TVEFUVVNfUkVHOworCQkJaW5mby0+YW9fY29udGV4dFtpXS5maWZvX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDFfRklGT19SRUc7CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLnNpbmdsZV9yZWcgPQorCQkJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPXzAxX1NJTkdMRV9SRUc7CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLnRpbWVyX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDFfVElNRVJfUkVHOworCQkJaW5mby0+YW9fY29udGV4dFtpXS5pcnFfc3RhdHVzX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfSVJRX1NUQVRVU19SRUc7CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLnByZWxvYWRfcmVnID0KKwkJCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT19MT0FEU0VUUkVHX1hYOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWluZm8tPmFvX2NvbnRleHRbaV0uY3RybF9yZWcgPQorCQkJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPXzAyX0NUUkxfUkVHOworCQkJaW5mby0+YW9fY29udGV4dFtpXS5zdGF0dXNfcmVnID0KKwkJCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT18wMl9TVEFUVVNfUkVHOworCQkJaW5mby0+YW9fY29udGV4dFtpXS5maWZvX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDJfRklGT19SRUc7CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLnNpbmdsZV9yZWcgPQorCQkJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPXzAyX1NJTkdMRV9SRUc7CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLnRpbWVyX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDJfVElNRVJfUkVHOworCQkJaW5mby0+YW9fY29udGV4dFtpXS5pcnFfc3RhdHVzX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfSVJRX1NUQVRVU19SRUc7CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLnByZWxvYWRfcmVnID0KKwkJCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT19MT0FEU0VUUkVHX1hYOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCWluZm8tPmFvX2NvbnRleHRbaV0uY3RybF9yZWcgPQorCQkJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPXzAzX0NUUkxfUkVHOworCQkJaW5mby0+YW9fY29udGV4dFtpXS5zdGF0dXNfcmVnID0KKwkJCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT18wM19TVEFUVVNfUkVHOworCQkJaW5mby0+YW9fY29udGV4dFtpXS5maWZvX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDNfRklGT19SRUc7CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLnNpbmdsZV9yZWcgPQorCQkJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPXzAzX1NJTkdMRV9SRUc7CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLnRpbWVyX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDNfVElNRVJfUkVHOworCQkJaW5mby0+YW9fY29udGV4dFtpXS5pcnFfc3RhdHVzX3JlZyA9CisJCQkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfSVJRX1NUQVRVU19SRUc7CisJCQlpbmZvLT5hb19jb250ZXh0W2ldLnByZWxvYWRfcmVnID0KKwkJCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT19MT0FEU0VUUkVHX1hYOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGluaXRfYWlfY29udGV4dChjb21lZGlfZGV2aWNlICogZGV2KQoreworCisJQ0FMTF9QREVCVUcoIkluIGluaXRfYWlfY29udGV4dCgpXG4iKTsKKworCWluZm8tPmFpX2NvbnRleHQuaXJxID0gaW5mby0+aXJxOworCisJaW5mby0+YWlfY29udGV4dC5jdHJsX3JlZyA9IGluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FJX0NUUkxfUkVHOworCWluZm8tPmFpX2NvbnRleHQuc3RhdHVzX3JlZyA9CisJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FJX1NUQVRVU19SRUc7CisJaW5mby0+YWlfY29udGV4dC5jaGFubmVsX2xpc3RfcmVnID0KKwkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQUlfQ0hBTk5FTF9MSVNUX1JFRzsKKwlpbmZvLT5haV9jb250ZXh0LmRhdGFfcmVnID0gaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQUlfREFUQV9SRUc7CisJaW5mby0+YWlfY29udGV4dC5jaGFuX3RpbWVyX3JlZyA9CisJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FJX0NIQU5fVElNRVJfUkVHOworCWluZm8tPmFpX2NvbnRleHQuY2hhbl9wcmVfdGltZXJfcmVnID0KKwkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQUlfQ0hBTl9QUkVfVElNRVJfUkVHOworCWluZm8tPmFpX2NvbnRleHQuc2Nhbl90aW1lcl9sb3dfcmVnID0KKwkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQUlfU0NBTl9USU1FUl9MT1dfUkVHOworCWluZm8tPmFpX2NvbnRleHQuc2Nhbl90aW1lcl9oaWdoX3JlZyA9CisJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FJX1NDQU5fVElNRVJfSElHSF9SRUc7CisJaW5mby0+YWlfY29udGV4dC5zY2FuX3ByZV90aW1lcl9sb3dfcmVnID0KKwkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQUlfU0NBTl9QUkVfVElNRVJfTE9XX1JFRzsKKwlpbmZvLT5haV9jb250ZXh0LnNjYW5fcHJlX3RpbWVyX2hpZ2hfcmVnID0KKwkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQUlfU0NBTl9QUkVfVElNRVJfSElHSF9SRUc7CisJaW5mby0+YWlfY29udGV4dC5zdGFydF9yZWcgPSBpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BSV9TVEFSVF9SRUc7CisJaW5mby0+YWlfY29udGV4dC5pcnFfc3RhdHVzX3JlZyA9CisJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0lSUV9TVEFUVVNfUkVHOworCWluZm8tPmFpX2NvbnRleHQuc2FtcGxlX2NvdW50ZXJfcmVnID0KKwkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQUlfU0FNUExFX0NPVU5URVJfUkVHOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9kaW9fY29udGV4dChjb21lZGlfZGV2aWNlICogZGV2KQoreworCisJQ0FMTF9QREVCVUcoIkluIGluaXRfZGlvX2NvbnRleHQoKVxuIik7CisKKwlpbmZvLT5kaW9fY29udGV4dC5kaXJfcmVnID0gaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfRElPX0RJUl9SRUc7CisJaW5mby0+ZGlvX2NvbnRleHQuY3RybF9yZWcgPSBpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9ESU9fQ1RSTF9SRUc7CisJaW5mby0+ZGlvX2NvbnRleHQucG9ydF8wX3JlZyA9CisJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0RJT19QT1JUXzBfUkVHOworCWluZm8tPmRpb19jb250ZXh0LnBvcnRfMV9yZWcgPQorCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9ESU9fUE9SVF8xX1JFRzsKKwlpbmZvLT5kaW9fY29udGV4dC5wb3J0XzJfcmVnID0KKwkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfRElPX1BPUlRfMl9SRUc7CisJaW5mby0+ZGlvX2NvbnRleHQucG9ydF8zX3JlZyA9CisJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0RJT19QT1JUXzNfUkVHOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9jbnRfY29udGV4dChjb21lZGlfZGV2aWNlICogZGV2KQoreworCisJQ0FMTF9QREVCVUcoIkluIGluaXRfY250X2NvbnRleHQoKVxuIik7CisKKwlpbmZvLT5jbnRfY29udGV4dC5jdHJsX3JlZyA9IGluZm8tPnRpbWVyX3JlZ2Jhc2UgKyBNRTQwMDBfQ05UX0NUUkxfUkVHOworCWluZm8tPmNudF9jb250ZXh0LmNvdW50ZXJfMF9yZWcgPQorCQlpbmZvLT50aW1lcl9yZWdiYXNlICsgTUU0MDAwX0NOVF9DT1VOVEVSXzBfUkVHOworCWluZm8tPmNudF9jb250ZXh0LmNvdW50ZXJfMV9yZWcgPQorCQlpbmZvLT50aW1lcl9yZWdiYXNlICsgTUU0MDAwX0NOVF9DT1VOVEVSXzFfUkVHOworCWluZm8tPmNudF9jb250ZXh0LmNvdW50ZXJfMl9yZWcgPQorCQlpbmZvLT50aW1lcl9yZWdiYXNlICsgTUU0MDAwX0NOVF9DT1VOVEVSXzJfUkVHOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgRklSTVdBUkVfTk9UX0FWQUlMQUJMRSAxCisjaWYgRklSTVdBUkVfTk9UX0FWQUlMQUJMRQorZXh0ZXJuIHVuc2lnbmVkIGNoYXIgKnhpbGlueF9maXJtOworI2VuZGlmCisKK3N0YXRpYyBpbnQgeGlsaW54X2Rvd25sb2FkKGNvbWVkaV9kZXZpY2UgKiBkZXYpCit7CisJdTMyIHZhbHVlID0gMDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBxdWV1ZTsKKwlpbnQgaWR4ID0gMDsKKwlpbnQgc2l6ZSA9IDA7CisKKwlDQUxMX1BERUJVRygiSW4geGlsaW54X2Rvd25sb2FkKClcbiIpOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmcXVldWUpOworCisJLyoKKwkgKiBTZXQgUExYIGxvY2FsIGludGVycnVwdCAyIHBvbGFyaXR5IHRvIGhpZ2guCisJICogSW50ZXJydXB0IGlzIHRocm93biBieSBpbml0IHBpbiBvZiB4aWxpbnguCisJICovCisJb3V0bCgweDEwLCBpbmZvLT5wbHhfcmVnYmFzZSArIFBMWF9JTlRDU1IpOworCisJLyogU2V0IC9DUyBhbmQgL1dSSVRFIG9mIHRoZSBYaWxpbnggKi8KKwl2YWx1ZSA9IGlubChpbmZvLT5wbHhfcmVnYmFzZSArIFBMWF9JQ1IpOworCXZhbHVlIHw9IDB4MTAwOworCW91dGwodmFsdWUsIGluZm8tPnBseF9yZWdiYXNlICsgUExYX0lDUik7CisKKwkvKiBJbml0IFhpbGlueCB3aXRoIENTMSAqLworCWluYihpbmZvLT5wcm9ncmFtX3JlZ2Jhc2UgKyAweEM4KTsKKworCS8qIFdhaXQgdW50aWwgL0lOSVQgcGluIGlzIHNldCAqLworCXVkZWxheSgyMCk7CisJaWYgKCFpbmwoaW5mby0+cGx4X3JlZ2Jhc2UgKyBQTFhfSU5UQ1NSKSAmIDB4MjApIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogeGlsaW54X2Rvd25sb2FkKCk6IENhbid0IGluaXQgWGlsaW54XG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIFJlc2V0IC9DUyBhbmQgL1dSSVRFIG9mIHRoZSBYaWxpbnggKi8KKwl2YWx1ZSA9IGlubChpbmZvLT5wbHhfcmVnYmFzZSArIFBMWF9JQ1IpOworCXZhbHVlICY9IH4weDEwMDsKKwlvdXRsKHZhbHVlLCBpbmZvLT5wbHhfcmVnYmFzZSArIFBMWF9JQ1IpOworCWlmIChGSVJNV0FSRV9OT1RfQVZBSUxBQkxFKSB7CisJCWNvbWVkaV9lcnJvcihkZXYsCisJCQkieGlsaW54IGZpcm13YXJlIHVuYXZhaWxhYmxlIGR1ZSB0byBsaWNlbnNpbmcsIGFib3J0aW5nIik7CisJCXJldHVybiAtRUlPOworCX0gZWxzZSB7CisJCS8qIERvd25sb2FkIFhpbGlueCBmaXJtd2FyZSAqLworCQlzaXplID0gKHhpbGlueF9maXJtWzBdIDw8IDI0KSArICh4aWxpbnhfZmlybVsxXSA8PCAxNikgKworCQkJKHhpbGlueF9maXJtWzJdIDw8IDgpICsgeGlsaW54X2Zpcm1bM107CisJCXVkZWxheSgxMCk7CisKKwkJZm9yIChpZHggPSAwOyBpZHggPCBzaXplOyBpZHgrKykgeworCQkJb3V0Yih4aWxpbnhfZmlybVsxNiArIGlkeF0sIGluZm8tPnByb2dyYW1fcmVnYmFzZSk7CisJCQl1ZGVsYXkoMTApOworCisJCQkvKiBDaGVjayBpZiBCVVNZIGZsYWcgaXMgbG93ICovCisJCQlpZiAoaW5sKGluZm8tPnBseF9yZWdiYXNlICsgUExYX0lDUikgJiAweDIwKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJCSJjb21lZGklZDogbWU0MDAwOiB4aWxpbnhfZG93bmxvYWQoKTogWGlsaW54IGlzIHN0aWxsIGJ1c3kgKGlkeCA9ICVkKVxuIiwKKwkJCQkJZGV2LT5taW5vciwgaWR4KTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJfQorCX0KKworCS8qIElmIGRvbmUgZmxhZyBpcyBoaWdoIGRvd25sb2FkIHdhcyBzdWNjZXNzZnVsICovCisJaWYgKGlubChpbmZvLT5wbHhfcmVnYmFzZSArIFBMWF9JQ1IpICYgMHg0KSB7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogeGlsaW54X2Rvd25sb2FkKCk6IERPTkUgZmxhZyBpcyBub3Qgc2V0XG4iLAorCQkJZGV2LT5taW5vcik7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IHhpbGlueF9kb3dubG9hZCgpOiBEb3dubG9hZCBub3Qgc3VjY2VzZnVsXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIFNldCAvQ1MgYW5kIC9XUklURSAqLworCXZhbHVlID0gaW5sKGluZm8tPnBseF9yZWdiYXNlICsgUExYX0lDUik7CisJdmFsdWUgfD0gMHgxMDA7CisJb3V0bCh2YWx1ZSwgaW5mby0+cGx4X3JlZ2Jhc2UgKyBQTFhfSUNSKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlc2V0X2JvYXJkKGNvbWVkaV9kZXZpY2UgKiBkZXYpCit7CisJdW5zaWduZWQgbG9uZyBpY3I7CisKKwlDQUxMX1BERUJVRygiSW4gcmVzZXRfYm9hcmQoKVxuIik7CisKKwkvKiBNYWtlIGEgaGFyZHdhcmUgcmVzZXQgKi8KKwlpY3IgPSBtZTQwMDBfaW5sKGRldiwgaW5mby0+cGx4X3JlZ2Jhc2UgKyBQTFhfSUNSKTsKKwlpY3IgfD0gMHg0MDAwMDAwMDsKKwltZTQwMDBfb3V0bChkZXYsIGljciwgaW5mby0+cGx4X3JlZ2Jhc2UgKyBQTFhfSUNSKTsKKwlpY3IgJj0gfjB4NDAwMDAwMDA7CisJbWU0MDAwX291dGwoZGV2LCBpY3IsIGluZm8tPnBseF9yZWdiYXNlICsgUExYX0lDUik7CisKKwkvKiAweDgwMDAgdG8gdGhlIERBQ3MgbWVhbnMgYW4gb3V0cHV0IHZvbHRhZ2Ugb2YgMFYgKi8KKwltZTQwMDBfb3V0bChkZXYsIDB4ODAwMCwKKwkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDBfU0lOR0xFX1JFRyk7CisJbWU0MDAwX291dGwoZGV2LCAweDgwMDAsCisJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPXzAxX1NJTkdMRV9SRUcpOworCW1lNDAwMF9vdXRsKGRldiwgMHg4MDAwLAorCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT18wMl9TSU5HTEVfUkVHKTsKKwltZTQwMDBfb3V0bChkZXYsIDB4ODAwMCwKKwkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDNfU0lOR0xFX1JFRyk7CisKKwkvKiBTZXQgYm90aCBzdG9wIGJpdHMgaW4gdGhlIGFuYWxvZyBpbnB1dCBjb250cm9sIHJlZ2lzdGVyICovCisJbWU0MDAwX291dGwoZGV2LAorCQlNRTQwMDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfCBNRTQwMDBfQUlfQ1RSTF9CSVRfU1RPUCwKKwkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQUlfQ1RSTF9SRUcpOworCisJLyogU2V0IGJvdGggc3RvcCBiaXRzIGluIHRoZSBhbmFsb2cgb3V0cHV0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwltZTQwMDBfb3V0bChkZXYsCisJCU1FNDAwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCB8IE1FNDAwMF9BT19DVFJMX0JJVF9TVE9QLAorCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT18wMF9DVFJMX1JFRyk7CisJbWU0MDAwX291dGwoZGV2LAorCQlNRTQwMDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfCBNRTQwMDBfQU9fQ1RSTF9CSVRfU1RPUCwKKwkJaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfQU9fMDFfQ1RSTF9SRUcpOworCW1lNDAwMF9vdXRsKGRldiwKKwkJTUU0MDAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QIHwgTUU0MDAwX0FPX0NUUkxfQklUX1NUT1AsCisJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0FPXzAyX0NUUkxfUkVHKTsKKwltZTQwMDBfb3V0bChkZXYsCisJCU1FNDAwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCB8IE1FNDAwMF9BT19DVFJMX0JJVF9TVE9QLAorCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT18wM19DVFJMX1JFRyk7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBvbiB0aGUgUExYICovCisJbWU0MDAwX291dGwoZGV2LCAweDQzLCBpbmZvLT5wbHhfcmVnYmFzZSArIFBMWF9JTlRDU1IpOworCisJLyogU2V0IHRoZSBhZHVzdG1lbnQgcmVnaXN0ZXIgZm9yIEFPIGRlbXV4ICovCisJbWU0MDAwX291dGwoZGV2LCBNRTQwMDBfQU9fREVNVVhfQURKVVNUX1ZBTFVFLAorCQlpbmZvLT5tZTQwMDBfcmVnYmFzZSArIE1FNDAwMF9BT19ERU1VWF9BREpVU1RfUkVHKTsKKworCS8qIFNldCBkaWdpdGFsIEkvTyBkaXJlY3Rpb24gZm9yIHBvcnQgMCB0byBvdXRwdXQgb24gaXNvbGF0ZWQgdmVyc2lvbnMgKi8KKwlpZiAoIShtZTQwMDBfaW5sKGRldiwgaW5mby0+bWU0MDAwX3JlZ2Jhc2UgKyBNRTQwMDBfRElPX0RJUl9SRUcpICYgMHgxKSkgeworCQltZTQwMDBfb3V0bChkZXYsIDB4MSwKKwkJCWluZm8tPm1lNDAwMF9yZWdiYXNlICsgTUU0MDAwX0RJT19DVFJMX1JFRyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWU0MDAwX2RldGFjaChjb21lZGlfZGV2aWNlICogZGV2KQoreworCUNBTExfUERFQlVHKCJJbiBtZTQwMDBfZGV0YWNoKClcbiIpOworCisJaWYgKGluZm8pIHsKKwkJaWYgKGluZm8tPnBjaV9kZXZfcCkgeworCQkJcmVzZXRfYm9hcmQoZGV2KTsKKwkJCWlmIChpbmZvLT5wbHhfcmVnYmFzZSkgeworCQkJCWNvbWVkaV9wY2lfZGlzYWJsZShpbmZvLT5wY2lfZGV2X3ApOworCQkJfQorCQkJcGNpX2Rldl9wdXQoaW5mby0+cGNpX2Rldl9wKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEFuYWxvZyBpbnB1dCBzZWN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgbWU0MDAwX2FpX2luc25fcmVhZChjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzdWJkZXZpY2UsIGNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworCisJaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwlpbnQgcmFuZyA9IENSX1JBTkdFKGluc24tPmNoYW5zcGVjKTsKKwlpbnQgYXJlZiA9IENSX0FSRUYoaW5zbi0+Y2hhbnNwZWMpOworCisJdW5zaWduZWQgbG9uZyBlbnRyeSA9IDA7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJbG9uZyBsdmFsOworCisJQ0FMTF9QREVCVUcoIkluIG1lNDAwMF9haV9pbnNuX3JlYWQoKVxuIik7CisKKwlpZiAoaW5zbi0+biA9PSAwKSB7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAoaW5zbi0+biA+IDEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2luc25fcmVhZCgpOiBJbnZhbGlkIGluc3RydWN0aW9uIGxlbmd0aCAlZFxuIiwKKwkJCWRldi0+bWlub3IsIGluc24tPm4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKHJhbmcpIHsKKwljYXNlIDA6CisJCWVudHJ5IHw9IE1FNDAwMF9BSV9MSVNUX1JBTkdFX1VOSVBPTEFSXzJfNTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQllbnRyeSB8PSBNRTQwMDBfQUlfTElTVF9SQU5HRV9VTklQT0xBUl8xMDsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQllbnRyeSB8PSBNRTQwMDBfQUlfTElTVF9SQU5HRV9CSVBPTEFSXzJfNTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQllbnRyeSB8PSBNRTQwMDBfQUlfTElTVF9SQU5HRV9CSVBPTEFSXzEwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfaW5zbl9yZWFkKCk6IEludmFsaWQgcmFuZ2Ugc3BlY2lmaWVkXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoYXJlZikgeworCWNhc2UgQVJFRl9HUk9VTkQ6CisJY2FzZSBBUkVGX0NPTU1PTjoKKwkJaWYgKGNoYW4gPj0gdGhpc2JvYXJkLT5haS5jb3VudCkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9pbnNuX3JlYWQoKTogQW5hbG9nIGlucHV0IGlzIG5vdCBhdmFpbGFibGVcbiIsCisJCQkJZGV2LT5taW5vcik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQllbnRyeSB8PSBNRTQwMDBfQUlfTElTVF9JTlBVVF9TSU5HTEVfRU5ERUQgfCBjaGFuOworCQlicmVhazsKKworCWNhc2UgQVJFRl9ESUZGOgorCQlpZiAocmFuZyA9PSAwIHx8IHJhbmcgPT0gMSkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9pbnNuX3JlYWQoKTogUmFuZ2UgbXVzdCBiZSBiaXBvbGFyIHdoZW4gYXJlZiA9IGRpZmZcbiIsCisJCQkJZGV2LT5taW5vcik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChjaGFuID49IHRoaXNib2FyZC0+YWkuZGlmZl9jb3VudCkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9pbnNuX3JlYWQoKTogQW5hbG9nIGlucHV0IGlzIG5vdCBhdmFpbGFibGVcbiIsCisJCQkJZGV2LT5taW5vcik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQllbnRyeSB8PSBNRTQwMDBfQUlfTElTVF9JTlBVVF9ESUZGRVJFTlRJQUwgfCBjaGFuOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfaW5zbl9yZWFkKCk6IEludmFsaWQgYXJlZiBzcGVjaWZpZWRcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZW50cnkgfD0gTUU0MDAwX0FJX0xJU1RfTEFTVF9FTlRSWTsKKworCS8qIENsZWFyIGNoYW5uZWwgbGlzdCwgZGF0YSBmaWZvIGFuZCBib3RoIHN0b3AgYml0cyAqLworCXRtcCA9IG1lNDAwMF9pbmwoZGV2LCBpbmZvLT5haV9jb250ZXh0LmN0cmxfcmVnKTsKKwl0bXAgJj0gfihNRTQwMDBfQUlfQ1RSTF9CSVRfQ0hBTk5FTF9GSUZPIHwKKwkJTUU0MDAwX0FJX0NUUkxfQklUX0RBVEFfRklGTyB8CisJCU1FNDAwMF9BSV9DVFJMX0JJVF9TVE9QIHwgTUU0MDAwX0FJX0NUUkxfQklUX0lNTUVESUFURV9TVE9QKTsKKwltZTQwMDBfb3V0bChkZXYsIHRtcCwgaW5mby0+YWlfY29udGV4dC5jdHJsX3JlZyk7CisKKwkvKiBTZXQgdGhlIGFjcXVpc2l0aW9uIG1vZGUgdG8gc2luZ2xlICovCisJdG1wICY9IH4oTUU0MDAwX0FJX0NUUkxfQklUX01PREVfMCB8IE1FNDAwMF9BSV9DVFJMX0JJVF9NT0RFXzEgfAorCQlNRTQwMDBfQUlfQ1RSTF9CSVRfTU9ERV8yKTsKKwltZTQwMDBfb3V0bChkZXYsIHRtcCwgaW5mby0+YWlfY29udGV4dC5jdHJsX3JlZyk7CisKKwkvKiBFbmFibGUgY2hhbm5lbCBsaXN0IGFuZCBkYXRhIGZpZm8gKi8KKwl0bXAgfD0gTUU0MDAwX0FJX0NUUkxfQklUX0NIQU5ORUxfRklGTyB8IE1FNDAwMF9BSV9DVFJMX0JJVF9EQVRBX0ZJRk87CisJbWU0MDAwX291dGwoZGV2LCB0bXAsIGluZm8tPmFpX2NvbnRleHQuY3RybF9yZWcpOworCisJLyogR2VuZXJhdGUgY2hhbm5lbCBsaXN0IGVudHJ5ICovCisJbWU0MDAwX291dGwoZGV2LCBlbnRyeSwgaW5mby0+YWlfY29udGV4dC5jaGFubmVsX2xpc3RfcmVnKTsKKworCS8qIFNldCB0aGUgdGltZXIgdG8gbWF4aW11bSBzYW1wbGUgcmF0ZSAqLworCW1lNDAwMF9vdXRsKGRldiwgTUU0MDAwX0FJX01JTl9USUNLUywgaW5mby0+YWlfY29udGV4dC5jaGFuX3RpbWVyX3JlZyk7CisJbWU0MDAwX291dGwoZGV2LCBNRTQwMDBfQUlfTUlOX1RJQ0tTLAorCQlpbmZvLT5haV9jb250ZXh0LmNoYW5fcHJlX3RpbWVyX3JlZyk7CisKKwkvKiBTdGFydCBjb252ZXJzaW9uIGJ5IGR1bW15IHJlYWQgKi8KKwltZTQwMDBfaW5sKGRldiwgaW5mby0+YWlfY29udGV4dC5zdGFydF9yZWcpOworCisJLyogV2FpdCB1bnRpbCByZWFkeSAqLworCXVkZWxheSgxMCk7CisJaWYgKCEobWU0MDAwX2lubChkZXYsIGluZm8tPmFpX2NvbnRleHQuCisJCQkJc3RhdHVzX3JlZykgJiBNRTQwMDBfQUlfU1RBVFVTX0JJVF9FRl9EQVRBKSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfaW5zbl9yZWFkKCk6IFZhbHVlIG5vdCBhdmFpbGFibGUgYWZ0ZXIgd2FpdFxuIiwKKwkJCWRldi0+bWlub3IpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBSZWFkIHZhbHVlIGZyb20gZGF0YSBmaWZvICovCisJbHZhbCA9IG1lNDAwMF9pbmwoZGV2LCBpbmZvLT5haV9jb250ZXh0LmRhdGFfcmVnKSAmIDB4RkZGRjsKKwlkYXRhWzBdID0gbHZhbCBeIDB4ODAwMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IG1lNDAwMF9haV9jYW5jZWwoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMpCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisKKwlDQUxMX1BERUJVRygiSW4gbWU0MDAwX2FpX2NhbmNlbCgpXG4iKTsKKworCS8qIFN0b3AgYW55IHJ1bm5pbmcgY29udmVyc2lvbiAqLworCXRtcCA9IG1lNDAwMF9pbmwoZGV2LCBpbmZvLT5haV9jb250ZXh0LmN0cmxfcmVnKTsKKwl0bXAgJj0gfihNRTQwMDBfQUlfQ1RSTF9CSVRfU1RPUCB8IE1FNDAwMF9BSV9DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCk7CisJbWU0MDAwX291dGwoZGV2LCB0bXAsIGluZm8tPmFpX2NvbnRleHQuY3RybF9yZWcpOworCisJLyogQ2xlYXIgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwltZTQwMDBfb3V0bChkZXYsIDB4MCwgaW5mby0+YWlfY29udGV4dC5jdHJsX3JlZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhaV9jaGVja19jaGFubGlzdChjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCBjb21lZGlfY21kICogY21kKQoreworCWludCBhcmVmOworCWludCBpOworCisJQ0FMTF9QREVCVUcoIkluIGFpX2NoZWNrX2NoYW5saXN0KClcbiIpOworCisJLyogQ2hlY2sgd2hldGhlciBhIGNoYW5uZWwgbGlzdCBpcyBhdmFpbGFibGUgKi8KKwlpZiAoIWNtZC0+Y2hhbmxpc3RfbGVuKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IGFpX2NoZWNrX2NoYW5saXN0KCk6IE5vIGNoYW5uZWwgbGlzdCBhdmFpbGFibGVcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQ2hlY2sgdGhlIGNoYW5uZWwgbGlzdCBzaXplICovCisJaWYgKGNtZC0+Y2hhbmxpc3RfbGVuID4gTUU0MDAwX0FJX0NIQU5ORUxfTElTVF9DT1VOVCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBhaV9jaGVja19jaGFubGlzdCgpOiBDaGFubmVsIGxpc3QgaXMgdG8gbGFyZ2VcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQ2hlY2sgdGhlIHBvaW50ZXIgKi8KKwlpZiAoIWNtZC0+Y2hhbmxpc3QpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogYWlfY2hlY2tfY2hhbmxpc3QoKTogTlVMTCBwb2ludGVyIHRvIGNoYW5uZWwgbGlzdFxuIiwKKwkJCWRldi0+bWlub3IpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwkvKiBDaGVjayB3aGV0aGVyIGFyZWYgaXMgZXF1YWwgZm9yIGFsbCBlbnRyaWVzICovCisJYXJlZiA9IENSX0FSRUYoY21kLT5jaGFubGlzdFswXSk7CisJZm9yIChpID0gMDsgaSA8IGNtZC0+Y2hhbmxpc3RfbGVuOyBpKyspIHsKKwkJaWYgKENSX0FSRUYoY21kLT5jaGFubGlzdFtpXSkgIT0gYXJlZikgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IGFpX2NoZWNrX2NoYW5saXN0KCk6IE1vZGUgaXMgbm90IGVxdWFsIGZvciBhbGwgZW50cmllc1xuIiwKKwkJCQlkZXYtPm1pbm9yKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJLyogQ2hlY2sgd2hldGhlciBjaGFubmVscyBhcmUgYXZhaWxhYmxlIGZvciB0aGlzIGVuZGluZyAqLworCWlmIChhcmVmID09IFNERl9ESUZGKSB7CisJCWZvciAoaSA9IDA7IGkgPCBjbWQtPmNoYW5saXN0X2xlbjsgaSsrKSB7CisJCQlpZiAoQ1JfQ0hBTihjbWQtPmNoYW5saXN0W2ldKSA+PQorCQkJCXRoaXNib2FyZC0+YWkuZGlmZl9jb3VudCkgeworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCQkiY29tZWRpJWQ6IG1lNDAwMDogYWlfY2hlY2tfY2hhbmxpc3QoKTogQ2hhbm5lbCBudW1iZXIgdG8gaGlnaFxuIiwKKwkJCQkJZGV2LT5taW5vcik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgY21kLT5jaGFubGlzdF9sZW47IGkrKykgeworCQkJaWYgKENSX0NIQU4oY21kLT5jaGFubGlzdFtpXSkgPj0gdGhpc2JvYXJkLT5haS5jb3VudCkgeworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCQkiY29tZWRpJWQ6IG1lNDAwMDogYWlfY2hlY2tfY2hhbmxpc3QoKTogQ2hhbm5lbCBudW1iZXIgdG8gaGlnaFxuIiwKKwkJCQkJZGV2LT5taW5vcik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0KKwl9CisKKwkvKiBDaGVjayBpZiBiaXBvbGFyIGlzIHNldCBmb3IgYWxsIGVudHJpZXMgd2hlbiBpbiBkaWZmZXJlbnRpYWwgbW9kZSAqLworCWlmIChhcmVmID09IFNERl9ESUZGKSB7CisJCWZvciAoaSA9IDA7IGkgPCBjbWQtPmNoYW5saXN0X2xlbjsgaSsrKSB7CisJCQlpZiAoQ1JfUkFOR0UoY21kLT5jaGFubGlzdFtpXSkgIT0gMSAmJgorCQkJCUNSX1JBTkdFKGNtZC0+Y2hhbmxpc3RbaV0pICE9IDIpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkJImNvbWVkaSVkOiBtZTQwMDA6IGFpX2NoZWNrX2NoYW5saXN0KCk6IEJpcG9sYXIgaXMgbm90IHNlbGVjdGVkIGluIGRpZmZlcmVudGlhbCBtb2RlXG4iLAorCQkJCQlkZXYtPm1pbm9yKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFpX3JvdW5kX2NtZF9hcmdzKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2NtZCAqIGNtZCwKKwl1bnNpZ25lZCBpbnQgKmluaXRfdGlja3MsCisJdW5zaWduZWQgaW50ICpzY2FuX3RpY2tzLCB1bnNpZ25lZCBpbnQgKmNoYW5fdGlja3MpCit7CisKKwlpbnQgcmVzdDsKKworCUNBTExfUERFQlVHKCJJbiBhaV9yb3VuZF9jbWRfYXJncygpXG4iKTsKKworCSppbml0X3RpY2tzID0gMDsKKwkqc2Nhbl90aWNrcyA9IDA7CisJKmNoYW5fdGlja3MgPSAwOworCisJUERFQlVHKCJhaV9yb3VuZF9jbWRfYXJnKCk6IHN0YXJ0X2FyZyA9ICVkXG4iLCBjbWQtPnN0YXJ0X2FyZyk7CisJUERFQlVHKCJhaV9yb3VuZF9jbWRfYXJnKCk6IHNjYW5fYmVnaW5fYXJnID0gJWRcbiIsCisJCWNtZC0+c2Nhbl9iZWdpbl9hcmcpOworCVBERUJVRygiYWlfcm91bmRfY21kX2FyZygpOiBjb252ZXJ0X2FyZyA9ICVkXG4iLCBjbWQtPmNvbnZlcnRfYXJnKTsKKworCWlmIChjbWQtPnN0YXJ0X2FyZykgeworCQkqaW5pdF90aWNrcyA9IChjbWQtPnN0YXJ0X2FyZyAqIDMzKSAvIDEwMDA7CisJCXJlc3QgPSAoY21kLT5zdGFydF9hcmcgKiAzMykgJSAxMDAwOworCisJCWlmIChjbWQtPmZsYWdzICYgVFJJR19ST1VORF9ORUFSRVNUKSB7CisJCQlpZiAocmVzdCA+IDMzKSB7CisJCQkJKCppbml0X3RpY2tzKSsrOworCQkJfQorCQl9IGVsc2UgaWYgKGNtZC0+ZmxhZ3MgJiBUUklHX1JPVU5EX1VQKSB7CisJCQlpZiAocmVzdCkKKwkJCQkoKmluaXRfdGlja3MpKys7CisJCX0KKwl9CisKKwlpZiAoY21kLT5zY2FuX2JlZ2luX2FyZykgeworCQkqc2Nhbl90aWNrcyA9IChjbWQtPnNjYW5fYmVnaW5fYXJnICogMzMpIC8gMTAwMDsKKwkJcmVzdCA9IChjbWQtPnNjYW5fYmVnaW5fYXJnICogMzMpICUgMTAwMDsKKworCQlpZiAoY21kLT5mbGFncyAmIFRSSUdfUk9VTkRfTkVBUkVTVCkgeworCQkJaWYgKHJlc3QgPiAzMykgeworCQkJCSgqc2Nhbl90aWNrcykrKzsKKwkJCX0KKwkJfSBlbHNlIGlmIChjbWQtPmZsYWdzICYgVFJJR19ST1VORF9VUCkgeworCQkJaWYgKHJlc3QpCisJCQkJKCpzY2FuX3RpY2tzKSsrOworCQl9CisJfQorCisJaWYgKGNtZC0+Y29udmVydF9hcmcpIHsKKwkJKmNoYW5fdGlja3MgPSAoY21kLT5jb252ZXJ0X2FyZyAqIDMzKSAvIDEwMDA7CisJCXJlc3QgPSAoY21kLT5jb252ZXJ0X2FyZyAqIDMzKSAlIDEwMDA7CisKKwkJaWYgKGNtZC0+ZmxhZ3MgJiBUUklHX1JPVU5EX05FQVJFU1QpIHsKKwkJCWlmIChyZXN0ID4gMzMpIHsKKwkJCQkoKmNoYW5fdGlja3MpKys7CisJCQl9CisJCX0gZWxzZSBpZiAoY21kLT5mbGFncyAmIFRSSUdfUk9VTkRfVVApIHsKKwkJCWlmIChyZXN0KQorCQkJCSgqY2hhbl90aWNrcykrKzsKKwkJfQorCX0KKworCVBERUJVRygiYWlfcm91bmRfY21kX2FyZ3MoKTogaW5pdF90aWNrcyA9ICVkXG4iLCAqaW5pdF90aWNrcyk7CisJUERFQlVHKCJhaV9yb3VuZF9jbWRfYXJncygpOiBzY2FuX3RpY2tzID0gJWRcbiIsICpzY2FuX3RpY2tzKTsKKwlQREVCVUcoImFpX3JvdW5kX2NtZF9hcmdzKCk6IGNoYW5fdGlja3MgPSAlZFxuIiwgKmNoYW5fdGlja3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFpX3dyaXRlX3RpbWVyKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJdW5zaWduZWQgaW50IGluaXRfdGlja3MsCisJdW5zaWduZWQgaW50IHNjYW5fdGlja3MsIHVuc2lnbmVkIGludCBjaGFuX3RpY2tzKQoreworCisJQ0FMTF9QREVCVUcoIkluIGFpX3dyaXRlX3RpbWVyKClcbiIpOworCisJbWU0MDAwX291dGwoZGV2LCBpbml0X3RpY2tzIC0gMSwKKwkJaW5mby0+YWlfY29udGV4dC5zY2FuX3ByZV90aW1lcl9sb3dfcmVnKTsKKwltZTQwMDBfb3V0bChkZXYsIDB4MCwgaW5mby0+YWlfY29udGV4dC5zY2FuX3ByZV90aW1lcl9oaWdoX3JlZyk7CisKKwlpZiAoc2Nhbl90aWNrcykgeworCQltZTQwMDBfb3V0bChkZXYsIHNjYW5fdGlja3MgLSAxLAorCQkJaW5mby0+YWlfY29udGV4dC5zY2FuX3RpbWVyX2xvd19yZWcpOworCQltZTQwMDBfb3V0bChkZXYsIDB4MCwgaW5mby0+YWlfY29udGV4dC5zY2FuX3RpbWVyX2hpZ2hfcmVnKTsKKwl9CisKKwltZTQwMDBfb3V0bChkZXYsIGNoYW5fdGlja3MgLSAxLCBpbmZvLT5haV9jb250ZXh0LmNoYW5fcHJlX3RpbWVyX3JlZyk7CisJbWU0MDAwX291dGwoZGV2LCBjaGFuX3RpY2tzIC0gMSwgaW5mby0+YWlfY29udGV4dC5jaGFuX3RpbWVyX3JlZyk7Cit9CisKK3N0YXRpYyBpbnQgYWlfcHJlcGFyZShjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9jbWQgKiBjbWQsCisJdW5zaWduZWQgaW50IGluaXRfdGlja3MsCisJdW5zaWduZWQgaW50IHNjYW5fdGlja3MsIHVuc2lnbmVkIGludCBjaGFuX3RpY2tzKQoreworCisJdW5zaWduZWQgbG9uZyB0bXAgPSAwOworCisJQ0FMTF9QREVCVUcoIkluIGFpX3ByZXBhcmUoKVxuIik7CisKKwkvKiBXcml0ZSB0aW1lciBhcmd1bWVudHMgKi8KKwlhaV93cml0ZV90aW1lcihkZXYsIGluaXRfdGlja3MsIHNjYW5fdGlja3MsIGNoYW5fdGlja3MpOworCisJLyogUmVzZXQgY29udHJvbCByZWdpc3RlciAqLworCW1lNDAwMF9vdXRsKGRldiwgdG1wLCBpbmZvLT5haV9jb250ZXh0LmN0cmxfcmVnKTsKKworCS8qIFN0YXJ0IHNvdXJjZXMgKi8KKwlpZiAoKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfRVhUICYmCisJCQljbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIgJiYKKwkJCWNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgfHwKKwkJKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfRVhUICYmCisJCQljbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRk9MTE9XICYmCisJCQljbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpKSB7CisJCXRtcCA9IE1FNDAwMF9BSV9DVFJMX0JJVF9NT0RFXzEgfAorCQkJTUU0MDAwX0FJX0NUUkxfQklUX0NIQU5ORUxfRklGTyB8CisJCQlNRTQwMDBfQUlfQ1RSTF9CSVRfREFUQV9GSUZPOworCX0gZWxzZSBpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19FWFQgJiYKKwkJY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0VYVCAmJgorCQljbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKKwkJdG1wID0gTUU0MDAwX0FJX0NUUkxfQklUX01PREVfMiB8CisJCQlNRTQwMDBfQUlfQ1RSTF9CSVRfQ0hBTk5FTF9GSUZPIHwKKwkJCU1FNDAwMF9BSV9DVFJMX0JJVF9EQVRBX0ZJRk87CisJfSBlbHNlIGlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX0VYVCAmJgorCQljbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRVhUICYmCisJCWNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19FWFQpIHsKKwkJdG1wID0gTUU0MDAwX0FJX0NUUkxfQklUX01PREVfMCB8CisJCQlNRTQwMDBfQUlfQ1RSTF9CSVRfTU9ERV8xIHwKKwkJCU1FNDAwMF9BSV9DVFJMX0JJVF9DSEFOTkVMX0ZJRk8gfAorCQkJTUU0MDAwX0FJX0NUUkxfQklUX0RBVEFfRklGTzsKKwl9IGVsc2UgeworCQl0bXAgPSBNRTQwMDBfQUlfQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCU1FNDAwMF9BSV9DVFJMX0JJVF9DSEFOTkVMX0ZJRk8gfAorCQkJTUU0MDAwX0FJX0NUUkxfQklUX0RBVEFfRklGTzsKKwl9CisKKwkvKiBTdG9wIHRyaWdnZXJzICovCisJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkgeworCQltZTQwMDBfb3V0bChkZXYsIGNtZC0+Y2hhbmxpc3RfbGVuICogY21kLT5zdG9wX2FyZywKKwkJCWluZm8tPmFpX2NvbnRleHQuc2FtcGxlX2NvdW50ZXJfcmVnKTsKKwkJdG1wIHw9IE1FNDAwMF9BSV9DVFJMX0JJVF9IRl9JUlEgfCBNRTQwMDBfQUlfQ1RSTF9CSVRfU0NfSVJROworCX0gZWxzZSBpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX05PTkUgJiYKKwkJY21kLT5zY2FuX2VuZF9zcmMgPT0gVFJJR19DT1VOVCkgeworCQltZTQwMDBfb3V0bChkZXYsIGNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJaW5mby0+YWlfY29udGV4dC5zYW1wbGVfY291bnRlcl9yZWcpOworCQl0bXAgfD0gTUU0MDAwX0FJX0NUUkxfQklUX0hGX0lSUSB8IE1FNDAwMF9BSV9DVFJMX0JJVF9TQ19JUlE7CisJfSBlbHNlIHsKKwkJdG1wIHw9IE1FNDAwMF9BSV9DVFJMX0JJVF9IRl9JUlE7CisJfQorCisJLyogV3JpdGUgdGhlIHNldHVwIHRvIHRoZSBjb250cm9sIHJlZ2lzdGVyICovCisJbWU0MDAwX291dGwoZGV2LCB0bXAsIGluZm8tPmFpX2NvbnRleHQuY3RybF9yZWcpOworCisJLyogV3JpdGUgdGhlIGNoYW5uZWwgbGlzdCAqLworCWFpX3dyaXRlX2NoYW5saXN0KGRldiwgcywgY21kKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFpX3dyaXRlX2NoYW5saXN0KGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9jbWQgKiBjbWQpCit7CisJdW5zaWduZWQgaW50IGVudHJ5OworCXVuc2lnbmVkIGludCBjaGFuOworCXVuc2lnbmVkIGludCByYW5nOworCXVuc2lnbmVkIGludCBhcmVmOworCWludCBpOworCisJQ0FMTF9QREVCVUcoIkluIGFpX3dyaXRlX2NoYW5saXN0KClcbiIpOworCisJZm9yIChpID0gMDsgaSA8IGNtZC0+Y2hhbmxpc3RfbGVuOyBpKyspIHsKKwkJY2hhbiA9IENSX0NIQU4oY21kLT5jaGFubGlzdFtpXSk7CisJCXJhbmcgPSBDUl9SQU5HRShjbWQtPmNoYW5saXN0W2ldKTsKKwkJYXJlZiA9IENSX0FSRUYoY21kLT5jaGFubGlzdFtpXSk7CisKKwkJZW50cnkgPSBjaGFuOworCisJCWlmIChyYW5nID09IDApIHsKKwkJCWVudHJ5IHw9IE1FNDAwMF9BSV9MSVNUX1JBTkdFX1VOSVBPTEFSXzJfNTsKKwkJfSBlbHNlIGlmIChyYW5nID09IDEpIHsKKwkJCWVudHJ5IHw9IE1FNDAwMF9BSV9MSVNUX1JBTkdFX1VOSVBPTEFSXzEwOworCQl9IGVsc2UgaWYgKHJhbmcgPT0gMikgeworCQkJZW50cnkgfD0gTUU0MDAwX0FJX0xJU1RfUkFOR0VfQklQT0xBUl8yXzU7CisJCX0gZWxzZSB7CisJCQllbnRyeSB8PSBNRTQwMDBfQUlfTElTVF9SQU5HRV9CSVBPTEFSXzEwOworCQl9CisKKwkJaWYgKGFyZWYgPT0gU0RGX0RJRkYpIHsKKwkJCWVudHJ5IHw9IE1FNDAwMF9BSV9MSVNUX0lOUFVUX0RJRkZFUkVOVElBTDsKKwkJfSBlbHNlIHsKKwkJCWVudHJ5IHw9IE1FNDAwMF9BSV9MSVNUX0lOUFVUX1NJTkdMRV9FTkRFRDsKKwkJfQorCisJCW1lNDAwMF9vdXRsKGRldiwgZW50cnksIGluZm8tPmFpX2NvbnRleHQuY2hhbm5lbF9saXN0X3JlZyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWU0MDAwX2FpX2RvX2NtZChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcykKK3sKKwlpbnQgZXJyOworCXVuc2lnbmVkIGludCBpbml0X3RpY2tzID0gMDsKKwl1bnNpZ25lZCBpbnQgc2Nhbl90aWNrcyA9IDA7CisJdW5zaWduZWQgaW50IGNoYW5fdGlja3MgPSAwOworCWNvbWVkaV9jbWQgKmNtZCA9ICZzLT5hc3luYy0+Y21kOworCisJQ0FMTF9QREVCVUcoIkluIG1lNDAwMF9haV9kb19jbWQoKVxuIik7CisKKwkvKiBSZXNldCB0aGUgYW5hbG9nIGlucHV0ICovCisJZXJyID0gbWU0MDAwX2FpX2NhbmNlbChkZXYsIHMpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBSb3VuZCB0aGUgdGltZXIgYXJndW1lbnRzICovCisJZXJyID0gYWlfcm91bmRfY21kX2FyZ3MoZGV2LAorCQlzLCBjbWQsICZpbml0X3RpY2tzLCAmc2Nhbl90aWNrcywgJmNoYW5fdGlja3MpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBQcmVwYXJlIHRoZSBBSSBmb3IgYWNxdWlzaXRpb24gKi8KKwllcnIgPSBhaV9wcmVwYXJlKGRldiwgcywgY21kLCBpbml0X3RpY2tzLCBzY2FuX3RpY2tzLCBjaGFuX3RpY2tzKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogU3RhcnQgYWNxdWlzdGlvbiBieSBkdW1teSByZWFkICovCisJbWU0MDAwX2lubChkZXYsIGluZm8tPmFpX2NvbnRleHQuc3RhcnRfcmVnKTsKKworCXJldHVybiAwOworfQorCisvKgorICogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6CisgKgorICogVGhlIGRlbW8gY21kLmMgaW4gLi9jb21lZGlsaWIvZGVtbyBzcGVjaWZpZXMgNiByZXR1cm4gdmFsdWVzOgorICogLSBzdWNjZXNzCisgKiAtIGludmFsaWQgc291cmNlCisgKiAtIHNvdXJjZSBjb25mbGljdAorICogLSBpbnZhbGlkIGFyZ3VtZW50CisgKiAtIGFyZ3VtZW50IGNvbmZsaWN0CisgKiAtIGludmFsaWQgY2hhbmxpc3QKKyAqIFNvIEkgdHJpZWQgdG8gYWRvcHQgdGhpcyBzY2hlbWUuCisgKi8KK3N0YXRpYyBpbnQgbWU0MDAwX2FpX2RvX2NtZF90ZXN0KGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9jbWQgKiBjbWQpCit7CisKKwl1bnNpZ25lZCBpbnQgaW5pdF90aWNrczsKKwl1bnNpZ25lZCBpbnQgY2hhbl90aWNrczsKKwl1bnNpZ25lZCBpbnQgc2Nhbl90aWNrczsKKwlpbnQgZXJyID0gMDsKKworCUNBTExfUERFQlVHKCJJbiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKVxuIik7CisKKwlQREVCVUcoIm1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBzdWJkZXYgICAgICAgICA9ICVkXG4iLCBjbWQtPnN1YmRldik7CisJUERFQlVHKCJtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogZmxhZ3MgICAgICAgICAgPSAlMDhYXG4iLCBjbWQtPmZsYWdzKTsKKwlQREVCVUcoIm1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBzdGFydF9zcmMgICAgICA9ICUwOFhcbiIsCisJCWNtZC0+c3RhcnRfc3JjKTsKKwlQREVCVUcoIm1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBzdGFydF9hcmcgICAgICA9ICVkXG4iLAorCQljbWQtPnN0YXJ0X2FyZyk7CisJUERFQlVHKCJtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogc2Nhbl9iZWdpbl9zcmMgPSAlMDhYXG4iLAorCQljbWQtPnNjYW5fYmVnaW5fc3JjKTsKKwlQREVCVUcoIm1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBzY2FuX2JlZ2luX2FyZyA9ICVkXG4iLAorCQljbWQtPnNjYW5fYmVnaW5fYXJnKTsKKwlQREVCVUcoIm1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBjb252ZXJ0X3NyYyAgICA9ICUwOFhcbiIsCisJCWNtZC0+Y29udmVydF9zcmMpOworCVBERUJVRygibWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IGNvbnZlcnRfYXJnICAgID0gJWRcbiIsCisJCWNtZC0+Y29udmVydF9hcmcpOworCVBERUJVRygibWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IHNjYW5fZW5kX3NyYyAgID0gJTA4WFxuIiwKKwkJY21kLT5zY2FuX2VuZF9zcmMpOworCVBERUJVRygibWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IHNjYW5fZW5kX2FyZyAgID0gJWRcbiIsCisJCWNtZC0+c2Nhbl9lbmRfYXJnKTsKKwlQREVCVUcoIm1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBzdG9wX3NyYyAgICAgICA9ICUwOFhcbiIsCisJCWNtZC0+c3RvcF9zcmMpOworCVBERUJVRygibWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IHN0b3BfYXJnICAgICAgID0gJWRcbiIsIGNtZC0+c3RvcF9hcmcpOworCVBERUJVRygibWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IGNoYW5saXN0ICAgICAgID0gJWRcbiIsCisJCSh1bnNpZ25lZCBpbnQpY21kLT5jaGFubGlzdCk7CisJUERFQlVHKCJtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogY2hhbmxpc3RfbGVuICAgPSAlZFxuIiwKKwkJY21kLT5jaGFubGlzdF9sZW4pOworCisJLyogT25seSByb3VuZGluZyBmbGFncyBhcmUgaW1wbGVtZW50ZWQgKi8KKwljbWQtPmZsYWdzICY9IFRSSUdfUk9VTkRfTkVBUkVTVCB8IFRSSUdfUk9VTkRfVVAgfCBUUklHX1JPVU5EX0RPV047CisKKwkvKiBSb3VuZCB0aGUgdGltZXIgYXJndW1lbnRzICovCisJYWlfcm91bmRfY21kX2FyZ3MoZGV2LCBzLCBjbWQsICZpbml0X3RpY2tzLCAmc2Nhbl90aWNrcywgJmNoYW5fdGlja3MpOworCisJLyoKKwkgKiBTdGFnZSAxLiBDaGVjayBpZiB0aGUgdHJpZ2dlciBzb3VyY2VzIGFyZSBnZW5lcmFsbHkgdmFsaWQuCisJICovCisJc3dpdGNoIChjbWQtPnN0YXJ0X3NyYykgeworCWNhc2UgVFJJR19OT1c6CisJY2FzZSBUUklHX0VYVDoKKwkJYnJlYWs7CisJY2FzZSBUUklHX0FOWToKKwkJY21kLT5zdGFydF9zcmMgJj0gVFJJR19OT1cgfCBUUklHX0VYVDsKKwkJZXJyKys7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIHN0YXJ0IHNvdXJjZVxuIiwKKwkJCWRldi0+bWlub3IpOworCQljbWQtPnN0YXJ0X3NyYyA9IFRSSUdfTk9XOworCQllcnIrKzsKKwl9CisJc3dpdGNoIChjbWQtPnNjYW5fYmVnaW5fc3JjKSB7CisJY2FzZSBUUklHX0ZPTExPVzoKKwljYXNlIFRSSUdfVElNRVI6CisJY2FzZSBUUklHX0VYVDoKKwkJYnJlYWs7CisJY2FzZSBUUklHX0FOWToKKwkJY21kLT5zY2FuX2JlZ2luX3NyYyAmPSBUUklHX0ZPTExPVyB8IFRSSUdfVElNRVIgfCBUUklHX0VYVDsKKwkJZXJyKys7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIHNjYW4gYmVnaW4gc291cmNlXG4iLAorCQkJZGV2LT5taW5vcik7CisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgPSBUUklHX0ZPTExPVzsKKwkJZXJyKys7CisJfQorCXN3aXRjaCAoY21kLT5jb252ZXJ0X3NyYykgeworCWNhc2UgVFJJR19USU1FUjoKKwljYXNlIFRSSUdfRVhUOgorCQlicmVhazsKKwljYXNlIFRSSUdfQU5ZOgorCQljbWQtPmNvbnZlcnRfc3JjICY9IFRSSUdfVElNRVIgfCBUUklHX0VYVDsKKwkJZXJyKys7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIGNvbnZlcnQgc291cmNlXG4iLAorCQkJZGV2LT5taW5vcik7CisJCWNtZC0+Y29udmVydF9zcmMgPSBUUklHX1RJTUVSOworCQllcnIrKzsKKwl9CisJc3dpdGNoIChjbWQtPnNjYW5fZW5kX3NyYykgeworCWNhc2UgVFJJR19OT05FOgorCWNhc2UgVFJJR19DT1VOVDoKKwkJYnJlYWs7CisJY2FzZSBUUklHX0FOWToKKwkJY21kLT5zY2FuX2VuZF9zcmMgJj0gVFJJR19OT05FIHwgVFJJR19DT1VOVDsKKwkJZXJyKys7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIHNjYW4gZW5kIHNvdXJjZVxuIiwKKwkJCWRldi0+bWlub3IpOworCQljbWQtPnNjYW5fZW5kX3NyYyA9IFRSSUdfTk9ORTsKKwkJZXJyKys7CisJfQorCXN3aXRjaCAoY21kLT5zdG9wX3NyYykgeworCWNhc2UgVFJJR19OT05FOgorCWNhc2UgVFJJR19DT1VOVDoKKwkJYnJlYWs7CisJY2FzZSBUUklHX0FOWToKKwkJY21kLT5zdG9wX3NyYyAmPSBUUklHX05PTkUgfCBUUklHX0NPVU5UOworCQllcnIrKzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IEludmFsaWQgc3RvcCBzb3VyY2VcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJY21kLT5zdG9wX3NyYyA9IFRSSUdfTk9ORTsKKwkJZXJyKys7CisJfQorCWlmIChlcnIpIHsKKwkJcmV0dXJuIDE7CisJfQorCisJLyoKKwkgKiBTdGFnZSAyLiBDaGVjayBmb3IgdHJpZ2dlciBzb3VyY2UgY29uZmxpY3RzLgorCSAqLworCWlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX05PVyAmJgorCQljbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIgJiYKKwkJY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CisJfSBlbHNlIGlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX05PVyAmJgorCQljbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRk9MTE9XICYmCisJCWNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCX0gZWxzZSBpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19FWFQgJiYKKwkJY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSICYmCisJCWNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCX0gZWxzZSBpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19FWFQgJiYKKwkJY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0ZPTExPVyAmJgorCQljbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKKwl9IGVsc2UgaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfRVhUICYmCisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19FWFQgJiYKKwkJY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CisJfSBlbHNlIGlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX0VYVCAmJgorCQljbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRVhUICYmCisJCWNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19FWFQpIHsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogSW52YWxpZCBzdGFydCB0cmlnZ2VyIGNvbWJpbmF0aW9uXG4iLAorCQkJZGV2LT5taW5vcik7CisJCWNtZC0+c3RhcnRfc3JjID0gVFJJR19OT1c7CisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgPSBUUklHX0ZPTExPVzsKKwkJY21kLT5jb252ZXJ0X3NyYyA9IFRSSUdfVElNRVI7CisJCWVycisrOworCX0KKworCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfTk9ORSAmJiBjbWQtPnNjYW5fZW5kX3NyYyA9PSBUUklHX05PTkUpIHsKKwl9IGVsc2UgaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCAmJgorCQljbWQtPnNjYW5fZW5kX3NyYyA9PSBUUklHX05PTkUpIHsKKwl9IGVsc2UgaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19OT05FICYmCisJCWNtZC0+c2Nhbl9lbmRfc3JjID09IFRSSUdfQ09VTlQpIHsKKwl9IGVsc2UgaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCAmJgorCQljbWQtPnNjYW5fZW5kX3NyYyA9PSBUUklHX0NPVU5UKSB7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IEludmFsaWQgc3RvcCB0cmlnZ2VyIGNvbWJpbmF0aW9uXG4iLAorCQkJZGV2LT5taW5vcik7CisJCWNtZC0+c3RvcF9zcmMgPSBUUklHX05PTkU7CisJCWNtZC0+c2Nhbl9lbmRfc3JjID0gVFJJR19OT05FOworCQllcnIrKzsKKwl9CisJaWYgKGVycikgeworCQlyZXR1cm4gMjsKKwl9CisKKwkvKgorCSAqIFN0YWdlIDMuIENoZWNrIGlmIGFyZ3VtZW50cyBhcmUgZ2VuZXJhbGx5IHZhbGlkLgorCSAqLworCWlmIChjbWQtPmNoYW5saXN0X2xlbiA8IDEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IE5vIGNoYW5uZWwgbGlzdFxuIiwKKwkJCWRldi0+bWlub3IpOworCQljbWQtPmNoYW5saXN0X2xlbiA9IDE7CisJCWVycisrOworCX0KKwlpZiAoaW5pdF90aWNrcyA8IDY2KSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBTdGFydCBhcmcgdG8gbG93XG4iLAorCQkJZGV2LT5taW5vcik7CisJCWNtZC0+c3RhcnRfYXJnID0gMjAwMDsKKwkJZXJyKys7CisJfQorCWlmIChzY2FuX3RpY2tzICYmIHNjYW5fdGlja3MgPCA2NykgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogU2NhbiBiZWdpbiBhcmcgdG8gbG93XG4iLAorCQkJZGV2LT5taW5vcik7CisJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPSAyMDMxOworCQllcnIrKzsKKwl9CisJaWYgKGNoYW5fdGlja3MgPCA2NikgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogQ29udmVydCBhcmcgdG8gbG93XG4iLAorCQkJZGV2LT5taW5vcik7CisJCWNtZC0+Y29udmVydF9hcmcgPSAyMDAwOworCQllcnIrKzsKKwl9CisJaWYgKGVycikgeworCQlyZXR1cm4gMzsKKwl9CisKKwkvKgorCSAqIFN0YWdlIDQuIENoZWNrIGZvciBhcmd1bWVudCBjb25mbGljdHMuCisJICovCisJaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfTk9XICYmCisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUiAmJgorCQljbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKKworCQkvKiBDaGVjayB0aW1lciBhcmd1bWVudHMgKi8KKwkJaWYgKGluaXRfdGlja3MgPCBNRTQwMDBfQUlfTUlOX1RJQ0tTKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IEludmFsaWQgc3RhcnQgYXJnXG4iLAorCQkJCWRldi0+bWlub3IpOworCQkJY21kLT5zdGFydF9hcmcgPSAyMDAwOwkvLyA2NiB0aWNrcyBhdCBsZWFzdAorCQkJZXJyKys7CisJCX0KKwkJaWYgKGNoYW5fdGlja3MgPCBNRTQwMDBfQUlfTUlOX1RJQ0tTKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IEludmFsaWQgY29udmVydCBhcmdcbiIsCisJCQkJZGV2LT5taW5vcik7CisJCQljbWQtPmNvbnZlcnRfYXJnID0gMjAwMDsJLy8gNjYgdGlja3MgYXQgbGVhc3QKKwkJCWVycisrOworCQl9CisJCWlmIChzY2FuX3RpY2tzIDw9IGNtZC0+Y2hhbmxpc3RfbGVuICogY2hhbl90aWNrcykgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIHNjYW4gZW5kIGFyZ1xuIiwKKwkJCQlkZXYtPm1pbm9yKTsKKwkJCWNtZC0+c2Nhbl9lbmRfYXJnID0gMjAwMCAqIGNtZC0+Y2hhbmxpc3RfbGVuICsgMzE7CS8vIEF0IGxlYXN0IG9uZSB0aWNrIG1vcmUKKwkJCWVycisrOworCQl9CisJfSBlbHNlIGlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX05PVyAmJgorCQljbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRk9MTE9XICYmCisJCWNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCisJCS8qIENoZWNrIHRpbWVyIGFyZ3VtZW50cyAqLworCQlpZiAoaW5pdF90aWNrcyA8IE1FNDAwMF9BSV9NSU5fVElDS1MpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogSW52YWxpZCBzdGFydCBhcmdcbiIsCisJCQkJZGV2LT5taW5vcik7CisJCQljbWQtPnN0YXJ0X2FyZyA9IDIwMDA7CS8vIDY2IHRpY2tzIGF0IGxlYXN0CisJCQllcnIrKzsKKwkJfQorCQlpZiAoY2hhbl90aWNrcyA8IE1FNDAwMF9BSV9NSU5fVElDS1MpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogSW52YWxpZCBjb252ZXJ0IGFyZ1xuIiwKKwkJCQlkZXYtPm1pbm9yKTsKKwkJCWNtZC0+Y29udmVydF9hcmcgPSAyMDAwOwkvLyA2NiB0aWNrcyBhdCBsZWFzdAorCQkJZXJyKys7CisJCX0KKwl9IGVsc2UgaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfRVhUICYmCisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUiAmJgorCQljbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKKworCQkvKiBDaGVjayB0aW1lciBhcmd1bWVudHMgKi8KKwkJaWYgKGluaXRfdGlja3MgPCBNRTQwMDBfQUlfTUlOX1RJQ0tTKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IEludmFsaWQgc3RhcnQgYXJnXG4iLAorCQkJCWRldi0+bWlub3IpOworCQkJY21kLT5zdGFydF9hcmcgPSAyMDAwOwkvLyA2NiB0aWNrcyBhdCBsZWFzdAorCQkJZXJyKys7CisJCX0KKwkJaWYgKGNoYW5fdGlja3MgPCBNRTQwMDBfQUlfTUlOX1RJQ0tTKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2RvX2NtZF90ZXN0KCk6IEludmFsaWQgY29udmVydCBhcmdcbiIsCisJCQkJZGV2LT5taW5vcik7CisJCQljbWQtPmNvbnZlcnRfYXJnID0gMjAwMDsJLy8gNjYgdGlja3MgYXQgbGVhc3QKKwkJCWVycisrOworCQl9CisJCWlmIChzY2FuX3RpY2tzIDw9IGNtZC0+Y2hhbmxpc3RfbGVuICogY2hhbl90aWNrcykgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIHNjYW4gZW5kIGFyZ1xuIiwKKwkJCQlkZXYtPm1pbm9yKTsKKwkJCWNtZC0+c2Nhbl9lbmRfYXJnID0gMjAwMCAqIGNtZC0+Y2hhbmxpc3RfbGVuICsgMzE7CS8vIEF0IGxlYXN0IG9uZSB0aWNrIG1vcmUKKwkJCWVycisrOworCQl9CisJfSBlbHNlIGlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX0VYVCAmJgorCQljbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRk9MTE9XICYmCisJCWNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCisJCS8qIENoZWNrIHRpbWVyIGFyZ3VtZW50cyAqLworCQlpZiAoaW5pdF90aWNrcyA8IE1FNDAwMF9BSV9NSU5fVElDS1MpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogSW52YWxpZCBzdGFydCBhcmdcbiIsCisJCQkJZGV2LT5taW5vcik7CisJCQljbWQtPnN0YXJ0X2FyZyA9IDIwMDA7CS8vIDY2IHRpY2tzIGF0IGxlYXN0CisJCQllcnIrKzsKKwkJfQorCQlpZiAoY2hhbl90aWNrcyA8IE1FNDAwMF9BSV9NSU5fVElDS1MpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYWlfZG9fY21kX3Rlc3QoKTogSW52YWxpZCBjb252ZXJ0IGFyZ1xuIiwKKwkJCQlkZXYtPm1pbm9yKTsKKwkJCWNtZC0+Y29udmVydF9hcmcgPSAyMDAwOwkvLyA2NiB0aWNrcyBhdCBsZWFzdAorCQkJZXJyKys7CisJCX0KKwl9IGVsc2UgaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfRVhUICYmCisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19FWFQgJiYKKwkJY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CisKKwkJLyogQ2hlY2sgdGltZXIgYXJndW1lbnRzICovCisJCWlmIChpbml0X3RpY2tzIDwgTUU0MDAwX0FJX01JTl9USUNLUykgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIHN0YXJ0IGFyZ1xuIiwKKwkJCQlkZXYtPm1pbm9yKTsKKwkJCWNtZC0+c3RhcnRfYXJnID0gMjAwMDsJLy8gNjYgdGlja3MgYXQgbGVhc3QKKwkJCWVycisrOworCQl9CisJCWlmIChjaGFuX3RpY2tzIDwgTUU0MDAwX0FJX01JTl9USUNLUykgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIGNvbnZlcnQgYXJnXG4iLAorCQkJCWRldi0+bWlub3IpOworCQkJY21kLT5jb252ZXJ0X2FyZyA9IDIwMDA7CS8vIDY2IHRpY2tzIGF0IGxlYXN0CisJCQllcnIrKzsKKwkJfQorCX0gZWxzZSBpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19FWFQgJiYKKwkJY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0VYVCAmJgorCQljbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfRVhUKSB7CisKKwkJLyogQ2hlY2sgdGltZXIgYXJndW1lbnRzICovCisJCWlmIChpbml0X3RpY2tzIDwgTUU0MDAwX0FJX01JTl9USUNLUykgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIHN0YXJ0IGFyZ1xuIiwKKwkJCQlkZXYtPm1pbm9yKTsKKwkJCWNtZC0+c3RhcnRfYXJnID0gMjAwMDsJLy8gNjYgdGlja3MgYXQgbGVhc3QKKwkJCWVycisrOworCQl9CisJfQorCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpIHsKKwkJaWYgKGNtZC0+c3RvcF9hcmcgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIHN0b3AgYXJnXG4iLAorCQkJCWRldi0+bWlub3IpOworCQkJY21kLT5zdG9wX2FyZyA9IDE7CisJCQllcnIrKzsKKwkJfQorCX0KKwlpZiAoY21kLT5zY2FuX2VuZF9zcmMgPT0gVFJJR19DT1VOVCkgeworCQlpZiAoY21kLT5zY2FuX2VuZF9hcmcgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9kb19jbWRfdGVzdCgpOiBJbnZhbGlkIHNjYW4gZW5kIGFyZ1xuIiwKKwkJCQlkZXYtPm1pbm9yKTsKKwkJCWNtZC0+c2Nhbl9lbmRfYXJnID0gMTsKKwkJCWVycisrOworCQl9CisJfQorCWlmIChlcnIpIHsKKwkJcmV0dXJuIDQ7CisJfQorCisJLyoKKwkgKiBTdGFnZSA1LiBDaGVjayB0aGUgY2hhbm5lbCBsaXN0LgorCSAqLworCWlmIChhaV9jaGVja19jaGFubGlzdChkZXYsIHMsIGNtZCkpCisJCXJldHVybiA1OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTQwMDBfYWlfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCBQVF9SRUdTX0FSRykKK3sKKwl1bnNpZ25lZCBpbnQgdG1wOworCWNvbWVkaV9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwljb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5zdWJkZXZpY2VzOworCW1lNDAwMF9haV9jb250ZXh0X3QgKmFpX2NvbnRleHQgPSAmaW5mby0+YWlfY29udGV4dDsKKwlpbnQgaTsKKwlpbnQgYyA9IDA7CisJbG9uZyBsdmFsOworCisJSVNSX1BERUJVRygibWU0MDAwX2FpX2lzcigpIGlzIGV4ZWN1dGVkXG4iKTsKKworCWlmICghZGV2LT5hdHRhY2hlZCkgeworCQlJU1JfUERFQlVHKCJtZTQwMDBfYWlfaXNyKCkgcHJlbWF0dXJlIGludGVycnVwdFxuIik7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwkvKiBSZXNldCBhbGwgZXZlbnRzICovCisJcy0+YXN5bmMtPmV2ZW50cyA9IDA7CisKKwkvKiBDaGVjayBpZiBpcnEgbnVtYmVyIGlzIHJpZ2h0ICovCisJaWYgKGlycSAhPSBhaV9jb250ZXh0LT5pcnEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2lzcigpOiBJbmNvcnJlY3QgaW50ZXJydXB0IG51bTogJWRcbiIsCisJCQlkZXYtPm1pbm9yLCBpcnEpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKG1lNDAwMF9pbmwoZGV2LAorCQkJYWlfY29udGV4dC0+CisJCQlpcnFfc3RhdHVzX3JlZykgJiBNRTQwMDBfSVJRX1NUQVRVU19CSVRfQUlfSEYpIHsKKwkJSVNSX1BERUJVRworCQkJKCJtZTQwMDBfYWlfaXNyKCk6IEZpZm8gaGFsZiBmdWxsIGludGVycnVwdCBvY2N1cmVkXG4iKTsKKworCQkvKiBSZWFkIHN0YXR1cyByZWdpc3RlciB0byBmaW5kIG91dCB3aGF0IGhhcHBlbmVkICovCisJCXRtcCA9IG1lNDAwMF9pbmwoZGV2LCBhaV9jb250ZXh0LT5jdHJsX3JlZyk7CisKKwkJaWYgKCEodG1wICYgTUU0MDAwX0FJX1NUQVRVU19CSVRfRkZfREFUQSkgJiYKKwkJCSEodG1wICYgTUU0MDAwX0FJX1NUQVRVU19CSVRfSEZfREFUQSkgJiYKKwkJCSh0bXAgJiBNRTQwMDBfQUlfU1RBVFVTX0JJVF9FRl9EQVRBKSkgeworCQkJSVNSX1BERUJVRygibWU0MDAwX2FpX2lzcigpOiBGaWZvIGZ1bGxcbiIpOworCQkJYyA9IE1FNDAwMF9BSV9GSUZPX0NPVU5UOworCisJCQkvKiBGSUZPIG92ZXJmbG93LCBzbyBzdG9wIGNvbnZlcnNpb24gYW5kIGRpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKwkJCXRtcCB8PSBNRTQwMDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJCQl0bXAgJj0gfihNRTQwMDBfQUlfQ1RSTF9CSVRfSEZfSVJRIHwKKwkJCQlNRTQwMDBfQUlfQ1RSTF9CSVRfU0NfSVJRKTsKKwkJCW1lNDAwMF9vdXRsKGRldiwgdG1wLCBhaV9jb250ZXh0LT5jdHJsX3JlZyk7CisKKwkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VSUk9SIHwgQ09NRURJX0NCX0VPQTsKKworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9pc3IoKTogRklGTyBvdmVyZmxvd1xuIiwKKwkJCQlkZXYtPm1pbm9yKTsKKwkJfSBlbHNlIGlmICgodG1wICYgTUU0MDAwX0FJX1NUQVRVU19CSVRfRkZfREFUQSkKKwkJCSYmICEodG1wICYgTUU0MDAwX0FJX1NUQVRVU19CSVRfSEZfREFUQSkKKwkJCSYmICh0bXAgJiBNRTQwMDBfQUlfU1RBVFVTX0JJVF9FRl9EQVRBKSkgeworCQkJSVNSX1BERUJVRygibWU0MDAwX2FpX2lzcigpOiBGaWZvIGhhbGYgZnVsbFxuIik7CisKKwkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0JMT0NLOworCisJCQljID0gTUU0MDAwX0FJX0ZJRk9fQ09VTlQgLyAyOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9pc3IoKTogQ2FuJ3QgZGV0ZXJtaW5lIHN0YXRlIG9mIGZpZm9cbiIsCisJCQkJZGV2LT5taW5vcik7CisJCQljID0gMDsKKworCQkJLyogVW5kZWZpbmVkIHN0YXRlLCBzbyBzdG9wIGNvbnZlcnNpb24gYW5kIGRpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKwkJCXRtcCB8PSBNRTQwMDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJCQl0bXAgJj0gfihNRTQwMDBfQUlfQ1RSTF9CSVRfSEZfSVJRIHwKKwkJCQlNRTQwMDBfQUlfQ1RSTF9CSVRfU0NfSVJRKTsKKwkJCW1lNDAwMF9vdXRsKGRldiwgdG1wLCBhaV9jb250ZXh0LT5jdHJsX3JlZyk7CisKKwkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VSUk9SIHwgQ09NRURJX0NCX0VPQTsKKworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9pc3IoKTogVW5kZWZpbmVkIEZJRk8gc3RhdGVcbiIsCisJCQkJZGV2LT5taW5vcik7CisJCX0KKworCQlJU1JfUERFQlVHKCJtZTQwMDBfYWlfaXNyKCk6IFRyeSB0byByZWFkICVkIHZhbHVlc1xuIiwgYyk7CisKKwkJZm9yIChpID0gMDsgaSA8IGM7IGkrKykgeworCQkJLyogUmVhZCB2YWx1ZSBmcm9tIGRhdGEgZmlmbyAqLworCQkJbHZhbCA9IGlubChhaV9jb250ZXh0LT5kYXRhX3JlZykgJiAweEZGRkY7CisJCQlsdmFsIF49IDB4ODAwMDsKKworCQkJaWYgKCFjb21lZGlfYnVmX3B1dChzLT5hc3luYywgbHZhbCkpIHsKKwkJCQkvKiBCdWZmZXIgb3ZlcmZsb3csIHNvIHN0b3AgY29udmVyc2lvbiBhbmQgZGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCQkJCXRtcCB8PSBNRTQwMDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJCQkJdG1wICY9IH4oTUU0MDAwX0FJX0NUUkxfQklUX0hGX0lSUSB8CisJCQkJCU1FNDAwMF9BSV9DVFJMX0JJVF9TQ19JUlEpOworCQkJCW1lNDAwMF9vdXRsKGRldiwgdG1wLCBhaV9jb250ZXh0LT5jdHJsX3JlZyk7CisKKwkJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9PVkVSRkxPVzsKKworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FpX2lzcigpOiBCdWZmZXIgb3ZlcmZsb3dcbiIsCisJCQkJCWRldi0+bWlub3IpOworCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvKiBXb3JrIGlzIGRvbmUsIHNvIHJlc2V0IHRoZSBpbnRlcnJ1cHQgKi8KKwkJSVNSX1BERUJVRygibWU0MDAwX2FpX2lzcigpOiBSZXNldCBmaWZvIGhhbGYgZnVsbCBpbnRlcnJ1cHRcbiIpOworCQl0bXAgfD0gTUU0MDAwX0FJX0NUUkxfQklUX0hGX0lSUV9SRVNFVDsKKwkJbWU0MDAwX291dGwoZGV2LCB0bXAsIGFpX2NvbnRleHQtPmN0cmxfcmVnKTsKKwkJdG1wICY9IH5NRTQwMDBfQUlfQ1RSTF9CSVRfSEZfSVJRX1JFU0VUOworCQltZTQwMDBfb3V0bChkZXYsIHRtcCwgYWlfY29udGV4dC0+Y3RybF9yZWcpOworCX0KKworCWlmIChtZTQwMDBfaW5sKGRldiwKKwkJCWFpX2NvbnRleHQtPgorCQkJaXJxX3N0YXR1c19yZWcpICYgTUU0MDAwX0lSUV9TVEFUVVNfQklUX1NDKSB7CisJCUlTUl9QREVCVUcKKwkJCSgibWU0MDAwX2FpX2lzcigpOiBTYW1wbGUgY291bnRlciBpbnRlcnJ1cHQgb2NjdXJlZFxuIik7CisKKwkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfQkxPQ0sgfCBDT01FRElfQ0JfRU9BOworCisJCS8qIEFjcXVpc2l0aW9uIGlzIGNvbXBsZXRlLCBzbyBzdG9wIGNvbnZlcnNpb24gYW5kIGRpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKwkJdG1wID0gbWU0MDAwX2lubChkZXYsIGFpX2NvbnRleHQtPmN0cmxfcmVnKTsKKwkJdG1wIHw9IE1FNDAwMF9BSV9DVFJMX0JJVF9JTU1FRElBVEVfU1RPUDsKKwkJdG1wICY9IH4oTUU0MDAwX0FJX0NUUkxfQklUX0hGX0lSUSB8IE1FNDAwMF9BSV9DVFJMX0JJVF9TQ19JUlEpOworCQltZTQwMDBfb3V0bChkZXYsIHRtcCwgYWlfY29udGV4dC0+Y3RybF9yZWcpOworCisJCS8qIFBvbGwgZGF0YSB1bnRpbCBmaWZvIGVtcHR5ICovCisJCXdoaWxlIChpbmwoYWlfY29udGV4dC0+Y3RybF9yZWcpICYgTUU0MDAwX0FJX1NUQVRVU19CSVRfRUZfREFUQSkgeworCQkJLyogUmVhZCB2YWx1ZSBmcm9tIGRhdGEgZmlmbyAqLworCQkJbHZhbCA9IGlubChhaV9jb250ZXh0LT5kYXRhX3JlZykgJiAweEZGRkY7CisJCQlsdmFsIF49IDB4ODAwMDsKKworCQkJaWYgKCFjb21lZGlfYnVmX3B1dChzLT5hc3luYywgbHZhbCkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9haV9pc3IoKTogQnVmZmVyIG92ZXJmbG93XG4iLAorCQkJCQlkZXYtPm1pbm9yKTsKKwkJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9PVkVSRkxPVzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8qIFdvcmsgaXMgZG9uZSwgc28gcmVzZXQgdGhlIGludGVycnVwdCAqLworCQlJU1JfUERFQlVHCisJCQkoIm1lNDAwMF9haV9pc3IoKTogUmVzZXQgaW50ZXJydXB0IGZyb20gc2FtcGxlIGNvdW50ZXJcbiIpOworCQl0bXAgfD0gTUU0MDAwX0FJX0NUUkxfQklUX1NDX0lSUV9SRVNFVDsKKwkJbWU0MDAwX291dGwoZGV2LCB0bXAsIGFpX2NvbnRleHQtPmN0cmxfcmVnKTsKKwkJdG1wICY9IH5NRTQwMDBfQUlfQ1RSTF9CSVRfU0NfSVJRX1JFU0VUOworCQltZTQwMDBfb3V0bChkZXYsIHRtcCwgYWlfY29udGV4dC0+Y3RybF9yZWcpOworCX0KKworCUlTUl9QREVCVUcoIm1lNDAwMF9haV9pc3IoKTogRXZlbnRzID0gMHglWFxuIiwgcy0+YXN5bmMtPmV2ZW50cyk7CisKKwlpZiAocy0+YXN5bmMtPmV2ZW50cykKKwkJY29tZWRpX2V2ZW50KGRldiwgcyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQW5hbG9nIG91dHB1dCBzZWN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgbWU0MDAwX2FvX2luc25fd3JpdGUoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywgY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisKKwlpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCWludCByYW5nID0gQ1JfUkFOR0UoaW5zbi0+Y2hhbnNwZWMpOworCWludCBhcmVmID0gQ1JfQVJFRihpbnNuLT5jaGFuc3BlYyk7CisJdW5zaWduZWQgbG9uZyB0bXA7CisKKwlDQUxMX1BERUJVRygiSW4gbWU0MDAwX2FvX2luc25fd3JpdGUoKVxuIik7CisKKwlpZiAoaW5zbi0+biA9PSAwKSB7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAoaW5zbi0+biA+IDEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FvX2luc25fd3JpdGUoKTogSW52YWxpZCBpbnN0cnVjdGlvbiBsZW5ndGggJWRcbiIsCisJCQlkZXYtPm1pbm9yLCBpbnNuLT5uKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGNoYW4gPj0gdGhpc2JvYXJkLT5hby5jb3VudCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYW9faW5zbl93cml0ZSgpOiBJbnZhbGlkIGNoYW5uZWwgJWRcbiIsCisJCQlkZXYtPm1pbm9yLCBpbnNuLT5uKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHJhbmcgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfYW9faW5zbl93cml0ZSgpOiBJbnZhbGlkIHJhbmdlICVkXG4iLAorCQkJZGV2LT5taW5vciwgaW5zbi0+bik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChhcmVmICE9IEFSRUZfR1JPVU5EICYmIGFyZWYgIT0gQVJFRl9DT01NT04pIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FvX2luc25fd3JpdGUoKTogSW52YWxpZCBhcmVmICVkXG4iLAorCQkJZGV2LT5taW5vciwgaW5zbi0+bik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFN0b3AgYW55IHJ1bm5pbmcgY29udmVyc2lvbiAqLworCXRtcCA9IG1lNDAwMF9pbmwoZGV2LCBpbmZvLT5hb19jb250ZXh0W2NoYW5dLmN0cmxfcmVnKTsKKwl0bXAgfD0gTUU0MDAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCW1lNDAwMF9vdXRsKGRldiwgdG1wLCBpbmZvLT5hb19jb250ZXh0W2NoYW5dLmN0cmxfcmVnKTsKKworCS8qIENsZWFyIGNvbnRyb2wgcmVnaXN0ZXIgYW5kIHNldCB0byBzaW5nbGUgbW9kZSAqLworCW1lNDAwMF9vdXRsKGRldiwgMHgwLCBpbmZvLT5hb19jb250ZXh0W2NoYW5dLmN0cmxfcmVnKTsKKworCS8qIFdyaXRlIGRhdGEgdmFsdWUgKi8KKwltZTQwMDBfb3V0bChkZXYsIGRhdGFbMF0sIGluZm8tPmFvX2NvbnRleHRbY2hhbl0uc2luZ2xlX3JlZyk7CisKKwkvKiBTdG9yZSBpbiB0aGUgbWlycm9yICovCisJaW5mby0+YW9fY29udGV4dFtjaGFuXS5taXJyb3IgPSBkYXRhWzBdOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbWU0MDAwX2FvX2luc25fcmVhZChjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCBjb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKwlpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCisJaWYgKGluc24tPm4gPT0gMCkgeworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKGluc24tPm4gPiAxKSB7CisJCXByaW50aygiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2FvX2luc25fcmVhZCgpOiBJbnZhbGlkIGluc3RydWN0aW9uIGxlbmd0aFxuIiwgZGV2LT5taW5vcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRhdGFbMF0gPSBpbmZvLT5hb19jb250ZXh0W2NoYW5dLm1pcnJvcjsKKworCXJldHVybiAxOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERpZ2l0YWwgSS9PIHNlY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBtZTQwMDBfZGlvX2luc25fYml0cyhjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCBjb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKworCUNBTExfUERFQlVHKCJJbiBtZTQwMDBfZGlvX2luc25fYml0cygpXG4iKTsKKworCS8qIExlbmd0aCBvZiBkYXRhIG11c3QgYmUgMiAobWFzayBhbmQgbmV3IGRhdGEsIHNlZSBiZWxvdykgKi8KKwlpZiAoaW5zbi0+biA9PSAwKSB7CisJCXJldHVybiAwOworCX0KKwlpZiAoaW5zbi0+biAhPSAyKSB7CisJCXByaW50aygiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2Rpb19pbnNuX2JpdHMoKTogSW52YWxpZCBpbnN0cnVjdGlvbiBsZW5ndGhcbiIsIGRldi0+bWlub3IpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIFRoZSBpbnNuIGRhdGEgY29uc2lzdHMgb2YgYSBtYXNrIGluIGRhdGFbMF0gYW5kIHRoZSBuZXcgZGF0YQorCSAqIGluIGRhdGFbMV0uIFRoZSBtYXNrIGRlZmluZXMgd2hpY2ggYml0cyB3ZSBhcmUgY29uY2VybmluZyBhYm91dC4KKwkgKiBUaGUgbmV3IGRhdGEgbXVzdCBiZSBhbmRlZCB3aXRoIHRoZSBtYXNrLgorCSAqIEVhY2ggY2hhbm5lbCBjb3JyZXNwb25kcyB0byBhIGJpdC4KKwkgKi8KKwlpZiAoZGF0YVswXSkgeworCQkvKiBDaGVjayBpZiByZXF1ZXN0ZWQgcG9ydHMgYXJlIGNvbmZpZ3VyZWQgZm9yIG91dHB1dCAqLworCQlpZiAoKHMtPmlvX2JpdHMgJiBkYXRhWzBdKSAhPSBkYXRhWzBdKQorCQkJcmV0dXJuIC1FSU87CisKKwkJcy0+c3RhdGUgJj0gfmRhdGFbMF07CisJCXMtPnN0YXRlIHw9IGRhdGFbMF0gJiBkYXRhWzFdOworCisJCS8qIFdyaXRlIG91dCB0aGUgbmV3IGRpZ2l0YWwgb3V0cHV0IGxpbmVzICovCisJCW1lNDAwMF9vdXRsKGRldiwgKHMtPnN0YXRlID4+IDApICYgMHhGRiwKKwkJCWluZm8tPmRpb19jb250ZXh0LnBvcnRfMF9yZWcpOworCQltZTQwMDBfb3V0bChkZXYsIChzLT5zdGF0ZSA+PiA4KSAmIDB4RkYsCisJCQlpbmZvLT5kaW9fY29udGV4dC5wb3J0XzFfcmVnKTsKKwkJbWU0MDAwX291dGwoZGV2LCAocy0+c3RhdGUgPj4gMTYpICYgMHhGRiwKKwkJCWluZm8tPmRpb19jb250ZXh0LnBvcnRfMl9yZWcpOworCQltZTQwMDBfb3V0bChkZXYsIChzLT5zdGF0ZSA+PiAyNCkgJiAweEZGLAorCQkJaW5mby0+ZGlvX2NvbnRleHQucG9ydF8zX3JlZyk7CisJfQorCisJLyogT24gcmV0dXJuLCBkYXRhWzFdIGNvbnRhaW5zIHRoZSB2YWx1ZSBvZgorCSAgIHRoZSBkaWdpdGFsIGlucHV0IGFuZCBvdXRwdXQgbGluZXMuICovCisJZGF0YVsxXSA9CisJCSgobWU0MDAwX2lubChkZXYsIGluZm8tPmRpb19jb250ZXh0LnBvcnRfMF9yZWcpICYgMHhGRikgPDwgMCkgfAorCQkoKG1lNDAwMF9pbmwoZGV2LCBpbmZvLT5kaW9fY29udGV4dC5wb3J0XzFfcmVnKSAmIDB4RkYpIDw8IDgpIHwKKwkJKChtZTQwMDBfaW5sKGRldiwgaW5mby0+ZGlvX2NvbnRleHQucG9ydF8yX3JlZykgJiAweEZGKSA8PCAxNikgfAorCQkoKG1lNDAwMF9pbmwoZGV2LCBpbmZvLT5kaW9fY29udGV4dC5wb3J0XzNfcmVnKSAmIDB4RkYpIDw8IDI0KTsKKworCXJldHVybiAyOworfQorCitzdGF0aWMgaW50IG1lNDAwMF9kaW9faW5zbl9jb25maWcoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywgY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKworCUNBTExfUERFQlVHKCJJbiBtZTQwMDBfZGlvX2luc25fY29uZmlnKClcbiIpOworCisJaWYgKGRhdGFbMF0gPT0gSU5TTl9DT05GSUdfRElPX1FVRVJZKSB7CisJCWRhdGFbMV0gPQorCQkJKHMtPgorCQkJaW9fYml0cyAmICgxIDw8IGNoYW4pKSA/IENPTUVESV9PVVRQVVQgOiBDT01FRElfSU5QVVQ7CisJCXJldHVybiBpbnNuLT5uOworCX0KKworCS8qCisJICogVGhlIGlucHV0IG9yIG91dHB1dCBjb25maWd1cmF0aW9uIG9mIGVhY2ggZGlnaXRhbCBsaW5lIGlzCisJICogY29uZmlndXJlZCBieSBhIHNwZWNpYWwgaW5zbl9jb25maWcgaW5zdHJ1Y3Rpb24uICBjaGFuc3BlYworCSAqIGNvbnRhaW5zIHRoZSBjaGFubmVsIHRvIGJlIGNoYW5nZWQsIGFuZCBkYXRhWzBdIGNvbnRhaW5zIHRoZQorCSAqIHZhbHVlIENPTUVESV9JTlBVVCBvciBDT01FRElfT1VUUFVULgorCSAqIE9uIHRoZSBNRS00MDAwIGl0IGlzIG9ubHkgcG9zc2libGUgdG8gc3dpdGNoIHBvcnQgd2lzZSAoOCBiaXQpCisJICovCisKKwl0bXAgPSBtZTQwMDBfaW5sKGRldiwgaW5mby0+ZGlvX2NvbnRleHQuY3RybF9yZWcpOworCisJaWYgKGRhdGFbMF0gPT0gQ09NRURJX09VVFBVVCkgeworCQlpZiAoY2hhbiA8IDgpIHsKKwkJCXMtPmlvX2JpdHMgfD0gMHhGRjsKKwkJCXRtcCAmPSB+KE1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQlNRTQwMDBfRElPX0NUUkxfQklUX01PREVfMSk7CisJCQl0bXAgfD0gTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzA7CisJCX0gZWxzZSBpZiAoY2hhbiA8IDE2KSB7CisJCQkvKgorCQkJICogQ2hlY2ggZm9yIG9wdG9pc29sYXRlZCBNRS00MDAwIHZlcnNpb24uIElmIG9uZSB0aGUgZmlyc3QKKwkJCSAqIHBvcnQgaXMgYSBmaXhlZCBvdXRwdXQgcG9ydCBhbmQgdGhlIHNlY29uZCBpcyBhIGZpeGVkIGlucHV0IHBvcnQuCisJCQkgKi8KKwkJCWlmICghbWU0MDAwX2lubChkZXYsIGluZm8tPmRpb19jb250ZXh0LmRpcl9yZWcpKQorCQkJCXJldHVybiAtRU5PREVWOworCisJCQlzLT5pb19iaXRzIHw9IDB4RkYwMDsKKwkJCXRtcCAmPSB+KE1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8yIHwKKwkJCQlNRTQwMDBfRElPX0NUUkxfQklUX01PREVfMyk7CisJCQl0bXAgfD0gTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzI7CisJCX0gZWxzZSBpZiAoY2hhbiA8IDI0KSB7CisJCQlzLT5pb19iaXRzIHw9IDB4RkYwMDAwOworCQkJdG1wICY9IH4oTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzQgfAorCQkJCU1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV81KTsKKwkJCXRtcCB8PSBNRTQwMDBfRElPX0NUUkxfQklUX01PREVfNDsKKwkJfSBlbHNlIGlmIChjaGFuIDwgMzIpIHsKKwkJCXMtPmlvX2JpdHMgfD0gMHhGRjAwMDAwMDsKKwkJCXRtcCAmPSB+KE1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV82IHwKKwkJCQlNRTQwMDBfRElPX0NUUkxfQklUX01PREVfNyk7CisJCQl0bXAgfD0gTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzY7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChjaGFuIDwgOCkgeworCQkJLyoKKwkJCSAqIENoZWNoIGZvciBvcHRvaXNvbGF0ZWQgTUUtNDAwMCB2ZXJzaW9uLiBJZiBvbmUgdGhlIGZpcnN0CisJCQkgKiBwb3J0IGlzIGEgZml4ZWQgb3V0cHV0IHBvcnQgYW5kIHRoZSBzZWNvbmQgaXMgYSBmaXhlZCBpbnB1dCBwb3J0LgorCQkJICovCisJCQlpZiAoIW1lNDAwMF9pbmwoZGV2LCBpbmZvLT5kaW9fY29udGV4dC5kaXJfcmVnKSkKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKworCQkJcy0+aW9fYml0cyAmPSB+MHhGRjsKKwkJCXRtcCAmPSB+KE1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQlNRTQwMDBfRElPX0NUUkxfQklUX01PREVfMSk7CisJCX0gZWxzZSBpZiAoY2hhbiA8IDE2KSB7CisJCQlzLT5pb19iaXRzICY9IH4weEZGMDA7CisJCQl0bXAgJj0gfihNRTQwMDBfRElPX0NUUkxfQklUX01PREVfMiB8CisJCQkJTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzMpOworCQl9IGVsc2UgaWYgKGNoYW4gPCAyNCkgeworCQkJcy0+aW9fYml0cyAmPSB+MHhGRjAwMDA7CisJCQl0bXAgJj0gfihNRTQwMDBfRElPX0NUUkxfQklUX01PREVfNCB8CisJCQkJTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzUpOworCQl9IGVsc2UgaWYgKGNoYW4gPCAzMikgeworCQkJcy0+aW9fYml0cyAmPSB+MHhGRjAwMDAwMDsKKwkJCXRtcCAmPSB+KE1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV82IHwKKwkJCQlNRTQwMDBfRElPX0NUUkxfQklUX01PREVfNyk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCW1lNDAwMF9vdXRsKGRldiwgdG1wLCBpbmZvLT5kaW9fY29udGV4dC5jdHJsX3JlZyk7CisKKwlyZXR1cm4gMTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBDb3VudGVyIHNlY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBjbnRfcmVzZXQoY29tZWRpX2RldmljZSAqIGRldiwgdW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisKKwlDQUxMX1BERUJVRygiSW4gY250X3Jlc2V0KClcbiIpOworCisJc3dpdGNoIChjaGFubmVsKSB7CisJY2FzZSAwOgorCQltZTQwMDBfb3V0YihkZXYsIDB4MzAsIGluZm8tPmNudF9jb250ZXh0LmN0cmxfcmVnKTsKKwkJbWU0MDAwX291dGIoZGV2LCAweDAwLCBpbmZvLT5jbnRfY29udGV4dC5jb3VudGVyXzBfcmVnKTsKKwkJbWU0MDAwX291dGIoZGV2LCAweDAwLCBpbmZvLT5jbnRfY29udGV4dC5jb3VudGVyXzBfcmVnKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQltZTQwMDBfb3V0YihkZXYsIDB4NzAsIGluZm8tPmNudF9jb250ZXh0LmN0cmxfcmVnKTsKKwkJbWU0MDAwX291dGIoZGV2LCAweDAwLCBpbmZvLT5jbnRfY29udGV4dC5jb3VudGVyXzFfcmVnKTsKKwkJbWU0MDAwX291dGIoZGV2LCAweDAwLCBpbmZvLT5jbnRfY29udGV4dC5jb3VudGVyXzFfcmVnKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQltZTQwMDBfb3V0YihkZXYsIDB4QjAsIGluZm8tPmNudF9jb250ZXh0LmN0cmxfcmVnKTsKKwkJbWU0MDAwX291dGIoZGV2LCAweDAwLCBpbmZvLT5jbnRfY29udGV4dC5jb3VudGVyXzJfcmVnKTsKKwkJbWU0MDAwX291dGIoZGV2LCAweDAwLCBpbmZvLT5jbnRfY29udGV4dC5jb3VudGVyXzJfcmVnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogY250X3Jlc2V0KCk6IEludmFsaWQgY2hhbm5lbFxuIiwKKwkJCWRldi0+bWlub3IpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjbnRfY29uZmlnKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCBjaGFubmVsLAorCXVuc2lnbmVkIGludCBtb2RlKQoreworCWludCB0bXAgPSAwOworCisJQ0FMTF9QREVCVUcoIkluIGNudF9jb25maWcoKVxuIik7CisKKwlzd2l0Y2ggKGNoYW5uZWwpIHsKKwljYXNlIDA6CisJCXRtcCB8PSBNRTQwMDBfQ05UX0NPVU5URVJfMDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQl0bXAgfD0gTUU0MDAwX0NOVF9DT1VOVEVSXzE7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJdG1wIHw9IE1FNDAwMF9DTlRfQ09VTlRFUl8yOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBjbnRfY29uZmlnKCk6IEludmFsaWQgY2hhbm5lbFxuIiwKKwkJCWRldi0+bWlub3IpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIDA6CisJCXRtcCB8PSBNRTQwMDBfQ05UX01PREVfMDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQl0bXAgfD0gTUU0MDAwX0NOVF9NT0RFXzE7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJdG1wIHw9IE1FNDAwMF9DTlRfTU9ERV8yOworCQlicmVhazsKKwljYXNlIDM6CisJCXRtcCB8PSBNRTQwMDBfQ05UX01PREVfMzsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQl0bXAgfD0gTUU0MDAwX0NOVF9NT0RFXzQ7CisJCWJyZWFrOworCWNhc2UgNToKKwkJdG1wIHw9IE1FNDAwMF9DTlRfTU9ERV81OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBjbnRfY29uZmlnKCk6IEludmFsaWQgY291bnRlciBtb2RlXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFdyaXRlIHRoZSBjb250cm9sIHdvcmQgKi8KKwl0bXAgfD0gMHgzMDsKKwltZTQwMDBfb3V0YihkZXYsIHRtcCwgaW5mby0+Y250X2NvbnRleHQuY3RybF9yZWcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWU0MDAwX2NudF9pbnNuX2NvbmZpZyhjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCBjb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKworCWludCBlcnI7CisKKwlDQUxMX1BERUJVRygiSW4gbWU0MDAwX2NudF9pbnNuX2NvbmZpZygpXG4iKTsKKworCXN3aXRjaCAoZGF0YVswXSkgeworCWNhc2UgR1BDVF9SRVNFVDoKKwkJaWYgKGluc24tPm4gIT0gMSkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9jbnRfaW5zbl9jb25maWcoKTogSW52YWxpZCBpbnN0cnVjdGlvbiBsZW5ndGglZFxuIiwKKwkJCQlkZXYtPm1pbm9yLCBpbnNuLT5uKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJZXJyID0gY250X3Jlc2V0KGRldiwgaW5zbi0+Y2hhbnNwZWMpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJYnJlYWs7CisJY2FzZSBHUENUX1NFVF9PUEVSQVRJT046CisJCWlmIChpbnNuLT5uICE9IDIpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfY250X2luc25fY29uZmlnKCk6IEludmFsaWQgaW5zdHJ1Y3Rpb24gbGVuZ3RoJWRcbiIsCisJCQkJZGV2LT5taW5vciwgaW5zbi0+bik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWVyciA9IGNudF9jb25maWcoZGV2LCBpbnNuLT5jaGFuc3BlYywgZGF0YVsxXSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfY250X2luc25fY29uZmlnKCk6IEludmFsaWQgaW5zdHJ1Y3Rpb25cbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDI7Cit9CisKK3N0YXRpYyBpbnQgbWU0MDAwX2NudF9pbnNuX3JlYWQoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywgY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisKKwl1bnNpZ25lZCBzaG9ydCB0bXA7CisKKwlDQUxMX1BERUJVRygiSW4gbWU0MDAwX2NudF9pbnNuX3JlYWQoKVxuIik7CisKKwlpZiAoaW5zbi0+biA9PSAwKSB7CisJCXJldHVybiAwOworCX0KKwlpZiAoaW5zbi0+biA+IDEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiY29tZWRpJWQ6IG1lNDAwMDogbWU0MDAwX2NudF9pbnNuX3JlYWQoKTogSW52YWxpZCBpbnN0cnVjdGlvbiBsZW5ndGggJWRcbiIsCisJCQlkZXYtPm1pbm9yLCBpbnNuLT5uKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChpbnNuLT5jaGFuc3BlYykgeworCWNhc2UgMDoKKwkJdG1wID0gbWU0MDAwX2luYihkZXYsIGluZm8tPmNudF9jb250ZXh0LmNvdW50ZXJfMF9yZWcpOworCQlkYXRhWzBdID0gdG1wOworCQl0bXAgPSBtZTQwMDBfaW5iKGRldiwgaW5mby0+Y250X2NvbnRleHQuY291bnRlcl8wX3JlZyk7CisJCWRhdGFbMF0gfD0gdG1wIDw8IDg7CisJCWJyZWFrOworCWNhc2UgMToKKwkJdG1wID0gbWU0MDAwX2luYihkZXYsIGluZm8tPmNudF9jb250ZXh0LmNvdW50ZXJfMV9yZWcpOworCQlkYXRhWzBdID0gdG1wOworCQl0bXAgPSBtZTQwMDBfaW5iKGRldiwgaW5mby0+Y250X2NvbnRleHQuY291bnRlcl8xX3JlZyk7CisJCWRhdGFbMF0gfD0gdG1wIDw8IDg7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJdG1wID0gbWU0MDAwX2luYihkZXYsIGluZm8tPmNudF9jb250ZXh0LmNvdW50ZXJfMl9yZWcpOworCQlkYXRhWzBdID0gdG1wOworCQl0bXAgPSBtZTQwMDBfaW5iKGRldiwgaW5mby0+Y250X2NvbnRleHQuY291bnRlcl8yX3JlZyk7CisJCWRhdGFbMF0gfD0gdG1wIDw8IDg7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9jbnRfaW5zbl9yZWFkKCk6IEludmFsaWQgY2hhbm5lbCAlZFxuIiwKKwkJCWRldi0+bWlub3IsIGluc24tPmNoYW5zcGVjKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbWU0MDAwX2NudF9pbnNuX3dyaXRlKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworCisJdW5zaWduZWQgc2hvcnQgdG1wOworCisJQ0FMTF9QREVCVUcoIkluIG1lNDAwMF9jbnRfaW5zbl93cml0ZSgpXG4iKTsKKworCWlmIChpbnNuLT5uID09IDApIHsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmIChpbnNuLT5uID4gMSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGklZDogbWU0MDAwOiBtZTQwMDBfY250X2luc25fd3JpdGUoKTogSW52YWxpZCBpbnN0cnVjdGlvbiBsZW5ndGggJWRcbiIsCisJCQlkZXYtPm1pbm9yLCBpbnNuLT5uKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChpbnNuLT5jaGFuc3BlYykgeworCWNhc2UgMDoKKwkJdG1wID0gZGF0YVswXSAmIDB4RkY7CisJCW1lNDAwMF9vdXRiKGRldiwgdG1wLCBpbmZvLT5jbnRfY29udGV4dC5jb3VudGVyXzBfcmVnKTsKKwkJdG1wID0gKGRhdGFbMF0gPj4gOCkgJiAweEZGOworCQltZTQwMDBfb3V0YihkZXYsIHRtcCwgaW5mby0+Y250X2NvbnRleHQuY291bnRlcl8wX3JlZyk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJdG1wID0gZGF0YVswXSAmIDB4RkY7CisJCW1lNDAwMF9vdXRiKGRldiwgdG1wLCBpbmZvLT5jbnRfY29udGV4dC5jb3VudGVyXzFfcmVnKTsKKwkJdG1wID0gKGRhdGFbMF0gPj4gOCkgJiAweEZGOworCQltZTQwMDBfb3V0YihkZXYsIHRtcCwgaW5mby0+Y250X2NvbnRleHQuY291bnRlcl8xX3JlZyk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJdG1wID0gZGF0YVswXSAmIDB4RkY7CisJCW1lNDAwMF9vdXRiKGRldiwgdG1wLCBpbmZvLT5jbnRfY29udGV4dC5jb3VudGVyXzJfcmVnKTsKKwkJdG1wID0gKGRhdGFbMF0gPj4gOCkgJiAweEZGOworCQltZTQwMDBfb3V0YihkZXYsIHRtcCwgaW5mby0+Y250X2NvbnRleHQuY291bnRlcl8yX3JlZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaSVkOiBtZTQwMDA6IG1lNDAwMF9jbnRfaW5zbl93cml0ZSgpOiBJbnZhbGlkIGNoYW5uZWwgJWRcbiIsCisJCQlkZXYtPm1pbm9yLCBpbnNuLT5jaGFuc3BlYyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAxOworfQorCitDT01FRElfUENJX0lOSVRDTEVBTlVQKGRyaXZlcl9tZTQwMDAsIG1lNDAwMF9wY2lfdGFibGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21lNDAwMC5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21lNDAwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMmI4ODcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWU0MDAwLmgKQEAgLTAsMCArMSw0NDYgQEAKKy8qCisgICAgbWU0MDAwLmgKKyAgICBSZWdpc3RlciBkZXNjcmlwdGlvbnMgYW5kIGRlZmluZXMgZm9yIHRoZSBNRS00MDAwIGJvYXJkIGZhbWlseQorCisgICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICAgIENvcHlyaWdodCAoQykgMTk5OC05IERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisKKyNpZm5kZWYgX01FNDAwMF9IXworI2RlZmluZSBfTUU0MDAwX0hfCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVidWcgc2VjdGlvbgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjdW5kZWYgTUU0MDAwX0NBTExfREVCVUcJLy8gRGVidWcgZnVuY3Rpb24gZW50cnkgYW5kIGV4aXQKKyN1bmRlZiBNRTQwMDBfUE9SVF9ERUJVRwkvLyBEZWJ1ZyBwb3J0IGFjY2VzcworI3VuZGVmIE1FNDAwMF9JU1JfREVCVUcJCS8vIERlYnVnIHRoZSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lCisjdW5kZWYgTUU0MDAwX0RFQlVHCQkvLyBHZW5lcmFsIHB1cnBvc2UgZGVidWcgbWFzc2VnZXMKKworI2lmZGVmIE1FNDAwMF9DQUxMX0RFQlVHCisjdW5kZWYgQ0FMTF9QREVCVUcKKyNkZWZpbmUgQ0FMTF9QREVCVUcoZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyJjb21lZGklZDogbWU0MDAwOiAiIGZtdCwgZGV2LT5taW5vciwgIyNhcmdzKQorI2Vsc2UKKyMgZGVmaW5lIENBTExfUERFQlVHKGZtdCwgYXJncy4uLikJLy8gbm8gZGVidWdnaW5nLCBkbyBub3RoaW5nCisjZW5kaWYKKworI2lmZGVmIE1FNDAwMF9QT1JUX0RFQlVHCisjdW5kZWYgUE9SVF9QREVCVUcKKyNkZWZpbmUgUE9SVF9QREVCVUcoZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyJjb21lZGklZDogbWU0MDAwOiAiIGZtdCwgZGV2LT5taW5vciwgICMjYXJncykKKyNlbHNlCisjZGVmaW5lIFBPUlRfUERFQlVHKGZtdCwgYXJncy4uLikJLy8gbm8gZGVidWdnaW5nLCBkbyBub3RoaW5nCisjZW5kaWYKKworI2lmZGVmIE1FNDAwMF9JU1JfREVCVUcKKyN1bmRlZiBJU1JfUERFQlVHCisjZGVmaW5lIElTUl9QREVCVUcoZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyJjb21lZGklZDogbWU0MDAwOiAiIGZtdCwgZGV2LT5taW5vciwgICMjYXJncykKKyNlbHNlCisjZGVmaW5lIElTUl9QREVCVUcoZm10LCBhcmdzLi4uKQkvLyBubyBkZWJ1Z2dpbmcsIGRvIG5vdGhpbmcKKyNlbmRpZgorCisjaWZkZWYgTUU0MDAwX0RFQlVHCisjdW5kZWYgUERFQlVHCisjZGVmaW5lIFBERUJVRyhmbXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0RFQlVHImNvbWVkaSVkOiBtZTQwMDA6ICIgZm10LCBkZXYtPm1pbm9yLCAgIyNhcmdzKQorI2Vsc2UKKyNkZWZpbmUgUERFQlVHKGZtdCwgYXJncy4uLikJLy8gbm8gZGVidWdnaW5nLCBkbyBub3RoaW5nCisjZW5kaWYKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBQQ0kgdmVuZG9yIGFuZCBkZXZpY2UgSURzCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9NRUlMSEFVUyAweDE0MDIKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY1MAkweDQ2NTAJLy8gTG93IENvc3QgdmVyc2lvbgorCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwCTB4NDY2MAkvLyBTdGFuZGFyZCB2ZXJzaW9uCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwSQkweDQ2NjEJLy8gSXNvbGF0ZWQgdmVyc2lvbgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MFMJMHg0NjYyCS8vIFN0YW5kYXJkIHZlcnNpb24gd2l0aCBTYW1wbGUgYW5kIEhvbGQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjBJUwkweDQ2NjMJLy8gSXNvbGF0ZWQgdmVyc2lvbiB3aXRoIFNhbXBsZSBhbmQgSG9sZAorCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwCTB4NDY3MAkvLyBTdGFuZGFyZCB2ZXJzaW9uCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwSQkweDQ2NzEJLy8gSXNvbGF0ZWQgdmVyc2lvbgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MFMJMHg0NjcyCS8vIFN0YW5kYXJkIHZlcnNpb24gd2l0aCBTYW1wbGUgYW5kIEhvbGQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBJUwkweDQ2NzMJLy8gSXNvbGF0ZWQgdmVyc2lvbiB3aXRoIFNhbXBsZSBhbmQgSG9sZAorCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwCTB4NDY4MAkvLyBTdGFuZGFyZCB2ZXJzaW9uCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwSQkweDQ2ODEJLy8gSXNvbGF0ZWQgdmVyc2lvbgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY4MFMJMHg0NjgyCS8vIFN0YW5kYXJkIHZlcnNpb24gd2l0aCBTYW1wbGUgYW5kIEhvbGQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBJUwkweDQ2ODMJLy8gSXNvbGF0ZWQgdmVyc2lvbiB3aXRoIFNhbXBsZSBhbmQgSG9sZAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIE1FLTQwMDAgYmFzZSByZWdpc3RlciBvZmZzZXRzCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUU0MDAwX0FPXzAwX0NUUkxfUkVHCQkJMHgwMAkvLyBSL1cKKyNkZWZpbmUgTUU0MDAwX0FPXzAwX1NUQVRVU19SRUcJCQkweDA0CS8vIFIvXworI2RlZmluZSBNRTQwMDBfQU9fMDBfRklGT19SRUcJCQkweDA4CS8vIF8vVworI2RlZmluZSBNRTQwMDBfQU9fMDBfU0lOR0xFX1JFRwkJCTB4MEMJLy8gUi9XCisjZGVmaW5lIE1FNDAwMF9BT18wMF9USU1FUl9SRUcJCQkweDEwCS8vIF8vVworCisjZGVmaW5lIE1FNDAwMF9BT18wMV9DVFJMX1JFRwkJCTB4MTgJLy8gUi9XCisjZGVmaW5lIE1FNDAwMF9BT18wMV9TVEFUVVNfUkVHCQkJMHgxQwkvLyBSL18KKyNkZWZpbmUgTUU0MDAwX0FPXzAxX0ZJRk9fUkVHCQkJMHgyMAkvLyBfL1cKKyNkZWZpbmUgTUU0MDAwX0FPXzAxX1NJTkdMRV9SRUcJCQkweDI0CS8vIFIvVworI2RlZmluZSBNRTQwMDBfQU9fMDFfVElNRVJfUkVHCQkJMHgyOAkvLyBfL1cKKworI2RlZmluZSBNRTQwMDBfQU9fMDJfQ1RSTF9SRUcJCQkweDMwCS8vIFIvVworI2RlZmluZSBNRTQwMDBfQU9fMDJfU1RBVFVTX1JFRwkJCTB4MzQJLy8gUi9fCisjZGVmaW5lIE1FNDAwMF9BT18wMl9GSUZPX1JFRwkJCTB4MzgJLy8gXy9XCisjZGVmaW5lIE1FNDAwMF9BT18wMl9TSU5HTEVfUkVHCQkJMHgzQwkvLyBSL1cKKyNkZWZpbmUgTUU0MDAwX0FPXzAyX1RJTUVSX1JFRwkJCTB4NDAJLy8gXy9XCisKKyNkZWZpbmUgTUU0MDAwX0FPXzAzX0NUUkxfUkVHCQkJMHg0OAkvLyBSL1cKKyNkZWZpbmUgTUU0MDAwX0FPXzAzX1NUQVRVU19SRUcJCQkweDRDCS8vIFIvXworI2RlZmluZSBNRTQwMDBfQU9fMDNfRklGT19SRUcJCQkweDUwCS8vIF8vVworI2RlZmluZSBNRTQwMDBfQU9fMDNfU0lOR0xFX1JFRwkJCTB4NTQJLy8gUi9XCisjZGVmaW5lIE1FNDAwMF9BT18wM19USU1FUl9SRUcJCQkweDU4CS8vIF8vVworCisjZGVmaW5lIE1FNDAwMF9BSV9DVFJMX1JFRwkJCTB4NzQJLy8gXy9XCisjZGVmaW5lIE1FNDAwMF9BSV9TVEFUVVNfUkVHCQkJMHg3NAkvLyBSL18KKyNkZWZpbmUgTUU0MDAwX0FJX0NIQU5ORUxfTElTVF9SRUcJCTB4NzgJLy8gXy9XCisjZGVmaW5lIE1FNDAwMF9BSV9EQVRBX1JFRwkJCTB4N0MJLy8gUi9fCisjZGVmaW5lIE1FNDAwMF9BSV9DSEFOX1RJTUVSX1JFRwkJMHg4MAkvLyBfL1cKKyNkZWZpbmUgTUU0MDAwX0FJX0NIQU5fUFJFX1RJTUVSX1JFRwkJMHg4NAkvLyBfL1cKKyNkZWZpbmUgTUU0MDAwX0FJX1NDQU5fVElNRVJfTE9XX1JFRwkJMHg4OAkvLyBfL1cKKyNkZWZpbmUgTUU0MDAwX0FJX1NDQU5fVElNRVJfSElHSF9SRUcJCTB4OEMJLy8gXy9XCisjZGVmaW5lIE1FNDAwMF9BSV9TQ0FOX1BSRV9USU1FUl9MT1dfUkVHCTB4OTAJLy8gXy9XCisjZGVmaW5lIE1FNDAwMF9BSV9TQ0FOX1BSRV9USU1FUl9ISUdIX1JFRwkweDk0CS8vIF8vVworI2RlZmluZSBNRTQwMDBfQUlfU1RBUlRfUkVHCQkJMHg5OAkvLyBSL18KKworI2RlZmluZSBNRTQwMDBfSVJRX1NUQVRVU19SRUcJCQkweDlDCS8vIFIvXworCisjZGVmaW5lIE1FNDAwMF9ESU9fUE9SVF8wX1JFRwkJCTB4QTAJLy8gUi9XCisjZGVmaW5lIE1FNDAwMF9ESU9fUE9SVF8xX1JFRwkJCTB4QTQJLy8gUi9XCisjZGVmaW5lIE1FNDAwMF9ESU9fUE9SVF8yX1JFRwkJCTB4QTgJLy8gUi9XCisjZGVmaW5lIE1FNDAwMF9ESU9fUE9SVF8zX1JFRwkJCTB4QUMJLy8gUi9XCisjZGVmaW5lIE1FNDAwMF9ESU9fRElSX1JFRwkJCTB4QjAJLy8gUi9XCisKKyNkZWZpbmUgTUU0MDAwX0FPX0xPQURTRVRSRUdfWFgJCQkweEI0CS8vIFIvVworCisjZGVmaW5lIE1FNDAwMF9ESU9fQ1RSTF9SRUcJCQkweEI4CS8vIFIvVworCisjZGVmaW5lIE1FNDAwMF9BT19ERU1VWF9BREpVU1RfUkVHCQkweEJDCS8vIC0vVworCisjZGVmaW5lIE1FNDAwMF9BSV9TQU1QTEVfQ09VTlRFUl9SRUcJCTB4QzAJLy8gXy9XCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgVmFsdWUgdG8gYWRqdXN0IERlbXV4CisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUU0MDAwX0FPX0RFTVVYX0FESlVTVF9WQUxVRSAgICAgICAgICAgIDB4NEMKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBDb3VudGVyIGJhc2UgcmVnaXN0ZXIgb2Zmc2V0cworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FNDAwMF9DTlRfQ09VTlRFUl8wX1JFRwkJMHgwMAorI2RlZmluZSBNRTQwMDBfQ05UX0NPVU5URVJfMV9SRUcJCTB4MDEKKyNkZWZpbmUgTUU0MDAwX0NOVF9DT1VOVEVSXzJfUkVHCQkweDAyCisjZGVmaW5lIE1FNDAwMF9DTlRfQ1RSTF9SRUcJCQkweDAzCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgUExYIGJhc2UgcmVnaXN0ZXIgb2Zmc2V0cworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIFBMWF9JTlRDU1IJMHg0QwkvLyBJbnRlcnJ1cHQgY29udHJvbCBhbmQgc3RhdHVzIHJlZ2lzdGVyCisjZGVmaW5lIFBMWF9JQ1IJCTB4NTAJLy8gSW5pdGlhbGl6YXRpb24gY29udHJvbCByZWdpc3RlcgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEJpdHMgZm9yIHRoZSBQTFhfSUNTUiByZWdpc3RlcgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIFBMWF9JTlRDU1JfTE9DQUxfSU5UMV9FTiAgICAgICAgICAgICAweDAxCS8vIElmIHNldCwgbG9jYWwgaW50ZXJydXB0IDEgaXMgZW5hYmxlZCAoci93KQorI2RlZmluZSBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDFfUE9MICAgICAgICAgICAgMHgwMgkvLyBJZiBzZXQsIGxvY2FsIGludGVycnVwdCAxIHBvbGFyaXR5IGlzIGFjdGl2ZSBoaWdoIChyL3cpCisjZGVmaW5lIFBMWF9JTlRDU1JfTE9DQUxfSU5UMV9TVEFURSAgICAgICAgICAweDA0CS8vIElmIHNldCwgbG9jYWwgaW50ZXJydXB0IDEgaXMgYWN0aXZlIChyL18pCisjZGVmaW5lIFBMWF9JTlRDU1JfTE9DQUxfSU5UMl9FTiAgICAgICAgICAgICAweDA4CS8vIElmIHNldCwgbG9jYWwgaW50ZXJydXB0IDIgaXMgZW5hYmxlZCAoci93KQorI2RlZmluZSBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfUE9MICAgICAgICAgICAgMHgxMAkvLyBJZiBzZXQsIGxvY2FsIGludGVycnVwdCAyIHBvbGFyaXR5IGlzIGFjdGl2ZSBoaWdoIChyL3cpCisjZGVmaW5lIFBMWF9JTlRDU1JfTE9DQUxfSU5UMl9TVEFURSAgICAgICAgICAweDIwCS8vIElmIHNldCwgbG9jYWwgaW50ZXJydXB0IDIgaXMgYWN0aXZlICAoci9fKQorI2RlZmluZSBQTFhfSU5UQ1NSX1BDSV9JTlRfRU4gICAgICAgICAgICAgICAgMHg0MAkvLyBJZiBzZXQsIFBDSSBpbnRlcnJ1cHQgaXMgZW5hYmxlZCAoci93KQorI2RlZmluZSBQTFhfSU5UQ1NSX1NPRlRfSU5UICAgICAgICAgICAgICAgICAgMHg4MAkvLyBJZiBzZXQsIGEgc29mdHdhcmUgaW50ZXJydXB0IGlzIGdlbmVyYXRlZCAoci93KQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEJpdHMgZm9yIHRoZSBQTFhfSUNSIHJlZ2lzdGVyCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgUExYX0lDUl9CSVRfRUVQUk9NX0NMT0NLX1NFVAkJMHgwMTAwMDAwMAorI2RlZmluZSBQTFhfSUNSX0JJVF9FRVBST01fQ0hJUF9TRUxFQ1QJCTB4MDIwMDAwMDAKKyNkZWZpbmUgUExYX0lDUl9CSVRfRUVQUk9NX1dSSVRFCQkweDA0MDAwMDAwCisjZGVmaW5lIFBMWF9JQ1JfQklUX0VFUFJPTV9SRUFECQkJMHgwODAwMDAwMAorI2RlZmluZSBQTFhfSUNSX0JJVF9FRVBST01fVkFMSUQJCTB4MTAwMDAwMDAKKworI2RlZmluZSBQTFhfSUNSX01BU0tfRUVQUk9NCQkJMHgxRjAwMDAwMAorCisjZGVmaW5lIEVFUFJPTV9ERUxBWQkJCQkxCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQml0cyBmb3IgdGhlIE1FNDAwMF9BT19DVFJMX1JFRyByZWdpc3RlcgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FNDAwMF9BT19DVFJMX0JJVF9NT0RFXzAJCTB4MDAxCisjZGVmaW5lIE1FNDAwMF9BT19DVFJMX0JJVF9NT0RFXzEJCTB4MDAyCisjZGVmaW5lIE1FNDAwMF9BT19DVFJMX01BU0tfTU9ERQkJMHgwMDMKKyNkZWZpbmUgTUU0MDAwX0FPX0NUUkxfQklUX1NUT1AJCQkweDAwNAorI2RlZmluZSBNRTQwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk8JCTB4MDA4CisjZGVmaW5lIE1FNDAwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRwkweDAxMAorI2RlZmluZSBNRTQwMDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFCQkweDAyMAorI2RlZmluZSBNRTQwMDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AJMHgwODAKKyNkZWZpbmUgTUU0MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9ETwkJMHgxMDAKKyNkZWZpbmUgTUU0MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlEJCTB4MjAwCisjZGVmaW5lIE1FNDAwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlEJCTB4NDAwCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQml0cyBmb3IgdGhlIE1FNDAwMF9BT19TVEFUVVNfUkVHIHJlZ2lzdGVyCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUU0MDAwX0FPX1NUQVRVU19CSVRfRlNNCQkweDAxCisjZGVmaW5lIE1FNDAwMF9BT19TVEFUVVNfQklUX0ZGCQkJMHgwMgorI2RlZmluZSBNRTQwMDBfQU9fU1RBVFVTX0JJVF9IRgkJCTB4MDQKKyNkZWZpbmUgTUU0MDAwX0FPX1NUQVRVU19CSVRfRUYJCQkweDA4CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQml0cyBmb3IgdGhlIE1FNDAwMF9BSV9DVFJMX1JFRyByZWdpc3RlcgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FNDAwMF9BSV9DVFJMX0JJVF9NT0RFXzAJCTB4MDAwMDAwMDEKKyNkZWZpbmUgTUU0MDAwX0FJX0NUUkxfQklUX01PREVfMQkJMHgwMDAwMDAwMgorI2RlZmluZSBNRTQwMDBfQUlfQ1RSTF9CSVRfTU9ERV8yCQkweDAwMDAwMDA0CisjZGVmaW5lIE1FNDAwMF9BSV9DVFJMX0JJVF9TQU1QTEVfSE9MRAkJMHgwMDAwMDAwOAorI2RlZmluZSBNRTQwMDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AJMHgwMDAwMDAxMAorI2RlZmluZSBNRTQwMDBfQUlfQ1RSTF9CSVRfU1RPUAkJCTB4MDAwMDAwMjAKKyNkZWZpbmUgTUU0MDAwX0FJX0NUUkxfQklUX0NIQU5ORUxfRklGTwkJMHgwMDAwMDA0MAorI2RlZmluZSBNRTQwMDBfQUlfQ1RSTF9CSVRfREFUQV9GSUZPCQkweDAwMDAwMDgwCisjZGVmaW5lIE1FNDAwMF9BSV9DVFJMX0JJVF9GVUxMU0NBTEUJCTB4MDAwMDAxMDAKKyNkZWZpbmUgTUU0MDAwX0FJX0NUUkxfQklUX09GRlNFVAkJMHgwMDAwMDIwMAorI2RlZmluZSBNRTQwMDBfQUlfQ1RSTF9CSVRfRVhfVFJJR19BTkFMT0cJMHgwMDAwMDQwMAorI2RlZmluZSBNRTQwMDBfQUlfQ1RSTF9CSVRfRVhfVFJJRwkJMHgwMDAwMDgwMAorI2RlZmluZSBNRTQwMDBfQUlfQ1RSTF9CSVRfRVhfVFJJR19GQUxMSU5HCTB4MDAwMDEwMDAKKyNkZWZpbmUgTUU0MDAwX0FJX0NUUkxfQklUX0VYX0lSUQkJMHgwMDAwMjAwMAorI2RlZmluZSBNRTQwMDBfQUlfQ1RSTF9CSVRfRVhfSVJRX1JFU0VUCQkweDAwMDA0MDAwCisjZGVmaW5lIE1FNDAwMF9BSV9DVFJMX0JJVF9MRV9JUlEJCTB4MDAwMDgwMDAKKyNkZWZpbmUgTUU0MDAwX0FJX0NUUkxfQklUX0xFX0lSUV9SRVNFVAkJMHgwMDAxMDAwMAorI2RlZmluZSBNRTQwMDBfQUlfQ1RSTF9CSVRfSEZfSVJRCQkweDAwMDIwMDAwCisjZGVmaW5lIE1FNDAwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQJCTB4MDAwNDAwMDAKKyNkZWZpbmUgTUU0MDAwX0FJX0NUUkxfQklUX1NDX0lSUQkJMHgwMDA4MDAwMAorI2RlZmluZSBNRTQwMDBfQUlfQ1RSTF9CSVRfU0NfSVJRX1JFU0VUCQkweDAwMTAwMDAwCisjZGVmaW5lIE1FNDAwMF9BSV9DVFJMX0JJVF9TQ19SRUxPQUQJCTB4MDAyMDAwMDAKKyNkZWZpbmUgTUU0MDAwX0FJX0NUUkxfQklUX0VYX1RSSUdfQk9USAkJMHg4MDAwMDAwMAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEJpdHMgZm9yIHRoZSBNRTQwMDBfQUlfU1RBVFVTX1JFRyByZWdpc3RlcgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FNDAwMF9BSV9TVEFUVVNfQklUX0VGX0NIQU5ORUwJCTB4MDA0MDAwMDAKKyNkZWZpbmUgTUU0MDAwX0FJX1NUQVRVU19CSVRfSEZfQ0hBTk5FTAkJMHgwMDgwMDAwMAorI2RlZmluZSBNRTQwMDBfQUlfU1RBVFVTX0JJVF9GRl9DSEFOTkVMCQkweDAxMDAwMDAwCisjZGVmaW5lIE1FNDAwMF9BSV9TVEFUVVNfQklUX0VGX0RBVEEJCTB4MDIwMDAwMDAKKyNkZWZpbmUgTUU0MDAwX0FJX1NUQVRVU19CSVRfSEZfREFUQQkJMHgwNDAwMDAwMAorI2RlZmluZSBNRTQwMDBfQUlfU1RBVFVTX0JJVF9GRl9EQVRBCQkweDA4MDAwMDAwCisjZGVmaW5lIE1FNDAwMF9BSV9TVEFUVVNfQklUX0xFCQkJMHgxMDAwMDAwMAorI2RlZmluZSBNRTQwMDBfQUlfU1RBVFVTX0JJVF9GU00JCTB4MjAwMDAwMDAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBCaXRzIGZvciB0aGUgTUU0MDAwX0lSUV9TVEFUVVNfUkVHIHJlZ2lzdGVyCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUU0MDAwX0lSUV9TVEFUVVNfQklUX0VYCQkweDAxCisjZGVmaW5lIE1FNDAwMF9JUlFfU1RBVFVTX0JJVF9MRQkJMHgwMgorI2RlZmluZSBNRTQwMDBfSVJRX1NUQVRVU19CSVRfQUlfSEYJCTB4MDQKKyNkZWZpbmUgTUU0MDAwX0lSUV9TVEFUVVNfQklUX0FPXzBfSEYJCTB4MDgKKyNkZWZpbmUgTUU0MDAwX0lSUV9TVEFUVVNfQklUX0FPXzFfSEYJCTB4MTAKKyNkZWZpbmUgTUU0MDAwX0lSUV9TVEFUVVNfQklUX0FPXzJfSEYJCTB4MjAKKyNkZWZpbmUgTUU0MDAwX0lSUV9TVEFUVVNfQklUX0FPXzNfSEYJCTB4NDAKKyNkZWZpbmUgTUU0MDAwX0lSUV9TVEFUVVNfQklUX1NDCQkweDgwCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQml0cyBmb3IgdGhlIE1FNDAwMF9ESU9fQ1RSTF9SRUcgcmVnaXN0ZXIKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRTQwMDBfRElPX0NUUkxfQklUX01PREVfMAkJMHgwMDAxCisjZGVmaW5lIE1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xCQkweDAwMDIKKyNkZWZpbmUgTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzIJCTB4MDAwNAorI2RlZmluZSBNRTQwMDBfRElPX0NUUkxfQklUX01PREVfMwkJMHgwMDA4CisjZGVmaW5lIE1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV80CQkweDAwMTAKKyNkZWZpbmUgTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzUJCTB4MDAyMAorI2RlZmluZSBNRTQwMDBfRElPX0NUUkxfQklUX01PREVfNgkJMHgwMDQwCisjZGVmaW5lIE1FNDAwMF9ESU9fQ1RSTF9CSVRfTU9ERV83CQkweDAwODAKKworI2RlZmluZSBNRTQwMDBfRElPX0NUUkxfQklUX0ZVTkNUSU9OXzAJCTB4MDEwMAorI2RlZmluZSBNRTQwMDBfRElPX0NUUkxfQklUX0ZVTkNUSU9OXzEJCTB4MDIwMAorCisjZGVmaW5lIE1FNDAwMF9ESU9fQ1RSTF9CSVRfRklGT19ISUdIXzAJCTB4MDQwMAorI2RlZmluZSBNRTQwMDBfRElPX0NUUkxfQklUX0ZJRk9fSElHSF8xCQkweDA4MDAKKyNkZWZpbmUgTUU0MDAwX0RJT19DVFJMX0JJVF9GSUZPX0hJR0hfMgkJMHgxMDAwCisjZGVmaW5lIE1FNDAwMF9ESU9fQ1RSTF9CSVRfRklGT19ISUdIXzMJCTB4MjAwMAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEluZm9ybWF0aW9uIGFib3V0IHRoZSBoYXJkd2FyZSBjYXBhYmlsaXRpZXMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwordHlwZWRlZiBzdHJ1Y3QgbWU0MDAwX2FvX2luZm8geworCWludCBjb3VudDsKKwlpbnQgZmlmb19jb3VudDsKK30gbWU0MDAwX2FvX2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3QgbWU0MDAwX2FpX2luZm8geworCWludCBjb3VudDsKKwlpbnQgc2hfY291bnQ7CisJaW50IGRpZmZfY291bnQ7CisJaW50IGV4X3RyaWdfYW5hbG9nOworfSBtZTQwMDBfYWlfaW5mb190OworCit0eXBlZGVmIHN0cnVjdCBtZTQwMDBfZGlvX2luZm8geworCWludCBjb3VudDsKK30gbWU0MDAwX2Rpb19pbmZvX3Q7CisKK3R5cGVkZWYgc3RydWN0IG1lNDAwMF9jbnRfaW5mbyB7CisJaW50IGNvdW50OworfSBtZTQwMDBfY250X2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3QgbWU0MDAwX2JvYXJkIHsKKwljb25zdCBjaGFyICpuYW1lOworCXVuc2lnbmVkIHNob3J0IGRldmljZV9pZDsKKwltZTQwMDBfYW9faW5mb190IGFvOworCW1lNDAwMF9haV9pbmZvX3QgYWk7CisJbWU0MDAwX2Rpb19pbmZvX3QgZGlvOworCW1lNDAwMF9jbnRfaW5mb190IGNudDsKK30gbWU0MDAwX2JvYXJkX3Q7CisKKyNkZWZpbmUgdGhpc2JvYXJkICgoY29uc3QgbWU0MDAwX2JvYXJkX3QgKilkZXYtPmJvYXJkX3B0cikKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBHbG9iYWwgYm9hcmQgYW5kIHN1YmRldmljZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmVzCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3R5cGVkZWYgc3RydWN0IG1lNDAwMF9hb19jb250ZXh0IHsKKwlpbnQgaXJxOworCisJdW5zaWduZWQgbG9uZyBtaXJyb3I7CS8vIFN0b3JlIHRoZSBsYXN0IHdyaXR0ZW4gdmFsdWUKKworCXVuc2lnbmVkIGxvbmcgY3RybF9yZWc7CisJdW5zaWduZWQgbG9uZyBzdGF0dXNfcmVnOworCXVuc2lnbmVkIGxvbmcgZmlmb19yZWc7CisJdW5zaWduZWQgbG9uZyBzaW5nbGVfcmVnOworCXVuc2lnbmVkIGxvbmcgdGltZXJfcmVnOworCXVuc2lnbmVkIGxvbmcgaXJxX3N0YXR1c19yZWc7CisJdW5zaWduZWQgbG9uZyBwcmVsb2FkX3JlZzsKK30gbWU0MDAwX2FvX2NvbnRleHRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgbWU0MDAwX2FpX2NvbnRleHQgeworCWludCBpcnE7CisKKwl1bnNpZ25lZCBsb25nIGN0cmxfcmVnOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzX3JlZzsKKwl1bnNpZ25lZCBsb25nIGNoYW5uZWxfbGlzdF9yZWc7CisJdW5zaWduZWQgbG9uZyBkYXRhX3JlZzsKKwl1bnNpZ25lZCBsb25nIGNoYW5fdGltZXJfcmVnOworCXVuc2lnbmVkIGxvbmcgY2hhbl9wcmVfdGltZXJfcmVnOworCXVuc2lnbmVkIGxvbmcgc2Nhbl90aW1lcl9sb3dfcmVnOworCXVuc2lnbmVkIGxvbmcgc2Nhbl90aW1lcl9oaWdoX3JlZzsKKwl1bnNpZ25lZCBsb25nIHNjYW5fcHJlX3RpbWVyX2xvd19yZWc7CisJdW5zaWduZWQgbG9uZyBzY2FuX3ByZV90aW1lcl9oaWdoX3JlZzsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3JlZzsKKwl1bnNpZ25lZCBsb25nIGlycV9zdGF0dXNfcmVnOworCXVuc2lnbmVkIGxvbmcgc2FtcGxlX2NvdW50ZXJfcmVnOworfSBtZTQwMDBfYWlfY29udGV4dF90OworCit0eXBlZGVmIHN0cnVjdCBtZTQwMDBfZGlvX2NvbnRleHQgeworCXVuc2lnbmVkIGxvbmcgZGlyX3JlZzsKKwl1bnNpZ25lZCBsb25nIGN0cmxfcmVnOworCXVuc2lnbmVkIGxvbmcgcG9ydF8wX3JlZzsKKwl1bnNpZ25lZCBsb25nIHBvcnRfMV9yZWc7CisJdW5zaWduZWQgbG9uZyBwb3J0XzJfcmVnOworCXVuc2lnbmVkIGxvbmcgcG9ydF8zX3JlZzsKK30gbWU0MDAwX2Rpb19jb250ZXh0X3Q7CisKK3R5cGVkZWYgc3RydWN0IG1lNDAwMF9jbnRfY29udGV4dCB7CisJdW5zaWduZWQgbG9uZyBjdHJsX3JlZzsKKwl1bnNpZ25lZCBsb25nIGNvdW50ZXJfMF9yZWc7CisJdW5zaWduZWQgbG9uZyBjb3VudGVyXzFfcmVnOworCXVuc2lnbmVkIGxvbmcgY291bnRlcl8yX3JlZzsKK30gbWU0MDAwX2NudF9jb250ZXh0X3Q7CisKK3R5cGVkZWYgc3RydWN0IG1lNDAwMF9pbmZvIHsKKwl1bnNpZ25lZCBsb25nIHBseF9yZWdiYXNlOwkvLyBQTFggY29uZmlndXJhdGlvbiBzcGFjZSBiYXNlIGFkZHJlc3MKKwl1bnNpZ25lZCBsb25nIG1lNDAwMF9yZWdiYXNlOwkvLyBCYXNlIGFkZHJlc3Mgb2YgdGhlIE1FNDAwMAorCXVuc2lnbmVkIGxvbmcgdGltZXJfcmVnYmFzZTsJLy8gQmFzZSBhZGRyZXNzIG9mIHRoZSB0aW1lciBjaXJjdWl0CisJdW5zaWduZWQgbG9uZyBwcm9ncmFtX3JlZ2Jhc2U7CS8vIEJhc2UgYWRkcmVzcyB0byBzZXQgdGhlIHByb2dyYW0gcGluIGZvciB0aGUgeGlsaW54CisKKwl1bnNpZ25lZCBsb25nIHBseF9yZWdiYXNlX3NpemU7CS8vIFBMWCByZWdpc3RlciBzZXQgc3BhY2UKKwl1bnNpZ25lZCBsb25nIG1lNDAwMF9yZWdiYXNlX3NpemU7CS8vIE1FNDAwMCByZWdpc3RlciBzZXQgc3BhY2UKKwl1bnNpZ25lZCBsb25nIHRpbWVyX3JlZ2Jhc2Vfc2l6ZTsJLy8gVGltZXIgY2lyY3VpdCByZWdpc3RlciBzZXQgc3BhY2UKKwl1bnNpZ25lZCBsb25nIHByb2dyYW1fcmVnYmFzZV9zaXplOwkvLyBTaXplIG9mIHByb2dyYW0gYmFzZSBhZGRyZXNzIG9mIHRoZSBNRTQwMDAKKworCXVuc2lnbmVkIGludCBzZXJpYWxfbm87CS8vIFNlcmlhbCBudW1iZXIgb2YgdGhlIGJvYXJkCisJdW5zaWduZWQgY2hhciBod19yZXZpc2lvbjsJLy8gSGFyZHdhcmUgcmV2aXNpb24gb2YgdGhlIGJvYXJkCisJdW5zaWduZWQgc2hvcnQgdmVuZG9yX2lkOwkvLyBNZWlsaGF1cyB2ZW5kb3IgaWQKKwl1bnNpZ25lZCBzaG9ydCBkZXZpY2VfaWQ7CS8vIERldmljZSBpZAorCisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZfcDsJLy8gR2VuZXJhbCBQQ0kgaW5mb3JtYXRpb24KKworCXVuc2lnbmVkIGludCBpcnE7CS8vIElSUSBhc3NpZ25lZCBmcm9tIHRoZSBQQ0kgQklPUworCisJc3RydWN0IG1lNDAwMF9haV9jb250ZXh0IGFpX2NvbnRleHQ7CS8vIEFuYWxvZyBpbnB1dCAgc3BlY2lmaWMgY29udGV4dAorCXN0cnVjdCBtZTQwMDBfYW9fY29udGV4dCBhb19jb250ZXh0WzRdOwkvLyBWZWN0b3Igd2l0aCBhbmFsb2cgb3V0cHV0IHNwZWNpZmljIGNvbnRleHQKKwlzdHJ1Y3QgbWU0MDAwX2Rpb19jb250ZXh0IGRpb19jb250ZXh0OwkvLyBEaWdpdGFsIEkvTyBzcGVjaWZpYyBjb250ZXh0CisJc3RydWN0IG1lNDAwMF9jbnRfY29udGV4dCBjbnRfY29udGV4dDsJLy8gQ291bnRlciBzcGVjaWZpYyBjb250ZXh0Cit9IG1lNDAwMF9pbmZvX3Q7CisKKyNkZWZpbmUgaW5mbwkoKG1lNDAwMF9pbmZvX3QgKilkZXYtPnByaXZhdGUpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGVmaW5lcyBmb3IgYW5hbG9nIGlucHV0CisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEdlbmVyYWwgc3R1ZmYgKi8KKyNkZWZpbmUgTUU0MDAwX0FJX0ZJRk9fQ09VTlQJCQkyMDQ4CisKKyNkZWZpbmUgTUU0MDAwX0FJX01JTl9USUNLUwkJCTY2CisjZGVmaW5lIE1FNDAwMF9BSV9NSU5fU0FNUExFX1RJTUUJCTIwMDAJLy8gTWluaW11bSBzYW1wbGUgdGltZSBbbnNdCisjZGVmaW5lIE1FNDAwMF9BSV9CQVNFX0ZSRVFVRU5DWQkJKHVuc2lnbmVkIGludCkgMzNFNgorCisvKiBDaGFubmVsIGxpc3QgZGVmaW5lcyBhbmQgbWFza3MgKi8KKyNkZWZpbmUgTUU0MDAwX0FJX0NIQU5ORUxfTElTVF9DT1VOVAkJMTAyNAorCisjZGVmaW5lIE1FNDAwMF9BSV9MSVNUX0lOUFVUX1NJTkdMRV9FTkRFRAkweDAwMAorI2RlZmluZSBNRTQwMDBfQUlfTElTVF9JTlBVVF9ESUZGRVJFTlRJQUwJMHgwMjAKKworI2RlZmluZSBNRTQwMDBfQUlfTElTVF9SQU5HRV9CSVBPTEFSXzEwCQkweDAwMAorI2RlZmluZSBNRTQwMDBfQUlfTElTVF9SQU5HRV9CSVBPTEFSXzJfNQkweDA0MAorI2RlZmluZSBNRTQwMDBfQUlfTElTVF9SQU5HRV9VTklQT0xBUl8xMAkweDA4MAorI2RlZmluZSBNRTQwMDBfQUlfTElTVF9SQU5HRV9VTklQT0xBUl8yXzUJMHgwQzAKKworI2RlZmluZSBNRTQwMDBfQUlfTElTVF9MQVNUX0VOVFJZCQkweDEwMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERlZmluZXMgZm9yIGNvdW50ZXJzCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgTUU0MDAwX0NOVF9DT1VOVEVSXzAgIDB4MDAKKyNkZWZpbmUgTUU0MDAwX0NOVF9DT1VOVEVSXzEgIDB4NDAKKyNkZWZpbmUgTUU0MDAwX0NOVF9DT1VOVEVSXzIgIDB4ODAKKworI2RlZmluZSBNRTQwMDBfQ05UX01PREVfMCAgICAgMHgwMAkvLyBDaGFuZ2Ugc3RhdGUgaWYgemVybyBjcm9zc2luZworI2RlZmluZSBNRTQwMDBfQ05UX01PREVfMSAgICAgMHgwMgkvLyBSZXRyaWdnZXJhYmxlIE9uZS1TaG90CisjZGVmaW5lIE1FNDAwMF9DTlRfTU9ERV8yICAgICAweDA0CS8vIEFzeW1tZXRyaWNhbCBkaXZpZGVyCisjZGVmaW5lIE1FNDAwMF9DTlRfTU9ERV8zICAgICAweDA2CS8vIFN5bW1ldHJpY2FsIGRpdmlkZXIKKyNkZWZpbmUgTUU0MDAwX0NOVF9NT0RFXzQgICAgIDB4MDgJLy8gQ291bnRlciBzdGFydCBieSBzb2Z0d2FyZSB0cmlnZ2VyCisjZGVmaW5lIE1FNDAwMF9DTlRfTU9ERV81ICAgICAweDBBCS8vIENvdW50ZXIgc3RhcnQgYnkgaGFyZHdhcmUgdHJpZ2dlcgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZV9kYXEuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZV9kYXEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWNjZWMyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21lX2RhcS5jCkBAIC0wLDAgKzEsODQ1IEBACisvKgorCisgICBjb21lZGkvZHJpdmVycy9tZV9kYXEuYworCisgICBIYXJkd2FyZSBkcml2ZXIgZm9yIE1laWxoYXVzIGRhdGEgYWNxdWlzaXRpb24gY2FyZHM6CisKKyAgICAgTUUtMjAwMGksIE1FLTI2MDBpLCBNRS0zMDAwdm0xCisKKyAgIENvcHlyaWdodCAoQykgMjAwMiBNaWNoYWVsIEhpbGxtYW5uIDxoaWxsbWFubkBzeXNjb25ncm91cC5kZT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworLyoKK0RyaXZlcjogbWVfZGFxCitEZXNjcmlwdGlvbjogTWVpbGhhdXMgUENJIGRhdGEgYWNxdWlzaXRpb24gY2FyZHMKK0F1dGhvcjogTWljaGFlbCBIaWxsbWFubiA8aGlsbG1hbm5Ac3lzY29uZ3JvdXAuZGU+CitEZXZpY2VzOiBbTWVpbGhhdXNdIE1FLTI2MDBpIChtZV9kYXEpLCBNRS0yMDAwaQorU3RhdHVzOiBleHBlcmltZW50YWwKKworU3VwcG9ydHM6CisKKyAgICBBbmFsb2cgT3V0cHV0CisKK0NvbmZpZ3VyYXRpb24gb3B0aW9uczoKKworICAgIFswXSAtIFBDSSBidXMgbnVtYmVyIChvcHRpb25hbCkKKyAgICBbMV0gLSBQQ0kgc2xvdCBudW1iZXIgKG9wdGlvbmFsKQorCisgICAgSWYgYnVzL3Nsb3QgaXMgbm90IHNwZWNpZmllZCwgdGhlIGZpcnN0IGF2YWlsYWJsZSBQQ0kKKyAgICBkZXZpY2Ugd2lsbCBiZSB1c2VkLgorCitUaGUgMjYwMCByZXF1aXJlcyBhIGZpcm13YXJlIHVwbG9hZCwgd2hpY2ggY2FuIGJlIGFjY29tcGxpc2hlZAordXNpbmcgdGhlIC1pIG9yIC0taW5pdC1kYXRhIG9wdGlvbiBvZiBjb21lZGlfY29uZmlnLgorVGhlIGZpcm13YXJlIGNhbiBiZQorZm91bmQgaW4gdGhlIGNvbWVkaV9ub25mcmVlX2Zpcm13YXJlIHRhcmJhbGwgYXZhaWxhYmxlCitmcm9tIGh0dHA6Ly93d3cuY29tZWRpLm9yZworCisqLworCisjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisKKyNpbmNsdWRlICJjb21lZGlfcGNpLmgiCisKKy8qI2luY2x1ZGUgIm1lMjYwMF9mdy5oIiAqLworCisjZGVmaW5lIE1FX0RSSVZFUl9OQU1FCQkibWVfZGFxIgorCisjZGVmaW5lIE1FMjAwMF9ERVZJQ0VfSUQJMHgyMDAwCisjZGVmaW5lIE1FMjYwMF9ERVZJQ0VfSUQJMHgyNjAwCisKKyNkZWZpbmUgUExYX0lOVENTUgkJMHg0QwkvKiBQTFggaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBYSUxJTlhfRE9XTkxPQURfUkVTRVQJMHg0MgkvKiBYaWxpbnggcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgTUVfQ09OVFJPTF8xCQkJMHgwMDAwCS8qIC0gfCBXICovCisjZGVmaW5lICAgSU5URVJSVVBUX0VOQUJMRQkJKDE8PDE1KQorI2RlZmluZSAgIENPVU5URVJfQl9JUlEJCQkoMTw8MTIpCisjZGVmaW5lICAgQ09VTlRFUl9BX0lSUQkJCSgxPDwxMSkKKyNkZWZpbmUgICBDSEFOTElTVF9SRUFEWV9JUlEJCSgxPDwxMCkKKyNkZWZpbmUgICBFWFRfSVJRCQkJKDE8PDkpCisjZGVmaW5lICAgQURGSUZPX0hBTEZGVUxMX0lSUQkJKDE8PDgpCisjZGVmaW5lICAgU0NBTl9DT1VOVF9FTkFCTEUJCSgxPDw1KQorI2RlZmluZSAgIFNJTVVMVEFORU9VU19FTkFCTEUJCSgxPDw0KQorI2RlZmluZSAgIFRSSUdHRVJfRkFMTElOR19FREdFCQkoMTw8MykKKyNkZWZpbmUgICBDT05USU5VT1VTX01PREUJCSgxPDwyKQorI2RlZmluZSAgIERJU0FCTEVfQURDCQkJKDA8PDApCisjZGVmaW5lICAgU09GVFdBUkVfVFJJR0dFUkVEX0FEQwkoMTw8MCkKKyNkZWZpbmUgICBTQ0FOX1RSSUdHRVJFRF9BREMJCSgyPDwwKQorI2RlZmluZSAgIEVYVF9UUklHR0VSRURfQURDCQkoMzw8MCkKKyNkZWZpbmUgTUVfQURDX1NUQVJUCQkJMHgwMDAwCS8qIFIgfCAtICovCisjZGVmaW5lIE1FX0NPTlRST0xfMgkJCTB4MDAwMgkvKiAtIHwgVyAqLworI2RlZmluZSAgIEVOQUJMRV9BREZJRk8JCQkoMTw8MTApCisjZGVmaW5lICAgRU5BQkxFX0NIQU5MSVNUCQkoMTw8OSkKKyNkZWZpbmUgICBFTkFCTEVfUE9SVF9CCQkJKDE8PDcpCisjZGVmaW5lICAgRU5BQkxFX1BPUlRfQQkJCSgxPDw2KQorI2RlZmluZSAgIEVOQUJMRV9DT1VOVEVSX0IJCSgxPDw0KQorI2RlZmluZSAgIEVOQUJMRV9DT1VOVEVSX0EJCSgxPDwzKQorI2RlZmluZSAgIEVOQUJMRV9EQUMJCQkoMTw8MSkKKyNkZWZpbmUgICBCVUZGRVJFRF9EQUMJCQkoMTw8MCkKKyNkZWZpbmUgTUVfREFDX1VQREFURQkJCTB4MDAwMgkvKiBSIHwgLSAqLworI2RlZmluZSBNRV9TVEFUVVMJCQkweDAwMDQJLyogUiB8IC0gKi8KKyNkZWZpbmUgICBDT1VOVEVSX0JfSVJRX1BFTkRJTkcJCSgxPDwxMikKKyNkZWZpbmUgICBDT1VOVEVSX0FfSVJRX1BFTkRJTkcJCSgxPDwxMSkKKyNkZWZpbmUgICBDSEFOTElTVF9SRUFEWV9JUlFfUEVORElORwkoMTw8MTApCisjZGVmaW5lICAgRVhUX0lSUV9QRU5ESU5HCQkoMTw8OSkKKyNkZWZpbmUgICBBREZJRk9fSEFMRkZVTExfSVJRX1BFTkRJTkcJKDE8PDgpCisjZGVmaW5lICAgQURGSUZPX0ZVTEwJCQkoMTw8NCkKKyNkZWZpbmUgICBBREZJRk9fSEFMRkZVTEwJCSgxPDwzKQorI2RlZmluZSAgIEFERklGT19FTVBUWQkJCSgxPDwyKQorI2RlZmluZSAgIENIQU5MSVNUX0ZVTEwJCQkoMTw8MSkKKyNkZWZpbmUgICBGU1RfQUNUSVZFCQkJKDE8PDApCisjZGVmaW5lIE1FX1JFU0VUX0lOVEVSUlVQVAkJMHgwMDA0CS8qIC0gfCBXICovCisjZGVmaW5lIE1FX0RJT19QT1JUX0EJCQkweDAwMDYJLyogUiB8IFcgKi8KKyNkZWZpbmUgTUVfRElPX1BPUlRfQgkJCTB4MDAwOAkvKiBSIHwgVyAqLworI2RlZmluZSBNRV9USU1FUl9EQVRBXzAJCQkweDAwMEEJLyogLSB8IFcgKi8KKyNkZWZpbmUgTUVfVElNRVJfREFUQV8xCQkJMHgwMDBDCS8qIC0gfCBXICovCisjZGVmaW5lIE1FX1RJTUVSX0RBVEFfMgkJCTB4MDAwRQkvKiAtIHwgVyAqLworI2RlZmluZSBNRV9DSEFOTkVMX0xJU1QJCQkweDAwMTAJLyogLSB8IFcgKi8KKyNkZWZpbmUgICBBRENfVU5JUE9MQVIJCQkoMTw8NikKKyNkZWZpbmUgICBBRENfR0FJTl8wCQkJKDA8PDQpCisjZGVmaW5lICAgQURDX0dBSU5fMQkJCSgxPDw0KQorI2RlZmluZSAgIEFEQ19HQUlOXzIJCQkoMjw8NCkKKyNkZWZpbmUgICBBRENfR0FJTl8zCQkJKDM8PDQpCisjZGVmaW5lIE1FX1JFQURfQURfRklGTwkJCTB4MDAxMAkvKiBSIHwgLSAqLworI2RlZmluZSBNRV9EQUNfQ09OVFJPTAkJCTB4MDAxMgkvKiAtIHwgVyAqLworI2RlZmluZSAgIERBQ19VTklQT0xBUl9ECQkoMDw8NCkKKyNkZWZpbmUgICBEQUNfQklQT0xBUl9ECQkJKDE8PDQpCisjZGVmaW5lICAgREFDX1VOSVBPTEFSX0MJCSgwPDw1KQorI2RlZmluZSAgIERBQ19CSVBPTEFSX0MJCQkoMTw8NSkKKyNkZWZpbmUgICBEQUNfVU5JUE9MQVJfQgkJKDA8PDYpCisjZGVmaW5lICAgREFDX0JJUE9MQVJfQgkJCSgxPDw2KQorI2RlZmluZSAgIERBQ19VTklQT0xBUl9BCQkoMDw8NykKKyNkZWZpbmUgICBEQUNfQklQT0xBUl9BCQkJKDE8PDcpCisjZGVmaW5lICAgREFDX0dBSU5fMF9ECQkJKDA8PDgpCisjZGVmaW5lICAgREFDX0dBSU5fMV9ECQkJKDE8PDgpCisjZGVmaW5lICAgREFDX0dBSU5fMF9DCQkJKDA8PDkpCisjZGVmaW5lICAgREFDX0dBSU5fMV9DCQkJKDE8PDkpCisjZGVmaW5lICAgREFDX0dBSU5fMF9CCQkJKDA8PDEwKQorI2RlZmluZSAgIERBQ19HQUlOXzFfQgkJCSgxPDwxMCkKKyNkZWZpbmUgICBEQUNfR0FJTl8wX0EJCQkoMDw8MTEpCisjZGVmaW5lICAgREFDX0dBSU5fMV9BCQkJKDE8PDExKQorI2RlZmluZSBNRV9EQUNfQ09OVFJPTF9VUERBVEUJCTB4MDAxMgkvKiBSIHwgLSAqLworI2RlZmluZSBNRV9EQUNfREFUQV9BCQkJMHgwMDE0CS8qIC0gfCBXICovCisjZGVmaW5lIE1FX0RBQ19EQVRBX0IJCQkweDAwMTYJLyogLSB8IFcgKi8KKyNkZWZpbmUgTUVfREFDX0RBVEFfQwkJCTB4MDAxOAkvKiAtIHwgVyAqLworI2RlZmluZSBNRV9EQUNfREFUQV9ECQkJMHgwMDFBCS8qIC0gfCBXICovCisjZGVmaW5lIE1FX0NPVU5URVJfRU5EREFUQV9BCQkweDAwMUMJLyogLSB8IFcgKi8KKyNkZWZpbmUgTUVfQ09VTlRFUl9FTkREQVRBX0IJCTB4MDAxRQkvKiAtIHwgVyAqLworI2RlZmluZSBNRV9DT1VOVEVSX1NUQVJUREFUQV9BCQkweDAwMjAJLyogLSB8IFcgKi8KKyNkZWZpbmUgTUVfQ09VTlRFUl9WQUxVRV9BCQkweDAwMjAJLyogUiB8IC0gKi8KKyNkZWZpbmUgTUVfQ09VTlRFUl9TVEFSVERBVEFfQgkJMHgwMDIyCS8qIC0gfCBXICovCisjZGVmaW5lIE1FX0NPVU5URVJfVkFMVUVfQgkJMHgwMDIyCS8qIFIgfCAtICovCisKKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBpbnQgbWVfYXR0YWNoKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX2RldmNvbmZpZyAqaXQpOworc3RhdGljIGludCBtZV9kZXRhY2goY29tZWRpX2RldmljZSAqZGV2KTsKKworc3RhdGljIGNvbnN0IGNvbWVkaV9scmFuZ2UgbWUyMDAwX2FpX3JhbmdlID0geworCTgsCisJeworCQlCSVBfUkFOR0UoMTApLAorCQlCSVBfUkFOR0UoNSksCisJCUJJUF9SQU5HRSgyLjUpLAorCQlCSVBfUkFOR0UoMS4yNSksCisJCVVOSV9SQU5HRSgxMCksCisJCVVOSV9SQU5HRSg1KSwKKwkJVU5JX1JBTkdFKDIuNSksCisJCVVOSV9SQU5HRSgxLjI1KQorCX0KK307CisKK3N0YXRpYyBjb25zdCBjb21lZGlfbHJhbmdlIG1lMjYwMF9haV9yYW5nZSA9IHsKKwk4LAorCXsKKwkJCUJJUF9SQU5HRSgxMCksCisJCQlCSVBfUkFOR0UoNSksCisJCQlCSVBfUkFOR0UoMi41KSwKKwkJCUJJUF9SQU5HRSgxLjI1KSwKKwkJCVVOSV9SQU5HRSgxMCksCisJCQlVTklfUkFOR0UoNSksCisJCQlVTklfUkFOR0UoMi41KSwKKwkJCVVOSV9SQU5HRSgxLjI1KQorCQl9Cit9OworCitzdGF0aWMgY29uc3QgY29tZWRpX2xyYW5nZSBtZTI2MDBfYW9fcmFuZ2UgPSB7CisJMywKKwl7CisJCQlCSVBfUkFOR0UoMTApLAorCQkJQklQX1JBTkdFKDUpLAorCQkJVU5JX1JBTkdFKDEwKQorCQl9Cit9OworCitzdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUobWVfcGNpX3RhYmxlKSA9IHsKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgTUUyNjAwX0RFVklDRV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIE1FMjAwMF9ERVZJQ0VfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCTB9LAorCXswfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG1lX3BjaV90YWJsZSk7CisKKy8qIEJvYXJkIHNwZWNpZmljYXRpb24gc3RydWN0dXJlICovCitzdHJ1Y3QgbWVfYm9hcmQgeworCWNvbnN0IGNoYXIgKm5hbWU7CS8qIGRyaXZlciBuYW1lICovCisJaW50IGRldmljZV9pZDsKKwlpbnQgYW9fY2hhbm5lbF9uYnI7CS8qIERBIGNvbmZpZyAqLworCWludCBhb19yZXNvbHV0aW9uOworCWludCBhb19yZXNvbHV0aW9uX21hc2s7CisJY29uc3QgY29tZWRpX2xyYW5nZSAqYW9fcmFuZ2VfbGlzdDsKKwlpbnQgYWlfY2hhbm5lbF9uYnI7CS8qIEFEIGNvbmZpZyAqLworCWludCBhaV9yZXNvbHV0aW9uOworCWludCBhaV9yZXNvbHV0aW9uX21hc2s7CisJY29uc3QgY29tZWRpX2xyYW5nZSAqYWlfcmFuZ2VfbGlzdDsKKwlpbnQgZGlvX2NoYW5uZWxfbmJyOwkvKiBESU8gY29uZmlnICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG1lX2JvYXJkIG1lX2JvYXJkc1tdID0geworCXsKKwkJLyogLS0gTUUtMjYwMGkgLS0gKi8KKwkJLm5hbWUgPSAJCU1FX0RSSVZFUl9OQU1FLAorCQkuZGV2aWNlX2lkID0JCU1FMjYwMF9ERVZJQ0VfSUQsCisJCS8qIEFuYWxvZyBPdXRwdXQgKi8KKwkJLmFvX2NoYW5uZWxfbmJyID0JNCwKKwkJLmFvX3Jlc29sdXRpb24gPQkxMiwKKwkJLmFvX3Jlc29sdXRpb25fbWFzayA9CTB4MGZmZiwKKwkJLmFvX3JhbmdlX2xpc3QgPQkmbWUyNjAwX2FvX3JhbmdlLAorCQkuYWlfY2hhbm5lbF9uYnIgPQkxNiwKKwkJLyogQW5hbG9nIElucHV0ICovCisJCS5haV9yZXNvbHV0aW9uID0JMTIsCisJCS5haV9yZXNvbHV0aW9uX21hc2sgPQkweDBmZmYsCisJCS5haV9yYW5nZV9saXN0ID0JJm1lMjYwMF9haV9yYW5nZSwKKwkJLmRpb19jaGFubmVsX25iciA9CTMyLAorCQl9LAorCXsKKwkJLyogLS0gTUUtMjAwMGkgLS0gKi8KKwkJLm5hbWUgPQkJCU1FX0RSSVZFUl9OQU1FLAorCQkuZGV2aWNlX2lkID0JCU1FMjAwMF9ERVZJQ0VfSUQsCisJCS8qIEFuYWxvZyBPdXRwdXQgKi8KKwkJLmFvX2NoYW5uZWxfbmJyID0JMCwKKwkJLmFvX3Jlc29sdXRpb24gPQkwLAorCQkuYW9fcmVzb2x1dGlvbl9tYXNrID0JMCwKKwkJLmFvX3JhbmdlX2xpc3QgPQlOVUxMLAorCQkuYWlfY2hhbm5lbF9uYnIgPQkxNiwKKwkJLyogQW5hbG9nIElucHV0ICovCisJCS5haV9yZXNvbHV0aW9uID0JMTIsCisJCS5haV9yZXNvbHV0aW9uX21hc2sgPQkweDBmZmYsCisJCS5haV9yYW5nZV9saXN0ID0JJm1lMjAwMF9haV9yYW5nZSwKKwkJLmRpb19jaGFubmVsX25iciA9CTMyLAorCQl9Cit9OworCisjZGVmaW5lIG1lX2JvYXJkX25iciAoc2l6ZW9mKG1lX2JvYXJkcykvc2l6ZW9mKHN0cnVjdCBtZV9ib2FyZCkpCisKK3N0YXRpYyBjb21lZGlfZHJpdmVyIG1lX2RyaXZlciA9IHsKKyAgICAgIC5kcml2ZXJfbmFtZSA9CU1FX0RSSVZFUl9OQU1FLAorICAgICAgLm1vZHVsZSA9CQlUSElTX01PRFVMRSwKKyAgICAgIC5hdHRhY2ggPQkJbWVfYXR0YWNoLAorICAgICAgLmRldGFjaCA9CQltZV9kZXRhY2gsCit9OworQ09NRURJX1BDSV9JTklUQ0xFQU5VUChtZV9kcml2ZXIsIG1lX3BjaV90YWJsZSk7CisKKy8qIFByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBtZV9wcml2YXRlX2RhdGEgeworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlOworCXZvaWQgX19pb21lbSAqcGx4X3JlZ2Jhc2U7CS8qIFBMWCBjb25maWd1cmF0aW9uIGJhc2UgYWRkcmVzcyAqLworCXZvaWQgX19pb21lbSAqbWVfcmVnYmFzZTsJLyogQmFzZSBhZGRyZXNzIG9mIHRoZSBNZWlsaGF1cyBjYXJkICovCisJdW5zaWduZWQgbG9uZyBwbHhfcmVnYmFzZV9zaXplOwkvKiBTaXplIG9mIFBMWCBjb25maWd1cmF0aW9uIHNwYWNlICovCisJdW5zaWduZWQgbG9uZyBtZV9yZWdiYXNlX3NpemU7CS8qIFNpemUgb2YgTWVpbGhhdXMgc3BhY2UgKi8KKworCXVuc2lnbmVkIHNob3J0IGNvbnRyb2xfMTsJLyogTWlycm9yIG9mIENPTlRST0xfMSByZWdpc3RlciAqLworCXVuc2lnbmVkIHNob3J0IGNvbnRyb2xfMjsJLyogTWlycm9yIG9mIENPTlRST0xfMiByZWdpc3RlciAqLworCXVuc2lnbmVkIHNob3J0IGRhY19jb250cm9sOwkvKiBNaXJyb3Igb2YgdGhlIERBQ19DT05UUk9MIHJlZ2lzdGVyICovCisJaW50IGFvX3JlYWRiYWNrWzRdOwkvKiBNaXJyb3Igb2YgYW5hbG9nIG91dHB1dCBkYXRhICovCit9OworCisjZGVmaW5lIGRldl9wcml2YXRlICgoc3RydWN0IG1lX3ByaXZhdGVfZGF0YSAqKWRldi0+cHJpdmF0ZSkKKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEhlbHBmdWwgZnVuY3Rpb25zCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzbGVlcCh1bnNpZ25lZCBzZWMpCit7CisJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJc2NoZWR1bGVfdGltZW91dChzZWMgKiBIWik7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBESUdJVEFMIElOUFVUL09VVFBVVCBTRUNUSU9OCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyBpbnQgbWVfZGlvX2luc25fY29uZmlnKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwlpbnQgYml0czsKKwlpbnQgbWFzayA9IDEgPDwgQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisKKwkvKiBjYWxjdWxhdGUgcG9ydCAqLworCWlmIChtYXNrICYgMHgwMDAwZmZmZikgewkvKiBQb3J0IEEgaW4gdXNlICovCisJCWJpdHMgPSAweDAwMDBmZmZmOworCisJCS8qIEVuYWJsZSBQb3J0IEEgKi8KKwkJZGV2X3ByaXZhdGUtPmNvbnRyb2xfMiB8PSBFTkFCTEVfUE9SVF9BOworCQl3cml0ZXcoZGV2X3ByaXZhdGUtPmNvbnRyb2xfMiwKKwkJCWRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfQ09OVFJPTF8yKTsKKwl9IGVsc2UgewkJLyogUG9ydCBCIGluIHVzZSAqLworCisJCWJpdHMgPSAweGZmZmYwMDAwOworCisJCS8qIEVuYWJsZSBQb3J0IEIgKi8KKwkJZGV2X3ByaXZhdGUtPmNvbnRyb2xfMiB8PSBFTkFCTEVfUE9SVF9COworCQl3cml0ZXcoZGV2X3ByaXZhdGUtPmNvbnRyb2xfMiwKKwkJCWRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfQ09OVFJPTF8yKTsKKwl9CisKKwlpZiAoZGF0YVswXSkgeworCQkvKiBDb25maWcgcG9ydCBhcyBvdXRwdXQgKi8KKwkJcy0+aW9fYml0cyB8PSBiaXRzOworCX0gZWxzZSB7CisJCS8qIENvbmZpZyBwb3J0IGFzIGlucHV0ICovCisJCXMtPmlvX2JpdHMgJj0gfmJpdHM7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qIERpZ2l0YWwgaW5zdGFudCBpbnB1dC9vdXRwdXRzICovCitzdGF0aWMgaW50IG1lX2Rpb19pbnNuX2JpdHMoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IGRhdGFbMF07CisJcy0+c3RhdGUgJj0gfm1hc2s7CisJcy0+c3RhdGUgfD0gKG1hc2sgJiBkYXRhWzFdKTsKKworCW1hc2sgJj0gcy0+aW9fYml0czsKKwlpZiAobWFzayAmIDB4MDAwMGZmZmYpIHsJLyogUG9ydCBBICovCisJCXdyaXRldygocy0+c3RhdGUgJiAweGZmZmYpLAorCQkJZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBNRV9ESU9fUE9SVF9BKTsKKwl9IGVsc2UgeworCQlkYXRhWzFdICY9IH4weDAwMDBmZmZmOworCQlkYXRhWzFdIHw9IHJlYWR3KGRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfRElPX1BPUlRfQSk7CisJfQorCisJaWYgKG1hc2sgJiAweGZmZmYwMDAwKSB7CS8qIFBvcnQgQiAqLworCQl3cml0ZXcoKChzLT5zdGF0ZSA+PiAxNikgJiAweGZmZmYpLAorCQkJZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBNRV9ESU9fUE9SVF9CKTsKKwl9IGVsc2UgeworCQlkYXRhWzFdICY9IH4weGZmZmYwMDAwOworCQlkYXRhWzFdIHw9IHJlYWR3KGRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfRElPX1BPUlRfQikgPDwgMTY7CisJfQorCisJcmV0dXJuIDI7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBBTkFMT0cgSU5QVVQgU0VDVElPTgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qIEFuYWxvZyBpbnN0YW50IGlucHV0ICovCitzdGF0aWMgaW50IG1lX2FpX2luc25fcmVhZChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCSAgIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwl1bnNpZ25lZCBzaG9ydCB2YWx1ZTsKKwlpbnQgY2hhbiA9IENSX0NIQU4oKCZpbnNuLT5jaGFuc3BlYylbMF0pOworCWludCByYW5nID0gQ1JfUkFOR0UoKCZpbnNuLT5jaGFuc3BlYylbMF0pOworCWludCBhcmVmID0gQ1JfQVJFRigoJmluc24tPmNoYW5zcGVjKVswXSk7CisJaW50IGk7CisKKwkvKiBzdG9wIGFueSBydW5uaW5nIGNvbnZlcnNpb24gKi8KKwlkZXZfcHJpdmF0ZS0+Y29udHJvbF8xICY9IDB4RkZGQzsKKwl3cml0ZXcoZGV2X3ByaXZhdGUtPmNvbnRyb2xfMSwgZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBNRV9DT05UUk9MXzEpOworCisJLyogY2xlYXIgY2hhbmxpc3QgYW5kIGFkIGZpZm8gKi8KKwlkZXZfcHJpdmF0ZS0+Y29udHJvbF8yICY9IH4oRU5BQkxFX0FERklGTyB8IEVOQUJMRV9DSEFOTElTVCk7CisJd3JpdGV3KGRldl9wcml2YXRlLT5jb250cm9sXzIsIGRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfQ09OVFJPTF8yKTsKKworCS8qIHJlc2V0IGFueSBwZW5kaW5nIGludGVycnVwdCAqLworCXdyaXRldygweDAwLCBkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX1JFU0VUX0lOVEVSUlVQVCk7CisKKwkvKiBlbmFibGUgdGhlIGNoYW5saXN0IGFuZCBBREMgZmlmbyAqLworCWRldl9wcml2YXRlLT5jb250cm9sXzIgfD0gKEVOQUJMRV9BREZJRk8gfCBFTkFCTEVfQ0hBTkxJU1QpOworCXdyaXRldyhkZXZfcHJpdmF0ZS0+Y29udHJvbF8yLCBkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX0NPTlRST0xfMik7CisKKwkvKiB3cml0ZSB0byBjaGFubmVsIGxpc3QgZmlmbyAqLworCS8qIGIzOmIwIGFyZSB0aGUgY2hhbm5lbCBudW1iZXIgKi8KKwl2YWx1ZSA9IGNoYW4gJiAweDBmOworCS8qIGI1OmI0IGFyZSB0aGUgY2hhbm5lbCBnYWluICovCisJdmFsdWUgfD0gKHJhbmcgJiAweDAzKSA8PCA0OworCS8qIGI2IGNoYW5uZWwgcG9sYXJpdHkgKi8KKwl2YWx1ZSB8PSAocmFuZyAmIDB4MDQpIDw8IDQ7CisJLyogYjcgc2luZ2xlIG9yIGRpZmZlcmVudGlhbCAqLworCXZhbHVlIHw9ICgoYXJlZiAmIEFSRUZfRElGRikgPyAweDgwIDogMCk7CisJd3JpdGV3KHZhbHVlICYgMHhmZiwgZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBNRV9DSEFOTkVMX0xJU1QpOworCisJLyogc2V0IEFEQyBtb2RlIHRvIHNvZnR3YXJlIHRyaWdnZXIgKi8KKwlkZXZfcHJpdmF0ZS0+Y29udHJvbF8xIHw9IFNPRlRXQVJFX1RSSUdHRVJFRF9BREM7CisJd3JpdGV3KGRldl9wcml2YXRlLT5jb250cm9sXzEsIGRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfQ09OVFJPTF8xKTsKKworCS8qIHN0YXJ0IGNvbnZlcnNpb24gYnkgcmVhZGluZyBmcm9tIEFEQ19TVEFSVCAqLworCXJlYWR3KGRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfQURDX1NUQVJUKTsKKworCS8qIHdhaXQgZm9yIEFEQyBmaWZvIG5vdCBlbXB0eSBmbGFnICovCisJZm9yIChpID0gMTAwMDAwOyBpID4gMDsgaS0tKQorCQlpZiAoIShyZWFkdyhkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX1NUQVRVUykgJiAweDAwMDQpKQorCQkJYnJlYWs7CisKKwkvKiBnZXQgdmFsdWUgZnJvbSBBREMgZmlmbyAqLworCWlmIChpKSB7CisJCWRhdGFbMF0gPQorCQkJKHJlYWR3KGRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsKKwkJCQlNRV9SRUFEX0FEX0ZJRk8pIF4gMHg4MDApICYgMHgwRkZGOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAiY29tZWRpJWQ6IENhbm5vdCBnZXQgc2luZ2xlIHZhbHVlXG4iLAorCQkgICAgICAgZGV2LT5taW5vcik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIHN0b3AgYW55IHJ1bm5pbmcgY29udmVyc2lvbiAqLworCWRldl9wcml2YXRlLT5jb250cm9sXzEgJj0gMHhGRkZDOworCXdyaXRldyhkZXZfcHJpdmF0ZS0+Y29udHJvbF8xLCBkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX0NPTlRST0xfMSk7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEhBUkRXQVJFIFRSSUdHRVJFRCBBTkFMT0cgSU5QVVQgU0VDVElPTgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qIENhbmNlbCBhbmFsb2cgaW5wdXQgYXV0b3NjYW4gKi8KK3N0YXRpYyBpbnQgbWVfYWlfY2FuY2VsKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKworCS8qIHN0b3AgYW55IHJ1bm5pbmcgY29udmVyc2lvbiAqLworCWRldl9wcml2YXRlLT5jb250cm9sXzEgJj0gMHhGRkZDOworCXdyaXRldyhkZXZfcHJpdmF0ZS0+Y29udHJvbF8xLCBkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX0NPTlRST0xfMSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogVGVzdCBhbmFsb2cgaW5wdXQgY29tbWFuZCAqLworc3RhdGljIGludCBtZV9haV9kb19jbWRfdGVzdChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgIGNvbWVkaV9jbWQgKmNtZCkKK3sKKwlyZXR1cm4gMDsKK30KKworLyogQW5hbG9nIGlucHV0IGNvbW1hbmQgKi8KK3N0YXRpYyBpbnQgbWVfYWlfZG9fY21kKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqc3ViZGV2aWNlKQoreworCXJldHVybiAwOworfQorCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogQU5BTE9HIE9VVFBVVCBTRUNUSU9OCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyogQW5hbG9nIGluc3RhbnQgb3V0cHV0ICovCitzdGF0aWMgaW50IG1lX2FvX2luc25fd3JpdGUoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwlpbnQgY2hhbjsKKwlpbnQgcmFuZzsKKwlpbnQgaTsKKworCS8qIEVuYWJsZSBhbGwgREFDICovCisJZGV2X3ByaXZhdGUtPmNvbnRyb2xfMiB8PSBFTkFCTEVfREFDOworCXdyaXRldyhkZXZfcHJpdmF0ZS0+Y29udHJvbF8yLCBkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX0NPTlRST0xfMik7CisKKwkvKiBhbmQgc2V0IERBQyB0byAiYnVmZmVyZWQiIG1vZGUgKi8KKwlkZXZfcHJpdmF0ZS0+Y29udHJvbF8yIHw9IEJVRkZFUkVEX0RBQzsKKwl3cml0ZXcoZGV2X3ByaXZhdGUtPmNvbnRyb2xfMiwgZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBNRV9DT05UUk9MXzIpOworCisJLyogU2V0IGRhYy1jb250cm9sIHJlZ2lzdGVyICovCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgeworCQljaGFuID0gQ1JfQ0hBTigoJmluc24tPmNoYW5zcGVjKVtpXSk7CisJCXJhbmcgPSBDUl9SQU5HRSgoJmluc24tPmNoYW5zcGVjKVtpXSk7CisKKwkJLyogY2xlYXIgYml0cyBmb3IgdGhpcyBjaGFubmVsICovCisJCWRldl9wcml2YXRlLT5kYWNfY29udHJvbCAmPSB+KDB4MDg4MCA+PiBjaGFuKTsKKwkJaWYgKHJhbmcgPT0gMCkKKwkJCWRldl9wcml2YXRlLT5kYWNfY29udHJvbCB8PQorCQkJCSgoREFDX0JJUE9MQVJfQSB8IERBQ19HQUlOXzFfQSkgPj4gY2hhbik7CisJCWVsc2UgaWYgKHJhbmcgPT0gMSkKKwkJCWRldl9wcml2YXRlLT5kYWNfY29udHJvbCB8PQorCQkJCSgoREFDX0JJUE9MQVJfQSB8IERBQ19HQUlOXzBfQSkgPj4gY2hhbik7CisJfQorCXdyaXRldyhkZXZfcHJpdmF0ZS0+ZGFjX2NvbnRyb2wsCisJCWRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfREFDX0NPTlRST0wpOworCisJLyogVXBkYXRlIGRhYy1jb250cm9sIHJlZ2lzdGVyICovCisJcmVhZHcoZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBNRV9EQUNfQ09OVFJPTF9VUERBVEUpOworCisJLyogU2V0IGRhdGEgcmVnaXN0ZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CisJCWNoYW4gPSBDUl9DSEFOKCgmaW5zbi0+Y2hhbnNwZWMpW2ldKTsKKwkJd3JpdGV3KChkYXRhWzBdICYgcy0+bWF4ZGF0YSksCisJCQlkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX0RBQ19EQVRBX0EgKyAoY2hhbiA8PCAxKSk7CisJCWRldl9wcml2YXRlLT5hb19yZWFkYmFja1tjaGFuXSA9IChkYXRhWzBdICYgcy0+bWF4ZGF0YSk7CisJfQorCisJLyogVXBkYXRlIGRhYyB3aXRoIGRhdGEgcmVnaXN0ZXJzICovCisJcmVhZHcoZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBNRV9EQUNfVVBEQVRFKTsKKworCXJldHVybiBpOworfQorCisvKiBBbmFsb2cgb3V0cHV0IHJlYWRiYWNrICovCitzdGF0aWMgaW50IG1lX2FvX2luc25fcmVhZChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CisJCWRhdGFbaV0gPQorCQkJZGV2X3ByaXZhdGUtPmFvX3JlYWRiYWNrW0NSX0NIQU4oKCZpbnNuLT5jaGFuc3BlYylbaV0pXTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIElOSVRJQUxJU0FUSU9OIFNFQ1RJT04KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKiBYaWxpbnggZmlybXdhcmUgZG93bmxvYWQgZm9yIGNhcmQ6IE1FLTI2MDBpICovCitzdGF0aWMgaW50IG1lMjYwMF94aWxpbnhfZG93bmxvYWQoY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgdW5zaWduZWQgY2hhciAqbWUyNjAwX2Zpcm13YXJlLAorCQkJCSAgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsdWU7CisJdW5zaWduZWQgaW50IGZpbGVfbGVuZ3RoOworCXVuc2lnbmVkIGludCBpOworCisJLyogZGlzYWJsZSBpcnEncyBvbiBQTFggKi8KKwl3cml0ZWwoMHgwMCwgZGV2X3ByaXZhdGUtPnBseF9yZWdiYXNlICsgUExYX0lOVENTUik7CisKKwkvKiBGaXJzdCwgbWFrZSBhIGR1bW15IHJlYWQgdG8gcmVzZXQgeGlsaW54ICovCisJdmFsdWUgPSByZWFkdyhkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIFhJTElOWF9ET1dOTE9BRF9SRVNFVCk7CisKKwkvKiBXYWl0IHVudGlsIHJlc2V0IGlzIG92ZXIgKi8KKwlzbGVlcCgxKTsKKworCS8qIFdyaXRlIGEgZHVtbXkgdmFsdWUgdG8gWGlsaW54ICovCisJd3JpdGViKDB4MDAsIGRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgMHgwKTsKKwlzbGVlcCgxKTsKKworCS8qCisJICogRm9ybWF0IG9mIHRoZSBmaXJtd2FyZQorCSAqIEJ1aWxkIGxvbmdzIGZyb20gdGhlIGJ5dGUtd2lzZSBjb2RlZCBoZWFkZXIKKwkgKiBCeXRlIDEtMzogICBsZW5ndGggb2YgdGhlIGFycmF5CisJICogQnl0ZSA0LTc6ICAgdmVyc2lvbgorCSAqIEJ5dGUgOC0xMTogIGRhdGUKKwkgKiBCeXRlIDEyLTE1OiByZXNlcnZlZAorCSAqLworCWlmIChsZW5ndGggPCAxNikKKwkJcmV0dXJuIC1FSU5WQUw7CisJZmlsZV9sZW5ndGggPSAoKCh1bnNpZ25lZCBpbnQpbWUyNjAwX2Zpcm13YXJlWzBdICYgMHhmZikgPDwgMjQpICsKKwkJICAgICAgKCgodW5zaWduZWQgaW50KW1lMjYwMF9maXJtd2FyZVsxXSAmIDB4ZmYpIDw8IDE2KSArCisJCSAgICAgICgoKHVuc2lnbmVkIGludCltZTI2MDBfZmlybXdhcmVbMl0gJiAweGZmKSA8PCA4KSArCisJCSAgICAgICgodW5zaWduZWQgaW50KW1lMjYwMF9maXJtd2FyZVszXSAmIDB4ZmYpOworCisJLyoKKwkgKiBMb29wIGZvciB3cml0aW5nIGZpcm13YXJlIGJ5dGUgYnkgYnl0ZSB0byB4aWxpbngKKwkgKiBGaXJtd2FyZSBkYXRhIHN0YXJ0IGF0IG9mZmZzZXQgMTYKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZmlsZV9sZW5ndGg7IGkrKykKKwkJd3JpdGViKChtZTI2MDBfZmlybXdhcmVbMTYgKyBpXSAmIDB4ZmYpLAorCQkJZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyAweDApOworCisJLyogV3JpdGUgNSBkdW1teSB2YWx1ZXMgdG8geGlsaW54ICovCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwkJd3JpdGViKDB4MDAsIGRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgMHgwKTsKKworCS8qIFRlc3QgaWYgdGhlcmUgd2FzIGFuIGVycm9yIGR1cmluZyBkb3dubG9hZCAtPiBJTlRCIHdhcyB0aHJvd24gKi8KKwl2YWx1ZSA9IHJlYWRsKGRldl9wcml2YXRlLT5wbHhfcmVnYmFzZSArIFBMWF9JTlRDU1IpOworCWlmICh2YWx1ZSAmIDB4MjApIHsKKwkJLyogRGlzYWJsZSBpbnRlcnJ1cHQgKi8KKwkJd3JpdGVsKDB4MDAsIGRldl9wcml2YXRlLT5wbHhfcmVnYmFzZSArIFBMWF9JTlRDU1IpOworCQlwcmludGsoS0VSTl9FUlIgImNvbWVkaSVkOiBYaWxpbnggZG93bmxvYWQgZmFpbGVkXG4iLAorCQkgICAgICAgZGV2LT5taW5vcik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIFdhaXQgdW50aWwgdGhlIFhpbGlueCBpcyByZWFkeSBmb3IgcmVhbCB3b3JrICovCisJc2xlZXAoMSk7CisKKwkvKiBFbmFibGUgUExYLUludGVycnVwdHMgKi8KKwl3cml0ZWwoMHg0MywgZGV2X3ByaXZhdGUtPnBseF9yZWdiYXNlICsgUExYX0lOVENTUik7CisKKwlyZXR1cm4gMDsKK30KKworLyogUmVzZXQgZGV2aWNlICovCitzdGF0aWMgaW50IG1lX3Jlc2V0KGNvbWVkaV9kZXZpY2UgKmRldikKK3sKKwkvKiBSZXNldCBib2FyZCAqLworCXdyaXRldygweDAwLCBkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX0NPTlRST0xfMSk7CisJd3JpdGV3KDB4MDAsIGRldl9wcml2YXRlLT5tZV9yZWdiYXNlICsgTUVfQ09OVFJPTF8yKTsKKwl3cml0ZXcoMHgwMCwgZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UgKyBNRV9SRVNFVF9JTlRFUlJVUFQpOworCXdyaXRldygweDAwLCBkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSArIE1FX0RBQ19DT05UUk9MKTsKKworCS8qIFNhdmUgdmFsdWVzIGluIHRoZSBib2FyZCBjb250ZXh0ICovCisJZGV2X3ByaXZhdGUtPmRhY19jb250cm9sID0gMDsKKwlkZXZfcHJpdmF0ZS0+Y29udHJvbF8xID0gMDsKKwlkZXZfcHJpdmF0ZS0+Y29udHJvbF8yID0gMDsKKworCXJldHVybiAwOworfQorCisvKgorICogQXR0YWNoCisgKgorICogLSBSZWdpc3RlciBQQ0kgZGV2aWNlCisgKiAtIERlY2xhcmUgZGV2aWNlIGRyaXZlciBjYXBhYmlsaXR5CisgKi8KK3N0YXRpYyBpbnQgbWVfYXR0YWNoKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX2RldmNvbmZpZyAqaXQpCit7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2U7CisJY29tZWRpX3N1YmRldmljZSAqc3ViZGV2aWNlOworCXN0cnVjdCBtZV9ib2FyZCAqYm9hcmQ7CisJcmVzb3VyY2Vfc2l6ZV90IHBseF9yZWdiYXNlX3RtcDsKKwl1bnNpZ25lZCBsb25nIHBseF9yZWdiYXNlX3NpemVfdG1wOworCXJlc291cmNlX3NpemVfdCBtZV9yZWdiYXNlX3RtcDsKKwl1bnNpZ25lZCBsb25nIG1lX3JlZ2Jhc2Vfc2l6ZV90bXA7CisJcmVzb3VyY2Vfc2l6ZV90IHN3YXBfcmVnYmFzZV90bXA7CisJdW5zaWduZWQgbG9uZyBzd2FwX3JlZ2Jhc2Vfc2l6ZV90bXA7CisJcmVzb3VyY2Vfc2l6ZV90IHJlZ2Jhc2VfdG1wOworCWludCByZXN1bHQsIGVycm9yLCBpOworCisJLyogQWxsb2NhdGUgcHJpdmF0ZSBtZW1vcnkgKi8KKwlpZiAoYWxsb2NfcHJpdmF0ZShkZXYsIHNpemVvZihzdHJ1Y3QgbWVfcHJpdmF0ZV9kYXRhKSkgPCAwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIFByb2JlIHRoZSBkZXZpY2UgdG8gZGV0ZXJtaW5lIHdoYXQgZGV2aWNlIGluIHRoZSBzZXJpZXMgaXQgaXMuICovCisJZm9yIChwY2lfZGV2aWNlID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgTlVMTCk7CisJCXBjaV9kZXZpY2UgIT0gTlVMTDsKKwkJcGNpX2RldmljZSA9CisJCXBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIHBjaV9kZXZpY2UpKSB7CisJCWlmIChwY2lfZGV2aWNlLT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9NRUlMSEFVUykgeworCQkJZm9yIChpID0gMDsgaSA8IG1lX2JvYXJkX25icjsgaSsrKSB7CisJCQkJaWYgKG1lX2JvYXJkc1tpXS5kZXZpY2VfaWQgPT0KKwkJCQkJcGNpX2RldmljZS0+ZGV2aWNlKSB7CisJCQkJCS8qCisJCQkJCSAqIHdhcyBhIHBhcnRpY3VsYXIgYnVzL3Nsb3QgcmVxdWVzdGVkPworCQkJCQkgKi8KKwkJCQkJaWYgKChpdC0+b3B0aW9uc1swXSAhPSAwKQorCQkJCQkJfHwgKGl0LT5vcHRpb25zWzFdICE9IDApKSB7CisJCQkJCQkvKgorCQkJCQkJICogYXJlIHdlIG9uIHRoZSB3cm9uZyBidXMvc2xvdD8KKwkJCQkJCSAqLworCQkJCQkJaWYgKHBjaV9kZXZpY2UtPmJ1cy0+bnVtYmVyICE9CisJCQkJCQkJaXQtPm9wdGlvbnNbMF0KKwkJCQkJCQl8fCBQQ0lfU0xPVChwY2lfZGV2aWNlLT4KKwkJCQkJCQkJZGV2Zm4pICE9CisJCQkJCQkJaXQtPm9wdGlvbnNbMV0pIHsKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWRldi0+Ym9hcmRfcHRyID0gbWVfYm9hcmRzICsgaTsKKwkJCQkJYm9hcmQgPSAoc3RydWN0IG1lX2JvYXJkICopIGRldi0+CisJCQkJCQlib2FyZF9wdHI7CisJCQkJCWRldl9wcml2YXRlLT5wY2lfZGV2aWNlID0gcGNpX2RldmljZTsKKwkJCQkJZ290byBmb3VuZDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlwcmludGsoS0VSTl9FUlIKKwkgICAgICAgImNvbWVkaSVkOiBubyBzdXBwb3J0ZWQgYm9hcmQgZm91bmQhIChyZXEuIGJ1cy9zbG90IDogJWQvJWQpXG4iLAorCSAgICAgICBkZXYtPm1pbm9yLCBpdC0+b3B0aW9uc1swXSwgaXQtPm9wdGlvbnNbMV0pOworCXJldHVybiAtRUlPOworCitmb3VuZDoKKwlwcmludGsoS0VSTl9JTkZPICJjb21lZGklZDogZm91bmQgJXMgYXQgUENJIGJ1cyAlZCwgc2xvdCAlZFxuIiwKKwkJZGV2LT5taW5vciwgbWVfYm9hcmRzW2ldLm5hbWUsCisJCXBjaV9kZXZpY2UtPmJ1cy0+bnVtYmVyLCBQQ0lfU0xPVChwY2lfZGV2aWNlLT5kZXZmbikpOworCisJLyogRW5hYmxlIFBDSSBkZXZpY2UgYW5kIHJlcXVlc3QgUENJIHJlZ2lvbnMgKi8KKwlpZiAoY29tZWRpX3BjaV9lbmFibGUocGNpX2RldmljZSwgTUVfRFJJVkVSX05BTUUpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImNvbWVkaSVkOiBGYWlsZWQgdG8gZW5hYmxlIFBDSSBkZXZpY2UgYW5kICIKKwkJICAgICAgICJyZXF1ZXN0IHJlZ2lvbnNcbiIsIGRldi0+bWlub3IpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBTZXQgZGF0YSBpbiBkZXZpY2Ugc3RydWN0dXJlICovCisJZGV2LT5ib2FyZF9uYW1lID0gYm9hcmQtPm5hbWU7CisKKwkvKiBSZWFkIFBMWCByZWdpc3RlciBiYXNlIGFkZHJlc3MgW1BDSV9CQVNFX0FERFJFU1MgIzBdLiAqLworCXBseF9yZWdiYXNlX3RtcCA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2aWNlLCAwKTsKKwlwbHhfcmVnYmFzZV9zaXplX3RtcCA9IHBjaV9yZXNvdXJjZV9sZW4ocGNpX2RldmljZSwgMCk7CisJZGV2X3ByaXZhdGUtPnBseF9yZWdiYXNlID0KKwkJaW9yZW1hcChwbHhfcmVnYmFzZV90bXAsIHBseF9yZWdiYXNlX3NpemVfdG1wKTsKKwlkZXZfcHJpdmF0ZS0+cGx4X3JlZ2Jhc2Vfc2l6ZSA9IHBseF9yZWdiYXNlX3NpemVfdG1wOworCWlmICghZGV2X3ByaXZhdGUtPnBseF9yZWdiYXNlKSB7CisJCXByaW50aygiY29tZWRpJWQ6IEZhaWxlZCB0byByZW1hcCBJL08gbWVtb3J5XG4iLCBkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogUmVhZCBTd2FwIGJhc2UgYWRkcmVzcyBbUENJX0JBU0VfQUREUkVTUyAjNV0uICovCisKKwlzd2FwX3JlZ2Jhc2VfdG1wID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXZpY2UsIDUpOworCXN3YXBfcmVnYmFzZV9zaXplX3RtcCA9IHBjaV9yZXNvdXJjZV9sZW4ocGNpX2RldmljZSwgNSk7CisKKwlpZiAoIXN3YXBfcmVnYmFzZV90bXApCisJCXByaW50ayhLRVJOX0VSUiAiY29tZWRpJWQ6IFN3YXAgbm90IHByZXNlbnRcbiIsIGRldi0+bWlub3IpOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdvcmthcm91bmQgc3RhcnQgLS0tKi8KKwlpZiAocGx4X3JlZ2Jhc2VfdG1wICYgMHgwMDgwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY29tZWRpJWQ6IFBMWC1CdWcgZGV0ZWN0ZWRcbiIsIGRldi0+bWlub3IpOworCisJCWlmIChzd2FwX3JlZ2Jhc2VfdG1wKSB7CisJCQlyZWdiYXNlX3RtcCA9IHBseF9yZWdiYXNlX3RtcDsKKwkJCXBseF9yZWdiYXNlX3RtcCA9IHN3YXBfcmVnYmFzZV90bXA7CisJCQlzd2FwX3JlZ2Jhc2VfdG1wID0gcmVnYmFzZV90bXA7CisKKwkJCXJlc3VsdCA9IHBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpX2RldmljZSwKKwkJCQlQQ0lfQkFTRV9BRERSRVNTXzAsIHBseF9yZWdiYXNlX3RtcCk7CisJCQlpZiAocmVzdWx0ICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCkKKwkJCQlyZXR1cm4gLUVJTzsKKworCQkJcmVzdWx0ID0gcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lfZGV2aWNlLAorCQkJCVBDSV9CQVNFX0FERFJFU1NfNSwgc3dhcF9yZWdiYXNlX3RtcCk7CisJCQlpZiAocmVzdWx0ICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJfSBlbHNlIHsKKwkJCXBseF9yZWdiYXNlX3RtcCAtPSAweDgwOworCQkJcmVzdWx0ID0gcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lfZGV2aWNlLAorCQkJCVBDSV9CQVNFX0FERFJFU1NfMCwgcGx4X3JlZ2Jhc2VfdG1wKTsKKwkJCWlmIChyZXN1bHQgIT0gUENJQklPU19TVUNDRVNTRlVMKQorCQkJCXJldHVybiAtRUlPOworCQl9CisJfQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdvcmthcm91bmQgZW5kIC0tLS0tKi8KKworCS8qIFJlYWQgTWVpbGhhdXMgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIFtQQ0lfQkFTRV9BRERSRVNTICMyXS4gKi8KKworCW1lX3JlZ2Jhc2VfdG1wID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXZpY2UsIDIpOworCW1lX3JlZ2Jhc2Vfc2l6ZV90bXAgPSBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXZpY2UsIDIpOworCWRldl9wcml2YXRlLT5tZV9yZWdiYXNlX3NpemUgPSBtZV9yZWdiYXNlX3NpemVfdG1wOworCWRldl9wcml2YXRlLT5tZV9yZWdiYXNlID0gaW9yZW1hcChtZV9yZWdiYXNlX3RtcCwgbWVfcmVnYmFzZV9zaXplX3RtcCk7CisJaWYgKCFkZXZfcHJpdmF0ZS0+bWVfcmVnYmFzZSkgeworCQlwcmludGsoS0VSTl9FUlIgImNvbWVkaSVkOiBGYWlsZWQgdG8gcmVtYXAgSS9PIG1lbW9yeVxuIiwKKwkJICAgICAgIGRldi0+bWlub3IpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLyogRG93bmxvYWQgZmlybXdhcmUgYW5kIHJlc2V0IGNhcmQgKi8KKwlpZiAoYm9hcmQtPmRldmljZV9pZCA9PSBNRTI2MDBfREVWSUNFX0lEKSB7CisJCXVuc2lnbmVkIGNoYXIgKmF1eF9kYXRhOworCQlpbnQgYXV4X2xlbjsKKworCQlhdXhfZGF0YSA9IGNvbWVkaV9hdXhfZGF0YShpdC0+b3B0aW9ucywgMCk7CisJCWF1eF9sZW4gPSBpdC0+b3B0aW9uc1tDT01FRElfREVWQ09ORl9BVVhfREFUQV9MRU5HVEhdOworCisJCWlmICghYXV4X2RhdGEgfHwgYXV4X2xlbiA8IDEpIHsKKwkJCWNvbWVkaV9lcnJvcihkZXYsICJZb3UgbXVzdCBwcm92aWRlIG1lMjYwMCBmaXJtd2FyZSAiCisJCQkJICAgICAidXNpbmcgdGhlIC0taW5pdC1kYXRhIG9wdGlvbiBvZiAiCisJCQkJICAgICAiY29tZWRpX2NvbmZpZyIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJbWUyNjAwX3hpbGlueF9kb3dubG9hZChkZXYsIGF1eF9kYXRhLCBhdXhfbGVuKTsKKwl9CisKKwltZV9yZXNldChkZXYpOworCisJLyogZGV2aWNlIGRyaXZlciBjYXBhYmlsaXRpZXMgKi8KKwllcnJvciA9IGFsbG9jX3N1YmRldmljZXMoZGV2LCAzKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlyZXR1cm4gZXJyb3I7CisKKwlzdWJkZXZpY2UgPSBkZXYtPnN1YmRldmljZXMgKyAwOworCXN1YmRldmljZS0+dHlwZSA9IENPTUVESV9TVUJEX0FJOworCXN1YmRldmljZS0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFIHwgU0RGX0NPTU1PTiB8IFNERl9DTURfUkVBRDsKKwlzdWJkZXZpY2UtPm5fY2hhbiA9IGJvYXJkLT5haV9jaGFubmVsX25icjsKKwlzdWJkZXZpY2UtPm1heGRhdGEgPSBib2FyZC0+YWlfcmVzb2x1dGlvbl9tYXNrOworCXN1YmRldmljZS0+bGVuX2NoYW5saXN0ID0gYm9hcmQtPmFpX2NoYW5uZWxfbmJyOworCXN1YmRldmljZS0+cmFuZ2VfdGFibGUgPSBib2FyZC0+YWlfcmFuZ2VfbGlzdDsKKwlzdWJkZXZpY2UtPmNhbmNlbCA9IG1lX2FpX2NhbmNlbDsKKwlzdWJkZXZpY2UtPmluc25fcmVhZCA9IG1lX2FpX2luc25fcmVhZDsKKwlzdWJkZXZpY2UtPmRvX2NtZHRlc3QgPSBtZV9haV9kb19jbWRfdGVzdDsKKwlzdWJkZXZpY2UtPmRvX2NtZCA9IG1lX2FpX2RvX2NtZDsKKworCXN1YmRldmljZSA9IGRldi0+c3ViZGV2aWNlcyArIDE7CisJc3ViZGV2aWNlLT50eXBlID0gQ09NRURJX1NVQkRfQU87CisJc3ViZGV2aWNlLT5zdWJkZXZfZmxhZ3MgPSBTREZfV1JJVEVBQkxFIHwgU0RGX0NPTU1PTjsKKwlzdWJkZXZpY2UtPm5fY2hhbiA9IGJvYXJkLT5hb19jaGFubmVsX25icjsKKwlzdWJkZXZpY2UtPm1heGRhdGEgPSBib2FyZC0+YW9fcmVzb2x1dGlvbl9tYXNrOworCXN1YmRldmljZS0+bGVuX2NoYW5saXN0ID0gYm9hcmQtPmFvX2NoYW5uZWxfbmJyOworCXN1YmRldmljZS0+cmFuZ2VfdGFibGUgPSBib2FyZC0+YW9fcmFuZ2VfbGlzdDsKKwlzdWJkZXZpY2UtPmluc25fcmVhZCA9IG1lX2FvX2luc25fcmVhZDsKKwlzdWJkZXZpY2UtPmluc25fd3JpdGUgPSBtZV9hb19pbnNuX3dyaXRlOworCisJc3ViZGV2aWNlID0gZGV2LT5zdWJkZXZpY2VzICsgMjsKKwlzdWJkZXZpY2UtPnR5cGUgPSBDT01FRElfU1VCRF9ESU87CisJc3ViZGV2aWNlLT5zdWJkZXZfZmxhZ3MgPSBTREZfUkVBREFCTEUgfCBTREZfV1JJVEVBQkxFOworCXN1YmRldmljZS0+bl9jaGFuID0gYm9hcmQtPmRpb19jaGFubmVsX25icjsKKwlzdWJkZXZpY2UtPm1heGRhdGEgPSAxOworCXN1YmRldmljZS0+bGVuX2NoYW5saXN0ID0gYm9hcmQtPmRpb19jaGFubmVsX25icjsKKwlzdWJkZXZpY2UtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2RpZ2l0YWw7CisJc3ViZGV2aWNlLT5pbnNuX2JpdHMgPSBtZV9kaW9faW5zbl9iaXRzOworCXN1YmRldmljZS0+aW5zbl9jb25maWcgPSBtZV9kaW9faW5zbl9jb25maWc7CisJc3ViZGV2aWNlLT5pb19iaXRzID0gMDsKKworCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSVkOiAiTUVfRFJJVkVSX05BTUUiIGF0dGFjaGVkLlxuIiwgZGV2LT5taW5vcik7CisJcmV0dXJuIDA7Cit9CisKKy8qIERldGFjaCAqLworc3RhdGljIGludCBtZV9kZXRhY2goY29tZWRpX2RldmljZSAqZGV2KQoreworCWlmIChkZXZfcHJpdmF0ZSkgeworCQlpZiAoZGV2X3ByaXZhdGUtPm1lX3JlZ2Jhc2UpIHsKKwkJCW1lX3Jlc2V0KGRldik7CisJCQlpb3VubWFwKGRldl9wcml2YXRlLT5tZV9yZWdiYXNlKTsKKwkJfQorCQlpZiAoZGV2X3ByaXZhdGUtPnBseF9yZWdiYXNlKQorCQkJaW91bm1hcChkZXZfcHJpdmF0ZS0+cGx4X3JlZ2Jhc2UpOworCQlpZiAoZGV2X3ByaXZhdGUtPnBjaV9kZXZpY2UpIHsKKwkJCWlmIChkZXZfcHJpdmF0ZS0+cGx4X3JlZ2Jhc2Vfc2l6ZSkKKwkJCQljb21lZGlfcGNpX2Rpc2FibGUoZGV2X3ByaXZhdGUtPnBjaV9kZXZpY2UpOworCisJCQlwY2lfZGV2X3B1dChkZXZfcHJpdmF0ZS0+cGNpX2RldmljZSk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWl0ZS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21pdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2M1Mjc0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21pdGUuYwpAQCAtMCwwICsxLDgwOSBAQAorLyoKKyAgICBjb21lZGkvZHJpdmVycy9taXRlLmMKKyAgICBIYXJkd2FyZSBkcml2ZXIgZm9yIE5JIE1pdGUgUENJIGludGVyZmFjZSBjaGlwCisKKyAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDIgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworLyoKKwlUaGUgUENJLU1JTyBFIHNlcmllcyBkcml2ZXIgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBieQorCVRvbWFzeiBNb3R5bGV3c2tpIDwuLi4+LCBhbmQgcG9ydGVkIHRvIGNvbWVkaSBieSBkcy4KKworCVJlZmVyZW5jZXMgZm9yIHNwZWNpZmljYXRpb25zOgorCisJICAgMzIxNzQ3Yi5wZGYgIFJlZ2lzdGVyIExldmVsIFByb2dyYW1tZXIgTWFudWFsIChvYnNvbGV0ZSkKKwkgICAzMjE3NDdjLnBkZiAgUmVnaXN0ZXIgTGV2ZWwgUHJvZ3JhbW1lciBNYW51YWwgKG5ldykKKwkgICBEQVEtU1RDIHJlZmVyZW5jZSBtYW51YWwKKworCU90aGVyIHBvc3NpYmx5IHJlbGV2YW50IGluZm86CisKKwkgICAzMjA1MTdjLnBkZiAgVXNlciBtYW51YWwgKG9ic29sZXRlKQorCSAgIDMyMDUxN2YucGRmICBVc2VyIG1hbnVhbCAobmV3KQorCSAgIDMyMDg4OWEucGRmICBkZWxldGUKKwkgICAzMjA5MDZjLnBkZiAgbWF4aW11bSBzaWduYWwgcmF0aW5ncworCSAgIDMyMTA2NmEucGRmICBhYm91dCAxNngKKwkgICAzMjE3OTFhLnBkZiAgZGlzY29udGludWF0aW9uIG9mIGF0LW1pby0xNmUtMTAgcmV2LiBjCisJICAgMzIxODA4YS5wZGYgIGFib3V0IGF0LW1pby0xNmUtMTAgcmV2IFAKKwkgICAzMjE4MzdhLnBkZiAgZGlzY29udGludWF0aW9uIG9mIGF0LW1pby0xNmRlLTEwIHJldiBkCisJICAgMzIxODM4YS5wZGYgIGFib3V0IGF0LW1pby0xNmRlLTEwIHJldiBOCisKKwlJU1NVRVM6CisKKyovCisKKy8vI2RlZmluZSBVU0VfS01BTExPQworCisjaW5jbHVkZSAibWl0ZS5oIgorCisjaW5jbHVkZSAiY29tZWRpX2ZjLmgiCisjaW5jbHVkZSAiY29tZWRpX3BjaS5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjZGVmaW5lIFBDSV9NSVRFX1NJWkUJCTQwOTYKKyNkZWZpbmUgUENJX0RBUV9TSVpFCQk0MDk2CisjZGVmaW5lIFBDSV9EQVFfU0laRV82NjBYICAgICAgIDgxOTIKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGVfZGV2aWNlcyA9IE5VTEw7CisKKyNkZWZpbmUgVE9QX09GX1BBR0UoeCkgKCh4KXwofihQQUdFX01BU0spKSkKKwordm9pZCBtaXRlX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2OworCXN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZTsKKworCWZvciAocGNpZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgTlVMTCk7CisJCXBjaWRldiAhPSBOVUxMOworCQlwY2lkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwY2lkZXYpKSB7CisJCWlmIChwY2lkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX05BVElOU1QpIHsKKwkJCXVuc2lnbmVkIGk7CisKKwkJCW1pdGUgPSBremFsbG9jKHNpemVvZigqbWl0ZSksIEdGUF9LRVJORUwpOworCQkJaWYgKCFtaXRlKSB7CisJCQkJcHJpbnRrKCJtaXRlOiBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCQkJcGNpX2Rldl9wdXQocGNpZGV2KTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlzcGluX2xvY2tfaW5pdCgmbWl0ZS0+bG9jayk7CisJCQltaXRlLT5wY2lkZXYgPSBwY2lfZGV2X2dldChwY2lkZXYpOworCQkJZm9yIChpID0gMDsgaSA8IE1BWF9NSVRFX0RNQV9DSEFOTkVMUzsgKytpKSB7CisJCQkJbWl0ZS0+Y2hhbm5lbHNbaV0ubWl0ZSA9IG1pdGU7CisJCQkJbWl0ZS0+Y2hhbm5lbHNbaV0uY2hhbm5lbCA9IGk7CisJCQkJbWl0ZS0+Y2hhbm5lbHNbaV0uZG9uZSA9IDE7CisJCQl9CisJCQltaXRlLT5uZXh0ID0gbWl0ZV9kZXZpY2VzOworCQkJbWl0ZV9kZXZpY2VzID0gbWl0ZTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZHVtcF9jaGlwX3NpZ25hdHVyZSh1MzIgY3NpZ3JfYml0cykKK3sKKwlwcmludGsoIm1pdGU6IHZlcnNpb24gPSAlaSwgdHlwZSA9ICVpLCBtaXRlIG1vZGUgPSAlaSwgaW50ZXJmYWNlIG1vZGUgPSAlaVxuIiwgbWl0ZV9jc2lncl92ZXJzaW9uKGNzaWdyX2JpdHMpLCBtaXRlX2NzaWdyX3R5cGUoY3NpZ3JfYml0cyksIG1pdGVfY3NpZ3JfbW1vZGUoY3NpZ3JfYml0cyksIG1pdGVfY3NpZ3JfaW1vZGUoY3NpZ3JfYml0cykpOworCXByaW50aygibWl0ZTogbnVtIGNoYW5uZWxzID0gJWksIHdyaXRlIHBvc3QgZmlmbyBkZXB0aCA9ICVpLCB3aW5zID0gJWksIGlvd2lucyA9ICVpXG4iLCBtaXRlX2NzaWdyX2RtYWMoY3NpZ3JfYml0cyksIG1pdGVfY3NpZ3Jfd3BkZXAoY3NpZ3JfYml0cyksIG1pdGVfY3NpZ3Jfd2lucyhjc2lncl9iaXRzKSwgbWl0ZV9jc2lncl9pb3dpbnMoY3NpZ3JfYml0cykpOworfQorCit1bnNpZ25lZCBtaXRlX2ZpZm9fc2l6ZShzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKiBtaXRlLCB1bnNpZ25lZCBjaGFubmVsKQoreworCXVuc2lnbmVkIGZjcl9iaXRzID0gcmVhZGwobWl0ZS0+bWl0ZV9pb19hZGRyICsKKwkJTUlURV9GQ1IoY2hhbm5lbCkpOworCXVuc2lnbmVkIGVtcHR5X2NvdW50ID0gKGZjcl9iaXRzID4+IDE2KSAmIDB4ZmY7CisJdW5zaWduZWQgZnVsbF9jb3VudCA9IGZjcl9iaXRzICYgMHhmZjsKKwlyZXR1cm4gZW1wdHlfY291bnQgKyBmdWxsX2NvdW50OworfQorCitpbnQgbWl0ZV9zZXR1cDIoc3RydWN0IG1pdGVfc3RydWN0ICptaXRlLCB1bnNpZ25lZCB1c2VfaW9kd2Jzcl8xKQoreworCXVuc2lnbmVkIGxvbmcgbGVuZ3RoOworCXJlc291cmNlX3NpemVfdCBhZGRyOworCWludCBpOworCXUzMiBjc2lncl9iaXRzOworCXVuc2lnbmVkIHVua25vd25fZG1hX2J1cnN0X2JpdHM7CisKKwlpZiAoY29tZWRpX3BjaV9lbmFibGUobWl0ZS0+cGNpZGV2LCAibWl0ZSIpKSB7CisJCXByaW50aygiZXJyb3IgZW5hYmxpbmcgbWl0ZSBhbmQgcmVxdWVzdGluZyBpbyByZWdpb25zXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXBjaV9zZXRfbWFzdGVyKG1pdGUtPnBjaWRldik7CisKKwlhZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KG1pdGUtPnBjaWRldiwgMCk7CisJbWl0ZS0+bWl0ZV9waHlzX2FkZHIgPSBhZGRyOworCW1pdGUtPm1pdGVfaW9fYWRkciA9IGlvcmVtYXAoYWRkciwgUENJX01JVEVfU0laRSk7CisJaWYgKCFtaXRlLT5taXRlX2lvX2FkZHIpIHsKKwkJcHJpbnRrKCJmYWlsZWQgdG8gcmVtYXAgbWl0ZSBpbyBtZW1vcnkgYWRkcmVzc1xuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlwcmludGsoIk1JVEU6MHglMDhsbHggbWFwcGVkIHRvICVwICIsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpbWl0ZS0+bWl0ZV9waHlzX2FkZHIsIG1pdGUtPm1pdGVfaW9fYWRkcik7CisKKwlhZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KG1pdGUtPnBjaWRldiwgMSk7CisJbWl0ZS0+ZGFxX3BoeXNfYWRkciA9IGFkZHI7CisJbGVuZ3RoID0gcGNpX3Jlc291cmNlX2xlbihtaXRlLT5wY2lkZXYsIDEpOworCS8vIEluIGNhc2Ugb2YgYSA2NjB4IGJvYXJkLCBEQVEgc2l6ZSBpcyA4ayBpbnN0ZWFkIG9mIDRrIChzZWUgYXMgc2hvd24gYnkgbHNwY2kgb3V0cHV0KQorCW1pdGUtPmRhcV9pb19hZGRyID0gaW9yZW1hcChtaXRlLT5kYXFfcGh5c19hZGRyLCBsZW5ndGgpOworCWlmICghbWl0ZS0+ZGFxX2lvX2FkZHIpIHsKKwkJcHJpbnRrKCJmYWlsZWQgdG8gcmVtYXAgZGFxIGlvIG1lbW9yeSBhZGRyZXNzXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXByaW50aygiREFROjB4JTA4bGx4IG1hcHBlZCB0byAlcFxuIiwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZyltaXRlLT5kYXFfcGh5c19hZGRyLCBtaXRlLT5kYXFfaW9fYWRkcik7CisKKwlpZiAodXNlX2lvZHdic3JfMSkgeworCQl3cml0ZWwoMCwgbWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9JT0RXQlNSKTsKKwkJcHJpbnRrKCJtaXRlOiB1c2luZyBJL08gV2luZG93IEJhc2UgU2l6ZSByZWdpc3RlciAxXG4iKTsKKwkJd3JpdGVsKG1pdGUtPgorCQkJZGFxX3BoeXNfYWRkciB8IFdFTkFCIHwKKwkJCU1JVEVfSU9EV0JTUl8xX1dTSVpFX2JpdHMobGVuZ3RoKSwKKwkJCW1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfSU9EV0JTUl8xKTsKKwkJd3JpdGVsKDAsIG1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfSU9EV0NSXzEpOworCX0gZWxzZSB7CisJCXdyaXRlbChtaXRlLT5kYXFfcGh5c19hZGRyIHwgV0VOQUIsCisJCQltaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0lPRFdCU1IpOworCX0KKwkvKiBtYWtlIHN1cmUgZG1hIGJ1cnN0cyB3b3JrLiAgSSBnb3QgdGhpcyBmcm9tIHJ1bm5pbmcgYSBidXMgYW5hbHl6ZXIKKwkgICBvbiBhIHB4aS02MjgxIGFuZCBhIHB4aS02NzEzLiAgNjcxMyBwb3dlcmVkIHVwIHdpdGggcmVnaXN0ZXIgdmFsdWUKKwkgICBvZiAweDYxZiBhbmQgYnVyc3RzIHdvcmtlZC4gIDYyODEgcG93ZXJlZCB1cCB3aXRoIHJlZ2lzdGVyIHZhbHVlIG9mCisJICAgMHgxZiBhbmQgYnVyc3RzIGRpZG4ndCB3b3JrLiAgVGhlIE5JIHdpbmRvd3MgZHJpdmVyIHJlYWRzIHRoZSByZWdpc3RlciwKKwkgICB0aGVuIGRvZXMgYSBiaXR3aXNlLW9yIG9mIDB4NjAwIHdpdGggaXQgYW5kIHdyaXRlcyBpdCBiYWNrLgorCSAqLworCXVua25vd25fZG1hX2J1cnN0X2JpdHMgPQorCQlyZWFkbChtaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX1VOS05PV05fRE1BX0JVUlNUX1JFRyk7CisJdW5rbm93bl9kbWFfYnVyc3RfYml0cyB8PSBVTktOT1dOX0RNQV9CVVJTVF9FTkFCTEVfQklUUzsKKwl3cml0ZWwodW5rbm93bl9kbWFfYnVyc3RfYml0cywKKwkJbWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9VTktOT1dOX0RNQV9CVVJTVF9SRUcpOworCisJY3NpZ3JfYml0cyA9IHJlYWRsKG1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfQ1NJR1IpOworCW1pdGUtPm51bV9jaGFubmVscyA9IG1pdGVfY3NpZ3JfZG1hYyhjc2lncl9iaXRzKTsKKwlpZiAobWl0ZS0+bnVtX2NoYW5uZWxzID4gTUFYX01JVEVfRE1BX0NIQU5ORUxTKSB7CisJCXByaW50aygibWl0ZTogYnVnPyBjaGlwIGNsYWltcyB0byBoYXZlICVpIGRtYSBjaGFubmVscy4gIFNldHRpbmcgdG8gJWkuXG4iLCBtaXRlLT5udW1fY2hhbm5lbHMsIE1BWF9NSVRFX0RNQV9DSEFOTkVMUyk7CisJCW1pdGUtPm51bV9jaGFubmVscyA9IE1BWF9NSVRFX0RNQV9DSEFOTkVMUzsKKwl9CisJZHVtcF9jaGlwX3NpZ25hdHVyZShjc2lncl9iaXRzKTsKKwlmb3IgKGkgPSAwOyBpIDwgbWl0ZS0+bnVtX2NoYW5uZWxzOyBpKyspIHsKKwkJd3JpdGVsKENIT1JfRE1BUkVTRVQsIG1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfQ0hPUihpKSk7CisJCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCQl3cml0ZWwoQ0hDUl9DTFJfRE1BX0lFIHwgQ0hDUl9DTFJfTElOS1BfSUUgfCBDSENSX0NMUl9TQVJfSUUgfAorCQkJQ0hDUl9DTFJfRE9ORV9JRSB8IENIQ1JfQ0xSX01SRFlfSUUgfCBDSENSX0NMUl9EUkRZX0lFIHwKKwkJCUNIQ1JfQ0xSX0xDX0lFIHwgQ0hDUl9DTFJfQ09OVF9SQl9JRSwKKwkJCW1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfQ0hDUihpKSk7CisJfQorCW1pdGUtPmZpZm9fc2l6ZSA9IG1pdGVfZmlmb19zaXplKG1pdGUsIDApOworCXByaW50aygibWl0ZTogZmlmbyBzaXplIGlzICVpLlxuIiwgbWl0ZS0+Zmlmb19zaXplKTsKKwltaXRlLT51c2VkID0gMTsKKworCXJldHVybiAwOworfQorCitpbnQgbWl0ZV9zZXR1cChzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUpCit7CisJcmV0dXJuIG1pdGVfc2V0dXAyKG1pdGUsIDApOworfQorCit2b2lkIG1pdGVfY2xlYW51cCh2b2lkKQoreworCXN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZSwgKm5leHQ7CisKKwlmb3IgKG1pdGUgPSBtaXRlX2RldmljZXM7IG1pdGU7IG1pdGUgPSBuZXh0KSB7CisJCXBjaV9kZXZfcHV0KG1pdGUtPnBjaWRldik7CisJCW5leHQgPSBtaXRlLT5uZXh0OworCQlrZnJlZShtaXRlKTsKKwl9Cit9CisKK3ZvaWQgbWl0ZV91bnNldHVwKHN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZSkKK3sKKwkvL3Vuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzdGFydCwgbGVuZ3RoOworCisJaWYgKCFtaXRlKQorCQlyZXR1cm47CisKKwlpZiAobWl0ZS0+bWl0ZV9pb19hZGRyKSB7CisJCWlvdW5tYXAobWl0ZS0+bWl0ZV9pb19hZGRyKTsKKwkJbWl0ZS0+bWl0ZV9pb19hZGRyID0gTlVMTDsKKwl9CisJaWYgKG1pdGUtPmRhcV9pb19hZGRyKSB7CisJCWlvdW5tYXAobWl0ZS0+ZGFxX2lvX2FkZHIpOworCQltaXRlLT5kYXFfaW9fYWRkciA9IE5VTEw7CisJfQorCWlmIChtaXRlLT5taXRlX3BoeXNfYWRkcikgeworCQljb21lZGlfcGNpX2Rpc2FibGUobWl0ZS0+cGNpZGV2KTsKKwkJbWl0ZS0+bWl0ZV9waHlzX2FkZHIgPSAwOworCX0KKworCW1pdGUtPnVzZWQgPSAwOworfQorCit2b2lkIG1pdGVfbGlzdF9kZXZpY2VzKHZvaWQpCit7CisJc3RydWN0IG1pdGVfc3RydWN0ICptaXRlLCAqbmV4dDsKKworCXByaW50aygiQXZhaWxhYmxlIE5JIGRldmljZSBJRHM6Iik7CisJaWYgKG1pdGVfZGV2aWNlcykKKwkJZm9yIChtaXRlID0gbWl0ZV9kZXZpY2VzOyBtaXRlOyBtaXRlID0gbmV4dCkgeworCQkJbmV4dCA9IG1pdGUtPm5leHQ7CisJCQlwcmludGsoIiAweCUwNHgiLCBtaXRlX2RldmljZV9pZChtaXRlKSk7CisJCQlpZiAobWl0ZS0+dXNlZCkKKwkJCQlwcmludGsoIih1c2VkKSIpOworCQl9CisJcHJpbnRrKCJcbiIpOworCit9CisKK3N0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfcmVxdWVzdF9jaGFubmVsX2luX3JhbmdlKHN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZSwKKwlzdHJ1Y3QgbWl0ZV9kbWFfZGVzY3JpcHRvcl9yaW5nICpyaW5nLCB1bnNpZ25lZCBtaW5fY2hhbm5lbCwKKwl1bnNpZ25lZCBtYXhfY2hhbm5lbCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBtaXRlX2NoYW5uZWwgKmNoYW5uZWwgPSBOVUxMOworCisJLy8gc3BpbiBsb2NrIHNvIG1pdGVfcmVsZWFzZV9jaGFubmVsIGNhbiBiZSBjYWxsZWQgc2FmZWx5IGZyb20gaW50ZXJydXB0cworCWNvbWVkaV9zcGluX2xvY2tfaXJxc2F2ZSgmbWl0ZS0+bG9jaywgZmxhZ3MpOworCWZvciAoaSA9IG1pbl9jaGFubmVsOyBpIDw9IG1heF9jaGFubmVsOyArK2kpIHsKKwkJaWYgKG1pdGUtPmNoYW5uZWxfYWxsb2NhdGVkW2ldID09IDApIHsKKwkJCW1pdGUtPmNoYW5uZWxfYWxsb2NhdGVkW2ldID0gMTsKKwkJCWNoYW5uZWwgPSAmbWl0ZS0+Y2hhbm5lbHNbaV07CisJCQljaGFubmVsLT5yaW5nID0gcmluZzsKKwkJCWJyZWFrOworCQl9CisJfQorCWNvbWVkaV9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaXRlLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIGNoYW5uZWw7Cit9CisKK3ZvaWQgbWl0ZV9yZWxlYXNlX2NoYW5uZWwoc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKQoreworCXN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZSA9IG1pdGVfY2hhbi0+bWl0ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLy8gc3BpbiBsb2NrIHRvIHByZXZlbnQgcmFjZXMgd2l0aCBtaXRlX3JlcXVlc3RfY2hhbm5lbAorCWNvbWVkaV9zcGluX2xvY2tfaXJxc2F2ZSgmbWl0ZS0+bG9jaywgZmxhZ3MpOworCWlmIChtaXRlLT5jaGFubmVsX2FsbG9jYXRlZFttaXRlX2NoYW4tPmNoYW5uZWxdKSB7CisJCW1pdGVfZG1hX2Rpc2FybShtaXRlX2NoYW4pOworCQltaXRlX2RtYV9yZXNldChtaXRlX2NoYW4pOworLyogZGlzYWJsZSBhbGwgY2hhbm5lbCdzIGludGVycnVwdHMgKGRvIGl0IGFmdGVyIGRpc2FybS9yZXNldCBzbworTUlURV9DSENSIHJlZyBpc24ndCBjaGFuZ2VkIHdoaWxlIGRtYSBpcyBzdGlsbCBhY3RpdmUhKSAqLworCQl3cml0ZWwoQ0hDUl9DTFJfRE1BX0lFIHwgQ0hDUl9DTFJfTElOS1BfSUUgfAorCQkJQ0hDUl9DTFJfU0FSX0lFIHwgQ0hDUl9DTFJfRE9ORV9JRSB8CisJCQlDSENSX0NMUl9NUkRZX0lFIHwgQ0hDUl9DTFJfRFJEWV9JRSB8CisJCQlDSENSX0NMUl9MQ19JRSB8IENIQ1JfQ0xSX0NPTlRfUkJfSUUsCisJCQltaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0NIQ1IobWl0ZV9jaGFuLT5jaGFubmVsKSk7CisJCW1pdGUtPmNoYW5uZWxfYWxsb2NhdGVkW21pdGVfY2hhbi0+Y2hhbm5lbF0gPSAwOworCQltaXRlX2NoYW4tPnJpbmcgPSBOVUxMOworCQltbWlvd2IoKTsKKwl9CisJY29tZWRpX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pdGUtPmxvY2ssIGZsYWdzKTsKK30KKwordm9pZCBtaXRlX2RtYV9hcm0oc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKQoreworCXN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZSA9IG1pdGVfY2hhbi0+bWl0ZTsKKwlpbnQgY2hvcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJTURQUklOVEsoIm1pdGVfZG1hX2FybSBjaCVpXG4iLCBjaGFubmVsKTsKKwkvKiBtZW1vcnkgYmFycmllciBpcyBpbnRlbmRlZCB0byBpbnN1cmUgYW55IHR3aWRkbGluZyB3aXRoIHRoZSBidWZmZXIKKwkgICBpcyBkb25lIGJlZm9yZSB3cml0aW5nIHRvIHRoZSBtaXRlIHRvIGFybSBkbWEgdHJhbnNmZXIgKi8KKwlzbXBfbWIoKTsKKwkvKiBhcm0gKi8KKwljaG9yID0gQ0hPUl9TVEFSVDsKKwljb21lZGlfc3Bpbl9sb2NrX2lycXNhdmUoJm1pdGUtPmxvY2ssIGZsYWdzKTsKKwltaXRlX2NoYW4tPmRvbmUgPSAwOworCXdyaXRlbChjaG9yLCBtaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0NIT1IobWl0ZV9jaGFuLT5jaGFubmVsKSk7CisJbW1pb3diKCk7CisJY29tZWRpX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pdGUtPmxvY2ssIGZsYWdzKTsKKy8vICAgICAgbWl0ZV9kbWFfdGNyKG1pdGUsIGNoYW5uZWwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBtaXRlX2J1Zl9jaGFuZ2Uoc3RydWN0IG1pdGVfZG1hX2Rlc2NyaXB0b3JfcmluZyAqcmluZywgY29tZWRpX2FzeW5jICogYXN5bmMpCit7CisJdW5zaWduZWQgaW50IG5fbGlua3M7CisJaW50IGk7CisKKwlpZiAocmluZy0+ZGVzY3JpcHRvcnMpIHsKKwkJZG1hX2ZyZWVfY29oZXJlbnQocmluZy0+aHdfZGV2LAorCQkJcmluZy0+bl9saW5rcyAqIHNpemVvZihzdHJ1Y3QgbWl0ZV9kbWFfZGVzY3JpcHRvciksCisJCQlyaW5nLT5kZXNjcmlwdG9ycywgcmluZy0+ZGVzY3JpcHRvcnNfZG1hX2FkZHIpOworCX0KKwlyaW5nLT5kZXNjcmlwdG9ycyA9IE5VTEw7CisJcmluZy0+ZGVzY3JpcHRvcnNfZG1hX2FkZHIgPSAwOworCXJpbmctPm5fbGlua3MgPSAwOworCisJaWYgKGFzeW5jLT5wcmVhbGxvY19idWZzeiA9PSAwKSB7CisJCXJldHVybiAwOworCX0KKwluX2xpbmtzID0gYXN5bmMtPnByZWFsbG9jX2J1ZnN6ID4+IFBBR0VfU0hJRlQ7CisKKwlNRFBSSU5USygicmluZy0+aHdfZGV2PSVwLCBuX2xpbmtzPTB4JTA0eFxuIiwgcmluZy0+aHdfZGV2LCBuX2xpbmtzKTsKKworCXJpbmctPmRlc2NyaXB0b3JzID0KKwkJZG1hX2FsbG9jX2NvaGVyZW50KHJpbmctPmh3X2RldiwKKwkJbl9saW5rcyAqIHNpemVvZihzdHJ1Y3QgbWl0ZV9kbWFfZGVzY3JpcHRvciksCisJCSZyaW5nLT5kZXNjcmlwdG9yc19kbWFfYWRkciwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyaW5nLT5kZXNjcmlwdG9ycykgeworCQlwcmludGsoIm1pdGU6IHJpbmcgYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJpbmctPm5fbGlua3MgPSBuX2xpbmtzOworCisJZm9yIChpID0gMDsgaSA8IG5fbGlua3M7IGkrKykgeworCQlyaW5nLT5kZXNjcmlwdG9yc1tpXS5jb3VudCA9IGNwdV90b19sZTMyKFBBR0VfU0laRSk7CisJCXJpbmctPmRlc2NyaXB0b3JzW2ldLmFkZHIgPQorCQkJY3B1X3RvX2xlMzIoYXN5bmMtPmJ1Zl9wYWdlX2xpc3RbaV0uZG1hX2FkZHIpOworCQlyaW5nLT5kZXNjcmlwdG9yc1tpXS5uZXh0ID0KKwkJCWNwdV90b19sZTMyKHJpbmctPmRlc2NyaXB0b3JzX2RtYV9hZGRyICsgKGkgKworCQkJCTEpICogc2l6ZW9mKHN0cnVjdCBtaXRlX2RtYV9kZXNjcmlwdG9yKSk7CisJfQorCXJpbmctPmRlc2NyaXB0b3JzW25fbGlua3MgLSAxXS5uZXh0ID0KKwkJY3B1X3RvX2xlMzIocmluZy0+ZGVzY3JpcHRvcnNfZG1hX2FkZHIpOworCS8qIGJhcnJpZXIgaXMgbWVhbnQgdG8gaW5zdXJlIHRoYXQgYWxsIHRoZSB3cml0ZXMgdG8gdGhlIGRtYSBkZXNjcmlwdG9ycworCSAgIGhhdmUgY29tcGxldGVkIGJlZm9yZSB0aGUgZG1hIGNvbnRyb2xsZXIgaXMgY29tbWFuZGVkIHRvIHJlYWQgdGhlbSAqLworCXNtcF93bWIoKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBtaXRlX3ByZXBfZG1hKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbiwKKwl1bnNpZ25lZCBpbnQgbnVtX2RldmljZV9iaXRzLCB1bnNpZ25lZCBpbnQgbnVtX21lbW9yeV9iaXRzKQoreworCXVuc2lnbmVkIGludCBjaG9yLCBjaGNyLCBtY3IsIGRjciwgbGtjcjsKKwlzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUgPSBtaXRlX2NoYW4tPm1pdGU7CisKKwlNRFBSSU5USygibWl0ZV9wcmVwX2RtYSBjaCVpXG4iLCBtaXRlX2NoYW4tPmNoYW5uZWwpOworCisJLyogcmVzZXQgRE1BIGFuZCBGSUZPICovCisJY2hvciA9IENIT1JfRE1BUkVTRVQgfCBDSE9SX0ZSRVNFVDsKKwl3cml0ZWwoY2hvciwgbWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9DSE9SKG1pdGVfY2hhbi0+Y2hhbm5lbCkpOworCisJLyogc2hvcnQgbGluayBjaGFpbmluZyBtb2RlICovCisJY2hjciA9IENIQ1JfU0VUX0RNQV9JRSB8IENIQ1JfTElOS1NIT1JUIHwgQ0hDUl9TRVRfRE9ORV9JRSB8CisJCUNIQ1JfQlVSU1RFTjsKKwkvKgorCSAqIExpbmsgQ29tcGxldGUgSW50ZXJydXB0OiBpbnRlcnJ1cHQgZXZlcnkgdGltZSBhIGxpbmsKKwkgKiBpbiBNSVRFX1JJTkcgaXMgY29tcGxldGVkLiBUaGlzIGNhbiBnZW5lcmF0ZSBhIGxvdCBvZgorCSAqIGV4dHJhIGludGVycnVwdHMsIGJ1dCByaWdodCBub3cgd2UgdXBkYXRlIHRoZSB2YWx1ZXMKKwkgKiBvZiBidWZfaW50X3B0ciBhbmQgYnVmX2ludF9jb3VudCBhdCBlYWNoIGludGVycnVwdC4gIEEKKwkgKiBiZXR0ZXIgbWV0aG9kIGlzIHRvIHBvbGwgdGhlIE1JVEUgYmVmb3JlIGVhY2ggdXNlcgorCSAqICJyZWFkKCkiIHRvIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZS4KKwkgKi8KKwljaGNyIHw9IENIQ1JfU0VUX0xDX0lFOworCWlmIChudW1fbWVtb3J5X2JpdHMgPT0gMzIgJiYgbnVtX2RldmljZV9iaXRzID09IDE2KSB7CisJCS8qIERvaW5nIGEgY29tYmluZWQgMzIgYW5kIDE2IGJpdCBieXRlc3dhcCBnZXRzIHRoZSAxNiBiaXQgc2FtcGxlcyBpbnRvIHRoZSBmaWZvIGluIHRoZSByaWdodCBvcmRlci4KKwkJICAgVGVzdGVkIGRvaW5nIDMyIGJpdCBtZW1vcnkgdG8gMTYgYml0IGRldmljZSB0cmFuc2ZlcnMgdG8gdGhlIGFuYWxvZyBvdXQgb2YgYSBweGktNjI4MSwKKwkJICAgd2hpY2ggaGFzIG1pdGUgdmVyc2lvbiA9IDEsIHR5cGUgPSA0LiAgVGhpcyBhbHNvIHdvcmtzIGZvciBkbWEgcmVhZHMgZnJvbSB0aGUgY291bnRlcnMKKwkJICAgb24gZS1zZXJpZXMgYm9hcmRzLiAgKi8KKwkJY2hjciB8PSBDSENSX0JZVEVfU1dBUF9ERVZJQ0UgfCBDSENSX0JZVEVfU1dBUF9NRU1PUlk7CisJfQorCWlmIChtaXRlX2NoYW4tPmRpciA9PSBDT01FRElfSU5QVVQpIHsKKwkJY2hjciB8PSBDSENSX0RFVl9UT19NRU07CisJfQorCXdyaXRlbChjaGNyLCBtaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0NIQ1IobWl0ZV9jaGFuLT5jaGFubmVsKSk7CisKKwkvKiB0by9mcm9tIG1lbW9yeSAqLworCW1jciA9IENSX1JMKDY0KSB8IENSX0FTRVFVUDsKKwlzd2l0Y2ggKG51bV9tZW1vcnlfYml0cykgeworCWNhc2UgODoKKwkJbWNyIHw9IENSX1BTSVpFODsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJbWNyIHw9IENSX1BTSVpFMTY7CisJCWJyZWFrOworCWNhc2UgMzI6CisJCW1jciB8PSBDUl9QU0laRTMyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlydF9wcmludGsKKwkJCSgibWl0ZTogYnVnISBpbnZhbGlkIG1lbSBiaXQgd2lkdGggZm9yIGRtYSB0cmFuc2ZlclxuIik7CisJCWJyZWFrOworCX0KKwl3cml0ZWwobWNyLCBtaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX01DUihtaXRlX2NoYW4tPmNoYW5uZWwpKTsKKworCS8qIGZyb20vdG8gZGV2aWNlICovCisJZGNyID0gQ1JfUkwoNjQpIHwgQ1JfQVNFUVVQOworCWRjciB8PSBDUl9QT1JUSU8gfCBDUl9BTURFVklDRSB8IENSX1JFUVNEUlEobWl0ZV9jaGFuLT5jaGFubmVsKTsKKwlzd2l0Y2ggKG51bV9kZXZpY2VfYml0cykgeworCWNhc2UgODoKKwkJZGNyIHw9IENSX1BTSVpFODsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJZGNyIHw9IENSX1BTSVpFMTY7CisJCWJyZWFrOworCWNhc2UgMzI6CisJCWRjciB8PSBDUl9QU0laRTMyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlydF9wcmludGsKKwkJCSgibWl0ZTogYnVnISBpbnZhbGlkIGRldiBiaXQgd2lkdGggZm9yIGRtYSB0cmFuc2ZlclxuIik7CisJCWJyZWFrOworCX0KKwl3cml0ZWwoZGNyLCBtaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0RDUihtaXRlX2NoYW4tPmNoYW5uZWwpKTsKKworCS8qIHJlc2V0IHRoZSBEQVIgKi8KKwl3cml0ZWwoMCwgbWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9EQVIobWl0ZV9jaGFuLT5jaGFubmVsKSk7CisKKwkvKiB0aGUgbGluayBpcyAzMmJpdHMgKi8KKwlsa2NyID0gQ1JfUkwoNjQpIHwgQ1JfQVNFUVVQIHwgQ1JfUFNJWkUzMjsKKwl3cml0ZWwobGtjciwgbWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9MS0NSKG1pdGVfY2hhbi0+Y2hhbm5lbCkpOworCisJLyogc3RhcnRpbmcgYWRkcmVzcyBmb3IgbGluayBjaGFpbmluZyAqLworCXdyaXRlbChtaXRlX2NoYW4tPnJpbmctPmRlc2NyaXB0b3JzX2RtYV9hZGRyLAorCQltaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0xLQVIobWl0ZV9jaGFuLT5jaGFubmVsKSk7CisKKwlNRFBSSU5USygiZXhpdCBtaXRlX3ByZXBfZG1hXG4iKTsKK30KKwordTMyIG1pdGVfZGV2aWNlX2J5dGVzX3RyYW5zZmVycmVkKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbikKK3sKKwlzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUgPSBtaXRlX2NoYW4tPm1pdGU7CisJcmV0dXJuIHJlYWRsKG1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfREFSKG1pdGVfY2hhbi0+Y2hhbm5lbCkpOworfQorCit1MzIgbWl0ZV9ieXRlc19pbl90cmFuc2l0KHN0cnVjdCBtaXRlX2NoYW5uZWwgKiBtaXRlX2NoYW4pCit7CisJc3RydWN0IG1pdGVfc3RydWN0ICptaXRlID0gbWl0ZV9jaGFuLT5taXRlOworCXJldHVybiByZWFkbChtaXRlLT5taXRlX2lvX2FkZHIgKworCQlNSVRFX0ZDUihtaXRlX2NoYW4tPmNoYW5uZWwpKSAmIDB4MDAwMDAwRkY7Cit9CisKKy8vIHJldHVybnMgbG93ZXIgYm91bmQgZm9yIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCBmcm9tIGRldmljZSB0byBtZW1vcnkKK3UzMiBtaXRlX2J5dGVzX3dyaXR0ZW5fdG9fbWVtb3J5X2xiKHN0cnVjdCBtaXRlX2NoYW5uZWwgKiBtaXRlX2NoYW4pCit7CisJdTMyIGRldmljZV9ieXRlX2NvdW50OworCisJZGV2aWNlX2J5dGVfY291bnQgPSBtaXRlX2RldmljZV9ieXRlc190cmFuc2ZlcnJlZChtaXRlX2NoYW4pOworCXJldHVybiBkZXZpY2VfYnl0ZV9jb3VudCAtIG1pdGVfYnl0ZXNfaW5fdHJhbnNpdChtaXRlX2NoYW4pOworfQorCisvLyByZXR1cm5zIHVwcGVyIGJvdW5kIGZvciBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQgZnJvbSBkZXZpY2UgdG8gbWVtb3J5Cit1MzIgbWl0ZV9ieXRlc193cml0dGVuX3RvX21lbW9yeV91YihzdHJ1Y3QgbWl0ZV9jaGFubmVsICogbWl0ZV9jaGFuKQoreworCXUzMiBpbl90cmFuc2l0X2NvdW50OworCisJaW5fdHJhbnNpdF9jb3VudCA9IG1pdGVfYnl0ZXNfaW5fdHJhbnNpdChtaXRlX2NoYW4pOworCXJldHVybiBtaXRlX2RldmljZV9ieXRlc190cmFuc2ZlcnJlZChtaXRlX2NoYW4pIC0gaW5fdHJhbnNpdF9jb3VudDsKK30KKworLy8gcmV0dXJucyBsb3dlciBib3VuZCBmb3IgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSBtZW1vcnkgZm9yIHRyYW5zZmVyIHRvIGRldmljZQordTMyIG1pdGVfYnl0ZXNfcmVhZF9mcm9tX21lbW9yeV9sYihzdHJ1Y3QgbWl0ZV9jaGFubmVsICogbWl0ZV9jaGFuKQoreworCXUzMiBkZXZpY2VfYnl0ZV9jb3VudDsKKworCWRldmljZV9ieXRlX2NvdW50ID0gbWl0ZV9kZXZpY2VfYnl0ZXNfdHJhbnNmZXJyZWQobWl0ZV9jaGFuKTsKKwlyZXR1cm4gZGV2aWNlX2J5dGVfY291bnQgKyBtaXRlX2J5dGVzX2luX3RyYW5zaXQobWl0ZV9jaGFuKTsKK30KKworLy8gcmV0dXJucyB1cHBlciBib3VuZCBmb3IgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSBtZW1vcnkgZm9yIHRyYW5zZmVyIHRvIGRldmljZQordTMyIG1pdGVfYnl0ZXNfcmVhZF9mcm9tX21lbW9yeV91YihzdHJ1Y3QgbWl0ZV9jaGFubmVsICogbWl0ZV9jaGFuKQoreworCXUzMiBpbl90cmFuc2l0X2NvdW50OworCisJaW5fdHJhbnNpdF9jb3VudCA9IG1pdGVfYnl0ZXNfaW5fdHJhbnNpdChtaXRlX2NoYW4pOworCXJldHVybiBtaXRlX2RldmljZV9ieXRlc190cmFuc2ZlcnJlZChtaXRlX2NoYW4pICsgaW5fdHJhbnNpdF9jb3VudDsKK30KKwordW5zaWduZWQgbWl0ZV9kbWFfdGNyKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbikKK3sKKwlzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUgPSBtaXRlX2NoYW4tPm1pdGU7CisJaW50IHRjcjsKKwlpbnQgbGthcjsKKworCWxrYXIgPSByZWFkbChtaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0xLQVIobWl0ZV9jaGFuLT5jaGFubmVsKSk7CisJdGNyID0gcmVhZGwobWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9UQ1IobWl0ZV9jaGFuLT5jaGFubmVsKSk7CisJTURQUklOVEsoIm1pdGVfZG1hX3RjciBjaCVpLCBsa2FyPTB4JTA4eCB0Y3I9JWRcbiIsIG1pdGVfY2hhbi0+Y2hhbm5lbCwKKwkJbGthciwgdGNyKTsKKworCXJldHVybiB0Y3I7Cit9CisKK3ZvaWQgbWl0ZV9kbWFfZGlzYXJtKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbikKK3sKKwlzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUgPSBtaXRlX2NoYW4tPm1pdGU7CisJdW5zaWduZWQgY2hvcjsKKworCS8qIGRpc2FybSAqLworCWNob3IgPSBDSE9SX0FCT1JUOworCXdyaXRlbChjaG9yLCBtaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0NIT1IobWl0ZV9jaGFuLT5jaGFubmVsKSk7Cit9CisKK2ludCBtaXRlX3N5bmNfaW5wdXRfZG1hKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbiwgY29tZWRpX2FzeW5jICogYXN5bmMpCit7CisJaW50IGNvdW50OworCXVuc2lnbmVkIGludCBuYnl0ZXMsIG9sZF9hbGxvY19jb3VudDsKKwljb25zdCB1bnNpZ25lZCBieXRlc19wZXJfc2NhbiA9IGNmY19ieXRlc19wZXJfc2Nhbihhc3luYy0+c3ViZGV2aWNlKTsKKworCW9sZF9hbGxvY19jb3VudCA9IGFzeW5jLT5idWZfd3JpdGVfYWxsb2NfY291bnQ7CisJLy8gd3JpdGUgYWxsb2MgYXMgbXVjaCBhcyB3ZSBjYW4KKwljb21lZGlfYnVmX3dyaXRlX2FsbG9jKGFzeW5jLCBhc3luYy0+cHJlYWxsb2NfYnVmc3opOworCisJbmJ5dGVzID0gbWl0ZV9ieXRlc193cml0dGVuX3RvX21lbW9yeV9sYihtaXRlX2NoYW4pOworCWlmICgoaW50KShtaXRlX2J5dGVzX3dyaXR0ZW5fdG9fbWVtb3J5X3ViKG1pdGVfY2hhbikgLQorCQkJb2xkX2FsbG9jX2NvdW50KSA+IDApIHsKKwkJcnRfcHJpbnRrKCJtaXRlOiBETUEgb3ZlcndyaXRlIG9mIGZyZWUgYXJlYVxuIik7CisJCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX09WRVJGTE9XOworCQlyZXR1cm4gLTE7CisJfQorCisJY291bnQgPSBuYnl0ZXMgLSBhc3luYy0+YnVmX3dyaXRlX2NvdW50OworCS8qIGl0J3MgcG9zc2libGUgY291bnQgd2lsbCBiZSBuZWdhdGl2ZSBkdWUgdG8KKwkgKiBjb25zZXJ2YXRpdmUgdmFsdWUgcmV0dXJuZWQgYnkgbWl0ZV9ieXRlc193cml0dGVuX3RvX21lbW9yeV9sYiAqLworCWlmIChjb3VudCA8PSAwKSB7CisJCXJldHVybiAwOworCX0KKwljb21lZGlfYnVmX3dyaXRlX2ZyZWUoYXN5bmMsIGNvdW50KTsKKworCWFzeW5jLT5zY2FuX3Byb2dyZXNzICs9IGNvdW50OworCWlmIChhc3luYy0+c2Nhbl9wcm9ncmVzcyA+PSBieXRlc19wZXJfc2NhbikgeworCQlhc3luYy0+c2Nhbl9wcm9ncmVzcyAlPSBieXRlc19wZXJfc2NhbjsKKwkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9TOworCX0KKwlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9CTE9DSzsKKwlyZXR1cm4gMDsKK30KKworaW50IG1pdGVfc3luY19vdXRwdXRfZG1hKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbiwgY29tZWRpX2FzeW5jICogYXN5bmMpCit7CisJaW50IGNvdW50OworCXUzMiBuYnl0ZXNfdWIsIG5ieXRlc19sYjsKKwl1bnNpZ25lZCBpbnQgb2xkX2FsbG9jX2NvdW50OworCXUzMiBzdG9wX2NvdW50ID0KKwkJYXN5bmMtPmNtZC5zdG9wX2FyZyAqIGNmY19ieXRlc19wZXJfc2Nhbihhc3luYy0+c3ViZGV2aWNlKTsKKworCW9sZF9hbGxvY19jb3VudCA9IGFzeW5jLT5idWZfcmVhZF9hbGxvY19jb3VudDsKKwkvLyByZWFkIGFsbG9jIGFzIG11Y2ggYXMgd2UgY2FuCisJY29tZWRpX2J1Zl9yZWFkX2FsbG9jKGFzeW5jLCBhc3luYy0+cHJlYWxsb2NfYnVmc3opOworCW5ieXRlc19sYiA9IG1pdGVfYnl0ZXNfcmVhZF9mcm9tX21lbW9yeV9sYihtaXRlX2NoYW4pOworCWlmIChhc3luYy0+Y21kLnN0b3Bfc3JjID09IFRSSUdfQ09VTlQgJiYKKwkJKGludCkobmJ5dGVzX2xiIC0gc3RvcF9jb3VudCkgPiAwKQorCQluYnl0ZXNfbGIgPSBzdG9wX2NvdW50OworCW5ieXRlc191YiA9IG1pdGVfYnl0ZXNfcmVhZF9mcm9tX21lbW9yeV91YihtaXRlX2NoYW4pOworCWlmIChhc3luYy0+Y21kLnN0b3Bfc3JjID09IFRSSUdfQ09VTlQgJiYKKwkJKGludCkobmJ5dGVzX3ViIC0gc3RvcF9jb3VudCkgPiAwKQorCQluYnl0ZXNfdWIgPSBzdG9wX2NvdW50OworCWlmICgoaW50KShuYnl0ZXNfdWIgLSBvbGRfYWxsb2NfY291bnQpID4gMCkgeworCQlydF9wcmludGsoIm1pdGU6IERNQSB1bmRlcnJ1blxuIik7CisJCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX09WRVJGTE9XOworCQlyZXR1cm4gLTE7CisJfQorCWNvdW50ID0gbmJ5dGVzX2xiIC0gYXN5bmMtPmJ1Zl9yZWFkX2NvdW50OworCWlmIChjb3VudCA8PSAwKSB7CisJCXJldHVybiAwOworCX0KKwlpZiAoY291bnQpIHsKKwkJY29tZWRpX2J1Zl9yZWFkX2ZyZWUoYXN5bmMsIGNvdW50KTsKKwkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfQkxPQ0s7CisJfQorCXJldHVybiAwOworfQorCit1bnNpZ25lZCBtaXRlX2dldF9zdGF0dXMoc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKQoreworCXN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZSA9IG1pdGVfY2hhbi0+bWl0ZTsKKwl1bnNpZ25lZCBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWNvbWVkaV9zcGluX2xvY2tfaXJxc2F2ZSgmbWl0ZS0+bG9jaywgZmxhZ3MpOworCXN0YXR1cyA9IHJlYWRsKG1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfQ0hTUihtaXRlX2NoYW4tPmNoYW5uZWwpKTsKKwlpZiAoc3RhdHVzICYgQ0hTUl9ET05FKSB7CisJCW1pdGVfY2hhbi0+ZG9uZSA9IDE7CisJCXdyaXRlbChDSE9SX0NMUkRPTkUsCisJCQltaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0NIT1IobWl0ZV9jaGFuLT5jaGFubmVsKSk7CisJfQorCW1taW93YigpOworCWNvbWVkaV9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaXRlLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworaW50IG1pdGVfZG9uZShzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pCit7CisJc3RydWN0IG1pdGVfc3RydWN0ICptaXRlID0gbWl0ZV9jaGFuLT5taXRlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGRvbmU7CisKKwltaXRlX2dldF9zdGF0dXMobWl0ZV9jaGFuKTsKKwljb21lZGlfc3Bpbl9sb2NrX2lycXNhdmUoJm1pdGUtPmxvY2ssIGZsYWdzKTsKKwlkb25lID0gbWl0ZV9jaGFuLT5kb25lOworCWNvbWVkaV9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaXRlLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIGRvbmU7Cit9CisKKyNpZmRlZiBERUJVR19NSVRFCisKK3N0YXRpYyB2b2lkIG1pdGVfZGVjb2RlKGNoYXIgKipiaXRfc3RyLCB1bnNpZ25lZCBpbnQgYml0cyk7CisKKy8qIG5hbWVzIG9mIGJpdHMgaW4gbWl0ZSByZWdpc3RlcnMgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1pdGVfQ0hPUl9zdHJpbmdzW10gPSB7CisJInN0YXJ0IiwgImNvbnQiLCAic3RvcCIsICJhYm9ydCIsCisJImZyZXNldCIsICJjbHJsYyIsICJjbHJyYiIsICJjbHJkb25lIiwKKwkiY2xyX2xwYXVzZSIsICJzZXRfbHBhdXNlIiwgImNscl9zZW5kX3RjIiwKKwkic2V0X3NlbmRfdGMiLCAiMTIiLCAiMTMiLCAiMTQiLAorCSIxNSIsICIxNiIsICIxNyIsICIxOCIsCisJIjE5IiwgIjIwIiwgIjIxIiwgIjIyIiwKKwkiMjMiLCAiMjQiLCAiMjUiLCAiMjYiLAorCSIyNyIsICIyOCIsICIyOSIsICIzMCIsCisJImRtYXJlc2V0IiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtaXRlX0NIQ1Jfc3RyaW5nc1tdID0geworCSJjb250aW51ZSIsICJyaW5nYnVmZiIsICIyIiwgIjMiLAorCSI0IiwgIjUiLCAiNiIsICI3IiwKKwkiOCIsICI5IiwgIjEwIiwgIjExIiwKKwkiMTIiLCAiMTMiLCAiYnVyc3RlbiIsICJmaWZvZGlzIiwKKwkiY2xyX2NvbnRfcmJfaWUiLCAic2V0X2NvbnRfcmJfaWUiLCAiY2xyX2xjX2llIiwgInNldF9sY19pZSIsCisJImNscl9kcmR5X2llIiwgInNldF9kcmR5X2llIiwgImNscl9tcmR5X2llIiwgInNldF9tcmR5X2llIiwKKwkiY2xyX2RvbmVfaWUiLCAic2V0X2RvbmVfaWUiLCAiY2xyX3Nhcl9pZSIsICJzZXRfc2FyX2llIiwKKwkiY2xyX2xpbmtwX2llIiwgInNldF9saW5rcF9pZSIsICJjbHJfZG1hX2llIiwgInNldF9kbWFfaWUiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1pdGVfTUNSX3N0cmluZ3NbXSA9IHsKKwkiYW1kZXZpY2UiLCAiMSIsICIyIiwgIjMiLAorCSI0IiwgIjUiLCAicG9ydGlvIiwgInBvcnR2eGkiLAorCSJwc2l6ZWJ5dGUiLCAicHNpemVoYWxmIChieXRlICYgaGFsZiA9IHdvcmQpIiwgImFzZXF4cDEiLCAiMTEiLAorCSIxMiIsICIxMyIsICJibG9ja2VuIiwgImJlcmhhbmQiLAorCSJyZXFzaW50bGltL3JlcXMwIiwgInJlcXMxIiwgInJlcXMyIiwgInJkMzIiLAorCSJyZDUxMiIsICJybDEiLCAicmwyIiwgInJsOCIsCisJIjI0IiwgIjI1IiwgIjI2IiwgIjI3IiwKKwkiMjgiLCAiMjkiLCAiMzAiLCAic3RvcGVuIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtaXRlX0RDUl9zdHJpbmdzW10gPSB7CisJImFtZGV2aWNlIiwgIjEiLCAiMiIsICIzIiwKKwkiNCIsICI1IiwgInBvcnRpbyIsICJwb3J0dnhpIiwKKwkicHNpemVieXRlIiwgInBzaXplaGFsZiAoYnl0ZSAmIGhhbGYgPSB3b3JkKSIsICJhc2VxeHAxIiwgImFzZXF4cDIiLAorCSJhc2VxeHA4IiwgIjEzIiwgImJsb2NrZW4iLCAiYmVyaGFuZCIsCisJInJlcXNpbnRsaW0iLCAicmVxczEiLCAicmVxczIiLCAicmQzMiIsCisJInJkNTEyIiwgInJsMSIsICJybDIiLCAicmw4IiwKKwkiMjMiLCAiMjQiLCAiMjUiLCAiMjciLAorCSIyOCIsICJ3c2RldmMiLCAid3NkZXZzIiwgInJ3ZGV2cGFjayIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbWl0ZV9MS0NSX3N0cmluZ3NbXSA9IHsKKwkiYW1kZXZpY2UiLCAiMSIsICIyIiwgIjMiLAorCSI0IiwgIjUiLCAicG9ydGlvIiwgInBvcnR2eGkiLAorCSJwc2l6ZWJ5dGUiLCAicHNpemVoYWxmIChieXRlICYgaGFsZiA9IHdvcmQpIiwgImFzZXF1cCIsICJhc2VxZG93biIsCisJIjEyIiwgIjEzIiwgIjE0IiwgImJlcmhhbmQiLAorCSIxNiIsICIxNyIsICIxOCIsICJyZDMyIiwKKwkicmQ1MTIiLCAicmwxIiwgInJsMiIsICJybDgiLAorCSIyNCIsICIyNSIsICIyNiIsICIyNyIsCisJIjI4IiwgIjI5IiwgIjMwIiwgImNobmdlbmQiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1pdGVfQ0hTUl9zdHJpbmdzW10gPSB7CisJImQuZXJyMCIsICJkLmVycjEiLCAibS5lcnIwIiwgIm0uZXJyMSIsCisJImwuZXJyMCIsICJsLmVycjEiLCAiZHJxMCIsICJkcnExIiwKKwkiZW5kIiwgInhmZXJyIiwgIm9wZXJyMCIsICJvcGVycjEiLAorCSJzdG9wcyIsICJoYWJvcnQiLCAic2Fib3J0IiwgImVycm9yIiwKKwkiMTYiLCAiY29udHNfcmIiLCAiMTgiLCAibGlua2MiLAorCSIyMCIsICJkcmR5IiwgIjIyIiwgIm1yZHkiLAorCSIyNCIsICJkb25lIiwgIjI2IiwgInNhcnMiLAorCSIyOCIsICJscGF1c2VzIiwgIjMwIiwgImludCIsCit9OworCit2b2lkIG1pdGVfZHVtcF9yZWdzKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbikKK3sKKwl1bnNpZ25lZCBsb25nIG1pdGVfaW9fYWRkciA9CisJCSh1bnNpZ25lZCBsb25nKW1pdGVfY2hhbi0+bWl0ZS0+bWl0ZV9pb19hZGRyOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IDA7CisJdW5zaWduZWQgbG9uZyB0ZW1wID0gMDsKKworCXByaW50aygibWl0ZV9kdW1wX3JlZ3MgY2glaVxuIiwgbWl0ZV9jaGFuLT5jaGFubmVsKTsKKwlwcmludGsoIm1pdGUgYWRkcmVzcyBpcyAgPTB4JTA4bHhcbiIsIG1pdGVfaW9fYWRkcik7CisKKwlhZGRyID0gbWl0ZV9pb19hZGRyICsgTUlURV9DSE9SKGNoYW5uZWwpOworCXByaW50aygibWl0ZSBzdGF0dXNbQ0hPUl1hdCAweCUwOGx4ID0weCUwOGx4XG4iLCBhZGRyLCB0ZW1wID0KKwkJcmVhZGwoYWRkcikpOworCW1pdGVfZGVjb2RlKG1pdGVfQ0hPUl9zdHJpbmdzLCB0ZW1wKTsKKwlhZGRyID0gbWl0ZV9pb19hZGRyICsgTUlURV9DSENSKGNoYW5uZWwpOworCXByaW50aygibWl0ZSBzdGF0dXNbQ0hDUl1hdCAweCUwOGx4ID0weCUwOGx4XG4iLCBhZGRyLCB0ZW1wID0KKwkJcmVhZGwoYWRkcikpOworCW1pdGVfZGVjb2RlKG1pdGVfQ0hDUl9zdHJpbmdzLCB0ZW1wKTsKKwlhZGRyID0gbWl0ZV9pb19hZGRyICsgTUlURV9UQ1IoY2hhbm5lbCk7CisJcHJpbnRrKCJtaXRlIHN0YXR1c1tUQ1JdIGF0IDB4JTA4bHggPTB4JTA4eFxuIiwgYWRkciwgcmVhZGwoYWRkcikpOworCWFkZHIgPSBtaXRlX2lvX2FkZHIgKyBNSVRFX01DUihjaGFubmVsKTsKKwlwcmludGsoIm1pdGUgc3RhdHVzW01DUl0gYXQgMHglMDhseCA9MHglMDhseFxuIiwgYWRkciwgdGVtcCA9CisJCXJlYWRsKGFkZHIpKTsKKwltaXRlX2RlY29kZShtaXRlX01DUl9zdHJpbmdzLCB0ZW1wKTsKKworCWFkZHIgPSBtaXRlX2lvX2FkZHIgKyBNSVRFX01BUihjaGFubmVsKTsKKwlwcmludGsoIm1pdGUgc3RhdHVzW01BUl0gYXQgMHglMDhseCA9MHglMDh4XG4iLCBhZGRyLCByZWFkbChhZGRyKSk7CisJYWRkciA9IG1pdGVfaW9fYWRkciArIE1JVEVfRENSKGNoYW5uZWwpOworCXByaW50aygibWl0ZSBzdGF0dXNbRENSXSBhdCAweCUwOGx4ID0weCUwOGx4XG4iLCBhZGRyLCB0ZW1wID0KKwkJcmVhZGwoYWRkcikpOworCW1pdGVfZGVjb2RlKG1pdGVfRENSX3N0cmluZ3MsIHRlbXApOworCWFkZHIgPSBtaXRlX2lvX2FkZHIgKyBNSVRFX0RBUihjaGFubmVsKTsKKwlwcmludGsoIm1pdGUgc3RhdHVzW0RBUl0gYXQgMHglMDhseCA9MHglMDh4XG4iLCBhZGRyLCByZWFkbChhZGRyKSk7CisJYWRkciA9IG1pdGVfaW9fYWRkciArIE1JVEVfTEtDUihjaGFubmVsKTsKKwlwcmludGsoIm1pdGUgc3RhdHVzW0xLQ1JdYXQgMHglMDhseCA9MHglMDhseFxuIiwgYWRkciwgdGVtcCA9CisJCXJlYWRsKGFkZHIpKTsKKwltaXRlX2RlY29kZShtaXRlX0xLQ1Jfc3RyaW5ncywgdGVtcCk7CisJYWRkciA9IG1pdGVfaW9fYWRkciArIE1JVEVfTEtBUihjaGFubmVsKTsKKwlwcmludGsoIm1pdGUgc3RhdHVzW0xLQVJdYXQgMHglMDhseCA9MHglMDh4XG4iLCBhZGRyLCByZWFkbChhZGRyKSk7CisKKwlhZGRyID0gbWl0ZV9pb19hZGRyICsgTUlURV9DSFNSKGNoYW5uZWwpOworCXByaW50aygibWl0ZSBzdGF0dXNbQ0hTUl1hdCAweCUwOGx4ID0weCUwOGx4XG4iLCBhZGRyLCB0ZW1wID0KKwkJcmVhZGwoYWRkcikpOworCW1pdGVfZGVjb2RlKG1pdGVfQ0hTUl9zdHJpbmdzLCB0ZW1wKTsKKwlhZGRyID0gbWl0ZV9pb19hZGRyICsgTUlURV9GQ1IoY2hhbm5lbCk7CisJcHJpbnRrKCJtaXRlIHN0YXR1c1tGQ1JdIGF0IDB4JTA4bHggPTB4JTA4eFxuXG4iLCBhZGRyLCByZWFkbChhZGRyKSk7Cit9CisKK3N0YXRpYyB2b2lkIG1pdGVfZGVjb2RlKGNoYXIgKipiaXRfc3RyLCB1bnNpZ25lZCBpbnQgYml0cykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDMxOyBpID49IDA7IGktLSkgeworCQlpZiAoYml0cyAmICgxIDw8IGkpKSB7CisJCQlwcmludGsoIiAlcyIsIGJpdF9zdHJbaV0pOworCQl9CisJfQorCXByaW50aygiXG4iKTsKK30KKyNlbmRpZgorCisjaWZkZWYgTU9EVUxFCitpbnQgX19pbml0IGluaXRfbW9kdWxlKHZvaWQpCit7CisJbWl0ZV9pbml0KCk7CisJbWl0ZV9saXN0X2RldmljZXMoKTsKKworCXJldHVybiAwOworfQorCit2b2lkIF9fZXhpdCBjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCW1pdGVfY2xlYW51cCgpOworfQorCitFWFBPUlRfU1lNQk9MKG1pdGVfZG1hX3Rjcik7CitFWFBPUlRfU1lNQk9MKG1pdGVfZG1hX2FybSk7CitFWFBPUlRfU1lNQk9MKG1pdGVfZG1hX2Rpc2FybSk7CitFWFBPUlRfU1lNQk9MKG1pdGVfc3luY19pbnB1dF9kbWEpOworRVhQT1JUX1NZTUJPTChtaXRlX3N5bmNfb3V0cHV0X2RtYSk7CitFWFBPUlRfU1lNQk9MKG1pdGVfc2V0dXApOworRVhQT1JUX1NZTUJPTChtaXRlX3NldHVwMik7CitFWFBPUlRfU1lNQk9MKG1pdGVfdW5zZXR1cCk7CisjaWYgMAorRVhQT1JUX1NZTUJPTChtaXRlX2t2bWVtX3NlZ21lbnRfbG9hZCk7CitFWFBPUlRfU1lNQk9MKG1pdGVfbGxfZnJvbV9rdm1lbSk7CitFWFBPUlRfU1lNQk9MKG1pdGVfc2V0cmVncyk7CisjZW5kaWYKK0VYUE9SVF9TWU1CT0wobWl0ZV9kZXZpY2VzKTsKK0VYUE9SVF9TWU1CT0wobWl0ZV9saXN0X2RldmljZXMpOworRVhQT1JUX1NZTUJPTChtaXRlX3JlcXVlc3RfY2hhbm5lbF9pbl9yYW5nZSk7CitFWFBPUlRfU1lNQk9MKG1pdGVfcmVsZWFzZV9jaGFubmVsKTsKK0VYUE9SVF9TWU1CT0wobWl0ZV9wcmVwX2RtYSk7CitFWFBPUlRfU1lNQk9MKG1pdGVfYnVmX2NoYW5nZSk7CitFWFBPUlRfU1lNQk9MKG1pdGVfYnl0ZXNfd3JpdHRlbl90b19tZW1vcnlfbGIpOworRVhQT1JUX1NZTUJPTChtaXRlX2J5dGVzX3dyaXR0ZW5fdG9fbWVtb3J5X3ViKTsKK0VYUE9SVF9TWU1CT0wobWl0ZV9ieXRlc19yZWFkX2Zyb21fbWVtb3J5X2xiKTsKK0VYUE9SVF9TWU1CT0wobWl0ZV9ieXRlc19yZWFkX2Zyb21fbWVtb3J5X3ViKTsKK0VYUE9SVF9TWU1CT0wobWl0ZV9ieXRlc19pbl90cmFuc2l0KTsKK0VYUE9SVF9TWU1CT0wobWl0ZV9nZXRfc3RhdHVzKTsKK0VYUE9SVF9TWU1CT0wobWl0ZV9kb25lKTsKKyNpZmRlZiBERUJVR19NSVRFCitFWFBPUlRfU1lNQk9MKG1pdGVfZGVjb2RlKTsKK0VYUE9SVF9TWU1CT0wobWl0ZV9kdW1wX3JlZ3MpOworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21pdGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9taXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg0ZWFmYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9taXRlLmgKQEAgLTAsMCArMSw0NTMgQEAKKy8qCisgICAgbW9kdWxlL21pdGUuaAorICAgIEhhcmR3YXJlIGRyaXZlciBmb3IgTkkgTWl0ZSBQQ0kgaW50ZXJmYWNlIGNoaXAKKworICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTkgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI2lmbmRlZiBfTUlURV9IXworI2RlZmluZSBfTUlURV9IXworCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9OQVRJTlNUCQkweDEwOTMKKworLy8gI2RlZmluZSBERUJVR19NSVRFCisjZGVmaW5lIFBDSU1JT19DT01QQVQKKworI2lmZGVmIERFQlVHX01JVEUKKyNkZWZpbmUgTURQUklOVEsoZm9ybWF0LGFyZ3MuLi4pCXByaW50ayhmb3JtYXQgLCAjIyBhcmdzICkKKyNlbHNlCisjZGVmaW5lIE1EUFJJTlRLKGZvcm1hdCxhcmdzLi4uKQorI2VuZGlmCisKKyNkZWZpbmUgTUFYX01JVEVfRE1BX0NIQU5ORUxTIDgKKworc3RydWN0IG1pdGVfZG1hX2Rlc2NyaXB0b3IgeworCXUzMiBjb3VudDsKKwl1MzIgYWRkcjsKKwl1MzIgbmV4dDsKKwl1MzIgZGFyOworfTsKKworc3RydWN0IG1pdGVfZG1hX2Rlc2NyaXB0b3JfcmluZyB7CisJc3RydWN0IGRldmljZSAqaHdfZGV2OworCXVuc2lnbmVkIGludCBuX2xpbmtzOworCXN0cnVjdCBtaXRlX2RtYV9kZXNjcmlwdG9yICpkZXNjcmlwdG9yczsKKwlkbWFfYWRkcl90IGRlc2NyaXB0b3JzX2RtYV9hZGRyOworfTsKKworc3RydWN0IG1pdGVfY2hhbm5lbCB7CisJc3RydWN0IG1pdGVfc3RydWN0ICptaXRlOworCXVuc2lnbmVkIGNoYW5uZWw7CisJaW50IGRpcjsKKwlpbnQgZG9uZTsKKwlzdHJ1Y3QgbWl0ZV9kbWFfZGVzY3JpcHRvcl9yaW5nICpyaW5nOworfTsKKworc3RydWN0IG1pdGVfc3RydWN0IHsKKwlzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm5leHQ7CisJaW50IHVzZWQ7CisKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2OworCXJlc291cmNlX3NpemVfdCBtaXRlX3BoeXNfYWRkcjsKKwl2b2lkICptaXRlX2lvX2FkZHI7CisJcmVzb3VyY2Vfc2l6ZV90IGRhcV9waHlzX2FkZHI7CisJdm9pZCAqZGFxX2lvX2FkZHI7CisKKwlzdHJ1Y3QgbWl0ZV9jaGFubmVsIGNoYW5uZWxzW01BWF9NSVRFX0RNQV9DSEFOTkVMU107CisJc2hvcnQgY2hhbm5lbF9hbGxvY2F0ZWRbTUFYX01JVEVfRE1BX0NIQU5ORUxTXTsKKwlpbnQgbnVtX2NoYW5uZWxzOworCXVuc2lnbmVkIGZpZm9fc2l6ZTsKKwlzcGlubG9ja190IGxvY2s7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtaXRlX2RtYV9kZXNjcmlwdG9yX3JpbmcgKm1pdGVfYWxsb2NfcmluZyhzdHJ1Y3QKKwltaXRlX3N0cnVjdCAqbWl0ZSkKK3sKKwlzdHJ1Y3QgbWl0ZV9kbWFfZGVzY3JpcHRvcl9yaW5nICpyaW5nID0KKwkJa21hbGxvYyhzaXplb2Yoc3RydWN0IG1pdGVfZG1hX2Rlc2NyaXB0b3JfcmluZyksIEdGUF9LRVJORUwpOworCWlmIChyaW5nID09IE5VTEwpCisJCXJldHVybiByaW5nOworCXJpbmctPmh3X2RldiA9IGdldF9kZXZpY2UoJm1pdGUtPnBjaWRldi0+ZGV2KTsKKwlpZiAocmluZy0+aHdfZGV2ID09IE5VTEwpIHsKKwkJa2ZyZWUocmluZyk7CisJCXJldHVybiBOVUxMOworCX0KKwlyaW5nLT5uX2xpbmtzID0gMDsKKwlyaW5nLT5kZXNjcmlwdG9ycyA9IE5VTEw7CisJcmluZy0+ZGVzY3JpcHRvcnNfZG1hX2FkZHIgPSAwOworCXJldHVybiByaW5nOworfTsKKworc3RhdGljIGlubGluZSB2b2lkIG1pdGVfZnJlZV9yaW5nKHN0cnVjdCBtaXRlX2RtYV9kZXNjcmlwdG9yX3JpbmcgKnJpbmcpCit7CisJaWYgKHJpbmcpIHsKKwkJaWYgKHJpbmctPmRlc2NyaXB0b3JzKSB7CisJCQlkbWFfZnJlZV9jb2hlcmVudChyaW5nLT5od19kZXYsCisJCQkJcmluZy0+bl9saW5rcyAqCisJCQkJc2l6ZW9mKHN0cnVjdCBtaXRlX2RtYV9kZXNjcmlwdG9yKSwKKwkJCQlyaW5nLT5kZXNjcmlwdG9ycywgcmluZy0+ZGVzY3JpcHRvcnNfZG1hX2FkZHIpOworCQl9CisJCXB1dF9kZXZpY2UocmluZy0+aHdfZGV2KTsKKwkJa2ZyZWUocmluZyk7CisJfQorfTsKKworZXh0ZXJuIHN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZV9kZXZpY2VzOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBtaXRlX2lycShzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUpCit7CisJcmV0dXJuIG1pdGUtPnBjaWRldi0+aXJxOworfTsKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG1pdGVfZGV2aWNlX2lkKHN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZSkKK3sKKwlyZXR1cm4gbWl0ZS0+cGNpZGV2LT5kZXZpY2U7Cit9OworCit2b2lkIG1pdGVfaW5pdCh2b2lkKTsKK3ZvaWQgbWl0ZV9jbGVhbnVwKHZvaWQpOworaW50IG1pdGVfc2V0dXAoc3RydWN0IG1pdGVfc3RydWN0ICptaXRlKTsKK2ludCBtaXRlX3NldHVwMihzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUsIHVuc2lnbmVkIHVzZV9pb2R3YnNyXzEpOwordm9pZCBtaXRlX3Vuc2V0dXAoc3RydWN0IG1pdGVfc3RydWN0ICptaXRlKTsKK3ZvaWQgbWl0ZV9saXN0X2RldmljZXModm9pZCk7CitzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX3JlcXVlc3RfY2hhbm5lbF9pbl9yYW5nZShzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUsCisJc3RydWN0IG1pdGVfZG1hX2Rlc2NyaXB0b3JfcmluZyAqcmluZywgdW5zaWduZWQgbWluX2NoYW5uZWwsCisJdW5zaWduZWQgbWF4X2NoYW5uZWwpOworc3RhdGljIGlubGluZSBzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX3JlcXVlc3RfY2hhbm5lbChzdHJ1Y3QgbWl0ZV9zdHJ1Y3QKKwkqbWl0ZSwgc3RydWN0IG1pdGVfZG1hX2Rlc2NyaXB0b3JfcmluZyAqcmluZykKK3sKKwlyZXR1cm4gbWl0ZV9yZXF1ZXN0X2NoYW5uZWxfaW5fcmFuZ2UobWl0ZSwgcmluZywgMCwKKwkJbWl0ZS0+bnVtX2NoYW5uZWxzIC0gMSk7Cit9Cit2b2lkIG1pdGVfcmVsZWFzZV9jaGFubmVsKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbik7CisKK3Vuc2lnbmVkIG1pdGVfZG1hX3RjcihzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pOwordm9pZCBtaXRlX2RtYV9hcm0oc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKTsKK3ZvaWQgbWl0ZV9kbWFfZGlzYXJtKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbik7CitpbnQgbWl0ZV9zeW5jX2lucHV0X2RtYShzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4sIGNvbWVkaV9hc3luYyAqIGFzeW5jKTsKK2ludCBtaXRlX3N5bmNfb3V0cHV0X2RtYShzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4sIGNvbWVkaV9hc3luYyAqIGFzeW5jKTsKK3UzMiBtaXRlX2J5dGVzX3dyaXR0ZW5fdG9fbWVtb3J5X2xiKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbik7Cit1MzIgbWl0ZV9ieXRlc193cml0dGVuX3RvX21lbW9yeV91YihzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pOwordTMyIG1pdGVfYnl0ZXNfcmVhZF9mcm9tX21lbW9yeV9sYihzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pOwordTMyIG1pdGVfYnl0ZXNfcmVhZF9mcm9tX21lbW9yeV91YihzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pOwordTMyIG1pdGVfYnl0ZXNfaW5fdHJhbnNpdChzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pOwordW5zaWduZWQgbWl0ZV9nZXRfc3RhdHVzKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbik7CitpbnQgbWl0ZV9kb25lKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbik7CisKKyNpZiAwCit1bnNpZ25lZCBsb25nIG1pdGVfbGxfZnJvbV9rdm1lbShzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUsIGNvbWVkaV9hc3luYyAqIGFzeW5jLAorCWludCBsZW4pOwordm9pZCBtaXRlX3NldHJlZ3Moc3RydWN0IG1pdGVfc3RydWN0ICptaXRlLCB1bnNpZ25lZCBsb25nIGxsX3N0YXJ0LCBpbnQgY2hhbiwKKwlpbnQgZGlyKTsKKyNlbmRpZgorCit2b2lkIG1pdGVfcHJlcF9kbWEoc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuLAorCXVuc2lnbmVkIGludCBudW1fZGV2aWNlX2JpdHMsIHVuc2lnbmVkIGludCBudW1fbWVtb3J5X2JpdHMpOworaW50IG1pdGVfYnVmX2NoYW5nZShzdHJ1Y3QgbWl0ZV9kbWFfZGVzY3JpcHRvcl9yaW5nICpyaW5nLAorCWNvbWVkaV9hc3luYyAqIGFzeW5jKTsKKworI2lmZGVmIERFQlVHX01JVEUKK3ZvaWQgbWl0ZV9wcmludF9jaHNyKHVuc2lnbmVkIGludCBjaHNyKTsKK3ZvaWQgbWl0ZV9kdW1wX3JlZ3Moc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKTsKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGludCBDSEFOX09GRlNFVChpbnQgY2hhbm5lbCkKK3sKKwlyZXR1cm4gMHg1MDAgKyAweDEwMCAqIGNoYW5uZWw7Cit9OworCitlbnVtIG1pdGVfcmVnaXN0ZXJzIHsKKwkvKiBUaGUgYml0cyAweDkwMTgwNzAwIGluIE1JVEVfVU5LTk9XTl9ETUFfQlVSU1RfUkVHIGNhbiBiZQorCSAgIHdyaXR0ZW4gYW5kIHJlYWQgYmFjay4gIFRoZSBiaXRzIDB4MWYgYWx3YXlzIHJlYWQgYXMgMS4KKwkgICBUaGUgcmVzdCBhbHdheXMgcmVhZCBhcyB6ZXJvLiAqLworCU1JVEVfVU5LTk9XTl9ETUFfQlVSU1RfUkVHID0gMHgyOCwKKwlNSVRFX0lPRFdCU1IgPSAweGMwLAkvL0lPIERldmljZSBXaW5kb3cgQmFzZSBTaXplIFJlZ2lzdGVyCisJTUlURV9JT0RXQlNSXzEgPSAweGM0LAkvLyBJTyBEZXZpY2UgV2luZG93IEJhc2UgU2l6ZSBSZWdpc3RlciAxCisJTUlURV9JT0RXQ1JfMSA9IDB4ZjQsCisJTUlURV9QQ0lfQ09ORklHX09GRlNFVCA9IDB4MzAwLAorCU1JVEVfQ1NJR1IgPSAweDQ2MAkvL2NoaXAgc2lnbmF0dXJlCit9Oworc3RhdGljIGlubGluZSBpbnQgTUlURV9DSE9SKGludCBjaGFubmVsKQkvLyBjaGFubmVsIG9wZXJhdGlvbgoreworCXJldHVybiBDSEFOX09GRlNFVChjaGFubmVsKSArIDB4MDsKK307CitzdGF0aWMgaW5saW5lIGludCBNSVRFX0NIQ1IoaW50IGNoYW5uZWwpCS8vIGNoYW5uZWwgY29udHJvbAoreworCXJldHVybiBDSEFOX09GRlNFVChjaGFubmVsKSArIDB4NDsKK307CitzdGF0aWMgaW5saW5lIGludCBNSVRFX1RDUihpbnQgY2hhbm5lbCkJLy8gdHJhbnNmZXIgY291bnQKK3sKKwlyZXR1cm4gQ0hBTl9PRkZTRVQoY2hhbm5lbCkgKyAweDg7Cit9Oworc3RhdGljIGlubGluZSBpbnQgTUlURV9NQ1IoaW50IGNoYW5uZWwpCS8vIG1lbW9yeSBjb25maWd1cmF0aW9uCit7CisJcmV0dXJuIENIQU5fT0ZGU0VUKGNoYW5uZWwpICsgMHhjOworfTsKK3N0YXRpYyBpbmxpbmUgaW50IE1JVEVfTUFSKGludCBjaGFubmVsKQkvLyBtZW1vcnkgYWRkcmVzcworeworCXJldHVybiBDSEFOX09GRlNFVChjaGFubmVsKSArIDB4MTA7Cit9Oworc3RhdGljIGlubGluZSBpbnQgTUlURV9EQ1IoaW50IGNoYW5uZWwpCS8vIGRldmljZSBjb25maWd1cmF0aW9uCit7CisJcmV0dXJuIENIQU5fT0ZGU0VUKGNoYW5uZWwpICsgMHgxNDsKK307CitzdGF0aWMgaW5saW5lIGludCBNSVRFX0RBUihpbnQgY2hhbm5lbCkJLy8gZGV2aWNlIGFkZHJlc3MKK3sKKwlyZXR1cm4gQ0hBTl9PRkZTRVQoY2hhbm5lbCkgKyAweDE4OworfTsKK3N0YXRpYyBpbmxpbmUgaW50IE1JVEVfTEtDUihpbnQgY2hhbm5lbCkJLy8gbGluayBjb25maWd1cmF0aW9uCit7CisJcmV0dXJuIENIQU5fT0ZGU0VUKGNoYW5uZWwpICsgMHgxYzsKK307CitzdGF0aWMgaW5saW5lIGludCBNSVRFX0xLQVIoaW50IGNoYW5uZWwpCS8vIGxpbmsgYWRkcmVzcworeworCXJldHVybiBDSEFOX09GRlNFVChjaGFubmVsKSArIDB4MjA7Cit9Oworc3RhdGljIGlubGluZSBpbnQgTUlURV9MTEtBUihpbnQgY2hhbm5lbCkJLy8gc2VlIG1pdGUgc2VjdGlvbiBvZiB0bnQ1MDAyIG1hbnVhbAoreworCXJldHVybiBDSEFOX09GRlNFVChjaGFubmVsKSArIDB4MjQ7Cit9Oworc3RhdGljIGlubGluZSBpbnQgTUlURV9CQVIoaW50IGNoYW5uZWwpCS8vIGJhc2UgYWRkcmVzcworeworCXJldHVybiBDSEFOX09GRlNFVChjaGFubmVsKSArIDB4Mjg7Cit9Oworc3RhdGljIGlubGluZSBpbnQgTUlURV9CQ1IoaW50IGNoYW5uZWwpCS8vIGJhc2UgY291bnQKK3sKKwlyZXR1cm4gQ0hBTl9PRkZTRVQoY2hhbm5lbCkgKyAweDJjOworfTsKK3N0YXRpYyBpbmxpbmUgaW50IE1JVEVfU0FSKGludCBjaGFubmVsKQkvLyA/IGFkZHJlc3MKK3sKKwlyZXR1cm4gQ0hBTl9PRkZTRVQoY2hhbm5lbCkgKyAweDMwOworfTsKK3N0YXRpYyBpbmxpbmUgaW50IE1JVEVfV1NDUihpbnQgY2hhbm5lbCkJLy8gPworeworCXJldHVybiBDSEFOX09GRlNFVChjaGFubmVsKSArIDB4MzQ7Cit9Oworc3RhdGljIGlubGluZSBpbnQgTUlURV9XU0VSKGludCBjaGFubmVsKQkvLyA/Cit7CisJcmV0dXJuIENIQU5fT0ZGU0VUKGNoYW5uZWwpICsgMHgzODsKK307CitzdGF0aWMgaW5saW5lIGludCBNSVRFX0NIU1IoaW50IGNoYW5uZWwpCS8vIGNoYW5uZWwgc3RhdHVzCit7CisJcmV0dXJuIENIQU5fT0ZGU0VUKGNoYW5uZWwpICsgMHgzYzsKK307CitzdGF0aWMgaW5saW5lIGludCBNSVRFX0ZDUihpbnQgY2hhbm5lbCkJLy8gZmlmbyBjb3VudAoreworCXJldHVybiBDSEFOX09GRlNFVChjaGFubmVsKSArIDB4NDA7Cit9OworCitlbnVtIE1JVEVfSU9EV0JTUl9iaXRzIHsKKwlXRU5BQiA9IDB4ODAsCQkvLyB3aW5kb3cgZW5hYmxlCit9OworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIE1JVEVfSU9EV0JTUl8xX1dTSVpFX2JpdHModW5zaWduZWQgc2l6ZSkKK3sKKwl1bnNpZ25lZCBvcmRlciA9IDA7CisJd2hpbGUgKHNpemUgPj49IDEpCisJCSsrb3JkZXI7CisJQlVHX09OKG9yZGVyIDwgMSk7CisJcmV0dXJuIChvcmRlciAtIDEpICYgMHgxZjsKK30KKworZW51bSBNSVRFX1VOS05PV05fRE1BX0JVUlNUX2JpdHMgeworCVVOS05PV05fRE1BX0JVUlNUX0VOQUJMRV9CSVRTID0gMHg2MDAKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IG1pdGVfY3NpZ3JfdmVyc2lvbih1MzIgY3NpZ3JfYml0cykKK3sKKwlyZXR1cm4gY3NpZ3JfYml0cyAmIDB4ZjsKK307CitzdGF0aWMgaW5saW5lIGludCBtaXRlX2NzaWdyX3R5cGUodTMyIGNzaWdyX2JpdHMpCit7CQkJCS8vIG9yaWdpbmFsIG1pdGUgPSAwLCBtaW5pbWl0ZSA9IDEKKwlyZXR1cm4gKGNzaWdyX2JpdHMgPj4gNCkgJiAweGY7Cit9Oworc3RhdGljIGlubGluZSBpbnQgbWl0ZV9jc2lncl9tbW9kZSh1MzIgY3NpZ3JfYml0cykKK3sJCQkJLy8gbWl0ZSBtb2RlLCBtaW5pbWl0ZSA9IDEKKwlyZXR1cm4gKGNzaWdyX2JpdHMgPj4gOCkgJiAweDM7Cit9Oworc3RhdGljIGlubGluZSBpbnQgbWl0ZV9jc2lncl9pbW9kZSh1MzIgY3NpZ3JfYml0cykKK3sJCQkJLy8gY3B1IHBvcnQgaW50ZXJmYWNlIG1vZGUsIHBjaSA9IDB4MworCXJldHVybiAoY3NpZ3JfYml0cyA+PiAxMikgJiAweDM7Cit9Oworc3RhdGljIGlubGluZSBpbnQgbWl0ZV9jc2lncl9kbWFjKHUzMiBjc2lncl9iaXRzKQorewkJCQkvLyBudW1iZXIgb2YgZG1hIGNoYW5uZWxzCisJcmV0dXJuIChjc2lncl9iaXRzID4+IDE2KSAmIDB4ZjsKK307CitzdGF0aWMgaW5saW5lIGludCBtaXRlX2NzaWdyX3dwZGVwKHUzMiBjc2lncl9iaXRzKQorewkJCQkvLyB3cml0ZSBwb3N0IGZpZm8gZGVwdGgKKwl1bnNpZ25lZCBpbnQgd3BkZXBfYml0cyA9IChjc2lncl9iaXRzID4+IDIwKSAmIDB4NzsKKwlpZiAod3BkZXBfYml0cyA9PSAwKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAxIDw8ICh3cGRlcF9iaXRzIC0gMSk7Cit9Oworc3RhdGljIGlubGluZSBpbnQgbWl0ZV9jc2lncl93aW5zKHUzMiBjc2lncl9iaXRzKQoreworCXJldHVybiAoY3NpZ3JfYml0cyA+PiAyNCkgJiAweDFmOworfTsKK3N0YXRpYyBpbmxpbmUgaW50IG1pdGVfY3NpZ3JfaW93aW5zKHUzMiBjc2lncl9iaXRzKQorewkJCQkvLyBudW1iZXIgb2YgaW8gd2luZG93cworCXJldHVybiAoY3NpZ3JfYml0cyA+PiAyOSkgJiAweDc7Cit9OworCitlbnVtIE1JVEVfTUNSX2JpdHMgeworCU1DUlBPTiA9IDAsCit9OworCitlbnVtIE1JVEVfRENSX2JpdHMgeworCURDUl9OT1JNQUwgPSAoMSA8PCAyOSksCisJRENSUE9OID0gMCwKK307CisKK2VudW0gTUlURV9DSE9SX2JpdHMgeworCUNIT1JfRE1BUkVTRVQgPSAoMSA8PCAzMSksCisJQ0hPUl9TRVRfU0VORF9UQyA9ICgxIDw8IDExKSwKKwlDSE9SX0NMUl9TRU5EX1RDID0gKDEgPDwgMTApLAorCUNIT1JfU0VUX0xQQVVTRSA9ICgxIDw8IDkpLAorCUNIT1JfQ0xSX0xQQVVTRSA9ICgxIDw8IDgpLAorCUNIT1JfQ0xSRE9ORSA9ICgxIDw8IDcpLAorCUNIT1JfQ0xSUkIgPSAoMSA8PCA2KSwKKwlDSE9SX0NMUkxDID0gKDEgPDwgNSksCisJQ0hPUl9GUkVTRVQgPSAoMSA8PCA0KSwKKwlDSE9SX0FCT1JUID0gKDEgPDwgMyksCS8qIHN0b3Agd2l0aG91dCBlbXB0eWluZyBmaWZvICovCisJQ0hPUl9TVE9QID0gKDEgPDwgMiksCS8qIHN0b3AgYWZ0ZXIgZW1wdHlpbmcgZmlmbyAqLworCUNIT1JfQ09OVCA9ICgxIDw8IDEpLAorCUNIT1JfU1RBUlQgPSAoMSA8PCAwKSwKKwlDSE9SX1BPTiA9IChDSE9SX0NMUl9TRU5EX1RDIHwgQ0hPUl9DTFJfTFBBVVNFKSwKK307CisKK2VudW0gTUlURV9DSENSX2JpdHMgeworCUNIQ1JfU0VUX0RNQV9JRSA9ICgxIDw8IDMxKSwKKwlDSENSX0NMUl9ETUFfSUUgPSAoMSA8PCAzMCksCisJQ0hDUl9TRVRfTElOS1BfSUUgPSAoMSA8PCAyOSksCisJQ0hDUl9DTFJfTElOS1BfSUUgPSAoMSA8PCAyOCksCisJQ0hDUl9TRVRfU0FSX0lFID0gKDEgPDwgMjcpLAorCUNIQ1JfQ0xSX1NBUl9JRSA9ICgxIDw8IDI2KSwKKwlDSENSX1NFVF9ET05FX0lFID0gKDEgPDwgMjUpLAorCUNIQ1JfQ0xSX0RPTkVfSUUgPSAoMSA8PCAyNCksCisJQ0hDUl9TRVRfTVJEWV9JRSA9ICgxIDw8IDIzKSwKKwlDSENSX0NMUl9NUkRZX0lFID0gKDEgPDwgMjIpLAorCUNIQ1JfU0VUX0RSRFlfSUUgPSAoMSA8PCAyMSksCisJQ0hDUl9DTFJfRFJEWV9JRSA9ICgxIDw8IDIwKSwKKwlDSENSX1NFVF9MQ19JRSA9ICgxIDw8IDE5KSwKKwlDSENSX0NMUl9MQ19JRSA9ICgxIDw8IDE4KSwKKwlDSENSX1NFVF9DT05UX1JCX0lFID0gKDEgPDwgMTcpLAorCUNIQ1JfQ0xSX0NPTlRfUkJfSUUgPSAoMSA8PCAxNiksCisJQ0hDUl9GSUZPRElTID0gKDEgPDwgMTUpLAorCUNIQ1JfRklGT19PTiA9IDAsCisJQ0hDUl9CVVJTVEVOID0gKDEgPDwgMTQpLAorCUNIQ1JfTk9fQlVSU1RFTiA9IDAsCisJQ0hDUl9CWVRFX1NXQVBfREVWSUNFID0gKDEgPDwgNiksCisJQ0hDUl9CWVRFX1NXQVBfTUVNT1JZID0gKDEgPDwgNCksCisJQ0hDUl9ESVIgPSAoMSA8PCAzKSwKKwlDSENSX0RFVl9UT19NRU0gPSBDSENSX0RJUiwKKwlDSENSX01FTV9UT19ERVYgPSAwLAorCUNIQ1JfTk9STUFMID0gKDAgPDwgMCksCisJQ0hDUl9DT05USU5VRSA9ICgxIDw8IDApLAorCUNIQ1JfUklOR0JVRkYgPSAoMiA8PCAwKSwKKwlDSENSX0xJTktTSE9SVCA9ICg0IDw8IDApLAorCUNIQ1JfTElOS0xPTkcgPSAoNSA8PCAwKSwKKwlDSENSUE9OID0KKwkJKENIQ1JfQ0xSX0RNQV9JRSB8IENIQ1JfQ0xSX0xJTktQX0lFIHwgQ0hDUl9DTFJfU0FSX0lFIHwKKwkJQ0hDUl9DTFJfRE9ORV9JRSB8IENIQ1JfQ0xSX01SRFlfSUUgfCBDSENSX0NMUl9EUkRZX0lFIHwKKwkJQ0hDUl9DTFJfTENfSUUgfCBDSENSX0NMUl9DT05UX1JCX0lFKSwKK307CisKK2VudW0gQ29uZmlnUmVnaXN0ZXJfYml0cyB7CisJQ1JfUkVRU19NQVNLID0gMHg3IDw8IDE2LAorCUNSX0FTRVFET05UID0gMHgwIDw8IDEwLAorCUNSX0FTRVFVUCA9IDB4MSA8PCAxMCwKKwlDUl9BU0VRRE9XTiA9IDB4MiA8PCAxMCwKKwlDUl9BU0VRX01BU0sgPSAweDMgPDwgMTAsCisJQ1JfUFNJWkU4ID0gKDEgPDwgOCksCisJQ1JfUFNJWkUxNiA9ICgyIDw8IDgpLAorCUNSX1BTSVpFMzIgPSAoMyA8PCA4KSwKKwlDUl9QT1JUQ1BVID0gKDAgPDwgNiksCisJQ1JfUE9SVElPID0gKDEgPDwgNiksCisJQ1JfUE9SVFZYSSA9ICgyIDw8IDYpLAorCUNSX1BPUlRNWEkgPSAoMyA8PCA2KSwKKwlDUl9BTURFVklDRSA9ICgxIDw8IDApLAorfTsKK3N0YXRpYyBpbmxpbmUgaW50IENSX1JFUVMoaW50IHNvdXJjZSkKK3sKKwlyZXR1cm4gKHNvdXJjZSAmIDB4NykgPDwgMTY7Cit9Oworc3RhdGljIGlubGluZSBpbnQgQ1JfUkVRU0RSUSh1bnNpZ25lZCBkcnFfbGluZSkKK3sKKwkvKiBUaGlzIGFsc28gd29ya3Mgb24gbS1zZXJpZXMgd2hlbgorCSAgIHVzaW5nIGNoYW5uZWxzIChkcnFfbGluZSkgNCBvciA1LiAqLworCXJldHVybiBDUl9SRVFTKChkcnFfbGluZSAmIDB4MykgfCAweDQpOworfQorc3RhdGljIGlubGluZSBpbnQgQ1JfUkwodW5zaWduZWQgaW50IHJldHJ5X2xpbWl0KQoreworCWludCB2YWx1ZSA9IDA7CisKKwl3aGlsZSAocmV0cnlfbGltaXQpIHsKKwkJcmV0cnlfbGltaXQgPj49IDE7CisJCXZhbHVlKys7CisJfQorCWlmICh2YWx1ZSA+IDB4NykKKwkJcnRfcHJpbnRrKCJjb21lZGk6IGJ1ZyEgcmV0cnlfbGltaXQgdG9vIGxhcmdlXG4iKTsKKwlyZXR1cm4gKHZhbHVlICYgMHg3KSA8PCAyMTsKK30KKworZW51bSBDSFNSX2JpdHMgeworCUNIU1JfSU5UID0gKDEgPDwgMzEpLAorCUNIU1JfTFBBVVNFUyA9ICgxIDw8IDI5KSwKKwlDSFNSX1NBUlMgPSAoMSA8PCAyNyksCisJQ0hTUl9ET05FID0gKDEgPDwgMjUpLAorCUNIU1JfTVJEWSA9ICgxIDw8IDIzKSwKKwlDSFNSX0RSRFkgPSAoMSA8PCAyMSksCisJQ0hTUl9MSU5LQyA9ICgxIDw8IDE5KSwKKwlDSFNSX0NPTlRTX1JCID0gKDEgPDwgMTcpLAorCUNIU1JfRVJST1IgPSAoMSA8PCAxNSksCisJQ0hTUl9TQUJPUlQgPSAoMSA8PCAxNCksCisJQ0hTUl9IQUJPUlQgPSAoMSA8PCAxMyksCisJQ0hTUl9TVE9QUyA9ICgxIDw8IDEyKSwKKwlDSFNSX09QRVJSX21hc2sgPSAoMyA8PCAxMCksCisJQ0hTUl9PUEVSUl9OT0VSUk9SID0gKDAgPDwgMTApLAorCUNIU1JfT1BFUlJfRklGT0VSUk9SID0gKDEgPDwgMTApLAorCUNIU1JfT1BFUlJfTElOS0VSUk9SID0gKDEgPDwgMTApLAkvKiA/Pz8gKi8KKwlDSFNSX1hGRVJSID0gKDEgPDwgOSksCisJQ0hTUl9FTkQgPSAoMSA8PCA4KSwKKwlDSFNSX0RSUTEgPSAoMSA8PCA3KSwKKwlDSFNSX0RSUTAgPSAoMSA8PCA2KSwKKwlDSFNSX0x4RVJSX21hc2sgPSAoMyA8PCA0KSwKKwlDSFNSX0xCRVJSID0gKDEgPDwgNCksCisJQ0hTUl9MUkVSUiA9ICgyIDw8IDQpLAorCUNIU1JfTE9FUlIgPSAoMyA8PCA0KSwKKwlDSFNSX014RVJSX21hc2sgPSAoMyA8PCAyKSwKKwlDSFNSX01CRVJSID0gKDEgPDwgMiksCisJQ0hTUl9NUkVSUiA9ICgyIDw8IDIpLAorCUNIU1JfTU9FUlIgPSAoMyA8PCAyKSwKKwlDSFNSX0R4RVJSX21hc2sgPSAoMyA8PCAwKSwKKwlDSFNSX0RCRVJSID0gKDEgPDwgMCksCisJQ0hTUl9EUkVSUiA9ICgyIDw8IDApLAorCUNIU1JfRE9FUlIgPSAoMyA8PCAwKSwKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtaXRlX2RtYV9yZXNldChzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pCit7CisJd3JpdGVsKENIT1JfRE1BUkVTRVQgfCBDSE9SX0ZSRVNFVCwKKwkJbWl0ZV9jaGFuLT5taXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0NIT1IobWl0ZV9jaGFuLT5jaGFubmVsKSk7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wbHg5MDgwLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGx4OTA4MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YTFhNjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGx4OTA4MC5oCkBAIC0wLDAgKzEsNDI5IEBACisvKiBwbHg5MDgwLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsMjAwMyBGcmFuayBNb3JpIEhlc3MgPGZtaGVzc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisgKgorICogSSBtb2RpZmllZCB0aGlzIGZpbGUgZnJvbSB0aGUgcGx4OTA2MC5oIGhlYWRlciBmb3IgdGhlCisgKiB3YW5YTCBkZXZpY2UgZHJpdmVyIGluIHRoZSBsaW51eCBrZXJuZWwsCisgKiBmb3IgdGhlIHJlZ2lzdGVyIG9mZnNldHMgYW5kIGJpdCBkZWZpbml0aW9ucy4gIE1hZGUgbWlub3IgbW9kaWZpY2F0aW9ucywKKyAqIGFkZGVkIHBseDkwODAgcmVnaXN0ZXJzIGFuZAorICogc3RyaXBwZWQgb3V0IHN0dWZmIHRoYXQgd2FzIHNwZWNpZmljYWxseSBmb3IgdGhlIHdhblhMIGRyaXZlci4KKyAqIE5vdGU6IEkndmUgb25seSBtYWRlIHN1cmUgdGhlIGRlZmluaXRpb25zIGFyZSBjb3JyZWN0IGFzIGZhcgorICogYXMgSSBtYWtlIHVzZSBvZiB0aGVtLiAgVGhlcmUgYXJlIHN0aWxsIHZhcmlvdXMgcGx4OTA2MC1pc21zCisgKiBsZWZ0IGluIHRoaXMgaGVhZGVyIGZpbGUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5IFJHIFN0dWRpbyBzLmMuLCBodHRwOi8vd3d3LnJnc3R1ZGlvLmNvbS5wbC8KKyAqIFdyaXR0ZW4gYnkgS3J6eXN6dG9mIEhhbGFzYSA8a2hjQHJnc3R1ZGlvLmNvbS5wbD4KKyAqCisgKiBQb3J0aW9ucyAoQykgU0JFIEluYy4sIHVzZWQgYnkgcGVybWlzc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX19DT01FRElfUExYOTA4MF9ICisjZGVmaW5lIF9fQ09NRURJX1BMWDkwODBfSAorCisvLyBkZXNjcmlwdG9yIGJsb2NrIHVzZWQgZm9yIGNoYWluZWQgZG1hIHRyYW5zZmVycworc3RydWN0IHBseF9kbWFfZGVzYyB7CisJdm9sYXRpbGUgdWludDMyX3QgcGNpX3N0YXJ0X2FkZHI7CisJdm9sYXRpbGUgdWludDMyX3QgbG9jYWxfc3RhcnRfYWRkcjsKKwkvKiB0cmFuc2Zlcl9zaXplIGlzIGluIGJ5dGVzLCBvbmx5IGZpcnN0IDIzIGJpdHMgb2YgcmVnaXN0ZXIgYXJlIHVzZWQgKi8KKwl2b2xhdGlsZSB1aW50MzJfdCB0cmFuc2Zlcl9zaXplOworCS8qIGFkZHJlc3Mgb2YgbmV4dCBkZXNjcmlwdG9yIChxdWFkIHdvcmQgYWxpZ25lZCksIHBsdXMgc29tZQorCSAqIGFkZGl0aW9uYWwgYml0cyAoc2VlIFBMWF9ETUEwX0RFU0NSSVBUT1JfUkVHKSAqLworCXZvbGF0aWxlIHVpbnQzMl90IG5leHQ7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogICAgICAgICAgICBSZWdpc3RlciBPZmZzZXRzIGFuZCBCaXQgRGVmaW5pdGlvbnMKKyoqCisqKiBOb3RlOiBBbGwgb2Zmc2V0cyB6ZXJvIHJlbGF0aXZlLiAgSUUuIFNvbWUgc3RhbmRhcmQgYmFzZSBhZGRyZXNzCisqKiBtdXN0IGJlIGFkZGVkIHRvIHRoZSBSZWdpc3RlciBOdW1iZXIgdG8gcHJvcGVybHkgYWNjZXNzIHRoZSByZWdpc3Rlci4KKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFBMWF9MQVMwUk5HX1JFRyAgICAgICAgIDB4MDAwMAkvKiBMLCBMb2NhbCBBZGRyIFNwYWNlIDAgUmFuZ2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUExYX0xBUzFSTkdfUkVHICAgICAgICAgMHgwMGYwCS8qIEwsIExvY2FsIEFkZHIgU3BhY2UgMSBSYW5nZSBSZWdpc3RlciAqLworI2RlZmluZSAgTFJOR19JTyAgICAgICAgICAgMHgwMDAwMDAwMQkvKiBNYXAgdG86IDE9SS9PLCAwPU1lbSAqLworI2RlZmluZSAgTFJOR19BTlkzMiAgICAgICAgMHgwMDAwMDAwMAkvKiBMb2NhdGUgYW55d2hlcmUgaW4gMzIgYml0ICovCisjZGVmaW5lICBMUk5HX0xUMU1CICAgICAgICAweDAwMDAwMDAyCS8qIExvY2F0ZSBpbiAxc3QgbWVnICovCisjZGVmaW5lICBMUk5HX0FOWTY0ICAgICAgICAweDAwMDAwMDA0CS8qIExvY2F0ZSBhbnl3aGVyZSBpbiA2NCBiaXQgKi8KKyNkZWZpbmUgIExSTkdfTUVNX01BU0sgICAgIDB4ZmZmZmZmZjAJLy8gYml0cyB0aGF0IHNwZWNpZnkgcmFuZ2UgZm9yIG1lbW9yeSBpbworI2RlZmluZSAgTFJOR19JT19NQVNLICAgICAweGZmZmZmZmZhCS8vIGJpdHMgdGhhdCBzcGVjaWZ5IHJhbmdlIGZvciBub3JtYWwgaW8KKworI2RlZmluZSBQTFhfTEFTME1BUF9SRUcgICAgICAgICAweDAwMDQJLyogTCwgTG9jYWwgQWRkciBTcGFjZSAwIFJlbWFwIFJlZ2lzdGVyICovCisjZGVmaW5lIFBMWF9MQVMxTUFQX1JFRyAgICAgICAgIDB4MDBmNAkvKiBMLCBMb2NhbCBBZGRyIFNwYWNlIDEgUmVtYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgIExNQVBfRU4gICAgICAgICAgIDB4MDAwMDAwMDEJLyogRW5hYmxlIHNsYXZlIGRlY29kZSAqLworI2RlZmluZSAgTE1BUF9NRU1fTUFTSyAgICAgMHhmZmZmZmZmMAkvLyBiaXRzIHRoYXQgc3BlY2lmeSBkZWNvZGUgZm9yIG1lbW9yeSBpbworI2RlZmluZSAgTE1BUF9JT19NQVNLICAgICAweGZmZmZmZmZhCS8vIGJpdHMgdGhhdCBzcGVjaWZ5IGRlY29kZSBiaXRzIGZvciBub3JtYWwgaW8KKworLyogTW9kZS9BcmJpdHJhdGlvbiBSZWdpc3Rlci4KKyovCisjZGVmaW5lIFBMWF9NQVJCX1JFRyAgICAgICAgIDB4OAkvKiBMLCBMb2NhbCBBcmJpdHJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZSBQTFhfRE1BQVJCX1JFRyAgICAgIDB4YWMKK2VudW0gbWFyYl9iaXRzIHsKKwlNQVJCX0xMVF9NQVNLID0gMHgwMDAwMDBmZiwJLyogTG9jYWwgQnVzIExhdGVuY3kgVGltZXIgKi8KKwlNQVJCX0xQVF9NQVNLID0gMHgwMDAwZmYwMCwJLyogTG9jYWwgQnVzIFBhdXNlIFRpbWVyICovCisJTUFSQl9MVEVOID0gMHgwMDAxMDAwMCwJLyogTGF0ZW5jeSBUaW1lciBFbmFibGUgKi8KKwlNQVJCX0xQRU4gPSAweDAwMDIwMDAwLAkvKiBQYXVzZSBUaW1lciBFbmFibGUgKi8KKwlNQVJCX0JSRVEgPSAweDAwMDQwMDAwLAkvKiBMb2NhbCBCdXMgQlJFUSBFbmFibGUgKi8KKwlNQVJCX0RNQV9QUklPUklUWV9NQVNLID0gMHgwMDE4MDAwMCwKKwlNQVJCX0xCRFNfR0lWRV9VUF9CVVNfTU9ERSA9IDB4MDAyMDAwMDAsCS8qIGxvY2FsIGJ1cyBkaXJlY3Qgc2xhdmUgZ2l2ZSB1cCBidXMgbW9kZSAqLworCU1BUkJfRFNfTExPQ0tfRU5BQkxFID0gMHgwMDQwMDAwMCwJLyogZGlyZWN0IHNsYXZlIExMT0NLbyMgZW5hYmxlICovCisJTUFSQl9QQ0lfUkVRVUVTVF9NT0RFID0gMHgwMDgwMDAwMCwKKwlNQVJCX1BDSXYyMV9NT0RFID0gMHgwMTAwMDAwMCwJLyogcGNpIHNwZWNpZmljYXRpb24gdjIuMSBtb2RlICovCisJTUFSQl9QQ0lfUkVBRF9OT19XUklURV9NT0RFID0gMHgwMjAwMDAwMCwKKwlNQVJCX1BDSV9SRUFEX1dJVEhfV1JJVEVfRkxVU0hfTU9ERSA9IDB4MDQwMDAwMDAsCisJTUFSQl9HQVRFX1RJTUVSX1dJVEhfQlJFUSA9IDB4MDgwMDAwMDAsCS8qIGdhdGUgbG9jYWwgYnVzIGxhdGVuY3kgdGltZXIgd2l0aCBCUkVRICovCisJTUFSQl9QQ0lfUkVBRF9OT19GTFVTSF9NT0RFID0gMHgxMDAwMDAwMCwKKwlNQVJCX1VTRV9TVUJTWVNURU1fSURTID0gMHgyMDAwMDAwMCwKK307CisKKyNkZWZpbmUgUExYX0JJR0VORF9SRUcgMHhjCitlbnVtIGJpZ2VuZF9iaXRzIHsKKwlCSUdFTkRfQ09ORklHID0gMHgxLAkvKiB1c2UgYmlnIGVuZGlhbiBvcmRlcmluZyBmb3IgY29uZmlndXJhdGlvbiByZWdpc3RlciBhY2Nlc3NlcyAqLworCUJJR0VORF9ESVJFQ1RfTUFTVEVSID0gMHgyLAorCUJJR0VORF9ESVJFQ1RfU0xBVkVfTE9DQUwwID0gMHg0LAorCUJJR0VORF9ST00gPSAweDgsCisJQklHRU5EX0JZVEVfTEFORSA9IDB4MTAsCS8qIHVzZSBieXRlIGxhbmUgY29uc2lzdGluZyBvZiBtb3N0IHNpZ25pZmljYW50IGJpdHMgaW5zdGVhZCBvZiBsZWFzdCBzaWduaWZpY2FudCAqLworCUJJR0VORF9ESVJFQ1RfU0xBVkVfTE9DQUwxID0gMHgyMCwKKwlCSUdFTkRfRE1BMSA9IDB4NDAsCisJQklHRU5EX0RNQTAgPSAweDgwLAorfTsKKworLyogTm90ZTogVGhlIEV4cGFuc2lvbiBST00gIHN0dWZmIGlzIG9ubHkgcmVsZXZhbnQgdG8gdGhlIFBDIGVudmlyb25tZW50LgorKiogICAgICAgVGhpcyBleHBhbnNpb24gUk9NIGNvZGUgaXMgZXhlY3V0ZWQgYnkgdGhlIGhvc3QgQ1BVIGF0IGJvb3QgdGltZS4KKyoqICAgICAgIEZvciB0aGlzIHJlYXNvbiBubyBiaXQgZGVmaW5pdGlvbnMgYXJlIHByb3ZpZGVkIGhlcmUuCisqLworI2RlZmluZSBQTFhfUk9NUk5HX1JFRyAgICAgICAgIDB4MDAxMAkvKiBMLCBFeHBuIFJPTSBTcGFjZSBSYW5nZSBSZWdpc3RlciAqLworI2RlZmluZSBQTFhfUk9NTUFQX1JFRyAgICAgICAgIDB4MDAxNAkvKiBMLCBMb2NhbCBBZGRyIFNwYWNlIFJhbmdlIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgUExYX1JFR0lPTjBfUkVHICAgICAgICAgMHgwMDE4CS8qIEwsIExvY2FsIEJ1cyBSZWdpb24gMCBEZXNjcmlwdG9yICovCisjZGVmaW5lICBSR05fV0lEVEggICAgICAgICAweDAwMDAwMDAyCS8qIExvY2FsIGJ1cyB3aWR0aCBiaXRzICovCisjZGVmaW5lICBSR05fOEJJVFMgICAgICAgICAweDAwMDAwMDAwCS8qIDA4IGJpdCBMb2NhbCBCdXMgKi8KKyNkZWZpbmUgIFJHTl8xNkJJVFMgICAgICAgIDB4MDAwMDAwMDEJLyogMTYgYml0IExvY2FsIEJ1cyAqLworI2RlZmluZSAgUkdOXzMyQklUUyAgICAgICAgMHgwMDAwMDAwMgkvKiAzMiBiaXQgTG9jYWwgQnVzICovCisjZGVmaW5lICBSR05fTVdTICAgICAgICAgICAweDAwMDAwMDNDCS8qIE1lbW9yeSBBY2Nlc3MgV2FpdCBTdGF0ZXMgKi8KKyNkZWZpbmUgIFJHTl8wTVdTICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgIFJHTl8xTVdTICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgIFJHTl8yTVdTICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgIFJHTl8zTVdTICAgICAgICAgIDB4MDAwMDAwMEMKKyNkZWZpbmUgIFJHTl80TVdTICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgIFJHTl82TVdTICAgICAgICAgIDB4MDAwMDAwMTgKKyNkZWZpbmUgIFJHTl84TVdTICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgIFJHTl9NUkUgICAgICAgICAgIDB4MDAwMDAwNDAJLyogTWVtb3J5IFNwYWNlIFJlYWR5IElucHV0IEVuYWJsZSAqLworI2RlZmluZSAgUkdOX01CRSAgICAgICAgICAgMHgwMDAwMDA4MAkvKiBNZW1vcnkgU3BhY2UgQnRlcm0gSW5wdXQgRW5hYmxlICovCisjZGVmaW5lICBSR05fUkVBRF9QUkVGRVRDSF9ESVNBQkxFIDB4MDAwMDAxMDAKKyNkZWZpbmUgIFJHTl9ST01fUFJFRkVUQ0hfRElTQUJMRSAweDAwMDAwMjAwCisjZGVmaW5lICBSR05fUkVBRF9QUkVGRVRDSF9DT1VOVF9FTkFCTEUgMHgwMDAwMDQwMAorI2RlZmluZSAgUkdOX1JXUyAgICAgICAgICAgMHgwMDNDMDAwMAkvKiBFeHBuIFJPTSBXYWl0IFN0YXRlcyAqLworI2RlZmluZSAgUkdOX1JSRSAgICAgICAgICAgMHgwMDQwMDAwMAkvKiBST00gU3BhY2UgUmVhZHkgSW5wdXQgRW5hYmxlICovCisjZGVmaW5lICBSR05fUkJFICAgICAgICAgICAweDAwODAwMDAwCS8qIFJPTSBTcGFjZSBCdGVybSBJbnB1dCBFbmFibGUgKi8KKyNkZWZpbmUgIFJHTl9NQkVOICAgICAgICAgIDB4MDEwMDAwMDAJLyogTWVtb3J5IFNwYWNlIEJ1cnN0IEVuYWJsZSAqLworI2RlZmluZSAgUkdOX1JCRU4gICAgICAgICAgMHgwNDAwMDAwMAkvKiBST00gU3BhY2UgQnVyc3QgRW5hYmxlICovCisjZGVmaW5lICBSR05fVEhST1QgICAgICAgICAweDA4MDAwMDAwCS8qIERlLWFzc2VydCBUUkRZIHdoZW4gRklGTyBmdWxsICovCisjZGVmaW5lICBSR05fVFJEICAgICAgICAgICAweEYwMDAwMDAwCS8qIFRhcmdldCBSZWFkeSBEZWxheSAvOCAqLworCisjZGVmaW5lIFBMWF9SRUdJT04xX1JFRyAgICAgICAgIDB4MDBmOAkvKiBMLCBMb2NhbCBCdXMgUmVnaW9uIDEgRGVzY3JpcHRvciAqLworCisjZGVmaW5lIFBMWF9ETVJOR19SRUcgICAgICAgICAgMHgwMDFDCS8qIEwsIERpcmVjdCBNYXN0ZXIgUmFuZ2UgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBQTFhfTEJBUE1FTV9SRUcgICAgICAgIDB4MDAyMAkvKiBMLCBMY2wgQmFzZSBBZGRyIGZvciBQQ0kgbWVtIHNwYWNlICovCisKKyNkZWZpbmUgUExYX0xCQVBJT19SRUcgICAgICAgICAweDAwMjQJLyogTCwgTGNsIEJhc2UgQWRkciBmb3IgUENJIEkvTyBzcGFjZSAqLworCisjZGVmaW5lIFBMWF9ETU1BUF9SRUcgICAgICAgICAgMHgwMDI4CS8qIEwsIERpcmVjdCBNYXN0ZXIgUmVtYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgIERNTV9NQUUgICAgICAgICAgIDB4MDAwMDAwMDEJLyogRGlyZWN0IE1zdHIgTWVtb3J5IEFjYyBFbmFibGUgKi8KKyNkZWZpbmUgIERNTV9JQUUgICAgICAgICAgIDB4MDAwMDAwMDIJLyogRGlyZWN0IE1zdHIgSS9PIEFjYyBFbmFibGUgKi8KKyNkZWZpbmUgIERNTV9MQ0sgICAgICAgICAgIDB4MDAwMDAwMDQJLyogTE9DSyBJbnB1dCBFbmFibGUgKi8KKyNkZWZpbmUgIERNTV9QRjQgICAgICAgICAgIDB4MDAwMDAwMDgJLyogUHJlZmV0Y2ggNCBNb2RlIEVuYWJsZSAqLworI2RlZmluZSAgRE1NX1RIUk9UICAgICAgICAgMHgwMDAwMDAxMAkvKiBBc3NlcnQgSVJEWSB3aGVuIHJlYWQgRklGTyBmdWxsICovCisjZGVmaW5lICBETU1fUEFGMCAgICAgICAgICAweDAwMDAwMDAwCS8qIFByb2dyYW1tYWJsZSBBbG1vc3QgZmlsbCBsZXZlbCAqLworI2RlZmluZSAgRE1NX1BBRjEgICAgICAgICAgMHgwMDAwMDAyMAkvKiBQcm9ncmFtbWFibGUgQWxtb3N0IGZpbGwgbGV2ZWwgKi8KKyNkZWZpbmUgIERNTV9QQUYyICAgICAgICAgIDB4MDAwMDAwNDAJLyogUHJvZ3JhbW1hYmxlIEFsbW9zdCBmaWxsIGxldmVsICovCisjZGVmaW5lICBETU1fUEFGMyAgICAgICAgICAweDAwMDAwMDYwCS8qIFByb2dyYW1tYWJsZSBBbG1vc3QgZmlsbCBsZXZlbCAqLworI2RlZmluZSAgRE1NX1BBRjQgICAgICAgICAgMHgwMDAwMDA4MAkvKiBQcm9ncmFtbWFibGUgQWxtb3N0IGZpbGwgbGV2ZWwgKi8KKyNkZWZpbmUgIERNTV9QQUY1ICAgICAgICAgIDB4MDAwMDAwQTAJLyogUHJvZ3JhbW1hYmxlIEFsbW9zdCBmaWxsIGxldmVsICovCisjZGVmaW5lICBETU1fUEFGNiAgICAgICAgICAweDAwMDAwMEMwCS8qIFByb2dyYW1tYWJsZSBBbG1vc3QgZmlsbCBsZXZlbCAqLworI2RlZmluZSAgRE1NX1BBRjcgICAgICAgICAgMHgwMDAwMDBEMAkvKiBQcm9ncmFtbWFibGUgQWxtb3N0IGZpbGwgbGV2ZWwgKi8KKyNkZWZpbmUgIERNTV9NQVAgICAgICAgICAgIDB4RkZGRjAwMDAJLyogUmVtYXAgQWRkcmVzcyBCaXRzICovCisKKyNkZWZpbmUgUExYX0NBUl9SRUcgICAgICAgICAgICAweDAwMkMJLyogTCwgQ29uZmlndXJhdGlvbiBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lICBDQVJfQ1QwICAgICAgICAgICAweDAwMDAwMDAwCS8qIENvbmZpZyBUeXBlIDAgKi8KKyNkZWZpbmUgIENBUl9DVDEgICAgICAgICAgIDB4MDAwMDAwMDEJLyogQ29uZmlnIFR5cGUgMSAqLworI2RlZmluZSAgQ0FSX1JFRyAgICAgICAgICAgMHgwMDAwMDBGQwkvKiBSZWdpc3RlciBOdW1iZXIgQml0cyAqLworI2RlZmluZSAgQ0FSX0ZVTiAgICAgICAgICAgMHgwMDAwMDcwMAkvKiBGdW5jdGlvbiBOdW1iZXIgQml0cyAqLworI2RlZmluZSAgQ0FSX0RFViAgICAgICAgICAgMHgwMDAwRjgwMAkvKiBEZXZpY2UgTnVtYmVyIEJpdHMgKi8KKyNkZWZpbmUgIENBUl9CVVMgICAgICAgICAgIDB4MDBGRjAwMDAJLyogQnVzIE51bWJlciBCaXRzICovCisjZGVmaW5lICBDQVJfQ0ZHICAgICAgICAgICAweDgwMDAwMDAwCS8qIENvbmZpZyBTcGMgQWNjZXNzIEVuYWJsZSAqLworCisjZGVmaW5lIFBMWF9EQlJfSU5fUkVHICAgICAgICAgMHgwMDYwCS8qIEwsIFBDSSB0byBMb2NhbCBEb29yYmVsbCBSZWdpc3RlciAqLworCisjZGVmaW5lIFBMWF9EQlJfT1VUX1JFRyAgICAgICAgMHgwMDY0CS8qIEwsIExvY2FsIHRvIFBDSSBEb29yYmVsbCBSZWdpc3RlciAqLworCisjZGVmaW5lIFBMWF9JTlRSQ1NfUkVHICAgICAgICAgMHgwMDY4CS8qIEwsIEludGVycnVwdCBDb250cm9sL1N0YXR1cyBSZWcgKi8KKyNkZWZpbmUgIElDU19BRVJSICAgICAgICAgIDB4MDAwMDAwMDEJLyogQXNzZXJ0IExTRVJSIG9uIEFCT1JUICovCisjZGVmaW5lICBJQ1NfUEVSUiAgICAgICAgICAweDAwMDAwMDAyCS8qIEFzc2VydCBMU0VSUiBvbiBQYXJpdHkgRXJyb3IgKi8KKyNkZWZpbmUgIElDU19TRVJSICAgICAgICAgIDB4MDAwMDAwMDQJLyogR2VuZXJhdGUgUENJIFNFUlIjICovCisjZGVmaW5lICBJQ1NfTUJJRSAgICAgICAgICAweDAwMDAwMDA4CS8vIG1haWxib3ggaW50ZXJydXB0IGVuYWJsZQorI2RlZmluZSAgSUNTX1BJRSAgICAgICAgICAgMHgwMDAwMDEwMAkvKiBQQ0kgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSAgSUNTX1BESUUgICAgICAgICAgMHgwMDAwMDIwMAkvKiBQQ0kgRG9vcmJlbGwgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSAgSUNTX1BBSUUgICAgICAgICAgMHgwMDAwMDQwMAkvKiBQQ0kgQWJvcnQgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSAgSUNTX1BMSUUgICAgICAgICAgMHgwMDAwMDgwMAkvKiBQQ0kgTG9jYWwgSW50IEVuYWJsZSAqLworI2RlZmluZSAgSUNTX1JBRSAgICAgICAgICAgMHgwMDAwMTAwMAkvKiBSZXRyeSBBYm9ydCBFbmFibGUgKi8KKyNkZWZpbmUgIElDU19QRElBICAgICAgICAgIDB4MDAwMDIwMDAJLyogUENJIERvb3JiZWxsIEludGVycnVwdCBBY3RpdmUgKi8KKyNkZWZpbmUgIElDU19QQUlBICAgICAgICAgIDB4MDAwMDQwMDAJLyogUENJIEFib3J0IEludGVycnVwdCBBY3RpdmUgKi8KKyNkZWZpbmUgIElDU19MSUEgICAgICAgICAgIDB4MDAwMDgwMDAJLyogTG9jYWwgSW50ZXJydXB0IEFjdGl2ZSAqLworI2RlZmluZSAgSUNTX0xJRSAgICAgICAgICAgMHgwMDAxMDAwMAkvKiBMb2NhbCBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lICBJQ1NfTERJRSAgICAgICAgICAweDAwMDIwMDAwCS8qIExvY2FsIERvb3JiZWxsIEludCBFbmFibGUgKi8KKyNkZWZpbmUgIElDU19ETUEwX0UgICAgICAgIDB4MDAwNDAwMDAJLyogRE1BICMwIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgIElDU19ETUExX0UgICAgICAgIDB4MDAwODAwMDAJLyogRE1BICMxIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgIElDU19MRElBICAgICAgICAgIDB4MDAxMDAwMDAJLyogTG9jYWwgRG9vcmJlbGwgSW50IEFjdGl2ZSAqLworI2RlZmluZSAgSUNTX0RNQTBfQSAgICAgICAgMHgwMDIwMDAwMAkvKiBETUEgIzAgSW50ZXJydXB0IEFjdGl2ZSAqLworI2RlZmluZSAgSUNTX0RNQTFfQSAgICAgICAgMHgwMDQwMDAwMAkvKiBETUEgIzEgSW50ZXJydXB0IEFjdGl2ZSAqLworI2RlZmluZSAgSUNTX0JJQSAgICAgICAgICAgMHgwMDgwMDAwMAkvKiBCSVNUIEludGVycnVwdCBBY3RpdmUgKi8KKyNkZWZpbmUgIElDU19UQV9ETSAgICAgICAgIDB4MDEwMDAwMDAJLyogVGFyZ2V0IEFib3J0IC0gRGlyZWN0IE1hc3RlciAqLworI2RlZmluZSAgSUNTX1RBX0RNQTAgICAgICAgMHgwMjAwMDAwMAkvKiBUYXJnZXQgQWJvcnQgLSBETUEgIzAgKi8KKyNkZWZpbmUgIElDU19UQV9ETUExICAgICAgIDB4MDQwMDAwMDAJLyogVGFyZ2V0IEFib3J0IC0gRE1BICMxICovCisjZGVmaW5lICBJQ1NfVEFfUkEgICAgICAgICAweDA4MDAwMDAwCS8qIFRhcmdldCBBYm9ydCAtIFJldHJ5IFRpbWVvdXQgKi8KKyNkZWZpbmUgIElDU19NQklBKHgpICAgICAgICgweDEwMDAwMDAwIDw8ICgoeCkgJiAweDMpKQkvLyBtYWlsYm94IHggaXMgYWN0aXZlCisKKyNkZWZpbmUgUExYX0NPTlRST0xfUkVHICAgICAgICAweDAwNkMJLyogTCwgRUVQUk9NIENudGwgJiBQQ0kgQ21kIENvZGVzICovCisjZGVmaW5lICBDVExfUkRNQSAgICAgICAgICAweDAwMDAwMDBFCS8qIERNQSBSZWFkIENvbW1hbmQgKi8KKyNkZWZpbmUgIENUTF9XRE1BICAgICAgICAgIDB4MDAwMDAwNzAJLyogRE1BIFdyaXRlIENvbW1hbmQgKi8KKyNkZWZpbmUgIENUTF9STUVNICAgICAgICAgIDB4MDAwMDA2MDAJLyogTWVtb3J5IFJlYWQgQ29tbWFuZCAqLworI2RlZmluZSAgQ1RMX1dNRU0gICAgICAgICAgMHgwMDAwNzAwMAkvKiBNZW1vcnkgV3JpdGUgQ29tbWFuZCAqLworI2RlZmluZSAgQ1RMX1VTRVJPICAgICAgICAgMHgwMDAxMDAwMAkvKiBVU0VSTyBvdXRwdXQgcGluIGNvbnRyb2wgYml0ICovCisjZGVmaW5lICBDVExfVVNFUkkgICAgICAgICAweDAwMDIwMDAwCS8qIFVTRVJJIGlucHV0IHBpbiBiaXQgKi8KKyNkZWZpbmUgIENUTF9FRV9DTEsgICAgICAgIDB4MDEwMDAwMDAJLyogRUVQUk9NIENsb2NrIGxpbmUgKi8KKyNkZWZpbmUgIENUTF9FRV9DUyAgICAgICAgIDB4MDIwMDAwMDAJLyogRUVQUk9NIENoaXAgU2VsZWN0ICovCisjZGVmaW5lICBDVExfRUVfVyAgICAgICAgICAweDA0MDAwMDAwCS8qIEVFUFJPTSBXcml0ZSBiaXQgKi8KKyNkZWZpbmUgIENUTF9FRV9SICAgICAgICAgIDB4MDgwMDAwMDAJLyogRUVQUk9NIFJlYWQgYml0ICovCisjZGVmaW5lICBDVExfRUVDSEsgICAgICAgICAweDEwMDAwMDAwCS8qIEVFUFJPTSBQcmVzZW50IGJpdCAqLworI2RlZmluZSAgQ1RMX0VFUkxEICAgICAgICAgMHgyMDAwMDAwMAkvKiBFRVBST00gUmVsb2FkIFJlZ2lzdGVyICovCisjZGVmaW5lICBDVExfUkVTRVQgICAgICAgICAweDQwMDAwMDAwCS8qICEhIEFkYXB0ZXIgUmVzZXQgISEgKi8KKyNkZWZpbmUgIENUTF9SRUFEWSAgICAgICAgIDB4ODAwMDAwMDAJLyogTG9jYWwgSW5pdCBEb25lICovCisKKyNkZWZpbmUgUExYX0lEX1JFRwkweDcwCS8vIGhhcmQtY29kZWQgcGx4IHZlbmRvciBhbmQgZGV2aWNlIGlkcworCisjZGVmaW5lIFBMWF9SRVZJU0lPTl9SRUcJMHg3NAkvLyBzaWxpY29uIHJldmlzaW9uCisKKyNkZWZpbmUgUExYX0RNQTBfTU9ERV9SRUcJMHg4MAkvLyBkbWEgY2hhbm5lbCAwIG1vZGUgcmVnaXN0ZXIKKyNkZWZpbmUgUExYX0RNQTFfTU9ERV9SRUcJMHg5NAkvLyBkbWEgY2hhbm5lbCAwIG1vZGUgcmVnaXN0ZXIKKyNkZWZpbmUgIFBMWF9MT0NBTF9CVVNfMTZfV0lERV9CSVRTCTB4MQorI2RlZmluZSAgUExYX0xPQ0FMX0JVU18zMl9XSURFX0JJVFMJMHgzCisjZGVmaW5lICBQTFhfTE9DQUxfQlVTX1dJRFRIX01BU0sJMHgzCisjZGVmaW5lICBQTFhfRE1BX0VOX1JFQURZSU5fQklUCTB4NDAJLy8gZW5hYmxlIHJlYWR5IGluIGlucHV0CisjZGVmaW5lICBQTFhfRU5fQlRFUk1fQklUCTB4ODAJLy8gZW5hYmxlIEJURVJNIyBpbnB1dAorI2RlZmluZSAgUExYX0RNQV9MT0NBTF9CVVJTVF9FTl9CSVQJMHgxMDAJLy8gZW5hYmxlIGxvY2FsIGJ1cnN0IG1vZGUKKyNkZWZpbmUgIFBMWF9FTl9DSEFJTl9CSVQJMHgyMDAJLy8gZW5hYmxlcyBjaGFpbmluZworI2RlZmluZSAgUExYX0VOX0RNQV9ET05FX0lOVFJfQklUCTB4NDAwCS8vIGVuYWJsZXMgaW50ZXJydXB0IG9uIGRtYSBkb25lCisjZGVmaW5lICBQTFhfTE9DQUxfQUREUl9DT05TVF9CSVQJMHg4MDAJLy8gaG9sZCBsb2NhbCBhZGRyZXNzIGNvbnN0YW50IChkb24ndCBpbmNyZW1lbnQpCisjZGVmaW5lICBQTFhfREVNQU5EX01PREVfQklUCTB4MTAwMAkvLyBlbmFibGVzIGRlbWFuZC1tb2RlIGZvciBkbWEgdHJhbnNmZXIKKyNkZWZpbmUgIFBMWF9FT1RfRU5BQkxFX0JJVAkweDQwMDAKKyNkZWZpbmUgIFBMWF9TVE9QX01PREVfQklUIDB4ODAwMAorI2RlZmluZSAgUExYX0RNQV9JTlRSX1BDSV9CSVQJMHgyMDAwMAkvLyByb3V0ZXMgZG1hIGludGVycnVwdCB0byBwY2kgYnVzIChpbnN0ZWFkIG9mIGxvY2FsIGJ1cykKKworI2RlZmluZSBQTFhfRE1BMF9QQ0lfQUREUkVTU19SRUcJMHg4NAkvLyBwY2kgYWRkcmVzcyB0aGF0IGRtYSB0cmFuc2ZlcnMgc3RhcnQgYXQKKyNkZWZpbmUgUExYX0RNQTFfUENJX0FERFJFU1NfUkVHCTB4OTgKKworI2RlZmluZSBQTFhfRE1BMF9MT0NBTF9BRERSRVNTX1JFRwkweDg4CS8vIGxvY2FsIGFkZHJlc3MgdGhhdCBkbWEgdHJhbnNmZXJzIHN0YXJ0IGF0CisjZGVmaW5lIFBMWF9ETUExX0xPQ0FMX0FERFJFU1NfUkVHCTB4OWMKKworI2RlZmluZSBQTFhfRE1BMF9UUkFOU0ZFUl9TSVpFX1JFRwkweDhjCS8vIG51bWJlciBvZiBieXRlcyB0byB0cmFuc2ZlciAoZmlyc3QgMjMgYml0cykKKyNkZWZpbmUgUExYX0RNQTFfVFJBTlNGRVJfU0laRV9SRUcJMHhhMAorCisjZGVmaW5lIFBMWF9ETUEwX0RFU0NSSVBUT1JfUkVHCTB4OTAJLy8gZGVzY3JpcHRvciBwb2ludGVyIHJlZ2lzdGVyCisjZGVmaW5lIFBMWF9ETUExX0RFU0NSSVBUT1JfUkVHCTB4YTQKKyNkZWZpbmUgIFBMWF9ERVNDX0lOX1BDSV9CSVQJMHgxCS8vIGRlc2NyaXB0b3IgaXMgbG9jYXRlZCBpbiBwY2kgc3BhY2UgKG5vdCBsb2NhbCBzcGFjZSkKKyNkZWZpbmUgIFBMWF9FTkRfT0ZfQ0hBSU5fQklUCTB4MgkvLyBlbmQgb2YgY2hhaW4gYml0CisjZGVmaW5lICBQTFhfSU5UUl9URVJNX0NPVU5UCTB4NAkvLyBpbnRlcnJ1cHQgd2hlbiB0aGlzIGRlc2NyaXB0b3IncyB0cmFuc2ZlciBpcyBmaW5pc2hlZAorI2RlZmluZSAgUExYX1hGRVJfTE9DQUxfVE9fUENJIDB4OAkvLyB0cmFuc2ZlciBmcm9tIGxvY2FsIHRvIHBjaSBidXMgKG5vdCBwY2kgdG8gbG9jYWwpCisKKyNkZWZpbmUgUExYX0RNQTBfQ1NfUkVHCTB4YTgJLy8gY29tbWFuZCBzdGF0dXMgcmVnaXN0ZXIKKyNkZWZpbmUgUExYX0RNQTFfQ1NfUkVHCTB4YTkKKyNkZWZpbmUgIFBMWF9ETUFfRU5fQklUCTB4MQkvLyBlbmFibGUgZG1hIGNoYW5uZWwKKyNkZWZpbmUgIFBMWF9ETUFfU1RBUlRfQklUCTB4MgkvLyBzdGFydCBkbWEgdHJhbnNmZXIKKyNkZWZpbmUgIFBMWF9ETUFfQUJPUlRfQklUCTB4NAkvLyBhYm9ydCBkbWEgdHJhbnNmZXIKKyNkZWZpbmUgIFBMWF9DTEVBUl9ETUFfSU5UUl9CSVQJMHg4CS8vIGNsZWFyIGRtYSBpbnRlcnJ1cHQKKyNkZWZpbmUgIFBMWF9ETUFfRE9ORV9CSVQJMHgxMAkvLyB0cmFuc2ZlciBkb25lIHN0YXR1cyBiaXQKKworI2RlZmluZSBQTFhfRE1BMF9USFJFU0hPTERfUkVHCTB4YjAJLy8gY29tbWFuZCBzdGF0dXMgcmVnaXN0ZXIKKworLyoKKyAqIEFjY2Vzc2VzIG5lYXIgdGhlIGVuZCBvZiBtZW1vcnkgY2FuIGNhdXNlIHRoZSBQTFggY2hpcAorICogdG8gcHJlLWZldGNoIGRhdGEgb2ZmIG9mIGVuZC1vZi1yYW0uICBMaW1pdCB0aGUgc2l6ZSBvZgorICogbWVtb3J5IHNvIGhvc3Qtc2lkZSBhY2Nlc3NlcyBjYW5ub3Qgb2NjdXIuCisgKi8KKworI2RlZmluZSBQTFhfUFJFRkVUQ0ggICAzMgorCisvKgorICogVGhlIFBDSSBJbnRlcmZhY2UsIHZpYSB0aGUgUENJLTkwNjAgQ2hpcCwgaGFzIHVwIHRvIGVpZ2h0ICg4KSBNYWlsYm94CisgKiBSZWdpc3RlcnMuICBUaGUgUFVUUyAoUG93ZXItVXAgVGVzdCBTdWl0ZSkgaGFuZGxlcyB0aGUgYm9hcmQtc2lkZQorICogaW50ZXJmYWNlL2ludGVyYWN0aW9uIHVzaW5nIHRoZSBmaXJzdCA0IHJlZ2lzdGVycy4gIFNwZWNpZmljYXRpb25zIGZvcgorICogdGhlIHVzZSBvZiB0aGUgZnVsbCBQVVRTJyBjb21tYW5kIGFuZCBzdGF0dXMgaW50ZXJmYWNlIGlzIGNvbnRhaW5lZAorICogd2l0aGluIGEgc2VwYXJhdGUgU0JFIFBVVFMgTWFudWFsLiAgVGhlIEhvc3QtU2lkZSBEZXZpY2UgRHJpdmVyIG9ubHkKKyAqIHVzZXMgYSBzdWJzZXQgb2YgdGhlIGZ1bGwgUFVUUyBpbnRlcmZhY2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKiAgICBNQUlMQk9YICMoLTEpIC0gTUVNIEFDQ0VTUyBTVFMgKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1CWF9TVFNfVkFMSUQgICAgICAweDU3NTg0NzQ0CS8qICdXWEdEJyAqLworI2RlZmluZSBNQlhfU1RTX0RJTEFWICAgICAgMHg0NDQ3NTg1NwkvKiBzd2FwcGVkID0gJ0RHWFcnICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiogICAgTUFJTEJPWCAjMCAgLSAgUFVUUyBTVEFUVVMgICAgICoqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNQlhfU1RTX01BU0sgICAgICAgMHgwMDAwMDBmZgkvKiBQVVRTIFN0YXR1cyBSZWdpc3RlciBiaXRzICovCisjZGVmaW5lIE1CWF9TVFNfVE1BU0sgICAgICAweDAwMDAwMDBmCS8qIHJlZ2lzdGVyIGJpdHMgZm9yIFRFU1QgbnVtYmVyICovCisKKyNkZWZpbmUgTUJYX1NUU19QQ0lSRVNFVCAgIDB4MDAwMDAxMDAJLyogSG9zdCBpc3N1ZWQgUENJIHJlc2V0IHJlcXVlc3QgKi8KKyNkZWZpbmUgTUJYX1NUU19CVVNZICAgICAgIDB4MDAwMDAwODAJLyogUFVUUyBpcyBpbiBwcm9ncmVzcyAqLworI2RlZmluZSBNQlhfU1RTX0VSUk9SICAgICAgMHgwMDAwMDA0MAkvKiBQVVRTIGhhcyBmYWlsZWQgKi8KKyNkZWZpbmUgTUJYX1NUU19SRVNFUlZFRCAgIDB4MDAwMDAwYzAJLyogVW5kZWZpbmVkIC0+IHN0YXR1cyBpbiB0cmFuc2l0aW9uLgorCQkJCQkgICBXZSBhcmUgaW4gcHJvY2VzcyBvZiBjaGFuZ2luZworCQkJCQkgICBiaXRzOyB3ZSBTRVQgRXJyb3IgYml0IGJlZm9yZQorCQkJCQkgICBSRVNFVCBvZiBCdXN5IGJpdCAqLworCisjZGVmaW5lIE1CWF9SRVNFUlZFRF81ICAgICAweDAwMDAwMDIwCS8qIEZZSTogcmVzZXJ2ZWQvdW51c2VkIGJpdCAqLworI2RlZmluZSBNQlhfUkVTRVJWRURfNCAgICAgMHgwMDAwMDAxMAkvKiBGWUk6IHJlc2VydmVkL3VudXNlZCBiaXQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiogICAgTUFJTEJPWCAjMSAgLSAgUFVUUyBDT01NQU5EUyAgICAqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQW55IGF0dGVtcHQgdG8gZXhlY3V0ZSBhbiB1bmltcGxlbWVudCBjb21tYW5kIHJlc3VsdHMgaW4gdGhlIFBVVFMKKyAqIGludGVyZmFjZSBleGVjdXRpbmcgYSBOT09QIGFuZCBjb250aW51aW5nIGFzIGlmIHRoZSBvZmZlbmRpbmcgY29tbWFuZAorICogY29tcGxldGVkIG5vcm1hbGx5LiAgTm90ZTogdGhpcyBzdXBwbGllcyBhIHNpbXBsZSBtZXRob2QgdG8gaW50ZXJyb2dhdGUKKyAqIG1haWxib3ggY29tbWFuZCBwcm9jZXNzaW5nIGZ1bmN0aW9uYWxpdHkuCisgKi8KKworI2RlZmluZSBNQlhfQ01EX01BU0sgICAgICAgMHhmZmZmMDAwMAkvKiBQVVRTIENvbW1hbmQgUmVnaXN0ZXIgYml0cyAqLworCisjZGVmaW5lIE1CWF9DTURfQUJPUlRKICAgICAweDg1MDAwMDAwCS8qIGFib3J0IGFuZCBqdW1wICovCisjZGVmaW5lIE1CWF9DTURfUkVTRVRQICAgICAweDg2MDAwMDAwCS8qIHJlc2V0IGFuZCBwYXVzZSBhdCBzdGFydCAqLworI2RlZmluZSBNQlhfQ01EX1BBVVNFICAgICAgMHg4NzAwMDAwMAkvKiBwYXVzZSBpbW1lZGlhdGVseSAqLworI2RlZmluZSBNQlhfQ01EX1BBVVNFQyAgICAgMHg4ODAwMDAwMAkvKiBwYXVzZSBvbiBjb21wbGV0aW9uICovCisjZGVmaW5lIE1CWF9DTURfUkVTVU1FICAgICAweDg5MDAwMDAwCS8qIHJlc3VtZSBvcGVyYXRpb24gKi8KKyNkZWZpbmUgTUJYX0NNRF9TVEVQICAgICAgIDB4OGEwMDAwMDAJLyogc2luZ2xlIHN0ZXAgdGVzdHMgKi8KKworI2RlZmluZSBNQlhfQ01EX0JTV0FQICAgICAgMHg4YzAwMDAwMAkvKiBpZGVudGlmeSBieXRlIHN3YXAgc2NoZW1lICovCisjZGVmaW5lIE1CWF9DTURfQlNXQVBfMCAgICAweDhjMDAwMDAwCS8qIHVzZSBzY2hlbWUgMCAqLworI2RlZmluZSBNQlhfQ01EX0JTV0FQXzEgICAgMHg4YzAwMDAwMQkvKiB1c2Ugc2NoZW1lIDEgKi8KKworI2RlZmluZSBNQlhfQ01EX1NFVEhNUyAgICAgMHg4ZDAwMDAwMAkvKiBzZXR1cCBob3N0IG1lbW9yeSBhY2Nlc3Mgd2luZG93CisJCQkJCSAgIHNpemUgKi8KKyNkZWZpbmUgTUJYX0NNRF9TRVRIQkEgICAgIDB4OGUwMDAwMDAJLyogc2V0dXAgaG9zdCBtZW1vcnkgYWNjZXNzIGJhc2UKKwkJCQkJICAgYWRkcmVzcyAqLworI2RlZmluZSBNQlhfQ01EX01HTyAgICAgICAgMHg4ZjAwMDAwMAkvKiBwZXJmb3JtIG1lbW9yeSBzZXR1cCBhbmQgY29udGludWUKKwkJCQkJICAgKElFLiBEb25lKSAqLworI2RlZmluZSBNQlhfQ01EX05PT1AgICAgICAgMHhGRjAwMDAwMAkvKiBkdW1teSwgaWxsZWdhbCBjb21tYW5kICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiogICAgTUFJTEJPWCAjMiAgLSAgTUVNT1JZIFNJWkUgICAgICoqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNQlhfTUVNU1pfTUFTSyAgICAgMHhmZmZmMDAwMAkvKiBQVVRTIE1lbW9yeSBTaXplIFJlZ2lzdGVyIGJpdHMgKi8KKworI2RlZmluZSBNQlhfTUVNU1pfMTI4S0IgICAgMHgwMDAyMDAwMAkvKiAxMjgga2lsb2J5dGUgYm9hcmQgKi8KKyNkZWZpbmUgTUJYX01FTVNaXzI1NktCICAgIDB4MDAwNDAwMDAJLyogMjU2IGtpbG9ieXRlIGJvYXJkICovCisjZGVmaW5lIE1CWF9NRU1TWl81MTJLQiAgICAweDAwMDgwMDAwCS8qIDUxMiBraWxvYnl0ZSBib2FyZCAqLworI2RlZmluZSBNQlhfTUVNU1pfMU1CICAgICAgMHgwMDEwMDAwMAkvKiAxIG1lZ2FieXRlIGJvYXJkICovCisjZGVmaW5lIE1CWF9NRU1TWl8yTUIgICAgICAweDAwMjAwMDAwCS8qIDIgbWVnYWJ5dGUgYm9hcmQgKi8KKyNkZWZpbmUgTUJYX01FTVNaXzRNQiAgICAgIDB4MDA0MDAwMDAJLyogNCBtZWdhYnl0ZSBib2FyZCAqLworI2RlZmluZSBNQlhfTUVNU1pfOE1CICAgICAgMHgwMDgwMDAwMAkvKiA4IG1lZ2FieXRlIGJvYXJkICovCisjZGVmaW5lIE1CWF9NRU1TWl8xNk1CICAgICAweDAxMDAwMDAwCS8qIDE2IG1lZ2FieXRlIGJvYXJkICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqICAgIE1BSUxCT1ggIzIgIC0gIEJPQVJEIFRZUEUgICAgKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNQlhfQlRZUEVfTUFTSyAgICAgICAgICAweDAwMDBmZmZmCS8qIFBVVFMgQm9hcmQgVHlwZSBSZWdpc3RlciAqLworI2RlZmluZSBNQlhfQlRZUEVfRkFNSUxZX01BU0sgICAweDAwMDBmZjAwCS8qIFBVVFMgQm9hcmQgRmFtaWx5IFJlZ2lzdGVyICovCisjZGVmaW5lIE1CWF9CVFlQRV9TVUJUWVBFX01BU0sgIDB4MDAwMDAwZmYJLyogUFVUUyBCb2FyZCBTdWJ0eXBlICovCisKKyNkZWZpbmUgTUJYX0JUWVBFX1BMWDkwNjAgICAgICAgMHgwMDAwMDEwMAkvKiBQTFggZmFtaWx5IHR5cGUgKi8KKyNkZWZpbmUgTUJYX0JUWVBFX1BMWDkwODAgICAgICAgMHgwMDAwMDMwMAkvKiBQTFggd2FuWEwxMDBzIGZhbWlseSB0eXBlICovCisKKyNkZWZpbmUgTUJYX0JUWVBFX1dBTlhMXzQgICAgICAgMHgwMDAwMDEwNAkvKiB3YW5YTDQwMCwgNC1wb3J0ICovCisjZGVmaW5lIE1CWF9CVFlQRV9XQU5YTF8yICAgICAgIDB4MDAwMDAxMDIJLyogd2FuWEwyMDAsIDItcG9ydCAqLworI2RlZmluZSBNQlhfQlRZUEVfV0FOWExfMXMgICAgICAweDAwMDAwMzAxCS8qIHdhblhMMTAwcywgMS1wb3J0ICovCisjZGVmaW5lIE1CWF9CVFlQRV9XQU5YTF8xdCAgICAgIDB4MDAwMDA0MDEJLyogd2FuWEwxMDBUMSwgMS1wb3J0ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiogICAgTUFJTEJPWCAjMyAgLSAgU0hNUSBNQUlMQk9YICAgICoqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNQlhfU01CWF9NQVNLICAgICAgICAgICAweDAwMDAwMGZmCS8qIFBVVFMgU0hNUSBNYWlsYm94IGJpdHMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiogICAgR0VORVJJQyBIT1NULVNJREUgRFJJVkVSICAgICAqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1CWF9FUlIgICAgMAorI2RlZmluZSBNQlhfT0sgICAgIDEKKworLyogbWFpbGJveCBjaGVjayByb3V0aW5lIC0gdHlwZSBvZiB0ZXN0aW5nICovCisjZGVmaW5lIE1CWENIS19TVFMgICAgICAweDAwCS8qIGNoZWNrIGZvciBQVVRTIHN0YXR1cyAqLworI2RlZmluZSBNQlhDSEtfTk9XQUlUICAgMHgwMQkvKiBkb250IGNhcmUgYWJvdXQgUFVUUyBzdGF0dXMgKi8KKworLyogc3lzdGVtIGFsbG9jYXRlcyB0aGlzIG1hbnkgYnl0ZXMgZm9yIGFkZHJlc3MgbWFwcGluZyBtYWlsYm94IHNwYWNlICovCisjZGVmaW5lIE1CWF9BRERSX1NQQUNFXzM2MCAweDgwCS8qIHdhblhMMTAwcy8yMDAvNDAwICovCisjZGVmaW5lIE1CWF9BRERSX01BU0tfMzYwIChNQlhfQUREUl9TUEFDRV8zNjAtMSkKKworc3RhdGljIGlubGluZSBpbnQgcGx4OTA4MF9hYm9ydF9kbWEodm9pZCAqaW9iYXNlLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwl2b2lkICpkbWFfY3NfYWRkcjsKKwl1aW50OF90IGRtYV9zdGF0dXM7CisJY29uc3QgaW50IHRpbWVvdXQgPSAxMDAwMDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmIChjaGFubmVsKQorCQlkbWFfY3NfYWRkciA9IGlvYmFzZSArIFBMWF9ETUExX0NTX1JFRzsKKwllbHNlCisJCWRtYV9jc19hZGRyID0gaW9iYXNlICsgUExYX0RNQTBfQ1NfUkVHOworCisJLy8gYWJvcnQgZG1hIHRyYW5zZmVyIGlmIG5lY2Vzc2FyeQorCWRtYV9zdGF0dXMgPSByZWFkYihkbWFfY3NfYWRkcik7CisJaWYgKChkbWFfc3RhdHVzICYgUExYX0RNQV9FTl9CSVQpID09IDApIHsKKwkJcmV0dXJuIDA7CisJfQorCS8vIHdhaXQgdG8gbWFrZSBzdXJlIGRvbmUgYml0IGlzIHplcm8KKwlmb3IgKGkgPSAwOyAoZG1hX3N0YXR1cyAmIFBMWF9ETUFfRE9ORV9CSVQpICYmIGkgPCB0aW1lb3V0OyBpKyspIHsKKwkJY29tZWRpX3VkZWxheSgxKTsKKwkJZG1hX3N0YXR1cyA9IHJlYWRiKGRtYV9jc19hZGRyKTsKKwl9CisJaWYgKGkgPT0gdGltZW91dCkgeworCQlydF9wcmludGsKKwkJCSgicGx4OTA4MDogY2FuY2VsKCkgdGltZWQgb3V0IHdhaXRpbmcgZm9yIGRtYSAlaSBkb25lIGNsZWFyXG4iLAorCQkJY2hhbm5lbCk7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKwkvLyBkaXNhYmxlIGFuZCBhYm9ydCBjaGFubmVsCisJd3JpdGViKFBMWF9ETUFfQUJPUlRfQklULCBkbWFfY3NfYWRkcik7CisJLy8gd2FpdCBmb3IgZG1hIGRvbmUgYml0CisJZG1hX3N0YXR1cyA9IHJlYWRiKGRtYV9jc19hZGRyKTsKKwlmb3IgKGkgPSAwOyAoZG1hX3N0YXR1cyAmIFBMWF9ETUFfRE9ORV9CSVQpID09IDAgJiYgaSA8IHRpbWVvdXQ7IGkrKykgeworCQljb21lZGlfdWRlbGF5KDEpOworCQlkbWFfc3RhdHVzID0gcmVhZGIoZG1hX2NzX2FkZHIpOworCX0KKwlpZiAoaSA9PSB0aW1lb3V0KSB7CisJCXJ0X3ByaW50aworCQkJKCJwbHg5MDgwOiBjYW5jZWwoKSB0aW1lZCBvdXQgd2FpdGluZyBmb3IgZG1hICVpIGRvbmUgc2V0XG4iLAorCQkJY2hhbm5lbCk7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX19DT01FRElfUExYOTA4MF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRkNTIwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRkNTIwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVkNTI0MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9ydGQ1MjAuYwpAQCAtMCwwICsxLDIyODMgQEAKKy8qCisgICAgY29tZWRpL2RyaXZlcnMvcnRkNTIwLmMKKyAgICBDb21lZGkgZHJpdmVyIGZvciBSZWFsIFRpbWUgRGV2aWNlcyAoUlREKSBQQ0k0NTIwL0RNNzUyMAorCisgICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICAgIENvcHlyaWdodCAoQykgMjAwMSBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKy8qCitEcml2ZXI6IHJ0ZDUyMAorRGVzY3JpcHRpb246IFJlYWwgVGltZSBEZXZpY2VzIFBDSTQ1MjAvRE03NTIwCitBdXRob3I6IERhbiBDaHJpc3RpYW4KK0RldmljZXM6IFtSZWFsIFRpbWUgRGV2aWNlc10gRE03NTIwSFItMSAocnRkNTIwKSwgRE03NTIwSFItOCwKKyAgUENJNDUyMCwgUENJNDUyMC04CitTdGF0dXM6IFdvcmtzLiAgT25seSB0ZXN0ZWQgb24gRE03NTIwLTguICBOb3QgU01QIHNhZmUuCisKK0NvbmZpZ3VyYXRpb24gb3B0aW9uczoKKyAgWzBdIC0gUENJIGJ1cyBvZiBkZXZpY2UgKG9wdGlvbmFsKQorICAgICAgICAgIElmIGJ1cy9zbG90IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBmaXJzdCBhdmFpbGFibGUgUENJCisgICAgICAgICAgZGV2aWNlIHdpbGwgYmUgdXNlZC4KKyAgWzFdIC0gUENJIHNsb3Qgb2YgZGV2aWNlIChvcHRpb25hbCkKKyovCisvKgorICAgIENyZWF0ZWQgYnkgRGFuIENocmlzdGlhbiwgTkFTQSBBbWVzIFJlc2VhcmNoIENlbnRlci4KKworICAgIFRoZSBQQ0k0NTIwIGlzIGEgUENJIGNhcmQuICBUaGUgRE03NTIwIGlzIGEgUEMvMTA0LXBsdXMgY2FyZC4KKyAgICBCb3RoIGhhdmU6CisgICAgOC8xNiAxMiBiaXQgQURDIHdpdGggRklGTyBhbmQgY2hhbm5lbCBnYWluIHRhYmxlCisgICAgOCBiaXRzIGhpZ2ggc3BlZWQgZGlnaXRhbCBvdXQgKGZvciBleHRlcm5hbCBNVVgpIChvciA4IGluIG9yIDggb3V0KQorICAgIDggYml0cyBoaWdoIHNwZWVkIGRpZ2l0YWwgaW4gd2l0aCBGSUZPIGFuZCBpbnRlcnJ1cHQgb24gY2hhbmdlIChvciA4IElPKQorICAgIDIgMTIgYml0IERBQ3Mgd2l0aCBGSUZPcworICAgIDIgYml0cyBvdXRwdXQKKyAgICAyIGJpdHMgaW5wdXQKKyAgICBidXMgbWFzdGVyaW5nIERNQQorICAgIHRpbWVyczogQURDIHNhbXBsZSwgcGFjZXIsIGJ1cnN0LCBhYm91dCwgZGVsYXksIERBMSwgREEyCisgICAgc2FtcGxlIGNvdW50ZXIKKyAgICAzIHVzZXIgdGltZXIvY291bnRlcnMgKDgyNTQpCisgICAgZXh0ZXJuYWwgaW50ZXJydXB0CisKKyAgICBUaGUgRE03NTIwIGhhcyBzbGlnaHRseSBmZXdlciBmZWF0dXJlcyAoZmV3ZXIgZ2FpbiBzdGVwcykuCisKKyAgICBUaGVzZSBib2FyZHMgY2FuIHN1cHBvcnQgZXh0ZXJuYWwgbXVsdGlwbGV4b3JzIGFuZCBtdWx0aS1ib2FyZAorICAgIHN5bmNocm9uaXphdGlvbiwgYnV0IHRoaXMgZHJpdmVyIGRvZXNuJ3Qgc3VwcG9ydCB0aGF0LgorCisgICAgQm9hcmQgZG9jczogaHR0cDovL3d3dy5ydGR1c2EuY29tL1BDMTA0L0RNL2FuYWxvZyUyMElPL2RtNzUyMC5odG0KKyAgICBEYXRhIHNoZWV0OiBodHRwOi8vd3d3LnJ0ZHVzYS5jb20vcGRmL2RtNzUyMC5wZGYKKyAgICBFeGFtcGxlIHNvdXJjZTogaHR0cDovL3d3dy5ydGR1c2EuY29tL2V4YW1wbGVzL2RtL2RtNzUyMC56aXAKKyAgICBDYWxsIHRoZW0gYW5kIGFzayBmb3IgdGhlIHJlZ2lzdGVyIGxldmVsIG1hbnVhbC4KKyAgICBQQ0kgY2hpcDogaHR0cDovL3d3dy5wbHh0ZWNoLmNvbS9wcm9kdWN0cy90b29sYm94LzkwODAuaHRtCisKKyAgICBOb3RlczoKKyAgICBUaGlzIGJvYXJkIGlzIG1lbW9yeSBtYXBwZWQuICBUaGVyZSBpcyBzb21lIElPIHN0dWZmLCBidXQgaXQgaXNuJ3QgbmVlZGVkLgorCisgICAgSSB1c2UgYSBwcmV0dHkgbG9vc2UgbmFtaW5nIHN0eWxlIHdpdGhpbiB0aGUgZHJpdmVyIChydGRfYmxhaCkuCisgICAgQWxsIGV4dGVybmFsbHkgdmlzaWJsZSBuYW1lcyBzaG91bGQgYmUgcnRkNTIwX2JsYWguCisgICAgSSB1c2UgY2FtZWxDYXNlIGZvciBzdHJ1Y3R1cmVzIChhbmQgaW5zaWRlIHRoZW0pLgorICAgIEkgbWF5IGFsc28gdXNlIHVwcGVyIENhbWVsQ2FzZSBmb3IgZnVuY3Rpb24gbmFtZXMgKG9sZCBoYWJpdCkuCisKKyAgICBUaGlzIGJvYXJkIGlzIHNvbWV3aGF0IHJlbGF0ZWQgdG8gdGhlIFJURCBQQ0k0NDAwIGJvYXJkLgorCisgICAgSSBib3Jyb3dlZCBoZWF2aWx5IGZyb20gdGhlIG5pX21pb19jb21tb24sIG5pX2F0bWlvMTZkLCBtaXRlLCBhbmQKKyAgICBkYXMxODAwLCBzaW5jZSB0aGV5IGhhdmUgdGhlIGJlc3QgZG9jdW1lbnRlZCBjb2RlLiAgRHJpdmVyCisgICAgY2JfcGNpZGFzNjQuYyB1c2VzIHRoZSBzYW1lIERNQSBjb250cm9sbGVyLgorCisgICAgQXMgZmFyIGFzIEkgY2FuIHRlbGwsIHRoZSBBYm91dCBpbnRlcnJ1cHQgZG9lc250IHdvcmsgaWYgU2FtcGxlIGlzCisgICAgYWxzbyBlbmFibGVkLiAgSXQgdHVybnMgb3V0IHRoYXQgQWJvdXQgcmVhbGx5IGlzbid0IG5lZWRlZCwgc2luY2UKKyAgICB3ZSBhbHdheXMgY291bnQgZG93biBzYW1wbGVzIHJlYWQuCisKKyAgICBUaGVyZSB3YXMgc29tZSB0aW1lci9jb3VudGVyIGNvZGUsIGJ1dCBpdCBkaWRuJ3QgZm9sbG93IHRoZSByaWdodCBBUEkuCisKKyovCisKKy8qCisgIGRyaXZlciBzdGF0dXM6CisKKyAgQW5hbG9nLUluIHN1cHBvcnRzIGluc3RydWN0aW9uIGFuZCBjb21tYW5kIG1vZGUuCisKKyAgV2l0aCBETUEsIHlvdSBjYW4gc2FtcGxlIGF0IDEuMTVNaHogd2l0aCA3MCUgaWRsZSBvbiBhIDQwME1oeiBLNi0yCisgIChzaW5nbGUgY2hhbm5lbCwgNjRLIHJlYWQgYnVmZmVyKS4gIEkgZ2V0IHJhbmRvbSBzeXN0ZW0gbG9ja3VwcyB3aGVuCisgIHVzaW5nIERNQSB3aXRoIEFMSS0xNXh4IGJhc2VkIHN5c3RlbXMuICBJIGhhdmVuJ3QgYmVlbiBhYmxlIHRvIHRlc3QKKyAgYW55IG90aGVyIGNoaXBzZXRzLiAgVGhlIGxvY2t1cHMgaGFwcGVuIHNvb24gYWZ0ZXIgdGhlIHN0YXJ0IG9mIGFuCisgIGFjcXVpc3Rpb24sIG5vdCBpbiB0aGUgbWlkZGxlIG9mIGEgbG9uZyBydW4uCisKKyAgV2l0aG91dCBETUEsIHlvdSBjYW4gZG8gNjIwS2h6IHNhbXBsaW5nIHdpdGggMjAlIGlkbGUgb24gYSA0MDBNaHogSzYtMgorICAod2l0aCBhIDI1NksgcmVhZCBidWZmZXIpLgorCisgIERpZ2l0YWwtSU8gYW5kIEFuYWxvZy1PdXQgb25seSBzdXBwb3J0IGluc3RydWN0aW9uIG1vZGUuCisKKyovCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisjaW5jbHVkZSAiY29tZWRpX3BjaS5oIgorCisjZGVmaW5lIERSVl9OQU1FICJydGQ1MjAiCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEcml2ZXIgc3BlY2lmaWMgc3R1ZmYgKHR1bmFibGUpCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIEVuYWJsZSB0aGlzIHRvIHRlc3QgdGhlIG5ldyBETUEgc3VwcG9ydC4gWW91IG1heSBnZXQgaGFyZCBsb2NrIHVwcyAqLworLyojZGVmaW5lIFVTRV9ETUEqLworCisvKiBXZSByZWFsbHkgb25seSBuZWVkIDIgYnVmZmVycy4gIE1vcmUgdGhhbiB0aGF0IG1lYW5zIGJlaW5nIG11Y2gKKyAgIHNtYXJ0ZXIgYWJvdXQga25vd2luZyB3aGljaCBvbmVzIGFyZSBmdWxsLiAqLworI2RlZmluZSBETUFfQ0hBSU5fQ09VTlQgMgkvKiBtYXggRE1BIHNlZ21lbnRzL2J1ZmZlcnMgaW4gYSByaW5nIChtaW4gMikgKi8KKworLyogVGFyZ2V0IHBlcmlvZCBmb3IgcGVyaW9kaWMgdHJhbnNmZXJzLiAgVGhpcyBzZXRzIHRoZSB1c2VyIHJlYWQgbGF0ZW5jeS4gKi8KKy8qIE5vdGU6IFRoZXJlIGFyZSBjZXJ0YWluIHJhdGVzIHdoZXJlIHdlIGdpdmUgdGhpcyB1cCBhbmQgdHJhbnNmZXIgMS8yIEZJRk8gKi8KKy8qIElmIHRoaXMgaXMgdG9vIGxvdywgZWZmaWNpZW5jeSBpcyBwb29yICovCisjZGVmaW5lIFRSQU5TX1RBUkdFVF9QRVJJT0QgMTAwMDAwMDAJLyogMTAgbXMgKGluIG5hbm9zZWNvbmRzKSAqLworCisvKiBTZXQgYSBwcmFjdGljYWwgbGltaXQgb24gaG93IGxvbmcgYSBsaXN0IHRvIHN1cHBvcnQgKGFmZmVjdHMgbWVtb3J5IHVzZSkgKi8KKy8qIFRoZSBib2FyZCBzdXBwb3J0IGEgY2hhbm5lbCBsaXN0IHVwIHRvIHRoZSBGSUZPIGxlbmd0aCAoMUsgb3IgOEspICovCisjZGVmaW5lIFJURF9NQVhfQ0hBTkxJU1QJMTI4CS8qIG1heCBjaGFubmVsIGxpc3QgdGhhdCB3ZSBhbGxvdyAqLworCisvKiB0dW5pbmcgZm9yIGFpL2FvIGluc3RydWN0aW9uIGRvbmUgcG9sbGluZyAqLworI2lmZGVmIEZBU1RfU1BJTgorI2RlZmluZSBXQUlUX1FVSUVUTFkJCS8qIGFzIG5vdGhpbmcsIHNwaW4gb24gZG9uZSBiaXQgKi8KKyNkZWZpbmUgUlREX0FEQ19USU1FT1VUCTY2MDAwCS8qIDIgbXNlYyBhdCAzM21oeiBidXMgcmF0ZSAqLworI2RlZmluZSBSVERfREFDX1RJTUVPVVQJNjYwMDAKKyNkZWZpbmUgUlREX0RNQV9USU1FT1VUCTMzMDAwCS8qIDEgbXNlYyAqLworI2Vsc2UKKy8qIGJ5IGRlbGF5aW5nLCBwb3dlciBhbmQgZWxlY3RyaWNhbCBub2lzZSBhcmUgcmVkdWNlZCBzb21ld2hhdCAqLworI2RlZmluZSBXQUlUX1FVSUVUTFkJY29tZWRpX3VkZWxheSAoMSkKKyNkZWZpbmUgUlREX0FEQ19USU1FT1VUCTIwMDAJLyogaW4gdXNlYyAqLworI2RlZmluZSBSVERfREFDX1RJTUVPVVQJMjAwMAkvKiBpbiB1c2VjICovCisjZGVmaW5lIFJURF9ETUFfVElNRU9VVAkxMDAwCS8qIGluIHVzZWMgKi8KKyNlbmRpZgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgQm9hcmQgc3BlY2lmaWMgc3R1ZmYKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiByZWdpc3RlcnMgICovCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfUlRECTB4MTQzNQorLyoKKyAgVGhlIGJvYXJkIGhhcyB0aHJlZSBtZW1vcnkgd2luZG93czogbGFzMCwgbGFzMSwgYW5kIGxjZmcgKHRoZSBQQ0kgY2hpcCkKKyAgTGFzMSBoYXMgdGhlIGRhdGEgYW5kIGNhbiBiZSBidXJzdCBETUFlZCAzMmJpdHMgYXQgYSB0aW1lLgorKi8KKyNkZWZpbmUgTENGR19QQ0lJTkRFWAkwCisvKiBQQ0kgcmVnaW9uIDEgaXMgYSAyNTYgYnl0ZSBJTyBzcGFjZSBtYXBwaW5nLiAgVXNlPz8/ICovCisjZGVmaW5lIExBUzBfUENJSU5ERVgJMgkvKiBQQ0kgbWVtb3J5IHJlc291cmNlcyAqLworI2RlZmluZSBMQVMxX1BDSUlOREVYCTMKKyNkZWZpbmUgTENGR19QQ0lTSVpFCTB4MTAwCisjZGVmaW5lIExBUzBfUENJU0laRQkweDIwMAorI2RlZmluZSBMQVMxX1BDSVNJWkUJMHgxMAorCisjZGVmaW5lIFJURF9DTE9DS19SQVRFCTgwMDAwMDAJLyogOE1oeiBvbmJvYXJkIGNsb2NrICovCisjZGVmaW5lIFJURF9DTE9DS19CQVNFCTEyNQkvKiBjbG9jayBwZXJpb2QgaW4gbnMgKi8KKworLyogTm90ZTogdGhlc2Ugc3BlZWQgYXJlIHNsb3dlciB0aGFuIHRoZSBzcGVjLCBidXQgZml0IHRoZSBjb3VudGVyIHJlc29sdXRpb24qLworI2RlZmluZSBSVERfTUFYX1NQRUVECTE2MjUJLyogd2hlbiBzYW1wbGluZywgaW4gbmFub3NlY29uZHMgKi8KKy8qIG1heCBzcGVlZCBpZiB3ZSBkb24ndCBoYXZlIHRvIHdhaXQgZm9yIHNldHRsaW5nICovCisjZGVmaW5lIFJURF9NQVhfU1BFRURfMQk4NzUJLyogaWYgc2luZ2xlIGNoYW5uZWwsIGluIG5hbm9zZWNvbmRzICovCisKKyNkZWZpbmUgUlREX01JTl9TUEVFRAkyMDk3MTUxODc1CS8qICgyNGJpdCBjb3VudGVyKSBpbiBuYW5vc2Vjb25kcyAqLworLyogbWluIHNwZWVkIHdoZW4gb25seSAxIGNoYW5uZWwgKG5vIGJ1cnN0IGNvdW50ZXIpICovCisjZGVmaW5lIFJURF9NSU5fU1BFRURfMQk1MDAwMDAwCS8qIDIwMEh6LCBpbiBuYW5vc2Vjb25kcyAqLworCisjaW5jbHVkZSAicnRkNTIwLmgiCisjaW5jbHVkZSAicGx4OTA4MC5oIgorCisvKiBTZXR1cCBjb250aW51b3VzIHJpbmcgb2YgMS8yIEZJRk8gdHJhbnNmZXJzLiAgU2VlIFJURCBtYW51YWwgcDkxICovCisjZGVmaW5lIERNQV9NT0RFX0JJVFMgKFwKKwkJICAgICAgIFBMWF9MT0NBTF9CVVNfMTZfV0lERV9CSVRTIFwKKwkJICAgICAgIHwgUExYX0RNQV9FTl9SRUFEWUlOX0JJVCBcCisJCSAgICAgICB8IFBMWF9ETUFfTE9DQUxfQlVSU1RfRU5fQklUIFwKKwkJICAgICAgIHwgUExYX0VOX0NIQUlOX0JJVCBcCisJCSAgICAgICB8IFBMWF9ETUFfSU5UUl9QQ0lfQklUIFwKKwkJICAgICAgIHwgUExYX0xPQ0FMX0FERFJfQ09OU1RfQklUIFwKKwkJICAgICAgIHwgUExYX0RFTUFORF9NT0RFX0JJVCkKKworI2RlZmluZSBETUFfVFJBTlNGRVJfQklUUyAoXAorLyogZGVzY3JpcHRvcnMgaW4gUENJIG1lbW9yeSovIAlQTFhfREVTQ19JTl9QQ0lfQklUIFwKKy8qIGludGVycnVwdCBhdCBlbmQgb2YgYmxvY2sgKi8gfCBQTFhfSU5UUl9URVJNX0NPVU5UIFwKKy8qIGZyb20gYm9hcmQgdG8gUENJICovCQl8IFBMWF9YRkVSX0xPQ0FMX1RPX1BDSSkKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIENvbWVkaSBzcGVjaWZpYyBzdHVmZgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisgIFRoZSBib2FyZCBoYXMgMyBpbnB1dCBtb2RlcyBhbmQgdGhlIGdhaW5zIG9mIDEsMiw0LC4uLjMyICgsIDY0LCAxMjgpCisqLworc3RhdGljIGNvbnN0IGNvbWVkaV9scmFuZ2UgcnRkX2FpXzc1MjBfcmFuZ2UgPSB7IDE4LCB7CisJCQkvKiArLTVWIGlucHV0IHJhbmdlIGdhaW4gc3RlcHMgKi8KKwkJCUJJUF9SQU5HRSg1LjApLAorCQkJQklQX1JBTkdFKDUuMCAvIDIpLAorCQkJQklQX1JBTkdFKDUuMCAvIDQpLAorCQkJQklQX1JBTkdFKDUuMCAvIDgpLAorCQkJQklQX1JBTkdFKDUuMCAvIDE2KSwKKwkJCUJJUF9SQU5HRSg1LjAgLyAzMiksCisJCQkvKiArLTEwViBpbnB1dCByYW5nZSBnYWluIHN0ZXBzICovCisJCQlCSVBfUkFOR0UoMTAuMCksCisJCQlCSVBfUkFOR0UoMTAuMCAvIDIpLAorCQkJQklQX1JBTkdFKDEwLjAgLyA0KSwKKwkJCUJJUF9SQU5HRSgxMC4wIC8gOCksCisJCQlCSVBfUkFOR0UoMTAuMCAvIDE2KSwKKwkJCUJJUF9SQU5HRSgxMC4wIC8gMzIpLAorCQkJLyogKzEwViBpbnB1dCByYW5nZSBnYWluIHN0ZXBzICovCisJCQlVTklfUkFOR0UoMTAuMCksCisJCQlVTklfUkFOR0UoMTAuMCAvIDIpLAorCQkJVU5JX1JBTkdFKDEwLjAgLyA0KSwKKwkJCVVOSV9SQU5HRSgxMC4wIC8gOCksCisJCQlVTklfUkFOR0UoMTAuMCAvIDE2KSwKKwkJCVVOSV9SQU5HRSgxMC4wIC8gMzIpLAorCisJfQorfTsKKworLyogUENJNDUyMCBoYXMgdHdvIG1vcmUgZ2FpbnMgKDYgbW9yZSBlbnRyaWVzKSAqLworc3RhdGljIGNvbnN0IGNvbWVkaV9scmFuZ2UgcnRkX2FpXzQ1MjBfcmFuZ2UgPSB7IDI0LCB7CisJCQkvKiArLTVWIGlucHV0IHJhbmdlIGdhaW4gc3RlcHMgKi8KKwkJCUJJUF9SQU5HRSg1LjApLAorCQkJQklQX1JBTkdFKDUuMCAvIDIpLAorCQkJQklQX1JBTkdFKDUuMCAvIDQpLAorCQkJQklQX1JBTkdFKDUuMCAvIDgpLAorCQkJQklQX1JBTkdFKDUuMCAvIDE2KSwKKwkJCUJJUF9SQU5HRSg1LjAgLyAzMiksCisJCQlCSVBfUkFOR0UoNS4wIC8gNjQpLAorCQkJQklQX1JBTkdFKDUuMCAvIDEyOCksCisJCQkvKiArLTEwViBpbnB1dCByYW5nZSBnYWluIHN0ZXBzICovCisJCQlCSVBfUkFOR0UoMTAuMCksCisJCQlCSVBfUkFOR0UoMTAuMCAvIDIpLAorCQkJQklQX1JBTkdFKDEwLjAgLyA0KSwKKwkJCUJJUF9SQU5HRSgxMC4wIC8gOCksCisJCQlCSVBfUkFOR0UoMTAuMCAvIDE2KSwKKwkJCUJJUF9SQU5HRSgxMC4wIC8gMzIpLAorCQkJQklQX1JBTkdFKDEwLjAgLyA2NCksCisJCQlCSVBfUkFOR0UoMTAuMCAvIDEyOCksCisJCQkvKiArMTBWIGlucHV0IHJhbmdlIGdhaW4gc3RlcHMgKi8KKwkJCVVOSV9SQU5HRSgxMC4wKSwKKwkJCVVOSV9SQU5HRSgxMC4wIC8gMiksCisJCQlVTklfUkFOR0UoMTAuMCAvIDQpLAorCQkJVU5JX1JBTkdFKDEwLjAgLyA4KSwKKwkJCVVOSV9SQU5HRSgxMC4wIC8gMTYpLAorCQkJVU5JX1JBTkdFKDEwLjAgLyAzMiksCisJCQlVTklfUkFOR0UoMTAuMCAvIDY0KSwKKwkJCVVOSV9SQU5HRSgxMC4wIC8gMTI4KSwKKwl9Cit9OworCisvKiBUYWJsZSBvcmRlciBtYXRjaGVzIHJhbmdlIHZhbHVlcyAqLworc3RhdGljIGNvbnN0IGNvbWVkaV9scmFuZ2UgcnRkX2FvX3JhbmdlID0geyA0LCB7CisJCQlSQU5HRSgwLCA1KSwKKwkJCVJBTkdFKDAsIDEwKSwKKwkJCVJBTkdFKC01LCA1KSwKKwkJCVJBTkdFKC0xMCwgMTApLAorCX0KK307CisKKy8qCisgIEJvYXJkIGRlc2NyaXB0aW9ucworICovCit0eXBlZGVmIHN0cnVjdCBydGRCb2FyZF9zdHJ1Y3QgeworCWNvbnN0IGNoYXIgKm5hbWU7CS8qIG11c3QgYmUgZmlyc3QgKi8KKwlpbnQgZGV2aWNlX2lkOworCWludCBhaUNoYW5zOworCWludCBhaUJpdHM7CisJaW50IGFpTWF4R2FpbjsKKwlpbnQgcmFuZ2UxMFN0YXJ0OwkvKiBzdGFydCBvZiArLTEwViByYW5nZSAqLworCWludCByYW5nZVVuaVN0YXJ0OwkvKiBzdGFydCBvZiArMTBWIHJhbmdlICovCit9IHJ0ZEJvYXJkOworCitzdGF0aWMgY29uc3QgcnRkQm9hcmQgcnRkNTIwQm9hcmRzW10gPSB7CisJeworCSAgICAgIG5hbWU6CSJETTc1MjAiLAorCSAgICAgIGRldmljZV9pZDoweDc1MjAsCisJICAgICAgYWlDaGFuczoJMTYsCisJICAgICAgYWlCaXRzOgkxMiwKKwkgICAgICBhaU1heEdhaW46MzIsCisJICAgICAgcmFuZ2UxMFN0YXJ0OjYsCisJICAgICAgcmFuZ2VVbmlTdGFydDoxMiwKKwkJfSwKKwl7CisJICAgICAgbmFtZToJIlBDSTQ1MjAiLAorCSAgICAgIGRldmljZV9pZDoweDQ1MjAsCisJICAgICAgYWlDaGFuczoJMTYsCisJICAgICAgYWlCaXRzOgkxMiwKKwkgICAgICBhaU1heEdhaW46MTI4LAorCSAgICAgIHJhbmdlMTBTdGFydDo4LAorCSAgICAgIHJhbmdlVW5pU3RhcnQ6MTYsCisJCX0sCit9OworCitzdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUocnRkNTIwX3BjaV90YWJsZSkgPSB7CisJe1BDSV9WRU5ET1JfSURfUlRELCAweDc1MjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX1JURCwgMHg0NTIwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7MH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBydGQ1MjBfcGNpX3RhYmxlKTsKKworLyoKKyAqIFVzZWZ1bCBmb3Igc2hvcnRoYW5kIGFjY2VzcyB0byB0aGUgcGFydGljdWxhciBib2FyZCBzdHJ1Y3R1cmUKKyAqLworI2RlZmluZSB0aGlzYm9hcmQgKChjb25zdCBydGRCb2FyZCAqKWRldi0+Ym9hcmRfcHRyKQorCisvKgorICAgVGhpcyBzdHJ1Y3R1cmUgaXMgZm9yIGRhdGEgdW5pcXVlIHRvIHRoaXMgaGFyZHdhcmUgZHJpdmVyLgorICAgVGhpcyBpcyBhbHNvIHVuaXF1ZSBmb3IgZWFjaCBib2FyZCBpbiB0aGUgc3lzdGVtLgorKi8KK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBtZW1vcnkgbWFwcGVkIGJvYXJkIHN0cnVjdHVyZXMgKi8KKwl2b2lkICpsYXMwOworCXZvaWQgKmxhczE7CisJdm9pZCAqbGNmZzsKKworCXVuc2lnbmVkIGxvbmcgaW50Q291bnQ7CS8qIGludGVycnVwdCBjb3VudCAqLworCWxvbmcgYWlDb3VudDsJCS8qIHRvdGFsIHRyYW5zZmVyIHNpemUgKHNhbXBsZXMpICovCisJaW50IHRyYW5zQ291bnQ7CQkvKiAjIHRvIHRyYW5mZXIgZGF0YS4gMC0+MS8yRklGTyAqLworCWludCBmbGFnczsJCS8qIGZsYWcgZXZlbnQgbW9kZXMgKi8KKworCS8qIFBDSSBkZXZpY2UgaW5mbyAqLworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OworCWludCBnb3RfcmVnaW9uczsJLyogbm9uLXplcm8gaWYgUENJIHJlZ2lvbnMgb3duZWQgKi8KKworCS8qIGNoYW5uZWwgbGlzdCBpbmZvICovCisJLyogY2hhbkJpcG9sYXIgdHJhY2tzIHdoZXRoZXIgYSBjaGFubmVsIGlzIGJpcG9sYXIgKGFuZCBuZWVkcyArMjA0OCkgKi8KKwl1bnNpZ25lZCBjaGFyIGNoYW5CaXBvbGFyW1JURF9NQVhfQ0hBTkxJU1QgLyA4XTsJLyogYml0IGFycmF5ICovCisKKwkvKiByZWFkIGJhY2sgZGF0YSAqLworCWxzYW1wbF90IGFvVmFsdWVbMl07CS8qIFVzZWQgZm9yIEFPIHJlYWQgYmFjayAqLworCisJLyogdGltZXIgZ2F0ZSAod2hlbiBlbmFibGVkKSAqLworCXU4IHV0Y0dhdGVbNF07CQkvKiAxIGV4dHJhIGFsbG93cyBzaW1wbGUgcmFuZ2UgY2hlY2sgKi8KKworCS8qIHNoYWRvdyByZWdpc3RlcnMgYWZmZWN0IG90aGVyIHJlZ2lzdGVycywgYnV0IGNhbnQgYmUgcmVhZCBiYWNrICovCisJLyogVGhlIG1hY3JvcyBiZWxvdyB1cGRhdGUgdGhlc2Ugb24gd3JpdGVzICovCisJdTE2IGludE1hc2s7CQkvKiBpbnRlcnJ1cHQgbWFzayAqLworCXUxNiBpbnRDbGVhck1hc2s7CS8qIGludGVycnVwdCBjbGVhciBtYXNrICovCisJdTggdXRjQ3RybFs0XTsJCS8qIGNydGwgbW9kZSBmb3IgMyB1dGMgKyByZWFkIGJhY2sgKi8KKwl1OCBkaW9TdGF0dXM7CQkvKiBjb3VsZCBiZSByZWFkIGJhY2sgKGRpbzBDdHJsKSAqLworI2lmZGVmIFVTRV9ETUEKKwkvKiBBbHdheXMgRE1BIDEvMiBGSUZPLiAgQnVmZmVyIChkbWFCdWZmPykgaXMgKGF0IGxlYXN0KSB0d2ljZSB0aGF0IHNpemUuCisJICAgQWZ0ZXIgdHJhbnNmZXJyaW5nLCBpbnRlcnJ1cHQgcHJvY2Vzc2VzIDEvMiBGSUZPIGFuZCBwYXNzZXMgdG8gY29tZWRpICovCisJczE2IGRtYTBPZmZzZXQ7CQkvKiBjdXJyZW50IHByb2Nlc3Npbmcgb2Zmc2V0ICgwLCAxLzIpICovCisJdWludDE2X3QgKmRtYTBCdWZmW0RNQV9DSEFJTl9DT1VOVF07CS8qIERNQSBidWZmZXJzIChmb3IgQURDKSAqLworCWRtYV9hZGRyX3QgZG1hMEJ1ZmZQaHlzQWRkcltETUFfQ0hBSU5fQ09VTlRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzZXMgKi8KKwlzdHJ1Y3QgcGx4X2RtYV9kZXNjICpkbWEwQ2hhaW47CS8qIERNQSBkZXNjcmlwdG9yIHJpbmcgZm9yIGRtYUJ1ZmYgKi8KKwlkbWFfYWRkcl90IGRtYTBDaGFpblBoeXNBZGRyOwkvKiBwaHlzaWNhbCBhZGRyZXNzZXMgKi8KKwkvKiBzaGFkb3cgcmVnaXN0ZXJzICovCisJdTggZG1hMENvbnRyb2w7CisJdTggZG1hMUNvbnRyb2w7CisjZW5kaWYJCQkJLyogVVNFX0RNQSAqLworCXVuc2lnbmVkIGZpZm9MZW47Cit9IHJ0ZFByaXZhdGU7CisKKy8qIGJpdCBkZWZpbmVzIGZvciAiZmxhZ3MiICovCisjZGVmaW5lIFNFTkRfRU9TCTB4MDEJLyogc2VuZCBFbmQgT2YgU2NhbiBldmVudHMgKi8KKyNkZWZpbmUgRE1BMF9BQ1RJVkUJMHgwMgkvKiBETUEwIGlzIGFjdGl2ZSAqLworI2RlZmluZSBETUExX0FDVElWRQkweDA0CS8qIERNQTEgaXMgYWN0aXZlICovCisKKy8qIE1hY3JvcyBmb3IgYWNjZXNzaW5nIGNoYW5uZWwgbGlzdCBiaXQgYXJyYXkgKi8KKyNkZWZpbmUgQ0hBTl9BUlJBWV9URVNUKGFycmF5LGluZGV4KSBcCisJKCgoYXJyYXkpWyhpbmRleCkvOF0gPj4gKChpbmRleCkgJiAweDcpKSAmIDB4MSkKKyNkZWZpbmUgQ0hBTl9BUlJBWV9TRVQoYXJyYXksaW5kZXgpIFwKKwkoKChhcnJheSlbKGluZGV4KS84XSB8PSAxIDw8ICgoaW5kZXgpICYgMHg3KSkpCisjZGVmaW5lIENIQU5fQVJSQVlfQ0xFQVIoYXJyYXksaW5kZXgpIFwKKwkoKChhcnJheSlbKGluZGV4KS84XSAmPSB+KDEgPDwgKChpbmRleCkgJiAweDcpKSkpCisKKy8qCisgKiBtb3N0IGRyaXZlcnMgZGVmaW5lIHRoZSBmb2xsb3dpbmcgbWFjcm8gdG8gbWFrZSBpdCBlYXN5IHRvCisgKiBhY2Nlc3MgdGhlIHByaXZhdGUgc3RydWN0dXJlLgorICovCisjZGVmaW5lIGRldnByaXYgKChydGRQcml2YXRlICopZGV2LT5wcml2YXRlKQorCisvKiBNYWNyb3MgdG8gYWNjZXNzIHJlZ2lzdGVycyAqLworCisvKiBSZXNldCBib2FyZCAqLworI2RlZmluZSBSdGRSZXNldEJvYXJkKGRldikgXAorICAgIHdyaXRlbCAoMCwgZGV2cHJpdi0+bGFzMCtMQVMwX0JPQVJEX1JFU0VUKQorCisvKiBSZXNldCBjaGFubmVsIGdhaW4gdGFibGUgcmVhZCBwb2ludGVyICovCisjZGVmaW5lIFJ0ZFJlc2V0Q0dUKGRldikgXAorICAgIHdyaXRlbCAoMCwgZGV2cHJpdi0+bGFzMCtMQVMwX0NHVF9SRVNFVCkKKworLyogUmVzZXQgY2hhbm5lbCBnYWluIHRhYmxlIHJlYWQgYW5kIHdyaXRlIHBvaW50ZXJzICovCisjZGVmaW5lIFJ0ZENsZWFyQ0dUKGRldikgXAorICAgIHdyaXRlbCAoMCwgZGV2cHJpdi0+bGFzMCtMQVMwX0NHVF9DTEVBUikKKworLyogUmVzZXQgY2hhbm5lbCBnYWluIHRhYmxlIHJlYWQgYW5kIHdyaXRlIHBvaW50ZXJzICovCisjZGVmaW5lIFJ0ZEVuYWJsZUNHVChkZXYsdikgXAorICAgIHdyaXRlbCAoKHYgPiAwKSA/IDEgOiAwLCBkZXZwcml2LT5sYXMwK0xBUzBfQ0dUX0VOQUJMRSkKKworLyogV3JpdGUgY2hhbm5lbCBnYWluIHRhYmxlIGVudHJ5ICovCisjZGVmaW5lIFJ0ZFdyaXRlQ0dUYWJsZShkZXYsdikgXAorICAgIHdyaXRlbCAodiwgZGV2cHJpdi0+bGFzMCtMQVMwX0NHVF9XUklURSkKKworLyogV3JpdGUgQ2hhbm5lbCBHYWluIExhdGNoICovCisjZGVmaW5lIFJ0ZFdyaXRlQ0dMYXRjaChkZXYsdikgXAorICAgIHdyaXRlbCAodiwgZGV2cHJpdi0+bGFzMCtMQVMwX0NHTF9XUklURSkKKworLyogUmVzZXQgQURDIEZJRk8gKi8KKyNkZWZpbmUgUnRkQWRjQ2xlYXJGaWZvKGRldikgXAorICAgIHdyaXRlbCAoMCwgZGV2cHJpdi0+bGFzMCtMQVMwX0FEQ19GSUZPX0NMRUFSKQorCisvKiBTZXQgQURDIHN0YXJ0IGNvbnZlcnNpb24gc291cmNlIHNlbGVjdCAod3JpdGUgb25seSkgKi8KKyNkZWZpbmUgUnRkQWRjQ29udmVyc2lvblNvdXJjZShkZXYsdikgXAorICAgIHdyaXRlbCAodiwgZGV2cHJpdi0+bGFzMCtMQVMwX0FEQ19DT05WRVJTSU9OKQorCisvKiBTZXQgYnVyc3Qgc3RhcnQgc291cmNlIHNlbGVjdCAod3JpdGUgb25seSkgKi8KKyNkZWZpbmUgUnRkQnVyc3RTdGFydFNvdXJjZShkZXYsdikgXAorICAgIHdyaXRlbCAodiwgZGV2cHJpdi0+bGFzMCtMQVMwX0JVUlNUX1NUQVJUKQorCisvKiBTZXQgUGFjZXIgc3RhcnQgc291cmNlIHNlbGVjdCAod3JpdGUgb25seSkgKi8KKyNkZWZpbmUgUnRkUGFjZXJTdGFydFNvdXJjZShkZXYsdikgXAorICAgIHdyaXRlbCAodiwgZGV2cHJpdi0+bGFzMCtMQVMwX1BBQ0VSX1NUQVJUKQorCisvKiBTZXQgUGFjZXIgc3RvcCBzb3VyY2Ugc2VsZWN0ICh3cml0ZSBvbmx5KSAqLworI2RlZmluZSBSdGRQYWNlclN0b3BTb3VyY2UoZGV2LHYpIFwKKyAgICB3cml0ZWwgKHYsIGRldnByaXYtPmxhczArTEFTMF9QQUNFUl9TVE9QKQorCisvKiBTZXQgUGFjZXIgY2xvY2sgc291cmNlIHNlbGVjdCAod3JpdGUgb25seSkgMD1leHRlcm5hbCAxPWludGVybmFsICovCisjZGVmaW5lIFJ0ZFBhY2VyQ2xvY2tTb3VyY2UoZGV2LHYpIFwKKyAgICB3cml0ZWwgKCh2ID4gMCkgPyAxIDogMCwgZGV2cHJpdi0+bGFzMCtMQVMwX1BBQ0VSX1NFTEVDVCkKKworLyogU2V0IHNhbXBsZSBjb3VudGVyIHNvdXJjZSBzZWxlY3QgKHdyaXRlIG9ubHkpICovCisjZGVmaW5lIFJ0ZEFkY1NhbXBsZUNvdW50ZXJTb3VyY2UoZGV2LHYpIFwKKyAgICB3cml0ZWwgKHYsIGRldnByaXYtPmxhczArTEFTMF9BRENfU0NOVF9TUkMpCisKKy8qIFNldCBQYWNlciB0cmlnZ2VyIG1vZGUgc2VsZWN0ICh3cml0ZSBvbmx5KSAwPXNpbmdsZSBjeWNsZSwgMT1yZXBlYXQgKi8KKyNkZWZpbmUgUnRkUGFjZXJUcmlnZ2VyTW9kZShkZXYsdikgXAorICAgIHdyaXRlbCAoKHYgPiAwKSA/IDEgOiAwLCBkZXZwcml2LT5sYXMwK0xBUzBfUEFDRVJfUkVQRUFUKQorCisvKiBTZXQgQWJvdXQgY291bnRlciBzdG9wIGVuYWJsZSAod3JpdGUgb25seSkgKi8KKyNkZWZpbmUgUnRkQWJvdXRTdG9wRW5hYmxlKGRldix2KSBcCisgICAgd3JpdGVsICgodiA+IDApID8gMSA6IDAsIGRldnByaXYtPmxhczArTEFTMF9BQ05UX1NUT1BfRU5BQkxFKQorCisvKiBTZXQgZXh0ZXJuYWwgdHJpZ2dlciBwb2xhcml0eSAod3JpdGUgb25seSkgMD1wb3NpdGl2ZSBlZGdlLCAxPW5lZ2F0aXZlICovCisjZGVmaW5lIFJ0ZFRyaWdnZXJQb2xhcml0eShkZXYsdikgXAorICAgIHdyaXRlbCAoKHYgPiAwKSA/IDEgOiAwLCBkZXZwcml2LT5sYXMwK0xBUzBfRVRSR19QT0xBUklUWSkKKworLyogU3RhcnQgc2luZ2xlIEFEQyBjb252ZXJzaW9uICovCisjZGVmaW5lIFJ0ZEFkY1N0YXJ0KGRldikgXAorICAgIHdyaXRldyAoMCwgZGV2cHJpdi0+bGFzMCtMQVMwX0FEQykKKworLyogUmVhZCBvbmUgQURDIGRhdGEgdmFsdWUgKDEyYml0ICh3aXRoIHNpZ24gZXh0ZW5kKSBhcyAxNmJpdCkgKi8KKy8qIE5vdGU6IG1hdGNoZXMgd2hhdCBETUEgd291bGQgZ2V0LiAgQWN0dWFsIHZhbHVlID4+IDMgKi8KKyNkZWZpbmUgUnRkQWRjRmlmb0dldChkZXYpIFwKKyAgICByZWFkdyAoZGV2cHJpdi0+bGFzMStMQVMxX0FEQ19GSUZPKQorCisvKiBSZWFkIHR3byBBREMgZGF0YSB2YWx1ZXMgKERPRVNOVCBXT1JLKSAqLworI2RlZmluZSBSdGRBZGNGaWZvR2V0MihkZXYpIFwKKyAgICByZWFkbCAoZGV2cHJpdi0+bGFzMStMQVMxX0FEQ19GSUZPKQorCisvKiBGSUZPIHN0YXR1cyAqLworI2RlZmluZSBSdGRGaWZvU3RhdHVzKGRldikgXAorICAgIHJlYWRsIChkZXZwcml2LT5sYXMwK0xBUzBfQURDKQorCisvKiBwYWNlciBzdGFydC9zdG9wIHJlYWQ9c3RhcnQsIHdyaXRlPXN0b3AqLworI2RlZmluZSBSdGRQYWNlclN0YXJ0KGRldikgXAorICAgIHJlYWRsIChkZXZwcml2LT5sYXMwK0xBUzBfUEFDRVIpCisjZGVmaW5lIFJ0ZFBhY2VyU3RvcChkZXYpIFwKKyAgICB3cml0ZWwgKDAsIGRldnByaXYtPmxhczArTEFTMF9QQUNFUikKKworLyogSW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBSdGRJbnRlcnJ1cHRTdGF0dXMoZGV2KSBcCisgICAgcmVhZHcgKGRldnByaXYtPmxhczArTEFTMF9JVCkKKworLyogSW50ZXJydXB0IG1hc2sgKi8KKyNkZWZpbmUgUnRkSW50ZXJydXB0TWFzayhkZXYsdikgXAorICAgIHdyaXRldyAoKGRldnByaXYtPmludE1hc2sgPSAodikpLGRldnByaXYtPmxhczArTEFTMF9JVCkKKworLyogSW50ZXJydXB0IHN0YXR1cyBjbGVhciAob25seSBiaXRzIHNldCBpbiBtYXNrKSAqLworI2RlZmluZSBSdGRJbnRlcnJ1cHRDbGVhcihkZXYpIFwKKyAgICByZWFkdyAoZGV2cHJpdi0+bGFzMCtMQVMwX0NMRUFSKQorCisvKiBJbnRlcnJ1cHQgY2xlYXIgbWFzayAqLworI2RlZmluZSBSdGRJbnRlcnJ1cHRDbGVhck1hc2soZGV2LHYpIFwKKyAgICB3cml0ZXcgKChkZXZwcml2LT5pbnRDbGVhck1hc2sgPSAodikpLCBkZXZwcml2LT5sYXMwK0xBUzBfQ0xFQVIpCisKKy8qIEludGVycnVwdCBvdmVycnVuIHN0YXR1cyAqLworI2RlZmluZSBSdGRJbnRlcnJ1cHRPdmVycnVuU3RhdHVzKGRldikgXAorICAgIHJlYWRsIChkZXZwcml2LT5sYXMwK0xBUzBfT1ZFUlJVTikKKworLyogSW50ZXJydXB0IG92ZXJydW4gY2xlYXIgKi8KKyNkZWZpbmUgUnRkSW50ZXJydXB0T3ZlcnJ1bkNsZWFyKGRldikgXAorICAgIHdyaXRlbCAoMCwgZGV2cHJpdi0+bGFzMCtMQVMwX09WRVJSVU4pCisKKy8qIFBhY2VyIGNvdW50ZXIsIDI0Yml0ICovCisjZGVmaW5lIFJ0ZFBhY2VyQ291bnQoZGV2KSBcCisgICAgcmVhZGwgKGRldnByaXYtPmxhczArTEFTMF9QQ0xLKQorI2RlZmluZSBSdGRQYWNlckNvdW50ZXIoZGV2LHYpIFwKKyAgICB3cml0ZWwgKCh2KSAmIDB4ZmZmZmZmLGRldnByaXYtPmxhczArTEFTMF9QQ0xLKQorCisvKiBCdXJzdCBjb3VudGVyLCAxMGJpdCAqLworI2RlZmluZSBSdGRCdXJzdENvdW50KGRldikgXAorICAgIHJlYWRsIChkZXZwcml2LT5sYXMwK0xBUzBfQkNMSykKKyNkZWZpbmUgUnRkQnVyc3RDb3VudGVyKGRldix2KSBcCisgICAgd3JpdGVsICgodikgJiAweDNmZixkZXZwcml2LT5sYXMwK0xBUzBfQkNMSykKKworLyogRGVsYXkgY291bnRlciwgMTZiaXQgKi8KKyNkZWZpbmUgUnRkRGVsYXlDb3VudChkZXYpIFwKKyAgICByZWFkbCAoZGV2cHJpdi0+bGFzMCtMQVMwX0RDTEspCisjZGVmaW5lIFJ0ZERlbGF5Q291bnRlcihkZXYsdikgXAorICAgIHdyaXRlbCAoKHYpICYgMHhmZmZmLCBkZXZwcml2LT5sYXMwK0xBUzBfRENMSykKKworLyogQWJvdXQgY291bnRlciwgMTZiaXQgKi8KKyNkZWZpbmUgUnRkQWJvdXRDb3VudChkZXYpIFwKKyAgICByZWFkbCAoZGV2cHJpdi0+bGFzMCtMQVMwX0FDTlQpCisjZGVmaW5lIFJ0ZEFib3V0Q291bnRlcihkZXYsdikgXAorICAgIHdyaXRlbCAoKHYpICYgMHhmZmZmLCBkZXZwcml2LT5sYXMwK0xBUzBfQUNOVCkKKworLyogQURDIHNhbXBsZSBjb3VudGVyLCAxMGJpdCAqLworI2RlZmluZSBSdGRBZGNTYW1wbGVDb3VudChkZXYpIFwKKyAgICByZWFkbCAoZGV2cHJpdi0+bGFzMCtMQVMwX0FEQ19TQ05UKQorI2RlZmluZSBSdGRBZGNTYW1wbGVDb3VudGVyKGRldix2KSBcCisgICAgd3JpdGVsICgodikgJiAweDNmZiwgZGV2cHJpdi0+bGFzMCtMQVMwX0FEQ19TQ05UKQorCisvKiBVc2VyIFRpbWVyL0NvdW50ZXIgKDgyNTQpICovCisjZGVmaW5lIFJ0ZFV0Y0NvdW50ZXJHZXQoZGV2LG4pIFwKKyAgICByZWFkYiAoZGV2cHJpdi0+bGFzMCBcCisgICAgICAgICsgKChuIDw9IDApID8gTEFTMF9VVEMwIDogKCgxID09IG4pID8gTEFTMF9VVEMxIDogTEFTMF9VVEMyKSkpCisKKyNkZWZpbmUgUnRkVXRjQ291bnRlclB1dChkZXYsbix2KSBcCisgICAgd3JpdGViICgodikgJiAweGZmLCBkZXZwcml2LT5sYXMwIFwKKyAgICAgICAgKyAoKG4gPD0gMCkgPyBMQVMwX1VUQzAgOiAoKDEgPT0gbikgPyBMQVMwX1VUQzEgOiBMQVMwX1VUQzIpKSkKKworLyogU2V0IFVUQyAoODI1NCkgY29udHJvbCBieXRlICAqLworI2RlZmluZSBSdGRVdGNDdHJsUHV0KGRldixuLHYpIFwKKyAgICB3cml0ZWIgKGRldnByaXYtPnV0Y0N0cmxbKG4pICYgM10gPSAoKChuKSAmIDMpIDw8IDYpIHwgKCh2KSAmIDB4M2YpLCBcCisgICAgICBkZXZwcml2LT5sYXMwICsgTEFTMF9VVENfQ1RSTCkKKworLyogU2V0IFVUQ24gY2xvY2sgc291cmNlICh3cml0ZSBvbmx5KSAqLworI2RlZmluZSBSdGRVdGNDbG9ja1NvdXJjZShkZXYsbix2KSBcCisgICAgd3JpdGV3ICh2LCBkZXZwcml2LT5sYXMwIFwKKyAgICAgICAgKyAoKG4gPD0gMCkgPyBMQVMwX1VUQzBfQ0xPQ0sgOiBcCisgICAgICAgICAgICgoMSA9PSBuKSA/IExBUzBfVVRDMV9DTE9DSyA6IExBUzBfVVRDMl9DTE9DSykpKQorCisvKiBTZXQgVVRDbiBnYXRlIHNvdXJjZSAod3JpdGUgb25seSkgKi8KKyNkZWZpbmUgUnRkVXRjR2F0ZVNvdXJjZShkZXYsbix2KSBcCisgICAgd3JpdGV3ICh2LCBkZXZwcml2LT5sYXMwIFwKKyAgICAgICAgKyAoKG4gPD0gMCkgPyBMQVMwX1VUQzBfR0FURSA6IFwKKyAgICAgICAgICAgKCgxID09IG4pID8gTEFTMF9VVEMxX0dBVEUgOiBMQVMwX1VUQzJfR0FURSkpKQorCisvKiBVc2VyIG91dHB1dCBOIHNvdXJjZSBzZWxlY3QgKHdyaXRlIG9ubHkpICovCisjZGVmaW5lIFJ0ZFVzck91dFNvdXJjZShkZXYsbix2KSBcCisgICAgd3JpdGVsICh2LGRldnByaXYtPmxhczArKChuIDw9IDApID8gTEFTMF9VT1VUMF9TRUxFQ1QgOiBMQVMwX1VPVVQxX1NFTEVDVCkpCisKKy8qIERpZ2l0YWwgSU8gKi8KKyNkZWZpbmUgUnRkRGlvMFJlYWQoZGV2KSBcCisgICAgKHJlYWR3IChkZXZwcml2LT5sYXMwK0xBUzBfRElPMCkgJiAweGZmKQorI2RlZmluZSBSdGREaW8wV3JpdGUoZGV2LHYpIFwKKyAgICB3cml0ZXcgKCh2KSAmIDB4ZmYsIGRldnByaXYtPmxhczArTEFTMF9ESU8wKQorCisjZGVmaW5lIFJ0ZERpbzFSZWFkKGRldikgXAorICAgIChyZWFkdyAoZGV2cHJpdi0+bGFzMCtMQVMwX0RJTzEpICYgMHhmZikKKyNkZWZpbmUgUnRkRGlvMVdyaXRlKGRldix2KSBcCisgICAgd3JpdGV3ICgodikgJiAweGZmLCBkZXZwcml2LT5sYXMwK0xBUzBfRElPMSkKKworI2RlZmluZSBSdGREaW9TdGF0dXNSZWFkKGRldikgXAorICAgIChyZWFkdyAoZGV2cHJpdi0+bGFzMCtMQVMwX0RJT19TVEFUVVMpICYgMHhmZikKKyNkZWZpbmUgUnRkRGlvU3RhdHVzV3JpdGUoZGV2LHYpIFwKKyAgICB3cml0ZXcgKChkZXZwcml2LT5kaW9TdGF0dXMgPSAodikpLCBkZXZwcml2LT5sYXMwK0xBUzBfRElPX1NUQVRVUykKKworI2RlZmluZSBSdGREaW8wQ3RybFJlYWQoZGV2KSBcCisgICAgKHJlYWR3IChkZXZwcml2LT5sYXMwK0xBUzBfRElPMF9DVFJMKSAmIDB4ZmYpCisjZGVmaW5lIFJ0ZERpbzBDdHJsV3JpdGUoZGV2LHYpIFwKKyAgICB3cml0ZXcgKCh2KSAmIDB4ZmYsIGRldnByaXYtPmxhczArTEFTMF9ESU8wX0NUUkwpCisKKy8qIERpZ2l0YWwgdG8gQW5hbG9nIGNvbnZlcnRlciAqLworLyogV3JpdGUgb25lIGRhdGEgdmFsdWUgKHNpZ24gKyAxMmJpdCArIG1hcmtlciBiaXRzKSAqLworLyogTm90ZTogbWF0Y2hlcyB3aGF0IERNQSB3b3VsZCBwdXQuICBBY3R1YWwgdmFsdWUgPDwgMyAqLworI2RlZmluZSBSdGREYWNGaWZvUHV0KGRldixuLHYpIFwKKyAgICB3cml0ZXcgKCh2KSwgZGV2cHJpdi0+bGFzMSArKCgobikgPT0gMCkgPyBMQVMxX0RBQzFfRklGTyA6IExBUzFfREFDMl9GSUZPKSkKKworLyogU3RhcnQgc2luZ2xlIERBQyBjb252ZXJzaW9uICovCisjZGVmaW5lIFJ0ZERhY1VwZGF0ZShkZXYsbikgXAorICAgIHdyaXRldyAoMCwgZGV2cHJpdi0+bGFzMCArKCgobikgPT0gMCkgPyBMQVMwX0RBQzEgOiBMQVMwX0RBQzIpKQorCisvKiBTdGFydCBzaW5nbGUgREFDIGNvbnZlcnNpb24gb24gYm90aCBEQUNzICovCisjZGVmaW5lIFJ0ZERhY0JvdGhVcGRhdGUoZGV2KSBcCisgICAgd3JpdGV3ICgwLCBkZXZwcml2LT5sYXMwK0xBUzBfREFDKQorCisvKiBTZXQgREFDIG91dHB1dCB0eXBlIGFuZCByYW5nZSAqLworI2RlZmluZSBSdGREYWNSYW5nZShkZXYsbix2KSBcCisgICAgd3JpdGV3ICgodikgJiA3LCBkZXZwcml2LT5sYXMwIFwKKwkrKCgobikgPT0gMCkgPyBMQVMwX0RBQzFfQ1RSTCA6IExBUzBfREFDMl9DVFJMKSkKKworLyogUmVzZXQgREFDIEZJRk8gKi8KKyNkZWZpbmUgUnRkRGFjQ2xlYXJGaWZvKGRldixuKSBcCisgICAgd3JpdGVsICgwLCBkZXZwcml2LT5sYXMwKygoKG4pID09IDApID8gTEFTMF9EQUMxX1JFU0VUIDogTEFTMF9EQUMyX1JFU0VUKSkKKworLyogU2V0IHNvdXJjZSBmb3IgRE1BIDAgKHdyaXRlIG9ubHksIHNoYWRvdz8pICovCisjZGVmaW5lIFJ0ZERtYTBTb3VyY2UoZGV2LG4pIFwKKyAgICB3cml0ZWwgKChuKSAmIDB4ZiwgZGV2cHJpdi0+bGFzMCtMQVMwX0RNQTBfU1JDKQorCisvKiBTZXQgc291cmNlIGZvciBETUEgMSAod3JpdGUgb25seSwgc2hhZG93PykgKi8KKyNkZWZpbmUgUnRkRG1hMVNvdXJjZShkZXYsbikgXAorICAgIHdyaXRlbCAoKG4pICYgMHhmLCBkZXZwcml2LT5sYXMwK0xBUzBfRE1BMV9TUkMpCisKKy8qIFJlc2V0IGJvYXJkIHN0YXRlIGZvciBETUEgMCAqLworI2RlZmluZSBSdGREbWEwUmVzZXQoZGV2KSBcCisgICAgd3JpdGVsICgwLCBkZXZwcml2LT5sYXMwK0xBUzBfRE1BMF9SRVNFVCkKKworLyogUmVzZXQgYm9hcmQgc3RhdGUgZm9yIERNQSAxICovCisjZGVmaW5lIFJ0ZERtYTFSZXNldChkZXYpIFwKKyAgICB3cml0ZWwgKDAsIGRldnByaXYtPmxhczArTEFTMF9ETUExX1NSQykKKworLyogUExYOTA4MCBpbnRlcnJ1cHQgbWFzayBhbmQgc3RhdHVzICovCisjZGVmaW5lIFJ0ZFBseEludGVycnVwdFJlYWQoZGV2KSBcCisgICAgcmVhZGwgKGRldnByaXYtPmxjZmcrTENGR19JVENTUikKKyNkZWZpbmUgUnRkUGx4SW50ZXJydXB0V3JpdGUoZGV2LHYpIFwKKyAgICB3cml0ZWwgKHYsIGRldnByaXYtPmxjZmcrTENGR19JVENTUikKKworLyogU2V0ICBtb2RlIGZvciBETUEgMCAqLworI2RlZmluZSBSdGREbWEwTW9kZShkZXYsbSkgXAorICAgIHdyaXRlbCAoKG0pLCBkZXZwcml2LT5sY2ZnK0xDRkdfRE1BTU9ERTApCisKKy8qIFNldCBQQ0kgYWRkcmVzcyBmb3IgRE1BIDAgKi8KKyNkZWZpbmUgUnRkRG1hMFBjaUFkZHIoZGV2LGEpIFwKKyAgICB3cml0ZWwgKChhKSwgZGV2cHJpdi0+bGNmZytMQ0ZHX0RNQVBBRFIwKQorCisvKiBTZXQgbG9jYWwgYWRkcmVzcyBmb3IgRE1BIDAgKi8KKyNkZWZpbmUgUnRkRG1hMExvY2FsQWRkcihkZXYsYSkgXAorICAgIHdyaXRlbCAoKGEpLCBkZXZwcml2LT5sY2ZnK0xDRkdfRE1BTEFEUjApCisKKy8qIFNldCBieXRlIGNvdW50IGZvciBETUEgMCAqLworI2RlZmluZSBSdGREbWEwQ291bnQoZGV2LGMpIFwKKyAgICB3cml0ZWwgKChjKSwgZGV2cHJpdi0+bGNmZytMQ0ZHX0RNQVNJWjApCisKKy8qIFNldCBuZXh0IGRlc2NyaXB0b3IgZm9yIERNQSAwICovCisjZGVmaW5lIFJ0ZERtYTBOZXh0KGRldixhKSBcCisgICAgd3JpdGVsICgoYSksIGRldnByaXYtPmxjZmcrTENGR19ETUFEUFIwKQorCisvKiBTZXQgIG1vZGUgZm9yIERNQSAxICovCisjZGVmaW5lIFJ0ZERtYTFNb2RlKGRldixtKSBcCisgICAgd3JpdGVsICgobSksIGRldnByaXYtPmxjZmcrTENGR19ETUFNT0RFMSkKKworLyogU2V0IFBDSSBhZGRyZXNzIGZvciBETUEgMSAqLworI2RlZmluZSBSdGREbWExUGNpQWRkcihkZXYsYSkgXAorICAgIHdyaXRlbCAoKGEpLCBkZXZwcml2LT5sY2ZnK0xDRkdfRE1BQURSMSkKKworLyogU2V0IGxvY2FsIGFkZHJlc3MgZm9yIERNQSAxICovCisjZGVmaW5lIFJ0ZERtYTFMb2NhbEFkZHIoZGV2LGEpIFwKKyAgICB3cml0ZWwgKChhKSwgZGV2cHJpdi0+bGNmZytMQ0ZHX0RNQUxBRFIxKQorCisvKiBTZXQgYnl0ZSBjb3VudCBmb3IgRE1BIDEgKi8KKyNkZWZpbmUgUnRkRG1hMUNvdW50KGRldixjKSBcCisgICAgd3JpdGVsICgoYyksIGRldnByaXYtPmxjZmcrTENGR19ETUFTSVoxKQorCisvKiBTZXQgbmV4dCBkZXNjcmlwdG9yIGZvciBETUEgMSAqLworI2RlZmluZSBSdGREbWExTmV4dChkZXYsYSkgXAorICAgIHdyaXRlbCAoKGEpLCBkZXZwcml2LT5sY2ZnK0xDRkdfRE1BRFBSMSkKKworLyogU2V0IGNvbnRyb2wgZm9yIERNQSAwICh3cml0ZSBvbmx5LCBzaGFkb3c/KSAqLworI2RlZmluZSBSdGREbWEwQ29udHJvbChkZXYsbikgXAorICAgIHdyaXRlYiAoZGV2cHJpdi0+ZG1hMENvbnRyb2wgPSAobiksIGRldnByaXYtPmxjZmcrTENGR19ETUFDU1IwKQorCisvKiBHZXQgc3RhdHVzIGZvciBETUEgMCAqLworI2RlZmluZSBSdGREbWEwU3RhdHVzKGRldikgXAorICAgIHJlYWRiIChkZXZwcml2LT5sY2ZnK0xDRkdfRE1BQ1NSMCkKKworLyogU2V0IGNvbnRyb2wgZm9yIERNQSAxICh3cml0ZSBvbmx5LCBzaGFkb3c/KSAqLworI2RlZmluZSBSdGREbWExQ29udHJvbChkZXYsbikgXAorICAgIHdyaXRlYiAoZGV2cHJpdi0+ZG1hMUNvbnRyb2wgPSAobiksIGRldnByaXYtPmxjZmcrTENGR19ETUFDU1IxKQorCisvKiBHZXQgc3RhdHVzIGZvciBETUEgMSAqLworI2RlZmluZSBSdGREbWExU3RhdHVzKGRldikgXAorICAgIHJlYWRiIChkZXZwcml2LT5sY2ZnK0xDRkdfRE1BQ1NSMSkKKworLyoKKyAqIFRoZSBjb21lZGlfZHJpdmVyIHN0cnVjdHVyZSB0ZWxscyB0aGUgQ29tZWRpIGNvcmUgbW9kdWxlCisgKiB3aGljaCBmdW5jdGlvbnMgdG8gY2FsbCB0byBjb25maWd1cmUvZGVjb25maWd1cmUgKGF0dGFjL2RldGFjaCkKKyAqIHRoZSBib2FyZCwgYW5kIGFsc28gYWJvdXQgdGhlIGtlcm5lbCBtb2R1bGUgdGhhdCBjb250YWlucworICogdGhlIGRldmljZSBjb2RlLgorICovCitzdGF0aWMgaW50IHJ0ZF9hdHRhY2goY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX2RldmNvbmZpZyAqIGl0KTsKK3N0YXRpYyBpbnQgcnRkX2RldGFjaChjb21lZGlfZGV2aWNlICogZGV2KTsKKworc3RhdGljIGNvbWVkaV9kcml2ZXIgcnRkNTIwRHJpdmVyID0geworICAgICAgZHJpdmVyX25hbWU6IERSVl9OQU1FLAorICAgICAgbW9kdWxlOlRISVNfTU9EVUxFLAorICAgICAgYXR0YWNoOnJ0ZF9hdHRhY2gsCisgICAgICBkZXRhY2g6cnRkX2RldGFjaCwKK307CisKK3N0YXRpYyBpbnQgcnRkX2FpX3JpbnNuKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKTsKK3N0YXRpYyBpbnQgcnRkX2FvX3dpbnNuKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKTsKK3N0YXRpYyBpbnQgcnRkX2FvX3JpbnNuKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKTsKK3N0YXRpYyBpbnQgcnRkX2Rpb19pbnNuX2JpdHMoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpOworc3RhdGljIGludCBydGRfZGlvX2luc25fY29uZmlnKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKTsKK3N0YXRpYyBpbnQgcnRkX2FpX2NtZHRlc3QoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2NtZCAqIGNtZCk7CitzdGF0aWMgaW50IHJ0ZF9haV9jbWQoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMpOworc3RhdGljIGludCBydGRfYWlfY2FuY2VsKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzKTsKKy8vc3RhdGljIGludCBydGRfYWlfcG9sbCAoY29tZWRpX2RldmljZSAqZGV2LGNvbWVkaV9zdWJkZXZpY2UgKnMpOworc3RhdGljIGludCBydGRfbnNfdG9fdGltZXIodW5zaWduZWQgaW50ICpucywgaW50IHJvdW5kTW9kZSk7CitzdGF0aWMgaXJxcmV0dXJuX3QgcnRkX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkIFBUX1JFR1NfQVJHKTsKK3N0YXRpYyBpbnQgcnRkNTIwX3Byb2JlX2ZpZm9fZGVwdGgoY29tZWRpX2RldmljZSAqZGV2KTsKKworLyoKKyAqIEF0dGFjaCBpcyBjYWxsZWQgYnkgdGhlIENvbWVkaSBjb3JlIHRvIGNvbmZpZ3VyZSB0aGUgZHJpdmVyCisgKiBmb3IgYSBwYXJ0aWN1bGFyIGJvYXJkLiAgSWYgeW91IHNwZWNpZmllZCBhIGJvYXJkX25hbWUgYXJyYXkKKyAqIGluIHRoZSBkcml2ZXIgc3RydWN0dXJlLCBkZXYtPmJvYXJkX3B0ciBjb250YWlucyB0aGF0CisgKiBhZGRyZXNzLgorICovCitzdGF0aWMgaW50IHJ0ZF9hdHRhY2goY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX2RldmNvbmZpZyAqIGl0KQorewkJCQkvKiBib2FyZCBuYW1lIGFuZCBvcHRpb25zIGZsYWdzICovCisJY29tZWRpX3N1YmRldmljZSAqczsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2OworCWludCByZXQ7CisJcmVzb3VyY2Vfc2l6ZV90IHBoeXNMYXMwOwkvKiBjb25maWd1YXRpb24gKi8KKwlyZXNvdXJjZV9zaXplX3QgcGh5c0xhczE7CS8qIGRhdGEgYXJlYSAqLworCXJlc291cmNlX3NpemVfdCBwaHlzTGNmZzsJLyogUExYOTA4MCAqLworI2lmZGVmIFVTRV9ETUEKKwlpbnQgaW5kZXg7CisjZW5kaWYKKworCXByaW50aygiY29tZWRpJWQ6IHJ0ZDUyMCBhdHRhY2hpbmcuXG4iLCBkZXYtPm1pbm9yKTsKKworI2lmIGRlZmluZWQgKENPTkZJR19DT01FRElfREVCVUcpICYmIGRlZmluZWQgKFVTRV9ETUEpCisJLyogWW91IGNhbiBzZXQgdGhpcyBhIGxvYWQgdGltZTogbW9kcHJvYmUgY29tZWRpIGNvbWVkaV9kZWJ1Zz0xICovCisJaWYgKDAgPT0gY29tZWRpX2RlYnVnKQkvKiBmb3JjZSBETUEgZGVidWcgcHJpbnRrcyAqLworCQljb21lZGlfZGVidWcgPSAxOworI2VuZGlmCisKKwkvKgorCSAqIEFsbG9jYXRlIHRoZSBwcml2YXRlIHN0cnVjdHVyZSBhcmVhLiAgYWxsb2NfcHJpdmF0ZSgpIGlzIGEKKwkgKiBjb252ZW5pZW50IG1hY3JvIGRlZmluZWQgaW4gY29tZWRpZGV2LmguCisJICovCisJaWYgKGFsbG9jX3ByaXZhdGUoZGV2LCBzaXplb2YocnRkUHJpdmF0ZSkpIDwgMCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKgorCSAqIFByb2JlIHRoZSBkZXZpY2UgdG8gZGV0ZXJtaW5lIHdoYXQgZGV2aWNlIGluIHRoZSBzZXJpZXMgaXQgaXMuCisJICovCisJZm9yIChwY2lkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX1JURCwgUENJX0FOWV9JRCwgTlVMTCk7CisJCXBjaWRldiAhPSBOVUxMOworCQlwY2lkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX1JURCwgUENJX0FOWV9JRCwgcGNpZGV2KSkgeworCQlpbnQgaTsKKworCQlpZiAoaXQtPm9wdGlvbnNbMF0gfHwgaXQtPm9wdGlvbnNbMV0pIHsKKwkJCWlmIChwY2lkZXYtPmJ1cy0+bnVtYmVyICE9IGl0LT5vcHRpb25zWzBdCisJCQkJfHwgUENJX1NMT1QocGNpZGV2LT5kZXZmbikgIT0KKwkJCQlpdC0+b3B0aW9uc1sxXSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCWZvcihpID0gMDsgaSA8IHNpemVvZihydGQ1MjBCb2FyZHMpIC8gc2l6ZW9mKHJ0ZDUyMEJvYXJkc1swXSk7ICsraSkKKwkJeworCQkJaWYocGNpZGV2LT5kZXZpY2UgPT0gcnRkNTIwQm9hcmRzW2ldLmRldmljZV9pZCkKKwkJCXsKKwkJCQlkZXYtPmJvYXJkX3B0ciA9ICZydGQ1MjBCb2FyZHNbaV07CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYoZGV2LT5ib2FyZF9wdHIpIGJyZWFrOwkvKiBmb3VuZCBvbmUgKi8KKwl9CisJaWYgKCFwY2lkZXYpIHsKKwkJaWYgKGl0LT5vcHRpb25zWzBdICYmIGl0LT5vcHRpb25zWzFdKSB7CisJCQlwcmludGsoIk5vIFJURCBjYXJkIGF0IGJ1cz0lZCBzbG90PSVkLlxuIiwKKwkJCQlpdC0+b3B0aW9uc1swXSwgaXQtPm9wdGlvbnNbMV0pOworCQl9IGVsc2UgeworCQkJcHJpbnRrKCJObyBSVEQgY2FyZCBmb3VuZC5cbiIpOworCQl9CisJCXJldHVybiAtRUlPOworCX0KKwlkZXZwcml2LT5wY2lfZGV2ID0gcGNpZGV2OworCWRldi0+Ym9hcmRfbmFtZSA9IHRoaXNib2FyZC0+bmFtZTsKKworCWlmICgocmV0ID0gY29tZWRpX3BjaV9lbmFibGUocGNpZGV2LCBEUlZfTkFNRSkpIDwgMCkgeworCQlwcmludGsoIkZhaWxlZCB0byBlbmFibGUgUENJIGRldmljZSBhbmQgcmVxdWVzdCByZWdpb25zLlxuIik7CisJCXJldHVybiByZXQ7CisJfQorCWRldnByaXYtPmdvdF9yZWdpb25zID0gMTsKKworCS8qCisJICogSW5pdGlhbGl6ZSBiYXNlIGFkZHJlc3NlcworCSAqLworCS8qIEdldCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBmcm9tIFBDSSBjb25maWcgKi8KKwlwaHlzTGFzMCA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXZwcml2LT5wY2lfZGV2LCBMQVMwX1BDSUlOREVYKTsKKwlwaHlzTGFzMSA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXZwcml2LT5wY2lfZGV2LCBMQVMxX1BDSUlOREVYKTsKKwlwaHlzTGNmZyA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXZwcml2LT5wY2lfZGV2LCBMQ0ZHX1BDSUlOREVYKTsKKwkvKiBOb3cgaGF2ZSB0aGUga2VybmVsIG1hcCB0aGlzIGludG8gbWVtb3J5ICovCisJLyogQVNTVU1FIHBhZ2UgYWxpZ25lZCAqLworCWRldnByaXYtPmxhczAgPSBpb3JlbWFwX25vY2FjaGUocGh5c0xhczAsIExBUzBfUENJU0laRSk7CisJZGV2cHJpdi0+bGFzMSA9IGlvcmVtYXBfbm9jYWNoZShwaHlzTGFzMSwgTEFTMV9QQ0lTSVpFKTsKKwlkZXZwcml2LT5sY2ZnID0gaW9yZW1hcF9ub2NhY2hlKHBoeXNMY2ZnLCBMQ0ZHX1BDSVNJWkUpOworCisJaWYgKCFkZXZwcml2LT5sYXMwIHx8ICFkZXZwcml2LT5sYXMxIHx8ICFkZXZwcml2LT5sY2ZnKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCURQUklOVEsoIiVzOiBMQVMwPSVsbHgsIExBUzE9JWxseCwgQ0ZHPSVsbHguXG4iLCBkZXYtPmJvYXJkX25hbWUsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpcGh5c0xhczAsICh1bnNpZ25lZCBsb25nIGxvbmcpcGh5c0xhczEsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpcGh5c0xjZmcpOworCXsJCQkvKiBUaGUgUlREIGRyaXZlciBkb2VzIHRoaXMgKi8KKwkJdW5zaWduZWQgY2hhciBwY2lfbGF0ZW5jeTsKKwkJdTE2IHJldmlzaW9uOworCQkvKnVpbnQzMl90IGVwbGRfdmVyc2lvbjsgKi8KKworCQlwY2lfcmVhZF9jb25maWdfd29yZChkZXZwcml2LT5wY2lfZGV2LCBQQ0lfUkVWSVNJT05fSUQsCisJCQkmcmV2aXNpb24pOworCQlEUFJJTlRLKCIlczogUENJIHJldmlzaW9uICVkLlxuIiwgZGV2LT5ib2FyZF9uYW1lLCByZXZpc2lvbik7CisKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2cHJpdi0+cGNpX2RldiwKKwkJCVBDSV9MQVRFTkNZX1RJTUVSLCAmcGNpX2xhdGVuY3kpOworCQlpZiAocGNpX2xhdGVuY3kgPCAzMikgeworCQkJcHJpbnRrKCIlczogUENJIGxhdGVuY3kgY2hhbmdlZCBmcm9tICVkIHRvICVkXG4iLAorCQkJCWRldi0+Ym9hcmRfbmFtZSwgcGNpX2xhdGVuY3ksIDMyKTsKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXZwcml2LT5wY2lfZGV2LAorCQkJCVBDSV9MQVRFTkNZX1RJTUVSLCAzMik7CisJCX0gZWxzZSB7CisJCQlEUFJJTlRLKCJydGQ1MjA6IFBDSSBsYXRlbmN5ID0gJWRcbiIsIHBjaV9sYXRlbmN5KTsKKwkJfQorCisJCS8qIFVuZG9jdW1lbnRlZCBFUExEIHZlcnNpb24gKGRvZXNudCBtYXRjaCBSVEQgZHJpdmVyIHJlc3VsdHMpICovCisJCS8qRFBSSU5USyAoInJ0ZDUyMDogUmVhZGluZyBlcGxkIGZyb20gJXBcbiIsCisJCSAgIGRldnByaXYtPmxhczArMCk7CisJCSAgIGVwbGRfdmVyc2lvbiA9IHJlYWRsIChkZXZwcml2LT5sYXMwKzApOworCQkgICBpZiAoKGVwbGRfdmVyc2lvbiAmIDB4RjApID4+IDQgPT0gMHgwRikgeworCQkgICBEUFJJTlRLKCJydGQ1MjA6IHByZS12OCBFUExELiAoJXgpXG4iLCBlcGxkX3ZlcnNpb24pOworCQkgICB9IGVsc2UgeworCQkgICBEUFJJTlRLKCJydGQ1MjA6IEVQTEQgdmVyc2lvbiAleC5cbiIsIGVwbGRfdmVyc2lvbiA+PiA0KTsKKwkJICAgfSAqLworCX0KKworCS8qIFNob3cgYm9hcmQgY29uZmlndXJhdGlvbiAqLworCXByaW50aygiJXM6IiwgZGV2LT5ib2FyZF9uYW1lKTsKKworCS8qCisJICogQWxsb2NhdGUgdGhlIHN1YmRldmljZSBzdHJ1Y3R1cmVzLiAgYWxsb2Nfc3ViZGV2aWNlKCkgaXMgYQorCSAqIGNvbnZlbmllbnQgbWFjcm8gZGVmaW5lZCBpbiBjb21lZGlkZXYuaC4KKwkgKi8KKwlpZiAoYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIDQpIDwgMCkgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgMDsKKwlkZXYtPnJlYWRfc3ViZGV2ID0gczsKKwkvKiBhbmFsb2cgaW5wdXQgc3ViZGV2aWNlICovCisJcy0+dHlwZSA9IENPTUVESV9TVUJEX0FJOworCXMtPnN1YmRldl9mbGFncyA9CisJCVNERl9SRUFEQUJMRSB8IFNERl9HUk9VTkQgfCBTREZfQ09NTU9OIHwgU0RGX0RJRkYgfAorCQlTREZfQ01EX1JFQUQ7CisJcy0+bl9jaGFuID0gdGhpc2JvYXJkLT5haUNoYW5zOworCXMtPm1heGRhdGEgPSAoMSA8PCB0aGlzYm9hcmQtPmFpQml0cykgLSAxOworCWlmICh0aGlzYm9hcmQtPmFpTWF4R2FpbiA8PSAzMikgeworCQlzLT5yYW5nZV90YWJsZSA9ICZydGRfYWlfNzUyMF9yYW5nZTsKKwl9IGVsc2UgeworCQlzLT5yYW5nZV90YWJsZSA9ICZydGRfYWlfNDUyMF9yYW5nZTsKKwl9CisJcy0+bGVuX2NoYW5saXN0ID0gUlREX01BWF9DSEFOTElTVDsJLyogZGV2cHJpdi0+Zmlmb0xlbiAqLworCXMtPmluc25fcmVhZCA9IHJ0ZF9haV9yaW5zbjsKKwlzLT5kb19jbWQgPSBydGRfYWlfY21kOworCXMtPmRvX2NtZHRlc3QgPSBydGRfYWlfY21kdGVzdDsKKwlzLT5jYW5jZWwgPSBydGRfYWlfY2FuY2VsOworCS8qcy0+cG9sbCA9IHJ0ZF9haV9wb2xsOyAqLy8qIG5vdCByZWFkeSB5ZXQgKi8KKworCXMgPSBkZXYtPnN1YmRldmljZXMgKyAxOworCS8qIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlICovCisJcy0+dHlwZSA9IENPTUVESV9TVUJEX0FPOworCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklUQUJMRTsKKwlzLT5uX2NoYW4gPSAyOworCXMtPm1heGRhdGEgPSAoMSA8PCB0aGlzYm9hcmQtPmFpQml0cykgLSAxOworCXMtPnJhbmdlX3RhYmxlID0gJnJ0ZF9hb19yYW5nZTsKKwlzLT5pbnNuX3dyaXRlID0gcnRkX2FvX3dpbnNuOworCXMtPmluc25fcmVhZCA9IHJ0ZF9hb19yaW5zbjsKKworCXMgPSBkZXYtPnN1YmRldmljZXMgKyAyOworCS8qIGRpZ2l0YWwgaS9vIHN1YmRldmljZSAqLworCXMtPnR5cGUgPSBDT01FRElfU1VCRF9ESU87CisJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFIHwgU0RGX1dSSVRBQkxFOworCS8qIHdlIG9ubHkgc3VwcG9ydCBwb3J0IDAgcmlnaHQgbm93LiAgSWdub3JpbmcgcG9ydCAxIGFuZCB1c2VyIElPICovCisJcy0+bl9jaGFuID0gODsKKwlzLT5tYXhkYXRhID0gMTsKKwlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOworCXMtPmluc25fYml0cyA9IHJ0ZF9kaW9faW5zbl9iaXRzOworCXMtPmluc25fY29uZmlnID0gcnRkX2Rpb19pbnNuX2NvbmZpZzsKKworCS8qIHRpbWVyL2NvdW50ZXIgc3ViZGV2aWNlcyAobm90IGN1cnJlbnRseSBzdXBwb3J0ZWQpICovCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIDM7CisJcy0+dHlwZSA9IENPTUVESV9TVUJEX0NPVU5URVI7CisJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFIHwgU0RGX1dSSVRBQkxFOworCXMtPm5fY2hhbiA9IDM7CisJcy0+bWF4ZGF0YSA9IDB4ZmZmZjsKKworCS8qIGluaXRpYWxpemUgYm9hcmQsIHBlciBSVEQgc3BlYyAqLworCS8qIGFsc28sIGluaXRpYWxpemUgc2hhZG93IHJlZ2lzdGVycyAqLworCVJ0ZFJlc2V0Qm9hcmQoZGV2KTsKKwljb21lZGlfdWRlbGF5KDEwMCk7CS8qIG5lZWRlZD8gKi8KKwlSdGRQbHhJbnRlcnJ1cHRXcml0ZShkZXYsIDApOworCVJ0ZEludGVycnVwdE1hc2soZGV2LCAwKTsJLyogYW5kIHNldHMgc2hhZG93ICovCisJUnRkSW50ZXJydXB0Q2xlYXJNYXNrKGRldiwgfjApOwkvKiBhbmQgc2V0cyBzaGFkb3cgKi8KKwlSdGRJbnRlcnJ1cHRDbGVhcihkZXYpOwkvKiBjbGVhcnMgYml0cyBzZXQgYnkgbWFzayAqLworCVJ0ZEludGVycnVwdE92ZXJydW5DbGVhcihkZXYpOworCVJ0ZENsZWFyQ0dUKGRldik7CisJUnRkQWRjQ2xlYXJGaWZvKGRldik7CisJUnRkRGFjQ2xlYXJGaWZvKGRldiwgMCk7CisJUnRkRGFjQ2xlYXJGaWZvKGRldiwgMSk7CisJLyogY2xlYXIgZGlnaXRhbCBJTyBmaWZvICovCisJUnRkRGlvU3RhdHVzV3JpdGUoZGV2LCAwKTsJLyogc2FmZSBzdGF0ZSwgc2V0IHNoYWRvdyAqLworCVJ0ZFV0Y0N0cmxQdXQoZGV2LCAwLCAweDMwKTsJLyogc2FmZSBzdGF0ZSwgc2V0IHNoYWRvdyAqLworCVJ0ZFV0Y0N0cmxQdXQoZGV2LCAxLCAweDMwKTsJLyogc2FmZSBzdGF0ZSwgc2V0IHNoYWRvdyAqLworCVJ0ZFV0Y0N0cmxQdXQoZGV2LCAyLCAweDMwKTsJLyogc2FmZSBzdGF0ZSwgc2V0IHNoYWRvdyAqLworCVJ0ZFV0Y0N0cmxQdXQoZGV2LCAzLCAwKTsJLyogc2FmZSBzdGF0ZSwgc2V0IHNoYWRvdyAqLworCS8qIFRPRE86IHNldCB1c2VyIG91dCBzb3VyY2UgPz8/ICovCisKKwkvKiBjaGVjayBpZiBvdXIgaW50ZXJydXB0IGlzIGF2YWlsYWJsZSBhbmQgZ2V0IGl0ICovCisJaWYgKChyZXQgPSBjb21lZGlfcmVxdWVzdF9pcnEoZGV2cHJpdi0+cGNpX2Rldi0+aXJxLCBydGRfaW50ZXJydXB0LAorCQkJCUlSUUZfU0hBUkVELCBEUlZfTkFNRSwgZGV2KSkgPCAwKSB7CisJCXByaW50aygiQ291bGQgbm90IGdldCBpbnRlcnJ1cHQhICgldSlcbiIsCisJCQlkZXZwcml2LT5wY2lfZGV2LT5pcnEpOworCQlyZXR1cm4gcmV0OworCX0KKwlkZXYtPmlycSA9IGRldnByaXYtPnBjaV9kZXYtPmlycTsKKwlwcmludGsoIiggaXJxPSV1ICkiLCBkZXYtPmlycSk7CisKKwlyZXQgPSBydGQ1MjBfcHJvYmVfZmlmb19kZXB0aChkZXYpOworCWlmKHJldCA8IDApIHsKKwkJcmV0dXJuIHJldDsKKwl9CisJZGV2cHJpdi0+Zmlmb0xlbiA9IHJldDsKKwlwcmludGsoIiggZmlmb0xlbj0lZCApIiwgZGV2cHJpdi0+Zmlmb0xlbik7CisKKyNpZmRlZiBVU0VfRE1BCisJaWYgKGRldi0+aXJxID4gMCkgeworCQlwcmludGsoIiggRE1BIGJ1ZmY9JWQgKVxuIiwgRE1BX0NIQUlOX0NPVU5UKTsKKwkJLyogVGhlIFBMWDkwODAgaGFzIDIgRE1BIGNvbnRyb2xsZXJzLCBidXQgdGhlcmUgY291bGQgYmUgNCBzb3VyY2VzOgorCQkgICBBREMsIGRpZ2l0YWwsIERBQzEsIGFuZCBEQUMyLiAgU2luY2Ugb25seSB0aGUgQURDIHN1cHBvcnRzIGNtZCBtb2RlCisJCSAgIHJpZ2h0IG5vdywgdGhpcyBpc24ndCBhbiBpc3N1ZSAoeWV0KSAqLworCQlkZXZwcml2LT5kbWEwT2Zmc2V0ID0gMDsKKworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBETUFfQ0hBSU5fQ09VTlQ7IGluZGV4KyspIHsKKwkJCWRldnByaXYtPmRtYTBCdWZmW2luZGV4XSA9CisJCQkJcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2cHJpdi0+cGNpX2RldiwKKwkJCQlzaXplb2YodTE2KSAqIGRldnByaXYtPmZpZm9MZW4gLyAyLAorCQkJCSZkZXZwcml2LT5kbWEwQnVmZlBoeXNBZGRyW2luZGV4XSk7CisJCQlpZiAoZGV2cHJpdi0+ZG1hMEJ1ZmZbaW5kZXhdID09IE5VTEwpIHsKKwkJCQlyZXQgPSAtRU5PTUVNOworCQkJCWdvdG8gcnRkX2F0dGFjaF9kaWVfZXJyb3I7CisJCQl9CisJCQkvKkRQUklOVEsgKCJidWZmWyVkXSBAICVwIHZpcnR1YWwsICV4IFBDSVxuIiwKKwkJCSAgIGluZGV4LAorCQkJICAgZGV2cHJpdi0+ZG1hMEJ1ZmZbaW5kZXhdLCBkZXZwcml2LT5kbWEwQnVmZlBoeXNBZGRyW2luZGV4XSk7ICovCisJCX0KKworCQkvKiBzZXR1cCBETUEgZGVzY3JpcHRvciByaW5nICh1c2UgY3B1X3RvX2xlMzIgZm9yIGJ5dGUgb3JkZXJpbmc/KSAqLworCQlkZXZwcml2LT5kbWEwQ2hhaW4gPQorCQkJcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2cHJpdi0+cGNpX2RldiwKKwkJCXNpemVvZihzdHJ1Y3QgcGx4X2RtYV9kZXNjKSAqIERNQV9DSEFJTl9DT1VOVCwKKwkJCSZkZXZwcml2LT5kbWEwQ2hhaW5QaHlzQWRkcik7CisJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IERNQV9DSEFJTl9DT1VOVDsgaW5kZXgrKykgeworCQkJZGV2cHJpdi0+ZG1hMENoYWluW2luZGV4XS5wY2lfc3RhcnRfYWRkciA9CisJCQkJZGV2cHJpdi0+ZG1hMEJ1ZmZQaHlzQWRkcltpbmRleF07CisJCQlkZXZwcml2LT5kbWEwQ2hhaW5baW5kZXhdLmxvY2FsX3N0YXJ0X2FkZHIgPQorCQkJCURNQUxBRERSX0FEQzsKKwkJCWRldnByaXYtPmRtYTBDaGFpbltpbmRleF0udHJhbnNmZXJfc2l6ZSA9CisJCQkJc2l6ZW9mKHUxNikgKiBkZXZwcml2LT5maWZvTGVuIC8gMjsKKwkJCWRldnByaXYtPmRtYTBDaGFpbltpbmRleF0ubmV4dCA9CisJCQkJKGRldnByaXYtPmRtYTBDaGFpblBoeXNBZGRyICsgKChpbmRleCArCisJCQkJCQkxKSAlIChETUFfQ0hBSU5fQ09VTlQpKQorCQkJCSogc2l6ZW9mKGRldnByaXYtPmRtYTBDaGFpblswXSkpCisJCQkJfCBETUFfVFJBTlNGRVJfQklUUzsKKwkJCS8qRFBSSU5USyAoInJpbmdbJWRdIEAlbHggUENJOiAleCwgbG9jYWw6ICV4LCBOOiAweCV4LCBuZXh0OiAleFxuIiwKKwkJCSAgIGluZGV4LAorCQkJICAgKChsb25nKWRldnByaXYtPmRtYTBDaGFpblBoeXNBZGRyCisJCQkgICArIChpbmRleCAqIHNpemVvZihkZXZwcml2LT5kbWEwQ2hhaW5bMF0pKSksCisJCQkgICBkZXZwcml2LT5kbWEwQ2hhaW5baW5kZXhdLnBjaV9zdGFydF9hZGRyLAorCQkJICAgZGV2cHJpdi0+ZG1hMENoYWluW2luZGV4XS5sb2NhbF9zdGFydF9hZGRyLAorCQkJICAgZGV2cHJpdi0+ZG1hMENoYWluW2luZGV4XS50cmFuc2Zlcl9zaXplLAorCQkJICAgZGV2cHJpdi0+ZG1hMENoYWluW2luZGV4XS5uZXh0KTsgKi8KKwkJfQorCisJCWlmIChkZXZwcml2LT5kbWEwQ2hhaW4gPT0gTlVMTCkgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gcnRkX2F0dGFjaF9kaWVfZXJyb3I7CisJCX0KKworCQlSdGREbWEwTW9kZShkZXYsIERNQV9NT0RFX0JJVFMpOworCQlSdGREbWEwU291cmNlKGRldiwgRE1BU19BREZJRk9fSEFMRl9GVUxMKTsJLyogc2V0IERNQSB0cmlnZ2VyIHNvdXJjZSAqLworCX0gZWxzZSB7CisJCXByaW50aygiKCBubyBJUlEtPm5vIERNQSApIik7CisJfQorI2VuZGlmIC8qIFVTRV9ETUEgKi8KKworCWlmIChkZXYtPmlycSkgewkJLyogZW5hYmxlIHBseDkwODAgaW50ZXJydXB0cyAqLworCQlSdGRQbHhJbnRlcnJ1cHRXcml0ZShkZXYsIElDU19QSUUgfCBJQ1NfUExJRSk7CisJfQorCisJcHJpbnRrKCJcbmNvbWVkaSVkOiBydGQ1MjAgZHJpdmVyIGF0dGFjaGVkLlxuIiwgZGV2LT5taW5vcik7CisKKwlyZXR1cm4gMTsKKworI2lmIDAKKwkvKiBoaXQgYW4gZXJyb3IsIGNsZWFuIHVwIG1lbW9yeSBhbmQgcmV0dXJuIHJldCAqLworLy9ydGRfYXR0YWNoX2RpZV9lcnJvcjoKKyNpZmRlZiBVU0VfRE1BCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgRE1BX0NIQUlOX0NPVU5UOyBpbmRleCsrKSB7CisJCWlmIChOVUxMICE9IGRldnByaXYtPmRtYTBCdWZmW2luZGV4XSkgewkvKiBmcmVlIGJ1ZmZlciBtZW1vcnkgKi8KKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGV2cHJpdi0+cGNpX2RldiwKKwkJCQlzaXplb2YodTE2KSAqIGRldnByaXYtPmZpZm9MZW4gLyAyLAorCQkJCWRldnByaXYtPmRtYTBCdWZmW2luZGV4XSwKKwkJCQlkZXZwcml2LT5kbWEwQnVmZlBoeXNBZGRyW2luZGV4XSk7CisJCQlkZXZwcml2LT5kbWEwQnVmZltpbmRleF0gPSBOVUxMOworCQl9CisJfQorCWlmIChOVUxMICE9IGRldnByaXYtPmRtYTBDaGFpbikgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGRldnByaXYtPnBjaV9kZXYsCisJCQlzaXplb2Yoc3RydWN0IHBseF9kbWFfZGVzYykKKwkJCSogRE1BX0NIQUlOX0NPVU5ULAorCQkJZGV2cHJpdi0+ZG1hMENoYWluLCBkZXZwcml2LT5kbWEwQ2hhaW5QaHlzQWRkcik7CisJCWRldnByaXYtPmRtYTBDaGFpbiA9IE5VTEw7CisJfQorI2VuZGlmIC8qIFVTRV9ETUEgKi8KKwkvKiBzdWJkZXZpY2VzIGFuZCBwcml2IGFyZSBmcmVlZCBieSB0aGUgY29yZSAqLworCWlmIChkZXYtPmlycSkgeworCQkvKiBkaXNhYmxlIGludGVycnVwdCBjb250cm9sbGVyICovCisJCVJ0ZFBseEludGVycnVwdFdyaXRlKGRldiwgUnRkUGx4SW50ZXJydXB0UmVhZChkZXYpCisJCQkmIH4oSUNTX1BMSUUgfCBJQ1NfRE1BMF9FIHwgSUNTX0RNQTFfRSkpOworCQljb21lZGlfZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJfQorCisJLyogcmVsZWFzZSBhbGwgcmVnaW9ucyB0aGF0IHdlcmUgYWxsb2NhdGVkICovCisJaWYgKGRldnByaXYtPmxhczApIHsKKwkJaW91bm1hcChkZXZwcml2LT5sYXMwKTsKKwl9CisJaWYgKGRldnByaXYtPmxhczEpIHsKKwkJaW91bm1hcChkZXZwcml2LT5sYXMxKTsKKwl9CisJaWYgKGRldnByaXYtPmxjZmcpIHsKKwkJaW91bm1hcChkZXZwcml2LT5sY2ZnKTsKKwl9CisJaWYgKGRldnByaXYtPnBjaV9kZXYpIHsKKwkJcGNpX2Rldl9wdXQoZGV2cHJpdi0+cGNpX2Rldik7CisJfQorCXJldHVybiByZXQ7CisjZW5kaWYKK30KKworLyoKKyAqIF9kZXRhY2ggaXMgY2FsbGVkIHRvIGRlY29uZmlndXJlIGEgZGV2aWNlLiAgSXQgc2hvdWxkIGRlYWxsb2NhdGUKKyAqIHJlc291cmNlcy4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgYWxzbyBjYWxsZWQgd2hlbiBfYXR0YWNoKCkgZmFpbHMsIHNvIGl0IHNob3VsZCBiZQorICogY2FyZWZ1bCBub3QgdG8gcmVsZWFzZSByZXNvdXJjZXMgdGhhdCB3ZXJlIG5vdCBuZWNlc3NhcmlseQorICogYWxsb2NhdGVkIGJ5IF9hdHRhY2goKS4gIGRldi0+cHJpdmF0ZSBhbmQgZGV2LT5zdWJkZXZpY2VzIGFyZQorICogZGVhbGxvY2F0ZWQgYXV0b21hdGljYWxseSBieSB0aGUgY29yZS4KKyAqLworc3RhdGljIGludCBydGRfZGV0YWNoKGNvbWVkaV9kZXZpY2UgKiBkZXYpCit7CisjaWZkZWYgVVNFX0RNQQorCWludCBpbmRleDsKKyNlbmRpZgorCisJRFBSSU5USygiY29tZWRpJWQ6IHJ0ZDUyMDogcmVtb3ZpbmcgKCVsZCBpbnRzKVxuIiwKKwkJZGV2LT5taW5vciwgKGRldnByaXYgPyBkZXZwcml2LT5pbnRDb3VudCA6IDBMKSk7CisJaWYgKGRldnByaXYgJiYgZGV2cHJpdi0+bGNmZykgeworCQlEUFJJTlRLKCIoaW50IHN0YXR1cyAweCV4LCBvdmVycnVuIHN0YXR1cyAweCV4LCBmaWZvIHN0YXR1cyAweCV4KS4uLlxuIiwgMHhmZmZmICYgUnRkSW50ZXJydXB0U3RhdHVzKGRldiksIDB4ZmZmZiAmIFJ0ZEludGVycnVwdE92ZXJydW5TdGF0dXMoZGV2KSwgKDB4ZmZmZiAmIFJ0ZEZpZm9TdGF0dXMoZGV2KSkgXiAweDY2NjYpOworCX0KKworCWlmIChkZXZwcml2KSB7CisJCS8qIFNodXQgZG93biBhbnkgYm9hcmQgb3BzIGJ5IHJlc2V0dGluZyBpdCAqLworI2lmZGVmIFVTRV9ETUEKKwkJaWYgKGRldnByaXYtPmxjZmcpIHsKKwkJCVJ0ZERtYTBDb250cm9sKGRldiwgMCk7CS8qIGRpc2FibGUgRE1BICovCisJCQlSdGREbWExQ29udHJvbChkZXYsIDApOwkvKiBkaXNhYmxlIERNQSAqLworCQkJUnRkUGx4SW50ZXJydXB0V3JpdGUoZGV2LCBJQ1NfUElFIHwgSUNTX1BMSUUpOworCQl9CisjZW5kaWYgLyogVVNFX0RNQSAqLworCQlpZiAoZGV2cHJpdi0+bGFzMCkgeworCQkJUnRkUmVzZXRCb2FyZChkZXYpOworCQkJUnRkSW50ZXJydXB0TWFzayhkZXYsIDApOworCQkJUnRkSW50ZXJydXB0Q2xlYXJNYXNrKGRldiwgfjApOworCQkJUnRkSW50ZXJydXB0Q2xlYXIoZGV2KTsJLyogY2xlYXJzIGJpdHMgc2V0IGJ5IG1hc2sgKi8KKwkJfQorI2lmZGVmIFVTRV9ETUEKKwkJLyogcmVsZWFzZSBETUEgKi8KKwkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgRE1BX0NIQUlOX0NPVU5UOyBpbmRleCsrKSB7CisJCQlpZiAoTlVMTCAhPSBkZXZwcml2LT5kbWEwQnVmZltpbmRleF0pIHsKKwkJCQlwY2lfZnJlZV9jb25zaXN0ZW50KGRldnByaXYtPnBjaV9kZXYsCisJCQkJCXNpemVvZih1MTYpICogZGV2cHJpdi0+Zmlmb0xlbiAvIDIsCisJCQkJCWRldnByaXYtPmRtYTBCdWZmW2luZGV4XSwKKwkJCQkJZGV2cHJpdi0+ZG1hMEJ1ZmZQaHlzQWRkcltpbmRleF0pOworCQkJCWRldnByaXYtPmRtYTBCdWZmW2luZGV4XSA9IE5VTEw7CisJCQl9CisJCX0KKwkJaWYgKE5VTEwgIT0gZGV2cHJpdi0+ZG1hMENoYWluKSB7CisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KGRldnByaXYtPnBjaV9kZXYsCisJCQkJc2l6ZW9mKHN0cnVjdCBwbHhfZG1hX2Rlc2MpICogRE1BX0NIQUlOX0NPVU5ULAorCQkJCWRldnByaXYtPmRtYTBDaGFpbiwgZGV2cHJpdi0+ZG1hMENoYWluUGh5c0FkZHIpOworCQkJZGV2cHJpdi0+ZG1hMENoYWluID0gTlVMTDsKKwkJfQorI2VuZGlmIC8qIFVTRV9ETUEgKi8KKworCQkvKiByZWxlYXNlIElSUSAqLworCQlpZiAoZGV2LT5pcnEpIHsKKwkJCS8qIGRpc2FibGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgKi8KKwkJCVJ0ZFBseEludGVycnVwdFdyaXRlKGRldiwgUnRkUGx4SW50ZXJydXB0UmVhZChkZXYpCisJCQkJJiB+KElDU19QTElFIHwgSUNTX0RNQTBfRSB8IElDU19ETUExX0UpKTsKKwkJCWNvbWVkaV9mcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkJfQorCisJCS8qIHJlbGVhc2UgYWxsIHJlZ2lvbnMgdGhhdCB3ZXJlIGFsbG9jYXRlZCAqLworCQlpZiAoZGV2cHJpdi0+bGFzMCkgeworCQkJaW91bm1hcChkZXZwcml2LT5sYXMwKTsKKwkJfQorCQlpZiAoZGV2cHJpdi0+bGFzMSkgeworCQkJaW91bm1hcChkZXZwcml2LT5sYXMxKTsKKwkJfQorCQlpZiAoZGV2cHJpdi0+bGNmZykgeworCQkJaW91bm1hcChkZXZwcml2LT5sY2ZnKTsKKwkJfQorCQlpZiAoZGV2cHJpdi0+cGNpX2RldikgeworCQkJaWYgKGRldnByaXYtPmdvdF9yZWdpb25zKSB7CisJCQkJY29tZWRpX3BjaV9kaXNhYmxlKGRldnByaXYtPnBjaV9kZXYpOworCQkJfQorCQkJcGNpX2Rldl9wdXQoZGV2cHJpdi0+cGNpX2Rldik7CisJCX0KKwl9CisKKwlwcmludGsoImNvbWVkaSVkOiBydGQ1MjA6IHJlbW92ZWQuXG4iLCBkZXYtPm1pbm9yKTsKKworCXJldHVybiAwOworfQorCisvKgorICBDb252ZXJ0IGEgc2luZ2xlIGNvbWVkaSBjaGFubmVsLWdhaW4gZW50cnkgdG8gYSBSVEQ1MjAgdGFibGUgZW50cnkKKyovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcnRkQ29udmVydENoYW5HYWluKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJdW5zaWduZWQgaW50IGNvbWVkaUNoYW4sIGludCBjaGFuSW5kZXgpCit7CQkJCS8qIGluZGV4IGluIGNoYW5uZWwgbGlzdCAqLworCXVuc2lnbmVkIGludCBjaGFuLCByYW5nZSwgYXJlZjsKKwl1bnNpZ25lZCBzaG9ydCByID0gMDsKKworCWNoYW4gPSBDUl9DSEFOKGNvbWVkaUNoYW4pOworCXJhbmdlID0gQ1JfUkFOR0UoY29tZWRpQ2hhbik7CisJYXJlZiA9IENSX0FSRUYoY29tZWRpQ2hhbik7CisKKwlyIHw9IGNoYW4gJiAweGY7CisKKwkvKiBOb3RlOiB3ZSBhbHNvIHNldHVwIHRoZSBjaGFubmVsIGxpc3QgYmlwb2xhciBmbGFnIGFycmF5ICovCisJaWYgKHJhbmdlIDwgdGhpc2JvYXJkLT5yYW5nZTEwU3RhcnQpIHsJLyogZmlyc3QgYmF0Y2ggYXJlICstNSAqLworCQlyIHw9IDB4MDAwOwkvKiArLTUgcmFuZ2UgKi8KKwkJciB8PSAocmFuZ2UgJiAweDcpIDw8IDQ7CS8qIGdhaW4gKi8KKwkJQ0hBTl9BUlJBWV9TRVQoZGV2cHJpdi0+Y2hhbkJpcG9sYXIsIGNoYW5JbmRleCk7CisJfSBlbHNlIGlmIChyYW5nZSA8IHRoaXNib2FyZC0+cmFuZ2VVbmlTdGFydCkgewkvKiBzZWNvbmQgYmF0Y2ggYXJlICstMTAgKi8KKwkJciB8PSAweDEwMDsJLyogKy0xMCByYW5nZSAqLworCQlyIHw9ICgocmFuZ2UgLSB0aGlzYm9hcmQtPnJhbmdlMTBTdGFydCkgJiAweDcpIDw8IDQ7CS8qIGdhaW4gKi8KKwkJQ0hBTl9BUlJBWV9TRVQoZGV2cHJpdi0+Y2hhbkJpcG9sYXIsIGNoYW5JbmRleCk7CisJfSBlbHNlIHsJCS8qIGxhc3QgYmF0Y2ggaXMgKzEwICovCisJCXIgfD0gMHgyMDA7CS8qICsxMCByYW5nZSAqLworCQlyIHw9ICgocmFuZ2UgLSB0aGlzYm9hcmQtPnJhbmdlVW5pU3RhcnQpICYgMHg3KSA8PCA0OwkvKiBnYWluICovCisJCUNIQU5fQVJSQVlfQ0xFQVIoZGV2cHJpdi0+Y2hhbkJpcG9sYXIsIGNoYW5JbmRleCk7CisJfQorCisJc3dpdGNoIChhcmVmKSB7CisJY2FzZSBBUkVGX0dST1VORDoJLyogb24tYm9hcmQgZ3JvdW5kICovCisJCWJyZWFrOworCisJY2FzZSBBUkVGX0NPTU1PTjoKKwkJciB8PSAweDgwOwkvKiByZWYgZXh0ZXJuYWwgYW5hbG9nIGNvbW1vbiAqLworCQlicmVhazsKKworCWNhc2UgQVJFRl9ESUZGOgorCQlyIHw9IDB4NDAwOwkvKiBkaWZmZXJlbnRpYWwgaW5wdXRzICovCisJCWJyZWFrOworCisJY2FzZSBBUkVGX09USEVSOgkvKiA/Pz8gKi8KKwkJYnJlYWs7CisJfQorCS8qcHJpbnRrICgiY2hhbj0lZCByPSVkIGE9JWQgLT4gMHgleFxuIiwKKwkgICBjaGFuLCByYW5nZSwgYXJlZiwgcik7ICovCisJcmV0dXJuIHI7Cit9CisKKy8qCisgIFNldHVwIHRoZSBjaGFubmVsLWdhaW4gdGFibGUgZnJvbSBhIGNvbWVkaSBsaXN0CisqLworc3RhdGljIHZvaWQgcnRkX2xvYWRfY2hhbm5lbGdhaW5fbGlzdChjb21lZGlfZGV2aWNlICogZGV2LAorCXVuc2lnbmVkIGludCBuX2NoYW4sIHVuc2lnbmVkIGludCAqbGlzdCkKK3sKKwlpZiAobl9jaGFuID4gMSkgewkvKiBzZXR1cCBjaGFubmVsIGdhaW4gdGFibGUgKi8KKwkJaW50IGlpOworCQlSdGRDbGVhckNHVChkZXYpOworCQlSdGRFbmFibGVDR1QoZGV2LCAxKTsJLyogZW5hYmxlIHRhYmxlICovCisJCWZvciAoaWkgPSAwOyBpaSA8IG5fY2hhbjsgaWkrKykgeworCQkJUnRkV3JpdGVDR1RhYmxlKGRldiwgcnRkQ29udmVydENoYW5HYWluKGRldiwgbGlzdFtpaV0sCisJCQkJCWlpKSk7CisJCX0KKwl9IGVsc2UgewkJLyoganVzdCB1c2UgdGhlIGNoYW5uZWwgZ2FpbiBsYXRjaCAqLworCQlSdGRFbmFibGVDR1QoZGV2LCAwKTsJLyogZGlzYWJsZSB0YWJsZSwgZW5hYmxlIGxhdGNoICovCisJCVJ0ZFdyaXRlQ0dMYXRjaChkZXYsIHJ0ZENvbnZlcnRDaGFuR2FpbihkZXYsIGxpc3RbMF0sIDApKTsKKwl9Cit9CisKKy8qIGRldGVybWluZSBmaWZvIHNpemUgYnkgZG9pbmcgYWRjIGNvbnZlcnNpb25zIHVudGlsIHRoZSBmaWZvIGhhbGYKK2VtcHR5IHN0YXR1cyBmbGFnIGNsZWFycyAqLworc3RhdGljIGludCBydGQ1MjBfcHJvYmVfZmlmb19kZXB0aChjb21lZGlfZGV2aWNlICpkZXYpCit7CisJbHNhbXBsX3QgY2hhbnNwZWMgPSBDUl9QQUNLKDAsIDAsIEFSRUZfR1JPVU5EKTsKKwl1bnNpZ25lZCBpOworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBsaW1pdCA9IDB4MjAwMDsKKwl1bnNpZ25lZCBmaWZvX3NpemUgPSAwOworCisJUnRkQWRjQ2xlYXJGaWZvKGRldik7CisJcnRkX2xvYWRfY2hhbm5lbGdhaW5fbGlzdChkZXYsIDEsICZjaGFuc3BlYyk7CisJUnRkQWRjQ29udmVyc2lvblNvdXJjZShkZXYsIDApOwkvKiBzb2Z0d2FyZSAqLworCS8qIGNvbnZlcnQgIHNhbXBsZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbGltaXQ7ICsraSkgeworCQl1bnNpZ25lZCBmaWZvX3N0YXR1czsKKwkJLyogdHJpZ2dlciBjb252ZXJzaW9uICovCisJCVJ0ZEFkY1N0YXJ0KGRldik7CisJCWNvbWVkaV91ZGVsYXkoMSk7CisJCWZpZm9fc3RhdHVzID0gUnRkRmlmb1N0YXR1cyhkZXYpOworCQlpZigoZmlmb19zdGF0dXMgJiBGU19BRENfSEVNUFRZKSA9PSAwKSB7CisJCQlmaWZvX3NpemUgPSAyICogaTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmKGkgPT0gbGltaXQpCisJeworCQlydF9wcmludGsoIlxuY29tZWRpOiAlczogZmFpbGVkIHRvIHByb2JlIGZpZm8gc2l6ZS5cbiIsIERSVl9OQU1FKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCVJ0ZEFkY0NsZWFyRmlmbyhkZXYpOworCWlmKGZpZm9fc2l6ZSAhPSAweDQwMCB8fCBmaWZvX3NpemUgIT0gMHgyMDAwKQorCXsKKwkJcnRfcHJpbnRrKCJcbmNvbWVkaTogJXM6IHVuZXhwZWN0ZWQgZmlmbyBzaXplIG9mICVpLCBleHBlY3RlZCAxMDI0IG9yIDgxOTIuXG4iLAorCQkJRFJWX05BTUUsIGZpZm9fc2l6ZSk7CisJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gZmlmb19zaXplOworfQorCisvKgorICAiaW5zdHJ1Y3Rpb25zIiByZWFkL3dyaXRlIGRhdGEgaW4gIm9uZS1zaG90IiBvciAic29mdHdhcmUtdHJpZ2dlcmVkIgorICBtb2RlIChzaW1wbGVzdCBjYXNlKS4KKyAgVGhpcyBkb2VzbnQgdXNlIGludGVycnVwdHMuCisKKyAgTm90ZSwgd2UgZG9uJ3QgZG8gYW55IHNldHRsaW5nIGRlbGF5cy4gIFVzZSBhIGluc3RydWN0aW9uIGxpc3QgdG8KKyAgc2VsZWN0LCBkZWxheSwgdGhlbiByZWFkLgorICovCitzdGF0aWMgaW50IHJ0ZF9haV9yaW5zbihjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCBjb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKwlpbnQgbiwgaWk7CisJaW50IHN0YXQ7CisKKwkvKiBjbGVhciBhbnkgb2xkIGZpZm8gZGF0YSAqLworCVJ0ZEFkY0NsZWFyRmlmbyhkZXYpOworCisJLyogd3JpdGUgY2hhbm5lbCB0byBtdWx0aXBsZXhlciBhbmQgY2xlYXIgY2hhbm5lbCBnYWluIHRhYmxlICovCisJcnRkX2xvYWRfY2hhbm5lbGdhaW5fbGlzdChkZXYsIDEsICZpbnNuLT5jaGFuc3BlYyk7CisKKwkvKiBzZXQgY29udmVyc2lvbiBzb3VyY2UgKi8KKwlSdGRBZGNDb252ZXJzaW9uU291cmNlKGRldiwgMCk7CS8qIHNvZnR3YXJlICovCisKKwkvKiBjb252ZXJ0IG4gc2FtcGxlcyAqLworCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspIHsKKwkJczE2IGQ7CisJCS8qIHRyaWdnZXIgY29udmVyc2lvbiAqLworCQlSdGRBZGNTdGFydChkZXYpOworCisJCWZvciAoaWkgPSAwOyBpaSA8IFJURF9BRENfVElNRU9VVDsgKytpaSkgeworCQkJc3RhdCA9IFJ0ZEZpZm9TdGF0dXMoZGV2KTsKKwkJCWlmIChzdGF0ICYgRlNfQURDX05PVF9FTVBUWSkJLyogMSAtPiBub3QgZW1wdHkgKi8KKwkJCQlicmVhazsKKwkJCVdBSVRfUVVJRVRMWTsKKwkJfQorCQlpZiAoaWkgPj0gUlREX0FEQ19USU1FT1VUKSB7CisJCQlEUFJJTlRLKCJydGQ1MjA6IEVycm9yOiBBREMgbmV2ZXIgZmluaXNoZWQhIEZpZm9TdGF0dXM9MHgleFxuIiwgc3RhdCBeIDB4NjY2Nik7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJfQorCisJCS8qIHJlYWQgZGF0YSAqLworCQlkID0gUnRkQWRjRmlmb0dldChkZXYpOwkvKiBnZXQgMnMgY29tcCB2YWx1ZSAqLworCQkvKnByaW50ayAoInJ0ZDUyMDogR290IDB4JXggYWZ0ZXIgJWQgdXNlY1xuIiwgZCwgaWkrMSk7ICovCisJCWQgPSBkID4+IDM7CS8qIGxvdyAzIGJpdHMgYXJlIG1hcmtlciBsaW5lcyAqLworCQlpZiAoQ0hBTl9BUlJBWV9URVNUKGRldnByaXYtPmNoYW5CaXBvbGFyLCAwKSkgeworCQkJZGF0YVtuXSA9IGQgKyAyMDQ4OwkvKiBjb252ZXJ0IHRvIGNvbWVkaSB1bnNpZ25lZCBkYXRhICovCisJCX0gZWxzZSB7CisJCQlkYXRhW25dID0gZDsKKwkJfQorCX0KKworCS8qIHJldHVybiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgcmVhZC93cml0dGVuICovCisJcmV0dXJuIG47Cit9CisKKy8qCisgIEdldCB3aGF0IHdlIGtub3cgaXMgdGhlcmUuLi4uIEZhc3QhCisgIFRoaXMgdXNlcyAxLzIgdGhlIGJ1cyBjeWNsZXMgb2YgcmVhZF9kcmVncyAoYmVsb3cpLgorCisgIFRoZSBtYW51YWwgY2xhaW1zIHRoYXQgd2UgY2FuIGRvIGEgbHdvcmQgcmVhZCwgYnV0IGl0IGRvZXNuJ3Qgd29yayBoZXJlLgorKi8KK3N0YXRpYyBpbnQgYWlfcmVhZF9uKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLCBpbnQgY291bnQpCit7CisJaW50IGlpOworCisJZm9yIChpaSA9IDA7IGlpIDwgY291bnQ7IGlpKyspIHsKKwkJc2FtcGxfdCBzYW1wbGU7CisJCXMxNiBkOworCisJCWlmICgwID09IGRldnByaXYtPmFpQ291bnQpIHsJLyogZG9uZSAqLworCQkJZCA9IFJ0ZEFkY0ZpZm9HZXQoZGV2KTsJLyogUmVhZCBOIGFuZCBkaXNjYXJkICovCisJCQljb250aW51ZTsKKwkJfQorI2lmIDAKKwkJaWYgKDAgPT0gKFJ0ZEZpZm9TdGF0dXMoZGV2KSAmIEZTX0FEQ19OT1RfRU1QVFkpKSB7CS8qIERFQlVHICovCisJCQlEUFJJTlRLKCJjb21lZGk6IFJFQUQgT09QUyBvbiAlZCBvZiAlZFxuIiwgaWkgKyAxLAorCQkJCWNvdW50KTsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYKKwkJZCA9IFJ0ZEFkY0ZpZm9HZXQoZGV2KTsJLyogZ2V0IDJzIGNvbXAgdmFsdWUgKi8KKworCQlkID0gZCA+PiAzOwkvKiBsb3cgMyBiaXRzIGFyZSBtYXJrZXIgbGluZXMgKi8KKwkJaWYgKENIQU5fQVJSQVlfVEVTVChkZXZwcml2LT5jaGFuQmlwb2xhciwgcy0+YXN5bmMtPmN1cl9jaGFuKSkgeworCQkJc2FtcGxlID0gZCArIDIwNDg7CS8qIGNvbnZlcnQgdG8gY29tZWRpIHVuc2lnbmVkIGRhdGEgKi8KKwkJfSBlbHNlIHsKKwkJCXNhbXBsZSA9IGQ7CisJCX0KKwkJaWYgKCFjb21lZGlfYnVmX3B1dChzLT5hc3luYywgc2FtcGxlKSkKKwkJCXJldHVybiAtMTsKKworCQlpZiAoZGV2cHJpdi0+YWlDb3VudCA+IDApCS8qIDwgMCwgbWVhbnMgcmVhZCBmb3JldmVyICovCisJCQlkZXZwcml2LT5haUNvdW50LS07CisJfQorCXJldHVybiAwOworfQorCisvKgorICB1bmtub3duIGFtb3V0IG9mIGRhdGEgaXMgd2FpdGluZyBpbiBmaWZvLgorKi8KK3N0YXRpYyBpbnQgYWlfcmVhZF9kcmVncyhjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcykKK3sKKwl3aGlsZSAoUnRkRmlmb1N0YXR1cyhkZXYpICYgRlNfQURDX05PVF9FTVBUWSkgewkvKiAxIC0+IG5vdCBlbXB0eSAqLworCQlzYW1wbF90IHNhbXBsZTsKKwkJczE2IGQgPSBSdGRBZGNGaWZvR2V0KGRldik7CS8qIGdldCAycyBjb21wIHZhbHVlICovCisKKwkJaWYgKDAgPT0gZGV2cHJpdi0+YWlDb3VudCkgewkvKiBkb25lICovCisJCQljb250aW51ZTsJLyogcmVhZCByZXN0ICovCisJCX0KKworCQlkID0gZCA+PiAzOwkvKiBsb3cgMyBiaXRzIGFyZSBtYXJrZXIgbGluZXMgKi8KKwkJaWYgKENIQU5fQVJSQVlfVEVTVChkZXZwcml2LT5jaGFuQmlwb2xhciwgcy0+YXN5bmMtPmN1cl9jaGFuKSkgeworCQkJc2FtcGxlID0gZCArIDIwNDg7CS8qIGNvbnZlcnQgdG8gY29tZWRpIHVuc2lnbmVkIGRhdGEgKi8KKwkJfSBlbHNlIHsKKwkJCXNhbXBsZSA9IGQ7CisJCX0KKwkJaWYgKCFjb21lZGlfYnVmX3B1dChzLT5hc3luYywgc2FtcGxlKSkKKwkJCXJldHVybiAtMTsKKworCQlpZiAoZGV2cHJpdi0+YWlDb3VudCA+IDApCS8qIDwgMCwgbWVhbnMgcmVhZCBmb3JldmVyICovCisJCQlkZXZwcml2LT5haUNvdW50LS07CisJfQorCXJldHVybiAwOworfQorCisjaWZkZWYgVVNFX0RNQQorLyoKKyAgVGVybWluYXRlIGEgRE1BIHRyYW5zZmVyIGFuZCB3YWl0IGZvciBldmVyeXRoaW5nIHRvIHF1aWV0IGRvd24KKyovCit2b2lkIGFib3J0X2RtYShjb21lZGlfZGV2aWNlICogZGV2LCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sJCQkJLyogRE1BIGNoYW5uZWwgMCwgMSAqLworCXVuc2lnbmVkIGxvbmcgZG1hX2NzX2FkZHI7CS8qIHRoZSBjb250cm9sL3N0YXR1cyByZWdpc3RlciAqLworCXVpbnQ4X3Qgc3RhdHVzOworCXVuc2lnbmVkIGludCBpaTsKKwkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkbWFfY3NfYWRkciA9ICh1bnNpZ25lZCBsb25nKWRldnByaXYtPmxjZmcKKwkJKyAoKGNoYW5uZWwgPT0gMCkgPyBMQ0ZHX0RNQUNTUjAgOiBMQ0ZHX0RNQUNTUjEpOworCisJLy8gc3BpbmxvY2sgZm9yIHBseCBkbWEgY29udHJvbC9zdGF0dXMgcmVnCisJLy9jb21lZGlfc3Bpbl9sb2NrX2lycXNhdmUoICZkZXYtPnNwaW5sb2NrLCBmbGFncyApOworCisJLy8gYWJvcnQgZG1hIHRyYW5zZmVyIGlmIG5lY2Vzc2FyeQorCXN0YXR1cyA9IHJlYWRiKGRtYV9jc19hZGRyKTsKKwlpZiAoKHN0YXR1cyAmIFBMWF9ETUFfRU5fQklUKSA9PSAwKSB7CS8qIG5vdCBlbmFibGVkIChFcnJvcj8pICovCisJCURQUklOVEsoInJ0ZDUyMDogQWJvcnREbWEgb24gbm9uLWFjdGl2ZSBjaGFubmVsICVkICgweCV4KVxuIiwKKwkJCWNoYW5uZWwsIHN0YXR1cyk7CisJCWdvdG8gYWJvcnREbWFFeGl0OworCX0KKworCS8qIHdhaXQgdG8gbWFrZSBzdXJlIGRvbmUgYml0IGlzIHplcm8gKG5lZWRlZD8pICovCisJZm9yIChpaSA9IDA7IChzdGF0dXMgJiBQTFhfRE1BX0RPTkVfQklUKSAmJiBpaSA8IFJURF9ETUFfVElNRU9VVDsgaWkrKykgeworCQlXQUlUX1FVSUVUTFk7CisJCXN0YXR1cyA9IHJlYWRiKGRtYV9jc19hZGRyKTsKKwl9CisJaWYgKHN0YXR1cyAmIFBMWF9ETUFfRE9ORV9CSVQpIHsKKwkJcHJpbnRrKCJydGQ1MjA6IFRpbWVvdXQgd2FpdGluZyBmb3IgZG1hICVpIGRvbmUgY2xlYXJcbiIsCisJCQljaGFubmVsKTsKKwkJZ290byBhYm9ydERtYUV4aXQ7CisJfQorCisJLyogZGlzYWJsZSBjaGFubmVsIChyZXF1aXJlZCkgKi8KKwl3cml0ZWIoMCwgZG1hX2NzX2FkZHIpOworCWNvbWVkaV91ZGVsYXkoMSk7CS8qIG5lZWRlZD8/ICovCisJLyogc2V0IGFib3J0IGJpdCBmb3IgY2hhbm5lbCAqLworCXdyaXRlYihQTFhfRE1BX0FCT1JUX0JJVCwgZG1hX2NzX2FkZHIpOworCisJLy8gd2FpdCBmb3IgZG1hIGRvbmUgYml0IHRvIGJlIHNldAorCXN0YXR1cyA9IHJlYWRiKGRtYV9jc19hZGRyKTsKKwlmb3IgKGlpID0gMDsKKwkJKHN0YXR1cyAmIFBMWF9ETUFfRE9ORV9CSVQpID09IDAgJiYgaWkgPCBSVERfRE1BX1RJTUVPVVQ7CisJCWlpKyspIHsKKwkJc3RhdHVzID0gcmVhZGIoZG1hX2NzX2FkZHIpOworCQlXQUlUX1FVSUVUTFk7CisJfQorCWlmICgoc3RhdHVzICYgUExYX0RNQV9ET05FX0JJVCkgPT0gMCkgeworCQlwcmludGsoInJ0ZDUyMDogVGltZW91dCB3YWl0aW5nIGZvciBkbWEgJWkgZG9uZSBzZXRcbiIsCisJCQljaGFubmVsKTsKKwl9CisKKyAgICAgIGFib3J0RG1hRXhpdDoKKwkvL2NvbWVkaV9zcGluX3VubG9ja19pcnFyZXN0b3JlKCAmZGV2LT5zcGlubG9jaywgZmxhZ3MgKTsKK30KKworLyoKKyAgUHJvY2VzcyB3aGF0IGlzIGluIHRoZSBETUEgdHJhbnNmZXIgYnVmZmVyIGFuZCBwYXNzIHRvIGNvbWVkaQorICBOb3RlOiB0aGlzIGlzIG5vdCByZS1lbnRyYW50CisqLworc3RhdGljIGludCBhaV9wcm9jZXNzX2RtYShjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcykKK3sKKwlpbnQgaWksIG47CisJczE2ICpkcDsKKworCWlmIChkZXZwcml2LT5haUNvdW50ID09IDApCS8qIHRyYW5zZmVyIGFscmVhZHkgY29tcGxldGUgKi8KKwkJcmV0dXJuIDA7CisKKwlkcCA9IGRldnByaXYtPmRtYTBCdWZmW2RldnByaXYtPmRtYTBPZmZzZXRdOworCWZvciAoaWkgPSAwOyBpaSA8IGRldnByaXYtPmZpZm9MZW4gLyAyOykgewkvKiBjb252ZXJ0IHNhbXBsZXMgKi8KKwkJc2FtcGxfdCBzYW1wbGU7CisKKwkJaWYgKENIQU5fQVJSQVlfVEVTVChkZXZwcml2LT5jaGFuQmlwb2xhciwgcy0+YXN5bmMtPmN1cl9jaGFuKSkgeworCQkJc2FtcGxlID0gKCpkcCA+PiAzKSArIDIwNDg7CS8qIGNvbnZlcnQgdG8gY29tZWRpIHVuc2lnbmVkIGRhdGEgKi8KKwkJfSBlbHNlIHsKKwkJCXNhbXBsZSA9ICpkcCA+PiAzOwkvKiBsb3cgMyBiaXRzIGFyZSBtYXJrZXIgbGluZXMgKi8KKwkJfQorCQkqZHArKyA9IHNhbXBsZTsJLyogcHV0IHByb2Nlc3NlZCB2YWx1ZSBiYWNrICovCisKKwkJaWYgKCsrcy0+YXN5bmMtPmN1cl9jaGFuID49IHMtPmFzeW5jLT5jbWQuY2hhbmxpc3RfbGVuKQorCQkJcy0+YXN5bmMtPmN1cl9jaGFuID0gMDsKKworCQkrK2lpOwkJLyogbnVtYmVyIHJlYWR5IHRvIHRyYW5zZmVyICovCisJCWlmIChkZXZwcml2LT5haUNvdW50ID4gMCkgewkvKiA8IDAsIG1lYW5zIHJlYWQgZm9yZXZlciAqLworCQkJaWYgKC0tZGV2cHJpdi0+YWlDb3VudCA9PSAwKSB7CS8qIGRvbmUgKi8KKwkJCQkvKkRQUklOVEsgKCJydGQ1MjA6IEZpbmFsICVkIHNhbXBsZXNcbiIsIGlpKTsgKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8qIG5vdyBwYXNzIHRoZSB3aG9sZSBhcnJheSB0byB0aGUgY29tZWRpIGJ1ZmZlciAqLworCWRwID0gZGV2cHJpdi0+ZG1hMEJ1ZmZbZGV2cHJpdi0+ZG1hME9mZnNldF07CisJbiA9IGNvbWVkaV9idWZfd3JpdGVfYWxsb2Mocy0+YXN5bmMsIGlpICogc2l6ZW9mKHMxNikpOworCWlmIChuIDwgKGlpICogc2l6ZW9mKHMxNikpKSB7CS8qIGFueSByZXNpZHVhbCBpcyBhbiBlcnJvciAqLworCQlEUFJJTlRLKCJydGQ1MjA6YWlfcHJvY2Vzc19kbWEgYnVmZmVyIG92ZXJmbG93ICVkIHNhbXBsZXMhXG4iLAorCQkJaWkgLSAobiAvIHNpemVvZihzMTYpKSk7CisJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VSUk9SOworCQlyZXR1cm4gLTE7CisJfQorCWNvbWVkaV9idWZfbWVtY3B5X3RvKHMtPmFzeW5jLCAwLCBkcCwgbik7CisJY29tZWRpX2J1Zl93cml0ZV9mcmVlKHMtPmFzeW5jLCBuKTsKKworCS8qIGFsd2F5cyBhdCBsZWFzdCAxIHNjYW4gLS0gMS8yIEZJRk8gaXMgbGFyZ2VyIHRoYW4gb3VyIG1heCBzY2FuIGxpc3QgKi8KKwlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9CTE9DSyB8IENPTUVESV9DQl9FT1M7CisKKwlpZiAoKytkZXZwcml2LT5kbWEwT2Zmc2V0ID49IERNQV9DSEFJTl9DT1VOVCkgewkvKiBuZXh0IGJ1ZmZlciAqLworCQlkZXZwcml2LT5kbWEwT2Zmc2V0ID0gMDsKKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogVVNFX0RNQSAqLworCisvKgorICBIYW5kbGUgYWxsIHJ0ZDUyMCBpbnRlcnJ1cHRzLgorICBSdW5zIGF0b21pY2FsbHkgYW5kIGlzIG5ldmVyIHJlLWVudGVyZWQuCisgIFRoaXMgaXMgYSAic2xvdyBoYW5kbGVyIjsgIG90aGVyIGludGVycnVwdHMgbWF5IGJlIGFjdGl2ZS4KKyAgVGhlIGRhdGEgY29udmVyc2lvbiBtYXkgc29tZWRheSBoYXBwZW4gaW4gYSAiYm90dG9tIGhhbGYiLgorKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBydGRfaW50ZXJydXB0KGludCBpcnEsCS8qIGludGVycnVwdCBudW1iZXIgKGlnbm9yZWQpICovCisJdm9pZCAqZAkJCS8qIG91ciBkYXRhICovCisJUFRfUkVHU19BUkcpCit7CQkJCS8qIGNwdSBjb250ZXh0IChpZ25vcmVkKSAqLworCWNvbWVkaV9kZXZpY2UgKmRldiA9IGQ7CS8qIG11c3QgYmUgY2FsbGVkICJkZXYiIGZvciBkZXZwcml2ICovCisJdTE2IHN0YXR1czsKKwl1MTYgZmlmb1N0YXR1czsKKwljb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5zdWJkZXZpY2VzICsgMDsJLyogYW5hbG9nIGluIHN1YmRldmljZSAqLworCisJaWYgKCFkZXYtPmF0dGFjaGVkKSB7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlkZXZwcml2LT5pbnRDb3VudCsrOwkvKiBERUJVRyBzdGF0aXN0aWNzICovCisKKwlmaWZvU3RhdHVzID0gUnRkRmlmb1N0YXR1cyhkZXYpOworCS8qIGNoZWNrIGZvciBGSUZPIGZ1bGwsIHRoaXMgYXV0b21hdGljYWxseSBoYWx0cyB0aGUgQURDISAqLworCWlmICghKGZpZm9TdGF0dXMgJiBGU19BRENfTk9UX0ZVTEwpKSB7CS8qIDAgLT4gZnVsbCAqLworCQlEUFJJTlRLKCJydGQ1MjA6IEZJRk8gZnVsbCEgZmlmb19zdGF0dXM9MHgleFxuIiwgKGZpZm9TdGF0dXMgXiAweDY2NjYpICYgMHg3Nzc3KTsJLyogc2hvdWxkIGJlIGFsbCAwcyAqLworCQlnb3RvIGFib3J0VHJhbnNmZXI7CisJfQorI2lmZGVmIFVTRV9ETUEKKwlpZiAoZGV2cHJpdi0+ZmxhZ3MgJiBETUEwX0FDVElWRSkgewkvKiBDaGVjayBETUEgKi8KKwkJdTMyIGlzdGF0dXMgPSBSdGRQbHhJbnRlcnJ1cHRSZWFkKGRldik7CisKKwkJaWYgKGlzdGF0dXMgJiBJQ1NfRE1BMF9BKSB7CisJCQlpZiAoYWlfcHJvY2Vzc19kbWEoZGV2LCBzKSA8IDApIHsKKwkJCQlEUFJJTlRLKCJydGQ1MjA6IGNvbWVkaSByZWFkIGJ1ZmZlciBvdmVyZmxvdyAoRE1BKSB3aXRoICVsZCB0byBnbyFcbiIsIGRldnByaXYtPmFpQ291bnQpOworCQkJCVJ0ZERtYTBDb250cm9sKGRldiwKKwkJCQkJKGRldnByaXYtPgorCQkJCQkJZG1hMENvbnRyb2wgJgorCQkJCQkJflBMWF9ETUFfU1RBUlRfQklUKQorCQkJCQl8IFBMWF9DTEVBUl9ETUFfSU5UUl9CSVQpOworCQkJCWdvdG8gYWJvcnRUcmFuc2ZlcjsKKwkJCX0KKworCQkJLypEUFJJTlRLICgicnRkNTIwOiBETUEgdHJhbnNmZXI6ICVsZCB0byBnbywgaXN0YXR1cyAleFxuIiwKKwkJCSAgIGRldnByaXYtPmFpQ291bnQsIGlzdGF0dXMpOyAqLworCQkJUnRkRG1hMENvbnRyb2woZGV2LAorCQkJCShkZXZwcml2LT5kbWEwQ29udHJvbCAmIH5QTFhfRE1BX1NUQVJUX0JJVCkKKwkJCQl8IFBMWF9DTEVBUl9ETUFfSU5UUl9CSVQpOworCQkJaWYgKDAgPT0gZGV2cHJpdi0+YWlDb3VudCkgewkvKiBjb3VudGVkIGRvd24gKi8KKwkJCQlEUFJJTlRLKCJydGQ1MjA6IFNhbXBsZXMgRG9uZSAoRE1BKS5cbiIpOworCQkJCWdvdG8gdHJhbnNmZXJEb25lOworCQkJfQorCQkJY29tZWRpX2V2ZW50KGRldiwgcyk7CisJCX0gZWxzZSB7CisJCQkvKkRQUklOVEsgKCJydGQ1MjA6IE5vIERNQSByZWFkeTogaXN0YXR1cyAleFxuIiwgaXN0YXR1cyk7ICovCisJCX0KKwl9CisJLyogRmFsbCB0aHJvdWdoIGFuZCBjaGVjayBmb3Igb3RoZXIgaW50ZXJydXB0IHNvdXJjZXMgKi8KKyNlbmRpZiAvKiBVU0VfRE1BICovCisKKwlzdGF0dXMgPSBSdGRJbnRlcnJ1cHRTdGF0dXMoZGV2KTsKKwkvKiBpZiBpbnRlcnJ1cHQgd2FzIG5vdCBjYXVzZWQgYnkgb3VyIGJvYXJkLCBvciBoYW5kbGVkIGFib3ZlICovCisJaWYgKDAgPT0gc3RhdHVzKSB7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlpZiAoc3RhdHVzICYgSVJRTV9BRENfQUJPVVRfQ05UKSB7CS8qIHNhbXBsZSBjb3VudCAtPiByZWFkIEZJRk8gKi8KKwkJLyogc2luY2UgdGhlIHByaW9yaXR5IGludGVycnVwdCBjb250cm9sbGVyIG1heSBoYXZlIHF1ZXVlZCBhIHNhbXBsZQorCQkgICBjb3VudGVyIGludGVycnVwdCwgZXZlbiB0aG91Z2ggd2UgaGF2ZSBhbHJlYWR5IGZpbmlzaGVkLAorCQkgICB3ZSBtdXN0IGhhbmRsZSB0aGUgcG9zc2liaWxpdHkgdGhhdCB0aGVyZSBpcyBubyBkYXRhIGhlcmUgKi8KKwkJaWYgKCEoZmlmb1N0YXR1cyAmIEZTX0FEQ19IRU1QVFkpKSB7CS8qIDAgLT4gMS8yIGZ1bGwgKi8KKwkJCS8qRFBSSU5USygicnRkNTIwOiBTYW1wbGUgaW50LCByZWFkaW5nIDEvMkZJRk8uICBmaWZvX3N0YXR1cyAweCV4XG4iLAorCQkJICAgKGZpZm9TdGF0dXMgXiAweDY2NjYpICYgMHg3Nzc3KTsgKi8KKwkJCWlmIChhaV9yZWFkX24oZGV2LCBzLCBkZXZwcml2LT5maWZvTGVuIC8gMikgPCAwKSB7CisJCQkJRFBSSU5USygicnRkNTIwOiBjb21lZGkgcmVhZCBidWZmZXIgb3ZlcmZsb3cgKDEvMkZJRk8pIHdpdGggJWxkIHRvIGdvIVxuIiwgZGV2cHJpdi0+YWlDb3VudCk7CisJCQkJZ290byBhYm9ydFRyYW5zZmVyOworCQkJfQorCQkJaWYgKDAgPT0gZGV2cHJpdi0+YWlDb3VudCkgewkvKiBjb3VudGVkIGRvd24gKi8KKwkJCQlEUFJJTlRLKCJydGQ1MjA6IFNhbXBsZXMgRG9uZSAoMS8yKS4gZmlmb19zdGF0dXMgd2FzIDB4JXhcbiIsIChmaWZvU3RhdHVzIF4gMHg2NjY2KSAmIDB4Nzc3Nyk7CS8qIHNob3VsZCBiZSBhbGwgMHMgKi8KKwkJCQlnb3RvIHRyYW5zZmVyRG9uZTsKKwkJCX0KKwkJCWNvbWVkaV9ldmVudChkZXYsIHMpOworCQl9IGVsc2UgaWYgKGRldnByaXYtPnRyYW5zQ291bnQgPiAwKSB7CS8qIHJlYWQgb2Z0ZW4gKi8KKwkJCS8qRFBSSU5USygicnRkNTIwOiBTYW1wbGUgaW50LCByZWFkaW5nICVkICBmaWZvX3N0YXR1cyAweCV4XG4iLAorCQkJICAgZGV2cHJpdi0+dHJhbnNDb3VudCwgKGZpZm9TdGF0dXMgXiAweDY2NjYpICYgMHg3Nzc3KTsgKi8KKwkJCWlmIChmaWZvU3RhdHVzICYgRlNfQURDX05PVF9FTVBUWSkgewkvKiAxIC0+IG5vdCBlbXB0eSAqLworCQkJCWlmIChhaV9yZWFkX24oZGV2LCBzLCBkZXZwcml2LT50cmFuc0NvdW50KSA8IDApIHsKKwkJCQkJRFBSSU5USygicnRkNTIwOiBjb21lZGkgcmVhZCBidWZmZXIgb3ZlcmZsb3cgKE4pIHdpdGggJWxkIHRvIGdvIVxuIiwgZGV2cHJpdi0+YWlDb3VudCk7CisJCQkJCWdvdG8gYWJvcnRUcmFuc2ZlcjsKKwkJCQl9CisJCQkJaWYgKDAgPT0gZGV2cHJpdi0+YWlDb3VudCkgewkvKiBjb3VudGVkIGRvd24gKi8KKwkJCQkJRFBSSU5USygicnRkNTIwOiBTYW1wbGVzIERvbmUgKE4pLiBmaWZvX3N0YXR1cyB3YXMgMHgleFxuIiwgKGZpZm9TdGF0dXMgXiAweDY2NjYpICYgMHg3Nzc3KTsKKwkJCQkJZ290byB0cmFuc2ZlckRvbmU7CisJCQkJfQorCQkJCWNvbWVkaV9ldmVudChkZXYsIHMpOworCQkJfQorCQl9IGVsc2UgewkvKiB3YWl0IGZvciAxLzIgRklGTyAob2xkKSAqLworCQkJRFBSSU5USygicnRkNTIwOiBTYW1wbGUgaW50LiAgV2FpdCBmb3IgMS8yLiBmaWZvX3N0YXR1cyAweCV4XG4iLCAoZmlmb1N0YXR1cyBeIDB4NjY2NikgJiAweDc3NzcpOworCQl9CisJfSBlbHNlIHsKKwkJRFBSSU5USygicnRkNTIwOiB1bmtub3duIGludGVycnVwdCBzb3VyY2UhXG4iKTsKKwl9CisKKwlpZiAoMHhmZmZmICYgUnRkSW50ZXJydXB0T3ZlcnJ1blN0YXR1cyhkZXYpKSB7CS8qIGludGVycnVwdCBvdmVycnVuICovCisJCURQUklOVEsoInJ0ZDUyMDogSW50ZXJydXB0IG92ZXJydW4gd2l0aCAlbGQgdG8gZ28hIG92ZXJfc3RhdHVzPTB4JXhcbiIsIGRldnByaXYtPmFpQ291bnQsIDB4ZmZmZiAmIFJ0ZEludGVycnVwdE92ZXJydW5TdGF0dXMoZGV2KSk7CisJCWdvdG8gYWJvcnRUcmFuc2ZlcjsKKwl9CisKKwkvKiBjbGVhciB0aGUgaW50ZXJydXB0ICovCisJUnRkSW50ZXJydXB0Q2xlYXJNYXNrKGRldiwgc3RhdHVzKTsKKwlSdGRJbnRlcnJ1cHRDbGVhcihkZXYpOworCXJldHVybiBJUlFfSEFORExFRDsKKworICAgICAgYWJvcnRUcmFuc2ZlcjoKKwlSdGRBZGNDbGVhckZpZm8oZGV2KTsJLyogY2xlYXJzIGZ1bGwgZmxhZyAqLworCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VSUk9SOworCWRldnByaXYtPmFpQ291bnQgPSAwOwkvKiBzdG9wIGFuZCBkb24ndCB0cmFuc2ZlciBhbnkgbW9yZSAqLworCS8qIGZhbGwgaW50byB0cmFuc2ZlckRvbmUgKi8KKworICAgICAgdHJhbnNmZXJEb25lOgorCVJ0ZFBhY2VyU3RvcFNvdXJjZShkZXYsIDApOwkvKiBzdG9wIG9uIFNPRlRXQVJFIHN0b3AgKi8KKwlSdGRQYWNlclN0b3AoZGV2KTsJLyogU3RvcCBQQUNFUiAqLworCVJ0ZEFkY0NvbnZlcnNpb25Tb3VyY2UoZGV2LCAwKTsJLyogc29mdHdhcmUgdHJpZ2dlciBvbmx5ICovCisJUnRkSW50ZXJydXB0TWFzayhkZXYsIDApOwkvKiBtYXNrIG91dCBTQU1QTEUgKi8KKyNpZmRlZiBVU0VfRE1BCisJaWYgKGRldnByaXYtPmZsYWdzICYgRE1BMF9BQ1RJVkUpIHsKKwkJUnRkUGx4SW50ZXJydXB0V3JpdGUoZGV2LAkvKiBkaXNhYmxlIGFueSBtb3JlIGludGVycnVwdHMgKi8KKwkJCVJ0ZFBseEludGVycnVwdFJlYWQoZGV2KSAmIH5JQ1NfRE1BMF9FKTsKKwkJYWJvcnRfZG1hKGRldiwgMCk7CisJCWRldnByaXYtPmZsYWdzICY9IH5ETUEwX0FDVElWRTsKKwkJLyogaWYgVXNpbmcgRE1BLCB0aGVuIHdlIHNob3VsZCBoYXZlIHJlYWQgZXZlcnl0aGluZyBieSBub3cgKi8KKwkJaWYgKGRldnByaXYtPmFpQ291bnQgPiAwKSB7CisJCQlEUFJJTlRLKCJydGQ1MjA6IExvc3QgRE1BIGRhdGEhICVsZCByZW1haW5cbiIsCisJCQkJZGV2cHJpdi0+YWlDb3VudCk7CisJCX0KKwl9CisjZW5kaWYgLyogVVNFX0RNQSAqLworCisJaWYgKGRldnByaXYtPmFpQ291bnQgPiAwKSB7CS8qIHRoZXJlIHNob3VsZG4ndCBiZSBhbnl0aGluZyBsZWZ0ICovCisJCWZpZm9TdGF0dXMgPSBSdGRGaWZvU3RhdHVzKGRldik7CisJCURQUklOVEsoInJ0ZDUyMDogRmluaXNoaW5nIHVwLiAlbGQgcmVtYWluLCBmaWZvU3RhdD0leFxuIiwgZGV2cHJpdi0+YWlDb3VudCwgKGZpZm9TdGF0dXMgXiAweDY2NjYpICYgMHg3Nzc3KTsJLyogc2hvdWxkIHJlYWQgYWxsIDBzICovCisJCWFpX3JlYWRfZHJlZ3MoZGV2LCBzKTsJLyogcmVhZCBhbnl0aGluZyBsZWZ0IGluIEZJRk8gKi8KKwl9CisKKwlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CS8qIHNpZ25hbCBlbmQgdG8gY29tZWRpICovCisJY29tZWRpX2V2ZW50KGRldiwgcyk7CisKKwkvKiBjbGVhciB0aGUgaW50ZXJydXB0ICovCisJc3RhdHVzID0gUnRkSW50ZXJydXB0U3RhdHVzKGRldik7CisJUnRkSW50ZXJydXB0Q2xlYXJNYXNrKGRldiwgc3RhdHVzKTsKKwlSdGRJbnRlcnJ1cHRDbGVhcihkZXYpOworCisJZmlmb1N0YXR1cyA9IFJ0ZEZpZm9TdGF0dXMoZGV2KTsJLyogREVCVUcgKi8KKwlEUFJJTlRLKCJydGQ1MjA6IEFjcXVpc2l0aW9uIGNvbXBsZXRlLiAlbGQgaW50cywgaW50U3RhdD0leCwgb3ZlclN0YXQ9JXhcbiIsIGRldnByaXYtPmludENvdW50LCBzdGF0dXMsIDB4ZmZmZiAmIFJ0ZEludGVycnVwdE92ZXJydW5TdGF0dXMoZGV2KSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKyNpZiAwCisvKgorICByZXR1cm4gdGhlIG51bWJlciBvZiBzYW1wbGVzIGF2YWlsYWJsZQorKi8KK3N0YXRpYyBpbnQgcnRkX2FpX3BvbGwoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMpCit7CisJLyogVE9ETzogVGhpcyBuZWVkcyB0byBtYXNrIGludGVycnVwdHMsIHJlYWRfZHJlZ3MsIGFuZCB0aGVuIHJlLWVuYWJsZSAqLworCS8qIE5vdCBzdXJlIHdoYXQgdG8gZG8gaWYgRE1BIGlzIGFjdGl2ZSAqLworCXJldHVybiBzLT5hc3luYy0+YnVmX3dyaXRlX2NvdW50IC0gcy0+YXN5bmMtPmJ1Zl9yZWFkX2NvdW50OworfQorI2VuZGlmCisKKy8qCisgIGNtZHRlc3QgdGVzdHMgYSBwYXJ0aWN1bGFyIGNvbW1hbmQgdG8gc2VlIGlmIGl0IGlzIHZhbGlkLgorICBVc2luZyB0aGUgY21kdGVzdCBpb2N0bCwgYSB1c2VyIGNhbiBjcmVhdGUgYSB2YWxpZCBjbWQKKyAgYW5kIHRoZW4gaGF2ZSBpdCBleGVjdXRlZCBieSB0aGUgY21kIGlvY3RsIChhc3luY3Jvbm91c2x5KS4KKworICBjbWR0ZXN0IHJldHVybnMgMSwyLDMsNCBvciAwLCBkZXBlbmRpbmcgb24gd2hpY2ggdGVzdHMKKyAgdGhlIGNvbW1hbmQgcGFzc2VzLgorKi8KKworc3RhdGljIGludCBydGRfYWlfY21kdGVzdChjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCBjb21lZGlfY21kICogY21kKQoreworCWludCBlcnIgPSAwOworCWludCB0bXA7CisKKwkvKiBzdGVwIDE6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLworCisJdG1wID0gY21kLT5zdGFydF9zcmM7CisJY21kLT5zdGFydF9zcmMgJj0gVFJJR19OT1c7CisJaWYgKCFjbWQtPnN0YXJ0X3NyYyB8fCB0bXAgIT0gY21kLT5zdGFydF9zcmMpIHsKKwkJZXJyKys7CisJfQorCisJdG1wID0gY21kLT5zY2FuX2JlZ2luX3NyYzsKKwljbWQtPnNjYW5fYmVnaW5fc3JjICY9IFRSSUdfVElNRVIgfCBUUklHX0VYVDsKKwlpZiAoIWNtZC0+c2Nhbl9iZWdpbl9zcmMgfHwgdG1wICE9IGNtZC0+c2Nhbl9iZWdpbl9zcmMpIHsKKwkJZXJyKys7CisJfQorCisJdG1wID0gY21kLT5jb252ZXJ0X3NyYzsKKwljbWQtPmNvbnZlcnRfc3JjICY9IFRSSUdfVElNRVIgfCBUUklHX0VYVDsKKwlpZiAoIWNtZC0+Y29udmVydF9zcmMgfHwgdG1wICE9IGNtZC0+Y29udmVydF9zcmMpIHsKKwkJZXJyKys7CisJfQorCisJdG1wID0gY21kLT5zY2FuX2VuZF9zcmM7CisJY21kLT5zY2FuX2VuZF9zcmMgJj0gVFJJR19DT1VOVDsKKwlpZiAoIWNtZC0+c2Nhbl9lbmRfc3JjIHx8IHRtcCAhPSBjbWQtPnNjYW5fZW5kX3NyYykgeworCQllcnIrKzsKKwl9CisKKwl0bXAgPSBjbWQtPnN0b3Bfc3JjOworCWNtZC0+c3RvcF9zcmMgJj0gVFJJR19DT1VOVCB8IFRSSUdfTk9ORTsKKwlpZiAoIWNtZC0+c3RvcF9zcmMgfHwgdG1wICE9IGNtZC0+c3RvcF9zcmMpIHsKKwkJZXJyKys7CisJfQorCisJaWYgKGVycikKKwkJcmV0dXJuIDE7CisKKwkvKiBzdGVwIDI6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZQorCSAgIGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCisJLyogbm90ZSB0aGF0IG11dHVhbCBjb21wYXRpYmxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUgKi8KKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX1RJTUVSICYmCisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19FWFQpIHsKKwkJZXJyKys7CisJfQorCWlmIChjbWQtPmNvbnZlcnRfc3JjICE9IFRSSUdfVElNRVIgJiYgY21kLT5jb252ZXJ0X3NyYyAhPSBUUklHX0VYVCkgeworCQllcnIrKzsKKwl9CisJaWYgKGNtZC0+c3RvcF9zcmMgIT0gVFJJR19DT1VOVCAmJiBjbWQtPnN0b3Bfc3JjICE9IFRSSUdfTk9ORSkgeworCQllcnIrKzsKKwl9CisKKwlpZiAoZXJyKSB7CisJCXJldHVybiAyOworCX0KKworCS8qIHN0ZXAgMzogbWFrZSBzdXJlIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IGNvbXBhdGlibGUgKi8KKworCWlmIChjbWQtPnN0YXJ0X2FyZyAhPSAwKSB7CisJCWNtZC0+c3RhcnRfYXJnID0gMDsKKwkJZXJyKys7CisJfQorCisJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgeworCQkvKiBOb3RlOiB0aGVzZSBhcmUgdGltZSBwZXJpb2RzLCBub3QgYWN0dWFsIHJhdGVzICovCisJCWlmICgxID09IGNtZC0+Y2hhbmxpc3RfbGVuKSB7CS8qIG5vIHNjYW5uaW5nICovCisJCQlpZiAoY21kLT5zY2FuX2JlZ2luX2FyZyA8IFJURF9NQVhfU1BFRURfMSkgeworCQkJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPSBSVERfTUFYX1NQRUVEXzE7CisJCQkJcnRkX25zX3RvX3RpbWVyKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJCQlUUklHX1JPVU5EX1VQKTsKKwkJCQllcnIrKzsKKwkJCX0KKwkJCWlmIChjbWQtPnNjYW5fYmVnaW5fYXJnID4gUlREX01JTl9TUEVFRF8xKSB7CisJCQkJY21kLT5zY2FuX2JlZ2luX2FyZyA9IFJURF9NSU5fU1BFRURfMTsKKwkJCQlydGRfbnNfdG9fdGltZXIoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCisJCQkJCVRSSUdfUk9VTkRfRE9XTik7CisJCQkJZXJyKys7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoY21kLT5zY2FuX2JlZ2luX2FyZyA8IFJURF9NQVhfU1BFRUQpIHsKKwkJCQljbWQtPnNjYW5fYmVnaW5fYXJnID0gUlREX01BWF9TUEVFRDsKKwkJCQlydGRfbnNfdG9fdGltZXIoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCisJCQkJCVRSSUdfUk9VTkRfVVApOworCQkJCWVycisrOworCQkJfQorCQkJaWYgKGNtZC0+c2Nhbl9iZWdpbl9hcmcgPiBSVERfTUlOX1NQRUVEKSB7CisJCQkJY21kLT5zY2FuX2JlZ2luX2FyZyA9IFJURF9NSU5fU1BFRUQ7CisJCQkJcnRkX25zX3RvX3RpbWVyKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJCQlUUklHX1JPVU5EX0RPV04pOworCQkJCWVycisrOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJLyogZXh0ZXJuYWwgdHJpZ2dlciAqLworCQkvKiBzaG91bGQgYmUgbGV2ZWwvZWRnZSwgaGkvbG8gc3BlY2lmaWNhdGlvbiBoZXJlICovCisJCS8qIHNob3VsZCBzcGVjaWZ5IG11bHRpcGxlIGV4dGVybmFsIHRyaWdnZXJzICovCisJCWlmIChjbWQtPnNjYW5fYmVnaW5fYXJnID4gOSkgeworCQkJY21kLT5zY2FuX2JlZ2luX2FyZyA9IDk7CisJCQllcnIrKzsKKwkJfQorCX0KKwlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCWlmICgxID09IGNtZC0+Y2hhbmxpc3RfbGVuKSB7CS8qIG5vIHNjYW5uaW5nICovCisJCQlpZiAoY21kLT5jb252ZXJ0X2FyZyA8IFJURF9NQVhfU1BFRURfMSkgeworCQkJCWNtZC0+Y29udmVydF9hcmcgPSBSVERfTUFYX1NQRUVEXzE7CisJCQkJcnRkX25zX3RvX3RpbWVyKCZjbWQtPmNvbnZlcnRfYXJnLAorCQkJCQlUUklHX1JPVU5EX1VQKTsKKwkJCQllcnIrKzsKKwkJCX0KKwkJCWlmIChjbWQtPmNvbnZlcnRfYXJnID4gUlREX01JTl9TUEVFRF8xKSB7CisJCQkJY21kLT5jb252ZXJ0X2FyZyA9IFJURF9NSU5fU1BFRURfMTsKKwkJCQlydGRfbnNfdG9fdGltZXIoJmNtZC0+Y29udmVydF9hcmcsCisJCQkJCVRSSUdfUk9VTkRfRE9XTik7CisJCQkJZXJyKys7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoY21kLT5jb252ZXJ0X2FyZyA8IFJURF9NQVhfU1BFRUQpIHsKKwkJCQljbWQtPmNvbnZlcnRfYXJnID0gUlREX01BWF9TUEVFRDsKKwkJCQlydGRfbnNfdG9fdGltZXIoJmNtZC0+Y29udmVydF9hcmcsCisJCQkJCVRSSUdfUk9VTkRfVVApOworCQkJCWVycisrOworCQkJfQorCQkJaWYgKGNtZC0+Y29udmVydF9hcmcgPiBSVERfTUlOX1NQRUVEKSB7CisJCQkJY21kLT5jb252ZXJ0X2FyZyA9IFJURF9NSU5fU1BFRUQ7CisJCQkJcnRkX25zX3RvX3RpbWVyKCZjbWQtPmNvbnZlcnRfYXJnLAorCQkJCQlUUklHX1JPVU5EX0RPV04pOworCQkJCWVycisrOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJLyogZXh0ZXJuYWwgdHJpZ2dlciAqLworCQkvKiBzZWUgYWJvdmUgKi8KKwkJaWYgKGNtZC0+Y29udmVydF9hcmcgPiA5KSB7CisJCQljbWQtPmNvbnZlcnRfYXJnID0gOTsKKwkJCWVycisrOworCQl9CisJfQorCisjaWYgMAorCWlmIChjbWQtPnNjYW5fZW5kX2FyZyAhPSBjbWQtPmNoYW5saXN0X2xlbikgeworCQljbWQtPnNjYW5fZW5kX2FyZyA9IGNtZC0+Y2hhbmxpc3RfbGVuOworCQllcnIrKzsKKwl9CisjZW5kaWYKKwlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKSB7CisJCS8qIFRPRE8gY2hlY2sgZm9yIHJvdW5kaW5nIGVycm9yIGR1ZSB0byBjb3VudGVyIHdyYXAgKi8KKworCX0gZWxzZSB7CisJCS8qIFRSSUdfTk9ORSAqLworCQlpZiAoY21kLT5zdG9wX2FyZyAhPSAwKSB7CisJCQljbWQtPnN0b3BfYXJnID0gMDsKKwkJCWVycisrOworCQl9CisJfQorCisJaWYgKGVycikgeworCQlyZXR1cm4gMzsKKwl9CisKKwkvKiBzdGVwIDQ6IGZpeCB1cCBhbnkgYXJndW1lbnRzICovCisKKwlpZiAoY21kLT5jaGFubGlzdF9sZW4gPiBSVERfTUFYX0NIQU5MSVNUKSB7CisJCWNtZC0+Y2hhbmxpc3RfbGVuID0gUlREX01BWF9DSEFOTElTVDsKKwkJZXJyKys7CisJfQorCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKKwkJdG1wID0gY21kLT5zY2FuX2JlZ2luX2FyZzsKKwkJcnRkX25zX3RvX3RpbWVyKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJY21kLT5mbGFncyAmIFRSSUdfUk9VTkRfTUFTSyk7CisJCWlmICh0bXAgIT0gY21kLT5zY2FuX2JlZ2luX2FyZykgeworCQkJZXJyKys7CisJCX0KKwl9CisJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCQl0bXAgPSBjbWQtPmNvbnZlcnRfYXJnOworCQlydGRfbnNfdG9fdGltZXIoJmNtZC0+Y29udmVydF9hcmcsCisJCQljbWQtPmZsYWdzICYgVFJJR19ST1VORF9NQVNLKTsKKwkJaWYgKHRtcCAhPSBjbWQtPmNvbnZlcnRfYXJnKSB7CisJCQllcnIrKzsKKwkJfQorCQlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSCisJCQkmJiAoY21kLT5zY2FuX2JlZ2luX2FyZworCQkJCTwgKGNtZC0+Y29udmVydF9hcmcgKiBjbWQtPnNjYW5fZW5kX2FyZykpKSB7CisJCQljbWQtPnNjYW5fYmVnaW5fYXJnID0KKwkJCQljbWQtPmNvbnZlcnRfYXJnICogY21kLT5zY2FuX2VuZF9hcmc7CisJCQllcnIrKzsKKwkJfQorCX0KKworCWlmIChlcnIpIHsKKwkJcmV0dXJuIDQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgIEV4ZWN1dGUgYSBhbmFsb2cgaW4gY29tbWFuZCB3aXRoIG1hbnkgcG9zc2libGUgdHJpZ2dlcmluZyBvcHRpb25zLgorICBUaGUgZGF0YSBnZXQgc3RvcmVkIGluIHRoZSBhc3luYyBzdHJ1Y3R1cmUgb2YgdGhlIHN1YmRldmljZS4KKyAgVGhpcyBpcyB1c3VhbGx5IGRvbmUgYnkgYW4gaW50ZXJydXB0IGhhbmRsZXIuCisgIFVzZXJsYW5kIGdldHMgdG8gdGhlIGRhdGEgdXNpbmcgcmVhZCBjYWxscy4KKyovCitzdGF0aWMgaW50IHJ0ZF9haV9jbWQoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMpCit7CisJY29tZWRpX2NtZCAqY21kID0gJnMtPmFzeW5jLT5jbWQ7CisJaW50IHRpbWVyOworCisJLyogc3RvcCBhbnl0aGluZyBjdXJyZW50bHkgcnVubmluZyAqLworCVJ0ZFBhY2VyU3RvcFNvdXJjZShkZXYsIDApOwkvKiBzdG9wIG9uIFNPRlRXQVJFIHN0b3AgKi8KKwlSdGRQYWNlclN0b3AoZGV2KTsJLyogbWFrZSBzdXJlIFBBQ0VSIGlzIHN0b3BwZWQgKi8KKwlSdGRBZGNDb252ZXJzaW9uU291cmNlKGRldiwgMCk7CS8qIHNvZnR3YXJlIHRyaWdnZXIgb25seSAqLworCVJ0ZEludGVycnVwdE1hc2soZGV2LCAwKTsKKyNpZmRlZiBVU0VfRE1BCisJaWYgKGRldnByaXYtPmZsYWdzICYgRE1BMF9BQ1RJVkUpIHsJLyogY2FuY2VsIGFueXRoaW5nIHJ1bm5pbmcgKi8KKwkJUnRkUGx4SW50ZXJydXB0V3JpdGUoZGV2LAkvKiBkaXNhYmxlIGFueSBtb3JlIGludGVycnVwdHMgKi8KKwkJCVJ0ZFBseEludGVycnVwdFJlYWQoZGV2KSAmIH5JQ1NfRE1BMF9FKTsKKwkJYWJvcnRfZG1hKGRldiwgMCk7CisJCWRldnByaXYtPmZsYWdzICY9IH5ETUEwX0FDVElWRTsKKwkJaWYgKFJ0ZFBseEludGVycnVwdFJlYWQoZGV2KSAmIElDU19ETUEwX0EpIHsJLypjbGVhciBwZW5kaW5nIGludCAqLworCQkJUnRkRG1hMENvbnRyb2woZGV2LCBQTFhfQ0xFQVJfRE1BX0lOVFJfQklUKTsKKwkJfQorCX0KKwlSdGREbWEwUmVzZXQoZGV2KTsJLyogcmVzZXQgb25ib2FyZCBzdGF0ZSAqLworI2VuZGlmIC8qIFVTRV9ETUEgKi8KKwlSdGRBZGNDbGVhckZpZm8oZGV2KTsJLyogY2xlYXIgYW55IG9sZCBkYXRhICovCisJUnRkSW50ZXJydXB0T3ZlcnJ1bkNsZWFyKGRldik7CisJZGV2cHJpdi0+aW50Q291bnQgPSAwOworCisJaWYgKCFkZXYtPmlycSkgewkvKiB3ZSBuZWVkIGludGVycnVwdHMgZm9yIHRoaXMgKi8KKwkJRFBSSU5USygicnRkNTIwOiBFUlJPUiEgTm8gaW50ZXJydXB0IGF2YWlsYWJsZSFcbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCS8qIHN0YXJ0IGNvbmZpZ3VyYXRpb24gKi8KKwkvKiBsb2FkIGNoYW5uZWwgbGlzdCBhbmQgcmVzZXQgQ0dUICovCisJcnRkX2xvYWRfY2hhbm5lbGdhaW5fbGlzdChkZXYsIGNtZC0+Y2hhbmxpc3RfbGVuLCBjbWQtPmNoYW5saXN0KTsKKworCS8qIHNldHVwIHRoZSBjb21tb24gY2FzZSBhbmQgb3ZlcnJpZGUgaWYgbmVlZGVkICovCisJaWYgKGNtZC0+Y2hhbmxpc3RfbGVuID4gMSkgeworCQkvKkRQUklOVEsgKCJydGQ1MjA6IE11bHRpIGNoYW5uZWwgc2V0dXBcbiIpOyAqLworCQlSdGRQYWNlclN0YXJ0U291cmNlKGRldiwgMCk7CS8qIHNvZnR3YXJlIHRyaWdnZXJzIHBhY2VyICovCisJCVJ0ZEJ1cnN0U3RhcnRTb3VyY2UoZGV2LCAxKTsJLyogUEFDRVIgdHJpZ2dlcnMgYnVyc3QgKi8KKwkJUnRkQWRjQ29udmVyc2lvblNvdXJjZShkZXYsIDIpOwkvKiBCVVJTVCB0cmlnZ2VycyBBREMgKi8KKwl9IGVsc2UgewkJLyogc2luZ2xlIGNoYW5uZWwgKi8KKwkJLypEUFJJTlRLICgicnRkNTIwOiBzaW5nbGUgY2hhbm5lbCBzZXR1cFxuIik7ICovCisJCVJ0ZFBhY2VyU3RhcnRTb3VyY2UoZGV2LCAwKTsJLyogc29mdHdhcmUgdHJpZ2dlcnMgcGFjZXIgKi8KKwkJUnRkQWRjQ29udmVyc2lvblNvdXJjZShkZXYsIDEpOwkvKiBQQUNFUiB0cmlnZ2VycyBBREMgKi8KKwl9CisJUnRkQWJvdXRDb3VudGVyKGRldiwgZGV2cHJpdi0+Zmlmb0xlbiAvIDIgLSAxKTsJLyogMS8yIEZJRk8gKi8KKworCWlmIChUUklHX1RJTUVSID09IGNtZC0+c2Nhbl9iZWdpbl9zcmMpIHsKKwkJLyogc2Nhbl9iZWdpbl9hcmcgaXMgaW4gbmFub3NlY29uZHMgKi8KKwkJLyogZmluZCBvdXQgaG93IG1hbnkgc2FtcGxlcyB0byB3YWl0IGJlZm9yZSB0cmFuc2ZlcnJpbmcgKi8KKwkJaWYgKGNtZC0+ZmxhZ3MgJiBUUklHX1dBS0VfRU9TKSB7CisJCQkvKiB0aGlzIG1heSBnZW5lcmF0ZSB1bi1zdXN0YWluYWJsZSBpbnRlcnJ1cHQgcmF0ZXMgKi8KKwkJCS8qIHRoZSBhcHBsaWNhdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZG9pbmcgdGhlIHJpZ2h0IHRoaW5nICovCisJCQlkZXZwcml2LT50cmFuc0NvdW50ID0gY21kLT5jaGFubGlzdF9sZW47CisJCQlkZXZwcml2LT5mbGFncyB8PSBTRU5EX0VPUzsKKwkJfSBlbHNlIHsKKwkJCS8qIGFycmFuZ2UgdG8gdHJhbnNmZXIgZGF0YSBwZXJpb2RpY2FsbHkgKi8KKwkJCWRldnByaXYtPnRyYW5zQ291bnQKKwkJCQk9CisJCQkJKFRSQU5TX1RBUkdFVF9QRVJJT0QgKiBjbWQtPmNoYW5saXN0X2xlbikgLworCQkJCWNtZC0+c2Nhbl9iZWdpbl9hcmc7CisJCQlpZiAoZGV2cHJpdi0+dHJhbnNDb3VudCA8IGNtZC0+Y2hhbmxpc3RfbGVuKSB7CisJCQkJLyogdHJhbmZlciBhZnRlciBlYWNoIHNjYW4gKGFuZCBhdm9pZCAwKSAqLworCQkJCWRldnByaXYtPnRyYW5zQ291bnQgPSBjbWQtPmNoYW5saXN0X2xlbjsKKwkJCX0gZWxzZSB7CS8qIG1ha2UgYSBtdWx0aXBsZSBvZiBzY2FuIGxlbmd0aCAqLworCQkJCWRldnByaXYtPnRyYW5zQ291bnQgPQorCQkJCQkoZGV2cHJpdi0+dHJhbnNDb3VudCArCisJCQkJCWNtZC0+Y2hhbmxpc3RfbGVuIC0gMSkKKwkJCQkJLyBjbWQtPmNoYW5saXN0X2xlbjsKKwkJCQlkZXZwcml2LT50cmFuc0NvdW50ICo9IGNtZC0+Y2hhbmxpc3RfbGVuOworCQkJfQorCQkJZGV2cHJpdi0+ZmxhZ3MgfD0gU0VORF9FT1M7CisJCX0KKwkJaWYgKGRldnByaXYtPnRyYW5zQ291bnQgPj0gKGRldnByaXYtPmZpZm9MZW4gLyAyKSkgeworCQkJLyogb3V0IG9mIGNvdW50ZXIgcmFuZ2UsIHVzZSAxLzIgZmlmbyBpbnN0ZWFkICovCisJCQlkZXZwcml2LT50cmFuc0NvdW50ID0gMDsKKwkJCWRldnByaXYtPmZsYWdzICY9IH5TRU5EX0VPUzsKKwkJfSBlbHNlIHsKKwkJCS8qIGludGVycnVwdCBmb3IgZWFjaCB0cmFuZmVyICovCisJCQlSdGRBYm91dENvdW50ZXIoZGV2LCBkZXZwcml2LT50cmFuc0NvdW50IC0gMSk7CisJCX0KKworCQlEUFJJTlRLKCJydGQ1MjA6IHNjYW5MZW49JWQgdHJhbmZlckNvdW50PSVkIGZpZm9MZW49JWRcbiAgc2NhblRpbWUobnMpPSVkIGZsYWdzPTB4JXhcbiIsIGNtZC0+Y2hhbmxpc3RfbGVuLCBkZXZwcml2LT50cmFuc0NvdW50LCBkZXZwcml2LT5maWZvTGVuLCBjbWQtPnNjYW5fYmVnaW5fYXJnLCBkZXZwcml2LT5mbGFncyk7CisJfSBlbHNlIHsJCS8qIHVua25vd24gdGltaW5nLCBqdXN0IHVzZSAxLzIgRklGTyAqLworCQlkZXZwcml2LT50cmFuc0NvdW50ID0gMDsKKwkJZGV2cHJpdi0+ZmxhZ3MgJj0gflNFTkRfRU9TOworCX0KKwlSdGRQYWNlckNsb2NrU291cmNlKGRldiwgMSk7CS8qIHVzZSBJTlRFUk5BTCA4TWh6IGNsb2NrIHNvdXJjZSAqLworCVJ0ZEFib3V0U3RvcEVuYWJsZShkZXYsIDEpOwkvKiBqdXN0IGludGVycnVwdCwgZG9udCBzdG9wICovCisKKwkvKiBCVUc/Pz8gdGhlc2UgbG9vayBsaWtlIGVudW1lcmF0ZWQgdmFsdWVzLCBidXQgdGhleSBhcmUgYml0IGZpZWxkcyAqLworCisJLyogRmlyc3QsIHNldHVwIHdoZW4gdG8gc3RvcCAqLworCXN3aXRjaCAoY21kLT5zdG9wX3NyYykgeworCWNhc2UgVFJJR19DT1VOVDoJLyogc3RvcCBhZnRlciBOIHNjYW5zICovCisJCWRldnByaXYtPmFpQ291bnQgPSBjbWQtPnN0b3BfYXJnICogY21kLT5jaGFubGlzdF9sZW47CisJCWlmICgoZGV2cHJpdi0+dHJhbnNDb3VudCA+IDApCisJCQkmJiAoZGV2cHJpdi0+dHJhbnNDb3VudCA+IGRldnByaXYtPmFpQ291bnQpKSB7CisJCQlkZXZwcml2LT50cmFuc0NvdW50ID0gZGV2cHJpdi0+YWlDb3VudDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgVFJJR19OT05FOgkvKiBzdG9wIHdoZW4gY2FuY2VsIGlzIGNhbGxlZCAqLworCQlkZXZwcml2LT5haUNvdW50ID0gLTE7CS8qIHJlYWQgZm9yZXZlciAqLworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCURQUklOVEsoInJ0ZDUyMDogV2FybmluZyEgaWdub3Jpbmcgc3RvcF9zcmMgbW9kZSAlZFxuIiwKKwkJCWNtZC0+c3RvcF9zcmMpOworCX0KKworCS8qIFNjYW4gdGltaW5nICovCisJc3dpdGNoIChjbWQtPnNjYW5fYmVnaW5fc3JjKSB7CisJY2FzZSBUUklHX1RJTUVSOgkvKiBwZXJpb2RpYyBzY2FubmluZyAqLworCQl0aW1lciA9IHJ0ZF9uc190b190aW1lcigmY21kLT5zY2FuX2JlZ2luX2FyZywKKwkJCVRSSUdfUk9VTkRfTkVBUkVTVCk7CisJCS8qIHNldCBQQUNFUiBjbG9jayAqLworCQkvKkRQUklOVEsgKCJydGQ1MjA6IGxvYWRpbmcgJWQgaW50byBwYWNlclxuIiwgdGltZXIpOyAqLworCQlSdGRQYWNlckNvdW50ZXIoZGV2LCB0aW1lcik7CisKKwkJYnJlYWs7CisKKwljYXNlIFRSSUdfRVhUOgorCQlSdGRQYWNlclN0YXJ0U291cmNlKGRldiwgMSk7CS8qIEVYVEVSTkFMeSB0cmlnZ2VyIHBhY2VyICovCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJRFBSSU5USygicnRkNTIwOiBXYXJuaW5nISBpZ25vcmluZyBzY2FuX2JlZ2luX3NyYyBtb2RlICVkXG4iLAorCQkJY21kLT5zY2FuX2JlZ2luX3NyYyk7CisJfQorCisJLyogU2FtcGxlIHRpbWluZyB3aXRoaW4gYSBzY2FuICovCisJc3dpdGNoIChjbWQtPmNvbnZlcnRfc3JjKSB7CisJY2FzZSBUUklHX1RJTUVSOgkvKiBwZXJpb2RpYyAqLworCQlpZiAoY21kLT5jaGFubGlzdF9sZW4gPiAxKSB7CS8qIG9ubHkgbmVlZGVkIGZvciBtdWx0aS1jaGFubmVsICovCisJCQl0aW1lciA9IHJ0ZF9uc190b190aW1lcigmY21kLT5jb252ZXJ0X2FyZywKKwkJCQlUUklHX1JPVU5EX05FQVJFU1QpOworCQkJLyogc2V0dXAgQlVSU1QgY2xvY2sgKi8KKwkJCS8qRFBSSU5USyAoInJ0ZDUyMDogbG9hZGluZyAlZCBpbnRvIGJ1cnN0XG4iLCB0aW1lcik7ICovCisJCQlSdGRCdXJzdENvdW50ZXIoZGV2LCB0aW1lcik7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgVFJJR19FWFQ6CQkvKiBleHRlcm5hbCAqLworCQlSdGRCdXJzdFN0YXJ0U291cmNlKGRldiwgMik7CS8qIEVYVEVSTkFMeSB0cmlnZ2VyIGJ1cnN0ICovCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJRFBSSU5USygicnRkNTIwOiBXYXJuaW5nISBpZ25vcmluZyBjb252ZXJ0X3NyYyBtb2RlICVkXG4iLAorCQkJY21kLT5jb252ZXJ0X3NyYyk7CisJfQorCS8qIGVuZCBjb25maWd1cmF0aW9uICovCisKKwkvKiBUaGlzIGRvZXNuJ3Qgc2VlbSB0byB3b3JrLiAgVGhlcmUgaXMgbm8gd2F5IHRvIGNsZWFyIGFuIGludGVycnVwdAorCSAgIHRoYXQgdGhlIHByaW9yaXR5IGNvbnRyb2xsZXIgaGFzIHF1ZXVlZCEgKi8KKwlSdGRJbnRlcnJ1cHRDbGVhck1hc2soZGV2LCB+MCk7CS8qIGNsZWFyIGFueSBleGlzdGluZyBmbGFncyAqLworCVJ0ZEludGVycnVwdENsZWFyKGRldik7CisKKwkvKiBUT0RPOiBhbGxvdyBtdWx0aXBsZSBpbnRlcnJ1cHQgc291cmNlcyAqLworCWlmIChkZXZwcml2LT50cmFuc0NvdW50ID4gMCkgewkvKiB0cmFuc2ZlciBldmVyeSBOIHNhbXBsZXMgKi8KKwkJUnRkSW50ZXJydXB0TWFzayhkZXYsIElSUU1fQURDX0FCT1VUX0NOVCk7CisJCURQUklOVEsoInJ0ZDUyMDogVHJhbnNmZXJyaW5nIGV2ZXJ5ICVkXG4iLCBkZXZwcml2LT50cmFuc0NvdW50KTsKKwl9IGVsc2UgewkJLyogMS8yIEZJRk8gdHJhbnNmZXJzICovCisjaWZkZWYgVVNFX0RNQQorCQlkZXZwcml2LT5mbGFncyB8PSBETUEwX0FDVElWRTsKKworCQkvKiBwb2ludCB0byBmaXJzdCB0cmFuc2ZlciBpbiByaW5nICovCisJCWRldnByaXYtPmRtYTBPZmZzZXQgPSAwOworCQlSdGREbWEwTW9kZShkZXYsIERNQV9NT0RFX0JJVFMpOworCQlSdGREbWEwTmV4dChkZXYsCS8qIHBvaW50IHRvIGZpcnN0IGJsb2NrICovCisJCQlkZXZwcml2LT5kbWEwQ2hhaW5bRE1BX0NIQUlOX0NPVU5UIC0gMV0ubmV4dCk7CisJCVJ0ZERtYTBTb3VyY2UoZGV2LCBETUFTX0FERklGT19IQUxGX0ZVTEwpOwkvKiBzZXQgRE1BIHRyaWdnZXIgc291cmNlICovCisKKwkJUnRkUGx4SW50ZXJydXB0V3JpdGUoZGV2LAkvKiBlbmFibGUgaW50ZXJydXB0ICovCisJCQlSdGRQbHhJbnRlcnJ1cHRSZWFkKGRldikgfCBJQ1NfRE1BMF9FKTsKKwkJLyogTXVzdCBiZSAyIHN0ZXBzLiAgU2VlIFBMWCBhcHAgbm90ZSBhYm91dCAiU3RhcnRpbmcgYSBETUEgdHJhbnNmZXIiICovCisJCVJ0ZERtYTBDb250cm9sKGRldiwgUExYX0RNQV9FTl9CSVQpOwkvKiBlbmFibGUgRE1BIChjbGVhciBJTlRSPykgKi8KKwkJUnRkRG1hMENvbnRyb2woZGV2LCBQTFhfRE1BX0VOX0JJVCB8IFBMWF9ETUFfU1RBUlRfQklUKTsJLypzdGFydCBETUEgKi8KKwkJRFBSSU5USygicnRkNTIwOiBVc2luZyBETUEwIHRyYW5zZmVycy4gcGx4SW50ICV4IFJ0ZEludCAleFxuIiwKKwkJCVJ0ZFBseEludGVycnVwdFJlYWQoZGV2KSwgZGV2cHJpdi0+aW50TWFzayk7CisjZWxzZSAvKiBVU0VfRE1BICovCisJCVJ0ZEludGVycnVwdE1hc2soZGV2LCBJUlFNX0FEQ19BQk9VVF9DTlQpOworCQlEUFJJTlRLKCJydGQ1MjA6IFRyYW5zZmVycmluZyBldmVyeSAxLzIgRklGT1xuIik7CisjZW5kaWYgLyogVVNFX0RNQSAqLworCX0KKworCS8qIEJVRzogc3RhcnRfc3JjIGlzIEFTU1VNRUQgdG8gYmUgVFJJR19OT1cgKi8KKwkvKiBCVUc/IGl0IHNlZW1zIGxpa2UgdGhpbmdzIGFyZSBydW5uaW5nIGJlZm9yZSB0aGUgInN0YXJ0IiAqLworCVJ0ZFBhY2VyU3RhcnQoZGV2KTsJLyogU3RhcnQgUEFDRVIgKi8KKwlyZXR1cm4gMDsKK30KKworLyoKKyAgU3RvcCBhIHJ1bm5pbmcgZGF0YSBhcXVpc2l0aW9uLgorKi8KK3N0YXRpYyBpbnQgcnRkX2FpX2NhbmNlbChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcykKK3sKKwl1MTYgc3RhdHVzOworCisJUnRkUGFjZXJTdG9wU291cmNlKGRldiwgMCk7CS8qIHN0b3Agb24gU09GVFdBUkUgc3RvcCAqLworCVJ0ZFBhY2VyU3RvcChkZXYpOwkvKiBTdG9wIFBBQ0VSICovCisJUnRkQWRjQ29udmVyc2lvblNvdXJjZShkZXYsIDApOwkvKiBzb2Z0d2FyZSB0cmlnZ2VyIG9ubHkgKi8KKwlSdGRJbnRlcnJ1cHRNYXNrKGRldiwgMCk7CisJZGV2cHJpdi0+YWlDb3VudCA9IDA7CS8qIHN0b3AgYW5kIGRvbid0IHRyYW5zZmVyIGFueSBtb3JlICovCisjaWZkZWYgVVNFX0RNQQorCWlmIChkZXZwcml2LT5mbGFncyAmIERNQTBfQUNUSVZFKSB7CisJCVJ0ZFBseEludGVycnVwdFdyaXRlKGRldiwJLyogZGlzYWJsZSBhbnkgbW9yZSBpbnRlcnJ1cHRzICovCisJCQlSdGRQbHhJbnRlcnJ1cHRSZWFkKGRldikgJiB+SUNTX0RNQTBfRSk7CisJCWFib3J0X2RtYShkZXYsIDApOworCQlkZXZwcml2LT5mbGFncyAmPSB+RE1BMF9BQ1RJVkU7CisJfQorI2VuZGlmIC8qIFVTRV9ETUEgKi8KKwlzdGF0dXMgPSBSdGRJbnRlcnJ1cHRTdGF0dXMoZGV2KTsKKwlEUFJJTlRLKCJydGQ1MjA6IEFjcXVpc2l0aW9uIGNhbmNlbGVkLiAlbGQgaW50cywgaW50U3RhdD0leCwgb3ZlclN0YXQ9JXhcbiIsIGRldnByaXYtPmludENvdW50LCBzdGF0dXMsIDB4ZmZmZiAmIFJ0ZEludGVycnVwdE92ZXJydW5TdGF0dXMoZGV2KSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgIEdpdmVuIGEgZGVzaXJlZCBwZXJpb2QgYW5kIHRoZSBjbG9jayBwZXJpb2QgKGJvdGggaW4gbnMpLAorICByZXR1cm4gdGhlIHByb3BlciBjb3VudGVyIHZhbHVlIChkaXZpZGVyLTEpLgorICBTZXRzIHRoZSBvcmlnaW5hbCBwZXJpb2QgdG8gYmUgdGhlIHRydWUgdmFsdWUuCisgIE5vdGU6IHlvdSBoYXZlIHRvIGNoZWNrIGlmIHRoZSB2YWx1ZSBpcyBsYXJnZXIgdGhhbiB0aGUgY291bnRlciByYW5nZSEKKyovCitzdGF0aWMgaW50IHJ0ZF9uc190b190aW1lcl9iYXNlKHVuc2lnbmVkIGludCAqbmFub3NlYywJLyogZGVzaXJlZCBwZXJpb2QgKGluIG5zKSAqLworCWludCByb3VuZF9tb2RlLCBpbnQgYmFzZSkKK3sJCQkJLyogY2xvY2sgcGVyaW9kIChpbiBucykgKi8KKwlpbnQgZGl2aWRlcjsKKworCXN3aXRjaCAocm91bmRfbW9kZSkgeworCWNhc2UgVFJJR19ST1VORF9ORUFSRVNUOgorCWRlZmF1bHQ6CisJCWRpdmlkZXIgPSAoKm5hbm9zZWMgKyBiYXNlIC8gMikgLyBiYXNlOworCQlicmVhazsKKwljYXNlIFRSSUdfUk9VTkRfRE9XTjoKKwkJZGl2aWRlciA9ICgqbmFub3NlYykgLyBiYXNlOworCQlicmVhazsKKwljYXNlIFRSSUdfUk9VTkRfVVA6CisJCWRpdmlkZXIgPSAoKm5hbm9zZWMgKyBiYXNlIC0gMSkgLyBiYXNlOworCQlicmVhazsKKwl9CisJaWYgKGRpdmlkZXIgPCAyKQorCQlkaXZpZGVyID0gMjsJLyogbWluIGlzIGRpdmlkZSBieSAyICovCisKKwkvKiBOb3RlOiB3ZSBkb24ndCBjaGVjayBmb3IgbWF4LCBiZWNhdXNlIGRpZmZlcmVudCB0aW1lcnMKKwkgICBoYXZlIGRpZmZlcmVudCByYW5nZXMgKi8KKworCSpuYW5vc2VjID0gYmFzZSAqIGRpdmlkZXI7CisJcmV0dXJuIGRpdmlkZXIgLSAxOwkvKiBjb3VudGRvd24gaXMgZGl2aXNvcisxICovCit9CisKKy8qCisgIEdpdmVuIGEgZGVzaXJlZCBwZXJpb2QgKGluIG5zKSwKKyAgcmV0dXJuIHRoZSBwcm9wZXIgY291bnRlciB2YWx1ZSAoZGl2aWRlci0xKSBmb3IgdGhlIGludGVybmFsIGNsb2NrLgorICBTZXRzIHRoZSBvcmlnaW5hbCBwZXJpb2QgdG8gYmUgdGhlIHRydWUgdmFsdWUuCisqLworc3RhdGljIGludCBydGRfbnNfdG9fdGltZXIodW5zaWduZWQgaW50ICpucywgaW50IHJvdW5kX21vZGUpCit7CisJcmV0dXJuIHJ0ZF9uc190b190aW1lcl9iYXNlKG5zLCByb3VuZF9tb2RlLCBSVERfQ0xPQ0tfQkFTRSk7Cit9CisKKy8qCisgIE91dHB1dCBvbmUgKG9yIG1vcmUpIGFuYWxvZyB2YWx1ZXMgdG8gYSBzaW5nbGUgcG9ydCBhcyBmYXN0IGFzIHBvc3NpYmxlLgorKi8KK3N0YXRpYyBpbnQgcnRkX2FvX3dpbnNuKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworCWludCBpOworCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJaW50IHJhbmdlID0gQ1JfUkFOR0UoaW5zbi0+Y2hhbnNwZWMpOworCisJLyogQ29uZmlndXJlIHRoZSBvdXRwdXQgcmFuZ2UgKHRhYmxlIGluZGV4IG1hdGNoZXMgdGhlIHJhbmdlIHZhbHVlcykgKi8KKwlSdGREYWNSYW5nZShkZXYsIGNoYW4sIHJhbmdlKTsKKworCS8qIFdyaXRpbmcgYSBsaXN0IG9mIHZhbHVlcyB0byBhbiBBTyBjaGFubmVsIGlzIHByb2JhYmx5IG5vdAorCSAqIHZlcnkgdXNlZnVsLCBidXQgdGhhdCdzIGhvdyB0aGUgaW50ZXJmYWNlIGlzIGRlZmluZWQuICovCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47ICsraSkgeworCQlpbnQgdmFsID0gZGF0YVtpXSA8PCAzOworCQlpbnQgc3RhdCA9IDA7CS8qIGluaXRpYWxpemUgdG8gYXZvaWQgYm9ndXMgd2FybmluZyAqLworCQlpbnQgaWk7CisKKwkJLyogVkVSSUZZOiBjb21lZGkgcmFuZ2UgYW5kIG9mZnNldCBjb252ZXJzaW9ucyAqLworCisJCWlmICgocmFuZ2UgPiAxKQkvKiBiaXBvbGFyICovCisJCQkmJihkYXRhW2ldIDwgMjA0OCkpIHsKKwkJCS8qIG9mZnNldCBhbmQgc2lnbiBleHRlbmQgKi8KKwkJCXZhbCA9ICgoKGludClkYXRhW2ldKSAtIDIwNDgpIDw8IDM7CisJCX0gZWxzZSB7CS8qIHVuaXBvbG9yICovCisJCQl2YWwgPSBkYXRhW2ldIDw8IDM7CisJCX0KKworCQlEUFJJTlRLKCJjb21lZGk6IHJ0ZDUyMCBEQUMgY2hhbj0lZCByYW5nZT0lZCB3cml0aW5nICVkIGFzIDB4JXhcbiIsIGNoYW4sIHJhbmdlLCBkYXRhW2ldLCB2YWwpOworCisJCS8qIGEgdHlwaWNhbCBwcm9ncmFtbWluZyBzZXF1ZW5jZSAqLworCQlSdGREYWNGaWZvUHV0KGRldiwgY2hhbiwgdmFsKTsJLyogcHV0IHRoZSB2YWx1ZSBpbiAqLworCQlSdGREYWNVcGRhdGUoZGV2LCBjaGFuKTsJLyogdHJpZ2dlciB0aGUgY29udmVyc2lvbiAqLworCisJCWRldnByaXYtPmFvVmFsdWVbY2hhbl0gPSBkYXRhW2ldOwkvKiBzYXZlIGZvciByZWFkIGJhY2sgKi8KKworCQlmb3IgKGlpID0gMDsgaWkgPCBSVERfREFDX1RJTUVPVVQ7ICsraWkpIHsKKwkJCXN0YXQgPSBSdGRGaWZvU3RhdHVzKGRldik7CisJCQkvKiAxIC0+IG5vdCBlbXB0eSAqLworCQkJaWYgKHN0YXQgJiAoKDAgPT0gY2hhbikgPyBGU19EQUMxX05PVF9FTVBUWSA6CisJCQkJCUZTX0RBQzJfTk9UX0VNUFRZKSkKKwkJCQlicmVhazsKKwkJCVdBSVRfUVVJRVRMWTsKKwkJfQorCQlpZiAoaWkgPj0gUlREX0RBQ19USU1FT1VUKSB7CisJCQlEUFJJTlRLKCJydGQ1MjA6IEVycm9yOiBEQUMgbmV2ZXIgZmluaXNoZWQhIEZpZm9TdGF0dXM9MHgleFxuIiwgc3RhdCBeIDB4NjY2Nik7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJfQorCX0KKworCS8qIHJldHVybiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgcmVhZC93cml0dGVuICovCisJcmV0dXJuIGk7Cit9CisKKy8qIEFPIHN1YmRldmljZXMgc2hvdWxkIGhhdmUgYSByZWFkIGluc24gYXMgd2VsbCBhcyBhIHdyaXRlIGluc24uCisgKiBVc3VhbGx5IHRoaXMgbWVhbnMgY29weWluZyBhIHZhbHVlIHN0b3JlZCBpbiBkZXZwcml2LiAqLworc3RhdGljIGludCBydGRfYW9fcmluc24oY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywgY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisJaW50IGk7CisJaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKworCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKKwkJZGF0YVtpXSA9IGRldnByaXYtPmFvVmFsdWVbY2hhbl07CisJfQorCisJcmV0dXJuIGk7Cit9CisKKy8qCisgICBXcml0ZSBhIG1hc2tlZCBzZXQgb2YgYml0cyBhbmQgdGhlIHJlYWQgYmFjayB0aGUgcG9ydC4KKyAgIFdlIHRyYWNrIHdoYXQgdGhlIGJpdHMgc2hvdWxkIGJlIChpLmUuIHdlIGRvbid0IHJlYWQgdGhlIHBvcnQgZmlyc3QpLgorCisgICBESU8gZGV2aWNlcyBhcmUgc2xpZ2h0bHkgc3BlY2lhbC4gIEFsdGhvdWdoIGl0IGlzIHBvc3NpYmxlIHRvCisgKiBpbXBsZW1lbnQgdGhlIGluc25fcmVhZC9pbnNuX3dyaXRlIGludGVyZmFjZSwgaXQgaXMgbXVjaCBtb3JlCisgKiB1c2VmdWwgdG8gYXBwbGljYXRpb25zIGlmIHlvdSBpbXBsZW1lbnQgdGhlIGluc25fYml0cyBpbnRlcmZhY2UuCisgKiBUaGlzIGFsbG93cyBwYWNrZWQgcmVhZGluZy93cml0aW5nIG9mIHRoZSBESU8gY2hhbm5lbHMuICBUaGUKKyAqIGNvbWVkaSBjb3JlIGNhbiBjb252ZXJ0IGJldHdlZW4gaW5zbl9iaXRzIGFuZCBpbnNuX3JlYWQvd3JpdGUKKyAqLworc3RhdGljIGludCBydGRfZGlvX2luc25fYml0cyhjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCBjb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKwlpZiAoaW5zbi0+biAhPSAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFRoZSBpbnNuIGRhdGEgaXMgYSBtYXNrIGluIGRhdGFbMF0gYW5kIHRoZSBuZXcgZGF0YQorCSAqIGluIGRhdGFbMV0sIGVhY2ggY2hhbm5lbCBjb29yZXNwb25kaW5nIHRvIGEgYml0LiAqLworCWlmIChkYXRhWzBdKSB7CisJCXMtPnN0YXRlICY9IH5kYXRhWzBdOworCQlzLT5zdGF0ZSB8PSBkYXRhWzBdICYgZGF0YVsxXTsKKworCQkvKiBXcml0ZSBvdXQgdGhlIG5ldyBkaWdpdGFsIG91dHB1dCBsaW5lcyAqLworCQlSdGREaW8wV3JpdGUoZGV2LCBzLT5zdGF0ZSk7CisJfQorCS8qIG9uIHJldHVybiwgZGF0YVsxXSBjb250YWlucyB0aGUgdmFsdWUgb2YgdGhlIGRpZ2l0YWwKKwkgKiBpbnB1dCBsaW5lcy4gKi8KKwlkYXRhWzFdID0gUnRkRGlvMFJlYWQoZGV2KTsKKworCS8qRFBSSU5USygicnRkNTIwOnBvcnRfMCB3cm90ZTogMHgleCByZWFkOiAweCV4XG4iLCBzLT5zdGF0ZSwgZGF0YVsxXSk7ICovCisKKwlyZXR1cm4gMjsKK30KKworLyoKKyAgQ29uZmlndXJlIG9uZSBiaXQgb24gYSBJTyBwb3J0IGFzIElucHV0IG9yIE91dHB1dCAoaGVuY2UgdGhlIG5hbWUgOi0pLgorKi8KK3N0YXRpYyBpbnQgcnRkX2Rpb19pbnNuX2NvbmZpZyhjb21lZGlfZGV2aWNlICogZGV2LAorCWNvbWVkaV9zdWJkZXZpY2UgKiBzLCBjb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKwlpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCisJLyogVGhlIGlucHV0IG9yIG91dHB1dCBjb25maWd1cmF0aW9uIG9mIGVhY2ggZGlnaXRhbCBsaW5lIGlzCisJICogY29uZmlndXJlZCBieSBhIHNwZWNpYWwgaW5zbl9jb25maWcgaW5zdHJ1Y3Rpb24uICBjaGFuc3BlYworCSAqIGNvbnRhaW5zIHRoZSBjaGFubmVsIHRvIGJlIGNoYW5nZWQsIGFuZCBkYXRhWzBdIGNvbnRhaW5zIHRoZQorCSAqIHZhbHVlIENPTUVESV9JTlBVVCBvciBDT01FRElfT1VUUFVULiAqLworCXN3aXRjaCAoZGF0YVswXSkgeworCWNhc2UgSU5TTl9DT05GSUdfRElPX09VVFBVVDoKKwkJcy0+aW9fYml0cyB8PSAxIDw8IGNoYW47CS8qIDEgbWVhbnMgT3V0ICovCisJCWJyZWFrOworCWNhc2UgSU5TTl9DT05GSUdfRElPX0lOUFVUOgorCQlzLT5pb19iaXRzICY9IH4oMSA8PCBjaGFuKTsKKwkJYnJlYWs7CisJY2FzZSBJTlNOX0NPTkZJR19ESU9fUVVFUlk6CisJCWRhdGFbMV0gPQorCQkJKHMtPgorCQkJaW9fYml0cyAmICgxIDw8IGNoYW4pKSA/IENPTUVESV9PVVRQVVQgOiBDT01FRElfSU5QVVQ7CisJCXJldHVybiBpbnNuLT5uOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlEUFJJTlRLKCJydGQ1MjA6IHBvcnRfMF9kaXJlY3Rpb249MHgleCAoMSBtZWFucyBvdXQpXG4iLCBzLT5pb19iaXRzKTsKKwkvKiBUT0RPIHN1cHBvcnQgZGlnaXRhbCBtYXRjaCBpbnRlcnJ1cHRzIGFuZCBzdHJvYmVzICovCisJUnRkRGlvU3RhdHVzV3JpdGUoZGV2LCAweDAxKTsJLyogbWFrZSBEaW8wQ3RybCBwb2ludCB0byBkaXJlY3Rpb24gKi8KKwlSdGREaW8wQ3RybFdyaXRlKGRldiwgcy0+aW9fYml0cyk7CS8qIHNldCBkaXJlY3Rpb24gMSBtZWFucyBPdXQgKi8KKwlSdGREaW9TdGF0dXNXcml0ZShkZXYsIDApOwkvKiBtYWtlIERpbzBDdHJsIGNsZWFyIGludGVycnVwdHMgKi8KKworCS8qIHBvcnQxIGNhbiBvbmx5IGJlIGFsbCBpbnB1dCBvciBhbGwgb3V0cHV0ICovCisKKwkvKiB0aGVyZSBhcmUgYWxzbyAyIHVzZXIgaW5wdXQgbGluZXMgYW5kIDIgdXNlciBvdXRwdXQgbGluZXMgKi8KKworCXJldHVybiAxOworfQorCisvKgorICogQSBjb252ZW5pZW50IG1hY3JvIHRoYXQgZGVmaW5lcyBpbml0X21vZHVsZSgpIGFuZCBjbGVhbnVwX21vZHVsZSgpLAorICogYXMgbmVjZXNzYXJ5LgorICovCitDT01FRElfUENJX0lOSVRDTEVBTlVQKHJ0ZDUyMERyaXZlciwgcnRkNTIwX3BjaV90YWJsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRkNTIwLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRkNTIwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGViNTBiOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9ydGQ1MjAuaApAQCAtMCwwICsxLDQxMiBAQAorLyoKKyAgICBjb21lZGkvZHJpdmVycy9ydGQ1MjAuaAorICAgIENvbWVkaSBkcml2ZXIgZGVmaW5lcyBmb3IgUmVhbCBUaW1lIERldmljZXMgKFJURCkgUENJNDUyMC9ETTc1MjAKKworICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDEgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKy8qCisgICAgQ3JlYXRlZCBieSBEYW4gQ2hyaXN0aWFuLCBOQVNBIEFtZXMgUmVzZWFyY2ggQ2VudGVyLgorICAgIFNlZSBib2FyZCBub3RlcyBpbiBydGQ1MjAuYworKi8KKworLyoKKyAgTEFTMCBSdW50aW1lIEFyZWEKKyAgTG9jYWwgQWRkcmVzcyBTcGFjZSAwIE9mZnNldAkJUmVhZCBGdW5jdGlvbglXcml0ZSBGdW5jdGlvbgorKi8KKyNkZWZpbmUgTEFTMF9TUEFSRV8wMCAgICAweDAwMDAJLy8gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtCisjZGVmaW5lIExBUzBfU1BBUkVfMDQgICAgMHgwMDA0CS8vIC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLQorI2RlZmluZSBMQVMwX1VTRVJfSU8gICAgIDB4MDAwOAkvLyBSZWFkIFVzZXIgSW5wdXRzICAgICAgICAgICAgICAgIFdyaXRlIFVzZXIgT3V0cHV0cworI2RlZmluZSBMQVMwX1NQQVJFXzBDICAgIDB4MDAwQwkvLyAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0KKyNkZWZpbmUgTEFTMF9BREMgICAgICAgICAweDAwMTAJLy8gUmVhZCBGSUZPIFN0YXR1cyAgICAgICAgICAgICAgICBTb2Z0d2FyZSBBL0QgU3RhcnQKKyNkZWZpbmUgTEFTMF9EQUMxICAgICAgICAweDAwMTQJLy8gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb2Z0d2FyZSBEL0ExIFVwZGF0ZQorI2RlZmluZSBMQVMwX0RBQzIgICAgICAgIDB4MDAxOAkvLyAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvZnR3YXJlIEQvQTIgVXBkYXRlCisjZGVmaW5lIExBUzBfU1BBUkVfMUMgICAgMHgwMDFDCS8vIC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLQorI2RlZmluZSBMQVMwX1NQQVJFXzIwICAgIDB4MDAyMAkvLyAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0KKyNkZWZpbmUgTEFTMF9EQUMgICAgICAgICAweDAwMjQJLy8gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb2Z0d2FyZSBTaW11bHRhbmVvdXMgRC9BMSBhbmQgRC9BMiBVcGRhdGUKKyNkZWZpbmUgTEFTMF9QQUNFUiAgICAgICAweDAwMjgJLy8gU29mdHdhcmUgUGFjZXIgU3RhcnQgICAgICAgICAgICBTb2Z0d2FyZSBQYWNlciBTdG9wCisjZGVmaW5lIExBUzBfVElNRVIgICAgICAgMHgwMDJDCS8vIFJlYWQgVGltZXIgQ291bnRlcnMgU3RhdHVzICAgICAgSERJTiBTb2Z0d2FyZSBUcmlnZ2VyCisjZGVmaW5lIExBUzBfSVQgICAgICAgICAgMHgwMDMwCS8vIFJlYWQgSW50ZXJydXB0IFN0YXR1cyAgICAgICAgICAgV3JpdGUgSW50ZXJydXB0IEVuYWJsZSBNYXNrIFJlZ2lzdGVyCisjZGVmaW5lIExBUzBfQ0xFQVIgICAgICAgMHgwMDM0CS8vIENsZWFyIElUcyBzZXQgYnkgQ2xlYXIgTWFzayAgICAgU2V0IEludGVycnVwdCBDbGVhciBNYXNrCisjZGVmaW5lIExBUzBfT1ZFUlJVTiAgICAgMHgwMDM4CS8vIFJlYWQgcGVuZGluZyBpbnRlcnJ1cHRzICAgICAgICAgQ2xlYXIgT3ZlcnJ1biBSZWdpc3RlcgorI2RlZmluZSBMQVMwX1NQQVJFXzNDICAgIDB4MDAzQwkvLyAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0KKworLyoKKyAgTEFTMCBSdW50aW1lIEFyZWEgVGltZXIvQ291bnRlcixEaWcuSU8KKyAgTmFtZQkJCUxvY2FsIEFkZHJlc3MJCQlGdW5jdGlvbgorKi8KKyNkZWZpbmUgTEFTMF9QQ0xLICAgICAgICAweDAwNDAJLy8gUGFjZXIgQ2xvY2sgdmFsdWUgKDI0Yml0KSAgICAgICAgICAgICBQYWNlciBDbG9jayBsb2FkICgyNGJpdCkKKyNkZWZpbmUgTEFTMF9CQ0xLICAgICAgICAweDAwNDQJLy8gQnVyc3QgQ2xvY2sgdmFsdWUgKDEwYml0KSAgICAgICAgICAgICBCdXJzdCBDbG9jayBsb2FkICgxMGJpdCkKKyNkZWZpbmUgTEFTMF9BRENfU0NOVCAgICAweDAwNDgJLy8gQS9EIFNhbXBsZSBjb3VudGVyIHZhbHVlICgxMGJpdCkgICAgICBBL0QgU2FtcGxlIGNvdW50ZXIgbG9hZCAoMTBiaXQpCisjZGVmaW5lIExBUzBfREFDMV9VQ05UICAgMHgwMDRDCS8vIEQvQTEgVXBkYXRlIGNvdW50ZXIgdmFsdWUgKDEwIGJpdCkgICAgRC9BMSBVcGRhdGUgY291bnRlciBsb2FkICgxMGJpdCkKKyNkZWZpbmUgTEFTMF9EQUMyX1VDTlQgICAweDAwNTAJLy8gRC9BMiBVcGRhdGUgY291bnRlciB2YWx1ZSAoMTAgYml0KSAgICBEL0EyIFVwZGF0ZSBjb3VudGVyIGxvYWQgKDEwYml0KQorI2RlZmluZSBMQVMwX0RDTlQgICAgICAgIDB4MDA1NAkvLyBEZWxheSBjb3VudGVyIHZhbHVlICgxNiBiaXQpICAgICAgICAgIERlbGF5IGNvdW50ZXIgbG9hZCAoMTZiaXQpCisjZGVmaW5lIExBUzBfQUNOVCAgICAgICAgMHgwMDU4CS8vIEFib3V0IGNvdW50ZXIgdmFsdWUgKDE2IGJpdCkgICAgICAgICAgQWJvdXQgY291bnRlciBsb2FkICgxNmJpdCkKKyNkZWZpbmUgTEFTMF9EQUNfQ0xLICAgICAweDAwNUMJLy8gREFDIGNsb2NrIHZhbHVlICgxNmJpdCkgICAgICAgICAgICAgICBEQUMgY2xvY2sgbG9hZCAoMTZiaXQpCisjZGVmaW5lIExBUzBfVVRDMCAgICAgICAgMHgwMDYwCS8vIDgyNTQgVEMgQ291bnRlciAwIFVzZXIgVEMgMCB2YWx1ZSAgICAgTG9hZCBjb3VudCBpbiBUQyBDb3VudGVyIDAKKyNkZWZpbmUgTEFTMF9VVEMxICAgICAgICAweDAwNjQJLy8gODI1NCBUQyBDb3VudGVyIDEgVXNlciBUQyAxIHZhbHVlICAgICBMb2FkIGNvdW50IGluIFRDIENvdW50ZXIgMQorI2RlZmluZSBMQVMwX1VUQzIgICAgICAgIDB4MDA2OAkvLyA4MjU0IFRDIENvdW50ZXIgMiBVc2VyIFRDIDIgdmFsdWUgICAgIExvYWQgY291bnQgaW4gVEMgQ291bnRlciAyCisjZGVmaW5lIExBUzBfVVRDX0NUUkwgICAgMHgwMDZDCS8vIDgyNTQgVEMgQ29udHJvbCBXb3JkICAgICAgICAgICAgICAgICAgUHJvZ3JhbSBjb3VudGVyIG1vZGUgZm9yIFRDCisjZGVmaW5lIExBUzBfRElPMCAgICAgICAgMHgwMDcwCS8vIERpZ2l0YWwgSS9PIFBvcnQgMCBSZWFkIFBvcnQgICAgICAgICAgRGlnaXRhbCBJL08gUG9ydCAwIFdyaXRlIFBvcnQKKyNkZWZpbmUgTEFTMF9ESU8xICAgICAgICAweDAwNzQJLy8gRGlnaXRhbCBJL08gUG9ydCAxIFJlYWQgUG9ydCAgICAgICAgICBEaWdpdGFsIEkvTyBQb3J0IDEgV3JpdGUgUG9ydAorI2RlZmluZSBMQVMwX0RJTzBfQ1RSTCAgIDB4MDA3OAkvLyBDbGVhciBkaWdpdGFsIElSUSBzdGF0dXMgZmxhZy9yZWFkICAgIENsZWFyIGRpZ2l0YWwgY2hpcC9wcm9ncmFtIFBvcnQgMAorI2RlZmluZSBMQVMwX0RJT19TVEFUVVMgIDB4MDA3QwkvLyBSZWFkIERpZ2l0YWwgSS9PIFN0YXR1cyB3b3JkICAgICAgICAgIFByb2dyYW0gZGlnaXRhbCBjb250cm9sIHJlZ2lzdGVyICYKKworLyoKKyAgTEFTMCBTZXR1cCBBcmVhCisgIE5hbWUJCQlMb2NhbCBBZGRyZXNzCQkJRnVuY3Rpb24KKyovCisjZGVmaW5lIExBUzBfQk9BUkRfUkVTRVQgICAgICAgIDB4MDEwMAkvLyBCb2FyZCByZXNldAorI2RlZmluZSBMQVMwX0RNQTBfU1JDICAgICAgICAgICAweDAxMDQJLy8gRE1BIDAgU291cmNlcyBzZWxlY3QKKyNkZWZpbmUgTEFTMF9ETUExX1NSQyAgICAgICAgICAgMHgwMTA4CS8vIERNQSAxIFNvdXJjZXMgc2VsZWN0CisjZGVmaW5lIExBUzBfQURDX0NPTlZFUlNJT04gICAgIDB4MDEwQwkvLyBBL0QgQ29udmVyc2lvbiBTaWduYWwgc2VsZWN0CisjZGVmaW5lIExBUzBfQlVSU1RfU1RBUlQgICAgICAgIDB4MDExMAkvLyBCdXJzdCBDbG9jayBTdGFydCBUcmlnZ2VyIHNlbGVjdAorI2RlZmluZSBMQVMwX1BBQ0VSX1NUQVJUICAgICAgICAweDAxMTQJLy8gUGFjZXIgQ2xvY2sgU3RhcnQgVHJpZ2dlciBzZWxlY3QKKyNkZWZpbmUgTEFTMF9QQUNFUl9TVE9QICAgICAgICAgMHgwMTE4CS8vIFBhY2VyIENsb2NrIFN0b3AgVHJpZ2dlciBzZWxlY3QKKyNkZWZpbmUgTEFTMF9BQ05UX1NUT1BfRU5BQkxFICAgMHgwMTFDCS8vIEFib3V0IENvdW50ZXIgU3RvcCBFbmFibGUKKyNkZWZpbmUgTEFTMF9QQUNFUl9SRVBFQVQgICAgICAgMHgwMTIwCS8vIFBhY2VyIFN0YXJ0IFRyaWdnZXIgTW9kZSBzZWxlY3QKKyNkZWZpbmUgTEFTMF9ESU5fU1RBUlQgICAgICAgICAgMHgwMTI0CS8vIEhpZ2ggU3BlZWQgRGlnaXRhbCBJbnB1dCBTYW1wbGluZyBTaWduYWwgc2VsZWN0CisjZGVmaW5lIExBUzBfRElOX0ZJRk9fQ0xFQVIgICAgIDB4MDEyOAkvLyBEaWdpdGFsIElucHV0IEZJRk8gQ2xlYXIKKyNkZWZpbmUgTEFTMF9BRENfRklGT19DTEVBUiAgICAgMHgwMTJDCS8vIEEvRCBGSUZPIENsZWFyCisjZGVmaW5lIExBUzBfQ0dUX1dSSVRFICAgICAgICAgIDB4MDEzMAkvLyBDaGFubmVsIEdhaW4gVGFibGUgV3JpdGUKKyNkZWZpbmUgTEFTMF9DR0xfV1JJVEUgICAgICAgICAgMHgwMTM0CS8vIENoYW5uZWwgR2FpbiBMYXRjaCBXcml0ZQorI2RlZmluZSBMQVMwX0NHX0RBVEEgICAgICAgICAgICAweDAxMzgJLy8gRGlnaXRhbCBUYWJsZSBXcml0ZQorI2RlZmluZSBMQVMwX0NHVF9FTkFCTEUJCTB4MDEzQwkvLyBDaGFubmVsIEdhaW4gVGFibGUgRW5hYmxlCisjZGVmaW5lIExBUzBfQ0dfRU5BQkxFICAgICAgICAgIDB4MDE0MAkvLyBEaWdpdGFsIFRhYmxlIEVuYWJsZQorI2RlZmluZSBMQVMwX0NHVF9QQVVTRSAgICAgICAgICAweDAxNDQJLy8gVGFibGUgUGF1c2UgRW5hYmxlCisjZGVmaW5lIExBUzBfQ0dUX1JFU0VUICAgICAgICAgIDB4MDE0OAkvLyBSZXNldCBDaGFubmVsIEdhaW4gVGFibGUKKyNkZWZpbmUgTEFTMF9DR1RfQ0xFQVIgICAgICAgICAgMHgwMTRDCS8vIENsZWFyIENoYW5uZWwgR2FpbiBUYWJsZQorI2RlZmluZSBMQVMwX0RBQzFfQ1RSTCAgICAgICAgICAweDAxNTAJLy8gRC9BMSBvdXRwdXQgdHlwZS9yYW5nZQorI2RlZmluZSBMQVMwX0RBQzFfU1JDICAgICAgICAgICAweDAxNTQJLy8gRC9BMSB1cGRhdGUgc291cmNlCisjZGVmaW5lIExBUzBfREFDMV9DWUNMRSAgICAgICAgIDB4MDE1OAkvLyBEL0ExIGN5Y2xlIG1vZGUKKyNkZWZpbmUgTEFTMF9EQUMxX1JFU0VUICAgICAgICAgMHgwMTVDCS8vIEQvQTEgRklGTyByZXNldAorI2RlZmluZSBMQVMwX0RBQzFfRklGT19DTEVBUiAgICAweDAxNjAJLy8gRC9BMSBGSUZPIGNsZWFyCisjZGVmaW5lIExBUzBfREFDMl9DVFJMICAgICAgICAgIDB4MDE2NAkvLyBEL0EyIG91dHB1dCB0eXBlL3JhbmdlCisjZGVmaW5lIExBUzBfREFDMl9TUkMgICAgICAgICAgIDB4MDE2OAkvLyBEL0EyIHVwZGF0ZSBzb3VyY2UKKyNkZWZpbmUgTEFTMF9EQUMyX0NZQ0xFICAgICAgICAgMHgwMTZDCS8vIEQvQTIgY3ljbGUgbW9kZQorI2RlZmluZSBMQVMwX0RBQzJfUkVTRVQgICAgICAgICAweDAxNzAJLy8gRC9BMiBGSUZPIHJlc2V0CisjZGVmaW5lIExBUzBfREFDMl9GSUZPX0NMRUFSICAgIDB4MDE3NAkvLyBEL0EyIEZJRk8gY2xlYXIKKyNkZWZpbmUgTEFTMF9BRENfU0NOVF9TUkMgICAgICAgMHgwMTc4CS8vIEEvRCBTYW1wbGUgQ291bnRlciBTb3VyY2Ugc2VsZWN0CisjZGVmaW5lIExBUzBfUEFDRVJfU0VMRUNUICAgICAgIDB4MDE4MAkvLyBQYWNlciBDbG9jayBzZWxlY3QKKyNkZWZpbmUgTEFTMF9TQlVTMF9TUkMgICAgICAgICAgMHgwMTg0CS8vIFN5bmNCdXMgMCBTb3VyY2Ugc2VsZWN0CisjZGVmaW5lIExBUzBfU0JVUzBfRU5BQkxFICAgICAgIDB4MDE4OAkvLyBTeW5jQnVzIDAgZW5hYmxlCisjZGVmaW5lIExBUzBfU0JVUzFfU1JDICAgICAgICAgIDB4MDE4QwkvLyBTeW5jQnVzIDEgU291cmNlIHNlbGVjdAorI2RlZmluZSBMQVMwX1NCVVMxX0VOQUJMRSAgICAgICAweDAxOTAJLy8gU3luY0J1cyAxIGVuYWJsZQorI2RlZmluZSBMQVMwX1NCVVMyX1NSQyAgICAgICAgICAweDAxOTgJLy8gU3luY0J1cyAyIFNvdXJjZSBzZWxlY3QKKyNkZWZpbmUgTEFTMF9TQlVTMl9FTkFCTEUgICAgICAgMHgwMTlDCS8vIFN5bmNCdXMgMiBlbmFibGUKKyNkZWZpbmUgTEFTMF9FVFJHX1BPTEFSSVRZICAgICAgMHgwMUE0CS8vIEV4dGVybmFsIFRyaWdnZXIgcG9sYXJpdHkgc2VsZWN0CisjZGVmaW5lIExBUzBfRUlOVF9QT0xBUklUWSAgICAgIDB4MDFBOAkvLyBFeHRlcm5hbCBJbnRlcnJ1cHQgcG9sYXJpdHkgc2VsZWN0CisjZGVmaW5lIExBUzBfVVRDMF9DTE9DSyAgICAgICAgIDB4MDFBQwkvLyBVVEMwIENsb2NrIHNlbGVjdAorI2RlZmluZSBMQVMwX1VUQzBfR0FURSAgICAgICAgICAweDAxQjAJLy8gVVRDMCBHYXRlIHNlbGVjdAorI2RlZmluZSBMQVMwX1VUQzFfQ0xPQ0sgICAgICAgICAweDAxQjQJLy8gVVRDMSBDbG9jayBzZWxlY3QKKyNkZWZpbmUgTEFTMF9VVEMxX0dBVEUgICAgICAgICAgMHgwMUI4CS8vIFVUQzEgR2F0ZSBzZWxlY3QKKyNkZWZpbmUgTEFTMF9VVEMyX0NMT0NLICAgICAgICAgMHgwMUJDCS8vIFVUQzIgQ2xvY2sgc2VsZWN0CisjZGVmaW5lIExBUzBfVVRDMl9HQVRFICAgICAgICAgIDB4MDFDMAkvLyBVVEMyIEdhdGUgc2VsZWN0CisjZGVmaW5lIExBUzBfVU9VVDBfU0VMRUNUICAgICAgIDB4MDFDNAkvLyBVc2VyIE91dHB1dCAwIHNvdXJjZSBzZWxlY3QKKyNkZWZpbmUgTEFTMF9VT1VUMV9TRUxFQ1QgICAgICAgMHgwMUM4CS8vIFVzZXIgT3V0cHV0IDEgc291cmNlIHNlbGVjdAorI2RlZmluZSBMQVMwX0RNQTBfUkVTRVQgICAgICAgICAweDAxQ0MJLy8gRE1BMCBSZXF1ZXN0IHN0YXRlIG1hY2hpbmUgcmVzZXQKKyNkZWZpbmUgTEFTMF9ETUExX1JFU0VUICAgICAgICAgMHgwMUQwCS8vIERNQTEgUmVxdWVzdCBzdGF0ZSBtYWNoaW5lIHJlc2V0CisKKy8qCisgIExBUzEKKyAgTmFtZQkJCUxvY2FsIEFkZHJlc3MJCQlGdW5jdGlvbgorKi8KKyNkZWZpbmUgTEFTMV9BRENfRklGTyAgICAgICAgICAgIDB4MDAwMAkvLyBSZWFkIEEvRCBGSUZPICgxNmJpdCkgLQorI2RlZmluZSBMQVMxX0hESU9fRklGTyAgICAgICAgICAgMHgwMDA0CS8vIFJlYWQgSGlnaCBTcGVlZCBEaWdpdGFsIElucHV0IEZJRk8gKDE2Yml0KSAtCisjZGVmaW5lIExBUzFfREFDMV9GSUZPICAgICAgICAgICAweDAwMDgJLy8gLSBXcml0ZSBEL0ExIEZJRk8gKDE2Yml0KQorI2RlZmluZSBMQVMxX0RBQzJfRklGTyAgICAgICAgICAgMHgwMDBDCS8vIC0gV3JpdGUgRC9BMiBGSUZPICgxNmJpdCkKKworLyoKKyAgTENGRzogUExYIDkwODAgbG9jYWwgY29uZmlnICYgcnVudGltZSByZWdpc3RlcnMKKyAgTmFtZQkJCUxvY2FsIEFkZHJlc3MJCQlGdW5jdGlvbgorKi8KKyNkZWZpbmUgTENGR19JVENTUiAgICAgICAgICAgICAgMHgwMDY4CS8vIElOVENTUiwgSW50ZXJydXB0IENvbnRyb2wvU3RhdHVzIFJlZ2lzdGVyCisjZGVmaW5lIExDRkdfRE1BTU9ERTAgICAgICAgICAgIDB4MDA4MAkvLyBETUEgQ2hhbm5lbCAwIE1vZGUgUmVnaXN0ZXIKKyNkZWZpbmUgTENGR19ETUFQQURSMCAgICAgICAgICAgMHgwMDg0CS8vIERNQSBDaGFubmVsIDAgUENJIEFkZHJlc3MgUmVnaXN0ZXIKKyNkZWZpbmUgTENGR19ETUFMQURSMCAgICAgICAgICAgMHgwMDg4CS8vIERNQSBDaGFubmVsIDAgTG9jYWwgQWRkcmVzcyBSZWcKKyNkZWZpbmUgTENGR19ETUFTSVowICAgICAgICAgICAgMHgwMDhDCS8vIERNQSBDaGFubmVsIDAgVHJhbnNmZXIgU2l6ZSAoQnl0ZXMpIFJlZ2lzdGVyCisjZGVmaW5lIExDRkdfRE1BRFBSMCAgICAgICAgICAgIDB4MDA5MAkvLyBETUEgQ2hhbm5lbCAwIERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgorI2RlZmluZSBMQ0ZHX0RNQU1PREUxICAgICAgICAgICAweDAwOTQJLy8gRE1BIENoYW5uZWwgMSBNb2RlIFJlZ2lzdGVyCisjZGVmaW5lIExDRkdfRE1BUEFEUjEgICAgICAgICAgIDB4MDA5OAkvLyBETUEgQ2hhbm5lbCAxIFBDSSBBZGRyZXNzIFJlZ2lzdGVyCisjZGVmaW5lIExDRkdfRE1BTEFEUjEgICAgICAgICAgIDB4MDA5QwkvLyBETUEgQ2hhbm5lbCAxIExvY2FsIEFkZHJlc3MgUmVnaXN0ZXIKKyNkZWZpbmUgTENGR19ETUFTSVoxICAgICAgICAgICAgMHgwMEEwCS8vIERNQSBDaGFubmVsIDEgVHJhbnNmZXIgU2l6ZSAoQnl0ZXMpIFJlZ2lzdGVyCisjZGVmaW5lIExDRkdfRE1BRFBSMSAgICAgICAgICAgIDB4MDBBNAkvLyBETUEgQ2hhbm5lbCAxIERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgorI2RlZmluZSBMQ0ZHX0RNQUNTUjAgICAgICAgICAgICAweDAwQTgJLy8gRE1BIENoYW5uZWwgMCBDb21tYW5kL1N0YXR1cyBSZWdpc3RlcgorI2RlZmluZSBMQ0ZHX0RNQUNTUjEgICAgICAgICAgICAweDAwQTkJLy8gRE1BIENoYW5uZWwgMCBDb21tYW5kL1N0YXR1cyBSZWdpc3RlcgorI2RlZmluZSBMQ0ZHX0RNQUFSQiAgICAgICAgICAgICAweDAwQUMJLy8gRE1BIEFyYml0cmF0aW9uIFJlZ2lzdGVyCisjZGVmaW5lIExDRkdfRE1BVEhSICAgICAgICAgICAgIDB4MDBCMAkvLyBETUEgVGhyZXNob2xkIFJlZ2lzdGVyCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBSZXNpc3RlciBiaXQgZGVmaW5pdGlvbnMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvLyBGSUZPIFN0YXR1cyBXb3JkIEJpdHMgKFJ0ZEZpZm9TdGF0dXMpCisjZGVmaW5lIEZTX0RBQzFfTk9UX0VNUFRZICAgIDB4MDAwMQkvLyBEMCAgLSBEQUMxIEZJRk8gbm90IGVtcHR5CisjZGVmaW5lIEZTX0RBQzFfSEVNUFRZICAgMHgwMDAyCS8vIEQxICAtIERBQzEgRklGTyBoYWxmIGVtcHR5CisjZGVmaW5lIEZTX0RBQzFfTk9UX0ZVTEwgICAgIDB4MDAwNAkvLyBEMiAgLSBEQUMxIEZJRk8gbm90IGZ1bGwKKyNkZWZpbmUgRlNfREFDMl9OT1RfRU1QVFkgICAgMHgwMDEwCS8vIEQ0ICAtIERBQzIgRklGTyBub3QgZW1wdHkKKyNkZWZpbmUgRlNfREFDMl9IRU1QVFkgICAweDAwMjAJLy8gRDUgIC0gREFDMiBGSUZPIGhhbGYgZW1wdHkKKyNkZWZpbmUgRlNfREFDMl9OT1RfRlVMTCAgICAgMHgwMDQwCS8vIEQ2ICAtIERBQzIgRklGTyBub3QgZnVsbAorI2RlZmluZSBGU19BRENfTk9UX0VNUFRZICAgICAweDAxMDAJLy8gRDggIC0gQURDIEZJRk8gbm90IGVtcHR5CisjZGVmaW5lIEZTX0FEQ19IRU1QVFkgICAgMHgwMjAwCS8vIEQ5ICAtIEFEQyBGSUZPIGhhbGYgZW1wdHkKKyNkZWZpbmUgRlNfQURDX05PVF9GVUxMICAgICAgMHgwNDAwCS8vIEQxMCAtIEFEQyBGSUZPIG5vdCBmdWxsCisjZGVmaW5lIEZTX0RJTl9OT1RfRU1QVFkgICAgIDB4MTAwMAkvLyBEMTIgLSBESU4gRklGTyBub3QgZW1wdHkKKyNkZWZpbmUgRlNfRElOX0hFTVBUWSAgICAweDIwMDAJLy8gRDEzIC0gRElOIEZJRk8gaGFsZiBlbXB0eQorI2RlZmluZSBGU19ESU5fTk9UX0ZVTEwgICAgICAweDQwMDAJLy8gRDE0IC0gRElOIEZJRk8gbm90IGZ1bGwKKworLy8gVGltZXIgU3RhdHVzIFdvcmQgQml0cyAoR2V0VGltZXJTdGF0dXMpCisjZGVmaW5lIFRTX1BDTEtfR0FURSAgIDB4MDAwMQorLy8gRDAgLSBQYWNlciBDbG9jayBHYXRlIFswIC0gZ2F0ZWQsIDEgLSBlbmFibGVkXQorI2RlZmluZSBUU19CQ0xLX0dBVEUgICAweDAwMDIKKy8vIEQxIC0gQnVyc3QgQ2xvY2sgR2F0ZSBbMCAtIGRpc2FibGVkLCAxIC0gcnVubmluZ10KKyNkZWZpbmUgVFNfRENOVF9HQVRFICAgMHgwMDA0CisvLyBEMiAtIFBhY2VyIENsb2NrIERlbGF5ZWQgU3RhcnQgVHJpZ2dlciBbMCAtIGRlbGF5IG92ZXIsIDEgLSBkZWxheSBpbgorLy8gcHJvZ3Jlc3NdCisjZGVmaW5lIFRTX0FDTlRfR0FURSAgIDB4MDAwOAorLy8gRDMgLSBQYWNlciBDbG9jayBBYm91dCBUcmlnZ2VyIFswIC0gY29tcGxldGVkLCAxIC0gaW4gcHJvZ3Jlc3NdCisjZGVmaW5lIFRTX1BDTEtfUlVOICAgIDB4MDAxMAorLy8gRDQgLSBQYWNlciBDbG9jayBTaHV0ZG93biBGbGFnIFswIC0gUGFjZXIgQ2xvY2sgY2Fubm90IGJlIHN0YXJ0CisvLyB0cmlnZ2VyZWQgb25seSBieSBTb2Z0d2FyZSBQYWNlciBTdGFydCBDb21tYW5kLCAxIC0gUGFjZXIgQ2xvY2sgY2FuCisvLyBiZSBzdGFydCB0cmlnZ2VyZWRdCisKKy8vIEV4dGVybmFsIFRyaWdnZXIgcG9sYXJpdHkgc2VsZWN0CisvLyBFeHRlcm5hbCBJbnRlcnJ1cHQgcG9sYXJpdHkgc2VsZWN0CisjZGVmaW5lIFBPTF9QT1NJVElWRSAgICAgICAgIDB4MAkvLyBwb3NpdGl2ZSBlZGdlCisjZGVmaW5lIFBPTF9ORUdBVElWRSAgICAgICAgIDB4MQkvLyBuZWdhdGl2ZSBlZGdlCisKKy8vIFVzZXIgT3V0cHV0IFNpZ25hbCBzZWxlY3QgKFNldFVvdXQwU291cmNlLCBTZXRVb3V0MVNvdXJjZSkKKyNkZWZpbmUgVU9VVF9BREMgICAgICAgICAgICAgICAgMHgwCS8vIEEvRCBDb252ZXJzaW9uIFNpZ25hbAorI2RlZmluZSBVT1VUX0RBQzEgICAgICAgICAgICAgICAweDEJLy8gRC9BMSBVcGRhdGUKKyNkZWZpbmUgVU9VVF9EQUMyICAgICAgICAgICAgICAgMHgyCS8vIEQvQTIgVXBkYXRlCisjZGVmaW5lIFVPVVRfU09GVFdBUkUgICAgICAgICAgIDB4MwkvLyBTb2Z0d2FyZSBQcm9ncmFtbWFibGUKKworLy8gUGFjZXIgY2xvY2sgc2VsZWN0IChTZXRQYWNlclNvdXJjZSkKKyNkZWZpbmUgUENMS19JTlRFUk5BTCAgICAgICAgICAgMQkvLyBJbnRlcm5hbCBQYWNlciBDbG9jaworI2RlZmluZSBQQ0xLX0VYVEVSTkFMICAgICAgICAgICAwCS8vIEV4dGVybmFsIFBhY2VyIENsb2NrCisKKy8vIEEvRCBTYW1wbGUgQ291bnRlciBTb3VyY2VzIChTZXRBZGNudFNvdXJjZSwgU2V0dXBTYW1wbGVDb3VudGVyKQorI2RlZmluZSBBRENfU0NOVF9DR1RfUkVTRVQgICAgICAgICAweDAJLy8gbmVlZHMgcmVzdGFydCB3aXRoIFN0YXJ0UGFjZXIKKyNkZWZpbmUgQURDX1NDTlRfRklGT19XUklURSAgICAgICAgMHgxCisKKy8vIEEvRCBDb252ZXJzaW9uIFNpZ25hbCBTZWxlY3QgKGZvciBTZXRDb252ZXJzaW9uU2VsZWN0KQorI2RlZmluZSBBRENfU1RBUlRfU09GVFdBUkUgICAgICAgICAweDAJLy8gU29mdHdhcmUgQS9EIFN0YXJ0CisjZGVmaW5lIEFEQ19TVEFSVF9QQ0xLICAgICAgICAgICAgIDB4MQkvLyBQYWNlciBDbG9jayAoRXh0LiBJbnQuIHNlZSBGdW5jLjUwOSkKKyNkZWZpbmUgQURDX1NUQVJUX0JDTEsgICAgICAgICAgICAgMHgyCS8vIEJ1cnN0IENsb2NrCisjZGVmaW5lIEFEQ19TVEFSVF9ESUdJVEFMX0lUICAgICAgIDB4MwkvLyBEaWdpdGFsIEludGVycnVwdAorI2RlZmluZSBBRENfU1RBUlRfREFDMV9NQVJLRVIxICAgICAweDQJLy8gRC9BIDEgRGF0YSBNYXJrZXIgMQorI2RlZmluZSBBRENfU1RBUlRfREFDMl9NQVJLRVIxICAgICAweDUJLy8gRC9BIDIgRGF0YSBNYXJrZXIgMQorI2RlZmluZSBBRENfU1RBUlRfU0JVUzAgICAgICAgICAgICAweDYJLy8gU3luY0J1cyAwCisjZGVmaW5lIEFEQ19TVEFSVF9TQlVTMSAgICAgICAgICAgIDB4NwkvLyBTeW5jQnVzIDEKKyNkZWZpbmUgQURDX1NUQVJUX1NCVVMyICAgICAgICAgICAgMHg4CS8vIFN5bmNCdXMgMgorCisvLyBCdXJzdCBDbG9jayBzdGFydCB0cmlnZ2VyIHNlbGVjdCAoU2V0QnVyc3RTdGFydCkKKyNkZWZpbmUgQkNMS19TVEFSVF9TT0ZUV0FSRSAgICAgICAgMHgwCS8vIFNvZnR3YXJlIEEvRCBTdGFydCAoU3RhcnRCdXJzdCkKKyNkZWZpbmUgQkNMS19TVEFSVF9QQ0xLICAgICAgICAgICAgMHgxCS8vIFBhY2VyIENsb2NrCisjZGVmaW5lIEJDTEtfU1RBUlRfRVRSSUcgICAgICAgICAgIDB4MgkvLyBFeHRlcm5hbCBUcmlnZ2VyCisjZGVmaW5lIEJDTEtfU1RBUlRfRElHSVRBTF9JVCAgICAgIDB4MwkvLyBEaWdpdGFsIEludGVycnVwdAorI2RlZmluZSBCQ0xLX1NUQVJUX1NCVVMwICAgICAgICAgICAweDQJLy8gU3luY0J1cyAwCisjZGVmaW5lIEJDTEtfU1RBUlRfU0JVUzEgICAgICAgICAgIDB4NQkvLyBTeW5jQnVzIDEKKyNkZWZpbmUgQkNMS19TVEFSVF9TQlVTMiAgICAgICAgICAgMHg2CS8vIFN5bmNCdXMgMgorCisvLyBQYWNlciBDbG9jayBzdGFydCB0cmlnZ2VyIHNlbGVjdCAoU2V0UGFjZXJTdGFydCkKKyNkZWZpbmUgUENMS19TVEFSVF9TT0ZUV0FSRSAgICAgICAgMHgwCS8vIFNvZnR3YXJlIFBhY2VyIFN0YXJ0IChTdGFydFBhY2VyKQorI2RlZmluZSBQQ0xLX1NUQVJUX0VUUklHICAgICAgICAgICAweDEJLy8gRXh0ZXJuYWwgdHJpZ2dlcgorI2RlZmluZSBQQ0xLX1NUQVJUX0RJR0lUQUxfSVQgICAgICAweDIJLy8gRGlnaXRhbCBpbnRlcnJ1cHQKKyNkZWZpbmUgUENMS19TVEFSVF9VVEMyICAgICAgICAgICAgMHgzCS8vIFVzZXIgVEMgMiBvdXQKKyNkZWZpbmUgUENMS19TVEFSVF9TQlVTMCAgICAgICAgICAgMHg0CS8vIFN5bmNCdXMgMAorI2RlZmluZSBQQ0xLX1NUQVJUX1NCVVMxICAgICAgICAgICAweDUJLy8gU3luY0J1cyAxCisjZGVmaW5lIFBDTEtfU1RBUlRfU0JVUzIgICAgICAgICAgIDB4NgkvLyBTeW5jQnVzIDIKKyNkZWZpbmUgUENMS19TVEFSVF9EX1NPRlRXQVJFICAgICAgMHg4CS8vIERlbGF5ZWQgU29mdHdhcmUgUGFjZXIgU3RhcnQKKyNkZWZpbmUgUENMS19TVEFSVF9EX0VUUklHICAgICAgICAgMHg5CS8vIERlbGF5ZWQgZXh0ZXJuYWwgdHJpZ2dlcgorI2RlZmluZSBQQ0xLX1NUQVJUX0RfRElHSVRBTF9JVCAgICAweEEJLy8gRGVsYXllZCBkaWdpdGFsIGludGVycnVwdAorI2RlZmluZSBQQ0xLX1NUQVJUX0RfVVRDMiAgICAgICAgICAweEIJLy8gRGVsYXllZCBVc2VyIFRDIDIgb3V0CisjZGVmaW5lIFBDTEtfU1RBUlRfRF9TQlVTMCAgICAgICAgIDB4QwkvLyBEZWxheWVkIFN5bmNCdXMgMAorI2RlZmluZSBQQ0xLX1NUQVJUX0RfU0JVUzEgICAgICAgICAweEQJLy8gRGVsYXllZCBTeW5jQnVzIDEKKyNkZWZpbmUgUENMS19TVEFSVF9EX1NCVVMyICAgICAgICAgMHhFCS8vIERlbGF5ZWQgU3luY0J1cyAyCisjZGVmaW5lIFBDTEtfU1RBUlRfRVRSSUdfR0FURUQgICAgIDB4RgkvLyBFeHRlcm5hbCBUcmlnZ2VyIEdhdGVkIGNvbnRyb2xsZWQgbW9kZQorCisvLyBQYWNlciBDbG9jayBTdG9wIFRyaWdnZXIgc2VsZWN0IChTZXRQYWNlclN0b3ApCisjZGVmaW5lIFBDTEtfU1RPUF9TT0ZUV0FSRSAgICAgICAgIDB4MAkvLyBTb2Z0d2FyZSBQYWNlciBTdG9wIChTdG9wUGFjZXIpCisjZGVmaW5lIFBDTEtfU1RPUF9FVFJJRyAgICAgICAgICAgIDB4MQkvLyBFeHRlcm5hbCBUcmlnZ2VyCisjZGVmaW5lIFBDTEtfU1RPUF9ESUdJVEFMX0lUICAgICAgIDB4MgkvLyBEaWdpdGFsIEludGVycnVwdAorI2RlZmluZSBQQ0xLX1NUT1BfQUNOVCAgICAgICAgICAgICAweDMJLy8gQWJvdXQgQ291bnRlcgorI2RlZmluZSBQQ0xLX1NUT1BfVVRDMiAgICAgICAgICAgICAweDQJLy8gVXNlciBUQzIgb3V0CisjZGVmaW5lIFBDTEtfU1RPUF9TQlVTMCAgICAgICAgICAgIDB4NQkvLyBTeW5jQnVzIDAKKyNkZWZpbmUgUENMS19TVE9QX1NCVVMxICAgICAgICAgICAgMHg2CS8vIFN5bmNCdXMgMQorI2RlZmluZSBQQ0xLX1NUT1BfU0JVUzIgICAgICAgICAgICAweDcJLy8gU3luY0J1cyAyCisjZGVmaW5lIFBDTEtfU1RPUF9BX1NPRlRXQVJFICAgICAgIDB4OAkvLyBBYm91dCBTb2Z0d2FyZSBQYWNlciBTdG9wCisjZGVmaW5lIFBDTEtfU1RPUF9BX0VUUklHICAgICAgICAgIDB4OQkvLyBBYm91dCBFeHRlcm5hbCBUcmlnZ2VyCisjZGVmaW5lIFBDTEtfU1RPUF9BX0RJR0lUQUxfSVQgICAgIDB4QQkvLyBBYm91dCBEaWdpdGFsIEludGVycnVwdAorI2RlZmluZSBQQ0xLX1NUT1BfQV9VVEMyICAgICAgICAgICAweEMJLy8gQWJvdXQgVXNlciBUQzIgb3V0CisjZGVmaW5lIFBDTEtfU1RPUF9BX1NCVVMwICAgICAgICAgIDB4RAkvLyBBYm91dCBTeW5jQnVzIDAKKyNkZWZpbmUgUENMS19TVE9QX0FfU0JVUzEgICAgICAgICAgMHhFCS8vIEFib3V0IFN5bmNCdXMgMQorI2RlZmluZSBQQ0xLX1NUT1BfQV9TQlVTMiAgICAgICAgICAweEYJLy8gQWJvdXQgU3luY0J1cyAyCisKKy8vIEFib3V0IENvdW50ZXIgU3RvcCBFbmFibGUKKyNkZWZpbmUgQUNOVF9TVE9QICAgICAgICAgICAgICAgICAgMHgwCS8vIHN0b3AgZW5hYmxlCisjZGVmaW5lIEFDTlRfTk9fU1RPUCAgICAgICAgICAgICAgIDB4MQkvLyBzdG9wIGRpc2FibGVkCisKKy8vIERBQyB1cGRhdGUgc291cmNlIChTZXREQUMxU3RhcnQgJiBTZXREQUMyU3RhcnQpCisjZGVmaW5lIERBQ19TVEFSVF9TT0ZUV0FSRSAgICAgICAgIDB4MAkvLyBTb2Z0d2FyZSBVcGRhdGUKKyNkZWZpbmUgREFDX1NUQVJUX0NHVCAgICAgICAgICAgICAgMHgxCS8vIENHVCBjb250cm9sbGVkIFVwZGF0ZQorI2RlZmluZSBEQUNfU1RBUlRfREFDX0NMSyAgICAgICAgICAweDIJLy8gRC9BIENsb2NrCisjZGVmaW5lIERBQ19TVEFSVF9FUENMSyAgICAgICAgICAgIDB4MwkvLyBFeHRlcm5hbCBQYWNlciBDbG9jaworI2RlZmluZSBEQUNfU1RBUlRfU0JVUzAgICAgICAgICAgICAweDQJLy8gU3luY0J1cyAwCisjZGVmaW5lIERBQ19TVEFSVF9TQlVTMSAgICAgICAgICAgIDB4NQkvLyBTeW5jQnVzIDEKKyNkZWZpbmUgREFDX1NUQVJUX1NCVVMyICAgICAgICAgICAgMHg2CS8vIFN5bmNCdXMgMgorCisvLyBEQUMgQ3ljbGUgTW9kZSAoU2V0REFDMUN5Y2xlLCBTZXREQUMyQ3ljbGUsIFNldHVwREFDKQorI2RlZmluZSBEQUNfQ1lDTEVfU0lOR0xFICAgICAgICAgICAweDAJLy8gbm90IGN5Y2xlCisjZGVmaW5lIERBQ19DWUNMRV9NVUxUSSAgICAgICAgICAgIDB4MQkvLyBjeWNsZQorCisvLyA4MjU0IE9wZXJhdGlvbiBNb2RlcyAoU2V0ODI1NE1vZGUsIFNldHVwVGltZXJDb3VudGVyKQorI2RlZmluZSBNODI1NF9FVkVOVF9DT1VOVEVSICAgICAgICAwCS8vIEV2ZW50IENvdW50ZXIKKyNkZWZpbmUgTTgyNTRfSFdfT05FX1NIT1QgICAgICAgICAgMQkvLyBIYXJkd2FyZS1SZXRyaWdnZXJhYmxlIE9uZS1TaG90CisjZGVmaW5lIE04MjU0X1JBVEVfR0VORVJBVE9SICAgICAgIDIJLy8gUmF0ZSBHZW5lcmF0b3IKKyNkZWZpbmUgTTgyNTRfU1FVQVJFX1dBVkUgICAgICAgICAgMwkvLyBTcXVhcmUgV2F2ZSBNb2RlCisjZGVmaW5lIE04MjU0X1NXX1NUUk9CRSAgICAgICAgICAgIDQJLy8gU29mdHdhcmUgVHJpZ2dlcmVkIFN0cm9iZQorI2RlZmluZSBNODI1NF9IV19TVFJPQkUgICAgICAgICAgICA1CS8vIEhhcmR3YXJlIFRyaWdnZXJlZCBTdHJvYmUgKFJldHJpZ2dlcmFibGUpCisKKy8vIFVzZXIgVGltZXIvQ291bnRlciAwIENsb2NrIFNlbGVjdCAoU2V0VXRjMENsb2NrKQorI2RlZmluZSBDVVRDMF84TUhaICAgICAgICAgICAgICAgICAweDAJLy8gOE1IegorI2RlZmluZSBDVVRDMF9FWFRfVENfQ0xPQ0sxICAgICAgICAweDEJLy8gRXh0LiBUQyBDbG9jayAxCisjZGVmaW5lIENVVEMwX0VYVF9UQ19DTE9DSzIgICAgICAgIDB4MgkvLyBFeHQuIFRDIENsb2NrIDIKKyNkZWZpbmUgQ1VUQzBfRVhUX1BDTEsgICAgICAgICAgICAgMHgzCS8vIEV4dC4gUGFjZXIgQ2xvY2sKKworLy8gVXNlciBUaW1lci9Db3VudGVyIDEgQ2xvY2sgU2VsZWN0IChTZXRVdGMxQ2xvY2spCisjZGVmaW5lIENVVEMxXzhNSFogICAgICAgICAgICAgICAgIDB4MAkvLyA4TUh6CisjZGVmaW5lIENVVEMxX0VYVF9UQ19DTE9DSzEgICAgICAgIDB4MQkvLyBFeHQuIFRDIENsb2NrIDEKKyNkZWZpbmUgQ1VUQzFfRVhUX1RDX0NMT0NLMiAgICAgICAgMHgyCS8vIEV4dC4gVEMgQ2xvY2sgMgorI2RlZmluZSBDVVRDMV9FWFRfUENMSyAgICAgICAgICAgICAweDMJLy8gRXh0LiBQYWNlciBDbG9jaworI2RlZmluZSBDVVRDMV9VVEMwX09VVCAgICAgICAgICAgICAweDQJLy8gVXNlciBUaW1lci9Db3VudGVyIDAgb3V0CisjZGVmaW5lIENVVEMxX0RJTl9TSUdOQUwgICAgICAgICAgIDB4NQkvLyBIaWdoLVNwZWVkIERpZ2l0YWwgSW5wdXQgICBTYW1wbGluZyBzaWduYWwKKworLy8gVXNlciBUaW1lci9Db3VudGVyIDIgQ2xvY2sgU2VsZWN0IChTZXRVdGMyQ2xvY2spCisjZGVmaW5lIENVVEMyXzhNSFogICAgICAgICAgICAgICAgIDB4MAkvLyA4TUh6CisjZGVmaW5lIENVVEMyX0VYVF9UQ19DTE9DSzEgICAgICAgIDB4MQkvLyBFeHQuIFRDIENsb2NrIDEKKyNkZWZpbmUgQ1VUQzJfRVhUX1RDX0NMT0NLMiAgICAgICAgMHgyCS8vIEV4dC4gVEMgQ2xvY2sgMgorI2RlZmluZSBDVVRDMl9FWFRfUENMSyAgICAgICAgICAgICAweDMJLy8gRXh0LiBQYWNlciBDbG9jaworI2RlZmluZSBDVVRDMl9VVEMxX09VVCAgICAgICAgICAgICAweDQJLy8gVXNlciBUaW1lci9Db3VudGVyIDEgb3V0CisKKy8vIFVzZXIgVGltZXIvQ291bnRlciAwIEdhdGUgU2VsZWN0IChTZXRVdGMwR2F0ZSkKKyNkZWZpbmUgR1VUQzBfTk9UX0dBVEVEICAgICAgICAgICAgMHgwCS8vIE5vdCBnYXRlZAorI2RlZmluZSBHVVRDMF9HQVRFRCAgICAgICAgICAgICAgICAweDEJLy8gR2F0ZWQKKyNkZWZpbmUgR1VUQzBfRVhUX1RDX0dBVEUxICAgICAgICAgMHgyCS8vIEV4dC4gVEMgR2F0ZSAxCisjZGVmaW5lIEdVVEMwX0VYVF9UQ19HQVRFMiAgICAgICAgIDB4MwkvLyBFeHQuIFRDIEdhdGUgMgorCisvLyBVc2VyIFRpbWVyL0NvdW50ZXIgMSBHYXRlIFNlbGVjdCAoU2V0VXRjMUdhdGUpCisjZGVmaW5lIEdVVEMxX05PVF9HQVRFRCAgICAgICAgICAgIDB4MAkvLyBOb3QgZ2F0ZWQKKyNkZWZpbmUgR1VUQzFfR0FURUQgICAgICAgICAgICAgICAgMHgxCS8vIEdhdGVkCisjZGVmaW5lIEdVVEMxX0VYVF9UQ19HQVRFMSAgICAgICAgIDB4MgkvLyBFeHQuIFRDIEdhdGUgMQorI2RlZmluZSBHVVRDMV9FWFRfVENfR0FURTIgICAgICAgICAweDMJLy8gRXh0LiBUQyBHYXRlIDIKKyNkZWZpbmUgR1VUQzFfVVRDMF9PVVQgICAgICAgICAgICAgMHg0CS8vIFVzZXIgVGltZXIvQ291bnRlciAwIG91dAorCisvLyBVc2VyIFRpbWVyL0NvdW50ZXIgMiBHYXRlIFNlbGVjdCAoU2V0VXRjMkdhdGUpCisjZGVmaW5lIEdVVEMyX05PVF9HQVRFRCAgICAgICAgICAgIDB4MAkvLyBOb3QgZ2F0ZWQKKyNkZWZpbmUgR1VUQzJfR0FURUQgICAgICAgICAgICAgICAgMHgxCS8vIEdhdGVkCisjZGVmaW5lIEdVVEMyX0VYVF9UQ19HQVRFMSAgICAgICAgIDB4MgkvLyBFeHQuIFRDIEdhdGUgMQorI2RlZmluZSBHVVRDMl9FWFRfVENfR0FURTIgICAgICAgICAweDMJLy8gRXh0LiBUQyBHYXRlIDIKKyNkZWZpbmUgR1VUQzJfVVRDMV9PVVQgICAgICAgICAgICAgMHg0CS8vIFVzZXIgVGltZXIvQ291bnRlciAxIG91dAorCisvLyBJbnRlcnJ1cHQgU291cmNlIE1hc2tzIChTZXRJVE1hc2ssIENsZWFySVRNYXNrLCBHZXRJVFN0YXR1cykKKyNkZWZpbmUgSVJRTV9BRENfRklGT19XUklURSAgICAgICAgMHgwMDAxCS8vIEFEQyBGSUZPIFdyaXRlCisjZGVmaW5lIElSUU1fQ0dUX1JFU0VUICAgICAgICAgICAgIDB4MDAwMgkvLyBSZXNldCBDR1QKKyNkZWZpbmUgSVJRTV9DR1RfUEFVU0UgICAgICAgICAgICAgMHgwMDA4CS8vIFBhdXNlIENHVAorI2RlZmluZSBJUlFNX0FEQ19BQk9VVF9DTlQgICAgICAgICAweDAwMTAJLy8gQWJvdXQgQ291bnRlciBvdXQKKyNkZWZpbmUgSVJRTV9BRENfREVMQVlfQ05UICAgICAgICAgMHgwMDIwCS8vIERlbGF5IENvdW50ZXIgb3V0CisjZGVmaW5lIElSUU1fQURDX1NBTVBMRV9DTlQJICAgMHgwMDQwCS8vIEFEQyBTYW1wbGUgQ291bnRlcgorI2RlZmluZSBJUlFNX0RBQzFfVUNOVCAgICAgICAgICAgICAweDAwODAJLy8gREFDMSBVcGRhdGUgQ291bnRlcgorI2RlZmluZSBJUlFNX0RBQzJfVUNOVCAgICAgICAgICAgICAweDAxMDAJLy8gREFDMiBVcGRhdGUgQ291bnRlcgorI2RlZmluZSBJUlFNX1VUQzEgICAgICAgICAgICAgICAgICAweDAyMDAJLy8gVXNlciBUQzEgb3V0CisjZGVmaW5lIElSUU1fVVRDMV9JTlYgICAgICAgICAgICAgIDB4MDQwMAkvLyBVc2VyIFRDMSBvdXQsIGludmVydGVkCisjZGVmaW5lIElSUU1fVVRDMiAgICAgICAgICAgICAgICAgIDB4MDgwMAkvLyBVc2VyIFRDMiBvdXQKKyNkZWZpbmUgSVJRTV9ESUdJVEFMX0lUICAgICAgICAgICAgMHgxMDAwCS8vIERpZ2l0YWwgSW50ZXJydXB0CisjZGVmaW5lIElSUU1fRVhURVJOQUxfSVQgICAgICAgICAgIDB4MjAwMAkvLyBFeHRlcm5hbCBJbnRlcnJ1cHQKKyNkZWZpbmUgSVJRTV9FVFJJR19SSVNJTkcgICAgICAgICAgMHg0MDAwCS8vIEV4dGVybmFsIFRyaWdnZXIgcmlzaW5nLWVkZ2UKKyNkZWZpbmUgSVJRTV9FVFJJR19GQUxMSU5HICAgICAgICAgMHg4MDAwCS8vIEV4dGVybmFsIFRyaWdnZXIgZmFsbGluZy1lZGdlCisKKy8vIERNQSBSZXF1ZXN0IFNvdXJjZXMgKExBUzApCisjZGVmaW5lIERNQVNfRElTQUJMRUQgICAgICAgICAgICAgIDB4MAkvLyBETUEgRGlzYWJsZWQKKyNkZWZpbmUgRE1BU19BRENfU0NOVCAgICAgICAgICAgICAgMHgxCS8vIEFEQyBTYW1wbGUgQ291bnRlcgorI2RlZmluZSBETUFTX0RBQzFfVUNOVCAgICAgICAgICAgICAweDIJLy8gRC9BMSBVcGRhdGUgQ291bnRlcgorI2RlZmluZSBETUFTX0RBQzJfVUNOVCAgICAgICAgICAgICAweDMJLy8gRC9BMiBVcGRhdGUgQ291bnRlcgorI2RlZmluZSBETUFTX1VUQzEgICAgICAgICAgICAgICAgICAweDQJLy8gVXNlciBUQzEgb3V0CisjZGVmaW5lIERNQVNfQURGSUZPX0hBTEZfRlVMTCAgICAgIDB4OAkvLyBBL0QgRklGTyBoYWxmIGZ1bGwKKyNkZWZpbmUgRE1BU19EQUMxX0ZJRk9fSEFMRl9FTVBUWSAgMHg5CS8vIEQvQTEgRklGTyBoYWxmIGVtcHR5CisjZGVmaW5lIERNQVNfREFDMl9GSUZPX0hBTEZfRU1QVFkgIDB4QQkvLyBEL0EyIEZJRk8gaGFsZiBlbXB0eQorCisvLyBETUEgTG9jYWwgQWRkcmVzc2VzICAgKDB4NDAwMDAwMDArTEFTMSBvZmZzZXQpCisjZGVmaW5lIERNQUxBRERSX0FEQyAgICAgICAweDQwMDAwMDAwCS8vIEEvRCBGSUZPCisjZGVmaW5lIERNQUxBRERSX0hESU4gICAgICAweDQwMDAwMDA0CS8vIEhpZ2ggU3BlZWQgRGlnaXRhbCBJbnB1dCBGSUZPCisjZGVmaW5lIERNQUxBRERSX0RBQzEgICAgICAweDQwMDAwMDA4CS8vIEQvQTEgRklGTworI2RlZmluZSBETUFMQUREUl9EQUMyICAgICAgMHg0MDAwMDAwQwkvLyBEL0EyIEZJRk8KKworLy8gUG9ydCAwIGNvbXBhcmUgbW9kZXMgKFNldERJTzBDb21wYXJlTW9kZSkKKyNkZWZpbmUgRElPX01PREVfRVZFTlQgICAgIDAJLy8gRXZlbnQgTW9kZQorI2RlZmluZSBESU9fTU9ERV9NQVRDSCAgICAgMQkvLyBNYXRjaCBNb2RlCisKKy8vIERpZ2l0YWwgVGFibGUgRW5hYmxlIChQb3J0IDEgZGlzYWJsZSkKKyNkZWZpbmUgRFRCTF9ESVNBQkxFICAgICAgIDAJLy8gRW5hYmxlIERpZ2l0YWwgVGFibGUKKyNkZWZpbmUgRFRCTF9FTkFCTEUgICAgICAgIDEJLy8gRGlzYWJsZSBEaWdpdGFsIFRhYmxlCisKKy8vIFNhbXBsaW5nIFNpZ25hbCBmb3IgSGlnaCBTcGVlZCBEaWdpdGFsIElucHV0IChTZXRIZGluU3RhcnQpCisjZGVmaW5lIEhESU5fU09GVFdBUkUgICAgICAweDAJLy8gU29mdHdhcmUgVHJpZ2dlcgorI2RlZmluZSBIRElOX0FEQyAgICAgICAgICAgMHgxCS8vIEEvRCBDb252ZXJzaW9uIFNpZ25hbAorI2RlZmluZSBIRElOX1VUQzAgICAgICAgICAgMHgyCS8vIFVzZXIgVEMgb3V0IDAKKyNkZWZpbmUgSERJTl9VVEMxICAgICAgICAgIDB4MwkvLyBVc2VyIFRDIG91dCAxCisjZGVmaW5lIEhESU5fVVRDMiAgICAgICAgICAweDQJLy8gVXNlciBUQyBvdXQgMgorI2RlZmluZSBIRElOX0VQQ0xLICAgICAgICAgMHg1CS8vIEV4dGVybmFsIFBhY2VyIENsb2NrCisjZGVmaW5lIEhESU5fRVRSRyAgICAgICAgICAweDYJLy8gRXh0ZXJuYWwgVHJpZ2dlcgorCisvLyBDaGFubmVsIEdhaW4gVGFibGUgLyBDaGFubmVsIEdhaW4gTGF0Y2gKKyNkZWZpbmUgQ1NDX0xBVENIICAgICAgICAgIDAJLy8gQ2hhbm5lbCBHYWluIExhdGNoIG1vZGUKKyNkZWZpbmUgQ1NDX0NHVCAgICAgICAgICAgIDEJLy8gQ2hhbm5lbCBHYWluIFRhYmxlIG1vZGUKKworLy8gQ2hhbm5lbCBHYWluIFRhYmxlIFBhdXNlIEVuYWJsZQorI2RlZmluZSBDR1RfUEFVU0VfRElTQUJMRSAgMAkvLyBDaGFubmVsIEdhaW4gVGFibGUgUGF1c2UgRGlzYWJsZQorI2RlZmluZSBDR1RfUEFVU0VfRU5BQkxFICAgMQkvLyBDaGFubmVsIEdhaW4gVGFibGUgUGF1c2UgRW5hYmxlCisKKy8vIERBQyBvdXRwdXQgdHlwZS9yYW5nZSAocDYzKQorI2RlZmluZSBBT1VUX1VOSVA1ICAgICAgICAgMAkvLyAwLi4rNSBWb2x0CisjZGVmaW5lIEFPVVRfVU5JUDEwICAgICAgICAxCS8vIDAuLisxMCBWb2x0CisjZGVmaW5lIEFPVVRfQklQNSAgICAgICAgICAyCS8vIC01Li4rNSBWb2x0CisjZGVmaW5lIEFPVVRfQklQMTAgICAgICAgICAzCS8vIC0xMC4uKzEwIFZvbHQKKworLy8gR2hhbm5lbCBHYWluIFRhYmxlIGZpZWxkIGRlZmluaXRpb25zIChwNjEpCisvLyBHYWluCisjZGVmaW5lIEdBSU4xICAgICAgICAgICAgICAwCisjZGVmaW5lIEdBSU4yICAgICAgICAgICAgICAxCisjZGVmaW5lIEdBSU40ICAgICAgICAgICAgICAyCisjZGVmaW5lIEdBSU44ICAgICAgICAgICAgICAzCisjZGVmaW5lIEdBSU4xNiAgICAgICAgICAgICA0CisjZGVmaW5lIEdBSU4zMiAgICAgICAgICAgICA1CisjZGVmaW5lIEdBSU42NCAgICAgICAgICAgICA2CisjZGVmaW5lIEdBSU4xMjggICAgICAgICAgICA3CisKKy8vIElucHV0IHJhbmdlL3BvbGFyaXR5CisjZGVmaW5lIEFJTl9CSVA1ICAgICAgICAgICAwCS8vIC01Li4rNSBWb2x0CisjZGVmaW5lIEFJTl9CSVAxMCAgICAgICAgICAxCS8vIC0xMC4uKzEwIFZvbHQKKyNkZWZpbmUgQUlOX1VOSVAxMCAgICAgICAgIDIJLy8gMC4uKzEwIFZvbHQKKworLy8gbm9uIHJlZmVyZW5jZWQgc2luZ2xlIGVuZGVkIHNlbGVjdCBiaXQKKyNkZWZpbmUgTlJTRV9BR05EICAgICAgICAgIDAJLy8gQUdORCByZWZlcmVuY2VkIFNFIGlucHV0CisjZGVmaW5lIE5SU0VfQUlOUyAgICAgICAgICAxCS8vIEFJTiBTRU5TRSByZWZlcmVuY2VkIFNFIGlucHV0CisKKy8vIHNpbmdsZSBlbmRlZCB2cyBkaWZmZXJlbnRpYWwKKyNkZWZpbmUgR05EX1NFCQkwCS8vIFNpbmdsZS1FbmRlZAorI2RlZmluZSBHTkRfRElGRgkxCS8vIERpZmZlcmVudGlhbApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M2MjYuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNjI2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY5ZWU4YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNjI2LmMKQEAgLTAsMCArMSwzMjU0IEBACisvKgorICBjb21lZGkvZHJpdmVycy9zNjI2LmMKKyAgU2Vuc29yYXkgczYyNiBDb21lZGkgZHJpdmVyCisKKyAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICBDb3B5cmlnaHQgKEMpIDIwMDAgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgQmFzZWQgb24gU2Vuc29yYXkgTW9kZWwgNjI2IExpbnV4IGRyaXZlciBWZXJzaW9uIDAuMgorICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBTZW5zb3JheSBDby4sIEluYy4KKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyovCisKKy8qCitEcml2ZXI6IHM2MjYKK0Rlc2NyaXB0aW9uOiBTZW5zb3JheSA2MjYgZHJpdmVyCitEZXZpY2VzOiBbU2Vuc29yYXldIDYyNiAoczYyNikKK0F1dGhvcnM6IEdpYW5sdWNhIFBhbGxpIDxncGFsbGlAZGVpcy51bmliby5pdD4sCitVcGRhdGVkOiBGcmksIDE1IEZlYiAyMDA4IDEwOjI4OjQyICswMDAwCitTdGF0dXM6IGV4cGVyaW1lbnRhbAorCitDb25maWd1cmF0aW9uIG9wdGlvbnM6CisgIFswXSAtIFBDSSBidXMgb2YgZGV2aWNlIChvcHRpb25hbCkKKyAgWzFdIC0gUENJIHNsb3Qgb2YgZGV2aWNlIChvcHRpb25hbCkKKyAgSWYgYnVzL3Nsb3QgaXMgbm90IHNwZWNpZmllZCwgdGhlIGZpcnN0IHN1cHBvcnRlZAorICBQQ0kgZGV2aWNlIGZvdW5kIHdpbGwgYmUgdXNlZC4KKworSU5TTl9DT05GSUcgaW5zdHJ1Y3Rpb25zOgorICBhbmFsb2cgaW5wdXQ6CisgICBub25lCisKKyAgYW5hbG9nIG91dHB1dDoKKyAgIG5vbmUKKworICBkaWdpdGFsIGNoYW5uZWw6CisgICBzNjI2IGhhcyAzIGRpbyBzdWJkZXZpY2VzICgyLDMgYW5kIDQpIGVhY2ggd2l0aCAxNiBpL28gY2hhbm5lbHMKKyAgIHN1cHBvcnRlZCBjb25maWd1cmF0aW9uIG9wdGlvbnM6CisgICBJTlNOX0NPTkZJR19ESU9fUVVFUlkKKyAgIENPTUVESV9JTlBVVAorICAgQ09NRURJX09VVFBVVAorCisgIGVuY29kZXI6CisgICBFdmVyeSBjaGFubmVsIG11c3QgYmUgY29uZmlndXJlZCBiZWZvcmUgcmVhZGluZy4KKworICAgRXhhbXBsZSBjb2RlCisKKyAgIGluc24uaW5zbj1JTlNOX0NPTkZJRzsgICAvL2NvbmZpZ3VyYXRpb24gaW5zdHJ1Y3Rpb24KKyAgIGluc24ubj0xOyAgICAgICAgICAgICAgICAvL251bWJlciBvZiBvcGVyYXRpb24gKG11c3QgYmUgMSkKKyAgIGluc24uZGF0YT0maW5pdGlhbHZhbHVlOyAvL2luaXRpYWwgdmFsdWUgbG9hZGVkIGludG8gZW5jb2RlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVyaW5nIGNvbmZpZ3VyYXRpb24KKyAgIGluc24uc3ViZGV2PTU7ICAgICAgICAgICAvL2VuY29kZXIgc3ViZGV2aWNlCisgICBpbnNuLmNoYW5zcGVjPUNSX1BBQ0soZW5jb2Rlcl9jaGFubmVsLDAsQVJFRl9PVEhFUik7IC8vZW5jb2Rlcl9jaGFubmVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdG8gY29uZmlndXJlCisKKyAgIGNvbWVkaV9kb19pbnNuKGNmLCZpbnNuKTsgLy9leGVjdXRpbmcgY29uZmlndXJhdGlvbgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKworI2luY2x1ZGUgImNvbWVkaV9wY2kuaCIKKworI2luY2x1ZGUgImNvbWVkaV9mYy5oIgorI2luY2x1ZGUgInM2MjYuaCIKKworTU9EVUxFX0FVVEhPUigiR2lhbmx1Y2EgUGFsbGkgPGdwYWxsaUBkZWlzLnVuaWJvLml0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTZW5zb3JheSA2MjYgQ29tZWRpIGRyaXZlciBtb2R1bGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKwordHlwZWRlZiBzdHJ1Y3QgczYyNl9ib2FyZF9zdHJ1Y3QgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IGFpX2NoYW5zOworCWludCBhaV9iaXRzOworCWludCBhb19jaGFuczsKKwlpbnQgYW9fYml0czsKKwlpbnQgZGlvX2NoYW5zOworCWludCBkaW9fYmFua3M7CisJaW50IGVuY19jaGFuczsKK30gczYyNl9ib2FyZDsKKworc3RhdGljIGNvbnN0IHM2MjZfYm9hcmQgczYyNl9ib2FyZHNbXSA9IHsKKwl7CisJICAgICAgbmFtZToJInM2MjYiLAorCSAgICAgIGFpX2NoYW5zOlM2MjZfQURDX0NIQU5ORUxTLAorCSAgICAgIGFpX2JpdHM6CTE0LAorCSAgICAgIGFvX2NoYW5zOlM2MjZfREFDX0NIQU5ORUxTLAorCSAgICAgIGFvX2JpdHM6CTEzLAorCSAgICAgIGRpb19jaGFuczpTNjI2X0RJT19DSEFOTkVMUywKKwkgICAgICBkaW9fYmFua3M6UzYyNl9ESU9fQkFOS1MsCisJICAgICAgZW5jX2NoYW5zOlM2MjZfRU5DT0RFUl9DSEFOTkVMUywKKwkJfQorfTsKKworI2RlZmluZSB0aGlzYm9hcmQgKChjb25zdCBzNjI2X2JvYXJkICopZGV2LT5ib2FyZF9wdHIpCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfUzYyNiAweDExMzEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TNjI2IDB4NzE0NgorCitzdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUoczYyNl9wY2lfdGFibGUpID0geworCXtQQ0lfVkVORE9SX0lEX1M2MjYsIFBDSV9ERVZJQ0VfSURfUzYyNiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJMH0sCisJezB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgczYyNl9wY2lfdGFibGUpOworCitzdGF0aWMgaW50IHM2MjZfYXR0YWNoKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9kZXZjb25maWcgKiBpdCk7CitzdGF0aWMgaW50IHM2MjZfZGV0YWNoKGNvbWVkaV9kZXZpY2UgKiBkZXYpOworCitzdGF0aWMgY29tZWRpX2RyaXZlciBkcml2ZXJfczYyNiA9IHsKKyAgICAgIGRyaXZlcl9uYW1lOiJzNjI2IiwKKyAgICAgIG1vZHVsZTpUSElTX01PRFVMRSwKKyAgICAgIGF0dGFjaDpzNjI2X2F0dGFjaCwKKyAgICAgIGRldGFjaDpzNjI2X2RldGFjaCwKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwl2b2lkICpiYXNlX2FkZHI7CisJaW50IGdvdF9yZWdpb25zOworCXNob3J0IGFsbG9jYXRlZEJ1ZjsKKwl1aW50OF90IGFpX2NtZF9ydW5uaW5nOwkvLyBhaV9jbWQgaXMgcnVubmluZworCXVpbnQ4X3QgYWlfY29udGlub3VzOwkvLyBjb250aW5vdXMgYXF1aXNpdGlvbgorCWludCBhaV9zYW1wbGVfY291bnQ7CS8vIG51bWJlciBvZiBzYW1wbGVzIHRvIGFxdWlyZQorCXVuc2lnbmVkIGludCBhaV9zYW1wbGVfdGltZXI7CS8vIHRpbWUgYmV0d2VlbiBzYW1wbGVzIGluCisJLy8gdW5pdHMgb2YgdGhlIHRpbWVyCisJaW50IGFpX2NvbnZlcnRfY291bnQ7CS8vIGNvbnZlcnNpb24gY291bnRlcgorCXVuc2lnbmVkIGludCBhaV9jb252ZXJ0X3RpbWVyOwkvLyB0aW1lIGJldHdlZW4gY29udmVyc2lvbiBpbgorCS8vIHVuaXRzIG9mIHRoZSB0aW1lcgorCXVpbnQxNl90IENvdW50ZXJJbnRFbmFiczsJLy9Db3VudGVyIGludGVycnVwdCBlbmFibGUKKwkvL21hc2sgZm9yIE1JU0MyIHJlZ2lzdGVyLgorCXVpbnQ4X3QgQWRjSXRlbXM7CS8vTnVtYmVyIG9mIGl0ZW1zIGluIEFEQyBwb2xsCisJLy9saXN0LgorCURNQUJVRiBSUFNCdWY7CQkvL0RNQSBidWZmZXIgdXNlZCB0byBob2xkIEFEQworCS8vKFJQUzEpIHByb2dyYW0uCisJRE1BQlVGIEFOQUJ1ZjsJCS8vRE1BIGJ1ZmZlciB1c2VkIHRvIHJlY2VpdmUKKwkvL0FEQyBkYXRhIGFuZCBob2xkIERBQyBkYXRhLgorCXVpbnQzMl90ICpwRGFjV0J1ZjsJLy9Qb2ludGVyIHRvIGxvZ2ljYWwgYWRycyBvZgorCS8vRE1BIGJ1ZmZlciB1c2VkIHRvIGhvbGQgREFDCisJLy9kYXRhLgorCXVpbnQxNl90IERhY3BvbDsJLy9JbWFnZSBvZiBEQUMgcG9sYXJpdHkKKwkvL3JlZ2lzdGVyLgorCXVpbnQ4X3QgVHJpbVNldHBvaW50WzEyXTsJLy9JbWFnZXMgb2YgVHJpbURBQyBzZXRwb2ludHMuCisJLy9yZWdpc3RlcnMuCisJdWludDE2X3QgQ2hhcmdlRW5hYmxlZDsJLy9JbWFnZSBvZiBNSVNDMiBCYXR0ZXJ5CisJLy9DaGFyZ2UgRW5hYmxlZCAoMCBvcgorCS8vV1JNSVNDMl9DSEFSR0VfRU5BQkxFKS4KKwl1aW50MTZfdCBXREludGVydmFsOwkvL0ltYWdlIG9mIE1JU0MyIHdhdGNoZG9nCisJLy9pbnRlcnZhbCBjb250cm9sIGJpdHMuCisJdWludDMyX3QgSTJDQWRyczsJLy9JMkMgZGV2aWNlIGFkZHJlc3MgZm9yCisJLy9vbmJvYXJkIEVFUFJPTSAoYm9hcmQgcmV2CisJLy9kZXBlbmRlbnQpLgorCS8vICBzaG9ydCAgICAgICAgIEkyQ2FyZHM7CisJbHNhbXBsX3QgYW9fcmVhZGJhY2tbUzYyNl9EQUNfQ0hBTk5FTFNdOworfSBzNjI2X3ByaXZhdGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MTZfdCBSRERJbjsKKwl1aW50MTZfdCBXUkRPdXQ7CisJdWludDE2X3QgUkRFZGdTZWw7CisJdWludDE2X3QgV1JFZGdTZWw7CisJdWludDE2X3QgUkRDYXBTZWw7CisJdWludDE2X3QgV1JDYXBTZWw7CisJdWludDE2X3QgUkRDYXBGbGc7CisJdWludDE2X3QgUkRJbnRTZWw7CisJdWludDE2X3QgV1JJbnRTZWw7Cit9IGRpb19wcml2YXRlOworCitzdGF0aWMgZGlvX3ByaXZhdGUgZGlvX3ByaXZhdGVfQSA9IHsKKyAgICAgIFJEREluOkxQX1JERElOQSwKKyAgICAgIFdSRE91dDpMUF9XUkRPVVRBLAorICAgICAgUkRFZGdTZWw6TFBfUkRFREdTRUxBLAorICAgICAgV1JFZGdTZWw6TFBfV1JFREdTRUxBLAorICAgICAgUkRDYXBTZWw6TFBfUkRDQVBTRUxBLAorICAgICAgV1JDYXBTZWw6TFBfV1JDQVBTRUxBLAorICAgICAgUkRDYXBGbGc6TFBfUkRDQVBGTEdBLAorICAgICAgUkRJbnRTZWw6TFBfUkRJTlRTRUxBLAorICAgICAgV1JJbnRTZWw6TFBfV1JJTlRTRUxBLAorfTsKKworc3RhdGljIGRpb19wcml2YXRlIGRpb19wcml2YXRlX0IgPSB7CisgICAgICBSRERJbjpMUF9SRERJTkIsCisgICAgICBXUkRPdXQ6TFBfV1JET1VUQiwKKyAgICAgIFJERWRnU2VsOkxQX1JERURHU0VMQiwKKyAgICAgIFdSRWRnU2VsOkxQX1dSRURHU0VMQiwKKyAgICAgIFJEQ2FwU2VsOkxQX1JEQ0FQU0VMQiwKKyAgICAgIFdSQ2FwU2VsOkxQX1dSQ0FQU0VMQiwKKyAgICAgIFJEQ2FwRmxnOkxQX1JEQ0FQRkxHQiwKKyAgICAgIFJESW50U2VsOkxQX1JESU5UU0VMQiwKKyAgICAgIFdSSW50U2VsOkxQX1dSSU5UU0VMQiwKK307CisKK3N0YXRpYyBkaW9fcHJpdmF0ZSBkaW9fcHJpdmF0ZV9DID0geworICAgICAgUkRESW46TFBfUkRESU5DLAorICAgICAgV1JET3V0OkxQX1dSRE9VVEMsCisgICAgICBSREVkZ1NlbDpMUF9SREVER1NFTEMsCisgICAgICBXUkVkZ1NlbDpMUF9XUkVER1NFTEMsCisgICAgICBSRENhcFNlbDpMUF9SRENBUFNFTEMsCisgICAgICBXUkNhcFNlbDpMUF9XUkNBUFNFTEMsCisgICAgICBSRENhcEZsZzpMUF9SRENBUEZMR0MsCisgICAgICBSREludFNlbDpMUF9SRElOVFNFTEMsCisgICAgICBXUkludFNlbDpMUF9XUklOVFNFTEMsCit9OworCisvKiB0byBncm91cCBkaW8gZGV2aWNlcyAoNDggYml0cyBtYXNrIGFuZCBkYXRhIGFyZSBub3QgYWxsb3dlZCA/Pz8pCitzdGF0aWMgZGlvX3ByaXZhdGUgKmRpb19wcml2YXRlX3dvcmRbXT17CisgICZkaW9fcHJpdmF0ZV9BLAorICAmZGlvX3ByaXZhdGVfQiwKKyAgJmRpb19wcml2YXRlX0MsCit9OworKi8KKworI2RlZmluZSBkZXZwcml2ICgoczYyNl9wcml2YXRlICopZGV2LT5wcml2YXRlKQorI2RlZmluZSBkaW9wcml2ICgoZGlvX3ByaXZhdGUgKilzLT5wcml2YXRlKQorCitDT01FRElfUENJX0lOSVRDTEVBTlVQX05PTU9EVUxFKGRyaXZlcl9zNjI2LCBzNjI2X3BjaV90YWJsZSk7CisKKy8vaW9jdGwgcm91dGluZXMKK3N0YXRpYyBpbnQgczYyNl9haV9pbnNuX2NvbmZpZyhjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSk7CisvKiBzdGF0aWMgaW50IHM2MjZfYWlfcmluc24oY29tZWRpX2RldmljZSAqZGV2LGNvbWVkaV9zdWJkZXZpY2UgKnMsY29tZWRpX2luc24gKmluc24sbHNhbXBsX3QgKmRhdGEpOyAqLworc3RhdGljIGludCBzNjI2X2FpX2luc25fcmVhZChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSk7CitzdGF0aWMgaW50IHM2MjZfYWlfY21kKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzKTsKK3N0YXRpYyBpbnQgczYyNl9haV9jbWR0ZXN0KGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9jbWQgKiBjbWQpOworc3RhdGljIGludCBzNjI2X2FpX2NhbmNlbChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcyk7CitzdGF0aWMgaW50IHM2MjZfYW9fd2luc24oY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpOworc3RhdGljIGludCBzNjI2X2FvX3JpbnNuKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKTsKK3N0YXRpYyBpbnQgczYyNl9kaW9faW5zbl9iaXRzKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKTsKK3N0YXRpYyBpbnQgczYyNl9kaW9faW5zbl9jb25maWcoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpOworc3RhdGljIGludCBzNjI2X2Rpb19zZXRfaXJxKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCBjaGFuKTsKK3N0YXRpYyBpbnQgczYyNl9kaW9fcmVzZXRfaXJxKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCBncnVvcCwKKwl1bnNpZ25lZCBpbnQgbWFzayk7CitzdGF0aWMgaW50IHM2MjZfZGlvX2NsZWFyX2lycShjb21lZGlfZGV2aWNlICogZGV2KTsKK3N0YXRpYyBpbnQgczYyNl9lbmNfaW5zbl9jb25maWcoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpOworc3RhdGljIGludCBzNjI2X2VuY19pbnNuX3JlYWQoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpOworc3RhdGljIGludCBzNjI2X2VuY19pbnNuX3dyaXRlKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKTsKK3N0YXRpYyBpbnQgczYyNl9uc190b190aW1lcihpbnQgKm5hbm9zZWMsIGludCByb3VuZF9tb2RlKTsKK3N0YXRpYyBpbnQgczYyNl9haV9sb2FkX3BvbGxsaXN0KHVpbnQ4X3QgKiBwcGwsIGNvbWVkaV9jbWQgKiBjbWQpOworc3RhdGljIGludCBzNjI2X2FpX2ludHRyaWcoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJdW5zaWduZWQgaW50IHRyaWdudW0pOworc3RhdGljIGlycXJldHVybl90IHM2MjZfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZCBQVF9SRUdTX0FSRyk7CitzdGF0aWMgbHNhbXBsX3QgczYyNl9haV9yZWdfdG9fdWludChpbnQgZGF0YSk7CisvKiBzdGF0aWMgbHNhbXBsX3QgczYyNl91aW50X3RvX3JlZyhjb21lZGlfc3ViZGV2aWNlICpzLCBpbnQgZGF0YSk7ICovCisKKy8vZW5kIGlvY3RsIHJvdXRpbmVzCisKKy8vaW50ZXJuYWwgcm91dGluZXMKK3N0YXRpYyB2b2lkIHM2MjZfZGlvX2luaXQoY29tZWRpX2RldmljZSAqIGRldik7CitzdGF0aWMgdm9pZCBSZXNldEFEQyhjb21lZGlfZGV2aWNlICogZGV2LCB1aW50OF90ICogcHBsKTsKK3N0YXRpYyB2b2lkIExvYWRUcmltREFDcyhjb21lZGlfZGV2aWNlICogZGV2KTsKK3N0YXRpYyB2b2lkIFdyaXRlVHJpbURBQyhjb21lZGlfZGV2aWNlICogZGV2LCB1aW50OF90IExvZ2ljYWxDaGFuLAorCXVpbnQ4X3QgRGFjRGF0YSk7CitzdGF0aWMgdWludDhfdCBJMkNyZWFkKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVpbnQ4X3QgYWRkcik7CitzdGF0aWMgdWludDMyX3QgSTJDaGFuZHNoYWtlKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVpbnQzMl90IHZhbCk7CitzdGF0aWMgdm9pZCBTZXREQUMoY29tZWRpX2RldmljZSAqIGRldiwgdWludDE2X3QgY2hhbiwgc2hvcnQgZGFjZGF0YSk7CitzdGF0aWMgdm9pZCBTZW5kREFDKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVpbnQzMl90IHZhbCk7CitzdGF0aWMgdm9pZCBXcml0ZU1JU0MyKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVpbnQxNl90IE5ld0ltYWdlKTsKK3N0YXRpYyB2b2lkIERFQkl0cmFuc2Zlcihjb21lZGlfZGV2aWNlICogZGV2KTsKK3N0YXRpYyB1aW50MTZfdCBERUJJcmVhZChjb21lZGlfZGV2aWNlICogZGV2LCB1aW50MTZfdCBhZGRyKTsKK3N0YXRpYyB2b2lkIERFQkl3cml0ZShjb21lZGlfZGV2aWNlICogZGV2LCB1aW50MTZfdCBhZGRyLCB1aW50MTZfdCB3ZGF0YSk7CitzdGF0aWMgdm9pZCBERUJJcmVwbGFjZShjb21lZGlfZGV2aWNlICogZGV2LCB1aW50MTZfdCBhZGRyLCB1aW50MTZfdCBtYXNrLAorCXVpbnQxNl90IHdkYXRhKTsKK3N0YXRpYyB2b2lkIENsb3NlRE1BQihjb21lZGlfZGV2aWNlICogZGV2LCBETUFCVUYgKiBwZG1hLCBzaXplX3QgYnNpemUpOworCisvLyBDT1VOVEVSIE9CSkVDVCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3R5cGVkZWYgc3RydWN0IGVuY19wcml2YXRlX3N0cnVjdCB7CisJLy8gUG9pbnRlcnMgdG8gZnVuY3Rpb25zIHRoYXQgZGlmZmVyIGZvciBBIGFuZCBCIGNvdW50ZXJzOgorCXVpbnQxNl90KCpHZXRFbmFibGUpIChjb21lZGlfZGV2aWNlICogZGV2LCBzdHJ1Y3QgZW5jX3ByaXZhdGVfc3RydWN0ICopOwkvL1JldHVybiBjbG9jayBlbmFibGUuCisJdWludDE2X3QoKkdldEludFNyYykgKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBlbmNfcHJpdmF0ZV9zdHJ1Y3QgKik7CS8vUmV0dXJuIGludGVycnVwdCBzb3VyY2UuCisJdWludDE2X3QoKkdldExvYWRUcmlnKSAoY29tZWRpX2RldmljZSAqIGRldiwgc3RydWN0IGVuY19wcml2YXRlX3N0cnVjdCAqKTsJLy9SZXR1cm4gcHJlbG9hZCB0cmlnZ2VyIHNvdXJjZS4KKwl1aW50MTZfdCgqR2V0TW9kZSkgKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBlbmNfcHJpdmF0ZV9zdHJ1Y3QgKik7CS8vUmV0dXJuIHN0YW5kYXJkaXplZCBvcGVyYXRpbmcgbW9kZS4KKwl2b2lkICgqUHVsc2VJbmRleCkgKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBlbmNfcHJpdmF0ZV9zdHJ1Y3QgKik7CS8vR2VuZXJhdGUgc29mdCBpbmRleCBzdHJvYmUuCisJdm9pZCAoKlNldEVuYWJsZSkgKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBlbmNfcHJpdmF0ZV9zdHJ1Y3QgKiwgdWludDE2X3QgZW5hYik7CS8vUHJvZ3JhbSBjbG9jayBlbmFibGUuCisJdm9pZCAoKlNldEludFNyYykgKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBlbmNfcHJpdmF0ZV9zdHJ1Y3QgKiwgdWludDE2X3QgSW50U291cmNlKTsJLy9Qcm9ncmFtIGludGVycnVwdCBzb3VyY2UuCisJdm9pZCAoKlNldExvYWRUcmlnKSAoY29tZWRpX2RldmljZSAqIGRldiwgc3RydWN0IGVuY19wcml2YXRlX3N0cnVjdCAqLCB1aW50MTZfdCBUcmlnKTsJLy9Qcm9ncmFtIHByZWxvYWQgdHJpZ2dlciBzb3VyY2UuCisJdm9pZCAoKlNldE1vZGUpIChjb21lZGlfZGV2aWNlICogZGV2LCBzdHJ1Y3QgZW5jX3ByaXZhdGVfc3RydWN0ICosIHVpbnQxNl90IFNldHVwLCB1aW50MTZfdCBEaXNhYmxlSW50U3JjKTsJLy9Qcm9ncmFtIHN0YW5kYXJkaXplZCBvcGVyYXRpbmcgbW9kZS4KKwl2b2lkICgqUmVzZXRDYXBGbGFncykgKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBlbmNfcHJpdmF0ZV9zdHJ1Y3QgKik7CS8vUmVzZXQgZXZlbnQgY2FwdHVyZSBmbGFncy4KKworCXVpbnQxNl90IE15Q1JBOwkJLy8gICBBZGRyZXNzIG9mIENSQSByZWdpc3Rlci4KKwl1aW50MTZfdCBNeUNSQjsJCS8vICAgQWRkcmVzcyBvZiBDUkIgcmVnaXN0ZXIuCisJdWludDE2X3QgTXlMYXRjaExzdzsJLy8gICBBZGRyZXNzIG9mIExhdGNoIGxlYXN0LXNpZ25pZmljYW50LXdvcmQKKwkvLyAgIHJlZ2lzdGVyLgorCXVpbnQxNl90IE15RXZlbnRCaXRzWzRdOwkvLyAgIEJpdCB0cmFuc2xhdGlvbnMgZm9yIEludFNyYyAtLT5SRE1JU0MyLgorfSBlbmNfcHJpdmF0ZTsJCQkvL2NvdW50ZXIgb2JqZWN0CisKKyNkZWZpbmUgZW5jcHJpdiAoKGVuY19wcml2YXRlICopKGRldi0+c3ViZGV2aWNlcys1KS0+cHJpdmF0ZSkKKworLy9jb3VudGVycyByb3V0aW5lcworc3RhdGljIHZvaWQgczYyNl90aW1lcl9sb2FkKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaywgaW50IHRpY2spOworc3RhdGljIHVpbnQzMl90IFJlYWRMYXRjaChjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGspOworc3RhdGljIHZvaWQgUmVzZXRDYXBGbGFnc19BKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogayk7CitzdGF0aWMgdm9pZCBSZXNldENhcEZsYWdzX0IoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrKTsKK3N0YXRpYyB1aW50MTZfdCBHZXRNb2RlX0EoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrKTsKK3N0YXRpYyB1aW50MTZfdCBHZXRNb2RlX0IoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrKTsKK3N0YXRpYyB2b2lkIFNldE1vZGVfQShjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGssIHVpbnQxNl90IFNldHVwLAorCXVpbnQxNl90IERpc2FibGVJbnRTcmMpOworc3RhdGljIHZvaWQgU2V0TW9kZV9CKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaywgdWludDE2X3QgU2V0dXAsCisJdWludDE2X3QgRGlzYWJsZUludFNyYyk7CitzdGF0aWMgdm9pZCBTZXRFbmFibGVfQShjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGssIHVpbnQxNl90IGVuYWIpOworc3RhdGljIHZvaWQgU2V0RW5hYmxlX0IoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrLCB1aW50MTZfdCBlbmFiKTsKK3N0YXRpYyB1aW50MTZfdCBHZXRFbmFibGVfQShjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGspOworc3RhdGljIHVpbnQxNl90IEdldEVuYWJsZV9CKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogayk7CitzdGF0aWMgdm9pZCBTZXRMYXRjaFNvdXJjZShjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGssCisJdWludDE2X3QgdmFsdWUpOworLyogc3RhdGljIHVpbnQxNl90IEdldExhdGNoU291cmNlKGNvbWVkaV9kZXZpY2UgKmRldiwgZW5jX3ByaXZhdGUgKmsgKTsgKi8KK3N0YXRpYyB2b2lkIFNldExvYWRUcmlnX0EoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrLCB1aW50MTZfdCBUcmlnKTsKK3N0YXRpYyB2b2lkIFNldExvYWRUcmlnX0IoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrLCB1aW50MTZfdCBUcmlnKTsKK3N0YXRpYyB1aW50MTZfdCBHZXRMb2FkVHJpZ19BKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogayk7CitzdGF0aWMgdWludDE2X3QgR2V0TG9hZFRyaWdfQihjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGspOworc3RhdGljIHZvaWQgU2V0SW50U3JjX0IoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrLAorCXVpbnQxNl90IEludFNvdXJjZSk7CitzdGF0aWMgdm9pZCBTZXRJbnRTcmNfQShjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGssCisJdWludDE2X3QgSW50U291cmNlKTsKK3N0YXRpYyB1aW50MTZfdCBHZXRJbnRTcmNfQShjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGspOworc3RhdGljIHVpbnQxNl90IEdldEludFNyY19CKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogayk7CisvKiBzdGF0aWMgdm9pZCBTZXRDbGtNdWx0KGNvbWVkaV9kZXZpY2UgKmRldiwgZW5jX3ByaXZhdGUgKmssIHVpbnQxNl90IHZhbHVlICkgOyAqLworLyogc3RhdGljIHVpbnQxNl90IEdldENsa011bHQoY29tZWRpX2RldmljZSAqZGV2LCBlbmNfcHJpdmF0ZSAqayApIDsgKi8KKy8qIHN0YXRpYyB2b2lkIFNldEluZGV4UG9sKGNvbWVkaV9kZXZpY2UgKmRldiwgZW5jX3ByaXZhdGUgKmssIHVpbnQxNl90IHZhbHVlICk7ICovCisvKiBzdGF0aWMgdWludDE2X3QgR2V0Q2xrUG9sKGNvbWVkaV9kZXZpY2UgKmRldiwgZW5jX3ByaXZhdGUgKmsgKSA7ICovCisvKiBzdGF0aWMgdm9pZCBTZXRJbmRleFNyYyggY29tZWRpX2RldmljZSAqZGV2LGVuY19wcml2YXRlICprLCB1aW50MTZfdCB2YWx1ZSApOyAgKi8KKy8qIHN0YXRpYyB1aW50MTZfdCBHZXRDbGtTcmMoIGNvbWVkaV9kZXZpY2UgKmRldixlbmNfcHJpdmF0ZSAqayApOyAgKi8KKy8qIHN0YXRpYyB2b2lkIFNldEluZGV4U3JjKCBjb21lZGlfZGV2aWNlICpkZXYsZW5jX3ByaXZhdGUgKmssIHVpbnQxNl90IHZhbHVlICk7ICAqLworLyogc3RhdGljIHVpbnQxNl90IEdldEluZGV4U3JjKCBjb21lZGlfZGV2aWNlICpkZXYsZW5jX3ByaXZhdGUgKmsgKTsgICovCitzdGF0aWMgdm9pZCBQdWxzZUluZGV4X0EoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrKTsKK3N0YXRpYyB2b2lkIFB1bHNlSW5kZXhfQihjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGspOworc3RhdGljIHZvaWQgUHJlbG9hZChjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGssIHVpbnQzMl90IHZhbHVlKTsKK3N0YXRpYyB2b2lkIENvdW50ZXJzSW5pdChjb21lZGlfZGV2aWNlICogZGV2KTsKKy8vZW5kIGludGVybmFsIHJvdXRpbmVzCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvdW50ZXIgb2JqZWN0cyBjb25zdHJ1Y3Rvci4KKworLy8gQ291bnRlciBvdmVyZmxvdy9pbmRleCBldmVudCBmbGFnIG1hc2tzIGZvciBSRE1JU0MyLgorI2RlZmluZSBJTkRYTUFTSyhDKQkJKCAxIDw8ICggKCAoQykgPiAyICkgPyAoIChDKSAqIDIgLSAxICkgOiAoIChDKSAqIDIgKyAgNCApICkgKQorI2RlZmluZSBPVkVSTUFTSyhDKQkJKCAxIDw8ICggKCAoQykgPiAyICkgPyAoIChDKSAqIDIgKyA1ICkgOiAoIChDKSAqIDIgKyAxMCApICkgKQorI2RlZmluZSBFVkJJVFMoQykJCXsgMCwgT1ZFUk1BU0soQyksIElORFhNQVNLKEMpLCBPVkVSTUFTSyhDKSB8IElORFhNQVNLKEMpIH0KKworLy8gVHJhbnNsYXRpb24gdGFibGUgdG8gbWFwIEludFNyYyBpbnRvIGVxdWl2YWxlbnQgUkRNSVNDMiBldmVudCBmbGFnCisvLyBiaXRzLgorLy9zdGF0aWMgY29uc3QgdWludDE2X3QgRXZlbnRCaXRzW11bNF0gPSB7IEVWQklUUygwKSwgRVZCSVRTKDEpLCBFVkJJVFMoMiksIEVWQklUUygzKSwgRVZCSVRTKDQpLCBFVkJJVFMoNSkgfTsKKworLyogZW5jX3ByaXZhdGU7ICovCitzdGF0aWMgZW5jX3ByaXZhdGUgZW5jX3ByaXZhdGVfZGF0YVtdID0geworCXsKKwkgICAgICBHZXRFbmFibGU6R2V0RW5hYmxlX0EsCisJICAgICAgR2V0SW50U3JjOkdldEludFNyY19BLAorCSAgICAgIEdldExvYWRUcmlnOkdldExvYWRUcmlnX0EsCisJICAgICAgR2V0TW9kZToJR2V0TW9kZV9BLAorCSAgICAgIFB1bHNlSW5kZXg6UHVsc2VJbmRleF9BLAorCSAgICAgIFNldEVuYWJsZTpTZXRFbmFibGVfQSwKKwkgICAgICBTZXRJbnRTcmM6U2V0SW50U3JjX0EsCisJICAgICAgU2V0TG9hZFRyaWc6U2V0TG9hZFRyaWdfQSwKKwkgICAgICBTZXRNb2RlOglTZXRNb2RlX0EsCisJICAgICAgUmVzZXRDYXBGbGFnczpSZXNldENhcEZsYWdzX0EsCisJICAgICAgTXlDUkE6CUxQX0NSMEEsCisJICAgICAgTXlDUkI6CUxQX0NSMEIsCisJICAgICAgTXlMYXRjaExzdzpMUF9DTlRSMEFMU1csCisJICAgICAgTXlFdmVudEJpdHM6RVZCSVRTKDApLAorCQl9LAorCXsKKwkgICAgICBHZXRFbmFibGU6R2V0RW5hYmxlX0EsCisJICAgICAgR2V0SW50U3JjOkdldEludFNyY19BLAorCSAgICAgIEdldExvYWRUcmlnOkdldExvYWRUcmlnX0EsCisJICAgICAgR2V0TW9kZToJR2V0TW9kZV9BLAorCSAgICAgIFB1bHNlSW5kZXg6UHVsc2VJbmRleF9BLAorCSAgICAgIFNldEVuYWJsZTpTZXRFbmFibGVfQSwKKwkgICAgICBTZXRJbnRTcmM6U2V0SW50U3JjX0EsCisJICAgICAgU2V0TG9hZFRyaWc6U2V0TG9hZFRyaWdfQSwKKwkgICAgICBTZXRNb2RlOglTZXRNb2RlX0EsCisJICAgICAgUmVzZXRDYXBGbGFnczpSZXNldENhcEZsYWdzX0EsCisJICAgICAgTXlDUkE6CUxQX0NSMUEsCisJICAgICAgTXlDUkI6CUxQX0NSMUIsCisJICAgICAgTXlMYXRjaExzdzpMUF9DTlRSMUFMU1csCisJICAgICAgTXlFdmVudEJpdHM6RVZCSVRTKDEpLAorCQl9LAorCXsKKwkgICAgICBHZXRFbmFibGU6R2V0RW5hYmxlX0EsCisJICAgICAgR2V0SW50U3JjOkdldEludFNyY19BLAorCSAgICAgIEdldExvYWRUcmlnOkdldExvYWRUcmlnX0EsCisJICAgICAgR2V0TW9kZToJR2V0TW9kZV9BLAorCSAgICAgIFB1bHNlSW5kZXg6UHVsc2VJbmRleF9BLAorCSAgICAgIFNldEVuYWJsZTpTZXRFbmFibGVfQSwKKwkgICAgICBTZXRJbnRTcmM6U2V0SW50U3JjX0EsCisJICAgICAgU2V0TG9hZFRyaWc6U2V0TG9hZFRyaWdfQSwKKwkgICAgICBTZXRNb2RlOglTZXRNb2RlX0EsCisJICAgICAgUmVzZXRDYXBGbGFnczpSZXNldENhcEZsYWdzX0EsCisJICAgICAgTXlDUkE6CUxQX0NSMkEsCisJICAgICAgTXlDUkI6CUxQX0NSMkIsCisJICAgICAgTXlMYXRjaExzdzpMUF9DTlRSMkFMU1csCisJICAgICAgTXlFdmVudEJpdHM6RVZCSVRTKDIpLAorCQl9LAorCXsKKwkgICAgICBHZXRFbmFibGU6R2V0RW5hYmxlX0IsCisJICAgICAgR2V0SW50U3JjOkdldEludFNyY19CLAorCSAgICAgIEdldExvYWRUcmlnOkdldExvYWRUcmlnX0IsCisJICAgICAgR2V0TW9kZToJR2V0TW9kZV9CLAorCSAgICAgIFB1bHNlSW5kZXg6UHVsc2VJbmRleF9CLAorCSAgICAgIFNldEVuYWJsZTpTZXRFbmFibGVfQiwKKwkgICAgICBTZXRJbnRTcmM6U2V0SW50U3JjX0IsCisJICAgICAgU2V0TG9hZFRyaWc6U2V0TG9hZFRyaWdfQiwKKwkgICAgICBTZXRNb2RlOglTZXRNb2RlX0IsCisJICAgICAgUmVzZXRDYXBGbGFnczpSZXNldENhcEZsYWdzX0IsCisJICAgICAgTXlDUkE6CUxQX0NSMEEsCisJICAgICAgTXlDUkI6CUxQX0NSMEIsCisJICAgICAgTXlMYXRjaExzdzpMUF9DTlRSMEJMU1csCisJICAgICAgTXlFdmVudEJpdHM6RVZCSVRTKDMpLAorCQl9LAorCXsKKwkgICAgICBHZXRFbmFibGU6R2V0RW5hYmxlX0IsCisJICAgICAgR2V0SW50U3JjOkdldEludFNyY19CLAorCSAgICAgIEdldExvYWRUcmlnOkdldExvYWRUcmlnX0IsCisJICAgICAgR2V0TW9kZToJR2V0TW9kZV9CLAorCSAgICAgIFB1bHNlSW5kZXg6UHVsc2VJbmRleF9CLAorCSAgICAgIFNldEVuYWJsZTpTZXRFbmFibGVfQiwKKwkgICAgICBTZXRJbnRTcmM6U2V0SW50U3JjX0IsCisJICAgICAgU2V0TG9hZFRyaWc6U2V0TG9hZFRyaWdfQiwKKwkgICAgICBTZXRNb2RlOglTZXRNb2RlX0IsCisJICAgICAgUmVzZXRDYXBGbGFnczpSZXNldENhcEZsYWdzX0IsCisJICAgICAgTXlDUkE6CUxQX0NSMUEsCisJICAgICAgTXlDUkI6CUxQX0NSMUIsCisJICAgICAgTXlMYXRjaExzdzpMUF9DTlRSMUJMU1csCisJICAgICAgTXlFdmVudEJpdHM6RVZCSVRTKDQpLAorCQl9LAorCXsKKwkgICAgICBHZXRFbmFibGU6R2V0RW5hYmxlX0IsCisJICAgICAgR2V0SW50U3JjOkdldEludFNyY19CLAorCSAgICAgIEdldExvYWRUcmlnOkdldExvYWRUcmlnX0IsCisJICAgICAgR2V0TW9kZToJR2V0TW9kZV9CLAorCSAgICAgIFB1bHNlSW5kZXg6UHVsc2VJbmRleF9CLAorCSAgICAgIFNldEVuYWJsZTpTZXRFbmFibGVfQiwKKwkgICAgICBTZXRJbnRTcmM6U2V0SW50U3JjX0IsCisJICAgICAgU2V0TG9hZFRyaWc6U2V0TG9hZFRyaWdfQiwKKwkgICAgICBTZXRNb2RlOglTZXRNb2RlX0IsCisJICAgICAgUmVzZXRDYXBGbGFnczpSZXNldENhcEZsYWdzX0IsCisJICAgICAgTXlDUkE6CUxQX0NSMkEsCisJICAgICAgTXlDUkI6CUxQX0NSMkIsCisJICAgICAgTXlMYXRjaExzdzpMUF9DTlRSMkJMU1csCisJICAgICAgTXlFdmVudEJpdHM6RVZCSVRTKDUpLAorCQl9LAorfTsKKworLy8gZW5hYi9kaXNhYmxlIGEgZnVuY3Rpb24gb3IgdGVzdCBzdGF0dXMgYml0KHMpIHRoYXQgYXJlIGFjY2Vzc2VkCisvLyB0aHJvdWdoIE1haW4gQ29udHJvbCBSZWdpc3RlcnMgMSBvciAyLgorI2RlZmluZSBNQ19FTkFCTEUoIFJFR0FEUlMsIENUUkxXT1JEICkJd3JpdGVsKCAgKCAodWludDMyX3QpKCBDVFJMV09SRCApIDw8IDE2ICkgfCAodWludDMyX3QpKCBDVFJMV09SRCApLGRldnByaXYtPmJhc2VfYWRkcisoIFJFR0FEUlMgKSApCisKKyNkZWZpbmUgTUNfRElTQUJMRSggUkVHQURSUywgQ1RSTFdPUkQgKQl3cml0ZWwoICAodWludDMyX3QpKCBDVFJMV09SRCApIDw8IDE2ICwgZGV2cHJpdi0+YmFzZV9hZGRyKyggUkVHQURSUyApICkKKworI2RlZmluZSBNQ19URVNUKCBSRUdBRFJTLCBDVFJMV09SRCApCSggKCByZWFkbChkZXZwcml2LT5iYXNlX2FkZHIrKCBSRUdBRFJTICkpICYgQ1RSTFdPUkQgKSAhPSAwICkKKworLyogI2RlZmluZSBXUjcxNDYoUkVHQVJEUyxDVFJMV09SRCkKKyAgICB3cml0ZWwoQ1RSTFdPUkQsKHVpbnQzMl90KShkZXZwcml2LT5iYXNlX2FkZHIrKFJFR0FSRFMpKSkgKi8KKyNkZWZpbmUgV1I3MTQ2KFJFR0FSRFMsQ1RSTFdPUkQpIHdyaXRlbChDVFJMV09SRCxkZXZwcml2LT5iYXNlX2FkZHIrKFJFR0FSRFMpKQorCisvKiAjZGVmaW5lIFJSNzE0NihSRUdBUkRTKQorICAgIHJlYWRsKCh1aW50MzJfdCkoZGV2cHJpdi0+YmFzZV9hZGRyKyhSRUdBUkRTKSkpICovCisjZGVmaW5lIFJSNzE0NihSRUdBUkRTKQkJcmVhZGwoZGV2cHJpdi0+YmFzZV9hZGRyKyhSRUdBUkRTKSkKKworI2RlZmluZSBCVUdGSVhfU1RSRUcoUkVHQURSUykgICAoIFJFR0FEUlMgLSA0ICkKKworLy8gV3JpdGUgYSB0aW1lIHNsb3QgY29udHJvbCByZWNvcmQgdG8gVFNMMi4KKyNkZWZpbmUgVkVDVFBPUlQoIFZFQ1ROVU0gKQkJKFBfVFNMMiArICggKFZFQ1ROVU0pIDw8IDIgKSkKKyNkZWZpbmUgU0VUVkVDVCggVkVDVE5VTSwgVkVDVFZBTCApCVdSNzE0NihWRUNUUE9SVCggVkVDVE5VTSApLCAoVkVDVFZBTCkpCisKKy8vIENvZGUgbWFjcm9zIHVzZWQgZm9yIGNvbnN0cnVjdGluZyBJMkMgY29tbWFuZCBieXRlcy4KKyNkZWZpbmUgSTJDX0IyKEFUVFIsVkFMKQkoICggKEFUVFIpIDw8IDYgKSB8ICggKFZBTCkgPDwgMjQgKSApCisjZGVmaW5lIEkyQ19CMShBVFRSLFZBTCkJKCAoIChBVFRSKSA8PCA0ICkgfCAoIChWQUwpIDw8IDE2ICkgKQorI2RlZmluZSBJMkNfQjAoQVRUUixWQUwpCSggKCAoQVRUUikgPDwgMiApIHwgKCAoVkFMKSA8PCAgOCApICkKKworc3RhdGljIGNvbnN0IGNvbWVkaV9scmFuZ2UgczYyNl9yYW5nZV90YWJsZSA9IHsgMiwgeworCQkJUkFOR0UoLTUsIDUpLAorCQkJUkFOR0UoLTEwLCAxMCksCisJfQorfTsKKworc3RhdGljIGludCBzNjI2X2F0dGFjaChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfZGV2Y29uZmlnICogaXQpCit7CisvKiAgIHVpbnQ4X3QJUG9sbExpc3Q7ICovCisvKiAgIHVpbnQxNl90CUFkY0RhdGE7ICovCisvKiAgIHVpbnQxNl90CVN0YXJ0VmFsOyAqLworLyogICB1aW50MTZfdAlpbmRleDsgKi8KKy8qICAgdW5zaWduZWQgaW50IGRhdGFbMTZdOyAqLworCWludCByZXN1bHQ7CisJaW50IGk7CisJaW50IHJldDsKKwlyZXNvdXJjZV9zaXplX3QgcmVzb3VyY2VTdGFydDsKKwlkbWFfYWRkcl90IGFwcGRtYTsKKwljb21lZGlfc3ViZGV2aWNlICpzOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCisJaWYgKGFsbG9jX3ByaXZhdGUoZGV2LCBzaXplb2YoczYyNl9wcml2YXRlKSkgPCAwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAocGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfUzYyNiwgUENJX0RFVklDRV9JRF9TNjI2LAorCQkJTlVMTCk7IHBkZXYgIT0gTlVMTDsKKwkJcGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfUzYyNiwKKwkJCVBDSV9ERVZJQ0VfSURfUzYyNiwgcGRldikpIHsKKwkJaWYgKGl0LT5vcHRpb25zWzBdIHx8IGl0LT5vcHRpb25zWzFdKSB7CisJCQlpZiAocGRldi0+YnVzLT5udW1iZXIgPT0gaXQtPm9wdGlvbnNbMF0gJiYKKwkJCQlQQ0lfU0xPVChwZGV2LT5kZXZmbikgPT0gaXQtPm9wdGlvbnNbMV0pIHsKKwkJCQkvKiBtYXRjaGVzIHJlcXVlc3RlZCBidXMvc2xvdCAqLworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogbm8gYnVzL3Nsb3Qgc3BlY2lmaWVkICovCisJCQlicmVhazsKKwkJfQorCX0KKwlkZXZwcml2LT5wZGV2ID0gcGRldjsKKworCWlmIChwZGV2ID09IE5VTEwpIHsKKwkJcHJpbnRrKCJzNjI2X2F0dGFjaDogQm9hcmQgbm90IHByZXNlbnQhISFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoKHJlc3VsdCA9IGNvbWVkaV9wY2lfZW5hYmxlKHBkZXYsICJzNjI2IikpIDwgMCkgeworCQlwcmludGsoInM2MjZfYXR0YWNoOiBjb21lZGlfcGNpX2VuYWJsZSBmYWlsc1xuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlkZXZwcml2LT5nb3RfcmVnaW9ucyA9IDE7CisKKwlyZXNvdXJjZVN0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldnByaXYtPnBkZXYsIDApOworCisJZGV2cHJpdi0+YmFzZV9hZGRyID0gaW9yZW1hcChyZXNvdXJjZVN0YXJ0LCBTSVpFT0ZfQUREUkVTU19TUEFDRSk7CisJaWYgKGRldnByaXYtPmJhc2VfYWRkciA9PSBOVUxMKSB7CisJCXByaW50aygiczYyNl9hdHRhY2g6IElPUkVNQVAgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKGRldnByaXYtPmJhc2VfYWRkcikgeworCQkvL2Rpc2FibGUgbWFzdGVyIGludGVycnVwdAorCQl3cml0ZWwoMCwgZGV2cHJpdi0+YmFzZV9hZGRyICsgUF9JRVIpOworCisJCS8vc29mdCByZXNldAorCQl3cml0ZWwoTUMxX1NPRlRfUkVTRVQsIGRldnByaXYtPmJhc2VfYWRkciArIFBfTUMxKTsKKworCQkvL0RNQSBGSVhNRSBETUEvLworCQlERUJVRygiczYyNl9hdHRhY2g6IERNQSBBTExPQ0FUSU9OXG4iKTsKKworCQkvL2FkYyBidWZmZXIgYWxsb2NhdGlvbgorCQlkZXZwcml2LT5hbGxvY2F0ZWRCdWYgPSAwOworCisJCWlmICgoZGV2cHJpdi0+QU5BQnVmLkxvZ2ljYWxCYXNlID0KKwkJCQlwY2lfYWxsb2NfY29uc2lzdGVudChkZXZwcml2LT5wZGV2LCBETUFCVUZfU0laRSwKKwkJCQkJJmFwcGRtYSkpID09IE5VTEwpIHsKKwkJCXByaW50aygiczYyNl9hdHRhY2g6IERNQSBNZW1vcnkgbWFwcGluZyBlcnJvclxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCWRldnByaXYtPkFOQUJ1Zi5QaHlzaWNhbEJhc2UgPSBhcHBkbWE7CisKKwkJREVCVUcoInM2MjZfYXR0YWNoOiBBbGxvY0RNQUIgQURDIExvZ2ljYWw9JXAsIGJzaXplPSVkLCBQaHlzaWNhbD0weCV4XG4iLCBkZXZwcml2LT5BTkFCdWYuTG9naWNhbEJhc2UsIERNQUJVRl9TSVpFLCAodWludDMyX3QpIGRldnByaXYtPkFOQUJ1Zi5QaHlzaWNhbEJhc2UpOworCisJCWRldnByaXYtPmFsbG9jYXRlZEJ1ZisrOworCisJCWlmICgoZGV2cHJpdi0+UlBTQnVmLkxvZ2ljYWxCYXNlID0KKwkJCQlwY2lfYWxsb2NfY29uc2lzdGVudChkZXZwcml2LT5wZGV2LCBETUFCVUZfU0laRSwKKwkJCQkJJmFwcGRtYSkpID09IE5VTEwpIHsKKwkJCXByaW50aygiczYyNl9hdHRhY2g6IERNQSBNZW1vcnkgbWFwcGluZyBlcnJvclxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCWRldnByaXYtPlJQU0J1Zi5QaHlzaWNhbEJhc2UgPSBhcHBkbWE7CisKKwkJREVCVUcoInM2MjZfYXR0YWNoOiBBbGxvY0RNQUIgUlBTIExvZ2ljYWw9JXAsIGJzaXplPSVkLCBQaHlzaWNhbD0weCV4XG4iLCBkZXZwcml2LT5SUFNCdWYuTG9naWNhbEJhc2UsIERNQUJVRl9TSVpFLCAodWludDMyX3QpIGRldnByaXYtPlJQU0J1Zi5QaHlzaWNhbEJhc2UpOworCisJCWRldnByaXYtPmFsbG9jYXRlZEJ1ZisrOworCisJfQorCisJZGV2LT5ib2FyZF9wdHIgPSBzNjI2X2JvYXJkczsKKwlkZXYtPmJvYXJkX25hbWUgPSB0aGlzYm9hcmQtPm5hbWU7CisKKwlpZiAoYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIDYpIDwgMCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkZXYtPmlvYmFzZSA9ICh1bnNpZ25lZCBsb25nKWRldnByaXYtPmJhc2VfYWRkcjsKKwlkZXYtPmlycSA9IGRldnByaXYtPnBkZXYtPmlycTsKKworCS8vc2V0IHVwIGludGVycnVwdCBoYW5kbGVyCisJaWYgKGRldi0+aXJxID09IDApIHsKKwkJcHJpbnRrKCIgdW5rbm93biBpcnEgKGJhZClcbiIpOworCX0gZWxzZSB7CisJCWlmICgocmV0ID0gY29tZWRpX3JlcXVlc3RfaXJxKGRldi0+aXJxLCBzNjI2X2lycV9oYW5kbGVyLAorCQkJCQlJUlFGX1NIQVJFRCwgInM2MjYiLCBkZXYpKSA8IDApIHsKKwkJCXByaW50aygiIGlycSBub3QgYXZhaWxhYmxlXG4iKTsKKwkJCWRldi0+aXJxID0gMDsKKwkJfQorCX0KKworCURFQlVHKCJzNjI2X2F0dGFjaDogLS0gaXQgb3B0cyAgJWQsJWQgLS0gXG4iLAorCQlpdC0+b3B0aW9uc1swXSwgaXQtPm9wdGlvbnNbMV0pOworCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIDA7CisJLyogYW5hbG9nIGlucHV0IHN1YmRldmljZSAqLworCWRldi0+cmVhZF9zdWJkZXYgPSBzOworCS8qIHdlIHN1cHBvcnQgc2luZ2xlLWVuZGVkIChncm91bmQpIGFuZCBkaWZmZXJlbnRpYWwgKi8KKwlzLT50eXBlID0gQ09NRURJX1NVQkRfQUk7CisJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFIHwgU0RGX0RJRkYgfCBTREZfQ01EX1JFQUQ7CisJcy0+bl9jaGFuID0gdGhpc2JvYXJkLT5haV9jaGFuczsKKwlzLT5tYXhkYXRhID0gKDB4ZmZmZiA+PiAyKTsKKwlzLT5yYW5nZV90YWJsZSA9ICZzNjI2X3JhbmdlX3RhYmxlOworCXMtPmxlbl9jaGFubGlzdCA9IHRoaXNib2FyZC0+YWlfY2hhbnM7CS8qIFRoaXMgaXMgdGhlIG1heGltdW0gY2hhbmxpc3QKKwkJCQkJCSAgIGxlbmd0aCB0aGF0IHRoZSBib2FyZCBjYW4KKwkJCQkJCSAgIGhhbmRsZSAqLworCXMtPmluc25fY29uZmlnID0gczYyNl9haV9pbnNuX2NvbmZpZzsKKwlzLT5pbnNuX3JlYWQgPSBzNjI2X2FpX2luc25fcmVhZDsKKwlzLT5kb19jbWQgPSBzNjI2X2FpX2NtZDsKKwlzLT5kb19jbWR0ZXN0ID0gczYyNl9haV9jbWR0ZXN0OworCXMtPmNhbmNlbCA9IHM2MjZfYWlfY2FuY2VsOworCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIDE7CisJLyogYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgKi8KKwlzLT50eXBlID0gQ09NRURJX1NVQkRfQU87CisJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1dSSVRBQkxFIHwgU0RGX1JFQURBQkxFOworCXMtPm5fY2hhbiA9IHRoaXNib2FyZC0+YW9fY2hhbnM7CisJcy0+bWF4ZGF0YSA9ICgweDNmZmYpOworCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2JpcG9sYXIxMDsKKwlzLT5pbnNuX3dyaXRlID0gczYyNl9hb193aW5zbjsKKwlzLT5pbnNuX3JlYWQgPSBzNjI2X2FvX3JpbnNuOworCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIDI7CisJLyogZGlnaXRhbCBJL08gc3ViZGV2aWNlICovCisJcy0+dHlwZSA9IENPTUVESV9TVUJEX0RJTzsKKwlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfV1JJVEFCTEUgfCBTREZfUkVBREFCTEU7CisJcy0+bl9jaGFuID0gUzYyNl9ESU9fQ0hBTk5FTFM7CisJcy0+bWF4ZGF0YSA9IDE7CisJcy0+aW9fYml0cyA9IDB4ZmZmZjsKKwlzLT5wcml2YXRlID0gJmRpb19wcml2YXRlX0E7CisJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfZGlnaXRhbDsKKwlzLT5pbnNuX2NvbmZpZyA9IHM2MjZfZGlvX2luc25fY29uZmlnOworCXMtPmluc25fYml0cyA9IHM2MjZfZGlvX2luc25fYml0czsKKworCXMgPSBkZXYtPnN1YmRldmljZXMgKyAzOworCS8qIGRpZ2l0YWwgSS9PIHN1YmRldmljZSAqLworCXMtPnR5cGUgPSBDT01FRElfU1VCRF9ESU87CisJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1dSSVRBQkxFIHwgU0RGX1JFQURBQkxFOworCXMtPm5fY2hhbiA9IDE2OworCXMtPm1heGRhdGEgPSAxOworCXMtPmlvX2JpdHMgPSAweGZmZmY7CisJcy0+cHJpdmF0ZSA9ICZkaW9fcHJpdmF0ZV9COworCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2RpZ2l0YWw7CisJcy0+aW5zbl9jb25maWcgPSBzNjI2X2Rpb19pbnNuX2NvbmZpZzsKKwlzLT5pbnNuX2JpdHMgPSBzNjI2X2Rpb19pbnNuX2JpdHM7CisKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgNDsKKwkvKiBkaWdpdGFsIEkvTyBzdWJkZXZpY2UgKi8KKwlzLT50eXBlID0gQ09NRURJX1NVQkRfRElPOworCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklUQUJMRSB8IFNERl9SRUFEQUJMRTsKKwlzLT5uX2NoYW4gPSAxNjsKKwlzLT5tYXhkYXRhID0gMTsKKwlzLT5pb19iaXRzID0gMHhmZmZmOworCXMtPnByaXZhdGUgPSAmZGlvX3ByaXZhdGVfQzsKKwlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOworCXMtPmluc25fY29uZmlnID0gczYyNl9kaW9faW5zbl9jb25maWc7CisJcy0+aW5zbl9iaXRzID0gczYyNl9kaW9faW5zbl9iaXRzOworCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIDU7CisJLyogZW5jb2RlciAoY291bnRlcikgc3ViZGV2aWNlICovCisJcy0+dHlwZSA9IENPTUVESV9TVUJEX0NPVU5URVI7CisJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1dSSVRBQkxFIHwgU0RGX1JFQURBQkxFIHwgU0RGX0xTQU1QTDsKKwlzLT5uX2NoYW4gPSB0aGlzYm9hcmQtPmVuY19jaGFuczsKKwlzLT5wcml2YXRlID0gZW5jX3ByaXZhdGVfZGF0YTsKKwlzLT5pbnNuX2NvbmZpZyA9IHM2MjZfZW5jX2luc25fY29uZmlnOworCXMtPmluc25fcmVhZCA9IHM2MjZfZW5jX2luc25fcmVhZDsKKwlzLT5pbnNuX3dyaXRlID0gczYyNl9lbmNfaW5zbl93cml0ZTsKKwlzLT5tYXhkYXRhID0gMHhmZmZmZmY7CisJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfdW5rbm93bjsKKworCS8vc3RvcCBhaV9jb21tYW5kCisJZGV2cHJpdi0+YWlfY21kX3J1bm5pbmcgPSAwOworCisJaWYgKGRldnByaXYtPmJhc2VfYWRkciAmJiAoZGV2cHJpdi0+YWxsb2NhdGVkQnVmID09IDIpKSB7CisJCWRtYV9hZGRyX3QgcFBoeXNCdWY7CisJCXVpbnQxNl90IGNoYW47CisKKwkJLy8gZW5hYiBERUJJIGFuZCBhdWRpbyBwaW5zLCBlbmFibGUgSTJDIGludGVyZmFjZS4KKwkJTUNfRU5BQkxFKFBfTUMxLCBNQzFfREVCSSB8IE1DMV9BVURJTyB8IE1DMV9JMkMpOworCQkvLyBDb25maWd1cmUgREVCSSBvcGVyYXRpbmcgbW9kZS4KKwkJV1I3MTQ2KFBfREVCSUNGRywgREVCSV9DRkdfU0xBVkUxNgkvLyBMb2NhbCBidXMgaXMgMTYKKwkJCS8vIGJpdHMgd2lkZS4KKwkJCXwgKERFQklfVE9VVCA8PCBERUJJX0NGR19UT1VUX0JJVCkJLy8gRGVjbGFyZSBERUJJCisJCQkvLyB0cmFuc2ZlciB0aW1lb3V0CisJCQkvLyBpbnRlcnZhbC4KKwkJCXwgREVCSV9TV0FQCS8vIFNldCB1cCBieXRlIGxhbmUKKwkJCS8vIHN0ZWVyaW5nLgorCQkJfCBERUJJX0NGR19JTlRFTCk7CS8vIEludGVsLWNvbXBhdGlibGUKKwkJLy8gbG9jYWwgYnVzIChERUJJCisJCS8vIG5ldmVyIHRpbWVzIG91dCkuCisJCURFQlVHKCJzNjI2X2F0dGFjaDogJWQgZGViaSBpbml0IC0tICVkXG4iLAorCQkJREVCSV9DRkdfU0xBVkUxNiB8IChERUJJX1RPVVQgPDwgREVCSV9DRkdfVE9VVF9CSVQpIHwKKwkJCURFQklfU1dBUCB8IERFQklfQ0ZHX0lOVEVMLAorCQkJREVCSV9DRkdfSU5URUwgfCBERUJJX0NGR19UT1EgfCBERUJJX0NGR19JTkNRIHwKKwkJCURFQklfQ0ZHXzE2USk7CisKKwkJLy9ERUJJIElOSVQgUzYyNiBXUjcxNDYoIFBfREVCSUNGRywgREVCSV9DRkdfSU5URUwgfCBERUJJX0NGR19UT1EKKwkJLy98IERFQklfQ0ZHX0lOQ1F8IERFQklfQ0ZHXzE2USk7IC8vZW5kCisKKwkJLy8gUGFnaW5nIGlzIGRpc2FibGVkLgorCQlXUjcxNDYoUF9ERUJJUEFHRSwgREVCSV9QQUdFX0RJU0FCTEUpOwkvLyBEaXNhYmxlIE1NVSBwYWdpbmcuCisKKwkJLy8gSW5pdCBHUElPIHNvIHRoYXQgQURDIFN0YXJ0KiBpcyBuZWdhdGVkLgorCQlXUjcxNDYoUF9HUElPLCBHUElPX0JBU0UgfCBHUElPMV9ISSk7CisKKwkJLy9Jc0JvYXJkUmV2QSBpcyBhIGJvb2xlYW4gdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgYm9hcmQgaXMKKwkJLy9SZXZBLgorCisJCS8vIFZFUlNJT04gMi4wMSBDSEFOR0U6IFJFViBBICYgQiBCT0FSRFMgTk9XIFNVUFBPUlRFRCBCWSBEWU5BTUlDCisJCS8vIEVFUFJPTSBBRERSRVNTIFNFTEVDVElPTi4gIEluaXRpYWxpemUgdGhlIEkyQyBpbnRlcmZhY2UsIHdoaWNoCisJCS8vIGlzIHVzZWQgdG8gYWNjZXNzIHRoZSBvbmJvYXJkIHNlcmlhbCBFRVBST00uICBUaGUgRUVQUk9NJ3MgSTJDCisJCS8vIERldmljZUFkZHJlc3MgaXMgaGFyZHdpcmVkIHRvIGEgdmFsdWUgdGhhdCBpcyBkZXBlbmRlbnQgb24gdGhlCisJCS8vIDYyNiBib2FyZCByZXZpc2lvbi4gIE9uIGFsbCBib2FyZCByZXZpc2lvbnMsIHRoZSBFRVBST00gc3RvcmVzCisJCS8vIFRyaW1EQUMgY2FsaWJyYXRpb24gY29uc3RhbnRzIGZvciBhbmFsb2cgSS9PLiAgT24gUmV2QiBhbmQKKwkJLy8gaGlnaGVyIGJvYXJkcywgdGhlIERldmljZUFkZHJlc3MgaXMgaGFyZHdpcmVkIHRvIDAgdG8gZW5hYmxlCisJCS8vIHRoZSBFRVBST00gdG8gYWxzbyBzdG9yZSB0aGUgUENJIFN1YlZlbmRvcklEIGFuZCBTdWJEZXZpY2VJRDsKKwkJLy8gdGhpcyBpcyB0aGUgYWRkcmVzcyBhdCB3aGljaCB0aGUgU0FBNzE0NiBleHBlY3RzIGEKKwkJLy8gY29uZmlndXJhdGlvbiBFRVBST00gdG8gcmVzaWRlLiAgT24gUmV2QSBib2FyZHMsIHRoZSBFRVBST00KKwkJLy8gZGV2aWNlIGFkZHJlc3MsIHdoaWNoIGlzIGhhcmR3aXJlZCB0byA0LCBwcmV2ZW50cyB0aGUgU0FBNzE0NgorCQkvLyBmcm9tIHJldHJpZXZpbmcgUENJIHN1Yi1JRHMsIHNvIHRoZSBTQUE3MTQ2IHVzZXMgaXRzIGJ1aWx0LWluCisJCS8vIGRlZmF1bHQgdmFsdWVzLCBpbnN0ZWFkLgorCisJCS8vICAgIGRldnByaXYtPkkyQ2FyZHM9IElzQm9hcmRSZXZBID8gMHhBOCA6IDB4QTA7IC8vIFNldCBJMkMgRUVQUk9NCisJCS8vIERldmljZVR5cGUgKDB4QTApCisJCS8vIGFuZCBEZXZpY2VBZGRyZXNzPDwxLgorCisJCWRldnByaXYtPkkyQ0FkcnMgPSAweEEwOwkvLyBJMkMgZGV2aWNlIGFkZHJlc3MgZm9yIG9uYm9hcmQKKwkJLy8gZWVwcm9tKHJldmIpCisKKwkJLy8gSXNzdWUgYW4gSTJDIEFCT1JUIGNvbW1hbmQgdG8gaGFsdCBhbnkgSTJDIG9wZXJhdGlvbiBpbgorCQkvL3Byb2dyZXNzIGFuZCByZXNldCBCVVNZIGZsYWcuCisJCVdSNzE0NihQX0kyQ1NUQVQsIEkyQ19DTEtTRUwgfCBJMkNfQUJPUlQpOwkvLyBXcml0ZSBJMkMgY29udHJvbDoKKwkJLy8gYWJvcnQgYW55IEkyQworCQkvLyBhY3Rpdml0eS4KKwkJTUNfRU5BQkxFKFBfTUMyLCBNQzJfVVBMRF9JSUMpOwkvLyBJbnZva2UgY29tbWFuZAorCQkvLyB1cGxvYWQKKwkJd2hpbGUgKChSUjcxNDYoUF9NQzIpICYgTUMyX1VQTERfSUlDKSA9PSAwKSA7CS8vIGFuZCB3YWl0IGZvcgorCQkvLyB1cGxvYWQgdG8KKwkJLy8gY29tcGxldGUuCisKKwkJLy8gUGVyIFNBQTcxNDYgZGF0YSBzaGVldCwgd3JpdGUgdG8gU1RBVFVTIHJlZyB0d2ljZSB0byByZXNldCBhbGwKKwkJLy8gSTJDIGVycm9yIGZsYWdzLgorCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCQlXUjcxNDYoUF9JMkNTVEFULCBJMkNfQ0xLU0VMKTsJLy8gV3JpdGUgSTJDIGNvbnRyb2w6IHJlc2V0CisJCQkvLyBlcnJvciBmbGFncy4KKwkJCU1DX0VOQUJMRShQX01DMiwgTUMyX1VQTERfSUlDKTsJLy8gSW52b2tlIGNvbW1hbmQgdXBsb2FkCisJCQl3aGlsZSAoIU1DX1RFU1QoUF9NQzIsIE1DMl9VUExEX0lJQykpIDsJLy8gICBhbmQgd2FpdCBmb3IKKwkJCS8vICAgdXBsb2FkIHRvCisJCQkvLyAgIGNvbXBsZXRlLgorCQl9CisKKwkJLy8gSW5pdCBhdWRpbyBpbnRlcmZhY2UgZnVuY3Rpb25hbCBhdHRyaWJ1dGVzOiBzZXQgREFDL0FEQyBzZXJpYWwKKwkJLy8gY2xvY2sgcmF0ZXMsIGludmVydCBEQUMgc2VyaWFsIGNsb2NrIHNvIHRoYXQgREFDIGRhdGEgc2V0dXAKKwkJLy8gdGltZXMgYXJlIHNhdGlzZmllZCwgZW5hYmxlIERBQyBzZXJpYWwgY2xvY2sgb3V0LgorCQlXUjcxNDYoUF9BQ09OMiwgQUNPTjJfSU5JVCk7CisKKwkJLy8gU2V0IHVwIFRTTDEgc2xvdCBsaXN0LCB3aGljaCBpcyB1c2VkIHRvIGNvbnRyb2wgdGhlCisJCS8vIGFjY3VtdWxhdGlvbiBvZiBBREMgZGF0YTogUlNEMSA9IHNoaWZ0IGRhdGEgaW4gb24gU0QxLiAgU0lCX0ExCisJCS8vID0gc3RvcmUgZGF0YSB1aW50OF90IGF0IG5leHQgYXZhaWxhYmxlIGxvY2F0aW9uIGluIEZCIEJVRkZFUjEKKwkJLy8gcmVnaXN0ZXIuCisJCVdSNzE0NihQX1RTTDEsIFJTRDEgfCBTSUJfQTEpOwkvLyBGZXRjaCBBREMgaGlnaCBkYXRhCisJCS8vIHVpbnQ4X3QuCisJCVdSNzE0NihQX1RTTDEgKyA0LCBSU0QxIHwgU0lCX0ExIHwgRU9TKTsJLy8gRmV0Y2ggQURDIGxvdyBkYXRhCisJCS8vIHVpbnQ4X3Q7IGVuZCBvZgorCQkvLyBUU0wxLgorCisJCS8vIGVuYWIgVFNMMSBzbG90IGxpc3Qgc28gdGhhdCBpdCBleGVjdXRlcyBhbGwgdGhlIHRpbWUuCisJCVdSNzE0NihQX0FDT04xLCBBQ09OMV9BRENTVEFSVCk7CisKKwkJLy8gSW5pdGlhbGl6ZSBSUFMgcmVnaXN0ZXJzIHVzZWQgZm9yIEFEQy4KKworCQkvL1BoeXNpY2FsIHN0YXJ0IG9mIFJQUyBwcm9ncmFtLgorCQlXUjcxNDYoUF9SUFNBRERSMSwgKHVpbnQzMl90KSBkZXZwcml2LT5SUFNCdWYuUGh5c2ljYWxCYXNlKTsKKworCQlXUjcxNDYoUF9SUFNQQUdFMSwgMCk7CS8vIFJQUyBwcm9ncmFtIHBlcmZvcm1zIG5vCisJCS8vIGV4cGxpY2l0IG1lbSB3cml0ZXMuCisJCVdSNzE0NihQX1JQUzFfVE9VVCwgMCk7CS8vIERpc2FibGUgUlBTIHRpbWVvdXRzLgorCisJCS8vIFNBQTcxNDYgQlVHIFdPUktBUk9VTkQuICBJbml0aWFsaXplIFNBQTcxNDYgQURDIGludGVyZmFjZSB0byBhCisJCS8vIGtub3duIHN0YXRlIGJ5IGludm9raW5nIEFEQ3MgdW50aWwgRkIgQlVGRkVSIDEgcmVnaXN0ZXIgc2hvd3MKKwkJLy8gdGhhdCBpdCBpcyBjb3JyZWN0bHkgcmVjZWl2aW5nIEFEQyBkYXRhLiAgVGhpcyBpcyBuZWNlc3NhcnkKKwkJLy8gYmVjYXVzZSB0aGUgU0FBNzE0NiBBREMgaW50ZXJmYWNlIGRvZXMgbm90IHN0YXJ0IHVwIGluIGEKKwkJLy8gZGVmaW5lZCBzdGF0ZSBhZnRlciBhIFBDSSByZXNldC4KKworLyogICAgIFBvbGxMaXN0ID0gRU9QTDsJCQkvLyBDcmVhdGUgYSBzaW1wbGUgcG9sbGluZyAqLworLyogCQkJCQkvLyBsaXN0IGZvciBhbmFsb2cgaW5wdXQgKi8KKy8qIAkJCQkJLy8gY2hhbm5lbCAwLiAqLworLyogICAgIFJlc2V0QURDKCBkZXYsICZQb2xsTGlzdCApOyAqLworCisvKiAgICAgczYyNl9haV9yaW5zbihkZXYsZGV2LT5zdWJkZXZpY2VzLE5VTEwsZGF0YSk7IC8vKCAmQWRjRGF0YSApOyAvLyAqLworLyogCQkJCQkJICAvL0dldCBpbml0aWFsIEFEQyAqLworLyogCQkJCQkJICAvL3ZhbHVlLiAqLworCisvKiAgICAgU3RhcnRWYWwgPSBkYXRhWzBdOyAqLworCisvKiAgICAgLy8gVkVSU0lPTiAyLjAxIENIQU5HRTogVElNRU9VVCBBRERFRCBUTyBQUkVWRU5UIEhBTkdFRCBFWEVDVVRJT04uICovCisvKiAgICAgLy8gSW52b2tlIEFEQ3MgdW50aWwgdGhlIG5ldyBBREMgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBpbml0aWFsICovCisvKiAgICAgLy8gdmFsdWUgb3IgYSB0aW1lb3V0IG9jY3Vycy4gIFRoZSB0aW1lb3V0IHByb3RlY3RzIGFnYWluc3QgdGhlICovCisvKiAgICAgLy8gcG9zc2liaWxpdHkgdGhhdCB0aGUgZHJpdmVyIGlzIHJlc3RhcnRpbmcgYW5kIHRoZSBBREMgZGF0YSBpcyBhICovCisvKiAgICAgLy8gZml4ZWQgdmFsdWUgcmVzdWx0aW5nIGZyb20gdGhlIGFwcGxpZWQgQURDIGFuYWxvZyBpbnB1dCBiZWluZyAqLworLyogICAgIC8vIHVudXN1YWxseSBxdWlldCBvciBhdCB0aGUgcmFpbC4gKi8KKworLyogICAgIGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCA1MDA7IGluZGV4KysgKSAqLworLyogICAgICAgeyAqLworLyogCXM2MjZfYWlfcmluc24oZGV2LGRldi0+c3ViZGV2aWNlcyxOVUxMLGRhdGEpOyAqLworLyogCUFkY0RhdGEgPSBkYXRhWzBdOwkvL1JlYWRBREMoICAmQWRjRGF0YSApOyAqLworLyogCWlmICggQWRjRGF0YSAhPSBTdGFydFZhbCApICovCisvKiAJICBicmVhazsgKi8KKy8qICAgICAgIH0gKi8KKworCQkvLyBlbmQgaW5pdEFEQworCisJCS8vIGluaXQgdGhlIERBQyBpbnRlcmZhY2UKKworCQkvLyBJbml0IEF1ZGlvMidzIG91dHB1dCBETUFDIGF0dHJpYnV0ZXM6IGJ1cnN0IGxlbmd0aCA9IDEgRFdPUkQsCisJCS8vIHRocmVzaG9sZCA9IDEgRFdPUkQuCisJCVdSNzE0NihQX1BDSV9CVF9BLCAwKTsKKworCQkvLyBJbml0IEF1ZGlvMidzIG91dHB1dCBETUEgcGh5c2ljYWwgYWRkcmVzc2VzLiAgVGhlIHByb3RlY3Rpb24KKwkJLy8gYWRkcmVzcyBpcyBzZXQgdG8gMSBEV09SRCBwYXN0IHRoZSBiYXNlIGFkZHJlc3Mgc28gdGhhdCBhCisJCS8vIHNpbmdsZSBEV09SRCB3aWxsIGJlIHRyYW5zZmVycmVkIGVhY2ggdGltZSBhIERNQSB0cmFuc2ZlciBpcworCQkvLyBlbmFibGVkLgorCisJCXBQaHlzQnVmID0KKwkJCWRldnByaXYtPkFOQUJ1Zi5QaHlzaWNhbEJhc2UgKworCQkJKERBQ19XRE1BQlVGX09TICogc2l6ZW9mKHVpbnQzMl90KSk7CisKKwkJV1I3MTQ2KFBfQkFTRUEyX09VVCwgKHVpbnQzMl90KSBwUGh5c0J1Zik7CS8vIEJ1ZmZlciBiYXNlIGFkcnMuCisJCVdSNzE0NihQX1BST1RBMl9PVVQsICh1aW50MzJfdCkgKHBQaHlzQnVmICsgc2l6ZW9mKHVpbnQzMl90KSkpOwkvLyBQcm90ZWN0aW9uIGFkZHJlc3MuCisKKwkJLy8gQ2FjaGUgQXVkaW8yJ3Mgb3V0cHV0IERNQSBidWZmZXIgbG9naWNhbCBhZGRyZXNzLiAgVGhpcyBpcworCQkvLyB3aGVyZSBEQUMgZGF0YSBpcyBidWZmZXJlZCBmb3IgQTIgb3V0cHV0IERNQSB0cmFuc2ZlcnMuCisJCWRldnByaXYtPnBEYWNXQnVmID0KKwkJCSh1aW50MzJfdCAqKSBkZXZwcml2LT5BTkFCdWYuTG9naWNhbEJhc2UgKworCQkJREFDX1dETUFCVUZfT1M7CisKKwkJLy8gQXVkaW8yJ3Mgb3V0cHV0IGNoYW5uZWxzIGRvZXMgbm90IHVzZSBwYWdpbmcuICBUaGUgcHJvdGVjdGlvbgorCQkvLyB2aW9sYXRpb24gaGFuZGxpbmcgYml0IGlzIHNldCBzbyB0aGF0IHRoZSBETUFDIHdpbGwKKwkJLy8gYXV0b21hdGljYWxseSBoYWx0IGFuZCBpdHMgUENJIGFkZHJlc3MgcG9pbnRlciB3aWxsIGJlIHJlc2V0CisJCS8vIHdoZW4gdGhlIHByb3RlY3Rpb24gYWRkcmVzcyBpcyByZWFjaGVkLgorCQlXUjcxNDYoUF9QQUdFQTJfT1VULCA4KTsKKworCQkvLyBJbml0aWFsaXplIHRpbWUgc2xvdCBsaXN0IDIgKFRTTDIpLCB3aGljaCBpcyB1c2VkIHRvIGNvbnRyb2wKKwkJLy8gdGhlIGNsb2NrIGdlbmVyYXRpb24gZm9yIGFuZCBzZXJpYWxpemF0aW9uIG9mIGRhdGEgdG8gYmUgc2VudAorCQkvLyB0byB0aGUgREFDIGRldmljZXMuICBTbG90IDAgaXMgYSBOT1AgdGhhdCBpcyB1c2VkIHRvIHRyYXAgVFNMCisJCS8vIGV4ZWN1dGlvbjsgdGhpcyBwZXJtaXRzIG90aGVyIHNsb3RzIHRvIGJlIHNhZmVseSBtb2RpZmllZAorCQkvLyB3aXRob3V0IGZpcnN0IHR1cm5pbmcgb2ZmIHRoZSBUU0wgc2VxdWVuY2VyICh3aGljaCBpcworCQkvLyBhcHBhcmVudGx5IGltcG9zc2libGUgdG8gZG8pLiAgQWxzbywgU0QzICh3aGljaCBpcyBkcml2ZW4gYnkgYQorCQkvLyBwdWxsLXVwIHJlc2lzdG9yKSBpcyBzaGlmdGVkIGluIGFuZCBzdG9yZWQgdG8gdGhlIE1TQiBvZgorCQkvLyBGQl9CVUZGRVIyIHRvIGJlIHVzZWQgYXMgZXZpZGVuY2UgdGhhdCB0aGUgc2xvdCBzZXF1ZW5jZSBoYXMKKwkJLy8gbm90IHlldCBmaW5pc2hlZCBleGVjdXRpbmcuCisJCVNFVFZFQ1QoMCwgWFNEMiB8IFJTRDMgfCBTSUJfQTIgfCBFT1MpOwkvLyBTbG90IDA6IFRyYXAgVFNMCisJCS8vIGV4ZWN1dGlvbiwgc2hpZnQgMHhGRgorCQkvLyBpbnRvIEZCX0JVRkZFUjIuCisKKwkJLy8gSW5pdGlhbGl6ZSBzbG90IDEsIHdoaWNoIGlzIGNvbnN0YW50LiAgU2xvdCAxIGNhdXNlcyBhIERXT1JEIHRvCisJCS8vIGJlIHRyYW5zZmVycmVkIGZyb20gYXVkaW8gY2hhbm5lbCAyJ3Mgb3V0cHV0IEZJRk8gdG8gdGhlIEZJRk8ncworCQkvLyBvdXRwdXQgYnVmZmVyIHNvIHRoYXQgaXQgY2FuIGJlIHNlcmlhbGl6ZWQgYW5kIHNlbnQgdG8gdGhlIERBQworCQkvLyBkdXJpbmcgc3Vic2VxdWVudCBzbG90cy4gIEFsbCByZW1haW5pbmcgc2xvdHMgYXJlIGR5bmFtaWNhbGx5CisJCS8vIHBvcHVsYXRlZCBhcyByZXF1aXJlZCBieSB0aGUgdGFyZ2V0IERBQyBkZXZpY2UuCisJCVNFVFZFQ1QoMSwgTEZfQTIpOwkvLyBTbG90IDE6IEZldGNoIERXT1JEIGZyb20gQXVkaW8yJ3MKKwkJLy8gb3V0cHV0IEZJRk8uCisKKwkJLy8gU3RhcnQgREFDJ3MgYXVkaW8gaW50ZXJmYWNlIChUU0wyKSBydW5uaW5nLgorCQlXUjcxNDYoUF9BQ09OMSwgQUNPTjFfREFDU1RBUlQpOworCisJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwkJLy8gZW5kIGluaXQgREFDIGludGVyZmFjZQorCisJCS8vIEluaXQgVHJpbSBEQUNzIHRvIGNhbGlicmF0ZWQgdmFsdWVzLiAgRG8gaXQgdHdpY2UgYmVjYXVzZSB0aGUKKwkJLy8gU0FBNzE0NiBhdWRpbyBjaGFubmVsIGRvZXMgbm90IGFsd2F5cyByZXNldCBwcm9wZXJseSBhbmQKKwkJLy8gc29tZXRpbWVzIGNhdXNlcyB0aGUgZmlyc3QgZmV3IFRyaW1EQUMgd3JpdGVzIHRvIG1hbGZ1bmN0aW9uLgorCisJCUxvYWRUcmltREFDcyhkZXYpOworCQlMb2FkVHJpbURBQ3MoZGV2KTsJLy8gSW5zdXJhbmNlLgorCisJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCQkvLyBNYW51YWxseSBpbml0IGFsbCBnYXRlIGFycmF5IGhhcmR3YXJlIGluIGNhc2UgdGhpcyBpcyBhIHNvZnQKKwkJLy8gcmVzZXQgKHdlIGhhdmUgbm8gd2F5IG9mIGRldGVybWluaW5nIHdoZXRoZXIgdGhpcyBpcyBhIHdhcm0gb3IKKwkJLy8gY29sZCBzdGFydCkuICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBnYXRlIGFycmF5IHdpbGwKKwkJLy8gcmVzZXQgb25seSBpbiByZXNwb25zZSB0byBhIFBDSSBoYXJkIHJlc2V0OyB0aGVyZSBpcyBubyBzb2Z0CisJCS8vIHJlc2V0IGZ1bmN0aW9uLgorCisJCS8vIEluaXQgYWxsIERBQyBvdXRwdXRzIHRvIDBWIGFuZCBpbml0IGFsbCBEQUMgc2V0cG9pbnQgYW5kCisJCS8vIHBvbGFyaXR5IGltYWdlcy4KKwkJZm9yIChjaGFuID0gMDsgY2hhbiA8IFM2MjZfREFDX0NIQU5ORUxTOyBjaGFuKyspCisJCQlTZXREQUMoZGV2LCBjaGFuLCAwKTsKKworCQkvLyBJbml0IGltYWdlIG9mIFdSTUlTQzIgQmF0dGVyeSBDaGFyZ2VyIEVuYWJsZWQgY29udHJvbCBiaXQuCisJCS8vIFRoaXMgaW1hZ2UgaXMgdXNlZCB3aGVuIHRoZSBzdGF0ZSBvZiB0aGUgY2hhcmdlciBjb250cm9sIGJpdCwKKwkJLy8gd2hpY2ggaGFzIG5vIGRpcmVjdCBoYXJkd2FyZSByZWFkYmFjayBtZWNoYW5pc20sIGlzIHF1ZXJpZWQuCisJCWRldnByaXYtPkNoYXJnZUVuYWJsZWQgPSAwOworCisJCS8vIEluaXQgaW1hZ2Ugb2Ygd2F0Y2hkb2cgdGltZXIgaW50ZXJ2YWwgaW4gV1JNSVNDMi4gIFRoaXMgaW1hZ2UKKwkJLy8gbWFpbnRhaW5zIHRoZSB2YWx1ZSBvZiB0aGUgY29udHJvbCBiaXRzIG9mIE1JU0MyIGFyZQorCQkvLyBjb250aW51b3VzbHkgcmVzZXQgdG8gemVybyBhcyBsb25nIGFzIHRoZSBXRCB0aW1lciBpcyBkaXNhYmxlZC4KKwkJZGV2cHJpdi0+V0RJbnRlcnZhbCA9IDA7CisKKwkJLy8gSW5pdCBDb3VudGVyIEludGVycnVwdCBlbmFiIG1hc2sgZm9yIFJETUlTQzIuICBUaGlzIG1hc2sgaXMKKwkJLy8gYXBwbGllZCBhZ2FpbnN0IE1JU0MyIHdoZW4gdGVzdGluZyB0byBkZXRlcm1pbmUgd2hpY2ggdGltZXIKKwkJLy8gZXZlbnRzIGFyZSByZXF1ZXN0aW5nIGludGVycnVwdCBzZXJ2aWNlLgorCQlkZXZwcml2LT5Db3VudGVySW50RW5hYnMgPSAwOworCisJCS8vIEluaXQgY291bnRlcnMuCisJCUNvdW50ZXJzSW5pdChkZXYpOworCisJCS8vIFdpdGhvdXQgbW9kaWZ5aW5nIHRoZSBzdGF0ZSBvZiB0aGUgQmF0dGVyeSBCYWNrdXAgZW5hYiwgZGlzYWJsZQorCQkvLyB0aGUgd2F0Y2hkb2cgdGltZXIsIHNldCBESU8gY2hhbm5lbHMgMC01IHRvIG9wZXJhdGUgaW4gdGhlCisJCS8vIHN0YW5kYXJkIERJTyAodnMuIGNvdW50ZXIgb3ZlcmZsb3cpIG1vZGUsIGRpc2FibGUgdGhlIGJhdHRlcnkKKwkJLy8gY2hhcmdlciwgYW5kIHJlc2V0IHRoZSB3YXRjaGRvZyBpbnRlcnZhbCBzZWxlY3RvciB0byB6ZXJvLgorCQlXcml0ZU1JU0MyKGRldiwgKHVpbnQxNl90KSAoREVCSXJlYWQoZGV2LAorCQkJCQlMUF9SRE1JU0MyKSAmIE1JU0MyX0JBVFRfRU5BQkxFKSk7CisKKwkJLy8gSW5pdGlhbGl6ZSB0aGUgZGlnaXRhbCBJL08gc3Vic3lzdGVtLgorCQlzNjI2X2Rpb19pbml0KGRldik7CisKKwkJLy9lbmFibGUgaW50ZXJydXB0IHRlc3QKKwkJLy8gd3JpdGVsKElSUV9HUElPMyB8IElSUV9SUFMxLGRldnByaXYtPmJhc2VfYWRkcitQX0lFUik7CisJfQorCisJREVCVUcoInM2MjZfYXR0YWNoOiBjb21lZGklZCBzNjI2IGF0dGFjaGVkICUwNHhcbiIsIGRldi0+bWlub3IsCisJCSh1aW50MzJfdCkgZGV2cHJpdi0+YmFzZV9hZGRyKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgbHNhbXBsX3QgczYyNl9haV9yZWdfdG9fdWludChpbnQgZGF0YSkKK3sKKwlsc2FtcGxfdCB0ZW1wZGF0YTsKKworCXRlbXBkYXRhID0gKGRhdGEgPj4gMTgpOworCWlmICh0ZW1wZGF0YSAmIDB4MjAwMCkKKwkJdGVtcGRhdGEgJj0gMHgxZmZmOworCWVsc2UKKwkJdGVtcGRhdGEgKz0gKDEgPDwgMTMpOworCisJcmV0dXJuIHRlbXBkYXRhOworfQorCisvKiBzdGF0aWMgbHNhbXBsX3QgczYyNl91aW50X3RvX3JlZyhjb21lZGlfc3ViZGV2aWNlICpzLCBpbnQgZGF0YSl7ICovCisvKiAgIHJldHVybiAwOyAqLworLyogfSAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgczYyNl9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkIFBUX1JFR1NfQVJHKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IGQ7CisJY29tZWRpX3N1YmRldmljZSAqczsKKwljb21lZGlfY21kICpjbWQ7CisJZW5jX3ByaXZhdGUgKms7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQzMl90ICpyZWFkYWRkcjsKKwl1aW50MzJfdCBpcnF0eXBlLCBpcnFzdGF0dXM7CisJaW50IGkgPSAwOworCXNhbXBsX3QgdGVtcGRhdGE7CisJdWludDhfdCBncm91cDsKKwl1aW50MTZfdCBpcnFiaXQ7CisKKwlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogaW50ZXJydXB0IHJlcXVlc3QgcmVjaWV2ZWQhISFcbiIpOworCisJaWYgKGRldi0+YXR0YWNoZWQgPT0gMCkKKwkJcmV0dXJuIElSUV9OT05FOworCS8vIGxvY2sgdG8gYXZvaWQgcmFjZSB3aXRoIGNvbWVkaV9wb2xsCisJY29tZWRpX3NwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7CisKKwkvL3NhdmUgaW50ZXJydXB0IGVuYWJsZSByZWdpc3RlciBzdGF0ZQorCWlycXN0YXR1cyA9IHJlYWRsKGRldnByaXYtPmJhc2VfYWRkciArIFBfSUVSKTsKKworCS8vcmVhZCBpbnRlcnJ1cHQgdHlwZQorCWlycXR5cGUgPSByZWFkbChkZXZwcml2LT5iYXNlX2FkZHIgKyBQX0lTUik7CisKKwkvL2Rpc2FibGUgbWFzdGVyIGludGVycnVwdAorCXdyaXRlbCgwLCBkZXZwcml2LT5iYXNlX2FkZHIgKyBQX0lFUik7CisKKwkvL2NsZWFyIGludGVycnVwdAorCXdyaXRlbChpcnF0eXBlLCBkZXZwcml2LT5iYXNlX2FkZHIgKyBQX0lTUik7CisKKwkvL2RvIHNvbWV0aGluZ3MKKwlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogaW50ZXJydXB0IHR5cGUgJWRcbiIsIGlycXR5cGUpOworCisJc3dpdGNoIChpcnF0eXBlKSB7CisJY2FzZSBJUlFfUlBTMToJCS8vIGVuZF9vZl9zY2FuIG9jY3VycworCisJCURFQlVHKCJzNjI2X2lycV9oYW5kbGVyOiBSUFMxIGlycSBkZXRlY3RlZFxuIik7CisKKwkJLy8gbWFuYWdlIGFpIHN1YmRldmljZQorCQlzID0gZGV2LT5zdWJkZXZpY2VzOworCQljbWQgPSAmKHMtPmFzeW5jLT5jbWQpOworCisJCS8vIEluaXQgcHRyIHRvIERNQSBidWZmZXIgdGhhdCBob2xkcyBuZXcgQURDIGRhdGEuICBXZSBza2lwIHRoZQorCQkvLyBmaXJzdCB1aW50MTZfdCBpbiB0aGUgYnVmZmVyIGJlY2F1c2UgaXQgY29udGFpbnMganVuayBkYXRhIGZyb20KKwkJLy8gdGhlIGZpbmFsIEFEQyBvZiB0aGUgcHJldmlvdXMgcG9sbCBsaXN0IHNjYW4uCisJCXJlYWRhZGRyID0gKGludDMyX3QgKikgZGV2cHJpdi0+QU5BQnVmLkxvZ2ljYWxCYXNlICsgMTsKKworCQkvLyBnZXQgdGhlIGRhdGEgYW5kIGhhbmQgaXQgb3ZlciB0byBjb21lZGkKKwkJZm9yIChpID0gMDsgaSA8IChzLT5hc3luYy0+Y21kLmNoYW5saXN0X2xlbik7IGkrKykgeworCQkJLy8gQ29udmVydCBBREMgZGF0YSB0byAxNi1iaXQgaW50ZWdlciB2YWx1ZXMgYW5kIGNvcHkgdG8gYXBwbGljYXRpb24KKwkJCS8vIGJ1ZmZlci4KKwkJCXRlbXBkYXRhID0gczYyNl9haV9yZWdfdG9fdWludCgoaW50KSpyZWFkYWRkcik7CisJCQlyZWFkYWRkcisrOworCisJCQkvL3B1dCBkYXRhIGludG8gcmVhZCBidWZmZXIKKwkJCS8vIGNvbWVkaV9idWZfcHV0KHMtPmFzeW5jLCB0ZW1wZGF0YSk7CisJCQlpZiAoY2ZjX3dyaXRlX3RvX2J1ZmZlcihzLCB0ZW1wZGF0YSkgPT0gMCkKKwkJCQlwcmludGsoInM2MjZfaXJxX2hhbmRsZXI6IGNmY193cml0ZV90b19idWZmZXIgZXJyb3IhXG4iKTsKKworCQkJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IGFpIGNoYW5uZWwgJWQgYWNxdWlyZWQ6ICVkXG4iLAorCQkJCWksIHRlbXBkYXRhKTsKKwkJfQorCisJCS8vZW5kIG9mIHNjYW4gb2NjdXJzCisJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPUzsKKworCQlpZiAoIShkZXZwcml2LT5haV9jb250aW5vdXMpKQorCQkJZGV2cHJpdi0+YWlfc2FtcGxlX2NvdW50LS07CisJCWlmIChkZXZwcml2LT5haV9zYW1wbGVfY291bnQgPD0gMCkgeworCQkJZGV2cHJpdi0+YWlfY21kX3J1bm5pbmcgPSAwOworCisJCQkvLyBTdG9wIFJQUyBwcm9ncmFtLgorCQkJTUNfRElTQUJMRShQX01DMSwgTUMxX0VSUFMxKTsKKworCQkJLy9zZW5kIGVuZCBvZiBhY3F1aXNpdGlvbgorCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOworCisJCQkvL2Rpc2FibGUgbWFzdGVyIGludGVycnVwdAorCQkJaXJxc3RhdHVzID0gMDsKKwkJfQorCisJCWlmIChkZXZwcml2LT5haV9jbWRfcnVubmluZyAmJiBjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRVhUKSB7CisJCQlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogZW5hYmxlIGludGVycnVwdCBvbiBkaW8gY2hhbm5lbCAlZFxuIiwgY21kLT5zY2FuX2JlZ2luX2FyZyk7CisKKwkJCXM2MjZfZGlvX3NldF9pcnEoZGV2LCBjbWQtPnNjYW5fYmVnaW5fYXJnKTsKKworCQkJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IEV4dGVybmFsIHRyaWdnZXIgaXMgc2V0ISEhXG4iKTsKKwkJfQorCQkvLyB0ZWxsIGNvbWVkaSB0aGF0IGRhdGEgaXMgdGhlcmUKKwkJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IGV2ZW50cyAlZFxuIiwgcy0+YXN5bmMtPmV2ZW50cyk7CisJCWNvbWVkaV9ldmVudChkZXYsIHMpOworCQlicmVhazsKKwljYXNlIElSUV9HUElPMzoJLy9jaGVjayBkaW8gYW5kIGNvbnRlciBpbnRlcnJ1cHQKKworCQlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogR1BJTzMgaXJxIGRldGVjdGVkXG4iKTsKKworCQkvLyBtYW5hZ2UgYWkgc3ViZGV2aWNlCisJCXMgPSBkZXYtPnN1YmRldmljZXM7CisJCWNtZCA9ICYocy0+YXN5bmMtPmNtZCk7CisKKwkJLy9zNjI2X2Rpb19jbGVhcl9pcnEoZGV2KTsKKworCQlmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBTNjI2X0RJT19CQU5LUzsgZ3JvdXArKykgeworCQkJaXJxYml0ID0gMDsKKwkJCS8vcmVhZCBpbnRlcnJ1cHQgdHlwZQorCQkJaXJxYml0ID0gREVCSXJlYWQoZGV2LAorCQkJCSgoZGlvX3ByaXZhdGUgKikgKGRldi0+c3ViZGV2aWNlcyArIDIgKworCQkJCQkJZ3JvdXApLT5wcml2YXRlKS0+UkRDYXBGbGcpOworCisJCQkvL2NoZWNrIGlmIGludGVycnVwdCBpcyBnZW5lcmF0ZWQgZnJvbSBkaW8gY2hhbm5lbHMKKwkJCWlmIChpcnFiaXQpIHsKKwkJCQlzNjI2X2Rpb19yZXNldF9pcnEoZGV2LCBncm91cCwgaXJxYml0KTsKKwkJCQlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogY2hlY2sgaW50ZXJydXB0IG9uIGRpbyBncm91cCAlZCAlZFxuIiwgZ3JvdXAsIGkpOworCQkJCWlmIChkZXZwcml2LT5haV9jbWRfcnVubmluZykgeworCQkJCQkvL2NoZWNrIGlmIGludGVycnVwdCBpcyBhbiBhaSBhY3F1aXNpdGlvbiBzdGFydCB0cmlnZ2VyCisJCQkJCWlmICgoaXJxYml0ID4+IChjbWQtPnN0YXJ0X2FyZyAtCisJCQkJCQkJCSgxNiAqIGdyb3VwKSkpCisJCQkJCQk9PSAxCisJCQkJCQkmJiBjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX0VYVCkgeworCQkJCQkJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IEVkZ2UgY2FwdHVyZSBpbnRlcnJ1cHQgcmVjaWV2ZWQgZnJvbSBjaGFubmVsICVkXG4iLCBjbWQtPnN0YXJ0X2FyZyk7CisKKwkJCQkJCS8vIFN0YXJ0IGV4ZWN1dGluZyB0aGUgUlBTIHByb2dyYW0uCisJCQkJCQlNQ19FTkFCTEUoUF9NQzEsIE1DMV9FUlBTMSk7CisKKwkJCQkJCURFQlVHKCJzNjI2X2lycV9oYW5kbGVyOiBhcXVpc2l0aW9uIHN0YXJ0IHRyaWdnZXJlZCEhIVxuIik7CisKKwkJCQkJCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09CisJCQkJCQkJVFJJR19FWFQpIHsKKwkJCQkJCQlERUJVRygiczYyNl9haV9jbWQ6IGVuYWJsZSBpbnRlcnJ1cHQgb24gZGlvIGNoYW5uZWwgJWRcbiIsIGNtZC0+c2Nhbl9iZWdpbl9hcmcpOworCisJCQkJCQkJczYyNl9kaW9fc2V0X2lycShkZXYsCisJCQkJCQkJCWNtZC0+CisJCQkJCQkJCXNjYW5fYmVnaW5fYXJnKTsKKworCQkJCQkJCURFQlVHKCJzNjI2X2lycV9oYW5kbGVyOiBFeHRlcm5hbCBzY2FuIHRyaWdnZXIgaXMgc2V0ISEhXG4iKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAoKGlycWJpdCA+PiAoY21kLT5zY2FuX2JlZ2luX2FyZyAtCisJCQkJCQkJCSgxNiAqIGdyb3VwKSkpCisJCQkJCQk9PSAxCisJCQkJCQkmJiBjbWQtPnNjYW5fYmVnaW5fc3JjID09CisJCQkJCQlUUklHX0VYVCkgeworCQkJCQkJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IEVkZ2UgY2FwdHVyZSBpbnRlcnJ1cHQgcmVjaWV2ZWQgZnJvbSBjaGFubmVsICVkXG4iLCBjbWQtPnNjYW5fYmVnaW5fYXJnKTsKKworCQkJCQkJLy8gVHJpZ2dlciBBREMgc2NhbiBsb29wIHN0YXJ0IGJ5IHNldHRpbmcgUlBTIFNpZ25hbCAwLgorCQkJCQkJTUNfRU5BQkxFKFBfTUMyLCBNQzJfQURDX1JQUyk7CisKKwkJCQkJCURFQlVHKCJzNjI2X2lycV9oYW5kbGVyOiBzY2FuIHRyaWdnZXJlZCEhISAlZFxuIiwgZGV2cHJpdi0+YWlfc2FtcGxlX2NvdW50KTsKKwkJCQkJCWlmIChjbWQtPmNvbnZlcnRfc3JjID09CisJCQkJCQkJVFJJR19FWFQpIHsKKworCQkJCQkJCURFQlVHKCJzNjI2X2FpX2NtZDogZW5hYmxlIGludGVycnVwdCBvbiBkaW8gY2hhbm5lbCAlZCBncm91cCAlZFxuIiwgY21kLT5jb252ZXJ0X2FyZyAtICgxNiAqIGdyb3VwKSwgZ3JvdXApOworCisJCQkJCQkJZGV2cHJpdi0+CisJCQkJCQkJCWFpX2NvbnZlcnRfY291bnQKKwkJCQkJCQkJPQorCQkJCQkJCQljbWQtPgorCQkJCQkJCQljaGFubGlzdF9sZW47CisKKwkJCQkJCQlzNjI2X2Rpb19zZXRfaXJxKGRldiwKKwkJCQkJCQkJY21kLT4KKwkJCQkJCQkJY29udmVydF9hcmcpOworCisJCQkJCQkJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IEV4dGVybmFsIGNvbnZlcnQgdHJpZ2dlciBpcyBzZXQhISFcbiIpOworCQkJCQkJfQorCisJCQkJCQlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PQorCQkJCQkJCVRSSUdfVElNRVIpIHsKKwkJCQkJCQlrID0gJmVuY3ByaXZbNV07CisJCQkJCQkJZGV2cHJpdi0+CisJCQkJCQkJCWFpX2NvbnZlcnRfY291bnQKKwkJCQkJCQkJPQorCQkJCQkJCQljbWQtPgorCQkJCQkJCQljaGFubGlzdF9sZW47CisJCQkJCQkJay0+U2V0RW5hYmxlKGRldiwgaywKKwkJCQkJCQkJQ0xLRU5BQl9BTFdBWVMpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWlmICgoaXJxYml0ID4+IChjbWQtPmNvbnZlcnRfYXJnIC0KKwkJCQkJCQkJKDE2ICogZ3JvdXApKSkKKwkJCQkJCT09IDEKKwkJCQkJCSYmIGNtZC0+Y29udmVydF9zcmMgPT0KKwkJCQkJCVRSSUdfRVhUKSB7CisJCQkJCQlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogRWRnZSBjYXB0dXJlIGludGVycnVwdCByZWNpZXZlZCBmcm9tIGNoYW5uZWwgJWRcbiIsIGNtZC0+Y29udmVydF9hcmcpOworCisJCQkJCQkvLyBUcmlnZ2VyIEFEQyBzY2FuIGxvb3Agc3RhcnQgYnkgc2V0dGluZyBSUFMgU2lnbmFsIDAuCisJCQkJCQlNQ19FTkFCTEUoUF9NQzIsIE1DMl9BRENfUlBTKTsKKworCQkJCQkJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IGFkYyBjb252ZXJ0IHRyaWdnZXJlZCEhIVxuIik7CisKKwkJCQkJCWRldnByaXYtPmFpX2NvbnZlcnRfY291bnQtLTsKKworCQkJCQkJaWYgKGRldnByaXYtPmFpX2NvbnZlcnRfY291bnQgPgorCQkJCQkJCTApIHsKKworCQkJCQkJCURFQlVHKCJzNjI2X2FpX2NtZDogZW5hYmxlIGludGVycnVwdCBvbiBkaW8gY2hhbm5lbCAlZCBncm91cCAlZFxuIiwgY21kLT5jb252ZXJ0X2FyZyAtICgxNiAqIGdyb3VwKSwgZ3JvdXApOworCisJCQkJCQkJczYyNl9kaW9fc2V0X2lycShkZXYsCisJCQkJCQkJCWNtZC0+CisJCQkJCQkJCWNvbnZlcnRfYXJnKTsKKworCQkJCQkJCURFQlVHKCJzNjI2X2lycV9oYW5kbGVyOiBFeHRlcm5hbCB0cmlnZ2VyIGlzIHNldCEhIVxuIik7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvL3JlYWQgaW50ZXJydXB0IHR5cGUKKwkJaXJxYml0ID0gREVCSXJlYWQoZGV2LCBMUF9SRE1JU0MyKTsKKworCQkvL2NoZWNrIGludGVycnVwdCBvbiBjb3VudGVycworCQlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogY2hlY2sgY291bnRlcnMgaW50ZXJydXB0ICVkXG4iLAorCQkJaXJxYml0KTsKKworCQlpZiAoaXJxYml0ICYgSVJRX0NPSU5UMUEpIHsKKwkJCURFQlVHKCJzNjI2X2lycV9oYW5kbGVyOiBpbnRlcnJ1cHQgb24gY291bnRlciAxQSBvdmVyZmxvd1xuIik7CisJCQlrID0gJmVuY3ByaXZbMF07CisKKwkJCS8vY2xlYXIgaW50ZXJydXB0IGNhcHR1cmUgZmxhZworCQkJay0+UmVzZXRDYXBGbGFncyhkZXYsIGspOworCQl9CisJCWlmIChpcnFiaXQgJiBJUlFfQ09JTlQyQSkgeworCQkJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IGludGVycnVwdCBvbiBjb3VudGVyIDJBIG92ZXJmbG93XG4iKTsKKwkJCWsgPSAmZW5jcHJpdlsxXTsKKworCQkJLy9jbGVhciBpbnRlcnJ1cHQgY2FwdHVyZSBmbGFnCisJCQlrLT5SZXNldENhcEZsYWdzKGRldiwgayk7CisJCX0KKwkJaWYgKGlycWJpdCAmIElSUV9DT0lOVDNBKSB7CisJCQlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogaW50ZXJydXB0IG9uIGNvdW50ZXIgM0Egb3ZlcmZsb3dcbiIpOworCQkJayA9ICZlbmNwcml2WzJdOworCisJCQkvL2NsZWFyIGludGVycnVwdCBjYXB0dXJlIGZsYWcKKwkJCWstPlJlc2V0Q2FwRmxhZ3MoZGV2LCBrKTsKKwkJfQorCQlpZiAoaXJxYml0ICYgSVJRX0NPSU5UMUIpIHsKKwkJCURFQlVHKCJzNjI2X2lycV9oYW5kbGVyOiBpbnRlcnJ1cHQgb24gY291bnRlciAxQiBvdmVyZmxvd1xuIik7CisJCQlrID0gJmVuY3ByaXZbM107CisKKwkJCS8vY2xlYXIgaW50ZXJydXB0IGNhcHR1cmUgZmxhZworCQkJay0+UmVzZXRDYXBGbGFncyhkZXYsIGspOworCQl9CisJCWlmIChpcnFiaXQgJiBJUlFfQ09JTlQyQikgeworCQkJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IGludGVycnVwdCBvbiBjb3VudGVyIDJCIG92ZXJmbG93XG4iKTsKKwkJCWsgPSAmZW5jcHJpdls0XTsKKworCQkJLy9jbGVhciBpbnRlcnJ1cHQgY2FwdHVyZSBmbGFnCisJCQlrLT5SZXNldENhcEZsYWdzKGRldiwgayk7CisKKwkJCWlmIChkZXZwcml2LT5haV9jb252ZXJ0X2NvdW50ID4gMCkgeworCQkJCWRldnByaXYtPmFpX2NvbnZlcnRfY291bnQtLTsKKwkJCQlpZiAoZGV2cHJpdi0+YWlfY29udmVydF9jb3VudCA9PSAwKQorCQkJCQlrLT5TZXRFbmFibGUoZGV2LCBrLCBDTEtFTkFCX0lOREVYKTsKKworCQkJCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKKwkJCQkJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IGNvbnZlciB0aW1lciB0cmlnZ2VyISEhICVkXG4iLCBkZXZwcml2LT5haV9jb252ZXJ0X2NvdW50KTsKKworCQkJCQkvLyBUcmlnZ2VyIEFEQyBzY2FuIGxvb3Agc3RhcnQgYnkgc2V0dGluZyBSUFMgU2lnbmFsIDAuCisJCQkJCU1DX0VOQUJMRShQX01DMiwgTUMyX0FEQ19SUFMpOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoaXJxYml0ICYgSVJRX0NPSU5UM0IpIHsKKwkJCURFQlVHKCJzNjI2X2lycV9oYW5kbGVyOiBpbnRlcnJ1cHQgb24gY291bnRlciAzQiBvdmVyZmxvd1xuIik7CisJCQlrID0gJmVuY3ByaXZbNV07CisKKwkJCS8vY2xlYXIgaW50ZXJydXB0IGNhcHR1cmUgZmxhZworCQkJay0+UmVzZXRDYXBGbGFncyhkZXYsIGspOworCisJCQlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCQkJREVCVUcoInM2MjZfaXJxX2hhbmRsZXI6IHNjYW4gdGltZXIgdHJpZ2dlciEhIVxuIik7CisKKwkJCQkvLyBUcmlnZ2VyIEFEQyBzY2FuIGxvb3Agc3RhcnQgYnkgc2V0dGluZyBSUFMgU2lnbmFsIDAuCisJCQkJTUNfRU5BQkxFKFBfTUMyLCBNQzJfQURDX1JQUyk7CisJCQl9CisKKwkJCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKKwkJCQlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogY29udmVydCB0aW1lciB0cmlnZ2VyIGlzIHNldFxuIik7CisJCQkJayA9ICZlbmNwcml2WzRdOworCQkJCWRldnByaXYtPmFpX2NvbnZlcnRfY291bnQgPSBjbWQtPmNoYW5saXN0X2xlbjsKKwkJCQlrLT5TZXRFbmFibGUoZGV2LCBrLCBDTEtFTkFCX0FMV0FZUyk7CisJCQl9CisJCX0KKwl9CisKKwkvL2VuYWJsZSBpbnRlcnJ1cHQKKwl3cml0ZWwoaXJxc3RhdHVzLCBkZXZwcml2LT5iYXNlX2FkZHIgKyBQX0lFUik7CisKKwlERUJVRygiczYyNl9pcnFfaGFuZGxlcjogZXhpdCBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLlxuIik7CisKKwljb21lZGlfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBzNjI2X2RldGFjaChjb21lZGlfZGV2aWNlICogZGV2KQoreworCWlmIChkZXZwcml2KSB7CisJCS8vc3RvcCBhaV9jb21tYW5kCisJCWRldnByaXYtPmFpX2NtZF9ydW5uaW5nID0gMDsKKworCQlpZiAoZGV2cHJpdi0+YmFzZV9hZGRyKSB7CisJCQkvL2ludGVycnVwdCBtYXNrCisJCQlXUjcxNDYoUF9JRVIsIDApOwkvLyBEaXNhYmxlIG1hc3RlciBpbnRlcnJ1cHQuCisJCQlXUjcxNDYoUF9JU1IsIElSUV9HUElPMyB8IElSUV9SUFMxKTsJLy8gQ2xlYXIgYm9hcmQncyBJUlEgc3RhdHVzIGZsYWcuCisKKwkJCS8vIERpc2FibGUgdGhlIHdhdGNoZG9nIHRpbWVyIGFuZCBiYXR0ZXJ5IGNoYXJnZXIuCisJCQlXcml0ZU1JU0MyKGRldiwgMCk7CisKKwkJCS8vIENsb3NlIGFsbCBpbnRlcmZhY2VzIG9uIDcxNDYgZGV2aWNlLgorCQkJV1I3MTQ2KFBfTUMxLCBNQzFfU0hVVERPV04pOworCQkJV1I3MTQ2KFBfQUNPTjEsIEFDT04xX0JBU0UpOworCisJCQlDbG9zZURNQUIoZGV2LCAmZGV2cHJpdi0+UlBTQnVmLCBETUFCVUZfU0laRSk7CisJCQlDbG9zZURNQUIoZGV2LCAmZGV2cHJpdi0+QU5BQnVmLCBETUFCVUZfU0laRSk7CisJCX0KKworCQlpZiAoZGV2LT5pcnEpIHsKKwkJCWNvbWVkaV9mcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkJfQorCisJCWlmIChkZXZwcml2LT5iYXNlX2FkZHIpIHsKKwkJCWlvdW5tYXAoZGV2cHJpdi0+YmFzZV9hZGRyKTsKKwkJfQorCisJCWlmIChkZXZwcml2LT5wZGV2KSB7CisJCQlpZiAoZGV2cHJpdi0+Z290X3JlZ2lvbnMpIHsKKwkJCQljb21lZGlfcGNpX2Rpc2FibGUoZGV2cHJpdi0+cGRldik7CisJCQl9CisJCQlwY2lfZGV2X3B1dChkZXZwcml2LT5wZGV2KTsKKwkJfQorCX0KKworCURFQlVHKCJzNjI2X2RldGFjaDogUzYyNiBkZXRhY2hlZCFcbiIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB0aGlzIGZ1bmN0aW9ucyBidWlsZCB0aGUgUlBTIHByb2dyYW0gZm9yIGhhcmR3YXJlIGRyaXZlbiBhY3F1aXN0aW9uCisgKi8KK3ZvaWQgUmVzZXRBREMoY29tZWRpX2RldmljZSAqIGRldiwgdWludDhfdCAqIHBwbCkKK3sKKwlyZWdpc3RlciB1aW50MzJfdCAqcFJQUzsKKwl1aW50MzJfdCBKbXBBZHJzOworCXVpbnQxNl90IGk7CisJdWludDE2X3QgbjsKKwl1aW50MzJfdCBMb2NhbFBQTDsKKwljb21lZGlfY21kICpjbWQgPSAmKGRldi0+c3ViZGV2aWNlcy0+YXN5bmMtPmNtZCk7CisKKwkvLyBTdG9wIFJQUyBwcm9ncmFtIGluIGNhc2UgaXQgaXMgY3VycmVudGx5IHJ1bm5pbmcuCisJTUNfRElTQUJMRShQX01DMSwgTUMxX0VSUFMxKTsKKworCS8vIFNldCBzdGFydGluZyBsb2dpY2FsIGFkZHJlc3MgdG8gd3JpdGUgUlBTIGNvbW1hbmRzLgorCXBSUFMgPSAodWludDMyX3QgKikgZGV2cHJpdi0+UlBTQnVmLkxvZ2ljYWxCYXNlOworCisJLy8gSW5pdGlhbGl6ZSBSUFMgaW5zdHJ1Y3Rpb24gcG9pbnRlci4KKwlXUjcxNDYoUF9SUFNBRERSMSwgKHVpbnQzMl90KSBkZXZwcml2LT5SUFNCdWYuUGh5c2ljYWxCYXNlKTsKKworCS8vIENvbnN0cnVjdCBSUFMgcHJvZ3JhbSBpbiBSUFNCdWYgRE1BIGJ1ZmZlcgorCisJaWYgKGNtZCAhPSBOVUxMICYmIGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19GT0xMT1cpIHsKKwkJREVCVUcoIlJlc2V0QURDOiBzY2FuX2JlZ2luIHBhdXNlIGluc2VydGVkXG4iKTsKKwkJLy8gV2FpdCBmb3IgU3RhcnQgdHJpZ2dlci4KKwkJKnBSUFMrKyA9IFJQU19QQVVTRSB8IFJQU19TSUdBREM7CisJCSpwUlBTKysgPSBSUFNfQ0xSU0lHTkFMIHwgUlBTX1NJR0FEQzsKKwl9CisJLy8gU0FBNzE0NiBCVUcgV09SS0FST1VORCBEbyBhIGR1bW15IERFQkkgV3JpdGUuICBUaGlzIGlzIG5lY2Vzc2FyeQorCS8vIGJlY2F1c2UgdGhlIGZpcnN0IFJQUyBERUJJIFdyaXRlIGZvbGxvd2luZyBhIG5vbi1SUFMgREVCSSB3cml0ZQorCS8vIHNlZW1zIHRvIGFsd2F5cyBmYWlsLiAgSWYgd2UgZG9uJ3QgZG8gdGhpcyBkdW1teSB3cml0ZSwgdGhlIEFEQworCS8vIGdhaW4gbWlnaHQgbm90IGJlIHNldCB0byB0aGUgdmFsdWUgcmVxdWlyZWQgZm9yIHRoZSBmaXJzdCBzbG90IGluCisJLy8gdGhlIHBvbGwgbGlzdDsgdGhlIEFEQyBnYWluIHdvdWxkIGluc3RlYWQgcmVtYWluIHVuY2hhbmdlZCBmcm9tCisJLy8gdGhlIHByZXZpb3VzbHkgcHJvZ3JhbW1lZCB2YWx1ZS4KKwkqcFJQUysrID0gUlBTX0xEUkVHIHwgKFBfREVCSUNNRCA+PiAyKTsJLy8gV3JpdGUgREVCSSBXcml0ZSBjb21tYW5kCisJLy8gYW5kIGFkZHJlc3MgdG8gc2hhZG93IFJBTS4KKwkqcFJQUysrID0gREVCSV9DTURfV1JXT1JEIHwgTFBfR1NFTDsKKwkqcFJQUysrID0gUlBTX0xEUkVHIHwgKFBfREVCSUFEID4+IDIpOwkvLyBXcml0ZSBERUJJIGltbWVkaWF0ZSBkYXRhCisJLy8gdG8gc2hhZG93IFJBTToKKwkqcFJQUysrID0gR1NFTF9CSVBPTEFSNVY7CS8vIGFyYml0cmFyeSBpbW1lZGlhdGUgZGF0YQorCS8vIHZhbHVlLgorCSpwUlBTKysgPSBSUFNfQ0xSU0lHTkFMIHwgUlBTX0RFQkk7CS8vIFJlc2V0ICJzaGFkb3cgUkFNCisJLy8gdXBsb2FkZWQiIGZsYWcuCisJKnBSUFMrKyA9IFJQU19VUExPQUQgfCBSUFNfREVCSTsJLy8gSW52b2tlIHNoYWRvdyBSQU0gdXBsb2FkLgorCSpwUlBTKysgPSBSUFNfUEFVU0UgfCBSUFNfREVCSTsJLy8gV2FpdCBmb3Igc2hhZG93IHVwbG9hZCB0byBmaW5pc2guCisKKwkvLyBEaWdpdGl6ZSBhbGwgc2xvdHMgaW4gdGhlIHBvbGwgbGlzdC4gVGhpcyBpcyBpbXBsZW1lbnRlZCBhcyBhCisJLy8gZm9yIGxvb3AgdG8gbGltaXQgdGhlIHNsb3QgY291bnQgdG8gMTYgaW4gY2FzZSB0aGUgYXBwbGljYXRpb24KKwkvLyBmb3Jnb3QgdG8gc2V0IHRoZSBFT1BMIGZsYWcgaW4gdGhlIGZpbmFsIHNsb3QuCisJZm9yIChkZXZwcml2LT5BZGNJdGVtcyA9IDA7IGRldnByaXYtPkFkY0l0ZW1zIDwgMTY7IGRldnByaXYtPkFkY0l0ZW1zKyspIHsKKwkJLy8gQ29udmVydCBhcHBsaWNhdGlvbidzIHBvbGwgbGlzdCBpdGVtIHRvIHByaXZhdGUgYm9hcmQgY2xhc3MKKwkJLy8gZm9ybWF0LiAgRWFjaCBhcHAgcG9sbCBsaXN0IGl0ZW0gaXMgYW4gdWludDhfdCB3aXRoIGZvcm0KKwkJLy8gKEVPUEwseCx4LFJBTkdFLENIQU48MzowPiksIHdoZXJlIFJBTkdFIGNvZGUgaW5kaWNhdGVzIDAgPQorCQkvLyArLTEwViwgMSA9ICstNVYsIGFuZCBFT1BMID0gRW5kIG9mIFBvbGwgTGlzdCBtYXJrZXIuCisJCUxvY2FsUFBMID0KKwkJCSgqcHBsIDw8IDgpIHwgKCpwcGwgJiAweDEwID8gR1NFTF9CSVBPTEFSNVYgOgorCQkJR1NFTF9CSVBPTEFSMTBWKTsKKworCQkvLyBTd2l0Y2ggQURDIGFuYWxvZyBnYWluLgorCQkqcFJQUysrID0gUlBTX0xEUkVHIHwgKFBfREVCSUNNRCA+PiAyKTsJLy8gV3JpdGUgREVCSSBjb21tYW5kCisJCS8vIGFuZCBhZGRyZXNzIHRvCisJCS8vIHNoYWRvdyBSQU0uCisJCSpwUlBTKysgPSBERUJJX0NNRF9XUldPUkQgfCBMUF9HU0VMOworCQkqcFJQUysrID0gUlBTX0xEUkVHIHwgKFBfREVCSUFEID4+IDIpOwkvLyBXcml0ZSBERUJJCisJCS8vIGltbWVkaWF0ZSBkYXRhIHRvCisJCS8vIHNoYWRvdyBSQU0uCisJCSpwUlBTKysgPSBMb2NhbFBQTDsKKwkJKnBSUFMrKyA9IFJQU19DTFJTSUdOQUwgfCBSUFNfREVCSTsJLy8gUmVzZXQgInNoYWRvdyBSQU0gdXBsb2FkZWQiCisJCS8vIGZsYWcuCisJCSpwUlBTKysgPSBSUFNfVVBMT0FEIHwgUlBTX0RFQkk7CS8vIEludm9rZSBzaGFkb3cgUkFNIHVwbG9hZC4KKwkJKnBSUFMrKyA9IFJQU19QQVVTRSB8IFJQU19ERUJJOwkvLyBXYWl0IGZvciBzaGFkb3cgdXBsb2FkIHRvCisJCS8vIGZpbmlzaC4KKworCQkvLyBTZWxlY3QgQURDIGFuYWxvZyBpbnB1dCBjaGFubmVsLgorCQkqcFJQUysrID0gUlBTX0xEUkVHIHwgKFBfREVCSUNNRCA+PiAyKTsJLy8gV3JpdGUgREVCSSBjb21tYW5kCisJCS8vIGFuZCBhZGRyZXNzIHRvCisJCS8vIHNoYWRvdyBSQU0uCisJCSpwUlBTKysgPSBERUJJX0NNRF9XUldPUkQgfCBMUF9JU0VMOworCQkqcFJQUysrID0gUlBTX0xEUkVHIHwgKFBfREVCSUFEID4+IDIpOwkvLyBXcml0ZSBERUJJCisJCS8vIGltbWVkaWF0ZSBkYXRhIHRvCisJCS8vIHNoYWRvdyBSQU0uCisJCSpwUlBTKysgPSBMb2NhbFBQTDsKKwkJKnBSUFMrKyA9IFJQU19DTFJTSUdOQUwgfCBSUFNfREVCSTsJLy8gUmVzZXQgInNoYWRvdyBSQU0gdXBsb2FkZWQiCisJCS8vIGZsYWcuCisJCSpwUlBTKysgPSBSUFNfVVBMT0FEIHwgUlBTX0RFQkk7CS8vIEludm9rZSBzaGFkb3cgUkFNIHVwbG9hZC4KKwkJKnBSUFMrKyA9IFJQU19QQVVTRSB8IFJQU19ERUJJOwkvLyBXYWl0IGZvciBzaGFkb3cgdXBsb2FkIHRvCisJCS8vIGZpbmlzaC4KKworCQkvLyBEZWxheSBhdCBsZWFzdCAxMCBtaWNyb3NlY29uZHMgZm9yIGFuYWxvZyBpbnB1dCBzZXR0bGluZy4KKwkJLy8gSW5zdGVhZCBvZiBwYWRkaW5nIHdpdGggTk9Qcywgd2UgdXNlIFJQU19KVU1QIGluc3RydWN0aW9ucworCQkvLyBoZXJlOyB0aGlzIGFsbG93cyB1cyB0byBwcm9kdWNlIGEgbG9uZ2VyIGRlbGF5IHRoYW4gaXMKKwkJLy8gcG9zc2libGUgd2l0aCBOT1BzIGJlY2F1c2UgZWFjaCBSUFNfSlVNUCBmbHVzaGVzIHRoZSBSUFMnCisJCS8vIGluc3RydWN0aW9uIHByZWZldGNoIHBpcGVsaW5lLgorCQlKbXBBZHJzID0KKwkJCSh1aW50MzJfdCkgZGV2cHJpdi0+UlBTQnVmLlBoeXNpY2FsQmFzZSArCisJCQkodWludDMyX3QpICgodW5zaWduZWQgbG9uZylwUlBTIC0KKwkJCSh1bnNpZ25lZCBsb25nKWRldnByaXYtPlJQU0J1Zi5Mb2dpY2FsQmFzZSk7CisJCWZvciAoaSA9IDA7IGkgPCAoMTAgKiBSUFNDTEtfUEVSX1VTIC8gMik7IGkrKykgeworCQkJSm1wQWRycyArPSA4OwkvLyBSZXBlYXQgdG8gaW1wbGVtZW50IHRpbWUgZGVsYXk6CisJCQkqcFJQUysrID0gUlBTX0pVTVA7CS8vIEp1bXAgdG8gbmV4dCBSUFMgaW5zdHJ1Y3Rpb24uCisJCQkqcFJQUysrID0gSm1wQWRyczsKKwkJfQorCisJCWlmIChjbWQgIT0gTlVMTCAmJiBjbWQtPmNvbnZlcnRfc3JjICE9IFRSSUdfTk9XKSB7CisJCQlERUJVRygiUmVzZXRBREM6IGNvbnZlcnQgcGF1c2UgaW5zZXJ0ZWRcbiIpOworCQkJLy8gV2FpdCBmb3IgU3RhcnQgdHJpZ2dlci4KKwkJCSpwUlBTKysgPSBSUFNfUEFVU0UgfCBSUFNfU0lHQURDOworCQkJKnBSUFMrKyA9IFJQU19DTFJTSUdOQUwgfCBSUFNfU0lHQURDOworCQl9CisJCS8vIFN0YXJ0IEFEQyBieSBwdWxzaW5nIEdQSU8xLgorCQkqcFJQUysrID0gUlBTX0xEUkVHIHwgKFBfR1BJTyA+PiAyKTsJLy8gQmVnaW4gQURDIFN0YXJ0IHB1bHNlLgorCQkqcFJQUysrID0gR1BJT19CQVNFIHwgR1BJTzFfTE87CisJCSpwUlBTKysgPSBSUFNfTk9QOworCQkvLyBWRVJTSU9OIDIuMDMgQ0hBTkdFOiBTVFJFVENIIE9VVCBBREMgU1RBUlQgUFVMU0UuCisJCSpwUlBTKysgPSBSUFNfTERSRUcgfCAoUF9HUElPID4+IDIpOwkvLyBFbmQgQURDIFN0YXJ0IHB1bHNlLgorCQkqcFJQUysrID0gR1BJT19CQVNFIHwgR1BJTzFfSEk7CisKKwkJLy8gV2FpdCBmb3IgQURDIHRvIGNvbXBsZXRlIChHUElPMiBpcyBhc3NlcnRlZCBoaWdoIHdoZW4gQURDIG5vdAorCQkvLyBidXN5KSBhbmQgZm9yIGRhdGEgZnJvbSBwcmV2aW91cyBjb252ZXJzaW9uIHRvIHNoaWZ0IGludG8gRkIKKwkJLy8gQlVGRkVSIDEgcmVnaXN0ZXIuCisJCSpwUlBTKysgPSBSUFNfUEFVU0UgfCBSUFNfR1BJTzI7CS8vIFdhaXQgZm9yIEFEQyBkb25lLgorCisJCS8vIFRyYW5zZmVyIEFEQyBkYXRhIGZyb20gRkIgQlVGRkVSIDEgcmVnaXN0ZXIgdG8gRE1BIGJ1ZmZlci4KKwkJKnBSUFMrKyA9IFJQU19TVFJFRyB8IChCVUdGSVhfU1RSRUcoUF9GQl9CVUZGRVIxKSA+PiAyKTsKKwkJKnBSUFMrKyA9CisJCQkodWludDMyX3QpIGRldnByaXYtPkFOQUJ1Zi5QaHlzaWNhbEJhc2UgKworCQkJKGRldnByaXYtPkFkY0l0ZW1zIDw8IDIpOworCisJCS8vIElmIHRoaXMgc2xvdCdzIEVuZE9mUG9sbExpc3QgZmxhZyBpcyBzZXQsIGFsbCBjaGFubmVscyBoYXZlCisJCS8vIG5vdyBiZWVuIHByb2Nlc3NlZC4KKwkJaWYgKCpwcGwrKyAmIEVPUEwpIHsKKwkJCWRldnByaXYtPkFkY0l0ZW1zKys7CS8vIEFkanVzdCBwb2xsIGxpc3QgaXRlbSBjb3VudC4KKwkJCWJyZWFrOwkvLyBFeGl0IHBvbGwgbGlzdCBwcm9jZXNzaW5nIGxvb3AuCisJCX0KKwl9CisJREVCVUcoIlJlc2V0QURDOiBBREMgaXRlbXMgJWQgXG4iLCBkZXZwcml2LT5BZGNJdGVtcyk7CisKKwkvLyBWRVJTSU9OIDIuMDEgQ0hBTkdFOiBERUxBWSBDSEFOR0VEIEZST00gMjUwTlMgdG8gMlVTLiAgQWxsb3cgdGhlCisJLy8gQURDIHRvIHN0YWJpbGl6ZSBmb3IgMiBtaWNyb3NlY29uZHMgYmVmb3JlIHN0YXJ0aW5nIHRoZSBmaW5hbAorCS8vIChkdW1teSkgY29udmVyc2lvbi4gIFRoaXMgZGVsYXkgaXMgbmVjZXNzYXJ5IHRvIGFsbG93IHN1ZmZpY2llbnQKKwkvLyB0aW1lIGJldHdlZW4gbGFzdCBjb252ZXJzaW9uIGZpbmlzaGVkIGFuZCB0aGUgc3RhcnQgb2YgdGhlIGR1bW15CisJLy8gY29udmVyc2lvbi4gIFdpdGhvdXQgdGhpcyBkZWxheSwgdGhlIGxhc3QgY29udmVyc2lvbidzIGRhdGEgdmFsdWUKKwkvLyBpcyBzb21ldGltZXMgc2V0IHRvIHRoZSBwcmV2aW91cyBjb252ZXJzaW9uJ3MgZGF0YSB2YWx1ZS4KKwlmb3IgKG4gPSAwOyBuIDwgKDIgKiBSUFNDTEtfUEVSX1VTKTsgbisrKQorCQkqcFJQUysrID0gUlBTX05PUDsKKworCS8vIFN0YXJ0IGEgZHVtbXkgY29udmVyc2lvbiB0byBjYXVzZSB0aGUgZGF0YSBmcm9tIHRoZSBsYXN0CisJLy8gY29udmVyc2lvbiBvZiBpbnRlcmVzdCB0byBiZSBzaGlmdGVkIGluLgorCSpwUlBTKysgPSBSUFNfTERSRUcgfCAoUF9HUElPID4+IDIpOwkvLyBCZWdpbiBBREMgU3RhcnQgcHVsc2UuCisJKnBSUFMrKyA9IEdQSU9fQkFTRSB8IEdQSU8xX0xPOworCSpwUlBTKysgPSBSUFNfTk9QOworCS8vIFZFUlNJT04gMi4wMyBDSEFOR0U6IFNUUkVUQ0ggT1VUIEFEQyBTVEFSVCBQVUxTRS4KKwkqcFJQUysrID0gUlBTX0xEUkVHIHwgKFBfR1BJTyA+PiAyKTsJLy8gRW5kIEFEQyBTdGFydCBwdWxzZS4KKwkqcFJQUysrID0gR1BJT19CQVNFIHwgR1BJTzFfSEk7CisKKwkvLyBXYWl0IGZvciB0aGUgZGF0YSBmcm9tIHRoZSBsYXN0IGNvbnZlcnNpb24gb2YgaW50ZXJlc3QgdG8gYXJyaXZlCisJLy8gaW4gRkIgQlVGRkVSIDEgcmVnaXN0ZXIuCisJKnBSUFMrKyA9IFJQU19QQVVTRSB8IFJQU19HUElPMjsJLy8gV2FpdCBmb3IgQURDIGRvbmUuCisKKwkvLyBUcmFuc2ZlciBmaW5hbCBBREMgZGF0YSBmcm9tIEZCIEJVRkZFUiAxIHJlZ2lzdGVyIHRvIERNQSBidWZmZXIuCisJKnBSUFMrKyA9IFJQU19TVFJFRyB8IChCVUdGSVhfU1RSRUcoUF9GQl9CVUZGRVIxKSA+PiAyKTsJLy8KKwkqcFJQUysrID0KKwkJKHVpbnQzMl90KSBkZXZwcml2LT5BTkFCdWYuUGh5c2ljYWxCYXNlICsKKwkJKGRldnByaXYtPkFkY0l0ZW1zIDw8IDIpOworCisJLy8gSW5kaWNhdGUgQURDIHNjYW4gbG9vcCBpcyBmaW5pc2hlZC4KKwkvLyAqcFJQUysrPSBSUFNfQ0xSU0lHTkFMIHwgUlBTX1NJR0FEQyA7ICAvLyBTaWduYWwgUmVhZEFEQygpIHRoYXQgc2NhbiBpcyBkb25lLgorCisJLy9pbnZva2UgaW50ZXJydXB0CisJaWYgKGRldnByaXYtPmFpX2NtZF9ydW5uaW5nID09IDEpIHsKKwkJREVCVUcoIlJlc2V0QURDOiBpbnNlcnQgaXJxIGluIEFEQyBSUFMgdGFza1xuIik7CisJCSpwUlBTKysgPSBSUFNfSVJROworCX0KKwkvLyBSZXN0YXJ0IFJQUyBwcm9ncmFtIGF0IGl0cyBiZWdpbm5pbmcuCisJKnBSUFMrKyA9IFJQU19KVU1QOwkvLyBCcmFuY2ggdG8gc3RhcnQgb2YgUlBTIHByb2dyYW0uCisJKnBSUFMrKyA9ICh1aW50MzJfdCkgZGV2cHJpdi0+UlBTQnVmLlBoeXNpY2FsQmFzZTsKKworCS8vIEVuZCBvZiBSUFMgcHJvZ3JhbSBidWlsZAorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfQorCisvKiBUTyBDT01QTEVURSwgSUYgTkVDRVNTQVJZICovCitzdGF0aWMgaW50IHM2MjZfYWlfaW5zbl9jb25maWcoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogc3RhdGljIGludCBzNjI2X2FpX3JpbnNuKGNvbWVkaV9kZXZpY2UgKmRldixjb21lZGlfc3ViZGV2aWNlICpzLGNvbWVkaV9pbnNuICppbnNuLGxzYW1wbF90ICpkYXRhKSAqLworLyogeyAqLworLyogICByZWdpc3RlciB1aW50OF90CWk7ICovCisvKiAgIHJlZ2lzdGVyIGludDMyX3QJKnJlYWRhZGRyOyAqLworCisvKiAgIERFQlVHKCJhczYyNl9haV9yaW5zbjogYWlfcmluc24gZW50ZXIgXG4iKTsgICovCisKKy8qICAgLy8gVHJpZ2dlciBBREMgc2NhbiBsb29wIHN0YXJ0IGJ5IHNldHRpbmcgUlBTIFNpZ25hbCAwLiAqLworLyogICBNQ19FTkFCTEUoIFBfTUMyLCBNQzJfQURDX1JQUyApOyAqLworCisvKiAgIC8vIFdhaXQgdW50aWwgQURDIHNjYW4gbG9vcCBpcyBmaW5pc2hlZCAoUlBTIFNpZ25hbCAwIHJlc2V0KS4gKi8KKy8qICAgd2hpbGUgKCBNQ19URVNUKCBQX01DMiwgTUMyX0FEQ19SUFMgKSApOyAqLworCisvKiAgIC8vIEluaXQgcHRyIHRvIERNQSBidWZmZXIgdGhhdCBob2xkcyBuZXcgQURDIGRhdGEuICBXZSBza2lwIHRoZSAqLworLyogICAvLyBmaXJzdCB1aW50MTZfdCBpbiB0aGUgYnVmZmVyIGJlY2F1c2UgaXQgY29udGFpbnMganVuayBkYXRhIGZyb20gKi8KKy8qICAgLy8gdGhlIGZpbmFsIEFEQyBvZiB0aGUgcHJldmlvdXMgcG9sbCBsaXN0IHNjYW4uICovCisvKiAgIHJlYWRhZGRyID0gKHVpbnQzMl90ICopZGV2cHJpdi0+QU5BQnVmLkxvZ2ljYWxCYXNlICsgMTsgKi8KKworLyogICAvLyBDb252ZXJ0IEFEQyBkYXRhIHRvIDE2LWJpdCBpbnRlZ2VyIHZhbHVlcyBhbmQgY29weSB0byBhcHBsaWNhdGlvbiAqLworLyogICAvLyBidWZmZXIuCSAqLworLyogICBmb3IgKCBpID0gMDsgaSA8IGRldnByaXYtPkFkY0l0ZW1zOyBpKysgKSB7ICovCisvKiAgICAgKmRhdGEgPSBzNjI2X2FpX3JlZ190b191aW50KCAqcmVhZGFkZHIrKyApOyAqLworLyogICAgIERFQlVHKCJzNjI2X2FpX3JpbnNuOiBkYXRhICVkIFxuIiwqZGF0YSk7ICovCisvKiAgICAgZGF0YSsrOyAqLworLyogICB9ICovCisKKy8qICAgREVCVUcoInM2MjZfYWlfcmluc246IGFpX3JpbnNuIGVzY2FwZSBcbiIpOyAqLworLyogICByZXR1cm4gaTsgKi8KKy8qIH0gKi8KKworc3RhdGljIGludCBzNjI2X2FpX2luc25fcmVhZChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKwl1aW50MTZfdCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJdWludDE2X3QgcmFuZ2UgPSBDUl9SQU5HRShpbnNuLT5jaGFuc3BlYyk7CisJdWludDE2X3QgQWRjU3BlYyA9IDA7CisJdWludDMyX3QgR3Bpb0ltYWdlOworCWludCBuOworCisvKiAgIC8vaW50ZXJydXB0IGNhbGwgdGVzdCAgKi8KKy8qICAgd3JpdGVsKElSUV9HUElPMyxkZXZwcml2LT5iYXNlX2FkZHIrUF9QU1IpOyAvL1dyaXRpbmcgYSBsb2dpY2FsIDEgKi8KKy8qIAkJCQkJICAgICAvL2ludG8gYW55IG9mIHRoZSBSUFNfUFNSICovCisvKiAJCQkJCSAgICAgLy9iaXRzIGNhdXNlcyB0aGUgKi8KKy8qIAkJCQkJICAgICAvL2NvcnJlc3BvbmRpbmcgaW50ZXJydXB0ICovCisvKiAJCQkJCSAgICAgLy90byBiZSBnZW5lcmF0ZWQgaWYgKi8KKy8qIAkJCQkJICAgICAvL2VuYWJsZWQgKi8KKworCURFQlVHKCJzNjI2X2FpX2luc25fcmVhZDogZW50ZXJpbmdcbiIpOworCisJLy8gQ29udmVydCBhcHBsaWNhdGlvbidzIEFEQyBzcGVjaWZpY2F0aW9uIGludG8gZm9ybQorCS8vIGFwcHJvcHJpYXRlIGZvciByZWdpc3RlciBwcm9ncmFtbWluZy4KKwlpZiAocmFuZ2UgPT0gMCkKKwkJQWRjU3BlYyA9IChjaGFuIDw8IDgpIHwgKEdTRUxfQklQT0xBUjVWKTsKKwllbHNlCisJCUFkY1NwZWMgPSAoY2hhbiA8PCA4KSB8IChHU0VMX0JJUE9MQVIxMFYpOworCisJLy8gU3dpdGNoIEFEQyBhbmFsb2cgZ2Fpbi4KKwlERUJJd3JpdGUoZGV2LCBMUF9HU0VMLCBBZGNTcGVjKTsJLy8gU2V0IGdhaW4uCisKKwkvLyBTZWxlY3QgQURDIGFuYWxvZyBpbnB1dCBjaGFubmVsLgorCURFQkl3cml0ZShkZXYsIExQX0lTRUwsIEFkY1NwZWMpOwkvLyBTZWxlY3QgY2hhbm5lbC4KKworCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspIHsKKworCQkvLyBEZWxheSAxMCBtaWNyb3NlY29uZHMgZm9yIGFuYWxvZyBpbnB1dCBzZXR0bGluZy4KKwkJY29tZWRpX3VkZWxheSgxMCk7CisKKwkJLy8gU3RhcnQgQURDIGJ5IHB1bHNpbmcgR1BJTzEgbG93LgorCQlHcGlvSW1hZ2UgPSBSUjcxNDYoUF9HUElPKTsKKwkJLy8gQXNzZXJ0IEFEQyBTdGFydCBjb21tYW5kCisJCVdSNzE0NihQX0dQSU8sIEdwaW9JbWFnZSAmIH5HUElPMV9ISSk7CisJCS8vICAgYW5kIHN0cmV0Y2ggaXQgb3V0LgorCQlXUjcxNDYoUF9HUElPLCBHcGlvSW1hZ2UgJiB+R1BJTzFfSEkpOworCQlXUjcxNDYoUF9HUElPLCBHcGlvSW1hZ2UgJiB+R1BJTzFfSEkpOworCQkvLyBOZWdhdGUgQURDIFN0YXJ0IGNvbW1hbmQuCisJCVdSNzE0NihQX0dQSU8sIEdwaW9JbWFnZSB8IEdQSU8xX0hJKTsKKworCQkvLyBXYWl0IGZvciBBREMgdG8gY29tcGxldGUgKEdQSU8yIGlzIGFzc2VydGVkIGhpZ2ggd2hlbgorCQkvLyBBREMgbm90IGJ1c3kpIGFuZCBmb3IgZGF0YSBmcm9tIHByZXZpb3VzIGNvbnZlcnNpb24gdG8KKwkJLy8gc2hpZnQgaW50byBGQiBCVUZGRVIgMSByZWdpc3Rlci4KKworCQkvLyBXYWl0IGZvciBBREMgZG9uZS4KKwkJd2hpbGUgKCEoUlI3MTQ2KFBfUFNSKSAmIFBTUl9HUElPMikpIDsKKworCQkvLyBGZXRjaCBBREMgZGF0YS4KKwkJaWYgKG4gIT0gMCkKKwkJCWRhdGFbbiAtIDFdID0gczYyNl9haV9yZWdfdG9fdWludChSUjcxNDYoUF9GQl9CVUZGRVIxKSk7CisKKwkJLy8gQWxsb3cgdGhlIEFEQyB0byBzdGFiaWxpemUgZm9yIDQgbWljcm9zZWNvbmRzIGJlZm9yZQorCQkvLyBzdGFydGluZyB0aGUgbmV4dCAoZmluYWwpIGNvbnZlcnNpb24uICBUaGlzIGRlbGF5IGlzCisJCS8vIG5lY2Vzc2FyeSB0byBhbGxvdyBzdWZmaWNpZW50IHRpbWUgYmV0d2VlbiBsYXN0CisJCS8vIGNvbnZlcnNpb24gZmluaXNoZWQgYW5kIHRoZSBzdGFydCBvZiB0aGUgbmV4dAorCQkvLyBjb252ZXJzaW9uLiAgV2l0aG91dCB0aGlzIGRlbGF5LCB0aGUgbGFzdCBjb252ZXJzaW9uJ3MKKwkJLy8gZGF0YSB2YWx1ZSBpcyBzb21ldGltZXMgc2V0IHRvIHRoZSBwcmV2aW91cworCQkvLyBjb252ZXJzaW9uJ3MgZGF0YSB2YWx1ZS4KKwkJY29tZWRpX3VkZWxheSg0KTsKKwl9CisKKwkvLyBTdGFydCBhIGR1bW15IGNvbnZlcnNpb24gdG8gY2F1c2UgdGhlIGRhdGEgZnJvbSB0aGUKKwkvLyBwcmV2aW91cyBjb252ZXJzaW9uIHRvIGJlIHNoaWZ0ZWQgaW4uCisJR3Bpb0ltYWdlID0gUlI3MTQ2KFBfR1BJTyk7CisKKwkvL0Fzc2VydCBBREMgU3RhcnQgY29tbWFuZAorCVdSNzE0NihQX0dQSU8sIEdwaW9JbWFnZSAmIH5HUElPMV9ISSk7CisJLy8gICBhbmQgc3RyZXRjaCBpdCBvdXQuCisJV1I3MTQ2KFBfR1BJTywgR3Bpb0ltYWdlICYgfkdQSU8xX0hJKTsKKwlXUjcxNDYoUF9HUElPLCBHcGlvSW1hZ2UgJiB+R1BJTzFfSEkpOworCS8vIE5lZ2F0ZSBBREMgU3RhcnQgY29tbWFuZC4KKwlXUjcxNDYoUF9HUElPLCBHcGlvSW1hZ2UgfCBHUElPMV9ISSk7CisKKwkvLyBXYWl0IGZvciB0aGUgZGF0YSB0byBhcnJpdmUgaW4gRkIgQlVGRkVSIDEgcmVnaXN0ZXIuCisKKwkvLyBXYWl0IGZvciBBREMgZG9uZS4KKwl3aGlsZSAoIShSUjcxNDYoUF9QU1IpICYgUFNSX0dQSU8yKSkgOworCisJLy8gRmV0Y2ggQURDIGRhdGEgZnJvbSBhdWRpbyBpbnRlcmZhY2UncyBpbnB1dCBzaGlmdAorCS8vIHJlZ2lzdGVyLgorCisJLy8gRmV0Y2ggQURDIGRhdGEuCisJaWYgKG4gIT0gMCkKKwkJZGF0YVtuIC0gMV0gPSBzNjI2X2FpX3JlZ190b191aW50KFJSNzE0NihQX0ZCX0JVRkZFUjEpKTsKKworCURFQlVHKCJzNjI2X2FpX2luc25fcmVhZDogc2FtcGxlcyAlZCwgZGF0YSAlZFxuIiwgbiwgZGF0YVtuIC0gMV0pOworCisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBpbnQgczYyNl9haV9sb2FkX3BvbGxsaXN0KHVpbnQ4X3QgKiBwcGwsIGNvbWVkaV9jbWQgKiBjbWQpCit7CisKKwlpbnQgbjsKKworCWZvciAobiA9IDA7IG4gPCBjbWQtPmNoYW5saXN0X2xlbjsgbisrKSB7CisJCWlmIChDUl9SQU5HRSgoY21kLT5jaGFubGlzdClbbl0pID09IDApCisJCQlwcGxbbl0gPSAoQ1JfQ0hBTigoY21kLT5jaGFubGlzdClbbl0pKSB8IChSQU5HRV81Vik7CisJCWVsc2UKKwkJCXBwbFtuXSA9IChDUl9DSEFOKChjbWQtPmNoYW5saXN0KVtuXSkpIHwgKFJBTkdFXzEwVik7CisJfQorCXBwbFtuIC0gMV0gfD0gRU9QTDsKKworCXJldHVybiBuOworfQorCitzdGF0aWMgaW50IHM2MjZfYWlfaW50dHJpZyhjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwl1bnNpZ25lZCBpbnQgdHJpZ251bSkKK3sKKwlpZiAodHJpZ251bSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCURFQlVHKCJzNjI2X2FpX2ludHRyaWc6IHRyaWdnZXIgYWRjIHN0YXJ0Li4uIik7CisKKwkvLyBTdGFydCBleGVjdXRpbmcgdGhlIFJQUyBwcm9ncmFtLgorCU1DX0VOQUJMRShQX01DMSwgTUMxX0VSUFMxKTsKKworCXMtPmFzeW5jLT5pbnR0cmlnID0gTlVMTDsKKworCURFQlVHKCIgZG9uZVxuIik7CisKKwlyZXR1cm4gMTsKK30KKworLyogIFRPIENPTVBMRVRFICAqLworc3RhdGljIGludCBzNjI2X2FpX2NtZChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcykKK3sKKworCXVpbnQ4X3QgcHBsWzE2XTsKKwljb21lZGlfY21kICpjbWQgPSAmcy0+YXN5bmMtPmNtZDsKKwllbmNfcHJpdmF0ZSAqazsKKwlpbnQgdGljazsKKworCURFQlVHKCJzNjI2X2FpX2NtZDogZW50ZXJpbmcgY29tbWFuZCBmdW5jdGlvblxuIik7CisKKwlpZiAoZGV2cHJpdi0+YWlfY21kX3J1bm5pbmcpIHsKKwkJcHJpbnRrKCJzNjI2X2FpX2NtZDogQW5vdGhlciBhaV9jbWQgaXMgcnVubmluZyAlZFxuIiwKKwkJCWRldi0+bWlub3IpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwkvL2Rpc2FibGUgaW50ZXJydXB0CisJd3JpdGVsKDAsIGRldnByaXYtPmJhc2VfYWRkciArIFBfSUVSKTsKKworCS8vY2xlYXIgaW50ZXJydXB0IHJlcXVlc3QKKwl3cml0ZWwoSVJRX1JQUzEgfCBJUlFfR1BJTzMsIGRldnByaXYtPmJhc2VfYWRkciArIFBfSVNSKTsKKworCS8vY2xlYXIgYW55IHBlbmRpbmcgaW50ZXJydXB0CisJczYyNl9kaW9fY2xlYXJfaXJxKGRldik7CisJLy8gIHM2MjZfZW5jX2NsZWFyX2lycShkZXYpOworCisJLy9yZXNldCBhaV9jbWRfcnVubmluZyBmbGFnCisJZGV2cHJpdi0+YWlfY21kX3J1bm5pbmcgPSAwOworCisJLy8gdGVzdCBpZiBjbWQgaXMgdmFsaWQKKwlpZiAoY21kID09IE5VTEwpIHsKKwkJREVCVUcoInM2MjZfYWlfY21kOiBOVUxMIGNvbW1hbmRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgeworCQlERUJVRygiczYyNl9haV9jbWQ6IGNvbW1hbmQgcmVjaWV2ZWQhISFcbiIpOworCX0KKworCWlmIChkZXYtPmlycSA9PSAwKSB7CisJCWNvbWVkaV9lcnJvcihkZXYsCisJCQkiczYyNl9haV9jbWQ6IGNhbm5vdCBydW4gY29tbWFuZCB3aXRob3V0IGFuIGlycSIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlzNjI2X2FpX2xvYWRfcG9sbGxpc3QocHBsLCBjbWQpOworCWRldnByaXYtPmFpX2NtZF9ydW5uaW5nID0gMTsKKwlkZXZwcml2LT5haV9jb252ZXJ0X2NvdW50ID0gMDsKKworCXN3aXRjaCAoY21kLT5zY2FuX2JlZ2luX3NyYykgeworCWNhc2UgVFJJR19GT0xMT1c6CisJCWJyZWFrOworCWNhc2UgVFJJR19USU1FUjoKKwkJLy8gc2V0IGEgY29udGVyIHRvIGdlbmVyYXRlIGFkYyB0cmlnZ2VyIGF0IHNjYW5fYmVnaW5fYXJnIGludGVydmFsCisJCWsgPSAmZW5jcHJpdls1XTsKKwkJdGljayA9IHM2MjZfbnNfdG9fdGltZXIoKGludCAqKSZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJY21kLT5mbGFncyAmIFRSSUdfUk9VTkRfTUFTSyk7CisKKwkJLy9sb2FkIHRpbWVyIHZhbHVlIGFuZCBlbmFibGUgaW50ZXJydXB0CisJCXM2MjZfdGltZXJfbG9hZChkZXYsIGssIHRpY2spOworCQlrLT5TZXRFbmFibGUoZGV2LCBrLCBDTEtFTkFCX0FMV0FZUyk7CisKKwkJREVCVUcoInM2MjZfYWlfY21kOiBzY2FuIHRyaWdnZXIgdGltZXIgaXMgc2V0IHdpdGggdmFsdWUgJWRcbiIsCisJCQl0aWNrKTsKKworCQlicmVhazsKKwljYXNlIFRSSUdfRVhUOgorCQkvLyBzZXQgdGhlIGRpZ2l0YWwgbGluZSBhbmQgaW50ZXJydXB0IGZvciBzY2FuIHRyaWdnZXIKKwkJaWYgKGNtZC0+c3RhcnRfc3JjICE9IFRSSUdfRVhUKQorCQkJczYyNl9kaW9fc2V0X2lycShkZXYsIGNtZC0+c2Nhbl9iZWdpbl9hcmcpOworCisJCURFQlVHKCJzNjI2X2FpX2NtZDogRXh0ZXJuYWwgc2NhbiB0cmlnZ2VyIGlzIHNldCEhIVxuIik7CisKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChjbWQtPmNvbnZlcnRfc3JjKSB7CisJY2FzZSBUUklHX05PVzoKKwkJYnJlYWs7CisJY2FzZSBUUklHX1RJTUVSOgorCQkvLyBzZXQgYSBjb250ZXIgdG8gZ2VuZXJhdGUgYWRjIHRyaWdnZXIgYXQgY29udmVydF9hcmcgaW50ZXJ2YWwKKwkJayA9ICZlbmNwcml2WzRdOworCQl0aWNrID0gczYyNl9uc190b190aW1lcigoaW50ICopJmNtZC0+Y29udmVydF9hcmcsCisJCQljbWQtPmZsYWdzICYgVFJJR19ST1VORF9NQVNLKTsKKworCQkvL2xvYWQgdGltZXIgdmFsdWUgYW5kIGVuYWJsZSBpbnRlcnJ1cHQKKwkJczYyNl90aW1lcl9sb2FkKGRldiwgaywgdGljayk7CisJCWstPlNldEVuYWJsZShkZXYsIGssIENMS0VOQUJfSU5ERVgpOworCisJCURFQlVHKCJzNjI2X2FpX2NtZDogY29udmVydCB0cmlnZ2VyIHRpbWVyIGlzIHNldCB3aXRoIHZhbHVlICVkXG4iLCB0aWNrKTsKKwkJYnJlYWs7CisJY2FzZSBUUklHX0VYVDoKKwkJLy8gc2V0IHRoZSBkaWdpdGFsIGxpbmUgYW5kIGludGVycnVwdCBmb3IgY29udmVydCB0cmlnZ2VyCisJCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfRVhUCisJCQkmJiBjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX0VYVCkKKwkJCXM2MjZfZGlvX3NldF9pcnEoZGV2LCBjbWQtPmNvbnZlcnRfYXJnKTsKKworCQlERUJVRygiczYyNl9haV9jbWQ6IEV4dGVybmFsIGNvbnZlcnQgdHJpZ2dlciBpcyBzZXQhISFcbiIpOworCisJCWJyZWFrOworCX0KKworCXN3aXRjaCAoY21kLT5zdG9wX3NyYykgeworCWNhc2UgVFJJR19DT1VOVDoKKwkJLy8gZGF0YSBhcnJpdmVzIGFzIG9uZSBwYWNrZXQKKwkJZGV2cHJpdi0+YWlfc2FtcGxlX2NvdW50ID0gY21kLT5zdG9wX2FyZzsKKwkJZGV2cHJpdi0+YWlfY29udGlub3VzID0gMDsKKwkJYnJlYWs7CisJY2FzZSBUUklHX05PTkU6CisJCS8vIGNvbnRpbm91cyBhcXVpc2l0aW9uCisJCWRldnByaXYtPmFpX2NvbnRpbm91cyA9IDE7CisJCWRldnByaXYtPmFpX3NhbXBsZV9jb3VudCA9IDA7CisJCWJyZWFrOworCX0KKworCVJlc2V0QURDKGRldiwgcHBsKTsKKworCXN3aXRjaCAoY21kLT5zdGFydF9zcmMpIHsKKwljYXNlIFRSSUdfTk9XOgorCQkvLyBUcmlnZ2VyIEFEQyBzY2FuIGxvb3Agc3RhcnQgYnkgc2V0dGluZyBSUFMgU2lnbmFsIDAuCisJCS8vIE1DX0VOQUJMRSggUF9NQzIsIE1DMl9BRENfUlBTICk7CisKKwkJLy8gU3RhcnQgZXhlY3V0aW5nIHRoZSBSUFMgcHJvZ3JhbS4KKwkJTUNfRU5BQkxFKFBfTUMxLCBNQzFfRVJQUzEpOworCisJCURFQlVHKCJzNjI2X2FpX2NtZDogQURDIHRyaWdnZXJlZFxuIik7CisJCXMtPmFzeW5jLT5pbnR0cmlnID0gTlVMTDsKKwkJYnJlYWs7CisJY2FzZSBUUklHX0VYVDoKKwkJLy9jb25maWd1cmUgRElPIGNoYW5uZWwgZm9yIGFjcXVpc2l0aW9uIHRyaWdnZXIKKwkJczYyNl9kaW9fc2V0X2lycShkZXYsIGNtZC0+c3RhcnRfYXJnKTsKKworCQlERUJVRygiczYyNl9haV9jbWQ6IEV4dGVybmFsIHN0YXJ0IHRyaWdnZXIgaXMgc2V0ISEhXG4iKTsKKworCQlzLT5hc3luYy0+aW50dHJpZyA9IE5VTEw7CisJCWJyZWFrOworCWNhc2UgVFJJR19JTlQ6CisJCXMtPmFzeW5jLT5pbnR0cmlnID0gczYyNl9haV9pbnR0cmlnOworCQlicmVhazsKKwl9CisKKwkvL2VuYWJsZSBpbnRlcnJ1cHQKKwl3cml0ZWwoSVJRX0dQSU8zIHwgSVJRX1JQUzEsIGRldnByaXYtPmJhc2VfYWRkciArIFBfSUVSKTsKKworCURFQlVHKCJzNjI2X2FpX2NtZDogY29tbWFuZCBmdW5jdGlvbiB0ZXJtaW5hdGVkXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHM2MjZfYWlfY21kdGVzdChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfY21kICogY21kKQoreworCWludCBlcnIgPSAwOworCWludCB0bXA7CisKKwkvKiBjbWR0ZXN0IHRlc3RzIGEgcGFydGljdWxhciBjb21tYW5kIHRvIHNlZSBpZiBpdCBpcyB2YWxpZC4gIFVzaW5nCisJICogdGhlIGNtZHRlc3QgaW9jdGwsIGEgdXNlciBjYW4gY3JlYXRlIGEgdmFsaWQgY21kIGFuZCB0aGVuIGhhdmUgaXQKKwkgKiBleGVjdXRlcyBieSB0aGUgY21kIGlvY3RsLgorCSAqCisJICogY21kdGVzdCByZXR1cm5zIDEsMiwzLDQgb3IgMCwgZGVwZW5kaW5nIG9uIHdoaWNoIHRlc3RzIHRoZQorCSAqIGNvbW1hbmQgcGFzc2VzLiAqLworCisJLyogc3RlcCAxOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KKworCXRtcCA9IGNtZC0+c3RhcnRfc3JjOworCWNtZC0+c3RhcnRfc3JjICY9IFRSSUdfTk9XIHwgVFJJR19JTlQgfCBUUklHX0VYVDsKKwlpZiAoIWNtZC0+c3RhcnRfc3JjIHx8IHRtcCAhPSBjbWQtPnN0YXJ0X3NyYykKKwkJZXJyKys7CisKKwl0bXAgPSBjbWQtPnNjYW5fYmVnaW5fc3JjOworCWNtZC0+c2Nhbl9iZWdpbl9zcmMgJj0gVFJJR19USU1FUiB8IFRSSUdfRVhUIHwgVFJJR19GT0xMT1c7CisJaWYgKCFjbWQtPnNjYW5fYmVnaW5fc3JjIHx8IHRtcCAhPSBjbWQtPnNjYW5fYmVnaW5fc3JjKQorCQllcnIrKzsKKworCXRtcCA9IGNtZC0+Y29udmVydF9zcmM7CisJY21kLT5jb252ZXJ0X3NyYyAmPSBUUklHX1RJTUVSIHwgVFJJR19FWFQgfCBUUklHX05PVzsKKwlpZiAoIWNtZC0+Y29udmVydF9zcmMgfHwgdG1wICE9IGNtZC0+Y29udmVydF9zcmMpCisJCWVycisrOworCisJdG1wID0gY21kLT5zY2FuX2VuZF9zcmM7CisJY21kLT5zY2FuX2VuZF9zcmMgJj0gVFJJR19DT1VOVDsKKwlpZiAoIWNtZC0+c2Nhbl9lbmRfc3JjIHx8IHRtcCAhPSBjbWQtPnNjYW5fZW5kX3NyYykKKwkJZXJyKys7CisKKwl0bXAgPSBjbWQtPnN0b3Bfc3JjOworCWNtZC0+c3RvcF9zcmMgJj0gVFJJR19DT1VOVCB8IFRSSUdfTk9ORTsKKwlpZiAoIWNtZC0+c3RvcF9zcmMgfHwgdG1wICE9IGNtZC0+c3RvcF9zcmMpCisJCWVycisrOworCisJaWYgKGVycikKKwkJcmV0dXJuIDE7CisKKwkvKiBzdGVwIDI6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSBhbmQgbXV0dWFsbHkKKwkgICBjb21wYXRpYmxlICovCisKKwkvKiBub3RlIHRoYXQgbXV0dWFsIGNvbXBhdGlibGl0eSBpcyBub3QgYW4gaXNzdWUgaGVyZSAqLworCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfVElNRVIgJiYKKwkJY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX0VYVAorCQkmJiBjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfRk9MTE9XKQorCQllcnIrKzsKKwlpZiAoY21kLT5jb252ZXJ0X3NyYyAhPSBUUklHX1RJTUVSICYmCisJCWNtZC0+Y29udmVydF9zcmMgIT0gVFJJR19FWFQgJiYgY21kLT5jb252ZXJ0X3NyYyAhPSBUUklHX05PVykKKwkJZXJyKys7CisJaWYgKGNtZC0+c3RvcF9zcmMgIT0gVFJJR19DT1VOVCAmJiBjbWQtPnN0b3Bfc3JjICE9IFRSSUdfTk9ORSkKKwkJZXJyKys7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gMjsKKworCS8qIHN0ZXAgMzogbWFrZSBzdXJlIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IGNvbXBhdGlibGUgKi8KKworCWlmIChjbWQtPnN0YXJ0X3NyYyAhPSBUUklHX0VYVCAmJiBjbWQtPnN0YXJ0X2FyZyAhPSAwKSB7CisJCWNtZC0+c3RhcnRfYXJnID0gMDsKKwkJZXJyKys7CisJfQorCisJaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfRVhUICYmIGNtZC0+c3RhcnRfYXJnIDwgMCkgeworCQljbWQtPnN0YXJ0X2FyZyA9IDA7CisJCWVycisrOworCX0KKworCWlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX0VYVCAmJiBjbWQtPnN0YXJ0X2FyZyA+IDM5KSB7CisJCWNtZC0+c3RhcnRfYXJnID0gMzk7CisJCWVycisrOworCX0KKworCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRVhUICYmIGNtZC0+c2Nhbl9iZWdpbl9hcmcgPCAwKSB7CisJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPSAwOworCQllcnIrKzsKKwl9CisKKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0VYVCAmJiBjbWQtPnNjYW5fYmVnaW5fYXJnID4gMzkpIHsKKwkJY21kLT5zY2FuX2JlZ2luX2FyZyA9IDM5OworCQllcnIrKzsKKwl9CisKKwlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX0VYVCAmJiBjbWQtPmNvbnZlcnRfYXJnIDwgMCkgeworCQljbWQtPmNvbnZlcnRfYXJnID0gMDsKKwkJZXJyKys7CisJfQorCisJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19FWFQgJiYgY21kLT5jb252ZXJ0X2FyZyA+IDM5KSB7CisJCWNtZC0+Y29udmVydF9hcmcgPSAzOTsKKwkJZXJyKys7CisJfQorI2RlZmluZSBNQVhfU1BFRUQJMjAwMDAwCS8qIGluIG5hbm9zZWNvbmRzICovCisjZGVmaW5lIE1JTl9TUEVFRAkyMDAwMDAwMDAwCS8qIGluIG5hbm9zZWNvbmRzICovCisKKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCWlmIChjbWQtPnNjYW5fYmVnaW5fYXJnIDwgTUFYX1NQRUVEKSB7CisJCQljbWQtPnNjYW5fYmVnaW5fYXJnID0gTUFYX1NQRUVEOworCQkJZXJyKys7CisJCX0KKwkJaWYgKGNtZC0+c2Nhbl9iZWdpbl9hcmcgPiBNSU5fU1BFRUQpIHsKKwkJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPSBNSU5fU1BFRUQ7CisJCQllcnIrKzsKKwkJfQorCX0gZWxzZSB7CisJCS8qIGV4dGVybmFsIHRyaWdnZXIgKi8KKwkJLyogc2hvdWxkIGJlIGxldmVsL2VkZ2UsIGhpL2xvIHNwZWNpZmljYXRpb24gaGVyZSAqLworCQkvKiBzaG91bGQgc3BlY2lmeSBtdWx0aXBsZSBleHRlcm5hbCB0cmlnZ2VycyAqLworLyogICAgIGlmKGNtZC0+c2Nhbl9iZWdpbl9hcmc+OSl7ICovCisvKiAgICAgICBjbWQtPnNjYW5fYmVnaW5fYXJnPTk7ICovCisvKiAgICAgICBlcnIrKzsgKi8KKy8qICAgICB9ICovCisJfQorCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKKwkJaWYgKGNtZC0+Y29udmVydF9hcmcgPCBNQVhfU1BFRUQpIHsKKwkJCWNtZC0+Y29udmVydF9hcmcgPSBNQVhfU1BFRUQ7CisJCQllcnIrKzsKKwkJfQorCQlpZiAoY21kLT5jb252ZXJ0X2FyZyA+IE1JTl9TUEVFRCkgeworCQkJY21kLT5jb252ZXJ0X2FyZyA9IE1JTl9TUEVFRDsKKwkJCWVycisrOworCQl9CisJfSBlbHNlIHsKKwkJLyogZXh0ZXJuYWwgdHJpZ2dlciAqLworCQkvKiBzZWUgYWJvdmUgKi8KKy8qICAgICBpZihjbWQtPmNvbnZlcnRfYXJnPjkpeyAqLworLyogICAgICAgY21kLT5jb252ZXJ0X2FyZz05OyAqLworLyogICAgICAgZXJyKys7ICovCisvKiAgICAgfSAqLworCX0KKworCWlmIChjbWQtPnNjYW5fZW5kX2FyZyAhPSBjbWQtPmNoYW5saXN0X2xlbikgeworCQljbWQtPnNjYW5fZW5kX2FyZyA9IGNtZC0+Y2hhbmxpc3RfbGVuOworCQllcnIrKzsKKwl9CisJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkgeworCQlpZiAoY21kLT5zdG9wX2FyZyA+IDB4MDBmZmZmZmYpIHsKKwkJCWNtZC0+c3RvcF9hcmcgPSAweDAwZmZmZmZmOworCQkJZXJyKys7CisJCX0KKwl9IGVsc2UgeworCQkvKiBUUklHX05PTkUgKi8KKwkJaWYgKGNtZC0+c3RvcF9hcmcgIT0gMCkgeworCQkJY21kLT5zdG9wX2FyZyA9IDA7CisJCQllcnIrKzsKKwkJfQorCX0KKworCWlmIChlcnIpCisJCXJldHVybiAzOworCisJLyogc3RlcCA0OiBmaXggdXAgYW55IGFyZ3VtZW50cyAqLworCisJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgeworCQl0bXAgPSBjbWQtPnNjYW5fYmVnaW5fYXJnOworCQlzNjI2X25zX3RvX3RpbWVyKChpbnQgKikmY21kLT5zY2FuX2JlZ2luX2FyZywKKwkJCWNtZC0+ZmxhZ3MgJiBUUklHX1JPVU5EX01BU0spOworCQlpZiAodG1wICE9IGNtZC0+c2Nhbl9iZWdpbl9hcmcpCisJCQllcnIrKzsKKwl9CisJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCQl0bXAgPSBjbWQtPmNvbnZlcnRfYXJnOworCQlzNjI2X25zX3RvX3RpbWVyKChpbnQgKikmY21kLT5jb252ZXJ0X2FyZywKKwkJCWNtZC0+ZmxhZ3MgJiBUUklHX1JPVU5EX01BU0spOworCQlpZiAodG1wICE9IGNtZC0+Y29udmVydF9hcmcpCisJCQllcnIrKzsKKwkJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUiAmJgorCQkJY21kLT5zY2FuX2JlZ2luX2FyZyA8CisJCQljbWQtPmNvbnZlcnRfYXJnICogY21kLT5zY2FuX2VuZF9hcmcpIHsKKwkJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPQorCQkJCWNtZC0+Y29udmVydF9hcmcgKiBjbWQtPnNjYW5fZW5kX2FyZzsKKwkJCWVycisrOworCQl9CisJfQorCisJaWYgKGVycikKKwkJcmV0dXJuIDQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzNjI2X2FpX2NhbmNlbChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcykKK3sKKwkvLyBTdG9wIFJQUyBwcm9ncmFtIGluIGNhc2UgaXQgaXMgY3VycmVudGx5IHJ1bm5pbmcuCisJTUNfRElTQUJMRShQX01DMSwgTUMxX0VSUFMxKTsKKworCS8vZGlzYWJsZSBtYXN0ZXIgaW50ZXJydXB0CisJd3JpdGVsKDAsIGRldnByaXYtPmJhc2VfYWRkciArIFBfSUVSKTsKKworCWRldnByaXYtPmFpX2NtZF9ydW5uaW5nID0gMDsKKworCXJldHVybiAwOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgcmVxdWlyZSBhIHBhcnRpY3VsYXIgZm9ybSwgdGhpcyBpcyBqdXN0IHdoYXQKKyAqIGhhcHBlbnMgdG8gYmUgdXNlZCBpbiBzb21lIG9mIHRoZSBkcml2ZXJzLiAgSXQgc2hvdWxkIGNvbnZlcnQgbnMKKyAqIG5hbm9zZWNvbmRzIHRvIGEgY291bnRlciB2YWx1ZSBzdWl0YWJsZSBmb3IgcHJvZ3JhbW1pbmcgdGhlIGRldmljZS4KKyAqIEFsc28sIGl0IHNob3VsZCBhZGp1c3QgbnMgc28gdGhhdCBpdCBjb29yZXNwb25kcyB0byB0aGUgYWN0dWFsIHRpbWUKKyAqIHRoYXQgdGhlIGRldmljZSB3aWxsIHVzZS4gKi8KK3N0YXRpYyBpbnQgczYyNl9uc190b190aW1lcihpbnQgKm5hbm9zZWMsIGludCByb3VuZF9tb2RlKQoreworCWludCBkaXZpZGVyLCBiYXNlOworCisJYmFzZSA9IDUwMDsJCS8vMk1IeiBpbnRlcm5hbCBjbG9jaworCisJc3dpdGNoIChyb3VuZF9tb2RlKSB7CisJY2FzZSBUUklHX1JPVU5EX05FQVJFU1Q6CisJZGVmYXVsdDoKKwkJZGl2aWRlciA9ICgqbmFub3NlYyArIGJhc2UgLyAyKSAvIGJhc2U7CisJCWJyZWFrOworCWNhc2UgVFJJR19ST1VORF9ET1dOOgorCQlkaXZpZGVyID0gKCpuYW5vc2VjKSAvIGJhc2U7CisJCWJyZWFrOworCWNhc2UgVFJJR19ST1VORF9VUDoKKwkJZGl2aWRlciA9ICgqbmFub3NlYyArIGJhc2UgLSAxKSAvIGJhc2U7CisJCWJyZWFrOworCX0KKworCSpuYW5vc2VjID0gYmFzZSAqIGRpdmlkZXI7CisJcmV0dXJuIGRpdmlkZXIgLSAxOworfQorCitzdGF0aWMgaW50IHM2MjZfYW9fd2luc24oY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisKKwlpbnQgaTsKKwl1aW50MTZfdCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJaW50MTZfdCBkYWNkYXRhOworCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgeworCQlkYWNkYXRhID0gKGludDE2X3QpIGRhdGFbaV07CisJCWRldnByaXYtPmFvX3JlYWRiYWNrW0NSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpXSA9IGRhdGFbaV07CisJCWRhY2RhdGEgLT0gKDB4MWZmZik7CisKKwkJU2V0REFDKGRldiwgY2hhbiwgZGFjZGF0YSk7CisJfQorCisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQgczYyNl9hb19yaW5zbihjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKKwkJZGF0YVtpXSA9IGRldnByaXYtPmFvX3JlYWRiYWNrW0NSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpXTsKKwl9CisKKwlyZXR1cm4gaTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8gIERJR0lUQUwgSS9PIEZVTkNUSU9OUyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQWxsIERJTyBmdW5jdGlvbnMgYWRkcmVzcyBhIGdyb3VwIG9mIERJTyBjaGFubmVscyBieSBtZWFucyBvZgorLy8gImdyb3VwIiBhcmd1bWVudC4gIGdyb3VwIG1heSBiZSAwLCAxIG9yIDIsIHdoaWNoIGNvcnJlc3BvbmQgdG8gRElPCisvLyBwb3J0cyBBLCBCIGFuZCBDLCByZXNwZWN0aXZlbHkuCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIHZvaWQgczYyNl9kaW9faW5pdChjb21lZGlfZGV2aWNlICogZGV2KQoreworCXVpbnQxNl90IGdyb3VwOworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisKKwkvLyBQcmVwYXJlIHRvIHRyZWF0IHdyaXRlcyB0byBXUkNhcFNlbCBhcyBjYXB0dXJlIGRpc2FibGVzLgorCURFQkl3cml0ZShkZXYsIExQX01JU0MxLCBNSVNDMV9OT0VEQ0FQKTsKKworCS8vIEZvciBlYWNoIGdyb3VwIG9mIHNpeHRlZW4gY2hhbm5lbHMgLi4uCisJZm9yIChncm91cCA9IDA7IGdyb3VwIDwgUzYyNl9ESU9fQkFOS1M7IGdyb3VwKyspIHsKKwkJcyA9IGRldi0+c3ViZGV2aWNlcyArIDIgKyBncm91cDsKKwkJREVCSXdyaXRlKGRldiwgZGlvcHJpdi0+V1JJbnRTZWwsIDApOwkvLyBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzLgorCQlERUJJd3JpdGUoZGV2LCBkaW9wcml2LT5XUkNhcFNlbCwgMHhGRkZGKTsJLy8gRGlzYWJsZSBhbGwgZXZlbnQKKwkJLy8gY2FwdHVyZXMuCisJCURFQkl3cml0ZShkZXYsIGRpb3ByaXYtPldSRWRnU2VsLCAwKTsJLy8gSW5pdCBhbGwgRElPcyB0bworCQkvLyBkZWZhdWx0IGVkZ2UKKwkJLy8gcG9sYXJpdHkuCisJCURFQkl3cml0ZShkZXYsIGRpb3ByaXYtPldSRE91dCwgMCk7CS8vIFByb2dyYW0gYWxsIG91dHB1dHMKKwkJLy8gdG8gaW5hY3RpdmUgc3RhdGUuCisJfQorCURFQlVHKCJzNjI2X2Rpb19pbml0OiBESU8gaW5pdGlhbGl6ZWQgXG4iKTsKK30KKworLyogRElPIGRldmljZXMgYXJlIHNsaWdodGx5IHNwZWNpYWwuICBBbHRob3VnaCBpdCBpcyBwb3NzaWJsZSB0bworICogaW1wbGVtZW50IHRoZSBpbnNuX3JlYWQvaW5zbl93cml0ZSBpbnRlcmZhY2UsIGl0IGlzIG11Y2ggbW9yZQorICogdXNlZnVsIHRvIGFwcGxpY2F0aW9ucyBpZiB5b3UgaW1wbGVtZW50IHRoZSBpbnNuX2JpdHMgaW50ZXJmYWNlLgorICogVGhpcyBhbGxvd3MgcGFja2VkIHJlYWRpbmcvd3JpdGluZyBvZiB0aGUgRElPIGNoYW5uZWxzLiAgVGhlIGNvbWVkaQorICogY29yZSBjYW4gY29udmVydCBiZXR3ZWVuIGluc25fYml0cyBhbmQgaW5zbl9yZWFkL3dyaXRlICovCisKK3N0YXRpYyBpbnQgczYyNl9kaW9faW5zbl9iaXRzKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworCisJLyogTGVuZ3RoIG9mIGRhdGEgbXVzdCBiZSAyIChtYXNrIGFuZCBuZXcgZGF0YSwgc2VlIGJlbG93KSAqLworCWlmIChpbnNuLT5uID09IDApIHsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChpbnNuLT5uICE9IDIpIHsKKwkJcHJpbnRrKCJjb21lZGklZDogczYyNjogczYyNl9kaW9faW5zbl9iaXRzKCk6IEludmFsaWQgaW5zdHJ1Y3Rpb24gbGVuZ3RoXG4iLCBkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBUaGUgaW5zbiBkYXRhIGNvbnNpc3RzIG9mIGEgbWFzayBpbiBkYXRhWzBdIGFuZCB0aGUgbmV3IGRhdGEgaW4KKwkgKiBkYXRhWzFdLiBUaGUgbWFzayBkZWZpbmVzIHdoaWNoIGJpdHMgd2UgYXJlIGNvbmNlcm5pbmcgYWJvdXQuCisJICogVGhlIG5ldyBkYXRhIG11c3QgYmUgYW5kZWQgd2l0aCB0aGUgbWFzay4gIEVhY2ggY2hhbm5lbAorCSAqIGNvcnJlc3BvbmRzIHRvIGEgYml0LgorCSAqLworCWlmIChkYXRhWzBdKSB7CisJCS8qIENoZWNrIGlmIHJlcXVlc3RlZCBwb3J0cyBhcmUgY29uZmlndXJlZCBmb3Igb3V0cHV0ICovCisJCWlmICgocy0+aW9fYml0cyAmIGRhdGFbMF0pICE9IGRhdGFbMF0pCisJCQlyZXR1cm4gLUVJTzsKKworCQlzLT5zdGF0ZSAmPSB+ZGF0YVswXTsKKwkJcy0+c3RhdGUgfD0gZGF0YVswXSAmIGRhdGFbMV07CisKKwkJLyogV3JpdGUgb3V0IHRoZSBuZXcgZGlnaXRhbCBvdXRwdXQgbGluZXMgKi8KKworCQlERUJJd3JpdGUoZGV2LCBkaW9wcml2LT5XUkRPdXQsIHMtPnN0YXRlKTsKKwl9CisJZGF0YVsxXSA9IERFQklyZWFkKGRldiwgZGlvcHJpdi0+UkRESW4pOworCisJcmV0dXJuIDI7Cit9CisKK3N0YXRpYyBpbnQgczYyNl9kaW9faW5zbl9jb25maWcoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisKKwlzd2l0Y2ggKGRhdGFbMF0pIHsKKwljYXNlIElOU05fQ09ORklHX0RJT19RVUVSWToKKwkJZGF0YVsxXSA9CisJCQkocy0+aW9fYml0cyAmICgxIDw8IENSX0NIQU4oaW5zbi0+CisJCQkJCWNoYW5zcGVjKSkpID8gQ09NRURJX09VVFBVVCA6CisJCQlDT01FRElfSU5QVVQ7CisJCXJldHVybiBpbnNuLT5uOworCQlicmVhazsKKwljYXNlIENPTUVESV9JTlBVVDoKKwkJcy0+aW9fYml0cyAmPSB+KDEgPDwgQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYykpOworCQlicmVhazsKKwljYXNlIENPTUVESV9PVVRQVVQ6CisJCXMtPmlvX2JpdHMgfD0gMSA8PCBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlERUJJd3JpdGUoZGV2LCBkaW9wcml2LT5XUkRPdXQsIHMtPmlvX2JpdHMpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgczYyNl9kaW9fc2V0X2lycShjb21lZGlfZGV2aWNlICogZGV2LCB1bnNpZ25lZCBpbnQgY2hhbikKK3sKKwl1bnNpZ25lZCBpbnQgZ3JvdXA7CisJdW5zaWduZWQgaW50IGJpdG1hc2s7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCS8vc2VsZWN0IGRpbyBiYW5rCisJZ3JvdXAgPSBjaGFuIC8gMTY7CisJYml0bWFzayA9IDEgPDwgKGNoYW4gLSAoMTYgKiBncm91cCkpOworCURFQlVHKCJzNjI2X2Rpb19zZXRfaXJxOiBlbmFibGUgaW50ZXJydXB0IG9uIGRpbyBjaGFubmVsICVkIGdyb3VwICVkXG4iLAorCQljaGFuIC0gKDE2ICogZ3JvdXApLCBncm91cCk7CisKKwkvL3NldCBjaGFubmVsIHRvIGNhcHR1cmUgcG9zaXRpdmUgZWRnZQorCXN0YXR1cyA9IERFQklyZWFkKGRldiwKKwkJKChkaW9fcHJpdmF0ZSAqKSAoZGV2LT5zdWJkZXZpY2VzICsgMiArCisJCQkJZ3JvdXApLT5wcml2YXRlKS0+UkRFZGdTZWwpOworCURFQkl3cml0ZShkZXYsCisJCSgoZGlvX3ByaXZhdGUgKikgKGRldi0+c3ViZGV2aWNlcyArIDIgKworCQkJCWdyb3VwKS0+cHJpdmF0ZSktPldSRWRnU2VsLCBiaXRtYXNrIHwgc3RhdHVzKTsKKworCS8vZW5hYmxlIGludGVycnVwdCBvbiBzZWxlY3RlZCBjaGFubmVsCisJc3RhdHVzID0gREVCSXJlYWQoZGV2LAorCQkoKGRpb19wcml2YXRlICopIChkZXYtPnN1YmRldmljZXMgKyAyICsKKwkJCQlncm91cCktPnByaXZhdGUpLT5SREludFNlbCk7CisJREVCSXdyaXRlKGRldiwKKwkJKChkaW9fcHJpdmF0ZSAqKSAoZGV2LT5zdWJkZXZpY2VzICsgMiArCisJCQkJZ3JvdXApLT5wcml2YXRlKS0+V1JJbnRTZWwsIGJpdG1hc2sgfCBzdGF0dXMpOworCisJLy9lbmFibGUgZWRnZSBjYXB0dXJlIHdyaXRlIGNvbW1hbmQKKwlERUJJd3JpdGUoZGV2LCBMUF9NSVNDMSwgTUlTQzFfRURDQVApOworCisJLy9lbmFibGUgZWRnZSBjYXB0dXJlIG9uIHNlbGVjdGVkIGNoYW5uZWwKKwlzdGF0dXMgPSBERUJJcmVhZChkZXYsCisJCSgoZGlvX3ByaXZhdGUgKikgKGRldi0+c3ViZGV2aWNlcyArIDIgKworCQkJCWdyb3VwKS0+cHJpdmF0ZSktPlJEQ2FwU2VsKTsKKwlERUJJd3JpdGUoZGV2LAorCQkoKGRpb19wcml2YXRlICopIChkZXYtPnN1YmRldmljZXMgKyAyICsKKwkJCQlncm91cCktPnByaXZhdGUpLT5XUkNhcFNlbCwgYml0bWFzayB8IHN0YXR1cyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzNjI2X2Rpb19yZXNldF9pcnEoY29tZWRpX2RldmljZSAqIGRldiwgdW5zaWduZWQgaW50IGdyb3VwLAorCXVuc2lnbmVkIGludCBtYXNrKQoreworCURFQlVHKCJzNjI2X2Rpb19yZXNldF9pcnE6IGRpc2FibGUgIGludGVycnVwdCBvbiBkaW8gY2hhbm5lbCAlZCBncm91cCAlZFxuIiwgbWFzaywgZ3JvdXApOworCisJLy9kaXNhYmxlIGVkZ2UgY2FwdHVyZSB3cml0ZSBjb21tYW5kCisJREVCSXdyaXRlKGRldiwgTFBfTUlTQzEsIE1JU0MxX05PRURDQVApOworCisJLy9lbmFibGUgZWRnZSBjYXB0dXJlIG9uIHNlbGVjdGVkIGNoYW5uZWwKKwlERUJJd3JpdGUoZGV2LAorCQkoKGRpb19wcml2YXRlICopIChkZXYtPnN1YmRldmljZXMgKyAyICsKKwkJCQlncm91cCktPnByaXZhdGUpLT5XUkNhcFNlbCwgbWFzayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzNjI2X2Rpb19jbGVhcl9pcnEoY29tZWRpX2RldmljZSAqIGRldikKK3sKKwl1bnNpZ25lZCBpbnQgZ3JvdXA7CisKKwkvL2Rpc2FibGUgZWRnZSBjYXB0dXJlIHdyaXRlIGNvbW1hbmQKKwlERUJJd3JpdGUoZGV2LCBMUF9NSVNDMSwgTUlTQzFfTk9FRENBUCk7CisKKwlmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBTNjI2X0RJT19CQU5LUzsgZ3JvdXArKykgeworCQkvL2NsZWFyIHBlbmRpbmcgZXZlbnRzIGFuZCBpbnRlcnJ1cHQKKwkJREVCSXdyaXRlKGRldiwKKwkJCSgoZGlvX3ByaXZhdGUgKikgKGRldi0+c3ViZGV2aWNlcyArIDIgKworCQkJCQlncm91cCktPnByaXZhdGUpLT5XUkNhcFNlbCwgMHhmZmZmKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogTm93IHRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIHZhbHVlIG9mIHRoZSBjb3VudGVyIChkYXRhWzBdKQorICAgYW5kIHNldCB0aGUgc3ViZGV2aWNlLiBUbyBjb21wbGV0ZSB3aXRoIHRyaWdnZXIgYW5kIGludGVycnVwdAorICAgY29uZmlndXJhdGlvbiAqLworc3RhdGljIGludCBzNjI2X2VuY19pbnNuX2NvbmZpZyhjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcywKKwljb21lZGlfaW5zbiAqIGluc24sIGxzYW1wbF90ICogZGF0YSkKK3sKKwl1aW50MTZfdCBTZXR1cCA9IChMT0FEU1JDX0lORFggPDwgQkZfTE9BRFNSQykgfAkvLyBQcmVsb2FkIHVwb24KKwkJLy8gaW5kZXguCisJCShJTkRYU1JDX1NPRlQgPDwgQkZfSU5EWFNSQykgfAkvLyBEaXNhYmxlIGhhcmR3YXJlIGluZGV4LgorCQkoQ0xLU1JDX0NPVU5URVIgPDwgQkZfQ0xLU1JDKSB8CS8vIE9wZXJhdGluZyBtb2RlIGlzIENvdW50ZXIuCisJCShDTEtQT0xfUE9TIDw8IEJGX0NMS1BPTCkgfAkvLyBBY3RpdmUgaGlnaCBjbG9jay4KKwkJLy8oIENOVERJUl9VUCA8PCBCRl9DTEtQT0wgKSB8ICAgICAgLy8gQ291bnQgZGlyZWN0aW9uIGlzIERvd24uCisJCShDTEtNVUxUXzFYIDw8IEJGX0NMS01VTFQpIHwJLy8gQ2xvY2sgbXVsdGlwbGllciBpcyAxeC4KKwkJKENMS0VOQUJfSU5ERVggPDwgQkZfQ0xLRU5BQik7CisJLyogICB1aW50MTZfdCBEaXNhYmxlSW50U3JjPVRSVUU7ICovCisJLy8gdWludDMyX3QgUHJlbG9hZHZhbHVlOyAgICAgICAgICAgICAgLy9Db3VudGVyIGluaXRpYWwgdmFsdWUKKwl1aW50MTZfdCB2YWx1ZVNyY2xhdGNoID0gTEFUQ0hTUkNfQUJfUkVBRDsKKwl1aW50MTZfdCBlbmFiID0gQ0xLRU5BQl9BTFdBWVM7CisJZW5jX3ByaXZhdGUgKmsgPSAmZW5jcHJpdltDUl9DSEFOKGluc24tPmNoYW5zcGVjKV07CisKKwlERUJVRygiczYyNl9lbmNfaW5zbl9jb25maWc6IGVuY29kZXIgY29uZmlnXG4iKTsKKworCS8vICAoZGF0YT09TlVMTCkgPyAoUHJlbG9hZHZhbHVlPTApIDogKFByZWxvYWR2YWx1ZT1kYXRhWzBdKTsKKworCWstPlNldE1vZGUoZGV2LCBrLCBTZXR1cCwgVFJVRSk7CisJUHJlbG9hZChkZXYsIGssICooaW5zbi0+ZGF0YSkpOworCWstPlB1bHNlSW5kZXgoZGV2LCBrKTsKKwlTZXRMYXRjaFNvdXJjZShkZXYsIGssIHZhbHVlU3JjbGF0Y2gpOworCWstPlNldEVuYWJsZShkZXYsIGssICh1aW50MTZfdCkgKGVuYWIgIT0gMCkpOworCisJcmV0dXJuIGluc24tPm47Cit9CisKK3N0YXRpYyBpbnQgczYyNl9lbmNfaW5zbl9yZWFkKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzLAorCWNvbWVkaV9pbnNuICogaW5zbiwgbHNhbXBsX3QgKiBkYXRhKQoreworCisJaW50IG47CisJZW5jX3ByaXZhdGUgKmsgPSAmZW5jcHJpdltDUl9DSEFOKGluc24tPmNoYW5zcGVjKV07CisKKwlERUJVRygiczYyNl9lbmNfaW5zbl9yZWFkOiBlbmNvZGVyIHJlYWQgY2hhbm5lbCAlZCBcbiIsCisJCUNSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpKTsKKworCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspCisJCWRhdGFbbl0gPSBSZWFkTGF0Y2goZGV2LCBrKTsKKworCURFQlVHKCJzNjI2X2VuY19pbnNuX3JlYWQ6IGVuY29kZXIgc2FtcGxlICVkXG4iLCBkYXRhW25dKTsKKworCXJldHVybiBuOworfQorCitzdGF0aWMgaW50IHM2MjZfZW5jX2luc25fd3JpdGUoY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX3N1YmRldmljZSAqIHMsCisJY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisKKwllbmNfcHJpdmF0ZSAqayA9ICZlbmNwcml2W0NSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpXTsKKworCURFQlVHKCJzNjI2X2VuY19pbnNuX3dyaXRlOiBlbmNvZGVyIHdyaXRlIGNoYW5uZWwgJWQgXG4iLAorCQlDUl9DSEFOKGluc24tPmNoYW5zcGVjKSk7CisKKwkvLyBTZXQgdGhlIHByZWxvYWQgcmVnaXN0ZXIKKwlQcmVsb2FkKGRldiwgaywgZGF0YVswXSk7CisKKwkvLyBTb2Z0d2FyZSBpbmRleCBwdWxzZSBmb3JjZXMgdGhlIHByZWxvYWQgcmVnaXN0ZXIgdG8gbG9hZAorCS8vIGludG8gdGhlIGNvdW50ZXIKKwlrLT5TZXRMb2FkVHJpZyhkZXYsIGssIDApOworCWstPlB1bHNlSW5kZXgoZGV2LCBrKTsKKwlrLT5TZXRMb2FkVHJpZyhkZXYsIGssIDIpOworCisJREVCVUcoInM2MjZfZW5jX2luc25fd3JpdGU6IEVuZCBlbmNvZGVyIHdyaXRlXG4iKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBzNjI2X3RpbWVyX2xvYWQoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrLCBpbnQgdGljaykKK3sKKwl1aW50MTZfdCBTZXR1cCA9IChMT0FEU1JDX0lORFggPDwgQkZfTE9BRFNSQykgfAkvLyBQcmVsb2FkIHVwb24KKwkJLy8gaW5kZXguCisJCShJTkRYU1JDX1NPRlQgPDwgQkZfSU5EWFNSQykgfAkvLyBEaXNhYmxlIGhhcmR3YXJlIGluZGV4LgorCQkoQ0xLU1JDX1RJTUVSIDw8IEJGX0NMS1NSQykgfAkvLyBPcGVyYXRpbmcgbW9kZSBpcyBUaW1lci4KKwkJKENMS1BPTF9QT1MgPDwgQkZfQ0xLUE9MKSB8CS8vIEFjdGl2ZSBoaWdoIGNsb2NrLgorCQkoQ05URElSX0RPV04gPDwgQkZfQ0xLUE9MKSB8CS8vIENvdW50IGRpcmVjdGlvbiBpcyBEb3duLgorCQkoQ0xLTVVMVF8xWCA8PCBCRl9DTEtNVUxUKSB8CS8vIENsb2NrIG11bHRpcGxpZXIgaXMgMXguCisJCShDTEtFTkFCX0lOREVYIDw8IEJGX0NMS0VOQUIpOworCXVpbnQxNl90IHZhbHVlU3JjbGF0Y2ggPSBMQVRDSFNSQ19BX0lORFhBOworCS8vICB1aW50MTZfdCBlbmFiPUNMS0VOQUJfQUxXQVlTOworCisJay0+U2V0TW9kZShkZXYsIGssIFNldHVwLCBGQUxTRSk7CisKKwkvLyBTZXQgdGhlIHByZWxvYWQgcmVnaXN0ZXIKKwlQcmVsb2FkKGRldiwgaywgdGljayk7CisKKwkvLyBTb2Z0d2FyZSBpbmRleCBwdWxzZSBmb3JjZXMgdGhlIHByZWxvYWQgcmVnaXN0ZXIgdG8gbG9hZAorCS8vIGludG8gdGhlIGNvdW50ZXIKKwlrLT5TZXRMb2FkVHJpZyhkZXYsIGssIDApOworCWstPlB1bHNlSW5kZXgoZGV2LCBrKTsKKworCS8vc2V0IHJlbG9hZCBvbiBjb3VudGVyIG92ZXJmbG93CisJay0+U2V0TG9hZFRyaWcoZGV2LCBrLCAxKTsKKworCS8vc2V0IGludGVycnVwdCBvbiBvdmVyZmxvdworCWstPlNldEludFNyYyhkZXYsIGssIElOVFNSQ19PVkVSKTsKKworCVNldExhdGNoU291cmNlKGRldiwgaywgdmFsdWVTcmNsYXRjaCk7CisJLy8gIGstPlNldEVuYWJsZShkZXYsaywodWludDE2X3QpKGVuYWIgIT0gMCkpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vICBEQUMgRlVOQ1RJT05TIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gU2xvdCAwIGJhc2Ugc2V0dGluZ3MuCisjZGVmaW5lIFZFQ1QwCSggWFNEMiB8IFJTRDMgfCBTSUJfQTIgKQkvLyBTbG90IDAgYWx3YXlzIHNoaWZ0cyBpbgorCQkJCQkgLy8gMHhGRiBhbmQgc3RvcmUgaXQgdG8KKwkJCQkJIC8vIEZCX0JVRkZFUjIuCisKKy8vIFRyaW1EYWMgTG9naWNhbENoYW4tdG8tUGh5c2ljYWxDaGFuIG1hcHBpbmcgdGFibGUuCitzdGF0aWMgdWludDhfdCB0cmltY2hhbltdID0geyAxMCwgOSwgOCwgMywgMiwgNywgNiwgMSwgMCwgNSwgNCB9OworCisvLyBUcmltRGFjIExvZ2ljYWxDaGFuLXRvLUVlcHJvbUFkcnMgbWFwcGluZyB0YWJsZS4KK3N0YXRpYyB1aW50OF90IHRyaW1hZHJzW10gPQorCXsgMHg0MCwgMHg0MSwgMHg0MiwgMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg2MCwgMHg2MSwgMHg2MiwgMHg2MyB9OworCitzdGF0aWMgdm9pZCBMb2FkVHJpbURBQ3MoY29tZWRpX2RldmljZSAqIGRldikKK3sKKwlyZWdpc3RlciB1aW50OF90IGk7CisKKwkvLyBDb3B5IFRyaW1EYWMgc2V0cG9pbnQgdmFsdWVzIGZyb20gRUVQUk9NIHRvIFRyaW1EYWNzLgorCWZvciAoaSA9IDA7IGkgPCAoc2l6ZW9mKHRyaW1jaGFuKSAvIHNpemVvZih0cmltY2hhblswXSkpOyBpKyspCisJCVdyaXRlVHJpbURBQyhkZXYsIGksIEkyQ3JlYWQoZGV2LCB0cmltYWRyc1tpXSkpOworfQorCitzdGF0aWMgdm9pZCBXcml0ZVRyaW1EQUMoY29tZWRpX2RldmljZSAqIGRldiwgdWludDhfdCBMb2dpY2FsQ2hhbiwKKwl1aW50OF90IERhY0RhdGEpCit7CisJdWludDMyX3QgY2hhbjsKKworCS8vIFNhdmUgdGhlIG5ldyBzZXRwb2ludCBpbiBjYXNlIHRoZSBhcHBsaWNhdGlvbiBuZWVkcyB0byByZWFkIGl0IGJhY2sgbGF0ZXIuCisJZGV2cHJpdi0+VHJpbVNldHBvaW50W0xvZ2ljYWxDaGFuXSA9ICh1aW50OF90KSBEYWNEYXRhOworCisJLy8gTWFwIGxvZ2ljYWwgY2hhbm5lbCBudW1iZXIgdG8gcGh5c2ljYWwgY2hhbm5lbCBudW1iZXIuCisJY2hhbiA9ICh1aW50MzJfdCkgdHJpbWNoYW5bTG9naWNhbENoYW5dOworCisJLy8gU2V0IHVwIFRTTDIgcmVjb3JkcyBmb3IgVHJpbURhYyB3cml0ZSBvcGVyYXRpb24uICBBbGwgc2xvdHMgc2hpZnQKKwkvLyAweEZGIGluIGZyb20gcHVsbGVkLXVwIFNEMyBzbyB0aGF0IHRoZSBlbmQgb2YgdGhlIHNsb3Qgc2VxdWVuY2UKKwkvLyBjYW4gYmUgZGV0ZWN0ZWQuCisJU0VUVkVDVCgyLCBYU0QyIHwgWEZJRk9fMSB8IFdTMyk7CS8vIFNsb3QgMjogU2VuZCBoaWdoIHVpbnQ4X3QKKwkvLyB0byB0YXJnZXQgVHJpbURhYy4KKwlTRVRWRUNUKDMsIFhTRDIgfCBYRklGT18wIHwgV1MzKTsJLy8gU2xvdCAzOiBTZW5kIGxvdyB1aW50OF90IHRvCisJLy8gdGFyZ2V0IFRyaW1EYWMuCisJU0VUVkVDVCg0LCBYU0QyIHwgWEZJRk9fMyB8IFdTMSk7CS8vIFNsb3QgNDogU2VuZCBOT1AgaGlnaAorCS8vIHVpbnQ4X3QgdG8gREFDMCB0byBrZWVwCisJLy8gY2xvY2sgcnVubmluZy4KKwlTRVRWRUNUKDUsIFhTRDIgfCBYRklGT18yIHwgV1MxIHwgRU9TKTsJLy8gU2xvdCA1OiBTZW5kIE5PUCBsb3cKKwkvLyB1aW50OF90IHRvIERBQzAuCisKKwkvLyBDb25zdHJ1Y3QgYW5kIHRyYW5zbWl0IHRhcmdldCBEQUMncyBzZXJpYWwgcGFja2V0OiAoIDAwMDAgQUFBQQorCS8vICksKCBEREREIEREREQgKSwoIDB4MDAgKSwoIDB4MDAgKSB3aGVyZSBBPDM6MD4gaXMgdGhlIERBQworCS8vIGNoYW5uZWwncyBhZGRyZXNzLCBhbmQgRDw3OjA+IGlzIHRoZSBEQUMgc2V0cG9pbnQuICBBcHBlbmQgYSBXT1JECisJLy8gdmFsdWUgKHRoYXQgd3JpdGVzIGEgY2hhbm5lbCAwIE5PUCBjb21tYW5kIHRvIGEgbm9uLWV4aXN0ZW50IG1haW4KKwkvLyBEQUMgY2hhbm5lbCkgdGhhdCBzZXJ2ZXMgdG8ga2VlcCB0aGUgY2xvY2sgcnVubmluZyBhZnRlciB0aGUKKwkvLyBwYWNrZXQgaGFzIGJlZW4gc2VudCB0byB0aGUgdGFyZ2V0IERBQy4KKworCVNlbmREQUMoZGV2LCAoKHVpbnQzMl90KSBjaGFuIDw8IDgpCS8vIEFkZHJlc3MgdGhlIERBQyBjaGFubmVsCisJCS8vIHdpdGhpbiB0aGUgdHJpbWRhYyBkZXZpY2UuCisJCXwgKHVpbnQzMl90KSBEYWNEYXRhKTsJLy8gSW5jbHVkZSBEQUMgc2V0cG9pbnQgZGF0YS4KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLyAgRUVQUk9NIEFDQ0VTUyBGVU5DVElPTlMgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBSZWFkIHVpbnQ4X3QgZnJvbSBFRVBST00uCisKK3N0YXRpYyB1aW50OF90IEkyQ3JlYWQoY29tZWRpX2RldmljZSAqIGRldiwgdWludDhfdCBhZGRyKQoreworCXVpbnQ4X3QgcnRudmFsOworCisJLy8gU2VuZCBFRVBST00gdGFyZ2V0IGFkZHJlc3MuCisJaWYgKEkyQ2hhbmRzaGFrZShkZXYsIEkyQ19CMihJMkNfQVRUUlNUQVJULCBJMkNXKQkvLyBCeXRlMiA9IEkyQworCQkJLy8gY29tbWFuZDoKKwkJCS8vIHdyaXRlIHRvCisJCQkvLyBJMkMgRUVQUk9NCisJCQkvLyBkZXZpY2UuCisJCQl8IEkyQ19CMShJMkNfQVRUUlNUT1AsIGFkZHIpCS8vIEJ5dGUxID0gRUVQUk9NCisJCQkvLyBpbnRlcm5hbCB0YXJnZXQKKwkJCS8vIGFkZHJlc3MuCisJCQl8IEkyQ19CMChJMkNfQVRUUk5PUCwgMCkpKQkvLyBCeXRlMCA9IE5vdAorCQkvLyBzZW50LgorCXsKKwkJLy8gQWJvcnQgZnVuY3Rpb24gYW5kIGRlY2xhcmUgZXJyb3IgaWYgaGFuZHNoYWtlIGZhaWxlZC4KKwkJREVCVUcoIkkyQ3JlYWQ6IGVycm9yIGhhbmRzaGFrZSBJMkNyZWFkICBhXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCS8vIEV4ZWN1dGUgRUVQUk9NIHJlYWQuCisJaWYgKEkyQ2hhbmRzaGFrZShkZXYsIEkyQ19CMihJMkNfQVRUUlNUQVJULCBJMkNSKQkvLyBCeXRlMiA9IEkyQworCQkJLy8gY29tbWFuZDogcmVhZAorCQkJLy8gZnJvbSBJMkMgRUVQUk9NCisJCQkvLyBkZXZpY2UuCisJCQl8IEkyQ19CMShJMkNfQVRUUlNUT1AsIDApCS8vIEJ5dGUxIHJlY2VpdmVzCisJCQkvLyB1aW50OF90IGZyb20KKwkJCS8vIEVFUFJPTS4KKwkJCXwgSTJDX0IwKEkyQ19BVFRSTk9QLCAwKSkpCS8vIEJ5dGUwID0gTm90CisJCS8vIHNlbnQuCisJeworCQkvLyBBYm9ydCBmdW5jdGlvbiBhbmQgZGVjbGFyZSBlcnJvciBpZiBoYW5kc2hha2UgZmFpbGVkLgorCQlERUJVRygiSTJDcmVhZDogZXJyb3IgaGFuZHNoYWtlIEkyQ3JlYWQgYlxuIik7CisJCXJldHVybiAwOworCX0KKwkvLyBSZXR1cm4gY29weSBvZiBFRVBST00gdmFsdWUuCisJcnRudmFsID0gKHVpbnQ4X3QpIChSUjcxNDYoUF9JMkNDVFJMKSA+PiAxNik7CisJcmV0dXJuIHJ0bnZhbDsKK30KKworc3RhdGljIHVpbnQzMl90IEkyQ2hhbmRzaGFrZShjb21lZGlfZGV2aWNlICogZGV2LCB1aW50MzJfdCB2YWwpCit7CisJLy8gV3JpdGUgSTJDIGNvbW1hbmQgdG8gSTJDIFRyYW5zZmVyIENvbnRyb2wgc2hhZG93IHJlZ2lzdGVyLgorCVdSNzE0NihQX0kyQ0NUUkwsIHZhbCk7CisKKwkvLyBVcGxvYWQgSTJDIHNoYWRvdyByZWdpc3RlcnMgaW50byB3b3JraW5nIHJlZ2lzdGVycyBhbmQgd2FpdCBmb3IKKwkvLyB1cGxvYWQgY29uZmlybWF0aW9uLgorCisJTUNfRU5BQkxFKFBfTUMyLCBNQzJfVVBMRF9JSUMpOworCXdoaWxlICghTUNfVEVTVChQX01DMiwgTUMyX1VQTERfSUlDKSkgOworCisJLy8gV2FpdCB1bnRpbCBJMkMgYnVzIHRyYW5zZmVyIGlzIGZpbmlzaGVkIG9yIGFuIGVycm9yIG9jY3Vycy4KKwl3aGlsZSAoKFJSNzE0NihQX0kyQ0NUUkwpICYgKEkyQ19CVVNZIHwgSTJDX0VSUikpID09IEkyQ19CVVNZKSA7CisKKwkvLyBSZXR1cm4gbm9uLXplcm8gaWYgSTJDIGVycm9yIG9jY3VyZWQuCisJcmV0dXJuIFJSNzE0NihQX0kyQ0NUUkwpICYgSTJDX0VSUjsKKworfQorCisvLyBQcml2YXRlIGhlbHBlciBmdW5jdGlvbjogV3JpdGUgc2V0cG9pbnQgdG8gYW4gYXBwbGljYXRpb24gREFDIGNoYW5uZWwuCisKK3N0YXRpYyB2b2lkIFNldERBQyhjb21lZGlfZGV2aWNlICogZGV2LCB1aW50MTZfdCBjaGFuLCBzaG9ydCBkYWNkYXRhKQoreworCXJlZ2lzdGVyIHVpbnQxNl90IHNpZ25tYXNrOworCXJlZ2lzdGVyIHVpbnQzMl90IFdTSW1hZ2U7CisKKwkvLyBBZGp1c3QgREFDIGRhdGEgcG9sYXJpdHkgYW5kIHNldCB1cCBQb2xhcml0eSBDb250cm9sIFJlZ2lzdGVyCisJLy8gaW1hZ2UuCisJc2lnbm1hc2sgPSAxIDw8IGNoYW47CisJaWYgKGRhY2RhdGEgPCAwKSB7CisJCWRhY2RhdGEgPSAtZGFjZGF0YTsKKwkJZGV2cHJpdi0+RGFjcG9sIHw9IHNpZ25tYXNrOworCX0gZWxzZQorCQlkZXZwcml2LT5EYWNwb2wgJj0gfnNpZ25tYXNrOworCisJLy8gTGltaXQgREFDIHNldHBvaW50IHZhbHVlIHRvIHZhbGlkIHJhbmdlLgorCWlmICgodWludDE2X3QpIGRhY2RhdGEgPiAweDFGRkYpCisJCWRhY2RhdGEgPSAweDFGRkY7CisKKwkvLyBTZXQgdXAgVFNMMiByZWNvcmRzIChha2EgInZlY3RvcnMiKSBmb3IgREFDIHVwZGF0ZS4gIFZlY3RvcnMgVjIKKwkvLyBhbmQgVjMgdHJhbnNtaXQgdGhlIHNldHBvaW50IHRvIHRoZSB0YXJnZXQgREFDLiAgVjQgYW5kIFY1IHNlbmQKKwkvLyBkYXRhIHRvIGEgbm9uLWV4aXN0ZW50IFRyaW1EYWMgY2hhbm5lbCBqdXN0IHRvIGtlZXAgdGhlIGNsb2NrCisJLy8gcnVubmluZyBhZnRlciBzZW5kaW5nIGRhdGEgdG8gdGhlIHRhcmdldCBEQUMuICBUaGlzIGlzIG5lY2Vzc2FyeQorCS8vIHRvIGVsaW1pbmF0ZSB0aGUgY2xvY2sgZ2xpdGNoIHRoYXQgd291bGQgb3RoZXJ3aXNlIG9jY3VyIGF0IHRoZQorCS8vIGVuZCBvZiB0aGUgdGFyZ2V0IERBQydzIHNlcmlhbCBkYXRhIHN0cmVhbS4gIFdoZW4gdGhlIHNlcXVlbmNlCisJLy8gcmVzdGFydHMgYXQgVjAgKGFmdGVyIGV4ZWN1dGluZyBWNSksIHRoZSBnYXRlIGFycmF5IGF1dG9tYXRpY2FsbHkKKwkvLyBkaXNhYmxlcyBnYXRpbmcgZm9yIHRoZSBEQUMgY2xvY2sgYW5kIGFsbCBEQUMgY2hpcCBzZWxlY3RzLgorCVdTSW1hZ2UgPSAoY2hhbiAmIDIpID8gV1MxIDogV1MyOwkvLyBDaG9vc2UgREFDIGNoaXAgc2VsZWN0IHRvCisJLy8gYmUgYXNzZXJ0ZWQuCisJU0VUVkVDVCgyLCBYU0QyIHwgWEZJRk9fMSB8IFdTSW1hZ2UpOwkvLyBTbG90IDI6IFRyYW5zbWl0IGhpZ2gKKwkvLyBkYXRhIGJ5dGUgdG8gdGFyZ2V0IERBQy4KKwlTRVRWRUNUKDMsIFhTRDIgfCBYRklGT18wIHwgV1NJbWFnZSk7CS8vIFNsb3QgMzogVHJhbnNtaXQgbG93IGRhdGEKKwkvLyBieXRlIHRvIHRhcmdldCBEQUMuCisJU0VUVkVDVCg0LCBYU0QyIHwgWEZJRk9fMyB8IFdTMyk7CS8vIFNsb3QgNDogVHJhbnNtaXQgdG8KKwkvLyBub24tZXhpc3RlbnQgVHJpbURhYworCS8vIGNoYW5uZWwgdG8ga2VlcCBjbG9jaworCVNFVFZFQ1QoNSwgWFNEMiB8IFhGSUZPXzIgfCBXUzMgfCBFT1MpOwkvLyBTbG90IDU6IHJ1bm5pbmcgYWZ0ZXIKKwkvLyB3cml0aW5nIHRhcmdldCBEQUMncworCS8vIGxvdyBkYXRhIGJ5dGUuCisKKwkvLyBDb25zdHJ1Y3QgYW5kIHRyYW5zbWl0IHRhcmdldCBEQUMncyBzZXJpYWwgcGFja2V0OiAoIEExMEQgRERERAorCS8vICksKCBEREREIEREREQgKSwoIDB4MEYgKSwoIDB4MDAgKSB3aGVyZSBBIGlzIGNoYW48MD4sIGFuZCBEPDEyOjA+CisJLy8gaXMgdGhlIERBQyBzZXRwb2ludC4gIEFwcGVuZCBhIFdPUkQgdmFsdWUgKHRoYXQgd3JpdGVzIHRvIGEKKwkvLyBub24tZXhpc3RlbnQgVHJpbURhYyBjaGFubmVsKSB0aGF0IHNlcnZlcyB0byBrZWVwIHRoZSBjbG9jaworCS8vIHJ1bm5pbmcgYWZ0ZXIgdGhlIHBhY2tldCBoYXMgYmVlbiBzZW50IHRvIHRoZSB0YXJnZXQgREFDLgorCVNlbmREQUMoZGV2LCAweDBGMDAwMDAwCS8vQ29udGludWUgY2xvY2sgYWZ0ZXIgdGFyZ2V0IERBQworCQkvL2RhdGEgKHdyaXRlIHRvIG5vbi1leGlzdGVudAorCQkvL3RyaW1kYWMpLgorCQl8IDB4MDAwMDQwMDAJLy8gQWRkcmVzcyB0aGUgdHdvIG1haW4gZHVhbC1EQUMKKwkJLy8gZGV2aWNlcyAoVFNMJ3MgY2hpcCBzZWxlY3QgZW5hYmxlcworCQkvLyB0YXJnZXQgZGV2aWNlKS4KKwkJfCAoKHVpbnQzMl90KSAoY2hhbiAmIDEpIDw8IDE1KQkvLyBBZGRyZXNzIHRoZSBEQUMKKwkJLy8gY2hhbm5lbCB3aXRoaW4gdGhlCisJCS8vIGRldmljZS4KKwkJfCAodWludDMyX3QpIGRhY2RhdGEpOwkvLyBJbmNsdWRlIERBQyBzZXRwb2ludCBkYXRhLgorCit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBQcml2YXRlIGhlbHBlciBmdW5jdGlvbjogVHJhbnNtaXQgc2VyaWFsIGRhdGEgdG8gREFDIHZpYSBBdWRpbworLy8gY2hhbm5lbCAyLiAgQXNzdW1lczogKDEpIFRTTDIgc2xvdCByZWNvcmRzIGluaXRpYWxpemVkLCBhbmQgKDIpCisvLyBEYWNwb2wgY29udGFpbnMgdmFsaWQgdGFyZ2V0IGltYWdlLgorCitzdGF0aWMgdm9pZCBTZW5kREFDKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVpbnQzMl90IHZhbCkKK3sKKworCS8vIFNUQVJUIFRIRSBTRVJJQUwgQ0xPQ0sgUlVOTklORyAtLS0tLS0tLS0tLS0tCisKKwkvLyBBc3NlcnQgREFDIHBvbGFyaXR5IGNvbnRyb2wgYW5kIGVuYWJsZSBnYXRpbmcgb2YgREFDIHNlcmlhbCBjbG9jaworCS8vIGFuZCBhdWRpbyBiaXQgc3RyZWFtIHNpZ25hbHMuICBBdCB0aGlzIHBvaW50IGluIHRpbWUgd2UgbXVzdCBiZQorCS8vIGFzc3VyZWQgb2YgYmVpbmcgaW4gdGltZSBzbG90IDAuICBJZiB3ZSBhcmUgbm90IGluIHNsb3QgMCwgdGhlCisJLy8gc2VyaWFsIGNsb2NrIGFuZCBhdWRpbyBzdHJlYW0gc2lnbmFscyB3aWxsIGJlIGRpc2FibGVkOyB0aGlzIGlzCisJLy8gYmVjYXVzZSB0aGUgZm9sbG93aW5nIERFQkl3cml0ZSBzdGF0ZW1lbnQgKHdoaWNoIGVuYWJsZXMgc2lnbmFscworCS8vIHRvIGJlIHBhc3NlZCB0aHJvdWdoIHRoZSBnYXRlIGFycmF5KSB3b3VsZCBleGVjdXRlIGJlZm9yZSB0aGUKKwkvLyB0cmFpbGluZyBlZGdlIG9mIFdTMS9XUzMgKHdoaWNoIHR1cm5zIG9mZiB0aGUgc2lnbmFscyksIHRodXMKKwkvLyBjYXVzaW5nIHRoZSBzaWduYWxzIHRvIGJlIGluYWN0aXZlIGR1cmluZyB0aGUgREFDIHdyaXRlLgorCURFQkl3cml0ZShkZXYsIExQX0RBQ1BPTCwgZGV2cHJpdi0+RGFjcG9sKTsKKworCS8vIFRSQU5TRkVSIE9VVFBVVCBEV09SRCBWQUxVRSBJTlRPIEEyJ1MgT1VUUFVUIEZJRk8gLS0tLS0tLS0tLS0tLS0tLQorCisJLy8gQ29weSBEQUMgc2V0cG9pbnQgdmFsdWUgdG8gREFDJ3Mgb3V0cHV0IERNQSBidWZmZXIuCisKKwkvL1dSNzE0NiggKHVpbnQzMl90KWRldnByaXYtPnBEYWNXQnVmLCB2YWwgKTsKKwkqZGV2cHJpdi0+cERhY1dCdWYgPSB2YWw7CisKKwkvLyBlbmFiIHRoZSBvdXRwdXQgRE1BIHRyYW5zZmVyLiAgVGhpcyB3aWxsIGNhdXNlIHRoZSBETUFDIHRvIGNvcHkKKwkvLyB0aGUgREFDJ3MgZGF0YSB2YWx1ZSB0byBBMidzIG91dHB1dCBGSUZPLiAgVGhlIERNQSB0cmFuc2ZlciB3aWxsCisJLy8gdGhlbiBpbW1lZGlhdGVseSB0ZXJtaW5hdGUgYmVjYXVzZSB0aGUgcHJvdGVjdGlvbiBhZGRyZXNzIGlzCisJLy8gcmVhY2hlZCB1cG9uIHRyYW5zZmVyIG9mIHRoZSBmaXJzdCBEV09SRCB2YWx1ZS4KKwlNQ19FTkFCTEUoUF9NQzEsIE1DMV9BMk9VVCk7CisKKwkvLyBXaGlsZSB0aGUgRE1BIHRyYW5zZmVyIGlzIGV4ZWN1dGluZyAuLi4KKworCS8vIFJlc2V0IEF1ZGlvMiBvdXRwdXQgRklGTydzIHVuZGVyZmxvdyBmbGFnIChhbG9uZyB3aXRoIGFueSBvdGhlcgorCS8vIEZJRk8gdW5kZXJmbG93L292ZXJmbG93IGZsYWdzKS4gIFdoZW4gc2V0LCB0aGlzIGZsYWcgd2lsbAorCS8vIGluZGljYXRlIHRoYXQgd2UgaGF2ZSBlbWVyZ2VkIGZyb20gc2xvdCAwLgorCVdSNzE0NihQX0lTUiwgSVNSX0FGT1UpOworCisJLy8gV2FpdCBmb3IgdGhlIERNQSB0cmFuc2ZlciB0byBmaW5pc2ggc28gdGhhdCB0aGVyZSB3aWxsIGJlIGRhdGEKKwkvLyBhdmFpbGFibGUgaW4gdGhlIEZJRk8gd2hlbiB0aW1lIHNsb3QgMSB0cmllcyB0byB0cmFuc2ZlciBhIERXT1JECisJLy8gZnJvbSB0aGUgRklGTyB0byB0aGUgb3V0cHV0IGJ1ZmZlciByZWdpc3Rlci4gIFdlIHRlc3QgZm9yIERNQQorCS8vIERvbmUgYnkgcG9sbGluZyB0aGUgRE1BQyBlbmFibGUgZmxhZzsgdGhpcyBmbGFnIGlzIGF1dG9tYXRpY2FsbHkKKwkvLyBjbGVhcmVkIHdoZW4gdGhlIHRyYW5zZmVyIGhhcyBmaW5pc2hlZC4KKwl3aGlsZSAoKFJSNzE0NihQX01DMSkgJiBNQzFfQTJPVVQpICE9IDApIDsKKworCS8vIFNUQVJUIFRIRSBPVVRQVVQgU1RSRUFNIFRPIFRIRSBUQVJHRVQgREFDIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkvLyBGSUZPIGRhdGEgaXMgbm93IGF2YWlsYWJsZSwgc28gd2UgZW5hYmxlIGV4ZWN1dGlvbiBvZiB0aW1lIHNsb3RzCisJLy8gMSBhbmQgaGlnaGVyIGJ5IGNsZWFyaW5nIHRoZSBFT1MgZmxhZyBpbiBzbG90IDAuICBOb3RlIHRoYXQgU0QzCisJLy8gd2lsbCBiZSBzaGlmdGVkIGluIGFuZCBzdG9yZWQgaW4gRkJfQlVGRkVSMiBmb3IgZW5kLW9mLXNsb3QtbGlzdAorCS8vIGRldGVjdGlvbi4KKwlTRVRWRUNUKDAsIFhTRDIgfCBSU0QzIHwgU0lCX0EyKTsKKworCS8vIFdhaXQgZm9yIHNsb3QgMSB0byBleGVjdXRlIHRvIGVuc3VyZSB0aGF0IHRoZSBQYWNrZXQgd2lsbCBiZQorCS8vIHRyYW5zbWl0dGVkLiAgVGhpcyBpcyBkZXRlY3RlZCBieSBwb2xsaW5nIHRoZSBBdWRpbzIgb3V0cHV0IEZJRk8KKwkvLyB1bmRlcmZsb3cgZmxhZywgd2hpY2ggd2lsbCBiZSBzZXQgd2hlbiBzbG90IDEgZXhlY3V0aW9uIGhhcworCS8vIGZpbmlzaGVkIHRyYW5zZmVycmluZyB0aGUgREFDJ3MgZGF0YSBEV09SRCBmcm9tIHRoZSBvdXRwdXQgRklGTworCS8vIHRvIHRoZSBvdXRwdXQgYnVmZmVyIHJlZ2lzdGVyLgorCXdoaWxlICgoUlI3MTQ2KFBfU1NSKSAmIFNTUl9BRjJfT1VUKSA9PSAwKSA7CisKKwkvLyBTZXQgdXAgdG8gdHJhcCBleGVjdXRpb24gYXQgc2xvdCAwIHdoZW4gdGhlIFRTTCBzZXF1ZW5jZXIgY3ljbGVzCisJLy8gYmFjayB0byBzbG90IDAgYWZ0ZXIgZXhlY3V0aW5nIHRoZSBFT1MgaW4gc2xvdCA1LiAgQWxzbywKKwkvLyBzaW11bHRhbmVvdXNseSBzaGlmdCBvdXQgYW5kIGluIHRoZSAweDAwIHRoYXQgaXMgQUxXQVlTIHRoZSB2YWx1ZQorCS8vIHN0b3JlZCBpbiB0aGUgbGFzdCBieXRlIHRvIGJlIHNoaWZ0ZWQgb3V0IG9mIHRoZSBGSUZPJ3MgRFdPUkQKKwkvLyBidWZmZXIgcmVnaXN0ZXIuCisJU0VUVkVDVCgwLCBYU0QyIHwgWEZJRk9fMiB8IFJTRDIgfCBTSUJfQTIgfCBFT1MpOworCisJLy8gV0FJVCBGT1IgVEhFIFRSQU5TQUNUSU9OIFRPIEZJTklTSCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJLy8gV2FpdCBmb3IgdGhlIFRTTCB0byBmaW5pc2ggZXhlY3V0aW5nIGFsbCB0aW1lIHNsb3RzIGJlZm9yZQorCS8vIGV4aXRpbmcgdGhpcyBmdW5jdGlvbi4gIFdlIG11c3QgZG8gdGhpcyBzbyB0aGF0IHRoZSBuZXh0IERBQworCS8vIHdyaXRlIGRvZXNuJ3Qgc3RhcnQsIHRoZXJlYnkgZW5hYmxpbmcgY2xvY2svY2hpcCBzZWxlY3Qgc2lnbmFsczoKKwkvLyAxLiBCZWZvcmUgdGhlIFRTTCBzZXF1ZW5jZSBjeWNsZXMgYmFjayB0byBzbG90IDAsIHdoaWNoIGRpc2FibGVzCisJLy8gdGhlIGNsb2NrL2NzIHNpZ25hbCBnYXRpbmcgYW5kIHRyYXBzIHNsb3QgLy8gbGlzdCBleGVjdXRpb24uICBJZgorCS8vIHdlIGhhdmUgbm90IHlldCBmaW5pc2hlZCBzbG90IDUgdGhlbiB0aGUgY2xvY2svY3Mgc2lnbmFscyBhcmUKKwkvLyBzdGlsbCBnYXRlZCBhbmQgd2UgaGF2ZSAvLyBub3QgZmluaXNoZWQgdHJhbnNtaXR0aW5nIHRoZSBzdHJlYW0uCisJLy8gMi4gV2hpbGUgc2xvdHMgMi01IGFyZSBleGVjdXRpbmcgZHVlIHRvIGEgbGF0ZSBzbG90IDAgdHJhcC4gIEluCisJLy8gdGhpcyBjYXNlLCB0aGUgc2xvdCBzZXF1ZW5jZSBpcyBjdXJyZW50bHkgLy8gcmVwZWF0aW5nLCBidXQgd2l0aAorCS8vIGNsb2NrL2NzIHNpZ25hbHMgZGlzYWJsZWQuICBXZSBtdXN0IHdhaXQgZm9yIHNsb3QgMCB0byB0cmFwCisJLy8gZXhlY3V0aW9uIGJlZm9yZSBzZXR0aW5nIC8vIHVwIHRoZSBuZXh0IERBQyBzZXRwb2ludCBETUEgdHJhbnNmZXIKKwkvLyBhbmQgZW5hYmxpbmcgdGhlIGNsb2NrL2NzIHNpZ25hbHMuICBUbyBkZXRlY3QgdGhlIGVuZCBvZiBzbG90IDUsCisJLy8gd2UgdGVzdCBmb3IgdGhlIEZCX0JVRkZFUjIgTVNCIGNvbnRlbnRzIHRvIGJlIGVxdWFsIHRvIDB4RkYuICBJZgorCS8vIHRoZSBUU0wgaGFzIG5vdCB5ZXQgZmluaXNoZWQgZXhlY3V0aW5nIHNsb3QgNSAuLi4KKwlpZiAoKFJSNzE0NihQX0ZCX0JVRkZFUjIpICYgMHhGRjAwMDAwMCkgIT0gMCkgeworCQkvLyBUaGUgdHJhcCB3YXMgc2V0IG9uIHRpbWUgYW5kIHdlIGFyZSBzdGlsbCBleGVjdXRpbmcgc29tZXdoZXJlCisJCS8vIGluIHNsb3RzIDItNSwgc28gd2Ugbm93IHdhaXQgZm9yIHNsb3QgMCB0byBleGVjdXRlIGFuZCB0cmFwCisJCS8vIFRTTCBleGVjdXRpb24uICBUaGlzIGlzIGRldGVjdGVkIHdoZW4gRkJfQlVGRkVSMiBNU0IgY2hhbmdlcworCQkvLyBmcm9tIDB4RkYgdG8gMHgwMCwgd2hpY2ggc2xvdCAwIGNhdXNlcyB0byBoYXBwZW4gYnkgc2hpZnRpbmcKKwkJLy8gb3V0L2luIG9uIFNEMiB0aGUgMHgwMCB0aGF0IGlzIGFsd2F5cyByZWZlcmVuY2VkIGJ5IHNsb3QgNS4KKwkJd2hpbGUgKChSUjcxNDYoUF9GQl9CVUZGRVIyKSAmIDB4RkYwMDAwMDApICE9IDApIDsKKwl9CisJLy8gRWl0aGVyICgxKSB3ZSB3ZXJlIHRvbyBsYXRlIHNldHRpbmcgdGhlIHNsb3QgMCB0cmFwOyB0aGUgVFNMCisJLy8gc2VxdWVuY2VyIHJlc3RhcnRlZCBzbG90IDAgYmVmb3JlIHdlIGNvdWxkIHNldCB0aGUgRU9TIHRyYXAgZmxhZywKKwkvLyBvciAoMikgd2Ugd2VyZSBub3QgbGF0ZSBhbmQgZXhlY3V0aW9uIGlzIG5vdyB0cmFwcGVkIGF0IHNsb3QgMC4KKwkvLyBJbiBlaXRoZXIgY2FzZSwgd2UgbXVzdCBub3cgY2hhbmdlIHNsb3QgMCBzbyB0aGF0IGl0IHdpbGwgc3RvcmUKKwkvLyB2YWx1ZSAweEZGIChpbnN0ZWFkIG9mIDB4MDApIHRvIEZCX0JVRkZFUjIgbmV4dCB0aW1lIGl0IGV4ZWN1dGVzLgorCS8vIEluIG9yZGVyIHRvIGRvIHRoaXMsIHdlIHJlcHJvZ3JhbSBzbG90IDAgc28gdGhhdCBpdCB3aWxsIHNoaWZ0IGluCisJLy8gU0QzLCB3aGljaCBpcyBkcml2ZW4gb25seSBieSBhIHB1bGwtdXAgcmVzaXN0b3IuCisJU0VUVkVDVCgwLCBSU0QzIHwgU0lCX0EyIHwgRU9TKTsKKworCS8vIFdhaXQgZm9yIHNsb3QgMCB0byBleGVjdXRlLCBhdCB3aGljaCB0aW1lIHRoZSBUU0wgaXMgc2V0dXAgZm9yCisJLy8gdGhlIG5leHQgREFDIHdyaXRlLiAgVGhpcyBpcyBkZXRlY3RlZCB3aGVuIEZCX0JVRkZFUjIgTVNCIGNoYW5nZXMKKwkvLyBmcm9tIDB4MDAgdG8gMHhGRi4KKwl3aGlsZSAoKFJSNzE0NihQX0ZCX0JVRkZFUjIpICYgMHhGRjAwMDAwMCkgPT0gMCkgOworfQorCitzdGF0aWMgdm9pZCBXcml0ZU1JU0MyKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVpbnQxNl90IE5ld0ltYWdlKQoreworCURFQkl3cml0ZShkZXYsIExQX01JU0MxLCBNSVNDMV9XRU5BQkxFKTsJLy8gZW5hYiB3cml0ZXMgdG8KKwkvLyBNSVNDMiByZWdpc3Rlci4KKwlERUJJd3JpdGUoZGV2LCBMUF9XUk1JU0MyLCBOZXdJbWFnZSk7CS8vIFdyaXRlIG5ldyBpbWFnZSB0byBNSVNDMi4KKwlERUJJd3JpdGUoZGV2LCBMUF9NSVNDMSwgTUlTQzFfV0RJU0FCTEUpOwkvLyBEaXNhYmxlIHdyaXRlcyB0byBNSVNDMi4KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBJbml0aWFsaXplIHRoZSBERUJJIGludGVyZmFjZSBmb3IgYWxsIHRyYW5zZmVycy4KKworc3RhdGljIHVpbnQxNl90IERFQklyZWFkKGNvbWVkaV9kZXZpY2UgKiBkZXYsIHVpbnQxNl90IGFkZHIpCit7CisJdWludDE2X3QgcmV0dmFsOworCisJLy8gU2V0IHVwIERFQkkgY29udHJvbCByZWdpc3RlciB2YWx1ZSBpbiBzaGFkb3cgUkFNLgorCVdSNzE0NihQX0RFQklDTUQsIERFQklfQ01EX1JEV09SRCB8IGFkZHIpOworCisJLy8gRXhlY3V0ZSB0aGUgREVCSSB0cmFuc2Zlci4KKwlERUJJdHJhbnNmZXIoZGV2KTsKKworCS8vIEZldGNoIHRhcmdldCByZWdpc3RlciB2YWx1ZS4KKwlyZXR2YWwgPSAodWludDE2X3QpIFJSNzE0NihQX0RFQklBRCk7CisKKwkvLyBSZXR1cm4gcmVnaXN0ZXIgdmFsdWUuCisJcmV0dXJuIHJldHZhbDsKK30KKworLy8gRXhlY3V0ZSBhIERFQkkgdHJhbnNmZXIuICBUaGlzIG11c3QgYmUgY2FsbGVkIGZyb20gd2l0aGluIGEKKy8vIGNyaXRpY2FsIHNlY3Rpb24uCitzdGF0aWMgdm9pZCBERUJJdHJhbnNmZXIoY29tZWRpX2RldmljZSAqIGRldikKK3sKKwkvLyBJbml0aWF0ZSB1cGxvYWQgb2Ygc2hhZG93IFJBTSB0byBERUJJIGNvbnRyb2wgcmVnaXN0ZXIuCisJTUNfRU5BQkxFKFBfTUMyLCBNQzJfVVBMRF9ERUJJKTsKKworCS8vIFdhaXQgZm9yIGNvbXBsZXRpb24gb2YgdXBsb2FkIGZyb20gc2hhZG93IFJBTSB0byBERUJJIGNvbnRyb2wKKwkvLyByZWdpc3Rlci4KKwl3aGlsZSAoIU1DX1RFU1QoUF9NQzIsIE1DMl9VUExEX0RFQkkpKSA7CisKKwkvLyBXYWl0IHVudGlsIERFQkkgdHJhbnNmZXIgaXMgZG9uZS4KKwl3aGlsZSAoUlI3MTQ2KFBfUFNSKSAmIFBTUl9ERUJJX1MpIDsKK30KKworLy8gV3JpdGUgYSB2YWx1ZSB0byBhIGdhdGUgYXJyYXkgcmVnaXN0ZXIuCitzdGF0aWMgdm9pZCBERUJJd3JpdGUoY29tZWRpX2RldmljZSAqIGRldiwgdWludDE2X3QgYWRkciwgdWludDE2X3Qgd2RhdGEpCit7CisKKwkvLyBTZXQgdXAgREVCSSBjb250cm9sIHJlZ2lzdGVyIHZhbHVlIGluIHNoYWRvdyBSQU0uCisJV1I3MTQ2KFBfREVCSUNNRCwgREVCSV9DTURfV1JXT1JEIHwgYWRkcik7CisJV1I3MTQ2KFBfREVCSUFELCB3ZGF0YSk7CisKKwkvLyBFeGVjdXRlIHRoZSBERUJJIHRyYW5zZmVyLgorCURFQkl0cmFuc2ZlcihkZXYpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUmVwbGFjZSB0aGUgc3BlY2lmaWVkIGJpdHMgaW4gYSBnYXRlIGFycmF5IHJlZ2lzdGVyLiAgSW1wb3J0czogbWFzaworLy8gc3BlY2lmaWVzIGJpdHMgdGhhdCBhcmUgdG8gYmUgcHJlc2VydmVkLCB3ZGF0YSBpcyBuZXcgdmFsdWUgdG8gYmUKKy8vIG9yJ2Qgd2l0aCB0aGUgbWFza2VkIG9yaWdpbmFsLgorc3RhdGljIHZvaWQgREVCSXJlcGxhY2UoY29tZWRpX2RldmljZSAqIGRldiwgdWludDE2X3QgYWRkciwgdWludDE2X3QgbWFzaywKKwl1aW50MTZfdCB3ZGF0YSkKK3sKKworCS8vIENvcHkgdGFyZ2V0IGdhdGUgYXJyYXkgcmVnaXN0ZXIgaW50byBQX0RFQklBRCByZWdpc3Rlci4KKwlXUjcxNDYoUF9ERUJJQ01ELCBERUJJX0NNRF9SRFdPUkQgfCBhZGRyKTsJLy8gU2V0IHVwIERFQkkgY29udHJvbAorCS8vIHJlZyB2YWx1ZSBpbiBzaGFkb3cKKwkvLyBSQU0uCisJREVCSXRyYW5zZmVyKGRldik7CS8vIEV4ZWN1dGUgdGhlIERFQkkKKwkvLyBSZWFkIHRyYW5zZmVyLgorCisJLy8gV3JpdGUgYmFjayB0aGUgbW9kaWZpZWQgaW1hZ2UuCisJV1I3MTQ2KFBfREVCSUNNRCwgREVCSV9DTURfV1JXT1JEIHwgYWRkcik7CS8vIFNldCB1cCBERUJJIGNvbnRyb2wKKwkvLyByZWcgdmFsdWUgaW4gc2hhZG93CisJLy8gUkFNLgorCisJV1I3MTQ2KFBfREVCSUFELCB3ZGF0YSB8ICgodWludDE2X3QpIFJSNzE0NihQX0RFQklBRCkgJiBtYXNrKSk7CS8vIE1vZGlmeSB0aGUgcmVnaXN0ZXIgaW1hZ2UuCisJREVCSXRyYW5zZmVyKGRldik7CS8vIEV4ZWN1dGUgdGhlIERFQkkgV3JpdGUgdHJhbnNmZXIuCit9CisKK3N0YXRpYyB2b2lkIENsb3NlRE1BQihjb21lZGlfZGV2aWNlICogZGV2LCBETUFCVUYgKiBwZG1hLCBzaXplX3QgYnNpemUpCit7CisJdm9pZCAqdmJwdHI7CisJZG1hX2FkZHJfdCB2cHB0cjsKKworCURFQlVHKCJDbG9zZURNQUI6IEVudGVyaW5nIFM2MjZEUlZfQ2xvc2VETUFCKCk6XG4iKTsKKwlpZiAocGRtYSA9PSBOVUxMKQorCQlyZXR1cm47CisJLy9maW5kIHRoZSBtYXRjaGluZyBhbGxvY2F0aW9uIGZyb20gdGhlIGJvYXJkIHN0cnVjdAorCisJdmJwdHIgPSBwZG1hLT5Mb2dpY2FsQmFzZTsKKwl2cHB0ciA9IHBkbWEtPlBoeXNpY2FsQmFzZTsKKwlpZiAodmJwdHIpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChkZXZwcml2LT5wZGV2LCBic2l6ZSwgdmJwdHIsIHZwcHRyKTsKKwkJcGRtYS0+TG9naWNhbEJhc2UgPSAwOworCQlwZG1hLT5QaHlzaWNhbEJhc2UgPSAwOworCisJCURFQlVHKCJDbG9zZURNQUIoKTogTG9naWNhbD0lcCwgYnNpemU9JWQsIFBoeXNpY2FsPTB4JXhcbiIsCisJCQl2YnB0ciwgYnNpemUsICh1aW50MzJfdCkgdnBwdHIpOworCX0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLyAgQ09VTlRFUiBGVU5DVElPTlMgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQWxsIGNvdW50ZXIgZnVuY3Rpb25zIGFkZHJlc3MgYSBzcGVjaWZpYyBjb3VudGVyIGJ5IG1lYW5zIG9mIHRoZQorLy8gIkNvdW50ZXIiIGFyZ3VtZW50LCB3aGljaCBpcyBhIGxvZ2ljYWwgY291bnRlciBudW1iZXIuICBUaGUgQ291bnRlcgorLy8gYXJndW1lbnQgbWF5IGhhdmUgYW55IG9mIHRoZSBmb2xsb3dpbmcgbGVnYWwgdmFsdWVzOiAwPTBBLCAxPTFBLAorLy8gMj0yQSwgMz0wQiwgND0xQiwgNT0yQi4KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9ucyBmb3IgZnVuY3Rpb25zIHRoYXQgYXJlIGNvbW1vbiB0byBib3RoIEEgYW5kIEIKKy8vIGNvdW50ZXJzOgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vIFBSSVZBVEUgQ09VTlRFUiBGVU5DVElPTlMgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBSZWFkIGEgY291bnRlcidzIG91dHB1dCBsYXRjaC4KKworc3RhdGljIHVpbnQzMl90IFJlYWRMYXRjaChjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGspCit7CisJcmVnaXN0ZXIgdWludDMyX3QgdmFsdWU7CisJLy9ERUJVRyBGSVhNRSBERUJVRygiUmVhZExhdGNoOiBSZWFkIExhdGNoIGVudGVyXG4iKTsKKworCS8vIExhdGNoIGNvdW50cyBhbmQgZmV0Y2ggTFNXIG9mIGxhdGNoZWQgY291bnRzIHZhbHVlLgorCXZhbHVlID0gKHVpbnQzMl90KSBERUJJcmVhZChkZXYsIGstPk15TGF0Y2hMc3cpOworCisJLy8gRmV0Y2ggTVNXIG9mIGxhdGNoZWQgY291bnRzIGFuZCBjb21iaW5lIHdpdGggTFNXLgorCXZhbHVlIHw9ICgodWludDMyX3QpIERFQklyZWFkKGRldiwgay0+TXlMYXRjaExzdyArIDIpIDw8IDE2KTsKKworCS8vIERFQlVHIEZJWE1FIERFQlVHKCJSZWFkTGF0Y2g6IFJlYWQgTGF0Y2ggZXhpdFxuIik7CisKKwkvLyBSZXR1cm4gbGF0Y2hlZCBjb3VudHMuCisJcmV0dXJuIHZhbHVlOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBSZXNldCBhIGNvdW50ZXIncyBpbmRleCBhbmQgb3ZlcmZsb3cgZXZlbnQgY2FwdHVyZSBmbGFncy4KKworc3RhdGljIHZvaWQgUmVzZXRDYXBGbGFnc19BKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaykKK3sKKwlERUJJcmVwbGFjZShkZXYsIGstPk15Q1JCLCAodWludDE2X3QpICh+Q1JCTVNLX0lOVENUUkwpLAorCQlDUkJNU0tfSU5UUkVTRVRDTUQgfCBDUkJNU0tfSU5UUkVTRVRfQSk7Cit9CisKK3N0YXRpYyB2b2lkIFJlc2V0Q2FwRmxhZ3NfQihjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGspCit7CisJREVCSXJlcGxhY2UoZGV2LCBrLT5NeUNSQiwgKHVpbnQxNl90KSAofkNSQk1TS19JTlRDVFJMKSwKKwkJQ1JCTVNLX0lOVFJFU0VUQ01EIHwgQ1JCTVNLX0lOVFJFU0VUX0IpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBSZXR1cm4gY291bnRlciBzZXR1cCBpbiBhIGZvcm1hdCAoQ09VTlRFUl9TRVRVUCkgdGhhdCBpcyBjb25zaXN0ZW50CisvLyBmb3IgYm90aCBBIGFuZCBCIGNvdW50ZXJzLgorCitzdGF0aWMgdWludDE2X3QgR2V0TW9kZV9BKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaykKK3sKKwlyZWdpc3RlciB1aW50MTZfdCBjcmE7CisJcmVnaXN0ZXIgdWludDE2X3QgY3JiOworCXJlZ2lzdGVyIHVpbnQxNl90IHNldHVwOworCisJLy8gRmV0Y2ggQ1JBIGFuZCBDUkIgcmVnaXN0ZXIgaW1hZ2VzLgorCWNyYSA9IERFQklyZWFkKGRldiwgay0+TXlDUkEpOworCWNyYiA9IERFQklyZWFkKGRldiwgay0+TXlDUkIpOworCisJLy8gUG9wdWxhdGUgdGhlIHN0YW5kYXJkaXplZCBjb3VudGVyIHNldHVwIGJpdCBmaWVsZHMuICBOb3RlOgorCS8vIEluZGV4U3JjIGlzIHJlc3RyaWN0ZWQgdG8gRU5DX1ggb3IgSW5keFBvbC4KKwlzZXR1cCA9ICgoY3JhICYgU1RETVNLX0xPQURTUkMpCS8vIExvYWRTcmMgID0gTG9hZFNyY0EuCisJCXwgKChjcmIgPDwgKFNUREJJVF9MQVRDSFNSQyAtIENSQkJJVF9MQVRDSFNSQykpICYgU1RETVNLX0xBVENIU1JDKQkvLyBMYXRjaFNyYyA9IExhdGNoU3JjQS4KKwkJfCAoKGNyYSA8PCAoU1REQklUX0lOVFNSQyAtIENSQUJJVF9JTlRTUkNfQSkpICYgU1RETVNLX0lOVFNSQykJLy8gSW50U3JjICAgPSBJbnRTcmNBLgorCQl8ICgoY3JhIDw8IChTVERCSVRfSU5EWFNSQyAtIChDUkFCSVRfSU5EWFNSQ19BICsgMSkpKSAmIFNURE1TS19JTkRYU1JDKQkvLyBJbmR4U3JjICA9IEluZHhTcmNBPDE+LgorCQl8ICgoY3JhID4+IChDUkFCSVRfSU5EWFBPTF9BIC0gU1REQklUX0lORFhQT0wpKSAmIFNURE1TS19JTkRYUE9MKQkvLyBJbmR4UG9sICA9IEluZHhQb2xBLgorCQl8ICgoY3JiID4+IChDUkJCSVRfQ0xLRU5BQl9BIC0gU1REQklUX0NMS0VOQUIpKSAmIFNURE1TS19DTEtFTkFCKSk7CS8vIENsa0VuYWIgID0gQ2xrRW5hYkEuCisKKwkvLyBBZGp1c3QgbW9kZS1kZXBlbmRlbnQgcGFyYW1ldGVycy4KKwlpZiAoY3JhICYgKDIgPDwgQ1JBQklUX0NMS1NSQ19BKSkJLy8gSWYgVGltZXIgbW9kZSAoQ2xrU3JjQTwxPiA9PSAxKToKKwkJc2V0dXAgfD0gKChDTEtTUkNfVElNRVIgPDwgU1REQklUX0NMS1NSQykJLy8gICBJbmRpY2F0ZSBUaW1lciBtb2RlLgorCQkJfCAoKGNyYSA8PCAoU1REQklUX0NMS1BPTCAtIENSQUJJVF9DTEtTUkNfQSkpICYgU1RETVNLX0NMS1BPTCkJLy8gICBTZXQgQ2xrUG9sIHRvIGluZGljYXRlIGNvdW50IGRpcmVjdGlvbiAoQ2xrU3JjQTwwPikuCisJCQl8IChNVUxUX1gxIDw8IFNUREJJVF9DTEtNVUxUKSk7CS8vICAgQ2xrTXVsdCBtdXN0IGJlIDF4IGluIFRpbWVyIG1vZGUuCisKKwllbHNlCQkJLy8gSWYgQ291bnRlciBtb2RlIChDbGtTcmNBPDE+ID09IDApOgorCQlzZXR1cCB8PSAoKENMS1NSQ19DT1VOVEVSIDw8IFNUREJJVF9DTEtTUkMpCS8vICAgSW5kaWNhdGUgQ291bnRlciBtb2RlLgorCQkJfCAoKGNyYSA+PiAoQ1JBQklUX0NMS1BPTF9BIC0gU1REQklUX0NMS1BPTCkpICYgU1RETVNLX0NMS1BPTCkJLy8gICBQYXNzIHRocm91Z2ggQ2xrUG9sLgorCQkJfCAoKChjcmEgJiBDUkFNU0tfQ0xLTVVMVF9BKSA9PSAoTVVMVF9YMCA8PCBDUkFCSVRfQ0xLTVVMVF9BKSkgPwkvLyAgIEZvcmNlIENsa011bHQgdG8gMXggaWYgbm90IGxlZ2FsLCBlbHNlIHBhc3MgdGhyb3VnaC4KKwkJCQkoTVVMVF9YMSA8PCBTVERCSVRfQ0xLTVVMVCkgOgorCQkJCSgoY3JhID4+IChDUkFCSVRfQ0xLTVVMVF9BIC0KKwkJCQkJCQlTVERCSVRfQ0xLTVVMVCkpICYKKwkJCQkJU1RETVNLX0NMS01VTFQpKSk7CisKKwkvLyBSZXR1cm4gYWRqdXN0ZWQgY291bnRlciBzZXR1cC4KKwlyZXR1cm4gc2V0dXA7Cit9CisKK3N0YXRpYyB1aW50MTZfdCBHZXRNb2RlX0IoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrKQoreworCXJlZ2lzdGVyIHVpbnQxNl90IGNyYTsKKwlyZWdpc3RlciB1aW50MTZfdCBjcmI7CisJcmVnaXN0ZXIgdWludDE2X3Qgc2V0dXA7CisKKwkvLyBGZXRjaCBDUkEgYW5kIENSQiByZWdpc3RlciBpbWFnZXMuCisJY3JhID0gREVCSXJlYWQoZGV2LCBrLT5NeUNSQSk7CisJY3JiID0gREVCSXJlYWQoZGV2LCBrLT5NeUNSQik7CisKKwkvLyBQb3B1bGF0ZSB0aGUgc3RhbmRhcmRpemVkIGNvdW50ZXIgc2V0dXAgYml0IGZpZWxkcy4gIE5vdGU6CisJLy8gSW5kZXhTcmMgaXMgcmVzdHJpY3RlZCB0byBFTkNfWCBvciBJbmR4UG9sLgorCXNldHVwID0gKCgoY3JiIDw8IChTVERCSVRfSU5UU1JDIC0gQ1JCQklUX0lOVFNSQ19CKSkgJiBTVERNU0tfSU5UU1JDKQkvLyBJbnRTcmMgICA9IEludFNyY0IuCisJCXwgKChjcmIgPDwgKFNUREJJVF9MQVRDSFNSQyAtIENSQkJJVF9MQVRDSFNSQykpICYgU1RETVNLX0xBVENIU1JDKQkvLyBMYXRjaFNyYyA9IExhdGNoU3JjQi4KKwkJfCAoKGNyYiA8PCAoU1REQklUX0xPQURTUkMgLSBDUkJCSVRfTE9BRFNSQ19CKSkgJiBTVERNU0tfTE9BRFNSQykJLy8gTG9hZFNyYyAgPSBMb2FkU3JjQi4KKwkJfCAoKGNyYiA8PCAoU1REQklUX0lORFhQT0wgLSBDUkJCSVRfSU5EWFBPTF9CKSkgJiBTVERNU0tfSU5EWFBPTCkJLy8gSW5keFBvbCAgPSBJbmR4UG9sQi4KKwkJfCAoKGNyYiA+PiAoQ1JCQklUX0NMS0VOQUJfQiAtIFNUREJJVF9DTEtFTkFCKSkgJiBTVERNU0tfQ0xLRU5BQikJLy8gQ2xrRW5hYiAgPSBDbGtFbmFiQi4KKwkJfCAoKGNyYSA+PiAoKENSQUJJVF9JTkRYU1JDX0IgKyAxKSAtIFNUREJJVF9JTkRYU1JDKSkgJiBTVERNU0tfSU5EWFNSQykpOwkvLyBJbmR4U3JjICA9IEluZHhTcmNCPDE+LgorCisJLy8gQWRqdXN0IG1vZGUtZGVwZW5kZW50IHBhcmFtZXRlcnMuCisJaWYgKChjcmIgJiBDUkJNU0tfQ0xLTVVMVF9CKSA9PSAoTVVMVF9YMCA8PCBDUkJCSVRfQ0xLTVVMVF9CKSkJLy8gSWYgRXh0ZW5kZXIgbW9kZSAoQ2xrTXVsdEIgPT0gTVVMVF9YMCk6CisJCXNldHVwIHw9ICgoQ0xLU1JDX0VYVEVOREVSIDw8IFNUREJJVF9DTEtTUkMpCS8vICAgSW5kaWNhdGUgRXh0ZW5kZXIgbW9kZS4KKwkJCXwgKE1VTFRfWDEgPDwgU1REQklUX0NMS01VTFQpCS8vICAgSW5kaWNhdGUgbXVsdGlwbGllciBpcyAxeC4KKwkJCXwgKChjcmEgPj4gKENSQUJJVF9DTEtTUkNfQiAtIFNUREJJVF9DTEtQT0wpKSAmIFNURE1TS19DTEtQT0wpKTsJLy8gICBTZXQgQ2xrUG9sIGVxdWFsIHRvIFRpbWVyIGNvdW50IGRpcmVjdGlvbiAoQ2xrU3JjQjwwPikuCisKKwllbHNlIGlmIChjcmEgJiAoMiA8PCBDUkFCSVRfQ0xLU1JDX0IpKQkvLyBJZiBUaW1lciBtb2RlIChDbGtTcmNCPDE+ID09IDEpOgorCQlzZXR1cCB8PSAoKENMS1NSQ19USU1FUiA8PCBTVERCSVRfQ0xLU1JDKQkvLyAgIEluZGljYXRlIFRpbWVyIG1vZGUuCisJCQl8IChNVUxUX1gxIDw8IFNUREJJVF9DTEtNVUxUKQkvLyAgIEluZGljYXRlIG11bHRpcGxpZXIgaXMgMXguCisJCQl8ICgoY3JhID4+IChDUkFCSVRfQ0xLU1JDX0IgLSBTVERCSVRfQ0xLUE9MKSkgJiBTVERNU0tfQ0xLUE9MKSk7CS8vICAgU2V0IENsa1BvbCBlcXVhbCB0byBUaW1lciBjb3VudCBkaXJlY3Rpb24gKENsa1NyY0I8MD4pLgorCisJZWxzZQkJCS8vIElmIENvdW50ZXIgbW9kZSAoQ2xrU3JjQjwxPiA9PSAwKToKKwkJc2V0dXAgfD0gKChDTEtTUkNfQ09VTlRFUiA8PCBTVERCSVRfQ0xLU1JDKQkvLyAgIEluZGljYXRlIFRpbWVyIG1vZGUuCisJCQl8ICgoY3JiID4+IChDUkJCSVRfQ0xLTVVMVF9CIC0gU1REQklUX0NMS01VTFQpKSAmIFNURE1TS19DTEtNVUxUKQkvLyAgIENsb2NrIG11bHRpcGxpZXIgaXMgcGFzc2VkIHRocm91Z2guCisJCQl8ICgoY3JiIDw8IChTVERCSVRfQ0xLUE9MIC0gQ1JCQklUX0NMS1BPTF9CKSkgJiBTVERNU0tfQ0xLUE9MKSk7CS8vICAgQ2xvY2sgcG9sYXJpdHkgaXMgcGFzc2VkIHRocm91Z2guCisKKwkvLyBSZXR1cm4gYWRqdXN0ZWQgY291bnRlciBzZXR1cC4KKwlyZXR1cm4gc2V0dXA7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU2V0IHRoZSBvcGVyYXRpbmcgbW9kZSBmb3IgdGhlIHNwZWNpZmllZCBjb3VudGVyLiAgVGhlIHNldHVwCisvLyBwYXJhbWV0ZXIgaXMgdHJlYXRlZCBhcyBhIENPVU5URVJfU0VUVVAgZGF0YSB0eXBlLiAgVGhlIGZvbGxvd2luZworLy8gcGFyYW1ldGVycyBhcmUgcHJvZ3JhbW1hYmxlIChhbGwgb3RoZXIgcGFybXMgYXJlIGlnbm9yZWQpOiBDbGtNdWx0LAorLy8gQ2xrUG9sLCBDbGtFbmFiLCBJbmRleFNyYywgSW5kZXhQb2wsIExvYWRTcmMuCisKK3N0YXRpYyB2b2lkIFNldE1vZGVfQShjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGssIHVpbnQxNl90IFNldHVwLAorCXVpbnQxNl90IERpc2FibGVJbnRTcmMpCit7CisJcmVnaXN0ZXIgdWludDE2X3QgY3JhOworCXJlZ2lzdGVyIHVpbnQxNl90IGNyYjsKKwlyZWdpc3RlciB1aW50MTZfdCBzZXR1cCA9IFNldHVwOwkvLyBDYWNoZSB0aGUgU3RhbmRhcmQgU2V0dXAuCisKKwkvLyBJbml0aWFsaXplIENSQSBhbmQgQ1JCIGltYWdlcy4KKwljcmEgPSAoKHNldHVwICYgQ1JBTVNLX0xPQURTUkNfQSkJLy8gUHJlbG9hZCB0cmlnZ2VyIGlzIHBhc3NlZCB0aHJvdWdoLgorCQl8ICgoc2V0dXAgJiBTVERNU0tfSU5EWFNSQykgPj4gKFNUREJJVF9JTkRYU1JDIC0gKENSQUJJVF9JTkRYU1JDX0EgKyAxKSkpKTsJLy8gSW5kZXhTcmMgaXMgcmVzdHJpY3RlZCB0byBFTkNfWCBvciBJbmR4UG9sLgorCisJY3JiID0gKENSQk1TS19JTlRSRVNFVENNRCB8IENSQk1TS19JTlRSRVNFVF9BCS8vIFJlc2V0IGFueSBwZW5kaW5nIENvdW50ZXJBIGV2ZW50IGNhcHR1cmVzLgorCQl8ICgoc2V0dXAgJiBTVERNU0tfQ0xLRU5BQikgPDwgKENSQkJJVF9DTEtFTkFCX0EgLSBTVERCSVRfQ0xLRU5BQikpKTsJLy8gQ2xvY2sgZW5hYmxlIGlzIHBhc3NlZCB0aHJvdWdoLgorCisJLy8gRm9yY2UgSW50U3JjIHRvIERpc2FibGVkIGlmIERpc2FibGVJbnRTcmMgaXMgYXNzZXJ0ZWQuCisJaWYgKCFEaXNhYmxlSW50U3JjKQorCQljcmEgfD0gKChzZXR1cCAmIFNURE1TS19JTlRTUkMpID4+IChTVERCSVRfSU5UU1JDIC0KKwkJCQlDUkFCSVRfSU5UU1JDX0EpKTsKKworCS8vIFBvcHVsYXRlIGFsbCBtb2RlLWRlcGVuZGVudCBhdHRyaWJ1dGVzIG9mIENSQSAmIENSQiBpbWFnZXMuCisJc3dpdGNoICgoc2V0dXAgJiBTVERNU0tfQ0xLU1JDKSA+PiBTVERCSVRfQ0xLU1JDKSB7CisJY2FzZSBDTEtTUkNfRVhURU5ERVI6CS8vIEV4dGVuZGVyIE1vZGU6IEZvcmNlIHRvIFRpbWVyIG1vZGUKKwkJLy8gKEV4dGVuZGVyIHZhbGlkIG9ubHkgZm9yIEIgY291bnRlcnMpLgorCisJY2FzZSBDTEtTUkNfVElNRVI6CS8vIFRpbWVyIE1vZGU6CisJCWNyYSB8PSAoKDIgPDwgQ1JBQklUX0NMS1NSQ19BKQkvLyAgIENsa1NyY0E8MT4gc2VsZWN0cyBzeXN0ZW0gY2xvY2sKKwkJCXwgKChzZXR1cCAmIFNURE1TS19DTEtQT0wpID4+IChTVERCSVRfQ0xLUE9MIC0gQ1JBQklUX0NMS1NSQ19BKSkJLy8gICAgIHdpdGggY291bnQgZGlyZWN0aW9uIChDbGtTcmNBPDA+KSBvYnRhaW5lZCBmcm9tIENsa1BvbC4KKwkJCXwgKDEgPDwgQ1JBQklUX0NMS1BPTF9BKQkvLyAgIENsa1BvbEEgYmVoYXZlcyBhcyBhbHdheXMtb24gY2xvY2sgZW5hYmxlLgorCQkJfCAoTVVMVF9YMSA8PCBDUkFCSVRfQ0xLTVVMVF9BKSk7CS8vICAgQ2xrTXVsdCBtdXN0IGJlIDF4LgorCQlicmVhazsKKworCWRlZmF1bHQ6CQkvLyBDb3VudGVyIE1vZGU6CisJCWNyYSB8PSAoQ0xLU1JDX0NPVU5URVIJLy8gICBTZWxlY3QgRU5DX0MgYW5kIEVOQ19EIGFzIGNsb2NrL2RpcmVjdGlvbiBpbnB1dHMuCisJCQl8ICgoc2V0dXAgJiBTVERNU0tfQ0xLUE9MKSA8PCAoQ1JBQklUX0NMS1BPTF9BIC0gU1REQklUX0NMS1BPTCkpCS8vICAgQ2xvY2sgcG9sYXJpdHkgaXMgcGFzc2VkIHRocm91Z2guCisJCQl8ICgoKHNldHVwICYgU1RETVNLX0NMS01VTFQpID09IChNVUxUX1gwIDw8IFNUREJJVF9DTEtNVUxUKSkgPwkvLyAgIEZvcmNlIG11bHRpcGxpZXIgdG8geDEgaWYgbm90IGxlZ2FsLCBvdGhlcndpc2UgcGFzcyB0aHJvdWdoLgorCQkJCShNVUxUX1gxIDw8IENSQUJJVF9DTEtNVUxUX0EpIDoKKwkJCQkoKHNldHVwICYgU1RETVNLX0NMS01VTFQpIDw8IChDUkFCSVRfQ0xLTVVMVF9BIC0KKwkJCQkJCVNUREJJVF9DTEtNVUxUKSkpKTsKKwl9CisKKwkvLyBGb3JjZSBwb3NpdGl2ZSBpbmRleCBwb2xhcml0eSBpZiBJbmR4U3JjIGlzIHNvZnR3YXJlLWRyaXZlbiBvbmx5LAorCS8vIG90aGVyd2lzZSBwYXNzIGl0IHRocm91Z2guCisJaWYgKH5zZXR1cCAmIFNURE1TS19JTkRYU1JDKQorCQljcmEgfD0gKChzZXR1cCAmIFNURE1TS19JTkRYUE9MKSA8PCAoQ1JBQklUX0lORFhQT0xfQSAtCisJCQkJU1REQklUX0lORFhQT0wpKTsKKworCS8vIElmIEludFNyYyBoYXMgYmVlbiBmb3JjZWQgdG8gRGlzYWJsZWQsIHVwZGF0ZSB0aGUgTUlTQzIgaW50ZXJydXB0CisJLy8gZW5hYmxlIG1hc2sgdG8gaW5kaWNhdGUgdGhlIGNvdW50ZXIgaW50ZXJydXB0IGlzIGRpc2FibGVkLgorCWlmIChEaXNhYmxlSW50U3JjKQorCQlkZXZwcml2LT5Db3VudGVySW50RW5hYnMgJj0gfmstPk15RXZlbnRCaXRzWzNdOworCisJLy8gV2hpbGUgcmV0YWluaW5nIENvdW50ZXJCIGFuZCBMYXRjaFNyYyBjb25maWd1cmF0aW9ucywgcHJvZ3JhbSB0aGUKKwkvLyBuZXcgY291bnRlciBvcGVyYXRpbmcgbW9kZS4KKwlERUJJcmVwbGFjZShkZXYsIGstPk15Q1JBLCBDUkFNU0tfSU5EWFNSQ19CIHwgQ1JBTVNLX0NMS1NSQ19CLCBjcmEpOworCURFQklyZXBsYWNlKGRldiwgay0+TXlDUkIsCisJCSh1aW50MTZfdCkgKH4oQ1JCTVNLX0lOVENUUkwgfCBDUkJNU0tfQ0xLRU5BQl9BKSksIGNyYik7Cit9CisKK3N0YXRpYyB2b2lkIFNldE1vZGVfQihjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGssIHVpbnQxNl90IFNldHVwLAorCXVpbnQxNl90IERpc2FibGVJbnRTcmMpCit7CisJcmVnaXN0ZXIgdWludDE2X3QgY3JhOworCXJlZ2lzdGVyIHVpbnQxNl90IGNyYjsKKwlyZWdpc3RlciB1aW50MTZfdCBzZXR1cCA9IFNldHVwOwkvLyBDYWNoZSB0aGUgU3RhbmRhcmQgU2V0dXAuCisKKwkvLyBJbml0aWFsaXplIENSQSBhbmQgQ1JCIGltYWdlcy4KKwljcmEgPSAoKHNldHVwICYgU1RETVNLX0lORFhTUkMpIDw8ICgoQ1JBQklUX0lORFhTUkNfQiArIDEpIC0gU1REQklUX0lORFhTUkMpKTsJLy8gSW5kZXhTcmMgZmllbGQgaXMgcmVzdHJpY3RlZCB0byBFTkNfWCBvciBJbmR4UG9sLgorCisJY3JiID0gKENSQk1TS19JTlRSRVNFVENNRCB8IENSQk1TS19JTlRSRVNFVF9CCS8vIFJlc2V0IGV2ZW50IGNhcHR1cmVzIGFuZCBkaXNhYmxlIGludGVycnVwdHMuCisJCXwgKChzZXR1cCAmIFNURE1TS19DTEtFTkFCKSA8PCAoQ1JCQklUX0NMS0VOQUJfQiAtIFNUREJJVF9DTEtFTkFCKSkJLy8gQ2xvY2sgZW5hYmxlIGlzIHBhc3NlZCB0aHJvdWdoLgorCQl8ICgoc2V0dXAgJiBTVERNU0tfTE9BRFNSQykgPj4gKFNUREJJVF9MT0FEU1JDIC0gQ1JCQklUX0xPQURTUkNfQikpKTsJLy8gUHJlbG9hZCB0cmlnZ2VyIHNvdXJjZSBpcyBwYXNzZWQgdGhyb3VnaC4KKworCS8vIEZvcmNlIEludFNyYyB0byBEaXNhYmxlZCBpZiBEaXNhYmxlSW50U3JjIGlzIGFzc2VydGVkLgorCWlmICghRGlzYWJsZUludFNyYykKKwkJY3JiIHw9ICgoc2V0dXAgJiBTVERNU0tfSU5UU1JDKSA+PiAoU1REQklUX0lOVFNSQyAtCisJCQkJQ1JCQklUX0lOVFNSQ19CKSk7CisKKwkvLyBQb3B1bGF0ZSBhbGwgbW9kZS1kZXBlbmRlbnQgYXR0cmlidXRlcyBvZiBDUkEgJiBDUkIgaW1hZ2VzLgorCXN3aXRjaCAoKHNldHVwICYgU1RETVNLX0NMS1NSQykgPj4gU1REQklUX0NMS1NSQykgeworCWNhc2UgQ0xLU1JDX1RJTUVSOgkvLyBUaW1lciBNb2RlOgorCQljcmEgfD0gKCgyIDw8IENSQUJJVF9DTEtTUkNfQikJLy8gICBDbGtTcmNCPDE+IHNlbGVjdHMgc3lzdGVtIGNsb2NrCisJCQl8ICgoc2V0dXAgJiBTVERNU0tfQ0xLUE9MKSA8PCAoQ1JBQklUX0NMS1NSQ19CIC0gU1REQklUX0NMS1BPTCkpKTsJLy8gICAgIHdpdGggZGlyZWN0aW9uIChDbGtTcmNCPDA+KSBvYnRhaW5lZCBmcm9tIENsa1BvbC4KKwkJY3JiIHw9ICgoMSA8PCBDUkJCSVRfQ0xLUE9MX0IpCS8vICAgQ2xrUG9sQiBiZWhhdmVzIGFzIGFsd2F5cy1vbiBjbG9jayBlbmFibGUuCisJCQl8IChNVUxUX1gxIDw8IENSQkJJVF9DTEtNVUxUX0IpKTsJLy8gICBDbGtNdWx0QiBtdXN0IGJlIDF4LgorCQlicmVhazsKKworCWNhc2UgQ0xLU1JDX0VYVEVOREVSOgkvLyBFeHRlbmRlciBNb2RlOgorCQljcmEgfD0gKCgyIDw8IENSQUJJVF9DTEtTUkNfQikJLy8gICBDbGtTcmNCIHNvdXJjZSBpcyBPdmVyZmxvd0EgKHNhbWUgYXMgInRpbWVyIikKKwkJCXwgKChzZXR1cCAmIFNURE1TS19DTEtQT0wpIDw8IChDUkFCSVRfQ0xLU1JDX0IgLSBTVERCSVRfQ0xLUE9MKSkpOwkvLyAgICAgd2l0aCBkaXJlY3Rpb24gb2J0YWluZWQgZnJvbSBDbGtQb2wuCisJCWNyYiB8PSAoKDEgPDwgQ1JCQklUX0NMS1BPTF9CKQkvLyAgIENsa1BvbEIgY29udHJvbHMgSW5kZXhCIC0tIGFsd2F5cyBzZXQgdG8gYWN0aXZlLgorCQkJfCAoTVVMVF9YMCA8PCBDUkJCSVRfQ0xLTVVMVF9CKSk7CS8vICAgQ2xrTXVsdEIgc2VsZWN0cyBPdmVyZmxvd0EgYXMgdGhlIGNsb2NrIHNvdXJjZS4KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgkJLy8gQ291bnRlciBNb2RlOgorCQljcmEgfD0gKENMS1NSQ19DT1VOVEVSIDw8IENSQUJJVF9DTEtTUkNfQik7CS8vICAgU2VsZWN0IEVOQ19DIGFuZCBFTkNfRCBhcyBjbG9jay9kaXJlY3Rpb24gaW5wdXRzLgorCQljcmIgfD0gKCgoc2V0dXAgJiBTVERNU0tfQ0xLUE9MKSA+PiAoU1REQklUX0NMS1BPTCAtIENSQkJJVF9DTEtQT0xfQikpCS8vICAgQ2xrUG9sIGlzIHBhc3NlZCB0aHJvdWdoLgorCQkJfCAoKChzZXR1cCAmIFNURE1TS19DTEtNVUxUKSA9PSAoTVVMVF9YMCA8PCBTVERCSVRfQ0xLTVVMVCkpID8JLy8gICBGb3JjZSBDbGtNdWx0IHRvIHgxIGlmIG5vdCBsZWdhbCwgb3RoZXJ3aXNlIHBhc3MgdGhyb3VnaC4KKwkJCQkoTVVMVF9YMSA8PCBDUkJCSVRfQ0xLTVVMVF9CKSA6CisJCQkJKChzZXR1cCAmIFNURE1TS19DTEtNVUxUKSA8PCAoQ1JCQklUX0NMS01VTFRfQiAtCisJCQkJCQlTVERCSVRfQ0xLTVVMVCkpKSk7CisJfQorCisJLy8gRm9yY2UgcG9zaXRpdmUgaW5kZXggcG9sYXJpdHkgaWYgSW5keFNyYyBpcyBzb2Z0d2FyZS1kcml2ZW4gb25seSwKKwkvLyBvdGhlcndpc2UgcGFzcyBpdCB0aHJvdWdoLgorCWlmICh+c2V0dXAgJiBTVERNU0tfSU5EWFNSQykKKwkJY3JiIHw9ICgoc2V0dXAgJiBTVERNU0tfSU5EWFBPTCkgPj4gKFNUREJJVF9JTkRYUE9MIC0KKwkJCQlDUkJCSVRfSU5EWFBPTF9CKSk7CisKKwkvLyBJZiBJbnRTcmMgaGFzIGJlZW4gZm9yY2VkIHRvIERpc2FibGVkLCB1cGRhdGUgdGhlIE1JU0MyIGludGVycnVwdAorCS8vIGVuYWJsZSBtYXNrIHRvIGluZGljYXRlIHRoZSBjb3VudGVyIGludGVycnVwdCBpcyBkaXNhYmxlZC4KKwlpZiAoRGlzYWJsZUludFNyYykKKwkJZGV2cHJpdi0+Q291bnRlckludEVuYWJzICY9IH5rLT5NeUV2ZW50Qml0c1szXTsKKworCS8vIFdoaWxlIHJldGFpbmluZyBDb3VudGVyQSBhbmQgTGF0Y2hTcmMgY29uZmlndXJhdGlvbnMsIHByb2dyYW0gdGhlCisJLy8gbmV3IGNvdW50ZXIgb3BlcmF0aW5nIG1vZGUuCisJREVCSXJlcGxhY2UoZGV2LCBrLT5NeUNSQSwKKwkJKHVpbnQxNl90KSAofihDUkFNU0tfSU5EWFNSQ19CIHwgQ1JBTVNLX0NMS1NSQ19CKSksIGNyYSk7CisJREVCSXJlcGxhY2UoZGV2LCBrLT5NeUNSQiwgQ1JCTVNLX0NMS0VOQUJfQSB8IENSQk1TS19MQVRDSFNSQywgY3JiKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBSZXR1cm4vc2V0IGEgY291bnRlcidzIGVuYWJsZS4gIGVuYWI6IDA9YWx3YXlzIGVuYWJsZWQsIDE9ZW5hYmxlZCBieSBpbmRleC4KKworc3RhdGljIHZvaWQgU2V0RW5hYmxlX0EoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrLCB1aW50MTZfdCBlbmFiKQoreworCURFQlVHKCJTZXRFbmFibGVfQTogU2V0RW5hYmxlX0EgZW50ZXIgMzU0MVxuIik7CisJREVCSXJlcGxhY2UoZGV2LCBrLT5NeUNSQiwKKwkJKHVpbnQxNl90KSAofihDUkJNU0tfSU5UQ1RSTCB8IENSQk1TS19DTEtFTkFCX0EpKSwKKwkJKHVpbnQxNl90KSAoZW5hYiA8PCBDUkJCSVRfQ0xLRU5BQl9BKSk7Cit9CisKK3N0YXRpYyB2b2lkIFNldEVuYWJsZV9CKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaywgdWludDE2X3QgZW5hYikKK3sKKwlERUJJcmVwbGFjZShkZXYsIGstPk15Q1JCLAorCQkodWludDE2X3QpICh+KENSQk1TS19JTlRDVFJMIHwgQ1JCTVNLX0NMS0VOQUJfQikpLAorCQkodWludDE2X3QpIChlbmFiIDw8IENSQkJJVF9DTEtFTkFCX0IpKTsKK30KKworc3RhdGljIHVpbnQxNl90IEdldEVuYWJsZV9BKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaykKK3sKKwlyZXR1cm4gKERFQklyZWFkKGRldiwgay0+TXlDUkIpID4+IENSQkJJVF9DTEtFTkFCX0EpICYgMTsKK30KKworc3RhdGljIHVpbnQxNl90IEdldEVuYWJsZV9CKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaykKK3sKKwlyZXR1cm4gKERFQklyZWFkKGRldiwgay0+TXlDUkIpID4+IENSQkJJVF9DTEtFTkFCX0IpICYgMTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBSZXR1cm4vc2V0IGEgY291bnRlciBwYWlyJ3MgbGF0Y2ggdHJpZ2dlciBzb3VyY2UuICAwOiBPbiByZWFkCisvLyBhY2Nlc3MsIDE6IEEgaW5kZXggbGF0Y2hlcyBBLCAyOiBCIGluZGV4IGxhdGNoZXMgQiwgMzogQSBvdmVyZmxvdworLy8gbGF0Y2hlcyBCLgorCitzdGF0aWMgdm9pZCBTZXRMYXRjaFNvdXJjZShjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGssIHVpbnQxNl90IHZhbHVlKQoreworCURFQlVHKCJTZXRMYXRjaFNvdXJjZTogU2V0TGF0Y2hTb3VyY2UgZW50ZXIgMzU1MCBcbiIpOworCURFQklyZXBsYWNlKGRldiwgay0+TXlDUkIsCisJCSh1aW50MTZfdCkgKH4oQ1JCTVNLX0lOVENUUkwgfCBDUkJNU0tfTEFUQ0hTUkMpKSwKKwkJKHVpbnQxNl90KSAodmFsdWUgPDwgQ1JCQklUX0xBVENIU1JDKSk7CisKKwlERUJVRygiU2V0TGF0Y2hTb3VyY2U6IFNldExhdGNoU291cmNlIGV4aXQgXG4iKTsKK30KKworLyogc3RhdGljIHVpbnQxNl90IEdldExhdGNoU291cmNlKGNvbWVkaV9kZXZpY2UgKmRldiwgZW5jX3ByaXZhdGUgKmsgKSAqLworLyogeyAqLworLyogICByZXR1cm4gKCBERUJJcmVhZCggZGV2LCBrLT5NeUNSQikgPj4gQ1JCQklUX0xBVENIU1JDICkgJiAzOyAqLworLyogfSAqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBSZXR1cm4vc2V0IHRoZSBldmVudCB0aGF0IHdpbGwgdHJpZ2dlciB0cmFuc2ZlciBvZiB0aGUgcHJlbG9hZAorLy8gcmVnaXN0ZXIgaW50byB0aGUgY291bnRlci4gIDA9VGhpc0NudHJfSW5kZXgsIDE9VGhpc0NudHJfT3ZlcmZsb3csCisvLyAyPU92ZXJmbG93QSAoQiBjb3VudGVycyBvbmx5KSwgMz1kaXNhYmxlZC4KKworc3RhdGljIHZvaWQgU2V0TG9hZFRyaWdfQShjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGssIHVpbnQxNl90IFRyaWcpCit7CisJREVCSXJlcGxhY2UoZGV2LCBrLT5NeUNSQSwgKHVpbnQxNl90KSAofkNSQU1TS19MT0FEU1JDX0EpLAorCQkodWludDE2X3QpIChUcmlnIDw8IENSQUJJVF9MT0FEU1JDX0EpKTsKK30KKworc3RhdGljIHZvaWQgU2V0TG9hZFRyaWdfQihjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGssIHVpbnQxNl90IFRyaWcpCit7CisJREVCSXJlcGxhY2UoZGV2LCBrLT5NeUNSQiwKKwkJKHVpbnQxNl90KSAofihDUkJNU0tfTE9BRFNSQ19CIHwgQ1JCTVNLX0lOVENUUkwpKSwKKwkJKHVpbnQxNl90KSAoVHJpZyA8PCBDUkJCSVRfTE9BRFNSQ19CKSk7Cit9CisKK3N0YXRpYyB1aW50MTZfdCBHZXRMb2FkVHJpZ19BKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaykKK3sKKwlyZXR1cm4gKERFQklyZWFkKGRldiwgay0+TXlDUkEpID4+IENSQUJJVF9MT0FEU1JDX0EpICYgMzsKK30KKworc3RhdGljIHVpbnQxNl90IEdldExvYWRUcmlnX0IoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrKQoreworCXJldHVybiAoREVCSXJlYWQoZGV2LCBrLT5NeUNSQikgPj4gQ1JCQklUX0xPQURTUkNfQikgJiAzOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUmV0dXJuL3NldCBjb3VudGVyIGludGVycnVwdCBzb3VyY2UgYW5kIGNsZWFyIGFueSBjYXB0dXJlZAorLy8gaW5kZXgvb3ZlcmZsb3cgZXZlbnRzLiAgSW50U291cmNlOiAwPURpc2FibGVkLCAxPU92ZXJmbG93T25seSwKKy8vIDI9SW5kZXhPbmx5LCAzPUluZGV4QW5kT3ZlcmZsb3cuCisKK3N0YXRpYyB2b2lkIFNldEludFNyY19BKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaywKKwl1aW50MTZfdCBJbnRTb3VyY2UpCit7CisJLy8gUmVzZXQgYW55IHBlbmRpbmcgY291bnRlciBvdmVyZmxvdyBvciBpbmRleCBjYXB0dXJlcy4KKwlERUJJcmVwbGFjZShkZXYsIGstPk15Q1JCLCAodWludDE2X3QpICh+Q1JCTVNLX0lOVENUUkwpLAorCQlDUkJNU0tfSU5UUkVTRVRDTUQgfCBDUkJNU0tfSU5UUkVTRVRfQSk7CisKKwkvLyBQcm9ncmFtIGNvdW50ZXIgaW50ZXJydXB0IHNvdXJjZS4KKwlERUJJcmVwbGFjZShkZXYsIGstPk15Q1JBLCB+Q1JBTVNLX0lOVFNSQ19BLAorCQkodWludDE2X3QpIChJbnRTb3VyY2UgPDwgQ1JBQklUX0lOVFNSQ19BKSk7CisKKwkvLyBVcGRhdGUgTUlTQzIgaW50ZXJydXB0IGVuYWJsZSBtYXNrLgorCWRldnByaXYtPkNvdW50ZXJJbnRFbmFicyA9CisJCShkZXZwcml2LT5Db3VudGVySW50RW5hYnMgJiB+ay0+TXlFdmVudEJpdHNbM10pIHwgay0+CisJCU15RXZlbnRCaXRzW0ludFNvdXJjZV07Cit9CisKK3N0YXRpYyB2b2lkIFNldEludFNyY19CKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaywKKwl1aW50MTZfdCBJbnRTb3VyY2UpCit7CisJdWludDE2X3QgY3JiOworCisJLy8gQ2FjaGUgd3JpdGVhYmxlIENSQiByZWdpc3RlciBpbWFnZS4KKwljcmIgPSBERUJJcmVhZChkZXYsIGstPk15Q1JCKSAmIH5DUkJNU0tfSU5UQ1RSTDsKKworCS8vIFJlc2V0IGFueSBwZW5kaW5nIGNvdW50ZXIgb3ZlcmZsb3cgb3IgaW5kZXggY2FwdHVyZXMuCisJREVCSXdyaXRlKGRldiwgay0+TXlDUkIsCisJCSh1aW50MTZfdCkgKGNyYiB8IENSQk1TS19JTlRSRVNFVENNRCB8IENSQk1TS19JTlRSRVNFVF9CKSk7CisKKwkvLyBQcm9ncmFtIGNvdW50ZXIgaW50ZXJydXB0IHNvdXJjZS4KKwlERUJJd3JpdGUoZGV2LCBrLT5NeUNSQiwKKwkJKHVpbnQxNl90KSAoKGNyYiAmIH5DUkJNU0tfSU5UU1JDX0IpIHwgKEludFNvdXJjZSA8PAorCQkJCUNSQkJJVF9JTlRTUkNfQikpKTsKKworCS8vIFVwZGF0ZSBNSVNDMiBpbnRlcnJ1cHQgZW5hYmxlIG1hc2suCisJZGV2cHJpdi0+Q291bnRlckludEVuYWJzID0KKwkJKGRldnByaXYtPkNvdW50ZXJJbnRFbmFicyAmIH5rLT5NeUV2ZW50Qml0c1szXSkgfCBrLT4KKwkJTXlFdmVudEJpdHNbSW50U291cmNlXTsKK30KKworc3RhdGljIHVpbnQxNl90IEdldEludFNyY19BKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaykKK3sKKwlyZXR1cm4gKERFQklyZWFkKGRldiwgay0+TXlDUkEpID4+IENSQUJJVF9JTlRTUkNfQSkgJiAzOworfQorCitzdGF0aWMgdWludDE2X3QgR2V0SW50U3JjX0IoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrKQoreworCXJldHVybiAoREVCSXJlYWQoZGV2LCBrLT5NeUNSQikgPj4gQ1JCQklUX0lOVFNSQ19CKSAmIDM7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFJldHVybi9zZXQgdGhlIGNsb2NrIG11bHRpcGxpZXIuCisKKy8qIHN0YXRpYyB2b2lkIFNldENsa011bHQoY29tZWRpX2RldmljZSAqZGV2LCBlbmNfcHJpdmF0ZSAqaywgdWludDE2X3QgdmFsdWUgKSAgKi8KKy8qIHsgKi8KKy8qICAgay0+U2V0TW9kZShkZXYsIGssICh1aW50MTZfdCkoICggay0+R2V0TW9kZShkZXYsIGsgKSAmIH5TVERNU0tfQ0xLTVVMVCApIHwgKCB2YWx1ZSA8PCBTVERCSVRfQ0xLTVVMVCApICksIEZBTFNFICk7ICovCisvKiB9ICovCisKKy8qIHN0YXRpYyB1aW50MTZfdCBHZXRDbGtNdWx0KGNvbWVkaV9kZXZpY2UgKmRldiwgZW5jX3ByaXZhdGUgKmsgKSAgKi8KKy8qIHsgKi8KKy8qICAgcmV0dXJuICggay0+R2V0TW9kZShkZXYsIGsgKSA+PiBTVERCSVRfQ0xLTVVMVCApICYgMzsgKi8KKy8qIH0gKi8KKworLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKy8qIC8vIFJldHVybi9zZXQgdGhlIGNsb2NrIHBvbGFyaXR5LiAqLworCisvKiBzdGF0aWMgdm9pZCBTZXRDbGtQb2woIGNvbWVkaV9kZXZpY2UgKmRldixlbmNfcHJpdmF0ZSAqaywgdWludDE2X3QgdmFsdWUgKSAgKi8KKy8qIHsgKi8KKy8qICAgay0+U2V0TW9kZShkZXYsIGssICh1aW50MTZfdCkoICggay0+R2V0TW9kZShkZXYsIGsgKSAmIH5TVERNU0tfQ0xLUE9MICkgfCAoIHZhbHVlIDw8IFNUREJJVF9DTEtQT0wgKSApLCBGQUxTRSApOyAqLworLyogfSAqLworCisvKiBzdGF0aWMgdWludDE2X3QgR2V0Q2xrUG9sKGNvbWVkaV9kZXZpY2UgKmRldiwgZW5jX3ByaXZhdGUgKmsgKSAgKi8KKy8qIHsgKi8KKy8qICAgcmV0dXJuICggay0+R2V0TW9kZShkZXYsIGsgKSA+PiBTVERCSVRfQ0xLUE9MICkgJiAxOyAqLworLyogfSAqLworCisvKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworLyogLy8gUmV0dXJuL3NldCB0aGUgY2xvY2sgc291cmNlLiAqLworCisvKiBzdGF0aWMgdm9pZCBTZXRDbGtTcmMoIGNvbWVkaV9kZXZpY2UgKmRldixlbmNfcHJpdmF0ZSAqaywgdWludDE2X3QgdmFsdWUgKSAgKi8KKy8qIHsgKi8KKy8qICAgay0+U2V0TW9kZShkZXYsIGssICh1aW50MTZfdCkoICggay0+R2V0TW9kZShkZXYsIGsgKSAmIH5TVERNU0tfQ0xLU1JDICkgfCAoIHZhbHVlIDw8IFNUREJJVF9DTEtTUkMgKSApLCBGQUxTRSApOyAqLworLyogfSAqLworCisvKiBzdGF0aWMgdWludDE2X3QgR2V0Q2xrU3JjKCBjb21lZGlfZGV2aWNlICpkZXYsZW5jX3ByaXZhdGUgKmsgKSAgKi8KKy8qIHsgKi8KKy8qICAgcmV0dXJuICggay0+R2V0TW9kZShkZXYsIGsgKSA+PiBTVERCSVRfQ0xLU1JDICkgJiAzOyAqLworLyogfSAqLworCisvKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKy8qIC8vIFJldHVybi9zZXQgdGhlIGluZGV4IHBvbGFyaXR5LiAqLworCisvKiBzdGF0aWMgdm9pZCBTZXRJbmRleFBvbChjb21lZGlfZGV2aWNlICpkZXYsIGVuY19wcml2YXRlICprLCB1aW50MTZfdCB2YWx1ZSApICAqLworLyogeyAqLworLyogICBrLT5TZXRNb2RlKGRldiwgaywgKHVpbnQxNl90KSggKCBrLT5HZXRNb2RlKGRldiwgayApICYgflNURE1TS19JTkRYUE9MICkgfCAoICh2YWx1ZSAhPSAwKSA8PCBTVERCSVRfSU5EWFBPTCApICksIEZBTFNFICk7ICovCisvKiB9ICovCisKKy8qIHN0YXRpYyB1aW50MTZfdCBHZXRJbmRleFBvbChjb21lZGlfZGV2aWNlICpkZXYsIGVuY19wcml2YXRlICprICkgICovCisvKiB7ICovCisvKiAgIHJldHVybiAoIGstPkdldE1vZGUoZGV2LCBrICkgPj4gU1REQklUX0lORFhQT0wgKSAmIDE7ICovCisvKiB9ICovCisKKy8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworLyogLy8gUmV0dXJuL3NldCB0aGUgaW5kZXggc291cmNlLiAqLworCisvKiBzdGF0aWMgdm9pZCBTZXRJbmRleFNyYyhjb21lZGlfZGV2aWNlICpkZXYsIGVuY19wcml2YXRlICprLCB1aW50MTZfdCB2YWx1ZSApICAqLworLyogeyAqLworLyogICBERUJVRygiU2V0SW5kZXhTcmM6IHNldCBpbmRleCBzcmMgZW50ZXIgMzcwMFxuIik7ICovCisvKiAgIGstPlNldE1vZGUoZGV2LCBrLCAodWludDE2X3QpKCAoIGstPkdldE1vZGUoZGV2LCBrICkgJiB+U1RETVNLX0lORFhTUkMgKSB8ICggKHZhbHVlICE9IDApIDw8IFNUREJJVF9JTkRYU1JDICkgKSwgRkFMU0UgKTsgKi8KKy8qIH0gKi8KKworLyogc3RhdGljIHVpbnQxNl90IEdldEluZGV4U3JjKGNvbWVkaV9kZXZpY2UgKmRldiwgZW5jX3ByaXZhdGUgKmsgKSAgKi8KKy8qIHsgKi8KKy8qICAgcmV0dXJuICggay0+R2V0TW9kZShkZXYsIGsgKSA+PiBTVERCSVRfSU5EWFNSQyApICYgMTsgKi8KKy8qIH0gKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gR2VuZXJhdGUgYW4gaW5kZXggcHVsc2UuCisKK3N0YXRpYyB2b2lkIFB1bHNlSW5kZXhfQShjb21lZGlfZGV2aWNlICogZGV2LCBlbmNfcHJpdmF0ZSAqIGspCit7CisJcmVnaXN0ZXIgdWludDE2X3QgY3JhOworCisJREVCVUcoIlB1bHNlSW5kZXhfQTogcHVsc2UgaW5kZXggZW50ZXJcbiIpOworCisJY3JhID0gREVCSXJlYWQoZGV2LCBrLT5NeUNSQSk7CS8vIFB1bHNlIGluZGV4LgorCURFQkl3cml0ZShkZXYsIGstPk15Q1JBLCAodWludDE2X3QpIChjcmEgXiBDUkFNU0tfSU5EWFBPTF9BKSk7CisJREVCVUcoIlB1bHNlSW5kZXhfQTogcHVsc2UgaW5kZXggc3RlcDFcbiIpOworCURFQkl3cml0ZShkZXYsIGstPk15Q1JBLCBjcmEpOworfQorCitzdGF0aWMgdm9pZCBQdWxzZUluZGV4X0IoY29tZWRpX2RldmljZSAqIGRldiwgZW5jX3ByaXZhdGUgKiBrKQoreworCXJlZ2lzdGVyIHVpbnQxNl90IGNyYjsKKworCWNyYiA9IERFQklyZWFkKGRldiwgay0+TXlDUkIpICYgfkNSQk1TS19JTlRDVFJMOwkvLyBQdWxzZSBpbmRleC4KKwlERUJJd3JpdGUoZGV2LCBrLT5NeUNSQiwgKHVpbnQxNl90KSAoY3JiIF4gQ1JCTVNLX0lORFhQT0xfQikpOworCURFQkl3cml0ZShkZXYsIGstPk15Q1JCLCBjcmIpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFdyaXRlIHZhbHVlIGludG8gY291bnRlciBwcmVsb2FkIHJlZ2lzdGVyLgorCitzdGF0aWMgdm9pZCBQcmVsb2FkKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGVuY19wcml2YXRlICogaywgdWludDMyX3QgdmFsdWUpCit7CisJREVCVUcoIlByZWxvYWQ6IHByZWxvYWQgZW50ZXJcbiIpOworCURFQkl3cml0ZShkZXYsICh1aW50MTZfdCkgKGstPk15TGF0Y2hMc3cpLCAodWludDE2X3QpIHZhbHVlKTsJLy8gV3JpdGUgdmFsdWUgdG8gcHJlbG9hZCByZWdpc3Rlci4KKwlERUJVRygiUHJlbG9hZDogcHJlbG9hZCBzdGVwIDFcbiIpOworCURFQkl3cml0ZShkZXYsICh1aW50MTZfdCkgKGstPk15TGF0Y2hMc3cgKyAyKSwKKwkJKHVpbnQxNl90KSAodmFsdWUgPj4gMTYpKTsKK30KKworc3RhdGljIHZvaWQgQ291bnRlcnNJbml0KGNvbWVkaV9kZXZpY2UgKiBkZXYpCit7CisJaW50IGNoYW47CisJZW5jX3ByaXZhdGUgKms7CisJdWludDE2X3QgU2V0dXAgPSAoTE9BRFNSQ19JTkRYIDw8IEJGX0xPQURTUkMpIHwJLy8gUHJlbG9hZCB1cG9uCisJCS8vIGluZGV4LgorCQkoSU5EWFNSQ19TT0ZUIDw8IEJGX0lORFhTUkMpIHwJLy8gRGlzYWJsZSBoYXJkd2FyZSBpbmRleC4KKwkJKENMS1NSQ19DT1VOVEVSIDw8IEJGX0NMS1NSQykgfAkvLyBPcGVyYXRpbmcgbW9kZSBpcyBjb3VudGVyLgorCQkoQ0xLUE9MX1BPUyA8PCBCRl9DTEtQT0wpIHwJLy8gQWN0aXZlIGhpZ2ggY2xvY2suCisJCShDTlRESVJfVVAgPDwgQkZfQ0xLUE9MKSB8CS8vIENvdW50IGRpcmVjdGlvbiBpcyB1cC4KKwkJKENMS01VTFRfMVggPDwgQkZfQ0xLTVVMVCkgfAkvLyBDbG9jayBtdWx0aXBsaWVyIGlzIDF4LgorCQkoQ0xLRU5BQl9JTkRFWCA8PCBCRl9DTEtFTkFCKTsJLy8gRW5hYmxlZCBieSBpbmRleAorCisJLy8gRGlzYWJsZSBhbGwgY291bnRlciBpbnRlcnJ1cHRzIGFuZCBjbGVhciBhbnkgY2FwdHVyZWQgY291bnRlciBldmVudHMuCisJZm9yIChjaGFuID0gMDsgY2hhbiA8IFM2MjZfRU5DT0RFUl9DSEFOTkVMUzsgY2hhbisrKSB7CisJCWsgPSAmZW5jcHJpdltjaGFuXTsKKwkJay0+U2V0TW9kZShkZXYsIGssIFNldHVwLCBUUlVFKTsKKwkJay0+U2V0SW50U3JjKGRldiwgaywgMCk7CisJCWstPlJlc2V0Q2FwRmxhZ3MoZGV2LCBrKTsKKwkJay0+U2V0RW5hYmxlKGRldiwgaywgQ0xLRU5BQl9BTFdBWVMpOworCX0KKwlERUJVRygiQ291bnRlcnNJbml0OiBjb3VudGVycyBpbml0aWFsaXplZCBcbiIpOworCit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczYyNi5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M2MjYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWQ4YjFjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M2MjYuaApAQCAtMCwwICsxLDgwMiBAQAorLyoKKyAgY29tZWRpL2RyaXZlcnMvczYyNi5oCisgIFNlbnNvcmF5IHM2MjYgQ29tZWRpIGRyaXZlciwgaGVhZGVyIGZpbGUKKworICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgIENvcHlyaWdodCAoQykgMjAwMCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworICBCYXNlZCBvbiBTZW5zb3JheSBNb2RlbCA2MjYgTGludXggZHJpdmVyIFZlcnNpb24gMC4yCisgIENvcHlyaWdodCAoQykgMjAwMi0yMDA0IFNlbnNvcmF5IENvLiwgSW5jLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworLyoKKyAgRHJpdmVyOiBzNjI2Lm8gKHM2MjYua28pCisgIERlc2NyaXB0aW9uOiBTZW5zb3JheSA2MjYgZHJpdmVyCisgIERldmljZXM6IFNlbnNvcmF5IHM2MjYKKyAgQXV0aG9yczogR2lhbmx1Y2EgUGFsbGkgPGdwYWxsaUBkZWlzLnVuaWJvLml0PiwKKyAgVXBkYXRlZDogVGh1LCAxMiBKdWwgMjAwNQorICBTdGF0dXM6IGV4cGVyaW1lbnRhbAorCisgIENvbmZpZ3VyYXRpb24gT3B0aW9uczoKKyAgYW5hbG9nIGlucHV0OgorICAgbm9uZQorCisgIGFuYWxvZyBvdXRwdXQ6CisgICBub25lCisKKyAgZGlnaXRhbCBjaGFubmVsOgorICAgczYyNiBoYXMgMyBkaW8gc3ViZGV2aWNlcyAoMiwzIGFuZCA0KSBlYWNoIHdpdGggMTYgaS9vIGNoYW5uZWxzCisgICBzdXBwb3J0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zOgorICAgSU5TTl9DT05GSUdfRElPX1FVRVJZCisgICBDT01FRElfSU5QVVQKKyAgIENPTUVESV9PVVRQVVQKKworICBlbmNvZGVyOgorICAgRXZlcnkgY2hhbm5lbCBtdXN0IGJlIGNvbmZpZ3VyZWQgYmVmb3JlIHJlYWRpbmcuCisKKyAgIEV4YW1wbGUgY29kZQorCisgICBpbnNuLmluc249SU5TTl9DT05GSUc7ICAgLy9jb25maWd1cmF0aW9uIGluc3RydWN0aW9uCisgICBpbnNuLm49MTsgICAgICAgICAgICAgICAgLy9udW1iZXIgb2Ygb3BlcmF0aW9uIChtdXN0IGJlIDEpCisgICBpbnNuLmRhdGE9JmluaXRpYWx2YWx1ZTsgLy9pbml0aWFsIHZhbHVlIGxvYWRlZCBpbnRvIGVuY29kZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2R1cmluZyBjb25maWd1cmF0aW9uCisgICBpbnNuLnN1YmRldj01OyAgICAgICAgICAgLy9lbmNvZGVyIHN1YmRldmljZQorICAgaW5zbi5jaGFuc3BlYz1DUl9QQUNLKGVuY29kZXJfY2hhbm5lbCwwLEFSRUZfT1RIRVIpOyAvL2VuY29kZXJfY2hhbm5lbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RvIGNvbmZpZ3VyZQorCisgICBjb21lZGlfZG9faW5zbihjZiwmaW5zbik7IC8vZXhlY3V0aW5nIGNvbmZpZ3VyYXRpb24KKyovCisKKyNpZmRlZiBfREVCVUdfCisjZGVmaW5lIERFQlVHKC4uLik7ICAgICAgICBydF9wcmludGsoX19WQV9BUkdTX18pOworI2Vsc2UKKyNkZWZpbmUgREVCVUcoLi4uKQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChUUlVFKQorI2RlZmluZSBUUlVFICAgICgxKQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChGQUxTRSkKKyNkZWZpbmUgRkFMU0UgICAoMCkKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoRVhURVJOKQorI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCisjZGVmaW5lIEVYVEVSTiBleHRlcm4gIkMiCisjZWxzZQorI2RlZmluZSBFWFRFUk4gZXh0ZXJuCisjZW5kaWYKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoSU5MSU5FKQorI2RlZmluZSBJTkxJTkUgc3RhdGljIF9faW5saW5lCisjZW5kaWYKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNpbmNsdWRlPGxpbnV4L3NsYWIuaD4KKworI2RlZmluZSBTNjI2X1NJWkUgMHgwMjAwCisjZGVmaW5lIFNJWkVPRl9BRERSRVNTX1NQQUNFCQkweDAyMDAKKyNkZWZpbmUgRE1BQlVGX1NJWkUJCQk0MDk2CS8vIDRrIHBhZ2VzCisKKyNkZWZpbmUgUzYyNl9BRENfQ0hBTk5FTFMgICAgICAgMTYKKyNkZWZpbmUgUzYyNl9EQUNfQ0hBTk5FTFMgICAgICAgNAorI2RlZmluZSBTNjI2X0VOQ09ERVJfQ0hBTk5FTFMgICA2CisjZGVmaW5lIFM2MjZfRElPX0NIQU5ORUxTICAgICAgIDQ4CisjZGVmaW5lIFM2MjZfRElPX0JBTktTCQkzCS8vIE51bWJlciBvZiBESU8gZ3JvdXBzLgorI2RlZmluZSBTNjI2X0RJT19FWFRDSEFOUwk0MAkvLyBOdW1iZXIgb2YKKwkJCQkJLy8gZXh0ZW5kZWQtY2FwYWJpbGl0eQorCQkJCQkvLyBESU8gY2hhbm5lbHMuCisKKyNkZWZpbmUgTlVNX1RSSU1EQUNTCTEyCS8vIE51bWJlciBvZiB2YWxpZCBUcmltREFDIGNoYW5uZWxzLgorCisvLyBQQ0kgYnVzIGludGVyZmFjZSB0eXBlcy4KKyNkZWZpbmUgSU5URUwJCQkJMQkvLyBJbnRlbCBidXMgdHlwZS4KKyNkZWZpbmUgTU9UT1JPTEEJCQkyCS8vIE1vdG9yb2xhIGJ1cyB0eXBlLgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgUExBVEZPUk0JCUlOVEVMCS8vICoqKiBTRUxFQ1QgUExBVEZPUk0gVFlQRSAqKioKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBSQU5HRV81ViAgICAgICAgICAgICAgICAweDEwCS8vICsvLTVWIHJhbmdlCisjZGVmaW5lIFJBTkdFXzEwViAgICAgICAgICAgICAgIDB4MDAJLy8gKy8tMTBWIHJhbmdlCisKKyNkZWZpbmUgRU9QTAkJCTB4ODAJLy8gRW5kIG9mIEFEQyBwb2xsIGxpc3QgbWFya2VyLgorI2RlZmluZSBHU0VMX0JJUE9MQVI1VgkJMHgwMEYwCS8vIExQX0dTRUwgc2V0dGluZyBmb3IgNVYgYmlwb2xhciByYW5nZS4KKyNkZWZpbmUgR1NFTF9CSVBPTEFSMTBWCQkweDAwQTAJLy8gTFBfR1NFTCBzZXR0aW5nIGZvciAxMFYgYmlwb2xhciByYW5nZS4KKworLy8gRXJyb3IgY29kZXMgdGhhdCBtdXN0IGJlIHZpc2libGUgdG8gdGhpcyBiYXNlIGNsYXNzLgorI2RlZmluZSBFUlJfSUxMRUdBTF9QQVJNCTB4MDAwMTAwMDAJLy8gSWxsZWdhbCBmdW5jdGlvbiBwYXJhbWV0ZXIgdmFsdWUgd2FzIHNwZWNpZmllZC4KKyNkZWZpbmUgRVJSX0kyQwkJCTB4MDAwMjAwMDAJLy8gSTJDIGVycm9yLgorI2RlZmluZSBFUlJfQ09VTlRFUlNFVFVQCTB4MDAyMDAwMDAJLy8gSWxsZWdhbCBzZXR1cCBzcGVjaWZpZWQgZm9yIGNvdW50ZXIgY2hhbm5lbC4KKyNkZWZpbmUgRVJSX0RFQklfVElNRU9VVAkweDAwNDAwMDAwCS8vIERFQkkgdHJhbnNmZXIgdGltZWQgb3V0LgorCisvLyBPcmdhbml6YXRpb24gKHBoeXNpY2FsIG9yZGVyKSBhbmQgc2l6ZSAoaW4gRFdPUkRzKSBvZiBsb2dpY2FsIERNQSBidWZmZXJzIGNvbnRhaW5lZCBieSBBTkFfRE1BQlVGLgorI2RlZmluZSBBRENfRE1BQlVGX0RXT1JEUwk0MAkvLyBBREMgRE1BIGJ1ZmZlciBtdXN0IGhvbGQgMTYgc2FtcGxlcywgcGx1cyBwcmUvcG9zdCBnYXJiYWdlIHNhbXBsZXMuCisjZGVmaW5lIERBQ19XRE1BQlVGX0RXT1JEUwkxCS8vIERBQyBvdXRwdXQgRE1BIGJ1ZmZlciBob2xkcyBhIHNpbmdsZSBzYW1wbGUuCisKKy8vIEFsbCByZW1haW5pbmcgc3BhY2UgaW4gNEtCIERNQSBidWZmZXIgaXMgYXZhaWxhYmxlIGZvciB0aGUgUlBTMSBwcm9ncmFtLgorCisvLyBBZGRyZXNzIG9mZnNldHMsIGluIERXT1JEUywgZnJvbSBiYXNlIG9mIERNQSBidWZmZXIuCisjZGVmaW5lIERBQ19XRE1BQlVGX09TCQlBRENfRE1BQlVGX0RXT1JEUworCisvLyBJbnRlcnJ1cHQgZW5hYiBiaXQgaW4gSVNSIGFuZCBJRVIuCisjZGVmaW5lIElSUV9HUElPMwkJMHgwMDAwMDA0MAkvLyBJUlEgZW5hYmxlIGZvciBHUElPMy4KKyNkZWZpbmUgSVJRX1JQUzEgICAgICAgICAgICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBJU1JfQUZPVQkJMHgwMDAwMDgwMAkvLyBBdWRpbyBmaWZvCisJCQkJCQkvLyB1bmRlci9vdmVyZmxvdworCQkJCQkJLy8gZGV0ZWN0ZWQuCisjZGVmaW5lIElSUV9DT0lOVDFBICAgICAgICAgICAgIDB4MDQwMAkvLyBjb250ZXIgMUEgb3ZlcmZsb3cKKwkJCQkJCS8vIGludGVycnVwdCBtYXNrCisjZGVmaW5lIElSUV9DT0lOVDFCICAgICAgICAgICAgIDB4MDgwMAkvLyBjb250ZXIgMUIgb3ZlcmZsb3cKKwkJCQkJCS8vIGludGVycnVwdCBtYXNrCisjZGVmaW5lIElSUV9DT0lOVDJBICAgICAgICAgICAgIDB4MTAwMAkvLyBjb250ZXIgMkEgb3ZlcmZsb3cKKwkJCQkJCS8vIGludGVycnVwdCBtYXNrCisjZGVmaW5lIElSUV9DT0lOVDJCICAgICAgICAgICAgIDB4MjAwMAkvLyBjb250ZXIgMkIgb3ZlcmZsb3cKKwkJCQkJCS8vIGludGVycnVwdCBtYXNrCisjZGVmaW5lIElSUV9DT0lOVDNBICAgICAgICAgICAgIDB4NDAwMAkvLyBjb250ZXIgM0Egb3ZlcmZsb3cKKwkJCQkJCS8vIGludGVycnVwdCBtYXNrCisjZGVmaW5lIElSUV9DT0lOVDNCICAgICAgICAgICAgIDB4ODAwMAkvLyBjb250ZXIgM0Igb3ZlcmZsb3cKKwkJCQkJCS8vIGludGVycnVwdCBtYXNrCisKKy8vIFJQUyBjb21tYW5kIGNvZGVzLgorI2RlZmluZSBSUFNfQ0xSU0lHTkFMCQkweDAwMDAwMDAwCS8vIENMRUFSIFNJR05BTAorI2RlZmluZSBSUFNfU0VUU0lHTkFMCQkweDEwMDAwMDAwCS8vIFNFVCBTSUdOQUwKKyNkZWZpbmUgUlBTX05PUAkJCTB4MDAwMDAwMDAJLy8gTk9QCisjZGVmaW5lIFJQU19QQVVTRQkJMHgyMDAwMDAwMAkvLyBQQVVTRQorI2RlZmluZSBSUFNfVVBMT0FECQkweDQwMDAwMDAwCS8vIFVQTE9BRAorI2RlZmluZSBSUFNfSlVNUAkJMHg4MDAwMDAwMAkvLyBKVU1QCisjZGVmaW5lIFJQU19MRFJFRwkJMHg5MDAwMDEwMAkvLyBMRFJFRyAoMSB1aW50MzJfdCBvbmx5KQorI2RlZmluZSBSUFNfU1RSRUcJCTB4QTAwMDAxMDAJLy8gU1RSRUcgKDEgdWludDMyX3Qgb25seSkKKyNkZWZpbmUgUlBTX1NUT1AJCTB4NTAwMDAwMDAJLy8gU1RPUAorI2RlZmluZSBSUFNfSVJRICAgICAgICAgICAgICAgICAweDYwMDAwMDAwCS8vIElSUQorCisjZGVmaW5lIFJQU19MT0dJQ0FMX09SCQkweDA4MDAwMDAwCS8vIExvZ2ljYWwgT1IgY29uZGl0aW9uYWxzLgorI2RlZmluZSBSUFNfSU5WRVJUCQkweDA0MDAwMDAwCS8vIFRlc3QgZm9yIG5lZ2F0ZWQgc2VtYXBob3Jlcy4KKyNkZWZpbmUgUlBTX0RFQkkJCTB4MDAwMDAwMDIJLy8gREVCSSBkb25lCisKKyNkZWZpbmUgUlBTX1NJRzAJCTB4MDAyMDAwMDAJLy8gUlBTIHNlbWFwaG9yZSAwICh1c2VkIGJ5IEFEQykuCisjZGVmaW5lIFJQU19TSUcxCQkweDAwNDAwMDAwCS8vIFJQUyBzZW1hcGhvcmUgMSAodXNlZCBieSBEQUMpLgorI2RlZmluZSBSUFNfU0lHMgkJMHgwMDgwMDAwMAkvLyBSUFMgc2VtYXBob3JlIDIgKG5vdCB1c2VkKS4KKyNkZWZpbmUgUlBTX0dQSU8yCQkweDAwMDgwMDAwCS8vIFJQUyBHUElPMgorI2RlZmluZSBSUFNfR1BJTzMJCTB4MDAxMDAwMDAJLy8gUlBTIEdQSU8zCisKKyNkZWZpbmUgUlBTX1NJR0FEQwkJUlBTX1NJRzAJLy8gVHJpZ2dlci9zdGF0dXMgZm9yIEFEQydzIFJQUyBwcm9ncmFtLgorI2RlZmluZSBSUFNfU0lHREFDCQlSUFNfU0lHMQkvLyBUcmlnZ2VyL3N0YXR1cyBmb3IgREFDJ3MgUlBTIHByb2dyYW0uCisKKy8vIFJQUyBjbG9jayBwYXJhbWV0ZXJzLgorI2RlZmluZSBSUFNDTEtfU0NBTEFSCQk4CS8vIFRoaXMgaXMgYXBwYXJlbnQgcmF0aW8gb2YgUENJL1JQUyBjbGtzICh1bmRvY3VtZW50ZWQhISkuCisjZGVmaW5lIFJQU0NMS19QRVJfVVMJCSggMzMgLyBSUFNDTEtfU0NBTEFSICkJLy8gTnVtYmVyIG9mIFJQUyBjbG9ja3MgaW4gb25lIG1pY3Jvc2Vjb25kLgorCisvLyBFdmVudCBjb3VudGVyIHNvdXJjZSBhZGRyZXNzZXMuCisjZGVmaW5lIFNCQV9SUFNfQTAJCTB4MjcJLy8gVGltZSBvZiBSUFMwIGJ1c3ksIGluIFBDSSBjbG9ja3MuCisKKy8vIEdQSU8gY29uc3RhbnRzLgorI2RlZmluZSBHUElPX0JBU0UJCTB4MTAwMDQwMDAJLy8gR1BJTyAwLDIsMyA9IGlucHV0cywgR1BJTzMgPSBJUlE7IEdQSU8xID0gb3V0LgorI2RlZmluZSBHUElPMV9MTwkJMHgwMDAwMDAwMAkvLyBHUElPMSBzZXQgdG8gTE9XLgorI2RlZmluZSBHUElPMV9ISQkJMHgwMDAwMTAwMAkvLyBHUElPMSBzZXQgdG8gSElHSC4KKworLy8gUHJpbWFyeSBTdGF0dXMgUmVnaXN0ZXIgKFBTUikgY29uc3RhbnRzLgorI2RlZmluZSBQU1JfREVCSV9FCQkweDAwMDQwMDAwCS8vIERFQkkgZXZlbnQgZmxhZy4KKyNkZWZpbmUgUFNSX0RFQklfUwkJMHgwMDA4MDAwMAkvLyBERUJJIHN0YXR1cyBmbGFnLgorI2RlZmluZSBQU1JfQTJfSU4JCTB4MDAwMDgwMDAJLy8gQXVkaW8gb3V0cHV0IERNQTIgcHJvdGVjdGlvbiBhZGRyZXNzIHJlYWNoZWQuCisjZGVmaW5lIFBTUl9BRk9VCQkweDAwMDAwODAwCS8vIEF1ZGlvIEZJRk8gdW5kZXIvb3ZlcmZsb3cgZGV0ZWN0ZWQuCisjZGVmaW5lIFBTUl9HUElPMgkJMHgwMDAwMDAyMAkvLyBHUElPMiBpbnB1dCBwaW46IDA9QWRjQnVzeSwgMT1BZGNJZGxlLgorI2RlZmluZSBQU1JfRUMwUwkJMHgwMDAwMDAwMQkvLyBFdmVudCBjb3VudGVyIDAgdGhyZXNob2xkIHJlYWNoZWQuCisKKy8vIFNlY29uZGFyeSBTdGF0dXMgUmVnaXN0ZXIgKFNTUikgY29uc3RhbnRzLgorI2RlZmluZSBTU1JfQUYyX09VVAkJMHgwMDAwMDIwMAkvLyBBdWRpbyAyIG91dHB1dCBGSUZPIHVuZGVyL292ZXJmbG93IGRldGVjdGVkLgorCisvLyBNYXN0ZXIgQ29udHJvbCBSZWdpc3RlciAxIChNQzEpIGNvbnN0YW50cy4KKyNkZWZpbmUgTUMxX1NPRlRfUkVTRVQJCTB4ODAwMDAwMDAJLy8gSW52b2tlIDcxNDYgc29mdCByZXNldC4KKyNkZWZpbmUgTUMxX1NIVVRET1dOCQkweDNGRkYwMDAwCS8vIFNodXQgZG93biBhbGwgTUMxLWNvbnRyb2xsZWQgZW5hYmxlcy4KKworI2RlZmluZSBNQzFfRVJQUzEJCTB4MjAwMAkvLyBlbmFiL2Rpc2FibGUgUlBTIHRhc2sgMS4KKyNkZWZpbmUgTUMxX0VSUFMwCQkweDEwMDAJLy8gZW5hYi9kaXNhYmxlIFJQUyB0YXNrIDAuCisjZGVmaW5lIE1DMV9ERUJJCQkweDA4MDAJLy8gZW5hYi9kaXNhYmxlIERFQkkgcGlucy4KKyNkZWZpbmUgTUMxX0FVRElPCQkweDAyMDAJLy8gZW5hYi9kaXNhYmxlIGF1ZGlvIHBvcnQgcGlucy4KKyNkZWZpbmUgTUMxX0kyQwkJCTB4MDEwMAkvLyBlbmFiL2Rpc2FibGUgSTJDIGludGVyZmFjZS4KKyNkZWZpbmUgTUMxX0EyT1VUCQkweDAwMDgJLy8gZW5hYi9kaXNhYmxlIHRyYW5zZmVyIG9uIEEyIG91dC4KKyNkZWZpbmUgTUMxX0EySU4JCTB4MDAwNAkvLyBlbmFiL2Rpc2FibGUgdHJhbnNmZXIgb24gQTIgaW4uCisjZGVmaW5lIE1DMV9BMUlOCQkweDAwMDEJLy8gZW5hYi9kaXNhYmxlIHRyYW5zZmVyIG9uIEExIGluLgorCisvLyBNYXN0ZXIgQ29udHJvbCBSZWdpc3RlciAyIChNQzIpIGNvbnN0YW50cy4KKyNkZWZpbmUgTUMyX1VQTERfREVCSXEJCTB4MDAwMjAwMDIJLy8gVXBsb2FkIERFQkkgcmVnaXN0ZXJzLgorI2RlZmluZSBNQzJfVVBMRF9JSUNxCQkweDAwMDEwMDAxCS8vIFVwbG9hZCBJMkMgcmVnaXN0ZXJzLgorI2RlZmluZSBNQzJfUlBTU0lHMl9PTnEJCTB4MjAwMDIwMDAJLy8gQXNzZXJ0IFJQU19TSUcyLgorI2RlZmluZSBNQzJfUlBTU0lHMV9PTnEJCTB4MTAwMDEwMDAJLy8gQXNzZXJ0IFJQU19TSUcxLgorI2RlZmluZSBNQzJfUlBTU0lHMF9PTnEJCTB4MDgwMDA4MDAJLy8gQXNzZXJ0IFJQU19TSUcwLgorI2RlZmluZSBNQzJfVVBMRF9ERUJJX01BU0txCTB4MDAwMDAwMDIJLy8gVXBsb2FkIERFQkkgbWFzay4KKyNkZWZpbmUgTUMyX1VQTERfSUlDX01BU0txCTB4MDAwMDAwMDEJLy8gVXBsb2FkIEkyQyBtYXNrLgorI2RlZmluZSBNQzJfUlBTU0lHMl9NQVNLcQkweDAwMDAyMDAwCS8vIFJQU19TSUcyIGJpdCBtYXNrLgorI2RlZmluZSBNQzJfUlBTU0lHMV9NQVNLcQkweDAwMDAxMDAwCS8vIFJQU19TSUcxIGJpdCBtYXNrLgorI2RlZmluZSBNQzJfUlBTU0lHMF9NQVNLcQkweDAwMDAwODAwCS8vIFJQU19TSUcwIGJpdCBtYXNrLgorCisjZGVmaW5lIE1DMl9ERUxBWVRSSUdfNFVTcQlNQzJfUlBTU0lHMV9PTgorI2RlZmluZSBNQzJfREVMQVlCVVNZXzRVU3EJTUMyX1JQU1NJRzFfTUFTSworCisjZGVmaW5lCU1DMl9ERUxBWVRSSUdfNlVTcQlNQzJfUlBTU0lHMl9PTgorI2RlZmluZSBNQzJfREVMQVlCVVNZXzZVU3EJTUMyX1JQU1NJRzJfTUFTSworCisjZGVmaW5lIE1DMl9VUExEX0RFQkkJCTB4MDAwMgkvLyBVcGxvYWQgREVCSS4KKyNkZWZpbmUgTUMyX1VQTERfSUlDCQkweDAwMDEJLy8gVXBsb2FkIEkyQy4KKyNkZWZpbmUgTUMyX1JQU1NJRzIJCTB4MjAwMAkvLyBSUFMgc2lnbmFsIDIgKG5vdCB1c2VkKS4KKyNkZWZpbmUgTUMyX1JQU1NJRzEJCTB4MTAwMAkvLyBSUFMgc2lnbmFsIDEgKERBQyBSUFMgYnVzeSkuCisjZGVmaW5lIE1DMl9SUFNTSUcwCQkweDA4MDAJLy8gUlBTIHNpZ25hbCAwIChBREMgUlBTIGJ1c3kpLgorCisjZGVmaW5lIE1DMl9BRENfUlBTCQlNQzJfUlBTU0lHMAkvLyBBREMgUlBTIGJ1c3kuCisjZGVmaW5lIE1DMl9EQUNfUlBTCQlNQzJfUlBTU0lHMQkvLyBEQUMgUlBTIGJ1c3kuCisKKy8vLy8vLy8vLy8vLy8vLy8vLy9vbGRpZXMvLy8vLy8vLy8vLworI2RlZmluZSBNQzJfVVBMRF9ERUJJUQkJMHgwMDAyMDAwMgkvLyBVcGxvYWQgREVCSSByZWdpc3RlcnMuCisjZGVmaW5lIE1DMl9VUExEX0lJQ1EJCTB4MDAwMTAwMDEJLy8gVXBsb2FkIEkyQyByZWdpc3RlcnMuCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIFBDSSBCVVMgKFNBQTcxNDYpIFJFR0lTVEVSIEFERFJFU1MgT0ZGU0VUUyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgUF9QQ0lfQlRfQQkJMHgwMDRDCS8vIEF1ZGlvIERNQQorCQkJCQkJLy8gYnVyc3QvdGhyZXNob2xkCisJCQkJCQkvLyBjb250cm9sLgorI2RlZmluZSBQX0RFQklDRkcgICAgICAgICAgICAgICAweDAwN0MJLy8gREVCSSBjb25maWd1cmF0aW9uLgorI2RlZmluZSBQX0RFQklDTUQgICAgICAgICAgICAgICAweDAwODAJLy8gREVCSSBjb21tYW5kLgorI2RlZmluZSBQX0RFQklQQUdFICAgICAgICAgICAgICAweDAwODQJLy8gREVCSSBwYWdlLgorI2RlZmluZSBQX0RFQklBRCAgICAgICAgICAgICAgICAweDAwODgJLy8gREVCSSB0YXJnZXQgYWRkcmVzcy4KKyNkZWZpbmUgUF9JMkNDVFJMICAgICAgICAgICAgICAgMHgwMDhDCS8vIEkyQyBjb250cm9sLgorI2RlZmluZSBQX0kyQ1NUQVQgICAgICAgICAgICAgICAweDAwOTAJLy8gSTJDIHN0YXR1cy4KKyNkZWZpbmUgUF9CQVNFQTJfSU4JCTB4MDBBQwkvLyBBdWRpbyBpbnB1dCAyIGJhc2UKKwkJCQkJCS8vIHBoeXNpY2FsIERNQWJ1ZgorCQkJCQkJLy8gYWRkcmVzcy4KKyNkZWZpbmUgUF9QUk9UQTJfSU4JCTB4MDBCMAkvLyBBdWRpbyBpbnB1dCAyCisJCQkJCQkvLyBwaHlzaWNhbCBETUFidWYKKwkJCQkJCS8vIHByb3RlY3Rpb24gYWRkcmVzcy4KKyNkZWZpbmUgUF9QQUdFQTJfSU4JCTB4MDBCNAkvLyBBdWRpbyBpbnB1dCAyCisJCQkJCQkvLyBwYWdpbmcgYXR0cmlidXRlcy4KKyNkZWZpbmUgUF9CQVNFQTJfT1VUCQkweDAwQjgJLy8gQXVkaW8gb3V0cHV0IDIgYmFzZQorCQkJCQkJLy8gcGh5c2ljYWwgRE1BYnVmCisJCQkJCQkvLyBhZGRyZXNzLgorI2RlZmluZSBQX1BST1RBMl9PVVQJCTB4MDBCQwkvLyBBdWRpbyBvdXRwdXQgMgorCQkJCQkJLy8gcGh5c2ljYWwgRE1BYnVmCisJCQkJCQkvLyBwcm90ZWN0aW9uIGFkZHJlc3MuCisjZGVmaW5lIFBfUEFHRUEyX09VVAkJMHgwMEMwCS8vIEF1ZGlvIG91dHB1dCAyCisJCQkJCQkvLyBwYWdpbmcgYXR0cmlidXRlcy4KKyNkZWZpbmUgUF9SUFNQQUdFMCAgICAgICAgICAgICAgMHgwMEM0CS8vIFJQUzAgcGFnZS4KKyNkZWZpbmUgUF9SUFNQQUdFMSAgICAgICAgICAgICAgMHgwMEM4CS8vIFJQUzEgcGFnZS4KKyNkZWZpbmUgUF9SUFMwX1RPVVQJCTB4MDBENAkvLyBSUFMwIHRpbWUtb3V0LgorI2RlZmluZSBQX1JQUzFfVE9VVAkJMHgwMEQ4CS8vIFJQUzEgdGltZS1vdXQuCisjZGVmaW5lIFBfSUVSICAgICAgICAgICAgICAgICAgIDB4MDBEQwkvLyBJbnRlcnJ1cHQgZW5hYmxlLgorI2RlZmluZSBQX0dQSU8gICAgICAgICAgICAgICAgICAweDAwRTAJLy8gR2VuZXJhbC1wdXJwb3NlIEkvTy4KKyNkZWZpbmUgUF9FQzFTU1IJCTB4MDBFNAkvLyBFdmVudCBjb3VudGVyIHNldCAxCisJCQkJCQkvLyBzb3VyY2Ugc2VsZWN0LgorI2RlZmluZSBQX0VDVDFSCQkJMHgwMEVDCS8vIEV2ZW50IGNvdW50ZXIKKwkJCQkJCS8vIHRocmVzaG9sZCBzZXQgMS4KKyNkZWZpbmUgUF9BQ09OMSAgICAgICAgICAgICAgICAgMHgwMEY0CS8vIEF1ZGlvIGNvbnRyb2wgMS4KKyNkZWZpbmUgUF9BQ09OMiAgICAgICAgICAgICAgICAgMHgwMEY4CS8vIEF1ZGlvIGNvbnRyb2wgMi4KKyNkZWZpbmUgUF9NQzEgICAgICAgICAgICAgICAgICAgMHgwMEZDCS8vIE1hc3RlciBjb250cm9sIDEuCisjZGVmaW5lIFBfTUMyICAgICAgICAgICAgICAgICAgIDB4MDEwMAkvLyBNYXN0ZXIgY29udHJvbCAyLgorI2RlZmluZSBQX1JQU0FERFIwICAgICAgICAgICAgICAweDAxMDQJLy8gUlBTMCBpbnN0cnVjdGlvbiBwb2ludGVyLgorI2RlZmluZSBQX1JQU0FERFIxICAgICAgICAgICAgICAweDAxMDgJLy8gUlBTMSBpbnN0cnVjdGlvbiBwb2ludGVyLgorI2RlZmluZSBQX0lTUiAgICAgICAgICAgICAgICAgICAweDAxMEMJLy8gSW50ZXJydXB0IHN0YXR1cy4KKyNkZWZpbmUgUF9QU1IgICAgICAgICAgICAgICAgICAgMHgwMTEwCS8vIFByaW1hcnkgc3RhdHVzLgorI2RlZmluZSBQX1NTUiAgICAgICAgICAgICAgICAgICAweDAxMTQJLy8gU2Vjb25kYXJ5IHN0YXR1cy4KKyNkZWZpbmUgUF9FQzFSCQkJMHgwMTE4CS8vIEV2ZW50IGNvdW50ZXIgc2V0IDEuCisjZGVmaW5lIFBfQURQNAkJCTB4MDEzOAkvLyBMb2dpY2FsIGF1ZGlvIERNQQorCQkJCQkJLy8gcG9pbnRlciBvZiBhdWRpbworCQkJCQkJLy8gaW5wdXQgRklGTyBBMl9JTi4KKyNkZWZpbmUgUF9GQl9CVUZGRVIxICAgICAgICAgICAgMHgwMTQ0CS8vIEF1ZGlvIGZlZWRiYWNrIGJ1ZmZlciAxLgorI2RlZmluZSBQX0ZCX0JVRkZFUjIgICAgICAgICAgICAweDAxNDgJLy8gQXVkaW8gZmVlZGJhY2sgYnVmZmVyIDIuCisjZGVmaW5lIFBfVFNMMSAgICAgICAgICAgICAgICAgIDB4MDE4MAkvLyBBdWRpbyB0aW1lIHNsb3QgbGlzdCAxLgorI2RlZmluZSBQX1RTTDIgICAgICAgICAgICAgICAgICAweDAxQzAJLy8gQXVkaW8gdGltZSBzbG90IGxpc3QgMi4KKworLy8gTE9DQUwgQlVTIChHQVRFIEFSUkFZKSBSRUdJU1RFUiBBRERSRVNTIE9GRlNFVFMgLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFuYWxvZyBJL08gcmVnaXN0ZXJzOgorI2RlZmluZSBMUF9EQUNQT0wJCTB4MDA4MgkvLyAgV3JpdGUgREFDIHBvbGFyaXR5LgorI2RlZmluZSBMUF9HU0VMCQkJMHgwMDg0CS8vICBXcml0ZSBBREMgZ2Fpbi4KKyNkZWZpbmUgTFBfSVNFTAkJCTB4MDA4NgkvLyAgV3JpdGUgQURDIGNoYW5uZWwgc2VsZWN0LgorLy8gRGlnaXRhbCBJL08gKHdyaXRlIG9ubHkpOgorI2RlZmluZSBMUF9XUklOVFNFTEEJCTB4MDA0MgkvLyAgV3JpdGUgQSBpbnRlcnJ1cHQgZW5hYmxlLgorI2RlZmluZSBMUF9XUkVER1NFTEEJCTB4MDA0NAkvLyAgV3JpdGUgQSBlZGdlIHNlbGVjdGlvbi4KKyNkZWZpbmUgTFBfV1JDQVBTRUxBCQkweDAwNDYJLy8gIFdyaXRlIEEgY2FwdHVyZSBlbmFibGUuCisjZGVmaW5lIExQX1dSRE9VVEEJCTB4MDA0OAkvLyAgV3JpdGUgQSBkaWdpdGFsIG91dHB1dC4KKyNkZWZpbmUgTFBfV1JJTlRTRUxCCQkweDAwNTIJLy8gIFdyaXRlIEIgaW50ZXJydXB0IGVuYWJsZS4KKyNkZWZpbmUgTFBfV1JFREdTRUxCCQkweDAwNTQJLy8gIFdyaXRlIEIgZWRnZSBzZWxlY3Rpb24uCisjZGVmaW5lIExQX1dSQ0FQU0VMQgkJMHgwMDU2CS8vICBXcml0ZSBCIGNhcHR1cmUgZW5hYmxlLgorI2RlZmluZSBMUF9XUkRPVVRCCQkweDAwNTgJLy8gIFdyaXRlIEIgZGlnaXRhbCBvdXRwdXQuCisjZGVmaW5lIExQX1dSSU5UU0VMQwkJMHgwMDYyCS8vICBXcml0ZSBDIGludGVycnVwdCBlbmFibGUuCisjZGVmaW5lIExQX1dSRURHU0VMQwkJMHgwMDY0CS8vICBXcml0ZSBDIGVkZ2Ugc2VsZWN0aW9uLgorI2RlZmluZSBMUF9XUkNBUFNFTEMJCTB4MDA2NgkvLyAgV3JpdGUgQyBjYXB0dXJlIGVuYWJsZS4KKyNkZWZpbmUgTFBfV1JET1VUQwkJMHgwMDY4CS8vICBXcml0ZSBDIGRpZ2l0YWwgb3V0cHV0LgorCisvLyBEaWdpdGFsIEkvTyAocmVhZCBvbmx5KToKKyNkZWZpbmUgTFBfUkRESU5BCQkweDAwNDAJLy8gIFJlYWQgZGlnaXRhbCBpbnB1dC4KKyNkZWZpbmUgTFBfUkRDQVBGTEdBCQkweDAwNDgJLy8gIFJlYWQgZWRnZXMgY2FwdHVyZWQuCisjZGVmaW5lIExQX1JESU5UU0VMQQkJMHgwMDRBCS8vICBSZWFkIGludGVycnVwdAorCQkJCQkJLy8gIGVuYWJsZSByZWdpc3Rlci4KKyNkZWZpbmUgTFBfUkRFREdTRUxBCQkweDAwNEMJLy8gIFJlYWQgZWRnZQorCQkJCQkJLy8gIHNlbGVjdGlvbgorCQkJCQkJLy8gIHJlZ2lzdGVyLgorI2RlZmluZSBMUF9SRENBUFNFTEEJCTB4MDA0RQkvLyAgUmVhZCBjYXB0dXJlCisJCQkJCQkvLyAgZW5hYmxlIHJlZ2lzdGVyLgorI2RlZmluZSBMUF9SRERJTkIJCTB4MDA1MAkvLyAgUmVhZCBkaWdpdGFsIGlucHV0LgorI2RlZmluZSBMUF9SRENBUEZMR0IJCTB4MDA1OAkvLyAgUmVhZCBlZGdlcyBjYXB0dXJlZC4KKyNkZWZpbmUgTFBfUkRJTlRTRUxCCQkweDAwNUEJLy8gIFJlYWQgaW50ZXJydXB0CisJCQkJCQkvLyAgZW5hYmxlIHJlZ2lzdGVyLgorI2RlZmluZSBMUF9SREVER1NFTEIJCTB4MDA1QwkvLyAgUmVhZCBlZGdlCisJCQkJCQkvLyAgc2VsZWN0aW9uCisJCQkJCQkvLyAgcmVnaXN0ZXIuCisjZGVmaW5lIExQX1JEQ0FQU0VMQgkJMHgwMDVFCS8vICBSZWFkIGNhcHR1cmUKKwkJCQkJCS8vICBlbmFibGUgcmVnaXN0ZXIuCisjZGVmaW5lIExQX1JERElOQwkJMHgwMDYwCS8vICBSZWFkIGRpZ2l0YWwgaW5wdXQuCisjZGVmaW5lIExQX1JEQ0FQRkxHQwkJMHgwMDY4CS8vICBSZWFkIGVkZ2VzIGNhcHR1cmVkLgorI2RlZmluZSBMUF9SRElOVFNFTEMJCTB4MDA2QQkvLyAgUmVhZCBpbnRlcnJ1cHQKKwkJCQkJCS8vICBlbmFibGUgcmVnaXN0ZXIuCisjZGVmaW5lIExQX1JERURHU0VMQwkJMHgwMDZDCS8vICBSZWFkIGVkZ2UKKwkJCQkJCS8vICBzZWxlY3Rpb24KKwkJCQkJCS8vICByZWdpc3Rlci4KKyNkZWZpbmUgTFBfUkRDQVBTRUxDCQkweDAwNkUJLy8gIFJlYWQgY2FwdHVyZQorCQkJCQkJLy8gIGVuYWJsZSByZWdpc3Rlci4KKy8vIENvdW50ZXIgUmVnaXN0ZXJzIChyZWFkL3dyaXRlKToKKyNkZWZpbmUgTFBfQ1IwQQkJCTB4MDAwMAkvLyAgMEEgc2V0dXAgcmVnaXN0ZXIuCisjZGVmaW5lIExQX0NSMEIJCQkweDAwMDIJLy8gIDBCIHNldHVwIHJlZ2lzdGVyLgorI2RlZmluZSBMUF9DUjFBCQkJMHgwMDA0CS8vICAxQSBzZXR1cCByZWdpc3Rlci4KKyNkZWZpbmUgTFBfQ1IxQgkJCTB4MDAwNgkvLyAgMUIgc2V0dXAgcmVnaXN0ZXIuCisjZGVmaW5lIExQX0NSMkEJCQkweDAwMDgJLy8gIDJBIHNldHVwIHJlZ2lzdGVyLgorI2RlZmluZSBMUF9DUjJCCQkJMHgwMDBBCS8vICAyQiBzZXR1cCByZWdpc3Rlci4KKy8vIENvdW50ZXIgUHJlTG9hZCAod3JpdGUpIGFuZCBMYXRjaCAocmVhZCkgUmVnaXN0ZXJzOgorI2RlZmluZQlMUF9DTlRSMEFMU1cJCTB4MDAwQwkvLyAgMEEgbHN3LgorI2RlZmluZQlMUF9DTlRSMEFNU1cJCTB4MDAwRQkvLyAgMEEgbXN3LgorI2RlZmluZQlMUF9DTlRSMEJMU1cJCTB4MDAxMAkvLyAgMEIgbHN3LgorI2RlZmluZQlMUF9DTlRSMEJNU1cJCTB4MDAxMgkvLyAgMEIgbXN3LgorI2RlZmluZQlMUF9DTlRSMUFMU1cJCTB4MDAxNAkvLyAgMUEgbHN3LgorI2RlZmluZQlMUF9DTlRSMUFNU1cJCTB4MDAxNgkvLyAgMUEgbXN3LgorI2RlZmluZQlMUF9DTlRSMUJMU1cJCTB4MDAxOAkvLyAgMUIgbHN3LgorI2RlZmluZQlMUF9DTlRSMUJNU1cJCTB4MDAxQQkvLyAgMUIgbXN3LgorI2RlZmluZQlMUF9DTlRSMkFMU1cJCTB4MDAxQwkvLyAgMkEgbHN3LgorI2RlZmluZQlMUF9DTlRSMkFNU1cJCTB4MDAxRQkvLyAgMkEgbXN3LgorI2RlZmluZQlMUF9DTlRSMkJMU1cJCTB4MDAyMAkvLyAgMkIgbHN3LgorI2RlZmluZQlMUF9DTlRSMkJNU1cJCTB4MDAyMgkvLyAgMkIgbXN3LgorLy8gTWlzY2VsbGFuZW91cyBSZWdpc3RlcnMgKHJlYWQvd3JpdGUpOgorI2RlZmluZSBMUF9NSVNDMQkJMHgwMDg4CS8vICBSZWFkL3dyaXRlIE1pc2MxLgorI2RlZmluZSBMUF9XUk1JU0MyCQkweDAwOTAJLy8gIFdyaXRlIE1pc2MyLgorI2RlZmluZSBMUF9SRE1JU0MyCQkweDAwODIJLy8gIFJlYWQgTWlzYzIuCisKKy8vIEJpdCBtYXNrcyBmb3IgTUlTQzEgcmVnaXN0ZXIgdGhhdCBhcmUgdGhlIHNhbWUgZm9yIHJlYWRzIGFuZCB3cml0ZXMuCisjZGVmaW5lIE1JU0MxX1dFTkFCTEUJCTB4ODAwMAkvLyBlbmFiIHdyaXRlcyB0bworCQkJCQkJLy8gTUlTQzIgKGV4Y2VwdCBDbGVhcgorCQkJCQkJLy8gV2F0Y2hkb2cgYml0KS4KKyNkZWZpbmUgTUlTQzFfV0RJU0FCTEUJCTB4MDAwMAkvLyBEaXNhYmxlIHdyaXRlcyB0byBNSVNDMi4KKyNkZWZpbmUgTUlTQzFfRURDQVAJCTB4MTAwMAkvLyBlbmFiIGVkZ2UgY2FwdHVyZQorCQkJCQkJLy8gb24gRElPIGNoYW5zCisJCQkJCQkvLyBzcGVjaWZpZWQgYnkKKwkJCQkJCS8vIExQX1dSQ0FQU0VMeC4KKyNkZWZpbmUgTUlTQzFfTk9FRENBUAkJMHgwMDAwCS8vIERpc2FibGUgZWRnZQorCQkJCQkJLy8gY2FwdHVyZSBvbgorCQkJCQkJLy8gc3BlY2lmaWVkIERJTworCQkJCQkJLy8gY2hhbnMuCisKKy8vIEJpdCBtYXNrcyBmb3IgTUlTQzEgcmVnaXN0ZXIgcmVhZHMuCisjZGVmaW5lIFJETUlTQzFfV0RUSU1FT1VUCTB4NDAwMAkvLyBXYXRjaGRvZyB0aW1lciB0aW1lZCBvdXQuCisKKy8vIEJpdCBtYXNrcyBmb3IgTUlTQzIgcmVnaXN0ZXIgd3JpdGVzLgorI2RlZmluZSBXUk1JU0MyX1dEQ0xFQVIJCTB4ODAwMAkvLyBSZXNldCB3YXRjaGRvZworCQkJCQkJLy8gdGltZXIgdG8gemVyby4KKyNkZWZpbmUgV1JNSVNDMl9DSEFSR0VfRU5BQkxFCTB4NDAwMAkvLyBlbmFiIGJhdHRlcnkKKwkJCQkJCS8vIHRyaWNrbGUgY2hhcmdpbmcuCisKKy8vIEJpdCBtYXNrcyBmb3IgTUlTQzIgcmVnaXN0ZXIgdGhhdCBhcmUgdGhlIHNhbWUgZm9yIHJlYWRzIGFuZCB3cml0ZXMuCisjZGVmaW5lIE1JU0MyX0JBVFRfRU5BQkxFCTB4MDAwOAkvLyBCYWNrdXAgYmF0dGVyeSBlbmFibGUuCisjZGVmaW5lIE1JU0MyX1dERU5BQkxFCQkweDAwMDQJLy8gV2F0Y2hkb2cgdGltZXIgZW5hYmxlLgorI2RlZmluZSBNSVNDMl9XRFBFUklPRF9NQVNLCTB4MDAwMwkvLyBXYXRjaGRvZyBpbnRlcnZhbAorCQkJCQkJLy8gc2VsZWN0IG1hc2suCisKKy8vIEJpdCBtYXNrcyBmb3IgQUNPTjEgcmVnaXN0ZXIuCisjZGVmaW5lIEEyX1JVTgkJCTB4NDAwMDAwMDAJLy8gUnVuIEEyIGJhc2VkIG9uIFRTTDIuCisjZGVmaW5lIEExX1JVTgkJCTB4MjAwMDAwMDAJLy8gUnVuIEExIGJhc2VkIG9uIFRTTDEuCisjZGVmaW5lIEExX1NXQVAJCQkweDAwMjAwMDAwCS8vIFVzZSBiaWctZW5kaWFuIGZvciBBMS4KKyNkZWZpbmUgQTJfU1dBUAkJCTB4MDAxMDAwMDAJLy8gVXNlIGJpZy1lbmRpYW4gZm9yIEEyLgorI2RlZmluZSBXU19NT0RFUwkJMHgwMDAxOTk5OQkvLyBXUzAgPSBUU0wxIHRyaWdnZXIKKwkJCQkJCS8vIGlucHV0LCBXUzEtV1M0ID0KKwkJCQkJCS8vIENTKiBvdXRwdXRzLgorCisjaWYgUExBVEZPUk0gPT0gSU5URUwJCS8vIEJhc2UgQUNPTjEgY29uZmlnOgorCQkJCQkJLy8gYWx3YXlzIHJ1biBBMSBiYXNlZAorCQkJCQkJLy8gb24gVFNMMS4KKyNkZWZpbmUgQUNPTjFfQkFTRQkJKCBXU19NT0RFUyB8IEExX1JVTiApCisjZWxpZiBQTEFURk9STSA9PSBNT1RPUk9MQQorI2RlZmluZSBBQ09OMV9CQVNFCQkoIFdTX01PREVTIHwgQTFfUlVOIHwgQTFfU1dBUCB8IEEyX1NXQVAgKQorI2VuZGlmCisKKyNkZWZpbmUgQUNPTjFfQURDU1RBUlQJCUFDT04xX0JBU0UJLy8gU3RhcnQgQURDOiBydW4gQTEKKwkJCQkJCS8vIGJhc2VkIG9uIFRTTDEuCisjZGVmaW5lIEFDT04xX0RBQ1NUQVJUCQkoIEFDT04xX0JBU0UgfCBBMl9SVU4gKQkvLyBTdGFydAorCQkJCQkJCS8vIHRyYW5zbWl0IHRvCisJCQkJCQkJLy8gREFDOiBydW4gQTIKKwkJCQkJCQkvLyBiYXNlZCBvbgorCQkJCQkJCS8vIFRTTDIuCisjZGVmaW5lIEFDT04xX0RBQ1NUT1AJCUFDT04xX0JBU0UJLy8gSGFsdCBBMi4KKworLy8gQml0IG1hc2tzIGZvciBBQ09OMiByZWdpc3Rlci4KKyNkZWZpbmUgQTFfQ0xLU1JDX0JDTEsxCQkweDAwMDAwMDAwCS8vIEExIGJpdCByYXRlID0gQkNMSzEgKEFEQykuCisjZGVmaW5lIEEyX0NMS1NSQ19YMQkJMHgwMDgwMDAwMAkvLyBBMiBiaXQgcmF0ZSA9IEFDTEsvMSAoREFDcykuCisjZGVmaW5lIEEyX0NMS1NSQ19YMgkJMHgwMEMwMDAwMAkvLyBBMiBiaXQgcmF0ZSA9IEFDTEsvMiAoREFDcykuCisjZGVmaW5lIEEyX0NMS1NSQ19YNAkJMHgwMTQwMDAwMAkvLyBBMiBiaXQgcmF0ZSA9IEFDTEsvNCAoREFDcykuCisjZGVmaW5lIElOVkVSVF9CQ0xLMgkJMHgwMDEwMDAwMAkvLyBJbnZlcnQgQkNMSzIgKERBQ3MpLgorI2RlZmluZSBCQ0xLMl9PRQkJMHgwMDA0MDAwMAkvLyBlbmFiIEJDTEsyIChEQUNzKS4KKyNkZWZpbmUgQUNPTjJfWE9STUFTSwkJMHgwMDBDMDAwMAkvLyBYT1IgbWFzayBmb3IgQUNPTjIKKwkJCQkJCS8vIGFjdGl2ZS1sb3cgYml0cy4KKworI2RlZmluZSBBQ09OMl9JTklUCQkoIEFDT04yX1hPUk1BU0sgXiAoIEExX0NMS1NSQ19CQ0xLMSB8IEEyX0NMS1NSQ19YMiB8IElOVkVSVF9CQ0xLMiB8IEJDTEsyX09FICkgKQorCisvLyBCaXQgbWFza3MgZm9yIHRpbWVzbG90IHJlY29yZHMuCisjZGVmaW5lIFdTMQkJICAgICAJMHg0MDAwMDAwMAkvLyBXUyBvdXRwdXQgdG8gYXNzZXJ0LgorI2RlZmluZSBXUzIJCSAgICAgCTB4MjAwMDAwMDAKKyNkZWZpbmUgV1MzCQkgICAgIAkweDEwMDAwMDAwCisjZGVmaW5lIFdTNAkJICAgICAJMHgwODAwMDAwMAorI2RlZmluZSBSU0QxCQkJMHgwMTAwMDAwMAkvLyBTaGlmdCBBMSBkYXRhIGluIG9uIFNEMS4KKyNkZWZpbmUgU0RXX0ExCQkJMHgwMDgwMDAwMAkvLyBTdG9yZSByY3YnZCBjaGFyIGF0CisJCQkJCQkvLyBuZXh0IGNoYXIgc2xvdCBvZgorCQkJCQkJLy8gRFdPUkQxIGJ1ZmZlci4KKyNkZWZpbmUgU0lCX0ExCQkJMHgwMDQwMDAwMAkvLyBTdG9yZSByY3YnZCBjaGFyIGF0CisJCQkJCQkvLyBuZXh0IGNoYXIgc2xvdCBvZgorCQkJCQkJLy8gRkIxIGJ1ZmZlci4KKyNkZWZpbmUgU0ZfQTEJCQkweDAwMjAwMDAwCS8vIFdyaXRlIHVuc2lnbmVkIGxvbmcKKwkJCQkJCS8vIGJ1ZmZlciB0byBpbnB1dAorCQkJCQkJLy8gRklGTy4KKworLy9TZWxlY3QgcGFyYWxsZWwtdG8tc2VyaWFsIGNvbnZlcnRlcidzIGRhdGEgc291cmNlOgorI2RlZmluZSBYRklGT18wCQkJMHgwMDAwMDAwMAkvLyAgIERhdGEgZmlmbyBieXRlIDAuCisjZGVmaW5lIFhGSUZPXzEJCQkweDAwMDAwMDEwCS8vICAgRGF0YSBmaWZvIGJ5dGUgMS4KKyNkZWZpbmUgWEZJRk9fMgkJCTB4MDAwMDAwMjAJLy8gICBEYXRhIGZpZm8gYnl0ZSAyLgorI2RlZmluZSBYRklGT18zCQkJMHgwMDAwMDAzMAkvLyAgIERhdGEgZmlmbyBieXRlIDMuCisjZGVmaW5lIFhGQjAJCQkweDAwMDAwMDQwCS8vICAgRkJfQlVGRkVSIGJ5dGUgMC4KKyNkZWZpbmUgWEZCMQkJCTB4MDAwMDAwNTAJLy8gICBGQl9CVUZGRVIgYnl0ZSAxLgorI2RlZmluZSBYRkIyCQkJMHgwMDAwMDA2MAkvLyAgIEZCX0JVRkZFUiBieXRlIDIuCisjZGVmaW5lIFhGQjMJCQkweDAwMDAwMDcwCS8vICAgRkJfQlVGRkVSIGJ5dGUgMy4KKyNkZWZpbmUgU0lCX0EyCQkJMHgwMDAwMDIwMAkvLyBTdG9yZSBuZXh0IGR3b3JkCisJCQkJCQkvLyBmcm9tIEEyJ3MgaW5wdXQKKwkJCQkJCS8vIHNoaWZ0ZXIgdG8gRkIyCisJCQkJCQkvLyBidWZmZXIuCisjZGVmaW5lIFNGX0EyCQkJMHgwMDAwMDEwMAkvLyBTdG9yZSBuZXh0IGR3b3JkCisJCQkJCQkvLyBmcm9tIEEyJ3MgaW5wdXQKKwkJCQkJCS8vIHNoaWZ0ZXIgdG8gaXRzCisJCQkJCQkvLyBpbnB1dCBmaWZvLgorI2RlZmluZSBMRl9BMgkJCTB4MDAwMDAwODAJLy8gTG9hZCBuZXh0IGR3b3JkCisJCQkJCQkvLyBmcm9tIEEyJ3Mgb3V0cHV0CisJCQkJCQkvLyBmaWZvIGludG8gaXRzCisJCQkJCQkvLyBvdXRwdXQgZHdvcmQKKwkJCQkJCS8vIGJ1ZmZlci4KKyNkZWZpbmUgWFNEMgkJCTB4MDAwMDAwMDgJLy8gU2hpZnQgZGF0YSBvdXQgb24gU0QyLgorI2RlZmluZSBSU0QzCQkJMHgwMDAwMTgwMAkvLyBTaGlmdCBkYXRhIGluIG9uIFNEMy4KKyNkZWZpbmUgUlNEMgkJCTB4MDAwMDEwMDAJLy8gU2hpZnQgZGF0YSBpbiBvbiBTRDIuCisjZGVmaW5lIExPV19BMgkJCTB4MDAwMDAwMDIJLy8gRHJpdmUgbGFzdCBTRCBsb3cKKwkJCQkJCS8vIGZvciA3IGNsa3MsIHRoZW4KKwkJCQkJCS8vIHRyaS1zdGF0ZS4KKyNkZWZpbmUgRU9TCQkgICAgIAkweDAwMDAwMDAxCS8vIEVuZCBvZiBzdXBlcmZyYW1lLgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIEkyQyBjb25maWd1cmF0aW9uIGNvbnN0YW50cy4KKyNkZWZpbmUgSTJDX0NMS1NFTAkJMHgwNDAwCS8vIEkyQyBiaXQgcmF0ZSA9CisJCQkJCQkvLyBQQ0ljbGsvNDgwID0gNjguNzUKKwkJCQkJCS8vIEtIei4KKyNkZWZpbmUgSTJDX0JJVFJBVEUJCTY4Ljc1CS8vIEkyQyBidXMgZGF0YSBiaXQKKwkJCQkJCS8vIHJhdGUgKGRldGVybWluZWQgYnkKKwkJCQkJCS8vIEkyQ19DTEtTRUwpIGluIEtIei4KKyNkZWZpbmUgSTJDX1dSVElNRQkJMTUuMAkvLyBXb3JzdCBjYXNlIHRpbWUsaW4KKwkJCQkJCS8vIG1zZWMsIGZvciBFRVBST00KKwkJCQkJCS8vIGludGVybmFsIHdyaXRlIG9wLgorCisvLyBJMkMgbWFuaWZlc3QgY29uc3RhbnRzLgorCisvLyBNYXggcmV0cmllcyB0byB3YWl0IGZvciBFRVBST00gd3JpdGUuCisjZGVmaW5lIEkyQ19SRVRSSUVTCQkoIEkyQ19XUlRJTUUgKiBJMkNfQklUUkFURSAvIDkuMCApCisjZGVmaW5lIEkyQ19FUlIJCQkweDAwMDIJLy8gSTJDIGNvbnRyb2wvc3RhdHVzCisJCQkJCQkvLyBmbGFnIEVSUk9SLgorI2RlZmluZSBJMkNfQlVTWQkJMHgwMDAxCS8vIEkyQyBjb250cm9sL3N0YXR1cworCQkJCQkJLy8gZmxhZyBCVVNZLgorI2RlZmluZSBJMkNfQUJPUlQJCTB4MDA4MAkvLyBJMkMgc3RhdHVzIGZsYWcgQUJPUlQuCisjZGVmaW5lIEkyQ19BVFRSU1RBUlQJCTB4MwkvLyBJMkMgYXR0cmlidXRlIFNUQVJULgorI2RlZmluZSBJMkNfQVRUUkNPTlQJCTB4MgkvLyBJMkMgYXR0cmlidXRlIENPTlQuCisjZGVmaW5lIEkyQ19BVFRSU1RPUAkJMHgxCS8vIEkyQyBhdHRyaWJ1dGUgU1RPUC4KKyNkZWZpbmUgSTJDX0FUVFJOT1AJCTB4MAkvLyBJMkMgYXR0cmlidXRlIE5PUC4KKworLy8gSTJDIHJlYWQgY29tbWFuZCAgfCBFRVBST00gYWRkcmVzcy4KKyNkZWZpbmUgSTJDUgkJCSggZGV2cHJpdi0+STJDQWRycyB8IDEgKQorCisvLyBJMkMgd3JpdGUgY29tbWFuZCB8IEVFUFJPTSBhZGRyZXNzLgorI2RlZmluZSBJMkNXCQkJKCBkZXZwcml2LT5JMkNBZHJzICkKKworLy8gQ29kZSBtYWNyb3MgdXNlZCBmb3IgY29uc3RydWN0aW5nIEkyQyBjb21tYW5kIGJ5dGVzLgorI2RlZmluZSBJMkNfQjIoQVRUUixWQUwpCSggKCAoQVRUUikgPDwgNiApIHwgKCAoVkFMKSA8PCAyNCApICkKKyNkZWZpbmUgSTJDX0IxKEFUVFIsVkFMKQkoICggKEFUVFIpIDw8IDQgKSB8ICggKFZBTCkgPDwgMTYgKSApCisjZGVmaW5lIEkyQ19CMChBVFRSLFZBTCkJKCAoIChBVFRSKSA8PCAyICkgfCAoIChWQUwpIDw8ICA4ICkgKQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy9vbGRlc3QKKyNkZWZpbmUgUF9ERUJJQ0ZHcSAgICAgICAgICAgICAgMHgwMDdDCS8vIERFQkkgY29uZmlndXJhdGlvbi4KKyNkZWZpbmUgUF9ERUJJQ01EcSAgICAgICAgICAgICAgMHgwMDgwCS8vIERFQkkgY29tbWFuZC4KKyNkZWZpbmUgUF9ERUJJUEFHRXEgICAgICAgICAgICAgMHgwMDg0CS8vIERFQkkgcGFnZS4KKyNkZWZpbmUgUF9ERUJJQURxICAgICAgICAgICAgICAgMHgwMDg4CS8vIERFQkkgdGFyZ2V0IGFkZHJlc3MuCisKKyNkZWZpbmUgREVCSV9DRkdfVE9RCQkweDAzQzAwMDAwCS8vIHRpbWVvdXQgKDE1IFBDSSBjeWNsZXMpCisjZGVmaW5lIERFQklfQ0ZHX0ZBU1RRCQkweDEwMDAwMDAwCS8vIGZhc3QgbW9kZSBlbmFibGUKKyNkZWZpbmUgREVCSV9DRkdfMTZRCQkweDAwMDgwMDAwCS8vIDE2LWJpdCBhY2Nlc3MgZW5hYmxlCisjZGVmaW5lIERFQklfQ0ZHX0lOQ1EJCTB4MDAwNDAwMDAJLy8gZW5hYmxlIGFkZHJlc3MgaW5jcmVtZW50CisjZGVmaW5lIERFQklfQ0ZHX1RJTUVST0ZGUQkweDAwMDEwMDAwCS8vIGRpc2FibGUgdGltZXIKKyNkZWZpbmUgREVCSV9DTURfUkRRCQkweDAwMDUwMDAwCS8vIHJlYWQgaW1tZWRpYXRlIDIgYnl0ZXMKKyNkZWZpbmUgREVCSV9DTURfV1JRCQkweDAwMDQwMDAwCS8vIHdyaXRlIGltbWVkaWF0ZSAyIGJ5dGVzCisjZGVmaW5lIERFQklfUEFHRV9ESVNBQkxFUQkweDAwMDAwMDAwCS8vIHBhZ2luZyBkaXNhYmxlCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERFQkkgY29tbWFuZCBjb25zdGFudHMuCisjZGVmaW5lIERFQklfQ01EX1NJWkUxNgkJKCAyIDw8IDE3ICkJLy8gVHJhbnNmZXIgc2l6ZSBpcworCQkJCQkJLy8gYWx3YXlzIDIgYnl0ZXMuCisjZGVmaW5lIERFQklfQ01EX1JFQUQJCTB4MDAwMTAwMDAJLy8gUmVhZCBvcGVyYXRpb24uCisjZGVmaW5lIERFQklfQ01EX1dSSVRFCQkweDAwMDAwMDAwCS8vIFdyaXRlIG9wZXJhdGlvbi4KKworLy8gUmVhZCBpbW1lZGlhdGUgMiBieXRlcy4KKyNkZWZpbmUgREVCSV9DTURfUkRXT1JECQkoIERFQklfQ01EX1JFQUQgIHwgREVCSV9DTURfU0laRTE2ICkKKworLy8gV3JpdGUgaW1tZWRpYXRlIDIgYnl0ZXMuCisjZGVmaW5lIERFQklfQ01EX1dSV09SRAkJKCBERUJJX0NNRF9XUklURSB8IERFQklfQ01EX1NJWkUxNiApCisKKy8vIERFQkkgY29uZmlndXJhdGlvbiBjb25zdGFudHMuCisjZGVmaW5lIERFQklfQ0ZHX1hJUlFfRU4JMHg4MDAwMDAwMAkvLyBlbmFiIGV4dGVybmFsCisJCQkJCQkvLyBpbnRlcnJ1cHQgb24gR1BJTzMuCisjZGVmaW5lIERFQklfQ0ZHX1hSRVNVTUUJMHg0MDAwMDAwMAkvLyBSZXN1bWUgYmxvY2sKKwkJCQkJCS8vIHRyYW5zZmVyIHdoZW4gWElSUQorCQkJCQkJLy8gZGVhc3NlcnRlZC4KKyNkZWZpbmUgREVCSV9DRkdfRkFTVAkJMHgxMDAwMDAwMAkvLyBGYXN0IG1vZGUgZW5hYmxlLgorCisvLyA0LWJpdCBmaWVsZCB0aGF0IHNwZWNpZmllcyBERUJJIHRpbWVvdXQgdmFsdWUgaW4gUENJIGNsb2NrIGN5Y2xlczoKKyNkZWZpbmUgREVCSV9DRkdfVE9VVF9CSVQJMjIJLy8gICBGaW5pc2ggREVCSSBjeWNsZSBhZnRlcgorCQkJCQkvLyAgIHRoaXMgbWFueSBjbG9ja3MuCisKKy8vIDItYml0IGZpZWxkIHRoYXQgc3BlY2lmaWVzIEVuZGlhbiBieXRlIGxhbmUgc3RlZXJpbmc6CisjZGVmaW5lIERFQklfQ0ZHX1NXQVBfTk9ORQkweDAwMDAwMDAwCS8vICAgU3RyYWlnaHQgLSBkb24ndAorCQkJCQkJLy8gICBzd2FwIGFueSBieXRlcworCQkJCQkJLy8gICAoSW50ZWwpLgorI2RlZmluZSBERUJJX0NGR19TV0FQXzIJCTB4MDAxMDAwMDAJLy8gICAyLWJ5dGUgc3dhcCAoTW90b3JvbGEpLgorI2RlZmluZSBERUJJX0NGR19TV0FQXzQJCTB4MDAyMDAwMDAJLy8gICA0LWJ5dGUgc3dhcC4KKyNkZWZpbmUgREVCSV9DRkdfMTYJCTB4MDAwODAwMDAJLy8gU2xhdmUgaXMgYWJsZSB0bworCQkJCQkJLy8gc2VydmUgMTYtYml0CisJCQkJCQkvLyBjeWNsZXMuCisKKyNkZWZpbmUgREVCSV9DRkdfU0xBVkUxNgkweDAwMDgwMDAwCS8vIFNsYXZlIGlzIGFibGUgdG8KKwkJCQkJCS8vIHNlcnZlIDE2LWJpdAorCQkJCQkJLy8gY3ljbGVzLgorI2RlZmluZSBERUJJX0NGR19JTkMJCTB4MDAwNDAwMDAJLy8gZW5hYiBhZGRyZXNzCisJCQkJCQkvLyBpbmNyZW1lbnQgZm9yIGJsb2NrCisJCQkJCQkvLyB0cmFuc2ZlcnMuCisjZGVmaW5lIERFQklfQ0ZHX0lOVEVMCQkweDAwMDIwMDAwCS8vIEludGVsIHN0eWxlIGxvY2FsIGJ1cy4KKyNkZWZpbmUgREVCSV9DRkdfVElNRVJPRkYJMHgwMDAxMDAwMAkvLyBEaXNhYmxlIHRpbWVyLgorCisjaWYgUExBVEZPUk0gPT0gSU5URUwKKworI2RlZmluZSBERUJJX1RPVVQJCTcJLy8gV2FpdCA3IFBDSSBjbG9ja3MKKwkJCQkJCS8vICgyMTIgbnMpIGJlZm9yZQorCQkJCQkJLy8gcG9sbGluZyBSRFkuCisKKy8vIEludGVsIGJ5dGUgbGFuZSBzdGVlcmluZyAocGFzcyB0aHJvdWdoIGFsbCBieXRlIGxhbmVzKS4KKyNkZWZpbmUgREVCSV9TV0FQCQlERUJJX0NGR19TV0FQX05PTkUKKworI2VsaWYgUExBVEZPUk0gPT0gTU9UT1JPTEEKKworI2RlZmluZSBERUJJX1RPVVQJCTE1CS8vIFdhaXQgMTUgUENJIGNsb2NrcyAoNDU0IG5zKQorCQkJCQkvLyBtYXhpbXVtIGJlZm9yZSB0aW1pbmcgb3V0LgorI2RlZmluZSBERUJJX1NXQVAJCURFQklfQ0ZHX1NXQVBfMgkvLyBNb3Rvcm9sYSBieXRlIGxhbmUgc3RlZXJpbmcuCisKKyNlbmRpZgorCisvLyBERUJJIHBhZ2UgdGFibGUgY29uc3RhbnRzLgorI2RlZmluZSBERUJJX1BBR0VfRElTQUJMRQkweDAwMDAwMDAwCS8vIFBhZ2luZyBkaXNhYmxlLgorCisvLy8vLy8vLy8vLy8vLy8vLy8vRVhUUkEgRlJPTSBPVEhFUiBTQU5TT1JBWSAgKiAuaC8vLy8vLy8vCisKKy8vIExvYWRTcmMgdmFsdWVzOgorI2RlZmluZSBMT0FEU1JDX0lORFgJCTAJLy8gUHJlbG9hZCBjb3JlIGluIHJlc3BvbnNlIHRvCisJCQkJCS8vIEluZGV4LgorI2RlZmluZSBMT0FEU1JDX09WRVIJCTEJLy8gUHJlbG9hZCBjb3JlIGluIHJlc3BvbnNlIHRvCisJCQkJCS8vIE92ZXJmbG93LgorI2RlZmluZSBMT0FEU1JDQl9PVkVSQQkJMgkvLyBQcmVsb2FkIEIgY29yZSBpbiByZXNwb25zZQorCQkJCQkvLyB0byBBIE92ZXJmbG93LgorI2RlZmluZSBMT0FEU1JDX05PTkUJCTMJLy8gTmV2ZXIgcHJlbG9hZCBjb3JlLgorCisvLyBJbnRTcmMgdmFsdWVzOgorI2RlZmluZSBJTlRTUkNfTk9ORSAJCTAJLy8gSW50ZXJydXB0cyBkaXNhYmxlZC4KKyNkZWZpbmUgSU5UU1JDX09WRVIgCQkxCS8vIEludGVycnVwdCBvbiBPdmVyZmxvdy4KKyNkZWZpbmUgSU5UU1JDX0lORFggCQkyCS8vIEludGVycnVwdCBvbiBJbmRleC4KKyNkZWZpbmUgSU5UU1JDX0JPVEggCQkzCS8vIEludGVycnVwdCBvbiBJbmRleCBvciBPdmVyZmxvdy4KKworLy8gTGF0Y2hTcmMgdmFsdWVzOgorI2RlZmluZSBMQVRDSFNSQ19BQl9SRUFECTAJLy8gTGF0Y2ggb24gcmVhZC4KKyNkZWZpbmUgTEFUQ0hTUkNfQV9JTkRYQQkxCS8vIExhdGNoIEEgb24gQSBJbmRleC4KKyNkZWZpbmUgTEFUQ0hTUkNfQl9JTkRYQgkyCS8vIExhdGNoIEIgb24gQiBJbmRleC4KKyNkZWZpbmUgTEFUQ0hTUkNfQl9PVkVSQQkzCS8vIExhdGNoIEIgb24gQSBPdmVyZmxvdy4KKworLy8gSW5keFNyYyB2YWx1ZXM6CisjZGVmaW5lIElORFhTUkNfSEFSRAkJMAkvLyBIYXJkd2FyZSBvciBzb2Z0d2FyZSBpbmRleC4KKyNkZWZpbmUgSU5EWFNSQ19TT0ZUCQkxCS8vIFNvZnR3YXJlIGluZGV4IG9ubHkuCisKKy8vIEluZHhQb2wgdmFsdWVzOgorI2RlZmluZSBJTkRYUE9MX1BPUyAJCTAJLy8gSW5kZXggaW5wdXQgaXMgYWN0aXZlIGhpZ2guCisjZGVmaW5lIElORFhQT0xfTkVHIAkJMQkvLyBJbmRleCBpbnB1dCBpcyBhY3RpdmUgbG93LgorCisvLyBDbGtTcmMgdmFsdWVzOgorI2RlZmluZSBDTEtTUkNfQ09VTlRFUgkJMAkvLyBDb3VudGVyIG1vZGUuCisjZGVmaW5lIENMS1NSQ19USU1FUgkJMgkvLyBUaW1lciBtb2RlLgorI2RlZmluZSBDTEtTUkNfRVhURU5ERVIJCTMJLy8gRXh0ZW5kZXIgbW9kZS4KKworLy8gQ2xrUG9sIHZhbHVlczoKKyNkZWZpbmUgQ0xLUE9MX1BPUwkJMAkvLyBDb3VudGVyL0V4dGVuZGVyIGNsb2NrIGlzCisJCQkJCS8vIGFjdGl2ZSBoaWdoLgorI2RlZmluZSBDTEtQT0xfTkVHCQkxCS8vIENvdW50ZXIvRXh0ZW5kZXIgY2xvY2sgaXMKKwkJCQkJLy8gYWN0aXZlIGxvdy4KKyNkZWZpbmUgQ05URElSX1VQCQkwCS8vIFRpbWVyIGNvdW50cyB1cC4KKyNkZWZpbmUgQ05URElSX0RPV04gCQkxCS8vIFRpbWVyIGNvdW50cyBkb3duLgorCisvLyBDbGtFbmFiIHZhbHVlczoKKyNkZWZpbmUgQ0xLRU5BQl9BTFdBWVMJCTAJLy8gQ2xvY2sgYWx3YXlzIGVuYWJsZWQuCisjZGVmaW5lIENMS0VOQUJfSU5ERVgJCTEJLy8gQ2xvY2sgaXMgZW5hYmxlZCBieSBpbmRleC4KKworLy8gQ2xrTXVsdCB2YWx1ZXM6CisjZGVmaW5lIENMS01VTFRfNFggCQkwCS8vIDR4IGNsb2NrIG11bHRpcGxpZXIuCisjZGVmaW5lIENMS01VTFRfMlggCQkxCS8vIDJ4IGNsb2NrIG11bHRpcGxpZXIuCisjZGVmaW5lIENMS01VTFRfMVggCQkyCS8vIDF4IGNsb2NrIG11bHRpcGxpZXIuCisKKy8vIEJpdCBGaWVsZCBwb3NpdGlvbnMgaW4gQ09VTlRFUl9TRVRVUCBzdHJ1Y3R1cmU6CisjZGVmaW5lIEJGX0xPQURTUkMJCTkJLy8gUHJlbG9hZCB0cmlnZ2VyLgorI2RlZmluZSBCRl9JTkRYU1JDCQk3CS8vIEluZGV4IHNvdXJjZS4KKyNkZWZpbmUgQkZfSU5EWFBPTAkJNgkvLyBJbmRleCBwb2xhcml0eS4KKyNkZWZpbmUgQkZfQ0xLU1JDCQk0CS8vIENsb2NrIHNvdXJjZS4KKyNkZWZpbmUgQkZfQ0xLUE9MCQkzCS8vIENsb2NrIHBvbGFyaXR5L2NvdW50IGRpcmVjdGlvbi4KKyNkZWZpbmUgQkZfQ0xLTVVMVAkJMQkvLyBDbG9jayBtdWx0aXBsaWVyLgorI2RlZmluZSBCRl9DTEtFTkFCCQkwCS8vIENsb2NrIGVuYWJsZS4KKworLy8gRW51bWVyYXRlZCBjb3VudGVyIG9wZXJhdGluZyBtb2RlcyBzcGVjaWZpZWQgYnkgQ2xrU3JjIGJpdCBmaWVsZCBpbgorLy8gYSBDT1VOVEVSX1NFVFVQLgorCisjZGVmaW5lIENMS1NSQ19DT1VOVEVSCQkwCS8vIENvdW50ZXI6IEVOQ19DIGNsb2NrLCBFTkNfRAorCQkJCQkvLyBkaXJlY3Rpb24uCisjZGVmaW5lIENMS1NSQ19USU1FUgkJMgkvLyBUaW1lcjogU1lTX0MgY2xvY2ssCisJCQkJCS8vIGRpcmVjdGlvbiBzcGVjaWZpZWQgYnkKKwkJCQkJLy8gQ2xrUG9sLgorI2RlZmluZSBDTEtTUkNfRVhURU5ERVIJCTMJLy8gRXh0ZW5kZXI6IE9WUl9BIGNsb2NrLAorCQkJCQkvLyBFTkNfRCBkaXJlY3Rpb24uCisKKy8vIEVudW1lcmF0ZWQgY291bnRlciBjbG9jayBtdWx0aXBsaWVycy4KKworI2RlZmluZSBNVUxUX1gwCQkJMHgwMDAzCS8vIFN1cHBvcnRzIG5vIG11bHRpcGxpZXJzOworCQkJCQkvLyBmaXhlZCBwaHlzaWNhbCBtdWx0aXBsaWVyID0KKwkJCQkJLy8gMy4KKyNkZWZpbmUgTVVMVF9YMQkJCTB4MDAwMgkvLyBTdXBwb3J0cyBtdWx0aXBsaWVyIHgxOworCQkJCQkvLyBmaXhlZCBwaHlzaWNhbCBtdWx0aXBsaWVyID0KKwkJCQkJLy8gMi4KKyNkZWZpbmUgTVVMVF9YMgkJCTB4MDAwMQkvLyBTdXBwb3J0cyBtdWx0aXBsaWVycyB4MSwKKwkJCQkJLy8geDI7IHBoeXNpY2FsIG11bHRpcGxpZXJzID0KKwkJCQkJLy8gMSBvciAyLgorI2RlZmluZSBNVUxUX1g0CQkJMHgwMDAwCS8vIFN1cHBvcnRzIG11bHRpcGxpZXJzIHgxLAorCQkJCQkvLyB4MiwgeDQ7IHBoeXNpY2FsCisJCQkJCS8vIG11bHRpcGxpZXJzID0gMCwgMSBvciAyLgorCisvLyBTYW5pdHktY2hlY2sgbGltaXRzIGZvciBwYXJhbWV0ZXJzLgorCisjZGVmaW5lIE5VTV9DT1VOVEVSUwkJNgkvLyBNYXhpbXVtIHZhbGlkIGNvdW50ZXIKKwkJCQkJLy8gbG9naWNhbCBjaGFubmVsIG51bWJlci4KKyNkZWZpbmUgTlVNX0lOVFNPVVJDRVMJCTQKKyNkZWZpbmUgTlVNX0xBVENIU09VUkNFUwk0CisjZGVmaW5lIE5VTV9DTEtNVUxUUwkJNAorI2RlZmluZSBOVU1fQ0xLU09VUkNFUwkJNAorI2RlZmluZSBOVU1fQ0xLUE9MUwkJMgorI2RlZmluZSBOVU1fSU5ERVhQT0xTCQkyCisjZGVmaW5lIE5VTV9JTkRFWFNPVVJDRVMJMgorI2RlZmluZSBOVU1fTE9BRFRSSUdTCQk0CisKKy8vIEJpdCBmaWVsZCBwb3NpdGlvbnMgaW4gQ1JBIGFuZCBDUkIgY291bnRlciBjb250cm9sIHJlZ2lzdGVycy4KKworLy8gQml0IGZpZWxkIHBvc2l0aW9ucyBpbiBDUkE6CisjZGVmaW5lIENSQUJJVF9JTkRYU1JDX0IJMTQJLy8gICBCIGluZGV4IHNvdXJjZS4KKyNkZWZpbmUgQ1JBQklUX0NMS1NSQ19CCQkxMgkvLyAgIEIgY2xvY2sgc291cmNlLgorI2RlZmluZSBDUkFCSVRfSU5EWFBPTF9BCTExCS8vICAgQSBpbmRleCBwb2xhcml0eS4KKyNkZWZpbmUgQ1JBQklUX0xPQURTUkNfQQkgOQkvLyAgIEEgcHJlbG9hZCB0cmlnZ2VyLgorI2RlZmluZSBDUkFCSVRfQ0xLTVVMVF9BCSA3CS8vICAgQSBjbG9jayBtdWx0aXBsaWVyLgorI2RlZmluZSBDUkFCSVRfSU5UU1JDX0EJCSA1CS8vICAgQSBpbnRlcnJ1cHQgc291cmNlLgorI2RlZmluZSBDUkFCSVRfQ0xLUE9MX0EJCSA0CS8vICAgQSBjbG9jayBwb2xhcml0eS4KKyNkZWZpbmUgQ1JBQklUX0lORFhTUkNfQQkgMgkvLyAgIEEgaW5kZXggc291cmNlLgorI2RlZmluZSBDUkFCSVRfQ0xLU1JDX0EJCSAwCS8vICAgQSBjbG9jayBzb3VyY2UuCisKKy8vIEJpdCBmaWVsZCBwb3NpdGlvbnMgaW4gQ1JCOgorI2RlZmluZSBDUkJCSVRfSU5UUkVTRVRDTUQJMTUJLy8gICBJbnRlcnJ1cHQgcmVzZXQgY29tbWFuZC4KKyNkZWZpbmUgQ1JCQklUX0lOVFJFU0VUX0IJMTQJLy8gICBCIGludGVycnVwdCByZXNldCBlbmFibGUuCisjZGVmaW5lIENSQkJJVF9JTlRSRVNFVF9BCTEzCS8vICAgQSBpbnRlcnJ1cHQgcmVzZXQgZW5hYmxlLgorI2RlZmluZSBDUkJCSVRfQ0xLRU5BQl9BCTEyCS8vICAgQSBjbG9jayBlbmFibGUuCisjZGVmaW5lIENSQkJJVF9JTlRTUkNfQgkJMTAJLy8gICBCIGludGVycnVwdCBzb3VyY2UuCisjZGVmaW5lIENSQkJJVF9MQVRDSFNSQwkJIDgJLy8gICBBL0IgbGF0Y2ggc291cmNlLgorI2RlZmluZSBDUkJCSVRfTE9BRFNSQ19CCSA2CS8vICAgQiBwcmVsb2FkIHRyaWdnZXIuCisjZGVmaW5lIENSQkJJVF9DTEtNVUxUX0IJIDMJLy8gICBCIGNsb2NrIG11bHRpcGxpZXIuCisjZGVmaW5lIENSQkJJVF9DTEtFTkFCX0IJIDIJLy8gICBCIGNsb2NrIGVuYWJsZS4KKyNkZWZpbmUgQ1JCQklUX0lORFhQT0xfQgkgMQkvLyAgIEIgaW5kZXggcG9sYXJpdHkuCisjZGVmaW5lIENSQkJJVF9DTEtQT0xfQgkJIDAJLy8gICBCIGNsb2NrIHBvbGFyaXR5LgorCisvLyBCaXQgZmllbGQgbWFza3MgZm9yIENSQSBhbmQgQ1JCLgorCisjZGVmaW5lIENSQU1TS19JTkRYU1JDX0IJKCAodWludDE2X3QpKCAzIDw8IENSQUJJVF9JTkRYU1JDX0IpICkKKyNkZWZpbmUgQ1JBTVNLX0NMS1NSQ19CCQkoICh1aW50MTZfdCkoIDMgPDwgQ1JBQklUX0NMS1NSQ19CKSApCisjZGVmaW5lIENSQU1TS19JTkRYUE9MX0EJKCAodWludDE2X3QpKCAxIDw8IENSQUJJVF9JTkRYUE9MX0EpICkKKyNkZWZpbmUgQ1JBTVNLX0xPQURTUkNfQQkoICh1aW50MTZfdCkoIDMgPDwgQ1JBQklUX0xPQURTUkNfQSkgKQorI2RlZmluZSBDUkFNU0tfQ0xLTVVMVF9BCSggKHVpbnQxNl90KSggMyA8PCBDUkFCSVRfQ0xLTVVMVF9BKSApCisjZGVmaW5lIENSQU1TS19JTlRTUkNfQQkJKCAodWludDE2X3QpKCAzIDw8IENSQUJJVF9JTlRTUkNfQSkgKQorI2RlZmluZSBDUkFNU0tfQ0xLUE9MX0EJCSggKHVpbnQxNl90KSggMyA8PCBDUkFCSVRfQ0xLUE9MX0EpICkKKyNkZWZpbmUgQ1JBTVNLX0lORFhTUkNfQQkoICh1aW50MTZfdCkoIDMgPDwgQ1JBQklUX0lORFhTUkNfQSkgKQorI2RlZmluZSBDUkFNU0tfQ0xLU1JDX0EJCSggKHVpbnQxNl90KSggMyA8PCBDUkFCSVRfQ0xLU1JDX0EpICkKKworI2RlZmluZSBDUkJNU0tfSU5UUkVTRVRDTUQJKCAodWludDE2X3QpKCAxIDw8IENSQkJJVF9JTlRSRVNFVENNRCkgKQorI2RlZmluZSBDUkJNU0tfSU5UUkVTRVRfQgkoICh1aW50MTZfdCkoIDEgPDwgQ1JCQklUX0lOVFJFU0VUX0IpICkKKyNkZWZpbmUgQ1JCTVNLX0lOVFJFU0VUX0EJKCAodWludDE2X3QpKCAxIDw8IENSQkJJVF9JTlRSRVNFVF9BKSApCisjZGVmaW5lIENSQk1TS19DTEtFTkFCX0EJKCAodWludDE2X3QpKCAxIDw8IENSQkJJVF9DTEtFTkFCX0EpICkKKyNkZWZpbmUgQ1JCTVNLX0lOVFNSQ19CCQkoICh1aW50MTZfdCkoIDMgPDwgQ1JCQklUX0lOVFNSQ19CKSApCisjZGVmaW5lIENSQk1TS19MQVRDSFNSQwkJKCAodWludDE2X3QpKCAzIDw8IENSQkJJVF9MQVRDSFNSQykgKQorI2RlZmluZSBDUkJNU0tfTE9BRFNSQ19CCSggKHVpbnQxNl90KSggMyA8PCBDUkJCSVRfTE9BRFNSQ19CKSApCisjZGVmaW5lIENSQk1TS19DTEtNVUxUX0IJKCAodWludDE2X3QpKCAzIDw8IENSQkJJVF9DTEtNVUxUX0IpICkKKyNkZWZpbmUgQ1JCTVNLX0NMS0VOQUJfQgkoICh1aW50MTZfdCkoIDEgPDwgQ1JCQklUX0NMS0VOQUJfQikgKQorI2RlZmluZSBDUkJNU0tfSU5EWFBPTF9CCSggKHVpbnQxNl90KSggMSA8PCBDUkJCSVRfSU5EWFBPTF9CKSApCisjZGVmaW5lIENSQk1TS19DTEtQT0xfQgkJKCAodWludDE2X3QpKCAxIDw8IENSQkJJVF9DTEtQT0xfQikgKQorCisjZGVmaW5lIENSQk1TS19JTlRDVFJMCQkoIENSQk1TS19JTlRSRVNFVENNRCB8IENSQk1TS19JTlRSRVNFVF9BIHwgQ1JCTVNLX0lOVFJFU0VUX0IgKQkvLyBJbnRlcnJ1cHQgcmVzZXQgY29udHJvbCBiaXRzLgorCisvLyBCaXQgZmllbGQgcG9zaXRpb25zIGZvciBzdGFuZGFyZGl6ZWQgU0VUVVAgc3RydWN0dXJlLgorCisjZGVmaW5lIFNUREJJVF9JTlRTUkMJCTEzCisjZGVmaW5lIFNUREJJVF9MQVRDSFNSQwkJMTEKKyNkZWZpbmUgU1REQklUX0xPQURTUkMJCSA5CisjZGVmaW5lIFNUREJJVF9JTkRYU1JDCQkgNworI2RlZmluZSBTVERCSVRfSU5EWFBPTAkJIDYKKyNkZWZpbmUgU1REQklUX0NMS1NSQwkJIDQKKyNkZWZpbmUgU1REQklUX0NMS1BPTAkJIDMKKyNkZWZpbmUgU1REQklUX0NMS01VTFQJCSAxCisjZGVmaW5lIFNUREJJVF9DTEtFTkFCCQkgMAorCisvLyBCaXQgZmllbGQgbWFza3MgZm9yIHN0YW5kYXJkaXplZCBTRVRVUCBzdHJ1Y3R1cmUuCisKKyNkZWZpbmUgU1RETVNLX0lOVFNSQwkJKCAodWludDE2X3QpKCAzIDw8IFNUREJJVF9JTlRTUkMgICApICkKKyNkZWZpbmUgU1RETVNLX0xBVENIU1JDCQkoICh1aW50MTZfdCkoIDMgPDwgU1REQklUX0xBVENIU1JDICkgKQorI2RlZmluZSBTVERNU0tfTE9BRFNSQwkJKCAodWludDE2X3QpKCAzIDw8IFNUREJJVF9MT0FEU1JDICApICkKKyNkZWZpbmUgU1RETVNLX0lORFhTUkMJCSggKHVpbnQxNl90KSggMSA8PCBTVERCSVRfSU5EWFNSQyAgKSApCisjZGVmaW5lIFNURE1TS19JTkRYUE9MCQkoICh1aW50MTZfdCkoIDEgPDwgU1REQklUX0lORFhQT0wgICkgKQorI2RlZmluZSBTVERNU0tfQ0xLU1JDCQkoICh1aW50MTZfdCkoIDMgPDwgU1REQklUX0NMS1NSQyAgICkgKQorI2RlZmluZSBTVERNU0tfQ0xLUE9MCQkoICh1aW50MTZfdCkoIDEgPDwgU1REQklUX0NMS1BPTCAgICkgKQorI2RlZmluZSBTVERNU0tfQ0xLTVVMVAkJKCAodWludDE2X3QpKCAzIDw8IFNUREJJVF9DTEtNVUxUICApICkKKyNkZWZpbmUgU1RETVNLX0NMS0VOQUIJCSggKHVpbnQxNl90KSggMSA8PCBTVERCSVRfQ0xLRU5BQiAgKSApCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyogdHlwZWRlZiBzdHJ1Y3QgaW5kZXhDb3VudGVyICovCisvKiB7ICovCisvKiAgIHVuc2lnbmVkIGludCBhbzsgKi8KKy8qICAgdW5zaWduZWQgaW50IGFpOyAqLworLyogICB1bnNpZ25lZCBpbnQgZGlnb3V0OyAqLworLyogICB1bnNpZ25lZCBpbnQgZGlnaW47ICovCisvKiAgIHVuc2lnbmVkIGludCBlbmM7ICovCisvKiB9Q2FsbENvdW50ZXI7ICovCisKK3R5cGVkZWYgc3RydWN0IGJ1ZmZlckRNQSB7CisJZG1hX2FkZHJfdCBQaHlzaWNhbEJhc2U7CisJdm9pZCAqTG9naWNhbEJhc2U7CisJdWludDMyX3QgRE1BSGFuZGxlOworfSBETUFCVUY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdXNiZHV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdXNiZHV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUxMzgyNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXguYwpAQCAtMCwwICsxLDI5MzIgQEAKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYyLjEiCisjZGVmaW5lIERSSVZFUl9BVVRIT1IgIkJlcm5kIFBvcnIsIEJlcm5kUG9yckBmMnMuY29tIgorI2RlZmluZSBEUklWRVJfREVTQyAiU3RpcmxpbmcvSVRMIFVTQi1EVVggLS0gQmVybmQuUG9yckBmMnMuY29tIgorLyoKKyAgIGNvbWVkaS9kcml2ZXJzL3VzYmR1eC5jCisgICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNyBCZXJuZCBQb3JyLCBCZXJuZC5Qb3JyQGYycy5jb20KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICovCisvKgorRHJpdmVyOiB1c2JkdXgKK0Rlc2NyaXB0aW9uOiBVbml2ZXJzaXR5IG9mIFN0aXJsaW5nIFVTQiBEQVEgJiBJTkNJVEUgVGVjaG5vbG9neSBMaW1pdGVkCitEZXZpY2VzOiBbSVRMXSBVU0ItRFVYICh1c2JkdXgubykKK0F1dGhvcjogQmVybmQgUG9yciA8QmVybmRQb3JyQGYycy5jb20+CitVcGRhdGVkOiAyNSBOb3YgMjAwNworU3RhdHVzOiBUZXN0aW5nCitDb25maWd1cmF0aW9uIG9wdGlvbnM6CisgIFlvdSBoYXZlIHRvIHVwbG9hZCBmaXJtd2FyZSB3aXRoIHRoZSAtaSBvcHRpb24uIFRoZQorICBmaXJtd2FyZSBpcyB1c3VhbGx5IGluc3RhbGxlZCB1bmRlciAvdXNyL3NoYXJlL3VzYiBvcgorICAvdXNyL2xvY2FsL3NoYXJlL3VzYiBvciAvbGliL2Zpcm13YXJlLgorCitDb25uZWN0aW9uIHNjaGVtZSBmb3IgdGhlIGNvdW50ZXIgYXQgdGhlIGRpZ2l0YWwgcG9ydDoKKyAgMD0vQ0xLMCwgMT1VUC9ET1dOMCwgMj1SRVNFVDAsIDQ9L0NMSzEsIDU9VVAvRE9XTjEsIDY9UkVTRVQxLgorICBUaGUgc2FtcGxpbmcgcmF0ZSBvZiB0aGUgY291bnRlciBpcyBhcHByb3hpbWF0ZWx5IDUwMEh6LgorCitQbGVhc2Ugbm90ZSB0aGF0IHVuZGVyIFVTQjIuMCB0aGUgbGVuZ3RoIG9mIHRoZSBjaGFubmVsIGxpc3QgZGV0ZXJtaW5lcwordGhlIG1heCBzYW1wbGluZyByYXRlLiBJZiB5b3Ugc2FtcGxlIG9ubHkgb25lIGNoYW5uZWwgeW91IGdldCA4a0h6CitzYW1wbGluZyByYXRlLiBJZiB5b3Ugc2FtcGxlIHR3byBjaGFubmVscyB5b3UgZ2V0IDRrSHogYW5kIHNvIG9uLgorKi8KKy8qCisgKiBJIG11c3QgZ2l2ZSBjcmVkaXQgaGVyZSB0byBDaHJpcyBCYXVnaGVyIHdobworICogd3JvdGUgdGhlIGRyaXZlciBmb3IgQVQtTUlPLTE2ZC4gSSB1c2VkIHNvbWUgcGFydHMgb2YgdGhpcworICogZHJpdmVyLiBJIGFsc28gbXVzdCBnaXZlIGNyZWRpdHMgdG8gRGF2aWQgQnJvd25lbGwKKyAqIHdobyBzdXBwb3J0ZWQgbWUgd2l0aCB0aGUgVVNCIGRldmVsb3BtZW50LgorICoKKyAqIEJlcm5kIFBvcnIKKyAqCisgKgorICogUmV2aXNpb24gaGlzdG9yeToKKyAqIDAuOTQ6IEQvQSBvdXRwdXQgc2hvdWxkIHdvcmsgbm93IHdpdGggYW55IGNoYW5uZWwgbGlzdCBjb21iaW5hdGlvbnMKKyAqIDAuOTU6IC5vd25lciBjb21tZW50ZWQgb3V0IGZvciBrZXJuZWwgdmVycyBiZWxvdyAyLjQuMTkKKyAqICAgICAgIHNhbml0eSBjaGVja3MgaW4gYWkvYW9fY21kCisgKiAwLjk2OiB0cnlpbmcgdG8gZ2V0IGl0IHdvcmtpbmcgd2l0aCAyLjYsIG1vdmVkIGFsbCBtZW1vcnkgYWxsb2MgdG8gY29tZWRpJ3MKKyAqICAgICAgIGF0dGFjaCBmaW5hbCBVU0IgSURzCisgKiAgICAgICBtb3ZlZCBtZW1vcnkgYWxsb2NhdGlvbiBjb21wbGV0ZWx5IHRvIHRoZSBjb3JyZXNwb25kaW5nIGNvbWVkaQorICogICAgICAgZnVuY3Rpb25zIGZpcm13YXJlIHVwbG9hZCBpcyBieSBmeGxvYWQgYW5kIG5vIGxvbmdlciBieSBjb21lZGkgKGR1ZSB0bworICogICAgICAgZW51bWVyYXRpb24pCisgKiAwLjk3OiBVU0IgSURzIHJlY2VpdmVkLCBhZGp1c3RlZCB0YWJsZQorICogMC45ODogU01QLCBsb2NraW5nLCBtZW1yb3kgYWxsb2M6IG1vdmVkIGFsbCB1c2IgbWVtb3J5IGFsbG9jCisgKiAgICAgICB0byB0aGUgdXNiIHN1YnN5c3RlbSBhbmQgbW92ZWQgYWxsIGNvbWVkaSByZWxhdGVkIG1lbW9yeQorICogICAgICAgYWxsb2MgdG8gY29tZWRpLgorICogICAgICAgfCBrZXJuZWwgfCByZWdpc3RyYXRpb24gfCB1c2JkdXgtdXNiIHwgdXNiZHV4LWNvbWVkaSB8IGNvbWVkaSB8CisgKiAwLjk5OiBVU0IgMi4wOiBjaGFuZ2VkIHByb3RvY29sIHRvIGlzb2Nocm9ub3VzIHRyYW5zZmVyCisgKiAgICAgICAgICAgICAgICBJUlEgdHJhbnNmZXIgaXMgdG9vIGJ1Z2d5IGFuZCB0b28gcmlza3kgaW4gMi4wCisgKiAgICAgICAgICAgICAgICBmb3IgdGhlIGhpZ2ggc3BlZWQgSVNPIHRyYW5zZmVyIGlzIG5vdyBhIHdvcmtpbmcgdmVyc2lvbgorICogICAgICAgICAgICAgICAgYXZhaWxhYmxlCisgKiAwLjk5YjogSW5jcmVhc2VkIHRoZSBpc28gdHJhbnNmZXIgYnVmZmVyIGZvciBoaWdoIHNwLnRvIDEwIGJ1ZmZlcnMuIFNvbWUgVklBCisgKiAgICAgICAgY2hpcHNldHMgbWlzcyBvdXQgSVJRcy4gRGVlcGVyIGJ1ZmZlcmluZyBpcyBuZWVkZWQuCisgKiAxLjAwOiBmdWxsIFVTQiAyLjAgc3VwcG9ydCBmb3IgdGhlIEEvRCBjb252ZXJ0ZXIuIE5vdzogbWF4IDhrSHogc2FtcGxpbmcKKyAqICAgICAgIHJhdGUuCisgKiAgICAgICBGaXJtd2FyZSB2ZXJzIDEuMDAgaXMgbmVlZGVkIGZvciB0aGlzLgorICogICAgICAgVHdvIDE2IGJpdCB1cC9kb3duL3Jlc2V0IGNvdW50ZXIgd2l0aCBhIHNhbXBsaW5nIHJhdGUgb2YgMWtIegorICogICAgICAgQW5kIGxvYWRzIG9mIGNsZWFuaW5nIHVwLCBpbiBwYXJ0aWN1bGFyIHN0cmVhbWxpbmluZyB0aGUKKyAqICAgICAgIGJ1bGsgdHJhbnNmZXJzLgorICogMS4xOiAgbW92ZWQgRVA0IHRyYW5zZmVycyB0byBFUDEgdG8gbWFrZSBzcGFjZSBmb3IgYSBQV00gb3V0cHV0IG9uIEVQNAorICogMS4yOiAgYWRkZWQgUFdNIHN1cG9ydCB2aWEgRVA0CisgKiAyLjA6ICBQV00gc2VlbXMgdG8gYmUgc3RhYmxlIGFuZCBpcyBub3QgaW50ZXJmZXJpbmcgd2l0aCB0aGUgb3RoZXIgZnVuY3Rpb25zCisgKiAyLjE6ICBjaGFuZ2VkIFBXTSBBUEkKKyAqCisgKi8KKworLyogZ2VuZXJhdGVzIGxvYWRzIG9mIGRlYnVnIGluZm8gKi8KKy8qICNkZWZpbmUgTk9JU1lfRFVYX0RFQlVHQlVHICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisKKyNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKworI2RlZmluZSBCT0FSRE5BTUUgInVzYmR1eCIKKworLyogdGltZW91dCBmb3IgdGhlIFVTQi10cmFuc2ZlciAqLworI2RlZmluZSBFWlRJTUVPVVQgMzAKKworLyogY29uc3RhbnRzIGZvciAiZmlybXdhcmUiIHVwbG9hZCBhbmQgZG93bmxvYWQgKi8KKyNkZWZpbmUgVVNCRFVYU1VCX0ZJUk1XQVJFIDB4QTAKKyNkZWZpbmUgVkVORE9SX0RJUl9JTiAgMHhDMAorI2RlZmluZSBWRU5ET1JfRElSX09VVCAweDQwCisKKy8qIGludGVybmFsIGFkcmVzc2VzIG9mIHRoZSA4MDUxIHByb2Nlc3NvciAqLworI2RlZmluZSBVU0JEVVhTVUJfQ1BVQ1MgMHhFNjAwCisKKy8qCisgKiB0aGUgbWlub3IgZGV2aWNlIG51bWJlciwgbWFqb3IgaXMgMTgwIG9ubHkgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyBhbmQgdG8KKyAqIHVwbG9hZCBzcGVjaWFsIGZpcm13YXJlIChwcm9ncmFtbWluZyB0aGUgZWVwcm9tIGV0Yykgd2hpY2ggaXMgbm90IGNvbXBhdGlibGUKKyAqIHdpdGggdGhlIGNvbWVkaSBmcmFtd29yaworICovCisjZGVmaW5lIFVTQkRVWFNVQl9NSU5PUiAzMgorCisvKiBtYXggbGVuZ2h0aCBvZiB0aGUgdHJhbnNmZXItYnVmZmVyIGZvciBzb2Z0d2FyZSB1cGxvYWQgKi8KKyNkZWZpbmUgVEJfTEVOIDB4MjAwMAorCisvKiBJbnB1dCBlbmRwb2ludCBudW1iZXI6IElTTy9JUlEgKi8KKyNkZWZpbmUgSVNPSU5FUCAgICAgICAgICAgNgorCisvKiBPdXRwdXQgZW5kcG9pbnQgbnVtYmVyOiBJU08vSVJRICovCisjZGVmaW5lIElTT09VVEVQICAgICAgICAgIDIKKworLyogVGhpcyBFUCBzZW5kcyBEVVggY29tbWFuZHMgdG8gVVNCRFVYICovCisjZGVmaW5lIENPTU1BTkRfT1VUX0VQICAgICAxCisKKy8qIFRoaXMgRVAgcmVjZWl2ZXMgdGhlIERVWCBjb21tYW5kcyBmcm9tIFVTQkRVWCAqLworI2RlZmluZSBDT01NQU5EX0lOX0VQICAgICAgICA4CisKKy8qIE91dHB1dCBlbmRwb2ludCBmb3IgUFdNICovCisjZGVmaW5lIFBXTV9FUCAgICAgICAgIDQKKworLyogMzAwSHogbWF4IGZyZXF1IHVuZGVyIFBXTSAqLworI2RlZmluZSBNSU5fUFdNX1BFUklPRCAgKChsb25nKSgxRTkvMzAwKSkKKworLyogRGVmYXVsdCBQV00gZnJlcXVlbmN5ICovCisjZGVmaW5lIFBXTV9ERUZBVUxUX1BFUklPRCAoKGxvbmcpKDFFOS8xMDApKQorCisvKiBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KKyNkZWZpbmUgTlVNQ0hBTk5FTFMgICAgICAgOAorCisvKiBTaXplIG9mIG9uZSBBL0QgdmFsdWUgKi8KKyNkZWZpbmUgU0laRUFESU4gICAgICAgICAgKChzaXplb2YoaW50MTZfdCkpKQorCisvKgorICogU2l6ZSBvZiB0aGUgaW5wdXQtYnVmZmVyIElOIEJZVEVTCisgKiBBbHdheXMgbXVsdGlwbGUgb2YgOCBmb3IgOCBtaWNyb2ZyYW1lcyB3aGljaCBpcyBuZWVkZWQgaW4gdGhlIGhpZ2hzcGVlZCBtb2RlCisgKi8KKyNkZWZpbmUgU0laRUlOQlVGICAgICAgICAgKCg4KlNJWkVBRElOKSkKKworLyogMTYgYnl0ZXMuICovCisjZGVmaW5lIFNJWkVJTlNOQlVGICAgICAgIDE2CisKKy8qIE51bWJlciBvZiBEQSBjaGFubmVscyAqLworI2RlZmluZSBOVU1PVVRDSEFOTkVMUyAgICA4CisKKy8qIHNpemUgb2Ygb25lIHZhbHVlIGZvciB0aGUgRC9BIGNvbnZlcnRlcjogY2hhbm5lbCBhbmQgdmFsdWUgKi8KKyNkZWZpbmUgU0laRURBT1VUICAgICAgICAgICgoc2l6ZW9mKGludDhfdCkrc2l6ZW9mKGludDE2X3QpKSkKKworLyoKKyAqIFNpemUgb2YgdGhlIG91dHB1dC1idWZmZXIgaW4gYnl0ZXMKKyAqIEFjdHVhbGx5IG9ubHkgdGhlIGZpcnN0IDQgdHJpcGxldHMgYXJlIHVzZWQgYnV0IGZvciB0aGUKKyAqIGhpZ2ggc3BlZWQgbW9kZSB3ZSBuZWVkIHRvIHBhZCBpdCB0byA4IChtaWNyb2ZyYW1lcykuCisgKi8KKyNkZWZpbmUgU0laRU9VVEJVRiAgICAgICAgICgoOCpTSVpFREFPVVQpKQorCisvKgorICogU2l6ZSBvZiB0aGUgYnVmZmVyIGZvciB0aGUgZHV4IGNvbW1hbmRzOiBqdXN0IG5vdyBtYXggc2l6ZSBpcyBkZXRlcm1pbmVkCisgKiBieSB0aGUgYW5hbG9ndWUgb3V0ICsgY29tbWFuZCBieXRlICsgcGFuaWMgYnl0ZXMuLi4KKyAqLworI2RlZmluZSBTSVpFT0ZEVVhCVUZGRVIgICAgKCg4KlNJWkVEQU9VVCsyKSkKKworLyogTnVtYmVyIG9mIGluLVVSQnMgd2hpY2ggcmVjZWl2ZSB0aGUgZGF0YTogbWluPTIgKi8KKyNkZWZpbmUgTlVNT0ZJTkJVRkZFUlNGVUxMICAgICA1CisKKy8qIE51bWJlciBvZiBvdXQtVVJCcyB3aGljaCBzZW5kIHRoZSBkYXRhOiBtaW49MiAqLworI2RlZmluZSBOVU1PRk9VVEJVRkZFUlNGVUxMICAgIDUKKworLyogTnVtYmVyIG9mIGluLVVSQnMgd2hpY2ggcmVjZWl2ZSB0aGUgZGF0YTogbWluPTUgKi8KKy8qIG11c3QgaGF2ZSBtb3JlIGJ1ZmZlcnMgZHVlIHRvIGJ1Z2d5IFVTQiBjdHIgKi8KKyNkZWZpbmUgTlVNT0ZJTkJVRkZFUlNISUdIICAgICAxMAorCisvKiBOdW1iZXIgb2Ygb3V0LVVSQnMgd2hpY2ggc2VuZCB0aGUgZGF0YTogbWluPTUgKi8KKy8qIG11c3QgaGF2ZSBtb3JlIGJ1ZmZlcnMgZHVlIHRvIGJ1Z2d5IFVTQiBjdHIgKi8KKyNkZWZpbmUgTlVNT0ZPVVRCVUZGRVJTSElHSCAgICAxMAorCisvKiBUb3RhbCBudW1iZXIgb2YgdXNiZHV4IGRldmljZXMgKi8KKyNkZWZpbmUgTlVNVVNCRFVYICAgICAgICAgICAgIDE2CisKKy8qIEFuYWxvZ3VlIGluIHN1YmRldmljZSAqLworI2RlZmluZSBTVUJERVZfQUQgICAgICAgICAgICAgMAorCisvKiBBbmFsb2d1ZSBvdXQgc3ViZGV2aWNlICovCisjZGVmaW5lIFNVQkRFVl9EQSAgICAgICAgICAgICAxCisKKy8qIERpZ2l0YWwgSS9PICovCisjZGVmaW5lIFNVQkRFVl9ESU8gICAgICAgICAgICAyCisKKy8qIGNvdW50ZXIgKi8KKyNkZWZpbmUgU1VCREVWX0NPVU5URVIgICAgICAgIDMKKworLyogdGltZXIgYWthIHB3bSBvdXRwdXQgKi8KKyNkZWZpbmUgU1VCREVWX1BXTSAgICAgICAgICAgIDQKKworLyogbnVtYmVyIG9mIHJldHJpZXMgdG8gZ2V0IHRoZSByaWdodCBkdXggY29tbWFuZCAqLworI2RlZmluZSBSRVRSSUVTIDEwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGNvbWVkaSBjb25zdGFudHMgKi8KK3N0YXRpYyBjb25zdCBjb21lZGlfbHJhbmdlIHJhbmdlX3VzYmR1eF9haV9yYW5nZSA9IHsgNCwgeworCQkJQklQX1JBTkdFKDQuMDk2KSwKKwkJCUJJUF9SQU5HRSg0LjA5NiAvIDIpLAorCQkJVU5JX1JBTkdFKDQuMDk2KSwKKwkJCVVOSV9SQU5HRSg0LjA5NiAvIDIpCisJfQorfTsKKworc3RhdGljIGNvbnN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VfdXNiZHV4X2FvX3JhbmdlID0geyAyLCB7CisJCQlCSVBfUkFOR0UoNC4wOTYpLAorCQkJVU5JX1JBTkdFKDQuMDk2KSwKKwl9Cit9OworCisvKgorICogcHJpdmF0ZSBzdHJ1Y3R1cmUgb2Ygb25lIHN1YmRldmljZQorICovCisKKy8qCisgKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgd2hpY2ggaG9sZHMgYWxsIHRoZSBkYXRhIG9mCisgKiB0aGlzIGRyaXZlciBvbmUgc3ViIGRldmljZSBqdXN0IG5vdzogQS9ECisgKi8KK3N0cnVjdCB1c2JkdXhzdWIgeworCS8qIGF0dGFjaGVkPyAqLworCWludCBhdHRhY2hlZDsKKwkvKiBpcyBpdCBhc3NvY2lhdGVkIHdpdGggYSBzdWJkZXZpY2U/ICovCisJaW50IHByb2JlZDsKKwkvKiBwb2ludGVyIHRvIHRoZSB1c2ItZGV2aWNlICovCisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYmRldjsKKwkvKiBhY3R1YWwgbnVtYmVyIG9mIGluLWJ1ZmZlcnMgKi8KKwlpbnQgbnVtT2ZJbkJ1ZmZlcnM7CisJLyogYWN0dWFsIG51bWJlciBvZiBvdXQtYnVmZmVycyAqLworCWludCBudW1PZk91dEJ1ZmZlcnM7CisJLyogSVNPLXRyYW5zZmVyIGhhbmRsaW5nOiBidWZmZXJzICovCisJc3RydWN0IHVyYiAqKnVyYkluOworCXN0cnVjdCB1cmIgKip1cmJPdXQ7CisJLyogcHdtLXRyYW5zZmVyIGhhbmRsaW5nICovCisJc3RydWN0IHVyYiAqdXJiUHdtOworCS8qIFBXTSBwZXJpb2QgKi8KKwlsc2FtcGxfdCBwd21QZXJpb2Q7CisJLyogUFdNIGludGVybmFsIGRlbGF5IGZvciB0aGUgR1BJRiBpbiB0aGUgRlgyICovCisJaW50OF90IHB3bURlbGF5OworCS8qIHNpemUgb2YgdGhlIFBXTSBidWZmZXIgd2hpY2ggaG9sZHMgdGhlIGJpdCBwYXR0ZXJuICovCisJaW50IHNpemVQd21CdWY7CisJLyogaW5wdXQgYnVmZmVyIGZvciB0aGUgSVNPLXRyYW5zZmVyICovCisJaW50MTZfdCAqaW5CdWZmZXI7CisJLyogaW5wdXQgYnVmZmVyIGZvciBzaW5nbGUgaW5zbiAqLworCWludDE2X3QgKmluc25CdWZmZXI7CisJLyogb3V0cHV0IGJ1ZmZlciBmb3Igc2luZ2xlIERBIG91dHB1dHMgKi8KKwlpbnQxNl90ICpvdXRCdWZmZXI7CisJLyogaW50ZXJmYWNlIG51bWJlciAqLworCWludCBpZm51bTsKKwkvKiBpbnRlcmZhY2Ugc3RydWN0dXJlIGluIDIuNiAqLworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2U7CisJLyogY29tZWRpIGRldmljZSBmb3IgdGhlIGludGVycnVwdCBjb250ZXh0ICovCisJY29tZWRpX2RldmljZSAqY29tZWRpZGV2OworCS8qIGlzIGl0IFVTQl9TUEVFRF9ISUdIIG9yIG5vdD8gKi8KKwlzaG9ydCBpbnQgaGlnaF9zcGVlZDsKKwkvKiBhc3luY2hyb25vdXMgY29tbWFuZCBpcyBydW5uaW5nICovCisJc2hvcnQgaW50IGFpX2NtZF9ydW5uaW5nOworCXNob3J0IGludCBhb19jbWRfcnVubmluZzsKKwkvKiBwd20gaXMgcnVubmluZyAqLworCXNob3J0IGludCBwd21fY21kX3J1bm5pbmc7CisJLyogY29udGlub3VzIGFxdWlzaXRpb24gKi8KKwlzaG9ydCBpbnQgYWlfY29udGlub3VzOworCXNob3J0IGludCBhb19jb250aW5vdXM7CisJLyogbnVtYmVyIG9mIHNhbXBsZXMgdG8gYXF1aXJlICovCisJaW50IGFpX3NhbXBsZV9jb3VudDsKKwlpbnQgYW9fc2FtcGxlX2NvdW50OworCS8qIHRpbWUgYmV0d2VlbiBzYW1wbGVzIGluIHVuaXRzIG9mIHRoZSB0aW1lciAqLworCXVuc2lnbmVkIGludCBhaV90aW1lcjsKKwl1bnNpZ25lZCBpbnQgYW9fdGltZXI7CisJLyogY291bnRlciBiZXR3ZWVuIGFxdWlzaXRpb25zICovCisJdW5zaWduZWQgaW50IGFpX2NvdW50ZXI7CisJdW5zaWduZWQgaW50IGFvX2NvdW50ZXI7CisJLyogaW50ZXJ2YWwgaW4gZnJhbWVzL3VmcmFtZXMgKi8KKwl1bnNpZ25lZCBpbnQgYWlfaW50ZXJ2YWw7CisJLyogRC9BIGNvbW1hbmRzICovCisJaW50OF90ICpkYWNfY29tbWFuZHM7CisJLyogY29tbWFuZHMgKi8KKwlpbnQ4X3QgKmR1eF9jb21tYW5kczsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHNlbTsKK307CisKKy8qCisgKiBUaGUgcG9pbnRlciB0byB0aGUgcHJpdmF0ZSB1c2ItZGF0YSBvZiB0aGUgZHJpdmVyIGlzIGFsc28gdGhlIHByaXZhdGUgZGF0YQorICogZm9yIHRoZSBjb21lZGktZGV2aWNlLiAgVGhpcyBoYXMgdG8gYmUgZ2xvYmFsIGFzIHRoZSB1c2Igc3Vic3lzdGVtIG5lZWRzCisgKiBnbG9iYWwgdmFyaWFibGVzLiBUaGUgb3RoZXIgcmVhc29uIGlzIHRoYXQgdGhpcyBzdHJ1Y3R1cmUgbXVzdCBiZSB0aGVyZQorICogX2JlZm9yZV8gYW55IGNvbWVkaSBjb21tYW5kIGlzIGlzc3VlZC4gVGhlIHVzYiBzdWJzeXN0ZW0gbXVzdCBiZSBpbml0aWFsaXNlZAorICogYmVmb3JlIGNvbWVkaSBjYW4gYWNjZXNzIGl0LgorICovCitzdGF0aWMgc3RydWN0IHVzYmR1eHN1YiB1c2JkdXhzdWJbTlVNVVNCRFVYXTsKKworc3RhdGljIERFQ0xBUkVfTVVURVgoc3RhcnRfc3RvcF9zZW0pOworCisvKgorICogU3RvcHMgdGhlIGRhdGEgYWNxdWlzaW9uCisgKiBJdCBzaG91bGQgYmUgc2FmZSB0byBjYWxsIHRoaXMgZnVuY3Rpb24gZnJvbSBhbnkgY29udGV4dAorICovCitzdGF0aWMgaW50IHVzYmR1eHN1Yl91bmxpbmtfSW5VUkJzKHN0cnVjdCB1c2JkdXhzdWIgKnVzYmR1eHN1Yl90bXApCit7CisJaW50IGkgPSAwOworCWludCBlcnIgPSAwOworCisJaWYgKHVzYmR1eHN1Yl90bXAgJiYgdXNiZHV4c3ViX3RtcC0+dXJiSW4pIHsKKwkJZm9yIChpID0gMDsgaSA8IHVzYmR1eHN1Yl90bXAtPm51bU9mSW5CdWZmZXJzOyBpKyspIHsKKwkJCWlmICh1c2JkdXhzdWJfdG1wLT51cmJJbltpXSkgeworCQkJCS8qIFdlIHdhaXQgaGVyZSB1bnRpbCBhbGwgdHJhbnNmZXJzIGhhdmUgYmVlbgorCQkJCSAqIGNhbmNlbGxlZC4gKi8KKwkJCQl1c2Jfa2lsbF91cmIodXNiZHV4c3ViX3RtcC0+dXJiSW5baV0pOworCQkJfQorCQkJZGV2X2RiZygmdXNiZHV4c3ViX3RtcC0+aW50ZXJmYWNlLT5kZXYsCisJCQkJImNvbWVkaTogdXNiZHV4OiB1bmxpbmtlZCBJblVSQiAlZCwgZXJyPSVkXG4iLAorCQkJCWksIGVycik7CisJCX0KKwl9CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFRoaXMgd2lsbCBzdG9wIGEgcnVubmluZyBhY3F1aXNpdGlvbiBvcGVyYXRpb24KKyAqIElzIGNhbGxlZCBmcm9tIHdpdGhpbiB0aGlzIGRyaXZlciBmcm9tIGJvdGggdGhlCisgKiBpbnRlcnJ1cHQgY29udGV4dCBhbmQgZnJvbSBjb21lZGkKKyAqLworc3RhdGljIGludCB1c2JkdXhfYWlfc3RvcChzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiwgaW50IGRvX3VubGluaykKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICghdGhpc191c2JkdXhzdWIpIHsKKwkJZGV2X2VycigmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaT86IHVzYmR1eF9haV9zdG9wOiB0aGlzX3VzYmR1eHN1Yj1OVUxMIVxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlkZXZfZGJnKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsICJjb21lZGk6IHVzYmR1eF9haV9zdG9wXG4iKTsKKworCWlmIChkb191bmxpbmspIHsKKwkJLyogc3RvcCBhcXVpc3Rpb24gKi8KKwkJcmV0ID0gdXNiZHV4c3ViX3VubGlua19JblVSQnModGhpc191c2JkdXhzdWIpOworCX0KKworCXRoaXNfdXNiZHV4c3ViLT5haV9jbWRfcnVubmluZyA9IDA7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogVGhpcyB3aWxsIGNhbmNlbCBhIHJ1bm5pbmcgYWNxdWlzaXRpb24gb3BlcmF0aW9uLgorICogVGhpcyBpcyBjYWxsZWQgYnkgY29tZWRpIGJ1dCBuZXZlciBmcm9tIGluc2lkZSB0aGUgZHJpdmVyLgorICovCitzdGF0aWMgaW50IHVzYmR1eF9haV9jYW5jZWwoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzKQoreworCXN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViOworCWludCByZXMgPSAwOworCisJLyogZm9yY2UgdW5saW5rIG9mIGFsbCB1cmJzICovCisJdGhpc191c2JkdXhzdWIgPSBkZXYtPnByaXZhdGU7CisJaWYgKCF0aGlzX3VzYmR1eHN1YikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkZXZfZGJnKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsICJjb21lZGk6IHVzYmR1eF9haV9jYW5jZWxcbiIpOworCisJLyogcHJldmVudCBvdGhlciBDUFVzIGZyb20gc3VibWl0dGluZyBuZXcgY29tbWFuZHMganVzdCBub3cgKi8KKwlkb3duKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwlpZiAoISh0aGlzX3VzYmR1eHN1Yi0+cHJvYmVkKSkgeworCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwkvKiB1bmxpbmsgb25seSBpZiB0aGUgdXJiIHJlYWxseSBoYXMgYmVlbiBzdWJtaXR0ZWQgKi8KKwlyZXMgPSB1c2JkdXhfYWlfc3RvcCh0aGlzX3VzYmR1eHN1YiwgdGhpc191c2JkdXhzdWItPmFpX2NtZF9ydW5uaW5nKTsKKwl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJcmV0dXJuIHJlczsKK30KKworLyogYW5hbG9ndWUgSU4gLSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lICovCitzdGF0aWMgdm9pZCB1c2JkdXhzdWJfYWlfSXNvY0lycShzdHJ1Y3QgdXJiICp1cmIpCit7CisJaW50IGksIGVyciwgbjsKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YjsKKwljb21lZGlfZGV2aWNlICp0aGlzX2NvbWVkaWRldjsKKwljb21lZGlfc3ViZGV2aWNlICpzOworCisJLyogdGhlIGNvbnRleHQgdmFyaWFibGUgcG9pbnRzIHRvIHRoZSBzdWJkZXZpY2UgKi8KKwl0aGlzX2NvbWVkaWRldiA9IHVyYi0+Y29udGV4dDsKKwkvKiB0aGUgcHJpdmF0ZSBzdHJ1Y3R1cmUgb2YgdGhlIHN1YmRldmljZSBpcyBzdHJ1Y3QgdXNiZHV4c3ViICovCisJdGhpc191c2JkdXhzdWIgPSB0aGlzX2NvbWVkaWRldi0+cHJpdmF0ZTsKKwkvKiBzdWJkZXZpY2Ugd2hpY2ggaXMgdGhlIEFEIGNvbnZlcnRlciAqLworCXMgPSB0aGlzX2NvbWVkaWRldi0+c3ViZGV2aWNlcyArIFNVQkRFVl9BRDsKKworCS8qIGZpcnN0IHdlIHRlc3QgaWYgc29tZXRoaW5nIHVudXN1YWwgaGFzIGp1c3QgaGFwcGVuZWQgKi8KKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJY2FzZSAwOgorCQkvKiBjb3B5IHRoZSByZXN1bHQgaW4gdGhlIHRyYW5zZmVyIGJ1ZmZlciAqLworCQltZW1jcHkodGhpc191c2JkdXhzdWItPmluQnVmZmVyLAorCQkJdXJiLT50cmFuc2Zlcl9idWZmZXIsIFNJWkVJTkJVRik7CisJCWJyZWFrOworCWNhc2UgLUVJTFNFUToKKwkJLyogZXJyb3IgaW4gdGhlIElTT2Nocm9ub3VzIGRhdGEgKi8KKwkJLyogd2UgZG9uJ3QgY29weSB0aGUgZGF0YSBpbnRvIHRoZSB0cmFuc2ZlciBidWZmZXIgKi8KKwkJLyogYW5kIHJlY3ljbGUgdGhlIGxhc3QgZGF0YSBieXRlICovCisJCWRldl9kYmcoJnVyYi0+ZGV2LT5kZXYsCisJCQkiY29tZWRpJWQ6IHVzYmR1eDogQ1JDIGVycm9yIGluIElTTyBJTiBzdHJlYW0uXG4iLAorCQkJdGhpc191c2JkdXhzdWItPmNvbWVkaWRldi0+bWlub3IpOworCisJCWJyZWFrOworCisJY2FzZSAtRUNPTk5SRVNFVDoKKwljYXNlIC1FTk9FTlQ6CisJY2FzZSAtRVNIVVRET1dOOgorCWNhc2UgLUVDT05OQUJPUlRFRDoKKwkJLyogaGFwcGVucyBhZnRlciBhbiB1bmxpbmsgY29tbWFuZCAqLworCQlpZiAodGhpc191c2JkdXhzdWItPmFpX2NtZF9ydW5uaW5nKSB7CisJCQkvKiB3ZSBhcmUgc3RpbGwgcnVubmluZyBhIGNvbW1hbmQgKi8KKwkJCS8qIHRlbGwgdGhpcyBjb21lZGkgKi8KKwkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKKwkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VSUk9SOworCQkJY29tZWRpX2V2ZW50KHRoaXNfdXNiZHV4c3ViLT5jb21lZGlkZXYsIHMpOworCQkJLyogc3RvcCB0aGUgdHJhbnNmZXIgdy9vIHVubGluayAqLworCQkJdXNiZHV4X2FpX3N0b3AodGhpc191c2JkdXhzdWIsIDApOworCQl9CisJCXJldHVybjsKKworCWRlZmF1bHQ6CisJCS8qIGEgcmVhbCBlcnJvciBvbiB0aGUgYnVzICovCisJCS8qIHBhc3MgZXJyb3IgdG8gY29tZWRpIGlmIHdlIGFyZSByZWFsbHkgcnVubmluZyBhIGNvbW1hbmQgKi8KKwkJaWYgKHRoaXNfdXNiZHV4c3ViLT5haV9jbWRfcnVubmluZykgeworCQkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwKKwkJCQkiTm9uLXplcm8gdXJiIHN0YXR1cyByZWNlaXZlZCBpbiBhaSBpbnRyICIKKwkJCQkiY29udGV4dDogJWRcbiIsIHVyYi0+c3RhdHVzKTsKKwkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKKwkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VSUk9SOworCQkJY29tZWRpX2V2ZW50KHRoaXNfdXNiZHV4c3ViLT5jb21lZGlkZXYsIHMpOworCQkJLyogZG9uJ3QgZG8gYW4gdW5saW5rIGhlcmUgKi8KKwkJCXVzYmR1eF9haV9zdG9wKHRoaXNfdXNiZHV4c3ViLCAwKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBhdCB0aGlzIHBvaW50IHdlIGFyZSByZWFzb25hYmx5IHN1cmUgdGhhdCBub3RoaW5nIGRvZGd5IGhhcyBoYXBwZW5lZAorCSAqIGFyZSB3ZSBydW5uaW5nIGEgY29tbWFuZD8KKwkgKi8KKwlpZiAodW5saWtlbHkoKCEodGhpc191c2JkdXhzdWItPmFpX2NtZF9ydW5uaW5nKSkpKSB7CisJCS8qCisJCSAqIG5vdCBydW5uaW5nIGEgY29tbWFuZCwgZG8gbm90IGNvbnRpbnVlIGV4ZWN1dGlvbiBpZiBubworCQkgKiBhc3luY2hyb25vdXMgY29tbWFuZCBpcyBydW5uaW5nIGluIHBhcnRpY3VsYXIgbm90IHJlc3VibWl0CisJCSAqLworCQlyZXR1cm47CisJfQorCisJdXJiLT5kZXYgPSB0aGlzX3VzYmR1eHN1Yi0+dXNiZGV2OworCisJLyogcmVzdWJtaXQgdGhlIHVyYiAqLworCWVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKHVubGlrZWx5KGVyciA8IDApKSB7CisJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsCisJCQkiY29tZWRpXzogdXJiIHJlc3VibWl0IGZhaWxlZCBpbiBpbnQtY29udGV4dCEgZXJyPSVkXG4iLAorCQkJZXJyKTsKKwkJaWYgKGVyciA9PSAtRUwyTlNZTkMpCisJCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LAorCQkJCSJidWdneSBVU0IgaG9zdCBjb250cm9sbGVyIG9yIGJ1ZyBpbiBJUlEgIgorCQkJCSJoYW5kbGVyIVxuIik7CisJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKKwkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1I7CisJCWNvbWVkaV9ldmVudCh0aGlzX3VzYmR1eHN1Yi0+Y29tZWRpZGV2LCBzKTsKKwkJLyogZG9uJ3QgZG8gYW4gdW5saW5rIGhlcmUgKi8KKwkJdXNiZHV4X2FpX3N0b3AodGhpc191c2JkdXhzdWIsIDApOworCQlyZXR1cm47CisJfQorCisJdGhpc191c2JkdXhzdWItPmFpX2NvdW50ZXItLTsKKwlpZiAobGlrZWx5KHRoaXNfdXNiZHV4c3ViLT5haV9jb3VudGVyID4gMCkpCisJCXJldHVybjsKKworCS8qIHRpbWVyIHplcm8sIHRyYW5zZmVyIG1lYXN1cmVtZW50cyB0byBjb21lZGkgKi8KKwl0aGlzX3VzYmR1eHN1Yi0+YWlfY291bnRlciA9IHRoaXNfdXNiZHV4c3ViLT5haV90aW1lcjsKKworCS8qIHRlc3QsIGlmIHdlIHRyYW5zbWl0IG9ubHkgYSBmaXhlZCBudW1iZXIgb2Ygc2FtcGxlcyAqLworCWlmICghKHRoaXNfdXNiZHV4c3ViLT5haV9jb250aW5vdXMpKSB7CisJCS8qIG5vdCBjb250aW5vdXMsIGZpeGVkIG51bWJlciBvZiBzYW1wbGVzICovCisJCXRoaXNfdXNiZHV4c3ViLT5haV9zYW1wbGVfY291bnQtLTsKKwkJLyogYWxsIHNhbXBsZXMgcmVjZWl2ZWQ/ICovCisJCWlmICh0aGlzX3VzYmR1eHN1Yi0+YWlfc2FtcGxlX2NvdW50IDwgMCkgeworCQkJLyogcHJldmVudCBhIHJlc3VibWl0IG5leHQgdGltZSAqLworCQkJdXNiZHV4X2FpX3N0b3AodGhpc191c2JkdXhzdWIsIDApOworCQkJLyogc2F5IGNvbWVkaSB0aGF0IHRoZSBhY3F1aXN0aW9uIGlzIG92ZXIgKi8KKwkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKKwkJCWNvbWVkaV9ldmVudCh0aGlzX3VzYmR1eHN1Yi0+Y29tZWRpZGV2LCBzKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwkvKiBnZXQgdGhlIGRhdGEgZnJvbSB0aGUgVVNCIGJ1cyBhbmQgaGFuZCBpdCBvdmVyIHRvIGNvbWVkaSAqLworCW4gPSBzLT5hc3luYy0+Y21kLmNoYW5saXN0X2xlbjsKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCS8qIHRyYW5zZmVyIGRhdGEgKi8KKwkJaWYgKENSX1JBTkdFKHMtPmFzeW5jLT5jbWQuY2hhbmxpc3RbaV0pIDw9IDEpIHsKKwkJCWNvbWVkaV9idWZfcHV0CisJCQkJKHMtPmFzeW5jLAorCQkJCWxlMTZfdG9fY3B1KHRoaXNfdXNiZHV4c3ViLT4KKwkJCQkJaW5CdWZmZXJbaV0pIF4gMHg4MDApOworCQl9IGVsc2UgeworCQkJY29tZWRpX2J1Zl9wdXQKKwkJCQkocy0+YXN5bmMsCisJCQkJbGUxNl90b19jcHUodGhpc191c2JkdXhzdWItPmluQnVmZmVyW2ldKSk7CisJCX0KKwl9CisJLyogdGVsbCBjb21lZGkgdGhhdCBkYXRhIGlzIHRoZXJlICovCisJY29tZWRpX2V2ZW50KHRoaXNfdXNiZHV4c3ViLT5jb21lZGlkZXYsIHMpOworfQorCitzdGF0aWMgaW50IHVzYmR1eHN1Yl91bmxpbmtfT3V0VVJCcyhzdHJ1Y3QgdXNiZHV4c3ViICp1c2JkdXhzdWJfdG1wKQoreworCWludCBpID0gMDsKKwlpbnQgZXJyID0gMDsKKworCWlmICh1c2JkdXhzdWJfdG1wICYmIHVzYmR1eHN1Yl90bXAtPnVyYk91dCkgeworCQlmb3IgKGkgPSAwOyBpIDwgdXNiZHV4c3ViX3RtcC0+bnVtT2ZPdXRCdWZmZXJzOyBpKyspIHsKKwkJCWlmICh1c2JkdXhzdWJfdG1wLT51cmJPdXRbaV0pCisJCQkJdXNiX2tpbGxfdXJiKHVzYmR1eHN1Yl90bXAtPnVyYk91dFtpXSk7CisKKwkJCWRldl9kYmcoJnVzYmR1eHN1Yl90bXAtPmludGVyZmFjZS0+ZGV2LAorCQkJCSJjb21lZGk6IHVzYmR1eDogdW5saW5rZWQgT3V0VVJCICVkOiByZXM9JWRcbiIsCisJCQkJaSwgZXJyKTsKKwkJfQorCX0KKwlyZXR1cm4gZXJyOworfQorCisvKiBUaGlzIHdpbGwgY2FuY2VsIGEgcnVubmluZyBhY3F1aXNpdGlvbiBvcGVyYXRpb24KKyAqIGluIGFueSBjb250ZXh0LgorICovCitzdGF0aWMgaW50IHVzYmR1eF9hb19zdG9wKHN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViLCBpbnQgZG9fdW5saW5rKQoreworCWludCByZXQgPSAwOworCisJaWYgKCF0aGlzX3VzYmR1eHN1YikKKwkJcmV0dXJuIC1FRkFVTFQ7CisJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LCAiY29tZWRpOiB1c2JkdXhfYW9fY2FuY2VsXG4iKTsKKworCWlmIChkb191bmxpbmspCisJCXJldCA9IHVzYmR1eHN1Yl91bmxpbmtfT3V0VVJCcyh0aGlzX3VzYmR1eHN1Yik7CisKKwl0aGlzX3VzYmR1eHN1Yi0+YW9fY21kX3J1bm5pbmcgPSAwOworCisJcmV0dXJuIHJldDsKK30KKworLyogZm9yY2UgdW5saW5rLCBpcyBjYWxsZWQgYnkgY29tZWRpICovCitzdGF0aWMgaW50IHVzYmR1eF9hb19jYW5jZWwoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzKQoreworCXN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViID0gZGV2LT5wcml2YXRlOworCWludCByZXMgPSAwOworCisJaWYgKCF0aGlzX3VzYmR1eHN1YikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKiBwcmV2ZW50IG90aGVyIENQVXMgZnJvbSBzdWJtaXR0aW5nIGEgY29tbWFuZCBqdXN0IG5vdyAqLworCWRvd24oJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCWlmICghKHRoaXNfdXNiZHV4c3ViLT5wcm9iZWQpKSB7CisJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCS8qIHVubGluayBvbmx5IGlmIGl0IGlzIHJlYWxseSBydW5uaW5nICovCisJcmVzID0gdXNiZHV4X2FvX3N0b3AodGhpc191c2JkdXhzdWIsIHRoaXNfdXNiZHV4c3ViLT5hb19jbWRfcnVubmluZyk7CisJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIHVzYmR1eHN1Yl9hb19Jc29jSXJxKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlpbnQgaSwgcmV0OworCWludDhfdCAqZGF0YXA7CisJc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWI7CisJY29tZWRpX2RldmljZSAqdGhpc19jb21lZGlkZXY7CisJY29tZWRpX3N1YmRldmljZSAqczsKKworCS8qIHRoZSBjb250ZXh0IHZhcmlhYmxlIHBvaW50cyB0byB0aGUgc3ViZGV2aWNlICovCisJdGhpc19jb21lZGlkZXYgPSB1cmItPmNvbnRleHQ7CisJLyogdGhlIHByaXZhdGUgc3RydWN0dXJlIG9mIHRoZSBzdWJkZXZpY2UgaXMgc3RydWN0IHVzYmR1eHN1YiAqLworCXRoaXNfdXNiZHV4c3ViID0gdGhpc19jb21lZGlkZXYtPnByaXZhdGU7CisKKwlzID0gdGhpc19jb21lZGlkZXYtPnN1YmRldmljZXMgKyBTVUJERVZfREE7CisKKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJY2FzZSAwOgorCQkvKiBzdWNjZXNzICovCisJCWJyZWFrOworCisJY2FzZSAtRUNPTk5SRVNFVDoKKwljYXNlIC1FTk9FTlQ6CisJY2FzZSAtRVNIVVRET1dOOgorCWNhc2UgLUVDT05OQUJPUlRFRDoKKwkJLyogYWZ0ZXIgYW4gdW5saW5rIGNvbW1hbmQsIHVucGx1ZywgLi4uIGV0YyAqLworCQkvKiBubyB1bmxpbmsgbmVlZGVkIGhlcmUuIEFscmVhZHkgc2h1dHRpbmcgZG93bi4gKi8KKwkJaWYgKHRoaXNfdXNiZHV4c3ViLT5hb19jbWRfcnVubmluZykgeworCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOworCQkJY29tZWRpX2V2ZW50KHRoaXNfdXNiZHV4c3ViLT5jb21lZGlkZXYsIHMpOworCQkJdXNiZHV4X2FvX3N0b3AodGhpc191c2JkdXhzdWIsIDApOworCQl9CisJCXJldHVybjsKKworCWRlZmF1bHQ6CisJCS8qIGEgcmVhbCBlcnJvciAqLworCQlpZiAodGhpc191c2JkdXhzdWItPmFvX2NtZF9ydW5uaW5nKSB7CisJCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LAorCQkJCSJjb21lZGlfOiBOb24temVybyB1cmIgc3RhdHVzIHJlY2VpdmVkIGluIGFvICIKKwkJCQkiaW50ciBjb250ZXh0OiAlZFxuIiwgdXJiLT5zdGF0dXMpOworCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1I7CisJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CisJCQljb21lZGlfZXZlbnQodGhpc191c2JkdXhzdWItPmNvbWVkaWRldiwgcyk7CisJCQkvKiB3ZSBkbyBhbiB1bmxpbmsgaWYgd2UgYXJlIGluIHRoZSBoaWdoIHNwZWVkIG1vZGUgKi8KKwkJCXVzYmR1eF9hb19zdG9wKHRoaXNfdXNiZHV4c3ViLCAwKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJLyogYXJlIHdlIGFjdHVhbGx5IHJ1bm5pbmc/ICovCisJaWYgKCEodGhpc191c2JkdXhzdWItPmFvX2NtZF9ydW5uaW5nKSkKKwkJcmV0dXJuOworCisJLyogbm9ybWFsIG9wZXJhdGlvbjogZXhlY3V0aW5nIGEgY29tbWFuZCBpbiB0aGlzIHN1YmRldmljZSAqLworCXRoaXNfdXNiZHV4c3ViLT5hb19jb3VudGVyLS07CisJaWYgKHRoaXNfdXNiZHV4c3ViLT5hb19jb3VudGVyIDw9IDApIHsKKwkJLyogdGltZXIgemVybyAqLworCQl0aGlzX3VzYmR1eHN1Yi0+YW9fY291bnRlciA9IHRoaXNfdXNiZHV4c3ViLT5hb190aW1lcjsKKworCQkvKiBoYW5kbGUgbm9uIGNvbnRpbm91cyBhcXVpc2l0aW9uICovCisJCWlmICghKHRoaXNfdXNiZHV4c3ViLT5hb19jb250aW5vdXMpKSB7CisJCQkvKiBmaXhlZCBudW1iZXIgb2Ygc2FtcGxlcyAqLworCQkJdGhpc191c2JkdXhzdWItPmFvX3NhbXBsZV9jb3VudC0tOworCQkJaWYgKHRoaXNfdXNiZHV4c3ViLT5hb19zYW1wbGVfY291bnQgPCAwKSB7CisJCQkJLyogYWxsIHNhbXBsZXMgdHJhbnNtaXR0ZWQgKi8KKwkJCQl1c2JkdXhfYW9fc3RvcCh0aGlzX3VzYmR1eHN1YiwgMCk7CisJCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOworCQkJCWNvbWVkaV9ldmVudCh0aGlzX3VzYmR1eHN1Yi0+Y29tZWRpZGV2LCBzKTsKKwkJCQkvKiBubyByZXN1Ym1pdCBvZiB0aGUgdXJiICovCisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCS8qIHRyYW5zbWl0IGRhdGEgdG8gdGhlIFVTQiBidXMgKi8KKwkJKCh1aW50OF90ICopICh1cmItPnRyYW5zZmVyX2J1ZmZlcikpWzBdID0KKwkJCXMtPmFzeW5jLT5jbWQuY2hhbmxpc3RfbGVuOworCQlmb3IgKGkgPSAwOyBpIDwgcy0+YXN5bmMtPmNtZC5jaGFubGlzdF9sZW47IGkrKykgeworCQkJc2FtcGxfdCB0ZW1wOworCQkJaWYgKGkgPj0gTlVNT1VUQ0hBTk5FTFMpCisJCQkJYnJlYWs7CisKKwkJCS8qIHBvaW50ZXIgdG8gdGhlIERBICovCisJCQlkYXRhcCA9CisJCQkgICAgICAgKCYoKChpbnQ4X3QgKil1cmItPnRyYW5zZmVyX2J1ZmZlcilbaSAqIDMgKyAxXSkpOworCQkJLyogZ2V0IHRoZSBkYXRhIGZyb20gY29tZWRpICovCisJCQlyZXQgPSBjb21lZGlfYnVmX2dldChzLT5hc3luYywgJnRlbXApOworCQkJZGF0YXBbMF0gPSB0ZW1wOworCQkJZGF0YXBbMV0gPSB0ZW1wID4+IDg7CisJCQlkYXRhcFsyXSA9IHRoaXNfdXNiZHV4c3ViLT5kYWNfY29tbWFuZHNbaV07CisJCQkvKiBwcmludGsoImRhdGFbMF09JXgsIGRhdGFbMV09JXgsIGRhdGFbMl09JXhcbiIsICovCisJCQkvKiBkYXRhcFswXSxkYXRhcFsxXSxkYXRhcFsyXSk7ICovCisJCQlpZiAocmV0IDwgMCkgeworCQkJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsCisJCQkJCSJjb21lZGk6IGJ1ZmZlciB1bmRlcmZsb3dcbiIpOworCQkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKKwkJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9PVkVSRkxPVzsKKwkJCX0KKwkJCS8qIHRyYW5zbWl0IGRhdGEgdG8gY29tZWRpICovCisJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9CTE9DSzsKKwkJCWNvbWVkaV9ldmVudCh0aGlzX3VzYmR1eHN1Yi0+Y29tZWRpZGV2LCBzKTsKKwkJfQorCX0KKwl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBTSVpFT1VUQlVGOworCXVyYi0+ZGV2ID0gdGhpc191c2JkdXhzdWItPnVzYmRldjsKKwl1cmItPnN0YXR1cyA9IDA7CisJaWYgKHRoaXNfdXNiZHV4c3ViLT5hb19jbWRfcnVubmluZykgeworCQlpZiAodGhpc191c2JkdXhzdWItPmhpZ2hfc3BlZWQpIHsKKwkJCS8qIHVmcmFtZXMgKi8KKwkJCXVyYi0+aW50ZXJ2YWwgPSA4OworCQl9IGVsc2UgeworCQkJLyogZnJhbWVzICovCisJCQl1cmItPmludGVydmFsID0gMTsKKwkJfQorCQl1cmItPm51bWJlcl9vZl9wYWNrZXRzID0gMTsKKwkJdXJiLT5pc29fZnJhbWVfZGVzY1swXS5vZmZzZXQgPSAwOworCQl1cmItPmlzb19mcmFtZV9kZXNjWzBdLmxlbmd0aCA9IFNJWkVPVVRCVUY7CisJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbMF0uc3RhdHVzID0gMDsKKwkJcmV0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsCisJCQkJImNvbWVkaV86IGFvIHVyYiByZXN1Ym0gZmFpbGVkIGluIGludC1jb250LiAiCisJCQkJInJldD0lZCIsIHJldCk7CisJCQlpZiAocmV0ID09IEVMMk5TWU5DKQorCQkJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsCisJCQkJCSJidWdneSBVU0IgaG9zdCBjb250cm9sbGVyIG9yIGJ1ZyBpbiAiCisJCQkJCSJJUlEgaGFuZGxpbmchXG4iKTsKKworCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOworCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1I7CisJCQljb21lZGlfZXZlbnQodGhpc191c2JkdXhzdWItPmNvbWVkaWRldiwgcyk7CisJCQkvKiBkb24ndCBkbyBhbiB1bmxpbmsgaGVyZSAqLworCQkJdXNiZHV4X2FvX3N0b3AodGhpc191c2JkdXhzdWIsIDApOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IHVzYmR1eHN1Yl9zdGFydChzdHJ1Y3QgdXNiZHV4c3ViICp1c2JkdXhzdWIpCit7CisJaW50IGVycmNvZGUgPSAwOworCXVpbnQ4X3QgbG9jYWxfdHJhbnNmZXJfYnVmZmVyWzE2XTsKKworCWlmICh1c2JkdXhzdWItPnByb2JlZCkgeworCQkvKiA3ZjkyIHRvIHplcm8gKi8KKwkJbG9jYWxfdHJhbnNmZXJfYnVmZmVyWzBdID0gMDsKKwkJZXJyY29kZSA9IHVzYl9jb250cm9sX21zZyh1c2JkdXhzdWItPnVzYmRldiwKKwkJCS8qIGNyZWF0ZSBhIHBpcGUgZm9yIGEgY29udHJvbCB0cmFuc2ZlciAqLworCQkJdXNiX3NuZGN0cmxwaXBlKHVzYmR1eHN1Yi0+dXNiZGV2LCAwKSwKKwkJCS8qIGJSZXF1ZXN0LCAiRmlybXdhcmUiICovCisJCQlVU0JEVVhTVUJfRklSTVdBUkUsCisJCQkvKiBibVJlcXVlc3RUeXBlICovCisJCQlWRU5ET1JfRElSX09VVCwKKwkJCS8qIFZhbHVlICovCisJCQlVU0JEVVhTVUJfQ1BVQ1MsCisJCQkvKiBJbmRleCAqLworCQkJMHgwMDAwLAorCQkJLyogYWRkcmVzcyBvZiB0aGUgdHJhbnNmZXIgYnVmZmVyICovCisJCQlsb2NhbF90cmFuc2Zlcl9idWZmZXIsCisJCQkvKiBMZW5ndGggKi8KKwkJCTEsCisJCQkvKiBUaW1lb3V0ICovCisJCQlFWlRJTUVPVVQpOworCQlpZiAoZXJyY29kZSA8IDApIHsKKwkJCWRldl9lcnIoJnVzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkJImNvbWVkaV86IGNvbnRyb2wgbXNnIGZhaWxlZCAoc3RhcnQpXG4iKTsKKwkJCXJldHVybiBlcnJjb2RlOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYmR1eHN1Yl9zdG9wKHN0cnVjdCB1c2JkdXhzdWIgKnVzYmR1eHN1YikKK3sKKwlpbnQgZXJyY29kZSA9IDA7CisKKwl1aW50OF90IGxvY2FsX3RyYW5zZmVyX2J1ZmZlclsxNl07CisJaWYgKHVzYmR1eHN1Yi0+cHJvYmVkKSB7CisJCS8qIDdmOTIgdG8gb25lICovCisJCWxvY2FsX3RyYW5zZmVyX2J1ZmZlclswXSA9IDE7CisJCWVycmNvZGUgPSB1c2JfY29udHJvbF9tc2codXNiZHV4c3ViLT51c2JkZXYsCisJCQl1c2Jfc25kY3RybHBpcGUodXNiZHV4c3ViLT51c2JkZXYsIDApLAorCQkJLyogYlJlcXVlc3QsICJGaXJtd2FyZSIgKi8KKwkJCVVTQkRVWFNVQl9GSVJNV0FSRSwKKwkJCS8qIGJtUmVxdWVzdFR5cGUgKi8KKwkJCVZFTkRPUl9ESVJfT1VULAorCQkJLyogVmFsdWUgKi8KKwkJCVVTQkRVWFNVQl9DUFVDUywKKwkJCS8qIEluZGV4ICovCisJCQkweDAwMDAsIGxvY2FsX3RyYW5zZmVyX2J1ZmZlciwKKwkJCS8qIExlbmd0aCAqLworCQkJMSwKKwkJCS8qIFRpbWVvdXQgKi8KKwkJCUVaVElNRU9VVCk7CisJCWlmIChlcnJjb2RlIDwgMCkgeworCQkJZGV2X2VycigmdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCQkiY29tZWRpXzogY29udHJvbCBtc2cgZmFpbGVkIChzdG9wKVxuIik7CisJCQlyZXR1cm4gZXJyY29kZTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JkdXhzdWJfdXBsb2FkKHN0cnVjdCB1c2JkdXhzdWIgKnVzYmR1eHN1YiwKKwkJCSAgICB1aW50OF90ICpsb2NhbF90cmFuc2Zlcl9idWZmZXIsCisJCQkgICAgdW5zaWduZWQgaW50IHN0YXJ0QWRkciwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlpbnQgZXJyY29kZTsKKworCWlmICh1c2JkdXhzdWItPnByb2JlZCkgeworCQlkZXZfZGJnKCZ1c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaSVkOiB1c2JkdXg6IHVwbG9hZGluZyAlZCBieXRlcyIKKwkJCSIgdG8gYWRkciAlZCwgZmlyc3QgYnl0ZT0lZC5cbiIsCisJCQl1c2JkdXhzdWItPmNvbWVkaWRldi0+bWlub3IsIGxlbiwKKwkJCXN0YXJ0QWRkciwgbG9jYWxfdHJhbnNmZXJfYnVmZmVyWzBdKTsKKwkJZXJyY29kZSA9IHVzYl9jb250cm9sX21zZyh1c2JkdXhzdWItPnVzYmRldiwKKwkJCXVzYl9zbmRjdHJscGlwZSh1c2JkdXhzdWItPnVzYmRldiwgMCksCisJCQkvKiBicmVxdWVzdCwgZmlybXdhcmUgKi8KKwkJCVVTQkRVWFNVQl9GSVJNV0FSRSwKKwkJCS8qIGJtUmVxdWVzdFR5cGUgKi8KKwkJCVZFTkRPUl9ESVJfT1VULAorCQkJLyogdmFsdWUgKi8KKwkJCXN0YXJ0QWRkciwKKwkJCS8qIGluZGV4ICovCisJCQkweDAwMDAsCisJCQkvKiBvdXIgbG9jYWwgc2FmZSBidWZmZXIgKi8KKwkJCWxvY2FsX3RyYW5zZmVyX2J1ZmZlciwKKwkJCS8qIGxlbmd0aCAqLworCQkJbGVuLAorCQkJLyogdGltZW91dCAqLworCQkJRVpUSU1FT1VUKTsKKwkJZGV2X2RiZygmdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCSJjb21lZGlfOiByZXN1bHQ9JWRcbiIsIGVycmNvZGUpOworCQlpZiAoZXJyY29kZSA8IDApIHsKKwkJCWRldl9lcnIoJnVzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkJImNvbWVkaV86IHVwbG9hZCBmYWlsZWRcbiIpOworCQkJcmV0dXJuIGVycmNvZGU7CisJCX0KKwl9IGVsc2UgeworCQkvKiBubyBkZXZpY2Ugb24gdGhlIGJ1cyBmb3IgdGhpcyBpbmRleCAqLworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlybXdhcmVVcGxvYWQoc3RydWN0IHVzYmR1eHN1YiAqdXNiZHV4c3ViLCB1aW50OF90ICpmaXJtd2FyZUJpbmFyeSwKKwkJCSAgaW50IHNpemVGaXJtd2FyZSkKK3sKKwlpbnQgcmV0OworCisJaWYgKCFmaXJtd2FyZUJpbmFyeSkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSB1c2JkdXhzdWJfc3RvcCh1c2JkdXhzdWIpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnVzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpXzogY2FuIG5vdCBzdG9wIGZpcm13YXJlXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0ID0gdXNiZHV4c3ViX3VwbG9hZCh1c2JkdXhzdWIsIGZpcm13YXJlQmluYXJ5LCAwLCBzaXplRmlybXdhcmUpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnVzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpXzogZmlybXdhcmUgdXBsb2FkIGZhaWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCXJldCA9IHVzYmR1eHN1Yl9zdGFydCh1c2JkdXhzdWIpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnVzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpXzogY2FuIG5vdCBzdGFydCBmaXJtd2FyZVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYmR1eHN1Yl9zdWJtaXRfSW5VUkJzKHN0cnVjdCB1c2JkdXhzdWIgKnVzYmR1eHN1YikKK3sKKwlpbnQgaSwgZXJyRmxhZzsKKworCWlmICghdXNiZHV4c3ViKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qIFN1Ym1pdCBhbGwgVVJCcyBhbmQgc3RhcnQgdGhlIHRyYW5zZmVyIG9uIHRoZSBidXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgdXNiZHV4c3ViLT5udW1PZkluQnVmZmVyczsgaSsrKSB7CisJCS8qIGluIGNhc2Ugb2YgYSByZXN1Ym1pc3Npb24gYWZ0ZXIgYW4gdW5saW5rLi4uICovCisJCXVzYmR1eHN1Yi0+dXJiSW5baV0tPmludGVydmFsID0gdXNiZHV4c3ViLT5haV9pbnRlcnZhbDsKKwkJdXNiZHV4c3ViLT51cmJJbltpXS0+Y29udGV4dCA9IHVzYmR1eHN1Yi0+Y29tZWRpZGV2OworCQl1c2JkdXhzdWItPnVyYkluW2ldLT5kZXYgPSB1c2JkdXhzdWItPnVzYmRldjsKKwkJdXNiZHV4c3ViLT51cmJJbltpXS0+c3RhdHVzID0gMDsKKwkJdXNiZHV4c3ViLT51cmJJbltpXS0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVA7CisJCWRldl9kYmcoJnVzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpJWQ6IHN1Ym1pdHRpbmcgaW4tdXJiWyVkXTogJXAsJXAgaW50dj0lZFxuIiwKKwkJCXVzYmR1eHN1Yi0+Y29tZWRpZGV2LT5taW5vciwgaSwKKwkJCSh1c2JkdXhzdWItPnVyYkluW2ldLT5jb250ZXh0KSwKKwkJCSh1c2JkdXhzdWItPnVyYkluW2ldLT5kZXYpLAorCQkJKHVzYmR1eHN1Yi0+dXJiSW5baV0tPmludGVydmFsKSk7CisJCWVyckZsYWcgPSB1c2Jfc3VibWl0X3VyYih1c2JkdXhzdWItPnVyYkluW2ldLCBHRlBfQVRPTUlDKTsKKwkJaWYgKGVyckZsYWcpIHsKKwkJCWRldl9lcnIoJnVzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkJImNvbWVkaV86IGFpOiB1c2Jfc3VibWl0X3VyYiglZCkgZXJyb3IgJWRcbiIsCisJCQkJaSwgZXJyRmxhZyk7CisJCQlyZXR1cm4gZXJyRmxhZzsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JkdXhzdWJfc3VibWl0X091dFVSQnMoc3RydWN0IHVzYmR1eHN1YiAqdXNiZHV4c3ViKQoreworCWludCBpLCBlcnJGbGFnOworCisJaWYgKCF1c2JkdXhzdWIpCisJCXJldHVybiAtRUZBVUxUOworCisJZm9yIChpID0gMDsgaSA8IHVzYmR1eHN1Yi0+bnVtT2ZPdXRCdWZmZXJzOyBpKyspIHsKKwkJZGV2X2RiZygmdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCSJjb21lZGlfOiBzdWJtaXR0aW5nIG91dC11cmJbJWRdXG4iLCBpKTsKKwkJLyogaW4gY2FzZSBvZiBhIHJlc3VibWlzc2lvbiBhZnRlciBhbiB1bmxpbmsuLi4gKi8KKwkJdXNiZHV4c3ViLT51cmJPdXRbaV0tPmNvbnRleHQgPSB1c2JkdXhzdWItPmNvbWVkaWRldjsKKwkJdXNiZHV4c3ViLT51cmJPdXRbaV0tPmRldiA9IHVzYmR1eHN1Yi0+dXNiZGV2OworCQl1c2JkdXhzdWItPnVyYk91dFtpXS0+c3RhdHVzID0gMDsKKwkJdXNiZHV4c3ViLT51cmJPdXRbaV0tPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQOworCQllcnJGbGFnID0gdXNiX3N1Ym1pdF91cmIodXNiZHV4c3ViLT51cmJPdXRbaV0sIEdGUF9BVE9NSUMpOworCQlpZiAoZXJyRmxhZykgeworCQkJZGV2X2VycigmdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCQkiY29tZWRpXzogYW86IHVzYl9zdWJtaXRfdXJiKCVkKSBlcnJvciAlZFxuIiwKKwkJCQlpLCBlcnJGbGFnKTsKKwkJCXJldHVybiBlcnJGbGFnOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYmR1eF9haV9jbWR0ZXN0KGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgY29tZWRpX2NtZCAqY21kKQoreworCWludCBlcnIgPSAwLCB0bXAsIGk7CisJdW5zaWduZWQgaW50IHRtcFRpbWVyOworCXN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViID0gZGV2LT5wcml2YXRlOworCisJaWYgKCEodGhpc191c2JkdXhzdWItPnByb2JlZCkpCisJCXJldHVybiAtRU5PREVWOworCisJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkiY29tZWRpJWQ6IHVzYmR1eF9haV9jbWR0ZXN0XG4iLCBkZXYtPm1pbm9yKTsKKworCS8qIG1ha2Ugc3VyZSB0cmlnZ2VycyBhcmUgdmFsaWQgKi8KKwkvKiBPbmx5IGltbWVkaWF0ZSB0cmlnZ2VycyBhcmUgYWxsb3dlZCAqLworCXRtcCA9IGNtZC0+c3RhcnRfc3JjOworCWNtZC0+c3RhcnRfc3JjICY9IFRSSUdfTk9XIHwgVFJJR19JTlQ7CisJaWYgKCFjbWQtPnN0YXJ0X3NyYyB8fCB0bXAgIT0gY21kLT5zdGFydF9zcmMpCisJCWVycisrOworCisJLyogdHJpZ2dlciBzaG91bGQgaGFwcGVuIHRpbWVkICovCisJdG1wID0gY21kLT5zY2FuX2JlZ2luX3NyYzsKKwkvKiBzdGFydCBhIG5ldyBfc2Nhbl8gd2l0aCBhIHRpbWVyICovCisJY21kLT5zY2FuX2JlZ2luX3NyYyAmPSBUUklHX1RJTUVSOworCWlmICghY21kLT5zY2FuX2JlZ2luX3NyYyB8fCB0bXAgIT0gY21kLT5zY2FuX2JlZ2luX3NyYykKKwkJZXJyKys7CisKKwkvKiBzY2FubmluZyBpcyBjb250aW5vdXMgKi8KKwl0bXAgPSBjbWQtPmNvbnZlcnRfc3JjOworCWNtZC0+Y29udmVydF9zcmMgJj0gVFJJR19OT1c7CisJaWYgKCFjbWQtPmNvbnZlcnRfc3JjIHx8IHRtcCAhPSBjbWQtPmNvbnZlcnRfc3JjKQorCQllcnIrKzsKKworCS8qIGlzc3VlIGEgdHJpZ2dlciB3aGVuIHNjYW4gaXMgZmluaXNoZWQgYW5kIHN0YXJ0IGEgbmV3IHNjYW4gKi8KKwl0bXAgPSBjbWQtPnNjYW5fZW5kX3NyYzsKKwljbWQtPnNjYW5fZW5kX3NyYyAmPSBUUklHX0NPVU5UOworCWlmICghY21kLT5zY2FuX2VuZF9zcmMgfHwgdG1wICE9IGNtZC0+c2Nhbl9lbmRfc3JjKQorCQllcnIrKzsKKworCS8qIHRyaWdnZXIgYXQgdGhlIGVuZCBvZiBjb3VudCBldmVudHMgb3Igbm90LCBzdG9wIGNvbmRpdGlvbiBvciBub3QgKi8KKwl0bXAgPSBjbWQtPnN0b3Bfc3JjOworCWNtZC0+c3RvcF9zcmMgJj0gVFJJR19DT1VOVCB8IFRSSUdfTk9ORTsKKwlpZiAoIWNtZC0+c3RvcF9zcmMgfHwgdG1wICE9IGNtZC0+c3RvcF9zcmMpCisJCWVycisrOworCisJaWYgKGVycikKKwkJcmV0dXJuIDE7CisKKwkvKgorCSAqIHN0ZXAgMjogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlIGFuZCBtdXR1YWxseSBjb21wYXRpYmxlCisJICogbm90ZSB0aGF0IG11dHVhbCBjb21wYXRpYmxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUKKwkgKi8KKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX0ZPTExPVyAmJgorCQljbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfRVhUICYmCisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19USU1FUikKKwkJZXJyKys7CisJaWYgKGNtZC0+c3RvcF9zcmMgIT0gVFJJR19DT1VOVCAmJiBjbWQtPnN0b3Bfc3JjICE9IFRSSUdfTk9ORSkKKwkJZXJyKys7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gMjsKKworCS8qIHN0ZXAgMzogbWFrZSBzdXJlIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IGNvbXBhdGlibGUgKi8KKwlpZiAoY21kLT5zdGFydF9hcmcgIT0gMCkgeworCQljbWQtPnN0YXJ0X2FyZyA9IDA7CisJCWVycisrOworCX0KKworCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRk9MTE9XKSB7CisJCS8qIGludGVybmFsIHRyaWdnZXIgKi8KKwkJaWYgKGNtZC0+c2Nhbl9iZWdpbl9hcmcgIT0gMCkgeworCQkJY21kLT5zY2FuX2JlZ2luX2FyZyA9IDA7CisJCQllcnIrKzsKKwkJfQorCX0KKworCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKKwkJaWYgKHRoaXNfdXNiZHV4c3ViLT5oaWdoX3NwZWVkKSB7CisJCQkvKgorCQkJICogSW4gaGlnaCBzcGVlZCBtb2RlIG1pY3JvZnJhbWVzIGFyZSBwb3NzaWJsZS4KKwkJCSAqIEhvd2V2ZXIsIGR1cmluZyBvbmUgbWljcm9mcmFtZSB3ZSBjYW4gcm91Z2hseQorCQkJICogc2FtcGxlIG9uZSBjaGFubmVsLiBUaHVzLCB0aGUgbW9yZSBjaGFubmVscworCQkJICogYXJlIGluIHRoZSBjaGFubmVsIGxpc3QgdGhlIG1vcmUgdGltZSB3ZSBuZWVkLgorCQkJICovCisJCQlpID0gMTsKKwkJCS8qIGZpbmQgYSBwb3dlciBvZiAyIGZvciB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzICovCisJCQl3aGlsZSAoaSA8IChjbWQtPmNoYW5saXN0X2xlbikpCisJCQkJaSA9IGkgKiAyOworCisJCQlpZiAoY21kLT5zY2FuX2JlZ2luX2FyZyA8ICgxMDAwMDAwIC8gOCAqIGkpKSB7CisJCQkJY21kLT5zY2FuX2JlZ2luX2FyZyA9IDEwMDAwMDAgLyA4ICogaTsKKwkJCQllcnIrKzsKKwkJCX0KKwkJCS8qIG5vdyBjYWxjIHRoZSByZWFsIHNhbXBsaW5nIHJhdGUgd2l0aCBhbGwgdGhlCisJCQkgKiByb3VuZGluZyBlcnJvcnMgKi8KKwkJCXRtcFRpbWVyID0KKwkJCQkoKHVuc2lnbmVkIGludCkoY21kLT5zY2FuX2JlZ2luX2FyZyAvIDEyNTAwMCkpICoKKwkJCQkxMjUwMDA7CisJCQlpZiAoY21kLT5zY2FuX2JlZ2luX2FyZyAhPSB0bXBUaW1lcikgeworCQkJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPSB0bXBUaW1lcjsKKwkJCQllcnIrKzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIGZ1bGwgc3BlZWQgKi8KKwkJCS8qIDFrSHogc2NhbnMgZXZlcnkgVVNCIGZyYW1lICovCisJCQlpZiAoY21kLT5zY2FuX2JlZ2luX2FyZyA8IDEwMDAwMDApIHsKKwkJCQljbWQtPnNjYW5fYmVnaW5fYXJnID0gMTAwMDAwMDsKKwkJCQllcnIrKzsKKwkJCX0KKwkJCS8qCisJCQkgKiBjYWxjIHRoZSByZWFsIHNhbXBsaW5nIHJhdGUgd2l0aCB0aGUgcm91bmRpbmcgZXJyb3JzCisJCQkgKi8KKwkJCXRtcFRpbWVyID0gKCh1bnNpZ25lZCBpbnQpKGNtZC0+c2Nhbl9iZWdpbl9hcmcgLworCQkJCQkxMDAwMDAwKSkgKiAxMDAwMDAwOworCQkJaWYgKGNtZC0+c2Nhbl9iZWdpbl9hcmcgIT0gdG1wVGltZXIpIHsKKwkJCQljbWQtPnNjYW5fYmVnaW5fYXJnID0gdG1wVGltZXI7CisJCQkJZXJyKys7CisJCQl9CisJCX0KKwl9CisJLyogdGhlIHNhbWUgYXJndW1lbnQgKi8KKwlpZiAoY21kLT5zY2FuX2VuZF9hcmcgIT0gY21kLT5jaGFubGlzdF9sZW4pIHsKKwkJY21kLT5zY2FuX2VuZF9hcmcgPSBjbWQtPmNoYW5saXN0X2xlbjsKKwkJZXJyKys7CisJfQorCisJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkgeworCQkvKiBhbnkgY291bnQgaXMgYWxsb3dlZCAqLworCX0gZWxzZSB7CisJCS8qIFRSSUdfTk9ORSAqLworCQlpZiAoY21kLT5zdG9wX2FyZyAhPSAwKSB7CisJCQljbWQtPnN0b3BfYXJnID0gMDsKKwkJCWVycisrOworCQl9CisJfQorCisJaWYgKGVycikKKwkJcmV0dXJuIDM7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGNyZWF0ZXMgdGhlIEFEQyBjb21tYW5kIGZvciB0aGUgTUFYMTI3MQorICogcmFuZ2UgaXMgdGhlIHJhbmdlIHZhbHVlIGZyb20gY29tZWRpCisgKi8KK3N0YXRpYyBpbnQ4X3QgY3JlYXRlX2FkY19jb21tYW5kKHVuc2lnbmVkIGludCBjaGFuLCBpbnQgcmFuZ2UpCit7CisJaW50OF90IHAgPSAocmFuZ2UgPD0gMSk7CisJaW50OF90IHIgPSAoKHJhbmdlICUgMikgPT0gMCk7CisJcmV0dXJuIChjaGFuIDw8IDQpIHwgKChwID09IDEpIDw8IDIpIHwgKChyID09IDEpIDw8IDMpOworfQorCisvKiBidWxrIHRyYW5zZmVycyB0byB1c2JkdXggKi8KKworI2RlZmluZSBTRU5EQURDT01NQU5EUyAgICAgICAgICAgIDAKKyNkZWZpbmUgU0VORERBQ09NTUFORFMgICAgICAgICAgICAxCisjZGVmaW5lIFNFTkRESU9DT05GSUdDT01NQU5EICAgICAgMgorI2RlZmluZSBTRU5ERElPQklUU0NPTU1BTkQgICAgICAgIDMKKyNkZWZpbmUgU0VORFNJTkdMRUFEICAgICAgICAgICAgICA0CisjZGVmaW5lIFJFQURDT1VOVEVSQ09NTUFORCAgICAgICAgNQorI2RlZmluZSBXUklURUNPVU5URVJDT01NQU5EICAgICAgIDYKKyNkZWZpbmUgU0VORFBXTU9OICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIFNFTkRQV01PRkYgICAgICAgICAgICAgICAgOAorCitzdGF0aWMgaW50IHNlbmRfZHV4X2NvbW1hbmRzKHN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViLCBpbnQgY21kX3R5cGUpCit7CisJaW50IHJlc3VsdCwgbnNlbnQ7CisKKwl0aGlzX3VzYmR1eHN1Yi0+ZHV4X2NvbW1hbmRzWzBdID0gY21kX3R5cGU7CisjaWZkZWYgTk9JU1lfRFVYX0RFQlVHQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgImNvbWVkaSVkOiB1c2JkdXg6IGR1eF9jb21tYW5kczogIiwKKwkJdGhpc191c2JkdXhzdWItPmNvbWVkaWRldi0+bWlub3IpOworCWZvciAocmVzdWx0ID0gMDsgcmVzdWx0IDwgU0laRU9GRFVYQlVGRkVSOyByZXN1bHQrKykKKwkJcHJpbnRrKCIgJTAyeCIsIHRoaXNfdXNiZHV4c3ViLT5kdXhfY29tbWFuZHNbcmVzdWx0XSk7CisJcHJpbnRrKCJcbiIpOworI2VuZGlmCisJcmVzdWx0ID0gdXNiX2J1bGtfbXNnKHRoaXNfdXNiZHV4c3ViLT51c2JkZXYsCisJCQkgICAgICB1c2Jfc25kYnVsa3BpcGUodGhpc191c2JkdXhzdWItPnVzYmRldiwKKwkJCQkJICAgICAgQ09NTUFORF9PVVRfRVApLAorCQkJICAgICAgdGhpc191c2JkdXhzdWItPmR1eF9jb21tYW5kcywgU0laRU9GRFVYQlVGRkVSLAorCQkJICAgICAgJm5zZW50LCAxMCk7CisJaWYgKHJlc3VsdCA8IDApCisJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwgImNvbWVkaSVkOiAiCisJCQkiY291bGQgbm90IHRyYW5zbWl0IGR1eF9jb21tYW5kIHRvIHRoZSB1c2ItZGV2aWNlLCAiCisJCQkiZXJyPSVkXG4iLCB0aGlzX3VzYmR1eHN1Yi0+Y29tZWRpZGV2LT5taW5vciwgcmVzdWx0KTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgcmVjZWl2ZV9kdXhfY29tbWFuZHMoc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWIsIGludCBjb21tYW5kKQoreworCWludCByZXN1bHQgPSAoLUVGQVVMVCk7CisJaW50IG5yZWM7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUkVUUklFUzsgaSsrKSB7CisJCXJlc3VsdCA9IHVzYl9idWxrX21zZyh0aGlzX3VzYmR1eHN1Yi0+dXNiZGV2LAorCQkJCSAgICAgIHVzYl9yY3ZidWxrcGlwZSh0aGlzX3VzYmR1eHN1Yi0+dXNiZGV2LAorCQkJCQkJICAgICAgQ09NTUFORF9JTl9FUCksCisJCQkJICAgICAgdGhpc191c2JkdXhzdWItPmluc25CdWZmZXIsIFNJWkVJTlNOQlVGLAorCQkJCSAgICAgICZucmVjLCAxKTsKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwgImNvbWVkaSVkOiAiCisJCQkJImluc246IFVTQiBlcnJvciAlZCB3aGlsZSByZWNlaXZpbmcgRFVYIGNvbW1hbmQiCisJCQkJIlxuIiwgdGhpc191c2JkdXhzdWItPmNvbWVkaWRldi0+bWlub3IsIHJlc3VsdCk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCWlmIChsZTE2X3RvX2NwdSh0aGlzX3VzYmR1eHN1Yi0+aW5zbkJ1ZmZlclswXSkgPT0gY29tbWFuZCkKKwkJCXJldHVybiByZXN1bHQ7CisJfQorCS8qIHRoaXMgaXMgb25seSByZWFjaGVkIGlmIHRoZSBkYXRhIGhhcyBiZWVuIHJlcXVlc3RlZCBhIGNvdXBsZSBvZgorCSAqIHRpbWVzICovCisJZGV2X2VycigmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LCAiY29tZWRpJWQ6IGluc246ICIKKwkJIndyb25nIGRhdGEgcmV0dXJuZWQgZnJvbSBmaXJtd2FyZTogd2FudCBjbWQgJWQsIGdvdCBjbWQgJWQuXG4iLAorCQl0aGlzX3VzYmR1eHN1Yi0+Y29tZWRpZGV2LT5taW5vciwgY29tbWFuZCwKKwkJbGUxNl90b19jcHUodGhpc191c2JkdXhzdWItPmluc25CdWZmZXJbMF0pKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworc3RhdGljIGludCB1c2JkdXhfYWlfaW50dHJpZyhjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgIHVuc2lnbmVkIGludCB0cmlnbnVtKQoreworCWludCByZXQ7CisJc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWIgPSBkZXYtPnByaXZhdGU7CisJaWYgKCF0aGlzX3VzYmR1eHN1YikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkb3duKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwlpZiAoISh0aGlzX3VzYmR1eHN1Yi0+cHJvYmVkKSkgeworCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlkZXZfZGJnKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCSJjb21lZGklZDogdXNiZHV4X2FpX2ludHRyaWdcbiIsIGRldi0+bWlub3IpOworCisJaWYgKHRyaWdudW0gIT0gMCkgeworCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpJWQ6IHVzYmR1eF9haV9pbnR0cmlnOiBpbnZhbGlkIHRyaWdudW1cbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKCEodGhpc191c2JkdXhzdWItPmFpX2NtZF9ydW5uaW5nKSkgeworCQl0aGlzX3VzYmR1eHN1Yi0+YWlfY21kX3J1bm5pbmcgPSAxOworCQlyZXQgPSB1c2JkdXhzdWJfc3VibWl0X0luVVJCcyh0aGlzX3VzYmR1eHN1Yik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkJImNvbWVkaSVkOiB1c2JkdXhfYWlfaW50dHJpZzogIgorCQkJCSJ1cmJTdWJtaXQ6IGVycj0lZFxuIiwgZGV2LT5taW5vciwgcmV0KTsKKwkJCXRoaXNfdXNiZHV4c3ViLT5haV9jbWRfcnVubmluZyA9IDA7CisJCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXMtPmFzeW5jLT5pbnR0cmlnID0gTlVMTDsKKwl9IGVsc2UgeworCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpJWQ6IGFpX2ludHRyaWcgYnV0IGFjcXUgaXMgYWxyZWFkeSBydW5uaW5nXG4iLAorCQkJZGV2LT5taW5vcik7CisJfQorCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCB1c2JkdXhfYWlfY21kKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwljb21lZGlfY21kICpjbWQgPSAmcy0+YXN5bmMtPmNtZDsKKwl1bnNpZ25lZCBpbnQgY2hhbiwgcmFuZ2U7CisJaW50IGksIHJldDsKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiA9IGRldi0+cHJpdmF0ZTsKKwlpbnQgcmVzdWx0OworCisJaWYgKCF0aGlzX3VzYmR1eHN1YikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkZXZfZGJnKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCSJjb21lZGklZDogdXNiZHV4X2FpX2NtZFxuIiwgZGV2LT5taW5vcik7CisKKwkvKiBibG9jayBvdGhlciBDUFVzIGZyb20gc3RhcnRpbmcgYW4gYWlfY21kICovCisJZG93bigmdGhpc191c2JkdXhzdWItPnNlbSk7CisKKwlpZiAoISh0aGlzX3VzYmR1eHN1Yi0+cHJvYmVkKSkgeworCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAodGhpc191c2JkdXhzdWItPmFpX2NtZF9ydW5uaW5nKSB7CisJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwgImNvbWVkaSVkOiAiCisJCQkiYWlfY21kIG5vdCBwb3NzaWJsZS4gQW5vdGhlciBhaV9jbWQgaXMgcnVubmluZy5cbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwkvKiBzZXQgY3VycmVudCBjaGFubmVsIG9mIHRoZSBydW5uaW5nIGFxdWlzaXRpb24gdG8gemVybyAqLworCXMtPmFzeW5jLT5jdXJfY2hhbiA9IDA7CisKKwl0aGlzX3VzYmR1eHN1Yi0+ZHV4X2NvbW1hbmRzWzFdID0gY21kLT5jaGFubGlzdF9sZW47CisJZm9yIChpID0gMDsgaSA8IGNtZC0+Y2hhbmxpc3RfbGVuOyArK2kpIHsKKwkJY2hhbiA9IENSX0NIQU4oY21kLT5jaGFubGlzdFtpXSk7CisJCXJhbmdlID0gQ1JfUkFOR0UoY21kLT5jaGFubGlzdFtpXSk7CisJCWlmIChpID49IE5VTUNIQU5ORUxTKSB7CisJCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkJImNvbWVkaSVkOiBjaGFubmVsIGxpc3QgdG9vIGxvbmdcbiIsCisJCQkJZGV2LT5taW5vcik7CisJCQlicmVhazsKKwkJfQorCQl0aGlzX3VzYmR1eHN1Yi0+ZHV4X2NvbW1hbmRzW2kgKyAyXSA9CisJCQljcmVhdGVfYWRjX2NvbW1hbmQoY2hhbiwgcmFuZ2UpOworCX0KKworCWRldl9kYmcoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJImNvbWVkaSAlZDogc2VuZGluZyBjb21tYW5kcyB0byB0aGUgdXNiIGRldmljZTogc2l6ZT0ldVxuIiwKKwkJZGV2LT5taW5vciwgTlVNQ0hBTk5FTFMpOworCisJcmVzdWx0ID0gc2VuZF9kdXhfY29tbWFuZHModGhpc191c2JkdXhzdWIsIFNFTkRBRENPTU1BTkRTKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJaWYgKHRoaXNfdXNiZHV4c3ViLT5oaWdoX3NwZWVkKSB7CisJCS8qCisJCSAqIGV2ZXJ5IGNoYW5uZWwgZ2V0cyBhIHRpbWUgd2luZG93IG9mIDEyNXVzLiBUaHVzLCBpZiB3ZQorCQkgKiBzYW1wbGUgYWxsIDggY2hhbm5lbHMgd2UgbmVlZCAxbXMuIElmIHdlIHNhbXBsZSBvbmx5IG9uZQorCQkgKiBjaGFubmVsIHdlIG5lZWQgb25seSAxMjV1cworCQkgKi8KKwkJdGhpc191c2JkdXhzdWItPmFpX2ludGVydmFsID0gMTsKKwkJLyogZmluZCBhIHBvd2VyIG9mIDIgZm9yIHRoZSBpbnRlcnZhbCAqLworCQl3aGlsZSAoKHRoaXNfdXNiZHV4c3ViLT5haV9pbnRlcnZhbCkgPCAoY21kLT5jaGFubGlzdF9sZW4pKSB7CisJCQl0aGlzX3VzYmR1eHN1Yi0+YWlfaW50ZXJ2YWwgPQorCQkJCSh0aGlzX3VzYmR1eHN1Yi0+YWlfaW50ZXJ2YWwpICogMjsKKwkJfQorCQl0aGlzX3VzYmR1eHN1Yi0+YWlfdGltZXIgPSBjbWQtPnNjYW5fYmVnaW5fYXJnIC8gKDEyNTAwMCAqCisJCQkodGhpc191c2JkdXhzdWItPmFpX2ludGVydmFsKSk7CisJfSBlbHNlIHsKKwkJLyogaW50ZXJ2YWwgYWx3YXlzIDFtcyAqLworCQl0aGlzX3VzYmR1eHN1Yi0+YWlfaW50ZXJ2YWwgPSAxOworCQl0aGlzX3VzYmR1eHN1Yi0+YWlfdGltZXIgPSBjbWQtPnNjYW5fYmVnaW5fYXJnIC8gMTAwMDAwMDsKKwl9CisJaWYgKHRoaXNfdXNiZHV4c3ViLT5haV90aW1lciA8IDEpIHsKKwkJZGV2X2VycigmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LCAiY29tZWRpJWQ6IGFpX2NtZDogIgorCQkJInRpbWVyPSVkLCBzY2FuX2JlZ2luX2FyZz0lZC4gIgorCQkJIk5vdCBwcm9wZXJseSB0ZXN0ZWQgYnkgY21kdGVzdD9cbiIsIGRldi0+bWlub3IsCisJCQl0aGlzX3VzYmR1eHN1Yi0+YWlfdGltZXIsIGNtZC0+c2Nhbl9iZWdpbl9hcmcpOworCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwl0aGlzX3VzYmR1eHN1Yi0+YWlfY291bnRlciA9IHRoaXNfdXNiZHV4c3ViLT5haV90aW1lcjsKKworCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpIHsKKwkJLyogZGF0YSBhcnJpdmVzIGFzIG9uZSBwYWNrZXQgKi8KKwkJdGhpc191c2JkdXhzdWItPmFpX3NhbXBsZV9jb3VudCA9IGNtZC0+c3RvcF9hcmc7CisJCXRoaXNfdXNiZHV4c3ViLT5haV9jb250aW5vdXMgPSAwOworCX0gZWxzZSB7CisJCS8qIGNvbnRpbm91cyBhcXVpc2l0aW9uICovCisJCXRoaXNfdXNiZHV4c3ViLT5haV9jb250aW5vdXMgPSAxOworCQl0aGlzX3VzYmR1eHN1Yi0+YWlfc2FtcGxlX2NvdW50ID0gMDsKKwl9CisKKwlpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19OT1cpIHsKKwkJLyogZW5hYmxlIHRoaXMgYWNxdWlzaXRpb24gb3BlcmF0aW9uICovCisJCXRoaXNfdXNiZHV4c3ViLT5haV9jbWRfcnVubmluZyA9IDE7CisJCXJldCA9IHVzYmR1eHN1Yl9zdWJtaXRfSW5VUkJzKHRoaXNfdXNiZHV4c3ViKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXRoaXNfdXNiZHV4c3ViLT5haV9jbWRfcnVubmluZyA9IDA7CisJCQkvKiBmaXhtZTogdW5saW5rIGhlcmU/PyAqLworCQkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlzLT5hc3luYy0+aW50dHJpZyA9IE5VTEw7CisJfSBlbHNlIHsKKwkJLyogVFJJR19JTlQgKi8KKwkJLyogZG9uJ3QgZW5hYmxlIHRoZSBhY3F1aXNpb24gb3BlcmF0aW9uICovCisJCS8qIHdhaXQgZm9yIGFuIGludGVybmFsIHNpZ25hbCAqLworCQlzLT5hc3luYy0+aW50dHJpZyA9IHVzYmR1eF9haV9pbnR0cmlnOworCX0KKwl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIE1vZGUgMCBpcyB1c2VkIHRvIGdldCBhIHNpbmdsZSBjb252ZXJzaW9uIG9uIGRlbWFuZCAqLworc3RhdGljIGludCB1c2JkdXhfYWlfaW5zbl9yZWFkKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgICBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpCit7CisJaW50IGk7CisJbHNhbXBsX3Qgb25lID0gMDsKKwlpbnQgY2hhbiwgcmFuZ2U7CisJaW50IGVycjsKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiA9IGRldi0+cHJpdmF0ZTsKKworCWlmICghdGhpc191c2JkdXhzdWIpCisJCXJldHVybiAwOworCisJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkiY29tZWRpJWQ6IGFpX2luc25fcmVhZCwgaW5zbi0+bj0lZCwgaW5zbi0+c3ViZGV2PSVkXG4iLAorCQlkZXYtPm1pbm9yLCBpbnNuLT5uLCBpbnNuLT5zdWJkZXYpOworCisJZG93bigmdGhpc191c2JkdXhzdWItPnNlbSk7CisJaWYgKCEodGhpc191c2JkdXhzdWItPnByb2JlZCkpIHsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKHRoaXNfdXNiZHV4c3ViLT5haV9jbWRfcnVubmluZykgeworCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpJWQ6IGFpX2luc25fcmVhZCBub3QgcG9zc2libGUuICIKKwkJCSJBc3luYyBDb21tYW5kIGlzIHJ1bm5pbmcuXG4iLCBkZXYtPm1pbm9yKTsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBzYW1wbGUgb25lIGNoYW5uZWwgKi8KKwljaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJcmFuZ2UgPSBDUl9SQU5HRShpbnNuLT5jaGFuc3BlYyk7CisJLyogc2V0IGNvbW1hbmQgZm9yIHRoZSBmaXJzdCBjaGFubmVsICovCisJdGhpc191c2JkdXhzdWItPmR1eF9jb21tYW5kc1sxXSA9IGNyZWF0ZV9hZGNfY29tbWFuZChjaGFuLCByYW5nZSk7CisKKwkvKiBhZGMgY29tbWFuZHMgKi8KKwllcnIgPSBzZW5kX2R1eF9jb21tYW5kcyh0aGlzX3VzYmR1eHN1YiwgU0VORFNJTkdMRUFEKTsKKwlpZiAoZXJyIDwgMCkgeworCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCXJldHVybiBlcnI7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgeworCQllcnIgPSByZWNlaXZlX2R1eF9jb21tYW5kcyh0aGlzX3VzYmR1eHN1YiwgU0VORFNJTkdMRUFEKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJCXJldHVybiAwOworCQl9CisJCW9uZSA9IGxlMTZfdG9fY3B1KHRoaXNfdXNiZHV4c3ViLT5pbnNuQnVmZmVyWzFdKTsKKwkJaWYgKENSX1JBTkdFKGluc24tPmNoYW5zcGVjKSA8PSAxKQorCQkJb25lID0gb25lIF4gMHg4MDA7CisKKwkJZGF0YVtpXSA9IG9uZTsKKwl9CisJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCXJldHVybiBpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogYW5hbG9nIG91dCAqLworCitzdGF0aWMgaW50IHVzYmR1eF9hb19pbnNuX3JlYWQoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwlpbnQgaTsKKwlpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCXN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViID0gZGV2LT5wcml2YXRlOworCisJaWYgKCF0aGlzX3VzYmR1eHN1YikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkb3duKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwlpZiAoISh0aGlzX3VzYmR1eHN1Yi0+cHJvYmVkKSkgeworCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKQorCQlkYXRhW2ldID0gdGhpc191c2JkdXhzdWItPm91dEJ1ZmZlcltjaGFuXTsKKworCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCB1c2JkdXhfYW9faW5zbl93cml0ZShjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCWludCBpLCBlcnI7CisJaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiA9IGRldi0+cHJpdmF0ZTsKKworCWlmICghdGhpc191c2JkdXhzdWIpCisJCXJldHVybiAtRUZBVUxUOworCisJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkiY29tZWRpJWQ6IGFvX2luc25fd3JpdGVcbiIsIGRldi0+bWlub3IpOworCisJZG93bigmdGhpc191c2JkdXhzdWItPnNlbSk7CisJaWYgKCEodGhpc191c2JkdXhzdWItPnByb2JlZCkpIHsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKHRoaXNfdXNiZHV4c3ViLT5hb19jbWRfcnVubmluZykgeworCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpJWQ6IGFvX2luc25fd3JpdGU6ICIKKwkJCSJFUlJPUjogYXN5bmNocm9ub3VzIGFvX2NtZCBpcyBydW5uaW5nXG4iLCBkZXYtPm1pbm9yKTsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CisJCWRldl9kYmcoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCSJjb21lZGklZDogYW9faW5zbl93cml0ZTogZGF0YVtjaGFuPSVkLGk9JWRdPSVkXG4iLAorCQkJZGV2LT5taW5vciwgY2hhbiwgaSwgZGF0YVtpXSk7CisKKwkJLyogbnVtYmVyIG9mIGNoYW5uZWxzOiAxICovCisJCXRoaXNfdXNiZHV4c3ViLT5kdXhfY29tbWFuZHNbMV0gPSAxOworCQkvKiBvbmUgMTYgYml0IHZhbHVlICovCisJCSooKGludDE2X3QgKikgKHRoaXNfdXNiZHV4c3ViLT5kdXhfY29tbWFuZHMgKyAyKSkgPQorCQkJY3B1X3RvX2xlMTYoZGF0YVtpXSk7CisJCXRoaXNfdXNiZHV4c3ViLT5vdXRCdWZmZXJbY2hhbl0gPSBkYXRhW2ldOworCQkvKiBjaGFubmVsIG51bWJlciAqLworCQl0aGlzX3VzYmR1eHN1Yi0+ZHV4X2NvbW1hbmRzWzRdID0gKGNoYW4gPDwgNik7CisJCWVyciA9IHNlbmRfZHV4X2NvbW1hbmRzKHRoaXNfdXNiZHV4c3ViLCBTRU5EREFDT01NQU5EUyk7CisJCWlmIChlcnIgPCAwKSB7CisJCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKworCXJldHVybiBpOworfQorCitzdGF0aWMgaW50IHVzYmR1eF9hb19pbnR0cmlnKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgdW5zaWduZWQgaW50IHRyaWdudW0pCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiA9IGRldi0+cHJpdmF0ZTsKKworCWlmICghdGhpc191c2JkdXhzdWIpCisJCXJldHVybiAtRUZBVUxUOworCisJZG93bigmdGhpc191c2JkdXhzdWItPnNlbSk7CisJaWYgKCEodGhpc191c2JkdXhzdWItPnByb2JlZCkpIHsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKHRyaWdudW0gIT0gMCkgeworCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpJWQ6IHVzYmR1eF9hb19pbnR0cmlnOiBpbnZhbGlkIHRyaWdudW1cbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICghKHRoaXNfdXNiZHV4c3ViLT5hb19jbWRfcnVubmluZykpIHsKKwkJdGhpc191c2JkdXhzdWItPmFvX2NtZF9ydW5uaW5nID0gMTsKKwkJcmV0ID0gdXNiZHV4c3ViX3N1Ym1pdF9PdXRVUkJzKHRoaXNfdXNiZHV4c3ViKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCQkiY29tZWRpJWQ6IHVzYmR1eF9hb19pbnR0cmlnOiBzdWJtaXRVUkI6ICIKKwkJCQkiZXJyPSVkXG4iLCBkZXYtPm1pbm9yLCByZXQpOworCQkJdGhpc191c2JkdXhzdWItPmFvX2NtZF9ydW5uaW5nID0gMDsKKwkJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJcy0+YXN5bmMtPmludHRyaWcgPSBOVUxMOworCX0gZWxzZSB7CisJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCSJjb21lZGklZDogYW9faW50dHJpZyBidXQgYWNxdSBpcyBhbHJlYWR5IHJ1bm5pbmcuXG4iLAorCQkJZGV2LT5taW5vcik7CisJfQorCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCB1c2JkdXhfYW9fY21kdGVzdChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgIGNvbWVkaV9jbWQgKmNtZCkKK3sKKwlpbnQgZXJyID0gMCwgdG1wOworCXN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViID0gZGV2LT5wcml2YXRlOworCisJaWYgKCF0aGlzX3VzYmR1eHN1YikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoISh0aGlzX3VzYmR1eHN1Yi0+cHJvYmVkKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlkZXZfZGJnKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCSJjb21lZGklZDogdXNiZHV4X2FvX2NtZHRlc3RcbiIsIGRldi0+bWlub3IpOworCisJLyogbWFrZSBzdXJlIHRyaWdnZXJzIGFyZSB2YWxpZCAqLworCS8qIE9ubHkgaW1tZWRpYXRlIHRyaWdnZXJzIGFyZSBhbGxvd2VkICovCisJdG1wID0gY21kLT5zdGFydF9zcmM7CisJY21kLT5zdGFydF9zcmMgJj0gVFJJR19OT1cgfCBUUklHX0lOVDsKKwlpZiAoIWNtZC0+c3RhcnRfc3JjIHx8IHRtcCAhPSBjbWQtPnN0YXJ0X3NyYykKKwkJZXJyKys7CisKKwkvKiB0cmlnZ2VyIHNob3VsZCBoYXBwZW4gdGltZWQgKi8KKwl0bXAgPSBjbWQtPnNjYW5fYmVnaW5fc3JjOworCS8qIGp1c3Qgbm93IHdlIHNjYW4gYWxzbyBpbiB0aGUgaGlnaCBzcGVlZCBtb2RlIGV2ZXJ5IGZyYW1lICovCisJLyogdGhpcyBpcyBkdWUgdG8gZWhjaSBkcml2ZXIgbGltaXRhdGlvbnMgKi8KKwlpZiAoMCkgewkJLyogKHRoaXNfdXNiZHV4c3ViLT5oaWdoX3NwZWVkKSAqLworCQkvKiBzdGFydCBpbW1pZGlhdGVseSBhIG5ldyBzY2FuICovCisJCS8qIHRoZSBzYW1wbGluZyByYXRlIGlzIHNldCBieSB0aGUgY292ZXJzaW9uIHJhdGUgKi8KKwkJY21kLT5zY2FuX2JlZ2luX3NyYyAmPSBUUklHX0ZPTExPVzsKKwl9IGVsc2UgeworCQkvKiBzdGFydCBhIG5ldyBzY2FuIChvdXRwdXQgYXQgb25jZSkgd2l0aCBhIHRpbWVyICovCisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgJj0gVFJJR19USU1FUjsKKwl9CisJaWYgKCFjbWQtPnNjYW5fYmVnaW5fc3JjIHx8IHRtcCAhPSBjbWQtPnNjYW5fYmVnaW5fc3JjKQorCQllcnIrKzsKKworCS8qIHNjYW5uaW5nIGlzIGNvbnRpbm91cyAqLworCXRtcCA9IGNtZC0+Y29udmVydF9zcmM7CisJLyogd2UgYWx3YXlzIG91dHB1dCBhdCAxa0h6IGp1c3Qgbm93IGFsbCBjaGFubmVscyBhdCBvbmNlICovCisJaWYgKDApIHsJCS8qICh0aGlzX3VzYmR1eHN1Yi0+aGlnaF9zcGVlZCkgKi8KKwkJLyoKKwkJICogaW4gdXNiLTIuMCBvbmx5IG9uZSBjb252ZXJzaW9uIGl0IHRyYW5taXR0ZWQgYnV0IHdpdGggOGtIei9uCisJCSAqLworCQljbWQtPmNvbnZlcnRfc3JjICY9IFRSSUdfVElNRVI7CisJfSBlbHNlIHsKKwkJLyogYWxsIGNvbnZlcnNpb24gZXZlbnRzIGhhcHBlbiBzaW11bHRhbmVvdXNseSB3aXRoIGEgcmF0ZSBvZgorCQkgKiAxa0h6L24gKi8KKwkJY21kLT5jb252ZXJ0X3NyYyAmPSBUUklHX05PVzsKKwl9CisJaWYgKCFjbWQtPmNvbnZlcnRfc3JjIHx8IHRtcCAhPSBjbWQtPmNvbnZlcnRfc3JjKQorCQllcnIrKzsKKworCS8qIGlzc3VlIGEgdHJpZ2dlciB3aGVuIHNjYW4gaXMgZmluaXNoZWQgYW5kIHN0YXJ0IGEgbmV3IHNjYW4gKi8KKwl0bXAgPSBjbWQtPnNjYW5fZW5kX3NyYzsKKwljbWQtPnNjYW5fZW5kX3NyYyAmPSBUUklHX0NPVU5UOworCWlmICghY21kLT5zY2FuX2VuZF9zcmMgfHwgdG1wICE9IGNtZC0+c2Nhbl9lbmRfc3JjKQorCQllcnIrKzsKKworCS8qIHRyaWdnZXIgYXQgdGhlIGVuZCBvZiBjb3VudCBldmVudHMgb3Igbm90LCBzdG9wIGNvbmRpdGlvbiBvciBub3QgKi8KKwl0bXAgPSBjbWQtPnN0b3Bfc3JjOworCWNtZC0+c3RvcF9zcmMgJj0gVFJJR19DT1VOVCB8IFRSSUdfTk9ORTsKKwlpZiAoIWNtZC0+c3RvcF9zcmMgfHwgdG1wICE9IGNtZC0+c3RvcF9zcmMpCisJCWVycisrOworCisJaWYgKGVycikKKwkJcmV0dXJuIDE7CisKKwkvKgorCSAqIHN0ZXAgMjogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlIGFuZCBtdXR1YWxseSBjb21wYXRpYmxlCisJICogbm90ZSB0aGF0IG11dHVhbCBjb21wYXRpYmxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUKKwkgKi8KKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX0ZPTExPVyAmJgorCQljbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfRVhUICYmCisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19USU1FUikKKwkJZXJyKys7CisJaWYgKGNtZC0+c3RvcF9zcmMgIT0gVFJJR19DT1VOVCAmJiBjbWQtPnN0b3Bfc3JjICE9IFRSSUdfTk9ORSkKKwkJZXJyKys7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gMjsKKworCS8qIHN0ZXAgMzogbWFrZSBzdXJlIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IGNvbXBhdGlibGUgKi8KKworCWlmIChjbWQtPnN0YXJ0X2FyZyAhPSAwKSB7CisJCWNtZC0+c3RhcnRfYXJnID0gMDsKKwkJZXJyKys7CisJfQorCisJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19GT0xMT1cpIHsKKwkJLyogaW50ZXJuYWwgdHJpZ2dlciAqLworCQlpZiAoY21kLT5zY2FuX2JlZ2luX2FyZyAhPSAwKSB7CisJCQljbWQtPnNjYW5fYmVnaW5fYXJnID0gMDsKKwkJCWVycisrOworCQl9CisJfQorCisJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgeworCQkvKiB0aW1lciAqLworCQlpZiAoY21kLT5zY2FuX2JlZ2luX2FyZyA8IDEwMDAwMDApIHsKKwkJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPSAxMDAwMDAwOworCQkJZXJyKys7CisJCX0KKwl9CisJLyogbm90IHVzZWQgbm93LCBpcyBmb3IgbGF0ZXIgdXNlICovCisJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCQlpZiAoY21kLT5jb252ZXJ0X2FyZyA8IDEyNTAwMCkgeworCQkJY21kLT5jb252ZXJ0X2FyZyA9IDEyNTAwMDsKKwkJCWVycisrOworCQl9CisJfQorCisJLyogdGhlIHNhbWUgYXJndW1lbnQgKi8KKwlpZiAoY21kLT5zY2FuX2VuZF9hcmcgIT0gY21kLT5jaGFubGlzdF9sZW4pIHsKKwkJY21kLT5zY2FuX2VuZF9hcmcgPSBjbWQtPmNoYW5saXN0X2xlbjsKKwkJZXJyKys7CisJfQorCisJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkgeworCQkvKiBhbnkgY291bnQgaXMgYWxsb3dlZCAqLworCX0gZWxzZSB7CisJCS8qIFRSSUdfTk9ORSAqLworCQlpZiAoY21kLT5zdG9wX2FyZyAhPSAwKSB7CisJCQljbWQtPnN0b3BfYXJnID0gMDsKKwkJCWVycisrOworCQl9CisJfQorCisJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LCAiY29tZWRpJWQ6IGVycj0lZCwgIgorCQkic2Nhbl9iZWdpbl9zcmM9JWQsIHNjYW5fYmVnaW5fYXJnPSVkLCBjb252ZXJ0X3NyYz0lZCwgIgorCQkiY29udmVydF9hcmc9JWRcbiIsIGRldi0+bWlub3IsIGVyciwgY21kLT5zY2FuX2JlZ2luX3NyYywKKwkJY21kLT5zY2FuX2JlZ2luX2FyZywgY21kLT5jb252ZXJ0X3NyYywgY21kLT5jb252ZXJ0X2FyZyk7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gMzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYmR1eF9hb19jbWQoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzKQoreworCWNvbWVkaV9jbWQgKmNtZCA9ICZzLT5hc3luYy0+Y21kOworCXVuc2lnbmVkIGludCBjaGFuLCBnYWluOworCWludCBpLCByZXQ7CisJc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWIgPSBkZXYtPnByaXZhdGU7CisKKwlpZiAoIXRoaXNfdXNiZHV4c3ViKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRvd24oJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCWlmICghKHRoaXNfdXNiZHV4c3ViLT5wcm9iZWQpKSB7CisJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWRldl9kYmcoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJImNvbWVkaSVkOiAlc1xuIiwgZGV2LT5taW5vciwgX19mdW5jX18pOworCisJLyogc2V0IGN1cnJlbnQgY2hhbm5lbCBvZiB0aGUgcnVubmluZyBhcXVpc2l0aW9uIHRvIHplcm8gKi8KKwlzLT5hc3luYy0+Y3VyX2NoYW4gPSAwOworCWZvciAoaSA9IDA7IGkgPCBjbWQtPmNoYW5saXN0X2xlbjsgKytpKSB7CisJCWNoYW4gPSBDUl9DSEFOKGNtZC0+Y2hhbmxpc3RbaV0pOworCQlnYWluID0gQ1JfUkFOR0UoY21kLT5jaGFubGlzdFtpXSk7CisJCWlmIChpID49IE5VTU9VVENIQU5ORUxTKSB7CisJCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkJImNvbWVkaSVkOiAlczogY2hhbm5lbCBsaXN0IHRvbyBsb25nXG4iLAorCQkJCWRldi0+bWlub3IsIF9fZnVuY19fKTsKKwkJCWJyZWFrOworCQl9CisJCXRoaXNfdXNiZHV4c3ViLT5kYWNfY29tbWFuZHNbaV0gPSAoY2hhbiA8PCA2KTsKKwkJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaSVkOiBkYWMgY29tbWFuZCBmb3IgY2ggJWQgaXMgJXhcbiIsCisJCQlkZXYtPm1pbm9yLCBpLCB0aGlzX3VzYmR1eHN1Yi0+ZGFjX2NvbW1hbmRzW2ldKTsKKwl9CisKKwkvKiB3ZSBjb3VudCBpbiBzdGVwcyBvZiAxbXMgKDEyNXVzKSAqLworCS8qIDEyNXVzIG1vZGUgbm90IHVzZWQgeWV0ICovCisJaWYgKDApIHsJCS8qICh0aGlzX3VzYmR1eHN1Yi0+aGlnaF9zcGVlZCkgKi8KKwkJLyogMTI1dXMgKi8KKwkJLyogdGltaW5nIG9mIHRoZSBjb252ZXJzaW9uIGl0c2VsZjogZXZlcnkgMTI1IHVzICovCisJCXRoaXNfdXNiZHV4c3ViLT5hb190aW1lciA9IGNtZC0+Y29udmVydF9hcmcgLyAxMjUwMDA7CisJfSBlbHNlIHsKKwkJLyogMW1zICovCisJCS8qIHRpbWluZyBvZiB0aGUgc2Nhbjogd2UgZ2V0IGFsbCBjaGFubmVscyBhdCBvbmNlICovCisJCXRoaXNfdXNiZHV4c3ViLT5hb190aW1lciA9IGNtZC0+c2Nhbl9iZWdpbl9hcmcgLyAxMDAwMDAwOworCQlkZXZfZGJnKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpJWQ6IHNjYW5fYmVnaW5fc3JjPSVkLCBzY2FuX2JlZ2luX2FyZz0lZCwgIgorCQkJImNvbnZlcnRfc3JjPSVkLCBjb252ZXJ0X2FyZz0lZFxuIiwgZGV2LT5taW5vciwKKwkJCWNtZC0+c2Nhbl9iZWdpbl9zcmMsIGNtZC0+c2Nhbl9iZWdpbl9hcmcsCisJCQljbWQtPmNvbnZlcnRfc3JjLCBjbWQtPmNvbnZlcnRfYXJnKTsKKwkJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaSVkOiBhb190aW1lcj0lZCAobXMpXG4iLAorCQkJZGV2LT5taW5vciwgdGhpc191c2JkdXhzdWItPmFvX3RpbWVyKTsKKwkJaWYgKHRoaXNfdXNiZHV4c3ViLT5hb190aW1lciA8IDEpIHsKKwkJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCQkiY29tZWRpJWQ6IHVzYmR1eDogYW9fdGltZXI9JWQsICIKKwkJCQkic2Nhbl9iZWdpbl9hcmc9JWQuICIKKwkJCQkiTm90IHByb3Blcmx5IHRlc3RlZCBieSBjbWR0ZXN0P1xuIiwKKwkJCQlkZXYtPm1pbm9yLCB0aGlzX3VzYmR1eHN1Yi0+YW9fdGltZXIsCisJCQkJY21kLT5zY2FuX2JlZ2luX2FyZyk7CisJCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwl0aGlzX3VzYmR1eHN1Yi0+YW9fY291bnRlciA9IHRoaXNfdXNiZHV4c3ViLT5hb190aW1lcjsKKworCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpIHsKKwkJLyogbm90IGNvbnRpbm91cyAqLworCQkvKiBjb3VudGVyICovCisJCS8qIGhpZ2ggc3BlZWQgYWxzbyBzY2FucyBldmVyeXRoaW5nIGF0IG9uY2UgKi8KKwkJaWYgKDApIHsJLyogKHRoaXNfdXNiZHV4c3ViLT5oaWdoX3NwZWVkKSAqLworCQkJdGhpc191c2JkdXhzdWItPmFvX3NhbXBsZV9jb3VudCA9CisJCQkJKGNtZC0+c3RvcF9hcmcpICogKGNtZC0+c2Nhbl9lbmRfYXJnKTsKKwkJfSBlbHNlIHsKKwkJCS8qIHRoZXJlJ3Mgbm8gc2NhbiBhcyB0aGUgc2NhbiBoYXMgYmVlbiAqLworCQkJLyogcGVyZiBpbnNpZGUgdGhlIEZYMiAqLworCQkJLyogZGF0YSBhcnJpdmVzIGFzIG9uZSBwYWNrZXQgKi8KKwkJCXRoaXNfdXNiZHV4c3ViLT5hb19zYW1wbGVfY291bnQgPSBjbWQtPnN0b3BfYXJnOworCQl9CisJCXRoaXNfdXNiZHV4c3ViLT5hb19jb250aW5vdXMgPSAwOworCX0gZWxzZSB7CisJCS8qIGNvbnRpbm91cyBhcXVpc2l0aW9uICovCisJCXRoaXNfdXNiZHV4c3ViLT5hb19jb250aW5vdXMgPSAxOworCQl0aGlzX3VzYmR1eHN1Yi0+YW9fc2FtcGxlX2NvdW50ID0gMDsKKwl9CisKKwlpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19OT1cpIHsKKwkJLyogZW5hYmxlIHRoaXMgYWNxdWlzaXRpb24gb3BlcmF0aW9uICovCisJCXRoaXNfdXNiZHV4c3ViLT5hb19jbWRfcnVubmluZyA9IDE7CisJCXJldCA9IHVzYmR1eHN1Yl9zdWJtaXRfT3V0VVJCcyh0aGlzX3VzYmR1eHN1Yik7CisJCWlmIChyZXQgPCAwKSB7CisJCQl0aGlzX3VzYmR1eHN1Yi0+YW9fY21kX3J1bm5pbmcgPSAwOworCQkJLyogZml4bWU6IHVubGluayBoZXJlPz8gKi8KKwkJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJcy0+YXN5bmMtPmludHRyaWcgPSBOVUxMOworCX0gZWxzZSB7CisJCS8qIFRSSUdfSU5UICovCisJCS8qIHN1Ym1pdCB0aGUgdXJicyBsYXRlciAqLworCQkvKiB3YWl0IGZvciBhbiBpbnRlcm5hbCBzaWduYWwgKi8KKwkJcy0+YXN5bmMtPmludHRyaWcgPSB1c2JkdXhfYW9faW50dHJpZzsKKwl9CisKKwl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4X2Rpb19pbnNuX2NvbmZpZyhjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJICBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpCit7CisJaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKworCS8qIFRoZSBpbnB1dCBvciBvdXRwdXQgY29uZmlndXJhdGlvbiBvZiBlYWNoIGRpZ2l0YWwgbGluZSBpcworCSAqIGNvbmZpZ3VyZWQgYnkgYSBzcGVjaWFsIGluc25fY29uZmlnIGluc3RydWN0aW9uLiAgY2hhbnNwZWMKKwkgKiBjb250YWlucyB0aGUgY2hhbm5lbCB0byBiZSBjaGFuZ2VkLCBhbmQgZGF0YVswXSBjb250YWlucyB0aGUKKwkgKiB2YWx1ZSBDT01FRElfSU5QVVQgb3IgQ09NRURJX09VVFBVVC4gKi8KKworCXN3aXRjaCAoZGF0YVswXSkgeworCWNhc2UgSU5TTl9DT05GSUdfRElPX09VVFBVVDoKKwkJcy0+aW9fYml0cyB8PSAxIDw8IGNoYW47CS8qIDEgbWVhbnMgT3V0ICovCisJCWJyZWFrOworCWNhc2UgSU5TTl9DT05GSUdfRElPX0lOUFVUOgorCQlzLT5pb19iaXRzICY9IH4oMSA8PCBjaGFuKTsKKwkJYnJlYWs7CisJY2FzZSBJTlNOX0NPTkZJR19ESU9fUVVFUlk6CisJCWRhdGFbMV0gPQorCQkJKHMtPgorCQkJaW9fYml0cyAmICgxIDw8IGNoYW4pKSA/IENPTUVESV9PVVRQVVQgOiBDT01FRElfSU5QVVQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKwl9CisJLyogd2UgZG9uJ3QgdGVsbCB0aGUgZmlybXdhcmUgaGVyZSBhcyBpdCB3b3VsZCB0YWtlIDggZnJhbWVzICovCisJLyogdG8gc3VibWl0IHRoZSBpbmZvcm1hdGlvbi4gV2UgZG8gaXQgaW4gdGhlIGluc25fYml0cy4gKi8KKwlyZXR1cm4gaW5zbi0+bjsKK30KKworc3RhdGljIGludCB1c2JkdXhfZGlvX2luc25fYml0cyhjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCisJc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWIgPSBkZXYtPnByaXZhdGU7CisJaW50IGVycjsKKworCWlmICghdGhpc191c2JkdXhzdWIpCisJCXJldHVybiAtRUZBVUxUOworCisKKwlpZiAoaW5zbi0+biAhPSAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRvd24oJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCisJaWYgKCEodGhpc191c2JkdXhzdWItPnByb2JlZCkpIHsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBUaGUgaW5zbiBkYXRhIGlzIGEgbWFzayBpbiBkYXRhWzBdIGFuZCB0aGUgbmV3IGRhdGEKKwkgKiBpbiBkYXRhWzFdLCBlYWNoIGNoYW5uZWwgY29vcmVzcG9uZGluZyB0byBhIGJpdC4gKi8KKwlzLT5zdGF0ZSAmPSB+ZGF0YVswXTsKKwlzLT5zdGF0ZSB8PSBkYXRhWzBdICYgZGF0YVsxXTsKKwl0aGlzX3VzYmR1eHN1Yi0+ZHV4X2NvbW1hbmRzWzFdID0gcy0+aW9fYml0czsKKwl0aGlzX3VzYmR1eHN1Yi0+ZHV4X2NvbW1hbmRzWzJdID0gcy0+c3RhdGU7CisKKwkvKiBUaGlzIGNvbW1hbmQgYWxzbyB0ZWxscyB0aGUgZmlybXdhcmUgdG8gcmV0dXJuICovCisJLyogdGhlIGRpZ2l0YWwgaW5wdXQgbGluZXMgKi8KKwllcnIgPSBzZW5kX2R1eF9jb21tYW5kcyh0aGlzX3VzYmR1eHN1YiwgU0VORERJT0JJVFNDT01NQU5EKTsKKwlpZiAoZXJyIDwgMCkgeworCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCXJldHVybiBlcnI7CisJfQorCWVyciA9IHJlY2VpdmVfZHV4X2NvbW1hbmRzKHRoaXNfdXNiZHV4c3ViLCBTRU5ERElPQklUU0NPTU1BTkQpOworCWlmIChlcnIgPCAwKSB7CisJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlkYXRhWzFdID0gbGUxNl90b19jcHUodGhpc191c2JkdXhzdWItPmluc25CdWZmZXJbMV0pOworCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwlyZXR1cm4gMjsKK30KKworLyogcmVhZHMgdGhlIDQgY291bnRlcnMsIG9ubHkgdHdvIGFyZSB1c2VkIGp1c3Qgbm93ICovCitzdGF0aWMgaW50IHVzYmR1eF9jb3VudGVyX3JlYWQoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICAgIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiA9IGRldi0+cHJpdmF0ZTsKKwlpbnQgY2hhbiA9IGluc24tPmNoYW5zcGVjOworCWludCBlcnI7CisKKwlpZiAoIXRoaXNfdXNiZHV4c3ViKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRvd24oJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCisJaWYgKCEodGhpc191c2JkdXhzdWItPnByb2JlZCkpIHsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwllcnIgPSBzZW5kX2R1eF9jb21tYW5kcyh0aGlzX3VzYmR1eHN1YiwgUkVBRENPVU5URVJDT01NQU5EKTsKKwlpZiAoZXJyIDwgMCkgeworCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gcmVjZWl2ZV9kdXhfY29tbWFuZHModGhpc191c2JkdXhzdWIsIFJFQURDT1VOVEVSQ09NTUFORCk7CisJaWYgKGVyciA8IDApIHsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gZXJyOworCX0KKworCWRhdGFbMF0gPSBsZTE2X3RvX2NwdSh0aGlzX3VzYmR1eHN1Yi0+aW5zbkJ1ZmZlcltjaGFuICsgMV0pOworCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCB1c2JkdXhfY291bnRlcl93cml0ZShjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCXN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViID0gZGV2LT5wcml2YXRlOworCWludCBlcnI7CisKKwlpZiAoIXRoaXNfdXNiZHV4c3ViKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRvd24oJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCisJaWYgKCEodGhpc191c2JkdXhzdWItPnByb2JlZCkpIHsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwl0aGlzX3VzYmR1eHN1Yi0+ZHV4X2NvbW1hbmRzWzFdID0gaW5zbi0+Y2hhbnNwZWM7CisJKigoaW50MTZfdCAqKSAodGhpc191c2JkdXhzdWItPmR1eF9jb21tYW5kcyArIDIpKSA9IGNwdV90b19sZTE2KCpkYXRhKTsKKworCWVyciA9IHNlbmRfZHV4X2NvbW1hbmRzKHRoaXNfdXNiZHV4c3ViLCBXUklURUNPVU5URVJDT01NQU5EKTsKKwlpZiAoZXJyIDwgMCkgeworCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCXJldHVybiBlcnI7CisJfQorCisJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4X2NvdW50ZXJfY29uZmlnKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgY29tZWRpX2luc24gKmluc24sIGxzYW1wbF90ICpkYXRhKQoreworCS8qIG5vdGhpbmcgdG8gZG8gc28gZmFyICovCisJcmV0dXJuIDI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFBXTSAqLworCitzdGF0aWMgaW50IHVzYmR1eHN1Yl91bmxpbmtfUHdtVVJCcyhzdHJ1Y3QgdXNiZHV4c3ViICp1c2JkdXhzdWJfdG1wKQoreworCWludCBlcnIgPSAwOworCisJaWYgKHVzYmR1eHN1Yl90bXAgJiYgdXNiZHV4c3ViX3RtcC0+dXJiUHdtKSB7CisJCWlmICh1c2JkdXhzdWJfdG1wLT51cmJQd20pCisJCQl1c2Jfa2lsbF91cmIodXNiZHV4c3ViX3RtcC0+dXJiUHdtKTsKKwkJZGV2X2RiZygmdXNiZHV4c3ViX3RtcC0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpOiB1bmxpbmtlZCBQd21VUkI6IHJlcz0lZFxuIiwgZXJyKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworLyogVGhpcyBjYW5jZWxzIGEgcnVubmluZyBhY3F1aXNpdGlvbiBvcGVyYXRpb24KKyAqIGluIGFueSBjb250ZXh0LgorICovCitzdGF0aWMgaW50IHVzYmR1eF9wd21fc3RvcChzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiwgaW50IGRvX3VubGluaykKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICghdGhpc191c2JkdXhzdWIpCisJCXJldHVybiAtRUZBVUxUOworCisJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LCAiY29tZWRpOiAlc1xuIiwgX19mdW5jX18pOworCWlmIChkb191bmxpbmspCisJCXJldCA9IHVzYmR1eHN1Yl91bmxpbmtfUHdtVVJCcyh0aGlzX3VzYmR1eHN1Yik7CisKKworCXRoaXNfdXNiZHV4c3ViLT5wd21fY21kX3J1bm5pbmcgPSAwOworCisJcmV0dXJuIHJldDsKK30KKworLyogZm9yY2UgdW5saW5rIC0gaXMgY2FsbGVkIGJ5IGNvbWVkaSAqLworc3RhdGljIGludCB1c2JkdXhfcHdtX2NhbmNlbChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWIgPSBkZXYtPnByaXZhdGU7CisJaW50IHJlcyA9IDA7CisKKwkvKiB1bmxpbmsgb25seSBpZiBpdCBpcyByZWFsbHkgcnVubmluZyAqLworCXJlcyA9IHVzYmR1eF9wd21fc3RvcCh0aGlzX3VzYmR1eHN1YiwgdGhpc191c2JkdXhzdWItPnB3bV9jbWRfcnVubmluZyk7CisKKwlkZXZfZGJnKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCSJjb21lZGkgJWQ6IHNlbmRpbmcgcHdtIG9mZiBjb21tYW5kIHRvIHRoZSB1c2IgZGV2aWNlLlxuIiwKKwkJZGV2LT5taW5vcik7CisJcmVzID0gc2VuZF9kdXhfY29tbWFuZHModGhpc191c2JkdXhzdWIsIFNFTkRQV01PRkYpOworCWlmIChyZXMgPCAwKQorCQlyZXR1cm4gcmVzOworCisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgdXNiZHV4c3ViX3B3bV9pcnEoc3RydWN0IHVyYiAqdXJiKQoreworCWludCByZXQ7CisJc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWI7CisJY29tZWRpX2RldmljZSAqdGhpc19jb21lZGlkZXY7CisJY29tZWRpX3N1YmRldmljZSAqczsKKworCS8qIHByaW50ayhLRVJOX0RFQlVHICJQV006IElSUVxuIik7ICovCisKKwkvKiB0aGUgY29udGV4dCB2YXJpYWJsZSBwb2ludHMgdG8gdGhlIHN1YmRldmljZSAqLworCXRoaXNfY29tZWRpZGV2ID0gdXJiLT5jb250ZXh0OworCS8qIHRoZSBwcml2YXRlIHN0cnVjdHVyZSBvZiB0aGUgc3ViZGV2aWNlIGlzIHN0cnVjdCB1c2JkdXhzdWIgKi8KKwl0aGlzX3VzYmR1eHN1YiA9IHRoaXNfY29tZWRpZGV2LT5wcml2YXRlOworCisJcyA9IHRoaXNfY29tZWRpZGV2LT5zdWJkZXZpY2VzICsgU1VCREVWX0RBOworCisJc3dpdGNoICh1cmItPnN0YXR1cykgeworCWNhc2UgMDoKKwkJLyogc3VjY2VzcyAqLworCQlicmVhazsKKworCWNhc2UgLUVDT05OUkVTRVQ6CisJY2FzZSAtRU5PRU5UOgorCWNhc2UgLUVTSFVURE9XTjoKKwljYXNlIC1FQ09OTkFCT1JURUQ6CisJCS8qCisJCSAqIGFmdGVyIGFuIHVubGluayBjb21tYW5kLCB1bnBsdWcsIC4uLiBldGMKKwkJICogbm8gdW5saW5rIG5lZWRlZCBoZXJlLiBBbHJlYWR5IHNodXR0aW5nIGRvd24uCisJCSAqLworCQlpZiAodGhpc191c2JkdXhzdWItPnB3bV9jbWRfcnVubmluZykKKwkJCXVzYmR1eF9wd21fc3RvcCh0aGlzX3VzYmR1eHN1YiwgMCk7CisKKwkJcmV0dXJuOworCisJZGVmYXVsdDoKKwkJLyogYSByZWFsIGVycm9yICovCisJCWlmICh0aGlzX3VzYmR1eHN1Yi0+cHdtX2NtZF9ydW5uaW5nKSB7CisJCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkJImNvbWVkaV86IE5vbi16ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQgaW4gIgorCQkJCSJwd20gaW50ciBjb250ZXh0OiAlZFxuIiwgdXJiLT5zdGF0dXMpOworCQkJdXNiZHV4X3B3bV9zdG9wKHRoaXNfdXNiZHV4c3ViLCAwKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJLyogYXJlIHdlIGFjdHVhbGx5IHJ1bm5pbmc/ICovCisJaWYgKCEodGhpc191c2JkdXhzdWItPnB3bV9jbWRfcnVubmluZykpCisJCXJldHVybjsKKworCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IHRoaXNfdXNiZHV4c3ViLT5zaXplUHdtQnVmOworCXVyYi0+ZGV2ID0gdGhpc191c2JkdXhzdWItPnVzYmRldjsKKwl1cmItPnN0YXR1cyA9IDA7CisJaWYgKHRoaXNfdXNiZHV4c3ViLT5wd21fY21kX3J1bm5pbmcpIHsKKwkJcmV0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCQkiY29tZWRpXzogcHdtIHVyYiByZXN1Ym0gZmFpbGVkIGluIGludC1jb250LiAiCisJCQkJInJldD0lZCIsIHJldCk7CisJCQlpZiAocmV0ID09IEVMMk5TWU5DKQorCQkJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCQkJImJ1Z2d5IFVTQiBob3N0IGNvbnRyb2xsZXIgb3IgYnVnIGluICIKKwkJCQkJIklSUSBoYW5kbGluZyFcbiIpOworCisJCQkvKiBkb24ndCBkbyBhbiB1bmxpbmsgaGVyZSAqLworCQkJdXNiZHV4X3B3bV9zdG9wKHRoaXNfdXNiZHV4c3ViLCAwKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCB1c2JkdXhzdWJfc3VibWl0X1B3bVVSQnMoc3RydWN0IHVzYmR1eHN1YiAqdXNiZHV4c3ViKQoreworCWludCBlcnJGbGFnOworCisJaWYgKCF1c2JkdXhzdWIpCisJCXJldHVybiAtRUZBVUxUOworCisJZGV2X2RiZygmdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwgImNvbWVkaV86IHN1Ym1pdHRpbmcgcHdtLXVyYlxuIik7CisKKwkvKiBpbiBjYXNlIG9mIGEgcmVzdWJtaXNzaW9uIGFmdGVyIGFuIHVubGluay4uLiAqLworCXVzYl9maWxsX2J1bGtfdXJiKHVzYmR1eHN1Yi0+dXJiUHdtLAorCQl1c2JkdXhzdWItPnVzYmRldiwKKwkJdXNiX3NuZGJ1bGtwaXBlKHVzYmR1eHN1Yi0+dXNiZGV2LCBQV01fRVApLAorCQl1c2JkdXhzdWItPnVyYlB3bS0+dHJhbnNmZXJfYnVmZmVyLAorCQl1c2JkdXhzdWItPnNpemVQd21CdWYsIHVzYmR1eHN1Yl9wd21faXJxLCB1c2JkdXhzdWItPmNvbWVkaWRldik7CisKKwllcnJGbGFnID0gdXNiX3N1Ym1pdF91cmIodXNiZHV4c3ViLT51cmJQd20sIEdGUF9BVE9NSUMpOworCWlmIChlcnJGbGFnKSB7CisJCWRldl9lcnIoJnVzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpXzogdXNiZHV4OiBwd206IHVzYl9zdWJtaXRfdXJiIGVycm9yICVkXG4iLAorCQkJZXJyRmxhZyk7CisJCXJldHVybiBlcnJGbGFnOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JkdXhfcHdtX3BlcmlvZChjb21lZGlfZGV2aWNlICpkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgIGxzYW1wbF90IHBlcmlvZCkKK3sKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiA9IGRldi0+cHJpdmF0ZTsKKwlpbnQgZngyZGVsYXkgPSAyNTU7CisKKwlpZiAocGVyaW9kIDwgTUlOX1BXTV9QRVJJT0QpIHsKKwkJZGV2X2VycigmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaSVkOiBpbGxlZ2FsIHBlcmlvZCBzZXR0aW5nIGZvciBwd20uXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiAtRUFHQUlOOworCX0gZWxzZSB7CisJCWZ4MmRlbGF5ID0gcGVyaW9kIC8gKChpbnQpKDYqNTEyKigxLjAvMC4wMzMpKSkgLSA2OworCQlpZiAoZngyZGVsYXkgPiAyNTUpIHsKKwkJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCQkiY29tZWRpJWQ6IHBlcmlvZCAlZCBmb3IgcHdtIGlzIHRvbyBsb3cuXG4iLAorCQkJICAgICAgIGRldi0+bWlub3IsIHBlcmlvZCk7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorCX0KKwl0aGlzX3VzYmR1eHN1Yi0+cHdtRGVsYXkgPSBmeDJkZWxheTsKKwl0aGlzX3VzYmR1eHN1Yi0+cHdtUGVyaW9kID0gcGVyaW9kOworCWRldl9kYmcoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwgIiVzOiBmcmVxdT0lZCwgcGVyaW9kPSVkXG4iLAorCQlfX2Z1bmNfXywgcGVyaW9kLCBmeDJkZWxheSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIGlzIGNhbGxlZCBmcm9tIGluc24gc28gdGhlcmUncyBubyBuZWVkIHRvIGRvIGFsbCB0aGUgc2FuaXR5IGNoZWNrcyAqLworc3RhdGljIGludCB1c2JkdXhfcHdtX3N0YXJ0KGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwlpbnQgcmV0LCBpOworCXN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViID0gZGV2LT5wcml2YXRlOworCisJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LCAiY29tZWRpJWQ6ICVzXG4iLAorCQlkZXYtPm1pbm9yLCBfX2Z1bmNfXyk7CisKKwlpZiAodGhpc191c2JkdXhzdWItPnB3bV9jbWRfcnVubmluZykgeworCQkvKiBhbHJlYWR5IHJ1bm5pbmcgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJdGhpc191c2JkdXhzdWItPmR1eF9jb21tYW5kc1sxXSA9ICgoaW50OF90KSB0aGlzX3VzYmR1eHN1Yi0+cHdtRGVsYXkpOworCXJldCA9IHNlbmRfZHV4X2NvbW1hbmRzKHRoaXNfdXNiZHV4c3ViLCBTRU5EUFdNT04pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogaW5pdGFsaXNlIHRoZSBidWZmZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgdGhpc191c2JkdXhzdWItPnNpemVQd21CdWY7IGkrKykKKwkJKChjaGFyICopKHRoaXNfdXNiZHV4c3ViLT51cmJQd20tPnRyYW5zZmVyX2J1ZmZlcikpW2ldID0gMDsKKworCXRoaXNfdXNiZHV4c3ViLT5wd21fY21kX3J1bm5pbmcgPSAxOworCXJldCA9IHVzYmR1eHN1Yl9zdWJtaXRfUHdtVVJCcyh0aGlzX3VzYmR1eHN1Yik7CisJaWYgKHJldCA8IDApIHsKKwkJdGhpc191c2JkdXhzdWItPnB3bV9jbWRfcnVubmluZyA9IDA7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCisvKiBnZW5lcmF0ZXMgdGhlIGJpdCBwYXR0ZXJuIGZvciBQV00gd2l0aCB0aGUgb3B0aW9uYWwgc2lnbiBiaXQgKi8KK3N0YXRpYyBpbnQgdXNiZHV4X3B3bV9wYXR0ZXJuKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgICAgIGludCBjaGFubmVsLCBsc2FtcGxfdCB2YWx1ZSwgbHNhbXBsX3Qgc2lnbikKK3sKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiA9IGRldi0+cHJpdmF0ZTsKKwlpbnQgaSwgc3pidWY7CisJY2hhciAqcEJ1ZjsKKwljaGFyIHB3bV9tYXNrOworCWNoYXIgc2duX21hc2s7CisJY2hhciBjOworCisJaWYgKCF0aGlzX3VzYmR1eHN1YikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKiB0aGlzIGlzIHRoZSBESU8gYml0IHdoaWNoIGNhcnJpZXMgdGhlIFBXTSBkYXRhICovCisJcHdtX21hc2sgPSAoMSA8PCBjaGFubmVsKTsKKwkvKiB0aGlzIGlzIHRoZSBESU8gYml0IHdoaWNoIGNhcnJpZXMgdGhlIG9wdGlvbmFsIGRpcmVjdGlvbiBiaXQgKi8KKwlzZ25fbWFzayA9ICgxNiA8PCBjaGFubmVsKTsKKwkvKiB0aGlzIGlzIHRoZSBidWZmZXIgd2hpY2ggd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgd2l0aCBiaXQgKi8KKwkvKiBwYXR0ZXJuIGZvciBvbmUgcGVyaW9kICovCisJc3pidWYgPSB0aGlzX3VzYmR1eHN1Yi0+c2l6ZVB3bUJ1ZjsKKwlwQnVmID0gKGNoYXIgKikodGhpc191c2JkdXhzdWItPnVyYlB3bS0+dHJhbnNmZXJfYnVmZmVyKTsKKwlmb3IgKGkgPSAwOyBpIDwgc3pidWY7IGkrKykgeworCQljID0gKnBCdWY7CisJCS8qIHJlc2V0IGJpdHMgKi8KKwkJYyA9IGMgJiAofnB3bV9tYXNrKTsKKwkJLyogc2V0IHRoZSBiaXQgYXMgbG9uZyBhcyB0aGUgaW5kZXggaXMgbG93ZXIgdGhhbiB0aGUgdmFsdWUgKi8KKwkJaWYgKGkgPCB2YWx1ZSkKKwkJCWMgPSBjIHwgcHdtX21hc2s7CisJCS8qIHNldCB0aGUgb3B0aW9uYWwgc2lnbiBiaXQgZm9yIGEgcmVsYXkgKi8KKwkJaWYgKCFzaWduKSB7CisJCQkvKiBwb3NpdGl2ZSB2YWx1ZSAqLworCQkJYyA9IGMgJiAofnNnbl9tYXNrKTsKKwkJfSBlbHNlIHsKKwkJCS8qIG5lZ2F0aXZlIHZhbHVlICovCisJCQljID0gYyB8IHNnbl9tYXNrOworCQl9CisJCSoocEJ1ZisrKSA9IGM7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHVzYmR1eF9wd21fd3JpdGUoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgIGNvbWVkaV9pbnNuICppbnNuLCBsc2FtcGxfdCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiA9IGRldi0+cHJpdmF0ZTsKKworCWlmICghdGhpc191c2JkdXhzdWIpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKChpbnNuLT5uKSAhPSAxKSB7CisJCS8qCisJCSAqIGRvZXNuJ3QgbWFrZSBzZW5zZSB0byBoYXZlIG1vcmUgdGhhbiBvbmUgdmFsdWUgaGVyZSBiZWNhdXNlCisJCSAqIGl0IHdvdWxkIGp1c3Qgb3ZlcndyaXRlIHRoZSBQV00gYnVmZmVyIGEgY291cGxlIG9mIHRpbWVzCisJCSAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIHRoZSBzaWduIGlzIHNldCB2aWEgYSBzcGVjaWFsIElOU04gb25seSwgdGhpcyBnaXZlcyB1cyA4IGJpdHMgZm9yCisJICogbm9ybWFsIG9wZXJhdGlvbgorCSAqIHJlbGF5IHNpZ24gMCBieSBkZWZhdWx0CisJICovCisJcmV0dXJuIHVzYmR1eF9wd21fcGF0dGVybihkZXYsIHMsIENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpLAorCQkJCSAgZGF0YVswXSwgMCk7Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4X3B3bV9yZWFkKGNvbWVkaV9kZXZpY2UgKngxLCBjb21lZGlfc3ViZGV2aWNlICp4MiwKKwkJCSAgIGNvbWVkaV9pbnNuICp4MywgbHNhbXBsX3QgKng0KQoreworCS8qIG5vdCBuZWVkZWQgKi8KKwlyZXR1cm4gLUVJTlZBTDsKK307CisKKy8qIHN3aXRjaGVzIG9uL29mZiBQV00gKi8KK3N0YXRpYyBpbnQgdXNiZHV4X3B3bV9jb25maWcoY29tZWRpX2RldmljZSAqZGV2LCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICBjb21lZGlfaW5zbiAqaW5zbiwgbHNhbXBsX3QgKmRhdGEpCit7CisJc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWIgPSBkZXYtPnByaXZhdGU7CisJc3dpdGNoIChkYXRhWzBdKSB7CisJY2FzZSBJTlNOX0NPTkZJR19BUk06CisJCS8qIHN3aXRjaCBpdCBvbiAqLworCQlkZXZfZGJnKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpJWQ6ICVzOiBwd20gb25cbiIsIGRldi0+bWlub3IsIF9fZnVuY19fKTsKKwkJLyoKKwkJICogaWYgbm90IHplcm8gdGhlIFBXTSBpcyBsaW1pdGVkIHRvIGEgY2VydGFpbiB0aW1lIHdoaWNoIGlzCisJCSAqIG5vdCBzdXBwb3J0ZWQgaGVyZQorCQkgKi8KKwkJaWYgKGRhdGFbMV0gIT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gdXNiZHV4X3B3bV9zdGFydChkZXYsIHMpOworCWNhc2UgSU5TTl9DT05GSUdfRElTQVJNOgorCQlkZXZfZGJnKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpJWQ6ICVzOiBwd20gb2ZmXG4iLCBkZXYtPm1pbm9yLCBfX2Z1bmNfXyk7CisJCXJldHVybiB1c2JkdXhfcHdtX2NhbmNlbChkZXYsIHMpOworCWNhc2UgSU5TTl9DT05GSUdfR0VUX1BXTV9TVEFUVVM6CisJCS8qCisJCSAqIHRvIGNoZWNrIGlmIHRoZSBVU0IgdHJhbnNtaXNzaW9uIGhhcyBmYWlsZWQgb3IgaW4gY2FzZSBQV00KKwkJICogd2FzIGxpbWl0ZWQgdG8gbiBjeWNsZXMgdG8gY2hlY2sgaWYgaXQgaGFzIHRlcm1pbmF0ZWQKKwkJICovCisJCWRhdGFbMV0gPSB0aGlzX3VzYmR1eHN1Yi0+cHdtX2NtZF9ydW5uaW5nOworCQlyZXR1cm4gMDsKKwljYXNlIElOU05fQ09ORklHX1BXTV9TRVRfUEVSSU9EOgorCQlkZXZfZGJnKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpJWQ6ICVzOiBzZXR0aW5nIHBlcmlvZFxuIiwgZGV2LT5taW5vciwgX19mdW5jX18pOworCQlyZXR1cm4gdXNiZHV4X3B3bV9wZXJpb2QoZGV2LCBzLCBkYXRhWzFdKTsKKwljYXNlIElOU05fQ09ORklHX1BXTV9HRVRfUEVSSU9EOgorCQlkYXRhWzFdID0gdGhpc191c2JkdXhzdWItPnB3bVBlcmlvZDsKKwkJcmV0dXJuIDA7CisJY2FzZSBJTlNOX0NPTkZJR19QV01fU0VUX0hfQlJJREdFOgorCQkvKiB2YWx1ZSBpbiB0aGUgZmlyc3QgYnl0ZSBhbmQgdGhlIHNpZ24gaW4gdGhlIHNlY29uZCBmb3IgYQorCQkgICByZWxheSAqLworCQlyZXR1cm4gdXNiZHV4X3B3bV9wYXR0ZXJuKGRldiwgcywKKwkJCQkJICAvKiB0aGUgY2hhbm5lbCBudW1iZXIgKi8KKwkJCQkJICBDUl9DSEFOKGluc24tPmNoYW5zcGVjKSwKKwkJCQkJICAvKiBhY3R1YWwgUFdNIGRhdGEgKi8KKwkJCQkJICBkYXRhWzFdLAorCQkJCQkgIC8qIGp1c3QgYSBzaWduICovCisJCQkJCSAgKGRhdGFbMl0gIT0gMCkpOworCWNhc2UgSU5TTl9DT05GSUdfUFdNX0dFVF9IX0JSSURHRToKKwkJLyogdmFsdWVzIGFyZSBub3Qga2VwdCBpbiB0aGlzIGRyaXZlciwgbm90aGluZyB0byByZXR1cm4gaGVyZSAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qIGVuZCBvZiBQV00gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgdGlkeV91cChzdHJ1Y3QgdXNiZHV4c3ViICp1c2JkdXhzdWJfdG1wKQoreworCWludCBpOworCisJaWYgKCF1c2JkdXhzdWJfdG1wKQorCQlyZXR1cm47CisJZGV2X2RiZygmdXNiZHV4c3ViX3RtcC0+aW50ZXJmYWNlLT5kZXYsICJjb21lZGlfOiB0aWRpbmcgdXBcbiIpOworCisJLyogc2hvd3MgdGhlIHVzYiBzdWJzeXN0ZW0gdGhhdCB0aGUgZHJpdmVyIGlzIGRvd24gKi8KKwlpZiAodXNiZHV4c3ViX3RtcC0+aW50ZXJmYWNlKQorCQl1c2Jfc2V0X2ludGZkYXRhKHVzYmR1eHN1Yl90bXAtPmludGVyZmFjZSwgTlVMTCk7CisKKwl1c2JkdXhzdWJfdG1wLT5wcm9iZWQgPSAwOworCisJaWYgKHVzYmR1eHN1Yl90bXAtPnVyYkluKSB7CisJCWlmICh1c2JkdXhzdWJfdG1wLT5haV9jbWRfcnVubmluZykgeworCQkJdXNiZHV4c3ViX3RtcC0+YWlfY21kX3J1bm5pbmcgPSAwOworCQkJdXNiZHV4c3ViX3VubGlua19JblVSQnModXNiZHV4c3ViX3RtcCk7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IHVzYmR1eHN1Yl90bXAtPm51bU9mSW5CdWZmZXJzOyBpKyspIHsKKwkJCWtmcmVlKHVzYmR1eHN1Yl90bXAtPnVyYkluW2ldLT50cmFuc2Zlcl9idWZmZXIpOworCQkJdXNiZHV4c3ViX3RtcC0+dXJiSW5baV0tPnRyYW5zZmVyX2J1ZmZlciA9IE5VTEw7CisJCQl1c2Jfa2lsbF91cmIodXNiZHV4c3ViX3RtcC0+dXJiSW5baV0pOworCQkJdXNiX2ZyZWVfdXJiKHVzYmR1eHN1Yl90bXAtPnVyYkluW2ldKTsKKwkJCXVzYmR1eHN1Yl90bXAtPnVyYkluW2ldID0gTlVMTDsKKwkJfQorCQlrZnJlZSh1c2JkdXhzdWJfdG1wLT51cmJJbik7CisJCXVzYmR1eHN1Yl90bXAtPnVyYkluID0gTlVMTDsKKwl9CisJaWYgKHVzYmR1eHN1Yl90bXAtPnVyYk91dCkgeworCQlpZiAodXNiZHV4c3ViX3RtcC0+YW9fY21kX3J1bm5pbmcpIHsKKwkJCXVzYmR1eHN1Yl90bXAtPmFvX2NtZF9ydW5uaW5nID0gMDsKKwkJCXVzYmR1eHN1Yl91bmxpbmtfT3V0VVJCcyh1c2JkdXhzdWJfdG1wKTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgdXNiZHV4c3ViX3RtcC0+bnVtT2ZPdXRCdWZmZXJzOyBpKyspIHsKKwkJCWlmICh1c2JkdXhzdWJfdG1wLT51cmJPdXRbaV0tPnRyYW5zZmVyX2J1ZmZlcikgeworCQkJCWtmcmVlKHVzYmR1eHN1Yl90bXAtPnVyYk91dFtpXS0+CisJCQkJCXRyYW5zZmVyX2J1ZmZlcik7CisJCQkJdXNiZHV4c3ViX3RtcC0+dXJiT3V0W2ldLT50cmFuc2Zlcl9idWZmZXIgPQorCQkJCQlOVUxMOworCQkJfQorCQkJaWYgKHVzYmR1eHN1Yl90bXAtPnVyYk91dFtpXSkgeworCQkJCXVzYl9raWxsX3VyYih1c2JkdXhzdWJfdG1wLT51cmJPdXRbaV0pOworCQkJCXVzYl9mcmVlX3VyYih1c2JkdXhzdWJfdG1wLT51cmJPdXRbaV0pOworCQkJCXVzYmR1eHN1Yl90bXAtPnVyYk91dFtpXSA9IE5VTEw7CisJCQl9CisJCX0KKwkJa2ZyZWUodXNiZHV4c3ViX3RtcC0+dXJiT3V0KTsKKwkJdXNiZHV4c3ViX3RtcC0+dXJiT3V0ID0gTlVMTDsKKwl9CisJaWYgKHVzYmR1eHN1Yl90bXAtPnVyYlB3bSkgeworCQlpZiAodXNiZHV4c3ViX3RtcC0+cHdtX2NtZF9ydW5uaW5nKSB7CisJCQl1c2JkdXhzdWJfdG1wLT5wd21fY21kX3J1bm5pbmcgPSAwOworCQkJdXNiZHV4c3ViX3VubGlua19Qd21VUkJzKHVzYmR1eHN1Yl90bXApOworCQl9CisJCWtmcmVlKHVzYmR1eHN1Yl90bXAtPnVyYlB3bS0+dHJhbnNmZXJfYnVmZmVyKTsKKwkJdXNiZHV4c3ViX3RtcC0+dXJiUHdtLT50cmFuc2Zlcl9idWZmZXIgPSBOVUxMOworCQl1c2Jfa2lsbF91cmIodXNiZHV4c3ViX3RtcC0+dXJiUHdtKTsKKwkJdXNiX2ZyZWVfdXJiKHVzYmR1eHN1Yl90bXAtPnVyYlB3bSk7CisJCXVzYmR1eHN1Yl90bXAtPnVyYlB3bSA9IE5VTEw7CisJfQorCWtmcmVlKHVzYmR1eHN1Yl90bXAtPmluQnVmZmVyKTsKKwl1c2JkdXhzdWJfdG1wLT5pbkJ1ZmZlciA9IE5VTEw7CisJa2ZyZWUodXNiZHV4c3ViX3RtcC0+aW5zbkJ1ZmZlcik7CisJdXNiZHV4c3ViX3RtcC0+aW5zbkJ1ZmZlciA9IE5VTEw7CisJa2ZyZWUodXNiZHV4c3ViX3RtcC0+aW5CdWZmZXIpOworCXVzYmR1eHN1Yl90bXAtPmluQnVmZmVyID0gTlVMTDsKKwlrZnJlZSh1c2JkdXhzdWJfdG1wLT5kYWNfY29tbWFuZHMpOworCXVzYmR1eHN1Yl90bXAtPmRhY19jb21tYW5kcyA9IE5VTEw7CisJa2ZyZWUodXNiZHV4c3ViX3RtcC0+ZHV4X2NvbW1hbmRzKTsKKwl1c2JkdXhzdWJfdG1wLT5kdXhfY29tbWFuZHMgPSBOVUxMOworCXVzYmR1eHN1Yl90bXAtPmFpX2NtZF9ydW5uaW5nID0gMDsKKwl1c2JkdXhzdWJfdG1wLT5hb19jbWRfcnVubmluZyA9IDA7CisJdXNiZHV4c3ViX3RtcC0+cHdtX2NtZF9ydW5uaW5nID0gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGhleDJ1bnNpZ25lZChjaGFyICpoKQoreworCXVuc2lnbmVkIGhpLCBsbzsKKworCWlmIChoWzBdID4gJzknKQorCQloaSA9IGhbMF0gLSAnQScgKyAweDBhOworCWVsc2UKKwkJaGkgPSBoWzBdIC0gJzAnOworCisJaWYgKGhbMV0gPiAnOScpCisJCWxvID0gaFsxXSAtICdBJyArIDB4MGE7CisJZWxzZQorCQlsbyA9IGhbMV0gLSAnMCc7CisKKwlyZXR1cm4gaGkgKiAweDEwICsgbG87Cit9CisKKy8qIGZvciBGWDIgKi8KKyNkZWZpbmUgRklSTVdBUkVfTUFYX0xFTiAweDIwMDAKKworLyogdGFrZW4gZnJvbSBEYXZpZCBCcm93bmVsbCdzIGZ4bG9hZCBhbmQgYWRqdXN0ZWQgZm9yIHRoaXMgZHJpdmVyICovCitzdGF0aWMgaW50IHJlYWRfZmlybXdhcmUoc3RydWN0IHVzYmR1eHN1YiAqdXNiZHV4c3ViLCB2b2lkICpmaXJtd2FyZVB0ciwKKwkJCSBsb25nIHNpemUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnVzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXY7CisJaW50IGkgPSAwOworCXVuc2lnbmVkIGNoYXIgKmZwID0gKGNoYXIgKilmaXJtd2FyZVB0cjsKKwl1bnNpZ25lZCBjaGFyICpmaXJtd2FyZUJpbmFyeSA9IE5VTEw7CisJaW50IHJlcyA9IDA7CisJaW50IG1heEFkZHIgPSAwOworCisJZmlybXdhcmVCaW5hcnkgPSBremFsbG9jKEZJUk1XQVJFX01BWF9MRU4sIEdGUF9LRVJORUwpOworCWlmICghZmlybXdhcmVCaW5hcnkpIHsKKwkJZGV2X2VycihkZXYsICJjb21lZGlfOiBtZW0gYWxsb2MgZm9yIGZpcm13YXJlIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWZvciAoOzspIHsKKwkJY2hhciBidWZbMjU2XSwgKmNwOworCQljaGFyIHR5cGU7CisJCWludCBsZW47CisJCWludCBpZHgsIG9mZjsKKwkJaW50IGogPSAwOworCisJCS8qIGdldCBvbmUgbGluZSAqLworCQl3aGlsZSAoKGkgPCBzaXplKSAmJiAoZnBbaV0gIT0gMTMpICYmIChmcFtpXSAhPSAxMCkpIHsKKwkJCWJ1ZltqXSA9IGZwW2ldOworCQkJaSsrOworCQkJaisrOworCQkJaWYgKGogPj0gc2l6ZW9mKGJ1ZikpIHsKKwkJCQlkZXZfZXJyKGRldiwgImNvbWVkaV86IGJvZ3VzIGZpcm13YXJlIGZpbGUhXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJLyogZ2V0IHJpZCBvZiBMRi9DUi8uLi4gKi8KKwkJd2hpbGUgKChpIDwgc2l6ZSkgJiYgKChmcFtpXSA9PSAxMykgfHwgKGZwW2ldID09IDEwKQorCQkJCXx8IChmcFtpXSA9PSAwKSkpIHsKKwkJCWkrKzsKKwkJfQorCisJCWJ1ZltqXSA9IDA7CisJCS8qIGRldl9kYmcoZGV2LCAiY29tZWRpXzogYnVmPSVzXG4iLCBidWYpOyAqLworCisJCS8qCisJCSAqIEVYVEVOU0lPTjoKKwkJICogIiMgY29tbWVudC10aWxsLWVuZC1vZi1saW5lIiwgZm9yIGNvcHlyaWdodHMgZXRjCisJCSAqLworCQlpZiAoYnVmWzBdID09ICcjJykKKwkJCWNvbnRpbnVlOworCisJCWlmIChidWZbMF0gIT0gJzonKSB7CisJCQlkZXZfZXJyKGRldiwgImNvbWVkaV86IHVwbG9hZDogbm90IGFuIGloZXggcmVjb3JkOiAlcyIsCisJCQkJYnVmKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJLyogUmVhZCB0aGUgbGVuZ3RoIGZpZWxkICh1cCB0byAxNiBieXRlcykgKi8KKwkJbGVuID0gaGV4MnVuc2lnbmVkKGJ1ZiArIDEpOworCisJCS8qIFJlYWQgdGhlIHRhcmdldCBvZmZzZXQgKi8KKwkJb2ZmID0gKGhleDJ1bnNpZ25lZChidWYgKyAzKSAqIDB4MDEwMCkgKyBoZXgydW5zaWduZWQoYnVmICsgNSk7CisKKwkJaWYgKChvZmYgKyBsZW4pID4gbWF4QWRkcikKKwkJCW1heEFkZHIgPSBvZmYgKyBsZW47CisKKworCQlpZiAobWF4QWRkciA+PSBGSVJNV0FSRV9NQVhfTEVOKSB7CisJCQlkZXZfZXJyKGRldiwgImNvbWVkaV86IGZpcm13YXJlIHVwbG9hZCBnb2VzICIKKwkJCQkiYmV5b25kIEZYMiBSQU0gYm91bmRhcmllcy5cbiIpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJLyogZGV2X2RiZyhkZXYsICJjb21lZGlfOiBvZmY9JXgsIGxlbj0leDpcbiIsIG9mZiwgbGVuKTsgKi8KKworCQkvKiBSZWFkIHRoZSByZWNvcmQgdHlwZSAqLworCQl0eXBlID0gaGV4MnVuc2lnbmVkKGJ1ZiArIDcpOworCisJCS8qIElmIHRoaXMgaXMgYW4gRU9GIHJlY29yZCwgdGhlbiBtYWtlIGl0IHNvLiAqLworCQlpZiAodHlwZSA9PSAxKQorCQkJYnJlYWs7CisKKworCQlpZiAodHlwZSAhPSAwKSB7CisJCQlkZXZfZXJyKGRldiwgImNvbWVkaV86IHVuc3VwcG9ydGVkIHJlY29yZCB0eXBlOiAldVxuIiwKKwkJCQl0eXBlKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJZm9yIChpZHggPSAwLCBjcCA9IGJ1ZiArIDk7IGlkeCA8IGxlbjsgaWR4ICs9IDEsIGNwICs9IDIpIHsKKwkJCWZpcm13YXJlQmluYXJ5W2lkeCArIG9mZl0gPSBoZXgydW5zaWduZWQoY3ApOworCQkJLypwcmludGsoIiUwMnggIixmaXJtd2FyZUJpbmFyeVtpZHgrb2ZmXSk7ICovCisJCX0KKwkJLypwcmludGsoIlxuIik7ICovCisKKwkJaWYgKGkgPj0gc2l6ZSkgeworCQkJZGV2X2VycihkZXYsICJjb21lZGlfOiB1bmV4cGVjdGVkIGVuZCBvZiBoZXggZmlsZVxuIik7CisJCQlicmVhazsKKwkJfQorCisJfQorCXJlcyA9IGZpcm13YXJlVXBsb2FkKHVzYmR1eHN1YiwgZmlybXdhcmVCaW5hcnksIG1heEFkZHIgKyAxKTsKKwlrZnJlZShmaXJtd2FyZUJpbmFyeSk7CisJcmV0dXJuIHJlczsKK30KKworLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgdXJicyBhbmQgaW5pdGlhbGlzZSB0aGVtICovCitzdGF0aWMgaW50IHVzYmR1eHN1Yl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqdWludGVyZiwKKwkJCSAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYodWludGVyZik7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnVpbnRlcmYtPmRldjsKKwlpbnQgaTsKKwlpbnQgaW5kZXg7CisKKwlkZXZfZGJnKGRldiwgImNvbWVkaV86IHVzYmR1eF86ICIKKwkJImZpbmRpbmcgYSBmcmVlIHN0cnVjdHVyZSBmb3IgdGhlIHVzYi1kZXZpY2VcbiIpOworCisJZG93bigmc3RhcnRfc3RvcF9zZW0pOworCS8qIGxvb2sgZm9yIGEgZnJlZSBwbGFjZSBpbiB0aGUgdXNiZHV4IGFycmF5ICovCisJaW5kZXggPSAtMTsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNVVNCRFVYOyBpKyspIHsKKwkJaWYgKCEodXNiZHV4c3ViW2ldLnByb2JlZCkpIHsKKwkJCWluZGV4ID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogbm8gbW9yZSBzcGFjZSAqLworCWlmIChpbmRleCA9PSAtMSkgeworCQlkZXZfZXJyKGRldiwgIlRvbyBtYW55IHVzYmR1eC1kZXZpY2VzIGNvbm5lY3RlZC5cbiIpOworCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQlyZXR1cm4gLUVNRklMRTsKKwl9CisJZGV2X2RiZyhkZXYsICJjb21lZGlfOiB1c2JkdXg6ICIKKwkJInVzYmR1eHN1YlslZF0gaXMgcmVhZHkgdG8gY29ubmVjdCB0byBjb21lZGkuXG4iLCBpbmRleCk7CisKKwlpbml0X01VVEVYKCYodXNiZHV4c3ViW2luZGV4XS5zZW0pKTsKKwkvKiBzYXZlIGEgcG9pbnRlciB0byB0aGUgdXNiIGRldmljZSAqLworCXVzYmR1eHN1YltpbmRleF0udXNiZGV2ID0gdWRldjsKKworCS8qIDIuNjogc2F2ZSB0aGUgaW50ZXJmYWNlIGl0c2VsZiAqLworCXVzYmR1eHN1YltpbmRleF0uaW50ZXJmYWNlID0gdWludGVyZjsKKwkvKiBnZXQgdGhlIGludGVyZmFjZSBudW1iZXIgZnJvbSB0aGUgaW50ZXJmYWNlICovCisJdXNiZHV4c3ViW2luZGV4XS5pZm51bSA9IHVpbnRlcmYtPmFsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcjsKKwkvKiBoYW5kIHRoZSBwcml2YXRlIGRhdGEgb3ZlciB0byB0aGUgdXNiIHN1YnN5c3RlbSAqLworCS8qIHdpbGwgYmUgbmVlZGVkIGZvciBkaXNjb25uZWN0ICovCisJdXNiX3NldF9pbnRmZGF0YSh1aW50ZXJmLCAmKHVzYmR1eHN1YltpbmRleF0pKTsKKworCWRldl9kYmcoZGV2LCAiY29tZWRpXzogdXNiZHV4OiBpZm51bT0lZFxuIiwgdXNiZHV4c3ViW2luZGV4XS5pZm51bSk7CisKKwkvKiB0ZXN0IGlmIGl0IGlzIGhpZ2ggc3BlZWQgKFVTQiAyLjApICovCisJdXNiZHV4c3ViW2luZGV4XS5oaWdoX3NwZWVkID0KKwkJKHVzYmR1eHN1YltpbmRleF0udXNiZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCk7CisKKwkvKiBjcmVhdGUgc3BhY2UgZm9yIHRoZSBjb21tYW5kcyBvZiB0aGUgREEgY29udmVydGVyICovCisJdXNiZHV4c3ViW2luZGV4XS5kYWNfY29tbWFuZHMgPSBremFsbG9jKE5VTU9VVENIQU5ORUxTLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXVzYmR1eHN1YltpbmRleF0uZGFjX2NvbW1hbmRzKSB7CisJCWRldl9lcnIoZGV2LCAiY29tZWRpXzogdXNiZHV4OiAiCisJCQkiZXJyb3IgYWxsb2Mgc3BhY2UgZm9yIGRhYyBjb21tYW5kc1xuIik7CisJCXRpZHlfdXAoJih1c2JkdXhzdWJbaW5kZXhdKSk7CisJCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkvKiBjcmVhdGUgc3BhY2UgZm9yIHRoZSBjb21tYW5kcyBnb2luZyB0byB0aGUgdXNiIGRldmljZSAqLworCXVzYmR1eHN1YltpbmRleF0uZHV4X2NvbW1hbmRzID0ga3phbGxvYyhTSVpFT0ZEVVhCVUZGRVIsIEdGUF9LRVJORUwpOworCWlmICghdXNiZHV4c3ViW2luZGV4XS5kdXhfY29tbWFuZHMpIHsKKwkJZGV2X2VycihkZXYsICJjb21lZGlfOiB1c2JkdXg6ICIKKwkJCSJlcnJvciBhbGxvYyBzcGFjZSBmb3IgZGFjIGNvbW1hbmRzXG4iKTsKKwkJdGlkeV91cCgmKHVzYmR1eHN1YltpbmRleF0pKTsKKwkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCS8qIGNyZWF0ZSBzcGFjZSBmb3IgdGhlIGluIGJ1ZmZlciBhbmQgc2V0IGl0IHRvIHplcm8gKi8KKwl1c2JkdXhzdWJbaW5kZXhdLmluQnVmZmVyID0ga3phbGxvYyhTSVpFSU5CVUYsIEdGUF9LRVJORUwpOworCWlmICghKHVzYmR1eHN1YltpbmRleF0uaW5CdWZmZXIpKSB7CisJCWRldl9lcnIoZGV2LCAiY29tZWRpXzogdXNiZHV4OiAiCisJCQkiY291bGQgbm90IGFsbG9jIHNwYWNlIGZvciBpbkJ1ZmZlclxuIik7CisJCXRpZHlfdXAoJih1c2JkdXhzdWJbaW5kZXhdKSk7CisJCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkvKiBjcmVhdGUgc3BhY2Ugb2YgdGhlIGluc3RydWN0aW9uIGJ1ZmZlciAqLworCXVzYmR1eHN1YltpbmRleF0uaW5zbkJ1ZmZlciA9IGt6YWxsb2MoU0laRUlOU05CVUYsIEdGUF9LRVJORUwpOworCWlmICghKHVzYmR1eHN1YltpbmRleF0uaW5zbkJ1ZmZlcikpIHsKKwkJZGV2X2VycihkZXYsICJjb21lZGlfOiB1c2JkdXg6ICIKKwkJCSJjb3VsZCBub3QgYWxsb2Mgc3BhY2UgZm9yIGluc25CdWZmZXJcbiIpOworCQl0aWR5X3VwKCYodXNiZHV4c3ViW2luZGV4XSkpOworCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLyogY3JlYXRlIHNwYWNlIGZvciB0aGUgb3V0YnVmZmVyICovCisJdXNiZHV4c3ViW2luZGV4XS5vdXRCdWZmZXIgPSBremFsbG9jKFNJWkVPVVRCVUYsIEdGUF9LRVJORUwpOworCWlmICghKHVzYmR1eHN1YltpbmRleF0ub3V0QnVmZmVyKSkgeworCQlkZXZfZXJyKGRldiwgImNvbWVkaV86IHVzYmR1eDogIgorCQkJImNvdWxkIG5vdCBhbGxvYyBzcGFjZSBmb3Igb3V0QnVmZmVyXG4iKTsKKwkJdGlkeV91cCgmKHVzYmR1eHN1YltpbmRleF0pKTsKKwkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCS8qIHNldHRpbmcgdG8gYWx0ZXJuYXRlIHNldHRpbmcgMzogZW5hYmxpbmcgaXNvIGVwIGFuZCBidWxrIGVwLiAqLworCWkgPSB1c2Jfc2V0X2ludGVyZmFjZSh1c2JkdXhzdWJbaW5kZXhdLnVzYmRldiwKKwkJCSAgICAgIHVzYmR1eHN1YltpbmRleF0uaWZudW0sIDMpOworCWlmIChpIDwgMCkgeworCQlkZXZfZXJyKGRldiwgImNvbWVkaV86IHVzYmR1eCVkOiAiCisJCQkiY291bGQgbm90IHNldCBhbHRlcm5hdGUgc2V0dGluZyAzIGluIGhpZ2ggc3BlZWQuXG4iLAorCQkJaW5kZXgpOworCQl0aWR5X3VwKCYodXNiZHV4c3ViW2luZGV4XSkpOworCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKHVzYmR1eHN1YltpbmRleF0uaGlnaF9zcGVlZCkKKwkJdXNiZHV4c3ViW2luZGV4XS5udW1PZkluQnVmZmVycyA9IE5VTU9GSU5CVUZGRVJTSElHSDsKKwllbHNlCisJCXVzYmR1eHN1YltpbmRleF0ubnVtT2ZJbkJ1ZmZlcnMgPSBOVU1PRklOQlVGRkVSU0ZVTEw7CisKKwl1c2JkdXhzdWJbaW5kZXhdLnVyYkluID0KKwkJa3phbGxvYyhzaXplb2Yoc3RydWN0IHVyYiAqKSAqIHVzYmR1eHN1YltpbmRleF0ubnVtT2ZJbkJ1ZmZlcnMsCisJCUdGUF9LRVJORUwpOworCWlmICghKHVzYmR1eHN1YltpbmRleF0udXJiSW4pKSB7CisJCWRldl9lcnIoZGV2LCAiY29tZWRpXzogdXNiZHV4OiBDb3VsZCBub3QgYWxsb2MuIHVyYkluIGFycmF5XG4iKTsKKwkJdGlkeV91cCgmKHVzYmR1eHN1YltpbmRleF0pKTsKKwkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWZvciAoaSA9IDA7IGkgPCB1c2JkdXhzdWJbaW5kZXhdLm51bU9mSW5CdWZmZXJzOyBpKyspIHsKKwkJLyogb25lIGZyYW1lOiAxbXMgKi8KKwkJdXNiZHV4c3ViW2luZGV4XS51cmJJbltpXSA9IHVzYl9hbGxvY191cmIoMSwgR0ZQX0tFUk5FTCk7CisJCWlmICh1c2JkdXhzdWJbaW5kZXhdLnVyYkluW2ldID09IE5VTEwpIHsKKwkJCWRldl9lcnIoZGV2LCAiY29tZWRpXzogdXNiZHV4JWQ6ICIKKwkJCQkiQ291bGQgbm90IGFsbG9jLiB1cmIoJWQpXG4iLCBpbmRleCwgaSk7CisJCQl0aWR5X3VwKCYodXNiZHV4c3ViW2luZGV4XSkpOworCQkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXVzYmR1eHN1YltpbmRleF0udXJiSW5baV0tPmRldiA9IHVzYmR1eHN1YltpbmRleF0udXNiZGV2OworCQkvKiB3aWxsIGJlIGZpbGxlZCBsYXRlciB3aXRoIGEgcG9pbnRlciB0byB0aGUgY29tZWRpLWRldmljZSAqLworCQkvKiBhbmQgT05MWSB0aGVuIHRoZSB1cmIgc2hvdWxkIGJlIHN1Ym1pdHRlZCAqLworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYkluW2ldLT5jb250ZXh0ID0gTlVMTDsKKwkJdXNiZHV4c3ViW2luZGV4XS51cmJJbltpXS0+cGlwZSA9CisJCQl1c2JfcmN2aXNvY3BpcGUodXNiZHV4c3ViW2luZGV4XS51c2JkZXYsIElTT0lORVApOworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYkluW2ldLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9JU09fQVNBUDsKKwkJdXNiZHV4c3ViW2luZGV4XS51cmJJbltpXS0+dHJhbnNmZXJfYnVmZmVyID0KKwkJCWt6YWxsb2MoU0laRUlOQlVGLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCEodXNiZHV4c3ViW2luZGV4XS51cmJJbltpXS0+dHJhbnNmZXJfYnVmZmVyKSkgeworCQkJZGV2X2VycihkZXYsICJjb21lZGlfOiB1c2JkdXglZDogIgorCQkJCSJjb3VsZCBub3QgYWxsb2MuIHRyYW5zYi5cbiIsIGluZGV4KTsKKwkJCXRpZHlfdXAoJih1c2JkdXhzdWJbaW5kZXhdKSk7CisJCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJdXNiZHV4c3ViW2luZGV4XS51cmJJbltpXS0+Y29tcGxldGUgPSB1c2JkdXhzdWJfYWlfSXNvY0lycTsKKwkJdXNiZHV4c3ViW2luZGV4XS51cmJJbltpXS0+bnVtYmVyX29mX3BhY2tldHMgPSAxOworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYkluW2ldLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gU0laRUlOQlVGOworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYkluW2ldLT5pc29fZnJhbWVfZGVzY1swXS5vZmZzZXQgPSAwOworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYkluW2ldLT5pc29fZnJhbWVfZGVzY1swXS5sZW5ndGggPSBTSVpFSU5CVUY7CisJfQorCisJLyogb3V0ICovCisJaWYgKHVzYmR1eHN1YltpbmRleF0uaGlnaF9zcGVlZCkKKwkJdXNiZHV4c3ViW2luZGV4XS5udW1PZk91dEJ1ZmZlcnMgPSBOVU1PRk9VVEJVRkZFUlNISUdIOworCWVsc2UKKwkJdXNiZHV4c3ViW2luZGV4XS5udW1PZk91dEJ1ZmZlcnMgPSBOVU1PRk9VVEJVRkZFUlNGVUxMOworCisJdXNiZHV4c3ViW2luZGV4XS51cmJPdXQgPQorCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgdXJiICopICogdXNiZHV4c3ViW2luZGV4XS5udW1PZk91dEJ1ZmZlcnMsCisJCUdGUF9LRVJORUwpOworCWlmICghKHVzYmR1eHN1YltpbmRleF0udXJiT3V0KSkgeworCQlkZXZfZXJyKGRldiwgImNvbWVkaV86IHVzYmR1eDogIgorCQkJIkNvdWxkIG5vdCBhbGxvYy4gdXJiT3V0IGFycmF5XG4iKTsKKwkJdGlkeV91cCgmKHVzYmR1eHN1YltpbmRleF0pKTsKKwkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWZvciAoaSA9IDA7IGkgPCB1c2JkdXhzdWJbaW5kZXhdLm51bU9mT3V0QnVmZmVyczsgaSsrKSB7CisJCS8qIG9uZSBmcmFtZTogMW1zICovCisJCXVzYmR1eHN1YltpbmRleF0udXJiT3V0W2ldID0gdXNiX2FsbG9jX3VyYigxLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHVzYmR1eHN1YltpbmRleF0udXJiT3V0W2ldID09IE5VTEwpIHsKKwkJCWRldl9lcnIoZGV2LCAiY29tZWRpXzogdXNiZHV4JWQ6ICIKKwkJCQkiQ291bGQgbm90IGFsbG9jLiB1cmIoJWQpXG4iLCBpbmRleCwgaSk7CisJCQl0aWR5X3VwKCYodXNiZHV4c3ViW2luZGV4XSkpOworCQkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXVzYmR1eHN1YltpbmRleF0udXJiT3V0W2ldLT5kZXYgPSB1c2JkdXhzdWJbaW5kZXhdLnVzYmRldjsKKwkJLyogd2lsbCBiZSBmaWxsZWQgbGF0ZXIgd2l0aCBhIHBvaW50ZXIgdG8gdGhlIGNvbWVkaS1kZXZpY2UgKi8KKwkJLyogYW5kIE9OTFkgdGhlbiB0aGUgdXJiIHNob3VsZCBiZSBzdWJtaXR0ZWQgKi8KKwkJdXNiZHV4c3ViW2luZGV4XS51cmJPdXRbaV0tPmNvbnRleHQgPSBOVUxMOworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYk91dFtpXS0+cGlwZSA9CisJCQl1c2Jfc25kaXNvY3BpcGUodXNiZHV4c3ViW2luZGV4XS51c2JkZXYsIElTT09VVEVQKTsKKwkJdXNiZHV4c3ViW2luZGV4XS51cmJPdXRbaV0tPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQOworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYk91dFtpXS0+dHJhbnNmZXJfYnVmZmVyID0KKwkJCWt6YWxsb2MoU0laRU9VVEJVRiwgR0ZQX0tFUk5FTCk7CisJCWlmICghKHVzYmR1eHN1YltpbmRleF0udXJiT3V0W2ldLT50cmFuc2Zlcl9idWZmZXIpKSB7CisJCQlkZXZfZXJyKGRldiwgImNvbWVkaV86IHVzYmR1eCVkOiAiCisJCQkJImNvdWxkIG5vdCBhbGxvYy4gdHJhbnNiLlxuIiwgaW5kZXgpOworCQkJdGlkeV91cCgmKHVzYmR1eHN1YltpbmRleF0pKTsKKwkJCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQl1c2JkdXhzdWJbaW5kZXhdLnVyYk91dFtpXS0+Y29tcGxldGUgPSB1c2JkdXhzdWJfYW9fSXNvY0lycTsKKwkJdXNiZHV4c3ViW2luZGV4XS51cmJPdXRbaV0tPm51bWJlcl9vZl9wYWNrZXRzID0gMTsKKwkJdXNiZHV4c3ViW2luZGV4XS51cmJPdXRbaV0tPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBTSVpFT1VUQlVGOworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYk91dFtpXS0+aXNvX2ZyYW1lX2Rlc2NbMF0ub2Zmc2V0ID0gMDsKKwkJdXNiZHV4c3ViW2luZGV4XS51cmJPdXRbaV0tPmlzb19mcmFtZV9kZXNjWzBdLmxlbmd0aCA9CisJCQlTSVpFT1VUQlVGOworCQlpZiAodXNiZHV4c3ViW2luZGV4XS5oaWdoX3NwZWVkKSB7CisJCQkvKiB1ZnJhbWVzICovCisJCQl1c2JkdXhzdWJbaW5kZXhdLnVyYk91dFtpXS0+aW50ZXJ2YWwgPSA4OworCQl9IGVsc2UgeworCQkJLyogZnJhbWVzICovCisJCQl1c2JkdXhzdWJbaW5kZXhdLnVyYk91dFtpXS0+aW50ZXJ2YWwgPSAxOworCQl9CisJfQorCisJLyogcHdtICovCisJaWYgKHVzYmR1eHN1YltpbmRleF0uaGlnaF9zcGVlZCkgeworCQkvKiBtYXggYnVsayBlcCBzaXplIGluIGhpZ2ggc3BlZWQgKi8KKwkJdXNiZHV4c3ViW2luZGV4XS5zaXplUHdtQnVmID0gNTEyOworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYlB3bSA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJCWlmICh1c2JkdXhzdWJbaW5kZXhdLnVyYlB3bSA9PSBOVUxMKSB7CisJCQlkZXZfZXJyKGRldiwgImNvbWVkaV86IHVzYmR1eCVkOiAiCisJCQkJIkNvdWxkIG5vdCBhbGxvYy4gcHdtIHVyYlxuIiwgaW5kZXgpOworCQkJdGlkeV91cCgmKHVzYmR1eHN1YltpbmRleF0pKTsKKwkJCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQl1c2JkdXhzdWJbaW5kZXhdLnVyYlB3bS0+dHJhbnNmZXJfYnVmZmVyID0KKwkJCWt6YWxsb2ModXNiZHV4c3ViW2luZGV4XS5zaXplUHdtQnVmLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCEodXNiZHV4c3ViW2luZGV4XS51cmJQd20tPnRyYW5zZmVyX2J1ZmZlcikpIHsKKwkJCWRldl9lcnIoZGV2LCAiY29tZWRpXzogdXNiZHV4JWQ6ICIKKwkJCQkiY291bGQgbm90IGFsbG9jLiB0cmFuc2IuIGZvciBwd21cbiIsIGluZGV4KTsKKwkJCXRpZHlfdXAoJih1c2JkdXhzdWJbaW5kZXhdKSk7CisJCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9IGVsc2UgeworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYlB3bSA9IE5VTEw7CisJCXVzYmR1eHN1YltpbmRleF0uc2l6ZVB3bUJ1ZiA9IDA7CisJfQorCisJdXNiZHV4c3ViW2luZGV4XS5haV9jbWRfcnVubmluZyA9IDA7CisJdXNiZHV4c3ViW2luZGV4XS5hb19jbWRfcnVubmluZyA9IDA7CisJdXNiZHV4c3ViW2luZGV4XS5wd21fY21kX3J1bm5pbmcgPSAwOworCisJLyogd2UndmUgcmVhY2hlZCB0aGUgYm90dG9tIG9mIHRoZSBmdW5jdGlvbiAqLworCXVzYmR1eHN1YltpbmRleF0ucHJvYmVkID0gMTsKKwl1cCgmc3RhcnRfc3RvcF9zZW0pOworCWRldl9pbmZvKGRldiwgImNvbWVkaV86IHVzYmR1eCVkICIKKwkJICJoYXMgYmVlbiBzdWNjZXNzZnVsbHkgaW5pdGlhbGlzZWQuXG4iLCBpbmRleCk7CisJLyogc3VjY2VzcyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1c2JkdXhzdWJfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgdXNiZHV4c3ViICp1c2JkdXhzdWJfdG1wID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisKKwlpZiAoIXVzYmR1eHN1Yl90bXApIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LAorCQkJImNvbWVkaV86IGRpc2Nvbm5lY3QgY2FsbGVkIHdpdGggbnVsbCBwb2ludGVyLlxuIik7CisJCXJldHVybjsKKwl9CisJaWYgKHVzYmR1eHN1Yl90bXAtPnVzYmRldiAhPSB1ZGV2KSB7CisJCWRldl9lcnIoJmludGYtPmRldiwKKwkJCSJjb21lZGlfOiBCVUchIGNhbGxlZCB3aXRoIHdyb25nIHB0ciEhIVxuIik7CisJCXJldHVybjsKKwl9CisJZG93bigmc3RhcnRfc3RvcF9zZW0pOworCWRvd24oJnVzYmR1eHN1Yl90bXAtPnNlbSk7CisJdGlkeV91cCh1c2JkdXhzdWJfdG1wKTsKKwl1cCgmdXNiZHV4c3ViX3RtcC0+c2VtKTsKKwl1cCgmc3RhcnRfc3RvcF9zZW0pOworCWRldl9kYmcoJmludGYtPmRldiwgImNvbWVkaV86IGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSB1c2JcbiIpOworfQorCisvKiBpcyBjYWxsZWQgd2hlbiBjb21lZGktY29uZmlnIGlzIGNhbGxlZCAqLworc3RhdGljIGludCB1c2JkdXhfYXR0YWNoKGNvbWVkaV9kZXZpY2UgKmRldiwgY29tZWRpX2RldmNvbmZpZyAqaXQpCit7CisJaW50IHJldDsKKwlpbnQgaW5kZXg7CisJaW50IGk7CisJc3RydWN0IHVzYmR1eHN1YiAqdWRldjsKKworCWNvbWVkaV9zdWJkZXZpY2UgKnMgPSBOVUxMOworCWRldi0+cHJpdmF0ZSA9IE5VTEw7CisKKwlkb3duKCZzdGFydF9zdG9wX3NlbSk7CisJLyogZmluZCBhIHZhbGlkIGRldmljZSB3aGljaCBoYXMgYmVlbiBkZXRlY3RlZCBieSB0aGUgcHJvYmUgZnVuY3Rpb24gb2YKKwkgKiB0aGUgdXNiICovCisJaW5kZXggPSAtMTsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNVVNCRFVYOyBpKyspIHsKKwkJaWYgKCh1c2JkdXhzdWJbaV0ucHJvYmVkKSAmJiAoIXVzYmR1eHN1YltpXS5hdHRhY2hlZCkpIHsKKwkJCWluZGV4ID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGluZGV4IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImNvbWVkaSVkOiB1c2JkdXg6IGVycm9yOiBhdHRhY2ggZmFpbGVkLCBubyAiCisJCSAgICAgICAidXNiZHV4IGRldnMgY29ubmVjdGVkIHRvIHRoZSB1c2IgYnVzLlxuIiwgZGV2LT5taW5vcik7CisJCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXVkZXYgPSAmdXNiZHV4c3ViW2luZGV4XTsKKwlkb3duKCZ1ZGV2LT5zZW0pOworCS8qIHBvaW50ZXIgYmFjayB0byB0aGUgY29ycmVzcG9uZGluZyBjb21lZGkgZGV2aWNlICovCisJdWRldi0+Y29tZWRpZGV2ID0gZGV2OworCisJLyogdHJ5aW5nIHRvIHVwbG9hZCB0aGUgZmlybXdhcmUgaW50byB0aGUgY2hpcCAqLworCWlmIChjb21lZGlfYXV4X2RhdGEoaXQtPm9wdGlvbnMsIDApICYmCisJCWl0LT5vcHRpb25zW0NPTUVESV9ERVZDT05GX0FVWF9EQVRBX0xFTkdUSF0pIHsKKwkJcmVhZF9maXJtd2FyZSh1ZGV2LCBjb21lZGlfYXV4X2RhdGEoaXQtPm9wdGlvbnMsIDApLAorCQkJICAgICAgaXQtPm9wdGlvbnNbQ09NRURJX0RFVkNPTkZfQVVYX0RBVEFfTEVOR1RIXSk7CisJfQorCisJZGV2LT5ib2FyZF9uYW1lID0gQk9BUkROQU1FOworCisJLyogc2V0IG51bWJlciBvZiBzdWJkZXZpY2VzICovCisJaWYgKHVkZXYtPmhpZ2hfc3BlZWQpIHsKKwkJLyogd2l0aCBwd20gKi8KKwkJZGV2LT5uX3N1YmRldmljZXMgPSA1OworCX0gZWxzZSB7CisJCS8qIHdpdGhvdXQgcHdtICovCisJCWRldi0+bl9zdWJkZXZpY2VzID0gNDsKKwl9CisKKwkvKiBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHN1YmRldmljZXMgKi8KKwlyZXQgPSBhbGxvY19zdWJkZXZpY2VzKGRldiwgZGV2LT5uX3N1YmRldmljZXMpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnVkZXYtPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaSVkOiBlcnJvciBhbGxvYyBzcGFjZSBmb3Igc3ViZGV2XG4iLCBkZXYtPm1pbm9yKTsKKwkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlkZXZfaW5mbygmdWRldi0+aW50ZXJmYWNlLT5kZXYsCisJCSJjb21lZGklZDogdXNiLWRldmljZSAlZCBpcyBhdHRhY2hlZCB0byBjb21lZGkuXG4iLAorCQlkZXYtPm1pbm9yLCBpbmRleCk7CisJLyogcHJpdmF0ZSBzdHJ1Y3R1cmUgaXMgYWxzbyBzaW1wbHkgdGhlIHVzYi1zdHJ1Y3R1cmUgKi8KKwlkZXYtPnByaXZhdGUgPSB1ZGV2OworCisJLyogdGhlIGZpcnN0IHN1YmRldmljZSBpcyB0aGUgQS9EIGNvbnZlcnRlciAqLworCXMgPSBkZXYtPnN1YmRldmljZXMgKyBTVUJERVZfQUQ7CisJLyogdGhlIFVSQnMgZ2V0IHRoZSBjb21lZGkgc3ViZGV2aWNlICovCisJLyogd2hpY2ggaXMgcmVzcG9uc2libGUgZm9yIHJlYWRpbmcgKi8KKwkvKiB0aGlzIGlzIHRoZSBzdWJkZXZpY2Ugd2hpY2ggcmVhZHMgZGF0YSAqLworCWRldi0+cmVhZF9zdWJkZXYgPSBzOworCS8qIHRoZSBzdWJkZXZpY2UgcmVjZWl2ZXMgYXMgcHJpdmF0ZSBzdHJ1Y3R1cmUgdGhlICovCisJLyogdXNiLXN0cnVjdHVyZSAqLworCXMtPnByaXZhdGUgPSBOVUxMOworCS8qIGFuYWxvZyBpbnB1dCAqLworCXMtPnR5cGUgPSBDT01FRElfU1VCRF9BSTsKKwkvKiByZWFkYWJsZSBhbmQgcmVmIGlzIHRvIGdyb3VuZCAqLworCXMtPnN1YmRldl9mbGFncyA9IFNERl9SRUFEQUJMRSB8IFNERl9HUk9VTkQgfCBTREZfQ01EX1JFQUQ7CisJLyogOCBjaGFubmVscyAqLworCXMtPm5fY2hhbiA9IDg7CisJLyogbGVuZ3RoIG9mIHRoZSBjaGFubmVsbGlzdCAqLworCXMtPmxlbl9jaGFubGlzdCA9IDg7CisJLyogY2FsbGJhY2sgZnVuY3Rpb25zICovCisJcy0+aW5zbl9yZWFkID0gdXNiZHV4X2FpX2luc25fcmVhZDsKKwlzLT5kb19jbWR0ZXN0ID0gdXNiZHV4X2FpX2NtZHRlc3Q7CisJcy0+ZG9fY21kID0gdXNiZHV4X2FpX2NtZDsKKwlzLT5jYW5jZWwgPSB1c2JkdXhfYWlfY2FuY2VsOworCS8qIG1heCB2YWx1ZSBmcm9tIHRoZSBBL0QgY29udmVydGVyICgxMmJpdCkgKi8KKwlzLT5tYXhkYXRhID0gMHhmZmY7CisJLyogcmFuZ2UgdGFibGUgdG8gY29udmVydCB0byBwaHlzaWNhbCB1bml0cyAqLworCXMtPnJhbmdlX3RhYmxlID0gKCZyYW5nZV91c2JkdXhfYWlfcmFuZ2UpOworCisJLyogYW5hbG9nIG91dCAqLworCXMgPSBkZXYtPnN1YmRldmljZXMgKyBTVUJERVZfREE7CisJLyogYW5hbG9nIG91dCAqLworCXMtPnR5cGUgPSBDT01FRElfU1VCRF9BTzsKKwkvKiBiYWNrd2FyZCBwb2ludGVyICovCisJZGV2LT53cml0ZV9zdWJkZXYgPSBzOworCS8qIHRoZSBzdWJkZXZpY2UgcmVjZWl2ZXMgYXMgcHJpdmF0ZSBzdHJ1Y3R1cmUgdGhlICovCisJLyogdXNiLXN0cnVjdHVyZSAqLworCXMtPnByaXZhdGUgPSBOVUxMOworCS8qIGFyZSB3cml0YWJsZSAqLworCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklUQUJMRSB8IFNERl9HUk9VTkQgfCBTREZfQ01EX1dSSVRFOworCS8qIDQgY2hhbm5lbHMgKi8KKwlzLT5uX2NoYW4gPSA0OworCS8qIGxlbmd0aCBvZiB0aGUgY2hhbm5lbGxpc3QgKi8KKwlzLT5sZW5fY2hhbmxpc3QgPSA0OworCS8qIDEyIGJpdCByZXNvbHV0aW9uICovCisJcy0+bWF4ZGF0YSA9IDB4MGZmZjsKKwkvKiBiaXBvbGFyIHJhbmdlICovCisJcy0+cmFuZ2VfdGFibGUgPSAoJnJhbmdlX3VzYmR1eF9hb19yYW5nZSk7CisJLyogY2FsbGJhY2sgKi8KKwlzLT5kb19jbWR0ZXN0ID0gdXNiZHV4X2FvX2NtZHRlc3Q7CisJcy0+ZG9fY21kID0gdXNiZHV4X2FvX2NtZDsKKwlzLT5jYW5jZWwgPSB1c2JkdXhfYW9fY2FuY2VsOworCXMtPmluc25fcmVhZCA9IHVzYmR1eF9hb19pbnNuX3JlYWQ7CisJcy0+aW5zbl93cml0ZSA9IHVzYmR1eF9hb19pbnNuX3dyaXRlOworCisJLyogZGlnaXRhbCBJL08gKi8KKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgU1VCREVWX0RJTzsKKwlzLT50eXBlID0gQ09NRURJX1NVQkRfRElPOworCXMtPnN1YmRldl9mbGFncyA9IFNERl9SRUFEQUJMRSB8IFNERl9XUklUQUJMRTsKKwlzLT5uX2NoYW4gPSA4OworCXMtPm1heGRhdGEgPSAxOworCXMtPnJhbmdlX3RhYmxlID0gKCZyYW5nZV9kaWdpdGFsKTsKKwlzLT5pbnNuX2JpdHMgPSB1c2JkdXhfZGlvX2luc25fYml0czsKKwlzLT5pbnNuX2NvbmZpZyA9IHVzYmR1eF9kaW9faW5zbl9jb25maWc7CisJLyogd2UgZG9uJ3QgdXNlIGl0ICovCisJcy0+cHJpdmF0ZSA9IE5VTEw7CisKKwkvKiBjb3VudGVyICovCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIFNVQkRFVl9DT1VOVEVSOworCXMtPnR5cGUgPSBDT01FRElfU1VCRF9DT1VOVEVSOworCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklUQUJMRSB8IFNERl9SRUFEQUJMRTsKKwlzLT5uX2NoYW4gPSA0OworCXMtPm1heGRhdGEgPSAweEZGRkY7CisJcy0+aW5zbl9yZWFkID0gdXNiZHV4X2NvdW50ZXJfcmVhZDsKKwlzLT5pbnNuX3dyaXRlID0gdXNiZHV4X2NvdW50ZXJfd3JpdGU7CisJcy0+aW5zbl9jb25maWcgPSB1c2JkdXhfY291bnRlcl9jb25maWc7CisKKwlpZiAodWRldi0+aGlnaF9zcGVlZCkgeworCQkvKiB0aW1lciAvIHB3bSAqLworCQlzID0gZGV2LT5zdWJkZXZpY2VzICsgU1VCREVWX1BXTTsKKwkJcy0+dHlwZSA9IENPTUVESV9TVUJEX1BXTTsKKwkJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1dSSVRBQkxFIHwgU0RGX1BXTV9IQlJJREdFOworCQlzLT5uX2NoYW4gPSA4OworCQkvKiB0aGlzIGRlZmluZXMgdGhlIG1heCBkdXR5IGN5Y2xlIHJlc29sdXRpb24gKi8KKwkJcy0+bWF4ZGF0YSA9IHVkZXYtPnNpemVQd21CdWY7CisJCXMtPmluc25fd3JpdGUgPSB1c2JkdXhfcHdtX3dyaXRlOworCQlzLT5pbnNuX3JlYWQgPSB1c2JkdXhfcHdtX3JlYWQ7CisJCXMtPmluc25fY29uZmlnID0gdXNiZHV4X3B3bV9jb25maWc7CisJCXVzYmR1eF9wd21fcGVyaW9kKGRldiwgcywgUFdNX0RFRkFVTFRfUEVSSU9EKTsKKwl9CisJLyogZmluYWxseSBkZWNpZGUgdGhhdCBpdCdzIGF0dGFjaGVkICovCisJdWRldi0+YXR0YWNoZWQgPSAxOworCisJdXAoJnVkZXYtPnNlbSk7CisKKwl1cCgmc3RhcnRfc3RvcF9zZW0pOworCisJZGV2X2luZm8oJnVkZXYtPmludGVyZmFjZS0+ZGV2LCAiY29tZWRpJWQ6IGF0dGFjaGVkIHRvIHVzYmR1eC5cbiIsCisJCSBkZXYtPm1pbm9yKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYmR1eF9kZXRhY2goY29tZWRpX2RldmljZSAqZGV2KQoreworCXN0cnVjdCB1c2JkdXhzdWIgKnVzYmR1eHN1Yl90bXA7CisKKwlpZiAoIWRldikgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJjb21lZGk/OiB1c2JkdXg6IGRldGFjaCB3aXRob3V0IGRldiB2YXJpYWJsZS4uLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXVzYmR1eHN1Yl90bXAgPSBkZXYtPnByaXZhdGU7CisJaWYgKCF1c2JkdXhzdWJfdG1wKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImNvbWVkaT86IHVzYmR1eDogZGV0YWNoIHdpdGhvdXQgcHRyIHRvIHVzYmR1eHN1YltdXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJZGV2X2RiZygmdXNiZHV4c3ViX3RtcC0+aW50ZXJmYWNlLT5kZXYsICJjb21lZGklZDogZGV0YWNoIHVzYiBkZXZpY2VcbiIsCisJCWRldi0+bWlub3IpOworCisJZG93bigmdXNiZHV4c3ViX3RtcC0+c2VtKTsKKwkvKiBEb24ndCBhbGxvdyBkZXRhY2ggdG8gZnJlZSB0aGUgcHJpdmF0ZSBzdHJ1Y3R1cmUgKi8KKwkvKiBJdCdzIG9uZSBlbnRyeSBvZiBvZiB1c2JkdXhzdWJbXSAqLworCWRldi0+cHJpdmF0ZSA9IE5VTEw7CisJdXNiZHV4c3ViX3RtcC0+YXR0YWNoZWQgPSAwOworCXVzYmR1eHN1Yl90bXAtPmNvbWVkaWRldiA9IE5VTEw7CisJZGV2X2RiZygmdXNiZHV4c3ViX3RtcC0+aW50ZXJmYWNlLT5kZXYsCisJCSJjb21lZGklZDogZGV0YWNoOiBzdWNjZXNzZnVsbHkgcmVtb3ZlZFxuIiwgZGV2LT5taW5vcik7CisJdXAoJnVzYmR1eHN1Yl90bXAtPnNlbSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIG1haW4gZHJpdmVyIHN0cnVjdCAqLworc3RhdGljIGNvbWVkaV9kcml2ZXIgZHJpdmVyX3VzYmR1eCA9IHsKKyAgICAgIC5kcml2ZXJfbmFtZSA9CSJ1c2JkdXgiLAorICAgICAgLm1vZHVsZSA9CQlUSElTX01PRFVMRSwKKyAgICAgIC5hdHRhY2ggPQkJdXNiZHV4X2F0dGFjaCwKKyAgICAgIC5kZXRhY2ggPQkJdXNiZHV4X2RldGFjaCwKK307CisKK3N0YXRpYyB2b2lkIGluaXRfdXNiX2RldmljZXModm9pZCkKK3sKKwlpbnQgaW5kZXg7CisKKwkvKiBhbGwgZGV2aWNlcyBlbnRyaWVzIGFyZSBpbnZhbGlkIHRvIGJlZ2luIHdpdGggKi8KKwkvKiB0aGV5IHdpbGwgYmVjb21lIHZhbGlkIGJ5IHRoZSBwcm9iZSBmdW5jdGlvbiAqLworCS8qIGFuZCB0aGVuIGZpbmFsbHkgYnkgdGhlIGF0dGFjaC1mdW5jdGlvbiAqLworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTVVTQkRVWDsgaW5kZXgrKykgeworCQltZW1zZXQoJih1c2JkdXhzdWJbaW5kZXhdKSwgMHgwMCwgc2l6ZW9mKHVzYmR1eHN1YltpbmRleF0pKTsKKwkJaW5pdF9NVVRFWCgmKHVzYmR1eHN1YltpbmRleF0uc2VtKSk7CisJfQorfQorCisvKiBUYWJsZSB3aXRoIHRoZSBVU0ItZGV2aWNlczoganVzdCBub3cgb25seSB0ZXN0aW5nIElEcyAqLworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHVzYmR1eHN1Yl90YWJsZVtdID0geworCXtVU0JfREVWSUNFKDB4MTNkOCwgMHgwMDAxKSB9LAorCXtVU0JfREVWSUNFKDB4MTNkOCwgMHgwMDAyKSB9LAorCXt9CQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCB1c2JkdXhzdWJfdGFibGUpOworCisvKiBUaGUgdXNiZHV4c3ViLWRyaXZlciAqLworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHVzYmR1eHN1Yl9kcml2ZXIgPSB7CisgICAgICAubmFtZSA9CQlCT0FSRE5BTUUsCisgICAgICAucHJvYmUgPQkJdXNiZHV4c3ViX3Byb2JlLAorICAgICAgLmRpc2Nvbm5lY3QgPQl1c2JkdXhzdWJfZGlzY29ubmVjdCwKKyAgICAgIC5pZF90YWJsZSA9CXVzYmR1eHN1Yl90YWJsZSwKK307CisKKy8qIENhbid0IHVzZSB0aGUgbmljZSBtYWNybyBhcyBJIGhhdmUgYWxzbyB0byBpbml0aWFsaXNlIHRoZSBVU0IgKi8KKy8qIHN1YnN5c3RlbTogKi8KKy8qIHJlZ2lzdGVyaW5nIHRoZSB1c2Itc3lzdGVtIF9hbmRfIHRoZSBjb21lZGktZHJpdmVyICovCitzdGF0aWMgaW50IGluaXRfdXNiZHV4KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyBLQlVJTERfTU9ETkFNRSAiOiAiCisJICAgICAgIERSSVZFUl9WRVJTSU9OICI6IiBEUklWRVJfREVTQyAiXG4iKTsKKwlpbml0X3VzYl9kZXZpY2VzKCk7CisJdXNiX3JlZ2lzdGVyKCZ1c2JkdXhzdWJfZHJpdmVyKTsKKwljb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfdXNiZHV4KTsKKwlyZXR1cm4gMDsKK30KKworLyogZGVyZWdpc3RlcmluZyB0aGUgY29tZWRpIGRyaXZlciBhbmQgdGhlIHVzYi1zdWJzeXN0ZW0gKi8KK3N0YXRpYyB2b2lkIGV4aXRfdXNiZHV4KHZvaWQpCit7CisJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXJfdXNiZHV4KTsKKwl1c2JfZGVyZWdpc3RlcigmdXNiZHV4c3ViX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGluaXRfdXNiZHV4KTsKK21vZHVsZV9leGl0KGV4aXRfdXNiZHV4KTsKKworTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdXNiZHV4ZmFzdC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VzYmR1eGZhc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTAwZmYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VzYmR1eGZhc3QuYwpAQCAtMCwwICsxLDE3NzggQEAKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYwLjk5YSIKKyNkZWZpbmUgRFJJVkVSX0FVVEhPUiAiQmVybmQgUG9yciwgQmVybmRQb3JyQGYycy5jb20iCisjZGVmaW5lIERSSVZFUl9ERVNDICJVU0ItRFVYZmFzdCwgQmVybmRQb3JyQGYycy5jb20iCisvKgorICAgY29tZWRpL2RyaXZlcnMvdXNiZHV4ZmFzdC5jCisgICBDb3B5cmlnaHQgKEMpIDIwMDQgQmVybmQgUG9yciwgQmVybmQuUG9yckBmMnMuY29tCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisvKgorRHJpdmVyOiB1c2JkdXhmYXN0CitEZXNjcmlwdGlvbjogSVRMIFVTQi1EVVhmYXN0CitEZXZpY2VzOiBbSVRMXSBVU0ItRFVYICh1c2JkdXhmYXN0Lm8pCitBdXRob3I6IEJlcm5kIFBvcnIgPEJlcm5kUG9yckBmMnMuY29tPgorVXBkYXRlZDogMDQgRGVjIDIwMDYKK1N0YXR1czogdGVzdGluZworKi8KKworLyoKKyAqIEkgbXVzdCBnaXZlIGNyZWRpdCBoZXJlIHRvIENocmlzIEJhdWdoZXIgd2hvCisgKiB3cm90ZSB0aGUgZHJpdmVyIGZvciBBVC1NSU8tMTZkLiBJIHVzZWQgc29tZSBwYXJ0cyBvZiB0aGlzCisgKiBkcml2ZXIuIEkgYWxzbyBtdXN0IGdpdmUgY3JlZGl0cyB0byBEYXZpZCBCcm93bmVsbAorICogd2hvIHN1cHBvcnRlZCBtZSB3aXRoIHRoZSBVU0IgZGV2ZWxvcG1lbnQuCisgKgorICogQmVybmQgUG9ycgorICoKKyAqCisgKiBSZXZpc2lvbiBoaXN0b3J5OgorICogMC45OiBEcm9wcGluZyB0aGUgZmlyc3QgZGF0YSBwYWNrZXQgd2hpY2ggc2VlbXMgdG8gYmUgZnJvbSB0aGUgbGFzdCB0cmFuc2Zlci4KKyAqICAgICAgQnVmZmVyIG92ZXJmbG93cyBpbiB0aGUgRlgyIGFyZSBoYW5kZWQgb3ZlciB0byBjb21lZGkuCisgKiAwLjkyOiBEcm9wcGluZyBub3cgNCBwYWNrZXRzLiBUaGUgcXVhZCBidWZmZXIgaGFzIHRvIGJlIGVtcHRpZWQuCisgKiAgICAgICBBZGRlZCBpbnNuIGNvbW1hbmQgYmFzaWNhbGx5IGZvciB0ZXN0aW5nLiBTYW1wbGUgcmF0ZSBpcyAxTUh6LzE2Y2g9NjIuNWtIegorICogMC45OTogSWFuIEFiYm90dCBwb2ludGVkIG91dCBhIGJ1ZyB3aGljaCBoYXMgYmVlbiBjb3JyZWN0ZWQuIFRoYW5rcyEKKyAqIDAuOTlhOiBhZGRlZCBleHRlcm5hbCB0cmlnZ2VyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSAiY29tZWRpX2ZjLmgiCisjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisKKy8vICh1biljb21tZW50IHRoaXMgaWYgeW91IHdhbnQgdG8gaGF2ZSBkZWJ1ZyBpbmZvLgorLy8jZGVmaW5lIENPTkZJR19DT01FRElfREVCVUcKKyN1bmRlZiAgQ09ORklHX0NPTUVESV9ERUJVRworCisjZGVmaW5lIEJPQVJETkFNRSAidXNiZHV4ZmFzdCIKKworLy8gdGltZW91dCBmb3IgdGhlIFVTQi10cmFuc2ZlcgorI2RlZmluZSBFWlRJTUVPVVQgMzAKKworLy8gY29uc3RhbnRzIGZvciAiZmlybXdhcmUiIHVwbG9hZCBhbmQgZG93bmxvYWQKKyNkZWZpbmUgVVNCRFVYRkFTVFNVQl9GSVJNV0FSRSAweEEwCisjZGVmaW5lIFZFTkRPUl9ESVJfSU4gIDB4QzAKKyNkZWZpbmUgVkVORE9SX0RJUl9PVVQgMHg0MAorCisvLyBpbnRlcm5hbCBhZHJlc3NlcyBvZiB0aGUgODA1MSBwcm9jZXNzb3IKKyNkZWZpbmUgVVNCRFVYRkFTVFNVQl9DUFVDUyAweEU2MDAKKworLy8gbWF4IGxlbmdodGggb2YgdGhlIHRyYW5zZmVyLWJ1ZmZlciBmb3Igc29mdHdhcmUgdXBsb2FkCisjZGVmaW5lIFRCX0xFTiAweDIwMDAKKworLy8gSW5wdXQgZW5kcG9pbnQgbnVtYmVyCisjZGVmaW5lIEJVTEtJTkVQICAgICAgICAgICA2CisKKy8vIEVuZHBvaW50IGZvciB0aGUgQS9EIGNoYW5uZWxsaXN0OiBidWxrIE9VVAorI2RlZmluZSBDSEFOTkVMTElTVEVQICAgICA0CisKKy8vIE51bWJlciBvZiBjaGFubmVscworI2RlZmluZSBOVU1DSEFOTkVMUyAgICAgICAzMgorCisvLyBzaXplIG9mIHRoZSB3YXZlZm9ybSBkZXNjcmlwdG9yCisjZGVmaW5lIFdBVkVTSVpFICAgICAgICAgIDB4MjAKKworLy8gU2l6ZSBvZiBvbmUgQS9EIHZhbHVlCisjZGVmaW5lIFNJWkVBRElOICAgICAgICAgICgoc2l6ZW9mKGludDE2X3QpKSkKKworLy8gU2l6ZSBvZiB0aGUgaW5wdXQtYnVmZmVyIElOIEJZVEVTCisjZGVmaW5lIFNJWkVJTkJVRiAgICAgICAgIDUxMgorCisvLyAxNiBieXRlcy4KKyNkZWZpbmUgU0laRUlOU05CVUYgICAgICAgNTEyCisKKy8vIFNpemUgb2YgdGhlIGJ1ZmZlciBmb3IgdGhlIGR1eCBjb21tYW5kcworI2RlZmluZSBTSVpFT0ZEVVhCVUZGRVIgICAgMjU2CS8vIGJ5dGVzCisKKy8vIE51bWJlciBvZiBpbi1VUkJzIHdoaWNoIHJlY2VpdmUgdGhlIGRhdGE6IG1pbj01CisjZGVmaW5lIE5VTU9GSU5CVUZGRVJTSElHSCAgICAgMTAKKworLy8gVG90YWwgbnVtYmVyIG9mIHVzYmR1eGZhc3QgZGV2aWNlcworI2RlZmluZSBOVU1VU0JEVVhGQVNUICAgICAgICAgICAgIDE2CisKKy8vIE51bWJlciBvZiBzdWJkZXZpY2VzCisjZGVmaW5lIE5fU1VCREVWSUNFUyAgICAgICAgICAxCisKKy8vIEFuYWxvZ3VlIGluIHN1YmRldmljZQorI2RlZmluZSBTVUJERVZfQUQgICAgICAgICAgICAgMAorCisvLyBtaW4gZGVsYXkgc3RlcHMgZm9yIG1vcmUgdGhhbiBvbmUgY2hhbm5lbAorLy8gYmFzaWNhbGx5IHdoZW4gdGhlIG11eCBnaXZlcyB1cC4gOy0pCisjZGVmaW5lIE1JTl9TQU1QTElOR19QRVJJT0QgOQkvLyBzdGVwcyBhdCAzME1IeiBpbiB0aGUgRlgyCisKKy8vIE1heCBudW1iZXIgb2YgMS8zME1IeiBkZWxheSBzdGVwczoKKyNkZWZpbmUgTUFYX1NBTVBMSU5HX1BFUklPRCA1MDAKKworLy8gTnVtYmVyIG9mIHJlY2VpdmVkIHBhY2tldHMgdG8gaWdub3JlIGJlZm9yZSB3ZSBzdGFydCBoYW5kaW5nIGRhdGEgb3ZlciB0byBjb21lZGkuCisvLyBJdCdzIHF1YWQgYnVmZmVyaW5nIGFuZCB3ZSBoYXZlIHRvIGlnbm9yZSA0IHBhY2tldHMuCisjZGVmaW5lIFBBQ0tFVFNfVE9fSUdOT1JFIDQKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBjb21lZGkgY29uc3RhbnRzCitzdGF0aWMgY29uc3QgY29tZWRpX2xyYW5nZSByYW5nZV91c2JkdXhmYXN0X2FpX3JhbmdlID0geyAyLCB7CisJCQlCSVBfUkFOR0UoMC43NSksCisJCQlCSVBfUkFOR0UoMC41KSwKKwl9Cit9OworCisvKgorICogcHJpdmF0ZSBzdHJ1Y3R1cmUgb2Ygb25lIHN1YmRldmljZQorICovCisKKy8vIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSB3aGljaCBob2xkcyBhbGwgdGhlIGRhdGEgb2YgdGhpcyBkcml2ZXIKKy8vIG9uZSBzdWIgZGV2aWNlIGp1c3Qgbm93OiBBL0QKK3R5cGVkZWYgc3RydWN0IHsKKwkvLyBhdHRhY2hlZD8KKwlpbnQgYXR0YWNoZWQ7CisJLy8gaXMgaXQgYXNzb2NpYXRlZCB3aXRoIGEgc3ViZGV2aWNlPworCWludCBwcm9iZWQ7CisJLy8gcG9pbnRlciB0byB0aGUgdXNiLWRldmljZQorCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXY7CisJLy8gQlVMSy10cmFuc2ZlciBoYW5kbGluZzogdXJiCisJc3RydWN0IHVyYiAqdXJiSW47CisJaW50OF90ICp0cmFuc2Zlcl9idWZmZXI7CisJLy8gaW5wdXQgYnVmZmVyIGZvciBzaW5nbGUgaW5zbgorCWludDE2X3QgKmluc25CdWZmZXI7CisJLy8gaW50ZXJmYWNlIG51bWJlcgorCWludCBpZm51bTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCisJLy8gaW50ZXJmYWNlIHN0cnVjdHVyZSBpbiAyLjYKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlOworI2VuZGlmCisJLy8gY29tZWRpIGRldmljZSBmb3IgdGhlIGludGVycnVwdCBjb250ZXh0CisJY29tZWRpX2RldmljZSAqY29tZWRpZGV2OworCS8vIGFzeW5jaHJvbm91cyBjb21tYW5kIGlzIHJ1bm5pbmcKKwlzaG9ydCBpbnQgYWlfY21kX3J1bm5pbmc7CisJLy8gY29udGlub3VzIGFxdWlzaXRpb24KKwlzaG9ydCBpbnQgYWlfY29udGlub3VzOworCS8vIG51bWJlciBvZiBzYW1wbGVzIHRvIGFxdWlyZQorCWxvbmcgaW50IGFpX3NhbXBsZV9jb3VudDsKKwkvLyBjb21tYW5kcworCXVpbnQ4X3QgKmR1eF9jb21tYW5kczsKKwkvLyBjb3VudGVyIHdoaWNoIGlnbm9yZXMgdGhlIGZpcnN0IGJ1ZmZlcnMKKwlpbnQgaWdub3JlOworCXN0cnVjdCBzZW1hcGhvcmUgc2VtOworfSB1c2JkdXhmYXN0c3ViX3Q7CisKKy8vIFRoZSBwb2ludGVyIHRvIHRoZSBwcml2YXRlIHVzYi1kYXRhIG9mIHRoZSBkcml2ZXIKKy8vIGlzIGFsc28gdGhlIHByaXZhdGUgZGF0YSBmb3IgdGhlIGNvbWVkaS1kZXZpY2UuCisvLyBUaGlzIGhhcyB0byBiZSBnbG9iYWwgYXMgdGhlIHVzYiBzdWJzeXN0ZW0gbmVlZHMKKy8vIGdsb2JhbCB2YXJpYWJsZXMuIFRoZSBvdGhlciByZWFzb24gaXMgdGhhdCB0aGlzCisvLyBzdHJ1Y3R1cmUgbXVzdCBiZSB0aGVyZSBfYmVmb3JlXyBhbnkgY29tZWRpCisvLyBjb21tYW5kIGlzIGlzc3VlZC4gVGhlIHVzYiBzdWJzeXN0ZW0gbXVzdCBiZQorLy8gaW5pdGlhbGlzZWQgYmVmb3JlIGNvbWVkaSBjYW4gYWNjZXNzIGl0Lgorc3RhdGljIHVzYmR1eGZhc3RzdWJfdCB1c2JkdXhmYXN0c3ViW05VTVVTQkRVWEZBU1RdOworCitzdGF0aWMgREVDTEFSRV9NVVRFWChzdGFydF9zdG9wX3NlbSk7CisKKy8vIGJ1bGsgdHJhbnNmZXJzIHRvIHVzYmR1eGZhc3QKKworI2RlZmluZSBTRU5EQURDT01NQU5EUyAgICAgICAgICAgIDAKKyNkZWZpbmUgU0VORElOSVRFUDYgICAgICAgICAgICAgICAxCisKK3N0YXRpYyBpbnQgc2VuZF9kdXhfY29tbWFuZHModXNiZHV4ZmFzdHN1Yl90ICogdGhpc191c2JkdXhmYXN0c3ViLCBpbnQgY21kX3R5cGUpCit7CisJaW50IHJlc3VsdCwgbnNlbnQ7CisJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbMF0gPSBjbWRfdHlwZTsKKyNpZmRlZiBDT05GSUdfQ09NRURJX0RFQlVHCisJaW50IGk7CisJcHJpbnRrKCJjb21lZGklZDogdXNiZHV4ZmFzdDogZHV4X2NvbW1hbmRzOiAiLAorCQl0aGlzX3VzYmR1eGZhc3RzdWItPmNvbWVkaWRldi0+bWlub3IpOworCWZvciAoaSA9IDA7IGkgPCBTSVpFT0ZEVVhCVUZGRVI7IGkrKykgeworCQlwcmludGsoIiAlMDJ4IiwgdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbaV0pOworCX0KKwlwcmludGsoIlxuIik7CisjZW5kaWYKKwlyZXN1bHQgPSB1c2JfYnVsa19tc2codGhpc191c2JkdXhmYXN0c3ViLT51c2JkZXYsCisJCQkgICAgICB1c2Jfc25kYnVsa3BpcGUodGhpc191c2JkdXhmYXN0c3ViLT51c2JkZXYsCisJCQkJCSAgICAgIENIQU5ORUxMSVNURVApLAorCQkJICAgICAgdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHMsIFNJWkVPRkRVWEJVRkZFUiwKKwkJCSAgICAgICZuc2VudCwgMTAwMDApOworCWlmIChyZXN1bHQgPCAwKSB7CisJCXByaW50aygiY29tZWRpJWQ6IGNvdWxkIG5vdCB0cmFuc21pdCBkdXhfY29tbWFuZHMgdG8gdGhlIHVzYi1kZXZpY2UsIGVycj0lZFxuIiwgdGhpc191c2JkdXhmYXN0c3ViLT5jb21lZGlkZXYtPm1pbm9yLCByZXN1bHQpOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCisvLyBTdG9wcyB0aGUgZGF0YSBhY3F1aXNpb24KKy8vIEl0IHNob3VsZCBiZSBzYWZlIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBmcm9tIGFueSBjb250ZXh0CitzdGF0aWMgaW50IHVzYmR1eGZhc3RzdWJfdW5saW5rX0luVVJCcyh1c2JkdXhmYXN0c3ViX3QgKiB1c2JkdXhmYXN0c3ViX3RtcCkKK3sKKwlpbnQgaiA9IDA7CisJaW50IGVyciA9IDA7CisKKwlpZiAodXNiZHV4ZmFzdHN1Yl90bXAgJiYgdXNiZHV4ZmFzdHN1Yl90bXAtPnVyYkluKSB7CisJCXVzYmR1eGZhc3RzdWJfdG1wLT5haV9jbWRfcnVubmluZyA9IDA7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDgpCisJCWogPSB1c2JfdW5saW5rX3VyYih1c2JkdXhmYXN0c3ViX3RtcC0+dXJiSW4pOworCQlpZiAoaiA8IDApIHsKKwkJCWVyciA9IGo7CisJCX0KKyNlbHNlCisJCS8vIHdhaXRzIHVudGlsIGEgcnVubmluZyB0cmFuc2ZlciBpcyBvdmVyCisJCXVzYl9raWxsX3VyYih1c2JkdXhmYXN0c3ViX3RtcC0+dXJiSW4pOworCQlqID0gMDsKKyNlbmRpZgorCX0KKyNpZmRlZiBDT05GSUdfQ09NRURJX0RFQlVHCisJcHJpbnRrKCJjb21lZGk6IHVzYmR1eGZhc3Q6IHVubGlua2VkIEluVVJCOiByZXM9JWRcbiIsIGopOworI2VuZGlmCisJcmV0dXJuIGVycjsKK30KKworLyogVGhpcyB3aWxsIHN0b3AgYSBydW5uaW5nIGFjcXVpc2l0aW9uIG9wZXJhdGlvbiAqLworLy8gSXMgY2FsbGVkIGZyb20gd2l0aGluIHRoaXMgZHJpdmVyIGZyb20gYm90aCB0aGUKKy8vIGludGVycnVwdCBjb250ZXh0IGFuZCBmcm9tIGNvbWVkaQorc3RhdGljIGludCB1c2JkdXhmYXN0X2FpX3N0b3AodXNiZHV4ZmFzdHN1Yl90ICogdGhpc191c2JkdXhmYXN0c3ViLAorCWludCBkb191bmxpbmspCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIXRoaXNfdXNiZHV4ZmFzdHN1YikgeworCQlwcmludGsoImNvbWVkaT86IHVzYmR1eGZhc3RfYWlfc3RvcDogdGhpc191c2JkdXhmYXN0c3ViPU5VTEwhXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorI2lmZGVmIENPTkZJR19DT01FRElfREVCVUcKKwlwcmludGsoImNvbWVkaTogdXNiZHV4ZmFzdF9haV9zdG9wXG4iKTsKKyNlbmRpZgorCisJdGhpc191c2JkdXhmYXN0c3ViLT5haV9jbWRfcnVubmluZyA9IDA7CisKKwlpZiAoZG9fdW5saW5rKSB7CisJCS8vIHN0b3AgYXF1aXN0aW9uCisJCXJldCA9IHVzYmR1eGZhc3RzdWJfdW5saW5rX0luVVJCcyh0aGlzX3VzYmR1eGZhc3RzdWIpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8vIFRoaXMgd2lsbCBjYW5jZWwgYSBydW5uaW5nIGFjcXVpc2l0aW9uIG9wZXJhdGlvbi4KKy8vIFRoaXMgaXMgY2FsbGVkIGJ5IGNvbWVkaSBidXQgbmV2ZXIgZnJvbSBpbnNpZGUgdGhlCisvLyBkcml2ZXIuCitzdGF0aWMgaW50IHVzYmR1eGZhc3RfYWlfY2FuY2VsKGNvbWVkaV9kZXZpY2UgKiBkZXYsIGNvbWVkaV9zdWJkZXZpY2UgKiBzKQoreworCXVzYmR1eGZhc3RzdWJfdCAqdGhpc191c2JkdXhmYXN0c3ViOworCWludCByZXMgPSAwOworCisJLy8gZm9yY2UgdW5saW5rIG9mIGFsbCB1cmJzCisjaWZkZWYgQ09ORklHX0NPTUVESV9ERUJVRworCXByaW50aygiY29tZWRpOiB1c2JkdXhmYXN0X2FpX2NhbmNlbFxuIik7CisjZW5kaWYKKwl0aGlzX3VzYmR1eGZhc3RzdWIgPSBkZXYtPnByaXZhdGU7CisJaWYgKCF0aGlzX3VzYmR1eGZhc3RzdWIpIHsKKwkJcHJpbnRrKCJjb21lZGk6IHVzYmR1eGZhc3RfYWlfY2FuY2VsOiB0aGlzX3VzYmR1eGZhc3RzdWI9TlVMTFxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlkb3duKCZ0aGlzX3VzYmR1eGZhc3RzdWItPnNlbSk7CisJaWYgKCEodGhpc191c2JkdXhmYXN0c3ViLT5wcm9iZWQpKSB7CisJCXVwKCZ0aGlzX3VzYmR1eGZhc3RzdWItPnNlbSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwkvLyB1bmxpbmsKKwlyZXMgPSB1c2JkdXhmYXN0X2FpX3N0b3AodGhpc191c2JkdXhmYXN0c3ViLCAxKTsKKwl1cCgmdGhpc191c2JkdXhmYXN0c3ViLT5zZW0pOworCisJcmV0dXJuIHJlczsKK30KKworLy8gYW5hbG9ndWUgSU4KKy8vIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMCkKK3N0YXRpYyB2b2lkIHVzYmR1eGZhc3RzdWJfYWlfSXJxKHN0cnVjdCB1cmIgKnVyYikKKyNlbHNlCitzdGF0aWMgdm9pZCB1c2JkdXhmYXN0c3ViX2FpX0lycShzdHJ1Y3QgdXJiICp1cmIgUFRfUkVHU19BUkcpCisjZW5kaWYKK3sKKwlpbnQgbiwgZXJyOworCXVzYmR1eGZhc3RzdWJfdCAqdGhpc191c2JkdXhmYXN0c3ViOworCWNvbWVkaV9kZXZpY2UgKnRoaXNfY29tZWRpZGV2OworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisJdWludDE2X3QgKnA7CisKKwkvLyBzYW5pdHkgY2hlY2tzCisJLy8gaXMgdGhlIHVyYiB0aGVyZT8KKwlpZiAoIXVyYikgeworCQlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3RfOiBhbyBpbnQtaGFuZGxlciBjYWxsZWQgd2l0aCB1cmI9TlVMTCFcbiIpOworCQlyZXR1cm47CisJfQorCS8vIHRoZSBjb250ZXh0IHZhcmlhYmxlIHBvaW50cyB0byB0aGUgc3ViZGV2aWNlCisJdGhpc19jb21lZGlkZXYgPSB1cmItPmNvbnRleHQ7CisJaWYgKCF0aGlzX2NvbWVkaWRldikgeworCQlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3RfOiB1cmIgY29udGV4dCBpcyBhIE5VTEwgcG9pbnRlciFcbiIpOworCQlyZXR1cm47CisJfQorCS8vIHRoZSBwcml2YXRlIHN0cnVjdHVyZSBvZiB0aGUgc3ViZGV2aWNlIGlzIHVzYmR1eGZhc3RzdWJfdAorCXRoaXNfdXNiZHV4ZmFzdHN1YiA9IHRoaXNfY29tZWRpZGV2LT5wcml2YXRlOworCWlmICghdGhpc191c2JkdXhmYXN0c3ViKSB7CisJCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdF86IHByaXZhdGUgb2YgY29tZWRpIHN1YmRldiBpcyBhIE5VTEwgcG9pbnRlciFcbiIpOworCQlyZXR1cm47CisJfQorCS8vIGFyZSB3ZSBydW5uaW5nIGEgY29tbWFuZD8KKwlpZiAodW5saWtlbHkoISh0aGlzX3VzYmR1eGZhc3RzdWItPmFpX2NtZF9ydW5uaW5nKSkpIHsKKwkJLy8gbm90IHJ1bm5pbmcgYSBjb21tYW5kCisJCS8vIGRvIG5vdCBjb250aW51ZSBleGVjdXRpb24gaWYgbm8gYXN5bmNocm9ub3VzIGNvbW1hbmQgaXMgcnVubmluZworCQkvLyBpbiBwYXJ0aWN1bGFyIG5vdCByZXN1Ym1pdAorCQlyZXR1cm47CisJfQorCisJaWYgKHVubGlrZWx5KCEodGhpc191c2JkdXhmYXN0c3ViLT5hdHRhY2hlZCkpKSB7CisJCS8vIG5vIGNvbWVkaSBkZXZpY2UgdGhlcmUKKwkJcmV0dXJuOworCX0KKwkvLyBzdWJkZXZpY2Ugd2hpY2ggaXMgdGhlIEFEIGNvbnZlcnRlcgorCXMgPSB0aGlzX2NvbWVkaWRldi0+c3ViZGV2aWNlcyArIFNVQkRFVl9BRDsKKworCS8vIGZpcnN0IHdlIHRlc3QgaWYgc29tZXRoaW5nIHVudXN1YWwgaGFzIGp1c3QgaGFwcGVuZWQKKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJY2FzZSAwOgorCQlicmVhazsKKworCQkvLyBoYXBwZW5zIGFmdGVyIGFuIHVubGluayBjb21tYW5kIG9yIHdoZW4gdGhlIGRldmljZSBpcyBwbHVnZ2VkIG91dAorCWNhc2UgLUVDT05OUkVTRVQ6CisJY2FzZSAtRU5PRU5UOgorCWNhc2UgLUVTSFVURE9XTjoKKwljYXNlIC1FQ09OTkFCT1JURUQ6CisJCS8vIHRlbGwgdGhpcyBjb21lZGkKKwkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOworCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUjsKKwkJY29tZWRpX2V2ZW50KHRoaXNfdXNiZHV4ZmFzdHN1Yi0+Y29tZWRpZGV2LCBzKTsKKwkJLy8gc3RvcCB0aGUgdHJhbnNmZXIgdy9vIHVubGluaworCQl1c2JkdXhmYXN0X2FpX3N0b3AodGhpc191c2JkdXhmYXN0c3ViLCAwKTsKKwkJcmV0dXJuOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKCJjb21lZGklZDogdXNiZHV4ZmFzdDogbm9uLXplcm8gdXJiIHN0YXR1cyByZWNlaXZlZCBpbiBhaSBpbnRyIGNvbnRleHQ6ICVkXG4iLCB0aGlzX3VzYmR1eGZhc3RzdWItPmNvbWVkaWRldi0+bWlub3IsIHVyYi0+c3RhdHVzKTsKKwkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOworCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUjsKKwkJY29tZWRpX2V2ZW50KHRoaXNfdXNiZHV4ZmFzdHN1Yi0+Y29tZWRpZGV2LCBzKTsKKwkJdXNiZHV4ZmFzdF9haV9zdG9wKHRoaXNfdXNiZHV4ZmFzdHN1YiwgMCk7CisJCXJldHVybjsKKwl9CisKKwlwID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CisJaWYgKCF0aGlzX3VzYmR1eGZhc3RzdWItPmlnbm9yZSkgeworCQlpZiAoISh0aGlzX3VzYmR1eGZhc3RzdWItPmFpX2NvbnRpbm91cykpIHsKKwkJCS8vIG5vdCBjb250aW5vdXMsIGZpeGVkIG51bWJlciBvZiBzYW1wbGVzCisJCQluID0gdXJiLT5hY3R1YWxfbGVuZ3RoIC8gc2l6ZW9mKHVpbnQxNl90KTsKKwkJCWlmICh1bmxpa2VseSh0aGlzX3VzYmR1eGZhc3RzdWItPmFpX3NhbXBsZV9jb3VudCA8IG4pKSB7CisJCQkJLy8gd2UgaGF2ZSBzZW5kIG9ubHkgYSBmcmFjdGlvbiBvZiB0aGUgYnl0ZXMgcmVjZWl2ZWQKKwkJCQljZmNfd3JpdGVfYXJyYXlfdG9fYnVmZmVyKHMsCisJCQkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyLAorCQkJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmFpX3NhbXBsZV9jb3VudCAqCisJCQkJCXNpemVvZih1aW50MTZfdCkpOworCQkJCXVzYmR1eGZhc3RfYWlfc3RvcCh0aGlzX3VzYmR1eGZhc3RzdWIsIDApOworCQkJCS8vIHNheSBjb21lZGkgdGhhdCB0aGUgYWNxdWlzdGlvbiBpcyBvdmVyCisJCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOworCQkJCWNvbWVkaV9ldmVudCh0aGlzX3VzYmR1eGZhc3RzdWItPmNvbWVkaWRldiwgcyk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJdGhpc191c2JkdXhmYXN0c3ViLT5haV9zYW1wbGVfY291bnQgLT0gbjsKKwkJfQorCQkvLyB3cml0ZSB0aGUgZnVsbCBidWZmZXIgdG8gY29tZWRpCisJCWNmY193cml0ZV9hcnJheV90b19idWZmZXIocywKKwkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCisJCS8vIHRlbGwgY29tZWRpIHRoYXQgZGF0YSBpcyB0aGVyZQorCQljb21lZGlfZXZlbnQodGhpc191c2JkdXhmYXN0c3ViLT5jb21lZGlkZXYsIHMpOworCisJfSBlbHNlIHsKKwkJLy8gaWdub3JlIHRoaXMgcGFja2V0CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+aWdub3JlLS07CisJfQorCisJLy8gY29tbWFuZCBpcyBzdGlsbCBydW5uaW5nCisJLy8gcmVzdWJtaXQgdXJiIGZvciBCVUxLIHRyYW5zZmVyCisJdXJiLT5kZXYgPSB0aGlzX3VzYmR1eGZhc3RzdWItPnVzYmRldjsKKwl1cmItPnN0YXR1cyA9IDA7CisJZXJyID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAoZXJyIDwgMCkgeworCQlwcmludGsoImNvbWVkaSVkOiB1c2JkdXhmYXN0OiB1cmIgcmVzdWJtIGZhaWxlZDogJWQiLAorCQkJdGhpc191c2JkdXhmYXN0c3ViLT5jb21lZGlkZXYtPm1pbm9yLCBlcnIpOworCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CisJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VSUk9SOworCQljb21lZGlfZXZlbnQodGhpc191c2JkdXhmYXN0c3ViLT5jb21lZGlkZXYsIHMpOworCQl1c2JkdXhmYXN0X2FpX3N0b3AodGhpc191c2JkdXhmYXN0c3ViLCAwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4ZmFzdHN1Yl9zdGFydCh1c2JkdXhmYXN0c3ViX3QgKiB1c2JkdXhmYXN0c3ViKQoreworCWludCBlcnJjb2RlID0gMDsKKwl1bnNpZ25lZCBjaGFyIGxvY2FsX3RyYW5zZmVyX2J1ZmZlclsxNl07CisKKwlpZiAodXNiZHV4ZmFzdHN1Yi0+cHJvYmVkKSB7CisJCS8vIDdmOTIgdG8gemVybworCQlsb2NhbF90cmFuc2Zlcl9idWZmZXJbMF0gPSAwOworCQllcnJjb2RlID0gdXNiX2NvbnRyb2xfbXNnKHVzYmR1eGZhc3RzdWItPnVzYmRldiwKKwkJCS8vIGNyZWF0ZSBhIHBpcGUgZm9yIGEgY29udHJvbCB0cmFuc2ZlcgorCQkJdXNiX3NuZGN0cmxwaXBlKHVzYmR1eGZhc3RzdWItPnVzYmRldiwgMCksCisJCQkvLyBiUmVxdWVzdCwgIkZpcm13YXJlIgorCQkJVVNCRFVYRkFTVFNVQl9GSVJNV0FSRSwKKwkJCS8vIGJtUmVxdWVzdFR5cGUKKwkJCVZFTkRPUl9ESVJfT1VULAorCQkJLy8gVmFsdWUKKwkJCVVTQkRVWEZBU1RTVUJfQ1BVQ1MsCisJCQkvLyBJbmRleAorCQkJMHgwMDAwLAorCQkJLy8gYWRkcmVzcyBvZiB0aGUgdHJhbnNmZXIgYnVmZmVyCisJCQlsb2NhbF90cmFuc2Zlcl9idWZmZXIsCisJCQkvLyBMZW5ndGgKKwkJCTEsCisJCQkvLyBUaW1lb3V0CisJCQlFWlRJTUVPVVQpOworCQlpZiAoZXJyY29kZSA8IDApIHsKKwkJCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdF86IGNvbnRyb2wgbXNnIGZhaWxlZCAoc3RhcnQpXG4iKTsKKwkJCXJldHVybiBlcnJjb2RlOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYmR1eGZhc3RzdWJfc3RvcCh1c2JkdXhmYXN0c3ViX3QgKiB1c2JkdXhmYXN0c3ViKQoreworCWludCBlcnJjb2RlID0gMDsKKworCXVuc2lnbmVkIGNoYXIgbG9jYWxfdHJhbnNmZXJfYnVmZmVyWzE2XTsKKwlpZiAodXNiZHV4ZmFzdHN1Yi0+cHJvYmVkKSB7CisJCS8vIDdmOTIgdG8gb25lCisJCWxvY2FsX3RyYW5zZmVyX2J1ZmZlclswXSA9IDE7CisJCWVycmNvZGUgPSB1c2JfY29udHJvbF9tc2codXNiZHV4ZmFzdHN1Yi0+dXNiZGV2LAorCQkJdXNiX3NuZGN0cmxwaXBlKHVzYmR1eGZhc3RzdWItPnVzYmRldiwgMCksCisJCQkvLyBiUmVxdWVzdCwgIkZpcm13YXJlIgorCQkJVVNCRFVYRkFTVFNVQl9GSVJNV0FSRSwKKwkJCS8vIGJtUmVxdWVzdFR5cGUKKwkJCVZFTkRPUl9ESVJfT1VULAorCQkJLy8gVmFsdWUKKwkJCVVTQkRVWEZBU1RTVUJfQ1BVQ1MsCisJCQkvLyBJbmRleAorCQkJMHgwMDAwLCBsb2NhbF90cmFuc2Zlcl9idWZmZXIsCisJCQkvLyBMZW5ndGgKKwkJCTEsCisJCQkvLyBUaW1lb3V0CisJCQlFWlRJTUVPVVQpOworCQlpZiAoZXJyY29kZSA8IDApIHsKKwkJCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdDogY29udHJvbCBtc2cgZmFpbGVkIChzdG9wKVxuIik7CisJCQlyZXR1cm4gZXJyY29kZTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JkdXhmYXN0c3ViX3VwbG9hZCh1c2JkdXhmYXN0c3ViX3QgKiB1c2JkdXhmYXN0c3ViLAorCXVuc2lnbmVkIGNoYXIgKmxvY2FsX3RyYW5zZmVyX2J1ZmZlciwKKwl1bnNpZ25lZCBpbnQgc3RhcnRBZGRyLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCWludCBlcnJjb2RlOworCisJaWYgKHVzYmR1eGZhc3RzdWItPnByb2JlZCkgeworI2lmZGVmIENPTkZJR19DT01FRElfREVCVUcKKwkJcHJpbnRrKCJjb21lZGklZDogdXNiZHV4ZmFzdDogdXBsb2FkaW5nICVkIGJ5dGVzIiwKKwkJCXVzYmR1eGZhc3RzdWItPmNvbWVkaWRldi0+bWlub3IsIGxlbik7CisJCXByaW50aygiIHRvIGFkZHIgJWQsIGZpcnN0IGJ5dGU9JWQuXG4iLAorCQkJc3RhcnRBZGRyLCBsb2NhbF90cmFuc2Zlcl9idWZmZXJbMF0pOworI2VuZGlmCisJCWVycmNvZGUgPSB1c2JfY29udHJvbF9tc2codXNiZHV4ZmFzdHN1Yi0+dXNiZGV2LAorCQkJdXNiX3NuZGN0cmxwaXBlKHVzYmR1eGZhc3RzdWItPnVzYmRldiwgMCksCisJCQkvLyBicmVxdWVzdCwgZmlybXdhcmUKKwkJCVVTQkRVWEZBU1RTVUJfRklSTVdBUkUsCisJCQkvLyBibVJlcXVlc3RUeXBlCisJCQlWRU5ET1JfRElSX09VVCwKKwkJCS8vIHZhbHVlCisJCQlzdGFydEFkZHIsCisJCQkvLyBpbmRleAorCQkJMHgwMDAwLAorCQkJLy8gb3VyIGxvY2FsIHNhZmUgYnVmZmVyCisJCQlsb2NhbF90cmFuc2Zlcl9idWZmZXIsCisJCQkvLyBsZW5ndGgKKwkJCWxlbiwKKwkJCS8vIHRpbWVvdXQKKwkJCUVaVElNRU9VVCk7CisjaWZkZWYgQ09ORklHX0NPTUVESV9ERUJVRworCQlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3Q6IHJlc3VsdD0lZFxuIiwgZXJyY29kZSk7CisjZW5kaWYKKwkJaWYgKGVycmNvZGUgPCAwKSB7CisJCQlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3Q6IHVwcGxvYWQgZmFpbGVkXG4iKTsKKwkJCXJldHVybiBlcnJjb2RlOworCQl9CisJfSBlbHNlIHsKKwkJLy8gbm8gZGV2aWNlIG9uIHRoZSBidXMgZm9yIHRoaXMgaW5kZXgKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCXJldHVybiAwOworfQorCitpbnQgZmlybXdhcmVVcGxvYWQodXNiZHV4ZmFzdHN1Yl90ICogdXNiZHV4ZmFzdHN1YiwKKwl1bnNpZ25lZCBjaGFyICpmaXJtd2FyZUJpbmFyeSwgaW50IHNpemVGaXJtd2FyZSkKK3sKKwlpbnQgcmV0OworCisJaWYgKCFmaXJtd2FyZUJpbmFyeSkgeworCQlyZXR1cm4gMDsKKwl9CisJcmV0ID0gdXNiZHV4ZmFzdHN1Yl9zdG9wKHVzYmR1eGZhc3RzdWIpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdDogY2FuIG5vdCBzdG9wIGZpcm13YXJlXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0ID0gdXNiZHV4ZmFzdHN1Yl91cGxvYWQodXNiZHV4ZmFzdHN1YiwKKwkJZmlybXdhcmVCaW5hcnksIDAsIHNpemVGaXJtd2FyZSk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0OiBmaXJtd2FyZSB1cGxvYWQgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0ID0gdXNiZHV4ZmFzdHN1Yl9zdGFydCh1c2JkdXhmYXN0c3ViKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3Q6IGNhbiBub3Qgc3RhcnQgZmlybXdhcmVcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHVzYmR1eGZhc3RzdWJfc3VibWl0X0luVVJCcyh1c2JkdXhmYXN0c3ViX3QgKiB1c2JkdXhmYXN0c3ViKQoreworCWludCBlcnJGbGFnOworCisJaWYgKCF1c2JkdXhmYXN0c3ViKSB7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwl1c2JfZmlsbF9idWxrX3VyYih1c2JkdXhmYXN0c3ViLT51cmJJbiwKKwkJdXNiZHV4ZmFzdHN1Yi0+dXNiZGV2LAorCQl1c2JfcmN2YnVsa3BpcGUodXNiZHV4ZmFzdHN1Yi0+dXNiZGV2LCBCVUxLSU5FUCksCisJCXVzYmR1eGZhc3RzdWItPnRyYW5zZmVyX2J1ZmZlciwKKwkJU0laRUlOQlVGLCB1c2JkdXhmYXN0c3ViX2FpX0lycSwgdXNiZHV4ZmFzdHN1Yi0+Y29tZWRpZGV2KTsKKworI2lmZGVmIENPTkZJR19DT01FRElfREVCVUcKKwlwcmludGsoImNvbWVkaSVkOiB1c2JkdXhmYXN0OiBzdWJtaXR0aW5nIGluLXVyYjogJXgsJXhcbiIsCisJCXVzYmR1eGZhc3RzdWItPmNvbWVkaWRldi0+bWlub3IsCisJCShpbnQpKHVzYmR1eGZhc3RzdWItPnVyYkluLT5jb250ZXh0KSwKKwkJKGludCkodXNiZHV4ZmFzdHN1Yi0+dXJiSW4tPmRldikpOworI2VuZGlmCisJZXJyRmxhZyA9IHVzYl9zdWJtaXRfdXJiKHVzYmR1eGZhc3RzdWItPnVyYkluLCBHRlBfQVRPTUlDKTsKKwlpZiAoZXJyRmxhZykgeworCQlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3Q6IGFpOiB1c2Jfc3VibWl0X3VyYiBlcnJvciAlZFxuIiwKKwkJCWVyckZsYWcpOworCQlyZXR1cm4gZXJyRmxhZzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4ZmFzdF9haV9jbWR0ZXN0KGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIGNvbWVkaV9jbWQgKiBjbWQpCit7CisJaW50IGVyciA9IDAsIHN0b3BfbWFzayA9IDA7CisJbG9uZyBpbnQgc3RlcHMsIHRtcCA9IDA7CisJaW50IG1pblNhbXBsUGVyOworCXVzYmR1eGZhc3RzdWJfdCAqdGhpc191c2JkdXhmYXN0c3ViID0gZGV2LT5wcml2YXRlOworCWlmICghKHRoaXNfdXNiZHV4ZmFzdHN1Yi0+cHJvYmVkKSkgeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisjaWZkZWYgQ09ORklHX0NPTUVESV9ERUJVRworCXByaW50aygiY29tZWRpJWQ6IHVzYmR1eGZhc3RfYWlfY21kdGVzdFxuIiwgZGV2LT5taW5vcik7CisJcHJpbnRrKCJjb21lZGklZDogdXNiZHV4ZmFzdDogY29udmVydF9hcmc9JXUgc2Nhbl9iZWdpbl9hcmc9JXVcbiIsCisJCWRldi0+bWlub3IsIGNtZC0+Y29udmVydF9hcmcsIGNtZC0+c2Nhbl9iZWdpbl9hcmcpOworI2VuZGlmCisJLyogc3RlcCAxOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KKworCXRtcCA9IGNtZC0+c3RhcnRfc3JjOworCWNtZC0+c3RhcnRfc3JjICY9IFRSSUdfTk9XIHwgVFJJR19FWFQgfCBUUklHX0lOVDsKKwlpZiAoIWNtZC0+c3RhcnRfc3JjIHx8IHRtcCAhPSBjbWQtPnN0YXJ0X3NyYykKKwkJZXJyKys7CisKKwl0bXAgPSBjbWQtPnNjYW5fYmVnaW5fc3JjOworCWNtZC0+c2Nhbl9iZWdpbl9zcmMgJj0gVFJJR19USU1FUiB8IFRSSUdfRk9MTE9XIHwgVFJJR19FWFQ7CisJaWYgKCFjbWQtPnNjYW5fYmVnaW5fc3JjIHx8IHRtcCAhPSBjbWQtPnNjYW5fYmVnaW5fc3JjKQorCQllcnIrKzsKKworCXRtcCA9IGNtZC0+Y29udmVydF9zcmM7CisJY21kLT5jb252ZXJ0X3NyYyAmPSBUUklHX1RJTUVSIHwgVFJJR19FWFQ7CisJaWYgKCFjbWQtPmNvbnZlcnRfc3JjIHx8IHRtcCAhPSBjbWQtPmNvbnZlcnRfc3JjKQorCQllcnIrKzsKKworCXRtcCA9IGNtZC0+c2Nhbl9lbmRfc3JjOworCWNtZC0+c2Nhbl9lbmRfc3JjICY9IFRSSUdfQ09VTlQ7CisJaWYgKCFjbWQtPnNjYW5fZW5kX3NyYyB8fCB0bXAgIT0gY21kLT5zY2FuX2VuZF9zcmMpCisJCWVycisrOworCisJdG1wID0gY21kLT5zdG9wX3NyYzsKKwlzdG9wX21hc2sgPSBUUklHX0NPVU5UIHwgVFJJR19OT05FOworCWNtZC0+c3RvcF9zcmMgJj0gc3RvcF9tYXNrOworCWlmICghY21kLT5zdG9wX3NyYyB8fCB0bXAgIT0gY21kLT5zdG9wX3NyYykKKwkJZXJyKys7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gMTsKKworCS8qIHN0ZXAgMjogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlIGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCisKKwlpZiAoY21kLT5zdGFydF9zcmMgIT0gVFJJR19OT1cgJiYKKwkJY21kLT5zdGFydF9zcmMgIT0gVFJJR19FWFQgJiYgY21kLT5zdGFydF9zcmMgIT0gVFJJR19JTlQpCisJCWVycisrOworCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfVElNRVIgJiYKKwkJY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX0ZPTExPVyAmJgorCQljbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfRVhUKQorCQllcnIrKzsKKwlpZiAoY21kLT5jb252ZXJ0X3NyYyAhPSBUUklHX1RJTUVSICYmIGNtZC0+Y29udmVydF9zcmMgIT0gVFJJR19FWFQpCisJCWVycisrOworCWlmIChjbWQtPnN0b3Bfc3JjICE9IFRSSUdfQ09VTlQgJiYKKwkJY21kLT5zdG9wX3NyYyAhPSBUUklHX0VYVCAmJiBjbWQtPnN0b3Bfc3JjICE9IFRSSUdfTk9ORSkKKwkJZXJyKys7CisKKwkvLyBjYW4ndCBoYXZlIGV4dGVybmFsIHN0b3AgYW5kIHN0YXJ0IHRyaWdnZXJzIGF0IG9uY2UKKwlpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19FWFQgJiYgY21kLT5zdG9wX3NyYyA9PSBUUklHX0VYVCkKKwkJZXJyKys7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gMjsKKworCS8qIHN0ZXAgMzogbWFrZSBzdXJlIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IGNvbXBhdGlibGUgKi8KKworCWlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX05PVyAmJiBjbWQtPnN0YXJ0X2FyZyAhPSAwKSB7CisJCWNtZC0+c3RhcnRfYXJnID0gMDsKKwkJZXJyKys7CisJfQorCisJaWYgKCFjbWQtPmNoYW5saXN0X2xlbikgeworCQllcnIrKzsKKwl9CisJaWYgKGNtZC0+c2Nhbl9lbmRfYXJnICE9IGNtZC0+Y2hhbmxpc3RfbGVuKSB7CisJCWNtZC0+c2Nhbl9lbmRfYXJnID0gY21kLT5jaGFubGlzdF9sZW47CisJCWVycisrOworCX0KKworCWlmIChjbWQtPmNoYW5saXN0X2xlbiA9PSAxKSB7CisJCW1pblNhbXBsUGVyID0gMTsKKwl9IGVsc2UgeworCQltaW5TYW1wbFBlciA9IE1JTl9TQU1QTElOR19QRVJJT0Q7CisJfQorCisJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCQlzdGVwcyA9IGNtZC0+Y29udmVydF9hcmcgKiAzMDsKKwkJaWYgKHN0ZXBzIDwgKG1pblNhbXBsUGVyICogMTAwMCkpIHsKKwkJCXN0ZXBzID0gbWluU2FtcGxQZXIgKiAxMDAwOworCQl9CisJCWlmIChzdGVwcyA+IChNQVhfU0FNUExJTkdfUEVSSU9EICogMTAwMCkpIHsKKwkJCXN0ZXBzID0gTUFYX1NBTVBMSU5HX1BFUklPRCAqIDEwMDA7CisJCX0KKwkJLy8gY2FsYyBhcmcgYWdhaW4KKwkJdG1wID0gc3RlcHMgLyAzMDsKKwkJaWYgKGNtZC0+Y29udmVydF9hcmcgIT0gdG1wKSB7CisJCQljbWQtPmNvbnZlcnRfYXJnID0gdG1wOworCQkJZXJyKys7CisJCX0KKwl9CisKKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCWVycisrOworCX0KKwkvLyBzdG9wIHNvdXJjZQorCXN3aXRjaCAoY21kLT5zdG9wX3NyYykgeworCWNhc2UgVFJJR19DT1VOVDoKKwkJaWYgKCFjbWQtPnN0b3BfYXJnKSB7CisJCQljbWQtPnN0b3BfYXJnID0gMTsKKwkJCWVycisrOworCQl9CisJCWJyZWFrOworCWNhc2UgVFJJR19OT05FOgorCQlpZiAoY21kLT5zdG9wX2FyZyAhPSAwKSB7CisJCQljbWQtPnN0b3BfYXJnID0gMDsKKwkJCWVycisrOworCQl9CisJCWJyZWFrOworCQkvLyBUUklHX0VYVCBkb2Vzbid0IGNhcmUgc2luY2UgaXQgZG9lc24ndCB0cmlnZ2VyIG9mZiBhIG51bWJlcmVkIGNoYW5uZWwKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gMzsKKworCS8qIHN0ZXAgNDogZml4IHVwIGFueSBhcmd1bWVudHMgKi8KKworCXJldHVybiAwOworCit9CisKK3N0YXRpYyBpbnQgdXNiZHV4ZmFzdF9haV9pbnR0cmlnKGNvbWVkaV9kZXZpY2UgKiBkZXYsCisJY29tZWRpX3N1YmRldmljZSAqIHMsIHVuc2lnbmVkIGludCB0cmlnbnVtKQoreworCWludCByZXQ7CisJdXNiZHV4ZmFzdHN1Yl90ICp0aGlzX3VzYmR1eGZhc3RzdWIgPSBkZXYtPnByaXZhdGU7CisJaWYgKCF0aGlzX3VzYmR1eGZhc3RzdWIpIHsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWRvd24oJnRoaXNfdXNiZHV4ZmFzdHN1Yi0+c2VtKTsKKwlpZiAoISh0aGlzX3VzYmR1eGZhc3RzdWItPnByb2JlZCkpIHsKKwkJdXAoJnRoaXNfdXNiZHV4ZmFzdHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorI2lmZGVmIENPTkZJR19DT01FRElfREVCVUcKKwlwcmludGsoImNvbWVkaSVkOiB1c2JkdXhmYXN0X2FpX2ludHRyaWdcbiIsIGRldi0+bWlub3IpOworI2VuZGlmCisKKwlpZiAodHJpZ251bSAhPSAwKSB7CisJCXByaW50aygiY29tZWRpJWQ6IHVzYmR1eGZhc3RfYWlfaW50dHJpZzogaW52YWxpZCB0cmlnbnVtXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXVwKCZ0aGlzX3VzYmR1eGZhc3RzdWItPnNlbSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoISh0aGlzX3VzYmR1eGZhc3RzdWItPmFpX2NtZF9ydW5uaW5nKSkgeworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmFpX2NtZF9ydW5uaW5nID0gMTsKKwkJcmV0ID0gdXNiZHV4ZmFzdHN1Yl9zdWJtaXRfSW5VUkJzKHRoaXNfdXNiZHV4ZmFzdHN1Yik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcmludGsoImNvbWVkaSVkOiB1c2JkdXhmYXN0X2FpX2ludHRyaWc6IHVyYlN1Ym1pdDogZXJyPSVkXG4iLCBkZXYtPm1pbm9yLCByZXQpOworCQkJdGhpc191c2JkdXhmYXN0c3ViLT5haV9jbWRfcnVubmluZyA9IDA7CisJCQl1cCgmdGhpc191c2JkdXhmYXN0c3ViLT5zZW0pOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlzLT5hc3luYy0+aW50dHJpZyA9IE5VTEw7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCJjb21lZGklZDogYWlfaW50dHJpZyBidXQgYWNxdSBpcyBhbHJlYWR5IHJ1bm5pbmdcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwl9CisJdXAoJnRoaXNfdXNiZHV4ZmFzdHN1Yi0+c2VtKTsKKwlyZXR1cm4gMTsKK30KKworLy8gb2Zmc2V0cyBmb3IgdGhlIEdQSUYgYnl0ZXMKKy8vIHRoZSBmaXJzdCBieXRlIGlzIHRoZSBjb21tYW5kIGJ5dGUKKyNkZWZpbmUgTEVOQkFTRSAxKzB4MDAKKyNkZWZpbmUgT1BCQVNFICAxKzB4MDgKKyNkZWZpbmUgT1VUQkFTRSAxKzB4MTAKKyNkZWZpbmUgTE9HQkFTRSAxKzB4MTgKKworc3RhdGljIGludCB1c2JkdXhmYXN0X2FpX2NtZChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfc3ViZGV2aWNlICogcykKK3sKKwljb21lZGlfY21kICpjbWQgPSAmcy0+YXN5bmMtPmNtZDsKKwl1bnNpZ25lZCBpbnQgY2hhbiwgZ2Fpbiwgcm5nbWFzayA9IDB4ZmY7CisJaW50IGksIGosIHJldDsKKwl1c2JkdXhmYXN0c3ViX3QgKnRoaXNfdXNiZHV4ZmFzdHN1YiA9IGRldi0+cHJpdmF0ZTsKKwlpbnQgcmVzdWx0OworCWxvbmcgc3RlcHMsIHN0ZXBzX3RtcDsKKworI2lmZGVmIENPTkZJR19DT01FRElfREVCVUcKKwlwcmludGsoImNvbWVkaSVkOiB1c2JkdXhmYXN0X2FpX2NtZFxuIiwgZGV2LT5taW5vcik7CisjZW5kaWYKKwlpZiAoIXRoaXNfdXNiZHV4ZmFzdHN1YikgeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJZG93bigmdGhpc191c2JkdXhmYXN0c3ViLT5zZW0pOworCWlmICghKHRoaXNfdXNiZHV4ZmFzdHN1Yi0+cHJvYmVkKSkgeworCQl1cCgmdGhpc191c2JkdXhmYXN0c3ViLT5zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKHRoaXNfdXNiZHV4ZmFzdHN1Yi0+YWlfY21kX3J1bm5pbmcpIHsKKwkJcHJpbnRrKCJjb21lZGklZDogYWlfY21kIG5vdCBwb3NzaWJsZS4gQW5vdGhlciBhaV9jbWQgaXMgcnVubmluZy5cbiIsIGRldi0+bWlub3IpOworCQl1cCgmdGhpc191c2JkdXhmYXN0c3ViLT5zZW0pOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwkvLyBzZXQgY3VycmVudCBjaGFubmVsIG9mIHRoZSBydW5uaW5nIGFxdWlzaXRpb24gdG8gemVybworCXMtPmFzeW5jLT5jdXJfY2hhbiA9IDA7CisKKwkvLyBpZ25vcmUgdGhlIGZpcnN0IGJ1ZmZlcnMgZnJvbSB0aGUgZGV2aWNlIGlmIHRoZXJlIGlzIGFuIGVycm9yIGNvbmRpdGlvbgorCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+aWdub3JlID0gUEFDS0VUU19UT19JR05PUkU7CisKKwlpZiAoY21kLT5jaGFubGlzdF9sZW4gPiAwKSB7CisJCWdhaW4gPSBDUl9SQU5HRShjbWQtPmNoYW5saXN0WzBdKTsKKwkJZm9yIChpID0gMDsgaSA8IGNtZC0+Y2hhbmxpc3RfbGVuOyArK2kpIHsKKwkJCWNoYW4gPSBDUl9DSEFOKGNtZC0+Y2hhbmxpc3RbaV0pOworCQkJaWYgKGNoYW4gIT0gaSkgeworCQkJCXByaW50aygiY29tZWRpJWQ6IGNtZCBpcyBhY2NlcHRpbmcgb25seSBjb25zZWN1dGl2ZSBjaGFubmVscy5cbiIsIGRldi0+bWlub3IpOworCQkJCXVwKCZ0aGlzX3VzYmR1eGZhc3RzdWItPnNlbSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlpZiAoKGdhaW4gIT0gQ1JfUkFOR0UoY21kLT5jaGFubGlzdFtpXSkpCisJCQkJJiYgKGNtZC0+Y2hhbmxpc3RfbGVuID4gMykpIHsKKwkJCQlwcmludGsoImNvbWVkaSVkOiB0aGUgZ2FpbiBtdXN0IGJlIHRoZSBzYW1lIGZvciBhbGwgY2hhbm5lbHMuXG4iLCBkZXYtPm1pbm9yKTsKKwkJCQl1cCgmdGhpc191c2JkdXhmYXN0c3ViLT5zZW0pOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJaWYgKGkgPj0gTlVNQ0hBTk5FTFMpIHsKKwkJCQlwcmludGsoImNvbWVkaSVkOiBjaGFubmVsIGxpc3QgdG9vIGxvbmdcbiIsCisJCQkJCWRldi0+bWlub3IpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCXN0ZXBzID0gMDsKKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCXByaW50aygiY29tZWRpJWQ6IHVzYmR1eGZhc3Q6IHNjYW5fYmVnaW5fc3JjPT1UUklHX1RJTUVSIG5vdCB2YWxpZC5cbiIsIGRldi0+bWlub3IpOworCQl1cCgmdGhpc191c2JkdXhmYXN0c3ViLT5zZW0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCQlzdGVwcyA9IChjbWQtPmNvbnZlcnRfYXJnICogMzApIC8gMTAwMDsKKwl9CisJaWYgKChzdGVwcyA8IE1JTl9TQU1QTElOR19QRVJJT0QpICYmIChjbWQtPmNoYW5saXN0X2xlbiAhPSAxKSkgeworCQlwcmludGsoImNvbWVkaSVkOiB1c2JkdXhmYXN0OiBhaV9jbWQ6IHN0ZXBzPSVsZCwgc2Nhbl9iZWdpbl9hcmc9JWQuIE5vdCBwcm9wZXJseSB0ZXN0ZWQgYnkgY21kdGVzdD9cbiIsIGRldi0+bWlub3IsIHN0ZXBzLCBjbWQtPnNjYW5fYmVnaW5fYXJnKTsKKwkJdXAoJnRoaXNfdXNiZHV4ZmFzdHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChzdGVwcyA+IE1BWF9TQU1QTElOR19QRVJJT0QpIHsKKwkJcHJpbnRrKCJjb21lZGklZDogdXNiZHV4ZmFzdDogYWlfY21kOiBzYW1wbGluZyByYXRlIHRvbyBsb3cuXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXVwKCZ0aGlzX3VzYmR1eGZhc3RzdWItPnNlbSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfRVhUKSAmJiAoY21kLT5jaGFubGlzdF9sZW4gIT0gMSkKKwkJJiYgKGNtZC0+Y2hhbmxpc3RfbGVuICE9IDE2KSkgeworCQlwcmludGsoImNvbWVkaSVkOiB1c2JkdXhmYXN0OiBhaV9jbWQ6IFRSSUdfRVhUIG9ubHkgd2l0aCAxIG9yIDE2IGNoYW5uZWxzIHBvc3NpYmxlLlxuIiwgZGV2LT5taW5vcik7CisJCXVwKCZ0aGlzX3VzYmR1eGZhc3RzdWItPnNlbSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKyNpZmRlZiBDT05GSUdfQ09NRURJX0RFQlVHCisJcHJpbnRrKCJjb21lZGklZDogdXNiZHV4ZmFzdDogc3RlcHM9JWxkLCBjb252ZXJ0X2FyZz0ldSwgYWlfdGltZXI9JXVcbiIsCisJCWRldi0+bWlub3IsCisJCXN0ZXBzLCBjbWQtPmNvbnZlcnRfYXJnLCB0aGlzX3VzYmR1eGZhc3RzdWItPmFpX3RpbWVyKTsKKyNlbmRpZgorCisJc3dpdGNoIChjbWQtPmNoYW5saXN0X2xlbikgeworCQkvLyBvbmUgY2hhbm5lbAorCWNhc2UgMToKKwkJaWYgKENSX1JBTkdFKGNtZC0+Y2hhbmxpc3RbMF0pID4gMCkKKwkJCXJuZ21hc2sgPSAweGZmIC0gMHgwNDsKKwkJZWxzZQorCQkJcm5nbWFzayA9IDB4ZmY7CisKKwkJLy8gZm9yIGV4dGVybmFsIHRyaWdnZXI6IGxvb3BpbmcgaW4gdGhpcyBzdGF0ZSB1bnRpbCB0aGUgUkRZMCBwaW4KKwkJLy8gYmVjb21lcyB6ZXJvCisJCWlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX0VYVCkgewkvLyB3ZSBsb29wIGhlcmUgdW50aWwgcmVhZHkgaGFzIGJlZW4gc2V0CisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgMF0gPSAweDAxOwkvLyBicmFuY2ggYmFjayB0byBzdGF0ZSAwCisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyAwXSA9IDB4MDE7CS8vIGRlY2Vpc2lvbiBzdGF0ZSB3L28gZGF0YQorCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDBdID0KKwkJCQkweEZGICYgcm5nbWFzazsKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyAwXSA9IDB4MDA7CS8vIFJEWTAgPSAwCisJCX0gZWxzZSB7CS8vIHdlIGp1c3QgcHJvY2VlZCB0byBzdGF0ZSAxCisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgMF0gPSAxOworCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgMF0gPSAwOworCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDBdID0KKwkJCQkweEZGICYgcm5nbWFzazsKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyAwXSA9IDA7CisJCX0KKworCQlpZiAoc3RlcHMgPCBNSU5fU0FNUExJTkdfUEVSSU9EKSB7CisJCQkvLyBmb3IgZmFzdCBzaW5nbGUgY2hhbm5lbCBhcXUgd2l0aG91dCBtdXgKKwkJCWlmIChzdGVwcyA8PSAxKSB7CisJCQkJLy8gd2UganVzdCBzdGF5IGhlcmUgYXQgc3RhdGUgMSBhbmQgcmV4ZWN1dGUgdGhlIHNhbWUgc3RhdGUKKwkJCQkvLyB0aGlzIGdpdmVzIHVzIDMwTUh6IHNhbXBsaW5nIHJhdGUKKwkJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgMV0gPSAweDg5OwkvLyBicmFuY2ggYmFjayB0byBzdGF0ZSAxCisJCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgMV0gPSAweDAzOwkvLyBkZWNlaXNpb24gc3RhdGUgd2l0aCBkYXRhCisJCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDFdID0KKwkJCQkJMHhGRiAmIHJuZ21hc2s7CisJCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDFdID0gMHhGRjsJLy8gZG9lc24ndCBtYXR0ZXIKKwkJCX0gZWxzZSB7CisJCQkJLy8gd2UgbG9vcCB0aHJvdWdoIHR3byBzdGF0ZXM6IGRhdGEgYW5kIGRlbGF5OiBtYXggcmF0ZSBpcyAxNU1oegorCQkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyAxXSA9CisJCQkJCXN0ZXBzIC0gMTsKKwkJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyAxXSA9IDB4MDI7CS8vIGRhdGEKKwkJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgMV0gPQorCQkJCQkweEZGICYgcm5nbWFzazsKKwkJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgMV0gPSAwOwkvLyBkb2Vzbid0IG1hdHRlcgorCisJCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDJdID0gMHgwOTsJLy8gYnJhbmNoIGJhY2sgdG8gc3RhdGUgMQorCQkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIDJdID0gMHgwMTsJLy8gZGVjZWlzaW9uIHN0YXRlIHcvbyBkYXRhCisJCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDJdID0KKwkJCQkJMHhGRiAmIHJuZ21hc2s7CisJCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDJdID0gMHhGRjsJLy8gZG9lc24ndCBtYXR0ZXIKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8vIHdlIGxvb3AgdGhyb3VnaCAzIHN0YXRlczogMnggZGVsYXkgYW5kIDF4IGRhdGEuIFRoaXMgZ2l2ZXMgYSBtaW4KKwkJCS8vIHNhbXBsaW5nIHJhdGUgb2YgNjBrSHouCisKKwkJCS8vIHdlIGhhdmUgMSBzdGF0ZSB3aXRoIGR1cmF0aW9uIDEKKwkJCXN0ZXBzID0gc3RlcHMgLSAxOworCisJCQkvLyBkbyB0aGUgZmlyc3QgcGFydCBvZiB0aGUgZGVsYXkKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyAxXSA9CisJCQkJc3RlcHMgLyAyOworCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgMV0gPSAwOworCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDFdID0KKwkJCQkweEZGICYgcm5nbWFzazsKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyAxXSA9IDA7CisKKwkJCS8vIGFuZCB0aGUgc2Vjb25kIHBhcnQKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyAyXSA9CisJCQkJc3RlcHMgLSBzdGVwcyAvIDI7CisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyAyXSA9IDA7CisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgMl0gPQorCQkJCTB4RkYgJiBybmdtYXNrOworCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDJdID0gMDsKKworCQkJLy8gZ2V0IHRoZSBkYXRhIGFuZCBicmFuY2ggYmFjaworCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDNdID0gMHgwOTsJLy8gYnJhbmNoIGJhY2sgdG8gc3RhdGUgMQorCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgM10gPSAweDAzOwkvLyBkZWNlaXNpb24gc3RhdGUgdyBkYXRhCisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgM10gPQorCQkJCTB4RkYgJiBybmdtYXNrOworCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDNdID0gMHhGRjsJLy8gZG9lc24ndCBtYXR0ZXIKKwkJfQorCQlicmVhazsKKworCWNhc2UgMjoKKwkJLy8gdHdvIGNoYW5uZWxzCisJCS8vIGNvbW1pdCBkYXRhIHRvIHRoZSBGSUZPCisJCWlmIChDUl9SQU5HRShjbWQtPmNoYW5saXN0WzBdKSA+IDApCisJCQlybmdtYXNrID0gMHhmZiAtIDB4MDQ7CisJCWVsc2UKKwkJCXJuZ21hc2sgPSAweGZmOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgMF0gPSAxOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyAwXSA9IDB4MDI7CS8vIGRhdGEKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDBdID0gMHhGRiAmIHJuZ21hc2s7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyAwXSA9IDA7CisKKwkJLy8gd2UgaGF2ZSAxIHN0YXRlIHdpdGggZHVyYXRpb24gMTogc3RhdGUgMAorCQlzdGVwc190bXAgPSBzdGVwcyAtIDE7CisKKwkJaWYgKENSX1JBTkdFKGNtZC0+Y2hhbmxpc3RbMV0pID4gMCkKKwkJCXJuZ21hc2sgPSAweGZmIC0gMHgwNDsKKwkJZWxzZQorCQkJcm5nbWFzayA9IDB4ZmY7CisJCS8vIGRvIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBkZWxheQorCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgMV0gPSBzdGVwc190bXAgLyAyOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyAxXSA9IDA7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyAxXSA9IDB4RkUgJiBybmdtYXNrOwkvL2NvdW50CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyAxXSA9IDA7CisKKwkJLy8gYW5kIHRoZSBzZWNvbmQgcGFydAorCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgMl0gPQorCQkJc3RlcHNfdG1wIC0gc3RlcHNfdG1wIC8gMjsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgMl0gPSAwOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgMl0gPSAweEZGICYgcm5nbWFzazsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDJdID0gMDsKKworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgM10gPSAxOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyAzXSA9IDB4MDI7CS8vIGRhdGEKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDNdID0gMHhGRiAmIHJuZ21hc2s7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyAzXSA9IDA7CisKKwkJLy8gd2UgaGF2ZSAyIHN0YXRlcyB3aXRoIGR1cmF0aW9uIDE6IHN0ZXAgNiBhbmQgdGhlIElETEUgc3RhdGUKKwkJc3RlcHNfdG1wID0gc3RlcHMgLSAyOworCisJCWlmIChDUl9SQU5HRShjbWQtPmNoYW5saXN0WzBdKSA+IDApCisJCQlybmdtYXNrID0gMHhmZiAtIDB4MDQ7CisJCWVsc2UKKwkJCXJuZ21hc2sgPSAweGZmOworCQkvLyBkbyB0aGUgZmlyc3QgcGFydCBvZiB0aGUgZGVsYXkKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDRdID0gc3RlcHNfdG1wIC8gMjsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgNF0gPSAwOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgNF0gPSAoMHhGRiAtIDB4MDIpICYgcm5nbWFzazsJLy9yZXNldAorCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgNF0gPSAwOworCisJCS8vIGFuZCB0aGUgc2Vjb25kIHBhcnQKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDVdID0KKwkJCXN0ZXBzX3RtcCAtIHN0ZXBzX3RtcCAvIDI7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIDVdID0gMDsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDVdID0gMHhGRiAmIHJuZ21hc2s7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyA1XSA9IDA7CisKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDZdID0gMTsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgNl0gPSAwOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgNl0gPSAweEZGICYgcm5nbWFzazsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDZdID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIDM6CisJCS8vIHRocmVlIGNoYW5uZWxzCisJCWZvciAoaiA9IDA7IGogPCAxOyBqKyspIHsKKwkJCWlmIChDUl9SQU5HRShjbWQtPmNoYW5saXN0W2pdKSA+IDApCisJCQkJcm5nbWFzayA9IDB4ZmYgLSAweDA0OworCQkJZWxzZQorCQkJCXJuZ21hc2sgPSAweGZmOworCQkJLy8gY29tbWl0IGRhdGEgdG8gdGhlIEZJRk8gYW5kIGRvIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBkZWxheQorCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIGogKiAyXSA9CisJCQkJc3RlcHMgLyAyOworCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgaiAqIDJdID0gMHgwMjsJLy8gZGF0YQorCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIGogKiAyXSA9IDB4RkYgJiBybmdtYXNrOwkvLyBubyBjaGFuZ2UKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyBqICogMl0gPSAwOworCisJCQlpZiAoQ1JfUkFOR0UoY21kLT5jaGFubGlzdFtqICsgMV0pID4gMCkKKwkJCQlybmdtYXNrID0gMHhmZiAtIDB4MDQ7CisJCQllbHNlCisJCQkJcm5nbWFzayA9IDB4ZmY7CisJCQkvLyBkbyB0aGUgc2Vjb25kIHBhcnQgb2YgdGhlIGRlbGF5CisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgaiAqIDIgKyAxXSA9CisJCQkJc3RlcHMgLSBzdGVwcyAvIDI7CisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyBqICogMiArIDFdID0gMDsJLy8gbm8gZGF0YQorCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIGogKiAyICsgMV0gPSAweEZFICYgcm5nbWFzazsJLy9jb3VudAorCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIGogKiAyICsgMV0gPQorCQkJCTA7CisJCX0KKworCQkvLyAyIHN0ZXBzIHdpdGggZHVyYXRpb24gMTogdGhlIGlkZWxlIHN0ZXAgYW5kIHN0ZXAgNjoKKwkJc3RlcHNfdG1wID0gc3RlcHMgLSAyOworCQkvLyBjb21taXQgZGF0YSB0byB0aGUgRklGTyBhbmQgZG8gdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGRlbGF5CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyA0XSA9IHN0ZXBzX3RtcCAvIDI7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIDRdID0gMHgwMjsJLy8gZGF0YQorCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgNF0gPSAweEZGICYgcm5nbWFzazsJLy8gbm8gY2hhbmdlCisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyA0XSA9IDA7CisKKwkJaWYgKENSX1JBTkdFKGNtZC0+Y2hhbmxpc3RbMF0pID4gMCkKKwkJCXJuZ21hc2sgPSAweGZmIC0gMHgwNDsKKwkJZWxzZQorCQkJcm5nbWFzayA9IDB4ZmY7CisJCS8vIGRvIHRoZSBzZWNvbmQgcGFydCBvZiB0aGUgZGVsYXkKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDVdID0KKwkJCXN0ZXBzX3RtcCAtIHN0ZXBzX3RtcCAvIDI7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIDVdID0gMDsJLy8gbm8gZGF0YQorCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgNV0gPSAoMHhGRiAtIDB4MDIpICYgcm5nbWFzazsJLy8gcmVzZXQKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDVdID0gMDsKKworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgNl0gPSAxOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyA2XSA9IDA7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyA2XSA9IDB4RkYgJiBybmdtYXNrOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgNl0gPSAwOworCisJY2FzZSAxNjoKKwkJaWYgKENSX1JBTkdFKGNtZC0+Y2hhbmxpc3RbMF0pID4gMCkKKwkJCXJuZ21hc2sgPSAweGZmIC0gMHgwNDsKKwkJZWxzZQorCQkJcm5nbWFzayA9IDB4ZmY7CisJCWlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX0VYVCkgewkvLyB3ZSBsb29wIGhlcmUgdW50aWwgcmVhZHkgaGFzIGJlZW4gc2V0CisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgMF0gPSAweDAxOwkvLyBicmFuY2ggYmFjayB0byBzdGF0ZSAwCisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyAwXSA9IDB4MDE7CS8vIGRlY2Vpc2lvbiBzdGF0ZSB3L28gZGF0YQorCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDBdID0gKDB4RkYgLSAweDAyKSAmIHJuZ21hc2s7CS8vIHJlc2V0CisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgMF0gPSAweDAwOwkvLyBSRFkwID0gMAorCQl9IGVsc2UgewkvLyB3ZSBqdXN0IHByb2NlZWQgdG8gc3RhdGUgMQorCQkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDBdID0gMjU1OwkvLyAzMHVzIHJlc2V0IHB1bHNlCisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyAwXSA9IDA7CisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgMF0gPSAoMHhGRiAtIDB4MDIpICYgcm5nbWFzazsJLy8gcmVzZXQKKwkJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyAwXSA9IDA7CisJCX0KKworCQkvLyBjb21taXQgZGF0YSB0byB0aGUgRklGTworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgMV0gPSAxOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyAxXSA9IDB4MDI7CS8vIGRhdGEKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDFdID0gMHhGRiAmIHJuZ21hc2s7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyAxXSA9IDA7CisKKwkJLy8gd2UgaGF2ZSAyIHN0YXRlcyB3aXRoIGR1cmF0aW9uIDEKKwkJc3RlcHMgPSBzdGVwcyAtIDI7CisKKwkJLy8gZG8gdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGRlbGF5CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyAyXSA9IHN0ZXBzIC8gMjsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgMl0gPSAwOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgMl0gPSAweEZFICYgcm5nbWFzazsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDJdID0gMDsKKworCQkvLyBhbmQgdGhlIHNlY29uZCBwYXJ0CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyAzXSA9CisJCQlzdGVwcyAtIHN0ZXBzIC8gMjsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgM10gPSAwOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgM10gPSAweEZGICYgcm5nbWFzazsKKwkJdGhpc191c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDNdID0gMDsKKworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgNF0gPSAweDA5OwkvLyBicmFuY2ggYmFjayB0byBzdGF0ZSAxCisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIDRdID0gMHgwMTsJLy8gZGVjZWlzaW9uIHN0YXRlIHcvbyBkYXRhCisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyA0XSA9IDB4RkYgJiBybmdtYXNrOworCQl0aGlzX3VzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgNF0gPSAweEZGOwkvLyBkb2Vzbid0IG1hdHRlcgorCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKCJjb21lZGkgJWQ6IHVuc3VwcG9ydGVkIGNvbWJpbmF0aW9uIG9mIGNoYW5uZWxzXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXVwKCZ0aGlzX3VzYmR1eGZhc3RzdWItPnNlbSk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworI2lmZGVmIENPTkZJR19DT01FRElfREVCVUcKKwlwcmludGsoImNvbWVkaSAlZDogc2VuZGluZyBjb21tYW5kcyB0byB0aGUgdXNiIGRldmljZVxuIiwgZGV2LT5taW5vcik7CisjZW5kaWYKKwkvLyAwIG1lYW5zIHRoYXQgdGhlIEFEIGNvbW1hbmRzIGFyZSBzZW50CisJcmVzdWx0ID0gc2VuZF9kdXhfY29tbWFuZHModGhpc191c2JkdXhmYXN0c3ViLCBTRU5EQURDT01NQU5EUyk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJcHJpbnRrKCJjb21lZGklZDogYWRjIGNvbW1hbmQgY291bGQgbm90IGJlIHN1Ym1pdHRlZC4gQWJvcnRpbmcuLi5cbiIsIGRldi0+bWlub3IpOworCQl1cCgmdGhpc191c2JkdXhmYXN0c3ViLT5zZW0pOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKSB7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+YWlfc2FtcGxlX2NvdW50ID0KKwkJCShjbWQtPnN0b3BfYXJnKSAqIChjbWQtPnNjYW5fZW5kX2FyZyk7CisJCWlmICh1c2JkdXhmYXN0c3ViLT5haV9zYW1wbGVfY291bnQgPCAxKSB7CisJCQlwcmludGsoImNvbWVkaSVkOiAoY21kLT5zdG9wX2FyZykqKGNtZC0+c2Nhbl9lbmRfYXJnKTwxLCBhYm9ydGluZy5cbiIsIGRldi0+bWlub3IpOworCQkJdXAoJnRoaXNfdXNiZHV4ZmFzdHN1Yi0+c2VtKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+YWlfY29udGlub3VzID0gMDsKKwl9IGVsc2UgeworCQkvLyBjb250aW5vdXMgYXF1aXNpdGlvbgorCQl0aGlzX3VzYmR1eGZhc3RzdWItPmFpX2NvbnRpbm91cyA9IDE7CisJCXRoaXNfdXNiZHV4ZmFzdHN1Yi0+YWlfc2FtcGxlX2NvdW50ID0gMDsKKwl9CisKKwlpZiAoKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfTk9XKSB8fCAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19FWFQpKSB7CisJCS8vIGVuYWJsZSB0aGlzIGFjcXVpc2l0aW9uIG9wZXJhdGlvbgorCQl0aGlzX3VzYmR1eGZhc3RzdWItPmFpX2NtZF9ydW5uaW5nID0gMTsKKwkJcmV0ID0gdXNiZHV4ZmFzdHN1Yl9zdWJtaXRfSW5VUkJzKHRoaXNfdXNiZHV4ZmFzdHN1Yik7CisJCWlmIChyZXQgPCAwKSB7CisJCQl0aGlzX3VzYmR1eGZhc3RzdWItPmFpX2NtZF9ydW5uaW5nID0gMDsKKwkJCS8vIGZpeG1lOiB1bmxpbmsgaGVyZT8/CisJCQl1cCgmdGhpc191c2JkdXhmYXN0c3ViLT5zZW0pOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlzLT5hc3luYy0+aW50dHJpZyA9IE5VTEw7CisJfSBlbHNlIHsKKwkJLyogVFJJR19JTlQgKi8KKwkJLy8gZG9uJ3QgZW5hYmxlIHRoZSBhY3F1aXNpb24gb3BlcmF0aW9uCisJCS8vIHdhaXQgZm9yIGFuIGludGVybmFsIHNpZ25hbAorCQlzLT5hc3luYy0+aW50dHJpZyA9IHVzYmR1eGZhc3RfYWlfaW50dHJpZzsKKwl9CisJdXAoJnRoaXNfdXNiZHV4ZmFzdHN1Yi0+c2VtKTsKKworCXJldHVybiAwOworfQorCisvKiBNb2RlIDAgaXMgdXNlZCB0byBnZXQgYSBzaW5nbGUgY29udmVyc2lvbiBvbiBkZW1hbmQgKi8KK3N0YXRpYyBpbnQgdXNiZHV4ZmFzdF9haV9pbnNuX3JlYWQoY29tZWRpX2RldmljZSAqIGRldiwKKwljb21lZGlfc3ViZGV2aWNlICogcywgY29tZWRpX2luc24gKiBpbnNuLCBsc2FtcGxfdCAqIGRhdGEpCit7CisJaW50IGksIGosIG4sIGFjdHVhbF9sZW5ndGg7CisJaW50IGNoYW4sIHJhbmdlLCBybmdtYXNrOworCWludCBlcnI7CisJdXNiZHV4ZmFzdHN1Yl90ICp1c2JkdXhmYXN0c3ViID0gZGV2LT5wcml2YXRlOworCisJaWYgKCF1c2JkdXhmYXN0c3ViKSB7CisJCXByaW50aygiY29tZWRpJWQ6IGFpX2luc25fcmVhZDogbm8gdXNiIGRldi5cbiIsIGRldi0+bWlub3IpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisjaWZkZWYgQ09ORklHX0NPTUVESV9ERUJVRworCXByaW50aygiY29tZWRpJWQ6IGFpX2luc25fcmVhZCwgaW5zbi0+bj0lZCwgaW5zbi0+c3ViZGV2PSVkXG4iLAorCQlkZXYtPm1pbm9yLCBpbnNuLT5uLCBpbnNuLT5zdWJkZXYpOworI2VuZGlmCisJZG93bigmdXNiZHV4ZmFzdHN1Yi0+c2VtKTsKKwlpZiAoISh1c2JkdXhmYXN0c3ViLT5wcm9iZWQpKSB7CisJCXVwKCZ1c2JkdXhmYXN0c3ViLT5zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKHVzYmR1eGZhc3RzdWItPmFpX2NtZF9ydW5uaW5nKSB7CisJCXByaW50aygiY29tZWRpJWQ6IGFpX2luc25fcmVhZCBub3QgcG9zc2libGUuIEFzeW5jIENvbW1hbmQgaXMgcnVubmluZy5cbiIsIGRldi0+bWlub3IpOworCQl1cCgmdXNiZHV4ZmFzdHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJLy8gc2FtcGxlIG9uZSBjaGFubmVsCisJY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCXJhbmdlID0gQ1JfUkFOR0UoaW5zbi0+Y2hhbnNwZWMpOworCS8vIHNldCBjb21tYW5kIGZvciB0aGUgZmlyc3QgY2hhbm5lbAorCisJaWYgKHJhbmdlID4gMCkKKwkJcm5nbWFzayA9IDB4ZmYgLSAweDA0OworCWVsc2UKKwkJcm5nbWFzayA9IDB4ZmY7CisJLy8gY29tbWl0IGRhdGEgdG8gdGhlIEZJRk8KKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDBdID0gMTsKKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgMF0gPSAweDAyOwkvLyBkYXRhCisJdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyAwXSA9IDB4RkYgJiBybmdtYXNrOworCXVzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgMF0gPSAwOworCisJLy8gZG8gdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGRlbGF5CisJdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyAxXSA9IDEyOworCXVzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyAxXSA9IDA7CisJdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyAxXSA9IDB4RkUgJiBybmdtYXNrOworCXVzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgMV0gPSAwOworCisJdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xFTkJBU0UgKyAyXSA9IDE7CisJdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIDJdID0gMDsKKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDJdID0gMHhGRSAmIHJuZ21hc2s7CisJdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyAyXSA9IDA7CisKKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDNdID0gMTsKKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgM10gPSAwOworCXVzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgM10gPSAweEZFICYgcm5nbWFzazsKKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDNdID0gMDsKKworCXVzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMRU5CQVNFICsgNF0gPSAxOworCXVzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPUEJBU0UgKyA0XSA9IDA7CisJdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09VVEJBU0UgKyA0XSA9IDB4RkUgJiBybmdtYXNrOworCXVzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tMT0dCQVNFICsgNF0gPSAwOworCisJLy8gc2Vjb25kIHBhcnQKKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDVdID0gMTI7CisJdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW09QQkFTRSArIDVdID0gMDsKKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1VUQkFTRSArIDVdID0gMHhGRiAmIHJuZ21hc2s7CisJdXNiZHV4ZmFzdHN1Yi0+ZHV4X2NvbW1hbmRzW0xPR0JBU0UgKyA1XSA9IDA7CisKKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTEVOQkFTRSArIDZdID0gMTsKKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbT1BCQVNFICsgNl0gPSAwOworCXVzYmR1eGZhc3RzdWItPmR1eF9jb21tYW5kc1tPVVRCQVNFICsgNl0gPSAweEZGICYgcm5nbWFzazsKKwl1c2JkdXhmYXN0c3ViLT5kdXhfY29tbWFuZHNbTE9HQkFTRSArIDBdID0gMDsKKworI2lmZGVmIENPTkZJR19DT01FRElfREVCVUcKKwlwcmludGsoImNvbWVkaSAlZDogc2VuZGluZyBjb21tYW5kcyB0byB0aGUgdXNiIGRldmljZVxuIiwgZGV2LT5taW5vcik7CisjZW5kaWYKKwkvLyAwIG1lYW5zIHRoYXQgdGhlIEFEIGNvbW1hbmRzIGFyZSBzZW50CisJZXJyID0gc2VuZF9kdXhfY29tbWFuZHModXNiZHV4ZmFzdHN1YiwgU0VOREFEQ09NTUFORFMpOworCWlmIChlcnIgPCAwKSB7CisJCXByaW50aygiY29tZWRpJWQ6IGFkYyBjb21tYW5kIGNvdWxkIG5vdCBiZSBzdWJtaXR0ZWQuIEFib3J0aW5nLi4uXG4iLCBkZXYtPm1pbm9yKTsKKwkJdXAoJnVzYmR1eGZhc3RzdWItPnNlbSk7CisJCXJldHVybiBlcnI7CisJfQorI2lmZGVmIENPTkZJR19DT01FRElfREVCVUcKKwlwcmludGsoImNvbWVkaSVkOiB1c2JkdXhmYXN0OiBzdWJtaXR0aW5nIGluLXVyYjogJXgsJXhcbiIsCisJCXVzYmR1eGZhc3RzdWItPmNvbWVkaWRldi0+bWlub3IsCisJCShpbnQpKHVzYmR1eGZhc3RzdWItPnVyYkluLT5jb250ZXh0KSwKKwkJKGludCkodXNiZHV4ZmFzdHN1Yi0+dXJiSW4tPmRldikpOworI2VuZGlmCisJZm9yIChpID0gMDsgaSA8IFBBQ0tFVFNfVE9fSUdOT1JFOyBpKyspIHsKKwkJZXJyID0gdXNiX2J1bGtfbXNnKHVzYmR1eGZhc3RzdWItPnVzYmRldiwKKwkJCQkgICB1c2JfcmN2YnVsa3BpcGUodXNiZHV4ZmFzdHN1Yi0+dXNiZGV2LAorCQkJCQkJICAgQlVMS0lORVApLAorCQkJCSAgIHVzYmR1eGZhc3RzdWItPnRyYW5zZmVyX2J1ZmZlciwgU0laRUlOQlVGLAorCQkJCSAgICZhY3R1YWxfbGVuZ3RoLCAxMDAwMCk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlwcmludGsoImNvbWVkaSVkOiBpbnNuIHRpbWVvdXQuIE5vIGRhdGEuXG4iLAorCQkJCWRldi0+bWlub3IpOworCQkJdXAoJnVzYmR1eGZhc3RzdWItPnNlbSk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCS8vIGRhdGEgcG9pbnRzCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47KSB7CisJCWVyciA9IHVzYl9idWxrX21zZyh1c2JkdXhmYXN0c3ViLT51c2JkZXYsCisJCQkJICAgdXNiX3JjdmJ1bGtwaXBlKHVzYmR1eGZhc3RzdWItPnVzYmRldiwKKwkJCQkJCSAgIEJVTEtJTkVQKSwKKwkJCQkgICB1c2JkdXhmYXN0c3ViLT50cmFuc2Zlcl9idWZmZXIsIFNJWkVJTkJVRiwKKwkJCQkgICAmYWN0dWFsX2xlbmd0aCwgMTAwMDApOworCQlpZiAoZXJyIDwgMCkgeworCQkJcHJpbnRrKCJjb21lZGklZDogaW5zbiBkYXRhIGVycm9yOiAlZFxuIiwKKwkJCQlkZXYtPm1pbm9yLCBlcnIpOworCQkJdXAoJnVzYmR1eGZhc3RzdWItPnNlbSk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCW4gPSBhY3R1YWxfbGVuZ3RoIC8gc2l6ZW9mKHVpbnQxNl90KTsKKwkJaWYgKChuICUgMTYpICE9IDApIHsKKwkJCXByaW50aygiY29tZWRpJWQ6IGluc24gZGF0YSBwYWNrZXQgY29ycnVwdGVkLlxuIiwKKwkJCQlkZXYtPm1pbm9yKTsKKwkJCXVwKCZ1c2JkdXhmYXN0c3ViLT5zZW0pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJZm9yIChqID0gY2hhbjsgKGogPCBuKSAmJiAoaSA8IGluc24tPm4pOyBqID0gaiArIDE2KSB7CisJCQlkYXRhW2ldID0KKwkJCQkoKHVpbnQxNl90ICopICh1c2JkdXhmYXN0c3ViLT4KKwkJCQkJdHJhbnNmZXJfYnVmZmVyKSlbal07CisJCQlpKys7CisJCX0KKwl9CisJdXAoJnVzYmR1eGZhc3RzdWItPnNlbSk7CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBoZXgydW5zaWduZWQoY2hhciAqaCkKK3sKKwl1bnNpZ25lZCBoaSwgbG87CisJaWYgKGhbMF0gPiAnOScpIHsKKwkJaGkgPSBoWzBdIC0gJ0EnICsgMHgwYTsKKwl9IGVsc2UgeworCQloaSA9IGhbMF0gLSAnMCc7CisJfQorCWlmIChoWzFdID4gJzknKSB7CisJCWxvID0gaFsxXSAtICdBJyArIDB4MGE7CisJfSBlbHNlIHsKKwkJbG8gPSBoWzFdIC0gJzAnOworCX0KKwlyZXR1cm4gaGkgKiAweDEwICsgbG87Cit9CisKKy8vIGZvciBGWDIKKyNkZWZpbmUgRklSTVdBUkVfTUFYX0xFTiAweDIwMDAKKworLy8gdGFrZW4gZnJvbSBEYXZpZCBCcm93bmVsbCdzIGZ4bG9hZCBhbmQgYWRqdXN0ZWQgZm9yIHRoaXMgZHJpdmVyCitzdGF0aWMgaW50IHJlYWRfZmlybXdhcmUodXNiZHV4ZmFzdHN1Yl90ICogdXNiZHV4ZmFzdHN1Yiwgdm9pZCAqZmlybXdhcmVQdHIsCisJbG9uZyBzaXplKQoreworCWludCBpID0gMDsKKwl1bnNpZ25lZCBjaGFyICpmcCA9IChjaGFyICopZmlybXdhcmVQdHI7CisJdW5zaWduZWQgY2hhciAqZmlybXdhcmVCaW5hcnkgPSBOVUxMOworCWludCByZXMgPSAwOworCWludCBtYXhBZGRyID0gMDsKKworCWZpcm13YXJlQmluYXJ5ID0ga21hbGxvYyhGSVJNV0FSRV9NQVhfTEVOLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZpcm13YXJlQmluYXJ5KSB7CisJCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdDogbWVtIGFsbG9jIGZvciBmaXJtd2FyZSBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlmb3IgKDs7KSB7CisJCWNoYXIgYnVmWzI1Nl0sICpjcDsKKwkJY2hhciB0eXBlOworCQlpbnQgbGVuOworCQlpbnQgaWR4LCBvZmY7CisJCWludCBqID0gMDsKKworCQkvLyBnZXQgb25lIGxpbmUKKwkJd2hpbGUgKChpIDwgc2l6ZSkgJiYgKGZwW2ldICE9IDEzKSAmJiAoZnBbaV0gIT0gMTApKSB7CisJCQlidWZbal0gPSBmcFtpXTsKKwkJCWkrKzsKKwkJCWorKzsKKwkJCWlmIChqID49IHNpemVvZihidWYpKSB7CisJCQkJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0OiBib2d1cyBmaXJtd2FyZSBmaWxlIVxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJCS8vIGdldCByaWQgb2YgTEYvQ1IvLi4uCisJCXdoaWxlICgoaSA8IHNpemUpICYmICgoZnBbaV0gPT0gMTMpIHx8IChmcFtpXSA9PSAxMCkKKwkJCQl8fCAoZnBbaV0gPT0gMCkpKSB7CisJCQlpKys7CisJCX0KKworCQlidWZbal0gPSAwOworCQkvL3ByaW50aygiY29tZWRpXzogYnVmPSVzXG4iLGJ1Zik7CisKKwkJLyogRVhURU5TSU9OOiAiIyBjb21tZW50LXRpbGwtZW5kLW9mLWxpbmUiLCBmb3IgY29weXJpZ2h0cyBldGMgKi8KKwkJaWYgKGJ1ZlswXSA9PSAnIycpCisJCQljb250aW51ZTsKKworCQlpZiAoYnVmWzBdICE9ICc6JykgeworCQkJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0OiB1cGxvYWQ6IG5vdCBhbiBpaGV4IHJlY29yZDogJXMiLCBidWYpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQkvKiBSZWFkIHRoZSBsZW5ndGggZmllbGQgKHVwIHRvIDE2IGJ5dGVzKSAqLworCQlsZW4gPSBoZXgydW5zaWduZWQoYnVmICsgMSk7CisKKwkJLyogUmVhZCB0aGUgdGFyZ2V0IG9mZnNldCAqLworCQlvZmYgPSAoaGV4MnVuc2lnbmVkKGJ1ZiArIDMpICogMHgwMTAwKSArIGhleDJ1bnNpZ25lZChidWYgKyA1KTsKKworCQlpZiAoKG9mZiArIGxlbikgPiBtYXhBZGRyKSB7CisJCQltYXhBZGRyID0gb2ZmICsgbGVuOworCQl9CisKKwkJaWYgKG1heEFkZHIgPj0gRklSTVdBUkVfTUFYX0xFTikgeworCQkJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0OiBmaXJtd2FyZSB1cGxvYWQgZ29lcyBiZXlvbmQgRlgyIFJBTSBib3VuZGFyaWVzLiIpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJLy9wcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3Q6IG9mZj0leCwgbGVuPSV4OiIsb2ZmLGxlbik7CisKKwkJLyogUmVhZCB0aGUgcmVjb3JkIHR5cGUgKi8KKwkJdHlwZSA9IGhleDJ1bnNpZ25lZChidWYgKyA3KTsKKworCQkvKiBJZiB0aGlzIGlzIGFuIEVPRiByZWNvcmQsIHRoZW4gbWFrZSBpdCBzby4gKi8KKwkJaWYgKHR5cGUgPT0gMSkgeworCQkJYnJlYWs7CisJCX0KKworCQlpZiAodHlwZSAhPSAwKSB7CisJCQlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3Q6IHVuc3VwcG9ydGVkIHJlY29yZCB0eXBlOiAldVxuIiwgdHlwZSk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCWZvciAoaWR4ID0gMCwgY3AgPSBidWYgKyA5OyBpZHggPCBsZW47IGlkeCArPSAxLCBjcCArPSAyKSB7CisJCQlmaXJtd2FyZUJpbmFyeVtpZHggKyBvZmZdID0gaGV4MnVuc2lnbmVkKGNwKTsKKwkJCS8vcHJpbnRrKCIlMDJ4ICIsZmlybXdhcmVCaW5hcnlbaWR4K29mZl0pOworCQl9CisJCS8vcHJpbnRrKCJcbiIpOworCisJCWlmIChpID49IHNpemUpIHsKKwkJCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdDogdW5leHBlY3RlZCBlbmQgb2YgaGV4IGZpbGVcbiIpOworCQkJYnJlYWs7CisJCX0KKworCX0KKwlyZXMgPSBmaXJtd2FyZVVwbG9hZCh1c2JkdXhmYXN0c3ViLCBmaXJtd2FyZUJpbmFyeSwgbWF4QWRkciArIDEpOworCWtmcmVlKGZpcm13YXJlQmluYXJ5KTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCB0aWR5X3VwKHVzYmR1eGZhc3RzdWJfdCAqIHVzYmR1eGZhc3RzdWJfdG1wKQoreworI2lmZGVmIENPTkZJR19DT01FRElfREVCVUcKKwlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3Q6IHRpZGluZyB1cFxuIik7CisjZW5kaWYKKwlpZiAoIXVzYmR1eGZhc3RzdWJfdG1wKSB7CisJCXJldHVybjsKKwl9CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorCS8vIHNob3dzIHRoZSB1c2Igc3Vic3lzdGVtIHRoYXQgdGhlIGRyaXZlciBpcyBkb3duCisJaWYgKHVzYmR1eGZhc3RzdWJfdG1wLT5pbnRlcmZhY2UpIHsKKwkJdXNiX3NldF9pbnRmZGF0YSh1c2JkdXhmYXN0c3ViX3RtcC0+aW50ZXJmYWNlLCBOVUxMKTsKKwl9CisjZW5kaWYKKworCXVzYmR1eGZhc3RzdWJfdG1wLT5wcm9iZWQgPSAwOworCisJaWYgKHVzYmR1eGZhc3RzdWJfdG1wLT51cmJJbikgeworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsOCkKKwkJLy8gd2FpdHMgdW50aWwgYSBydW5uaW5nIHRyYW5zZmVyIGlzIG92ZXIKKwkJLy8gdGh1cywgdW5kZXIgMi40IGhvdHBsdWdnaW5nIHdoaWxlIGEgY29tbWFuZAorCQkvLyBpcyBydW5uaW5nIGlzIG5vdCBzYWZlCisJCXVzYl9raWxsX3VyYih1c2JkdXhmYXN0c3ViX3RtcC0+dXJiSW4pOworI2VuZGlmCisJCWlmICh1c2JkdXhmYXN0c3ViX3RtcC0+dHJhbnNmZXJfYnVmZmVyKSB7CisJCQlrZnJlZSh1c2JkdXhmYXN0c3ViX3RtcC0+dHJhbnNmZXJfYnVmZmVyKTsKKwkJCXVzYmR1eGZhc3RzdWJfdG1wLT50cmFuc2Zlcl9idWZmZXIgPSBOVUxMOworCQl9CisJCXVzYl9mcmVlX3VyYih1c2JkdXhmYXN0c3ViX3RtcC0+dXJiSW4pOworCQl1c2JkdXhmYXN0c3ViX3RtcC0+dXJiSW4gPSBOVUxMOworCX0KKwlpZiAodXNiZHV4ZmFzdHN1Yl90bXAtPmluc25CdWZmZXIpIHsKKwkJa2ZyZWUodXNiZHV4ZmFzdHN1Yl90bXAtPmluc25CdWZmZXIpOworCQl1c2JkdXhmYXN0c3ViX3RtcC0+aW5zbkJ1ZmZlciA9IE5VTEw7CisJfQorCWlmICh1c2JkdXhmYXN0c3ViX3RtcC0+ZHV4X2NvbW1hbmRzKSB7CisJCWtmcmVlKHVzYmR1eGZhc3RzdWJfdG1wLT5kdXhfY29tbWFuZHMpOworCQl1c2JkdXhmYXN0c3ViX3RtcC0+ZHV4X2NvbW1hbmRzID0gTlVMTDsKKwl9CisJdXNiZHV4ZmFzdHN1Yl90bXAtPmFpX2NtZF9ydW5uaW5nID0gMDsKK30KKworLy8gYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgdXJicyBhbmQgaW5pdGlhbGlzZSB0aGVtCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDApCitzdGF0aWMgdm9pZCAqdXNiZHV4ZmFzdHN1Yl9wcm9iZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwKKwl1bnNpZ25lZCBpbnQgaW50ZXJmbnVtLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisjZWxzZQorc3RhdGljIGludCB1c2JkdXhmYXN0c3ViX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICp1aW50ZXJmLAorCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYodWludGVyZik7CisjZW5kaWYKKwlpbnQgaTsKKwlpbnQgaW5kZXg7CisKKwlpZiAodWRldi0+c3BlZWQgIT0gVVNCX1NQRUVEX0hJR0gpIHsKKwkJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0XzogVGhpcyBkcml2ZXIgbmVlZHMgVVNCIDIuMCB0byBvcGVyYXRlLiBBYm9ydGluZy4uLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKyNpZmRlZiBDT05GSUdfQ09NRURJX0RFQlVHCisJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0XzogZmluZGluZyBhIGZyZWUgc3RydWN0dXJlIGZvciB0aGUgdXNiLWRldmljZVxuIik7CisjZW5kaWYKKwlkb3duKCZzdGFydF9zdG9wX3NlbSk7CisJLy8gbG9vayBmb3IgYSBmcmVlIHBsYWNlIGluIHRoZSB1c2JkdXhmYXN0IGFycmF5CisJaW5kZXggPSAtMTsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNVVNCRFVYRkFTVDsgaSsrKSB7CisJCWlmICghKHVzYmR1eGZhc3RzdWJbaV0ucHJvYmVkKSkgeworCQkJaW5kZXggPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvLyBubyBtb3JlIHNwYWNlCisJaWYgKGluZGV4ID09IC0xKSB7CisJCXByaW50aygiVG9vIG1hbnkgdXNiZHV4ZmFzdC1kZXZpY2VzIGNvbm5lY3RlZC5cbiIpOworCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQlyZXR1cm4gLUVNRklMRTsKKwl9CisjaWZkZWYgQ09ORklHX0NPTUVESV9ERUJVRworCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdDogdXNiZHV4ZmFzdHN1YlslZF0gaXMgcmVhZHkgdG8gY29ubmVjdCB0byBjb21lZGkuXG4iLCBpbmRleCk7CisjZW5kaWYKKworCWluaXRfTVVURVgoJih1c2JkdXhmYXN0c3ViW2luZGV4XS5zZW0pKTsKKwkvLyBzYXZlIGEgcG9pbnRlciB0byB0aGUgdXNiIGRldmljZQorCXVzYmR1eGZhc3RzdWJbaW5kZXhdLnVzYmRldiA9IHVkZXY7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMCkKKwkvLyBzYXZlIHRoZSBpbnRlcmZhY2UgbnVtYmVyCisJdXNiZHV4ZmFzdHN1YltpbmRleF0uaWZudW0gPSBpbnRlcmZudW07CisjZWxzZQorCS8vIDIuNjogc2F2ZSB0aGUgaW50ZXJmYWNlIGl0c2VsZgorCXVzYmR1eGZhc3RzdWJbaW5kZXhdLmludGVyZmFjZSA9IHVpbnRlcmY7CisJLy8gZ2V0IHRoZSBpbnRlcmZhY2UgbnVtYmVyIGZyb20gdGhlIGludGVyZmFjZQorCXVzYmR1eGZhc3RzdWJbaW5kZXhdLmlmbnVtID0gdWludGVyZi0+YWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyOworCS8vIGhhbmQgdGhlIHByaXZhdGUgZGF0YSBvdmVyIHRvIHRoZSB1c2Igc3Vic3lzdGVtCisJLy8gd2lsbCBiZSBuZWVkZWQgZm9yIGRpc2Nvbm5lY3QKKwl1c2Jfc2V0X2ludGZkYXRhKHVpbnRlcmYsICYodXNiZHV4ZmFzdHN1YltpbmRleF0pKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0NPTUVESV9ERUJVRworCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdDogaWZudW09JWRcbiIsIHVzYmR1eGZhc3RzdWJbaW5kZXhdLmlmbnVtKTsKKyNlbmRpZgorCS8vIGNyZWF0ZSBzcGFjZSBmb3IgdGhlIGNvbW1hbmRzIGdvaW5nIHRvIHRoZSB1c2IgZGV2aWNlCisJdXNiZHV4ZmFzdHN1YltpbmRleF0uZHV4X2NvbW1hbmRzID0ga21hbGxvYyhTSVpFT0ZEVVhCVUZGRVIsCisJCUdGUF9LRVJORUwpOworCWlmICghdXNiZHV4ZmFzdHN1YltpbmRleF0uZHV4X2NvbW1hbmRzKSB7CisJCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdDogZXJyb3IgYWxsb2Mgc3BhY2UgZm9yIGRhYyBjb21tYW5kc1xuIik7CisJCXRpZHlfdXAoJih1c2JkdXhmYXN0c3ViW2luZGV4XSkpOworCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLy8gY3JlYXRlIHNwYWNlIG9mIHRoZSBpbnN0cnVjdGlvbiBidWZmZXIKKwl1c2JkdXhmYXN0c3ViW2luZGV4XS5pbnNuQnVmZmVyID0ga21hbGxvYyhTSVpFSU5TTkJVRiwgR0ZQX0tFUk5FTCk7CisJaWYgKCEodXNiZHV4ZmFzdHN1YltpbmRleF0uaW5zbkJ1ZmZlcikpIHsKKwkJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0OiBjb3VsZCBub3QgYWxsb2Mgc3BhY2UgZm9yIGluc25CdWZmZXJcbiIpOworCQl0aWR5X3VwKCYodXNiZHV4ZmFzdHN1YltpbmRleF0pKTsKKwkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCS8vIHNldHRpbmcgdG8gYWx0ZXJuYXRlIHNldHRpbmcgMTogZW5hYmxpbmcgYnVsayBlcAorCWkgPSB1c2Jfc2V0X2ludGVyZmFjZSh1c2JkdXhmYXN0c3ViW2luZGV4XS51c2JkZXYsCisJCXVzYmR1eGZhc3RzdWJbaW5kZXhdLmlmbnVtLCAxKTsKKwlpZiAoaSA8IDApIHsKKwkJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0JWQ6IGNvdWxkIG5vdCBzd2l0Y2ggdG8gYWx0ZXJuYXRlIHNldHRpbmcgMS5cbiIsIGluZGV4KTsKKwkJdGlkeV91cCgmKHVzYmR1eGZhc3RzdWJbaW5kZXhdKSk7CisJCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwl1c2JkdXhmYXN0c3ViW2luZGV4XS51cmJJbiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJaWYgKHVzYmR1eGZhc3RzdWJbaW5kZXhdLnVyYkluID09IE5VTEwpIHsKKwkJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0JWQ6IENvdWxkIG5vdCBhbGxvYy4gdXJiXG4iLCBpbmRleCk7CisJCXRpZHlfdXAoJih1c2JkdXhmYXN0c3ViW2luZGV4XSkpOworCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJdXNiZHV4ZmFzdHN1YltpbmRleF0udHJhbnNmZXJfYnVmZmVyID0ga21hbGxvYyhTSVpFSU5CVUYsIEdGUF9LRVJORUwpOworCWlmICghKHVzYmR1eGZhc3RzdWJbaW5kZXhdLnRyYW5zZmVyX2J1ZmZlcikpIHsKKwkJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0JWQ6IGNvdWxkIG5vdCBhbGxvYy4gdHJhbnNiLlxuIiwKKwkJCWluZGV4KTsKKwkJdGlkeV91cCgmKHVzYmR1eGZhc3RzdWJbaW5kZXhdKSk7CisJCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkvLyB3ZSd2ZSByZWFjaGVkIHRoZSBib3R0b20gb2YgdGhlIGZ1bmN0aW9uCisJdXNiZHV4ZmFzdHN1YltpbmRleF0ucHJvYmVkID0gMTsKKwl1cCgmc3RhcnRfc3RvcF9zZW0pOworCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdCVkIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZC5cbiIsCisJCWluZGV4KTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMCkKKwlyZXR1cm4gKHZvaWQgKikoJnVzYmR1eGZhc3RzdWJbaW5kZXhdKTsKKyNlbHNlCisJLy8gc3VjY2VzcworCXJldHVybiAwOworI2VuZGlmCit9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMCkKK3N0YXRpYyB2b2lkIHVzYmR1eGZhc3RzdWJfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgdm9pZCAqcHRyKQoreworCXVzYmR1eGZhc3RzdWJfdCAqdXNiZHV4ZmFzdHN1Yl90bXAgPSAodXNiZHV4ZmFzdHN1Yl90ICopIHB0cjsKKyNlbHNlCitzdGF0aWMgdm9pZCB1c2JkdXhmYXN0c3ViX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJdXNiZHV4ZmFzdHN1Yl90ICp1c2JkdXhmYXN0c3ViX3RtcCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworI2VuZGlmCisJaWYgKCF1c2JkdXhmYXN0c3ViX3RtcCkgeworCQlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3Q6IGRpc2Nvbm5lY3QgY2FsbGVkIHdpdGggbnVsbCBwb2ludGVyLlxuIik7CisJCXJldHVybjsKKwl9CisJaWYgKHVzYmR1eGZhc3RzdWJfdG1wLT51c2JkZXYgIT0gdWRldikgeworCQlwcmludGsoImNvbWVkaV86IHVzYmR1eGZhc3Q6IEJVRyEgY2FsbGVkIHdpdGggd3JvbmcgcHRyISEhXG4iKTsKKwkJcmV0dXJuOworCX0KKwlkb3duKCZzdGFydF9zdG9wX3NlbSk7CisJZG93bigmdXNiZHV4ZmFzdHN1Yl90bXAtPnNlbSk7CisJdGlkeV91cCh1c2JkdXhmYXN0c3ViX3RtcCk7CisJdXAoJnVzYmR1eGZhc3RzdWJfdG1wLT5zZW0pOworCXVwKCZzdGFydF9zdG9wX3NlbSk7CisjaWZkZWYgQ09ORklHX0NPTUVESV9ERUJVRworCXByaW50aygiY29tZWRpXzogdXNiZHV4ZmFzdDogZGlzY29ubmVjdGVkIGZyb20gdGhlIHVzYlxuIik7CisjZW5kaWYKK30KKworLy8gaXMgY2FsbGVkIHdoZW4gY29tZWRpLWNvbmZpZyBpcyBjYWxsZWQKK3N0YXRpYyBpbnQgdXNiZHV4ZmFzdF9hdHRhY2goY29tZWRpX2RldmljZSAqIGRldiwgY29tZWRpX2RldmNvbmZpZyAqIGl0KQoreworCWludCByZXQ7CisJaW50IGluZGV4OworCWludCBpOworCWNvbWVkaV9zdWJkZXZpY2UgKnMgPSBOVUxMOworCWRldi0+cHJpdmF0ZSA9IE5VTEw7CisKKwlkb3duKCZzdGFydF9zdG9wX3NlbSk7CisJLy8gZmluZCBhIHZhbGlkIGRldmljZSB3aGljaCBoYXMgYmVlbiBkZXRlY3RlZCBieSB0aGUgcHJvYmUgZnVuY3Rpb24gb2YgdGhlIHVzYgorCWluZGV4ID0gLTE7CisJZm9yIChpID0gMDsgaSA8IE5VTVVTQkRVWEZBU1Q7IGkrKykgeworCQlpZiAoKHVzYmR1eGZhc3RzdWJbaV0ucHJvYmVkKSAmJiAoIXVzYmR1eGZhc3RzdWJbaV0uYXR0YWNoZWQpKSB7CisJCQlpbmRleCA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpbmRleCA8IDApIHsKKwkJcHJpbnRrKCJjb21lZGklZDogdXNiZHV4ZmFzdDogZXJyb3I6IGF0dGFjaCBmYWlsZWQsIG5vIHVzYmR1eGZhc3QgZGV2cyBjb25uZWN0ZWQgdG8gdGhlIHVzYiBidXMuXG4iLCBkZXYtPm1pbm9yKTsKKwkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZG93bigmKHVzYmR1eGZhc3RzdWJbaW5kZXhdLnNlbSkpOworCS8vIHBvaW50ZXIgYmFjayB0byB0aGUgY29ycmVzcG9uZGluZyBjb21lZGkgZGV2aWNlCisJdXNiZHV4ZmFzdHN1YltpbmRleF0uY29tZWRpZGV2ID0gZGV2OworCisJLy8gdHJ5aW5nIHRvIHVwbG9hZCB0aGUgZmlybXdhcmUgaW50byB0aGUgY2hpcAorCWlmIChjb21lZGlfYXV4X2RhdGEoaXQtPm9wdGlvbnMsIDApICYmCisJCWl0LT5vcHRpb25zW0NPTUVESV9ERVZDT05GX0FVWF9EQVRBX0xFTkdUSF0pIHsKKwkJcmVhZF9maXJtd2FyZSh1c2JkdXhmYXN0c3ViLAorCQkJY29tZWRpX2F1eF9kYXRhKGl0LT5vcHRpb25zLCAwKSwKKwkJCWl0LT5vcHRpb25zW0NPTUVESV9ERVZDT05GX0FVWF9EQVRBX0xFTkdUSF0pOworCX0KKworCWRldi0+Ym9hcmRfbmFtZSA9IEJPQVJETkFNRTsKKworCS8qIHNldCBudW1iZXIgb2Ygc3ViZGV2aWNlcyAqLworCWRldi0+bl9zdWJkZXZpY2VzID0gTl9TVUJERVZJQ0VTOworCisJLy8gYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBzdWJkZXZpY2VzCisJaWYgKChyZXQgPSBhbGxvY19zdWJkZXZpY2VzKGRldiwgTl9TVUJERVZJQ0VTKSkgPCAwKSB7CisJCXByaW50aygiY29tZWRpJWQ6IHVzYmR1eGZhc3Q6IGVycm9yIGFsbG9jIHNwYWNlIGZvciBzdWJkZXZcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwcmludGsoImNvbWVkaSVkOiB1c2JkdXhmYXN0OiB1c2ItZGV2aWNlICVkIGlzIGF0dGFjaGVkIHRvIGNvbWVkaS5cbiIsCisJCWRldi0+bWlub3IsIGluZGV4KTsKKwkvLyBwcml2YXRlIHN0cnVjdHVyZSBpcyBhbHNvIHNpbXBseSB0aGUgdXNiLXN0cnVjdHVyZQorCWRldi0+cHJpdmF0ZSA9IHVzYmR1eGZhc3RzdWIgKyBpbmRleDsKKwkvLyB0aGUgZmlyc3Qgc3ViZGV2aWNlIGlzIHRoZSBBL0QgY29udmVydGVyCisJcyA9IGRldi0+c3ViZGV2aWNlcyArIFNVQkRFVl9BRDsKKwkvLyB0aGUgVVJCcyBnZXQgdGhlIGNvbWVkaSBzdWJkZXZpY2UKKwkvLyB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IgcmVhZGluZworCS8vIHRoaXMgaXMgdGhlIHN1YmRldmljZSB3aGljaCByZWFkcyBkYXRhCisJZGV2LT5yZWFkX3N1YmRldiA9IHM7CisJLy8gdGhlIHN1YmRldmljZSByZWNlaXZlcyBhcyBwcml2YXRlIHN0cnVjdHVyZSB0aGUKKwkvLyB1c2Itc3RydWN0dXJlCisJcy0+cHJpdmF0ZSA9IE5VTEw7CisJLy8gYW5hbG9nIGlucHV0CisJcy0+dHlwZSA9IENPTUVESV9TVUJEX0FJOworCS8vIHJlYWRhYmxlIGFuZCByZWYgaXMgdG8gZ3JvdW5kCisJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFIHwgU0RGX0dST1VORCB8IFNERl9DTURfUkVBRDsKKwkvLyAxNiBjaGFubmVscworCXMtPm5fY2hhbiA9IDE2OworCS8vIGxlbmd0aCBvZiB0aGUgY2hhbm5lbGxpc3QKKwlzLT5sZW5fY2hhbmxpc3QgPSAxNjsKKwkvLyBjYWxsYmFjayBmdW5jdGlvbnMKKwlzLT5pbnNuX3JlYWQgPSB1c2JkdXhmYXN0X2FpX2luc25fcmVhZDsKKwlzLT5kb19jbWR0ZXN0ID0gdXNiZHV4ZmFzdF9haV9jbWR0ZXN0OworCXMtPmRvX2NtZCA9IHVzYmR1eGZhc3RfYWlfY21kOworCXMtPmNhbmNlbCA9IHVzYmR1eGZhc3RfYWlfY2FuY2VsOworCS8vIG1heCB2YWx1ZSBmcm9tIHRoZSBBL0QgY29udmVydGVyICgxMmJpdCsxIGJpdCBmb3Igb3ZlcmZsb3cpCisJcy0+bWF4ZGF0YSA9IDB4MTAwMDsKKwkvLyByYW5nZSB0YWJsZSB0byBjb252ZXJ0IHRvIHBoeXNpY2FsIHVuaXRzCisJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfdXNiZHV4ZmFzdF9haV9yYW5nZTsKKworCS8vIGZpbmFsbHkgZGVjaWRlIHRoYXQgaXQncyBhdHRhY2hlZAorCXVzYmR1eGZhc3RzdWJbaW5kZXhdLmF0dGFjaGVkID0gMTsKKworCXVwKCYodXNiZHV4ZmFzdHN1YltpbmRleF0uc2VtKSk7CisKKwl1cCgmc3RhcnRfc3RvcF9zZW0pOworCisJcHJpbnRrKCJjb21lZGklZDogc3VjY2Vzc2Z1bGx5IGF0dGFjaGVkIHRvIHVzYmR1eGZhc3QuXG4iLCBkZXYtPm1pbm9yKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYmR1eGZhc3RfZGV0YWNoKGNvbWVkaV9kZXZpY2UgKiBkZXYpCit7CisJdXNiZHV4ZmFzdHN1Yl90ICp1c2JkdXhmYXN0c3ViX3RtcDsKKworI2lmZGVmIENPTkZJR19DT01FRElfREVCVUcKKwlwcmludGsoImNvbWVkaSVkOiB1c2JkdXhmYXN0OiBkZXRhY2ggdXNiIGRldmljZVxuIiwgZGV2LT5taW5vcik7CisjZW5kaWYKKworCWlmICghZGV2KSB7CisJCXByaW50aygiY29tZWRpPzogdXNiZHV4ZmFzdDogZGV0YWNoIHdpdGhvdXQgZGV2IHZhcmlhYmxlLi4uXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJdXNiZHV4ZmFzdHN1Yl90bXAgPSBkZXYtPnByaXZhdGU7CisJaWYgKCF1c2JkdXhmYXN0c3ViX3RtcCkgeworCQlwcmludGsoImNvbWVkaT86IHVzYmR1eGZhc3Q6IGRldGFjaCB3aXRob3V0IHB0ciB0byB1c2JkdXhmYXN0c3ViW11cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlkb3duKCZ1c2JkdXhmYXN0c3ViX3RtcC0+c2VtKTsKKwlkb3duKCZzdGFydF9zdG9wX3NlbSk7CisJLy8gRG9uJ3QgYWxsb3cgZGV0YWNoIHRvIGZyZWUgdGhlIHByaXZhdGUgc3RydWN0dXJlCisJLy8gSXQncyBvbmUgZW50cnkgb2Ygb2YgdXNiZHV4ZmFzdHN1YltdCisJZGV2LT5wcml2YXRlID0gTlVMTDsKKwl1c2JkdXhmYXN0c3ViX3RtcC0+YXR0YWNoZWQgPSAwOworCXVzYmR1eGZhc3RzdWJfdG1wLT5jb21lZGlkZXYgPSBOVUxMOworI2lmZGVmIENPTkZJR19DT01FRElfREVCVUcKKwlwcmludGsoImNvbWVkaSVkOiB1c2JkdXhmYXN0OiBkZXRhY2g6IHN1Y2Nlc3NmdWxseSByZW1vdmVkXG4iLAorCQlkZXYtPm1pbm9yKTsKKyNlbmRpZgorCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJdXAoJnVzYmR1eGZhc3RzdWJfdG1wLT5zZW0pOworCXJldHVybiAwOworfQorCisvKiBtYWluIGRyaXZlciBzdHJ1Y3QgKi8KK3N0YXRpYyBjb21lZGlfZHJpdmVyIGRyaXZlcl91c2JkdXhmYXN0ID0geworICAgICAgZHJpdmVyX25hbWU6InVzYmR1eGZhc3QiLAorICAgICAgbW9kdWxlOlRISVNfTU9EVUxFLAorICAgICAgYXR0YWNoOnVzYmR1eGZhc3RfYXR0YWNoLAorICAgICAgZGV0YWNoOnVzYmR1eGZhc3RfZGV0YWNoLAorfTsKKworc3RhdGljIHZvaWQgaW5pdF91c2JfZGV2aWNlcyh2b2lkKQoreworCWludCBpbmRleDsKKyNpZmRlZiBDT05GSUdfQ09NRURJX0RFQlVHCisJcHJpbnRrKCJjb21lZGlfOiB1c2JkdXhmYXN0OiBzZXR0aW5nIGFsbCBwb3NzaWJsZSBkZXZzIHRvIGludmFsaWRcbiIpOworI2VuZGlmCisJLy8gYWxsIGRldmljZXMgZW50cmllcyBhcmUgaW52YWxpZCB0byBiZWdpbiB3aXRoCisJLy8gdGhleSB3aWxsIGJlY29tZSB2YWxpZCBieSB0aGUgcHJvYmUgZnVuY3Rpb24KKwkvLyBhbmQgdGhlbiBmaW5hbGx5IGJ5IHRoZSBhdHRhY2gtZnVuY3Rpb24KKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1VU0JEVVhGQVNUOyBpbmRleCsrKSB7CisJCW1lbXNldCgmKHVzYmR1eGZhc3RzdWJbaW5kZXhdKSwgMHgwMCwKKwkJCXNpemVvZih1c2JkdXhmYXN0c3ViW2luZGV4XSkpOworCQlpbml0X01VVEVYKCYodXNiZHV4ZmFzdHN1YltpbmRleF0uc2VtKSk7CisJfQorfQorCisvLyBUYWJsZSB3aXRoIHRoZSBVU0ItZGV2aWNlczoganVzdCBub3cgb25seSB0ZXN0aW5nIElEcworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHVzYmR1eGZhc3RzdWJfdGFibGVbXSA9IHsKKwkvLyAgICAgICAgeyBVU0JfREVWSUNFKDB4NGI0LCAweDg2MTMpLCAvL3Rlc3RpbmcKKwkvLyAgICAgICAgfSwKKwl7VVNCX0RFVklDRSgweDEzZDgsIDB4MDAxMCkJLy9yZWFsIElECisJCX0sCisJe1VTQl9ERVZJQ0UoMHgxM2Q4LCAweDAwMTEpCS8vcmVhbCBJRAorCQl9LAorCXt9CQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCB1c2JkdXhmYXN0c3ViX3RhYmxlKTsKKworLy8gVGhlIHVzYmR1eGZhc3RzdWItZHJpdmVyCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgdXNiZHV4ZmFzdHN1Yl9kcml2ZXIgPSB7CisjaWZkZWYgQ09NRURJX0hBVkVfVVNCX0RSSVZFUl9PV05FUgorICAgICAgb3duZXI6VEhJU19NT0RVTEUsCisjZW5kaWYKKyAgICAgIG5hbWU6Qk9BUkROQU1FLAorICAgICAgcHJvYmU6dXNiZHV4ZmFzdHN1Yl9wcm9iZSwKKyAgICAgIGRpc2Nvbm5lY3Q6dXNiZHV4ZmFzdHN1Yl9kaXNjb25uZWN0LAorICAgICAgaWRfdGFibGU6dXNiZHV4ZmFzdHN1Yl90YWJsZSwKK307CisKKy8vIENhbid0IHVzZSB0aGUgbmljZSBtYWNybyBhcyBJIGhhdmUgYWxzbyB0byBpbml0aWFsaXNlIHRoZSBVU0IKKy8vIHN1YnN5c3RlbToKKy8vIHJlZ2lzdGVyaW5nIHRoZSB1c2Itc3lzdGVtIF9hbmRfIHRoZSBjb21lZGktZHJpdmVyCitzdGF0aWMgaW50IGluaXRfdXNiZHV4ZmFzdCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gS0JVSUxEX01PRE5BTUUgIjogIgorCSAgICAgICBEUklWRVJfVkVSU0lPTiAiOiIgRFJJVkVSX0RFU0MgIlxuIik7CisJaW5pdF91c2JfZGV2aWNlcygpOworCXVzYl9yZWdpc3RlcigmdXNiZHV4ZmFzdHN1Yl9kcml2ZXIpOworCWNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmRyaXZlcl91c2JkdXhmYXN0KTsKKwlyZXR1cm4gMDsKK30KKworLy8gZGVyZWdpc3RlcmluZyB0aGUgY29tZWRpIGRyaXZlciBhbmQgdGhlIHVzYi1zdWJzeXN0ZW0KK3N0YXRpYyB2b2lkIGV4aXRfdXNiZHV4ZmFzdCh2b2lkKQoreworCWNvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyX3VzYmR1eGZhc3QpOworCXVzYl9kZXJlZ2lzdGVyKCZ1c2JkdXhmYXN0c3ViX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGluaXRfdXNiZHV4ZmFzdCk7Cittb2R1bGVfZXhpdChleGl0X3VzYmR1eGZhc3QpOworCitNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvaW50ZXJydXB0LmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2ludGVycnVwdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMzhlNDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2ludGVycnVwdC5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgICAgbGludXgvaW50ZXJydXB0LmggY29tcGF0aWJpbGl0eSBoZWFkZXIKKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19DT01QQVRfTElOVVhfSU5URVJSVVBUX0hfCisjZGVmaW5lIF9fQ09NUEFUX0xJTlVYX0lOVEVSUlVQVF9IXworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpZm5kZWYgSVJRX05PTkUKK3R5cGVkZWYgdm9pZCBpcnFyZXR1cm5fdDsKKyNkZWZpbmUgSVJRX05PTkUKKyNkZWZpbmUgSVJRX0hBTkRMRUQKKyNkZWZpbmUgSVJRX1JFVFZBTCh4KSAodm9pZCkoeCkKKyNlbmRpZgorCisjaWZuZGVmIElSUUZfRElTQUJMRUQKKyNkZWZpbmUgSVJRRl9ESVNBQkxFRCAgICAgICAgICAgU0FfSU5URVJSVVBUCisjZGVmaW5lIElSUUZfU0FNUExFX1JBTkRPTSAgICAgIFNBX1NBTVBMRV9SQU5ET00KKyNkZWZpbmUgSVJRRl9TSEFSRUQgICAgICAgICAgICAgU0FfU0hJUlEKKyNkZWZpbmUgSVJRRl9QUk9CRV9TSEFSRUQgICAgICAgU0FfUFJPQkVJUlEKKyNkZWZpbmUgSVJRRl9QRVJDUFUgICAgICAgICAgICAgU0FfUEVSQ1BVCisjaWZkZWYgU0FfVFJJR0dFUl9NQVNLCisjZGVmaW5lIElSUUZfVFJJR0dFUl9OT05FICAgICAgIDAKKyNkZWZpbmUgSVJRRl9UUklHR0VSX0xPVyAgICAgICAgU0FfVFJJR0dFUl9MT1cKKyNkZWZpbmUgSVJRRl9UUklHR0VSX0hJR0ggICAgICAgU0FfVFJJR0dFUl9ISUdICisjZGVmaW5lIElSUUZfVFJJR0dFUl9GQUxMSU5HICAgIFNBX1RSSUdHRVJfRkFMTElORworI2RlZmluZSBJUlFGX1RSSUdHRVJfUklTSU5HICAgICBTQV9UUklHR0VSX1JJU0lORworI2RlZmluZSBJUlFGX1RSSUdHRVJfTUFTSyAgICAgICBTQV9UUklHR0VSX01BU0sKKyNlbHNlCisjZGVmaW5lIElSUUZfVFJJR0dFUl9OT05FICAgICAgIDAKKyNkZWZpbmUgSVJRRl9UUklHR0VSX0xPVyAgICAgICAgMAorI2RlZmluZSBJUlFGX1RSSUdHRVJfSElHSCAgICAgICAwCisjZGVmaW5lIElSUUZfVFJJR0dFUl9GQUxMSU5HICAgIDAKKyNkZWZpbmUgSVJRRl9UUklHR0VSX1JJU0lORyAgICAgMAorI2RlZmluZSBJUlFGX1RSSUdHRVJfTUFTSyAgICAgICAwCisjZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIFBUX1JFR1NfQVJHCisjZGVmaW5lIFBUX1JFR1NfQ0FMTAorI2RlZmluZSBQVF9SRUdTX05VTEwKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2tjb21lZGlsaWIvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2tjb21lZGlsaWIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZjYzlhZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkva2NvbWVkaWxpYi9NYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKK29iai0kKENPTkZJR19DT01FREkpCSs9IGtjb21lZGlsaWIubworCitrY29tZWRpbGliLW9ianMgOj0JCQkJXAorCQkJZGF0YS5vCQkJXAorCQkJa3N5bXMubwkJCVwKKwkJCWRpby5vCQkJXAorCQkJa2NvbWVkaWxpYl9tYWluLm8JXAorCQkJZ2V0Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkva2NvbWVkaWxpYi9kYXRhLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2tjb21lZGlsaWIvZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YWVjMjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2tjb21lZGlsaWIvZGF0YS5jCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgICAga2NvbWVkaWxpYi9kYXRhLmMKKyAgICBpbXBsZW1lbnRzIGNvbWVkaV9kYXRhXyooKSBmdW5jdGlvbnMKKworICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDAgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI2luY2x1ZGUgIi4uL2NvbWVkaS5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaWxpYi5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgkvKiBmb3IgY29tZWRpX3VkZWxheSgpICovCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKworaW50IGNvbWVkaV9kYXRhX3dyaXRlKGNvbWVkaV90ICogZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2LCB1bnNpZ25lZCBpbnQgY2hhbiwKKwl1bnNpZ25lZCBpbnQgcmFuZ2UsIHVuc2lnbmVkIGludCBhcmVmLCBsc2FtcGxfdCBkYXRhKQoreworCWNvbWVkaV9pbnNuIGluc247CisKKwltZW1zZXQoJmluc24sIDAsIHNpemVvZihpbnNuKSk7CisJaW5zbi5pbnNuID0gSU5TTl9XUklURTsKKwlpbnNuLm4gPSAxOworCWluc24uZGF0YSA9ICZkYXRhOworCWluc24uc3ViZGV2ID0gc3ViZGV2OworCWluc24uY2hhbnNwZWMgPSBDUl9QQUNLKGNoYW4sIHJhbmdlLCBhcmVmKTsKKworCXJldHVybiBjb21lZGlfZG9faW5zbihkZXYsICZpbnNuKTsKK30KKworaW50IGNvbWVkaV9kYXRhX3JlYWQoY29tZWRpX3QgKiBkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsIHVuc2lnbmVkIGludCBjaGFuLAorCXVuc2lnbmVkIGludCByYW5nZSwgdW5zaWduZWQgaW50IGFyZWYsIGxzYW1wbF90ICogZGF0YSkKK3sKKwljb21lZGlfaW5zbiBpbnNuOworCisJbWVtc2V0KCZpbnNuLCAwLCBzaXplb2YoaW5zbikpOworCWluc24uaW5zbiA9IElOU05fUkVBRDsKKwlpbnNuLm4gPSAxOworCWluc24uZGF0YSA9IGRhdGE7CisJaW5zbi5zdWJkZXYgPSBzdWJkZXY7CisJaW5zbi5jaGFuc3BlYyA9IENSX1BBQ0soY2hhbiwgcmFuZ2UsIGFyZWYpOworCisJcmV0dXJuIGNvbWVkaV9kb19pbnNuKGRldiwgJmluc24pOworfQorCitpbnQgY29tZWRpX2RhdGFfcmVhZF9oaW50KGNvbWVkaV90ICogZGV2LCB1bnNpZ25lZCBpbnQgc3ViZGV2LAorCXVuc2lnbmVkIGludCBjaGFuLCB1bnNpZ25lZCBpbnQgcmFuZ2UsIHVuc2lnbmVkIGludCBhcmVmKQoreworCWNvbWVkaV9pbnNuIGluc247CisJbHNhbXBsX3QgZHVtbXlfZGF0YTsKKworCW1lbXNldCgmaW5zbiwgMCwgc2l6ZW9mKGluc24pKTsKKwlpbnNuLmluc24gPSBJTlNOX1JFQUQ7CisJaW5zbi5uID0gMDsKKwlpbnNuLmRhdGEgPSAmZHVtbXlfZGF0YTsKKwlpbnNuLnN1YmRldiA9IHN1YmRldjsKKwlpbnNuLmNoYW5zcGVjID0gQ1JfUEFDSyhjaGFuLCByYW5nZSwgYXJlZik7CisKKwlyZXR1cm4gY29tZWRpX2RvX2luc24oZGV2LCAmaW5zbik7Cit9CisKK2ludCBjb21lZGlfZGF0YV9yZWFkX2RlbGF5ZWQoY29tZWRpX3QgKiBkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsCisJdW5zaWduZWQgaW50IGNoYW4sIHVuc2lnbmVkIGludCByYW5nZSwgdW5zaWduZWQgaW50IGFyZWYsCisJbHNhbXBsX3QgKiBkYXRhLCB1bnNpZ25lZCBpbnQgbmFub19zZWMpCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IGNvbWVkaV9kYXRhX3JlYWRfaGludChkZXYsIHN1YmRldiwgY2hhbiwgcmFuZ2UsIGFyZWYpOworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCisJY29tZWRpX3VkZWxheSgobmFub19zZWMgKyA5OTkpIC8gMTAwMCk7CisKKwlyZXR1cm4gY29tZWRpX2RhdGFfcmVhZChkZXYsIHN1YmRldiwgY2hhbiwgcmFuZ2UsIGFyZWYsIGRhdGEpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9rY29tZWRpbGliL2Rpby5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9rY29tZWRpbGliL2Rpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZjQ4OGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2tjb21lZGlsaWIvZGlvLmMKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAgICBrY29tZWRpbGliL2Rpby5jCisgICAgaW1wbGVtZW50cyBjb21lZGlfZGlvXyooKSBmdW5jdGlvbnMKKworICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDAgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI2luY2x1ZGUgIi4uL2NvbWVkaS5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaWxpYi5oIgorCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKK2ludCBjb21lZGlfZGlvX2NvbmZpZyhjb21lZGlfdCAqIGRldiwgdW5zaWduZWQgaW50IHN1YmRldiwgdW5zaWduZWQgaW50IGNoYW4sCisJdW5zaWduZWQgaW50IGlvKQoreworCWNvbWVkaV9pbnNuIGluc247CisKKwltZW1zZXQoJmluc24sIDAsIHNpemVvZihpbnNuKSk7CisJaW5zbi5pbnNuID0gSU5TTl9DT05GSUc7CisJaW5zbi5uID0gMTsKKwlpbnNuLmRhdGEgPSAmaW87CisJaW5zbi5zdWJkZXYgPSBzdWJkZXY7CisJaW5zbi5jaGFuc3BlYyA9IENSX1BBQ0soY2hhbiwgMCwgMCk7CisKKwlyZXR1cm4gY29tZWRpX2RvX2luc24oZGV2LCAmaW5zbik7Cit9CisKK2ludCBjb21lZGlfZGlvX3JlYWQoY29tZWRpX3QgKiBkZXYsIHVuc2lnbmVkIGludCBzdWJkZXYsIHVuc2lnbmVkIGludCBjaGFuLAorCXVuc2lnbmVkIGludCAqdmFsKQoreworCWNvbWVkaV9pbnNuIGluc247CisKKwltZW1zZXQoJmluc24sIDAsIHNpemVvZihpbnNuKSk7CisJaW5zbi5pbnNuID0gSU5TTl9SRUFEOworCWluc24ubiA9IDE7CisJaW5zbi5kYXRhID0gdmFsOworCWluc24uc3ViZGV2ID0gc3ViZGV2OworCWluc24uY2hhbnNwZWMgPSBDUl9QQUNLKGNoYW4sIDAsIDApOworCisJcmV0dXJuIGNvbWVkaV9kb19pbnNuKGRldiwgJmluc24pOworfQorCitpbnQgY29tZWRpX2Rpb193cml0ZShjb21lZGlfdCAqIGRldiwgdW5zaWduZWQgaW50IHN1YmRldiwgdW5zaWduZWQgaW50IGNoYW4sCisJdW5zaWduZWQgaW50IHZhbCkKK3sKKwljb21lZGlfaW5zbiBpbnNuOworCisJbWVtc2V0KCZpbnNuLCAwLCBzaXplb2YoaW5zbikpOworCWluc24uaW5zbiA9IElOU05fV1JJVEU7CisJaW5zbi5uID0gMTsKKwlpbnNuLmRhdGEgPSAmdmFsOworCWluc24uc3ViZGV2ID0gc3ViZGV2OworCWluc24uY2hhbnNwZWMgPSBDUl9QQUNLKGNoYW4sIDAsIDApOworCisJcmV0dXJuIGNvbWVkaV9kb19pbnNuKGRldiwgJmluc24pOworfQorCitpbnQgY29tZWRpX2Rpb19iaXRmaWVsZChjb21lZGlfdCAqIGRldiwgdW5zaWduZWQgaW50IHN1YmRldiwgdW5zaWduZWQgaW50IG1hc2ssCisJdW5zaWduZWQgaW50ICpiaXRzKQoreworCWNvbWVkaV9pbnNuIGluc247CisJbHNhbXBsX3QgZGF0YVsyXTsKKwlpbnQgcmV0OworCisJbWVtc2V0KCZpbnNuLCAwLCBzaXplb2YoaW5zbikpOworCWluc24uaW5zbiA9IElOU05fQklUUzsKKwlpbnNuLm4gPSAyOworCWluc24uZGF0YSA9IGRhdGE7CisJaW5zbi5zdWJkZXYgPSBzdWJkZXY7CisKKwlkYXRhWzBdID0gbWFzazsKKwlkYXRhWzFdID0gKmJpdHM7CisKKwlyZXQgPSBjb21lZGlfZG9faW5zbihkZXYsICZpbnNuKTsKKworCSpiaXRzID0gZGF0YVsxXTsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2tjb21lZGlsaWIvZ2V0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2tjb21lZGlsaWIvZ2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAwNGFkNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkva2NvbWVkaWxpYi9nZXQuYwpAQCAtMCwwICsxLDI5NCBAQAorLyoKKyAgICBrY29tZWRpbGliL2dldC5jCisgICAgYSBjb21lZGxpYiBpbnRlcmZhY2UgZm9yIGtlcm5lbCBtb2R1bGVzCisKKyAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDAgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI2RlZmluZSBfX05PX1ZFUlNJT05fXworI2luY2x1ZGUgIi4uL2NvbWVkaS5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaWxpYi5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorCitpbnQgY29tZWRpX2dldF9uX3N1YmRldmljZXMoY29tZWRpX3QgKiBkKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisKKwlyZXR1cm4gZGV2LT5uX3N1YmRldmljZXM7Cit9CisKK2ludCBjb21lZGlfZ2V0X3ZlcnNpb25fY29kZShjb21lZGlfdCAqIGQpCit7CisJcmV0dXJuIENPTUVESV9WRVJTSU9OX0NPREU7Cit9CisKK2NvbnN0IGNoYXIgKmNvbWVkaV9nZXRfZHJpdmVyX25hbWUoY29tZWRpX3QgKiBkKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisKKwlyZXR1cm4gZGV2LT5kcml2ZXItPmRyaXZlcl9uYW1lOworfQorCitjb25zdCBjaGFyICpjb21lZGlfZ2V0X2JvYXJkX25hbWUoY29tZWRpX3QgKiBkKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisKKwlyZXR1cm4gZGV2LT5ib2FyZF9uYW1lOworfQorCitpbnQgY29tZWRpX2dldF9zdWJkZXZpY2VfdHlwZShjb21lZGlfdCAqIGQsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKwljb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5zdWJkZXZpY2VzICsgc3ViZGV2aWNlOworCisJcmV0dXJuIHMtPnR5cGU7Cit9CisKK3Vuc2lnbmVkIGludCBjb21lZGlfZ2V0X3N1YmRldmljZV9mbGFncyhjb21lZGlfdCAqIGQsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKwljb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5zdWJkZXZpY2VzICsgc3ViZGV2aWNlOworCisJcmV0dXJuIHMtPnN1YmRldl9mbGFnczsKK30KKworaW50IGNvbWVkaV9maW5kX3N1YmRldmljZV9ieV90eXBlKGNvbWVkaV90ICogZCwgaW50IHR5cGUsIHVuc2lnbmVkIGludCBzdWJkKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisKKwlpZiAoc3ViZCA+IGRldi0+bl9zdWJkZXZpY2VzKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWZvciAoOyBzdWJkIDwgZGV2LT5uX3N1YmRldmljZXM7IHN1YmQrKykgeworCQlpZiAoZGV2LT5zdWJkZXZpY2VzW3N1YmRdLnR5cGUgPT0gdHlwZSkKKwkJCXJldHVybiBzdWJkOworCX0KKwlyZXR1cm4gLTE7Cit9CisKK2ludCBjb21lZGlfZ2V0X25fY2hhbm5lbHMoY29tZWRpX3QgKiBkLCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisJY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+c3ViZGV2aWNlcyArIHN1YmRldmljZTsKKworCXJldHVybiBzLT5uX2NoYW47Cit9CisKK2ludCBjb21lZGlfZ2V0X2xlbl9jaGFubGlzdChjb21lZGlfdCAqIGQsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKwljb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5zdWJkZXZpY2VzICsgc3ViZGV2aWNlOworCisJcmV0dXJuIHMtPmxlbl9jaGFubGlzdDsKK30KKworbHNhbXBsX3QgY29tZWRpX2dldF9tYXhkYXRhKGNvbWVkaV90ICogZCwgdW5zaWduZWQgaW50IHN1YmRldmljZSwKKwl1bnNpZ25lZCBpbnQgY2hhbikKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCWNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXZpY2U7CisKKwlpZiAocy0+bWF4ZGF0YV9saXN0KQorCQlyZXR1cm4gcy0+bWF4ZGF0YV9saXN0W2NoYW5dOworCisJcmV0dXJuIHMtPm1heGRhdGE7Cit9CisKKyNpZmRlZiBLQ09NRURJTElCX0RFUFJFQ0FURUQKK2ludCBjb21lZGlfZ2V0X3JhbmdldHlwZShjb21lZGlfdCAqIGQsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UsCisJdW5zaWduZWQgaW50IGNoYW4pCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKwljb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5zdWJkZXZpY2VzICsgc3ViZGV2aWNlOworCWludCByZXQ7CisKKwlpZiAocy0+cmFuZ2VfdGFibGVfbGlzdCkgeworCQlyZXQgPSBzLT5yYW5nZV90YWJsZV9saXN0W2NoYW5dLT5sZW5ndGg7CisJfSBlbHNlIHsKKwkJcmV0ID0gcy0+cmFuZ2VfdGFibGUtPmxlbmd0aDsKKwl9CisKKwlyZXQgPSByZXQgfCAoZGV2LT5taW5vciA8PCAyOCkgfCAoc3ViZGV2aWNlIDw8IDI0KSB8IChjaGFuIDw8IDE2KTsKKworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworaW50IGNvbWVkaV9nZXRfbl9yYW5nZXMoY29tZWRpX3QgKiBkLCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlLCB1bnNpZ25lZCBpbnQgY2hhbikKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCWNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXZpY2U7CisJaW50IHJldDsKKworCWlmIChzLT5yYW5nZV90YWJsZV9saXN0KSB7CisJCXJldCA9IHMtPnJhbmdlX3RhYmxlX2xpc3RbY2hhbl0tPmxlbmd0aDsKKwl9IGVsc2UgeworCQlyZXQgPSBzLT5yYW5nZV90YWJsZS0+bGVuZ3RoOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBBTFBIQSAobm9uLXBvcnRhYmxlKQorKi8KK2ludCBjb21lZGlfZ2V0X2tyYW5nZShjb21lZGlfdCAqIGQsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UsIHVuc2lnbmVkIGludCBjaGFuLAorCXVuc2lnbmVkIGludCByYW5nZSwgY29tZWRpX2tyYW5nZSAqIGtyYW5nZSkKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCWNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXZpY2U7CisJY29uc3QgY29tZWRpX2xyYW5nZSAqbHI7CisKKwlpZiAocy0+cmFuZ2VfdGFibGVfbGlzdCkgeworCQlsciA9IHMtPnJhbmdlX3RhYmxlX2xpc3RbY2hhbl07CisJfSBlbHNlIHsKKwkJbHIgPSBzLT5yYW5nZV90YWJsZTsKKwl9CisJaWYgKHJhbmdlID49IGxyLT5sZW5ndGgpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW1lbWNweShrcmFuZ2UsIGxyLT5yYW5nZSArIHJhbmdlLCBzaXplb2YoY29tZWRpX2tyYW5nZSkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBTFBIQSAobWF5IGJlIHJlbmFtZWQpCisqLwordW5zaWduZWQgaW50IGNvbWVkaV9nZXRfYnVmX2hlYWRfcG9zKGNvbWVkaV90ICogZCwgdW5zaWduZWQgaW50IHN1YmRldmljZSkKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCWNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXZpY2U7CisJY29tZWRpX2FzeW5jICphc3luYzsKKworCWFzeW5jID0gcy0+YXN5bmM7CisJaWYgKGFzeW5jID09IE5VTEwpCisJCXJldHVybiAwOworCisJcmV0dXJuIGFzeW5jLT5idWZfd3JpdGVfY291bnQ7Cit9CisKK2ludCBjb21lZGlfZ2V0X2J1ZmZlcl9jb250ZW50cyhjb21lZGlfdCAqIGQsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKwljb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5zdWJkZXZpY2VzICsgc3ViZGV2aWNlOworCWNvbWVkaV9hc3luYyAqYXN5bmM7CisJdW5zaWduZWQgaW50IG51bV9ieXRlczsKKworCWlmIChzdWJkZXZpY2UgPj0gZGV2LT5uX3N1YmRldmljZXMpCisJCXJldHVybiAtMTsKKwlhc3luYyA9IHMtPmFzeW5jOworCWlmIChhc3luYyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwludW1fYnl0ZXMgPSBjb21lZGlfYnVmX3JlYWRfbl9hdmFpbGFibGUocy0+YXN5bmMpOworCXJldHVybiBudW1fYnl0ZXM7Cit9CisKKy8qCisgKiBBTFBIQQorKi8KK2ludCBjb21lZGlfc2V0X3VzZXJfaW50X2NvdW50KGNvbWVkaV90ICogZCwgdW5zaWduZWQgaW50IHN1YmRldmljZSwKKwl1bnNpZ25lZCBpbnQgYnVmX3VzZXJfY291bnQpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKwljb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5zdWJkZXZpY2VzICsgc3ViZGV2aWNlOworCWNvbWVkaV9hc3luYyAqYXN5bmM7CisJaW50IG51bV9ieXRlczsKKworCWFzeW5jID0gcy0+YXN5bmM7CisJaWYgKGFzeW5jID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCW51bV9ieXRlcyA9IGJ1Zl91c2VyX2NvdW50IC0gYXN5bmMtPmJ1Zl9yZWFkX2NvdW50OworCWlmIChudW1fYnl0ZXMgPCAwKQorCQlyZXR1cm4gLTE7CisJY29tZWRpX2J1Zl9yZWFkX2FsbG9jKGFzeW5jLCBudW1fYnl0ZXMpOworCWNvbWVkaV9idWZfcmVhZF9mcmVlKGFzeW5jLCBudW1fYnl0ZXMpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjb21lZGlfbWFya19idWZmZXJfcmVhZChjb21lZGlfdCAqIGQsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UsCisJdW5zaWduZWQgaW50IG51bV9ieXRlcykKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCWNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXZpY2U7CisJY29tZWRpX2FzeW5jICphc3luYzsKKworCWlmIChzdWJkZXZpY2UgPj0gZGV2LT5uX3N1YmRldmljZXMpCisJCXJldHVybiAtMTsKKwlhc3luYyA9IHMtPmFzeW5jOworCWlmIChhc3luYyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwljb21lZGlfYnVmX3JlYWRfYWxsb2MoYXN5bmMsIG51bV9ieXRlcyk7CisJY29tZWRpX2J1Zl9yZWFkX2ZyZWUoYXN5bmMsIG51bV9ieXRlcyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGNvbWVkaV9tYXJrX2J1ZmZlcl93cml0dGVuKGNvbWVkaV90ICogZCwgdW5zaWduZWQgaW50IHN1YmRldmljZSwKKwl1bnNpZ25lZCBpbnQgbnVtX2J5dGVzKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisJY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+c3ViZGV2aWNlcyArIHN1YmRldmljZTsKKwljb21lZGlfYXN5bmMgKmFzeW5jOworCWludCBieXRlc193cml0dGVuOworCisJaWYgKHN1YmRldmljZSA+PSBkZXYtPm5fc3ViZGV2aWNlcykKKwkJcmV0dXJuIC0xOworCWFzeW5jID0gcy0+YXN5bmM7CisJaWYgKGFzeW5jID09IE5VTEwpCisJCXJldHVybiAtMTsKKwlieXRlc193cml0dGVuID0gY29tZWRpX2J1Zl93cml0ZV9hbGxvYyhhc3luYywgbnVtX2J5dGVzKTsKKwljb21lZGlfYnVmX3dyaXRlX2ZyZWUoYXN5bmMsIGJ5dGVzX3dyaXR0ZW4pOworCWlmIChieXRlc193cml0dGVuICE9IG51bV9ieXRlcykKKwkJcmV0dXJuIC0xOworCXJldHVybiAwOworfQorCitpbnQgY29tZWRpX2dldF9idWZmZXJfc2l6ZShjb21lZGlfdCAqIGQsIHVuc2lnbmVkIGludCBzdWJkZXYpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKwljb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5zdWJkZXZpY2VzICsgc3ViZGV2OworCWNvbWVkaV9hc3luYyAqYXN5bmM7CisKKwlpZiAoc3ViZGV2ID49IGRldi0+bl9zdWJkZXZpY2VzKQorCQlyZXR1cm4gLTE7CisJYXN5bmMgPSBzLT5hc3luYzsKKwlpZiAoYXN5bmMgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gYXN5bmMtPnByZWFsbG9jX2J1ZnN6OworfQorCitpbnQgY29tZWRpX2dldF9idWZmZXJfb2Zmc2V0KGNvbWVkaV90ICogZCwgdW5zaWduZWQgaW50IHN1YmRldmljZSkKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCWNvbWVkaV9zdWJkZXZpY2UgKnMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXZpY2U7CisJY29tZWRpX2FzeW5jICphc3luYzsKKworCWlmIChzdWJkZXZpY2UgPj0gZGV2LT5uX3N1YmRldmljZXMpCisJCXJldHVybiAtMTsKKwlhc3luYyA9IHMtPmFzeW5jOworCWlmIChhc3luYyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBhc3luYy0+YnVmX3JlYWRfcHRyOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9rY29tZWRpbGliL2tjb21lZGlsaWJfbWFpbi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9rY29tZWRpbGliL2tjb21lZGlsaWJfbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMGZiZGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2tjb21lZGlsaWIva2NvbWVkaWxpYl9tYWluLmMKQEAgLTAsMCArMSw1NjcgQEAKKy8qCisgICAga2NvbWVkaWxpYi9rY29tZWRpbGliLmMKKyAgICBhIGNvbWVkbGliIGludGVyZmFjZSBmb3Iga2VybmVsIG1vZHVsZXMKKworICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisjZGVmaW5lIF9fTk9fVkVSU0lPTl9fCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAiLi4vY29tZWRpLmgiCisjaW5jbHVkZSAiLi4vY29tZWRpbGliLmgiCisjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisKK01PRFVMRV9BVVRIT1IoIkRhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21lZGkga2VybmVsIGxpYnJhcnkiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworY29tZWRpX3QgKmNvbWVkaV9vcGVuKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCXN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqZGV2X2ZpbGVfaW5mbzsKKwljb21lZGlfZGV2aWNlICpkZXY7CisJdW5zaWduZWQgaW50IG1pbm9yOworCisJaWYgKHN0cm5jbXAoZmlsZW5hbWUsICIvZGV2L2NvbWVkaSIsIDExKSAhPSAwKQorCQlyZXR1cm4gTlVMTDsKKworCW1pbm9yID0gc2ltcGxlX3N0cnRvdWwoZmlsZW5hbWUgKyAxMSwgTlVMTCwgMCk7CisKKwlpZiAobWlub3IgPj0gQ09NRURJX05VTV9CT0FSRF9NSU5PUlMpCisJCXJldHVybiBOVUxMOworCisJZGV2X2ZpbGVfaW5mbyA9IGNvbWVkaV9nZXRfZGV2aWNlX2ZpbGVfaW5mbyhtaW5vcik7CisJaWYoZGV2X2ZpbGVfaW5mbyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlkZXYgPSBkZXZfZmlsZV9pbmZvLT5kZXZpY2U7CisKKwlpZihkZXYgPT0gTlVMTCB8fCAhZGV2LT5hdHRhY2hlZCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KGRldi0+ZHJpdmVyLT5tb2R1bGUpKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiAoY29tZWRpX3QgKikgZGV2OworfQorCitjb21lZGlfdCAqY29tZWRpX29wZW5fb2xkKHVuc2lnbmVkIGludCBtaW5vcikKK3sKKwlzdHJ1Y3QgY29tZWRpX2RldmljZV9maWxlX2luZm8gKmRldl9maWxlX2luZm87CisJY29tZWRpX2RldmljZSAqZGV2OworCisJaWYgKG1pbm9yID49IENPTUVESV9OVU1fTUlOT1JTKQorCQlyZXR1cm4gTlVMTDsKKworCWRldl9maWxlX2luZm8gPSBjb21lZGlfZ2V0X2RldmljZV9maWxlX2luZm8obWlub3IpOworCWlmKGRldl9maWxlX2luZm8gPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJZGV2ID0gZGV2X2ZpbGVfaW5mby0+ZGV2aWNlOworCisJaWYoZGV2ID09IE5VTEwgfHwgIWRldi0+YXR0YWNoZWQpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIChjb21lZGlfdCAqKSBkZXY7Cit9CisKK2ludCBjb21lZGlfY2xvc2UoY29tZWRpX3QgKiBkKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisKKwltb2R1bGVfcHV0KGRldi0+ZHJpdmVyLT5tb2R1bGUpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjb21lZGlfbG9nbGV2ZWwoaW50IG5ld2xldmVsKQoreworCXJldHVybiAwOworfQorCit2b2lkIGNvbWVkaV9wZXJyb3IoY29uc3QgY2hhciAqbWVzc2FnZSkKK3sKKwlydF9wcmludGsoIiVzOiB1bmtub3duIGVycm9yXG4iLCBtZXNzYWdlKTsKK30KKworY2hhciAqY29tZWRpX3N0cmVycm9yKGludCBlcnIpCit7CisJcmV0dXJuICJ1bmtub3duIGVycm9yIjsKK30KKworaW50IGNvbWVkaV9maWxlbm8oY29tZWRpX3QgKiBkKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisKKwkvKiByZXR1cm4gc29tZXRoaW5nIHJhbmRvbSAqLworCXJldHVybiBkZXYtPm1pbm9yOworfQorCitpbnQgY29tZWRpX2NvbW1hbmQoY29tZWRpX3QgKiBkLCBjb21lZGlfY21kICogY21kKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisJY29tZWRpX3N1YmRldmljZSAqczsKKwljb21lZGlfYXN5bmMgKmFzeW5jOworCXVuc2lnbmVkIHJ1bmZsYWdzOworCisJaWYgKGNtZC0+c3ViZGV2ID49IGRldi0+bl9zdWJkZXZpY2VzKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXMgPSBkZXYtPnN1YmRldmljZXMgKyBjbWQtPnN1YmRldjsKKwlpZiAocy0+dHlwZSA9PSBDT01FRElfU1VCRF9VTlVTRUQpCisJCXJldHVybiAtRUlPOworCisJYXN5bmMgPSBzLT5hc3luYzsKKwlpZiAoYXN5bmMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAocy0+YnVzeSkKKwkJcmV0dXJuIC1FQlVTWTsKKwlzLT5idXN5ID0gZDsKKworCWlmIChhc3luYy0+Y2JfbWFzayAmIENPTUVESV9DQl9FT1MpCisJCWNtZC0+ZmxhZ3MgfD0gVFJJR19XQUtFX0VPUzsKKworCWFzeW5jLT5jbWQgPSAqY21kOworCisJcnVuZmxhZ3MgPSBTUkZfUlVOTklORzsKKworI2lmZGVmIENPTkZJR19DT01FRElfUlQKKwlpZiAoY29tZWRpX3N3aXRjaF90b19ydChkZXYpID09IDApCisJCXJ1bmZsYWdzIHw9IFNSRl9SVDsKKyNlbmRpZgorCWNvbWVkaV9zZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHMsIH4wLCBydW5mbGFncyk7CisKKwljb21lZGlfcmVzZXRfYXN5bmNfYnVmKGFzeW5jKTsKKworCXJldHVybiBzLT5kb19jbWQoZGV2LCBzKTsKK30KKworaW50IGNvbWVkaV9jb21tYW5kX3Rlc3QoY29tZWRpX3QgKiBkLCBjb21lZGlfY21kICogY21kKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisJY29tZWRpX3N1YmRldmljZSAqczsKKworCWlmIChjbWQtPnN1YmRldiA+PSBkZXYtPm5fc3ViZGV2aWNlcykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgY21kLT5zdWJkZXY7CisJaWYgKHMtPnR5cGUgPT0gQ09NRURJX1NVQkRfVU5VU0VEKQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChzLT5hc3luYyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiBzLT5kb19jbWR0ZXN0KGRldiwgcywgY21kKTsKK30KKworLyoKKyAqCUNPTUVESV9JTlNOCisgKglwZXJmb3JtIGFuIGluc3RydWN0aW9uCisgKi8KK2ludCBjb21lZGlfZG9faW5zbihjb21lZGlfdCAqIGQsIGNvbWVkaV9pbnNuICogaW5zbikKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisJaW50IHJldCA9IDA7CisKKwlpZiAoaW5zbi0+aW5zbiAmIElOU05fTUFTS19TUEVDSUFMKSB7CisJCXN3aXRjaCAoaW5zbi0+aW5zbikgeworCQljYXNlIElOU05fR1RPRDoKKwkJCXsKKwkJCQlzdHJ1Y3QgdGltZXZhbCB0djsKKworCQkJCWRvX2dldHRpbWVvZmRheSgmdHYpOworCQkJCWluc24tPmRhdGFbMF0gPSB0di50dl9zZWM7CisJCQkJaW5zbi0+ZGF0YVsxXSA9IHR2LnR2X3VzZWM7CisJCQkJcmV0ID0gMjsKKworCQkJCWJyZWFrOworCQkJfQorCQljYXNlIElOU05fV0FJVDoKKwkJCS8qIFhYWCBpc24ndCB0aGUgdmFsdWUgc3VwcG9zZWQgdG8gYmUgbmFub3NlY3M/ICovCisJCQlpZiAoaW5zbi0+biAhPSAxIHx8IGluc24tPmRhdGFbMF0gPj0gMTAwKSB7CisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbWVkaV91ZGVsYXkoaW5zbi0+ZGF0YVswXSk7CisJCQlyZXQgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgSU5TTl9JTlRUUklHOgorCQkJaWYgKGluc24tPm4gIT0gMSkgeworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoaW5zbi0+c3ViZGV2ID49IGRldi0+bl9zdWJkZXZpY2VzKSB7CisJCQkJcnRfcHJpbnRrKCIlZCBub3QgdXNhYmxlIHN1YmRldmljZVxuIiwKKwkJCQkJaW5zbi0+c3ViZGV2KTsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCQkJcyA9IGRldi0+c3ViZGV2aWNlcyArIGluc24tPnN1YmRldjsKKwkJCWlmICghcy0+YXN5bmMpIHsKKwkJCQlydF9wcmludGsoIm5vIGFzeW5jXG4iKTsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFzLT5hc3luYy0+aW50dHJpZykgeworCQkJCXJ0X3ByaW50aygibm8gaW50dHJpZ1xuIik7CisJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXJldCA9IHMtPmFzeW5jLT5pbnR0cmlnKGRldiwgcywgaW5zbi0+ZGF0YVswXSk7CisJCQlpZiAocmV0ID49IDApCisJCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIGEgc3ViZGV2aWNlIGluc3RydWN0aW9uICovCisJCWlmIChpbnNuLT5zdWJkZXYgPj0gZGV2LT5uX3N1YmRldmljZXMpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycm9yOworCQl9CisJCXMgPSBkZXYtPnN1YmRldmljZXMgKyBpbnNuLT5zdWJkZXY7CisKKwkJaWYgKHMtPnR5cGUgPT0gQ09NRURJX1NVQkRfVU5VU0VEKSB7CisJCQlydF9wcmludGsoIiVkIG5vdCB1c2VhYmxlIHN1YmRldmljZVxuIiwgaW5zbi0+c3ViZGV2KTsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJLyogWFhYIGNoZWNrIGxvY2sgKi8KKworCQlpZiAoKHJldCA9IGNoZWNrX2NoYW5saXN0KHMsIDEsICZpbnNuLT5jaGFuc3BlYykpIDwgMCkgeworCQkJcnRfcHJpbnRrKCJiYWQgY2hhbnNwZWNcbiIpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQlpZiAocy0+YnVzeSkgeworCQkJcmV0ID0gLUVCVVNZOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlzLT5idXN5ID0gZDsKKworCQlzd2l0Y2ggKGluc24tPmluc24pIHsKKwkJY2FzZSBJTlNOX1JFQUQ6CisJCQlyZXQgPSBzLT5pbnNuX3JlYWQoZGV2LCBzLCBpbnNuLCBpbnNuLT5kYXRhKTsKKwkJCWJyZWFrOworCQljYXNlIElOU05fV1JJVEU6CisJCQlyZXQgPSBzLT5pbnNuX3dyaXRlKGRldiwgcywgaW5zbiwgaW5zbi0+ZGF0YSk7CisJCQlicmVhazsKKwkJY2FzZSBJTlNOX0JJVFM6CisJCQlyZXQgPSBzLT5pbnNuX2JpdHMoZGV2LCBzLCBpbnNuLCBpbnNuLT5kYXRhKTsKKwkJCWJyZWFrOworCQljYXNlIElOU05fQ09ORklHOgorCQkJLyogWFhYIHNob3VsZCBjaGVjayBpbnN0cnVjdGlvbiBsZW5ndGggKi8KKwkJCXJldCA9IHMtPmluc25fY29uZmlnKGRldiwgcywgaW5zbiwgaW5zbi0+ZGF0YSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCXMtPmJ1c3kgPSBOVUxMOworCX0KKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcjsKKyNpZiAwCisJLyogWFhYIGRvIHdlIHdhbnQgdGhpcz8gLS0gYWJib3R0aSAjaWYnZWQgaXQgb3V0IGZvciBub3cuICovCisJaWYgKHJldCAhPSBpbnNuLT5uKSB7CisJCXJ0X3ByaW50aygiQlVHOiByZXN1bHQgb2YgaW5zbiAhPSBpbnNuLm5cbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yOworCX0KKyNlbmRpZgorICAgICAgZXJyb3I6CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorCUNPTUVESV9MT0NLCisJbG9jayBzdWJkZXZpY2UKKworCWFyZzoKKwkJc3ViZGV2aWNlIG51bWJlcgorCisJcmVhZHM6CisJCW5vbmUKKworCXdyaXRlczoKKwkJbm9uZQorCisJbmVjZXNzYXJ5IGxvY2tpbmc6CisJLSBpb2N0bC9ydCBsb2NrICAodGhpcyB0eXBlKQorCS0gbG9jayB3aGlsZSBzdWJkZXZpY2UgYnVzeQorCS0gbG9jayB3aGlsZSBzdWJkZXZpY2UgYmVpbmcgcHJvZ3JhbW1lZAorCisqLworaW50IGNvbWVkaV9sb2NrKGNvbWVkaV90ICogZCwgdW5zaWduZWQgaW50IHN1YmRldmljZSkKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChzdWJkZXZpY2UgPj0gZGV2LT5uX3N1YmRldmljZXMpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXZpY2U7CisKKwljb21lZGlfc3Bpbl9sb2NrX2lycXNhdmUoJnMtPnNwaW5fbG9jaywgZmxhZ3MpOworCisJaWYgKHMtPmJ1c3kpIHsKKwkJcmV0ID0gLUVCVVNZOworCX0gZWxzZSB7CisJCWlmIChzLT5sb2NrKSB7CisJCQlyZXQgPSAtRUJVU1k7CisJCX0gZWxzZSB7CisJCQlzLT5sb2NrID0gZDsKKwkJfQorCX0KKworCWNvbWVkaV9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5zcGluX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisJQ09NRURJX1VOTE9DSworCXVubG9jayBzdWJkZXZpY2UKKworCWFyZzoKKwkJc3ViZGV2aWNlIG51bWJlcgorCisJcmVhZHM6CisJCW5vbmUKKworCXdyaXRlczoKKwkJbm9uZQorCisqLworaW50IGNvbWVkaV91bmxvY2soY29tZWRpX3QgKiBkLCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisJY29tZWRpX3N1YmRldmljZSAqczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWNvbWVkaV9hc3luYyAqYXN5bmM7CisJaW50IHJldDsKKworCWlmIChzdWJkZXZpY2UgPj0gZGV2LT5uX3N1YmRldmljZXMpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXZpY2U7CisKKwlhc3luYyA9IHMtPmFzeW5jOworCisJY29tZWRpX3NwaW5fbG9ja19pcnFzYXZlKCZzLT5zcGluX2xvY2ssIGZsYWdzKTsKKworCWlmIChzLT5idXN5KSB7CisJCXJldCA9IC1FQlVTWTsKKwl9IGVsc2UgaWYgKHMtPmxvY2sgJiYgcy0+bG9jayAhPSAodm9pZCAqKWQpIHsKKwkJcmV0ID0gLUVBQ0NFUzsKKwl9IGVsc2UgeworCQlzLT5sb2NrID0gTlVMTDsKKworCQlpZiAoYXN5bmMpIHsKKwkJCWFzeW5jLT5jYl9tYXNrID0gMDsKKwkJCWFzeW5jLT5jYl9mdW5jID0gTlVMTDsKKwkJCWFzeW5jLT5jYl9hcmcgPSBOVUxMOworCQl9CisKKwkJcmV0ID0gMDsKKwl9CisKKwljb21lZGlfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+c3Bpbl9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorCUNPTUVESV9DQU5DRUwKKwljYW5jZWwgYWNxdWlzaXRpb24gaW9jdGwKKworCWFyZzoKKwkJc3ViZGV2aWNlIG51bWJlcgorCisJcmVhZHM6CisJCW5vdGhpbmcKKworCXdyaXRlczoKKwkJbm90aGluZworCisqLworaW50IGNvbWVkaV9jYW5jZWwoY29tZWRpX3QgKiBkLCB1bnNpZ25lZCBpbnQgc3ViZGV2aWNlKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisJY29tZWRpX3N1YmRldmljZSAqczsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChzdWJkZXZpY2UgPj0gZGV2LT5uX3N1YmRldmljZXMpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXZpY2U7CisKKwlpZiAocy0+bG9jayAmJiBzLT5sb2NrICE9IGQpCisJCXJldHVybiAtRUFDQ0VTOworCisjaWYgMAorCWlmICghcy0+YnVzeSkKKwkJcmV0dXJuIDA7CisKKwlpZiAocy0+YnVzeSAhPSBkKQorCQlyZXR1cm4gLUVCVVNZOworI2VuZGlmCisKKwlpZiAoIXMtPmNhbmNlbCB8fCAhcy0+YXN5bmMpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKChyZXQgPSBzLT5jYW5jZWwoZGV2LCBzKSkpCisJCXJldHVybiByZXQ7CisKKyNpZmRlZiBDT05GSUdfQ09NRURJX1JUCisJaWYgKGNvbWVkaV9nZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHMpICYgU1JGX1JUKSB7CisJCWNvbWVkaV9zd2l0Y2hfdG9fbm9uX3J0KGRldik7CisJfQorI2VuZGlmCisJY29tZWRpX3NldF9zdWJkZXZpY2VfcnVuZmxhZ3MocywgU1JGX1JVTk5JTkcgfCBTUkZfUlQsIDApOworCXMtPmFzeW5jLT5pbnR0cmlnID0gTlVMTDsKKwlzLT5idXN5ID0gTlVMTDsKKworCXJldHVybiAwOworfQorCisvKgorICAgcmVnaXN0cmF0aW9uIG9mIGNhbGxiYWNrIGZ1bmN0aW9ucworICovCitpbnQgY29tZWRpX3JlZ2lzdGVyX2NhbGxiYWNrKGNvbWVkaV90ICogZCwgdW5zaWduZWQgaW50IHN1YmRldmljZSwKKwl1bnNpZ25lZCBpbnQgbWFzaywgaW50ICgqY2IpICh1bnNpZ25lZCBpbnQsIHZvaWQgKiksIHZvaWQgKmFyZykKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisJY29tZWRpX2FzeW5jICphc3luYzsKKworCWlmIChzdWJkZXZpY2UgPj0gZGV2LT5uX3N1YmRldmljZXMpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXZpY2U7CisKKwlhc3luYyA9IHMtPmFzeW5jOworCWlmIChzLT50eXBlID09IENPTUVESV9TVUJEX1VOVVNFRCB8fCAhYXN5bmMpCisJCXJldHVybiAtRUlPOworCisJLyogYXJlIHdlIGxvY2tlZD8gKGlvY3RsIGxvY2spICovCisJaWYgKHMtPmxvY2sgJiYgcy0+bG9jayAhPSBkKQorCQlyZXR1cm4gLUVBQ0NFUzsKKworCS8qIGFyZSB3ZSBidXN5PyAqLworCWlmIChzLT5idXN5KQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKCFtYXNrKSB7CisJCWFzeW5jLT5jYl9tYXNrID0gMDsKKwkJYXN5bmMtPmNiX2Z1bmMgPSBOVUxMOworCQlhc3luYy0+Y2JfYXJnID0gTlVMTDsKKwl9IGVsc2UgeworCQlhc3luYy0+Y2JfbWFzayA9IG1hc2s7CisJCWFzeW5jLT5jYl9mdW5jID0gY2I7CisJCWFzeW5jLT5jYl9hcmcgPSBhcmc7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBjb21lZGlfcG9sbChjb21lZGlfdCAqIGQsIHVuc2lnbmVkIGludCBzdWJkZXZpY2UpCit7CisJY29tZWRpX2RldmljZSAqZGV2ID0gKGNvbWVkaV9kZXZpY2UgKikgZDsKKwljb21lZGlfc3ViZGV2aWNlICpzID0gZGV2LT5zdWJkZXZpY2VzOworCWNvbWVkaV9hc3luYyAqYXN5bmM7CisKKwlpZiAoc3ViZGV2aWNlID49IGRldi0+bl9zdWJkZXZpY2VzKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgc3ViZGV2aWNlOworCisJYXN5bmMgPSBzLT5hc3luYzsKKwlpZiAocy0+dHlwZSA9PSBDT01FRElfU1VCRF9VTlVTRUQgfHwgIWFzeW5jKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIGFyZSB3ZSBsb2NrZWQ/IChpb2N0bCBsb2NrKSAqLworCWlmIChzLT5sb2NrICYmIHMtPmxvY2sgIT0gZCkKKwkJcmV0dXJuIC1FQUNDRVM7CisKKwkvKiBhcmUgd2UgcnVubmluZz8gWFhYIHdyb25nPyAqLworCWlmICghcy0+YnVzeSkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gcy0+cG9sbChkZXYsIHMpOworfQorCisvKiBXQVJOSU5HOiBub3QgcG9ydGFibGUgKi8KK2ludCBjb21lZGlfbWFwKGNvbWVkaV90ICogZCwgdW5zaWduZWQgaW50IHN1YmRldmljZSwgdm9pZCAqcHRyKQoreworCWNvbWVkaV9kZXZpY2UgKmRldiA9IChjb21lZGlfZGV2aWNlICopIGQ7CisJY29tZWRpX3N1YmRldmljZSAqczsKKworCWlmIChzdWJkZXZpY2UgPj0gZGV2LT5uX3N1YmRldmljZXMpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkZXZpY2U7CisKKwlpZiAoIXMtPmFzeW5jKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwdHIpIHsKKwkJKigodm9pZCAqKilwdHIpID0gcy0+YXN5bmMtPnByZWFsbG9jX2J1ZjsKKwl9CisKKwkvKiBYWFggbm8gcmVmZXJlbmNlIGNvdW50aW5nICovCisKKwlyZXR1cm4gMDsKK30KKworLyogV0FSTklORzogbm90IHBvcnRhYmxlICovCitpbnQgY29tZWRpX3VubWFwKGNvbWVkaV90ICogZCwgdW5zaWduZWQgaW50IHN1YmRldmljZSkKK3sKKwljb21lZGlfZGV2aWNlICpkZXYgPSAoY29tZWRpX2RldmljZSAqKSBkOworCWNvbWVkaV9zdWJkZXZpY2UgKnM7CisKKwlpZiAoc3ViZGV2aWNlID49IGRldi0+bl9zdWJkZXZpY2VzKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgc3ViZGV2aWNlOworCisJaWYgKCFzLT5hc3luYykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBYWFggbm8gcmVmZXJlbmNlIGNvdW50aW5nICovCisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkva2NvbWVkaWxpYi9rc3ltcy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9rY29tZWRpbGliL2tzeW1zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZiNDUwNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkva2NvbWVkaWxpYi9rc3ltcy5jCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICAgIGNvbWVkaS9rY29tZWRpbGliL2tzeW1zLmMKKyAgICBhIGNvbWVkbGliIGludGVyZmFjZSBmb3Iga2VybmVsIG1vZHVsZXMKKworICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMSBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisjaWZuZGVmIEVYUE9SVF9TWU1UQUIKKyNkZWZpbmUgRVhQT1JUX1NZTVRBQgorI2VuZGlmCisKKyNpbmNsdWRlICIuLi9jb21lZGkuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlsaWIuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSAweDAyMDIwMAorCisvKiBmdW5jdGlvbnMgc3BlY2lmaWMgdG8ga2NvbWVkaWxpYiAqLworCitFWFBPUlRfU1lNQk9MKGNvbWVkaV9yZWdpc3Rlcl9jYWxsYmFjayk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9nZXRfa3JhbmdlKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2dldF9idWZfaGVhZF9wb3MpOworRVhQT1JUX1NZTUJPTChjb21lZGlfc2V0X3VzZXJfaW50X2NvdW50KTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX21hcCk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV91bm1hcCk7CisKKy8qIFRoaXMgbGlzdCBjb21lcyBmcm9tIHVzZXItc3BhY2UgY29tZWRpbGliLCB0byBzaG93IHdoaWNoCisgKiBmdW5jdGlvbnMgYXJlIG5vdCBwb3J0ZWQgeWV0LiAqLworCitFWFBPUlRfU1lNQk9MKGNvbWVkaV9vcGVuKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2Nsb3NlKTsKKworLyogbG9nZ2luZyAqLworRVhQT1JUX1NZTUJPTChjb21lZGlfbG9nbGV2ZWwpOworRVhQT1JUX1NZTUJPTChjb21lZGlfcGVycm9yKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX3N0cmVycm9yKTsKKy8vRVhQT1JUX1NZTUJPTChjb21lZGlfZXJybm8pOworRVhQT1JUX1NZTUJPTChjb21lZGlfZmlsZW5vKTsKKworLyogZGV2aWNlIHF1ZXJpZXMgKi8KK0VYUE9SVF9TWU1CT0woY29tZWRpX2dldF9uX3N1YmRldmljZXMpOworRVhQT1JUX1NZTUJPTChjb21lZGlfZ2V0X3ZlcnNpb25fY29kZSk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9nZXRfZHJpdmVyX25hbWUpOworRVhQT1JUX1NZTUJPTChjb21lZGlfZ2V0X2JvYXJkX25hbWUpOworCisvKiBzdWJkZXZpY2UgcXVlcmllcyAqLworRVhQT1JUX1NZTUJPTChjb21lZGlfZ2V0X3N1YmRldmljZV90eXBlKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2ZpbmRfc3ViZGV2aWNlX2J5X3R5cGUpOworRVhQT1JUX1NZTUJPTChjb21lZGlfZ2V0X3N1YmRldmljZV9mbGFncyk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9nZXRfbl9jaGFubmVscyk7CisvL0VYUE9SVF9TWU1CT0woY29tZWRpX3JhbmdlX2lzX2NoYW5fc3BlY2lmaWMpOworLy9FWFBPUlRfU1lNQk9MKGNvbWVkaV9tYXhkYXRhX2lzX2NoYW5fc3BlY2lmaWMpOworCisvKiBjaGFubmVsIHF1ZXJpZXMgKi8KK0VYUE9SVF9TWU1CT0woY29tZWRpX2dldF9tYXhkYXRhKTsKKyNpZmRlZiBLQ09NRURJTElCX0RFUFJFQ0FURUQKK0VYUE9SVF9TWU1CT0woY29tZWRpX2dldF9yYW5nZXR5cGUpOworI2VuZGlmCitFWFBPUlRfU1lNQk9MKGNvbWVkaV9nZXRfbl9yYW5nZXMpOworLy9FWFBPUlRfU1lNQk9MKGNvbWVkaV9maW5kX3JhbmdlKTsKKworLyogYnVmZmVyIHF1ZXJpZXMgKi8KK0VYUE9SVF9TWU1CT0woY29tZWRpX2dldF9idWZmZXJfc2l6ZSk7CisvL0VYUE9SVF9TWU1CT0woY29tZWRpX2dldF9tYXhfYnVmZmVyX3NpemUpOworLy9FWFBPUlRfU1lNQk9MKGNvbWVkaV9zZXRfYnVmZmVyX3NpemUpOworRVhQT1JUX1NZTUJPTChjb21lZGlfZ2V0X2J1ZmZlcl9jb250ZW50cyk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9nZXRfYnVmZmVyX29mZnNldCk7CisKKy8qIGxvdy1sZXZlbCBzdHVmZiAqLworLy9FWFBPUlRfU1lNQk9MKGNvbWVkaV90cmlnZ2VyKTsKKy8vRVhQT1JUX1NZTUJPTChjb21lZGlfZG9faW5zbmxpc3QpOworRVhQT1JUX1NZTUJPTChjb21lZGlfZG9faW5zbik7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9sb2NrKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX3VubG9jayk7CisKKy8qIHBoeXNpY2FsIHVuaXRzICovCisvL0VYUE9SVF9TWU1CT0woY29tZWRpX3RvX3BoeXMpOworLy9FWFBPUlRfU1lNQk9MKGNvbWVkaV9mcm9tX3BoeXMpOworCisvKiBzeW5jaHJvbm91cyBzdHVmZiAqLworRVhQT1JUX1NZTUJPTChjb21lZGlfZGF0YV9yZWFkKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2RhdGFfcmVhZF9oaW50KTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2RhdGFfcmVhZF9kZWxheWVkKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2RhdGFfd3JpdGUpOworRVhQT1JUX1NZTUJPTChjb21lZGlfZGlvX2NvbmZpZyk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9kaW9fcmVhZCk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9kaW9fd3JpdGUpOworRVhQT1JUX1NZTUJPTChjb21lZGlfZGlvX2JpdGZpZWxkKTsKKworLyogc2xvd2x5IHZhcnlpbmcgc3R1ZmYgKi8KKy8vRVhQT1JUX1NZTUJPTChjb21lZGlfc3ZfaW5pdCk7CisvL0VYUE9SVF9TWU1CT0woY29tZWRpX3N2X3VwZGF0ZSk7CisvL0VYUE9SVF9TWU1CT0woY29tZWRpX3N2X21lYXN1cmUpOworCisvKiBjb21tYW5kcyAqLworLy9FWFBPUlRfU1lNQk9MKGNvbWVkaV9nZXRfY21kX3NyY19tYXNrKTsKKy8vRVhQT1JUX1NZTUJPTChjb21lZGlfZ2V0X2NtZF9nZW5lcmljX3RpbWVkKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2NhbmNlbCk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9jb21tYW5kKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2NvbW1hbmRfdGVzdCk7CitFWFBPUlRfU1lNQk9MKGNvbWVkaV9wb2xsKTsKKworLyogYnVmZmVyIGNvbmZpZ3VyYXRpb24gKi8KK0VYUE9SVF9TWU1CT0woY29tZWRpX21hcmtfYnVmZmVyX3JlYWQpOworRVhQT1JUX1NZTUJPTChjb21lZGlfbWFya19idWZmZXJfd3JpdHRlbik7CisKKy8vRVhQT1JUX1NZTUJPTChjb21lZGlfZ2V0X3JhbmdlKTsKK0VYUE9SVF9TWU1CT0woY29tZWRpX2dldF9sZW5fY2hhbmxpc3QpOworCisvKiBkZXByZWNhdGVkICovCisvL0VYUE9SVF9TWU1CT0woY29tZWRpX2dldF90aW1lcik7CisvL0VYUE9SVF9TWU1CT0woY29tZWRpX3RpbWVkXzFjaGFuKTsKKworLyogYWxwaGEgKi8KKy8vRVhQT1JUX1NZTUJPTChjb21lZGlfc2V0X2dsb2JhbF9vb3JfYmVoYXZpb3IpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvcGNpX2lkcy5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9wY2lfaWRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYxYmE5MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvcGNpX2lkcy5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19DT01QQVRfTElOVVhfUENJX0lEU19ICisjZGVmaW5lIF9fQ09NUEFUX0xJTlVYX1BDSV9JRFNfSAorCisjaW5jbHVkZSA8bGludXgvcGNpX2lkcy5oPgorCisjaWZuZGVmIFBDSV9WRU5ET1JfSURfQU1DQworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FNQ0MJMHgxMGU4CisjZW5kaWYKKworI2lmbmRlZiBQQ0lfVkVORE9SX0lEX0NCT0FSRFMKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9DQk9BUkRTCTB4MTMwNworI2VuZGlmCisKKyNpZm5kZWYgUENJX1ZFTkRPUl9JRF9RVUFOQ09NCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfUVVBTkNPTQkweDgwMDgKKyNlbmRpZgorCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfUVVBTkNPTV9HUElCCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUVVBTkNPTV9HUElCCTB4MzMwMgorI2VuZGlmCisKKyNlbmRpZiAvLyBfX0NPTVBBVF9MSU5VWF9QQ0lfSURTX0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvcHJvYy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9wcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEyYjcyZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvcHJvYy5jCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICAgIG1vZHVsZS9wcm9jLmMKKyAgICAvcHJvYyBpbnRlcmZhY2UgZm9yIGNvbWVkaQorCisgICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICAgIENvcHlyaWdodCAoQykgMTk5OCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisvKgorCVRoaXMgaXMgc29tZSBzZXJpb3VzIGJsb2F0d2FyZS4KKworCVRha2VuIGZyb20gRGF2ZSBBLidzIFBDTC03MTEgZHJpdmVyLCAnY3V6IEkgdGhvdWdodCBpdAorCXdhcyBjb29sLgorKi8KKworI2RlZmluZSBfX05PX1ZFUlNJT05fXworI2luY2x1ZGUgImNvbWVkaWRldi5oIgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCitpbnQgY29tZWRpX3JlYWRfcHJvY21lbShjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuLAorCWludCAqZW9mLCB2b2lkICpkYXRhKTsKKworZXh0ZXJuIGNvbWVkaV9kcml2ZXIgKmNvbWVkaV9kcml2ZXJzOworCitpbnQgY29tZWRpX3JlYWRfcHJvY21lbShjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuLAorCWludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWludCBpOworCWludCBkZXZpY2VzX3EgPSAwOworCWludCBsID0gMDsKKwljb21lZGlfZHJpdmVyICpkcml2OworCisJbCArPSBzcHJpbnRmKGJ1ZiArIGwsCisJCSJjb21lZGkgdmVyc2lvbiAiIENPTUVESV9SRUxFQVNFICJcbiIKKwkJImZvcm1hdCBzdHJpbmc6ICVzXG4iLAorCQkiXCIlMmQ6ICUtMjBzICUtMjBzICU0ZFwiLGksZHJpdmVyX25hbWUsYm9hcmRfbmFtZSxuX3N1YmRldmljZXMiKTsKKworCWZvciAoaSA9IDA7IGkgPCBDT01FRElfTlVNX0JPQVJEX01JTk9SUzsgaSsrKSB7CisJCXN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqZGV2X2ZpbGVfaW5mbyA9IGNvbWVkaV9nZXRfZGV2aWNlX2ZpbGVfaW5mbyhpKTsKKwkJY29tZWRpX2RldmljZSAqZGV2OworCisJCWlmKGRldl9maWxlX2luZm8gPT0gTlVMTCkgY29udGludWU7CisJCWRldiA9IGRldl9maWxlX2luZm8tPmRldmljZTsKKworCQlpZiAoZGV2LT5hdHRhY2hlZCkgeworCQkJZGV2aWNlc19xID0gMTsKKwkJCWwgKz0gc3ByaW50ZihidWYgKyBsLCAiJTJkOiAlLTIwcyAlLTIwcyAlNGRcbiIsCisJCQkJaSwKKwkJCQlkZXYtPmRyaXZlci0+ZHJpdmVyX25hbWUsCisJCQkJZGV2LT5ib2FyZF9uYW1lLCBkZXYtPm5fc3ViZGV2aWNlcyk7CisJCX0KKwl9CisJaWYgKCFkZXZpY2VzX3EpIHsKKwkJbCArPSBzcHJpbnRmKGJ1ZiArIGwsICJubyBkZXZpY2VzXG4iKTsKKwl9CisKKwlmb3IgKGRyaXYgPSBjb21lZGlfZHJpdmVyczsgZHJpdjsgZHJpdiA9IGRyaXYtPm5leHQpIHsKKwkJbCArPSBzcHJpbnRmKGJ1ZiArIGwsICIlczpcbiIsIGRyaXYtPmRyaXZlcl9uYW1lKTsKKwkJZm9yIChpID0gMDsgaSA8IGRyaXYtPm51bV9uYW1lczsgaSsrKSB7CisJCQlsICs9IHNwcmludGYoYnVmICsgbCwgIiAlc1xuIiwKKwkJCQkqKGNoYXIgKiopKChjaGFyICopZHJpdi0+Ym9hcmRfbmFtZSArCisJCQkJCWkgKiBkcml2LT5vZmZzZXQpKTsKKwkJfQorCQlpZiAoIWRyaXYtPm51bV9uYW1lcykgeworCQkJbCArPSBzcHJpbnRmKGJ1ZiArIGwsICIgJXNcbiIsIGRyaXYtPmRyaXZlcl9uYW1lKTsKKwkJfQorCX0KKworCXJldHVybiBsOworfQorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3ZvaWQgY29tZWRpX3Byb2NfaW5pdCh2b2lkKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqY29tZWRpX3Byb2M7CisKKwljb21lZGlfcHJvYyA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJjb21lZGkiLCBTX0lGUkVHIHwgU19JUlVHTywgMCk7CisJaWYgKGNvbWVkaV9wcm9jKQorCQljb21lZGlfcHJvYy0+cmVhZF9wcm9jID0gY29tZWRpX3JlYWRfcHJvY21lbTsKK30KKwordm9pZCBjb21lZGlfcHJvY19jbGVhbnVwKHZvaWQpCit7CisJcmVtb3ZlX3Byb2NfZW50cnkoImNvbWVkaSIsIDApOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL3JhbmdlLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL3JhbmdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFkYzNjZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvcmFuZ2UuYwpAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAgICBtb2R1bGUvcmFuZ2UuYworICAgIGNvbWVkaSByb3V0aW5lcyBmb3Igdm9sdGFnZSByYW5nZXMKKworICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctOCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisjaW5jbHVkZSAiY29tZWRpZGV2LmgiCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworY29uc3QgY29tZWRpX2xyYW5nZSByYW5nZV9iaXBvbGFyMTAgPSB7IDEsIHtCSVBfUkFOR0UoMTApfSB9OworY29uc3QgY29tZWRpX2xyYW5nZSByYW5nZV9iaXBvbGFyNSA9IHsgMSwge0JJUF9SQU5HRSg1KX0gfTsKK2NvbnN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VfYmlwb2xhcjJfNSA9IHsgMSwge0JJUF9SQU5HRSgyLjUpfSB9OworY29uc3QgY29tZWRpX2xyYW5nZSByYW5nZV91bmlwb2xhcjEwID0geyAxLCB7VU5JX1JBTkdFKDEwKX0gfTsKK2NvbnN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VfdW5pcG9sYXI1ID0geyAxLCB7VU5JX1JBTkdFKDUpfSB9OworY29uc3QgY29tZWRpX2xyYW5nZSByYW5nZV91bmtub3duID0geyAxLCB7ezAsIDEwMDAwMDAsIFVOSVRfbm9uZX19IH07CisKKy8qCisgICAJQ09NRURJX1JBTkdFSU5GTworCXJhbmdlIGluZm9ybWF0aW9uIGlvY3RsCisKKwlhcmc6CisJCXBvaW50ZXIgdG8gcmFuZ2VpbmZvIHN0cnVjdHVyZQorCisJcmVhZHM6CisJCXJhbmdlIGluZm8gc3RydWN0dXJlCisKKwl3cml0ZXM6CisJCW4gY29tZWRpX2tyYW5nZSBzdHJ1Y3R1cmVzIHRvIHJhbmdlaW5mby0+cmFuZ2VfcHRyCisqLworaW50IGRvX3JhbmdlaW5mb19pb2N0bChjb21lZGlfZGV2aWNlICogZGV2LCBjb21lZGlfcmFuZ2VpbmZvICogYXJnKQoreworCWNvbWVkaV9yYW5nZWluZm8gaXQ7CisJaW50IHN1YmQsIGNoYW47CisJY29uc3QgY29tZWRpX2xyYW5nZSAqbHI7CisJY29tZWRpX3N1YmRldmljZSAqczsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmaXQsIGFyZywgc2l6ZW9mKGNvbWVkaV9yYW5nZWluZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJc3ViZCA9IChpdC5yYW5nZV90eXBlID4+IDI0KSAmIDB4ZjsKKwljaGFuID0gKGl0LnJhbmdlX3R5cGUgPj4gMTYpICYgMHhmZjsKKworCWlmICghZGV2LT5hdHRhY2hlZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHN1YmQgPj0gZGV2LT5uX3N1YmRldmljZXMpCisJCXJldHVybiAtRUlOVkFMOworCXMgPSBkZXYtPnN1YmRldmljZXMgKyBzdWJkOworCWlmIChzLT5yYW5nZV90YWJsZSkgeworCQlsciA9IHMtPnJhbmdlX3RhYmxlOworCX0gZWxzZSBpZiAocy0+cmFuZ2VfdGFibGVfbGlzdCkgeworCQlpZiAoY2hhbiA+PSBzLT5uX2NoYW4pCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbHIgPSBzLT5yYW5nZV90YWJsZV9saXN0W2NoYW5dOworCX0gZWxzZSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChSQU5HRV9MRU5HVEgoaXQucmFuZ2VfdHlwZSkgIT0gbHItPmxlbmd0aCkgeworCQlEUFJJTlRLKCJ3cm9uZyBsZW5ndGggJWQgc2hvdWxkIGJlICVkICgweCUwOHgpXG4iLAorCQkJUkFOR0VfTEVOR1RIKGl0LnJhbmdlX3R5cGUpLCBsci0+bGVuZ3RoLCBpdC5yYW5nZV90eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGNvcHlfdG9fdXNlcihpdC5yYW5nZV9wdHIsIGxyLT5yYW5nZSwKKwkJCXNpemVvZihjb21lZGlfa3JhbmdlKSAqIGxyLT5sZW5ndGgpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFyZWZfaW52YWxpZChjb21lZGlfc3ViZGV2aWNlICogcywgdW5zaWduZWQgaW50IGNoYW5zcGVjKQoreworCXVuc2lnbmVkIGludCBhcmVmOworCisJLy8gZGlzYWJsZSByZXBvcnRpbmcgaW52YWxpZCBhcmVmcy4uLiBtYXliZSBzb21lZGF5CisJcmV0dXJuIDA7CisKKwlhcmVmID0gQ1JfQVJFRihjaGFuc3BlYyk7CisJc3dpdGNoIChhcmVmKSB7CisJY2FzZSBBUkVGX0RJRkY6CisJCWlmIChzLT5zdWJkZXZfZmxhZ3MgJiBTREZfRElGRikKKwkJCXJldHVybiAwOworCQlicmVhazsKKwljYXNlIEFSRUZfQ09NTU9OOgorCQlpZiAocy0+c3ViZGV2X2ZsYWdzICYgU0RGX0NPTU1PTikKKwkJCXJldHVybiAwOworCQlicmVhazsKKwljYXNlIEFSRUZfR1JPVU5EOgorCQlpZiAocy0+c3ViZGV2X2ZsYWdzICYgU0RGX0dST1VORCkKKwkJCXJldHVybiAwOworCQlicmVhazsKKwljYXNlIEFSRUZfT1RIRVI6CisJCWlmIChzLT5zdWJkZXZfZmxhZ3MgJiBTREZfT1RIRVIpCisJCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCURQUklOVEsoInN1YmRldmljZSBkb2VzIG5vdCBzdXBwb3J0IGFyZWYgJWkiLCBhcmVmKTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAgIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGVhY2ggZWxlbWVudCBpbiBhIGNoYW5uZWwvZ2FpbiBsaXN0IHRvIG1ha2UKKyAgIG1ha2Ugc3VyZSBpdCBpcyB2YWxpZC4KKyovCitpbnQgY2hlY2tfY2hhbmxpc3QoY29tZWRpX3N1YmRldmljZSAqIHMsIGludCBuLCB1bnNpZ25lZCBpbnQgKmNoYW5saXN0KQoreworCWludCBpOworCWludCBjaGFuOworCisJaWYgKHMtPnJhbmdlX3RhYmxlKSB7CisJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCQlpZiAoQ1JfQ0hBTihjaGFubGlzdFtpXSkgPj0gcy0+bl9jaGFuIHx8CisJCQkJQ1JfUkFOR0UoY2hhbmxpc3RbaV0pID49IHMtPnJhbmdlX3RhYmxlLT5sZW5ndGgKKwkJCQl8fCBhcmVmX2ludmFsaWQocywgY2hhbmxpc3RbaV0pKSB7CisJCQkJcnRfcHJpbnRrCisJCQkJCSgiYmFkIGNoYW5saXN0WyVkXT0weCUwOHggbl9jaGFuPSVkIHJhbmdlIGxlbmd0aD0lZFxuIiwKKwkJCQkJaSwgY2hhbmxpc3RbaV0sIHMtPm5fY2hhbiwKKwkJCQkJcy0+cmFuZ2VfdGFibGUtPmxlbmd0aCk7CisjaWYgMAorCQkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJCQkJcHJpbnRrKCJbJWRdPTB4JTA4eFxuIiwgaSwgY2hhbmxpc3RbaV0pOworCQkJCX0KKyNlbmRpZgorCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCX0gZWxzZSBpZiAocy0+cmFuZ2VfdGFibGVfbGlzdCkgeworCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCQljaGFuID0gQ1JfQ0hBTihjaGFubGlzdFtpXSk7CisJCQlpZiAoY2hhbiA+PSBzLT5uX2NoYW4gfHwKKwkJCQlDUl9SQU5HRShjaGFubGlzdFtpXSkgPj0KKwkJCQlzLT5yYW5nZV90YWJsZV9saXN0W2NoYW5dLT5sZW5ndGgKKwkJCQl8fCBhcmVmX2ludmFsaWQocywgY2hhbmxpc3RbaV0pKSB7CisJCQkJcnRfcHJpbnRrKCJiYWQgY2hhbmxpc3RbJWRdPTB4JTA4eFxuIiwgaSwKKwkJCQkJY2hhbmxpc3RbaV0pOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJcnRfcHJpbnRrKCJjb21lZGk6IChidWcpIG5vIHJhbmdlIHR5cGUgbGlzdCFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL3J0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg1YjgxYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvcnQuYwpAQCAtMCwwICsxLDQxMiBAQAorLyoKKyAgICBjb21lZGkvcnQuYworICAgIGNvbWVkaSBrZXJuZWwgbW9kdWxlCisKKyAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDAgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI3VuZGVmIERFQlVHCisKKyNkZWZpbmUgX19OT19WRVJTSU9OX18KKyNpbmNsdWRlIDxsaW51eC9jb21lZGlkZXYuaD4KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlICJydF9wZW5kX3RxLmgiCisKKyNpZmRlZiBDT05GSUdfQ09NRURJX1JUQUkKKyNpbmNsdWRlIDxydGFpLmg+CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19DT01FRElfRlVTSU9OCisjaW5jbHVkZSA8bnVjbGV1cy9hc20vaGFsLmg+CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19DT01FRElfUlRMCisjaW5jbHVkZSA8cnRsX2NvcmUuaD4KKyNpbmNsdWRlIDxydGxfc3luYy5oPgorI2VuZGlmCisKK3N0cnVjdCBjb21lZGlfaXJxX3N0cnVjdCB7CisJaW50IHJ0OworCWludCBpcnE7CisJIGlycXJldHVybl90KCpoYW5kbGVyKSAoaW50IGlycSwgdm9pZCAqZGV2X2lkIFBUX1JFR1NfQVJHKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWNvbnN0IGNoYXIgKmRldmljZTsKKwljb21lZGlfZGV2aWNlICpkZXZfaWQ7Cit9OworCitzdGF0aWMgaW50IGNvbWVkaV9ydF9nZXRfaXJxKHN0cnVjdCBjb21lZGlfaXJxX3N0cnVjdCAqaXQpOworc3RhdGljIGludCBjb21lZGlfcnRfcmVsZWFzZV9pcnEoc3RydWN0IGNvbWVkaV9pcnFfc3RydWN0ICppdCk7CisKK3N0YXRpYyBzdHJ1Y3QgY29tZWRpX2lycV9zdHJ1Y3QgKmNvbWVkaV9pcnFzW05SX0lSUVNdOworCitpbnQgY29tZWRpX3JlcXVlc3RfaXJxKHVuc2lnbmVkIGlycSwgaXJxcmV0dXJuX3QoKmhhbmRsZXIpIChpbnQsCisJCXZvaWQgKlBUX1JFR1NfQVJHKSwgdW5zaWduZWQgbG9uZyBmbGFncywgY29uc3QgY2hhciAqZGV2aWNlLAorCWNvbWVkaV9kZXZpY2UgKiBkZXZfaWQpCit7CisJc3RydWN0IGNvbWVkaV9pcnFfc3RydWN0ICppdDsKKwlpbnQgcmV0OworCS8qIG51bGwgc2hhcmVkIGludGVycnVwdCBmbGFnLCBzaW5jZSBydCBpbnRlcnJ1cHQgaGFuZGxlcnMgZG8gbm90CisJICogc3VwcG9ydCBpdCwgYW5kIHRoaXMgdmVyc2lvbiBvZiBjb21lZGlfcmVxdWVzdF9pcnEoKSBpcyBvbmx5CisJICogY2FsbGVkIGZvciBrZXJuZWxzIHdpdGggcnQgc3VwcG9ydCAqLworCXVuc2lnbmVkIGxvbmcgdW5zaGFyZWRfZmxhZ3MgPSBmbGFncyAmIH5JUlFGX1NIQVJFRDsKKworCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgaGFuZGxlciwgdW5zaGFyZWRfZmxhZ3MsIGRldmljZSwgZGV2X2lkKTsKKwlpZiAocmV0IDwgMCkgeworCQkvLyB3ZSBmYWlsZWQsIHNvIGZhbGwgYmFjayBvbiBhbGxvd2luZyBzaGFyZWQgaW50ZXJydXB0ICh3aGljaCB3ZSB3b24ndCBldmVyIG1ha2UgUlQpCisJCWlmIChmbGFncyAmIElSUUZfU0hBUkVEKSB7CisJCQlydF9wcmludGsKKwkJCQkoImNvbWVkaTogY2Fubm90IGdldCB1bnNoYXJlZCBpbnRlcnJ1cHQsIHdpbGwgbm90IHVzZSBSVCBpbnRlcnJ1cHRzLlxuIik7CisJCQlyZXQgPSByZXF1ZXN0X2lycShpcnEsIGhhbmRsZXIsIGZsYWdzLCBkZXZpY2UsIGRldl9pZCk7CisJCX0KKwkJaWYgKHJldCA8IDApIHsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9IGVsc2UgeworCQlpdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjb21lZGlfaXJxX3N0cnVjdCksIEdGUF9LRVJORUwpOworCQlpZiAoIWl0KQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJaXQtPmhhbmRsZXIgPSBoYW5kbGVyOworCQlpdC0+aXJxID0gaXJxOworCQlpdC0+ZGV2X2lkID0gZGV2X2lkOworCQlpdC0+ZGV2aWNlID0gZGV2aWNlOworCQlpdC0+ZmxhZ3MgPSB1bnNoYXJlZF9mbGFnczsKKwkJY29tZWRpX2lycXNbaXJxXSA9IGl0OworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCBjb21lZGlfZnJlZV9pcnEodW5zaWduZWQgaW50IGlycSwgY29tZWRpX2RldmljZSAqIGRldl9pZCkKK3sKKwlzdHJ1Y3QgY29tZWRpX2lycV9zdHJ1Y3QgKml0OworCisJZnJlZV9pcnEoaXJxLCBkZXZfaWQpOworCisJaXQgPSBjb21lZGlfaXJxc1tpcnFdOworCWlmIChpdCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAoaXQtPnJ0KSB7CisJCXByaW50aygicmVhbC10aW1lIElSUSBhbGxvY2F0ZWQgYXQgYm9hcmQgcmVtb3ZhbCAoaWdub3JlKVxuIik7CisJCWNvbWVkaV9ydF9yZWxlYXNlX2lycShpdCk7CisJfQorCisJa2ZyZWUoaXQpOworCWNvbWVkaV9pcnFzW2lycV0gPSBOVUxMOworfQorCitpbnQgY29tZWRpX3N3aXRjaF90b19ydChjb21lZGlfZGV2aWNlICogZGV2KQoreworCXN0cnVjdCBjb21lZGlfaXJxX3N0cnVjdCAqaXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWl0ID0gY29tZWRpX2lycXNbZGV2LT5pcnFdOworCS8qIGRyaXZlcnMgbWlnaHQgbm90IGJlIHVzaW5nIGFuIGludGVycnVwdCBmb3IgY29tbWFuZHMsCisJICAgb3Igd2UgbWlnaHQgbm90IGhhdmUgYmVlbiBhYmxlIHRvIGdldCBhbiB1bnNoYXJlZCBpcnEgKi8KKwlpZiAoaXQgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJY29tZWRpX3NwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlpZiAoIWRldi0+cnQpCisJCWNvbWVkaV9ydF9nZXRfaXJxKGl0KTsKKworCWRldi0+cnQrKzsKKwlpdC0+cnQgPSAxOworCisJY29tZWRpX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCit2b2lkIGNvbWVkaV9zd2l0Y2hfdG9fbm9uX3J0KGNvbWVkaV9kZXZpY2UgKiBkZXYpCit7CisJc3RydWN0IGNvbWVkaV9pcnFfc3RydWN0ICppdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaXQgPSBjb21lZGlfaXJxc1tkZXYtPmlycV07CisJaWYgKGl0ID09IE5VTEwpCisJCXJldHVybjsKKworCWNvbWVkaV9zcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOworCisJZGV2LT5ydC0tOworCWlmICghZGV2LT5ydCkKKwkJY29tZWRpX3J0X3JlbGVhc2VfaXJxKGl0KTsKKworCWl0LT5ydCA9IDA7CisKKwljb21lZGlfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOworfQorCit2b2lkIHdha2VfdXBfaW50X2hhbmRsZXIoaW50IGFyZzEsIHZvaWQgKmFyZzIpCit7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCh3YWl0X3F1ZXVlX2hlYWRfdCAqKSBhcmcyKTsKK30KKwordm9pZCBjb21lZGlfcnRfcGVuZF93YWtldXAod2FpdF9xdWV1ZV9oZWFkX3QgKiBxKQoreworCXJ0X3BlbmRfY2FsbCh3YWtlX3VwX2ludF9oYW5kbGVyLCAwLCBxKTsKK30KKworLyogUlRBSSBzZWN0aW9uICovCisjaWZkZWYgQ09ORklHX0NPTUVESV9SVEFJCisKKyNpZm5kZWYgSEFWRV9SVF9SRVFVRVNUX0lSUV9XSVRIX0FSRworI2RlZmluZSBERUNMQVJFX1ZPSURfSVJRKGlycSkgXAorc3RhdGljIHZvaWQgaGFuZGxlX3ZvaWRfaXJxXyAjIyBpcnEgKHZvaWQpeyBoYW5kbGVfdm9pZF9pcnEoaXJxKTt9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV92b2lkX2lycShpbnQgaXJxKQoreworCXN0cnVjdCBjb21lZGlfaXJxX3N0cnVjdCAqaXQ7CisKKwlpdCA9IGNvbWVkaV9pcnFzW2lycV07CisJaWYgKGl0ID09IE5VTEwpIHsKKwkJcnRfcHJpbnRrKCJjb21lZGk6IG51bGwgaXJxIHN0cnVjdD9cbiIpOworCQlyZXR1cm47CisJfQorCWl0LT5oYW5kbGVyKGlycSwgaXQtPmRldl9pZCBQVF9SRUdTX05VTEwpOworCXJ0X2VuYWJsZV9pcnEoaXJxKTsJLy9uZWVkZWQgYnkgcnRhaS1hZGVvcywgc2VlbXMgbGlrZSBpdCBzaG91bGRuJ3QgaHVydCBlYXJsaWVyIHZlcnNpb25zCit9CisKK0RFQ0xBUkVfVk9JRF9JUlEoMCk7CitERUNMQVJFX1ZPSURfSVJRKDEpOworREVDTEFSRV9WT0lEX0lSUSgyKTsKK0RFQ0xBUkVfVk9JRF9JUlEoMyk7CitERUNMQVJFX1ZPSURfSVJRKDQpOworREVDTEFSRV9WT0lEX0lSUSg1KTsKK0RFQ0xBUkVfVk9JRF9JUlEoNik7CitERUNMQVJFX1ZPSURfSVJRKDcpOworREVDTEFSRV9WT0lEX0lSUSg4KTsKK0RFQ0xBUkVfVk9JRF9JUlEoOSk7CitERUNMQVJFX1ZPSURfSVJRKDEwKTsKK0RFQ0xBUkVfVk9JRF9JUlEoMTEpOworREVDTEFSRV9WT0lEX0lSUSgxMik7CitERUNMQVJFX1ZPSURfSVJRKDEzKTsKK0RFQ0xBUkVfVk9JRF9JUlEoMTQpOworREVDTEFSRV9WT0lEX0lSUSgxNSk7CitERUNMQVJFX1ZPSURfSVJRKDE2KTsKK0RFQ0xBUkVfVk9JRF9JUlEoMTcpOworREVDTEFSRV9WT0lEX0lSUSgxOCk7CitERUNMQVJFX1ZPSURfSVJRKDE5KTsKK0RFQ0xBUkVfVk9JRF9JUlEoMjApOworREVDTEFSRV9WT0lEX0lSUSgyMSk7CitERUNMQVJFX1ZPSURfSVJRKDIyKTsKK0RFQ0xBUkVfVk9JRF9JUlEoMjMpOworCit0eXBlZGVmIHZvaWQgKCpWX0ZQX1YpICh2b2lkKTsKK3N0YXRpYyBWX0ZQX1YgaGFuZGxlX3ZvaWRfaXJxX3B0cnNbXSA9IHsKKwloYW5kbGVfdm9pZF9pcnFfMCwKKwloYW5kbGVfdm9pZF9pcnFfMSwKKwloYW5kbGVfdm9pZF9pcnFfMiwKKwloYW5kbGVfdm9pZF9pcnFfMywKKwloYW5kbGVfdm9pZF9pcnFfNCwKKwloYW5kbGVfdm9pZF9pcnFfNSwKKwloYW5kbGVfdm9pZF9pcnFfNiwKKwloYW5kbGVfdm9pZF9pcnFfNywKKwloYW5kbGVfdm9pZF9pcnFfOCwKKwloYW5kbGVfdm9pZF9pcnFfOSwKKwloYW5kbGVfdm9pZF9pcnFfMTAsCisJaGFuZGxlX3ZvaWRfaXJxXzExLAorCWhhbmRsZV92b2lkX2lycV8xMiwKKwloYW5kbGVfdm9pZF9pcnFfMTMsCisJaGFuZGxlX3ZvaWRfaXJxXzE0LAorCWhhbmRsZV92b2lkX2lycV8xNSwKKwloYW5kbGVfdm9pZF9pcnFfMTYsCisJaGFuZGxlX3ZvaWRfaXJxXzE3LAorCWhhbmRsZV92b2lkX2lycV8xOCwKKwloYW5kbGVfdm9pZF9pcnFfMTksCisJaGFuZGxlX3ZvaWRfaXJxXzIwLAorCWhhbmRsZV92b2lkX2lycV8yMSwKKwloYW5kbGVfdm9pZF9pcnFfMjIsCisJaGFuZGxlX3ZvaWRfaXJxXzIzLAorfTsKKworc3RhdGljIGludCBjb21lZGlfcnRfZ2V0X2lycShzdHJ1Y3QgY29tZWRpX2lycV9zdHJ1Y3QgKml0KQoreworCXJ0X3JlcXVlc3RfZ2xvYmFsX2lycShpdC0+aXJxLCBoYW5kbGVfdm9pZF9pcnFfcHRyc1tpdC0+aXJxXSk7CisJcnRfc3RhcnR1cF9pcnEoaXQtPmlycSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb21lZGlfcnRfcmVsZWFzZV9pcnEoc3RydWN0IGNvbWVkaV9pcnFfc3RydWN0ICppdCkKK3sKKwlydF9zaHV0ZG93bl9pcnEoaXQtPmlycSk7CisJcnRfZnJlZV9nbG9iYWxfaXJxKGl0LT5pcnEpOworCXJldHVybiAwOworfQorI2Vsc2UKKworc3RhdGljIGludCBjb21lZGlfcnRfZ2V0X2lycShzdHJ1Y3QgY29tZWRpX2lycV9zdHJ1Y3QgKml0KQoreworCWludCByZXQ7CisKKwlyZXQgPSBydF9yZXF1ZXN0X2dsb2JhbF9pcnFfYXJnKGl0LT5pcnEsIGl0LT5oYW5kbGVyLCBpdC0+ZmxhZ3MsCisJCWl0LT5kZXZpY2UsIGl0LT5kZXZfaWQpOworCWlmIChyZXQgPCAwKSB7CisJCXJ0X3ByaW50aygicnRfcmVxdWVzdF9nbG9iYWxfaXJxX2FyZygpIHJldHVybmVkICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlydF9zdGFydHVwX2lycShpdC0+aXJxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbWVkaV9ydF9yZWxlYXNlX2lycShzdHJ1Y3QgY29tZWRpX2lycV9zdHJ1Y3QgKml0KQoreworCXJ0X3NodXRkb3duX2lycShpdC0+aXJxKTsKKwlydF9mcmVlX2dsb2JhbF9pcnEoaXQtPmlycSk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKwordm9pZCBjb21lZGlfcnRfaW5pdCh2b2lkKQoreworCXJ0X21vdW50X3J0YWkoKTsKKwlydF9wZW5kX3RxX2luaXQoKTsKK30KKwordm9pZCBjb21lZGlfcnRfY2xlYW51cCh2b2lkKQoreworCXJ0X3Vtb3VudF9ydGFpKCk7CisJcnRfcGVuZF90cV9jbGVhbnVwKCk7Cit9CisKKyNlbmRpZgorCisvKiBGdXNpb24gc2VjdGlvbiAqLworI2lmZGVmIENPTkZJR19DT01FRElfRlVTSU9OCisKK3N0YXRpYyB2b2lkIGZ1c2lvbl9oYW5kbGVfaXJxKHVuc2lnbmVkIGludCBpcnEsIHZvaWQgKmNvb2tpZSkKK3sKKwlzdHJ1Y3QgY29tZWRpX2lycV9zdHJ1Y3QgKml0ID0gY29va2llOworCisJaXQtPmhhbmRsZXIoaXJxLCBpdC0+ZGV2X2lkIFBUX1JFR1NfTlVMTCk7CisJcnRoYWxfaXJxX2VuYWJsZShpcnEpOworfQorCitzdGF0aWMgaW50IGNvbWVkaV9ydF9nZXRfaXJxKHN0cnVjdCBjb21lZGlfaXJxX3N0cnVjdCAqaXQpCit7CisJcnRoYWxfaXJxX3JlcXVlc3QoaXQtPmlycSwgZnVzaW9uX2hhbmRsZV9pcnEsIGl0KTsKKwlydGhhbF9pcnFfZW5hYmxlKGl0LT5pcnEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbWVkaV9ydF9yZWxlYXNlX2lycShzdHJ1Y3QgY29tZWRpX2lycV9zdHJ1Y3QgKml0KQoreworCXJ0aGFsX2lycV9kaXNhYmxlKGl0LT5pcnEpOworCXJ0aGFsX2lycV9yZWxlYXNlKGl0LT5pcnEpOworCXJldHVybiAwOworfQorCit2b2lkIGNvbWVkaV9ydF9pbml0KHZvaWQpCit7CisJcnRfcGVuZF90cV9pbml0KCk7Cit9CisKK3ZvaWQgY29tZWRpX3J0X2NsZWFudXAodm9pZCkKK3sKKwlydF9wZW5kX3RxX2NsZWFudXAoKTsKK30KKworI2VuZGlmIC8qQ09ORklHX0NPTUVESV9GVVNJT04gKi8KKworLyogUlRMaW51eCBzZWN0aW9uICovCisjaWZkZWYgQ09ORklHX0NPTUVESV9SVEwKKworc3RhdGljIHVuc2lnbmVkIGludCBoYW5kbGVfcnRsX2lycSh1bnNpZ25lZCBpbnQgaXJxIFBUX1JFR1NfQVJHKQoreworCXN0cnVjdCBjb21lZGlfaXJxX3N0cnVjdCAqaXQ7CisKKwlpdCA9IGNvbWVkaV9pcnFzW2lycV07CisJaWYgKGl0ID09IE5VTEwpCisJCXJldHVybiAwOworCWl0LT5oYW5kbGVyKGlycSwgaXQtPmRldl9pZCBQVF9SRUdTX05VTEwpOworCXJ0bF9oYXJkX2VuYWJsZV9pcnEoaXJxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb21lZGlfcnRfZ2V0X2lycShzdHJ1Y3QgY29tZWRpX2lycV9zdHJ1Y3QgKml0KQoreworCXJ0bF9yZXF1ZXN0X2dsb2JhbF9pcnEoaXQtPmlycSwgaGFuZGxlX3J0bF9pcnEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbWVkaV9ydF9yZWxlYXNlX2lycShzdHJ1Y3QgY29tZWRpX2lycV9zdHJ1Y3QgKml0KQoreworCXJ0bF9mcmVlX2dsb2JhbF9pcnEoaXQtPmlycSk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY29tZWRpX3J0X2luaXQodm9pZCkKK3sKKwlydF9wZW5kX3RxX2luaXQoKTsKK30KKwordm9pZCBjb21lZGlfcnRfY2xlYW51cCh2b2lkKQoreworCXJ0X3BlbmRfdHFfY2xlYW51cCgpOworfQorCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19DT01FRElfUElSUQorc3RhdGljIGludCBjb21lZGlfcnRfZ2V0X2lycShzdHJ1Y3QgY29tZWRpX2lycV9zdHJ1Y3QgKml0KQoreworCWludCByZXQ7CisKKwlmcmVlX2lycShpdC0+aXJxLCBpdC0+ZGV2X2lkKTsKKwlyZXQgPSByZXF1ZXN0X2lycShpdC0+aXJxLCBpdC0+aGFuZGxlciwgaXQtPmZsYWdzIHwgU0FfUFJJT1JJVFksCisJCWl0LT5kZXZpY2UsIGl0LT5kZXZfaWQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjb21lZGlfcnRfcmVsZWFzZV9pcnEoc3RydWN0IGNvbWVkaV9pcnFfc3RydWN0ICppdCkKK3sKKwlpbnQgcmV0OworCisJZnJlZV9pcnEoaXQtPmlycSwgaXQtPmRldl9pZCk7CisJcmV0ID0gcmVxdWVzdF9pcnEoaXQtPmlycSwgaXQtPmhhbmRsZXIsIGl0LT5mbGFncywKKwkJaXQtPmRldmljZSwgaXQtPmRldl9pZCk7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGNvbWVkaV9ydF9pbml0KHZvaWQpCit7CisJLy9ydF9wZW5kX3RxX2luaXQoKTsKK30KKwordm9pZCBjb21lZGlfcnRfY2xlYW51cCh2b2lkKQoreworCS8vcnRfcGVuZF90cV9jbGVhbnVwKCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvcnRfcGVuZF90cS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9ydF9wZW5kX3RxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk1ZjA3NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvcnRfcGVuZF90cS5jCkBAIC0wLDAgKzEsMTEzIEBACisjZGVmaW5lIF9fTk9fVkVSU0lPTl9fCisvKiBydF9wZW5kX3RxLmMgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSAiY29tZWRpZGV2LmgiCS8vIGZvciBydCBzcGlubG9ja3MKKyNpbmNsdWRlICJydF9wZW5kX3RxLmgiCisjaWZkZWYgQ09ORklHX0NPTUVESV9SVEFJCisjaW5jbHVkZSA8cnRhaS5oPgorI2VuZGlmCisjaWZkZWYgQ09ORklHX0NPTUVESV9GVVNJT04KKyNpbmNsdWRlIDxudWNsZXVzL2FzbS9oYWwuaD4KKyNlbmRpZgorI2lmZGVmIENPTkZJR19DT01FRElfUlRMCisjaW5jbHVkZSA8cnRsX2NvcmUuaD4KKyNlbmRpZgorCisjaWZkZWYgc3RhbmRhbG9uZQorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2RlZmluZSBydF9wZW5kX3RxX2luaXQgaW5pdF9tb2R1bGUKKyNkZWZpbmUgcnRfcGVuZF90cV9jbGVhbnVwIGNsZWFudXBfbW9kdWxlCisjZW5kaWYKKwordm9sYXRpbGUgc3RhdGljIHN0cnVjdCBydF9wZW5kX3RxIHJ0X3BlbmRfdHFbUlRfUEVORF9UUV9TSVpFXTsKK3ZvbGF0aWxlIHN0YXRpYyBzdHJ1Y3QgcnRfcGVuZF90cSAqdm9sYXRpbGUgcnRfcGVuZF9oZWFkID0gcnRfcGVuZF90cSwKKwkqdm9sYXRpbGUgcnRfcGVuZF90YWlsID0gcnRfcGVuZF90cTsKK2ludCBydF9wZW5kX3RxX2lycSA9IDA7CitzcGlubG9ja190IHJ0X3BlbmRfdHFfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKKworLy8gV0FSTklORzogZm9sbG93aW5nIGNvZGUgbm90IGNoZWNrZWQgYWdhaW5zdCByYWNlIGNvbmRpdGlvbnMgeWV0LgorI2RlZmluZSBJTkNfQ0lSQ1VMQVJfUFRSKHB0cixiZWdpbixzaXplKSBkbyB7aWYoKysocHRyKT49KGJlZ2luKSsoc2l6ZSkpIChwdHIpPShiZWdpbik7IH0gd2hpbGUoMCkKKyNkZWZpbmUgREVDX0NJUkNVTEFSX1BUUihwdHIsYmVnaW4sc2l6ZSkgZG8ge2lmKC0tKHB0cik8KGJlZ2luKSkgKHB0cik9KGJlZ2luKSsoc2l6ZSktMTsgfSB3aGlsZSgwKQorCitpbnQgcnRfcGVuZF9jYWxsKHZvaWQgKCpmdW5jKSAoaW50IGFyZzEsIHZvaWQgKmFyZzIpLCBpbnQgYXJnMSwgdm9pZCAqYXJnMikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGZ1bmMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHJ0X3BlbmRfdHFfaXJxIDw9IDApCisJCXJldHVybiAtRU5PREVWOworCWNvbWVkaV9zcGluX2xvY2tfaXJxc2F2ZSgmcnRfcGVuZF90cV9sb2NrLCBmbGFncyk7CisJSU5DX0NJUkNVTEFSX1BUUihydF9wZW5kX2hlYWQsIHJ0X3BlbmRfdHEsIFJUX1BFTkRfVFFfU0laRSk7CisJaWYgKHJ0X3BlbmRfaGVhZCA9PSBydF9wZW5kX3RhaWwpIHsKKwkJLy8gb3ZlcmZsb3csIHdlIGp1c3QgcmVmdXNlIHRvIHRha2UgdGhpcyByZXF1ZXN0CisJCURFQ19DSVJDVUxBUl9QVFIocnRfcGVuZF9oZWFkLCBydF9wZW5kX3RxLCBSVF9QRU5EX1RRX1NJWkUpOworCQljb21lZGlfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRfcGVuZF90cV9sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwlydF9wZW5kX2hlYWQtPmZ1bmMgPSBmdW5jOworCXJ0X3BlbmRfaGVhZC0+YXJnMSA9IGFyZzE7CisJcnRfcGVuZF9oZWFkLT5hcmcyID0gYXJnMjsKKwljb21lZGlfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRfcGVuZF90cV9sb2NrLCBmbGFncyk7CisjaWZkZWYgQ09ORklHX0NPTUVESV9SVEFJCisJcnRfcGVuZF9saW51eF9zcnEocnRfcGVuZF90cV9pcnEpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0NPTUVESV9GVVNJT04KKwlydGhhbF9hcGNfc2NoZWR1bGUocnRfcGVuZF90cV9pcnEpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0NPTUVESV9SVEwKKwlydGxfZ2xvYmFsX3BlbmRfaXJxKHJ0X3BlbmRfdHFfaXJxKTsKKworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfQ09NRURJX1JUQUkKK3ZvaWQgcnRfcGVuZF9pcnFfaGFuZGxlcih2b2lkKQorI2VsaWYgZGVmaW5lZChDT05GSUdfQ09NRURJX0ZVU0lPTikKK3ZvaWQgcnRfcGVuZF9pcnFfaGFuZGxlcih2b2lkICpjb29raWUpCisjZWxpZiBkZWZpbmVkKENPTkZJR19DT01FRElfUlRMKQordm9pZCBydF9wZW5kX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldiBQVF9SRUdTX0FSRykKKyNlbmRpZgoreworCXdoaWxlIChydF9wZW5kX2hlYWQgIT0gcnRfcGVuZF90YWlsKSB7CisJCUlOQ19DSVJDVUxBUl9QVFIocnRfcGVuZF90YWlsLCBydF9wZW5kX3RxLCBSVF9QRU5EX1RRX1NJWkUpOworCQlydF9wZW5kX3RhaWwtPmZ1bmMocnRfcGVuZF90YWlsLT5hcmcxLCBydF9wZW5kX3RhaWwtPmFyZzIpOworCX0KK30KKworaW50IHJ0X3BlbmRfdHFfaW5pdCh2b2lkKQoreworCXJ0X3BlbmRfaGVhZCA9IHJ0X3BlbmRfdGFpbCA9IHJ0X3BlbmRfdHE7CisjaWZkZWYgQ09ORklHX0NPTUVESV9SVEFJCisJcnRfcGVuZF90cV9pcnEgPSBydF9yZXF1ZXN0X3NycSgwLCBydF9wZW5kX2lycV9oYW5kbGVyLCBOVUxMKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DT01FRElfRlVTSU9OCisJcnRfcGVuZF90cV9pcnEgPQorCQlydGhhbF9hcGNfYWxsb2MoImNvbWVkaSBBUEMiLCBydF9wZW5kX2lycV9oYW5kbGVyLCBOVUxMKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DT01FRElfUlRMCisJcnRfcGVuZF90cV9pcnEgPSBydGxfZ2V0X3NvZnRfaXJxKHJ0X3BlbmRfaXJxX2hhbmRsZXIsICJydF9wZW5kX2lycSIpOworI2VuZGlmCisJaWYgKHJ0X3BlbmRfdHFfaXJxID4gMCkKKwkJcHJpbnRrKCJydF9wZW5kX3RxOiBSVCBib3R0b20gaGFsZiBzY2hlZHVsZXIgaW5pdGlhbGl6ZWQgT0tcbiIpOworCWVsc2UKKwkJcHJpbnRrKCJydF9wZW5kX3RxOiBydGxfZ2V0X3NvZnRfaXJxIGZhaWxlZFxuIik7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgcnRfcGVuZF90cV9jbGVhbnVwKHZvaWQpCit7CisJcHJpbnRrKCJydF9wZW5kX3RxOiB1bmxvYWRpbmdcbiIpOworI2lmZGVmIENPTkZJR19DT01FRElfUlRBSQorCXJ0X2ZyZWVfc3JxKHJ0X3BlbmRfdHFfaXJxKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DT01FRElfRlVTSU9OCisJcnRoYWxfYXBjX2ZyZWUocnRfcGVuZF90cV9pcnEpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0NPTUVESV9SVEwKKwlmcmVlX2lycShydF9wZW5kX3RxX2lycSwgTlVMTCk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvcnRfcGVuZF90cS5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9ydF9wZW5kX3RxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlZDcxYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvcnRfcGVuZF90cS5oCkBAIC0wLDAgKzEsMTAgQEAKKyNkZWZpbmUgUlRfUEVORF9UUV9TSVpFIDE2CitzdHJ1Y3QgcnRfcGVuZF90cSB7CisJdm9pZCAoKmZ1bmMpIChpbnQgYXJnMSwgdm9pZCAqYXJnMik7CisJaW50IGFyZzE7CisJdm9pZCAqYXJnMjsKK307CitleHRlcm4gaW50IHJ0X3BlbmRfY2FsbCh2b2lkICgqZnVuYykgKGludCBhcmcxLCB2b2lkICphcmcyKSwgaW50IGFyZzEsCisJdm9pZCAqYXJnMik7CitleHRlcm4gaW50IHJ0X3BlbmRfdHFfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIHJ0X3BlbmRfdHFfY2xlYW51cCh2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvd3JhcHBlci5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS93cmFwcGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdmYzY3MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvd3JhcHBlci5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgICAgbGludXgvd3JhcHBlci5oIGNvbXBhdGliaWxpdHkgaGVhZGVyCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fQ09NUEFUX0xJTlVYX1dSQVBQRVJfSF8KKyNkZWZpbmUgX19DT01QQVRfTElOVVhfV1JBUFBFUl9IXworCisjZGVmaW5lIG1lbV9tYXBfcmVzZXJ2ZShwKSAgICAgIHNldF9iaXQoUEdfcmVzZXJ2ZWQsICYoKHApLT5mbGFncykpCisjZGVmaW5lIG1lbV9tYXBfdW5yZXNlcnZlKHApICAgIGNsZWFyX2JpdChQR19yZXNlcnZlZCwgJigocCktPmZsYWdzKSkKKworI2VuZGlmIC8qIF9fQ09NUEFUX0xJTlVYX1dSQVBQRVJfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lY2hvL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvZWNoby9UT0RPCmluZGV4IDFjYTA5YWYuLmY2ZDg1ODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9lY2hvL1RPRE8KKysrIGIvZHJpdmVycy9zdGFnaW5nL2VjaG8vVE9ETwpAQCAtMSw3ICsxLDUgQEAKIFRPRE86CiAJLSBjaGVja3BhdGNoLnBsIGNsZWFudXBzCi0JLSBMaW5kZW50Ci0JLSB0eXBlZGVmIHJlbW92YWxzCiAJLSBoYW5kbGUgYml0X29wZXJhdGlvbnMuaCAobWVyZ2UgaW4gb3IgbWFrZSBwYXJ0IG9mIGNvbW1vbiBjb2RlPykKIAktIHJlbW92ZSBwcm9jIGludGVyZmFjZSwgb25seSB1c2UgZWNoby5oIGludGVyZmFjZSAocHJvYyBpbnRlcmZhY2UgaXMKIAkgIHJhY3kgYW5kIG5vdCBjb3JyZWN0LikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lY2hvL2VjaG8uaCBiL2RyaXZlcnMvc3RhZ2luZy9lY2hvL2VjaG8uaAppbmRleCA5ZmI5NTQzLi4zNGZiODE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZWNoby9lY2hvLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VjaG8vZWNoby5oCkBAIC0xNDksOCArMTQ5LDggQEAKIAlpbnQgTGJnbiwgTGJnbl9hY2MsIExiZ25fdXBwZXIsIExiZ25fdXBwZXJfYWNjOwogCiAJLyogZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBmaWx0ZXIgc3RhdGVzICovCi0JZmlyMTZfc3RhdGVfdCBmaXJfc3RhdGU7Ci0JZmlyMTZfc3RhdGVfdCBmaXJfc3RhdGVfYmc7CisJc3RydWN0IGZpcjE2X3N0YXRlX3QgZmlyX3N0YXRlOworCXN0cnVjdCBmaXIxNl9zdGF0ZV90IGZpcl9zdGF0ZV9iZzsKIAlpbnQxNl90ICpmaXJfdGFwczE2WzJdOwogCiAJLyogREMgYmxvY2tpbmcgZmlsdGVyIHN0YXRlcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VjaG8vZmlyLmggYi9kcml2ZXJzL3N0YWdpbmcvZWNoby9maXIuaAppbmRleCA1NjQ1Y2IxLi5kMzVmMTY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZWNoby9maXIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZWNoby9maXIuaApAQCAtNzIsMzcgKzcyLDM3IEBACiAgICAgMTYgYml0IGludGVnZXIgRklSIGRlc2NyaXB0b3IuIFRoaXMgZGVmaW5lcyB0aGUgd29ya2luZyBzdGF0ZSBmb3IgYSBzaW5nbGUKICAgICBpbnN0YW5jZSBvZiBhbiBGSVIgZmlsdGVyIHVzaW5nIDE2IGJpdCBpbnRlZ2VyIGNvZWZmaWNpZW50cy4KICovCi10eXBlZGVmIHN0cnVjdCB7CitzdHJ1Y3QgZmlyMTZfc3RhdGVfdCB7CiAJaW50IHRhcHM7CiAJaW50IGN1cnJfcG9zOwogCWNvbnN0IGludDE2X3QgKmNvZWZmczsKIAlpbnQxNl90ICpoaXN0b3J5OwotfSBmaXIxNl9zdGF0ZV90OworfTsKIAogLyohCiAgICAgMzIgYml0IGludGVnZXIgRklSIGRlc2NyaXB0b3IuIFRoaXMgZGVmaW5lcyB0aGUgd29ya2luZyBzdGF0ZSBmb3IgYSBzaW5nbGUKICAgICBpbnN0YW5jZSBvZiBhbiBGSVIgZmlsdGVyIHVzaW5nIDMyIGJpdCBpbnRlZ2VyIGNvZWZmaWNpZW50cywgYW5kIGZpbHRlcmluZwogICAgIDE2IGJpdCBpbnRlZ2VyIGRhdGEuCiAqLwotdHlwZWRlZiBzdHJ1Y3Qgeworc3RydWN0IGZpcjMyX3N0YXRlX3QgewogCWludCB0YXBzOwogCWludCBjdXJyX3BvczsKIAljb25zdCBpbnQzMl90ICpjb2VmZnM7CiAJaW50MTZfdCAqaGlzdG9yeTsKLX0gZmlyMzJfc3RhdGVfdDsKK307CiAKIC8qIQogICAgIEZsb2F0aW5nIHBvaW50IEZJUiBkZXNjcmlwdG9yLiBUaGlzIGRlZmluZXMgdGhlIHdvcmtpbmcgc3RhdGUgZm9yIGEgc2luZ2xlCiAgICAgaW5zdGFuY2Ugb2YgYW4gRklSIGZpbHRlciB1c2luZyBmbG9hdGluZyBwb2ludCBjb2VmZmljaWVudHMgYW5kIGRhdGEuCiAqLwotdHlwZWRlZiBzdHJ1Y3Qgeworc3RydWN0IGZpcl9mbG9hdF9zdGF0ZV90IHsKIAlpbnQgdGFwczsKIAlpbnQgY3Vycl9wb3M7CiAJY29uc3QgZmxvYXQgKmNvZWZmczsKIAlmbG9hdCAqaGlzdG9yeTsKLX0gZmlyX2Zsb2F0X3N0YXRlX3Q7Cit9OwogCi1zdGF0aWMgX19pbmxpbmVfXyBjb25zdCBpbnQxNl90ICpmaXIxNl9jcmVhdGUoZmlyMTZfc3RhdGVfdCAqIGZpciwKK3N0YXRpYyBfX2lubGluZV9fIGNvbnN0IGludDE2X3QgKmZpcjE2X2NyZWF0ZShzdHJ1Y3QgZmlyMTZfc3RhdGVfdCAqZmlyLAogCQkJCQkgICAgICBjb25zdCBpbnQxNl90ICogY29lZmZzLCBpbnQgdGFwcykKIHsKIAlmaXItPnRhcHMgPSB0YXBzOwpAQCAtMTE2LDcgKzExNiw3IEBACiAJcmV0dXJuIGZpci0+aGlzdG9yeTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBmaXIxNl9mbHVzaChmaXIxNl9zdGF0ZV90ICogZmlyKQorc3RhdGljIF9faW5saW5lX18gdm9pZCBmaXIxNl9mbHVzaChzdHJ1Y3QgZmlyMTZfc3RhdGVfdCAqZmlyKQogewogI2lmIGRlZmluZWQoVVNFX01NWCkgIHx8ICBkZWZpbmVkKFVTRV9TU0UyKSB8fCBkZWZpbmVkKF9fYmZpbl9fKQogCW1lbXNldChmaXItPmhpc3RvcnksIDAsIDIgKiBmaXItPnRhcHMgKiBzaXplb2YoaW50MTZfdCkpOwpAQCAtMTI1LDcgKzEyNSw3IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBmaXIxNl9mcmVlKGZpcjE2X3N0YXRlX3QgKiBmaXIpCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGZpcjE2X2ZyZWUoc3RydWN0IGZpcjE2X3N0YXRlX3QgKmZpcikKIHsKIAlrZnJlZShmaXItPmhpc3RvcnkpOwogfQpAQCAtMTU3LDE5ICsxNTcsMTkgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQxNl90IGZpcjE2KGZpcjE2X3N0YXRlX3QgKiBmaXIsIGludDE2X3Qgc2FtcGxlKQorc3RhdGljIF9faW5saW5lX18gaW50MTZfdCBmaXIxNihzdHJ1Y3QgZmlyMTZfc3RhdGVfdCAqZmlyLCBpbnQxNl90IHNhbXBsZSkKIHsKIAlpbnQzMl90IHk7CiAjaWYgZGVmaW5lZChVU0VfTU1YKQogCWludCBpOwotCW1teF90ICptbXhfY29lZmZzOwotCW1teF90ICptbXhfaGlzdDsKKwl1bmlvbiBtbXhfdCAqbW14X2NvZWZmczsKKwl1bmlvbiBtbXhfdCAqbW14X2hpc3Q7CiAKIAlmaXItPmhpc3RvcnlbZmlyLT5jdXJyX3Bvc10gPSBzYW1wbGU7CiAJZmlyLT5oaXN0b3J5W2Zpci0+Y3Vycl9wb3MgKyBmaXItPnRhcHNdID0gc2FtcGxlOwogCi0JbW14X2NvZWZmcyA9IChtbXhfdCAqKSBmaXItPmNvZWZmczsKLQltbXhfaGlzdCA9IChtbXhfdCAqKSAmIGZpci0+aGlzdG9yeVtmaXItPmN1cnJfcG9zXTsKKwltbXhfY29lZmZzID0gKHVuaW9uIG1teF90ICopZmlyLT5jb2VmZnM7CisJbW14X2hpc3QgPSAodW5pb24gbW14X3QgKikmZmlyLT5oaXN0b3J5W2Zpci0+Y3Vycl9wb3NdOwogCWkgPSBmaXItPnRhcHM7CiAJcHhvcl9yMnIobW00LCBtbTQpOwogCS8qIDggc2FtcGxlcyBwZXIgaXRlcmF0aW9uLCBzbyB0aGUgZmlsdGVyIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4IGxvbmcuICovCkBAIC0xOTMsMTQgKzE5MywxNCBAQAogCWVtbXMoKTsKICNlbGlmIGRlZmluZWQoVVNFX1NTRTIpCiAJaW50IGk7Ci0JeG1tX3QgKnhtbV9jb2VmZnM7Ci0JeG1tX3QgKnhtbV9oaXN0OworCXVuaW9uIHhtbV90ICp4bW1fY29lZmZzOworCXVuaW9uIHhtbV90ICp4bW1faGlzdDsKIAogCWZpci0+aGlzdG9yeVtmaXItPmN1cnJfcG9zXSA9IHNhbXBsZTsKIAlmaXItPmhpc3RvcnlbZmlyLT5jdXJyX3BvcyArIGZpci0+dGFwc10gPSBzYW1wbGU7CiAKLQl4bW1fY29lZmZzID0gKHhtbV90ICopIGZpci0+Y29lZmZzOwotCXhtbV9oaXN0ID0gKHhtbV90ICopICYgZmlyLT5oaXN0b3J5W2Zpci0+Y3Vycl9wb3NdOworCXhtbV9jb2VmZnMgPSAodW5pb24geG1tX3QgKilmaXItPmNvZWZmczsKKwl4bW1faGlzdCA9ICh1bmlvbiB4bW1fdCAqKSZmaXItPmhpc3RvcnlbZmlyLT5jdXJyX3Bvc107CiAJaSA9IGZpci0+dGFwczsKIAlweG9yX3Iycih4bW00LCB4bW00KTsKIAkvKiAxNiBzYW1wbGVzIHBlciBpdGVyYXRpb24sIHNvIHRoZSBmaWx0ZXIgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2IGxvbmcuICovCkBAIC0yNTAsNyArMjUwLDcgQEAKIAlyZXR1cm4gKGludDE2X3QpICh5ID4+IDE1KTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gY29uc3QgaW50MTZfdCAqZmlyMzJfY3JlYXRlKGZpcjMyX3N0YXRlX3QgKiBmaXIsCitzdGF0aWMgX19pbmxpbmVfXyBjb25zdCBpbnQxNl90ICpmaXIzMl9jcmVhdGUoc3RydWN0IGZpcjMyX3N0YXRlX3QgKmZpciwKIAkJCQkJICAgICAgY29uc3QgaW50MzJfdCAqIGNvZWZmcywgaW50IHRhcHMpCiB7CiAJZmlyLT50YXBzID0gdGFwczsKQEAgLTI2MCwxNyArMjYwLDE3IEBACiAJcmV0dXJuIGZpci0+aGlzdG9yeTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBmaXIzMl9mbHVzaChmaXIzMl9zdGF0ZV90ICogZmlyKQorc3RhdGljIF9faW5saW5lX18gdm9pZCBmaXIzMl9mbHVzaChzdHJ1Y3QgZmlyMzJfc3RhdGVfdCAqZmlyKQogewogCW1lbXNldChmaXItPmhpc3RvcnksIDAsIGZpci0+dGFwcyAqIHNpemVvZihpbnQxNl90KSk7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgZmlyMzJfZnJlZShmaXIzMl9zdGF0ZV90ICogZmlyKQorc3RhdGljIF9faW5saW5lX18gdm9pZCBmaXIzMl9mcmVlKHN0cnVjdCBmaXIzMl9zdGF0ZV90ICpmaXIpCiB7CiAJa2ZyZWUoZmlyLT5oaXN0b3J5KTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gaW50MTZfdCBmaXIzMihmaXIzMl9zdGF0ZV90ICogZmlyLCBpbnQxNl90IHNhbXBsZSkKK3N0YXRpYyBfX2lubGluZV9fIGludDE2X3QgZmlyMzIoc3RydWN0IGZpcjMyX3N0YXRlX3QgKmZpciwgaW50MTZfdCBzYW1wbGUpCiB7CiAJaW50IGk7CiAJaW50MzJfdCB5OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VjaG8vbW14LmggYi9kcml2ZXJzL3N0YWdpbmcvZWNoby9tbXguaAppbmRleCAzNTQxMmVmLi40NGU1Y2ZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZWNoby9tbXguaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZWNoby9tbXguaApAQCAtMjcsNyArMjcsNyBAQAogICogdmFsdWVzIGJ5IFVMTCwgbGVzdCB0aGV5IGJlIHRydW5jYXRlZCBieSB0aGUgY29tcGlsZXIpCiAgKi8KIAotdHlwZWRlZiB1bmlvbiB7Cit1bmlvbiBtbXhfdCB7CiAJbG9uZyBsb25nIHE7CQkvKiBRdWFkd29yZCAoNjQtYml0KSB2YWx1ZSAqLwogCXVuc2lnbmVkIGxvbmcgbG9uZyB1cTsJLyogVW5zaWduZWQgUXVhZHdvcmQgKi8KIAlpbnQgZFsyXTsJCS8qIDIgRG91Ymxld29yZCAoMzItYml0KSB2YWx1ZXMgKi8KQEAgLTM3LDEyICszNywxMiBAQAogCWNoYXIgYls4XTsJCS8qIDggQnl0ZSAoOC1iaXQpIHZhbHVlcyAqLwogCXVuc2lnbmVkIGNoYXIgdWJbOF07CS8qIDggVW5zaWduZWQgQnl0ZSAqLwogCWZsb2F0IHNbMl07CQkvKiBTaW5nbGUtcHJlY2lzaW9uICgzMi1iaXQpIHZhbHVlICovCi19IG1teF90OwkJCS8qIE9uIGFuIDgtYnl0ZSAoNjQtYml0KSBib3VuZGFyeSAqLworfTsJCQkJLyogT24gYW4gOC1ieXRlICg2NC1iaXQpIGJvdW5kYXJ5ICovCiAKIC8qIFNTRSByZWdpc3RlcnMgKi8KLXR5cGVkZWYgdW5pb24gewordW5pb24geG1tX3QgewogCWNoYXIgYlsxNl07Ci19IHhtbV90OworfTsKIAogI2RlZmluZSAgICAgICAgIG1teF9pMnIob3AsaW1tLHJlZykgXAogICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoI29wICIgJTAsICUlIiAjcmVnIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvQmVuY2htYXJrLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0JlbmNobWFyay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZGVlM2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0JlbmNobWFyay5oCkBAIC0wLDAgKzEsNDM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaGVhZGVyIGZpbGUgZm9yIGJlbmNobWFya2luZworCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEJlbmNobWFyay5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICAuLi4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA4LzE2IGQuay46ICBzdGFydCBvZiBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9CRU5DSE1BUktfSF8KKyNkZWZpbmUgX0JFTkNITUFSS19IXworCisjaW5jbHVkZSAiZ2xvYmFsLmgiCisKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfTk9fT1NfKSAmJiAoREVWX1NZU1RFTSA9PSBfREVWX0dOVV9DRjU0OFhfKQorI2luY2x1ZGUgImNvbW1vbi5oIgorCisjZWxpZiAoVEFSR0VUX1NZU1RFTSA9PSBfTElOVVhfKSAmJiBkZWZpbmVkKF9fS0VSTkVMX18pCisKKy8vICAgICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2lmZGVmIENPTkZJR19DT0xERklSRQorI2luY2x1ZGUgPGFzbS9jb2xkZmlyZS5oPgorI2luY2x1ZGUgPGFzbS9tNTQ4NWdwaW8uaD4KKworI2RlZmluZSBCRU5DSE1BUktfU0VUKHgpICAgIE1DRl9HUElPX1BPRFJfUENJQkcgfD0gKDEgPDwgKHgpKQkvLyAoeCsxKQorI2RlZmluZSBCRU5DSE1BUktfUkVTRVQoeCkgIE1DRl9HUElPX1BPRFJfUENJQkcgJj0gfigxIDw8ICh4KSkJLy8gKHgrMSkKKyNkZWZpbmUgQkVOQ0hNQVJLX1RPR0dMRSh4KSBNQ0ZfR1BJT19QT0RSX1BDSUJSIF49ICgxIDw8ICh4IC0gNSkpCisjZWxzZQorI3VuZGVmIEJFTkNITUFSS19NT0RVTEVTCisjZGVmaW5lIEJFTkNITUFSS19NT0RVTEVTICAgICAgICAgICAweDAwMDAwMDAwCisjZW5kaWYKKworI2Vsc2UKKyAgICAvLyBkaXNhYmxlIEJlbmNobWFya2luZworI3VuZGVmIEJFTkNITUFSS19NT0RVTEVTCisjZGVmaW5lIEJFTkNITUFSS19NT0RVTEVTICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZuZGVmIEJFTkNITUFSS19NT0RVTEVTCisjZGVmaW5lIEJFTkNITUFSS19NT0RVTEVTICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNlbmRpZgorCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDEgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wMiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBCRU5DSE1BUktfTU9EXzAzICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDQgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wNSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA2ICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDcgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wOCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA5ICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xMSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBCRU5DSE1BUktfTU9EXzEyICAgICAgICAgICAgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTMgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xNCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE1ICAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTYgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xNyAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE4ICAgICAgICAgICAgICAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTkgICAgICAgICAgICAgICAgICAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yMCAgICAgICAgICAgICAgICAgICAgMHgwMDA4MDAwMAorI2RlZmluZSBCRU5DSE1BUktfTU9EXzIxICAgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjIgICAgICAgICAgICAgICAgICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yMyAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDAwMAorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI0ICAgICAgICAgICAgICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjUgICAgICAgICAgICAgICAgICAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yNiAgICAgICAgICAgICAgICAgICAgMHgwMjAwMDAwMAorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI3ICAgICAgICAgICAgICAgICAgICAweDA0MDAwMDAwCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjggICAgICAgICAgICAgICAgICAgIDB4MDgwMDAwMDAKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yOSAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBCRU5DSE1BUktfTU9EXzMwICAgICAgICAgICAgICAgICAgICAweDIwMDAwMDAwCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMzEgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8zMiAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8wMSkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wMV9TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDFfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDFfVE9HR0xFKHgpICAgICAgQkVOQ0hNQVJLX1RPR0dMRSh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wMV9TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wMV9SRVNFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzAxX1RPR0dMRSh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzAyKQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzAyX1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wMl9SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wMl9UT0dHTEUoeCkgICAgICBCRU5DSE1BUktfVE9HR0xFKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzAyX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzAyX1JFU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDJfVE9HR0xFKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMDMpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDNfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzAzX1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzAzX1RPR0dMRSh4KSAgICAgIEJFTkNITUFSS19UT0dHTEUoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDNfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDNfUkVTRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wM19UT0dHTEUoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8wNCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wNF9TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDRfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDRfVE9HR0xFKHgpICAgICAgQkVOQ0hNQVJLX1RPR0dMRSh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wNF9TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wNF9SRVNFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA0X1RPR0dMRSh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzA1KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA1X1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wNV9SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wNV9UT0dHTEUoeCkgICAgICBCRU5DSE1BUktfVE9HR0xFKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA1X1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA1X1JFU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDVfVE9HR0xFKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMDYpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDZfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA2X1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA2X1RPR0dMRSh4KSAgICAgIEJFTkNITUFSS19UT0dHTEUoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDZfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDZfUkVTRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wNl9UT0dHTEUoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8wNykKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wN19TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDdfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDdfVE9HR0xFKHgpICAgICAgQkVOQ0hNQVJLX1RPR0dMRSh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wN19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wN19SRVNFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA3X1RPR0dMRSh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzA4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA4X1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wOF9SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wOF9UT0dHTEUoeCkgICAgICBCRU5DSE1BUktfVE9HR0xFKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA4X1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA4X1JFU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDhfVE9HR0xFKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMDkpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDlfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA5X1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzA5X1RPR0dMRSh4KSAgICAgIEJFTkNITUFSS19UT0dHTEUoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDlfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMDlfUkVTRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8wOV9UT0dHTEUoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8xMCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xMF9TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTBfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzEwX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzEwX1JFU0VUKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMTEpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTFfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzExX1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xMV9TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xMV9SRVNFVCh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzEyKQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzEyX1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xMl9SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTJfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTJfUkVTRVQoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8xMykKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xM19TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTNfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzEzX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzEzX1JFU0VUKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMTQpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTRfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE0X1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xNF9TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xNF9SRVNFVCh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzE1KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE1X1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xNV9SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTVfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTVfUkVTRVQoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8xNikKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xNl9TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTZfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE2X1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE2X1JFU0VUKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMTcpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTdfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE3X1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xN19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xN19SRVNFVCh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzE4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE4X1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xOF9SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMThfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMThfUkVTRVQoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8xOSkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8xOV9TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMTlfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE5X1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzE5X1JFU0VUKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMjApCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjBfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzIwX1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yMF9TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yMF9SRVNFVCh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzIxKQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzIxX1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yMV9SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjFfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjFfUkVTRVQoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8yMikKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yMl9TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjJfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzIyX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzIyX1JFU0VUKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMjMpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjNfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzIzX1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yM19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yM19SRVNFVCh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzI0KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI0X1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yNF9SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjRfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjRfUkVTRVQoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8yNSkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yNV9TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjVfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI1X1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI1X1JFU0VUKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMjYpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjZfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI2X1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yNl9TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yNl9SRVNFVCh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzI3KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI3X1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yN19SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjdfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjdfUkVTRVQoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8yOCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yOF9TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjhfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI4X1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI4X1JFU0VUKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMjkpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMjlfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzI5X1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yOV9TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8yOV9SRVNFVCh4KQorI2VuZGlmCisKKyNpZiAoQkVOQ0hNQVJLX01PRFVMRVMgJiBCRU5DSE1BUktfTU9EXzMwKQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzMwX1NFVCh4KSAgICAgICAgIEJFTkNITUFSS19TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8zMF9SRVNFVCh4KSAgICAgICBCRU5DSE1BUktfUkVTRVQoeCkKKyNlbHNlCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMzBfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMzBfUkVTRVQoeCkKKyNlbmRpZgorCisjaWYgKEJFTkNITUFSS19NT0RVTEVTICYgQkVOQ0hNQVJLX01PRF8zMSkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8zMV9TRVQoeCkgICAgICAgICBCRU5DSE1BUktfU0VUKHgpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMzFfUkVTRVQoeCkgICAgICAgQkVOQ0hNQVJLX1JFU0VUKHgpCisjZWxzZQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzMxX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzMxX1JFU0VUKHgpCisjZW5kaWYKKworI2lmIChCRU5DSE1BUktfTU9EVUxFUyAmIEJFTkNITUFSS19NT0RfMzIpCisjZGVmaW5lIEJFTkNITUFSS19NT0RfMzJfU0VUKHgpICAgICAgICAgQkVOQ0hNQVJLX1NFVCh4KQorI2RlZmluZSBCRU5DSE1BUktfTU9EXzMyX1JFU0VUKHgpICAgICAgIEJFTkNITUFSS19SRVNFVCh4KQorI2Vsc2UKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8zMl9TRVQoeCkKKyNkZWZpbmUgQkVOQ0hNQVJLX01PRF8zMl9SRVNFVCh4KQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmIC8vIF9CRU5DSE1BUktfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRGVidWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWRlOWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9EZWJ1Zy5oCkBAIC0wLDAgKzEsNzM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgRGVidWcgaW50ZXJmYWNlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRGVidWcuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgLi4uCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0RFQlVHX0hfCisjZGVmaW5lIF9ERUJVR19IXworCisjaW5jbHVkZSAiZ2xvYmFsLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBnbG9iYWwgY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVGhlc2UgZGVmaW5pdGlvbnMgYXJlIGltcG9ydGFudCBmb3IgbGV2ZWwtZGVidWcgdHJhY2VzLgorLy8gQSBtYWNybyBERUJVR19HTEJfTFZMKCkgZGVmaW5lcyB0aGUgY3VycmVudCBkZWJ1Zy1sZXZlbCB1c2luZyBmb2xsb3dpbmcgYmlzLgorLy8gSWYgdGhlIGNvcnJlc3BvbmRpbmcgYml0IGlzIHNldCB0aGVuIHRyYWNlIG1lc3NhZ2Ugd2lsbCBiZSBwcmludGVkIG91dAorLy8gKG9ubHkgaWYgTkRFQlVHIGlzIG5vdCBkZWZpbmVkKS4gVGhlIHVwcGVyIGRlYnVnLWxldmVscyBhcmUgcmVzZXJ2ZWQgZm9yCisvLyB0aGUgZGVidWctbGV2ZWxzIEFMV0FZUywgRVJST1IgYW5kIEFTU0VSVC4KKyNkZWZpbmUgREVCVUdfTFZMXzAxICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIERFQlVHX0xWTF8wMiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBERUJVR19MVkxfMDMgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgREVCVUdfTFZMXzA0ICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIERFQlVHX0xWTF8wNSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBERUJVR19MVkxfMDYgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgREVCVUdfTFZMXzA3ICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIERFQlVHX0xWTF8wOCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBERUJVR19MVkxfMDkgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgREVCVUdfTFZMXzEwICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIERFQlVHX0xWTF8xMSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBERUJVR19MVkxfMTIgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgREVCVUdfTFZMXzEzICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIERFQlVHX0xWTF8xNCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBERUJVR19MVkxfMTUgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgREVCVUdfTFZMXzE2ICAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIERFQlVHX0xWTF8xNyAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBERUJVR19MVkxfMTggICAgICAgICAgICAgICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgREVCVUdfTFZMXzE5ICAgICAgICAgICAgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIERFQlVHX0xWTF8yMCAgICAgICAgICAgICAgICAgICAgMHgwMDA4MDAwMAorI2RlZmluZSBERUJVR19MVkxfMjEgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgREVCVUdfTFZMXzIyICAgICAgICAgICAgICAgICAgICAweDAwMjAwMDAwCisjZGVmaW5lIERFQlVHX0xWTF8yMyAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDAwMAorI2RlZmluZSBERUJVR19MVkxfMjQgICAgICAgICAgICAgICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgREVCVUdfTFZMXzI1ICAgICAgICAgICAgICAgICAgICAweDAxMDAwMDAwCisjZGVmaW5lIERFQlVHX0xWTF8yNiAgICAgICAgICAgICAgICAgICAgMHgwMjAwMDAwMAorI2RlZmluZSBERUJVR19MVkxfMjcgICAgICAgICAgICAgICAgICAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgREVCVUdfTFZMXzI4ICAgICAgICAgICAgICAgICAgICAweDA4MDAwMDAwCisjZGVmaW5lIERFQlVHX0xWTF8yOSAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBERUJVR19MVkxfQVNTRVJUICAgICAgICAgICAgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgREVCVUdfTFZMX0VSUk9SICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIERFQlVHX0xWTF9BTFdBWVMgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZ2xvYmFsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZ2xvYmFsIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBnbG9iYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGdsb2JhbCBtYWNyb3MKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0aGlzIG1hY3JvIGRlZmluZXMgYSB2ZXJzaW9uIHN0cmluZworCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0aGlzIG1hY3JvIGRlZmluZXMgYSBidWlsZCBpbmZvIHN0cmluZyAoZS5nLiBmb3IgdXNpbmcgaW4gcHJpbnRmKCkpCisjZGVmaW5lIERFQlVHX01BS0VfQlVJTERfSU5GTyhwcmVmaXgscHJvZHVjdCxwcm9kaWQsZGVzY3IsdmVyc3RyLGF1dGhvcikgIlxuIiBcCisgICAgcHJlZml4ICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIgXAorICAgIHByZWZpeCAiUHJvamVjdDogICAiIHByb2R1Y3QgIiwgIiBwcm9kaWQgICAgICAgICAgICAgICAgICAiXG4iIFwKKyAgICBwcmVmaXggIkRlc2NyaXB0LjogIiBkZXNjciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIiBcCisgICAgcHJlZml4ICJBdXRob3I6ICAgICIgYXV0aG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiIgXAorICAgIHByZWZpeCAiRGF0ZTogICAgICAiIF9fREFURV9fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG4iIFwKKyAgICBwcmVmaXggIlZlcnNpb246ICAgIiB2ZXJzdHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIiBcCisgICAgcHJlZml4ICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGhlIGRlZmF1bHQgZGVidWctbGV2ZWwgaXM6IEVSUk9SIGFuZCBBTFdBWVMuCisvLyBZb3UgY2FuIGRlZmluZSBhbiBvdGhlciBkZWJ1Zy1sZXZlbCBpbiBwcm9qZWN0IHNldHRpbmdzLgorI2lmbmRlZiBERUZfREVCVUdfTFZMCisjZGVmaW5lIERFRl9ERUJVR19MVkwgICAgICAgICAgICAgICAgICAgKERFQlVHX0xWTF9BTFdBWVMgfCBERUJVR19MVkxfRVJST1IpCisjZW5kaWYKKyNpZm5kZWYgREVCVUdfR0xCX0xWTAorI2RlZmluZSBERUJVR19HTEJfTFZMKCkgICAgICAgICAgICAgICAgIChERUZfREVCVUdfTFZMKQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgKERFVl9TWVNURU0gPT0gX0RFVl9XSU4zMl8pICYmIGRlZmluZWQgKFRSQUNFX01TRykKKworICAgIC8vIEZvciBXSU4zMiB0aGUgbWFjcm8gREVCVUdfVFJBQ0UwIGNhbiBiZSBkZWZpbmVkIGFzIGZ1bmN0aW9uIGNhbGwgVHJhY2VMdmwoKQorICAgIC8vIG9yIGFzIG1hY3JvIFRSQUNFKCkuCisgICAgLy8KKyAgICAvLyBIZXJlIHRoZSBwYXJhbWV0ZXIgJ2x2bCcgY2FuIGJlIHVzZWQgd2l0aCBtb3JlIHRoYW4gb25lCisgICAgLy8gZGVidWctbGV2ZWwgKHVzaW5nIE9SKS4KKyAgICAvLworICAgIC8vIEV4YW1wbGU6IERFQlVHX1RSQUNFMShERUJVR19MVkxfMzAgfCBERUJVR19MVkxfMDIsICJIZWxsbyAlZCIsIGJDb3VudCk7CisKKyNkZWZpbmUgREVCVUdfVFJBQ0UwKGx2bCxzdHIpICAgICAgICAgICAgICAgVHJhY2VMdmwoKGx2bCksc3RyKQorI2RlZmluZSBERUJVR19UUkFDRTEobHZsLHN0cixwMSkgICAgICAgICAgICBUcmFjZUx2bCgobHZsKSxzdHIscDEpCisjZGVmaW5lIERFQlVHX1RSQUNFMihsdmwsc3RyLHAxLHAyKSAgICAgICAgIFRyYWNlTHZsKChsdmwpLHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfVFJBQ0UzKGx2bCxzdHIscDEscDIscDMpICAgICAgVHJhY2VMdmwoKGx2bCksc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19UUkFDRTQobHZsLHN0cixwMSxwMixwMyxwNCkgICBUcmFjZUx2bCgobHZsKSxzdHIscDEscDIscDMscDQpCisjZGVmaW5lIERFQlVHX0dMQl9MVkwoKSAgICAgICAgICAgICAgICAgICAgIGR3RGVidWdMZXZlbF9nCisKKyNlbHNlCisKKyAgICAvLyBBdCBtaWNyb2NvbnRyb2xsZXJzIHdlIGRvIHJlZHVjZSB0aGUgbWVtb3J5IHVzYWdlIGJ5IGRlbGV0aW5nIERFQlVHX1RSQUNFLWxpbmVzCisgICAgLy8gKGNvbXBpbGVyIGRvZXMgZGVsZXRlIHRoZSBsaW5lcykuCisgICAgLy8KKyAgICAvLyBIZXJlIHRoZSBwYXJhbWV0ZXIgJ2x2bCcgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIG9uZSBkZWJ1Zy1sZXZlbC4KKyAgICAvLworICAgIC8vIEV4YW1wbGU6IERFQlVHX1RSQUNFMShERUJVR19MVkxfRVJST1IsICJlcnJvciBjb2RlICVkIiwgZHdSZXQpOworCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF9BTFdBWVMpCisjZGVmaW5lIERFQlVHX0xWTF9BTFdBWVNfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMX0FMV0FZU19UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfQUxXQVlTX1RSQUNFMihzdHIscDEscDIpICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF9BTFdBWVNfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMX0FMV0FZU19UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMX0FMV0FZU19UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfQUxXQVlTX1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF9BTFdBWVNfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMX0FMV0FZU19UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfQUxXQVlTX1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfRVJST1IpCisjZGVmaW5lIERFQlVHX0xWTF9FUlJPUl9UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMX0VSUk9SX1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfRVJST1JfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF9FUlJPUl9UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMX0VSUk9SX1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMX0VSUk9SX1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF9FUlJPUl9UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfRVJST1JfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMX0VSUk9SX1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF9FUlJPUl9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMX0FTU0VSVCkKKyNkZWZpbmUgREVCVUdfTFZMX0FTU0VSVF9UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfQVNTRVJUX1RSQUNFMShzdHIscDEpICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF9BU1NFUlRfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMX0FTU0VSVF9UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfQVNTRVJUX1RSQUNFNChzdHIscDEscDIscDMscDQpICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfQVNTRVJUX1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF9BU1NFUlRfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMX0FTU0VSVF9UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfQVNTRVJUX1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF9BU1NFUlRfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8yOSkKKyNkZWZpbmUgREVCVUdfTFZMXzI5X1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMjlfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8yOV9UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzI5X1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMjlfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMjlfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzI5X1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8yOV9UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMjlfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzI5X1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMjgpCisjZGVmaW5lIERFQlVHX0xWTF8yOF9UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzI4X1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMjhfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8yOF9UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzI4X1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzI4X1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8yOF9UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMjhfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzI4X1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8yOF9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMXzI3KQorI2RlZmluZSBERUJVR19MVkxfMjdfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8yN19UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzI3X1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMjdfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8yN19UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF8yN19UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMjdfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzI3X1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8yN19UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMjdfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8yNikKKyNkZWZpbmUgREVCVUdfTFZMXzI2X1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMjZfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8yNl9UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzI2X1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMjZfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMjZfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzI2X1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8yNl9UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMjZfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzI2X1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMjUpCisjZGVmaW5lIERFQlVHX0xWTF8yNV9UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzI1X1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMjVfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8yNV9UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzI1X1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzI1X1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8yNV9UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMjVfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzI1X1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8yNV9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMXzI0KQorI2RlZmluZSBERUJVR19MVkxfMjRfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8yNF9UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzI0X1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMjRfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8yNF9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF8yNF9UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMjRfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzI0X1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8yNF9UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMjRfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8yMykKKyNkZWZpbmUgREVCVUdfTFZMXzIzX1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMjNfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8yM19UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzIzX1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMjNfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMjNfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzIzX1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8yM19UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMjNfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzIzX1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMjIpCisjZGVmaW5lIERFQlVHX0xWTF8yMl9UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzIyX1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMjJfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8yMl9UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzIyX1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzIyX1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8yMl9UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMjJfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzIyX1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8yMl9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMXzIxKQorI2RlZmluZSBERUJVR19MVkxfMjFfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8yMV9UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzIxX1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMjFfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8yMV9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF8yMV9UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMjFfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzIxX1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8yMV9UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMjFfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8yMCkKKyNkZWZpbmUgREVCVUdfTFZMXzIwX1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMjBfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8yMF9UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzIwX1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMjBfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMjBfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzIwX1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8yMF9UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMjBfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzIwX1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMTkpCisjZGVmaW5lIERFQlVHX0xWTF8xOV9UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzE5X1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMTlfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8xOV9UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzE5X1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzE5X1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8xOV9UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMTlfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzE5X1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8xOV9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMXzE4KQorI2RlZmluZSBERUJVR19MVkxfMThfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8xOF9UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzE4X1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMThfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8xOF9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF8xOF9UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMThfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzE4X1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8xOF9UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMThfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8xNykKKyNkZWZpbmUgREVCVUdfTFZMXzE3X1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMTdfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8xN19UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzE3X1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMTdfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMTdfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzE3X1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8xN19UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMTdfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzE3X1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMTYpCisjZGVmaW5lIERFQlVHX0xWTF8xNl9UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzE2X1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMTZfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8xNl9UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzE2X1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzE2X1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8xNl9UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMTZfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzE2X1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8xNl9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMXzE1KQorI2RlZmluZSBERUJVR19MVkxfMTVfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8xNV9UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzE1X1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMTVfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8xNV9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF8xNV9UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMTVfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzE1X1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8xNV9UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMTVfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8xNCkKKyNkZWZpbmUgREVCVUdfTFZMXzE0X1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMTRfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8xNF9UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzE0X1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMTRfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMTRfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzE0X1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8xNF9UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMTRfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzE0X1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMTMpCisjZGVmaW5lIERFQlVHX0xWTF8xM19UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzEzX1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMTNfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8xM19UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzEzX1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzEzX1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8xM19UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMTNfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzEzX1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8xM19UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMXzEyKQorI2RlZmluZSBERUJVR19MVkxfMTJfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8xMl9UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzEyX1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMTJfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8xMl9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF8xMl9UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMTJfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzEyX1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8xMl9UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMTJfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8xMSkKKyNkZWZpbmUgREVCVUdfTFZMXzExX1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMTFfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8xMV9UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzExX1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMTFfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMTFfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzExX1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8xMV9UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMTFfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzExX1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMTApCisjZGVmaW5lIERFQlVHX0xWTF8xMF9UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzEwX1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMTBfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8xMF9UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzEwX1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzEwX1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8xMF9UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMTBfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzEwX1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8xMF9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMXzA5KQorI2RlZmluZSBERUJVR19MVkxfMDlfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8wOV9UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzA5X1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMDlfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8wOV9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF8wOV9UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMDlfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzA5X1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8wOV9UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMDlfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8wOCkKKyNkZWZpbmUgREVCVUdfTFZMXzA4X1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMDhfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8wOF9UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzA4X1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMDhfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMDhfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzA4X1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8wOF9UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMDhfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzA4X1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMDcpCisjZGVmaW5lIERFQlVHX0xWTF8wN19UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzA3X1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMDdfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8wN19UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzA3X1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzA3X1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8wN19UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMDdfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzA3X1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8wN19UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMXzA2KQorI2RlZmluZSBERUJVR19MVkxfMDZfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8wNl9UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzA2X1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMDZfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8wNl9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF8wNl9UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMDZfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzA2X1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8wNl9UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMDZfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8wNSkKKyNkZWZpbmUgREVCVUdfTFZMXzA1X1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMDVfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8wNV9UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzA1X1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMDVfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMDVfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzA1X1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8wNV9UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMDVfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzA1X1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMDQpCisjZGVmaW5lIERFQlVHX0xWTF8wNF9UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzA0X1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMDRfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8wNF9UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzA0X1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzA0X1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8wNF9UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMDRfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzA0X1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8wNF9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZiAoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMXzAzKQorI2RlZmluZSBERUJVR19MVkxfMDNfVFJBQ0UwKHN0cikgICAgICAgICAgICAgICAgICAgIFRSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8wM19UUkFDRTEoc3RyLHAxKSAgICAgICAgICAgICAgICAgVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzAzX1RSQUNFMihzdHIscDEscDIpICAgICAgICAgICAgICBUUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMDNfVFJBQ0UzKHN0cixwMSxwMixwMykgICAgICAgICAgIFRSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8wM19UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KSAgICAgICAgVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0xWTF8wM19UUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMDNfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfTFZMXzAzX1RSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8wM19UUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMDNfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjaWYgKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF8wMikKKyNkZWZpbmUgREVCVUdfTFZMXzAyX1RSQUNFMChzdHIpICAgICAgICAgICAgICAgICAgICBUUkFDRTAoc3RyKQorI2RlZmluZSBERUJVR19MVkxfMDJfVFJBQ0UxKHN0cixwMSkgICAgICAgICAgICAgICAgIFRSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8wMl9UUkFDRTIoc3RyLHAxLHAyKSAgICAgICAgICAgICAgVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzAyX1RSQUNFMyhzdHIscDEscDIscDMpICAgICAgICAgICBUUkFDRTMoc3RyLHAxLHAyLHAzKQorI2RlZmluZSBERUJVR19MVkxfMDJfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkgICAgICAgIFRSQUNFNChzdHIscDEscDIscDMscDQpCisjZWxzZQorI2RlZmluZSBERUJVR19MVkxfMDJfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzAyX1RSQUNFMShzdHIscDEpCisjZGVmaW5lIERFQlVHX0xWTF8wMl9UUkFDRTIoc3RyLHAxLHAyKQorI2RlZmluZSBERUJVR19MVkxfMDJfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzAyX1RSQUNFNChzdHIscDEscDIscDMscDQpCisjZW5kaWYKKworI2lmIChERUJVR19HTEJfTFZMKCkgJiBERUJVR19MVkxfMDEpCisjZGVmaW5lIERFQlVHX0xWTF8wMV9UUkFDRTAoc3RyKSAgICAgICAgICAgICAgICAgICAgVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfTFZMXzAxX1RSQUNFMShzdHIscDEpICAgICAgICAgICAgICAgICBUUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMDFfVFJBQ0UyKHN0cixwMSxwMikgICAgICAgICAgICAgIFRSQUNFMihzdHIscDEscDIpCisjZGVmaW5lIERFQlVHX0xWTF8wMV9UUkFDRTMoc3RyLHAxLHAyLHAzKSAgICAgICAgICAgVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfTFZMXzAxX1RSQUNFNChzdHIscDEscDIscDMscDQpICAgICAgICBUUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTFZMXzAxX1RSQUNFMChzdHIpCisjZGVmaW5lIERFQlVHX0xWTF8wMV9UUkFDRTEoc3RyLHAxKQorI2RlZmluZSBERUJVR19MVkxfMDFfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfTFZMXzAxX1RSQUNFMyhzdHIscDEscDIscDMpCisjZGVmaW5lIERFQlVHX0xWTF8wMV9UUkFDRTQoc3RyLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNkZWZpbmUgREVCVUdfVFJBQ0UwKGx2bCxzdHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgbHZsIyNfVFJBQ0UwKHN0cikKKyNkZWZpbmUgREVCVUdfVFJBQ0UxKGx2bCxzdHIscDEpICAgICAgICAgICAgICAgICAgICAgICAgbHZsIyNfVFJBQ0UxKHN0cixwMSkKKyNkZWZpbmUgREVCVUdfVFJBQ0UyKGx2bCxzdHIscDEscDIpICAgICAgICAgICAgICAgICAgICAgbHZsIyNfVFJBQ0UyKHN0cixwMSxwMikKKyNkZWZpbmUgREVCVUdfVFJBQ0UzKGx2bCxzdHIscDEscDIscDMpICAgICAgICAgICAgICAgICAgbHZsIyNfVFJBQ0UzKHN0cixwMSxwMixwMykKKyNkZWZpbmUgREVCVUdfVFJBQ0U0KGx2bCxzdHIscDEscDIscDMscDQpICAgICAgICAgICAgICAgbHZsIyNfVFJBQ0U0KHN0cixwMSxwMixwMyxwNCkKKworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGUgbWFjcm8gREVCVUdfRFVNUF9EQVRBKCkgY2FuIGJlIHVzZWQgd2l0aCB0aGUgc2FtZSBkZWJ1Zy1sZXZlbHMgdG8gZHVtcAorLy8gb3V0IGRhdGEgYnl0ZXMuIEZ1bmN0aW9uIER1bXBEYXRhKCkgaGFzIHRvIGJlIGluY2x1ZGVkLgorLy8gTk9URTogRFVNUF9EQVRBIGhhcyB0byBiZSBkZWZpbmVkIGluIHByb2plY3Qgc2V0dGluZ3MuCisjaWYgKCFkZWZpbmVkIChOREVCVUcpICYmIGRlZmluZWQgKERVTVBfREFUQSkpIHx8IChERVZfU1lTVEVNID09IF9ERVZfV0lOMzJfKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKwl2b2lkIER1bXBEYXRhKGNoYXIgKnN6U3RyX3AsIEJZVEUgTUVNICogcGJEYXRhX3AsIFdPUkQgd1NpemVfcCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQkJCQkvLyB2b24gZXh0ZXJuICJDIgorI2VuZGlmCisjZGVmaW5lIERFQlVHX0RVTVBfREFUQShsdmwsc3RyLHB0cixzaXopICAgIGlmICgoREVCVUdfR0xCX0xWTCgpICYgKGx2bCkpPT0obHZsKSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIER1bXBEYXRhIChzdHIsIChCWVRFIE1FTSopIChwdHIpLCAoV09SRCkgKHNpeikpOworI2Vsc2UKKworI2RlZmluZSBERUJVR19EVU1QX0RBVEEobHZsLHN0cixwdHIsc2l6KQorCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoZSBtYWNybyBERUJVR19BU1NFUlQoKSBjYW4gYmUgdXNlZCB0byBwcmludCBvdXQgYW4gZXJyb3Igc3RyaW5nIGlmIHRoZQorLy8gcGFyYW1ldGVyZWQgZXhwcmVzaW9uIGRvZXMgbm90IHJlc3VsdCBUUlVFLgorLy8gTk9URTogSWYgREVCVUdfS0VFUF9BU1NFUlQgaXMgZGVmaW5lZCwgdGhlbiBERUJVR19BU1NFUlQtbGluZSB3aWxsIG5vdCBiZQorLy8gICAgICAgZGVsZXRlZCBmcm9tIGNvbXBpbGVyIChpbiByZWxlYXNlIHZlcnNpb24gdG9vKS4KKyNpZiAhZGVmaW5lZCAoTkRFQlVHKSB8fCBkZWZpbmVkIChERUJVR19LRUVQX0FTU0VSVCkKKworI2lmIChERVZfU1lTVEVNID09IF9ERVZfV0lOMzJfKQorCisJLy8gRm9yIFdJTjMyIHByb2Nlc3Mgd2lsbCBiZSBraWxsZWQgYWZ0ZXIgY2xvc2luZyBtZXNzYWdlIGJveC4KKworI2RlZmluZSBERUJVR19BU1NFUlQwKGV4cHIsc3RyKSAgICAgICAgIGlmICghKGV4cHIgKSAmJiAoKERFQlVHX0dMQl9MVkwoKSAmIERFQlVHX0xWTF9BU1NFUlQpIT0wKSkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUJveCAoTlVMTCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXNzZXJ0aW9uIGZhaWxlZDogbGluZSAiIF9fTElORV9fICIgZmlsZSAiIF9fRklMRV9fIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuICAgIC0+ICIgc3RyICJcbiIpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhpdFByb2Nlc3MgKC0xKTsgfQorCisjZGVmaW5lIERFQlVHX0FTU0VSVDEoZXhwcixzdHIscDEpICAgICAgaWYgKCEoZXhwciApICYmICgoREVCVUdfR0xCX0xWTCgpICYgREVCVUdfTFZMX0FTU0VSVCkhPTApKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQm94IChOVUxMLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBc3NlcnRpb24gZmFpbGVkOiBsaW5lICIgX19MSU5FX18gIiBmaWxlICIgX19GSUxFX18gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG4gICAgLT4gIiBzdHIgIlxuIik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGl0UHJvY2VzcyAoLTEpOyB9CisKKyNlbHNlCisKKwkvLyBGb3IgbWljcm9jb250cm9sbGVycyBwcm9jZXNzIHdpbGwgYmUgc3RvcHBlZCB1c2luZyBlbmRsZXNzIGxvb3AuCisKKyNkZWZpbmUgREVCVUdfQVNTRVJUMChleHByLHN0cikgICAgICAgICBpZiAoIShleHByICkpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX0xWTF9BU1NFUlRfVFJBQ0UzICggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXNzZXJ0aW9uIGZhaWxlZDogbGluZSAlZCBmaWxlICclcydcbiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIC0+ICclcydcbiIsIF9fTElORV9fLCBfX0ZJTEVfXywgc3RyKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgxKTsgfQorCisjZGVmaW5lIERFQlVHX0FTU0VSVDEoZXhwcixzdHIscDEpICAgICAgaWYgKCEoZXhwciApKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19MVkxfQVNTRVJUX1RSQUNFNCAoIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFzc2VydGlvbiBmYWlsZWQ6IGxpbmUgJWQgZmlsZSAnJXMnXG4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAtPiAnJXMnXG4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAtPiAweCUwOGxYXG4iLCBfX0xJTkVfXywgX19GSUxFX18sIHN0ciwgKERXT1JEKSBwMSk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoMSk7IH0KKworI2VuZGlmCisKKyNlbHNlCisKKyNkZWZpbmUgREVCVUdfQVNTRVJUMChleHByLHN0cikKKyNkZWZpbmUgREVCVUdfQVNTRVJUMShleHByLHN0cixwMSkKKworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGUgbWFjcm8gREVCVUdfT05MWSgpIGltcGxlbWVudHMgY29kZSwgaWYgTkRFQlVHIGlzIG5vdCBkZWZpbmVkLgorI2lmICFkZWZpbmVkIChERUJVR19PTkxZKQorI2lmICFkZWZpbmVkIChOREVCVUcpCisKKyNkZWZpbmUgREVCVUdfT05MWShleHByKSAgICBleHByCisKKyNlbHNlCisKKyNkZWZpbmUgREVCVUdfT05MWShleHByKQorCisjZW5kaWYKKyNlbmRpZgorCisjZW5kaWYgLy8gX0RFQlVHX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VkcnY4MTM5LmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VkcnY4MTM5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk2MzU0YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRWRydjgxMzkuYwpAQCAtMCwwICsxLDEyNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBFdGhlcm5ldCBkcml2ZXIgZm9yIFJlYWx0ZWsgUlRMODEzOSBjaGlwcworICAgICAgICAgICAgICAgIGV4Y2VwdCB0aGUgUlRMODEzOUMrLCBiZWNhdXNlIGl0IGhhcyBhIGRpZmZlcmVudAorICAgICAgICAgICAgICAgIFR4IGRlc2NyaXB0b3IgaGFuZGxpbmcuCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRWRydjgxMzkuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMTAgJCAgJERhdGU6IDIwMDgvMTEvMjEgMDk6MDA6MzggJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgRGV2IEMrKyBhbmQgR05VLUNvbXBpbGVyIGZvciBtNjhrCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwOC8wMi8wNSBkLmsuOiAgIHN0YXJ0IG9mIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJnbG9iYWwuaCIKKyNpbmNsdWRlICJFcGxJbmMuaCIKKyNpbmNsdWRlICJlZHJ2LmgiCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyBCdWZmZXIgaGFuZGxpbmc6CisvLyBBbGwgYnVmZmVycyBhcmUgY3JlYXRlZCBzdGF0aWNhbGx5IChpLmUuIGF0IGNvbXBpbGUgdGltZSByZXNwLiBhdAorLy8gaW5pdGlhbGlzYXRpb24gdmlhIGttYWxsb2MoKSApIGFuZCBub3QgZHluYW1pY2FsbHkgb24gcmVxdWVzdCAoaS5lLiB2aWEKKy8vIEVkcnZBbGxvY1R4TXNnQnVmZmVyKCkuCisvLyBFZHJ2QWxsb2NUeE1zZ0J1ZmZlcigpIHNlYXJjaGVzIGZvciBhbiB1bnVzZWQgYnVmZmVyIHdoaWNoIGlzIGxhcmdlIGVub3VnaC4KKy8vIEVkcnZJbml0KCkgbWF5IGFsbG9jYXRlIHNvbWUgYnVmZmVycyB3aXRoIHNpemVzIGxlc3MgdGhhbiBtYXhpbXVtIGZyYW1lCisvLyBzaXplIChpLmUuIDE1MTQgYnl0ZXMpLCBlLmcuIGZvciBTb0MsIFNvQSwgU3RhdHVzUmVzcG9uc2UsIElkZW50UmVzcG9uc2UsCisvLyBOTVQgcmVxdWVzdHMgLyBjb21tYW5kcy4gVGhlIGxlc3MgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciB0aGUgbGVzcyB0aGUKKy8vIG51bWJlciBvZiB0aGUgYnVmZmVyLgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBFRFJWX01BWF9UWF9CVUZGRVJTCisjZGVmaW5lIEVEUlZfTUFYX1RYX0JVRkZFUlMgICAgIDIwCisjZW5kaWYKKworI2RlZmluZSBFRFJWX01BWF9GUkFNRV9TSVpFICAgICAweDYwMAorCisjZGVmaW5lIEVEUlZfUlhfQlVGRkVSX1NJWkUgICAgIDB4ODYxMAkvLyAzMiBrQiArIDE2IEJ5dGUgKyAxLDUga0IgKFdSQVAgaXMgZW5hYmxlZCkKKyNkZWZpbmUgRURSVl9SWF9CVUZGRVJfTEVOR1RIICAgKEVEUlZfUlhfQlVGRkVSX1NJWkUgJiAweEY4MDApCS8vIGJ1ZmZlciBzaXplIGN1dCBkb3duIHRvIDIga0IgYWxpZ25tZW50CisKKyNkZWZpbmUgRURSVl9UWF9CVUZGRVJfU0laRSAgICAgKEVEUlZfTUFYX1RYX0JVRkZFUlMgKiBFRFJWX01BWF9GUkFNRV9TSVpFKQkvLyBuICogKE1UVSArIDE0ICsgNCkKKworI2RlZmluZSBEUlZfTkFNRSAgICAgICAgICAgICAgICAiZXBsIgorCisjZGVmaW5lIEVEUlZfUkVHV19JTlRfTUFTSyAgICAgIDB4M0MJLy8gaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIKKyNkZWZpbmUgRURSVl9SRUdXX0lOVF9TVEFUVVMgICAgMHgzRQkvLyBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyCisjZGVmaW5lIEVEUlZfUkVHV19JTlRfUk9LICAgICAgIDB4MDAwMQkvLyBSZWNlaXZlIE9LIGludGVycnVwdAorI2RlZmluZSBFRFJWX1JFR1dfSU5UX1JFUiAgICAgICAweDAwMDIJLy8gUmVjZWl2ZSBlcnJvciBpbnRlcnJ1cHQKKyNkZWZpbmUgRURSVl9SRUdXX0lOVF9UT0sgICAgICAgMHgwMDA0CS8vIFRyYW5zbWl0IE9LIGludGVycnVwdAorI2RlZmluZSBFRFJWX1JFR1dfSU5UX1RFUiAgICAgICAweDAwMDgJLy8gVHJhbnNtaXQgZXJyb3IgaW50ZXJydXB0CisjZGVmaW5lIEVEUlZfUkVHV19JTlRfUlhPVlcgICAgIDB4MDAxMAkvLyBSeCBidWZmZXIgb3ZlcmZsb3cgaW50ZXJydXB0CisjZGVmaW5lIEVEUlZfUkVHV19JTlRfUFVOICAgICAgIDB4MDAyMAkvLyBQYWNrZXQgdW5kZXJydW4vIGxpbmsgY2hhbmdlIGludGVycnVwdAorI2RlZmluZSBFRFJWX1JFR1dfSU5UX0ZPVlcgICAgICAweDAwNDAJLy8gUnggRklGTyBvdmVyZmxvdyBpbnRlcnJ1cHQKKyNkZWZpbmUgRURSVl9SRUdXX0lOVF9MRU5DSEcgICAgMHgyMDAwCS8vIENhYmxlIGxlbmd0aCBjaGFuZ2UgaW50ZXJydXB0CisjZGVmaW5lIEVEUlZfUkVHV19JTlRfVElNRU9VVCAgIDB4NDAwMAkvLyBUaW1lIG91dCBpbnRlcnJ1cHQKKyNkZWZpbmUgRURSVl9SRUdXX0lOVF9TRVJSICAgICAgMHg4MDAwCS8vIFN5c3RlbSBlcnJvciBpbnRlcnJ1cHQKKyNkZWZpbmUgRURSVl9SRUdXX0lOVF9NQVNLX0RFRiAgKEVEUlZfUkVHV19JTlRfUk9LIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdXX0lOVF9SRVIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRFJWX1JFR1dfSU5UX1RPSyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHV19JTlRfVEVSIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdXX0lOVF9SWE9WVyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHV19JTlRfRk9WVyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHV19JTlRfUFVOIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdXX0lOVF9USU1FT1VUIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdXX0lOVF9TRVJSKQkvLyBkZWZhdWx0IGludGVycnVwdCBtYXNrCisKKyNkZWZpbmUgRURSVl9SRUdCX0NPTU1BTkQgICAgICAgMHgzNwkvLyBjb21tYW5kIHJlZ2lzdGVyCisjZGVmaW5lIEVEUlZfUkVHQl9DT01NQU5EX1JTVCAgIDB4MTAKKyNkZWZpbmUgRURSVl9SRUdCX0NPTU1BTkRfUkUgICAgMHgwOAorI2RlZmluZSBFRFJWX1JFR0JfQ09NTUFORF9URSAgICAweDA0CisjZGVmaW5lIEVEUlZfUkVHQl9DT01NQU5EX0JVRkUgIDB4MDEKKworI2RlZmluZSBFRFJWX1JFR0JfQ01EOTM0NiAgICAgICAweDUwCS8vIDkzQzQ2IGNvbW1hbmQgcmVnaXN0ZXIKKyNkZWZpbmUgRURSVl9SRUdCX0NNRDkzNDZfTE9DSyAgMHgwMAkvLyBsb2NrIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzCisjZGVmaW5lIEVEUlZfUkVHQl9DTUQ5MzQ2X1VOTE9DSyAweEMwCS8vIHVubG9jayBjb25maWd1cmF0aW9uIHJlZ2lzdGVycworCisjZGVmaW5lIEVEUlZfUkVHRFdfUkNSICAgICAgICAgIDB4NDQJLy8gUnggY29uZmlndXJhdGlvbiByZWdpc3RlcgorI2RlZmluZSBFRFJWX1JFR0RXX1JDUl9OT19GVEggICAweDAwMDBFMDAwCS8vIG5vIHJlY2VpdmUgRklGTyB0aHJlc2hvbGQKKyNkZWZpbmUgRURSVl9SRUdEV19SQ1JfUkJMRU4zMksgMHgwMDAwMTAwMAkvLyAzMiBrQiByZWNlaXZlIGJ1ZmZlcgorI2RlZmluZSBFRFJWX1JFR0RXX1JDUl9NWERNQVVOTCAweDAwMDAwNzAwCS8vIHVubGltaXRlZCBtYXhpbXVtIERNQSBidXJzdCBzaXplCisjZGVmaW5lIEVEUlZfUkVHRFdfUkNSX05PV1JBUCAgIDB4MDAwMDAwODAJLy8gZG8gbm90IHdyYXAgZnJhbWUgYXQgZW5kIG9mIGJ1ZmZlcgorI2RlZmluZSBFRFJWX1JFR0RXX1JDUl9BRVIgICAgICAweDAwMDAwMDIwCS8vIGFjY2VwdCBlcnJvciBmcmFtZXMgKENSQywgYWxpZ25tZW50LCBjb2xsaWRlZCkKKyNkZWZpbmUgRURSVl9SRUdEV19SQ1JfQVIgICAgICAgMHgwMDAwMDAxMAkvLyBhY2NlcHQgcnVudAorI2RlZmluZSBFRFJWX1JFR0RXX1JDUl9BQiAgICAgICAweDAwMDAwMDA4CS8vIGFjY2VwdCBicm9hZGNhc3QgZnJhbWVzCisjZGVmaW5lIEVEUlZfUkVHRFdfUkNSX0FNICAgICAgIDB4MDAwMDAwMDQJLy8gYWNjZXB0IG11bHRpY2FzdCBmcmFtZXMKKyNkZWZpbmUgRURSVl9SRUdEV19SQ1JfQVBNICAgICAgMHgwMDAwMDAwMgkvLyBhY2NlcHQgcGh5c2ljYWwgbWF0Y2ggZnJhbWVzCisjZGVmaW5lIEVEUlZfUkVHRFdfUkNSX0FBUCAgICAgIDB4MDAwMDAwMDEJLy8gYWNjZXB0IGFsbCBmcmFtZXMKKyNkZWZpbmUgRURSVl9SRUdEV19SQ1JfREVGICAgICAgKEVEUlZfUkVHRFdfUkNSX05PX0ZUSCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHRFdfUkNSX1JCTEVOMzJLIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdEV19SQ1JfTVhETUFVTkwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRFJWX1JFR0RXX1JDUl9OT1dSQVAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRFJWX1JFR0RXX1JDUl9BQiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHRFdfUkNSX0FNIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdEV19SQ1JfQVBNKQkvLyBkZWZhdWx0IHZhbHVlCisKKyNkZWZpbmUgRURSVl9SRUdEV19UQ1IgICAgICAgICAgMHg0MAkvLyBUeCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyCisjZGVmaW5lIEVEUlZfUkVHRFdfVENSX1ZFUl9NQVNLIDB4N0NDMDAwMDAJLy8gbWFzayBmb3IgaGFyZHdhcmUgdmVyc2lvbgorI2RlZmluZSBFRFJWX1JFR0RXX1RDUl9WRVJfQyAgICAweDc0MDAwMDAwCS8vIFJUTDgxMzlDCisjZGVmaW5lIEVEUlZfUkVHRFdfVENSX1ZFUl9EICAgIDB4NzQ0MDAwMDAJLy8gUlRMODEzOUQKKyNkZWZpbmUgRURSVl9SRUdEV19UQ1JfSUZHOTYgICAgMHgwMzAwMDAwMAkvLyBkZWZhdWx0IGludGVyZnJhbWUgZ2FwICg5NjAgbnMpCisjZGVmaW5lIEVEUlZfUkVHRFdfVENSX0NSQyAgICAgIDB4MDAwMTAwMDAJLy8gZGlzYWJsZSBhcHBlbmRpbmcgb2YgQ1JDIGJ5IHRoZSBjb250cm9sbGVyCisjZGVmaW5lIEVEUlZfUkVHRFdfVENSX01YRE1BVU5MIDB4MDAwMDA3MDAJLy8gbWF4aW11bSBETUEgYnVyc3Qgc2l6ZSBvZiAyMDQ4IGIKKyNkZWZpbmUgRURSVl9SRUdEV19UQ1JfVFhSRVRSWSAgMHgwMDAwMDAwMAkvLyAxNiByZXRyaWVzCisjZGVmaW5lIEVEUlZfUkVHRFdfVENSX0RFRiAgICAgIChFRFJWX1JFR0RXX1RDUl9JRkc5NiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVEUlZfUkVHRFdfVENSX01YRE1BVU5MIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRURSVl9SRUdEV19UQ1JfVFhSRVRSWSkKKworI2RlZmluZSBFRFJWX1JFR1dfTVVMSU5UICAgICAgICAweDVDCS8vIG11bHRpcGxlIGludGVycnVwdCBzZWxlY3QgcmVnaXN0ZXIKKworI2RlZmluZSBFRFJWX1JFR0RXX01QQyAgICAgICAgICAweDRDCS8vIG1pc3NlZCBwYWNrZXQgY291bnRlciByZWdpc3RlcgorCisjZGVmaW5lIEVEUlZfUkVHRFdfVFNBRDAgICAgICAgIDB4MjAJLy8gVHJhbnNtaXQgc3RhcnQgYWRkcmVzcyBvZiBkZXNjcmlwdG9yIDAKKyNkZWZpbmUgRURSVl9SRUdEV19UU0FEMSAgICAgICAgMHgyNAkvLyBUcmFuc21pdCBzdGFydCBhZGRyZXNzIG9mIGRlc2NyaXB0b3IgMQorI2RlZmluZSBFRFJWX1JFR0RXX1RTQUQyICAgICAgICAweDI4CS8vIFRyYW5zbWl0IHN0YXJ0IGFkZHJlc3Mgb2YgZGVzY3JpcHRvciAyCisjZGVmaW5lIEVEUlZfUkVHRFdfVFNBRDMgICAgICAgIDB4MkMJLy8gVHJhbnNtaXQgc3RhcnQgYWRkcmVzcyBvZiBkZXNjcmlwdG9yIDMKKyNkZWZpbmUgRURSVl9SRUdEV19UU0QwICAgICAgICAgMHgxMAkvLyBUcmFuc21pdCBzdGF0dXMgb2YgZGVzY3JpcHRvciAwCisjZGVmaW5lIEVEUlZfUkVHRFdfVFNEX0NSUyAgICAgIDB4ODAwMDAwMDAJLy8gQ2FycmllciBzZW5zZSBsb3N0CisjZGVmaW5lIEVEUlZfUkVHRFdfVFNEX1RBQlQgICAgIDB4NDAwMDAwMDAJLy8gVHJhbnNtaXQgQWJvcnQKKyNkZWZpbmUgRURSVl9SRUdEV19UU0RfT1dDICAgICAgMHgyMDAwMDAwMAkvLyBPdXQgb2Ygd2luZG93IGNvbGxpc2lvbgorI2RlZmluZSBFRFJWX1JFR0RXX1RTRF9UWFRIX0RFRiAweDAwMDIwMDAwCS8vIFRyYW5zbWl0IEZJRk8gdGhyZXNob2xkIG9mIDY0IGJ5dGVzCisjZGVmaW5lIEVEUlZfUkVHRFdfVFNEX1RPSyAgICAgIDB4MDAwMDgwMDAJLy8gVHJhbnNtaXQgT0sKKyNkZWZpbmUgRURSVl9SRUdEV19UU0RfVFVOICAgICAgMHgwMDAwNDAwMAkvLyBUcmFuc21pdCBGSUZPIHVuZGVycnVuCisjZGVmaW5lIEVEUlZfUkVHRFdfVFNEX09XTiAgICAgIDB4MDAwMDIwMDAJLy8gT3duZXIKKworI2RlZmluZSBFRFJWX1JFR0RXX1JCU1RBUlQgICAgICAweDMwCS8vIFJlY2VpdmUgYnVmZmVyIHN0YXJ0IGFkZHJlc3MKKworI2RlZmluZSBFRFJWX1JFR1dfQ0FQUiAgICAgICAgICAweDM4CS8vIEN1cnJlbnQgYWRkcmVzcyBvZiBwYWNrZXQgcmVhZAorCisjZGVmaW5lIEVEUlZfUkVHRFdfSURSMCAgICAgICAgIDB4MDAJLy8gSUQgcmVnaXN0ZXIgMAorI2RlZmluZSBFRFJWX1JFR0RXX0lEUjQgICAgICAgICAweDA0CS8vIElEIHJlZ2lzdGVyIDQKKworI2RlZmluZSBFRFJWX1JFR0RXX01BUjAgICAgICAgICAweDA4CS8vIE11bHRpY2FzdCBhZGRyZXNzIHJlZ2lzdGVyIDAKKyNkZWZpbmUgRURSVl9SRUdEV19NQVI0ICAgICAgICAgMHgwQwkvLyBNdWx0aWNhc3QgYWRkcmVzcyByZWdpc3RlciA0CisKKy8vIGRlZmluZXMgZm9yIHRoZSBzdGF0dXMgd29yZCBpbiB0aGUgcmVjZWl2ZSBidWZmZXIKKyNkZWZpbmUgRURSVl9SWFNUQVRfTUFSICAgICAgICAgMHg4MDAwCS8vIE11bHRpY2FzdCBhZGRyZXNzIHJlY2VpdmVkCisjZGVmaW5lIEVEUlZfUlhTVEFUX1BBTSAgICAgICAgIDB4NDAwMAkvLyBQaHlzaWNhbCBhZGRyZXNzIG1hdGNoZWQKKyNkZWZpbmUgRURSVl9SWFNUQVRfQkFSICAgICAgICAgMHgyMDAwCS8vIEJyb2FkY2FzdCBhZGRyZXNzIHJlY2VpdmVkCisjZGVmaW5lIEVEUlZfUlhTVEFUX0lTRSAgICAgICAgIDB4MDAyMAkvLyBJbnZhbGlkIHN5bWJvbCBlcnJvcgorI2RlZmluZSBFRFJWX1JYU1RBVF9SVU5UICAgICAgICAweDAwMTAJLy8gUnVudCBwYWNrZXQgcmVjZWl2ZWQKKyNkZWZpbmUgRURSVl9SWFNUQVRfTE9ORyAgICAgICAgMHgwMDA4CS8vIExvbmcgcGFja2V0CisjZGVmaW5lIEVEUlZfUlhTVEFUX0NSQyAgICAgICAgIDB4MDAwNAkvLyBDUkMgZXJyb3IKKyNkZWZpbmUgRURSVl9SWFNUQVRfRkFFICAgICAgICAgMHgwMDAyCS8vIEZyYW1lIGFsaWdubWVudCBlcnJvcgorI2RlZmluZSBFRFJWX1JYU1RBVF9ST0sgICAgICAgICAweDAwMDEJLy8gUmVjZWl2ZSBPSworCisjZGVmaW5lIEVEUlZfUkVHRFdfV1JJVEUoZHdSZWcsIGR3VmFsKSAgd3JpdGVsKGR3VmFsLCBFZHJ2SW5zdGFuY2VfbC5tX3BJb0FkZHIgKyBkd1JlZykKKyNkZWZpbmUgRURSVl9SRUdXX1dSSVRFKGR3UmVnLCB3VmFsKSAgICB3cml0ZXcod1ZhbCwgRWRydkluc3RhbmNlX2wubV9wSW9BZGRyICsgZHdSZWcpCisjZGVmaW5lIEVEUlZfUkVHQl9XUklURShkd1JlZywgYlZhbCkgICAgd3JpdGViKGJWYWwsIEVkcnZJbnN0YW5jZV9sLm1fcElvQWRkciArIGR3UmVnKQorI2RlZmluZSBFRFJWX1JFR0RXX1JFQUQoZHdSZWcpICAgICAgICAgIHJlYWRsKEVkcnZJbnN0YW5jZV9sLm1fcElvQWRkciArIGR3UmVnKQorI2RlZmluZSBFRFJWX1JFR1dfUkVBRChkd1JlZykgICAgICAgICAgIHJlYWR3KEVkcnZJbnN0YW5jZV9sLm1fcElvQWRkciArIGR3UmVnKQorI2RlZmluZSBFRFJWX1JFR0JfUkVBRChkd1JlZykgICAgICAgICAgIHJlYWRiKEVkcnZJbnN0YW5jZV9sLm1fcElvQWRkciArIGR3UmVnKQorCisvLyBUcmFjZVBvaW50IHN1cHBvcnQgZm9yIHJlYWx0aW1lLWRlYnVnZ2luZworI2lmZGVmIF9EQkdfVFJBQ0VfUE9JTlRTXwordm9pZCBQVUJMSUMgVGd0RGJnU2lnbmFsVHJhY2VQb2ludChCWVRFIGJUcmFjZVBvaW50TnVtYmVyX3ApOwordm9pZCBQVUJMSUMgVGd0RGJnUG9zdFRyYWNlVmFsdWUoRFdPUkQgZHdUcmFjZVZhbHVlX3ApOworI2RlZmluZSBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVChwKSAgIFRndERiZ1NpZ25hbFRyYWNlUG9pbnQocCkKKyNkZWZpbmUgVEdUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKHYpICAgICBUZ3REYmdQb3N0VHJhY2VWYWx1ZSh2KQorI2Vsc2UKKyNkZWZpbmUgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQocCkKKyNkZWZpbmUgVEdUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKHYpCisjZW5kaWYKKworI2RlZmluZSBFRFJWX0NPVU5UX1NFTkQgICAgICAgICAgICAgICAgIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDIpCisjZGVmaW5lIEVEUlZfQ09VTlRfVElNRU9VVCAgICAgICAgICAgICAgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoMykKKyNkZWZpbmUgRURSVl9DT1VOVF9QQ0lfRVJSICAgICAgICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCg0KQorI2RlZmluZSBFRFJWX0NPVU5UX1RYICAgICAgICAgICAgICAgICAgIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDUpCisjZGVmaW5lIEVEUlZfQ09VTlRfUlggICAgICAgICAgICAgICAgICAgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoNikKKyNkZWZpbmUgRURSVl9DT1VOVF9MQVRFQ09MTElTSU9OICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgxMCkKKyNkZWZpbmUgRURSVl9DT1VOVF9UWF9DT0xfUkwgICAgICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgxMSkKKyNkZWZpbmUgRURSVl9DT1VOVF9UWF9GVU4gICAgICAgICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgxMikKKyNkZWZpbmUgRURSVl9DT1VOVF9UWF9FUlIgICAgICAgICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgxMykKKyNkZWZpbmUgRURSVl9DT1VOVF9SWF9DUkMgICAgICAgICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgxNCkKKyNkZWZpbmUgRURSVl9DT1VOVF9SWF9FUlIgICAgICAgICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgxNSkKKyNkZWZpbmUgRURSVl9DT1VOVF9SWF9GT1ZXICAgICAgICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgxNikKKyNkZWZpbmUgRURSVl9DT1VOVF9SWF9QVU4gICAgICAgICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgxNykKKyNkZWZpbmUgRURSVl9DT1VOVF9SWF9GQUUgICAgICAgICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgxOCkKKyNkZWZpbmUgRURSVl9DT1VOVF9SWF9PVlcgICAgICAgICAgICAgICBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgxOSkKKworI2RlZmluZSBFRFJWX1RSQUNFX0NBUFIoeCkgICAgICAgICAgICAgIFRHVF9EQkdfUE9TVF9UUkFDRV9WQUxVRSgoKHgpICYgMHhGRkZGKSB8IDB4MDYwMDAwMDApCisjZGVmaW5lIEVEUlZfVFJBQ0VfUlhfQ1JDKHgpICAgICAgICAgICAgVEdUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKCgoeCkgJiAweEZGRkYpIHwgMHgwRTAwMDAwMCkKKyNkZWZpbmUgRURSVl9UUkFDRV9SWF9FUlIoeCkgICAgICAgICAgICBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUoKCh4KSAmIDB4RkZGRikgfCAweDBGMDAwMDAwKQorI2RlZmluZSBFRFJWX1RSQUNFX1JYX1BVTih4KSAgICAgICAgICAgIFRHVF9EQkdfUE9TVF9UUkFDRV9WQUxVRSgoKHgpICYgMHhGRkZGKSB8IDB4MTEwMDAwMDApCisjZGVmaW5lIEVEUlZfVFJBQ0UoeCkgICAgICAgICAgICAgICAgICAgVEdUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKCgoeCkgJiAweEZGRkYwMDAwKSB8IDB4MDAwMEZFQzApCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qCit0eXBlZGVmIHN0cnVjdAoreworICAgIEJPT0wgICAgICAgICAgICBtX2ZVc2VkOworICAgIHVuc2lnbmVkIGludCAgICBtX3VpU2l6ZTsKKyAgICBNQ0RfYnVmRGVzY0ZlYyAqbV9wQnVmRGVzY3I7CisKK30gdEVkcnZUeEJ1ZmZlckludGVybjsKKyovCisKKy8vIFByaXZhdGUgc3RydWN0dXJlCit0eXBlZGVmIHN0cnVjdCB7CisJc3RydWN0IHBjaV9kZXYgKm1fcFBjaURldjsJLy8gcG9pbnRlciB0byBQQ0kgZGV2aWNlIHN0cnVjdHVyZQorCXZvaWQgKm1fcElvQWRkcjsJLy8gcG9pbnRlciB0byByZWdpc3RlciBzcGFjZSBvZiBFdGhlcm5ldCBjb250cm9sbGVyCisJQllURSAqbV9wYlJ4QnVmOwkvLyBwb2ludGVyIHRvIFJ4IGJ1ZmZlcgorCWRtYV9hZGRyX3QgbV9wUnhCdWZEbWE7CisJQllURSAqbV9wYlR4QnVmOwkvLyBwb2ludGVyIHRvIFR4IGJ1ZmZlcgorCWRtYV9hZGRyX3QgbV9wVHhCdWZEbWE7CisJQk9PTCBtX2FmVHhCdWZVc2VkW0VEUlZfTUFYX1RYX0JVRkZFUlNdOworCXVuc2lnbmVkIGludCBtX3VpQ3VyVHhEZXNjOworCisJdEVkcnZJbml0UGFyYW0gbV9Jbml0UGFyYW07CisJdEVkcnZUeEJ1ZmZlciAqbV9wTGFzdFRyYW5zbWl0dGVkVHhCdWZmZXI7CisKK30gdEVkcnZJbnN0YW5jZTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQgRWRydkluaXRPbmUoc3RydWN0IHBjaV9kZXYgKnBQY2lEZXYsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcElkKTsKKworc3RhdGljIHZvaWQgRWRydlJlbW92ZU9uZShzdHJ1Y3QgcGNpX2RldiAqcFBjaURldik7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBidWZmZXJzIGFuZCBidWZmZXIgZGVzY3JpcHRvcnMgYW5kIHBvaW50ZXJzCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhRWRydlBjaVRibFtdID0geworCXsweDEwZWMsIDB4ODEzOSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJezAsfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGFFZHJ2UGNpVGJsKTsKKworc3RhdGljIHRFZHJ2SW5zdGFuY2UgRWRydkluc3RhbmNlX2w7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBFZHJ2RHJpdmVyID0geworCS5uYW1lID0gRFJWX05BTUUsCisJLmlkX3RhYmxlID0gYUVkcnZQY2lUYmwsCisJLnByb2JlID0gRWRydkluaXRPbmUsCisJLnJlbW92ZSA9IEVkcnZSZW1vdmVPbmUsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBDIEwgQSBTIFMgIDxlZHJ2PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgQllURSBFZHJ2Q2FsY0hhc2goQllURSAqIHBiTUFDX3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFZHJ2SW5pdAorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBmb3IgaW5pdCBvZiB0aGUgRXRoZXJuZXQgY29udHJvbGxlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwRWRydkluaXRQYXJhbV9wICAgID0gcG9pbnRlciB0byBzdHJ1Y3QgaW5jbHVkaW5nIHRoZSBpbml0LXBhcmFtZXRlcnMKKy8vCisvLyBSZXR1cm5zOiAgICAgRXJyb3Jjb2RlICAgICAgICAgICA9IGtFcGxTdWNjZXNzZnVsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGtFcGxOb1Jlc291cmNlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgRWRydkluaXQodEVkcnZJbml0UGFyYW0gKiBwRWRydkluaXRQYXJhbV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCWludCBpUmVzdWx0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBjbGVhciBpbnN0YW5jZSBzdHJ1Y3R1cmUKKwlFUExfTUVNU0VUKCZFZHJ2SW5zdGFuY2VfbCwgMCwgc2l6ZW9mKEVkcnZJbnN0YW5jZV9sKSk7CisKKwkvLyBzYXZlIHRoZSBpbml0IGRhdGEKKwlFZHJ2SW5zdGFuY2VfbC5tX0luaXRQYXJhbSA9ICpwRWRydkluaXRQYXJhbV9wOworCisJLy8gcmVnaXN0ZXIgUENJIGRyaXZlcgorCWlSZXN1bHQgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZFZHJ2RHJpdmVyKTsKKwlpZiAoaVJlc3VsdCAhPSAwKSB7CisJCXByaW50aygiJXMgcGNpX3JlZ2lzdGVyX2RyaXZlciBmYWlsZWQgd2l0aCAlZFxuIiwgX19mdW5jX18sCisJCSAgICAgICBpUmVzdWx0KTsKKwkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAoRWRydkluc3RhbmNlX2wubV9wUGNpRGV2ID09IE5VTEwpIHsKKwkJcHJpbnRrKCIlcyBtX3BQY2lEZXY9TlVMTFxuIiwgX19mdW5jX18pOworCQlSZXQgPSBrRXBsTm9SZXNvdXJjZTsKKwkJZ290byBFeGl0OworCX0KKwkvLyByZWFkIE1BQyBhZGRyZXNzIGZyb20gY29udHJvbGxlcgorCXByaW50aygiJXMgbG9jYWwgTUFDID0gIiwgX19mdW5jX18pOworCWZvciAoaVJlc3VsdCA9IDA7IGlSZXN1bHQgPCA2OyBpUmVzdWx0KyspIHsKKwkJcEVkcnZJbml0UGFyYW1fcC0+bV9hYk15TWFjQWRkcltpUmVzdWx0XSA9CisJCSAgICBFRFJWX1JFR0JfUkVBRCgoRURSVl9SRUdEV19JRFIwICsgaVJlc3VsdCkpOworCQlwcmludGsoIiUwMlggIiwKKwkJICAgICAgICh1bnNpZ25lZCBpbnQpcEVkcnZJbml0UGFyYW1fcC0+bV9hYk15TWFjQWRkcltpUmVzdWx0XSk7CisJfQorCXByaW50aygiXG4iKTsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVkcnZTaHV0ZG93bgorLy8KKy8vIERlc2NyaXB0aW9uOiBTaHV0ZG93biB0aGUgRXRoZXJuZXQgY29udHJvbGxlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICB2b2lkCisvLworLy8gUmV0dXJuczogICAgIEVycm9yY29kZSAgID0ga0VwbFN1Y2Nlc3NmdWwKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBFZHJ2U2h1dGRvd24odm9pZCkKK3sKKworCS8vIHVucmVnaXN0ZXIgUENJIGRyaXZlcgorCXByaW50aygiJXMgY2FsbGluZyBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoKVxuIiwgX19mdW5jX18pOworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmRWRydkRyaXZlcik7CisKKwlyZXR1cm4ga0VwbFN1Y2Nlc3NmdWw7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVkcnZEZWZpbmVSeE1hY0FkZHJFbnRyeQorLy8KKy8vIERlc2NyaXB0aW9uOiBTZXQgYSBtdWx0aWNhc3QgZW50cnkgaW50byB0aGUgRXRoZXJuZXQgY29udHJvbGxlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwYk1hY0FkZHJfcCAgICAgPSBwb2ludGVyIHRvIG11bHRpY2FzdCBlbnRyeSB0byBzZXQKKy8vCisvLyBSZXR1cm5zOiAgICAgRXJyb3Jjb2RlICAgICAgID0ga0VwbFN1Y2Nlc3NmdWwKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBFZHJ2RGVmaW5lUnhNYWNBZGRyRW50cnkoQllURSAqIHBiTWFjQWRkcl9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJRFdPUkQgZHdEYXRhOworCUJZVEUgYkhhc2g7CisKKwliSGFzaCA9IEVkcnZDYWxjSGFzaChwYk1hY0FkZHJfcCk7CisvKgorICAgIGR3RGF0YSA9IGV0aGVyX2NyYyg2LCBwYk1hY0FkZHJfcCk7CisKKyAgICBwcmludGsoIkVkcnZEZWZpbmVSeE1hY0FkZHJFbnRyeSgnJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlgnKSBoYXNoID0gJXUgLyAldSAgZXRoZXJfY3JjID0gMHglMDhsWFxuIiwKKyAgICAgICAgKFdPUkQpIHBiTWFjQWRkcl9wWzBdLCAoV09SRCkgcGJNYWNBZGRyX3BbMV0sIChXT1JEKSBwYk1hY0FkZHJfcFsyXSwKKyAgICAgICAgKFdPUkQpIHBiTWFjQWRkcl9wWzNdLCAoV09SRCkgcGJNYWNBZGRyX3BbNF0sIChXT1JEKSBwYk1hY0FkZHJfcFs1XSwKKyAgICAgICAgKFdPUkQpIGJIYXNoLCAoV09SRCkgKGR3RGF0YSA+PiAyNiksIGR3RGF0YSk7CisqLworCWlmIChiSGFzaCA+IDMxKSB7CisJCWR3RGF0YSA9IEVEUlZfUkVHRFdfUkVBRChFRFJWX1JFR0RXX01BUjQpOworCQlkd0RhdGEgfD0gMSA8PCAoYkhhc2ggLSAzMik7CisJCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19NQVI0LCBkd0RhdGEpOworCX0gZWxzZSB7CisJCWR3RGF0YSA9IEVEUlZfUkVHRFdfUkVBRChFRFJWX1JFR0RXX01BUjApOworCQlkd0RhdGEgfD0gMSA8PCBiSGFzaDsKKwkJRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX01BUjAsIGR3RGF0YSk7CisJfQorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRWRydlVuZGVmaW5lUnhNYWNBZGRyRW50cnkKKy8vCisvLyBEZXNjcmlwdGlvbjogUmVzZXQgYSBtdWx0aWNhc3QgZW50cnkgaW4gdGhlIEV0aGVybmV0IGNvbnRyb2xsZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcGJNYWNBZGRyX3AgICAgID0gcG9pbnRlciB0byBtdWx0aWNhc3QgZW50cnkgdG8gcmVzZXQKKy8vCisvLyBSZXR1cm5zOiAgICAgRXJyb3Jjb2RlICAgICAgID0ga0VwbFN1Y2Nlc3NmdWwKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBFZHJ2VW5kZWZpbmVSeE1hY0FkZHJFbnRyeShCWVRFICogcGJNYWNBZGRyX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwlEV09SRCBkd0RhdGE7CisJQllURSBiSGFzaDsKKworCWJIYXNoID0gRWRydkNhbGNIYXNoKHBiTWFjQWRkcl9wKTsKKworCWlmIChiSGFzaCA+IDMxKSB7CisJCWR3RGF0YSA9IEVEUlZfUkVHRFdfUkVBRChFRFJWX1JFR0RXX01BUjQpOworCQlkd0RhdGEgJj0gfigxIDw8IChiSGFzaCAtIDMyKSk7CisJCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19NQVI0LCBkd0RhdGEpOworCX0gZWxzZSB7CisJCWR3RGF0YSA9IEVEUlZfUkVHRFdfUkVBRChFRFJWX1JFR0RXX01BUjApOworCQlkd0RhdGEgJj0gfigxIDw8IGJIYXNoKTsKKwkJRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX01BUjAsIGR3RGF0YSk7CisJfQorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRWRydkFsbG9jVHhNc2dCdWZmZXIKKy8vCisvLyBEZXNjcmlwdGlvbjogUmVnaXN0ZXIgYSBUeC1CdWZmZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEJ1ZmZlcl9wICAgPSBwb2ludGVyIHRvIEJ1ZmZlciBzdHJ1Y3R1cmUKKy8vCisvLyBSZXR1cm5zOiAgICAgRXJyb3Jjb2RlICAgPSBrRXBsU3VjY2Vzc2Z1bAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgID0ga0VwbEVkcnZOb0ZyZWVCdWZFbnRyeQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIEVkcnZBbGxvY1R4TXNnQnVmZmVyKHRFZHJ2VHhCdWZmZXIgKiBwQnVmZmVyX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwlEV09SRCBpOworCisJaWYgKHBCdWZmZXJfcC0+bV91aU1heEJ1ZmZlckxlbiA+IEVEUlZfTUFYX0ZSQU1FX1NJWkUpIHsKKwkJUmV0ID0ga0VwbEVkcnZOb0ZyZWVCdWZFbnRyeTsKKwkJZ290byBFeGl0OworCX0KKwkvLyBzZWFyY2ggYSBmcmVlIFR4IGJ1ZmZlciB3aXRoIGFwcHJvcHJpYXRlIHNpemUKKwlmb3IgKGkgPSAwOyBpIDwgRURSVl9NQVhfVFhfQlVGRkVSUzsgaSsrKSB7CisJCWlmIChFZHJ2SW5zdGFuY2VfbC5tX2FmVHhCdWZVc2VkW2ldID09IEZBTFNFKSB7CisJCQkvLyBmcmVlIGNoYW5uZWwgZm91bmQKKwkJCUVkcnZJbnN0YW5jZV9sLm1fYWZUeEJ1ZlVzZWRbaV0gPSBUUlVFOworCQkJcEJ1ZmZlcl9wLT5tX3VpQnVmZmVyTnVtYmVyID0gaTsKKwkJCXBCdWZmZXJfcC0+bV9wYkJ1ZmZlciA9CisJCQkgICAgRWRydkluc3RhbmNlX2wubV9wYlR4QnVmICsKKwkJCSAgICAoaSAqIEVEUlZfTUFYX0ZSQU1FX1NJWkUpOworCQkJcEJ1ZmZlcl9wLT5tX3VpTWF4QnVmZmVyTGVuID0gRURSVl9NQVhfRlJBTUVfU0laRTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChpID49IEVEUlZfTUFYX1RYX0JVRkZFUlMpIHsKKwkJUmV0ID0ga0VwbEVkcnZOb0ZyZWVCdWZFbnRyeTsKKwkJZ290byBFeGl0OworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVkcnZSZWxlYXNlVHhNc2dCdWZmZXIKKy8vCisvLyBEZXNjcmlwdGlvbjogUmVnaXN0ZXIgYSBUeC1CdWZmZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEJ1ZmZlcl9wICAgPSBwb2ludGVyIHRvIEJ1ZmZlciBzdHJ1Y3R1cmUKKy8vCisvLyBSZXR1cm5zOiAgICAgRXJyb3Jjb2RlICAgPSBrRXBsU3VjY2Vzc2Z1bAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIEVkcnZSZWxlYXNlVHhNc2dCdWZmZXIodEVkcnZUeEJ1ZmZlciAqIHBCdWZmZXJfcCkKK3sKKwl1bnNpZ25lZCBpbnQgdWlCdWZmZXJOdW1iZXI7CisKKwl1aUJ1ZmZlck51bWJlciA9IHBCdWZmZXJfcC0+bV91aUJ1ZmZlck51bWJlcjsKKworCWlmICh1aUJ1ZmZlck51bWJlciA8IEVEUlZfTUFYX1RYX0JVRkZFUlMpIHsKKwkJRWRydkluc3RhbmNlX2wubV9hZlR4QnVmVXNlZFt1aUJ1ZmZlck51bWJlcl0gPSBGQUxTRTsKKwl9CisKKwlyZXR1cm4ga0VwbFN1Y2Nlc3NmdWw7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRWRydlNlbmRUeE1zZworLy8KKy8vIERlc2NyaXB0aW9uOiBpbW1lZGlhdGVseSBzdGFydHMgdGhlIHRyYW5zbWlzc2lvbiBvZiB0aGUgYnVmZmVyCisvLworLy8gUGFyYW1ldGVyczogIHBCdWZmZXJfcCAgID0gYnVmZmVyIGRlc2NyaXB0b3IgdG8gdHJhbnNtaXQKKy8vCisvLyBSZXR1cm5zOiAgICAgRXJyb3Jjb2RlICAgPSBrRXBsU3VjY2Vzc2Z1bAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIEVkcnZTZW5kVHhNc2codEVkcnZUeEJ1ZmZlciAqIHBCdWZmZXJfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXVuc2lnbmVkIGludCB1aUJ1ZmZlck51bWJlcjsKKwlEV09SRCBkd1RlbXA7CisKKwl1aUJ1ZmZlck51bWJlciA9IHBCdWZmZXJfcC0+bV91aUJ1ZmZlck51bWJlcjsKKworCWlmICgodWlCdWZmZXJOdW1iZXIgPj0gRURSVl9NQVhfVFhfQlVGRkVSUykKKwkgICAgfHwgKEVkcnZJbnN0YW5jZV9sLm1fYWZUeEJ1ZlVzZWRbdWlCdWZmZXJOdW1iZXJdID09IEZBTFNFKSkgeworCQlSZXQgPSBrRXBsRWRydkJ1Zk5vdEV4aXN0aW5nOworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKEVkcnZJbnN0YW5jZV9sLm1fcExhc3RUcmFuc21pdHRlZFR4QnVmZmVyICE9IE5VTEwpIHsJLy8gdHJhbnNtaXNzaW9uIGlzIGFscmVhZHkgYWN0aXZlCisJCVJldCA9IGtFcGxJbnZhbGlkT3BlcmF0aW9uOworCQlkd1RlbXAgPQorCQkgICAgRURSVl9SRUdEV19SRUFEKChFRFJWX1JFR0RXX1RTRDAgKworCQkJCSAgICAgKEVkcnZJbnN0YW5jZV9sLm1fdWlDdXJUeERlc2MgKgorCQkJCSAgICAgIHNpemVvZihEV09SRCkpKSk7CisJCXByaW50aygiJXMgSW52T3AgVFNEJXUgPSAweCUwOGxYIiwgX19mdW5jX18sCisJCSAgICAgICBFZHJ2SW5zdGFuY2VfbC5tX3VpQ3VyVHhEZXNjLCBkd1RlbXApOworCQlwcmludGsoIiAgQ21kID0gMHglMDJYXG4iLAorCQkgICAgICAgKFdPUkQpIEVEUlZfUkVHQl9SRUFEKEVEUlZfUkVHQl9DT01NQU5EKSk7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gc2F2ZSBwb2ludGVyIHRvIGJ1ZmZlciBzdHJ1Y3R1cmUgZm9yIFR4SGFuZGxlcgorCUVkcnZJbnN0YW5jZV9sLm1fcExhc3RUcmFuc21pdHRlZFR4QnVmZmVyID0gcEJ1ZmZlcl9wOworCisJRURSVl9DT1VOVF9TRU5EOworCisJLy8gcGFkIHdpdGggemVyb3MgaWYgbmVjZXNzYXJ5LCBiZWNhdXNlIGNvbnRyb2xsZXIgZG9lcyBub3QgZG8gaXQKKwlpZiAocEJ1ZmZlcl9wLT5tX3VpVHhNc2dMZW4gPCBNSU5fRVRIX1NJWkUpIHsKKwkJRVBMX01FTVNFVChwQnVmZmVyX3AtPm1fcGJCdWZmZXIgKyBwQnVmZmVyX3AtPm1fdWlUeE1zZ0xlbiwgMCwKKwkJCSAgIE1JTl9FVEhfU0laRSAtIHBCdWZmZXJfcC0+bV91aVR4TXNnTGVuKTsKKwkJcEJ1ZmZlcl9wLT5tX3VpVHhNc2dMZW4gPSBNSU5fRVRIX1NJWkU7CisJfQorCS8vIHNldCBETUEgYWRkcmVzcyBvZiBidWZmZXIKKwlFRFJWX1JFR0RXX1dSSVRFKChFRFJWX1JFR0RXX1RTQUQwICsKKwkJCSAgKEVkcnZJbnN0YW5jZV9sLm1fdWlDdXJUeERlc2MgKiBzaXplb2YoRFdPUkQpKSksCisJCQkgKEVkcnZJbnN0YW5jZV9sLm1fcFR4QnVmRG1hICsKKwkJCSAgKHVpQnVmZmVyTnVtYmVyICogRURSVl9NQVhfRlJBTUVfU0laRSkpKTsKKwlkd1RlbXAgPQorCSAgICBFRFJWX1JFR0RXX1JFQUQoKEVEUlZfUkVHRFdfVFNBRDAgKworCQkJICAgICAoRWRydkluc3RhbmNlX2wubV91aUN1clR4RGVzYyAqIHNpemVvZihEV09SRCkpKSk7CisvLyAgICBwcmludGsoIiVzIFRTQUQldSA9IDB4JTA4bFgiLCBfX2Z1bmNfXywgRWRydkluc3RhbmNlX2wubV91aUN1clR4RGVzYywgZHdUZW1wKTsKKworCS8vIHN0YXJ0IHRyYW5zbWlzc2lvbgorCUVEUlZfUkVHRFdfV1JJVEUoKEVEUlZfUkVHRFdfVFNEMCArCisJCQkgIChFZHJ2SW5zdGFuY2VfbC5tX3VpQ3VyVHhEZXNjICogc2l6ZW9mKERXT1JEKSkpLAorCQkJIChFRFJWX1JFR0RXX1RTRF9UWFRIX0RFRiB8IHBCdWZmZXJfcC0+bV91aVR4TXNnTGVuKSk7CisJZHdUZW1wID0KKwkgICAgRURSVl9SRUdEV19SRUFEKChFRFJWX1JFR0RXX1RTRDAgKworCQkJICAgICAoRWRydkluc3RhbmNlX2wubV91aUN1clR4RGVzYyAqIHNpemVvZihEV09SRCkpKSk7CisvLyAgICBwcmludGsoIiBUU0QldSA9IDB4JTA4bFggLyAweCUwOGxYXG4iLCBFZHJ2SW5zdGFuY2VfbC5tX3VpQ3VyVHhEZXNjLCBkd1RlbXAsIChEV09SRCkoRURSVl9SRUdEV19UU0RfVFhUSF9ERUYgfCBwQnVmZmVyX3AtPm1fdWlUeE1zZ0xlbikpOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKyNpZiAwCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFZHJ2VHhNc2dSZWFkeQorLy8KKy8vIERlc2NyaXB0aW9uOiBzdGFydHMgY29weWluZyB0aGUgYnVmZmVyIHRvIHRoZSBldGhlcm5ldCBjb250cm9sbGVyJ3MgRklGTworLy8KKy8vIFBhcmFtZXRlcnM6ICBwYkJ1ZmZlcl9wIC0gYnVmZmVyZGVzY3JpcHRvciB0byB0cmFuc21pdAorLy8KKy8vIFJldHVybnM6ICAgICBFcnJvcmNvZGUgLSBrRXBsU3VjY2Vzc2Z1bAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIEVkcnZUeE1zZ1JlYWR5KHRFZHJ2VHhCdWZmZXIgKiBwQnVmZmVyX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl1bnNpZ25lZCBpbnQgdWlCdWZmZXJOdW1iZXI7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRWRydlR4TXNnU3RhcnQKKy8vCisvLyBEZXNjcmlwdGlvbjogc3RhcnRzIHRyYW5zbWlzc2lvbiBvZiB0aGUgZXRoZXJuZXQgY29udHJvbGxlcidzIEZJRk8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcGJCdWZmZXJfcCAtIGJ1ZmZlcmRlc2NyaXB0b3IgdG8gdHJhbnNtaXQKKy8vCisvLyBSZXR1cm5zOiAgICAgRXJyb3Jjb2RlIC0ga0VwbFN1Y2Nlc3NmdWwKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBFZHJ2VHhNc2dTdGFydCh0RWRydlR4QnVmZmVyICogcEJ1ZmZlcl9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlyZXR1cm4gUmV0OworfQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVkcnZSZWluaXRSeAorLy8KKy8vIERlc2NyaXB0aW9uOiByZWluaXRpYWxpemUgdGhlIFJ4IHByb2Nlc3MsIGJlY2F1c2Ugb2YgZXJyb3IKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdm9pZAorLy8KKy8vIFJldHVybnM6ICAgICB2b2lkCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB2b2lkIEVkcnZSZWluaXRSeCh2b2lkKQoreworCUJZVEUgYkNtZDsKKworCS8vIHNpbXBseSBzd2l0Y2ggb2ZmIGFuZCBvbiB0aGUgcmVjZWl2ZXIKKwkvLyB0aGlzIHdpbGwgcmVzZXQgdGhlIENBUFIgcmVnaXN0ZXIKKwliQ21kID0gRURSVl9SRUdCX1JFQUQoRURSVl9SRUdCX0NPTU1BTkQpOworCUVEUlZfUkVHQl9XUklURShFRFJWX1JFR0JfQ09NTUFORCwgKGJDbWQgJiB+RURSVl9SRUdCX0NPTU1BTkRfUkUpKTsKKwlFRFJWX1JFR0JfV1JJVEUoRURSVl9SRUdCX0NPTU1BTkQsIGJDbWQpOworCisJLy8gc2V0IHJlY2VpdmUgY29uZmlndXJhdGlvbiByZWdpc3RlcgorCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19SQ1IsIEVEUlZfUkVHRFdfUkNSX0RFRik7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgICBFZHJ2SW50ZXJydXB0SGFuZGxlcgorLy8KKy8vIERlc2NyaXB0aW9uOiAgaW50ZXJydXB0IGhhbmRsZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgIHZvaWQKKy8vCisvLyBSZXR1cm5zOiAgICAgIHZvaWQKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIDAKK3ZvaWQgRWRydkludGVycnVwdEhhbmRsZXIodm9pZCkKK3sKK30KKyNlbmRpZgorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwxOSkKK3N0YXRpYyBpbnQgVGd0RXRoSXNyKGludCBuSXJxTnVtX3AsIHZvaWQgKnBwRGV2SW5zdERhdGFfcCkKKyNlbHNlCitzdGF0aWMgaW50IFRndEV0aElzcihpbnQgbklycU51bV9wLCB2b2lkICpwcERldkluc3REYXRhX3AsCisJCSAgICAgc3RydWN0IHB0X3JlZ3MgKnB0UmVnc19wKQorI2VuZGlmCit7CisvLyAgICBFZHJ2SW50ZXJydXB0SGFuZGxlcigpOworCXRFZHJ2UnhCdWZmZXIgUnhCdWZmZXI7CisJdEVkcnZUeEJ1ZmZlciAqcFR4QnVmZmVyOworCVdPUkQgd1N0YXR1czsKKwlEV09SRCBkd1R4U3RhdHVzOworCURXT1JEIGR3UnhTdGF0dXM7CisJV09SRCB3Q3VyUng7CisJQllURSAqcGJSeEJ1ZjsKKwl1bnNpZ25lZCBpbnQgdWlMZW5ndGg7CisJaW50IGlIYW5kbGVkID0gSVJRX0hBTkRMRUQ7CisKKy8vICAgIHByaW50aygipCIpOworCisJLy8gcmVhZCB0aGUgaW50ZXJydXB0IHN0YXR1cworCXdTdGF0dXMgPSBFRFJWX1JFR1dfUkVBRChFRFJWX1JFR1dfSU5UX1NUQVRVUyk7CisKKwkvLyBhY2tub3dsZWRnZSB0aGUgaW50ZXJydXB0cworCUVEUlZfUkVHV19XUklURShFRFJWX1JFR1dfSU5UX1NUQVRVUywgd1N0YXR1cyk7CisKKwlpZiAod1N0YXR1cyA9PSAwKSB7CisJCWlIYW5kbGVkID0gSVJRX05PTkU7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gcHJvY2VzcyB0YXNrcworCWlmICgod1N0YXR1cyAmIChFRFJWX1JFR1dfSU5UX1RFUiB8IEVEUlZfUkVHV19JTlRfVE9LKSkgIT0gMCkgewkvLyB0cmFuc21pdCBpbnRlcnJ1cHQKKworCQlpZiAoRWRydkluc3RhbmNlX2wubV9wYlR4QnVmID09IE5VTEwpIHsKKwkJCXByaW50aygiJXMgVHggYnVmZmVycyBjdXJyZW50bHkgbm90IGFsbG9jYXRlZFxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXyk7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJLy8gcmVhZCB0cmFuc21pdCBzdGF0dXMKKwkJZHdUeFN0YXR1cyA9CisJCSAgICBFRFJWX1JFR0RXX1JFQUQoKEVEUlZfUkVHRFdfVFNEMCArCisJCQkJICAgICAoRWRydkluc3RhbmNlX2wubV91aUN1clR4RGVzYyAqCisJCQkJICAgICAgc2l6ZW9mKERXT1JEKSkpKTsKKwkJaWYgKChkd1R4U3RhdHVzICYgKEVEUlZfUkVHRFdfVFNEX1RPSyB8IEVEUlZfUkVHRFdfVFNEX1RBQlQgfCBFRFJWX1JFR0RXX1RTRF9UVU4pKSAhPSAwKSB7CS8vIHRyYW5zbWl0IGZpbmlzaGVkCisJCQlFZHJ2SW5zdGFuY2VfbC5tX3VpQ3VyVHhEZXNjID0KKwkJCSAgICAoRWRydkluc3RhbmNlX2wubV91aUN1clR4RGVzYyArIDEpICYgMHgwMzsKKwkJCXBUeEJ1ZmZlciA9IEVkcnZJbnN0YW5jZV9sLm1fcExhc3RUcmFuc21pdHRlZFR4QnVmZmVyOworCQkJRWRydkluc3RhbmNlX2wubV9wTGFzdFRyYW5zbWl0dGVkVHhCdWZmZXIgPSBOVUxMOworCisJCQlpZiAoKGR3VHhTdGF0dXMgJiBFRFJWX1JFR0RXX1RTRF9UT0spICE9IDApIHsKKwkJCQlFRFJWX0NPVU5UX1RYOworCQkJfSBlbHNlIGlmICgoZHdUeFN0YXR1cyAmIEVEUlZfUkVHRFdfVFNEX1RVTikgIT0gMCkgeworCQkJCUVEUlZfQ09VTlRfVFhfRlVOOworCQkJfSBlbHNlIHsJLy8gYXNzdW1lIEVEUlZfUkVHRFdfVFNEX1RBQlQKKwkJCQlFRFJWX0NPVU5UX1RYX0NPTF9STDsKKwkJCX0KKworLy8gICAgICAgICAgICBwcmludGsoIlQiKTsKKwkJCWlmIChwVHhCdWZmZXIgIT0gTlVMTCkgeworCQkJCS8vIGNhbGwgVHggaGFuZGxlciBvZiBEYXRhIGxpbmsgbGF5ZXIKKwkJCQlFZHJ2SW5zdGFuY2VfbC5tX0luaXRQYXJhbS4KKwkJCQkgICAgbV9wZm5UeEhhbmRsZXIocFR4QnVmZmVyKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCUVEUlZfQ09VTlRfVFhfRVJSOworCQl9CisJfQorCisJaWYgKCh3U3RhdHVzICYgKEVEUlZfUkVHV19JTlRfUkVSIHwgRURSVl9SRUdXX0lOVF9GT1ZXIHwgRURSVl9SRUdXX0lOVF9SWE9WVyB8IEVEUlZfUkVHV19JTlRfUFVOKSkgIT0gMCkgewkvLyByZWNlaXZlIGVycm9yIGludGVycnVwdAorCisJCWlmICgod1N0YXR1cyAmIEVEUlZfUkVHV19JTlRfRk9WVykgIT0gMCkgeworCQkJRURSVl9DT1VOVF9SWF9GT1ZXOworCQl9IGVsc2UgaWYgKCh3U3RhdHVzICYgRURSVl9SRUdXX0lOVF9SWE9WVykgIT0gMCkgeworCQkJRURSVl9DT1VOVF9SWF9PVlc7CisJCX0gZWxzZSBpZiAoKHdTdGF0dXMgJiBFRFJWX1JFR1dfSU5UX1BVTikgIT0gMCkgewkvLyBQYWNrZXQgdW5kZXJydW4KKwkJCUVEUlZfVFJBQ0VfUlhfUFVOKHdTdGF0dXMpOworCQkJRURSVl9DT1VOVF9SWF9QVU47CisJCX0gZWxzZSB7CS8qaWYgKCh3U3RhdHVzICYgRURSVl9SRUdXX0lOVF9SRVIpICE9IDApICovCisKKwkJCUVEUlZfVFJBQ0VfUlhfRVJSKHdTdGF0dXMpOworCQkJRURSVl9DT1VOVF9SWF9FUlI7CisJCX0KKworCQkvLyByZWluaXRpYWxpemUgUnggcHJvY2VzcworCQlFZHJ2UmVpbml0UngoKTsKKwl9CisKKwlpZiAoKHdTdGF0dXMgJiBFRFJWX1JFR1dfSU5UX1JPSykgIT0gMCkgewkvLyByZWNlaXZlIGludGVycnVwdAorCisJCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BiUnhCdWYgPT0gTlVMTCkgeworCQkJcHJpbnRrKCIlcyBSeCBidWZmZXJzIGN1cnJlbnRseSBub3QgYWxsb2NhdGVkXG4iLAorCQkJICAgICAgIF9fZnVuY19fKTsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQkvLyByZWFkIGN1cnJlbnQgb2Zmc2V0IGluIHJlY2VpdmUgYnVmZmVyCisJCXdDdXJSeCA9CisJCSAgICAoRURSVl9SRUdXX1JFQUQoRURSVl9SRUdXX0NBUFIpICsKKwkJICAgICAweDEwKSAlIEVEUlZfUlhfQlVGRkVSX0xFTkdUSDsKKworCQl3aGlsZSAoKEVEUlZfUkVHQl9SRUFEKEVEUlZfUkVHQl9DT01NQU5EKSAmIEVEUlZfUkVHQl9DT01NQU5EX0JVRkUpID09IDApIHsJLy8gZnJhbWUgYXZhaWxhYmxlCisKKwkJCS8vIGNhbGN1bGF0ZSBwb2ludGVyIHRvIGN1cnJlbnQgZnJhbWUgaW4gcmVjZWl2ZSBidWZmZXIKKwkJCXBiUnhCdWYgPSBFZHJ2SW5zdGFuY2VfbC5tX3BiUnhCdWYgKyB3Q3VyUng7CisKKwkJCS8vIHJlYWQgcmVjZWl2ZSBzdGF0dXMgRFdPUkQKKwkJCWR3UnhTdGF0dXMgPSBsZTMyX3RvX2NwdSgqKChEV09SRCAqKSBwYlJ4QnVmKSk7CisKKwkJCS8vIGNhbGN1bGF0ZSBsZW5ndGggb2YgcmVjZWl2ZWQgZnJhbWUKKwkJCXVpTGVuZ3RoID0gZHdSeFN0YXR1cyA+PiAxNjsKKworCQkJaWYgKHVpTGVuZ3RoID09IDB4RkZGMCkgewkvLyBmcmFtZSBpcyB1bmZpbmlzaGVkIChtYXliZSBlYXJseSBSeCBpbnRlcnJ1cHQgaXMgYWN0aXZlKQorCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoKGR3UnhTdGF0dXMgJiBFRFJWX1JYU1RBVF9ST0spID09IDApIHsJLy8gZXJyb3Igb2NjdXJlZCB3aGlsZSByZWNlaXZpbmcgdGhpcyBmcmFtZQorCQkJCS8vIGlnbm9yZSBpdAorCQkJCWlmICgoZHdSeFN0YXR1cyAmIEVEUlZfUlhTVEFUX0ZBRSkgIT0gMCkgeworCQkJCQlFRFJWX0NPVU5UX1JYX0ZBRTsKKwkJCQl9IGVsc2UgaWYgKChkd1J4U3RhdHVzICYgRURSVl9SWFNUQVRfQ1JDKSAhPSAwKSB7CisJCQkJCUVEUlZfVFJBQ0VfUlhfQ1JDKGR3UnhTdGF0dXMpOworCQkJCQlFRFJWX0NPVU5UX1JYX0NSQzsKKwkJCQl9IGVsc2UgeworCQkJCQlFRFJWX1RSQUNFX1JYX0VSUihkd1J4U3RhdHVzKTsKKwkJCQkJRURSVl9DT1VOVF9SWF9FUlI7CisJCQkJfQorCisJCQkJLy8gcmVpbml0aWFsaXplIFJ4IHByb2Nlc3MKKwkJCQlFZHJ2UmVpbml0UngoKTsKKworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsJLy8gZnJhbWUgaXMgT0sKKwkJCQlSeEJ1ZmZlci5tX0J1ZmZlckluRnJhbWUgPQorCQkJCSAgICBrRWRydkJ1ZmZlckxhc3RJbkZyYW1lOworCQkJCVJ4QnVmZmVyLm1fdWlSeE1zZ0xlbiA9IHVpTGVuZ3RoIC0gRVRIX0NSQ19TSVpFOworCQkJCVJ4QnVmZmVyLm1fcGJCdWZmZXIgPQorCQkJCSAgICBwYlJ4QnVmICsgc2l6ZW9mKGR3UnhTdGF0dXMpOworCisvLyAgICAgICAgICAgICAgICBwcmludGsoIlIiKTsKKwkJCQlFRFJWX0NPVU5UX1JYOworCisJCQkJLy8gY2FsbCBSeCBoYW5kbGVyIG9mIERhdGEgbGluayBsYXllcgorCQkJCUVkcnZJbnN0YW5jZV9sLm1fSW5pdFBhcmFtLgorCQkJCSAgICBtX3BmblJ4SGFuZGxlcigmUnhCdWZmZXIpOworCQkJfQorCisJCQkvLyBjYWx1bGF0ZSBuZXcgb2Zmc2V0IChEV09SRCBhbGlnbmVkKQorCQkJd0N1clJ4ID0KKwkJCSAgICAoV09SRCkgKCh3Q3VyUnggKyB1aUxlbmd0aCArIHNpemVvZihkd1J4U3RhdHVzKSArCisJCQkJICAgICAzKSAmIH4weDMpOworCQkJRURSVl9UUkFDRV9DQVBSKHdDdXJSeCAtIDB4MTApOworCQkJRURSVl9SRUdXX1dSSVRFKEVEUlZfUkVHV19DQVBSLCB3Q3VyUnggLSAweDEwKTsKKworCQkJLy8gcmVyZWFkIGN1cnJlbnQgb2Zmc2V0IGluIHJlY2VpdmUgYnVmZmVyCisJCQl3Q3VyUnggPQorCQkJICAgIChFRFJWX1JFR1dfUkVBRChFRFJWX1JFR1dfQ0FQUikgKworCQkJICAgICAweDEwKSAlIEVEUlZfUlhfQlVGRkVSX0xFTkdUSDsKKworCQl9CisJfQorCisJaWYgKCh3U3RhdHVzICYgRURSVl9SRUdXX0lOVF9TRVJSKSAhPSAwKSB7CS8vIFBDSSBlcnJvcgorCQlFRFJWX0NPVU5UX1BDSV9FUlI7CisJfQorCisJaWYgKCh3U3RhdHVzICYgRURSVl9SRUdXX0lOVF9USU1FT1VUKSAhPSAwKSB7CS8vIFRpbWVvdXQKKwkJRURSVl9DT1VOVF9USU1FT1VUOworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gaUhhbmRsZWQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVkcnZJbml0T25lCisvLworLy8gRGVzY3JpcHRpb246IGluaXRpYWxpemVzIG9uZSBQQ0kgZGV2aWNlCisvLworLy8gUGFyYW1ldGVyczogIHBQY2lEZXYgICAgICAgICAgICAgPSBwb2ludGVyIHRvIGNvcnJlc3BvbmRpbmcgUENJIGRldmljZSBzdHJ1Y3R1cmUKKy8vICAgICAgICAgICAgICBwSWQgICAgICAgICAgICAgICAgID0gUENJIGRldmljZSBJRAorLy8KKy8vIFJldHVybnM6ICAgICAoaW50KSAgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQgRWRydkluaXRPbmUoc3RydWN0IHBjaV9kZXYgKnBQY2lEZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwSWQpCit7CisJaW50IGlSZXN1bHQgPSAwOworCURXT1JEIGR3VGVtcDsKKworCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BQY2lEZXYgIT0gTlVMTCkgewkvLyBFZHJ2IGlzIGFscmVhZHkgY29ubmVjdGVkIHRvIGEgUENJIGRldmljZQorCQlwcmludGsoIiVzIGRldmljZSAlcyBkaXNjYXJkZWRcbiIsIF9fZnVuY19fLAorCQkgICAgICAgcGNpX25hbWUocFBjaURldikpOworCQlpUmVzdWx0ID0gLUVOT0RFVjsKKwkJZ290byBFeGl0OworCX0KKworCWlmIChwUGNpRGV2LT5yZXZpc2lvbiA+PSAweDIwKSB7CisJCXByaW50aworCQkgICAgKCIlcyBkZXZpY2UgJXMgaXMgYW4gZW5oYW5jZWQgODEzOUMrIHZlcnNpb24sIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWRcbiIsCisJCSAgICAgX19mdW5jX18sIHBjaV9uYW1lKHBQY2lEZXYpKTsKKwkJaVJlc3VsdCA9IC1FTk9ERVY7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlFZHJ2SW5zdGFuY2VfbC5tX3BQY2lEZXYgPSBwUGNpRGV2OworCisJLy8gZW5hYmxlIGRldmljZQorCXByaW50aygiJXMgZW5hYmxlIGRldmljZVxuIiwgX19mdW5jX18pOworCWlSZXN1bHQgPSBwY2lfZW5hYmxlX2RldmljZShwUGNpRGV2KTsKKwlpZiAoaVJlc3VsdCAhPSAwKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAoKHBjaV9yZXNvdXJjZV9mbGFncyhwUGNpRGV2LCAxKSAmIElPUkVTT1VSQ0VfTUVNKSA9PSAwKSB7CisJCWlSZXN1bHQgPSAtRU5PREVWOworCQlnb3RvIEV4aXQ7CisJfQorCisJcHJpbnRrKCIlcyByZXF1ZXN0IHJlZ2lvbnNcbiIsIF9fZnVuY19fKTsKKwlpUmVzdWx0ID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwUGNpRGV2LCBEUlZfTkFNRSk7CisJaWYgKGlSZXN1bHQgIT0gMCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisJcHJpbnRrKCIlcyBpb3JlbWFwXG4iLCBfX2Z1bmNfXyk7CisJRWRydkluc3RhbmNlX2wubV9wSW9BZGRyID0KKwkgICAgaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQocFBjaURldiwgMSksCisJCSAgICBwY2lfcmVzb3VyY2VfbGVuKHBQY2lEZXYsIDEpKTsKKwlpZiAoRWRydkluc3RhbmNlX2wubV9wSW9BZGRyID09IE5VTEwpIHsJLy8gcmVtYXAgb2YgY29udHJvbGxlcidzIHJlZ2lzdGVyIHNwYWNlIGZhaWxlZAorCQlpUmVzdWx0ID0gLUVJTzsKKwkJZ290byBFeGl0OworCX0KKwkvLyBlbmFibGUgUENJIGJ1c21hc3RlcgorCXByaW50aygiJXMgZW5hYmxlIGJ1c21hc3RlclxuIiwgX19mdW5jX18pOworCXBjaV9zZXRfbWFzdGVyKHBQY2lEZXYpOworCisJLy8gcmVzZXQgY29udHJvbGxlcgorCXByaW50aygiJXMgcmVzZXQgY29udHJvbGxlclxuIiwgX19mdW5jX18pOworCUVEUlZfUkVHQl9XUklURShFRFJWX1JFR0JfQ09NTUFORCwgRURSVl9SRUdCX0NPTU1BTkRfUlNUKTsKKworCS8vIHdhaXQgdW50aWwgcmVzZXQgaGFzIGZpbmlzaGVkCisJZm9yIChpUmVzdWx0ID0gNTAwOyBpUmVzdWx0ID4gMDsgaVJlc3VsdC0tKSB7CisJCWlmICgoRURSVl9SRUdCX1JFQUQoRURSVl9SRUdCX0NPTU1BTkQpICYgRURSVl9SRUdCX0NPTU1BTkRfUlNUKQorCQkgICAgPT0gMCkgeworCQkJYnJlYWs7CisJCX0KKworCQlzY2hlZHVsZV90aW1lb3V0KDEwKTsKKwl9CisKKwkvLyBjaGVjayBoYXJkd2FyZSB2ZXJzaW9uLCBpLmUuIGNoaXAgSUQKKwlkd1RlbXAgPSBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19UQ1IpOworCWlmICgoKGR3VGVtcCAmIEVEUlZfUkVHRFdfVENSX1ZFUl9NQVNLKSAhPSBFRFJWX1JFR0RXX1RDUl9WRVJfQykKKwkgICAgJiYgKChkd1RlbXAgJiBFRFJWX1JFR0RXX1RDUl9WRVJfTUFTSykgIT0gRURSVl9SRUdEV19UQ1JfVkVSX0QpKSB7CS8vIHVuc3VwcG9ydGVkIGNoaXAKKwkJcHJpbnRrKCIlcyBVbnN1cHBvcnRlZCBjaGlwISBUQ1IgPSAweCUwOGxYXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgIGR3VGVtcCk7CisJCWlSZXN1bHQgPSAtRU5PREVWOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGRpc2FibGUgaW50ZXJydXB0cworCXByaW50aygiJXMgZGlzYWJsZSBpbnRlcnJ1cHRzXG4iLCBfX2Z1bmNfXyk7CisJRURSVl9SRUdXX1dSSVRFKEVEUlZfUkVHV19JTlRfTUFTSywgMCk7CisJLy8gYWNrbm93bGVkZ2UgYWxsIHBlbmRpbmcgaW50ZXJydXB0cworCUVEUlZfUkVHV19XUklURShFRFJWX1JFR1dfSU5UX1NUQVRVUywKKwkJCUVEUlZfUkVHV19SRUFEKEVEUlZfUkVHV19JTlRfU1RBVFVTKSk7CisKKwkvLyBpbnN0YWxsIGludGVycnVwdCBoYW5kbGVyCisJcHJpbnRrKCIlcyBpbnN0YWxsIGludGVycnVwdCBoYW5kbGVyXG4iLCBfX2Z1bmNfXyk7CisJaVJlc3VsdCA9CisJICAgIHJlcXVlc3RfaXJxKHBQY2lEZXYtPmlycSwgVGd0RXRoSXNyLCBJUlFGX1NIQVJFRCwKKwkJCURSVl9OQU1FIC8qcFBjaURldi0+ZGV2Lm5hbWUgKi8gLCBwUGNpRGV2KTsKKwlpZiAoaVJlc3VsdCAhPSAwKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKy8qCisgICAgLy8gdW5sb2NrIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzCisgICAgcHJpbnRrKCIlcyB1bmxvY2sgY29uZmlndXJhdGlvbiByZWdpc3RlcnNcbiIsIF9fZnVuY19fKTsKKyAgICBFRFJWX1JFR0JfV1JJVEUoRURSVl9SRUdCX0NNRDkzNDYsIEVEUlZfUkVHQl9DTUQ5MzQ2X1VOTE9DSyk7CisKKyAgICAvLyBjaGVjayBpZiB1c2VyIHNwZWNpZmllZCBhIE1BQyBhZGRyZXNzCisgICAgcHJpbnRrKCIlcyBjaGVjayBzcGVjaWZpZWQgTUFDIGFkZHJlc3NcbiIsIF9fZnVuY19fKTsKKyAgICBmb3IgKGlSZXN1bHQgPSAwOyBpUmVzdWx0IDwgNjsgaVJlc3VsdCsrKQorICAgIHsKKyAgICAgICAgaWYgKEVkcnZJbnN0YW5jZV9sLm1fSW5pdFBhcmFtLm1fYWJNeU1hY0FkZHJbaVJlc3VsdF0gIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKCIlcyBzZXQgbG9jYWwgTUFDIGFkZHJlc3NcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIC8vIHdyaXRlIHRoaXMgTUFDIGFkZHJlc3MgdG8gY29udHJvbGxlcgorICAgICAgICAgICAgRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX0lEUjAsCisgICAgICAgICAgICAgICAgbGUzMl90b19jcHUoKigoRFdPUkQqKSZFZHJ2SW5zdGFuY2VfbC5tX0luaXRQYXJhbS5tX2FiTXlNYWNBZGRyWzBdKSkpOworICAgICAgICAgICAgZHdUZW1wID0gRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfSURSMCk7CisKKyAgICAgICAgICAgIEVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19JRFI0LAorICAgICAgICAgICAgICAgIGxlMzJfdG9fY3B1KCooKERXT1JEKikmRWRydkluc3RhbmNlX2wubV9Jbml0UGFyYW0ubV9hYk15TWFjQWRkcls0XSkpKTsKKyAgICAgICAgICAgIGR3VGVtcCA9IEVEUlZfUkVHRFdfUkVBRChFRFJWX1JFR0RXX0lEUjQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaVJlc3VsdCA9IDA7CisKKyAgICAvLyBsb2NrIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzCisgICAgRURSVl9SRUdCX1dSSVRFKEVEUlZfUkVHQl9DTUQ5MzQ2LCBFRFJWX1JFR0JfQ01EOTM0Nl9MT0NLKTsKKyovCisKKwkvLyBhbGxvY2F0ZSBidWZmZXJzCisJcHJpbnRrKCIlcyBhbGxvY2F0ZSBidWZmZXJzXG4iLCBfX2Z1bmNfXyk7CisJRWRydkluc3RhbmNlX2wubV9wYlR4QnVmID0KKwkgICAgcGNpX2FsbG9jX2NvbnNpc3RlbnQocFBjaURldiwgRURSVl9UWF9CVUZGRVJfU0laRSwKKwkJCQkgJkVkcnZJbnN0YW5jZV9sLm1fcFR4QnVmRG1hKTsKKwlpZiAoRWRydkluc3RhbmNlX2wubV9wYlR4QnVmID09IE5VTEwpIHsKKwkJaVJlc3VsdCA9IC1FTk9NRU07CisJCWdvdG8gRXhpdDsKKwl9CisKKwlFZHJ2SW5zdGFuY2VfbC5tX3BiUnhCdWYgPQorCSAgICBwY2lfYWxsb2NfY29uc2lzdGVudChwUGNpRGV2LCBFRFJWX1JYX0JVRkZFUl9TSVpFLAorCQkJCSAmRWRydkluc3RhbmNlX2wubV9wUnhCdWZEbWEpOworCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BiUnhCdWYgPT0gTlVMTCkgeworCQlpUmVzdWx0ID0gLUVOT01FTTsKKwkJZ290byBFeGl0OworCX0KKwkvLyByZXNldCBwb2ludGVycyBmb3IgVHggYnVmZmVycworCXByaW50aygiJXMgcmVzZXQgcG9pbnRlcnMgZm8gVHggYnVmZmVyc1xuIiwgX19mdW5jX18pOworCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19UU0FEMCwgMCk7CisJZHdUZW1wID0gRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfVFNBRDApOworCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19UU0FEMSwgMCk7CisJZHdUZW1wID0gRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfVFNBRDEpOworCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19UU0FEMiwgMCk7CisJZHdUZW1wID0gRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfVFNBRDIpOworCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19UU0FEMywgMCk7CisJZHdUZW1wID0gRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfVFNBRDMpOworCisJcHJpbnRrKCIgICAgQ29tbWFuZCA9IDB4JTAyWFxuIiwKKwkgICAgICAgKFdPUkQpIEVEUlZfUkVHQl9SRUFEKEVEUlZfUkVHQl9DT01NQU5EKSk7CisKKwkvLyBzZXQgcG9pbnRlciBmb3IgcmVjZWl2ZSBidWZmZXIgaW4gY29udHJvbGxlcgorCXByaW50aygiJXMgc2V0IHBvaW50ZXIgdG8gUnggYnVmZmVyXG4iLCBfX2Z1bmNfXyk7CisJRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX1JCU1RBUlQsIEVkcnZJbnN0YW5jZV9sLm1fcFJ4QnVmRG1hKTsKKworCS8vIGVuYWJsZSB0cmFuc21pdHRlciBhbmQgcmVjZWl2ZXIKKwlwcmludGsoIiVzIGVuYWJsZSBUeCBhbmQgUngiLCBfX2Z1bmNfXyk7CisJRURSVl9SRUdCX1dSSVRFKEVEUlZfUkVHQl9DT01NQU5ELAorCQkJKEVEUlZfUkVHQl9DT01NQU5EX1JFIHwgRURSVl9SRUdCX0NPTU1BTkRfVEUpKTsKKwlwcmludGsoIiAgQ29tbWFuZCA9IDB4JTAyWFxuIiwKKwkgICAgICAgKFdPUkQpIEVEUlZfUkVHQl9SRUFEKEVEUlZfUkVHQl9DT01NQU5EKSk7CisKKwkvLyBjbGVhciBtaXNzZWQgcGFja2V0IGNvdW50ZXIgdG8gZW5hYmxlIFJ4L1R4IHByb2Nlc3MKKwlFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfTVBDLCAwKTsKKworCS8vIHNldCB0cmFuc21pdCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyCisJcHJpbnRrKCIlcyBzZXQgVHggY29uZiByZWdpc3RlciIsIF9fZnVuY19fKTsKKwlFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfVENSLCBFRFJWX1JFR0RXX1RDUl9ERUYpOworCXByaW50aygiID0gMHglMDhYXG4iLCBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19UQ1IpKTsKKworCS8vIHNldCByZWNlaXZlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKKwlwcmludGsoIiVzIHNldCBSeCBjb25mIHJlZ2lzdGVyIiwgX19mdW5jX18pOworCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19SQ1IsIEVEUlZfUkVHRFdfUkNSX0RFRik7CisJcHJpbnRrKCIgPSAweCUwOFhcbiIsIEVEUlZfUkVHRFdfUkVBRChFRFJWX1JFR0RXX1JDUikpOworCisJLy8gcmVzZXQgbXVsdGljYXN0IE1BQyBhZGRyZXNzIGZpbHRlcgorCUVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19NQVIwLCAwKTsKKwlkd1RlbXAgPSBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19NQVIwKTsKKwlFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfTUFSNCwgMCk7CisJZHdUZW1wID0gRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfTUFSNCk7CisKKy8qCisgICAgLy8gZW5hYmxlIHRyYW5zbWl0dGVyIGFuZCByZWNlaXZlcgorICAgIHByaW50aygiJXMgZW5hYmxlIFR4IGFuZCBSeCIsIF9fZnVuY19fKTsKKyAgICBFRFJWX1JFR0JfV1JJVEUoRURSVl9SRUdCX0NPTU1BTkQsIChFRFJWX1JFR0JfQ09NTUFORF9SRSB8IEVEUlZfUkVHQl9DT01NQU5EX1RFKSk7CisgICAgcHJpbnRrKCIgIENvbW1hbmQgPSAweCUwMlhcbiIsIChXT1JEKSBFRFJWX1JFR0JfUkVBRChFRFJWX1JFR0JfQ09NTUFORCkpOworKi8KKwkvLyBkaXNhYmxlIGVhcmx5IGludGVycnVwdHMKKwlFRFJWX1JFR1dfV1JJVEUoRURSVl9SRUdXX01VTElOVCwgMCk7CisKKwkvLyBlbmFibGUgaW50ZXJydXB0cworCXByaW50aygiJXMgZW5hYmxlIGludGVycnVwdHNcbiIsIF9fZnVuY19fKTsKKwlFRFJWX1JFR1dfV1JJVEUoRURSVl9SRUdXX0lOVF9NQVNLLCBFRFJWX1JFR1dfSU5UX01BU0tfREVGKTsKKworICAgICAgRXhpdDoKKwlwcmludGsoIiVzIGZpbmlzaGVkIHdpdGggJWRcbiIsIF9fZnVuY19fLCBpUmVzdWx0KTsKKwlyZXR1cm4gaVJlc3VsdDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRWRydlJlbW92ZU9uZQorLy8KKy8vIERlc2NyaXB0aW9uOiBzaHV0cyBkb3duIG9uZSBQQ0kgZGV2aWNlCisvLworLy8gUGFyYW1ldGVyczogIHBQY2lEZXYgICAgICAgICAgICAgPSBwb2ludGVyIHRvIGNvcnJlc3BvbmRpbmcgUENJIGRldmljZSBzdHJ1Y3R1cmUKKy8vCisvLyBSZXR1cm5zOiAgICAgKHZvaWQpCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgRWRydlJlbW92ZU9uZShzdHJ1Y3QgcGNpX2RldiAqcFBjaURldikKK3sKKworCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BQY2lEZXYgIT0gcFBjaURldikgewkvLyB0cnlpbmcgdG8gcmVtb3ZlIHVua25vd24gZGV2aWNlCisJCUJVR19PTihFZHJ2SW5zdGFuY2VfbC5tX3BQY2lEZXYgIT0gcFBjaURldik7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZGlzYWJsZSB0cmFuc21pdHRlciBhbmQgcmVjZWl2ZXIKKwlFRFJWX1JFR0JfV1JJVEUoRURSVl9SRUdCX0NPTU1BTkQsIDApOworCisJLy8gZGlzYWJsZSBpbnRlcnJ1cHRzCisJRURSVl9SRUdXX1dSSVRFKEVEUlZfUkVHV19JTlRfTUFTSywgMCk7CisKKwkvLyByZW1vdmUgaW50ZXJydXB0IGhhbmRsZXIKKwlmcmVlX2lycShwUGNpRGV2LT5pcnEsIHBQY2lEZXYpOworCisJLy8gZnJlZSBidWZmZXJzCisJaWYgKEVkcnZJbnN0YW5jZV9sLm1fcGJUeEJ1ZiAhPSBOVUxMKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocFBjaURldiwgRURSVl9UWF9CVUZGRVJfU0laRSwKKwkJCQkgICAgRWRydkluc3RhbmNlX2wubV9wYlR4QnVmLAorCQkJCSAgICBFZHJ2SW5zdGFuY2VfbC5tX3BUeEJ1ZkRtYSk7CisJCUVkcnZJbnN0YW5jZV9sLm1fcGJUeEJ1ZiA9IE5VTEw7CisJfQorCisJaWYgKEVkcnZJbnN0YW5jZV9sLm1fcGJSeEJ1ZiAhPSBOVUxMKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocFBjaURldiwgRURSVl9SWF9CVUZGRVJfU0laRSwKKwkJCQkgICAgRWRydkluc3RhbmNlX2wubV9wYlJ4QnVmLAorCQkJCSAgICBFZHJ2SW5zdGFuY2VfbC5tX3BSeEJ1ZkRtYSk7CisJCUVkcnZJbnN0YW5jZV9sLm1fcGJSeEJ1ZiA9IE5VTEw7CisJfQorCS8vIHVubWFwIGNvbnRyb2xsZXIncyByZWdpc3RlciBzcGFjZQorCWlmIChFZHJ2SW5zdGFuY2VfbC5tX3BJb0FkZHIgIT0gTlVMTCkgeworCQlpb3VubWFwKEVkcnZJbnN0YW5jZV9sLm1fcElvQWRkcik7CisJfQorCS8vIGRpc2FibGUgdGhlIFBDSSBkZXZpY2UKKwlwY2lfZGlzYWJsZV9kZXZpY2UocFBjaURldik7CisKKwkvLyByZWxlYXNlIG1lbW9yeSByZWdpb25zCisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwUGNpRGV2KTsKKworCUVkcnZJbnN0YW5jZV9sLm1fcFBjaURldiA9IE5VTEw7CisKKyAgICAgIEV4aXQ6OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFZHJ2Q2FsY0hhc2gKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgZW50cnkgZm9yIHRoZSBoYXNoLXRhYmxlIGZyb20gTUFDCisvLyAgICAgICAgICAgICAgYWRkcmVzcworLy8KKy8vIFBhcmFtZXRlcnM6ICBwYk1BQ19wIC0gcG9pbnRlciB0byBNQUMgYWRkcmVzcworLy8KKy8vIFJldHVybnM6ICAgICBoYXNoIHZhbHVlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgSEFTSF9CSVRTICAgICAgICAgICAgICA2CS8vIHVzZWQgYml0cyBpbiBoYXNoCisjZGVmaW5lIENSQzMyX1BPTFkgICAgMHgwNEMxMURCNgkvLworLy8jZGVmaW5lIENSQzMyX1BPTFkgICAgMHhFREI4ODMyMCAgLy8KKy8vIEcoeCkgPSB4MzIgKyB4MjYgKyB4MjMgKyB4MjIgKyB4MTYgKyB4MTIgKyB4MTEgKyB4MTAgKyB4OCArIHg3ICsgeDUgKyB4NCArIHgyICsgeCArIDEKKworc3RhdGljIEJZVEUgRWRydkNhbGNIYXNoKEJZVEUgKiBwYk1BQ19wKQoreworCURXT1JEIGR3Qnl0ZUNvdW50ZXI7CisJRFdPUkQgZHdCaXRDb3VudGVyOworCURXT1JEIGR3RGF0YTsKKwlEV09SRCBkd0NyYzsKKwlEV09SRCBkd0NhcnJ5OworCUJZVEUgKnBiRGF0YTsKKwlCWVRFIGJIYXNoOworCisJcGJEYXRhID0gcGJNQUNfcDsKKworCS8vIGNhbGN1bGF0ZSBjcmMzMiB2YWx1ZSBvZiBtYWMgYWRkcmVzcworCWR3Q3JjID0gMHhGRkZGRkZGRjsKKworCWZvciAoZHdCeXRlQ291bnRlciA9IDA7IGR3Qnl0ZUNvdW50ZXIgPCA2OyBkd0J5dGVDb3VudGVyKyspIHsKKwkJZHdEYXRhID0gKnBiRGF0YTsKKwkJcGJEYXRhKys7CisJCWZvciAoZHdCaXRDb3VudGVyID0gMDsgZHdCaXRDb3VudGVyIDwgODsKKwkJICAgICBkd0JpdENvdW50ZXIrKywgZHdEYXRhID4+PSAxKSB7CisJCQlkd0NhcnJ5ID0gKCgoZHdDcmMgPj4gMzEpIF4gZHdEYXRhKSAmIDEpOworCQkJZHdDcmMgPSBkd0NyYyA8PCAxOworCQkJaWYgKGR3Q2FycnkgIT0gMCkgeworCQkJCWR3Q3JjID0gKGR3Q3JjIF4gQ1JDMzJfUE9MWSkgfCBkd0NhcnJ5OworCQkJfQorCQl9CisJfQorCisvLyAgICBwcmludGsoIk15Q1JDID0gMHglMDhsWFxuIiwgZHdDcmMpOworCS8vIG9ubHkgdXBwZXIgNiBiaXRzIChIQVNIX0JJVFMpIGFyZSB1c2VkCisJLy8gd2hpY2ggcG9pbnQgdG8gc3BlY2lmaWMgYml0IGluIHRoZSBoYXNoIHJlZ2lzdGVycworCWJIYXNoID0gKEJZVEUpICgoZHdDcmMgPj4gKDMyIC0gSEFTSF9CSVRTKSkgJiAweDNmKTsKKworCXJldHVybiBiSGFzaDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRWRydkZlYy5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FZHJ2RmVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYyNTJmYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRWRydkZlYy5oCkBAIC0wLDAgKzEsMTE0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW50ZXJmYWNlIGZvciBldGhlcm5ldGRyaXZlcgorICAgICAgICAgICAgICAgICJmYXN0IGV0aGVybmV0IGNvbnRyb2xsZXIiIChGRUMpCisgICAgICAgICAgICAgICAgZnJlZXNjYWxlIGNvbGRmaXJlIE1DRjUyOHggYW5kIGNvbXBhdGlibGUgRkVDCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRWRydkZlYy5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgIERldiBDKysgYW5kIEdOVS1Db21waWxlciBmb3IgbTY4aworCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDUvMDgvMDEgbS5iLjogICBzdGFydCBvZiBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FRFJWRkVDX0hfCisjZGVmaW5lIF9FRFJWRkVDX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZG8gdGhpcyBpbiBjb25maWcgaGVhZGVyCisjZGVmaW5lIFRBUkdFVF9IQVJEV0FSRSBUR1RIV19TUExDX0NGNTQKKworLy8gYmFzZSBhZGRyZXNzZXMKKyNpZiAoKFRBUkdFVF9IQVJEV0FSRSAmIFRHVF9DUFVfTUFTS18pID09IFRHVF9DUFVfNTI4MikKKworI2VsaWYgKChUQVJHRVRfSEFSRFdBUkUgJiBUR1RfQ1BVX01BU0tfKSA9PSBUR1RfQ1BVXzU0ODUpCisKKyNlbHNlCisKKyNlcnJvciAnRVJST1I6IFRhcmdldCB3YXMgbmV2ZXIgaW1wbGVtZW50ZWQhJworCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBSeCBhbmQgVHggYnVmZmVyIGRlc2NyaXB0b3IgZm9ybWF0Cit0eXBlZGVmIHN0cnVjdCB7CisJV09SRCBtX3dTdGF0dXM7CQkvLyBjb250cm9sIC8gc3RhdHVzICAtLS0gIHVzZWQgYnkgZWRydiwgZG8gbm90IGNoYW5nZSBpbiBhcHBsaWNhdGlvbgorCVdPUkQgbV93TGVuZ3RoOwkJLy8gdHJhbnNmZXIgbGVuZ3RoCisJQllURSAqbV9wYkRhdGE7CQkvLyBidWZmZXIgYWRkcmVzcworfSB0QnVmZmVyRGVzY3I7CisKKyNpZiAoKFRBUkdFVF9IQVJEV0FSRSAmIFRHVF9DUFVfTUFTS18pID09IFRHVF9DUFVfNTI4MikKKworI2VsaWYgKChUQVJHRVRfSEFSRFdBUkUgJiBUR1RfQ1BVX01BU0tfKSA9PSBUR1RfQ1BVXzU0ODUpCisKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmIC8vICNpZm5kZWYgX0VEUlZfRkVDX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VkcnZGZWM1MjgyLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VkcnZGZWM1MjgyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE2YmIxZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRWRydkZlYzUyODIuaApAQCAtMCwwICsxLDM0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGludGVyZmFjZSBmb3IgZXRoZXJuZXRkcml2ZXIKKyAgICAgICAgICAgICAgICAiZmFzdCBldGhlcm5ldCBjb250cm9sbGVyIiAoRkVDKQorICAgICAgICAgICAgICAgIGZyZWVzY2FsZSBjb2xkZmlyZSBNQ0Y1Mjh4IGFuZCBjb21wYXRpYmxlIEZFQworCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVkcnZGZWM1MjgyLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgRGV2IEMrKyBhbmQgR05VLUNvbXBpbGVyIGZvciBtNjhrCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNS8wOC8wMSBtLmIuOiAgIHN0YXJ0IG9mIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VEUlZGRUNfSF8KKyNkZWZpbmUgX0VEUlZGRUNfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBiYXNlIGFkZHJlc3NlcworI2RlZmluZSBGRUMwX0FERFIgMHgwMDAwCisjZGVmaW5lIEZFQzFfQUREUiAweDAwMDAJLy90YmQKKworLy8gY29udHJvbCAvIHN0YXR1cyByZWdpc3RlcnMKKyNkZWZpbmUgRkVDX0VJUiAgICAgICAgICAgICAgICAgMHgxMDA0CS8vIGludGVycnVwdCBldmVudCByZWdpc3RlcgorI2RlZmluZSBGRUNfRUlNUiAgICAgICAgICAgICAgICAweDEwMDgJLy8gaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIKKyNkZWZpbmUgRkVDX1JEQVIgICAgICAgICAgICAgICAgMHgxMDEwCS8vIHJlY2VpdmUgZGVzY3JpcHRvciBhY3RpdmUgcmVnaXN0ZXIKKyNkZWZpbmUgRkVDX1REQVIgICAgICAgICAgICAgICAgMHgxMDE0CS8vIHRyYW5zbWl0IGRlc2NyaXB0b3IgYWN0aXZlIHJlZ2lzdGVyCisjZGVmaW5lIEZFQ19FQ1IgICAgICAgICAgICAgICAgIDB4MTAyNAkvLyBldGhlcm5ldCBjb250cm9sIHJlZ2lzdGVyCisjZGVmaW5lIEZFQ19NTUZSICAgICAgICAgICAgICAgIDB4MTA0MAkvLyBNSUkgZGF0YSByZWdpc3RlcgorI2RlZmluZSBGRUNfTVNDUiAgICAgICAgICAgICAgICAweDEwNDQJLy8gTUlJIHNwZWVkIHJlZ2lzdGVyCisjZGVmaW5lIEZFQ19NSUJDICAgICAgICAgICAgICAgIDB4MTA2NAkvLyBNSUIgY29udHJvbC9zdGF0dXMgcmVnaXN0ZXIKKyNkZWZpbmUgRkVDX1JDUiAgICAgICAgICAgICAgICAgMHgxMDg0CS8vIHJlY2VpdmUgY29udHJvbCByZWdpc3RlcgorI2RlZmluZSBGRUNfVENSICAgICAgICAgICAgICAgICAweDEwQzQJLy8gdHJhbnNtaXQgY29udHJvbCByZWdpc3RlcgorI2RlZmluZSBGRUNfUEFMUiAgICAgICAgICAgICAgICAweDEwRTQJLy8gcGh5c2ljYWwgYWRkcmVzcyBsb3cgcmVnaXN0ZXIKKyNkZWZpbmUgRkVDX1BBVVIgICAgICAgICAgICAgICAgMHgxMEU4CS8vIHBoeXNpY2FsIGFkZHJlc3MgaGlnaCArIHR5cGUgcmVnaXN0ZXIKKyNkZWZpbmUgRkVDX09QRCAgICAgICAgICAgICAgICAgMHgxMEVDCS8vIG9wY29kZSArIHBhdXNlIHJlZ2lzdGVyCisjZGVmaW5lIEZFQ19JQVVSICAgICAgICAgICAgICAgIDB4MTExOAkvLyB1cHBlciAzMiBiaXQgb2YgaW5kaXZpZHVhbCBoYXNoIHRhYmxlCisjZGVmaW5lIEZFQ19JQUxSICAgICAgICAgICAgICAgIDB4MTExQwkvLyBsb3dlciAzMiBiaXQgb2YgaW5kaXZpZHVhbCBoYXNoIHRhYmxlCisjZGVmaW5lIEZFQ19HQVVSICAgICAgICAgICAgICAgIDB4MTEyMAkvLyB1cHBlciAzMiBiaXQgb2YgZ3JvdXAgaGFzaCB0YWJsZQorI2RlZmluZSBGRUNfR0FMUiAgICAgICAgICAgICAgICAweDExMjQJLy8gbG93ZXIgMzIgYml0IG9mIGdyb3VwIGhhc2ggdGFibGUKKyNkZWZpbmUgRkVDX1RGV1IgICAgICAgICAgICAgICAgMHgxMTQ0CS8vIHRyYW5zbWl0IEZJRk8gd2F0ZXJtYXJrCisjZGVmaW5lIEZFQ19GUkJSICAgICAgICAgICAgICAgIDB4MTE0QwkvLyBGSUZPIHJlY2VpdmUgYm91bmQgcmVnaXN0ZXIKKyNkZWZpbmUgRkVDX0ZSU1IgICAgICAgICAgICAgICAgMHgxMTUwCS8vIEZJRk8gcmVjZWl2ZSBGSUZPIHN0YXJ0IHJlZ2lzdGVyCisjZGVmaW5lIEZFQ19FUkRTUiAgICAgICAgICAgICAgIDB4MTE4MAkvLyBwb2ludGVyIHRvIHJlY2VpdmUgZGVzY3JpcHRvciByaW5nCisjZGVmaW5lIEZFQ19FVERTUiAgICAgICAgICAgICAgIDB4MTE4NAkvLyBwb2ludGVyIHRvIHRyYW5zbWl0IGRlc2NyaXB0b3IgcmluZworI2RlZmluZSBGRUNfRU1SQlIgICAgICAgICAgICAgICAweDExODgJLy8gbWF4aW11bSByZWNlaXZlIGJ1ZmZlciBzaXplCisKKy8vIG1pYiBibG9jayBjb3VudGVycyBtZW1vcnkgbWFwCisjZGVmaW5lIEZFQ19STU9OX1RfRFJPUCAgICAgICAgIDB4MTIwMAkvLyBjb3VudCBvZiBmcmFtZXMgbm90IGNvdW50ZWQgY29ycmVjdGx5CisjZGVmaW5lIEZFQ19STU9OX1RfUEFDS0VUUyAgICAgIDB4MTIwNAkvLyBSTU9OIHR4IHBhY2tldCBjb3VudAorI2RlZmluZSBGRUNfUk1PTl9UX0JDX1BLVCAgICAgICAweDEyMDgJLy8gUk1PTiB0eCBicm9hZGNhc3QgcGFja2V0cworI2RlZmluZSBGRUNfUk1PTl9UX01DX1BLVCAgICAgICAweDEyMEMJLy8gUk1PTiB0eCBtdWx0aWNhc3QgcGFja2V0cworI2RlZmluZSBGRUNfUk1PTl9UX0NSQ19BTElHTiAgICAweDEyMTAJLy8gUk1PTiB0eCBwYWNrZXRzIHcgQ1JDL2FsaWduIGVycm9yCisjZGVmaW5lIEZFQ19STU9OX1RfVU5ERVJTSVpFICAgIDB4MTIxNAkvLyBSTU9OIHR4IHBhY2tldHMgPCA2NCBieXRlcywgZ29vZCBDUkMKKyNkZWZpbmUgRkVDX1JNT05fVF9PVkVSU0laRSAgICAgMHgxMjE4CS8vIFJNT04gdHggcGFja2V0cyA+IE1BWF9GTCBieXRlcywgZ29vZCBDUkMKKyNkZWZpbmUgRkVDX1JNT05fVF9GUkFHICAgICAgICAgMHgxMjFDCS8vIFJNT04gdHggcGFja2V0cyA8IDY0IGJ5dGVzLCBiYWQgQ1JDCisjZGVmaW5lIEZFQ19STU9OX1RfSkFCICAgICAgICAgIDB4MTIyMAkvLyBSTU9OIHR4IHBhY2tldHMgPiBNQVhfRkwgYnl0ZXMsIGJhZCBDUkMKKyNkZWZpbmUgRkVDX1JNT05fVF9DT0wgICAgICAgICAgMHgxMjI0CS8vIFJNT04gdHggY29sbGlzaW9uIGNvdW50CisjZGVmaW5lIEZFQ19STU9OX1RfUDY0ICAgICAgICAgIDB4MTIyOAkvLyBSTU9OIHR4ICAgICAgICAgICA2NCBieXRlIHBhY2tldHMKKyNkZWZpbmUgRkVDX1JNT05fVF9QNjVUTzEyNyAgICAgMHgxMjJDCS8vIFJNT04gdHggICA2NSB0byAgMTI3IGJ5dGUgcGFja2V0cworI2RlZmluZSBGRUNfUk1PTl9UX1AxMjhUTzI1NSAgICAweDEyMzAJLy8gUk1PTiB0eCAgMTI4IHRvICAyNTUgYnl0ZSBwYWNrZXRzCisjZGVmaW5lIEZFQ19STU9OX1RfUDI1NlRPNTExICAgIDB4MTIzNAkvLyBSTU9OIHR4ICAyNTYgdG8gIDUxMSBieXRlIHBhY2tldHMKKyNkZWZpbmUgRkVDX1JNT05fVF9QNTEyVE8xMDIzICAgMHgxMjM4CS8vIFJNT04gdHggIDUxMiB0byAxMDIzIGJ5dGUgcGFja2V0cworI2RlZmluZSBGRUNfUk1PTl9UX1AxMDI0VE8yMDQ3ICAweDEyM0MJLy8gUk1PTiB0eCAxMDI0IHRvIDIwNDcgYnl0ZSBwYWNrZXRzCisjZGVmaW5lIEZFQ19STU9OX1RfUF9HVEUyMDQ4ICAgIDB4MTI0MAkvLyBSTU9OIHR4IHcgPiAyMDQ4IGJ5dGVzCisjZGVmaW5lIEZFQ19STU9OX1RfT0NURVRTICAgICAgIDB4MTI0NAkvLyBSTU9OIHR4IG9jdGV0cworI2RlZmluZSBGRUNfSUVFRV9UX0RST1AgICAgICAgICAweDEyNDgJLy8gY291bnQgb2YgZnJhbWVzIG5vdCBjb3VudGVkIGNvcnJlY3RseQorI2RlZmluZSBGRUNfSUVFRV9UX0ZSQU1FX09LICAgICAweDEyNEMJLy8gZnJhbWVzIHRyYW5zbWl0dGVkIE9LCisjZGVmaW5lIEZFQ19JRUVFX1RfMUNPTCAgICAgICAgIDB4MTI1MAkvLyBmcmFtZXMgdHJhbnNtaXR0ZWQgd2l0aCBzaW5nbGUgY29sbGlzaW9uCisjZGVmaW5lIEZFQ19JRUVFX1RfTUNPTCAgICAgICAgIDB4MTI1NAkvLyBmcmFtZXMgdHJhbnNtaXR0ZWQgd2l0aCBtdWx0aXBsZSBjb2xsaXNpb25zCisjZGVmaW5lIEZFQ19JRUVFX1RfREVGICAgICAgICAgIDB4MTI1OAkvLyBmcmFtZXMgdHJhbnNtaXR0ZWQgYWZ0ZXIgZGVmZXJyYWwgZGVsYXkKKyNkZWZpbmUgRkVDX0lFRUVfVF9MQ09MICAgICAgICAgMHgxMjVDCS8vIGZyYW1lcyB0cmFuc21pdHRlZCB3aXRoIGxhdGUgY29sbGlzaW9ucworI2RlZmluZSBGRUNfSUVFRV9UX0VYQ09MICAgICAgICAweDEyNjAJLy8gZnJhbWVzIHRyYW5zbWl0dGVkIHdpdGggZXhjZXNzaXZlIGNvbGxpc2lvbnMKKyNkZWZpbmUgRkVDX0lFRUVfVF9NQUNFUlIgICAgICAgMHgxMjY0CS8vIGZyYW1lcyB0cmFuc21pdHRlZCB3aXRoIHR4LUZJRk8gdW5kZXJydW4KKyNkZWZpbmUgRkVDX0lFRUVfVF9DU0VSUiAgICAgICAgMHgxMjY4CS8vIGZyYW1lcyB0cmFuc21pdHRlZCB3aXRoIGNhcnJpZXIgc2Vuc2UgZXJyb3IKKyNkZWZpbmUgRkVDX0lFRUVfVF9TUUUgICAgICAgICAgMHgxMjZDCS8vIGZyYW1lcyB0cmFuc21pdHRlZCB3aXRoIFNRRSBlcnJvcgorI2RlZmluZSBGRUNfSUVFRV9UX0ZEWEZDICAgICAgICAweDEyNzAJLy8gZmxvdyBjb250cm9sIHBhdXNlIGZyYW1lcyB0cmFuc21pdHRlZAorI2RlZmluZSBGRUNfSUVFRV9UX09DVEVUU19PSyAgICAweDEyNzQJLy8gb2N0ZXQgY291bnQgZm9yIGZyYW1lcyB0cmFuc21pdHRlZCB3L28gZXJyb3IKKyNkZWZpbmUgRkVDX1JNT05fUl9QQUNLRVRTICAgICAgMHgxMjg0CS8vIFJNT04gcnggcGFja2V0IGNvdW50CisjZGVmaW5lIEZFQ19STU9OX1JfQkNfUEtUICAgICAgIDB4MTI4OAkvLyBSTU9OIHJ4IGJyb2FkY2FzdCBwYWNrZXRzCisjZGVmaW5lIEZFQ19STU9OX1JfTUNfUEtUICAgICAgIDB4MTI4QwkvLyBSTU9OIHJ4IG11bHRpY2FzdCBwYWNrZXRzCisjZGVmaW5lIEZFQ19STU9OX1JfQ1JDX0FMSUdOICAgIDB4MTI5MAkvLyBSTU9OIHJ4IHBhY2tldHMgdyBDUkMvYWxpZ24gZXJyb3IKKyNkZWZpbmUgRkVDX1JNT05fUl9VTkRFUlNJWkUgICAgMHgxMjk0CS8vIFJNT04gcnggcGFja2V0cyA8IDY0IGJ5dGVzLCBnb29kIENSQworI2RlZmluZSBGRUNfUk1PTl9SX09WRVJTSVpFICAgICAweDEyOTgJLy8gUk1PTiByeCBwYWNrZXRzID4gTUFYX0ZMIGJ5dGVzLCBnb29kIENSQworI2RlZmluZSBGRUNfUk1PTl9SX0ZSQUcgICAgICAgICAweDEyOUMJLy8gUk1PTiByeCBwYWNrZXRzIDwgNjQgYnl0ZXMsIGJhZCBDUkMKKyNkZWZpbmUgRkVDX1JNT05fUl9KQUIgICAgICAgICAgMHgxMkEwCS8vIFJNT04gcnggcGFja2V0cyA+IE1BWF9GTCBieXRlcywgYmFkIENSQworI2RlZmluZSBGRUNfUk1PTl9SX1JFU1ZEXzAgICAgICAweDEyQTQJLy8KKyNkZWZpbmUgRkVDX1JNT05fUl9QNjQgICAgICAgICAgMHgxMkE4CS8vIFJNT04gcnggICAgICAgICAgIDY0IGJ5dGUgcGFja2V0cworI2RlZmluZSBGRUNfUk1PTl9SX1A2NVQwMTI3ICAgICAweDEyQUMJLy8gUk1PTiByeCAgIDY1IHRvICAxMjcgYnl0ZSBwYWNrZXRzCisjZGVmaW5lIEZFQ19STU9OX1JfUDEyOFRPMjU1ICAgIDB4MTJCMAkvLyBSTU9OIHJ4ICAxMjggdG8gIDI1NSBieXRlIHBhY2tldHMKKyNkZWZpbmUgRkVDX1JNT05fUl9QMjU2VE81MTEgICAgMHgxMkI0CS8vIFJNT04gcnggIDI1NiB0byAgNTExIGJ5dGUgcGFja2V0cworI2RlZmluZSBGRUNfUk1PTl9SX1A1MTJUTzEwMjMgICAweDEyQjgJLy8gUk1PTiByeCAgNTEyIHRvIDEwMjMgYnl0ZSBwYWNrZXRzCisjZGVmaW5lIEZFQ19STU9OX1JfUDEwMjRUTzIwNDcgIDB4MTJCQwkvLyBSTU9OIHJ4IDEwMjQgdG8gMjA0NyBieXRlIHBhY2tldHMKKyNkZWZpbmUgRkVDX1JNT05fUl9HVEUyMDQ4ICAgICAgMHgxMkMwCS8vIFJNT04gcnggdyA+IDIwNDggYnl0ZXMKKyNkZWZpbmUgRkVDX1JNT05fUl9PQ1RFVFMgICAgICAgMHgxMkM0CS8vIFJNT04gcnggb2N0ZXRzCisjZGVmaW5lIEZFQ19JRUVFX1JfRFJPUCAgICAgICAgIDB4MTJDOAkvLyBjb3VudCBvZiBmcmFtZXMgbm90IGNvdW50ZWQgY29ycmVjdGx5CisjZGVmaW5lIEZFQ19JRUVFX1JfRlJBTUVfT0sgICAgIDB4MTJDQwkvLyBmcmFtZXMgcmVjZWl2ZWQgT0sKKyNkZWZpbmUgRkVDX0lFRUVfUl9DUkMgICAgICAgICAgMHgxMkQwCS8vIGZyYW1lcyByZWNlaXZlZCB3aXRoIENSQyBlcnJvcgorI2RlZmluZSBGRUNfSUVFRV9SX0FMSUdOICAgICAgICAweDEyRDQJLy8gZnJhbWVzIHJlY2VpdmVkIHdpdGggYWxpZ25tZW50IGVycm9yCisjZGVmaW5lIEZFQ19JRUVFX1JfTUFDRVJSICAgICAgIDB4MTJEOAkvLyByZWNlaXZlIEZJRk8gb3ZlcmZsb3cgY291bnQKKyNkZWZpbmUgRkVDX0lFRUVfUl9GRFhGQyAgICAgICAgMHgxMkRDCS8vIGZsb3cgY29udHJvbCBwYXVzZSBmcmFtZXMgcmVjZWl2ZWQKKyNkZWZpbmUgRkVDX0lFRUVfUl9PQ1RFVFNfT0sgICAgMHgxMkUwCS8vIG9jdGV0IGNvdW50IGZvciBmcmFtZXMgcmN2ZCB3L28gZXJyb3IKKworLy8gcmVnaXN0ZXIgYml0IGRlZmluaXRpb25zIGFuZCBtYWNyb3MKKyNkZWZpbmUgRkVDX0VJUl9VTiAgICAgICAgICAgICAgKDB4MDAwODAwMDApCisjZGVmaW5lIEZFQ19FSVJfUkwgICAgICAgICAgICAgICgweDAwMTAwMDAwKQorI2RlZmluZSBGRUNfRUlSX0xDICAgICAgICAgICAgICAoMHgwMDIwMDAwMCkKKyNkZWZpbmUgRkVDX0VJUl9FQkVSUiAgICAgICAgICAgKDB4MDA0MDAwMDApCisjZGVmaW5lIEZFQ19FSVJfTUlJICAgICAgICAgICAgICgweDAwODAwMDAwKQorI2RlZmluZSBGRUNfRUlSX1JYQiAgICAgICAgICAgICAoMHgwMTAwMDAwMCkKKyNkZWZpbmUgRkVDX0VJUl9SWEYgICAgICAgICAgICAgKDB4MDIwMDAwMDApCisjZGVmaW5lIEZFQ19FSVJfVFhCICAgICAgICAgICAgICgweDA0MDAwMDAwKQorI2RlZmluZSBGRUNfRUlSX1RYRiAgICAgICAgICAgICAoMHgwODAwMDAwMCkKKyNkZWZpbmUgRkVDX0VJUl9HUkEgICAgICAgICAgICAgKDB4MTAwMDAwMDApCisjZGVmaW5lIEZFQ19FSVJfQkFCVCAgICAgICAgICAgICgweDIwMDAwMDAwKQorI2RlZmluZSBGRUNfRUlSX0JBQlIgICAgICAgICAgICAoMHg0MDAwMDAwMCkKKyNkZWZpbmUgRkVDX0VJUl9IQkVSUiAgICAgICAgICAgKDB4ODAwMDAwMDApCisKKyNkZWZpbmUgRkVDX0VJTVJfVU4gICAgICAgICAgICAgKDB4MDAwODAwMDApCisjZGVmaW5lIEZFQ19FSU1SX1JMICAgICAgICAgICAgICgweDAwMTAwMDAwKQorI2RlZmluZSBGRUNfRUlNUl9MQyAgICAgICAgICAgICAoMHgwMDIwMDAwMCkKKyNkZWZpbmUgRkVDX0VJTVJfRUJFUlIgICAgICAgICAgKDB4MDA0MDAwMDApCisjZGVmaW5lIEZFQ19FSU1SX01JSSAgICAgICAgICAgICgweDAwODAwMDAwKQorI2RlZmluZSBGRUNfRUlNUl9SWEIgICAgICAgICAgICAoMHgwMTAwMDAwMCkKKyNkZWZpbmUgRkVDX0VJTVJfUlhGICAgICAgICAgICAgKDB4MDIwMDAwMDApCisjZGVmaW5lIEZFQ19FSU1SX1RYQiAgICAgICAgICAgICgweDA0MDAwMDAwKQorI2RlZmluZSBGRUNfRUlNUl9UWEYgICAgICAgICAgICAoMHgwODAwMDAwMCkKKyNkZWZpbmUgRkVDX0VJTVJfR1JBICAgICAgICAgICAgKDB4MTAwMDAwMDApCisjZGVmaW5lIEZFQ19FSU1SX0JBQlQgICAgICAgICAgICgweDIwMDAwMDAwKQorI2RlZmluZSBGRUNfRUlNUl9CQUJSICAgICAgICAgICAoMHg0MDAwMDAwMCkKKyNkZWZpbmUgRkVDX0VJTVJfSEJFUlIgICAgICAgICAgKDB4ODAwMDAwMDApCisKKyNkZWZpbmUgRkVDX1JEQVJfUl9ERVNfQUNUSVZFICAgKDB4MDEwMDAwMDApCisKKyNkZWZpbmUgRkVDX1REQVJfWF9ERVNfQUNUSVZFICAgKDB4MDEwMDAwMDApCisKKyNkZWZpbmUgRkVDX0VDUl9SRVNFVCAgICAgICAgICAgKDB4MDAwMDAwMDEpCisjZGVmaW5lIEZFQ19FQ1JfRVRIRVJfRU4gICAgICAgICgweDAwMDAwMDAyKQorCisjZGVmaW5lIEZFQ19NTUZSX0RBVEEoeCkgICAgICAgICgoKHgpICYgMHhGRkZGKSkKKyNkZWZpbmUgRkVDX01NRlJfVEEgICAgICAgICAgICAgKDB4MDAwMjAwMDApCisjZGVmaW5lIEZFQ19NTUZSX1JBKHgpICAgICAgICAgICgoKHgpICYgMHgxRikgPDwgMTgpCisjZGVmaW5lIEZFQ19NTUZSX1BBKHgpICAgICAgICAgICgoKHgpICYgMHgxRikgPDwgMjMpCisjZGVmaW5lIEZFQ19NTUZSX09QX1dSICAgICAgICAgICgweDEwMDAwMDAwKQorI2RlZmluZSBGRUNfTU1GUl9PUF9SRCAgICAgICAgICAoMHgyMDAwMDAwMCkKKyNkZWZpbmUgRkVDX01NRlJfU1QgICAgICAgICAgICAgKDB4NDAwMDAwMDApCisKKyNkZWZpbmUgRkVDX01TQ1JfTUlJX1NQRUVEKHgpICAgKCgoeCkgJiAweDFGKSA8PCAxKQorI2RlZmluZSBGRUNfTVNDUl9ESVNfUFJFQU1CTEUgICAoMHgwMDAwMDAwOCkKKworI2RlZmluZSBGRUNfTUlCQ19NSUJfSURMRSAgICAgICAoMHg0MDAwMDAwMCkKKyNkZWZpbmUgRkVDX01JQkNfTUlCX0RJU0FCTEUgICAgKDB4ODAwMDAwMDApCisKKyNkZWZpbmUgRkVDX1JDUl9MT09QICAgICAgICAgICAgKDB4MDAwMDAwMDEpCisjZGVmaW5lIEZFQ19SQ1JfRFJUICAgICAgICAgICAgICgweDAwMDAwMDAyKQorI2RlZmluZSBGRUNfUkNSX01JSV9NT0RFICAgICAgICAoMHgwMDAwMDAwNCkKKyNkZWZpbmUgRkVDX1JDUl9QUk9NICAgICAgICAgICAgKDB4MDAwMDAwMDgpCisjZGVmaW5lIEZFQ19SQ1JfQkNfUkVKICAgICAgICAgICgweDAwMDAwMDEwKQorI2RlZmluZSBGRUNfUkNSX0ZDRSAgICAgICAgICAgICAoMHgwMDAwMDAyMCkKKyNkZWZpbmUgRkVDX1JDUl9NQVhfRkwoeCkgICAgICAgKCgoeCkgJiAweDA3RkYpIDw8IDE2KQorCisjZGVmaW5lIEZFQ19UQ1JfR1RTICAgICAgICAgICAgICgweDAwMDAwMDAxKQorI2RlZmluZSBGRUNfVENSX0hCQyAgICAgICAgICAgICAoMHgwMDAwMDAwMikKKyNkZWZpbmUgRkVDX1RDUl9GREVOICAgICAgICAgICAgKDB4MDAwMDAwMDQpCisjZGVmaW5lIEZFQ19UQ1JfVEZDX1BBVVNFICAgICAgICgweDAwMDAwMDA4KQorI2RlZmluZSBGRUNfVENSX1JGQ19QQVVTRSAgICAgICAoMHgwMDAwMDAxMCkKKworI2RlZmluZSBGRUNfUEFMUl9CWVRFMyh4KSAgICAgICAoKCh4KSAmIDB4RkYpIDw8ICAwKQorI2RlZmluZSBGRUNfUEFMUl9CWVRFMih4KSAgICAgICAoKCh4KSAmIDB4RkYpIDw8ICA4KQorI2RlZmluZSBGRUNfUEFMUl9CWVRFMSh4KSAgICAgICAoKCh4KSAmIDB4RkYpIDw8IDE2KQorI2RlZmluZSBGRUNfUEFMUl9CWVRFMCh4KSAgICAgICAoKCh4KSAmIDB4RkYpIDw8IDI0KQorCisvLyNkZWZpbmUgRkVDX1BBVVJfVFlQRSh4KSAgICAgICAgKCgoeCkgJiAweEZGRkYpIDw8ICAwKQorI2RlZmluZSBGRUNfUEFVUl9CWVRFNSh4KSAgICAgICAoKCh4KSAmICAgMHhGRikgPDwgMTYpCisjZGVmaW5lIEZFQ19QQVVSX0JZVEU0KHgpICAgICAgICgoKHgpICYgICAweEZGKSA8PCAyNCkKKworI2RlZmluZSBGRUNfT1BEX1BBVVNFX0RVUih4KSAgICAoKCh4KSAmIDB4RkZGRikpCisvLyNkZWZpbmUgRkVDX09QRF9PUENPREUoeCkgICAgICAgKCgoeCkgJiAweEZGRkYpIDw8IDE2KQorCisvL20uYi4KKyNkZWZpbmUgRkVDX0lBVVJfQllURTcoeCkgICAgICAgKCgoeCkgJiAweEZGKSA8PCAgMCkKKyNkZWZpbmUgRkVDX0lBVVJfQllURTYoeCkgICAgICAgKCgoeCkgJiAweEZGKSA8PCAgOCkKKyNkZWZpbmUgRkVDX0lBVVJfQllURTUoeCkgICAgICAgKCgoeCkgJiAweEZGKSA8PCAxNikKKyNkZWZpbmUgRkVDX0lBVVJfQllURTQoeCkgICAgICAgKCgoeCkgJiAweEZGKSA8PCAyNCkKKworI2RlZmluZSBGRUNfSUFMUl9CWVRFMyh4KSAgICAgICAoKCh4KSAmIDB4RkYpIDw8ICAwKQorI2RlZmluZSBGRUNfSUFMUl9CWVRFMih4KSAgICAgICAoKCh4KSAmIDB4RkYpIDw8ICA4KQorI2RlZmluZSBGRUNfSUFMUl9CWVRFMSh4KSAgICAgICAoKCh4KSAmIDB4RkYpIDw8IDE2KQorI2RlZmluZSBGRUNfSUFMUl9CWVRFMCh4KSAgICAgICAoKCh4KSAmIDB4RkYpIDw8IDI0KQorCisjZGVmaW5lIEZFQ19HQVVSX0JZVEU3KHgpICAgICAgICgoKHgpICYgMHhGRikgPDwgIDApCisjZGVmaW5lIEZFQ19HQVVSX0JZVEU2KHgpICAgICAgICgoKHgpICYgMHhGRikgPDwgIDgpCisjZGVmaW5lIEZFQ19HQVVSX0JZVEU1KHgpICAgICAgICgoKHgpICYgMHhGRikgPDwgMTYpCisjZGVmaW5lIEZFQ19HQVVSX0JZVEU0KHgpICAgICAgICgoKHgpICYgMHhGRikgPDwgMjQpCisKKyNkZWZpbmUgRkVDX0dBTFJfQllURTMoeCkgICAgICAgKCgoeCkgJiAweEZGKSA8PCAgMCkKKyNkZWZpbmUgRkVDX0dBTFJfQllURTIoeCkgICAgICAgKCgoeCkgJiAweEZGKSA8PCAgOCkKKyNkZWZpbmUgRkVDX0dBTFJfQllURTEoeCkgICAgICAgKCgoeCkgJiAweEZGKSA8PCAxNikKKyNkZWZpbmUgRkVDX0dBTFJfQllURTAoeCkgICAgICAgKCgoeCkgJiAweEZGKSA8PCAyNCkKKy8vIF5eXl4KKworI2RlZmluZSBGRUNfVEZXUl9YX1dNUktfNjQgICAgICAoMHgwMDAwMDAwMSkKKyNkZWZpbmUgRkVDX1RGV1JfWF9XTVJLXzEyOCAgICAgKDB4MDAwMDAwMDIpCisjZGVmaW5lIEZFQ19URldSX1hfV01SS18xOTIgICAgICgweDAwMDAwMDAzKQorCisvL20uYi4KKyNkZWZpbmUgRkVDX0ZSQlJfUl9CT1VORCh4KSAgICAgKCgoeCkgJiAweEZGKSA8PCAyKQorCisvL20uYi4KKyNkZWZpbmUgRkVDX0ZSU1JfUl9GU1RBUlQoeCkgICAgKCgoeCkgJiAweEZGKSA8PCAyKQorCisvL20uYi4KKyNkZWZpbmUgRkVDX0VSRFNSX1JfREVTX1NUQVJUKHgpICAoKCh4KSAmIDB4M0ZGRkZGRkYpIDw8IDIpCisKKy8vbS5iLgorI2RlZmluZSBGRUNfRVRTRFJfWF9ERVNfU1RBUlQoeCkgICgoKHgpICYgMHgzRkZGRkZGRikgPDwgMikKKworI2RlZmluZSBGRUNfRU1SQlJfUl9CVUZfU0laRSh4KSAoKCh4KSAmIDB4N0YpIDw8ICA0KQorCisjZGVmaW5lIEZFQ19SeEJEX1RSICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBGRUNfUnhCRF9PViAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgRkVDX1J4QkRfQ1IgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIEZFQ19SeEJEX05PICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBGRUNfUnhCRF9MRyAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgRkVDX1J4QkRfTUMgICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIEZFQ19SeEJEX0JDICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBGRUNfUnhCRF9NICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgRkVDX1J4QkRfTCAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIEZFQ19SeEJEX1IwMiAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBGRUNfUnhCRF9XICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgRkVDX1J4QkRfUjAxICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIEZFQ19SeEJEX0lOVVNFICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBGRUNfUnhCRF9FICAgICAgICAgICAgICAweDgwMDAKKworLy9tLmIuCisvLyNkZWZpbmUgRkVDX1R4QkRfQ1NMICAgICAgICAgICAgMHgwMDAxCisvLyNkZWZpbmUgRkVDX1R4QkRfVU4gICAgICAgICAgICAgMHgwMDAyCisvLyNkZWZpbmUgRkVDX1R4QkRfUkwgICAgICAgICAgICAgMHgwMDQwCisvLyNkZWZpbmUgRkVDX1R4QkRfTEMgICAgICAgICAgICAgMHgwMDgwCisvLyNkZWZpbmUgRkVDX1R4QkRfSEIgICAgICAgICAgICAgMHgwMTAwCisvLyNkZWZpbmUgRkVDX1R4QkRfREVGICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIEZFQ19UeEJEX0FCQyAgICAgICAgICAgIDB4MDIwMAorLy8gXl5eXgorI2RlZmluZSBGRUNfVHhCRF9UQyAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgRkVDX1R4QkRfTCAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIEZFQ19UeEJEX1RPMiAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBGRUNfVHhCRF9XICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgRkVDX1R4QkRfVE8xICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIEZFQ19UeEJEX0lOVVNFICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBGRUNfVHhCRF9SICAgICAgICAgICAgICAweDgwMDAKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBSeCBhbmQgVHggYnVmZmVyIGRlc2NyaXB0b3IgZm9ybWF0Cit0eXBlZGVmIHN0cnVjdCB7CisJV09SRCBtX3dTdGF0dXM7CQkvLyBjb250cm9sIC8gc3RhdHVzICAtLS0gIHVzZWQgYnkgZWRydiwgZG8gbm90IGNoYW5nZSBpbiBhcHBsaWNhdGlvbgorCVdPUkQgbV93TGVuZ3RoOwkJLy8gdHJhbnNmZXIgbGVuZ3RoCisJQllURSAqbV9wYkRhdGE7CQkvLyBidWZmZXIgYWRkcmVzcworfSB0QnVmZmVyRGVzY3I7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgKE5PX09GX0lOU1RBTkNFUyA+IDEpCisjZGVmaW5lIEVDSV9XUklURV9EV19SRUcob2ZmLHZhbCkgICAgICAgKCooRFdPUkQgKikodm9pZCAqKSgmX19JUFNCQVJbb2ZmXSkgPSB2YWwpCisjZGVmaW5lIEVDSV9SRUFEX0RXX1JFRyhvZmYpICAgICAgICAgICAgKCooRFdPUkQgKikodm9pZCAqKSgmX19JUFNCQVJbb2ZmXSkpCisjZWxzZQorI2lmIChFRFJWX1VTRURfRVRIX0NUUkwgPT0gMCkKKyNkZWZpbmUgRUNJX1dSSVRFX0RXX1JFRyhvZmYsdmFsKSAgICAgICAoKihEV09SRCAqKSh2b2lkICopKCZfX0lQU0JBUltGRUMwX0FERFIrb2ZmXSkgPSB2YWwpCisjZGVmaW5lIEVDSV9SRUFEX0RXX1JFRyhvZmYpICAgICAgICAgICAgKCooRFdPUkQgKikodm9pZCAqKSgmX19JUFNCQVJbRkVDMF9BRERSK29mZl0pKQorI2Vsc2UKKyNkZWZpbmUgRUNJX1dSSVRFX0RXX1JFRyhvZmYsdmFsKSAgICAgICAoKihEV09SRCAqKSh2b2lkICopKCZfX0lQU0JBUltGRUMxX0FERFIrb2ZmXSkgPSB2YWwpCisjZGVmaW5lIEVDSV9SRUFEX0RXX1JFRyhvZmYpICAgICAgICAgICAgKCooRFdPUkQgKikodm9pZCAqKSgmX19JUFNCQVJbRkVDMV9BRERSK29mZl0pKQorI2VuZGlmCisjZW5kaWYKKworI2VuZGlmIC8vICNpZm5kZWYgX0VEUlZfRkVDX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VkcnZTaW0uaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRWRydlNpbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MzAwZTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VkcnZTaW0uaApAQCAtMCwwICsxLDg5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW50ZXJmYWNlIGZvciBldGhlcm5ldCBkcml2ZXIgc2ltdWxhdGlvbgorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVkcnZTaW0uaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICBEZXYgQysrIGFuZCBHTlUtQ29tcGlsZXIgZm9yIG02OGsKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzE1IGQuay46ICAgc3RhcnQgb2YgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRURSVlNJTV9IXworI2RlZmluZSBfRURSVlNJTV9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBFZHJ2UnhJbnRlcnJ1cHRIYW5kbGVyKEJZVEUgYkJ1ZmZlckluRnJhbWVfcCwgQllURSAqIHBiRXRoZXJuZXREYXRhX3AsCisJCQkgICAgV09SRCB3RGF0YUxlbl9wKTsKKworI2VuZGlmIC8vICNpZm5kZWYgX0VEUlZTSU1fSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNjBmNzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbC5oCkBAIC0wLDAgKzEsMjczIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBFUEwgQVBJIGxheWVyCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjggJCAgJERhdGU6IDIwMDgvMTEvMTcgMTY6NDA6MzkgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNS8yMiBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTF9BUElfSF8KKyNkZWZpbmUgX0VQTF9BUElfSF8KKworI2luY2x1ZGUgIkVwbEluYy5oIgorI2luY2x1ZGUgIkVwbFNkby5oIgorI2luY2x1ZGUgIkVwbE9iZC5oIgorI2luY2x1ZGUgIkVwbExlZC5oIgorI2luY2x1ZGUgIkVwbEV2ZW50LmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBtX3VpTm9kZUlkOworCXRFcGxObXRTdGF0ZSBtX05tdFN0YXRlOworCXRFcGxObXROb2RlRXZlbnQgbV9Ob2RlRXZlbnQ7CisJV09SRCBtX3dFcnJvckNvZGU7CS8vIEVQTCBlcnJvciBjb2RlIGlmIG1fTm9kZUV2ZW50ID09IGtFcGxObXROb2RlRXZlbnRFcnJvcgorCUJPT0wgbV9mTWFuZGF0b3J5OworCit9IHRFcGxBcGlFdmVudE5vZGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsTm10U3RhdGUgbV9ObXRTdGF0ZTsJLy8gbG9jYWwgTk1UIHN0YXRlCisJdEVwbE5tdEJvb3RFdmVudCBtX0Jvb3RFdmVudDsKKwlXT1JEIG1fd0Vycm9yQ29kZTsJLy8gRVBMIGVycm9yIGNvZGUgaWYgbV9Cb290RXZlbnQgPT0ga0VwbE5tdEJvb3RFdmVudEVycm9yCisKK30gdEVwbEFwaUV2ZW50Qm9vdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxMZWRUeXBlIG1fTGVkVHlwZTsJLy8gdHlwZSBvZiB0aGUgTEVEIChlLmcuIFN0YXR1cyBvciBFcnJvcikKKwlCT09MIG1fZk9uOwkJLy8gc3RhdGUgb2YgdGhlIExFRCAoZS5nLiBvbiBvciBvZmYpCisKK30gdEVwbEFwaUV2ZW50TGVkOworCit0eXBlZGVmIGVudW0geworCWtFcGxBcGlFdmVudE5tdFN0YXRlQ2hhbmdlID0gMHgxMCwJLy8gbV9ObXRTdGF0ZUNoYW5nZQorLy8gICAga0VwbEFwaUV2ZW50UmVxdWVzdE5tdCAgICAgPSAweDExLCAgICAvLyBtX2JObXRDbWQKKwlrRXBsQXBpRXZlbnRDcml0aWNhbEVycm9yID0gMHgxMiwJLy8gbV9JbnRlcm5hbEVycm9yLCBTdGFjayBoYWx0ZWQKKwlrRXBsQXBpRXZlbnRXYXJuaW5nID0gMHgxMywJLy8gbV9JbnRlcm5hbEVycm9yLCBTdGFjayBydW5uaW5nCisJa0VwbEFwaUV2ZW50Tm9kZSA9IDB4MjAsCS8vIG1fTm9kZQorCWtFcGxBcGlFdmVudEJvb3QgPSAweDIxLAkvLyBtX0Jvb3QKKwlrRXBsQXBpRXZlbnRTZG8gPSAweDYyLAkvLyBtX1NkbworCWtFcGxBcGlFdmVudE9iZEFjY2VzcyA9IDB4NjksCS8vIG1fT2JkQ2JQYXJhbQorCWtFcGxBcGlFdmVudExlZCA9IDB4NzAsCS8vIG1fTGVkCisKK30gdEVwbEFwaUV2ZW50VHlwZTsKKwordHlwZWRlZiB1bmlvbiB7CisJdEVwbEV2ZW50Tm10U3RhdGVDaGFuZ2UgbV9ObXRTdGF0ZUNoYW5nZTsKKwl0RXBsRXZlbnRFcnJvciBtX0ludGVybmFsRXJyb3I7CisJdEVwbFNkb0NvbUZpbmlzaGVkIG1fU2RvOworCXRFcGxPYmRDYlBhcmFtIG1fT2JkQ2JQYXJhbTsKKwl0RXBsQXBpRXZlbnROb2RlIG1fTm9kZTsKKwl0RXBsQXBpRXZlbnRCb290IG1fQm9vdDsKKwl0RXBsQXBpRXZlbnRMZWQgbV9MZWQ7CisKK30gdEVwbEFwaUV2ZW50QXJnOworCit0eXBlZGVmIHRFcGxLZXJuZWwoUFVCTElDIFJPTSAqIHRFcGxBcGlDYkV2ZW50KSAodEVwbEFwaUV2ZW50VHlwZSBFdmVudFR5cGVfcCwJLy8gSU46IGV2ZW50IHR5cGUgKGVudW0pCisJCQkJCQkgdEVwbEFwaUV2ZW50QXJnICogcEV2ZW50QXJnX3AsCS8vIElOOiBldmVudCBhcmd1bWVudCAodW5pb24pCisJCQkJCQkgdm9pZCBHRU5FUklDICogcFVzZXJBcmdfcCk7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgbV91aVNpemVPZlN0cnVjdDsKKwlCT09MIG1fZkFzeW5jT25seTsJLy8gZG8gbm90IG5lZWQgdG8gcmVnaXN0ZXIgUFJlcworCXVuc2lnbmVkIGludCBtX3VpTm9kZUlkOwkvLyBsb2NhbCBub2RlIElECisJQllURSBtX2FiTWFjQWRkcmVzc1s2XTsJLy8gbG9jYWwgTUFDIGFkZHJlc3MKKworCS8vIDB4MUY4MjogTk1UX0ZlYXR1cmVGbGFnc19VMzIKKwlEV09SRCBtX2R3RmVhdHVyZUZsYWdzOworCS8vIEN5Y2xlIExlbmd0aCAoMHgxMDA2OiBOTVRfQ3ljbGVMZW5fVTMyKSBpbiBbdXNdCisJRFdPUkQgbV9kd0N5Y2xlTGVuOwkvLyByZXF1aXJlZCBmb3IgZXJyb3IgZGV0ZWN0aW9uCisJLy8gMHgxRjk4OiBOTVRfQ3ljbGVUaW1pbmdfUkVDCisJLy8gMHgxRjk4LjE6IElzb2NoclR4TWF4UGF5bG9hZF9VMTYKKwl1bnNpZ25lZCBpbnQgbV91aUlzb2NoclR4TWF4UGF5bG9hZDsJLy8gY29uc3QKKwkvLyAweDFGOTguMjogSXNvY2hyUnhNYXhQYXlsb2FkX1UxNgorCXVuc2lnbmVkIGludCBtX3VpSXNvY2hyUnhNYXhQYXlsb2FkOwkvLyBjb25zdAorCS8vIDB4MUY5OC4zOiBQUmVzTWF4TGF0ZW5jeV9VMzIKKwlEV09SRCBtX2R3UHJlc01heExhdGVuY3k7CS8vIGNvbnN0IGluIFtuc10sIG9ubHkgcmVxdWlyZWQgZm9yIElkZW50UmVzCisJLy8gMHgxRjk4LjQ6IFBSZXFBY3RQYXlsb2FkTGltaXRfVTE2CisJdW5zaWduZWQgaW50IG1fdWlQcmVxQWN0UGF5bG9hZExpbWl0OwkvLyByZXF1aXJlZCBmb3IgaW5pdGlhbGlzYXRpb24gKCsyOCBieXRlcykKKwkvLyAweDFGOTguNTogUFJlc0FjdFBheWxvYWRMaW1pdF9VMTYKKwl1bnNpZ25lZCBpbnQgbV91aVByZXNBY3RQYXlsb2FkTGltaXQ7CS8vIHJlcXVpcmVkIGZvciBpbml0aWFsaXNhdGlvbiBvZiBQcmVzIGZyYW1lICgrMjggYnl0ZXMpCisJLy8gMHgxRjk4LjY6IEFTbmRNYXhMYXRlbmN5X1UzMgorCURXT1JEIG1fZHdBc25kTWF4TGF0ZW5jeTsJLy8gY29uc3QgaW4gW25zXSwgb25seSByZXF1aXJlZCBmb3IgSWRlbnRSZXMKKwkvLyAweDFGOTguNzogTXVsdGlwbEN5Y2xlQ250X1U4CisJdW5zaWduZWQgaW50IG1fdWlNdWx0aXBsQ3ljbGVDbnQ7CS8vIHJlcXVpcmVkIGZvciBlcnJvciBkZXRlY3Rpb24KKwkvLyAweDFGOTguODogQXN5bmNNVFVfVTE2CisJdW5zaWduZWQgaW50IG1fdWlBc3luY010dTsJLy8gcmVxdWlyZWQgdG8gc2V0IHVwIG1heCBmcmFtZSBzaXplCisJLy8gMHgxRjk4Ljk6IFByZXNjYWxlcl9VMTYKKwl1bnNpZ25lZCBpbnQgbV91aVByZXNjYWxlcjsJLy8gcmVxdWlyZWQgZm9yIHN5bmMKKwkvLyAkJCQgTXVsdGlwbGV4ZWQgU2xvdAorCisJLy8gMHgxQzE0OiBETExfTG9zc09mRnJhbWVUb2xlcmFuY2VfVTMyIGluIFtuc10KKwlEV09SRCBtX2R3TG9zc09mRnJhbWVUb2xlcmFuY2U7CisKKwkvLyAweDFGOEE6IE5NVF9NTkN5Y2xlVGltaW5nX1JFQworCS8vIDB4MUY4QS4xOiBXYWl0U29DUFJlcV9VMzIgaW4gW25zXQorCURXT1JEIG1fZHdXYWl0U29jUHJlcTsKKworCS8vIDB4MUY4QS4yOiBBc3luY1Nsb3RUaW1lb3V0X1UzMiBpbiBbbnNdCisJRFdPUkQgbV9kd0FzeW5jU2xvdFRpbWVvdXQ7CisKKwlEV09SRCBtX2R3RGV2aWNlVHlwZTsJLy8gTk1UX0RldmljZVR5cGVfVTMyCisJRFdPUkQgbV9kd1ZlbmRvcklkOwkvLyBOTVRfSWRlbnRpdHlPYmplY3RfUkVDLlZlbmRvcklkX1UzMgorCURXT1JEIG1fZHdQcm9kdWN0Q29kZTsJLy8gTk1UX0lkZW50aXR5T2JqZWN0X1JFQy5Qcm9kdWN0Q29kZV9VMzIKKwlEV09SRCBtX2R3UmV2aXNpb25OdW1iZXI7CS8vIE5NVF9JZGVudGl0eU9iamVjdF9SRUMuUmV2aXNpb25Ob19VMzIKKwlEV09SRCBtX2R3U2VyaWFsTnVtYmVyOwkvLyBOTVRfSWRlbnRpdHlPYmplY3RfUkVDLlNlcmlhbE5vX1UzMgorCVFXT1JEIG1fcXdWZW5kb3JTcGVjaWZpY0V4dDE7CisJRFdPUkQgbV9kd1ZlcmlmeUNvbmZpZ3VyYXRpb25EYXRlOwkvLyBDRk1fVmVyaWZ5Q29uZmlndXJhdGlvbl9SRUMuQ29uZkRhdGVfVTMyCisJRFdPUkQgbV9kd1ZlcmlmeUNvbmZpZ3VyYXRpb25UaW1lOwkvLyBDRk1fVmVyaWZ5Q29uZmlndXJhdGlvbl9SRUMuQ29uZlRpbWVfVTMyCisJRFdPUkQgbV9kd0FwcGxpY2F0aW9uU3dEYXRlOwkvLyBQRExfTG9jVmVyQXBwbFN3X1JFQy5BcHBsU3dEYXRlX1UzMiBvbiBwcm9ncmFtbWFibGUgZGV2aWNlIG9yIGRhdGUgcG9ydGlvbiBvZiBOTVRfTWFudWZhY3RTd1ZlcnNfVlMgb24gbm9uLXByb2dyYW1tYWJsZSBkZXZpY2UKKwlEV09SRCBtX2R3QXBwbGljYXRpb25Td1RpbWU7CS8vIFBETF9Mb2NWZXJBcHBsU3dfUkVDLkFwcGxTd1RpbWVfVTMyIG9uIHByb2dyYW1tYWJsZSBkZXZpY2Ugb3IgdGltZSBwb3J0aW9uIG9mIE5NVF9NYW51ZmFjdFN3VmVyc19WUyBvbiBub24tcHJvZ3JhbW1hYmxlIGRldmljZQorCURXT1JEIG1fZHdJcEFkZHJlc3M7CisJRFdPUkQgbV9kd1N1Ym5ldE1hc2s7CisJRFdPUkQgbV9kd0RlZmF1bHRHYXRld2F5OworCUJZVEUgbV9zSG9zdG5hbWVbMzJdOworCUJZVEUgbV9hYlZlbmRvclNwZWNpZmljRXh0Mls0OF07CisKKwljaGFyICptX3BzekRldk5hbWU7CS8vIE5NVF9NYW51ZmFjdERldk5hbWVfVlMgKDB4MTAwOC8wIGxvY2FsIE9EKQorCWNoYXIgKm1fcHN6SHdWZXJzaW9uOwkvLyBOTVRfTWFudWZhY3RId1ZlcnNfVlMgICgweDEwMDkvMCBsb2NhbCBPRCkKKwljaGFyICptX3BzelN3VmVyc2lvbjsJLy8gTk1UX01hbnVmYWN0U3dWZXJzX1ZTICAoMHgxMDBBLzAgbG9jYWwgT0QpCisKKwl0RXBsQXBpQ2JFdmVudCBtX3BmbkNiRXZlbnQ7CisJdm9pZCAqbV9wRXZlbnRVc2VyQXJnOworCXRFcGxTeW5jQ2IgbV9wZm5DYlN5bmM7CisKK30gdEVwbEFwaUluaXRQYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXZvaWQgKm1fcEltYWdlOworCXVuc2lnbmVkIGludCBtX3VpU2l6ZTsKKworfSB0RXBsQXBpUHJvY2Vzc0ltYWdlOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpSW5pdGlhbGl6ZSh0RXBsQXBpSW5pdFBhcmFtICogcEluaXRQYXJhbV9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpU2h1dGRvd24odm9pZCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaVJlYWRPYmplY3QodEVwbFNkb0NvbUNvbkhkbCAqIHBTZG9Db21Db25IZGxfcCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCSAgIHVuc2lnbmVkIGludCB1aVN1YmluZGV4X3AsCisJCQkJICAgdm9pZCAqcERzdERhdGFfbGVfcCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgKnB1aVNpemVfcCwKKwkJCQkgICB0RXBsU2RvVHlwZSBTZG9UeXBlX3AsIHZvaWQgKnBVc2VyQXJnX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlXcml0ZU9iamVjdCh0RXBsU2RvQ29tQ29uSGRsICogcFNkb0NvbUNvbkhkbF9wLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkgICAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkgICAgdW5zaWduZWQgaW50IHVpU3ViaW5kZXhfcCwKKwkJCQkgICAgdm9pZCAqcFNyY0RhdGFfbGVfcCwKKwkJCQkgICAgdW5zaWduZWQgaW50IHVpU2l6ZV9wLAorCQkJCSAgICB0RXBsU2RvVHlwZSBTZG9UeXBlX3AsIHZvaWQgKnBVc2VyQXJnX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlGcmVlU2RvQ2hhbm5lbCh0RXBsU2RvQ29tQ29uSGRsIFNkb0NvbUNvbkhkbF9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpUmVhZExvY2FsT2JqZWN0KHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCXVuc2lnbmVkIGludCB1aVN1YmluZGV4X3AsCisJCQkJCXZvaWQgKnBEc3REYXRhX3AsCisJCQkJCXVuc2lnbmVkIGludCAqcHVpU2l6ZV9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpV3JpdGVMb2NhbE9iamVjdCh1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkgdW5zaWduZWQgaW50IHVpU3ViaW5kZXhfcCwKKwkJCQkJIHZvaWQgKnBTcmNEYXRhX3AsCisJCQkJCSB1bnNpZ25lZCBpbnQgdWlTaXplX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlDYk9iZEFjY2Vzcyh0RXBsT2JkQ2JQYXJhbSBNRU0gKiBwUGFyYW1fcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaUxpbmtPYmplY3QodW5zaWduZWQgaW50IHVpT2JqSW5kZXhfcCwKKwkJCQkgICB2b2lkICpwVmFyX3AsCisJCQkJICAgdW5zaWduZWQgaW50ICpwdWlWYXJFbnRyaWVzX3AsCisJCQkJICAgdEVwbE9iZFNpemUgKiBwRW50cnlTaXplX3AsCisJCQkJICAgdW5zaWduZWQgaW50IHVpRmlyc3RTdWJpbmRleF9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpRXhlY05tdENvbW1hbmQodEVwbE5tdEV2ZW50IE5tdEV2ZW50X3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlQcm9jZXNzKHZvaWQpOworCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpTW5UcmlnZ2VyU3RhdGVDaGFuZ2UodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCSAgICAgdEVwbE5tdE5vZGVDb21tYW5kIE5vZGVDb21tYW5kX3ApOworI2VuZGlmCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaUdldElkZW50UmVzcG9uc2UodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCSB0RXBsSWRlbnRSZXNwb25zZSAqKgorCQkJCQkgcHBJZGVudFJlc3BvbnNlX3ApOworCisvLyBmdW5jdGlvbnMgZm9yIHByb2Nlc3MgaW1hZ2Ugd2lsbCBiZSBpbXBsZW1lbnRlZCBpbiBzZXBhcmF0ZSBmaWxlCit0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlQcm9jZXNzSW1hZ2VTZXR1cCh2b2lkKTsKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaVByb2Nlc3NJbWFnZUV4Y2hhbmdlSW4odEVwbEFwaVByb2Nlc3NJbWFnZSAqIHBQSV9wKTsKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaVByb2Nlc3NJbWFnZUV4Y2hhbmdlT3V0KHRFcGxBcGlQcm9jZXNzSW1hZ2UgKiBwUElfcCk7CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExfQVBJX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEFtaS5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxBbWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmEwNGE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxBbWkuaApAQCAtMCwwICsxLDM2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIERlZmluaXRpb25zIGZvciBBYnN0cmFjdCBNZW1vcnkgSW50ZXJmYWNlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsQW1pLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjIgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgR0NDCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgIDA2LjAzLjIwMDAgIC1ycworICAgICAgICAgICAgICAgSW1wbGVtZW50YXRpb24KKworICAgMTYuMDkuMjAwMiAgLWFzCisgICAgICAgICAgICAgICBUbyBzYXZlIGNvZGUgc3BhY2UgdGhlIGZ1bmN0aW9ucyBBbWlTZXRCeXRlIGFuZCBBbWlHZXRCeXRlCisgICAgICAgICAgICAgICBhcmUgcmVwbGFjZWQgYnkgbWFjcm9zLiBGb3IgdGFyZ2V0cyB3aGljaCBhc3NpZ24gQllURSBieQorICAgICAgICAgICAgICAgYW4gMTZCaXQgdHlwZSwgdGhlIGRlZmluaXRpb24gb2YgbWFjcm9zIG11c3QgY2hhbmdlZCB0bworICAgICAgICAgICAgICAgZnVuY3Rpb25zLgorCisgICAyMy4wMi4yMDA1ICByLmQuOgorICAgICAgICAgICAgICAgRnVuY3Rpb25zIGluY2x1ZGVkIGZvciBleHRlbmRlZCBkYXRhIHR5cGVzIHN1Y2ggYXMgVU5TSUdORUQyNCwKKyAgICAgICAgICAgICAgIFVOU0lHTkVENDAsIC4uLgorCisgICAxMy4wNi4yMDA2ICBkLmsuOgorICAgICAgICAgICAgICAgRXh0ZW5kZWQgdGhlIGludGVyZmFjZSBmb3IgRVBMIHdpdGggdGhlIGRpZmZlcmVudCBmdW5jdGlvbnMKKyAgICAgICAgICAgICAgIGZvciBsaXR0bGUgZW5kaWFuIGFuZCBiaWcgZW5kaWFuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTEFNSV9IXworI2RlZmluZSBfRVBMQU1JX0hfCisKKyNpZiAoKERFVl9TWVNURU0gJiBfREVWXzY0QklUX1NVUFBPUlRfKSA9PSAwKQorLy8gICAgI2lmZGVmIFVTRV9WQVI2NAorI2Vycm9yICdFUlJPUjogZGV2ZWxvcG1lbnQgc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgNjQgYml0IG9wZXJhdGlvbnMhJworLy8gICAgI2VuZGlmCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBQcm90b3R5cGVuCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfV0lOMzJfKQorI2lmIGRlZmluZWQoSU5MSU5FX0ZVTkNUSU9OX0RFRikKKyN1bmRlZiAgSU5MSU5FX0ZVTkNUSU9OCisjZGVmaW5lIElOTElORV9GVU5DVElPTiAgICAgSU5MSU5FX0ZVTkNUSU9OX0RFRgorI2RlZmluZSBJTkxJTkVfRU5BQkxFRCAgICAgIFRSVUUKKyNkZWZpbmUgRVBMX0FNSV9JTkxJTkVECisjaW5jbHVkZSAiLi4vRXBsU3RhY2svYW1peDg2LmMiCisjZW5kaWYKKworI2VsaWYgKFRBUkdFVF9TWVNURU0gPT0gX0xJTlVYXykKKyNpZiBkZWZpbmVkKF9fbTY4a19fKQkJLy8gaXQgaXMgYW4gYmlnIGVuZGlhbiBtYWNoaW5lCisjaWYgZGVmaW5lZChJTkxJTkVfRlVOQ1RJT05fREVGKQorI3VuZGVmICBJTkxJTkVfRlVOQ1RJT04KKyNkZWZpbmUgSU5MSU5FX0ZVTkNUSU9OICAgICBJTkxJTkVfRlVOQ1RJT05fREVGCisjZGVmaW5lIElOTElORV9FTkFCTEVEICAgICAgVFJVRQorI2RlZmluZSBFUExfQU1JX0lOTElORUQKKyNpbmNsdWRlICIuLi9FcGxTdGFjay9hbWliZS5jIgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIHdyaXRlIGZ1bmN0aW9ucworLy8KKy8vIFRvIHNhdmUgY29kZSBzcGFjZSB0aGUgZnVuY3Rpb24gQW1pU2V0Qnl0ZSBpcyByZXBsYWNlZCBieQorLy8gYW4gbWFjcm8uCisvLyB2b2lkICAgUFVCTElDICBBbWlTZXRCeXRlICAodm9pZCBGQVIqIHBBZGRyX3AsIEJZVEUgYkJ5dGVWYWxfcCk7CisKKyNkZWZpbmUgQW1pU2V0Qnl0ZVRvQmUocEFkZHJfcCwgYkJ5dGVWYWxfcCkgIHsqKEJZVEUgRkFSKikocEFkZHJfcCkgPSAoYkJ5dGVWYWxfcCk7fQorI2RlZmluZSBBbWlTZXRCeXRlVG9MZShwQWRkcl9wLCBiQnl0ZVZhbF9wKSAgeyooQllURSBGQVIqKShwQWRkcl9wKSA9IChiQnl0ZVZhbF9wKTt9CisKKyNpZiAhZGVmaW5lZChJTkxJTkVfRU5BQkxFRCkKKwl2b2lkIFBVQkxJQyBBbWlTZXRXb3JkVG9CZSh2b2lkIEZBUiAqIHBBZGRyX3AsIFdPUkQgd1dvcmRWYWxfcCk7CisJdm9pZCBQVUJMSUMgQW1pU2V0RHdvcmRUb0JlKHZvaWQgRkFSICogcEFkZHJfcCwgRFdPUkQgZHdEd29yZFZhbF9wKTsKKwl2b2lkIFBVQkxJQyBBbWlTZXRXb3JkVG9MZSh2b2lkIEZBUiAqIHBBZGRyX3AsIFdPUkQgd1dvcmRWYWxfcCk7CisJdm9pZCBQVUJMSUMgQW1pU2V0RHdvcmRUb0xlKHZvaWQgRkFSICogcEFkZHJfcCwgRFdPUkQgZHdEd29yZFZhbF9wKTsKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIHJlYWQgZnVuY3Rpb25zCisvLworLy8gVG8gc2F2ZSBjb2RlIHNwYWNlIHRoZSBmdW5jdGlvbiBBbWlHZXRCeXRlIGlzIHJlcGxhY2VkIGJ5CisvLyBhbiBtYWNyby4KKy8vIEJZVEUgICBQVUJMSUMgIEFtaUdldEJ5dGUgICh2b2lkIEZBUiogcEFkZHJfcCk7CisKKyNkZWZpbmUgQW1pR2V0Qnl0ZUZyb21CZShwQWRkcl9wKSAgKCooQllURSBGQVIqKShwQWRkcl9wKSkKKyNkZWZpbmUgQW1pR2V0Qnl0ZUZyb21MZShwQWRkcl9wKSAgKCooQllURSBGQVIqKShwQWRkcl9wKSkKKworI2lmICFkZWZpbmVkKElOTElORV9FTkFCTEVEKQorCisJV09SRCBQVUJMSUMgQW1pR2V0V29yZEZyb21CZSh2b2lkIEZBUiAqIHBBZGRyX3ApOworCURXT1JEIFBVQkxJQyBBbWlHZXREd29yZEZyb21CZSh2b2lkIEZBUiAqIHBBZGRyX3ApOworCVdPUkQgUFVCTElDIEFtaUdldFdvcmRGcm9tTGUodm9pZCBGQVIgKiBwQWRkcl9wKTsKKwlEV09SRCBQVUJMSUMgQW1pR2V0RHdvcmRGcm9tTGUodm9pZCBGQVIgKiBwQWRkcl9wKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pU2V0RHdvcmQyNCgpCisvLworLy8gRGVzY3JpcHRpb246IHNldHMgYSAyNCBiaXQgdmFsdWUgdG8gYSBidWZmZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBkZXN0aW5hdGlvbiBidWZmZXIKKy8vICAgICAgICAgICAgICBkd0R3b3JkVmFsX3AgICAgPSB2YWx1ZSB0byBzZXQKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwl2b2lkIFBVQkxJQyBBbWlTZXREd29yZDI0VG9CZSh2b2lkIEZBUiAqIHBBZGRyX3AsIERXT1JEIGR3RHdvcmRWYWxfcCk7CisJdm9pZCBQVUJMSUMgQW1pU2V0RHdvcmQyNFRvTGUodm9pZCBGQVIgKiBwQWRkcl9wLCBEV09SRCBkd0R3b3JkVmFsX3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlHZXREd29yZDI0KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVhZHMgYSAyNCBiaXQgdmFsdWUgZnJvbSBhIGJ1ZmZlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKKy8vCisvLyBSZXR1cm46ICAgICAgRFdPUkQgICAgICAgICAgID0gcmVhZCB2YWx1ZQorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlEV09SRCBQVUJMSUMgQW1pR2V0RHdvcmQyNEZyb21CZSh2b2lkIEZBUiAqIHBBZGRyX3ApOworCURXT1JEIFBVQkxJQyBBbWlHZXREd29yZDI0RnJvbUxlKHZvaWQgRkFSICogcEFkZHJfcCk7CisKKy8vI2lmZGVmIFVTRV9WQVI2NAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlTZXRRd29yZDQwKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogc2V0cyBhIDQwIGJpdCB2YWx1ZSB0byBhIGJ1ZmZlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlcgorLy8gICAgICAgICAgICAgIHF3UXdvcmRWYWxfcCAgICA9IHF1YWRydXBsZSB3b3JkIHZhbHVlCisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJdm9pZCBQVUJMSUMgQW1pU2V0UXdvcmQ0MFRvQmUodm9pZCBGQVIgKiBwQWRkcl9wLCBRV09SRCBxd1F3b3JkVmFsX3ApOworCXZvaWQgUFVCTElDIEFtaVNldFF3b3JkNDBUb0xlKHZvaWQgRkFSICogcEFkZHJfcCwgUVdPUkQgcXdRd29yZFZhbF9wKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pR2V0UXdvcmQ0MCgpCisvLworLy8gRGVzY3JpcHRpb246IHJlYWRzIGEgNDAgYml0IHZhbHVlIGZyb20gYSBidWZmZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBzb3VyY2UgYnVmZmVyCisvLworLy8gUmV0dXJuOiAgICAgIFFXT1JECisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCVFXT1JEIFBVQkxJQyBBbWlHZXRRd29yZDQwRnJvbUJlKHZvaWQgRkFSICogcEFkZHJfcCk7CisJUVdPUkQgUFVCTElDIEFtaUdldFF3b3JkNDBGcm9tTGUodm9pZCBGQVIgKiBwQWRkcl9wKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pU2V0UXdvcmQ0OCgpCisvLworLy8gRGVzY3JpcHRpb246IHNldHMgYSA0OCBiaXQgdmFsdWUgdG8gYSBidWZmZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBkZXN0aW5hdGlvbiBidWZmZXIKKy8vICAgICAgICAgICAgICBxd1F3b3JkVmFsX3AgICAgPSBxdWFkcnVwbGUgd29yZCB2YWx1ZQorLy8KKy8vIFJldHVybjogICAgICB2b2lkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCXZvaWQgUFVCTElDIEFtaVNldFF3b3JkNDhUb0JlKHZvaWQgRkFSICogcEFkZHJfcCwgUVdPUkQgcXdRd29yZFZhbF9wKTsKKwl2b2lkIFBVQkxJQyBBbWlTZXRRd29yZDQ4VG9MZSh2b2lkIEZBUiAqIHBBZGRyX3AsIFFXT1JEIHF3UXdvcmRWYWxfcCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaUdldFF3b3JkNDgoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZWFkcyBhIDQ4IGJpdCB2YWx1ZSBmcm9tIGEgYnVmZmVyCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gc291cmNlIGJ1ZmZlcgorLy8KKy8vIFJldHVybjogICAgICBRV09SRAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlRV09SRCBQVUJMSUMgQW1pR2V0UXdvcmQ0OEZyb21CZSh2b2lkIEZBUiAqIHBBZGRyX3ApOworCVFXT1JEIFBVQkxJQyBBbWlHZXRRd29yZDQ4RnJvbUxlKHZvaWQgRkFSICogcEFkZHJfcCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaVNldFF3b3JkNTYoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBzZXRzIGEgNTYgYml0IHZhbHVlIHRvIGEgYnVmZmVyCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyCisvLyAgICAgICAgICAgICAgcXdRd29yZFZhbF9wICAgID0gcXVhZHJ1cGxlIHdvcmQgdmFsdWUKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwl2b2lkIFBVQkxJQyBBbWlTZXRRd29yZDU2VG9CZSh2b2lkIEZBUiAqIHBBZGRyX3AsIFFXT1JEIHF3UXdvcmRWYWxfcCk7CisJdm9pZCBQVUJMSUMgQW1pU2V0UXdvcmQ1NlRvTGUodm9pZCBGQVIgKiBwQWRkcl9wLCBRV09SRCBxd1F3b3JkVmFsX3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlHZXRRd29yZDU2KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVhZHMgYSA1NiBiaXQgdmFsdWUgZnJvbSBhIGJ1ZmZlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKKy8vCisvLyBSZXR1cm46ICAgICAgUVdPUkQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJUVdPUkQgUFVCTElDIEFtaUdldFF3b3JkNTZGcm9tQmUodm9pZCBGQVIgKiBwQWRkcl9wKTsKKwlRV09SRCBQVUJMSUMgQW1pR2V0UXdvcmQ1NkZyb21MZSh2b2lkIEZBUiAqIHBBZGRyX3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlTZXRRd29yZDY0KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogc2V0cyBhIDY0IGJpdCB2YWx1ZSB0byBhIGJ1ZmZlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlcgorLy8gICAgICAgICAgICAgIHF3UXdvcmRWYWxfcCAgICA9IHF1YWRydXBsZSB3b3JkIHZhbHVlCisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJdm9pZCBQVUJMSUMgQW1pU2V0UXdvcmQ2NFRvQmUodm9pZCBGQVIgKiBwQWRkcl9wLCBRV09SRCBxd1F3b3JkVmFsX3ApOworCXZvaWQgUFVCTElDIEFtaVNldFF3b3JkNjRUb0xlKHZvaWQgRkFSICogcEFkZHJfcCwgUVdPUkQgcXdRd29yZFZhbF9wKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pR2V0UXdvcmQ2NCgpCisvLworLy8gRGVzY3JpcHRpb246IHJlYWRzIGEgNjQgYml0IHZhbHVlIGZyb20gYSBidWZmZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBzb3VyY2UgYnVmZmVyCisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJUVdPUkQgUFVCTElDIEFtaUdldFF3b3JkNjRGcm9tQmUodm9pZCBGQVIgKiBwQWRkcl9wKTsKKwlRV09SRCBQVUJMSUMgQW1pR2V0UXdvcmQ2NEZyb21MZSh2b2lkIEZBUiAqIHBBZGRyX3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlTZXRUaW1lT2ZEYXkoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBzZXRzIGEgVElNRV9PRl9EQVkgKENBTm9wZW4pIHZhbHVlIHRvIGEgYnVmZmVyCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyCisvLyAgICAgICAgICAgICAgcFRpbWVPZkRheV9wICAgID0gcG9pbnRlciB0byBzdHJ1Y3QgVElNRV9PRl9EQVkKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwl2b2lkIFBVQkxJQyBBbWlTZXRUaW1lT2ZEYXkodm9pZCBGQVIgKiBwQWRkcl9wLAorCQkJCSAgICB0VGltZU9mRGF5IEZBUiAqIHBUaW1lT2ZEYXlfcCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaUdldFRpbWVPZkRheSgpCisvLworLy8gRGVzY3JpcHRpb246IHJlYWRzIGEgVElNRV9PRl9EQVkgKENBTm9wZW4pIHZhbHVlIGZyb20gYSBidWZmZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBzb3VyY2UgYnVmZmVyCisvLyAgICAgICAgICAgICAgcFRpbWVPZkRheV9wICAgID0gcG9pbnRlciB0byBzdHJ1Y3QgVElNRV9PRl9EQVkKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwl2b2lkIFBVQkxJQyBBbWlHZXRUaW1lT2ZEYXkodm9pZCBGQVIgKiBwQWRkcl9wLAorCQkJCSAgICB0VGltZU9mRGF5IEZBUiAqIHBUaW1lT2ZEYXlfcCk7CisKKyNlbmRpZgorCisjdW5kZWYgIElOTElORV9FTkFCTEVECQkvLyBkaXNhYmxlIGFjdHVhbCBpbmxpbmluZyBvZiBmdW5jdGlvbnMKKyNkZWZpbmUgRVBMX0FNSV9JTkNMVURFRAorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCQkJCS8vIGlmbmRlZiBfRVBMQU1JX0hfCisvLyBEaWUgbGV0enRlIFplaWxlIG113yB1bmJlZGluZ3QgZWluZSBsZWVyZSBaZWlsZSBzZWluLCB3ZWlsIG1hbmNoZSBDb21waWxlci8vIGRhbWl0IGVpbiBQcm9ibGVtIGhhYmVuLCB3ZW5uIGRhcyBuaWNodCBzbyBpc3QgKHouQi4gR05VIG9kZXIgQm9ybGFuZCBDKysgQnVpbGRlcikuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEFwaUdlbmVyaWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsQXBpR2VuZXJpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMTllMzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEFwaUdlbmVyaWMuYwpAQCAtMCwwICsxLDIwNjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgZ2VuZXJpYyBFUEwgQVBJIG1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbEFwaUdlbmVyaWMuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMjEgJCAgJERhdGU6IDIwMDgvMTEvMjEgMDk6MDA6MzggJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wOS8wNSBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJFcGwuaCIKKyNpbmNsdWRlICJrZXJuZWwvRXBsRGxsay5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxFcnJvckhhbmRsZXJrLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbEV2ZW50ay5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxObXRrLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbE9iZGsuaCIKKyNpbmNsdWRlICJrZXJuZWwvRXBsVGltZXJrLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbERsbGtDYWwuaCIKKyNpbmNsdWRlICJrZXJuZWwvRXBsUGRva0NhbC5oIgorI2luY2x1ZGUgInVzZXIvRXBsRGxsdUNhbC5oIgorI2luY2x1ZGUgInVzZXIvRXBsTGVkdS5oIgorI2luY2x1ZGUgInVzZXIvRXBsTm10Q251LmgiCisjaW5jbHVkZSAidXNlci9FcGxObXRNbnUuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbFNkb0NvbXUuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbElkZW50dS5oIgorI2luY2x1ZGUgInVzZXIvRXBsU3RhdHVzdS5oIgorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkKKyNpbmNsdWRlICJrZXJuZWwvRXBsUGRvay5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJTaGFyZWRCdWZmLmgiCisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JESykpID09IDApCisjZXJyb3IgIkVQTCBBUEkgbGF5ZXIgbmVlZHMgRVBMIG1vZHVsZSBPQkRLISIKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgQyBMIEEgUyBTICBFcGxBcGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsQXBpSW5pdFBhcmFtIG1fSW5pdFBhcmFtOworCit9IHRFcGxBcGlJbnN0YW5jZTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsQXBpSW5zdGFuY2UgRXBsQXBpSW5zdGFuY2VfZzsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIE5NVCBzdGF0ZSBjaGFuZ2UgZXZlbnQgY2FsbGJhY2sgZnVuY3Rpb24KK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlDYk5tdFN0YXRlQ2hhbmdlKHRFcGxFdmVudE5tdFN0YXRlQ2hhbmdlCisJCQkJCQlObXRTdGF0ZUNoYW5nZV9wKTsKKworLy8gdXBkYXRlIERMTCBjb25maWd1cmF0aW9uIGZyb20gT0QKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlVcGRhdGVEbGxDb25maWcoQk9PTCBmVXBkYXRlSWRlbnRpdHlfcCk7CisKKy8vIHVwZGF0ZSBPRCBmcm9tIGluaXQgcGFyYW0KK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlVcGRhdGVPYmQodm9pZCk7CisKKy8vIHByb2Nlc3MgZXZlbnRzIGZyb20gdXNlciBldmVudCBxdWV1ZQorc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbEFwaVByb2Nlc3NFdmVudCh0RXBsRXZlbnQgKiBwRXBsRXZlbnRfcCk7CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET0MpKSAhPSAwKQorLy8gY2FsbGJhY2sgZnVuY3Rpb24gb2YgU0RPIG1vZHVsZQorc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbEFwaUNiU2RvQ29uKHRFcGxTZG9Db21GaW5pc2hlZCAqIHBTZG9Db21GaW5pc2hlZF9wKTsKKyNlbmRpZgorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorLy8gY2FsbGJhY2sgZnVuY3Rpb25zIG9mIE5tdE1udSBtb2R1bGUKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlDYk5vZGVFdmVudCh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJICAgdEVwbE5tdE5vZGVFdmVudCBOb2RlRXZlbnRfcCwKKwkJCQkJICAgdEVwbE5tdFN0YXRlIE5tdFN0YXRlX3AsCisJCQkJCSAgIFdPUkQgd0Vycm9yQ29kZV9wLAorCQkJCQkgICBCT09MIGZNYW5kYXRvcnlfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlDYkJvb3RFdmVudCh0RXBsTm10Qm9vdEV2ZW50IEJvb3RFdmVudF9wLAorCQkJCQkgICB0RXBsTm10U3RhdGUgTm10U3RhdGVfcCwKKwkJCQkJICAgV09SRCB3RXJyb3JDb2RlX3ApOworI2VuZGlmCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0xFRFUpKSAhPSAwKQorLy8gY2FsbGJhY2sgZnVuY3Rpb24gb2YgTGVkdSBtb2R1bGUKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlDYkxlZFN0YXRlQ2hhbmdlKHRFcGxMZWRUeXBlIExlZFR5cGVfcCwKKwkJCQkJCUJPT0wgZk9uX3ApOworI2VuZGlmCisKKy8vIE9EIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIChpbXBsZW1lbnRlZCBpbiBPYmpkaWN0LmMpCit0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmRJbml0UmFtKHRFcGxPYmRJbml0UGFyYW0gTUVNICogcEluaXRQYXJhbV9wKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEFwaUluaXRpYWxpemUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBhZGQgYW5kIGluaXRpYWxpemUgbmV3IGluc3RhbmNlIG9mIEVQTCBzdGFjay4KKy8vICAgICAgICAgICAgICBBZnRlciByZXR1cm4gZnJvbSB0aGlzIGZ1bmN0aW9uIHRoZSBhcHBsaWNhdGlvbiBtdXN0IHN0YXJ0CisvLyAgICAgICAgICAgICAgdGhlIE5NVCBzdGF0ZSBtYWNoaW5lIHZpYQorLy8gICAgICAgICAgICAgIEVwbEFwaUV4ZWNObXRDb21tYW5kKGtFcGxObXRFdmVudFN3UmVzZXQpCisvLyAgICAgICAgICAgICAgYW5kIHRoZXJlYnkgdGhlIHdob2xlIEVQTCBzdGFjayA6LSkKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEluaXRQYXJhbV9wICAgICAgICAgICAgPSBpbml0aWFsaXNhdGlvbiBwYXJhbWV0ZXJzCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlJbml0aWFsaXplKHRFcGxBcGlJbml0UGFyYW0gKiBwSW5pdFBhcmFtX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsT2JkSW5pdFBhcmFtIE9iZEluaXRQYXJhbTsKKwl0RXBsRGxsa0luaXRQYXJhbSBEbGxrSW5pdFBhcmFtOworI2lmbmRlZiBFUExfTk9fRklGTworCXRTaGJFcnJvciBTaGJFcnJvcjsKKyNlbmRpZgorCisJLy8gcmVzZXQgaW5zdGFuY2Ugc3RydWN0dXJlCisJRVBMX01FTVNFVCgmRXBsQXBpSW5zdGFuY2VfZywgMCwgc2l6ZW9mKEVwbEFwaUluc3RhbmNlX2cpKTsKKworCUVQTF9NRU1DUFkoJkVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0sIHBJbml0UGFyYW1fcCwKKwkJICAgbWluKHNpemVvZih0RXBsQXBpSW5pdFBhcmFtKSwKKwkJICAgICAgIHBJbml0UGFyYW1fcC0+bV91aVNpemVPZlN0cnVjdCkpOworCisJLy8gY2hlY2sgZXZlbnQgY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlcgorCWlmIChFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fcGZuQ2JFdmVudCA9PSBOVUxMKSB7CS8vIGFwcGxpY2F0aW9uIG11c3QgYWx3YXlzIGhhdmUgYW4gZXZlbnQgY2FsbGJhY2sgZnVuY3Rpb24KKwkJUmV0ID0ga0VwbEFwaUludmFsaWRQYXJhbTsKKwkJZ290byBFeGl0OworCX0KKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JESykpICE9IDApCisJLy8gaW5pdCBPRAorLy8gRklYTUUKKy8vICAgIFJldCA9IEVwbE9iZEluaXRSYW0oJk9iZEluaXRQYXJhbSk7CisvLyAgICBpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorLy8gICAgeworLy8gICAgICAgIGdvdG8gRXhpdDsKKy8vICAgIH0KKworCS8vIGluaXRpYWxpemUgRXBsT2JkIG1vZHVsZQorCVJldCA9IEVwbE9iZEluaXQoJk9iZEluaXRQYXJhbSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorI2VuZGlmCisKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwlTaGJFcnJvciA9IFNoYkluaXQoKTsKKwlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCQlnb3RvIEV4aXQ7CisJfQorI2VuZGlmCisKKwkvLyBpbml0aWFsaXplIEVwbEV2ZW50ayBtb2R1bGUKKwlSZXQgPSBFcGxFdmVudGtJbml0KEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9wZm5DYlN5bmMpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyBpbml0aWFsaXplIEVwbEV2ZW50dSBtb2R1bGUKKwlSZXQgPSBFcGxFdmVudHVJbml0KEVwbEFwaVByb2Nlc3NFdmVudCk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGluaXQgRXBsVGltZXJrIG1vZHVsZQorCVJldCA9IEVwbFRpbWVya0luaXQoKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gaW5pdGlhbGl6ZSBFcGxObXRrIG1vZHVsZSBiZWZvcmUgRExMCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVEspKSAhPSAwKQorCVJldCA9IEVwbE5tdGtJbml0KCk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorI2VuZGlmCisKKwkvLyBpbml0aWFsaXplIEVwbERsbGsgbW9kdWxlCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTEspKSAhPSAwKQorCUVQTF9NRU1DUFkoRGxsa0luaXRQYXJhbS5tX2JlX2FiU3JjTWFjLAorCQkgICBFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fYWJNYWNBZGRyZXNzLCA2KTsKKwlSZXQgPSBFcGxEbGxrQWRkSW5zdGFuY2UoJkRsbGtJbml0UGFyYW0pOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyBpbml0aWFsaXplIEVwbEVycm9ySGFuZGxlcmsgbW9kdWxlCisJUmV0ID0gRXBsRXJyb3JIYW5kbGVya0luaXQoKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gaW5pdGlhbGl6ZSBFcGxEbGxrQ2FsIG1vZHVsZQorCVJldCA9IEVwbERsbGtDYWxBZGRJbnN0YW5jZSgpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKyNlbmRpZgorCisJLy8gaW5pdGlhbGl6ZSBFcGxEbGx1Q2FsIG1vZHVsZQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExVKSkgIT0gMCkKKwlSZXQgPSBFcGxEbGx1Q2FsQWRkSW5zdGFuY2UoKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisjZW5kaWYKKworCS8vIGluaXRpYWxpemUgRXBsUGRvayBtb2R1bGUKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1BET0spKSAhPSAwKQorCVJldCA9IEVwbFBkb2tBZGRJbnN0YW5jZSgpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCVJldCA9IEVwbFBkb2tDYWxBZGRJbnN0YW5jZSgpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKyNlbmRpZgorCisJLy8gaW5pdGlhbGl6ZSBFcGxObXRDbnUgbW9kdWxlCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9DTikpICE9IDApCisJUmV0ID0gRXBsTm10Q251QWRkSW5zdGFuY2UoRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3VpTm9kZUlkKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisjZW5kaWYKKworCS8vIGluaXRpYWxpemUgRXBsTm10dSBtb2R1bGUKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UVSkpICE9IDApCisJUmV0ID0gRXBsTm10dUluaXQoKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gcmVnaXN0ZXIgTk1UIGV2ZW50IGNhbGxiYWNrIGZ1bmN0aW9uCisJUmV0ID0gRXBsTm10dVJlZ2lzdGVyU3RhdGVDaGFuZ2VDYihFcGxBcGlDYk5tdFN0YXRlQ2hhbmdlKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisjZW5kaWYKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCS8vIGluaXRpYWxpemUgRXBsTm10TW51IG1vZHVsZQorCVJldCA9IEVwbE5tdE1udUluaXQoRXBsQXBpQ2JOb2RlRXZlbnQsIEVwbEFwaUNiQm9vdEV2ZW50KTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gaW5pdGlhbGl6ZSBFcGxJZGVudHUgbW9kdWxlCisJUmV0ID0gRXBsSWRlbnR1SW5pdCgpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyBpbml0aWFsaXplIEVwbFN0YXR1c3UgbW9kdWxlCisJUmV0ID0gRXBsU3RhdHVzdUluaXQoKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisjZW5kaWYKKworCS8vIGluaXRpYWxpemUgRXBsTGVkdSBtb2R1bGUKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTEVEVSkpICE9IDApCisJUmV0ID0gRXBsTGVkdUluaXQoRXBsQXBpQ2JMZWRTdGF0ZUNoYW5nZSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorI2VuZGlmCisKKwkvLyBpbml0IFNETyBtb2R1bGUKKyNpZiAoKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9TKSkgIT0gMCkgfHwgXAorICAgICAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET0MpKSAhPSAwKSkKKwkvLyBpbml0IHNkbyBjb21tYW5kIGxheWVyCisJUmV0ID0gRXBsU2RvQ29tSW5pdCgpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKyNlbmRpZgorCisJLy8gdGhlIGFwcGxpY2F0aW9uIG11c3Qgc3RhcnQgTk1UIHN0YXRlIG1hY2hpbmUKKwkvLyB2aWEgRXBsQXBpRXhlY05tdENvbW1hbmQoa0VwbE5tdEV2ZW50U3dSZXNldCkKKwkvLyBhbmQgdGhlcmVieSB0aGUgd2hvbGUgRVBMIHN0YWNrCisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsQXBpU2h1dGRvd24oKQorLy8KKy8vIERlc2NyaXB0aW9uOiBkZWxldGVzIGFuIGluc3RhbmNlIG9mIEVQTCBzdGFjaworLy8KKy8vIFBhcmFtZXRlcnM6ICAobm9uZSkKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaVNodXRkb3duKHZvaWQpCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vICQkJCBkLmsuOiBjaGVjayBpZiBOTVQgc3RhdGUgaXMgTk1UX0dTX09GRgorCisJLy8gJCQkIGQuay46IG1heWJlIGRlbGV0ZSBldmVudCBxdWV1ZXMgYXQgZmlyc3QsIGJ1dCB0aGlzIGltcGxpZXMgdGhhdAorCS8vICAgICAgICAgICBubyBvdGhlciBtb2R1bGUgbXVzdCBub3QgdXNlIHRoZSBldmVudCBxdWV1ZXMgZm9yIGNvbW11bmljYXRpb24KKwkvLyAgICAgICAgICAgZHVyaW5nIHNodXRkb3duLgorCisJLy8gZGVsZXRlIGluc3RhbmNlIGZvciBhbGwgbW9kdWxlcworCisJLy8gZGVpbml0aWFsaXplIEVwbFNkb0NvbSBtb2R1bGUKKyNpZiAoKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9TKSkgIT0gMCkgfHwgXAorICAgICAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET0MpKSAhPSAwKSkKKwlSZXQgPSBFcGxTZG9Db21EZWxJbnN0YW5jZSgpOworLy8gICAgUFJJTlRGMSgiRXBsU2RvQ29tRGVsSW5zdGFuY2UoKTogIDB4JVhcbiIsIFJldCk7CisjZW5kaWYKKworCS8vIGRlaW5pdGlhbGl6ZSBFcGxMZWR1IG1vZHVsZQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9MRURVKSkgIT0gMCkKKwlSZXQgPSBFcGxMZWR1RGVsSW5zdGFuY2UoKTsKKy8vICAgIFBSSU5URjEoIkVwbExlZHVEZWxJbnN0YW5jZSgpOiAgICAweCVYXG4iLCBSZXQpOworI2VuZGlmCisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwkvLyBkZWluaXRpYWxpemUgRXBsTm10TW51IG1vZHVsZQorCVJldCA9IEVwbE5tdE1udURlbEluc3RhbmNlKCk7CisvLyAgICBQUklOVEYxKCJFcGxObXRNbnVEZWxJbnN0YW5jZSgpOiAgMHglWFxuIiwgUmV0KTsKKworCS8vIGRlaW5pdGlhbGl6ZSBFcGxJZGVudHUgbW9kdWxlCisJUmV0ID0gRXBsSWRlbnR1RGVsSW5zdGFuY2UoKTsKKy8vICAgIFBSSU5URjEoIkVwbElkZW50dURlbEluc3RhbmNlKCk6ICAweCVYXG4iLCBSZXQpOworCisJLy8gZGVpbml0aWFsaXplIEVwbFN0YXR1c3UgbW9kdWxlCisJUmV0ID0gRXBsU3RhdHVzdURlbEluc3RhbmNlKCk7CisvLyAgICBQUklOVEYxKCJFcGxTdGF0dXN1RGVsSW5zdGFuY2UoKTogIDB4JVhcbiIsIFJldCk7CisjZW5kaWYKKworCS8vIGRlaW5pdGlhbGl6ZSBFcGxObXRDbnUgbW9kdWxlCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9DTikpICE9IDApCisJUmV0ID0gRXBsTm10Q251RGVsSW5zdGFuY2UoKTsKKy8vICAgIFBSSU5URjEoIkVwbE5tdENudURlbEluc3RhbmNlKCk6ICAweCVYXG4iLCBSZXQpOworI2VuZGlmCisKKwkvLyBkZWluaXRpYWxpemUgRXBsTm10dSBtb2R1bGUKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UVSkpICE9IDApCisJUmV0ID0gRXBsTm10dURlbEluc3RhbmNlKCk7CisvLyAgICBQUklOVEYxKCJFcGxObXR1RGVsSW5zdGFuY2UoKTogICAgMHglWFxuIiwgUmV0KTsKKyNlbmRpZgorCisJLy8gZGVpbml0aWFsaXplIEVwbERsbHVDYWwgbW9kdWxlCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTFUpKSAhPSAwKQorCVJldCA9IEVwbERsbHVDYWxEZWxJbnN0YW5jZSgpOworLy8gICAgUFJJTlRGMSgiRXBsRGxsdUNhbERlbEluc3RhbmNlKCk6IDB4JVhcbiIsIFJldCk7CisKKyNlbmRpZgorCisJLy8gZGVpbml0aWFsaXplIEVwbEV2ZW50dSBtb2R1bGUKKwlSZXQgPSBFcGxFdmVudHVEZWxJbnN0YW5jZSgpOworLy8gICAgUFJJTlRGMSgiRXBsRXZlbnR1RGVsSW5zdGFuY2UoKTogIDB4JVhcbiIsIFJldCk7CisKKwkvLyBkZWluaXRpYWxpemUgRXBsTm10ayBtb2R1bGUKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1USykpICE9IDApCisJUmV0ID0gRXBsTm10a0RlbEluc3RhbmNlKCk7CisvLyAgICBQUklOVEYxKCJFcGxObXRrRGVsSW5zdGFuY2UoKTogICAgMHglWFxuIiwgUmV0KTsKKyNlbmRpZgorCisJLy8gZGVpbml0aWFsaXplIEVwbERsbGsgbW9kdWxlCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTEspKSAhPSAwKQorCVJldCA9IEVwbERsbGtEZWxJbnN0YW5jZSgpOworLy8gICAgUFJJTlRGMSgiRXBsRGxsa0RlbEluc3RhbmNlKCk6ICAgIDB4JVhcbiIsIFJldCk7CisKKwkvLyBkZWluaXRpYWxpemUgRXBsRGxsa0NhbCBtb2R1bGUKKwlSZXQgPSBFcGxEbGxrQ2FsRGVsSW5zdGFuY2UoKTsKKy8vICAgIFBSSU5URjEoIkVwbERsbGtDYWxEZWxJbnN0YW5jZSgpOiAweCVYXG4iLCBSZXQpOworI2VuZGlmCisKKwkvLyBkZWluaXRpYWxpemUgRXBsRXZlbnRrIG1vZHVsZQorCVJldCA9IEVwbEV2ZW50a0RlbEluc3RhbmNlKCk7CisvLyAgICBQUklOVEYxKCJFcGxFdmVudGtEZWxJbnN0YW5jZSgpOiAgMHglWFxuIiwgUmV0KTsKKworCS8vIGRlaW5pdGlhbGl6ZSBFcGxUaW1lcmsgbW9kdWxlCisJUmV0ID0gRXBsVGltZXJrRGVsSW5zdGFuY2UoKTsKKy8vICAgIFBSSU5URjEoIkVwbFRpbWVya0RlbEluc3RhbmNlKCk6ICAweCVYXG4iLCBSZXQpOworCisjaWZuZGVmIEVQTF9OT19GSUZPCisJU2hiRXhpdCgpOworI2VuZGlmCisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZ1bmN0aW9uOiAgICBFcGxBcGlFeGVjTm10Q29tbWFuZCgpCisvLworLy8gRGVzY3JpcHRpb246IGV4ZWN1dGVzIGEgTk1UIGNvbW1hbmQsIGkuZS4gcG9zdCB0aGUgTk1UIGNvbW1hbmQvZXZlbnQgdG8gdGhlCisvLyAgICAgICAgICAgICAgTk1UayBtb2R1bGUuIE5NVCBjb21tYW5kcyB3aGljaCBhcmUgbm90IGFwcHJvcHJpYXRlIGluIHRoZSBjdXJyZW50CisvLyAgICAgICAgICAgICAgTk1UIHN0YXRlIGFyZSBzaWxlbnRseSBpZ25vcmVkLiBQbGVhc2Uga2VlcCBpbiBtaW5kIHRoYXQgdGhlCisvLyAgICAgICAgICAgICAgTk1UIHN0YXRlIG1heSBjaGFuZ2UgdW50aWwgdGhlIE5NVCBjb21tYW5kIGlzIGFjdHVhbGx5IGV4ZWN1dGVkLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBObXRFdmVudF9wICAgICAgICAgICAgICA9IE5NVCBjb21tYW5kL2V2ZW50CisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaUV4ZWNObXRDb21tYW5kKHRFcGxObXRFdmVudCBObXRFdmVudF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UVSkpICE9IDApCisJUmV0ID0gRXBsTm10dU5tdEV2ZW50KE5tdEV2ZW50X3ApOworI2VuZGlmCisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZ1bmN0aW9uOiAgICBFcGxBcGlMaW5rT2JqZWN0KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogRnVuY3Rpb24gbWFwcyBhcnJheSBvZiBhcHBsaWNhdGlvbiB2YXJpYWJsZXMgb250byBzcGVjaWZpZWQgb2JqZWN0IGluIE9ECisvLworLy8gUGFyYW1ldGVyczogIHVpT2JqSW5kZXhfcCAgICAgICAgICAgID0gRnVuY3Rpb24gbWFwcyB2YXJpYWJsZXMgZm9yIHRoaXMgb2JqZWN0IGluZGV4CisvLyAgICAgICAgICAgICAgcFZhcl9wICAgICAgICAgICAgICAgICAgPSBQb2ludGVyIHRvIGRhdGEgbWVtb3J5IGFyZWEgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0CisvLyAgICAgICAgICAgICAgcHVpVmFyRW50cmllc19wICAgICAgICAgPSBJTjogcG9pbnRlciB0byBudW1iZXIgb2YgZW50cmllcyB0byBtYXAKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDogcG9pbnRlciB0byBudW1iZXIgb2YgYWN0dWFsbHkgdXNlZCBlbnRyaWVzCisvLyAgICAgICAgICAgICAgcEVudHJ5U2l6ZV9wICAgICAgICAgICAgPSBJTjogcG9pbnRlciB0byBzaXplIG9mIG9uZSBlbnRyeTsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzaXplIGlzIHplcm8sIHRoZSBhY3R1YWwgc2l6ZSB3aWxsIGJlIHJlYWQgZnJvbSBPRAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOiBwb2ludGVyIHRvIGVudGlyZSBzaXplIG9mIGFsbCBlbnRyaWVzIG1hcHBlZAorLy8gICAgICAgICAgICAgIHVpRmlyc3RTdWJpbmRleF9wICAgICAgID0gVGhpcyBpcyB0aGUgZmlyc3Qgc3ViaW5kZXggdG8gYmUgbWFwcGVkLgorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyBTdGF0ZToKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlMaW5rT2JqZWN0KHVuc2lnbmVkIGludCB1aU9iakluZGV4X3AsCisJCQkJICAgdm9pZCAqcFZhcl9wLAorCQkJCSAgIHVuc2lnbmVkIGludCAqcHVpVmFyRW50cmllc19wLAorCQkJCSAgIHRFcGxPYmRTaXplICogcEVudHJ5U2l6ZV9wLAorCQkJCSAgIHVuc2lnbmVkIGludCB1aUZpcnN0U3ViaW5kZXhfcCkKK3sKKwlCWVRFIGJWYXJFbnRyaWVzOworCUJZVEUgYkluZGV4RW50cmllczsKKwlCWVRFIE1FTSAqcGJEYXRhOworCXVuc2lnbmVkIGludCB1aVN1YmluZGV4OworCXRFcGxWYXJQYXJhbSBWYXJQYXJhbTsKKwl0RXBsT2JkU2l6ZSBFbnRyeVNpemU7CisJdEVwbE9iZFNpemUgVXNlZFNpemU7CisKKwl0RXBsS2VybmVsIFJldENvZGUgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCWlmICgocFZhcl9wID09IE5VTEwpCisJICAgIHx8IChwdWlWYXJFbnRyaWVzX3AgPT0gTlVMTCkKKwkgICAgfHwgKCpwdWlWYXJFbnRyaWVzX3AgPT0gMCkKKwkgICAgfHwgKHBFbnRyeVNpemVfcCA9PSBOVUxMKSkgeworCQlSZXRDb2RlID0ga0VwbEFwaUludmFsaWRQYXJhbTsKKwkJZ290byBFeGl0OworCX0KKworCXBiRGF0YSA9IChCWVRFIE1FTSAqKSBwVmFyX3A7CisJYlZhckVudHJpZXMgPSAoQllURSkgKiBwdWlWYXJFbnRyaWVzX3A7CisJVXNlZFNpemUgPSAwOworCisJLy8gaW5pdCBWYXJQYXJhbSBzdHJ1Y3R1cmUgd2l0aCBkZWZhdWx0IHZhbHVlcworCVZhclBhcmFtLm1fdWlJbmRleCA9IHVpT2JqSW5kZXhfcDsKKwlWYXJQYXJhbS5tX1ZhbGlkRmxhZyA9IGtWYXJWYWxpZEFsbDsKKworCWlmICh1aUZpcnN0U3ViaW5kZXhfcCAhPSAwKSB7CS8vIGNoZWNrIGlmIG9iamVjdCBleGlzdHMgYnkgcmVhZGluZyBzdWJpbmRleCAweDAwLAorCQkvLyBiZWNhdXNlIHVzZXIgd2FudHMgdG8gbGluayBhIHZhcmlhYmxlIHRvIGEgc3ViaW5kZXggdW5lcXVhbCAweDAwCisJCS8vIHJlYWQgbnVtYmVyIG9mIGVudHJpZXMKKwkJRW50cnlTaXplID0gKHRFcGxPYmRTaXplKSBzaXplb2YoYkluZGV4RW50cmllcyk7CisJCVJldENvZGUgPSBFcGxPYmRSZWFkRW50cnkodWlPYmpJbmRleF9wLAorCQkJCQkgIDB4MDAsCisJCQkJCSAgKHZvaWQgR0VORVJJQyAqKSZiSW5kZXhFbnRyaWVzLAorCQkJCQkgICZFbnRyeVNpemUpOworCisJCWlmICgoUmV0Q29kZSAhPSBrRXBsU3VjY2Vzc2Z1bCkgfHwgKGJJbmRleEVudHJpZXMgPT0gMHgwMCkpIHsKKwkJCS8vIE9iamVjdCBkb2Vzbid0IGV4aXN0IG9yIGludmFsaWQgZW50cnkgbnVtYmVyCisJCQlSZXRDb2RlID0ga0VwbE9iZEluZGV4Tm90RXhpc3Q7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwl9IGVsc2UgewkJLy8gdXNlciB3YW50cyB0byBsaW5rIGEgdmFyaWFibGUgdG8gc3ViaW5kZXggMHgwMAorCQkvLyB0aGF0J3MgT0sKKwkJYkluZGV4RW50cmllcyA9IDA7CisJfQorCisJLy8gQ29ycmVjdCBudW1iZXIgb2YgZW50cmllcyBpZiBudW1iZXIgcmVhZCBmcm9tIE9EIGlzIGdyZWF0ZXIKKwkvLyB0aGFuIHRoZSBzcGVjaWZpZWQgbnVtYmVyLgorCS8vIFRoaXMgaXMgZG9uZSwgc28gdGhhdCB3ZSBkbyBub3Qgc2V0IG1vcmUgZW50cmllcyB0aGFuIHN1YmluZGV4ZXMgdGhlCisJLy8gb2JqZWN0IGFjdHVhbGx5IGhhcy4KKwlpZiAoKGJJbmRleEVudHJpZXMgPiAoYlZhckVudHJpZXMgKyB1aUZpcnN0U3ViaW5kZXhfcCAtIDEpKSAmJgorCSAgICAoYlZhckVudHJpZXMgIT0gMHgwMCkpIHsKKwkJYkluZGV4RW50cmllcyA9IChCWVRFKSAoYlZhckVudHJpZXMgKyB1aUZpcnN0U3ViaW5kZXhfcCAtIDEpOworCX0KKwkvLyBtYXAgZW50cmllcworCWZvciAodWlTdWJpbmRleCA9IHVpRmlyc3RTdWJpbmRleF9wOyB1aVN1YmluZGV4IDw9IGJJbmRleEVudHJpZXM7CisJICAgICB1aVN1YmluZGV4KyspIHsKKwkJLy8gaWYgcGFzc2VkIGVudHJ5IHNpemUgaXMgMCwgdGhlbiBnZXQgc2l6ZSBmcm9tIE9ECisJCWlmICgqcEVudHJ5U2l6ZV9wID09IDB4MDApIHsKKwkJCS8vIHJlYWQgZW50cnkgc2l6ZQorCQkJRW50cnlTaXplID0gRXBsT2JkR2V0RGF0YVNpemUodWlPYmpJbmRleF9wLCB1aVN1YmluZGV4KTsKKworCQkJaWYgKEVudHJ5U2l6ZSA9PSAweDAwKSB7CisJCQkJLy8gaW52YWxpZCBlbnRyeSBzaXplIChtYXliZSBvYmplY3QgZG9lc24ndCBleGlzdCBvciBlbnRyeSBvZiB0eXBlIERPTUFJTiBpcyBlbXB0eSkKKwkJCQlSZXRDb2RlID0ga0VwbE9iZFN1YmluZGV4Tm90RXhpc3Q7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CS8vIHVzZSBwYXNzZWQgZW50cnkgc2l6ZQorCQkJRW50cnlTaXplID0gKnBFbnRyeVNpemVfcDsKKwkJfQorCisJCVZhclBhcmFtLm1fdWlTdWJpbmRleCA9IHVpU3ViaW5kZXg7CisKKwkJLy8gc2V0IHBvaW50ZXIgdG8gdXNlciB2YXIKKwkJVmFyUGFyYW0ubV9TaXplID0gRW50cnlTaXplOworCQlWYXJQYXJhbS5tX3BEYXRhID0gcGJEYXRhOworCisJCVVzZWRTaXplICs9IEVudHJ5U2l6ZTsKKwkJcGJEYXRhICs9IEVudHJ5U2l6ZTsKKworCQlSZXRDb2RlID0gRXBsT2JkRGVmaW5lVmFyKCZWYXJQYXJhbSk7CisJCWlmIChSZXRDb2RlICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8vIHNldCBudW1iZXIgb2YgbWFwcGVkIGVudHJpZXMgYW5kIGVudHJ5IHNpemUKKwkqcHVpVmFyRW50cmllc19wID0gKChiSW5kZXhFbnRyaWVzIC0gdWlGaXJzdFN1YmluZGV4X3ApICsgMSk7CisJKnBFbnRyeVNpemVfcCA9IFVzZWRTaXplOworCisgICAgICBFeGl0OgorCisJcmV0dXJuIChSZXRDb2RlKTsKKworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEFwaVJlYWRPYmplY3QoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZWFkcyB0aGUgc3BlY2lmaWVkIGVudHJ5IGZyb20gdGhlIE9EIG9mIHRoZSBzcGVjaWZpZWQgbm9kZS4KKy8vICAgICAgICAgICAgICBJZiB0aGlzIG5vZGUgaXMgYSByZW1vdGUgbm9kZSwgaXQgcGVyZm9ybXMgYSBTRE8gdHJhbnNmZXIsIHdoaWNoCisvLyAgICAgICAgICAgICAgbWVhbnMgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGtFcGxBcGlUYXNrRGVmZXJyZWQgYW5kIHRoZSBhcHBsaWNhdGlvbgorLy8gICAgICAgICAgICAgIGlzIGluZm9ybWVkIHZpYSB0aGUgZXZlbnQgY2FsbGJhY2sgZnVuY3Rpb24gd2hlbiB0aGUgdGFzayBpcyBjb21wbGV0ZWQuCisvLworLy8gUGFyYW1ldGVyczogIHBTZG9Db21Db25IZGxfcCAgICAgICAgID0gSU5PVVQ6IHBvaW50ZXIgdG8gU0RPIGNvbm5lY3Rpb24gaGFuZGxlIChtYXkgYmUgTlVMTCBpbiBjYXNlIG9mIGxvY2FsIE9EIGFjY2VzcykKKy8vICAgICAgICAgICAgICB1aU5vZGVJZF9wICAgICAgICAgICAgICA9IElOOiBub2RlIElEICgwID0gaXRzZWxmKQorLy8gICAgICAgICAgICAgIHVpSW5kZXhfcCAgICAgICAgICAgICAgID0gSU46IGluZGV4IG9mIG9iamVjdCBpbiBPRAorLy8gICAgICAgICAgICAgIHVpU3ViaW5kZXhfcCAgICAgICAgICAgID0gSU46IHN1Yi1pbmRleCBvZiBvYmplY3QgaW4gT0QKKy8vICAgICAgICAgICAgICBwRHN0RGF0YV9sZV9wICAgICAgICAgICA9IE9VVDogcG9pbnRlciB0byBkYXRhIGluIGxpdHRsZSBlbmRpYW4KKy8vICAgICAgICAgICAgICBwdWlTaXplX3AgICAgICAgICAgICAgICA9IElOT1VUOiBwb2ludGVyIHRvIHNpemUgb2YgZGF0YQorLy8gICAgICAgICAgICAgIFNkb1R5cGVfcCAgICAgICAgICAgICAgID0gSU46IHR5cGUgb2YgU0RPIHRyYW5zZmVyCisvLyAgICAgICAgICAgICAgcFVzZXJBcmdfcCAgICAgICAgICAgICAgPSBJTjogdXNlci1kZWZpbmFibGUgYXJndW1lbnQgcG9pbnRlciwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgZXZlbnQgY2FsbGJhY2sgZnVuY3Rpb24KKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlSZWFkT2JqZWN0KHRFcGxTZG9Db21Db25IZGwgKiBwU2RvQ29tQ29uSGRsX3AsCisJCQkJICAgdW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJICAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgdWlTdWJpbmRleF9wLAorCQkJCSAgIHZvaWQgKnBEc3REYXRhX2xlX3AsCisJCQkJICAgdW5zaWduZWQgaW50ICpwdWlTaXplX3AsCisJCQkJICAgdEVwbFNkb1R5cGUgU2RvVHlwZV9wLCB2b2lkICpwVXNlckFyZ19wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlpZiAoKHVpSW5kZXhfcCA9PSAwKSB8fCAocERzdERhdGFfbGVfcCA9PSBOVUxMKSB8fCAocHVpU2l6ZV9wID09IE5VTEwpCisJICAgIHx8ICgqcHVpU2l6ZV9wID09IDApKSB7CisJCVJldCA9IGtFcGxBcGlJbnZhbGlkUGFyYW07CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAodWlOb2RlSWRfcCA9PSAwIHx8IHVpTm9kZUlkX3AgPT0gRXBsT2JkR2V0Tm9kZUlkKCkpIHsJLy8gbG9jYWwgT0QgYWNjZXNzIGNhbiBiZSBwZXJmb3JtZWQKKwkJdEVwbE9iZFNpemUgT2JkU2l6ZTsKKworCQlPYmRTaXplID0gKHRFcGxPYmRTaXplKSAqIHB1aVNpemVfcDsKKwkJUmV0ID0KKwkJICAgIEVwbE9iZFJlYWRFbnRyeVRvTGUodWlJbmRleF9wLCB1aVN1YmluZGV4X3AsIHBEc3REYXRhX2xlX3AsCisJCQkJCSZPYmRTaXplKTsKKwkJKnB1aVNpemVfcCA9ICh1bnNpZ25lZCBpbnQpT2JkU2l6ZTsKKwl9IGVsc2UgewkJLy8gcGVyZm9ybSBTRE8gdHJhbnNmZXIKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET0MpKSAhPSAwKQorCQl0RXBsU2RvQ29tVHJhbnNQYXJhbUJ5SW5kZXggVHJhbnNQYXJhbUJ5SW5kZXg7CisvLyAgICB0RXBsU2RvQ29tQ29uSGRsICAgICAgICAgICAgU2RvQ29tQ29uSGRsOworCisJCS8vIGNoZWNrIGlmIGFwcGxpY2F0aW9uIHByb3ZpZGVzIHNwYWNlIGZvciBoYW5kbGUKKwkJaWYgKHBTZG9Db21Db25IZGxfcCA9PSBOVUxMKSB7CisJCQlSZXQgPSBrRXBsQXBpSW52YWxpZFBhcmFtOworCQkJZ290byBFeGl0OworLy8gICAgICAgICAgICBwU2RvQ29tQ29uSGRsX3AgPSAmU2RvQ29tQ29uSGRsOworCQl9CisJCS8vIGluaXQgY29tbWFuZCBsYXllciBjb25uZWN0aW9uCisJCVJldCA9IEVwbFNkb0NvbURlZmluZUNvbihwU2RvQ29tQ29uSGRsX3AsIHVpTm9kZUlkX3AsCS8vIHRhcmdldCBub2RlIGlkCisJCQkJCSBTZG9UeXBlX3ApOwkvLyBTRE8gdHlwZQorCQlpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgJiYgKFJldCAhPSBrRXBsU2RvQ29tSGFuZGxlRXhpc3RzKSkgeworCQkJZ290byBFeGl0OworCQl9CisJCVRyYW5zUGFyYW1CeUluZGV4Lm1fcERhdGEgPSBwRHN0RGF0YV9sZV9wOworCQlUcmFuc1BhcmFtQnlJbmRleC5tX1Nkb0FjY2Vzc1R5cGUgPSBrRXBsU2RvQWNjZXNzVHlwZVJlYWQ7CisJCVRyYW5zUGFyYW1CeUluZGV4Lm1fU2RvQ29tQ29uSGRsID0gKnBTZG9Db21Db25IZGxfcDsKKwkJVHJhbnNQYXJhbUJ5SW5kZXgubV91aURhdGFTaXplID0gKnB1aVNpemVfcDsKKwkJVHJhbnNQYXJhbUJ5SW5kZXgubV91aUluZGV4ID0gdWlJbmRleF9wOworCQlUcmFuc1BhcmFtQnlJbmRleC5tX3VpU3ViaW5kZXggPSB1aVN1YmluZGV4X3A7CisJCVRyYW5zUGFyYW1CeUluZGV4Lm1fcGZuU2RvRmluaXNoZWRDYiA9IEVwbEFwaUNiU2RvQ29uOworCQlUcmFuc1BhcmFtQnlJbmRleC5tX3BVc2VyQXJnID0gcFVzZXJBcmdfcDsKKworCQlSZXQgPSBFcGxTZG9Db21Jbml0VHJhbnNmZXJCeUluZGV4KCZUcmFuc1BhcmFtQnlJbmRleCk7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQlSZXQgPSBrRXBsQXBpVGFza0RlZmVycmVkOworCisjZWxzZQorCQlSZXQgPSBrRXBsQXBpSW52YWxpZFBhcmFtOworI2VuZGlmCisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsQXBpV3JpdGVPYmplY3QoKQorLy8KKy8vIERlc2NyaXB0aW9uOiB3cml0ZXMgdGhlIHNwZWNpZmllZCBlbnRyeSB0byB0aGUgT0Qgb2YgdGhlIHNwZWNpZmllZCBub2RlLgorLy8gICAgICAgICAgICAgIElmIHRoaXMgbm9kZSBpcyBhIHJlbW90ZSBub2RlLCBpdCBwZXJmb3JtcyBhIFNETyB0cmFuc2Zlciwgd2hpY2gKKy8vICAgICAgICAgICAgICBtZWFucyB0aGlzIGZ1bmN0aW9uIHJldHVybnMga0VwbEFwaVRhc2tEZWZlcnJlZCBhbmQgdGhlIGFwcGxpY2F0aW9uCisvLyAgICAgICAgICAgICAgaXMgaW5mb3JtZWQgdmlhIHRoZSBldmVudCBjYWxsYmFjayBmdW5jdGlvbiB3aGVuIHRoZSB0YXNrIGlzIGNvbXBsZXRlZC4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFNkb0NvbUNvbkhkbF9wICAgICAgICAgPSBJTk9VVDogcG9pbnRlciB0byBTRE8gY29ubmVjdGlvbiBoYW5kbGUgKG1heSBiZSBOVUxMIGluIGNhc2Ugb2YgbG9jYWwgT0QgYWNjZXNzKQorLy8gICAgICAgICAgICAgIHVpTm9kZUlkX3AgICAgICAgICAgICAgID0gSU46IG5vZGUgSUQgKDAgPSBpdHNlbGYpCisvLyAgICAgICAgICAgICAgdWlJbmRleF9wICAgICAgICAgICAgICAgPSBJTjogaW5kZXggb2Ygb2JqZWN0IGluIE9ECisvLyAgICAgICAgICAgICAgdWlTdWJpbmRleF9wICAgICAgICAgICAgPSBJTjogc3ViLWluZGV4IG9mIG9iamVjdCBpbiBPRAorLy8gICAgICAgICAgICAgIHBTcmNEYXRhX2xlX3AgICAgICAgICAgID0gSU46IHBvaW50ZXIgdG8gZGF0YSBpbiBsaXR0bGUgZW5kaWFuCisvLyAgICAgICAgICAgICAgdWlTaXplX3AgICAgICAgICAgICAgICAgPSBJTjogc2l6ZSBvZiBkYXRhIGluIGJ5dGVzCisvLyAgICAgICAgICAgICAgU2RvVHlwZV9wICAgICAgICAgICAgICAgPSBJTjogdHlwZSBvZiBTRE8gdHJhbnNmZXIKKy8vICAgICAgICAgICAgICBwVXNlckFyZ19wICAgICAgICAgICAgICA9IElOOiB1c2VyLWRlZmluYWJsZSBhcmd1bWVudCBwb2ludGVyLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBldmVudCBjYWxsYmFjayBmdW5jdGlvbgorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaVdyaXRlT2JqZWN0KHRFcGxTZG9Db21Db25IZGwgKiBwU2RvQ29tQ29uSGRsX3AsCisJCQkJICAgIHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgdWlTdWJpbmRleF9wLAorCQkJCSAgICB2b2lkICpwU3JjRGF0YV9sZV9wLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgdWlTaXplX3AsCisJCQkJICAgIHRFcGxTZG9UeXBlIFNkb1R5cGVfcCwgdm9pZCAqcFVzZXJBcmdfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJaWYgKCh1aUluZGV4X3AgPT0gMCkgfHwgKHBTcmNEYXRhX2xlX3AgPT0gTlVMTCkgfHwgKHVpU2l6ZV9wID09IDApKSB7CisJCVJldCA9IGtFcGxBcGlJbnZhbGlkUGFyYW07CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAodWlOb2RlSWRfcCA9PSAwIHx8IHVpTm9kZUlkX3AgPT0gRXBsT2JkR2V0Tm9kZUlkKCkpIHsJLy8gbG9jYWwgT0QgYWNjZXNzIGNhbiBiZSBwZXJmb3JtZWQKKworCQlSZXQgPQorCQkgICAgRXBsT2JkV3JpdGVFbnRyeUZyb21MZSh1aUluZGV4X3AsIHVpU3ViaW5kZXhfcCwKKwkJCQkJICAgcFNyY0RhdGFfbGVfcCwgdWlTaXplX3ApOworCX0gZWxzZSB7CQkvLyBwZXJmb3JtIFNETyB0cmFuc2ZlcgorI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApCisJCXRFcGxTZG9Db21UcmFuc1BhcmFtQnlJbmRleCBUcmFuc1BhcmFtQnlJbmRleDsKKy8vICAgIHRFcGxTZG9Db21Db25IZGwgICAgICAgICAgICBTZG9Db21Db25IZGw7CisKKwkJLy8gY2hlY2sgaWYgYXBwbGljYXRpb24gcHJvdmlkZXMgc3BhY2UgZm9yIGhhbmRsZQorCQlpZiAocFNkb0NvbUNvbkhkbF9wID09IE5VTEwpIHsKKwkJCVJldCA9IGtFcGxBcGlJbnZhbGlkUGFyYW07CisJCQlnb3RvIEV4aXQ7CisvLyAgICAgICAgICAgIHBTZG9Db21Db25IZGxfcCA9ICZTZG9Db21Db25IZGw7CisJCX0KKwkJLy8gZC5rLjogSG93IHRvIHJlY3ljbGUgY29tbWFuZCBsYXllciBjb25uZWN0aW9uPworCQkvLyAgICAgICBUcnkgdG8gcmVkZWZpbmUgaXQsIHdoaWNoIHdpbGwgcmV0dXJuIGtFcGxTZG9Db21IYW5kbGVFeGlzdHMKKwkJLy8gICAgICAgYW5kIHRoZSBleGlzdGluZyBjb21tYW5kIGxheWVyIGhhbmRsZS4KKwkJLy8gICAgICAgSWYgdGhlIHJldHVybmVkIGhhbmRsZSBpcyBidXN5LCBFcGxTZG9Db21Jbml0VHJhbnNmZXJCeUluZGV4KCkKKwkJLy8gICAgICAgd2lsbCByZXR1cm4gd2l0aCBlcnJvci4KKwkJLy8gJCQkIGQuay46IENvbGxpc2lvbnMgbWF5IG9jY3VyIHdpdGggQ29uZmlndXJhdGlvbiBNYW5hZ2VyLCBpZiBib3RoIHRoZSBhcHBsaWNhdGlvbiBhbmQKKwkJLy8gICAgICAgICAgIENvbmZpZ3VyYXRpb24gTWFuYWdlciwgYXJlIHRyeWluZyB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSB2ZXJ5IHNhbWUgbm9kZS4KKwkJLy8gICAgIHBvc3NpYmxlIHNvbHV0aW9uOiBkaXNhbGxvdyBjb21tdW5pY2F0aW9uIGJ5IGFwcGxpY2F0aW9uIGlmIENvbmZpZ3VyYXRpb24gTWFuYWdlciBpcyBidXN5CisKKwkJLy8gaW5pdCBjb21tYW5kIGxheWVyIGNvbm5lY3Rpb24KKwkJUmV0ID0gRXBsU2RvQ29tRGVmaW5lQ29uKHBTZG9Db21Db25IZGxfcCwgdWlOb2RlSWRfcCwJLy8gdGFyZ2V0IG5vZGUgaWQKKwkJCQkJIFNkb1R5cGVfcCk7CS8vIFNETyB0eXBlCisJCWlmICgoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSAmJiAoUmV0ICE9IGtFcGxTZG9Db21IYW5kbGVFeGlzdHMpKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJVHJhbnNQYXJhbUJ5SW5kZXgubV9wRGF0YSA9IHBTcmNEYXRhX2xlX3A7CisJCVRyYW5zUGFyYW1CeUluZGV4Lm1fU2RvQWNjZXNzVHlwZSA9IGtFcGxTZG9BY2Nlc3NUeXBlV3JpdGU7CisJCVRyYW5zUGFyYW1CeUluZGV4Lm1fU2RvQ29tQ29uSGRsID0gKnBTZG9Db21Db25IZGxfcDsKKwkJVHJhbnNQYXJhbUJ5SW5kZXgubV91aURhdGFTaXplID0gdWlTaXplX3A7CisJCVRyYW5zUGFyYW1CeUluZGV4Lm1fdWlJbmRleCA9IHVpSW5kZXhfcDsKKwkJVHJhbnNQYXJhbUJ5SW5kZXgubV91aVN1YmluZGV4ID0gdWlTdWJpbmRleF9wOworCQlUcmFuc1BhcmFtQnlJbmRleC5tX3BmblNkb0ZpbmlzaGVkQ2IgPSBFcGxBcGlDYlNkb0NvbjsKKwkJVHJhbnNQYXJhbUJ5SW5kZXgubV9wVXNlckFyZyA9IHBVc2VyQXJnX3A7CisKKwkJUmV0ID0gRXBsU2RvQ29tSW5pdFRyYW5zZmVyQnlJbmRleCgmVHJhbnNQYXJhbUJ5SW5kZXgpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJUmV0ID0ga0VwbEFwaVRhc2tEZWZlcnJlZDsKKworI2Vsc2UKKwkJUmV0ID0ga0VwbEFwaUludmFsaWRQYXJhbTsKKyNlbmRpZgorCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEFwaUZyZWVTZG9DaGFubmVsKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZnJlZXMgdGhlIHNwZWNpZmllZCBTRE8gY2hhbm5lbC4KKy8vICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFmdGVyIGVhY2ggY2FsbCB0byBFcGxBcGlSZWFkT2JqZWN0KCkvRXBsQXBpV3JpdGVPYmplY3QoKQorLy8gICAgICAgICAgICAgIHdoaWNoIHJldHVybnMga0VwbEFwaVRhc2tEZWZlcnJlZCBhbmQgdGhlIGFwcGxpY2F0aW9uCisvLyAgICAgICAgICAgICAgaXMgaW5mb3JtZWQgdmlhIHRoZSBldmVudCBjYWxsYmFjayBmdW5jdGlvbiB3aGVuIHRoZSB0YXNrIGlzIGNvbXBsZXRlZC4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgU2RvQ29tQ29uSGRsX3AgICAgICAgICAgPSBJTjogU0RPIGNvbm5lY3Rpb24gaGFuZGxlCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpRnJlZVNkb0NoYW5uZWwodEVwbFNkb0NvbUNvbkhkbCBTZG9Db21Db25IZGxfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9DKSkgIT0gMCkKKworCS8vIGluaXQgY29tbWFuZCBsYXllciBjb25uZWN0aW9uCisJUmV0ID0gRXBsU2RvQ29tVW5kZWZpbmVDb24oU2RvQ29tQ29uSGRsX3ApOworCisjZWxzZQorCVJldCA9IGtFcGxBcGlJbnZhbGlkUGFyYW07CisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsQXBpUmVhZExvY2FsT2JqZWN0KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVhZHMgdGhlIHNwZWNpZmllZCBlbnRyeSBmcm9tIHRoZSBsb2NhbCBPRC4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlJbmRleF9wICAgICAgICAgICAgICAgPSBJTjogaW5kZXggb2Ygb2JqZWN0IGluIE9ECisvLyAgICAgICAgICAgICAgdWlTdWJpbmRleF9wICAgICAgICAgICAgPSBJTjogc3ViLWluZGV4IG9mIG9iamVjdCBpbiBPRAorLy8gICAgICAgICAgICAgIHBEc3REYXRhX3AgICAgICAgICAgICAgID0gT1VUOiBwb2ludGVyIHRvIGRhdGEgaW4gcGxhdGZvcm0gYnl0ZSBvcmRlcgorLy8gICAgICAgICAgICAgIHB1aVNpemVfcCAgICAgICAgICAgICAgID0gSU5PVVQ6IHBvaW50ZXIgdG8gc2l6ZSBvZiBkYXRhCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpUmVhZExvY2FsT2JqZWN0KHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCXVuc2lnbmVkIGludCB1aVN1YmluZGV4X3AsCisJCQkJCXZvaWQgKnBEc3REYXRhX3AsCisJCQkJCXVuc2lnbmVkIGludCAqcHVpU2l6ZV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbE9iZFNpemUgT2JkU2l6ZTsKKworCU9iZFNpemUgPSAodEVwbE9iZFNpemUpICogcHVpU2l6ZV9wOworCVJldCA9IEVwbE9iZFJlYWRFbnRyeSh1aUluZGV4X3AsIHVpU3ViaW5kZXhfcCwgcERzdERhdGFfcCwgJk9iZFNpemUpOworCSpwdWlTaXplX3AgPSAodW5zaWduZWQgaW50KU9iZFNpemU7CisKKwlyZXR1cm4gUmV0OworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEFwaVdyaXRlTG9jYWxPYmplY3QoKQorLy8KKy8vIERlc2NyaXB0aW9uOiB3cml0ZXMgdGhlIHNwZWNpZmllZCBlbnRyeSB0byB0aGUgbG9jYWwgT0QuCisvLworLy8gUGFyYW1ldGVyczogIHVpSW5kZXhfcCAgICAgICAgICAgICAgID0gSU46IGluZGV4IG9mIG9iamVjdCBpbiBPRAorLy8gICAgICAgICAgICAgIHVpU3ViaW5kZXhfcCAgICAgICAgICAgID0gSU46IHN1Yi1pbmRleCBvZiBvYmplY3QgaW4gT0QKKy8vICAgICAgICAgICAgICBwU3JjRGF0YV9wICAgICAgICAgICAgICA9IElOOiBwb2ludGVyIHRvIGRhdGEgaW4gcGxhdGZvcm0gYnl0ZSBvcmRlcgorLy8gICAgICAgICAgICAgIHVpU2l6ZV9wICAgICAgICAgICAgICAgID0gSU46IHNpemUgb2YgZGF0YSBpbiBieXRlcworLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaVdyaXRlTG9jYWxPYmplY3QodW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJIHVuc2lnbmVkIGludCB1aVN1YmluZGV4X3AsCisJCQkJCSB2b2lkICpwU3JjRGF0YV9wLAorCQkJCQkgdW5zaWduZWQgaW50IHVpU2l6ZV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlSZXQgPQorCSAgICBFcGxPYmRXcml0ZUVudHJ5KHVpSW5kZXhfcCwgdWlTdWJpbmRleF9wLCBwU3JjRGF0YV9wLAorCQkJICAgICAodEVwbE9iZFNpemUpIHVpU2l6ZV9wKTsKKworCXJldHVybiBSZXQ7Cit9CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEFwaU1uVHJpZ2dlclN0YXRlQ2hhbmdlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogdHJpZ2dlcnMgdGhlIHNwZWNpZmllZCBub2RlIGNvbW1hbmQgZm9yIHRoZSBzcGVjaWZpZWQgbm9kZS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBub2RlIElEIGZvciB3aGljaCB0aGUgbm9kZSBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQKKy8vICAgICAgICAgICAgICBOb2RlQ29tbWFuZF9wICAgICAgICAgICA9IG5vZGUgY29tbWFuZAorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaU1uVHJpZ2dlclN0YXRlQ2hhbmdlKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkgICAgIHRFcGxObXROb2RlQ29tbWFuZCBOb2RlQ29tbWFuZF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlSZXQgPSBFcGxObXRNbnVUcmlnZ2VyU3RhdGVDaGFuZ2UodWlOb2RlSWRfcCwgTm9kZUNvbW1hbmRfcCk7CisKKwlyZXR1cm4gUmV0OworfQorCisjZW5kaWYgLy8gKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxBcGlDYk9iZEFjY2VzcworLy8KKy8vIERlc2NyaXB0aW9uOiBjYWxsYmFjayBmdW5jdGlvbiBmb3IgT0QgYWNjZXNzZXMKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFBhcmFtX3AgICAgICAgICAgICAgICAgPSBPQkQgcGFyYW1ldGVyCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlDYk9iZEFjY2Vzcyh0RXBsT2JkQ2JQYXJhbSBNRU0gKiBwUGFyYW1fcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisjaWYgKEVQTF9BUElfT0JEX0ZPUldBUkRfRVZFTlQgIT0gRkFMU0UpCisJdEVwbEFwaUV2ZW50QXJnIEV2ZW50QXJnOworCisJLy8gY2FsbCB1c2VyIGNhbGxiYWNrCisJLy8gbXVzdCBiZSBkaXNhYmxlZCBmb3IgRXBsQXBpTGludXhLZXJuZWwuYywgYmVjYXVzZSBvZiByZWVudHJhbmN5IHByb2JsZW0KKwkvLyBmb3IgbG9jYWwgT0QgYWNjZXNzLiBUaGlzIGlzIG5vdCBzbyBiYWQgYXMgdXNlciBjYWxsYmFjayBmdW5jdGlvbiBpbgorCS8vIGFwcGxpY2F0aW9uIGRvZXMgbm90IHVzZSBPRCBjYWxsYmFja3MgYXQgdGhlIG1vbWVudC4KKwlFdmVudEFyZy5tX09iZENiUGFyYW0gPSAqcFBhcmFtX3A7CisJUmV0ID0gRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3BmbkNiRXZlbnQoa0VwbEFwaUV2ZW50T2JkQWNjZXNzLAorCQkJCQkJCSZFdmVudEFyZywKKwkJCQkJCQlFcGxBcGlJbnN0YW5jZV9nLgorCQkJCQkJCW1fSW5pdFBhcmFtLgorCQkJCQkJCW1fcEV2ZW50VXNlckFyZyk7CisjZW5kaWYKKworCXN3aXRjaCAocFBhcmFtX3AtPm1fdWlJbmRleCkgeworCQkvL2Nhc2UgMHgxMDA2OiAgICAvLyBOTVRfQ3ljbGVMZW5fVTMyICh2YWxpZCBvbiByZXNldCkKKwljYXNlIDB4MUMxNDoJCS8vIERMTF9Mb3NzT2ZGcmFtZVRvbGVyYW5jZV9VMzIKKwkJLy9jYXNlIDB4MUY5ODogICAgLy8gTk1UX0N5Y2xlVGltaW5nX1JFQyAodmFsaWQgb24gcmVzZXQpCisJCXsKKwkJCWlmIChwUGFyYW1fcC0+bV9PYmRFdmVudCA9PSBrRXBsT2JkRXZQb3N0V3JpdGUpIHsKKwkJCQkvLyB1cGRhdGUgRExMIGNvbmZpZ3VyYXRpb24KKwkJCQlSZXQgPSBFcGxBcGlVcGRhdGVEbGxDb25maWcoRkFMU0UpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCWNhc2UgMHgxMDIwOgkJLy8gQ0ZNX1ZlcmlmeUNvbmZpZ3VyYXRpb25fUkVDLkNvbmZJZF9VMzIgIT0gMAorCQl7CisJCQlpZiAoKHBQYXJhbV9wLT5tX09iZEV2ZW50ID09IGtFcGxPYmRFdlBvc3RXcml0ZSkKKwkJCSAgICAmJiAocFBhcmFtX3AtPm1fdWlTdWJJbmRleCA9PSAzKQorCQkJICAgICYmICgqKChEV09SRCAqKSBwUGFyYW1fcC0+bV9wQXJnKSAhPSAwKSkgeworCQkJCURXT1JEIGR3VmVyaWZ5Q29uZkludmFsaWQgPSAwOworCQkJCS8vIHNldCBDRk1fVmVyaWZ5Q29uZmlndXJhdGlvbl9SRUMuVmVyaWZ5Q29uZkludmFsaWRfVTMyIHRvIDAKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxPYmRXcml0ZUVudHJ5KDB4MTAyMCwgNCwKKwkJCQkJCSAgICAgJmR3VmVyaWZ5Q29uZkludmFsaWQsIDQpOworCQkJCS8vIGlnbm9yZSBhbnkgZXJyb3IgYmVjYXVzZSB0aGlzIG9iamVrdCBpcyBvcHRpb25hbAorCQkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCWNhc2UgMHgxRjlFOgkJLy8gTk1UX1Jlc2V0Q21kX1U4CisJCXsKKwkJCWlmIChwUGFyYW1fcC0+bV9PYmRFdmVudCA9PSBrRXBsT2JkRXZQcmVXcml0ZSkgeworCQkJCUJZVEUgYk5tdENvbW1hbmQ7CisKKwkJCQliTm10Q29tbWFuZCA9ICooKEJZVEUgKikgcFBhcmFtX3AtPm1fcEFyZyk7CisJCQkJLy8gY2hlY2sgdmFsdWUgcmFuZ2UKKwkJCQlzd2l0Y2ggKCh0RXBsTm10Q29tbWFuZCkgYk5tdENvbW1hbmQpIHsKKwkJCQljYXNlIGtFcGxObXRDbWRSZXNldE5vZGU6CisJCQkJY2FzZSBrRXBsTm10Q21kUmVzZXRDb21tdW5pY2F0aW9uOgorCQkJCWNhc2Uga0VwbE5tdENtZFJlc2V0Q29uZmlndXJhdGlvbjoKKwkJCQljYXNlIGtFcGxObXRDbWRTd1Jlc2V0OgorCQkJCWNhc2Uga0VwbE5tdENtZEludmFsaWRTZXJ2aWNlOgorCQkJCQkvLyB2YWxpZCBjb21tYW5kIGlkZW50aWZpZXIgc3BlY2lmaWVkCisJCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoKKwkJCQkJcFBhcmFtX3AtPm1fZHdBYm9ydENvZGUgPQorCQkJCQkgICAgRVBMX1NET0FDX1ZBTFVFX1JBTkdFX0VYQ0VFREVEOworCQkJCQlSZXQgPSBrRXBsT2JkQWNjZXNzVmlvbGF0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHBQYXJhbV9wLT5tX09iZEV2ZW50ID09IGtFcGxPYmRFdlBvc3RXcml0ZSkgeworCQkJCUJZVEUgYk5tdENvbW1hbmQ7CisKKwkJCQliTm10Q29tbWFuZCA9ICooKEJZVEUgKikgcFBhcmFtX3AtPm1fcEFyZyk7CisJCQkJLy8gY2hlY2sgdmFsdWUgcmFuZ2UKKwkJCQlzd2l0Y2ggKCh0RXBsTm10Q29tbWFuZCkgYk5tdENvbW1hbmQpIHsKKwkJCQljYXNlIGtFcGxObXRDbWRSZXNldE5vZGU6CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVFUpKSAhPSAwKQorCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsTm10dU5tdEV2ZW50CisJCQkJCSAgICAoa0VwbE5tdEV2ZW50UmVzZXROb2RlKTsKKyNlbmRpZgorCQkJCQlicmVhazsKKworCQkJCWNhc2Uga0VwbE5tdENtZFJlc2V0Q29tbXVuaWNhdGlvbjoKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UVSkpICE9IDApCisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxObXR1Tm10RXZlbnQKKwkJCQkJICAgIChrRXBsTm10RXZlbnRSZXNldENvbSk7CisjZW5kaWYKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIGtFcGxObXRDbWRSZXNldENvbmZpZ3VyYXRpb246CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVFUpKSAhPSAwKQorCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsTm10dU5tdEV2ZW50CisJCQkJCSAgICAoa0VwbE5tdEV2ZW50UmVzZXRDb25maWcpOworI2VuZGlmCisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBrRXBsTm10Q21kU3dSZXNldDoKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UVSkpICE9IDApCisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxObXR1Tm10RXZlbnQKKwkJCQkJICAgIChrRXBsTm10RXZlbnRTd1Jlc2V0KTsKKyNlbmRpZgorCQkJCQlicmVhazsKKworCQkJCWNhc2Uga0VwbE5tdENtZEludmFsaWRTZXJ2aWNlOgorCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCXBQYXJhbV9wLT5tX2R3QWJvcnRDb2RlID0KKwkJCQkJICAgIEVQTF9TRE9BQ19WQUxVRV9SQU5HRV9FWENFRURFRDsKKwkJCQkJUmV0ID0ga0VwbE9iZEFjY2Vzc1Zpb2xhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0KKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworLy9FeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxBcGlQcm9jZXNzRXZlbnQKKy8vCisvLyBEZXNjcmlwdGlvbjogcHJvY2Vzc2VzIGV2ZW50cyBmcm9tIGV2ZW50IHF1ZXVlIGFuZCBmb3J3YXJkcyB0aGVzZSB0bworLy8gICAgICAgICAgICAgIHRoZSBhcHBsaWNhdGlvbidzIGV2ZW50IGNhbGxiYWNrIGZ1bmN0aW9uCisvLworLy8gUGFyYW1ldGVyczogIHBFcGxFdmVudF9wID0gICBwb2ludGVyIHRvIGV2ZW50CisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbEFwaVByb2Nlc3NFdmVudCh0RXBsRXZlbnQgKiBwRXBsRXZlbnRfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsRXZlbnRFcnJvciAqcEV2ZW50RXJyb3I7CisJdEVwbEFwaUV2ZW50VHlwZSBFdmVudFR5cGU7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIHByb2Nlc3MgZXZlbnQKKwlzd2l0Y2ggKHBFcGxFdmVudF9wLT5tX0V2ZW50VHlwZSkgeworCQkvLyBlcnJvciBldmVudAorCWNhc2Uga0VwbEV2ZW50VHlwZUVycm9yOgorCQl7CisJCQlwRXZlbnRFcnJvciA9ICh0RXBsRXZlbnRFcnJvciAqKSBwRXBsRXZlbnRfcC0+bV9wQXJnOworCQkJc3dpdGNoIChwRXZlbnRFcnJvci0+bV9FdmVudFNvdXJjZSkgeworCQkJCS8vIHRyZWF0IHRoZSBlcnJvcnMgZnJvbSB0aGUgZm9sbG93aW5nIHNvdXJjZXMgYXMgY3JpdGljYWwKKwkJCWNhc2Uga0VwbEV2ZW50U291cmNlRXZlbnRrOgorCQkJY2FzZSBrRXBsRXZlbnRTb3VyY2VFdmVudHU6CisJCQljYXNlIGtFcGxFdmVudFNvdXJjZURsbGs6CisJCQkJeworCQkJCQlFdmVudFR5cGUgPSBrRXBsQXBpRXZlbnRDcml0aWNhbEVycm9yOworCQkJCQkvLyBoYWx0IHRoZSBzdGFjayBieSBlbnRlcmluZyBOTVQgc3RhdGUgT2ZmCisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxObXR1Tm10RXZlbnQKKwkJCQkJICAgIChrRXBsTm10RXZlbnRDcml0aWNhbEVycm9yKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gdGhlIG90aGVyIGVycm9ycyBhcmUganVzdCB3YXJuaW5ncworCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCUV2ZW50VHlwZSA9IGtFcGxBcGlFdmVudFdhcm5pbmc7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJLy8gY2FsbCB1c2VyIGNhbGxiYWNrCisJCQlSZXQgPQorCQkJICAgIEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9wZm5DYkV2ZW50KEV2ZW50VHlwZSwKKwkJCQkJCQkJICAgICAgKHRFcGxBcGlFdmVudEFyZworCQkJCQkJCQkgICAgICAgKikKKwkJCQkJCQkJICAgICAgcEV2ZW50RXJyb3IsCisJCQkJCQkJCSAgICAgIEVwbEFwaUluc3RhbmNlX2cuCisJCQkJCQkJCSAgICAgIG1fSW5pdFBhcmFtLgorCQkJCQkJCQkgICAgICBtX3BFdmVudFVzZXJBcmcpOworCQkJLy8gZGlzY2FyZCBlcnJvciBmcm9tIGNhbGxiYWNrIGZ1bmN0aW9uLCBiZWNhdXNlIHRoaXMgY291bGQgZ2VuZXJhdGUgYW4gZW5kbGVzcyBsb29wCisJCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gYXQgcHJlc2VudCwgdGhlcmUgYXJlIG5vIG90aGVyIGV2ZW50cyBmb3IgdGhpcyBtb2R1bGUKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxBcGlDYk5tdFN0YXRlQ2hhbmdlCisvLworLy8gRGVzY3JpcHRpb246IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBOTVQgc3RhdGUgY2hhbmdlcworLy8KKy8vIFBhcmFtZXRlcnM6ICBObXRTdGF0ZUNoYW5nZV9wICAgICAgICA9IE5NVCBzdGF0ZSBjaGFuZ2UgZXZlbnQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlDYk5tdFN0YXRlQ2hhbmdlKHRFcGxFdmVudE5tdFN0YXRlQ2hhbmdlCisJCQkJCQlObXRTdGF0ZUNoYW5nZV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJQllURSBiTm10U3RhdGU7CisJdEVwbEFwaUV2ZW50QXJnIEV2ZW50QXJnOworCisJLy8gc2F2ZSBOTVQgc3RhdGUgaW4gT0QKKwliTm10U3RhdGUgPSAoQllURSkgTm10U3RhdGVDaGFuZ2VfcC5tX05ld05tdFN0YXRlOworCVJldCA9IEVwbE9iZFdyaXRlRW50cnkoMHgxRjhDLCAwLCAmYk5tdFN0YXRlLCAxKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZG8gd29yayB3aGljaCBtdXN0IGJlIGRvbmUgaW4gdGhhdCBzdGF0ZQorCXN3aXRjaCAoTm10U3RhdGVDaGFuZ2VfcC5tX05ld05tdFN0YXRlKSB7CisJCS8vIEVQTCBzdGFjayBpcyBub3QgcnVubmluZworCWNhc2Uga0VwbE5tdEdzT2ZmOgorCQlicmVhazsKKworCQkvLyBmaXJzdCBpbml0IG9mIHRoZSBoYXJkd2FyZQorCWNhc2Uga0VwbE5tdEdzSW5pdGlhbGlzaW5nOgorI2lmIDAKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPX1VEUCkpICE9IDApCisJCS8vIGNvbmZpZ3VyZSBTRE8gdmlhIFVEUCAoaS5lLiBiaW5kIGl0IHRvIHRoZSBFUEwgZXRoZXJuZXQgaW50ZXJmYWNlKQorCQlSZXQgPQorCQkgICAgRXBsU2RvVWRwdUNvbmZpZyhFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fZHdJcEFkZHJlc3MsCisJCQkJICAgICBFUExfQ19TRE9fRVBMX1BPUlQpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKyNlbmRpZgorI2VuZGlmCisKKwkJYnJlYWs7CisKKwkJLy8gaW5pdCBvZiB0aGUgbWFudWZhY3R1cmVyLXNwZWNpZmljIHByb2ZpbGUgYXJlYSBhbmQgdGhlCisJCS8vIHN0YW5kYXJkaXNlZCBkZXZpY2UgcHJvZmlsZSBhcmVhCisJY2FzZSBrRXBsTm10R3NSZXNldEFwcGxpY2F0aW9uOgorCQl7CisJCQkvLyByZXNldCBhcHBsaWNhdGlvbiBwYXJ0IG9mIE9ECisJCQlSZXQgPSBFcGxPYmRBY2Nlc3NPZFBhcnQoa0VwbE9iZFBhcnRBcHAsCisJCQkJCQkga0VwbE9iZERpckxvYWQpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCQkvLyBpbml0IG9mIHRoZSBjb21tdW5pY2F0aW9uIHByb2ZpbGUgYXJlYQorCWNhc2Uga0VwbE5tdEdzUmVzZXRDb21tdW5pY2F0aW9uOgorCQl7CisJCQkvLyByZXNldCBjb21tdW5pY2F0aW9uIHBhcnQgb2YgT0QKKwkJCVJldCA9IEVwbE9iZEFjY2Vzc09kUGFydChrRXBsT2JkUGFydEdlbiwKKwkJCQkJCSBrRXBsT2JkRGlyTG9hZCk7CisKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQkvLyAkJCQgZC5rLjogdXBkYXRlIE9EIG9ubHkgaWYgT0Qgd2FzIG5vdCBsb2FkZWQgZnJvbSBub24tdm9sYXRpbGUgbWVtb3J5CisJCQlSZXQgPSBFcGxBcGlVcGRhdGVPYmQoKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gYnVpbGQgdGhlIGNvbmZpZ3VyYXRpb24gd2l0aCBpbmZvcyBmcm9tIE9ECisJY2FzZSBrRXBsTm10R3NSZXNldENvbmZpZ3VyYXRpb246CisJCXsKKworCQkJUmV0ID0gRXBsQXBpVXBkYXRlRGxsQ29uZmlnKFRSVUUpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vIENOIHBhcnQgb2YgdGhlIHN0YXRlIG1hY2hpbmUKKworCQkvLyBub2RlIGxpc3RlIGZvciBFUEwtRnJhbWVzIGFuZCBjaGVjayB0aW1lb3V0CisJY2FzZSBrRXBsTm10Q3NOb3RBY3RpdmU6CisJCXsKKwkJCS8vIGluZGljYXRlIGNvbXBsZXRpb24gb2YgcmVzZXQgaW4gTk1UX1Jlc2V0Q21kX1U4CisJCQliTm10U3RhdGUgPSAoQllURSkga0VwbE5tdENtZEludmFsaWRTZXJ2aWNlOworCQkJUmV0ID0gRXBsT2JkV3JpdGVFbnRyeSgweDFGOUUsIDAsICZiTm10U3RhdGUsIDEpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCQkvLyBub2RlIHByb2Nlc3Mgb25seSBhc3luYyBmcmFtZXMKKwljYXNlIGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMToKKwkJeworCQkJYnJlYWs7CisJCX0KKworCQkvLyBub2RlIHByb2Nlc3MgaXNvY2hyb251cyBhbmQgYXN5bmNocm9udXMgZnJhbWVzCisJY2FzZSBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDI6CisJCXsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gbm9kZSBzaG91bGQgYmUgY29uZmlndXJlZCB1bmQgYXBwbGljYXRpb24gaXMgcmVhZHkKKwljYXNlIGtFcGxObXRDc1JlYWR5VG9PcGVyYXRlOgorCQl7CisJCQlicmVhazsKKwkJfQorCisJCS8vIG5vcm1hbCB3b3JrIHN0YXRlCisJY2FzZSBrRXBsTm10Q3NPcGVyYXRpb25hbDoKKwkJeworCQkJYnJlYWs7CisJCX0KKworCQkvLyBub2RlIHN0b3BwZWQgYnkgTU4KKwkJLy8gLT4gb25seSBwcm9jZXNzIGFzeW5jaHJvbnVzIGZyYW1lcworCWNhc2Uga0VwbE5tdENzU3RvcHBlZDoKKwkJeworCQkJYnJlYWs7CisJCX0KKworCQkvLyBubyBFUEwgY3ljbGUKKwkJLy8gLT4gbm9ybWFsIGV0aGVybmV0IGNvbW11bmljYXRpb24KKwljYXNlIGtFcGxObXRDc0Jhc2ljRXRoZXJuZXQ6CisJCXsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyBNTiBwYXJ0IG9mIHRoZSBzdGF0ZSBtYWNoaW5lCisKKwkJLy8gbm9kZSBsaXN0ZW5zIGZvciBFUEwtRnJhbWVzIGFuZCBjaGVjayB0aW1lb3V0CisJY2FzZSBrRXBsTm10TXNOb3RBY3RpdmU6CisJCXsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gbm9kZSBwcm9jZXNzZXMgb25seSBhc3luYyBmcmFtZXMKKwljYXNlIGtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMToKKwkJeworCQkJYnJlYWs7CisJCX0KKworCQkvLyBub2RlIHByb2Nlc3NlcyBpc29jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIGZyYW1lcworCWNhc2Uga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwyOgorCQl7CisJCQlicmVhazsKKwkJfQorCisJCS8vIG5vZGUgc2hvdWxkIGJlIGNvbmZpZ3VyZWQgdW5kIGFwcGxpY2F0aW9uIGlzIHJlYWR5CisJY2FzZSBrRXBsTm10TXNSZWFkeVRvT3BlcmF0ZToKKwkJeworCQkJYnJlYWs7CisJCX0KKworCQkvLyBub3JtYWwgd29yayBzdGF0ZQorCWNhc2Uga0VwbE5tdE1zT3BlcmF0aW9uYWw6CisJCXsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gbm8gRVBMIGN5Y2xlCisJCS8vIC0+IG5vcm1hbCBldGhlcm5ldCBjb21tdW5pY2F0aW9uCisJY2FzZSBrRXBsTm10TXNCYXNpY0V0aGVybmV0OgorCQl7CisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJeworCQkJVFJBQ0UwCisJCQkgICAgKCJFcGxBcGlDYk5tdFN0YXRlQ2hhbmdlKCk6IHVuaGFuZGxlZCBOTVQgc3RhdGVcbiIpOworCQl9CisJfQorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9MRURVKSkgIT0gMCkKKwkvLyBmb3J3YXJkIGV2ZW50IHRvIExlZCBtb2R1bGUKKwlSZXQgPSBFcGxMZWR1Q2JObXRTdGF0ZUNoYW5nZShObXRTdGF0ZUNoYW5nZV9wKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisjZW5kaWYKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCS8vIGZvcndhcmQgZXZlbnQgdG8gTm10TW4gbW9kdWxlCisJUmV0ID0gRXBsTm10TW51Q2JObXRTdGF0ZUNoYW5nZShObXRTdGF0ZUNoYW5nZV9wKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisjZW5kaWYKKworCS8vIGNhbGwgdXNlciBjYWxsYmFjaworCUV2ZW50QXJnLm1fTm10U3RhdGVDaGFuZ2UgPSBObXRTdGF0ZUNoYW5nZV9wOworCVJldCA9CisJICAgIEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0uCisJICAgIG1fcGZuQ2JFdmVudChrRXBsQXBpRXZlbnRObXRTdGF0ZUNoYW5nZSwgJkV2ZW50QXJnLAorCQkJIEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9wRXZlbnRVc2VyQXJnKTsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxBcGlVcGRhdGVEbGxDb25maWcKKy8vCisvLyBEZXNjcmlwdGlvbjogdXBkYXRlIGNvbmZpZ3VyYXRpb24gb2YgRExMCisvLworLy8gUGFyYW1ldGVyczogIGZVcGRhdGVJZGVudGl0eV9wICAgICAgID0gVFJVRSwgaWYgaWRlbnRpdHkgbXVzdCBiZSB1cGRhdGVkCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpVXBkYXRlRGxsQ29uZmlnKEJPT0wgZlVwZGF0ZUlkZW50aXR5X3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsRGxsQ29uZmlnUGFyYW0gRGxsQ29uZmlnUGFyYW07CisJdEVwbERsbElkZW50UGFyYW0gRGxsSWRlbnRQYXJhbTsKKwl0RXBsT2JkU2l6ZSBPYmRTaXplOworCVdPUkQgd1RlbXA7CisJQllURSBiVGVtcDsKKworCS8vIGNvbmZpZ3VyZSBEbGwKKwlFUExfTUVNU0VUKCZEbGxDb25maWdQYXJhbSwgMCwgc2l6ZW9mKERsbENvbmZpZ1BhcmFtKSk7CisJRGxsQ29uZmlnUGFyYW0ubV91aU5vZGVJZCA9IEVwbE9iZEdldE5vZGVJZCgpOworCisJLy8gQ3ljbGUgTGVuZ3RoICgweDEwMDY6IE5NVF9DeWNsZUxlbl9VMzIpIGluIFt1c10KKwlPYmRTaXplID0gNDsKKwlSZXQgPQorCSAgICBFcGxPYmRSZWFkRW50cnkoMHgxMDA2LCAwLCAmRGxsQ29uZmlnUGFyYW0ubV9kd0N5Y2xlTGVuLCAmT2JkU2l6ZSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCS8vIDB4MUY4MjogTk1UX0ZlYXR1cmVGbGFnc19VMzIKKwlPYmRTaXplID0gNDsKKwlSZXQgPQorCSAgICBFcGxPYmRSZWFkRW50cnkoMHgxRjgyLCAwLCAmRGxsQ29uZmlnUGFyYW0ubV9kd0ZlYXR1cmVGbGFncywKKwkJCSAgICAmT2JkU2l6ZSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGQuay4gVGhlcmUgaXMgbm8gZGVwZW5kYW5jZSBiZXR3ZWVuIEZlYXR1cmVGbGFncyBhbmQgYXN5bmMtb25seSBDTgorCURsbENvbmZpZ1BhcmFtLm1fZkFzeW5jT25seSA9IEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9mQXN5bmNPbmx5OworCisJLy8gMHgxQzE0OiBETExfTG9zc09mRnJhbWVUb2xlcmFuY2VfVTMyIGluIFtuc10KKwlPYmRTaXplID0gNDsKKwlSZXQgPQorCSAgICBFcGxPYmRSZWFkRW50cnkoMHgxQzE0LCAwLCAmRGxsQ29uZmlnUGFyYW0ubV9kd0xvc3NPZkZyYW1lVG9sZXJhbmNlLAorCQkJICAgICZPYmRTaXplKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gMHgxRjk4OiBOTVRfQ3ljbGVUaW1pbmdfUkVDCisJLy8gMHgxRjk4LjE6IElzb2NoclR4TWF4UGF5bG9hZF9VMTYKKwlPYmRTaXplID0gMjsKKwlSZXQgPSBFcGxPYmRSZWFkRW50cnkoMHgxRjk4LCAxLCAmd1RlbXAsICZPYmRTaXplKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJRGxsQ29uZmlnUGFyYW0ubV91aUlzb2NoclR4TWF4UGF5bG9hZCA9IHdUZW1wOworCisJLy8gMHgxRjk4LjI6IElzb2NoclJ4TWF4UGF5bG9hZF9VMTYKKwlPYmRTaXplID0gMjsKKwlSZXQgPSBFcGxPYmRSZWFkRW50cnkoMHgxRjk4LCAyLCAmd1RlbXAsICZPYmRTaXplKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJRGxsQ29uZmlnUGFyYW0ubV91aUlzb2NoclJ4TWF4UGF5bG9hZCA9IHdUZW1wOworCisJLy8gMHgxRjk4LjM6IFBSZXNNYXhMYXRlbmN5X1UzMgorCU9iZFNpemUgPSA0OworCVJldCA9CisJICAgIEVwbE9iZFJlYWRFbnRyeSgweDFGOTgsIDMsICZEbGxDb25maWdQYXJhbS5tX2R3UHJlc01heExhdGVuY3ksCisJCQkgICAgJk9iZFNpemUpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyAweDFGOTguNDogUFJlcUFjdFBheWxvYWRMaW1pdF9VMTYKKwlPYmRTaXplID0gMjsKKwlSZXQgPSBFcGxPYmRSZWFkRW50cnkoMHgxRjk4LCA0LCAmd1RlbXAsICZPYmRTaXplKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJRGxsQ29uZmlnUGFyYW0ubV91aVByZXFBY3RQYXlsb2FkTGltaXQgPSB3VGVtcDsKKworCS8vIDB4MUY5OC41OiBQUmVzQWN0UGF5bG9hZExpbWl0X1UxNgorCU9iZFNpemUgPSAyOworCVJldCA9IEVwbE9iZFJlYWRFbnRyeSgweDFGOTgsIDUsICZ3VGVtcCwgJk9iZFNpemUpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwlEbGxDb25maWdQYXJhbS5tX3VpUHJlc0FjdFBheWxvYWRMaW1pdCA9IHdUZW1wOworCisJLy8gMHgxRjk4LjY6IEFTbmRNYXhMYXRlbmN5X1UzMgorCU9iZFNpemUgPSA0OworCVJldCA9CisJICAgIEVwbE9iZFJlYWRFbnRyeSgweDFGOTgsIDYsICZEbGxDb25maWdQYXJhbS5tX2R3QXNuZE1heExhdGVuY3ksCisJCQkgICAgJk9iZFNpemUpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyAweDFGOTguNzogTXVsdGlwbEN5Y2xlQ250X1U4CisJT2JkU2l6ZSA9IDE7CisJUmV0ID0gRXBsT2JkUmVhZEVudHJ5KDB4MUY5OCwgNywgJmJUZW1wLCAmT2JkU2l6ZSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCURsbENvbmZpZ1BhcmFtLm1fdWlNdWx0aXBsQ3ljbGVDbnQgPSBiVGVtcDsKKworCS8vIDB4MUY5OC44OiBBc3luY01UVV9VMTYKKwlPYmRTaXplID0gMjsKKwlSZXQgPSBFcGxPYmRSZWFkRW50cnkoMHgxRjk4LCA4LCAmd1RlbXAsICZPYmRTaXplKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJRGxsQ29uZmlnUGFyYW0ubV91aUFzeW5jTXR1ID0gd1RlbXA7CisKKwkvLyAkJCQgUHJlc2NhbGVyCisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwkvLyAweDFGOEEuMTogV2FpdFNvQ1BSZXFfVTMyIGluIFtuc10KKwlPYmRTaXplID0gNDsKKwlSZXQgPQorCSAgICBFcGxPYmRSZWFkRW50cnkoMHgxRjhBLCAxLCAmRGxsQ29uZmlnUGFyYW0ubV9kd1dhaXRTb2NQcmVxLAorCQkJICAgICZPYmRTaXplKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gMHgxRjhBLjI6IEFzeW5jU2xvdFRpbWVvdXRfVTMyIGluIFtuc10gKG9wdGlvbmFsKQorCU9iZFNpemUgPSA0OworCVJldCA9CisJICAgIEVwbE9iZFJlYWRFbnRyeSgweDFGOEEsIDIsICZEbGxDb25maWdQYXJhbS5tX2R3QXN5bmNTbG90VGltZW91dCwKKwkJCSAgICAmT2JkU2l6ZSk7CisvKiAgICBpZihSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisgICAgeworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfSovCisjZW5kaWYKKworCURsbENvbmZpZ1BhcmFtLm1fdWlTaXplT2ZTdHJ1Y3QgPSBzaXplb2YoRGxsQ29uZmlnUGFyYW0pOworCVJldCA9IEVwbERsbGtDb25maWcoJkRsbENvbmZpZ1BhcmFtKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAoZlVwZGF0ZUlkZW50aXR5X3AgIT0gRkFMU0UpIHsKKwkJLy8gY29uZmlndXJlIElkZW50aXR5CisJCUVQTF9NRU1TRVQoJkRsbElkZW50UGFyYW0sIDAsIHNpemVvZihEbGxJZGVudFBhcmFtKSk7CisJCU9iZFNpemUgPSA0OworCQlSZXQgPQorCQkgICAgRXBsT2JkUmVhZEVudHJ5KDB4MTAwMCwgMCwgJkRsbElkZW50UGFyYW0ubV9kd0RldmljZVR5cGUsCisJCQkJICAgICZPYmRTaXplKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisKKwkJT2JkU2l6ZSA9IDQ7CisJCVJldCA9CisJCSAgICBFcGxPYmRSZWFkRW50cnkoMHgxMDE4LCAxLCAmRGxsSWRlbnRQYXJhbS5tX2R3VmVuZG9ySWQsCisJCQkJICAgICZPYmRTaXplKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisJCU9iZFNpemUgPSA0OworCQlSZXQgPQorCQkgICAgRXBsT2JkUmVhZEVudHJ5KDB4MTAxOCwgMiwgJkRsbElkZW50UGFyYW0ubV9kd1Byb2R1Y3RDb2RlLAorCQkJCSAgICAmT2JkU2l6ZSk7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQlPYmRTaXplID0gNDsKKwkJUmV0ID0KKwkJICAgIEVwbE9iZFJlYWRFbnRyeSgweDEwMTgsIDMsCisJCQkJICAgICZEbGxJZGVudFBhcmFtLm1fZHdSZXZpc2lvbk51bWJlciwKKwkJCQkgICAgJk9iZFNpemUpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJT2JkU2l6ZSA9IDQ7CisJCVJldCA9CisJCSAgICBFcGxPYmRSZWFkRW50cnkoMHgxMDE4LCA0LCAmRGxsSWRlbnRQYXJhbS5tX2R3U2VyaWFsTnVtYmVyLAorCQkJCSAgICAmT2JkU2l6ZSk7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCisJCURsbElkZW50UGFyYW0ubV9kd0lwQWRkcmVzcyA9CisJCSAgICBFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fZHdJcEFkZHJlc3M7CisJCURsbElkZW50UGFyYW0ubV9kd1N1Ym5ldE1hc2sgPQorCQkgICAgRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX2R3U3VibmV0TWFzazsKKwkJRVBMX01FTUNQWShEbGxJZGVudFBhcmFtLm1fc0hvc3RuYW1lLAorCQkJICAgRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3NIb3N0bmFtZSwKKwkJCSAgIHNpemVvZihEbGxJZGVudFBhcmFtLm1fc0hvc3RuYW1lKSk7CisKKwkJT2JkU2l6ZSA9IDQ7CisJCVJldCA9CisJCSAgICBFcGxPYmRSZWFkRW50cnkoMHgxMDIwLCAxLAorCQkJCSAgICAmRGxsSWRlbnRQYXJhbS5tX2R3VmVyaWZ5Q29uZmlndXJhdGlvbkRhdGUsCisJCQkJICAgICZPYmRTaXplKTsKKwkJLy8gaWdub3JlIGFueSBlcnJvciwgYmVjYXVzZSB0aGlzIG9iamVjdCBpcyBvcHRpb25hbAorCisJCU9iZFNpemUgPSA0OworCQlSZXQgPQorCQkgICAgRXBsT2JkUmVhZEVudHJ5KDB4MTAyMCwgMiwKKwkJCQkgICAgJkRsbElkZW50UGFyYW0ubV9kd1ZlcmlmeUNvbmZpZ3VyYXRpb25UaW1lLAorCQkJCSAgICAmT2JkU2l6ZSk7CisJCS8vIGlnbm9yZSBhbnkgZXJyb3IsIGJlY2F1c2UgdGhpcyBvYmplY3QgaXMgb3B0aW9uYWwKKworCQkvLyAkJCQgZC5rLjogZmlsbCByZXN0IG9mIGlkZW50IHN0cnVjdHVyZQorCisJCURsbElkZW50UGFyYW0ubV91aVNpemVPZlN0cnVjdCA9IHNpemVvZihEbGxJZGVudFBhcmFtKTsKKwkJUmV0ID0gRXBsRGxsa1NldElkZW50aXR5KCZEbGxJZGVudFBhcmFtKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEFwaVVwZGF0ZU9iZAorLy8KKy8vIERlc2NyaXB0aW9uOiB1cGRhdGUgT0QgZnJvbSBpbml0IHBhcmFtCisvLworLy8gUGFyYW1ldGVyczogIChub25lKQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbEFwaVVwZGF0ZU9iZCh2b2lkKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJV09SRCB3VGVtcDsKKwlCWVRFIGJUZW1wOworCisJLy8gc2V0IG5vZGUgaWQgaW4gT0QKKwlSZXQgPSBFcGxPYmRTZXROb2RlSWQoRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3VpTm9kZUlkLAkvLyBub2RlIGlkCisJCQkgICAgICBrRXBsT2JkTm9kZUlkSGFyZHdhcmUpOwkvLyBzZXQgYnkgaGFyZHdhcmUKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAoRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX2R3Q3ljbGVMZW4gIT0gLTEpIHsKKwkJUmV0ID0KKwkJICAgIEVwbE9iZFdyaXRlRW50cnkoMHgxMDA2LCAwLAorCQkJCSAgICAgJkVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9kd0N5Y2xlTGVuLAorCQkJCSAgICAgNCk7CisvKiAgICBpZihSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisgICAgeworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfSovCisJfQorCisJaWYgKEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9kd0xvc3NPZkZyYW1lVG9sZXJhbmNlICE9IC0xKSB7CisJCVJldCA9CisJCSAgICBFcGxPYmRXcml0ZUVudHJ5KDB4MUMxNCwgMCwKKwkJCQkgICAgICZFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLgorCQkJCSAgICAgbV9kd0xvc3NPZkZyYW1lVG9sZXJhbmNlLCA0KTsKKwkJLyogICAgICAgIGlmKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkKKwkJICAgeworCQkgICBnb3RvIEV4aXQ7CisJCSAgIH0gKi8KKwl9CisJLy8gZC5rLiBUaGVyZSBpcyBubyBkZXBlbmRhbmNlIGJldHdlZW4gRmVhdHVyZUZsYWdzIGFuZCBhc3luYy1vbmx5IENOLgorCWlmIChFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fZHdGZWF0dXJlRmxhZ3MgIT0gLTEpIHsKKwkJUmV0ID0KKwkJICAgIEVwbE9iZFdyaXRlRW50cnkoMHgxRjgyLCAwLAorCQkJCSAgICAgJkVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0uCisJCQkJICAgICBtX2R3RmVhdHVyZUZsYWdzLCA0KTsKKwkJLyogICAgaWYoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorCQkgICB7CisJCSAgIGdvdG8gRXhpdDsKKwkJICAgfSAqLworCX0KKworCXdUZW1wID0gKFdPUkQpIEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV91aUlzb2NoclR4TWF4UGF5bG9hZDsKKwlSZXQgPSBFcGxPYmRXcml0ZUVudHJ5KDB4MUY5OCwgMSwgJndUZW1wLCAyKTsKKy8qICAgIGlmKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkKKyAgICB7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9Ki8KKworCXdUZW1wID0gKFdPUkQpIEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV91aUlzb2NoclJ4TWF4UGF5bG9hZDsKKwlSZXQgPSBFcGxPYmRXcml0ZUVudHJ5KDB4MUY5OCwgMiwgJndUZW1wLCAyKTsKKy8qICAgIGlmKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkKKyAgICB7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9Ki8KKworCVJldCA9CisJICAgIEVwbE9iZFdyaXRlRW50cnkoMHgxRjk4LCAzLAorCQkJICAgICAmRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX2R3UHJlc01heExhdGVuY3ksCisJCQkgICAgIDQpOworLyogICAgaWYoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorICAgIHsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0qLworCisJaWYgKEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV91aVByZXFBY3RQYXlsb2FkTGltaXQgPD0KKwkgICAgRVBMX0NfRExMX0lTT0NIUl9NQVhfUEFZTCkgeworCQl3VGVtcCA9CisJCSAgICAoV09SRCkgRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3VpUHJlcUFjdFBheWxvYWRMaW1pdDsKKwkJUmV0ID0gRXBsT2JkV3JpdGVFbnRyeSgweDFGOTgsIDQsICZ3VGVtcCwgMik7CisvKiAgICBpZihSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisgICAgeworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfSovCisJfQorCisJaWYgKEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV91aVByZXNBY3RQYXlsb2FkTGltaXQgPD0KKwkgICAgRVBMX0NfRExMX0lTT0NIUl9NQVhfUEFZTCkgeworCQl3VGVtcCA9CisJCSAgICAoV09SRCkgRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3VpUHJlc0FjdFBheWxvYWRMaW1pdDsKKwkJUmV0ID0gRXBsT2JkV3JpdGVFbnRyeSgweDFGOTgsIDUsICZ3VGVtcCwgMik7CisvKiAgICBpZihSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisgICAgeworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfSovCisJfQorCisJUmV0ID0KKwkgICAgRXBsT2JkV3JpdGVFbnRyeSgweDFGOTgsIDYsCisJCQkgICAgICZFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fZHdBc25kTWF4TGF0ZW5jeSwKKwkJCSAgICAgNCk7CisvKiAgICBpZihSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisgICAgeworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfSovCisKKwlpZiAoRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3VpTXVsdGlwbEN5Y2xlQ250IDw9IDB4RkYpIHsKKwkJYlRlbXAgPSAoQllURSkgRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3VpTXVsdGlwbEN5Y2xlQ250OworCQlSZXQgPSBFcGxPYmRXcml0ZUVudHJ5KDB4MUY5OCwgNywgJmJUZW1wLCAxKTsKKy8qICAgIGlmKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkKKyAgICB7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9Ki8KKwl9CisKKwlpZiAoRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3VpQXN5bmNNdHUgPD0KKwkgICAgRVBMX0NfRExMX01BWF9BU1lOQ19NVFUpIHsKKwkJd1RlbXAgPSAoV09SRCkgRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3VpQXN5bmNNdHU7CisJCVJldCA9IEVwbE9iZFdyaXRlRW50cnkoMHgxRjk4LCA4LCAmd1RlbXAsIDIpOworLyogICAgaWYoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorICAgIHsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0qLworCX0KKworCWlmIChFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fdWlQcmVzY2FsZXIgPD0gMTAwMCkgeworCQl3VGVtcCA9IChXT1JEKSBFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fdWlQcmVzY2FsZXI7CisJCVJldCA9IEVwbE9iZFdyaXRlRW50cnkoMHgxRjk4LCA5LCAmd1RlbXAsIDIpOworCQkvLyBpZ25vcmUgcmV0dXJuIGNvZGUKKwkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJfQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCWlmIChFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fZHdXYWl0U29jUHJlcSAhPSAtMSkgeworCQlSZXQgPQorCQkgICAgRXBsT2JkV3JpdGVFbnRyeSgweDFGOEEsIDEsCisJCQkJICAgICAmRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS4KKwkJCQkgICAgIG1fZHdXYWl0U29jUHJlcSwgNCk7CisJCS8qICAgICAgICBpZihSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisJCSAgIHsKKwkJICAgZ290byBFeGl0OworCQkgICB9ICovCisJfQorCisJaWYgKChFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fZHdBc3luY1Nsb3RUaW1lb3V0ICE9IDApCisJICAgICYmIChFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fZHdBc3luY1Nsb3RUaW1lb3V0ICE9IC0xKSkgeworCQlSZXQgPQorCQkgICAgRXBsT2JkV3JpdGVFbnRyeSgweDFGOEEsIDIsCisJCQkJICAgICAmRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS4KKwkJCQkgICAgIG1fZHdBc3luY1Nsb3RUaW1lb3V0LCA0KTsKKwkJLyogICAgICAgIGlmKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkKKwkJICAgeworCQkgICBnb3RvIEV4aXQ7CisJCSAgIH0gKi8KKwl9CisjZW5kaWYKKworCS8vIGNvbmZpZ3VyZSBJZGVudGl0eQorCWlmIChFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fZHdEZXZpY2VUeXBlICE9IC0xKSB7CisJCVJldCA9CisJCSAgICBFcGxPYmRXcml0ZUVudHJ5KDB4MTAwMCwgMCwKKwkJCQkgICAgICZFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLgorCQkJCSAgICAgbV9kd0RldmljZVR5cGUsIDQpOworLyogICAgICAgIGlmKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICB9Ki8KKwl9CisKKwlpZiAoRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX2R3VmVuZG9ySWQgIT0gLTEpIHsKKwkJUmV0ID0KKwkJICAgIEVwbE9iZFdyaXRlRW50cnkoMHgxMDE4LCAxLAorCQkJCSAgICAgJkVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9kd1ZlbmRvcklkLAorCQkJCSAgICAgNCk7CisvKiAgICAgICAgaWYoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0qLworCX0KKworCWlmIChFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fZHdQcm9kdWN0Q29kZSAhPSAtMSkgeworCQlSZXQgPQorCQkgICAgRXBsT2JkV3JpdGVFbnRyeSgweDEwMTgsIDIsCisJCQkJICAgICAmRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS4KKwkJCQkgICAgIG1fZHdQcm9kdWN0Q29kZSwgNCk7CisvKiAgICAgICAgaWYoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0qLworCX0KKworCWlmIChFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fZHdSZXZpc2lvbk51bWJlciAhPSAtMSkgeworCQlSZXQgPQorCQkgICAgRXBsT2JkV3JpdGVFbnRyeSgweDEwMTgsIDMsCisJCQkJICAgICAmRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS4KKwkJCQkgICAgIG1fZHdSZXZpc2lvbk51bWJlciwgNCk7CisvKiAgICAgICAgaWYoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0qLworCX0KKworCWlmIChFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fZHdTZXJpYWxOdW1iZXIgIT0gLTEpIHsKKwkJUmV0ID0KKwkJICAgIEVwbE9iZFdyaXRlRW50cnkoMHgxMDE4LCA0LAorCQkJCSAgICAgJkVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0uCisJCQkJICAgICBtX2R3U2VyaWFsTnVtYmVyLCA0KTsKKy8qICAgICAgICBpZihSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgfSovCisJfQorCisJaWYgKEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9wc3pEZXZOYW1lICE9IE5VTEwpIHsKKwkJLy8gd3JpdGUgRGV2aWNlIE5hbWUgKDB4MTAwOCkKKwkJUmV0ID0KKwkJICAgIEVwbE9iZFdyaXRlRW50cnkoMHgxMDA4LCAwLAorCQkJCSAgICAgKHZvaWQgR0VORVJJQyAqKUVwbEFwaUluc3RhbmNlX2cuCisJCQkJICAgICBtX0luaXRQYXJhbS5tX3BzekRldk5hbWUsCisJCQkJICAgICAodEVwbE9iZFNpemUpIHN0cmxlbihFcGxBcGlJbnN0YW5jZV9nLgorCQkJCQkJCSAgbV9Jbml0UGFyYW0uCisJCQkJCQkJICBtX3BzekRldk5hbWUpKTsKKy8qICAgICAgICBpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0qLworCX0KKworCWlmIChFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fcHN6SHdWZXJzaW9uICE9IE5VTEwpIHsKKwkJLy8gd3JpdGUgSGFyZHdhcmUgdmVyc2lvbiAoMHgxMDA5KQorCQlSZXQgPQorCQkgICAgRXBsT2JkV3JpdGVFbnRyeSgweDEwMDksIDAsCisJCQkJICAgICAodm9pZCBHRU5FUklDICopRXBsQXBpSW5zdGFuY2VfZy4KKwkJCQkgICAgIG1fSW5pdFBhcmFtLm1fcHN6SHdWZXJzaW9uLAorCQkJCSAgICAgKHRFcGxPYmRTaXplKSBzdHJsZW4oRXBsQXBpSW5zdGFuY2VfZy4KKwkJCQkJCQkgIG1fSW5pdFBhcmFtLgorCQkJCQkJCSAgbV9wc3pId1ZlcnNpb24pKTsKKy8qICAgICAgICBpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0qLworCX0KKworCWlmIChFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fcHN6U3dWZXJzaW9uICE9IE5VTEwpIHsKKwkJLy8gd3JpdGUgU29mdHdhcmUgdmVyc2lvbiAoMHgxMDBBKQorCQlSZXQgPQorCQkgICAgRXBsT2JkV3JpdGVFbnRyeSgweDEwMEEsIDAsCisJCQkJICAgICAodm9pZCBHRU5FUklDICopRXBsQXBpSW5zdGFuY2VfZy4KKwkJCQkgICAgIG1fSW5pdFBhcmFtLm1fcHN6U3dWZXJzaW9uLAorCQkJCSAgICAgKHRFcGxPYmRTaXplKSBzdHJsZW4oRXBsQXBpSW5zdGFuY2VfZy4KKwkJCQkJCQkgIG1fSW5pdFBhcmFtLgorCQkJCQkJCSAgbV9wc3pTd1ZlcnNpb24pKTsKKy8qICAgICAgICBpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0qLworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxBcGlDYlNkb0NvbgorLy8KKy8vIERlc2NyaXB0aW9uOiBjYWxsYmFjayBmdW5jdGlvbiBmb3IgU0RPIHRyYW5zZmVycworLy8KKy8vIFBhcmFtZXRlcnM6ICBwU2RvQ29tRmluaXNoZWRfcCAgICAgICA9IFNETyBwYXJhbWV0ZXIKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET0MpKSAhPSAwKQorc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbEFwaUNiU2RvQ29uKHRFcGxTZG9Db21GaW5pc2hlZCAqIHBTZG9Db21GaW5pc2hlZF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxBcGlFdmVudEFyZyBFdmVudEFyZzsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gY2FsbCB1c2VyIGNhbGxiYWNrCisJRXZlbnRBcmcubV9TZG8gPSAqcFNkb0NvbUZpbmlzaGVkX3A7CisJUmV0ID0gRXBsQXBpSW5zdGFuY2VfZy5tX0luaXRQYXJhbS5tX3BmbkNiRXZlbnQoa0VwbEFwaUV2ZW50U2RvLAorCQkJCQkJCSZFdmVudEFyZywKKwkJCQkJCQlFcGxBcGlJbnN0YW5jZV9nLgorCQkJCQkJCW1fSW5pdFBhcmFtLgorCQkJCQkJCW1fcEV2ZW50VXNlckFyZyk7CisKKwlyZXR1cm4gUmV0OworCit9CisjZW5kaWYKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsQXBpQ2JOb2RlRXZlbnQKKy8vCisvLyBEZXNjcmlwdGlvbjogY2FsbGJhY2sgZnVuY3Rpb24gZm9yIG5vZGUgZXZlbnRzCisvLworLy8gUGFyYW1ldGVyczogIHVpTm9kZUlkX3AgICAgICAgICAgICAgID0gbm9kZSBJRCBvZiB0aGUgQ04KKy8vICAgICAgICAgICAgICBOb2RlRXZlbnRfcCAgICAgICAgICAgICA9IGV2ZW50IGZyb20gdGhlIHNwZWNpZmllZCBDTgorLy8gICAgICAgICAgICAgIE5tdFN0YXRlX3AgICAgICAgICAgICAgID0gY3VycmVudCBOTVQgc3RhdGUgb2YgdGhlIENOCisvLyAgICAgICAgICAgICAgd0Vycm9yQ29kZV9wICAgICAgICAgICAgPSBFUEwgZXJyb3IgY29kZSBpZiBOb2RlRXZlbnRfcD09a0VwbE5tdE5vZGVFdmVudEVycm9yCisvLyAgICAgICAgICAgICAgZk1hbmRhdG9yeV9wICAgICAgICAgICAgPSBmbGFnIGlmIENOIGlzIG1hbmRhdG9yeQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbEFwaUNiTm9kZUV2ZW50KHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkgICB0RXBsTm10Tm9kZUV2ZW50IE5vZGVFdmVudF9wLAorCQkJCQkgICB0RXBsTm10U3RhdGUgTm10U3RhdGVfcCwKKwkJCQkJICAgV09SRCB3RXJyb3JDb2RlX3AsIEJPT0wgZk1hbmRhdG9yeV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxBcGlFdmVudEFyZyBFdmVudEFyZzsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gY2FsbCB1c2VyIGNhbGxiYWNrCisJRXZlbnRBcmcubV9Ob2RlLm1fdWlOb2RlSWQgPSB1aU5vZGVJZF9wOworCUV2ZW50QXJnLm1fTm9kZS5tX05vZGVFdmVudCA9IE5vZGVFdmVudF9wOworCUV2ZW50QXJnLm1fTm9kZS5tX05tdFN0YXRlID0gTm10U3RhdGVfcDsKKwlFdmVudEFyZy5tX05vZGUubV93RXJyb3JDb2RlID0gd0Vycm9yQ29kZV9wOworCUV2ZW50QXJnLm1fTm9kZS5tX2ZNYW5kYXRvcnkgPSBmTWFuZGF0b3J5X3A7CisKKwlSZXQgPSBFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fcGZuQ2JFdmVudChrRXBsQXBpRXZlbnROb2RlLAorCQkJCQkJCSZFdmVudEFyZywKKwkJCQkJCQlFcGxBcGlJbnN0YW5jZV9nLgorCQkJCQkJCW1fSW5pdFBhcmFtLgorCQkJCQkJCW1fcEV2ZW50VXNlckFyZyk7CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEFwaUNiQm9vdEV2ZW50CisvLworLy8gRGVzY3JpcHRpb246IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBib290IGV2ZW50cworLy8KKy8vIFBhcmFtZXRlcnM6ICBCb290RXZlbnRfcCAgICAgICAgICAgICA9IGV2ZW50IGZyb20gdGhlIGJvb3QtdXAgcHJvY2VzcworLy8gICAgICAgICAgICAgIE5tdFN0YXRlX3AgICAgICAgICAgICAgID0gY3VycmVudCBsb2NhbCBOTVQgc3RhdGUKKy8vICAgICAgICAgICAgICB3RXJyb3JDb2RlX3AgICAgICAgICAgICA9IEVQTCBlcnJvciBjb2RlIGlmIEJvb3RFdmVudF9wPT1rRXBsTm10Qm9vdEV2ZW50RXJyb3IKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlDYkJvb3RFdmVudCh0RXBsTm10Qm9vdEV2ZW50IEJvb3RFdmVudF9wLAorCQkJCQkgICB0RXBsTm10U3RhdGUgTm10U3RhdGVfcCwKKwkJCQkJICAgV09SRCB3RXJyb3JDb2RlX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbEFwaUV2ZW50QXJnIEV2ZW50QXJnOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBjYWxsIHVzZXIgY2FsbGJhY2sKKwlFdmVudEFyZy5tX0Jvb3QubV9Cb290RXZlbnQgPSBCb290RXZlbnRfcDsKKwlFdmVudEFyZy5tX0Jvb3QubV9ObXRTdGF0ZSA9IE5tdFN0YXRlX3A7CisJRXZlbnRBcmcubV9Cb290Lm1fd0Vycm9yQ29kZSA9IHdFcnJvckNvZGVfcDsKKworCVJldCA9IEVwbEFwaUluc3RhbmNlX2cubV9Jbml0UGFyYW0ubV9wZm5DYkV2ZW50KGtFcGxBcGlFdmVudEJvb3QsCisJCQkJCQkJJkV2ZW50QXJnLAorCQkJCQkJCUVwbEFwaUluc3RhbmNlX2cuCisJCQkJCQkJbV9Jbml0UGFyYW0uCisJCQkJCQkJbV9wRXZlbnRVc2VyQXJnKTsKKworCXJldHVybiBSZXQ7CisKK30KKworI2VuZGlmIC8vICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTEVEVSkpICE9IDApCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEFwaUNiTGVkU3RhdGVDaGFuZ2UKKy8vCisvLyBEZXNjcmlwdGlvbjogY2FsbGJhY2sgZnVuY3Rpb24gZm9yIExFRCBjaGFuZ2UgZXZlbnRzLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBMZWRUeXBlX3AgICAgICAgPSB0eXBlIG9mIExFRAorLy8gICAgICAgICAgICAgIGZPbl9wICAgICAgICAgICA9IHN0YXRlIG9mIExFRAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgPSBlcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpQ2JMZWRTdGF0ZUNoYW5nZSh0RXBsTGVkVHlwZSBMZWRUeXBlX3AsCisJCQkJCQlCT09MIGZPbl9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxBcGlFdmVudEFyZyBFdmVudEFyZzsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gY2FsbCB1c2VyIGNhbGxiYWNrCisJRXZlbnRBcmcubV9MZWQubV9MZWRUeXBlID0gTGVkVHlwZV9wOworCUV2ZW50QXJnLm1fTGVkLm1fZk9uID0gZk9uX3A7CisKKwlSZXQgPSBFcGxBcGlJbnN0YW5jZV9nLm1fSW5pdFBhcmFtLm1fcGZuQ2JFdmVudChrRXBsQXBpRXZlbnRMZWQsCisJCQkJCQkJJkV2ZW50QXJnLAorCQkJCQkJCUVwbEFwaUluc3RhbmNlX2cuCisJCQkJCQkJbV9Jbml0UGFyYW0uCisJCQkJCQkJbV9wRXZlbnRVc2VyQXJnKTsKKworCXJldHVybiBSZXQ7CisKK30KKworI2VuZGlmCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxBcGlMaW51eC5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxBcGlMaW51eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyY2QxMjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEFwaUxpbnV4LmgKQEAgLTAsMCArMSwxNDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIEVQTCBBUEkgbGF5ZXIgZm9yIExpbnV4IChrZXJuZWwgYW5kIHVzZXIgc3BhY2UpCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsQXBpTGludXguaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwOC8wOC8yNSAxMjoxNzo0MSAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICBLRUlMIHVWaXNpb24gMgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMTAvMTEgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExfQVBJX0xJTlVYX0hfCisjZGVmaW5lIF9FUExfQVBJX0xJTlVYX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEVQTExJTl9ERVZfTkFNRSAgICAgImVwbCIJLy8gdXNlZCBmb3IgIi9kZXYiIGFuZCAiL3Byb2MiIGVudHJ5CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgQ29tbWFuZHMgZm9yIDxpb2N0bD4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgRVBMTElOX0NNRF9JTklUSUFMSVpFICAgICAgICAgICAgICAgMAkvLyB1bEFyZ19wIH4gdEVwbEFwaUluaXRQYXJhbSoKKyNkZWZpbmUgRVBMTElOX0NNRF9QSV9JTiAgICAgICAgICAgICAgICAgICAgMQkvLyB1bEFyZ19wIH4gdEVwbEFwaVByb2Nlc3NJbWFnZSoKKyNkZWZpbmUgRVBMTElOX0NNRF9QSV9PVVQgICAgICAgICAgICAgICAgICAgMgkvLyB1bEFyZ19wIH4gdEVwbEFwaVByb2Nlc3NJbWFnZSoKKyNkZWZpbmUgRVBMTElOX0NNRF9XUklURV9PQkpFQ1QgICAgICAgICAgICAgMwkvLyB1bEFyZ19wIH4gdEVwbExpblNkb09iamVjdCoKKyNkZWZpbmUgRVBMTElOX0NNRF9SRUFEX09CSkVDVCAgICAgICAgICAgICAgNAkvLyB1bEFyZ19wIH4gdEVwbExpblNkb09iamVjdCoKKyNkZWZpbmUgRVBMTElOX0NNRF9XUklURV9MT0NBTF9PQkpFQ1QgICAgICAgNQkvLyB1bEFyZ19wIH4gdEVwbExpbkxvY2FsT2JqZWN0KgorI2RlZmluZSBFUExMSU5fQ01EX1JFQURfTE9DQUxfT0JKRUNUICAgICAgICA2CS8vIHVsQXJnX3AgfiB0RXBsTGluTG9jYWxPYmplY3QqCisjZGVmaW5lIEVQTExJTl9DTURfRlJFRV9TRE9fQ0hBTk5FTCAgICAgICAgIDcJLy8gdWxBcmdfcCB+IHRFcGxTZG9Db21Db25IZGwKKyNkZWZpbmUgRVBMTElOX0NNRF9OTVRfQ09NTUFORCAgICAgICAgICAgICAgOAkvLyB1bEFyZ19wIH4gdEVwbE5tdEV2ZW50CisjZGVmaW5lIEVQTExJTl9DTURfR0VUX0VWRU5UICAgICAgICAgICAgICAgIDkJLy8gdWxBcmdfcCB+IHRFcGxMaW5FdmVudCoKKyNkZWZpbmUgRVBMTElOX0NNRF9NTl9UUklHR0VSX1NUQVRFX0NIQU5HRSAxMAkvLyB1bEFyZ19wIH4gdEVwbExpbk5vZGVDbWRPYmplY3QqCisjZGVmaW5lIEVQTExJTl9DTURfUElfU0VUVVAgICAgICAgICAgICAgICAgMTEJLy8gdWxBcmdfcCB+IDAKKyNkZWZpbmUgRVBMTElOX0NNRF9TSFVURE9XTiAgICAgICAgICAgICAgICAxMgkvLyB1bEFyZ19wIH4gMAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBtX3VpRXZlbnRBcmdTaXplOworCXRFcGxBcGlFdmVudEFyZyAqbV9wRXZlbnRBcmc7CisJdEVwbEFwaUV2ZW50VHlwZSAqbV9wRXZlbnRUeXBlOworCXRFcGxLZXJuZWwgbV9SZXRDYkV2ZW50OworCit9IHRFcGxMaW5FdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxTZG9Db21Db25IZGwgbV9TZG9Db21Db25IZGw7CisJQk9PTCBtX2ZWYWxpZFNkb0NvbUNvbkhkbDsKKwl1bnNpZ25lZCBpbnQgbV91aU5vZGVJZDsKKwl1bnNpZ25lZCBpbnQgbV91aUluZGV4OworCXVuc2lnbmVkIGludCBtX3VpU3ViaW5kZXg7CisJdm9pZCAqbV9sZV9wRGF0YTsKKwl1bnNpZ25lZCBpbnQgbV91aVNpemU7CisJdEVwbFNkb1R5cGUgbV9TZG9UeXBlOworCXZvaWQgKm1fcFVzZXJBcmc7CisKK30gdEVwbExpblNkb09iamVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBtX3VpSW5kZXg7CisJdW5zaWduZWQgaW50IG1fdWlTdWJpbmRleDsKKwl2b2lkICptX3BEYXRhOworCXVuc2lnbmVkIGludCBtX3VpU2l6ZTsKKworfSB0RXBsTGluTG9jYWxPYmplY3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgbV91aU5vZGVJZDsKKwl0RXBsTm10Tm9kZUNvbW1hbmQgbV9Ob2RlQ29tbWFuZDsKKworfSB0RXBsTGluTm9kZUNtZE9iamVjdDsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExfQVBJX0xJTlVYX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEFwaUxpbnV4S2VybmVsLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEFwaUxpbnV4S2VybmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVjYTA2MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsQXBpTGludXhLZXJuZWwuYwpAQCAtMCwwICsxLDEyNjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBMaW51eCBrZXJuZWwgbW9kdWxlIGFzIHdyYXBwZXIgb2YgRVBMIEFQSSBsYXllciwKKyAgICAgICAgICAgICAgICBpLmUuIGNvdW50ZXJwYXJ0IHRvIGEgTGludXggYXBwbGljYXRpb24KKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxBcGlMaW51eEtlcm5lbC5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS45ICQgICREYXRlOiAyMDA4LzExLzIxIDA5OjAwOjM4ICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgIEdOVS1Db21waWxlciBmb3IgbTY4aworCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMTAvMTEgZC5rLjogIEluaXRpYWwgVmVyc2lvbgorICAyMDA4LzA0LzEwIG0udS46ICBDaGFuZ2VkIHRvIG5ldyBjaGFyIGRyaXZlciBpbml0CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vIGtlcm5lbCBtb2R1bCBhbmQgZHJpdmVyCisKKy8vI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKy8vI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLy8jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisvLyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKKy8vIHNjaGVkdWxpbmcKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisvLyBtZW1vcnkgYWNjZXNzCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisKKyNpZmRlZiBDT05GSUdfREVWRlNfRlMKKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmZzX2ZzX2tlcm5lbC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJFcGwuaCIKKyNpbmNsdWRlICJFcGxBcGlMaW51eC5oIgorLy8jaW5jbHVkZSAia2VybmVsL0VwbFBkb2tDYWwuaCIKKyNpbmNsdWRlICJwcm9jX2ZzLmgiCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCisgICAgLy8gcmVtb3ZlICgibWFrZSBpbnZpc2libGUiKSBvYnNvbGV0ZSBzeW1ib2xzIGZvciBrZXJuZWwgdmVyc2lvbnMgMi42CisgICAgLy8gYW5kIGhpZ2hlcgorI2RlZmluZSBNT0RfSU5DX1VTRV9DT1VOVAorI2RlZmluZSBNT0RfREVDX1VTRV9DT1VOVAorI2RlZmluZSBFWFBPUlRfTk9fU1lNQk9MUworI2Vsc2UKKyNlcnJvciAiVGhpcyBkcml2ZXIgbmVlZHMgYSAyLjYueCBrZXJuZWwgb3IgaGlnaGVyIgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vIE1ldGFpbmZvcm1hdGlvbgorTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworI2lmZGVmIE1PRFVMRV9BVVRIT1IKK01PRFVMRV9BVVRIT1IoIkRhbmllbC5LcnVlZ2VyQFNZU1RFQy1lbGVjdHJvbmljLmNvbSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJFUEwgQVBJIGRyaXZlciIpOworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgQ29uZmlndXJhdGlvbgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBFUExMSU5fRFJWX05BTUUgICAgICJzeXN0ZWNfZXBsIgkvLyB1c2VkIGZvciA8cmVnaXN0ZXJfY2hyZGV2PgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIENvbnN0YW50IGRlZmluaXRpb25zCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUcmFjZVBvaW50IHN1cHBvcnQgZm9yIHJlYWx0aW1lLWRlYnVnZ2luZworI2lmZGVmIF9EQkdfVFJBQ0VfUE9JTlRTXwordm9pZCBQVUJMSUMgVGd0RGJnU2lnbmFsVHJhY2VQb2ludChCWVRFIGJUcmFjZVBvaW50TnVtYmVyX3ApOworI2RlZmluZSBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVChwKSAgIFRndERiZ1NpZ25hbFRyYWNlUG9pbnQocCkKKyNlbHNlCisjZGVmaW5lIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKHApCisjZW5kaWYKKworI2RlZmluZSBFVkVOVF9TVEFURV9JTklUICAgICAgICAwCisjZGVmaW5lIEVWRU5UX1NUQVRFX0lPQ1RMICAgICAgIDEJLy8gaW9jdGwgZW50ZXJlZCBhbmQgcmVhZHkgdG8gcmVjZWl2ZSBFUEwgZXZlbnQKKyNkZWZpbmUgRVZFTlRfU1RBVEVfUkVBRFkgICAgICAgMgkvLyBFUEwgZXZlbnQgY2FuIGJlIGZvcndhcmRlZCB0byB1c2VyIGFwcGxpY2F0aW9uCisjZGVmaW5lIEVWRU5UX1NUQVRFX1RFUk0gICAgICAgIDMJLy8gdGVybWluYXRlIHByb2Nlc3NpbmcKKworI2RlZmluZSBFUExfU1RBVEVfTk9UT1BFTiAgICAgICAwCisjZGVmaW5lIEVQTF9TVEFURV9OT1RJTklUICAgICAgIDEKKyNkZWZpbmUgRVBMX1NUQVRFX1JVTk5JTkcgICAgICAgMgorI2RlZmluZSBFUExfU1RBVEVfU0hVVERPV04gICAgICAzCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgR2xvYmFsIHZhcmlhYmxlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIENPTkZJR19ERVZGU19GUworCisgICAgLy8gZHJpdmVyIG1ham9yIG51bWJlcgorc3RhdGljIGludCBuRHJ2TWFqb3JOdW1iZXJfZzsKKworI2Vsc2UKKworICAgIC8vIGRldmljZSBudW1iZXIgKG1ham9yIGFuZCBtaW5vcikKK3N0YXRpYyBkZXZfdCBuRGV2TnVtX2c7CitzdGF0aWMgc3RydWN0IGNkZXYgKnBFcGxfY2Rldl9nOworCisjZW5kaWYKKworc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGludCB1aUVwbFN0YXRlX2cgPSBFUExfU1RBVEVfTk9UT1BFTjsKKworc3RhdGljIHN0cnVjdCBzZW1hcGhvcmUgU2VtYXBob3JlQ2JFdmVudF9nOwkvLyBzZW1hcGhvcmUgZm9yIEVwbExpbkNiRXZlbnQKK3N0YXRpYyB3YWl0X3F1ZXVlX2hlYWRfdCBXYWl0UXVldWVDYkV2ZW50X2c7CS8vIHdhaXQgcXVldWUgRXBsTGluQ2JFdmVudAorc3RhdGljIHdhaXRfcXVldWVfaGVhZF90IFdhaXRRdWV1ZVByb2Nlc3NfZzsJLy8gd2FpdCBxdWV1ZSBmb3IgRXBsQXBpUHJvY2VzcyAodXNlciBwcm9jZXNzKQorc3RhdGljIHdhaXRfcXVldWVfaGVhZF90IFdhaXRRdWV1ZVJlbGVhc2VfZzsJLy8gd2FpdCBxdWV1ZSBmb3IgRXBsTGluUmVsZWFzZQorc3RhdGljIGF0b21pY190IEF0b21pY0V2ZW50U3RhdGVfZyA9IEFUT01JQ19JTklUKEVWRU5UX1NUQVRFX0lOSVQpOworc3RhdGljIHRFcGxBcGlFdmVudFR5cGUgRXZlbnRUeXBlX2c7CS8vIGV2ZW50IHR5cGUgKGVudW0pCitzdGF0aWMgdEVwbEFwaUV2ZW50QXJnICpwRXZlbnRBcmdfZzsJLy8gZXZlbnQgYXJndW1lbnQgKHVuaW9uKQorc3RhdGljIHRFcGxLZXJuZWwgUmV0Q2JFdmVudF9nOwkvLyByZXR1cm4gY29kZSBmcm9tIGV2ZW50IGNhbGxiYWNrIGZ1bmN0aW9uCitzdGF0aWMgd2FpdF9xdWV1ZV9oZWFkX3QgV2FpdFF1ZXVlQ2JTeW5jX2c7CS8vIHdhaXQgcXVldWUgRXBsTGluQ2JTeW5jCitzdGF0aWMgd2FpdF9xdWV1ZV9oZWFkX3QgV2FpdFF1ZXVlUElfSW5fZzsJLy8gd2FpdCBxdWV1ZSBmb3IgRXBsQXBpUHJvY2Vzc0ltYWdlRXhjaGFuZ2VJbiAodXNlciBwcm9jZXNzKQorc3RhdGljIGF0b21pY190IEF0b21pY1N5bmNTdGF0ZV9nID0gQVRPTUlDX0lOSVQoRVZFTlRfU1RBVEVfSU5JVCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgTG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IHsKKwl2b2lkICptX3BVc2VyQXJnOworCXZvaWQgKm1fcERhdGE7CisKK30gdEVwbExpblNkb0J1ZkhlYWRlcjsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBMb2NhbCB2YXJpYWJsZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgUHJvdG90eXBlcyBvZiBpbnRlcm5hbCBmdW5jdGlvbnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbExpbkNiRXZlbnQodEVwbEFwaUV2ZW50VHlwZSBFdmVudFR5cGVfcCwJLy8gSU46IGV2ZW50IHR5cGUgKGVudW0pCisJCQkJdEVwbEFwaUV2ZW50QXJnICogcEV2ZW50QXJnX3AsCS8vIElOOiBldmVudCBhcmd1bWVudCAodW5pb24pCisJCQkJdm9pZCBHRU5FUklDICogcFVzZXJBcmdfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbExpbkNiU3luYyh2b2lkKTsKKworc3RhdGljIGludCBfX2luaXQgRXBsTGluSW5pdCh2b2lkKTsKK3N0YXRpYyB2b2lkIF9fZXhpdCBFcGxMaW5FeGl0KHZvaWQpOworCitzdGF0aWMgaW50IEVwbExpbk9wZW4oc3RydWN0IGlub2RlICpwRGV2aWNlRmlsZV9wLCBzdHJ1Y3QgZmlsZSAqcEluc3RhbmNlX3ApOworc3RhdGljIGludCBFcGxMaW5SZWxlYXNlKHN0cnVjdCBpbm9kZSAqcERldmljZUZpbGVfcCwgc3RydWN0IGZpbGUgKnBJbnN0YW5jZV9wKTsKK3N0YXRpYyBzc2l6ZV90IEVwbExpblJlYWQoc3RydWN0IGZpbGUgKnBJbnN0YW5jZV9wLCBjaGFyICpwRHN0QnVmZl9wLAorCQkJICBzaXplX3QgQnVmZlNpemVfcCwgbG9mZl90ICogcEZpbGVPZmZzX3ApOworc3RhdGljIHNzaXplX3QgRXBsTGluV3JpdGUoc3RydWN0IGZpbGUgKnBJbnN0YW5jZV9wLCBjb25zdCBjaGFyICpwU3JjQnVmZl9wLAorCQkJICAgc2l6ZV90IEJ1ZmZTaXplX3AsIGxvZmZfdCAqIHBGaWxlT2Zmc19wKTsKK3N0YXRpYyBpbnQgRXBsTGluSW9jdGwoc3RydWN0IGlub2RlICpwRGV2aWNlRmlsZV9wLCBzdHJ1Y3QgZmlsZSAqcEluc3RhbmNlX3AsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgdWlJb2N0bENtZF9wLCB1bnNpZ25lZCBsb25nIHVsQXJnX3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEtlcm5lbCBNb2R1bGUgc3BlY2lmaWMgRGF0YSBTdHJ1Y3R1cmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFWFBPUlRfTk9fU1lNQk9MUzsKKworbW9kdWxlX2luaXQoRXBsTGluSW5pdCk7Cittb2R1bGVfZXhpdChFcGxMaW5FeGl0KTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgRXBsTGluRmlsZU9wc19nID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gRXBsTGluT3BlbiwKKwkucmVsZWFzZSA9IEVwbExpblJlbGVhc2UsCisJLnJlYWQgPSBFcGxMaW5SZWFkLAorCS53cml0ZSA9IEVwbExpbldyaXRlLAorCS5pb2N0bCA9IEVwbExpbklvY3RsLAorCit9OworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBJbml0YWlsaXplIERyaXZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAtPiBpbnNtb2QgZHJpdmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IF9faW5pdCBFcGxMaW5Jbml0KHZvaWQpCit7CisKKwl0RXBsS2VybmVsIEVwbFJldDsKKwlpbnQgaUVycjsKKwlpbnQgaVJldDsKKyNpZmRlZiBDT05GSUdfREVWRlNfRlMKKwlpbnQgbk1pbm9yTnVtYmVyOworI2VuZGlmCisKKwlUUkFDRTAoIkVQTDogKyBFcGxMaW5Jbml0Li4uXG4iKTsKKwlUUkFDRTIoIkVQTDogICBEcml2ZXIgYnVpbGQ6ICVzIC8gJXNcbiIsIF9fREFURV9fLCBfX1RJTUVfXyk7CisKKwlpUmV0ID0gMDsKKworCS8vIGluaXRpYWxpemUgZ2xvYmFsIHZhcmlhYmxlcworCWF0b21pY19zZXQoJkF0b21pY0V2ZW50U3RhdGVfZywgRVZFTlRfU1RBVEVfSU5JVCk7CisJc2VtYV9pbml0KCZTZW1hcGhvcmVDYkV2ZW50X2csIDEpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJldhaXRRdWV1ZUNiRXZlbnRfZyk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmV2FpdFF1ZXVlUHJvY2Vzc19nKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZXYWl0UXVldWVSZWxlYXNlX2cpOworCisjaWZkZWYgQ09ORklHX0RFVkZTX0ZTCisKKwkvLyByZWdpc3RlciBjaGFyYWN0ZXIgZGV2aWNlIGhhbmRsZXIKKwlUUkFDRTIoIkVQTDogICBJbnN0YWxsaW5nIERyaXZlciAnJXMnLCBWZXJzaW9uICVzLi4uXG4iLAorCSAgICAgICBFUExMSU5fRFJWX05BTUUsIEVQTF9QUk9EVUNUX1ZFUlNJT04pOworCVRSQUNFMCgiRVBMOiAgICh1c2luZyBkeW5hbWljIG1ham9yIG51bWJlciBhc3NpZ25tZW50KVxuIik7CisJbkRydk1ham9yTnVtYmVyX2cgPQorCSAgICByZWdpc3Rlcl9jaHJkZXYoMCwgRVBMTElOX0RSVl9OQU1FLCAmRXBsTGluRmlsZU9wc19nKTsKKwlpZiAobkRydk1ham9yTnVtYmVyX2cgIT0gMCkgeworCQlUUkFDRTIKKwkJICAgICgiRVBMOiAgIERyaXZlciAnJXMnIGluc3RhbGxlZCBzdWNjZXNzZnVsLCBhc3NpZ25lZCBNYWpvck51bWJlcj0lZFxuIiwKKwkJICAgICBFUExMSU5fRFJWX05BTUUsIG5EcnZNYWpvck51bWJlcl9nKTsKKwl9IGVsc2UgeworCQlUUkFDRTEKKwkJICAgICgiRVBMOiAgIEVSUk9SOiBEcml2ZXIgJyVzJyBpcyB1bmFibGUgdG8gZ2V0IGEgZnJlZSBNYWpvck51bWJlciFcbiIsCisJCSAgICAgRVBMTElOX0RSVl9OQU1FKTsKKwkJaVJldCA9IC1FSU87CisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLyBjcmVhdGUgZGV2aWNlIG5vZGUgaW4gREVWRlMKKwluTWlub3JOdW1iZXIgPSAwOworCVRSQUNFMSgiRVBMOiAgIENyZWF0aW5nIGRldmljZSBub2RlICcvZGV2LyVzJy4uLlxuIiwgRVBMTElOX0RFVl9OQU1FKTsKKwlpRXJyID0KKwkgICAgZGV2ZnNfbWtfY2RldihNS0RFVihuRHJ2TWFqb3JOdW1iZXJfZywgbk1pbm9yTnVtYmVyKSwKKwkJCSAgU19JRkNIUiB8IFNfSVJVR08gfCBTX0lXVUdPLCBFUExMSU5fREVWX05BTUUpOworCWlmIChpRXJyID09IDApIHsKKwkJVFJBQ0UxKCJFUEw6ICAgRGV2aWNlIG5vZGUgJy9kZXYvJXMnIGNyZWF0ZWQgc3VjY2Vzc2Z1bC5cbiIsCisJCSAgICAgICBFUExMSU5fREVWX05BTUUpOworCX0gZWxzZSB7CisJCVRSQUNFMSgiRVBMOiAgIEVSUk9SOiB1bmFibGUgdG8gY3JlYXRlIGRldmljZSBub2RlICcvZGV2LyVzJ1xuIiwKKwkJICAgICAgIEVQTExJTl9ERVZfTkFNRSk7CisJCWlSZXQgPSAtRUlPOworCQlnb3RvIEV4aXQ7CisJfQorCisjZWxzZQorCisJLy8gcmVnaXN0ZXIgY2hhcmFjdGVyIGRldmljZSBoYW5kbGVyCisJLy8gb25seSBvbmUgTWlub3IgcmVxdWlyZWQKKwlUUkFDRTIoIkVQTDogICBJbnN0YWxsaW5nIERyaXZlciAnJXMnLCBWZXJzaW9uICVzLi4uXG4iLAorCSAgICAgICBFUExMSU5fRFJWX05BTUUsIEVQTF9QUk9EVUNUX1ZFUlNJT04pOworCWlSZXQgPSBhbGxvY19jaHJkZXZfcmVnaW9uKCZuRGV2TnVtX2csIDAsIDEsIEVQTExJTl9EUlZfTkFNRSk7CisJaWYgKGlSZXQgPT0gMCkgeworCQlUUkFDRTIKKwkJICAgICgiRVBMOiAgIERyaXZlciAnJXMnIGluc3RhbGxlZCBzdWNjZXNzZnVsLCBhc3NpZ25lZCBNYWpvck51bWJlcj0lZFxuIiwKKwkJICAgICBFUExMSU5fRFJWX05BTUUsIE1BSk9SKG5EZXZOdW1fZykpOworCX0gZWxzZSB7CisJCVRSQUNFMQorCQkgICAgKCJFUEw6ICAgRVJST1I6IERyaXZlciAnJXMnIGlzIHVuYWJsZSB0byBnZXQgYSBmcmVlIE1ham9yTnVtYmVyIVxuIiwKKwkJICAgICBFUExMSU5fRFJWX05BTUUpOworCQlpUmV0ID0gLUVJTzsKKwkJZ290byBFeGl0OworCX0KKworCS8vIHJlZ2lzdGVyIGNkZXYgc3RydWN0dXJlCisJcEVwbF9jZGV2X2cgPSBjZGV2X2FsbG9jKCk7CisJcEVwbF9jZGV2X2ctPm9wcyA9ICZFcGxMaW5GaWxlT3BzX2c7CisJcEVwbF9jZGV2X2ctPm93bmVyID0gVEhJU19NT0RVTEU7CisJaUVyciA9IGNkZXZfYWRkKHBFcGxfY2Rldl9nLCBuRGV2TnVtX2csIDEpOworCWlmIChpRXJyKSB7CisJCVRSQUNFMigiRVBMOiAgIEVSUk9SICVkOiBEcml2ZXIgJyVzJyBjb3VsZCBub3QgYmUgYWRkZWQhXG4iLAorCQkgICAgICAgaUVyciwgRVBMTElOX0RSVl9OQU1FKTsKKwkJaVJldCA9IC1FSU87CisJCWdvdG8gRXhpdDsKKwl9CisjZW5kaWYKKworCS8vIGNyZWF0ZSBkZXZpY2Ugbm9kZSBpbiBQUk9DRlMKKwlFcGxSZXQgPSBFcGxMaW5Qcm9jSW5pdCgpOworCWlmIChFcGxSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworICAgICAgRXhpdDoKKworCVRSQUNFMSgiRVBMOiAtIEVwbExpbkluaXQgKGlSZXQ9JWQpXG4iLCBpUmV0KTsKKwlyZXR1cm4gKGlSZXQpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgUmVtb3ZlIERyaXZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAtPiBybW1vZCBkcml2ZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBFcGxMaW5FeGl0KHZvaWQpCit7CisKKwl0RXBsS2VybmVsIEVwbFJldDsKKworCS8vIGRlbGV0ZSBpbnN0YW5jZSBmb3IgYWxsIG1vZHVsZXMKKy8vICAgIEVwbFJldCA9IEVwbEFwaVNodXRkb3duKCk7CisvLyAgICBwcmludGsoIkVwbEFwaVNodXRkb3duKCk6ICAweCVYXG4iLCBFcGxSZXQpOworCisJLy8gZGVpbml0aWFsaXplIHByb2MgZnMKKwlFcGxSZXQgPSBFcGxMaW5Qcm9jRnJlZSgpOworCXByaW50aygiRXBsTGluUHJvY0ZyZWUoKTogICAgICAgIDB4JVhcbiIsIEVwbFJldCk7CisKKwlUUkFDRTAoIkVQTDogKyBFcGxMaW5FeGl0Li4uXG4iKTsKKworI2lmZGVmIENPTkZJR19ERVZGU19GUworCisJLy8gcmVtb3ZlIGRldmljZSBub2RlIGZyb20gREVWRlMKKwlkZXZmc19yZW1vdmUoRVBMTElOX0RFVl9OQU1FKTsKKwlUUkFDRTEoIkVQTDogICBEZXZpY2Ugbm9kZSAnL2Rldi8lcycgcmVtb3ZlZC5cbiIsIEVQTExJTl9ERVZfTkFNRSk7CisKKwkvLyB1bnJlZ2lzdGVyIGNoYXJhY3RlciBkZXZpY2UgaGFuZGxlcgorCXVucmVnaXN0ZXJfY2hyZGV2KG5EcnZNYWpvck51bWJlcl9nLCBFUExMSU5fRFJWX05BTUUpOworCisjZWxzZQorCisJLy8gcmVtb3ZlIGNkZXYgc3RydWN0dXJlCisJY2Rldl9kZWwocEVwbF9jZGV2X2cpOworCisJLy8gdW5yZWdpc3RlciBjaGFyYWN0ZXIgZGV2aWNlIGhhbmRsZXIKKwl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24obkRldk51bV9nLCAxKTsKKworI2VuZGlmCisKKwlUUkFDRTEoIkVQTDogICBEcml2ZXIgJyVzJyByZW1vdmVkLlxuIiwgRVBMTElOX0RSVl9OQU1FKTsKKworCVRSQUNFMCgiRVBMOiAtIEVwbExpbkV4aXRcbiIpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgT3BlbiBEcml2ZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgLT4gb3BlbigiL2Rldi9kcml2ZXIiLCBPX1JEV1IpLi4uCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IEVwbExpbk9wZW4oc3RydWN0IGlub2RlICpwRGV2aWNlRmlsZV9wLAkvLyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGV2aWNlIHRvIG9wZW4KKwkJICAgICAgc3RydWN0IGZpbGUgKnBJbnN0YW5jZV9wKQkvLyBpbmZvcm1hdGlvbiBhYm91dCBkcml2ZXIgaW5zdGFuY2UKK3sKKworCWludCBpUmV0OworCisJVFJBQ0UwKCJFUEw6ICsgRXBsTGluT3Blbi4uLlxuIik7CisKKwlNT0RfSU5DX1VTRV9DT1VOVDsKKworCWlmICh1aUVwbFN0YXRlX2cgIT0gRVBMX1NUQVRFX05PVE9QRU4pIHsJLy8gc3RhY2sgYWxyZWFkeSBpbml0aWFsaXplZAorCQlpUmV0ID0gLUVBTFJFQURZOworCX0gZWxzZSB7CisJCWF0b21pY19zZXQoJkF0b21pY0V2ZW50U3RhdGVfZywgRVZFTlRfU1RBVEVfSU5JVCk7CisJCXNlbWFfaW5pdCgmU2VtYXBob3JlQ2JFdmVudF9nLCAxKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmV2FpdFF1ZXVlQ2JFdmVudF9nKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmV2FpdFF1ZXVlUHJvY2Vzc19nKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmV2FpdFF1ZXVlUmVsZWFzZV9nKTsKKwkJYXRvbWljX3NldCgmQXRvbWljU3luY1N0YXRlX2csIEVWRU5UX1NUQVRFX0lOSVQpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZXYWl0UXVldWVDYlN5bmNfZyk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJldhaXRRdWV1ZVBJX0luX2cpOworCisJCXVpRXBsU3RhdGVfZyA9IEVQTF9TVEFURV9OT1RJTklUOworCQlpUmV0ID0gMDsKKwl9CisKKwlUUkFDRTEoIkVQTDogLSBFcGxMaW5PcGVuIChpUmV0PSVkKVxuIiwgaVJldCk7CisJcmV0dXJuIChpUmV0KTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIENsb3NlIERyaXZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAtPiBjbG9zZShkZXZpY2UpLi4uCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IEVwbExpblJlbGVhc2Uoc3RydWN0IGlub2RlICpwRGV2aWNlRmlsZV9wLAkvLyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGV2aWNlIHRvIG9wZW4KKwkJCSBzdHJ1Y3QgZmlsZSAqcEluc3RhbmNlX3ApCS8vIGluZm9ybWF0aW9uIGFib3V0IGRyaXZlciBpbnN0YW5jZQoreworCisJdEVwbEtlcm5lbCBFcGxSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwlpbnQgaVJldDsKKworCVRSQUNFMCgiRVBMOiArIEVwbExpblJlbGVhc2UuLi5cbiIpOworCisJaWYgKHVpRXBsU3RhdGVfZyAhPSBFUExfU1RBVEVfTk9USU5JVCkgeworCQkvLyBwYXNzIGNvbnRyb2wgdG8gc3luYyBrZXJuZWwgdGhyZWFkLCBidXQgc2lnbmFsIHRlcm1pbmF0aW9uCisJCWF0b21pY19zZXQoJkF0b21pY1N5bmNTdGF0ZV9nLCBFVkVOVF9TVEFURV9URVJNKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZXYWl0UXVldWVDYlN5bmNfZyk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmV2FpdFF1ZXVlUElfSW5fZyk7CisKKwkJLy8gcGFzcyBjb250cm9sIHRvIGV2ZW50IHF1ZXVlIGtlcm5lbCB0aHJlYWQKKwkJYXRvbWljX3NldCgmQXRvbWljRXZlbnRTdGF0ZV9nLCBFVkVOVF9TVEFURV9URVJNKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZXYWl0UXVldWVDYkV2ZW50X2cpOworCisJCWlmICh1aUVwbFN0YXRlX2cgPT0gRVBMX1NUQVRFX1JVTk5JTkcpIHsJLy8gcG9zdCBObXRFdmVudFN3aXRjaE9mZgorCQkJRXBsUmV0ID0gRXBsQXBpRXhlY05tdENvbW1hbmQoa0VwbE5tdEV2ZW50U3dpdGNoT2ZmKTsKKworCQl9CisKKwkJaWYgKEVwbFJldCA9PSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJVFJBQ0UwKCJFUEw6ICAgd2FpdGluZyBmb3IgTk1UX0dTX09GRlxuIik7CisJCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoV2FpdFF1ZXVlUmVsZWFzZV9nLAorCQkJCQkJICh1aUVwbFN0YXRlX2cgPT0KKwkJCQkJCSAgRVBMX1NUQVRFX1NIVVRET1dOKSk7CisJCX0gZWxzZSB7CS8vIHBvc3QgTm10RXZlbnRTd2l0Y2hPZmYgZmFpbGVkCisJCQlUUkFDRTAoIkVQTDogICBldmVudCBwb3N0IGZhaWxlZFxuIik7CisJCX0KKworCQkvLyAkJCQgZC5rLjogV2hhdCBpZiB3YWl0aW5nIHdhcyBpbnRlcnJ1cHRlZCBieSBzaWduYWw/CisKKwkJVFJBQ0UwKCJFUEw6ICAgY2FsbCBFcGxBcGlTaHV0ZG93bigpXG4iKTsKKwkJLy8gRVBMIHN0YWNrIGNhbiBiZSBzYWZlbHkgc2h1dCBkb3duCisJCS8vIGRlbGV0ZSBpbnN0YW5jZSBmb3IgYWxsIEVQTCBtb2R1bGVzCisJCUVwbFJldCA9IEVwbEFwaVNodXRkb3duKCk7CisJCXByaW50aygiRXBsQXBpU2h1dGRvd24oKTogIDB4JVhcbiIsIEVwbFJldCk7CisJfQorCisJdWlFcGxTdGF0ZV9nID0gRVBMX1NUQVRFX05PVE9QRU47CisJaVJldCA9IDA7CisKKwlNT0RfREVDX1VTRV9DT1VOVDsKKworCVRSQUNFMSgiRVBMOiAtIEVwbExpblJlbGVhc2UgKGlSZXQ9JWQpXG4iLCBpUmV0KTsKKwlyZXR1cm4gKGlSZXQpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgUmVhZCBEYXRhIGZyb20gRHJpdmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIC0+IHJlYWQoLi4uKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHNzaXplX3QgRXBsTGluUmVhZChzdHJ1Y3QgZmlsZSAqcEluc3RhbmNlX3AsCS8vIGluZm9ybWF0aW9uIGFib3V0IGRyaXZlciBpbnN0YW5jZQorCQkJICBjaGFyICpwRHN0QnVmZl9wLAkvLyBhZGRyZXNzIG9mIGJ1ZmZlciB0byBmaWxsIHdpdGggZGF0YQorCQkJICBzaXplX3QgQnVmZlNpemVfcCwJLy8gbGVuZ3RoIG9mIHRoZSBidWZmZXIKKwkJCSAgbG9mZl90ICogcEZpbGVPZmZzX3ApCS8vIG9mZnNldCBpbiB0aGUgZmlsZQoreworCisJaW50IGlSZXQ7CisKKwlUUkFDRTAoIkVQTDogKyBFcGxMaW5SZWFkLi4uXG4iKTsKKworCVRSQUNFMCgiRVBMOiAgIFNvcnJ5LCB0aGlzIG9wZXJhdGlvbiBpc24ndCBzdXBwb3J0ZWQuXG4iKTsKKwlpUmV0ID0gLUVJTlZBTDsKKworCVRSQUNFMSgiRVBMOiAtIEVwbExpblJlYWQgKGlSZXQ9JWQpXG4iLCBpUmV0KTsKKwlyZXR1cm4gKGlSZXQpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgV3JpdGUgRGF0YSB0byBEcml2ZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgLT4gd3JpdGUoLi4uKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHNzaXplX3QgRXBsTGluV3JpdGUoc3RydWN0IGZpbGUgKnBJbnN0YW5jZV9wLAkvLyBpbmZvcm1hdGlvbiBhYm91dCBkcml2ZXIgaW5zdGFuY2UKKwkJCSAgIGNvbnN0IGNoYXIgKnBTcmNCdWZmX3AsCS8vIGFkZHJlc3Mgb2YgYnVmZmVyIHRvIGdldCBkYXRhIGZyb20KKwkJCSAgIHNpemVfdCBCdWZmU2l6ZV9wLAkvLyBsZW5ndGggb2YgdGhlIGJ1ZmZlcgorCQkJICAgbG9mZl90ICogcEZpbGVPZmZzX3ApCS8vIG9mZnNldCBpbiB0aGUgZmlsZQoreworCisJaW50IGlSZXQ7CisKKwlUUkFDRTAoIkVQTDogKyBFcGxMaW5Xcml0ZS4uLlxuIik7CisKKwlUUkFDRTAoIkVQTDogICBTb3JyeSwgdGhpcyBvcGVyYXRpb24gaXNuJ3Qgc3VwcG9ydGVkLlxuIik7CisJaVJldCA9IC1FSU5WQUw7CisKKwlUUkFDRTEoIkVQTDogLSBFcGxMaW5Xcml0ZSAoaVJldD0lZClcbiIsIGlSZXQpOworCXJldHVybiAoaVJldCk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBHZW5lcmljIEFjY2VzcyB0byBEcml2ZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgLT4gaW9jdGwoLi4uKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludCBFcGxMaW5Jb2N0bChzdHJ1Y3QgaW5vZGUgKnBEZXZpY2VGaWxlX3AsCS8vIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkZXZpY2UgdG8gb3BlbgorCQkgICAgICAgc3RydWN0IGZpbGUgKnBJbnN0YW5jZV9wLAkvLyBpbmZvcm1hdGlvbiBhYm91dCBkcml2ZXIgaW5zdGFuY2UKKwkJICAgICAgIHVuc2lnbmVkIGludCB1aUlvY3RsQ21kX3AsCS8vIElvY3RsIGNvbW1hbmQgdG8gZXhlY3V0ZQorCQkgICAgICAgdW5zaWduZWQgbG9uZyB1bEFyZ19wKQkvLyBJb2N0bCBjb21tYW5kIHNwZWNpZmljIGFyZ3VtZW50L3BhcmFtZXRlcgoreworCisJdEVwbEtlcm5lbCBFcGxSZXQ7CisJaW50IGlFcnI7CisJaW50IGlSZXQ7CisKKy8vICAgIFRSQUNFMSgiRVBMOiArIEVwbExpbklvY3RsICh1aUlvY3RsQ21kX3A9JWQpLi4uXG4iLCB1aUlvY3RsQ21kX3ApOworCisJaVJldCA9IC1FSU5WQUw7CisKKwlzd2l0Y2ggKHVpSW9jdGxDbWRfcCkgeworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBFUExMSU5fQ01EX0lOSVRJQUxJWkU6CisJCXsKKwkJCXRFcGxBcGlJbml0UGFyYW0gRXBsQXBpSW5pdFBhcmFtOworCisJCQlpRXJyID0KKwkJCSAgICBjb3B5X2Zyb21fdXNlcigmRXBsQXBpSW5pdFBhcmFtLAorCQkJCQkgICAoY29uc3Qgdm9pZCAqKXVsQXJnX3AsCisJCQkJCSAgIHNpemVvZihFcGxBcGlJbml0UGFyYW0pKTsKKwkJCWlmIChpRXJyICE9IDApIHsKKwkJCQlpUmV0ID0gLUVJTzsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisKKwkJCUVwbEFwaUluaXRQYXJhbS5tX3BmbkNiRXZlbnQgPSBFcGxMaW5DYkV2ZW50OworCQkJRXBsQXBpSW5pdFBhcmFtLm1fcGZuQ2JTeW5jID0gRXBsTGluQ2JTeW5jOworCisJCQlFcGxSZXQgPSBFcGxBcGlJbml0aWFsaXplKCZFcGxBcGlJbml0UGFyYW0pOworCisJCQl1aUVwbFN0YXRlX2cgPSBFUExfU1RBVEVfUlVOTklORzsKKworCQkJaVJldCA9IChpbnQpRXBsUmV0OworCQkJYnJlYWs7CisJCX0KKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBFUExMSU5fQ01EX1NIVVRET1dOOgorCQl7CQkvLyBzaHV0ZG93biB0aGUgdGhyZWFkcworCisJCQkvLyBwYXNzIGNvbnRyb2wgdG8gc3luYyBrZXJuZWwgdGhyZWFkLCBidXQgc2lnbmFsIHRlcm1pbmF0aW9uCisJCQlhdG9taWNfc2V0KCZBdG9taWNTeW5jU3RhdGVfZywgRVZFTlRfU1RBVEVfVEVSTSk7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJldhaXRRdWV1ZUNiU3luY19nKTsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmV2FpdFF1ZXVlUElfSW5fZyk7CisKKwkJCS8vIHBhc3MgY29udHJvbCB0byBldmVudCBxdWV1ZSBrZXJuZWwgdGhyZWFkCisJCQlhdG9taWNfc2V0KCZBdG9taWNFdmVudFN0YXRlX2csIEVWRU5UX1NUQVRFX1RFUk0pOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZXYWl0UXVldWVDYkV2ZW50X2cpOworCisJCQlpZiAodWlFcGxTdGF0ZV9nID09IEVQTF9TVEFURV9SVU5OSU5HKSB7CS8vIHBvc3QgTm10RXZlbnRTd2l0Y2hPZmYKKwkJCQlFcGxSZXQgPQorCQkJCSAgICBFcGxBcGlFeGVjTm10Q29tbWFuZChrRXBsTm10RXZlbnRTd2l0Y2hPZmYpOworCisJCQl9CisKKwkJCWlSZXQgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBFUExMSU5fQ01EX1JFQURfTE9DQUxfT0JKRUNUOgorCQl7CisJCQl0RXBsTGluTG9jYWxPYmplY3QgTG9jYWxPYmplY3Q7CisJCQl2b2lkICpwRGF0YTsKKworCQkJaUVyciA9CisJCQkgICAgY29weV9mcm9tX3VzZXIoJkxvY2FsT2JqZWN0LCAoY29uc3Qgdm9pZCAqKXVsQXJnX3AsCisJCQkJCSAgIHNpemVvZihMb2NhbE9iamVjdCkpOworCQkJaWYgKGlFcnIgIT0gMCkgeworCQkJCWlSZXQgPSAtRUlPOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJaWYgKChMb2NhbE9iamVjdC5tX3BEYXRhID09IE5VTEwpCisJCQkgICAgfHwgKExvY2FsT2JqZWN0Lm1fdWlTaXplID09IDApKSB7CisJCQkJaVJldCA9IChpbnQpa0VwbEFwaUludmFsaWRQYXJhbTsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisKKwkJCXBEYXRhID0gdm1hbGxvYyhMb2NhbE9iamVjdC5tX3VpU2l6ZSk7CisJCQlpZiAocERhdGEgPT0gTlVMTCkgewkvLyBubyBtZW1vcnkgYXZhaWxhYmxlCisJCQkJaVJldCA9IC1FTk9NRU07CisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlFcGxSZXQgPQorCQkJICAgIEVwbEFwaVJlYWRMb2NhbE9iamVjdChMb2NhbE9iamVjdC5tX3VpSW5kZXgsCisJCQkJCQkgIExvY2FsT2JqZWN0Lm1fdWlTdWJpbmRleCwKKwkJCQkJCSAgcERhdGEsICZMb2NhbE9iamVjdC5tX3VpU2l6ZSk7CisKKwkJCWlmIChFcGxSZXQgPT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQlpRXJyID0KKwkJCQkgICAgY29weV90b191c2VyKExvY2FsT2JqZWN0Lm1fcERhdGEsIHBEYXRhLAorCQkJCQkJIExvY2FsT2JqZWN0Lm1fdWlTaXplKTsKKworCQkJCXZmcmVlKHBEYXRhKTsKKworCQkJCWlmIChpRXJyICE9IDApIHsKKwkJCQkJaVJldCA9IC1FSU87CisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisJCQkJLy8gcmV0dXJuIGFjdHVhbCBzaXplIChMb2NhbE9iamVjdC5tX3VpU2l6ZSkKKwkJCQlpRXJyID0gcHV0X3VzZXIoTG9jYWxPYmplY3QubV91aVNpemUsCisJCQkJCQkodW5zaWduZWQgaW50ICopKHVsQXJnX3AgKworCQkJCQkJCQkgKHVuc2lnbmVkIGxvbmcpCisJCQkJCQkJCSAmTG9jYWxPYmplY3QuCisJCQkJCQkJCSBtX3VpU2l6ZSAtCisJCQkJCQkJCSAodW5zaWduZWQgbG9uZykKKwkJCQkJCQkJICZMb2NhbE9iamVjdCkpOworCQkJCWlmIChpRXJyICE9IDApIHsKKwkJCQkJaVJldCA9IC1FSU87CisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisKKwkJCX0gZWxzZSB7CisJCQkJdmZyZWUocERhdGEpOworCQkJfQorCisJCQlpUmV0ID0gKGludClFcGxSZXQ7CisJCQlicmVhazsKKwkJfQorCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIEVQTExJTl9DTURfV1JJVEVfTE9DQUxfT0JKRUNUOgorCQl7CisJCQl0RXBsTGluTG9jYWxPYmplY3QgTG9jYWxPYmplY3Q7CisJCQl2b2lkICpwRGF0YTsKKworCQkJaUVyciA9CisJCQkgICAgY29weV9mcm9tX3VzZXIoJkxvY2FsT2JqZWN0LCAoY29uc3Qgdm9pZCAqKXVsQXJnX3AsCisJCQkJCSAgIHNpemVvZihMb2NhbE9iamVjdCkpOworCQkJaWYgKGlFcnIgIT0gMCkgeworCQkJCWlSZXQgPSAtRUlPOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJaWYgKChMb2NhbE9iamVjdC5tX3BEYXRhID09IE5VTEwpCisJCQkgICAgfHwgKExvY2FsT2JqZWN0Lm1fdWlTaXplID09IDApKSB7CisJCQkJaVJldCA9IChpbnQpa0VwbEFwaUludmFsaWRQYXJhbTsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisKKwkJCXBEYXRhID0gdm1hbGxvYyhMb2NhbE9iamVjdC5tX3VpU2l6ZSk7CisJCQlpZiAocERhdGEgPT0gTlVMTCkgewkvLyBubyBtZW1vcnkgYXZhaWxhYmxlCisJCQkJaVJldCA9IC1FTk9NRU07CisJCQkJZ290byBFeGl0OworCQkJfQorCQkJaUVyciA9CisJCQkgICAgY29weV9mcm9tX3VzZXIocERhdGEsIExvY2FsT2JqZWN0Lm1fcERhdGEsCisJCQkJCSAgIExvY2FsT2JqZWN0Lm1fdWlTaXplKTsKKwkJCWlmIChpRXJyICE9IDApIHsKKwkJCQlpUmV0ID0gLUVJTzsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisKKwkJCUVwbFJldCA9CisJCQkgICAgRXBsQXBpV3JpdGVMb2NhbE9iamVjdChMb2NhbE9iamVjdC5tX3VpSW5kZXgsCisJCQkJCQkgICBMb2NhbE9iamVjdC5tX3VpU3ViaW5kZXgsCisJCQkJCQkgICBwRGF0YSwgTG9jYWxPYmplY3QubV91aVNpemUpOworCisJCQl2ZnJlZShwRGF0YSk7CisKKwkJCWlSZXQgPSAoaW50KUVwbFJldDsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIEVQTExJTl9DTURfUkVBRF9PQkpFQ1Q6CisJCXsKKwkJCXRFcGxMaW5TZG9PYmplY3QgU2RvT2JqZWN0OworCQkJdm9pZCAqcERhdGE7CisJCQl0RXBsTGluU2RvQnVmSGVhZGVyICpwQnVmSGVhZGVyOworCQkJdEVwbFNkb0NvbUNvbkhkbCAqcFNkb0NvbUNvbkhkbDsKKworCQkJaUVyciA9CisJCQkgICAgY29weV9mcm9tX3VzZXIoJlNkb09iamVjdCwgKGNvbnN0IHZvaWQgKil1bEFyZ19wLAorCQkJCQkgICBzaXplb2YoU2RvT2JqZWN0KSk7CisJCQlpZiAoaUVyciAhPSAwKSB7CisJCQkJaVJldCA9IC1FSU87CisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlpZiAoKFNkb09iamVjdC5tX2xlX3BEYXRhID09IE5VTEwpCisJCQkgICAgfHwgKFNkb09iamVjdC5tX3VpU2l6ZSA9PSAwKSkgeworCQkJCWlSZXQgPSAoaW50KWtFcGxBcGlJbnZhbGlkUGFyYW07CisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlwQnVmSGVhZGVyID0KKwkJCSAgICAodEVwbExpblNkb0J1ZkhlYWRlciAqKQorCQkJICAgIHZtYWxsb2Moc2l6ZW9mKHRFcGxMaW5TZG9CdWZIZWFkZXIpICsKKwkJCQkgICAgU2RvT2JqZWN0Lm1fdWlTaXplKTsKKwkJCWlmIChwQnVmSGVhZGVyID09IE5VTEwpIHsJLy8gbm8gbWVtb3J5IGF2YWlsYWJsZQorCQkJCWlSZXQgPSAtRU5PTUVNOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCS8vIGluaXRpYXRlIHRlbXBvcmFyeSBidWZmZXIKKwkJCXBCdWZIZWFkZXItPm1fcFVzZXJBcmcgPSBTZG9PYmplY3QubV9wVXNlckFyZzsJLy8gb3JpZ2luYWwgdXNlciBhcmd1bWVudCBwb2ludGVyCisJCQlwQnVmSGVhZGVyLT5tX3BEYXRhID0gU2RvT2JqZWN0Lm1fbGVfcERhdGE7CS8vIG9yaWdpbmFsIGRhdGEgcG9pbnRlciBmcm9tIGFwcAorCQkJcERhdGEgPSBwQnVmSGVhZGVyICsgc2l6ZW9mKHRFcGxMaW5TZG9CdWZIZWFkZXIpOworCisJCQlpZiAoU2RvT2JqZWN0Lm1fZlZhbGlkU2RvQ29tQ29uSGRsICE9IEZBTFNFKSB7CisJCQkJcFNkb0NvbUNvbkhkbCA9ICZTZG9PYmplY3QubV9TZG9Db21Db25IZGw7CisJCQl9IGVsc2UgeworCQkJCXBTZG9Db21Db25IZGwgPSBOVUxMOworCQkJfQorCisJCQlFcGxSZXQgPQorCQkJICAgIEVwbEFwaVJlYWRPYmplY3QocFNkb0NvbUNvbkhkbCwKKwkJCQkJICAgICBTZG9PYmplY3QubV91aU5vZGVJZCwKKwkJCQkJICAgICBTZG9PYmplY3QubV91aUluZGV4LAorCQkJCQkgICAgIFNkb09iamVjdC5tX3VpU3ViaW5kZXgsIHBEYXRhLAorCQkJCQkgICAgICZTZG9PYmplY3QubV91aVNpemUsCisJCQkJCSAgICAgU2RvT2JqZWN0Lm1fU2RvVHlwZSwgcEJ1ZkhlYWRlcik7CisKKwkJCS8vIHJldHVybiBhY3R1YWwgU0RPIGhhbmRsZSAoU2RvT2JqZWN0Lm1fU2RvQ29tQ29uSGRsKQorCQkJaUVyciA9IHB1dF91c2VyKFNkb09iamVjdC5tX1Nkb0NvbUNvbkhkbCwKKwkJCQkJKHVuc2lnbmVkIGludCAqKSh1bEFyZ19wICsKKwkJCQkJCQkgKHVuc2lnbmVkIGxvbmcpCisJCQkJCQkJICZTZG9PYmplY3QuCisJCQkJCQkJIG1fU2RvQ29tQ29uSGRsIC0KKwkJCQkJCQkgKHVuc2lnbmVkIGxvbmcpCisJCQkJCQkJICZTZG9PYmplY3QpKTsKKwkJCWlmIChpRXJyICE9IDApIHsKKwkJCQlpUmV0ID0gLUVJTzsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisKKwkJCWlmIChFcGxSZXQgPT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQlpRXJyID0KKwkJCQkgICAgY29weV90b191c2VyKFNkb09iamVjdC5tX2xlX3BEYXRhLCBwRGF0YSwKKwkJCQkJCSBTZG9PYmplY3QubV91aVNpemUpOworCisJCQkJdmZyZWUocEJ1ZkhlYWRlcik7CisKKwkJCQlpZiAoaUVyciAhPSAwKSB7CisJCQkJCWlSZXQgPSAtRUlPOworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJCS8vIHJldHVybiBhY3R1YWwgc2l6ZSAoU2RvT2JqZWN0Lm1fdWlTaXplKQorCQkJCWlFcnIgPSBwdXRfdXNlcihTZG9PYmplY3QubV91aVNpemUsCisJCQkJCQkodW5zaWduZWQgaW50ICopKHVsQXJnX3AgKworCQkJCQkJCQkgKHVuc2lnbmVkIGxvbmcpCisJCQkJCQkJCSAmU2RvT2JqZWN0LgorCQkJCQkJCQkgbV91aVNpemUgLQorCQkJCQkJCQkgKHVuc2lnbmVkIGxvbmcpCisJCQkJCQkJCSAmU2RvT2JqZWN0KSk7CisJCQkJaWYgKGlFcnIgIT0gMCkgeworCQkJCQlpUmV0ID0gLUVJTzsKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKwkJCX0gZWxzZSBpZiAoRXBsUmV0ICE9IGtFcGxBcGlUYXNrRGVmZXJyZWQpIHsJLy8gZXJyb3Igb2N1cnJlZAorCQkJCXZmcmVlKHBCdWZIZWFkZXIpOworCQkJCWlmIChpRXJyICE9IDApIHsKKwkJCQkJaVJldCA9IC1FSU87CisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisJCQl9CisKKwkJCWlSZXQgPSAoaW50KUVwbFJldDsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIEVQTExJTl9DTURfV1JJVEVfT0JKRUNUOgorCQl7CisJCQl0RXBsTGluU2RvT2JqZWN0IFNkb09iamVjdDsKKwkJCXZvaWQgKnBEYXRhOworCQkJdEVwbExpblNkb0J1ZkhlYWRlciAqcEJ1ZkhlYWRlcjsKKwkJCXRFcGxTZG9Db21Db25IZGwgKnBTZG9Db21Db25IZGw7CisKKwkJCWlFcnIgPQorCQkJICAgIGNvcHlfZnJvbV91c2VyKCZTZG9PYmplY3QsIChjb25zdCB2b2lkICopdWxBcmdfcCwKKwkJCQkJICAgc2l6ZW9mKFNkb09iamVjdCkpOworCQkJaWYgKGlFcnIgIT0gMCkgeworCQkJCWlSZXQgPSAtRUlPOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJaWYgKChTZG9PYmplY3QubV9sZV9wRGF0YSA9PSBOVUxMKQorCQkJICAgIHx8IChTZG9PYmplY3QubV91aVNpemUgPT0gMCkpIHsKKwkJCQlpUmV0ID0gKGludClrRXBsQXBpSW52YWxpZFBhcmFtOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJcEJ1ZkhlYWRlciA9CisJCQkgICAgKHRFcGxMaW5TZG9CdWZIZWFkZXIgKikKKwkJCSAgICB2bWFsbG9jKHNpemVvZih0RXBsTGluU2RvQnVmSGVhZGVyKSArCisJCQkJICAgIFNkb09iamVjdC5tX3VpU2l6ZSk7CisJCQlpZiAocEJ1ZkhlYWRlciA9PSBOVUxMKSB7CS8vIG5vIG1lbW9yeSBhdmFpbGFibGUKKwkJCQlpUmV0ID0gLUVOT01FTTsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQkvLyBpbml0aWF0ZSB0ZW1wb3JhcnkgYnVmZmVyCisJCQlwQnVmSGVhZGVyLT5tX3BVc2VyQXJnID0gU2RvT2JqZWN0Lm1fcFVzZXJBcmc7CS8vIG9yaWdpbmFsIHVzZXIgYXJndW1lbnQgcG9pbnRlcgorCQkJcEJ1ZkhlYWRlci0+bV9wRGF0YSA9IFNkb09iamVjdC5tX2xlX3BEYXRhOwkvLyBvcmlnaW5hbCBkYXRhIHBvaW50ZXIgZnJvbSBhcHAKKwkJCXBEYXRhID0gcEJ1ZkhlYWRlciArIHNpemVvZih0RXBsTGluU2RvQnVmSGVhZGVyKTsKKworCQkJaUVyciA9CisJCQkgICAgY29weV9mcm9tX3VzZXIocERhdGEsIFNkb09iamVjdC5tX2xlX3BEYXRhLAorCQkJCQkgICBTZG9PYmplY3QubV91aVNpemUpOworCisJCQlpZiAoaUVyciAhPSAwKSB7CisJCQkJaVJldCA9IC1FSU87CisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlpZiAoU2RvT2JqZWN0Lm1fZlZhbGlkU2RvQ29tQ29uSGRsICE9IEZBTFNFKSB7CisJCQkJcFNkb0NvbUNvbkhkbCA9ICZTZG9PYmplY3QubV9TZG9Db21Db25IZGw7CisJCQl9IGVsc2UgeworCQkJCXBTZG9Db21Db25IZGwgPSBOVUxMOworCQkJfQorCisJCQlFcGxSZXQgPQorCQkJICAgIEVwbEFwaVdyaXRlT2JqZWN0KHBTZG9Db21Db25IZGwsCisJCQkJCSAgICAgIFNkb09iamVjdC5tX3VpTm9kZUlkLAorCQkJCQkgICAgICBTZG9PYmplY3QubV91aUluZGV4LAorCQkJCQkgICAgICBTZG9PYmplY3QubV91aVN1YmluZGV4LCBwRGF0YSwKKwkJCQkJICAgICAgU2RvT2JqZWN0Lm1fdWlTaXplLAorCQkJCQkgICAgICBTZG9PYmplY3QubV9TZG9UeXBlLCBwQnVmSGVhZGVyKTsKKworCQkJLy8gcmV0dXJuIGFjdHVhbCBTRE8gaGFuZGxlIChTZG9PYmplY3QubV9TZG9Db21Db25IZGwpCisJCQlpRXJyID0gcHV0X3VzZXIoU2RvT2JqZWN0Lm1fU2RvQ29tQ29uSGRsLAorCQkJCQkodW5zaWduZWQgaW50ICopKHVsQXJnX3AgKworCQkJCQkJCSAodW5zaWduZWQgbG9uZykKKwkJCQkJCQkgJlNkb09iamVjdC4KKwkJCQkJCQkgbV9TZG9Db21Db25IZGwgLQorCQkJCQkJCSAodW5zaWduZWQgbG9uZykKKwkJCQkJCQkgJlNkb09iamVjdCkpOworCQkJaWYgKGlFcnIgIT0gMCkgeworCQkJCWlSZXQgPSAtRUlPOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJaWYgKEVwbFJldCAhPSBrRXBsQXBpVGFza0RlZmVycmVkKSB7CS8vIHN1Y2NlZWRlZCBvciBlcnJvciBvY3VycmVkLCBidXQgdGFzayBub3QgZGVmZXJyZWQKKwkJCQl2ZnJlZShwQnVmSGVhZGVyKTsKKwkJCX0KKworCQkJaVJldCA9IChpbnQpRXBsUmV0OworCQkJYnJlYWs7CisJCX0KKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBFUExMSU5fQ01EX0ZSRUVfU0RPX0NIQU5ORUw6CisJCXsKKwkJCS8vIGZvcndhcmQgU0RPIGhhbmRsZSB0byBFUEwgc3RhY2sKKwkJCUVwbFJldCA9CisJCQkgICAgRXBsQXBpRnJlZVNkb0NoYW5uZWwoKHRFcGxTZG9Db21Db25IZGwpIHVsQXJnX3ApOworCisJCQlpUmV0ID0gKGludClFcGxSZXQ7CisJCQlicmVhazsKKwkJfQorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBFUExMSU5fQ01EX01OX1RSSUdHRVJfU1RBVEVfQ0hBTkdFOgorCQl7CisJCQl0RXBsTGluTm9kZUNtZE9iamVjdCBOb2RlQ21kT2JqZWN0OworCisJCQlpRXJyID0KKwkJCSAgICBjb3B5X2Zyb21fdXNlcigmTm9kZUNtZE9iamVjdCwKKwkJCQkJICAgKGNvbnN0IHZvaWQgKil1bEFyZ19wLAorCQkJCQkgICBzaXplb2YoTm9kZUNtZE9iamVjdCkpOworCQkJaWYgKGlFcnIgIT0gMCkgeworCQkJCWlSZXQgPSAtRUlPOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJRXBsUmV0ID0KKwkJCSAgICBFcGxBcGlNblRyaWdnZXJTdGF0ZUNoYW5nZShOb2RlQ21kT2JqZWN0Lm1fdWlOb2RlSWQsCisJCQkJCQkgICAgICAgTm9kZUNtZE9iamVjdC4KKwkJCQkJCSAgICAgICBtX05vZGVDb21tYW5kKTsKKwkJCWlSZXQgPSAoaW50KUVwbFJldDsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBFUExMSU5fQ01EX0dFVF9FVkVOVDoKKwkJeworCQkJdEVwbExpbkV2ZW50IEV2ZW50OworCisJCQkvLyBzYXZlIGV2ZW50IHN0cnVjdHVyZQorCQkJaUVyciA9CisJCQkgICAgY29weV9mcm9tX3VzZXIoJkV2ZW50LCAoY29uc3Qgdm9pZCAqKXVsQXJnX3AsCisJCQkJCSAgIHNpemVvZihFdmVudCkpOworCQkJaWYgKGlFcnIgIT0gMCkgeworCQkJCWlSZXQgPSAtRUlPOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCS8vIHNhdmUgcmV0dXJuIGNvZGUgZnJvbSBhcHBsaWNhdGlvbidzIGV2ZW50IGNhbGxiYWNrIGZ1bmN0aW9uCisJCQlSZXRDYkV2ZW50X2cgPSBFdmVudC5tX1JldENiRXZlbnQ7CisKKwkJCWlmIChSZXRDYkV2ZW50X2cgPT0ga0VwbFNodXRkb3duKSB7CisJCQkJLy8gcGFzcyBjb250cm9sIHRvIGV2ZW50IHF1ZXVlIGtlcm5lbCB0aHJlYWQsIGJ1dCBzaWduYWwgdGVybWluYXRpb24KKwkJCQlhdG9taWNfc2V0KCZBdG9taWNFdmVudFN0YXRlX2csCisJCQkJCSAgIEVWRU5UX1NUQVRFX1RFUk0pOworCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmV2FpdFF1ZXVlQ2JFdmVudF9nKTsKKwkJCQkvLyBleGl0IHdpdGggZXJyb3IgLT4gRXBsQXBpUHJvY2VzcygpIHdpbGwgbGVhdmUgdGhlIGluZmluaXRlIGxvb3AKKwkJCQlpUmV0ID0gMTsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQkvLyBwYXNzIGNvbnRyb2wgdG8gZXZlbnQgcXVldWUga2VybmVsIHRocmVhZAorCQkJYXRvbWljX3NldCgmQXRvbWljRXZlbnRTdGF0ZV9nLCBFVkVOVF9TVEFURV9JT0NUTCk7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJldhaXRRdWV1ZUNiRXZlbnRfZyk7CisKKwkJCS8vIGZhbGwgYXNsZWVwIGl0c2VsZiBpbiBvd24gd2FpdCBxdWV1ZQorCQkJaUVyciA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShXYWl0UXVldWVQcm9jZXNzX2csCisJCQkJCQkJKGF0b21pY19yZWFkCisJCQkJCQkJICgmQXRvbWljRXZlbnRTdGF0ZV9nKQorCQkJCQkJCSA9PSBFVkVOVF9TVEFURV9SRUFEWSkKKwkJCQkJCQl8fAorCQkJCQkJCShhdG9taWNfcmVhZAorCQkJCQkJCSAoJkF0b21pY0V2ZW50U3RhdGVfZykKKwkJCQkJCQkgPT0gRVZFTlRfU1RBVEVfVEVSTSkpOworCQkJaWYgKGlFcnIgIT0gMCkgewkvLyB3YWl0aW5nIHdhcyBpbnRlcnJ1cHRlZCBieSBzaWduYWwKKwkJCQkvLyBwYXNzIGNvbnRyb2wgdG8gZXZlbnQgcXVldWUga2VybmVsIHRocmVhZCwgYnV0IHNpZ25hbCB0ZXJtaW5hdGlvbgorCQkJCWF0b21pY19zZXQoJkF0b21pY0V2ZW50U3RhdGVfZywKKwkJCQkJICAgRVZFTlRfU1RBVEVfVEVSTSk7CisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZXYWl0UXVldWVDYkV2ZW50X2cpOworCQkJCS8vIGV4aXQgd2l0aCB0aGlzIGVycm9yIC0+IEVwbEFwaVByb2Nlc3MoKSB3aWxsIGxlYXZlIHRoZSBpbmZpbml0ZSBsb29wCisJCQkJaVJldCA9IGlFcnI7CisJCQkJZ290byBFeGl0OworCQkJfSBlbHNlIGlmIChhdG9taWNfcmVhZCgmQXRvbWljRXZlbnRTdGF0ZV9nKSA9PSBFVkVOVF9TVEFURV9URVJNKSB7CS8vIHRlcm1pbmF0aW9uIGluIHByb2dyZXNzCisJCQkJLy8gcGFzcyBjb250cm9sIHRvIGV2ZW50IHF1ZXVlIGtlcm5lbCB0aHJlYWQsIGJ1dCBzaWduYWwgdGVybWluYXRpb24KKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJldhaXRRdWV1ZUNiRXZlbnRfZyk7CisJCQkJLy8gZXhpdCB3aXRoIHRoaXMgZXJyb3IgLT4gRXBsQXBpUHJvY2VzcygpIHdpbGwgbGVhdmUgdGhlIGluZmluaXRlIGxvb3AKKwkJCQlpUmV0ID0gMTsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQkvLyBjb3B5IGV2ZW50IHRvIHVzZXIgc3BhY2UKKwkJCWlFcnIgPQorCQkJICAgIGNvcHlfdG9fdXNlcihFdmVudC5tX3BFdmVudFR5cGUsICZFdmVudFR5cGVfZywKKwkJCQkJIHNpemVvZihFdmVudFR5cGVfZykpOworCQkJaWYgKGlFcnIgIT0gMCkgewkvLyBub3QgYWxsIGRhdGEgY291bGQgYmUgY29waWVkCisJCQkJaVJldCA9IC1FSU87CisJCQkJZ290byBFeGl0OworCQkJfQorCQkJLy8gJCQkIGQuay4gcGVyZm9ybSBTRE8gZXZlbnQgcHJvY2Vzc2luZworCQkJaWYgKEV2ZW50VHlwZV9nID09IGtFcGxBcGlFdmVudFNkbykgeworCQkJCXZvaWQgKnBEYXRhOworCQkJCXRFcGxMaW5TZG9CdWZIZWFkZXIgKnBCdWZIZWFkZXI7CisKKwkJCQlwQnVmSGVhZGVyID0KKwkJCQkgICAgKHRFcGxMaW5TZG9CdWZIZWFkZXIgKikgcEV2ZW50QXJnX2ctPm1fU2RvLgorCQkJCSAgICBtX3BVc2VyQXJnOworCQkJCXBEYXRhID0KKwkJCQkgICAgcEJ1ZkhlYWRlciArIHNpemVvZih0RXBsTGluU2RvQnVmSGVhZGVyKTsKKworCQkJCWlmIChwRXZlbnRBcmdfZy0+bV9TZG8ubV9TZG9BY2Nlc3NUeXBlID09CisJCQkJICAgIGtFcGxTZG9BY2Nlc3NUeXBlUmVhZCkgeworCQkJCQkvLyBjb3B5IHJlYWQgZGF0YSB0byB1c2VyIHNwYWNlCisJCQkJCWlFcnIgPQorCQkJCQkgICAgY29weV90b191c2VyKHBCdWZIZWFkZXItPm1fcERhdGEsCisJCQkJCQkJIHBEYXRhLAorCQkJCQkJCSBwRXZlbnRBcmdfZy0+bV9TZG8uCisJCQkJCQkJIG1fdWlUcmFuc2ZlcnJlZEJ5dGUpOworCQkJCQlpZiAoaUVyciAhPSAwKSB7CS8vIG5vdCBhbGwgZGF0YSBjb3VsZCBiZSBjb3BpZWQKKwkJCQkJCWlSZXQgPSAtRUlPOworCQkJCQkJZ290byBFeGl0OworCQkJCQl9CisJCQkJfQorCQkJCXBFdmVudEFyZ19nLT5tX1Nkby5tX3BVc2VyQXJnID0KKwkJCQkgICAgcEJ1ZkhlYWRlci0+bV9wVXNlckFyZzsKKwkJCQl2ZnJlZShwQnVmSGVhZGVyKTsKKwkJCX0KKworCQkJaUVyciA9CisJCQkgICAgY29weV90b191c2VyKEV2ZW50Lm1fcEV2ZW50QXJnLCBwRXZlbnRBcmdfZywKKwkJCQkJIG1pbihzaXplb2YodEVwbEFwaUV2ZW50QXJnKSwKKwkJCQkJICAgICBFdmVudC5tX3VpRXZlbnRBcmdTaXplKSk7CisJCQlpZiAoaUVyciAhPSAwKSB7CS8vIG5vdCBhbGwgZGF0YSBjb3VsZCBiZSBjb3BpZWQKKwkJCQlpUmV0ID0gLUVJTzsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQkvLyByZXR1cm4gdG8gRXBsQXBpUHJvY2VzcygpLCB3aGljaCB3aWxsIGNhbGwgdGhlIGFwcGxpY2F0aW9uJ3MgZXZlbnQgY2FsbGJhY2sgZnVuY3Rpb24KKwkJCWlSZXQgPSAwOworCisJCQlicmVhazsKKwkJfQorCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIEVQTExJTl9DTURfUElfU0VUVVA6CisJCXsKKwkJCUVwbFJldCA9IEVwbEFwaVByb2Nlc3NJbWFnZVNldHVwKCk7CisJCQlpUmV0ID0gKGludClFcGxSZXQ7CisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWNhc2UgRVBMTElOX0NNRF9QSV9JTjoKKwkJeworCQkJdEVwbEFwaVByb2Nlc3NJbWFnZSBQcm9jZXNzSW1hZ2VJbjsKKworCQkJLy8gc2F2ZSBwcm9jZXNzIGltYWdlIHN0cnVjdHVyZQorCQkJaUVyciA9CisJCQkgICAgY29weV9mcm9tX3VzZXIoJlByb2Nlc3NJbWFnZUluLAorCQkJCQkgICAoY29uc3Qgdm9pZCAqKXVsQXJnX3AsCisJCQkJCSAgIHNpemVvZihQcm9jZXNzSW1hZ2VJbikpOworCQkJaWYgKGlFcnIgIT0gMCkgeworCQkJCWlSZXQgPSAtRUlPOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCS8vIHBhc3MgY29udHJvbCB0byBldmVudCBxdWV1ZSBrZXJuZWwgdGhyZWFkCisJCQlhdG9taWNfc2V0KCZBdG9taWNTeW5jU3RhdGVfZywgRVZFTlRfU1RBVEVfSU9DVEwpOworCisJCQkvLyBmYWxsIGFzbGVlcCBpdHNlbGYgaW4gb3duIHdhaXQgcXVldWUKKwkJCWlFcnIgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoV2FpdFF1ZXVlUElfSW5fZywKKwkJCQkJCQkoYXRvbWljX3JlYWQKKwkJCQkJCQkgKCZBdG9taWNTeW5jU3RhdGVfZykgPT0KKwkJCQkJCQkgRVZFTlRfU1RBVEVfUkVBRFkpCisJCQkJCQkJfHwKKwkJCQkJCQkoYXRvbWljX3JlYWQKKwkJCQkJCQkgKCZBdG9taWNTeW5jU3RhdGVfZykgPT0KKwkJCQkJCQkgRVZFTlRfU1RBVEVfVEVSTSkpOworCQkJaWYgKGlFcnIgIT0gMCkgewkvLyB3YWl0aW5nIHdhcyBpbnRlcnJ1cHRlZCBieSBzaWduYWwKKwkJCQkvLyBwYXNzIGNvbnRyb2wgdG8gc3luYyBrZXJuZWwgdGhyZWFkLCBidXQgc2lnbmFsIHRlcm1pbmF0aW9uCisJCQkJYXRvbWljX3NldCgmQXRvbWljU3luY1N0YXRlX2csCisJCQkJCSAgIEVWRU5UX1NUQVRFX1RFUk0pOworCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmV2FpdFF1ZXVlQ2JTeW5jX2cpOworCQkJCS8vIGV4aXQgd2l0aCB0aGlzIGVycm9yIC0+IGFwcGxpY2F0aW9uIHdpbGwgbGVhdmUgdGhlIGluZmluaXRlIGxvb3AKKwkJCQlpUmV0ID0gaUVycjsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZBdG9taWNTeW5jU3RhdGVfZykgPT0gRVZFTlRfU1RBVEVfVEVSTSkgewkvLyB0ZXJtaW5hdGlvbiBpbiBwcm9ncmVzcworCQkJCS8vIHBhc3MgY29udHJvbCB0byBzeW5jIGtlcm5lbCB0aHJlYWQsIGJ1dCBzaWduYWwgdGVybWluYXRpb24KKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJldhaXRRdWV1ZUNiU3luY19nKTsKKwkJCQkvLyBleGl0IHdpdGggdGhpcyBlcnJvciAtPiBhcHBsaWNhdGlvbiB3aWxsIGxlYXZlIHRoZSBpbmZpbml0ZSBsb29wCisJCQkJaVJldCA9IDE7CisJCQkJZ290byBFeGl0OworCQkJfQorCQkJLy8gZXhjaGFuZ2UgcHJvY2VzcyBpbWFnZQorCQkJRXBsUmV0ID0gRXBsQXBpUHJvY2Vzc0ltYWdlRXhjaGFuZ2VJbigmUHJvY2Vzc0ltYWdlSW4pOworCisJCQkvLyByZXR1cm4gdG8gRXBsQXBpUHJvY2Vzc0ltYWdlRXhjaGFuZ2VJbigpCisJCQlpUmV0ID0gKGludClFcGxSZXQ7CisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWNhc2UgRVBMTElOX0NNRF9QSV9PVVQ6CisJCXsKKwkJCXRFcGxBcGlQcm9jZXNzSW1hZ2UgUHJvY2Vzc0ltYWdlT3V0OworCisJCQkvLyBzYXZlIHByb2Nlc3MgaW1hZ2Ugc3RydWN0dXJlCisJCQlpRXJyID0KKwkJCSAgICBjb3B5X2Zyb21fdXNlcigmUHJvY2Vzc0ltYWdlT3V0LAorCQkJCQkgICAoY29uc3Qgdm9pZCAqKXVsQXJnX3AsCisJCQkJCSAgIHNpemVvZihQcm9jZXNzSW1hZ2VPdXQpKTsKKwkJCWlmIChpRXJyICE9IDApIHsKKwkJCQlpUmV0ID0gLUVJTzsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisKKwkJCWlmIChhdG9taWNfcmVhZCgmQXRvbWljU3luY1N0YXRlX2cpICE9CisJCQkgICAgRVZFTlRfU1RBVEVfUkVBRFkpIHsKKwkJCQlpUmV0ID0gKGludClrRXBsSW52YWxpZE9wZXJhdGlvbjsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQkvLyBleGNoYW5nZSBwcm9jZXNzIGltYWdlCisJCQlFcGxSZXQgPQorCQkJICAgIEVwbEFwaVByb2Nlc3NJbWFnZUV4Y2hhbmdlT3V0KCZQcm9jZXNzSW1hZ2VPdXQpOworCisJCQkvLyBwYXNzIGNvbnRyb2wgdG8gc3luYyBrZXJuZWwgdGhyZWFkCisJCQlhdG9taWNfc2V0KCZBdG9taWNTeW5jU3RhdGVfZywgRVZFTlRfU1RBVEVfVEVSTSk7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJldhaXRRdWV1ZUNiU3luY19nKTsKKworCQkJLy8gcmV0dXJuIHRvIEVwbEFwaVByb2Nlc3NJbWFnZUV4Y2hhbmdlb3V0KCkKKwkJCWlSZXQgPSAoaW50KUVwbFJldDsKKworCQkJYnJlYWs7CisJCX0KKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBFUExMSU5fQ01EX05NVF9DT01NQU5EOgorCQl7CisJCQkvLyBmb3J3YXJkIE5NVCBjb21tYW5kIHRvIEVQTCBzdGFjaworCQkJRXBsUmV0ID0gRXBsQXBpRXhlY05tdENvbW1hbmQoKHRFcGxObXRFdmVudCkgdWxBcmdfcCk7CisKKwkJCWlSZXQgPSAoaW50KUVwbFJldDsKKworCQkJYnJlYWs7CisJCX0KKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJZGVmYXVsdDoKKwkJeworCQkJYnJlYWs7CisJCX0KKwl9CisKKyAgICAgIEV4aXQ6CisKKy8vICAgIFRSQUNFMSgiRVBMOiAtIEVwbExpbklvY3RsIChpUmV0PSVkKVxuIiwgaVJldCk7CisJcmV0dXJuIChpUmV0KTsKKworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsTGluQ2JFdmVudCh0RXBsQXBpRXZlbnRUeXBlIEV2ZW50VHlwZV9wLAkvLyBJTjogZXZlbnQgdHlwZSAoZW51bSkKKwkJCQl0RXBsQXBpRXZlbnRBcmcgKiBwRXZlbnRBcmdfcCwJLy8gSU46IGV2ZW50IGFyZ3VtZW50ICh1bmlvbikKKwkJCQl2b2lkIEdFTkVSSUMgKiBwVXNlckFyZ19wKQoreworCXRFcGxLZXJuZWwgRXBsUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJaW50IGlFcnI7CisKKwkvLyBibG9jayBhbnkgZnVydGhlciBjYWxsIHRvIHRoaXMgZnVuY3Rpb24sIGkuZS4gZW50ZXIgY3JpdGljYWwgc2VjdGlvbgorCWlFcnIgPSBkb3duX2ludGVycnVwdGlibGUoJlNlbWFwaG9yZUNiRXZlbnRfZyk7CisJaWYgKGlFcnIgIT0gMCkgewkvLyB3YWl0aW5nIHdhcyBpbnRlcnJ1cHRlZCBieSBzaWduYWwKKwkJRXBsUmV0ID0ga0VwbFNodXRkb3duOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIHdhaXQgZm9yIEVwbEFwaVByb2Nlc3MoKSB0byBjYWxsIGlvY3RsCisJLy8gbm9ybWFsbHkgaXQgc2hvdWxkIGJlIHdhaXRpbmcgYWxyZWFkeSBmb3IgdXMgdG8gcGFzcyBhIG5ldyBldmVudAorCWlFcnIgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoV2FpdFF1ZXVlQ2JFdmVudF9nLAorCQkJCQkoYXRvbWljX3JlYWQoJkF0b21pY0V2ZW50U3RhdGVfZykgPT0KKwkJCQkJIEVWRU5UX1NUQVRFX0lPQ1RMKQorCQkJCQl8fCAoYXRvbWljX3JlYWQoJkF0b21pY0V2ZW50U3RhdGVfZykgPT0KKwkJCQkJICAgIEVWRU5UX1NUQVRFX1RFUk0pKTsKKwlpZiAoKGlFcnIgIT0gMCkgfHwgKGF0b21pY19yZWFkKCZBdG9taWNFdmVudFN0YXRlX2cpID09IEVWRU5UX1NUQVRFX1RFUk0pKSB7CS8vIHdhaXRpbmcgd2FzIGludGVycnVwdGVkIGJ5IHNpZ25hbAorCQlFcGxSZXQgPSBrRXBsU2h1dGRvd247CisJCWdvdG8gTGVhdmVDcml0aWNhbFNlY3Rpb247CisJfQorCS8vIHNhdmUgZXZlbnQgaW5mb3JtYXRpb24gZm9yIGlvY3RsCisJRXZlbnRUeXBlX2cgPSBFdmVudFR5cGVfcDsKKwlwRXZlbnRBcmdfZyA9IHBFdmVudEFyZ19wOworCisJLy8gcGFzcyBjb250cm9sIHRvIGFwcGxpY2F0aW9uJ3MgZXZlbnQgY2FsbGJhY2sgZnVuY3Rpb24sIGkuZS4gRXBsQXBpUHJvY2VzcygpCisJYXRvbWljX3NldCgmQXRvbWljRXZlbnRTdGF0ZV9nLCBFVkVOVF9TVEFURV9SRUFEWSk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZXYWl0UXVldWVQcm9jZXNzX2cpOworCisJLy8gbm93LCB0aGUgYXBwbGljYXRpb24ncyBldmVudCBjYWxsYmFjayBmdW5jdGlvbiBwcm9jZXNzZXMgdGhlIGV2ZW50CisKKwkvLyB3YWl0IGZvciBjb21wbGV0aW9uIG9mIGFwcGxpY2F0aW9uJ3MgZXZlbnQgY2FsbGJhY2sgZnVuY3Rpb24sIGkuZS4gRXBsQXBpUHJvY2VzcygpIGNhbGxzIGlvY3RsIGFnYWluCisJaUVyciA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShXYWl0UXVldWVDYkV2ZW50X2csCisJCQkJCShhdG9taWNfcmVhZCgmQXRvbWljRXZlbnRTdGF0ZV9nKSA9PQorCQkJCQkgRVZFTlRfU1RBVEVfSU9DVEwpCisJCQkJCXx8IChhdG9taWNfcmVhZCgmQXRvbWljRXZlbnRTdGF0ZV9nKSA9PQorCQkJCQkgICAgRVZFTlRfU1RBVEVfVEVSTSkpOworCWlmICgoaUVyciAhPSAwKSB8fCAoYXRvbWljX3JlYWQoJkF0b21pY0V2ZW50U3RhdGVfZykgPT0gRVZFTlRfU1RBVEVfVEVSTSkpIHsJLy8gd2FpdGluZyB3YXMgaW50ZXJydXB0ZWQgYnkgc2lnbmFsCisJCUVwbFJldCA9IGtFcGxTaHV0ZG93bjsKKwkJZ290byBMZWF2ZUNyaXRpY2FsU2VjdGlvbjsKKwl9CisJLy8gcmVhZCByZXR1cm4gY29kZSBmcm9tIGFwcGxpY2F0aW9uJ3MgZXZlbnQgY2FsbGJhY2sgZnVuY3Rpb24KKwlFcGxSZXQgPSBSZXRDYkV2ZW50X2c7CisKKyAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uOgorCXVwKCZTZW1hcGhvcmVDYkV2ZW50X2cpOworCisgICAgICBFeGl0OgorCS8vIGNoZWNrIGlmIE5NVF9HU19PRkYgaXMgcmVhY2hlZAorCWlmIChFdmVudFR5cGVfcCA9PSBrRXBsQXBpRXZlbnRObXRTdGF0ZUNoYW5nZSkgeworCQlpZiAocEV2ZW50QXJnX3AtPm1fTm10U3RhdGVDaGFuZ2UubV9OZXdObXRTdGF0ZSA9PSBrRXBsTm10R3NPZmYpIHsJLy8gTk1UIHN0YXRlIG1hY2hpbmUgd2FzIHNodXQgZG93bgorCQkJVFJBQ0UwKCJFUEw6ICAgRXBsTGluQ2JFdmVudChOTVRfR1NfT0ZGKVxuIik7CisJCQl1aUVwbFN0YXRlX2cgPSBFUExfU1RBVEVfU0hVVERPV047CisJCQlhdG9taWNfc2V0KCZBdG9taWNFdmVudFN0YXRlX2csIEVWRU5UX1NUQVRFX1RFUk0pOworCQkJd2FrZV91cCgmV2FpdFF1ZXVlUmVsZWFzZV9nKTsKKwkJfSBlbHNlIHsJLy8gTk1UIHN0YXRlIG1hY2hpbmUgaXMgcnVubmluZworCQkJdWlFcGxTdGF0ZV9nID0gRVBMX1NUQVRFX1JVTk5JTkc7CisJCX0KKwl9CisKKwlyZXR1cm4gRXBsUmV0OworfQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxMaW5DYlN5bmModm9pZCkKK3sKKwl0RXBsS2VybmVsIEVwbFJldCA9IGtFcGxTdWNjZXNzZnVsOworCWludCBpRXJyOworCisJLy8gY2hlY2sgaWYgdXNlciBwcm9jZXNzIHdhaXRzIGZvciBzeW5jCisJaWYgKGF0b21pY19yZWFkKCZBdG9taWNTeW5jU3RhdGVfZykgPT0gRVZFTlRfU1RBVEVfSU9DVEwpIHsKKwkJLy8gcGFzcyBjb250cm9sIHRvIGFwcGxpY2F0aW9uLCBpLmUuIEVwbEFwaVByb2Nlc3NJbWFnZUV4Y2hhbmdlSW4oKQorCQlhdG9taWNfc2V0KCZBdG9taWNTeW5jU3RhdGVfZywgRVZFTlRfU1RBVEVfUkVBRFkpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJldhaXRRdWV1ZVBJX0luX2cpOworCisJCS8vIG5vdywgdGhlIGFwcGxpY2F0aW9uIHByb2Nlc3NlcyB0aGUgc3luYyBldmVudAorCisJCS8vIHdhaXQgZm9yIGNhbGwgb2YgRXBsQXBpUHJvY2Vzc0ltYWdlRXhjaGFuZ2VPdXQoKQorCQlpRXJyID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKFdhaXRRdWV1ZUNiU3luY19nLAorCQkJCQkJKGF0b21pY19yZWFkKCZBdG9taWNTeW5jU3RhdGVfZykKKwkJCQkJCSA9PSBFVkVOVF9TVEFURV9JT0NUTCkKKwkJCQkJCXx8CisJCQkJCQkoYXRvbWljX3JlYWQoJkF0b21pY1N5bmNTdGF0ZV9nKQorCQkJCQkJID09IEVWRU5UX1NUQVRFX1RFUk0pKTsKKwkJaWYgKChpRXJyICE9IDApIHx8IChhdG9taWNfcmVhZCgmQXRvbWljRXZlbnRTdGF0ZV9nKSA9PSBFVkVOVF9TVEFURV9JT0NUTCkpIHsJLy8gd2FpdGluZyB3YXMgaW50ZXJydXB0ZWQgYnkgc2lnbmFsIG9yIGFwcGxpY2F0aW9uIGNhbGxlZCB3cm9uZyBmdW5jdGlvbgorCQkJRXBsUmV0ID0ga0VwbFNodXRkb3duOworCQl9CisJfSBlbHNlIHsJCS8vIGFwcGxpY2F0aW9uIGlzIGN1cnJlbnRseSBub3Qgd2FpdGluZyBmb3Igc3luYworCQkvLyBjb250aW51ZSB3aXRob3V0IGludGVycnVwdGlvbgorCQkvLyBUUERPIGFyZSBzZXQgdmFsaWQgYnkgY2FsbGVyIChpLmUuIEVwbEV2ZW50a1Byb2Nlc3MoKSkKKwl9CisKKwlUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgxKTsKKworCXJldHVybiBFcGxSZXQ7Cit9CisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxBcGlQcm9jZXNzSW1hZ2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsQXBpUHJvY2Vzc0ltYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIyZmRmMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsQXBpUHJvY2Vzc0ltYWdlLmMKQEAgLTAsMCArMSwzNDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgRVBMIEFQSSBtb2R1bGUgKHByb2Nlc3MgaW1hZ2UpCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsQXBpUHJvY2Vzc0ltYWdlLmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjcgJCAgJERhdGU6IDIwMDgvMTEvMTMgMTc6MTM6MDkgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8xMC8xMCBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJFcGwuaCIKKy8vI2luY2x1ZGUgImtlcm5lbC9FcGxQZG9rQ2FsLmgiCisKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfTElOVVhfKSAmJiBkZWZpbmVkKF9fS0VSTkVMX18pCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgQyBMIEEgUyBTICBFcGxBcGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiAoKEVQTF9BUElfUFJPQ0VTU19JTUFHRV9TSVpFX0lOID4gMCkgfHwgKEVQTF9BUElfUFJPQ0VTU19JTUFHRV9TSVpFX09VVCA+IDApKQordHlwZWRlZiBzdHJ1Y3QgeworI2lmIEVQTF9BUElfUFJPQ0VTU19JTUFHRV9TSVpFX0lOID4gMAorCUJZVEUgbV9hYlByb2Nlc3NJbWFnZUlucHV0W0VQTF9BUElfUFJPQ0VTU19JTUFHRV9TSVpFX0lOXTsKKyNlbmRpZgorI2lmIEVQTF9BUElfUFJPQ0VTU19JTUFHRV9TSVpFX09VVCA+IDAKKwlCWVRFIG1fYWJQcm9jZXNzSW1hZ2VPdXRwdXRbRVBMX0FQSV9QUk9DRVNTX0lNQUdFX1NJWkVfT1VUXTsKKyNlbmRpZgorCit9IHRFcGxBcGlQcm9jZXNzSW1hZ2VJbnN0YW5jZTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsQXBpUHJvY2Vzc0ltYWdlSW5zdGFuY2UgRXBsQXBpUHJvY2Vzc0ltYWdlSW5zdGFuY2VfZzsKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEFwaVByb2Nlc3NJbWFnZVNldHVwKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogc2V0cyB1cCBzdGF0aWMgcHJvY2VzcyBpbWFnZQorLy8KKy8vIFBhcmFtZXRlcnM6ICAobm9uZSkKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEFwaVByb2Nlc3NJbWFnZVNldHVwKHZvaWQpCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKyNpZiAoKEVQTF9BUElfUFJPQ0VTU19JTUFHRV9TSVpFX0lOID4gMCkgfHwgKEVQTF9BUElfUFJPQ0VTU19JTUFHRV9TSVpFX09VVCA+IDApKQorCXVuc2lnbmVkIGludCB1aVZhckVudHJpZXM7CisJdEVwbE9iZFNpemUgT2JkU2l6ZTsKKyNlbmRpZgorCisjaWYgRVBMX0FQSV9QUk9DRVNTX0lNQUdFX1NJWkVfSU4gPiAwCisJdWlWYXJFbnRyaWVzID0gRVBMX0FQSV9QUk9DRVNTX0lNQUdFX1NJWkVfSU47CisJT2JkU2l6ZSA9IDE7CisJUmV0ID0gRXBsQXBpTGlua09iamVjdCgweDIwMDAsCisJCQkgICAgICAgRXBsQXBpUHJvY2Vzc0ltYWdlSW5zdGFuY2VfZy4KKwkJCSAgICAgICBtX2FiUHJvY2Vzc0ltYWdlSW5wdXQsICZ1aVZhckVudHJpZXMsICZPYmRTaXplLAorCQkJICAgICAgIDEpOworCisJdWlWYXJFbnRyaWVzID0gRVBMX0FQSV9QUk9DRVNTX0lNQUdFX1NJWkVfSU47CisJT2JkU2l6ZSA9IDE7CisJUmV0ID0gRXBsQXBpTGlua09iamVjdCgweDIwMDEsCisJCQkgICAgICAgRXBsQXBpUHJvY2Vzc0ltYWdlSW5zdGFuY2VfZy4KKwkJCSAgICAgICBtX2FiUHJvY2Vzc0ltYWdlSW5wdXQsICZ1aVZhckVudHJpZXMsICZPYmRTaXplLAorCQkJICAgICAgIDEpOworCisJT2JkU2l6ZSA9IDI7CisJdWlWYXJFbnRyaWVzID0gRVBMX0FQSV9QUk9DRVNTX0lNQUdFX1NJWkVfSU4gLyBPYmRTaXplOworCVJldCA9IEVwbEFwaUxpbmtPYmplY3QoMHgyMDEwLAorCQkJICAgICAgIEVwbEFwaVByb2Nlc3NJbWFnZUluc3RhbmNlX2cuCisJCQkgICAgICAgbV9hYlByb2Nlc3NJbWFnZUlucHV0LCAmdWlWYXJFbnRyaWVzLCAmT2JkU2l6ZSwKKwkJCSAgICAgICAxKTsKKworCU9iZFNpemUgPSAyOworCXVpVmFyRW50cmllcyA9IEVQTF9BUElfUFJPQ0VTU19JTUFHRV9TSVpFX0lOIC8gT2JkU2l6ZTsKKwlSZXQgPSBFcGxBcGlMaW5rT2JqZWN0KDB4MjAxMSwKKwkJCSAgICAgICBFcGxBcGlQcm9jZXNzSW1hZ2VJbnN0YW5jZV9nLgorCQkJICAgICAgIG1fYWJQcm9jZXNzSW1hZ2VJbnB1dCwgJnVpVmFyRW50cmllcywgJk9iZFNpemUsCisJCQkgICAgICAgMSk7CisKKwlPYmRTaXplID0gNDsKKwl1aVZhckVudHJpZXMgPSBFUExfQVBJX1BST0NFU1NfSU1BR0VfU0laRV9JTiAvIE9iZFNpemU7CisJUmV0ID0gRXBsQXBpTGlua09iamVjdCgweDIwMjAsCisJCQkgICAgICAgRXBsQXBpUHJvY2Vzc0ltYWdlSW5zdGFuY2VfZy4KKwkJCSAgICAgICBtX2FiUHJvY2Vzc0ltYWdlSW5wdXQsICZ1aVZhckVudHJpZXMsICZPYmRTaXplLAorCQkJICAgICAgIDEpOworCisJT2JkU2l6ZSA9IDQ7CisJdWlWYXJFbnRyaWVzID0gRVBMX0FQSV9QUk9DRVNTX0lNQUdFX1NJWkVfSU4gLyBPYmRTaXplOworCVJldCA9IEVwbEFwaUxpbmtPYmplY3QoMHgyMDIxLAorCQkJICAgICAgIEVwbEFwaVByb2Nlc3NJbWFnZUluc3RhbmNlX2cuCisJCQkgICAgICAgbV9hYlByb2Nlc3NJbWFnZUlucHV0LCAmdWlWYXJFbnRyaWVzLCAmT2JkU2l6ZSwKKwkJCSAgICAgICAxKTsKKyNlbmRpZgorCisjaWYgRVBMX0FQSV9QUk9DRVNTX0lNQUdFX1NJWkVfT1VUID4gMAorCXVpVmFyRW50cmllcyA9IEVQTF9BUElfUFJPQ0VTU19JTUFHRV9TSVpFX09VVDsKKwlPYmRTaXplID0gMTsKKwlSZXQgPSBFcGxBcGlMaW5rT2JqZWN0KDB4MjAzMCwKKwkJCSAgICAgICBFcGxBcGlQcm9jZXNzSW1hZ2VJbnN0YW5jZV9nLgorCQkJICAgICAgIG1fYWJQcm9jZXNzSW1hZ2VPdXRwdXQsICZ1aVZhckVudHJpZXMsICZPYmRTaXplLAorCQkJICAgICAgIDEpOworCisJdWlWYXJFbnRyaWVzID0gRVBMX0FQSV9QUk9DRVNTX0lNQUdFX1NJWkVfT1VUOworCU9iZFNpemUgPSAxOworCVJldCA9IEVwbEFwaUxpbmtPYmplY3QoMHgyMDMxLAorCQkJICAgICAgIEVwbEFwaVByb2Nlc3NJbWFnZUluc3RhbmNlX2cuCisJCQkgICAgICAgbV9hYlByb2Nlc3NJbWFnZU91dHB1dCwgJnVpVmFyRW50cmllcywgJk9iZFNpemUsCisJCQkgICAgICAgMSk7CisKKwlPYmRTaXplID0gMjsKKwl1aVZhckVudHJpZXMgPSBFUExfQVBJX1BST0NFU1NfSU1BR0VfU0laRV9PVVQgLyBPYmRTaXplOworCVJldCA9IEVwbEFwaUxpbmtPYmplY3QoMHgyMDQwLAorCQkJICAgICAgIEVwbEFwaVByb2Nlc3NJbWFnZUluc3RhbmNlX2cuCisJCQkgICAgICAgbV9hYlByb2Nlc3NJbWFnZU91dHB1dCwgJnVpVmFyRW50cmllcywgJk9iZFNpemUsCisJCQkgICAgICAgMSk7CisKKwlPYmRTaXplID0gMjsKKwl1aVZhckVudHJpZXMgPSBFUExfQVBJX1BST0NFU1NfSU1BR0VfU0laRV9PVVQgLyBPYmRTaXplOworCVJldCA9IEVwbEFwaUxpbmtPYmplY3QoMHgyMDQxLAorCQkJICAgICAgIEVwbEFwaVByb2Nlc3NJbWFnZUluc3RhbmNlX2cuCisJCQkgICAgICAgbV9hYlByb2Nlc3NJbWFnZU91dHB1dCwgJnVpVmFyRW50cmllcywgJk9iZFNpemUsCisJCQkgICAgICAgMSk7CisKKwlPYmRTaXplID0gNDsKKwl1aVZhckVudHJpZXMgPSBFUExfQVBJX1BST0NFU1NfSU1BR0VfU0laRV9PVVQgLyBPYmRTaXplOworCVJldCA9IEVwbEFwaUxpbmtPYmplY3QoMHgyMDUwLAorCQkJICAgICAgIEVwbEFwaVByb2Nlc3NJbWFnZUluc3RhbmNlX2cuCisJCQkgICAgICAgbV9hYlByb2Nlc3NJbWFnZU91dHB1dCwgJnVpVmFyRW50cmllcywgJk9iZFNpemUsCisJCQkgICAgICAgMSk7CisKKwlPYmRTaXplID0gNDsKKwl1aVZhckVudHJpZXMgPSBFUExfQVBJX1BST0NFU1NfSU1BR0VfU0laRV9PVVQgLyBPYmRTaXplOworCVJldCA9IEVwbEFwaUxpbmtPYmplY3QoMHgyMDUxLAorCQkJICAgICAgIEVwbEFwaVByb2Nlc3NJbWFnZUluc3RhbmNlX2cuCisJCQkgICAgICAgbV9hYlByb2Nlc3NJbWFnZU91dHB1dCwgJnVpVmFyRW50cmllcywgJk9iZFNpemUsCisJCQkgICAgICAgMSk7CisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRnVuY3Rpb246ICAgIEVwbEFwaVByb2Nlc3NJbWFnZUV4Y2hhbmdlSW4oKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZXBsYWNlcyBwYXNzZWQgaW5wdXQgcHJvY2VzcyBpbWFnZSB3aXRoIHRoZSBvbmUgb2YgRVBMIHN0YWNrCisvLworLy8gUGFyYW1ldGVyczogIHBQSV9wICAgICAgICAgICAgICAgICAgID0gaW5wdXQgcHJvY2VzcyBpbWFnZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyBTdGF0ZToKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxBcGlQcm9jZXNzSW1hZ2VFeGNoYW5nZUluKHRFcGxBcGlQcm9jZXNzSW1hZ2UgKiBwUElfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisjaWYgRVBMX0FQSV9QUk9DRVNTX0lNQUdFX1NJWkVfSU4gPiAwCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX0xJTlVYXykgJiYgZGVmaW5lZChfX0tFUk5FTF9fKQorCWNvcHlfdG9fdXNlcihwUElfcC0+bV9wSW1hZ2UsCisJCSAgICAgRXBsQXBpUHJvY2Vzc0ltYWdlSW5zdGFuY2VfZy5tX2FiUHJvY2Vzc0ltYWdlSW5wdXQsCisJCSAgICAgbWluKHBQSV9wLT5tX3VpU2l6ZSwKKwkJCSBzaXplb2YoRXBsQXBpUHJvY2Vzc0ltYWdlSW5zdGFuY2VfZy4KKwkJCQltX2FiUHJvY2Vzc0ltYWdlSW5wdXQpKSk7CisjZWxzZQorCUVQTF9NRU1DUFkocFBJX3AtPm1fcEltYWdlLAorCQkgICBFcGxBcGlQcm9jZXNzSW1hZ2VJbnN0YW5jZV9nLm1fYWJQcm9jZXNzSW1hZ2VJbnB1dCwKKwkJICAgbWluKHBQSV9wLT5tX3VpU2l6ZSwKKwkJICAgICAgIHNpemVvZihFcGxBcGlQcm9jZXNzSW1hZ2VJbnN0YW5jZV9nLgorCQkJICAgICAgbV9hYlByb2Nlc3NJbWFnZUlucHV0KSkpOworI2VuZGlmCisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRnVuY3Rpb246ICAgIEVwbEFwaVByb2Nlc3NJbWFnZUV4Y2hhbmdlT3V0KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogY29waWVzIHBhc3NlZCBvdXRwdXQgcHJvY2VzcyBpbWFnZSB0byBFUEwgc3RhY2suCisvLworLy8gUGFyYW1ldGVyczogIHBQSV9wICAgICAgICAgICAgICAgICAgID0gb3V0cHV0IHByb2Nlc3MgaW1hZ2UKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsQXBpUHJvY2Vzc0ltYWdlRXhjaGFuZ2VPdXQodEVwbEFwaVByb2Nlc3NJbWFnZSAqIHBQSV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKyNpZiBFUExfQVBJX1BST0NFU1NfSU1BR0VfU0laRV9PVVQgPiAwCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX0xJTlVYXykgJiYgZGVmaW5lZChfX0tFUk5FTF9fKQorCWNvcHlfZnJvbV91c2VyKEVwbEFwaVByb2Nlc3NJbWFnZUluc3RhbmNlX2cubV9hYlByb2Nlc3NJbWFnZU91dHB1dCwKKwkJICAgICAgIHBQSV9wLT5tX3BJbWFnZSwKKwkJICAgICAgIG1pbihwUElfcC0+bV91aVNpemUsCisJCQkgICBzaXplb2YoRXBsQXBpUHJvY2Vzc0ltYWdlSW5zdGFuY2VfZy4KKwkJCQkgIG1fYWJQcm9jZXNzSW1hZ2VPdXRwdXQpKSk7CisjZWxzZQorCUVQTF9NRU1DUFkoRXBsQXBpUHJvY2Vzc0ltYWdlSW5zdGFuY2VfZy5tX2FiUHJvY2Vzc0ltYWdlT3V0cHV0LAorCQkgICBwUElfcC0+bV9wSW1hZ2UsCisJCSAgIG1pbihwUElfcC0+bV91aVNpemUsCisJCSAgICAgICBzaXplb2YoRXBsQXBpUHJvY2Vzc0ltYWdlSW5zdGFuY2VfZy4KKwkJCSAgICAgIG1fYWJQcm9jZXNzSW1hZ2VPdXRwdXQpKSk7CisjZW5kaWYKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxDZmcuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsQ2ZnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhlOTU4YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsQ2ZnLmgKQEAgLTAsMCArMSwxOTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBjb25maWd1cmF0aW9uIGZpbGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxDZmcuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgLi4uCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8wNiAgICBrLnQuOiBTdGFydCBvZiBJbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExDRkdfSF8KKyNkZWZpbmUgX0VQTENGR19IXworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBnZW5lcmljIGRlZmluZXMgd2hpY2ggZm9yIHdob2xlIEVQTCBTdGFjaworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2RlZmluZSBFUExfVVNFX0RFTEVURUlOU1RfRlVOQyBUUlVFCisKKy8vIG5lZWRlZCB0byBzdXBwb3J0IGRhdGF0eXBlcyBvdmVyIDMyIGJpdCBieSBnbG9iYWwuaAorI2RlZmluZSBVU0VfVkFSNjQKKworLy8gRVBMX01BWF9JTlNUQU5DRVMgc3BlY2lmaWVzIGNvdW50IG9mIGluc3RhbmNlcyBvZiBhbGwgRVBMIG1vZHVsZXMuCisvLyBJZiBpdCBpcyBncmVhdGVyIHRoYW4gMSB0aGUgZmlyc3QgcGFyYW1ldGVyIG9mIGFsbAorLy8gZnVuY3Rpb25zIGlzIHRoZSBpbnN0YW5jZSBudW1iZXIuCisjZGVmaW5lIEVQTF9NQVhfSU5TVEFOQ0VTICAgICAgICAgICAgICAgMQorCisvLyBUaGlzIGRlZmluZXMgdGhlIHRhcmdldCBoYXJkd2FyZS4gSGVyZSBpcyBlbmNvZGVkIHdpY2ggQ1BVIGFuZCB3aWNoIGV4dGVybmFsCisvLyBwZXJpcGhlcmFscyBhcmUgY29ubmVjdGVkLiBGb3IgcG9zc2libGUgdmFsdWVzIHJlZmVyZSB0byB0YXJnZXQuaC4gSWYKKy8vIG5lY2Vzc2FyeSB2YWx1ZSBpcyBub3QgYXZhaWxhYmxlIEVQTCBzdGFjayBoYXMgdG8KKy8vIGJlIGFkYXB0ZWQgYW5kIHRlc3RlZC4KKyNkZWZpbmUgVEFSR0VUX0hBUkRXQVJFICAgICAgICAgICAgICAgICBUR1RIV19QQ19XUkFQUAorCisvLyB1c2Ugbm8gRklGT3MsIG1ha2UgZGlyZWN0IGNhbGxzCisvLyNkZWZpbmUgRVBMX05PX0ZJRk8KKworLy8gdXNlIG5vIElQQyBiZXR3ZWVuIHVzZXItIGFuZCBrZXJuZWxzcGFjZSBtb2R1bGVzLCBtYWtlIGRpcmVjdCBjYWxscworI2RlZmluZSBFUExfTk9fVVNFUl9LRVJORUwKKworI2lmbmRlZiBCRU5DSE1BUktfTU9EVUxFUworI2RlZmluZSBCRU5DSE1BUktfTU9EVUxFUyAgICAgICAwCS8vMHhFRTgwMDA0MkwKKyNlbmRpZgorCisvLyBEZWZhdWx0IGRlZnVnIGxldmVsOgorLy8gT25seSBkZWJ1ZyB0cmFjZXMgb2YgdGhlc2UgbW9kdWxlcyB3aWxsIGJlIGNvbXBpbGVkIHdoaWNoIGZsYWdzIGFyZSBzZXQgaW4gZGVmaW5lIERFRl9ERUJVR19MVkwuCisjaWZuZGVmIERFRl9ERUJVR19MVkwKKyNkZWZpbmUgREVGX0RFQlVHX0xWTCAgICAgICAgICAgMHhFQzAwMDAwMEwKKyNlbmRpZgorLy8gICBFUExfREJHTFZMX09CRCAgICAgICAgID0gICAweDAwMDAwMDA0TAorLy8gKiBFUExfREJHTFZMX0FTU0VSVCAgICAgID0gICAweDIwMDAwMDAwTAorLy8gKiBFUExfREJHTFZMX0VSUk9SICAgICAgID0gICAweDQwMDAwMDAwTAorLy8gKiBFUExfREJHTFZMX0FMV0FZUyAgICAgID0gICAweDgwMDAwMDAwTAorCisvLyBFUExfTU9EVUxFX0lOVEVHUkFUSU9OIGRlZmluZXMgYWxsIG1vZHVsZXMgd2hpY2ggYXJlIGluY2x1ZGVkIGluCisvLyBFUEwgYXBwbGljYXRpb24uIFBsZWFzZSBhZGQgb3IgZGVsZXRlIG1vZHVsZXMgZm9yIHlvdXIgYXBwbGljYXRpb24uCisjZGVmaW5lIEVQTF9NT0RVTEVfSU5URUdSQVRJT04gRVBMX01PRFVMRV9PQkRLIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVQTF9NT0RVTEVfUERPSyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFUExfTU9EVUxFX05NVF9NTiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFUExfTU9EVUxFX1NET1MgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVBMX01PRFVMRV9TRE9DIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVQTF9NT0RVTEVfU0RPX0FTTkQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVBMX01PRFVMRV9TRE9fVURQIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVQTF9NT0RVTEVfTk1UX0NOIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVQTF9NT0RVTEVfTk1UVSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFUExfTU9EVUxFX05NVEsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVBMX01PRFVMRV9ETExLIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVQTF9NT0RVTEVfRExMVSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFUExfTU9EVUxFX1ZFVEgKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVBMX01PRFVMRV9PQkRVCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEVQTCBldGhlcm5ldCBkcml2ZXIgKEVkcnYpIHNwZWNpZmljIGRlZmluZXMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gc3dpdGNoIHRoaXMgZGVmaW5lIHRvIFRSVUUgaWYgRWRydiBzdXBwb3J0cyBmYXN0IHR4IGZyYW1lcworI2RlZmluZSBFRFJWX0ZBU1RfVFhGUkFNRVMgICAgICAgICAgICAgIEZBTFNFCisvLyNkZWZpbmUgRURSVl9GQVNUX1RYRlJBTUVTICAgICAgICAgICAgICBUUlVFCisKKy8vIHN3aXRjaCB0aGlzIGRlZmluZSB0byBUUlVFIGlmIEVkcnYgc3VwcG9ydHMgZWFybHkgcmVjZWl2ZSBpbnRlcnJ1cHRzCisjZGVmaW5lIEVEUlZfRUFSTFlfUlhfSU5UICAgICAgICAgICAgICAgRkFMU0UKKy8vI2RlZmluZSBFRFJWX0VBUkxZX1JYX0lOVCAgICAgICAgICAgICAgIFRSVUUKKworLy8gZW5hYmxlcyBzZXR0aW5nIG9mIHNldmVyYWwgcG9ydCBwaW5zIGZvciBiZW5jaG1hcmtpbmcgcHVycG9zZXMKKyNkZWZpbmUgRURSVl9CRU5DSE1BUksgICAgICAgICAgICAgICAgICBGQUxTRQorLy8jZGVmaW5lIEVEUlZfQkVOQ0hNQVJLICAgICAgICAgICAgICAgICAgVFJVRSAvLyBNQ0ZfR1BJT19QT0RSX1BDSUJSCisKKy8vIENhbGwgVHggaGFuZGxlciAoaS5lLiBFcGxEbGxDYkZyYW1lVHJhbnNtaXR0ZWQoKSkgYWxyZWFkeSBpZiBETUEgaGFzIGZpbmlzaGVkLAorLy8gb3RoZXJ3aXNlIGNhbGwgdGhlIFR4IGhhbmRsZXIgaWYgZnJhbWUgd2FzIGFjdHVhbGx5IHRyYW5zbWl0dGVkIG92ZXIgZXRoZXJuZXQuCisjZGVmaW5lIEVEUlZfRE1BX1RYX0hBTkRMRVIgICAgICAgICAgICAgRkFMU0UKKy8vI2RlZmluZSBFRFJWX0RNQV9UWF9IQU5ETEVSICAgICAgICAgICAgIFRSVUUKKworLy8gbnVtYmVyIG9mIHVzZWQgZXRoZXJuZXQgY29udHJvbGxlcgorLy8jZGVmaW5lIEVEUlZfVVNFRF9FVEhfQ1RSTCAgICAgICAgICAgICAgMQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBEYXRhIExpbmsgTGF5ZXIgKERMTCkgc3BlY2lmaWMgZGVmaW5lcworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBzd2l0Y2ggdGhpcyBkZWZpbmUgdG8gVFJVRSBpZiBFZHJ2IHN1cHBvcnRzIGZhc3QgdHggZnJhbWVzCisvLyBhbmQgRExMIHNoYWxsIHBhc3MgUFJlcyBhcyByZWFkeSB0byBFZHJ2IGFmdGVyIFNvQworI2RlZmluZSBFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfU09DICAgIEZBTFNFCisvLyNkZWZpbmUgRVBMX0RMTF9QUkVTX1JFQURZX0FGVEVSX1NPQyAgICBUUlVFCisKKy8vIHN3aXRjaCB0aGlzIGRlZmluZSB0byBUUlVFIGlmIEVkcnYgc3VwcG9ydHMgZmFzdCB0eCBmcmFtZXMKKy8vIGFuZCBETEwgc2hhbGwgcGFzcyBQUmVzIGFzIHJlYWR5IHRvIEVkcnYgYWZ0ZXIgU29BCisjZGVmaW5lIEVQTF9ETExfUFJFU19SRUFEWV9BRlRFUl9TT0EgICAgRkFMU0UKKy8vI2RlZmluZSBFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfU09BICAgIFRSVUUKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gT0JEIHNwZWNpZmljIGRlZmluZXMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gc3dpdGNoIHRoaXMgZGVmaW5lIHRvIFRSVUUgaWYgRXBsIHNob3VsZCBjb21wYXJlIG9iamVjdCByYW5nZQorLy8gYXV0b21hdGljbHkKKyNkZWZpbmUgRVBMX09CRF9DSEVDS19PQkpFQ1RfUkFOR0UgICAgICAgICAgRkFMU0UKKy8vI2RlZmluZSBFUExfT0JEX0NIRUNLX09CSkVDVF9SQU5HRSAgICAgICAgICBUUlVFCisKKy8vIHNldCB0aGlzIGRlZmluZSB0byBUUlVFIGlmIHRoZXJlIGFyZSBzdHJpbmdzIG9yIGRvbWFpbnMgaW4gT0QsIHdoaWNoCisvLyBtYXkgYmUgY2hhbmdlZCBpbiBvYmplY3Qgc2l6ZSBhbmQvb3Igb2JqZWN0IGRhdGEgcG9pbnRlciBieSBpdHMgb2JqZWN0CisvLyBjYWxsYmFjayBmdW5jdGlvbiAoY2FsbGVkIGV2ZW50IGtPYmRFdldyU3RyaW5nRG9tYWluKQorLy8jZGVmaW5lIEVQTF9PQkRfVVNFX1NUUklOR19ET01BSU5fSU5fUkFNICAgIEZBTFNFCisjZGVmaW5lIEVQTF9PQkRfVVNFX1NUUklOR19ET01BSU5fSU5fUkFNICAgIFRSVUUKKworI2RlZmluZSBFUExfT0JEX1VTRV9WQVJJQUJMRV9TVUJJTkRFWF9UQUIgVFJVRQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBUaW1lciBtb2R1bGUgc3BlY2lmaWMgZGVmaW5lcworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBpZiBUUlVFIGl0IHVzZXMgdGhlIFRpbWVyIG1vZHVsZSBpbXBsZW1lbnRhdGlvbiBvZiBFUEwgdXNlciBhbHNvIGluIEVQTCBrZXJuZWwKKyNkZWZpbmUgRVBMX1RJTUVSX1VTRV9VU0VSICAgICAgICAgICAgICBUUlVFCisKKy8vIGlmIFRSVUUgdGhlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lciBtb2R1bGUgd2lsbCBiZSB1c2VkCisjZGVmaW5lIEVQTF9USU1FUl9VU0VfSElHSFJFUyAgICAgICAgICAgICAgVFJVRQorLy8jZGVmaW5lIEVQTF9USU1FUl9VU0VfSElHSFJFUyAgICAgICAgICAgICAgRkFMU0UKKworI2VuZGlmIC8vX0VQTENGR19IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxEZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRjODEwOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRGVmLmgKQEAgLTAsMCArMSwzNTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIEVQTCBkZWZhdWx0IGNvbnN0YW50cworCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbERlZi5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4xNSAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA1LzIyIGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDEuMDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRVBMX0RFRl9IXworI2RlZmluZSBfRVBMX0RFRl9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBFUExfQ19BRFJfQlJPQURDQVNUICAgICAgICAgMHhGRgkvLyBFUEwgYnJvYWRjYXN0IGFkZHJlc3MKKyNkZWZpbmUgRVBMX0NfQURSX0RJQUdfREVGX05PREVfSUQgIDB4RkQJLy8gRVBMIGRlZmF1bHQgYWRkcmVzcyBvZiBkaWdub3N0aWMgZGV2aWNlCisjZGVmaW5lIEVQTF9DX0FEUl9EVU1NWV9OT0RFX0lEICAgICAweEZDCS8vIEVQTCBkdW1teSBub2RlIGFkZHJlc3MKKyNkZWZpbmUgRVBMX0NfQURSX0lOVkFMSUQgICAgICAgICAgIDB4MDAJLy8gaW52YWxpZCBFUEwgYWRkcmVzcworI2RlZmluZSBFUExfQ19BRFJfTU5fREVGX05PREVfSUQgICAgMHhGMAkvLyBFUEwgZGVmYXVsdCBhZGRyZXNzIG9mIE1OCisjZGVmaW5lIEVQTF9DX0FEUl9SVDFfREVGX05PREVfSUQgICAweEZFCS8vIEVQTCBkZWZhdWx0IGFkZHJlc3Mgb2Ygcm91dGVyIHR5cGUgMQorI2RlZmluZSBFUExfQ19ETExfQVNORF9QUklPX05NVFJRU1QgNwkvLyBpbmNyZWFzZWQgQVNuZCByZXF1ZXN0IHByaW9yaXR5IHRvIGJlIHVzZWQgYnkgTk1UIFJlcXVlc3RzCisjZGVmaW5lIEVQTF9DX0RMTF9BU05EX1BSSU9fU1REICAgICAwCS8vIHN0YW5kYXJkIEFTbmQgcmVxdWVzdCBwcmlvcml0eQorI2RlZmluZSBFUExfQ19ETExfRVRIRVJUWVBFX0VQTCAgICAgMHg4OEFCCisjZGVmaW5lIEVQTF9DX0RMTF9JU09DSFJfTUFYX1BBWUwgICAxNDkwCS8vIEJ5dGU6IG1heGltdW0gc2l6ZSBvZiBQUmVxIGFuZCBQUmVzIHBheWxvYWQgZGF0YSwgcmVxdWlyZXMgQ19JUF9NQVhfTVRVCisjZGVmaW5lIEVQTF9DX0RMTF9NQVhfQVNZTkNfTVRVICAgICAxNTAwCS8vIEJ5dGU6IG1heGltdW0gYXN5bmNocm9ub3VzIHBheWxvYWQgaW4gYnl0ZXMKKyNkZWZpbmUgRVBMX0NfRExMX01BWF9QQVlMX09GRlNFVCAgIDE0OTkJLy8gQnl0ZTogbWF4aW11bSBvZmZzZXQgb2YgRXRoZXJuZXQgZnJhbWUgcGF5bG9hZCwgcmVxdWlyZXMgQ19JUF9NQVhfTVRVCisjZGVmaW5lIEVQTF9DX0RMTF9NQVhfUlMgICAgICAgICAgICA3CisjZGVmaW5lIEVQTF9DX0RMTF9NSU5fQVNZTkNfTVRVICAgICAyODIJLy8gQnl0ZTogbWluaW11bSBhc3luY2hyb25vdXMgcGF5bG9hZCBpbiBieXRlcy4KKyNkZWZpbmUgRVBMX0NfRExMX01JTl9QQVlMX09GRlNFVCAgIDQ1CS8vIEJ5dGU6IG1pbmltdW0gb2Zmc2V0IG9mIEV0aGVybmV0IGZyYW1lIHBheWxvYWQKKyNkZWZpbmUgRVBMX0NfRExMX01VTFRJQ0FTVF9BU05EICAgIDB4MDExMTFFMDAwMDA0TEwJLy8gRVBMIEFTbmQgbXVsdGljYXN0IE1BQyBhZGRyZXNzLCBjYW5vbmljYWwgZm9ybQorI2RlZmluZSBFUExfQ19ETExfTVVMVElDQVNUX1BSRVMgICAgMHgwMTExMUUwMDAwMDJMTAkvLyBFUEwgUFJlcyBtdWx0aWNhc3QgTUFDIGFkZHJlc3MsIGNhbm9uaWNhbCBmb3JtCisjZGVmaW5lIEVQTF9DX0RMTF9NVUxUSUNBU1RfU09BICAgICAweDAxMTExRTAwMDAwM0xMCS8vIEVQTCBTb0EgbXVsdGljYXN0IE1BQyBhZGRyZXNzLCBjYW5vbmljYWwgZm9ybQorI2RlZmluZSBFUExfQ19ETExfTVVMVElDQVNUX1NPQyAgICAgMHgwMTExMUUwMDAwMDFMTAkvLyBFUEwgU29jIG11bHRpY2FzdCBNQUMgYWRkcmVzcywgY2Fub25pY2FsIGZvcm0KKyNkZWZpbmUgRVBMX0NfRExMX1BSRU9QMV9TVEFSVF9DWUNMRVMgMTAJLy8gbnVtYmVyIG9mIHVuYXNzaWduaW5nIFNvQSBmcmFtZXMgYXQgc3RhcnQgb2YgTk1UX01TX1BSRV9PUEVSQVRJT05BTF8xCisjZGVmaW5lIEVQTF9DX0RMTF9UX0JJVFRJTUUgICAgICAgICAxMAkvLyBuczogVHJhbnNtaXNzaW9uIHRpbWUgcGVyIGJpdCBvbiAxMDAgTWJpdC9zIG5ldHdvcmsKKyNkZWZpbmUgRVBMX0NfRExMX1RfRVBMX1BET19IRUFERVIgIDEwCS8vIEJ5dGU6IHNpemUgb2YgUFJlcSBhbmQgUFJlcyBFUEwgUERPIG1lc3NhZ2UgaGVhZGVyCisjZGVmaW5lIEVQTF9DX0RMTF9UX0VUSDJfV1JBUFBFUiAgICAxOAkvLyBCeXRlOiBzaXplIG9mIEV0aGVybmV0IHR5cGUgSUkgd3JhcHBlciBjb25zaXN0aW5nIG9mIGhlYWRlciBhbmQgY2hlY2tzdW0KKyNkZWZpbmUgRVBMX0NfRExMX1RfSUZHICAgICAgICAgICAgIDY0MAkvLyBuczogRXRoZXJuZXQgSW50ZXJmcmFtZSBHYXAKKyNkZWZpbmUgRVBMX0NfRExMX1RfTUlOX0ZSQU1FICAgICAgIDUxMjAJLy8gbnM6IFNpemUgb2YgbWluaW11bSBFdGhlcm5ldCBmcmFtZSAod2l0aG91dCBwcmVhbWJsZSkKKyNkZWZpbmUgRVBMX0NfRExMX1RfUFJFQU1CTEUgICAgICAgIDk2MAkvLyBuczogU2l6ZSBvZiBFdGhlcm5ldCBmcmFtZSBwcmVhbWJsZQorCisjZGVmaW5lIEVQTF9DX0RMTF9NSU5TSVpFX1NPQyAgICAgICAzNgkvLyBtaW5pbXVtIHNpemUgb2YgU29DIHdpdGhvdXQgcGFkZGluZyBhbmQgQ1JDCisjZGVmaW5lIEVQTF9DX0RMTF9NSU5TSVpFX1BSRVEgICAgICA2MAkvLyBtaW5pbXVtIHNpemUgb2YgUFJlYyB3aXRob3V0IENSQworI2RlZmluZSBFUExfQ19ETExfTUlOU0laRV9QUkVTICAgICAgNjAJLy8gbWluaW11bSBzaXplIG9mIFBSZXMgd2l0aG91dCBDUkMKKyNkZWZpbmUgRVBMX0NfRExMX01JTlNJWkVfU09BICAgICAgIDI0CS8vIG1pbmltdW0gc2l6ZSBvZiBTb0Egd2l0aG91dCBwYWRkaW5nIGFuZCBDUkMKKyNkZWZpbmUgRVBMX0NfRExMX01JTlNJWkVfSURFTlRSRVMgIDE3NgkvLyBtaW5pbXVtIHNpemUgb2YgSWRlbnRSZXNwb25zZSB3aXRob3V0IENSQworI2RlZmluZSBFUExfQ19ETExfTUlOU0laRV9TVEFUVVNSRVMgNzIJLy8gbWluaW11bSBzaXplIG9mIFN0YXR1c1Jlc3BvbnNlIHdpdGhvdXQgQ1JDCisjZGVmaW5lIEVQTF9DX0RMTF9NSU5TSVpFX05NVENNRCAgICAyMAkvLyBtaW5pbXVtIHNpemUgb2YgTm10Q29tbWFuZCB3aXRob3V0IENvbW1hbmREYXRhLCBwYWRkaW5nIGFuZCBDUkMKKyNkZWZpbmUgRVBMX0NfRExMX01JTlNJWkVfTk1UQ01ERVhUIDUyCS8vIG1pbmltdW0gc2l6ZSBvZiBObXRDb21tYW5kIHdpdGhvdXQgcGFkZGluZyBhbmQgQ1JDCisjZGVmaW5lIEVQTF9DX0RMTF9NSU5TSVpFX05NVFJFUSAgICAyMAkvLyBtaW5pbXVtIHNpemUgb2YgTm10UmVxdWVzdCB3aXRob3V0IENvbW1hbmREYXRhLCBwYWRkaW5nIGFuZCBDUkMKKyNkZWZpbmUgRVBMX0NfRExMX01JTlNJWkVfTk1UUkVRRVhUIDUyCS8vIG1pbmltdW0gc2l6ZSBvZiBObXRSZXF1ZXN0IHdpdGhvdXQgcGFkZGluZyBhbmQgQ1JDCisKKyNkZWZpbmUgRVBMX0NfRVJSX01PTklUT1JfREVMQVkgICAgIDEwCS8vIEVycm9yIG1vbml0b3Jpbmcgc3RhcnQgZGVsYXkgKG5vdCB1c2VkIGluIERTIDEuMC4wKQorI2RlZmluZSBFUExfQ19JUF9BRFJfSU5WQUxJRCAgICAgICAgMHgwMDAwMDAwMEwJLy8gaW52YWxpZCBJUCBhZGRyZXNzICgwLjAuMC4wKSB1c2VkIHRvIGluZGljYXRlIG5vIGNoYW5nZQorI2RlZmluZSBFUExfQ19JUF9JTlZBTElEX01UVSAgICAgICAgMAkvLyBCeXRlOiBpbnZhbGlkIE1UVSBzaXplIHVzZWQgdG8gaW5kaWNhdGUgbm8gY2hhbmdlCisjZGVmaW5lIEVQTF9DX0lQX01BWF9NVFUgICAgICAgICAgICAxNTE4CS8vIEJ5dGU6IG1heGltdW0gc2l6ZSBpbiBieXRlcyBvZiB0aGUgSVAgc3RhY2sgd2hpY2ggbXVzdCBiZSBwcm9jZXNzZWQuCisjZGVmaW5lIEVQTF9DX0lQX01JTl9NVFUgICAgICAgICAgICAzMDAJLy8gQnl0ZTogbWluaW11bSBzaXplIGluIGJ5dGVzIG9mIHRoZSBJUCBzdGFjayB3aGljaCBtdXN0IGJlIHByb2Nlc3NlZC4KKyNkZWZpbmUgRVBMX0NfTk1UX1NUQVRFX1RPTEVSQU5DRSAgIDUJLy8gQ3ljbGVzOiBtYXhpbXVtIHJlYWN0aW9uIHRpbWUgdG8gTk1UIHN0YXRlIGNvbW1hbmRzCisjZGVmaW5lIEVQTF9DX05NVF9TVEFUUkVRX0NZQ0xFICAgICA1CS8vIHNlYzogU3RhdHVzUmVxdWVzdCBjeWNsZSB0aW1lIHRvIGJlIGFwcGxpZWQgdG8gQXN5bmNPbmx5IENOcworI2RlZmluZSBFUExfQ19TRE9fRVBMX1BPUlQgICAgICAgICAgMzgxOQorCisjZGVmaW5lIEVQTF9DX0RMTF9NQVhfQVNORF9TRVJWSUNFX0lEUyAgNQkvLyBzZWUgdEVwbERsbEFzbmRTZXJ2aWNlSWQgaW4gRXBsRGxsLmgKKworLy8gRGVmYXVsdCBjb25maWd1cmF0aW9uCisvLyA9PT09PT09PT09PT09PT09PT09PT09CisKKyNpZm5kZWYgRVBMX0RfUERPX0dyYW51bGFyaXR5X1U4CisjZGVmaW5lIEVQTF9EX1BET19HcmFudWxhcml0eV9VOCAgICA4CS8vIG1pbmltdW0gc2l6ZSBvZiBvYmplY3RzIHRvIGJlIG1hcHBlZCBpbiBiaXRzIFVOU0lHTkVEOCBPIE8gMSAxCisjZW5kaWYKKworI2lmbmRlZiBFUExfTk1UX01BWF9OT0RFX0lECisjZGVmaW5lIEVQTF9OTVRfTUFYX05PREVfSUQgICAgICAgICAyNTQJLy8gbWF4aW11bSBub2RlLUlECisjZW5kaWYKKworI2lmbmRlZiBFUExfRF9OTVRfTWF4Q05OdW1iZXJfVTgKKyNkZWZpbmUgRVBMX0RfTk1UX01heENOTnVtYmVyX1U4ICAgIDIzOQkvLyBtYXhpbXVtIG51bWJlciBvZiBzdXBwb3J0ZWQgcmVndWxhciBDTnMgaW4gdGhlIE5vZGUgSUQgcmFuZ2UgMSAuLiAyMzkgVU5TSUdORUQ4IE8gTyAyMzkgMjM5CisjZW5kaWYKKworLy8gZGVmaW5lcyBmb3IgRVBMIEFQSSBsYXllciBzdGF0aWMgcHJvY2VzcyBpbWFnZQorI2lmbmRlZiBFUExfQVBJX1BST0NFU1NfSU1BR0VfU0laRV9JTgorI2RlZmluZSBFUExfQVBJX1BST0NFU1NfSU1BR0VfU0laRV9JTiAgIDAKKyNlbmRpZgorCisjaWZuZGVmIEVQTF9BUElfUFJPQ0VTU19JTUFHRV9TSVpFX09VVAorI2RlZmluZSBFUExfQVBJX1BST0NFU1NfSU1BR0VfU0laRV9PVVQgIDAKKyNlbmRpZgorCisvLyBjb25maWd1cmUgd2hldGhlciBPRCBhY2Nlc3MgZXZlbnRzIHNoYWxsIGJlIGZvcndhcmRlZAorLy8gdG8gdXNlciBjYWxsYmFjayBmdW5jdGlvbi4KKy8vIEJlY2F1c2Ugb2YgcmVlbnRyYW5jeSBmb3IgbG9jYWwgT0QgYWNjZXNzZXMsIHRoaXMgaGFzIHRvIGJlIGRpc2FibGVkCisvLyB3aGVuIGFwcGxpY2F0aW9uIHJlc2lkZXMgaW4gb3RoZXIgYWRkcmVzcyBzcGFjZSBhcyB0aGUgc3RhY2sgKGUuZy4gaWYKKy8vIEVwbEFwaUxpbnV4VXNlci5jIGFuZCBFcGxBcGlMaW51eEtlcm5lbC5jIGFyZSB1c2VkKQorI2lmbmRlZiBFUExfQVBJX09CRF9GT1JXQVJEX0VWRU5UCisjZGVmaW5lIEVQTF9BUElfT0JEX0ZPUldBUkRfRVZFTlQgICAgICAgVFJVRQorI2VuZGlmCisKKyNpZm5kZWYgRVBMX09CRF9NQVhfU1RSSU5HX1NJWkUKKyNkZWZpbmUgRVBMX09CRF9NQVhfU1RSSU5HX1NJWkUgICAgICAgIDMyCS8vIGlzIHVzZWQgZm9yIG9iamVjdHMgMHgxMDA4LzB4MTAwOS8weDEwMEEKKyNlbmRpZgorCisjaWZuZGVmIEVQTF9PQkRfVVNFX1NUT1JFX1JFU1RPUkUKKyNkZWZpbmUgRVBMX09CRF9VU0VfU1RPUkVfUkVTVE9SRSAgICAgICBGQUxTRQorI2VuZGlmCisKKyNpZm5kZWYgRVBMX09CRF9DSEVDS19PQkpFQ1RfUkFOR0UKKyNkZWZpbmUgRVBMX09CRF9DSEVDS19PQkpFQ1RfUkFOR0UgICAgICBUUlVFCisjZW5kaWYKKworI2lmbmRlZiBFUExfT0JEX1VTRV9TVFJJTkdfRE9NQUlOX0lOX1JBTQorI2RlZmluZSBFUExfT0JEX1VTRV9TVFJJTkdfRE9NQUlOX0lOX1JBTSAgICBUUlVFCisjZW5kaWYKKworI2lmbmRlZiBFUExfT0JEX1VTRV9WQVJJQUJMRV9TVUJJTkRFWF9UQUIKKyNkZWZpbmUgRVBMX09CRF9VU0VfVkFSSUFCTEVfU1VCSU5ERVhfVEFCICAgVFJVRQorI2VuZGlmCisKKyNpZm5kZWYgRVBMX09CRF9VU0VfS0VSTkVMCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRVKSkgPT0gMCkKKyNkZWZpbmUgRVBMX09CRF9VU0VfS0VSTkVMICAgICAgICAgICAgICAgICAgVFJVRQorI2Vsc2UKKyNkZWZpbmUgRVBMX09CRF9VU0VfS0VSTkVMICAgICAgICAgICAgICAgICAgRkFMU0UKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgRVBMX09CRF9JTkNMVURFX0EwMDBfVE9fREVWSUNFX1BBUlQKKyNkZWZpbmUgRVBMX09CRF9JTkNMVURFX0EwMDBfVE9fREVWSUNFX1BBUlQgRkFMU0UKKyNlbmRpZgorCisjaWZuZGVmIEVQTF9WRVRIX05BTUUKKyNkZWZpbmUgRVBMX1ZFVEhfTkFNRSAgICAgICAiZXBsIgkvLyBuYW1lIG9mIG5ldCBkZXZpY2UgaW4gTGludXgKKyNlbmRpZgorCisvKgorI2RlZmluZSBFUExfRF9DRkdfQ29uZmlnTWFuYWdlcl9CT09MIC8vIEFiaWxpdHkgb2YgYSBNTiBub2RlIHRvIHBlcmZvcm0gQ29uZmlndXJhdGlvbiBNYW5hZ2VyIGZ1bmN0aW9ucyBCT09MRUFOIE8gLSBOIC0KKyNkZWZpbmUgRVBMX0RfQ0ZNX1ZlcmlmeUNvbmZfQk9PTCAgIC8vIFN1cHBvcnQgb2Ygb2JqZWN0cyBDRk1fVmVyaWZ5Q29uZmlndXJhdGlvbl9SRUMsIENGTV9FeHBDb25mRGF0ZUxpc3RfQVUzMiwgQ0ZNX0V4cENvbmZUaW1lTGlzdF9BVTMyIEJPT0xFQU4gTyBPIE4gTgorI2RlZmluZSBFUExfRF9DRk1fVmVyaWZ5Q29uZklkX0JPT0wgLy8gU3VwcG9ydCBvZiBvYmplY3RzIENGTV9WZXJpZnlDb25maWd1cmF0aW9uX1JFQy5Db25mSWRfVTMyIGFuZCBDRk1fRXhwQ29uZklkTGlzdF9BVTMyIEJPT0xFQU4gTyBPIE4gTgorI2RlZmluZSBFUExfRF9ETExfQ05GZWF0dXJlSXNvY2hyX0JPT0wgLy8gQ06ScyBhYmlsaXR5IHRvIHBlcmZvcm0gaXNvY2hyb25vdXMgZnVuY3Rpb25zIEJPT0xFQU4gLSBPIC0gWQorI2RlZmluZSBFUExfRF9ETExfQ05GZWF0dXJlTXVsdGlwbGV4X0JPT0wgLy8gbm9kZZJzIGFiaWxpdHkgdG8gcGVyZm9ybSBjb250cm9sIG9mIG11bHRpcGxleGVkIGlzb2Nocm9ub3VzIGNvbW11bmljYXRpb24gQk9PTEVBTiAtIE8gLSBOCisjZGVmaW5lIEVQTF9EX0RMTF9GZWF0dXJlQ05fQk9PTCAvLyBub2RlknMgYWJpbGl0eSB0byBwZXJmb3JtIENOIGZ1bmN0aW9ucyBCT09MRUFOIE8gTyBZIFkKKyNkZWZpbmUgRVBMX0RfRExMX0ZlYXR1cmVNTl9CT09MIC8vIG5vZGWScyBhYmlsaXR5IHRvIHBlcmZvcm0gTU4gZnVuY3Rpb25zIEJPT0xFQU4gTSBPIC0gTgorI2RlZmluZSBFUExfRF9ETExfTU5GZWF0dXJlTXVsdGlwbGV4X0JPT0wgLy8gTU6ScyBhYmlsaXR5IHRvIHBlcmZvcm0gY29udHJvbCBvZiBtdWx0aXBsZXhlZCBpc29jaHJvbm91cyBjb21tdW5pY2F0aW9uIEJPT0xFQU4gTyAtIFkgLQorI2RlZmluZSBFUExfRF9ETExfTU5GZWF0dXJlUFJlc1R4X0JPT0wgLy8gTU6ScyBhYmlsaXR5IHRvIHRyYW5zbWl0IFBSZXMgQk9PTEVBTiBPIC0gWSAtCisjZGVmaW5lIEVQTF9EX05NVF9BU25kUnhNYXhQYXlsb2FkX1UxNiAvLyBzaXplIG9mIEFTbmQgZnJhbWUgcmVjZWl2ZSBidWZmZXIgVU5TSUdORUQxNiBNIE0gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9BU25kVHhNYXhQYXlsb2FkX1UxNiAvLyBzaXplIG9mIEFTbmQgZnJhbWUgdHJhbnNtaXQgYnVmZmVyIFVOU0lHTkVEMTYgTSBNIC0gLQorI2RlZmluZSBFUExfRF9OTVRfQ05BU25kMlNvQ19VMzIgLy8gbWluaW11bSBkZWxheSBiZXR3ZWVuIGVuZCBvZiByZWNlcHRpb24gb2YgQVNuZCBhbmQgc3RhcnQgb2YgcmVjZXB0aW9uIG9mIFNvQyBVTlNJR05FRDMyIC0gTSAtIC0KKyNkZWZpbmUgRVBMX0RfTk1UX0NOQVNuZE1heExhdGVuY3lfVTMyIC8vIGRlbGF5IGJldHdlZW4gZW5kIG9mIFNvQSByZWNlcHRpb24gYW5kIHN0YXJ0IG9mIEFTbmQgdHJhbnNtaXNzaW9uIFVOU0lHTkVEMzIgLSBNIC0gLQorI2RlZmluZSBFUExfRF9OTVRfQ05QUmVzTWF4TGF0ZW5jeV9VMzIgLy8gZGVsYXkgYmV0d2VlbiBlbmQgb2YgUFJlcSByZWNlcHRpb24gYW5kIHN0YXJ0IG9mIFBSZXMgdHJhbnNtaXNzaW9uIFVOU0lHTkVEMzIgLSBNIC0gLQorI2RlZmluZSBFUExfRF9OTVRfQ05Tb0MyUFJlcV9VMzIgLy8gQ04gU29DIGhhbmRsaW5nIG1heGltdW0gdGltZSwgYSBzdWJzZXF1ZW50IFBSZXEgd29uknQgYmUgaGFuZGxlZCBiZWZvcmUgU29DIGhhbmRsaW5nIHdhcyBmaW5pc2hlZCBVTlNJR05FRDMyIC0gTSAtIC0KKyNkZWZpbmUgRVBMX0RfTk1UX0RldmljZVR5cGVfVTMyIC8vIERldmljZSBUeXBlIElEIFVOU0lHTkVEMzIgTSBNIC0gLQorI2RlZmluZSBFUExfRF9OTVRfRVBMVmVyc19VOCBFUEwgLy8gVmVyc2lvbiBpbXBsZW1lbnRlZCBieSB0aGUgZGV2aWNlIFVOU0lHTkVEOCBNIE0gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9FeHRTdGF0ZUNtZF9CT09MIC8vIGFiaXRpbHR5IHRvIHN1cHBvcnQgRXh0ZW5kZWQgTk1UIFN0YXRlIENvbW1hbmRzIEJPT0xFQU4gTyBPIFkgWQorI2RlZmluZSBFUExfRF9OTVRfSW5mb1N2Y19CT09MIC8vIGFiaWxpdHkgdG8gc3VwcG9ydCBOTVQgSW5mbyBTZXJ2aWNlcyBCT09MRUFOIE8gLSBZIC0KKyNkZWZpbmUgRVBMX0RfTk1UX0ludGVyZmFjZUFkZHJfWGhfT1NUUiAvLyBQaHlzaWNhbCBBZGRyZXNzIG9mIEludGVyZmFjZSBOby4gWGggT0NURVRfU1RSSU5HIE0gTSAtIC0KKyNkZWZpbmUgRVBMX0RfTk1UX0ludGVyZmFjZURlc2NyX1hoX1ZTVFIgLy8gRGVzY3JpcHRpb24gdGV4dCBvZiBJbnRlcmZhY2UgTm8uIFhoIFZJU0lCTEVfU1RSSU5HTSBNIC0gLQorI2RlZmluZSBFUExfRF9OTVRfSW50ZXJmYWNlTXR1X1hoX1UzMiAvLyBNVFUgb2YgSW50ZXJmYWNlIE5vLiBYaCBVTlNJR05FRDMyIE0gTSAtIC0KKyNkZWZpbmUgRVBMX0RfTk1UX0ludGVyZmFjZVR5cGVfWGhfVTggLy8gVHlwZSBvZiBJbnRlcmZhY2UgTm8uIFhoIFVOU0lHTkVEOCBNIE0gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9Jc29jaHJSeE1heFBheWxvYWRfVTE2IC8vIHNpemUgb2YgaXNvY2hyb25vdXMgZnJhbWUgcmVjZWl2ZSBidWZmZXIgVU5TSUdORUQxNiBNIE0gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9Jc29jaHJUeE1heFBheWxvYWRfVTE2IC8vIHNpemUgb2YgaXNvY2hyb25vdXMgZnJhbWUgdHJhbnNtaXQgYnVmZmVyIFVOU0lHTkVEMTYgTSBNIC0gLQorI2RlZmluZSBFUExfRF9OTVRfTWFudWZhY3REZXZOYW1lX1ZTIC8vIE1hbnVmYWN0dXJlciBEZXZpY2UgTmFtZSBWSVNJQkxFX1NUUklORyBPIE8gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9NYW51ZmFjdEh3VmVyc19WUyAvLyBNYW51ZmFjdHVyZXIgSFcgdmVyc2lvbiBWSVNJQkxFX1NUUklORyBPIE8gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9NYW51ZmFjdFN3VmVyc19WUyAvLyBNYW51ZmFjdHVyZXIgU1cgdmVyc2lvbiBWSVNJQkxFX1NUUklORyBPIE8gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9NYXhDTk5vZGVJRF9VOCAvLyBtYXhpbXVtIE5vZGUgSUQgYXZhaWxhYmxlIGZvciByZWd1bGFyIENOcyB0aGUgZW50cnkgcHJvdmlkZXMgYW4gdXBwZXIgbGltaXQgdG8gdGhlIE5vZGVJRCBhdmFpbGFibGUgZm9yIGNyb3NzIHRyYWZmaWMgUERPIHJlY2VwdGlvbiBmcm9tIGEgcmVndWxhciBDTiBVTlNJR05FRDggTyBPIDIzOSAyMzkKKyNkZWZpbmUgRVBMX0RfTk1UX01heENOTnVtYmVyX1U4IC8vIG1heGltdW0gbnVtYmVyIG9mIHN1cHBvcnRlZCByZWd1bGFyIENOcyBpbiB0aGUgTm9kZSBJRCByYW5nZSAxIC4uIDIzOSBVTlNJR05FRDggTyBPIDIzOSAyMzkKKyNkZWZpbmUgRVBMX0RfTk1UX01heEhlYXJ0YmVhdHNfVTggLy8gbnVtYmVyIG9mIGd1YXJkIGNoYW5uZWxzIFVOU0lHTkVEOCBPIE8gMjU0IDI1NAorI2RlZmluZSBFUExfRF9OTVRfTU5BU25kMlNvQ19VMzIgLy8gbWluaW11bSBkZWxheSBiZXR3ZWVuIGVuZCBvZiByZWNlcHRpb24gb2YgQVNuZCBhbmQgc3RhcnQgb2YgdHJhbnNtaXNzaW9uIG9mIFNvQyBVTlNJR05FRDMyIE0gLSAtIC0KKyNkZWZpbmUgRVBMX0RfTk1UX01OTXVsdGlwbEN5Y01heF9VOCAvLyBtYXhpbXVtIG51bWJlciBvZiBFUEwgY3ljbGVzIHBlciBtdWx0aXBsZXhlZCBjeWNsZSBVTlNJR05FRDggTyAtIDAgLQorI2RlZmluZSBFUExfRF9OTVRfTU5QUmVzMlBSZXFfVTMyIC8vIGRlbGF5IGJldHdlZW4gZW5kIG9mIFBSZXMgcmVjZXB0aW9uIGFuZCBzdGFydCBvZiBQUmVxIHRyYW5zbWlzc2lvbiBVTlNJR05FRDMyIE0gLSAtIC0KKyNkZWZpbmUgRVBMX0RfTk1UX01OUFJlczJQUmVzX1UzMiAvLyBkZWxheSBiZXR3ZWVuIGVuZCBvZiByZWNlcHRpb24gb2YgUFJlcyBmcm9tIENObiBhbmQgc3RhcnQgb2YgdHJhbnNtaXNzaW9uIG9mIFBSZXMgYnkgTU4gVU5TSUdORUQzMiBNIC0gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9NTlBSZXNSeDJTb0FfVTMyIC8vIGRlbGF5IGJldHdlZW4gZW5kIG9mIHJlY2VwdGlvbiBvZiBQUmVzIGZyb20gQ05uIGFuZCBzdGFydCBvZiB0cmFuc21pc3Npb24gb2YgU29BIGJ5IE1OIFVOU0lHTkVEMzIgTSAtIC0gLQorI2RlZmluZSBFUExfRF9OTVRfTU5QUmVzVHgyU29BX1UzMiAvLyBkZWxheSBiZXR3ZWVuIGVuZCBvZiBQUmVzIHRyYW5zbWlzc2lvbiBieSBNTiBhbmQgc3RhcnQgb2YgdHJhbnNtaXNzaW9uIG9mIFNvQSBieSBNTiBVTlNJR05FRDMyIE0gLSAtIC0KKyNkZWZpbmUgRVBMX0RfTk1UX01OU29BMkFTbmRUeF9VMzIgLy8gZGVsYXkgYmV0d2VlbiBlbmQgb2YgdHJhbnNtaXNzaW9uIG9mIFNvQSBhbmQgc3RhcnQgb2YgdHJhbnNtaXNzaW9uIG9mIEFTbmQgYnkgTU4gVU5TSUdORUQzMiBNIC0gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9NTlNvQzJQUmVxX1UzMiAvLyBNTiBtaW5pbXVtIGRlbGF5IGJldHdlZW4gZW5kIG9mIFNvQyB0cmFuc21pc3Npb24gYW5kIHN0YXJ0IG9mIFBSZXEgdHJhbnNtaXNzaW9uIFVOU0lHTkVEMzIgTSAtIC0gLQorI2RlZmluZSBFUExfRF9OTVRfTk1UU3ZjVmlhVURQSVBfQk9PTCAvLyBBYmlsaXR5IG9mIGEgbm9kZSB0byBwZXJmb3JtIE5NVCBzZXJ2aWNlcyB2aWEgVURQL0lQIEJPT0xFQU4gTyAtIFkgLQorI2RlZmluZSBFUExfRF9OTVRfTm9kZUlEQnlIV19CT09MIC8vIEFiaWxpdHkgb2YgYSBub2RlIHRvIHN1cHBvcnQgTm9kZUlEIHNldHVwIGJ5IEhXIEJPT0xFQU4gTyBPIFkgWQorI2RlZmluZSBFUExfRF9OTVRfTm9kZUlEQnlTV19CT09MIC8vIEFiaWxpdHkgb2YgYSBub2RlIHRvIHN1cHBvcnQgTm9kZUlEIHNldHVwIGJ5IFNXIEJPT0xFQU4gTyBPIE4gTgorI2RlZmluZSBFUExfRF9OTVRfUHJvZHVjdENvZGVfVTMyIC8vIElkZW50aXR5IE9iamVjdCBQcm9kdWN0IENvZGUgVU5TSUdORUQzMiBNIE0gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9SZXZpc2lvbk5vX1UzMiAvLyBJZGVudGl0eSBPYmplY3QgUmV2aXNpb24gTnVtYmVyIFVOU0lHTkVEMzIgTSBNIC0gLQorI2RlZmluZSBFUExfRF9OTVRfU2VyaWFsTm9fVTMyIC8vIElkZW50aXR5IE9iamVjdCBTZXJpYWwgTnVtYmVyIFVOU0lHTkVEMzIgTSBNIC0gLQorI2RlZmluZSBFUExfRF9OTVRfU2ltcGxlQm9vdF9CT09MIC8vIEFiaWxpdHkgb2YgYSBNTiBub2RlIHRvIHBlcmZvcm0gU2ltcGxlIEJvb3QgUHJvY2VzcywgaWYgbm90IHNldCBJbmRpdnVhbCBCb290IFByb2Nlc3Mgc2hhbGwgYmUgcHJvdmljZWQgQk9PTEVBTiBNIC0gLSAtCisjZGVmaW5lIEVQTF9EX05NVF9WZW5kb3JJRF9VMzIgLy8gSWRlbnRpdHkgT2JqZWN0IFZlbmRvciBJRCBVTlNJR05FRDMyIE0gTSAtIC0KKyNkZWZpbmUgRVBMX0RfTldMX0ZvcndhcmRfQk9PTCAvLyBBYmlsaXR5IG9mIG5vZGUgdG8gZm9yd2FyZCBkYXRhZ3JhbXMgQk9PTEVBTiBPIE8gTiBOCisjZGVmaW5lIEVQTF9EX05XTF9JUFN1cHBvcnRfQk9PTCAvLyBBYmlsaXR5IG9mIHRoZSBub2RlIGN1bW11bmljYXRlIHZpYSBJUCBCT09MRUFOIC0gLSBZIFkKKyNkZWZpbmUgRVBMX0RfUERPX0R5bmFtaWNNYXBwaW5nX0JPT0wgLy8gQWJpbGl0eSBvZiBhIG5vZGUgdG8gcGVyZm9ybSBkeW5hbWljIFBETyBtYXBwaW5nIEJPT0xFQU4gTyBPIFkgWQorI2RlZmluZSBFUExfRF9QRE9fTWF4RGVzY3JNZW1fVTMyIC8vIG1heGltdW0gY3VtdWxhdGl2ZSBtZW1vcnkgY29uc3VtcHRpb24gb2YgVFBETyBhbmQgUlBETyBkZXNjcmliaW5nIG9iamVjdHMgaW4gYnl0ZSBVTlNJR05FRDMyIE8gTyBNQVhfVTMyIE1BWF9VMzIKKyNkZWZpbmUgRVBMX0RfUERPX1JQRE9DaGFubmVsc19VOCAvLyBudW1iZXIgb2Ygc3VwcG9ydGVkIFJQRE8gY2hhbm5lbHMgVU5TSUdORUQ4IE8gTyAyNTYgMjU2CisjZGVmaW5lIEVQTF9EX1BET19SUERPTWF4TWVtX1UzMiAvLyBNYXhpbXVtIG1lbW9yeSBhdmFpbGFibGUgZm9yIFJQRE8gZGF0YSBwZXIgRVBMIGN5Y2xlIGluIGJ5dGUgVU5TSUdORUQzMiBPIE8gTUFYX1UzMiBNQVhfVTMyCisjZGVmaW5lIEVQTF9EX1BET19SUERPT2JqZWN0c19VOCAvLyBOdW1iZXIgb2Ygc3VwcG9ydGVkIG1hcHBlZCBvYmplY3RzIHBlciBSUERPIGNoYW5uZWwgVU5TSUdORUQ4IE8gTyAyNTQgMjU0CisjZGVmaW5lIEVQTF9EX1BET19UUERPQ2hhbm5lbHNfVTggLy8gbnVtYmVyIG9mIHN1cHBvcnRlZCBUUERPIGNoYW5uZWxzIFVOU0lHTkVEOCBPIC0gMjU2IC0KKyNkZWZpbmUgRVBMX0RfUERPX1RQRE9NYXhNZW1fVTMyIC8vIE1heGltdW0gbWVtb3J5IGF2YWlsYWJsZSBmb3IgVFBETyBkYXRhIHBlciBFUEwgY3ljbGUgaW4gYnl0ZSBVTlNJR05FRDMyIE8gTyBNQVhfVTMyIE1BWF9VMzIKKyNkZWZpbmUgRVBMX0RfUERPX1RQRE9PYmplY3RzX1U4IC8vIE51bWJlciBvZiBzdXBwb3J0ZWQgbWFwcGVkIG9iamVjdHMgcGVyIFRQRE8gY2hhbm5lbCBVTlNJR05FRDggTyBPIDI1NCAyNTQKKyNkZWZpbmUgRVBMX0RfU0RPX1ZpYUFTbmRfQk9PTCAvLyBBYmlsaXR5IG9mIGEgQ04gdG8gcGVyZm9ybSBTRE8gdHJhbnNmZXIgYnkgRVBMIEFTbmQgQk9PTEVBTiAtIE0gLSAtCisjZGVmaW5lIEVQTF9EX1NET19WaWFQRE9fQk9PTCAvLyBBYmlsaXR5IG9mIGEgbm9kZSB0byBwZXJmb3JtIFNETyB0cmFuc2ZlciBieSBQRE8gQk9PTEVBTiBPIE8gTiBOCisjZGVmaW5lIEVQTF9EX1NET19WaWFVRFBJUF9CT09MIC8vIEFiaWxpdHkgb2YgYSBDTiB0byBwZXJmb3JtIFNETyB0cmFuc2ZlciBieSBVRFAvSVAgQk9PTEVBTiAtIE0gLSAtCisjZGVmaW5lIEVQTF9EX1NZTl9PcHRpbWl6ZWRTeW5jX0JPT0wgLy8gQWJpbGl0eSBvZiBub2RlIHRvIHBlcmZvcm0gb3B0aW1pemVkIHN5bmNocm9uaXNhdGlvbiBCT09MRUFOIE8gTyBOIE4KKyovCisKKy8vIEVtZXJnZW5jeSBlcnJvciBjb2RlcworLy8gPT09PT09PT09PT09PT09PT09PT09PQorI2RlZmluZSBFUExfRV9OT19FUlJPUiAgICAgICAgICAgICAgICAgIDB4MDAwMAorLy8gMHhGeHh4IG1hbnVmYWN0dXJlciBzcGVjaWZpYyBlcnJvciBjb2RlcworI2RlZmluZSBFUExfRV9OTVRfTk9fSURFTlRfUkVTICAgICAgICAgIDB4RjAwMQorI2RlZmluZSBFUExfRV9OTVRfTk9fU1RBVFVTX1JFUyAgICAgICAgIDB4RjAwMgorCisvLyAweDgxNnggSFcgZXJyb3JzCisjZGVmaW5lIEVQTF9FX0RMTF9CQURfUEhZU19NT0RFICAgICAgICAgMHg4MTYxCisjZGVmaW5lIEVQTF9FX0RMTF9DT0xMSVNJT04gICAgICAgICAgICAgMHg4MTYyCisjZGVmaW5lIEVQTF9FX0RMTF9DT0xMSVNJT05fVEggICAgICAgICAgMHg4MTYzCisjZGVmaW5lIEVQTF9FX0RMTF9DUkNfVEggICAgICAgICAgICAgICAgMHg4MTY0CisjZGVmaW5lIEVQTF9FX0RMTF9MT1NTX09GX0xJTksgICAgICAgICAgMHg4MTY1CisjZGVmaW5lIEVQTF9FX0RMTF9NQUNfQlVGRkVSICAgICAgICAgICAgMHg4MTY2CisvLyAweDgyeHggUHJvdG9jb2wgZXJyb3JzCisjZGVmaW5lIEVQTF9FX0RMTF9BRERSRVNTX0NPTkZMSUNUICAgICAgMHg4MjAxCisjZGVmaW5lIEVQTF9FX0RMTF9NVUxUSVBMRV9NTiAgICAgICAgICAgMHg4MjAyCisvLyAweDgyMXggRnJhbWUgc2l6ZSBlcnJvcnMKKyNkZWZpbmUgRVBMX0VfUERPX1NIT1JUX1JYICAgICAgICAgICAgICAweDgyMTAKKyNkZWZpbmUgRVBMX0VfUERPX01BUF9WRVJTICAgICAgICAgICAgICAweDgyMTEKKyNkZWZpbmUgRVBMX0VfTk1UX0FTTkRfTVRVX0RJRiAgICAgICAgICAweDgyMTIKKyNkZWZpbmUgRVBMX0VfTk1UX0FTTkRfTVRVX0xJTSAgICAgICAgICAweDgyMTMKKyNkZWZpbmUgRVBMX0VfTk1UX0FTTkRfVFhfTElNICAgICAgICAgICAweDgyMTQKKy8vIDB4ODIzeCBUaW1pbmcgZXJyb3JzCisjZGVmaW5lIEVQTF9FX05NVF9DWUNMRV9MRU4gICAgICAgICAgICAgMHg4MjMxCisjZGVmaW5lIEVQTF9FX0RMTF9DWUNMRV9FWENFRUQgICAgICAgICAgMHg4MjMyCisjZGVmaW5lIEVQTF9FX0RMTF9DWUNMRV9FWENFRURfVEggICAgICAgMHg4MjMzCisjZGVmaW5lIEVQTF9FX05NVF9JRExFX0xJTSAgICAgICAgICAgICAgMHg4MjM0CisjZGVmaW5lIEVQTF9FX0RMTF9KSVRURVJfVEggICAgICAgICAgICAgMHg4MjM1CisjZGVmaW5lIEVQTF9FX0RMTF9MQVRFX1BSRVNfVEggICAgICAgICAgMHg4MjM2CisjZGVmaW5lIEVQTF9FX05NVF9QUkVRX0NOICAgICAgICAgICAgICAgMHg4MjM3CisjZGVmaW5lIEVQTF9FX05NVF9QUkVRX0xJTSAgICAgICAgICAgICAgMHg4MjM4CisjZGVmaW5lIEVQTF9FX05NVF9QUkVTX0NOICAgICAgICAgICAgICAgMHg4MjM5CisjZGVmaW5lIEVQTF9FX05NVF9QUkVTX1JYX0xJTSAgICAgICAgICAgMHg4MjNBCisjZGVmaW5lIEVQTF9FX05NVF9QUkVTX1RYX0xJTSAgICAgICAgICAgMHg4MjNCCisvLyAweDgyNHggRnJhbWUgZXJyb3JzCisjZGVmaW5lIEVQTF9FX0RMTF9JTlZBTElEX0ZPUk1BVCAgICAgICAgMHg4MjQxCisjZGVmaW5lIEVQTF9FX0RMTF9MT1NTX1BSRVFfVEggICAgICAgICAgMHg4MjQyCisjZGVmaW5lIEVQTF9FX0RMTF9MT1NTX1BSRVNfVEggICAgICAgICAgMHg4MjQzCisjZGVmaW5lIEVQTF9FX0RMTF9MT1NTX1NPQV9USCAgICAgICAgICAgMHg4MjQ0CisjZGVmaW5lIEVQTF9FX0RMTF9MT1NTX1NPQ19USCAgICAgICAgICAgMHg4MjQ1CisvLyAweDg0eHggQm9vdFVwIEVycm9ycworI2RlZmluZSBFUExfRV9OTVRfQkExICAgICAgICAgICAgICAgICAgIDB4ODQxMAkvLyBvdGhlciBNTiBpbiBNc05vdEFjdGl2ZSBhY3RpdmUKKyNkZWZpbmUgRVBMX0VfTk1UX0JBMV9OT19NTl9TVVBQT1JUICAgICAweDg0MTEJLy8gTU4gaXMgbm90IHN1cHBvcnRlZAorI2RlZmluZSBFUExfRV9OTVRfQlBPMSAgICAgICAgICAgICAgICAgIDB4ODQyMAkvLyBtYW5kYXRvcnkgQ04gd2FzIG5vdCBmb3VuZCBvciBmYWlsZWQgaW4gQm9vdFN0ZXAxCisjZGVmaW5lIEVQTF9FX05NVF9CUE8xX0dFVF9JREVOVCAgICAgICAgMHg4NDIxCS8vIElkZW50UmVzIHdhcyBub3QgcmVjZWl2ZWQKKyNkZWZpbmUgRVBMX0VfTk1UX0JQTzFfREVWSUNFX1RZUEUgICAgICAweDg0MjIJLy8gd3JvbmcgZGV2aWNlIHR5cGUKKyNkZWZpbmUgRVBMX0VfTk1UX0JQTzFfVkVORE9SX0lEICAgICAgICAweDg0MjMJLy8gd3JvbmcgdmVuZG9yIElECisjZGVmaW5lIEVQTF9FX05NVF9CUE8xX1BST0RVQ1RfQ09ERSAgICAgMHg4NDI0CS8vIHdyb25nIHByb2R1Y3QgY29kZQorI2RlZmluZSBFUExfRV9OTVRfQlBPMV9SRVZJU0lPTl9OTyAgICAgIDB4ODQyNQkvLyB3cm9uZyByZXZpc2lvbiBudW1iZXIKKyNkZWZpbmUgRVBMX0VfTk1UX0JQTzFfU0VSSUFMX05PICAgICAgICAweDg0MjYJLy8gd3Jvbmcgc2VyaWFsIG51bWJlcgorI2RlZmluZSBFUExfRV9OTVRfQlBPMV9DRl9WRVJJRlkgICAgICAgIDB4ODQyOAkvLyB2ZXJpZmljYXRpb24gb2YgY29uZmlndXJhdGlvbiBmYWlsZWQKKyNkZWZpbmUgRVBMX0VfTk1UX0JQTzIgICAgICAgICAgICAgICAgICAweDg0MzAJLy8gbWFuZGF0b3J5IENOIGZhaWxlZCBpbiBCb290U3RlcDIKKyNkZWZpbmUgRVBMX0VfTk1UX0JSTyAgICAgICAgICAgICAgICAgICAweDg0NDAJLy8gQ2hlY2tDb21tdW5pY2F0aW9uIGZhaWxlZCBmb3IgbWFuZGF0b3J5IENOCisjZGVmaW5lIEVQTF9FX05NVF9XUk9OR19TVEFURSAgICAgICAgICAgMHg4NDgwCS8vIG1hbmRhdG9yeSBDTiBoYXMgd3JvbmcgTk1UIHN0YXRlCisKKy8vIERlZmluZXMgZm9yIG9iamVjdCAweDFGODAgTk1UX1N0YXJ0VXBfVTMyCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgRVBMX05NVFNUX1NUQVJUQUxMTk9ERVMgICAgICAgICAweDAwMDAwMDAyTAkvLyBCaXQgMQorI2RlZmluZSBFUExfTk1UU1RfTk9fQVVUT1NUQVJUICAgICAgICAgIDB4MDAwMDAwMDRMCS8vIEJpdCAyCisjZGVmaW5lIEVQTF9OTVRTVF9OT19TVEFSVE5PREUgICAgICAgICAgMHgwMDAwMDAwOEwJLy8gQml0IDMKKyNkZWZpbmUgRVBMX05NVFNUX1JFU0VUQUxMX01BTkRfQ04gICAgICAweDAwMDAwMDEwTAkvLyBCaXQgNAorI2RlZmluZSBFUExfTk1UU1RfU1RPUEFMTF9NQU5EX0NOICAgICAgIDB4MDAwMDAwNDBMCS8vIEJpdCA2CisjZGVmaW5lIEVQTF9OTVRTVF9OT19BVVRPUFJFT1AyICAgICAgICAgMHgwMDAwMDA4MEwJLy8gQml0IDcKKyNkZWZpbmUgRVBMX05NVFNUX05PX0FVVE9SRUFEWVRPT1AgICAgICAweDAwMDAwMTAwTAkvLyBCaXQgOAorI2RlZmluZSBFUExfTk1UU1RfRVhUX0NOSURFTlRDSEVDSyAgICAgIDB4MDAwMDAyMDBMCS8vIEJpdCA5CisjZGVmaW5lIEVQTF9OTVRTVF9TV1ZFUlNJT05DSEVDSyAgICAgICAgMHgwMDAwMDQwMEwJLy8gQml0IDEwCisjZGVmaW5lIEVQTF9OTVRTVF9DT05GQ0hFQ0sgICAgICAgICAgICAgMHgwMDAwMDgwMEwJLy8gQml0IDExCisjZGVmaW5lIEVQTF9OTVRTVF9OT19SRVRVUk5fUFJFT1AxICAgICAgMHgwMDAwMTAwMEwJLy8gQml0IDEyCisjZGVmaW5lIEVQTF9OTVRTVF9CQVNJQ0VUSEVSTkVUICAgICAgICAgMHgwMDAwMjAwMEwJLy8gQml0IDEzCisKKy8vIERlZmluZXMgZm9yIG9iamVjdCAweDFGODEgTk1UX05vZGVBc3NpZ25tZW50X0FVMzIKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIEVQTF9OT0RFQVNTSUdOX05PREVfRVhJU1RTICAgICAgMHgwMDAwMDAwMUwJLy8gQml0IDAKKyNkZWZpbmUgRVBMX05PREVBU1NJR05fTk9ERV9JU19DTiAgICAgICAweDAwMDAwMDAyTAkvLyBCaXQgMQorI2RlZmluZSBFUExfTk9ERUFTU0lHTl9TVEFSVF9DTiAgICAgICAgIDB4MDAwMDAwMDRMCS8vIEJpdCAyCisjZGVmaW5lIEVQTF9OT0RFQVNTSUdOX01BTkRBVE9SWV9DTiAgICAgMHgwMDAwMDAwOEwJLy8gQml0IDMKKyNkZWZpbmUgRVBMX05PREVBU1NJR05fS0VFUEFMSVZFICAgICAgICAweDAwMDAwMDEwTAkvL2N1cnJlbnRseSBub3QgdXNlZCBpbiBFUEwgVjIgc3RhbmRhcmQKKyNkZWZpbmUgRVBMX05PREVBU1NJR05fU1dWRVJTSU9OQ0hFQ0sgICAweDAwMDAwMDIwTAkvLyBCaXQgNQorI2RlZmluZSBFUExfTk9ERUFTU0lHTl9TV1VQREFURSAgICAgICAgIDB4MDAwMDAwNDBMCS8vIEJpdCA2CisjZGVmaW5lIEVQTF9OT0RFQVNTSUdOX0FTWU5DT05MWV9OT0RFICAgMHgwMDAwMDEwMEwJLy8gQml0IDgKKyNkZWZpbmUgRVBMX05PREVBU1NJR05fTVVMVElQTEVYRURfQ04gICAweDAwMDAwMjAwTAkvLyBCaXQgOQorI2RlZmluZSBFUExfTk9ERUFTU0lHTl9SVDEgICAgICAgICAgICAgIDB4MDAwMDA0MDBMCS8vIEJpdCAxMAorI2RlZmluZSBFUExfTk9ERUFTU0lHTl9SVDIgICAgICAgICAgICAgIDB4MDAwMDA4MDBMCS8vIEJpdCAxMQorI2RlZmluZSBFUExfTk9ERUFTU0lHTl9NTl9QUkVTICAgICAgICAgIDB4MDAwMDEwMDBMCS8vIEJpdCAxMgorI2RlZmluZSBFUExfTk9ERUFTU0lHTl9WQUxJRCAgICAgICAgICAgIDB4ODAwMDAwMDBMCS8vIEJpdCAzMQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExfREVGX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbERsbC5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxEbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjY1N2YyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxEbGwuaApAQCAtMCwwICsxLDIwNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgRExMIG1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbERsbC5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMDggZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExfRExMX0hfCisjZGVmaW5lIF9FUExfRExMX0hfCisKKyNpbmNsdWRlICJFcGxJbmMuaCIKKyNpbmNsdWRlICJFcGxGcmFtZS5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBFUExfRExMX01BWF9BU05EX1NFUlZJQ0VfSUQKKyNkZWZpbmUgRVBMX0RMTF9NQVhfQVNORF9TRVJWSUNFX0lEIChFUExfQ19ETExfTUFYX0FTTkRfU0VSVklDRV9JRFMgKyAxKQkvLyBsYXN0IGlzIGtFcGxEbGxBc25kU2RvID09IDUKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBlbnVtIHsKKwlrRXBsRGxsQXNuZE5vdERlZmluZWQgPSAweDAwLAorCWtFcGxEbGxBc25kSWRlbnRSZXNwb25zZSA9IDB4MDEsCisJa0VwbERsbEFzbmRTdGF0dXNSZXNwb25zZSA9IDB4MDIsCisJa0VwbERsbEFzbmRObXRSZXF1ZXN0ID0gMHgwMywKKwlrRXBsRGxsQXNuZE5tdENvbW1hbmQgPSAweDA0LAorCWtFcGxEbGxBc25kU2RvID0gMHgwNQorfSB0RXBsRGxsQXNuZFNlcnZpY2VJZDsKKwordHlwZWRlZiBlbnVtIHsKKwlrRXBsRGxsQXNuZEZpbHRlck5vbmUgPSAweDAwLAorCWtFcGxEbGxBc25kRmlsdGVyTG9jYWwgPSAweDAxLAkvLyByZWNlaXZlIG9ubHkgQVNuZCBmcmFtZXMgd2l0aCBsb2NhbCBvciBicm9hZGNhc3Qgbm9kZSBJRAorCWtFcGxEbGxBc25kRmlsdGVyQW55ID0gMHgwMiwJLy8gcmVjZWl2ZSBhbnkgQVNuZCBmcmFtZQorfSB0RXBsRGxsQXNuZEZpbHRlcjsKKwordHlwZWRlZiBlbnVtIHsKKwlrRXBsRGxsUmVxU2VydmljZU5vID0gMHgwMCwKKwlrRXBsRGxsUmVxU2VydmljZUlkZW50ID0gMHgwMSwKKwlrRXBsRGxsUmVxU2VydmljZVN0YXR1cyA9IDB4MDIsCisJa0VwbERsbFJlcVNlcnZpY2VObXRSZXF1ZXN0ID0gMHgwMywKKwlrRXBsRGxsUmVxU2VydmljZVVuc3BlY2lmaWVkID0gMHhGRiwKKworfSB0RXBsRGxsUmVxU2VydmljZUlkOworCit0eXBlZGVmIGVudW0geworCWtFcGxEbGxBc3luY1JlcVByaW9ObXQgPSAweDA3LAkvLyBQUklPX05NVF9SRVFVRVNUCisJa0VwbERsbEFzeW5jUmVxUHJpbzYgPSAweDA2LAorCWtFcGxEbGxBc3luY1JlcVByaW81ID0gMHgwNSwKKwlrRXBsRGxsQXN5bmNSZXFQcmlvNCA9IDB4MDQsCisJa0VwbERsbEFzeW5jUmVxUHJpb0dlbmVyaWMgPSAweDAzLAkvLyBQUklPX0dFTkVSSUNfUkVRVUVTVAorCWtFcGxEbGxBc3luY1JlcVByaW8yID0gMHgwMiwJLy8gdGlsbCBXU1AgMC4xLjM6IFBSSU9fQUJPVkVfR0VORVJJQworCWtFcGxEbGxBc3luY1JlcVByaW8xID0gMHgwMSwJLy8gdGlsbCBXU1AgMC4xLjM6IFBSSU9fQkVMT1dfR0VORVJJQworCWtFcGxEbGxBc3luY1JlcVByaW8wID0gMHgwMCwJLy8gdGlsbCBXU1AgMC4xLjM6IFBSSU9fR0VORVJJQ19SRVFVRVNUCisKK30gdEVwbERsbEFzeW5jUmVxUHJpb3JpdHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgbV91aUZyYW1lU2l6ZTsKKwl0RXBsRnJhbWUgKm1fcEZyYW1lOworCXRFcGxOZXRUaW1lIG1fTmV0VGltZTsKKworfSB0RXBsRnJhbWVJbmZvOworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IG1fdWlTaXplT2ZTdHJ1Y3Q7CisJQk9PTCBtX2ZBc3luY09ubHk7CS8vIGRvIG5vdCBuZWVkIHRvIHJlZ2lzdGVyIFBSZXMtRnJhbWUKKwl1bnNpZ25lZCBpbnQgbV91aU5vZGVJZDsJLy8gbG9jYWwgbm9kZSBJRAorCisJLy8gMHgxRjgyOiBOTVRfRmVhdHVyZUZsYWdzX1UzMgorCURXT1JEIG1fZHdGZWF0dXJlRmxhZ3M7CisJLy8gQ3ljbGUgTGVuZ3RoICgweDEwMDY6IE5NVF9DeWNsZUxlbl9VMzIpIGluIFt1c10KKwlEV09SRCBtX2R3Q3ljbGVMZW47CS8vIHJlcXVpcmVkIGZvciBlcnJvciBkZXRlY3Rpb24KKwkvLyAweDFGOTg6IE5NVF9DeWNsZVRpbWluZ19SRUMKKwkvLyAweDFGOTguMTogSXNvY2hyVHhNYXhQYXlsb2FkX1UxNgorCXVuc2lnbmVkIGludCBtX3VpSXNvY2hyVHhNYXhQYXlsb2FkOwkvLyBjb25zdAorCS8vIDB4MUY5OC4yOiBJc29jaHJSeE1heFBheWxvYWRfVTE2CisJdW5zaWduZWQgaW50IG1fdWlJc29jaHJSeE1heFBheWxvYWQ7CS8vIGNvbnN0CisJLy8gMHgxRjk4LjM6IFBSZXNNYXhMYXRlbmN5X1UzMgorCURXT1JEIG1fZHdQcmVzTWF4TGF0ZW5jeTsJLy8gY29uc3QgaW4gW25zXSwgb25seSByZXF1aXJlZCBmb3IgSWRlbnRSZXMKKwkvLyAweDFGOTguNDogUFJlcUFjdFBheWxvYWRMaW1pdF9VMTYKKwl1bnNpZ25lZCBpbnQgbV91aVByZXFBY3RQYXlsb2FkTGltaXQ7CS8vIHJlcXVpcmVkIGZvciBpbml0aWFsaXNhdGlvbiAoKzI0IGJ5dGVzKQorCS8vIDB4MUY5OC41OiBQUmVzQWN0UGF5bG9hZExpbWl0X1UxNgorCXVuc2lnbmVkIGludCBtX3VpUHJlc0FjdFBheWxvYWRMaW1pdDsJLy8gcmVxdWlyZWQgZm9yIGluaXRpYWxpc2F0aW9uIG9mIFByZXMgZnJhbWUgKCsyNCBieXRlcykKKwkvLyAweDFGOTguNjogQVNuZE1heExhdGVuY3lfVTMyCisJRFdPUkQgbV9kd0FzbmRNYXhMYXRlbmN5OwkvLyBjb25zdCBpbiBbbnNdLCBvbmx5IHJlcXVpcmVkIGZvciBJZGVudFJlcworCS8vIDB4MUY5OC43OiBNdWx0aXBsQ3ljbGVDbnRfVTgKKwl1bnNpZ25lZCBpbnQgbV91aU11bHRpcGxDeWNsZUNudDsJLy8gcmVxdWlyZWQgZm9yIGVycm9yIGRldGVjdGlvbgorCS8vIDB4MUY5OC44OiBBc3luY01UVV9VMTYKKwl1bnNpZ25lZCBpbnQgbV91aUFzeW5jTXR1OwkvLyByZXF1aXJlZCB0byBzZXQgdXAgbWF4IGZyYW1lIHNpemUKKwkvLyAkJCQgMHgxRjk4Ljk6IFByZXNjYWxlcl9VMTYKKwkvLyAkJCQgTXVsdGlwbGV4ZWQgU2xvdAorCisJLy8gMHgxQzE0OiBETExfTG9zc09mRnJhbWVUb2xlcmFuY2VfVTMyIGluIFtuc10KKwlEV09SRCBtX2R3TG9zc09mRnJhbWVUb2xlcmFuY2U7CisKKwkvLyAweDFGOEE6IE5NVF9NTkN5Y2xlVGltaW5nX1JFQworCS8vIDB4MUY4QS4xOiBXYWl0U29DUFJlcV9VMzIgaW4gW25zXQorCURXT1JEIG1fZHdXYWl0U29jUHJlcTsKKworCS8vIDB4MUY4QS4yOiBBc3luY1Nsb3RUaW1lb3V0X1UzMiBpbiBbbnNdCisJRFdPUkQgbV9kd0FzeW5jU2xvdFRpbWVvdXQ7CisKK30gdEVwbERsbENvbmZpZ1BhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IG1fdWlTaXplT2ZTdHJ1Y3Q7CisJRFdPUkQgbV9kd0RldmljZVR5cGU7CS8vIE5NVF9EZXZpY2VUeXBlX1UzMgorCURXT1JEIG1fZHdWZW5kb3JJZDsJLy8gTk1UX0lkZW50aXR5T2JqZWN0X1JFQy5WZW5kb3JJZF9VMzIKKwlEV09SRCBtX2R3UHJvZHVjdENvZGU7CS8vIE5NVF9JZGVudGl0eU9iamVjdF9SRUMuUHJvZHVjdENvZGVfVTMyCisJRFdPUkQgbV9kd1JldmlzaW9uTnVtYmVyOwkvLyBOTVRfSWRlbnRpdHlPYmplY3RfUkVDLlJldmlzaW9uTm9fVTMyCisJRFdPUkQgbV9kd1NlcmlhbE51bWJlcjsJLy8gTk1UX0lkZW50aXR5T2JqZWN0X1JFQy5TZXJpYWxOb19VMzIKKwlRV09SRCBtX3F3VmVuZG9yU3BlY2lmaWNFeHQxOworCURXT1JEIG1fZHdWZXJpZnlDb25maWd1cmF0aW9uRGF0ZTsJLy8gQ0ZNX1ZlcmlmeUNvbmZpZ3VyYXRpb25fUkVDLkNvbmZEYXRlX1UzMgorCURXT1JEIG1fZHdWZXJpZnlDb25maWd1cmF0aW9uVGltZTsJLy8gQ0ZNX1ZlcmlmeUNvbmZpZ3VyYXRpb25fUkVDLkNvbmZUaW1lX1UzMgorCURXT1JEIG1fZHdBcHBsaWNhdGlvblN3RGF0ZTsJLy8gUERMX0xvY1ZlckFwcGxTd19SRUMuQXBwbFN3RGF0ZV9VMzIgb24gcHJvZ3JhbW1hYmxlIGRldmljZSBvciBkYXRlIHBvcnRpb24gb2YgTk1UX01hbnVmYWN0U3dWZXJzX1ZTIG9uIG5vbi1wcm9ncmFtbWFibGUgZGV2aWNlCisJRFdPUkQgbV9kd0FwcGxpY2F0aW9uU3dUaW1lOwkvLyBQRExfTG9jVmVyQXBwbFN3X1JFQy5BcHBsU3dUaW1lX1UzMiBvbiBwcm9ncmFtbWFibGUgZGV2aWNlIG9yIHRpbWUgcG9ydGlvbiBvZiBOTVRfTWFudWZhY3RTd1ZlcnNfVlMgb24gbm9uLXByb2dyYW1tYWJsZSBkZXZpY2UKKwlEV09SRCBtX2R3SXBBZGRyZXNzOworCURXT1JEIG1fZHdTdWJuZXRNYXNrOworCURXT1JEIG1fZHdEZWZhdWx0R2F0ZXdheTsKKwlCWVRFIG1fc0hvc3RuYW1lWzMyXTsKKwlCWVRFIG1fYWJWZW5kb3JTcGVjaWZpY0V4dDJbNDhdOworCit9IHRFcGxEbGxJZGVudFBhcmFtOworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IG1fdWlOb2RlSWQ7CisJV09SRCBtX3dQcmVxUGF5bG9hZExpbWl0OwkvLyBvYmplY3QgMHgxRjhCOiBOTVRfTU5QUmVxUGF5bG9hZExpbWl0TGlzdF9BVTE2CisJV09SRCBtX3dQcmVzUGF5bG9hZExpbWl0OwkvLyBvYmplY3QgMHgxRjhEOiBOTVRfUFJlc1BheWxvYWRMaW1pdExpc3RfQVUxNgorCURXT1JEIG1fZHdQcmVzVGltZW91dDsJLy8gb2JqZWN0IDB4MUY5MjogTk1UX01OQ05QUmVzVGltZW91dF9BVTMyCisKK30gdEVwbERsbE5vZGVJbmZvOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTF9ETExfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRGxsQ2FsLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbERsbENhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NDYwMDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbERsbENhbC5oCkBAIC0wLDAgKzEsMTIzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBETEwgQ29tbXVuaWNhdGlvbiBBYnN0cmFjdGlvbiBMYXllciBtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxEbGxDYWwuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzIwIGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDEuMDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRVBMX0RMTENBTF9IXworI2RlZmluZSBfRVBMX0RMTENBTF9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyojaWZuZGVmIEVQTF9ETExDQUxfQlVGRkVSX0lEX1JYCisjZGVmaW5lIEVQTF9ETExDQUxfQlVGRkVSX0lEX1JYICAgICJFcGxTYmxEbGxDYWxSeCIKKyNlbmRpZgorCisjaWZuZGVmIEVQTF9ETExDQUxfQlVGRkVSX1NJWkVfUlgKKyNkZWZpbmUgRVBMX0RMTENBTF9CVUZGRVJfU0laRV9SWCAgMzI3NjcKKyNlbmRpZgorKi8KKyNpZm5kZWYgRVBMX0RMTENBTF9CVUZGRVJfSURfVFhfTk1UCisjZGVmaW5lIEVQTF9ETExDQUxfQlVGRkVSX0lEX1RYX05NVCAgICAgIkVwbFNibERsbENhbFR4Tm10IgorI2VuZGlmCisKKyNpZm5kZWYgRVBMX0RMTENBTF9CVUZGRVJfU0laRV9UWF9OTVQKKyNkZWZpbmUgRVBMX0RMTENBTF9CVUZGRVJfU0laRV9UWF9OTVQgICAzMjc2NworI2VuZGlmCisKKyNpZm5kZWYgRVBMX0RMTENBTF9CVUZGRVJfSURfVFhfR0VOCisjZGVmaW5lIEVQTF9ETExDQUxfQlVGRkVSX0lEX1RYX0dFTiAgICAgIkVwbFNibERsbENhbFR4R2VuIgorI2VuZGlmCisKKyNpZm5kZWYgRVBMX0RMTENBTF9CVUZGRVJfU0laRV9UWF9HRU4KKyNkZWZpbmUgRVBMX0RMTENBTF9CVUZGRVJfU0laRV9UWF9HRU4gICAzMjc2NworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbERsbEFzbmRTZXJ2aWNlSWQgbV9TZXJ2aWNlSWQ7CisJdEVwbERsbEFzbmRGaWx0ZXIgbV9GaWx0ZXI7CisKK30gdEVwbERsbENhbEFzbmRTZXJ2aWNlSWRGaWx0ZXI7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsRGxsUmVxU2VydmljZUlkIG1fU2VydmljZTsKKwl1bnNpZ25lZCBpbnQgbV91aU5vZGVJZDsKKwlCWVRFIG1fYlNvYUZsYWcxOworCit9IHRFcGxEbGxDYWxJc3N1ZVJlcXVlc3Q7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMX0RMTEtDQUxfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRGxsay5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxEbGxrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUyMjY0MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRGxsay5jCkBAIC0wLDAgKzEsNDA1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBrZXJuZWwgRExMIG1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbERsbGsuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMjEgJCAgJERhdGU6IDIwMDgvMTEvMTMgMTc6MTM6MDkgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8xMiBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJrZXJuZWwvRXBsRGxsay5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxEbGxrQ2FsLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbEV2ZW50ay5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxObXRrLmgiCisjaW5jbHVkZSAiZWRydi5oIgorI2luY2x1ZGUgIkJlbmNobWFyay5oIgorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkKKyNpbmNsdWRlICJrZXJuZWwvRXBsUGRvay5oIgorI2VuZGlmCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1ZFVEgpKSAhPSAwKQorI2luY2x1ZGUgImtlcm5lbC9WaXJ0dWFsRXRoZXJuZXQuaCIKKyNlbmRpZgorCisvLyNpZiBFUExfVElNRVJfVVNFX0hJR0hSRVMgIT0gRkFMU0UKKyNpbmNsdWRlICJrZXJuZWwvRXBsVGltZXJIaWdoUmVzay5oIgorLy8jZW5kaWYKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRLKSkgPT0gMCkKKyNlcnJvciAiRVBMIG1vZHVsZSBETExLIG5lZWRzIEVQTCBtb2R1bGUgTk1USyEiCisjZW5kaWYKKworI2lmIChFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfU09BICE9IEZBTFNFKSAmJiAoRVBMX0RMTF9QUkVTX1JFQURZX0FGVEVSX1NPQyAhPSBGQUxTRSkKKyNlcnJvciAiRVBMIG1vZHVsZSBETExLOiBzZWxlY3Qgb25seSBvbmUgb2YgRVBMX0RMTF9QUkVTX1JFQURZX0FGVEVSX1NPQSBhbmQgRVBMX0RMTF9QUkVTX1JFQURZX0FGVEVSX1NPQy4iCisjZW5kaWYKKworI2lmICgoRVBMX0RMTF9QUkVTX1JFQURZX0FGVEVSX1NPQSAhPSBGQUxTRSkgfHwgKEVQTF9ETExfUFJFU19SRUFEWV9BRlRFUl9TT0MgIT0gRkFMU0UpKSBcCisgICAgJiYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSA9PSAwKQorI2Vycm9yICJFUEwgbW9kdWxlIERMTEs6IGN1cnJlbnRseSwgRVBMX0RMTF9QUkVTX1JFQURZX0FGVEVSXyogaXMgbm90IHN1cHBvcnRlZCBpZiBFUExfTU9EVUxFX05NVF9NTiBpcyBlbmFibGVkLiIKKyNlbmRpZgorCisjaWYgKEVEUlZfRkFTVF9UWEZSQU1FUyA9PSBGQUxTRSkgJiYgXAorICAgICgoRVBMX0RMTF9QUkVTX1JFQURZX0FGVEVSX1NPQSAhPSBGQUxTRSkgfHwgKEVQTF9ETExfUFJFU19SRUFEWV9BRlRFUl9TT0MgIT0gRkFMU0UpKQorI2Vycm9yICJFUEwgbW9kdWxlIERMTEs6IEVQTF9ETExfUFJFU19SRUFEWV9BRlRFUl8qIGlzIGVuYWJsZWQsIGJ1dCBub3QgRURSVl9GQVNUX1RYRlJBTUVTLiIKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVHJhY2VQb2ludCBzdXBwb3J0IGZvciByZWFsdGltZS1kZWJ1Z2dpbmcKKyNpZmRlZiBfREJHX1RSQUNFX1BPSU5UU18KK3ZvaWQgUFVCTElDIFRndERiZ1NpZ25hbFRyYWNlUG9pbnQoQllURSBiVHJhY2VQb2ludE51bWJlcl9wKTsKK3ZvaWQgUFVCTElDIFRndERiZ1Bvc3RUcmFjZVZhbHVlKERXT1JEIGR3VHJhY2VWYWx1ZV9wKTsKKyNkZWZpbmUgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQocCkgICBUZ3REYmdTaWduYWxUcmFjZVBvaW50KHApCisjZGVmaW5lIFRHVF9EQkdfUE9TVF9UUkFDRV9WQUxVRSh2KSAgICAgVGd0RGJnUG9zdFRyYWNlVmFsdWUodikKKyNlbHNlCisjZGVmaW5lIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKHApCisjZGVmaW5lIFRHVF9EQkdfUE9TVF9UUkFDRV9WQUxVRSh2KQorI2VuZGlmCisjZGVmaW5lIEVQTF9ETExLX0RCR19QT1NUX1RSQUNFX1ZBTFVFKEV2ZW50X3AsIHVpTm9kZUlkX3AsIHdFcnJvckNvZGVfcCkgXAorICAgIFRHVF9EQkdfUE9TVF9UUkFDRV9WQUxVRSgoa0VwbEV2ZW50U2lua0RsbGsgPDwgMjgpIHwgKEV2ZW50X3AgPDwgMjQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAodWlOb2RlSWRfcCA8PCAxNikgfCB3RXJyb3JDb2RlX3ApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEMgTCBBIFMgUyAgRXBsRGxsayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gZGVmaW5lcyBmb3IgaW5kZXhlcyBvZiB0RXBsRGxsSW5zdGFuY2UubV9wVHhGcmFtZUluZm8KKyNkZWZpbmUgRVBMX0RMTEtfVFhGUkFNRV9JREVOVFJFUyAgIDAJLy8gSWRlbnRSZXNwb25zZSBvbiBDTiAvIE1OCisjZGVmaW5lIEVQTF9ETExLX1RYRlJBTUVfU1RBVFVTUkVTICAxCS8vIFN0YXR1c1Jlc3BvbnNlIG9uIENOIC8gTU4KKyNkZWZpbmUgRVBMX0RMTEtfVFhGUkFNRV9OTVRSRVEgICAgIDIJLy8gTk1UIFJlcXVlc3QgZnJvbSBGSUZPIG9uIENOIC8gTU4KKyNkZWZpbmUgRVBMX0RMTEtfVFhGUkFNRV9OT05FUEwgICAgIDMJLy8gbm9uLUVQTCBmcmFtZSBmcm9tIEZJRk8gb24gQ04gLyBNTgorI2RlZmluZSBFUExfRExMS19UWEZSQU1FX1BSRVMgICAgICAgNAkvLyBQUmVzIG9uIENOIC8gTU4KKyNkZWZpbmUgRVBMX0RMTEtfVFhGUkFNRV9TT0MgICAgICAgIDUJLy8gU29DIG9uIE1OCisjZGVmaW5lIEVQTF9ETExLX1RYRlJBTUVfU09BICAgICAgICA2CS8vIFNvQSBvbiBNTgorI2RlZmluZSBFUExfRExMS19UWEZSQU1FX1BSRVEgICAgICAgNwkvLyBQUmVxIG9uIE1OCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisjZGVmaW5lIEVQTF9ETExLX1RYRlJBTUVfQ09VTlQgICAgICAoNyArIEVQTF9EX05NVF9NYXhDTk51bWJlcl9VOCArIDIpCS8vIG9uIE1OOiA3ICsgTWF4UFJlcSBvZiByZWd1bGFyIENOcyArIDEgRGlhZyArIDEgUm91dGVyCisjZWxzZQorI2RlZmluZSBFUExfRExMS19UWEZSQU1FX0NPVU5UICAgICAgNQkvLyBvbiBDTjogNQorI2VuZGlmCisKKyNkZWZpbmUgRVBMX0RMTEtfQlVGTEVOX0VNUFRZICAgICAgIDAJLy8gYnVmZmVyIGlzIGVtcHR5CisjZGVmaW5lIEVQTF9ETExLX0JVRkxFTl9GSUxMSU5HICAgICAxCS8vIGp1c3QgdGhlIGJ1ZmZlciBpcyBiZWluZyBmaWxsZWQKKyNkZWZpbmUgRVBMX0RMTEtfQlVGTEVOX01JTiAgICAgICAgIDYwCS8vIG1pbmltdW0gZXRoZXJuZXQgZnJhbWUgbGVuZ3RoCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBlbnVtIHsKKwlrRXBsRGxsR3NJbml0ID0gMHgwMCwJLy8gTU4vQ046IGluaXRpYWxpc2F0aW9uICg8IFByZU9wMikKKwlrRXBsRGxsQ3NXYWl0UHJlcSA9IDB4MDEsCS8vIENOOiB3YWl0IGZvciBQUmVxIGZyYW1lCisJa0VwbERsbENzV2FpdFNvYyA9IDB4MDIsCS8vIENOOiB3YWl0IGZvciBTb0MgZnJhbWUKKwlrRXBsRGxsQ3NXYWl0U29hID0gMHgwMywJLy8gQ046IHdhaXQgZm9yIFNvQSBmcmFtZQorCWtFcGxEbGxNc05vbkN5Y2xpYyA9IDB4MDQsCS8vIE1OOiByZWR1Y2VkIEVQTCBjeWNsZSAoUHJlT3AxKQorCWtFcGxEbGxNc1dhaXRTb2NUcmlnID0gMHgwNSwJLy8gTU46IHdhaXQgZm9yIFNvQyB0cmlnZ2VyIChjeWNsZSB0aW1lcikKKwlrRXBsRGxsTXNXYWl0UHJlcVRyaWcgPSAweDA2LAkvLyBNTjogd2FpdCBmb3IgKGZpcnN0KSBQUmVxIHRyaWdnZXIgKFdhaXRTb0NQUmVxX1UzMikKKwlrRXBsRGxsTXNXYWl0UHJlcyA9IDB4MDcsCS8vIE1OOiB3YWl0IGZvciBQUmVzIGZyYW1lIGZyb20gQ04KKwlrRXBsRGxsTXNXYWl0U29hVHJpZyA9IDB4MDgsCS8vIE1OOiB3YWl0IGZvciBTb0EgdHJpZ2dlciAoUFJlcyB0cmFuc21pdHRlZCkKKwlrRXBsRGxsTXNXYWl0QXNuZFRyaWcgPSAweDA5LAkvLyBNTjogd2FpdCBmb3IgQVNuZCB0cmlnZ2VyIChTb0EgdHJhbnNtaXR0ZWQpCisJa0VwbERsbE1zV2FpdEFzbmQgPSAweDBBLAkvLyBNTjogd2FpdCBmb3IgQVNuZCBmcmFtZSBpZiBTb0EgY29udGFpbmVkIGludml0YXRpb24KKworfSB0RXBsRGxsU3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlCWVRFIG1fYmVfYWJTcmNNYWNbNl07CisJdEVkcnZUeEJ1ZmZlciAqbV9wVHhCdWZmZXI7CS8vIEJ1ZmZlcnMgZm9yIFR4LUZyYW1lcworCXVuc2lnbmVkIGludCBtX3VpTWF4VHhGcmFtZXM7CisJQllURSBtX2JGbGFnMTsJCS8vIEZsYWcgMSB3aXRoIEVOLCBFQyBmb3IgUFJlcywgU3RhdHVzUmVzCisJQllURSBtX2JNbkZsYWcxOwkvLyBGbGFnIDEgd2l0aCBFQSwgRVIgZnJvbSBQUmVxLCBTb0Egb2YgTU4KKwlCWVRFIG1fYkZsYWcyOwkJLy8gRmxhZyAyIHdpdGggUFIgYW5kIFJTIGZvciBQUmVzLCBTdGF0dXNSZXMsIElkZW50UmVzCisJdEVwbERsbENvbmZpZ1BhcmFtIG1fRGxsQ29uZmlnUGFyYW07CisJdEVwbERsbElkZW50UGFyYW0gbV9EbGxJZGVudFBhcmFtOworCXRFcGxEbGxTdGF0ZSBtX0RsbFN0YXRlOworCXRFcGxEbGxrQ2JBc3luYyBtX3BmbkNiQXN5bmM7CisJdEVwbERsbEFzbmRGaWx0ZXIgbV9hQXNuZEZpbHRlcltFUExfRExMX01BWF9BU05EX1NFUlZJQ0VfSURdOworCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCXRFcGxEbGxrTm9kZUluZm8gKm1fcEZpcnN0Tm9kZUluZm87CisJdEVwbERsbGtOb2RlSW5mbyAqbV9wQ3VyTm9kZUluZm87CisJdEVwbERsbGtOb2RlSW5mbyBtX2FOb2RlSW5mb1tFUExfTk1UX01BWF9OT0RFX0lEXTsKKwl0RXBsRGxsUmVxU2VydmljZUlkIG1fTGFzdFJlcVNlcnZpY2VJZDsKKwl1bnNpZ25lZCBpbnQgbV91aUxhc3RUYXJnZXROb2RlSWQ7CisjZW5kaWYKKworI2lmIEVQTF9USU1FUl9VU0VfSElHSFJFUyAhPSBGQUxTRQorCXRFcGxUaW1lckhkbCBtX1RpbWVySGRsQ3ljbGU7CS8vIHVzZWQgZm9yIEVQTCBjeWNsZSBtb25pdG9yaW5nIG9uIENOIGFuZCBnZW5lcmF0aW9uIG9uIE1OCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCXRFcGxUaW1lckhkbCBtX1RpbWVySGRsUmVzcG9uc2U7CS8vIHVzZWQgZm9yIENOIHJlc3BvbnNlIG1vbml0b3JpbmcKKyNlbmRpZgkJCQkvLygoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKyNlbmRpZgorCisJdW5zaWduZWQgaW50IG1fdWlDeWNsZUNvdW50OwkvLyBjeWNsZSBjb3VudGVyIChuZWVkZWQgZm9yIG11bHRpcGxleGVkIGN5Y2xlIHN1cHBvcnQpCisJdW5zaWduZWQgbG9uZyBsb25nIG1fdWxsRnJhbWVUaW1lb3V0OwkvLyBmcmFtZSB0aW1lb3V0IChjeWNsZSBsZW5ndGggKyBsb3NzIG9mIGZyYW1lIHRvbGVyYW5jZSkKKworfSB0RXBsRGxsa0luc3RhbmNlOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gaWYgbm8gZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiBzaGFsbCBiZSB1c2VkCisvLyBkZWZpbmUgc3RydWN0dXJlcyBzdGF0aWNhbGx5CitzdGF0aWMgdEVwbERsbGtJbnN0YW5jZSBFcGxEbGxrSW5zdGFuY2VfZzsKKworc3RhdGljIHRFZHJ2VHhCdWZmZXIgYUVwbERsbGtUeEJ1ZmZlcl9sW0VQTF9ETExLX1RYRlJBTUVfQ09VTlRdOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gY2hhbmdlIERMTCBzdGF0ZSBvbiBldmVudAorc3RhdGljIHRFcGxLZXJuZWwgRXBsRGxsa0NoYW5nZVN0YXRlKHRFcGxObXRFdmVudCBObXRFdmVudF9wLAorCQkJCSAgICAgdEVwbE5tdFN0YXRlIE5tdFN0YXRlX3ApOworCisvLyBjYWxsZWQgZnJvbSBFZHJ2SW50ZXJydXB0SGFuZGxlcigpCitzdGF0aWMgdm9pZCBFcGxEbGxrQ2JGcmFtZVJlY2VpdmVkKHRFZHJ2UnhCdWZmZXIgKiBwUnhCdWZmZXJfcCk7CisKKy8vIGNhbGxlZCBmcm9tIEVkcnZJbnRlcnJ1cHRIYW5kbGVyKCkKK3N0YXRpYyB2b2lkIEVwbERsbGtDYkZyYW1lVHJhbnNtaXR0ZWQodEVkcnZUeEJ1ZmZlciAqIHBUeEJ1ZmZlcl9wKTsKKworLy8gY2hlY2sgZnJhbWUgYW5kIHNldCBtaXNzaW5nIGluZm9ybWF0aW9uCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxEbGxrQ2hlY2tGcmFtZSh0RXBsRnJhbWUgKiBwRnJhbWVfcCwKKwkJCQkgICAgdW5zaWduZWQgaW50IHVpRnJhbWVTaXplX3ApOworCisvLyBjYWxsZWQgYnkgaGlnaCByZXNvbHV0aW9uIHRpbWVyIG1vZHVsZSB0byBtb25pdG9yIEVQTCBjeWNsZSBhcyBDTgorI2lmIEVQTF9USU1FUl9VU0VfSElHSFJFUyAhPSBGQUxTRQorc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbERsbGtDYkNuVGltZXIodEVwbFRpbWVyRXZlbnRBcmcgKiBwRXZlbnRBcmdfcCk7CisjZW5kaWYKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKy8vIE1OOiByZXR1cm5zIGludGVybmFsIG5vZGUgaW5mbyBzdHJ1Y3R1cmUKK3N0YXRpYyB0RXBsRGxsa05vZGVJbmZvICpFcGxEbGxrR2V0Tm9kZUluZm8odW5zaWduZWQgaW50IHVpTm9kZUlkX3ApOworCisvLyB0cmFuc21pdCBTb0EKK3N0YXRpYyB0RXBsS2VybmVsIEVwbERsbGtNblNlbmRTb2EodEVwbE5tdFN0YXRlIE5tdFN0YXRlX3AsCisJCQkJICAgdEVwbERsbFN0YXRlICogcERsbFN0YXRlUHJvcG9zZWRfcCwKKwkJCQkgICBCT09MIGZFbmFibGVJbnZpdGF0aW9uX3ApOworCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxEbGxrTW5TZW5kU29jKHZvaWQpOworCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxEbGxrTW5TZW5kUHJlcSh0RXBsTm10U3RhdGUgTm10U3RhdGVfcCwKKwkJCQkgICAgdEVwbERsbFN0YXRlICogcERsbFN0YXRlUHJvcG9zZWRfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbERsbGtBc3luY0ZyYW1lTm90UmVjZWl2ZWQodEVwbERsbFJlcVNlcnZpY2VJZAorCQkJCQkgICAgICAgUmVxU2VydmljZUlkX3AsCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxEbGxrQ2JNblRpbWVyQ3ljbGUodEVwbFRpbWVyRXZlbnRBcmcgKiBwRXZlbnRBcmdfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxEbGxrQ2JNblRpbWVyUmVzcG9uc2UodEVwbFRpbWVyRXZlbnRBcmcgKgorCQkJCQkJICBwRXZlbnRBcmdfcCk7CisKKyNlbmRpZgorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0FkZEluc3RhbmNlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogYWRkIGFuZCBpbml0aWFsaXplIG5ldyBpbnN0YW5jZSBvZiBFUEwgc3RhY2sKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEluaXRQYXJhbV9wICAgICAgICAgICAgPSBpbml0aWFsaXNhdGlvbiBwYXJhbWV0ZXJzIGxpa2UgTUFDIGFkZHJlc3MKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsa0FkZEluc3RhbmNlKHRFcGxEbGxrSW5pdFBhcmFtICogcEluaXRQYXJhbV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdW5zaWduZWQgaW50IHVpSW5kZXg7CisJdEVkcnZJbml0UGFyYW0gRWRydkluaXRQYXJhbTsKKworCS8vIHJlc2V0IGluc3RhbmNlIHN0cnVjdHVyZQorCUVQTF9NRU1TRVQoJkVwbERsbGtJbnN0YW5jZV9nLCAwLCBzaXplb2YoRXBsRGxsa0luc3RhbmNlX2cpKTsKKworI2lmIEVQTF9USU1FUl9VU0VfSElHSFJFUyAhPSBGQUxTRQorCVJldCA9IEVwbFRpbWVySGlnaFJlc2tJbml0KCk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBlcnJvciBvY2N1cmVkIHdoaWxlIGluaXRpYWxpemluZyBoaWdoIHJlc29sdXRpb24gdGltZXIgbW9kdWxlCisJCWdvdG8gRXhpdDsKKwl9CisjZW5kaWYKKworCS8vIGlmIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24gYXZhaWxhYmxlCisJLy8gYWxsb2NhdGUgaW5zdGFuY2Ugc3RydWN0dXJlCisJLy8gYWxsb2NhdGUgVFBETyBhbmQgUlBETyB0YWJsZSB3aXRoIGRlZmF1bHQgc2l6ZQorCisJLy8gaW5pdGlhbGl6ZSBhbmQgbGluayBwb2ludGVycyBpbiBpbnN0YW5jZSBzdHJ1Y3R1cmUgdG8gZnJhbWUgdGFibGVzCisJRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXIgPSBhRXBsRGxsa1R4QnVmZmVyX2w7CisJRXBsRGxsa0luc3RhbmNlX2cubV91aU1heFR4RnJhbWVzID0KKwkgICAgc2l6ZW9mKGFFcGxEbGxrVHhCdWZmZXJfbCkgLyBzaXplb2YodEVkcnZUeEJ1ZmZlcik7CisKKwkvLyBpbml0aWFsaXplIHN0YXRlCisJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSA9IGtFcGxEbGxHc0luaXQ7CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJLy8gc2V0IHVwIG5vZGUgaW5mbyBzdHJ1Y3R1cmUKKwlmb3IgKHVpSW5kZXggPSAwOyB1aUluZGV4IDwgdGFiZW50cmllcyhFcGxEbGxrSW5zdGFuY2VfZy5tX2FOb2RlSW5mbyk7CisJICAgICB1aUluZGV4KyspIHsKKwkJRXBsRGxsa0luc3RhbmNlX2cubV9hTm9kZUluZm9bdWlJbmRleF0ubV91aU5vZGVJZCA9IHVpSW5kZXggKyAxOworCQlFcGxEbGxrSW5zdGFuY2VfZy5tX2FOb2RlSW5mb1t1aUluZGV4XS5tX3dQcmVzUGF5bG9hZExpbWl0ID0KKwkJICAgIDB4RkZGRjsKKwl9CisjZW5kaWYKKworCS8vIGluaXRpYWxpemUgRWRydgorCUVQTF9NRU1DUFkoRWRydkluaXRQYXJhbS5tX2FiTXlNYWNBZGRyLCBwSW5pdFBhcmFtX3AtPm1fYmVfYWJTcmNNYWMsIDYpOworCUVkcnZJbml0UGFyYW0ubV9wZm5SeEhhbmRsZXIgPSBFcGxEbGxrQ2JGcmFtZVJlY2VpdmVkOworCUVkcnZJbml0UGFyYW0ubV9wZm5UeEhhbmRsZXIgPSBFcGxEbGxrQ2JGcmFtZVRyYW5zbWl0dGVkOworCVJldCA9IEVkcnZJbml0KCZFZHJ2SW5pdFBhcmFtKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVycm9yIG9jY3VyZWQgd2hpbGUgaW5pdGlhbGl6aW5nIGV0aGVybmV0IGRyaXZlcgorCQlnb3RvIEV4aXQ7CisJfQorCS8vIGNvcHkgbG9jYWwgTUFDIGFkZHJlc3MgZnJvbSBFdGhlcm5ldCBkcml2ZXIgYmFjayB0byBsb2NhbCBpbnN0YW5jZSBzdHJ1Y3R1cmUKKwkvLyBiZWNhdXNlIEV0aGVybmV0IGRyaXZlciBtYXkgaGF2ZSByZWFkIGl0IGZyb20gY29udHJvbGxlciBFRVBST00KKwlFUExfTUVNQ1BZKEVwbERsbGtJbnN0YW5jZV9nLm1fYmVfYWJTcmNNYWMsIEVkcnZJbml0UGFyYW0ubV9hYk15TWFjQWRkciwKKwkJICAgNik7CisJRVBMX01FTUNQWShwSW5pdFBhcmFtX3AtPm1fYmVfYWJTcmNNYWMsIEVkcnZJbml0UGFyYW0ubV9hYk15TWFjQWRkciwgNik7CisKKwkvLyBpbml0aWFsaXplIFR4QnVmZmVyIGFycmF5CisJZm9yICh1aUluZGV4ID0gMDsgdWlJbmRleCA8IEVwbERsbGtJbnN0YW5jZV9nLm1fdWlNYXhUeEZyYW1lczsKKwkgICAgIHVpSW5kZXgrKykgeworCQlFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlclt1aUluZGV4XS5tX3BiQnVmZmVyID0gTlVMTDsKKwl9CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1ZFVEgpKSAhPSAwKQorCVJldCA9IFZFdGhBZGRJbnN0YW5jZShwSW5pdFBhcmFtX3ApOworI2VuZGlmCisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0RlbEluc3RhbmNlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZGVsZXRlcyBhbiBpbnN0YW5jZSBvZiBFUEwgc3RhY2sKKy8vCisvLyBQYXJhbWV0ZXJzOiAgKG5vbmUpCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtEZWxJbnN0YW5jZSh2b2lkKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyByZXNldCBzdGF0ZQorCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPSBrRXBsRGxsR3NJbml0OworCisjaWYgRVBMX1RJTUVSX1VTRV9ISUdIUkVTICE9IEZBTFNFCisJUmV0ID0gRXBsVGltZXJIaWdoUmVza0RlbEluc3RhbmNlKCk7CisjZW5kaWYKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfVkVUSCkpICE9IDApCisJUmV0ID0gVkV0aERlbEluc3RhbmNlKCk7CisjZW5kaWYKKworCVJldCA9IEVkcnZTaHV0ZG93bigpOworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtDcmVhdGVUeEZyYW1lCisvLworLy8gRGVzY3JpcHRpb246IGNyZWF0ZXMgdGhlIGJ1ZmZlciBmb3IgYSBUeCBmcmFtZSBhbmQgcmVnaXN0ZXJzIGl0IHRvIHRoZQorLy8gICAgICAgICAgICAgIGV0aGVybmV0IGRyaXZlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwdWlIYW5kbGVfcCAgICAgICAgICAgICA9IE9VVDogaGFuZGxlIHRvIGZyYW1lIGJ1ZmZlcgorLy8gICAgICAgICAgICAgIHBwRnJhbWVfcCAgICAgICAgICAgICAgID0gT1VUOiBwb2ludGVyIHRvIHBvaW50ZXIgb2YgRVBMIGZyYW1lCisvLyAgICAgICAgICAgICAgcHVpRnJhbWVTaXplX3AgICAgICAgICAgPSBJTi9PVVQ6IHBvaW50ZXIgdG8gc2l6ZSBvZiBmcmFtZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQgc2l6ZSBpcyBhbHdheXMgZXF1YWwgb3IgbGFyZ2VyIHRoYW4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZCBzaXplLCBpZiB0aGF0IGlzIG5vdCBwb3NzaWJsZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZAorLy8gICAgICAgICAgICAgIE1zZ1R5cGVfcCAgICAgICAgICAgICAgID0gRVBMIG1lc3NhZ2UgdHlwZQorLy8gICAgICAgICAgICAgIFNlcnZpY2VJZF9wICAgICAgICAgICAgID0gU2VydmljZSBJRCBpbiBjYXNlIG9mIEFTbmQgZnJhbWUsIG90aGVyd2lzZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0VwbERsbEFzbmROb3REZWZpbmVkCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtDcmVhdGVUeEZyYW1lKHVuc2lnbmVkIGludCAqcHVpSGFuZGxlX3AsCisJCQkJdEVwbEZyYW1lICoqIHBwRnJhbWVfcCwKKwkJCQl1bnNpZ25lZCBpbnQgKnB1aUZyYW1lU2l6ZV9wLAorCQkJCXRFcGxNc2dUeXBlIE1zZ1R5cGVfcCwKKwkJCQl0RXBsRGxsQXNuZFNlcnZpY2VJZCBTZXJ2aWNlSWRfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxGcmFtZSAqcFR4RnJhbWU7CisJdW5zaWduZWQgaW50IHVpSGFuZGxlID0gRXBsRGxsa0luc3RhbmNlX2cubV91aU1heFR4RnJhbWVzOworCXRFZHJ2VHhCdWZmZXIgKnBUeEJ1ZmZlciA9IE5VTEw7CisKKwlpZiAoTXNnVHlwZV9wID09IGtFcGxNc2dUeXBlQXNuZCkgeworCQkvLyBzZWFyY2ggZm9yIGZpeGVkIFR4IGJ1ZmZlcnMKKwkJaWYgKFNlcnZpY2VJZF9wID09IGtFcGxEbGxBc25kSWRlbnRSZXNwb25zZSkgeworCQkJdWlIYW5kbGUgPSBFUExfRExMS19UWEZSQU1FX0lERU5UUkVTOworCQl9IGVsc2UgaWYgKFNlcnZpY2VJZF9wID09IGtFcGxEbGxBc25kU3RhdHVzUmVzcG9uc2UpIHsKKwkJCXVpSGFuZGxlID0gRVBMX0RMTEtfVFhGUkFNRV9TVEFUVVNSRVM7CisJCX0gZWxzZSBpZiAoKFNlcnZpY2VJZF9wID09IGtFcGxEbGxBc25kTm10UmVxdWVzdCkKKwkJCSAgIHx8IChTZXJ2aWNlSWRfcCA9PSBrRXBsRGxsQXNuZE5tdENvbW1hbmQpKSB7CisJCQl1aUhhbmRsZSA9IEVQTF9ETExLX1RYRlJBTUVfTk1UUkVROworCQl9CisKKwkJaWYgKHVpSGFuZGxlID49IEVwbERsbGtJbnN0YW5jZV9nLm1fdWlNYXhUeEZyYW1lcykgewkvLyBsb29rIGZvciBmcmVlIGVudHJ5CisJCQl1aUhhbmRsZSA9IEVQTF9ETExLX1RYRlJBTUVfUFJFUTsKKwkJCXBUeEJ1ZmZlciA9ICZFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlclt1aUhhbmRsZV07CisJCQlmb3IgKDsgdWlIYW5kbGUgPCBFcGxEbGxrSW5zdGFuY2VfZy5tX3VpTWF4VHhGcmFtZXM7CisJCQkgICAgIHVpSGFuZGxlKyssIHBUeEJ1ZmZlcisrKSB7CisJCQkJaWYgKHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlciA9PSBOVUxMKSB7CS8vIGZyZWUgZW50cnkgZm91bmQKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIGlmIChNc2dUeXBlX3AgPT0ga0VwbE1zZ1R5cGVOb25FcGwpIHsKKwkJdWlIYW5kbGUgPSBFUExfRExMS19UWEZSQU1FX05PTkVQTDsKKwl9IGVsc2UgaWYgKE1zZ1R5cGVfcCA9PSBrRXBsTXNnVHlwZVByZXMpIHsKKwkJdWlIYW5kbGUgPSBFUExfRExMS19UWEZSQU1FX1BSRVM7CisJfSBlbHNlIGlmIChNc2dUeXBlX3AgPT0ga0VwbE1zZ1R5cGVTb2MpIHsKKwkJdWlIYW5kbGUgPSBFUExfRExMS19UWEZSQU1FX1NPQzsKKwl9IGVsc2UgaWYgKE1zZ1R5cGVfcCA9PSBrRXBsTXNnVHlwZVNvYSkgeworCQl1aUhhbmRsZSA9IEVQTF9ETExLX1RYRlJBTUVfU09BOworCX0gZWxzZSB7CQkvLyBsb29rIGZvciBmcmVlIGVudHJ5CisJCXVpSGFuZGxlID0gRVBMX0RMTEtfVFhGUkFNRV9QUkVROworCQlwVHhCdWZmZXIgPSAmRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbdWlIYW5kbGVdOworCQlmb3IgKDsgdWlIYW5kbGUgPCBFcGxEbGxrSW5zdGFuY2VfZy5tX3VpTWF4VHhGcmFtZXM7CisJCSAgICAgdWlIYW5kbGUrKywgcFR4QnVmZmVyKyspIHsKKwkJCWlmIChwVHhCdWZmZXItPm1fcGJCdWZmZXIgPT0gTlVMTCkgewkvLyBmcmVlIGVudHJ5IGZvdW5kCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlciAhPSBOVUxMKSB7CisJCQlSZXQgPSBrRXBsRWRydk5vRnJlZUJ1ZkVudHJ5OworCQkJZ290byBFeGl0OworCQl9CisJfQorCisJLy8gdGVzdCBpZiByZXF1ZXN0ZWQgZW50cnkgaXMgZnJlZQorCXBUeEJ1ZmZlciA9ICZFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlclt1aUhhbmRsZV07CisJaWYgKHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlciAhPSBOVUxMKSB7CS8vIGVudHJ5IGlzIG5vdCBmcmVlCisJCVJldCA9IGtFcGxFZHJ2Tm9GcmVlQnVmRW50cnk7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gc2V0dXAgVHggYnVmZmVyCisJcFR4QnVmZmVyLT5tX0VwbE1zZ1R5cGUgPSBNc2dUeXBlX3A7CisJcFR4QnVmZmVyLT5tX3VpTWF4QnVmZmVyTGVuID0gKnB1aUZyYW1lU2l6ZV9wOworCisJUmV0ID0gRWRydkFsbG9jVHhNc2dCdWZmZXIocFR4QnVmZmVyKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVycm9yIG9jY3VyZWQgd2hpbGUgcmVnaXN0ZXJpbmcgVHggZnJhbWUKKwkJZ290byBFeGl0OworCX0KKwkvLyBiZWNhdXNlIGJ1ZmZlciBzaXplIG1heSBiZSBsYXJnZXIgdGhhbiByZXF1ZXN0ZWQKKwkvLyBtZW1vcml6ZSByZWFsIGxlbmd0aCBvZiBmcmFtZQorCXBUeEJ1ZmZlci0+bV91aVR4TXNnTGVuID0gKnB1aUZyYW1lU2l6ZV9wOworCisJLy8gZmlsbCB3aG9sZSBmcmFtZSB3aXRoIDAKKwlFUExfTUVNU0VUKHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlciwgMCwgcFR4QnVmZmVyLT5tX3VpTWF4QnVmZmVyTGVuKTsKKworCXBUeEZyYW1lID0gKHRFcGxGcmFtZSAqKSBwVHhCdWZmZXItPm1fcGJCdWZmZXI7CisKKwlpZiAoTXNnVHlwZV9wICE9IGtFcGxNc2dUeXBlTm9uRXBsKSB7CS8vIGZpbGwgb3V0IEZyYW1lIG9ubHkgaWYgaXQgaXMgYW4gRVBMIGZyYW1lCisJCS8vIGV0aGVydHlwZQorCQlBbWlTZXRXb3JkVG9CZSgmcFR4RnJhbWUtPm1fYmVfd0V0aGVyVHlwZSwKKwkJCSAgICAgICBFUExfQ19ETExfRVRIRVJUWVBFX0VQTCk7CisJCS8vIHNvdXJjZSBub2RlIElECisJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9sZV9iU3JjTm9kZUlkLAorCQkJICAgICAgIChCWVRFKSBFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbENvbmZpZ1BhcmFtLgorCQkJICAgICAgIG1fdWlOb2RlSWQpOworCQkvLyBzb3VyY2UgTUFDIGFkZHJlc3MKKwkJRVBMX01FTUNQWSgmcFR4RnJhbWUtPm1fYmVfYWJTcmNNYWNbMF0sCisJCQkgICAmRXBsRGxsa0luc3RhbmNlX2cubV9iZV9hYlNyY01hY1swXSwgNik7CisJCXN3aXRjaCAoTXNnVHlwZV9wKSB7CisJCWNhc2Uga0VwbE1zZ1R5cGVBc25kOgorCQkJLy8gZGVzdGluYXRpb24gTUFDIGFkZHJlc3MKKwkJCUFtaVNldFF3b3JkNDhUb0JlKCZwVHhGcmFtZS0+bV9iZV9hYkRzdE1hY1swXSwKKwkJCQkJICBFUExfQ19ETExfTVVMVElDQVNUX0FTTkQpOworCQkJLy8gZGVzdGluYXRpb24gbm9kZSBJRAorCQkJc3dpdGNoIChTZXJ2aWNlSWRfcCkgeworCQkJY2FzZSBrRXBsRGxsQXNuZElkZW50UmVzcG9uc2U6CisJCQljYXNlIGtFcGxEbGxBc25kU3RhdHVzUmVzcG9uc2U6CisJCQkJewkvLyBJZGVudFJlc3BvbnNlcyBhbmQgU3RhdHVzUmVzcG9uc2VzIGFyZSBCcm9hZGNhc3QKKwkJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT4KKwkJCQkJCSAgICAgICBtX2xlX2JEc3ROb2RlSWQsCisJCQkJCQkgICAgICAgKEJZVEUpCisJCQkJCQkgICAgICAgRVBMX0NfQURSX0JST0FEQ0FTVCk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8vIEFTbmQgU2VydmljZSBJRAorCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fbGVfYlNlcnZpY2VJZCwKKwkJCQkgICAgICAgU2VydmljZUlkX3ApOworCQkJYnJlYWs7CisKKwkJY2FzZSBrRXBsTXNnVHlwZVNvYzoKKwkJCS8vIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzCisJCQlBbWlTZXRRd29yZDQ4VG9CZSgmcFR4RnJhbWUtPm1fYmVfYWJEc3RNYWNbMF0sCisJCQkJCSAgRVBMX0NfRExMX01VTFRJQ0FTVF9TT0MpOworCQkJLy8gZGVzdGluYXRpb24gbm9kZSBJRAorCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX2xlX2JEc3ROb2RlSWQsCisJCQkJICAgICAgIChCWVRFKSBFUExfQ19BRFJfQlJPQURDQVNUKTsKKwkJCS8vIHJlc2V0IEZsYWdzCisJCQkvL0FtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fU29jLm1fbGVfYkZsYWcxLCAoQllURSkgMCk7CisJCQkvL0FtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fU29jLm1fbGVfYkZsYWcyLCAoQllURSkgMCk7CisJCQlicmVhazsKKworCQljYXNlIGtFcGxNc2dUeXBlU29hOgorCQkJLy8gZGVzdGluYXRpb24gTUFDIGFkZHJlc3MKKwkJCUFtaVNldFF3b3JkNDhUb0JlKCZwVHhGcmFtZS0+bV9iZV9hYkRzdE1hY1swXSwKKwkJCQkJICBFUExfQ19ETExfTVVMVElDQVNUX1NPQSk7CisJCQkvLyBkZXN0aW5hdGlvbiBub2RlIElECisJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fbGVfYkRzdE5vZGVJZCwKKwkJCQkgICAgICAgKEJZVEUpIEVQTF9DX0FEUl9CUk9BRENBU1QpOworCQkJLy8gcmVzZXQgRmxhZ3MKKwkJCS8vQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Tb2EubV9sZV9iRmxhZzEsIChCWVRFKSAwKTsKKwkJCS8vQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Tb2EubV9sZV9iRmxhZzIsIChCWVRFKSAwKTsKKwkJCS8vIEVQTCBwcm9maWxlIHZlcnNpb24KKwkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fU29hLm1fbGVfYkVwbFZlcnNpb24sCisJCQkJICAgICAgIChCWVRFKSBFUExfU1BFQ19WRVJTSU9OKTsKKwkJCWJyZWFrOworCisJCWNhc2Uga0VwbE1zZ1R5cGVQcmVzOgorCQkJLy8gZGVzdGluYXRpb24gTUFDIGFkZHJlc3MKKwkJCUFtaVNldFF3b3JkNDhUb0JlKCZwVHhGcmFtZS0+bV9iZV9hYkRzdE1hY1swXSwKKwkJCQkJICBFUExfQ19ETExfTVVMVElDQVNUX1BSRVMpOworCQkJLy8gZGVzdGluYXRpb24gbm9kZSBJRAorCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX2xlX2JEc3ROb2RlSWQsCisJCQkJICAgICAgIChCWVRFKSBFUExfQ19BRFJfQlJPQURDQVNUKTsKKwkJCS8vIHJlc2V0IEZsYWdzCisJCQkvL0FtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fUHJlcy5tX2xlX2JGbGFnMSwgKEJZVEUpIDApOworCQkJLy9BbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1ByZXMubV9sZV9iRmxhZzIsIChCWVRFKSAwKTsKKwkJCS8vIFBETyBzaXplCisJCQkvL0FtaVNldFdvcmRUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fUHJlcy5tX2xlX3dTaXplLCAwKTsKKwkJCWJyZWFrOworCisJCWNhc2Uga0VwbE1zZ1R5cGVQcmVxOgorCQkJLy8gcmVzZXQgRmxhZ3MKKwkJCS8vQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9QcmVxLm1fbGVfYkZsYWcxLCAoQllURSkgMCk7CisJCQkvL0FtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fUHJlcS5tX2xlX2JGbGFnMiwgKEJZVEUpIDApOworCQkJLy8gUERPIHNpemUKKwkJCS8vQW1pU2V0V29yZFRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9QcmVxLm1fbGVfd1NpemUsIDApOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCS8vIEVQTCBtZXNzYWdlIHR5cGUKKwkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX2xlX2JNZXNzYWdlVHlwZSwgKEJZVEUpIE1zZ1R5cGVfcCk7CisJfQorCisJKnBwRnJhbWVfcCA9IHBUeEZyYW1lOworCSpwdWlGcmFtZVNpemVfcCA9IHBUeEJ1ZmZlci0+bV91aU1heEJ1ZmZlckxlbjsKKwkqcHVpSGFuZGxlX3AgPSB1aUhhbmRsZTsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrRGVsZXRlVHhGcmFtZQorLy8KKy8vIERlc2NyaXB0aW9uOiBkZWxldGVzIHRoZSBidWZmZXIgZm9yIGEgVHggZnJhbWUgYW5kIGZyZWVzIGl0IGluIHRoZQorLy8gICAgICAgICAgICAgIGV0aGVybmV0IGRyaXZlcgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aUhhbmRsZV9wICAgICAgICAgICAgICA9IElOOiBoYW5kbGUgdG8gZnJhbWUgYnVmZmVyCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtEZWxldGVUeEZyYW1lKHVuc2lnbmVkIGludCB1aUhhbmRsZV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVkcnZUeEJ1ZmZlciAqcFR4QnVmZmVyID0gTlVMTDsKKworCWlmICh1aUhhbmRsZV9wID49IEVwbERsbGtJbnN0YW5jZV9nLm1fdWlNYXhUeEZyYW1lcykgewkvLyBoYW5kbGUgaXMgbm90IHZhbGlkCisJCVJldCA9IGtFcGxEbGxJbGxlZ2FsSGRsOworCQlnb3RvIEV4aXQ7CisJfQorCisJcFR4QnVmZmVyID0gJkVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyW3VpSGFuZGxlX3BdOworCisJLy8gbWFyayBidWZmZXIgYXMgZnJlZSBzbyB0aGF0IGZyYW1lIHdpbGwgbm90IGJlIHNlbmQgaW4gZnV0dXJlIGFueW1vcmUKKwkvLyAkJCQgZC5rLiBXaGF0J3MgdXAgd2l0aCBydW5uaW5nIHRyYW5zbWlzc2lvbnM/CisJcFR4QnVmZmVyLT5tX3VpVHhNc2dMZW4gPSBFUExfRExMS19CVUZMRU5fRU1QVFk7CisJcFR4QnVmZmVyLT5tX3BiQnVmZmVyID0gTlVMTDsKKworCS8vIGRlbGV0ZSBUeCBidWZmZXIKKwlSZXQgPSBFZHJ2UmVsZWFzZVR4TXNnQnVmZmVyKHBUeEJ1ZmZlcik7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBlcnJvciBvY2N1cmVkIHdoaWxlIHJlbGVhc2luZyBUeCBmcmFtZQorCQlnb3RvIEV4aXQ7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtQcm9jZXNzCisvLworLy8gRGVzY3JpcHRpb246IHByb2Nlc3MgdGhlIHBhc3NlZCBldmVudAorLy8KKy8vIFBhcmFtZXRlcnM6ICBwRXZlbnRfcCAgICAgICAgICAgICAgICA9IGV2ZW50IHRvIGJlIHByb2Nlc3NlZAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGxrUHJvY2Vzcyh0RXBsRXZlbnQgKiBwRXZlbnRfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxGcmFtZSAqcFR4RnJhbWU7CisJdEVkcnZUeEJ1ZmZlciAqcFR4QnVmZmVyOworCXVuc2lnbmVkIGludCB1aUhhbmRsZTsKKwl1bnNpZ25lZCBpbnQgdWlGcmFtZVNpemU7CisJQllURSBhYk11bHRpY2FzdE1hY1s2XTsKKwl0RXBsRGxsQXN5bmNSZXFQcmlvcml0eSBBc3luY1JlcVByaW9yaXR5OworCXVuc2lnbmVkIGludCB1aUZyYW1lQ291bnQ7CisJdEVwbE5tdFN0YXRlIE5tdFN0YXRlOworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfUERPSykpICE9IDApCisJdEVwbEZyYW1lSW5mbyBGcmFtZUluZm87CisjZW5kaWYKKworCXN3aXRjaCAocEV2ZW50X3AtPm1fRXZlbnRUeXBlKSB7CisJY2FzZSBrRXBsRXZlbnRUeXBlRGxsa0NyZWF0ZToKKwkJeworCQkJLy8gJCQkIHJlc2V0IGV0aGVybmV0IGRyaXZlcgorCisJCQlObXRTdGF0ZSA9ICooKHRFcGxObXRTdGF0ZSAqKSBwRXZlbnRfcC0+bV9wQXJnKTsKKworCQkJLy8gaW5pdGlhbGl6ZSBmbGFncyBmb3IgUFJlcyBhbmQgU3RhdHVzUmVzCisJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX2JGbGFnMSA9IEVQTF9GUkFNRV9GTEFHMV9FQzsKKwkJCUVwbERsbGtJbnN0YW5jZV9nLm1fYk1uRmxhZzEgPSAwOworCQkJRXBsRGxsa0luc3RhbmNlX2cubV9iRmxhZzIgPSAwOworCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCQkJLy8gaW5pdGlhbGl6ZSBsaW5rZWQgbm9kZSBsaXN0CisJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX3BGaXJzdE5vZGVJbmZvID0gTlVMTDsKKyNlbmRpZgorCisJCQkvLyByZWdpc3RlciBUeEZyYW1lcyBpbiBFZHJ2CisKKwkJCS8vIElkZW50UmVzcG9uc2UKKwkJCXVpRnJhbWVTaXplID0gRVBMX0NfRExMX01JTlNJWkVfSURFTlRSRVM7CisJCQlSZXQgPQorCQkJICAgIEVwbERsbGtDcmVhdGVUeEZyYW1lKCZ1aUhhbmRsZSwgJnBUeEZyYW1lLAorCQkJCQkJICZ1aUZyYW1lU2l6ZSwga0VwbE1zZ1R5cGVBc25kLAorCQkJCQkJIGtFcGxEbGxBc25kSWRlbnRSZXNwb25zZSk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVycm9yIG9jY3VyZWQgd2hpbGUgcmVnaXN0ZXJpbmcgVHggZnJhbWUKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQkvLyBFUEwgcHJvZmlsZSB2ZXJzaW9uCisJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX0FzbmQubV9QYXlsb2FkLgorCQkJCSAgICAgICBtX0lkZW50UmVzcG9uc2UubV9sZV9iRXBsUHJvZmlsZVZlcnNpb24sCisJCQkJICAgICAgIChCWVRFKSBFUExfU1BFQ19WRVJTSU9OKTsKKwkJCS8vIEZlYXR1cmVGbGFncworCQkJQW1pU2V0RHdvcmRUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQuCisJCQkJCW1fSWRlbnRSZXNwb25zZS5tX2xlX2R3RmVhdHVyZUZsYWdzLAorCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbENvbmZpZ1BhcmFtLgorCQkJCQltX2R3RmVhdHVyZUZsYWdzKTsKKwkJCS8vIE1UVQorCQkJQW1pU2V0V29yZFRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkgICAgICAgbV9JZGVudFJlc3BvbnNlLm1fbGVfd010dSwKKwkJCQkgICAgICAgKFdPUkQpIEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCSAgICAgICBtX0RsbENvbmZpZ1BhcmFtLm1fdWlBc3luY010dSk7CisJCQkvLyBQb2xsSW5TaXplCisJCQlBbWlTZXRXb3JkVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX0FzbmQubV9QYXlsb2FkLgorCQkJCSAgICAgICBtX0lkZW50UmVzcG9uc2UubV9sZV93UG9sbEluU2l6ZSwKKwkJCQkgICAgICAgKFdPUkQpIEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCSAgICAgICBtX0RsbENvbmZpZ1BhcmFtLgorCQkJCSAgICAgICBtX3VpUHJlcUFjdFBheWxvYWRMaW1pdCk7CisJCQkvLyBQb2xsT3V0U2l6ZQorCQkJQW1pU2V0V29yZFRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkgICAgICAgbV9JZGVudFJlc3BvbnNlLm1fbGVfd1BvbGxPdXRTaXplLAorCQkJCSAgICAgICAoV09SRCkgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJICAgICAgIG1fRGxsQ29uZmlnUGFyYW0uCisJCQkJICAgICAgIG1fdWlQcmVzQWN0UGF5bG9hZExpbWl0KTsKKwkJCS8vIFJlc3BvbnNlVGltZSAvIFByZXNNYXhMYXRlbmN5CisJCQlBbWlTZXREd29yZFRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJbV9JZGVudFJlc3BvbnNlLm1fbGVfZHdSZXNwb25zZVRpbWUsCisJCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0uCisJCQkJCW1fZHdQcmVzTWF4TGF0ZW5jeSk7CisJCQkvLyBEZXZpY2VUeXBlCisJCQlBbWlTZXREd29yZFRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJbV9JZGVudFJlc3BvbnNlLm1fbGVfZHdEZXZpY2VUeXBlLAorCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbElkZW50UGFyYW0uCisJCQkJCW1fZHdEZXZpY2VUeXBlKTsKKwkJCS8vIFZlbmRvcklkCisJCQlBbWlTZXREd29yZFRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJbV9JZGVudFJlc3BvbnNlLm1fbGVfZHdWZW5kb3JJZCwKKwkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxJZGVudFBhcmFtLgorCQkJCQltX2R3VmVuZG9ySWQpOworCQkJLy8gUHJvZHVjdENvZGUKKwkJCUFtaVNldER3b3JkVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX0FzbmQubV9QYXlsb2FkLgorCQkJCQltX0lkZW50UmVzcG9uc2UubV9sZV9kd1Byb2R1Y3RDb2RlLAorCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbElkZW50UGFyYW0uCisJCQkJCW1fZHdQcm9kdWN0Q29kZSk7CisJCQkvLyBSZXZpc2lvbk51bWJlcgorCQkJQW1pU2V0RHdvcmRUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQuCisJCQkJCW1fSWRlbnRSZXNwb25zZS5tX2xlX2R3UmV2aXNpb25OdW1iZXIsCisJCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsSWRlbnRQYXJhbS4KKwkJCQkJbV9kd1JldmlzaW9uTnVtYmVyKTsKKwkJCS8vIFNlcmlhbE51bWJlcgorCQkJQW1pU2V0RHdvcmRUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQuCisJCQkJCW1fSWRlbnRSZXNwb25zZS5tX2xlX2R3U2VyaWFsTnVtYmVyLAorCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbElkZW50UGFyYW0uCisJCQkJCW1fZHdTZXJpYWxOdW1iZXIpOworCQkJLy8gVmVuZG9yU3BlY2lmaWNFeHQxCisJCQlBbWlTZXRRd29yZDY0VG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX0FzbmQubV9QYXlsb2FkLgorCQkJCQkgIG1fSWRlbnRSZXNwb25zZS4KKwkJCQkJICBtX2xlX3F3VmVuZG9yU3BlY2lmaWNFeHQxLAorCQkJCQkgIEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsSWRlbnRQYXJhbS4KKwkJCQkJICBtX3F3VmVuZG9yU3BlY2lmaWNFeHQxKTsKKwkJCS8vIFZlcmlmeUNvbmZpZ3VyYXRpb25EYXRlCisJCQlBbWlTZXREd29yZFRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJbV9JZGVudFJlc3BvbnNlLgorCQkJCQltX2xlX2R3VmVyaWZ5Q29uZmlndXJhdGlvbkRhdGUsCisJCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsSWRlbnRQYXJhbS4KKwkJCQkJbV9kd1ZlcmlmeUNvbmZpZ3VyYXRpb25EYXRlKTsKKwkJCS8vIFZlcmlmeUNvbmZpZ3VyYXRpb25UaW1lCisJCQlBbWlTZXREd29yZFRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJbV9JZGVudFJlc3BvbnNlLgorCQkJCQltX2xlX2R3VmVyaWZ5Q29uZmlndXJhdGlvblRpbWUsCisJCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsSWRlbnRQYXJhbS4KKwkJCQkJbV9kd1ZlcmlmeUNvbmZpZ3VyYXRpb25UaW1lKTsKKwkJCS8vIEFwcGxpY2F0aW9uU3dEYXRlCisJCQlBbWlTZXREd29yZFRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJbV9JZGVudFJlc3BvbnNlLgorCQkJCQltX2xlX2R3QXBwbGljYXRpb25Td0RhdGUsCisJCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsSWRlbnRQYXJhbS4KKwkJCQkJbV9kd0FwcGxpY2F0aW9uU3dEYXRlKTsKKwkJCS8vIEFwcGxpY2F0aW9uU3dUaW1lCisJCQlBbWlTZXREd29yZFRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJbV9JZGVudFJlc3BvbnNlLgorCQkJCQltX2xlX2R3QXBwbGljYXRpb25Td1RpbWUsCisJCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsSWRlbnRQYXJhbS4KKwkJCQkJbV9kd0FwcGxpY2F0aW9uU3dUaW1lKTsKKwkJCS8vIElQQWRkcmVzcworCQkJQW1pU2V0RHdvcmRUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQuCisJCQkJCW1fSWRlbnRSZXNwb25zZS5tX2xlX2R3SXBBZGRyZXNzLAorCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbElkZW50UGFyYW0uCisJCQkJCW1fZHdJcEFkZHJlc3MpOworCQkJLy8gU3VibmV0TWFzaworCQkJQW1pU2V0RHdvcmRUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQuCisJCQkJCW1fSWRlbnRSZXNwb25zZS5tX2xlX2R3U3VibmV0TWFzaywKKwkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxJZGVudFBhcmFtLgorCQkJCQltX2R3U3VibmV0TWFzayk7CisJCQkvLyBEZWZhdWx0R2F0ZXdheQorCQkJQW1pU2V0RHdvcmRUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQuCisJCQkJCW1fSWRlbnRSZXNwb25zZS5tX2xlX2R3RGVmYXVsdEdhdGV3YXksCisJCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsSWRlbnRQYXJhbS4KKwkJCQkJbV9kd0RlZmF1bHRHYXRld2F5KTsKKwkJCS8vIEhvc3ROYW1lCisJCQlFUExfTUVNQ1BZKCZwVHhGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQuCisJCQkJICAgbV9JZGVudFJlc3BvbnNlLm1fbGVfc0hvc3RuYW1lWzBdLAorCQkJCSAgICZFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbElkZW50UGFyYW0uCisJCQkJICAgbV9zSG9zdG5hbWVbMF0sCisJCQkJICAgc2l6ZW9mKEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsSWRlbnRQYXJhbS4KKwkJCQkJICBtX3NIb3N0bmFtZSkpOworCQkJLy8gVmVuZG9yU3BlY2lmaWNFeHQyCisJCQlFUExfTUVNQ1BZKCZwVHhGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQuCisJCQkJICAgbV9JZGVudFJlc3BvbnNlLm1fbGVfYWJWZW5kb3JTcGVjaWZpY0V4dDJbMF0sCisJCQkJICAgJkVwbERsbGtJbnN0YW5jZV9nLm1fRGxsSWRlbnRQYXJhbS4KKwkJCQkgICBtX2FiVmVuZG9yU3BlY2lmaWNFeHQyWzBdLAorCQkJCSAgIHNpemVvZihFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbElkZW50UGFyYW0uCisJCQkJCSAgbV9hYlZlbmRvclNwZWNpZmljRXh0MikpOworCisJCQkvLyBTdGF0dXNSZXNwb25zZQorCQkJdWlGcmFtZVNpemUgPSBFUExfQ19ETExfTUlOU0laRV9TVEFUVVNSRVM7CisJCQlSZXQgPQorCQkJICAgIEVwbERsbGtDcmVhdGVUeEZyYW1lKCZ1aUhhbmRsZSwgJnBUeEZyYW1lLAorCQkJCQkJICZ1aUZyYW1lU2l6ZSwga0VwbE1zZ1R5cGVBc25kLAorCQkJCQkJIGtFcGxEbGxBc25kU3RhdHVzUmVzcG9uc2UpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBlcnJvciBvY2N1cmVkIHdoaWxlIHJlZ2lzdGVyaW5nIFR4IGZyYW1lCisJCQkJZ290byBFeGl0OworCQkJfQorCQkJLy8gUFJlcyAkJCQgbWF5YmUgbW92ZSB0aGlzIHRvIFBETyBtb2R1bGUKKwkJCWlmICgoRXBsRGxsa0luc3RhbmNlX2cubV9EbGxDb25maWdQYXJhbS5tX2ZBc3luY09ubHkgPT0KKwkJCSAgICAgRkFMU0UpCisJCQkgICAgJiYgKEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0ubV91aVByZXNBY3RQYXlsb2FkTGltaXQgPj0gMzYpKSB7CS8vIGl0IGlzIG5vdCBjb25maWd1cmVkIGFzIGFzeW5jLW9ubHkgQ04sCisJCQkJLy8gc28gdGFrZSBwYXJ0IGluIGlzb2Nocm9ub3VzIHBoYXNlIGFuZCByZWdpc3RlciBQUmVzIGZyYW1lCisJCQkJdWlGcmFtZVNpemUgPQorCQkJCSAgICBFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbENvbmZpZ1BhcmFtLgorCQkJCSAgICBtX3VpUHJlc0FjdFBheWxvYWRMaW1pdCArIDI0OworCQkJCVJldCA9CisJCQkJICAgIEVwbERsbGtDcmVhdGVUeEZyYW1lKCZ1aUhhbmRsZSwgJnBUeEZyYW1lLAorCQkJCQkJCSAmdWlGcmFtZVNpemUsCisJCQkJCQkJIGtFcGxNc2dUeXBlUHJlcywKKwkJCQkJCQkga0VwbERsbEFzbmROb3REZWZpbmVkKTsKKwkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVycm9yIG9jY3VyZWQgd2hpbGUgcmVnaXN0ZXJpbmcgVHggZnJhbWUKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1BET0spKSAhPSAwKQorCQkJCS8vIGluaXRpYWxseSBlbmNvZGUgVFBETyAtPiBpbmZvcm0gUERPIG1vZHVsZQorCQkJCUZyYW1lSW5mby5tX3BGcmFtZSA9IHBUeEZyYW1lOworCQkJCUZyYW1lSW5mby5tX3VpRnJhbWVTaXplID0gdWlGcmFtZVNpemU7CisJCQkJUmV0ID0gRXBsUGRva0NiUGRvVHJhbnNtaXR0ZWQoJkZyYW1lSW5mbyk7CisjZW5kaWYKKwkJCQkvLyByZXNldCBjeWNsZSBjb3VudGVyCisJCQkJRXBsRGxsa0luc3RhbmNlX2cubV91aUN5Y2xlQ291bnQgPSAwOworCQkJfSBlbHNlIHsJLy8gaXQgaXMgYW4gYXN5bmMtb25seSBDTgorCQkJCS8vIGZvb2wgRXBsRGxsa0NoYW5nZVN0YXRlKCkgdG8gdGhpbmsgdGhhdCBQUmVzIHdhcyBub3QgZXhwZWN0ZWQKKwkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX3VpQ3ljbGVDb3VudCA9IDE7CisJCQl9CisKKwkJCS8vIE5NVCByZXF1ZXN0CisJCQl1aUZyYW1lU2l6ZSA9IEVQTF9DX0lQX01BWF9NVFU7CisJCQlSZXQgPQorCQkJICAgIEVwbERsbGtDcmVhdGVUeEZyYW1lKCZ1aUhhbmRsZSwgJnBUeEZyYW1lLAorCQkJCQkJICZ1aUZyYW1lU2l6ZSwga0VwbE1zZ1R5cGVBc25kLAorCQkJCQkJIGtFcGxEbGxBc25kTm10UmVxdWVzdCk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVycm9yIG9jY3VyZWQgd2hpbGUgcmVnaXN0ZXJpbmcgVHggZnJhbWUKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQkvLyBtYXJrIFR4IGJ1ZmZlciBhcyBlbXB0eQorCQkJRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbdWlIYW5kbGVdLm1fdWlUeE1zZ0xlbiA9CisJCQkgICAgRVBMX0RMTEtfQlVGTEVOX0VNUFRZOworCisJCQkvLyBub24tRVBMIGZyYW1lCisJCQl1aUZyYW1lU2l6ZSA9IEVQTF9DX0lQX01BWF9NVFU7CisJCQlSZXQgPQorCQkJICAgIEVwbERsbGtDcmVhdGVUeEZyYW1lKCZ1aUhhbmRsZSwgJnBUeEZyYW1lLAorCQkJCQkJICZ1aUZyYW1lU2l6ZSwKKwkJCQkJCSBrRXBsTXNnVHlwZU5vbkVwbCwKKwkJCQkJCSBrRXBsRGxsQXNuZE5vdERlZmluZWQpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBlcnJvciBvY2N1cmVkIHdoaWxlIHJlZ2lzdGVyaW5nIFR4IGZyYW1lCisJCQkJZ290byBFeGl0OworCQkJfQorCQkJLy8gbWFyayBUeCBidWZmZXIgYXMgZW1wdHkKKwkJCUVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyW3VpSGFuZGxlXS5tX3VpVHhNc2dMZW4gPQorCQkJICAgIEVQTF9ETExLX0JVRkxFTl9FTVBUWTsKKworCQkJLy8gcmVnaXN0ZXIgbXVsdGljYXN0IE1BQ3MgaW4gZXRoZXJuZXQgZHJpdmVyCisJCQlBbWlTZXRRd29yZDQ4VG9CZSgmYWJNdWx0aWNhc3RNYWNbMF0sCisJCQkJCSAgRVBMX0NfRExMX01VTFRJQ0FTVF9TT0MpOworCQkJUmV0ID0gRWRydkRlZmluZVJ4TWFjQWRkckVudHJ5KGFiTXVsdGljYXN0TWFjKTsKKwkJCUFtaVNldFF3b3JkNDhUb0JlKCZhYk11bHRpY2FzdE1hY1swXSwKKwkJCQkJICBFUExfQ19ETExfTVVMVElDQVNUX1NPQSk7CisJCQlSZXQgPSBFZHJ2RGVmaW5lUnhNYWNBZGRyRW50cnkoYWJNdWx0aWNhc3RNYWMpOworCQkJQW1pU2V0UXdvcmQ0OFRvQmUoJmFiTXVsdGljYXN0TWFjWzBdLAorCQkJCQkgIEVQTF9DX0RMTF9NVUxUSUNBU1RfUFJFUyk7CisJCQlSZXQgPSBFZHJ2RGVmaW5lUnhNYWNBZGRyRW50cnkoYWJNdWx0aWNhc3RNYWMpOworCQkJQW1pU2V0UXdvcmQ0OFRvQmUoJmFiTXVsdGljYXN0TWFjWzBdLAorCQkJCQkgIEVQTF9DX0RMTF9NVUxUSUNBU1RfQVNORCk7CisJCQlSZXQgPSBFZHJ2RGVmaW5lUnhNYWNBZGRyRW50cnkoYWJNdWx0aWNhc3RNYWMpOworCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCQkJaWYgKE5tdFN0YXRlID49IGtFcGxObXRNc05vdEFjdGl2ZSkgewkvLyBsb2NhbCBub2RlIGlzIE1OCisJCQkJdW5zaWduZWQgaW50IHVpSW5kZXg7CisKKwkJCQkvLyBTb0MKKwkJCQl1aUZyYW1lU2l6ZSA9IEVQTF9DX0RMTF9NSU5TSVpFX1NPQzsKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxEbGxrQ3JlYXRlVHhGcmFtZSgmdWlIYW5kbGUsICZwVHhGcmFtZSwKKwkJCQkJCQkgJnVpRnJhbWVTaXplLAorCQkJCQkJCSBrRXBsTXNnVHlwZVNvYywKKwkJCQkJCQkga0VwbERsbEFzbmROb3REZWZpbmVkKTsKKwkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVycm9yIG9jY3VyZWQgd2hpbGUgcmVnaXN0ZXJpbmcgVHggZnJhbWUKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKwkJCQkvLyBTb0EKKwkJCQl1aUZyYW1lU2l6ZSA9IEVQTF9DX0RMTF9NSU5TSVpFX1NPQTsKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxEbGxrQ3JlYXRlVHhGcmFtZSgmdWlIYW5kbGUsICZwVHhGcmFtZSwKKwkJCQkJCQkgJnVpRnJhbWVTaXplLAorCQkJCQkJCSBrRXBsTXNnVHlwZVNvYSwKKwkJCQkJCQkga0VwbERsbEFzbmROb3REZWZpbmVkKTsKKwkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVycm9yIG9jY3VyZWQgd2hpbGUgcmVnaXN0ZXJpbmcgVHggZnJhbWUKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKworCQkJCWZvciAodWlJbmRleCA9IDA7CisJCQkJICAgICB1aUluZGV4IDwKKwkJCQkgICAgIHRhYmVudHJpZXMoRXBsRGxsa0luc3RhbmNlX2cubV9hTm9kZUluZm8pOworCQkJCSAgICAgdWlJbmRleCsrKSB7CisvLyAgICAgICAgICAgICAgICAgICAgRXBsRGxsa0luc3RhbmNlX2cubV9hTm9kZUluZm9bdWlJbmRleF0ubV91aU5vZGVJZCA9IHVpSW5kZXggKyAxOworCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX2FOb2RlSW5mb1t1aUluZGV4XS4KKwkJCQkJICAgIG1fd1ByZXNQYXlsb2FkTGltaXQgPQorCQkJCQkgICAgKFdPUkQpIEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9EbGxDb25maWdQYXJhbS4KKwkJCQkJICAgIG1fdWlJc29jaHJSeE1heFBheWxvYWQ7CisJCQkJfQorCisJCQkJLy8gY2FsY3VsYXRlIGN5Y2xlIGxlbmd0aAorCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fdWxsRnJhbWVUaW1lb3V0ID0gMTAwMExMCisJCQkJICAgICoKKwkJCQkgICAgKCh1bnNpZ25lZCBsb25nIGxvbmcpRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJICAgICBtX0RsbENvbmZpZ1BhcmFtLm1fZHdDeWNsZUxlbik7CisJCQl9CisjZW5kaWYgLy8oKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisKKwkJCVJldCA9IEVwbERsbGtDYWxBc3luY0NsZWFyQnVmZmVyKCk7CisKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxFdmVudFR5cGVEbGxrRGVzdHJveToKKwkJeworCQkJLy8gZGVzdHJveSBhbGwgZGF0YSBzdHJ1Y3R1cmVzCisKKwkJCU5tdFN0YXRlID0gKigodEVwbE5tdFN0YXRlICopIHBFdmVudF9wLT5tX3BBcmcpOworCisJCQkvLyBkZWxldGUgVHggZnJhbWVzCisJCQlSZXQgPSBFcGxEbGxrRGVsZXRlVHhGcmFtZShFUExfRExMS19UWEZSQU1FX0lERU5UUkVTKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gZXJyb3Igb2NjdXJlZCB3aGlsZSBkZXJlZ2lzdGVyaW5nIFR4IGZyYW1lCisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlSZXQgPSBFcGxEbGxrRGVsZXRlVHhGcmFtZShFUExfRExMS19UWEZSQU1FX1NUQVRVU1JFUyk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVycm9yIG9jY3VyZWQgd2hpbGUgZGVyZWdpc3RlcmluZyBUeCBmcmFtZQorCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJUmV0ID0gRXBsRGxsa0RlbGV0ZVR4RnJhbWUoRVBMX0RMTEtfVFhGUkFNRV9QUkVTKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gZXJyb3Igb2NjdXJlZCB3aGlsZSBkZXJlZ2lzdGVyaW5nIFR4IGZyYW1lCisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlSZXQgPSBFcGxEbGxrRGVsZXRlVHhGcmFtZShFUExfRExMS19UWEZSQU1FX05NVFJFUSk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVycm9yIG9jY3VyZWQgd2hpbGUgZGVyZWdpc3RlcmluZyBUeCBmcmFtZQorCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJUmV0ID0gRXBsRGxsa0RlbGV0ZVR4RnJhbWUoRVBMX0RMTEtfVFhGUkFNRV9OT05FUEwpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBlcnJvciBvY2N1cmVkIHdoaWxlIGRlcmVnaXN0ZXJpbmcgVHggZnJhbWUKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCQkJaWYgKE5tdFN0YXRlID49IGtFcGxObXRNc05vdEFjdGl2ZSkgewkvLyBsb2NhbCBub2RlIHdhcyBNTgorCQkJCXVuc2lnbmVkIGludCB1aUluZGV4OworCisJCQkJUmV0ID0KKwkJCQkgICAgRXBsRGxsa0RlbGV0ZVR4RnJhbWUoRVBMX0RMTEtfVFhGUkFNRV9TT0MpOworCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gZXJyb3Igb2NjdXJlZCB3aGlsZSBkZXJlZ2lzdGVyaW5nIFR4IGZyYW1lCisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxEbGxrRGVsZXRlVHhGcmFtZShFUExfRExMS19UWEZSQU1FX1NPQSk7CisJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBlcnJvciBvY2N1cmVkIHdoaWxlIGRlcmVnaXN0ZXJpbmcgVHggZnJhbWUKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKworCQkJCWZvciAodWlJbmRleCA9IDA7CisJCQkJICAgICB1aUluZGV4IDwKKwkJCQkgICAgIHRhYmVudHJpZXMoRXBsRGxsa0luc3RhbmNlX2cubV9hTm9kZUluZm8pOworCQkJCSAgICAgdWlJbmRleCsrKSB7CisJCQkJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fYU5vZGVJbmZvW3VpSW5kZXhdLgorCQkJCQkgICAgbV9wUHJlcVR4QnVmZmVyICE9IE5VTEwpIHsKKwkJCQkJCXVpSGFuZGxlID0KKwkJCQkJCSAgICBFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICBtX2FOb2RlSW5mb1t1aUluZGV4XS4KKwkJCQkJCSAgICBtX3BQcmVxVHhCdWZmZXIgLQorCQkJCQkJICAgIEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fcFR4QnVmZmVyOworCQkJCQkJRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgbV9hTm9kZUluZm9bdWlJbmRleF0uCisJCQkJCQkgICAgbV9wUHJlcVR4QnVmZmVyID0gTlVMTDsKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsRGxsa0RlbGV0ZVR4RnJhbWUKKwkJCQkJCSAgICAodWlIYW5kbGUpOworCQkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBlcnJvciBvY2N1cmVkIHdoaWxlIGRlcmVnaXN0ZXJpbmcgVHggZnJhbWUKKwkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQl9CisKKwkJCQkJfQorCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX2FOb2RlSW5mb1t1aUluZGV4XS4KKwkJCQkJICAgIG1fd1ByZXNQYXlsb2FkTGltaXQgPSAweEZGRkY7CisJCQkJfQorCQkJfQorI2VuZGlmIC8vKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCisJCQkvLyBkZXJlZ2lzdGVyIG11bHRpY2FzdCBNQUNzIGluIGV0aGVybmV0IGRyaXZlcgorCQkJQW1pU2V0UXdvcmQ0OFRvQmUoJmFiTXVsdGljYXN0TWFjWzBdLAorCQkJCQkgIEVQTF9DX0RMTF9NVUxUSUNBU1RfU09DKTsKKwkJCVJldCA9IEVkcnZVbmRlZmluZVJ4TWFjQWRkckVudHJ5KGFiTXVsdGljYXN0TWFjKTsKKwkJCUFtaVNldFF3b3JkNDhUb0JlKCZhYk11bHRpY2FzdE1hY1swXSwKKwkJCQkJICBFUExfQ19ETExfTVVMVElDQVNUX1NPQSk7CisJCQlSZXQgPSBFZHJ2VW5kZWZpbmVSeE1hY0FkZHJFbnRyeShhYk11bHRpY2FzdE1hYyk7CisJCQlBbWlTZXRRd29yZDQ4VG9CZSgmYWJNdWx0aWNhc3RNYWNbMF0sCisJCQkJCSAgRVBMX0NfRExMX01VTFRJQ0FTVF9QUkVTKTsKKwkJCVJldCA9IEVkcnZVbmRlZmluZVJ4TWFjQWRkckVudHJ5KGFiTXVsdGljYXN0TWFjKTsKKwkJCUFtaVNldFF3b3JkNDhUb0JlKCZhYk11bHRpY2FzdE1hY1swXSwKKwkJCQkJICBFUExfQ19ETExfTVVMVElDQVNUX0FTTkQpOworCQkJUmV0ID0gRWRydlVuZGVmaW5lUnhNYWNBZGRyRW50cnkoYWJNdWx0aWNhc3RNYWMpOworCisJCQkvLyBkZWxldGUgdGltZXIKKyNpZiBFUExfVElNRVJfVVNFX0hJR0hSRVMgIT0gRkFMU0UKKwkJCVJldCA9CisJCQkgICAgRXBsVGltZXJIaWdoUmVza0RlbGV0ZVRpbWVyKCZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCQltX1RpbWVySGRsQ3ljbGUpOworI2VuZGlmCisKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxFdmVudFR5cGVEbGxrRmlsbFR4OgorCQl7CisJCQkvLyBmaWxsIFR4QnVmZmVyIG9mIHNwZWNpZmllZCBwcmlvcml0eSB3aXRoIG5ldyBmcmFtZSBpZiBlbXB0eQorCisJCQlwVHhGcmFtZSA9IE5VTEw7CisJCQlBc3luY1JlcVByaW9yaXR5ID0KKwkJCSAgICAqKCh0RXBsRGxsQXN5bmNSZXFQcmlvcml0eSAqKSBwRXZlbnRfcC0+bV9wQXJnKTsKKwkJCXN3aXRjaCAoQXN5bmNSZXFQcmlvcml0eSkgeworCQkJY2FzZSBrRXBsRGxsQXN5bmNSZXFQcmlvTm10OgkvLyBOTVQgcmVxdWVzdCBwcmlvcml0eQorCQkJCXsKKwkJCQkJcFR4QnVmZmVyID0KKwkJCQkJICAgICZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fcFR4QnVmZmVyCisJCQkJCSAgICBbRVBMX0RMTEtfVFhGUkFNRV9OTVRSRVFdOworCQkJCQlpZiAocFR4QnVmZmVyLT5tX3BiQnVmZmVyICE9IE5VTEwpIHsJLy8gTm10UmVxdWVzdCBkb2VzIGV4aXN0CisJCQkJCQkvLyBjaGVjayBpZiBmcmFtZSBpcyBlbXB0eSBhbmQgbm90IGJlaW5nIGZpbGxlZAorCQkJCQkJaWYgKHBUeEJ1ZmZlci0+bV91aVR4TXNnTGVuID09CisJCQkJCQkgICAgRVBMX0RMTEtfQlVGTEVOX0VNUFRZKSB7CisJCQkJCQkJLy8gbWFyayBUeCBidWZmZXIgYXMgZmlsbGluZyBpcyBpbiBwcm9jZXNzCisJCQkJCQkJcFR4QnVmZmVyLT4KKwkJCQkJCQkgICAgbV91aVR4TXNnTGVuID0KKwkJCQkJCQkgICAgRVBMX0RMTEtfQlVGTEVOX0ZJTExJTkc7CisJCQkJCQkJLy8gc2V0IG1heCBidWZmZXIgc2l6ZSBhcyBpbnB1dCBwYXJhbWV0ZXIKKwkJCQkJCQl1aUZyYW1lU2l6ZSA9CisJCQkJCQkJICAgIHBUeEJ1ZmZlci0+CisJCQkJCQkJICAgIG1fdWlNYXhCdWZmZXJMZW47CisJCQkJCQkJLy8gY29weSBmcmFtZSBmcm9tIHNoYXJlZCBsb29wIGJ1ZmZlciB0byBUeCBidWZmZXIKKwkJCQkJCQlSZXQgPQorCQkJCQkJCSAgICBFcGxEbGxrQ2FsQXN5bmNHZXRUeEZyYW1lCisJCQkJCQkJICAgIChwVHhCdWZmZXItPgorCQkJCQkJCSAgICAgbV9wYkJ1ZmZlciwKKwkJCQkJCQkgICAgICZ1aUZyYW1lU2l6ZSwKKwkJCQkJCQkgICAgIEFzeW5jUmVxUHJpb3JpdHkpOworCQkJCQkJCWlmIChSZXQgPT0KKwkJCQkJCQkgICAga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCQkJcFR4RnJhbWUgPQorCQkJCQkJCQkgICAgKHRFcGxGcmFtZQorCQkJCQkJCQkgICAgICopCisJCQkJCQkJCSAgICBwVHhCdWZmZXItPgorCQkJCQkJCQkgICAgbV9wYkJ1ZmZlcjsKKwkJCQkJCQkJUmV0ID0KKwkJCQkJCQkJICAgIEVwbERsbGtDaGVja0ZyYW1lCisJCQkJCQkJCSAgICAocFR4RnJhbWUsCisJCQkJCQkJCSAgICAgdWlGcmFtZVNpemUpOworCisJCQkJCQkJCS8vIHNldCBidWZmZXIgdmFsaWQKKwkJCQkJCQkJcFR4QnVmZmVyLT4KKwkJCQkJCQkJICAgIG1fdWlUeE1zZ0xlbgorCQkJCQkJCQkgICAgPQorCQkJCQkJCQkgICAgdWlGcmFtZVNpemU7CisJCQkJCQkJfSBlbHNlIGlmIChSZXQgPT0ga0VwbERsbEFzeW5jVHhCdWZmZXJFbXB0eSkgewkvLyBlbXB0eSBUeCBidWZmZXIgaXMgbm90IGEgcmVhbCBwcm9ibGVtCisJCQkJCQkJCS8vIHNvIGp1c3QgaWdub3JlIGl0CisJCQkJCQkJCVJldCA9CisJCQkJCQkJCSAgICBrRXBsU3VjY2Vzc2Z1bDsKKwkJCQkJCQkJLy8gbWFyayBUeCBidWZmZXIgYXMgZW1wdHkKKwkJCQkJCQkJcFR4QnVmZmVyLT4KKwkJCQkJCQkJICAgIG1fdWlUeE1zZ0xlbgorCQkJCQkJCQkgICAgPQorCQkJCQkJCQkgICAgRVBMX0RMTEtfQlVGTEVOX0VNUFRZOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CS8vIGdlbmVyaWMgcHJpb3JpdHkKKwkJCQl7CisJCQkJCXBUeEJ1ZmZlciA9CisJCQkJCSAgICAmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCSAgICBtX3BUeEJ1ZmZlcgorCQkJCQkgICAgW0VQTF9ETExLX1RYRlJBTUVfTk9ORVBMXTsKKwkJCQkJaWYgKHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlciAhPSBOVUxMKSB7CS8vIG5vbi1FUEwgZnJhbWUgZG9lcyBleGlzdAorCQkJCQkJLy8gY2hlY2sgaWYgZnJhbWUgaXMgZW1wdHkgYW5kIG5vdCBiZWluZyBmaWxsZWQKKwkJCQkJCWlmIChwVHhCdWZmZXItPm1fdWlUeE1zZ0xlbiA9PQorCQkJCQkJICAgIEVQTF9ETExLX0JVRkxFTl9FTVBUWSkgeworCQkJCQkJCS8vIG1hcmsgVHggYnVmZmVyIGFzIGZpbGxpbmcgaXMgaW4gcHJvY2VzcworCQkJCQkJCXBUeEJ1ZmZlci0+CisJCQkJCQkJICAgIG1fdWlUeE1zZ0xlbiA9CisJCQkJCQkJICAgIEVQTF9ETExLX0JVRkxFTl9GSUxMSU5HOworCQkJCQkJCS8vIHNldCBtYXggYnVmZmVyIHNpemUgYXMgaW5wdXQgcGFyYW1ldGVyCisJCQkJCQkJdWlGcmFtZVNpemUgPQorCQkJCQkJCSAgICBwVHhCdWZmZXItPgorCQkJCQkJCSAgICBtX3VpTWF4QnVmZmVyTGVuOworCQkJCQkJCS8vIGNvcHkgZnJhbWUgZnJvbSBzaGFyZWQgbG9vcCBidWZmZXIgdG8gVHggYnVmZmVyCisJCQkJCQkJUmV0ID0KKwkJCQkJCQkgICAgRXBsRGxsa0NhbEFzeW5jR2V0VHhGcmFtZQorCQkJCQkJCSAgICAocFR4QnVmZmVyLT4KKwkJCQkJCQkgICAgIG1fcGJCdWZmZXIsCisJCQkJCQkJICAgICAmdWlGcmFtZVNpemUsCisJCQkJCQkJICAgICBBc3luY1JlcVByaW9yaXR5KTsKKwkJCQkJCQlpZiAoUmV0ID09CisJCQkJCQkJICAgIGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJCXBUeEZyYW1lID0KKwkJCQkJCQkJICAgICh0RXBsRnJhbWUKKwkJCQkJCQkJICAgICAqKQorCQkJCQkJCQkgICAgcFR4QnVmZmVyLT4KKwkJCQkJCQkJICAgIG1fcGJCdWZmZXI7CisJCQkJCQkJCVJldCA9CisJCQkJCQkJCSAgICBFcGxEbGxrQ2hlY2tGcmFtZQorCQkJCQkJCQkgICAgKHBUeEZyYW1lLAorCQkJCQkJCQkgICAgIHVpRnJhbWVTaXplKTsKKworCQkJCQkJCQkvLyBzZXQgYnVmZmVyIHZhbGlkCisJCQkJCQkJCXBUeEJ1ZmZlci0+CisJCQkJCQkJCSAgICBtX3VpVHhNc2dMZW4KKwkJCQkJCQkJICAgID0KKwkJCQkJCQkJICAgIHVpRnJhbWVTaXplOworCQkJCQkJCX0gZWxzZSBpZiAoUmV0ID09IGtFcGxEbGxBc3luY1R4QnVmZmVyRW1wdHkpIHsJLy8gZW1wdHkgVHggYnVmZmVyIGlzIG5vdCBhIHJlYWwgcHJvYmxlbQorCQkJCQkJCQkvLyBzbyBqdXN0IGlnbm9yZSBpdAorCQkJCQkJCQlSZXQgPQorCQkJCQkJCQkgICAga0VwbFN1Y2Nlc3NmdWw7CisJCQkJCQkJCS8vIG1hcmsgVHggYnVmZmVyIGFzIGVtcHR5CisJCQkJCQkJCXBUeEJ1ZmZlci0+CisJCQkJCQkJCSAgICBtX3VpVHhNc2dMZW4KKwkJCQkJCQkJICAgID0KKwkJCQkJCQkJICAgIEVQTF9ETExLX0JVRkxFTl9FTVBUWTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlObXRTdGF0ZSA9IEVwbE5tdGtHZXRObXRTdGF0ZSgpOworCisJCQlpZiAoKE5tdFN0YXRlID09IGtFcGxObXRDc0Jhc2ljRXRoZXJuZXQpIHx8IChObXRTdGF0ZSA9PSBrRXBsTm10TXNCYXNpY0V0aGVybmV0KSkgewkvLyBzZW5kIGZyYW1lIGltbWVkaWF0ZWx5CisJCQkJaWYgKHBUeEZyYW1lICE9IE5VTEwpIHsJLy8gZnJhbWUgaXMgcHJlc2VudAorCQkJCQkvLyBwYWRkaW5nIGlzIGRvbmUgYnkgRWRydiBvciBldGhlcm5ldCBjb250cm9sbGVyCisJCQkJCVJldCA9IEVkcnZTZW5kVHhNc2cocFR4QnVmZmVyKTsKKwkJCQl9IGVsc2UgewkvLyBubyBmcmFtZSBtb3ZlZCB0byBUeEJ1ZmZlcgorCQkJCQkvLyBjaGVjayBpZiBUeEJ1ZmZlcnMgY29udGFpbiB1bnNlbnQgZnJhbWVzCisJCQkJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX05NVFJFUV0ubV91aVR4TXNnTGVuID4gRVBMX0RMTEtfQlVGTEVOX0VNUFRZKSB7CS8vIE5NVCByZXF1ZXN0IFR4IGJ1ZmZlciBjb250YWlucyBhIGZyYW1lCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVkcnZTZW5kVHhNc2cKKwkJCQkJCSAgICAoJkVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJICAgICBtX3BUeEJ1ZmZlcgorCQkJCQkJICAgICBbRVBMX0RMTEtfVFhGUkFNRV9OTVRSRVFdKTsKKwkJCQkJfSBlbHNlIGlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX05PTkVQTF0ubV91aVR4TXNnTGVuID4gRVBMX0RMTEtfQlVGTEVOX0VNUFRZKSB7CS8vIG5vbi1FUEwgVHggYnVmZmVyIGNvbnRhaW5zIGEgZnJhbWUKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRWRydlNlbmRUeE1zZworCQkJCQkJICAgICgmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgIG1fcFR4QnVmZmVyCisJCQkJCQkgICAgIFtFUExfRExMS19UWEZSQU1FX05PTkVQTF0pOworCQkJCQl9CisJCQkJCWlmIChSZXQgPT0ga0VwbEludmFsaWRPcGVyYXRpb24pIHsJLy8gaWdub3JlIGVycm9yIGlmIGNhdXNlZCBieSBhbHJlYWR5IGFjdGl2ZSB0cmFuc21pc3Npb24KKwkJCQkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJCQl9CisJCQkJfQorCQkJCS8vIHJlc2V0IFBSZXMgZmxhZyAyCisJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9iRmxhZzIgPSAwOworCQkJfSBlbHNlIHsKKwkJCQkvLyB1cGRhdGUgRmxhZyAyIChQUiwgUlMpCisJCQkJUmV0ID0KKwkJCQkgICAgRXBsRGxsa0NhbEFzeW5jR2V0VHhDb3VudCgmQXN5bmNSZXFQcmlvcml0eSwKKwkJCQkJCQkgICAgICAmdWlGcmFtZUNvdW50KTsKKwkJCQlpZiAoQXN5bmNSZXFQcmlvcml0eSA9PSBrRXBsRGxsQXN5bmNSZXFQcmlvTm10KSB7CS8vIG5vbi1lbXB0eSBGSUZPIHdpdGggaGlnaHRlc3QgcHJpb3JpdHkgaXMgZm9yIE5NVCByZXF1ZXN0cworCQkJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9OTVRSRVFdLm1fdWlUeE1zZ0xlbiA+IEVQTF9ETExLX0JVRkxFTl9FTVBUWSkgewkvLyBOTVQgcmVxdWVzdCBUeCBidWZmZXIgY29udGFpbnMgYSBmcmFtZQorCQkJCQkJLy8gYWRkIG9uZSBtb3JlIGZyYW1lCisJCQkJCQl1aUZyYW1lQ291bnQrKzsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CS8vIG5vbi1lbXB0eSBGSUZPIHdpdGggaGlnaGVzdCBwcmlvcml0eSBpcyBmb3IgZ2VuZXJpYyBmcmFtZXMKKwkJCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyW0VQTF9ETExLX1RYRlJBTUVfTk1UUkVRXS5tX3VpVHhNc2dMZW4gPiBFUExfRExMS19CVUZMRU5fRU1QVFkpIHsJLy8gTk1UIHJlcXVlc3QgVHggYnVmZmVyIGNvbnRhaW5zIGEgZnJhbWUKKwkJCQkJCS8vIHVzZSBOTVQgcmVxdWVzdCBGSUZPLCBiZWNhdXNlIG9mIGhpZ2hlciBwcmlvcml0eQorCQkJCQkJdWlGcmFtZUNvdW50ID0gMTsKKwkJCQkJCUFzeW5jUmVxUHJpb3JpdHkgPQorCQkJCQkJICAgIGtFcGxEbGxBc3luY1JlcVByaW9ObXQ7CisJCQkJCX0gZWxzZSBpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9OT05FUExdLm1fdWlUeE1zZ0xlbiA+IEVQTF9ETExLX0JVRkxFTl9FTVBUWSkgewkvLyBub24tRVBMIFR4IGJ1ZmZlciBjb250YWlucyBhIGZyYW1lCisJCQkJCQkvLyB1c2UgTk1UIHJlcXVlc3QgRklGTywgYmVjYXVzZSBvZiBoaWdoZXIgcHJpb3JpdHkKKwkJCQkJCS8vIGFkZCBvbmUgbW9yZSBmcmFtZQorCQkJCQkJdWlGcmFtZUNvdW50Kys7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAodWlGcmFtZUNvdW50ID4gNykgewkvLyBsaW1pdCBmcmFtZSByZXF1ZXN0IHRvIHNlbmQgY291bnRlciB0byA3CisJCQkJCXVpRnJhbWVDb3VudCA9IDc7CisJCQkJfQorCQkJCWlmICh1aUZyYW1lQ291bnQgPiAwKSB7CisJCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fYkZsYWcyID0KKwkJCQkJICAgIChCWVRFKSAoKChBc3luY1JlcVByaW9yaXR5IDw8CisJCQkJCQkgICAgICBFUExfRlJBTUVfRkxBRzJfUFJfU0hJRlQpCisJCQkJCQkgICAgICYgRVBMX0ZSQU1FX0ZMQUcyX1BSKQorCQkJCQkJICAgIHwgKHVpRnJhbWVDb3VudCAmCisJCQkJCQkgICAgICAgRVBMX0ZSQU1FX0ZMQUcyX1JTKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9iRmxhZzIgPSAwOworCQkJCX0KKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwljYXNlIGtFcGxFdmVudFR5cGVEbGxrU3RhcnRSZWR1Y2VkQ3ljbGU6CisJCXsKKwkJCS8vIHN0YXJ0IHRoZSByZWR1Y2VkIGN5Y2xlIGJ5IHByb2dyYW1taW5nIHRoZSBjeWNsZSB0aW1lcgorCQkJLy8gaXQgaXMgaXNzdWVkIGJ5IE5NVCBNTiBtb2R1bGUsIHdoZW4gUHJlT3AxIGlzIGVudGVyZWQKKworCQkJLy8gY2xlYXIgdGhlIGFzeW5jaHJvbm91cyBxdWV1ZXMKKwkJCVJldCA9IEVwbERsbGtDYWxBc3luY0NsZWFyUXVldWVzKCk7CisKKwkJCS8vIHJlc2V0IGN5Y2xlIGNvdW50ZXIgKGV2ZXJ5dGltZSBhIFNvQSBpcyB0cmlnZ2VyZCBpbiBQcmVPcDEgdGhlIGNvdW50ZXIgaXMgaW5jcmVtZW50ZWQKKwkJCS8vIGFuZCB3aGVuIGl0IHJlYWNoZXMgRVBMX0NfRExMX1BSRU9QMV9TVEFSVF9DWUNMRVMgdGhlIFNvQSBtYXkgY29udGFpbiBpbnZpdGF0aW9ucykKKwkJCUVwbERsbGtJbnN0YW5jZV9nLm1fdWlDeWNsZUNvdW50ID0gMDsKKworCQkJLy8gcmVtb3ZlIGFueSBDTiBmcm9tIGlzb2Nocm9ub3VzIHBoYXNlCisJCQl3aGlsZSAoRXBsRGxsa0luc3RhbmNlX2cubV9wRmlyc3ROb2RlSW5mbyAhPSBOVUxMKSB7CisJCQkJRXBsRGxsa0RlbGV0ZU5vZGUoRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgIG1fcEZpcnN0Tm9kZUluZm8tPm1fdWlOb2RlSWQpOworCQkJfQorCisJCQkvLyBjaGFuZ2Ugc3RhdGUgdG8gTm9uQ3ljbGljLAorCQkJLy8gaGVuY2UgRXBsRGxsa0NoYW5nZVN0YXRlKCkgd2lsbCBub3QgaWdub3JlIHRoZSBuZXh0IGNhbGwKKwkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPSBrRXBsRGxsTXNOb25DeWNsaWM7CisKKyNpZiBFUExfVElNRVJfVVNFX0hJR0hSRVMgIT0gRkFMU0UKKwkJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbENvbmZpZ1BhcmFtLgorCQkJICAgIG1fZHdBc3luY1Nsb3RUaW1lb3V0ICE9IDApIHsKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxUaW1lckhpZ2hSZXNrTW9kaWZ5VGltZXJOcworCQkJCSAgICAoJkVwbERsbGtJbnN0YW5jZV9nLm1fVGltZXJIZGxDeWNsZSwKKwkJCQkgICAgIEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0uCisJCQkJICAgICBtX2R3QXN5bmNTbG90VGltZW91dCwKKwkJCQkgICAgIEVwbERsbGtDYk1uVGltZXJDeWNsZSwgMEwsIEZBTFNFKTsKKwkJCX0KKyNlbmRpZgorCisJCQlicmVhazsKKwkJfQorI2VuZGlmCisKKyNpZiBFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfU09BICE9IEZBTFNFCisJY2FzZSBrRXBsRXZlbnRUeXBlRGxsa1ByZXNSZWFkeToKKwkJeworCQkJLy8gcG9zdCBQUmVzIHRvIHRyYW5zbWl0IEZJRk8KKworCQkJTm10U3RhdGUgPSBFcGxObXRrR2V0Tm10U3RhdGUoKTsKKworCQkJaWYgKE5tdFN0YXRlICE9IGtFcGxObXRDc0Jhc2ljRXRoZXJuZXQpIHsKKwkJCQkvLyBEb2VzIFBSZXMgZXhpc3Q/CisJCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyW0VQTF9ETExLX1RYRlJBTUVfUFJFU10ubV9wYkJ1ZmZlciAhPSBOVUxMKSB7CS8vIFBSZXMgZG9lcyBleGlzdAorCQkJCQlwVHhGcmFtZSA9CisJCQkJCSAgICAodEVwbEZyYW1lICopIEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9QUkVTXS4KKwkJCQkJICAgIG1fcGJCdWZmZXI7CisJCQkJCS8vIHVwZGF0ZSBmcmFtZSAoTk1UIHN0YXRlLCBSRCwgUlMsIFBSLCBNUywgRU4gZmxhZ3MpCisJCQkJCWlmIChObXRTdGF0ZSA8IGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMikgewkvLyBOTVQgc3RhdGUgaXMgbm90IFByZU9wMiwgUmVhZHlUb09wIG9yIE9wCisJCQkJCQkvLyBmYWtlIE5NVCBzdGF0ZSBQcmVPcDIsIGJlY2F1c2UgUFJlcyB3aWxsIGJlIHNlbnQgb25seSBpbiBQcmVPcDIgb3IgZ3JlYXRlcgorCQkJCQkJTm10U3RhdGUgPQorCQkJCQkJICAgIGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMjsKKwkJCQkJfQorCQkJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1ByZXMuCisJCQkJCQkgICAgICAgbV9sZV9iTm10U3RhdHVzLAorCQkJCQkJICAgICAgIChCWVRFKSBObXRTdGF0ZSk7CisJCQkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fUHJlcy4KKwkJCQkJCSAgICAgICBtX2xlX2JGbGFnMiwKKwkJCQkJCSAgICAgICBFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgICBtX2JGbGFnMik7CisJCQkJCWlmIChObXRTdGF0ZSAhPSBrRXBsTm10Q3NPcGVyYXRpb25hbCkgewkvLyBtYXJrIFBETyBhcyBpbnZhbGlkIGluIE5NVCBzdGF0ZSBPcAorCQkJCQkJLy8gJCQkIHJlc2V0IG9ubHkgUkQgZmxhZzsgc2V0IG90aGVyIGZsYWdzIGFwcHJvcHJpYXRlbHkKKwkJCQkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+CisJCQkJCQkJICAgICAgIG1fRGF0YS5tX1ByZXMuCisJCQkJCQkJICAgICAgIG1fbGVfYkZsYWcxLCAwKTsKKwkJCQkJfQorCQkJCQkvLyAkJCQgbWFrZSBmdW5jdGlvbiB0aGF0IHVwZGF0ZXMgUHJlcywgU3RhdHVzUmVzCisJCQkJCS8vIG1hcmsgUFJlcyBmcmFtZSBhcyByZWFkeSBmb3IgdHJhbnNtaXNzaW9uCisJCQkJCVJldCA9CisJCQkJCSAgICBFZHJ2VHhNc2dSZWFkeSgmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkJICAgbV9wVHhCdWZmZXIKKwkJCQkJCQkgICBbRVBMX0RMTEtfVFhGUkFNRV9QUkVTXSk7CisJCQkJfQorCQkJfQorCisJCQlicmVhazsKKwkJfQorI2VuZGlmCisJZGVmYXVsdDoKKwkJeworCQkJQVNTRVJUTVNHKEZBTFNFLAorCQkJCSAgIkVwbERsbGtQcm9jZXNzKCk6IHVuaGFuZGxlZCBldmVudCB0eXBlIVxuIik7CisJCX0KKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0NvbmZpZworLy8KKy8vIERlc2NyaXB0aW9uOiBjb25maWd1cmUgcGFyYW1ldGVycyBvZiBETEwKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcERsbENvbmZpZ1BhcmFtX3AgICAgICAgPSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsa0NvbmZpZyh0RXBsRGxsQ29uZmlnUGFyYW0gKiBwRGxsQ29uZmlnUGFyYW1fcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisvLyBkLmsuIGNoZWNrIG9mIE5NVCBzdGF0ZSBkaXNhYmxlZCwgYmVjYXVzZSBDeWNsZUxlbiBpcyBwcm9ncmFtbWVkIGF0IHJ1biB0aW1lIGJ5IE1OIHdpdGhvdXQgcmVzZXQgb2YgQ04KKy8qdEVwbE5tdFN0YXRlICAgIE5tdFN0YXRlOworCisgICAgTm10U3RhdGUgPSBFcGxObXRrR2V0Tm10U3RhdGUoKTsKKworICAgIGlmIChObXRTdGF0ZSA+IGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbikKKyAgICB7ICAgLy8gb25seSBhbGxvd2VkIGluIHN0YXRlIERMTF9HU19JTklUCisgICAgICAgIFJldCA9IGtFcGxJbnZhbGlkT3BlcmF0aW9uOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorKi8KKwlFUExfTUVNQ1BZKCZFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbENvbmZpZ1BhcmFtLCBwRGxsQ29uZmlnUGFyYW1fcCwKKwkJICAgKHBEbGxDb25maWdQYXJhbV9wLT5tX3VpU2l6ZU9mU3RydWN0IDwKKwkJICAgIHNpemVvZih0RXBsRGxsQ29uZmlnUGFyYW0pID8gcERsbENvbmZpZ1BhcmFtX3AtPgorCQkgICAgbV91aVNpemVPZlN0cnVjdCA6IHNpemVvZih0RXBsRGxsQ29uZmlnUGFyYW0pKSk7CisKKwlpZiAoKEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0ubV9kd0N5Y2xlTGVuICE9IDApCisJICAgICYmIChFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbENvbmZpZ1BhcmFtLm1fZHdMb3NzT2ZGcmFtZVRvbGVyYW5jZSAhPSAwKSkgewkvLyBtb25pdG9yIEVQTCBjeWNsZSwgY2FsY3VsYXRlIGZyYW1lIHRpbWVvdXQKKwkJRXBsRGxsa0luc3RhbmNlX2cubV91bGxGcmFtZVRpbWVvdXQgPSAoMTAwMExMCisJCQkJCQkgICAgICAgKgorCQkJCQkJICAgICAgICgodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCQkJCUVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJCW1fRGxsQ29uZmlnUGFyYW0uCisJCQkJCQkJbV9kd0N5Y2xlTGVuKSkKKwkJICAgICsKKwkJICAgICgodW5zaWduZWQgbG9uZyBsb25nKUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0uCisJCSAgICAgbV9kd0xvc3NPZkZyYW1lVG9sZXJhbmNlKTsKKwl9IGVsc2UgeworCQlFcGxEbGxrSW5zdGFuY2VfZy5tX3VsbEZyYW1lVGltZW91dCA9IDBMTDsKKwl9CisKKwlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9EbGxDb25maWdQYXJhbS5tX2ZBc3luY09ubHkgIT0gRkFMU0UpIHsJLy8gaXQgaXMgY29uZmlndXJlZCBhcyBhc3luYy1vbmx5IENOCisJCS8vIGRpc2FibGUgbXVsdGlwbGV4ZWQgY3ljbGUsIHRoYXQgbV91aUN5Y2xlQ291bnQgd2lsbCBub3QgYmUgaW5jcmVtZW50ZWQgc3B1cmlvdXNseSBvbiBTb0MKKwkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxDb25maWdQYXJhbS5tX3VpTXVsdGlwbEN5Y2xlQ250ID0gMDsKKwl9CisvL0V4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa1NldElkZW50aXR5CisvLworLy8gRGVzY3JpcHRpb246IGNvbmZpZ3VyZSBpZGVudGl0eSBvZiBsb2NhbCBub2RlIGZvciBJZGVudFJlc3BvbnNlCisvLworLy8gUGFyYW1ldGVyczogIHBEbGxJZGVudFBhcmFtX3AgICAgICAgID0gaWRlbnRpdHkKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsa1NldElkZW50aXR5KHRFcGxEbGxJZGVudFBhcmFtICogcERsbElkZW50UGFyYW1fcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJRVBMX01FTUNQWSgmRXBsRGxsa0luc3RhbmNlX2cubV9EbGxJZGVudFBhcmFtLCBwRGxsSWRlbnRQYXJhbV9wLAorCQkgICAocERsbElkZW50UGFyYW1fcC0+bV91aVNpemVPZlN0cnVjdCA8CisJCSAgICBzaXplb2YodEVwbERsbElkZW50UGFyYW0pID8gcERsbElkZW50UGFyYW1fcC0+CisJCSAgICBtX3VpU2l6ZU9mU3RydWN0IDogc2l6ZW9mKHRFcGxEbGxJZGVudFBhcmFtKSkpOworCisJLy8gJCQkIGlmIElkZW50UmVzcG9uc2UgZnJhbWUgZXhpc3RzIHVwZGF0ZSBpdAorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa1JlZ0FzeW5jSGFuZGxlcgorLy8KKy8vIERlc2NyaXB0aW9uOiByZWdpc3RlcnMgaGFuZGxlciBmb3Igbm9uLUVQTCBmcmFtZXMKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcGZuRGxsa0NiQXN5bmNfcCAgICAgICAgPSBwb2ludGVyIHRvIGNhbGxiYWNrIGZ1bmN0aW9uCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtSZWdBc3luY0hhbmRsZXIodEVwbERsbGtDYkFzeW5jIHBmbkRsbGtDYkFzeW5jX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX3BmbkNiQXN5bmMgPT0gTlVMTCkgewkvLyBubyBoYW5kbGVyIHJlZ2lzdGVyZWQgeWV0CisJCUVwbERsbGtJbnN0YW5jZV9nLm1fcGZuQ2JBc3luYyA9IHBmbkRsbGtDYkFzeW5jX3A7CisJfSBlbHNlIHsJCS8vIGhhbmRsZXIgYWxyZWFkeSByZWdpc3RlcmVkCisJCVJldCA9IGtFcGxEbGxDYkFzeW5jUmVnaXN0ZXJlZDsKKwl9CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrRGVyZWdBc3luY0hhbmRsZXIKKy8vCisvLyBEZXNjcmlwdGlvbjogZGVyZWdpc3RlcnMgaGFuZGxlciBmb3Igbm9uLUVQTCBmcmFtZXMKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcGZuRGxsa0NiQXN5bmNfcCAgICAgICAgPSBwb2ludGVyIHRvIGNhbGxiYWNrIGZ1bmN0aW9uCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtEZXJlZ0FzeW5jSGFuZGxlcih0RXBsRGxsa0NiQXN5bmMgcGZuRGxsa0NiQXN5bmNfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fcGZuQ2JBc3luYyA9PSBwZm5EbGxrQ2JBc3luY19wKSB7CS8vIHNhbWUgaGFuZGxlciBpcyByZWdpc3RlcmVkCisJCS8vIGRlcmVnaXN0ZXIgaXQKKwkJRXBsRGxsa0luc3RhbmNlX2cubV9wZm5DYkFzeW5jID0gTlVMTDsKKwl9IGVsc2UgewkJLy8gd3JvbmcgaGFuZGxlciBvciBubyBoYW5kbGVyIHJlZ2lzdGVyZWQKKwkJUmV0ID0ga0VwbERsbENiQXN5bmNSZWdpc3RlcmVkOworCX0KKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtTZXRBc25kU2VydmljZUlkRmlsdGVyKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogc2V0cyB0aGUgc3BlY2lmaWVkIG5vZGUgSUQgZmlsdGVyIGZvciB0aGUgc3BlY2lmaWVkCisvLyAgICAgICAgICAgICAgQXNuZFNlcnZpY2VJZC4gSXQgcmVnaXN0ZXJzIENfRExMX01VTFRJQ0FTVF9BU05EIGluIGV0aGVybmV0CisvLyAgICAgICAgICAgICAgZHJpdmVyIGlmIGFueSBBc25kU2VydmljZUlkIGlzIG9wZW4uCisvLworLy8gUGFyYW1ldGVyczogIFNlcnZpY2VJZF9wICAgICAgICAgICAgID0gQVNuZCBTZXJ2aWNlIElECisvLyAgICAgICAgICAgICAgRmlsdGVyX3AgICAgICAgICAgICAgICAgPSBub2RlIElEIGZpbHRlcgorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGxrU2V0QXNuZFNlcnZpY2VJZEZpbHRlcih0RXBsRGxsQXNuZFNlcnZpY2VJZCBTZXJ2aWNlSWRfcCwKKwkJCQkJIHRFcGxEbGxBc25kRmlsdGVyIEZpbHRlcl9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlpZiAoU2VydmljZUlkX3AgPCB0YWJlbnRyaWVzKEVwbERsbGtJbnN0YW5jZV9nLm1fYUFzbmRGaWx0ZXIpKSB7CisJCUVwbERsbGtJbnN0YW5jZV9nLm1fYUFzbmRGaWx0ZXJbU2VydmljZUlkX3BdID0gRmlsdGVyX3A7CisJfQorCisJcmV0dXJuIFJldDsKK30KKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa1NldEZsYWcxT2ZOb2RlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogc2V0cyBGbGFnMSAoZm9yIFBSZXEgYW5kIFNvQSkgb2YgdGhlIHNwZWNpZmllZCBub2RlIElELgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICAgICAgICAgICAgICA9IG5vZGUgSUQKKy8vICAgICAgICAgICAgICBiU29hRmxhZzFfcCAgICAgICAgICAgICA9IGZsYWcxCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtTZXRGbGFnMU9mTm9kZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwgQllURSBiU29hRmxhZzFfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxEbGxrTm9kZUluZm8gKnBOb2RlSW5mbzsKKworCXBOb2RlSW5mbyA9IEVwbERsbGtHZXROb2RlSW5mbyh1aU5vZGVJZF9wKTsKKwlpZiAocE5vZGVJbmZvID09IE5VTEwpIHsJLy8gbm8gbm9kZSBpbmZvIHN0cnVjdHVyZSBhdmFpbGFibGUKKwkJUmV0ID0ga0VwbERsbE5vTm9kZUluZm87CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gc3RvcmUgZmxhZzEgaW4gaW50ZXJuYWwgbm9kZSBpbmZvIHN0cnVjdHVyZQorCXBOb2RlSW5mby0+bV9iU29hRmxhZzEgPSBiU29hRmxhZzFfcDsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrR2V0Rmlyc3ROb2RlSW5mbygpCisvLworLy8gRGVzY3JpcHRpb246IHJldHVybnMgZmlyc3QgaW5mbyBzdHJ1Y3R1cmUgb2YgZmlyc3Qgbm9kZSBpbiBpc29jaHJvbm91cyBwaGFzZS4KKy8vICAgICAgICAgICAgICBJdCBpcyBvbmx5IHVzZWZ1bCBmb3IgRXJyb3JIYW5kbGVyayBtb2R1bGUuCisvLworLy8gUGFyYW1ldGVyczogIHBwTm9kZUluZm9fcCAgICAgICAgICAgID0gcG9pbnRlciB0byBwb2ludGVyIG9mIGludGVybmFsIG5vZGUgaW5mbyBzdHJ1Y3R1cmUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsa0dldEZpcnN0Tm9kZUluZm8odEVwbERsbGtOb2RlSW5mbyAqKiBwcE5vZGVJbmZvX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCSpwcE5vZGVJbmZvX3AgPSBFcGxEbGxrSW5zdGFuY2VfZy5tX3BGaXJzdE5vZGVJbmZvOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0FkZE5vZGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBhZGRzIHRoZSBzcGVjaWZpZWQgbm9kZSB0byB0aGUgaXNvY2hyb25vdXMgcGhhc2UuCisvLworLy8gUGFyYW1ldGVyczogIHBOb2RlSW5mb19wICAgICAgICAgICAgID0gcG9pbnRlciBvZiBub2RlIGluZm8gc3RydWN0dXJlCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtBZGROb2RlKHRFcGxEbGxOb2RlSW5mbyAqIHBOb2RlSW5mb19wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbERsbGtOb2RlSW5mbyAqcEludE5vZGVJbmZvOworCXRFcGxEbGxrTm9kZUluZm8gKipwcEludE5vZGVJbmZvOworCXVuc2lnbmVkIGludCB1aUhhbmRsZTsKKwl0RXBsRnJhbWUgKnBGcmFtZTsKKwl1bnNpZ25lZCBpbnQgdWlGcmFtZVNpemU7CisKKwlwSW50Tm9kZUluZm8gPSBFcGxEbGxrR2V0Tm9kZUluZm8ocE5vZGVJbmZvX3AtPm1fdWlOb2RlSWQpOworCWlmIChwSW50Tm9kZUluZm8gPT0gTlVMTCkgewkvLyBubyBub2RlIGluZm8gc3RydWN0dXJlIGF2YWlsYWJsZQorCQlSZXQgPSBrRXBsRGxsTm9Ob2RlSW5mbzsKKwkJZ290byBFeGl0OworCX0KKworCUVQTF9ETExLX0RCR19QT1NUX1RSQUNFX1ZBTFVFKGtFcGxFdmVudFR5cGVEbGxrQWRkTm9kZSwKKwkJCQkgICAgICBwTm9kZUluZm9fcC0+bV91aU5vZGVJZCwgMCk7CisKKwkvLyBjb3B5IG5vZGUgY29uZmlndXJhdGlvbgorCXBJbnROb2RlSW5mby0+bV9kd1ByZXNUaW1lb3V0ID0gcE5vZGVJbmZvX3AtPm1fZHdQcmVzVGltZW91dDsKKwlwSW50Tm9kZUluZm8tPm1fd1ByZXNQYXlsb2FkTGltaXQgPSBwTm9kZUluZm9fcC0+bV93UHJlc1BheWxvYWRMaW1pdDsKKworCS8vICQkJCBkLmsuOiBhY3R1YWxseSBhZGQgbm9kZSBvbmx5IGlmIE1OLiBPbiBDTiBpdCBpcyBzdWZmaWNpZW50IHRvIHVwZGF0ZSB0aGUgbm9kZSBjb25maWd1cmF0aW9uCisJaWYgKHBOb2RlSW5mb19wLT5tX3VpTm9kZUlkID09IEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0ubV91aU5vZGVJZCkgewkvLyB3ZSBzaGFsbCBzZW5kIFBSZXMgb3Vyc2VsZgorCQkvLyBpbnNlcnQgb3VyIG5vZGUgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdAorCQlwcEludE5vZGVJbmZvID0gJkVwbERsbGtJbnN0YW5jZV9nLm1fcEZpcnN0Tm9kZUluZm87CisJCXdoaWxlICgoKnBwSW50Tm9kZUluZm8gIT0gTlVMTCkKKwkJICAgICAgICYmICgoKnBwSW50Tm9kZUluZm8pLT5tX3BOZXh0Tm9kZUluZm8gIT0gTlVMTCkpIHsKKwkJCXBwSW50Tm9kZUluZm8gPSAmKCpwcEludE5vZGVJbmZvKS0+bV9wTmV4dE5vZGVJbmZvOworCQl9CisJCWlmICgqcHBJbnROb2RlSW5mbyAhPSBOVUxMKSB7CisJCQlpZiAoKCpwcEludE5vZGVJbmZvKS0+bV91aU5vZGVJZCA9PSBwTm9kZUluZm9fcC0+bV91aU5vZGVJZCkgewkvLyBub2RlIHdhcyBhbHJlYWR5IGFkZGVkIHRvIGxpc3QKKwkJCQkvLyAkJCQgZC5rLiBtYXliZSB0aGlzIHNob3VsZCBiZSBhbiBlcnJvcgorCQkJCWdvdG8gRXhpdDsKKwkJCX0gZWxzZSB7CS8vIGFkZCBvdXIgbm9kZSBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0CisJCQkJcHBJbnROb2RlSW5mbyA9CisJCQkJICAgICYoKnBwSW50Tm9kZUluZm8pLT5tX3BOZXh0Tm9kZUluZm87CisJCQl9CisJCX0KKwkJLy8gc2V0ICJQUmVxIi1UeEJ1ZmZlciB0byBQUmVzLVR4QnVmZmVyCisJCXBJbnROb2RlSW5mby0+bV9wUHJlcVR4QnVmZmVyID0KKwkJICAgICZFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX1BSRVNdOworCX0gZWxzZSB7CQkvLyBub3JtYWwgQ04gc2hhbGwgYmUgYWRkZWQgdG8gaXNvY2hyb25vdXMgcGhhc2UKKwkJLy8gaW5zZXJ0IG5vZGUgaW50byBsaXN0IGluIGFzY2VuZGluZyBvcmRlcgorCQlwcEludE5vZGVJbmZvID0gJkVwbERsbGtJbnN0YW5jZV9nLm1fcEZpcnN0Tm9kZUluZm87CisJCXdoaWxlICgoKnBwSW50Tm9kZUluZm8gIT0gTlVMTCkKKwkJICAgICAgICYmICgoKnBwSW50Tm9kZUluZm8pLT5tX3VpTm9kZUlkIDwKKwkJCSAgIHBOb2RlSW5mb19wLT5tX3VpTm9kZUlkKQorCQkgICAgICAgJiYgKCgqcHBJbnROb2RlSW5mbyktPm1fdWlOb2RlSWQgIT0KKwkJCSAgIEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0ubV91aU5vZGVJZCkpIHsKKwkJCXBwSW50Tm9kZUluZm8gPSAmKCpwcEludE5vZGVJbmZvKS0+bV9wTmV4dE5vZGVJbmZvOworCQl9CisJCWlmICgoKnBwSW50Tm9kZUluZm8gIT0gTlVMTCkgJiYgKCgqcHBJbnROb2RlSW5mbyktPm1fdWlOb2RlSWQgPT0gcE5vZGVJbmZvX3AtPm1fdWlOb2RlSWQpKSB7CS8vIG5vZGUgd2FzIGFscmVhZHkgYWRkZWQgdG8gbGlzdAorCQkJLy8gJCQkIGQuay4gbWF5YmUgdGhpcyBzaG91bGQgYmUgYW4gZXJyb3IKKwkJCWdvdG8gRXhpdDsKKwkJfQorCX0KKworCS8vIGluaXRpYWxpemUgZWxlbWVudHMgb2YgaW50ZXJuYWwgbm9kZSBpbmZvIHN0cnVjdHVyZQorCXBJbnROb2RlSW5mby0+bV9iU29hRmxhZzEgPSAwOworCXBJbnROb2RlSW5mby0+bV9mU29mdERlbGV0ZSA9IEZBTFNFOworCXBJbnROb2RlSW5mby0+bV9ObXRTdGF0ZSA9IGtFcGxObXRDc05vdEFjdGl2ZTsKKwlpZiAocEludE5vZGVJbmZvLT5tX3BQcmVxVHhCdWZmZXIgPT0gTlVMTCkgewkvLyBjcmVhdGUgVHhCdWZmZXIgZW50cnkKKwkJdWlGcmFtZVNpemUgPSBwTm9kZUluZm9fcC0+bV93UHJlcVBheWxvYWRMaW1pdCArIDI0OworCQlSZXQgPQorCQkgICAgRXBsRGxsa0NyZWF0ZVR4RnJhbWUoJnVpSGFuZGxlLCAmcEZyYW1lLCAmdWlGcmFtZVNpemUsCisJCQkJCSBrRXBsTXNnVHlwZVByZXEsCisJCQkJCSBrRXBsRGxsQXNuZE5vdERlZmluZWQpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJcEludE5vZGVJbmZvLT5tX3BQcmVxVHhCdWZmZXIgPQorCQkgICAgJkVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyW3VpSGFuZGxlXTsKKwkJQW1pU2V0Qnl0ZVRvTGUoJnBGcmFtZS0+bV9sZV9iRHN0Tm9kZUlkLAorCQkJICAgICAgIChCWVRFKSBwTm9kZUluZm9fcC0+bV91aU5vZGVJZCk7CisKKwkJLy8gc2V0IHVwIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzCisJCUVQTF9NRU1DUFkocEZyYW1lLT5tX2JlX2FiRHN0TWFjLCBwSW50Tm9kZUluZm8tPm1fYmVfYWJNYWNBZGRyLAorCQkJICAgNik7CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1BET0spKSAhPSAwKQorCQl7CisJCQl0RXBsRnJhbWVJbmZvIEZyYW1lSW5mbzsKKworCQkJLy8gaW5pdGlhbGx5IGVuY29kZSBUUERPIC0+IGluZm9ybSBQRE8gbW9kdWxlCisJCQlGcmFtZUluZm8ubV9wRnJhbWUgPSBwRnJhbWU7CisJCQlGcmFtZUluZm8ubV91aUZyYW1lU2l6ZSA9IHVpRnJhbWVTaXplOworCQkJUmV0ID0gRXBsUGRva0NiUGRvVHJhbnNtaXR0ZWQoJkZyYW1lSW5mbyk7CisJCX0KKyNlbmRpZgorCX0KKwlwSW50Tm9kZUluZm8tPm1fdWxEbGxFcnJvckV2ZW50cyA9IDBMOworCS8vIGFkZCBub2RlIHRvIGxpc3QKKwlwSW50Tm9kZUluZm8tPm1fcE5leHROb2RlSW5mbyA9ICpwcEludE5vZGVJbmZvOworCSpwcEludE5vZGVJbmZvID0gcEludE5vZGVJbmZvOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtEZWxldGVOb2RlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVtb3ZlcyB0aGUgc3BlY2lmaWVkIG5vZGUgZnJvbSB0aGUgaXNvY2hyb25vdXMgcGhhc2UuCisvLworLy8gUGFyYW1ldGVyczogIHVpTm9kZUlkX3AgICAgICAgICAgICAgID0gbm9kZSBJRAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGxrRGVsZXRlTm9kZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxEbGxrTm9kZUluZm8gKnBJbnROb2RlSW5mbzsKKwl0RXBsRGxsa05vZGVJbmZvICoqcHBJbnROb2RlSW5mbzsKKwl1bnNpZ25lZCBpbnQgdWlIYW5kbGU7CisKKwlwSW50Tm9kZUluZm8gPSBFcGxEbGxrR2V0Tm9kZUluZm8odWlOb2RlSWRfcCk7CisJaWYgKHBJbnROb2RlSW5mbyA9PSBOVUxMKSB7CS8vIG5vIG5vZGUgaW5mbyBzdHJ1Y3R1cmUgYXZhaWxhYmxlCisJCVJldCA9IGtFcGxEbGxOb05vZGVJbmZvOworCQlnb3RvIEV4aXQ7CisJfQorCisJRVBMX0RMTEtfREJHX1BPU1RfVFJBQ0VfVkFMVUUoa0VwbEV2ZW50VHlwZURsbGtEZWxOb2RlLCB1aU5vZGVJZF9wLCAwKTsKKworCS8vIHNlYXJjaCBub2RlIGluIHdob2xlIGxpc3QKKwlwcEludE5vZGVJbmZvID0gJkVwbERsbGtJbnN0YW5jZV9nLm1fcEZpcnN0Tm9kZUluZm87CisJd2hpbGUgKCgqcHBJbnROb2RlSW5mbyAhPSBOVUxMKQorCSAgICAgICAmJiAoKCpwcEludE5vZGVJbmZvKS0+bV91aU5vZGVJZCAhPSB1aU5vZGVJZF9wKSkgeworCQlwcEludE5vZGVJbmZvID0gJigqcHBJbnROb2RlSW5mbyktPm1fcE5leHROb2RlSW5mbzsKKwl9CisJaWYgKCgqcHBJbnROb2RlSW5mbyA9PSBOVUxMKSB8fCAoKCpwcEludE5vZGVJbmZvKS0+bV91aU5vZGVJZCAhPSB1aU5vZGVJZF9wKSkgewkvLyBub2RlIHdhcyBub3QgZm91bmQgaW4gbGlzdAorCQkvLyAkJCQgZC5rLiBtYXliZSB0aGlzIHNob3VsZCBiZSBhbiBlcnJvcgorCQlnb3RvIEV4aXQ7CisJfQorCS8vIHJlbW92ZSBub2RlIGZyb20gbGlzdAorCSpwcEludE5vZGVJbmZvID0gcEludE5vZGVJbmZvLT5tX3BOZXh0Tm9kZUluZm87CisKKwlpZiAoKHBJbnROb2RlSW5mby0+bV9wUHJlcVR4QnVmZmVyICE9IE5VTEwpCisJICAgICYmIChwSW50Tm9kZUluZm8tPm1fcFByZXFUeEJ1ZmZlciAhPSAmRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9QUkVTXSkpIHsJLy8gZGVsZXRlIFR4QnVmZmVyIGVudHJ5CisJCXVpSGFuZGxlID0KKwkJICAgIHBJbnROb2RlSW5mby0+bV9wUHJlcVR4QnVmZmVyIC0KKwkJICAgIEVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyOworCQlwSW50Tm9kZUluZm8tPm1fcFByZXFUeEJ1ZmZlciA9IE5VTEw7CisJCVJldCA9IEVwbERsbGtEZWxldGVUeEZyYW1lKHVpSGFuZGxlKTsKKy8qICAgICAgICBpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0qLworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrU29mdERlbGV0ZU5vZGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZW1vdmVzIHRoZSBzcGVjaWZpZWQgbm9kZSBub3QgaW1tZWRpYXRlbHkgZnJvbSB0aGUgaXNvY2hyb25vdXMgcGhhc2UuCisvLyAgICAgICAgICAgICAgSW5zdGVhZCB0aGUgd2lsbCBiZSByZW1vdmVkIGFmdGVyIGVycm9yIChsYXRlL2xvc3MgUFJlcykgd2l0aG91dAorLy8gICAgICAgICAgICAgIGNoYXJnaW5nIHRoZSBlcnJvci4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBub2RlIElECisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtTb2Z0RGVsZXRlTm9kZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxEbGxrTm9kZUluZm8gKnBJbnROb2RlSW5mbzsKKworCXBJbnROb2RlSW5mbyA9IEVwbERsbGtHZXROb2RlSW5mbyh1aU5vZGVJZF9wKTsKKwlpZiAocEludE5vZGVJbmZvID09IE5VTEwpIHsJLy8gbm8gbm9kZSBpbmZvIHN0cnVjdHVyZSBhdmFpbGFibGUKKwkJUmV0ID0ga0VwbERsbE5vTm9kZUluZm87CisJCWdvdG8gRXhpdDsKKwl9CisKKwlFUExfRExMS19EQkdfUE9TVF9UUkFDRV9WQUxVRShrRXBsRXZlbnRUeXBlRGxsa1NvZnREZWxOb2RlLAorCQkJCSAgICAgIHVpTm9kZUlkX3AsIDApOworCisJcEludE5vZGVJbmZvLT5tX2ZTb2Z0RGVsZXRlID0gVFJVRTsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisjZW5kaWYgLy8oKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrQ2hhbmdlU3RhdGUKKy8vCisvLyBEZXNjcmlwdGlvbjogY2hhbmdlIERMTCBzdGF0ZSBvbiBldmVudCBhbmQgZGlhZ25vc2Ugc29tZSBjb21tdW5pY2F0aW9uIGVycm9ycworLy8KKy8vIFBhcmFtZXRlcnM6ICBObXRFdmVudF9wICAgICAgICAgICAgICA9IERMTCBldmVudCAod3JhcHBlZCBpbiBOTVQgZXZlbnQpCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxEbGxrQ2hhbmdlU3RhdGUodEVwbE5tdEV2ZW50IE5tdEV2ZW50X3AsCisJCQkJICAgICB0RXBsTm10U3RhdGUgTm10U3RhdGVfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxFdmVudCBFdmVudDsKKwl0RXBsRXJyb3JIYW5kbGVya0V2ZW50IERsbEV2ZW50OworCisJRGxsRXZlbnQubV91bERsbEVycm9yRXZlbnRzID0gMDsKKwlEbGxFdmVudC5tX3VpTm9kZUlkID0gMDsKKwlEbGxFdmVudC5tX05tdFN0YXRlID0gTm10U3RhdGVfcDsKKworCXN3aXRjaCAoTm10U3RhdGVfcCkgeworCWNhc2Uga0VwbE5tdEdzT2ZmOgorCWNhc2Uga0VwbE5tdEdzSW5pdGlhbGlzaW5nOgorCWNhc2Uga0VwbE5tdEdzUmVzZXRBcHBsaWNhdGlvbjoKKwljYXNlIGtFcGxObXRHc1Jlc2V0Q29tbXVuaWNhdGlvbjoKKwljYXNlIGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbjoKKwljYXNlIGtFcGxObXRDc0Jhc2ljRXRoZXJuZXQ6CisJCS8vIGVudGVyIERMTF9HU19JTklUCisJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPSBrRXBsRGxsR3NJbml0OworCQlicmVhazsKKworCWNhc2Uga0VwbE5tdENzTm90QWN0aXZlOgorCWNhc2Uga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwxOgorCQkvLyByZWR1Y2VkIEVQTCBjeWNsZSBpcyBhY3RpdmUKKwkJaWYgKE5tdEV2ZW50X3AgPT0ga0VwbE5tdEV2ZW50RGxsQ2VTb2MpIHsJLy8gU29DIHJlY2VpdmVkCisJCQkvLyBlbnRlciBETExfQ1NfV0FJVF9QUkVRCisJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbFN0YXRlID0ga0VwbERsbENzV2FpdFByZXE7CisJCX0gZWxzZSB7CisJCQkvLyBlbnRlciBETExfR1NfSU5JVAorCQkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSA9IGtFcGxEbGxHc0luaXQ7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMjoKKwljYXNlIGtFcGxObXRDc1JlYWR5VG9PcGVyYXRlOgorCWNhc2Uga0VwbE5tdENzT3BlcmF0aW9uYWw6CisJCS8vIGZ1bGwgRVBMIGN5Y2xlIGlzIGFjdGl2ZQorCisJCXN3aXRjaCAoRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSkgeworCQljYXNlIGtFcGxEbGxDc1dhaXRQcmVxOgorCQkJc3dpdGNoIChObXRFdmVudF9wKSB7CisJCQkJLy8gRExMX0NUMgorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVByZXE6CisJCQkJLy8gZW50ZXIgRExMX0NTX1dBSVRfU09BCisJCQkJRGxsRXZlbnQubV91bERsbEVycm9yRXZlbnRzIHw9CisJCQkJICAgIEVQTF9ETExfRVJSX0NOX1JFQ1ZEX1BSRVE7CisJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSA9IGtFcGxEbGxDc1dhaXRTb2E7CisJCQkJYnJlYWs7CisKKwkJCQkvLyBETExfQ1Q4CisJCQljYXNlIGtFcGxObXRFdmVudERsbENlRnJhbWVUaW1lb3V0OgorCQkJCWlmIChObXRTdGF0ZV9wID09IGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMikgewkvLyBpZ25vcmUgZnJhbWUgdGltZW91dCBpbiBQcmVPcDIsCisJCQkJCS8vIGJlY2F1c2UgdGhlIHByZXZpb3VzbHkgY29uZmlndXJlZCBjeWNsZSBsZW4KKwkJCQkJLy8gbWF5IGJlIHdyb25nLgorCQkJCQkvLyAyMDA4LzEwLzE1IGQuay4gSWYgaXQgd291bGQgbm90IGJlIGlnbm9yZWQsCisJCQkJCS8vIHdlIHdvdWxkIGdvIGN5Y2xpY2FsbHkgdG8gUHJlT3AxIGFuZCBvbiBuZXh0CisJCQkJCS8vIFNvQyBiYWNrIHRvIFByZU9wMi4KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8vIHJlcG9ydCBETExfQ0VWX0xPU1NfU09DIGFuZCBETExfQ0VWX0xPU1NfU09BCisJCQkJRGxsRXZlbnQubV91bERsbEVycm9yRXZlbnRzIHw9CisJCQkJICAgIEVQTF9ETExfRVJSX0NOX0xPU1NfU09BIHwKKwkJCQkgICAgRVBMX0RMTF9FUlJfQ05fTE9TU19TT0M7CisKKwkJCQkvLyBlbnRlciBETExfQ1NfV0FJVF9TT0MKKwkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbFN0YXRlID0ga0VwbERsbENzV2FpdFNvYzsKKwkJCQlicmVhazsKKworCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVNvYToKKwkJCQkvLyBjaGVjayBpZiBtdWx0aXBsZXhlZCBhbmQgUFJlcSBzaG91bGQgaGF2ZSBiZWVuIHJlY2VpdmVkIGluIHRoaXMgY3ljbGUKKwkJCQkvLyBhbmQgaWYgPj0gTk1UX0NTX1JFQURZX1RPX09QRVJBVEUKKwkJCQlpZiAoKEVwbERsbGtJbnN0YW5jZV9nLm1fdWlDeWNsZUNvdW50ID09IDApCisJCQkJICAgICYmIChObXRTdGF0ZV9wID49IGtFcGxObXRDc1JlYWR5VG9PcGVyYXRlKSkgewkvLyByZXBvcnQgRExMX0NFVl9MT1NTX09GX1BSRVEKKwkJCQkJRGxsRXZlbnQubV91bERsbEVycm9yRXZlbnRzIHw9CisJCQkJCSAgICBFUExfRExMX0VSUl9DTl9MT1NTX1BSRVE7CisJCQkJfQorCQkJCS8vIGVudGVyIERMTF9DU19XQUlUX1NPQworCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPSBrRXBsRGxsQ3NXYWl0U29jOworCQkJCWJyZWFrOworCisJCQkJLy8gRExMX0NUNworCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVNvYzoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VBc25kOgorCQkJCS8vIHJlcG9ydCBETExfQ0VWX0xPU1NfU09BCisJCQkJRGxsRXZlbnQubV91bERsbEVycm9yRXZlbnRzIHw9CisJCQkJICAgIEVQTF9ETExfRVJSX0NOX0xPU1NfU09BOworCisJCQljYXNlIGtFcGxObXRFdmVudERsbENlUHJlczoKKwkJCWRlZmF1bHQ6CisJCQkJLy8gcmVtYWluIGluIHRoaXMgc3RhdGUKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2Uga0VwbERsbENzV2FpdFNvYzoKKwkJCXN3aXRjaCAoTm10RXZlbnRfcCkgeworCQkJCS8vIERMTF9DVDEKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2M6CisJCQkJLy8gc3RhcnQgb2YgY3ljbGUgYW5kIGlzb2Nocm9ub3VzIHBoYXNlCisJCQkJLy8gZW50ZXIgRExMX0NTX1dBSVRfUFJFUQorCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPQorCQkJCSAgICBrRXBsRGxsQ3NXYWl0UHJlcTsKKwkJCQlicmVhazsKKworCQkJCS8vIERMTF9DVDQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBrRXBsTm10RXZlbnREbGxDZVByZXM6CisJCQljYXNlIGtFcGxObXRFdmVudERsbENlRnJhbWVUaW1lb3V0OgorCQkJCWlmIChObXRTdGF0ZV9wID09IGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMikgewkvLyBpZ25vcmUgZnJhbWUgdGltZW91dCBpbiBQcmVPcDIsCisJCQkJCS8vIGJlY2F1c2UgdGhlIHByZXZpb3VzbHkgY29uZmlndXJlZCBjeWNsZSBsZW4KKwkJCQkJLy8gbWF5IGJlIHdyb25nLgorCQkJCQkvLyAyMDA4LzEwLzE1IGQuay4gSWYgaXQgd291bGQgbm90IGJlIGlnbm9yZWQsCisJCQkJCS8vIHdlIHdvdWxkIGdvIGN5Y2xpY2FsbHkgdG8gUHJlT3AxIGFuZCBvbiBuZXh0CisJCQkJCS8vIFNvQyBiYWNrIHRvIFByZU9wMi4KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8vIGZhbGwgdGhyb3VnaAorCisJCQljYXNlIGtFcGxObXRFdmVudERsbENlUHJlcToKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2E6CisJCQkJLy8gcmVwb3J0IERMTF9DRVZfTE9TU19TT0MKKwkJCQlEbGxFdmVudC5tX3VsRGxsRXJyb3JFdmVudHMgfD0KKwkJCQkgICAgRVBMX0RMTF9FUlJfQ05fTE9TU19TT0M7CisKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VBc25kOgorCQkJZGVmYXVsdDoKKwkJCQkvLyByZW1haW4gaW4gdGhpcyBzdGF0ZQorCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBrRXBsRGxsQ3NXYWl0U29hOgorCQkJc3dpdGNoIChObXRFdmVudF9wKSB7CisJCQljYXNlIGtFcGxObXRFdmVudERsbENlRnJhbWVUaW1lb3V0OgorCQkJCS8vIERMTF9DVDMKKwkJCQlpZiAoTm10U3RhdGVfcCA9PSBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDIpIHsJLy8gaWdub3JlIGZyYW1lIHRpbWVvdXQgaW4gUHJlT3AyLAorCQkJCQkvLyBiZWNhdXNlIHRoZSBwcmV2aW91c2x5IGNvbmZpZ3VyZWQgY3ljbGUgbGVuCisJCQkJCS8vIG1heSBiZSB3cm9uZy4KKwkJCQkJLy8gMjAwOC8xMC8xNSBkLmsuIElmIGl0IHdvdWxkIG5vdCBiZSBpZ25vcmVkLAorCQkJCQkvLyB3ZSB3b3VsZCBnbyBjeWNsaWNhbGx5IHRvIFByZU9wMSBhbmQgb24gbmV4dAorCQkJCQkvLyBTb0MgYmFjayB0byBQcmVPcDIuCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvLyBmYWxsIHRocm91Z2gKKworCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVByZXE6CisJCQkJLy8gcmVwb3J0IERMTF9DRVZfTE9TU19TT0MgYW5kIERMTF9DRVZfTE9TU19TT0EKKwkJCQlEbGxFdmVudC5tX3VsRGxsRXJyb3JFdmVudHMgfD0KKwkJCQkgICAgRVBMX0RMTF9FUlJfQ05fTE9TU19TT0EgfAorCQkJCSAgICBFUExfRExMX0VSUl9DTl9MT1NTX1NPQzsKKworCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVNvYToKKwkJCQkvLyBlbnRlciBETExfQ1NfV0FJVF9TT0MKKwkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbFN0YXRlID0ga0VwbERsbENzV2FpdFNvYzsKKwkJCQlicmVhazsKKworCQkJCS8vIERMTF9DVDkKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2M6CisJCQkJLy8gcmVwb3J0IERMTF9DRVZfTE9TU19TT0EKKwkJCQlEbGxFdmVudC5tX3VsRGxsRXJyb3JFdmVudHMgfD0KKwkJCQkgICAgRVBMX0RMTF9FUlJfQ05fTE9TU19TT0E7CisKKwkJCQkvLyBlbnRlciBETExfQ1NfV0FJVF9QUkVRCisJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSA9CisJCQkJICAgIGtFcGxEbGxDc1dhaXRQcmVxOworCQkJCWJyZWFrOworCisJCQkJLy8gRExMX0NUMTAKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VBc25kOgorCQkJCS8vIHJlcG9ydCBETExfQ0VWX0xPU1NfU09BCisJCQkJRGxsRXZlbnQubV91bERsbEVycm9yRXZlbnRzIHw9CisJCQkJICAgIEVQTF9ETExfRVJSX0NOX0xPU1NfU09BOworCisJCQljYXNlIGtFcGxObXRFdmVudERsbENlUHJlczoKKwkJCWRlZmF1bHQ6CisJCQkJLy8gcmVtYWluIGluIHRoaXMgc3RhdGUKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2Uga0VwbERsbEdzSW5pdDoKKwkJCS8vIGVudGVyIERMTF9DU19XQUlUX1BSRVEKKwkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPSBrRXBsRGxsQ3NXYWl0UHJlcTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2Uga0VwbE5tdENzU3RvcHBlZDoKKwkJLy8gZnVsbCBFUEwgY3ljbGUgaXMgYWN0aXZlLCBidXQgd2l0aG91dCBQUmVxL1BSZXMKKworCQlzd2l0Y2ggKEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUpIHsKKwkJY2FzZSBrRXBsRGxsQ3NXYWl0UHJlcToKKwkJCXN3aXRjaCAoTm10RXZlbnRfcCkgeworCQkJCS8vIERMTF9DVDIKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VQcmVxOgorCQkJCS8vIGVudGVyIERMTF9DU19XQUlUX1NPQQorCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPSBrRXBsRGxsQ3NXYWl0U29hOworCQkJCWJyZWFrOworCisJCQkJLy8gRExMX0NUOAorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZUZyYW1lVGltZW91dDoKKwkJCQkvLyByZXBvcnQgRExMX0NFVl9MT1NTX1NPQyBhbmQgRExMX0NFVl9MT1NTX1NPQQorCQkJCURsbEV2ZW50Lm1fdWxEbGxFcnJvckV2ZW50cyB8PQorCQkJCSAgICBFUExfRExMX0VSUl9DTl9MT1NTX1NPQSB8CisJCQkJICAgIEVQTF9ETExfRVJSX0NOX0xPU1NfU09DOworCisJCQljYXNlIGtFcGxObXRFdmVudERsbENlU29hOgorCQkJCS8vIE5NVF9DU19TVE9QUEVEIGFjdGl2ZQorCQkJCS8vIGl0IGlzIE9rIGlmIG5vIFBSZXEgd2FzIHJlY2VpdmVkCisKKwkJCQkvLyBlbnRlciBETExfQ1NfV0FJVF9TT0MKKwkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbFN0YXRlID0ga0VwbERsbENzV2FpdFNvYzsKKwkJCQlicmVhazsKKworCQkJCS8vIERMTF9DVDcKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2M6CisJCQljYXNlIGtFcGxObXRFdmVudERsbENlQXNuZDoKKwkJCQkvLyByZXBvcnQgRExMX0NFVl9MT1NTX1NPQQorCQkJCURsbEV2ZW50Lm1fdWxEbGxFcnJvckV2ZW50cyB8PQorCQkJCSAgICBFUExfRExMX0VSUl9DTl9MT1NTX1NPQTsKKworCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVByZXM6CisJCQlkZWZhdWx0OgorCQkJCS8vIHJlbWFpbiBpbiB0aGlzIHN0YXRlCisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIGtFcGxEbGxDc1dhaXRTb2M6CisJCQlzd2l0Y2ggKE5tdEV2ZW50X3ApIHsKKwkJCQkvLyBETExfQ1QxCisJCQljYXNlIGtFcGxObXRFdmVudERsbENlU29jOgorCQkJCS8vIHN0YXJ0IG9mIGN5Y2xlIGFuZCBpc29jaHJvbm91cyBwaGFzZQorCQkJCS8vIGVudGVyIERMTF9DU19XQUlUX1NPQQorCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPSBrRXBsRGxsQ3NXYWl0U29hOworCQkJCWJyZWFrOworCisJCQkJLy8gRExMX0NUNAorLy8gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGtFcGxObXRFdmVudERsbENlUHJlczoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VQcmVxOgorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVNvYToKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VGcmFtZVRpbWVvdXQ6CisJCQkJLy8gcmVwb3J0IERMTF9DRVZfTE9TU19TT0MKKwkJCQlEbGxFdmVudC5tX3VsRGxsRXJyb3JFdmVudHMgfD0KKwkJCQkgICAgRVBMX0RMTF9FUlJfQ05fTE9TU19TT0M7CisKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VBc25kOgorCQkJZGVmYXVsdDoKKwkJCQkvLyByZW1haW4gaW4gdGhpcyBzdGF0ZQorCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBrRXBsRGxsQ3NXYWl0U29hOgorCQkJc3dpdGNoIChObXRFdmVudF9wKSB7CisJCQkJLy8gRExMX0NUMworCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZUZyYW1lVGltZW91dDoKKwkJCQkvLyByZXBvcnQgRExMX0NFVl9MT1NTX1NPQyBhbmQgRExMX0NFVl9MT1NTX1NPQQorCQkJCURsbEV2ZW50Lm1fdWxEbGxFcnJvckV2ZW50cyB8PQorCQkJCSAgICBFUExfRExMX0VSUl9DTl9MT1NTX1NPQSB8CisJCQkJICAgIEVQTF9ETExfRVJSX0NOX0xPU1NfU09DOworCisJCQljYXNlIGtFcGxObXRFdmVudERsbENlU29hOgorCQkJCS8vIGVudGVyIERMTF9DU19XQUlUX1NPQworCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPSBrRXBsRGxsQ3NXYWl0U29jOworCQkJCWJyZWFrOworCisJCQkJLy8gRExMX0NUOQorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVNvYzoKKwkJCQkvLyByZXBvcnQgRExMX0NFVl9MT1NTX1NPQQorCQkJCURsbEV2ZW50Lm1fdWxEbGxFcnJvckV2ZW50cyB8PQorCQkJCSAgICBFUExfRExMX0VSUl9DTl9MT1NTX1NPQTsKKwkJCQkvLyByZW1haW4gaW4gRExMX0NTX1dBSVRfU09BCisJCQkJYnJlYWs7CisKKwkJCQkvLyBETExfQ1QxMAorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZUFzbmQ6CisJCQkJLy8gcmVwb3J0IERMTF9DRVZfTE9TU19TT0EKKwkJCQlEbGxFdmVudC5tX3VsRGxsRXJyb3JFdmVudHMgfD0KKwkJCQkgICAgRVBMX0RMTF9FUlJfQ05fTE9TU19TT0E7CisKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VQcmVxOgorCQkJCS8vIE5NVF9DU19TVE9QUEVEIGFjdGl2ZSBhbmQgd2UgZG8gbm90IGV4cGVjdCBhbnkgUFJlcQorCQkJCS8vIHNvIGp1c3QgaWdub3JlIGl0CisJCQljYXNlIGtFcGxObXRFdmVudERsbENlUHJlczoKKwkJCWRlZmF1bHQ6CisJCQkJLy8gcmVtYWluIGluIHRoaXMgc3RhdGUKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2Uga0VwbERsbEdzSW5pdDoKKwkJZGVmYXVsdDoKKwkJCS8vIGVudGVyIERMTF9DU19XQUlUX1BSRVEKKwkJCUVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPSBrRXBsRGxsQ3NXYWl0U29hOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJY2FzZSBrRXBsTm10TXNOb3RBY3RpdmU6CisJY2FzZSBrRXBsTm10TXNCYXNpY0V0aGVybmV0OgorCQlicmVhazsKKworCWNhc2Uga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwxOgorCQkvLyByZWR1Y2VkIEVQTCBjeWNsZSBpcyBhY3RpdmUKKwkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgIT0ga0VwbERsbE1zTm9uQ3ljbGljKSB7CS8vIHN0b3AgY3ljbGUgdGltZXIKKyNpZiBFUExfVElNRVJfVVNFX0hJR0hSRVMgIT0gRkFMU0UKKwkJCVJldCA9CisJCQkgICAgRXBsVGltZXJIaWdoUmVza0RlbGV0ZVRpbWVyKCZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCQltX1RpbWVySGRsQ3ljbGUpOworI2VuZGlmCisJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbFN0YXRlID0ga0VwbERsbE1zTm9uQ3ljbGljOworCisJCQkvLyBzdG9wIGZ1cnRoZXIgcHJvY2Vzc2luZywKKwkJCS8vIGJlY2F1c2UgaXQgd2lsbCBiZSByZXN0YXJ0ZWQgYnkgTk1UIE1OIG1vZHVsZQorCQkJYnJlYWs7CisJCX0KKworCQlzd2l0Y2ggKE5tdEV2ZW50X3ApIHsKKwkJY2FzZSBrRXBsTm10RXZlbnREbGxNZVNvY1RyaWc6CisJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VBc25kOgorCQkJewkvLyBiZWNhdXNlIG9mIHJlZHVjZWQgRVBMIGN5Y2xlIFNvQSBzaGFsbCBiZSB0cmlnZ2VyZWQsIG5vdCBTb0MKKwkJCQl0RXBsRGxsU3RhdGUgRHVtbXlEbGxTdGF0ZTsKKworCQkJCVJldCA9CisJCQkJICAgIEVwbERsbGtBc3luY0ZyYW1lTm90UmVjZWl2ZWQKKwkJCQkgICAgKEVwbERsbGtJbnN0YW5jZV9nLm1fTGFzdFJlcVNlcnZpY2VJZCwKKwkJCQkgICAgIEVwbERsbGtJbnN0YW5jZV9nLm1fdWlMYXN0VGFyZ2V0Tm9kZUlkKTsKKworCQkJCS8vIGdvIGFoZWFkIGFuZCBzZW5kIFNvQQorCQkJCVJldCA9IEVwbERsbGtNblNlbmRTb2EoTm10U3RhdGVfcCwKKwkJCQkJCSAgICAgICAmRHVtbXlEbGxTdGF0ZSwKKwkJCQkJCSAgICAgICAoRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkJbV91aUN5Y2xlQ291bnQgPj0KKwkJCQkJCQlFUExfQ19ETExfUFJFT1AxX1NUQVJUX0NZQ0xFUykpOworCQkJCS8vIGluY3JlbWVudCBjeWNsZSBjb3VudGVyIHRvIGRldGVjdCBpZiBFUExfQ19ETExfUFJFT1AxX1NUQVJUX0NZQ0xFUyBlbXB0eSBjeWNsZXMgYXJlIGVsYXBzZWQKKwkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX3VpQ3ljbGVDb3VudCsrOworCisJCQkJLy8gcmVwcm9ncmFtIHRpbWVyCisjaWYgRVBMX1RJTUVSX1VTRV9ISUdIUkVTICE9IEZBTFNFCisJCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0uCisJCQkJICAgIG1fZHdBc3luY1Nsb3RUaW1lb3V0ICE9IDApIHsKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbFRpbWVySGlnaFJlc2tNb2RpZnlUaW1lck5zCisJCQkJCSAgICAoJkVwbERsbGtJbnN0YW5jZV9nLm1fVGltZXJIZGxDeWNsZSwKKwkJCQkJICAgICBFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbENvbmZpZ1BhcmFtLgorCQkJCQkgICAgIG1fZHdBc3luY1Nsb3RUaW1lb3V0LAorCQkJCQkgICAgIEVwbERsbGtDYk1uVGltZXJDeWNsZSwgMEwsIEZBTFNFKTsKKwkJCQl9CisjZW5kaWYKKwkJCQlicmVhazsKKwkJCX0KKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIGtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMjoKKwljYXNlIGtFcGxObXRNc1JlYWR5VG9PcGVyYXRlOgorCWNhc2Uga0VwbE5tdE1zT3BlcmF0aW9uYWw6CisJCS8vIGZ1bGwgRVBMIGN5Y2xlIGlzIGFjdGl2ZQorCQlzd2l0Y2ggKE5tdEV2ZW50X3ApIHsKKwkJY2FzZSBrRXBsTm10RXZlbnREbGxNZVNvY1RyaWc6CisJCQl7CisJCQkJLy8gdXBkYXRlIGN5Y2xlIGNvdW50ZXIKKwkJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9EbGxDb25maWdQYXJhbS5tX3VpTXVsdGlwbEN5Y2xlQ250ID4gMCkgewkvLyBtdWx0aXBsZXhlZCBjeWNsZSBhY3RpdmUKKwkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV91aUN5Y2xlQ291bnQgPQorCQkJCQkgICAgKEVwbERsbGtJbnN0YW5jZV9nLm1fdWlDeWNsZUNvdW50ICsKKwkJCQkJICAgICAxKSAlCisJCQkJCSAgICBFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbENvbmZpZ1BhcmFtLgorCQkJCQkgICAgbV91aU11bHRpcGxDeWNsZUNudDsKKwkJCQkJLy8gJCQkIGNoZWNrIG11bHRpcGxleGVkIGN5Y2xlIHJlc3RhcnQKKwkJCQkJLy8gICAgIC0+IHRvZ2dsZSBNQyBmbGFnCisJCQkJCS8vICAgICAtPiBjaGFuZ2Ugbm9kZSBsaW5rZWQgbGlzdAorCQkJCX0gZWxzZSB7CS8vIG5vbi1tdWx0aXBsZXhlZCBjeWNsZSBhY3RpdmUKKwkJCQkJLy8gc3RhcnQgd2l0aCBmaXJzdCBub2RlIGluIGlzb2Nocm9ub3VzIHBoYXNlCisJCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fcEN1ck5vZGVJbmZvID0gTlVMTDsKKwkJCQl9CisKKwkJCQlzd2l0Y2ggKEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUpIHsKKwkJCQljYXNlIGtFcGxEbGxNc05vbkN5Y2xpYzoKKwkJCQkJewkvLyBzdGFydCBjb250aW51b3VzIGN5Y2xlIHRpbWVyCisjaWYgRVBMX1RJTUVSX1VTRV9ISUdIUkVTICE9IEZBTFNFCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbFRpbWVySGlnaFJlc2tNb2RpZnlUaW1lck5zCisJCQkJCQkgICAgKCZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgbV9UaW1lckhkbEN5Y2xlLAorCQkJCQkJICAgICBFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgbV91bGxGcmFtZVRpbWVvdXQsCisJCQkJCQkgICAgIEVwbERsbGtDYk1uVGltZXJDeWNsZSwgMEwsCisJCQkJCQkgICAgIFRSVUUpOworI2VuZGlmCisJCQkJCQkvLyBjb250aW51ZSB3aXRoIHNlbmRpbmcgU29DCisJCQkJCX0KKworCQkJCWNhc2Uga0VwbERsbE1zV2FpdEFzbmQ6CisJCQkJY2FzZSBrRXBsRGxsTXNXYWl0U29jVHJpZzoKKwkJCQkJewkvLyBpZiBtX0xhc3RSZXFTZXJ2aWNlSWQgaXMgc3RpbGwgdmFsaWQsCisJCQkJCQkvLyBTb0Egd2FzIG5vdCBjb3JyZWN0bHkgYW5zd2VyZWQKKwkJCQkJCS8vIGFuZCB1c2VyIHBhcnQgaGFzIHRvIGJlIGluZm9ybWVkCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbERsbGtBc3luY0ZyYW1lTm90UmVjZWl2ZWQKKwkJCQkJCSAgICAoRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgIG1fTGFzdFJlcVNlcnZpY2VJZCwKKwkJCQkJCSAgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgIG1fdWlMYXN0VGFyZ2V0Tm9kZUlkKTsKKworCQkJCQkJLy8gc2VuZCBTb0MKKwkJCQkJCVJldCA9IEVwbERsbGtNblNlbmRTb2MoKTsKKworCQkJCQkJLy8gbmV3IERMTCBzdGF0ZQorCQkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSA9CisJCQkJCQkgICAga0VwbERsbE1zV2FpdFByZXFUcmlnOworCisJCQkJCQkvLyBzdGFydCBXYWl0U29DUFJlcSBUaW1lcgorI2lmIEVQTF9USU1FUl9VU0VfSElHSFJFUyAhPSBGQUxTRQorCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxUaW1lckhpZ2hSZXNrTW9kaWZ5VGltZXJOcworCQkJCQkJICAgICgmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgIG1fVGltZXJIZGxSZXNwb25zZSwKKwkJCQkJCSAgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgIG1fRGxsQ29uZmlnUGFyYW0uCisJCQkJCQkgICAgIG1fZHdXYWl0U29jUHJlcSwKKwkJCQkJCSAgICAgRXBsRGxsa0NiTW5UaW1lclJlc3BvbnNlLAorCQkJCQkJICAgICAwTCwgRkFMU0UpOworI2VuZGlmCisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJZGVmYXVsdDoKKwkJCQkJewkvLyB3cm9uZyBETEwgc3RhdGUgLyBjeWNsZSB0aW1lIGV4Y2VlZGVkCisJCQkJCQlEbGxFdmVudC5tX3VsRGxsRXJyb3JFdmVudHMgfD0KKwkJCQkJCSAgICBFUExfRExMX0VSUl9NTl9DWUNUSU1FRVhDRUVEOworCQkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSA9CisJCQkJCQkgICAga0VwbERsbE1zV2FpdFNvY1RyaWc7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKworCQkJCWJyZWFrOworCQkJfQorCisJCWNhc2Uga0VwbE5tdEV2ZW50RGxsTWVQcmVzVGltZW91dDoKKwkJCXsKKworCQkJCXN3aXRjaCAoRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSkgeworCQkJCWNhc2Uga0VwbERsbE1zV2FpdFByZXM6CisJCQkJCXsJLy8gUFJlcyBub3QgcmVjZWl2ZWQKKworCQkJCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fcEN1ck5vZGVJbmZvLT5tX2ZTb2Z0RGVsZXRlID09IEZBTFNFKSB7CS8vIG5vcm1hbCBpc29jaHJvbm91cyBDTgorCQkJCQkJCURsbEV2ZW50LgorCQkJCQkJCSAgICBtX3VsRGxsRXJyb3JFdmVudHMKKwkJCQkJCQkgICAgfD0KKwkJCQkJCQkgICAgRVBMX0RMTF9FUlJfTU5fQ05fTE9TU19QUkVTOworCQkJCQkJCURsbEV2ZW50Lm1fdWlOb2RlSWQgPQorCQkJCQkJCSAgICBFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCQkgICAgbV9wQ3VyTm9kZUluZm8tPgorCQkJCQkJCSAgICBtX3VpTm9kZUlkOworCQkJCQkJfSBlbHNlIHsJLy8gQ04gc2hhbGwgYmUgZGVsZXRlZCBzb2Z0bHkKKwkJCQkJCQlFdmVudC5tX0V2ZW50U2luayA9CisJCQkJCQkJICAgIGtFcGxFdmVudFNpbmtEbGxrQ2FsOworCQkJCQkJCUV2ZW50Lm1fRXZlbnRUeXBlID0KKwkJCQkJCQkgICAga0VwbEV2ZW50VHlwZURsbGtTb2Z0RGVsTm9kZTsKKwkJCQkJCQkvLyAkJCQgZC5rLiBzZXQgRXZlbnQubV9OZXRUaW1lIHRvIGN1cnJlbnQgdGltZQorCQkJCQkJCUV2ZW50Lm1fdWlTaXplID0KKwkJCQkJCQkgICAgc2l6ZW9mKHVuc2lnbmVkCisJCQkJCQkJCSAgIGludCk7CisJCQkJCQkJRXZlbnQubV9wQXJnID0KKwkJCQkJCQkgICAgJkVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJCSAgICBtX3BDdXJOb2RlSW5mby0+CisJCQkJCQkJICAgIG1fdWlOb2RlSWQ7CisJCQkJCQkJUmV0ID0KKwkJCQkJCQkgICAgRXBsRXZlbnRrUG9zdAorCQkJCQkJCSAgICAoJkV2ZW50KTsKKwkJCQkJCX0KKworCQkJCQkJLy8gY29udGludWUgd2l0aCBzZW5kaW5nIG5leHQgUFJlcQorCQkJCQl9CisKKwkJCQljYXNlIGtFcGxEbGxNc1dhaXRQcmVxVHJpZzoKKwkJCQkJeworCQkJCQkJLy8gc2VuZCBuZXh0IFBSZXEKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsRGxsa01uU2VuZFByZXEKKwkJCQkJCSAgICAoTm10U3RhdGVfcCwKKwkJCQkJCSAgICAgJkVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJICAgICBtX0RsbFN0YXRlKTsKKworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCWRlZmF1bHQ6CisJCQkJCXsJLy8gd3JvbmcgRExMIHN0YXRlCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKworCQkJCWJyZWFrOworCQkJfQorCisJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VQcmVzOgorCQkJeworCisJCQkJc3dpdGNoIChFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbFN0YXRlKSB7CisJCQkJY2FzZSBrRXBsRGxsTXNXYWl0UHJlczoKKwkJCQkJewkvLyBQUmVzIHJlY2VpdmVkCisJCQkJCQkvLyBzZW5kIG5leHQgUFJlcQorCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxEbGxrTW5TZW5kUHJlcQorCQkJCQkJICAgIChObXRTdGF0ZV9wLAorCQkJCQkJICAgICAmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgIG1fRGxsU3RhdGUpOworCisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJZGVmYXVsdDoKKwkJCQkJewkvLyB3cm9uZyBETEwgc3RhdGUKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCisJCQkJYnJlYWs7CisJCQl9CisKKwkJY2FzZSBrRXBsTm10RXZlbnREbGxNZVNvYVRyaWc6CisJCQl7CisKKwkJCQlzd2l0Y2ggKEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUpIHsKKwkJCQljYXNlIGtFcGxEbGxNc1dhaXRTb2FUcmlnOgorCQkJCQl7CS8vIE1OIFBSZXMgc2VudAorCQkJCQkJLy8gc2VuZCBTb0EKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsRGxsa01uU2VuZFNvYShObXRTdGF0ZV9wLAorCQkJCQkJCQkgICAgICZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCQkJICAgICBtX0RsbFN0YXRlLAorCQkJCQkJCQkgICAgIFRSVUUpOworCisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJZGVmYXVsdDoKKwkJCQkJewkvLyB3cm9uZyBETEwgc3RhdGUKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCisJCQkJYnJlYWs7CisJCQl9CisKKwkJY2FzZSBrRXBsTm10RXZlbnREbGxDZUFzbmQ6CisJCQl7CS8vIEFTbmQgaGFzIGJlZW4gcmVjZWl2ZWQsIGJ1dCBpdCBtYXkgYmUgbm90IHRoZSByZXF1ZXN0ZWQgb25lCisvKgorICAgICAgICAgICAgICAgICAgICAvLyByZXBvcnQgaWYgU29BIHdhcyBjb3JyZWN0bHkgYW5zd2VyZWQKKyAgICAgICAgICAgICAgICAgICAgUmV0ID0gRXBsRGxsa0FzeW5jRnJhbWVOb3RSZWNlaXZlZChFcGxEbGxrSW5zdGFuY2VfZy5tX0xhc3RSZXFTZXJ2aWNlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXBsRGxsa0luc3RhbmNlX2cubV91aUxhc3RUYXJnZXROb2RlSWQpOworKi8KKwkJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSA9PQorCQkJCSAgICBrRXBsRGxsTXNXYWl0QXNuZCkgeworCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbFN0YXRlID0KKwkJCQkJICAgIGtFcGxEbGxNc1dhaXRTb2NUcmlnOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisjZW5kaWYgLy8oKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlpZiAoRGxsRXZlbnQubV91bERsbEVycm9yRXZlbnRzICE9IDApIHsJLy8gZXJyb3IgZXZlbnQgc2V0IC0+IHBvc3QgaXQgdG8gZXJyb3IgaGFuZGxlcgorCQlFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtFcnJrOworCQlFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVEbGxFcnJvcjsKKwkJLy8gJCQkIGQuay4gc2V0IEV2ZW50Lm1fTmV0VGltZSB0byBjdXJyZW50IHRpbWUKKwkJRXZlbnQubV91aVNpemUgPSBzaXplb2YoRGxsRXZlbnQpOworCQlFdmVudC5tX3BBcmcgPSAmRGxsRXZlbnQ7CisJCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKwl9CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrQ2JGcmFtZVJlY2VpdmVkKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogY2FsbGVkIGZyb20gRWRydkludGVycnVwdEhhbmRsZXIoKQorLy8KKy8vIFBhcmFtZXRlcnM6ICBwUnhCdWZmZXJfcCAgICAgICAgICAgICA9IHJlY2VpdmUgYnVmZmVyIHN0cnVjdHVyZQorLy8KKy8vIFJldHVybnM6ICAgICAobm9uZSkKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgRXBsRGxsa0NiRnJhbWVSZWNlaXZlZCh0RWRydlJ4QnVmZmVyICogcFJ4QnVmZmVyX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsTm10U3RhdGUgTm10U3RhdGU7CisJdEVwbE5tdEV2ZW50IE5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50Tm9FdmVudDsKKwl0RXBsRXZlbnQgRXZlbnQ7CisJdEVwbEZyYW1lICpwRnJhbWU7CisJdEVwbEZyYW1lICpwVHhGcmFtZTsKKwl0RWRydlR4QnVmZmVyICpwVHhCdWZmZXIgPSBOVUxMOworCXRFcGxGcmFtZUluZm8gRnJhbWVJbmZvOworCXRFcGxNc2dUeXBlIE1zZ1R5cGU7CisJdEVwbERsbFJlcVNlcnZpY2VJZCBSZXFTZXJ2aWNlSWQ7CisJdW5zaWduZWQgaW50IHVpQXNuZFNlcnZpY2VJZDsKKwl1bnNpZ25lZCBpbnQgdWlOb2RlSWQ7CisJQllURSBiRmxhZzE7CisKKwlCRU5DSE1BUktfTU9EXzAyX1NFVCgzKTsKKwlObXRTdGF0ZSA9IEVwbE5tdGtHZXRObXRTdGF0ZSgpOworCisJaWYgKE5tdFN0YXRlIDw9IGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbikgeworCQlnb3RvIEV4aXQ7CisJfQorCisJcEZyYW1lID0gKHRFcGxGcmFtZSAqKSBwUnhCdWZmZXJfcC0+bV9wYkJ1ZmZlcjsKKworI2lmIEVEUlZfRUFSTFlfUlhfSU5UICE9IEZBTFNFCisJc3dpdGNoIChwUnhCdWZmZXJfcC0+bV9CdWZmZXJJbkZyYW1lKSB7CisJY2FzZSBrRWRydkJ1ZmZlckZpcnN0SW5GcmFtZToKKwkJeworCQkJTXNnVHlwZSA9CisJCQkgICAgKHRFcGxNc2dUeXBlKSBBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWUtPgorCQkJCQkJCSAgIG1fbGVfYk1lc3NhZ2VUeXBlKTsKKwkJCWlmIChNc2dUeXBlID09IGtFcGxNc2dUeXBlUHJlcSkgeworCQkJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbFN0YXRlID09IGtFcGxEbGxDc1dhaXRQcmVxKSB7CS8vIFBSZXEgZXhwZWN0ZWQgYW5kIGFjdHVhbGx5IHJlY2VpdmVkCisJCQkJCS8vIGQuay46IFRoZSBjb25kaXRpb24gYWJvdmUgaXMgc3VmZmljZW50LCBiZWNhdXNlIEVQTCBjeWNsZSBpcyBhY3RpdmUKKwkJCQkJLy8gICAgICAgYW5kIG5vIG5vbi1FUEwgZnJhbWUgc2hhbGwgYmUgcmVjZWl2ZWQgaW4gaXNvY2hyb25vdXMgcGhhc2UuCisJCQkJCS8vIHN0YXJ0IHRyYW5zbWlzc2lvbiBQUmVzCisJCQkJCS8vICQkJCBXaGF0IGlmIFR4IGJ1ZmZlciBpcyBpbnZhbGlkPworCQkJCQlwVHhCdWZmZXIgPQorCQkJCQkgICAgJkVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9QUkVTXTsKKyNpZiAoRVBMX0RMTF9QUkVTX1JFQURZX0FGVEVSX1NPQSAhPSBGQUxTRSkgfHwgKEVQTF9ETExfUFJFU19SRUFEWV9BRlRFUl9TT0MgIT0gRkFMU0UpCisJCQkJCVJldCA9IEVkcnZUeE1zZ1N0YXJ0KHBUeEJ1ZmZlcik7CisjZWxzZQorCQkJCQlwVHhGcmFtZSA9CisJCQkJCSAgICAodEVwbEZyYW1lICopIHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlcjsKKwkJCQkJLy8gdXBkYXRlIGZyYW1lIChOTVQgc3RhdGUsIFJELCBSUywgUFIsIE1TLCBFTiBmbGFncykKKwkJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9QcmVzLgorCQkJCQkJICAgICAgIG1fbGVfYk5tdFN0YXR1cywKKwkJCQkJCSAgICAgICAoQllURSkgTm10U3RhdGUpOworCQkJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1ByZXMuCisJCQkJCQkgICAgICAgbV9sZV9iRmxhZzIsCisJCQkJCQkgICAgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgICAgbV9iRmxhZzIpOworCQkJCQlpZiAoTm10U3RhdGUgIT0ga0VwbE5tdENzT3BlcmF0aW9uYWwpIHsJLy8gbWFyayBQRE8gYXMgaW52YWxpZCBpbiBOTVQgc3RhdGUgT3AKKwkJCQkJCS8vICQkJCByZXNldCBvbmx5IFJEIGZsYWc7IHNldCBvdGhlciBmbGFncyBhcHByb3ByaWF0ZWx5CisJCQkJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPgorCQkJCQkJCSAgICAgICBtX0RhdGEubV9QcmVzLgorCQkJCQkJCSAgICAgICBtX2xlX2JGbGFnMSwgMCk7CisJCQkJCX0KKwkJCQkJLy8gJCQkIG1ha2UgZnVuY3Rpb24gdGhhdCB1cGRhdGVzIFByZXMsIFN0YXR1c1JlcworCQkJCQkvLyBzZW5kIFBSZXMgZnJhbWUKKwkJCQkJUmV0ID0gRWRydlNlbmRUeE1zZyhwVHhCdWZmZXIpOworI2VuZGlmCisJCQkJfQorCQkJfQorCQkJZ290byBFeGl0OworCQl9CisKKwljYXNlIGtFZHJ2QnVmZmVyTWlkZGxlSW5GcmFtZToKKwkJeworCQkJZ290byBFeGl0OworCQl9CisKKwljYXNlIGtFZHJ2QnVmZmVyTGFzdEluRnJhbWU6CisJCXsKKwkJCWJyZWFrOworCQl9CisJfQorI2VuZGlmCisKKwlGcmFtZUluZm8ubV9wRnJhbWUgPSBwRnJhbWU7CisJRnJhbWVJbmZvLm1fdWlGcmFtZVNpemUgPSBwUnhCdWZmZXJfcC0+bV91aVJ4TXNnTGVuOworCUZyYW1lSW5mby5tX05ldFRpbWUubV9kd05hbm9TZWMgPSBwUnhCdWZmZXJfcC0+bV9OZXRUaW1lLm1fZHdOYW5vU2VjOworCUZyYW1lSW5mby5tX05ldFRpbWUubV9kd1NlYyA9IHBSeEJ1ZmZlcl9wLT5tX05ldFRpbWUubV9kd1NlYzsKKworCWlmIChBbWlHZXRXb3JkRnJvbUJlKCZwRnJhbWUtPm1fYmVfd0V0aGVyVHlwZSkgIT0gRVBMX0NfRExMX0VUSEVSVFlQRV9FUEwpIHsJLy8gbm9uLUVQTCBmcmFtZQorCQkvL1RSQUNFMigiRXBsRGxsa0NiRnJhbWVSZWNlaXZlZDogcGZuQ2JBc3luYz0weCVwIFNyY01BQz0weCVsbHhcbiIsIEVwbERsbGtJbnN0YW5jZV9nLm1fcGZuQ2JBc3luYywgQW1pR2V0UXdvcmQ0OEZyb21CZShwRnJhbWUtPm1fYmVfYWJTcmNNYWMpKTsKKwkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fcGZuQ2JBc3luYyAhPSBOVUxMKSB7CS8vIGhhbmRsZXIgZm9yIGFzeW5jIGZyYW1lcyBpcyByZWdpc3RlcmVkCisJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX3BmbkNiQXN5bmMoJkZyYW1lSW5mbyk7CisJCX0KKworCQlnb3RvIEV4aXQ7CisJfQorCisJTXNnVHlwZSA9ICh0RXBsTXNnVHlwZSkgQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT5tX2xlX2JNZXNzYWdlVHlwZSk7CisJc3dpdGNoIChNc2dUeXBlKSB7CisJY2FzZSBrRXBsTXNnVHlwZVByZXE6CisJCXsKKwkJCS8vIFBSZXEgZnJhbWUKKwkJCS8vIGQuay46ICh3ZSBhc3N1bWUgdGhhdCB0aGlzIFBSZXEgZnJhbWUgaXMgaW50ZW5kZWQgZm9yIHVzIGFuZCBkb24ndCBjaGVjayBEc3ROb2RlSWQpCisJCQlpZiAoQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT5tX2xlX2JEc3ROb2RlSWQpICE9IEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0ubV91aU5vZGVJZCkgewkvLyB0aGlzIFBSZXEgaXMgbm90IGludGVuZGVkIGZvciB1cworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50RGxsQ2VQcmVxOworCisJCQlpZiAoTm10U3RhdGUgPj0ga0VwbE5tdE1zTm90QWN0aXZlKSB7CS8vIE1OIGlzIGFjdGl2ZSAtPiB3cm9uZyBtc2cgdHlwZQorCQkJCWJyZWFrOworCQkJfQorI2lmIEVEUlZfRUFSTFlfUlhfSU5UID09IEZBTFNFCisJCQlpZiAoTm10U3RhdGUgPj0ga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwyKSB7CS8vIHJlc3BvbmQgdG8gYW5kIHByb2Nlc3MgUFJlcSBmcmFtZXMgb25seSBpbiBQcmVPcDIsIFJlYWR5VG9PcCBhbmQgT3AKKwkJCQkvLyBEb2VzIFBSZXMgZXhpc3Q/CisJCQkJcFR4QnVmZmVyID0KKwkJCQkgICAgJkVwbERsbGtJbnN0YW5jZV9nLgorCQkJCSAgICBtX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX1BSRVNdOworCQkJCWlmIChwVHhCdWZmZXItPm1fcGJCdWZmZXIgIT0gTlVMTCkgewkvLyBQUmVzIGRvZXMgZXhpc3QKKyNpZiAoRVBMX0RMTF9QUkVTX1JFQURZX0FGVEVSX1NPQSAhPSBGQUxTRSkgfHwgKEVQTF9ETExfUFJFU19SRUFEWV9BRlRFUl9TT0MgIT0gRkFMU0UpCisJCQkJCUVkcnZUeE1zZ1N0YXJ0KHBUeEJ1ZmZlcik7CisjZWxzZQorCQkJCQlwVHhGcmFtZSA9CisJCQkJCSAgICAodEVwbEZyYW1lICopIHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlcjsKKwkJCQkJLy8gdXBkYXRlIGZyYW1lIChOTVQgc3RhdGUsIFJELCBSUywgUFIsIE1TLCBFTiBmbGFncykKKwkJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9QcmVzLgorCQkJCQkJICAgICAgIG1fbGVfYk5tdFN0YXR1cywKKwkJCQkJCSAgICAgICAoQllURSkgTm10U3RhdGUpOworCQkJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1ByZXMuCisJCQkJCQkgICAgICAgbV9sZV9iRmxhZzIsCisJCQkJCQkgICAgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgICAgbV9iRmxhZzIpOworCQkJCQliRmxhZzEgPQorCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT5tX0RhdGEuCisJCQkJCQkJICAgICBtX1ByZXEuCisJCQkJCQkJICAgICBtX2xlX2JGbGFnMSk7CisJCQkJCS8vIHNhdmUgRUEgZmxhZworCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX2JNbkZsYWcxID0KKwkJCQkJICAgIChFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJICAgICBtX2JNbkZsYWcxICYgfkVQTF9GUkFNRV9GTEFHMV9FQSkKKwkJCQkJICAgIHwgKGJGbGFnMSAmIEVQTF9GUkFNRV9GTEFHMV9FQSk7CisJCQkJCS8vIHByZXNlcnZlIE1TIGZsYWcKKwkJCQkJYkZsYWcxICY9IEVQTF9GUkFNRV9GTEFHMV9NUzsKKwkJCQkJLy8gYWRkIEVOIGZsYWcgZnJvbSBFcnJvciBzaWduYWxpbmcgbW9kdWxlCisJCQkJCWJGbGFnMSB8PQorCQkJCQkgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCSAgICBtX2JGbGFnMSAmIEVQTF9GUkFNRV9GTEFHMV9FTjsKKwkJCQkJaWYgKE5tdFN0YXRlICE9IGtFcGxObXRDc09wZXJhdGlvbmFsKSB7CS8vIG1hcmsgUERPIGFzIGludmFsaWQgaW4gTk1UIHN0YXRlIE9wCisJCQkJCQkvLyByZXNldCBvbmx5IFJEIGZsYWcKKwkJCQkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+CisJCQkJCQkJICAgICAgIG1fRGF0YS5tX1ByZXMuCisJCQkJCQkJICAgICAgIG1fbGVfYkZsYWcxLAorCQkJCQkJCSAgICAgICBiRmxhZzEpOworCQkJCQl9IGVsc2UgewkvLyBsZWF2ZSBSRCBmbGFnIHVudG91Y2hlZAorCQkJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT4KKwkJCQkJCQkgICAgICAgbV9EYXRhLm1fUHJlcy4KKwkJCQkJCQkgICAgICAgbV9sZV9iRmxhZzEsCisJCQkJCQkJICAgICAgIChBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkJCSgmcFR4RnJhbWUtPgorCQkJCQkJCQkgbV9EYXRhLm1fUHJlcy4KKwkJCQkJCQkJIG1fbGVfYkZsYWcxKSAmCisJCQkJCQkJCUVQTF9GUkFNRV9GTEFHMV9SRCkKKwkJCQkJCQkgICAgICAgfCBiRmxhZzEpOworCQkJCQl9CisJCQkJCS8vICQkJCB1cGRhdGUgRVBMX0RMTF9QUkVTX1JFQURZX0FGVEVSXyogY29kZQorCQkJCQkvLyBzZW5kIFBSZXMgZnJhbWUKKwkJCQkJUmV0ID0gRWRydlNlbmRUeE1zZyhwVHhCdWZmZXIpOworCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCX0KKyNlbmRpZgorCQkJCX0KKyNlbmRpZgorCQkJCS8vIGluZm9ybSBQRE8gbW9kdWxlCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkKKwkJCQlpZiAoTm10U3RhdGUgPj0ga0VwbE5tdENzUmVhZHlUb09wZXJhdGUpIHsJLy8gaW5mb3JtIFBETyBtb2R1bGUgb25seSBpbiBSZWFkeVRvT3AgYW5kIE9wCisJCQkJCWlmIChObXRTdGF0ZSAhPSBrRXBsTm10Q3NPcGVyYXRpb25hbCkgeworCQkJCQkJLy8gcmVzZXQgUkQgZmxhZyBhbmQgYWxsIG90aGVyIGZsYWdzLCBidXQgdGhhdCBkb2VzIG5vdCBtYXR0ZXIsIGJlY2F1c2UgdGhleSB3ZXJlIHByb2Nlc3NlZCBhYm92ZQorCQkJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBGcmFtZS0+bV9EYXRhLgorCQkJCQkJCSAgICAgICBtX1ByZXEuCisJCQkJCQkJICAgICAgIG1fbGVfYkZsYWcxLCAwKTsKKwkJCQkJfQorCQkJCQkvLyBjb21wYXJlcyByZWFsIGZyYW1lIHNpemUgYW5kIFBETyBzaXplCisJCQkJCWlmICgodW5zaWduZWQKKwkJCQkJICAgICBpbnQpKEFtaUdldFdvcmRGcm9tTGUoJnBGcmFtZS0+CisJCQkJCQkJCSAgIG1fRGF0YS4KKwkJCQkJCQkJICAgbV9QcmVxLgorCQkJCQkJCQkgICBtX2xlX3dTaXplKSArCisJCQkJCQkgIDI0KQorCQkJCQkgICAgPiBGcmFtZUluZm8ubV91aUZyYW1lU2l6ZSkgewkvLyBmb3JtYXQgZXJyb3IKKwkJCQkJCXRFcGxFcnJvckhhbmRsZXJrRXZlbnQgRGxsRXZlbnQ7CisKKwkJCQkJCURsbEV2ZW50Lm1fdWxEbGxFcnJvckV2ZW50cyA9CisJCQkJCQkgICAgRVBMX0RMTF9FUlJfSU5WQUxJRF9GT1JNQVQ7CisJCQkJCQlEbGxFdmVudC5tX3VpTm9kZUlkID0KKwkJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWUtPgorCQkJCQkJCQkgICAgIG1fbGVfYlNyY05vZGVJZCk7CisJCQkJCQlEbGxFdmVudC5tX05tdFN0YXRlID0gTm10U3RhdGU7CisJCQkJCQlFdmVudC5tX0V2ZW50U2luayA9CisJCQkJCQkgICAga0VwbEV2ZW50U2lua0Vycms7CisJCQkJCQlFdmVudC5tX0V2ZW50VHlwZSA9CisJCQkJCQkgICAga0VwbEV2ZW50VHlwZURsbEVycm9yOworCQkJCQkJRXZlbnQubV9OZXRUaW1lID0KKwkJCQkJCSAgICBGcmFtZUluZm8ubV9OZXRUaW1lOworCQkJCQkJRXZlbnQubV91aVNpemUgPQorCQkJCQkJICAgIHNpemVvZihEbGxFdmVudCk7CisJCQkJCQlFdmVudC5tX3BBcmcgPSAmRGxsRXZlbnQ7CisJCQkJCQlSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQkvLyBmb3J3YXJkIFBSZXEgZnJhbWUgYXMgUlBETyB0byBQRE8gbW9kdWxlCisJCQkJCVJldCA9IEVwbFBkb2tDYlBkb1JlY2VpdmVkKCZGcmFtZUluZm8pOworCisJCQkJfQorI2lmIChFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfU09DICE9IEZBTFNFKQorCQkJCWlmIChwVHhCdWZmZXItPm1fcGJCdWZmZXIgIT0gTlVMTCkgewkvLyBQUmVzIGRvZXMgZXhpc3QKKwkJCQkJLy8gaW5mb3JtIFBETyBtb2R1bGUgYWJvdXQgUFJlcyBhZnRlciBQUmVxCisJCQkJCUZyYW1lSW5mby5tX3BGcmFtZSA9CisJCQkJCSAgICAodEVwbEZyYW1lICopIHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlcjsKKwkJCQkJRnJhbWVJbmZvLm1fdWlGcmFtZVNpemUgPQorCQkJCQkgICAgcFR4QnVmZmVyLT5tX3VpTWF4QnVmZmVyTGVuOworCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsUGRva0NiUGRvVHJhbnNtaXR0ZWQoJkZyYW1lSW5mbyk7CisJCQkJfQorI2VuZGlmCisjZW5kaWYKKworI2lmIEVEUlZfRUFSTFlfUlhfSU5UID09IEZBTFNFCisJCQkJLy8gJCQkIGluZm9ybSBlbWVyZ2VuY3kgcHJvdG9jb2wgaGFuZGxpbmcgKGVycm9yIHNpZ25hbGluZyBtb2R1bGUpIGFib3V0IGZsYWdzCisJCQl9CisjZW5kaWYKKworCQkJLy8gcmVzZXQgY3ljbGUgY291bnRlcgorCQkJRXBsRGxsa0luc3RhbmNlX2cubV91aUN5Y2xlQ291bnQgPSAwOworCisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTXNnVHlwZVByZXM6CisJCXsKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJCQl0RXBsRGxsa05vZGVJbmZvICpwSW50Tm9kZUluZm87CisJCQl0RXBsSGVhcnRiZWF0RXZlbnQgSGVhcnRiZWF0RXZlbnQ7CisjZW5kaWYKKworCQkJLy8gUFJlcyBmcmFtZQorCQkJTm10RXZlbnQgPSBrRXBsTm10RXZlbnREbGxDZVByZXM7CisKKwkJCXVpTm9kZUlkID0gQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT5tX2xlX2JTcmNOb2RlSWQpOworCisJCQlpZiAoKE5tdFN0YXRlID49IGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMikKKwkJCSAgICAmJiAoTm10U3RhdGUgPD0ga0VwbE5tdENzT3BlcmF0aW9uYWwpKSB7CS8vIHByb2Nlc3MgUFJlcyBmcmFtZXMgb25seSBpbiBQcmVPcDIsIFJlYWR5VG9PcCBhbmQgT3Agb2YgQ04KKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwkJCQlwSW50Tm9kZUluZm8gPSBFcGxEbGxrR2V0Tm9kZUluZm8odWlOb2RlSWQpOworCQkJCWlmIChwSW50Tm9kZUluZm8gPT0gTlVMTCkgewkvLyBubyBub2RlIGluZm8gc3RydWN0dXJlIGF2YWlsYWJsZQorCQkJCQlSZXQgPSBrRXBsRGxsTm9Ob2RlSW5mbzsKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKwkJCX0gZWxzZSBpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSA9PSBrRXBsRGxsTXNXYWl0UHJlcykgewkvLyBvciBwcm9jZXNzIFBSZXMgZnJhbWVzIGluIE1zV2FpdFByZXMKKworCQkJCXBJbnROb2RlSW5mbyA9IEVwbERsbGtJbnN0YW5jZV9nLm1fcEN1ck5vZGVJbmZvOworCQkJCWlmICgocEludE5vZGVJbmZvID09IE5VTEwpIHx8IChwSW50Tm9kZUluZm8tPm1fdWlOb2RlSWQgIT0gdWlOb2RlSWQpKSB7CS8vIGlnbm9yZSBQUmVzLCBiZWNhdXNlIGl0IGlzIGZyb20gd3JvbmcgQ04KKwkJCQkJLy8gJCQkIG1heWJlIHBvc3QgZXZlbnQgdG8gTm10TW4gbW9kdWxlCisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisJCQkJLy8gZm9yd2FyZCBGbGFnMiB0byBhc3luY2hyb25vdXMgc2NoZWR1bGVyCisJCQkJYkZsYWcxID0KKwkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT5tX0RhdGEubV9Bc25kLgorCQkJCQkJICAgICBtX1BheWxvYWQubV9TdGF0dXNSZXNwb25zZS4KKwkJCQkJCSAgICAgbV9sZV9iRmxhZzIpOworCQkJCVJldCA9CisJCQkJICAgIEVwbERsbGtDYWxBc3luY1NldFBlbmRpbmdSZXF1ZXN0cyh1aU5vZGVJZCwKKwkJCQkJCQkJICAgICAgKCh0RXBsRGxsQXN5bmNSZXFQcmlvcml0eSkgKChiRmxhZzEgJiBFUExfRlJBTUVfRkxBRzJfUFIpID4+IEVQTF9GUkFNRV9GTEFHMl9QUl9TSElGVCkpLCAoYkZsYWcxICYgRVBMX0ZSQU1FX0ZMQUcyX1JTKSk7CisKKyNlbmRpZgorCQkJfSBlbHNlIHsJLy8gaWdub3JlIFBSZXMsIGJlY2F1c2UgaXQgd2FzIHJlY2VpdmVkIGluIHdyb25nIE5NVCBzdGF0ZQorCQkJCS8vIGJ1dCBleGVjdXRlIEVwbERsbGtDaGFuZ2VTdGF0ZSgpIGFuZCBwb3N0IGV2ZW50IHRvIE5NVCBtb2R1bGUKKwkJCQlicmVhazsKKwkJCX0KKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwkJCXsJLy8gY2hlY2sgTk1UIHN0YXRlIG9mIENOCisJCQkJSGVhcnRiZWF0RXZlbnQubV93RXJyb3JDb2RlID0gRVBMX0VfTk9fRVJST1I7CisJCQkJSGVhcnRiZWF0RXZlbnQubV9ObXRTdGF0ZSA9CisJCQkJICAgICh0RXBsTm10U3RhdGUpIChBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkgICAgKCZwRnJhbWUtPm1fRGF0YS5tX1ByZXMuCisJCQkJCQkgICAgIG1fbGVfYk5tdFN0YXR1cykgfAorCQkJCQkJICAgIEVQTF9OTVRfVFlQRV9DUyk7CisJCQkJaWYgKHBJbnROb2RlSW5mby0+bV9ObXRTdGF0ZSAhPSBIZWFydGJlYXRFdmVudC5tX05tdFN0YXRlKSB7CS8vIE5NVCBzdGF0ZSBvZiBDTiBoYXMgY2hhbmdlZCAtPiBwb3N0IGV2ZW50IHRvIE5tdE1udSBtb2R1bGUKKwkJCQkJaWYgKHBJbnROb2RlSW5mby0+bV9mU29mdERlbGV0ZSA9PSBGQUxTRSkgewkvLyBub3JtYWwgaXNvY2hyb25vdXMgQ04KKwkJCQkJCUhlYXJ0YmVhdEV2ZW50Lm1fdWlOb2RlSWQgPQorCQkJCQkJICAgIHVpTm9kZUlkOworCQkJCQkJRXZlbnQubV9FdmVudFNpbmsgPQorCQkJCQkJICAgIGtFcGxFdmVudFNpbmtObXRNbnU7CisJCQkJCQlFdmVudC5tX0V2ZW50VHlwZSA9CisJCQkJCQkgICAga0VwbEV2ZW50VHlwZUhlYXJ0YmVhdDsKKwkJCQkJCUV2ZW50Lm1fdWlTaXplID0KKwkJCQkJCSAgICBzaXplb2YoSGVhcnRiZWF0RXZlbnQpOworCQkJCQkJRXZlbnQubV9wQXJnID0gJkhlYXJ0YmVhdEV2ZW50OworCQkJCQl9IGVsc2UgewkvLyBDTiBzaGFsbCBiZSBkZWxldGVkIHNvZnRseQorCQkJCQkJRXZlbnQubV9FdmVudFNpbmsgPQorCQkJCQkJICAgIGtFcGxFdmVudFNpbmtEbGxrQ2FsOworCQkJCQkJRXZlbnQubV9FdmVudFR5cGUgPQorCQkJCQkJICAgIGtFcGxFdmVudFR5cGVEbGxrU29mdERlbE5vZGU7CisJCQkJCQlFdmVudC5tX3VpU2l6ZSA9CisJCQkJCQkgICAgc2l6ZW9mKHVuc2lnbmVkIGludCk7CisJCQkJCQlFdmVudC5tX3BBcmcgPQorCQkJCQkJICAgICZwSW50Tm9kZUluZm8tPm1fdWlOb2RlSWQ7CisJCQkJCX0KKwkJCQkJRXZlbnQubV9OZXRUaW1lID0gRnJhbWVJbmZvLm1fTmV0VGltZTsKKwkJCQkJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworCisJCQkJCS8vIHNhdmUgY3VycmVudCBOTVQgc3RhdGUgb2YgQ04gaW4gaW50ZXJuYWwgbm9kZSBzdHJ1Y3R1cmUKKwkJCQkJcEludE5vZGVJbmZvLT5tX05tdFN0YXRlID0KKwkJCQkJICAgIEhlYXJ0YmVhdEV2ZW50Lm1fTm10U3RhdGU7CisJCQkJfQorCQkJfQorI2VuZGlmCisKKwkJCS8vIGluZm9ybSBQRE8gbW9kdWxlCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkKKwkJCWlmICgoTm10U3RhdGUgIT0ga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwyKQorCQkJICAgICYmIChObXRTdGF0ZSAhPSBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDIpKSB7CS8vIGluZm9ybSBQRE8gbW9kdWxlIG9ubHkgaW4gUmVhZHlUb09wIGFuZCBPcAorCQkJCS8vIGNvbXBhcmUgcmVhbCBmcmFtZSBzaXplIGFuZCBQRE8gc2l6ZT8KKwkJCQlpZiAoKCh1bnNpZ25lZAorCQkJCSAgICAgIGludCkoQW1pR2V0V29yZEZyb21MZSgmcEZyYW1lLT5tX0RhdGEuCisJCQkJCQkJICAgIG1fUHJlcy5tX2xlX3dTaXplKSArCisJCQkJCSAgIDI0KQorCQkJCSAgICAgPiBGcmFtZUluZm8ubV91aUZyYW1lU2l6ZSkKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJCQkJICAgIHx8CisJCQkJICAgIChBbWlHZXRXb3JkRnJvbUxlCisJCQkJICAgICAoJnBGcmFtZS0+bV9EYXRhLm1fUHJlcy5tX2xlX3dTaXplKSA+CisJCQkJICAgICBwSW50Tm9kZUluZm8tPm1fd1ByZXNQYXlsb2FkTGltaXQpCisjZW5kaWYKKwkJCQkgICAgKSB7CS8vIGZvcm1hdCBlcnJvcgorCQkJCQl0RXBsRXJyb3JIYW5kbGVya0V2ZW50IERsbEV2ZW50OworCisJCQkJCURsbEV2ZW50Lm1fdWxEbGxFcnJvckV2ZW50cyA9CisJCQkJCSAgICBFUExfRExMX0VSUl9JTlZBTElEX0ZPUk1BVDsKKwkJCQkJRGxsRXZlbnQubV91aU5vZGVJZCA9IHVpTm9kZUlkOworCQkJCQlEbGxFdmVudC5tX05tdFN0YXRlID0gTm10U3RhdGU7CisJCQkJCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua0Vycms7CisJCQkJCUV2ZW50Lm1fRXZlbnRUeXBlID0KKwkJCQkJICAgIGtFcGxFdmVudFR5cGVEbGxFcnJvcjsKKwkJCQkJRXZlbnQubV9OZXRUaW1lID0gRnJhbWVJbmZvLm1fTmV0VGltZTsKKwkJCQkJRXZlbnQubV91aVNpemUgPSBzaXplb2YoRGxsRXZlbnQpOworCQkJCQlFdmVudC5tX3BBcmcgPSAmRGxsRXZlbnQ7CisJCQkJCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmICgoTm10U3RhdGUgIT0ga0VwbE5tdENzT3BlcmF0aW9uYWwpCisJCQkJICAgICYmIChObXRTdGF0ZSAhPSBrRXBsTm10TXNPcGVyYXRpb25hbCkpIHsKKwkJCQkJLy8gcmVzZXQgUkQgZmxhZyBhbmQgYWxsIG90aGVyIGZsYWdzLCBidXQgdGhhdCBkb2VzIG5vdCBtYXR0ZXIsIGJlY2F1c2UgdGhleSB3ZXJlIHByb2Nlc3NlZCBhYm92ZQorCQkJCQlBbWlTZXRCeXRlVG9MZSgmcEZyYW1lLT5tX0RhdGEubV9QcmVzLgorCQkJCQkJICAgICAgIG1fbGVfYkZsYWcxLCAwKTsKKwkJCQl9CisJCQkJUmV0ID0gRXBsUGRva0NiUGRvUmVjZWl2ZWQoJkZyYW1lSW5mbyk7CisJCQl9CisjZW5kaWYKKworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE1zZ1R5cGVTb2M6CisJCXsKKwkJCS8vIFNvQyBmcmFtZQorCQkJTm10RXZlbnQgPSBrRXBsTm10RXZlbnREbGxDZVNvYzsKKworCQkJaWYgKE5tdFN0YXRlID49IGtFcGxObXRNc05vdEFjdGl2ZSkgewkvLyBNTiBpcyBhY3RpdmUgLT4gd3JvbmcgbXNnIHR5cGUKKwkJCQlicmVhazsKKwkJCX0KKyNpZiBFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfU09DICE9IEZBTFNFCisJCQkvLyBwb3N0IFBSZXMgdG8gdHJhbnNtaXQgRklGTyBvZiB0aGUgZXRoZXJuZXQgY29udHJvbGxlciwgYnV0IGRvbid0IHN0YXJ0CisJCQkvLyB0cmFuc21pc3Npb24gb3ZlciBidXMKKwkJCXBUeEJ1ZmZlciA9CisJCQkgICAgJkVwbERsbGtJbnN0YW5jZV9nLgorCQkJICAgIG1fcFR4QnVmZmVyW0VQTF9ETExLX1RYRlJBTUVfUFJFU107CisJCQkvLyBEb2VzIFBSZXMgZXhpc3Q/CisJCQlpZiAocFR4QnVmZmVyLT5tX3BiQnVmZmVyICE9IE5VTEwpIHsJLy8gUFJlcyBkb2VzIGV4aXN0CisJCQkJcFR4RnJhbWUgPSAodEVwbEZyYW1lICopIHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlcjsKKwkJCQkvLyB1cGRhdGUgZnJhbWUgKE5NVCBzdGF0ZSwgUkQsIFJTLCBQUiwgTVMsIEVOIGZsYWdzKQorCQkJCWlmIChObXRTdGF0ZSA8IGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMikgewkvLyBOTVQgc3RhdGUgaXMgbm90IFByZU9wMiwgUmVhZHlUb09wIG9yIE9wCisJCQkJCS8vIGZha2UgTk1UIHN0YXRlIFByZU9wMiwgYmVjYXVzZSBQUmVzIHdpbGwgYmUgc2VudCBvbmx5IGluIFByZU9wMiBvciBncmVhdGVyCisJCQkJCU5tdFN0YXRlID0ga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwyOworCQkJCX0KKwkJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1ByZXMuCisJCQkJCSAgICAgICBtX2xlX2JObXRTdGF0dXMsCisJCQkJCSAgICAgICAoQllURSkgTm10U3RhdGUpOworCQkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fUHJlcy4KKwkJCQkJICAgICAgIG1fbGVfYkZsYWcyLAorCQkJCQkgICAgICAgRXBsRGxsa0luc3RhbmNlX2cubV9iRmxhZzIpOworCQkJCWlmIChObXRTdGF0ZSAhPSBrRXBsTm10Q3NPcGVyYXRpb25hbCkgewkvLyBtYXJrIFBETyBhcyBpbnZhbGlkIGluIE5NVCBzdGF0ZSBPcAorCQkJCQkvLyAkJCQgcmVzZXQgb25seSBSRCBmbGFnOyBzZXQgb3RoZXIgZmxhZ3MgYXBwcm9wcmlhdGVseQorCQkJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1ByZXMuCisJCQkJCQkgICAgICAgbV9sZV9iRmxhZzEsIDApOworCQkJCX0KKwkJCQkvLyAkJCQgbWFrZSBmdW5jdGlvbiB0aGF0IHVwZGF0ZXMgUHJlcywgU3RhdHVzUmVzCisJCQkJLy8gbWFyayBQUmVzIGZyYW1lIGFzIHJlYWR5IGZvciB0cmFuc21pc3Npb24KKwkJCQlSZXQgPSBFZHJ2VHhNc2dSZWFkeShwVHhCdWZmZXIpOworCQkJfQorI2VuZGlmCisKKwkJCWlmIChObXRTdGF0ZSA+PSBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDIpIHsJLy8gU29DIGZyYW1lcyBvbmx5IGluIFByZU9wMiwgUmVhZHlUb09wIGFuZCBPcAorCQkJCS8vIHRyaWdnZXIgc3luY2hyb25vdXMgdGFzaworCQkJCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua1N5bmM7CisJCQkJRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlU3luYzsKKwkJCQlFdmVudC5tX3VpU2l6ZSA9IDA7CisJCQkJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworCisJCQkJLy8gdXBkYXRlIGN5Y2xlIGNvdW50ZXIKKwkJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9EbGxDb25maWdQYXJhbS5tX3VpTXVsdGlwbEN5Y2xlQ250ID4gMCkgewkvLyBtdWx0aXBsZXhlZCBjeWNsZSBhY3RpdmUKKwkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV91aUN5Y2xlQ291bnQgPQorCQkJCQkgICAgKEVwbERsbGtJbnN0YW5jZV9nLm1fdWlDeWNsZUNvdW50ICsKKwkJCQkJICAgICAxKSAlCisJCQkJCSAgICBFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbENvbmZpZ1BhcmFtLgorCQkJCQkgICAgbV91aU11bHRpcGxDeWNsZUNudDsKKwkJCQl9CisJCQl9CisJCQkvLyByZXByb2dyYW0gdGltZXIKKyNpZiBFUExfVElNRVJfVVNFX0hJR0hSRVMgIT0gRkFMU0UKKwkJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX3VsbEZyYW1lVGltZW91dCAhPSAwKSB7CisJCQkJUmV0ID0KKwkJCQkgICAgRXBsVGltZXJIaWdoUmVza01vZGlmeVRpbWVyTnMKKwkJCQkgICAgKCZFcGxEbGxrSW5zdGFuY2VfZy5tX1RpbWVySGRsQ3ljbGUsCisJCQkJICAgICBFcGxEbGxrSW5zdGFuY2VfZy5tX3VsbEZyYW1lVGltZW91dCwKKwkJCQkgICAgIEVwbERsbGtDYkNuVGltZXIsIDBMLCBGQUxTRSk7CisJCQl9CisjZW5kaWYKKworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE1zZ1R5cGVTb2E6CisJCXsKKwkJCS8vIFNvQSBmcmFtZQorCQkJTm10RXZlbnQgPSBrRXBsTm10RXZlbnREbGxDZVNvYTsKKworCQkJaWYgKE5tdFN0YXRlID49IGtFcGxObXRNc05vdEFjdGl2ZSkgewkvLyBNTiBpcyBhY3RpdmUgLT4gd3JvbmcgbXNnIHR5cGUKKwkJCQlicmVhazsKKwkJCX0KKworCQkJcFR4RnJhbWUgPSBOVUxMOworCisJCQlpZiAoKE5tdFN0YXRlICYgRVBMX05NVF9TVVBFUlNUQVRFX01BU0spICE9IEVQTF9OTVRfQ1NfRVBMTU9ERSkgewkvLyBkbyBub3QgcmVzcG9uZCwgaWYgTk1UIHN0YXRlIGlzIDwgUHJlT3AxIChpLmUuIG5vdCBFUExfTU9ERSkKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8vIGNoZWNrIFRhcmdldE5vZGVJZAorCQkJdWlOb2RlSWQgPQorCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUoJnBGcmFtZS0+bV9EYXRhLm1fU29hLgorCQkJCQkgICAgIG1fbGVfYlJlcVNlcnZpY2VUYXJnZXQpOworCQkJaWYgKHVpTm9kZUlkID09IEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0ubV91aU5vZGVJZCkgewkvLyBsb2NhbCBub2RlIGlzIHRoZSB0YXJnZXQgb2YgdGhlIGN1cnJlbnQgcmVxdWVzdAorCisJCQkJLy8gY2hlY2sgU2VydmljZUlkCisJCQkJUmVxU2VydmljZUlkID0KKwkJCQkgICAgKHRFcGxEbGxSZXFTZXJ2aWNlSWQpCisJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUoJnBGcmFtZS0+bV9EYXRhLm1fU29hLgorCQkJCQkJICAgICBtX2xlX2JSZXFTZXJ2aWNlSWQpOworCQkJCWlmIChSZXFTZXJ2aWNlSWQgPT0ga0VwbERsbFJlcVNlcnZpY2VTdGF0dXMpIHsJLy8gU3RhdHVzUmVxdWVzdAorCQkJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9TVEFUVVNSRVNdLm1fcGJCdWZmZXIgIT0gTlVMTCkgewkvLyBTdGF0dXNSZXMgZG9lcyBleGlzdAorCisJCQkJCQlwVHhGcmFtZSA9CisJCQkJCQkgICAgKHRFcGxGcmFtZSAqKQorCQkJCQkJICAgIEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fcFR4QnVmZmVyCisJCQkJCQkgICAgW0VQTF9ETExLX1RYRlJBTUVfU1RBVFVTUkVTXS4KKwkJCQkJCSAgICBtX3BiQnVmZmVyOworCQkJCQkJLy8gdXBkYXRlIFN0YXR1c1JlcyBmcmFtZSAoTk1UIHN0YXRlLCBFTiwgRUMsIFJTLCBQUiBmbGFncykKKwkJCQkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+CisJCQkJCQkJICAgICAgIG1fRGF0YS5tX0FzbmQuCisJCQkJCQkJICAgICAgIG1fUGF5bG9hZC4KKwkJCQkJCQkgICAgICAgbV9TdGF0dXNSZXNwb25zZS4KKwkJCQkJCQkgICAgICAgbV9sZV9iTm10U3RhdHVzLAorCQkJCQkJCSAgICAgICAoQllURSkgTm10U3RhdGUpOworCQkJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT4KKwkJCQkJCQkgICAgICAgbV9EYXRhLm1fQXNuZC4KKwkJCQkJCQkgICAgICAgbV9QYXlsb2FkLgorCQkJCQkJCSAgICAgICBtX1N0YXR1c1Jlc3BvbnNlLgorCQkJCQkJCSAgICAgICBtX2xlX2JGbGFnMSwKKwkJCQkJCQkgICAgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkJICAgICAgIG1fYkZsYWcxKTsKKwkJCQkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+CisJCQkJCQkJICAgICAgIG1fRGF0YS5tX0FzbmQuCisJCQkJCQkJICAgICAgIG1fUGF5bG9hZC4KKwkJCQkJCQkgICAgICAgbV9TdGF0dXNSZXNwb25zZS4KKwkJCQkJCQkgICAgICAgbV9sZV9iRmxhZzIsCisJCQkJCQkJICAgICAgIEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJCSAgICAgICBtX2JGbGFnMik7CisJCQkJCQkvLyBzZW5kIFN0YXR1c1JlcworCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFZHJ2U2VuZFR4TXNnCisJCQkJCQkgICAgKCZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgbV9wVHhCdWZmZXIKKwkJCQkJCSAgICAgW0VQTF9ETExLX1RYRlJBTUVfU1RBVFVTUkVTXSk7CisJCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJZ290byBFeGl0OworCQkJCQkJfQorCQkJCQkJVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoOCk7CisKKwkJCQkJCS8vIHVwZGF0ZSBlcnJvciBzaWduYWxpbmcKKwkJCQkJCWJGbGFnMSA9CisJCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT4KKwkJCQkJCQkJICAgICBtX0RhdGEuCisJCQkJCQkJCSAgICAgbV9Tb2EuCisJCQkJCQkJCSAgICAgbV9sZV9iRmxhZzEpOworCQkJCQkJaWYgKCgoYkZsYWcxIF4gRXBsRGxsa0luc3RhbmNlX2cubV9iTW5GbGFnMSkgJiBFUExfRlJBTUVfRkxBRzFfRVIpICE9IDApIHsJLy8gZXhjZXB0aW9uIHJlc2V0IGZsYWcgd2FzIGNoYW5nZWQgYnkgTU4KKwkJCQkJCQkvLyBhc3N1bWUgc2FtZSBzdGF0ZSBmb3IgRUMgaW4gbmV4dCBjeWNsZSAoY2xlYXIgYWxsIG90aGVyIGJpdHMpCisJCQkJCQkJaWYgKChiRmxhZzEgJgorCQkJCQkJCSAgICAgRVBMX0ZSQU1FX0ZMQUcxX0VSKQorCQkJCQkJCSAgICAhPSAwKSB7CisJCQkJCQkJCS8vIHNldCBFQyBhbmQgcmVzZXQgcmVzdAorCQkJCQkJCQlFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCQkJICAgIG1fYkZsYWcxID0KKwkJCQkJCQkJICAgIEVQTF9GUkFNRV9GTEFHMV9FQzsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkvLyByZXNldCBjb21wbGV0ZSBmbGFnIDEgKGluY2x1ZGluZyBFQyBhbmQgRU4pCisJCQkJCQkJCUVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJCQkgICAgbV9iRmxhZzEgPQorCQkJCQkJCQkgICAgMDsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQkvLyBzYXZlIGZsYWcgMSBmcm9tIE1OIGZvciBTdGF0dXMgcmVxdWVzdCByZXNwb25zZSBjeWNsZQorCQkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9iTW5GbGFnMSA9CisJCQkJCQkgICAgYkZsYWcxOworCQkJCQl9CisJCQkJfSBlbHNlIGlmIChSZXFTZXJ2aWNlSWQgPT0ga0VwbERsbFJlcVNlcnZpY2VJZGVudCkgewkvLyBJZGVudFJlcXVlc3QKKwkJCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyW0VQTF9ETExLX1RYRlJBTUVfSURFTlRSRVNdLm1fcGJCdWZmZXIgIT0gTlVMTCkgewkvLyBJZGVudFJlcyBkb2VzIGV4aXN0CisJCQkJCQlwVHhGcmFtZSA9CisJCQkJCQkgICAgKHRFcGxGcmFtZSAqKQorCQkJCQkJICAgIEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fcFR4QnVmZmVyCisJCQkJCQkgICAgW0VQTF9ETExLX1RYRlJBTUVfSURFTlRSRVNdLgorCQkJCQkJICAgIG1fcGJCdWZmZXI7CisJCQkJCQkvLyB1cGRhdGUgSWRlbnRSZXMgZnJhbWUgKE5NVCBzdGF0ZSwgUlMsIFBSIGZsYWdzKQorCQkJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT4KKwkJCQkJCQkgICAgICAgbV9EYXRhLm1fQXNuZC4KKwkJCQkJCQkgICAgICAgbV9QYXlsb2FkLgorCQkJCQkJCSAgICAgICBtX0lkZW50UmVzcG9uc2UuCisJCQkJCQkJICAgICAgIG1fbGVfYk5tdFN0YXR1cywKKwkJCQkJCQkgICAgICAgKEJZVEUpIE5tdFN0YXRlKTsKKwkJCQkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+CisJCQkJCQkJICAgICAgIG1fRGF0YS5tX0FzbmQuCisJCQkJCQkJICAgICAgIG1fUGF5bG9hZC4KKwkJCQkJCQkgICAgICAgbV9JZGVudFJlc3BvbnNlLgorCQkJCQkJCSAgICAgICBtX2xlX2JGbGFnMiwKKwkJCQkJCQkgICAgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkJICAgICAgIG1fYkZsYWcyKTsKKwkJCQkJCS8vIHNlbmQgSWRlbnRSZXMKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRWRydlNlbmRUeE1zZworCQkJCQkJICAgICgmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgIG1fcFR4QnVmZmVyCisJCQkJCQkgICAgIFtFUExfRExMS19UWEZSQU1FX0lERU5UUkVTXSk7CisJCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJZ290byBFeGl0OworCQkJCQkJfQorCQkJCQkJVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoNyk7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKFJlcVNlcnZpY2VJZCA9PSBrRXBsRGxsUmVxU2VydmljZU5tdFJlcXVlc3QpIHsJLy8gTm10UmVxdWVzdAorCQkJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9OTVRSRVFdLm1fcGJCdWZmZXIgIT0gTlVMTCkgewkvLyBObXRSZXF1ZXN0IGRvZXMgZXhpc3QKKwkJCQkJCS8vIGNoZWNrIGlmIGZyYW1lIGlzIG5vdCBlbXB0eSBhbmQgbm90IGJlaW5nIGZpbGxlZAorCQkJCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fcFR4QnVmZmVyCisJCQkJCQkgICAgW0VQTF9ETExLX1RYRlJBTUVfTk1UUkVRXS4KKwkJCQkJCSAgICBtX3VpVHhNc2dMZW4gPgorCQkJCQkJICAgIEVQTF9ETExLX0JVRkxFTl9GSUxMSU5HKSB7CisJCQkJCQkJLyppZiAoRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9OTVRSRVFdLm1fdWlUeE1zZ0xlbiA8IEVQTF9ETExLX0JVRkxFTl9NSU4pCisJCQkJCQkJICAgeyAgIC8vIHBhZCBmcmFtZQorCQkJCQkJCSAgIEVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyW0VQTF9ETExLX1RYRlJBTUVfTk1UUkVRXS5tX3VpVHhNc2dMZW4gPSBFUExfRExMS19CVUZMRU5fTUlOOworCQkJCQkJCSAgIH0gKi8KKwkJCQkJCQkvLyBtZW1vcml6ZSB0cmFuc21pc3Npb24KKwkJCQkJCQlwVHhGcmFtZSA9CisJCQkJCQkJICAgICh0RXBsRnJhbWUgKikgMTsKKwkJCQkJCQkvLyBzZW5kIE5tdFJlcXVlc3QKKwkJCQkJCQlSZXQgPQorCQkJCQkJCSAgICBFZHJ2U2VuZFR4TXNnCisJCQkJCQkJICAgICgmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkJICAgICBtX3BUeEJ1ZmZlcgorCQkJCQkJCSAgICAgW0VQTF9ETExLX1RYRlJBTUVfTk1UUkVRXSk7CisJCQkJCQkJaWYgKFJldCAhPQorCQkJCQkJCSAgICBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQkJfQorCisJCQkJCQl9CisJCQkJCX0KKworCQkJCX0gZWxzZSBpZiAoUmVxU2VydmljZUlkID09IGtFcGxEbGxSZXFTZXJ2aWNlVW5zcGVjaWZpZWQpIHsJLy8gdW5zcGVjaWZpZWQgaW52aXRlCisJCQkJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX05PTkVQTF0ubV9wYkJ1ZmZlciAhPSBOVUxMKSB7CS8vIG5vbi1FUEwgZnJhbWUgZG9lcyBleGlzdAorCQkJCQkJLy8gY2hlY2sgaWYgZnJhbWUgaXMgbm90IGVtcHR5IGFuZCBub3QgYmVpbmcgZmlsbGVkCisJCQkJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgbV9wVHhCdWZmZXIKKwkJCQkJCSAgICBbRVBMX0RMTEtfVFhGUkFNRV9OT05FUExdLgorCQkJCQkJICAgIG1fdWlUeE1zZ0xlbiA+CisJCQkJCQkgICAgRVBMX0RMTEtfQlVGTEVOX0ZJTExJTkcpIHsKKwkJCQkJCQkvKmlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX05NVFJFUV0ubV91aVR4TXNnTGVuIDwgRVBMX0RMTEtfQlVGTEVOX01JTikKKwkJCQkJCQkgICB7ICAgLy8gcGFkIGZyYW1lCisJCQkJCQkJICAgRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9OTVRSRVFdLm1fdWlUeE1zZ0xlbiA9IEVQTF9ETExLX0JVRkxFTl9NSU47CisJCQkJCQkJICAgfSAqLworCQkJCQkJCS8vIG1lbW9yaXplIHRyYW5zbWlzc2lvbgorCQkJCQkJCXBUeEZyYW1lID0KKwkJCQkJCQkgICAgKHRFcGxGcmFtZSAqKSAxOworCQkJCQkJCS8vIHNlbmQgbm9uLUVQTCBmcmFtZQorCQkJCQkJCVJldCA9CisJCQkJCQkJICAgIEVkcnZTZW5kVHhNc2cKKwkJCQkJCQkgICAgKCZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCQkgICAgIG1fcFR4QnVmZmVyCisJCQkJCQkJICAgICBbRVBMX0RMTEtfVFhGUkFNRV9OT05FUExdKTsKKwkJCQkJCQlpZiAoUmV0ICE9CisJCQkJCQkJICAgIGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCQl9CisKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJfSBlbHNlIGlmIChSZXFTZXJ2aWNlSWQgPT0ga0VwbERsbFJlcVNlcnZpY2VObykgewkvLyBubyBhc3luYyBzZXJ2aWNlIHJlcXVlc3RlZCAtPiBkbyBub3RoaW5nCisJCQkJfQorCQkJfQorI2lmIEVQTF9ETExfUFJFU19SRUFEWV9BRlRFUl9TT0EgIT0gRkFMU0UKKwkJCWlmIChwVHhGcmFtZSA9PSBOVUxMKSB7CS8vIHNpZ25hbCBwcm9jZXNzIGZ1bmN0aW9uIHJlYWRpbmVzcyBvZiBQUmVzIGZyYW1lCisJCQkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rRGxsazsKKwkJCQlFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVEbGxrUHJlc1JlYWR5OworCQkJCUV2ZW50Lm1fdWlTaXplID0gMDsKKwkJCQlFdmVudC5tX3BBcmcgPSBOVUxMOworCQkJCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKwkJCX0KKyNlbmRpZgorCisJCQkvLyBpbmZvcm0gUERPIG1vZHVsZQorI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfUERPSykpICE9IDApCisvLyAgICAgICAgICAgIFJldCA9IEVwbFBkb2tDYlNvYSgmRnJhbWVJbmZvKTsKKyNlbmRpZgorCisJCQkvLyAkJCQgcHV0IFNyY05vZGVJZCwgTk1UIHN0YXRlIGFuZCBOZXRUaW1lIGFzIEhlYXJ0YmVhdEV2ZW50IGludG8gZXZlbnRxdWV1ZQorCisJCQkvLyAkJCQgaW5mb3JtIGVtZXJnZW5jeSBwcm90b2NvbCBoYW5kbGluZyBhYm91dCBmbGFncworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE1zZ1R5cGVBc25kOgorCQl7CisJCQkvLyBBU25kIGZyYW1lCisJCQlObXRFdmVudCA9IGtFcGxObXRFdmVudERsbENlQXNuZDsKKworCQkJLy8gQVNuZCBzZXJ2aWNlIHJlZ2lzdGVyZWQ/CisJCQl1aUFzbmRTZXJ2aWNlSWQgPQorCQkJICAgICh1bnNpZ25lZCBpbnQpQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT5tX0RhdGEuCisJCQkJCQkJICAgbV9Bc25kLgorCQkJCQkJCSAgIG1fbGVfYlNlcnZpY2VJZCk7CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJCQlpZiAoKEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsU3RhdGUgPj0ga0VwbERsbE1zTm9uQ3ljbGljKQorCQkJICAgICYmCisJCQkgICAgKCgoKHRFcGxEbGxBc25kU2VydmljZUlkKSB1aUFzbmRTZXJ2aWNlSWQpID09CisJCQkgICAgICBrRXBsRGxsQXNuZFN0YXR1c1Jlc3BvbnNlKQorCQkJICAgICB8fCAoKCh0RXBsRGxsQXNuZFNlcnZpY2VJZCkgdWlBc25kU2VydmljZUlkKSA9PSBrRXBsRGxsQXNuZElkZW50UmVzcG9uc2UpKSkgewkvLyBTdGF0dXNSZXMgb3IgSWRlbnRSZXMgcmVjZWl2ZWQKKwkJCQl1aU5vZGVJZCA9CisJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUoJnBGcmFtZS0+bV9sZV9iU3JjTm9kZUlkKTsKKwkJCQlpZiAoKEVwbERsbGtJbnN0YW5jZV9nLm1fTGFzdFJlcVNlcnZpY2VJZCA9PQorCQkJCSAgICAgKCh0RXBsRGxsUmVxU2VydmljZUlkKSB1aUFzbmRTZXJ2aWNlSWQpKQorCQkJCSAgICAmJiAodWlOb2RlSWQgPT0gRXBsRGxsa0luc3RhbmNlX2cubV91aUxhc3RUYXJnZXROb2RlSWQpKSB7CS8vIG1hcmsgcmVxdWVzdCBhcyByZXNwb25kZWQKKwkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9MYXN0UmVxU2VydmljZUlkID0KKwkJCQkJICAgIGtFcGxEbGxSZXFTZXJ2aWNlTm87CisJCQkJfQorCQkJCWlmICgoKHRFcGxEbGxBc25kU2VydmljZUlkKSB1aUFzbmRTZXJ2aWNlSWQpID09IGtFcGxEbGxBc25kSWRlbnRSZXNwb25zZSkgewkvLyBtZW1vcml6ZSBNQUMgYWRkcmVzcyBvZiBDTiBmb3IgUFJlcQorCQkJCQl0RXBsRGxsa05vZGVJbmZvICpwSW50Tm9kZUluZm87CisKKwkJCQkJcEludE5vZGVJbmZvID0KKwkJCQkJICAgIEVwbERsbGtHZXROb2RlSW5mbyh1aU5vZGVJZCk7CisJCQkJCWlmIChwSW50Tm9kZUluZm8gPT0gTlVMTCkgewkvLyBubyBub2RlIGluZm8gc3RydWN0dXJlIGF2YWlsYWJsZQorCQkJCQkJUmV0ID0ga0VwbERsbE5vTm9kZUluZm87CisJCQkJCX0gZWxzZSB7CisJCQkJCQlFUExfTUVNQ1BZKHBJbnROb2RlSW5mby0+CisJCQkJCQkJICAgbV9iZV9hYk1hY0FkZHIsCisJCQkJCQkJICAgcEZyYW1lLT4KKwkJCQkJCQkgICBtX2JlX2FiU3JjTWFjLCA2KTsKKwkJCQkJfQorCQkJCX0KKwkJCQkvLyBmb3J3YXJkIEZsYWcyIHRvIGFzeW5jaHJvbm91cyBzY2hlZHVsZXIKKwkJCQliRmxhZzEgPQorCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWUtPm1fRGF0YS5tX0FzbmQuCisJCQkJCQkgICAgIG1fUGF5bG9hZC5tX1N0YXR1c1Jlc3BvbnNlLgorCQkJCQkJICAgICBtX2xlX2JGbGFnMik7CisJCQkJUmV0ID0KKwkJCQkgICAgRXBsRGxsa0NhbEFzeW5jU2V0UGVuZGluZ1JlcXVlc3RzKHVpTm9kZUlkLAorCQkJCQkJCQkgICAgICAoKHRFcGxEbGxBc3luY1JlcVByaW9yaXR5KSAoKGJGbGFnMSAmIEVQTF9GUkFNRV9GTEFHMl9QUikgPj4gRVBMX0ZSQU1FX0ZMQUcyX1BSX1NISUZUKSksIChiRmxhZzEgJiBFUExfRlJBTUVfRkxBRzJfUlMpKTsKKwkJCX0KKyNlbmRpZgorCisJCQlpZiAodWlBc25kU2VydmljZUlkIDwgRVBMX0RMTF9NQVhfQVNORF9TRVJWSUNFX0lEKSB7CS8vIEFTbmQgc2VydmljZSBJRCBpcyB2YWxpZAorCQkJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX2FBc25kRmlsdGVyW3VpQXNuZFNlcnZpY2VJZF0gPT0ga0VwbERsbEFzbmRGaWx0ZXJBbnkpIHsJLy8gQVNuZCBzZXJ2aWNlIElEIGlzIHJlZ2lzdGVyZWQKKwkJCQkJLy8gZm9yd2FyZCBmcmFtZSB2aWEgYXN5bmMgcmVjZWl2ZSBGSUZPIHRvIHVzZXJzcGFjZQorCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsRGxsa0NhbEFzeW5jRnJhbWVSZWNlaXZlZAorCQkJCQkgICAgKCZGcmFtZUluZm8pOworCQkJCX0gZWxzZSBpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9hQXNuZEZpbHRlclt1aUFzbmRTZXJ2aWNlSWRdID09IGtFcGxEbGxBc25kRmlsdGVyTG9jYWwpIHsJLy8gQVNuZCBzZXJ2aWNlIElEIGlzIHJlZ2lzdGVyZWQsIGJ1dCBvbmx5IGxvY2FsIG5vZGUgSUQgb3IgYnJvYWRjYXN0cworCQkJCQkvLyBzaGFsbCBiZSBmb3J3YXJkZWQKKwkJCQkJdWlOb2RlSWQgPQorCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT4KKwkJCQkJCQkgICAgIG1fbGVfYkRzdE5vZGVJZCk7CisJCQkJCWlmICgodWlOb2RlSWQgPT0KKwkJCQkJICAgICBFcGxEbGxrSW5zdGFuY2VfZy5tX0RsbENvbmZpZ1BhcmFtLgorCQkJCQkgICAgIG1fdWlOb2RlSWQpCisJCQkJCSAgICB8fCAodWlOb2RlSWQgPT0gRVBMX0NfQURSX0JST0FEQ0FTVCkpIHsJLy8gQVNuZCBmcmFtZSBpcyBpbnRlbmRlZCBmb3IgdXMKKwkJCQkJCS8vIGZvcndhcmQgZnJhbWUgdmlhIGFzeW5jIHJlY2VpdmUgRklGTyB0byB1c2Vyc3BhY2UKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsRGxsa0NhbEFzeW5jRnJhbWVSZWNlaXZlZAorCQkJCQkJICAgICgmRnJhbWVJbmZvKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQl7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChObXRFdmVudCAhPSBrRXBsTm10RXZlbnROb0V2ZW50KSB7CS8vIGV2ZW50IGZvciBETEwgYW5kIE5NVCBzdGF0ZSBtYWNoaW5lIGdlbmVyYXRlZAorCQlSZXQgPSBFcGxEbGxrQ2hhbmdlU3RhdGUoTm10RXZlbnQsIE5tdFN0YXRlKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisKKwkJaWYgKChObXRFdmVudCAhPSBrRXBsTm10RXZlbnREbGxDZUFzbmQpCisJCSAgICAmJiAoKE5tdFN0YXRlIDw9IGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMSkgfHwgKE5tdEV2ZW50ICE9IGtFcGxObXRFdmVudERsbENlUHJlcykpKSB7CS8vIE5NVCBzdGF0ZSBtYWNoaW5lIGlzIG5vdCBpbnRlcmVzdGVkIGluIEFTbmQgZnJhbWVzIGFuZCBQUmVzIGZyYW1lcyB3aGVuIG5vdCBDc05vdEFjdGl2ZSBvciBDc1ByZU9wMQorCQkJLy8gaW5mb3JtIE5NVCBtb2R1bGUKKwkJCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua05tdGs7CisJCQlFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVObXRFdmVudDsKKwkJCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKE5tdEV2ZW50KTsKKwkJCUV2ZW50Lm1fcEFyZyA9ICZObXRFdmVudDsKKwkJCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKwkJfQorCX0KKworICAgICAgRXhpdDoKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCURXT1JEIGR3QXJnOworCisJCUJFTkNITUFSS19NT0RfMDJfVE9HR0xFKDkpOworCisJCWR3QXJnID0gRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSB8IChObXRFdmVudCA8PCA4KTsKKworCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCisJCVJldCA9IEVwbEV2ZW50a1Bvc3RFcnJvcihrRXBsRXZlbnRTb3VyY2VEbGxrLAorCQkJCQkgUmV0LCBzaXplb2YoZHdBcmcpLCAmZHdBcmcpOworCX0KKwlCRU5DSE1BUktfTU9EXzAyX1JFU0VUKDMpOworCXJldHVybjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0NiRnJhbWVUcmFuc21pdHRlZCgpCisvLworLy8gRGVzY3JpcHRpb246IGNhbGxlZCBmcm9tIEVkcnZJbnRlcnJ1cHRIYW5kbGVyKCkuCisvLyAgICAgICAgICAgICAgSXQgc2lnbmFscworLy8KKy8vIFBhcmFtZXRlcnM6ICBwUnhCdWZmZXJfcCAgICAgICAgICAgICA9IHJlY2VpdmUgYnVmZmVyIHN0cnVjdHVyZQorLy8KKy8vIFJldHVybnM6ICAgICAobm9uZSkKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgRXBsRGxsa0NiRnJhbWVUcmFuc21pdHRlZCh0RWRydlR4QnVmZmVyICogcFR4QnVmZmVyX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsRXZlbnQgRXZlbnQ7CisJdEVwbERsbEFzeW5jUmVxUHJpb3JpdHkgUHJpb3JpdHk7CisJdEVwbE5tdFN0YXRlIE5tdFN0YXRlOworCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkgXAorICAgICYmIChFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfU09DID09IEZBTFNFKQorCXRFcGxGcmFtZUluZm8gRnJhbWVJbmZvOworI2VuZGlmCisKKwlObXRTdGF0ZSA9IEVwbE5tdGtHZXRObXRTdGF0ZSgpOworCisJaWYgKE5tdFN0YXRlIDw9IGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbikgeworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKChwVHhCdWZmZXJfcCAtIEVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyKSA9PSBFUExfRExMS19UWEZSQU1FX05NVFJFUSkgewkvLyBmcmFtZSBmcm9tIE5NVCByZXF1ZXN0IEZJRk8gc2VudAorCQkvLyBtYXJrIFR4LWJ1ZmZlciBhcyBlbXB0eQorCQlwVHhCdWZmZXJfcC0+bV91aVR4TXNnTGVuID0gRVBMX0RMTEtfQlVGTEVOX0VNUFRZOworCisJCS8vIHBvc3QgZXZlbnQgdG8gRExMCisJCVByaW9yaXR5ID0ga0VwbERsbEFzeW5jUmVxUHJpb05tdDsKKwkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rRGxsazsKKwkJRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlRGxsa0ZpbGxUeDsKKwkJRVBMX01FTVNFVCgmRXZlbnQubV9OZXRUaW1lLCAweDAwLCBzaXplb2YoRXZlbnQubV9OZXRUaW1lKSk7CisJCUV2ZW50Lm1fcEFyZyA9ICZQcmlvcml0eTsKKwkJRXZlbnQubV91aVNpemUgPSBzaXplb2YoUHJpb3JpdHkpOworCQlSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisJfSBlbHNlIGlmICgocFR4QnVmZmVyX3AgLSBFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlcikgPT0gRVBMX0RMTEtfVFhGUkFNRV9OT05FUEwpIHsJLy8gZnJhbWUgZnJvbSBnZW5lcmljIHByaW9yaXR5IEZJRk8gc2VudAorCQkvLyBtYXJrIFR4LWJ1ZmZlciBhcyBlbXB0eQorCQlwVHhCdWZmZXJfcC0+bV91aVR4TXNnTGVuID0gRVBMX0RMTEtfQlVGTEVOX0VNUFRZOworCisJCS8vIHBvc3QgZXZlbnQgdG8gRExMCisJCVByaW9yaXR5ID0ga0VwbERsbEFzeW5jUmVxUHJpb0dlbmVyaWM7CisJCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua0RsbGs7CisJCUV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZURsbGtGaWxsVHg7CisJCUVQTF9NRU1TRVQoJkV2ZW50Lm1fTmV0VGltZSwgMHgwMCwgc2l6ZW9mKEV2ZW50Lm1fTmV0VGltZSkpOworCQlFdmVudC5tX3BBcmcgPSAmUHJpb3JpdHk7CisJCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKFByaW9yaXR5KTsKKwkJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworCX0KKyNpZiAoKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkgXAorICAgICYmIChFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfU09DID09IEZBTFNFKSkgXAorICAgIHx8ICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwllbHNlIGlmICgocFR4QnVmZmVyX3AtPm1fRXBsTXNnVHlwZSA9PSBrRXBsTXNnVHlwZVByZXEpCisJCSB8fCAocFR4QnVmZmVyX3AtPm1fRXBsTXNnVHlwZSA9PSBrRXBsTXNnVHlwZVByZXMpKSB7CS8vIFBSZXMgcmVzcC4gUFJlcSBmcmFtZSBzZW50CisKKyNpZiAoKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkgXAorICAgICAgICAgICAgJiYgKEVQTF9ETExfUFJFU19SRUFEWV9BRlRFUl9TT0MgPT0gRkFMU0UpKQorCQl7CisJCQkvLyBpbmZvcm0gUERPIG1vZHVsZQorCQkJRnJhbWVJbmZvLm1fcEZyYW1lID0KKwkJCSAgICAodEVwbEZyYW1lICopIHBUeEJ1ZmZlcl9wLT5tX3BiQnVmZmVyOworCQkJRnJhbWVJbmZvLm1fdWlGcmFtZVNpemUgPSBwVHhCdWZmZXJfcC0+bV91aU1heEJ1ZmZlckxlbjsKKwkJCVJldCA9IEVwbFBkb2tDYlBkb1RyYW5zbWl0dGVkKCZGcmFtZUluZm8pOworCQl9CisjZW5kaWYKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwkJeworCQkJLy8gaWYgb3duIFByZXMgb24gTU4sIHRyaWdnZXIgU29BCisJCQlpZiAoKE5tdFN0YXRlID49IGtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMikKKwkJCSAgICAmJiAocFR4QnVmZmVyX3AgPT0KKwkJCQkmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJbV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9QUkVTXSkpIHsKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxEbGxrQ2hhbmdlU3RhdGUoa0VwbE5tdEV2ZW50RGxsTWVTb2FUcmlnLAorCQkJCQkJICAgICAgIE5tdFN0YXRlKTsKKwkJCX0KKwkJfQorI2VuZGlmCisKKyNpZiBFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfU09BICE9IEZBTFNFCisJCWdvdG8gRXhpdDsKKyNlbmRpZgorCX0KKyNlbmRpZgorI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwllbHNlIGlmIChwVHhCdWZmZXJfcC0+bV9FcGxNc2dUeXBlID09IGtFcGxNc2dUeXBlU29hKSB7CS8vIFNvQSBmcmFtZSBzZW50CisJCXRFcGxObXRFdmVudCBObXRFdmVudCA9IGtFcGxObXRFdmVudERsbE1lU29hU2VudDsKKworCQkvLyBjaGVjayBpZiB3ZSBhcmUgaW52aXRlZAorCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV91aUxhc3RUYXJnZXROb2RlSWQgPT0KKwkJICAgIEVwbERsbGtJbnN0YW5jZV9nLm1fRGxsQ29uZmlnUGFyYW0ubV91aU5vZGVJZCkgeworCQkJdEVwbEZyYW1lICpwVHhGcmFtZTsKKworCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fTGFzdFJlcVNlcnZpY2VJZCA9PSBrRXBsRGxsUmVxU2VydmljZVN0YXR1cykgewkvLyBTdGF0dXNSZXF1ZXN0CisJCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyW0VQTF9ETExLX1RYRlJBTUVfU1RBVFVTUkVTXS5tX3BiQnVmZmVyICE9IE5VTEwpIHsJLy8gU3RhdHVzUmVzIGRvZXMgZXhpc3QKKworCQkJCQlwVHhGcmFtZSA9CisJCQkJCSAgICAodEVwbEZyYW1lICopIEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9wVHhCdWZmZXIKKwkJCQkJICAgIFtFUExfRExMS19UWEZSQU1FX1NUQVRVU1JFU10uCisJCQkJCSAgICBtX3BiQnVmZmVyOworCQkJCQkvLyB1cGRhdGUgU3RhdHVzUmVzIGZyYW1lIChOTVQgc3RhdGUsIEVOLCBFQywgUlMsIFBSIGZsYWdzKQorCQkJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX0FzbmQuCisJCQkJCQkgICAgICAgbV9QYXlsb2FkLgorCQkJCQkJICAgICAgIG1fU3RhdHVzUmVzcG9uc2UuCisJCQkJCQkgICAgICAgbV9sZV9iTm10U3RhdHVzLAorCQkJCQkJICAgICAgIChCWVRFKSBObXRTdGF0ZSk7CisJCQkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fQXNuZC4KKwkJCQkJCSAgICAgICBtX1BheWxvYWQuCisJCQkJCQkgICAgICAgbV9TdGF0dXNSZXNwb25zZS4KKwkJCQkJCSAgICAgICBtX2xlX2JGbGFnMSwKKwkJCQkJCSAgICAgICBFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgICBtX2JGbGFnMSk7CisJCQkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fQXNuZC4KKwkJCQkJCSAgICAgICBtX1BheWxvYWQuCisJCQkJCQkgICAgICAgbV9TdGF0dXNSZXNwb25zZS4KKwkJCQkJCSAgICAgICBtX2xlX2JGbGFnMiwKKwkJCQkJCSAgICAgICBFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgICBtX2JGbGFnMik7CisJCQkJCS8vIHNlbmQgU3RhdHVzUmVzCisJCQkJCVJldCA9CisJCQkJCSAgICBFZHJ2U2VuZFR4TXNnKCZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCQkgIG1fcFR4QnVmZmVyCisJCQkJCQkJICBbRVBMX0RMTEtfVFhGUkFNRV9TVEFUVVNSRVNdKTsKKwkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJZ290byBFeGl0OworCQkJCQl9CisJCQkJCVRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDgpOworCisJCQkJfQorCQkJfSBlbHNlIGlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX0xhc3RSZXFTZXJ2aWNlSWQgPT0ga0VwbERsbFJlcVNlcnZpY2VJZGVudCkgewkvLyBJZGVudFJlcXVlc3QKKwkJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9JREVOVFJFU10ubV9wYkJ1ZmZlciAhPSBOVUxMKSB7CS8vIElkZW50UmVzIGRvZXMgZXhpc3QKKwkJCQkJcFR4RnJhbWUgPQorCQkJCQkgICAgKHRFcGxGcmFtZSAqKSBFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fcFR4QnVmZmVyCisJCQkJCSAgICBbRVBMX0RMTEtfVFhGUkFNRV9JREVOVFJFU10uCisJCQkJCSAgICBtX3BiQnVmZmVyOworCQkJCQkvLyB1cGRhdGUgSWRlbnRSZXMgZnJhbWUgKE5NVCBzdGF0ZSwgUlMsIFBSIGZsYWdzKQorCQkJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX0FzbmQuCisJCQkJCQkgICAgICAgbV9QYXlsb2FkLgorCQkJCQkJICAgICAgIG1fSWRlbnRSZXNwb25zZS4KKwkJCQkJCSAgICAgICBtX2xlX2JObXRTdGF0dXMsCisJCQkJCQkgICAgICAgKEJZVEUpIE5tdFN0YXRlKTsKKwkJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Bc25kLgorCQkJCQkJICAgICAgIG1fUGF5bG9hZC4KKwkJCQkJCSAgICAgICBtX0lkZW50UmVzcG9uc2UuCisJCQkJCQkgICAgICAgbV9sZV9iRmxhZzIsCisJCQkJCQkgICAgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgICAgbV9iRmxhZzIpOworCQkJCQkvLyBzZW5kIElkZW50UmVzCisJCQkJCVJldCA9CisJCQkJCSAgICBFZHJ2U2VuZFR4TXNnKCZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCQkgIG1fcFR4QnVmZmVyCisJCQkJCQkJICBbRVBMX0RMTEtfVFhGUkFNRV9JREVOVFJFU10pOworCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCX0KKwkJCQkJVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoNyk7CisJCQkJfQorCQkJfSBlbHNlIGlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX0xhc3RSZXFTZXJ2aWNlSWQgPT0ga0VwbERsbFJlcVNlcnZpY2VObXRSZXF1ZXN0KSB7CS8vIE5tdFJlcXVlc3QKKwkJCQlpZiAoRXBsRGxsa0luc3RhbmNlX2cubV9wVHhCdWZmZXJbRVBMX0RMTEtfVFhGUkFNRV9OTVRSRVFdLm1fcGJCdWZmZXIgIT0gTlVMTCkgewkvLyBObXRSZXF1ZXN0IGRvZXMgZXhpc3QKKwkJCQkJLy8gY2hlY2sgaWYgZnJhbWUgaXMgbm90IGVtcHR5IGFuZCBub3QgYmVpbmcgZmlsbGVkCisJCQkJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fcFR4QnVmZmVyCisJCQkJCSAgICBbRVBMX0RMTEtfVFhGUkFNRV9OTVRSRVFdLgorCQkJCQkgICAgbV91aVR4TXNnTGVuID4KKwkJCQkJICAgIEVQTF9ETExLX0JVRkxFTl9GSUxMSU5HKSB7CisJCQkJCQkvLyBjaGVjayBpZiB0aGlzIGZyYW1lIGlzIGEgTk1UIGNvbW1hbmQsCisJCQkJCQkvLyB0aGVuIGZvcndhcmQgdGhpcyBmcmFtZSBiYWNrIHRvIE5tdE1udSBtb2R1bGUsCisJCQkJCQkvLyBiZWNhdXNlIGl0IG5lZWRzIHRoZSB0aW1lLCB3aGVuIHRoaXMgZnJhbWUgaXMKKwkJCQkJCS8vIGFjdHVhbGx5IHNlbnQsIHRvIHN0YXJ0IHRoZSB0aW1lciBmb3IgbW9uaXRvcmluZworCQkJCQkJLy8gdGhlIE5NVCBzdGF0ZSBjaGFuZ2UuCisKKwkJCQkJCXBUeEZyYW1lID0KKwkJCQkJCSAgICAodEVwbEZyYW1lICopCisJCQkJCQkgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgbV9wVHhCdWZmZXIKKwkJCQkJCSAgICBbRVBMX0RMTEtfVFhGUkFNRV9OTVRSRVFdLgorCQkJCQkJICAgIG1fcGJCdWZmZXI7CisJCQkJCQlpZiAoKEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCSAgICAgKCZwVHhGcmFtZS0+CisJCQkJCQkgICAgICBtX2xlX2JNZXNzYWdlVHlwZSkKKwkJCQkJCSAgICAgPT0gKEJZVEUpIGtFcGxNc2dUeXBlQXNuZCkKKwkJCQkJCSAgICAmJgorCQkJCQkJICAgIChBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkgICAgICgmcFR4RnJhbWUtPm1fRGF0YS5tX0FzbmQuCisJCQkJCQkgICAgICBtX2xlX2JTZXJ2aWNlSWQpCisJCQkJCQkgICAgID09IChCWVRFKSBrRXBsRGxsQXNuZE5tdENvbW1hbmQpKSB7CS8vIHBvc3QgZXZlbnQgZGlyZWN0bHkgdG8gTm10TW51IG1vZHVsZQorCQkJCQkJCUV2ZW50Lm1fRXZlbnRTaW5rID0KKwkJCQkJCQkgICAga0VwbEV2ZW50U2lua05tdE1udTsKKwkJCQkJCQlFdmVudC5tX0V2ZW50VHlwZSA9CisJCQkJCQkJICAgIGtFcGxFdmVudFR5cGVObXRNbnVObXRDbWRTZW50OworCQkJCQkJCUV2ZW50Lm1fdWlTaXplID0KKwkJCQkJCQkgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkJICAgIG1fcFR4QnVmZmVyCisJCQkJCQkJICAgIFtFUExfRExMS19UWEZSQU1FX05NVFJFUV0uCisJCQkJCQkJICAgIG1fdWlUeE1zZ0xlbjsKKwkJCQkJCQlFdmVudC5tX3BBcmcgPSBwVHhGcmFtZTsKKwkJCQkJCQlSZXQgPQorCQkJCQkJCSAgICBFcGxFdmVudGtQb3N0CisJCQkJCQkJICAgICgmRXZlbnQpOworCisJCQkJCQl9CisJCQkJCQkvLyBzZW5kIE5tdFJlcXVlc3QKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRWRydlNlbmRUeE1zZworCQkJCQkJICAgICgmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgICAgIG1fcFR4QnVmZmVyCisJCQkJCQkgICAgIFtFUExfRExMS19UWEZSQU1FX05NVFJFUV0pOworCQkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCX0KKworCQkJCQl9CisJCQkJfQorCisJCQl9IGVsc2UgaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fTGFzdFJlcVNlcnZpY2VJZCA9PSBrRXBsRGxsUmVxU2VydmljZVVuc3BlY2lmaWVkKSB7CS8vIHVuc3BlY2lmaWVkIGludml0ZQorCQkJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX05PTkVQTF0ubV9wYkJ1ZmZlciAhPSBOVUxMKSB7CS8vIG5vbi1FUEwgZnJhbWUgZG9lcyBleGlzdAorCQkJCQkvLyBjaGVjayBpZiBmcmFtZSBpcyBub3QgZW1wdHkgYW5kIG5vdCBiZWluZyBmaWxsZWQKKwkJCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9wVHhCdWZmZXIKKwkJCQkJICAgIFtFUExfRExMS19UWEZSQU1FX05PTkVQTF0uCisJCQkJCSAgICBtX3VpVHhNc2dMZW4gPgorCQkJCQkgICAgRVBMX0RMTEtfQlVGTEVOX0ZJTExJTkcpIHsKKwkJCQkJCS8vIHNlbmQgbm9uLUVQTCBmcmFtZQorCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFZHJ2U2VuZFR4TXNnCisJCQkJCQkgICAgKCZFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgbV9wVHhCdWZmZXIKKwkJCQkJCSAgICAgW0VQTF9ETExLX1RYRlJBTUVfTk9ORVBMXSk7CisJCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJZ290byBFeGl0OworCQkJCQkJfQorCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQkvLyBBU25kIGZyYW1lIHdhcyBzZW50LCByZW1vdmUgdGhlIHJlcXVlc3QKKwkJCUVwbERsbGtJbnN0YW5jZV9nLm1fTGFzdFJlcVNlcnZpY2VJZCA9CisJCQkgICAga0VwbERsbFJlcVNlcnZpY2VObzsKKwkJfQorCQkvLyBmb3J3YXJkIGV2ZW50IHRvIEVycm9ySGFuZGxlciBhbmQgUERPIG1vZHVsZQorCQlFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtObXRrOworCQlFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVObXRFdmVudDsKKwkJRXZlbnQubV91aVNpemUgPSBzaXplb2YoTm10RXZlbnQpOworCQlFdmVudC5tX3BBcmcgPSAmTm10RXZlbnQ7CisJCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisJfQorI2VuZGlmCisKKyNpZiBFUExfRExMX1BSRVNfUkVBRFlfQUZURVJfU09BICE9IEZBTFNFCisJZWxzZSB7CQkJLy8gZC5rLjogV2h5IHRoYXQgZWxzZT8gb24gQ04gaXQgaXMgZW50ZXJlZCBvbiBJZGVudFJlcyBhbmQgU3RhdHVzUmVzCisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLyBzaWduYWwgcHJvY2VzcyBmdW5jdGlvbiByZWFkaW5lc3Mgb2YgUFJlcyBmcmFtZQorCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua0RsbGs7CisJRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlRGxsa1ByZXNSZWFkeTsKKwlFdmVudC5tX3VpU2l6ZSA9IDA7CisJRXZlbnQubV9wQXJnID0gTlVMTDsKKwlSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisKKyNlbmRpZgorCisgICAgICBFeGl0OgorCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJRFdPUkQgZHdBcmc7CisKKwkJQkVOQ0hNQVJLX01PRF8wMl9UT0dHTEUoOSk7CisKKwkJZHdBcmcgPQorCQkgICAgRXBsRGxsa0luc3RhbmNlX2cubV9EbGxTdGF0ZSB8IChwVHhCdWZmZXJfcC0+CisJCQkJCQkgICAgbV9FcGxNc2dUeXBlIDw8IDE2KTsKKworCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCisJCVJldCA9IEVwbEV2ZW50a1Bvc3RFcnJvcihrRXBsRXZlbnRTb3VyY2VEbGxrLAorCQkJCQkgUmV0LCBzaXplb2YoZHdBcmcpLCAmZHdBcmcpOworCX0KKworCXJldHVybjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0NoZWNrRnJhbWUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBjaGVjayBmcmFtZSBhbmQgc2V0IG1pc3NpbmcgaW5mb3JtYXRpb24KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEZyYW1lX3AgICAgICAgICAgICAgICAgPSBldGhlcm5ldCBmcmFtZQorLy8gICAgICAgICAgICAgIHVpRnJhbWVTaXplX3AgICAgICAgICAgID0gc2l6ZSBvZiBmcmFtZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsRGxsa0NoZWNrRnJhbWUodEVwbEZyYW1lICogcEZyYW1lX3AsCisJCQkJICAgIHVuc2lnbmVkIGludCB1aUZyYW1lU2l6ZV9wKQoreworCXRFcGxNc2dUeXBlIE1zZ1R5cGU7CisJV09SRCB3RXRoZXJUeXBlOworCisJLy8gY2hlY2sgZnJhbWUKKwlpZiAocEZyYW1lX3AgIT0gTlVMTCkgeworCQkvLyBjaGVjayBTcmNNQUMKKwkJaWYgKEFtaUdldFF3b3JkNDhGcm9tQmUocEZyYW1lX3AtPm1fYmVfYWJTcmNNYWMpID09IDApIHsKKwkJCS8vIHNvdXJjZSBNQUMgYWRkcmVzcworCQkJRVBMX01FTUNQWSgmcEZyYW1lX3AtPm1fYmVfYWJTcmNNYWNbMF0sCisJCQkJICAgJkVwbERsbGtJbnN0YW5jZV9nLm1fYmVfYWJTcmNNYWNbMF0sIDYpOworCQl9CisJCS8vIGNoZWNrIGV0aGVydHlwZQorCQl3RXRoZXJUeXBlID0gQW1pR2V0V29yZEZyb21CZSgmcEZyYW1lX3AtPm1fYmVfd0V0aGVyVHlwZSk7CisJCWlmICh3RXRoZXJUeXBlID09IDApIHsKKwkJCS8vIGFzc3VtZSBFUEwgZnJhbWUKKwkJCXdFdGhlclR5cGUgPSBFUExfQ19ETExfRVRIRVJUWVBFX0VQTDsKKwkJCUFtaVNldFdvcmRUb0JlKCZwRnJhbWVfcC0+bV9iZV93RXRoZXJUeXBlLCB3RXRoZXJUeXBlKTsKKwkJfQorCisJCWlmICh3RXRoZXJUeXBlID09IEVQTF9DX0RMTF9FVEhFUlRZUEVfRVBMKSB7CisJCQkvLyBzb3VyY2Ugbm9kZSBJRAorCQkJQW1pU2V0Qnl0ZVRvTGUoJnBGcmFtZV9wLT5tX2xlX2JTcmNOb2RlSWQsCisJCQkJICAgICAgIChCWVRFKSBFcGxEbGxrSW5zdGFuY2VfZy4KKwkJCQkgICAgICAgbV9EbGxDb25maWdQYXJhbS5tX3VpTm9kZUlkKTsKKworCQkJLy8gY2hlY2sgbWVzc2FnZSB0eXBlCisJCQlNc2dUeXBlID0KKwkJCSAgICBBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWVfcC0+bV9sZV9iTWVzc2FnZVR5cGUpOworCQkJaWYgKE1zZ1R5cGUgPT0gMCkgeworCQkJCU1zZ1R5cGUgPSBrRXBsTXNnVHlwZUFzbmQ7CisJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBGcmFtZV9wLT5tX2xlX2JNZXNzYWdlVHlwZSwKKwkJCQkJICAgICAgIChCWVRFKSBNc2dUeXBlKTsKKwkJCX0KKworCQkJaWYgKE1zZ1R5cGUgPT0ga0VwbE1zZ1R5cGVBc25kKSB7CisJCQkJLy8gZGVzdGluYXRpb24gTUFDIGFkZHJlc3MKKwkJCQlBbWlTZXRRd29yZDQ4VG9CZSgmcEZyYW1lX3AtPm1fYmVfYWJEc3RNYWNbMF0sCisJCQkJCQkgIEVQTF9DX0RMTF9NVUxUSUNBU1RfQVNORCk7CisJCQl9CisKKwkJfQorCX0KKworCXJldHVybiBrRXBsU3VjY2Vzc2Z1bDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0NiQ25UaW1lcigpCisvLworLy8gRGVzY3JpcHRpb246IGNhbGxlZCBieSB0aW1lciBtb2R1bGUuIEl0IG1vbml0b3JzIHRoZSBFUEwgY3ljbGUgd2hlbiBpdCBpcyBhIENOLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwRXZlbnRBcmdfcCAgICAgICAgICAgICA9IHRpbWVyIGV2ZW50IGFyZ3VtZW50CisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgRVBMX1RJTUVSX1VTRV9ISUdIUkVTICE9IEZBTFNFCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsRGxsa0NiQ25UaW1lcih0RXBsVGltZXJFdmVudEFyZyAqIHBFdmVudEFyZ19wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbE5tdFN0YXRlIE5tdFN0YXRlOworCisjaWYgRVBMX1RJTUVSX1VTRV9ISUdIUkVTICE9IEZBTFNFCisJaWYgKHBFdmVudEFyZ19wLT5tX1RpbWVySGRsICE9IEVwbERsbGtJbnN0YW5jZV9nLm1fVGltZXJIZGxDeWNsZSkgewkvLyB6b21iaWUgY2FsbGJhY2sKKwkJLy8ganVzdCBleGl0CisJCWdvdG8gRXhpdDsKKwl9CisjZW5kaWYKKworCU5tdFN0YXRlID0gRXBsTm10a0dldE5tdFN0YXRlKCk7CisKKwlpZiAoTm10U3RhdGUgPD0ga0VwbE5tdEdzUmVzZXRDb25maWd1cmF0aW9uKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlSZXQgPSBFcGxEbGxrQ2hhbmdlU3RhdGUoa0VwbE5tdEV2ZW50RGxsQ2VGcmFtZVRpbWVvdXQsIE5tdFN0YXRlKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gMjAwOC8xMC8xNSBkLmsuIHJlcHJvZ3JhbW1pbmcgb2YgdGltZXIgbm90IG5lY2Vzc2FyeSwKKwkvLyBiZWNhdXNlIGl0IHdpbGwgYmUgcHJvZ3JhbW1lZCwgd2hlbiBTb0MgaXMgcmVjZWl2ZWQuCisvKgorICAgIC8vIHJlcHJvZ3JhbSB0aW1lcgorI2lmIEVQTF9USU1FUl9VU0VfSElHSFJFUyAhPSBGQUxTRQorICAgIGlmICgoTm10U3RhdGUgPiBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDEpCisgICAgICAgICYmIChFcGxEbGxrSW5zdGFuY2VfZy5tX3VsbEZyYW1lVGltZW91dCAhPSAwKSkKKyAgICB7CisgICAgICAgIFJldCA9IEVwbFRpbWVySGlnaFJlc2tNb2RpZnlUaW1lck5zKCZFcGxEbGxrSW5zdGFuY2VfZy5tX1RpbWVySGRsQ3ljbGUsIEVwbERsbGtJbnN0YW5jZV9nLm1fdWxsRnJhbWVUaW1lb3V0LCBFcGxEbGxrQ2JDblRpbWVyLCAwTCwgRkFMU0UpOworICAgIH0KKyNlbmRpZgorKi8KKworICAgICAgRXhpdDoKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCURXT1JEIGR3QXJnOworCisJCUJFTkNITUFSS19NT0RfMDJfVE9HR0xFKDkpOworCisJCWR3QXJnID0KKwkJICAgIEVwbERsbGtJbnN0YW5jZV9nLgorCQkgICAgbV9EbGxTdGF0ZSB8IChrRXBsTm10RXZlbnREbGxDZUZyYW1lVGltZW91dCA8PCA4KTsKKworCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCisJCVJldCA9IEVwbEV2ZW50a1Bvc3RFcnJvcihrRXBsRXZlbnRTb3VyY2VEbGxrLAorCQkJCQkgUmV0LCBzaXplb2YoZHdBcmcpLCAmZHdBcmcpOworCX0KKworCXJldHVybiBSZXQ7Cit9CisjZW5kaWYKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0NiTW5UaW1lckN5Y2xlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogY2FsbGVkIGJ5IHRpbWVyIG1vZHVsZS4gSXQgdHJpZ2dlcnMgdGhlIFNvQyB3aGVuIGl0IGlzIGEgTU4uCisvLworLy8gUGFyYW1ldGVyczogIHBFdmVudEFyZ19wICAgICAgICAgICAgID0gdGltZXIgZXZlbnQgYXJndW1lbnQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxEbGxrQ2JNblRpbWVyQ3ljbGUodEVwbFRpbWVyRXZlbnRBcmcgKiBwRXZlbnRBcmdfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxObXRTdGF0ZSBObXRTdGF0ZTsKKworI2lmIEVQTF9USU1FUl9VU0VfSElHSFJFUyAhPSBGQUxTRQorCWlmIChwRXZlbnRBcmdfcC0+bV9UaW1lckhkbCAhPSBFcGxEbGxrSW5zdGFuY2VfZy5tX1RpbWVySGRsQ3ljbGUpIHsJLy8gem9tYmllIGNhbGxiYWNrCisJCS8vIGp1c3QgZXhpdAorCQlnb3RvIEV4aXQ7CisJfQorI2VuZGlmCisKKwlObXRTdGF0ZSA9IEVwbE5tdGtHZXRObXRTdGF0ZSgpOworCisJaWYgKE5tdFN0YXRlIDw9IGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbikgeworCQlnb3RvIEV4aXQ7CisJfQorCisJUmV0ID0gRXBsRGxsa0NoYW5nZVN0YXRlKGtFcGxObXRFdmVudERsbE1lU29jVHJpZywgTm10U3RhdGUpOworCisgICAgICBFeGl0OgorCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJRFdPUkQgZHdBcmc7CisKKwkJQkVOQ0hNQVJLX01PRF8wMl9UT0dHTEUoOSk7CisKKwkJZHdBcmcgPQorCQkgICAgRXBsRGxsa0luc3RhbmNlX2cuCisJCSAgICBtX0RsbFN0YXRlIHwgKGtFcGxObXRFdmVudERsbE1lU29jVHJpZyA8PCA4KTsKKworCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCisJCVJldCA9IEVwbEV2ZW50a1Bvc3RFcnJvcihrRXBsRXZlbnRTb3VyY2VEbGxrLAorCQkJCQkgUmV0LCBzaXplb2YoZHdBcmcpLCAmZHdBcmcpOworCX0KKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtDYk1uVGltZXJSZXNwb25zZSgpCisvLworLy8gRGVzY3JpcHRpb246IGNhbGxlZCBieSB0aW1lciBtb2R1bGUuIEl0IG1vbml0b3JzIHRoZSBQUmVzIHRpbWVvdXQuCisvLworLy8gUGFyYW1ldGVyczogIHBFdmVudEFyZ19wICAgICAgICAgICAgID0gdGltZXIgZXZlbnQgYXJndW1lbnQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxEbGxrQ2JNblRpbWVyUmVzcG9uc2UodEVwbFRpbWVyRXZlbnRBcmcgKgorCQkJCQkJICBwRXZlbnRBcmdfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxObXRTdGF0ZSBObXRTdGF0ZTsKKworI2lmIEVQTF9USU1FUl9VU0VfSElHSFJFUyAhPSBGQUxTRQorCWlmIChwRXZlbnRBcmdfcC0+bV9UaW1lckhkbCAhPSBFcGxEbGxrSW5zdGFuY2VfZy5tX1RpbWVySGRsUmVzcG9uc2UpIHsJLy8gem9tYmllIGNhbGxiYWNrCisJCS8vIGp1c3QgZXhpdAorCQlnb3RvIEV4aXQ7CisJfQorI2VuZGlmCisKKwlObXRTdGF0ZSA9IEVwbE5tdGtHZXRObXRTdGF0ZSgpOworCisJaWYgKE5tdFN0YXRlIDw9IGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbikgeworCQlnb3RvIEV4aXQ7CisJfQorCisJUmV0ID0gRXBsRGxsa0NoYW5nZVN0YXRlKGtFcGxObXRFdmVudERsbE1lUHJlc1RpbWVvdXQsIE5tdFN0YXRlKTsKKworICAgICAgRXhpdDoKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCURXT1JEIGR3QXJnOworCisJCUJFTkNITUFSS19NT0RfMDJfVE9HR0xFKDkpOworCisJCWR3QXJnID0KKwkJICAgIEVwbERsbGtJbnN0YW5jZV9nLgorCQkgICAgbV9EbGxTdGF0ZSB8IChrRXBsTm10RXZlbnREbGxNZVByZXNUaW1lb3V0IDw8IDgpOworCisJCS8vIEVycm9yIGV2ZW50IGZvciBBUEkgbGF5ZXIKKwkJUmV0ID0gRXBsRXZlbnRrUG9zdEVycm9yKGtFcGxFdmVudFNvdXJjZURsbGssCisJCQkJCSBSZXQsIHNpemVvZihkd0FyZyksICZkd0FyZyk7CisJfQorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0dldE5vZGVJbmZvKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmV0dXJucyBub2RlIGluZm8gc3RydWN0dXJlIG9mIHRoZSBzcGVjaWZpZWQgbm9kZS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBub2RlIElECisvLworLy8gUmV0dXJuczogICAgIHRFcGxEbGxrTm9kZUluZm8qICAgICAgID0gcG9pbnRlciB0byBpbnRlcm5hbCBub2RlIGluZm8gc3RydWN0dXJlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsRGxsa05vZGVJbmZvICpFcGxEbGxrR2V0Tm9kZUluZm8odW5zaWduZWQgaW50IHVpTm9kZUlkX3ApCit7CisJLy8gJCQkIGQuay46IHVzZSBoYXNoIGFsZ29yaXRobSB0byByZXRyaWV2ZSB0aGUgYXBwcm9wcmlhdGUgbm9kZSBpbmZvIHN0cnVjdHVyZQorCS8vICAgICAgICAgICBpZiBzaXplIG9mIGFycmF5IGlzIGxlc3MgdGhhbiAyNTQuCisJdWlOb2RlSWRfcC0tOwkJLy8gbm9kZSBJRCBzdGFydHMgYXQgMSBidXQgYXJyYXkgYXQgMAorCWlmICh1aU5vZGVJZF9wID49IHRhYmVudHJpZXMoRXBsRGxsa0luc3RhbmNlX2cubV9hTm9kZUluZm8pKSB7CisJCXJldHVybiBOVUxMOworCX0gZWxzZSB7CisJCXJldHVybiAmRXBsRGxsa0luc3RhbmNlX2cubV9hTm9kZUluZm9bdWlOb2RlSWRfcF07CisJfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrTW5TZW5kU29hKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogaXQgdXBkYXRlcyBhbmQgdHJhbnNtaXRzIHRoZSBTb0EuCisvLworLy8gUGFyYW1ldGVyczogIE5tdFN0YXRlX3AgICAgICAgICAgICAgID0gY3VycmVudCBOTVQgc3RhdGUKKy8vICAgICAgICAgICAgICBwRGxsU3RhdGVQcm9wb3NlZF9wICAgICA9IHByb3Bvc2VkIERMTCBzdGF0ZQorLy8gICAgICAgICAgICAgIGZFbmFibGVJbnZpdGF0aW9uX3AgICAgID0gZW5hYmxlIGludml0YXRpb24gZm9yIGFzeW5jaHJvbm91cyBwaGFzZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgd2lsbCBiZSBkaXNhYmxlZCBmb3IgRVBMX0NfRExMX1BSRU9QMV9TVEFSVF9DWUNMRVMgU29BcworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsRGxsa01uU2VuZFNvYSh0RXBsTm10U3RhdGUgTm10U3RhdGVfcCwKKwkJCQkgICB0RXBsRGxsU3RhdGUgKiBwRGxsU3RhdGVQcm9wb3NlZF9wLAorCQkJCSAgIEJPT0wgZkVuYWJsZUludml0YXRpb25fcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFZHJ2VHhCdWZmZXIgKnBUeEJ1ZmZlciA9IE5VTEw7CisJdEVwbEZyYW1lICpwVHhGcmFtZTsKKwl0RXBsRGxsa05vZGVJbmZvICpwTm9kZUluZm87CisKKwkqcERsbFN0YXRlUHJvcG9zZWRfcCA9IGtFcGxEbGxNc05vbkN5Y2xpYzsKKworCXBUeEJ1ZmZlciA9ICZFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX1NPQV07CisJaWYgKHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlciAhPSBOVUxMKSB7CS8vIFNvQSBkb2VzIGV4aXN0CisJCXBUeEZyYW1lID0gKHRFcGxGcmFtZSAqKSBwVHhCdWZmZXItPm1fcGJCdWZmZXI7CisKKwkJaWYgKGZFbmFibGVJbnZpdGF0aW9uX3AgIT0gRkFMU0UpIHsJLy8gZmV0Y2ggdGFyZ2V0IG9mIGFzeW5jaHJvbm91cyBwaGFzZQorCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fYkZsYWcyID09IDApIHsJLy8gb3duIHF1ZXVlcyBhcmUgZW1wdHkKKwkJCQlFcGxEbGxrSW5zdGFuY2VfZy5tX0xhc3RSZXFTZXJ2aWNlSWQgPQorCQkJCSAgICBrRXBsRGxsUmVxU2VydmljZU5vOworCQkJfSBlbHNlIGlmICgoKHRFcGxEbGxBc3luY1JlcVByaW9yaXR5KSAoRXBsRGxsa0luc3RhbmNlX2cubV9iRmxhZzIgPj4gRVBMX0ZSQU1FX0ZMQUcyX1BSX1NISUZUKSkgPT0ga0VwbERsbEFzeW5jUmVxUHJpb05tdCkgewkvLyBmcmFtZXMgaW4gb3duIE5NVCByZXF1ZXN0IHF1ZXVlIGF2YWlsYWJsZQorCQkJCUVwbERsbGtJbnN0YW5jZV9nLm1fTGFzdFJlcVNlcnZpY2VJZCA9CisJCQkJICAgIGtFcGxEbGxSZXFTZXJ2aWNlTm10UmVxdWVzdDsKKwkJCX0gZWxzZSB7CisJCQkJRXBsRGxsa0luc3RhbmNlX2cubV9MYXN0UmVxU2VydmljZUlkID0KKwkJCQkgICAga0VwbERsbFJlcVNlcnZpY2VVbnNwZWNpZmllZDsKKwkJCX0KKwkJCVJldCA9CisJCQkgICAgRXBsRGxsa0NhbEFzeW5jR2V0U29hUmVxdWVzdCgmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkJIG1fTGFzdFJlcVNlcnZpY2VJZCwKKwkJCQkJCQkgJkVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJCSBtX3VpTGFzdFRhcmdldE5vZGVJZCk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJZ290byBFeGl0OworCQkJfQorCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fTGFzdFJlcVNlcnZpY2VJZCAhPSBrRXBsRGxsUmVxU2VydmljZU5vKSB7CS8vIGFzeW5jaHJvbm91cyBwaGFzZSB3aWxsIGJlIGFzc2lnbmVkIHRvIG9uZSBub2RlCisJCQkJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fdWlMYXN0VGFyZ2V0Tm9kZUlkID09IEVQTF9DX0FEUl9JTlZBTElEKSB7CS8vIGV4Y2hhbmdlIGludmFsaWQgbm9kZSBJRCB3aXRoIGxvY2FsIG5vZGUgSUQKKwkJCQkJRXBsRGxsa0luc3RhbmNlX2cubV91aUxhc3RUYXJnZXROb2RlSWQgPQorCQkJCQkgICAgRXBsRGxsa0luc3RhbmNlX2cubV9EbGxDb25maWdQYXJhbS4KKwkJCQkJICAgIG1fdWlOb2RlSWQ7CisJCQkJCS8vIGQuay4gRExMIHN0YXRlIFdhaXRBc25kVHJpZyBpcyBub3QgaGVscGZ1bDsKKwkJCQkJLy8gICAgICBzbyBqdXN0IHN0ZXAgb3ZlciB0byBXYWl0U29jVHJpZywKKwkJCQkJLy8gICAgICBiZWNhdXNlIG93biBBU25kIGlzIHNlbnQgYXV0b21hdGljYWxseSBpbiBDYkZyYW1lVHJhbnNtaXR0ZWQoKSBhZnRlciBTb0EuCisJCQkJCS8vKnBEbGxTdGF0ZVByb3Bvc2VkX3AgPSBrRXBsRGxsTXNXYWl0QXNuZFRyaWc7CisJCQkJCSpwRGxsU3RhdGVQcm9wb3NlZF9wID0KKwkJCQkJICAgIGtFcGxEbGxNc1dhaXRTb2NUcmlnOworCQkJCX0gZWxzZSB7CS8vIGFzc2lnbm1lbnQgdG8gQ04KKwkJCQkJKnBEbGxTdGF0ZVByb3Bvc2VkX3AgPQorCQkJCQkgICAga0VwbERsbE1zV2FpdEFzbmQ7CisJCQkJfQorCisJCQkJcE5vZGVJbmZvID0KKwkJCQkgICAgRXBsRGxsa0dldE5vZGVJbmZvKEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCQkJICAgICAgIG1fdWlMYXN0VGFyZ2V0Tm9kZUlkKTsKKwkJCQlpZiAocE5vZGVJbmZvID09IE5VTEwpIHsJLy8gbm8gbm9kZSBpbmZvIHN0cnVjdHVyZSBhdmFpbGFibGUKKwkJCQkJUmV0ID0ga0VwbERsbE5vTm9kZUluZm87CisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisJCQkJLy8gdXBkYXRlIGZyYW1lIChFQSwgRVIgZmxhZ3MpCisJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9Tb2EuCisJCQkJCSAgICAgICBtX2xlX2JGbGFnMSwKKwkJCQkJICAgICAgIHBOb2RlSW5mby0+CisJCQkJCSAgICAgICBtX2JTb2FGbGFnMSAmIChFUExfRlJBTUVfRkxBRzFfRUEKKwkJCQkJCQkgICAgICB8CisJCQkJCQkJICAgICAgRVBMX0ZSQU1FX0ZMQUcxX0VSKSk7CisJCQl9IGVsc2UgewkvLyBubyBhc3NpZ25tZW50IG9mIGFzeW5jaHJvbm91cyBwaGFzZQorCQkJCSpwRGxsU3RhdGVQcm9wb3NlZF9wID0ga0VwbERsbE1zV2FpdFNvY1RyaWc7CisJCQkJRXBsRGxsa0luc3RhbmNlX2cubV91aUxhc3RUYXJnZXROb2RlSWQgPQorCQkJCSAgICBFUExfQ19BRFJfSU5WQUxJRDsKKwkJCX0KKworCQkJLy8gdXBkYXRlIGZyYW1lICh0YXJnZXQpCisJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1NvYS4KKwkJCQkgICAgICAgbV9sZV9iUmVxU2VydmljZUlkLAorCQkJCSAgICAgICAoQllURSkgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJICAgICAgIG1fTGFzdFJlcVNlcnZpY2VJZCk7CisJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1NvYS4KKwkJCQkgICAgICAgbV9sZV9iUmVxU2VydmljZVRhcmdldCwKKwkJCQkgICAgICAgKEJZVEUpIEVwbERsbGtJbnN0YW5jZV9nLgorCQkJCSAgICAgICBtX3VpTGFzdFRhcmdldE5vZGVJZCk7CisKKwkJfSBlbHNlIHsJLy8gaW52aXRlIG5vYm9keQorCQkJLy8gdXBkYXRlIGZyYW1lICh0YXJnZXQpCisJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1NvYS4KKwkJCQkgICAgICAgbV9sZV9iUmVxU2VydmljZUlkLCAoQllURSkgMCk7CisJCQlBbWlTZXRCeXRlVG9MZSgmcFR4RnJhbWUtPm1fRGF0YS5tX1NvYS4KKwkJCQkgICAgICAgbV9sZV9iUmVxU2VydmljZVRhcmdldCwgKEJZVEUpIDApOworCQl9CisKKwkJLy8gdXBkYXRlIGZyYW1lIChOTVQgc3RhdGUpCisJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fU29hLm1fbGVfYk5tdFN0YXR1cywKKwkJCSAgICAgICAoQllURSkgTm10U3RhdGVfcCk7CisKKwkJLy8gc2VuZCBTb0EgZnJhbWUKKwkJUmV0ID0gRWRydlNlbmRUeE1zZyhwVHhCdWZmZXIpOworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrTW5TZW5kU29jKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogaXQgdXBkYXRlcyBhbmQgdHJhbnNtaXRzIHRoZSBTb0EuCisvLworLy8gUGFyYW1ldGVyczogIChub25lKQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsRGxsa01uU2VuZFNvYyh2b2lkKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVkcnZUeEJ1ZmZlciAqcFR4QnVmZmVyID0gTlVMTDsKKwl0RXBsRnJhbWUgKnBUeEZyYW1lOworCXRFcGxFdmVudCBFdmVudDsKKworCXBUeEJ1ZmZlciA9ICZFcGxEbGxrSW5zdGFuY2VfZy5tX3BUeEJ1ZmZlcltFUExfRExMS19UWEZSQU1FX1NPQ107CisJaWYgKHBUeEJ1ZmZlci0+bV9wYkJ1ZmZlciAhPSBOVUxMKSB7CS8vIFNvQyBkb2VzIGV4aXN0CisJCXBUeEZyYW1lID0gKHRFcGxGcmFtZSAqKSBwVHhCdWZmZXItPm1fcGJCdWZmZXI7CisKKwkJLy8gJCQkIHVwZGF0ZSBOZXRUaW1lCisKKwkJLy8gc2VuZCBTb0MgZnJhbWUKKwkJUmV0ID0gRWRydlNlbmRUeE1zZyhwVHhCdWZmZXIpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJLy8gdHJpZ2dlciBzeW5jaHJvbm91cyB0YXNrCisJCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua1N5bmM7CisJCUV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZVN5bmM7CisJCUV2ZW50Lm1fdWlTaXplID0gMDsKKwkJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrTW5TZW5kUHJlcSgpCisvLworLy8gRGVzY3JpcHRpb246IGl0IHVwZGF0ZXMgYW5kIHRyYW5zbWl0cyB0aGUgUFJlcSBmb3IgdGhlIG5leHQgaXNvY2hyb25vdXMgQ04KKy8vICAgICAgICAgICAgICBvciBvd24gUFJlcyBpZiBlbmFibGVkLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBObXRTdGF0ZV9wICAgICAgICAgICAgICA9IGN1cnJlbnQgTk1UIHN0YXRlCisvLyAgICAgICAgICAgICAgcERsbFN0YXRlUHJvcG9zZWRfcCAgICAgPSBwcm9wb3NlZCBETEwgc3RhdGUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbERsbGtNblNlbmRQcmVxKHRFcGxObXRTdGF0ZSBObXRTdGF0ZV9wLAorCQkJCSAgICB0RXBsRGxsU3RhdGUgKiBwRGxsU3RhdGVQcm9wb3NlZF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVkcnZUeEJ1ZmZlciAqcFR4QnVmZmVyID0gTlVMTDsKKwl0RXBsRnJhbWUgKnBUeEZyYW1lOworCUJZVEUgYkZsYWcxID0gMDsKKworCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX3BDdXJOb2RlSW5mbyA9PSBOVUxMKSB7CS8vIHN0YXJ0IHdpdGggZmlyc3QgaXNvY2hyb25vdXMgQ04KKwkJRXBsRGxsa0luc3RhbmNlX2cubV9wQ3VyTm9kZUluZm8gPQorCQkgICAgRXBsRGxsa0luc3RhbmNlX2cubV9wRmlyc3ROb2RlSW5mbzsKKwl9IGVsc2UgewkJLy8gaXRlcmF0ZSB0byBuZXh0IGlzb2Nocm9ub3VzIENOCisJCUVwbERsbGtJbnN0YW5jZV9nLm1fcEN1ck5vZGVJbmZvID0KKwkJICAgIEVwbERsbGtJbnN0YW5jZV9nLm1fcEN1ck5vZGVJbmZvLT5tX3BOZXh0Tm9kZUluZm87CisJfQorCisJaWYgKEVwbERsbGtJbnN0YW5jZV9nLm1fcEN1ck5vZGVJbmZvID09IE5VTEwpIHsJLy8gbGFzdCBpc29jaHJvbm91cyBDTiByZWFjaGVkCisJCVJldCA9IEVwbERsbGtNblNlbmRTb2EoTm10U3RhdGVfcCwgcERsbFN0YXRlUHJvcG9zZWRfcCwgVFJVRSk7CisJCWdvdG8gRXhpdDsKKwl9IGVsc2UgeworCQlwVHhCdWZmZXIgPSBFcGxEbGxrSW5zdGFuY2VfZy5tX3BDdXJOb2RlSW5mby0+bV9wUHJlcVR4QnVmZmVyOworCQliRmxhZzEgPQorCQkgICAgRXBsRGxsa0luc3RhbmNlX2cubV9wQ3VyTm9kZUluZm8tPgorCQkgICAgbV9iU29hRmxhZzEgJiBFUExfRlJBTUVfRkxBRzFfRUE7CisJCSpwRGxsU3RhdGVQcm9wb3NlZF9wID0ga0VwbERsbE1zV2FpdFByZXM7CisKKwkJLy8gc3RhcnQgUFJlcyBUaW1lcgorCQkvLyAkJCQgZC5rLjogbWF5YmUgbW92ZSB0aGlzIGNhbGwgdG8gQ2JGcmFtZVRyYW5zbWl0dGVkKCksIGJlY2F1c2UgdGhlIHRpbWUgc2hvdWxkIHJ1biBmcm9tIHRoZXJlCisjaWYgRVBMX1RJTUVSX1VTRV9ISUdIUkVTICE9IEZBTFNFCisJCVJldCA9CisJCSAgICBFcGxUaW1lckhpZ2hSZXNrTW9kaWZ5VGltZXJOcygmRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgIG1fVGltZXJIZGxSZXNwb25zZSwKKwkJCQkJCSAgRXBsRGxsa0luc3RhbmNlX2cuCisJCQkJCQkgIG1fcEN1ck5vZGVJbmZvLT4KKwkJCQkJCSAgbV9kd1ByZXNUaW1lb3V0LAorCQkJCQkJICBFcGxEbGxrQ2JNblRpbWVyUmVzcG9uc2UsIDBMLAorCQkJCQkJICBGQUxTRSk7CisjZW5kaWYKKwl9CisKKwlpZiAocFR4QnVmZmVyID09IE5VTEwpIHsJLy8gUFJlcSBkb2VzIG5vdCBleGlzdAorCQlSZXQgPSBrRXBsRGxsVHhCdWZOb3RSZWFkeTsKKwkJZ290byBFeGl0OworCX0KKworCXBUeEZyYW1lID0gKHRFcGxGcmFtZSAqKSBwVHhCdWZmZXItPm1fcGJCdWZmZXI7CisKKwlpZiAocFR4RnJhbWUgIT0gTlVMTCkgewkvLyBQUmVxIGRvZXMgZXhpc3QKKwkJaWYgKE5tdFN0YXRlX3AgPT0ga0VwbE5tdE1zT3BlcmF0aW9uYWwpIHsJLy8gbGVhdmUgUkQgZmxhZyB1bnRvdWNoZWQKKwkJCWJGbGFnMSB8PQorCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9QcmVxLgorCQkJCQkgICAgIG1fbGVfYkZsYWcxKSAmIEVQTF9GUkFNRV9GTEFHMV9SRDsKKwkJfQorCisJCWlmIChwVHhCdWZmZXIgPT0gJkVwbERsbGtJbnN0YW5jZV9nLm1fcFR4QnVmZmVyW0VQTF9ETExLX1RYRlJBTUVfUFJFU10pIHsJLy8gUFJlcyBvZiBNTiB3aWxsIGJlIHNlbnQKKwkJCS8vIHVwZGF0ZSBOTVQgc3RhdGUKKwkJCUFtaVNldEJ5dGVUb0xlKCZwVHhGcmFtZS0+bV9EYXRhLm1fUHJlcy5tX2xlX2JObXRTdGF0dXMsCisJCQkJICAgICAgIChCWVRFKSBObXRTdGF0ZV9wKTsKKwkJCSpwRGxsU3RhdGVQcm9wb3NlZF9wID0ga0VwbERsbE1zV2FpdFNvYVRyaWc7CisJCX0KKwkJLy8gJCQkIGQuay4gc2V0IEVQTF9GUkFNRV9GTEFHMV9NUyBpZiBuZWNlc3NhcnkKKwkJLy8gdXBkYXRlIGZyYW1lIChGbGFnMSkKKwkJQW1pU2V0Qnl0ZVRvTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9QcmVxLm1fbGVfYkZsYWcxLCBiRmxhZzEpOworCisJCS8vIGNhbGN1bGF0ZSBmcmFtZSBzaXplIGZyb20gcGF5bG9hZCBzaXplCisJCXBUeEJ1ZmZlci0+bV91aVR4TXNnTGVuID0KKwkJICAgIEFtaUdldFdvcmRGcm9tTGUoJnBUeEZyYW1lLT5tX0RhdGEubV9QcmVxLm1fbGVfd1NpemUpICsgMjQ7CisKKwkJLy8gc2VuZCBQUmVxIGZyYW1lCisJCVJldCA9IEVkcnZTZW5kVHhNc2cocFR4QnVmZmVyKTsKKwl9IGVsc2UgeworCQlSZXQgPSBrRXBsRGxsVHhGcmFtZUludmFsaWQ7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtBc3luY0ZyYW1lTm90UmVjZWl2ZWQoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBwYXNzZXMgZW1wdHkgQVNuZCBmcmFtZSB0byByZWNlaXZlIEZJRk8uCisvLyAgICAgICAgICAgICAgSXQgd2lsbCBiZSBjYWxsZWQgb25seSBmb3IgZnJhbWVzIHdpdGggcmVnaXN0ZXJlZCBBc25kU2VydmljZUlkcworLy8gICAgICAgICAgICAgIChvbmx5IGtFcGxEbGxBc25kRmlsdGVyQW55KS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgbm9uZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsRGxsa0FzeW5jRnJhbWVOb3RSZWNlaXZlZCh0RXBsRGxsUmVxU2VydmljZUlkCisJCQkJCSAgICAgICBSZXFTZXJ2aWNlSWRfcCwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCB1aU5vZGVJZF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJQllURSBhYkJ1ZmZlclsxOF07CisJdEVwbEZyYW1lICpwRnJhbWUgPSAodEVwbEZyYW1lICopIGFiQnVmZmVyOworCXRFcGxGcmFtZUluZm8gRnJhbWVJbmZvOworCisJLy8gY2hlY2sgaWYgcHJldmlvdXMgU29BIGludml0YXRpb24gd2FzIG5vdCBhbnN3ZXJlZAorCXN3aXRjaCAoUmVxU2VydmljZUlkX3ApIHsKKwljYXNlIGtFcGxEbGxSZXFTZXJ2aWNlSWRlbnQ6CisJY2FzZSBrRXBsRGxsUmVxU2VydmljZVN0YXR1czoKKwkJLy8gQVNuZCBzZXJ2aWNlIHJlZ2lzdGVyZWQ/CisJCWlmIChFcGxEbGxrSW5zdGFuY2VfZy5tX2FBc25kRmlsdGVyW1JlcVNlcnZpY2VJZF9wXSA9PSBrRXBsRGxsQXNuZEZpbHRlckFueSkgewkvLyBBU25kIHNlcnZpY2UgSUQgaXMgcmVnaXN0ZXJlZAorCQkJQW1pU2V0Qnl0ZVRvTGUoJnBGcmFtZS0+bV9sZV9iU3JjTm9kZUlkLAorCQkJCSAgICAgICAoQllURSkgdWlOb2RlSWRfcCk7CisJCQkvLyBFUEwgTXNnVHlwZSBBU25kCisJCQlBbWlTZXRCeXRlVG9MZSgmcEZyYW1lLT5tX2xlX2JNZXNzYWdlVHlwZSwKKwkJCQkgICAgICAgKEJZVEUpIGtFcGxNc2dUeXBlQXNuZCk7CisJCQkvLyBBU25kIFNlcnZpY2UgSUQKKwkJCUFtaVNldEJ5dGVUb0xlKCZwRnJhbWUtPm1fRGF0YS5tX0FzbmQubV9sZV9iU2VydmljZUlkLAorCQkJCSAgICAgICAoQllURSkgUmVxU2VydmljZUlkX3ApOworCQkJLy8gY3JlYXRlIGZyYW1lIGluZm8gc3RydWN0dXJlCisJCQlGcmFtZUluZm8ubV9wRnJhbWUgPSBwRnJhbWU7CisJCQlGcmFtZUluZm8ubV91aUZyYW1lU2l6ZSA9IDE4OwkvLyBlbXB0eSBub24gZXhpc3RpbmcgQVNuZCBmcmFtZQorCQkJLy8gZm9yd2FyZCBmcmFtZSB2aWEgYXN5bmMgcmVjZWl2ZSBGSUZPIHRvIHVzZXJzcGFjZQorCQkJUmV0ID0gRXBsRGxsa0NhbEFzeW5jRnJhbWVSZWNlaXZlZCgmRnJhbWVJbmZvKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQkvLyBubyBpbnZpdGF0aW9uIGlzc3VlZCBvciBpdCB3YXMgc3VjY2Vzc2Z1bGx5IGFuc3dlcmVkIG9yIGl0IGlzIHVuaW50ZXJlc3RpbmcKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIFJldDsKK30KKworI2VuZGlmIC8vKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCisjZW5kaWYgLy8gI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxEbGxrQ2FsLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbERsbGtDYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTkwODNlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxEbGxrQ2FsLmMKQEAgLTAsMCArMSwxMjYwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgc291cmNlIGZpbGUgZm9yIGtlcm5lbCBETEwgQ29tbXVuaWNhdGlvbiBBYnN0cmFjdGlvbiBMYXllciBtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxEbGxrQ2FsLmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjcgJCAgJERhdGU6IDIwMDgvMTEvMTMgMTc6MTM6MDkgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8xNSBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJrZXJuZWwvRXBsRGxsa0NhbC5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxEbGxrLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbEV2ZW50ay5oIgorCisjaW5jbHVkZSAiRXBsRGxsQ2FsLmgiCisjaWZuZGVmIEVQTF9OT19GSUZPCisjaW5jbHVkZSAiU2hhcmVkQnVmZi5oIgorI2VuZGlmCisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMSykpICE9IDApCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBtaW4KKyNkZWZpbmUgbWluKGEsYikgICAgICAgICAgICAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgQyBMIEEgUyBTICBFcGxEbGxrQ2FsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEVQTF9ETExLQ0FMX01BWF9RVUVVRVMgIDUJLy8gQ25HZW5SZXEsIENuTm10UmVxLCB7TW5HZW5SZXEsIE1uTm10UmVxfSwgTW5JZGVudFJlcSwgTW5TdGF0dXNSZXEKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCB7CisjaWZuZGVmIEVQTF9OT19GSUZPCisvLyAgICB0U2hiSW5zdGFuY2UgICAgbV9TaGJJbnN0YW5jZVJ4OyAgICAgIC8vIEZJRk8gZm9yIFJ4IEFTbmQgZnJhbWVzCisJdFNoYkluc3RhbmNlIG1fU2hiSW5zdGFuY2VUeE5tdDsJLy8gRklGTyBmb3IgVHggZnJhbWVzIHdpdGggTk1UIHJlcXVlc3QgcHJpb3JpdHkKKwl0U2hiSW5zdGFuY2UgbV9TaGJJbnN0YW5jZVR4R2VuOwkvLyBGSUZPIGZvciBUeCBmcmFtZXMgd2l0aCBnZW5lcmljIHByaW9yaXR5CisjZWxzZQorCXVuc2lnbmVkIGludCBtX3VpRnJhbWVTaXplTm10OworCUJZVEUgbV9hYkZyYW1lTm10WzE1MDBdOworCXVuc2lnbmVkIGludCBtX3VpRnJhbWVTaXplR2VuOworCUJZVEUgbV9hYkZyYW1lR2VuWzE1MDBdOworI2VuZGlmCisKKwl0RXBsRGxsa0NhbFN0YXRpc3RpY3MgbV9TdGF0aXN0aWNzOworCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCS8vIElkZW50UmVxdWVzdCBxdWV1ZSB3aXRoIENOIG5vZGUgSURzCisJdW5zaWduZWQgaW50IG1fYXVpUXVldWVJZGVudFJlcVtFUExfRF9OTVRfTWF4Q05OdW1iZXJfVTggKyAxXTsJLy8gMSBlbnRyeSBpcyByZXNlcnZlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGZ1bGwgYW5kIGVtcHR5CisJdW5zaWduZWQgaW50IG1fdWlXcml0ZUlkZW50UmVxOworCXVuc2lnbmVkIGludCBtX3VpUmVhZElkZW50UmVxOworCisJLy8gU3RhdHVzUmVxdWVzdCBxdWV1ZSB3aXRoIENOIG5vZGUgSURzCisJdW5zaWduZWQgaW50IG1fYXVpUXVldWVTdGF0dXNSZXFbRVBMX0RfTk1UX01heENOTnVtYmVyX1U4ICsgMV07CS8vIDEgZW50cnkgaXMgcmVzZXJ2ZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBmdWxsIGFuZCBlbXB0eQorCXVuc2lnbmVkIGludCBtX3VpV3JpdGVTdGF0dXNSZXE7CisJdW5zaWduZWQgaW50IG1fdWlSZWFkU3RhdHVzUmVxOworCisJdW5zaWduZWQgaW50IG1fYXVpUXVldWVDblJlcXVlc3RzWzI1NCAqIDJdOworCS8vIGZpcnN0IDI1NCBlbnRyaWVzIHJlcHJlc2VudCB0aGUgZ2VuZXJpYyByZXF1ZXN0cyBvZiB0aGUgY29ycmVzcG9uZGluZyBub2RlCisJLy8gc2Vjb25kIDI1NCBlbnRyaWVzIHJlcHJlc2VudCB0aGUgTk1UIHJlcXVlc3RzIG9mIHRoZSBjb3JyZXNwb25kaW5nIG5vZGUKKwl1bnNpZ25lZCBpbnQgbV91aU5leHRRdWV1ZUNuUmVxdWVzdDsKKwl1bnNpZ25lZCBpbnQgbV91aU5leHRSZXF1ZXN0UXVldWU7CisjZW5kaWYKKworfSB0RXBsRGxsa0NhbEluc3RhbmNlOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gaWYgbm8gZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiBzaGFsbCBiZSB1c2VkCisvLyBkZWZpbmUgc3RydWN0dXJlcyBzdGF0aWNhbGx5CitzdGF0aWMgdEVwbERsbGtDYWxJbnN0YW5jZSBFcGxEbGxrQ2FsSW5zdGFuY2VfZzsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrQ2FsQWRkSW5zdGFuY2UoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBhZGQgYW5kIGluaXRpYWxpemUgbmV3IGluc3RhbmNlIG9mIERMTCBDQUwgbW9kdWxlCisvLworLy8gUGFyYW1ldGVyczogIG5vbmUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsa0NhbEFkZEluc3RhbmNlKCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworI2lmbmRlZiBFUExfTk9fRklGTworCXRTaGJFcnJvciBTaGJFcnJvcjsKKwl1bnNpZ25lZCBpbnQgZlNoYk5ld0NyZWF0ZWQ7CisKKy8qICAgIFNoYkVycm9yID0gU2hiQ2lyQWxsb2NCdWZmZXIgKEVQTF9ETExDQUxfQlVGRkVSX1NJWkVfUlgsIEVQTF9ETExDQUxfQlVGRkVSX0lEX1JYLAorICAgICAgICAmRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TaGJJbnN0YW5jZVJ4LCAmZlNoYk5ld0NyZWF0ZWQpOworICAgIC8vIHJldHVybnMga1NoYk9rLCBrU2hiT3Blbk1pc21hdGNoLCBrU2hiT3V0T2ZNZW0gb3Iga1NoYkludmFsaWRBcmcKKworICAgIGlmIChTaGJFcnJvciAhPSBrU2hiT2spCisgICAgeworICAgICAgICBSZXQgPSBrRXBsTm9SZXNvdXJjZTsKKyAgICB9CisqLworCVNoYkVycm9yID0KKwkgICAgU2hiQ2lyQWxsb2NCdWZmZXIoRVBMX0RMTENBTF9CVUZGRVJfU0laRV9UWF9OTVQsCisJCQkgICAgICBFUExfRExMQ0FMX0JVRkZFUl9JRF9UWF9OTVQsCisJCQkgICAgICAmRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TaGJJbnN0YW5jZVR4Tm10LAorCQkJICAgICAgJmZTaGJOZXdDcmVhdGVkKTsKKwkvLyByZXR1cm5zIGtTaGJPaywga1NoYk9wZW5NaXNtYXRjaCwga1NoYk91dE9mTWVtIG9yIGtTaGJJbnZhbGlkQXJnCisKKwlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCX0KKworLyogICAgU2hiRXJyb3IgPSBTaGJDaXJTZXRTaWduYWxIYW5kbGVyTmV3RGF0YSAoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TaGJJbnN0YW5jZVR4Tm10LCBFcGxEbGxrQ2FsVHhObXRTaWduYWxIYW5kbGVyLCBrU2hiUHJpb3JpdHlOb3JtYWwpOworICAgIC8vIHJldHVybnMga1NoYk9rLCBrU2hiQWxyZWFkeVNpZ25hbGluZyBvciBrU2hiSW52YWxpZEFyZworCisgICAgaWYgKFNoYkVycm9yICE9IGtTaGJPaykKKyAgICB7CisgICAgICAgIFJldCA9IGtFcGxOb1Jlc291cmNlOworICAgIH0KKyovCisJU2hiRXJyb3IgPQorCSAgICBTaGJDaXJBbGxvY0J1ZmZlcihFUExfRExMQ0FMX0JVRkZFUl9TSVpFX1RYX0dFTiwKKwkJCSAgICAgIEVQTF9ETExDQUxfQlVGRkVSX0lEX1RYX0dFTiwKKwkJCSAgICAgICZFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1NoYkluc3RhbmNlVHhHZW4sCisJCQkgICAgICAmZlNoYk5ld0NyZWF0ZWQpOworCS8vIHJldHVybnMga1NoYk9rLCBrU2hiT3Blbk1pc21hdGNoLCBrU2hiT3V0T2ZNZW0gb3Iga1NoYkludmFsaWRBcmcKKworCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisJfQorCisvKiAgICBTaGJFcnJvciA9IFNoYkNpclNldFNpZ25hbEhhbmRsZXJOZXdEYXRhIChFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1NoYkluc3RhbmNlVHhHZW4sIEVwbERsbGtDYWxUeEdlblNpZ25hbEhhbmRsZXIsIGtTaGJQcmlvcml0eU5vcm1hbCk7CisgICAgLy8gcmV0dXJucyBrU2hiT2ssIGtTaGJBbHJlYWR5U2lnbmFsaW5nIG9yIGtTaGJJbnZhbGlkQXJnCisKKyAgICBpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKQorICAgIHsKKyAgICAgICAgUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisgICAgfQorKi8KKyNlbHNlCisJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aUZyYW1lU2l6ZU5tdCA9IDA7CisJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aUZyYW1lU2l6ZUdlbiA9IDA7CisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtDYWxEZWxJbnN0YW5jZSgpCisvLworLy8gRGVzY3JpcHRpb246IGRlbGV0ZXMgaW5zdGFuY2Ugb2YgRExMIENBTCBtb2R1bGUKKy8vCisvLyBQYXJhbWV0ZXJzOiAgbm9uZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGxrQ2FsRGVsSW5zdGFuY2UoKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisjaWZuZGVmIEVQTF9OT19GSUZPCisJdFNoYkVycm9yIFNoYkVycm9yOworCisvKiAgICBTaGJFcnJvciA9IFNoYkNpclJlbGVhc2VCdWZmZXIgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU2hiSW5zdGFuY2VSeCk7CisgICAgaWYgKFNoYkVycm9yICE9IGtTaGJPaykKKyAgICB7CisgICAgICAgIFJldCA9IGtFcGxOb1Jlc291cmNlOworICAgIH0KKyAgICBFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1NoYkluc3RhbmNlUnggPSBOVUxMOworKi8KKwlTaGJFcnJvciA9IFNoYkNpclJlbGVhc2VCdWZmZXIoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TaGJJbnN0YW5jZVR4Tm10KTsKKwlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCX0KKwlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1NoYkluc3RhbmNlVHhObXQgPSBOVUxMOworCisJU2hiRXJyb3IgPSBTaGJDaXJSZWxlYXNlQnVmZmVyKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU2hiSW5zdGFuY2VUeEdlbik7CisJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgeworCQlSZXQgPSBrRXBsTm9SZXNvdXJjZTsKKwl9CisJRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TaGJJbnN0YW5jZVR4R2VuID0gTlVMTDsKKworI2Vsc2UKKwlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpRnJhbWVTaXplTm10ID0gMDsKKwlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpRnJhbWVTaXplR2VuID0gMDsKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0NhbFByb2Nlc3MKKy8vCisvLyBEZXNjcmlwdGlvbjogcHJvY2VzcyB0aGUgcGFzc2VkIGNvbmZpZ3VyYXRpb24KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEV2ZW50X3AgICAgICAgICAgICAgICAgPSBldmVudCBjb250YWluaW5nIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGxrQ2FsUHJvY2Vzcyh0RXBsRXZlbnQgKiBwRXZlbnRfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJc3dpdGNoIChwRXZlbnRfcC0+bV9FdmVudFR5cGUpIHsKKwljYXNlIGtFcGxFdmVudFR5cGVEbGxrU2VydkZpbHRlcjoKKwkJeworCQkJdEVwbERsbENhbEFzbmRTZXJ2aWNlSWRGaWx0ZXIgKnBTZXJ2RmlsdGVyOworCisJCQlwU2VydkZpbHRlciA9CisJCQkgICAgKHRFcGxEbGxDYWxBc25kU2VydmljZUlkRmlsdGVyICopIHBFdmVudF9wLT5tX3BBcmc7CisJCQlSZXQgPQorCQkJICAgIEVwbERsbGtTZXRBc25kU2VydmljZUlkRmlsdGVyKHBTZXJ2RmlsdGVyLT4KKwkJCQkJCQkgIG1fU2VydmljZUlkLAorCQkJCQkJCSAgcFNlcnZGaWx0ZXItPgorCQkJCQkJCSAgbV9GaWx0ZXIpOworCQkJYnJlYWs7CisJCX0KKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwljYXNlIGtFcGxFdmVudFR5cGVEbGxrSXNzdWVSZXE6CisJCXsKKwkJCXRFcGxEbGxDYWxJc3N1ZVJlcXVlc3QgKnBJc3N1ZVJlcTsKKworCQkJcElzc3VlUmVxID0gKHRFcGxEbGxDYWxJc3N1ZVJlcXVlc3QgKikgcEV2ZW50X3AtPm1fcEFyZzsKKwkJCVJldCA9CisJCQkgICAgRXBsRGxsa0NhbElzc3VlUmVxdWVzdChwSXNzdWVSZXEtPm1fU2VydmljZSwKKwkJCQkJCSAgIHBJc3N1ZVJlcS0+bV91aU5vZGVJZCwKKwkJCQkJCSAgIHBJc3N1ZVJlcS0+bV9iU29hRmxhZzEpOworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbEV2ZW50VHlwZURsbGtBZGROb2RlOgorCQl7CisJCQl0RXBsRGxsTm9kZUluZm8gKnBOb2RlSW5mbzsKKworCQkJcE5vZGVJbmZvID0gKHRFcGxEbGxOb2RlSW5mbyAqKSBwRXZlbnRfcC0+bV9wQXJnOworCQkJUmV0ID0gRXBsRGxsa0FkZE5vZGUocE5vZGVJbmZvKTsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxFdmVudFR5cGVEbGxrRGVsTm9kZToKKwkJeworCQkJdW5zaWduZWQgaW50ICpwdWlOb2RlSWQ7CisKKwkJCXB1aU5vZGVJZCA9ICh1bnNpZ25lZCBpbnQgKilwRXZlbnRfcC0+bV9wQXJnOworCQkJUmV0ID0gRXBsRGxsa0RlbGV0ZU5vZGUoKnB1aU5vZGVJZCk7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsRXZlbnRUeXBlRGxsa1NvZnREZWxOb2RlOgorCQl7CisJCQl1bnNpZ25lZCBpbnQgKnB1aU5vZGVJZDsKKworCQkJcHVpTm9kZUlkID0gKHVuc2lnbmVkIGludCAqKXBFdmVudF9wLT5tX3BBcmc7CisJCQlSZXQgPSBFcGxEbGxrU29mdERlbGV0ZU5vZGUoKnB1aU5vZGVJZCk7CisJCQlicmVhazsKKwkJfQorI2VuZGlmCisKKwljYXNlIGtFcGxFdmVudFR5cGVEbGxrSWRlbnRpdHk6CisJCXsKKwkJCXRFcGxEbGxJZGVudFBhcmFtICpwSWRlbnRQYXJhbTsKKworCQkJcElkZW50UGFyYW0gPSAodEVwbERsbElkZW50UGFyYW0gKikgcEV2ZW50X3AtPm1fcEFyZzsKKwkJCWlmIChwSWRlbnRQYXJhbS0+bV91aVNpemVPZlN0cnVjdCA+IHBFdmVudF9wLT5tX3VpU2l6ZSkgeworCQkJCXBJZGVudFBhcmFtLT5tX3VpU2l6ZU9mU3RydWN0ID0KKwkJCQkgICAgcEV2ZW50X3AtPm1fdWlTaXplOworCQkJfQorCQkJUmV0ID0gRXBsRGxsa1NldElkZW50aXR5KHBJZGVudFBhcmFtKTsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxFdmVudFR5cGVEbGxrQ29uZmlnOgorCQl7CisJCQl0RXBsRGxsQ29uZmlnUGFyYW0gKnBDb25maWdQYXJhbTsKKworCQkJcENvbmZpZ1BhcmFtID0gKHRFcGxEbGxDb25maWdQYXJhbSAqKSBwRXZlbnRfcC0+bV9wQXJnOworCQkJaWYgKHBDb25maWdQYXJhbS0+bV91aVNpemVPZlN0cnVjdCA+IHBFdmVudF9wLT5tX3VpU2l6ZSkgeworCQkJCXBDb25maWdQYXJhbS0+bV91aVNpemVPZlN0cnVjdCA9CisJCQkJICAgIHBFdmVudF9wLT5tX3VpU2l6ZTsKKwkJCX0KKwkJCVJldCA9IEVwbERsbGtDb25maWcocENvbmZpZ1BhcmFtKTsKKwkJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKy8vRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrQ2FsQXN5bmNHZXRUeENvdW50KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmV0dXJucyBjb3VudCBvZiBUeCBmcmFtZXMgb2YgRklGTyB3aXRoIGhpZ2hlc3QgcHJpb3JpdHkKKy8vCisvLyBQYXJhbWV0ZXJzOiAgbm9uZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGxrQ2FsQXN5bmNHZXRUeENvdW50KHRFcGxEbGxBc3luY1JlcVByaW9yaXR5ICogcFByaW9yaXR5X3AsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgKnB1aUNvdW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisJdW5zaWduZWQgbG9uZyB1bEZyYW1lQ291bnQ7CisKKwkvLyBnZXQgZnJhbWUgY291bnQgb2YgVHggRklGTyB3aXRoIE5NVCByZXF1ZXN0IHByaW9yaXR5CisJU2hiRXJyb3IgPQorCSAgICBTaGJDaXJHZXRSZWFkQmxvY2tDb3VudChFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1NoYkluc3RhbmNlVHhObXQsCisJCQkJICAgICZ1bEZyYW1lQ291bnQpOworCS8vIHJldHVybnMga1NoYk9rLCBrU2hiSW52YWxpZEFyZworCisJLy8gZXJyb3IgaGFuZGxpbmcKKwlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKHVsRnJhbWVDb3VudCA+CisJICAgIEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU3RhdGlzdGljcy5tX3VsTWF4VHhGcmFtZUNvdW50Tm10KSB7CisJCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU3RhdGlzdGljcy5tX3VsTWF4VHhGcmFtZUNvdW50Tm10ID0KKwkJICAgIHVsRnJhbWVDb3VudDsKKwl9CisKKwlpZiAodWxGcmFtZUNvdW50ICE9IDApIHsJLy8gTk1UIHJlcXVlc3RzIGFyZSBpbiBxdWV1ZQorCQkqcFByaW9yaXR5X3AgPSBrRXBsRGxsQXN5bmNSZXFQcmlvTm10OworCQkqcHVpQ291bnRfcCA9ICh1bnNpZ25lZCBpbnQpdWxGcmFtZUNvdW50OworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGdldCBmcmFtZSBjb3VudCBvZiBUeCBGSUZPIHdpdGggZ2VuZXJpYyBwcmlvcml0eQorCVNoYkVycm9yID0KKwkgICAgU2hiQ2lyR2V0UmVhZEJsb2NrQ291bnQoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TaGJJbnN0YW5jZVR4R2VuLAorCQkJCSAgICAmdWxGcmFtZUNvdW50KTsKKwkvLyByZXR1cm5zIGtTaGJPaywga1NoYkludmFsaWRBcmcKKworCS8vIGVycm9yIGhhbmRsaW5nCisJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgeworCQlSZXQgPSBrRXBsTm9SZXNvdXJjZTsKKwkJZ290byBFeGl0OworCX0KKworCWlmICh1bEZyYW1lQ291bnQgPgorCSAgICBFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1N0YXRpc3RpY3MubV91bE1heFR4RnJhbWVDb3VudEdlbikgeworCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1N0YXRpc3RpY3MubV91bE1heFR4RnJhbWVDb3VudEdlbiA9CisJCSAgICB1bEZyYW1lQ291bnQ7CisJfQorCisJKnBQcmlvcml0eV9wID0ga0VwbERsbEFzeW5jUmVxUHJpb0dlbmVyaWM7CisJKnB1aUNvdW50X3AgPSAodW5zaWduZWQgaW50KXVsRnJhbWVDb3VudDsKKworICAgICAgRXhpdDoKKyNlbHNlCisJaWYgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlGcmFtZVNpemVObXQgPiAwKSB7CisJCSpwUHJpb3JpdHlfcCA9IGtFcGxEbGxBc3luY1JlcVByaW9ObXQ7CisJCSpwdWlDb3VudF9wID0gMTsKKwl9IGVsc2UgaWYgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlGcmFtZVNpemVHZW4gPiAwKSB7CisJCSpwUHJpb3JpdHlfcCA9IGtFcGxEbGxBc3luY1JlcVByaW9HZW5lcmljOworCQkqcHVpQ291bnRfcCA9IDE7CisJfSBlbHNlIHsKKwkJKnBQcmlvcml0eV9wID0ga0VwbERsbEFzeW5jUmVxUHJpb0dlbmVyaWM7CisJCSpwdWlDb3VudF9wID0gMDsKKwl9CisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtDYWxBc3luY0dldFR4RnJhbWUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZXR1cm5zIFR4IGZyYW1lcyBmcm9tIEZJRk8gd2l0aCBzcGVjaWZpZWQgcHJpb3JpdHkKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEZyYW1lX3AgICAgICAgICAgICAgICAgPSBJTjogcG9pbnRlciB0byBidWZmZXIKKy8vICAgICAgICAgICAgICBwdWlGcmFtZVNpemVfcCAgICAgICAgICA9IElOOiBtYXggc2l6ZSBvZiBidWZmZXIKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDogYWN0dWFsIHNpemUgb2YgZnJhbWUKKy8vICAgICAgICAgICAgICBQcmlvcml0eV9wICAgICAgICAgICAgICA9IElOOiBwcmlvcml0eQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGxrQ2FsQXN5bmNHZXRUeEZyYW1lKHZvaWQgKnBGcmFtZV9wLAorCQkJCSAgICAgdW5zaWduZWQgaW50ICpwdWlGcmFtZVNpemVfcCwKKwkJCQkgICAgIHRFcGxEbGxBc3luY1JlcVByaW9yaXR5IFByaW9yaXR5X3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisJdW5zaWduZWQgbG9uZyB1bEZyYW1lU2l6ZTsKKworCXN3aXRjaCAoUHJpb3JpdHlfcCkgeworCWNhc2Uga0VwbERsbEFzeW5jUmVxUHJpb05tdDoJLy8gTk1UIHJlcXVlc3QgcHJpb3JpdHkKKwkJU2hiRXJyb3IgPQorCQkgICAgU2hiQ2lyUmVhZERhdGFCbG9jayhFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1NoYkluc3RhbmNlVHhObXQsCisJCQkJCShCWVRFICopIHBGcmFtZV9wLCAqcHVpRnJhbWVTaXplX3AsCisJCQkJCSZ1bEZyYW1lU2l6ZSk7CisJCS8vIHJldHVybnMga1NoYk9rLCBrU2hiRGF0YVRydW5jYXRlZCwga1NoYkludmFsaWRBcmcsIGtTaGJOb1JlYWRhYmxlRGF0YQorCQlicmVhazsKKworCWRlZmF1bHQ6CQkvLyBnZW5lcmljIHByaW9yaXR5CisJCVNoYkVycm9yID0KKwkJICAgIFNoYkNpclJlYWREYXRhQmxvY2soRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TaGJJbnN0YW5jZVR4R2VuLAorCQkJCQkoQllURSAqKSBwRnJhbWVfcCwgKnB1aUZyYW1lU2l6ZV9wLAorCQkJCQkmdWxGcmFtZVNpemUpOworCQkvLyByZXR1cm5zIGtTaGJPaywga1NoYkRhdGFUcnVuY2F0ZWQsIGtTaGJJbnZhbGlkQXJnLCBrU2hiTm9SZWFkYWJsZURhdGEKKwkJYnJlYWs7CisKKwl9CisKKwkvLyBlcnJvciBoYW5kbGluZworCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJaWYgKFNoYkVycm9yID09IGtTaGJOb1JlYWRhYmxlRGF0YSkgeworCQkJUmV0ID0ga0VwbERsbEFzeW5jVHhCdWZmZXJFbXB0eTsKKwkJfSBlbHNlIHsJLy8gb3RoZXIgZXJyb3IKKwkJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCQl9CisJCWdvdG8gRXhpdDsKKwl9CisKKwkqcHVpRnJhbWVTaXplX3AgPSAodW5zaWduZWQgaW50KXVsRnJhbWVTaXplOworCisgICAgICBFeGl0OgorI2Vsc2UKKwlzd2l0Y2ggKFByaW9yaXR5X3ApIHsKKwljYXNlIGtFcGxEbGxBc3luY1JlcVByaW9ObXQ6CS8vIE5NVCByZXF1ZXN0IHByaW9yaXR5CisJCSpwdWlGcmFtZVNpemVfcCA9CisJCSAgICBtaW4oKnB1aUZyYW1lU2l6ZV9wLCBFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpRnJhbWVTaXplTm10KTsKKwkJRVBMX01FTUNQWShwRnJhbWVfcCwgRXBsRGxsa0NhbEluc3RhbmNlX2cubV9hYkZyYW1lTm10LAorCQkJICAgKnB1aUZyYW1lU2l6ZV9wKTsKKwkJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aUZyYW1lU2l6ZU5tdCA9IDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoJCS8vIGdlbmVyaWMgcHJpb3JpdHkKKwkJKnB1aUZyYW1lU2l6ZV9wID0KKwkJICAgIG1pbigqcHVpRnJhbWVTaXplX3AsIEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlGcmFtZVNpemVHZW4pOworCQlFUExfTUVNQ1BZKHBGcmFtZV9wLCBFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX2FiRnJhbWVHZW4sCisJCQkgICAqcHVpRnJhbWVTaXplX3ApOworCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpRnJhbWVTaXplR2VuID0gMDsKKwkJYnJlYWs7CisJfQorCisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtDYWxBc3luY0ZyYW1lUmVjZWl2ZWQoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBwYXNzZXMgQVNuZCBmcmFtZSB0byByZWNlaXZlIEZJRk8uCisvLyAgICAgICAgICAgICAgSXQgd2lsbCBiZSBjYWxsZWQgb25seSBmb3IgZnJhbWVzIHdpdGggcmVnaXN0ZXJlZCBBc25kU2VydmljZUlkcy4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgbm9uZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGxrQ2FsQXN5bmNGcmFtZVJlY2VpdmVkKHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsRXZlbnQgRXZlbnQ7CisKKwlFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtEbGx1Q2FsOworCUV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZUFzbmRSeDsKKwlFdmVudC5tX3BBcmcgPSBwRnJhbWVJbmZvX3AtPm1fcEZyYW1lOworCUV2ZW50Lm1fdWlTaXplID0gcEZyYW1lSW5mb19wLT5tX3VpRnJhbWVTaXplOworCS8vIHBhc3MgTmV0VGltZSBvZiBmcmFtZSB0byB1c2Vyc3BhY2UKKwlFdmVudC5tX05ldFRpbWUgPSBwRnJhbWVJbmZvX3AtPm1fTmV0VGltZTsKKworCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU3RhdGlzdGljcy5tX3VsQ3VyUnhGcmFtZUNvdW50Kys7CisJfSBlbHNlIHsKKwkJRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TdGF0aXN0aWNzLm1fdWxNYXhSeEZyYW1lQ291bnQrKzsKKwl9CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGxrQ2FsQXN5bmNTZW5kKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcHV0cyB0aGUgZ2l2ZW4gZnJhbWUgaW50byB0aGUgdHJhbnNtaXQgRklGTyB3aXRoIHRoZSBzcGVjaWZpZWQKKy8vICAgICAgICAgICAgICBwcmlvcml0eS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEZyYW1lSW5mb19wICAgICAgICAgICAgPSBmcmFtZSBpbmZvIHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgIFByaW9yaXR5X3AgICAgICAgICAgICAgID0gcHJpb3JpdHkKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsa0NhbEFzeW5jU2VuZCh0RXBsRnJhbWVJbmZvICogcEZyYW1lSW5mb19wLAorCQkJICAgICAgIHRFcGxEbGxBc3luY1JlcVByaW9yaXR5IFByaW9yaXR5X3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsRXZlbnQgRXZlbnQ7CisjaWZuZGVmIEVQTF9OT19GSUZPCisJdFNoYkVycm9yIFNoYkVycm9yOworCisJc3dpdGNoIChQcmlvcml0eV9wKSB7CisJY2FzZSBrRXBsRGxsQXN5bmNSZXFQcmlvTm10OgkvLyBOTVQgcmVxdWVzdCBwcmlvcml0eQorCQlTaGJFcnJvciA9CisJCSAgICBTaGJDaXJXcml0ZURhdGFCbG9jayhFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkJIG1fU2hiSW5zdGFuY2VUeE5tdCwKKwkJCQkJIHBGcmFtZUluZm9fcC0+bV9wRnJhbWUsCisJCQkJCSBwRnJhbWVJbmZvX3AtPm1fdWlGcmFtZVNpemUpOworCQkvLyByZXR1cm5zIGtTaGJPaywga1NoYkV4Y2VlZERhdGFTaXplTGltaXQsIGtTaGJCdWZmZXJGdWxsLCBrU2hiSW52YWxpZEFyZworCQlicmVhazsKKworCWRlZmF1bHQ6CQkvLyBnZW5lcmljIHByaW9yaXR5CisJCVNoYkVycm9yID0KKwkJICAgIFNoYkNpcldyaXRlRGF0YUJsb2NrKEVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCQkgbV9TaGJJbnN0YW5jZVR4R2VuLAorCQkJCQkgcEZyYW1lSW5mb19wLT5tX3BGcmFtZSwKKwkJCQkJIHBGcmFtZUluZm9fcC0+bV91aUZyYW1lU2l6ZSk7CisJCS8vIHJldHVybnMga1NoYk9rLCBrU2hiRXhjZWVkRGF0YVNpemVMaW1pdCwga1NoYkJ1ZmZlckZ1bGwsIGtTaGJJbnZhbGlkQXJnCisJCWJyZWFrOworCisJfQorCisJLy8gZXJyb3IgaGFuZGxpbmcKKwlzd2l0Y2ggKFNoYkVycm9yKSB7CisJY2FzZSBrU2hiT2s6CisJCWJyZWFrOworCisJY2FzZSBrU2hiRXhjZWVkRGF0YVNpemVMaW1pdDoKKwkJUmV0ID0ga0VwbERsbEFzeW5jVHhCdWZmZXJGdWxsOworCQlicmVhazsKKworCWNhc2Uga1NoYkJ1ZmZlckZ1bGw6CisJCVJldCA9IGtFcGxEbGxBc3luY1R4QnVmZmVyRnVsbDsKKwkJYnJlYWs7CisKKwljYXNlIGtTaGJJbnZhbGlkQXJnOgorCWRlZmF1bHQ6CisJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCQlicmVhazsKKwl9CisKKyNlbHNlCisKKwlzd2l0Y2ggKFByaW9yaXR5X3ApIHsKKwljYXNlIGtFcGxEbGxBc3luY1JlcVByaW9ObXQ6CS8vIE5NVCByZXF1ZXN0IHByaW9yaXR5CisJCWlmIChFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpRnJhbWVTaXplTm10ID09IDApIHsKKwkJCUVQTF9NRU1DUFkoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9hYkZyYW1lTm10LAorCQkJCSAgIHBGcmFtZUluZm9fcC0+bV9wRnJhbWUsCisJCQkJICAgcEZyYW1lSW5mb19wLT5tX3VpRnJhbWVTaXplKTsKKwkJCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlGcmFtZVNpemVObXQgPQorCQkJICAgIHBGcmFtZUluZm9fcC0+bV91aUZyYW1lU2l6ZTsKKwkJfSBlbHNlIHsKKwkJCVJldCA9IGtFcGxEbGxBc3luY1R4QnVmZmVyRnVsbDsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CQkvLyBnZW5lcmljIHByaW9yaXR5CisJCWlmIChFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpRnJhbWVTaXplR2VuID09IDApIHsKKwkJCUVQTF9NRU1DUFkoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9hYkZyYW1lR2VuLAorCQkJCSAgIHBGcmFtZUluZm9fcC0+bV9wRnJhbWUsCisJCQkJICAgcEZyYW1lSW5mb19wLT5tX3VpRnJhbWVTaXplKTsKKwkJCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlGcmFtZVNpemVHZW4gPQorCQkJICAgIHBGcmFtZUluZm9fcC0+bV91aUZyYW1lU2l6ZTsKKwkJfSBlbHNlIHsKKwkJCVJldCA9IGtFcGxEbGxBc3luY1R4QnVmZmVyRnVsbDsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQlicmVhazsKKwl9CisKKyNlbmRpZgorCisJLy8gcG9zdCBldmVudCB0byBETEwKKwlFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtEbGxrOworCUV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZURsbGtGaWxsVHg7CisJRVBMX01FTVNFVCgmRXZlbnQubV9OZXRUaW1lLCAweDAwLCBzaXplb2YoRXZlbnQubV9OZXRUaW1lKSk7CisJRXZlbnQubV9wQXJnID0gJlByaW9yaXR5X3A7CisJRXZlbnQubV91aVNpemUgPSBzaXplb2YoUHJpb3JpdHlfcCk7CisJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworCisjaWZkZWYgRVBMX05PX0ZJRk8KKyAgICAgIEV4aXQ6CisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtDYWxBc3luY0NsZWFyQnVmZmVyKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogY2xlYXJzIHRoZSB0cmFuc21pdCBidWZmZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgKG5vbmUpCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtDYWxBc3luY0NsZWFyQnVmZmVyKHZvaWQpCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisKKwlTaGJFcnJvciA9CisJICAgIFNoYkNpclJlc2V0QnVmZmVyKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU2hiSW5zdGFuY2VUeE5tdCwgMTAwMCwKKwkJCSAgICAgIE5VTEwpOworCVNoYkVycm9yID0KKwkgICAgU2hiQ2lyUmVzZXRCdWZmZXIoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TaGJJbnN0YW5jZVR4R2VuLCAxMDAwLAorCQkJICAgICAgTlVMTCk7CisKKyNlbHNlCisJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aUZyYW1lU2l6ZU5tdCA9IDA7CisJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aUZyYW1lU2l6ZUdlbiA9IDA7CisjZW5kaWYKKworLy8gICAgRVBMX01FTVNFVCgmRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TdGF0aXN0aWNzLCAwLCBzaXplb2YgKHRFcGxEbGxrQ2FsU3RhdGlzdGljcykpOworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbGtDYWxBc3luY0NsZWFyUXVldWVzKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogY2xlYXJzIHRoZSB0cmFuc21pdCBidWZmZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgKG5vbmUpCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQordEVwbEtlcm5lbCBFcGxEbGxrQ2FsQXN5bmNDbGVhclF1ZXVlcyh2b2lkKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBjbGVhciBNTiBhc3luY2hyb25vdXMgcXVldWVzCisJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aU5leHRRdWV1ZUNuUmVxdWVzdCA9IDA7CisJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aU5leHRSZXF1ZXN0UXVldWUgPSAwOworCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlSZWFkSWRlbnRSZXEgPSAwOworCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlXcml0ZUlkZW50UmVxID0gMDsKKwlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpUmVhZFN0YXR1c1JlcSA9IDA7CisJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aVdyaXRlU3RhdHVzUmVxID0gMDsKKworCXJldHVybiBSZXQ7Cit9CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0NhbEdldFN0YXRpc3RpY3MoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZXR1cm5zIHN0YXRpc3RpY3Mgb2YgdGhlIGFzeW5jaHJvbm91cyBxdWV1ZXMuCisvLworLy8gUGFyYW1ldGVyczogIHBwU3RhdGlzdGljcyAgICAgICAgICAgID0gc3RhdGlzdGljcyBzdHJ1Y3R1cmUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsa0NhbEdldFN0YXRpc3RpY3ModEVwbERsbGtDYWxTdGF0aXN0aWNzICoqIHBwU3RhdGlzdGljcykKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworI2lmbmRlZiBFUExfTk9fRklGTworCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCVNoYkVycm9yID0KKwkgICAgU2hiQ2lyR2V0UmVhZEJsb2NrQ291bnQoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TaGJJbnN0YW5jZVR4Tm10LAorCQkJCSAgICAmRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TdGF0aXN0aWNzLgorCQkJCSAgICBtX3VsQ3VyVHhGcmFtZUNvdW50Tm10KTsKKwlTaGJFcnJvciA9CisJICAgIFNoYkNpckdldFJlYWRCbG9ja0NvdW50KEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU2hiSW5zdGFuY2VUeEdlbiwKKwkJCQkgICAgJkVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU3RhdGlzdGljcy4KKwkJCQkgICAgbV91bEN1clR4RnJhbWVDb3VudEdlbik7CisvLyAgICBTaGJFcnJvciA9IFNoYkNpckdldFJlYWRCbG9ja0NvdW50IChFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1NoYkluc3RhbmNlUngsICZFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1N0YXRpc3RpY3MubV91bEN1clJ4RnJhbWVDb3VudCk7CisKKyNlbHNlCisJaWYgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlGcmFtZVNpemVObXQgPiAwKSB7CisJCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU3RhdGlzdGljcy5tX3VsQ3VyVHhGcmFtZUNvdW50Tm10ID0gMTsKKwl9IGVsc2UgeworCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1N0YXRpc3RpY3MubV91bEN1clR4RnJhbWVDb3VudE5tdCA9IDA7CisJfQorCWlmIChFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpRnJhbWVTaXplR2VuID4gMCkgeworCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1N0YXRpc3RpY3MubV91bEN1clR4RnJhbWVDb3VudEdlbiA9IDE7CisJfSBlbHNlIHsKKwkJRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TdGF0aXN0aWNzLm1fdWxDdXJUeEZyYW1lQ291bnRHZW4gPSAwOworCX0KKyNlbmRpZgorCisJKnBwU3RhdGlzdGljcyA9ICZFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX1N0YXRpc3RpY3M7CisJcmV0dXJuIFJldDsKK30KKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0NhbElzc3VlUmVxdWVzdCgpCisvLworLy8gRGVzY3JpcHRpb246IGlzc3VlcyBhIFN0YXR1c1JlcXVlc3Qgb3IgYSBJZGVudFJlcXVlc3QgdG8gdGhlIHNwZWNpZmllZCBub2RlLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBTZXJ2aWNlX3AgICAgICAgICAgICAgICA9IHJlcXVlc3Qgc2VydmljZSBJRAorLy8gICAgICAgICAgICAgIHVpTm9kZUlkX3AgICAgICAgICAgICAgID0gbm9kZSBJRAorLy8gICAgICAgICAgICAgIGJTb2FGbGFnMV9wICAgICAgICAgICAgID0gZmxhZzEgZm9yIHRoaXMgbm9kZSAodHJhbnNtaXQgaW4gU29BIGFuZCBQUmVxKQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgMHhGRiB0aGlzIGZsYWcgaXMgaWdub3JlZC4KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsa0NhbElzc3VlUmVxdWVzdCh0RXBsRGxsUmVxU2VydmljZUlkIFNlcnZpY2VfcCwKKwkJCQkgIHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLCBCWVRFIGJTb2FGbGFnMV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlpZiAoYlNvYUZsYWcxX3AgIT0gMHhGRikgeworCQlSZXQgPSBFcGxEbGxrU2V0RmxhZzFPZk5vZGUodWlOb2RlSWRfcCwgYlNvYUZsYWcxX3ApOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwl9CisJLy8gYWRkIG5vZGUgdG8gYXBwcm9wcmlhdGUgcmVxdWVzdCBxdWV1ZQorCXN3aXRjaCAoU2VydmljZV9wKSB7CisJY2FzZSBrRXBsRGxsUmVxU2VydmljZUlkZW50OgorCQl7CisJCQlpZiAoKChFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpV3JpdGVJZGVudFJlcSArCisJCQkgICAgICAxKSAlCisJCQkgICAgIHRhYmVudHJpZXMoRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJCW1fYXVpUXVldWVJZGVudFJlcSkpCisJCQkgICAgPT0gRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aVJlYWRJZGVudFJlcSkgewkvLyBxdWV1ZSBpcyBmdWxsCisJCQkJUmV0ID0ga0VwbERsbEFzeW5jVHhCdWZmZXJGdWxsOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCUVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJICAgIG1fYXVpUXVldWVJZGVudFJlcVtFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkJICAgICAgIG1fdWlXcml0ZUlkZW50UmVxXSA9IHVpTm9kZUlkX3A7CisJCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpV3JpdGVJZGVudFJlcSA9CisJCQkgICAgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlXcml0ZUlkZW50UmVxICsKKwkJCSAgICAgMSkgJQorCQkJICAgIHRhYmVudHJpZXMoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9hdWlRdWV1ZUlkZW50UmVxKTsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxEbGxSZXFTZXJ2aWNlU3RhdHVzOgorCQl7CisJCQlpZiAoKChFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpV3JpdGVTdGF0dXNSZXEgKworCQkJICAgICAgMSkgJQorCQkJICAgICB0YWJlbnRyaWVzKEVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCQltX2F1aVF1ZXVlU3RhdHVzUmVxKSkKKwkJCSAgICA9PSBFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpUmVhZFN0YXR1c1JlcSkgewkvLyBxdWV1ZSBpcyBmdWxsCisJCQkJUmV0ID0ga0VwbERsbEFzeW5jVHhCdWZmZXJGdWxsOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCUVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJICAgIG1fYXVpUXVldWVTdGF0dXNSZXFbRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJCQltX3VpV3JpdGVTdGF0dXNSZXFdID0KKwkJCSAgICB1aU5vZGVJZF9wOworCQkJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aVdyaXRlU3RhdHVzUmVxID0KKwkJCSAgICAoRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aVdyaXRlU3RhdHVzUmVxICsKKwkJCSAgICAgMSkgJQorCQkJICAgIHRhYmVudHJpZXMoRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJICAgICAgIG1fYXVpUXVldWVTdGF0dXNSZXEpOworCQkJYnJlYWs7CisJCX0KKworCWRlZmF1bHQ6CisJCXsKKwkJCVJldCA9IGtFcGxEbGxJbnZhbGlkUGFyYW07CisJCQlnb3RvIEV4aXQ7CisJCX0KKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0NhbEFzeW5jR2V0U29hUmVxdWVzdCgpCisvLworLy8gRGVzY3JpcHRpb246IHJldHVybnMgbmV4dCByZXF1ZXN0IGZvciBTb0EuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IERMTGsgbW9kdWxlLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwUmVxU2VydmljZUlkX3AgICAgICAgICA9IHBvaW50ZXIgdG8gcmVxdWVzdCBzZXJ2aWNlIElECisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTjogYXZhaWxhYmxlIHJlcXVlc3QgZm9yIE1OIE5NVCBvciBnZW5lcmljIHJlcXVlc3QgcXVldWUgKEZsYWcyLlBSKQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGtFcGxEbGxSZXFTZXJ2aWNlTm8gaWYgcXVldWVzIGFyZSBlbXB0eQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOiBuZXh0IHJlcXVlc3QKKy8vICAgICAgICAgICAgICBwdWlOb2RlSWRfcCAgICAgICAgICAgICA9IE9VVDogcG9pbnRlciB0byBub2RlIElEIG9mIG5leHQgcmVxdWVzdAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEVQTF9DX0FEUl9JTlZBTElELCBpZiByZXF1ZXN0IGlzIHNlbGYgYWRkcmVzc2VkCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbGtDYWxBc3luY0dldFNvYVJlcXVlc3QodEVwbERsbFJlcVNlcnZpY2VJZCAqIHBSZXFTZXJ2aWNlSWRfcCwKKwkJCQkJdW5zaWduZWQgaW50ICpwdWlOb2RlSWRfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXVuc2lnbmVkIGludCB1aUNvdW50OworCisvLyAgICAqcFJlcVNlcnZpY2VJZF9wID0ga0VwbERsbFJlcVNlcnZpY2VObzsKKworCWZvciAodWlDb3VudCA9IEVQTF9ETExLQ0FMX01BWF9RVUVVRVM7IHVpQ291bnQgPiAwOyB1aUNvdW50LS0pIHsKKwkJc3dpdGNoIChFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpTmV4dFJlcXVlc3RRdWV1ZSkgeworCQljYXNlIDA6CisJCQl7CS8vIENuR2VuUmVxCisJCQkJZm9yICg7CisJCQkJICAgICBFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkgICAgIG1fdWlOZXh0UXVldWVDblJlcXVlc3QgPAorCQkJCSAgICAgKHRhYmVudHJpZXMKKwkJCQkgICAgICAoRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJICAgICAgIG1fYXVpUXVldWVDblJlcXVlc3RzKSAvIDIpOworCQkJCSAgICAgRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJICAgICBtX3VpTmV4dFF1ZXVlQ25SZXF1ZXN0KyspIHsKKwkJCQkJaWYgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fYXVpUXVldWVDblJlcXVlc3RzW0VwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlOZXh0UXVldWVDblJlcXVlc3RdID4gMCkgewkvLyBub24gZW1wdHkgcXVldWUgZm91bmQKKwkJCQkJCS8vIHJlbW92ZSBvbmUgcmVxdWVzdCBmcm9tIHF1ZXVlCisJCQkJCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkJCSAgICBtX2F1aVF1ZXVlQ25SZXF1ZXN0cworCQkJCQkJICAgIFtFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgbV91aU5leHRRdWV1ZUNuUmVxdWVzdF0tLTsKKwkJCQkJCSpwdWlOb2RlSWRfcCA9CisJCQkJCQkgICAgRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJCQkgICAgbV91aU5leHRRdWV1ZUNuUmVxdWVzdCArIDE7CisJCQkJCQkqcFJlcVNlcnZpY2VJZF9wID0KKwkJCQkJCSAgICBrRXBsRGxsUmVxU2VydmljZVVuc3BlY2lmaWVkOworCQkJCQkJRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJCQkgICAgbV91aU5leHRRdWV1ZUNuUmVxdWVzdCsrOworCQkJCQkJaWYgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlOZXh0UXVldWVDblJlcXVlc3QgPj0gKHRhYmVudHJpZXMoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9hdWlRdWV1ZUNuUmVxdWVzdHMpIC8gMikpIHsJLy8gbGFzdCBub2RlIHJlYWNoZWQKKwkJCQkJCQkvLyBjb250aW51ZSB3aXRoIENuTm10UmVxIHF1ZXVlIGF0IG5leHQgU29BCisJCQkJCQkJRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJCQkJICAgIG1fdWlOZXh0UmVxdWVzdFF1ZXVlCisJCQkJCQkJICAgID0gMTsKKwkJCQkJCX0KKwkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJfQorCQkJCX0KKwkJCQkvLyBhbGwgQ25HZW5SZXEgcXVldWVzIGFyZSBlbXB0eSAtPiBjb250aW51ZSB3aXRoIENuTm10UmVxIHF1ZXVlCisJCQkJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aU5leHRSZXF1ZXN0UXVldWUgPSAxOworCQkJCWJyZWFrOworCQkJfQorCisJCWNhc2UgMToKKwkJCXsJLy8gQ25ObXRSZXEKKwkJCQlmb3IgKDsKKwkJCQkgICAgIEVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCSAgICAgbV91aU5leHRRdWV1ZUNuUmVxdWVzdCA8CisJCQkJICAgICB0YWJlbnRyaWVzKEVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCQkJbV9hdWlRdWV1ZUNuUmVxdWVzdHMpOworCQkJCSAgICAgRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJICAgICBtX3VpTmV4dFF1ZXVlQ25SZXF1ZXN0KyspIHsKKwkJCQkJaWYgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fYXVpUXVldWVDblJlcXVlc3RzW0VwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlOZXh0UXVldWVDblJlcXVlc3RdID4gMCkgewkvLyBub24gZW1wdHkgcXVldWUgZm91bmQKKwkJCQkJCS8vIHJlbW92ZSBvbmUgcmVxdWVzdCBmcm9tIHF1ZXVlCisJCQkJCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkJCSAgICBtX2F1aVF1ZXVlQ25SZXF1ZXN0cworCQkJCQkJICAgIFtFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgbV91aU5leHRRdWV1ZUNuUmVxdWVzdF0tLTsKKwkJCQkJCSpwdWlOb2RlSWRfcCA9CisJCQkJCQkgICAgRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJCQkgICAgbV91aU5leHRRdWV1ZUNuUmVxdWVzdCArIDEgLQorCQkJCQkJICAgICh0YWJlbnRyaWVzCisJCQkJCQkgICAgIChFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgIG1fYXVpUXVldWVDblJlcXVlc3RzKSAvCisJCQkJCQkgICAgIDIpOworCQkJCQkJKnBSZXFTZXJ2aWNlSWRfcCA9CisJCQkJCQkgICAga0VwbERsbFJlcVNlcnZpY2VObXRSZXF1ZXN0OworCQkJCQkJRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJCQkgICAgbV91aU5leHRRdWV1ZUNuUmVxdWVzdCsrOworCQkJCQkJaWYgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlOZXh0UXVldWVDblJlcXVlc3QgPiB0YWJlbnRyaWVzKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fYXVpUXVldWVDblJlcXVlc3RzKSkgewkvLyBsYXN0IG5vZGUgcmVhY2hlZAorCQkJCQkJCS8vIHJlc3RhcnQgQ25HZW5SZXEgcXVldWUKKwkJCQkJCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy4KKwkJCQkJCQkgICAgbV91aU5leHRRdWV1ZUNuUmVxdWVzdAorCQkJCQkJCSAgICA9IDA7CisJCQkJCQkJLy8gY29udGludWUgd2l0aCBNbkdlblJlcSBxdWV1ZSBhdCBuZXh0IFNvQQorCQkJCQkJCUVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCQkJCSAgICBtX3VpTmV4dFJlcXVlc3RRdWV1ZQorCQkJCQkJCSAgICA9IDI7CisJCQkJCQl9CisJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCX0KKwkJCQl9CisJCQkJLy8gcmVzdGFydCBDbkdlblJlcSBxdWV1ZQorCQkJCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlOZXh0UXVldWVDblJlcXVlc3QgPSAwOworCQkJCS8vIGFsbCBDbk5tdFJlcSBxdWV1ZXMgYXJlIGVtcHR5IC0+IGNvbnRpbnVlIHdpdGggTW5HZW5SZXEgcXVldWUKKwkJCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpTmV4dFJlcXVlc3RRdWV1ZSA9IDI7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJY2FzZSAyOgorCQkJewkvLyBNbk5tdFJlcSBhbmQgTW5HZW5SZXEKKwkJCQkvLyBuZXh0IHF1ZXVlIHdpbGwgYmUgTW5JZGVudFJlcSBxdWV1ZQorCQkJCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlOZXh0UmVxdWVzdFF1ZXVlID0gMzsKKwkJCQlpZiAoKnBSZXFTZXJ2aWNlSWRfcCAhPSBrRXBsRGxsUmVxU2VydmljZU5vKSB7CisJCQkJCSpwdWlOb2RlSWRfcCA9IEVQTF9DX0FEUl9JTlZBTElEOwkvLyBETExrIG11c3QgZXhjaGFuZ2UgdGhpcyB3aXRoIHRoZSBhY3R1YWwgbm9kZSBJRAorCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCWNhc2UgMzoKKwkJCXsJLy8gTW5JZGVudFJlcQorCQkJCS8vIG5leHQgcXVldWUgd2lsbCBiZSBNblN0YXR1c1JlcSBxdWV1ZQorCQkJCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlOZXh0UmVxdWVzdFF1ZXVlID0gNDsKKwkJCQlpZiAoRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aVJlYWRJZGVudFJlcSAhPSBFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpV3JpdGVJZGVudFJlcSkgewkvLyBxdWV1ZSBpcyBub3QgZW1wdHkKKwkJCQkJKnB1aU5vZGVJZF9wID0KKwkJCQkJICAgIEVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9hdWlRdWV1ZUlkZW50UmVxCisJCQkJCSAgICBbRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJCSAgICAgbV91aVJlYWRJZGVudFJlcV07CisJCQkJCUVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlSZWFkSWRlbnRSZXEgPQorCQkJCQkgICAgKEVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCQkgICAgIG1fdWlSZWFkSWRlbnRSZXEgKworCQkJCQkgICAgIDEpICUKKwkJCQkJICAgIHRhYmVudHJpZXMoRXBsRGxsa0NhbEluc3RhbmNlX2cuCisJCQkJCQkgICAgICAgbV9hdWlRdWV1ZUlkZW50UmVxKTsKKwkJCQkJKnBSZXFTZXJ2aWNlSWRfcCA9CisJCQkJCSAgICBrRXBsRGxsUmVxU2VydmljZUlkZW50OworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCWNhc2UgNDoKKwkJCXsJLy8gTW5TdGF0dXNSZXEKKwkJCQkvLyBuZXh0IHF1ZXVlIHdpbGwgYmUgQ25HZW5SZXEgcXVldWUKKwkJCQlFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX3VpTmV4dFJlcXVlc3RRdWV1ZSA9IDA7CisJCQkJaWYgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlSZWFkU3RhdHVzUmVxICE9IEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fdWlXcml0ZVN0YXR1c1JlcSkgewkvLyBxdWV1ZSBpcyBub3QgZW1wdHkKKwkJCQkJKnB1aU5vZGVJZF9wID0KKwkJCQkJICAgIEVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9hdWlRdWV1ZVN0YXR1c1JlcQorCQkJCQkgICAgW0VwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCQkgICAgIG1fdWlSZWFkU3RhdHVzUmVxXTsKKwkJCQkJRXBsRGxsa0NhbEluc3RhbmNlX2cubV91aVJlYWRTdGF0dXNSZXEgPQorCQkJCQkgICAgKEVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCQkgICAgIG1fdWlSZWFkU3RhdHVzUmVxICsKKwkJCQkJICAgICAxKSAlCisJCQkJCSAgICB0YWJlbnRyaWVzKEVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCQkJICAgICAgIG1fYXVpUXVldWVTdGF0dXNSZXEpOworCQkJCQkqcFJlcVNlcnZpY2VJZF9wID0KKwkJCQkJICAgIGtFcGxEbGxSZXFTZXJ2aWNlU3RhdHVzOworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCX0KKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsa0NhbEFzeW5jU2V0UGVuZGluZ1JlcXVlc3RzKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogc2V0cyB0aGUgcGVuZGluZyBhc3luY2hyb25vdXMgZnJhbWUgcmVxdWVzdHMgb2YgdGhlIHNwZWNpZmllZCBub2RlLgorLy8gICAgICAgICAgICAgIFRoaXMgd2lsbCBhZGQgdGhlIG5vZGUgdG8gdGhlIGFzeW5jaHJvbm91cyByZXF1ZXN0IHNjaGVkdWxlci4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBub2RlIElECisvLyAgICAgICAgICAgICAgQXN5bmNSZXFQcmlvX3AgICAgICAgICAgPSBhc3luY2hyb25vdXMgcmVxdWVzdCBwcmlvcml0eQorLy8gICAgICAgICAgICAgIHVpQ291bnRfcCAgICAgICAgICAgICAgID0gY291bnQgb2YgYXN5bmNocm9ub3VzIGZyYW1lcworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGxrQ2FsQXN5bmNTZXRQZW5kaW5nUmVxdWVzdHModW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCSAgICAgdEVwbERsbEFzeW5jUmVxUHJpb3JpdHkKKwkJCQkJICAgICBBc3luY1JlcVByaW9fcCwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlDb3VudF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBhZGQgbm9kZSB0byBhcHByb3ByaWF0ZSByZXF1ZXN0IHF1ZXVlCisJc3dpdGNoIChBc3luY1JlcVByaW9fcCkgeworCWNhc2Uga0VwbERsbEFzeW5jUmVxUHJpb05tdDoKKwkJeworCQkJdWlOb2RlSWRfcC0tOworCQkJaWYgKHVpTm9kZUlkX3AgPj0KKwkJCSAgICAodGFiZW50cmllcworCQkJICAgICAoRXBsRGxsa0NhbEluc3RhbmNlX2cubV9hdWlRdWV1ZUNuUmVxdWVzdHMpIC8gMikpIHsKKwkJCQlSZXQgPSBrRXBsRGxsSW52YWxpZFBhcmFtOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCXVpTm9kZUlkX3AgKz0KKwkJCSAgICB0YWJlbnRyaWVzKEVwbERsbGtDYWxJbnN0YW5jZV9nLgorCQkJCSAgICAgICBtX2F1aVF1ZXVlQ25SZXF1ZXN0cykgLyAyOworCQkJRXBsRGxsa0NhbEluc3RhbmNlX2cubV9hdWlRdWV1ZUNuUmVxdWVzdHNbdWlOb2RlSWRfcF0gPQorCQkJICAgIHVpQ291bnRfcDsKKwkJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQl7CisJCQl1aU5vZGVJZF9wLS07CisJCQlpZiAodWlOb2RlSWRfcCA+PQorCQkJICAgICh0YWJlbnRyaWVzCisJCQkgICAgIChFcGxEbGxrQ2FsSW5zdGFuY2VfZy5tX2F1aVF1ZXVlQ25SZXF1ZXN0cykgLyAyKSkgeworCQkJCVJldCA9IGtFcGxEbGxJbnZhbGlkUGFyYW07CisJCQkJZ290byBFeGl0OworCQkJfQorCQkJRXBsRGxsa0NhbEluc3RhbmNlX2cubV9hdWlRdWV1ZUNuUmVxdWVzdHNbdWlOb2RlSWRfcF0gPQorCQkJICAgIHVpQ291bnRfcDsKKwkJCWJyZWFrOworCQl9CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisjZW5kaWYgLy8oKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIENhbGxiYWNrIGhhbmRsZXIgZm9yIG5ldyBkYXRhIHNpZ25hbGluZworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBFUExfTk9fRklGTworLypzdGF0aWMgdm9pZCAgRXBsRGxsa0NhbFR4Tm10U2lnbmFsSGFuZGxlciAoCisgICAgdFNoYkluc3RhbmNlIHBTaGJSeEluc3RhbmNlX3AsCisgICAgdW5zaWduZWQgbG9uZyB1bERhdGFTaXplX3ApCit7Cit0RXBsS2VybmVsICAgICAgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7Cit0RXBsRXZlbnQgICAgICAgRXZlbnQ7Cit0RXBsRGxsQXN5bmNSZXFQcmlvcml0eSBQcmlvcml0eTsKKyNpZm5kZWYgRVBMX05PX0ZJRk8KK3RTaGJFcnJvciAgIFNoYkVycm9yOwordW5zaWduZWQgbG9uZyAgIHVsQmxvY2tDb3VudDsKKworICAgIFNoYkVycm9yID0gU2hiQ2lyR2V0UmVhZEJsb2NrQ291bnQgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU2hiSW5zdGFuY2VUeE5tdCwgJnVsQmxvY2tDb3VudCk7CisgICAgaWYgKHVsQmxvY2tDb3VudCA+IEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU3RhdGlzdGljcy5tX3VsTWF4VHhGcmFtZUNvdW50Tm10KQorICAgIHsKKyAgICAgICAgRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TdGF0aXN0aWNzLm1fdWxNYXhUeEZyYW1lQ291bnRObXQgPSB1bEJsb2NrQ291bnQ7CisgICAgfQorCisjZW5kaWYKKworICAgIC8vIHBvc3QgZXZlbnQgdG8gRExMCisgICAgUHJpb3JpdHkgPSBrRXBsRGxsQXN5bmNSZXFQcmlvTm10OworICAgIEV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua0RsbGs7CisgICAgRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlRGxsa0ZpbGxUeDsKKyAgICBFUExfTUVNU0VUKCZFdmVudC5tX05ldFRpbWUsIDB4MDAsIHNpemVvZihFdmVudC5tX05ldFRpbWUpKTsKKyAgICBFdmVudC5tX3BBcmcgPSAmUHJpb3JpdHk7CisgICAgRXZlbnQubV91aVNpemUgPSBzaXplb2YoUHJpb3JpdHkpOworICAgIFJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKworfQorCitzdGF0aWMgdm9pZCAgRXBsRGxsa0NhbFR4R2VuU2lnbmFsSGFuZGxlciAoCisgICAgdFNoYkluc3RhbmNlIHBTaGJSeEluc3RhbmNlX3AsCisgICAgdW5zaWduZWQgbG9uZyB1bERhdGFTaXplX3ApCit7Cit0RXBsS2VybmVsICAgICAgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7Cit0RXBsRXZlbnQgICAgICAgRXZlbnQ7Cit0RXBsRGxsQXN5bmNSZXFQcmlvcml0eSBQcmlvcml0eTsKKyNpZm5kZWYgRVBMX05PX0ZJRk8KK3RTaGJFcnJvciAgIFNoYkVycm9yOwordW5zaWduZWQgbG9uZyAgIHVsQmxvY2tDb3VudDsKKworICAgIFNoYkVycm9yID0gU2hiQ2lyR2V0UmVhZEJsb2NrQ291bnQgKEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU2hiSW5zdGFuY2VUeEdlbiwgJnVsQmxvY2tDb3VudCk7CisgICAgaWYgKHVsQmxvY2tDb3VudCA+IEVwbERsbGtDYWxJbnN0YW5jZV9nLm1fU3RhdGlzdGljcy5tX3VsTWF4VHhGcmFtZUNvdW50R2VuKQorICAgIHsKKyAgICAgICAgRXBsRGxsa0NhbEluc3RhbmNlX2cubV9TdGF0aXN0aWNzLm1fdWxNYXhUeEZyYW1lQ291bnRHZW4gPSB1bEJsb2NrQ291bnQ7CisgICAgfQorCisjZW5kaWYKKworICAgIC8vIHBvc3QgZXZlbnQgdG8gRExMCisgICAgUHJpb3JpdHkgPSBrRXBsRGxsQXN5bmNSZXFQcmlvR2VuZXJpYzsKKyAgICBFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtEbGxrOworICAgIEV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZURsbGtGaWxsVHg7CisgICAgRVBMX01FTVNFVCgmRXZlbnQubV9OZXRUaW1lLCAweDAwLCBzaXplb2YoRXZlbnQubV9OZXRUaW1lKSk7CisgICAgRXZlbnQubV9wQXJnID0gJlByaW9yaXR5OworICAgIEV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKFByaW9yaXR5KTsKKyAgICBSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisKK30KKyovCisjZW5kaWYKKworI2VuZGlmIC8vICNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMSykpICE9IDApCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxEbGx1Q2FsLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbERsbHVDYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjRhMTc0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxEbGx1Q2FsLmMKQEAgLTAsMCArMSw1MjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgRExMIENvbW11bmljYXRpb24gQWJzdHJhY3Rpb24gTGF5ZXIgbW9kdWxlIGluIEVQTCB1c2VyIHBhcnQKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxEbGx1Q2FsLmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjcgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8yMCBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ1c2VyL0VwbERsbHVDYWwuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbEV2ZW50dS5oIgorCisjaW5jbHVkZSAiRXBsRGxsQ2FsLmgiCisKKy8vIGluY2x1ZGUgb25seSBpZiBkaXJlY3QgY2FsbCBiZXR3ZWVuIHVzZXItIGFuZCBrZXJuZWxzcGFjZSBpcyBlbmFibGVkCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTEspKSAhPSAwKQorI2luY2x1ZGUgImtlcm5lbC9FcGxEbGxrQ2FsLmgiCisjZW5kaWYKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExVKSkgIT0gMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEMgTCBBIFMgUyAgRXBsRGxsdUNhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbERsbHVDYkFzbmQgbV9hcGZuRGxsdUNiQXNuZFtFUExfRExMX01BWF9BU05EX1NFUlZJQ0VfSURdOworCit9IHRFcGxEbGx1Q2FsSW5zdGFuY2U7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBpZiBubyBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uIHNoYWxsIGJlIHVzZWQKKy8vIGRlZmluZSBzdHJ1Y3R1cmVzIHN0YXRpY2FsbHkKK3N0YXRpYyB0RXBsRGxsdUNhbEluc3RhbmNlIEVwbERsbHVDYWxJbnN0YW5jZV9nOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsRGxsdUNhbFNldEFzbmRTZXJ2aWNlSWRGaWx0ZXIodEVwbERsbEFzbmRTZXJ2aWNlSWQKKwkJCQkJCSAgIFNlcnZpY2VJZF9wLAorCQkJCQkJICAgdEVwbERsbEFzbmRGaWx0ZXIgRmlsdGVyX3ApOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsdUNhbEFkZEluc3RhbmNlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogYWRkIGFuZCBpbml0aWFsaXplIG5ldyBpbnN0YW5jZSBvZiBETEwgQ0FMIG1vZHVsZQorLy8KKy8vIFBhcmFtZXRlcnM6ICBub25lCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbHVDYWxBZGRJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIHJlc2V0IGluc3RhbmNlIHN0cnVjdHVyZQorCUVQTF9NRU1TRVQoJkVwbERsbHVDYWxJbnN0YW5jZV9nLCAwLCBzaXplb2YoRXBsRGxsdUNhbEluc3RhbmNlX2cpKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbHVDYWxEZWxJbnN0YW5jZSgpCisvLworLy8gRGVzY3JpcHRpb246IGRlbGV0ZXMgYW4gaW5zdGFuY2Ugb2YgRExMIENBTCBtb2R1bGUKKy8vCisvLyBQYXJhbWV0ZXJzOiAgbm9uZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxEbGx1Q2FsRGVsSW5zdGFuY2UoKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyByZXNldCBpbnN0YW5jZSBzdHJ1Y3R1cmUKKwlFUExfTUVNU0VUKCZFcGxEbGx1Q2FsSW5zdGFuY2VfZywgMCwgc2l6ZW9mKEVwbERsbHVDYWxJbnN0YW5jZV9nKSk7CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxEbGx1Q2FsUHJvY2VzcworLy8KKy8vIERlc2NyaXB0aW9uOiBwcm9jZXNzIHRoZSBwYXNzZWQgYXN5bmNoIGZyYW1lCisvLworLy8gUGFyYW1ldGVyczogIHBFdmVudF9wICAgICAgICAgICAgICAgID0gZXZlbnQgY29udGFpbmluZyBmcmFtZSB0byBiZSBwcm9jZXNzZWQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsdUNhbFByb2Nlc3ModEVwbEV2ZW50ICogcEV2ZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsTXNnVHlwZSBNc2dUeXBlOworCXVuc2lnbmVkIGludCB1aUFzbmRTZXJ2aWNlSWQ7CisJdEVwbEZyYW1lSW5mbyBGcmFtZUluZm87CisKKwlpZiAocEV2ZW50X3AtPm1fRXZlbnRUeXBlID09IGtFcGxFdmVudFR5cGVBc25kUngpIHsKKwkJRnJhbWVJbmZvLm1fcEZyYW1lID0gKHRFcGxGcmFtZSAqKSBwRXZlbnRfcC0+bV9wQXJnOworCQlGcmFtZUluZm8ubV91aUZyYW1lU2l6ZSA9IHBFdmVudF9wLT5tX3VpU2l6ZTsKKwkJLy8gZXh0cmFjdCBOZXRUaW1lCisJCUZyYW1lSW5mby5tX05ldFRpbWUgPSBwRXZlbnRfcC0+bV9OZXRUaW1lOworCisJCU1zZ1R5cGUgPQorCQkgICAgKHRFcGxNc2dUeXBlKSBBbWlHZXRCeXRlRnJvbUxlKCZGcmFtZUluZm8ubV9wRnJhbWUtPgorCQkJCQkJICAgbV9sZV9iTWVzc2FnZVR5cGUpOworCQlpZiAoTXNnVHlwZSAhPSBrRXBsTXNnVHlwZUFzbmQpIHsKKwkJCVJldCA9IGtFcGxJbnZhbGlkT3BlcmF0aW9uOworCQkJZ290byBFeGl0OworCQl9CisKKwkJdWlBc25kU2VydmljZUlkID0KKwkJICAgICh1bnNpZ25lZCBpbnQpQW1pR2V0Qnl0ZUZyb21MZSgmRnJhbWVJbmZvLm1fcEZyYW1lLT5tX0RhdGEuCisJCQkJCQkgICBtX0FzbmQubV9sZV9iU2VydmljZUlkKTsKKwkJaWYgKHVpQXNuZFNlcnZpY2VJZCA8IEVQTF9ETExfTUFYX0FTTkRfU0VSVklDRV9JRCkgewkvLyBBU25kIHNlcnZpY2UgSUQgaXMgdmFsaWQKKwkJCWlmIChFcGxEbGx1Q2FsSW5zdGFuY2VfZy5tX2FwZm5EbGx1Q2JBc25kW3VpQXNuZFNlcnZpY2VJZF0gIT0gTlVMTCkgewkvLyBoYW5kbGVyIHdhcyByZWdpc3RlcmVkCisJCQkJUmV0ID0KKwkJCQkgICAgRXBsRGxsdUNhbEluc3RhbmNlX2cuCisJCQkJICAgIG1fYXBmbkRsbHVDYkFzbmRbdWlBc25kU2VydmljZUlkXQorCQkJCSAgICAoJkZyYW1lSW5mbyk7CisJCQl9CisJCX0KKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsdUNhbFJlZ0FzbmRTZXJ2aWNlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVnaXN0ZXJzIHRoZSBzcGVjaWZpZWQgaGFuZGxlciBmb3IgdGhlIHNwZWNpZmllZAorLy8gICAgICAgICAgICAgIEFzbmRTZXJ2aWNlSWQgd2l0aCB0aGUgc3BlY2lmaWVkIG5vZGUgSUQgZmlsdGVyLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBTZXJ2aWNlSWRfcCAgICAgICAgICAgICA9IEFTbmQgU2VydmljZSBJRAorLy8gICAgICAgICAgICAgIHBmbkRsbHVDYkFzbmRfcCAgICAgICAgID0gY2FsbGJhY2sgZnVuY3Rpb24KKy8vICAgICAgICAgICAgICBGaWx0ZXJfcCAgICAgICAgICAgICAgICA9IG5vZGUgSUQgZmlsdGVyCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbHVDYWxSZWdBc25kU2VydmljZSh0RXBsRGxsQXNuZFNlcnZpY2VJZCBTZXJ2aWNlSWRfcCwKKwkJCQkgICAgdEVwbERsbHVDYkFzbmQgcGZuRGxsdUNiQXNuZF9wLAorCQkJCSAgICB0RXBsRGxsQXNuZEZpbHRlciBGaWx0ZXJfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJaWYgKFNlcnZpY2VJZF9wIDwgdGFiZW50cmllcyhFcGxEbGx1Q2FsSW5zdGFuY2VfZy5tX2FwZm5EbGx1Q2JBc25kKSkgeworCQkvLyBtZW1vcml6ZSBmdW5jdGlvbiBwb2ludGVyCisJCUVwbERsbHVDYWxJbnN0YW5jZV9nLm1fYXBmbkRsbHVDYkFzbmRbU2VydmljZUlkX3BdID0KKwkJICAgIHBmbkRsbHVDYkFzbmRfcDsKKworCQlpZiAocGZuRGxsdUNiQXNuZF9wID09IE5VTEwpIHsJLy8gY2xvc2UgZmlsdGVyCisJCQlGaWx0ZXJfcCA9IGtFcGxEbGxBc25kRmlsdGVyTm9uZTsKKwkJfQorCQkvLyBzZXQgZmlsdGVyIGluIERMTCBtb2R1bGUgaW4ga2VybmVsIHBhcnQKKwkJUmV0ID0gRXBsRGxsdUNhbFNldEFzbmRTZXJ2aWNlSWRGaWx0ZXIoU2VydmljZUlkX3AsIEZpbHRlcl9wKTsKKworCX0KKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbHVDYWxBc3luY1NlbmQoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBzZW5kcyB0aGUgZnJhbWUgd2l0aCB0aGUgc3BlY2lmaWVkIHByaW9yaXR5LgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwRnJhbWVJbmZvX3AgICAgICAgICAgICA9IGZyYW1lCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3VpRnJhbWVTaXplIGRvZXMgbm90IGluY2x1ZGUgdGhlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGhlcm5ldCBoZWFkZXIgKDE0IGJ5dGVzKQorLy8gICAgICAgICAgICAgIFByaW9yaXR5X3AgICAgICAgICAgICAgID0gcHJpb3JpdHkKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsdUNhbEFzeW5jU2VuZCh0RXBsRnJhbWVJbmZvICogcEZyYW1lSW5mb19wLAorCQkJICAgICAgIHRFcGxEbGxBc3luY1JlcVByaW9yaXR5IFByaW9yaXR5X3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKwlwRnJhbWVJbmZvX3AtPm1fdWlGcmFtZVNpemUgKz0gMTQ7CS8vIGFkZCBzaXplIG9mIGV0aGVybmV0IGhlYWRlcgorCVJldCA9IEVwbERsbGtDYWxBc3luY1NlbmQocEZyYW1lSW5mb19wLCBQcmlvcml0eV9wKTsKKyNlbHNlCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsdUNhbElzc3VlUmVxdWVzdCgpCisvLworLy8gRGVzY3JpcHRpb246IGlzc3VlcyBhIFN0YXR1c1JlcXVlc3Qgb3IgYSBJZGVudFJlcXVlc3QgdG8gdGhlIHNwZWNpZmllZCBub2RlLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBTZXJ2aWNlX3AgICAgICAgICAgICAgICA9IHJlcXVlc3Qgc2VydmljZSBJRAorLy8gICAgICAgICAgICAgIHVpTm9kZUlkX3AgICAgICAgICAgICAgID0gbm9kZSBJRAorLy8gICAgICAgICAgICAgIGJTb2FGbGFnMV9wICAgICAgICAgICAgID0gZmxhZzEgZm9yIHRoaXMgbm9kZSAodHJhbnNtaXQgaW4gU29BIGFuZCBQUmVxKQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgMHhGRiB0aGlzIGZsYWcgaXMgaWdub3JlZC4KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsRGxsdUNhbElzc3VlUmVxdWVzdCh0RXBsRGxsUmVxU2VydmljZUlkIFNlcnZpY2VfcCwKKwkJCQkgIHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLCBCWVRFIGJTb2FGbGFnMV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBhZGQgbm9kZSB0byBhcHByb3ByaWF0ZSByZXF1ZXN0IHF1ZXVlCisJc3dpdGNoIChTZXJ2aWNlX3ApIHsKKwljYXNlIGtFcGxEbGxSZXFTZXJ2aWNlSWRlbnQ6CisJY2FzZSBrRXBsRGxsUmVxU2VydmljZVN0YXR1czoKKwkJeworCQkJdEVwbEV2ZW50IEV2ZW50OworCQkJdEVwbERsbENhbElzc3VlUmVxdWVzdCBJc3N1ZVJlcTsKKworCQkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rRGxsa0NhbDsKKwkJCUV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZURsbGtJc3N1ZVJlcTsKKwkJCUlzc3VlUmVxLm1fU2VydmljZSA9IFNlcnZpY2VfcDsKKwkJCUlzc3VlUmVxLm1fdWlOb2RlSWQgPSB1aU5vZGVJZF9wOworCQkJSXNzdWVSZXEubV9iU29hRmxhZzEgPSBiU29hRmxhZzFfcDsKKwkJCUV2ZW50Lm1fcEFyZyA9ICZJc3N1ZVJlcTsKKwkJCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKElzc3VlUmVxKTsKKworCQkJUmV0ID0gRXBsRXZlbnR1UG9zdCgmRXZlbnQpOworCQkJYnJlYWs7CisJCX0KKworCWRlZmF1bHQ6CisJCXsKKwkJCVJldCA9IGtFcGxEbGxJbnZhbGlkUGFyYW07CisJCQlnb3RvIEV4aXQ7CisJCX0KKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsdUNhbEFkZE5vZGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBhZGRzIHRoZSBzcGVjaWZpZWQgbm9kZSB0byB0aGUgaXNvY2hyb25vdXMgcGhhc2UuCisvLworLy8gUGFyYW1ldGVyczogIHBOb2RlSW5mb19wICAgICAgICAgICAgID0gcG9pbnRlciBvZiBub2RlIGluZm8gc3RydWN0dXJlCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbHVDYWxBZGROb2RlKHRFcGxEbGxOb2RlSW5mbyAqIHBOb2RlSW5mb19wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbEV2ZW50IEV2ZW50OworCisJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rRGxsa0NhbDsKKwlFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVEbGxrQWRkTm9kZTsKKwlFdmVudC5tX3BBcmcgPSBwTm9kZUluZm9fcDsKKwlFdmVudC5tX3VpU2l6ZSA9IHNpemVvZih0RXBsRGxsTm9kZUluZm8pOworCisJUmV0ID0gRXBsRXZlbnR1UG9zdCgmRXZlbnQpOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRGxsdUNhbERlbGV0ZU5vZGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZW1vdmVzIHRoZSBzcGVjaWZpZWQgbm9kZSBmcm9tIHRoZSBpc29jaHJvbm91cyBwaGFzZS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBub2RlIElECisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbHVDYWxEZWxldGVOb2RlKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbEV2ZW50IEV2ZW50OworCisJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rRGxsa0NhbDsKKwlFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVEbGxrRGVsTm9kZTsKKwlFdmVudC5tX3BBcmcgPSAmdWlOb2RlSWRfcDsKKwlFdmVudC5tX3VpU2l6ZSA9IHNpemVvZih1aU5vZGVJZF9wKTsKKworCVJldCA9IEVwbEV2ZW50dVBvc3QoJkV2ZW50KTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbHVDYWxTb2Z0RGVsZXRlTm9kZSgpCisvLworLy8gRGVzY3JpcHRpb246IHJlbW92ZXMgdGhlIHNwZWNpZmllZCBub2RlIHNvZnRseSBmcm9tIHRoZSBpc29jaHJvbm91cyBwaGFzZS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBub2RlIElECisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbHVDYWxTb2Z0RGVsZXRlTm9kZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxFdmVudCBFdmVudDsKKworCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua0RsbGtDYWw7CisJRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlRGxsa1NvZnREZWxOb2RlOworCUV2ZW50Lm1fcEFyZyA9ICZ1aU5vZGVJZF9wOworCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKHVpTm9kZUlkX3ApOworCisJUmV0ID0gRXBsRXZlbnR1UG9zdCgmRXZlbnQpOworCisJcmV0dXJuIFJldDsKK30KKworI2VuZGlmIC8vICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbERsbHVDYWxTZXRBc25kU2VydmljZUlkRmlsdGVyKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZm9yd2FyZHMgY2FsbCB0byBFcGxEbGxrU2V0QXNuZFNlcnZpY2VJZEZpbHRlcigpIGluIGtlcm5lbCBwYXJ0CisvLworLy8gUGFyYW1ldGVyczogIFNlcnZpY2VJZF9wICAgICAgICAgICAgID0gQVNuZCBTZXJ2aWNlIElECisvLyAgICAgICAgICAgICAgRmlsdGVyX3AgICAgICAgICAgICAgICAgPSBub2RlIElEIGZpbHRlcgorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsRGxsdUNhbFNldEFzbmRTZXJ2aWNlSWRGaWx0ZXIodEVwbERsbEFzbmRTZXJ2aWNlSWQKKwkJCQkJCSAgIFNlcnZpY2VJZF9wLAorCQkJCQkJICAgdEVwbERsbEFzbmRGaWx0ZXIgRmlsdGVyX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsRXZlbnQgRXZlbnQ7CisJdEVwbERsbENhbEFzbmRTZXJ2aWNlSWRGaWx0ZXIgU2VydkZpbHRlcjsKKworCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua0RsbGtDYWw7CisJRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlRGxsa1NlcnZGaWx0ZXI7CisJU2VydkZpbHRlci5tX1NlcnZpY2VJZCA9IFNlcnZpY2VJZF9wOworCVNlcnZGaWx0ZXIubV9GaWx0ZXIgPSBGaWx0ZXJfcDsKKwlFdmVudC5tX3BBcmcgPSAmU2VydkZpbHRlcjsKKwlFdmVudC5tX3VpU2l6ZSA9IHNpemVvZihTZXJ2RmlsdGVyKTsKKworCVJldCA9IEVwbEV2ZW50dVBvc3QoJkV2ZW50KTsKKworCXJldHVybiBSZXQ7Cit9CisKKyNlbmRpZiAvLyAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTFUpKSAhPSAwKQorCisvLyBFT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRXJyRGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEVyckRlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZWUxMmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEVyckRlZi5oCkBAIC0wLDAgKzEsMjk0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgZGVmaW5pdGlvbnMgZm9yIGFsbCBFUEwtZnVuY3Rpb24gcmV0dXJuIGNvZGVzCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsRXJyRGVmLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjkgJCAgJERhdGU6IDIwMDgvMDYvMjMgMTQ6NTY6MzMgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIGFsbAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDUvMTIvMDUgLWFzOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTF9FUlJPUkRFRl9IXworI2RlZmluZSBfRVBMX0VSUk9SREVGX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyByZXR1cm4gY29kZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgZW51bSB7CisJLy8gYXJlYSBmb3IgZ2VuZXJpYyBlcnJvcnMgMHgwMDAwIC0gMHgwMDBGCisJa0VwbFN1Y2Nlc3NmdWwgPSAweDAwMDAsCS8vIG5vIGVycm9yL3N1Y2Nlc3NmdWwgcnVuCisJa0VwbElsbGVnYWxJbnN0YW5jZSA9IDB4MDAwMSwJLy8gdGhlIGNhbGxlZCBJbnN0YW56IGRvZXMgbm90IGV4aXN0CisJa0VwbEludmFsaWRJbnN0YW5jZVBhcmFtID0gMHgwMDAyLAkvLworCWtFcGxOb0ZyZWVJbnN0YW5jZSA9IDB4MDAwMywJLy8gWHh4QWRkSW5zdGFuY2Ugd2FzIGNhbGxlZCBidXQgbm8gZnJlZSBpbnN0YW5jZSBpcyBhdmFpbGFibGUKKwlrRXBsV3JvbmdTaWduYXR1cmUgPSAweDAwMDQsCS8vIHdyb25nIHNpZ25hdHVyZSB3aGlsZSB3cml0aW5nIHRvIG9iamVjdCAweDEwMTAgb3IgMHgxMDExCisJa0VwbEludmFsaWRPcGVyYXRpb24gPSAweDAwMDUsCS8vIG9wZXJhdGlvbiBub3QgYWxsb3dlZCBpbiB0aGlzIHNpdHVhdGlvbgorCWtFcGxJbnZhbGlkTm9kZUlkID0gMHgwMDA3LAkvLyBpbnZhbGlkIE5vZGVJZCB3YXMgc3BlY2lmaWVkCisJa0VwbE5vUmVzb3VyY2UgPSAweDAwMDgsCS8vIHJlc291cmNlIGNvdWxkIG5vdCBiZSBjcmVhdGVkIChXaW5kb3dzLCBQeFJPUywgLi4uKQorCWtFcGxTaHV0ZG93biA9IDB4MDAwOSwJLy8gc3RhY2sgaXMgc2h1dHRpbmcgZG93bgorCWtFcGxSZWplY3QgPSAweDAwMEEsCS8vIHJlamVjdCB0aGUgc3Vic2VxdWVudCBjb21tYW5kCisKKwkvLyBhcmVhIGZvciBFRFJWIG1vZHVsZSAweDAwMTAgLSAweDAwMUYKKy8vICAgIGtFcGxFZHJ2Tm9GcmFtZSAgICAgICAgICAgICA9IDB4MDAxMCwgICAgICAgLy8gbm8gQ0FOIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkCisvLyAgICBrRXBsRWRydk1zZ0hpZ2ggICAgICAgICAgICAgPSAweDAwMTEsICAgICAgIC8vIENBTiBtZXNzYWdlIHdpdGggaGlnaCBwcmlvcml0eSB3YXMgcmVjZWl2ZWQKKy8vICAgIGtFcGxFZHJ2TXNnTG93ICAgICAgICAgICAgICA9IDB4MDAxMiwgICAgICAgLy8gQ0FOIG1lc3NhZ2Ugd2l0aCBsb3cgcHJpb3JpdHkgd2FzIHJlY2VpdmVkCisJa0VwbEVkcnZJbml0RXJyb3IgPSAweDAwMTMsCS8vIGluaXRpYWxpc2F0aW9uIGVycm9yCisJa0VwbEVkcnZOb0ZyZWVCdWZFbnRyeSA9IDB4MDAxNCwJLy8gbm8gZnJlZSBlbnRyeSBpbiBpbnRlcm5hbCBidWZmZXIgdGFibGUgZm9yIFR4IGZyYW1lcworCWtFcGxFZHJ2QnVmTm90RXhpc3RpbmcgPSAweDAwMTUsCS8vIHNwZWNpZmllZCBUeCBidWZmZXIgZG9lcyBub3QgZXhpc3QKKy8vICAgIGtFcGxFZHJ2Tm9GcmVlQ2hhbm5lbCAgICAgICA9IDB4MDAxNCwgICAgICAgLy8gQ0FOIGNvbnRyb2xsZXIgaGFzIG5vdCBhIGZyZWUgY2hhbm5lbAorLy8gICAga0VwbEVkcnZUeEJ1ZmZIaWdoT3ZlcnJ1biAgID0gMHgwMDE1LCAgICAgICAvLyBidWZmZXIgZm9yIGhpZ2ggcHJpb3JpdHkgQ0FOIHRyYW5zbWl0IG1lc3NhZ2VzIGhhcyBvdmVycnVuCisvLyAgICBrRXBsRWRydlR4QnVmZkxvd092ZXJydW4gICAgPSAweDAwMTYsICAgICAgIC8vIGJ1ZmZlciBmb3IgbG93IHByaW9yaXR5IENBTiB0cmFuc21pdCBtZXNzYWdlcyBoYXMgb3ZlcnJ1bgorLy8gICAga0VwbEVkcnZJbGxlZ2FsQmRpICAgICAgICAgID0gMHgwMDE3LCAgICAgICAvLyB1bnN1cHBvcnRlZCBiYXVkcmF0ZSB3aXRoaW4gYmF1ZHJhdGUgdGFibGUKKy8vICAgIGtFcGxFZHJ2QnVzeSAgICAgICAgICAgICAgICA9IDB4MDAxOCwgICAgICAgLy8gcmVtb3RlIGZyYW1lIGNhbiBub3QgYmUgdXBkYXRlZCBiZWNhdXNlIG5vIGJ1cyBjb250YWN0IG9yIENBTgorCS8vIHRyYW5zbWlzc2lvbiBpcyBhY3RpdgorLy8gICAga0VwbEVkcnZJbnZhbGlkRHJpdmVyVHlwZSAgID0gMHgwMDE5LCAgICAgICAvLyAoUEM6IFdpbmRvd3Mgb3IgTGludXgpIGludmFsaWQgZHJpdmVyIHR5cGUKKy8vICAgIGtFcGxFZHJ2RHJpdmVyTm90Rm91bmQgICAgICA9IDB4MDAxQSwgICAgICAgLy8gKFBDOiBXaW5kb3dzIG9yIExpbnV4KSBkcml2ZXIgKERMTCkgY291bGQgbm90IGJlIGZvdW5kCisvLyAgICBrRXBsRWRydkludmFsaWRCYXNlQWRkcmVzcyAgPSAweDAwMUIsICAgICAgIC8vIChQQzogV2luZG93cyBvciBMaW51eCkgZHJpdmVyIGNvdWxkIG5vdCBmb3VuZCB0aGUgQ0FOIGNvbnRyb2xsZXIKKy8vICAgIGtFcGxFZHJ2SW52YWxpZFBhcmFtICAgICAgICA9IDB4MDAxQywgICAgICAgLy8gaW52YWxpZCBwYXJhbSBpbiBmdW5jdGlvbiBjYWxsCisKKwkvLyBhcmVhIGZvciBDT0IgbW9kdWxlIDB4MDAyMCAtIDB4MDAyRgorLyogICAga0VwbENvYk5vRnJlZUVudHJ5ICAgICAgICAgID0gMHgwMDIwLCAgICAgICAvLyBubyBmcmVlIGVudHJ5IGluIFJYLSBvciBUWC1DT0IgdGFibGUKKyAgICBrRXBsQ29iQWxyZWFkeUV4aXN0ICAgICAgICAgPSAweDAwMjEsICAgICAgIC8vIENPQi1JRCBhbHJlYWR5IGV4aXN0cyBpbiBSWC0gcmVzcC4gVFgtQ09CIHRhYmxlCisgICAgKi8KKwlrRXBsRGxsSWxsZWdhbEhkbCA9IDB4MDAyMiwJLy8gaWxsZWdhbCBoYW5kbGUgZm9yIGEgVHhGcmFtZSB3YXMgcGFzc2VkCisJa0VwbERsbENiQXN5bmNSZWdpc3RlcmVkID0gMHgwMDIzLAkvLyBoYW5kbGVyIGZvciBub24tRVBMIGZyYW1lcyB3YXMgYWxyZWFkeSByZWdpc3RlcmVkIGJlZm9yZQorLy8gICAga0VwbERsbEFzeW5jUnhCdWZmZXJGdWxsICAgID0gMHgwMDI0LCAgICAgICAvLyByZWNlaXZlIGJ1ZmZlciBmb3IgYXN5bmNocm9ub3VzIGZyYW1lcyBpcyBmdWxsCisJa0VwbERsbEFzeW5jVHhCdWZmZXJFbXB0eSA9IDB4MDAyNSwJLy8gdHJhbnNtaXQgYnVmZmVyIGZvciBhc3luY2hyb25vdXMgZnJhbWVzIGlzIGVtcHR5CisJa0VwbERsbEFzeW5jVHhCdWZmZXJGdWxsID0gMHgwMDI2LAkvLyB0cmFuc21pdCBidWZmZXIgZm9yIGFzeW5jaHJvbm91cyBmcmFtZXMgaXMgZnVsbAorCWtFcGxEbGxOb05vZGVJbmZvID0gMHgwMDI3LAkvLyBNTjogdG9vIGxlc3Mgc3BhY2UgaW4gdGhlIGludGVybmFsIG5vZGUgaW5mbyBzdHJ1Y3R1cmUKKwlrRXBsRGxsSW52YWxpZFBhcmFtID0gMHgwMDI4LAkvLyBpbnZhbGlkIHBhcmFtZXRlcnMgcGFzc2VkIHRvIGZ1bmN0aW9uCisJa0VwbERsbFR4QnVmTm90UmVhZHkgPSAweDAwMkUsCS8vIFR4QnVmZmVyIChlLmcuIGZvciBQUmVxKSBpcyBub3QgcmVhZHkgeWV0CisJa0VwbERsbFR4RnJhbWVJbnZhbGlkID0gMHgwMDJGLAkvLyBUeEZyYW1lIChlLmcuIGZvciBQUmVxKSBpcyBpbnZhbGlkIG9yIGRvZXMgbm90IGV4aXN0CisvKiAgICBrRXBsQ29iSWxsZWdhbENhbklkICAgICAgICAgPSAweDAwMjMsICAgICAgIC8vIENPQi1JRCBpcyBub3QgYWxsb3dlZCAobGlrZSAweDAwMCBpcyByZXNlcnZlZCBmb3IgTk1ULCAuLi4pCisgICAga0VwbENvYkludmFsaWRDYW5JZCAgICAgICAgID0gMHgwMDI0LCAgICAgICAvLyBDT0ItSUQgaXMgc3dpdGNoZWQgb2ZmCisgICAga0VwbENvYkNkcnZTdGF0ZVNldCAgICAgICAgID0gMHgwMDI1LCAgICAgICAvLyBhdCBsZWFzdCBvbmUgYml0IG9mIENBTiBkcml2ZXIgc3RhdGUgaXMgc2V0CisgICAga0VwbENvYk5vRnJlZUVudHJ5SGlnaEJ1ZiAgID0gMHgwMDI2LCAgICAgICAvLyBubyBmcmVlIGVudHJ5IGluIGhpZ2ggcHJpb3RpdHkgUlgtIG9yIFRYLUNPQiB0YWJsZQorICAgIGtFcGxDb2JPd25JZCAgICAgICAgICAgICAgICA9IDB4MDAyNywgICAgICAgLy8gQ09CLUlEIGFscmVhZHkgZXhpc3RzIGluIG93biBtb2R1bGUgd2hpY2ggY2FsbHMgQ29iRGVmaW5lKCkgb3IgQ29iQ2hlY2soKQorKi8KKwkvLyBhcmVhIGZvciBPQkQgbW9kdWxlIDB4MDAzMCAtIDB4MDAzRgorCWtFcGxPYmRJbGxlZ2FsUGFydCA9IDB4MDAzMCwJLy8gdW5rbm93biBPRCBwYXJ0CisJa0VwbE9iZEluZGV4Tm90RXhpc3QgPSAweDAwMzEsCS8vIG9iamVjdCBpbmRleCBkb2VzIG5vdCBleGlzdCBpbiBPRAorCWtFcGxPYmRTdWJpbmRleE5vdEV4aXN0ID0gMHgwMDMyLAkvLyBzdWJpbmRleCBkb2VzIG5vdCBleGlzdCBpbiBvYmplY3QgaW5kZXgKKwlrRXBsT2JkUmVhZFZpb2xhdGlvbiA9IDB4MDAzMywJLy8gcmVhZCBhY2Nlc3MgdG8gYSB3cml0ZS1vbmx5IG9iamVjdAorCWtFcGxPYmRXcml0ZVZpb2xhdGlvbiA9IDB4MDAzNCwJLy8gd3JpdGUgYWNjZXNzIHRvIGEgcmVhZC1vbmx5IG9iamVjdAorCWtFcGxPYmRBY2Nlc3NWaW9sYXRpb24gPSAweDAwMzUsCS8vIGFjY2VzcyBub3QgYWxsb3dlZAorCWtFcGxPYmRVbmtub3duT2JqZWN0VHlwZSA9IDB4MDAzNiwJLy8gb2JqZWN0IHR5cGUgbm90IGRlZmluZWQva25vd24KKwlrRXBsT2JkVmFyRW50cnlOb3RFeGlzdCA9IDB4MDAzNywJLy8gb2JqZWN0IGRvZXMgbm90IGNvbnRhaW4gVmFyRW50cnkgc3RydWN0dXJlCisJa0VwbE9iZFZhbHVlVG9vTG93ID0gMHgwMDM4LAkvLyB2YWx1ZSB0byB3cml0ZSB0byBhbiBvYmplY3QgaXMgdG9vIGxvdworCWtFcGxPYmRWYWx1ZVRvb0hpZ2ggPSAweDAwMzksCS8vIHZhbHVlIHRvIHdyaXRlIHRvIGFuIG9iamVjdCBpcyB0b28gaGlnaAorCWtFcGxPYmRWYWx1ZUxlbmd0aEVycm9yID0gMHgwMDNBLAkvLyB2YWx1ZSB0byB3cml0ZSBpcyB0byBsb25nIG9yIHRvIHNob3J0CisvLyAgICBrRXBsT2JkSWxsZWdhbEZsb2F0ICAgICAgICAgPSAweDAwM0IsICAgICAgIC8vIGlsbGVnYWwgZmxvYXQgdmFyaWFibGUKKy8vICAgIGtFcGxPYmRXcm9uZ09kQnVpbGRlcktleSAgICA9IDB4MDAzRiwgICAgICAgLy8gT0Qgd2FzIGdlbmVyYXRlZCB3aXRoIGRlbW8gdmVyc2lvbiBvZiB0b29sIE9EQnVpbGRlcgorCisJLy8gYXJlYSBmb3IgTk1UIG1vZHVsZSAweDAwNDAgLSAweDAwNEYKKwlrRXBsTm10VW5rbm93bkNvbW1hbmQgPSAweDAwNDAsCS8vIHVua25vd24gTk1UIGNvbW1hbmQKKwlrRXBsTm10SW52YWxpZEZyYW1lUG9pbnRlciA9IDB4MDA0MSwJLy8gcG9pbnRlciB0byB0aGUgZnJhbWUgaXMgbm90IHZhbGlkCisJa0VwbE5tdEludmFsaWRFdmVudCA9IDB4MDA0MiwJLy8gaW52YWxpZCBldmVudCBzZW5kIHRvIE5NVC1tb2R1bAorCWtFcGxObXRJbnZhbGlkU3RhdGUgPSAweDAwNDMsCS8vIHVua25vd24gc3RhdGUgaW4gTk1ULVN0YXRlLU1hc2NoaW5lCisJa0VwbE5tdEludmFsaWRQYXJhbSA9IDB4MDA0NCwJLy8gaW52YWxpZCBwYXJhbWV0ZXJzIHNwZWNpZmllZAorCisJLy8gYXJlYSBmb3IgU0RPL1VEUCBtb2R1bGUgMHgwMDUwIC0gMHgwMDVGCisJa0VwbFNkb1VkcE1pc3NDYiA9IDB4MDA1MCwJLy8gbWlzc2luZyBjYWxsYmFjay1mdW5jdGlvbiBwb2ludGVyIGR1cmluZyBpbnRpIG9mCisJLy8gbW9kdWxlCisJa0VwbFNkb1VkcE5vU29ja2V0ID0gMHgwMDUxLAkvLyBlcnJvciBkdXJpbmcgaW5pdCBvZiBzb2NrZXQKKwlrRXBsU2RvVWRwU29ja2V0RXJyb3IgPSAweDAwNTIsCS8vIGVycm9yIGR1cmluZyB1c2FnZSBvZiBzb2NrZXQKKwlrRXBsU2RvVWRwVGhyZWFkRXJyb3IgPSAweDAwNTMsCS8vIGVycm9yIGR1cmluZyBzdGFydCBvZiBsaXN0ZW4gdGhyZWFkCisJa0VwbFNkb1VkcE5vRnJlZUhhbmRsZSA9IDB4MDA1NCwJLy8gbm8gZnJlZSBjb25uZWN0aW9uIGhhbmRsZSBmb3IgVWRwCisJa0VwbFNkb1VkcFNlbmRFcnJvciA9IDB4MDA1NSwJLy8gRXJyb3IgZHVyaW5nIHNlbmQgb2YgZnJhbWUKKwlrRXBsU2RvVWRwSW52YWxpZEhkbCA9IDB4MDA1NiwJLy8gdGhlIGNvbm5lY3Rpb24gaGFuZGxlIGlzIGludmFsaWQKKworCS8vIGFyZWEgZm9yIFNETyBTZXF1ZW5jZSBsYXllciBtb2R1bGUgMHgwMDYwIC0gMHgwMDZGCisJa0VwbFNkb1NlcU1pc3NDYiA9IDB4MDA2MCwJLy8gbm8gY2FsbGJhY2stZnVuY3Rpb24gYXNzaWduCisJa0VwbFNkb1NlcU5vRnJlZUhhbmRsZSA9IDB4MDA2MSwJLy8gbm8gZnJlZSBoYW5kbGUgZm9yIGNvbm5lY3Rpb24KKwlrRXBsU2RvU2VxSW52YWxpZEhkbCA9IDB4MDA2MiwJLy8gaW52YWxpZCBoYW5kbGUgaW4gU0RPIHNlcXVlbmNlIGxheWVyCisJa0VwbFNkb1NlcVVuc3VwcG9ydGVkUHJvdCA9IDB4MDA2MywJLy8gdW5zdXBwb3J0ZWQgUHJvdG9jb2wgc2VsZWN0ZWQKKwlrRXBsU2RvU2VxTm9GcmVlSGlzdG9yeSA9IDB4MDA2NCwJLy8gbm8gZnJlZSBlbnRyeSBpbiBoaXN0b3J5CisJa0VwbFNkb1NlcUZyYW1lU2l6ZUVycm9yID0gMHgwMDY1LAkvLyB0aGUgc2l6ZSBvZiB0aGUgZnJhbWVzIGlzIG5vdCBjb3JyZWN0CisJa0VwbFNkb1NlcVJlcXVlc3RBY2tOZWVkZWQgPSAweDAwNjYsCS8vIGluZGVpY2F0ZXMgdGhhdCB0aGUgaGlzdG9yeSBidWZmZXIgaXMgZnVsbAorCS8vIGFuZCBhIGFjayByZXF1ZXN0IGlzIG5lZWRlZAorCWtFcGxTZG9TZXFJbnZhbGlkRnJhbWUgPSAweDAwNjcsCS8vIGZyYW1lIG5vdCB2YWxpZAorCWtFcGxTZG9TZXFDb25uZWN0aW9uQnVzeSA9IDB4MDA2OCwJLy8gY29ubmVjdGlvbiBpcyBidXN5IC0+IHJldHJ5IGxhdGVyCisJa0VwbFNkb1NlcUludmFsaWRFdmVudCA9IDB4MDA2OSwJLy8gaW52YWxpZCBldmVudCByZWNlaXZlZAorCisJLy8gYXJlYSBmb3IgU0RPIENvbW1hbmQgTGF5ZXIgTW9kdWxlIDB4MDA3MCAtIDB4MDA3RgorCWtFcGxTZG9Db21VbnN1cHBvcnRlZFByb3QgPSAweDAwNzAsCS8vIHVuc3VwcG9ydGVkIFByb3RvY29sIHNlbGVjdGVkCisJa0VwbFNkb0NvbU5vRnJlZUhhbmRsZSA9IDB4MDA3MSwJLy8gbm8gZnJlZSBoYW5kbGUgZm9yIGNvbm5lY3Rpb24KKwlrRXBsU2RvQ29tSW52YWxpZFNlcnZpY2VUeXBlID0gMHgwMDcyLAkvLyBpbnZhbGlkIFNETyBzZXJ2aWNlIHR5cGUgc3BlY2lmaWVkCisJa0VwbFNkb0NvbUludmFsaWRIYW5kbGUgPSAweDAwNzMsCS8vIGhhbmRsZSBpbnZhbGlkCisJa0VwbFNkb0NvbUludmFsaWRTZW5kVHlwZSA9IDB4MDA3NCwJLy8gdGhlIHN0YXRlZCB0byBvZiBmcmFtZSB0byBzZW5kIGlzCisJLy8gbm90IHBvc3NpYmxlCisJa0VwbFNkb0NvbU5vdFJlc3BvbnNpYmxlID0gMHgwMDc1LAkvLyBpbnRlcm5hbCBlcnJvcjogY29tbWFuZCBsYXllciBoYW5kbGUgaXMKKwkvLyBub3QgcmVzcG9uc2libGUgZm9yIHRoaXMgZXZlbnQgZnJvbSBzZXF1ZW5jZSBsYXllcgorCWtFcGxTZG9Db21IYW5kbGVFeGlzdHMgPSAweDAwNzYsCS8vIGhhbmRsZSB0byBzYW1lIG5vZGUgYWxyZWFkeSBleGlzdHMKKwlrRXBsU2RvQ29tSGFuZGxlQnVzeSA9IDB4MDA3NywJLy8gdHJhbnNmZXIgdmlhIHRoaXMgaGFuZGxlIGlzIGFscmVhZHkgcnVubmluZworCWtFcGxTZG9Db21JbnZhbGlkUGFyYW0gPSAweDAwNzgsCS8vIGludmFsaWQgcGFyYW1ldGVycyBwYXNzZWQgdG8gZnVuY3Rpb24KKworCS8vIGFyZWEgZm9yIEVQTCBFdmVudC1Nb2R1bCAweDAwODAgLSAweDAwOEYKKwlrRXBsRXZlbnRVbmtub3duU2luayA9IDB4MDA4MCwJLy8gdW5rbm93biBzaW5rIGZvciBldmVudAorCWtFcGxFdmVudFBvc3RFcnJvciA9IDB4MDA4MSwJLy8gZXJyb3IgZHVyaW5nIHBvc3Qgb2YgZXZlbnQKKworCS8vIGFyZWEgZm9yIEVQTCBUaW1lciBNb2R1bCAweDAwOTAgLSAweDAwOUYKKwlrRXBsVGltZXJJbnZhbGlkSGFuZGxlID0gMHgwMDkwLAkvLyBpbnZhbGlkIGhhbmRsZSBmb3IgdGltZXIKKwlrRXBsVGltZXJOb1RpbWVyQ3JlYXRlZCA9IDB4MDA5MSwJLy8gbm8gdGltZXIgd2FzIGNyZWF0ZWQgY2F1c2VkIGJ5CisJLy8gYW4gZXJyb3IKKworCS8vIGFyZWEgZm9yIEVQTCBTRE8vQXNuZCBNb2R1bGUgMHgwMEEwIC0gMHgwQUYKKwlrRXBsU2RvQXNuZEludmFsaWROb2RlSWQgPSAweDAwQTAsCS8vMCBub2RlIGlkIGlzIGludmFsaWQKKwlrRXBsU2RvQXNuZE5vRnJlZUhhbmRsZSA9IDB4MDBBMSwJLy8gbm8gZnJlZSBoYW5kbGUgZm9yIGNvbm5lY3Rpb24KKwlrRXBsU2RvQXNuZEludmFsaWRIYW5kbGUgPSAweDAwQTIsCS8vIGhhbmRsZSBmb3IgY29ubmVjdGlvbiBpcyBpbnZhbGlkCisKKwkvLyBhcmVhIGZvciBQRE8gbW9kdWxlIDB4MDBCMCAtIDB4MDBCRgorCWtFcGxQZG9Ob3RFeGlzdCA9IDB4MDBCMCwJLy8gc2VsZWN0ZWQgUERPIGRvZXMgbm90IGV4aXN0CisJa0VwbFBkb0xlbmd0aEV4Y2VlZGVkID0gMHgwMEIxLAkvLyBsZW5ndGggb2YgUERPIG1hcHBpbmcgZXhjZWVkZXMgNjQgYmlzCisJa0VwbFBkb0dyYW51bGFyaXR5TWlzbWF0Y2ggPSAweDAwQjIsCS8vIGNvbmZpZ3VyZWQgUERPIGdyYW51bGFyaXR5IGlzIG5vdCBlcXVhbCB0byBzdXBwb3J0ZWQgZ3JhbnVsYXJpdHkKKwlrRXBsUGRvSW5pdEVycm9yID0gMHgwMEIzLAkvLyBlcnJvciBkdXJpbmcgaW5pdGlhbGlzYXRpb24gb2YgUERPIG1vZHVsZQorCWtFcGxQZG9FcnJvclBkb0VuY29kZSA9IDB4MDBCNCwJLy8gZXJyb3IgZHVyaW5nIGVuY29kaW5nIGEgUERPCisJa0VwbFBkb0Vycm9yUGRvRGVjb2RlID0gMHgwMEI1LAkvLyBlcnJvciBkdXJpbmcgZGVjb2RpbmcgYSBQRE8KKwlrRXBsUGRvRXJyb3JTZW5kID0gMHgwMEI2LAkvLyBlcnJvciBkdXJpbmcgc2VuZGluZyBhIFBETworCWtFcGxQZG9FcnJvclN5bmNXaW4gPSAweDAwQjcsCS8vIHRoZSBTWU5DIHdpbmRvdyBydW5zIG91dCBkdXJpbmcgc2VuZGluZyBTWU5DLVBET3MKKwlrRXBsUGRvRXJyb3JNYXBwID0gMHgwMEI4LAkvLyBpbnZhbGlkIFBETyBtYXBwaW5nCisJa0VwbFBkb1Zhck5vdEZvdW5kID0gMHgwMEI5LAkvLyB2YXJpYWJsZSB3YXMgbm90IGZvdW5kIGluIGZ1bmN0aW9uIFBkb1NpZ25hbFZhcigpCisJa0VwbFBkb0Vycm9yRW1jeVBkb0xlbiA9IDB4MDBCQSwJLy8gdGhlIGxlbmd0aCBvZiBhIHJlY2VpdmVkIFBETyBpcyB1bmVxdWFsIHRvIHRoZSBleHBlY3RlZCB2YWx1ZQorCWtFcGxQZG9Xcml0ZUNvbnN0T2JqZWN0ID0gMHgwMEJCLAkvLyBjb25zdGFudCBvYmplY3QgY2FuIG5vdCBiZSB3cml0dGVuCisJLy8gKG9ubHkgVHhUeXBlLCBJbmhpYml0LSwgRXZlbnQgVGltZSBmb3IgQ0FOb3BlbiBLaXQpCisKKwkvLyBhcmVhIGZvciBMU1Mgc2xhdmUgbW9kdWxlCisvKiAgICBrRXBsTHNzc1Jlc2V0Tm9kZSAgICAgICAgICAgPSAweDAwODAsICAgICAgIC8vIE5NVCBjb21tYW5kICJyZXNldCBub2RlIiBoYXMgdG8gYmUgcHJvY2Vzc2VkIGFmdGVyIExTUyBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXcgb2YgTm9kZUlkCisgICAga0VwbExzc3NJbnZhbGlkTm9kZUlkICAgICAgID0gMHgwMDgxLCAgICAgICAvLyBubyB2YWxpZCBOb2RlSWQgaXMgY29uZmlndXJlZCAtPiB3YWl0IHVudGlsIGl0IGlzIGNvbmZpZ3VyZWQgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTFNTIHNlcnZpY2UgYmVmb3JlIGNhbGxpbmcgQ2NtQ29ubmVjdFRvTmV0KCkKKyovCisJLy8gYXJlYSBmb3IgZW1lcmdlbmN5IGNvbnN1bWVyIG1vZHVsZSAweDAwOTAgLSAweDAwOUYKKy8qICAgIGtFcGxFbWNjTm9GcmVlUHJvZHVjZXJFbnRyeSA9IDB4MDA5MCwgICAgICAgLy8gbm8gZnJlZSBlbnRyeSB0byBhZGQgYSBFbWVyZ2VuY3kgUHJvZHVjZXIKKyAgICBrRXBsRW1jY05vZGVJZE5vdEV4aXN0ICAgICAgPSAweDAwOTEsICAgICAgIC8vIHNlbGVjdGVkIE5vZGVJZCB3YXMgbmV2ZXIgYWRkZWQKKyAgICBrRXBsRW1jY05vZGVJZEludmFsaWQgICAgICAgPSAweDAwOTIsICAgICAgIC8vIHNlbGVjdGVkIE5vZGVJZCBpcyBvdXRzaWRlIG9mIHJhbmdlICgweDAxIHVudGlsIDB4N0YpCisgICAga0VwbEVtY2NOb2RlSWRFeGlzdCAgICAgICAgID0gMHgwMDkzLCAgICAgICAvLyBzZWxlY3RlZCBOb2RlSWQgYWxyZWFkeSBleGlzdAorKi8KKwkvLyBhcmVhIGZvciBkeW5hbWljIE9EIDB4MDBBMCAtIDB4MDBBRgorLyogICAga0VwbER5bk5vTWVtb3J5ICAgICAgICAgICAgID0gMHgwMEEwLCAgICAgICAvLyBubyBtZW1vcnkgYXZhaWxhYmxlCisgICAga0VwbER5bkludmFsaWRDb25maWcgICAgICAgID0gMHgwMEExLCAgICAgICAvLyBpbnZhbGlkIGNvbmZpZ3VyYXRpb24gaW4gc2VnbWVudCBjb250YWluZXIKKyovCisJLy8gYXJlYSBmb3IgaGVydGJlYXQgY29uc3VtZXIgbW9kdWxlIDB4MDBCMCAtIDB4MDBCRgorLyogICAga0VwbEhiY0VudHJ5Tm90RXhpc3QgICAgICAgID0gMHgwMEIwLCAgICAgICAvLyBIZWFydGJlYXQgUHJvZHVjZXIgbm9kZSBub3QgY29uZmlndXJlZAorICAgIGtFcGxIYmNFbnRyeUFscmVhZHlFeGlzdCAgICA9IDB4MDBCMSwgICAgICAgLy8gTm9kZUlkIHdhcyBhbHJlYWR5IGRlZmluZWQgaW4gaGVhcnRiZWF0IGNvbnN1bWVyIHRhYmxlIChvYmplY3QgMHgxMDE2KQorKi8KKwkvLyBDb25maWd1cmF0aW9uIG1hbmFnZXIgbW9kdWxlIDB4MDBDMCAtIDB4MDBDRgorCWtFcGxDZmdNYUNvbmZpZ0Vycm9yID0gMHgwMEMwLAkvLyBlcnJvciBpbiBjb25maWd1cmF0aW9uIG1hbmFnZXIKKwlrRXBsQ2ZnTWFTZG9jVGltZU91dEVycm9yID0gMHgwMEMxLAkvLyBlcnJvciBpbiBjb25maWd1cmF0aW9uIG1hbmFnZXIsIFNkbyB0aW1lb3V0CisJa0VwbENmZ01hSW52YWxpZERjZiA9IDB4MDBDMiwJLy8gY29uZmlncmF0aW9uIGZpbGUgbm90IHZhbGlkCisJa0VwbENmZ01hVW5zdXBwb3J0ZWREY2YgPSAweDAwQzMsCS8vIHVuc3VwcG9ydGVkIERjZiBmb3JtYXQKKwlrRXBsQ2ZnTWFDb25maWdXaXRoRXJyb3JzID0gMHgwMEM0LAkvLyBjb25maWd1cmF0aW9uIGZpbmlzaGVkIHdpdGggZXJyb3JzCisJa0VwbENmZ01hTm9GcmVlQ29uZmlnID0gMHgwMEM1LAkvLyBubyBmcmVlIGNvbmZpZ3VyYXRpb24gZW50cnkKKwlrRXBsQ2ZnTWFOb0NvbmZpZ0RhdGEgPSAweDAwQzYsCS8vIG5vIGNvbmZpZ3VyYXRpb24gZGF0YSBwcmVzZW50CisJa0VwbENmZ01hVW5zdXBwRGF0YXR5cGVEY2YgPSAweDAwQzcsCS8vIHVuc3VwcG9ydGVkIGRhdGF0eXBlIGZvdW5kIGluIGRjZgorCS8vIC0+IHRoaXMgZW50cnkgd2FzIG5vdCBjb25maWd1cmVkCisKKwkvLyBhcmVhIGZvciBMU1MgbWFzdGVyIG1vZHVsZSAweDAwRDAgLSAweDAwREYKKy8qICAgIGtFcGxMc3NtSWxsZWdhbE1vZGUgICAgICAgICA9IDB4MDBEMCwgICAgICAgLy8gaWxsZWdhbCBMU1MgbW9kZSAob3BlcmF0aW9uIC8gY29uZmlndXJhdGlvbikKKyAgICBrRXBsTHNzbUlsbGVnYWxTdGF0ZSAgICAgICAgPSAweDAwRDEsICAgICAgIC8vIGZ1bmN0aW9uIHdhcyBjYWxsZWQgaW4gaWxsZWdhbCBzdGF0ZSBvZiBMU1MgbWFzdGVyCisgICAga0VwbExzc21CdXN5ICAgICAgICAgICAgICAgID0gMHgwMEQyLCAgICAgICAvLyBMU1MgcHJvY2VzcyBpcyBidXN5IHdpdGggYW4gcHJldmlvdXMgc2VydmljZQorICAgIGtFcGxMc3NtSWxsZWdhbENtZCAgICAgICAgICA9IDB4MDBEMywgICAgICAgLy8gaWxsZWdhbCBjb21tYW5kIGNvZGUgd2FzIHNldCBmb3IgZnVuY3Rpb24gTHNzbUlucXVpcmVJZGVudGl0eSgpCisgICAga0VwbExzc21UaW1lb3V0ICAgICAgICAgICAgID0gMHgwMEQ0LCAgICAgICAvLyBMU1Mgc2xhdmUgZGlkIG5vdCBhbnN3ZXIgYSBMU1Mgc2VydmljZQorICAgIGtFcGxMc3NtRXJyb3JJbkNvbmZpcm0gICAgICA9IDB4MDBENSwgICAgICAgLy8gTFNTIHNsYXZlIHJlcGxpZWQgYW4gZXJyb3IgY29kZSBmb3IgYSBMU1Mgc2VydmljZQorKi8KKwkvLyBhcmVhIGZvciBDQ00gbW9kdWxlcyAweDAwRTAgLSAweEVGCisvKiAgICBrRXBsQ2NtU3RvcmVVbnZhbGlkU3RhdGUgICAgPSAweDAwRTAsICAgICAgIC8vIG1lbW9yeSBkZXZpY2Ugbm90IGF2YWlsYWJsZSBkdWUgZGV2aWNlIHN0YXRlCisgICAga0VwbENjbVN0b3JlSHdFcnJvciAgICAgICAgID0gMHgwMEUxLCAgICAgICAvLyBodyBlcnJvciBkdWUgZGV2aWNlIGFjY2VzcworKi8KKwkvLyBhcmVhIGZvciBTUkRPIG1vZHVsZSAweDAxMDAgLSAweDAxMUYKKy8qICAgIGtFcGxTcmRvTm90RXhpc3QgICAgICAgICAgICA9IDB4MDEwMCwgICAgICAgLy8gc2VsZWN0ZWQgU1JETyBkb2VzIG5vdCBleGlzdAorICAgIGtFcGxTcmRvR3JhbnVsYXJpdHlNaXNtYXRjaCA9IDB4MDEwMSwgICAgICAgLy8gY29uZmlndXJlZCBTUkRPIGdyYW51bGFyaXR5IGlzIG5vdCBlcXVhbCB0byBzdXBwb3J0ZWQgZ3JhbnVsYXJpdHkKKyAgICBrRXBsU3Jkb0NmZ1RpbWluZ0Vycm9yICAgICAgPSAweDAxMDIsICAgICAgIC8vIGNvbmZpZ3VyYXRpb24gaXMgbm90IG9rIChUaW1pbmcpCisgICAga0VwbFNyZG9DZmdJZEVycm9yICAgICAgICAgID0gMHgwMTAzLCAgICAgICAvLyBjb25maWd1cmF0aW9uIGlzIG5vdCBvayAoQ29iSWRzKQorICAgIGtFcGxTcmRvQ2ZnQ3JjRXJyb3IgICAgICAgICA9IDB4MDEwNCwgICAgICAgLy8gY29uZmlndXJhdGlvbiBpcyBub3Qgb2sgKENSQykKKyAgICBrRXBsU3Jkb05tdEVycm9yICAgICAgICAgICAgPSAweDAxMDUsICAgICAgIC8vIGFuIGFjdGlvbiB3YXMgdHJpZWQgaW4gYSB3cm9uZyBOTVQgc3RhdGUKKyAgICBrRXBsU3Jkb0ludmFsaWRDZmcgICAgICAgICAgPSAweDAxMDYsICAgICAgIC8vIGFuIGFjdGlvbiB3YXMgdHJpZWQgd2l0aCBhbiBpbnZhbGQgU1JETyBjb25maWd1cmF0aW9uCisgICAga0VwbFNyZG9JbnZhbGlkICAgICAgICAgICAgID0gMHgwMTA3LCAgICAgICAvLyBhbiBhY3Rpb24gd2FzIHRyaWVkIHdpdGggYW4gaW52YWxkIFNSRE8KKyAgICBrRXBsU3Jkb1J4VHhDb25mbGljdCAgICAgICAgPSAweDAxMDgsICAgICAgIC8vIGFuIHRyYW5zbWlzc2lvbiB3YXMgdHJpZWQgd2l0aCBhbiByZWNlaXZlIFNSRE8gKG9yIHRoZSBvdGhlciB3YXkpCisgICAga0VwbFNyZG9JbGxlZ2FsQ2FuSWQgICAgICAgID0gMHgwMTA5LCAgICAgICAvLyB0aGUgQ2FuSWQgaXMgaW52YWxpZAorICAgIGtFcGxTcmRvQ2FuSWRBbHJlYWR5SW5Vc2UgICA9IDB4MDEwQSwgICAgICAgLy8gdGhlIENhbklkIGlzIGFscmVhZHkgaW4gdXNlCisgICAga0VwbFNyZG9Ob3RJbk9yZGVyICAgICAgICAgID0gMHgwMTBCLCAgICAgICAvLyB0aGUgdHdvIG1lc3NhZ2VzIG9mIGEgU1JETyBhcmUgbm90IGluIG9yZGVyCisgICAga0VwbFNyZG9TY3RUaW1lb3V0ICAgICAgICAgID0gMHgwMTBDLCAgICAgICAvLyB0aW1lb3V0IG9mIFNDVAorICAgIGtFcGxTcmRvU3J2dFRpbWVvdXQgICAgICAgICA9IDB4MDEwRCwgICAgICAgLy8gdGltZW91dCBvZiBTUlZUCisgICAga0VwbFNyZG9DYW5JZE5vdFZhbGlkICAgICAgID0gMHgwMTBFLCAgICAgICAvLyBvbmUgb2YgcmVjZWl2ZWQgQ0FOLUlEcyBhcmUgbm90IGVxdWFsIHRvIGNvbmZpZ3VyZWQgb25lCisgICAga0VwbFNyZG9EbGNOb3RWYWxpZCAgICAgICAgID0gMHgwMTBGLCAgICAgICAvLyBvbmUgb2YgcmVjZWl2ZWQgQ0FOLURMQyBhcmUgbm90IGVxdWFsIHRvIGNvbmZpZ3VyZWQgb25lCisgICAga0VwbFNyZG9FcnJvck1hcHAgICAgICAgICAgID0gMHgwMTEwLCAgICAgICAvLyB3cm9uZyB2YWx1ZXMgaW4gbWFwcGluZyBmb3VuZAorICAgIGtFcGxTcmRvRGF0YUVycm9yICAgICAgICAgICA9IDB4MDExMSwgICAgICAgLy8gZGF0YSBvZiBDQU4gbWVzc2FnZXMgYXJlIG5vdCBpbnZlcnMKKyAgICBrRXBsU3Jkb0xlbmd0aEV4Y2VlZGVkICAgICAgPSAweDAxMTIsICAgICAgIC8vIGxlbmd0aCBvZiBTUkRPIG1hcHBpbmcgZXhjZWVkZXMgNjQgYml0IHBlciBDQU4tbWVzc2FnZQorICAgIGtFcGxTcmRvTm90SGFuZGxlZEluQXBwICAgICA9IDB4MDExMywgICAgICAgLy8gdGhlIFNSRE8gZXJyb3Igd2FzIG5vdCBoYW5kbGVkIGluIEFwcFNyZG9FcnJvcigpCisgICAga0VwbFNyZG9PdmVycnVuICAgICAgICAgICAgID0gMHgwMTE0ICAgICAgICAvLyBhIFJ4U1JETyB3YXMgcmVjZWl2ZWQgYnV0IHRoZSBwZXZpb3VzIG9uZSB3YXMgbm90IGVsc2UgcHJvY2Vzc2VkCisqLworCisJa0VwbEFwaVRhc2tEZWZlcnJlZCA9IDB4MDE0MCwJLy8gRVBMIHBlcmZvcm1zIHRhc2sgaW4gYmFja2dyb3VuZCBhbmQgaW5mb3JtcyB0aGUgYXBwbGljYXRpb24gKG9yIHZpY2UtdmVyc2EpLCB3aGVuIGl0IGlzIGZpbmlzaGVkCisJa0VwbEFwaUludmFsaWRQYXJhbSA9IDB4MDE0MiwJLy8gcGFzc2VkIGludmFsaWQgcGFyYW1ldGVycyB0byBhIGZ1bmN0aW9uIChlLmcuIGludmFsaWQgbm9kZSBpZCkKKworCS8vIGFyZWEgdW50aWxsIDB4MDdGRiBpcyByZXNlcnZlZAorCS8vIGFyZWEgZm9yIHVzZXIgYXBwbGljYXRpb24gZnJvbSAweDA4MDAgdG8gMHg3RkZGCisKK30gdEVwbEtlcm5lbDsKKworI2VuZGlmCisvL0VPRgorCisvLyBEaWUgbGV0enRlIFplaWxlIG113yB1bmJlZGluZ3QgZWluZSBsZWVyZSBaZWlsZSBzZWluLCB3ZWlsIG1hbmNoZSBDb21waWxlcgorLy8gZGFtaXQgZWluIFByb2JsZW0gaGFiZW4sIHdlbm4gZGFzIG5pY2h0IHNvIGlzdCAoei5CLiBHTlUgb2RlciBCb3JsYW5kIEMrKyBCdWlsZGVyKS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRXJyb3JIYW5kbGVyay5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxFcnJvckhhbmRsZXJrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEyNTIxZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRXJyb3JIYW5kbGVyay5jCkBAIC0wLDAgKzEsODEwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgc291cmNlIGZpbGUgZm9yIGVycm9yIGhhbmRsZXIgbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsRXJyb3JIYW5kbGVyay5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS45ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMTAvMDIgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImtlcm5lbC9FcGxFcnJvckhhbmRsZXJrLmgiCisjaW5jbHVkZSAiRXBsTm10LmgiCisjaW5jbHVkZSAia2VybmVsL0VwbEV2ZW50ay5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxPYmRrLmgiCS8vIGZ1bmN0aW9uIHByb3RvdHlwcyBvZiB0aGUgRXBsT0JELU1vZHVsCisjaW5jbHVkZSAia2VybmVsL0VwbERsbGsuaCIKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRLKSkgPT0gMCkKKyNlcnJvciAiRVBMIEVycm9ySGFuZGxlciBtb2R1bGUgbmVlZHMgRVBMIG1vZHVsZSBPQkRLISIKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCB7CisJRFdPUkQgbV9kd0N1bXVsYXRpdmVDbnQ7CS8vIHN1YmluZGV4IDEKKwlEV09SRCBtX2R3VGhyZXNob2xkQ250OwkvLyBzdWJpbmRleCAyCisJRFdPUkQgbV9kd1RocmVzaG9sZDsJLy8gc3ViaW5kZXggMworCit9IHRFcGxFcnJvckhhbmRsZXJrRXJyb3JDb3VudGVyOworCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbEVycm9ySGFuZGxlcmtFcnJvckNvdW50ZXIgbV9Dbkxvc3NTb2M7CS8vIG9iamVjdCAweDFDMEIKKwl0RXBsRXJyb3JIYW5kbGVya0Vycm9yQ291bnRlciBtX0NuTG9zc1ByZXE7CS8vIG9iamVjdCAweDFDMEQKKwl0RXBsRXJyb3JIYW5kbGVya0Vycm9yQ291bnRlciBtX0NuQ3JjRXJyOwkvLyBvYmplY3QgMHgxQzBGCisJdW5zaWduZWQgbG9uZyBtX3VsRGxsRXJyb3JFdmVudHM7CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJdEVwbEVycm9ySGFuZGxlcmtFcnJvckNvdW50ZXIgbV9NbkNyY0VycjsJLy8gb2JqZWN0IDB4MUMwMAorCXRFcGxFcnJvckhhbmRsZXJrRXJyb3JDb3VudGVyIG1fTW5DeWNUaW1lRXhjZWVkOwkvLyBvYmplY3QgMHgxQzAyCisJRFdPUkQgbV9hZHdNbkNuTG9zc1ByZXNDdW1DbnRbMjU0XTsJLy8gb2JqZWN0IDB4MUMwNworCURXT1JEIG1fYWR3TW5Dbkxvc3NQcmVzVGhyQ250WzI1NF07CS8vIG9iamVjdCAweDFDMDgKKwlEV09SRCBtX2Fkd01uQ25Mb3NzUHJlc1RocmVzaG9sZFsyNTRdOwkvLyBvYmplY3QgMHgxQzA5CisJQk9PTCBtX2FmTW5Dbkxvc3NQcmVzRXZlbnRbMjU0XTsKKyNlbmRpZgorCit9IHRFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2U7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsRXJyb3JIYW5kbGVya0luc3RhbmNlIEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsRXJyb3JIYW5kbGVya0xpbmtFcnJvckNvdW50ZXIodEVwbEVycm9ySGFuZGxlcmtFcnJvckNvdW50ZXIKKwkJCQkJCSAgICogcEVycm9yQ291bnRlcl9wLAorCQkJCQkJICAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCk7CisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxFcnJvckhhbmRsZXJrTGlua0FycmF5KERXT1JEICogcGR3VmFsdWVfcCwKKwkJCQkJICAgIHVuc2lnbmVkIGludCB1aVZhbHVlQ291bnRfcCwKKwkJCQkJICAgIHVuc2lnbmVkIGludCB1aUluZGV4X3ApOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEMgTCBBIFMgUyAgPEVwbC1LZXJuZWxzcGFjZS1FcnJvci1IYW5kbGVyPiAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxFcnJvckhhbmRsZXJrSW5pdAorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBpbml0aWFsaXplIHRoZSBmaXJzdCBpbnN0YW5jZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgICB0RXBLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFcnJvckhhbmRsZXJrSW5pdCh2b2lkKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0gRXBsRXJyb3JIYW5kbGVya0FkZEluc3RhbmNlKCk7CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEVycm9ySGFuZGxlcmtBZGRJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBhZGQgb25lIG1vcmUgaW5zdGFuY2UKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICAgdEVwS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsRXJyb3JIYW5kbGVya0FkZEluc3RhbmNlKHZvaWQpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIHJlc2V0IG9ubHkgZXZlbnQgdmFyaWFibGUsCisJLy8gYWxsIG90aGVyIGluc3RhbmNlIG1lbWJlcnMgYXJlIHJlc2V0IGJ5IE9EIG9yIG1heSBrZWVwIHRoZWlyIGN1cnJlbnQgdmFsdWUKKwkvLyBkLmsuOiB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIGN1bXVsYXRpdmUgY291bnRlcnMsIHdoaWNoIHNoYWxsIG5vdCBiZSByZXNldAorCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fdWxEbGxFcnJvckV2ZW50cyA9IDA7CisKKwkvLyBsaW5rIGNvdW50ZXJzIHRvIE9ECisJLy8gJCQkIGQuay4gaWYgT0QgcmVzaWRlcyBpbiB1c2Vyc3BhY2UsIGZldGNoIHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeSwKKwkvLyAgICAgICAgICB3aGljaCBzaGFsbCBoYXZlIHRoZSBzYW1lIHN0cnVjdHVyZSBhcyB0aGUgaW5zdGFuY2UgKG5lZWRzIHRvIGJlIGRlY2xhcmVkIGdsb2JhbGx5KS4KKwkvLyAgICAgICAgICBPdGhlciBpZGVhOiBlcnJvciBjb3VudGVyIHNoYWxsIGJlbG9uZyB0byB0aGUgcHJvY2VzcyBpbWFnZQorCS8vICAgICAgICAgIChyZXNldCBvZiBjb3VudGVycyBieSBTRE8gd3JpdGUgYXJlIGEgbGl0dGxlIGJpdCB0cmlja3kpLgorCisJUmV0ID0KKwkgICAgRXBsRXJyb3JIYW5kbGVya0xpbmtFcnJvckNvdW50ZXIoJkVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQkgICAgIG1fQ25Mb3NzU29jLCAweDFDMEIpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCVJldCA9CisJICAgIEVwbEVycm9ySGFuZGxlcmtMaW5rRXJyb3JDb3VudGVyKCZFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkJICAgICBtX0NuTG9zc1ByZXEsIDB4MUMwRCk7CisJLy8gaWdub3JlIHJldHVybiBjb2RlLCBiZWNhdXNlIG9iamVjdCAweDFDMEQgaXMgY29uZGl0aW9uYWwKKworCVJldCA9CisJICAgIEVwbEVycm9ySGFuZGxlcmtMaW5rRXJyb3JDb3VudGVyKCZFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkJICAgICBtX0NuQ3JjRXJyLCAweDFDMEYpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJUmV0ID0KKwkgICAgRXBsRXJyb3JIYW5kbGVya0xpbmtFcnJvckNvdW50ZXIoJkVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQkgICAgIG1fTW5DcmNFcnIsIDB4MUMwMCk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisJUmV0ID0KKwkgICAgRXBsRXJyb3JIYW5kbGVya0xpbmtFcnJvckNvdW50ZXIoJkVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQkgICAgIG1fTW5DeWNUaW1lRXhjZWVkLCAweDFDMDIpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCVJldCA9CisJICAgIEVwbEVycm9ySGFuZGxlcmtMaW5rQXJyYXkoRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cuCisJCQkJICAgICAgbV9hZHdNbkNuTG9zc1ByZXNDdW1DbnQsCisJCQkJICAgICAgdGFiZW50cmllcyhFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkJCSBtX2Fkd01uQ25Mb3NzUHJlc0N1bUNudCksCisJCQkJICAgICAgMHgxQzA3KTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlSZXQgPQorCSAgICBFcGxFcnJvckhhbmRsZXJrTGlua0FycmF5KEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCSAgICAgIG1fYWR3TW5Dbkxvc3NQcmVzVGhyQ250LAorCQkJCSAgICAgIHRhYmVudHJpZXMoRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cuCisJCQkJCQkgbV9hZHdNbkNuTG9zc1ByZXNUaHJDbnQpLAorCQkJCSAgICAgIDB4MUMwOCk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisJUmV0ID0KKwkgICAgRXBsRXJyb3JIYW5kbGVya0xpbmtBcnJheShFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkgICAgICBtX2Fkd01uQ25Mb3NzUHJlc1RocmVzaG9sZCwKKwkJCQkgICAgICB0YWJlbnRyaWVzKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQkJIG1fYWR3TW5Dbkxvc3NQcmVzVGhyZXNob2xkKSwKKwkJCQkgICAgICAweDFDMDkpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKyNlbmRpZgorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRXJyb3JIYW5kbGVya0RlbEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGRlbGV0ZSBpbnN0YW5jZSBhbiBmcmVlIHRoZSBidWZmZXJzdHJ1Y3R1cmUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICAgdEVwS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsRXJyb3JIYW5kbGVya0RlbEluc3RhbmNlKCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxFcnJvckhhbmRsZXJrUHJvY2VzcworLy8KKy8vIERlc2NyaXB0aW9uOiBwcm9jZXNzZXMgZXJyb3IgZXZlbnRzIGZyb20gRExMCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEV2ZW50X3AgPSBwb2ludGVyIHRvIGV2ZW50LXN0cnVjdHVyIGZyb20gYnVmZmVyCisvLworLy8KKy8vIFJldHVybnM6ICAgICAgdEVwS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsRXJyb3JIYW5kbGVya1Byb2Nlc3ModEVwbEV2ZW50ICogcEV2ZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdW5zaWduZWQgbG9uZyB1bERsbEVycm9yRXZlbnRzOworCXRFcGxFdmVudCBFdmVudDsKKwl0RXBsTm10RXZlbnQgTm10RXZlbnQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGNoZWNrIG1fRXZlbnRUeXBlCisJc3dpdGNoIChwRXZlbnRfcC0+bV9FdmVudFR5cGUpIHsKKwljYXNlIGtFcGxFdmVudFR5cGVEbGxFcnJvcjoKKwkJeworCQkJdEVwbEVycm9ySGFuZGxlcmtFdmVudCAqcEVyckhhbmRsZXJFdmVudCA9CisJCQkgICAgKHRFcGxFcnJvckhhbmRsZXJrRXZlbnQgKikgcEV2ZW50X3AtPm1fcEFyZzsKKworCQkJdWxEbGxFcnJvckV2ZW50cyA9IHBFcnJIYW5kbGVyRXZlbnQtPm1fdWxEbGxFcnJvckV2ZW50czsKKworCQkJLy8gY2hlY2sgdGhlIHNldmVyYWwgZXJyb3IgZXZlbnRzCisJCQlpZiAoKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fQ25Mb3NzU29jLgorCQkJICAgICBtX2R3VGhyZXNob2xkID4gMCkKKwkJCSAgICAmJiAoKHVsRGxsRXJyb3JFdmVudHMgJiBFUExfRExMX0VSUl9DTl9MT1NTX1NPQykgIT0gMCkpIHsJLy8gbG9zcyBvZiBTb0MgZXZlbnQgb2NjdXJlZAorCQkJCS8vIGluY3JlbWVudCBjdW11bGF0aXZlIGNvdW50ZXIgYnkgMQorCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fQ25Mb3NzU29jLgorCQkJCSAgICBtX2R3Q3VtdWxhdGl2ZUNudCsrOworCQkJCS8vIGluY3JlbWVudCB0aHJlc2hvbGQgY291bnRlciBieSA4CisJCQkJRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV9Dbkxvc3NTb2MuCisJCQkJICAgIG1fZHdUaHJlc2hvbGRDbnQgKz0gODsKKwkJCQlpZiAoRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV9Dbkxvc3NTb2MubV9kd1RocmVzaG9sZENudCA+PSBFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX0NuTG9zc1NvYy5tX2R3VGhyZXNob2xkKSB7CS8vIHRocmVzaG9sZCBpcyByZWFjaGVkCisJCQkJCS8vICQkJCBkLmsuOiBnZW5lcmF0ZSBlcnJvciBoaXN0b3J5IGVudHJ5IEVfRExMX0xPU1NfU09DX1RICisKKwkJCQkJLy8gcG9zdCBldmVudCB0byBOTVQgc3RhdGUgbWFjaGluZQorCQkJCQlObXRFdmVudCA9IGtFcGxObXRFdmVudE5tdEN5Y2xlRXJyb3I7CisJCQkJCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua05tdGs7CisJCQkJCUV2ZW50Lm1fRXZlbnRUeXBlID0KKwkJCQkJICAgIGtFcGxFdmVudFR5cGVObXRFdmVudDsKKwkJCQkJRXZlbnQubV9wQXJnID0gJk5tdEV2ZW50OworCQkJCQlFdmVudC5tX3VpU2l6ZSA9IHNpemVvZihObXRFdmVudCk7CisJCQkJCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKwkJCQl9CisJCQkJRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV91bERsbEVycm9yRXZlbnRzIHw9CisJCQkJICAgIEVQTF9ETExfRVJSX0NOX0xPU1NfU09DOworCQkJfQorCisJCQlpZiAoKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fQ25Mb3NzUHJlcS4KKwkJCSAgICAgbV9kd1RocmVzaG9sZCA+IDApCisJCQkgICAgJiYgKCh1bERsbEVycm9yRXZlbnRzICYgRVBMX0RMTF9FUlJfQ05fTE9TU19QUkVRKSAhPSAwKSkgewkvLyBsb3NzIG9mIFBSZXEgZXZlbnQgb2NjdXJlZAorCQkJCS8vIGluY3JlbWVudCBjdW11bGF0aXZlIGNvdW50ZXIgYnkgMQorCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fQ25Mb3NzUHJlcS4KKwkJCQkgICAgbV9kd0N1bXVsYXRpdmVDbnQrKzsKKwkJCQkvLyBpbmNyZW1lbnQgdGhyZXNob2xkIGNvdW50ZXIgYnkgOAorCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fQ25Mb3NzUHJlcS4KKwkJCQkgICAgbV9kd1RocmVzaG9sZENudCArPSA4OworCQkJCWlmIChFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX0NuTG9zc1ByZXEubV9kd1RocmVzaG9sZENudCA+PSBFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX0NuTG9zc1ByZXEubV9kd1RocmVzaG9sZCkgewkvLyB0aHJlc2hvbGQgaXMgcmVhY2hlZAorCQkJCQkvLyAkJCQgZC5rLjogZ2VuZXJhdGUgZXJyb3IgaGlzdG9yeSBlbnRyeSBFX0RMTF9MT1NTX1BSRVFfVEgKKworCQkJCQkvLyBwb3N0IGV2ZW50IHRvIE5NVCBzdGF0ZSBtYWNoaW5lCisJCQkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50Tm10Q3ljbGVFcnJvcjsKKwkJCQkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rTm10azsKKwkJCQkJRXZlbnQubV9FdmVudFR5cGUgPQorCQkJCQkgICAga0VwbEV2ZW50VHlwZU5tdEV2ZW50OworCQkJCQlFdmVudC5tX3BBcmcgPSAmTm10RXZlbnQ7CisJCQkJCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKE5tdEV2ZW50KTsKKwkJCQkJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKChFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX0NuTG9zc1ByZXEuCisJCQkgICAgIG1fZHdUaHJlc2hvbGRDbnQgPiAwKQorCQkJICAgICYmICgodWxEbGxFcnJvckV2ZW50cyAmIEVQTF9ETExfRVJSX0NOX1JFQ1ZEX1BSRVEpICE9IDApKSB7CS8vIFBSZXEgY29ycmVjdGx5IHJlY2VpdmVkCisJCQkJLy8gZGVjcmVtZW50IHRocmVzaG9sZCBjb3VudGVyIGJ5IDEKKwkJCQlFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX0NuTG9zc1ByZXEuCisJCQkJICAgIG1fZHdUaHJlc2hvbGRDbnQtLTsKKwkJCX0KKworCQkJaWYgKChFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX0NuQ3JjRXJyLgorCQkJICAgICBtX2R3VGhyZXNob2xkID4gMCkKKwkJCSAgICAmJiAoKHVsRGxsRXJyb3JFdmVudHMgJiBFUExfRExMX0VSUl9DTl9DUkMpICE9IDApKSB7CS8vIENSQyBlcnJvciBldmVudCBvY2N1cmVkCisJCQkJLy8gaW5jcmVtZW50IGN1bXVsYXRpdmUgY291bnRlciBieSAxCisJCQkJRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV9DbkNyY0Vyci4KKwkJCQkgICAgbV9kd0N1bXVsYXRpdmVDbnQrKzsKKwkJCQkvLyBpbmNyZW1lbnQgdGhyZXNob2xkIGNvdW50ZXIgYnkgOAorCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fQ25DcmNFcnIuCisJCQkJICAgIG1fZHdUaHJlc2hvbGRDbnQgKz0gODsKKwkJCQlpZiAoRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV9DbkNyY0Vyci5tX2R3VGhyZXNob2xkQ250ID49IEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fQ25DcmNFcnIubV9kd1RocmVzaG9sZCkgewkvLyB0aHJlc2hvbGQgaXMgcmVhY2hlZAorCQkJCQkvLyAkJCQgZC5rLjogZ2VuZXJhdGUgZXJyb3IgaGlzdG9yeSBlbnRyeSBFX0RMTF9DUkNfVEgKKworCQkJCQkvLyBwb3N0IGV2ZW50IHRvIE5NVCBzdGF0ZSBtYWNoaW5lCisJCQkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50Tm10Q3ljbGVFcnJvcjsKKwkJCQkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rTm10azsKKwkJCQkJRXZlbnQubV9FdmVudFR5cGUgPQorCQkJCQkgICAga0VwbEV2ZW50VHlwZU5tdEV2ZW50OworCQkJCQlFdmVudC5tX3BBcmcgPSAmTm10RXZlbnQ7CisJCQkJCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKE5tdEV2ZW50KTsKKwkJCQkJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworCQkJCX0KKwkJCQlFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX3VsRGxsRXJyb3JFdmVudHMgfD0KKwkJCQkgICAgRVBMX0RMTF9FUlJfQ05fQ1JDOworCQkJfQorCisJCQlpZiAoKHVsRGxsRXJyb3JFdmVudHMgJiBFUExfRExMX0VSUl9JTlZBTElEX0ZPUk1BVCkgIT0gMCkgewkvLyBpbnZhbGlkIGZvcm1hdCBlcnJvciBvY2N1cmVkIChvbmx5IGRpcmVjdCByZWFjdGlvbikKKwkJCQkvLyAkJCQgZC5rLjogZ2VuZXJhdGUgZXJyb3IgaGlzdG9yeSBlbnRyeSBFX0RMTF9JTlZBTElEX0ZPUk1BVAorI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwkJCQlpZiAocEVyckhhbmRsZXJFdmVudC0+bV9ObXRTdGF0ZSA+PSBrRXBsTm10TXNOb3RBY3RpdmUpIHsJLy8gTU4gaXMgYWN0aXZlCisJCQkJCWlmIChwRXJySGFuZGxlckV2ZW50LT5tX3VpTm9kZUlkICE9IDApIHsKKwkJCQkJCXRFcGxIZWFydGJlYXRFdmVudAorCQkJCQkJICAgIEhlYXJ0YmVhdEV2ZW50OworCisJCQkJCQkvLyByZW1vdmUgbm9kZSBmcm9tIGlzb2Nocm9ub3VzIHBoYXNlCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbERsbGtEZWxldGVOb2RlCisJCQkJCQkgICAgKHBFcnJIYW5kbGVyRXZlbnQtPgorCQkJCQkJICAgICBtX3VpTm9kZUlkKTsKKworCQkJCQkJLy8gaW5mb3JtIE5tdE1udSBtb2R1bGUgYWJvdXQgc3RhdGUgY2hhbmdlLCB3aGljaCBzaGFsbCBzZW5kIE5NVCBjb21tYW5kIFJlc2V0Tm9kZSB0byB0aGlzIENOCisJCQkJCQlIZWFydGJlYXRFdmVudC5tX3VpTm9kZUlkID0KKwkJCQkJCSAgICBwRXJySGFuZGxlckV2ZW50LT4KKwkJCQkJCSAgICBtX3VpTm9kZUlkOworCQkJCQkJSGVhcnRiZWF0RXZlbnQubV9ObXRTdGF0ZSA9CisJCQkJCQkgICAga0VwbE5tdENzTm90QWN0aXZlOworCQkJCQkJSGVhcnRiZWF0RXZlbnQubV93RXJyb3JDb2RlID0KKwkJCQkJCSAgICBFUExfRV9ETExfSU5WQUxJRF9GT1JNQVQ7CisJCQkJCQlFdmVudC5tX0V2ZW50U2luayA9CisJCQkJCQkgICAga0VwbEV2ZW50U2lua05tdE1udTsKKwkJCQkJCUV2ZW50Lm1fRXZlbnRUeXBlID0KKwkJCQkJCSAgICBrRXBsRXZlbnRUeXBlSGVhcnRiZWF0OworCQkJCQkJRXZlbnQubV91aVNpemUgPQorCQkJCQkJICAgIHNpemVvZihIZWFydGJlYXRFdmVudCk7CisJCQkJCQlFdmVudC5tX3BBcmcgPSAmSGVhcnRiZWF0RXZlbnQ7CisJCQkJCQlSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisJCQkJCX0KKwkJCQkJLy8gJCQkIGFuZCBlbHNlIHNob3VsZCBsZWFkIHRvIEludGVybkNvbUVycm9yCisJCQkJfSBlbHNlCisjZW5kaWYKKwkJCQl7CS8vIENOIGlzIGFjdGl2ZQorCQkJCQkvLyBwb3N0IGV2ZW50IHRvIE5NVCBzdGF0ZSBtYWNoaW5lCisJCQkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50SW50ZXJuQ29tRXJyb3I7CisJCQkJCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua05tdGs7CisJCQkJCUV2ZW50Lm1fRXZlbnRUeXBlID0KKwkJCQkJICAgIGtFcGxFdmVudFR5cGVObXRFdmVudDsKKwkJCQkJRXZlbnQubV9wQXJnID0gJk5tdEV2ZW50OworCQkJCQlFdmVudC5tX3VpU2l6ZSA9IHNpemVvZihObXRFdmVudCk7CisJCQkJCVJldCA9IEVwbEV2ZW50a1Bvc3QoJkV2ZW50KTsKKwkJCQl9CisJCQl9CisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCQkJaWYgKChFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX01uQ3JjRXJyLgorCQkJICAgICBtX2R3VGhyZXNob2xkID4gMCkKKwkJCSAgICAmJiAoKHVsRGxsRXJyb3JFdmVudHMgJiBFUExfRExMX0VSUl9NTl9DUkMpICE9IDApKSB7CS8vIENSQyBlcnJvciBldmVudCBvY2N1cmVkCisJCQkJLy8gaW5jcmVtZW50IGN1bXVsYXRpdmUgY291bnRlciBieSAxCisJCQkJRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV9NbkNyY0Vyci4KKwkJCQkgICAgbV9kd0N1bXVsYXRpdmVDbnQrKzsKKwkJCQkvLyBpbmNyZW1lbnQgdGhyZXNob2xkIGNvdW50ZXIgYnkgOAorCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fTW5DcmNFcnIuCisJCQkJICAgIG1fZHdUaHJlc2hvbGRDbnQgKz0gODsKKwkJCQlpZiAoRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV9NbkNyY0Vyci5tX2R3VGhyZXNob2xkQ250ID49IEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fTW5DcmNFcnIubV9kd1RocmVzaG9sZCkgewkvLyB0aHJlc2hvbGQgaXMgcmVhY2hlZAorCQkJCQkvLyAkJCQgZC5rLjogZ2VuZXJhdGUgZXJyb3IgaGlzdG9yeSBlbnRyeSBFX0RMTF9DUkNfVEgKKworCQkJCQkvLyBwb3N0IGV2ZW50IHRvIE5NVCBzdGF0ZSBtYWNoaW5lCisJCQkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50Tm10Q3ljbGVFcnJvcjsKKwkJCQkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rTm10azsKKwkJCQkJRXZlbnQubV9FdmVudFR5cGUgPQorCQkJCQkgICAga0VwbEV2ZW50VHlwZU5tdEV2ZW50OworCQkJCQlFdmVudC5tX3BBcmcgPSAmTm10RXZlbnQ7CisJCQkJCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKE5tdEV2ZW50KTsKKwkJCQkJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworCQkJCX0KKwkJCQlFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX3VsRGxsRXJyb3JFdmVudHMgfD0KKwkJCQkgICAgRVBMX0RMTF9FUlJfTU5fQ1JDOworCQkJfQorCisJCQlpZiAoKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fTW5DeWNUaW1lRXhjZWVkLgorCQkJICAgICBtX2R3VGhyZXNob2xkID4gMCkKKwkJCSAgICAmJiAoKHVsRGxsRXJyb3JFdmVudHMgJiBFUExfRExMX0VSUl9NTl9DWUNUSU1FRVhDRUVEKSAhPSAwKSkgewkvLyBjeWNsZSB0aW1lIGV4Y2VlZGVkIGV2ZW50IG9jY3VyZWQKKwkJCQkvLyBpbmNyZW1lbnQgY3VtdWxhdGl2ZSBjb3VudGVyIGJ5IDEKKwkJCQlFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX01uQ3ljVGltZUV4Y2VlZC4KKwkJCQkgICAgbV9kd0N1bXVsYXRpdmVDbnQrKzsKKwkJCQkvLyBpbmNyZW1lbnQgdGhyZXNob2xkIGNvdW50ZXIgYnkgOAorCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fTW5DeWNUaW1lRXhjZWVkLgorCQkJCSAgICBtX2R3VGhyZXNob2xkQ250ICs9IDg7CisJCQkJaWYgKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fTW5DeWNUaW1lRXhjZWVkLm1fZHdUaHJlc2hvbGRDbnQgPj0gRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV9NbkN5Y1RpbWVFeGNlZWQubV9kd1RocmVzaG9sZCkgewkvLyB0aHJlc2hvbGQgaXMgcmVhY2hlZAorCQkJCQkvLyAkJCQgZC5rLjogZ2VuZXJhdGUgZXJyb3IgaGlzdG9yeSBlbnRyeSBFX0RMTF9DWUNMRV9FWENFRURfVEgKKworCQkJCQkvLyBwb3N0IGV2ZW50IHRvIE5NVCBzdGF0ZSBtYWNoaW5lCisJCQkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50Tm10Q3ljbGVFcnJvcjsKKwkJCQkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rTm10azsKKwkJCQkJRXZlbnQubV9FdmVudFR5cGUgPQorCQkJCQkgICAga0VwbEV2ZW50VHlwZU5tdEV2ZW50OworCQkJCQlFdmVudC5tX3BBcmcgPSAmTm10RXZlbnQ7CisJCQkJCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKE5tdEV2ZW50KTsKKwkJCQkJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworCQkJCX0KKwkJCQkvLyAkJCQgZC5rLjogZWxzZSBnZW5lcmF0ZSBlcnJvciBoaXN0b3J5IGVudHJ5IEVfRExMX0NZQ0xFX0VYQ0VFRAorCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fdWxEbGxFcnJvckV2ZW50cyB8PQorCQkJCSAgICBFUExfRExMX0VSUl9NTl9DWUNUSU1FRVhDRUVEOworCQkJfQorCisJCQlpZiAoKHVsRGxsRXJyb3JFdmVudHMgJiBFUExfRExMX0VSUl9NTl9DTl9MT1NTX1BSRVMpICE9IDApIHsJLy8gQ04gbG9zcyBQUmVzIGV2ZW50IG9jY3VyZWQKKwkJCQl1bnNpZ25lZCBpbnQgdWlOb2RlSWQ7CisKKwkJCQl1aU5vZGVJZCA9IHBFcnJIYW5kbGVyRXZlbnQtPm1fdWlOb2RlSWQgLSAxOworCQkJCWlmICgodWlOb2RlSWQgPAorCQkJCSAgICAgdGFiZW50cmllcyhFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkJCW1fYWR3TW5Dbkxvc3NQcmVzQ3VtQ250KSkKKwkJCQkgICAgJiYgKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQltX2Fkd01uQ25Mb3NzUHJlc1RocmVzaG9sZFt1aU5vZGVJZF0gPgorCQkJCQkwKSkgeworCQkJCQkvLyBpbmNyZW1lbnQgY3VtdWxhdGl2ZSBjb3VudGVyIGJ5IDEKKwkJCQkJRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cuCisJCQkJCSAgICBtX2Fkd01uQ25Mb3NzUHJlc0N1bUNudFt1aU5vZGVJZF0rKzsKKwkJCQkJLy8gaW5jcmVtZW50IHRocmVzaG9sZCBjb3VudGVyIGJ5IDgKKwkJCQkJRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cuCisJCQkJCSAgICBtX2Fkd01uQ25Mb3NzUHJlc1RockNudFt1aU5vZGVJZF0gKz0KKwkJCQkJICAgIDg7CisJCQkJCWlmIChFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fYWR3TW5Dbkxvc3NQcmVzVGhyQ250W3VpTm9kZUlkXQorCQkJCQkgICAgPj0gRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV9hZHdNbkNuTG9zc1ByZXNUaHJlc2hvbGRbdWlOb2RlSWRdKSB7CS8vIHRocmVzaG9sZCBpcyByZWFjaGVkCisJCQkJCQl0RXBsSGVhcnRiZWF0RXZlbnQKKwkJCQkJCSAgICBIZWFydGJlYXRFdmVudDsKKworCQkJCQkJLy8gJCQkIGQuay46IGdlbmVyYXRlIGVycm9yIGhpc3RvcnkgZW50cnkgRV9ETExfTE9TU19QUkVTX1RICisKKwkJCQkJCS8vIHJlbW92ZSBub2RlIGZyb20gaXNvY2hyb25vdXMgcGhhc2UKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsRGxsa0RlbGV0ZU5vZGUKKwkJCQkJCSAgICAocEVyckhhbmRsZXJFdmVudC0+CisJCQkJCQkgICAgIG1fdWlOb2RlSWQpOworCisJCQkJCQkvLyBpbmZvcm0gTm10TW51IG1vZHVsZSBhYm91dCBzdGF0ZSBjaGFuZ2UsIHdoaWNoIHNoYWxsIHNlbmQgTk1UIGNvbW1hbmQgUmVzZXROb2RlIHRvIHRoaXMgQ04KKwkJCQkJCUhlYXJ0YmVhdEV2ZW50Lm1fdWlOb2RlSWQgPQorCQkJCQkJICAgIHBFcnJIYW5kbGVyRXZlbnQtPgorCQkJCQkJICAgIG1fdWlOb2RlSWQ7CisJCQkJCQlIZWFydGJlYXRFdmVudC5tX05tdFN0YXRlID0KKwkJCQkJCSAgICBrRXBsTm10Q3NOb3RBY3RpdmU7CisJCQkJCQlIZWFydGJlYXRFdmVudC5tX3dFcnJvckNvZGUgPQorCQkJCQkJICAgIEVQTF9FX0RMTF9MT1NTX1BSRVNfVEg7CisJCQkJCQlFdmVudC5tX0V2ZW50U2luayA9CisJCQkJCQkgICAga0VwbEV2ZW50U2lua05tdE1udTsKKwkJCQkJCUV2ZW50Lm1fRXZlbnRUeXBlID0KKwkJCQkJCSAgICBrRXBsRXZlbnRUeXBlSGVhcnRiZWF0OworCQkJCQkJRXZlbnQubV91aVNpemUgPQorCQkJCQkJICAgIHNpemVvZihIZWFydGJlYXRFdmVudCk7CisJCQkJCQlFdmVudC5tX3BBcmcgPSAmSGVhcnRiZWF0RXZlbnQ7CisJCQkJCQlSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisJCQkJCX0KKwkJCQkJRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cuCisJCQkJCSAgICBtX2FmTW5Dbkxvc3NQcmVzRXZlbnRbdWlOb2RlSWRdID0KKwkJCQkJICAgIFRSVUU7CisJCQkJfQorCQkJfQorI2VuZGlmCisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gTk1UIGV2ZW50CisJY2FzZSBrRXBsRXZlbnRUeXBlTm10RXZlbnQ6CisJCXsKKwkJCWlmICgoKih0RXBsTm10RXZlbnQgKikgcEV2ZW50X3AtPm1fcEFyZykgPT0ga0VwbE5tdEV2ZW50RGxsQ2VTb2EpIHsJLy8gU29BIGV2ZW50IG9mIENOIC0+IGRlY3JlbWVudCB0aHJlc2hvbGQgY291bnRlcnMKKworCQkJCWlmICgoRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cubV91bERsbEVycm9yRXZlbnRzICYgRVBMX0RMTF9FUlJfQ05fTE9TU19TT0MpID09IDApIHsJLy8gZGVjcmVtZW50IGxvc3Mgb2YgU29DIHRocmVzaG9sZCBjb3VudGVyLCBiZWNhdXNlIGl0IGRpZG4ndCBvY2N1ciBsYXN0IGN5Y2xlCisJCQkJCWlmIChFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fQ25Mb3NzU29jLm1fZHdUaHJlc2hvbGRDbnQgPiAwKSB7CisJCQkJCQlFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICBtX0NuTG9zc1NvYy4KKwkJCQkJCSAgICBtX2R3VGhyZXNob2xkQ250LS07CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAoKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fdWxEbGxFcnJvckV2ZW50cyAmIEVQTF9ETExfRVJSX0NOX0NSQykgPT0gMCkgewkvLyBkZWNyZW1lbnQgQ1JDIHRocmVzaG9sZCBjb3VudGVyLCBiZWNhdXNlIGl0IGRpZG4ndCBvY2N1ciBsYXN0IGN5Y2xlCisJCQkJCWlmIChFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fQ25DcmNFcnIubV9kd1RocmVzaG9sZENudCA+IDApIHsKKwkJCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fQ25DcmNFcnIuCisJCQkJCQkgICAgbV9kd1RocmVzaG9sZENudC0tOworCQkJCQl9CisJCQkJfQorCQkJfQorI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwkJCWVsc2UgaWYgKCgqKHRFcGxObXRFdmVudCAqKSBwRXZlbnRfcC0+bV9wQXJnKSA9PSBrRXBsTm10RXZlbnREbGxNZVNvYVNlbnQpIHsJLy8gU29BIGV2ZW50IG9mIE1OIC0+IGRlY3JlbWVudCB0aHJlc2hvbGQgY291bnRlcnMKKwkJCQl0RXBsRGxsa05vZGVJbmZvICpwSW50Tm9kZUluZm87CisJCQkJdW5zaWduZWQgaW50IHVpTm9kZUlkOworCisJCQkJUmV0ID0gRXBsRGxsa0dldEZpcnN0Tm9kZUluZm8oJnBJbnROb2RlSW5mbyk7CisJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLy8gaXRlcmF0ZSB0aHJvdWdoIG5vZGUgaW5mbyBzdHJ1Y3R1cmUgbGlzdAorCQkJCXdoaWxlIChwSW50Tm9kZUluZm8gIT0gTlVMTCkgeworCQkJCQl1aU5vZGVJZCA9IHBJbnROb2RlSW5mby0+bV91aU5vZGVJZCAtIDE7CisJCQkJCWlmICh1aU5vZGVJZCA8CisJCQkJCSAgICB0YWJlbnRyaWVzCisJCQkJCSAgICAoRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cuCisJCQkJCSAgICAgbV9hZHdNbkNuTG9zc1ByZXNDdW1DbnQpKSB7CisJCQkJCQlpZiAoRXBsRXJyb3JIYW5kbGVya0luc3RhbmNlX2cuCisJCQkJCQkgICAgbV9hZk1uQ25Mb3NzUHJlc0V2ZW50CisJCQkJCQkgICAgW3VpTm9kZUlkXSA9PSBGQUxTRSkgeworCQkJCQkJCWlmIChFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX2Fkd01uQ25Mb3NzUHJlc1RockNudFt1aU5vZGVJZF0gPiAwKSB7CisJCQkJCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQkJCQkgICAgbV9hZHdNbkNuTG9zc1ByZXNUaHJDbnQKKwkJCQkJCQkJICAgIFt1aU5vZGVJZF0tLTsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQkJCSAgICBtX2FmTW5Dbkxvc3NQcmVzRXZlbnQKKwkJCQkJCQkgICAgW3VpTm9kZUlkXSA9IEZBTFNFOworCQkJCQkJfQorCQkJCQl9CisJCQkJCXBJbnROb2RlSW5mbyA9CisJCQkJCSAgICBwSW50Tm9kZUluZm8tPm1fcE5leHROb2RlSW5mbzsKKwkJCQl9CisKKwkJCQlpZiAoKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLm1fdWxEbGxFcnJvckV2ZW50cyAmIEVQTF9ETExfRVJSX01OX0NSQykgPT0gMCkgewkvLyBkZWNyZW1lbnQgQ1JDIHRocmVzaG9sZCBjb3VudGVyLCBiZWNhdXNlIGl0IGRpZG4ndCBvY2N1ciBsYXN0IGN5Y2xlCisJCQkJCWlmIChFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fTW5DcmNFcnIubV9kd1RocmVzaG9sZENudCA+IDApIHsKKwkJCQkJCUVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fTW5DcmNFcnIuCisJCQkJCQkgICAgbV9kd1RocmVzaG9sZENudC0tOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKChFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX3VsRGxsRXJyb3JFdmVudHMgJiBFUExfRExMX0VSUl9NTl9DWUNUSU1FRVhDRUVEKSA9PSAwKSB7CS8vIGRlY3JlbWVudCBjeWNsZSBleGNlZWQgdGhyZXNob2xkIGNvdW50ZXIsIGJlY2F1c2UgaXQgZGlkbid0IG9jY3VyIGxhc3QgY3ljbGUKKwkJCQkJaWYgKEVwbEVycm9ySGFuZGxlcmtJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9NbkN5Y1RpbWVFeGNlZWQubV9kd1RocmVzaG9sZENudCA+CisJCQkJCSAgICAwKSB7CisJCQkJCQlFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy4KKwkJCQkJCSAgICBtX01uQ3ljVGltZUV4Y2VlZC4KKwkJCQkJCSAgICBtX2R3VGhyZXNob2xkQ250LS07CisJCQkJCX0KKwkJCQl9CisJCQl9CisjZW5kaWYKKworCQkJLy8gcmVzZXQgZXJyb3IgZXZlbnRzCisJCQlFcGxFcnJvckhhbmRsZXJrSW5zdGFuY2VfZy5tX3VsRGxsRXJyb3JFdmVudHMgPSAwTDsKKworCQkJYnJlYWs7CisJCX0KKworCQkvLyB1bmtub3duIHR5cGUKKwlkZWZhdWx0OgorCQl7CisJCX0KKworCX0JCQkvLyBlbmQgb2Ygc3dpdGNoKHBFdmVudF9wLT5tX0V2ZW50VHlwZSkKKworCXJldHVybiBSZXQ7CisKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEVycm9ySGFuZGxlcmtMaW5rRXJyb3JDb3VudGVyCisvLworLy8gRGVzY3JpcHRpb246IGxpbmsgc3BlY2lmaWVkIGVycm9yIGNvdW50ZXIgc3RydWN0dXJlIHRvIE9EIGVudHJ5CisvLworLy8gUGFyYW1ldGVyczogIHBFcnJvckNvdW50ZXJfcCAgICAgICAgID0gcG9pbnRlciB0byBlcnJvciBjb3VudGVyIHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgIHVpSW5kZXhfcCAgICAgICAgICAgICAgID0gT0QgaW5kZXgKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbEVycm9ySGFuZGxlcmtMaW5rRXJyb3JDb3VudGVyKHRFcGxFcnJvckhhbmRsZXJrRXJyb3JDb3VudGVyCisJCQkJCQkgICAqIHBFcnJvckNvdW50ZXJfcCwKKwkJCQkJCSAgIHVuc2lnbmVkIGludCB1aUluZGV4X3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsVmFyUGFyYW0gVmFyUGFyYW07CisKKwlWYXJQYXJhbS5tX3BEYXRhID0gJnBFcnJvckNvdW50ZXJfcC0+bV9kd0N1bXVsYXRpdmVDbnQ7CisJVmFyUGFyYW0ubV9TaXplID0gc2l6ZW9mKERXT1JEKTsKKwlWYXJQYXJhbS5tX3VpSW5kZXggPSB1aUluZGV4X3A7CisJVmFyUGFyYW0ubV91aVN1YmluZGV4ID0gMHgwMTsKKwlWYXJQYXJhbS5tX1ZhbGlkRmxhZyA9IGtWYXJWYWxpZEFsbDsKKwlSZXQgPSBFcGxPYmREZWZpbmVWYXIoJlZhclBhcmFtKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlWYXJQYXJhbS5tX3BEYXRhID0gJnBFcnJvckNvdW50ZXJfcC0+bV9kd1RocmVzaG9sZENudDsKKwlWYXJQYXJhbS5tX1NpemUgPSBzaXplb2YoRFdPUkQpOworCVZhclBhcmFtLm1fdWlJbmRleCA9IHVpSW5kZXhfcDsKKwlWYXJQYXJhbS5tX3VpU3ViaW5kZXggPSAweDAyOworCVZhclBhcmFtLm1fVmFsaWRGbGFnID0ga1ZhclZhbGlkQWxsOworCVJldCA9IEVwbE9iZERlZmluZVZhcigmVmFyUGFyYW0pOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCVZhclBhcmFtLm1fcERhdGEgPSAmcEVycm9yQ291bnRlcl9wLT5tX2R3VGhyZXNob2xkOworCVZhclBhcmFtLm1fU2l6ZSA9IHNpemVvZihEV09SRCk7CisJVmFyUGFyYW0ubV91aUluZGV4ID0gdWlJbmRleF9wOworCVZhclBhcmFtLm1fdWlTdWJpbmRleCA9IDB4MDM7CisJVmFyUGFyYW0ubV9WYWxpZEZsYWcgPSBrVmFyVmFsaWRBbGw7CisJUmV0ID0gRXBsT2JkRGVmaW5lVmFyKCZWYXJQYXJhbSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEVycm9ySGFuZGxlcmtMaW5rRXJyb3JDb3VudGVyCisvLworLy8gRGVzY3JpcHRpb246IGxpbmsgc3BlY2lmaWVkIGVycm9yIGNvdW50ZXIgc3RydWN0dXJlIHRvIE9EIGVudHJ5CisvLworLy8gUGFyYW1ldGVyczogIHBFcnJvckNvdW50ZXJfcCAgICAgICAgID0gcG9pbnRlciB0byBlcnJvciBjb3VudGVyIHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgIHVpSW5kZXhfcCAgICAgICAgICAgICAgID0gT0QgaW5kZXgKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxFcnJvckhhbmRsZXJrTGlua0FycmF5KERXT1JEICogcGR3VmFsdWVfcCwKKwkJCQkJICAgIHVuc2lnbmVkIGludCB1aVZhbHVlQ291bnRfcCwKKwkJCQkJICAgIHVuc2lnbmVkIGludCB1aUluZGV4X3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsVmFyUGFyYW0gVmFyUGFyYW07CisJdEVwbE9iZFNpemUgRW50cnlTaXplOworCUJZVEUgYkluZGV4RW50cmllczsKKworCUVudHJ5U2l6ZSA9ICh0RXBsT2JkU2l6ZSkgc2l6ZW9mKGJJbmRleEVudHJpZXMpOworCVJldCA9IEVwbE9iZFJlYWRFbnRyeSh1aUluZGV4X3AsCisJCQkgICAgICAweDAwLCAodm9pZCBHRU5FUklDICopJmJJbmRleEVudHJpZXMsICZFbnRyeVNpemUpOworCisJaWYgKChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHx8IChiSW5kZXhFbnRyaWVzID09IDB4MDApKSB7CisJCS8vIE9iamVjdCBkb2Vzbid0IGV4aXN0IG9yIGludmFsaWQgZW50cnkgbnVtYmVyCisJCVJldCA9IGtFcGxPYmRJbmRleE5vdEV4aXN0OworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKGJJbmRleEVudHJpZXMgPCB1aVZhbHVlQ291bnRfcCkgeworCQl1aVZhbHVlQ291bnRfcCA9IGJJbmRleEVudHJpZXM7CisJfQorCisJVmFyUGFyYW0ubV9TaXplID0gc2l6ZW9mKERXT1JEKTsKKwlWYXJQYXJhbS5tX3VpSW5kZXggPSB1aUluZGV4X3A7CisJVmFyUGFyYW0ubV9WYWxpZEZsYWcgPSBrVmFyVmFsaWRBbGw7CisKKwlmb3IgKFZhclBhcmFtLm1fdWlTdWJpbmRleCA9IDB4MDE7CisJICAgICBWYXJQYXJhbS5tX3VpU3ViaW5kZXggPD0gdWlWYWx1ZUNvdW50X3A7IFZhclBhcmFtLm1fdWlTdWJpbmRleCsrKSB7CisJCVZhclBhcmFtLm1fcERhdGEgPSBwZHdWYWx1ZV9wOworCQlSZXQgPSBFcGxPYmREZWZpbmVWYXIoJlZhclBhcmFtKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisJCXBkd1ZhbHVlX3ArKzsKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKyNlbmRpZiAvLygoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKworI2VuZGlmIC8vKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEV2ZW50LmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEV2ZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZkYzFiOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRXZlbnQuaApAQCAtMCwwICsxLDI3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgZXZlbnQgbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsRXZlbnQuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwOC8xMS8xNyAxNjo0MDozOSAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzEyIGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDEuMDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRVBMX0VWRU5UX0hfCisjZGVmaW5lIF9FUExfRVZFTlRfSF8KKworI2luY2x1ZGUgIkVwbEluYy5oIgorI2luY2x1ZGUgIkVwbE5tdC5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gbmFtZSBhbmQgc2l6ZSBvZiBldmVudCBxdWV1ZXMKKyNkZWZpbmUgRVBMX0VWRU5UX05BTUVfU0hCX0tFUk5FTF9UT19VU0VSICAgIlNoYktlcm5lbFRvVXNlciIKKyNpZm5kZWYgRVBMX0VWRU5UX1NJWkVfU0hCX0tFUk5FTF9UT19VU0VSCisjZGVmaW5lIEVQTF9FVkVOVF9TSVpFX1NIQl9LRVJORUxfVE9fVVNFUiAgIDMyNzY4CS8vIDMyIGtCeXRlCisjZW5kaWYKKworI2RlZmluZSBFUExfRVZFTlRfTkFNRV9TSEJfVVNFUl9UT19LRVJORUwgICAiU2hiVXNlclRvS2VybmVsIgorI2lmbmRlZiBFUExfRVZFTlRfU0laRV9TSEJfVVNFUl9UT19LRVJORUwKKyNkZWZpbmUgRVBMX0VWRU5UX1NJWkVfU0hCX1VTRVJfVE9fS0VSTkVMICAgMzI3NjgJLy8gMzIga0J5dGUKKyNlbmRpZgorCisvLyBtYXggc2l6ZSBvZiBldmVudCBhcmd1bWVudAorI2lmbmRlZiBFUExfTUFYX0VWRU5UX0FSR19TSVpFCisjZGVmaW5lIEVQTF9NQVhfRVZFTlRfQVJHX1NJWkUgICAgICAyNTYJLy8gYmVjYXVzZSBvZiBQRE8KKyNlbmRpZgorCisjZGVmaW5lIEVQTF9ETExfRVJSX01OX0NSQyAgICAgICAgICAgMHgwMDAwMDAwMUwJLy8gb2JqZWN0IDB4MUMwMAorI2RlZmluZSBFUExfRExMX0VSUl9NTl9DT0xMSVNJT04gICAgIDB4MDAwMDAwMDJMCS8vIG9iamVjdCAweDFDMDEKKyNkZWZpbmUgRVBMX0RMTF9FUlJfTU5fQ1lDVElNRUVYQ0VFRCAweDAwMDAwMDA0TAkvLyBvYmplY3QgMHgxQzAyCisjZGVmaW5lIEVQTF9ETExfRVJSX01OX0xPU1NfTElOSyAgICAgMHgwMDAwMDAwOEwJLy8gb2JqZWN0IDB4MUMwMworI2RlZmluZSBFUExfRExMX0VSUl9NTl9DTl9MQVRFX1BSRVMgIDB4MDAwMDAwMTBMCS8vIG9iamVjdHMgMHgxQzA0LTB4MUMwNgorI2RlZmluZSBFUExfRExMX0VSUl9NTl9DTl9MT1NTX1BSRVMgIDB4MDAwMDAwODBMCS8vIG9iamVjdHMgMHgxQzA3LTB4MUMwOQorI2RlZmluZSBFUExfRExMX0VSUl9DTl9DT0xMSVNJT04gICAgIDB4MDAwMDA0MDBMCS8vIG9iamVjdCAweDFDMEEKKyNkZWZpbmUgRVBMX0RMTF9FUlJfQ05fTE9TU19TT0MgICAgICAweDAwMDAwODAwTAkvLyBvYmplY3QgMHgxQzBCCisjZGVmaW5lIEVQTF9ETExfRVJSX0NOX0xPU1NfU09BICAgICAgMHgwMDAwMTAwMEwJLy8gb2JqZWN0IDB4MUMwQworI2RlZmluZSBFUExfRExMX0VSUl9DTl9MT1NTX1BSRVEgICAgIDB4MDAwMDIwMDBMCS8vIG9iamVjdCAweDFDMEQKKyNkZWZpbmUgRVBMX0RMTF9FUlJfQ05fUkVDVkRfUFJFUSAgICAweDAwMDA0MDAwTAkvLyBkZWNyZW1lbnQgb2JqZWN0IDB4MUMwRC8yCisjZGVmaW5lIEVQTF9ETExfRVJSX0NOX1NPQ19KSVRURVIgICAgMHgwMDAwODAwMEwJLy8gb2JqZWN0IDB4MUMwRQorI2RlZmluZSBFUExfRExMX0VSUl9DTl9DUkMgICAgICAgICAgIDB4MDAwMTAwMDBMCS8vIG9iamVjdCAweDFDMEYKKyNkZWZpbmUgRVBMX0RMTF9FUlJfQ05fTE9TU19MSU5LICAgICAweDAwMDIwMDAwTAkvLyBvYmplY3QgMHgxQzEwCisjZGVmaW5lIEVQTF9ETExfRVJSX01OX0xPU1NfU1RBVFJFUyAgMHgwMDA0MDAwMEwJLy8gb2JqZWN0cyAweDFDMTUtMHgxQzE3IChzaG91bGQgYmUgb3BlcmF0ZWQgYnkgTm10TW51IG1vZHVsZSkKKyNkZWZpbmUgRVBMX0RMTF9FUlJfQkFEX1BIWVNfTU9ERSAgICAweDAwMDgwMDAwTAkvLyBubyBvYmplY3QKKyNkZWZpbmUgRVBMX0RMTF9FUlJfTUFDX0JVRkZFUiAgICAgICAweDAwMTAwMDAwTAkvLyBubyBvYmplY3QgKE5NVF9HVDYpCisjZGVmaW5lIEVQTF9ETExfRVJSX0lOVkFMSURfRk9STUFUICAgMHgwMDIwMDAwMEwJLy8gbm8gb2JqZWN0IChOTVRfR1Q2KQorI2RlZmluZSBFUExfRExMX0VSUl9BRERSRVNTX0NPTkZMSUNUIDB4MDA0MDAwMDBMCS8vIG5vIG9iamVjdCAocmVtb3ZlIENOIGZyb20gY29uZmlndXJhdGlvbikKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEV2ZW50VHlwZSBkZXRlcm1pbmVzIHRoZSBhcmd1bWVudCBvZiB0aGUgZXZlbnQKK3R5cGVkZWYgZW51bSB7CisJa0VwbEV2ZW50VHlwZU5tdEV2ZW50ID0gMHgwMSwJLy8gTk1UIGV2ZW50CisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdEVwbE5tdEV2ZW50CisJa0VwbEV2ZW50VHlwZVBkb1J4ID0gMHgwMiwJLy8gUERPIGZyYW1lIHJlY2VpdmVkIGV2ZW50IChQUmVzL1BSZXEpCisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdEVwbEZyYW1lCisJa0VwbEV2ZW50VHlwZVBkb1R4ID0gMHgwMywJLy8gUERPIGZyYW1lIHRyYW5zbWl0dGVkIGV2ZW50IChQUmVzL1BSZXEpCisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdEVwbEZyYW1lSW5mbworCWtFcGxFdmVudFR5cGVQZG9Tb2EgPSAweDA0LAkvLyBTb0EgZnJhbWUgcmVjZWl2ZWQgZXZlbnQgKGlzb2Nocm9ub3VzIHBoYXNlIGNvbXBsZXRlZCkKKwkvLyBhcmcgaXMgcG9pbnRlciB0byBub3RoaW5nCisJa0VwbEV2ZW50VHlwZVN5bmMgPSAweDA1LAkvLyBTeW5jIGV2ZW50IChlLmcuIFNvQyBvciBhbnRpY2lwYXRlZCBTb0MpCisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gbm90aGluZworCWtFcGxFdmVudFR5cGVUaW1lciA9IDB4MDYsCS8vIFRpbWVyIGV2ZW50CisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdEVwbFRpbWVyRXZlbnRBcmcKKwlrRXBsRXZlbnRUeXBlSGVhcnRiZWF0ID0gMHgwNywJLy8gSGVhcnRiZWF0IGV2ZW50CisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdEVwbEhlYXJ0YmVhdEV2ZW50CisJa0VwbEV2ZW50VHlwZURsbGtDcmVhdGUgPSAweDA4LAkvLyBETEwga2VybmVsIGNyZWF0ZSBldmVudAorCS8vIGFyZyBpcyBwb2ludGVyIHRvIHRoZSBuZXcgdEVwbE5tdFN0YXRlCisJa0VwbEV2ZW50VHlwZURsbGtEZXN0cm95ID0gMHgwOSwJLy8gRExMIGtlcm5lbCBkZXN0cm95IGV2ZW50CisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdGhlIG9sZCB0RXBsTm10U3RhdGUKKwlrRXBsRXZlbnRUeXBlRGxsa0ZpbGxUeCA9IDB4MEEsCS8vIERMTCBrZXJuZWwgZmlsbCBUeEJ1ZmZlciBldmVudAorCS8vIGFyZyBpcyBwb2ludGVyIHRvIHRFcGxEbGxBc3luY1JlcVByaW9yaXR5CisJa0VwbEV2ZW50VHlwZURsbGtQcmVzUmVhZHkgPSAweDBCLAkvLyBETEwga2VybmVsIFBSZXMgcmVhZHkgZXZlbnQKKwkvLyBhcmcgaXMgcG9pbnRlciB0byBub3RoaW5nCisJa0VwbEV2ZW50VHlwZUVycm9yID0gMHgwQywJLy8gRXJyb3IgZXZlbnQgZm9yIEFQSSBsYXllcgorCS8vIGFyZyBpcyBwb2ludGVyIHRvIHRFcGxFdmVudEVycm9yCisJa0VwbEV2ZW50VHlwZU5tdFN0YXRlQ2hhbmdlID0gMHgwRCwJLy8gaW5kaWNhdGUgY2hhbmdlIG9mIE5NVC1TdGF0ZQorCS8vIGFyZyBpcyBwb2ludGVyIHRvIHRFcGxFdmVudE5tdFN0YXRlQ2hhbmdlCisJa0VwbEV2ZW50VHlwZURsbEVycm9yID0gMHgwRSwJLy8gRExMIGVycm9yIGV2ZW50IGZvciBFcnJvciBoYW5kbGVyCisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdEVwbEVycm9ySGFuZGxlcmtFdmVudAorCWtFcGxFdmVudFR5cGVBc25kUnggPSAweDBGLAkvLyByZWNlaXZlZCBBU25kIGZyYW1lIGZvciBETEwgdXNlciBtb2R1bGUKKwkvLyBhcmcgaXMgcG9pbnRlciB0byB0RXBsRnJhbWUKKwlrRXBsRXZlbnRUeXBlRGxsa1NlcnZGaWx0ZXIgPSAweDEwLAkvLyBjb25maWd1cmUgU2VydmljZUlkRmlsdGVyCisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdEVwbERsbENhbFNlcnZpY2VJZEZpbHRlcgorCWtFcGxFdmVudFR5cGVEbGxrSWRlbnRpdHkgPSAweDExLAkvLyBjb25maWd1cmUgSWRlbnRpdHkKKwkvLyBhcmcgaXMgcG9pbnRlciB0byB0RXBsRGxsSWRlbnRQYXJhbQorCWtFcGxFdmVudFR5cGVEbGxrQ29uZmlnID0gMHgxMiwJLy8gY29uZmlndXJlIENvbmZpZ1BhcmFtCisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdEVwbERsbENvbmZpZ1BhcmFtCisJa0VwbEV2ZW50VHlwZURsbGtJc3N1ZVJlcSA9IDB4MTMsCS8vIGlzc3VlIElkZW50L1N0YXR1cyByZXF1ZXN0CisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdEVwbERsbENhbElzc3VlUmVxdWVzdAorCWtFcGxFdmVudFR5cGVEbGxrQWRkTm9kZSA9IDB4MTQsCS8vIGFkZCBub2RlIHRvIGlzb2Nocm9ub3VzIHBoYXNlCisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdEVwbERsbE5vZGVJbmZvCisJa0VwbEV2ZW50VHlwZURsbGtEZWxOb2RlID0gMHgxNSwJLy8gcmVtb3ZlIG5vZGUgZnJvbSBpc29jaHJvbm91cyBwaGFzZQorCS8vIGFyZyBpcyBwb2ludGVyIHRvIHVuc2lnbmVkIGludAorCWtFcGxFdmVudFR5cGVEbGxrU29mdERlbE5vZGUgPSAweDE2LAkvLyByZW1vdmUgbm9kZSBzb2Z0bHkgZnJvbSBpc29jaHJvbm91cyBwaGFzZQorCS8vIGFyZyBpcyBwb2ludGVyIHRvIHVuc2lnbmVkIGludAorCWtFcGxFdmVudFR5cGVEbGxrU3RhcnRSZWR1Y2VkQ3ljbGUgPSAweDE3LAkvLyBzdGFydCByZWR1Y2VkIEVQTCBjeWNsZSBvbiBNTgorCS8vIGFyZyBpcyBwb2ludGVyIHRvIG5vdGhpbmcKKwlrRXBsRXZlbnRUeXBlTm10TW51Tm10Q21kU2VudCA9IDB4MTgsCS8vIE5NVCBjb21tYW5kIHdhcyBhY3R1YWxseSBzZW50CisJLy8gYXJnIGlzIHBvaW50ZXIgdG8gdEVwbEZyYW1lCisKK30gdEVwbEV2ZW50VHlwZTsKKworLy8gRXZlbnRTaW5rIGRldGVybWluZXMgdGhlIGNvbnN1bWVyIG9mIHRoZSBldmVudAordHlwZWRlZiBlbnVtIHsKKwlrRXBsRXZlbnRTaW5rU3luYyA9IDB4MDAsCS8vIFN5bmMgZXZlbnQgZm9yIGFwcGxpY2F0aW9uIG9yIGtlcm5lbCBFUEwgbW9kdWxlCisJa0VwbEV2ZW50U2lua05tdGsgPSAweDAxLAkvLyBldmVudHMgZm9yIE5tdGsgbW9kdWxlCisJa0VwbEV2ZW50U2lua0RsbGsgPSAweDAyLAkvLyBldmVudHMgZm9yIERsbGsgbW9kdWxlCisJa0VwbEV2ZW50U2lua0RsbHVDYWwgPSAweDAzLAkvLyBldmVudHMgZm9yIERsbHVDYWwgbW9kdWxlCisJa0VwbEV2ZW50U2lua0RsbGtDYWwgPSAweDA0LAkvLyBldmVudHMgZm9yIERsbGtDYWwgbW9kdWxlCisJa0VwbEV2ZW50U2lua1Bkb2sgPSAweDA1LAkvLyBldmVudHMgZm9yIFBkb2sgbW9kdWxlCisJa0VwbEV2ZW50U2lua05tdHUgPSAweDA2LAkvLyBldmVudHMgZm9yIE5tdHUgbW9kdWxlCisJa0VwbEV2ZW50U2lua0VycmsgPSAweDA3LAkvLyBldmVudHMgZm9yIEVycm9yIGhhbmRsZXIgbW9kdWxlCisJa0VwbEV2ZW50U2lua0VycnUgPSAweDA4LAkvLyBldmVudHMgZm9yIEVycm9yIHNpZ25hbGluZyBtb2R1bGUKKwlrRXBsRXZlbnRTaW5rU2RvQXN5U2VxID0gMHgwOSwJLy8gZXZlbnRzIGZvciBhc3luY3Jvbm91cyBTRE8gU2VxdWVuY2UgTGF5ZXIgbW9kdWxlCisJa0VwbEV2ZW50U2lua05tdE1udSA9IDB4MEEsCS8vIGV2ZW50cyBmb3IgTm10TW51IG1vZHVsZQorCWtFcGxFdmVudFNpbmtMZWR1ID0gMHgwQiwJLy8gZXZlbnRzIGZvciBMZWR1IG1vZHVsZQorCWtFcGxFdmVudFNpbmtBcGkgPSAweDBGLAkvLyBldmVudHMgZm9yIEFQSSBtb2R1bGUKKworfSB0RXBsRXZlbnRTaW5rOworCisvLyBFdmVudFNvdXJjZSBkZXRlcm1pbmVzIHRoZSBzb3VyY2Ugb2YgYW4gZXJyb3JldmVudAordHlwZWRlZiBlbnVtIHsKKwkvLyBrZXJuZWxzcGFjZSBtb2R1bGVzCisJa0VwbEV2ZW50U291cmNlRGxsayA9IDB4MDEsCS8vIERsbGsgbW9kdWxlCisJa0VwbEV2ZW50U291cmNlTm10ayA9IDB4MDIsCS8vIE5tdGsgbW9kdWxlCisJa0VwbEV2ZW50U291cmNlT2JkayA9IDB4MDMsCS8vIE9iZGsgbW9kdWxlCisJa0VwbEV2ZW50U291cmNlUGRvayA9IDB4MDQsCS8vIFBkb2sgbW9kdWxlCisJa0VwbEV2ZW50U291cmNlVGltZXJrID0gMHgwNSwJLy8gVGltZXJrIG1vZHVsZQorCWtFcGxFdmVudFNvdXJjZUV2ZW50ayA9IDB4MDYsCS8vIEV2ZW50ayBtb2R1bGUKKwlrRXBsRXZlbnRTb3VyY2VTeW5jQ2IgPSAweDA3LAkvLyBzeW5jLUNiCisJa0VwbEV2ZW50U291cmNlRXJyayA9IDB4MDgsCS8vIEVycm9yIGhhbmRsZXIgbW9kdWxlCisKKwkvLyB1c2Vyc3BhY2UgbW9kdWxlcworCWtFcGxFdmVudFNvdXJjZURsbHUgPSAweDEwLAkvLyBEbGx1IG1vZHVsZQorCWtFcGxFdmVudFNvdXJjZU5tdHUgPSAweDExLAkvLyBObXR1IG1vZHVsZQorCWtFcGxFdmVudFNvdXJjZU5tdENudSA9IDB4MTIsCS8vIE5tdENudSBtb2R1bGUKKwlrRXBsRXZlbnRTb3VyY2VObXRNbnUgPSAweDEzLAkvLyBObXRNbnUgbW9kdWxlCisJa0VwbEV2ZW50U291cmNlT2JkdSA9IDB4MTQsCS8vIE9iZHUgbW9kdWxlCisJa0VwbEV2ZW50U291cmNlU2RvVWRwID0gMHgxNSwJLy8gU2RvL1VkcCBtb2R1bGUKKwlrRXBsRXZlbnRTb3VyY2VTZG9Bc25kID0gMHgxNiwJLy8gU2RvL0FzbmQgbW9kdWxlCisJa0VwbEV2ZW50U291cmNlU2RvQXN5U2VxID0gMHgxNywJLy8gU2RvIGFzeW5jaHJvbnVzIFNlcXVlbmNlIExheWVyIG1vZHVsZQorCWtFcGxFdmVudFNvdXJjZVNkb0NvbSA9IDB4MTgsCS8vIFNkbyBjb21tYW5kIGxheWVyIG1vZHVsZQorCWtFcGxFdmVudFNvdXJjZVRpbWVydSA9IDB4MTksCS8vIFRpbWVydSBtb2R1bGUKKwlrRXBsRXZlbnRTb3VyY2VDZmdNYXUgPSAweDFBLAkvLyBDZmdNYXUgbW9kdWxlCisJa0VwbEV2ZW50U291cmNlRXZlbnR1ID0gMHgxQiwJLy8gRXZlbnR1IG1vZHVsZQorCWtFcGxFdmVudFNvdXJjZUVwbEFwaSA9IDB4MUMsCS8vIEFwaSBtb2R1bGUKKwlrRXBsRXZlbnRTb3VyY2VMZWR1ID0gMHgxRCwJLy8gTGVkdSBtb2R1bGUKKworfSB0RXBsRXZlbnRTb3VyY2U7CisKKy8vIHN0cnVjdHVyZSBvZiBFUEwgZXZlbnQgKGVsZW1lbnQgb3JkZXIgbXVzdCBub3QgYmUgY2hhbmdlZCEpCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbEV2ZW50VHlwZSBtX0V2ZW50VHlwZSAvKjoyOCAqLyA7CS8vIGV2ZW50IHR5cGUKKwl0RXBsRXZlbnRTaW5rIG1fRXZlbnRTaW5rIC8qOjQgKi8gOwkvLyBldmVudCBzaW5rCisJdEVwbE5ldFRpbWUgbV9OZXRUaW1lOwkvLyB0aW1lc3RhbXAKKwl1bnNpZ25lZCBpbnQgbV91aVNpemU7CS8vIHNpemUgb2YgYXJndW1lbnQKKwl2b2lkICptX3BBcmc7CQkvLyBhcmd1bWVudCBvZiBldmVudAorCit9IHRFcGxFdmVudDsKKworLy8gc2hvcnQgc3RydWN0dXJlIG9mIEVQTCBldmVudCB3aXRob3V0IGFyZ3VtZW50IGFuZCBpdHMgc2l6ZSAoZWxlbWVudCBvcmRlciBtdXN0IG5vdCBiZSBjaGFuZ2VkISkKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsRXZlbnRUeXBlIG1fRXZlbnRUeXBlIC8qOjI4ICovIDsJLy8gZXZlbnQgdHlwZQorCXRFcGxFdmVudFNpbmsgbV9FdmVudFNpbmsgLyo6NCAqLyA7CS8vIGV2ZW50IHNpbmsKKwl0RXBsTmV0VGltZSBtX05ldFRpbWU7CS8vIHRpbWVzdGFtcAorCit9IHRFcGxFdmVudFNob3J0OworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IG1fdWlJbmRleDsKKwl1bnNpZ25lZCBpbnQgbV91aVN1YkluZGV4OworCit9IHRFcGxFdmVudE9iZEVycm9yOworCisvLyBzdHJ1Y3R1cmUgZm9yIGtFcGxFdmVudFR5cGVFcnJvcgordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxFdmVudFNvdXJjZSBtX0V2ZW50U291cmNlOwkvLyBtb2R1bGUgd2hpY2ggcG9zdGVkIHRoaXMgZXJyb3IgZXZlbnQKKwl0RXBsS2VybmVsIG1fRXBsRXJyb3I7CS8vIEVQTCBlcnJvciB3aGljaCBvY2N1cmVkCisJdW5pb24geworCQlCWVRFIG1fYkFyZzsKKwkJRFdPUkQgbV9kd0FyZzsKKwkJdEVwbEV2ZW50U291cmNlIG1fRXZlbnRTb3VyY2U7CS8vIGZyb20gRXZlbnRrL3UgbW9kdWxlIChvcmlnaW5hdGluZyBlcnJvciBzb3VyY2UpCisJCXRFcGxFdmVudE9iZEVycm9yIG1fT2JkRXJyb3I7CS8vIGZyb20gT2JkIG1vZHVsZQorLy8gICAgICAgIHRFcGxFcnJIaXN0b3J5RW50cnkgICAgIG1fSGlzdG9yeUVudHJ5OyAvLyBmcm9tIE5tdGsvdSBtb2R1bGUKKworCX0gbV9Bcmc7CisKK30gdEVwbEV2ZW50RXJyb3I7CisKKy8vIHN0cnVjdHVyZSBmb3Iga0VwbEV2ZW50VHlwZURsbEVycm9yCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBtX3VsRGxsRXJyb3JFdmVudHM7CS8vIEVQTF9ETExfRVJSXyoKKwl1bnNpZ25lZCBpbnQgbV91aU5vZGVJZDsKKwl0RXBsTm10U3RhdGUgbV9ObXRTdGF0ZTsKKworfSB0RXBsRXJyb3JIYW5kbGVya0V2ZW50OworCisvLyBjYWxsYmFjayBmdW5jdGlvbiB0byBnZXQgaW5mb3JtZWQgYWJvdXQgc3luYyBldmVudAordHlwZWRlZiB0RXBsS2VybmVsKFBVQkxJQyAqIHRFcGxTeW5jQ2IpICh2b2lkKTsKKworLy8gY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGdlbmVyaWMgZXZlbnRzCit0eXBlZGVmIHRFcGxLZXJuZWwoUFVCTElDICogdEVwbFByb2Nlc3NFdmVudENiKSAodEVwbEV2ZW50ICogcEVwbEV2ZW50X3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTF9FVkVOVF9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxFdmVudGsuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRXZlbnRrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA2OGE2YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRXZlbnRrLmMKQEAgLTAsMCArMSw4NTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgRXBsLUtlcm5lbHNwYWNlLUV2ZW50LU1vZHVsCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsRXZlbnRrLmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjkgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8yMCBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAia2VybmVsL0VwbEV2ZW50ay5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxObXRrLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbERsbGsuaCIKKyNpbmNsdWRlICJrZXJuZWwvRXBsRGxsa0NhbC5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxFcnJvckhhbmRsZXJrLmgiCisjaW5jbHVkZSAiQmVuY2htYXJrLmgiCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1BET0spKSAhPSAwKQorI2luY2x1ZGUgImtlcm5lbC9FcGxQZG9rLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbFBkb2tDYWwuaCIKKyNlbmRpZgorCisjaWZkZWYgRVBMX05PX0ZJRk8KKyNpbmNsdWRlICJ1c2VyL0VwbEV2ZW50dS5oIgorI2Vsc2UKKyNpbmNsdWRlICJTaGFyZWRCdWZmLmgiCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRyYWNlUG9pbnQgc3VwcG9ydCBmb3IgcmVhbHRpbWUtZGVidWdnaW5nCisjaWZkZWYgX0RCR19UUkFDRV9QT0lOVFNfCit2b2lkIFBVQkxJQyBUZ3REYmdTaWduYWxUcmFjZVBvaW50KEJZVEUgYlRyYWNlUG9pbnROdW1iZXJfcCk7Cit2b2lkIFBVQkxJQyBUZ3REYmdQb3N0VHJhY2VWYWx1ZShEV09SRCBkd1RyYWNlVmFsdWVfcCk7CisjZGVmaW5lIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKHApICAgVGd0RGJnU2lnbmFsVHJhY2VQb2ludChwKQorI2RlZmluZSBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUodikgICAgIFRndERiZ1Bvc3RUcmFjZVZhbHVlKHYpCisjZWxzZQorI2RlZmluZSBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVChwKQorI2RlZmluZSBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUodikKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwl0U2hiSW5zdGFuY2UgbV9wU2hiS2VybmVsVG9Vc2VySW5zdGFuY2U7CisJdFNoYkluc3RhbmNlIG1fcFNoYlVzZXJUb0tlcm5lbEluc3RhbmNlOworI2Vsc2UKKworI2VuZGlmCisJdEVwbFN5bmNDYiBtX3BmbkNiU3luYzsKKwl1bnNpZ25lZCBpbnQgbV91aVVzZXJUb0tlcm5lbEZ1bGxDb3VudDsKKworfSB0RXBsRXZlbnRrSW5zdGFuY2U7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdEVwbEV2ZW50a0luc3RhbmNlIEVwbEV2ZW50a0luc3RhbmNlX2c7CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGluY29taW5nIGV2ZW50cworI2lmbmRlZiBFUExfTk9fRklGTworc3RhdGljIHZvaWQgRXBsRXZlbnRrUnhTaWduYWxIYW5kbGVyQ2IodFNoYkluc3RhbmNlIHBTaGJSeEluc3RhbmNlX3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdWxEYXRhU2l6ZV9wKTsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBDIEwgQSBTIFMgIDxFcGwtS2VybmVsc3BhY2UtRXZlbnQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRXZlbnRrSW5pdAorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgZmlyc3QgaW5zdGFuY2UKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcGZuQ2JTeW5jX3AgPSBjYWxsYmFjay1mdW5jdGlvbiBmb3Igc3luYyBldmVudAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBLZXJuZWwgICA9IGVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEV2ZW50a0luaXQodEVwbFN5bmNDYiBwZm5DYlN5bmNfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IEVwbEV2ZW50a0FkZEluc3RhbmNlKHBmbkNiU3luY19wKTsKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRXZlbnRrQWRkSW5zdGFuY2UKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gYWRkcyBvbmUgbW9yZSBpbnN0YW5jZQorLy8KKy8vIFBhcmFtZXRlcnM6ICBwZm5DYlN5bmNfcCA9IGNhbGxiYWNrLWZ1bmN0aW9uIGZvciBzeW5jIGV2ZW50CisvLworLy8gUmV0dXJuczogICAgIHRFcEtlcm5lbCAgID0gZXJyb3Jjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsRXZlbnRrQWRkSW5zdGFuY2UodEVwbFN5bmNDYiBwZm5DYlN5bmNfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisJdW5zaWduZWQgaW50IGZTaGJOZXdDcmVhdGVkOworI2VuZGlmCisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGluaXQgaW5zdGFuY2Ugc3RydWN0dXJlCisJRXBsRXZlbnRrSW5zdGFuY2VfZy5tX3VpVXNlclRvS2VybmVsRnVsbENvdW50ID0gMDsKKworCS8vIHNhdmUgY2ItZnVuY3Rpb24KKwlFcGxFdmVudGtJbnN0YW5jZV9nLm1fcGZuQ2JTeW5jID0gcGZuQ2JTeW5jX3A7CisKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwkvLyBpbml0IHNoYXJlZCBsb29wIGJ1ZmZlcgorCS8vIGtlcm5lbCAtPiB1c2VyCisJU2hiRXJyb3IgPSBTaGJDaXJBbGxvY0J1ZmZlcihFUExfRVZFTlRfU0laRV9TSEJfS0VSTkVMX1RPX1VTRVIsCisJCQkJICAgICBFUExfRVZFTlRfTkFNRV9TSEJfS0VSTkVMX1RPX1VTRVIsCisJCQkJICAgICAmRXBsRXZlbnRrSW5zdGFuY2VfZy4KKwkJCQkgICAgIG1fcFNoYktlcm5lbFRvVXNlckluc3RhbmNlLAorCQkJCSAgICAgJmZTaGJOZXdDcmVhdGVkKTsKKwlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQorCQkgICAgKCJFcGxFdmVudGtBZGRJbnN0YW5jZSgpOiBTaGJDaXJBbGxvY0J1ZmZlcihLMlUpIC0+IDB4JVhcbiIsCisJCSAgICAgU2hiRXJyb3IpOworCQlSZXQgPSBrRXBsTm9SZXNvdXJjZTsKKwkJZ290byBFeGl0OworCX0KKwkvLyB1c2VyIC0+IGtlcm5lbAorCVNoYkVycm9yID0gU2hiQ2lyQWxsb2NCdWZmZXIoRVBMX0VWRU5UX1NJWkVfU0hCX1VTRVJfVE9fS0VSTkVMLAorCQkJCSAgICAgRVBMX0VWRU5UX05BTUVfU0hCX1VTRVJfVE9fS0VSTkVMLAorCQkJCSAgICAgJkVwbEV2ZW50a0luc3RhbmNlX2cuCisJCQkJICAgICBtX3BTaGJVc2VyVG9LZXJuZWxJbnN0YW5jZSwKKwkJCQkgICAgICZmU2hiTmV3Q3JlYXRlZCk7CisJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgeworCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJICAgICgiRXBsRXZlbnRrQWRkSW5zdGFuY2UoKTogU2hiQ2lyQWxsb2NCdWZmZXIoVTJLKSAtPiAweCVYXG4iLAorCQkgICAgIFNoYkVycm9yKTsKKwkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gcmVnaXN0ZXIgZXZlbnRoYW5kbGVyCisJU2hiRXJyb3IgPQorCSAgICBTaGJDaXJTZXRTaWduYWxIYW5kbGVyTmV3RGF0YShFcGxFdmVudGtJbnN0YW5jZV9nLgorCQkJCQkgIG1fcFNoYlVzZXJUb0tlcm5lbEluc3RhbmNlLAorCQkJCQkgIEVwbEV2ZW50a1J4U2lnbmFsSGFuZGxlckNiLAorCQkJCQkgIGtzaGJQcmlvcml0eUhpZ2gpOworCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCisJCSAgICAoIkVwbEV2ZW50a0FkZEluc3RhbmNlKCk6IFNoYkNpclNldFNpZ25hbEhhbmRsZXJOZXdEYXRhKFUySykgLT4gMHglWFxuIiwKKwkJICAgICBTaGJFcnJvcik7CisJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCQlnb3RvIEV4aXQ7CisJfQorCisgICAgICBFeGl0OgorI2VuZGlmCisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEV2ZW50a0RlbEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGRlbGV0ZXMgaW5zdGFuY2UgYW5kIGZyZWVzIHRoZSBidWZmZXJzCisvLworLy8gUGFyYW1ldGVyczogIHZvaWQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwS2VybmVsICAgPSBlcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudGtEZWxJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisjaWZuZGVmIEVQTF9OT19GSUZPCisJdFNoYkVycm9yIFNoYkVycm9yOworI2VuZGlmCisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworI2lmbmRlZiBFUExfTk9fRklGTworCS8vIHNldCBldmVudGhhbmRsZXIgdG8gTlVMTAorCVNoYkVycm9yID0KKwkgICAgU2hiQ2lyU2V0U2lnbmFsSGFuZGxlck5ld0RhdGEoRXBsRXZlbnRrSW5zdGFuY2VfZy4KKwkJCQkJICBtX3BTaGJVc2VyVG9LZXJuZWxJbnN0YW5jZSwgTlVMTCwKKwkJCQkJICBrU2hiUHJpb3JpdHlOb3JtYWwpOworCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCisJCSAgICAoIkVwbEV2ZW50a0RlbEluc3RhbmNlKCk6IFNoYkNpclNldFNpZ25hbEhhbmRsZXJOZXdEYXRhKFUySykgLT4gMHglWFxuIiwKKwkJICAgICBTaGJFcnJvcik7CisJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCX0KKwkvLyBmcmVlIGJ1ZmZlciBVc2VyIC0+IEtlcm5lbAorCVNoYkVycm9yID0KKwkgICAgU2hiQ2lyUmVsZWFzZUJ1ZmZlcihFcGxFdmVudGtJbnN0YW5jZV9nLm1fcFNoYlVzZXJUb0tlcm5lbEluc3RhbmNlKTsKKwlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQorCQkgICAgKCJFcGxFdmVudGtEZWxJbnN0YW5jZSgpOiBTaGJDaXJSZWxlYXNlQnVmZmVyKFUySykgLT4gMHglWFxuIiwKKwkJICAgICBTaGJFcnJvcik7CisJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCX0gZWxzZSB7CisJCUVwbEV2ZW50a0luc3RhbmNlX2cubV9wU2hiVXNlclRvS2VybmVsSW5zdGFuY2UgPSBOVUxMOworCX0KKworCS8vIGZyZWUgYnVmZmVyICBLZXJuZWwgLT4gVXNlcgorCVNoYkVycm9yID0KKwkgICAgU2hiQ2lyUmVsZWFzZUJ1ZmZlcihFcGxFdmVudGtJbnN0YW5jZV9nLm1fcFNoYktlcm5lbFRvVXNlckluc3RhbmNlKTsKKwlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQorCQkgICAgKCJFcGxFdmVudGtEZWxJbnN0YW5jZSgpOiBTaGJDaXJSZWxlYXNlQnVmZmVyKEsyVSkgLT4gMHglWFxuIiwKKwkJICAgICBTaGJFcnJvcik7CisJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCX0gZWxzZSB7CisJCUVwbEV2ZW50a0luc3RhbmNlX2cubV9wU2hiS2VybmVsVG9Vc2VySW5zdGFuY2UgPSBOVUxMOworCX0KKyNlbmRpZgorCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxFdmVudGtQcm9jZXNzCisvLworLy8gRGVzY3JpcHRpb246IEtlcm5lbHRocmVhZCB0aGF0IGRpc3BhdGNoZXMgZXZlbnRzIGluIGtlcm5lbCBwYXJ0CisvLworLy8gUGFyYW1ldGVyczogIHBFdmVudF9wICAgID0gcG9pbnRlciB0byBldmVudC1zdHJ1Y3R1cmUgZnJvbSBidWZmZXIKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwS2VybmVsICAgPSBlcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudGtQcm9jZXNzKHRFcGxFdmVudCAqIHBFdmVudF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxFdmVudFNvdXJjZSBFdmVudFNvdXJjZTsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gZXJyb3IgaGFuZGxpbmcgaWYgZXZlbnQgcXVldWUgaXMgZnVsbAorCWlmIChFcGxFdmVudGtJbnN0YW5jZV9nLm1fdWlVc2VyVG9LZXJuZWxGdWxsQ291bnQgPiAwKSB7CS8vIFVzZXJUb0tlcm5lbCBldmVudCBxdWV1ZSBoYXMgcnVuIG91dCBvZiBzcGFjZSAtPiBrRXBsTm10RXZlbnRJbnRlcm5Db21FcnJvcgorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRLKSkgIT0gMCkKKwkJdEVwbEV2ZW50IEV2ZW50OworCQl0RXBsTm10RXZlbnQgTm10RXZlbnQ7CisjZW5kaWYKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwkJdFNoYkVycm9yIFNoYkVycm9yOworI2VuZGlmCisKKwkJLy8gZGlyZWN0bHkgY2FsbCBOTVRrIHByb2Nlc3MgZnVuY3Rpb24sIGJlY2F1c2UgZXZlbnQgcXVldWUgaXMgZnVsbAorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRLKSkgIT0gMCkKKwkJTm10RXZlbnQgPSBrRXBsTm10RXZlbnRJbnRlcm5Db21FcnJvcjsKKwkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rTm10azsKKwkJRXZlbnQubV9OZXRUaW1lLm1fZHdOYW5vU2VjID0gMDsKKwkJRXZlbnQubV9OZXRUaW1lLm1fZHdTZWMgPSAwOworCQlFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVObXRFdmVudDsKKwkJRXZlbnQubV9wQXJnID0gJk5tdEV2ZW50OworCQlFdmVudC5tX3VpU2l6ZSA9IHNpemVvZihObXRFdmVudCk7CisJCVJldCA9IEVwbE5tdGtQcm9jZXNzKCZFdmVudCk7CisjZW5kaWYKKworCQkvLyBOTVQgc3RhdGUgbWFjaGluZSBjaGFuZ2VkIHRvIHJlc2V0IChpLmUuIE5NVF9HU19SRVNFVF9DT01NVU5JQ0FUSU9OKQorCQkvLyBub3csIGl0IGlzIHNhZmUgdG8gcmVzZXQgdGhlIGNvdW50ZXIgYW5kIGVtcHR5IHRoZSBldmVudCBxdWV1ZQorI2lmbmRlZiBFUExfTk9fRklGTworCQlTaGJFcnJvciA9CisJCSAgICBTaGJDaXJSZXNldEJ1ZmZlcihFcGxFdmVudGtJbnN0YW5jZV9nLgorCQkJCSAgICAgIG1fcFNoYlVzZXJUb0tlcm5lbEluc3RhbmNlLCAxMDAwLCBOVUxMKTsKKyNlbmRpZgorCisJCUVwbEV2ZW50a0luc3RhbmNlX2cubV91aVVzZXJUb0tlcm5lbEZ1bGxDb3VudCA9IDA7CisJCVRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDIyKTsKKworCQkvLyBhbHNvIGRpc2NhcmQgdGhlIGN1cnJlbnQgZXZlbnQgKGl0IGRvZXNuJ3QgbWF0dGVyIGlmIHdlIGxvc2UgYW5vdGhlciBldmVudCkKKwkJZ290byBFeGl0OworCX0KKwkvLyBjaGVjayBtX0V2ZW50U2luaworCXN3aXRjaCAocEV2ZW50X3AtPm1fRXZlbnRTaW5rKSB7CisJY2FzZSBrRXBsRXZlbnRTaW5rU3luYzoKKwkJeworCQkJaWYgKEVwbEV2ZW50a0luc3RhbmNlX2cubV9wZm5DYlN5bmMgIT0gTlVMTCkgeworCQkJCVJldCA9IEVwbEV2ZW50a0luc3RhbmNlX2cubV9wZm5DYlN5bmMoKTsKKwkJCQlpZiAoUmV0ID09IGtFcGxTdWNjZXNzZnVsKSB7CisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkKKwkJCQkJLy8gbWFyayBUUERPcyBhcyB2YWxpZAorCQkJCQlSZXQgPSBFcGxQZG9rQ2FsU2V0VHBkb3NWYWxpZChUUlVFKTsKKyNlbmRpZgorCQkJCX0gZWxzZSBpZiAoKFJldCAhPSBrRXBsUmVqZWN0KQorCQkJCQkgICAmJiAoUmV0ICE9IGtFcGxTaHV0ZG93bikpIHsKKwkJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VTeW5jQ2I7CisKKwkJCQkJLy8gRXJyb3IgZXZlbnQgZm9yIEFQSSBsYXllcgorCQkJCQlFcGxFdmVudGtQb3N0RXJyb3IKKwkJCQkJICAgIChrRXBsRXZlbnRTb3VyY2VFdmVudGssIFJldCwKKwkJCQkJICAgICBzaXplb2YoRXZlbnRTb3VyY2UpLCAmRXZlbnRTb3VyY2UpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJLy8gTk1ULUtlcm5lbC1Nb2R1bAorCWNhc2Uga0VwbEV2ZW50U2lua05tdGs6CisJCXsKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1USykpICE9IDApCisJCQlSZXQgPSBFcGxObXRrUHJvY2VzcyhwRXZlbnRfcCk7CisJCQlpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKSB7CisJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VObXRrOworCisJCQkJLy8gRXJyb3IgZXZlbnQgZm9yIEFQSSBsYXllcgorCQkJCUVwbEV2ZW50a1Bvc3RFcnJvcihrRXBsRXZlbnRTb3VyY2VFdmVudGssCisJCQkJCQkgICBSZXQsCisJCQkJCQkgICBzaXplb2YoRXZlbnRTb3VyY2UpLAorCQkJCQkJICAgJkV2ZW50U291cmNlKTsKKwkJCX0KKyNlbmRpZgorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKwkJCWlmICgocEV2ZW50X3AtPm1fRXZlbnRUeXBlID09IGtFcGxFdmVudFR5cGVObXRFdmVudCkKKwkJCSAgICAmJgorCQkJICAgICgoKigodEVwbE5tdEV2ZW50ICopIHBFdmVudF9wLT5tX3BBcmcpID09CisJCQkgICAgICBrRXBsTm10RXZlbnREbGxDZVNvYSkKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJCQkgICAgIHx8ICgqKCh0RXBsTm10RXZlbnQgKikgcEV2ZW50X3AtPm1fcEFyZykgPT0KKwkJCQkga0VwbE5tdEV2ZW50RGxsTWVTb2FTZW50KQorI2VuZGlmCisJCQkgICAgKSkgewkvLyBmb3J3YXJkIFNvQSBldmVudCB0byBlcnJvciBoYW5kbGVyCisJCQkJUmV0ID0gRXBsRXJyb3JIYW5kbGVya1Byb2Nlc3MocEV2ZW50X3ApOworCQkJCWlmICgoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQorCQkJCSAgICAmJiAoUmV0ICE9IGtFcGxTaHV0ZG93bikpIHsKKwkJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VFcnJrOworCisJCQkJCS8vIEVycm9yIGV2ZW50IGZvciBBUEkgbGF5ZXIKKwkJCQkJRXBsRXZlbnRrUG9zdEVycm9yCisJCQkJCSAgICAoa0VwbEV2ZW50U291cmNlRXZlbnRrLCBSZXQsCisJCQkJCSAgICAgc2l6ZW9mKEV2ZW50U291cmNlKSwgJkV2ZW50U291cmNlKTsKKwkJCQl9CisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkKKwkJCQkvLyBmb3J3YXJkIFNvQSBldmVudCB0byBQRE8gbW9kdWxlCisJCQkJcEV2ZW50X3AtPm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZVBkb1NvYTsKKwkJCQlSZXQgPSBFcGxQZG9rUHJvY2VzcyhwRXZlbnRfcCk7CisJCQkJaWYgKChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisJCQkJICAgICYmIChSZXQgIT0ga0VwbFNodXRkb3duKSkgeworCQkJCQlFdmVudFNvdXJjZSA9IGtFcGxFdmVudFNvdXJjZVBkb2s7CisKKwkJCQkJLy8gRXJyb3IgZXZlbnQgZm9yIEFQSSBsYXllcgorCQkJCQlFcGxFdmVudGtQb3N0RXJyb3IKKwkJCQkJICAgIChrRXBsRXZlbnRTb3VyY2VFdmVudGssIFJldCwKKwkJCQkJICAgICBzaXplb2YoRXZlbnRTb3VyY2UpLCAmRXZlbnRTb3VyY2UpOworCQkJCX0KKyNlbmRpZgorCisJCQl9CisJCQlicmVhazsKKyNlbmRpZgorCQl9CisKKwkJLy8gZXZlbnRzIGZvciBEbGxrIG1vZHVsZQorCWNhc2Uga0VwbEV2ZW50U2lua0RsbGs6CisJCXsKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMSykpICE9IDApCisJCQlSZXQgPSBFcGxEbGxrUHJvY2VzcyhwRXZlbnRfcCk7CisJCQlpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKSB7CisJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VEbGxrOworCisJCQkJLy8gRXJyb3IgZXZlbnQgZm9yIEFQSSBsYXllcgorCQkJCUVwbEV2ZW50a1Bvc3RFcnJvcihrRXBsRXZlbnRTb3VyY2VFdmVudGssCisJCQkJCQkgICBSZXQsCisJCQkJCQkgICBzaXplb2YoRXZlbnRTb3VyY2UpLAorCQkJCQkJICAgJkV2ZW50U291cmNlKTsKKwkJCX0KKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KKworCQkvLyBldmVudHMgZm9yIERsbGtDYWwgbW9kdWxlCisJY2FzZSBrRXBsRXZlbnRTaW5rRGxsa0NhbDoKKwkJeworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKwkJCVJldCA9IEVwbERsbGtDYWxQcm9jZXNzKHBFdmVudF9wKTsKKwkJCWlmICgoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSAmJiAoUmV0ICE9IGtFcGxTaHV0ZG93bikpIHsKKwkJCQlFdmVudFNvdXJjZSA9IGtFcGxFdmVudFNvdXJjZURsbGs7CisKKwkJCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCisJCQkJRXBsRXZlbnRrUG9zdEVycm9yKGtFcGxFdmVudFNvdXJjZUV2ZW50aywKKwkJCQkJCSAgIFJldCwKKwkJCQkJCSAgIHNpemVvZihFdmVudFNvdXJjZSksCisJCQkJCQkgICAmRXZlbnRTb3VyY2UpOworCQkJfQorI2VuZGlmCisJCQlicmVhazsKKwkJfQorCisJCS8vCisJY2FzZSBrRXBsRXZlbnRTaW5rUGRvazoKKwkJeworCQkJLy8gUERPLU1vZHVsZQorI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfUERPSykpICE9IDApCisJCQlSZXQgPSBFcGxQZG9rUHJvY2VzcyhwRXZlbnRfcCk7CisJCQlpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKSB7CisJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VQZG9rOworCisJCQkJLy8gRXJyb3IgZXZlbnQgZm9yIEFQSSBsYXllcgorCQkJCUVwbEV2ZW50a1Bvc3RFcnJvcihrRXBsRXZlbnRTb3VyY2VFdmVudGssCisJCQkJCQkgICBSZXQsCisJCQkJCQkgICBzaXplb2YoRXZlbnRTb3VyY2UpLAorCQkJCQkJICAgJkV2ZW50U291cmNlKTsKKwkJCX0KKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KKworCQkvLyBldmVudHMgZm9yIEVycm9yIGhhbmRsZXIgbW9kdWxlCisJY2FzZSBrRXBsRXZlbnRTaW5rRXJyazoKKwkJeworCQkJLy8gb25seSBjYWxsIGVycm9yIGhhbmRsZXIgaWYgRExMIGlzIHByZXNlbnQKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMSykpICE9IDApCisJCQlSZXQgPSBFcGxFcnJvckhhbmRsZXJrUHJvY2VzcyhwRXZlbnRfcCk7CisJCQlpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKSB7CisJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VFcnJrOworCisJCQkJLy8gRXJyb3IgZXZlbnQgZm9yIEFQSSBsYXllcgorCQkJCUVwbEV2ZW50a1Bvc3RFcnJvcihrRXBsRXZlbnRTb3VyY2VFdmVudGssCisJCQkJCQkgICBSZXQsCisJCQkJCQkgICBzaXplb2YoRXZlbnRTb3VyY2UpLAorCQkJCQkJICAgJkV2ZW50U291cmNlKTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmCisJCX0KKworCQkvLyB1bmtub3duIHNpbmsKKwlkZWZhdWx0OgorCQl7CisJCQlSZXQgPSBrRXBsRXZlbnRVbmtub3duU2luazsKKwkJfQorCisJfQkJCS8vIGVuZCBvZiBzd2l0Y2gocEV2ZW50X3AtPm1fRXZlbnRTaW5rKQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRXZlbnRrUG9zdAorLy8KKy8vIERlc2NyaXB0aW9uOiBwb3N0IGV2ZW50cyBmcm9tIGtlcm5lbCBwYXJ0CisvLworLy8gUGFyYW1ldGVyczogIHBFdmVudF9wICAgID0gcG9pbnRlciB0byBldmVudC1zdHJ1Y3R1cmUgZnJvbSBidWZmZXIKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwS2VybmVsICAgPSBlcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudGtQb3N0KHRFcGxFdmVudCAqIHBFdmVudF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworI2lmbmRlZiBFUExfTk9fRklGTworCXRTaGJFcnJvciBTaGJFcnJvcjsKKwl0U2hiQ2lyQ2h1bmsgU2hiQ2lyQ2h1bms7CisJdW5zaWduZWQgbG9uZyB1bERhdGFTaXplOworCXVuc2lnbmVkIGludCBmQnVmZmVyQ29tcGxldGVkOworI2VuZGlmCisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIHRoZSBldmVudCBtdXN0IGJlIHBvc3RlZCBieSB1c2luZyB0aGUgYWJCdWZmZXIKKwkvLyBpdCBpcyBuZWVkZSBiZWNhdXNlIHRoZSBBcmd1bWVudCBtdXN0IGJ5IGNvcGllZAorCS8vIHRvIHRoZSBidWZmZXIgdG9vIGFuZCBub3Qgb25seSB0aGUgcG9pbnRlcgorCisjaWZuZGVmIEVQTF9OT19GSUZPCisJLy8gMjAwNi8wOC8wMyBkLmsuOiBFdmVudCBhbmQgYXJndW1lbnQgYXJlIHBvc3RlZCBhcyBzZXBhcmF0ZSBjaHVua3MgdG8gdGhlIGV2ZW50IHF1ZXVlLgorCXVsRGF0YVNpemUgPQorCSAgICBzaXplb2YodEVwbEV2ZW50KSArCisJICAgICgocEV2ZW50X3AtPm1fcEFyZyAhPSBOVUxMKSA/IHBFdmVudF9wLT5tX3VpU2l6ZSA6IDApOworI2VuZGlmCisKKwkvLyBkZWNpZGUgaW4gd2hpY2ggYnVmZmVyIHRoZSBldmVudCBoYXZlIHRvIHdyaXRlCisJc3dpdGNoIChwRXZlbnRfcC0+bV9FdmVudFNpbmspIHsKKwkJLy8ga2VybmVsc3BhY2UgbW9kdWxlcworCWNhc2Uga0VwbEV2ZW50U2lua1N5bmM6CisJY2FzZSBrRXBsRXZlbnRTaW5rTm10azoKKwljYXNlIGtFcGxFdmVudFNpbmtEbGxrOgorCWNhc2Uga0VwbEV2ZW50U2lua0RsbGtDYWw6CisJY2FzZSBrRXBsRXZlbnRTaW5rUGRvazoKKwljYXNlIGtFcGxFdmVudFNpbmtFcnJrOgorCQl7CisjaWZuZGVmIEVQTF9OT19GSUZPCisJCQkvLyBwb3N0IG1lc3NhZ2UKKwkJCUJFTkNITUFSS19NT0RfMjdfU0VUKDIpOworCQkJU2hiRXJyb3IgPQorCQkJICAgIFNoYkNpckFsbG9jRGF0YUJsb2NrKEVwbEV2ZW50a0luc3RhbmNlX2cuCisJCQkJCQkgbV9wU2hiVXNlclRvS2VybmVsSW5zdGFuY2UsCisJCQkJCQkgJlNoYkNpckNodW5rLCB1bERhdGFTaXplKTsKKwkJCXN3aXRjaCAoU2hiRXJyb3IpIHsKKwkJCWNhc2Uga1NoYk9rOgorCQkJCWJyZWFrOworCisJCQljYXNlIGtTaGJCdWZmZXJGdWxsOgorCQkJCXsKKwkJCQkJRXBsRXZlbnRrSW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fdWlVc2VyVG9LZXJuZWxGdWxsQ291bnQrKzsKKwkJCQkJUmV0ID0ga0VwbEV2ZW50UG9zdEVycm9yOworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCisJCQkJCSAgICAoIkVwbEV2ZW50a1Bvc3QoKTogU2hiQ2lyQWxsb2NEYXRhQmxvY2soVTJLKSAtPiAweCVYXG4iLAorCQkJCQkgICAgIFNoYkVycm9yKTsKKwkJCQkJUmV0ID0ga0VwbEV2ZW50UG9zdEVycm9yOworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJfQorCQkJU2hiRXJyb3IgPQorCQkJICAgIFNoYkNpcldyaXRlRGF0YUNodW5rKEVwbEV2ZW50a0luc3RhbmNlX2cuCisJCQkJCQkgbV9wU2hiVXNlclRvS2VybmVsSW5zdGFuY2UsCisJCQkJCQkgJlNoYkNpckNodW5rLCBwRXZlbnRfcCwKKwkJCQkJCSBzaXplb2YodEVwbEV2ZW50KSwKKwkJCQkJCSAmZkJ1ZmZlckNvbXBsZXRlZCk7CisJCQlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCQkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCisJCQkJICAgICgiRXBsRXZlbnRrUG9zdCgpOiBTaGJDaXJXcml0ZURhdGFDaHVuayhVMkspIC0+IDB4JVhcbiIsCisJCQkJICAgICBTaGJFcnJvcik7CisJCQkJUmV0ID0ga0VwbEV2ZW50UG9zdEVycm9yOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCWlmIChmQnVmZmVyQ29tcGxldGVkID09IEZBTFNFKSB7CisJCQkJU2hiRXJyb3IgPQorCQkJCSAgICBTaGJDaXJXcml0ZURhdGFDaHVuayhFcGxFdmVudGtJbnN0YW5jZV9nLgorCQkJCQkJCSBtX3BTaGJVc2VyVG9LZXJuZWxJbnN0YW5jZSwKKwkJCQkJCQkgJlNoYkNpckNodW5rLAorCQkJCQkJCSBwRXZlbnRfcC0+bV9wQXJnLAorCQkJCQkJCSAodW5zaWduZWQgbG9uZykKKwkJCQkJCQkgcEV2ZW50X3AtPm1fdWlTaXplLAorCQkJCQkJCSAmZkJ1ZmZlckNvbXBsZXRlZCk7CisJCQkJaWYgKChTaGJFcnJvciAhPSBrU2hiT2spCisJCQkJICAgIHx8IChmQnVmZmVyQ29tcGxldGVkID09IEZBTFNFKSkgeworCQkJCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJCQkJICAgICgiRXBsRXZlbnRrUG9zdCgpOiBTaGJDaXJXcml0ZURhdGFDaHVuazIoVTJLKSAtPiAweCVYXG4iLAorCQkJCQkgICAgIFNoYkVycm9yKTsKKwkJCQkJUmV0ID0ga0VwbEV2ZW50UG9zdEVycm9yOworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJfQorCQkJQkVOQ0hNQVJLX01PRF8yN19SRVNFVCgyKTsKKworI2Vsc2UKKwkJCVJldCA9IEVwbEV2ZW50a1Byb2Nlc3MocEV2ZW50X3ApOworI2VuZGlmCisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gdXNlcnNwYWNlIG1vZHVsZXMKKwljYXNlIGtFcGxFdmVudFNpbmtObXR1OgorCWNhc2Uga0VwbEV2ZW50U2lua05tdE1udToKKwljYXNlIGtFcGxFdmVudFNpbmtTZG9Bc3lTZXE6CisJY2FzZSBrRXBsRXZlbnRTaW5rQXBpOgorCWNhc2Uga0VwbEV2ZW50U2lua0RsbHVDYWw6CisJY2FzZSBrRXBsRXZlbnRTaW5rRXJydToKKwkJeworI2lmbmRlZiBFUExfTk9fRklGTworCQkJLy8gcG9zdCBtZXNzYWdlCisvLyAgICAgICAgICAgIEJFTkNITUFSS19NT0RfMjdfU0VUKDMpOyAgICAvLyA3NCC1cyB1bnRpbCByZXNldAorCQkJU2hiRXJyb3IgPQorCQkJICAgIFNoYkNpckFsbG9jRGF0YUJsb2NrKEVwbEV2ZW50a0luc3RhbmNlX2cuCisJCQkJCQkgbV9wU2hiS2VybmVsVG9Vc2VySW5zdGFuY2UsCisJCQkJCQkgJlNoYkNpckNodW5rLCB1bERhdGFTaXplKTsKKwkJCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJCQkgICAgKCJFcGxFdmVudGtQb3N0KCk6IFNoYkNpckFsbG9jRGF0YUJsb2NrKEsyVSkgLT4gMHglWFxuIiwKKwkJCQkgICAgIFNoYkVycm9yKTsKKwkJCQlSZXQgPSBrRXBsRXZlbnRQb3N0RXJyb3I7CisJCQkJZ290byBFeGl0OworCQkJfQorCQkJU2hiRXJyb3IgPQorCQkJICAgIFNoYkNpcldyaXRlRGF0YUNodW5rKEVwbEV2ZW50a0luc3RhbmNlX2cuCisJCQkJCQkgbV9wU2hiS2VybmVsVG9Vc2VySW5zdGFuY2UsCisJCQkJCQkgJlNoYkNpckNodW5rLCBwRXZlbnRfcCwKKwkJCQkJCSBzaXplb2YodEVwbEV2ZW50KSwKKwkJCQkJCSAmZkJ1ZmZlckNvbXBsZXRlZCk7CisJCQlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCQkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCisJCQkJICAgICgiRXBsRXZlbnRrUG9zdCgpOiBTaGJDaXJXcml0ZURhdGFDaHVuayhLMlUpIC0+IDB4JVhcbiIsCisJCQkJICAgICBTaGJFcnJvcik7CisJCQkJUmV0ID0ga0VwbEV2ZW50UG9zdEVycm9yOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCWlmIChmQnVmZmVyQ29tcGxldGVkID09IEZBTFNFKSB7CisJCQkJU2hiRXJyb3IgPQorCQkJCSAgICBTaGJDaXJXcml0ZURhdGFDaHVuayhFcGxFdmVudGtJbnN0YW5jZV9nLgorCQkJCQkJCSBtX3BTaGJLZXJuZWxUb1VzZXJJbnN0YW5jZSwKKwkJCQkJCQkgJlNoYkNpckNodW5rLAorCQkJCQkJCSBwRXZlbnRfcC0+bV9wQXJnLAorCQkJCQkJCSAodW5zaWduZWQgbG9uZykKKwkJCQkJCQkgcEV2ZW50X3AtPm1fdWlTaXplLAorCQkJCQkJCSAmZkJ1ZmZlckNvbXBsZXRlZCk7CisJCQkJaWYgKChTaGJFcnJvciAhPSBrU2hiT2spCisJCQkJICAgIHx8IChmQnVmZmVyQ29tcGxldGVkID09IEZBTFNFKSkgeworCQkJCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJCQkJICAgICgiRXBsRXZlbnRrUG9zdCgpOiBTaGJDaXJXcml0ZURhdGFDaHVuazIoSzJVKSAtPiAweCVYXG4iLAorCQkJCQkgICAgIFNoYkVycm9yKTsKKwkJCQkJUmV0ID0ga0VwbEV2ZW50UG9zdEVycm9yOworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJfQorLy8gICAgICAgICAgICBCRU5DSE1BUktfTU9EXzI3X1JFU0VUKDMpOyAgLy8gODIgtXMgdW50aWwgU2hiQ2lyR2V0UmVhZERhdGFTaXplKCkgaW4gRXBsRXZlbnR1CisKKyNlbHNlCisJCQlSZXQgPSBFcGxFdmVudHVQcm9jZXNzKHBFdmVudF9wKTsKKyNlbmRpZgorCisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJeworCQkJUmV0ID0ga0VwbEV2ZW50VW5rbm93blNpbms7CisJCX0KKworCX0JCQkvLyBlbmQgb2Ygc3dpdGNoKHBFdmVudF9wLT5tX0V2ZW50U2luaykKKworI2lmbmRlZiBFUExfTk9fRklGTworICAgICAgRXhpdDoKKyNlbmRpZgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEV2ZW50a1Bvc3RFcnJvcgorLy8KKy8vIERlc2NyaXB0aW9uOiBwb3N0IGVycm9yIGV2ZW50IGZyb20ga2VybmVsIHBhcnQgdG8gQVBJIGxheWVyCisvLworLy8gUGFyYW1ldGVyczogIEV2ZW50U291cmNlX3AgICA9IHNvdXJjZS1tb2R1bGUgb2YgdGhlIGVycm9yIGV2ZW50CisvLyAgICAgICAgICAgICAgRXBsRXJyb3JfcCAgICAgID0gY29kZSBvZiBvY2N1cmVkIGVycm9yCisvLyAgICAgICAgICAgICAgQXJnU2l6ZV9wICAgICAgID0gc2l6ZSBvZiB0aGUgYXJndW1lbnQKKy8vICAgICAgICAgICAgICBwQXJnX3AgICAgICAgICAgPSBwb2ludGVyIHRvIHRoZSBhcmd1bWVudAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBLZXJuZWwgICAgICAgPSBlcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudGtQb3N0RXJyb3IodEVwbEV2ZW50U291cmNlIEV2ZW50U291cmNlX3AsCisJCQkJICAgICB0RXBsS2VybmVsIEVwbEVycm9yX3AsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlBcmdTaXplX3AsIHZvaWQgKnBBcmdfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwlCWVRFIGFiQnVmZmVyW0VQTF9NQVhfRVZFTlRfQVJHX1NJWkVdOworCXRFcGxFdmVudEVycm9yICpwRXZlbnRFcnJvciA9ICh0RXBsRXZlbnRFcnJvciAqKSBhYkJ1ZmZlcjsKKwl0RXBsRXZlbnQgRXBsRXZlbnQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGNyZWF0ZSBhcmd1bWVudAorCXBFdmVudEVycm9yLT5tX0V2ZW50U291cmNlID0gRXZlbnRTb3VyY2VfcDsKKwlwRXZlbnRFcnJvci0+bV9FcGxFcnJvciA9IEVwbEVycm9yX3A7CisJRVBMX01FTUNQWSgmcEV2ZW50RXJyb3ItPm1fQXJnLCBwQXJnX3AsIHVpQXJnU2l6ZV9wKTsKKworCS8vIGNyZWF0ZSBldmVudAorCUVwbEV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZUVycm9yOworCUVwbEV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua0FwaTsKKwlFUExfTUVNU0VUKCZFcGxFdmVudC5tX05ldFRpbWUsIDB4MDAsIHNpemVvZihFcGxFdmVudC5tX05ldFRpbWUpKTsKKwlFcGxFdmVudC5tX3VpU2l6ZSA9CisJICAgIChzaXplb2YoRXZlbnRTb3VyY2VfcCkgKyBzaXplb2YoRXBsRXJyb3JfcCkgKyB1aUFyZ1NpemVfcCk7CisJRXBsRXZlbnQubV9wQXJnID0gJmFiQnVmZmVyWzBdOworCisJLy8gcG9zdCBlcnJvcmV2ZW50CisJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXBsRXZlbnQpOworCisJcmV0dXJuIFJldDsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEV2ZW50a1J4U2lnbmFsSGFuZGxlckNiKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogQ2FsbGJhY2stZnVuY3Rpb24gZm9yIGV2ZW50cyBmcm9tIHVzZXIgYW5kIGtlcm5lbCBwYXJ0CisvLworLy8gUGFyYW1ldGVyczogIHBTaGJSeEluc3RhbmNlX3AgICAgPSBJbnN0YW5jZS1wb2ludGVyIG9mIGJ1ZmZlcgorLy8gICAgICAgICAgICAgIHVsRGF0YVNpemVfcCAgICAgICAgPSBzaXplIG9mIGRhdGEKKy8vCisvLyBSZXR1cm5zOiB2b2lkCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBFUExfTk9fRklGTworc3RhdGljIHZvaWQgRXBsRXZlbnRrUnhTaWduYWxIYW5kbGVyQ2IodFNoYkluc3RhbmNlIHBTaGJSeEluc3RhbmNlX3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdWxEYXRhU2l6ZV9wKQoreworCXRFcGxFdmVudCAqcEVwbEV2ZW50OworCXRTaGJFcnJvciBTaGJFcnJvcjsKKy8vdW5zaWduZWQgbG9uZyAgIHVsQmxvY2tDb3VudDsKKy8vdW5zaWduZWQgbG9uZyAgIHVsRGF0YVNpemU7CisJQllURSBhYkRhdGFCdWZmZXJbc2l6ZW9mKHRFcGxFdmVudCkgKyBFUExfTUFYX0VWRU5UX0FSR19TSVpFXTsKKwkvLyBkLmsuOiBhYkRhdGFCdWZmZXIgY29udGFpbnMgdGhlIGNvbXBsZXRlIHRFcGxFdmVudCBzdHJ1Y3R1cmUKKwkvLyAgICAgICBhbmQgYmVoaW5kIHRoaXMgdGhlIGFyZ3VtZW50CisKKwlUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgyMCk7CisKKwlCRU5DSE1BUktfTU9EXzI3X1JFU0VUKDApOworCS8vIGNvcHkgZGF0YSBmcm9tIGV2ZW50IHF1ZXVlCisJU2hiRXJyb3IgPSBTaGJDaXJSZWFkRGF0YUJsb2NrKHBTaGJSeEluc3RhbmNlX3AsCisJCQkJICAgICAgICZhYkRhdGFCdWZmZXJbMF0sCisJCQkJICAgICAgIHNpemVvZihhYkRhdGFCdWZmZXIpLCAmdWxEYXRhU2l6ZV9wKTsKKwlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCS8vIGVycm9yIGdvdG8gZXhpdAorCQlnb3RvIEV4aXQ7CisJfQorCS8vIHJlc29sdmUgdGhlIHBvaW50ZXIgdG8gdGhlIGV2ZW50IHN0cnVjdHVyZQorCXBFcGxFdmVudCA9ICh0RXBsRXZlbnQgKikgYWJEYXRhQnVmZmVyOworCS8vIHNldCBEYXRhc2l6ZQorCXBFcGxFdmVudC0+bV91aVNpemUgPSAodWxEYXRhU2l6ZV9wIC0gc2l6ZW9mKHRFcGxFdmVudCkpOworCWlmIChwRXBsRXZlbnQtPm1fdWlTaXplID4gMCkgeworCQkvLyBzZXQgcG9pbnRlciB0byBhcmd1bWVudAorCQlwRXBsRXZlbnQtPm1fcEFyZyA9ICZhYkRhdGFCdWZmZXJbc2l6ZW9mKHRFcGxFdmVudCldOworCX0gZWxzZSB7CisJCS8vc2V0IHBvaW50ZXIgdG8gTlVMTAorCQlwRXBsRXZlbnQtPm1fcEFyZyA9IE5VTEw7CisJfQorCisJQkVOQ0hNQVJLX01PRF8yN19TRVQoMCk7CisJLy8gY2FsbCBwcm9jZXNzZnVuY3Rpb24KKwlFcGxFdmVudGtQcm9jZXNzKHBFcGxFdmVudCk7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuOworfQorI2VuZGlmCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxFdmVudHUuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRXZlbnR1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE1ZjlhOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsRXZlbnR1LmMKQEAgLTAsMCArMSw4MTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgRXBsLVVzZXJzcGFjZS1FdmVudC1Nb2R1bAorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbEV2ZW50dS5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS44ICQgICREYXRlOiAyMDA4LzExLzE3IDE2OjQwOjM5ICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMjAgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInVzZXIvRXBsRXZlbnR1LmgiCisjaW5jbHVkZSAidXNlci9FcGxObXR1LmgiCisjaW5jbHVkZSAidXNlci9FcGxObXRNbnUuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbFNkb0FzeVNlcXUuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbERsbHVDYWwuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbExlZHUuaCIKKyNpbmNsdWRlICJCZW5jaG1hcmsuaCIKKworI2lmZGVmIEVQTF9OT19GSUZPCisjaW5jbHVkZSAia2VybmVsL0VwbEV2ZW50ay5oIgorI2Vsc2UKKyNpbmNsdWRlICJTaGFyZWRCdWZmLmgiCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRyYWNlUG9pbnQgc3VwcG9ydCBmb3IgcmVhbHRpbWUtZGVidWdnaW5nCisjaWZkZWYgX0RCR19UUkFDRV9QT0lOVFNfCit2b2lkIFBVQkxJQyBUZ3REYmdTaWduYWxUcmFjZVBvaW50KEJZVEUgYlRyYWNlUG9pbnROdW1iZXJfcCk7Cit2b2lkIFBVQkxJQyBUZ3REYmdQb3N0VHJhY2VWYWx1ZShEV09SRCBkd1RyYWNlVmFsdWVfcCk7CisjZGVmaW5lIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKHApICAgVGd0RGJnU2lnbmFsVHJhY2VQb2ludChwKQorI2RlZmluZSBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUodikgICAgIFRndERiZ1Bvc3RUcmFjZVZhbHVlKHYpCisjZWxzZQorI2RlZmluZSBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVChwKQorI2RlZmluZSBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUodikKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwl0U2hiSW5zdGFuY2UgbV9wU2hiS2VybmVsVG9Vc2VySW5zdGFuY2U7CisJdFNoYkluc3RhbmNlIG1fcFNoYlVzZXJUb0tlcm5lbEluc3RhbmNlOworI2VuZGlmCisJdEVwbFByb2Nlc3NFdmVudENiIG1fcGZuQXBpUHJvY2Vzc0V2ZW50Q2I7CisKK30gdEVwbEV2ZW50dUluc3RhbmNlOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyNpZm5kZWYgRVBMX05PX0ZJRk8KK3N0YXRpYyB0RXBsRXZlbnR1SW5zdGFuY2UgRXBsRXZlbnR1SW5zdGFuY2VfZzsKKy8vI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZuZGVmIEVQTF9OT19GSUZPCisvLyBjYWxsYmFjayBmdW5jdGlvbiBmb3IgaW5jb21taW5nIGV2ZW50cworc3RhdGljIHZvaWQgRXBsRXZlbnR1UnhTaWduYWxIYW5kbGVyQ2IodFNoYkluc3RhbmNlIHBTaGJSeEluc3RhbmNlX3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdWxEYXRhU2l6ZV9wKTsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBDIEwgQSBTIFMgIDxFcGwtVXNlci1FdmVudD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRXZlbnR1SW5pdAorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBpbml0aWFsaXplIHRoZSBmaXJzdCBpbnN0YW5jZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHBmbkFwaVByb2Nlc3NFdmVudENiX3AgID0gZnVuY3Rpb24gcG9pbnRlciBmb3IgQVBJIGV2ZW50IGNhbGxiYWNrCisvLworLy8KKy8vIFJldHVybnM6ICAgICAgdEVwS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsRXZlbnR1SW5pdCh0RXBsUHJvY2Vzc0V2ZW50Q2IgcGZuQXBpUHJvY2Vzc0V2ZW50Q2JfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IEVwbEV2ZW50dUFkZEluc3RhbmNlKHBmbkFwaVByb2Nlc3NFdmVudENiX3ApOworCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxFdmVudHVBZGRJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBhZGQgb25lIG1vcmUgaW5zdGFuY2UKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwZm5BcGlQcm9jZXNzRXZlbnRDYl9wICA9IGZ1bmN0aW9uIHBvaW50ZXIgZm9yIEFQSSBldmVudCBjYWxsYmFjaworLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgIHRFcEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbEV2ZW50dUFkZEluc3RhbmNlKHRFcGxQcm9jZXNzRXZlbnRDYgorCQkJCSAgICAgICBwZm5BcGlQcm9jZXNzRXZlbnRDYl9wKQoreworCXRFcGxLZXJuZWwgUmV0OworI2lmbmRlZiBFUExfTk9fRklGTworCXRTaGJFcnJvciBTaGJFcnJvcjsKKwl1bnNpZ25lZCBpbnQgZlNoYk5ld0NyZWF0ZWQ7CisjZW5kaWYKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gaW5pdCBpbnN0YW5jZSB2YXJpYWJsZXMKKwlFcGxFdmVudHVJbnN0YW5jZV9nLm1fcGZuQXBpUHJvY2Vzc0V2ZW50Q2IgPSBwZm5BcGlQcm9jZXNzRXZlbnRDYl9wOworCisjaWZuZGVmIEVQTF9OT19GSUZPCisJLy8gaW5pdCBzaGFyZWQgbG9vcCBidWZmZXIKKwkvLyBrZXJuZWwgLT4gdXNlcgorCVNoYkVycm9yID0gU2hiQ2lyQWxsb2NCdWZmZXIoRVBMX0VWRU5UX1NJWkVfU0hCX0tFUk5FTF9UT19VU0VSLAorCQkJCSAgICAgRVBMX0VWRU5UX05BTUVfU0hCX0tFUk5FTF9UT19VU0VSLAorCQkJCSAgICAgJkVwbEV2ZW50dUluc3RhbmNlX2cuCisJCQkJICAgICBtX3BTaGJLZXJuZWxUb1VzZXJJbnN0YW5jZSwKKwkJCQkgICAgICZmU2hiTmV3Q3JlYXRlZCk7CisJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgeworCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJICAgICgiRXBsRXZlbnR1QWRkSW5zdGFuY2UoKTogU2hiQ2lyQWxsb2NCdWZmZXIoSzJVKSAtPiAweCVYXG4iLAorCQkgICAgIFNoYkVycm9yKTsKKwkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLyB1c2VyIC0+IGtlcm5lbAorCVNoYkVycm9yID0gU2hiQ2lyQWxsb2NCdWZmZXIoRVBMX0VWRU5UX1NJWkVfU0hCX1VTRVJfVE9fS0VSTkVMLAorCQkJCSAgICAgRVBMX0VWRU5UX05BTUVfU0hCX1VTRVJfVE9fS0VSTkVMLAorCQkJCSAgICAgJkVwbEV2ZW50dUluc3RhbmNlX2cuCisJCQkJICAgICBtX3BTaGJVc2VyVG9LZXJuZWxJbnN0YW5jZSwKKwkJCQkgICAgICZmU2hiTmV3Q3JlYXRlZCk7CisJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgeworCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJICAgICgiRXBsRXZlbnR1QWRkSW5zdGFuY2UoKTogU2hiQ2lyQWxsb2NCdWZmZXIoVTJLKSAtPiAweCVYXG4iLAorCQkgICAgIFNoYkVycm9yKTsKKwkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gcmVnaXN0ZXIgZXZlbnRoYW5kbGVyCisJU2hiRXJyb3IgPQorCSAgICBTaGJDaXJTZXRTaWduYWxIYW5kbGVyTmV3RGF0YShFcGxFdmVudHVJbnN0YW5jZV9nLgorCQkJCQkgIG1fcFNoYktlcm5lbFRvVXNlckluc3RhbmNlLAorCQkJCQkgIEVwbEV2ZW50dVJ4U2lnbmFsSGFuZGxlckNiLAorCQkJCQkgIGtTaGJQcmlvcml0eU5vcm1hbCk7CisJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgeworCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJICAgICgiRXBsRXZlbnR1QWRkSW5zdGFuY2UoKTogU2hiQ2lyU2V0U2lnbmFsSGFuZGxlck5ld0RhdGEoSzJVKSAtPiAweCVYXG4iLAorCQkgICAgIFNoYkVycm9yKTsKKwkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisJCWdvdG8gRXhpdDsKKwl9CisKKyAgICAgIEV4aXQ6CisjZW5kaWYKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRXZlbnR1RGVsSW5zdGFuY2UKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gZGVsZXRlIGluc3RhbmNlIGFuIGZyZWUgdGhlIGJ1ZmZlcnN0cnVjdHVyZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgICB0RXBLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudHVEZWxJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisjaWZuZGVmIEVQTF9OT19GSUZPCisJdFNoYkVycm9yIFNoYkVycm9yOworI2VuZGlmCisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworI2lmbmRlZiBFUExfTk9fRklGTworCS8vIHNldCBldmVudGhhbmRsZXIgdG8gTlVMTAorCVNoYkVycm9yID0KKwkgICAgU2hiQ2lyU2V0U2lnbmFsSGFuZGxlck5ld0RhdGEoRXBsRXZlbnR1SW5zdGFuY2VfZy4KKwkJCQkJICBtX3BTaGJLZXJuZWxUb1VzZXJJbnN0YW5jZSwgTlVMTCwKKwkJCQkJICBrU2hiUHJpb3JpdHlOb3JtYWwpOworCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCisJCSAgICAoIkVwbEV2ZW50dURlbEluc3RhbmNlKCk6IFNoYkNpclNldFNpZ25hbEhhbmRsZXJOZXdEYXRhKEsyVSkgLT4gMHglWFxuIiwKKwkJICAgICBTaGJFcnJvcik7CisJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCX0KKwkvLyBmcmVlIGJ1ZmZlciBVc2VyIC0+IEtlcm5lbAorCVNoYkVycm9yID0KKwkgICAgU2hiQ2lyUmVsZWFzZUJ1ZmZlcihFcGxFdmVudHVJbnN0YW5jZV9nLm1fcFNoYlVzZXJUb0tlcm5lbEluc3RhbmNlKTsKKwlpZiAoKFNoYkVycm9yICE9IGtTaGJPaykgJiYgKFNoYkVycm9yICE9IGtTaGJNZW1Vc2VkQnlPdGhlclByb2NzKSkgeworCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJICAgICgiRXBsRXZlbnR1RGVsSW5zdGFuY2UoKTogU2hiQ2lyUmVsZWFzZUJ1ZmZlcihVMkspIC0+IDB4JVhcbiIsCisJCSAgICAgU2hiRXJyb3IpOworCQlSZXQgPSBrRXBsTm9SZXNvdXJjZTsKKwl9IGVsc2UgeworCQlFcGxFdmVudHVJbnN0YW5jZV9nLm1fcFNoYlVzZXJUb0tlcm5lbEluc3RhbmNlID0gTlVMTDsKKwl9CisKKwkvLyBmcmVlIGJ1ZmZlciAgS2VybmVsIC0+IFVzZXIKKwlTaGJFcnJvciA9CisJICAgIFNoYkNpclJlbGVhc2VCdWZmZXIoRXBsRXZlbnR1SW5zdGFuY2VfZy5tX3BTaGJLZXJuZWxUb1VzZXJJbnN0YW5jZSk7CisJaWYgKChTaGJFcnJvciAhPSBrU2hiT2spICYmIChTaGJFcnJvciAhPSBrU2hiTWVtVXNlZEJ5T3RoZXJQcm9jcykpIHsKKwkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCisJCSAgICAoIkVwbEV2ZW50dURlbEluc3RhbmNlKCk6IFNoYkNpclJlbGVhc2VCdWZmZXIoSzJVKSAtPiAweCVYXG4iLAorCQkgICAgIFNoYkVycm9yKTsKKwkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisJfSBlbHNlIHsKKwkJRXBsRXZlbnR1SW5zdGFuY2VfZy5tX3BTaGJLZXJuZWxUb1VzZXJJbnN0YW5jZSA9IE5VTEw7CisJfQorCisjZW5kaWYKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRXZlbnR1UHJvY2VzcworLy8KKy8vIERlc2NyaXB0aW9uOiBLZXJuZWx0aHJlYWQgdGhhdCBkaXNwYXRjaGVzIGV2ZW50cyBpbiBrZXJuZWxzcGFjZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHBFdmVudF9wID0gcG9pbnRlciB0byBldmVudC1zdHJ1Y3R1ciBmcm9tIGJ1ZmZlcgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgIHRFcEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbEV2ZW50dVByb2Nlc3ModEVwbEV2ZW50ICogcEV2ZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbEV2ZW50U291cmNlIEV2ZW50U291cmNlOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBjaGVjayBtX0V2ZW50U2luaworCXN3aXRjaCAocEV2ZW50X3AtPm1fRXZlbnRTaW5rKSB7CisJCS8vIE5NVC1Vc2VyLU1vZHVsZQorCWNhc2Uga0VwbEV2ZW50U2lua05tdHU6CisJCXsKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVFUpKSAhPSAwKQorCQkJUmV0ID0gRXBsTm10dVByb2Nlc3NFdmVudChwRXZlbnRfcCk7CisJCQlpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKSB7CisJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VObXR1OworCisJCQkJLy8gRXJyb3IgZXZlbnQgZm9yIEFQSSBsYXllcgorCQkJCUVwbEV2ZW50dVBvc3RFcnJvcihrRXBsRXZlbnRTb3VyY2VFdmVudHUsCisJCQkJCQkgICBSZXQsCisJCQkJCQkgICBzaXplb2YoRXZlbnRTb3VyY2UpLAorCQkJCQkJICAgJkV2ZW50U291cmNlKTsKKwkJCX0KKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCQkvLyBOTVQtTU4tVXNlci1Nb2R1bGUKKwljYXNlIGtFcGxFdmVudFNpbmtObXRNbnU6CisJCXsKKwkJCVJldCA9IEVwbE5tdE1udVByb2Nlc3NFdmVudChwRXZlbnRfcCk7CisJCQlpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKSB7CisJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VObXRNbnU7CisKKwkJCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCisJCQkJRXBsRXZlbnR1UG9zdEVycm9yKGtFcGxFdmVudFNvdXJjZUV2ZW50dSwKKwkJCQkJCSAgIFJldCwKKwkJCQkJCSAgIHNpemVvZihFdmVudFNvdXJjZSksCisJCQkJCQkgICAmRXZlbnRTb3VyY2UpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKyNlbmRpZgorCisjaWYgKCgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApICAgXAorICAgICB8fCAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET1MpKSAhPSAwKSkKKwkJLy8gZXZlbnRzIGZvciBhc3luY2hyb251cyBTRE8gU2VxdWVuY2UgTGF5ZXIKKwljYXNlIGtFcGxFdmVudFNpbmtTZG9Bc3lTZXE6CisJCXsKKwkJCVJldCA9IEVwbFNkb0FzeVNlcVByb2Nlc3NFdmVudChwRXZlbnRfcCk7CisJCQlpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKSB7CisJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VTZG9Bc3lTZXE7CisKKwkJCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCisJCQkJRXBsRXZlbnR1UG9zdEVycm9yKGtFcGxFdmVudFNvdXJjZUV2ZW50dSwKKwkJCQkJCSAgIFJldCwKKwkJCQkJCSAgIHNpemVvZihFdmVudFNvdXJjZSksCisJCQkJCQkgICAmRXZlbnRTb3VyY2UpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKyNlbmRpZgorCisJCS8vIExFRCB1c2VyIHBhcnQgbW9kdWxlCisJY2FzZSBrRXBsRXZlbnRTaW5rTGVkdToKKwkJeworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTEVEVSkpICE9IDApCisJCQlSZXQgPSBFcGxMZWR1UHJvY2Vzc0V2ZW50KHBFdmVudF9wKTsKKwkJCWlmICgoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSAmJiAoUmV0ICE9IGtFcGxTaHV0ZG93bikpIHsKKwkJCQlFdmVudFNvdXJjZSA9IGtFcGxFdmVudFNvdXJjZUxlZHU7CisKKwkJCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCisJCQkJRXBsRXZlbnR1UG9zdEVycm9yKGtFcGxFdmVudFNvdXJjZUV2ZW50dSwKKwkJCQkJCSAgIFJldCwKKwkJCQkJCSAgIHNpemVvZihFdmVudFNvdXJjZSksCisJCQkJCQkgICAmRXZlbnRTb3VyY2UpOworCQkJfQorI2VuZGlmCisJCQlicmVhazsKKwkJfQorCisJCS8vIGV2ZW50IGZvciBFUEwgYXBpCisJY2FzZSBrRXBsRXZlbnRTaW5rQXBpOgorCQl7CisJCQlpZiAoRXBsRXZlbnR1SW5zdGFuY2VfZy5tX3BmbkFwaVByb2Nlc3NFdmVudENiICE9IE5VTEwpIHsKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxFdmVudHVJbnN0YW5jZV9nLgorCQkJCSAgICBtX3BmbkFwaVByb2Nlc3NFdmVudENiKHBFdmVudF9wKTsKKwkJCQlpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkKKwkJCQkgICAgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKSB7CisJCQkJCUV2ZW50U291cmNlID0ga0VwbEV2ZW50U291cmNlRXBsQXBpOworCisJCQkJCS8vIEVycm9yIGV2ZW50IGZvciBBUEkgbGF5ZXIKKwkJCQkJRXBsRXZlbnR1UG9zdEVycm9yCisJCQkJCSAgICAoa0VwbEV2ZW50U291cmNlRXZlbnR1LCBSZXQsCisJCQkJCSAgICAgc2l6ZW9mKEV2ZW50U291cmNlKSwgJkV2ZW50U291cmNlKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQl9CisKKwljYXNlIGtFcGxFdmVudFNpbmtEbGx1Q2FsOgorCQl7CisJCQlSZXQgPSBFcGxEbGx1Q2FsUHJvY2VzcyhwRXZlbnRfcCk7CisJCQlpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKSB7CisJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VEbGx1OworCisJCQkJLy8gRXJyb3IgZXZlbnQgZm9yIEFQSSBsYXllcgorCQkJCUVwbEV2ZW50dVBvc3RFcnJvcihrRXBsRXZlbnRTb3VyY2VFdmVudHUsCisJCQkJCQkgICBSZXQsCisJCQkJCQkgICBzaXplb2YoRXZlbnRTb3VyY2UpLAorCQkJCQkJICAgJkV2ZW50U291cmNlKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCX0KKworCWNhc2Uga0VwbEV2ZW50U2lua0VycnU6CisJCXsKKwkJCS8qCisJCQkgICBSZXQgPSBFcGxFcnJ1UHJvY2VzcyhwRXZlbnRfcCk7CisJCQkgICBpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKQorCQkJICAgeworCQkJICAgRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VFcnJ1OworCisJCQkgICAvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCisJCQkgICBFcGxFdmVudHVQb3N0RXJyb3Ioa0VwbEV2ZW50U291cmNlRXZlbnR1LAorCQkJICAgUmV0LAorCQkJICAgc2l6ZW9mKEV2ZW50U291cmNlKSwKKwkJCSAgICZFdmVudFNvdXJjZSk7CisJCQkgICB9CisJCQkgKi8KKwkJCWJyZWFrOworCisJCX0KKworCQkvLyB1bmtub3duIHNpbmsKKwlkZWZhdWx0OgorCQl7CisJCQlSZXQgPSBrRXBsRXZlbnRVbmtub3duU2luazsKKwkJfQorCisJfQkJCS8vIGVuZCBvZiBzd2l0Y2gocEV2ZW50X3AtPm1fRXZlbnRTaW5rKQorCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxFdmVudHVQb3N0CisvLworLy8gRGVzY3JpcHRpb246IHBvc3QgZXZlbnRzIGZyb20gdXNlcnNwYWNlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEV2ZW50X3AgPSBwb2ludGVyIHRvIGV2ZW50LXN0cnVjdHVyIGZyb20gYnVmZmVyCisvLworLy8KKy8vIFJldHVybnM6ICAgICAgdEVwS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsRXZlbnR1UG9zdCh0RXBsRXZlbnQgKiBwRXZlbnRfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisJdFNoYkNpckNodW5rIFNoYkNpckNodW5rOworCXVuc2lnbmVkIGxvbmcgdWxEYXRhU2l6ZTsKKwl1bnNpZ25lZCBpbnQgZkJ1ZmZlckNvbXBsZXRlZDsKKyNlbmRpZgorCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwkvLyAyMDA2LzA4LzAzIGQuay46IEV2ZW50IGFuZCBhcmd1bWVudCBhcmUgcG9zdGVkIGFzIHNlcGFyYXRlIGNodW5rcyB0byB0aGUgZXZlbnQgcXVldWUuCisJdWxEYXRhU2l6ZSA9CisJICAgIHNpemVvZih0RXBsRXZlbnQpICsKKwkgICAgKChwRXZlbnRfcC0+bV9wQXJnICE9IE5VTEwpID8gcEV2ZW50X3AtPm1fdWlTaXplIDogMCk7CisjZW5kaWYKKworCS8vIGRlY2lkZSBpbiB3aGljaCBidWZmZXIgdGhlIGV2ZW50IGhhdmUgdG8gd3JpdGUKKwlzd2l0Y2ggKHBFdmVudF9wLT5tX0V2ZW50U2luaykgeworCQkvLyBrZXJuZWxzcGFjZSBtb2R1bGVzCisJY2FzZSBrRXBsRXZlbnRTaW5rU3luYzoKKwljYXNlIGtFcGxFdmVudFNpbmtObXRrOgorCWNhc2Uga0VwbEV2ZW50U2lua0RsbGs6CisJY2FzZSBrRXBsRXZlbnRTaW5rRGxsa0NhbDoKKwljYXNlIGtFcGxFdmVudFNpbmtQZG9rOgorCWNhc2Uga0VwbEV2ZW50U2lua0Vycms6CisJCXsKKyNpZm5kZWYgRVBMX05PX0ZJRk8KKwkJCS8vIHBvc3QgbWVzc2FnZQorCQkJU2hiRXJyb3IgPQorCQkJICAgIFNoYkNpckFsbG9jRGF0YUJsb2NrKEVwbEV2ZW50dUluc3RhbmNlX2cuCisJCQkJCQkgbV9wU2hiVXNlclRvS2VybmVsSW5zdGFuY2UsCisJCQkJCQkgJlNoYkNpckNodW5rLCB1bERhdGFTaXplKTsKKwkJCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJCQkgICAgKCJFcGxFdmVudHVQb3N0KCk6IFNoYkNpckFsbG9jRGF0YUJsb2NrKFUySykgLT4gMHglWFxuIiwKKwkJCQkgICAgIFNoYkVycm9yKTsKKwkJCQlSZXQgPSBrRXBsRXZlbnRQb3N0RXJyb3I7CisJCQkJZ290byBFeGl0OworCQkJfQorCQkJU2hiRXJyb3IgPQorCQkJICAgIFNoYkNpcldyaXRlRGF0YUNodW5rKEVwbEV2ZW50dUluc3RhbmNlX2cuCisJCQkJCQkgbV9wU2hiVXNlclRvS2VybmVsSW5zdGFuY2UsCisJCQkJCQkgJlNoYkNpckNodW5rLCBwRXZlbnRfcCwKKwkJCQkJCSBzaXplb2YodEVwbEV2ZW50KSwKKwkJCQkJCSAmZkJ1ZmZlckNvbXBsZXRlZCk7CisJCQlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCQkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCisJCQkJICAgICgiRXBsRXZlbnR1UG9zdCgpOiBTaGJDaXJXcml0ZURhdGFDaHVuayhVMkspIC0+IDB4JVhcbiIsCisJCQkJICAgICBTaGJFcnJvcik7CisJCQkJUmV0ID0ga0VwbEV2ZW50UG9zdEVycm9yOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCWlmIChmQnVmZmVyQ29tcGxldGVkID09IEZBTFNFKSB7CisJCQkJU2hiRXJyb3IgPQorCQkJCSAgICBTaGJDaXJXcml0ZURhdGFDaHVuayhFcGxFdmVudHVJbnN0YW5jZV9nLgorCQkJCQkJCSBtX3BTaGJVc2VyVG9LZXJuZWxJbnN0YW5jZSwKKwkJCQkJCQkgJlNoYkNpckNodW5rLAorCQkJCQkJCSBwRXZlbnRfcC0+bV9wQXJnLAorCQkJCQkJCSAodW5zaWduZWQgbG9uZykKKwkJCQkJCQkgcEV2ZW50X3AtPm1fdWlTaXplLAorCQkJCQkJCSAmZkJ1ZmZlckNvbXBsZXRlZCk7CisJCQkJaWYgKChTaGJFcnJvciAhPSBrU2hiT2spCisJCQkJICAgIHx8IChmQnVmZmVyQ29tcGxldGVkID09IEZBTFNFKSkgeworCQkJCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKKwkJCQkJICAgICgiRXBsRXZlbnR1UG9zdCgpOiBTaGJDaXJXcml0ZURhdGFDaHVuazIoVTJLKSAtPiAweCVYXG4iLAorCQkJCQkgICAgIFNoYkVycm9yKTsKKwkJCQkJUmV0ID0ga0VwbEV2ZW50UG9zdEVycm9yOworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJfQorI2Vsc2UKKwkJCVJldCA9IEVwbEV2ZW50a1Byb2Nlc3MocEV2ZW50X3ApOworI2VuZGlmCisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gdXNlcnNwYWNlIG1vZHVsZXMKKwljYXNlIGtFcGxFdmVudFNpbmtObXRNbnU6CisJY2FzZSBrRXBsRXZlbnRTaW5rTm10dToKKwljYXNlIGtFcGxFdmVudFNpbmtTZG9Bc3lTZXE6CisJY2FzZSBrRXBsRXZlbnRTaW5rQXBpOgorCWNhc2Uga0VwbEV2ZW50U2lua0RsbHVDYWw6CisJY2FzZSBrRXBsRXZlbnRTaW5rRXJydToKKwljYXNlIGtFcGxFdmVudFNpbmtMZWR1OgorCQl7CisjaWZuZGVmIEVQTF9OT19GSUZPCisJCQkvLyBwb3N0IG1lc3NhZ2UKKwkJCVNoYkVycm9yID0KKwkJCSAgICBTaGJDaXJBbGxvY0RhdGFCbG9jayhFcGxFdmVudHVJbnN0YW5jZV9nLgorCQkJCQkJIG1fcFNoYktlcm5lbFRvVXNlckluc3RhbmNlLAorCQkJCQkJICZTaGJDaXJDaHVuaywgdWxEYXRhU2l6ZSk7CisJCQlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCQkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCisJCQkJICAgICgiRXBsRXZlbnR1UG9zdCgpOiBTaGJDaXJBbGxvY0RhdGFCbG9jayhLMlUpIC0+IDB4JVhcbiIsCisJCQkJICAgICBTaGJFcnJvcik7CisJCQkJUmV0ID0ga0VwbEV2ZW50UG9zdEVycm9yOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCVNoYkVycm9yID0KKwkJCSAgICBTaGJDaXJXcml0ZURhdGFDaHVuayhFcGxFdmVudHVJbnN0YW5jZV9nLgorCQkJCQkJIG1fcFNoYktlcm5lbFRvVXNlckluc3RhbmNlLAorCQkJCQkJICZTaGJDaXJDaHVuaywgcEV2ZW50X3AsCisJCQkJCQkgc2l6ZW9mKHRFcGxFdmVudCksCisJCQkJCQkgJmZCdWZmZXJDb21wbGV0ZWQpOworCQkJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgeworCQkJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQorCQkJCSAgICAoIkVwbEV2ZW50dVBvc3QoKTogU2hiQ2lyV3JpdGVEYXRhQ2h1bmsoSzJVKSAtPiAweCVYXG4iLAorCQkJCSAgICAgU2hiRXJyb3IpOworCQkJCVJldCA9IGtFcGxFdmVudFBvc3RFcnJvcjsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQlpZiAoZkJ1ZmZlckNvbXBsZXRlZCA9PSBGQUxTRSkgeworCQkJCVNoYkVycm9yID0KKwkJCQkgICAgU2hiQ2lyV3JpdGVEYXRhQ2h1bmsoRXBsRXZlbnR1SW5zdGFuY2VfZy4KKwkJCQkJCQkgbV9wU2hiS2VybmVsVG9Vc2VySW5zdGFuY2UsCisJCQkJCQkJICZTaGJDaXJDaHVuaywKKwkJCQkJCQkgcEV2ZW50X3AtPm1fcEFyZywKKwkJCQkJCQkgKHVuc2lnbmVkIGxvbmcpCisJCQkJCQkJIHBFdmVudF9wLT5tX3VpU2l6ZSwKKwkJCQkJCQkgJmZCdWZmZXJDb21wbGV0ZWQpOworCQkJCWlmICgoU2hiRXJyb3IgIT0ga1NoYk9rKQorCQkJCSAgICB8fCAoZkJ1ZmZlckNvbXBsZXRlZCA9PSBGQUxTRSkpIHsKKwkJCQkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCisJCQkJCSAgICAoIkVwbEV2ZW50dVBvc3QoKTogU2hiQ2lyV3JpdGVEYXRhQ2h1bmsyKEsyVSkgLT4gMHglWFxuIiwKKwkJCQkJICAgICBTaGJFcnJvcik7CisJCQkJCVJldCA9IGtFcGxFdmVudFBvc3RFcnJvcjsKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKwkJCX0KKyNlbHNlCisJCQlSZXQgPSBFcGxFdmVudHVQcm9jZXNzKHBFdmVudF9wKTsKKyNlbmRpZgorCisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJeworCQkJUmV0ID0ga0VwbEV2ZW50VW5rbm93blNpbms7CisJCX0KKworCX0JCQkvLyBlbmQgb2Ygc3dpdGNoKHBFdmVudF9wLT5tX0V2ZW50U2luaykKKworI2lmbmRlZiBFUExfTk9fRklGTworICAgICAgRXhpdDoKKyNlbmRpZgorCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRXZlbnR1UG9zdEVycm9yCisvLworLy8gRGVzY3JpcHRpb246IHBvc3QgZXJyb3JldmVudCBmcm9tIHVzZXJzcGFjZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIEV2ZW50U291cmNlX3AgICA9IHNvdXJjZS1tb2R1bGUgb2YgdGhlIGVycm9yZXZlbnQKKy8vICAgICAgICAgICAgICBFcGxFcnJvcl9wICAgICA9IGNvZGUgb2Ygb2NjdXJlZCBlcnJvcgorLy8gICAgICAgICAgICAgIHVpQXJnU2l6ZV9wICAgICA9IHNpemUgb2YgdGhlIGFyZ3VtZW50CisvLyAgICAgICAgICAgICAgcEFyZ19wICAgICAgICAgID0gcG9pbnRlciB0byB0aGUgYXJndW1lbnQKKy8vCisvLworLy8gUmV0dXJuczogICAgICB0RXBLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudHVQb3N0RXJyb3IodEVwbEV2ZW50U291cmNlIEV2ZW50U291cmNlX3AsCisJCQkJICAgICB0RXBsS2VybmVsIEVwbEVycm9yX3AsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlBcmdTaXplX3AsIHZvaWQgKnBBcmdfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwlCWVRFIGFiQnVmZmVyW0VQTF9NQVhfRVZFTlRfQVJHX1NJWkVdOworCXRFcGxFdmVudEVycm9yICpwRXZlbnRFcnJvciA9ICh0RXBsRXZlbnRFcnJvciAqKSBhYkJ1ZmZlcjsKKwl0RXBsRXZlbnQgRXBsRXZlbnQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGNyZWF0ZSBhcmd1bWVudAorCXBFdmVudEVycm9yLT5tX0V2ZW50U291cmNlID0gRXZlbnRTb3VyY2VfcDsKKwlwRXZlbnRFcnJvci0+bV9FcGxFcnJvciA9IEVwbEVycm9yX3A7CisJRVBMX01FTUNQWSgmcEV2ZW50RXJyb3ItPm1fQXJnLCBwQXJnX3AsIHVpQXJnU2l6ZV9wKTsKKworCS8vIGNyZWF0ZSBldmVudAorCUVwbEV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZUVycm9yOworCUVwbEV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua0FwaTsKKwlFUExfTUVNU0VUKCZFcGxFdmVudC5tX05ldFRpbWUsIDB4MDAsIHNpemVvZihFcGxFdmVudC5tX05ldFRpbWUpKTsKKwlFcGxFdmVudC5tX3VpU2l6ZSA9CisJICAgIChzaXplb2YoRXZlbnRTb3VyY2VfcCkgKyBzaXplb2YoRXBsRXJyb3JfcCkgKyB1aUFyZ1NpemVfcCk7CisJRXBsRXZlbnQubV9wQXJnID0gJmFiQnVmZmVyWzBdOworCisJLy8gcG9zdCBlcnJvcmV2ZW50CisJUmV0ID0gRXBsRXZlbnR1UG9zdCgmRXBsRXZlbnQpOworCisJcmV0dXJuIFJldDsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbEV2ZW50dVJ4U2lnbmFsSGFuZGxlckNiKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogQ2FsbGJhY2stZnVuY3Rpb24gZm9yIGV2ZXRzIGZyb20ga2VybmVsc3BhY2UKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwU2hiUnhJbnN0YW5jZV9wICAgID0gSW5zdGFuY2UtcG9pbnRlciBmb3IgYnVmZmVyCisvLyAgICAgICAgICAgICAgdWxEYXRhU2l6ZV9wICAgICAgICA9IHNpemUgb2YgZGF0YQorLy8KKy8vCisvLyBSZXR1cm5zOiB2b2lkCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZuZGVmIEVQTF9OT19GSUZPCitzdGF0aWMgdm9pZCBFcGxFdmVudHVSeFNpZ25hbEhhbmRsZXJDYih0U2hiSW5zdGFuY2UgcFNoYlJ4SW5zdGFuY2VfcCwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB1bERhdGFTaXplX3ApCit7CisJdEVwbEV2ZW50ICpwRXBsRXZlbnQ7CisJdFNoYkVycm9yIFNoYkVycm9yOworLy91bnNpZ25lZCBsb25nICAgdWxCbG9ja0NvdW50OworLy91bnNpZ25lZCBsb25nICAgdWxEYXRhU2l6ZTsKKwlCWVRFIGFiRGF0YUJ1ZmZlcltzaXplb2YodEVwbEV2ZW50KSArIEVQTF9NQVhfRVZFTlRfQVJHX1NJWkVdOworCS8vIGQuay46IGFiRGF0YUJ1ZmZlciBjb250YWlucyB0aGUgY29tcGxldGUgdEVwbEV2ZW50IHN0cnVjdHVyZQorCS8vICAgICAgIGFuZCBiZWhpbmQgdGhpcyB0aGUgYXJndW1lbnQKKworCVRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDIxKTsKKworLy8gZC5rLiBub3QgbmVlZGVkIGJlY2F1c2UgaXQgaXMgYWxyZWFkeSBkb25lIGluIFNoYXJlZEJ1ZmYKKy8qICAgIGRvCisgICAgeworICAgICAgICBCRU5DSE1BUktfTU9EXzI4X1NFVCgxKTsgICAgLy8gNCC1cyB1bnRpbCByZXNldAorICAgICAgICAvLyBnZXQgbWVzc2FnZXNpemUKKyAgICAgICAgU2hiRXJyb3IgPSBTaGJDaXJHZXRSZWFkRGF0YVNpemUgKHBTaGJSeEluc3RhbmNlX3AsICZ1bERhdGFTaXplKTsKKyAgICAgICAgaWYoU2hiRXJyb3IgIT0ga1NoYk9rKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBlcnJvciBnb3RvIGV4aXQKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgfQorCisgICAgICAgIEJFTkNITUFSS19NT0RfMjhfUkVTRVQoMSk7ICAvLyAxNCC1cyB1bnRpbCBzZXQKKyovCisJLy8gY29weSBkYXRhIGZyb20gZXZlbnQgcXVldWUKKwlTaGJFcnJvciA9IFNoYkNpclJlYWREYXRhQmxvY2socFNoYlJ4SW5zdGFuY2VfcCwKKwkJCQkgICAgICAgJmFiRGF0YUJ1ZmZlclswXSwKKwkJCQkgICAgICAgc2l6ZW9mKGFiRGF0YUJ1ZmZlciksICZ1bERhdGFTaXplX3ApOworCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJLy8gZXJyb3IgZ290byBleGl0CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gcmVzb2x2ZSB0aGUgcG9pbnRlciB0byB0aGUgZXZlbnQgc3RydWN0dXJlCisJcEVwbEV2ZW50ID0gKHRFcGxFdmVudCAqKSBhYkRhdGFCdWZmZXI7CisJLy8gc2V0IERhdGFzaXplCisJcEVwbEV2ZW50LT5tX3VpU2l6ZSA9ICh1bERhdGFTaXplX3AgLSBzaXplb2YodEVwbEV2ZW50KSk7CisJaWYgKHBFcGxFdmVudC0+bV91aVNpemUgPiAwKSB7CisJCS8vIHNldCBwb2ludGVyIHRvIGFyZ3VtZW50CisJCXBFcGxFdmVudC0+bV9wQXJnID0gJmFiRGF0YUJ1ZmZlcltzaXplb2YodEVwbEV2ZW50KV07CisJfSBlbHNlIHsKKwkJLy9zZXQgcG9pbnRlciB0byBOVUxMCisJCXBFcGxFdmVudC0+bV9wQXJnID0gTlVMTDsKKwl9CisKKwlCRU5DSE1BUktfTU9EXzI4X1NFVCgxKTsKKwkvLyBjYWxsIHByb2Nlc3NmdW5jdGlvbgorCUVwbEV2ZW50dVByb2Nlc3MocEVwbEV2ZW50KTsKKworCUJFTkNITUFSS19NT0RfMjhfUkVTRVQoMSk7CisJLy8gcmVhZCBudW1iZXIgb2YgbGVmdCBtZXNzYWdlcyB0byBwcm9jZXNzCisvLyBkLmsuIG5vdCBuZWVkZWQgYmVjYXVzZSBpdCBpcyBhbHJlYWR5IGRvbmUgaW4gU2hhcmVkQnVmZgorLyogICAgICAgIFNoYkVycm9yID0gU2hiQ2lyR2V0UmVhZEJsb2NrQ291bnQgKHBTaGJSeEluc3RhbmNlX3AsICZ1bEJsb2NrQ291bnQpOworICAgICAgICBpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBlcnJvciBnb3RvIGV4aXQKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKHVsQmxvY2tDb3VudCA+IDApOworKi8KKyAgICAgIEV4aXQ6CisJcmV0dXJuOworfQorI2VuZGlmCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxGcmFtZS5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxGcmFtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhN2Y4YjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEZyYW1lLmgKQEAgLTAsMCArMSwzNDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIEVQTCBmcmFtZXMKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxGcmFtZS5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA4LzA2LzIzIDE0OjU2OjMzICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDUvMjIgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExfRlJBTUVfSF8KKyNkZWZpbmUgX0VQTF9GUkFNRV9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gZGVmaW5lcyBmb3IgRXBsRnJhbWUubV93RmxhZworI2RlZmluZSBFUExfRlJBTUVfRkxBRzFfUkQgICAgICAgICAgMHgwMQkvLyByZWFkeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQUmVxLCBQUmVzKQorI2RlZmluZSBFUExfRlJBTUVfRkxBRzFfRVIgICAgICAgICAgMHgwMgkvLyBleGNlcHRpb24gcmVzZXQgKGVycm9yIHNpZ25hbGxpbmcpICAgICAgIChTb0EpCisjZGVmaW5lIEVQTF9GUkFNRV9GTEFHMV9FQSAgICAgICAgICAweDA0CS8vIGV4Y2VwdGlvbiBhY2tub3dsZWRnZSAoZXJyb3Igc2lnbmFsbGluZykgKFBSZXEsIFNvQSkKKyNkZWZpbmUgRVBMX0ZSQU1FX0ZMQUcxX0VDICAgICAgICAgIDB4MDgJLy8gZXhjZXB0aW9uIGNsZWFyIChlcnJvciBzaWduYWxsaW5nKSAgICAgICAoU3RhdHVzUmVzKQorI2RlZmluZSBFUExfRlJBTUVfRkxBRzFfRU4gICAgICAgICAgMHgxMAkvLyBleGNlcHRpb24gbmV3IChlcnJvciBzaWduYWxsaW5nKSAgICAgICAgIChQUmVzLCBTdGF0dXNSZXMpCisjZGVmaW5lIEVQTF9GUkFNRV9GTEFHMV9NUyAgICAgICAgICAweDIwCS8vIG11bHRpcGxleGVkIHNsb3QgICAgICAgICAgICAgICAgICAgICAgICAgKFBSZXEpCisjZGVmaW5lIEVQTF9GUkFNRV9GTEFHMV9QUyAgICAgICAgICAweDQwCS8vIHByZXNjYWxlZCBzbG90ICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNvQykKKyNkZWZpbmUgRVBMX0ZSQU1FX0ZMQUcxX01DICAgICAgICAgIDB4ODAJLy8gbXVsdGlwbGV4ZWQgY3ljbGUgY29tcGxldGVkICAgICAgICAgICAgICAoU29DKQorI2RlZmluZSBFUExfRlJBTUVfRkxBRzJfUlMgICAgICAgICAgMHgwNwkvLyBudW1iZXIgb2YgcGVuZGluZyByZXF1ZXN0cyB0byBzZW5kICAgICAgIChQUmVzLCBTdGF0dXNSZXMsIElkZW50UmVzKQorI2RlZmluZSBFUExfRlJBTUVfRkxBRzJfUFIgICAgICAgICAgMHgzOAkvLyBwcmlvcml0eSBvZiByZXF1ZXN0ZWQgYXN5bmNoLiBmcmFtZSAgICAgIChQUmVzLCBTdGF0dXNSZXMsIElkZW50UmVzKQorI2RlZmluZSBFUExfRlJBTUVfRkxBRzJfUFJfU0hJRlQgICAgMwkvLyBzaGlmdCBvZiBwcmlvcml0eSBvZiByZXF1ZXN0ZWQgYXN5bmNoLiBmcmFtZQorCisvLyBlcnJvciBoaXN0b3J5L3N0YXR1cyBlbnRyeSB0eXBlcworI2RlZmluZSBFUExfRVJSX0VOVFJZVFlQRV9TVEFUVVMgICAgICAgIDB4ODAwMAorI2RlZmluZSBFUExfRVJSX0VOVFJZVFlQRV9ISVNUT1JZICAgICAgIDB4MDAwMAorI2RlZmluZSBFUExfRVJSX0VOVFJZVFlQRV9FTUNZICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBFUExfRVJSX0VOVFJZVFlQRV9NT0RFX0FDVElWRSAgIDB4MTAwMAorI2RlZmluZSBFUExfRVJSX0VOVFJZVFlQRV9NT0RFX0NMRUFSRUQgIDB4MjAwMAorI2RlZmluZSBFUExfRVJSX0VOVFJZVFlQRV9NT0RFX09DQ1VSUkVEIDB4MzAwMAorI2RlZmluZSBFUExfRVJSX0VOVFJZVFlQRV9NT0RFX01BU0sgICAgIDB4MzAwMAorI2RlZmluZSBFUExfRVJSX0VOVFJZVFlQRV9QUk9GX1ZFTkRPUiAgIDB4MDAwMQorI2RlZmluZSBFUExfRVJSX0VOVFJZVFlQRV9QUk9GX0VQTCAgICAgIDB4MDAwMgorI2RlZmluZSBFUExfRVJSX0VOVFJZVFlQRV9QUk9GX01BU0sgICAgIDB4MEZGRgorCisvLyBkZWZpbmVzIGZvciBFUEwgdmVyc2lvbiAvIFBETyB2ZXJzaW9uCisjZGVmaW5lIEVQTF9WRVJTSU9OX1NVQiAgICAgICAgICAgICAweDBGCS8vIHN1YiB2ZXJzaW9uCisjZGVmaW5lIEVQTF9WRVJTSU9OX01BSU4gICAgICAgICAgICAweEYwCS8vIG1haW4gdmVyc2lvbgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gJCQkIGQuay46IG1vdmUgdGhpcyBkZWZpbml0aW9uIHRvIGdsb2JhbC5oCisvLyBieXRlLWFsaWduIHN0cnVjdHVyZXMKKyNpZmRlZiBfTVNDX1ZFUgorIyAgICBwcmFnbWEgcGFjayggcHVzaCwgcGFja2luZyApCisjICAgIHByYWdtYSBwYWNrKCAxICkKKyMgICAgZGVmaW5lIFBBQ0tfU1RSVUNUCisjZWxpZiBkZWZpbmVkKCBfX0dOVUNfXyApCisjICAgIGRlZmluZSBQQUNLX1NUUlVDVCAgICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKQorI2Vsc2UKKyMgICAgZXJyb3IgeW91IG11c3QgYnl0ZS1hbGlnbiB0aGVzZSBzdHJ1Y3R1cmVzIHdpdGggdGhlIGFwcHJvcHJpYXRlIGNvbXBpbGVyIGRpcmVjdGl2ZXMKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisJLy8gT2Zmc2V0IDE3CisJQllURSBtX2xlX2JSZXMxOwkvLyByZXNlcnZlZAorCS8vIE9mZnNldCAxOAorCUJZVEUgbV9sZV9iRmxhZzE7CS8vIEZsYWdzOiBNQywgUFMKKwkvLyBPZmZzZXQgMTkKKwlCWVRFIG1fbGVfYkZsYWcyOwkvLyBGbGFnczogcmVzCisJLy8gT2Zmc2V0IDIwCisJdEVwbE5ldFRpbWUgbV9sZV9OZXRUaW1lOwkvLyBzdXBwb3J0ZWQgaWYgRF9OTVRfTmV0VGltZUlzUmVhbFRpbWVfQk9PTCBpcyBzZXQKKwkvLyBPZmZzZXQgMjgKKwlRV09SRCBtX2xlX1JlbGF0aXZlVGltZTsJLy8gaW4gdXMgKHN1cHBvcnRlZCBpZiBEX05NVF9SZWxhdGl2ZVRpbWVfQk9PTCBpcyBzZXQpCisKK30gUEFDS19TVFJVQ1QgdEVwbFNvY0ZyYW1lOworCit0eXBlZGVmIHN0cnVjdCB7CisJLy8gT2Zmc2V0IDE3CisJQllURSBtX2xlX2JSZXMxOwkvLyByZXNlcnZlZAorCS8vIE9mZnNldCAxOAorCUJZVEUgbV9sZV9iRmxhZzE7CS8vIEZsYWdzOiBNUywgRUEsIFJECisJLy8gT2Zmc2V0IDE5CisJQllURSBtX2xlX2JGbGFnMjsJLy8gRmxhZ3M6IHJlcworCS8vIE9mZnNldCAyMAorCUJZVEUgbV9sZV9iUGRvVmVyc2lvbjsKKwkvLyBPZmZzZXQgMjEKKwlCWVRFIG1fbGVfYlJlczI7CS8vIHJlc2VydmVkCisJLy8gT2Zmc2V0IDIyCisJV09SRCBtX2xlX3dTaXplOworCS8vIE9mZnNldCAyNAorCUJZVEUgbV9sZV9hYlBheWxvYWRbMjU2IC8qRF9OTVRfSXNvY2hyUnhNYXhQYXlsb2FkX1UxNiAqLyBdOworCit9IFBBQ0tfU1RSVUNUIHRFcGxQcmVxRnJhbWU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvLyBPZmZzZXQgMTcKKwlCWVRFIG1fbGVfYk5tdFN0YXR1czsJLy8gTk1UIHN0YXRlCisJLy8gT2Zmc2V0IDE4CisJQllURSBtX2xlX2JGbGFnMTsJLy8gRmxhZ3M6IE1TLCBFTiwgUkQKKwkvLyBPZmZzZXQgMTkKKwlCWVRFIG1fbGVfYkZsYWcyOwkvLyBGbGFnczogUFIsIFJTCisJLy8gT2Zmc2V0IDIwCisJQllURSBtX2xlX2JQZG9WZXJzaW9uOworCS8vIE9mZnNldCAyMQorCUJZVEUgbV9sZV9iUmVzMjsJLy8gcmVzZXJ2ZWQKKwkvLyBPZmZzZXQgMjIKKwlXT1JEIG1fbGVfd1NpemU7CisJLy8gT2Zmc2V0IDI0CisJQllURSBtX2xlX2FiUGF5bG9hZFsyNTYJLypEX05NVF9Jc29jaHJSeE1heFBheWxvYWRfVTE2CisJCQkJICAgLyBEX05NVF9Jc29jaHJUeE1heFBheWxvYWRfVTE2ICovIF07CisKK30gUEFDS19TVFJVQ1QgdEVwbFByZXNGcmFtZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8vIE9mZnNldCAxNworCUJZVEUgbV9sZV9iTm10U3RhdHVzOwkvLyBOTVQgc3RhdGUKKwkvLyBPZmZzZXQgMTgKKwlCWVRFIG1fbGVfYkZsYWcxOwkvLyBGbGFnczogRUEsIEVSCisJLy8gT2Zmc2V0IDE5CisJQllURSBtX2xlX2JGbGFnMjsJLy8gRmxhZ3M6IHJlcworCS8vIE9mZnNldCAyMAorCUJZVEUgbV9sZV9iUmVxU2VydmljZUlkOworCS8vIE9mZnNldCAyMQorCUJZVEUgbV9sZV9iUmVxU2VydmljZVRhcmdldDsKKwkvLyBPZmZzZXQgMjIKKwlCWVRFIG1fbGVfYkVwbFZlcnNpb247CisKK30gUEFDS19TVFJVQ1QgdEVwbFNvYUZyYW1lOworCit0eXBlZGVmIHN0cnVjdCB7CisJV09SRCBtX3dFbnRyeVR5cGU7CisJV09SRCBtX3dFcnJvckNvZGU7CisJdEVwbE5ldFRpbWUgbV9UaW1lU3RhbXA7CisJQllURSBtX2FiQWRkSW5mb1s4XTsKKworfSBQQUNLX1NUUlVDVCB0RXBsRXJySGlzdG9yeUVudHJ5OworCit0eXBlZGVmIHN0cnVjdCB7CisJLy8gT2Zmc2V0IDE4CisJQllURSBtX2xlX2JGbGFnMTsJLy8gRmxhZ3M6IEVOLCBFQworCUJZVEUgbV9sZV9iRmxhZzI7CS8vIEZsYWdzOiBQUiwgUlMKKwlCWVRFIG1fbGVfYk5tdFN0YXR1czsJLy8gTk1UIHN0YXRlCisJQllURSBtX2xlX2JSZXMxWzNdOworCVFXT1JEIG1fbGVfcXdTdGF0aWNFcnJvcjsJLy8gc3RhdGljIGVycm9yIGJpdCBmaWVsZAorCXRFcGxFcnJIaXN0b3J5RW50cnkgbV9sZV9hRXJySGlzdG9yeUVudHJ5WzE0XTsKKworfSBQQUNLX1NUUlVDVCB0RXBsU3RhdHVzUmVzcG9uc2U7CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvLyBPZmZzZXQgMTgKKwlCWVRFIG1fbGVfYkZsYWcxOwkvLyBGbGFnczogcmVzCisJQllURSBtX2xlX2JGbGFnMjsJLy8gRmxhZ3M6IFBSLCBSUworCUJZVEUgbV9sZV9iTm10U3RhdHVzOwkvLyBOTVQgc3RhdGUKKwlCWVRFIG1fbGVfYklkZW50UmVzcEZsYWdzOwkvLyBGbGFnczogRlcKKwlCWVRFIG1fbGVfYkVwbFByb2ZpbGVWZXJzaW9uOworCUJZVEUgbV9sZV9iUmVzMTsKKwlEV09SRCBtX2xlX2R3RmVhdHVyZUZsYWdzOwkvLyBOTVRfRmVhdHVyZUZsYWdzX1UzMgorCVdPUkQgbV9sZV93TXR1OwkJLy8gTk1UX0N5Y2xlVGltaW5nX1JFQy5Bc3luY01UVV9VMTY6IENfSVBfTUlOX01UVSAtIENfSVBfTUFYX01UVQorCVdPUkQgbV9sZV93UG9sbEluU2l6ZTsJLy8gTk1UX0N5Y2xlVGltaW5nX1JFQy5QUmVxQWN0UGF5bG9hZF9VMTYKKwlXT1JEIG1fbGVfd1BvbGxPdXRTaXplOwkvLyBOTVRfQ3ljbGVUaW1pbmdfUkVDLlBSZXNBY3RQYXlsb2FkX1UxNgorCURXT1JEIG1fbGVfZHdSZXNwb25zZVRpbWU7CS8vIE5NVF9DeWNsZVRpbWluZ19SRUMuUFJlc01heExhdGVuY3lfVTMyCisJV09SRCBtX2xlX3dSZXMyOworCURXT1JEIG1fbGVfZHdEZXZpY2VUeXBlOwkvLyBOTVRfRGV2aWNlVHlwZV9VMzIKKwlEV09SRCBtX2xlX2R3VmVuZG9ySWQ7CS8vIE5NVF9JZGVudGl0eU9iamVjdF9SRUMuVmVuZG9ySWRfVTMyCisJRFdPUkQgbV9sZV9kd1Byb2R1Y3RDb2RlOwkvLyBOTVRfSWRlbnRpdHlPYmplY3RfUkVDLlByb2R1Y3RDb2RlX1UzMgorCURXT1JEIG1fbGVfZHdSZXZpc2lvbk51bWJlcjsJLy8gTk1UX0lkZW50aXR5T2JqZWN0X1JFQy5SZXZpc2lvbk5vX1UzMgorCURXT1JEIG1fbGVfZHdTZXJpYWxOdW1iZXI7CS8vIE5NVF9JZGVudGl0eU9iamVjdF9SRUMuU2VyaWFsTm9fVTMyCisJUVdPUkQgbV9sZV9xd1ZlbmRvclNwZWNpZmljRXh0MTsKKwlEV09SRCBtX2xlX2R3VmVyaWZ5Q29uZmlndXJhdGlvbkRhdGU7CS8vIENGTV9WZXJpZnlDb25maWd1cmF0aW9uX1JFQy5Db25mRGF0ZV9VMzIKKwlEV09SRCBtX2xlX2R3VmVyaWZ5Q29uZmlndXJhdGlvblRpbWU7CS8vIENGTV9WZXJpZnlDb25maWd1cmF0aW9uX1JFQy5Db25mVGltZV9VMzIKKwlEV09SRCBtX2xlX2R3QXBwbGljYXRpb25Td0RhdGU7CS8vIFBETF9Mb2NWZXJBcHBsU3dfUkVDLkFwcGxTd0RhdGVfVTMyIG9uIHByb2dyYW1tYWJsZSBkZXZpY2Ugb3IgZGF0ZSBwb3J0aW9uIG9mIE5NVF9NYW51ZmFjdFN3VmVyc19WUyBvbiBub24tcHJvZ3JhbW1hYmxlIGRldmljZQorCURXT1JEIG1fbGVfZHdBcHBsaWNhdGlvblN3VGltZTsJLy8gUERMX0xvY1ZlckFwcGxTd19SRUMuQXBwbFN3VGltZV9VMzIgb24gcHJvZ3JhbW1hYmxlIGRldmljZSBvciB0aW1lIHBvcnRpb24gb2YgTk1UX01hbnVmYWN0U3dWZXJzX1ZTIG9uIG5vbi1wcm9ncmFtbWFibGUgZGV2aWNlCisJRFdPUkQgbV9sZV9kd0lwQWRkcmVzczsKKwlEV09SRCBtX2xlX2R3U3VibmV0TWFzazsKKwlEV09SRCBtX2xlX2R3RGVmYXVsdEdhdGV3YXk7CisJQllURSBtX2xlX3NIb3N0bmFtZVszMl07CisJQllURSBtX2xlX2FiVmVuZG9yU3BlY2lmaWNFeHQyWzQ4XTsKKworfSBQQUNLX1NUUlVDVCB0RXBsSWRlbnRSZXNwb25zZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8vIE9mZnNldCAxOAorCUJZVEUgbV9sZV9iTm10Q29tbWFuZElkOworCUJZVEUgbV9sZV9iUmVzMTsKKwlCWVRFIG1fbGVfYWJObXRDb21tYW5kRGF0YVszMl07CisKK30gUEFDS19TVFJVQ1QgdEVwbE5tdENvbW1hbmRTZXJ2aWNlOworCit0eXBlZGVmIHN0cnVjdCB7CisJQllURSBtX2xlX2JSZXNlcnZlZDsKKwlCWVRFIG1fbGVfYlRyYW5zYWN0aW9uSWQ7CisJQllURSBtX2xlX2JGbGFnczsKKwlCWVRFIG1fbGVfYkNvbW1hbmRJZDsKKwlXT1JEIG1fbGVfd1NlZ21lbnRTaXplOworCVdPUkQgbV9sZV93UmVzZXJ2ZWQ7CisJQllURSBtX2xlX2FiQ29tbWFuZERhdGFbOF07CS8vIGp1c3QgcmVzZXJ2ZSBhIG1pbmltdW0gbnVtYmVyIG9mIGJ5dGVzIGFzIGEgcGxhY2Vob2xkZXIKKworfSBQQUNLX1NUUlVDVCB0RXBsQXN5U2RvQ29tOworCisvLyBhc3luY2hyb25vdXMgU0RPIFNlcXVlbmNlIEhlYWRlcgordHlwZWRlZiBzdHJ1Y3QgeworCUJZVEUgbV9sZV9iUmVjU2VxTnVtQ29uOworCUJZVEUgbV9sZV9iU2VuZFNlcU51bUNvbjsKKwlCWVRFIG1fbGVfYWJSZXNlcnZlZFsyXTsKKwl0RXBsQXN5U2RvQ29tIG1fbGVfYWJTZG9TZXFQYXlsb2FkOworCit9IFBBQ0tfU1RSVUNUIHRFcGxBc3lTZG9TZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvLyBPZmZzZXQgMTgKKwlCWVRFIG1fbGVfYk5tdENvbW1hbmRJZDsKKwlCWVRFIG1fbGVfYlRhcmdldE5vZGVJZDsKKwlCWVRFIG1fbGVfYWJObXRDb21tYW5kRGF0YVszMl07CisKK30gUEFDS19TVFJVQ1QgdEVwbE5tdFJlcXVlc3RTZXJ2aWNlOworCit0eXBlZGVmIHVuaW9uIHsKKwkvLyBPZmZzZXQgMTgKKwl0RXBsU3RhdHVzUmVzcG9uc2UgbV9TdGF0dXNSZXNwb25zZTsKKwl0RXBsSWRlbnRSZXNwb25zZSBtX0lkZW50UmVzcG9uc2U7CisJdEVwbE5tdENvbW1hbmRTZXJ2aWNlIG1fTm10Q29tbWFuZFNlcnZpY2U7CisJdEVwbE5tdFJlcXVlc3RTZXJ2aWNlIG1fTm10UmVxdWVzdFNlcnZpY2U7CisJdEVwbEFzeVNkb1NlcSBtX1Nkb1NlcXVlbmNlRnJhbWU7CisJQllURSBtX2xlX2FiUGF5bG9hZFsyNTYJLypEX05NVF9BU25kVHhNYXhQYXlsb2FkX1UxNgorCQkJCSAgIC8gRF9OTVRfQVNuZFJ4TWF4UGF5bG9hZF9VMTYgKi8gXTsKKworfSB0RXBsQXNuZFBheWxvYWQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvLyBPZmZzZXQgMTcKKwlCWVRFIG1fbGVfYlNlcnZpY2VJZDsKKwkvLyBPZmZzZXQgMTgKKwl0RXBsQXNuZFBheWxvYWQgbV9QYXlsb2FkOworCit9IFBBQ0tfU1RSVUNUIHRFcGxBc25kRnJhbWU7CisKK3R5cGVkZWYgdW5pb24geworCS8vIE9mZnNldCAxNworCXRFcGxTb2NGcmFtZSBtX1NvYzsKKwl0RXBsUHJlcUZyYW1lIG1fUHJlcTsKKwl0RXBsUHJlc0ZyYW1lIG1fUHJlczsKKwl0RXBsU29hRnJhbWUgbV9Tb2E7CisJdEVwbEFzbmRGcmFtZSBtX0FzbmQ7CisKK30gdEVwbEZyYW1lRGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8vIE9mZnNldCAwCisJQllURSBtX2JlX2FiRHN0TWFjWzZdOwkvLyBNQUMgYWRkcmVzcyBvZiB0aGUgYWRkcmVzc2VkIG5vZGVzCisJLy8gT2Zmc2V0IDYKKwlCWVRFIG1fYmVfYWJTcmNNYWNbNl07CS8vIE1BQyBhZGRyZXNzIG9mIHRoZSB0cmFuc21pdHRpbmcgbm9kZQorCS8vIE9mZnNldCAxMgorCVdPUkQgbV9iZV93RXRoZXJUeXBlOwkvLyBFdGhlcm5ldCBtZXNzYWdlIHR5cGUgKGJpZyBlbmRpYW4pCisJLy8gT2Zmc2V0IDE0CisJQllURSBtX2xlX2JNZXNzYWdlVHlwZTsJLy8gRVBMIG1lc3NhZ2UgdHlwZQorCS8vIE9mZnNldCAxNQorCUJZVEUgbV9sZV9iRHN0Tm9kZUlkOwkvLyBFUEwgbm9kZSBJRCBvZiB0aGUgYWRkcmVzc2VkIG5vZGVzCisJLy8gT2Zmc2V0IDE2CisJQllURSBtX2xlX2JTcmNOb2RlSWQ7CS8vIEVQTCBub2RlIElEIG9mIHRoZSB0cmFuc21pdHRpbmcgbm9kZQorCS8vIE9mZnNldCAxNworCXRFcGxGcmFtZURhdGEgbV9EYXRhOworCit9IFBBQ0tfU1RSVUNUIHRFcGxGcmFtZTsKKworLy8gdW4tYnl0ZS1hbGlnbiBzdHJ1Y3R1cmVzCisjaWZkZWYgX01TQ19WRVIKKyMgICAgcHJhZ21hIHBhY2soIHBvcCwgcGFja2luZyApCisjZW5kaWYKKwordHlwZWRlZiBlbnVtIHsKKwlrRXBsTXNnVHlwZU5vbkVwbCA9IDB4MDAsCisJa0VwbE1zZ1R5cGVTb2MgPSAweDAxLAorCWtFcGxNc2dUeXBlUHJlcSA9IDB4MDMsCisJa0VwbE1zZ1R5cGVQcmVzID0gMHgwNCwKKwlrRXBsTXNnVHlwZVNvYSA9IDB4MDUsCisJa0VwbE1zZ1R5cGVBc25kID0gMHgwNiwKKworfSB0RXBsTXNnVHlwZTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExfRlJBTUVfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsSWRlbnR1LmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbElkZW50dS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNTllZjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbElkZW50dS5jCkBAIC0wLDAgKzEsNDg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgc291cmNlIGZpbGUgZm9yIElkZW50dS1Nb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxJZGVudHUuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwOC8xMS8yMSAwOTowMDozOCAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzExLzE1IGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ1c2VyL0VwbElkZW50dS5oIgorI2luY2x1ZGUgInVzZXIvRXBsRGxsdUNhbC5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgQyBMIEEgUyBTICA8eHh4eHg+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsSWRlbnRSZXNwb25zZSAqbV9hcElkZW50UmVzcG9uc2VbMjU0XTsJLy8gdGhlIElkZW50UmVzcG9uc2UgYXJlIG1hbmFnZWQgZHluYW1pY2FsbHkKKwl0RXBsSWRlbnR1Q2JSZXNwb25zZSBtX2FwZm5DYlJlc3BvbnNlWzI1NF07CisKK30gdEVwbElkZW50dUluc3RhbmNlOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxJZGVudHVJbnN0YW5jZSBFcGxJZGVudHVJbnN0YW5jZV9nOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbElkZW50dUNiSWRlbnRSZXNwb25zZSh0RXBsRnJhbWVJbmZvICogcEZyYW1lSW5mb19wKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbElkZW50dUluaXQKKy8vCisvLyBEZXNjcmlwdGlvbjogaW5pdCBmaXJzdCBpbnN0YW5jZSBvZiB0aGUgbW9kdWxlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbElkZW50dUluaXQoKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0gRXBsSWRlbnR1QWRkSW5zdGFuY2UoKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbElkZW50dUFkZEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGluaXQgb3RoZXIgaW5zdGFuY2VzIG9mIHRoZSBtb2R1bGUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsSWRlbnR1QWRkSW5zdGFuY2UoKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyByZXNldCBpbnN0YW5jZSBzdHJ1Y3R1cmUKKwlFUExfTUVNU0VUKCZFcGxJZGVudHVJbnN0YW5jZV9nLCAwLCBzaXplb2YoRXBsSWRlbnR1SW5zdGFuY2VfZykpOworCisJLy8gcmVnaXN0ZXIgSWRlbnRSZXNwb25zZSBjYWxsYmFjayBmdW5jdGlvbgorCVJldCA9CisJICAgIEVwbERsbHVDYWxSZWdBc25kU2VydmljZShrRXBsRGxsQXNuZElkZW50UmVzcG9uc2UsCisJCQkJICAgICBFcGxJZGVudHVDYklkZW50UmVzcG9uc2UsCisJCQkJICAgICBrRXBsRGxsQXNuZEZpbHRlckFueSk7CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbElkZW50dURlbEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGRlbGV0ZSBpbnN0YW5jZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxJZGVudHVEZWxJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGRlcmVnaXN0ZXIgSWRlbnRSZXNwb25zZSBjYWxsYmFjayBmdW5jdGlvbgorCVJldCA9CisJICAgIEVwbERsbHVDYWxSZWdBc25kU2VydmljZShrRXBsRGxsQXNuZElkZW50UmVzcG9uc2UsIE5VTEwsCisJCQkJICAgICBrRXBsRGxsQXNuZEZpbHRlck5vbmUpOworCisJUmV0ID0gRXBsSWRlbnR1UmVzZXQoKTsKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsSWRlbnR1UmVzZXQKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVzZXRzIHRoaXMgaW5zdGFuY2UKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsSWRlbnR1UmVzZXQoKQoreworCXRFcGxLZXJuZWwgUmV0OworCWludCBpSW5kZXg7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCWZvciAoaUluZGV4ID0gMDsKKwkgICAgIGlJbmRleCA8IHRhYmVudHJpZXMoRXBsSWRlbnR1SW5zdGFuY2VfZy5tX2FwSWRlbnRSZXNwb25zZSk7CisJICAgICBpSW5kZXgrKykgeworCQlpZiAoRXBsSWRlbnR1SW5zdGFuY2VfZy5tX2FwSWRlbnRSZXNwb25zZVtpSW5kZXhdICE9IE5VTEwpIHsJLy8gZnJlZSBtZW1vcnkKKwkJCUVQTF9GUkVFKEVwbElkZW50dUluc3RhbmNlX2cubV9hcElkZW50UmVzcG9uc2VbaUluZGV4XSk7CisJCX0KKwl9CisKKwlFUExfTUVNU0VUKCZFcGxJZGVudHVJbnN0YW5jZV9nLCAwLCBzaXplb2YoRXBsSWRlbnR1SW5zdGFuY2VfZykpOworCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxJZGVudHVHZXRJZGVudFJlc3BvbnNlCisvLworLy8gRGVzY3JpcHRpb246IHJldHVybnMgdGhlIElkZW50UmVzcG9uc2UgZm9yIHRoZSBzcGVjaWZpZWQgbm9kZS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgICAgID0gSU46IG5vZGUgSUQKKy8vICAgICAgICAgICAgICBwcElkZW50UmVzcG9uc2VfcCAgICAgICAgICAgPSBPVVQ6IHBvaW50ZXIgdG8gcG9pbnRlciBvZiBJZGVudFJlc3BvbnNlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXF1YWxzIE5VTEwsIGlmIG5vIElkZW50UmVzcG9uc2UgYXZhaWxhYmxlCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbElkZW50dUdldElkZW50UmVzcG9uc2UodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCSAgICB0RXBsSWRlbnRSZXNwb25zZSAqKgorCQkJCQkgICAgcHBJZGVudFJlc3BvbnNlX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGRlY3JlbWVudCBub2RlIElELCBiZWNhdXNlIGFycmF5IGlzIHplcm8gYmFzZWQKKwl1aU5vZGVJZF9wLS07CisJaWYgKHVpTm9kZUlkX3AgPCB0YWJlbnRyaWVzKEVwbElkZW50dUluc3RhbmNlX2cubV9hcElkZW50UmVzcG9uc2UpKSB7CisJCSpwcElkZW50UmVzcG9uc2VfcCA9CisJCSAgICBFcGxJZGVudHVJbnN0YW5jZV9nLm1fYXBJZGVudFJlc3BvbnNlW3VpTm9kZUlkX3BdOworCX0gZWxzZSB7CQkvLyBpbnZhbGlkIG5vZGUgSUQgc3BlY2lmaWVkCisJCSpwcElkZW50UmVzcG9uc2VfcCA9IE5VTEw7CisJCVJldCA9IGtFcGxJbnZhbGlkTm9kZUlkOworCX0KKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsSWRlbnR1UmVxdWVzdElkZW50UmVzcG9uc2UKKy8vCisvLyBEZXNjcmlwdGlvbjogcmV0dXJucyB0aGUgSWRlbnRSZXNwb25zZSBmb3IgdGhlIHNwZWNpZmllZCBub2RlLgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICAgICAgICAgICAgICAgICAgPSBJTjogbm9kZSBJRAorLy8gICAgICAgICAgICAgIHBmbkNiUmVzcG9uc2VfcCAgICAgICAgICAgICA9IElOOiBmdW5jdGlvbiBwb2ludGVyIHRvIGNhbGxiYWNrIGZ1bmN0aW9uCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggd2lsbCBiZSBjYWxsZWQgaWYgSWRlbnRSZXNwb25zZSBpcyByZWNlaXZlZAorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxJZGVudHVSZXF1ZXN0SWRlbnRSZXNwb25zZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJCXRFcGxJZGVudHVDYlJlc3BvbnNlCisJCQkJCQlwZm5DYlJlc3BvbnNlX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGRlY3JlbWVudCBub2RlIElELCBiZWNhdXNlIGFycmF5IGlzIHplcm8gYmFzZWQKKwl1aU5vZGVJZF9wLS07CisJaWYgKHVpTm9kZUlkX3AgPCB0YWJlbnRyaWVzKEVwbElkZW50dUluc3RhbmNlX2cubV9hcGZuQ2JSZXNwb25zZSkpIHsKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwkJaWYgKEVwbElkZW50dUluc3RhbmNlX2cubV9hcGZuQ2JSZXNwb25zZVt1aU5vZGVJZF9wXSAhPSBOVUxMKSB7CS8vIHJlcXVlc3QgYWxyZWFkeSBpc3N1ZWQgKG1heWJlIGJ5IHNvbWVvbmUgZWxzZSkKKwkJCVJldCA9IGtFcGxJbnZhbGlkT3BlcmF0aW9uOworCQl9IGVsc2UgeworCQkJRXBsSWRlbnR1SW5zdGFuY2VfZy5tX2FwZm5DYlJlc3BvbnNlW3VpTm9kZUlkX3BdID0KKwkJCSAgICBwZm5DYlJlc3BvbnNlX3A7CisJCQlSZXQgPQorCQkJICAgIEVwbERsbHVDYWxJc3N1ZVJlcXVlc3Qoa0VwbERsbFJlcVNlcnZpY2VJZGVudCwKKwkJCQkJCSAgICh1aU5vZGVJZF9wICsgMSksIDB4RkYpOworCQl9CisjZWxzZQorCQlSZXQgPSBrRXBsSW52YWxpZE9wZXJhdGlvbjsKKyNlbmRpZgorCX0gZWxzZSB7CQkvLyBpbnZhbGlkIG5vZGUgSUQgc3BlY2lmaWVkCisJCVJldCA9IGtFcGxJbnZhbGlkTm9kZUlkOworCX0KKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsSWRlbnR1R2V0UnVubmluZ1JlcXVlc3RzCisvLworLy8gRGVzY3JpcHRpb246IHJldHVybnMgYSBiaXQgZmllbGQgd2l0aCB0aGUgcnVubmluZyByZXF1ZXN0cyBmb3Igbm9kZS1JRCAxLTMyCisvLyAgICAgICAgICAgICAganVzdCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFUExETExFWFBPUlQgRFdPUkQgUFVCTElDIEVwbElkZW50dUdldFJ1bm5pbmdSZXF1ZXN0cyh2b2lkKQoreworCURXT1JEIGR3UmVxcyA9IDA7CisJdW5zaWduZWQgaW50IHVpSW5kZXg7CisKKwlmb3IgKHVpSW5kZXggPSAwOyB1aUluZGV4IDwgMzI7IHVpSW5kZXgrKykgeworCQlpZiAoRXBsSWRlbnR1SW5zdGFuY2VfZy5tX2FwZm5DYlJlc3BvbnNlW3VpSW5kZXhdICE9IE5VTEwpIHsKKwkJCWR3UmVxcyB8PSAoMSA8PCB1aUluZGV4KTsKKwkJfQorCX0KKworCXJldHVybiBkd1JlcXM7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxJZGVudHVDYklkZW50UmVzcG9uc2UKKy8vCisvLyBEZXNjcmlwdGlvbjogY2FsbGJhY2sgZnVua3Rpb24gZm9yIElkZW50UmVzcG9uc2UKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwRnJhbWVJbmZvX3AgICAgICAgICAgICA9IEZyYW1lIHdpdGggdGhlIElkZW50UmVzcG9uc2UKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsSWRlbnR1Q2JJZGVudFJlc3BvbnNlKHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl1bnNpZ25lZCBpbnQgdWlOb2RlSWQ7CisJdW5zaWduZWQgaW50IHVpSW5kZXg7CisJdEVwbElkZW50dUNiUmVzcG9uc2UgcGZuQ2JSZXNwb25zZTsKKworCXVpTm9kZUlkID0gQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lSW5mb19wLT5tX3BGcmFtZS0+bV9sZV9iU3JjTm9kZUlkKTsKKworCXVpSW5kZXggPSB1aU5vZGVJZCAtIDE7CisKKwlpZiAodWlJbmRleCA8IHRhYmVudHJpZXMoRXBsSWRlbnR1SW5zdGFuY2VfZy5tX2FwZm5DYlJlc3BvbnNlKSkgeworCQkvLyBtZW1vcml6ZSBwb2ludGVyIHRvIGNhbGxiYWNrIGZ1bmN0aW9uCisJCXBmbkNiUmVzcG9uc2UgPSBFcGxJZGVudHVJbnN0YW5jZV9nLm1fYXBmbkNiUmVzcG9uc2VbdWlJbmRleF07CisJCS8vIHJlc2V0IGNhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXIgc28gdGhhdCBjYWxsZXIgbWF5IGlzc3VlIG5leHQgcmVxdWVzdCBpbW1lZGlhdGVseQorCQlFcGxJZGVudHVJbnN0YW5jZV9nLm1fYXBmbkNiUmVzcG9uc2VbdWlJbmRleF0gPSBOVUxMOworCisJCWlmIChwRnJhbWVJbmZvX3AtPm1fdWlGcmFtZVNpemUgPCBFUExfQ19ETExfTUlOU0laRV9JREVOVFJFUykgewkvLyBJZGVudFJlc3BvbnNlIG5vdCByZWNlaXZlZCBvciBpdCBoYXMgaW52YWxpZCBzaXplCisJCQlpZiAocGZuQ2JSZXNwb25zZSA9PSBOVUxMKSB7CS8vIHJlc3BvbnNlIHdhcyBub3QgcmVxdWVzdGVkCisJCQkJZ290byBFeGl0OworCQkJfQorCQkJUmV0ID0gcGZuQ2JSZXNwb25zZSh1aU5vZGVJZCwgTlVMTCk7CisJCX0gZWxzZSB7CS8vIElkZW50UmVzcG9uc2UgcmVjZWl2ZWQKKwkJCWlmIChFcGxJZGVudHVJbnN0YW5jZV9nLm1fYXBJZGVudFJlc3BvbnNlW3VpSW5kZXhdID09IE5VTEwpIHsJLy8gbWVtb3J5IGZvciBJZGVudFJlc3BvbnNlIG11c3QgYmUgYWxsb2NhdGVkCisJCQkJRXBsSWRlbnR1SW5zdGFuY2VfZy5tX2FwSWRlbnRSZXNwb25zZVt1aUluZGV4XSA9CisJCQkJICAgIEVQTF9NQUxMT0Moc2l6ZW9mKHRFcGxJZGVudFJlc3BvbnNlKSk7CisJCQkJaWYgKEVwbElkZW50dUluc3RhbmNlX2cubV9hcElkZW50UmVzcG9uc2VbdWlJbmRleF0gPT0gTlVMTCkgewkvLyBtYWxsb2MgZmFpbGVkCisJCQkJCWlmIChwZm5DYlJlc3BvbnNlID09IE5VTEwpIHsJLy8gcmVzcG9uc2Ugd2FzIG5vdCByZXF1ZXN0ZWQKKwkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJfQorCQkJCQlSZXQgPQorCQkJCQkgICAgcGZuQ2JSZXNwb25zZSh1aU5vZGVJZCwKKwkJCQkJCQkgICZwRnJhbWVJbmZvX3AtPgorCQkJCQkJCSAgbV9wRnJhbWUtPm1fRGF0YS4KKwkJCQkJCQkgIG1fQXNuZC5tX1BheWxvYWQuCisJCQkJCQkJICBtX0lkZW50UmVzcG9uc2UpOworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJfQorCQkJLy8gY29weSBJZGVudFJlc3BvbnNlIHRvIGluc3RhbmNlIHN0cnVjdHVyZQorCQkJRVBMX01FTUNQWShFcGxJZGVudHVJbnN0YW5jZV9nLgorCQkJCSAgIG1fYXBJZGVudFJlc3BvbnNlW3VpSW5kZXhdLAorCQkJCSAgICZwRnJhbWVJbmZvX3AtPm1fcEZyYW1lLT5tX0RhdGEubV9Bc25kLgorCQkJCSAgIG1fUGF5bG9hZC5tX0lkZW50UmVzcG9uc2UsCisJCQkJICAgc2l6ZW9mKHRFcGxJZGVudFJlc3BvbnNlKSk7CisJCQlpZiAocGZuQ2JSZXNwb25zZSA9PSBOVUxMKSB7CS8vIHJlc3BvbnNlIHdhcyBub3QgcmVxdWVzdGVkCisJCQkJZ290byBFeGl0OworCQkJfQorCQkJUmV0ID0KKwkJCSAgICBwZm5DYlJlc3BvbnNlKHVpTm9kZUlkLAorCQkJCQkgIEVwbElkZW50dUluc3RhbmNlX2cuCisJCQkJCSAgbV9hcElkZW50UmVzcG9uc2VbdWlJbmRleF0pOworCQl9CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxJbmMuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsSW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdmOTNkMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsSW5jLmgKQEAgLTAsMCArMSwzODUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBiYXNpYyBpbmNsdWRlIGZpbGUgZm9yIGludGVybmFsIEVQTCBzdGFjayBtb2R1bGVzCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsSW5jLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjggJCAgJERhdGU6IDIwMDgvMTEvMTcgMTY6NDA6MzkgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNS8yMiBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTF9JTkNfSF8KKyNkZWZpbmUgX0VQTF9JTkNfSF8KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gaW5jbHVkZSBmaWxlcworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyKQorCisjaWZkZWYgVU5ERVJfUlRTUworCS8vIFJUWCBoZWFkZXIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8cHJvY2Vzcy5oPgorI2luY2x1ZGUgPHJ0YXBpLmg+CisKKyNlbGlmIF9fQk9STEFORENfXworCS8vIGJvcmxhbmQgQyBoZWFkZXIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8cHJvY2Vzcy5oPgorCisjZWxpZiBXSU5DRQorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworI2Vsc2UKKwkvLyBNU1ZDIG5lZWRzIHRvIGluY2x1ZGUgd2luZG93cy5oIGF0IGZpcnN0CisJLy8gdGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyIG5lY2Vzc2FyeSBmb3IgZnVuY3Rpb24gcHJvdG90eXBlcyBmb3Igd2FpdGFibGUgdGltZXJzCisjZGVmaW5lIF9XSU4zMl9XSU5ET1dTIDB4MDQwMQorI2RlZmluZSBfV0lOMzJfV0lOTlQgICAweDA0MDAKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8cHJvY2Vzcy5oPgorI2VuZGlmCisKKyNlbmRpZgorCisvLyBkZWZpbmVzIGZvciBtb2R1bGUgaW50ZWdyYXRpb24KKy8vIHBvc3NpYmxlIG90aGVyIGluY2x1ZGUgZmlsZSBuZWVkZWQKKy8vIFRoZXNlIGNvbnN0YW50cyBkZWZpbmVzIG1vZHVsZXMgd2hpY2ggY2FuIGJlIGluY2x1ZGVkIGluIHRoZSBFcGwgYXBwbGljYXRpb24uCisvLyBVc2UgdGhpcyBjb25zdGFudHMgZm9yIGRlZmluZSBFUExfTU9EVUxFX0lOVEVHUkFUSU9OIGluIGZpbGUgRXBsQ2ZnLmguCisjZGVmaW5lIEVQTF9NT0RVTEVfT0JESyAgICAgICAgMHgwMDAwMDAwMUwJLy8gT0JEIGtlcm5lbCBwYXJ0IG1vZHVsZQorI2RlZmluZSBFUExfTU9EVUxFX1BET0sgICAgICAgIDB4MDAwMDAwMDJMCS8vIFBETyBrZXJuZWwgcGFydCBtb2R1bGUKKyNkZWZpbmUgRVBMX01PRFVMRV9OTVRfTU4gICAgICAweDAwMDAwMDA0TAkvLyBOTVQgTU4gbW9kdWxlCisjZGVmaW5lIEVQTF9NT0RVTEVfU0RPUyAgICAgICAgMHgwMDAwMDAwOEwJLy8gU0RPIFNlcnZlciBtb2R1bGUKKyNkZWZpbmUgRVBMX01PRFVMRV9TRE9DICAgICAgICAweDAwMDAwMDEwTAkvLyBTRE8gQ2xpZW50IG1vZHVsZQorI2RlZmluZSBFUExfTU9EVUxFX1NET19BU05EICAgIDB4MDAwMDAwMjBMCS8vIFNETyBvdmVyIEFzbmQgbW9kdWxlCisjZGVmaW5lIEVQTF9NT0RVTEVfU0RPX1VEUCAgICAgMHgwMDAwMDA0MEwJLy8gU0RPIG92ZXIgVURQIG1vZHVsZQorI2RlZmluZSBFUExfTU9EVUxFX1NET19QRE8gICAgIDB4MDAwMDAwODBMCS8vIFNETyBpbiBQRE8gbW9kdWxlCisjZGVmaW5lIEVQTF9NT0RVTEVfTk1UX0NOICAgICAgMHgwMDAwMDEwMEwJLy8gTk1UIENOIG1vZHVsZQorI2RlZmluZSBFUExfTU9EVUxFX05NVFUgICAgICAgIDB4MDAwMDAyMDBMCS8vIE5NVCB1c2VyIHBhcnQgbW9kdWxlCisjZGVmaW5lIEVQTF9NT0RVTEVfTk1USyAgICAgICAgMHgwMDAwMDQwMEwJLy8gTk1UIGtlcm5lbCBwYXJ0IG1vZHVsZQorI2RlZmluZSBFUExfTU9EVUxFX0RMTEsgICAgICAgIDB4MDAwMDA4MDBMCS8vIERMTCBrZXJuZWwgcGFydCBtb2R1bGUKKyNkZWZpbmUgRVBMX01PRFVMRV9ETExVICAgICAgICAweDAwMDAxMDAwTAkvLyBETEwgdXNlciBwYXJ0IG1vZHVsZQorI2RlZmluZSBFUExfTU9EVUxFX09CRFUgICAgICAgIDB4MDAwMDIwMDBMCS8vIE9CRCB1c2VyIHBhcnQgbW9kdWxlCisjZGVmaW5lIEVQTF9NT0RVTEVfQ0ZHTUEgICAgICAgMHgwMDAwNDAwMEwJLy8gQ29uZmlndWFydGlvYW4gTWFuYWdlciBtb2R1bGUKKyNkZWZpbmUgRVBMX01PRFVMRV9WRVRIICAgICAgICAweDAwMDA4MDAwTAkvLyB2aXJ0dWFsIGV0aGVybmV0IGRyaXZlciBtb2R1bGUKKyNkZWZpbmUgRVBMX01PRFVMRV9QRE9VICAgICAgICAweDAwMDEwMDAwTAkvLyBQRE8gdXNlciBwYXJ0IG1vZHVsZQorI2RlZmluZSBFUExfTU9EVUxFX0xFRFUgICAgICAgIDB4MDAwMjAwMDBMCS8vIExFRCB1c2VyIHBhcnQgbW9kdWxlCisKKyNpbmNsdWRlICJFcGxDZmcuaCIJCS8vIEVQTCBjb25maWd1cmF0aW9uIGZpbGUgKGNvbmZpZ3VyYXRpb24gZnJvbSBhcHBsaWNhdGlvbikKKworI2luY2x1ZGUgImdsb2JhbC5oIgkJLy8gZ2xvYmFsIGRlZmluaXRpb25zCisKKyNpbmNsdWRlICJFcGxEZWYuaCIJCS8vIEVQTCBjb25maWd1cmF0aW9uIGZpbGUgKGRlZmF1bHQgY29uZmlndXJhdGlvbikKKyNpbmNsdWRlICJFcGxJbnN0RGVmLmgiCQkvLyBkZWZpbmVzIG1hY3JvcyBmb3IgaW5zdGFuY2UgdHlwZXMgYW5kIHRhYmxlCisjaW5jbHVkZSAiRGVidWcuaCIJCS8vIGRlYnVnIGRlZmluaXRpb25zCisKKyNpbmNsdWRlICJFcGxFcnJEZWYuaCIJCS8vIEVQTCBlcnJvciBjb2RlcyBmb3IgQVBJIGZ1bnRpb25zCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBJRUVFIDE1ODggY29uZm9ybWFudCBuZXQgdGltZSBzdHJ1Y3R1cmUKK3R5cGVkZWYgc3RydWN0IHsKKwlEV09SRCBtX2R3U2VjOworCURXT1JEIG1fZHdOYW5vU2VjOworCit9IHRFcGxOZXRUaW1lOworCisjaW5jbHVkZSAiRXBsVGFyZ2V0LmgiCQkvLyB0YXJnZXQgc3BlY2lmaWMgZnVuY3Rpb25zIGFuZCBkZWZpbml0aW9ucworCisjaW5jbHVkZSAiRXBsQW1pLmgiCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1hY3JvcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEVQTF9TUEVDX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgIDB4MjAJLy8gRVRIRVJORVQgUG93ZXJsaW5rIFYuIDIuMAorI2RlZmluZSBFUExfU1RBQ0tfVkVSU0lPTih2ZXIscmV2LHJlbCkgICAgICAoKCgoRFdPUkQpKHZlcikpICYgMHhGRil8KCgoKERXT1JEKShyZXYpKSYweEZGKTw8OCl8KCgoRFdPUkQpKHJlbCkpPDwxNikpCisjZGVmaW5lIEVQTF9PQkoxMDE4X1ZFUlNJT04odmVyLHJldixyZWwpICAgICgoKChEV09SRCkodmVyKSk8PDE2KSB8KCgoRFdPUkQpKHJldikpJjB4RkZGRikpCisjZGVmaW5lIEVQTF9TVFJJTkdfVkVSU0lPTih2ZXIscmV2LHJlbCkgICAgICJWIiAjdmVyICIuIiAjcmV2ICIgciIgI3JlbAorCisjaW5jbHVkZSAiRXBsVmVyc2lvbi5oIgorCisvLyBkZWZpbmVzIGZvciBFUEwgRmVhdHVyZUZsYWdzCisjZGVmaW5lIEVQTF9GRUFUVVJFX0lTT0NIUiAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEVQTF9GRUFUVVJFX1NET19VRFAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEVQTF9GRUFUVVJFX1NET19BU05EICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEVQTF9GRUFUVVJFX1NET19QRE8gICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEVQTF9GRUFUVVJFX05NVF9JTkZPICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEVQTF9GRUFUVVJFX05NVF9FWFQgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIEVQTF9GRUFUVVJFX1BET19EWU4gICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEVQTF9GRUFUVVJFX05NVF9VRFAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEVQTF9GRUFUVVJFX0NGR01BICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIEVQTF9GRUFUVVJFX0RMTF9NVUxUSVBMRVggICAweDAwMDAwMjAwCisjZGVmaW5lIEVQTF9GRUFUVVJFX05PREVJRF9TVyAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEVQTF9GRUFUVVJFX05NVF9CQVNJQ0VUSCAgICAweDAwMDAwODAwCisjZGVmaW5lIEVQTF9GRUFUVVJFX1JUMSAgICAgICAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIEVQTF9GRUFUVVJFX1JUMiAgICAgICAgICAgICAweDAwMDAyMDAwCisKKy8vIGdlbmVyYXRlIEVQTCBOTVRfRmVhdHVyZUZsYWdzX1UzMgorI2lmbmRlZiBFUExfREVGX0ZFQVRVUkVfSVNPQ0hSCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKyNkZWZpbmUgRVBMX0RFRl9GRUFUVVJFX0lTT0NIUiAgICAgICAgICAoRVBMX0ZFQVRVUkVfSVNPQ0hSKQorI2Vsc2UKKyNkZWZpbmUgRVBMX0RFRl9GRUFUVVJFX0lTT0NIUiAgICAgICAgICAwCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEVQTF9ERUZfRkVBVFVSRV9TRE9fQVNORAorI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPX0FTTkQpKSAhPSAwKQorI2RlZmluZSBFUExfREVGX0ZFQVRVUkVfU0RPX0FTTkQgICAgICAgIChFUExfRkVBVFVSRV9TRE9fQVNORCkKKyNlbHNlCisjZGVmaW5lIEVQTF9ERUZfRkVBVFVSRV9TRE9fQVNORCAgICAgICAgMAorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBFUExfREVGX0ZFQVRVUkVfU0RPX1VEUAorI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPX1VEUCkpICE9IDApCisjZGVmaW5lIEVQTF9ERUZfRkVBVFVSRV9TRE9fVURQICAgICAgICAgKEVQTF9GRUFUVVJFX1NET19VRFApCisjZWxzZQorI2RlZmluZSBFUExfREVGX0ZFQVRVUkVfU0RPX1VEUCAgICAgICAgIDAKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgRVBMX0RFRl9GRUFUVVJFX1NET19QRE8KKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19QRE8pKSAhPSAwKQorI2RlZmluZSBFUExfREVGX0ZFQVRVUkVfU0RPX1BETyAgICAgICAgIChFUExfRkVBVFVSRV9TRE9fUERPKQorI2Vsc2UKKyNkZWZpbmUgRVBMX0RFRl9GRUFUVVJFX1NET19QRE8gICAgICAgICAwCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEVQTF9ERUZfRkVBVFVSRV9QRE9fRFlOCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkKKyNkZWZpbmUgRVBMX0RFRl9GRUFUVVJFX1BET19EWU4gICAgICAgICAoRVBMX0ZFQVRVUkVfUERPX0RZTikKKyNlbHNlCisjZGVmaW5lIEVQTF9ERUZfRkVBVFVSRV9QRE9fRFlOICAgICAgICAgMAorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBFUExfREVGX0ZFQVRVUkVfQ0ZHTUEKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0NGR01BKSkgIT0gMCkKKyNkZWZpbmUgRVBMX0RFRl9GRUFUVVJFX0NGR01BICAgICAgICAgICAoRVBMX0ZFQVRVUkVfQ0ZHTUEpCisjZWxzZQorI2RlZmluZSBFUExfREVGX0ZFQVRVUkVfQ0ZHTUEgICAgICAgICAgIDAKKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgRVBMX0RFRl9GRUFUVVJFX0ZMQUdTICAgICAgICAgICAgICAgICAgIChFUExfREVGX0ZFQVRVUkVfSVNPQ0hSIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVBMX0RFRl9GRUFUVVJFX1NET19BU05EIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVBMX0RFRl9GRUFUVVJFX1NET19VRFAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFUExfREVGX0ZFQVRVUkVfU0RPX1BETyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVQTF9ERUZfRkVBVFVSRV9QRE9fRFlOIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVBMX0RFRl9GRUFUVVJFX0NGR01BKQorCisjaWZuZGVmIHRhYmVudHJpZXMKKyNkZWZpbmUgdGFiZW50cmllcyhhKSAgIChzaXplb2YoYSkvc2l6ZW9mKCooYSkpKQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBkZWZpbml0aW9ucyBmb3IgRExMIGV4cG9ydAorI2lmICgoREVWX1NZU1RFTSA9PSBfREVWX1dJTjMyXykgfHwgKERFVl9TWVNURU0gPT0gX0RFVl9XSU5fQ0VfKSkgJiYgZGVmaW5lZCAoQ09QX0xJQikKKworI2RlZmluZSBFUExETExFWFBPUlQgICAgX19kZWNsc3BlYyAoZGxsZXhwb3J0KQorCisjZWxzZQorCisjZGVmaW5lIEVQTERMTEVYUE9SVAorCisjZW5kaWYKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gY29tbW9uIGRlYnVnIG1hY3JvcworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gZm9yIHVzaW5nIG1hY3JvIERFQlVHX1RSQUNFeCgpCisvLworLy8gRXhhbXBsZToKKy8vICAgICAgREVCVUdfVFJBQ0UxIChFUExfREJHTFZMX09CRCwgIlZhbHVlIGlzICVkXG4iICwgd09iamVjdEluZGV4KTsKKy8vCisvLyBUaGlzIG1lc3NhZ2Ugb25seSB3aWxsIGJlIHByaW50ZWQgaWY6CisvLyAgICAgIC0gTkRFQlVHIGlzIG5vdCBkZWZpbmVkICAgICBBTkQgISEhCisvLyAgICAgIC0gZmxhZyAweDAwMDAwMDA0TCBpcyBzZXQgaW4gREVGX0RFQlVHX0xWTCAoY2FuIGJlIGRlZmluZWQgaW4gY29wY2ZnLmgpCisvLworLy8gZGVmYXVsdCBsZXZlbCBpcyBkZWZpbmVkIGluIGNvcGRlZi5oCisKKy8vIGRlYnVnLWxldmVsIGFuZCBUUkFDRS1tYWNyb3MgICAgICAgICAvLyBzdGFuZGFyZC1sZXZlbCAgIC8vIGZsYWdzIGZvciBERUZfREVCVUdfTFZMCisjZGVmaW5lIEVQTF9EQkdMVkxfRURSViAgICAgICAgICAgICAgICAgREVCVUdfTFZMXzAxCS8vIDB4MDAwMDAwMDFMCisjZGVmaW5lIEVQTF9EQkdMVkxfRURSVl9UUkFDRTAgICAgICAgICAgREVCVUdfTFZMXzAxX1RSQUNFMAorI2RlZmluZSBFUExfREJHTFZMX0VEUlZfVFJBQ0UxICAgICAgICAgIERFQlVHX0xWTF8wMV9UUkFDRTEKKyNkZWZpbmUgRVBMX0RCR0xWTF9FRFJWX1RSQUNFMiAgICAgICAgICBERUJVR19MVkxfMDFfVFJBQ0UyCisjZGVmaW5lIEVQTF9EQkdMVkxfRURSVl9UUkFDRTMgICAgICAgICAgREVCVUdfTFZMXzAxX1RSQUNFMworI2RlZmluZSBFUExfREJHTFZMX0VEUlZfVFJBQ0U0ICAgICAgICAgIERFQlVHX0xWTF8wMV9UUkFDRTQKKworI2RlZmluZSBFUExfREJHTFZMX0RMTCAgICAgICAgICAgICAgICAgIERFQlVHX0xWTF8wMgkvLyAweDAwMDAwMDAyTAorI2RlZmluZSBFUExfREJHTFZMX0RMTF9UUkFDRTAgICAgICAgICAgIERFQlVHX0xWTF8wMl9UUkFDRTAKKyNkZWZpbmUgRVBMX0RCR0xWTF9ETExfVFJBQ0UxICAgICAgICAgICBERUJVR19MVkxfMDJfVFJBQ0UxCisjZGVmaW5lIEVQTF9EQkdMVkxfRExMX1RSQUNFMiAgICAgICAgICAgREVCVUdfTFZMXzAyX1RSQUNFMgorI2RlZmluZSBFUExfREJHTFZMX0RMTF9UUkFDRTMgICAgICAgICAgIERFQlVHX0xWTF8wMl9UUkFDRTMKKyNkZWZpbmUgRVBMX0RCR0xWTF9ETExfVFJBQ0U0ICAgICAgICAgICBERUJVR19MVkxfMDJfVFJBQ0U0CisKKyNkZWZpbmUgRVBMX0RCR0xWTF9PQkQgICAgICAgICAgICAgICAgICBERUJVR19MVkxfMDMJLy8gMHgwMDAwMDAwNEwKKyNkZWZpbmUgRVBMX0RCR0xWTF9PQkRfVFJBQ0UwICAgICAgICAgICBERUJVR19MVkxfMDNfVFJBQ0UwCisjZGVmaW5lIEVQTF9EQkdMVkxfT0JEX1RSQUNFMSAgICAgICAgICAgREVCVUdfTFZMXzAzX1RSQUNFMQorI2RlZmluZSBFUExfREJHTFZMX09CRF9UUkFDRTIgICAgICAgICAgIERFQlVHX0xWTF8wM19UUkFDRTIKKyNkZWZpbmUgRVBMX0RCR0xWTF9PQkRfVFJBQ0UzICAgICAgICAgICBERUJVR19MVkxfMDNfVFJBQ0UzCisjZGVmaW5lIEVQTF9EQkdMVkxfT0JEX1RSQUNFNCAgICAgICAgICAgREVCVUdfTFZMXzAzX1RSQUNFNAorCisjZGVmaW5lIEVQTF9EQkdMVkxfTk1USyAgICAgICAgICAgICAgICAgREVCVUdfTFZMXzA0CS8vIDB4MDAwMDAwMDhMCisjZGVmaW5lIEVQTF9EQkdMVkxfTk1US19UUkFDRTAgICAgICAgICAgREVCVUdfTFZMXzA0X1RSQUNFMAorI2RlZmluZSBFUExfREJHTFZMX05NVEtfVFJBQ0UxICAgICAgICAgIERFQlVHX0xWTF8wNF9UUkFDRTEKKyNkZWZpbmUgRVBMX0RCR0xWTF9OTVRLX1RSQUNFMiAgICAgICAgICBERUJVR19MVkxfMDRfVFJBQ0UyCisjZGVmaW5lIEVQTF9EQkdMVkxfTk1US19UUkFDRTMgICAgICAgICAgREVCVUdfTFZMXzA0X1RSQUNFMworI2RlZmluZSBFUExfREJHTFZMX05NVEtfVFJBQ0U0ICAgICAgICAgIERFQlVHX0xWTF8wNF9UUkFDRTQKKworI2RlZmluZSBFUExfREJHTFZMX05NVENOICAgICAgICAgICAgICAgIERFQlVHX0xWTF8wNQkvLyAweDAwMDAwMDEwTAorI2RlZmluZSBFUExfREJHTFZMX05NVENOX1RSQUNFMCAgICAgICAgIERFQlVHX0xWTF8wNV9UUkFDRTAKKyNkZWZpbmUgRVBMX0RCR0xWTF9OTVRDTl9UUkFDRTEgICAgICAgICBERUJVR19MVkxfMDVfVFJBQ0UxCisjZGVmaW5lIEVQTF9EQkdMVkxfTk1UQ05fVFJBQ0UyICAgICAgICAgREVCVUdfTFZMXzA1X1RSQUNFMgorI2RlZmluZSBFUExfREJHTFZMX05NVENOX1RSQUNFMyAgICAgICAgIERFQlVHX0xWTF8wNV9UUkFDRTMKKyNkZWZpbmUgRVBMX0RCR0xWTF9OTVRDTl9UUkFDRTQgICAgICAgICBERUJVR19MVkxfMDVfVFJBQ0U0CisKKyNkZWZpbmUgRVBMX0RCR0xWTF9OTVRVICAgICAgICAgICAgICAgICBERUJVR19MVkxfMDYJLy8gMHgwMDAwMDAyMEwKKyNkZWZpbmUgRVBMX0RCR0xWTF9OTVRVX1RSQUNFMCAgICAgICAgICBERUJVR19MVkxfMDZfVFJBQ0UwCisjZGVmaW5lIEVQTF9EQkdMVkxfTk1UVV9UUkFDRTEgICAgICAgICAgREVCVUdfTFZMXzA2X1RSQUNFMQorI2RlZmluZSBFUExfREJHTFZMX05NVFVfVFJBQ0UyICAgICAgICAgIERFQlVHX0xWTF8wNl9UUkFDRTIKKyNkZWZpbmUgRVBMX0RCR0xWTF9OTVRVX1RSQUNFMyAgICAgICAgICBERUJVR19MVkxfMDZfVFJBQ0UzCisjZGVmaW5lIEVQTF9EQkdMVkxfTk1UVV9UUkFDRTQgICAgICAgICAgREVCVUdfTFZMXzA2X1RSQUNFNAorCisjZGVmaW5lIEVQTF9EQkdMVkxfTk1UTU4gICAgICAgICAgICAgICAgREVCVUdfTFZMXzA3CS8vIDB4MDAwMDAwNDBMCisjZGVmaW5lIEVQTF9EQkdMVkxfTk1UTU5fVFJBQ0UwICAgICAgICAgREVCVUdfTFZMXzA3X1RSQUNFMAorI2RlZmluZSBFUExfREJHTFZMX05NVE1OX1RSQUNFMSAgICAgICAgIERFQlVHX0xWTF8wN19UUkFDRTEKKyNkZWZpbmUgRVBMX0RCR0xWTF9OTVRNTl9UUkFDRTIgICAgICAgICBERUJVR19MVkxfMDdfVFJBQ0UyCisjZGVmaW5lIEVQTF9EQkdMVkxfTk1UTU5fVFJBQ0UzICAgICAgICAgREVCVUdfTFZMXzA3X1RSQUNFMworI2RlZmluZSBFUExfREJHTFZMX05NVE1OX1RSQUNFNCAgICAgICAgIERFQlVHX0xWTF8wN19UUkFDRTQKKworLy8uLi4KKworI2RlZmluZSBFUExfREJHTFZMX1NETyAgICAgICAgICAgICAgICAgIERFQlVHX0xWTF8yNQkvLyAweDAxMDAwMDAwCisjZGVmaW5lIEVQTF9EQkdMVkxfU0RPX1RSQUNFMCAgICAgICAgICAgREVCVUdfTFZMXzI1X1RSQUNFMAorI2RlZmluZSBFUExfREJHTFZMX1NET19UUkFDRTEgICAgICAgICAgIERFQlVHX0xWTF8yNV9UUkFDRTEKKyNkZWZpbmUgRVBMX0RCR0xWTF9TRE9fVFJBQ0UyICAgICAgICAgICBERUJVR19MVkxfMjVfVFJBQ0UyCisjZGVmaW5lIEVQTF9EQkdMVkxfU0RPX1RSQUNFMyAgICAgICAgICAgREVCVUdfTFZMXzI1X1RSQUNFMworI2RlZmluZSBFUExfREJHTFZMX1NET19UUkFDRTQgICAgICAgICAgIERFQlVHX0xWTF8yNV9UUkFDRTQKKworI2RlZmluZSBFUExfREJHTFZMX1ZFVEggICAgICAgICAgICAgICAgIERFQlVHX0xWTF8yNgkvLyAweDAyMDAwMDAwCisjZGVmaW5lIEVQTF9EQkdMVkxfVkVUSF9UUkFDRTAgICAgICAgICAgREVCVUdfTFZMXzI2X1RSQUNFMAorI2RlZmluZSBFUExfREJHTFZMX1ZFVEhfVFJBQ0UxICAgICAgICAgIERFQlVHX0xWTF8yNl9UUkFDRTEKKyNkZWZpbmUgRVBMX0RCR0xWTF9WRVRIX1RSQUNFMiAgICAgICAgICBERUJVR19MVkxfMjZfVFJBQ0UyCisjZGVmaW5lIEVQTF9EQkdMVkxfVkVUSF9UUkFDRTMgICAgICAgICAgREVCVUdfTFZMXzI2X1RSQUNFMworI2RlZmluZSBFUExfREJHTFZMX1ZFVEhfVFJBQ0U0ICAgICAgICAgIERFQlVHX0xWTF8yNl9UUkFDRTQKKworI2RlZmluZSBFUExfREJHTFZMX0VWRU5USyAgICAgICAgICAgICAgIERFQlVHX0xWTF8yNwkvLyAweDA0MDAwMDAwCisjZGVmaW5lIEVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMCAgICAgICAgREVCVUdfTFZMXzI3X1RSQUNFMAorI2RlZmluZSBFUExfREJHTFZMX0VWRU5US19UUkFDRTEgICAgICAgIERFQlVHX0xWTF8yN19UUkFDRTEKKyNkZWZpbmUgRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UyICAgICAgICBERUJVR19MVkxfMjdfVFJBQ0UyCisjZGVmaW5lIEVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMyAgICAgICAgREVCVUdfTFZMXzI3X1RSQUNFMworI2RlZmluZSBFUExfREJHTFZMX0VWRU5US19UUkFDRTQgICAgICAgIERFQlVHX0xWTF8yN19UUkFDRTQKKworI2RlZmluZSBFUExfREJHTFZMX0VWRU5UVSAgICAgICAgICAgICAgIERFQlVHX0xWTF8yOAkvLyAweDA4MDAwMDAwCisjZGVmaW5lIEVQTF9EQkdMVkxfRVZFTlRVX1RSQUNFMCAgICAgICAgREVCVUdfTFZMXzI4X1RSQUNFMAorI2RlZmluZSBFUExfREJHTFZMX0VWRU5UVV9UUkFDRTEgICAgICAgIERFQlVHX0xWTF8yOF9UUkFDRTEKKyNkZWZpbmUgRVBMX0RCR0xWTF9FVkVOVFVfVFJBQ0UyICAgICAgICBERUJVR19MVkxfMjhfVFJBQ0UyCisjZGVmaW5lIEVQTF9EQkdMVkxfRVZFTlRVX1RSQUNFMyAgICAgICAgREVCVUdfTFZMXzI4X1RSQUNFMworI2RlZmluZSBFUExfREJHTFZMX0VWRU5UVV9UUkFDRTQgICAgICAgIERFQlVHX0xWTF8yOF9UUkFDRTQKKworLy8gU2hhcmVkQnVmZgorI2RlZmluZSBFUExfREJHTFZMX1NIQiAgICAgICAgICAgICAgICAgIERFQlVHX0xWTF8yOQkvLyAweDEwMDAwMDAwCisjZGVmaW5lIEVQTF9EQkdMVkxfU0hCX1RSQUNFMCAgICAgICAgICAgREVCVUdfTFZMXzI5X1RSQUNFMAorI2RlZmluZSBFUExfREJHTFZMX1NIQl9UUkFDRTEgICAgICAgICAgIERFQlVHX0xWTF8yOV9UUkFDRTEKKyNkZWZpbmUgRVBMX0RCR0xWTF9TSEJfVFJBQ0UyICAgICAgICAgICBERUJVR19MVkxfMjlfVFJBQ0UyCisjZGVmaW5lIEVQTF9EQkdMVkxfU0hCX1RSQUNFMyAgICAgICAgICAgREVCVUdfTFZMXzI5X1RSQUNFMworI2RlZmluZSBFUExfREJHTFZMX1NIQl9UUkFDRTQgICAgICAgICAgIERFQlVHX0xWTF8yOV9UUkFDRTQKKworI2RlZmluZSBFUExfREJHTFZMX0FTU0VSVCAgICAgICAgICAgICAgIERFQlVHX0xWTF9BU1NFUlQJLy8gMHgyMDAwMDAwMEwKKyNkZWZpbmUgRVBMX0RCR0xWTF9BU1NFUlRfVFJBQ0UwICAgICAgICBERUJVR19MVkxfQVNTRVJUX1RSQUNFMAorI2RlZmluZSBFUExfREJHTFZMX0FTU0VSVF9UUkFDRTEgICAgICAgIERFQlVHX0xWTF9BU1NFUlRfVFJBQ0UxCisjZGVmaW5lIEVQTF9EQkdMVkxfQVNTRVJUX1RSQUNFMiAgICAgICAgREVCVUdfTFZMX0FTU0VSVF9UUkFDRTIKKyNkZWZpbmUgRVBMX0RCR0xWTF9BU1NFUlRfVFJBQ0UzICAgICAgICBERUJVR19MVkxfQVNTRVJUX1RSQUNFMworI2RlZmluZSBFUExfREJHTFZMX0FTU0VSVF9UUkFDRTQgICAgICAgIERFQlVHX0xWTF9BU1NFUlRfVFJBQ0U0CisKKyNkZWZpbmUgRVBMX0RCR0xWTF9FUlJPUiAgICAgICAgICAgICAgICBERUJVR19MVkxfRVJST1IJLy8gMHg0MDAwMDAwMEwKKyNkZWZpbmUgRVBMX0RCR0xWTF9FUlJPUl9UUkFDRTAgICAgICAgICBERUJVR19MVkxfRVJST1JfVFJBQ0UwCisjZGVmaW5lIEVQTF9EQkdMVkxfRVJST1JfVFJBQ0UxICAgICAgICAgREVCVUdfTFZMX0VSUk9SX1RSQUNFMQorI2RlZmluZSBFUExfREJHTFZMX0VSUk9SX1RSQUNFMiAgICAgICAgIERFQlVHX0xWTF9FUlJPUl9UUkFDRTIKKyNkZWZpbmUgRVBMX0RCR0xWTF9FUlJPUl9UUkFDRTMgICAgICAgICBERUJVR19MVkxfRVJST1JfVFJBQ0UzCisjZGVmaW5lIEVQTF9EQkdMVkxfRVJST1JfVFJBQ0U0ICAgICAgICAgREVCVUdfTFZMX0VSUk9SX1RSQUNFNAorCisjZGVmaW5lIEVQTF9EQkdMVkxfQUxXQVlTICAgICAgICAgICAgICAgREVCVUdfTFZMX0FMV0FZUwkvLyAweDgwMDAwMDAwTAorI2RlZmluZSBFUExfREJHTFZMX0FMV0FZU19UUkFDRTAgICAgICAgIERFQlVHX0xWTF9BTFdBWVNfVFJBQ0UwCisjZGVmaW5lIEVQTF9EQkdMVkxfQUxXQVlTX1RSQUNFMSAgICAgICAgREVCVUdfTFZMX0FMV0FZU19UUkFDRTEKKyNkZWZpbmUgRVBMX0RCR0xWTF9BTFdBWVNfVFJBQ0UyICAgICAgICBERUJVR19MVkxfQUxXQVlTX1RSQUNFMgorI2RlZmluZSBFUExfREJHTFZMX0FMV0FZU19UUkFDRTMgICAgICAgIERFQlVHX0xWTF9BTFdBWVNfVFJBQ0UzCisjZGVmaW5lIEVQTF9EQkdMVkxfQUxXQVlTX1RSQUNFNCAgICAgICAgREVCVUdfTFZMX0FMV0FZU19UUkFDRTQKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMX0lOQ19IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxJbnN0RGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbEluc3REZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWVmYmYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxJbnN0RGVmLmgKQEAgLTAsMCArMSwzNzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBkZWZpbml0aW9ucyBmb3IgZ2VuZXJhdGluZyBpbnN0YW5jZXMKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxJbnN0RGVmLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIC4uLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIHIuZC46IGZpcnN0IGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTElOU1RERUZfSF8KKyNkZWZpbmUgX0VQTElOU1RERUZfSF8KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gdHlwZXMgYW5kIG1hY3JvcyBmb3IgZ2VuZXJhdGluZyBpbnN0YW5jZXMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordHlwZWRlZiBlbnVtIHsKKwlrU3RhdGVVbnVzZWQgPSAwLAorCWtTdGF0ZURlbGV0ZWQgPSAxLAorCWtTdGF0ZVVzZWQgPSAweEZGCit9IHRJbnN0U3RhdGU7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgdm9pZCBNRU0gKnRFcGxQdHJJbnN0YW5jZTsKK3R5cGVkZWYgQllURSB0RXBsSW5zdGFuY2VIZGw7CisKKy8vIGRlZmluZSBjb25zdCBmb3IgaWxsZWdhbGUgdmFsdWVzCisjZGVmaW5lIENDTV9JTExJTlNUQU5DRSAgICAgIE5VTEwKKyNkZWZpbmUgQ0NNX0lMTElOU1RBTkNFX0hETCAgMHhGRgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gaWYgbW9yZSB0aGFuIG9uZSBpbnN0YW5jZSB0aGVuIHVzZSB0aGlzIG1hY3JvcworI2lmIChFUExfTUFYX0lOU1RBTkNFUyA+IDEpCisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gbWFjcm8gZGVmaW5pdGlvbiBmb3IgaW5zdGFuY2UgdGFibGUgZGVmaW5pdGlvbgorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vIG1lbW9yeSBhdHRyaWJ1dGVzIGZvciBpbnN0YW5jZSB0YWJsZQorI2RlZmluZSBJTlNUX05FQVIJCS8vIGZhc3RlciBhY2Nlc3MgdG8gdmFyaWFibGVzCisjZGVmaW5lIElOU1RfRkFSCQkvLyB2YXJpYWJsZXMgd2ljaCBoYXZlIHRvIGxvY2F0ZWQgaW4geGRhdGEKKyNkZWZpbmUgU1RBVElDCQkJLy8gcHJldmVudCB3YXJuaW5ncyBmb3IgdmFyaWFibGVzIHdpdGggc2FtZSBuYW1lCisKKyNkZWZpbmUgSU5TVEFOQ0VfVFlQRV9CRUdJTiAgICAgdHlwZWRlZiBzdHJ1Y3QgeworI2RlZmluZSBJTlNUQU5DRV9UWVBFX0VORCAgICAgICB9IHRFcGxJbnN0YW5jZUluZm87CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gbWFjcm8gZGVmaW5pdGlvbiBmb3IgQVBJIGludGVyZmFjZQorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vIGRlY2xhcmF0aW9uOgorCisgICAgLy8gbWFjcm9zIGZvciBkZWNsYXJhdGlvbiB3aXRoaW4gZnVuY3Rpb24gaGVhZGVyIG9yIHByb3RvdHlwZSBvZiBBUEkgZnVuY3Rpb25zCisjZGVmaW5lIENDTV9ERUNMX0lOU1RBTkNFX0hETCAgICAgICAgICAgICAgICAgICB0RXBsSW5zdGFuY2VIZGwgSW5zdGFuY2VIYW5kbGUKKyNkZWZpbmUgQ0NNX0RFQ0xfSU5TVEFOQ0VfSERMXyAgICAgICAgICAgICAgICAgIHRFcGxJbnN0YW5jZUhkbCBJbnN0YW5jZUhhbmRsZSwKKworICAgIC8vIG1hY3JvcyBmb3IgZGVjbGFyYXRpb24gb2YgcG9pbnRlciB0byBpbnN0YW5jZSBoYW5kbGUgd2l0aGluIGZ1bmN0aW9uIGhlYWRlciBvciBwcm90b3R5cGUgb2YgQVBJIGZ1bmN0aW9ucworI2RlZmluZSBDQ01fREVDTF9QVFJfSU5TVEFOQ0VfSERMICAgICAgICAgICAgICAgdEVwbEluc3RhbmNlSGRsIE1FTSogcEluc3RhbmNlSGFuZGxlCisjZGVmaW5lIENDTV9ERUNMX1BUUl9JTlNUQU5DRV9IRExfICAgICAgICAgICAgICB0RXBsSW5zdGFuY2VIZGwgTUVNKiBwSW5zdGFuY2VIYW5kbGUsCisKKyAgICAvLyBtYWNyb3MgZm9yIGRlY2xhcmF0aW9uIGluc3RhbmNlIGFzIGxva2FjbCB2YXJpYWJsZSB3aXRoaW4gZnVuY3Rpb25zCisjZGVmaW5lIENDTV9ERUNMX0lOU1RBTkNFX1BUUl9MT0NBTCAgICAgICAgICAgICB0Q2NtSW5zdGFuY2VJbmZvIE1FTSogcEluc3RhbmNlOworI2RlZmluZSBDQ01fREVDTF9QVFJfSU5TVEFOQ0VfSERMX0xPQ0FMICAgICAgICAgdEVwbEluc3RhbmNlSGRsICBNRU0qIHBJbnN0YW5jZUhhbmRsZTsKKworICAgIC8vIHJlZmVyZW5jZToKKworICAgIC8vIG1hY3JvcyBmb3IgcmVmZXJlbmNlIG9mIGluc3RhbmNlIGhhbmRsZSBmb3IgZnVuY3Rpb24gcGFyYW1ldGVycworI2RlZmluZSBDQ01fSU5TVEFOQ0VfSERMICAgICAgICAgICAgICAgICAgICAgICAgSW5zdGFuY2VIYW5kbGUKKyNkZWZpbmUgQ0NNX0lOU1RBTkNFX0hETF8gICAgICAgICAgICAgICAgICAgICAgIEluc3RhbmNlSGFuZGxlLAorCisgICAgLy8gbWFjcm9zIGZvciByZWZlcmVuY2Ugb2YgaW5zdGFuY2UgcGFyYW1ldGVyIGZvciBmdW5jdGlvbiBwYXJhbWV0ZXJzCisjZGVmaW5lIENDTV9JTlNUQU5DRV9QQVJBTShwYXIpICAgICAgICAgICAgICAgICBwYXIKKyNkZWZpbmUgQ0NNX0lOU1RBTkNFX1BBUkFNXyhwYXIpICAgICAgICAgICAgICAgIHBhciwKKworICAgIC8vIG1hY3JvcyBmb3IgcmVmZXJlbmNlIG9mIGluc3RhbmNlIHBhcmFtZXRlciBmb3Igd3JpdGluZyBvciByZWFkaW5nIHZhbHVlcworI2RlZmluZSBDQ01fSU5TVF9FTlRSWSAgICAgICAgICAgICAgICAgICAgICAgICAgKCooKHRFcGxQdHJJbnN0YW5jZSlwSW5zdGFuY2UpKQorCisgICAgLy8gcHJvY2Vzc2luZzoKKworICAgIC8vIG1hY3JvcyBmb3IgcHJvY2VzcyBpbnN0YW5jZSBoYW5kbGUKKyNkZWZpbmUgQ0NNX0NIRUNLX0lOU1RBTkNFX0hETCgpICAgICAgICAgICAgICAgIGlmIChJbnN0YW5jZUhhbmRsZSA+PSBFUExfTUFYX0lOU1RBTkNFUykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmV0dXJuIChrRXBsSWxsZWdhbEluc3RhbmNlKTt9CisKKyAgICAvLyBtYWNyb3MgZm9yIHByb2Nlc3MgcG9pbnRlciB0byBpbnN0YW5jZSBoYW5kbGUKKyNkZWZpbmUgQ0NNX0NIRUNLX1BUUl9JTlNUQU5DRV9IREwoKSAgICAgICAgICAgIGlmIChwSW5zdGFuY2VIYW5kbGUgPT0gTlVMTCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmV0dXJuIChrRXBsSW52YWxpZEluc3RhbmNlUGFyYW0pO30KKworICAgIC8vIFRoaXMgbWFjcm8gcmV0dXJuZWQgdGhlIGhhbmRsZSBhbmQgcG9pbnRlciB0byBuZXh0IGZyZWUgaW5zdGFuY2UuCisjZGVmaW5lIENDTV9HRVRfRlJFRV9JTlNUQU5DRV9BTkRfSERMKCkgICAgICAgICBwSW5zdGFuY2UgPSBDY21HZXRGcmVlSW5zdGFuY2VBbmRIYW5kbGUgKHBJbnN0YW5jZUhhbmRsZSk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1NFUlQgKCpwSW5zdGFuY2VIYW5kbGUgIT0gQ0NNX0lMTElOU1RBTkNFX0hETCk7CisKKyNkZWZpbmUgQ0NNX0NIRUNLX0lOU1RBTkNFX1BUUigpICAgICAgICAgICAgICAgIGlmIChwSW5zdGFuY2UgPT0gQ0NNX0lMTElOU1RBTkNFKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtyZXR1cm4gKGtFcGxOb0ZyZWVJbnN0YW5jZSk7fQorCisjZGVmaW5lIENDTV9HRVRfSU5TVEFOQ0VfUFRSKCkgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UgPSBDY21HZXRJbnN0YW5jZVB0ciAoSW5zdGFuY2VIYW5kbGUpOworI2RlZmluZSBDQ01fR0VUX0ZSRUVfSU5TVEFOQ0VfUFRSKCkgICAgICAgICAgICAgcEluc3RhbmNlID0gR2V0RnJlZUluc3RhbmNlICgpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNTRVJUIChwSW5zdGFuY2UgIT0gQ0NNX0lMTElOU1RBTkNFKTsKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBtYWNybyBkZWZpbml0aW9uIGZvciBzdGFjayBpbnRlcmZhY2UKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvLyBtYWNyb3MgZm9yIGRlY2xhcmF0aW9uIHdpdGhpbiB0aGUgZnVuY3Rpb24gaGVhZGVyLCBwcm90b3R5cGUgb3IgbG9jYWwgdmFyIGxpc3QKKyAgICAvLyBEZWNsYXJhdGlvbiBvZiBwb2ludGVycyB3aXRoaW4gZnVuY3Rpb24gcGFyYW1hdGVyIGxpc3QgbXVzdCBkZWZpbmVkIGFzIHZvaWQgTUVNKgorICAgIC8vIHBvaW50ZXIuCisjZGVmaW5lIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFIgICAgICAgICAgICAgICAgICAgdm9pZCBNRU0qIHBJbnN0YW5jZQorI2RlZmluZSBFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXyAgICAgICAgICAgICAgICAgIHZvaWQgTUVNKiBwSW5zdGFuY2UsCisjZGVmaW5lIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfTE9DQUwgICAgICAgICAgICAgdEVwbFB0ckluc3RhbmNlICBwSW5zdGFuY2U7CisKKyAgICAvLyBtYWNyb3MgZm9yIHJlZmVyZW5jZSBvZiBwb2ludGVyIHRvIGluc3RhbmNlCisgICAgLy8gVGhlc2UgbWFjcm9zIGFyZSB1c2VkIGZvciBwYXJhbWV0ZXIgcGFzc2luZyB0byBjYWxsZWQgZnVuY3Rpb24uCisjZGVmaW5lIEVQTF9NQ09fSU5TVEFOQ0VfUFRSICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlCisjZGVmaW5lIEVQTF9NQ09fSU5TVEFOQ0VfUFRSXyAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLAorI2RlZmluZSBFUExfTUNPX0FERFJfSU5TVEFOQ0VfUFRSXyAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UsCisKKyAgICAvLyBtYWNybyBmb3IgYWNjZXNzIG9mIHN0cnVjdCBtZW1iZXJzIG9mIG9uZSBpbnN0YW5jZQorICAgIC8vIEFuIGFjY2VzcyB0byBhIG1lbWJlciBvZiBpbnN0YW5jZSB0YWJsZSBtdXN0IGJlIGNhc3RlZCBieSB0aGUgbG9jYWwKKyAgICAvLyBkZWZpbmVkIHR5cGUgb2YgaW5zdGFuY2UgdGFibGUuCisjZGVmaW5lIEVQTF9NQ09fSU5TVF9FTlRSWSAgICAgICAgICAgICAgICAgICAgICAgICAgKCoodEVwbFB0ckluc3RhbmNlKXBJbnN0YW5jZSkKKyNkZWZpbmUgRVBMX01DT19HTEJfVkFSKHZhcikgICAgICAgICAgICAgICAgICAgICAgICAoKCh0RXBsUHRySW5zdGFuY2UpcEluc3RhbmNlKS0+dmFyKQorCisgICAgLy8gbWFjcm9zIGZvciBwcm9jZXNzIHBvaW50ZXIgdG8gaW5zdGFuY2UKKyNkZWZpbmUgRVBMX01DT19HRVRfSU5TVEFOQ0VfUFRSKCkgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UgPSAodEVwbFB0ckluc3RhbmNlKSBHZXRJbnN0YW5jZVB0ciAoSW5zdGFuY2VIYW5kbGUpOworI2RlZmluZSBFUExfTUNPX0dFVF9GUkVFX0lOU1RBTkNFX1BUUigpICAgICAgICAgICAgIHBJbnN0YW5jZSA9ICh0RXBsUHRySW5zdGFuY2UpIEdldEZyZWVJbnN0YW5jZSAoKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTU0VSVCAocEluc3RhbmNlICE9IENDTV9JTExJTlNUQU5DRSk7CisKKyAgICAvLyBUaGlzIG1hY3JvIHNob3VsZCBiZSB1c2VkIHRvIGNoZWNrIHRoZSBwYXNzZWQgcG9pbnRlciB0byBhbiBwdWJsaWMgZnVuY3Rpb24KKyNkZWZpbmUgRVBMX01DT19DSEVDS19JTlNUQU5DRV9TVEFURSgpICAgICAgICAgICAgICBBU1NFUlQgKHBJbnN0YW5jZSAhPSBOVUxMKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTU0VSVCAoKCh0RXBsUHRySW5zdGFuY2UpcEluc3RhbmNlKS0+bV9JbnN0U3RhdGUgPT0ga1N0YXRlVXNlZCk7CisKKyAgICAvLyBtYWNyb3MgZm9yIGRlY2xhcmF0aW9uIG9mIHBvaW50ZXIgdG8gaW5zdGFuY2UgcG9pbnRlcgorI2RlZmluZSBFUExfTUNPX0RFQ0xfUFRSX0lOU1RBTkNFX1BUUiAgICAgICAgICAgICAgIHZvaWQgTUVNKiAgTUVNKiBwSW5zdGFuY2VQdHIKKyNkZWZpbmUgRVBMX01DT19ERUNMX1BUUl9JTlNUQU5DRV9QVFJfICAgICAgICAgICAgICB2b2lkIE1FTSogIE1FTSogcEluc3RhbmNlUHRyLAorCisgICAgLy8gbWFjcm9zIGZvciByZWZlcmVuY2Ugb2YgcG9pbnRlciB0byBpbnN0YW5jZSBwb2ludGVyCisgICAgLy8gVGhlc2UgbWFjcm9zIGFyZSB1c2VkIGZvciBwYXJhbWV0ZXIgcGFzc2luZyB0byBjYWxsZWQgZnVuY3Rpb24uCisjZGVmaW5lIEVQTF9NQ09fUFRSX0lOU1RBTkNFX1BUUiAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlUHRyCisjZGVmaW5lIEVQTF9NQ09fUFRSX0lOU1RBTkNFX1BUUl8gICAgICAgICAgICAgICAgICAgcEluc3RhbmNlUHRyLAorCisgICAgLy8gbWFjcm9zIGZvciBwcm9jZXNzIHBvaW50ZXIgdG8gaW5zdGFuY2UgcG9pbnRlcgorI2RlZmluZSBFUExfTUNPX0NIRUNLX1BUUl9JTlNUQU5DRV9QVFIoKSAgICAgICAgICAgIEFTU0VSVCAocEluc3RhbmNlUHRyICE9IE5VTEwpOworI2RlZmluZSBFUExfTUNPX1NFVF9QVFJfSU5TVEFOQ0VfUFRSKCkgICAgICAgICAgICAgICgqcEluc3RhbmNlUHRyID0gcEluc3RhbmNlKTsKKworI2RlZmluZSBFUExfTUNPX0lOU1RBTkNFX1BBUkFNKGEpICAgICAgICAgICAgICAgICAgIChhKQorI2RlZmluZSBFUExfTUNPX0lOU1RBTkNFX1BBUkFNXyhhKSAgICAgICAgICAgICAgICAgIChhKSwKKyNkZWZpbmUgRVBMX01DT19JTlNUQU5DRV9QQVJBTV9JRFhfKCkgICAgICAgICAgICAgICBFUExfTUNPX0lOU1RBTkNFX1BBUkFNXyAoRVBMX01DT19HTEJfVkFSIChtX2JJbnN0SW5kZXgpKQorI2RlZmluZSBFUExfTUNPX0lOU1RBTkNFX1BBUkFNX0lEWCgpICAgICAgICAgICAgICAgIEVQTF9NQ09fSU5TVEFOQ0VfUEFSQU0gKEVQTF9NQ09fR0xCX1ZBUiAobV9iSW5zdEluZGV4KSkKKyNkZWZpbmUgRVBMX01DT19XUklURV9JTlNUQU5DRV9TVEFURShhKSAgICAgICAgICAgICBFUExfTUNPX0dMQl9WQVIgKG1fSW5zdFN0YXRlKSA9IGE7CisKKyAgICAvLyB0aGlzIG1hY3JvIGRlbGV0ZXMgYWxsIGluc3RhbmNlIGVudHJpZXMgYXMgdW51c2VkCisjZGVmaW5lIEVQTF9NQ09fREVMRVRFX0lOU1RBTkNFX1RBQkxFKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRFcGxJbnN0YW5jZUluZm8gTUVNKiAgIHBJbnN0YW5jZSAgICAgICA9ICZhRXBsSW5zdGFuY2VUYWJsZV9nWzBdOyBcCisgICAgICAgIHRGYXN0Qnl0ZSAgICAgICAgICAgICAgIEluc3ROdW1iZXIgICAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRGYXN0Qnl0ZSAgICAgICAgICAgICAgIGkgICAgICAgICAgICAgICA9IEVQTF9NQVhfSU5TVEFOQ0VTOyAgICAgICBcCisgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBwSW5zdGFuY2UtPm1fSW5zdFN0YXRlID0gKEJZVEUpIGtTdGF0ZVVudXNlZDsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBwSW5zdGFuY2UtPm1fYkluc3RJbmRleCA9IChCWVRFKSBJbnN0TnVtYmVyOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBwSW5zdGFuY2UrKzsgSW5zdE51bWJlcisrOyBpLS07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gd2hpbGUgKGkgIT0gMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisgICAgLy8gZGVmaW5pdGlvbiBvZiBmdW5jdGlvbnMgd2hpY2ggaGFzIHRvIGJlIGRlZmluZWQgaW4gZWFjaCBtb2R1bGUgb2YgQ0FOb3BlbiBzdGFjaworI2RlZmluZSBFUExfTUNPX0RFRklORV9JTlNUQU5DRV9GQ1QoKSBcCisgICAgICAgIHN0YXRpYyB0RXBsUHRySW5zdGFuY2UgR2V0SW5zdGFuY2VQdHIgKHRFcGxJbnN0YW5jZUhkbCBJbnN0SGFuZGxlX3ApOyAgXAorICAgICAgICBzdGF0aWMgdEVwbFB0ckluc3RhbmNlIEdldEZyZWVJbnN0YW5jZSAodm9pZCk7CisjZGVmaW5lIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9GQ1QoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdGF0aWMgdEVwbFB0ckluc3RhbmNlIEdldEluc3RhbmNlUHRyICh0RXBsSW5zdGFuY2VIZGwgSW5zdEhhbmRsZV9wKSB7IFwKKyAgICAgICAgICAgIHJldHVybiAmYUVwbEluc3RhbmNlVGFibGVfZ1tJbnN0SGFuZGxlX3BdOyB9ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0YXRpYyB0RXBsUHRySW5zdGFuY2UgR2V0RnJlZUluc3RhbmNlICh2b2lkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdEVwbEluc3RhbmNlSW5mbyBNRU0qICAgcEluc3RhbmNlICAgPSAmYUVwbEluc3RhbmNlVGFibGVfZ1swXTsgICAgIFwKKyAgICAgICAgICAgIHRGYXN0Qnl0ZSAgICAgICAgICAgICAgIGkgICAgICAgICAgID0gRVBMX01BWF9JTlNUQU5DRVM7ICAgICAgICAgICBcCisgICAgICAgICAgICBkbyB7IGlmIChwSW5zdGFuY2UtPm1fSW5zdFN0YXRlICE9IGtTdGF0ZVVzZWQpIHsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRFcGxQdHJJbnN0YW5jZSkgcEluc3RhbmNlOyB9ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UrKzsgaS0tOyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB3aGlsZSAoaSAhPSAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIENDTV9JTExJTlNUQU5DRTsgfQorCisgICAgLy8gdGhpcyBtYWNybyBkZWZpbmVzIHRoZSBpbnN0YW5jZSB0YWJsZS4gRWFjaCBlbnRyeSBpcyByZXNlcnZlZCBmb3IgYW4gaW5zdGFuY2Ugb2YgQ0FOb3Blbi4KKyNkZWZpbmUgRVBMX01DT19ERUNMX0lOU1RBTkNFX1ZBUigpIFwKKyAgICAgICAgc3RhdGljIHRFcGxJbnN0YW5jZUluZm8gTUVNIGFFcGxJbnN0YW5jZVRhYmxlX2cgW0VQTF9NQVhfSU5TVEFOQ0VTXTsKKworICAgIC8vIHRoaXMgbWFjcm8gZGVmaW5lcyBtZW1iZXIgdmFyaWFibGVzIGluIGluc3RhbmNlIHRhYmxlIHdoaWNoIGFyZSBuZWVkZWQgaW4KKyAgICAvLyBhbGwgbW9kdWxlcyBvZiBFcGwgc3RhY2sKKyNkZWZpbmUgRVBMX01DT19ERUNMX0lOU1RBTkNFX01FTUJFUigpIFwKKyAgICAgICAgU1RBVElDICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fSW5zdFN0YXRlOyBcCisgICAgICAgIFNUQVRJQyAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JJbnN0SW5kZXg7CisKKyNkZWZpbmUgRVBMX01DT19JTlNUQU5DRV9QQVJBTV9JRFhfKCkgICAgICAgICAgIEVQTF9NQ09fSU5TVEFOQ0VfUEFSQU1fIChFUExfTUNPX0dMQl9WQVIgKG1fYkluc3RJbmRleCkpCisjZGVmaW5lIEVQTF9NQ09fSU5TVEFOQ0VfUEFSQU1fSURYKCkgICAgICAgICAgICBFUExfTUNPX0lOU1RBTkNFX1BBUkFNIChFUExfTUNPX0dMQl9WQVIgKG1fYkluc3RJbmRleCkpCisKKyNlbHNlIC8vIG9ubHkgb25lIGluc3RhbmNlIGlzIHVzZWQKKworICAgIC8vIE1lbW9yeSBhdHRyaWJ1dGVzIGZvciBpbnN0YW5jZSB0YWJsZS4KKyNkZWZpbmUgSU5TVF9ORUFSICAgTkVBUgkvLyBmYXN0ZXIgYWNjZXNzIHRvIHZhcmlhYmxlcworI2RlZmluZSBJTlNUX0ZBUiAgICBNRU0JCS8vIHZhcmlhYmxlcyB3aWNoIGhhdmUgdG8gbG9jYXRlZCBpbiB4ZGF0YQorI2RlZmluZSBTVEFUSUMgICAgICBzdGF0aWMJLy8gcHJldmVudCB3YXJuaW5ncyBmb3IgdmFyaWFibGVzIHdpdGggc2FtZSBuYW1lCisKKyNkZWZpbmUgSU5TVEFOQ0VfVFlQRV9CRUdJTgorI2RlZmluZSBJTlNUQU5DRV9UWVBFX0VORAorCisvLyBtYWNyb3MgZm9yIGRlY2xhcmF0aW9uLCBpbml0aWFsaXppbmcgYW5kIG1lbWJlciBhY2Nlc3MgZm9yIGluc3RhbmNlIGhhbmRsZQorLy8gVGhpcyBjbGFzcyBvZiBtYWNyb3MgYXJlIHVzZWQgYnkgQVBJIGZ1bmN0aW9uIHRvIGluZm9ybSBDQ00tbW9kdWwgd2hpY2gKKy8vIGluc3RhbmNlIGlzIHRvIGJlIHVzZWQuCisKKyAgICAvLyBtYWNyb3MgZm9yIHJlZmVyZW5jZSBvZiBpbnN0YW5jZSBoYW5kbGUKKyAgICAvLyBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgZm9yIHBhcmFtZXRlciBwYXNzaW5nIHRvIENBTm9wZW4gQVBJIGZ1bmN0aW9uLgorI2RlZmluZSBDQ01fSU5TVEFOQ0VfSERMCisjZGVmaW5lIENDTV9JTlNUQU5DRV9IRExfCisKKyNkZWZpbmUgQ0NNX0RFQ0xfSU5TVEFOQ0VfUFRSX0xPQ0FMCisKKyAgICAvLyBtYWNyb3MgZm9yIGRlY2xhcmF0aW9uIHdpdGhpbiB0aGUgZnVuY3Rpb24gaGVhZGVyIG9yIHByb3RvdHlwZQorI2RlZmluZSBDQ01fREVDTF9JTlNUQU5DRV9IREwgICAgICAgICAgICAgICAgICAgdm9pZAorI2RlZmluZSBDQ01fREVDTF9JTlNUQU5DRV9IRExfCisKKyAgICAvLyBtYWNyb3MgZm9yIHByb2Nlc3MgaW5zdGFuY2UgaGFuZGxlCisjZGVmaW5lIENDTV9DSEVDS19JTlNUQU5DRV9IREwoKQorCisgICAgLy8gbWFjcm9zIGZvciBkZWNsYXJhdGlvbiBvZiBwb2ludGVyIHRvIGluc3RhbmNlIGhhbmRsZQorI2RlZmluZSBDQ01fREVDTF9QVFJfSU5TVEFOQ0VfSERMICAgICAgICAgICAgICAgdm9pZAorI2RlZmluZSBDQ01fREVDTF9QVFJfSU5TVEFOQ0VfSERMXworCisgICAgLy8gbWFjcm9zIGZvciBwcm9jZXNzIHBvaW50ZXIgdG8gaW5zdGFuY2UgaGFuZGxlCisjZGVmaW5lIENDTV9DSEVDS19QVFJfSU5TVEFOQ0VfSERMKCkKKworICAgIC8vIFRoaXMgbWFjcm8gcmV0dXJuZWQgdGhlIGhhbmRsZSBhbmQgcG9pbnRlciB0byBuZXh0IGZyZWUgaW5zdGFuY2UuCisjZGVmaW5lIENDTV9HRVRfRlJFRV9JTlNUQU5DRV9BTkRfSERMKCkKKworI2RlZmluZSBDQ01fQ0hFQ0tfSU5TVEFOQ0VfUFRSKCkKKworI2RlZmluZSBDQ01fR0VUX0lOU1RBTkNFX1BUUigpCisjZGVmaW5lIENDTV9HRVRfRlJFRV9JTlNUQU5DRV9QVFIoKQorCisjZGVmaW5lIENDTV9JTlNUQU5DRV9QQVJBTShwYXIpCisjZGVmaW5lIENDTV9JTlNUQU5DRV9QQVJBTV8ocGFyKQorCisjZGVmaW5lIENDTV9JTlNUX0VOVFJZICAgICAgICAgICAgICAgICAgICAgICAgICBhQ2NtSW5zdGFuY2VUYWJsZV9nWzBdCisKKy8vIG1hY3JvcyBmb3IgZGVjbGFyYXRpb24sIGluaXRpYWxpemluZyBhbmQgbWVtYmVyIGFjY2VzcyBmb3IgaW5zdGFuY2UgcG9pbnRlcgorLy8gVGhpcyBjbGFzcyBvZiBtYWNyb3MgYXJlIHVzZWQgYnkgQ0FOb3BlbiBpbnRlcm5hbCBmdW5jdGlvbiB0byBwb2ludCB0byBvbmUgaW5zdGFuY2UuCisKKyAgICAvLyBtYWNyb3MgZm9yIGRlY2xhcmF0aW9uIHdpdGhpbiB0aGUgZnVuY3Rpb24gaGVhZGVyLCBwcm90b3R5cGUgb3IgbG9jYWwgdmFyIGxpc3QKKyNkZWZpbmUgRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUiAgICAgICAgICAgICAgICAgICB2b2lkCisjZGVmaW5lIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisjZGVmaW5lIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfTE9DQUwKKworICAgIC8vIG1hY3JvcyBmb3IgcmVmZXJlbmNlIG9mIHBvaW50ZXIgdG8gaW5zdGFuY2UKKyAgICAvLyBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgZm9yIHBhcmFtZXRlciBwYXNzaW5nIHRvIGNhbGxlZCBmdW5jdGlvbi4KKyNkZWZpbmUgRVBMX01DT19JTlNUQU5DRV9QVFIKKyNkZWZpbmUgRVBMX01DT19JTlNUQU5DRV9QVFJfCisjZGVmaW5lIEVQTF9NQ09fQUREUl9JTlNUQU5DRV9QVFJfCisKKyAgICAvLyBtYWNyb3MgZm9yIHByb2Nlc3MgcG9pbnRlciB0byBpbnN0YW5jZQorI2RlZmluZSBFUExfTUNPX0dFVF9JTlNUQU5DRV9QVFIoKQorI2RlZmluZSBFUExfTUNPX0dFVF9GUkVFX0lOU1RBTkNFX1BUUigpCisKKyAgICAvLyBUaGlzIG1hY3JvIHNob3VsZCBiZSB1c2VkIHRvIGNoZWNrIHRoZSBwYXNzZWQgcG9pbnRlciB0byBhbiBwdWJsaWMgZnVuY3Rpb24KKyNkZWZpbmUgRVBMX01DT19DSEVDS19JTlNUQU5DRV9TVEFURSgpCisKKyAgICAvLyBtYWNyb3MgZm9yIGRlY2xhcmF0aW9uIG9mIHBvaW50ZXIgdG8gaW5zdGFuY2UgcG9pbnRlcgorI2RlZmluZSBFUExfTUNPX0RFQ0xfUFRSX0lOU1RBTkNFX1BUUiAgICAgICAgICAgICAgIHZvaWQKKyNkZWZpbmUgRVBMX01DT19ERUNMX1BUUl9JTlNUQU5DRV9QVFJfCisKKyAgICAvLyBtYWNyb3MgZm9yIHJlZmVyZW5jZSBvZiBwb2ludGVyIHRvIGluc3RhbmNlIHBvaW50ZXIKKyAgICAvLyBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgZm9yIHBhcmFtZXRlciBwYXNzaW5nIHRvIGNhbGxlZCBmdW5jdGlvbi4KKyNkZWZpbmUgRVBMX01DT19QVFJfSU5TVEFOQ0VfUFRSCisjZGVmaW5lIEVQTF9NQ09fUFRSX0lOU1RBTkNFX1BUUl8KKworICAgIC8vIG1hY3JvcyBmb3IgcHJvY2VzcyBwb2ludGVyIHRvIGluc3RhbmNlIHBvaW50ZXIKKyNkZWZpbmUgRVBMX01DT19DSEVDS19QVFJfSU5TVEFOQ0VfUFRSKCkKKyNkZWZpbmUgRVBMX01DT19TRVRfUFRSX0lOU1RBTkNFX1BUUigpCisKKyNkZWZpbmUgRVBMX01DT19JTlNUQU5DRV9QQVJBTShhKQorI2RlZmluZSBFUExfTUNPX0lOU1RBTkNFX1BBUkFNXyhhKQorI2RlZmluZSBFUExfTUNPX0lOU1RBTkNFX1BBUkFNX0lEWF8oKQorI2RlZmluZSBFUExfTUNPX0lOU1RBTkNFX1BBUkFNX0lEWCgpCisKKyAgICAvLyBtYWNybyBmb3IgYWNjZXNzIG9mIHN0cnVjdCBtZW1iZXJzIG9mIG9uZSBpbnN0YW5jZQorI2RlZmluZSBFUExfTUNPX0lOU1RfRU5UUlkgICAgICAgICAgICAgICAgICAgICAgICAgIGFFcGxJbnN0YW5jZVRhYmxlX2dbMF0KKyNkZWZpbmUgRVBMX01DT19HTEJfVkFSKHZhcikgICAgICAgICAgICAgICAgICAgICAgICAodmFyKQorI2RlZmluZSBFUExfTUNPX1dSSVRFX0lOU1RBTkNFX1NUQVRFKGEpCisKKyAgICAvLyB0aGlzIG1hY3JvIGRlbGV0ZXMgYWxsIGluc3RhbmNlIGVudHJpZXMgYXMgdW51c2VkCisjZGVmaW5lIEVQTF9NQ09fREVMRVRFX0lOU1RBTkNFX1RBQkxFKCkKKworICAgIC8vIGRlZmluaXRpb24gb2YgZnVuY3Rpb25zIHdoaWNoIGhhcyB0byBiZSBkZWZpbmVkIGluIGVhY2ggbW9kdWxlIG9mIENBTm9wZW4gc3RhY2sKKyNkZWZpbmUgRVBMX01DT19ERUZJTkVfSU5TVEFOQ0VfRkNUKCkKKyNkZWZpbmUgRVBMX01DT19ERUNMX0lOU1RBTkNFX0ZDVCgpCisKKyAgICAvLyB0aGlzIG1hY3JvIGRlZmluZXMgdGhlIGluc3RhbmNlIHRhYmxlLiBFYWNoIGVudHJ5IGlzIHJlc2VydmVkIGZvciBhbiBpbnN0YW5jZSBvZiBDQU5vcGVuLgorI2RlZmluZSBFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfVkFSKCkKKworICAgIC8vIHRoaXMgbWFjcm8gZGVmaW5lcyBtZW1iZXIgdmFyaWFibGVzIGluIGluc3RhbmNlIHRhYmxlIHdoaWNoIGFyZSBuZWVkZWQgaW4KKyAgICAvLyBhbGwgbW9kdWxlcyBvZiBDQU5vcGVuIHN0YWNrCisjZGVmaW5lIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9NRU1CRVIoKQorCisjZW5kaWYKKworLyoKKyNpZiAoQ0RSVl9NQVhfSU5TVEFOQ0VTID4gMSkKKworICAgICNkZWZpbmUgQ0RSVl9SRUVOVFJBTlQgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRU5UUkFOVAorCisjZWxzZQorCisgICAgI2RlZmluZSBDRFJWX1JFRU5UUkFOVAorCisjZW5kaWYKKyovCisKKyNlbmRpZiAvLyBfRVBMSU5TVERFRl9IXworCisvLyBEaWUgbGV0enRlIFplaWxlIG113yB1bmJlZGluZ3QgZWluZSBsZWVyZSBaZWlsZSBzZWluLCB3ZWlsIG1hbmNoZSBDb21waWxlcgorLy8gZGFtaXQgZWluIFByb2JsZW0gaGFiZW4sIHdlbm4gZGFzIG5pY2h0IHNvIGlzdCAoei5CLiBHTlUgb2RlciBCb3JsYW5kIEMrKyBCdWlsZGVyKS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsTGVkLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbExlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMjlhZWQzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxMZWQuaApAQCAtMCwwICsxLDkyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBzdGF0dXMgYW5kIGVycm9yIExFRAorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbExlZC5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4xICQgICREYXRlOiAyMDA4LzExLzE3IDE2OjQwOjM5ICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDgvMTEvMTcgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRVBMTEVEX0hfCisjZGVmaW5lIF9FUExMRURfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIGVudW0geworCWtFcGxMZWRUeXBlU3RhdHVzID0gMHgwMCwKKwlrRXBsTGVkVHlwZUVycm9yID0gMHgwMSwKKworfSB0RXBsTGVkVHlwZTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExMRURfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsTm10LmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE5tdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMTFlNWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE5tdC5oCkBAIC0wLDAgKzEsMjMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgZ2xvYmFsIGluY2x1ZGUgZmlsZSBmb3IgRVBMLU5NVC1Nb2R1bGVzCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsTm10LmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDgvMTEvMTcgMTY6NDA6MzkgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8wOSBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExOTVRfSF8KKyNkZWZpbmUgX0VQTE5NVF9IXworCisjaW5jbHVkZSAiRXBsSW5jLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBkZWZpbmUgc3VwZXItc3RhdGVzIGFuZCBtYXNrcyB0byBpZGVudGlmeSBhIHN1cGVyLXN0YXRlCisjZGVmaW5lIEVQTF9OTVRfR1NfUE9XRVJFRCAgICAgICAgICAweDAwMDgJLy8gc3VwZXIgc3RhdGUKKyNkZWZpbmUgRVBMX05NVF9HU19JTklUSUFMSVNBVElPTiAgIDB4MDAwOQkvLyBzdXBlciBzdGF0ZQorI2RlZmluZSBFUExfTk1UX0dTX0NPTU1VTklDQVRJTkcgICAgMHgwMDBDCS8vIHN1cGVyIHN0YXRlCisjZGVmaW5lIEVQTF9OTVRfQ1NfRVBMTU9ERSAgICAgICAgICAweDAwMEQJLy8gc3VwZXIgc3RhdGUKKyNkZWZpbmUgRVBMX05NVF9NU19FUExNT0RFICAgICAgICAgIDB4MDAwRAkvLyBzdXBlciBzdGF0ZQorCisjZGVmaW5lIEVQTF9OTVRfU1VQRVJTVEFURV9NQVNLICAgICAweDAwMEYJLy8gbWFzayB0byBzZWxlY3Qgc3RhdGUKKworI2RlZmluZSBFUExfTk1UX1RZUEVfVU5ERUZJTkVEICAgICAgMHgwMDAwCS8vIHR5cGUgb2YgTk1UIHN0YXRlIGlzIHN0aWxsIHVuZGVmaW5lZAorI2RlZmluZSBFUExfTk1UX1RZUEVfQ1MgICAgICAgICAgICAgMHgwMTAwCS8vIENTIHR5cGUgb2YgTk1UIHN0YXRlCisjZGVmaW5lIEVQTF9OTVRfVFlQRV9NUyAgICAgICAgICAgICAweDAyMDAJLy8gTVMgdHlwZSBvZiBOTVQgc3RhdGUKKyNkZWZpbmUgRVBMX05NVF9UWVBFX01BU0sgICAgICAgICAgIDB4MDMwMAkvLyBtYXNrIHRvIHNlbGVjdCB0eXBlIG9mIE5NVCBzdGF0ZSAoaS5lLiBDUyBvciBNUykKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIHRoZSBsb3dlciBCeXRlIG9mIHRoZSBOTVQtU3RhdGUgaXMgZW5jb2RlZAorLy8gbGlrZSB0aGUgdmFsdWVzIGluIHRoZSBFUEwtU3RhbmRhcmQKKy8vIHRoZSBoaWdoZXIgYnl0ZSBpcyB1c2VkIHRvIGVuY29kZSBNTgorLy8gKEJpdCAxIG9mIHRoZSBoaWdoZXIgYnl0ZSA9IDEpIG9yIENOIChCaXQgMCBvZiB0aGUKKy8vIGhpZ2hlciBieXRlICA9IDEpCisvLyB0aGUgc3VwZXItc3RhdGVzIGFyZSBub3QgbWVudGlvbmVkIGluIHRoaXMKKy8vIGVudW0gYmVjYXVzZSB0aGV5IGFyZSBubyByZWFsIHN0YXRlcworLy8gLS0+IHRoZXJlIGFyZSBtYXNrcyBkZWZpbmVkIHRvIGluZGVudGlmeSB0aGUKKy8vIHN1cGVyLXN0YXRlcworCit0eXBlZGVmIGVudW0geworCWtFcGxObXRHc09mZiA9IDB4MDAwMCwKKwlrRXBsTm10R3NJbml0aWFsaXNpbmcgPSAweDAwMTksCisJa0VwbE5tdEdzUmVzZXRBcHBsaWNhdGlvbiA9IDB4MDAyOSwKKwlrRXBsTm10R3NSZXNldENvbW11bmljYXRpb24gPSAweDAwMzksCisJa0VwbE5tdEdzUmVzZXRDb25maWd1cmF0aW9uID0gMHgwMDc5LAorCWtFcGxObXRDc05vdEFjdGl2ZSA9IDB4MDExQywKKwlrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDEgPSAweDAxMUQsCisJa0VwbE5tdENzU3RvcHBlZCA9IDB4MDE0RCwKKwlrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDIgPSAweDAxNUQsCisJa0VwbE5tdENzUmVhZHlUb09wZXJhdGUgPSAweDAxNkQsCisJa0VwbE5tdENzT3BlcmF0aW9uYWwgPSAweDAxRkQsCisJa0VwbE5tdENzQmFzaWNFdGhlcm5ldCA9IDB4MDExRSwKKwlrRXBsTm10TXNOb3RBY3RpdmUgPSAweDAyMUMsCisJa0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwxID0gMHgwMjFELAorCWtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMiA9IDB4MDI1RCwKKwlrRXBsTm10TXNSZWFkeVRvT3BlcmF0ZSA9IDB4MDI2RCwKKwlrRXBsTm10TXNPcGVyYXRpb25hbCA9IDB4MDJGRCwKKwlrRXBsTm10TXNCYXNpY0V0aGVybmV0ID0gMHgwMjFFCit9IHRFcGxObXRTdGF0ZTsKKworLy8gTk1ULWV2ZW50cwordHlwZWRlZiBlbnVtIHsKKwkvLyBFdmVudHMgZnJvbSBETEwKKwkvLyBFdmVudHMgZGVmaW5lZCBieSBFUEwgVjIgc3BlY2lmaWNhdGlvbgorCWtFcGxObXRFdmVudE5vRXZlbnQgPSAweDAwLAorLy8gICAga0VwbE5tdEV2ZW50RGxsTWVQcmVzICAgICAgICAgICA9ICAgMHgwMSwKKwlrRXBsTm10RXZlbnREbGxNZVByZXNUaW1lb3V0ID0gMHgwMiwKKy8vICAgIGtFcGxObXRFdmVudERsbE1lQXNuZCAgICAgICAgICAgPSAgIDB4MDMsCisvLyAgICBrRXBsTm10RXZlbnREbGxNZUFzbmRUaW1lb3V0ICAgID0gICAweDA0LAorCWtFcGxObXRFdmVudERsbE1lU29hU2VudCA9IDB4MDQsCisJa0VwbE5tdEV2ZW50RGxsTWVTb2NUcmlnID0gMHgwNSwKKwlrRXBsTm10RXZlbnREbGxNZVNvYVRyaWcgPSAweDA2LAorCWtFcGxObXRFdmVudERsbENlU29jID0gMHgwNywKKwlrRXBsTm10RXZlbnREbGxDZVByZXEgPSAweDA4LAorCWtFcGxObXRFdmVudERsbENlUHJlcyA9IDB4MDksCisJa0VwbE5tdEV2ZW50RGxsQ2VTb2EgPSAweDBBLAorCWtFcGxObXRFdmVudERsbENlQXNuZCA9IDB4MEIsCisJa0VwbE5tdEV2ZW50RGxsQ2VGcmFtZVRpbWVvdXQgPSAweDBDLAorCisJLy8gRXZlbnRzIHRyaWdnZXJlZCBieSBOTVQtQ29tbWFuZHMKKwlrRXBsTm10RXZlbnRTd1Jlc2V0ID0gMHgxMCwJLy8gTk1UX0dUMSwgTk1UX0dUMiwgTk1UX0dUOAorCWtFcGxObXRFdmVudFJlc2V0Tm9kZSA9IDB4MTEsCisJa0VwbE5tdEV2ZW50UmVzZXRDb20gPSAweDEyLAorCWtFcGxObXRFdmVudFJlc2V0Q29uZmlnID0gMHgxMywKKwlrRXBsTm10RXZlbnRFbnRlclByZU9wZXJhdGlvbmFsMiA9IDB4MTQsCisJa0VwbE5tdEV2ZW50RW5hYmxlUmVhZHlUb09wZXJhdGUgPSAweDE1LAorCWtFcGxObXRFdmVudFN0YXJ0Tm9kZSA9IDB4MTYsCS8vIE5NVF9DVDcKKwlrRXBsTm10RXZlbnRTdG9wTm9kZSA9IDB4MTcsCisKKwkvLyBFdmVudHMgdHJpZ2dlcmVkIGJ5IGhpZ2hlciBsYXllcgorCWtFcGxObXRFdmVudEVudGVyUmVzZXRBcHAgPSAweDIwLAorCWtFcGxObXRFdmVudEVudGVyUmVzZXRDb20gPSAweDIxLAorCWtFcGxObXRFdmVudEludGVybkNvbUVycm9yID0gMHgyMiwJLy8gTk1UX0dUNiwgaW50ZXJuYWwgY29tbXVuaWNhdGlvbiBlcnJvciAtPiBlbnRlciBSZXNldENvbW11bmljYXRpb24KKwlrRXBsTm10RXZlbnRFbnRlclJlc2V0Q29uZmlnID0gMHgyMywKKwlrRXBsTm10RXZlbnRFbnRlckNzTm90QWN0aXZlID0gMHgyNCwKKwlrRXBsTm10RXZlbnRFbnRlck1zTm90QWN0aXZlID0gMHgyNSwKKwlrRXBsTm10RXZlbnRUaW1lckJhc2ljRXRoZXJuZXQgPSAweDI2LAkvLyBOTVRfQ1QzOyB0aW1lciB0cmlnZ2VyZWQgc3RhdGUgY2hhbmdlIChOb3RBY3RpdmUgLT4gQmFzaWNFdGgpCisJa0VwbE5tdEV2ZW50VGltZXJNc1ByZU9wMSA9IDB4MjcsCS8vIGVudGVyIFByZU9wMSBvbiBNTiAoTm90QWN0aXZlIC0+IE1zUHJlT3AxKQorCWtFcGxObXRFdmVudE5tdEN5Y2xlRXJyb3IgPSAweDI4LAkvLyBOTVRfQ1QxMSwgTk1UX01UNjsgZXJyb3IgZHVyaW5nIGN5Y2xlIC0+IGVudGVyIFByZU9wMQorCWtFcGxObXRFdmVudFRpbWVyTXNQcmVPcDIgPSAweDI5LAkvLyBlbnRlciBQcmVPcDIgb24gTU4gKE1zUHJlT3AxIC0+IE1zUHJlT3AyIGlmIGtFcGxObXRFdmVudEFsbE1hbmRhdG9yeUNOSWRlbnQpCisJa0VwbE5tdEV2ZW50QWxsTWFuZGF0b3J5Q05JZGVudCA9IDB4MkEsCS8vIGVudGVyIFByZU9wMiBvbiBNTiBpZiBrRXBsTm10RXZlbnRUaW1lck1zUHJlT3AyCisJa0VwbE5tdEV2ZW50RW50ZXJSZWFkeVRvT3BlcmF0ZSA9IDB4MkIsCS8vIGFwcGxpY2F0aW9uIHJlYWR5IGZvciB0aGUgc3RhdGUgUmVhZHlUb09wCisJa0VwbE5tdEV2ZW50RW50ZXJNc09wZXJhdGlvbmFsID0gMHgyQywJLy8gZW50ZXIgT3BlcmF0aW9uYWwgb24gTU4KKwlrRXBsTm10RXZlbnRTd2l0Y2hPZmYgPSAweDJELAkvLyBlbnRlciBzdGF0ZSBPZmYKKwlrRXBsTm10RXZlbnRDcml0aWNhbEVycm9yID0gMHgyRSwJLy8gZW50ZXIgc3RhdGUgT2ZmIGJlY2F1c2Ugb2YgY3JpdGljYWwgZXJyb3IKKworfSB0RXBsTm10RXZlbnQ7CisKKy8vIHR5cGUgZm9yIGFyZ3VtZW50IG9mIGV2ZW50IGtFcGxFdmVudFR5cGVObXRTdGF0ZUNoYW5nZQordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxObXRTdGF0ZSBtX05ld05tdFN0YXRlOworCXRFcGxObXRFdmVudCBtX05tdEV2ZW50OworCit9IHRFcGxFdmVudE5tdFN0YXRlQ2hhbmdlOworCisvLyBzdHJ1Y3R1cmUgZm9yIGtFcGxFdmVudFR5cGVIZWFydGJlYXQKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgbV91aU5vZGVJZDsJLy8gTm9kZUlkCisJdEVwbE5tdFN0YXRlIG1fTm10U3RhdGU7CS8vIE5NVCBzdGF0ZSAocmVtZW1iZXIgZGlzdGluZ3Vpc2ggYmV0d2VlbiBNTiAvIENOKQorCVdPUkQgbV93RXJyb3JDb2RlOwkvLyBFUEwgZXJyb3IgY29kZSBpbiBjYXNlIG9mIE5NVCBzdGF0ZSBOb3RBY3RpdmUKKworfSB0RXBsSGVhcnRiZWF0RXZlbnQ7CisKK3R5cGVkZWYgZW51bSB7CisJa0VwbE5tdE5vZGVFdmVudEZvdW5kID0gMHgwMCwKKwlrRXBsTm10Tm9kZUV2ZW50VXBkYXRlU3cgPSAweDAxLAkvLyBhcHBsaWNhdGlvbiBzaGFsbCB1cGRhdGUgc29mdHdhcmUgb24gQ04KKwlrRXBsTm10Tm9kZUV2ZW50Q2hlY2tDb25mID0gMHgwMiwJLy8gYXBwbGljYXRpb24gLyBDb25maWd1cmF0aW9uIE1hbmFnZXIgc2hhbGwgY2hlY2sgYW5kIHVwZGF0ZSBjb25maWd1cmF0aW9uIG9uIENOCisJa0VwbE5tdE5vZGVFdmVudFVwZGF0ZUNvbmYgPSAweDAzLAkvLyBhcHBsaWNhdGlvbiAvIENvbmZpZ3VyYXRpb24gTWFuYWdlciBzaGFsbCB1cGRhdGUgY29uZmlndXJhdGlvbiBvbiBDTiAoY2hlY2sgd2FzIGRvbmUgYnkgTm10TW4gbW9kdWxlKQorCWtFcGxObXROb2RlRXZlbnRWZXJpZnlDb25mID0gMHgwNCwJLy8gYXBwbGljYXRpb24gLyBDb25maWd1cmF0aW9uIE1hbmFnZXIgc2hhbGwgdmVyaWZ5IGNvbmZpZ3VyYXRpb24gb2YgQ04KKwlrRXBsTm10Tm9kZUV2ZW50UmVhZHlUb1N0YXJ0ID0gMHgwNSwJLy8gaXNzdWVkIGlmIEVQTF9OTVRTVF9OT19TVEFSVE5PREUgc2V0CisJLy8gYXBwbGljYXRpb24gbXVzdCBjYWxsIEVwbE5tdE1udVNlbmRObXRDb21tYW5kKGtFcGxObXRDbWRTdGFydE5vZGUpIG1hbnVhbGx5CisJa0VwbE5tdE5vZGVFdmVudE5tdFN0YXRlID0gMHgwNiwKKwlrRXBsTm10Tm9kZUV2ZW50RXJyb3IgPSAweDA3LAkvLyBOTVQgZXJyb3Igb2YgQ04KKworfSB0RXBsTm10Tm9kZUV2ZW50OworCit0eXBlZGVmIGVudW0geworCWtFcGxObXROb2RlQ29tbWFuZEJvb3QgPSAweDAxLAkvLyBpZiBFUExfTk9ERUFTU0lHTl9TVEFSVF9DTiBub3Qgc2V0IGl0IG11c3QgYmUgaXNzdWVkIGFmdGVyIGtFcGxObXROb2RlRXZlbnRGb3VuZAorCWtFcGxObXROb2RlQ29tbWFuZFN3T2sgPSAweDAyLAkvLyBhcHBsaWNhdGlvbiB1cGRhdGVkIHNvZnR3YXJlIG9uIENOIHN1Y2Nlc3NmdWxseQorCWtFcGxObXROb2RlQ29tbWFuZFN3VXBkYXRlZCA9IDB4MDMsCS8vIGFwcGxpY2F0aW9uIHVwZGF0ZWQgc29mdHdhcmUgb24gQ04gc3VjY2Vzc2Z1bGx5CisJa0VwbE5tdE5vZGVDb21tYW5kQ29uZk9rID0gMHgwNCwJLy8gYXBwbGljYXRpb24gLyBDb25maWd1cmF0aW9uIE1hbmFnZXIgaGFzIHVwZGF0ZWQgY29uZmlndXJhdGlvbiBvbiBDTiBzdWNjZXNzZnVsbHkKKwlrRXBsTm10Tm9kZUNvbW1hbmRDb25mUmVzZXQgPSAweDA1LAkvLyBhcHBsaWNhdGlvbiAvIENvbmZpZ3VyYXRpb24gTWFuYWdlciBoYXMgdXBkYXRlZCBjb25maWd1cmF0aW9uIG9uIENOIHN1Y2Nlc3NmdWxseQorCS8vIGFuZCBDTiBuZWVkcyBSZXNldENvbmYgc28gdGhhdCB0aGUgY29uZmlndXJhdGlvbiBnZXRzIGFjdGl2ZWQKKwlrRXBsTm10Tm9kZUNvbW1hbmRDb25mRXJyID0gMHgwNiwJLy8gYXBwbGljYXRpb24gLyBDb25maWd1cmF0aW9uIE1hbmFnZXIgZmFpbGVkIG9uIHVwZGF0aW5nIGNvbmZpZ3VyYXRpb24gb24gQ04KKwlrRXBsTm10Tm9kZUNvbW1hbmRTdGFydCA9IDB4MDcsCS8vIGlmIEVQTF9OTVRTVF9OT19TVEFSVE5PREUgc2V0IGl0IG11c3QgYmUgaXNzdWVkIGFmdGVyIGtFcGxObXROb2RlRXZlbnRSZWFkeVRvU3RhcnQKKworfSB0RXBsTm10Tm9kZUNvbW1hbmQ7CisKK3R5cGVkZWYgZW51bSB7CisJa0VwbE5tdEJvb3RFdmVudEJvb3RTdGVwMUZpbmlzaCA9IDB4MDAsCS8vIFByZU9wMiBpcyBwb3NzaWJsZQorCWtFcGxObXRCb290RXZlbnRCb290U3RlcDJGaW5pc2ggPSAweDAxLAkvLyBSZWFkeVRvT3AgaXMgcG9zc2libGUKKwlrRXBsTm10Qm9vdEV2ZW50Q2hlY2tDb21GaW5pc2ggPSAweDAyLAkvLyBPcGVyYXRpb25hbCBpcyBwb3NzaWJsZQorCWtFcGxObXRCb290RXZlbnRPcGVyYXRpb25hbCA9IDB4MDMsCS8vIGFsbCBtYW5kYXRvcnkgQ05zIGFyZSBPcGVyYXRpb25hbAorCWtFcGxObXRCb290RXZlbnRFcnJvciA9IDB4MDQsCS8vIGJvb3QgcHJvY2VzcyBoYWx0ZWQgYmVjYXVzZSBvZiBhbiBlcnJvcgorCit9IHRFcGxObXRCb290RXZlbnQ7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMTk1UX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE5tdENudS5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxObXRDbnUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmY0NmRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxObXRDbnUuYwpAQCAtMCwwICsxLDcwNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBOTVQtQ04tVXNlcnNwYWNlLU1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE5tdENudS5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMDkgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkVwbEluYy5oIgorI2luY2x1ZGUgInVzZXIvRXBsTm10Q251LmgiCisjaW5jbHVkZSAidXNlci9FcGxEbGx1Q2FsLmgiCisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX0NOKSkgIT0gMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBtX3VpTm9kZUlkOworCXRFcGxObXR1Q2hlY2tFdmVudENhbGxiYWNrIG1fcGZuQ2hlY2tFdmVudENiOworCit9IHRFcGxObXRDbnVJbnN0YW5jZTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxObXRDbnVJbnN0YW5jZSBFcGxObXRDbnVJbnN0YW5jZV9nOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxObXRDb21tYW5kIEVwbE5tdENudUdldE5tdENvbW1hbmQodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCk7CisKK3N0YXRpYyBCT09MIEVwbE5tdENudU5vZGVJZExpc3QoQllURSAqIHBiTm10Q29tbWFuZERhdGVfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRDbnVDb21tYW5kQ2IodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRDbnVJbml0CisvLworLy8gRGVzY3JpcHRpb246IGluaXQgdGhlIGZpcnN0IGluc3RhbmNlIG9mIHRoZSBtb2R1bGUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICAgICAgdWlOb2RlSWRfcCA9IE5vZGVJZCBvZiB0aGUgbG9jYWwgbm9kZQorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgICAgIHRFcGxLZXJuZWwgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRDbnVJbml0KHVuc2lnbmVkIGludCB1aU5vZGVJZF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0gRXBsTm10Q251QWRkSW5zdGFuY2UodWlOb2RlSWRfcCk7CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRDbnVBZGRJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBpbml0IHRoZSBhZGQgbmV3IGluc3RhbmNlIG9mIHRoZSBtb2R1bGUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICAgICAgdWlOb2RlSWRfcCA9IE5vZGVJZCBvZiB0aGUgbG9jYWwgbm9kZQorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgICAgIHRFcGxLZXJuZWwgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRDbnVBZGRJbnN0YW5jZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gcmVzZXQgaW5zdGFuY2Ugc3RydWN0dXJlCisJRVBMX01FTVNFVCgmRXBsTm10Q251SW5zdGFuY2VfZywgMCwgc2l6ZW9mKEVwbE5tdENudUluc3RhbmNlX2cpKTsKKworCS8vIHNhdmUgbm9kZWlkCisJRXBsTm10Q251SW5zdGFuY2VfZy5tX3VpTm9kZUlkID0gdWlOb2RlSWRfcDsKKworCS8vIHJlZ2lzdGVyIGNhbGxiYWNrLWZ1bmN0aW9uIGZvciBOTVQtY29tbWFuZHMKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMVSkpICE9IDApCisJUmV0ID0gRXBsRGxsdUNhbFJlZ0FzbmRTZXJ2aWNlKGtFcGxEbGxBc25kTm10Q29tbWFuZCwKKwkJCQkgICAgICAgRXBsTm10Q251Q29tbWFuZENiLAorCQkJCSAgICAgICBrRXBsRGxsQXNuZEZpbHRlckxvY2FsKTsKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRDbnVEZWxJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBkZWx0ZSBpbnN0YW5jZSBvZiB0aGUgbW9kdWxlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgICAgIHRFcGxLZXJuZWwgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRDbnVEZWxJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExVKSkgIT0gMCkKKwkvLyBkZXJlZ2lzdGVyIGNhbGxiYWNrIGZ1bmN0aW9uIGZyb20gRExMCisJUmV0ID0gRXBsRGxsdUNhbFJlZ0FzbmRTZXJ2aWNlKGtFcGxEbGxBc25kTm10Q29tbWFuZCwKKwkJCQkgICAgICAgTlVMTCwga0VwbERsbEFzbmRGaWx0ZXJOb25lKTsKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10Q251U2VuZE5tdFJlcXVlc3QKKy8vCisvLyBEZXNjcmlwdGlvbjogU2VuZCBhbiBOTVQtUmVxdWVzdCB0byB0aGUgTU4KKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICAgICAgdWlOb2RlSWRfcCA9IE5vZGVJZCBvZiB0aGUgbG9jYWwgbm9kZQorLy8gICAgICAgICAgICAgICAgICBObXRDb21tYW5kX3AgPSByZXF1ZXN0ZWQgTk1ULUNvbW1hbmQKKy8vCisvLworLy8gUmV0dXJuczogICAgICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10Q251U2VuZE5tdFJlcXVlc3QodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCQkgICAgICAgdEVwbE5tdENvbW1hbmQKKwkJCQkJCSAgICAgICBObXRDb21tYW5kX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbEZyYW1lSW5mbyBObXRSZXF1ZXN0RnJhbWVJbmZvOworCXRFcGxGcmFtZSBObXRSZXF1ZXN0RnJhbWU7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGJ1aWxkIGZyYW1lCisJRVBMX01FTVNFVCgmTm10UmVxdWVzdEZyYW1lLm1fYmVfYWJEc3RNYWNbMF0sIDB4MDAsIHNpemVvZihObXRSZXF1ZXN0RnJhbWUubV9iZV9hYkRzdE1hYykpOwkvLyBzZXQgYnkgRExMCisJRVBMX01FTVNFVCgmTm10UmVxdWVzdEZyYW1lLm1fYmVfYWJTcmNNYWNbMF0sIDB4MDAsIHNpemVvZihObXRSZXF1ZXN0RnJhbWUubV9iZV9hYlNyY01hYykpOwkvLyBzZXQgYnkgRExMCisJQW1pU2V0V29yZFRvQmUoJk5tdFJlcXVlc3RGcmFtZS5tX2JlX3dFdGhlclR5cGUsCisJCSAgICAgICBFUExfQ19ETExfRVRIRVJUWVBFX0VQTCk7CisJQW1pU2V0Qnl0ZVRvTGUoJk5tdFJlcXVlc3RGcmFtZS5tX2xlX2JEc3ROb2RlSWQsIChCWVRFKSBFUExfQ19BRFJfTU5fREVGX05PREVfSUQpOwkvLyBub2RlIGlkIG9mIHRoZSBNTgorCUFtaVNldEJ5dGVUb0xlKCZObXRSZXF1ZXN0RnJhbWUubV9sZV9iTWVzc2FnZVR5cGUsCisJCSAgICAgICAoQllURSkga0VwbE1zZ1R5cGVBc25kKTsKKwlBbWlTZXRCeXRlVG9MZSgmTm10UmVxdWVzdEZyYW1lLm1fRGF0YS5tX0FzbmQubV9sZV9iU2VydmljZUlkLAorCQkgICAgICAgKEJZVEUpIGtFcGxEbGxBc25kTm10UmVxdWVzdCk7CisJQW1pU2V0Qnl0ZVRvTGUoJk5tdFJlcXVlc3RGcmFtZS5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC4KKwkJICAgICAgIG1fTm10UmVxdWVzdFNlcnZpY2UubV9sZV9iTm10Q29tbWFuZElkLAorCQkgICAgICAgKEJZVEUpIE5tdENvbW1hbmRfcCk7CisJQW1pU2V0Qnl0ZVRvTGUoJk5tdFJlcXVlc3RGcmFtZS5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC5tX05tdFJlcXVlc3RTZXJ2aWNlLm1fbGVfYlRhcmdldE5vZGVJZCwgKEJZVEUpIHVpTm9kZUlkX3ApOwkvLyB0YXJnZXQgZm9yIHRoZSBubXQgY29tbWFuZAorCUVQTF9NRU1TRVQoJk5tdFJlcXVlc3RGcmFtZS5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC5tX05tdFJlcXVlc3RTZXJ2aWNlLgorCQkgICBtX2xlX2FiTm10Q29tbWFuZERhdGFbMF0sIDB4MDAsCisJCSAgIHNpemVvZihObXRSZXF1ZXN0RnJhbWUubV9EYXRhLm1fQXNuZC5tX1BheWxvYWQuCisJCQkgIG1fTm10UmVxdWVzdFNlcnZpY2UubV9sZV9hYk5tdENvbW1hbmREYXRhKSk7CisKKwkvLyBidWlsZCBpbmZvLXN0cnVjdHVyZQorCU5tdFJlcXVlc3RGcmFtZUluZm8ubV9OZXRUaW1lLm1fZHdOYW5vU2VjID0gMDsKKwlObXRSZXF1ZXN0RnJhbWVJbmZvLm1fTmV0VGltZS5tX2R3U2VjID0gMDsKKwlObXRSZXF1ZXN0RnJhbWVJbmZvLm1fcEZyYW1lID0gJk5tdFJlcXVlc3RGcmFtZTsKKwlObXRSZXF1ZXN0RnJhbWVJbmZvLm1fdWlGcmFtZVNpemUgPSBFUExfQ19ETExfTUlOU0laRV9OTVRSRVE7CS8vIHNpemVvZihObXRSZXF1ZXN0RnJhbWUpOworCisJLy8gc2VuZCBOTVQtUmVxdWVzdAorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExVKSkgIT0gMCkKKwlSZXQgPSBFcGxEbGx1Q2FsQXN5bmNTZW5kKCZObXRSZXF1ZXN0RnJhbWVJbmZvLAkvLyBwb2ludGVyIHRvIGZyYW1laW5mbworCQkJCSAga0VwbERsbEFzeW5jUmVxUHJpb05tdCk7CS8vIHByaW9yaXR5CisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdENudVJlZ2lzdGVyU3RhdGVDaGFuZ2VDYgorLy8KKy8vIERlc2NyaXB0aW9uOiByZWdpc3RlciBDYWxsYmFjay1mdW5jdGlvbiBnbyBnZXQgaW5mb3JtZWQgYWJvdXQgYQorLy8gICAgICAgICAgICAgIE5NVC1DaGFuZ2UtU3RhdGUtRXZlbnQKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwZm5FcGxObXRTdGF0ZUNoYW5nZUNiX3AgPSBmdW5jdGlvbnBvaW50ZXIKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQworRXBsTm10Q251UmVnaXN0ZXJDaGVja0V2ZW50Q2IodEVwbE5tdHVDaGVja0V2ZW50Q2FsbGJhY2sKKwkJCSAgICAgIHBmbkVwbE5tdENoZWNrRXZlbnRDYl9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBzYXZlIGNhbGxiYWNrLWZ1bmN0aW9uIGluIG1vZHVsIGdsb2JhbCB2YXIKKwlFcGxObXRDbnVJbnN0YW5jZV9nLm1fcGZuQ2hlY2tFdmVudENiID0gcGZuRXBsTm10Q2hlY2tFdmVudENiX3A7CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRDbnVDb21tYW5kQ2IKKy8vCisvLyBEZXNjcmlwdGlvbjogY2FsbGJhY2sgZnVua3Rpb24gZm9yIE5NVC1Db21tYW5kcworLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogICAgICBwRnJhbWVJbmZvX3AgPSBGcmFtZSB3aXRoIHRoZSBOTVQtQ29tbWFuZG8KKy8vCisvLworLy8gUmV0dXJuczogICAgICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10Q251Q29tbWFuZENiKHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsTm10Q29tbWFuZCBObXRDb21tYW5kOworCUJPT0wgZk5vZGVJZEluTGlzdDsKKwl0RXBsTm10RXZlbnQgTm10RXZlbnQgPSBrRXBsTm10RXZlbnROb0V2ZW50OworCisJaWYgKHBGcmFtZUluZm9fcCA9PSBOVUxMKSB7CisJCVJldCA9IGtFcGxObXRJbnZhbGlkRnJhbWVQb2ludGVyOworCQlnb3RvIEV4aXQ7CisJfQorCisJTm10Q29tbWFuZCA9IEVwbE5tdENudUdldE5tdENvbW1hbmQocEZyYW1lSW5mb19wKTsKKworCS8vIGNoZWNrIE5NVC1Db21tYW5kCisJc3dpdGNoIChObXRDb21tYW5kKSB7CisKKwkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJLy8gcGxhaW4gTk1UIHN0YXRlIGNvbW1hbmRzCisJY2FzZSBrRXBsTm10Q21kU3RhcnROb2RlOgorCQl7CQkvLyBzZW5kIE5NVC1FdmVudCB0byBzdGF0ZSBtYXNjaGluZSBrRXBsTm10RXZlbnRTdGFydE5vZGUKKwkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50U3RhcnROb2RlOworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdENtZFN0b3BOb2RlOgorCQl7CQkvLyBzZW5kIE5NVC1FdmVudCB0byBzdGF0ZSBtYXNjaGluZSBrRXBsTm10RXZlbnRTdG9wTm9kZQorCQkJTm10RXZlbnQgPSBrRXBsTm10RXZlbnRTdG9wTm9kZTsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxObXRDbWRFbnRlclByZU9wZXJhdGlvbmFsMjoKKwkJewkJLy8gc2VuZCBOTVQtRXZlbnQgdG8gc3RhdGUgbWFzY2hpbmUga0VwbE5tdEV2ZW50RW50ZXJQcmVPcGVyYXRpb25hbDIKKwkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50RW50ZXJQcmVPcGVyYXRpb25hbDI7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10Q21kRW5hYmxlUmVhZHlUb09wZXJhdGU6CisJCXsJCS8vIHNlbmQgTk1ULUV2ZW50IHRvIHN0YXRlIG1hc2NoaW5lIGtFcGxObXRFdmVudEVuYWJsZVJlYWR5VG9PcGVyYXRlCisJCQlObXRFdmVudCA9IGtFcGxObXRFdmVudEVuYWJsZVJlYWR5VG9PcGVyYXRlOworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdENtZFJlc2V0Tm9kZToKKwkJewkJLy8gc2VuZCBOTVQtRXZlbnQgdG8gc3RhdGUgbWFzY2hpbmUga0VwbE5tdEV2ZW50UmVzZXROb2RlCisJCQlObXRFdmVudCA9IGtFcGxObXRFdmVudFJlc2V0Tm9kZTsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxObXRDbWRSZXNldENvbW11bmljYXRpb246CisJCXsJCS8vIHNlbmQgTk1ULUV2ZW50IHRvIHN0YXRlIG1hc2NoaW5lIGtFcGxObXRFdmVudFJlc2V0Q29tCisJCQlObXRFdmVudCA9IGtFcGxObXRFdmVudFJlc2V0Q29tOworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdENtZFJlc2V0Q29uZmlndXJhdGlvbjoKKwkJewkJLy8gc2VuZCBOTVQtRXZlbnQgdG8gc3RhdGUgbWFzY2hpbmUga0VwbE5tdEV2ZW50UmVzZXRDb25maWcKKwkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50UmVzZXRDb25maWc7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10Q21kU3dSZXNldDoKKwkJewkJLy8gc2VuZCBOTVQtRXZlbnQgdG8gc3RhdGUgbWFzY2hpbmUga0VwbE5tdEV2ZW50U3dSZXNldAorCQkJTm10RXZlbnQgPSBrRXBsTm10RXZlbnRTd1Jlc2V0OworCQkJYnJlYWs7CisJCX0KKworCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyBleHRlbmRlZCBOTVQgc3RhdGUgY29tbWFuZHMKKworCWNhc2Uga0VwbE5tdENtZFN0YXJ0Tm9kZUV4OgorCQl7CisJCQkvLyBjaGVjayBpZiBvd24gbm9kZWlkIGlzIGluIEVQTCBub2RlIGxpc3QKKwkJCWZOb2RlSWRJbkxpc3QgPQorCQkJICAgIEVwbE5tdENudU5vZGVJZExpc3QoJgorCQkJCQkJKHBGcmFtZUluZm9fcC0+bV9wRnJhbWUtPm1fRGF0YS4KKwkJCQkJCSBtX0FzbmQubV9QYXlsb2FkLgorCQkJCQkJIG1fTm10Q29tbWFuZFNlcnZpY2UuCisJCQkJCQkgbV9sZV9hYk5tdENvbW1hbmREYXRhWzBdKSk7CisJCQlpZiAoZk5vZGVJZEluTGlzdCAhPSBGQUxTRSkgewkvLyBvd24gbm9kZWlkIGluIGxpc3QKKwkJCQkvLyBzZW5kIGV2ZW50IHRvIHByb2Nlc3MgY29tbWFuZAorCQkJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50U3RhcnROb2RlOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdENtZFN0b3BOb2RlRXg6CisJCXsJCS8vIGNoZWNrIGlmIG93biBub2RlaWQgaXMgaW4gRVBMIG5vZGUgbGlzdAorCQkJZk5vZGVJZEluTGlzdCA9CisJCQkgICAgRXBsTm10Q251Tm9kZUlkTGlzdCgmcEZyYW1lSW5mb19wLT5tX3BGcmFtZS0+bV9EYXRhLgorCQkJCQkJbV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJCW1fTm10Q29tbWFuZFNlcnZpY2UuCisJCQkJCQltX2xlX2FiTm10Q29tbWFuZERhdGFbMF0pOworCQkJaWYgKGZOb2RlSWRJbkxpc3QgIT0gRkFMU0UpIHsJLy8gb3duIG5vZGVpZCBpbiBsaXN0CisJCQkJLy8gc2VuZCBldmVudCB0byBwcm9jZXNzIGNvbW1hbmQKKwkJCQlObXRFdmVudCA9IGtFcGxObXRFdmVudFN0b3BOb2RlOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdENtZEVudGVyUHJlT3BlcmF0aW9uYWwyRXg6CisJCXsJCS8vIGNoZWNrIGlmIG93biBub2RlaWQgaXMgaW4gRVBMIG5vZGUgbGlzdAorCQkJZk5vZGVJZEluTGlzdCA9CisJCQkgICAgRXBsTm10Q251Tm9kZUlkTGlzdCgmcEZyYW1lSW5mb19wLT5tX3BGcmFtZS0+bV9EYXRhLgorCQkJCQkJbV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJCW1fTm10Q29tbWFuZFNlcnZpY2UuCisJCQkJCQltX2xlX2FiTm10Q29tbWFuZERhdGFbMF0pOworCQkJaWYgKGZOb2RlSWRJbkxpc3QgIT0gRkFMU0UpIHsJLy8gb3duIG5vZGVpZCBpbiBsaXN0CisJCQkJLy8gc2VuZCBldmVudCB0byBwcm9jZXNzIGNvbW1hbmQKKwkJCQlObXRFdmVudCA9IGtFcGxObXRFdmVudEVudGVyUHJlT3BlcmF0aW9uYWwyOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdENtZEVuYWJsZVJlYWR5VG9PcGVyYXRlRXg6CisJCXsJCS8vIGNoZWNrIGlmIG93biBub2RlaWQgaXMgaW4gRVBMIG5vZGUgbGlzdAorCQkJZk5vZGVJZEluTGlzdCA9CisJCQkgICAgRXBsTm10Q251Tm9kZUlkTGlzdCgmcEZyYW1lSW5mb19wLT5tX3BGcmFtZS0+bV9EYXRhLgorCQkJCQkJbV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJCW1fTm10Q29tbWFuZFNlcnZpY2UuCisJCQkJCQltX2xlX2FiTm10Q29tbWFuZERhdGFbMF0pOworCQkJaWYgKGZOb2RlSWRJbkxpc3QgIT0gRkFMU0UpIHsJLy8gb3duIG5vZGVpZCBpbiBsaXN0CisJCQkJLy8gc2VuZCBldmVudCB0byBwcm9jZXNzIGNvbW1hbmQKKwkJCQlObXRFdmVudCA9IGtFcGxObXRFdmVudEVuYWJsZVJlYWR5VG9PcGVyYXRlOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdENtZFJlc2V0Tm9kZUV4OgorCQl7CQkvLyBjaGVjayBpZiBvd24gbm9kZWlkIGlzIGluIEVQTCBub2RlIGxpc3QKKwkJCWZOb2RlSWRJbkxpc3QgPQorCQkJICAgIEVwbE5tdENudU5vZGVJZExpc3QoJnBGcmFtZUluZm9fcC0+bV9wRnJhbWUtPm1fRGF0YS4KKwkJCQkJCW1fQXNuZC5tX1BheWxvYWQuCisJCQkJCQltX05tdENvbW1hbmRTZXJ2aWNlLgorCQkJCQkJbV9sZV9hYk5tdENvbW1hbmREYXRhWzBdKTsKKwkJCWlmIChmTm9kZUlkSW5MaXN0ICE9IEZBTFNFKSB7CS8vIG93biBub2RlaWQgaW4gbGlzdAorCQkJCS8vIHNlbmQgZXZlbnQgdG8gcHJvY2VzcyBjb21tYW5kCisJCQkJTm10RXZlbnQgPSBrRXBsTm10RXZlbnRSZXNldE5vZGU7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10Q21kUmVzZXRDb21tdW5pY2F0aW9uRXg6CisJCXsJCS8vIGNoZWNrIGlmIG93biBub2RlaWQgaXMgaW4gRVBMIG5vZGUgbGlzdAorCQkJZk5vZGVJZEluTGlzdCA9CisJCQkgICAgRXBsTm10Q251Tm9kZUlkTGlzdCgmcEZyYW1lSW5mb19wLT5tX3BGcmFtZS0+bV9EYXRhLgorCQkJCQkJbV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJCW1fTm10Q29tbWFuZFNlcnZpY2UuCisJCQkJCQltX2xlX2FiTm10Q29tbWFuZERhdGFbMF0pOworCQkJaWYgKGZOb2RlSWRJbkxpc3QgIT0gRkFMU0UpIHsJLy8gb3duIG5vZGVpZCBpbiBsaXN0CisJCQkJLy8gc2VuZCBldmVudCB0byBwcm9jZXNzIGNvbW1hbmQKKwkJCQlObXRFdmVudCA9IGtFcGxObXRFdmVudFJlc2V0Q29tOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdENtZFJlc2V0Q29uZmlndXJhdGlvbkV4OgorCQl7CQkvLyBjaGVjayBpZiBvd24gbm9kZWlkIGlzIGluIEVQTCBub2RlIGxpc3QKKwkJCWZOb2RlSWRJbkxpc3QgPQorCQkJICAgIEVwbE5tdENudU5vZGVJZExpc3QoJnBGcmFtZUluZm9fcC0+bV9wRnJhbWUtPm1fRGF0YS4KKwkJCQkJCW1fQXNuZC5tX1BheWxvYWQuCisJCQkJCQltX05tdENvbW1hbmRTZXJ2aWNlLgorCQkJCQkJbV9sZV9hYk5tdENvbW1hbmREYXRhWzBdKTsKKwkJCWlmIChmTm9kZUlkSW5MaXN0ICE9IEZBTFNFKSB7CS8vIG93biBub2RlaWQgaW4gbGlzdAorCQkJCS8vIHNlbmQgZXZlbnQgdG8gcHJvY2VzcyBjb21tYW5kCisJCQkJTm10RXZlbnQgPSBrRXBsTm10RXZlbnRSZXNldENvbmZpZzsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxObXRDbWRTd1Jlc2V0RXg6CisJCXsJCS8vIGNoZWNrIGlmIG93biBub2RlaWQgaXMgaW4gRVBMIG5vZGUgbGlzdAorCQkJZk5vZGVJZEluTGlzdCA9CisJCQkgICAgRXBsTm10Q251Tm9kZUlkTGlzdCgmcEZyYW1lSW5mb19wLT5tX3BGcmFtZS0+bV9EYXRhLgorCQkJCQkJbV9Bc25kLm1fUGF5bG9hZC4KKwkJCQkJCW1fTm10Q29tbWFuZFNlcnZpY2UuCisJCQkJCQltX2xlX2FiTm10Q29tbWFuZERhdGFbMF0pOworCQkJaWYgKGZOb2RlSWRJbkxpc3QgIT0gRkFMU0UpIHsJLy8gb3duIG5vZGVpZCBpbiBsaXN0CisJCQkJLy8gc2VuZCBldmVudCB0byBwcm9jZXNzIGNvbW1hbmQKKwkJCQlObXRFdmVudCA9IGtFcGxObXRFdmVudFN3UmVzZXQ7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vIE5NVCBtYW5hZ2luZyBjb21tYW5kcworCisJCS8vIFRPRE86IGFkZCBmdW5jdGlvbnMgdG8gcHJvY2VzcyBtYW5hZ2luZyBjb21tYW5kIChvcHRpb25hbCkKKworCWNhc2Uga0VwbE5tdENtZE5ldEhvc3ROYW1lU2V0OgorCQl7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10Q21kRmx1c2hBcnBFbnRyeToKKwkJeworCQkJYnJlYWs7CisJCX0KKworCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyBOTVQgaW5mbyBzZXJ2aWNlcworCisJCS8vIFRPRE86IGZvcndhcmQgZXZlbnQgd2l0aCBpbmZvcyB0byB0aGUgYXBwbGljYXRpb24gKG9wdGlvbmFsKQorCisJY2FzZSBrRXBsTm10Q21kUHVibGlzaENvbmZpZ3VyZWRDTjoKKwkJeworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdENtZFB1Ymxpc2hBY3RpdmVDTjoKKwkJeworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdENtZFB1Ymxpc2hQcmVPcGVyYXRpb25hbDE6CisJCXsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxObXRDbWRQdWJsaXNoUHJlT3BlcmF0aW9uYWwyOgorCQl7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10Q21kUHVibGlzaFJlYWR5VG9PcGVyYXRlOgorCQl7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10Q21kUHVibGlzaE9wZXJhdGlvbmFsOgorCQl7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10Q21kUHVibGlzaFN0b3BwZWQ6CisJCXsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxObXRDbWRQdWJsaXNoRW1lcmdlbmN5TmV3OgorCQl7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10Q21kUHVibGlzaFRpbWU6CisJCXsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyBlcnJvciBmcm9tIE1OCisJCS8vIC0+IHJlcXVlc3RlZCBjb21tYW5kIG5vdCBzdXBwb3J0ZWQgYnkgTU4KKwljYXNlIGtFcGxObXRDbWRJbnZhbGlkU2VydmljZToKKwkJeworCisJCQkvLyBUT0RPOiBlcnJvcmV2ZW50IHRvIGFwcGxpY2F0aW9uCisJCQlicmVhazsKKwkJfQorCisJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vIGRlZmF1bHQKKwlkZWZhdWx0OgorCQl7CisJCQlSZXQgPSBrRXBsTm10VW5rbm93bkNvbW1hbmQ7CisJCQlnb3RvIEV4aXQ7CisJCX0KKworCX0JCQkvLyBlbmQgb2Ygc3dpdGNoKE5tdENvbW1hbmQpCisKKwlpZiAoTm10RXZlbnQgIT0ga0VwbE5tdEV2ZW50Tm9FdmVudCkgeworCQlpZiAoRXBsTm10Q251SW5zdGFuY2VfZy5tX3BmbkNoZWNrRXZlbnRDYiAhPSBOVUxMKSB7CisJCQlSZXQgPSBFcGxObXRDbnVJbnN0YW5jZV9nLm1fcGZuQ2hlY2tFdmVudENiKE5tdEV2ZW50KTsKKwkJCWlmIChSZXQgPT0ga0VwbFJlamVjdCkgeworCQkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJCWdvdG8gRXhpdDsKKwkJCX0gZWxzZSBpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJZ290byBFeGl0OworCQkJfQorCQl9CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVFUpKSAhPSAwKQorCQlSZXQgPSBFcGxObXR1Tm10RXZlbnQoTm10RXZlbnQpOworI2VuZGlmCisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10Q251R2V0Tm10Q29tbWFuZCgpCisvLworLy8gRGVzY3JpcHRpb246IHJldHVybnMgdGhlIE5NVC1Db21tYW5kIGZyb20gdGhlIGZyYW1lCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgICAgIHBGcmFtZUluZm9fcCA9IHBvaW50ZXIgdG8gdGhlIEZyYW1lCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIE5NVC1Db21tYW5kCisvLworLy8KKy8vIFJldHVybnM6ICAgICAgICAgdEVwbE5tdENvbW1hbmQgPSBOTVQtQ29tbWFuZAorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHRFcGxObXRDb21tYW5kIEVwbE5tdENudUdldE5tdENvbW1hbmQodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCkKK3sKKwl0RXBsTm10Q29tbWFuZCBObXRDb21tYW5kOworCXRFcGxObXRDb21tYW5kU2VydmljZSAqcE5tdENvbW1hbmRTZXJ2aWNlOworCisJcE5tdENvbW1hbmRTZXJ2aWNlID0KKwkgICAgJnBGcmFtZUluZm9fcC0+bV9wRnJhbWUtPm1fRGF0YS5tX0FzbmQubV9QYXlsb2FkLgorCSAgICBtX05tdENvbW1hbmRTZXJ2aWNlOworCisJTm10Q29tbWFuZCA9CisJICAgICh0RXBsTm10Q29tbWFuZCkgQW1pR2V0Qnl0ZUZyb21MZSgmcE5tdENvbW1hbmRTZXJ2aWNlLT4KKwkJCQkJICAgICAgbV9sZV9iTm10Q29tbWFuZElkKTsKKworCXJldHVybiBObXRDb21tYW5kOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRDbnVOb2RlSWRMaXN0KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogY2hlY2sgaWYgdGhlIG93biBub2RlaWQgaXMgc2V0IGluIEVQTCBOb2RlIExpc3QKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICAgICAgcGJObXRDb21tYW5kRGF0ZV9wID0gcG9pbnRlciB0byB0aGUgZGF0YSBvZiB0aGUgTk1UIENvbW1hbmQKKy8vCisvLworLy8gUmV0dXJuczogICAgICAgICBCT09MID0gVFJVRSBpZiBub2RlaWQgaXMgc2V0IGluIEVQTCBOb2RlIExpc3QKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFIGlmIG5vZGVpZCBub3Qgc2V0IGluIEVQTCBOb2RlIExpc3QKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyBCT09MIEVwbE5tdENudU5vZGVJZExpc3QoQllURSAqIHBiTm10Q29tbWFuZERhdGVfcCkKK3sKKwlCT09MIGZOb2RlSWRJbkxpc3Q7CisJdW5zaWduZWQgaW50IHVpQnl0ZU9mZnNldDsKKwlCWVRFIGJCaXRPZmZzZXQ7CisJQllURSBiTm9kZUxpc3RCeXRlOworCisJLy8gZ2V0IGJ5dGUtb2Zmc2V0IG9mIHRoZSBvd24gbm9kZWlkIGluIE5vZGVJZExpc3QKKwkvLyBkZXZpZGUgdGhvdWdoIDgKKwl1aUJ5dGVPZmZzZXQgPSAodW5zaWduZWQgaW50KShFcGxObXRDbnVJbnN0YW5jZV9nLm1fdWlOb2RlSWQgPj4gMyk7CisJLy8gZ2V0IGJpdG9mZnNldAorCWJCaXRPZmZzZXQgPSAoQllURSkgRXBsTm10Q251SW5zdGFuY2VfZy5tX3VpTm9kZUlkICUgODsKKworCWJOb2RlTGlzdEJ5dGUgPSBBbWlHZXRCeXRlRnJvbUxlKCZwYk5tdENvbW1hbmREYXRlX3BbdWlCeXRlT2Zmc2V0XSk7CisJaWYgKChiTm9kZUxpc3RCeXRlICYgYkJpdE9mZnNldCkgPT0gMCkgeworCQlmTm9kZUlkSW5MaXN0ID0gRkFMU0U7CisJfSBlbHNlIHsKKwkJZk5vZGVJZEluTGlzdCA9IFRSVUU7CisJfQorCisJcmV0dXJuIGZOb2RlSWRJbkxpc3Q7Cit9CisKKyNlbmRpZiAvLyAjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9DTikpICE9IDApCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxObXRNbnUuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsTm10TW51LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVkMGI2YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsTm10TW51LmMKQEAgLTAsMCArMSwyODM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgc291cmNlIGZpbGUgZm9yIE5NVC1NTi1Nb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxObXRNbnUuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMTggJCAgJERhdGU6IDIwMDgvMTEvMTkgMDk6NTI6MjQgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8wOSBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAidXNlci9FcGxObXRNbnUuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbFRpbWVydS5oIgorI2luY2x1ZGUgInVzZXIvRXBsSWRlbnR1LmgiCisjaW5jbHVkZSAidXNlci9FcGxTdGF0dXN1LmgiCisjaW5jbHVkZSAidXNlci9FcGxPYmR1LmgiCisjaW5jbHVkZSAidXNlci9FcGxEbGx1Q2FsLmgiCisjaW5jbHVkZSAiQmVuY2htYXJrLmgiCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CRFUpKSA9PSAwKSAmJiAoRVBMX09CRF9VU0VfS0VSTkVMID09IEZBTFNFKQorI2Vycm9yICJFUEwgTm10TW51IG1vZHVsZSBuZWVkcyBFUEwgbW9kdWxlIE9CRFUgb3IgT0JESyEiCisjZW5kaWYKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUcmFjZVBvaW50IHN1cHBvcnQgZm9yIHJlYWx0aW1lLWRlYnVnZ2luZworI2lmZGVmIF9EQkdfVFJBQ0VfUE9JTlRTXwordm9pZCBQVUJMSUMgVGd0RGJnU2lnbmFsVHJhY2VQb2ludChCWVRFIGJUcmFjZVBvaW50TnVtYmVyX3ApOwordm9pZCBQVUJMSUMgVGd0RGJnUG9zdFRyYWNlVmFsdWUoRFdPUkQgZHdUcmFjZVZhbHVlX3ApOworI2RlZmluZSBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVChwKSAgIFRndERiZ1NpZ25hbFRyYWNlUG9pbnQocCkKKyNkZWZpbmUgVEdUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKHYpICAgICBUZ3REYmdQb3N0VHJhY2VWYWx1ZSh2KQorI2Vsc2UKKyNkZWZpbmUgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQocCkKKyNkZWZpbmUgVEdUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKHYpCisjZW5kaWYKKyNkZWZpbmUgRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRShFdmVudF9wLCB1aU5vZGVJZF9wLCB3RXJyb3JDb2RlX3ApIFwKKyAgICBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUoKGtFcGxFdmVudFNpbmtObXRNbnUgPDwgMjgpIHwgKEV2ZW50X3AgPDwgMjQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAodWlOb2RlSWRfcCA8PCAxNikgfCB3RXJyb3JDb2RlX3ApCisKKy8vIGRlZmluZXMgZm9yIGZsYWdzIGluIG5vZGUgaW5mbyBzdHJ1Y3R1cmUKKyNkZWZpbmUgRVBMX05NVE1OVV9OT0RFX0ZMQUdfSVNPQ0hST04gICAgICAgMHgwMDAxCS8vIENOIGlzIGJlaW5nIGFjY2Vzc2VkIGlzb2Nocm9ub3VzbHkKKyNkZWZpbmUgRVBMX05NVE1OVV9OT0RFX0ZMQUdfTk9UX1NDQU5ORUQgICAgMHgwMDAyCS8vIENOIHdhcyBub3Qgc2Nhbm5lZCBvbmNlIC0+IGRlY3JlbWVudCBTaWduYWxDb3VudGVyIGFuZCByZXNldCBmbGFnCisjZGVmaW5lIEVQTF9OTVRNTlVfTk9ERV9GTEFHX0hBTFRFRCAgICAgICAgIDB4MDAwNAkvLyBib290IHByb2Nlc3MgZm9yIHRoaXMgQ04gaXMgaGFsdGVkCisjZGVmaW5lIEVQTF9OTVRNTlVfTk9ERV9GTEFHX05NVF9DTURfSVNTVUVEIDB4MDAwOAkvLyBOTVQgY29tbWFuZCB3YXMganVzdCBpc3N1ZWQsIHdyb25nIE5NVCBzdGF0ZXMgd2lsbCBiZSB0b2xlcmF0ZWQKKyNkZWZpbmUgRVBMX05NVE1OVV9OT0RFX0ZMQUdfQ09VTlRfU1RBVFJFUSAgMHgwMzAwCS8vIGNvdW50ZXIgZm9yIFN0YXR1c1JlcXVlc3QgdGltZXIgaGFuZGxlCisjZGVmaW5lIEVQTF9OTVRNTlVfTk9ERV9GTEFHX0NPVU5UX0xPTkdFUiAgIDB4MEMwMAkvLyBjb3VudGVyIGZvciBsb25nZXIgdGltZW91dHMgdGltZXIgaGFuZGxlCisjZGVmaW5lIEVQTF9OTVRNTlVfTk9ERV9GTEFHX0lOQ19TVEFUUkVRICAgIDB4MDEwMAkvLyBpbmNyZW1lbnQgZm9yIFN0YXR1c1JlcXVlc3QgdGltZXIgaGFuZGxlCisjZGVmaW5lIEVQTF9OTVRNTlVfTk9ERV9GTEFHX0lOQ19MT05HRVIgICAgIDB4MDQwMAkvLyBpbmNyZW1lbnQgZm9yIGxvbmdlciB0aW1lb3V0cyB0aW1lciBoYW5kbGUKKwkJICAgIC8vIFRoZXNlIGNvdW50ZXJzIHdpbGwgYmUgaW5jcmVtZW50ZWQgYXQgZXZlcnkgdGltZXIgc3RhcnQKKwkJICAgIC8vIGFuZCBjb3BpZWQgdG8gdGltZXJhcmcuIFdoZW4gdGhlIHRpbWVyIGV2ZW50IG9jY3VyZXMKKwkJICAgIC8vIGJvdGggd2lsbCBiZSBjb21wYXJlZCBhbmQgaWYgdW5lcXVhbCB0aGUgdGltZXIgZXZlbnQKKwkJICAgIC8vIHdpbGwgYmUgZGlzY2FyZGVkLCBiZWNhdXNlIGl0IGlzIGFuIG9sZCBvbmUuCisKKy8vIGRlZmluZXMgZm9yIHRpbWVyIGFyZ3VtZW50cyB0byBkcmF3IGEgZGlzdGluY3Rpb24gYmV0d2VlbiBzZXJ2ZXJhbCBldmVudHMKKyNkZWZpbmUgRVBMX05NVE1OVV9USU1FUkFSR19OT0RFX01BU0sgICAweDAwMDAwMEZGTAkvLyBtYXNrIHRoYXQgY29udGFpbnMgdGhlIG5vZGUtSUQKKyNkZWZpbmUgRVBMX05NVE1OVV9USU1FUkFSR19JREVOVFJFUSAgICAweDAwMDEwMDAwTAkvLyB0aW1lciBldmVudCBpcyBmb3IgSWRlbnRSZXF1ZXN0CisjZGVmaW5lIEVQTF9OTVRNTlVfVElNRVJBUkdfU1RBVFJFUSAgICAgMHgwMDAyMDAwMEwJLy8gdGltZXIgZXZlbnQgaXMgZm9yIFN0YXR1c1JlcXVlc3QKKyNkZWZpbmUgRVBMX05NVE1OVV9USU1FUkFSR19MT05HRVIgICAgICAweDAwMDQwMDAwTAkvLyB0aW1lciBldmVudCBpcyBmb3IgbG9uZ2VyIHRpbWVvdXRzCisjZGVmaW5lIEVQTF9OTVRNTlVfVElNRVJBUkdfU1RBVEVfTU9OICAgMHgwMDA4MDAwMEwJLy8gdGltZXIgZXZlbnQgZm9yIFN0YXR1c1JlcXVlc3QgdG8gbW9uaXRvciBleGVjdXRpb24gb2YgTk1UIHN0YXRlIGNoYW5nZXMKKyNkZWZpbmUgRVBMX05NVE1OVV9USU1FUkFSR19DT1VOVF9TUiAgICAweDAwMDAwMzAwTAkvLyBjb3VudGVyIGZvciBTdGF0dXNSZXF1ZXN0CisjZGVmaW5lIEVQTF9OTVRNTlVfVElNRVJBUkdfQ09VTlRfTE8gICAgMHgwMDAwMEMwMEwJLy8gY291bnRlciBmb3IgbG9uZ2VyIHRpbWVvdXRzCisJCSAgICAvLyBUaGUgY291bnRlcnMgbXVzdCBoYXZlIHRoZSBzYW1lIHBvc2l0aW9uIGFzIGluIHRoZSBub2RlIGZsYWdzIGFib3ZlLgorCisjZGVmaW5lIEVQTF9OTVRNTlVfU0VUX0ZMQUdTX1RJTUVSQVJHX1NUQVRSRVEocE5vZGVJbmZvX3AsIHVpTm9kZUlkX3AsIFRpbWVyQXJnX3ApIFwKKyAgICBwTm9kZUluZm9fcC0+bV93RmxhZ3MgPSBcCisgICAgICAgICgocE5vZGVJbmZvX3AtPm1fd0ZsYWdzICsgRVBMX05NVE1OVV9OT0RFX0ZMQUdfSU5DX1NUQVRSRVEpIFwKKyAgICAgICAgICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfQ09VTlRfU1RBVFJFUSkgXAorICAgICAgICB8IChwTm9kZUluZm9fcC0+bV93RmxhZ3MgJiB+RVBMX05NVE1OVV9OT0RFX0ZMQUdfQ09VTlRfU1RBVFJFUSk7IFwKKyAgICBUaW1lckFyZ19wLm1fdWxBcmcgPSBFUExfTk1UTU5VX1RJTUVSQVJHX1NUQVRSRVEgfCB1aU5vZGVJZF9wIHwgXAorICAgICAgICAocE5vZGVJbmZvX3AtPm1fd0ZsYWdzICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfQ09VTlRfU1RBVFJFUSk7IFwKKyAgICBUaW1lckFyZ19wLm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua05tdE1udTsKKworI2RlZmluZSBFUExfTk1UTU5VX1NFVF9GTEFHU19USU1FUkFSR19JREVOVFJFUShwTm9kZUluZm9fcCwgdWlOb2RlSWRfcCwgVGltZXJBcmdfcCkgXAorICAgIHBOb2RlSW5mb19wLT5tX3dGbGFncyA9IFwKKyAgICAgICAgKChwTm9kZUluZm9fcC0+bV93RmxhZ3MgKyBFUExfTk1UTU5VX05PREVfRkxBR19JTkNfU1RBVFJFUSkgXAorICAgICAgICAgJiBFUExfTk1UTU5VX05PREVfRkxBR19DT1VOVF9TVEFUUkVRKSBcCisgICAgICAgIHwgKHBOb2RlSW5mb19wLT5tX3dGbGFncyAmIH5FUExfTk1UTU5VX05PREVfRkxBR19DT1VOVF9TVEFUUkVRKTsgXAorICAgIFRpbWVyQXJnX3AubV91bEFyZyA9IEVQTF9OTVRNTlVfVElNRVJBUkdfSURFTlRSRVEgfCB1aU5vZGVJZF9wIHwgXAorICAgICAgICAocE5vZGVJbmZvX3AtPm1fd0ZsYWdzICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfQ09VTlRfU1RBVFJFUSk7IFwKKyAgICBUaW1lckFyZ19wLm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua05tdE1udTsKKworI2RlZmluZSBFUExfTk1UTU5VX1NFVF9GTEFHU19USU1FUkFSR19MT05HRVIocE5vZGVJbmZvX3AsIHVpTm9kZUlkX3AsIFRpbWVyQXJnX3ApIFwKKyAgICBwTm9kZUluZm9fcC0+bV93RmxhZ3MgPSBcCisgICAgICAgICgocE5vZGVJbmZvX3AtPm1fd0ZsYWdzICsgRVBMX05NVE1OVV9OT0RFX0ZMQUdfSU5DX0xPTkdFUikgXAorICAgICAgICAgJiBFUExfTk1UTU5VX05PREVfRkxBR19DT1VOVF9MT05HRVIpIFwKKyAgICAgICAgfCAocE5vZGVJbmZvX3AtPm1fd0ZsYWdzICYgfkVQTF9OTVRNTlVfTk9ERV9GTEFHX0NPVU5UX0xPTkdFUik7IFwKKyAgICBUaW1lckFyZ19wLm1fdWxBcmcgPSBFUExfTk1UTU5VX1RJTUVSQVJHX0xPTkdFUiB8IHVpTm9kZUlkX3AgfCBcCisgICAgICAgIChwTm9kZUluZm9fcC0+bV93RmxhZ3MgJiBFUExfTk1UTU5VX05PREVfRkxBR19DT1VOVF9MT05HRVIpOyBcCisgICAgVGltZXJBcmdfcC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtObXRNbnU7CisKKyNkZWZpbmUgRVBMX05NVE1OVV9TRVRfRkxBR1NfVElNRVJBUkdfU1RBVEVfTU9OKHBOb2RlSW5mb19wLCB1aU5vZGVJZF9wLCBUaW1lckFyZ19wKSBcCisgICAgcE5vZGVJbmZvX3AtPm1fd0ZsYWdzID0gXAorICAgICAgICAoKHBOb2RlSW5mb19wLT5tX3dGbGFncyArIEVQTF9OTVRNTlVfTk9ERV9GTEFHX0lOQ19TVEFUUkVRKSBcCisgICAgICAgICAmIEVQTF9OTVRNTlVfTk9ERV9GTEFHX0NPVU5UX1NUQVRSRVEpIFwKKyAgICAgICAgfCAocE5vZGVJbmZvX3AtPm1fd0ZsYWdzICYgfkVQTF9OTVRNTlVfTk9ERV9GTEFHX0NPVU5UX1NUQVRSRVEpOyBcCisgICAgVGltZXJBcmdfcC5tX3VsQXJnID0gRVBMX05NVE1OVV9USU1FUkFSR19TVEFURV9NT04gfCB1aU5vZGVJZF9wIHwgXAorICAgICAgICAocE5vZGVJbmZvX3AtPm1fd0ZsYWdzICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfQ09VTlRfU1RBVFJFUSk7IFwKKyAgICBUaW1lckFyZ19wLm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua05tdE1udTsKKworLy8gZGVmaW5lcyBmb3IgZ2xvYmFsIGZsYWdzCisjZGVmaW5lIEVQTF9OTVRNTlVfRkxBR19IQUxURUQgICAgICAgICAgMHgwMDAxCS8vIGJvb3QgcHJvY2VzcyBpcyBoYWx0ZWQKKyNkZWZpbmUgRVBMX05NVE1OVV9GTEFHX0FQUF9JTkZPUk1FRCAgICAweDAwMDIJLy8gYXBwbGljYXRpb24gd2FzIGluZm9ybWVkIGFib3V0IHBvc3NpYmxlIE5NVCBzdGF0ZSBjaGFuZ2UKKworLy8gcmV0dXJuIHBvaW50ZXIgdG8gbm9kZSBpbmZvIHN0cnVjdHVyZSBmb3Igc3BlY2lmaWVkIG5vZGUgSUQKKy8vIGQuay4gbWF5IGJlIHJlcGxhY2VkIGJ5IHNwZWNpYWwgKGhhc2gpIGZ1bmN0aW9uIGlmIG5vZGUgSUQgYXJyYXkgaXMgc21hbGxlciB0aGFuIDI1NAorI2RlZmluZSBFUExfTk1UTU5VX0dFVF9OT0RFSU5GTyh1aU5vZGVJZF9wKSAoJkVwbE5tdE1udUluc3RhbmNlX2cubV9hTm9kZUluZm9bdWlOb2RlSWRfcCAtIDFdKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgZW51bSB7CisJa0VwbE5tdE1udUludE5vZGVFdmVudE5vSWRlbnRSZXNwb25zZSA9IDB4MDAsCisJa0VwbE5tdE1udUludE5vZGVFdmVudElkZW50UmVzcG9uc2UgPSAweDAxLAorCWtFcGxObXRNbnVJbnROb2RlRXZlbnRCb290ID0gMHgwMiwKKwlrRXBsTm10TW51SW50Tm9kZUV2ZW50RXhlY1Jlc2V0ID0gMHgwMywKKwlrRXBsTm10TW51SW50Tm9kZUV2ZW50Q29uZmlndXJlZCA9IDB4MDQsCisJa0VwbE5tdE1udUludE5vZGVFdmVudE5vU3RhdHVzUmVzcG9uc2UgPSAweDA1LAorCWtFcGxObXRNbnVJbnROb2RlRXZlbnRTdGF0dXNSZXNwb25zZSA9IDB4MDYsCisJa0VwbE5tdE1udUludE5vZGVFdmVudEhlYXJ0YmVhdCA9IDB4MDcsCisJa0VwbE5tdE1udUludE5vZGVFdmVudE5tdENtZFNlbnQgPSAweDA4LAorCWtFcGxObXRNbnVJbnROb2RlRXZlbnRUaW1lcklkZW50UmVxID0gMHgwOSwKKwlrRXBsTm10TW51SW50Tm9kZUV2ZW50VGltZXJTdGF0UmVxID0gMHgwQSwKKwlrRXBsTm10TW51SW50Tm9kZUV2ZW50VGltZXJTdGF0ZU1vbiA9IDB4MEIsCisJa0VwbE5tdE1udUludE5vZGVFdmVudFRpbWVyTG9uZ2VyID0gMHgwQywKKwlrRXBsTm10TW51SW50Tm9kZUV2ZW50RXJyb3IgPSAweDBELAorCit9IHRFcGxObXRNbnVJbnROb2RlRXZlbnQ7CisKK3R5cGVkZWYgZW51bSB7CisJa0VwbE5tdE1udU5vZGVTdGF0ZVVua25vd24gPSAweDAwLAorCWtFcGxObXRNbnVOb2RlU3RhdGVJZGVudGlmaWVkID0gMHgwMSwKKwlrRXBsTm10TW51Tm9kZVN0YXRlUmVzZXRDb25mID0gMHgwMiwJLy8gQ04gcmVzZXQgYWZ0ZXIgY29uZmlndXJhdGlvbiB1cGRhdGUKKwlrRXBsTm10TW51Tm9kZVN0YXRlQ29uZmlndXJlZCA9IDB4MDMsCS8vIEJvb3RTdGVwMSBjb21wbGV0ZWQKKwlrRXBsTm10TW51Tm9kZVN0YXRlUmVhZHlUb09wID0gMHgwNCwJLy8gQm9vdFN0ZXAyIGNvbXBsZXRlZAorCWtFcGxObXRNbnVOb2RlU3RhdGVDb21DaGVja2VkID0gMHgwNSwJLy8gQ29tbXVuaWNhdGlvbiBjaGVja2VkIHN1Y2Nlc3NmdWxseQorCWtFcGxObXRNbnVOb2RlU3RhdGVPcGVyYXRpb25hbCA9IDB4MDYsCS8vIENOIGlzIGluIE5NVCBzdGF0ZSBPUEVSQVRJT05BTAorCit9IHRFcGxObXRNbnVOb2RlU3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsVGltZXJIZGwgbV9UaW1lckhkbFN0YXRSZXE7CS8vIHRpbWVyIHRvIGRlbGF5IFN0YXR1c1JlcXVlc3RzIGFuZCBJZGVudFJlcXVlc3RzCisJdEVwbFRpbWVySGRsIG1fVGltZXJIZGxMb25nZXI7CS8vIDJuZCB0aW1lciBmb3IgTk1UIGNvbW1hbmQgRW5hYmxlUmVhZHlUb09wIGFuZCBDaGVja0NvbW11bmljYXRpb24KKwl0RXBsTm10TW51Tm9kZVN0YXRlIG1fTm9kZVN0YXRlOwkvLyBpbnRlcm5hbCBub2RlIHN0YXRlIChraW5kIG9mIHN1YiBzdGF0ZSBvZiBOTVQgc3RhdGUpCisJRFdPUkQgbV9kd05vZGVDZmc7CS8vIHN1YmluZGV4IGZyb20gMHgxRjgxCisJV09SRCBtX3dGbGFnczsJCS8vIGZsYWdzOiBDTiBpcyBiZWluZyBhY2Nlc3NlZCBpc29jaHJvbm91c2x5CisKK30gdEVwbE5tdE1udU5vZGVJbmZvOworCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbE5tdE1udU5vZGVJbmZvIG1fYU5vZGVJbmZvW0VQTF9OTVRfTUFYX05PREVfSURdOworCXRFcGxUaW1lckhkbCBtX1RpbWVySGRsTm10U3RhdGU7CS8vIHRpbWVvdXQgZm9yIHN0YXkgaW4gTk1UIHN0YXRlCisJdW5zaWduZWQgaW50IG1fdWlNYW5kYXRvcnlTbGF2ZUNvdW50OworCXVuc2lnbmVkIGludCBtX3VpU2lnbmFsU2xhdmVDb3VudDsKKwl1bnNpZ25lZCBsb25nIG1fdWxTdGF0dXNSZXF1ZXN0RGVsYXk7CS8vIGluIFttc10gKG9iamVjdCAweDEwMDYgKiBFUExfQ19OTVRfU1RBVFJFUV9DWUNMRSkKKwl1bnNpZ25lZCBsb25nIG1fdWxUaW1lb3V0UmVhZHlUb09wOwkvLyBpbiBbbXNdIChvYmplY3QgMHgxRjg5LzUpCisJdW5zaWduZWQgbG9uZyBtX3VsVGltZW91dENoZWNrQ29tOwkvLyBpbiBbbXNdIChvYmplY3QgMHgxMDA2ICogTXVsdGlwbGV4ZWRDeWNsZUNvdW50KQorCVdPUkQgbV93RmxhZ3M7CQkvLyBnbG9iYWwgZmxhZ3MKKwlEV09SRCBtX2R3Tm10U3RhcnR1cDsJLy8gb2JqZWN0IDB4MUY4MCBOTVRfU3RhcnRVcF9VMzIKKwl0RXBsTm10TW51Q2JOb2RlRXZlbnQgbV9wZm5DYk5vZGVFdmVudDsKKwl0RXBsTm10TW51Q2JCb290RXZlbnQgbV9wZm5DYkJvb3RFdmVudDsKKworfSB0RXBsTm10TW51SW5zdGFuY2U7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbE5tdE1udUluc3RhbmNlIEVwbE5tdE1udUluc3RhbmNlX2c7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10TW51Q2JObXRSZXF1ZXN0KHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3ApOworCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10TW51Q2JJZGVudFJlc3BvbnNlKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkJICB0RXBsSWRlbnRSZXNwb25zZSAqCisJCQkJCQkgIHBJZGVudFJlc3BvbnNlX3ApOworCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10TW51Q2JTdGF0dXNSZXNwb25zZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJCSAgIHRFcGxTdGF0dXNSZXNwb25zZSAqCisJCQkJCQkgICBwU3RhdHVzUmVzcG9uc2VfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE5tdE1udUNoZWNrTm10U3RhdGUodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCSB0RXBsTm10TW51Tm9kZUluZm8gKiBwTm9kZUluZm9fcCwKKwkJCQkJIHRFcGxObXRTdGF0ZSBOb2RlTm10U3RhdGVfcCwKKwkJCQkJIFdPUkQgd0Vycm9yQ29kZV9wLAorCQkJCQkgdEVwbE5tdFN0YXRlIExvY2FsTm10U3RhdGVfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE5tdE1udVN0YXJ0Qm9vdFN0ZXAxKHZvaWQpOworCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxObXRNbnVTdGFydEJvb3RTdGVwMih2b2lkKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsTm10TW51U3RhcnRDaGVja0NvbSh2b2lkKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsTm10TW51Tm9kZUJvb3RTdGVwMih1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJIHRFcGxObXRNbnVOb2RlSW5mbyAqIHBOb2RlSW5mb19wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsTm10TW51Tm9kZUNoZWNrQ29tKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQl0RXBsTm10TW51Tm9kZUluZm8gKiBwTm9kZUluZm9fcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE5tdE1udVN0YXJ0Tm9kZXModm9pZCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE5tdE1udVByb2Nlc3NJbnRlcm5hbEV2ZW50KHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkJdEVwbE5tdFN0YXRlIE5vZGVObXRTdGF0ZV9wLAorCQkJCQkJV09SRCB3RXJyb3JDb2RlX3AsCisJCQkJCQl0RXBsTm10TW51SW50Tm9kZUV2ZW50CisJCQkJCQlOb2RlRXZlbnRfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE5tdE1udVJlc2V0KHZvaWQpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10TW51SW5pdAorLy8KKy8vIERlc2NyaXB0aW9uOiBpbml0IGZpcnN0IGluc3RhbmNlIG9mIHRoZSBtb2R1bGUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbE5tdE1udUluaXQodEVwbE5tdE1udUNiTm9kZUV2ZW50IHBmbkNiTm9kZUV2ZW50X3AsCisJCQkgdEVwbE5tdE1udUNiQm9vdEV2ZW50IHBmbkNiQm9vdEV2ZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBFcGxObXRNbnVBZGRJbnN0YW5jZShwZm5DYk5vZGVFdmVudF9wLCBwZm5DYkJvb3RFdmVudF9wKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdE1udUFkZEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGluaXQgb3RoZXIgaW5zdGFuY2VzIG9mIHRoZSBtb2R1bGUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbE5tdE1udUFkZEluc3RhbmNlKHRFcGxObXRNbnVDYk5vZGVFdmVudCBwZm5DYk5vZGVFdmVudF9wLAorCQkJCXRFcGxObXRNbnVDYkJvb3RFdmVudCBwZm5DYkJvb3RFdmVudF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyByZXNldCBpbnN0YW5jZSBzdHJ1Y3R1cmUKKwlFUExfTUVNU0VUKCZFcGxObXRNbnVJbnN0YW5jZV9nLCAwLCBzaXplb2YoRXBsTm10TW51SW5zdGFuY2VfZykpOworCisJaWYgKChwZm5DYk5vZGVFdmVudF9wID09IE5VTEwpIHx8IChwZm5DYkJvb3RFdmVudF9wID09IE5VTEwpKSB7CisJCVJldCA9IGtFcGxObXRJbnZhbGlkUGFyYW07CisJCWdvdG8gRXhpdDsKKwl9CisJRXBsTm10TW51SW5zdGFuY2VfZy5tX3BmbkNiTm9kZUV2ZW50ID0gcGZuQ2JOb2RlRXZlbnRfcDsKKwlFcGxObXRNbnVJbnN0YW5jZV9nLm1fcGZuQ2JCb290RXZlbnQgPSBwZm5DYkJvb3RFdmVudF9wOworCisJLy8gaW5pdGlhbGl6ZSBTdGF0dXNSZXF1ZXN0IGRlbGF5CisJRXBsTm10TW51SW5zdGFuY2VfZy5tX3VsU3RhdHVzUmVxdWVzdERlbGF5ID0gNTAwMEw7CisKKwkvLyByZWdpc3RlciBObXRNblJlc3BvbnNlIGNhbGxiYWNrIGZ1bmN0aW9uCisJUmV0ID0KKwkgICAgRXBsRGxsdUNhbFJlZ0FzbmRTZXJ2aWNlKGtFcGxEbGxBc25kTm10UmVxdWVzdCwKKwkJCQkgICAgIEVwbE5tdE1udUNiTm10UmVxdWVzdCwKKwkJCQkgICAgIGtFcGxEbGxBc25kRmlsdGVyTG9jYWwpOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10TW51RGVsSW5zdGFuY2UKKy8vCisvLyBEZXNjcmlwdGlvbjogZGVsZXRlIGluc3RhbmNlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxObXRNbnVEZWxJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGRlcmVnaXN0ZXIgTm10TW5SZXNwb25zZSBjYWxsYmFjayBmdW5jdGlvbgorCVJldCA9CisJICAgIEVwbERsbHVDYWxSZWdBc25kU2VydmljZShrRXBsRGxsQXNuZE5tdFJlcXVlc3QsIE5VTEwsCisJCQkJICAgICBrRXBsRGxsQXNuZEZpbHRlck5vbmUpOworCisJUmV0ID0gRXBsTm10TW51UmVzZXQoKTsKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10TW51U2VuZE5tdENvbW1hbmRFeAorLy8KKy8vIERlc2NyaXB0aW9uOiBzZW5kcyB0aGUgc3BlY2lmaWVkIE5NVCBjb21tYW5kIHRvIHRoZSBzcGVjaWZpZWQgbm9kZS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBub2RlIElEIHRvIHdoaWNoIHRoZSBOTVQgY29tbWFuZCB3aWxsIGJlIHNlbnQKKy8vICAgICAgICAgICAgICBObXRDb21tYW5kX3AgICAgICAgICAgICA9IE5NVCBjb21tYW5kCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsTm10TW51U2VuZE5tdENvbW1hbmRFeCh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkgICAgIHRFcGxObXRDb21tYW5kIE5tdENvbW1hbmRfcCwKKwkJCQkgICAgIHZvaWQgKnBObXRDb21tYW5kRGF0YV9wLAorCQkJCSAgICAgdW5zaWduZWQgaW50IHVpRGF0YVNpemVfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxGcmFtZUluZm8gRnJhbWVJbmZvOworCUJZVEUgYWJCdWZmZXJbRVBMX0NfRExMX01JTlNJWkVfTk1UQ01ERVhUXTsKKwl0RXBsRnJhbWUgKnBGcmFtZSA9ICh0RXBsRnJhbWUgKikgYWJCdWZmZXI7CisJQk9PTCBmU29mdERlbGV0ZU5vZGUgPSBGQUxTRTsKKworCWlmICgodWlOb2RlSWRfcCA9PSAwKSB8fCAodWlOb2RlSWRfcCA+IEVQTF9DX0FEUl9CUk9BRENBU1QpKSB7CS8vIGludmFsaWQgbm9kZSBJRCBzcGVjaWZpZWQKKwkJUmV0ID0ga0VwbEludmFsaWROb2RlSWQ7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAoKHBObXRDb21tYW5kRGF0YV9wICE9IE5VTEwpCisJICAgICYmICh1aURhdGFTaXplX3AgPgorCQkoRVBMX0NfRExMX01JTlNJWkVfTk1UQ01ERVhUIC0gRVBMX0NfRExMX01JTlNJWkVfTk1UQ01EKSkpIHsKKwkJUmV0ID0ga0VwbE5tdEludmFsaWRQYXJhbTsKKwkJZ290byBFeGl0OworCX0KKwkvLyAkJCQgZC5rLiBtYXkgYmUgY2hlY2sgaW4gZnV0dXJlIHZlcnNpb25zIGlmIHRoZSBjYWxsZXIgd2FudHMgdG8gcGVyZm9ybSBwcm9oaWJpdGVkIHN0YXRlIHRyYW5zaXRpb25zCisJLy8gICAgIHRoZSBDTiBzaG91bGQgbm90IHBlcmZvcm0gdGhlc2UgdHJhbnNpdGlvbnMsIGJ1dCB0aGUgZXhwZWN0ZWQgTk1UIHN0YXRlIHdpbGwgYmUgY2hhbmdlZCBhbmQgbmV2ZXIgZnVsbGZpbGxlZC4KKworCS8vIGJ1aWxkIGZyYW1lCisJRVBMX01FTVNFVChwRnJhbWUsIDB4MDAsIHNpemVvZihhYkJ1ZmZlcikpOworCUFtaVNldEJ5dGVUb0xlKCZwRnJhbWUtPm1fbGVfYkRzdE5vZGVJZCwgKEJZVEUpIHVpTm9kZUlkX3ApOworCUFtaVNldEJ5dGVUb0xlKCZwRnJhbWUtPm1fRGF0YS5tX0FzbmQubV9sZV9iU2VydmljZUlkLAorCQkgICAgICAgKEJZVEUpIGtFcGxEbGxBc25kTm10Q29tbWFuZCk7CisJQW1pU2V0Qnl0ZVRvTGUoJnBGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQubV9ObXRDb21tYW5kU2VydmljZS4KKwkJICAgICAgIG1fbGVfYk5tdENvbW1hbmRJZCwgKEJZVEUpIE5tdENvbW1hbmRfcCk7CisJaWYgKChwTm10Q29tbWFuZERhdGFfcCAhPSBOVUxMKSAmJiAodWlEYXRhU2l6ZV9wID4gMCkpIHsJLy8gY29weSBjb21tYW5kIGRhdGEgdG8gZnJhbWUKKwkJRVBMX01FTUNQWSgmcEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC5tX05tdENvbW1hbmRTZXJ2aWNlLgorCQkJICAgbV9sZV9hYk5tdENvbW1hbmREYXRhWzBdLCBwTm10Q29tbWFuZERhdGFfcCwKKwkJCSAgIHVpRGF0YVNpemVfcCk7CisJfQorCS8vIGJ1aWxkIGluZm8gc3RydWN0dXJlCisJRnJhbWVJbmZvLm1fTmV0VGltZS5tX2R3TmFub1NlYyA9IDA7CisJRnJhbWVJbmZvLm1fTmV0VGltZS5tX2R3U2VjID0gMDsKKwlGcmFtZUluZm8ubV9wRnJhbWUgPSBwRnJhbWU7CisJRnJhbWVJbmZvLm1fdWlGcmFtZVNpemUgPSBzaXplb2YoYWJCdWZmZXIpOworCisJLy8gc2VuZCBOTVQtUmVxdWVzdAorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExVKSkgIT0gMCkKKwlSZXQgPSBFcGxEbGx1Q2FsQXN5bmNTZW5kKCZGcmFtZUluZm8sCS8vIHBvaW50ZXIgdG8gZnJhbWVpbmZvCisJCQkJICBrRXBsRGxsQXN5bmNSZXFQcmlvTm10KTsJLy8gcHJpb3JpdHkKKyNlbmRpZgorCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCUVQTF9EQkdMVkxfTk1UTU5fVFJBQ0UyKCJOTVRDbWQoJTAyWC0+JTAyWClcbiIsIE5tdENvbW1hbmRfcCwKKwkJCQl1aU5vZGVJZF9wKTsKKworCXN3aXRjaCAoTm10Q29tbWFuZF9wKSB7CisJY2FzZSBrRXBsTm10Q21kU3RhcnROb2RlOgorCWNhc2Uga0VwbE5tdENtZEVudGVyUHJlT3BlcmF0aW9uYWwyOgorCWNhc2Uga0VwbE5tdENtZEVuYWJsZVJlYWR5VG9PcGVyYXRlOgorCQl7CisJCQkvLyBub3RoaW5nIGxlZnQgdG8gZG8sCisJCQkvLyBiZWNhdXNlIGFueSBmdXJ0aGVyIHByb2Nlc3NpbmcgaXMgZG9uZQorCQkJLy8gd2hlbiB0aGUgTk1UIGNvbW1hbmQgaXMgYWN0dWFsbHkgc2VudAorCQkJZ290byBFeGl0OworCQl9CisKKwljYXNlIGtFcGxObXRDbWRTdG9wTm9kZToKKwkJeworCQkJZlNvZnREZWxldGVOb2RlID0gVFJVRTsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxObXRDbWRSZXNldE5vZGU6CisJY2FzZSBrRXBsTm10Q21kUmVzZXRDb21tdW5pY2F0aW9uOgorCWNhc2Uga0VwbE5tdENtZFJlc2V0Q29uZmlndXJhdGlvbjoKKwljYXNlIGtFcGxObXRDbWRTd1Jlc2V0OgorCQl7CisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJZ290byBFeGl0OworCX0KKworCS8vIHJlbW92ZSBDTiBmcm9tIGlzb2Nocm9ub3VzIHBoYXNlOworCS8vIFRoaXMgbXVzdCBiZSBkb25lIGhlcmUgYW5kIG5vdCB3aGVuIE5NVCBjb21tYW5kIGlzIGFjdHVhbGx5IHNlbnQKKwkvLyBiZWNhdXNlIGl0IHdpbGwgYmUgdG9vIGxhdGUgYW5kIG1heSBjYXVzZSB1bndhbnRlZCBlcnJvcnMKKwlpZiAodWlOb2RlSWRfcCAhPSBFUExfQ19BRFJfQlJPQURDQVNUKSB7CisJCWlmIChmU29mdERlbGV0ZU5vZGUgPT0gRkFMU0UpIHsJLy8gcmVtb3ZlIENOIGltbWVkaWF0ZWx5IGZyb20gaXNvY2hyb25vdXMgcGhhc2UKKwkJCVJldCA9IEVwbERsbHVDYWxEZWxldGVOb2RlKHVpTm9kZUlkX3ApOworCQl9IGVsc2UgewkvLyByZW1vdmUgQ04gZnJvbSBpc29jaHJvbm91cyBwaGFzZSBzb2Z0bHkKKwkJCVJldCA9IEVwbERsbHVDYWxTb2Z0RGVsZXRlTm9kZSh1aU5vZGVJZF9wKTsKKwkJfQorCX0gZWxzZSB7CQkvLyBkbyBpdCBmb3IgYWxsIGFjdGl2ZSBDTnMKKwkJZm9yICh1aU5vZGVJZF9wID0gMTsKKwkJICAgICB1aU5vZGVJZF9wIDw9IHRhYmVudHJpZXMoRXBsTm10TW51SW5zdGFuY2VfZy5tX2FOb2RlSW5mbyk7CisJCSAgICAgdWlOb2RlSWRfcCsrKSB7CisJCQlpZiAoKEVQTF9OTVRNTlVfR0VUX05PREVJTkZPKHVpTm9kZUlkX3ApLT4KKwkJCSAgICAgbV9kd05vZGVDZmcgJiAoRVBMX05PREVBU1NJR05fTk9ERV9JU19DTiB8CisJCQkJCSAgICBFUExfTk9ERUFTU0lHTl9OT0RFX0VYSVNUUykpICE9IDApIHsKKwkJCQlpZiAoZlNvZnREZWxldGVOb2RlID09IEZBTFNFKSB7CS8vIHJlbW92ZSBDTiBpbW1lZGlhdGVseSBmcm9tIGlzb2Nocm9ub3VzIHBoYXNlCisJCQkJCVJldCA9IEVwbERsbHVDYWxEZWxldGVOb2RlKHVpTm9kZUlkX3ApOworCQkJCX0gZWxzZSB7CS8vIHJlbW92ZSBDTiBmcm9tIGlzb2Nocm9ub3VzIHBoYXNlIHNvZnRseQorCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsRGxsdUNhbFNvZnREZWxldGVOb2RlCisJCQkJCSAgICAodWlOb2RlSWRfcCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdE1udVNlbmRObXRDb21tYW5kCisvLworLy8gRGVzY3JpcHRpb246IHNlbmRzIHRoZSBzcGVjaWZpZWQgTk1UIGNvbW1hbmQgdG8gdGhlIHNwZWNpZmllZCBub2RlLgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICAgICAgICAgICAgICA9IG5vZGUgSUQgdG8gd2hpY2ggdGhlIE5NVCBjb21tYW5kIHdpbGwgYmUgc2VudAorLy8gICAgICAgICAgICAgIE5tdENvbW1hbmRfcCAgICAgICAgICAgID0gTk1UIGNvbW1hbmQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxObXRNbnVTZW5kTm10Q29tbWFuZCh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkgICB0RXBsTm10Q29tbWFuZCBObXRDb21tYW5kX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCVJldCA9IEVwbE5tdE1udVNlbmRObXRDb21tYW5kRXgodWlOb2RlSWRfcCwgTm10Q29tbWFuZF9wLCBOVUxMLCAwKTsKKworLy9FeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdE1udVRyaWdnZXJTdGF0ZUNoYW5nZQorLy8KKy8vIERlc2NyaXB0aW9uOiB0cmlnZ2VycyB0aGUgc3BlY2lmaWVkIG5vZGUgY29tbWFuZCBmb3IgdGhlIHNwZWNpZmllZCBub2RlLgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICAgICAgICAgICAgICA9IG5vZGUgSUQgZm9yIHdoaWNoIHRoZSBub2RlIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZAorLy8gICAgICAgICAgICAgIE5vZGVDb21tYW5kX3AgICAgICAgICAgID0gbm9kZSBjb21tYW5kCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsTm10TW51VHJpZ2dlclN0YXRlQ2hhbmdlKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCSAgICAgICB0RXBsTm10Tm9kZUNvbW1hbmQgTm9kZUNvbW1hbmRfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxObXRNbnVJbnROb2RlRXZlbnQgTm9kZUV2ZW50OworCXRFcGxPYmRTaXplIE9iZFNpemU7CisJQllURSBiTm10U3RhdGU7CisJV09SRCB3RXJyb3JDb2RlID0gRVBMX0VfTk9fRVJST1I7CisKKwlpZiAoKHVpTm9kZUlkX3AgPT0gMCkgfHwgKHVpTm9kZUlkX3AgPj0gRVBMX0NfQURSX0JST0FEQ0FTVCkpIHsKKwkJUmV0ID0ga0VwbEludmFsaWROb2RlSWQ7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlzd2l0Y2ggKE5vZGVDb21tYW5kX3ApIHsKKwljYXNlIGtFcGxObXROb2RlQ29tbWFuZEJvb3Q6CisJCXsKKwkJCU5vZGVFdmVudCA9IGtFcGxObXRNbnVJbnROb2RlRXZlbnRCb290OworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdE5vZGVDb21tYW5kQ29uZk9rOgorCQl7CisJCQlOb2RlRXZlbnQgPSBrRXBsTm10TW51SW50Tm9kZUV2ZW50Q29uZmlndXJlZDsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxObXROb2RlQ29tbWFuZENvbmZFcnI6CisJCXsKKwkJCU5vZGVFdmVudCA9IGtFcGxObXRNbnVJbnROb2RlRXZlbnRFcnJvcjsKKwkJCXdFcnJvckNvZGUgPSBFUExfRV9OTVRfQlBPMV9DRl9WRVJJRlk7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10Tm9kZUNvbW1hbmRDb25mUmVzZXQ6CisJCXsKKwkJCU5vZGVFdmVudCA9IGtFcGxObXRNbnVJbnROb2RlRXZlbnRFeGVjUmVzZXQ7CisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJewkJLy8gaW52YWxpZCBub2RlIGNvbW1hbmQKKwkJCWdvdG8gRXhpdDsKKwkJfQorCX0KKworCS8vIGZldGNoIGN1cnJlbnQgTk1UIHN0YXRlCisJT2JkU2l6ZSA9IDE7CisJUmV0ID0gRXBsT2JkdVJlYWRFbnRyeSgweDFGOEUsIHVpTm9kZUlkX3AsICZiTm10U3RhdGUsICZPYmRTaXplKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlSZXQgPSBFcGxObXRNbnVQcm9jZXNzSW50ZXJuYWxFdmVudCh1aU5vZGVJZF9wLAorCQkJCQkgICAgKHRFcGxObXRTdGF0ZSkgKGJObXRTdGF0ZSB8CisJCQkJCQkJICAgIEVQTF9OTVRfVFlQRV9DUyksCisJCQkJCSAgICB3RXJyb3JDb2RlLCBOb2RlRXZlbnQpOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdE1udUNiTm10U3RhdGVDaGFuZ2UKKy8vCisvLyBEZXNjcmlwdGlvbjogY2FsbGJhY2sgZnVuY3Rpb24gZm9yIE5NVCBzdGF0ZSBjaGFuZ2VzCisvLworLy8gUGFyYW1ldGVyczogIE5tdFN0YXRlQ2hhbmdlX3AgICAgICAgID0gTk1UIHN0YXRlIGNoYW5nZSBldmVudAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10TW51Q2JObXRTdGF0ZUNoYW5nZSh0RXBsRXZlbnRObXRTdGF0ZUNoYW5nZQorCQkJCQkgICAgTm10U3RhdGVDaGFuZ2VfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gZG8gd29yayB3aGljaCBtdXN0IGJlIGRvbmUgaW4gdGhhdCBzdGF0ZQorCXN3aXRjaCAoTm10U3RhdGVDaGFuZ2VfcC5tX05ld05tdFN0YXRlKSB7CisJCS8vIEVQTCBzdGFjayBpcyBub3QgcnVubmluZworLyogICAgICAgIGNhc2Uga0VwbE5tdEdzT2ZmOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy8gZmlyc3QgaW5pdCBvZiB0aGUgaGFyZHdhcmUKKyAgICAgICAgY2FzZSBrRXBsTm10R3NJbml0aWFsaXNpbmc6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvLyBpbml0IG9mIHRoZSBtYW51ZmFjdHVyZXItc3BlY2lmaWMgcHJvZmlsZSBhcmVhIGFuZCB0aGUKKyAgICAgICAgLy8gc3RhbmRhcmRpc2VkIGRldmljZSBwcm9maWxlIGFyZWEKKyAgICAgICAgY2FzZSBrRXBsTm10R3NSZXNldEFwcGxpY2F0aW9uOgorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGluaXQgb2YgdGhlIGNvbW11bmljYXRpb24gcHJvZmlsZSBhcmVhCisgICAgICAgIGNhc2Uga0VwbE5tdEdzUmVzZXRDb21tdW5pY2F0aW9uOgorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorKi8KKwkJLy8gYnVpbGQgdGhlIGNvbmZpZ3VyYXRpb24gd2l0aCBpbmZvcyBmcm9tIE9ECisJY2FzZSBrRXBsTm10R3NSZXNldENvbmZpZ3VyYXRpb246CisJCXsKKwkJCURXT1JEIGR3VGltZW91dDsKKwkJCXRFcGxPYmRTaXplIE9iZFNpemU7CisKKwkJCS8vIHJlYWQgb2JqZWN0IDB4MUY4MCBOTVRfU3RhcnRVcF9VMzIKKwkJCU9iZFNpemUgPSA0OworCQkJUmV0ID0KKwkJCSAgICBFcGxPYmR1UmVhZEVudHJ5KDB4MUY4MCwgMCwKKwkJCQkJICAgICAmRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJCQkJICAgICBtX2R3Tm10U3RhcnR1cCwgJk9iZFNpemUpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCWJyZWFrOworCQkJfQorCQkJLy8gY29tcHV0ZSBTdGF0dXNSZXFEZWxheSA9IG9iamVjdCAweDEwMDYgKiBFUExfQ19OTVRfU1RBVFJFUV9DWUNMRQorCQkJT2JkU2l6ZSA9IHNpemVvZihkd1RpbWVvdXQpOworCQkJUmV0ID0gRXBsT2JkdVJlYWRFbnRyeSgweDEwMDYsIDAsICZkd1RpbWVvdXQsICZPYmRTaXplKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChkd1RpbWVvdXQgIT0gMEwpIHsKKwkJCQlFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWxTdGF0dXNSZXF1ZXN0RGVsYXkgPQorCQkJCSAgICBkd1RpbWVvdXQgKiBFUExfQ19OTVRfU1RBVFJFUV9DWUNMRSAvIDEwMDBMOworCQkJCWlmIChFcGxObXRNbnVJbnN0YW5jZV9nLgorCQkJCSAgICBtX3VsU3RhdHVzUmVxdWVzdERlbGF5ID09IDBMKSB7CisJCQkJCUVwbE5tdE1udUluc3RhbmNlX2cubV91bFN0YXR1c1JlcXVlc3REZWxheSA9IDFMOwkvLyBhdCBsZWFzdCAxIG1zCisJCQkJfQorCQkJCS8vICQkJCBmZXRjaCBhbmQgdXNlIE11bHRpcGxleGVkQ3ljbGVDb3VudCBmcm9tIE9ECisJCQkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3VsVGltZW91dENoZWNrQ29tID0KKwkJCQkgICAgZHdUaW1lb3V0ICogRVBMX0NfTk1UX1NUQVRSRVFfQ1lDTEUgLyAxMDAwTDsKKwkJCQlpZiAoRXBsTm10TW51SW5zdGFuY2VfZy5tX3VsVGltZW91dENoZWNrQ29tID09CisJCQkJICAgIDBMKSB7CisJCQkJCUVwbE5tdE1udUluc3RhbmNlX2cubV91bFRpbWVvdXRDaGVja0NvbSA9IDFMOwkvLyBhdCBsZWFzdCAxIG1zCisJCQkJfQorCQkJfQorCQkJLy8gZmV0Y2ggUmVhZHlUb09wIFRpbWVvdXQgZnJvbSBPRAorCQkJT2JkU2l6ZSA9IHNpemVvZihkd1RpbWVvdXQpOworCQkJUmV0ID0gRXBsT2JkdVJlYWRFbnRyeSgweDFGODksIDUsICZkd1RpbWVvdXQsICZPYmRTaXplKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChkd1RpbWVvdXQgIT0gMEwpIHsKKwkJCQkvLyBjb252ZXJ0IFt1c10gdG8gW21zXQorCQkJCWR3VGltZW91dCAvPSAxMDAwTDsKKwkJCQlpZiAoZHdUaW1lb3V0ID09IDBMKSB7CisJCQkJCWR3VGltZW91dCA9IDFMOwkvLyBhdCBsZWFzdCAxIG1zCisJCQkJfQorCQkJCUVwbE5tdE1udUluc3RhbmNlX2cubV91bFRpbWVvdXRSZWFkeVRvT3AgPQorCQkJCSAgICBkd1RpbWVvdXQ7CisJCQl9IGVsc2UgeworCQkJCUVwbE5tdE1udUluc3RhbmNlX2cubV91bFRpbWVvdXRSZWFkeVRvT3AgPSAwTDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisvKgorICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIC8vIENOIHBhcnQgb2YgdGhlIHN0YXRlIG1hY2hpbmUKKworICAgICAgICAvLyBub2RlIGxpc3RlIGZvciBFUEwtRnJhbWVzIGFuZCBjaGVjayB0aW1lb3V0CisgICAgICAgIGNhc2Uga0VwbE5tdENzTm90QWN0aXZlOgorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vZGUgcHJvY2VzcyBvbmx5IGFzeW5jIGZyYW1lcworICAgICAgICBjYXNlIGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMToKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBub2RlIHByb2Nlc3MgaXNvY2hyb251cyBhbmQgYXN5bmNocm9udXMgZnJhbWVzCisgICAgICAgIGNhc2Uga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwyOgorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vZGUgc2hvdWxkIGJlIGNvbmZpZ3VyZWQgdW5kIGFwcGxpY2F0aW9uIGlzIHJlYWR5CisgICAgICAgIGNhc2Uga0VwbE5tdENzUmVhZHlUb09wZXJhdGU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gbm9ybWFsIHdvcmsgc3RhdGUKKyAgICAgICAgY2FzZSBrRXBsTm10Q3NPcGVyYXRpb25hbDoKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBub2RlIHN0b3BwZWQgYnkgTU4KKyAgICAgICAgLy8gLT4gb25seSBwcm9jZXNzIGFzeW5jaHJvbnVzIGZyYW1lcworICAgICAgICBjYXNlIGtFcGxObXRDc1N0b3BwZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gbm8gRVBMIGN5Y2xlCisgICAgICAgIC8vIC0+IG5vcm1hbCBldGhlcm5ldCBjb21tdW5pY2F0aW9uCisgICAgICAgIGNhc2Uga0VwbE5tdENzQmFzaWNFdGhlcm5ldDoKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyovCisJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJLy8gTU4gcGFydCBvZiB0aGUgc3RhdGUgbWFjaGluZQorCisJCS8vIG5vZGUgbGlzdGVucyBmb3IgRVBMLUZyYW1lcyBhbmQgY2hlY2sgdGltZW91dAorCWNhc2Uga0VwbE5tdE1zTm90QWN0aXZlOgorCQl7CisJCQlicmVhazsKKwkJfQorCisJCS8vIG5vZGUgcHJvY2Vzc2VzIG9ubHkgYXN5bmMgZnJhbWVzCisJY2FzZSBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDE6CisJCXsKKwkJCURXT1JEIGR3VGltZW91dDsKKwkJCXRFcGxUaW1lckFyZyBUaW1lckFyZzsKKwkJCXRFcGxPYmRTaXplIE9iZFNpemU7CisJCQl0RXBsRXZlbnQgRXZlbnQ7CisKKwkJCS8vIGNsZWFyIGdsb2JhbCBmbGFncywgZS5nLiByZWVuYWJsZSBib290IHByb2Nlc3MKKwkJCUVwbE5tdE1udUluc3RhbmNlX2cubV93RmxhZ3MgPSAwOworCisJCQkvLyByZXNldCBJZGVudFJlc3BvbnNlcyBhbmQgcnVubmluZyBJZGVudFJlcXVlc3RzIGFuZCBTdGF0dXNSZXF1ZXN0cworCQkJUmV0ID0gRXBsSWRlbnR1UmVzZXQoKTsKKwkJCVJldCA9IEVwbFN0YXR1c3VSZXNldCgpOworCisJCQkvLyByZXNldCB0aW1lcnMKKwkJCVJldCA9IEVwbE5tdE1udVJlc2V0KCk7CisKKwkJCS8vIDIwMDgvMTEvMTggZC5rLiByZXNldCBpbnRlcm5hbCBub2RlIGluZm8gaXMgbm90IG5lY2Vzc2FyeSwKKwkJCS8vICAgICAgICAgICAgICAgICBiZWNhdXNlIHRpbWVyIGZsYWdzIGFyZSBpbXBvcnRhbnQgYW5kIG90aGVyCisJCQkvLyAgICAgICAgICAgICAgICAgdGhpbmdzIGFyZSByZXNldCBieSBFcGxObXRNbnVTdGFydEJvb3RTdGVwMSgpLgorLyoKKyAgICAgICAgICAgIEVQTF9NRU1TRVQoRXBsTm10TW51SW5zdGFuY2VfZy5tX2FOb2RlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChFcGxObXRNbnVJbnN0YW5jZV9nLm1fYU5vZGVJbmZvKSk7CisqLworCisJCQkvLyBpbmZvcm0gRExMIGFib3V0IE5NVCBzdGF0ZSBjaGFuZ2UsCisJCQkvLyBzbyB0aGF0IGl0IGNhbiBjbGVhciB0aGUgYXN5bmNob25vdXMgcXVldWVzIGFuZCBzdGFydCB0aGUgcmVkdWNlZCBjeWNsZQorCQkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rRGxsazsKKwkJCUV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZURsbGtTdGFydFJlZHVjZWRDeWNsZTsKKwkJCUVQTF9NRU1TRVQoJkV2ZW50Lm1fTmV0VGltZSwgMHgwMCwKKwkJCQkgICBzaXplb2YoRXZlbnQubV9OZXRUaW1lKSk7CisJCQlFdmVudC5tX3BBcmcgPSBOVUxMOworCQkJRXZlbnQubV91aVNpemUgPSAwOworCQkJUmV0ID0gRXBsRXZlbnR1UG9zdCgmRXZlbnQpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCWJyZWFrOworCQkJfQorCQkJLy8gcmVzZXQgYWxsIG5vZGVzCisJCQkvLyBkLmsuOiBza2lwIHRoaXMgc3RlcCBpZiB3YXMganVzdCBkb25lIGJlZm9yZSwgZS5nLiBiZWNhdXNlIG9mIGEgUmVzZXROb2RlIGNvbW1hbmQgZnJvbSBhIGRpYWdub3N0aWMgbm9kZQorCQkJaWYgKE5tdFN0YXRlQ2hhbmdlX3AubV9ObXRFdmVudCA9PQorCQkJICAgIGtFcGxObXRFdmVudFRpbWVyTXNQcmVPcDEpIHsKKwkJCQlCRU5DSE1BUktfTU9EXzA3X1RPR0dMRSg5KTsKKworCQkJCUVQTF9OTVRNTlVfREJHX1BPU1RfVFJBQ0VfVkFMVUUoMCwKKwkJCQkJCQkJRVBMX0NfQURSX0JST0FEQ0FTVCwKKwkJCQkJCQkJa0VwbE5tdENtZFJlc2V0Tm9kZSk7CisKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxObXRNbnVTZW5kTm10Q29tbWFuZChFUExfQ19BRFJfQlJPQURDQVNULAorCQkJCQkJCSAgICBrRXBsTm10Q21kUmVzZXROb2RlKTsKKwkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCS8vIHN0YXJ0IG5ldHdvcmsgc2NhbgorCQkJUmV0ID0gRXBsTm10TW51U3RhcnRCb290U3RlcDEoKTsKKworCQkJLy8gc3RhcnQgdGltZXIgZm9yIDB4MUY4OS8yIE1OVGltZW91dFByZU9wMV9VMzIKKwkJCU9iZFNpemUgPSBzaXplb2YoZHdUaW1lb3V0KTsKKwkJCVJldCA9IEVwbE9iZHVSZWFkRW50cnkoMHgxRjg5LCAyLCAmZHdUaW1lb3V0LCAmT2JkU2l6ZSk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoZHdUaW1lb3V0ICE9IDBMKSB7CisJCQkJZHdUaW1lb3V0IC89IDEwMDBMOworCQkJCWlmIChkd1RpbWVvdXQgPT0gMEwpIHsKKwkJCQkJZHdUaW1lb3V0ID0gMUw7CS8vIGF0IGxlYXN0IDEgbXMKKwkJCQl9CisJCQkJVGltZXJBcmcubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rTm10TW51OworCQkJCVRpbWVyQXJnLm1fdWxBcmcgPSAwOworCQkJCVJldCA9CisJCQkJICAgIEVwbFRpbWVydU1vZGlmeVRpbWVyTXMoJkVwbE5tdE1udUluc3RhbmNlX2cuCisJCQkJCQkJICAgbV9UaW1lckhkbE5tdFN0YXRlLAorCQkJCQkJCSAgIGR3VGltZW91dCwgVGltZXJBcmcpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQkvLyBub2RlIHByb2Nlc3NlcyBpc29jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIGZyYW1lcworCWNhc2Uga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwyOgorCQl7CisJCQkvLyBhZGQgaWRlbnRpZmllZCBDTnMgdG8gaXNvY2hyb25vdXMgcGhhc2UKKwkJCS8vIHNlbmQgRW5hYmxlUmVhZHlUb09wIHRvIGFsbCBpZGVudGlmaWVkIENOcworCQkJUmV0ID0gRXBsTm10TW51U3RhcnRCb290U3RlcDIoKTsKKworCQkJLy8gd2FpdCBmb3IgTk1UIHN0YXRlIGNoYW5nZSBvZiBDTnMKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gbm9kZSBzaG91bGQgYmUgY29uZmlndXJlZCB1bmQgYXBwbGljYXRpb24gaXMgcmVhZHkKKwljYXNlIGtFcGxObXRNc1JlYWR5VG9PcGVyYXRlOgorCQl7CisJCQkvLyBjaGVjayBpZiBQUmVzIG9mIENOcyBhcmUgT0sKKwkJCS8vIGQuay4gdGhhdCBtZWFucyB3YWl0IEN5Y2xlTGVuZ3RoICogTXVsdGlwbGV4Q3ljbGVDb3VudCAoaS5lLiBzdGFydCB0aW1lcikKKwkJCS8vICAgICAgYmVjYXVzZSBEbGxrIGNoZWNrcyBQUmVzIG9mIENOcyBhdXRvbWF0aWNhbGx5IGluIFJlYWR5VG9PcAorCQkJUmV0ID0gRXBsTm10TW51U3RhcnRDaGVja0NvbSgpOworCQkJYnJlYWs7CisJCX0KKworCQkvLyBub3JtYWwgd29yayBzdGF0ZQorCWNhc2Uga0VwbE5tdE1zT3BlcmF0aW9uYWw6CisJCXsKKwkJCS8vIHNlbmQgU3RhcnROb2RlIHRvIENOcworCQkJLy8gd2FpdCBmb3IgTk1UIHN0YXRlIGNoYW5nZSBvZiBDTnMKKwkJCVJldCA9IEVwbE5tdE1udVN0YXJ0Tm9kZXMoKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gbm8gRVBMIGN5Y2xlCisJCS8vIC0+IG5vcm1hbCBldGhlcm5ldCBjb21tdW5pY2F0aW9uCisJY2FzZSBrRXBsTm10TXNCYXNpY0V0aGVybmV0OgorCQl7CisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJeworLy8gICAgICAgICAgICBUUkFDRTAoIkVwbE5tdE1udUNiTm10U3RhdGVDaGFuZ2UoKTogdW5oYW5kbGVkIE5NVCBzdGF0ZVxuIik7CisJCX0KKwl9CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRNbnVDYkNoZWNrRXZlbnQKKy8vCisvLyBEZXNjcmlwdGlvbjogY2FsbGJhY2sgZnVua3Rpb24gZm9yIE5NVCBldmVudHMgYmVmb3JlIHRoZXkgYXJlIGFjdHVhbGx5IGV4ZWN1dGVkLgorLy8gICAgICAgICAgICAgIFRoZSBFUEwgQVBJIGxheWVyIG11c3QgZm9yd2FyZCBOTVQgZXZlbnRzIGZyb20gTm10Q251IG1vZHVsZS4KKy8vICAgICAgICAgICAgICBUaGlzIG1vZHVsZSB3aWxsIHJlamVjdCBzb21lIE5NVCBjb21tYW5kcyB3aGlsZSBNTi4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgTm10RXZlbnRfcCAgICAgICAgICAgICAgPSBvdXRzdGFuZGluZyBOTVQgZXZlbnQgZm9yIGFwcHJvdmFsCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8gICAgICAgICAgICAgICAgICAgICAga0VwbFJlamVjdCAgICAgID0gcmVqZWN0IHRoZSBOTVQgZXZlbnQKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRNbnVDYkNoZWNrRXZlbnQodEVwbE5tdEV2ZW50IE5tdEV2ZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdHVQcm9jZXNzRXZlbnQKKy8vCisvLyBEZXNjcmlwdGlvbjogcHJvY2Vzc2VzIGV2ZW50cyBmcm9tIGV2ZW50IHF1ZXVlCisvLworLy8gUGFyYW1ldGVyczogIHBFdmVudF9wICAgICAgICA9IHBvaW50ZXIgdG8gZXZlbnQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgID0gZXJyb3Jjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE5tdE1udVByb2Nlc3NFdmVudCh0RXBsRXZlbnQgKiBwRXZlbnRfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gcHJvY2VzcyBldmVudAorCXN3aXRjaCAocEV2ZW50X3AtPm1fRXZlbnRUeXBlKSB7CisJCS8vIHRpbWVyIGV2ZW50CisJY2FzZSBrRXBsRXZlbnRUeXBlVGltZXI6CisJCXsKKwkJCXRFcGxUaW1lckV2ZW50QXJnICpwVGltZXJFdmVudEFyZyA9CisJCQkgICAgKHRFcGxUaW1lckV2ZW50QXJnICopIHBFdmVudF9wLT5tX3BBcmc7CisJCQl1bnNpZ25lZCBpbnQgdWlOb2RlSWQ7CisKKwkJCXVpTm9kZUlkID0KKwkJCSAgICAodW5zaWduZWQgaW50KShwVGltZXJFdmVudEFyZy0+CisJCQkJCSAgIG1fdWxBcmcgJgorCQkJCQkgICBFUExfTk1UTU5VX1RJTUVSQVJHX05PREVfTUFTSyk7CisJCQlpZiAodWlOb2RlSWQgIT0gMCkgeworCQkJCXRFcGxPYmRTaXplIE9iZFNpemU7CisJCQkJQllURSBiTm10U3RhdGU7CisJCQkJdEVwbE5tdE1udU5vZGVJbmZvICpwTm9kZUluZm87CisKKwkJCQlwTm9kZUluZm8gPSBFUExfTk1UTU5VX0dFVF9OT0RFSU5GTyh1aU5vZGVJZCk7CisKKwkJCQlPYmRTaXplID0gMTsKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxPYmR1UmVhZEVudHJ5KDB4MUY4RSwgdWlOb2RlSWQsCisJCQkJCQkgICAgICZiTm10U3RhdGUsICZPYmRTaXplKTsKKwkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWlmICgocFRpbWVyRXZlbnRBcmctPgorCQkJCSAgICAgbV91bEFyZyAmIEVQTF9OTVRNTlVfVElNRVJBUkdfSURFTlRSRVEpICE9CisJCQkJICAgIDBMKSB7CisJCQkJCWlmICgocE5vZGVJbmZvLT4KKwkJCQkJICAgICBtX3dGbGFncyAmCisJCQkJCSAgICAgRVBMX05NVE1OVV9OT0RFX0ZMQUdfQ09VTlRfU1RBVFJFUSkKKwkJCQkJICAgICE9IChwVGltZXJFdmVudEFyZy0+bV91bEFyZyAmIEVQTF9OTVRNTlVfVElNRVJBUkdfQ09VTlRfU1IpKSB7CS8vIHRoaXMgaXMgYW4gb2xkIChhbHJlYWR5IGRlbGV0ZWQgb3IgbW9kaWZpZWQpIHRpbWVyCisJCQkJCQkvLyBidXQgbm90IHRoZSBjdXJyZW50IHRpbWVyCisJCQkJCQkvLyBzbyBkaXNjYXJkIGl0CisJCQkJCQlFUExfTk1UTU5VX0RCR19QT1NUX1RSQUNFX1ZBTFVFCisJCQkJCQkgICAgKGtFcGxObXRNbnVJbnROb2RlRXZlbnRUaW1lcklkZW50UmVxLAorCQkJCQkJICAgICB1aU5vZGVJZCwKKwkJCQkJCSAgICAgKChwTm9kZUluZm8tPgorCQkJCQkJICAgICAgIG1fTm9kZVN0YXRlIDw8IDgpCisJCQkJCQkgICAgICB8IDB4RkYpKTsKKworCQkJCQkJYnJlYWs7CisJCQkJCX0KKy8qCisgICAgICAgICAgICAgICAgICAgIEVQTF9OTVRNTlVfREJHX1BPU1RfVFJBQ0VfVkFMVUUoa0VwbE5tdE1udUludE5vZGVFdmVudFRpbWVySWRlbnRSZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlOb2RlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwTm9kZUluZm8tPm1fTm9kZVN0YXRlIDw8IDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMHg4MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgocE5vZGVJbmZvLT5tX3dGbGFncyAmIEVQTF9OTVRNTlVfTk9ERV9GTEFHX0NPVU5UX1NUQVRSRVEpID4+IDYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChwVGltZXJFdmVudEFyZy0+bV91bEFyZyAmIEVQTF9OTVRNTlVfVElNRVJBUkdfQ09VTlRfU1IpID4+IDgpKSk7CisqLworCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsTm10TW51UHJvY2Vzc0ludGVybmFsRXZlbnQKKwkJCQkJICAgICh1aU5vZGVJZCwKKwkJCQkJICAgICAodEVwbE5tdFN0YXRlKSAoYk5tdFN0YXRlIHwKKwkJCQkJCQkgICAgIEVQTF9OTVRfVFlQRV9DUyksCisJCQkJCSAgICAgRVBMX0VfTk9fRVJST1IsCisJCQkJCSAgICAga0VwbE5tdE1udUludE5vZGVFdmVudFRpbWVySWRlbnRSZXEpOworCQkJCX0KKworCQkJCWVsc2UgaWYgKChwVGltZXJFdmVudEFyZy0+CisJCQkJCSAgbV91bEFyZyAmIEVQTF9OTVRNTlVfVElNRVJBUkdfU1RBVFJFUSkKKwkJCQkJICE9IDBMKSB7CisJCQkJCWlmICgocE5vZGVJbmZvLT4KKwkJCQkJICAgICBtX3dGbGFncyAmCisJCQkJCSAgICAgRVBMX05NVE1OVV9OT0RFX0ZMQUdfQ09VTlRfU1RBVFJFUSkKKwkJCQkJICAgICE9IChwVGltZXJFdmVudEFyZy0+bV91bEFyZyAmIEVQTF9OTVRNTlVfVElNRVJBUkdfQ09VTlRfU1IpKSB7CS8vIHRoaXMgaXMgYW4gb2xkIChhbHJlYWR5IGRlbGV0ZWQgb3IgbW9kaWZpZWQpIHRpbWVyCisJCQkJCQkvLyBidXQgbm90IHRoZSBjdXJyZW50IHRpbWVyCisJCQkJCQkvLyBzbyBkaXNjYXJkIGl0CisJCQkJCQlFUExfTk1UTU5VX0RCR19QT1NUX1RSQUNFX1ZBTFVFCisJCQkJCQkgICAgKGtFcGxObXRNbnVJbnROb2RlRXZlbnRUaW1lclN0YXRSZXEsCisJCQkJCQkgICAgIHVpTm9kZUlkLAorCQkJCQkJICAgICAoKHBOb2RlSW5mby0+CisJCQkJCQkgICAgICAgbV9Ob2RlU3RhdGUgPDwgOCkKKwkJCQkJCSAgICAgIHwgMHhGRikpOworCisJCQkJCQlicmVhazsKKwkJCQkJfQorLyoKKyAgICAgICAgICAgICAgICAgICAgRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRShrRXBsTm10TW51SW50Tm9kZUV2ZW50VGltZXJTdGF0UmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpTm9kZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSA8PCA4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDB4ODAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKHBOb2RlSW5mby0+bV93RmxhZ3MgJiBFUExfTk1UTU5VX05PREVfRkxBR19DT1VOVF9TVEFUUkVRKSA+PiA2KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgocFRpbWVyRXZlbnRBcmctPm1fdWxBcmcgJiBFUExfTk1UTU5VX1RJTUVSQVJHX0NPVU5UX1NSKSA+PiA4KSkpOworKi8KKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbE5tdE1udVByb2Nlc3NJbnRlcm5hbEV2ZW50CisJCQkJCSAgICAodWlOb2RlSWQsCisJCQkJCSAgICAgKHRFcGxObXRTdGF0ZSkgKGJObXRTdGF0ZSB8CisJCQkJCQkJICAgICBFUExfTk1UX1RZUEVfQ1MpLAorCQkJCQkgICAgIEVQTF9FX05PX0VSUk9SLAorCQkJCQkgICAgIGtFcGxObXRNbnVJbnROb2RlRXZlbnRUaW1lclN0YXRSZXEpOworCQkJCX0KKworCQkJCWVsc2UgaWYgKChwVGltZXJFdmVudEFyZy0+CisJCQkJCSAgbV91bEFyZyAmCisJCQkJCSAgRVBMX05NVE1OVV9USU1FUkFSR19TVEFURV9NT04pICE9CisJCQkJCSAwTCkgeworCQkJCQlpZiAoKHBOb2RlSW5mby0+CisJCQkJCSAgICAgbV93RmxhZ3MgJgorCQkJCQkgICAgIEVQTF9OTVRNTlVfTk9ERV9GTEFHX0NPVU5UX1NUQVRSRVEpCisJCQkJCSAgICAhPSAocFRpbWVyRXZlbnRBcmctPm1fdWxBcmcgJiBFUExfTk1UTU5VX1RJTUVSQVJHX0NPVU5UX1NSKSkgewkvLyB0aGlzIGlzIGFuIG9sZCAoYWxyZWFkeSBkZWxldGVkIG9yIG1vZGlmaWVkKSB0aW1lcgorCQkJCQkJLy8gYnV0IG5vdCB0aGUgY3VycmVudCB0aW1lcgorCQkJCQkJLy8gc28gZGlzY2FyZCBpdAorCQkJCQkJRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRQorCQkJCQkJICAgIChrRXBsTm10TW51SW50Tm9kZUV2ZW50VGltZXJTdGF0ZU1vbiwKKwkJCQkJCSAgICAgdWlOb2RlSWQsCisJCQkJCQkgICAgICgocE5vZGVJbmZvLT4KKwkJCQkJCSAgICAgICBtX05vZGVTdGF0ZSA8PCA4KQorCQkJCQkJICAgICAgfCAweEZGKSk7CisKKwkJCQkJCWJyZWFrOworCQkJCQl9CisvKgorICAgICAgICAgICAgICAgICAgICBFUExfTk1UTU5VX0RCR19QT1NUX1RSQUNFX1ZBTFVFKGtFcGxObXRNbnVJbnROb2RlRXZlbnRUaW1lclN0YXRSZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlOb2RlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwTm9kZUluZm8tPm1fTm9kZVN0YXRlIDw8IDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMHg4MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgocE5vZGVJbmZvLT5tX3dGbGFncyAmIEVQTF9OTVRNTlVfTk9ERV9GTEFHX0NPVU5UX1NUQVRSRVEpID4+IDYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChwVGltZXJFdmVudEFyZy0+bV91bEFyZyAmIEVQTF9OTVRNTlVfVElNRVJBUkdfQ09VTlRfU1IpID4+IDgpKSk7CisqLworCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsTm10TW51UHJvY2Vzc0ludGVybmFsRXZlbnQKKwkJCQkJICAgICh1aU5vZGVJZCwKKwkJCQkJICAgICAodEVwbE5tdFN0YXRlKSAoYk5tdFN0YXRlIHwKKwkJCQkJCQkgICAgIEVQTF9OTVRfVFlQRV9DUyksCisJCQkJCSAgICAgRVBMX0VfTk9fRVJST1IsCisJCQkJCSAgICAga0VwbE5tdE1udUludE5vZGVFdmVudFRpbWVyU3RhdGVNb24pOworCQkJCX0KKworCQkJCWVsc2UgaWYgKChwVGltZXJFdmVudEFyZy0+CisJCQkJCSAgbV91bEFyZyAmIEVQTF9OTVRNTlVfVElNRVJBUkdfTE9OR0VSKQorCQkJCQkgIT0gMEwpIHsKKwkJCQkJaWYgKChwTm9kZUluZm8tPgorCQkJCQkgICAgIG1fd0ZsYWdzICYKKwkJCQkJICAgICBFUExfTk1UTU5VX05PREVfRkxBR19DT1VOVF9MT05HRVIpCisJCQkJCSAgICAhPSAocFRpbWVyRXZlbnRBcmctPm1fdWxBcmcgJiBFUExfTk1UTU5VX1RJTUVSQVJHX0NPVU5UX0xPKSkgewkvLyB0aGlzIGlzIGFuIG9sZCAoYWxyZWFkeSBkZWxldGVkIG9yIG1vZGlmaWVkKSB0aW1lcgorCQkJCQkJLy8gYnV0IG5vdCB0aGUgY3VycmVudCB0aW1lcgorCQkJCQkJLy8gc28gZGlzY2FyZCBpdAorCQkJCQkJRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRQorCQkJCQkJICAgIChrRXBsTm10TW51SW50Tm9kZUV2ZW50VGltZXJMb25nZXIsCisJCQkJCQkgICAgIHVpTm9kZUlkLAorCQkJCQkJICAgICAoKHBOb2RlSW5mby0+CisJCQkJCQkgICAgICAgbV9Ob2RlU3RhdGUgPDwgOCkKKwkJCQkJCSAgICAgIHwgMHhGRikpOworCisJCQkJCQlicmVhazsKKwkJCQkJfQorLyoKKyAgICAgICAgICAgICAgICAgICAgRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRShrRXBsTm10TW51SW50Tm9kZUV2ZW50VGltZXJMb25nZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlOb2RlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwTm9kZUluZm8tPm1fTm9kZVN0YXRlIDw8IDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMHg4MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgocE5vZGVJbmZvLT5tX3dGbGFncyAmIEVQTF9OTVRNTlVfTk9ERV9GTEFHX0NPVU5UX0xPTkdFUikgPj4gNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKHBUaW1lckV2ZW50QXJnLT5tX3VsQXJnICYgRVBMX05NVE1OVV9USU1FUkFSR19DT1VOVF9MTykgPj4gOCkpKTsKKyovCisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxObXRNbnVQcm9jZXNzSW50ZXJuYWxFdmVudAorCQkJCQkgICAgKHVpTm9kZUlkLAorCQkJCQkgICAgICh0RXBsTm10U3RhdGUpIChiTm10U3RhdGUgfAorCQkJCQkJCSAgICAgRVBMX05NVF9UWVBFX0NTKSwKKwkJCQkJICAgICBFUExfRV9OT19FUlJPUiwKKwkJCQkJICAgICBrRXBsTm10TW51SW50Tm9kZUV2ZW50VGltZXJMb25nZXIpOworCQkJCX0KKworCQkJfSBlbHNlIHsJLy8gZ2xvYmFsIHRpbWVyIGV2ZW50CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsRXZlbnRUeXBlSGVhcnRiZWF0OgorCQl7CisJCQl0RXBsSGVhcnRiZWF0RXZlbnQgKnBIZWFydGJlYXRFdmVudCA9CisJCQkgICAgKHRFcGxIZWFydGJlYXRFdmVudCAqKSBwRXZlbnRfcC0+bV9wQXJnOworCisJCQlSZXQgPQorCQkJICAgIEVwbE5tdE1udVByb2Nlc3NJbnRlcm5hbEV2ZW50KHBIZWFydGJlYXRFdmVudC0+CisJCQkJCQkJICBtX3VpTm9kZUlkLAorCQkJCQkJCSAgcEhlYXJ0YmVhdEV2ZW50LT4KKwkJCQkJCQkgIG1fTm10U3RhdGUsCisJCQkJCQkJICBwSGVhcnRiZWF0RXZlbnQtPgorCQkJCQkJCSAgbV93RXJyb3JDb2RlLAorCQkJCQkJCSAga0VwbE5tdE1udUludE5vZGVFdmVudEhlYXJ0YmVhdCk7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsRXZlbnRUeXBlTm10TW51Tm10Q21kU2VudDoKKwkJeworCQkJdEVwbEZyYW1lICpwRnJhbWUgPSAodEVwbEZyYW1lICopIHBFdmVudF9wLT5tX3BBcmc7CisJCQl1bnNpZ25lZCBpbnQgdWlOb2RlSWQ7CisJCQl0RXBsTm10Q29tbWFuZCBObXRDb21tYW5kOworCQkJQllURSBiTm10U3RhdGU7CisKKwkJCXVpTm9kZUlkID0gQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT5tX2xlX2JEc3ROb2RlSWQpOworCQkJTm10Q29tbWFuZCA9CisJCQkgICAgKHRFcGxObXRDb21tYW5kKSBBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWUtPm1fRGF0YS4KKwkJCQkJCQkgICAgICBtX0FzbmQubV9QYXlsb2FkLgorCQkJCQkJCSAgICAgIG1fTm10Q29tbWFuZFNlcnZpY2UuCisJCQkJCQkJICAgICAgbV9sZV9iTm10Q29tbWFuZElkKTsKKworCQkJc3dpdGNoIChObXRDb21tYW5kKSB7CisJCQljYXNlIGtFcGxObXRDbWRTdGFydE5vZGU6CisJCQkJYk5tdFN0YXRlID0KKwkJCQkgICAgKEJZVEUpIChrRXBsTm10Q3NPcGVyYXRpb25hbCAmIDB4RkYpOworCQkJCWJyZWFrOworCisJCQljYXNlIGtFcGxObXRDbWRTdG9wTm9kZToKKwkJCQliTm10U3RhdGUgPSAoQllURSkgKGtFcGxObXRDc1N0b3BwZWQgJiAweEZGKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBrRXBsTm10Q21kRW50ZXJQcmVPcGVyYXRpb25hbDI6CisJCQkJYk5tdFN0YXRlID0KKwkJCQkgICAgKEJZVEUpIChrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDIgJiAweEZGKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBrRXBsTm10Q21kRW5hYmxlUmVhZHlUb09wZXJhdGU6CisJCQkJLy8gZC5rLiBkbyBub3QgY2hhbmdlIGV4cGVjdGVkIG5vZGUgc3RhdGUsIGJlY2F1c2Ugb2YgRFMgMS4wLjAgNy4zLjEuMi4xIFBsYWluIE5NVCBTdGF0ZSBDb21tYW5kCisJCQkJLy8gICAgICBhbmQgYmVjYXVzZSBub2RlIG1heSBub3QgY2hhbmdlIE5NVCBzdGF0ZSB3aXRoaW4gRVBMX0NfTk1UX1NUQVRFX1RPTEVSQU5DRQorCQkJCWJObXRTdGF0ZSA9CisJCQkJICAgIChCWVRFKSAoa0VwbE5tdENzUHJlT3BlcmF0aW9uYWwyICYgMHhGRik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2Uga0VwbE5tdENtZFJlc2V0Tm9kZToKKwkJCWNhc2Uga0VwbE5tdENtZFJlc2V0Q29tbXVuaWNhdGlvbjoKKwkJCWNhc2Uga0VwbE5tdENtZFJlc2V0Q29uZmlndXJhdGlvbjoKKwkJCWNhc2Uga0VwbE5tdENtZFN3UmVzZXQ6CisJCQkJYk5tdFN0YXRlID0gKEJZVEUpIChrRXBsTm10Q3NOb3RBY3RpdmUgJiAweEZGKTsKKwkJCQkvLyBFcGxObXRNbnVQcm9jZXNzSW50ZXJuYWxFdmVudCgpIHNldHMgaW50ZXJuYWwgbm9kZSBzdGF0ZSB0byBrRXBsTm10TW51Tm9kZVN0YXRlVW5rbm93bgorCQkJCS8vIGFmdGVyIG5leHQgdW5yZXNwb25kZWQgSWRlbnRSZXF1ZXN0L1N0YXR1c1JlcXVlc3QKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisKKwkJCS8vIHByb2Nlc3MgYXMgaW50ZXJuYWwgZXZlbnQgd2hpY2ggdXBkYXRlIGV4cGVjdGVkIE5NVCBzdGF0ZSBpbiBPRAorCQkJaWYgKHVpTm9kZUlkICE9IEVQTF9DX0FEUl9CUk9BRENBU1QpIHsKKwkJCQlSZXQgPSBFcGxObXRNbnVQcm9jZXNzSW50ZXJuYWxFdmVudCh1aU5vZGVJZCwKKwkJCQkJCQkJICAgICh0RXBsTm10U3RhdGUpCisJCQkJCQkJCSAgICAoYk5tdFN0YXRlIHwKKwkJCQkJCQkJICAgICBFUExfTk1UX1RZUEVfQ1MpLAorCQkJCQkJCQkgICAgMCwKKwkJCQkJCQkJICAgIGtFcGxObXRNbnVJbnROb2RlRXZlbnRObXRDbWRTZW50KTsKKworCQkJfSBlbHNlIHsJLy8gcHJvY2VzcyBpbnRlcm5hbCBldmVudCBmb3IgYWxsIGFjdGl2ZSBub2RlcyAoZXhjZXB0IG15c2VsZikKKworCQkJCWZvciAodWlOb2RlSWQgPSAxOworCQkJCSAgICAgdWlOb2RlSWQgPD0KKwkJCQkgICAgIHRhYmVudHJpZXMoRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJCQkJCW1fYU5vZGVJbmZvKTsgdWlOb2RlSWQrKykgeworCQkJCQlpZiAoKEVQTF9OTVRNTlVfR0VUX05PREVJTkZPKHVpTm9kZUlkKS0+CisJCQkJCSAgICAgbV9kd05vZGVDZmcgJgorCQkJCQkgICAgIChFUExfTk9ERUFTU0lHTl9OT0RFX0lTX0NOIHwKKwkJCQkJICAgICAgRVBMX05PREVBU1NJR05fTk9ERV9FWElTVFMpKSAhPQorCQkJCQkgICAgMCkgeworCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxObXRNbnVQcm9jZXNzSW50ZXJuYWxFdmVudAorCQkJCQkJICAgICh1aU5vZGVJZCwKKwkJCQkJCSAgICAgKHRFcGxObXRTdGF0ZSkgKGJObXRTdGF0ZSB8CisJCQkJCQkJCSAgICAgRVBMX05NVF9UWVBFX0NTKSwKKwkJCQkJCSAgICAgMCwKKwkJCQkJCSAgICAga0VwbE5tdE1udUludE5vZGVFdmVudE5tdENtZFNlbnQpOworCisJCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJZ290byBFeGl0OworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJeworCQkJUmV0ID0ga0VwbE5tdEludmFsaWRFdmVudDsKKwkJfQorCisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdE1udUdldFJ1bm5pbmdUaW1lclN0YXRSZXEKKy8vCisvLyBEZXNjcmlwdGlvbjogcmV0dXJucyBhIGJpdCBmaWVsZCB3aXRoIHJ1bm5pbmcgU3RhdFJlcSB0aW1lcnMKKy8vICAgICAgICAgICAgICBqdXN0IGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMKKy8vCisvLyBQYXJhbWV0ZXJzOiAgKG5vbmUpCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbE5tdE1udUdldERpYWdub3N0aWNJbmZvKHVuc2lnbmVkIGludAorCQkJCQkgICAgICpwdWlNYW5kYXRvcnlTbGF2ZUNvdW50X3AsCisJCQkJCSAgICAgdW5zaWduZWQgaW50CisJCQkJCSAgICAgKnB1aVNpZ25hbFNsYXZlQ291bnRfcCwKKwkJCQkJICAgICBXT1JEICogcHdGbGFnc19wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlpZiAoKHB1aU1hbmRhdG9yeVNsYXZlQ291bnRfcCA9PSBOVUxMKQorCSAgICB8fCAocHVpU2lnbmFsU2xhdmVDb3VudF9wID09IE5VTEwpCisJICAgIHx8IChwd0ZsYWdzX3AgPT0gTlVMTCkpIHsKKwkJUmV0ID0ga0VwbE5tdEludmFsaWRQYXJhbTsKKwkJZ290byBFeGl0OworCX0KKworCSpwdWlNYW5kYXRvcnlTbGF2ZUNvdW50X3AgPSBFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlNYW5kYXRvcnlTbGF2ZUNvdW50OworCSpwdWlTaWduYWxTbGF2ZUNvdW50X3AgPSBFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlTaWduYWxTbGF2ZUNvdW50OworCSpwd0ZsYWdzX3AgPSBFcGxObXRNbnVJbnN0YW5jZV9nLm1fd0ZsYWdzOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdE1udUdldFJ1bm5pbmdUaW1lclN0YXRSZXEKKy8vCisvLyBEZXNjcmlwdGlvbjogcmV0dXJucyBhIGJpdCBmaWVsZCB3aXRoIHJ1bm5pbmcgU3RhdFJlcSB0aW1lcnMKKy8vICAgICAgICAgICAgICBqdXN0IGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMKKy8vCisvLyBQYXJhbWV0ZXJzOiAgKG5vbmUpCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKgorRFdPUkQgRXBsTm10TW51R2V0UnVubmluZ1RpbWVyU3RhdFJlcSh2b2lkKQorewordEVwbEtlcm5lbCAgICAgIFJldCA9IGtFcGxTdWNjZXNzZnVsOwordW5zaWduZWQgaW50ICAgIHVpSW5kZXg7Cit0RXBsTm10TW51Tm9kZUluZm8qIHBOb2RlSW5mbzsKKworICAgIHBOb2RlSW5mbyA9IEVwbE5tdE1udUluc3RhbmNlX2cubV9hTm9kZUluZm87CisgICAgZm9yICh1aUluZGV4ID0gMTsgdWlJbmRleCA8PSB0YWJlbnRyaWVzKEVwbE5tdE1udUluc3RhbmNlX2cubV9hTm9kZUluZm8pOyB1aUluZGV4KyssIHBOb2RlSW5mbysrKQorICAgIHsKKyAgICAgICAgaWYgKHBOb2RlSW5mby0+bV9Ob2RlU3RhdGUgPT0ga0VwbE5tdE1udU5vZGVTdGF0ZUNvbmZpZ3VyZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHJlc2V0IGZsYWcgInNjYW5uZWQgb25jZSIKKyAgICAgICAgICAgIHBOb2RlSW5mby0+bV93RmxhZ3MgJj0gfkVQTF9OTVRNTlVfTk9ERV9GTEFHX1NDQU5ORUQ7CisKKyAgICAgICAgICAgIFJldCA9IEVwbE5tdE1udU5vZGVCb290U3RlcDIodWlJbmRleCwgcE5vZGVJbmZvKTsKKyAgICAgICAgICAgIGlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpU2lnbmFsU2xhdmVDb3VudCsrOworICAgICAgICAgICAgLy8gc2lnbmFsIHNsYXZlIGNvdW50ZXIgc2hhbGwgYmUgZGVjcmVtZW50ZWQgaWYgU3RhdHVzUmVxdWVzdCB3YXMgc2VudCBvbmNlIHRvIGEgQ04KKyAgICAgICAgICAgIC8vIG1hbmRhdG9yeSBzbGF2ZSBjb3VudGVyIHNoYWxsIGJlIGRlY3JlbWVudGVkIGlmIG1hbmRhdG9yeSBDTiBpcyBSZWFkeVRvT3AKKyAgICAgICAgfQorICAgIH0KKworRXhpdDoKKyAgICByZXR1cm4gUmV0OworfQorKi8KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdE1udUNiTm10UmVxdWVzdAorLy8KKy8vIERlc2NyaXB0aW9uOiBjYWxsYmFjayBmdW5rdGlvbiBmb3IgTm10UmVxdWVzdAorLy8KKy8vIFBhcmFtZXRlcnM6ICBwRnJhbWVJbmZvX3AgICAgICAgICAgICA9IEZyYW1lIHdpdGggdGhlIE5tdFJlcXVlc3QKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRNbnVDYk5tdFJlcXVlc3QodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gJCQkIHBlcmZvcm0gTk1UUmVxdWVzdAorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdE1udUNiSWRlbnRSZXNwb25zZQorLy8KKy8vIERlc2NyaXB0aW9uOiBjYWxsYmFjayBmdW5rdGlvbiBmb3IgSWRlbnRSZXNwb25zZQorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICAgICAgICAgICAgICA9IG5vZGUgSUQgZm9yIHdoaWNoIElkZW50UmVwb25zZSB3YXMgcmVjZWl2ZWQKKy8vICAgICAgICAgICAgICBwSWRlbnRSZXNwb25zZV9wICAgICAgICA9IHBvaW50ZXIgdG8gSWRlbnRSZXNwb25zZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgTlVMTCBpZiBub2RlIGRpZCBub3QgYW5zd2VyCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRNbnVDYklkZW50UmVzcG9uc2UodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCQkgIHRFcGxJZGVudFJlc3BvbnNlICoKKwkJCQkJCSAgcElkZW50UmVzcG9uc2VfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJaWYgKHBJZGVudFJlc3BvbnNlX3AgPT0gTlVMTCkgewkvLyBub2RlIGRpZCBub3QgYW5zd2VyCisJCVJldCA9IEVwbE5tdE1udVByb2Nlc3NJbnRlcm5hbEV2ZW50KHVpTm9kZUlkX3AsIGtFcGxObXRDc05vdEFjdGl2ZSwgRVBMX0VfTk1UX05PX0lERU5UX1JFUywJLy8gd2FzIEVQTF9FX05PX0VSUk9SCisJCQkJCQkgICAga0VwbE5tdE1udUludE5vZGVFdmVudE5vSWRlbnRSZXNwb25zZSk7CisJfSBlbHNlIHsJCS8vIG5vZGUgYW5zd2VyZWQgSWRlbnRSZXF1ZXN0CisJCXRFcGxPYmRTaXplIE9iZFNpemU7CisJCURXT1JEIGR3RGV2VHlwZTsKKwkJV09SRCB3RXJyb3JDb2RlID0gRVBMX0VfTk9fRVJST1I7CisJCXRFcGxObXRTdGF0ZSBObXRTdGF0ZSA9CisJCSAgICAodEVwbE5tdFN0YXRlKSAoQW1pR2V0Qnl0ZUZyb21MZQorCQkJCSAgICAoJnBJZGVudFJlc3BvbnNlX3AtPgorCQkJCSAgICAgbV9sZV9iTm10U3RhdHVzKSB8IEVQTF9OTVRfVFlQRV9DUyk7CisKKwkJLy8gY2hlY2sgSWRlbnRSZXNwb25zZSAkJCQgbW92ZSB0byBQcm9jZXNzSW50ZXJuLCBiZWNhdXNlIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBhbHNvIGlmIENOCisKKwkJLy8gY2hlY2sgRGV2aWNlVHlwZSAoMHgxRjg0KQorCQlPYmRTaXplID0gNDsKKwkJUmV0ID0KKwkJICAgIEVwbE9iZHVSZWFkRW50cnkoMHgxRjg0LCB1aU5vZGVJZF9wLCAmZHdEZXZUeXBlLCAmT2JkU2l6ZSk7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQlpZiAoZHdEZXZUeXBlICE9IDBMKSB7CS8vIGFjdHVhbGx5IGNvbXBhcmUgaXQgd2l0aCBEZXZpY2VUeXBlIGZyb20gSWRlbnRSZXNwb25zZQorCQkJaWYgKEFtaUdldER3b3JkRnJvbUxlKCZwSWRlbnRSZXNwb25zZV9wLT5tX2xlX2R3RGV2aWNlVHlwZSkgIT0gZHdEZXZUeXBlKSB7CS8vIHdyb25nIERldmljZVR5cGUKKwkJCQlObXRTdGF0ZSA9IGtFcGxObXRDc05vdEFjdGl2ZTsKKwkJCQl3RXJyb3JDb2RlID0gRVBMX0VfTk1UX0JQTzFfREVWSUNFX1RZUEU7CisJCQl9CisJCX0KKworCQlSZXQgPSBFcGxObXRNbnVQcm9jZXNzSW50ZXJuYWxFdmVudCh1aU5vZGVJZF9wLAorCQkJCQkJICAgIE5tdFN0YXRlLAorCQkJCQkJICAgIHdFcnJvckNvZGUsCisJCQkJCQkgICAga0VwbE5tdE1udUludE5vZGVFdmVudElkZW50UmVzcG9uc2UpOworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRNbnVDYlN0YXR1c1Jlc3BvbnNlCisvLworLy8gRGVzY3JpcHRpb246IGNhbGxiYWNrIGZ1bmt0aW9uIGZvciBTdGF0dXNSZXNwb25zZQorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICAgICAgICAgICAgICA9IG5vZGUgSUQgZm9yIHdoaWNoIElkZW50UmVwb25zZSB3YXMgcmVjZWl2ZWQKKy8vICAgICAgICAgICAgICBwSWRlbnRSZXNwb25zZV9wICAgICAgICA9IHBvaW50ZXIgdG8gSWRlbnRSZXNwb25zZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgTlVMTCBpZiBub2RlIGRpZCBub3QgYW5zd2VyCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRNbnVDYlN0YXR1c1Jlc3BvbnNlKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkJICAgdEVwbFN0YXR1c1Jlc3BvbnNlICoKKwkJCQkJCSAgIHBTdGF0dXNSZXNwb25zZV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlpZiAocFN0YXR1c1Jlc3BvbnNlX3AgPT0gTlVMTCkgewkvLyBub2RlIGRpZCBub3QgYW5zd2VyCisJCVJldCA9IEVwbE5tdE1udVByb2Nlc3NJbnRlcm5hbEV2ZW50KHVpTm9kZUlkX3AsIGtFcGxObXRDc05vdEFjdGl2ZSwgRVBMX0VfTk1UX05PX1NUQVRVU19SRVMsCS8vIHdhcyBFUExfRV9OT19FUlJPUgorCQkJCQkJICAgIGtFcGxObXRNbnVJbnROb2RlRXZlbnROb1N0YXR1c1Jlc3BvbnNlKTsKKwl9IGVsc2UgewkJLy8gbm9kZSBhbnN3ZXJlZCBTdGF0dXNSZXF1ZXN0CisJCVJldCA9IEVwbE5tdE1udVByb2Nlc3NJbnRlcm5hbEV2ZW50KHVpTm9kZUlkX3AsCisJCQkJCQkgICAgKHRFcGxObXRTdGF0ZSkKKwkJCQkJCSAgICAoQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJICAgICAoJnBTdGF0dXNSZXNwb25zZV9wLT4KKwkJCQkJCSAgICAgIG1fbGVfYk5tdFN0YXR1cykgfAorCQkJCQkJICAgICBFUExfTk1UX1RZUEVfQ1MpLAorCQkJCQkJICAgIEVQTF9FX05PX0VSUk9SLAorCQkJCQkJICAgIGtFcGxObXRNbnVJbnROb2RlRXZlbnRTdGF0dXNSZXNwb25zZSk7CisJfQorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10TW51U3RhcnRCb290U3RlcDEKKy8vCisvLyBEZXNjcmlwdGlvbjogc3RhcnRzIEJvb3RTdGVwMQorLy8KKy8vIFBhcmFtZXRlcnM6ICAobm9uZSkKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsTm10TW51U3RhcnRCb290U3RlcDEodm9pZCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXVuc2lnbmVkIGludCB1aVN1YkluZGV4OworCXVuc2lnbmVkIGludCB1aUxvY2FsTm9kZUlkOworCURXT1JEIGR3Tm9kZUNmZzsKKwl0RXBsT2JkU2l6ZSBPYmRTaXplOworCisJLy8gJCQkIGQuay46IHNhdmUgY3VycmVudCB0aW1lIGZvciAweDFGODkvMiBNTlRpbWVvdXRQcmVPcDFfVTMyCisKKwkvLyBzdGFydCBuZXR3b3JrIHNjYW4KKwlFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlNYW5kYXRvcnlTbGF2ZUNvdW50ID0gMDsKKwlFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlTaWduYWxTbGF2ZUNvdW50ID0gMDsKKwkvLyBjaGVjayAweDFGODEKKwl1aUxvY2FsTm9kZUlkID0gRXBsT2JkdUdldE5vZGVJZCgpOworCWZvciAodWlTdWJJbmRleCA9IDE7IHVpU3ViSW5kZXggPD0gMjU0OyB1aVN1YkluZGV4KyspIHsKKwkJT2JkU2l6ZSA9IDQ7CisJCVJldCA9CisJCSAgICBFcGxPYmR1UmVhZEVudHJ5KDB4MUY4MSwgdWlTdWJJbmRleCwgJmR3Tm9kZUNmZywgJk9iZFNpemUpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJaWYgKHVpU3ViSW5kZXggIT0gdWlMb2NhbE5vZGVJZCkgeworCQkJLy8gcmVzZXQgZmxhZ3MgIm5vdCBzY2FubmVkIiBhbmQgImlzb2Nocm9ub3VzIgorCQkJRVBMX05NVE1OVV9HRVRfTk9ERUlORk8odWlTdWJJbmRleCktPm1fd0ZsYWdzICY9CisJCQkgICAgfihFUExfTk1UTU5VX05PREVfRkxBR19JU09DSFJPTiB8CisJCQkgICAgICBFUExfTk1UTU5VX05PREVfRkxBR19OT1RfU0NBTk5FRCk7CisKKwkJCWlmICh1aVN1YkluZGV4ID09IEVQTF9DX0FEUl9ESUFHX0RFRl9OT0RFX0lEKSB7CS8vIGRpYWdub3N0aWMgbm9kZSBtdXN0IGJlIHNjYW5uZWQgYnkgTU4gaW4gYW55IGNhc2UKKwkJCQlkd05vZGVDZmcgfD0KKwkJCQkgICAgKEVQTF9OT0RFQVNTSUdOX05PREVfSVNfQ04gfAorCQkJCSAgICAgRVBMX05PREVBU1NJR05fTk9ERV9FWElTVFMpOworCQkJCS8vIGFuZCBpdCBtdXN0IGJlIGlzb2Nocm9ub3VzbHkgYWNjZXNzZWQKKwkJCQlkd05vZGVDZmcgJj0gfkVQTF9OT0RFQVNTSUdOX0FTWU5DT05MWV9OT0RFOworCQkJfQorCQkJLy8gc2F2ZSBub2RlIGNvbmZpZyBpbiBsb2NhbCBub2RlIGluZm8gc3RydWN0dXJlCisJCQlFUExfTk1UTU5VX0dFVF9OT0RFSU5GTyh1aVN1YkluZGV4KS0+bV9kd05vZGVDZmcgPQorCQkJICAgIGR3Tm9kZUNmZzsKKwkJCUVQTF9OTVRNTlVfR0VUX05PREVJTkZPKHVpU3ViSW5kZXgpLT5tX05vZGVTdGF0ZSA9CisJCQkgICAga0VwbE5tdE1udU5vZGVTdGF0ZVVua25vd247CisKKwkJCWlmICgoZHdOb2RlQ2ZnICYgKEVQTF9OT0RFQVNTSUdOX05PREVfSVNfQ04gfCBFUExfTk9ERUFTU0lHTl9OT0RFX0VYSVNUUykpICE9IDApIHsJLy8gbm9kZSBpcyBjb25maWd1cmVkIGFzIENOCisJCQkJLy8gaWRlbnRpZnkgdGhlIG5vZGUKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxJZGVudHVSZXF1ZXN0SWRlbnRSZXNwb25zZSh1aVN1YkluZGV4LAorCQkJCQkJCQkgIEVwbE5tdE1udUNiSWRlbnRSZXNwb25zZSk7CisJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJCS8vIHNldCBmbGFnICJub3Qgc2Nhbm5lZCIKKwkJCQlFUExfTk1UTU5VX0dFVF9OT0RFSU5GTyh1aVN1YkluZGV4KS0+bV93RmxhZ3MgfD0KKwkJCQkgICAgRVBMX05NVE1OVV9OT0RFX0ZMQUdfTk9UX1NDQU5ORUQ7CisJCQkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpU2lnbmFsU2xhdmVDb3VudCsrOworCQkJCS8vIHNpZ25hbCBzbGF2ZSBjb3VudGVyIHNoYWxsIGJlIGRlY3JlbWVudGVkIGlmIElkZW50UmVxdWVzdCB3YXMgc2VudCBvbmNlIHRvIGEgQ04KKworCQkJCWlmICgoZHdOb2RlQ2ZnICYgRVBMX05PREVBU1NJR05fTUFOREFUT1JZX0NOKSAhPSAwKSB7CS8vIG5vZGUgaXMgYSBtYW5kYXRvcnkgQ04KKwkJCQkJRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fdWlNYW5kYXRvcnlTbGF2ZUNvdW50Kys7CisJCQkJCS8vIG1hbmRhdG9yeSBzbGF2ZSBjb3VudGVyIHNoYWxsIGJlIGRlY3JlbWVudGVkIGlmIG1hbmRhdG9yeSBDTiB3YXMgY29uZmlndXJlZCBzdWNjZXNzZnVsbHkKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CS8vIHN1YmluZGV4IG9mIE1OCisJCQlpZiAoKGR3Tm9kZUNmZyAmIChFUExfTk9ERUFTU0lHTl9NTl9QUkVTIHwgRVBMX05PREVBU1NJR05fTk9ERV9FWElTVFMpKSAhPSAwKSB7CS8vIE1OIHNoYWxsIHNlbmQgUFJlcworCQkJCXRFcGxEbGxOb2RlSW5mbyBEbGxOb2RlSW5mbzsKKworCQkJCUVQTF9NRU1TRVQoJkRsbE5vZGVJbmZvLCAwLAorCQkJCQkgICBzaXplb2YoRGxsTm9kZUluZm8pKTsKKwkJCQlEbGxOb2RlSW5mby5tX3VpTm9kZUlkID0gdWlMb2NhbE5vZGVJZDsKKworCQkJCVJldCA9IEVwbERsbHVDYWxBZGROb2RlKCZEbGxOb2RlSW5mbyk7CisJCQl9CisJCX0KKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10TW51U3RhcnRCb290U3RlcDIKKy8vCisvLyBEZXNjcmlwdGlvbjogc3RhcnRzIEJvb3RTdGVwMi4KKy8vICAgICAgICAgICAgICBUaGF0IG1lYW5zIGFkZCBub2RlcyB0byBpc29jaHJvbm91cyBwaGFzZSBhbmQgc2VuZAorLy8gICAgICAgICAgICAgIE5NVCBFbmFibGVSZWFkeVRvT3AuCisvLworLy8gUGFyYW1ldGVyczogIChub25lKQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxObXRNbnVTdGFydEJvb3RTdGVwMih2b2lkKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdW5zaWduZWQgaW50IHVpSW5kZXg7CisJdEVwbE5tdE1udU5vZGVJbmZvICpwTm9kZUluZm87CisKKwlpZiAoKEVwbE5tdE1udUluc3RhbmNlX2cubV93RmxhZ3MgJiBFUExfTk1UTU5VX0ZMQUdfSEFMVEVEKSA9PSAwKSB7CS8vIGJvb3QgcHJvY2VzcyBpcyBub3QgaGFsdGVkCisJCS8vIGFkZCBub2RlcyB0byBpc29jaHJvbm91cyBwaGFzZSBhbmQgc2VuZCBOTVQgRW5hYmxlUmVhZHlUb09wCisJCUVwbE5tdE1udUluc3RhbmNlX2cubV91aU1hbmRhdG9yeVNsYXZlQ291bnQgPSAwOworCQlFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlTaWduYWxTbGF2ZUNvdW50ID0gMDsKKwkJLy8gcmVzZXQgZmxhZyB0aGF0IGFwcGxpY2F0aW9uIHdhcyBpbmZvcm1lZCBhYm91dCBwb3NzaWJsZSBzdGF0ZSBjaGFuZ2UKKwkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3dGbGFncyAmPSB+RVBMX05NVE1OVV9GTEFHX0FQUF9JTkZPUk1FRDsKKworCQlwTm9kZUluZm8gPSBFcGxObXRNbnVJbnN0YW5jZV9nLm1fYU5vZGVJbmZvOworCQlmb3IgKHVpSW5kZXggPSAxOworCQkgICAgIHVpSW5kZXggPD0gdGFiZW50cmllcyhFcGxObXRNbnVJbnN0YW5jZV9nLm1fYU5vZGVJbmZvKTsKKwkJICAgICB1aUluZGV4KyssIHBOb2RlSW5mbysrKSB7CisJCQlpZiAocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSA9PQorCQkJICAgIGtFcGxObXRNbnVOb2RlU3RhdGVDb25maWd1cmVkKSB7CisJCQkJUmV0ID0KKwkJCQkgICAgRXBsTm10TW51Tm9kZUJvb3RTdGVwMih1aUluZGV4LCBwTm9kZUluZm8pOworCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKwkJCQkvLyBzZXQgZmxhZyAibm90IHNjYW5uZWQiCisJCQkJcE5vZGVJbmZvLT5tX3dGbGFncyB8PQorCQkJCSAgICBFUExfTk1UTU5VX05PREVfRkxBR19OT1RfU0NBTk5FRDsKKworCQkJCUVwbE5tdE1udUluc3RhbmNlX2cubV91aVNpZ25hbFNsYXZlQ291bnQrKzsKKwkJCQkvLyBzaWduYWwgc2xhdmUgY291bnRlciBzaGFsbCBiZSBkZWNyZW1lbnRlZCBpZiBTdGF0dXNSZXF1ZXN0IHdhcyBzZW50IG9uY2UgdG8gYSBDTgorCisJCQkJaWYgKChwTm9kZUluZm8tPm1fZHdOb2RlQ2ZnICYgRVBMX05PREVBU1NJR05fTUFOREFUT1JZX0NOKSAhPSAwKSB7CS8vIG5vZGUgaXMgYSBtYW5kYXRvcnkgQ04KKwkJCQkJRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fdWlNYW5kYXRvcnlTbGF2ZUNvdW50Kys7CisJCQkJfQorCQkJCS8vIG1hbmRhdG9yeSBzbGF2ZSBjb3VudGVyIHNoYWxsIGJlIGRlY3JlbWVudGVkIGlmIG1hbmRhdG9yeSBDTiBpcyBSZWFkeVRvT3AKKwkJCX0KKwkJfQorCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRNbnVOb2RlQm9vdFN0ZXAyCisvLworLy8gRGVzY3JpcHRpb246IHN0YXJ0cyBCb290U3RlcDIgZm9yIHRoZSBzcGVjaWZpZWQgbm9kZS4KKy8vICAgICAgICAgICAgICBUaGlzIG1lYW5zIHRoZSBDTiBpcyBhZGRlZCB0byBpc29jaHJvbm91cyBwaGFzZSBpZiBub3QKKy8vICAgICAgICAgICAgICBhc3luYy1vbmx5IGFuZCBpdCBnZXRzIHRoZSBOTVQgY29tbWFuZCBFbmFibGVSZWFkeVRvT3AuCisvLyAgICAgICAgICAgICAgVGhlIENOIG11c3QgYmUgaW4gbm9kZSBzdGF0ZSBDb25maWd1cmVkLCB3aGVuIGl0IGVudGVycworLy8gICAgICAgICAgICAgIEJvb3RTdGVwMi4gV2hlbiBCb290U3RlcDIgZmluaXNoZXMsIHRoZSBDTiBpcyBpbiBub2RlIHN0YXRlCisvLyAgICAgICAgICAgICAgUmVhZHlUb09wLgorLy8gICAgICAgICAgICAgIElmIFRpbWVvdXRSZWFkeVRvT3AgaW4gb2JqZWN0IDB4MUY4OS81IGlzIGNvbmZpZ3VyZWQsCisvLyAgICAgICAgICAgICAgVGltZXJIZGxMb25nZXIgd2lsbCBiZSBzdGFydGVkIHdpdGggdGhpcyB0aW1lb3V0LgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICAgICAgICAgICAgICA9IG5vZGUgSUQKKy8vICAgICAgICAgICAgICBwTm9kZUluZm9fcCAgICAgICAgICAgICA9IHBvaW50ZXIgdG8gaW50ZXJuYWwgbm9kZSBpbmZvIHN0cnVjdHVyZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxObXRNbnVOb2RlQm9vdFN0ZXAyKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkgdEVwbE5tdE1udU5vZGVJbmZvICogcE5vZGVJbmZvX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsRGxsTm9kZUluZm8gRGxsTm9kZUluZm87CisJRFdPUkQgZHdOb2RlQ2ZnOworCXRFcGxPYmRTaXplIE9iZFNpemU7CisJdEVwbFRpbWVyQXJnIFRpbWVyQXJnOworCisJZHdOb2RlQ2ZnID0gcE5vZGVJbmZvX3AtPm1fZHdOb2RlQ2ZnOworCWlmICgoZHdOb2RlQ2ZnICYgRVBMX05PREVBU1NJR05fQVNZTkNPTkxZX05PREUpID09IDApIHsJLy8gYWRkIG5vZGUgdG8gaXNvY2hyb25vdXMgcGhhc2UKKwkJRGxsTm9kZUluZm8ubV91aU5vZGVJZCA9IHVpTm9kZUlkX3A7CisJCU9iZFNpemUgPSA0OworCQlSZXQgPQorCQkgICAgRXBsT2JkdVJlYWRFbnRyeSgweDFGOTIsIHVpTm9kZUlkX3AsCisJCQkJICAgICAmRGxsTm9kZUluZm8ubV9kd1ByZXNUaW1lb3V0LCAmT2JkU2l6ZSk7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCisJCU9iZFNpemUgPSAyOworCQlSZXQgPQorCQkgICAgRXBsT2JkdVJlYWRFbnRyeSgweDFGOEIsIHVpTm9kZUlkX3AsCisJCQkJICAgICAmRGxsTm9kZUluZm8ubV93UHJlcVBheWxvYWRMaW1pdCwKKwkJCQkgICAgICZPYmRTaXplKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisKKwkJT2JkU2l6ZSA9IDI7CisJCVJldCA9CisJCSAgICBFcGxPYmR1UmVhZEVudHJ5KDB4MUY4RCwgdWlOb2RlSWRfcCwKKwkJCQkgICAgICZEbGxOb2RlSW5mby5tX3dQcmVzUGF5bG9hZExpbWl0LAorCQkJCSAgICAgJk9iZFNpemUpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKworCQlwTm9kZUluZm9fcC0+bV93RmxhZ3MgfD0gRVBMX05NVE1OVV9OT0RFX0ZMQUdfSVNPQ0hST047CisKKwkJUmV0ID0gRXBsRGxsdUNhbEFkZE5vZGUoJkRsbE5vZGVJbmZvKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisKKwl9CisKKwlFUExfTk1UTU5VX0RCR19QT1NUX1RSQUNFX1ZBTFVFKDAsCisJCQkJCXVpTm9kZUlkX3AsCisJCQkJCWtFcGxObXRDbWRFbmFibGVSZWFkeVRvT3BlcmF0ZSk7CisKKwlSZXQgPQorCSAgICBFcGxObXRNbnVTZW5kTm10Q29tbWFuZCh1aU5vZGVJZF9wLCBrRXBsTm10Q21kRW5hYmxlUmVhZHlUb09wZXJhdGUpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCWlmIChFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWxUaW1lb3V0UmVhZHlUb09wICE9IDBMKSB7CS8vIHN0YXJ0IHRpbWVyCisJCS8vIHdoZW4gdGhlIHRpbWVyIGV4cGlyZXMgdGhlIENOIG11c3QgYmUgUmVhZHlUb09wCisJCUVQTF9OTVRNTlVfU0VUX0ZMQUdTX1RJTUVSQVJHX0xPTkdFUihwTm9kZUluZm9fcCwgdWlOb2RlSWRfcCwKKwkJCQkJCSAgICAgVGltZXJBcmcpOworLy8gICAgICAgIFRpbWVyQXJnLm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua05tdE1udTsKKy8vICAgICAgICBUaW1lckFyZy5tX3VsQXJnID0gRVBMX05NVE1OVV9USU1FUkFSR19MT05HRVIgfCB1aU5vZGVJZF9wOworCQlSZXQgPQorCQkgICAgRXBsVGltZXJ1TW9kaWZ5VGltZXJNcygmcE5vZGVJbmZvX3AtPm1fVGltZXJIZGxMb25nZXIsCisJCQkJCSAgIEVwbE5tdE1udUluc3RhbmNlX2cuCisJCQkJCSAgIG1fdWxUaW1lb3V0UmVhZHlUb09wLCBUaW1lckFyZyk7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdE1udVN0YXJ0Q2hlY2tDb20KKy8vCisvLyBEZXNjcmlwdGlvbjogc3RhcnRzIENoZWNrQ29tbXVuaWNhdGlvbgorLy8KKy8vIFBhcmFtZXRlcnM6ICAobm9uZSkKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsTm10TW51U3RhcnRDaGVja0NvbSh2b2lkKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdW5zaWduZWQgaW50IHVpSW5kZXg7CisJdEVwbE5tdE1udU5vZGVJbmZvICpwTm9kZUluZm87CisKKwlpZiAoKEVwbE5tdE1udUluc3RhbmNlX2cubV93RmxhZ3MgJiBFUExfTk1UTU5VX0ZMQUdfSEFMVEVEKSA9PSAwKSB7CS8vIGJvb3QgcHJvY2VzcyBpcyBub3QgaGFsdGVkCisJCS8vIHdhaXQgc29tZSB0aW1lIGFuZCBjaGVjayB0aGF0IG5vIGNvbW11bmljYXRpb24gZXJyb3Igb2NjdXJzCisJCUVwbE5tdE1udUluc3RhbmNlX2cubV91aU1hbmRhdG9yeVNsYXZlQ291bnQgPSAwOworCQlFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlTaWduYWxTbGF2ZUNvdW50ID0gMDsKKwkJLy8gcmVzZXQgZmxhZyB0aGF0IGFwcGxpY2F0aW9uIHdhcyBpbmZvcm1lZCBhYm91dCBwb3NzaWJsZSBzdGF0ZSBjaGFuZ2UKKwkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3dGbGFncyAmPSB+RVBMX05NVE1OVV9GTEFHX0FQUF9JTkZPUk1FRDsKKworCQlwTm9kZUluZm8gPSBFcGxObXRNbnVJbnN0YW5jZV9nLm1fYU5vZGVJbmZvOworCQlmb3IgKHVpSW5kZXggPSAxOworCQkgICAgIHVpSW5kZXggPD0gdGFiZW50cmllcyhFcGxObXRNbnVJbnN0YW5jZV9nLm1fYU5vZGVJbmZvKTsKKwkJICAgICB1aUluZGV4KyssIHBOb2RlSW5mbysrKSB7CisJCQlpZiAocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSA9PQorCQkJICAgIGtFcGxObXRNbnVOb2RlU3RhdGVSZWFkeVRvT3ApIHsKKwkJCQlSZXQgPSBFcGxObXRNbnVOb2RlQ2hlY2tDb20odWlJbmRleCwgcE5vZGVJbmZvKTsKKwkJCQlpZiAoUmV0ID09IGtFcGxSZWplY3QpIHsJLy8gdGltZXIgd2FzIHN0YXJ0ZWQKKwkJCQkJLy8gd2FpdCB1bnRpbCBpdCBleHBpcmVzCisJCQkJCWlmICgocE5vZGVJbmZvLT5tX2R3Tm9kZUNmZyAmIEVQTF9OT0RFQVNTSUdOX01BTkRBVE9SWV9DTikgIT0gMCkgewkvLyBub2RlIGlzIGEgbWFuZGF0b3J5IENOCisJCQkJCQlFcGxObXRNbnVJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fdWlNYW5kYXRvcnlTbGF2ZUNvdW50Kys7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJCS8vIHNldCBmbGFnICJub3Qgc2Nhbm5lZCIKKwkJCQlwTm9kZUluZm8tPm1fd0ZsYWdzIHw9CisJCQkJICAgIEVQTF9OTVRNTlVfTk9ERV9GTEFHX05PVF9TQ0FOTkVEOworCisJCQkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpU2lnbmFsU2xhdmVDb3VudCsrOworCQkJCS8vIHNpZ25hbCBzbGF2ZSBjb3VudGVyIHNoYWxsIGJlIGRlY3JlbWVudGVkIGlmIHRpbWVvdXQgZWxhcHNlZCBhbmQgcmVnYXJkbGVzcyBvZiBhbiBlcnJvcgorCQkJCS8vIG1hbmRhdG9yeSBzbGF2ZSBjb3VudGVyIHNoYWxsIGJlIGRlY3JlbWVudGVkIGlmIHRpbWVvdXQgZWxhcHNlZCBhbmQgbm8gZXJyb3Igb2NjdXJlZAorCQkJfQorCQl9CisJfQorCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10TW51Tm9kZUNoZWNrQ29tCisvLworLy8gRGVzY3JpcHRpb246IGNoZWNrcyBjb21tdW5pY2F0aW9uIG9mIHRoZSBzcGVjaWZpZWQgbm9kZS4KKy8vICAgICAgICAgICAgICBUaGF0IG1lYW5zIHdhaXQgc29tZSB0aW1lIGFuZCBpZiBubyBlcnJvciBvY2N1cmVkIGV2ZXJ5dGhpbmcKKy8vICAgICAgICAgICAgICBpcyBPSy4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgPSBub2RlIElECisvLyAgICAgICAgICAgICAgcE5vZGVJbmZvX3AgICAgICAgICAgICAgPSBwb2ludGVyIHRvIGludGVybmFsIG5vZGUgaW5mbyBzdHJ1Y3R1cmUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsTm10TW51Tm9kZUNoZWNrQ29tKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQl0RXBsTm10TW51Tm9kZUluZm8gKiBwTm9kZUluZm9fcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCURXT1JEIGR3Tm9kZUNmZzsKKwl0RXBsVGltZXJBcmcgVGltZXJBcmc7CisKKwlkd05vZGVDZmcgPSBwTm9kZUluZm9fcC0+bV9kd05vZGVDZmc7CisJaWYgKCgoZHdOb2RlQ2ZnICYgRVBMX05PREVBU1NJR05fQVNZTkNPTkxZX05PREUpID09IDApCisJICAgICYmIChFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWxUaW1lb3V0Q2hlY2tDb20gIT0gMEwpKSB7CS8vIENOIGlzIG5vdCBhc3luYy1vbmx5IGFuZCB0aW1lb3V0IGZvciBDaGVja0NvbSB3YXMgc2V0CisKKwkJLy8gY2hlY2sgY29tbXVuaWNhdGlvbiwKKwkJLy8gdGhhdCBtZWFucyB3YWl0IHNvbWUgdGltZSBhbmQgaWYgbm8gZXJyb3Igb2NjdXJlZCBldmVyeXRoaW5nIGlzIE9LOworCisJCS8vIHN0YXJ0IHRpbWVyICh3aGVuIHRoZSB0aW1lciBleHBpcmVzIHRoZSBDTiBtdXN0IGJlIHN0aWxsIFJlYWR5VG9PcCkKKwkJRVBMX05NVE1OVV9TRVRfRkxBR1NfVElNRVJBUkdfTE9OR0VSKHBOb2RlSW5mb19wLCB1aU5vZGVJZF9wLAorCQkJCQkJICAgICBUaW1lckFyZyk7CisvLyAgICAgICAgVGltZXJBcmcubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rTm10TW51OworLy8gICAgICAgIFRpbWVyQXJnLm1fdWxBcmcgPSBFUExfTk1UTU5VX1RJTUVSQVJHX0xPTkdFUiB8IHVpTm9kZUlkX3A7CisJCVJldCA9CisJCSAgICBFcGxUaW1lcnVNb2RpZnlUaW1lck1zKCZwTm9kZUluZm9fcC0+bV9UaW1lckhkbExvbmdlciwKKwkJCQkJICAgRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJCQkJICAgbV91bFRpbWVvdXRDaGVja0NvbSwgVGltZXJBcmcpOworCisJCS8vIHVwZGF0ZSBtYW5kYXRvcnkgc2xhdmUgY291bnRlciwgYmVjYXVzZSB0aW1lciB3YXMgc3RhcnRlZAorCQlpZiAoUmV0ID09IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlSZXQgPSBrRXBsUmVqZWN0OworCQl9CisJfSBlbHNlIHsJCS8vIHRpbWVyIHdhcyBub3Qgc3RhcnRlZAorCQkvLyBhc3N1bWUgZXZlcnl0aGluZyBpcyBPSworCQlwTm9kZUluZm9fcC0+bV9Ob2RlU3RhdGUgPSBrRXBsTm10TW51Tm9kZVN0YXRlQ29tQ2hlY2tlZDsKKwl9CisKKy8vRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRNbnVTdGFydE5vZGVzCisvLworLy8gRGVzY3JpcHRpb246IHJlYWxseSBzdGFydHMgYWxsIG5vZGVzIHdoaWNoIGFyZSBSZWFkeVRvT3AgYW5kIENoZWNrQ29tIGRpZCBub3QgZmFpbAorLy8KKy8vIFBhcmFtZXRlcnM6ICAobm9uZSkKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsTm10TW51U3RhcnROb2Rlcyh2b2lkKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdW5zaWduZWQgaW50IHVpSW5kZXg7CisJdEVwbE5tdE1udU5vZGVJbmZvICpwTm9kZUluZm87CisKKwlpZiAoKEVwbE5tdE1udUluc3RhbmNlX2cubV93RmxhZ3MgJiBFUExfTk1UTU5VX0ZMQUdfSEFMVEVEKSA9PSAwKSB7CS8vIGJvb3QgcHJvY2VzcyBpcyBub3QgaGFsdGVkCisJCS8vIHNlbmQgTk1UIGNvbW1hbmQgU3RhcnQgTm9kZQorCQlFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlNYW5kYXRvcnlTbGF2ZUNvdW50ID0gMDsKKwkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpU2lnbmFsU2xhdmVDb3VudCA9IDA7CisJCS8vIHJlc2V0IGZsYWcgdGhhdCBhcHBsaWNhdGlvbiB3YXMgaW5mb3JtZWQgYWJvdXQgcG9zc2libGUgc3RhdGUgY2hhbmdlCisJCUVwbE5tdE1udUluc3RhbmNlX2cubV93RmxhZ3MgJj0gfkVQTF9OTVRNTlVfRkxBR19BUFBfSU5GT1JNRUQ7CisKKwkJcE5vZGVJbmZvID0gRXBsTm10TW51SW5zdGFuY2VfZy5tX2FOb2RlSW5mbzsKKwkJZm9yICh1aUluZGV4ID0gMTsKKwkJICAgICB1aUluZGV4IDw9IHRhYmVudHJpZXMoRXBsTm10TW51SW5zdGFuY2VfZy5tX2FOb2RlSW5mbyk7CisJCSAgICAgdWlJbmRleCsrLCBwTm9kZUluZm8rKykgeworCQkJaWYgKHBOb2RlSW5mby0+bV9Ob2RlU3RhdGUgPT0KKwkJCSAgICBrRXBsTm10TW51Tm9kZVN0YXRlQ29tQ2hlY2tlZCkgeworCQkJCWlmICgoRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJCQkgICAgIG1fZHdObXRTdGFydHVwICYgRVBMX05NVFNUX1NUQVJUQUxMTk9ERVMpCisJCQkJICAgID09IDApIHsKKwkJCQkJRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRSgwLAorCQkJCQkJCQkJdWlJbmRleCwKKwkJCQkJCQkJCWtFcGxObXRDbWRTdGFydE5vZGUpOworCisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxObXRNbnVTZW5kTm10Q29tbWFuZCh1aUluZGV4LAorCQkJCQkJCQkgICAga0VwbE5tdENtZFN0YXJ0Tm9kZSk7CisJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmICgocE5vZGVJbmZvLT5tX2R3Tm9kZUNmZyAmIEVQTF9OT0RFQVNTSUdOX01BTkRBVE9SWV9DTikgIT0gMCkgewkvLyBub2RlIGlzIGEgbWFuZGF0b3J5IENOCisJCQkJCUVwbE5tdE1udUluc3RhbmNlX2cuCisJCQkJCSAgICBtX3VpTWFuZGF0b3J5U2xhdmVDb3VudCsrOworCQkJCX0KKwkJCQkvLyBzZXQgZmxhZyAibm90IHNjYW5uZWQiCisJCQkJcE5vZGVJbmZvLT5tX3dGbGFncyB8PQorCQkJCSAgICBFUExfTk1UTU5VX05PREVfRkxBR19OT1RfU0NBTk5FRDsKKworCQkJCUVwbE5tdE1udUluc3RhbmNlX2cubV91aVNpZ25hbFNsYXZlQ291bnQrKzsKKwkJCQkvLyBzaWduYWwgc2xhdmUgY291bnRlciBzaGFsbCBiZSBkZWNyZW1lbnRlZCBpZiBTdGF0dXNSZXF1ZXN0IHdhcyBzZW50IG9uY2UgdG8gYSBDTgorCQkJCS8vIG1hbmRhdG9yeSBzbGF2ZSBjb3VudGVyIHNoYWxsIGJlIGRlY3JlbWVudGVkIGlmIG1hbmRhdG9yeSBDTiBpcyBPUEVSQVRJT05BTAorCQkJfQorCQl9CisKKwkJLy8gJCQkIGluZm9ybSBhcHBsaWNhdGlvbiBpZiBFUExfTk1UU1RfTk9fU1RBUlROT0RFIGlzIHNldAorCisJCWlmICgoRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJICAgICBtX2R3Tm10U3RhcnR1cCAmIEVQTF9OTVRTVF9TVEFSVEFMTE5PREVTKSAhPSAwKSB7CisJCQlFUExfTk1UTU5VX0RCR19QT1NUX1RSQUNFX1ZBTFVFKDAsIEVQTF9DX0FEUl9CUk9BRENBU1QsCisJCQkJCQkJa0VwbE5tdENtZFN0YXJ0Tm9kZSk7CisKKwkJCVJldCA9CisJCQkgICAgRXBsTm10TW51U2VuZE5tdENvbW1hbmQoRVBMX0NfQURSX0JST0FEQ0FTVCwKKwkJCQkJCSAgICBrRXBsTm10Q21kU3RhcnROb2RlKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCX0KKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10TW51UHJvY2Vzc0ludGVybmFsRXZlbnQKKy8vCisvLyBEZXNjcmlwdGlvbjogcHJvY2Vzc2VzIGludGVybmFsIG5vZGUgZXZlbnRzCisvLworLy8gUGFyYW1ldGVyczogIHVpTm9kZUlkX3AgICAgICAgICAgICAgID0gbm9kZSBJRAorLy8gICAgICAgICAgICAgIE5vZGVObXRTdGF0ZV9wICAgICAgICAgID0gTk1UIHN0YXRlIG9mIENOCisvLyAgICAgICAgICAgICAgTm9kZUV2ZW50X3AgICAgICAgICAgICAgPSBvY2N1cmVkIGV2ZW50cworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsTm10TW51UHJvY2Vzc0ludGVybmFsRXZlbnQodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCQl0RXBsTm10U3RhdGUgTm9kZU5tdFN0YXRlX3AsCisJCQkJCQlXT1JEIHdFcnJvckNvZGVfcCwKKwkJCQkJCXRFcGxObXRNbnVJbnROb2RlRXZlbnQKKwkJCQkJCU5vZGVFdmVudF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbE5tdFN0YXRlIE5tdFN0YXRlOworCXRFcGxObXRNbnVOb2RlSW5mbyAqcE5vZGVJbmZvOworCXRFcGxUaW1lckFyZyBUaW1lckFyZzsKKworCXBOb2RlSW5mbyA9IEVQTF9OTVRNTlVfR0VUX05PREVJTkZPKHVpTm9kZUlkX3ApOworCU5tdFN0YXRlID0gRXBsTm10dUdldE5tdFN0YXRlKCk7CisJaWYgKE5tdFN0YXRlIDw9IGtFcGxObXRNc05vdEFjdGl2ZSkgewkvLyBNTiBpcyBub3QgYWN0aXZlCisJCWdvdG8gRXhpdDsKKwl9CisKKwlzd2l0Y2ggKE5vZGVFdmVudF9wKSB7CisJY2FzZSBrRXBsTm10TW51SW50Tm9kZUV2ZW50SWRlbnRSZXNwb25zZToKKwkJeworCQkJQllURSBiTm10U3RhdGU7CisKKwkJCUVQTF9OTVRNTlVfREJHX1BPU1RfVFJBQ0VfVkFMVUUoTm9kZUV2ZW50X3AsCisJCQkJCQkJdWlOb2RlSWRfcCwKKwkJCQkJCQlwTm9kZUluZm8tPm1fTm9kZVN0YXRlKTsKKworCQkJaWYgKHBOb2RlSW5mby0+bV9Ob2RlU3RhdGUgIT0KKwkJCSAgICBrRXBsTm10TW51Tm9kZVN0YXRlUmVzZXRDb25mKSB7CisJCQkJcE5vZGVJbmZvLT5tX05vZGVTdGF0ZSA9CisJCQkJICAgIGtFcGxObXRNbnVOb2RlU3RhdGVJZGVudGlmaWVkOworCQkJfQorCQkJLy8gcmVzZXQgZmxhZ3MgSVNPQ0hST04gYW5kIE5NVF9DTURfSVNTVUVECisJCQlwTm9kZUluZm8tPm1fd0ZsYWdzICY9IH4oRVBMX05NVE1OVV9OT0RFX0ZMQUdfSVNPQ0hST04KKwkJCQkJCSB8CisJCQkJCQkgRVBMX05NVE1OVV9OT0RFX0ZMQUdfTk1UX0NNRF9JU1NVRUQpOworCisJCQlpZiAoKE5tdFN0YXRlID09IGtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMSkKKwkJCSAgICAmJgorCQkJICAgICgocE5vZGVJbmZvLT4KKwkJCSAgICAgIG1fd0ZsYWdzICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfTk9UX1NDQU5ORUQpICE9CisJCQkgICAgIDApKSB7CisJCQkJLy8gZGVjcmVtZW50IG9ubHkgc2lnbmFsIHNsYXZlIGNvdW50CisJCQkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpU2lnbmFsU2xhdmVDb3VudC0tOworCQkJCXBOb2RlSW5mby0+bV93RmxhZ3MgJj0KKwkJCQkgICAgfkVQTF9OTVRNTlVfTk9ERV9GTEFHX05PVF9TQ0FOTkVEOworCQkJfQorCQkJLy8gdXBkYXRlIG9iamVjdCAweDFGOEYgTk1UX01OTm9kZUV4cFN0YXRlX0FVOCB0byBQcmVPcDEgKGV2ZW4gaWYgbG9jYWwgc3RhdGUgPj0gUHJlT3AyKQorCQkJYk5tdFN0YXRlID0gKEJZVEUpIChrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDEgJiAweEZGKTsKKwkJCVJldCA9CisJCQkgICAgRXBsT2JkdVdyaXRlRW50cnkoMHgxRjhGLCB1aU5vZGVJZF9wLCAmYk5tdFN0YXRlLAorCQkJCQkgICAgICAxKTsKKworCQkJLy8gY2hlY2sgTk1UIHN0YXRlIG9mIENOCisJCQlSZXQgPQorCQkJICAgIEVwbE5tdE1udUNoZWNrTm10U3RhdGUodWlOb2RlSWRfcCwgcE5vZGVJbmZvLAorCQkJCQkJICAgTm9kZU5tdFN0YXRlX3AsIHdFcnJvckNvZGVfcCwKKwkJCQkJCSAgIE5tdFN0YXRlKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQlpZiAoUmV0ID09IGtFcGxSZWplY3QpIHsKKwkJCQkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJLy8gcmVxdWVzdCBTdGF0dXNSZXNwb25zZSBpbW1lZGlhdGVseSwKKwkJCS8vIGJlY2F1c2Ugd2Ugd2FudCBhIGZhc3QgYm9vdC11cCBvZiBDTnMKKwkJCVJldCA9CisJCQkgICAgRXBsU3RhdHVzdVJlcXVlc3RTdGF0dXNSZXNwb25zZSh1aU5vZGVJZF9wLAorCQkJCQkJCSAgICBFcGxObXRNbnVDYlN0YXR1c1Jlc3BvbnNlKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQlFUExfTk1UTU5VX0RCR19QT1NUX1RSQUNFX1ZBTFVFKE5vZGVFdmVudF9wLAorCQkJCQkJCQl1aU5vZGVJZF9wLAorCQkJCQkJCQlSZXQpOworCisJCQkJaWYgKFJldCA9PSBrRXBsSW52YWxpZE9wZXJhdGlvbikgewkvLyB0aGUgb25seSBzaXR1YXRpb24gd2hlbiB0aGlzIHNob3VsZCBoYXBwZW4gaXMsIHdoZW4KKwkJCQkJLy8gU3RhdHVzUmVzcG9uc2Ugd2FzIGFscmVhZHkgcmVxdWVzdGVkIGZyb20gd2l0aGluCisJCQkJCS8vIHRoZSBTdGF0UmVxIHRpbWVyIGV2ZW50LgorCQkJCQkvLyBzbyBpZ25vcmUgdGhpcyBlcnJvci4KKwkJCQkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJCQkJfSBlbHNlIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlpZiAocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSAhPQorCQkJICAgIGtFcGxObXRNbnVOb2RlU3RhdGVSZXNldENvbmYpIHsKKwkJCQkvLyBpbmZvcm0gYXBwbGljYXRpb24KKwkJCQlSZXQgPQorCQkJCSAgICBFcGxObXRNbnVJbnN0YW5jZV9nLgorCQkJCSAgICBtX3BmbkNiTm9kZUV2ZW50KHVpTm9kZUlkX3AsCisJCQkJCQkgICAgIGtFcGxObXROb2RlRXZlbnRGb3VuZCwKKwkJCQkJCSAgICAgTm9kZU5tdFN0YXRlX3AsCisJCQkJCQkgICAgIEVQTF9FX05PX0VSUk9SLAorCQkJCQkJICAgICAocE5vZGVJbmZvLT4KKwkJCQkJCSAgICAgIG1fZHdOb2RlQ2ZnICYKKwkJCQkJCSAgICAgIEVQTF9OT0RFQVNTSUdOX01BTkRBVE9SWV9DTikKKwkJCQkJCSAgICAgIT0gMCk7CisJCQkJaWYgKFJldCA9PSBrRXBsUmVqZWN0KSB7CS8vIGludGVycnVwdCBib290IHByb2Nlc3Mgb24gdXNlciByZXF1ZXN0CisJCQkJCUVQTF9OTVRNTlVfREJHX1BPU1RfVFJBQ0VfVkFMVUUKKwkJCQkJICAgIChOb2RlRXZlbnRfcCwgdWlOb2RlSWRfcCwKKwkJCQkJICAgICAoKHBOb2RlSW5mby0+bV9Ob2RlU3RhdGUgPDwgOCkKKwkJCQkJICAgICAgfCBSZXQpKTsKKworCQkJCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJCQkJYnJlYWs7CisJCQkJfSBlbHNlIGlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRQorCQkJCQkgICAgKE5vZGVFdmVudF9wLCB1aU5vZGVJZF9wLAorCQkJCQkgICAgICgocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSA8PCA4KQorCQkJCQkgICAgICB8IFJldCkpOworCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCS8vIGNvbnRpbnVlIEJvb3RTdGVwMQorCQl9CisKKwljYXNlIGtFcGxObXRNbnVJbnROb2RlRXZlbnRCb290OgorCQl7CisKKwkJCS8vICQkJCBjaGVjayBpZGVudGlmaWNhdGlvbiAodmVuZG9yIElELCBwcm9kdWN0IGNvZGUsIHJldmlzaW9uIG5vLCBzZXJpYWwgbm8pCisKKwkJCWlmIChwTm9kZUluZm8tPm1fTm9kZVN0YXRlID09CisJCQkgICAga0VwbE5tdE1udU5vZGVTdGF0ZUlkZW50aWZpZWQpIHsKKwkJCQkvLyAkJCQgY2hlY2sgc29mdHdhcmUKKworCQkJCS8vIGNoZWNrL3N0YXJ0IGNvbmZpZ3VyYXRpb24KKwkJCQkvLyBpbmZvcm0gYXBwbGljYXRpb24KKwkJCQlSZXQgPQorCQkJCSAgICBFcGxObXRNbnVJbnN0YW5jZV9nLgorCQkJCSAgICBtX3BmbkNiTm9kZUV2ZW50KHVpTm9kZUlkX3AsCisJCQkJCQkgICAgIGtFcGxObXROb2RlRXZlbnRDaGVja0NvbmYsCisJCQkJCQkgICAgIE5vZGVObXRTdGF0ZV9wLAorCQkJCQkJICAgICBFUExfRV9OT19FUlJPUiwKKwkJCQkJCSAgICAgKHBOb2RlSW5mby0+CisJCQkJCQkgICAgICBtX2R3Tm9kZUNmZyAmCisJCQkJCQkgICAgICBFUExfTk9ERUFTU0lHTl9NQU5EQVRPUllfQ04pCisJCQkJCQkgICAgICE9IDApOworCQkJCWlmIChSZXQgPT0ga0VwbFJlamVjdCkgewkvLyBpbnRlcnJ1cHQgYm9vdCBwcm9jZXNzIG9uIHVzZXIgcmVxdWVzdAorCQkJCQlFUExfTk1UTU5VX0RCR19QT1NUX1RSQUNFX1ZBTFVFCisJCQkJCSAgICAoa0VwbE5tdE1udUludE5vZGVFdmVudEJvb3QsCisJCQkJCSAgICAgdWlOb2RlSWRfcCwKKwkJCQkJICAgICAoKHBOb2RlSW5mby0+bV9Ob2RlU3RhdGUgPDwgOCkKKwkJCQkJICAgICAgfCBSZXQpKTsKKworCQkJCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJCQkJYnJlYWs7CisJCQkJfSBlbHNlIGlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRQorCQkJCQkgICAgKGtFcGxObXRNbnVJbnROb2RlRXZlbnRCb290LAorCQkJCQkgICAgIHVpTm9kZUlkX3AsCisJCQkJCSAgICAgKChwTm9kZUluZm8tPm1fTm9kZVN0YXRlIDw8IDgpCisJCQkJCSAgICAgIHwgUmV0KSk7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfSBlbHNlIGlmIChwTm9kZUluZm8tPm1fTm9kZVN0YXRlICE9IGtFcGxObXRNbnVOb2RlU3RhdGVSZXNldENvbmYpIHsJLy8gd3JvbmcgQ04gc3RhdGUKKwkJCQkvLyBpZ25vcmUgZXZlbnQKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8vICQkJCBkLmsuOiBjdXJyZW50bHkgd2UgYXNzdW1lIGNvbmZpZ3VyYXRpb24gaXMgT0sKKworCQkJLy8gY29udGludWUgQm9vdFN0ZXAxCisJCX0KKworCWNhc2Uga0VwbE5tdE1udUludE5vZGVFdmVudENvbmZpZ3VyZWQ6CisJCXsKKwkJCWlmICgocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSAhPQorCQkJICAgICBrRXBsTm10TW51Tm9kZVN0YXRlSWRlbnRpZmllZCkKKwkJCSAgICAmJiAocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSAhPSBrRXBsTm10TW51Tm9kZVN0YXRlUmVzZXRDb25mKSkgewkvLyB3cm9uZyBDTiBzdGF0ZQorCQkJCS8vIGlnbm9yZSBldmVudAorCQkJCWJyZWFrOworCQkJfQorCisJCQlwTm9kZUluZm8tPm1fTm9kZVN0YXRlID0ga0VwbE5tdE1udU5vZGVTdGF0ZUNvbmZpZ3VyZWQ7CisKKwkJCWlmIChObXRTdGF0ZSA9PSBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDEpIHsKKwkJCQlpZiAoKHBOb2RlSW5mby0+bV9kd05vZGVDZmcgJiBFUExfTk9ERUFTU0lHTl9NQU5EQVRPUllfQ04pICE9IDApIHsJLy8gZGVjcmVtZW50IG1hbmRhdG9yeSBDTiBjb3VudGVyCisJCQkJCUVwbE5tdE1udUluc3RhbmNlX2cuCisJCQkJCSAgICBtX3VpTWFuZGF0b3J5U2xhdmVDb3VudC0tOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLy8gcHV0IG9wdGlvbmFsIG5vZGUgdG8gbmV4dCBzdGVwIChCb290U3RlcDIpCisJCQkJUmV0ID0KKwkJCQkgICAgRXBsTm10TW51Tm9kZUJvb3RTdGVwMih1aU5vZGVJZF9wLAorCQkJCQkJCSAgIHBOb2RlSW5mbyk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10TW51SW50Tm9kZUV2ZW50Tm9JZGVudFJlc3BvbnNlOgorCQl7CisJCQlpZiAoKE5tdFN0YXRlID09IGtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMSkKKwkJCSAgICAmJgorCQkJICAgICgocE5vZGVJbmZvLT4KKwkJCSAgICAgIG1fd0ZsYWdzICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfTk9UX1NDQU5ORUQpICE9CisJCQkgICAgIDApKSB7CisJCQkJLy8gZGVjcmVtZW50IG9ubHkgc2lnbmFsIHNsYXZlIGNvdW50CisJCQkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpU2lnbmFsU2xhdmVDb3VudC0tOworCQkJCXBOb2RlSW5mby0+bV93RmxhZ3MgJj0KKwkJCQkgICAgfkVQTF9OTVRNTlVfTk9ERV9GTEFHX05PVF9TQ0FOTkVEOworCQkJfQorCisJCQlpZiAocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSAhPQorCQkJICAgIGtFcGxObXRNbnVOb2RlU3RhdGVSZXNldENvbmYpIHsKKwkJCQlwTm9kZUluZm8tPm1fTm9kZVN0YXRlID0KKwkJCQkgICAga0VwbE5tdE1udU5vZGVTdGF0ZVVua25vd247CisJCQl9CisJCQkvLyAkJCQgZC5rLiBjaGVjayBzdGFydCB0aW1lIGZvciAweDFGODkvMiBNTlRpbWVvdXRQcmVPcDFfVTMyCisJCQkvLyAkJCQgZC5rLiBjaGVjayBpbmRpdmlkdWFsIHRpbWVvdXQgMHgxRjg5LzYgTU5JZGVudGlmaWNhdGlvblRpbWVvdXRfVTMyCisJCQkvLyBpZiBtYW5kYXRvcnkgbm9kZSBhbmQgdGltZW91dCBlbGFwc2VkIC0+IGhhbHQgYm9vdCBwcm9jZWR1cmUKKwkJCS8vIHRyaWdnZXIgSWRlbnRSZXF1ZXN0IGFnYWluIChpZiA+PSBQcmVPcDIsIGFmdGVyIGRlbGF5KQorCQkJaWYgKE5tdFN0YXRlID49IGtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMikgewkvLyBzdGFydCB0aW1lcgorCQkJCUVQTF9OTVRNTlVfU0VUX0ZMQUdTX1RJTUVSQVJHX0lERU5UUkVRCisJCQkJICAgIChwTm9kZUluZm8sIHVpTm9kZUlkX3AsIFRpbWVyQXJnKTsKKy8vICAgICAgICAgICAgICAgIFRpbWVyQXJnLm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua05tdE1udTsKKy8vICAgICAgICAgICAgICAgIFRpbWVyQXJnLm1fdWxBcmcgPSBFUExfTk1UTU5VX1RJTUVSQVJHX0lERU5UUkVRIHwgdWlOb2RlSWRfcDsKKy8qCisgICAgICAgICAgICAgICAgRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRShrRXBsTm10TW51SW50Tm9kZUV2ZW50Tm9JZGVudFJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlOb2RlSWRfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSA8PCA4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMHg4MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChwTm9kZUluZm8tPm1fd0ZsYWdzICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfQ09VTlRfU1RBVFJFUSkgPj4gNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgoVGltZXJBcmcubV91bEFyZyAmIEVQTF9OTVRNTlVfVElNRVJBUkdfQ09VTlRfU1IpID4+IDgpKSk7CisqLworCQkJCVJldCA9CisJCQkJICAgIEVwbFRpbWVydU1vZGlmeVRpbWVyTXMoJnBOb2RlSW5mby0+CisJCQkJCQkJICAgbV9UaW1lckhkbFN0YXRSZXEsCisJCQkJCQkJICAgRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJCQkJCQkgICBtX3VsU3RhdHVzUmVxdWVzdERlbGF5LAorCQkJCQkJCSAgIFRpbWVyQXJnKTsKKwkJCX0gZWxzZSB7CS8vIHRyaWdnZXIgSWRlbnRSZXF1ZXN0IGltbWVkaWF0ZWx5CisJCQkJUmV0ID0KKwkJCQkgICAgRXBsSWRlbnR1UmVxdWVzdElkZW50UmVzcG9uc2UodWlOb2RlSWRfcCwKKwkJCQkJCQkJICBFcGxObXRNbnVDYklkZW50UmVzcG9uc2UpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdE1udUludE5vZGVFdmVudFN0YXR1c1Jlc3BvbnNlOgorCQl7CisJCQlpZiAoKE5tdFN0YXRlID49IGtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMikKKwkJCSAgICAmJgorCQkJICAgICgocE5vZGVJbmZvLT4KKwkJCSAgICAgIG1fd0ZsYWdzICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfTk9UX1NDQU5ORUQpICE9CisJCQkgICAgIDApKSB7CisJCQkJLy8gZGVjcmVtZW50IG9ubHkgc2lnbmFsIHNsYXZlIGNvdW50IGlmIGNoZWNrZWQgb25jZSBmb3IgUmVhZHlUb09wLCBDaGVja0NvbSwgT3BlcmF0aW9uYWwKKwkJCQlFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlTaWduYWxTbGF2ZUNvdW50LS07CisJCQkJcE5vZGVJbmZvLT5tX3dGbGFncyAmPQorCQkJCSAgICB+RVBMX05NVE1OVV9OT0RFX0ZMQUdfTk9UX1NDQU5ORUQ7CisJCQl9CisJCQkvLyBjaGVjayBOTVQgc3RhdGUgb2YgQ04KKwkJCVJldCA9CisJCQkgICAgRXBsTm10TW51Q2hlY2tObXRTdGF0ZSh1aU5vZGVJZF9wLCBwTm9kZUluZm8sCisJCQkJCQkgICBOb2RlTm10U3RhdGVfcCwgd0Vycm9yQ29kZV9wLAorCQkJCQkJICAgTm10U3RhdGUpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCWlmIChSZXQgPT0ga0VwbFJlamVjdCkgeworCQkJCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChObXRTdGF0ZSA9PSBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDEpIHsKKwkJCQkvLyByZXF1ZXN0IG5leHQgU3RhdHVzUmVzcG9uc2UgaW1tZWRpYXRlbHkKKwkJCQlSZXQgPQorCQkJCSAgICBFcGxTdGF0dXN1UmVxdWVzdFN0YXR1c1Jlc3BvbnNlKHVpTm9kZUlkX3AsCisJCQkJCQkJCSAgICBFcGxObXRNbnVDYlN0YXR1c1Jlc3BvbnNlKTsKKwkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCUVQTF9OTVRNTlVfREJHX1BPU1RfVFJBQ0VfVkFMVUUKKwkJCQkJICAgIChOb2RlRXZlbnRfcCwgdWlOb2RlSWRfcCwgUmV0KTsKKwkJCQl9CisKKwkJCX0gZWxzZSBpZiAoKHBOb2RlSW5mby0+bV93RmxhZ3MgJiBFUExfTk1UTU5VX05PREVfRkxBR19JU09DSFJPTikgPT0gMCkgewkvLyBzdGFydCB0aW1lcgorCQkJCS8vIG5vdCBpc29jaHJvbm91c2x5IGFjY2Vzc2VkIENOIChlLmcuIGFzeW5jLW9ubHkgb3Igc3RvcHBlZCBDTikKKwkJCQlFUExfTk1UTU5VX1NFVF9GTEFHU19USU1FUkFSR19TVEFUUkVRKHBOb2RlSW5mbywKKwkJCQkJCQkJICAgICAgdWlOb2RlSWRfcCwKKwkJCQkJCQkJICAgICAgVGltZXJBcmcpOworLy8gICAgICAgICAgICAgICAgVGltZXJBcmcubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rTm10TW51OworLy8gICAgICAgICAgICAgICAgVGltZXJBcmcubV91bEFyZyA9IEVQTF9OTVRNTlVfVElNRVJBUkdfU1RBVFJFUSB8IHVpTm9kZUlkX3A7CisvKgorICAgICAgICAgICAgICAgIEVQTF9OTVRNTlVfREJHX1BPU1RfVFJBQ0VfVkFMVUUoa0VwbE5tdE1udUludE5vZGVFdmVudFN0YXR1c1Jlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlOb2RlSWRfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSA8PCA4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMHg4MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChwTm9kZUluZm8tPm1fd0ZsYWdzICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfQ09VTlRfU1RBVFJFUSkgPj4gNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgoVGltZXJBcmcubV91bEFyZyAmIEVQTF9OTVRNTlVfVElNRVJBUkdfQ09VTlRfU1IpID4+IDgpKSk7CisqLworCQkJCVJldCA9CisJCQkJICAgIEVwbFRpbWVydU1vZGlmeVRpbWVyTXMoJnBOb2RlSW5mby0+CisJCQkJCQkJICAgbV9UaW1lckhkbFN0YXRSZXEsCisJCQkJCQkJICAgRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJCQkJCQkgICBtX3VsU3RhdHVzUmVxdWVzdERlbGF5LAorCQkJCQkJCSAgIFRpbWVyQXJnKTsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdE1udUludE5vZGVFdmVudE5vU3RhdHVzUmVzcG9uc2U6CisJCXsKKwkJCS8vIGZ1bmN0aW9uIENoZWNrTm10U3RhdGUgc2V0cyBub2RlIHN0YXRlIHRvIHVua25vd24gaWYgbmVjZXNzYXJ5CisvKgorICAgICAgICAgICAgaWYgKChObXRTdGF0ZSA+PSBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDIpCisgICAgICAgICAgICAgICAgJiYgKChwTm9kZUluZm8tPm1fd0ZsYWdzICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfTk9UX1NDQU5ORUQpICE9IDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGRlY3JlbWVudCBvbmx5IHNpZ25hbCBzbGF2ZSBjb3VudCBpZiBjaGVja2VkIG9uY2UgZm9yIFJlYWR5VG9PcCwgQ2hlY2tDb20sIE9wZXJhdGlvbmFsCisgICAgICAgICAgICAgICAgRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpU2lnbmFsU2xhdmVDb3VudC0tOworICAgICAgICAgICAgICAgIHBOb2RlSW5mby0+bV93RmxhZ3MgJj0gfkVQTF9OTVRNTlVfTk9ERV9GTEFHX05PVF9TQ0FOTkVEOworICAgICAgICAgICAgfQorKi8KKwkJCS8vIGNoZWNrIE5NVCBzdGF0ZSBvZiBDTgorCQkJUmV0ID0KKwkJCSAgICBFcGxObXRNbnVDaGVja05tdFN0YXRlKHVpTm9kZUlkX3AsIHBOb2RlSW5mbywKKwkJCQkJCSAgIE5vZGVObXRTdGF0ZV9wLCB3RXJyb3JDb2RlX3AsCisJCQkJCQkgICBObXRTdGF0ZSk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJaWYgKFJldCA9PSBrRXBsUmVqZWN0KSB7CisJCQkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdE1udUludE5vZGVFdmVudEVycm9yOgorCQl7CQkvLyBjdXJyZW50bHkgb25seSBpc3N1ZWQgb24ga0VwbE5tdE5vZGVDb21tYW5kQ29uZkVycgorCisJCQlpZiAocE5vZGVJbmZvLT5tX05vZGVTdGF0ZSAhPSBrRXBsTm10TW51Tm9kZVN0YXRlSWRlbnRpZmllZCkgewkvLyB3cm9uZyBDTiBzdGF0ZQorCQkJCS8vIGlnbm9yZSBldmVudAorCQkJCWJyZWFrOworCQkJfQorCQkJLy8gY2hlY2sgTk1UIHN0YXRlIG9mIENOCisJCQlSZXQgPQorCQkJICAgIEVwbE5tdE1udUNoZWNrTm10U3RhdGUodWlOb2RlSWRfcCwgcE5vZGVJbmZvLAorCQkJCQkJICAga0VwbE5tdENzTm90QWN0aXZlLAorCQkJCQkJICAgd0Vycm9yQ29kZV9wLCBObXRTdGF0ZSk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJaWYgKFJldCA9PSBrRXBsUmVqZWN0KSB7CisJCQkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdE1udUludE5vZGVFdmVudEV4ZWNSZXNldDoKKwkJeworCQkJaWYgKHBOb2RlSW5mby0+bV9Ob2RlU3RhdGUgIT0ga0VwbE5tdE1udU5vZGVTdGF0ZUlkZW50aWZpZWQpIHsJLy8gd3JvbmcgQ04gc3RhdGUKKwkJCQkvLyBpZ25vcmUgZXZlbnQKKwkJCQlicmVhazsKKwkJCX0KKworCQkJcE5vZGVJbmZvLT5tX05vZGVTdGF0ZSA9IGtFcGxObXRNbnVOb2RlU3RhdGVSZXNldENvbmY7CisKKwkJCUVQTF9OTVRNTlVfREJHX1BPU1RfVFJBQ0VfVkFMVUUoTm9kZUV2ZW50X3AsCisJCQkJCQkJdWlOb2RlSWRfcCwKKwkJCQkJCQkoKChOb2RlTm10U3RhdGVfcCAmCisJCQkJCQkJICAgMHhGRikgPDwgOCkKKwkJCQkJCQkgfAorCQkJCQkJCSBrRXBsTm10Q21kUmVzZXRDb25maWd1cmF0aW9uKSk7CisKKwkJCS8vIHNlbmQgTk1UIHJlc2V0IGNvbmZpZ3VyYXRpb24gdG8gQ04gZm9yIGFjdGl2YXRpb24gb2YgY29uZmlndXJhdGlvbgorCQkJUmV0ID0KKwkJCSAgICBFcGxObXRNbnVTZW5kTm10Q29tbWFuZCh1aU5vZGVJZF9wLAorCQkJCQkJICAgIGtFcGxObXRDbWRSZXNldENvbmZpZ3VyYXRpb24pOworCisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrRXBsTm10TW51SW50Tm9kZUV2ZW50SGVhcnRiZWF0OgorCQl7CisvKgorICAgICAgICAgICAgaWYgKChObXRTdGF0ZSA+PSBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDIpCisgICAgICAgICAgICAgICAgJiYgKChwTm9kZUluZm8tPm1fd0ZsYWdzICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfTk9UX1NDQU5ORUQpICE9IDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGRlY3JlbWVudCBvbmx5IHNpZ25hbCBzbGF2ZSBjb3VudCBpZiBjaGVja2VkIG9uY2UgZm9yIFJlYWR5VG9PcCwgQ2hlY2tDb20sIE9wZXJhdGlvbmFsCisgICAgICAgICAgICAgICAgRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpU2lnbmFsU2xhdmVDb3VudC0tOworICAgICAgICAgICAgICAgIHBOb2RlSW5mby0+bV93RmxhZ3MgJj0gfkVQTF9OTVRNTlVfTk9ERV9GTEFHX05PVF9TQ0FOTkVEOworICAgICAgICAgICAgfQorKi8KKwkJCS8vIGNoZWNrIE5NVCBzdGF0ZSBvZiBDTgorCQkJUmV0ID0KKwkJCSAgICBFcGxObXRNbnVDaGVja05tdFN0YXRlKHVpTm9kZUlkX3AsIHBOb2RlSW5mbywKKwkJCQkJCSAgIE5vZGVObXRTdGF0ZV9wLCB3RXJyb3JDb2RlX3AsCisJCQkJCQkgICBObXRTdGF0ZSk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJaWYgKFJldCA9PSBrRXBsUmVqZWN0KSB7CisJCQkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdE1udUludE5vZGVFdmVudFRpbWVySWRlbnRSZXE6CisJCXsKKwkJCUVQTF9EQkdMVkxfTk1UTU5fVFJBQ0UxCisJCQkgICAgKCJUaW1lclN0YXRSZXEtPklkZW50UmVxKCUwMlgpXG4iLCB1aU5vZGVJZF9wKTsKKwkJCS8vIHRyaWdnZXIgSWRlbnRSZXF1ZXN0IGFnYWluCisJCQlSZXQgPQorCQkJICAgIEVwbElkZW50dVJlcXVlc3RJZGVudFJlc3BvbnNlKHVpTm9kZUlkX3AsCisJCQkJCQkJICBFcGxObXRNbnVDYklkZW50UmVzcG9uc2UpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCUVQTF9OTVRNTlVfREJHX1BPU1RfVFJBQ0VfVkFMVUUoTm9kZUV2ZW50X3AsCisJCQkJCQkJCXVpTm9kZUlkX3AsCisJCQkJCQkJCSgoKE5vZGVObXRTdGF0ZV9wICYgMHhGRikgPDwgOCkKKwkJCQkJCQkJIHwgUmV0KSk7CisJCQkJaWYgKFJldCA9PSBrRXBsSW52YWxpZE9wZXJhdGlvbikgewkvLyB0aGlzIGNhbiBoYXBwZW4gYmVjYXVzZSBvZiBhIGJ1ZyBpbiBFcGxUaW1lcnVMaW51eEtlcm5lbC5jCisJCQkJCS8vIHNvIGlnbm9yZSB0aGlzIGVycm9yLgorCQkJCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJCQl9CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxObXRNbnVJbnROb2RlRXZlbnRUaW1lclN0YXRlTW9uOgorCQl7CisJCQkvLyByZXNldCBOTVQgc3RhdGUgY2hhbmdlIGZsYWcKKwkJCS8vIGJlY2F1c2UgZnJvbSBub3cgb24gdGhlIENOIG11c3QgaGF2ZSB0aGUgY29ycmVjdCBOTVQgc3RhdGUKKwkJCXBOb2RlSW5mby0+bV93RmxhZ3MgJj0KKwkJCSAgICB+RVBMX05NVE1OVV9OT0RFX0ZMQUdfTk1UX0NNRF9JU1NVRUQ7CisKKwkJCS8vIGNvbnRpbnVlIHdpdGggbm9ybWFsIFN0YXRSZXEgcHJvY2Vzc2luZworCQl9CisKKwljYXNlIGtFcGxObXRNbnVJbnROb2RlRXZlbnRUaW1lclN0YXRSZXE6CisJCXsKKwkJCUVQTF9EQkdMVkxfTk1UTU5fVFJBQ0UxKCJUaW1lclN0YXRSZXEtPlN0YXRSZXEoJTAyWClcbiIsCisJCQkJCQl1aU5vZGVJZF9wKTsKKwkJCS8vIHJlcXVlc3QgbmV4dCBTdGF0dXNSZXNwb25zZQorCQkJUmV0ID0KKwkJCSAgICBFcGxTdGF0dXN1UmVxdWVzdFN0YXR1c1Jlc3BvbnNlKHVpTm9kZUlkX3AsCisJCQkJCQkJICAgIEVwbE5tdE1udUNiU3RhdHVzUmVzcG9uc2UpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCUVQTF9OTVRNTlVfREJHX1BPU1RfVFJBQ0VfVkFMVUUoTm9kZUV2ZW50X3AsCisJCQkJCQkJCXVpTm9kZUlkX3AsCisJCQkJCQkJCSgoKE5vZGVObXRTdGF0ZV9wICYgMHhGRikgPDwgOCkKKwkJCQkJCQkJIHwgUmV0KSk7CisJCQkJaWYgKFJldCA9PSBrRXBsSW52YWxpZE9wZXJhdGlvbikgewkvLyB0aGUgb25seSBzaXR1YXRpb24gd2hlbiB0aGlzIHNob3VsZCBoYXBwZW4gaXMsIHdoZW4KKwkJCQkJLy8gU3RhdHVzUmVzcG9uc2Ugd2FzIGFscmVhZHkgcmVxdWVzdGVkIHdoaWxlIHByb2Nlc3NpbmcKKwkJCQkJLy8gZXZlbnQgSWRlbnRSZXNwb25zZS4KKwkJCQkJLy8gc28gaWdub3JlIHRoaXMgZXJyb3IuCisJCQkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJCX0KKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE5tdE1udUludE5vZGVFdmVudFRpbWVyTG9uZ2VyOgorCQl7CisJCQlzd2l0Y2ggKHBOb2RlSW5mby0+bV9Ob2RlU3RhdGUpIHsKKwkJCWNhc2Uga0VwbE5tdE1udU5vZGVTdGF0ZUNvbmZpZ3VyZWQ6CisJCQkJewkvLyBub2RlIHNob3VsZCBiZSBSZWFkeVRvT3AgYnV0IGl0IGlzIG5vdAorCisJCQkJCS8vIGNoZWNrIE5NVCBzdGF0ZSB3aGljaCBzaGFsbCBiZSBpbnRlbnRpb25hbGx5IHdyb25nLCBzbyB0aGF0IEVSUk9SX1RSRUFUTUVOVCB3aWxsIGJlIHN0YXJ0ZWQKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbE5tdE1udUNoZWNrTm10U3RhdGUodWlOb2RlSWRfcCwKKwkJCQkJCQkJICAgcE5vZGVJbmZvLAorCQkJCQkJCQkgICBrRXBsTm10Q3NOb3RBY3RpdmUsCisJCQkJCQkJCSAgIEVQTF9FX05NVF9CUE8yLAorCQkJCQkJCQkgICBObXRTdGF0ZSk7CisJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCWlmIChSZXQgPT0ga0VwbFJlamVjdCkgeworCQkJCQkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWNhc2Uga0VwbE5tdE1udU5vZGVTdGF0ZVJlYWR5VG9PcDoKKwkJCQl7CS8vIENoZWNrQ29tIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseQorCisJCQkJCXBOb2RlSW5mby0+bV9Ob2RlU3RhdGUgPQorCQkJCQkgICAga0VwbE5tdE1udU5vZGVTdGF0ZUNvbUNoZWNrZWQ7CisKKwkJCQkJaWYgKChwTm9kZUluZm8tPgorCQkJCQkgICAgIG1fd0ZsYWdzICYKKwkJCQkJICAgICBFUExfTk1UTU5VX05PREVfRkxBR19OT1RfU0NBTk5FRCkKKwkJCQkJICAgICE9IDApIHsKKwkJCQkJCS8vIGRlY3JlbWVudCBvbmx5IHNpZ25hbCBzbGF2ZSBjb3VudCBpZiBjaGVja2VkIG9uY2UgZm9yIFJlYWR5VG9PcCwgQ2hlY2tDb20sIE9wZXJhdGlvbmFsCisJCQkJCQlFcGxObXRNbnVJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fdWlTaWduYWxTbGF2ZUNvdW50LS07CisJCQkJCQlwTm9kZUluZm8tPm1fd0ZsYWdzICY9CisJCQkJCQkgICAgfkVQTF9OTVRNTlVfTk9ERV9GTEFHX05PVF9TQ0FOTkVEOworCQkJCQl9CisKKwkJCQkJaWYgKChwTm9kZUluZm8tPgorCQkJCQkgICAgIG1fZHdOb2RlQ2ZnICYKKwkJCQkJICAgICBFUExfTk9ERUFTU0lHTl9NQU5EQVRPUllfQ04pICE9CisJCQkJCSAgICAwKSB7CisJCQkJCQkvLyBkZWNyZW1lbnQgbWFuZGF0b3J5IHNsYXZlIGNvdW50ZXIKKwkJCQkJCUVwbE5tdE1udUluc3RhbmNlX2cuCisJCQkJCQkgICAgbV91aU1hbmRhdG9yeVNsYXZlQ291bnQtLTsKKwkJCQkJfQorCQkJCQlpZiAoTm10U3RhdGUgIT0ga0VwbE5tdE1zUmVhZHlUb09wZXJhdGUpIHsKKwkJCQkJCUVQTF9OTVRNTlVfREJHX1BPU1RfVFJBQ0VfVkFMVUUKKwkJCQkJCSAgICAoTm9kZUV2ZW50X3AsIHVpTm9kZUlkX3AsCisJCQkJCQkgICAgICgoKE5vZGVObXRTdGF0ZV9wICYgMHhGRikKKwkJCQkJCSAgICAgICA8PCA4KQorCQkJCQkJICAgICAgfCBrRXBsTm10Q21kU3RhcnROb2RlKSk7CisKKwkJCQkJCS8vIHN0YXJ0IG9wdGlvbmFsIENOCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbE5tdE1udVNlbmRObXRDb21tYW5kCisJCQkJCQkgICAgKHVpTm9kZUlkX3AsCisJCQkJCQkgICAgIGtFcGxObXRDbWRTdGFydE5vZGUpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxObXRNbnVJbnROb2RlRXZlbnRObXRDbWRTZW50OgorCQl7CisJCQlCWVRFIGJObXRTdGF0ZTsKKworCQkJLy8gdXBkYXRlIGV4cGVjdGVkIE5NVCBzdGF0ZSB3aXRoIHRoZSBvbmUgdGhhdCByZXN1bHRzCisJCQkvLyBmcm9tIHRoZSBzZW50IE5NVCBjb21tYW5kCisJCQliTm10U3RhdGUgPSAoQllURSkgKE5vZGVObXRTdGF0ZV9wICYgMHhGRik7CisKKwkJCS8vIHdyaXRlIG9iamVjdCAweDFGOEYgTk1UX01OTm9kZUV4cFN0YXRlX0FVOAorCQkJUmV0ID0KKwkJCSAgICBFcGxPYmR1V3JpdGVFbnRyeSgweDFGOEYsIHVpTm9kZUlkX3AsICZiTm10U3RhdGUsCisJCQkJCSAgICAgIDEpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKworCQkJaWYgKE5vZGVObXRTdGF0ZV9wID09IGtFcGxObXRDc05vdEFjdGl2ZSkgewkvLyByZXN0YXJ0IHByb2Nlc3Npbmcgd2l0aCBJZGVudFJlcXVlc3QKKwkJCQlFUExfTk1UTU5VX1NFVF9GTEFHU19USU1FUkFSR19JREVOVFJFUQorCQkJCSAgICAocE5vZGVJbmZvLCB1aU5vZGVJZF9wLCBUaW1lckFyZyk7CisJCQl9IGVsc2UgewkvLyBtb25pdG9yIE5NVCBzdGF0ZSBjaGFuZ2Ugd2l0aCBTdGF0dXNSZXF1ZXN0IGFmdGVyCisJCQkJLy8gdGhlIGNvcnJlc3BvbmRpbmcgZGVsYXk7CisJCQkJLy8gdW50aWwgdGhlbiB3cm9uZyBOTVQgc3RhdGVzIHdpbGwgYmUgaWdub3JlZAorCQkJCUVQTF9OTVRNTlVfU0VUX0ZMQUdTX1RJTUVSQVJHX1NUQVRFX01PTgorCQkJCSAgICAocE5vZGVJbmZvLCB1aU5vZGVJZF9wLCBUaW1lckFyZyk7CisKKwkJCQkvLyBzZXQgTk1UIHN0YXRlIGNoYW5nZSBmbGFnCisJCQkJcE5vZGVJbmZvLT5tX3dGbGFncyB8PQorCQkJCSAgICBFUExfTk1UTU5VX05PREVfRkxBR19OTVRfQ01EX0lTU1VFRDsKKwkJCX0KKworCQkJUmV0ID0KKwkJCSAgICBFcGxUaW1lcnVNb2RpZnlUaW1lck1zKCZwTm9kZUluZm8tPgorCQkJCQkJICAgbV9UaW1lckhkbFN0YXRSZXEsCisJCQkJCQkgICBFcGxObXRNbnVJbnN0YW5jZV9nLgorCQkJCQkJICAgbV91bFN0YXR1c1JlcXVlc3REZWxheSwKKwkJCQkJCSAgIFRpbWVyQXJnKTsKKworCQkJLy8gZmluaXNoIHByb2Nlc3NpbmcsIGJlY2F1c2UgTm10U3RhdGVfcCBpcyB0aGUgZXhwZWN0ZWQgYW5kIG5vdCB0aGUgY3VycmVudCBzdGF0ZQorCQkJZ290byBFeGl0OworCQl9CisKKwlkZWZhdWx0OgorCQl7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8vIGNoZWNrIGlmIG5ldHdvcmsgaXMgcmVhZHkgdG8gY2hhbmdlIGxvY2FsIE5NVCBzdGF0ZSBhbmQgdGhpcyB3YXMgbm90IGRvbmUgYmVmb3JlCisJaWYgKChFcGxObXRNbnVJbnN0YW5jZV9nLm1fd0ZsYWdzICYgKEVQTF9OTVRNTlVfRkxBR19IQUxURUQgfCBFUExfTk1UTU5VX0ZMQUdfQVBQX0lORk9STUVEKSkgPT0gMCkgewkvLyBib290IHByb2Nlc3MgaXMgbm90IGhhbHRlZAorCQlzd2l0Y2ggKE5tdFN0YXRlKSB7CisJCWNhc2Uga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwxOgorCQkJeworCQkJCWlmICgoRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpU2lnbmFsU2xhdmVDb3VudCA9PQorCQkJCSAgICAgMCkKKwkJCQkgICAgJiYgKEVwbE5tdE1udUluc3RhbmNlX2cubV91aU1hbmRhdG9yeVNsYXZlQ291bnQgPT0gMCkpIHsJLy8gYWxsIG9wdGlvbmFsIENOcyBzY2FubmVkIG9uY2UgYW5kIGFsbCBtYW5kYXRvcnkgQ05zIGNvbmZpZ3VyZWQgc3VjY2Vzc2Z1bGx5CisJCQkJCUVwbE5tdE1udUluc3RhbmNlX2cubV93RmxhZ3MgfD0KKwkJCQkJICAgIEVQTF9OTVRNTlVfRkxBR19BUFBfSU5GT1JNRUQ7CisJCQkJCS8vIGluZm9ybSBhcHBsaWNhdGlvbgorCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fcGZuQ2JCb290RXZlbnQKKwkJCQkJICAgIChrRXBsTm10Qm9vdEV2ZW50Qm9vdFN0ZXAxRmluaXNoLAorCQkJCQkgICAgIE5tdFN0YXRlLCBFUExfRV9OT19FUlJPUik7CisJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCWlmIChSZXQgPT0ga0VwbFJlamVjdCkgeworCQkJCQkJCS8vIHdhaXQgZm9yIGFwcGxpY2F0aW9uCisJCQkJCQkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQkvLyBlbnRlciBQcmVPcDIKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbE5tdHVObXRFdmVudAorCQkJCQkgICAgKGtFcGxObXRFdmVudEFsbE1hbmRhdG9yeUNOSWRlbnQpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQljYXNlIGtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMjoKKwkJCXsKKwkJCQlpZiAoKEVwbE5tdE1udUluc3RhbmNlX2cubV91aVNpZ25hbFNsYXZlQ291bnQgPT0KKwkJCQkgICAgIDApCisJCQkJICAgICYmIChFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlNYW5kYXRvcnlTbGF2ZUNvdW50ID09IDApKSB7CS8vIGFsbCBvcHRpb25hbCBDTnMgY2hlY2tlZCBvbmNlIGZvciBSZWFkeVRvT3AgYW5kIGFsbCBtYW5kYXRvcnkgQ05zIGFyZSBSZWFkeVRvT3AKKwkJCQkJRXBsTm10TW51SW5zdGFuY2VfZy5tX3dGbGFncyB8PQorCQkJCQkgICAgRVBMX05NVE1OVV9GTEFHX0FQUF9JTkZPUk1FRDsKKwkJCQkJLy8gaW5mb3JtIGFwcGxpY2F0aW9uCisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxObXRNbnVJbnN0YW5jZV9nLgorCQkJCQkgICAgbV9wZm5DYkJvb3RFdmVudAorCQkJCQkgICAgKGtFcGxObXRCb290RXZlbnRCb290U3RlcDJGaW5pc2gsCisJCQkJCSAgICAgTm10U3RhdGUsIEVQTF9FX05PX0VSUk9SKTsKKwkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJaWYgKFJldCA9PSBrRXBsUmVqZWN0KSB7CisJCQkJCQkJLy8gd2FpdCBmb3IgYXBwbGljYXRpb24KKwkJCQkJCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCS8vIGVudGVyIFJlYWR5VG9PcAorCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsTm10dU5tdEV2ZW50CisJCQkJCSAgICAoa0VwbE5tdEV2ZW50RW50ZXJSZWFkeVRvT3BlcmF0ZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCWNhc2Uga0VwbE5tdE1zUmVhZHlUb09wZXJhdGU6CisJCQl7CisJCQkJaWYgKChFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlTaWduYWxTbGF2ZUNvdW50ID09CisJCQkJICAgICAwKQorCQkJCSAgICAmJiAoRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpTWFuZGF0b3J5U2xhdmVDb3VudCA9PSAwKSkgewkvLyBhbGwgQ05zIGNoZWNrZWQgZm9yIGVycm9ybGVzcyBjb21tdW5pY2F0aW9uCisJCQkJCUVwbE5tdE1udUluc3RhbmNlX2cubV93RmxhZ3MgfD0KKwkJCQkJICAgIEVQTF9OTVRNTlVfRkxBR19BUFBfSU5GT1JNRUQ7CisJCQkJCS8vIGluZm9ybSBhcHBsaWNhdGlvbgorCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsTm10TW51SW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fcGZuQ2JCb290RXZlbnQKKwkJCQkJICAgIChrRXBsTm10Qm9vdEV2ZW50Q2hlY2tDb21GaW5pc2gsCisJCQkJCSAgICAgTm10U3RhdGUsIEVQTF9FX05PX0VSUk9SKTsKKwkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJaWYgKFJldCA9PSBrRXBsUmVqZWN0KSB7CisJCQkJCQkJLy8gd2FpdCBmb3IgYXBwbGljYXRpb24KKwkJCQkJCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCS8vIGVudGVyIE9wZXJhdGlvbmFsCisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxObXR1Tm10RXZlbnQKKwkJCQkJICAgIChrRXBsTm10RXZlbnRFbnRlck1zT3BlcmF0aW9uYWwpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQljYXNlIGtFcGxObXRNc09wZXJhdGlvbmFsOgorCQkJeworCQkJCWlmICgoRXBsTm10TW51SW5zdGFuY2VfZy5tX3VpU2lnbmFsU2xhdmVDb3VudCA9PQorCQkJCSAgICAgMCkKKwkJCQkgICAgJiYgKEVwbE5tdE1udUluc3RhbmNlX2cubV91aU1hbmRhdG9yeVNsYXZlQ291bnQgPT0gMCkpIHsJLy8gYWxsIG9wdGlvbmFsIENOcyBzY2FubmVkIG9uY2UgYW5kIGFsbCBtYW5kYXRvcnkgQ05zIGFyZSBPUEVSQVRJT05BTAorCQkJCQlFcGxObXRNbnVJbnN0YW5jZV9nLm1fd0ZsYWdzIHw9CisJCQkJCSAgICBFUExfTk1UTU5VX0ZMQUdfQVBQX0lORk9STUVEOworCQkJCQkvLyBpbmZvcm0gYXBwbGljYXRpb24KKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbE5tdE1udUluc3RhbmNlX2cuCisJCQkJCSAgICBtX3BmbkNiQm9vdEV2ZW50CisJCQkJCSAgICAoa0VwbE5tdEJvb3RFdmVudE9wZXJhdGlvbmFsLAorCQkJCQkgICAgIE5tdFN0YXRlLCBFUExfRV9OT19FUlJPUik7CisJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCWlmIChSZXQgPT0ga0VwbFJlamVjdCkgeworCQkJCQkJCS8vIGlnbm9yZSBlcnJvciBjb2RlCisJCQkJCQkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQlkZWZhdWx0OgorCQkJeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdE1udUNoZWNrTm10U3RhdGUKKy8vCisvLyBEZXNjcmlwdGlvbjogY2hlY2tzIHRoZSBOTVQgc3RhdGUsIGkuZS4gZXZhbHVhdGVzIGl0IHdpdGggb2JqZWN0IDB4MUY4RgorLy8gICAgICAgICAgICAgIE5NVF9NTk5vZGVFeHBTdGF0ZV9BVTggYW5kIHVwZGF0ZXMgb2JqZWN0IDB4MUY4RQorLy8gICAgICAgICAgICAgIE5NVF9NTk5vZGVDdXJyU3RhdGVfQVU4LgorLy8gICAgICAgICAgICAgIEl0IG1hbmlwdWxhdGVzIG1fTm9kZVN0YXRlIGluIGludGVybmFsIG5vZGUgaW5mbyBzdHJ1Y3R1cmUuCisvLworLy8gUGFyYW1ldGVyczogIHVpTm9kZUlkX3AgICAgICAgICAgICAgID0gbm9kZSBJRAorLy8gICAgICAgICAgICAgIE5vZGVObXRTdGF0ZV9wICAgICAgICAgID0gTk1UIHN0YXRlIG9mIENOCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8gICAgICAgICAgICAgICAgICBrRXBsUmVqZWN0ICAgICAgICAgID0gQ04gd2FzIGluIHdyb25nIHN0YXRlIGFuZCBoYXMgYmVlbiByZXNldAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE5tdE1udUNoZWNrTm10U3RhdGUodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCSB0RXBsTm10TW51Tm9kZUluZm8gKiBwTm9kZUluZm9fcCwKKwkJCQkJIHRFcGxObXRTdGF0ZSBOb2RlTm10U3RhdGVfcCwKKwkJCQkJIFdPUkQgd0Vycm9yQ29kZV9wLAorCQkJCQkgdEVwbE5tdFN0YXRlIExvY2FsTm10U3RhdGVfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxPYmRTaXplIE9iZFNpemU7CisJQllURSBiTm10U3RhdGU7CisJQllURSBiTm10U3RhdGVQcmV2OworCXRFcGxObXRTdGF0ZSBFeHBObXRTdGF0ZTsKKworCU9iZFNpemUgPSAxOworCS8vIHJlYWQgb2JqZWN0IDB4MUY4RiBOTVRfTU5Ob2RlRXhwU3RhdGVfQVU4CisJUmV0ID0gRXBsT2JkdVJlYWRFbnRyeSgweDFGOEYsIHVpTm9kZUlkX3AsICZiTm10U3RhdGUsICZPYmRTaXplKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gY29tcHV0ZSBleHBlY3RlZCBOTVQgc3RhdGUKKwlFeHBObXRTdGF0ZSA9ICh0RXBsTm10U3RhdGUpIChiTm10U3RhdGUgfCBFUExfTk1UX1RZUEVfQ1MpOworCS8vIGNvbXB1dGUgQllURSBvZiBjdXJyZW50IE5NVCBzdGF0ZQorCWJObXRTdGF0ZSA9ICgoQllURSkgTm9kZU5tdFN0YXRlX3AgJiAweEZGKTsKKworCWlmIChFeHBObXRTdGF0ZSA9PSBrRXBsTm10Q3NOb3RBY3RpdmUpIHsJLy8gaWdub3JlIHRoZSBjdXJyZW50IHN0YXRlLCBiZWNhdXNlIHRoZSBDTiBzaGFsbCBiZSBub3QgYWN0aXZlCisJCVJldCA9IGtFcGxSZWplY3Q7CisJCWdvdG8gRXhpdDsKKwl9IGVsc2UgaWYgKChFeHBObXRTdGF0ZSA9PSBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDIpCisJCSAgICYmIChOb2RlTm10U3RhdGVfcCA9PSBrRXBsTm10Q3NSZWFkeVRvT3BlcmF0ZSkpIHsJLy8gQ04gc3dpdGNoZWQgdG8gUmVhZHlUb09wCisJCS8vIGRlbGV0ZSB0aW1lciBmb3IgdGltZW91dCBoYW5kbGluZworCQlSZXQgPSBFcGxUaW1lcnVEZWxldGVUaW1lcigmcE5vZGVJbmZvX3AtPm1fVGltZXJIZGxMb25nZXIpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJcE5vZGVJbmZvX3AtPm1fTm9kZVN0YXRlID0ga0VwbE5tdE1udU5vZGVTdGF0ZVJlYWR5VG9PcDsKKworCQkvLyB1cGRhdGUgb2JqZWN0IDB4MUY4RiBOTVRfTU5Ob2RlRXhwU3RhdGVfQVU4IHRvIFJlYWR5VG9PcAorCQlSZXQgPSBFcGxPYmR1V3JpdGVFbnRyeSgweDFGOEYsIHVpTm9kZUlkX3AsICZiTm10U3RhdGUsIDEpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKworCQlpZiAoKHBOb2RlSW5mb19wLT5tX2R3Tm9kZUNmZyAmIEVQTF9OT0RFQVNTSUdOX01BTkRBVE9SWV9DTikgIT0gMCkgewkvLyBub2RlIGlzIGEgbWFuZGF0b3J5IENOIC0+IGRlY3JlbWVudCBjb3VudGVyCisJCQlFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlNYW5kYXRvcnlTbGF2ZUNvdW50LS07CisJCX0KKwkJaWYgKExvY2FsTm10U3RhdGVfcCA+PSBrRXBsTm10TXNSZWFkeVRvT3BlcmF0ZSkgewkvLyBzdGFydCBwcm9jZWR1cmUgQ2hlY2tDb21tdW5pY2F0aW9uIGZvciB0aGlzIG5vZGUKKwkJCVJldCA9IEVwbE5tdE1udU5vZGVDaGVja0NvbSh1aU5vZGVJZF9wLCBwTm9kZUluZm9fcCk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlpZiAoKExvY2FsTm10U3RhdGVfcCA9PSBrRXBsTm10TXNPcGVyYXRpb25hbCkKKwkJCSAgICAmJiAocE5vZGVJbmZvX3AtPm1fTm9kZVN0YXRlID09CisJCQkJa0VwbE5tdE1udU5vZGVTdGF0ZUNvbUNoZWNrZWQpKSB7CisJCQkJRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRSgwLCB1aU5vZGVJZF9wLAorCQkJCQkJCQkoKChOb2RlTm10U3RhdGVfcCAmIDB4RkYpIDw8IDgpCisJCQkJCQkJCSB8CisJCQkJCQkJCSBrRXBsTm10Q21kU3RhcnROb2RlKSk7CisKKwkJCQkvLyBpbW1lZGlhdGVseSBzdGFydCBvcHRpb25hbCBDTiwgYmVjYXVzZSBjb21tdW5pY2F0aW9uIGlzIGFsd2F5cyBPSyAoZS5nLiBhc3luYy1vbmx5IENOKQorCQkJCVJldCA9CisJCQkJICAgIEVwbE5tdE1udVNlbmRObXRDb21tYW5kKHVpTm9kZUlkX3AsCisJCQkJCQkJICAgIGtFcGxObXRDbWRTdGFydE5vZGUpOworCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKwkJCX0KKwkJfQorCisJfSBlbHNlIGlmICgoRXhwTm10U3RhdGUgPT0ga0VwbE5tdENzUmVhZHlUb09wZXJhdGUpCisJCSAgICYmIChOb2RlTm10U3RhdGVfcCA9PSBrRXBsTm10Q3NPcGVyYXRpb25hbCkpIHsJLy8gQ04gc3dpdGNoZWQgdG8gT1BFUkFUSU9OQUwKKwkJcE5vZGVJbmZvX3AtPm1fTm9kZVN0YXRlID0ga0VwbE5tdE1udU5vZGVTdGF0ZU9wZXJhdGlvbmFsOworCisJCWlmICgocE5vZGVJbmZvX3AtPm1fZHdOb2RlQ2ZnICYgRVBMX05PREVBU1NJR05fTUFOREFUT1JZX0NOKSAhPSAwKSB7CS8vIG5vZGUgaXMgYSBtYW5kYXRvcnkgQ04gLT4gZGVjcmVtZW50IGNvdW50ZXIKKwkJCUVwbE5tdE1udUluc3RhbmNlX2cubV91aU1hbmRhdG9yeVNsYXZlQ291bnQtLTsKKwkJfQorCisJfSBlbHNlIGlmICgoRXhwTm10U3RhdGUgIT0gTm9kZU5tdFN0YXRlX3ApCisJCSAgICYmICEoKEV4cE5tdFN0YXRlID09IGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMSkKKwkJCSYmIChOb2RlTm10U3RhdGVfcCA9PSBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDIpKSkgewkvLyBDTiBpcyBub3QgaW4gZXhwZWN0ZWQgTk1UIHN0YXRlICh3aXRob3V0IHRoZSBleGNlcHRpb25zIGFib3ZlKQorCQlXT1JEIHdiZUVycm9yQ29kZTsKKworCQlpZiAoKHBOb2RlSW5mb19wLT4KKwkJICAgICBtX3dGbGFncyAmIEVQTF9OTVRNTlVfTk9ERV9GTEFHX05PVF9TQ0FOTkVEKSAhPSAwKSB7CisJCQkvLyBkZWNyZW1lbnQgb25seSBzaWduYWwgc2xhdmUgY291bnQgaWYgY2hlY2tlZCBvbmNlCisJCQlFcGxObXRNbnVJbnN0YW5jZV9nLm1fdWlTaWduYWxTbGF2ZUNvdW50LS07CisJCQlwTm9kZUluZm9fcC0+bV93RmxhZ3MgJj0KKwkJCSAgICB+RVBMX05NVE1OVV9OT0RFX0ZMQUdfTk9UX1NDQU5ORUQ7CisJCX0KKworCQlpZiAocE5vZGVJbmZvX3AtPm1fTm9kZVN0YXRlID09IGtFcGxObXRNbnVOb2RlU3RhdGVVbmtub3duKSB7CS8vIENOIGlzIGFscmVhZHkgaW4gc3RhdGUgdW5rbm93biwgd2hpY2ggbWVhbnMgdGhhdCBpdCBnb3QKKwkJCS8vIE5NVCByZXNldCBjb21tYW5kIGVhcmxpZXIKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQkvLyAtPiBDTiBpcyBpbiB3cm9uZyBOTVQgc3RhdGUKKwkJcE5vZGVJbmZvX3AtPm1fTm9kZVN0YXRlID0ga0VwbE5tdE1udU5vZGVTdGF0ZVVua25vd247CisKKwkJaWYgKHdFcnJvckNvZGVfcCA9PSAwKSB7CS8vIGFzc3VtZSB3cm9uZyBOTVQgc3RhdGUgZXJyb3IKKwkJCWlmICgocE5vZGVJbmZvX3AtPm1fd0ZsYWdzICYgRVBMX05NVE1OVV9OT0RFX0ZMQUdfTk1UX0NNRF9JU1NVRUQpICE9IDApIHsJLy8gTk1UIGNvbW1hbmQgaGFzIGJlZW4ganVzdCBpc3N1ZWQ7CisJCQkJLy8gaWdub3JlIHdyb25nIE5NVCBzdGF0ZSB1bnRpbCB0aW1lciBleHBpcmVzOworCQkJCS8vIG90aGVyIGVycm9ycyBsaWtlIExPU1NfUFJFU19USCBhcmUgc3RpbGwgcHJvY2Vzc2VkCisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQl3RXJyb3JDb2RlX3AgPSBFUExfRV9OTVRfV1JPTkdfU1RBVEU7CisJCX0KKworCQlCRU5DSE1BUktfTU9EXzA3X1RPR0dMRSg5KTsKKworCQkvLyAkJCQgc3RhcnQgRVJST1JfVFJFQVRNRU5UIGFuZCBpbmZvcm0gYXBwbGljYXRpb24KKwkJUmV0ID0gRXBsTm10TW51SW5zdGFuY2VfZy5tX3BmbkNiTm9kZUV2ZW50KHVpTm9kZUlkX3AsCisJCQkJCQkJICAga0VwbE5tdE5vZGVFdmVudEVycm9yLAorCQkJCQkJCSAgIE5vZGVObXRTdGF0ZV9wLAorCQkJCQkJCSAgIHdFcnJvckNvZGVfcCwKKwkJCQkJCQkgICAocE5vZGVJbmZvX3AtPgorCQkJCQkJCSAgICBtX2R3Tm9kZUNmZyAmCisJCQkJCQkJICAgIEVQTF9OT0RFQVNTSUdOX01BTkRBVE9SWV9DTikKKwkJCQkJCQkgICAhPSAwKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisKKwkJRVBMX05NVE1OVV9EQkdfUE9TVF9UUkFDRV9WQUxVRSgwLAorCQkJCQkJdWlOb2RlSWRfcCwKKwkJCQkJCSgoKE5vZGVObXRTdGF0ZV9wICYgMHhGRikgPDwgOCkKKwkJCQkJCSB8IGtFcGxObXRDbWRSZXNldE5vZGUpKTsKKworCQkvLyByZXNldCBDTgorCQkvLyBzdG9yZSBlcnJvciBjb2RlIGluIE5NVCBjb21tYW5kIGRhdGEgZm9yIGRpYWdub3N0aWMgcHVycG9zZQorCQlBbWlTZXRXb3JkVG9MZSgmd2JlRXJyb3JDb2RlLCB3RXJyb3JDb2RlX3ApOworCQlSZXQgPQorCQkgICAgRXBsTm10TW51U2VuZE5tdENvbW1hbmRFeCh1aU5vZGVJZF9wLCBrRXBsTm10Q21kUmVzZXROb2RlLAorCQkJCQkgICAgICAmd2JlRXJyb3JDb2RlLAorCQkJCQkgICAgICBzaXplb2Yod2JlRXJyb3JDb2RlKSk7CisJCWlmIChSZXQgPT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCVJldCA9IGtFcGxSZWplY3Q7CisJCX0KKworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGNoZWNrIGlmIE5NVF9NTk5vZGVDdXJyU3RhdGVfQVU4IGhhcyB0byBiZSBjaGFuZ2VkCisJT2JkU2l6ZSA9IDE7CisJUmV0ID0gRXBsT2JkdVJlYWRFbnRyeSgweDFGOEUsIHVpTm9kZUlkX3AsICZiTm10U3RhdGVQcmV2LCAmT2JkU2l6ZSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCWlmIChiTm10U3RhdGUgIT0gYk5tdFN0YXRlUHJldikgeworCQkvLyB1cGRhdGUgb2JqZWN0IDB4MUY4RSBOTVRfTU5Ob2RlQ3VyclN0YXRlX0FVOAorCQlSZXQgPSBFcGxPYmR1V3JpdGVFbnRyeSgweDFGOEUsIHVpTm9kZUlkX3AsICZiTm10U3RhdGUsIDEpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJUmV0ID0gRXBsTm10TW51SW5zdGFuY2VfZy5tX3BmbkNiTm9kZUV2ZW50KHVpTm9kZUlkX3AsCisJCQkJCQkJICAga0VwbE5tdE5vZGVFdmVudE5tdFN0YXRlLAorCQkJCQkJCSAgIE5vZGVObXRTdGF0ZV9wLAorCQkJCQkJCSAgIHdFcnJvckNvZGVfcCwKKwkJCQkJCQkgICAocE5vZGVJbmZvX3AtPgorCQkJCQkJCSAgICBtX2R3Tm9kZUNmZyAmCisJCQkJCQkJICAgIEVQTF9OT0RFQVNTSUdOX01BTkRBVE9SWV9DTikKKwkJCQkJCQkgICAhPSAwKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdE1udVJlc2V0CisvLworLy8gRGVzY3JpcHRpb246IHJlc2V0IGludGVybmFsIHN0cnVjdHVyZXMsIGUuZy4gdGltZXJzCisvLworLy8gUGFyYW1ldGVyczogIHZvaWQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsTm10TW51UmVzZXQodm9pZCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwlpbnQgaUluZGV4OworCisJUmV0ID0gRXBsVGltZXJ1RGVsZXRlVGltZXIoJkVwbE5tdE1udUluc3RhbmNlX2cubV9UaW1lckhkbE5tdFN0YXRlKTsKKworCWZvciAoaUluZGV4ID0gMTsgaUluZGV4IDw9IHRhYmVudHJpZXMoRXBsTm10TW51SW5zdGFuY2VfZy5tX2FOb2RlSW5mbyk7CisJICAgICBpSW5kZXgrKykgeworCQkvLyBkZWxldGUgdGltZXIgaGFuZGxlcworCQlSZXQgPQorCQkgICAgRXBsVGltZXJ1RGVsZXRlVGltZXIoJkVQTF9OTVRNTlVfR0VUX05PREVJTkZPKGlJbmRleCktPgorCQkJCQkgbV9UaW1lckhkbFN0YXRSZXEpOworCQlSZXQgPQorCQkgICAgRXBsVGltZXJ1RGVsZXRlVGltZXIoJkVQTF9OTVRNTlVfR0VUX05PREVJTkZPKGlJbmRleCktPgorCQkJCQkgbV9UaW1lckhkbExvbmdlcik7CisJfQorCisJcmV0dXJuIFJldDsKK30KKworI2VuZGlmIC8vICNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE5tdGsuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsTm10ay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMmQwZTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE5tdGsuYwpAQCAtMCwwICsxLDE4NDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgTk1ULUtlcm5lbHNwYWNlLU1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE5tdGsuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMTIgJCAgJERhdGU6IDIwMDgvMTEvMTMgMTc6MTM6MDkgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8wOSBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAia2VybmVsL0VwbE5tdGsuaCIKKyNpbmNsdWRlICJrZXJuZWwvRXBsVGltZXJrLmgiCisKKyNpbmNsdWRlICJrZXJuZWwvRXBsRGxsay5oIgkvLyBmb3IgRXBsRGxsa1Byb2Nlc3MoKQorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVEspKSAhPSAwKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRyYWNlUG9pbnQgc3VwcG9ydCBmb3IgcmVhbHRpbWUtZGVidWdnaW5nCisjaWZkZWYgX0RCR19UUkFDRV9QT0lOVFNfCit2b2lkIFBVQkxJQyBUZ3REYmdTaWduYWxUcmFjZVBvaW50KEJZVEUgYlRyYWNlUG9pbnROdW1iZXJfcCk7Cit2b2lkIFBVQkxJQyBUZ3REYmdQb3N0VHJhY2VWYWx1ZShEV09SRCBkd1RyYWNlVmFsdWVfcCk7CisjZGVmaW5lIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKHApICAgVGd0RGJnU2lnbmFsVHJhY2VQb2ludChwKQorI2RlZmluZSBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUodikgICAgIFRndERiZ1Bvc3RUcmFjZVZhbHVlKHYpCisjZWxzZQorI2RlZmluZSBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVChwKQorI2RlZmluZSBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUodikKKyNlbmRpZgorI2RlZmluZSBFUExfTk1US19EQkdfUE9TVF9UUkFDRV9WQUxVRShObXRFdmVudF9wLCBPbGRObXRTdGF0ZV9wLCBOZXdObXRTdGF0ZV9wKSBcCisgICAgVEdUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKChrRXBsRXZlbnRTaW5rTm10ayA8PCAyOCkgfCAoTm10RXZlbnRfcCA8PCAxNikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgoT2xkTm10U3RhdGVfcCAmIDB4RkYpIDw8IDgpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoTmV3Tm10U3RhdGVfcCAmIDB4RkYpKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBzdHJ1Y3QgZm9yIGluc3RhbmNlIHRhYmxlCitJTlNUQU5DRV9UWVBFX0JFR0lOIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9NRU1CRVIoKQorCitTVEFUSUMgdm9sYXRpbGUgdEVwbE5tdFN0YXRlIElOU1RfRkFSIG1fTm10U3RhdGU7CitTVEFUSUMgdm9sYXRpbGUgQk9PTCBJTlNUX0ZBUiBtX2ZFbmFibGVSZWFkeVRvT3BlcmF0ZTsKK1NUQVRJQyB2b2xhdGlsZSBCT09MIElOU1RfRkFSIG1fZkFwcFJlYWR5VG9PcGVyYXRlOworU1RBVElDIHZvbGF0aWxlIEJPT0wgSU5TVF9GQVIgbV9mVGltZXJNc1ByZU9wMjsKK1NUQVRJQyB2b2xhdGlsZSBCT09MIElOU1RfRkFSIG1fZkFsbE1hbmRhdG9yeUNOSWRlbnQ7CitTVEFUSUMgdm9sYXRpbGUgQk9PTCBJTlNUX0ZBUiBtX2ZGcm96ZW47CisKK0lOU1RBTkNFX1RZUEVfRU5ECisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGhpcyBtYWNybyByZXBsYWNlIHRoZSB1bnNwZWNpZmljIHBvaW50ZXIgdG8gYW4gaW5zdGFuY2UgdGhyb3VnaAorLy8gdGhlIG1vZHVsIHNwZWNpZmljIHR5cGUgZm9yIHRoZSBsb2NhbCBpbnN0YW5jZSB0YWJsZS4gVGhpcyBtYWNybworLy8gbXVzdCBkZWZpbmVkIGluIGVhY2ggbW9kdWwuCisvLyNkZWZpbmUgdEVwbFB0ckluc3RhbmNlICAgICAgICAgICAgIHRFcGxJbnN0YW5jZUluZm8gTUVNKgorRVBMX01DT19ERUNMX0lOU1RBTkNFX1ZBUigpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTF9NQ09fREVGSU5FX0lOU1RBTkNFX0ZDVCgpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEMgTCBBIFMgUyAgPE5NVF9LZXJuZWwtTW9kdWxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLworLy8gRGVzY3JpcHRpb246IFRoaXMgbW9kdWxlIHJlYWxpemUgdGhlIE5NVC1TdGF0ZS1NYWNoaW5lIG9mIHRoZSBFUEwtU3RhY2sKKy8vCisvLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgICAgIEVwbE5tdGtJbml0CisvLworLy8gRGVzY3JpcHRpb246IGluaXRpYWxpemVzIHRoZSBmaXJzdCBpbnN0YW5jZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIEVQTF9NQ09fREVDTF9QVFJfSU5TVEFOQ0VfUFRSID0gSW5zdGFuY2UgcG9pbnRlcgorLy8gICAgICAgICAgICAgIHVpTm9kZUlkX3AgPSBOb2RlIElkIG9mIHRoZSBsb2thbCBub2RlCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9ICAgRXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10a0luaXQoRVBMX01DT19ERUNMX1BUUl9JTlNUQU5DRV9QVFIpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBFcGxObXRrQWRkSW5zdGFuY2UoRVBMX01DT19QVFJfSU5TVEFOQ0VfUFRSKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgICAgICBFcGxObXRrQWRkSW5zdGFuY2UKKy8vCisvLyBEZXNjcmlwdGlvbjogYWRkcyBhIG5ldyBpbnN0YW5jZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIEVQTF9NQ09fREVDTF9QVFJfSU5TVEFOQ0VfUFRSID0gSW5zdGFuY2UgcG9pbnRlcgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSAgIEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE5tdGtBZGRJbnN0YW5jZShFUExfTUNPX0RFQ0xfUFRSX0lOU1RBTkNFX1BUUikKK3sKKwlFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSX0xPQ0FMIHRFcGxLZXJuZWwgUmV0OworLy90RXBsRXZlbnQgICAgICAgICAgICAgICBFdmVudDsKKy8vdEVwbEV2ZW50Tm10U3RhdGVDaGFuZ2UgTm10U3RhdGVDaGFuZ2U7CisKKwkvLyBjaGVjayBpZiBwb2ludGVyIHRvIGluc3RhbmNlIHBvaW50ZXIgdmFsaWQKKwkvLyBnZXQgZnJlZSBpbnN0YW5jZSBhbmQgc2V0IHRoZSBnbG9iYWxlIGluc3RhbmNlIHBvaW50ZXIKKwkvLyBzZXQgYWxzbyB0aGUgaW5zdGFuY2UgYWRkciB0byBwYXJhbWV0ZXJsaXN0CisJRVBMX01DT19DSEVDS19QVFJfSU5TVEFOQ0VfUFRSKCk7CisJRVBMX01DT19HRVRfRlJFRV9JTlNUQU5DRV9QVFIoKTsKKwlFUExfTUNPX1NFVF9QVFJfSU5TVEFOQ0VfUFRSKCk7CisKKwkvLyBzaWduIGluc3RhbmNlIGFzIHVzZWQKKwlFUExfTUNPX1dSSVRFX0lOU1RBTkNFX1NUQVRFKGtTdGF0ZVVzZWQpOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBpbml0aWFsaXplIGludGVybiB2YWlhYmxlcworCS8vIDIwMDYvMDcvMzEgZC5rLjogc2V0IE5NVC1TdGF0ZSB0byBrRXBsTm10R3NPZmYKKwlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPSBrRXBsTm10R3NPZmY7CisJLy8gc2V0IE5NVC1TdGF0ZSB0byBrRXBsTm10R3NJbml0aWFsaXNpbmcKKwkvL0VQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9IGtFcGxObXRHc0luaXRpYWxpc2luZzsKKworCS8vIHNldCBmbGFncyB0byBGQUxTRQorCUVQTF9NQ09fR0xCX1ZBUihtX2ZFbmFibGVSZWFkeVRvT3BlcmF0ZSkgPSBGQUxTRTsKKwlFUExfTUNPX0dMQl9WQVIobV9mQXBwUmVhZHlUb09wZXJhdGUpID0gRkFMU0U7CisJRVBMX01DT19HTEJfVkFSKG1fZlRpbWVyTXNQcmVPcDIpID0gRkFMU0U7CisJRVBMX01DT19HTEJfVkFSKG1fZkFsbE1hbmRhdG9yeUNOSWRlbnQpID0gRkFMU0U7CisJRVBMX01DT19HTEJfVkFSKG1fZkZyb3plbikgPSBGQUxTRTsKKworLy8gICAgRVBMX01DT19HTEJfVkFSKG1fVGltZXJIZGwpID0gMDsKKworCS8vIGluZm9ybSBoaWdoZXIgbGF5ZXIgYWJvdXQgc3RhdGUgY2hhbmdlCisJLy8gMjAwNi8wNy8zMSBkLmsuOiBUaGUgRVBMIEFQSSBsYXllci9hcHBsaWNhdGlvbiBoYXMgdG8gc3RhcnQgTk1UIHN0YXRlCisJLy8gICAgICAgICAgICAgICAgICBtYWNoaW5lIHZpYSBObXRFdmVudFN3UmVzZXQgYWZ0ZXIgaW5pdGlhbGlzYXRpb24gb2YKKwkvLyAgICAgICAgICAgICAgICAgIGFsbCBtb2R1bGVzIGhhcyBiZWVuIGNvbXBsZXRlZC4gRExMIGhhcyB0byBiZSBpbml0aWFsaXNlZAorCS8vICAgICAgICAgICAgICAgICAgYWZ0ZXIgTk1UayBiZWNhdXNlIE5NVCBzdGF0ZSBzaGFsbCBub3QgYmUgdW5pbml0aWFsaXNlZAorCS8vICAgICAgICAgICAgICAgICAgYXQgdGhhdCB0aW1lLgorLyogICAgTm10U3RhdGVDaGFuZ2UubV9OZXdObXRTdGF0ZSA9IEVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKTsKKyAgICBObXRTdGF0ZUNoYW5nZS5tX05tdEV2ZW50ID0ga0VwbE5tdEV2ZW50Tm9FdmVudDsKKyAgICBFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtObXR1OworICAgIEV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZU5tdFN0YXRlQ2hhbmdlOworICAgIEVQTF9NRU1TRVQoJkV2ZW50Lm1fTmV0VGltZSwgMHgwMCwgc2l6ZW9mKEV2ZW50Lm1fTmV0VGltZSkpOworICAgIEV2ZW50Lm1fcEFyZyA9ICZObXRTdGF0ZUNoYW5nZTsKKyAgICBFdmVudC5tX3VpU2l6ZSA9IHNpemVvZihObXRTdGF0ZUNoYW5nZSk7CisgICAgUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworKi8KKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICAgICAgRXBsTm10a0RlbEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGRlbGV0ZSBpbnN0YW5jZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIEVQTF9NQ09fREVDTF9QVFJfSU5TVEFOQ0VfUFRSID0gSW5zdGFuY2UgcG9pbnRlcgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSAgIEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIChFUExfVVNFX0RFTEVURUlOU1RfRlVOQyAhPSBGQUxTRSkKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRrRGVsSW5zdGFuY2UoRVBMX01DT19ERUNMX1BUUl9JTlNUQU5DRV9QVFIpCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkvLyBjaGVjayBmb3IgYWxsIEFQSSBmdW5jdGlvbiBpZiBpbnN0YW5jZSBpcyB2YWxpZAorCUVQTF9NQ09fQ0hFQ0tfSU5TVEFOQ0VfU1RBVEUoKTsKKworCS8vIHNldCBOTVQtU3RhdGUgdG8ga0VwbE5tdEdzT2ZmCisJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0ga0VwbE5tdEdzT2ZmOworCisJLy8gc2lnbiBpbnN0YW5jZSBhcyB1bnVzZWQKKwlFUExfTUNPX1dSSVRFX0lOU1RBTkNFX1NUQVRFKGtTdGF0ZVVudXNlZCk7CisKKwkvLyBkZWxldGUgdGltZXIKKy8vICAgIFJldCA9IEVwbFRpbWVya0RlbGV0ZVRpbWVyKCZFUExfTUNPX0dMQl9WQVIobV9UaW1lckhkbCkpOworCisJcmV0dXJuIFJldDsKK30KKyNlbmRpZiAvLyAoRVBMX1VTRV9ERUxFVEVJTlNUX0ZVTkMgIT0gRkFMU0UpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgICAgICBFcGxObXRrUHJvY2VzcworLy8KKy8vIERlc2NyaXB0aW9uOiBtYWluIHByb2Nlc3MgZnVuY3Rpb24KKy8vICAgICAgICAgICAgICAtPiBwcm9jZXNzIE5NVC1TdGF0ZS1NYXNjaGluZSB1bmQgcmVhZCBOTVQtRXZlbnRzIGZyb20gUXVldWUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBFUExfTUNPX0RFQ0xfUFRSX0lOU1RBTkNFX1BUUl8gPSBJbnN0YW5jZSBwb2ludGVyCisvLyAgICAgICAgICAgICAgcEV2ZW50X3AgICAgPSAgIEVwbC1FdmVudCB3aXRoIE5NVC1ldmVudCB0byBwcm9jZXNzCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9ICAgRXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10a1Byb2Nlc3MoRVBMX01DT19ERUNMX1BUUl9JTlNUQU5DRV9QVFJfCisJCQkJCSAgICAgIHRFcGxFdmVudCAqIHBFdmVudF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxObXRTdGF0ZSBPbGRObXRTdGF0ZTsKKwl0RXBsTm10RXZlbnQgTm10RXZlbnQ7CisJdEVwbEV2ZW50IEV2ZW50OworCXRFcGxFdmVudE5tdFN0YXRlQ2hhbmdlIE5tdFN0YXRlQ2hhbmdlOworCisJLy8gY2hlY2sgZm9yIGFsbCBBUEkgZnVuY3Rpb24gaWYgaW5zdGFuY2UgaXMgdmFsaWQKKwlFUExfTUNPX0NIRUNLX0lOU1RBTkNFX1NUQVRFKCk7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCXN3aXRjaCAocEV2ZW50X3AtPm1fRXZlbnRUeXBlKSB7CisJY2FzZSBrRXBsRXZlbnRUeXBlTm10RXZlbnQ6CisJCXsKKwkJCU5tdEV2ZW50ID0gKigodEVwbE5tdEV2ZW50ICopIHBFdmVudF9wLT5tX3BBcmcpOworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbEV2ZW50VHlwZVRpbWVyOgorCQl7CisJCQlObXRFdmVudCA9CisJCQkgICAgKHRFcGxObXRFdmVudCkgKCh0RXBsVGltZXJFdmVudEFyZyAqKSBwRXZlbnRfcC0+CisJCQkJCSAgICBtX3BBcmcpLT5tX3VsQXJnOworCQkJYnJlYWs7CisJCX0KKwlkZWZhdWx0OgorCQl7CisJCQlSZXQgPSBrRXBsTm10SW52YWxpZEV2ZW50OworCQkJZ290byBFeGl0OworCQl9CisJfQorCisJLy8gc2F2ZSBOTVQtU3RhdGUKKwkvLyBuZWVkZWQgZm9yIGxhdGVyIGNvbXBhcmlzb24gdG8KKwkvLyBpbmZvcm0gaGdoZXIgbGF5ZXIgYWJvdXQgc3RhdGUgY2hhbmdlCisJT2xkTm10U3RhdGUgPSBFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSk7CisKKwkvLyBOTVQtU3RhdGUtTWFzY2hpbmUKKwlzd2l0Y2ggKEVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSkgeworCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vIGdlbmVyYWwgcGFydCBvZiB0aGUgc3RhdGVtYXNjaGluZQorCisJCS8vIGZpcnN0IGluaXQgb2YgdGhlIGhhcmR3YXJlCisJY2FzZSBrRXBsTm10R3NPZmY6CisJCXsKKwkJCS8vIGxlYXZlIHRoaXMgc3RhdGUgb25seSBpZiBoaWdoZXIgbGF5ZXIgc2F5cyBzbworCQkJaWYgKE5tdEV2ZW50ID09IGtFcGxObXRFdmVudFN3UmVzZXQpIHsJLy8gbmV3IHN0YXRlIGtFcGxObXRHc0luaXRpYWxpc2luZworCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJICAgIGtFcGxObXRHc0luaXRpYWxpc2luZzsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJLy8gZmlyc3QgaW5pdCBvZiB0aGUgaGFyZHdhcmUKKwljYXNlIGtFcGxObXRHc0luaXRpYWxpc2luZzoKKwkJeworCQkJLy8gbGVhdmUgdGhpcyBzdGF0ZSBvbmx5IGlmIGhpZ2hlciBsYXllciBzYXlzIHNvCisKKwkJCS8vIGNoZWNrIGV2ZW50cworCQkJc3dpdGNoIChObXRFdmVudCkgeworCQkJCS8vIDIwMDYvMDcvMzEgZC5rLjogcmVhY3QgYWxzbyBvbiBOTVQgcmVzZXQgY29tbWFuZHMgaW4gUmVzZXRBcHAgc3RhdGUKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd2l0Y2hPZmYKKwkJCWNhc2Uga0VwbE5tdEV2ZW50Q3JpdGljYWxFcnJvcjoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dpdGNoT2ZmOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc09mZjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gbmV3IHN0YXRlIGtFcGxObXRHc1Jlc2V0QXBwbGljYXRpb24KKwkJCWNhc2Uga0VwbE5tdEV2ZW50RW50ZXJSZXNldEFwcDoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldEFwcGxpY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCS8vIGluaXQgb2YgdGhlIG1hbnVmYWN0dXJlci1zcGVjaWZpYyBwcm9maWxlIGFyZWEgYW5kIHRoZQorCQkvLyBzdGFuZGFyZGlzZWQgZGV2aWNlIHByb2ZpbGUgYXJlYQorCWNhc2Uga0VwbE5tdEdzUmVzZXRBcHBsaWNhdGlvbjoKKwkJeworCQkJLy8gY2hlY2sgZXZlbnRzCisJCQlzd2l0Y2ggKE5tdEV2ZW50KSB7CisJCQkJLy8gMjAwNi8wNy8zMSBkLmsuOiByZWFjdCBhbHNvIG9uIE5NVCByZXNldCBjb21tYW5kcyBpbiBSZXNldEFwcCBzdGF0ZQorCQkJCS8vIE5NVCBDb21tYW5kIFN3aXRjaE9mZgorCQkJY2FzZSBrRXBsTm10RXZlbnRDcml0aWNhbEVycm9yOgorCQkJY2FzZSBrRXBsTm10RXZlbnRTd2l0Y2hPZmY6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzT2ZmOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd1Jlc2V0CisJCQljYXNlIGtFcGxObXRFdmVudFN3UmVzZXQ6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzSW5pdGlhbGlzaW5nOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBsZWF2ZSB0aGlzIHN0YXRlIG9ubHkgaWYgaGlnaGVyIGxheWVyCisJCQkJLy8gc2F5IHNvCisJCQljYXNlIGtFcGxObXRFdmVudEVudGVyUmVzZXRDb206CisJCQkJeworCQkJCQkvLyBuZXcgc3RhdGUga0VwbE5tdEdzUmVzZXRDb21tdW5pY2F0aW9uCisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJLy8gaW5pdCBvZiB0aGUgY29tbXVuaWNhdGlvbiBwcm9maWxlIGFyZWEKKwljYXNlIGtFcGxObXRHc1Jlc2V0Q29tbXVuaWNhdGlvbjoKKwkJeworCQkJLy8gY2hlY2sgZXZlbnRzCisJCQlzd2l0Y2ggKE5tdEV2ZW50KSB7CisJCQkJLy8gMjAwNi8wNy8zMSBkLmsuOiByZWFjdCBhbHNvIG9uIE5NVCByZXNldCBjb21tYW5kcyBpbiBSZXNldENvbW0gc3RhdGUKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd2l0Y2hPZmYKKwkJCWNhc2Uga0VwbE5tdEV2ZW50Q3JpdGljYWxFcnJvcjoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dpdGNoT2ZmOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc09mZjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgU3dSZXNldAorCQkJY2FzZSBrRXBsTm10RXZlbnRTd1Jlc2V0OgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc0luaXRpYWxpc2luZzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXROb2RlCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Tm9kZToKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldEFwcGxpY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBsZWF2ZSB0aGlzIHN0YXRlIG9ubHkgaWYgaGlnaGVyIGxheWVyCisJCQkJLy8gc2F5IHNvCisJCQljYXNlIGtFcGxObXRFdmVudEVudGVyUmVzZXRDb25maWc6CisJCQkJeworCQkJCQkvLyBuZXcgc3RhdGUga0VwbE5tdEdzUmVzZXRDb21tdW5pY2F0aW9uCisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbmZpZ3VyYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJLy8gYnVpbGQgdGhlIGNvbmZpZ3VyYXRpb24gd2l0aCBpbmZvcyBmcm9tIE9ECisJY2FzZSBrRXBsTm10R3NSZXNldENvbmZpZ3VyYXRpb246CisJCXsKKwkJCS8vIHJlc2V0IGZsYWdzCisJCQlFUExfTUNPX0dMQl9WQVIobV9mRW5hYmxlUmVhZHlUb09wZXJhdGUpID0gRkFMU0U7CisJCQlFUExfTUNPX0dMQl9WQVIobV9mQXBwUmVhZHlUb09wZXJhdGUpID0gRkFMU0U7CisJCQlFUExfTUNPX0dMQl9WQVIobV9mRnJvemVuKSA9IEZBTFNFOworCisJCQkvLyBjaGVjayBldmVudHMKKwkJCXN3aXRjaCAoTm10RXZlbnQpIHsKKwkJCQkvLyAyMDA2LzA3LzMxIGQuay46IHJlYWN0IGFsc28gb24gTk1UIHJlc2V0IGNvbW1hbmRzIGluIFJlc2V0Q29uZiBzdGF0ZQorCQkJCS8vIE5NVCBDb21tYW5kIFN3aXRjaE9mZgorCQkJY2FzZSBrRXBsTm10RXZlbnRDcml0aWNhbEVycm9yOgorCQkJY2FzZSBrRXBsTm10RXZlbnRTd2l0Y2hPZmY6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzT2ZmOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd1Jlc2V0CisJCQljYXNlIGtFcGxObXRFdmVudFN3UmVzZXQ6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzSW5pdGlhbGlzaW5nOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldE5vZGUKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXROb2RlOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0QXBwbGljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Q29tbXVuaWNhdGlvbgorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldENvbToKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIGxlYXZlIHRoaXMgc3RhdGUgb25seSBpZiBoaWdoZXIgbGF5ZXIgc2F5cyBzbworCQkJY2FzZSBrRXBsTm10RXZlbnRFbnRlckNzTm90QWN0aXZlOgorCQkJCXsJLy8gTm9kZSBzaG91bGQgYmUgQ04KKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRDc05vdEFjdGl2ZTsKKwkJCQkJYnJlYWs7CisKKwkJCQl9CisKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RW50ZXJNc05vdEFjdGl2ZToKKwkJCQl7CS8vIE5vZGUgc2hvdWxkIGJlIENOCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpID09IDApCisJCQkJCS8vIG5vIE1OIGZ1bmN0aW9uYWxpdHkKKwkJCQkJLy8gVE9ETzogLWNyZWF0ZSBlcnJvciBFX05NVF9CQTFfTk9fTU5fU1VQUE9SVAorCQkJCQlFUExfTUNPX0dMQl9WQVIobV9mRnJvemVuKSA9IFRSVUU7CisjZWxzZQorCisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10TXNOb3RBY3RpdmU7CisjZW5kaWYKKwkJCQkJYnJlYWs7CisKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJLy8gQ04gcGFydCBvZiB0aGUgc3RhdGVtYXNjaGluZQorCisJCS8vIG5vZGUgbGlzdGUgZm9yIEVQTC1GcmFtZXMgYW5kIGNoZWNrIHRpbWVvdXQKKwljYXNlIGtFcGxObXRDc05vdEFjdGl2ZToKKwkJeworCisJCQkvLyBjaGVjayBldmVudHMKKwkJCXN3aXRjaCAoTm10RXZlbnQpIHsKKwkJCQkvLyAyMDA2LzA3LzMxIGQuay46IHJlYWN0IGFsc28gb24gTk1UIHJlc2V0IGNvbW1hbmRzIGluIE5vdEFjdGl2ZSBzdGF0ZQorCQkJCS8vIE5NVCBDb21tYW5kIFN3aXRjaE9mZgorCQkJY2FzZSBrRXBsTm10RXZlbnRDcml0aWNhbEVycm9yOgorCQkJY2FzZSBrRXBsTm10RXZlbnRTd2l0Y2hPZmY6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzT2ZmOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd1Jlc2V0CisJCQljYXNlIGtFcGxObXRFdmVudFN3UmVzZXQ6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzSW5pdGlhbGlzaW5nOworLy8gICAgICAgICAgICAgICAgICAgIFJldCA9IEVwbFRpbWVya0RlbGV0ZVRpbWVyKCZFUExfTUNPX0dMQl9WQVIobV9UaW1lckhkbCkpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldE5vZGUKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXROb2RlOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0QXBwbGljYXRpb247CisvLyAgICAgICAgICAgICAgICAgICAgUmV0ID0gRXBsVGltZXJrRGVsZXRlVGltZXIoJkVQTF9NQ09fR0xCX1ZBUihtX1RpbWVySGRsKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Q29tbXVuaWNhdGlvbgorCQkJCS8vIG9yIGludGVybmFsIENvbW11bmljYXRpb24gZXJyb3IKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXRDb206CisJCQljYXNlIGtFcGxObXRFdmVudEludGVybkNvbUVycm9yOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29tbXVuaWNhdGlvbjsKKy8vICAgICAgICAgICAgICAgICAgICBSZXQgPSBFcGxUaW1lcmtEZWxldGVUaW1lcigmRVBMX01DT19HTEJfVkFSKG1fVGltZXJIZGwpKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXQgQ29uZmlndXJhdGlvbgorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldENvbmZpZzoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbmZpZ3VyYXRpb247CisvLyAgICAgICAgICAgICAgICAgICAgUmV0ID0gRXBsVGltZXJrRGVsZXRlVGltZXIoJkVQTF9NQ09fR0xCX1ZBUihtX1RpbWVySGRsKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIHNlZSBpZiBTb0Egb3IgU29DIHJlY2VpdmVkCisJCQkJLy8gay50LiAyMC4wNy4yMDA2OiBvbmx5IFNvQSBmb3JjZXMgY2hhbmdlIG9mIHN0YXRlCisJCQkJLy8gc2VlIEVQTCBWMiBEUyAxLjAuMCBwLjI2NworCQkJCS8vIGNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2M6CisJCQljYXNlIGtFcGxObXRFdmVudERsbENlU29hOgorCQkJCXsJLy8gbmV3IHN0YXRlIFBSRV9PUEVSQVRJT05BTDEKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMTsKKy8vICAgICAgICAgICAgICAgICAgICBSZXQgPSBFcGxUaW1lcmtEZWxldGVUaW1lcigmRVBMX01DT19HTEJfVkFSKG1fVGltZXJIZGwpKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8vIHRpbWVvdXQgZm9yIFNvQSBhbmQgU29jCisJCQljYXNlIGtFcGxObXRFdmVudFRpbWVyQmFzaWNFdGhlcm5ldDoKKwkJCQl7CisJCQkJCS8vIG5ldyBzdGF0ZSBCQVNJQ19FVEhFUk5FVAorCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdENzQmFzaWNFdGhlcm5ldDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKE5tdEV2ZW50KQorCisJCQlicmVhazsKKwkJfQorCisJCS8vIG5vZGUgcHJvY2Vzc2VzIG9ubHkgYXN5bmMgZnJhbWVzCisJY2FzZSBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDE6CisJCXsKKworCQkJLy8gY2hlY2sgZXZlbnRzCisJCQlzd2l0Y2ggKE5tdEV2ZW50KSB7CisJCQkJLy8gTk1UIENvbW1hbmQgU3dpdGNoT2ZmCisJCQljYXNlIGtFcGxObXRFdmVudENyaXRpY2FsRXJyb3I6CisJCQljYXNlIGtFcGxObXRFdmVudFN3aXRjaE9mZjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NPZmY7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFN3UmVzZXQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dSZXNldDoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NJbml0aWFsaXNpbmc7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Tm9kZQorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldE5vZGU6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRBcHBsaWNhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXRDb21tdW5pY2F0aW9uCisJCQkJLy8gb3IgaW50ZXJuYWwgQ29tbXVuaWNhdGlvbiBlcnJvcgorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldENvbToKKwkJCWNhc2Uga0VwbE5tdEV2ZW50SW50ZXJuQ29tRXJyb3I6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRDb21tdW5pY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldCBDb25maWd1cmF0aW9uCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29uZmlnOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgU3RvcE5vZGUKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3RvcE5vZGU6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdENzU3RvcHBlZDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gY2hlY2sgaWYgU29DIHJlY2VpdmVkCisJCQljYXNlIGtFcGxObXRFdmVudERsbENlU29jOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQl9CS8vIGVuZCBvZiBzd2l0Y2goTm10RXZlbnQpCisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gbm9kZSBwcm9jZXNzZXMgaXNvY2hyb25vdXMgYW5kIGFzeW5jaHJvbm91cyBmcmFtZXMKKwljYXNlIGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMjoKKwkJeworCQkJLy8gY2hlY2sgZXZlbnRzCisJCQlzd2l0Y2ggKE5tdEV2ZW50KSB7CisJCQkJLy8gTk1UIENvbW1hbmQgU3dpdGNoT2ZmCisJCQljYXNlIGtFcGxObXRFdmVudENyaXRpY2FsRXJyb3I6CisJCQljYXNlIGtFcGxObXRFdmVudFN3aXRjaE9mZjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NPZmY7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFN3UmVzZXQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dSZXNldDoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NJbml0aWFsaXNpbmc7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Tm9kZQorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldE5vZGU6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRBcHBsaWNhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXRDb21tdW5pY2F0aW9uCisJCQkJLy8gb3IgaW50ZXJuYWwgQ29tbXVuaWNhdGlvbiBlcnJvcgorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldENvbToKKwkJCWNhc2Uga0VwbE5tdEV2ZW50SW50ZXJuQ29tRXJyb3I6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRDb21tdW5pY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldCBDb25maWd1cmF0aW9uCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29uZmlnOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgU3RvcE5vZGUKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3RvcE5vZGU6CisJCQkJeworCQkJCQkvLyByZXNldCBmbGFncworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9mRW5hYmxlUmVhZHlUb09wZXJhdGUpCisJCQkJCSAgICA9IEZBTFNFOworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9mQXBwUmVhZHlUb09wZXJhdGUpID0KKwkJCQkJICAgIEZBTFNFOworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdENzU3RvcHBlZDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gZXJyb3Igb2NjdXJlZAorCQkJY2FzZSBrRXBsTm10RXZlbnRObXRDeWNsZUVycm9yOgorCQkJCXsKKwkJCQkJLy8gcmVzZXQgZmxhZ3MKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fZkVuYWJsZVJlYWR5VG9PcGVyYXRlKQorCQkJCQkgICAgPSBGQUxTRTsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fZkFwcFJlYWR5VG9PcGVyYXRlKSA9CisJCQkJCSAgICBGQUxTRTsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gY2hlY2sgaWYgYXBwbGljYXRpb24gaXMgcmVhZHkgdG8gb3BlcmF0ZQorCQkJY2FzZSBrRXBsTm10RXZlbnRFbnRlclJlYWR5VG9PcGVyYXRlOgorCQkJCXsKKwkJCQkJLy8gY2hlY2sgaWYgY29tbWFuZCBOTVRFbmFibGVSZWFkeVRvT3BlcmF0ZSBmcm9tIE1OIHdhcyByZWNlaXZlZAorCQkJCQlpZiAoRVBMX01DT19HTEJfVkFSKG1fZkVuYWJsZVJlYWR5VG9PcGVyYXRlKSA9PSBUUlVFKSB7CS8vIHJlc2V0IGZsYWdzCisJCQkJCQlFUExfTUNPX0dMQl9WQVIKKwkJCQkJCSAgICAobV9mRW5hYmxlUmVhZHlUb09wZXJhdGUpID0KKwkJCQkJCSAgICBGQUxTRTsKKwkJCQkJCUVQTF9NQ09fR0xCX1ZBUgorCQkJCQkJICAgIChtX2ZBcHBSZWFkeVRvT3BlcmF0ZSkgPQorCQkJCQkJICAgIEZBTFNFOworCQkJCQkJLy8gY2hhbmdlIHN0YXRlCisJCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkJICAgIGtFcGxObXRDc1JlYWR5VG9PcGVyYXRlOworCQkJCQl9IGVsc2UgewkvLyBzZXQgRmxhZworCQkJCQkJRVBMX01DT19HTEJfVkFSCisJCQkJCQkgICAgKG1fZkFwcFJlYWR5VG9PcGVyYXRlKSA9CisJCQkJCQkgICAgVFJVRTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZG8gRW5hYmxlUmVhZHlUb09wZXJhdGUKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RW5hYmxlUmVhZHlUb09wZXJhdGU6CisJCQkJeworCQkJCQkvLyBjaGVjayBpZiBhcHBsaWNhdGlvbiBpcyByZWFkeQorCQkJCQlpZiAoRVBMX01DT19HTEJfVkFSKG1fZkFwcFJlYWR5VG9PcGVyYXRlKSA9PSBUUlVFKSB7CS8vIHJlc2V0IGZsYWdzCisJCQkJCQlFUExfTUNPX0dMQl9WQVIKKwkJCQkJCSAgICAobV9mRW5hYmxlUmVhZHlUb09wZXJhdGUpID0KKwkJCQkJCSAgICBGQUxTRTsKKwkJCQkJCUVQTF9NQ09fR0xCX1ZBUgorCQkJCQkJICAgIChtX2ZBcHBSZWFkeVRvT3BlcmF0ZSkgPQorCQkJCQkJICAgIEZBTFNFOworCQkJCQkJLy8gY2hhbmdlIHN0YXRlCisJCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkJICAgIGtFcGxObXRDc1JlYWR5VG9PcGVyYXRlOworCQkJCQl9IGVsc2UgewkvLyBzZXQgRmxhZworCQkJCQkJRVBMX01DT19HTEJfVkFSCisJCQkJCQkgICAgKG1fZkVuYWJsZVJlYWR5VG9PcGVyYXRlKSA9CisJCQkJCQkgICAgVFJVRTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCX0JLy8gZW5kIG9mIHN3aXRjaChObXRFdmVudCkKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gbm9kZSBzaG91bGQgYmUgY29uZmlndXJlZCB1bmQgYXBwbGljYXRpb24gaXMgcmVhZHkKKwljYXNlIGtFcGxObXRDc1JlYWR5VG9PcGVyYXRlOgorCQl7CisJCQkvLyBjaGVjayBldmVudHMKKwkJCXN3aXRjaCAoTm10RXZlbnQpIHsKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd2l0Y2hPZmYKKwkJCWNhc2Uga0VwbE5tdEV2ZW50Q3JpdGljYWxFcnJvcjoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dpdGNoT2ZmOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc09mZjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgU3dSZXNldAorCQkJY2FzZSBrRXBsTm10RXZlbnRTd1Jlc2V0OgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc0luaXRpYWxpc2luZzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXROb2RlCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Tm9kZToKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldEFwcGxpY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldENvbW11bmljYXRpb24KKwkJCQkvLyBvciBpbnRlcm5hbCBDb21tdW5pY2F0aW9uIGVycm9yCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29tOgorCQkJY2FzZSBrRXBsTm10RXZlbnRJbnRlcm5Db21FcnJvcjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Q29uZmlndXJhdGlvbgorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldENvbmZpZzoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbmZpZ3VyYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFN0b3BOb2RlCisJCQljYXNlIGtFcGxObXRFdmVudFN0b3BOb2RlOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRDc1N0b3BwZWQ7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIGVycm9yIG9jY3VyZWQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50Tm10Q3ljbGVFcnJvcjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDE7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFN0YXJ0Tm9kZQorCQkJY2FzZSBrRXBsTm10RXZlbnRTdGFydE5vZGU6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdENzT3BlcmF0aW9uYWw7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKE5tdEV2ZW50KQorCQkJYnJlYWs7CisJCX0KKworCQkvLyBub3JtYWwgd29yayBzdGF0ZQorCWNhc2Uga0VwbE5tdENzT3BlcmF0aW9uYWw6CisJCXsKKworCQkJLy8gY2hlY2sgZXZlbnRzCisJCQlzd2l0Y2ggKE5tdEV2ZW50KSB7CisJCQkJLy8gTk1UIENvbW1hbmQgU3dpdGNoT2ZmCisJCQljYXNlIGtFcGxObXRFdmVudENyaXRpY2FsRXJyb3I6CisJCQljYXNlIGtFcGxObXRFdmVudFN3aXRjaE9mZjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NPZmY7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFN3UmVzZXQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dSZXNldDoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NJbml0aWFsaXNpbmc7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Tm9kZQorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldE5vZGU6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRBcHBsaWNhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXRDb21tdW5pY2F0aW9uCisJCQkJLy8gb3IgaW50ZXJuYWwgQ29tbXVuaWNhdGlvbiBlcnJvcgorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldENvbToKKwkJCWNhc2Uga0VwbE5tdEV2ZW50SW50ZXJuQ29tRXJyb3I6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRDb21tdW5pY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldENvbmZpZ3VyYXRpb24KKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXRDb25maWc6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRDb25maWd1cmF0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBTdG9wTm9kZQorCQkJY2FzZSBrRXBsTm10RXZlbnRTdG9wTm9kZToKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10Q3NTdG9wcGVkOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBFbnRlclByZU9wZXJhdGlvbmFsMgorCQkJY2FzZSBrRXBsTm10RXZlbnRFbnRlclByZU9wZXJhdGlvbmFsMjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDI7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIGVycm9yIG9jY3VyZWQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50Tm10Q3ljbGVFcnJvcjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDE7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKE5tdEV2ZW50KQorCQkJYnJlYWs7CisJCX0KKworCQkvLyBub2RlIHN0b3BwZWQgYnkgTU4KKwkJLy8gLT4gb25seSBwcm9jZXNzIGFzeW5jaHJvbm91cyBmcmFtZXMKKwljYXNlIGtFcGxObXRDc1N0b3BwZWQ6CisJCXsKKwkJCS8vIGNoZWNrIGV2ZW50cworCQkJc3dpdGNoIChObXRFdmVudCkgeworCQkJCS8vIE5NVCBDb21tYW5kIFN3aXRjaE9mZgorCQkJY2FzZSBrRXBsTm10RXZlbnRDcml0aWNhbEVycm9yOgorCQkJY2FzZSBrRXBsTm10RXZlbnRTd2l0Y2hPZmY6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzT2ZmOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd1Jlc2V0CisJCQljYXNlIGtFcGxObXRFdmVudFN3UmVzZXQ6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzSW5pdGlhbGlzaW5nOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldE5vZGUKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXROb2RlOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0QXBwbGljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Q29tbXVuaWNhdGlvbgorCQkJCS8vIG9yIGludGVybmFsIENvbW11bmljYXRpb24gZXJyb3IKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXRDb206CisJCQljYXNlIGtFcGxObXRFdmVudEludGVybkNvbUVycm9yOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29tbXVuaWNhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXRDb25maWd1cmF0aW9uCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29uZmlnOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgRW50ZXJQcmVPcGVyYXRpb25hbDIKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RW50ZXJQcmVPcGVyYXRpb25hbDI6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwyOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBlcnJvciBvY2N1cmVkCisJCQljYXNlIGtFcGxObXRFdmVudE5tdEN5Y2xlRXJyb3I6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwxOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCX0JLy8gZW5kIG9mIHN3aXRjaChObXRFdmVudCkKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gbm8gZXBsIGN5Y2xlCisJCS8vIC0+IG5vcm1hbCBldGhlcm5ldCBjb21tdW5pY2F0aW9uCisJY2FzZSBrRXBsTm10Q3NCYXNpY0V0aGVybmV0OgorCQl7CisJCQkvLyBjaGVjayBldmVudHMKKwkJCXN3aXRjaCAoTm10RXZlbnQpIHsKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd2l0Y2hPZmYKKwkJCWNhc2Uga0VwbE5tdEV2ZW50Q3JpdGljYWxFcnJvcjoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dpdGNoT2ZmOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc09mZjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgU3dSZXNldAorCQkJY2FzZSBrRXBsTm10RXZlbnRTd1Jlc2V0OgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc0luaXRpYWxpc2luZzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXROb2RlCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Tm9kZToKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldEFwcGxpY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldENvbW11bmljYXRpb24KKwkJCQkvLyBvciBpbnRlcm5hbCBDb21tdW5pY2F0aW9uIGVycm9yCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29tOgorCQkJY2FzZSBrRXBsTm10RXZlbnRJbnRlcm5Db21FcnJvcjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Q29uZmlndXJhdGlvbgorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldENvbmZpZzoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbmZpZ3VyYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIGVycm9yIG9jY3VyZWQKKwkJCQkvLyBkLmsuOiBob3cgZG9lcyB0aGlzIGVycm9yIG9jY3VyPyBvbiBDUkMgZXJyb3JzCisvKiAgICAgICAgICAgICAgICBjYXNlIGtFcGxObXRFdmVudE5tdEN5Y2xlRXJyb3I6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPSBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyovCisJCQljYXNlIGtFcGxObXRFdmVudERsbENlU29jOgorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVByZXE6CisJCQljYXNlIGtFcGxObXRFdmVudERsbENlUHJlczoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2E6CisJCQkJewkvLyBFcGwtRnJhbWUgb24gbmV0IC0+IHN0b3AgYW55IGNvbW11bmljYXRpb24KKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQl9CS8vIGVuZCBvZiBzd2l0Y2goTm10RXZlbnQpCisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyBNTiBwYXJ0IG9mIHRoZSBzdGF0ZW1hc2NoaW5lCisKKwkJLy8gTU4gbGlzdGVuIHRvIG5ldHdvcmsKKwkJLy8gLT4gaWYgbm8gRVBMIHRyYWZmaWMgZ28gdG8gbmV4dCBzdGF0ZQorCWNhc2Uga0VwbE5tdE1zTm90QWN0aXZlOgorCQl7CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpID09IDApCisJCQkvLyBubyBNTiBmdW5jdGlvbmFsaXR5CisJCQkvLyBUT0RPOiAtY3JlYXRlIGVycm9yIEVfTk1UX0JBMV9OT19NTl9TVVBQT1JUCisJCQlFUExfTUNPX0dMQl9WQVIobV9mRnJvemVuKSA9IFRSVUU7CisjZWxzZQorCisJCQkvLyBjaGVjayBldmVudHMKKwkJCXN3aXRjaCAoTm10RXZlbnQpIHsKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd2l0Y2hPZmYKKwkJCWNhc2Uga0VwbE5tdEV2ZW50Q3JpdGljYWxFcnJvcjoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dpdGNoT2ZmOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc09mZjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgU3dSZXNldAorCQkJY2FzZSBrRXBsTm10RXZlbnRTd1Jlc2V0OgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc0luaXRpYWxpc2luZzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXROb2RlCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Tm9kZToKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldEFwcGxpY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldENvbW11bmljYXRpb24KKwkJCQkvLyBvciBpbnRlcm5hbCBDb21tdW5pY2F0aW9uIGVycm9yCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29tOgorCQkJY2FzZSBrRXBsTm10RXZlbnRJbnRlcm5Db21FcnJvcjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Q29uZmlndXJhdGlvbgorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldENvbmZpZzoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbmZpZ3VyYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIEVQTCBmcmFtZXMgcmVjZWl2ZWQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2M6CisJCQljYXNlIGtFcGxObXRFdmVudERsbENlU29hOgorCQkJCXsJLy8gb3RoZXIgTU4gaW4gbmV0d29yaworCQkJCQkvLyAkJCQgZC5rLjogZ2VuZXJhdGUgZXJyb3IgaGlzdG9yeSBlbnRyeQorCQkJCQlFUExfTUNPX0dMQl9WQVIobV9mRnJvemVuKSA9IFRSVUU7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIHRpbWVvdXQgZXZlbnQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50VGltZXJCYXNpY0V0aGVybmV0OgorCQkJCXsKKwkJCQkJaWYgKEVQTF9NQ09fR0xCX1ZBUihtX2ZGcm96ZW4pID09IEZBTFNFKSB7CS8vIG5ldyBzdGF0ZSBCYXNpY0V0aGVybmV0CisJCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkJICAgIGtFcGxObXRNc0Jhc2ljRXRoZXJuZXQ7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gdGltZW91dCBldmVudAorCQkJY2FzZSBrRXBsTm10RXZlbnRUaW1lck1zUHJlT3AxOgorCQkJCXsKKwkJCQkJaWYgKEVQTF9NQ09fR0xCX1ZBUihtX2ZGcm96ZW4pID09IEZBTFNFKSB7CS8vIG5ldyBzdGF0ZSBQcmVPcDEKKwkJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCQkgICAga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwxOworCQkJCQkJRVBMX01DT19HTEJfVkFSCisJCQkJCQkgICAgKG1fZlRpbWVyTXNQcmVPcDIpID0gRkFMU0U7CisJCQkJCQlFUExfTUNPX0dMQl9WQVIKKwkJCQkJCSAgICAobV9mQWxsTWFuZGF0b3J5Q05JZGVudCkgPQorCQkJCQkJICAgIEZBTFNFOworCisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQl9CS8vIGVuZCBvZiBzd2l0Y2goTm10RXZlbnQpCisKKyNlbmRpZiAvLyAoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgPT0gMCkKKworCQkJYnJlYWs7CisJCX0KKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwkJLy8gTU4gcHJvY2VzcyByZWR1Y2VzIGVwbCBjeWNsZQorCWNhc2Uga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwxOgorCQl7CisJCQkvLyBjaGVjayBldmVudHMKKwkJCXN3aXRjaCAoTm10RXZlbnQpIHsKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd2l0Y2hPZmYKKwkJCWNhc2Uga0VwbE5tdEV2ZW50Q3JpdGljYWxFcnJvcjoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dpdGNoT2ZmOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc09mZjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgU3dSZXNldAorCQkJY2FzZSBrRXBsTm10RXZlbnRTd1Jlc2V0OgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc0luaXRpYWxpc2luZzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXROb2RlCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Tm9kZToKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldEFwcGxpY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldENvbW11bmljYXRpb24KKwkJCQkvLyBvciBpbnRlcm5hbCBDb21tdW5pY2F0aW9uIGVycm9yCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29tOgorCQkJY2FzZSBrRXBsTm10RXZlbnRJbnRlcm5Db21FcnJvcjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Q29uZmlndXJhdGlvbgorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldENvbmZpZzoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbmZpZ3VyYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIEVQTCBmcmFtZXMgcmVjZWl2ZWQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2M6CisJCQljYXNlIGtFcGxObXRFdmVudERsbENlU29hOgorCQkJCXsJLy8gb3RoZXIgTU4gaW4gbmV0d29yaworCQkJCQkvLyAkJCQgZC5rLjogZ2VuZXJhdGUgZXJyb3IgaGlzdG9yeSBlbnRyeQorCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRDb21tdW5pY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBlcnJvciBvY2N1cmVkCisJCQkJLy8gZC5rLiBNU1ByZU9wMS0+Q1NQcmVPcDE6IG5vbnNlbnNlIC0+IGtlZXAgc3RhdGUKKwkJCQkvKgorCQkJCSAgIGNhc2Uga0VwbE5tdEV2ZW50Tm10Q3ljbGVFcnJvcjoKKwkJCQkgICB7CisJCQkJICAgRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0ga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwxOworCQkJCSAgIGJyZWFrOworCQkJCSAgIH0KKwkJCQkgKi8KKworCQkJY2FzZSBrRXBsTm10RXZlbnRBbGxNYW5kYXRvcnlDTklkZW50OgorCQkJCXsJLy8gYWxsIG1hbmRhdG9yeSBDTiBpZGVudGlmaWVkCisJCQkJCWlmIChFUExfTUNPX0dMQl9WQVIobV9mVGltZXJNc1ByZU9wMikgIT0KKwkJCQkJICAgIEZBTFNFKSB7CisJCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkJICAgIGtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMjsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCUVQTF9NQ09fR0xCX1ZBUgorCQkJCQkJICAgIChtX2ZBbGxNYW5kYXRvcnlDTklkZW50KSA9CisJCQkJCQkgICAgVFJVRTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWNhc2Uga0VwbE5tdEV2ZW50VGltZXJNc1ByZU9wMjoKKwkJCQl7CS8vIHJlc2lkZW5jZSB0aW1lIGZvciBQcmVPcDEgaXMgZWxhcHNlZAorCQkJCQlpZiAoRVBMX01DT19HTEJfVkFSCisJCQkJCSAgICAobV9mQWxsTWFuZGF0b3J5Q05JZGVudCkgIT0gRkFMU0UpIHsKKwkJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCQkgICAga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwyOworCQkJCQl9IGVsc2UgeworCQkJCQkJRVBMX01DT19HTEJfVkFSCisJCQkJCQkgICAgKG1fZlRpbWVyTXNQcmVPcDIpID0gVFJVRTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCX0JLy8gZW5kIG9mIHN3aXRjaChObXRFdmVudCkKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gTU4gcHJvY2VzcyBmdWxsIGVwbCBjeWNsZQorCWNhc2Uga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwyOgorCQl7CisJCQkvLyBjaGVjayBldmVudHMKKwkJCXN3aXRjaCAoTm10RXZlbnQpIHsKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd2l0Y2hPZmYKKwkJCWNhc2Uga0VwbE5tdEV2ZW50Q3JpdGljYWxFcnJvcjoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dpdGNoT2ZmOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc09mZjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgU3dSZXNldAorCQkJY2FzZSBrRXBsTm10RXZlbnRTd1Jlc2V0OgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc0luaXRpYWxpc2luZzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXROb2RlCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Tm9kZToKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldEFwcGxpY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldENvbW11bmljYXRpb24KKwkJCQkvLyBvciBpbnRlcm5hbCBDb21tdW5pY2F0aW9uIGVycm9yCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29tOgorCQkJY2FzZSBrRXBsTm10RXZlbnRJbnRlcm5Db21FcnJvcjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Q29uZmlndXJhdGlvbgorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldENvbmZpZzoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbmZpZ3VyYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIEVQTCBmcmFtZXMgcmVjZWl2ZWQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2M6CisJCQljYXNlIGtFcGxObXRFdmVudERsbENlU29hOgorCQkJCXsJLy8gb3RoZXIgTU4gaW4gbmV0d29yaworCQkJCQkvLyAkJCQgZC5rLjogZ2VuZXJhdGUgZXJyb3IgaGlzdG9yeSBlbnRyeQorCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRDb21tdW5pY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBlcnJvciBvY2N1cmVkCisJCQljYXNlIGtFcGxObXRFdmVudE5tdEN5Y2xlRXJyb3I6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwxOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RW50ZXJSZWFkeVRvT3BlcmF0ZToKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10TXNSZWFkeVRvT3BlcmF0ZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQl9CS8vIGVuZCBvZiBzd2l0Y2goTm10RXZlbnQpCisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gYWxsIG1hZGF0b3J5IG5vZGVzIHJlYWR5IHRvIG9wZXJhdGUKKwkJLy8gLT4gTU4gcHJvY2VzcyBmdWxsIGVwbCBjeWNsZQorCWNhc2Uga0VwbE5tdE1zUmVhZHlUb09wZXJhdGU6CisJCXsKKworCQkJLy8gY2hlY2sgZXZlbnRzCisJCQlzd2l0Y2ggKE5tdEV2ZW50KSB7CisJCQkJLy8gTk1UIENvbW1hbmQgU3dpdGNoT2ZmCisJCQljYXNlIGtFcGxObXRFdmVudENyaXRpY2FsRXJyb3I6CisJCQljYXNlIGtFcGxObXRFdmVudFN3aXRjaE9mZjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NPZmY7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFN3UmVzZXQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dSZXNldDoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NJbml0aWFsaXNpbmc7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Tm9kZQorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldE5vZGU6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRBcHBsaWNhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXRDb21tdW5pY2F0aW9uCisJCQkJLy8gb3IgaW50ZXJuYWwgQ29tbXVuaWNhdGlvbiBlcnJvcgorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldENvbToKKwkJCWNhc2Uga0VwbE5tdEV2ZW50SW50ZXJuQ29tRXJyb3I6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRDb21tdW5pY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldENvbmZpZ3VyYXRpb24KKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXRDb25maWc6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRDb25maWd1cmF0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBFUEwgZnJhbWVzIHJlY2VpdmVkCisJCQljYXNlIGtFcGxObXRFdmVudERsbENlU29jOgorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVNvYToKKwkJCQl7CS8vIG90aGVyIE1OIGluIG5ldHdvcmsKKwkJCQkJLy8gJCQkIGQuay46IGdlbmVyYXRlIGVycm9yIGhpc3RvcnkgZW50cnkKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29tbXVuaWNhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gZXJyb3Igb2NjdXJlZAorCQkJY2FzZSBrRXBsTm10RXZlbnRObXRDeWNsZUVycm9yOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQljYXNlIGtFcGxObXRFdmVudEVudGVyTXNPcGVyYXRpb25hbDoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10TXNPcGVyYXRpb25hbDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQl9CS8vIGVuZCBvZiBzd2l0Y2goTm10RXZlbnQpCisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gbm9ybWFsIGVwbGN5Y2xlIHByb2Nlc3NpbmcKKwljYXNlIGtFcGxObXRNc09wZXJhdGlvbmFsOgorCQl7CisJCQkvLyBjaGVjayBldmVudHMKKwkJCXN3aXRjaCAoTm10RXZlbnQpIHsKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd2l0Y2hPZmYKKwkJCWNhc2Uga0VwbE5tdEV2ZW50Q3JpdGljYWxFcnJvcjoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50U3dpdGNoT2ZmOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc09mZjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgU3dSZXNldAorCQkJY2FzZSBrRXBsTm10RXZlbnRTd1Jlc2V0OgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc0luaXRpYWxpc2luZzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXROb2RlCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Tm9kZToKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldEFwcGxpY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldENvbW11bmljYXRpb24KKwkJCQkvLyBvciBpbnRlcm5hbCBDb21tdW5pY2F0aW9uIGVycm9yCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29tOgorCQkJY2FzZSBrRXBsTm10RXZlbnRJbnRlcm5Db21FcnJvcjoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Q29uZmlndXJhdGlvbgorCQkJY2FzZSBrRXBsTm10RXZlbnRSZXNldENvbmZpZzoKKwkJCQl7CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbmZpZ3VyYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIEVQTCBmcmFtZXMgcmVjZWl2ZWQKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2M6CisJCQljYXNlIGtFcGxObXRFdmVudERsbENlU29hOgorCQkJCXsJLy8gb3RoZXIgTU4gaW4gbmV0d29yaworCQkJCQkvLyAkJCQgZC5rLjogZ2VuZXJhdGUgZXJyb3IgaGlzdG9yeSBlbnRyeQorCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzUmVzZXRDb21tdW5pY2F0aW9uOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBlcnJvciBvY2N1cmVkCisJCQljYXNlIGtFcGxObXRFdmVudE5tdEN5Y2xlRXJyb3I6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwxOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCX0JLy8gZW5kIG9mIHN3aXRjaChObXRFdmVudCkKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gIG5vcm1hbCBldGhlcm5ldCB0cmFmZmljCisJY2FzZSBrRXBsTm10TXNCYXNpY0V0aGVybmV0OgorCQl7CisKKwkJCS8vIGNoZWNrIGV2ZW50cworCQkJc3dpdGNoIChObXRFdmVudCkgeworCQkJCS8vIE5NVCBDb21tYW5kIFN3aXRjaE9mZgorCQkJY2FzZSBrRXBsTm10RXZlbnRDcml0aWNhbEVycm9yOgorCQkJY2FzZSBrRXBsTm10RXZlbnRTd2l0Y2hPZmY6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzT2ZmOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBTd1Jlc2V0CisJCQljYXNlIGtFcGxObXRFdmVudFN3UmVzZXQ6CisJCQkJeworCQkJCQlFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPQorCQkJCQkgICAga0VwbE5tdEdzSW5pdGlhbGlzaW5nOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBOTVQgQ29tbWFuZCBSZXNldE5vZGUKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXROb2RlOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0QXBwbGljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIE5NVCBDb21tYW5kIFJlc2V0Q29tbXVuaWNhdGlvbgorCQkJCS8vIG9yIGludGVybmFsIENvbW11bmljYXRpb24gZXJyb3IKKwkJCWNhc2Uga0VwbE5tdEV2ZW50UmVzZXRDb206CisJCQljYXNlIGtFcGxObXRFdmVudEludGVybkNvbUVycm9yOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29tbXVuaWNhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gTk1UIENvbW1hbmQgUmVzZXRDb25maWd1cmF0aW9uCisJCQljYXNlIGtFcGxObXRFdmVudFJlc2V0Q29uZmlnOgorCQkJCXsKKwkJCQkJRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0KKwkJCQkJICAgIGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gRVBMIGZyYW1lcyByZWNlaXZlZAorCQkJY2FzZSBrRXBsTm10RXZlbnREbGxDZVNvYzoKKwkJCWNhc2Uga0VwbE5tdEV2ZW50RGxsQ2VTb2E6CisJCQkJewkvLyBvdGhlciBNTiBpbiBuZXR3b3JrCisJCQkJCS8vICQkJCBkLmsuOiBnZW5lcmF0ZSBlcnJvciBoaXN0b3J5IGVudHJ5CisJCQkJCUVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9CisJCQkJCSAgICBrRXBsTm10R3NSZXNldENvbW11bmljYXRpb247CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIGVycm9yIG9jY3VyZWQKKwkJCQkvLyBkLmsuIEJFLT5QcmVPcDEgb24gY3ljbGUgZXJyb3I/IE5vCisvKiAgICAgICAgICAgICAgICBjYXNlIGtFcGxObXRFdmVudE5tdEN5Y2xlRXJyb3I6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPSBrRXBsTm10Q3NQcmVPcGVyYXRpb25hbDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyovCisJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQl9CS8vIGVuZCBvZiBzd2l0Y2goTm10RXZlbnQpCisJCQlicmVhazsKKwkJfQorI2VuZGlmIC8vI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCisJZGVmYXVsdDoKKwkJeworCQkJLy9ERUJVR19FUExfREJHTFZMX05NVEtfVFJBQ0UwKEVQTF9EQkdMVkxfTk1UICwiRXJyb3IgaW4gRXBsTm10UHJvY2VzczogVW5rbm93biBOTVQtU3RhdGUiKTsKKwkJCS8vRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpID0ga0VwbE5tdEdzUmVzZXRBcHBsaWNhdGlvbjsKKwkJCVJldCA9IGtFcGxObXRJbnZhbGlkU3RhdGU7CisJCQlnb3RvIEV4aXQ7CisJCX0KKworCX0JCQkvLyBlbmQgb2Ygc3dpdGNoKE5tdEV2ZW50KQorCisJLy8gaW5mb3JtIGhpZ2hlciBsYXllciBhYm91dCBTdGF0ZS1DaGFuZ2UgaWYgbmVlZGVkCisJaWYgKE9sZE5tdFN0YXRlICE9IEVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSkgeworCQlFUExfTk1US19EQkdfUE9TVF9UUkFDRV9WQUxVRShObXRFdmVudCwgT2xkTm10U3RhdGUsCisJCQkJCSAgICAgIEVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSk7CisKKwkJLy8gZC5rLjogbWVtb3JpemUgTk1UIHN0YXRlIGJlZm9yZSBwb3N0aW5nIGFueSBldmVudHMKKwkJTm10U3RhdGVDaGFuZ2UubV9OZXdObXRTdGF0ZSA9IEVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKTsKKworCQkvLyBpbmZvcm0gRExMCisJCWlmICgoT2xkTm10U3RhdGUgPiBrRXBsTm10R3NSZXNldENvbmZpZ3VyYXRpb24pCisJCSAgICAmJiAoRVBMX01DT19HTEJfVkFSKG1fTm10U3RhdGUpIDw9CisJCQlrRXBsTm10R3NSZXNldENvbmZpZ3VyYXRpb24pKSB7CisJCQkvLyBzZW5kIERMTCBERUlOSVQKKwkJCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua0RsbGs7CisJCQlFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVEbGxrRGVzdHJveTsKKwkJCUVQTF9NRU1TRVQoJkV2ZW50Lm1fTmV0VGltZSwgMHgwMCwKKwkJCQkgICBzaXplb2YoRXZlbnQubV9OZXRUaW1lKSk7CisJCQlFdmVudC5tX3BBcmcgPSAmT2xkTm10U3RhdGU7CisJCQlFdmVudC5tX3VpU2l6ZSA9IHNpemVvZihPbGRObXRTdGF0ZSk7CisJCQkvLyBkLmsuOiBkaXJlY3RseSBjYWxsIERMTGsgcHJvY2VzcyBmdW5jdGlvbiwgYmVjYXVzZQorCQkJLy8gICAgICAgMS4gZXhlY3V0aW9uIG9mIHByb2Nlc3MgZnVuY3Rpb24gaXMgc3RpbGwgc3luY2hvbml6ZWQgYW5kIHNlcmlhbGl6ZWQsCisJCQkvLyAgICAgICAyLiBpdCBpcyB0aGUgc2FtZSBhcyB3aXRob3V0IGV2ZW50IHF1ZXVlcyAoaS5lLiB3ZWxsIHRlc3RlZCksCisJCQkvLyAgICAgICAzLiBETExrIHdpbGwgZ2V0IHRob3NlIG5lY2Vzc2FyeSBldmVudHMgZXZlbiBpZiBldmVudCBxdWV1ZSBpcyBmdWxsLAorCQkJLy8gICAgICAgNC4gZXZlbnQgcXVldWUgaXMgdmVyeSBpbmVmZmljaWVudAorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKwkJCVJldCA9IEVwbERsbGtQcm9jZXNzKCZFdmVudCk7CisjZWxzZQorCQkJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworI2VuZGlmCisJCX0gZWxzZSBpZiAoKE9sZE5tdFN0YXRlIDw9IGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbikKKwkJCSAgICYmIChFUExfTUNPX0dMQl9WQVIobV9ObXRTdGF0ZSkgPgorCQkJICAgICAgIGtFcGxObXRHc1Jlc2V0Q29uZmlndXJhdGlvbikpIHsKKwkJCS8vIHNlbmQgRExMIElOSVQKKwkJCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua0RsbGs7CisJCQlFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVEbGxrQ3JlYXRlOworCQkJRVBMX01FTVNFVCgmRXZlbnQubV9OZXRUaW1lLCAweDAwLAorCQkJCSAgIHNpemVvZihFdmVudC5tX05ldFRpbWUpKTsKKwkJCUV2ZW50Lm1fcEFyZyA9ICZObXRTdGF0ZUNoYW5nZS5tX05ld05tdFN0YXRlOworCQkJRXZlbnQubV91aVNpemUgPSBzaXplb2YoTm10U3RhdGVDaGFuZ2UubV9OZXdObXRTdGF0ZSk7CisJCQkvLyBkLmsuOiBkaXJlY3RseSBjYWxsIERMTGsgcHJvY2VzcyBmdW5jdGlvbiwgYmVjYXVzZQorCQkJLy8gICAgICAgMS4gZXhlY3V0aW9uIG9mIHByb2Nlc3MgZnVuY3Rpb24gaXMgc3RpbGwgc3luY2hvbml6ZWQgYW5kIHNlcmlhbGl6ZWQsCisJCQkvLyAgICAgICAyLiBpdCBpcyB0aGUgc2FtZSBhcyB3aXRob3V0IGV2ZW50IHF1ZXVlcyAoaS5lLiB3ZWxsIHRlc3RlZCksCisJCQkvLyAgICAgICAzLiBETExrIHdpbGwgZ2V0IHRob3NlIG5lY2Vzc2FyeSBldmVudHMgZXZlbiBpZiBldmVudCBxdWV1ZSBpcyBmdWxsCisJCQkvLyAgICAgICA0LiBldmVudCBxdWV1ZSBpcyB2ZXJ5IGluZWZmaWNpZW50CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTEspKSAhPSAwKQorCQkJUmV0ID0gRXBsRGxsa1Byb2Nlc3MoJkV2ZW50KTsKKyNlbHNlCisJCQlSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisjZW5kaWYKKwkJfSBlbHNlCisJCSAgICBpZiAoKEVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9PSBrRXBsTm10Q3NCYXNpY0V0aGVybmV0KQorCQkJfHwgKEVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKSA9PQorCQkJICAgIGtFcGxObXRNc0Jhc2ljRXRoZXJuZXQpKSB7CisJCQl0RXBsRGxsQXN5bmNSZXFQcmlvcml0eSBBc3luY1JlcVByaW9yaXR5OworCisJCQkvLyBzZW5kIERMTCBGaWxsIEFzeW5jIFR4IEJ1ZmZlciwgYmVjYXVzZSBzdGF0ZSBCYXNpY0V0aGVybmV0IHdhcyBlbnRlcmVkCisJCQlFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtEbGxrOworCQkJRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlRGxsa0ZpbGxUeDsKKwkJCUVQTF9NRU1TRVQoJkV2ZW50Lm1fTmV0VGltZSwgMHgwMCwKKwkJCQkgICBzaXplb2YoRXZlbnQubV9OZXRUaW1lKSk7CisJCQlBc3luY1JlcVByaW9yaXR5ID0ga0VwbERsbEFzeW5jUmVxUHJpb0dlbmVyaWM7CisJCQlFdmVudC5tX3BBcmcgPSAmQXN5bmNSZXFQcmlvcml0eTsKKwkJCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKEFzeW5jUmVxUHJpb3JpdHkpOworCQkJLy8gZC5rLjogZGlyZWN0bHkgY2FsbCBETExrIHByb2Nlc3MgZnVuY3Rpb24sIGJlY2F1c2UKKwkJCS8vICAgICAgIDEuIGV4ZWN1dGlvbiBvZiBwcm9jZXNzIGZ1bmN0aW9uIGlzIHN0aWxsIHN5bmNob25pemVkIGFuZCBzZXJpYWxpemVkLAorCQkJLy8gICAgICAgMi4gaXQgaXMgdGhlIHNhbWUgYXMgd2l0aG91dCBldmVudCBxdWV1ZXMgKGkuZS4gd2VsbCB0ZXN0ZWQpLAorCQkJLy8gICAgICAgMy4gRExMayB3aWxsIGdldCB0aG9zZSBuZWNlc3NhcnkgZXZlbnRzIGV2ZW4gaWYgZXZlbnQgcXVldWUgaXMgZnVsbAorCQkJLy8gICAgICAgNC4gZXZlbnQgcXVldWUgaXMgdmVyeSBpbmVmZmljaWVudAorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKwkJCVJldCA9IEVwbERsbGtQcm9jZXNzKCZFdmVudCk7CisjZWxzZQorCQkJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXZlbnQpOworI2VuZGlmCisJCX0KKwkJLy8gaW5mb3JtIGhpZ2hlciBsYXllciBhYm91dCBzdGF0ZSBjaGFuZ2UKKwkJTm10U3RhdGVDaGFuZ2UubV9ObXRFdmVudCA9IE5tdEV2ZW50OworCQlFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtObXR1OworCQlFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVObXRTdGF0ZUNoYW5nZTsKKwkJRVBMX01FTVNFVCgmRXZlbnQubV9OZXRUaW1lLCAweDAwLCBzaXplb2YoRXZlbnQubV9OZXRUaW1lKSk7CisJCUV2ZW50Lm1fcEFyZyA9ICZObXRTdGF0ZUNoYW5nZTsKKwkJRXZlbnQubV91aVNpemUgPSBzaXplb2YoTm10U3RhdGVDaGFuZ2UpOworCQlSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisJCUVQTF9EQkdMVkxfTk1US19UUkFDRTIKKwkJICAgICgiRXBsTm10a1Byb2Nlc3MoTk1ULUV2ZW50ID0gMHglMDRYKTogTmV3IE5NVC1TdGF0ZSA9IDB4JTAzWFxuIiwKKwkJICAgICBObXRFdmVudCwgTm10U3RhdGVDaGFuZ2UubV9OZXdObXRTdGF0ZSk7CisKKwl9CisKKyAgICAgIEV4aXQ6CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRrR2V0Tm10U3RhdGUKKy8vCisvLyBEZXNjcmlwdGlvbjogcmV0dXJuIHRoZSBhY3R1ZWxsIE5NVC1TdGF0ZSBhbmQgdGhlIGJpdHMKKy8vICAgICAgICAgICAgICB0byBmb3IgTU4tIG9yIENOLW1vZGUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBFUExfTUNPX0RFQ0xfUFRSX0lOU1RBTkNFX1BUUl8gPSBJbnN0YW5jZXBvaW50ZXIKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxObXRTdGF0ZSA9IE5NVC1TdGF0ZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxObXRTdGF0ZSBQVUJMSUMKK0VwbE5tdGtHZXRObXRTdGF0ZShFUExfTUNPX0RFQ0xfUFRSX0lOU1RBTkNFX1BUUikKK3sKKwl0RXBsTm10U3RhdGUgTm10U3RhdGU7CisKKwlObXRTdGF0ZSA9IEVQTF9NQ09fR0xCX1ZBUihtX05tdFN0YXRlKTsKKworCXJldHVybiBObXRTdGF0ZTsKKworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KK0VQTF9NQ09fREVDTF9JTlNUQU5DRV9GQ1QoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjoKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6CisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZW5kaWYgLy8gI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRLKSkgIT0gMCkKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxObXRrQ2FsLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE5tdGtDYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWQ3MWE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxObXRrQ2FsLmMKQEAgLTAsMCArMSwxNDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgY29tbXVuaWNhdGlvbiBhYnN0cmFjdGlvbiBsYXllciBvZiB0aGUKKyAgICAgICAgICAgICAgICBOTVQtS2VybmVsLU1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE5tdGtDYWwuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICBLRUlMIHVWaXNpb24gMgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMTYgLWsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJrZXJuZWwvRXBsTm10a0NhbC5oIgorCisvLyBUT0RPOiBpbml0IGZ1bmN0aW9uIG5lZWRlZCB0byBwcmVwYXJlIEVwbE5tdGtHZXRObXRTdGF0ZSBmb3IKKy8vICAgICAgIGlvLWNvbnRyb2xsLWNhbGwgZnJvbSBFcGxObXR1Q2FsLU1vZHVsCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjoKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6CisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczoKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE5tdHUuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsTm10dS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZTE2YTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE5tdHUuYwpAQCAtMCwwICsxLDcwOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBOTVQtVXNlcnNwYWNlLU1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE5tdHUuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwOC8xMS8xMCAxNzoxNzo0MiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzA5IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJFcGxJbmMuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbE5tdHUuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbE9iZHUuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbFRpbWVydS5oIgorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRLKSkgIT0gMCkKKyNpbmNsdWRlICJrZXJuZWwvRXBsTm10ay5oIgorI2VuZGlmCisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UVSkpICE9IDApCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbE5tdHVTdGF0ZUNoYW5nZUNhbGxiYWNrIG1fcGZuTm10Q2hhbmdlQ2I7CisJdEVwbFRpbWVySGRsIG1fVGltZXJIZGw7CisKK30gdEVwbE5tdHVJbnN0YW5jZTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxObXR1SW5zdGFuY2UgRXBsTm10dUluc3RhbmNlX2c7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10dUluaXQKKy8vCisvLyBEZXNjcmlwdGlvbjogaW5pdCBmaXJzdCBpbnN0YW5jZSBvZiB0aGUgbW9kdWxlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXR1SW5pdCgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBFcGxObXR1QWRkSW5zdGFuY2UoKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdHVBZGRJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBpbml0IG90aGVyIGluc3RhbmNlcyBvZiB0aGUgbW9kdWxlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXR1QWRkSW5zdGFuY2UoKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlFcGxObXR1SW5zdGFuY2VfZy5tX3Bmbk5tdENoYW5nZUNiID0gTlVMTDsKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10dURlbEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGRlbGV0ZSBpbnN0YW5jZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10dURlbEluc3RhbmNlKCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJRXBsTm10dUluc3RhbmNlX2cubV9wZm5ObXRDaGFuZ2VDYiA9IE5VTEw7CisKKwkvLyBkZWxldGUgdGltZXIKKwlSZXQgPSBFcGxUaW1lcnVEZWxldGVUaW1lcigmRXBsTm10dUluc3RhbmNlX2cubV9UaW1lckhkbCk7CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdHVObXRFdmVudAorLy8KKy8vIERlc2NyaXB0aW9uOiBzZW5kcyB0aGUgTk1ULUV2ZW50IHRvIHRoZSBOTVQtU3RhdGUtTWFzY2hpbmUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBObXRFdmVudF9wICA9IE5NVC1FdmVudCB0byBzZW5kCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE5tdHVObXRFdmVudCh0RXBsTm10RXZlbnQgTm10RXZlbnRfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsRXZlbnQgRXZlbnQ7CisKKwlFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtObXRrOworCUV2ZW50Lm1fTmV0VGltZS5tX2R3TmFub1NlYyA9IDA7CisJRXZlbnQubV9OZXRUaW1lLm1fZHdTZWMgPSAwOworCUV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZU5tdEV2ZW50OworCUV2ZW50Lm1fcEFyZyA9ICZObXRFdmVudF9wOworCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKE5tdEV2ZW50X3ApOworCisJUmV0ID0gRXBsRXZlbnR1UG9zdCgmRXZlbnQpOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsTm10dUdldE5tdFN0YXRlCisvLworLy8gRGVzY3JpcHRpb246IHJldHVybnMgdGhlIGFjdHVlbGwgTk1ULVN0YXRlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbE5tdFN0YXRlICA9IE5NVC1TdGF0ZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxObXRTdGF0ZSBQVUJMSUMgRXBsTm10dUdldE5tdFN0YXRlKCkKK3sKKwl0RXBsTm10U3RhdGUgTm10U3RhdGU7CisKKwkvLyAkJCQgY2FsbCBmdW5jdGlvbiBvZiBjb21tdW5pY2F0aW9uIGFic3RyYWN0aW9uIGxheWVyCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVEspKSAhPSAwKQorCU5tdFN0YXRlID0gRXBsTm10a0dldE5tdFN0YXRlKCk7CisjZWxzZQorCU5tdFN0YXRlID0gMDsKKyNlbmRpZgorCisJcmV0dXJuIE5tdFN0YXRlOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXR1UHJvY2Vzc0V2ZW50CisvLworLy8gRGVzY3JpcHRpb246IHByb2Nlc3NlcyBldmVudHMgZnJvbSBldmVudCBxdWV1ZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHBFcGxFdmVudF9wID0gICBwb2ludGVyIHRvIGV2ZW50CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE5tdHVQcm9jZXNzRXZlbnQodEVwbEV2ZW50ICogcEVwbEV2ZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIHByb2Nlc3MgZXZlbnQKKwlzd2l0Y2ggKHBFcGxFdmVudF9wLT5tX0V2ZW50VHlwZSkgeworCQkvLyBzdGF0ZSBjaGFuZ2Ugb2YgTk1ULU1vZHVsZQorCWNhc2Uga0VwbEV2ZW50VHlwZU5tdFN0YXRlQ2hhbmdlOgorCQl7CisJCQl0RXBsRXZlbnRObXRTdGF0ZUNoYW5nZSAqcE5tdFN0YXRlQ2hhbmdlOworCisJCQkvLyBkZWxldGUgdGltZXIKKwkJCVJldCA9CisJCQkgICAgRXBsVGltZXJ1RGVsZXRlVGltZXIoJkVwbE5tdHVJbnN0YW5jZV9nLm1fVGltZXJIZGwpOworCisJCQlwTm10U3RhdGVDaGFuZ2UgPQorCQkJICAgICh0RXBsRXZlbnRObXRTdGF0ZUNoYW5nZSAqKSBwRXBsRXZlbnRfcC0+bV9wQXJnOworCisJCQkvLyBjYWxsIGNiLWZ1bmN0aW9ucyB0byBpbmZvcm0gaGlnaGVyIGxheWVyCisJCQlpZiAoRXBsTm10dUluc3RhbmNlX2cubV9wZm5ObXRDaGFuZ2VDYiAhPSBOVUxMKSB7CisJCQkJUmV0ID0KKwkJCQkgICAgRXBsTm10dUluc3RhbmNlX2cuCisJCQkJICAgIG1fcGZuTm10Q2hhbmdlQ2IoKnBObXRTdGF0ZUNoYW5nZSk7CisJCQl9CisKKwkJCWlmIChSZXQgPT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gZXZlcnl0aGluZyBpcyBPSywgc28gc3dpdGNoIHRvIG5leHQgc3RhdGUgaWYgbmVjZXNzYXJ5CisJCQkJc3dpdGNoIChwTm10U3RhdGVDaGFuZ2UtPm1fTmV3Tm10U3RhdGUpIHsKKwkJCQkJLy8gRVBMIHN0YWNrIGlzIG5vdCBydW5uaW5nCisJCQkJY2FzZSBrRXBsTm10R3NPZmY6CisJCQkJCWJyZWFrOworCisJCQkJCS8vIGZpcnN0IGluaXQgb2YgdGhlIGhhcmR3YXJlCisJCQkJY2FzZSBrRXBsTm10R3NJbml0aWFsaXNpbmc6CisJCQkJCXsKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsTm10dU5tdEV2ZW50CisJCQkJCQkgICAgKGtFcGxObXRFdmVudEVudGVyUmVzZXRBcHApOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQkvLyBpbml0IG9mIHRoZSBtYW51ZmFjdHVyZXItc3BlY2lmaWMgcHJvZmlsZSBhcmVhIGFuZCB0aGUKKwkJCQkJLy8gc3RhbmRhcmRpc2VkIGRldmljZSBwcm9maWxlIGFyZWEKKwkJCQljYXNlIGtFcGxObXRHc1Jlc2V0QXBwbGljYXRpb246CisJCQkJCXsKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsTm10dU5tdEV2ZW50CisJCQkJCQkgICAgKGtFcGxObXRFdmVudEVudGVyUmVzZXRDb20pOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQkvLyBpbml0IG9mIHRoZSBjb21tdW5pY2F0aW9uIHByb2ZpbGUgYXJlYQorCQkJCWNhc2Uga0VwbE5tdEdzUmVzZXRDb21tdW5pY2F0aW9uOgorCQkJCQl7CisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbE5tdHVObXRFdmVudAorCQkJCQkJICAgIChrRXBsTm10RXZlbnRFbnRlclJlc2V0Q29uZmlnKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJLy8gYnVpbGQgdGhlIGNvbmZpZ3VyYXRpb24gd2l0aCBpbmZvcyBmcm9tIE9ECisJCQkJY2FzZSBrRXBsTm10R3NSZXNldENvbmZpZ3VyYXRpb246CisJCQkJCXsKKwkJCQkJCXVuc2lnbmVkIGludCB1aU5vZGVJZDsKKworCQkJCQkJLy8gZ2V0IG5vZGUgSUQgZnJvbSBPRAorI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JEVSkpICE9IDApIHx8IChFUExfT0JEX1VTRV9LRVJORUwgIT0gRkFMU0UpCisJCQkJCQl1aU5vZGVJZCA9CisJCQkJCQkgICAgRXBsT2JkdUdldE5vZGVJZAorCQkJCQkJICAgIChFUExfTUNPX1BUUl9JTlNUQU5DRV9QVFIpOworI2Vsc2UKKwkJCQkJCXVpTm9kZUlkID0gMDsKKyNlbmRpZgorCQkJCQkJLy9jaGVjayBub2RlIElEIGlmIG5vdCBzaG91bGQgYmUgbWFzdGVyIG9yIHNsYXZlCisJCQkJCQlpZiAodWlOb2RlSWQgPT0gRVBMX0NfQURSX01OX0RFRl9OT0RFX0lEKSB7CS8vIG5vZGUgc2hhbGwgYmUgTU4KKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJCQkJCQkJUmV0ID0KKwkJCQkJCQkgICAgRXBsTm10dU5tdEV2ZW50CisJCQkJCQkJICAgIChrRXBsTm10RXZlbnRFbnRlck1zTm90QWN0aXZlKTsKKyNlbHNlCisJCQkJCQkJVFJBQ0UwCisJCQkJCQkJICAgICgiRXBsTm10dVByb2Nlc3MoKTogbm8gTU4gZnVuY3Rpb25hbGl0eSBpbXBsZW1lbnRlZFxuIik7CisjZW5kaWYKKwkJCQkJCX0gZWxzZSB7CS8vIG5vZGUgc2hhbGwgYmUgQ04KKwkJCQkJCQlSZXQgPQorCQkJCQkJCSAgICBFcGxObXR1Tm10RXZlbnQKKwkJCQkJCQkgICAgKGtFcGxObXRFdmVudEVudGVyQ3NOb3RBY3RpdmUpOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJCS8vIENOIHBhcnQgb2YgdGhlIHN0YXRlIG1hY2hpbmUKKworCQkJCQkvLyBub2RlIGxpc3RlbnMgZm9yIEVQTC1GcmFtZXMgYW5kIGNoZWNrIHRpbWVvdXQKKwkJCQljYXNlIGtFcGxObXRDc05vdEFjdGl2ZToKKwkJCQkJeworCQkJCQkJRFdPUkQgZHdCdWZmZXI7CisJCQkJCQl0RXBsT2JkU2l6ZSBPYmRTaXplOworCQkJCQkJdEVwbFRpbWVyQXJnIFRpbWVyQXJnOworCisJCQkJCQkvLyBjcmVhdGUgdGltZXIgdG8gc3dpdGNoIGF1dG9tYXRpY2FsbHkgdG8gQmFzaWNFdGhlcm5ldCBpZiBubyBNTiBhdmFpbGFibGUgaW4gbmV0d29yaworCisJCQkJCQkvLyByZWFkIE5NVF9DTkJhc2ljRXRoZXJuZXRUaW1lcm91dF9VMzIgZnJvbSBPRAorCQkJCQkJT2JkU2l6ZSA9IHNpemVvZihkd0J1ZmZlcik7CisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRVKSkgIT0gMCkgfHwgKEVQTF9PQkRfVVNFX0tFUk5FTCAhPSBGQUxTRSkKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsT2JkdVJlYWRFbnRyeQorCQkJCQkJICAgIChFUExfTUNPX1BUUl9JTlNUQU5DRV9QVFJfCisJCQkJCQkgICAgIDB4MUY5OSwgMHgwMCwgJmR3QnVmZmVyLAorCQkJCQkJICAgICAmT2JkU2l6ZSk7CisjZWxzZQorCQkJCQkJUmV0ID0ga0VwbE9iZEluZGV4Tm90RXhpc3Q7CisjZW5kaWYKKwkJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCWlmIChkd0J1ZmZlciAhPSAwKSB7CS8vIEJhc2ljRXRoZXJuZXQgaXMgZW5hYmxlZAorCQkJCQkJCS8vIGNvbnZlcnQgdXMgaW50byBtcworCQkJCQkJCWR3QnVmZmVyID0KKwkJCQkJCQkgICAgZHdCdWZmZXIgLyAxMDAwOworCQkJCQkJCWlmIChkd0J1ZmZlciA9PSAwKSB7CS8vIHRpbWVyIHdhcyBiZWxvdyBvbmUgbXMKKwkJCQkJCQkJLy8gc2V0IG9uZSBtcworCQkJCQkJCQlkd0J1ZmZlciA9IDE7CisJCQkJCQkJfQorCQkJCQkJCVRpbWVyQXJnLm1fRXZlbnRTaW5rID0KKwkJCQkJCQkgICAga0VwbEV2ZW50U2lua05tdGs7CisJCQkJCQkJVGltZXJBcmcubV91bEFyZyA9CisJCQkJCQkJICAgICh1bnNpZ25lZCBsb25nKQorCQkJCQkJCSAgICBrRXBsTm10RXZlbnRUaW1lckJhc2ljRXRoZXJuZXQ7CisJCQkJCQkJUmV0ID0KKwkJCQkJCQkgICAgRXBsVGltZXJ1TW9kaWZ5VGltZXJNcworCQkJCQkJCSAgICAoJkVwbE5tdHVJbnN0YW5jZV9nLgorCQkJCQkJCSAgICAgbV9UaW1lckhkbCwKKwkJCQkJCQkgICAgICh1bnNpZ25lZCBsb25nKQorCQkJCQkJCSAgICAgZHdCdWZmZXIsCisJCQkJCQkJICAgICBUaW1lckFyZyk7CisJCQkJCQkJLy8gcG90ZW50aWFsIGVycm9yIGlzIGZvcndhcmRlZCB0byBldmVudCBxdWV1ZSB3aGljaCBnZW5lcmF0ZXMgZXJyb3IgZXZlbnQKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJLy8gbm9kZSBwcm9jZXNzZXMgb25seSBhc3luYyBmcmFtZXMKKwkJCQljYXNlIGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMToKKwkJCQkJeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQkvLyBub2RlIHByb2Nlc3NlcyBpc29jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIGZyYW1lcworCQkJCWNhc2Uga0VwbE5tdENzUHJlT3BlcmF0aW9uYWwyOgorCQkJCQl7CisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbE5tdHVObXRFdmVudAorCQkJCQkJICAgIChrRXBsTm10RXZlbnRFbnRlclJlYWR5VG9PcGVyYXRlKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJLy8gbm9kZSBzaG91bGQgYmUgY29uZmlndXJlZCB1bmQgYXBwbGljYXRpb24gaXMgcmVhZHkKKwkJCQljYXNlIGtFcGxObXRDc1JlYWR5VG9PcGVyYXRlOgorCQkJCQl7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCS8vIG5vcm1hbCB3b3JrIHN0YXRlCisJCQkJY2FzZSBrRXBsTm10Q3NPcGVyYXRpb25hbDoKKwkJCQkJeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQkvLyBub2RlIHN0b3BwZWQgYnkgTU4KKwkJCQkJLy8gLT4gb25seSBwcm9jZXNzIGFzeW5jaHJvbm91cyBmcmFtZXMKKwkJCQljYXNlIGtFcGxObXRDc1N0b3BwZWQ6CisJCQkJCXsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJLy8gbm8gRVBMIGN5Y2xlCisJCQkJCS8vIC0+IG5vcm1hbCBldGhlcm5ldCBjb21tdW5pY2F0aW9uCisJCQkJY2FzZSBrRXBsTm10Q3NCYXNpY0V0aGVybmV0OgorCQkJCQl7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQkJLy8gTU4gcGFydCBvZiB0aGUgc3RhdGUgbWFjaGluZQorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCQkJCQkvLyBub2RlIGxpc3RlbnMgZm9yIEVQTC1GcmFtZXMgYW5kIGNoZWNrIHRpbWVvdXQKKwkJCQljYXNlIGtFcGxObXRNc05vdEFjdGl2ZToKKwkJCQkJeworCQkJCQkJRFdPUkQgZHdCdWZmZXI7CisJCQkJCQl0RXBsT2JkU2l6ZSBPYmRTaXplOworCQkJCQkJdEVwbFRpbWVyQXJnIFRpbWVyQXJnOworCisJCQkJCQkvLyBjcmVhdGUgdGltZXIgdG8gc3dpdGNoIGF1dG9tYXRpY2FsbHkgdG8gQmFzaWNFdGhlcm5ldC9QcmVPcDEgaWYgbm8gb3RoZXIgTU4gYWN0aXZlIGluIG5ldHdvcmsKKworCQkJCQkJLy8gY2hlY2sgTk1UX1N0YXJ0VXBfVTMyLkJpdDEzCisJCQkJCQkvLyByZWFkIE5NVF9TdGFydFVwX1UzMiBmcm9tIE9ECisJCQkJCQlPYmRTaXplID0gc2l6ZW9mKGR3QnVmZmVyKTsKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CRFUpKSAhPSAwKSB8fCAoRVBMX09CRF9VU0VfS0VSTkVMICE9IEZBTFNFKQorCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxPYmR1UmVhZEVudHJ5CisJCQkJCQkgICAgKEVQTF9NQ09fUFRSX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSAgICAgMHgxRjgwLCAweDAwLCAmZHdCdWZmZXIsCisJCQkJCQkgICAgICZPYmRTaXplKTsKKyNlbHNlCisJCQkJCQlSZXQgPSBrRXBsT2JkSW5kZXhOb3RFeGlzdDsKKyNlbmRpZgorCQkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCisJCQkJCQlpZiAoKGR3QnVmZmVyICYgRVBMX05NVFNUX0JBU0lDRVRIRVJORVQpID09IDApIHsJLy8gTk1UX1N0YXJ0VXBfVTMyLkJpdDEzID09IDAKKwkJCQkJCQkvLyBuZXcgc3RhdGUgUHJlT3BlcmF0aW9uYWwxCisJCQkJCQkJVGltZXJBcmcubV91bEFyZyA9CisJCQkJCQkJICAgICh1bnNpZ25lZCBsb25nKQorCQkJCQkJCSAgICBrRXBsTm10RXZlbnRUaW1lck1zUHJlT3AxOworCQkJCQkJfSBlbHNlIHsJLy8gTk1UX1N0YXJ0VXBfVTMyLkJpdDEzID09IDEKKwkJCQkJCQkvLyBuZXcgc3RhdGUgQmFzaWNFdGhlcm5ldAorCQkJCQkJCVRpbWVyQXJnLm1fdWxBcmcgPQorCQkJCQkJCSAgICAodW5zaWduZWQgbG9uZykKKwkJCQkJCQkgICAga0VwbE5tdEV2ZW50VGltZXJCYXNpY0V0aGVybmV0OworCQkJCQkJfQorCisJCQkJCQkvLyByZWFkIE5NVF9Cb290VGltZV9SRUMuTU5XYWl0Tm90QWN0X1UzMiBmcm9tIE9ECisJCQkJCQlPYmRTaXplID0gc2l6ZW9mKGR3QnVmZmVyKTsKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CRFUpKSAhPSAwKSB8fCAoRVBMX09CRF9VU0VfS0VSTkVMICE9IEZBTFNFKQorCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxPYmR1UmVhZEVudHJ5CisJCQkJCQkgICAgKEVQTF9NQ09fUFRSX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSAgICAgMHgxRjg5LCAweDAxLCAmZHdCdWZmZXIsCisJCQkJCQkgICAgICZPYmRTaXplKTsKKyNlbHNlCisJCQkJCQlSZXQgPSBrRXBsT2JkSW5kZXhOb3RFeGlzdDsKKyNlbmRpZgorCQkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJLy8gY29udmVydCB1cyBpbnRvIG1zCisJCQkJCQlkd0J1ZmZlciA9IGR3QnVmZmVyIC8gMTAwMDsKKwkJCQkJCWlmIChkd0J1ZmZlciA9PSAwKSB7CS8vIHRpbWVyIHdhcyBiZWxvdyBvbmUgbXMKKwkJCQkJCQkvLyBzZXQgb25lIG1zCisJCQkJCQkJZHdCdWZmZXIgPSAxOworCQkJCQkJfQorCQkJCQkJVGltZXJBcmcubV9FdmVudFNpbmsgPQorCQkJCQkJICAgIGtFcGxFdmVudFNpbmtObXRrOworCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxUaW1lcnVNb2RpZnlUaW1lck1zCisJCQkJCQkgICAgKCZFcGxObXR1SW5zdGFuY2VfZy4KKwkJCQkJCSAgICAgbV9UaW1lckhkbCwKKwkJCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpZHdCdWZmZXIsCisJCQkJCQkgICAgIFRpbWVyQXJnKTsKKwkJCQkJCS8vIHBvdGVudGlhbCBlcnJvciBpcyBmb3J3YXJkZWQgdG8gZXZlbnQgcXVldWUgd2hpY2ggZ2VuZXJhdGVzIGVycm9yIGV2ZW50CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCS8vIG5vZGUgcHJvY2Vzc2VzIG9ubHkgYXN5bmMgZnJhbWVzCisJCQkJY2FzZSBrRXBsTm10TXNQcmVPcGVyYXRpb25hbDE6CisJCQkJCXsKKwkJCQkJCURXT1JEIGR3QnVmZmVyID0gMDsKKwkJCQkJCXRFcGxPYmRTaXplIE9iZFNpemU7CisJCQkJCQl0RXBsVGltZXJBcmcgVGltZXJBcmc7CisKKwkJCQkJCS8vIGNyZWF0ZSB0aW1lciB0byBzd2l0Y2ggYXV0b21hdGljYWxseSB0byBQcmVPcDIgaWYgTU4gaWRlbnRpZmllZCBhbGwgbWFuZGF0b3J5IENOcworCisJCQkJCQkvLyByZWFkIE5NVF9Cb290VGltZV9SRUMuTU5XYWl0UHJlT3AxX1UzMiBmcm9tIE9ECisJCQkJCQlPYmRTaXplID0gc2l6ZW9mKGR3QnVmZmVyKTsKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CRFUpKSAhPSAwKSB8fCAoRVBMX09CRF9VU0VfS0VSTkVMICE9IEZBTFNFKQorCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxPYmR1UmVhZEVudHJ5CisJCQkJCQkgICAgKEVQTF9NQ09fUFRSX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSAgICAgMHgxRjg5LCAweDAzLCAmZHdCdWZmZXIsCisJCQkJCQkgICAgICZPYmRTaXplKTsKKwkJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCQkvLyBpZ25vcmUgZXJyb3IsIGJlY2F1c2UgdGhpcyB0aW1lb3V0IGlzIG9wdGlvbmFsCisJCQkJCQkJZHdCdWZmZXIgPSAwOworCQkJCQkJfQorI2VuZGlmCisJCQkJCQlpZiAoZHdCdWZmZXIgPT0gMCkgewkvLyBkZWxheSBpcyBkZWFjdGl2YXRlZAorCQkJCQkJCS8vIGltbWVkaWF0ZWx5IHBvc3QgdGltZXIgZXZlbnQKKwkJCQkJCQlSZXQgPQorCQkJCQkJCSAgICBFcGxObXR1Tm10RXZlbnQKKwkJCQkJCQkgICAgKGtFcGxObXRFdmVudFRpbWVyTXNQcmVPcDIpOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJLy8gY29udmVydCB1cyBpbnRvIG1zCisJCQkJCQlkd0J1ZmZlciA9IGR3QnVmZmVyIC8gMTAwMDsKKwkJCQkJCWlmIChkd0J1ZmZlciA9PSAwKSB7CS8vIHRpbWVyIHdhcyBiZWxvdyBvbmUgbXMKKwkJCQkJCQkvLyBzZXQgb25lIG1zCisJCQkJCQkJZHdCdWZmZXIgPSAxOworCQkJCQkJfQorCQkJCQkJVGltZXJBcmcubV9FdmVudFNpbmsgPQorCQkJCQkJICAgIGtFcGxFdmVudFNpbmtObXRrOworCQkJCQkJVGltZXJBcmcubV91bEFyZyA9CisJCQkJCQkgICAgKHVuc2lnbmVkIGxvbmcpCisJCQkJCQkgICAga0VwbE5tdEV2ZW50VGltZXJNc1ByZU9wMjsKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsVGltZXJ1TW9kaWZ5VGltZXJNcworCQkJCQkJICAgICgmRXBsTm10dUluc3RhbmNlX2cuCisJCQkJCQkgICAgIG1fVGltZXJIZGwsCisJCQkJCQkgICAgICh1bnNpZ25lZCBsb25nKWR3QnVmZmVyLAorCQkJCQkJICAgICBUaW1lckFyZyk7CisJCQkJCQkvLyBwb3RlbnRpYWwgZXJyb3IgaXMgZm9yd2FyZGVkIHRvIGV2ZW50IHF1ZXVlIHdoaWNoIGdlbmVyYXRlcyBlcnJvciBldmVudAorCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQkvLyBub2RlIHByb2Nlc3NlcyBpc29jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIGZyYW1lcworCQkJCWNhc2Uga0VwbE5tdE1zUHJlT3BlcmF0aW9uYWwyOgorCQkJCQl7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCS8vIG5vZGUgc2hvdWxkIGJlIGNvbmZpZ3VyZWQgdW5kIGFwcGxpY2F0aW9uIGlzIHJlYWR5CisJCQkJY2FzZSBrRXBsTm10TXNSZWFkeVRvT3BlcmF0ZToKKwkJCQkJeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQkvLyBub3JtYWwgd29yayBzdGF0ZQorCQkJCWNhc2Uga0VwbE5tdE1zT3BlcmF0aW9uYWw6CisJCQkJCXsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJLy8gbm8gRVBMIGN5Y2xlCisJCQkJCS8vIC0+IG5vcm1hbCBldGhlcm5ldCBjb21tdW5pY2F0aW9uCisJCQkJY2FzZSBrRXBsTm10TXNCYXNpY0V0aGVybmV0OgorCQkJCQl7CisJCQkJCQlicmVhazsKKwkJCQkJfQorI2VuZGlmIC8vICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKworCQkJCWRlZmF1bHQ6CisJCQkJCXsKKwkJCQkJCVRSQUNFMQorCQkJCQkJICAgICgiRXBsTm10dVByb2Nlc3MoKTogdW5oYW5kbGVkIE5NVCBzdGF0ZSAweCVYXG4iLAorCQkJCQkJICAgICBwTm10U3RhdGVDaGFuZ2UtPgorCQkJCQkJICAgICBtX05ld05tdFN0YXRlKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSBpZiAoUmV0ID09IGtFcGxSZWplY3QpIHsJLy8gYXBwbGljYXRpb24gd2FudHMgdG8gY2hhbmdlIE5NVCBzdGF0ZSBpdHNlbGYKKwkJCQkvLyBpdCdzIE9LCisJCQkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJCQl9CisKKwkJCUVQTF9EQkdMVkxfTk1UVV9UUkFDRTAKKwkJCSAgICAoIkVwbE5tdHVQcm9jZXNzRXZlbnQoKTogTk1ULVN0YXRlLU1hc2NoaW5lIGFubm91bmNlIGNoYW5nZSBvZiBOTVQgU3RhdGVcbiIpOworCQkJYnJlYWs7CisJCX0KKworCWRlZmF1bHQ6CisJCXsKKwkJCVJldCA9IGtFcGxObXRJbnZhbGlkRXZlbnQ7CisJCX0KKworCX0KKworLy9FeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE5tdHVSZWdpc3RlclN0YXRlQ2hhbmdlQ2IKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVnaXN0ZXIgQ2FsbGJhY2stZnVuY3Rpb24gZ28gZ2V0IGluZm9ybWVkIGFib3V0IGEKKy8vICAgICAgICAgICAgICBOTVQtQ2hhbmdlLVN0YXRlLUV2ZW50CisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcGZuRXBsTm10U3RhdGVDaGFuZ2VDYl9wID0gZnVuY3Rpb25wb2ludGVyCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDCitFcGxObXR1UmVnaXN0ZXJTdGF0ZUNoYW5nZUNiKHRFcGxObXR1U3RhdGVDaGFuZ2VDYWxsYmFjaworCQkJICAgICBwZm5FcGxObXRTdGF0ZUNoYW5nZUNiX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIHNhdmUgY2FsbGJhY2stZnVuY3Rpb24gaW4gbW9kdWwgZ2xvYmFsIHZhcgorCUVwbE5tdHVJbnN0YW5jZV9nLm1fcGZuTm10Q2hhbmdlQ2IgPSBwZm5FcGxObXRTdGF0ZUNoYW5nZUNiX3A7CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczoKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmIC8vICNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UVSkpICE9IDApCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxObXR1Q2FsLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE5tdHVDYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTI5ZWY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxObXR1Q2FsLmMKQEAgLTAsMCArMSwxNTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgY29tbXVuaWNhdGlvbiBhYnN0cmFjdGlvbiBsYXllciBvZiB0aGUKKyAgICAgICAgICAgICAgICBOTVQtVXNlcnNwYWNlLU1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE5tdHVDYWwuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICBLRUlMIHVWaXNpb24gMgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMTYgLWsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ1c2VyL0VwbE5tdHVDYWwuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxObXRrQ2FsR2V0Tm10U3RhdGUKKy8vCisvLyBEZXNjcmlwdGlvbjogcmV0dXJuIGN1cnJlbnQgTk1ULVN0YXRlCisvLyAgICAgICAgICAgICAgLT4gZW5jYXBzdWxhdGUgYWNjZXNzIHRvIGtlcm5lbHNwYWNlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbE5tdFN0YXRlID0gY3VycmVudCBOTVQtU3RhdGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsTm10U3RhdGUgUFVCTElDIEVwbE5tdGtDYWxHZXRObXRTdGF0ZSgpCit7CisJdEVwbE5tdFN0YXRlIE5tdFN0YXRlOworCS8vIGZvciB0ZXN0IGRpcmVrdCBjYWxsIGZvciBFcGxObXRrR2V0Tm10U3RhdGUoKQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRLKSkgIT0gMCkKKwlObXRTdGF0ZSA9IEVwbE5tdGtHZXRObXRTdGF0ZSgpOworI2Vsc2UKKwlObXRTdGF0ZSA9IDA7CisjZW5kaWYKKwlyZXR1cm4gTm10U3RhdGU7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczoKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE9iZC5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxPYmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmJiMTk2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxPYmQuYwpAQCAtMCwwICsxLDMyNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgYXBpIGZ1bmN0aW9uIG9mIEVwbE9CRC1Nb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxPYmQuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMTIgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgTWljcm9zb2Z0IFZDNworCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMDIgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCQkgICAgIC0+YmFzZWQgb24gQ0FOb3BlbiBPQkQtTW9kdWwKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkVwbEluYy5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxPYmRrLmgiCS8vIGZ1bmN0aW9uIHByb3RvdHlwcyBvZiB0aGUgRXBsT0JELU1vZHVsCisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JESykpICE9IDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBmbG9hdCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zCisjZGVmaW5lIF9TSElGVEVEX0VYUE9ORU5UX01BU0tfU1AgICAweGZmCisjZGVmaW5lIF9CSUFTX1NQICAgICAgICAgICAgICAgICAgICAxMjYKKyNkZWZpbmUgVF9TUCAgICAgICAgICAgICAgICAgICAgICAgIDIzCisjZGVmaW5lIEVYUE9ORU5UX0RFTk9STV9TUCAgICAgICAgICAoLV9CSUFTX1NQKQorI2RlZmluZSBCQVNFX1RPX1RIRV9UX1NQICAgICAgICAgICAgKChmbG9hdCkgODM4ODYwOC4wKQorI2RlZmluZSBHRVRfRVhQT05FTlRfU1AoeCkgICAgICAgICAgKCgoKHgpID4+IFRfU1ApICYgX1NISUZURURfRVhQT05FTlRfTUFTS19TUCkgLSBfQklBU19TUCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBzdHJ1Y3QgZm9yIGluc3RhbmNlIHRhYmxlCitJTlNUQU5DRV9UWVBFX0JFR0lOIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9NRU1CRVIoKQorCitTVEFUSUMgdEVwbE9iZEluaXRQYXJhbSBJTlNUX0ZBUiBtX09iZEluaXRQYXJhbTsKK1NUQVRJQyB0RXBsT2JkU3RvcmVMb2FkT2JqQ2FsbGJhY2sgSU5TVF9ORUFSIG1fZnBTdG9yZUxvYWRPYmpDYWxsYmFjazsKKworSU5TVEFOQ0VfVFlQRV9FTkQKKy8vIGRlY29tcG9zaXRpb24gb2YgZmxvYXQKK3R5cGVkZWYgdW5pb24geworCXRFcGxPYmRSZWFsMzIgbV9mbFJlYWxQYXJ0OworCWludCBtX25JbnRlZ2VyUGFydDsKKworfSB0RXBsT2JkUmVhbFBhcnRzOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUaGlzIG1hY3JvIHJlcGxhY2UgdGhlIHVuc3BlY2lmaWMgcG9pbnRlciB0byBhbiBpbnN0YW5jZSB0aHJvdWdoCisvLyB0aGUgbW9kdWwgc3BlY2lmaWMgdHlwZSBmb3IgdGhlIGxvY2FsIGluc3RhbmNlIHRhYmxlLiBUaGlzIG1hY3JvCisvLyBtdXN0IGRlZmluZWQgaW4gZWFjaCBtb2R1bC4KKy8vI2RlZmluZSB0RXBsUHRySW5zdGFuY2UgICAgICAgICAgICAgdEVwbEluc3RhbmNlSW5mbyBNRU0qCisKK0VQTF9NQ09fREVDTF9JTlNUQU5DRV9WQVIoKQorCitCWVRFIE1FTSBhYkVwbE9iZFRyYXNoT2JqZWN0X2dbOF07CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFUExfTUNPX0RFRklORV9JTlNUQU5DRV9GQ1QoKQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxPYmRDYWxsT2JqZWN0Q2FsbGJhY2soRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJICAgdEVwbE9iZENhbGxiYWNrIGZwQ2FsbGJhY2tfcCwKKwkJCQkJICAgdEVwbE9iZENiUGFyYW0gTUVNICogcENiUGFyYW1fcCk7CisKK3N0YXRpYyB0RXBsT2JkU2l6ZSBFcGxPYmRHZXREYXRhU2l6ZUludGVybih0RXBsT2JkU3ViRW50cnlQdHIgcFN1YkluZGV4RW50cnlfcCk7CisKK3N0YXRpYyB0RXBsT2JkU2l6ZSBFcGxPYmRHZXRTdHJMZW4odm9pZCAqcE9iakRhdGFfcCwKKwkJCQkgICB0RXBsT2JkU2l6ZSBPYmpMZW5fcCwgdEVwbE9iZFR5cGUgT2JqVHlwZV9wKTsKKworI2lmIChFUExfT0JEX0NIRUNLX09CSkVDVF9SQU5HRSAhPSBGQUxTRSkKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE9iZENoZWNrT2JqZWN0UmFuZ2UodEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJpbmRleEVudHJ5X3AsCisJCQkJCSB2b2lkICpwRGF0YV9wKTsKKyNlbmRpZgorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxPYmRHZXRWYXJFbnRyeSh0RXBsT2JkU3ViRW50cnlQdHIgcFN1YmluZGV4RW50cnlfcCwKKwkJCQkgICAgdEVwbE9iZFZhckVudHJ5IE1FTSAqKiBwcFZhckVudHJ5X3ApOworCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxPYmRHZXRFbnRyeShFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCSB1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCSB1bnNpZ25lZCBpbnQgdWlTdWJpbmRleF9wLAorCQkJCSB0RXBsT2JkRW50cnlQdHIgKiBwcE9iZEVudHJ5X3AsCisJCQkJIHRFcGxPYmRTdWJFbnRyeVB0ciAqIHBwT2JkU3ViRW50cnlfcCk7CisKK3N0YXRpYyB0RXBsT2JkU2l6ZSBFcGxPYmRHZXRPYmplY3RTaXplKHRFcGxPYmRTdWJFbnRyeVB0ciBwU3ViSW5kZXhFbnRyeV9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsT2JkR2V0SW5kZXhJbnRlcm4odEVwbE9iZEluaXRQYXJhbSBNRU0gKiBwSW5pdFBhcmFtX3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJICAgICAgIHRFcGxPYmRFbnRyeVB0ciAqIHBwT2JkRW50cnlfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE9iZEdldFN1YmluZGV4SW50ZXJuKHRFcGxPYmRFbnRyeVB0ciBwT2JkRW50cnlfcCwKKwkJCQkJICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkgIHRFcGxPYmRTdWJFbnRyeVB0ciAqIHBwT2JkU3ViRW50cnlfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE9iZEFjY2Vzc09kUGFydEludGVybihFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkgICB0RXBsT2JkUGFydCBDdXJyZW50T2RQYXJ0X3AsCisJCQkJCSAgIHRFcGxPYmRFbnRyeVB0ciBwT2JkRW50eV9wLAorCQkJCQkgICB0RXBsT2JkRGlyIERpcmVjdGlvbl9wKTsKKworc3RhdGljIHZvaWQgKkVwbE9iZEdldE9iamVjdERlZmF1bHRQdHIodEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJJbmRleEVudHJ5X3ApOworc3RhdGljIHZvaWQgTUVNICpFcGxPYmRHZXRPYmplY3RDdXJyZW50UHRyKHRFcGxPYmRTdWJFbnRyeVB0ciBwU3ViSW5kZXhFbnRyeV9wKTsKKworI2lmIChFUExfT0JEX1VTRV9TVE9SRV9SRVNUT1JFICE9IEZBTFNFKQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxPYmRDYWxsU3RvcmVDYWxsYmFjayhFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkgIHRFcGxPYmRDYlN0b3JlUGFyYW0gTUVNICoKKwkJCQkJICBwQ2JTdG9yZVBhcmFtX3ApOworCisjZW5kaWYgLy8gKEVQTF9PQkRfVVNFX1NUT1JFX1JFU1RPUkUgIT0gRkFMU0UpCisKK3N0YXRpYyB2b2lkIEVwbE9iZENvcHlPYmplY3REYXRhKHZvaWQgTUVNICogcERzdERhdGFfcCwKKwkJCQkgdm9pZCAqcFNyY0RhdGFfcCwKKwkJCQkgdEVwbE9iZFNpemUgT2JqU2l6ZV9wLCB0RXBsT2JkVHlwZSBPYmpUeXBlX3ApOworCit2b2lkICpFcGxPYmRHZXRPYmplY3REYXRhUHRySW50ZXJuKHRFcGxPYmRTdWJFbnRyeVB0ciBwU3ViaW5kZXhFbnRyeV9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsT2JkSXNOdW1lcmljYWxJbnRlcm4odEVwbE9iZFN1YkVudHJ5UHRyIHBPYmRTdWJFbnRyeV9wLAorCQkJCQkgIEJPT0wgKiBwZkVudHJ5TnVtZXJpY2FsX3ApOworCitzdGF0aWMgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkV3JpdGVFbnRyeVByZShFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkgICAgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCwKKwkJCQkJICAgICB2b2lkICpwU3JjRGF0YV9wLAorCQkJCQkgICAgIHZvaWQgKipwcERzdERhdGFfcCwKKwkJCQkJICAgICB0RXBsT2JkU2l6ZSBTaXplX3AsCisJCQkJCSAgICAgdEVwbE9iZEVudHJ5UHRyICogcHBPYmRFbnRyeV9wLAorCQkJCQkgICAgIHRFcGxPYmRTdWJFbnRyeVB0ciAqIHBwU3ViRW50cnlfcCwKKwkJCQkJICAgICB0RXBsT2JkQ2JQYXJhbSBNRU0gKiBwQ2JQYXJhbV9wLAorCQkJCQkgICAgIHRFcGxPYmRTaXplICogcE9iZFNpemVfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmRXcml0ZUVudHJ5UG9zdChFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkgICAgICB0RXBsT2JkRW50cnlQdHIgcE9iZEVudHJ5X3AsCisJCQkJCSAgICAgIHRFcGxPYmRTdWJFbnRyeVB0ciBwU3ViRW50cnlfcCwKKwkJCQkJICAgICAgdEVwbE9iZENiUGFyYW0gTUVNICogcENiUGFyYW1fcCwKKwkJCQkJICAgICAgdm9pZCAqcFNyY0RhdGFfcCwKKwkJCQkJICAgICAgdm9pZCAqcERzdERhdGFfcCwKKwkJCQkJICAgICAgdEVwbE9iZFNpemUgT2JkU2l6ZV9wKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZEluaXQoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBpbml0aWFsaXplcyB0aGUgZmlyc3QgaW5zdGFuY2UKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEluaXRQYXJhbV9wICAgID0gaW5pdCBwYXJhbWV0ZXIKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgICAgID0gICBlcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkSW5pdChFUExfTUNPX0RFQ0xfUFRSX0lOU1RBTkNFX1BUUl8KKwkJCQkJICB0RXBsT2JkSW5pdFBhcmFtIE1FTSAqIHBJbml0UGFyYW1fcCkKK3sKKworCXRFcGxLZXJuZWwgUmV0OworCUVQTF9NQ09fREVMRVRFX0lOU1RBTkNFX1RBQkxFKCk7CisKKwlpZiAocEluaXRQYXJhbV9wID09IE5VTEwpIHsKKwkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlSZXQgPSBFcGxPYmRBZGRJbnN0YW5jZShFUExfTUNPX1BUUl9JTlNUQU5DRV9QVFJfIHBJbml0UGFyYW1fcCk7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRBZGRJbnN0YW5jZSgpCisvLworLy8gRGVzY3JpcHRpb246IGFkZHMgYSBuZXcgaW5zdGFuY2UKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEluaXRQYXJhbV9wCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkQWRkSW5zdGFuY2UoRVBMX01DT19ERUNMX1BUUl9JTlNUQU5DRV9QVFJfCisJCQkJCQkgdEVwbE9iZEluaXRQYXJhbSBNRU0gKgorCQkJCQkJIHBJbml0UGFyYW1fcCkKK3sKKworCUVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfTE9DQUwgdEVwbEtlcm5lbCBSZXQ7CisKKwkvLyBjaGVjayBpZiBwb2ludGVyIHRvIGluc3RhbmNlIHBvaW50ZXIgdmFsaWQKKwkvLyBnZXQgZnJlZSBpbnN0YW5jZSBhbmQgc2V0IHRoZSBnbG9iYWxlIGluc3RhbmNlIHBvaW50ZXIKKwkvLyBzZXQgYWxzbyB0aGUgaW5zdGFuY2UgYWRkciB0byBwYXJhbWV0ZXJsaXN0CisJRVBMX01DT19DSEVDS19QVFJfSU5TVEFOQ0VfUFRSKCk7CisJRVBMX01DT19HRVRfRlJFRV9JTlNUQU5DRV9QVFIoKTsKKwlFUExfTUNPX1NFVF9QVFJfSU5TVEFOQ0VfUFRSKCk7CisKKwkvLyBzYXZlIGluaXQgcGFyYW1ldGVycworCUVQTF9NRU1DUFkoJkVQTF9NQ09fR0xCX1ZBUihtX09iZEluaXRQYXJhbSksIHBJbml0UGFyYW1fcCwKKwkJICAgc2l6ZW9mKHRFcGxPYmRJbml0UGFyYW0pKTsKKworCS8vIGNsZWFyIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBjb21tYW5kIExPQUQgYW5kIFNUT1JFCisJRVBMX01DT19HTEJfVkFSKG1fZnBTdG9yZUxvYWRPYmpDYWxsYmFjaykgPSBOVUxMOworCisJLy8gc2lnbiBpbnN0YW5jZSBhcyB1c2VkCisJRVBMX01DT19XUklURV9JTlNUQU5DRV9TVEFURShrU3RhdGVVc2VkKTsKKworCS8vIGluaXRpYWxpemUgb2JqZWN0IGRpY3Rpb25hcnkKKwkvLyBzbyBhbGwgYWxsIFZhckVudHJpZXMgd2lsbCBiZSBpbml0aWFsaXplZCB0byB0cmFzaCBvYmplY3QgYW5kIGRlZmF1bHQgdmFsdWVzIHdpbGwgYmUgc2V0IHRvIGN1cnJlbnQgZGF0YQorCVJldCA9IEVwbE9iZEFjY2Vzc09kUGFydChFUExfTUNPX0lOU1RBTkNFX1BUUl8KKwkJCQkga0VwbE9iZFBhcnRBbGwsIGtFcGxPYmREaXJJbml0KTsKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkRGVsZXRlSW5zdGFuY2UoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBkZWxldGUgaW5zdGFuY2UKKy8vCisvLyBQYXJhbWV0ZXJzOiAgRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUgorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiAoRVBMX1VTRV9ERUxFVEVJTlNUX0ZVTkMgIT0gRkFMU0UpCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkRGVsZXRlSW5zdGFuY2UoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUikKK3sKKwkvLyBjaGVjayBmb3IgYWxsIEFQSSBmdW5jdGlvbiBpZiBpbnN0YW5jZSBpcyB2YWxpZAorCUVQTF9NQ09fQ0hFQ0tfSU5TVEFOQ0VfU1RBVEUoKTsKKworCS8vIHNpZ24gaW5zdGFuY2UgYXMgdW51c2VkCisJRVBMX01DT19XUklURV9JTlNUQU5DRV9TVEFURShrU3RhdGVVbnVzZWQpOworCisJcmV0dXJuIGtFcGxTdWNjZXNzZnVsOworCit9CisjZW5kaWYgLy8gKEVQTF9VU0VfREVMRVRFSU5TVF9GVU5DICE9IEZBTFNFKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRXcml0ZUVudHJ5KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogRnVuY3Rpb24gd3JpdGVzIGRhdGEgdG8gYW4gT0JEIGVudHJ5LiBTdHJpbmdzCisvLyAgICAgICAgICAgICAgYXJlIHN0b3JlZCB3aXRoIGFkZGVkICdcMCcgY2hhcmFjdGVyLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworLy8gICAgICAgICAgICAgIHVpSW5kZXhfcCAgICAgICA9ICAgSW5kZXggb2YgdGhlIE9EIGVudHJ5CisvLyAgICAgICAgICAgICAgdWlTdWJJbmRleF9wICAgID0gICBTdWJpbmRleCBvZiB0aGUgT0QgRW50cnkKKy8vICAgICAgICAgICAgICBwU3JjRGF0YV9wICAgICAgPSAgIFBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gd3JpdGUKKy8vICAgICAgICAgICAgICBTaXplX3AgICAgICAgICAgPSAgIFNpemUgb2YgdGhlIGRhdGEgaW4gQnl0ZQorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgPSAgIEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkV3JpdGVFbnRyeShFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkJdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCXVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCQl2b2lkICpwU3JjRGF0YV9wLAorCQkJCQkJdEVwbE9iZFNpemUgU2l6ZV9wKQoreworCisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbE9iZEVudHJ5UHRyIHBPYmRFbnRyeTsKKwl0RXBsT2JkU3ViRW50cnlQdHIgcFN1YkVudHJ5OworCXRFcGxPYmRDYlBhcmFtIE1FTSBDYlBhcmFtOworCXZvaWQgTUVNICpwRHN0RGF0YTsKKwl0RXBsT2JkU2l6ZSBPYmRTaXplOworCisJUmV0ID0gRXBsT2JkV3JpdGVFbnRyeVByZShFUExfTUNPX0lOU1RBTkNFX1BUUl8KKwkJCQkgIHVpSW5kZXhfcCwKKwkJCQkgIHVpU3ViSW5kZXhfcCwKKwkJCQkgIHBTcmNEYXRhX3AsCisJCQkJICAmcERzdERhdGEsCisJCQkJICBTaXplX3AsCisJCQkJICAmcE9iZEVudHJ5LCAmcFN1YkVudHJ5LCAmQ2JQYXJhbSwgJk9iZFNpemUpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCVJldCA9IEVwbE9iZFdyaXRlRW50cnlQb3N0KEVQTF9NQ09fSU5TVEFOQ0VfUFRSXworCQkJCSAgIHBPYmRFbnRyeSwKKwkJCQkgICBwU3ViRW50cnksCisJCQkJICAgJkNiUGFyYW0sIHBTcmNEYXRhX3AsIHBEc3REYXRhLCBPYmRTaXplKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKyAgICAgIEV4aXQ6CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZFJlYWRFbnRyeSgpCisvLworLy8gRGVzY3JpcHRpb246IFRoZSBmdW5jdGlvbiByZWFkcyBhbiBvYmplY3QgZW50cnkuIFRoZSBhcHBsaWNhdGlvbgorLy8gICAgICAgICAgICAgIGNhbiBhbHdheXMgcmVhZCB0aGUgZGF0YSBldmVuIGlmIGF0dHJpYiBrRXBsT2JkQWNjUmVhZAorLy8gICAgICAgICAgICAgIGlzIG5vdCBzZXQuIFRoZSBhdHRyaWIgaXMgb25seSBjaGVja2VkIHVwIGZvciBTRE8gdHJhbnNmZXIuCisvLworLy8gUGFyYW1ldGVyczogIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisvLyAgICAgICAgICAgICAgdWlJbmRleF9wICAgICAgID0gSW5kZXggb29mIHRoZSBPRCBlbnRyeSB0byByZWFkCisvLyAgICAgICAgICAgICAgdWlTdWJJbmRleF9wICAgID0gU3ViaW5kZXggdG8gcmVhZAorLy8gICAgICAgICAgICAgIHBEc3REYXRhX3AgICAgICA9IHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBmb3IgZGF0YQorLy8gICAgICAgICAgICAgIE9mZnNldF9wICAgICAgICA9IG9mZnNldCBpbiBkYXRhIGZvciByZWFkIGFjY2VzcworLy8gICAgICAgICAgICAgIHBTaXplX3AgICAgICAgICA9IElOOiBTaXplIG9mIHRoZSBidWZmZXIKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVVQ6IG51bWJlciBvZiByZWFkZWQgQnl0ZXMKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmRSZWFkRW50cnkoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkgICAgICAgdm9pZCAqcERzdERhdGFfcCwKKwkJCQkJICAgICAgIHRFcGxPYmRTaXplICogcFNpemVfcCkKK3sKKworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxPYmRFbnRyeVB0ciBwT2JkRW50cnk7CisJdEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJFbnRyeTsKKwl0RXBsT2JkQ2JQYXJhbSBNRU0gQ2JQYXJhbTsKKwl2b2lkICpwU3JjRGF0YTsKKwl0RXBsT2JkU2l6ZSBPYmRTaXplOworCisJLy8gY2hlY2sgZm9yIGFsbCBBUEkgZnVuY3Rpb24gaWYgaW5zdGFuY2UgaXMgdmFsaWQKKwlFUExfTUNPX0NIRUNLX0lOU1RBTkNFX1NUQVRFKCk7CisKKwlBU1NFUlQocERzdERhdGFfcCAhPSBOVUxMKTsKKwlBU1NFUlQocFNpemVfcCAhPSBOVUxMKTsKKworCS8vIGdldCBhZGRyZXNzIG9mIGluZGV4IGFuZCBzdWJpbmRleCBlbnRyeQorCVJldCA9IEVwbE9iZEdldEVudHJ5KEVQTF9NQ09fSU5TVEFOQ0VfUFRSXworCQkJICAgICB1aUluZGV4X3AsIHVpU3ViSW5kZXhfcCwgJnBPYmRFbnRyeSwgJnBTdWJFbnRyeSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGdldCBwb2ludGVyIHRvIG9iamVjdCBkYXRhCisJcFNyY0RhdGEgPSBFcGxPYmRHZXRPYmplY3REYXRhUHRySW50ZXJuKHBTdWJFbnRyeSk7CisKKwkvLyBjaGVjayBzb3VyY2UgcG9pbnRlcgorCWlmIChwU3JjRGF0YSA9PSBOVUxMKSB7CisJCVJldCA9IGtFcGxPYmRSZWFkVmlvbGF0aW9uOworCQlnb3RvIEV4aXQ7CisJfQorCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gYWRkcmVzcyBvZiBzb3VyY2UgZGF0YSB0byBzdHJ1Y3R1cmUgb2YgY2FsbGJhY2sgcGFyYW1ldGVycworCS8vIHNvIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbiBjaGFuZ2UgdGhpcyBkYXRhIGJlZm9yZSByZWFkaW5nCisJQ2JQYXJhbS5tX3VpSW5kZXggPSB1aUluZGV4X3A7CisJQ2JQYXJhbS5tX3VpU3ViSW5kZXggPSB1aVN1YkluZGV4X3A7CisJQ2JQYXJhbS5tX3BBcmcgPSBwU3JjRGF0YTsKKwlDYlBhcmFtLm1fT2JkRXZlbnQgPSBrRXBsT2JkRXZQcmVSZWFkOworCVJldCA9IEVwbE9iZENhbGxPYmplY3RDYWxsYmFjayhFUExfTUNPX0lOU1RBTkNFX1BUUl8KKwkJCQkgICAgICAgcE9iZEVudHJ5LT5tX2ZwQ2FsbGJhY2ssICZDYlBhcmFtKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZ2V0IHNpemUgb2YgZGF0YSBhbmQgY2hlY2sgaWYgYXBwbGljYXRpb24gaGFzIHJlc2VydmVkIGVub3VnaCBtZW1vcnkKKwlPYmRTaXplID0gRXBsT2JkR2V0RGF0YVNpemVJbnRlcm4ocFN1YkVudHJ5KTsKKwkvLyBjaGVjayBpZiBvZmZzZXQgZ2l2ZW4gYW5kIGNhbGMgY29ycmVjdCBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorCWlmICgqcFNpemVfcCA8IE9iZFNpemUpIHsKKwkJUmV0ID0ga0VwbE9iZFZhbHVlTGVuZ3RoRXJyb3I7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gcmVhZCB2YWx1ZSBmcm9tIG9iamVjdAorCUVQTF9NRU1DUFkocERzdERhdGFfcCwgcFNyY0RhdGEsIE9iZFNpemUpOworCSpwU2l6ZV9wID0gT2JkU2l6ZTsKKworCS8vIHdyaXRlIGFkZHJlc3Mgb2YgZGVzdGluYXRpb24gZGF0YSB0byBzdHJ1Y3R1cmUgb2YgY2FsbGJhY2sgcGFyYW1ldGVycworCS8vIHNvIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbiBjaGFuZ2UgdGhpcyBkYXRhIGFmdGVyIHJlYWRpbmcKKwlDYlBhcmFtLm1fcEFyZyA9IHBEc3REYXRhX3A7CisJQ2JQYXJhbS5tX09iZEV2ZW50ID0ga0VwbE9iZEV2UG9zdFJlYWQ7CisJUmV0ID0gRXBsT2JkQ2FsbE9iamVjdENhbGxiYWNrKEVQTF9NQ09fSU5TVEFOQ0VfUFRSXworCQkJCSAgICAgICBwT2JkRW50cnktPm1fZnBDYWxsYmFjaywgJkNiUGFyYW0pOworCisgICAgICBFeGl0OgorCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRBY2Nlc3NPZFBhcnQoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZXN0b3JlcyBkZWZhdWx0IHZhbHVlcyBvZiBvbmUgcGFydCBvZiBPRAorLy8KKy8vIFBhcmFtZXRlcnM6ICBPYmRQYXJ0X3AKKy8vICAgICAgICAgICAgICBEaXJlY3Rpb25fcAorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZEFjY2Vzc09kUGFydChFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkJICB0RXBsT2JkUGFydCBPYmRQYXJ0X3AsCisJCQkJCQkgIHRFcGxPYmREaXIgRGlyZWN0aW9uX3ApCit7CisKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCUJPT0wgZlBhcnRGb3VudDsKKwl0RXBsT2JkRW50cnlQdHIgcE9iZEVudHJ5OworCisJLy8gY2hlY2sgZm9yIGFsbCBBUEkgZnVuY3Rpb24gaWYgaW5zdGFuY2UgaXMgdmFsaWQKKwlFUExfTUNPX0NIRUNLX0lOU1RBTkNFX1NUQVRFKCk7CisKKwkvLyAgcGFydCBhbHdheXMgaGFzIHRvIGJlIHVuZXF1YWwgdG8gTlVMTAorCXBPYmRFbnRyeSA9IEVQTF9NQ09fR0xCX1ZBUihtX09iZEluaXRQYXJhbS5tX3BQYXJ0KTsKKwlBU1NFUlRNU0cocE9iZEVudHJ5ICE9IE5VTEwsCisJCSAgIkVwbE9iZEFjY2Vzc09kUGFydCgpOiBubyAgT0QgcGFydCBpcyBkZWZpbmVkIVxuIik7CisKKwkvLyBpZiBPYmRQYXJ0X3AgaXMgbm90IHZhbGlkIGZQYXJ0Rm91bmQga2VlcHMgRkFMU0UgYW5kIGZ1bmN0aW9uIHJldHVybnMga0VwbE9iZElsbGVnYWxQYXJ0CisJZlBhcnRGb3VudCA9IEZBTFNFOworCisJLy8gYWNjZXNzIHRvICBwYXJ0CisJaWYgKChPYmRQYXJ0X3AgJiBrRXBsT2JkUGFydEdlbikgIT0gMCkgeworCQlmUGFydEZvdW50ID0gVFJVRTsKKworCQlSZXQgPSBFcGxPYmRBY2Nlc3NPZFBhcnRJbnRlcm4oRVBMX01DT19JTlNUQU5DRV9QVFJfCisJCQkJCSAgICAgICBrRXBsT2JkUGFydEdlbiwgcE9iZEVudHJ5LAorCQkJCQkgICAgICAgRGlyZWN0aW9uX3ApOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwl9CisJLy8gYWNjZXNzIHRvIG1hbnVmYWN0dXJlciBwYXJ0CisJcE9iZEVudHJ5ID0gRVBMX01DT19HTEJfVkFSKG1fT2JkSW5pdFBhcmFtLm1fcE1hbnVmYWN0dXJlclBhcnQpOworCisJaWYgKCgoT2JkUGFydF9wICYga0VwbE9iZFBhcnRNYW4pICE9IDApICYmIChwT2JkRW50cnkgIT0gTlVMTCkpIHsKKwkJZlBhcnRGb3VudCA9IFRSVUU7CisKKwkJUmV0ID0gRXBsT2JkQWNjZXNzT2RQYXJ0SW50ZXJuKEVQTF9NQ09fSU5TVEFOQ0VfUFRSXworCQkJCQkgICAgICAga0VwbE9iZFBhcnRNYW4sIHBPYmRFbnRyeSwKKwkJCQkJICAgICAgIERpcmVjdGlvbl9wKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisJfQorCS8vIGFjY2VzcyB0byBkZXZpY2UgcGFydAorCXBPYmRFbnRyeSA9IEVQTF9NQ09fR0xCX1ZBUihtX09iZEluaXRQYXJhbS5tX3BEZXZpY2VQYXJ0KTsKKworCWlmICgoKE9iZFBhcnRfcCAmIGtFcGxPYmRQYXJ0RGV2KSAhPSAwKSAmJiAocE9iZEVudHJ5ICE9IE5VTEwpKSB7CisJCWZQYXJ0Rm91bnQgPSBUUlVFOworCisJCVJldCA9IEVwbE9iZEFjY2Vzc09kUGFydEludGVybihFUExfTUNPX0lOU1RBTkNFX1BUUl8KKwkJCQkJICAgICAgIGtFcGxPYmRQYXJ0RGV2LCBwT2JkRW50cnksCisJCQkJCSAgICAgICBEaXJlY3Rpb25fcCk7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCX0KKyNpZiAoZGVmaW5lZCAoRVBMX09CRF9VU0VSX09EKSAmJiAoRVBMX09CRF9VU0VSX09EICE9IEZBTFNFKSkKKwl7CisJCS8vIGFjY2VzcyB0byB1c2VyIHBhcnQKKwkJcE9iZEVudHJ5ID0gRVBMX01DT19HTEJfVkFSKG1fT2JkSW5pdFBhcmFtLm1fcFVzZXJQYXJ0KTsKKworCQlpZiAoKChPYmRQYXJ0X3AgJiBrRXBsT2JkUGFydFVzcikgIT0gMCkgJiYgKHBPYmRFbnRyeSAhPSBOVUxMKSkgeworCQkJZlBhcnRGb3VudCA9IFRSVUU7CisKKwkJCVJldCA9IEVwbE9iZEFjY2Vzc09kUGFydEludGVybihFUExfTUNPX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSAgICAgICBrRXBsT2JkUGFydFVzciwKKwkJCQkJCSAgICAgICBwT2JkRW50cnksIERpcmVjdGlvbl9wKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCX0KKwl9CisjZW5kaWYKKworCS8vIG5vIGFjY2VzcyB0byBhbiBPRCBwYXJ0IHdhcyBkb25lPyBpbGxlZ2FsIE9EIHBhcnQgd2FzIHNwZWNpZmllZCEKKwlpZiAoZlBhcnRGb3VudCA9PSBGQUxTRSkgeworCQlSZXQgPSBrRXBsT2JkSWxsZWdhbFBhcnQ7CisJfQorCisgICAgICBFeGl0OgorCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmREZWZpbmVWYXIoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBkZWZpbmVzIGEgdmFyaWFibGUgaW4gT0QKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEVwbFZhclBhcmFtX3AKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmREZWZpbmVWYXIoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJICAgICAgIHRFcGxWYXJQYXJhbSBNRU0gKiBwVmFyUGFyYW1fcCkKK3sKKworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxPYmRWYXJFbnRyeSBNRU0gKnBWYXJFbnRyeTsKKwl0RXBsVmFyUGFyYW1WYWxpZCBWYXJWYWxpZDsKKwl0RXBsT2JkU3ViRW50cnlQdHIgcFN1YmluZGV4RW50cnk7CisKKwkvLyBjaGVjayBmb3IgYWxsIEFQSSBmdW5jdGlvbiBpZiBpbnN0YW5jZSBpcyB2YWxpZAorCUVQTF9NQ09fQ0hFQ0tfSU5TVEFOQ0VfU1RBVEUoKTsKKworCUFTU0VSVChwVmFyUGFyYW1fcCAhPSBOVUxMKTsJLy8gaXMgbm90IGFsbG93ZWQgdG8gYmUgTlVMTAorCisJLy8gZ2V0IGFkZHJlc3Mgb2Ygc3ViaW5kZXggZW50cnkKKwlSZXQgPSBFcGxPYmRHZXRFbnRyeShFUExfTUNPX0lOU1RBTkNFX1BUUl8KKwkJCSAgICAgcFZhclBhcmFtX3AtPm1fdWlJbmRleCwKKwkJCSAgICAgcFZhclBhcmFtX3AtPm1fdWlTdWJpbmRleCwgTlVMTCwgJnBTdWJpbmRleEVudHJ5KTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZ2V0IHZhciBlbnRyeQorCVJldCA9IEVwbE9iZEdldFZhckVudHJ5KHBTdWJpbmRleEVudHJ5LCAmcFZhckVudHJ5KTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlWYXJWYWxpZCA9IHBWYXJQYXJhbV9wLT5tX1ZhbGlkRmxhZzsKKworCS8vIGNvcHkgb25seSB0aGlzIHZhbHVlcywgd2hpY2ggdmFsaWQgZmxhZyBpcyBzZXQKKwlpZiAoKFZhclZhbGlkICYga1ZhclZhbGlkU2l6ZSkgIT0gMCkgeworCQlpZiAocFN1YmluZGV4RW50cnktPm1fVHlwZSAhPSBrRXBsT2JkVHlwRG9tYWluKSB7CisJCQl0RXBsT2JkU2l6ZSBEYXRhU2l6ZTsKKworCQkJLy8gY2hlY2sgcGFzc2VkIHNpemUgcGFyYW1ldGVyCisJCQlEYXRhU2l6ZSA9IEVwbE9iZEdldE9iamVjdFNpemUocFN1YmluZGV4RW50cnkpOworCQkJaWYgKERhdGFTaXplICE9IHBWYXJQYXJhbV9wLT5tX1NpemUpIHsJLy8gc2l6ZSBvZiB2YXJpYWJsZSBkb2VzIG5vdCBtYXRjaAorCQkJCVJldCA9IGtFcGxPYmRWYWx1ZUxlbmd0aEVycm9yOworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJfSBlbHNlIHsJLy8gc2l6ZSBjYW4gYmUgc2V0IG9ubHkgZm9yIG9iamVjdHMgb2YgdHlwZSBET01BSU4KKwkJCXBWYXJFbnRyeS0+bV9TaXplID0gcFZhclBhcmFtX3AtPm1fU2l6ZTsKKwkJfQorCX0KKworCWlmICgoVmFyVmFsaWQgJiBrVmFyVmFsaWREYXRhKSAhPSAwKSB7CisJCXBWYXJFbnRyeS0+bV9wRGF0YSA9IHBWYXJQYXJhbV9wLT5tX3BEYXRhOworCX0KKy8qCisgICAgI2lmIChFUExfUERPX1VTRV9TVEFUSUNfTUFQUElORyA9PSBGQUxTRSkKKyAgICB7CisgICAgICAgIGlmICgoVmFyVmFsaWQgJiBrVmFyVmFsaWRDYWxsYmFjaykgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICBwVmFyRW50cnktPm1fZnBDYWxsYmFjayA9IHBWYXJQYXJhbV9wLT5tX2ZwQ2FsbGJhY2s7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKFZhclZhbGlkICYga1ZhclZhbGlkQXJnKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgIHBWYXJFbnRyeS0+bV9wQXJnID0gcFZhclBhcmFtX3AtPm1fcEFyZzsKKyAgICAgICAgfQorICAgIH0KKyAgICAjZW5kaWYKKyovCisJLy8gUmV0IGlzIGFscmVhZHkgc2V0IHRvIGtFcGxTdWNjZXNzZnVsIGZyb20gT2JkR2V0VmFySW50ZXJuKCkKKworICAgICAgRXhpdDoKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkR2V0T2JqZWN0RGF0YVB0cigpCisvLworLy8gRGVzY3JpcHRpb246IEl0IHJldHVybmVzIHRoZSBjdXJyZW50IGRhdGEgcG9pbnRlci4gQnV0IGlmIG9iamVjdCBpcyBhbgorLy8gICAgICAgICAgICAgIGNvbnN0YW50IG9iamVjdCBpdCByZXR1cm5lcyB0aGUgZGVmYXVsdCBwb2ludGVyLgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aUluZGV4X3AgICAgPSAgIEluZGV4IG9mIHRoZSBlbnRyeQorLy8gICAgICAgICAgICAgIHVpU3ViaW5kZXhfcCA9ICAgU3ViaW5kZXggb2YgdGhlIGVudHJ5CisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQgKiAgICA9IHBvaW50ZXIgdG8gb2JqZWN0IGRhdGEKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFUExETExFWFBPUlQgdm9pZCAqUFVCTElDIEVwbE9iZEdldE9iamVjdERhdGFQdHIoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSB1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdm9pZCAqcERhdGE7CisJdEVwbE9iZEVudHJ5UHRyIHBPYmRFbnRyeTsKKwl0RXBsT2JkU3ViRW50cnlQdHIgcE9iZFN1YkVudHJ5OworCisJLy8gZ2V0IHBvaW50ZXIgdG8gaW5kZXggc3RydWN0dXJlCisJUmV0ID0gRXBsT2JkR2V0SW5kZXhJbnRlcm4oJkVQTF9NQ09fR0xCX1ZBUihtX09iZEluaXRQYXJhbSksCisJCQkJICAgdWlJbmRleF9wLCAmcE9iZEVudHJ5KTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCXBEYXRhID0gTlVMTDsKKwkJZ290byBFeGl0OworCX0KKwkvLyBnZXQgcG9pbnRlciB0byBzdWJpbmRleCBzdHJ1Y3R1cmUKKwlSZXQgPSBFcGxPYmRHZXRTdWJpbmRleEludGVybihwT2JkRW50cnksIHVpU3ViSW5kZXhfcCwgJnBPYmRTdWJFbnRyeSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlwRGF0YSA9IE5VTEw7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZ2V0IERhdGFwb2ludGVyCisJcERhdGEgPSBFcGxPYmRHZXRPYmplY3REYXRhUHRySW50ZXJuKHBPYmRTdWJFbnRyeSk7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIHBEYXRhOworCit9CisKKyNpZiAoZGVmaW5lZCAoRVBMX09CRF9VU0VSX09EKSAmJiAoRVBMX09CRF9VU0VSX09EICE9IEZBTFNFKSkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkUmVnaXN0ZXJVc2VyT2QoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiByZWdpc3RlcnMgdGhlIHVzZXIgT0QKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFVzZXJPZF9wICAgPXBvaW50ZXIgdG8gdXNlciBPRGQKKy8vCisvLyBSZXR1cm46ICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmRSZWdpc3RlclVzZXJPZChFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkJICAgIHRFcGxPYmRFbnRyeVB0ciBwVXNlck9kX3ApCit7CisKKwlFUExfTUNPX0NIRUNLX0lOU1RBTkNFX1NUQVRFKCk7CisKKwlFUExfTUNPX0dMQl9WQVIobV9PYmRJbml0UGFyYW0ubV9wVXNlclBhcnQpID0gcFVzZXJPZF9wOworCisJcmV0dXJuIGtFcGxTdWNjZXNzZnVsOworCit9CisKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRJbml0VmFyRW50cnkoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiB0byBpbml0aWFsaXplIFZhckVudHJ5IGRlcGVuZGVuZWQgb24gb2JqZWN0IHR5cGUKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFZhckVudHJ5X3AgPSBwb2ludGVyIHRvIHZhciBlbnRyeSBzdHJ1Y3R1cmUKKy8vICAgICAgICAgICAgICBUeXBlX3AgICAgICA9IG9iamVjdCB0eXBlCisvLyAgICAgICAgICAgICAgT2JkU2l6ZV9wICAgPSBzaXplIG9mIG9iamVjdCBkYXRhCisvLworLy8gUmV0dXJuczogICAgIG5vbmUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFUExETExFWFBPUlQgdm9pZCBQVUJMSUMgRXBsT2JkSW5pdFZhckVudHJ5KEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCSAgICB0RXBsT2JkVmFyRW50cnkgTUVNICogcFZhckVudHJ5X3AsCisJCQkJCSAgICB0RXBsT2JkVHlwZSBUeXBlX3AsCisJCQkJCSAgICB0RXBsT2JkU2l6ZSBPYmRTaXplX3ApCit7CisvKgorICAgICNpZiAoRVBMX1BET19VU0VfU1RBVElDX01BUFBJTkcgPT0gRkFMU0UpCisgICAgeworICAgICAgICAvLyByZXNldCBwb2ludGVyIHRvIFZBUiBjYWxsYmFjayBhbmQgYXJndW1lbnQKKyAgICAgICAgcFZhckVudHJ5X3AtPm1fZnBDYWxsYmFjayAgPSBOVUxMOworICAgICAgICBwVmFyRW50cnlfcC0+bV9wQXJnID0gTlVMTDsKKyAgICB9CisgICAgI2VuZGlmCisqLworCisvLyAxMC1kZWMtMjAwNCByLmQuOiB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90IGJlIHVzZWQgZm9yIHN0cmluZ3MKKwlpZiAoKFR5cGVfcCA9PSBrRXBsT2JkVHlwRG9tYWluKSkKKy8vICAgICAgICAgKGJUeXBlX3AgPT0ga0VwbE9iZFR5cFZTdHJpbmcpIC8qIHx8CisvLyAgICAgICAgIChiVHlwZV9wID09IGtFcGxPYmRUeXBPU3RyaW5nKSB8fAorLy8gICAgICAgICAoYlR5cGVfcCA9PSBrRXBsT2JkVHlwVVN0cmluZykgICAgKi8gKQorCXsKKwkJLy8gdmFyaWFibGVzIHdoaWNoIGFyZSBkZWZpbmVkIGFzIERPTUFJTiBvciBWU1RSSU5HIHNob3VsZCBub3QgcG9pbnQgdG8KKwkJLy8gdHJhc2ggb2JqZWN0LCBiZWNhdXNlIHRoaXMgdHJhc2ggb2JqZWN0IGNvbnRhaW5zIG9ubHkgOCBieXRlcy4gRE9NQUlOUyBvcgorCQkvLyBTVFJJTkdTIGNhbiBiZSBsb25nZXIuCisJCXBWYXJFbnRyeV9wLT5tX3BEYXRhID0gTlVMTDsKKwkJcFZhckVudHJ5X3AtPm1fU2l6ZSA9IDA7CisJfSBlbHNlIHsKKwkJLy8gc2V0IGFkZHJlc3MgdG8gdmFyaWFibGUgZGF0YSB0byB0cmFzaCBvYmplY3QKKwkJLy8gVGhpcyBwcmV2ZW50cyBhbiBhY2Nlc3MgdmlvbGF0aW9uIGlmIHVzZXIgZm9yZ2V0cyB0byBjYWxsIEVwbE9iZERlZmluZVZhcigpCisJCS8vIGZvciB0aGlzIHZhcmlhYmxlIGJ1dCBtYXBwZXMgaXQgaW4gYSBQRE8uCisJCXBWYXJFbnRyeV9wLT5tX3BEYXRhID0gJmFiRXBsT2JkVHJhc2hPYmplY3RfZ1swXTsKKwkJcFZhckVudHJ5X3AtPm1fU2l6ZSA9IE9iZFNpemVfcDsKKwl9CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkR2V0RGF0YVNpemUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiB0byBpbml0aWFsaXplIFZhckVudHJ5IGRlcGVuZGVuZWQgb24gb2JqZWN0IHR5cGUKKy8vCisvLyAgICAgICAgICAgICAgZ2V0cyB0aGUgZGF0YSBzaXplIG9mIGFuIG9iamVjdAorLy8gICAgICAgICAgICAgIGZvciBzdHJpbmcgb2JqZWN0cyBpdCByZXR1cm5lcyB0aGUgc3RyaW5nIGxlbmd0aAorLy8KKy8vIFBhcmFtZXRlcnM6ICBFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXyA9IEluc3RhbmNlcG9pbnRlcgorLy8gICAgICAgICAgICAgIHVpSW5kZXhfcCAgID0gICBJbmRleAorLy8gICAgICAgICAgICAgIHVpU3ViSW5kZXhfcD0gICBTdWJpbmRleAorLy8KKy8vIFJldHVybjogICAgICB0RXBsT2JkU2l6ZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbE9iZFNpemUgUFVCTElDIEVwbE9iZEdldERhdGFTaXplKEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCQkgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbE9iZFNpemUgT2JkU2l6ZTsKKwl0RXBsT2JkRW50cnlQdHIgcE9iZEVudHJ5OworCXRFcGxPYmRTdWJFbnRyeVB0ciBwT2JkU3ViRW50cnk7CisKKwkvLyBnZXQgcG9pbnRlciB0byBpbmRleCBzdHJ1Y3R1cmUKKwlSZXQgPSBFcGxPYmRHZXRJbmRleEludGVybigmRVBMX01DT19HTEJfVkFSKG1fT2JkSW5pdFBhcmFtKSwKKwkJCQkgICB1aUluZGV4X3AsICZwT2JkRW50cnkpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJT2JkU2l6ZSA9IDA7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZ2V0IHBvaW50ZXIgdG8gc3ViaW5kZXggc3RydWN0dXJlCisJUmV0ID0gRXBsT2JkR2V0U3ViaW5kZXhJbnRlcm4ocE9iZEVudHJ5LCB1aVN1YkluZGV4X3AsICZwT2JkU3ViRW50cnkpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJT2JkU2l6ZSA9IDA7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZ2V0IHNpemUKKwlPYmRTaXplID0gRXBsT2JkR2V0RGF0YVNpemVJbnRlcm4ocE9iZFN1YkVudHJ5KTsKKyAgICAgIEV4aXQ6CisJcmV0dXJuIE9iZFNpemU7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZEdldE5vZGVJZCgpCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIHJldHVybnMgbm9kZWlkIGZyb20gZW50cnkgMHgxRjkzCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSID0gSW5zdGFuY2Vwb2ludGVyCisvLworLy8gUmV0dXJuOiAgICAgIHVuc2lnbmVkIGludCA9IE5vZGUgSWQKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHVuc2lnbmVkIGludCBQVUJMSUMgRXBsT2JkR2V0Tm9kZUlkKEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFIpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbE9iZFNpemUgT2JkU2l6ZTsKKwlCWVRFIGJOb2RlSWQ7CisKKwliTm9kZUlkID0gMDsKKwlPYmRTaXplID0gc2l6ZW9mKGJOb2RlSWQpOworCVJldCA9IEVwbE9iZFJlYWRFbnRyeShFUExfTUNPX1BUUl9JTlNUQU5DRV9QVFJfCisJCQkgICAgICBFUExfT0JEX05PREVfSURfSU5ERVgsCisJCQkgICAgICBFUExfT0JEX05PREVfSURfU1VCSU5ERVgsICZiTm9kZUlkLCAmT2JkU2l6ZSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQliTm9kZUlkID0gRVBMX0NfQURSX0lOVkFMSUQ7CisJCWdvdG8gRXhpdDsKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuICh1bnNpZ25lZCBpbnQpYk5vZGVJZDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRTZXROb2RlSWQoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBzZXRzIG5vZGVpZCBpbiBlbnRyeSAweDFGOTMKKy8vCisvLworLy8gUGFyYW1ldGVyczogIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfID0gSW5zdGFuY2Vwb2ludGVyCisvLyAgICAgICAgICAgICAgdWlOb2RlSWRfcCAgPSAgIE5vZGUgSWQgdG8gc2V0CisvLyAgICAgICAgICAgICAgTm9kZUlkVHlwZV9wPSAgIFR5cGUgb24gd2hpY2ggd2F5IHRoZSBOb2RlIElkIHdhcyBzZXQKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCA9IEVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkU2V0Tm9kZUlkKEVQTF9NQ09fREVDTF9QVFJfSU5TVEFOQ0VfUFRSXworCQkJCQkgICAgICAgdW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCSAgICAgICB0RXBsT2JkTm9kZUlkVHlwZSBOb2RlSWRUeXBlX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbE9iZFNpemUgT2JkU2l6ZTsKKwlCWVRFIGZId0Jvb2w7CisJQllURSBiTm9kZUlkOworCisJLy8gY2hlY2sgTm9kZSBJZAorCWlmICh1aU5vZGVJZF9wID09IEVQTF9DX0FEUl9JTlZBTElEKSB7CisJCVJldCA9IGtFcGxJbnZhbGlkTm9kZUlkOworCQlnb3RvIEV4aXQ7CisJfQorCWJOb2RlSWQgPSAoQllURSkgdWlOb2RlSWRfcDsKKwlPYmRTaXplID0gc2l6ZW9mKEJZVEUpOworCS8vIHdyaXRlIE5vZGVJZCB0byBPRCBlbnRyeQorCVJldCA9IEVwbE9iZFdyaXRlRW50cnkoRVBMX01DT19QVFJfSU5TVEFOQ0VfUFRSXworCQkJICAgICAgIEVQTF9PQkRfTk9ERV9JRF9JTkRFWCwKKwkJCSAgICAgICBFUExfT0JEX05PREVfSURfU1VCSU5ERVgsICZiTm9kZUlkLCBPYmRTaXplKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gc2V0IEhXQk9PTC1GbGFnIGluIFN1YmluZGV4IEVQTF9PQkRfTk9ERV9JRF9IV0JPT0xfU1VCSU5ERVgKKwlzd2l0Y2ggKE5vZGVJZFR5cGVfcCkgeworCQkvLyB0eXBlIHVua25vd24KKwljYXNlIGtFcGxPYmROb2RlSWRVbmtub3duOgorCQl7CisJCQlmSHdCb29sID0gT0JEX0ZBTFNFOworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE9iZE5vZGVJZFNvZnR3YXJlOgorCQl7CisJCQlmSHdCb29sID0gT0JEX0ZBTFNFOworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbE9iZE5vZGVJZEhhcmR3YXJlOgorCQl7CisJCQlmSHdCb29sID0gT0JEX1RSVUU7CisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJeworCQkJZkh3Qm9vbCA9IE9CRF9GQUxTRTsKKwkJfQorCisJfQkJCS8vIGVuZCBvZiBzd2l0Y2ggKE5vZGVJZFR5cGVfcCkKKworCS8vIHdyaXRlIGZsYWcKKwlPYmRTaXplID0gc2l6ZW9mKGZId0Jvb2wpOworCVJldCA9IEVwbE9iZFdyaXRlRW50cnkoRVBMX01DT19QVFJfSU5TVEFOQ0VfUFRSCisJCQkgICAgICAgRVBMX09CRF9OT0RFX0lEX0lOREVYLAorCQkJICAgICAgIEVQTF9PQkRfTk9ERV9JRF9IV0JPT0xfU1VCSU5ERVgsCisJCQkgICAgICAgJmZId0Jvb2wsIE9iZFNpemUpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRJc051bWVyaWNhbCgpCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGNoZWNrcyBpZiBhIGVudHJ5IGlzIG51bWVyaWNhbCBvciBub3QKKy8vCisvLworLy8gUGFyYW1ldGVyczogIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfID0gSW5zdGFuY2Vwb2ludGVyCisvLyAgICAgICAgICAgICAgdWlJbmRleF9wICAgICAgICAgICA9IEluZGV4CisvLyAgICAgICAgICAgICAgdWlTdWJJbmRleF9wICAgICAgICA9IFN1YmluZGV4CisvLyAgICAgICAgICAgICAgcGZFbnRyeU51bWVyaWNhbF9wICA9IHBvaW50ZXIgdG8gQk9PTCBmb3IgcmV0dXJudmFsdWUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IFRSVUUgaWYgZW50cnkgYSBudW1lcmljYWwgdmFsdWUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IEZBTFNFIGlmIGVudHJ5IG5vdCBhIG51bWVyaWNhbCB2YWx1ZQorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsID0gRXJyb3Jjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmRJc051bWVyaWNhbChFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkJIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCwKKwkJCQkJCSBCT09MICogcGZFbnRyeU51bWVyaWNhbF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxPYmRFbnRyeVB0ciBwT2JkRW50cnk7CisJdEVwbE9iZFN1YkVudHJ5UHRyIHBPYmRTdWJFbnRyeTsKKworCS8vIGdldCBwb2ludGVyIHRvIGluZGV4IHN0cnVjdHVyZQorCVJldCA9IEVwbE9iZEdldEluZGV4SW50ZXJuKCZFUExfTUNPX0dMQl9WQVIobV9PYmRJbml0UGFyYW0pLAorCQkJCSAgIHVpSW5kZXhfcCwgJnBPYmRFbnRyeSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGdldCBwb2ludGVyIHRvIHN1YmluZGV4IHN0cnVjdHVyZQorCVJldCA9IEVwbE9iZEdldFN1YmluZGV4SW50ZXJuKHBPYmRFbnRyeSwgdWlTdWJJbmRleF9wLCAmcE9iZFN1YkVudHJ5KTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlSZXQgPSBFcGxPYmRJc051bWVyaWNhbEludGVybihwT2JkU3ViRW50cnksIHBmRW50cnlOdW1lcmljYWxfcCk7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRSZWFkRW50cnlUb0xlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogVGhlIGZ1bmN0aW9uIHJlYWRzIGFuIG9iamVjdCBlbnRyeSBmcm9tIHRoZSBieXRlb2RlcgorLy8gICAgICAgICAgICAgIG9mIHRoZSBzeXN0ZW0gdG8gdGhlIGxpdHRsZSBlbmRpYW4gYnl0ZW9yZGVyIGZvciBudW1lcmljYWwgdmFsdWVzLgorLy8gICAgICAgICAgICAgIEZvciBvdGhlciB0eXBlcyBhIG5vcm1hbCByZWFkIHdpbGwgYmUgcHJvY2Vzc2VkLiBUaGlzIGlzIHVzZWZ1bGwgZm9yCisvLyAgICAgICAgICAgICAgdGhlIFBETyBhbmQgU0RPIG1vZHVsZS4gVGhlIGFwcGxpY2F0aW9uCisvLyAgICAgICAgICAgICAgY2FuIGFsd2F5cyByZWFkIHRoZSBkYXRhIGV2ZW4gaWYgYXR0cmliIGtFcGxPYmRBY2NSZWFkCisvLyAgICAgICAgICAgICAgaXMgbm90IHNldC4gVGhlIGF0dHJpYiBpcyBvbmx5IGNoZWNrZWQgdXAgZm9yIFNETyB0cmFuc2Zlci4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKy8vICAgICAgICAgICAgICB1aUluZGV4X3AgICAgICAgPSBJbmRleCBvZiB0aGUgT0QgZW50cnkgdG8gcmVhZAorLy8gICAgICAgICAgICAgIHVpU3ViSW5kZXhfcCAgICA9IFN1YmluZGV4IHRvIHJlYWQKKy8vICAgICAgICAgICAgICBwRHN0RGF0YV9wICAgICAgPSBwb2ludGVyIHRvIHRoZSBidWZmZXIgZm9yIGRhdGEKKy8vICAgICAgICAgICAgICBPZmZzZXRfcCAgICAgICAgPSBvZmZzZXQgaW4gZGF0YSBmb3IgcmVhZCBhY2Nlc3MKKy8vICAgICAgICAgICAgICBwU2l6ZV9wICAgICAgICAgPSBJTjogU2l6ZSBvZiB0aGUgYnVmZmVyCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOiBudW1iZXIgb2YgcmVhZGVkIEJ5dGVzCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZFJlYWRFbnRyeVRvTGUoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSAgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkJICAgdm9pZCAqcERzdERhdGFfcCwKKwkJCQkJCSAgIHRFcGxPYmRTaXplICogcFNpemVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsT2JkRW50cnlQdHIgcE9iZEVudHJ5OworCXRFcGxPYmRTdWJFbnRyeVB0ciBwU3ViRW50cnk7CisJdEVwbE9iZENiUGFyYW0gTUVNIENiUGFyYW07CisJdm9pZCAqcFNyY0RhdGE7CisJdEVwbE9iZFNpemUgT2JkU2l6ZTsKKworCS8vIGNoZWNrIGZvciBhbGwgQVBJIGZ1bmN0aW9uIGlmIGluc3RhbmNlIGlzIHZhbGlkCisJRVBMX01DT19DSEVDS19JTlNUQU5DRV9TVEFURSgpOworCisJQVNTRVJUKHBEc3REYXRhX3AgIT0gTlVMTCk7CisJQVNTRVJUKHBTaXplX3AgIT0gTlVMTCk7CisKKwkvLyBnZXQgYWRkcmVzcyBvZiBpbmRleCBhbmQgc3ViaW5kZXggZW50cnkKKwlSZXQgPSBFcGxPYmRHZXRFbnRyeShFUExfTUNPX0lOU1RBTkNFX1BUUl8KKwkJCSAgICAgdWlJbmRleF9wLCB1aVN1YkluZGV4X3AsICZwT2JkRW50cnksICZwU3ViRW50cnkpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyBnZXQgcG9pbnRlciB0byBvYmplY3QgZGF0YQorCXBTcmNEYXRhID0gRXBsT2JkR2V0T2JqZWN0RGF0YVB0ckludGVybihwU3ViRW50cnkpOworCisJLy8gY2hlY2sgc291cmNlIHBvaW50ZXIKKwlpZiAocFNyY0RhdGEgPT0gTlVMTCkgeworCQlSZXQgPSBrRXBsT2JkUmVhZFZpb2xhdGlvbjsKKwkJZ290byBFeGl0OworCX0KKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIGFkZHJlc3Mgb2Ygc291cmNlIGRhdGEgdG8gc3RydWN0dXJlIG9mIGNhbGxiYWNrIHBhcmFtZXRlcnMKKwkvLyBzbyBjYWxsYmFjayBmdW5jdGlvbiBjYW4gY2hhbmdlIHRoaXMgZGF0YSBiZWZvcmUgcmVhZGluZworCUNiUGFyYW0ubV91aUluZGV4ID0gdWlJbmRleF9wOworCUNiUGFyYW0ubV91aVN1YkluZGV4ID0gdWlTdWJJbmRleF9wOworCUNiUGFyYW0ubV9wQXJnID0gcFNyY0RhdGE7CisJQ2JQYXJhbS5tX09iZEV2ZW50ID0ga0VwbE9iZEV2UHJlUmVhZDsKKwlSZXQgPSBFcGxPYmRDYWxsT2JqZWN0Q2FsbGJhY2soRVBMX01DT19JTlNUQU5DRV9QVFJfCisJCQkJICAgICAgIHBPYmRFbnRyeS0+bV9mcENhbGxiYWNrLCAmQ2JQYXJhbSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGdldCBzaXplIG9mIGRhdGEgYW5kIGNoZWNrIGlmIGFwcGxpY2F0aW9uIGhhcyByZXNlcnZlZCBlbm91Z2ggbWVtb3J5CisJT2JkU2l6ZSA9IEVwbE9iZEdldERhdGFTaXplSW50ZXJuKHBTdWJFbnRyeSk7CisJLy8gY2hlY2sgaWYgb2Zmc2V0IGdpdmVuIGFuZCBjYWxjIGNvcnJlY3QgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKwlpZiAoKnBTaXplX3AgPCBPYmRTaXplKSB7CisJCVJldCA9IGtFcGxPYmRWYWx1ZUxlbmd0aEVycm9yOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGNoZWNrIGlmIG51bWVyaWNhbCB0eXBlCisJc3dpdGNoIChwU3ViRW50cnktPm1fVHlwZSkgeworCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vIHR5cGVzIHdpdGhvdXQgYW1pCisJY2FzZSBrRXBsT2JkVHlwVlN0cmluZzoKKwljYXNlIGtFcGxPYmRUeXBPU3RyaW5nOgorCWNhc2Uga0VwbE9iZFR5cERvbWFpbjoKKwlkZWZhdWx0OgorCQl7CisJCQkvLyByZWFkIHZhbHVlIGZyb20gb2JqZWN0CisJCQlFUExfTUVNQ1BZKHBEc3REYXRhX3AsIHBTcmNEYXRhLCBPYmRTaXplKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyBudW1lcmljYWwgdHlwZSB3aGljaCBuZWVkcyBhbWktd3JpdGUKKwkJLy8gOCBiaXQgb3Igc21hbGxlciB2YWx1ZXMKKwljYXNlIGtFcGxPYmRUeXBCb29sOgorCWNhc2Uga0VwbE9iZFR5cEludDg6CisJY2FzZSBrRXBsT2JkVHlwVUludDg6CisJCXsKKwkJCUFtaVNldEJ5dGVUb0xlKHBEc3REYXRhX3AsICooKEJZVEUgKikgcFNyY0RhdGEpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gMTYgYml0IHZhbHVlcworCWNhc2Uga0VwbE9iZFR5cEludDE2OgorCWNhc2Uga0VwbE9iZFR5cFVJbnQxNjoKKwkJeworCQkJQW1pU2V0V29yZFRvTGUocERzdERhdGFfcCwgKigoV09SRCAqKSBwU3JjRGF0YSkpOworCQkJYnJlYWs7CisJCX0KKworCQkvLyAyNCBiaXQgdmFsdWVzCisJY2FzZSBrRXBsT2JkVHlwSW50MjQ6CisJY2FzZSBrRXBsT2JkVHlwVUludDI0OgorCQl7CisJCQlBbWlTZXREd29yZDI0VG9MZShwRHN0RGF0YV9wLCAqKChEV09SRCAqKSBwU3JjRGF0YSkpOworCQkJYnJlYWs7CisJCX0KKworCQkvLyAzMiBiaXQgdmFsdWVzCisJY2FzZSBrRXBsT2JkVHlwSW50MzI6CisJY2FzZSBrRXBsT2JkVHlwVUludDMyOgorCWNhc2Uga0VwbE9iZFR5cFJlYWwzMjoKKwkJeworCQkJQW1pU2V0RHdvcmRUb0xlKHBEc3REYXRhX3AsICooKERXT1JEICopIHBTcmNEYXRhKSk7CisJCQlicmVhazsKKwkJfQorCisJCS8vIDQwIGJpdCB2YWx1ZXMKKwljYXNlIGtFcGxPYmRUeXBJbnQ0MDoKKwljYXNlIGtFcGxPYmRUeXBVSW50NDA6CisJCXsKKwkJCUFtaVNldFF3b3JkNDBUb0xlKHBEc3REYXRhX3AsICooKFFXT1JEICopIHBTcmNEYXRhKSk7CisJCQlicmVhazsKKwkJfQorCisJCS8vIDQ4IGJpdCB2YWx1ZXMKKwljYXNlIGtFcGxPYmRUeXBJbnQ0ODoKKwljYXNlIGtFcGxPYmRUeXBVSW50NDg6CisJCXsKKwkJCUFtaVNldFF3b3JkNDhUb0xlKHBEc3REYXRhX3AsICooKFFXT1JEICopIHBTcmNEYXRhKSk7CisJCQlicmVhazsKKwkJfQorCisJCS8vIDU2IGJpdCB2YWx1ZXMKKwljYXNlIGtFcGxPYmRUeXBJbnQ1NjoKKwljYXNlIGtFcGxPYmRUeXBVSW50NTY6CisJCXsKKwkJCUFtaVNldFF3b3JkNTZUb0xlKHBEc3REYXRhX3AsICooKFFXT1JEICopIHBTcmNEYXRhKSk7CisJCQlicmVhazsKKwkJfQorCisJCS8vIDY0IGJpdCB2YWx1ZXMKKwljYXNlIGtFcGxPYmRUeXBJbnQ2NDoKKwljYXNlIGtFcGxPYmRUeXBVSW50NjQ6CisJY2FzZSBrRXBsT2JkVHlwUmVhbDY0OgorCQl7CisJCQlBbWlTZXRRd29yZDY0VG9MZShwRHN0RGF0YV9wLCAqKChRV09SRCAqKSBwU3JjRGF0YSkpOworCQkJYnJlYWs7CisJCX0KKworCQkvLyB0aW1lIG9mIGRheQorCWNhc2Uga0VwbE9iZFR5cFRpbWVPZkRheToKKwljYXNlIGtFcGxPYmRUeXBUaW1lRGlmZjoKKwkJeworCQkJQW1pU2V0VGltZU9mRGF5KHBEc3REYXRhX3AsICgodFRpbWVPZkRheSAqKSBwU3JjRGF0YSkpOworCQkJYnJlYWs7CisJCX0KKworCX0JCQkvLyBlbmQgb2Ygc3dpdGNoKHBTdWJFbnRyeS0+bV9UeXBlKQorCisJKnBTaXplX3AgPSBPYmRTaXplOworCisJLy8gd3JpdGUgYWRkcmVzcyBvZiBkZXN0aW5hdGlvbiBkYXRhIHRvIHN0cnVjdHVyZSBvZiBjYWxsYmFjayBwYXJhbWV0ZXJzCisJLy8gc28gY2FsbGJhY2sgZnVuY3Rpb24gY2FuIGNoYW5nZSB0aGlzIGRhdGEgYWZ0ZXIgcmVhZGluZworCUNiUGFyYW0ubV9wQXJnID0gcERzdERhdGFfcDsKKwlDYlBhcmFtLm1fT2JkRXZlbnQgPSBrRXBsT2JkRXZQb3N0UmVhZDsKKwlSZXQgPSBFcGxPYmRDYWxsT2JqZWN0Q2FsbGJhY2soRVBMX01DT19JTlNUQU5DRV9QVFJfCisJCQkJICAgICAgIHBPYmRFbnRyeS0+bV9mcENhbGxiYWNrLCAmQ2JQYXJhbSk7CisKKyAgICAgIEV4aXQ6CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZFdyaXRlRW50cnlGcm9tTGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiB3cml0ZXMgZGF0YSB0byBhbiBPQkQgZW50cnkgZnJvbSBhIHNvdXJjZSB3aXRoCisvLyAgICAgICAgICAgICAgbGl0dGxlIGVuZGlhbiBieXRlb3JkZXIgdG8gdGhlIG9kIHdpdGggc3lzdGVtIHNwZWN1aWZpYworLy8gICAgICAgICAgICAgIGJ5dGVvcmRlci4gTm90IG51bWVyaWNhbCB2YWx1ZXMgd2lsbCBvbmx5IGJ5IGNvcGllZC4gU3RyaW5ncworLy8gICAgICAgICAgICAgIGFyZSBzdG9yZWQgd2l0aCBhZGRlZCAnXDAnIGNoYXJhY3Rlci4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKy8vICAgICAgICAgICAgICB1aUluZGV4X3AgICAgICAgPSAgIEluZGV4IG9mIHRoZSBPRCBlbnRyeQorLy8gICAgICAgICAgICAgIHVpU3ViSW5kZXhfcCAgICA9ICAgU3ViaW5kZXggb2YgdGhlIE9EIEVudHJ5CisvLyAgICAgICAgICAgICAgcFNyY0RhdGFfcCAgICAgID0gICBQb2ludGVyIHRvIHRoZSBkYXRhIHRvIHdyaXRlCisvLyAgICAgICAgICAgICAgU2l6ZV9wICAgICAgICAgID0gICBTaXplIG9mIHRoZSBkYXRhIGluIEJ5dGUKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgICAgID0gICBFcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmRXcml0ZUVudHJ5RnJvbUxlKEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJICAgICAgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCwKKwkJCQkJCSAgICAgIHZvaWQgKnBTcmNEYXRhX3AsCisJCQkJCQkgICAgICB0RXBsT2JkU2l6ZSBTaXplX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbE9iZEVudHJ5UHRyIHBPYmRFbnRyeTsKKwl0RXBsT2JkU3ViRW50cnlQdHIgcFN1YkVudHJ5OworCXRFcGxPYmRDYlBhcmFtIE1FTSBDYlBhcmFtOworCXZvaWQgTUVNICpwRHN0RGF0YTsKKwl0RXBsT2JkU2l6ZSBPYmRTaXplOworCVFXT1JEIHF3QnVmZmVyOworCXZvaWQgKnBCdWZmZXIgPSAmcXdCdWZmZXI7CisKKwlSZXQgPSBFcGxPYmRXcml0ZUVudHJ5UHJlKEVQTF9NQ09fSU5TVEFOQ0VfUFRSXworCQkJCSAgdWlJbmRleF9wLAorCQkJCSAgdWlTdWJJbmRleF9wLAorCQkJCSAgcFNyY0RhdGFfcCwKKwkJCQkgICZwRHN0RGF0YSwKKwkJCQkgIFNpemVfcCwKKwkJCQkgICZwT2JkRW50cnksICZwU3ViRW50cnksICZDYlBhcmFtLCAmT2JkU2l6ZSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisJLy8gY2hlY2sgaWYgbnVtZXJpY2FsIHR5cGUKKwlzd2l0Y2ggKHBTdWJFbnRyeS0+bV9UeXBlKSB7CisJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJLy8gdHlwZXMgd2l0aG91dCBhbWkKKwlkZWZhdWx0OgorCQl7CQkvLyBkbyBub3RoaW5nLCBpLmUuIHVzZSB0aGUgZ2l2ZW4gc291cmNlIHBvaW50ZXIKKwkJCXBCdWZmZXIgPSBwU3JjRGF0YV9wOworCQkJYnJlYWs7CisJCX0KKworCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vIG51bWVyaWNhbCB0eXBlIHdoaWNoIG5lZWRzIGFtaS13cml0ZQorCQkvLyA4IGJpdCBvciBzbWFsbGVyIHZhbHVlcworCWNhc2Uga0VwbE9iZFR5cEJvb2w6CisJY2FzZSBrRXBsT2JkVHlwSW50ODoKKwljYXNlIGtFcGxPYmRUeXBVSW50ODoKKwkJeworCQkJKigoQllURSAqKSBwQnVmZmVyKSA9IEFtaUdldEJ5dGVGcm9tTGUocFNyY0RhdGFfcCk7CisJCQlicmVhazsKKwkJfQorCisJCS8vIDE2IGJpdCB2YWx1ZXMKKwljYXNlIGtFcGxPYmRUeXBJbnQxNjoKKwljYXNlIGtFcGxPYmRUeXBVSW50MTY6CisJCXsKKwkJCSooKFdPUkQgKikgcEJ1ZmZlcikgPSBBbWlHZXRXb3JkRnJvbUxlKHBTcmNEYXRhX3ApOworCQkJYnJlYWs7CisJCX0KKworCQkvLyAyNCBiaXQgdmFsdWVzCisJY2FzZSBrRXBsT2JkVHlwSW50MjQ6CisJY2FzZSBrRXBsT2JkVHlwVUludDI0OgorCQl7CisJCQkqKChEV09SRCAqKSBwQnVmZmVyKSA9IEFtaUdldER3b3JkMjRGcm9tTGUocFNyY0RhdGFfcCk7CisJCQlicmVhazsKKwkJfQorCisJCS8vIDMyIGJpdCB2YWx1ZXMKKwljYXNlIGtFcGxPYmRUeXBJbnQzMjoKKwljYXNlIGtFcGxPYmRUeXBVSW50MzI6CisJY2FzZSBrRXBsT2JkVHlwUmVhbDMyOgorCQl7CisJCQkqKChEV09SRCAqKSBwQnVmZmVyKSA9IEFtaUdldER3b3JkRnJvbUxlKHBTcmNEYXRhX3ApOworCQkJYnJlYWs7CisJCX0KKworCQkvLyA0MCBiaXQgdmFsdWVzCisJY2FzZSBrRXBsT2JkVHlwSW50NDA6CisJY2FzZSBrRXBsT2JkVHlwVUludDQwOgorCQl7CisJCQkqKChRV09SRCAqKSBwQnVmZmVyKSA9IEFtaUdldFF3b3JkNDBGcm9tTGUocFNyY0RhdGFfcCk7CisJCQlicmVhazsKKwkJfQorCisJCS8vIDQ4IGJpdCB2YWx1ZXMKKwljYXNlIGtFcGxPYmRUeXBJbnQ0ODoKKwljYXNlIGtFcGxPYmRUeXBVSW50NDg6CisJCXsKKwkJCSooKFFXT1JEICopIHBCdWZmZXIpID0gQW1pR2V0UXdvcmQ0OEZyb21MZShwU3JjRGF0YV9wKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gNTYgYml0IHZhbHVlcworCWNhc2Uga0VwbE9iZFR5cEludDU2OgorCWNhc2Uga0VwbE9iZFR5cFVJbnQ1NjoKKwkJeworCQkJKigoUVdPUkQgKikgcEJ1ZmZlcikgPSBBbWlHZXRRd29yZDU2RnJvbUxlKHBTcmNEYXRhX3ApOworCQkJYnJlYWs7CisJCX0KKworCQkvLyA2NCBiaXQgdmFsdWVzCisJY2FzZSBrRXBsT2JkVHlwSW50NjQ6CisJY2FzZSBrRXBsT2JkVHlwVUludDY0OgorCWNhc2Uga0VwbE9iZFR5cFJlYWw2NDoKKwkJeworCQkJKigoUVdPUkQgKikgcEJ1ZmZlcikgPSBBbWlHZXRRd29yZDY0RnJvbUxlKHBTcmNEYXRhX3ApOworCQkJYnJlYWs7CisJCX0KKworCQkvLyB0aW1lIG9mIGRheQorCWNhc2Uga0VwbE9iZFR5cFRpbWVPZkRheToKKwljYXNlIGtFcGxPYmRUeXBUaW1lRGlmZjoKKwkJeworCQkJQW1pR2V0VGltZU9mRGF5KHBCdWZmZXIsICgodFRpbWVPZkRheSAqKSBwU3JjRGF0YV9wKSk7CisJCQlicmVhazsKKwkJfQorCisJfQkJCS8vIGVuZCBvZiBzd2l0Y2gocFN1YkVudHJ5LT5tX1R5cGUpCisKKwlSZXQgPSBFcGxPYmRXcml0ZUVudHJ5UG9zdChFUExfTUNPX0lOU1RBTkNFX1BUUl8KKwkJCQkgICBwT2JkRW50cnksCisJCQkJICAgcFN1YkVudHJ5LAorCQkJCSAgICZDYlBhcmFtLCBwQnVmZmVyLCBwRHN0RGF0YSwgT2JkU2l6ZSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisgICAgICBFeGl0OgorCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRHZXRBY2Nlc3NUeXBlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogRnVuY3Rpb24gcmV0dXJucyBhY2Nlc3N0eXBlIG9mIHRoZSBlbnRyeQorLy8KKy8vIFBhcmFtZXRlcnM6ICBFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworLy8gICAgICAgICAgICAgIHVpSW5kZXhfcCAgICAgICA9ICAgSW5kZXggb2YgdGhlIE9EIGVudHJ5CisvLyAgICAgICAgICAgICAgdWlTdWJJbmRleF9wICAgID0gICBTdWJpbmRleCBvZiB0aGUgT0QgRW50cnkKKy8vICAgICAgICAgICAgICBwQWNjZXNzVHlwX3AgICAgPSAgIHBvaW50ZXIgdG8gYnVmZmVyIHRvIHN0b3JlIGFjY2Vzc3R5cGUKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgICAgPSAgIGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZEdldEFjY2Vzc1R5cGUoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSAgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkJICAgdEVwbE9iZEFjY2VzcyAqIHBBY2Nlc3NUeXBfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsT2JkRW50cnlQdHIgcE9iZEVudHJ5OworCXRFcGxPYmRTdWJFbnRyeVB0ciBwT2JkU3ViRW50cnk7CisKKwkvLyBnZXQgcG9pbnRlciB0byBpbmRleCBzdHJ1Y3R1cmUKKwlSZXQgPSBFcGxPYmRHZXRJbmRleEludGVybigmRVBMX01DT19HTEJfVkFSKG1fT2JkSW5pdFBhcmFtKSwKKwkJCQkgICB1aUluZGV4X3AsICZwT2JkRW50cnkpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLyBnZXQgcG9pbnRlciB0byBzdWJpbmRleCBzdHJ1Y3R1cmUKKwlSZXQgPSBFcGxPYmRHZXRTdWJpbmRleEludGVybihwT2JkRW50cnksIHVpU3ViSW5kZXhfcCwgJnBPYmRTdWJFbnRyeSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGdldCBhY2Nlc3NUeXBlCisJKnBBY2Nlc3NUeXBfcCA9IHBPYmRTdWJFbnRyeS0+bV9BY2Nlc3M7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkU2VhcmNoVmFyRW50cnkoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBnZXRzIHZhcmlhYmxlIGZyb20gT0QKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlJbmRleF9wICAgICAgID0gICBpbmRleCBvZiB0aGUgdmFyIGVudHJ5IHRvIHNlYXJjaAorLy8gICAgICAgICAgICAgIHVpU3ViaW5kZXhfcCAgICA9ICAgc3ViaW5kZXggb2YgdmFyIGVudHJ5IHRvIHNlYXJjaAorLy8gICAgICAgICAgICAgIHBwVmFyRW50cnlfcCAgICA9ICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgdmFyZW50cnkKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbE9iZFNlYXJjaFZhckVudHJ5KEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJICAgICAgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCB1aVN1YmluZGV4X3AsCisJCQkJICAgICAgIHRFcGxPYmRWYXJFbnRyeSBNRU0gKiogcHBWYXJFbnRyeV9wKQoreworCisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJpbmRleEVudHJ5OworCisJLy8gY2hlY2sgZm9yIGFsbCBBUEkgZnVuY3Rpb24gaWYgaW5zdGFuY2UgaXMgdmFsaWQKKwlFUExfTUNPX0NIRUNLX0lOU1RBTkNFX1NUQVRFKCk7CisKKwkvLyBnZXQgYWRkcmVzcyBvZiBzdWJpbmRleCBlbnRyeQorCVJldCA9IEVwbE9iZEdldEVudHJ5KEVQTF9NQ09fSU5TVEFOQ0VfUFRSXworCQkJICAgICB1aUluZGV4X3AsIHVpU3ViaW5kZXhfcCwgTlVMTCwgJnBTdWJpbmRleEVudHJ5KTsKKwlpZiAoUmV0ID09IGtFcGxTdWNjZXNzZnVsKSB7CisJCS8vIGdldCB2YXIgZW50cnkKKwkJUmV0ID0gRXBsT2JkR2V0VmFyRW50cnkocFN1YmluZGV4RW50cnksIHBwVmFyRW50cnlfcCk7CisJfQorCisJcmV0dXJuIFJldDsKKworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworRVBMX01DT19ERUNMX0lOU1RBTkNFX0ZDVCgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRDYWxsT2JqZWN0Q2FsbGJhY2soKQorLy8KKy8vIERlc2NyaXB0aW9uOiBjYWxscyBjYWxsYmFjayBmdW5jdGlvbiBvZiBhbiBvYmplY3Qgb3Igb2YgYSB2YXJpYWJsZQorLy8KKy8vIFBhcmFtZXRlcnM6ICBmcENhbGxiYWNrX3AKKy8vICAgICAgICAgICAgICBwQ2JQYXJhbV9wCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHRFcGxLZXJuZWwgRXBsT2JkQ2FsbE9iamVjdENhbGxiYWNrKEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCSAgIHRFcGxPYmRDYWxsYmFjayBmcENhbGxiYWNrX3AsCisJCQkJCSAgIHRFcGxPYmRDYlBhcmFtIE1FTSAqIHBDYlBhcmFtX3ApCit7CisKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsT2JkQ2FsbGJhY2sgTUVNIGZwQ2FsbGJhY2s7CisKKwkvLyBjaGVjayBmb3IgYWxsIEFQSSBmdW5jdGlvbiBpZiBpbnN0YW5jZSBpcyB2YWxpZAorCUVQTF9NQ09fQ0hFQ0tfSU5TVEFOQ0VfU1RBVEUoKTsKKworCUFTU0VSVChwQ2JQYXJhbV9wICE9IE5VTEwpOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBjaGVjayBhZGRyZXNzIG9mIGNhbGxiYWNrIGZ1bmN0aW9uIGJlZm9yZSBjYWxsaW5nIGl0CisJaWYgKGZwQ2FsbGJhY2tfcCAhPSBOVUxMKSB7CisJCS8vIEtFSUwgQzUxIFY2LjAxIGhhcyBhIGJ1Zy4KKwkJLy8gVGhlcmVmb3JlIHRoZSBwYXJhbWV0ZXIgZnBDYWxsYmFja19wIGhhcyB0byBiZSBjb3BpZWQgaW4gbG9jYWwgdmFyaWFibGUgZnBDYWxsYmFjay4KKwkJZnBDYWxsYmFjayA9IGZwQ2FsbGJhY2tfcDsKKworCQkvLyBjYWxsIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB0aGlzIG9iamVjdAorCQlSZXQgPSBmcENhbGxiYWNrKEVQTF9NQ09fSU5TVEFOQ0VfUEFSQU1fSURYXygpCisJCQkJIHBDYlBhcmFtX3ApOworCX0KKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZEdldERhdGFTaXplSW50ZXJuKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZ2V0cyB0aGUgZGF0YSBzaXplIG9mIGFuIG9iamVjdAorLy8gICAgICAgICAgICAgIGZvciBzdHJpbmcgb2JqZWN0cyBpdCByZXR1cm5lcyB0aGUgc3RyaW5nIGxlbmd0aAorLy8KKy8vIFBhcmFtZXRlcnM6ICBwU3ViSW5kZXhFbnRyeV9wCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxPYmRTaXplCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxPYmRTaXplIEVwbE9iZEdldERhdGFTaXplSW50ZXJuKHRFcGxPYmRTdWJFbnRyeVB0ciBwU3ViSW5kZXhFbnRyeV9wKQoreworCisJdEVwbE9iZFNpemUgRGF0YVNpemU7CisJdm9pZCBNRU0gKnBEYXRhOworCisJLy8gSWYgT0QgZW50cnkgaXMgZGVmaW5lZCBieSBtYWNybyBFUExfT0JEX1NVQklOREVYX1JPTV9WU1RSSU5HCisJLy8gdGhlbiB0aGUgY3VycmVudCBwb2ludGVyIGlzIGFsd2F5cyBOVUxMLiBUaGUgZnVuY3Rpb24KKwkvLyByZXR1cm5zIHRoZSBsZW5ndGggb2YgZGVmYXVsdCBzdHJpbmcuCisJRGF0YVNpemUgPSBFcGxPYmRHZXRPYmplY3RTaXplKHBTdWJJbmRleEVudHJ5X3ApOworCisJaWYgKHBTdWJJbmRleEVudHJ5X3AtPm1fVHlwZSA9PSBrRXBsT2JkVHlwVlN0cmluZykgeworCQkvLyBUaGUgcG9pbnRlciB0byBjdXJyZW50IHZhbHVlIGNhbiBiZSByZWNlaXZlZCBmcm9tIEVwbE9iZEdldE9iamVjdEN1cnJlbnRQdHIoKQorCQlwRGF0YSA9CisJCSAgICAoKHZvaWQgTUVNICopRXBsT2JkR2V0T2JqZWN0Q3VycmVudFB0cihwU3ViSW5kZXhFbnRyeV9wKSk7CisJCWlmIChwRGF0YSAhPSBOVUxMKSB7CisJCQlEYXRhU2l6ZSA9CisJCQkgICAgRXBsT2JkR2V0U3RyTGVuKCh2b2lkICopcERhdGEsIERhdGFTaXplLAorCQkJCQkgICAgcFN1YkluZGV4RW50cnlfcC0+bV9UeXBlKTsKKwkJfQorCisJfQorCisJcmV0dXJuIERhdGFTaXplOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZEdldFN0ckxlbigpCisvLworLy8gRGVzY3JpcHRpb246IFRoZSBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBsZW5ndGggb2Ygc3RyaW5nLiBUaGUgJ1wwJworLy8gICAgICAgICAgICAgIGNoYXJhY3RlciBpcyBpbmNsdWRlZCEhCisvLworLy8gUGFyYW1ldGVyczogIHBPYmpEYXRhX3AgICAgICAgICAgPSBwb2ludGVyIHRvIHN0cmluZworLy8gICAgICAgICAgICAgIE9iakxlbl9wICAgICAgICAgICAgPSBtYXguIGxlbmd0aCBvZiBvYmplY3RyIGVudHJ5CisvLyAgICAgICAgICAgICAgYk9ialR5cGVfcCAgICAgICAgICA9IG9iamVjdCB0eXBlIChWU1RSSU5HLCAuLi4pCisvLworLy8gUmV0dXJuczogICAgIHN0cmluZyBsZW5ndGggKyAxCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxPYmRTaXplIEVwbE9iZEdldFN0ckxlbih2b2lkICpwT2JqRGF0YV9wLAorCQkJCSAgIHRFcGxPYmRTaXplIE9iakxlbl9wLCB0RXBsT2JkVHlwZSBPYmpUeXBlX3ApCit7CisKKwl0RXBsT2JkU2l6ZSBTdHJMZW4gPSAwOworCUJZVEUgKnBiU3RyaW5nOworCisJaWYgKHBPYmpEYXRhX3AgPT0gTlVMTCkgeworCQlnb3RvIEV4aXQ7CisJfQorCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIFZpc2libGUgU3RyaW5nOiBkYXRhIGZvcm1hdCBieXRlCisJaWYgKE9ialR5cGVfcCA9PSBrRXBsT2JkVHlwVlN0cmluZykgeworCQlwYlN0cmluZyA9IHBPYmpEYXRhX3A7CisKKwkJZm9yIChTdHJMZW4gPSAwOyBTdHJMZW4gPCBPYmpMZW5fcDsgU3RyTGVuKyspIHsKKwkJCWlmICgqcGJTdHJpbmcgPT0gJ1wwJykgeworCQkJCVN0ckxlbisrOworCQkJCWJyZWFrOworCQkJfQorCisJCQlwYlN0cmluZysrOworCQl9CisJfQorCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIG90aGVyIHN0cmluZyB0eXBlcyAuLi4KKworICAgICAgRXhpdDoKKwlyZXR1cm4gKFN0ckxlbik7CisKK30KKworI2lmIChFUExfT0JEX0NIRUNLX09CSkVDVF9SQU5HRSAhPSBGQUxTRSkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkQ2hlY2tPYmplY3RSYW5nZSgpCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIHRvIGNoZWNrIHZhbHVlIHJhbmdlIG9mIG9iamVjdCBkYXRhCisvLworLy8gTk9USUNFOiBUaGUgcG9pbnRlciBvZiBkYXRhIChwRGF0YV9wKSBtdXN0IHBvaW50IG91dCB0byBhbiBldmVuIGFkZHJlc3MsCisvLyAgICAgICAgIGlmIE9ialR5cGUgaXMgdW5lcXVhbCB0byBrRXBsT2JkVHlwSW50OCBvciBrRXBsT2JkVHlwVUludDghIEJ1dCBpdCBpcworLy8gICAgICAgICBhbHdheXMgcmVhbGljZWQgYmVjYXVzZSBwb2ludGVyIG1fcERlZmF1bHQgcG9pbnRzIGFsd2F5cyB0byBhbgorLy8gICAgICAgICBhcnJheSBvZiB0aGUgU1BFQ0lGSUVEIHR5cGUuCisvLworLy8gUGFyYW1ldGVyczogIHBTdWJpbmRleEVudHJ5X3AKKy8vICAgICAgICAgICAgICBwRGF0YV9wCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxPYmRDaGVja09iamVjdFJhbmdlKHRFcGxPYmRTdWJFbnRyeVB0ciBwU3ViaW5kZXhFbnRyeV9wLAorCQkJCQkgdm9pZCAqcERhdGFfcCkKK3sKKworCXRFcGxLZXJuZWwgUmV0OworCXZvaWQgKnBSYW5nZURhdGE7CisKKwlBU1NFUlRNU0cocFN1YmluZGV4RW50cnlfcCAhPSBOVUxMLAorCQkgICJFcGxPYmRDaGVja09iamVjdFJhbmdlKCk6IG5vIGFkZHJlc3MgdG8gc3ViaW5kZXggc3RydWN0IVxuIik7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGNoZWNrIGlmIGRhdGEgcmFuZ2UgaGFzIHRvIGJlIGNoZWNrZWQKKwlpZiAoKHBTdWJpbmRleEVudHJ5X3AtPm1fQWNjZXNzICYga0VwbE9iZEFjY1JhbmdlKSA9PSAwKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZ2V0IGFkZHJlc3Mgb2YgZGVmYXVsdCBkYXRhCisJcFJhbmdlRGF0YSA9IHBTdWJpbmRleEVudHJ5X3AtPm1fcERlZmF1bHQ7CisKKwkvLyBqdW1wIHRvIGNhbGxlZCBvYmplY3QgdHlwZQorCXN3aXRjaCAoKHRFcGxPYmRUeXBlKSBwU3ViaW5kZXhFbnRyeV9wLT5tX1R5cGUpIHsKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJLy8gT2JkVHlwZSBrRXBsT2JkVHlwQm9vbCB3aWxsIG5vdCBiZSBjaGVja2VkIGJlY2F1c2UgdGhlcmUgYXJlIG9ubHkKKwkJLy8gdHdvIHBvc3NpYmxlIHZhbHVlcyAwIG9yIDEuCisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJLy8gT2JkVHlwZXMgd2hpY2ggaGFzIHRvIGJlIGNoZWNrIHVwIGJlY2F1c2UgbnVtZXJpY2FsIHZhbHVlcworCWNhc2Uga0VwbE9iZFR5cEludDg6CisKKwkJLy8gc3dpdGNoIHRvIGxvd2VyIGxpbWl0CisJCXBSYW5nZURhdGEgPSAoKHRFcGxPYmRJbnRlZ2VyOCAqKSBwUmFuZ2VEYXRhKSArIDE7CisKKwkJLy8gY2hlY2sgaWYgdmFsdWUgaXMgdG8gbG93CisJCWlmICgqKCh0RXBsT2JkSW50ZWdlcjggKikgcERhdGFfcCkgPAorCQkgICAgKigodEVwbE9iZEludGVnZXI4ICopIHBSYW5nZURhdGEpKSB7CisJCQlSZXQgPSBrRXBsT2JkVmFsdWVUb29Mb3c7CisJCQlicmVhazsKKwkJfQorCQkvLyBzd2l0Y2ggdG8gaGlnaGVyIGxpbWl0CisJCXBSYW5nZURhdGEgPSAoKHRFcGxPYmRJbnRlZ2VyOCAqKSBwUmFuZ2VEYXRhKSArIDE7CisKKwkJLy8gY2hlY2sgaWYgdmFsdWUgaXMgdG8gaGlnaAorCQlpZiAoKigodEVwbE9iZEludGVnZXI4ICopIHBEYXRhX3ApID4KKwkJICAgICooKHRFcGxPYmRJbnRlZ2VyOCAqKSBwUmFuZ2VEYXRhKSkgeworCQkJUmV0ID0ga0VwbE9iZFZhbHVlVG9vSGlnaDsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBrRXBsT2JkVHlwVUludDg6CisKKwkJLy8gc3dpdGNoIHRvIGxvd2VyIGxpbWl0CisJCXBSYW5nZURhdGEgPSAoKHRFcGxPYmRVbnNpZ25lZDggKikgcFJhbmdlRGF0YSkgKyAxOworCisJCS8vIGNoZWNrIGlmIHZhbHVlIGlzIHRvIGxvdworCQlpZiAoKigodEVwbE9iZFVuc2lnbmVkOCAqKSBwRGF0YV9wKSA8CisJCSAgICAqKCh0RXBsT2JkVW5zaWduZWQ4ICopIHBSYW5nZURhdGEpKSB7CisJCQlSZXQgPSBrRXBsT2JkVmFsdWVUb29Mb3c7CisJCQlicmVhazsKKwkJfQorCQkvLyBzd2l0Y2ggdG8gaGlnaGVyIGxpbWl0CisJCXBSYW5nZURhdGEgPSAoKHRFcGxPYmRVbnNpZ25lZDggKikgcFJhbmdlRGF0YSkgKyAxOworCisJCS8vIGNoZWNrIGlmIHZhbHVlIGlzIHRvIGhpZ2gKKwkJaWYgKCooKHRFcGxPYmRVbnNpZ25lZDggKikgcERhdGFfcCkgPgorCQkgICAgKigodEVwbE9iZFVuc2lnbmVkOCAqKSBwUmFuZ2VEYXRhKSkgeworCQkJUmV0ID0ga0VwbE9iZFZhbHVlVG9vSGlnaDsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBrRXBsT2JkVHlwSW50MTY6CisKKwkJLy8gc3dpdGNoIHRvIGxvd2VyIGxpbWl0CisJCXBSYW5nZURhdGEgPSAoKHRFcGxPYmRJbnRlZ2VyMTYgKikgcFJhbmdlRGF0YSkgKyAxOworCisJCS8vIGNoZWNrIGlmIHZhbHVlIGlzIHRvIGxvdworCQlpZiAoKigodEVwbE9iZEludGVnZXIxNiAqKSBwRGF0YV9wKSA8CisJCSAgICAqKCh0RXBsT2JkSW50ZWdlcjE2ICopIHBSYW5nZURhdGEpKSB7CisJCQlSZXQgPSBrRXBsT2JkVmFsdWVUb29Mb3c7CisJCQlicmVhazsKKwkJfQorCQkvLyBzd2l0Y2ggdG8gaGlnaGVyIGxpbWl0CisJCXBSYW5nZURhdGEgPSAoKHRFcGxPYmRJbnRlZ2VyMTYgKikgcFJhbmdlRGF0YSkgKyAxOworCisJCS8vIGNoZWNrIGlmIHZhbHVlIGlzIHRvIGhpZ2gKKwkJaWYgKCooKHRFcGxPYmRJbnRlZ2VyMTYgKikgcERhdGFfcCkgPgorCQkgICAgKigodEVwbE9iZEludGVnZXIxNiAqKSBwUmFuZ2VEYXRhKSkgeworCQkJUmV0ID0ga0VwbE9iZFZhbHVlVG9vSGlnaDsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBrRXBsT2JkVHlwVUludDE2OgorCisJCS8vIHN3aXRjaCB0byBsb3dlciBsaW1pdAorCQlwUmFuZ2VEYXRhID0gKCh0RXBsT2JkVW5zaWduZWQxNiAqKSBwUmFuZ2VEYXRhKSArIDE7CisKKwkJLy8gY2hlY2sgaWYgdmFsdWUgaXMgdG8gbG93CisJCWlmICgqKCh0RXBsT2JkVW5zaWduZWQxNiAqKSBwRGF0YV9wKSA8CisJCSAgICAqKCh0RXBsT2JkVW5zaWduZWQxNiAqKSBwUmFuZ2VEYXRhKSkgeworCQkJUmV0ID0ga0VwbE9iZFZhbHVlVG9vTG93OworCQkJYnJlYWs7CisJCX0KKwkJLy8gc3dpdGNoIHRvIGhpZ2hlciBsaW1pdAorCQlwUmFuZ2VEYXRhID0gKCh0RXBsT2JkVW5zaWduZWQxNiAqKSBwUmFuZ2VEYXRhKSArIDE7CisKKwkJLy8gY2hlY2sgaWYgdmFsdWUgaXMgdG8gaGlnaAorCQlpZiAoKigodEVwbE9iZFVuc2lnbmVkMTYgKikgcERhdGFfcCkgPgorCQkgICAgKigodEVwbE9iZFVuc2lnbmVkMTYgKikgcFJhbmdlRGF0YSkpIHsKKwkJCVJldCA9IGtFcGxPYmRWYWx1ZVRvb0hpZ2g7CisJCX0KKworCQlicmVhazsKKworCWNhc2Uga0VwbE9iZFR5cEludDMyOgorCisJCS8vIHN3aXRjaCB0byBsb3dlciBsaW1pdAorCQlwUmFuZ2VEYXRhID0gKCh0RXBsT2JkSW50ZWdlcjMyICopIHBSYW5nZURhdGEpICsgMTsKKworCQkvLyBjaGVjayBpZiB2YWx1ZSBpcyB0byBsb3cKKwkJaWYgKCooKHRFcGxPYmRJbnRlZ2VyMzIgKikgcERhdGFfcCkgPAorCQkgICAgKigodEVwbE9iZEludGVnZXIzMiAqKSBwUmFuZ2VEYXRhKSkgeworCQkJUmV0ID0ga0VwbE9iZFZhbHVlVG9vTG93OworCQkJYnJlYWs7CisJCX0KKwkJLy8gc3dpdGNoIHRvIGhpZ2hlciBsaW1pdAorCQlwUmFuZ2VEYXRhID0gKCh0RXBsT2JkSW50ZWdlcjMyICopIHBSYW5nZURhdGEpICsgMTsKKworCQkvLyBjaGVjayBpZiB2YWx1ZSBpcyB0byBoaWdoCisJCWlmICgqKCh0RXBsT2JkSW50ZWdlcjMyICopIHBEYXRhX3ApID4KKwkJICAgICooKHRFcGxPYmRJbnRlZ2VyMzIgKikgcFJhbmdlRGF0YSkpIHsKKwkJCVJldCA9IGtFcGxPYmRWYWx1ZVRvb0hpZ2g7CisJCX0KKworCQlicmVhazsKKworCWNhc2Uga0VwbE9iZFR5cFVJbnQzMjoKKworCQkvLyBzd2l0Y2ggdG8gbG93ZXIgbGltaXQKKwkJcFJhbmdlRGF0YSA9ICgodEVwbE9iZFVuc2lnbmVkMzIgKikgcFJhbmdlRGF0YSkgKyAxOworCisJCS8vIGNoZWNrIGlmIHZhbHVlIGlzIHRvIGxvdworCQlpZiAoKigodEVwbE9iZFVuc2lnbmVkMzIgKikgcERhdGFfcCkgPAorCQkgICAgKigodEVwbE9iZFVuc2lnbmVkMzIgKikgcFJhbmdlRGF0YSkpIHsKKwkJCVJldCA9IGtFcGxPYmRWYWx1ZVRvb0xvdzsKKwkJCWJyZWFrOworCQl9CisJCS8vIHN3aXRjaCB0byBoaWdoZXIgbGltaXQKKwkJcFJhbmdlRGF0YSA9ICgodEVwbE9iZFVuc2lnbmVkMzIgKikgcFJhbmdlRGF0YSkgKyAxOworCisJCS8vIGNoZWNrIGlmIHZhbHVlIGlzIHRvIGhpZ2gKKwkJaWYgKCooKHRFcGxPYmRVbnNpZ25lZDMyICopIHBEYXRhX3ApID4KKwkJICAgICooKHRFcGxPYmRVbnNpZ25lZDMyICopIHBSYW5nZURhdGEpKSB7CisJCQlSZXQgPSBrRXBsT2JkVmFsdWVUb29IaWdoOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIGtFcGxPYmRUeXBSZWFsMzI6CisKKwkJLy8gc3dpdGNoIHRvIGxvd2VyIGxpbWl0CisJCXBSYW5nZURhdGEgPSAoKHRFcGxPYmRSZWFsMzIgKikgcFJhbmdlRGF0YSkgKyAxOworCisJCS8vIGNoZWNrIGlmIHZhbHVlIGlzIHRvIGxvdworCQlpZiAoKigodEVwbE9iZFJlYWwzMiAqKSBwRGF0YV9wKSA8CisJCSAgICAqKCh0RXBsT2JkUmVhbDMyICopIHBSYW5nZURhdGEpKSB7CisJCQlSZXQgPSBrRXBsT2JkVmFsdWVUb29Mb3c7CisJCQlicmVhazsKKwkJfQorCQkvLyBzd2l0Y2ggdG8gaGlnaGVyIGxpbWl0CisJCXBSYW5nZURhdGEgPSAoKHRFcGxPYmRSZWFsMzIgKikgcFJhbmdlRGF0YSkgKyAxOworCisJCS8vIGNoZWNrIGlmIHZhbHVlIGlzIHRvIGhpZ2gKKwkJaWYgKCooKHRFcGxPYmRSZWFsMzIgKikgcERhdGFfcCkgPgorCQkgICAgKigodEVwbE9iZFJlYWwzMiAqKSBwUmFuZ2VEYXRhKSkgeworCQkJUmV0ID0ga0VwbE9iZFZhbHVlVG9vSGlnaDsKKwkJfQorCisJCWJyZWFrOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBrRXBsT2JkVHlwSW50NDA6CisJY2FzZSBrRXBsT2JkVHlwSW50NDg6CisJY2FzZSBrRXBsT2JkVHlwSW50NTY6CisJY2FzZSBrRXBsT2JkVHlwSW50NjQ6CisKKwkJLy8gc3dpdGNoIHRvIGxvd2VyIGxpbWl0CisJCXBSYW5nZURhdGEgPSAoKHNpZ25lZCBRV09SRCAqKXBSYW5nZURhdGEpICsgMTsKKworCQkvLyBjaGVjayBpZiB2YWx1ZSBpcyB0byBsb3cKKwkJaWYgKCooKHNpZ25lZCBRV09SRCAqKXBEYXRhX3ApIDwgKigoc2lnbmVkIFFXT1JEICopcFJhbmdlRGF0YSkpIHsKKwkJCVJldCA9IGtFcGxPYmRWYWx1ZVRvb0xvdzsKKwkJCWJyZWFrOworCQl9CisJCS8vIHN3aXRjaCB0byBoaWdoZXIgbGltaXQKKwkJcFJhbmdlRGF0YSA9ICgoc2lnbmVkIFFXT1JEICopcFJhbmdlRGF0YSkgKyAxOworCisJCS8vIGNoZWNrIGlmIHZhbHVlIGlzIHRvIGhpZ2gKKwkJaWYgKCooKHNpZ25lZCBRV09SRCAqKXBEYXRhX3ApID4gKigoc2lnbmVkIFFXT1JEICopcFJhbmdlRGF0YSkpIHsKKwkJCVJldCA9IGtFcGxPYmRWYWx1ZVRvb0hpZ2g7CisJCX0KKworCQlicmVhazsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWNhc2Uga0VwbE9iZFR5cFVJbnQ0MDoKKwljYXNlIGtFcGxPYmRUeXBVSW50NDg6CisJY2FzZSBrRXBsT2JkVHlwVUludDU2OgorCWNhc2Uga0VwbE9iZFR5cFVJbnQ2NDoKKworCQkvLyBzd2l0Y2ggdG8gbG93ZXIgbGltaXQKKwkJcFJhbmdlRGF0YSA9ICgodW5zaWduZWQgUVdPUkQgKilwUmFuZ2VEYXRhKSArIDE7CisKKwkJLy8gY2hlY2sgaWYgdmFsdWUgaXMgdG8gbG93CisJCWlmICgqKCh1bnNpZ25lZCBRV09SRCAqKXBEYXRhX3ApIDwKKwkJICAgICooKHVuc2lnbmVkIFFXT1JEICopcFJhbmdlRGF0YSkpIHsKKwkJCVJldCA9IGtFcGxPYmRWYWx1ZVRvb0xvdzsKKwkJCWJyZWFrOworCQl9CisJCS8vIHN3aXRjaCB0byBoaWdoZXIgbGltaXQKKwkJcFJhbmdlRGF0YSA9ICgodW5zaWduZWQgUVdPUkQgKilwUmFuZ2VEYXRhKSArIDE7CisKKwkJLy8gY2hlY2sgaWYgdmFsdWUgaXMgdG8gaGlnaAorCQlpZiAoKigodW5zaWduZWQgUVdPUkQgKilwRGF0YV9wKSA+CisJCSAgICAqKCh1bnNpZ25lZCBRV09SRCAqKXBSYW5nZURhdGEpKSB7CisJCQlSZXQgPSBrRXBsT2JkVmFsdWVUb29IaWdoOworCQl9CisKKwkJYnJlYWs7CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIGtFcGxPYmRUeXBSZWFsNjQ6CisKKwkJLy8gc3dpdGNoIHRvIGxvd2VyIGxpbWl0CisJCXBSYW5nZURhdGEgPSAoKHRFcGxPYmRSZWFsNjQgKikgcFJhbmdlRGF0YSkgKyAxOworCisJCS8vIGNoZWNrIGlmIHZhbHVlIGlzIHRvIGxvdworCQlpZiAoKigodEVwbE9iZFJlYWw2NCAqKSBwRGF0YV9wKSA8CisJCSAgICAqKCh0RXBsT2JkUmVhbDY0ICopIHBSYW5nZURhdGEpKSB7CisJCQlSZXQgPSBrRXBsT2JkVmFsdWVUb29Mb3c7CisJCQlicmVhazsKKwkJfQorCQkvLyBzd2l0Y2ggdG8gaGlnaGVyIGxpbWl0CisJCXBSYW5nZURhdGEgPSAoKHRFcGxPYmRSZWFsNjQgKikgcFJhbmdlRGF0YSkgKyAxOworCisJCS8vIGNoZWNrIGlmIHZhbHVlIGlzIHRvIGhpZ2gKKwkJaWYgKCooKHRFcGxPYmRSZWFsNjQgKikgcERhdGFfcCkgPgorCQkgICAgKigodEVwbE9iZFJlYWw2NCAqKSBwUmFuZ2VEYXRhKSkgeworCQkJUmV0ID0ga0VwbE9iZFZhbHVlVG9vSGlnaDsKKwkJfQorCisJCWJyZWFrOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBrRXBsT2JkVHlwVGltZU9mRGF5OgorCWNhc2Uga0VwbE9iZFR5cFRpbWVEaWZmOgorCQlicmVhazsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyBPYmRUeXBlcyBrRXBsT2JkVHlwWFN0cmluZyBhbmQga0VwbE9iZFR5cERvbWFpbiBjYW4gbm90IGJlIGNoZWNrdCBiZWNhdXNlCisJCS8vIHRoZXkgaGF2ZSBubyBudW1lcmljYWwgdmFsdWUuCisJZGVmYXVsdDoKKworCQlSZXQgPSBrRXBsT2JkVW5rbm93bk9iamVjdFR5cGU7CisJCWJyZWFrOworCX0KKworICAgICAgRXhpdDoKKworCXJldHVybiBSZXQ7CisKK30KKyNlbmRpZiAvLyAoRVBMX09CRF9DSEVDS19PQkpFQ1RfUkFOR0UgIT0gRkFMU0UpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZFdyaXRlRW50cnlQcmUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiBwcmVwYXJlcyB3cml0ZSBvZiBkYXRhIHRvIGFuIE9CRCBlbnRyeS4gU3RyaW5ncworLy8gICAgICAgICAgICAgIGFyZSBzdG9yZWQgd2l0aCBhZGRlZCAnXDAnIGNoYXJhY3Rlci4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKy8vICAgICAgICAgICAgICB1aUluZGV4X3AgICAgICAgPSAgIEluZGV4IG9mIHRoZSBPRCBlbnRyeQorLy8gICAgICAgICAgICAgIHVpU3ViSW5kZXhfcCAgICA9ICAgU3ViaW5kZXggb2YgdGhlIE9EIEVudHJ5CisvLyAgICAgICAgICAgICAgcFNyY0RhdGFfcCAgICAgID0gICBQb2ludGVyIHRvIHRoZSBkYXRhIHRvIHdyaXRlCisvLyAgICAgICAgICAgICAgU2l6ZV9wICAgICAgICAgID0gICBTaXplIG9mIHRoZSBkYXRhIGluIEJ5dGUKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgICAgID0gICBFcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZFdyaXRlRW50cnlQcmUoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCSAgICAgdm9pZCAqcFNyY0RhdGFfcCwKKwkJCQkJICAgICB2b2lkICoqcHBEc3REYXRhX3AsCisJCQkJCSAgICAgdEVwbE9iZFNpemUgU2l6ZV9wLAorCQkJCQkgICAgIHRFcGxPYmRFbnRyeVB0ciAqIHBwT2JkRW50cnlfcCwKKwkJCQkJICAgICB0RXBsT2JkU3ViRW50cnlQdHIgKiBwcFN1YkVudHJ5X3AsCisJCQkJCSAgICAgdEVwbE9iZENiUGFyYW0gTUVNICogcENiUGFyYW1fcCwKKwkJCQkJICAgICB0RXBsT2JkU2l6ZSAqIHBPYmRTaXplX3ApCit7CisKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsT2JkRW50cnlQdHIgcE9iZEVudHJ5OworCXRFcGxPYmRTdWJFbnRyeVB0ciBwU3ViRW50cnk7CisJdEVwbE9iZEFjY2VzcyBBY2Nlc3M7CisJdm9pZCBNRU0gKnBEc3REYXRhOworCXRFcGxPYmRTaXplIE9iZFNpemU7CisJQk9PTCBmRW50cnlOdW1lcmljYWw7CisKKyNpZiAoRVBMX09CRF9VU0VfU1RSSU5HX0RPTUFJTl9JTl9SQU0gIT0gRkFMU0UpCisJdEVwbE9iZFZTdHJpbmdEb21haW4gTUVNIE1lbVZTdHJpbmdEb21haW47CisJdm9pZCBNRU0gKnBDdXJyRGF0YTsKKyNlbmRpZgorCisJLy8gY2hlY2sgZm9yIGFsbCBBUEkgZnVuY3Rpb24gaWYgaW5zdGFuY2UgaXMgdmFsaWQKKwlFUExfTUNPX0NIRUNLX0lOU1RBTkNFX1NUQVRFKCk7CisKKwlBU1NFUlQocFNyY0RhdGFfcCAhPSBOVUxMKTsJLy8gc2hvdWxkIG5ldmVyIGJlIE5VTEwKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gZ2V0IGFkZHJlc3Mgb2YgaW5kZXggYW5kIHN1YmluZGV4IGVudHJ5CisJUmV0ID0gRXBsT2JkR2V0RW50cnkoRVBMX01DT19JTlNUQU5DRV9QVFJfCisJCQkgICAgIHVpSW5kZXhfcCwgdWlTdWJJbmRleF9wLCAmcE9iZEVudHJ5LCAmcFN1YkVudHJ5KTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZ2V0IHBvaW50ZXIgdG8gb2JqZWN0IGRhdGEKKwlwRHN0RGF0YSA9ICh2b2lkIE1FTSAqKUVwbE9iZEdldE9iamVjdERhdGFQdHJJbnRlcm4ocFN1YkVudHJ5KTsKKworCUFjY2VzcyA9ICh0RXBsT2JkQWNjZXNzKSBwU3ViRW50cnktPm1fQWNjZXNzOworCisJLy8gY2hlY2sgYWNjZXNzIGZvciB3cml0ZQorCS8vIGFjY2VzcyB2aW9sYXRpb24gaWYgYWRyZXNzIHRvIGN1cnJlbnQgdmFsdWUgaXMgTlVMTAorCWlmICgoKEFjY2VzcyAmIGtFcGxPYmRBY2NDb25zdCkgIT0gMCkgfHwgKHBEc3REYXRhID09IE5VTEwpKSB7CisJCVJldCA9IGtFcGxPYmRBY2Nlc3NWaW9sYXRpb247CisJCWdvdG8gRXhpdDsKKwl9CisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBnZXQgc2l6ZSBvZiBvYmplY3QKKwkvLyAtYXMgT2JkU2l6ZSA9IE9iZEdldE9iamVjdFNpemUgKHBTdWJFbnRyeSk7CisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIFRvIHVzZSB0aGUgc2FtZSBjYWxsYmFjayBmdW5jdGlvbiBmb3IgT2JkV3JpdGVFbnRyeSBhcyB3ZWxsIGFzIGZvcgorCS8vIGFuIFNETyBkb3dubG9hZCBjYWxsIGF0IGZpcnN0IChrRXBsT2JkRXZQcmUuLi4pIHRoZSBjYWxsYmFjayBmdW5jdGlvbgorCS8vIHdpdGggdGhlIGFyZ3VtZW50IHBvaW50ZXIgdG8gb2JqZWN0IHNpemUuCisJcENiUGFyYW1fcC0+bV91aUluZGV4ID0gdWlJbmRleF9wOworCXBDYlBhcmFtX3AtPm1fdWlTdWJJbmRleCA9IHVpU3ViSW5kZXhfcDsKKworCS8vIEJlY2F1c2Ugb2JqZWN0IHNpemUgYW5kIG9iamVjdCBwb2ludGVyIGFyZQorCS8vIGFkYXB0ZWQgYnkgdXNlciBjYWxsYmFjayBmdW5jdGlvbiwgcmUtcmVhZAorCS8vIHRoaXMgdmFsdWVzLgorCU9iZFNpemUgPSBFcGxPYmRHZXRPYmplY3RTaXplKHBTdWJFbnRyeSk7CisJcERzdERhdGEgPSAodm9pZCBNRU0gKilFcGxPYmRHZXRPYmplY3REYXRhUHRySW50ZXJuKHBTdWJFbnRyeSk7CisKKwkvLyAwOS1kZWMtMjAwNCByLmQuOgorCS8vICAgICAgRnVuY3Rpb24gRXBsT2JkV3JpdGVFbnRyeSgpIGNhbGxzIG5ldyBldmVudCBrRXBsT2JkRXZXclN0cmluZ0RvbWFpbgorCS8vICAgICAgZm9yIFN0cmluZyBvciBEb21haW4gd2hpY2ggbGV0cyBjYWxsZWQgbW9kdWxlIGRpcmVjdGx5IGNoYW5nZQorCS8vICAgICAgdGhlIGRhdGEgcG9pbnRlciBvciBzaXplLiBUaGlzIHByZXZlbnRzIGEgcmVjdXJzaXZlIGNhbGwgdG8KKwkvLyAgICAgIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBpZiBpdCBjYWxscyBFcGxPYmRHZXRFbnRyeSgpLgorI2lmIChFUExfT0JEX1VTRV9TVFJJTkdfRE9NQUlOX0lOX1JBTSAhPSBGQUxTRSkKKwlpZiAoKHBTdWJFbnRyeS0+bV9UeXBlID09IGtFcGxPYmRUeXBWU3RyaW5nKSB8fAorCSAgICAocFN1YkVudHJ5LT5tX1R5cGUgPT0ga0VwbE9iZFR5cERvbWFpbikgfHwKKwkgICAgKHBTdWJFbnRyeS0+bV9UeXBlID09IGtFcGxPYmRUeXBPU3RyaW5nKSkgeworCQlpZiAocFN1YkVudHJ5LT5tX1R5cGUgPT0ga0VwbE9iZFR5cFZTdHJpbmcpIHsKKwkJCS8vIHJlc2VydmUgb25lIGJ5dGUgZm9yIDAtdGVybWluYXRpb24KKwkJCS8vIC1hcyBPYmRTaXplIC09IDE7CisJCQlTaXplX3AgKz0gMTsKKwkJfQorCQkvLyBmaWxsIG91dCBuZXcgYXJnLXN0cnVjdAorCQlNZW1WU3RyaW5nRG9tYWluLm1fRG93bmxvYWRTaXplID0gU2l6ZV9wOworCQlNZW1WU3RyaW5nRG9tYWluLm1fT2JqU2l6ZSA9IE9iZFNpemU7CisJCU1lbVZTdHJpbmdEb21haW4ubV9wRGF0YSA9IHBEc3REYXRhOworCisJCXBDYlBhcmFtX3AtPm1fT2JkRXZlbnQgPSBrRXBsT2JkRXZXclN0cmluZ0RvbWFpbjsKKwkJcENiUGFyYW1fcC0+bV9wQXJnID0gJk1lbVZTdHJpbmdEb21haW47CisJCS8vICBjYWxsIHVzZXIgY2FsbGJhY2sKKwkJUmV0ID0gRXBsT2JkQ2FsbE9iamVjdENhbGxiYWNrKEVQTF9NQ09fSU5TVEFOQ0VfUFRSXworCQkJCQkgICAgICAgcE9iZEVudHJ5LT5tX2ZwQ2FsbGJhY2ssCisJCQkJCSAgICAgICBwQ2JQYXJhbV9wKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJZ290byBFeGl0OworCQl9CisJCS8vIHdyaXRlIGJhY2sgbmV3IHNldHRpbmdzCisJCXBDdXJyRGF0YSA9IHBTdWJFbnRyeS0+bV9wQ3VycmVudDsKKwkJaWYgKChwU3ViRW50cnktPm1fVHlwZSA9PSBrRXBsT2JkVHlwVlN0cmluZykKKwkJICAgIHx8IChwU3ViRW50cnktPm1fVHlwZSA9PSBrRXBsT2JkVHlwT1N0cmluZykpIHsKKwkJCSgodEVwbE9iZFZTdHJpbmcgTUVNICopIHBDdXJyRGF0YSktPm1fU2l6ZSA9CisJCQkgICAgTWVtVlN0cmluZ0RvbWFpbi5tX09ialNpemU7CisJCQkoKHRFcGxPYmRWU3RyaW5nIE1FTSAqKSBwQ3VyckRhdGEpLT5tX3BTdHJpbmcgPQorCQkJICAgIE1lbVZTdHJpbmdEb21haW4ubV9wRGF0YTsKKwkJfSBlbHNlCQkvLyBpZiAocFNkb3NUYWJsZUVudHJ5X3AtPm1fYk9ialR5cGUgPT0ga0VwbE9iZFR5cERvbWFpbikKKwkJeworCQkJKCh0RXBsT2JkVmFyRW50cnkgTUVNICopIHBDdXJyRGF0YSktPm1fU2l6ZSA9CisJCQkgICAgTWVtVlN0cmluZ0RvbWFpbi5tX09ialNpemU7CisJCQkoKHRFcGxPYmRWYXJFbnRyeSBNRU0gKikgcEN1cnJEYXRhKS0+bV9wRGF0YSA9CisJCQkgICAgKHZvaWQgTUVNICopTWVtVlN0cmluZ0RvbWFpbi5tX3BEYXRhOworCQl9CisKKwkJLy8gQmVjYXVzZSBvYmplY3Qgc2l6ZSBhbmQgb2JqZWN0IHBvaW50ZXIgYXJlCisJCS8vIGFkYXB0ZWQgYnkgdXNlciBjYWxsYmFjayBmdW5jdGlvbiwgcmUtcmVhZAorCQkvLyB0aGlzIHZhbHVlcy4KKwkJT2JkU2l6ZSA9IE1lbVZTdHJpbmdEb21haW4ubV9PYmpTaXplOworCQlwRHN0RGF0YSA9ICh2b2lkIE1FTSAqKU1lbVZTdHJpbmdEb21haW4ubV9wRGF0YTsKKwl9CisjZW5kaWYgLy8jaWYgKE9CRF9VU0VfU1RSSU5HX0RPTUFJTl9JTl9SQU0gIT0gRkFMU0UpCisKKwkvLyAwNy1kZWMtMjAwNCByLmQuOiBzaXplIGZyb20gYXBwbGljYXRpb24gaXMgbmVlZGVkIGJlY2F1c2UgY2FsbGJhY2sgZnVuY3Rpb24gY2FuIGNoYW5nZSB0aGUgb2JqZWN0IHNpemUKKwkvLyAtYXMgMTYuMTEuMDQgQ2JQYXJhbS5tX3BBcmcgICAgID0gJk9iZFNpemU7CisJLy8gMDktZGVjLTIwMDQgci5kLjogQ2JQYXJhbS5tX3BBcmcgICAgID0gJlNpemVfcDsKKwlwQ2JQYXJhbV9wLT5tX3BBcmcgPSAmT2JkU2l6ZTsKKwlwQ2JQYXJhbV9wLT5tX09iZEV2ZW50ID0ga0VwbE9iZEV2SW5pdFdyaXRlOworCVJldCA9IEVwbE9iZENhbGxPYmplY3RDYWxsYmFjayhFUExfTUNPX0lOU1RBTkNFX1BUUl8KKwkJCQkgICAgICAgcE9iZEVudHJ5LT5tX2ZwQ2FsbGJhY2ssIHBDYlBhcmFtX3ApOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCWlmIChTaXplX3AgPiBPYmRTaXplKSB7CisJCVJldCA9IGtFcGxPYmRWYWx1ZUxlbmd0aEVycm9yOworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKHBTdWJFbnRyeS0+bV9UeXBlID09IGtFcGxPYmRUeXBWU3RyaW5nKSB7CisJCWlmICgoKGNoYXIgTUVNICopcFNyY0RhdGFfcClbU2l6ZV9wIC0gMV0gPT0gJ1wwJykgewkvLyBsYXN0IGJ5dGUgb2Ygc291cmNlIHN0cmluZyBjb250YWlucyBudWxsIGNoYXJhY3RlcgorCisJCQkvLyByZXNlcnZlIG9uZSBieXRlIGluIGRlc3RpbmF0aW9uIGZvciAwLXRlcm1pbmF0aW9uCisJCQlTaXplX3AgLT0gMTsKKwkJfSBlbHNlIGlmIChTaXplX3AgPj0gT2JkU2l6ZSkgewkvLyBzb3VyY2Ugc3RyaW5nIGlzIG5vdCAwLXRlcm1pbmF0ZWQKKwkJCS8vIGFuZCBkZXN0aW5hdGlvbiBidWZmZXIgaXMgdG9vIHNob3J0CisJCQlSZXQgPSBrRXBsT2JkVmFsdWVMZW5ndGhFcnJvcjsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCX0KKworCVJldCA9IEVwbE9iZElzTnVtZXJpY2FsSW50ZXJuKHBTdWJFbnRyeSwgJmZFbnRyeU51bWVyaWNhbCk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKChmRW50cnlOdW1lcmljYWwgIT0gRkFMU0UpCisJICAgICYmIChTaXplX3AgIT0gT2JkU2l6ZSkpIHsKKwkJLy8gdHlwZSBpcyBudW1lcmljYWwsIHRoZXJlZm9yIHNpemUgaGFzIHRvIGZpdCwgYnV0IGl0IGRvZXMgbm90LgorCQlSZXQgPSBrRXBsT2JkVmFsdWVMZW5ndGhFcnJvcjsKKwkJZ290byBFeGl0OworCX0KKwkvLyB1c2UgZ2l2ZW4gc2l6ZSwgYmVjYXVzZSBub24tbnVtZXJpY2FsIG9iamVjdHMgY2FuIGJlIHdyaXR0ZW4gd2l0aCBzaG9ydGVyIHZhbHVlcworCU9iZFNpemUgPSBTaXplX3A7CisKKwkvLyBzZXQgb3V0cHV0IHBhcmFtZXRlcnMKKwkqcE9iZFNpemVfcCA9IE9iZFNpemU7CisJKnBwT2JkRW50cnlfcCA9IHBPYmRFbnRyeTsKKwkqcHBTdWJFbnRyeV9wID0gcFN1YkVudHJ5OworCSpwcERzdERhdGFfcCA9IHBEc3REYXRhOworCisJLy8gYWxsIGNoZWNrcyBhcmUgZG9uZQorCS8vIHRoZSBjYWxsZXIgbWF5IG5vdyBjb252ZXJ0IHRoZSBudW1lcmlhbCBzb3VyY2UgdmFsdWUgdG8gcGxhdGZvcm0gYnl0ZSBvcmRlciBpbiBhIHRlbXBvcmFyeSBidWZmZXIKKworICAgICAgRXhpdDoKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkV3JpdGVFbnRyeVBvc3QoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiBmaW5pc2hlcyB3cml0ZSBvZiBkYXRhIHRvIGFuIE9CRCBlbnRyeS4gU3RyaW5ncworLy8gICAgICAgICAgICAgIGFyZSBzdG9yZWQgd2l0aCBhZGRlZCAnXDAnIGNoYXJhY3Rlci4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKy8vICAgICAgICAgICAgICB1aUluZGV4X3AgICAgICAgPSAgIEluZGV4IG9mIHRoZSBPRCBlbnRyeQorLy8gICAgICAgICAgICAgIHVpU3ViSW5kZXhfcCAgICA9ICAgU3ViaW5kZXggb2YgdGhlIE9EIEVudHJ5CisvLyAgICAgICAgICAgICAgcFNyY0RhdGFfcCAgICAgID0gICBQb2ludGVyIHRvIHRoZSBkYXRhIHRvIHdyaXRlCisvLyAgICAgICAgICAgICAgU2l6ZV9wICAgICAgICAgID0gICBTaXplIG9mIHRoZSBkYXRhIGluIEJ5dGUKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgICAgID0gICBFcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZFdyaXRlRW50cnlQb3N0KEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCSAgICAgIHRFcGxPYmRFbnRyeVB0ciBwT2JkRW50cnlfcCwKKwkJCQkJICAgICAgdEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJFbnRyeV9wLAorCQkJCQkgICAgICB0RXBsT2JkQ2JQYXJhbSBNRU0gKiBwQ2JQYXJhbV9wLAorCQkJCQkgICAgICB2b2lkICpwU3JjRGF0YV9wLAorCQkJCQkgICAgICB2b2lkICpwRHN0RGF0YV9wLAorCQkJCQkgICAgICB0RXBsT2JkU2l6ZSBPYmRTaXplX3ApCit7CisKKwl0RXBsS2VybmVsIFJldDsKKworCS8vIGNhbGxlciBjb252ZXJ0ZWQgdGhlIHNvdXJjZSB2YWx1ZSB0byBwbGF0Zm9ybSBieXRlIG9yZGVyCisJLy8gbm93IHRoZSByYW5nZSBvZiB0aGUgdmFsdWUgbWF5IGJlIGNoZWNrZWQKKworI2lmIChFUExfT0JEX0NIRUNLX09CSkVDVF9SQU5HRSAhPSBGQUxTRSkKKwl7CisJCS8vIGNoZWNrIGRhdGEgcmFuZ2UKKwkJUmV0ID0gRXBsT2JkQ2hlY2tPYmplY3RSYW5nZShwU3ViRW50cnlfcCwgcFNyY0RhdGFfcCk7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCX0KKyNlbmRpZgorCisJLy8gbm93IGNhbGwgdXNlciBjYWxsYmFjayBmdW5jdGlvbiB0byBjaGVjayB2YWx1ZQorCS8vIHdyaXRlIGFkZHJlc3Mgb2Ygc291cmNlIGRhdGEgdG8gc3RydWN0dXJlIG9mIGNhbGxiYWNrIHBhcmFtZXRlcnMKKwkvLyBzbyBjYWxsYmFjayBmdW5jdGlvbiBjYW4gY2hlY2sgdGhpcyBkYXRhCisJcENiUGFyYW1fcC0+bV9wQXJnID0gcFNyY0RhdGFfcDsKKwlwQ2JQYXJhbV9wLT5tX09iZEV2ZW50ID0ga0VwbE9iZEV2UHJlV3JpdGU7CisJUmV0ID0gRXBsT2JkQ2FsbE9iamVjdENhbGxiYWNrKEVQTF9NQ09fSU5TVEFOQ0VfUFRSXworCQkJCSAgICAgICBwT2JkRW50cnlfcC0+bV9mcENhbGxiYWNrLCBwQ2JQYXJhbV9wKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gY29weSBvYmplY3QgZGF0YSB0byBPQkQKKwlFUExfTUVNQ1BZKHBEc3REYXRhX3AsIHBTcmNEYXRhX3AsIE9iZFNpemVfcCk7CisKKwkvLyB0ZXJtaW5hdGUgc3RyaW5nIHdpdGggMAorCWlmIChwU3ViRW50cnlfcC0+bV9UeXBlID09IGtFcGxPYmRUeXBWU3RyaW5nKSB7CisJCSgoY2hhciBNRU0gKilwRHN0RGF0YV9wKVtPYmRTaXplX3BdID0gJ1wwJzsKKwl9CisJLy8gd3JpdGUgYWRkcmVzcyBvZiBkZXN0aW5hdGlvbiB0byBzdHJ1Y3R1cmUgb2YgY2FsbGJhY2sgcGFyYW1ldGVycworCS8vIHNvIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbiBjaGFuZ2UgZGF0YSBzdWJzZXF1ZW50bHkKKwlwQ2JQYXJhbV9wLT5tX3BBcmcgPSBwRHN0RGF0YV9wOworCXBDYlBhcmFtX3AtPm1fT2JkRXZlbnQgPSBrRXBsT2JkRXZQb3N0V3JpdGU7CisJUmV0ID0gRXBsT2JkQ2FsbE9iamVjdENhbGxiYWNrKEVQTF9NQ09fSU5TVEFOQ0VfUFRSXworCQkJCSAgICAgICBwT2JkRW50cnlfcC0+bV9mcENhbGxiYWNrLCBwQ2JQYXJhbV9wKTsKKworICAgICAgRXhpdDoKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkR2V0T2JqZWN0U2l6ZSgpCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIHRvIGdldCBzaXplIG9mIG9iamVjdAorLy8gICAgICAgICAgICAgIFRoZSBmdW5jdGlvbiBkZXRlcm1pbmVzIGlmIGFuIG9iamVjdCB0eXBlIGFuIGZpeGVkIGRhdGEgdHlwZSAoQllURSwgV09SRCwgLi4uKQorLy8gICAgICAgICAgICAgIG9yIG5vbiBmaXhlZCBvYmplY3QgKHN0cmluZywgZG9tYWluKS4gVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIGRlY2lkZQorLy8gICAgICAgICAgICAgIGlmIGRvd25sb2FkIGRhdGEgYXJlIHN0b3JlZCB0ZW1wb3Jhcnkgb3Igbm90LiBGb3Igb2JqZWN0cyB3aXRoIGZpeGVkIGRhdGEgbGVuZ3RoCisvLyAgICAgICAgICAgICAgYW5kIHR5cGVzIGEgdmFsdWUgcmFuZ2UgY2hlY2tpbmcgY2FuIHByb2Nlc3MuCisvLyAgICAgICAgICAgICAgRm9yIHN0cmluZ3MgdGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIHdob2xlIG9iamVjdCBzaXplIG5vdCB0aGUKKy8vICAgICAgICAgICAgICBsZW5ndGggb2Ygc3RyaW5nLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwU3ViSW5kZXhFbnRyeV9wCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxPYmRTaXplCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxPYmRTaXplIEVwbE9iZEdldE9iamVjdFNpemUodEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJJbmRleEVudHJ5X3ApCit7CisKKwl0RXBsT2JkU2l6ZSBEYXRhU2l6ZSA9IDA7CisJdm9pZCAqcERhdGE7CisKKwlzd2l0Y2ggKHBTdWJJbmRleEVudHJ5X3AtPm1fVHlwZSkgeworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWNhc2Uga0VwbE9iZFR5cEJvb2w6CisKKwkJRGF0YVNpemUgPSAxOworCQlicmVhazsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyBPYmRUeXBlcyB3aGljaCBoYXMgdG8gYmUgY2hlY2sgYmVjYXVzZSBudW1lcmljYWwgdmFsdWVzCisJY2FzZSBrRXBsT2JkVHlwSW50ODoKKwkJRGF0YVNpemUgPSBzaXplb2YodEVwbE9iZEludGVnZXI4KTsKKwkJYnJlYWs7CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIGtFcGxPYmRUeXBVSW50ODoKKwkJRGF0YVNpemUgPSBzaXplb2YodEVwbE9iZFVuc2lnbmVkOCk7CisJCWJyZWFrOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBrRXBsT2JkVHlwSW50MTY6CisJCURhdGFTaXplID0gc2l6ZW9mKHRFcGxPYmRJbnRlZ2VyMTYpOworCQlicmVhazsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWNhc2Uga0VwbE9iZFR5cFVJbnQxNjoKKwkJRGF0YVNpemUgPSBzaXplb2YodEVwbE9iZFVuc2lnbmVkMTYpOworCQlicmVhazsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWNhc2Uga0VwbE9iZFR5cEludDMyOgorCQlEYXRhU2l6ZSA9IHNpemVvZih0RXBsT2JkSW50ZWdlcjMyKTsKKwkJYnJlYWs7CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIGtFcGxPYmRUeXBVSW50MzI6CisJCURhdGFTaXplID0gc2l6ZW9mKHRFcGxPYmRVbnNpZ25lZDMyKTsKKwkJYnJlYWs7CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIGtFcGxPYmRUeXBSZWFsMzI6CisJCURhdGFTaXplID0gc2l6ZW9mKHRFcGxPYmRSZWFsMzIpOworCQlicmVhazsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLyBPYmRUeXBlcyB3aGljaCBoYXMgdG8gYmUgbm90IGNoZWNrZWQgYmVjYXVzZSBub3QgTlVNIHZhbHVlcworCWNhc2Uga0VwbE9iZFR5cERvbWFpbjoKKworCQlwRGF0YSA9ICh2b2lkICopcFN1YkluZGV4RW50cnlfcC0+bV9wQ3VycmVudDsKKwkJaWYgKCh2b2lkIE1FTSAqKXBEYXRhICE9ICh2b2lkIE1FTSAqKU5VTEwpIHsKKwkJCURhdGFTaXplID0gKCh0RXBsT2JkVmFyRW50cnkgTUVNICopIHBEYXRhKS0+bV9TaXplOworCQl9CisJCWJyZWFrOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBrRXBsT2JkVHlwVlN0cmluZzoKKwkJLy9jYXNlIGtFcGxPYmRUeXBVU3RyaW5nOgorCisJCS8vIElmIE9EIGVudHJ5IGlzIGRlZmluZWQgYnkgbWFjcm8gRVBMX09CRF9TVUJJTkRFWF9ST01fVlNUUklORworCQkvLyB0aGVuIHRoZSBjdXJyZW50IHBvaW50ZXIgaXMgYWx3YXlzIE5VTEwuIFRoZSBmdW5jdGlvbgorCQkvLyByZXR1cm5zIHRoZSBsZW5ndGggb2YgZGVmYXVsdCBzdHJpbmcuCisJCXBEYXRhID0gKHZvaWQgKilwU3ViSW5kZXhFbnRyeV9wLT5tX3BDdXJyZW50OworCQlpZiAoKHZvaWQgTUVNICopcERhdGEgIT0gKHZvaWQgTUVNICopTlVMTCkgeworCQkJLy8gVGhlIG1heC4gc2l6ZSBvZiBzdHJpbmdzIGRlZmluZWQgYnkgU1RSSU5HLU1hY3JvIGlzIHN0b3JlZCBpbgorCQkJLy8gdEVwbE9iZFZTdHJpbmcgb2YgY3VycmVudCB2YWx1ZS4KKwkJCS8vICh0eXBlcyB0RXBsT2JkVlN0cmluZywgdEVwbE9iZE9TdHJpbmcgYW5kIHRFcGxPYmRVU3RyaW5nIGhhcyB0aGUgc2FtZSBtZW1iZXJzKQorCQkJRGF0YVNpemUgPSAoKHRFcGxPYmRWU3RyaW5nIE1FTSAqKSBwRGF0YSktPm1fU2l6ZTsKKwkJfSBlbHNlIHsKKwkJCS8vIFRoZSBjdXJyZW50IHBvc2l0aW9uIGlzIG5vdCBkZWNsZWFyZWQuIFRoZSBzdHJpbmcKKwkJCS8vIGlzIGxvY2F0ZWQgaW4gUk9NLCB0aGVyZWZvciB1c2UgZGVmYXVsdCBwb2ludGVyLgorCQkJcERhdGEgPSAodm9pZCAqKXBTdWJJbmRleEVudHJ5X3AtPm1fcERlZmF1bHQ7CisJCQlpZiAoKENPTlNUIHZvaWQgUk9NICopcERhdGEgIT0gKENPTlNUIHZvaWQgUk9NICopTlVMTCkgeworCQkJCS8vIFRoZSBtYXguIHNpemUgb2Ygc3RyaW5ncyBkZWZpbmVkIGJ5IFNUUklORy1NYWNybyBpcyBzdG9yZWQgaW4KKwkJCQkvLyB0RXBsT2JkVlN0cmluZyBvZiBkZWZhdWx0IHZhbHVlLgorCQkJCURhdGFTaXplID0KKwkJCQkgICAgKChDT05TVCB0RXBsT2JkVlN0cmluZyBST00gKikgcERhdGEpLT4KKwkJCQkgICAgbV9TaXplOworCQkJfQorCQl9CisKKwkJYnJlYWs7CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIGtFcGxPYmRUeXBPU3RyaW5nOgorCisJCXBEYXRhID0gKHZvaWQgKilwU3ViSW5kZXhFbnRyeV9wLT5tX3BDdXJyZW50OworCQlpZiAoKHZvaWQgTUVNICopcERhdGEgIT0gKHZvaWQgTUVNICopTlVMTCkgeworCQkJLy8gVGhlIG1heC4gc2l6ZSBvZiBzdHJpbmdzIGRlZmluZWQgYnkgU1RSSU5HLU1hY3JvIGlzIHN0b3JlZCBpbgorCQkJLy8gdEVwbE9iZFZTdHJpbmcgb2YgY3VycmVudCB2YWx1ZS4KKwkJCS8vICh0eXBlcyB0RXBsT2JkVlN0cmluZywgdEVwbE9iZE9TdHJpbmcgYW5kIHRFcGxPYmRVU3RyaW5nIGhhcyB0aGUgc2FtZSBtZW1iZXJzKQorCQkJRGF0YVNpemUgPSAoKHRFcGxPYmRPU3RyaW5nIE1FTSAqKSBwRGF0YSktPm1fU2l6ZTsKKwkJfSBlbHNlIHsKKwkJCS8vIFRoZSBjdXJyZW50IHBvc2l0aW9uIGlzIG5vdCBkZWNsZWFyZWQuIFRoZSBzdHJpbmcKKwkJCS8vIGlzIGxvY2F0ZWQgaW4gUk9NLCB0aGVyZWZvciB1c2UgZGVmYXVsdCBwb2ludGVyLgorCQkJcERhdGEgPSAodm9pZCAqKXBTdWJJbmRleEVudHJ5X3AtPm1fcERlZmF1bHQ7CisJCQlpZiAoKENPTlNUIHZvaWQgUk9NICopcERhdGEgIT0gKENPTlNUIHZvaWQgUk9NICopTlVMTCkgeworCQkJCS8vIFRoZSBtYXguIHNpemUgb2Ygc3RyaW5ncyBkZWZpbmVkIGJ5IFNUUklORy1NYWNybyBpcyBzdG9yZWQgaW4KKwkJCQkvLyB0RXBsT2JkVlN0cmluZyBvZiBkZWZhdWx0IHZhbHVlLgorCQkJCURhdGFTaXplID0KKwkJCQkgICAgKChDT05TVCB0RXBsT2JkT1N0cmluZyBST00gKikgcERhdGEpLT4KKwkJCQkgICAgbV9TaXplOworCQkJfQorCQl9CisJCWJyZWFrOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBrRXBsT2JkVHlwSW50MjQ6CisJY2FzZSBrRXBsT2JkVHlwVUludDI0OgorCisJCURhdGFTaXplID0gMzsKKwkJYnJlYWs7CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIGtFcGxPYmRUeXBJbnQ0MDoKKwljYXNlIGtFcGxPYmRUeXBVSW50NDA6CisKKwkJRGF0YVNpemUgPSA1OworCQlicmVhazsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWNhc2Uga0VwbE9iZFR5cEludDQ4OgorCWNhc2Uga0VwbE9iZFR5cFVJbnQ0ODoKKworCQlEYXRhU2l6ZSA9IDY7CisJCWJyZWFrOworCisJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJY2FzZSBrRXBsT2JkVHlwSW50NTY6CisJY2FzZSBrRXBsT2JkVHlwVUludDU2OgorCisJCURhdGFTaXplID0gNzsKKwkJYnJlYWs7CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIGtFcGxPYmRUeXBJbnQ2NDoKKwljYXNlIGtFcGxPYmRUeXBVSW50NjQ6CisJY2FzZSBrRXBsT2JkVHlwUmVhbDY0OgorCisJCURhdGFTaXplID0gODsKKwkJYnJlYWs7CisKKwkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwljYXNlIGtFcGxPYmRUeXBUaW1lT2ZEYXk6CisJY2FzZSBrRXBsT2JkVHlwVGltZURpZmY6CisKKwkJRGF0YVNpemUgPSA2OworCQlicmVhazsKKworCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiBEYXRhU2l6ZTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkR2V0T2JqZWN0RGVmYXVsdFB0cigpCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIHRvIGdldCB0aGUgZGVmYXVsdCBwb2ludGVyICh0eXBlIHNwZWNpZmljKQorLy8KKy8vIFBhcmFtZXRlcnM6ICBwU3ViSW5kZXhFbnRyeV9wICAgID0gcG9pbnRlciB0byBzdWJpbmRleCBzdHJ1Y3R1cmUKKy8vCisvLyBSZXR1cm5zOiAgICAgKHZvaWQgKikgICA9IHBvaW50ZXIgdG8gZGVmYXVsdCB2YWx1ZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkICpFcGxPYmRHZXRPYmplY3REZWZhdWx0UHRyKHRFcGxPYmRTdWJFbnRyeVB0ciBwU3ViSW5kZXhFbnRyeV9wKQoreworCisJdm9pZCAqcERlZmF1bHQ7CisJdEVwbE9iZFR5cGUgVHlwZTsKKworCUFTU0VSVE1TRyhwU3ViSW5kZXhFbnRyeV9wICE9IE5VTEwsCisJCSAgIkVwbE9iZEdldE9iamVjdERlZmF1bHRQdHIoKTogcG9pbnRlciB0byBTdWJFbnRyeSBub3QgdmFsaWQhXG4iKTsKKworCS8vIGdldCBhZGRyZXNzIHRvIGRlZmF1bHQgZGF0YSBmcm9tIGRlZmF1bHQgcG9pbnRlcgorCXBEZWZhdWx0ID0gcFN1YkluZGV4RW50cnlfcC0+bV9wRGVmYXVsdDsKKwlpZiAocERlZmF1bHQgIT0gTlVMTCkgeworCQkvLyB0aGVyZSBhcmUgc29tZSBzcGVjaWFsIHR5cGVzLCB3aG9zZSBkZWZhdWx0IHBvaW50ZXIgYWx3YXlzIGlzIE5VTEwgb3IgaGFzIHRvIGdldCBmcm9tIG90aGVyIHN0cnVjdHVyZQorCQkvLyBnZXQgdHlwZSBmcm9tIHN1YmluZGV4IHN0cnVjdHVyZQorCQlUeXBlID0gcFN1YkluZGV4RW50cnlfcC0+bV9UeXBlOworCisJCS8vIGNoZWNrIGlmIG9iamVjdCB0eXBlIGlzIGEgc3RyaW5nIHZhbHVlCisJCWlmICgoVHlwZSA9PSBrRXBsT2JkVHlwVlN0cmluZykJLyogfHwKKwkJCQkJCSAgIChUeXBlID09IGtFcGxPYmRUeXBVU3RyaW5nKSAqLyApIHsKKworCQkJLy8gRVBMX09CRF9TVUJJTkRFWF9SQU1fVlNUUklORworCQkJLy8gICAgdEVwbE9iZFNpemUgICAgICAgICBtX1NpemU7ICAgICAgIC0tPiBzaXplIG9mIGRlZmF1bHQgc3RyaW5nCisJCQkvLyAgICBjaGFyICogICAgbV9wRGVmU3RyaW5nOyAtLT4gcG9pbnRlciB0byAgZGVmYXVsdCBzdHJpbmcKKwkJCS8vICAgIGNoYXIgKiAgICBtX3BTdHJpbmc7ICAgIC0tPiBwb2ludGVyIHRvIHN0cmluZyBpbiBSQU0KKwkJCS8vCisJCQlwRGVmYXVsdCA9CisJCQkgICAgKHZvaWQgKikoKHRFcGxPYmRWU3RyaW5nICopIHBEZWZhdWx0KS0+bV9wU3RyaW5nOworCQl9IGVsc2UgaWYgKFR5cGUgPT0ga0VwbE9iZFR5cE9TdHJpbmcpIHsKKwkJCXBEZWZhdWx0ID0KKwkJCSAgICAodm9pZCAqKSgodEVwbE9iZE9TdHJpbmcgKikgcERlZmF1bHQpLT5tX3BTdHJpbmc7CisJCX0KKwl9CisKKwlyZXR1cm4gcERlZmF1bHQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkR2V0VmFyRW50cnkoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBnZXRzIGEgdmFyaWFibGUgZW50cnkgb2YgYW4gb2JqZWN0CisvLworLy8gUGFyYW1ldGVyczogIHBTdWJpbmRleEVudHJ5X3AKKy8vICAgICAgICAgICAgICBwcFZhckVudHJ5X3AKKy8vCisvLyBSZXR1cm46ICAgICAgdENvcEtlcm5lbAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE9iZEdldFZhckVudHJ5KHRFcGxPYmRTdWJFbnRyeVB0ciBwU3ViaW5kZXhFbnRyeV9wLAorCQkJCSAgICB0RXBsT2JkVmFyRW50cnkgTUVNICoqIHBwVmFyRW50cnlfcCkKK3sKKworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbE9iZFZhckVudHJ5Tm90RXhpc3Q7CisKKwlBU1NFUlQocHBWYXJFbnRyeV9wICE9IE5VTEwpOwkvLyBpcyBub3QgYWxsb3dlZCB0byBiZSBOVUxMCisJQVNTRVJUKHBTdWJpbmRleEVudHJ5X3AgIT0gTlVMTCk7CisKKwkvLyBjaGVjayBWQVItRmxhZyAtIG9ubHkgdGhpcyBvYmplY3QgcG9pbnRzIHRvIHZhcmlhYmxlcworCWlmICgocFN1YmluZGV4RW50cnlfcC0+bV9BY2Nlc3MgJiBrRXBsT2JkQWNjVmFyKSAhPSAwKSB7CisJCS8vIGNoZWNrIGlmIG9iamVjdCBpcyBhbiBhcnJheQorCQlpZiAoKHBTdWJpbmRleEVudHJ5X3AtPm1fQWNjZXNzICYga0VwbE9iZEFjY0FycmF5KSAhPSAwKSB7CisJCQkqcHBWYXJFbnRyeV9wID0KKwkJCSAgICAmKCh0RXBsT2JkVmFyRW50cnkgTUVNICopIHBTdWJpbmRleEVudHJ5X3AtPgorCQkJICAgICAgbV9wQ3VycmVudClbcFN1YmluZGV4RW50cnlfcC0+bV91aVN1YkluZGV4IC0gMV07CisJCX0gZWxzZSB7CisJCQkqcHBWYXJFbnRyeV9wID0KKwkJCSAgICAodEVwbE9iZFZhckVudHJ5IE1FTSAqKSBwU3ViaW5kZXhFbnRyeV9wLT4KKwkJCSAgICBtX3BDdXJyZW50OworCQl9CisKKwkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJfQorCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRHZXRFbnRyeSgpCisvLworLy8gRGVzY3JpcHRpb246IGdldHMgYSBpbmRleCBlbnRyeSBmcm9tIE9ECisvLworLy8gUGFyYW1ldGVyczogIHVpSW5kZXhfcCAgICAgICA9ICAgSW5kZXggbnVtYmVyCisvLyAgICAgICAgICAgICAgdWlTdWJpbmRleF9wICAgID0gICBTdWJpbmRleCBudW1iZXIKKy8vICAgICAgICAgICAgICBwcE9iZEVudHJ5X3AgICAgPSAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGVudHJ5CisvLyAgICAgICAgICAgICAgcHBPYmRTdWJFbnRyeV9wID0gICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBzdWJlbnRyeQorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsCisKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxPYmRHZXRFbnRyeShFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCSB1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCSB1bnNpZ25lZCBpbnQgdWlTdWJpbmRleF9wLAorCQkJCSB0RXBsT2JkRW50cnlQdHIgKiBwcE9iZEVudHJ5X3AsCisJCQkJIHRFcGxPYmRTdWJFbnRyeVB0ciAqIHBwT2JkU3ViRW50cnlfcCkKK3sKKworCXRFcGxPYmRFbnRyeVB0ciBwT2JkRW50cnk7CisJdEVwbE9iZENiUGFyYW0gTUVNIENiUGFyYW07CisJdEVwbEtlcm5lbCBSZXQ7CisKKwkvLyBjaGVjayBmb3IgYWxsIEFQSSBmdW5jdGlvbiBpZiBpbnN0YW5jZSBpcyB2YWxpZAorCUVQTF9NQ09fQ0hFQ0tfSU5TVEFOQ0VfU1RBVEUoKTsKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gZ2V0IGFkZHJlc3Mgb2YgZW50cnkgb2YgaW5kZXgKKwlSZXQgPQorCSAgICBFcGxPYmRHZXRJbmRleEludGVybigmRVBMX01DT19HTEJfVkFSKG1fT2JkSW5pdFBhcmFtKSwgdWlJbmRleF9wLAorCQkJCSAmcE9iZEVudHJ5KTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBnZXQgYWRkcmVzcyBvZiBlbnRyeSBvZiBzdWJpbmRleAorCVJldCA9IEVwbE9iZEdldFN1YmluZGV4SW50ZXJuKHBPYmRFbnRyeSwgdWlTdWJpbmRleF9wLCBwcE9iZFN1YkVudHJ5X3ApOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIGNhbGwgY2FsbGJhY2sgZnVuY3Rpb24gdG8gaW5mb3JtIHVzZXIvc3RhY2sgdGhhdCBhbiBvYmplY3Qgd2lsbCBiZSBzZWFyY2hlZAorCS8vIGlmIHRoZSBjYWxsZWQgbW9kdWxlIHJldHVybmVzIGFuIGVycm9yIHRoZW4gd2UgYWJvcnQgdGhlIHNlYXJjaGluZyB3aXRoIGtFcGxPYmRJbmRleE5vdEV4aXN0CisJQ2JQYXJhbS5tX3VpSW5kZXggPSB1aUluZGV4X3A7CisJQ2JQYXJhbS5tX3VpU3ViSW5kZXggPSB1aVN1YmluZGV4X3A7CisJQ2JQYXJhbS5tX3BBcmcgPSBOVUxMOworCUNiUGFyYW0ubV9PYmRFdmVudCA9IGtFcGxPYmRFdkNoZWNrRXhpc3Q7CisJUmV0ID0gRXBsT2JkQ2FsbE9iamVjdENhbGxiYWNrKEVQTF9NQ09fSU5TVEFOQ0VfUFRSXworCQkJCSAgICAgICBwT2JkRW50cnktPm1fZnBDYWxsYmFjaywgJkNiUGFyYW0pOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJUmV0ID0ga0VwbE9iZEluZGV4Tm90RXhpc3Q7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBpdCBpcyBhbGxvd2VkIHRvIHNldCBwcE9iZEVudHJ5X3AgdG8gTlVMTAorCS8vIGlmIHNvLCBubyBhZGRyZXNzIHdpbGwgYmUgd3JpdHRlbiB0byBjYWxsaW5nIGZ1bmN0aW9uCisJaWYgKHBwT2JkRW50cnlfcCAhPSBOVUxMKSB7CisJCSpwcE9iZEVudHJ5X3AgPSBwT2JkRW50cnk7CisJfQorCisgICAgICBFeGl0OgorCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRHZXRPYmplY3RDdXJyZW50UHRyKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gdG8gZ2V0IEN1cnJlbnQgcG9pbnRlciAodHlwZSBzcGVjaWZpYykKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFN1YkluZGV4RW50cnlfcAorLy8KKy8vIFJldHVybjogICAgICB2b2lkIE1FTSoKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBNRU0gKkVwbE9iZEdldE9iamVjdEN1cnJlbnRQdHIodEVwbE9iZFN1YkVudHJ5UHRyIHBTdWJJbmRleEVudHJ5X3ApCit7CisKKwl2b2lkIE1FTSAqcERhdGE7CisJdW5zaWduZWQgaW50IHVpQXJyYXlJbmRleDsKKwl0RXBsT2JkU2l6ZSBTaXplOworCisJcERhdGEgPSBwU3ViSW5kZXhFbnRyeV9wLT5tX3BDdXJyZW50OworCisJLy8gY2hlY2sgaWYgY29uc3RhbnQgb2JqZWN0CisJaWYgKHBEYXRhICE9IE5VTEwpIHsKKwkJLy8gY2hlY2sgaWYgb2JqZWN0IGlzIGFuIGFycmF5CisJCWlmICgocFN1YkluZGV4RW50cnlfcC0+bV9BY2Nlc3MgJiBrRXBsT2JkQWNjQXJyYXkpICE9IDApIHsKKwkJCS8vIGNhbGN1bGF0ZSBjb3JyZWN0IGRhdGEgcG9pbnRlcgorCQkJdWlBcnJheUluZGV4ID0gcFN1YkluZGV4RW50cnlfcC0+bV91aVN1YkluZGV4IC0gMTsKKwkJCWlmICgocFN1YkluZGV4RW50cnlfcC0+bV9BY2Nlc3MgJiBrRXBsT2JkQWNjVmFyKSAhPSAwKSB7CisJCQkJU2l6ZSA9IHNpemVvZih0RXBsT2JkVmFyRW50cnkpOworCQkJfSBlbHNlIHsKKwkJCQlTaXplID0gRXBsT2JkR2V0T2JqZWN0U2l6ZShwU3ViSW5kZXhFbnRyeV9wKTsKKwkJCX0KKwkJCXBEYXRhID0gKChCWVRFIE1FTSAqKSBwRGF0YSkgKyAoU2l6ZSAqIHVpQXJyYXlJbmRleCk7CisJCX0KKwkJLy8gY2hlY2sgaWYgVmFyRW50cnkKKwkJaWYgKChwU3ViSW5kZXhFbnRyeV9wLT5tX0FjY2VzcyAmIGtFcGxPYmRBY2NWYXIpICE9IDApIHsKKwkJCS8vIFRoZSBkYXRhIHBvaW50ZXIgaXMgc3RvcmVkIGluIFZhckVudHJ5LT5wRGF0YQorCQkJcERhdGEgPSAoKHRFcGxPYmRWYXJFbnRyeSBNRU0gKikgcERhdGEpLT5tX3BEYXRhOworCQl9CisJCS8vIHRoZSBkZWZhdWx0IHBvaW50ZXIgaXMgc3RvcmVkIGZvciBzdHJpbmdzIGluIHRFcGxPYmRWU3RyaW5nCisJCWVsc2UgaWYgKChwU3ViSW5kZXhFbnRyeV9wLT5tX1R5cGUgPT0ga0VwbE9iZFR5cFZTdHJpbmcpCS8qIHx8CisJCQkJCQkJCQkJICAgKHBTdWJJbmRleEVudHJ5X3AtPm1fVHlwZSA9PSBrRXBsT2JkVHlwVVN0cmluZykgICAgKi8KKwkJCSApIHsKKwkJCXBEYXRhID0KKwkJCSAgICAodm9pZCBNRU0gKikoKHRFcGxPYmRWU3RyaW5nIE1FTSAqKSBwRGF0YSktPgorCQkJICAgIG1fcFN0cmluZzsKKwkJfSBlbHNlIGlmIChwU3ViSW5kZXhFbnRyeV9wLT5tX1R5cGUgPT0ga0VwbE9iZFR5cE9TdHJpbmcpIHsKKwkJCXBEYXRhID0KKwkJCSAgICAodm9pZCBNRU0gKikoKHRFcGxPYmRPU3RyaW5nIE1FTSAqKSBwRGF0YSktPgorCQkJICAgIG1fcFN0cmluZzsKKwkJfQorCX0KKworCXJldHVybiBwRGF0YTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRHZXRJbmRleEludGVybigpCisvLworLy8gRGVzY3JpcHRpb246IGdldHMgYSBpbmRleCBlbnRyeSBmcm9tIE9ECisvLworLy8gUGFyYW1ldGVyczogIHBJbml0UGFyYW1fcAorLy8gICAgICAgICAgICAgIHVpSW5kZXhfcAorLy8gICAgICAgICAgICAgIHBwT2JkRW50cnlfcAorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsT2JkR2V0SW5kZXhJbnRlcm4odEVwbE9iZEluaXRQYXJhbSBNRU0gKiBwSW5pdFBhcmFtX3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJICAgICAgIHRFcGxPYmRFbnRyeVB0ciAqIHBwT2JkRW50cnlfcCkKK3sKKworCXRFcGxPYmRFbnRyeVB0ciBwT2JkRW50cnk7CisJdEVwbEtlcm5lbCBSZXQ7CisJdW5zaWduZWQgaW50IHVpSW5kZXg7CisKKyNpZiAoZGVmaW5lZCAoRVBMX09CRF9VU0VSX09EKSAmJiAoRVBMX09CRF9VU0VSX09EICE9IEZBTFNFKSkKKworCXVuc2lnbmVkIGludCBuTG9vcDsKKworCS8vIGlmIHVzZXIgT0QgaXMgdXNlZCB0aGVuIG9iamVrdHMgYWxzbyBoYXMgdG8gYmUgc2VhcmNoZWQgaW4gdXNlciBPRAorCS8vIHRoZXJlIGlzIGxlc3MgY29kZSBuZWVkIGlmIHdlIGRvIHRoaXMgaW4gYSBsb29wCisJbkxvb3AgPSAyOworCisjZW5kaWYKKworCUFTU0VSVE1TRyhwcE9iZEVudHJ5X3AgIT0gTlVMTCwKKwkJICAiRXBsT2JkR2V0SW5kZXhJbnRlcm4oKTogcG9pbnRlciB0byBpbmRleCBlbnRyeSBpcyBOVUxMIVxuIik7CisKKwlSZXQgPSBrRXBsT2JkSW5kZXhOb3RFeGlzdDsKKworCS8vIGdldCBzdGFydCBhZGRyZXNzIG9mIE9EIHBhcnQKKwkvLyBzdGFydCBhZGRyZXNzIGRlcGVuZHMgb24gb2JqZWN0IGluZGV4IGJlY2F1c2UKKwkvLyBvYmplY3QgZGljdGlvbmFyeSBpcyBkaXZpZGVkIGluIDMgcGFydHMKKwlpZiAoKHVpSW5kZXhfcCA+PSAweDEwMDApICYmICh1aUluZGV4X3AgPCAweDIwMDApKSB7CisJCXBPYmRFbnRyeSA9IHBJbml0UGFyYW1fcC0+bV9wUGFydDsKKwl9IGVsc2UgaWYgKCh1aUluZGV4X3AgPj0gMHgyMDAwKSAmJiAodWlJbmRleF9wIDwgMHg2MDAwKSkgeworCQlwT2JkRW50cnkgPSBwSW5pdFBhcmFtX3AtPm1fcE1hbnVmYWN0dXJlclBhcnQ7CisJfQorCS8vIGluZGV4IHJhbmdlIDB4QTAwMCB0byAweEZGRkYgaXMgcmVzZXJ2ZWQgZm9yIERTUC00MDUKKwkvLyBEUy0zMDEgZGVmaW5lcyB0aGF0IHJhbmdlIDB4NjAwMCB0byAweDlGRkYgKCEhISkgaXMgc3RvcmVkIGlmICJzdG9yZSIgd2FzIHdyaXR0ZW4gdG8gMHgxMDEwLzMuCisJLy8gVGhlcmVmb3JlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpcyBPQkRfSU5DTFVERV9BMDAwX1RPX0RFVklDRV9QQVJUID0gRkFMU0UuCisJLy8gQnV0IGEgQ0FOb3BlbiBBcHBsaWNhdGlvbiB3aGljaCBkb2VzIG5vdCBpbXBsZW1lbnQgZHluYW1pYyBPRCBvciB1c2VyLU9EIGJ1dCB3YW50cyB0byB1c2Ugc3RhdGljIG9iamV0cyAweEEwMDAuLi4KKwkvLyBzaG91bGQgc2V0IE9CRF9JTkNMVURFX0EwMDBfVE9fREVWSUNFX1BBUlQgdG8gVFJVRS4KKworI2lmIChFUExfT0JEX0lOQ0xVREVfQTAwMF9UT19ERVZJQ0VfUEFSVCA9PSBGQUxTRSkKKwllbHNlIGlmICgodWlJbmRleF9wID49IDB4NjAwMCkgJiYgKHVpSW5kZXhfcCA8IDB4OUZGRikpCisjZWxzZQorCWVsc2UgaWYgKCh1aUluZGV4X3AgPj0gMHg2MDAwKSAmJiAodWlJbmRleF9wIDwgMHhGRkZGKSkKKyNlbmRpZgorCXsKKwkJcE9iZEVudHJ5ID0gcEluaXRQYXJhbV9wLT5tX3BEZXZpY2VQYXJ0OworCX0KKworI2lmIChkZWZpbmVkIChFUExfT0JEX1VTRVJfT0QpICYmIChFUExfT0JEX1VTRVJfT0QgIT0gRkFMU0UpKQorCisJLy8gaWYgaW5kZXggZG9lcyBub3QgbWF0Y2ggaW4gc3RhdGljIE9EIHRoZW4gaW5kZXggb25seSBoYXMgdG8gYmUgc2VhcmNoZWQgaW4gdXNlciBPRAorCWVsc2UgeworCQkvLyBiZWdpbiBmcm9tIGZpcnN0IGVudHJ5IG9mIHVzZXIgT0QgcGFydAorCQlwT2JkRW50cnkgPSBwSW5pdFBhcmFtX3AtPm1fcFVzZXJQYXJ0OworCisJCS8vIG5vIHVzZXIgT0QgaXMgYXZhaWxhYmxlCisJCWlmIChwT2JkRW50cnkgPT0gTlVMTCkgeworCQkJZ290byBFeGl0OworCQl9CisJCS8vIGxvb3AgbXVzdCBvbmx5IHJ1biBvbmNlCisJCW5Mb29wID0gMTsKKwl9CisKKwlkbyB7CisKKyNlbHNlCisKKwkvLyBubyB1c2VyIE9EIGlzIGF2YWlsYWJsZQorCS8vIHNvIG90aGVyIG9iamVjdCBjYW4gYmUgZm91bmQgaW4gT0QKKwllbHNlIHsKKwkJUmV0ID0ga0VwbE9iZElsbGVnYWxQYXJ0OworCQlnb3RvIEV4aXQ7CisJfQorCisjZW5kaWYKKworCS8vIG5vdGU6CisJLy8gVGhlIGVuZCBvZiBJbmRleCB0YWJsZSBpcyBtYXJrZWQgd2l0aCBtX3VpSW5kZXggPSAweEZGRkYuCisJLy8gSWYgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aXRoIHdJbmRleF9wID0gMHhGRkZGLCBlbnRyeQorCS8vIHNob3VsZCBub3QgYmUgZm91bmQuIFRoZXJlZm9yIGl0IGlzIGltcG9ydGFudCB0byB1c2UKKwkvLyB3aGlsZXt9IGluc3RlYWQgb2YgZG97fXdoaWxlICEhIQorCisJLy8gZ2V0IGZpcnN0IGluZGV4IG9mIGluZGV4IHRhYmxlCisJdWlJbmRleCA9IHBPYmRFbnRyeS0+bV91aUluZGV4OworCisJLy8gc2VhcmNoIEluZGV4IGluIE9EIHBhcnQKKwl3aGlsZSAodWlJbmRleCAhPSBFUExfT0JEX1RBQkxFX0lOREVYX0VORCkgeworCQkvLyBnbyB0byB0aGUgZW5kIG9mIHRoaXMgZnVuY3Rpb24gaWYgaW5kZXggaXMgZm91bmQKKwkJaWYgKHVpSW5kZXhfcCA9PSB1aUluZGV4KSB7CisJCQkvLyB3cml0ZSBhZGRyZXNzIG9mIE9EIGVudHJ5IHRvIGNhbGxpbmcgZnVuY3Rpb24KKwkJCSpwcE9iZEVudHJ5X3AgPSBwT2JkRW50cnk7CisJCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQkvLyBvYmplY3RzIGFyZSBzb3J0ZWQgaW4gT0QKKwkJLy8gaWYgdGhlIGN1cnJlbnQgaW5kZXggaW4gT0QgaXMgZ3JlYXRlciB0aGFuIHRoZSBpbmRleCB3aGljaCBpcyB0byBzZWFyY2ggdGhlbiBicmVhayBsb29wCisJCS8vIGluIHRoaXMgY2FzZSB1c2VyIE9EIGhhcyB0byBiZSBzZWFyY2ggdG9vCisJCWlmICh1aUluZGV4X3AgPCB1aUluZGV4KSB7CisJCQlicmVhazsKKwkJfQorCQkvLyBuZXh0IGVudHJ5IGluIGluZGV4IHRhYmxlCisJCXBPYmRFbnRyeSsrOworCisJCS8vIGdldCBuZXh0IGluZGV4IG9mIGluZGV4IHRhYmxlCisJCXVpSW5kZXggPSBwT2JkRW50cnktPm1fdWlJbmRleDsKKwl9CisKKyNpZiAoZGVmaW5lZCAoRVBMX09CRF9VU0VSX09EKSAmJiAoRVBMX09CRF9VU0VSX09EICE9IEZBTFNFKSkKKworCS8vIGJlZ2luIGZyb20gZmlyc3QgZW50cnkgb2YgdXNlciBPRCBwYXJ0CisJcE9iZEVudHJ5ID0gcEluaXRQYXJhbV9wLT5tX3BVc2VyUGFydDsKKworCS8vIG5vIHVzZXIgT0QgaXMgYXZhaWxhYmxlCisJaWYgKHBPYmRFbnRyeSA9PSBOVUxMKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gc3dpdGNoIG5leHQgbG9vcCBmb3IgdXNlciBPRAorCW5Mb29wLS07CisKK30KKword2hpbGUgKG5Mb29wID4gMCkgOworCisjZW5kaWYKKworICAgIC8vIGluIHRoaXMgbGluZSBJbmRleCB3YXMgbm90IGZvdW5kCisKK0V4aXQ6CisKK3JldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkR2V0U3ViaW5kZXhJbnRlcm4oKQorLy8KKy8vIERlc2NyaXB0aW9uOiBnZXRzIGEgc3ViaW5kZXggZW50cnkgZnJvbSBhIGluZGV4IGVudHJ5CisvLworLy8gUGFyYW1ldGVyczogIHBPYmRFbnRyeV9wCisvLyAgICAgICAgICAgICAgYlN1YkluZGV4X3AKKy8vICAgICAgICAgICAgICBwcE9iZFN1YkVudHJ5X3AKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE9iZEdldFN1YmluZGV4SW50ZXJuKHRFcGxPYmRFbnRyeVB0ciBwT2JkRW50cnlfcCwKKwkJCQkJICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkgIHRFcGxPYmRTdWJFbnRyeVB0ciAqIHBwT2JkU3ViRW50cnlfcCkKK3sKKworCXRFcGxPYmRTdWJFbnRyeVB0ciBwU3ViRW50cnk7CisJdW5zaWduZWQgaW50IG5TdWJJbmRleENvdW50OworCXRFcGxLZXJuZWwgUmV0OworCisJQVNTRVJUTVNHKHBPYmRFbnRyeV9wICE9IE5VTEwsCisJCSAgIkVwbE9iZEdldFN1YmluZGV4SW50ZXJuKCk6IHBvaW50ZXIgdG8gaW5kZXggaXMgTlVMTCFcbiIpOworCUFTU0VSVE1TRyhwcE9iZFN1YkVudHJ5X3AgIT0gTlVMTCwKKwkJICAiRXBsT2JkR2V0U3ViaW5kZXhJbnRlcm4oKTogcG9pbnRlciB0byBzdWJpbmRleCBpcyBOVUxMIVxuIik7CisKKwlSZXQgPSBrRXBsT2JkU3ViaW5kZXhOb3RFeGlzdDsKKworCS8vIGdldCBzdGFydCBhZGRyZXNzIG9mIHN1YmluZGV4IHRhYmxlIGFuZCBjb3VudCBvZiBzdWJpbmRpY2VzCisJcFN1YkVudHJ5ID0gcE9iZEVudHJ5X3AtPm1fcFN1YkluZGV4OworCW5TdWJJbmRleENvdW50ID0gcE9iZEVudHJ5X3AtPm1fdWlDb3VudDsKKwlBU1NFUlRNU0coKHBTdWJFbnRyeSAhPSBOVUxMKSAmJiAoblN1YkluZGV4Q291bnQgPiAwKSwgIk9iZEdldFN1YmluZGV4SW50ZXJuKCk6IGludmFsaWQgc3ViaW5kZXggdGFibGUgd2l0aGluIGluZGV4IHRhYmxlIVxuIik7CS8vIHNob3VsZCBuZXZlciBiZSBOVUxMCisKKwkvLyBzZWFyY2ggc3ViaW5kZXggaW4gc3ViaW5kZXggdGFibGUKKwl3aGlsZSAoblN1YkluZGV4Q291bnQgPiAwKSB7CisJCS8vIGNoZWNrIGlmIGFycmF5IGlzIGZvdW5kCisJCWlmICgocFN1YkVudHJ5LT5tX0FjY2VzcyAmIGtFcGxPYmRBY2NBcnJheSkgIT0gMCkgeworCQkJLy8gY2hlY2sgaWYgc3ViaW5kZXggaXMgaW4gcmFuZ2UKKwkJCWlmICh1aVN1YkluZGV4X3AgPCBwT2JkRW50cnlfcC0+bV91aUNvdW50KSB7CisJCQkJLy8gdXBkYXRlIHN1YmluZGV4IG51bWJlciAoc3ViaW5kZXggZW50cnkgb2YgYW4gYXJyYXkgaXMgYWx3YXlzIGluIFJBTSAhISEpCisJCQkJcFN1YkVudHJ5LT5tX3VpU3ViSW5kZXggPSB1aVN1YkluZGV4X3A7CisJCQkJKnBwT2JkU3ViRW50cnlfcCA9IHBTdWJFbnRyeTsKKwkJCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCX0KKwkJLy8gZ28gdG8gdGhlIGVuZCBvZiB0aGlzIGZ1bmN0aW9uIGlmIHN1YmluZGV4IGlzIGZvdW5kCisJCWVsc2UgaWYgKHVpU3ViSW5kZXhfcCA9PSBwU3ViRW50cnktPm1fdWlTdWJJbmRleCkgeworCQkJKnBwT2JkU3ViRW50cnlfcCA9IHBTdWJFbnRyeTsKKwkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJZ290byBFeGl0OworCQl9CisJCS8vIG9iamVjdHMgYXJlIHNvcnRlZCBpbiBPRAorCQkvLyBpZiB0aGUgY3VycmVudCBzdWJpbmRleCBpbiBPRCBpcyBncmVhdGVyIHRoYW4gdGhlIHN1YmluZGV4IHdoaWNoIGlzIHRvIHNlYXJjaCB0aGVuIGJyZWFrIGxvb3AKKwkJLy8gaW4gdGhpcyBjYXNlIHVzZXIgT0QgaGFzIHRvIGJlIHNlYXJjaCB0b28KKwkJaWYgKHVpU3ViSW5kZXhfcCA8IHBTdWJFbnRyeS0+bV91aVN1YkluZGV4KSB7CisJCQlicmVhazsKKwkJfQorCisJCXBTdWJFbnRyeSsrOworCQluU3ViSW5kZXhDb3VudC0tOworCX0KKworCS8vIGluIHRoaXMgbGluZSBTdWJJbmRleCB3YXMgbm90IGZvdW50CisKKyAgICAgIEV4aXQ6CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZFNldFN0b3JlTG9hZE9iakNhbGxiYWNrKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gc2V0IGFkZHJlc3MgdG8gY2FsbGJhY2tmdW5jdGlvbiBmb3IgY29tbWFuZCBTdG9yZSBhbmQgTG9hZAorLy8KKy8vIFBhcmFtZXRlcnM6ICBmcENhbGxiYWNrX3AKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgKEVQTF9PQkRfVVNFX1NUT1JFX1JFU1RPUkUgIT0gRkFMU0UpCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMKK0VwbE9iZFNldFN0b3JlTG9hZE9iakNhbGxiYWNrKEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkgICAgICB0RXBsT2JkU3RvcmVMb2FkT2JqQ2FsbGJhY2sgZnBDYWxsYmFja19wKQoreworCisJRVBMX01DT19DSEVDS19JTlNUQU5DRV9TVEFURSgpOworCisJLy8gc2V0IG5ldyBhZGRyZXNzIG9mIGNhbGxiYWNrIGZ1bmN0aW9uCisJRVBMX01DT19HTEJfVkFSKG1fZnBTdG9yZUxvYWRPYmpDYWxsYmFjaykgPSBmcENhbGxiYWNrX3A7CisKKwlyZXR1cm4ga0VwbFN1Y2Nlc3NmdWw7CisKK30KKyNlbmRpZiAvLyAoRVBMX09CRF9VU0VfU1RPUkVfUkVTVE9SRSAhPSBGQUxTRSkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkQWNjZXNzT2RQYXJ0SW50ZXJuKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcnVucyB0aHJvdWdoIE9EIGFuZCBleGVjdXRlcyBhIGpvYgorLy8KKy8vIFBhcmFtZXRlcnM6ICBDdXJyZW50T2RQYXJ0X3AKKy8vICAgICAgICAgICAgICBwT2JkRW50eV9wCisvLyAgICAgICAgICAgICAgRGlyZWN0aW9uX3AgICAgID0gd2hhdCBpcyB0byBkbyAobG9hZCB2YWx1ZXMgZnJvbSBmbGFzaCBvciBFRVBST00sIHN0b3JlLCAuLi4pCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxPYmRBY2Nlc3NPZFBhcnRJbnRlcm4oRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJICAgdEVwbE9iZFBhcnQgQ3VycmVudE9kUGFydF9wLAorCQkJCQkgICB0RXBsT2JkRW50cnlQdHIgcE9iZEVudHlfcCwKKwkJCQkJICAgdEVwbE9iZERpciBEaXJlY3Rpb25fcCkKK3sKKworCXRFcGxPYmRTdWJFbnRyeVB0ciBwU3ViSW5kZXg7CisJdW5zaWduZWQgaW50IG5TdWJJbmRleENvdW50OworCXRFcGxPYmRBY2Nlc3MgQWNjZXNzOworCXZvaWQgTUVNICpwRHN0RGF0YTsKKwl2b2lkICpwRGVmYXVsdDsKKwl0RXBsT2JkU2l6ZSBPYmpTaXplOworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxPYmRDYlN0b3JlUGFyYW0gTUVNIENiU3RvcmU7CisJdEVwbE9iZFZhckVudHJ5IE1FTSAqcFZhckVudHJ5OworCisJQVNTRVJUKHBPYmRFbnR5X3AgIT0gTlVMTCk7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIHByZXBhcmUgc3RydWN0dXJlIGZvciBTVE9SRSBSRVNUT1JFIGNhbGxiYWNrIGZ1bmN0aW9uCisJQ2JTdG9yZS5tX2JDdXJyZW50T2RQYXJ0ID0gKEJZVEUpIEN1cnJlbnRPZFBhcnRfcDsKKwlDYlN0b3JlLm1fcERhdGEgPSBOVUxMOworCUNiU3RvcmUubV9PYmpTaXplID0gMDsKKworCS8vIGNvbW1hbmQgb2YgZmlyc3QgYWN0aW9uIGRlcGVuZHMgb24gZGlyZWN0aW9uIHRvIGFjY2VzcworI2lmIChFUExfT0JEX1VTRV9TVE9SRV9SRVNUT1JFICE9IEZBTFNFKQorCWlmIChEaXJlY3Rpb25fcCA9PSBrRXBsT2JkRGlyTG9hZCkgeworCQlDYlN0b3JlLm1fYkNvbW1hbmQgPSAoQllURSkga0VwbE9iZENvbW1PcGVuUmVhZDsKKworCQkvLyBjYWxsIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBwcmV2aW91cyBjb21tYW5kCisJCVJldCA9IEVwbE9iZENhbGxTdG9yZUNhbGxiYWNrKEVQTF9NQ09fSU5TVEFOQ0VfUFRSXyAmIENiU3RvcmUpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJLy8gc2V0IGNvbW1hbmQgZm9yIGluZGV4IGFuZCBzdWJpbmRleCBsb29wCisJCUNiU3RvcmUubV9iQ29tbWFuZCA9IChCWVRFKSBrRXBsT2JkQ29tbVJlYWRPYmo7CisJfSBlbHNlIGlmIChEaXJlY3Rpb25fcCA9PSBrRXBsT2JkRGlyU3RvcmUpIHsKKwkJQ2JTdG9yZS5tX2JDb21tYW5kID0gKEJZVEUpIGtFcGxPYmRDb21tT3BlbldyaXRlOworCisJCS8vIGNhbGwgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHByZXZpb3VzIGNvbW1hbmQKKwkJUmV0ID0gRXBsT2JkQ2FsbFN0b3JlQ2FsbGJhY2soRVBMX01DT19JTlNUQU5DRV9QVFJfICYgQ2JTdG9yZSk7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQkvLyBzZXQgY29tbWFuZCBmb3IgaW5kZXggYW5kIHN1YmluZGV4IGxvb3AKKwkJQ2JTdG9yZS5tX2JDb21tYW5kID0gKEJZVEUpIGtFcGxPYmRDb21tV3JpdGVPYmo7CisJfQorI2VuZGlmIC8vIChFUExfT0JEX1VTRV9TVE9SRV9SRVNUT1JFICE9IEZBTFNFKQorCisJLy8gd2Ugc2hvdWxkIG5vdCByZXN0b3JlIHRoZSBPRCB2YWx1ZXMgaGVyZQorCS8vIHRoZSBuZXh0IE5NVCBjb21tYW5kICJSZXNldCBOb2RlIiBvciAiUmVzZXQgQ29tbXVuaWNhdGlvbiIgcmVzZXRzIHRoZSBPRCBkYXRhCisJaWYgKERpcmVjdGlvbl9wICE9IGtFcGxPYmREaXJSZXN0b3JlKSB7CisJCS8vIHdhbGsgdGhyb3VnaCBPRCBwYXJ0IHRpbGwgZW5kIGlzIGZvdW5kCisJCXdoaWxlIChwT2JkRW50eV9wLT5tX3VpSW5kZXggIT0gRVBMX09CRF9UQUJMRV9JTkRFWF9FTkQpIHsKKwkJCS8vIGdldCBhZGRyZXNzIHRvIHN1YmluZGV4IHRhYmxlIGFuZCBjb3VudCBvZiBzdWJpbmRpY2VzCisJCQlwU3ViSW5kZXggPSBwT2JkRW50eV9wLT5tX3BTdWJJbmRleDsKKwkJCW5TdWJJbmRleENvdW50ID0gcE9iZEVudHlfcC0+bV91aUNvdW50OworCQkJQVNTRVJUKChwU3ViSW5kZXggIT0gTlVMTCkgJiYgKG5TdWJJbmRleENvdW50ID4gMCkpOwkvLyBzaG91bGQgbmV2ZXIgYmUgTlVMTAorCisJCQkvLyB3YWxrIHRocm91Z2ggc3ViaW5kZXggdGFibGUgdGlsbCBhbGwgc3ViaW5pY2VzIHdlcmUgcmVzdG9yZWQKKwkJCXdoaWxlIChuU3ViSW5kZXhDb3VudCAhPSAwKSB7CisJCQkJQWNjZXNzID0gKHRFcGxPYmRBY2Nlc3MpIHBTdWJJbmRleC0+bV9BY2Nlc3M7CisKKwkJCQkvLyBnZXQgcG9pbnRlciB0byBjdXJyZW50IGFuZCBkZWZhdWx0IGRhdGEKKwkJCQlwRGVmYXVsdCA9IEVwbE9iZEdldE9iamVjdERlZmF1bHRQdHIocFN1YkluZGV4KTsKKwkJCQlwRHN0RGF0YSA9IEVwbE9iZEdldE9iamVjdEN1cnJlbnRQdHIocFN1YkluZGV4KTsKKworCQkJCS8vIE5PVEUgKGZvciBrRXBsT2JkVHlwVlN0cmluZyk6CisJCQkJLy8gICAgICBUaGUgZnVuY3Rpb24gcmV0dXJuZXMgdGhlIG1heC4gbnVtYmVyIG9mIGJ5dGVzIGZvciBhCisJCQkJLy8gICAgICBjdXJyZW50IHN0cmluZy4KKwkJCQkvLyAgICAgIHIuZC46IEZvciBzdGluZ3MgdGhlIGRlZmF1bHQtc2l6ZSB3aWxsIGJlIHJlYWQgaW4gb3RoZXIgbGluZXMgZm9sbG93aW5nIChrRXBsT2JkRGlySW5pdCkuCisJCQkJT2JqU2l6ZSA9IEVwbE9iZEdldE9iamVjdFNpemUocFN1YkluZGV4KTsKKworCQkJCS8vIHN3aXRjaCBkaXJlY3Rpb24gb2YgT0QgYWNjZXNzCisJCQkJc3dpdGNoIChEaXJlY3Rpb25fcCkgeworCQkJCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCQkvLyBWYXJFbnRyeSBzdHJ1Y3R1cmVzIGhhcyB0byBiZSBpbml0aWFsaXplZAorCQkJCWNhc2Uga0VwbE9iZERpckluaXQ6CisKKwkJCQkJLy8gSWYgVkFSLUZsYWcgaXMgc2V0LCBtX3BDdXJyZW50IG1lYW5zIG5vdCBhZGRyZXNzIG9mIGRhdGEKKwkJCQkJLy8gYnV0IGFkZHJlc3Mgb2YgdEVwbE9iZFZhckVudHJ5LiBBZGRyZXNzIG9mIGRhdGEgaGFzIHRvIGJlIGdldCBmcm9tCisJCQkJCS8vIHRoaXMgc3RydWN0dXJlLgorCQkJCQlpZiAoKEFjY2VzcyAmIGtFcGxPYmRBY2NWYXIpICE9IDApIHsKKwkJCQkJCUVwbE9iZEdldFZhckVudHJ5KHBTdWJJbmRleCwKKwkJCQkJCQkJICAmcFZhckVudHJ5KTsKKwkJCQkJCUVwbE9iZEluaXRWYXJFbnRyeShwVmFyRW50cnksCisJCQkJCQkJCSAgIHBTdWJJbmRleC0+CisJCQkJCQkJCSAgIG1fVHlwZSwKKwkJCQkJCQkJICAgT2JqU2l6ZSk7CisvKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoQWNjZXNzICYga0VwbE9iZEFjY0FycmF5KSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXBsT2JkSW5pdFZhckVudHJ5IChwU3ViSW5kZXgtPm1fcEN1cnJlbnQsIHBTdWJJbmRleC0+bV9UeXBlLCBPYmpTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXBsT2JkSW5pdFZhckVudHJ5ICgodEVwbE9iZFZhckVudHJ5IE1FTSopICgoKEJZVEUgTUVNKikgcFN1YkluZGV4LT5tX3BDdXJyZW50KSArIChzaXplb2YgKHRFcGxPYmRWYXJFbnRyeSkgKiBwU3ViSW5kZXgtPm1fdWlTdWJJbmRleCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1YkluZGV4LT5tX1R5cGUsIE9ialNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyovCisJCQkJCQkvLyBhdCB0aGlzIHRpbWUgbm8gYXBwbGljYXRpb24gdmFyaWFibGUgaXMgZGVmaW5lZCAhISEKKwkJCQkJCS8vIHRoZXJlZm9yZSBkYXRhIGNhbiBub3QgYmUgY29waWVkLgorCQkJCQkJYnJlYWs7CisJCQkJCX0gZWxzZSBpZiAocFN1YkluZGV4LT5tX1R5cGUgPT0KKwkJCQkJCSAgIGtFcGxPYmRUeXBWU3RyaW5nKSB7CisJCQkJCQkvLyBJZiBwb2ludGVyIG1fcEN1cnJlbnQgaXMgbm90IGVxdWFsIHRvIE5VTEwgdGhlbiB0aGUKKwkJCQkJCS8vIHN0cmluZyB3YXMgZGVmaW5lZCB3aXRoIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1ZTVFJJTkcuIFRoZSBjdXJyZW50CisJCQkJCQkvLyBwb2ludGVyIHBvaW50cyB0byBzdHJ1Y3QgdEVwbE9iZFZTdHJpbmcgbG9jYXRlZCBpbiBNRU0uCisJCQkJCQkvLyBUaGUgZWxlbWVudCBzaXplIGluY2x1ZGVzIHRoZSBtYXguIG51bWJlciBvZgorCQkJCQkJLy8gYnl0ZXMuIFRoZSBlbGVtZW50IG1fcFN0cmluZyBpbmNsdWRlcyB0aGUgcG9pbnRlcgorCQkJCQkJLy8gdG8gc3RyaW5nIGluIE1FTS4gVGhlIG1lbW9yeSBsb2NhdGlvbiBvZiBkZWZhdWx0IHN0cmluZworCQkJCQkJLy8gbXVzdCBiZSBjb3BpZWQgdG8gbWVtb3J5IGxvY2F0aW9uIG9mIGN1cnJlbnQgc3RyaW5nLgorCisJCQkJCQlwRHN0RGF0YSA9CisJCQkJCQkgICAgcFN1YkluZGV4LT5tX3BDdXJyZW50OworCQkJCQkJaWYgKHBEc3REYXRhICE9IE5VTEwpIHsKKwkJCQkJCQkvLyAwOC1kZWMtMjAwNDogY29kZSBvcHRpbWl6YXRpb24gISEhCisJCQkJCQkJLy8gICAgICAgICAgICAgIGVudHJpZXMgKCh0RXBsT2JkVlN0cmluZ0RlZiBST00qKSBwU3ViSW5kZXgtPm1fcERlZmF1bHQpLT5tX3BTdHJpbmcKKwkJCQkJCQkvLyAgICAgICAgICAgICAgYW5kICgodEVwbE9iZFZTdHJpbmdEZWYgUk9NKikgcFN1YkluZGV4LT5tX3BEZWZhdWx0KS0+bV9TaXplIHdlcmUgcmVhZAorCQkJCQkJCS8vICAgICAgICAgICAgICB0d2ljZS4gdGhhdHMgbm90IG5lY2Vzc2FyeSEKKworCQkJCQkJCS8vIEZvciBjb3B5aW5nIGRhdGEgd2UgaGF2ZSB0byBzZXQgdGhlIGRlc3RpbmF0aW9uIHBvaW50ZXIgdG8gdGhlIHJlYWwgUkFNIHN0cmluZy4gVGhpcworCQkJCQkJCS8vIHBvaW50ZXIgdG8gUkFNIHN0cmluZyBpcyBsb2NhdGVkIGluIGRlZmF1bHQgc3RyaW5nIGluZm8gc3RydWN0dXJlLiAodHJhbnNsYXRlZCByLmQuKQorCQkJCQkJCXBEc3REYXRhID0KKwkJCQkJCQkgICAgKHZvaWQgTUVNCisJCQkJCQkJICAgICAqKSgodEVwbE9iZFZTdHJpbmdEZWYgUk9NICopIHBTdWJJbmRleC0+bV9wRGVmYXVsdCktPm1fcFN0cmluZzsKKwkJCQkJCQlPYmpTaXplID0KKwkJCQkJCQkgICAgKCh0RXBsT2JkVlN0cmluZ0RlZgorCQkJCQkJCSAgICAgIFJPTSAqKSBwU3ViSW5kZXgtPgorCQkJCQkJCSAgICAgbV9wRGVmYXVsdCktPgorCQkJCQkJCSAgICBtX1NpemU7CisKKwkJCQkJCQkoKHRFcGxPYmRWU3RyaW5nIE1FTSAqKQorCQkJCQkJCSBwU3ViSW5kZXgtPgorCQkJCQkJCSBtX3BDdXJyZW50KS0+CisJCQkJICAgICBtX3BTdHJpbmcgPSBwRHN0RGF0YTsKKwkJCQkJCQkoKHRFcGxPYmRWU3RyaW5nIE1FTSAqKQorCQkJCQkJCSBwU3ViSW5kZXgtPgorCQkJCQkJCSBtX3BDdXJyZW50KS0+bV9TaXplID0KKwkJCQkgICAgIE9ialNpemU7CisJCQkJCQl9CisKKwkJCQkJfSBlbHNlIGlmIChwU3ViSW5kZXgtPm1fVHlwZSA9PQorCQkJCQkJICAga0VwbE9iZFR5cE9TdHJpbmcpIHsKKwkJCQkJCXBEc3REYXRhID0KKwkJCQkJCSAgICBwU3ViSW5kZXgtPm1fcEN1cnJlbnQ7CisJCQkJCQlpZiAocERzdERhdGEgIT0gTlVMTCkgeworCQkJCQkJCS8vIDA4LWRlYy0yMDA0OiBjb2RlIG9wdGltaXphdGlvbiAhISEKKwkJCQkJCQkvLyAgICAgICAgICAgICAgZW50cmllcyAoKHRFcGxPYmRPU3RyaW5nRGVmIFJPTSopIHBTdWJJbmRleC0+bV9wRGVmYXVsdCktPm1fcFN0cmluZworCQkJCQkJCS8vICAgICAgICAgICAgICBhbmQgKCh0RXBsT2JkT1N0cmluZ0RlZiBST00qKSBwU3ViSW5kZXgtPm1fcERlZmF1bHQpLT5tX1NpemUgd2VyZSByZWFkCisJCQkJCQkJLy8gICAgICAgICAgICAgIHR3aWNlLiB0aGF0cyBub3QgbmVjZXNzYXJ5IQorCisJCQkJCQkJLy8gRm9yIGNvcHlpbmcgZGF0YSB3ZSBoYXZlIHRvIHNldCB0aGUgZGVzdGluYXRpb24gcG9pbnRlciB0byB0aGUgcmVhbCBSQU0gc3RyaW5nLiBUaGlzCisJCQkJCQkJLy8gcG9pbnRlciB0byBSQU0gc3RyaW5nIGlzIGxvY2F0ZWQgaW4gZGVmYXVsdCBzdHJpbmcgaW5mbyBzdHJ1Y3R1cmUuICh0cmFuc2xhdGVkIHIuZC4pCisJCQkJCQkJcERzdERhdGEgPQorCQkJCQkJCSAgICAodm9pZCBNRU0KKwkJCQkJCQkgICAgICopKCh0RXBsT2JkT1N0cmluZ0RlZiBST00gKikgcFN1YkluZGV4LT5tX3BEZWZhdWx0KS0+bV9wU3RyaW5nOworCQkJCQkJCU9ialNpemUgPQorCQkJCQkJCSAgICAoKHRFcGxPYmRPU3RyaW5nRGVmCisJCQkJCQkJICAgICAgUk9NICopIHBTdWJJbmRleC0+CisJCQkJCQkJICAgICBtX3BEZWZhdWx0KS0+CisJCQkJCQkJICAgIG1fU2l6ZTsKKworCQkJCQkJCSgodEVwbE9iZE9TdHJpbmcgTUVNICopCisJCQkJCQkJIHBTdWJJbmRleC0+CisJCQkJCQkJIG1fcEN1cnJlbnQpLT4KKwkJCQkgICAgIG1fcFN0cmluZyA9IHBEc3REYXRhOworCQkJCQkJCSgodEVwbE9iZE9TdHJpbmcgTUVNICopCisJCQkJCQkJIHBTdWJJbmRleC0+CisJCQkJCQkJIG1fcEN1cnJlbnQpLT5tX1NpemUgPQorCQkJCSAgICAgT2JqU2l6ZTsKKwkJCQkJCX0KKworCQkJCQl9CisKKwkJCQkJLy8gbm8gYnJlYWsgISEgYmVjYXVzZSBjb3B5IG9mIGRhdGEgaGFzIHRvIGRvbmUgdG9vLgorCisJCQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJCS8vIGFsbCBvYmplY3RzIGhhcyB0byBiZSByZXN0b3JlZCB3aXRoIGRlZmF1bHQgdmFsdWVzCisJCQkJY2FzZSBrRXBsT2JkRGlyUmVzdG9yZToKKworCQkJCQkvLyAwOS1kZWMtMjAwNCByLmQuOiBvcHRpbWl6YXRpb24hIHRoZSBzYW1lIGNvZGUgZm9yIGtFcGxPYmREaXJSZXN0b3JlIGFuZCBrRXBsT2JkRGlyTG9hZAorCQkJCQkvLyAgICAgICAgICAgICAgICAgICBpcyByZXBsYWNlZCB0byBmdW5jdGlvbiBPYmRDb3B5T2JqZWN0RGF0YSgpIHdpdGggYSBuZXcgcGFyYW1ldGVyLgorCisJCQkJCS8vIHJlc3RvcmUgb2JqZWN0IGRhdGEgZm9yIGluaXQgcGhhc2UKKwkJCQkJRXBsT2JkQ29weU9iamVjdERhdGEocERzdERhdGEsIHBEZWZhdWx0LAorCQkJCQkJCSAgICAgT2JqU2l6ZSwKKwkJCQkJCQkgICAgIHBTdWJJbmRleC0+bV9UeXBlKTsKKwkJCQkJYnJlYWs7CisKKwkJCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQkJLy8gb2JqZWN0cyB3aXRoIGF0dHJpYnV0ZSBrRXBsT2JkQWNjU3RvcmUgaGFzIHRvIGJlIGxvYWQgZnJvbSBFRVBST00gb3IgZnJvbSBhIGZpbGUKKwkJCQljYXNlIGtFcGxPYmREaXJMb2FkOgorCisJCQkJCS8vIHJlc3RvcmUgb2JqZWN0IGRhdGEgZm9yIGluaXQgcGhhc2UKKwkJCQkJRXBsT2JkQ29weU9iamVjdERhdGEocERzdERhdGEsIHBEZWZhdWx0LAorCQkJCQkJCSAgICAgT2JqU2l6ZSwKKwkJCQkJCQkgICAgIHBTdWJJbmRleC0+bV9UeXBlKTsKKworCQkJCQkvLyBubyBicmVhayAhISBiZWNhdXNlIGNhbGxiYWNrIGZ1bmN0aW9uIGhhcyB0byBiZSBjYWxsZWQgdG9vLgorCisJCQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJCS8vIG9iamVjdHMgd2l0aCBhdHRyaWJ1dGUga0VwbE9iZEFjY1N0b3JlIGhhcyB0byBiZSBzdG9yZWQgaW4gRUVQUk9NIG9yIGluIGEgZmlsZQorCQkJCWNhc2Uga0VwbE9iZERpclN0b3JlOgorCisJCQkJCS8vIHdoZW4gYXR0cmlidXRlIGtFcGxPYmRBY2NTdG9yZSBpcyBzZXQsIHRoZW4gY2FsbCBjYWxsYmFjayBmdW5jdGlvbgorI2lmIChFUExfT0JEX1VTRV9TVE9SRV9SRVNUT1JFICE9IEZBTFNFKQorCQkJCQlpZiAoKEFjY2VzcyAmIGtFcGxPYmRBY2NTdG9yZSkgIT0gMCkgeworCQkJCQkJLy8gZmlsbCBvdXQgZGF0YSBwb2ludGVyIGFuZCBzaXplIG9mIGRhdGEKKwkJCQkJCUNiU3RvcmUubV9wRGF0YSA9IHBEc3REYXRhOworCQkJCQkJQ2JTdG9yZS5tX09ialNpemUgPSBPYmpTaXplOworCisJCQkJCQkvLyBjYWxsIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciByZWFkIG9yIHdyaXRlIG9iamVjdAorCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBPYmRDYWxsU3RvcmVDYWxsYmFjaworCQkJCQkJICAgIChFUExfTUNPX0lOU1RBTkNFX1BUUl8gJgorCQkJCQkJICAgICBDYlN0b3JlKTsKKwkJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQl9CisJCQkJCX0KKyNlbmRpZiAvLyAoRVBMX09CRF9VU0VfU1RPUkVfUkVTVE9SRSAhPSBGQUxTRSkKKwkJCQkJYnJlYWs7CisKKwkJCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQkJLy8gaWYgT0QgQnVpbGRlciBrZXkgaGFzIHRvIGJlIGNoZWNrZWQgbm8gYWNjZXNzIHRvIHN1YmluZGV4IGFuZCBkYXRhIHNob3VsZCBiZSBtYWRlCisJCQkJY2FzZSBrRXBsT2JkRGlyT0JLQ2hlY2s6CisKKwkJCQkJLy8gbm8gYnJlYWsgISEgYmVjYXVzZSB3ZSB3YW50IHRvIGJyZWFrIHRoZSBzZWNvbmQgbG9vcCB0b28uCisKKwkJCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQkJLy8gdW5rbm93biBEaXJlY3Rpb24KKwkJCQlkZWZhdWx0OgorCisJCQkJCS8vIHNvIHdlIGNhbiBicmVhayB0aGUgc2Vjb25kIGxvb3AgZWFybGVyCisJCQkJCW5TdWJJbmRleENvdW50ID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJblN1YkluZGV4Q291bnQtLTsKKworCQkJCS8vIG5leHQgc3ViaW5kZXggZW50cnkKKwkJCQlpZiAoKEFjY2VzcyAmIGtFcGxPYmRBY2NBcnJheSkgPT0gMCkgeworCQkJCQlwU3ViSW5kZXgrKzsKKwkJCQkJaWYgKChuU3ViSW5kZXhDb3VudCA+IDApCisJCQkJCSAgICAmJgorCQkJCQkgICAgKChwU3ViSW5kZXgtPgorCQkJCQkgICAgICBtX0FjY2VzcyAmIGtFcGxPYmRBY2NBcnJheSkgIT0KKwkJCQkJICAgICAwKSkgeworCQkJCQkJLy8gbmV4dCBzdWJpbmRleCBwb2ludHMgdG8gYW4gYXJyYXkKKwkJCQkJCS8vIHJlc2V0IHN1YmluZGV4IG51bWJlcgorCQkJCQkJcFN1YkluZGV4LT5tX3VpU3ViSW5kZXggPSAxOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKG5TdWJJbmRleENvdW50ID4gMCkgeworCQkJCQkJLy8gbmV4dCBzdWJpbmRleCBwb2ludHMgdG8gYW4gYXJyYXkKKwkJCQkJCS8vIGluY3JlbWVudCBzdWJpbmRleCBudW1iZXIKKwkJCQkJCXBTdWJJbmRleC0+bV91aVN1YkluZGV4Kys7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCS8vIG5leHQgaW5kZXggZW50cnkKKwkJCXBPYmRFbnR5X3ArKzsKKwkJfQorCX0KKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIGNvbW1hbmQgb2YgbGFzdCBhY3Rpb24gZGVwZW5kcyBvbiBkaXJlY3Rpb24gdG8gYWNjZXNzCisJaWYgKERpcmVjdGlvbl9wID09IGtFcGxPYmREaXJPQktDaGVjaykgeworCisJCWdvdG8gRXhpdDsKKwl9CisjaWYgKEVQTF9PQkRfVVNFX1NUT1JFX1JFU1RPUkUgIT0gRkFMU0UpCisJZWxzZSB7CisJCWlmIChEaXJlY3Rpb25fcCA9PSBrRXBsT2JkRGlyTG9hZCkgeworCQkJQ2JTdG9yZS5tX2JDb21tYW5kID0gKEJZVEUpIGtFcGxPYmRDb21tQ2xvc2VSZWFkOworCQl9IGVsc2UgaWYgKERpcmVjdGlvbl9wID09IGtFcGxPYmREaXJTdG9yZSkgeworCQkJQ2JTdG9yZS5tX2JDb21tYW5kID0gKEJZVEUpIGtFcGxPYmRDb21tQ2xvc2VXcml0ZTsKKwkJfSBlbHNlIGlmIChEaXJlY3Rpb25fcCA9PSBrRXBsT2JkRGlyUmVzdG9yZSkgeworCQkJQ2JTdG9yZS5tX2JDb21tYW5kID0gKEJZVEUpIGtFcGxPYmRDb21tQ2xlYXI7CisJCX0gZWxzZSB7CisJCQlnb3RvIEV4aXQ7CisJCX0KKworCQkvLyBjYWxsIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBsYXN0IGNvbW1hbmQKKwkJUmV0ID0gRXBsT2JkQ2FsbFN0b3JlQ2FsbGJhY2soRVBMX01DT19JTlNUQU5DRV9QVFJfICYgQ2JTdG9yZSk7CisJfQorI2VuZGlmIC8vIChFUExfT0JEX1VTRV9TVE9SRV9SRVNUT1JFICE9IEZBTFNFKQorCisvLyAgICBnb3RvIEV4aXQ7CisKKyAgICAgIEV4aXQ6CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRDb3B5T2JqZWN0RGF0YSgpCisvLworLy8gRGVzY3JpcHRpb246IGNoZWNrcyBwb2ludGVycyB0byBvYmplY3QgZGF0YSBhbmQgY29weSB0aGVtIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uCisvLworLy8gUGFyYW1ldGVyczogIHBEc3REYXRhX3AgICAgICAgICAgICAgID0gZGVzdGluYXRpb24gcG9pbnRlcgorLy8gICAgICAgICAgICAgIHBTcmNEYXRhX3AgICAgICAgICAgICAgID0gc291cmNlIHBvaW50ZXIKKy8vICAgICAgICAgICAgICBPYmpTaXplX3AgICAgICAgICAgICAgICA9IHNpemUgb2Ygb2JqZWN0CisvLyAgICAgICAgICAgICAgT2JqVHlwZV9wICAgICAgICAgICAgICAgPQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgRXBsT2JkQ29weU9iamVjdERhdGEodm9pZCBNRU0gKiBwRHN0RGF0YV9wLAorCQkJCSB2b2lkICpwU3JjRGF0YV9wLAorCQkJCSB0RXBsT2JkU2l6ZSBPYmpTaXplX3AsIHRFcGxPYmRUeXBlIE9ialR5cGVfcCkKK3sKKworCXRFcGxPYmRTaXplIFN0clNpemUgPSAwOworCisJLy8gaXQgaXMgYWxsb3dlZCB0byBzZXQgZGVmYXVsdCBhbmQgY3VycmVudCBhZGRyZXNzIHRvIE5VTEwgKG5vdGhpbmcgdG8gY29weSkKKwlpZiAocERzdERhdGFfcCAhPSBOVUxMKSB7CisKKwkJaWYgKE9ialR5cGVfcCA9PSBrRXBsT2JkVHlwVlN0cmluZykgeworCQkJLy8gVGhlIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIHJlYWxseSBudW1iZXIgb2YgY2hhcmFjdGVycyBvZiBzdHJpbmcuIFRoZQorCQkJLy8gb2JqZWN0IGVudHJ5IHNpemUgY2FuIGJlIGJpZ2dlciBhcyBzdHJpbmcgc2l6ZSBvZiBkZWZhdWx0IHN0cmluZy4KKwkJCS8vIFRoZSAnXDAnLXRlcm1pbmF0aW9uIGlzIGluY2x1ZGVkLiBBIHN0cmluZyB3aXRoIG5vIGNoYXJhY3RlcnMgaGFzIGEKKwkJCS8vIHNpemUgb2YgMS4KKwkJCVN0clNpemUgPQorCQkJICAgIEVwbE9iZEdldFN0ckxlbigodm9pZCAqKXBTcmNEYXRhX3AsIE9ialNpemVfcCwKKwkJCQkJICAgIGtFcGxPYmRUeXBWU3RyaW5nKTsKKworCQkJLy8gSWYgdGhlIHN0cmluZyBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBlbnRyeSBzaXplIGluIE9EIHRoZW4gb25seSBjb3B5CisJCQkvLyBlbnRyeSBzaXplIC0gMSBhbmQgYWx3YXlzIHNldCB0aGUgJ1wwJy10ZXJtaW5hdGlvbi4KKwkJCWlmIChTdHJTaXplID49IE9ialNpemVfcCkgeworCQkJCVN0clNpemUgPSBPYmpTaXplX3AgLSAxOworCQkJfQorCQl9CisKKwkJaWYgKHBTcmNEYXRhX3AgIT0gTlVMTCkgeworCQkJLy8gY29weSBkYXRhCisJCQlFUExfTUVNQ1BZKHBEc3REYXRhX3AsIHBTcmNEYXRhX3AsIE9ialNpemVfcCk7CisKKwkJCWlmIChPYmpUeXBlX3AgPT0ga0VwbE9iZFR5cFZTdHJpbmcpIHsKKwkJCQkoKGNoYXIgTUVNICopcERzdERhdGFfcClbU3RyU2l6ZV0gPSAnXDAnOworCQkJfQorCQl9CisJfQorCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZElzTnVtZXJpY2FsSW50ZXJuKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gY2hlY2tzIGlmIGEgZW50cnkgaXMgbnVtZXJpY2FsIG9yIG5vdAorLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8gPSBJbnN0YW5jZXBvaW50ZXIKKy8vICAgICAgICAgICAgICB1aUluZGV4X3AgICAgICAgICAgID0gSW5kZXgKKy8vICAgICAgICAgICAgICB1aVN1YkluZGV4X3AgICAgICAgID0gU3ViaW5kZXgKKy8vICAgICAgICAgICAgICBwZkVudHJ5TnVtZXJpY2FsX3AgID0gcG9pbnRlciB0byBCT09MIGZvciByZXR1cm52YWx1ZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gVFJVRSBpZiBlbnRyeSBhIG51bWVyaWNhbCB2YWx1ZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gRkFMU0UgaWYgZW50cnkgbm90IGEgbnVtZXJpY2FsIHZhbHVlCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgPSBFcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHRFcGxLZXJuZWwgRXBsT2JkSXNOdW1lcmljYWxJbnRlcm4odEVwbE9iZFN1YkVudHJ5UHRyIHBPYmRTdWJFbnRyeV9wLAorCQkJCQkgIEJPT0wgKiBwZkVudHJ5TnVtZXJpY2FsX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGdldCBUeXBlCisJaWYgKChwT2JkU3ViRW50cnlfcC0+bV9UeXBlID09IGtFcGxPYmRUeXBWU3RyaW5nKQorCSAgICB8fCAocE9iZFN1YkVudHJ5X3AtPm1fVHlwZSA9PSBrRXBsT2JkVHlwT1N0cmluZykKKwkgICAgfHwgKHBPYmRTdWJFbnRyeV9wLT5tX1R5cGUgPT0ga0VwbE9iZFR5cERvbWFpbikpIHsJLy8gbm90IG51bWVyaWNhbCB0eXBlcworCQkqcGZFbnRyeU51bWVyaWNhbF9wID0gRkFMU0U7CisJfSBlbHNlIHsJCS8vIG51bWVyaWNhbCB0eXBlcworCQkqcGZFbnRyeU51bWVyaWNhbF9wID0gVFJVRTsKKwl9CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHRvIGNsYXNzaWZ5IG9iamVjdCB0eXBlIChmaXhlZC9ub24gZml4ZWQpCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmRDYWxsU3RvcmVDYWxsYmFjaygpCisvLworLy8gRGVzY3JpcHRpb246IGNoZWNrcyBhZGRyZXNzIHRvIGNhbGxiYWNrIGZ1bmN0aW9uIGFuZCBjYWxsZXMgaXQgd2hlbiB1bmVxdWFsCisvLyAgICAgICAgICAgICAgdG8gTlVMTAorLy8KKy8vIFBhcmFtZXRlcnM6ICBFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXyA9IChpbnN0YW5jZSBwb2ludGVyKQorLy8gICAgICAgICAgICAgIHBDYlN0b3JlUGFyYW1fcCAgICAgICAgPSBhZGRyZXNzIHRvIGNhbGxiYWNrIHBhcmFtZXRlcnMKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiAoRVBMX09CRF9VU0VfU1RPUkVfUkVTVE9SRSAhPSBGQUxTRSkKK3N0YXRpYyB0RXBsS2VybmVsIEVwbE9iZENhbGxTdG9yZUNhbGxiYWNrKEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCSAgdEVwbE9iZENiU3RvcmVQYXJhbSBNRU0gKgorCQkJCQkgIHBDYlN0b3JlUGFyYW1fcCkKK3sKKworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlBU1NFUlQocENiU3RvcmVQYXJhbV9wICE9IE5VTEwpOworCisJLy8gY2hlY2sgaWYgZnVuY3Rpb24gcG9pbnRlciBpcyBOVUxMIC0gaWYgc28sIG5vIGNhbGxiYWNrIHNob3VsZCBiZSBjYWxsZWQKKwlpZiAoRVBMX01DT19HTEJfVkFSKG1fZnBTdG9yZUxvYWRPYmpDYWxsYmFjaykgIT0gTlVMTCkgeworCQlSZXQgPQorCQkgICAgRVBMX01DT19HTEJfVkFSKG1fZnBTdG9yZUxvYWRPYmpDYWxsYmFjaykKKwkJICAgIChFUExfTUNPX0lOU1RBTkNFX1BBUkFNX0lEWF8oKQorCQkgICAgIHBDYlN0b3JlUGFyYW1fcCk7CisJfQorCisJcmV0dXJuIFJldDsKKworfQorI2VuZGlmIC8vIChFUExfT0JEX1VTRV9TVE9SRV9SRVNUT1JFICE9IEZBTFNFKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkR2V0T2JqZWN0RGF0YVB0ckludGVybigpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIGdldHMgdGhlIGRhdGEgcG9pbnRlciBvZiBhbiBvYmplY3QuCisvLyAgICAgICAgICAgICAgSXQgcmV0dXJuZXMgdGhlIGN1cnJlbnQgZGF0YSBwb2ludGVyLiBCdXQgaWYgb2JqZWN0IGlzIGFuCisvLyAgICAgICAgICAgICAgY29uc3RhbnQgb2JqZWN0IGl0IHJldHVybmVzIHRoZSBkZWZhdWx0IHBvaW50ZXIuCisvLworLy8gUGFyYW1ldGVyczogIHBTdWJpbmRleEVudHJ5X3AgPSBwb2ludGVyIHRvIHN1YmluZGV4IGVudHJ5CisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQgKiAgICA9IHBvaW50ZXIgdG8gb2JqZWN0IGRhdGEKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkICpFcGxPYmRHZXRPYmplY3REYXRhUHRySW50ZXJuKHRFcGxPYmRTdWJFbnRyeVB0ciBwU3ViaW5kZXhFbnRyeV9wKQoreworCisJdm9pZCAqcERhdGE7CisJdEVwbE9iZEFjY2VzcyBBY2Nlc3M7CisKKwlBU1NFUlRNU0cocFN1YmluZGV4RW50cnlfcCAhPSBOVUxMLAorCQkgICJFcGxPYmRHZXRPYmplY3REYXRhUHRySW50ZXJuKCk6IHBvaW50ZXIgdG8gU3ViRW50cnkgbm90IHZhbGlkIVxuIik7CisKKwkvLyB0aGVyZSBhcmUgYXJlIHNvbWUgb2JqZWN0cyB3aG9zZSBkYXRhIHBvaW50ZXIgaGFzIHRvIGdldCBmcm9tIG90aGVyIHN0cnVjdHVyZQorCS8vIGdldCBhY2Nlc3MgdHlwZSBmb3IgdGhpcyBvYmplY3QKKwlBY2Nlc3MgPSBwU3ViaW5kZXhFbnRyeV9wLT5tX0FjY2VzczsKKworCS8vIElmIG9iamVjdCBoYXMgYWNjZXNzIHR5cGUgPSBjb25zdCwKKwkvLyBmb3IgZGF0YSBvbmx5IGV4aXN0cyBkZWZhdWx0IHZhbHVlcy4KKwlpZiAoKEFjY2VzcyAmIGtFcGxPYmRBY2NDb25zdCkgIT0gMCkgeworCQkvLyBUaGUgcG9pbnRlciB0byBkZWZ1YWx0IHZhbHVlIGNhbiBiZSByZWNlaXZlZCBmcm9tIE9iZEdldE9iamVjdERlZmF1bHRQdHIoKQorCQlwRGF0YSA9ICgodm9pZCAqKUVwbE9iZEdldE9iamVjdERlZmF1bHRQdHIocFN1YmluZGV4RW50cnlfcCkpOworCX0gZWxzZSB7CisJCS8vIFRoZSBwb2ludGVyIHRvIGN1cnJlbnQgdmFsdWUgY2FuIGJlIHJlY2VpdmVkIGZyb20gT2JkR2V0T2JqZWN0Q3VycmVudFB0cigpCisJCXBEYXRhID0gKCh2b2lkICopRXBsT2JkR2V0T2JqZWN0Q3VycmVudFB0cihwU3ViaW5kZXhFbnRyeV9wKSk7CisJfQorCisJcmV0dXJuIHBEYXRhOworCit9CisjZW5kaWYgLy8gZW5kIG9mICNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JESykpICE9IDApCisvLyBFT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsT2JkLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE9iZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4Y2MxMWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE9iZC5oCkBAIC0wLDAgKzEsNDY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBhcGkgZnVuY3Rpb24gb2YgRXBsT0JELU1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE9iZC5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgIE1pY3Jvc29mdCBWQzcKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzAyIGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDEuMDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkVwbEluYy5oIgorCisjaWZuZGVmIF9FUExPQkRfSF8KKyNkZWZpbmUgX0VQTE9CRF9IXworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBkZWZpbmVzCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNkZWZpbmUgRVBMX09CRF9UQUJMRV9JTkRFWF9FTkQgICAgIDB4RkZGRgorCisvLyBmb3IgdGhlIHVzYWdlIG9mIEJPT0xFQU4gaW4gT0QKKyNkZWZpbmUgT0JEX1RSVUUgICAgMHgwMQorI2RlZmluZSBPQkRfRkFMU0UgICAweDAwCisKKy8vIGRlZmF1bHQgT0QgaW5kZXggZm9yIE5vZGUgaWQKKyNkZWZpbmUgRVBMX09CRF9OT0RFX0lEX0lOREVYICAgICAgICAgICAgICAgMHgxRjkzCisvLyBkZWZhdWx0IHN1YmluZGV4IGZvciBOb2RlSWQgaW4gT0QKKyNkZWZpbmUgRVBMX09CRF9OT0RFX0lEX1NVQklOREVYICAgICAgICAgICAgMHgwMQorLy8gZGVmYXVsdCBzdWJpbmRleCBmb3IgTm9kZUlEQnlIV19CT09MCisjZGVmaW5lIEVQTF9PQkRfTk9ERV9JRF9IV0JPT0xfU1VCSU5ERVggICAgIDB4MDIKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gZW51bXMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gZGlyZWN0aW9ucyBmb3IgYWNjZXNzIHRvIG9iamVjdCBkaWN0aW9uYXJ5Cit0eXBlZGVmIGVudW0geworCWtFcGxPYmREaXJJbml0ID0gMHgwMCwJLy8gaW5pdGlhbGlzaW5nIGFmdGVyIHBvd2VyIG9uCisJa0VwbE9iZERpclN0b3JlID0gMHgwMSwJLy8gc3RvcmUgYWxsIG9iamVjdCB2YWx1ZXMgdG8gbm9uIHZvbGF0aWxlIG1lbW9yeQorCWtFcGxPYmREaXJMb2FkID0gMHgwMiwJLy8gbG9hZCBhbGwgb2JqZWN0IHZhbHVlcyBmcm9tIG5vbiB2b2xhdGlsZSBtZW1vcnkKKwlrRXBsT2JkRGlyUmVzdG9yZSA9IDB4MDMsCS8vIGRlbGV0ZXMgbm9uIHZvbGF0aWxlIG1lbW9yeSAocmVzdG9yZSkKKwlrRXBsT2JkRGlyT0JLQ2hlY2sgPSAweEZGCS8vIHJlc2VydmVkCit9IHRFcGxPYmREaXI7CisKKy8vIGNvbW1hbmRzIGZvciBzdG9yZQordHlwZWRlZiBlbnVtIHsKKwlrRXBsT2JkQ29tbU5vdGhpbmcgPSAweDAwLAorCWtFcGxPYmRDb21tT3BlbldyaXRlID0gMHgwMSwKKwlrRXBsT2JkQ29tbVdyaXRlT2JqID0gMHgwMiwKKwlrRXBsT2JkQ29tbUNsb3NlV3JpdGUgPSAweDAzLAorCWtFcGxPYmRDb21tT3BlblJlYWQgPSAweDA0LAorCWtFcGxPYmRDb21tUmVhZE9iaiA9IDB4MDUsCisJa0VwbE9iZENvbW1DbG9zZVJlYWQgPSAweDA2LAorCWtFcGxPYmRDb21tQ2xlYXIgPSAweDA3LAorCWtFcGxPYmRDb21tVW5rbm93biA9IDB4RkYKK30gdEVwbE9iZENvbW1hbmQ7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGV2ZW50cyBvZiBvYmplY3QgY2FsbGJhY2sgZnVuY3Rpb24KK3R5cGVkZWYgZW51bSB7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEFyZyBwb2ludHMgdG8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWtFcGxPYmRFdkNoZWNrRXhpc3QgPSAweDA2LAkvLyBjaGVja2luZyBpZiBvYmplY3QgZG9lcyBleGlzdCAocmVhZGluZyBhbmQgd3JpdGluZykgICAgTlVMTAorCWtFcGxPYmRFdlByZVJlYWQgPSAweDAwLAkvLyBiZWZvcmUgcmVhZGluZyBhbiBvYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlIGRhdGEgYnVmZmVyIGluIE9ECisJa0VwbE9iZEV2UG9zdFJlYWQgPSAweDAxLAkvLyBhZnRlciByZWFkaW5nIGFuIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24gZGF0YSBidWZmZXIgZnJvbSBjYWxsZXIKKwlrRXBsT2JkRXZXclN0cmluZ0RvbWFpbiA9IDB4MDcsCS8vIGV2ZW50IGZvciBjaGFuZ2luZyBzdHJpbmcvZG9tYWluIGRhdGEgcG9pbnRlciBvciBzaXplICBzdHJ1Y3QgdEVwbE9iZFZTdHJpbmdEb21haW4gaW4gUkFNCisJa0VwbE9iZEV2SW5pdFdyaXRlID0gMHgwNCwJLy8gaW5pdGlhbGl6ZXMgd3JpdGluZyBhbiBvYmplY3QgKGNoZWNraW5nIG9iamVjdCBzaXplKSAgIHNpemUgb2Ygb2JqZWN0IGluIE9EICh0RXBsT2JkU2l6ZSkKKwlrRXBsT2JkRXZQcmVXcml0ZSA9IDB4MDIsCS8vIGJlZm9yZSB3cml0aW5nIGFuIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgZGF0YSBidWZmZXIgZnJvbSBjYWxsZXIKKwlrRXBsT2JkRXZQb3N0V3JpdGUgPSAweDAzLAkvLyBhZnRlciB3cml0aW5nIGFuIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24gZGF0YSBidWZmZXIgaW4gT0QKKy8vICAgIGtFcGxPYmRFdkFib3J0U2RvICAgICAgICAgICAgICA9IDB4MDUgICAgIC8vIGFmdGVyIGFuIGFib3J0IG9mIGFuIFNETyB0cmFuc2ZlcgorCit9IHRFcGxPYmRFdmVudDsKKworLy8gcGFydCBvZiBPRCAoYml0IG9yaWVudGVkKQordHlwZWRlZiB1bnNpZ25lZCBpbnQgdEVwbE9iZFBhcnQ7CisKKyNkZWZpbmUga0VwbE9iZFBhcnRObyAgICAgICAgICAweDAwCS8vIG5vdGhpbmcKKyNkZWZpbmUga0VwbE9iZFBhcnRHZW4gICAgICAgICAweDAxCS8vICBwYXJ0ICAgICAgKDB4MTAwMCAtIDB4MUZGRikKKyNkZWZpbmUga0VwbE9iZFBhcnRNYW4gICAgICAgICAweDAyCS8vIG1hbnVmYWN0dXJlciBwYXJ0ICgweDIwMDAgLSAweDVGRkYpCisjZGVmaW5lIGtFcGxPYmRQYXJ0RGV2ICAgICAgICAgMHgwNAkvLyBkZXZpY2UgcGFydCAgICAgICAoMHg2MDAwIC0gMHg5RkZGKQorI2RlZmluZSBrRXBsT2JkUGFydFVzciAgICAgICAgIDB4MDgJLy8gZHluYW1pYyBwYXJ0IGUuZy4gZm9yIElDRTYxMTMxLTMKKworLy8gY29tYmluYXRpb25zCisjZGVmaW5lIGtFcGxPYmRQYXJ0QXBwICAgICAgICAgKCAgICAgICAgICAgICAga0VwbE9iZFBhcnRNYW4gfCBrRXBsT2JkUGFydERldiB8IGtFcGxPYmRQYXJ0VXNyKQkvLyBtYW51ZmFjdHVyZXIgYW5kIGRldmljZSBwYXJ0ICgweDIwMDAgLSAweDlGRkYpIGFuZCB1c2VyIE9ECisjZGVmaW5lIGtFcGxPYmRQYXJ0QWxsICAgICAgICAgKGtFcGxPYmRQYXJ0R2VuIHwga0VwbE9iZFBhcnRNYW4gfCBrRXBsT2JkUGFydERldiB8IGtFcGxPYmRQYXJ0VXNyKQkvLyB3aG9sZSBPRAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBhY2Nlc3MgdHlwZXMgZm9yIG9iamVjdHMKKy8vIG11c3QgYmUgYSBkaWZpbmUgYmVjYXVzZSBiaXQtZmxhZ3MKK3R5cGVkZWYgdW5zaWduZWQgaW50IHRFcGxPYmRBY2Nlc3M7CisKKyNkZWZpbmUga0VwbE9iZEFjY1JlYWQgICAgICAgICAweDAxCS8vIG9iamVjdCBjYW4gYmUgcmVhZAorI2RlZmluZSBrRXBsT2JkQWNjV3JpdGUgICAgICAgIDB4MDIJLy8gb2JqZWN0IGNhbiBiZSB3cml0dGVuCisjZGVmaW5lIGtFcGxPYmRBY2NDb25zdCAgICAgICAgMHgwNAkvLyBvYmplY3QgY29udGFpbnMgYSBjb25zdGFudCB2YWx1ZQorI2RlZmluZSBrRXBsT2JkQWNjUGRvICAgICAgICAgIDB4MDgJLy8gb2JqZWN0IGNhbiBiZSBtYXBwZWQgaW4gYSBQRE8KKyNkZWZpbmUga0VwbE9iZEFjY0FycmF5ICAgICAgICAweDEwCS8vIG9iamVjdCBjb250YWlucyBhbiBhcnJheSBvZiBudW1lcmljYWwgdmFsdWVzCisjZGVmaW5lIGtFcGxPYmRBY2NSYW5nZSAgICAgICAgMHgyMAkvLyBvYmplY3QgY29udGFpbnMgbG93ZXIgYW5kIHVwcGVyIGxpbWl0CisjZGVmaW5lIGtFcGxPYmRBY2NWYXIgICAgICAgICAgMHg0MAkvLyBvYmplY3QgZGF0YSBpcyBwbGFjZWQgaW4gYXBwbGljYXRpb24KKyNkZWZpbmUga0VwbE9iZEFjY1N0b3JlICAgICAgICAweDgwCS8vIG9iamVjdCBkYXRhIGNhbiBiZSBzdG9yZWQgdG8gbm9uIHZvbGF0aWxlIG1lbW9yeQorCisvLyBjb21iaW5hdGlvbnMgKG5vdCBhbGwgY29tYmluYXRpb25zIGFyZSByZXF1aXJlZCkKKyNkZWZpbmUga0VwbE9iZEFjY1IgICAgICAgICAgICAoMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1cgICAgICAgICAgICAoMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCAwICAgICAgICAgICkKKyNkZWZpbmUga0VwbE9iZEFjY1JXICAgICAgICAgICAoMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY0NSICAgICAgICAgICAoMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgfCBrRXBsT2JkQWNjQ29uc3QgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY0dSICAgICAgICAgICAoMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IGtFcGxPYmRBY2NSYW5nZSB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY0dXICAgICAgICAgICAoMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IGtFcGxPYmRBY2NSYW5nZSB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCAwICAgICAgICAgICkKKyNkZWZpbmUga0VwbE9iZEFjY0dSVyAgICAgICAgICAoMCAgICAgICAgICAgIHwgMCAgICAgICAgICB8IGtFcGxPYmRBY2NSYW5nZSB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1ZSICAgICAgICAgICAoMCAgICAgICAgICAgIHwga0VwbE9iZEFjY1ZhciB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1ZXICAgICAgICAgICAoMCAgICAgICAgICAgIHwga0VwbE9iZEFjY1ZhciB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCAwICAgICAgICAgICkKKyNkZWZpbmUga0VwbE9iZEFjY1ZSVyAgICAgICAgICAoMCAgICAgICAgICAgIHwga0VwbE9iZEFjY1ZhciB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1ZQUiAgICAgICAgICAoMCAgICAgICAgICAgIHwga0VwbE9iZEFjY1ZhciB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NQZG8gfCAwICAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1ZQVyAgICAgICAgICAoMCAgICAgICAgICAgIHwga0VwbE9iZEFjY1ZhciB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NQZG8gfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCAwICAgICAgICAgICkKKyNkZWZpbmUga0VwbE9iZEFjY1ZQUlcgICAgICAgICAoMCAgICAgICAgICAgIHwga0VwbE9iZEFjY1ZhciB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NQZG8gfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1ZHUiAgICAgICAgICAoMCAgICAgICAgICAgIHwga0VwbE9iZEFjY1ZhciB8IGtFcGxPYmRBY2NSYW5nZSB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1ZHVyAgICAgICAgICAoMCAgICAgICAgICAgIHwga0VwbE9iZEFjY1ZhciB8IGtFcGxPYmRBY2NSYW5nZSB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCAwICAgICAgICAgICkKKyNkZWZpbmUga0VwbE9iZEFjY1ZHUlcgICAgICAgICAoMCAgICAgICAgICAgIHwga0VwbE9iZEFjY1ZhciB8IGtFcGxPYmRBY2NSYW5nZSB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1ZHUFIgICAgICAgICAoMCAgICAgICAgICAgIHwga0VwbE9iZEFjY1ZhciB8IGtFcGxPYmRBY2NSYW5nZSB8IGtFcGxPYmRBY2NQZG8gfCAwICAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1ZHUFcgICAgICAgICAoMCAgICAgICAgICAgIHwga0VwbE9iZEFjY1ZhciB8IGtFcGxPYmRBY2NSYW5nZSB8IGtFcGxPYmRBY2NQZG8gfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCAwICAgICAgICAgICkKKyNkZWZpbmUga0VwbE9iZEFjY1ZHUFJXICAgICAgICAoMCAgICAgICAgICAgIHwga0VwbE9iZEFjY1ZhciB8IGtFcGxPYmRBY2NSYW5nZSB8IGtFcGxPYmRBY2NQZG8gfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1NSICAgICAgICAgICAoa0VwbE9iZEFjY1N0b3JlIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1NXICAgICAgICAgICAoa0VwbE9iZEFjY1N0b3JlIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCAwICAgICAgICAgICkKKyNkZWZpbmUga0VwbE9iZEFjY1NSVyAgICAgICAgICAoa0VwbE9iZEFjY1N0b3JlIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1NDUiAgICAgICAgICAoa0VwbE9iZEFjY1N0b3JlIHwgMCAgICAgICAgICB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgfCBrRXBsT2JkQWNjQ29uc3QgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1NHUiAgICAgICAgICAoa0VwbE9iZEFjY1N0b3JlIHwgMCAgICAgICAgICB8IGtFcGxPYmRBY2NSYW5nZSB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1NHVyAgICAgICAgICAoa0VwbE9iZEFjY1N0b3JlIHwgMCAgICAgICAgICB8IGtFcGxPYmRBY2NSYW5nZSB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCAwICAgICAgICAgICkKKyNkZWZpbmUga0VwbE9iZEFjY1NHUlcgICAgICAgICAoa0VwbE9iZEFjY1N0b3JlIHwgMCAgICAgICAgICB8IGtFcGxPYmRBY2NSYW5nZSB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1NWUiAgICAgICAgICAoa0VwbE9iZEFjY1N0b3JlIHwga0VwbE9iZEFjY1ZhciB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1NWVyAgICAgICAgICAoa0VwbE9iZEFjY1N0b3JlIHwga0VwbE9iZEFjY1ZhciB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCAwICAgICAgICAgICkKKyNkZWZpbmUga0VwbE9iZEFjY1NWUlcgICAgICAgICAoa0VwbE9iZEFjY1N0b3JlIHwga0VwbE9iZEFjY1ZhciB8IDAgICAgICAgICAgICB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1NWUFIgICAgICAgICAoa0VwbE9iZEFjY1N0b3JlIHwga0VwbE9iZEFjY1ZhciB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NQZG8gfCAwICAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1NWUFcgICAgICAgICAoa0VwbE9iZEFjY1N0b3JlIHwga0VwbE9iZEFjY1ZhciB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NQZG8gfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCAwICAgICAgICAgICkKKyNkZWZpbmUga0VwbE9iZEFjY1NWUFJXICAgICAgICAoa0VwbE9iZEFjY1N0b3JlIHwga0VwbE9iZEFjY1ZhciB8IDAgICAgICAgICAgICB8IGtFcGxPYmRBY2NQZG8gfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1NWR1IgICAgICAgICAoa0VwbE9iZEFjY1N0b3JlIHwga0VwbE9iZEFjY1ZhciB8IGtFcGxPYmRBY2NSYW5nZSB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1NWR1cgICAgICAgICAoa0VwbE9iZEFjY1N0b3JlIHwga0VwbE9iZEFjY1ZhciB8IGtFcGxPYmRBY2NSYW5nZSB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCAwICAgICAgICAgICkKKyNkZWZpbmUga0VwbE9iZEFjY1NWR1JXICAgICAgICAoa0VwbE9iZEFjY1N0b3JlIHwga0VwbE9iZEFjY1ZhciB8IGtFcGxPYmRBY2NSYW5nZSB8IDAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1NWR1BSICAgICAgICAoa0VwbE9iZEFjY1N0b3JlIHwga0VwbE9iZEFjY1ZhciB8IGtFcGxPYmRBY2NSYW5nZSB8IGtFcGxPYmRBY2NQZG8gfCAwICAgICAgICAgICAgfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjUmVhZCkKKyNkZWZpbmUga0VwbE9iZEFjY1NWR1BXICAgICAgICAoa0VwbE9iZEFjY1N0b3JlIHwga0VwbE9iZEFjY1ZhciB8IGtFcGxPYmRBY2NSYW5nZSB8IGtFcGxPYmRBY2NQZG8gfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCAwICAgICAgICAgICkKKyNkZWZpbmUga0VwbE9iZEFjY1NWR1BSVyAgICAgICAoa0VwbE9iZEFjY1N0b3JlIHwga0VwbE9iZEFjY1ZhciB8IGtFcGxPYmRBY2NSYW5nZSB8IGtFcGxPYmRBY2NQZG8gfCAwICAgICAgICAgICAgfCBrRXBsT2JkQWNjV3JpdGUgfCBrRXBsT2JkQWNjUmVhZCkKKwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdEVwbE9iZFNpemU7CS8vIEZvciBhbGwgb2JqZWN0cyBhcyBvYmplY3RzIHNpemUgYXJlIHVzZWQgYW4gdW5zaWduZWQgaW50LgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlcyBmb3IgZGF0YSB0eXBlcyBkZWZpbmVkIGluIERTMzAxCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIHR5cGVzIG9mIG9iamVjdHMgaW4gb2JqZWN0IGRpY3Rpb25hcnkKKy8vIERTLTMwMSBkZWZpbmVzIHRoZXNlIHR5cGVzIGFzIFdPUkQKK3R5cGVkZWYgZW51bSB7CisvLyB0eXBlcyB3aGljaCBhcmUgYWx3YXlzIHN1cHBvcnRlZAorCWtFcGxPYmRUeXBCb29sID0gMHgwMDAxLAorCisJa0VwbE9iZFR5cEludDggPSAweDAwMDIsCisJa0VwbE9iZFR5cEludDE2ID0gMHgwMDAzLAorCWtFcGxPYmRUeXBJbnQzMiA9IDB4MDAwNCwKKwlrRXBsT2JkVHlwVUludDggPSAweDAwMDUsCisJa0VwbE9iZFR5cFVJbnQxNiA9IDB4MDAwNiwKKwlrRXBsT2JkVHlwVUludDMyID0gMHgwMDA3LAorCWtFcGxPYmRUeXBSZWFsMzIgPSAweDAwMDgsCisJa0VwbE9iZFR5cFZTdHJpbmcgPSAweDAwMDksCisJa0VwbE9iZFR5cE9TdHJpbmcgPSAweDAwMEEsCisJa0VwbE9iZFR5cERvbWFpbiA9IDB4MDAwRiwKKworCWtFcGxPYmRUeXBJbnQyNCA9IDB4MDAxMCwKKwlrRXBsT2JkVHlwVUludDI0ID0gMHgwMDE2LAorCisJa0VwbE9iZFR5cFJlYWw2NCA9IDB4MDAxMSwKKwlrRXBsT2JkVHlwSW50NDAgPSAweDAwMTIsCisJa0VwbE9iZFR5cEludDQ4ID0gMHgwMDEzLAorCWtFcGxPYmRUeXBJbnQ1NiA9IDB4MDAxNCwKKwlrRXBsT2JkVHlwSW50NjQgPSAweDAwMTUsCisJa0VwbE9iZFR5cFVJbnQ0MCA9IDB4MDAxOCwKKwlrRXBsT2JkVHlwVUludDQ4ID0gMHgwMDE5LAorCWtFcGxPYmRUeXBVSW50NTYgPSAweDAwMUEsCisJa0VwbE9iZFR5cFVJbnQ2NCA9IDB4MDAxQiwKKwlrRXBsT2JkVHlwVGltZU9mRGF5ID0gMHgwMDBDLAorCWtFcGxPYmRUeXBUaW1lRGlmZiA9IDB4MDAwRAorfSB0RXBsT2JkVHlwZTsKKy8vIG90aGVyIHR5cGVzIGFyZSBub3Qgc3VwcG9ydGVkIGluIHRoaXMgdmVyc2lvbgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlcyBmb3IgZGF0YSB0eXBlcyBkZWZpbmVkIGluIERTMzAxCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB0RXBsT2JkQm9vbGVhbjsJLy8gMDAwMQordHlwZWRlZiBzaWduZWQgY2hhciB0RXBsT2JkSW50ZWdlcjg7CS8vIDAwMDIKK3R5cGVkZWYgc2lnbmVkIHNob3J0IGludCB0RXBsT2JkSW50ZWdlcjE2OwkvLyAwMDAzCit0eXBlZGVmIHNpZ25lZCBsb25nIHRFcGxPYmRJbnRlZ2VyMzI7CS8vIDAwMDQKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB0RXBsT2JkVW5zaWduZWQ4OwkvLyAwMDA1Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCB0RXBsT2JkVW5zaWduZWQxNjsJLy8gMDAwNgordHlwZWRlZiB1bnNpZ25lZCBsb25nIHRFcGxPYmRVbnNpZ25lZDMyOwkvLyAwMDA3Cit0eXBlZGVmIGZsb2F0IHRFcGxPYmRSZWFsMzI7CS8vIDAwMDgKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB0RXBsT2JkRG9tYWluOwkvLyAwMDBGCit0eXBlZGVmIHNpZ25lZCBsb25nIHRFcGxPYmRJbnRlZ2VyMjQ7CS8vIDAwMTAKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB0RXBsT2JkVW5zaWduZWQyNDsJLy8gMDAxNgorCit0eXBlZGVmIHNpZ25lZCBRV09SRCB0RXBsT2JkSW50ZWdlcjQwOwkvLyAwMDEyCit0eXBlZGVmIHNpZ25lZCBRV09SRCB0RXBsT2JkSW50ZWdlcjQ4OwkvLyAwMDEzCit0eXBlZGVmIHNpZ25lZCBRV09SRCB0RXBsT2JkSW50ZWdlcjU2OwkvLyAwMDE0Cit0eXBlZGVmIHNpZ25lZCBRV09SRCB0RXBsT2JkSW50ZWdlcjY0OwkvLyAwMDE1CisKK3R5cGVkZWYgdW5zaWduZWQgUVdPUkQgdEVwbE9iZFVuc2lnbmVkNDA7CS8vIDAwMTgKK3R5cGVkZWYgdW5zaWduZWQgUVdPUkQgdEVwbE9iZFVuc2lnbmVkNDg7CS8vIDAwMTkKK3R5cGVkZWYgdW5zaWduZWQgUVdPUkQgdEVwbE9iZFVuc2lnbmVkNTY7CS8vIDAwMUEKK3R5cGVkZWYgdW5zaWduZWQgUVdPUkQgdEVwbE9iZFVuc2lnbmVkNjQ7CS8vIDAwMUIKKwordHlwZWRlZiBkb3VibGUgdEVwbE9iZFJlYWw2NDsJLy8gMDAxMQorCit0eXBlZGVmIHRUaW1lT2ZEYXkgdEVwbE9iZFRpbWVPZkRheTsJLy8gMDAwQwordHlwZWRlZiB0VGltZU9mRGF5IHRFcGxPYmRUaW1lRGlmZmVyZW5jZTsJLy8gMDAwRAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBzdHJ1Y3R1ciBmb3IgZGVmaW5pbmcgYSB2YXJpYWJsZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordHlwZWRlZiBlbnVtIHsKKwlrVmFyVmFsaWRTaXplID0gMHgwMSwKKwlrVmFyVmFsaWREYXRhID0gMHgwMiwKKy8vICAgIGtWYXJWYWxpZENhbGxiYWNrICAgICAgID0gMHgwNCwKKy8vICAgIGtWYXJWYWxpZEFyZyAgICAgICAgICAgID0gMHgwOCwKKworCWtWYXJWYWxpZEFsbCA9IDB4MDMJLy8gY3VycmVudGx5IG9ubHkgc2l6ZSBhbmQgZGF0YSBhcmUgaW1wbGVtZW50ZWQgYW5kIHVzZWQKK30gdEVwbFZhclBhcmFtVmFsaWQ7CisKK3R5cGVkZWYgdEVwbEtlcm5lbChQVUJMSUMgUk9NICogdEVwbFZhckNhbGxiYWNrKSAoQ0NNX0RFQ0xfSU5TVEFOQ0VfSERMXworCQkJCQkJICB2b2lkICpwUGFyYW1fcCk7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsVmFyUGFyYW1WYWxpZCBtX1ZhbGlkRmxhZzsKKwl1bnNpZ25lZCBpbnQgbV91aUluZGV4OworCXVuc2lnbmVkIGludCBtX3VpU3ViaW5kZXg7CisJdEVwbE9iZFNpemUgbV9TaXplOworCXZvaWQgTUVNICptX3BEYXRhOworLy8gICAgdEVwbFZhckNhbGxiYWNrICAgICBtX2ZwQ2FsbGJhY2s7CisvLyAgICB2b2lkICogICAgICAgbV9wQXJnOworCit9IHRFcGxWYXJQYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXZvaWQgTUVNICptX3BEYXRhOworCXRFcGxPYmRTaXplIG1fU2l6ZTsKKy8qCisgICAgI2lmIChFUExfUERPX1VTRV9TVEFUSUNfTUFQUElORyA9PSBGQUxTRSkKKyAgICAgICAgdEVwbFZhckNhbGxiYWNrICAgIG1fZnBDYWxsYmFjazsKKyAgICAgICAgdm9pZCAqICAgbV9wQXJnOworICAgICNlbmRpZgorKi8KK30gdEVwbE9iZFZhckVudHJ5OworCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbE9iZFNpemUgbV9TaXplOworCUJZVEUgKm1fcFN0cmluZzsKKworfSB0RXBsT2JkT1N0cmluZzsJCS8vIDAwMEMKKwordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxPYmRTaXplIG1fU2l6ZTsKKwljaGFyICptX3BTdHJpbmc7Cit9IHRFcGxPYmRWU3RyaW5nOwkJLy8gMDAwRAorCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbE9iZFNpemUgbV9TaXplOworCWNoYXIgKm1fcERlZlN0cmluZzsJLy8gJCQkIGQuay4gaXQgaXMgdW51c2VkLCBzbyB3ZSBjb3VsZCBkZWxldGUgaXQKKwljaGFyICptX3BTdHJpbmc7CisKK30gdEVwbE9iZFZTdHJpbmdEZWY7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsT2JkU2l6ZSBtX1NpemU7CisJQllURSAqbV9wRGVmU3RyaW5nOwkvLyAkJCQgZC5rLiBpdCBpcyB1bnVzZWQsIHNvIHdlIGNvdWxkIGRlbGV0ZSBpdAorCUJZVEUgKm1fcFN0cmluZzsKKworfSB0RXBsT2JkT1N0cmluZ0RlZjsKKworLy9yLmQuIHBhcmFtZXRlciBzdHJ1Y3QgZm9yIGNoYW5naW5nIG9iamVjdCBzaXplIGFuZC9vciBwb2ludGVyIHRvIGRhdGEgb2YgU3RyaW5ncyBvciBEb21haW5zCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbE9iZFNpemUgbV9Eb3dubG9hZFNpemU7CS8vIGRvd25sb2FkIHNpemUgZnJvbSBTRE8gb3IgQVBQCisJdEVwbE9iZFNpemUgbV9PYmpTaXplOwkvLyBjdXJyZW50IG9iamVjdCBzaXplIGZyb20gT0QgLSBzaG91bGQgYmUgY2hhbmdlZCBmcm9tIGNhbGxiYWNrIGZ1bmN0aW9uCisJdm9pZCAqbV9wRGF0YTsJCS8vIGN1cnJlbnQgb2JqZWN0IHB0ciAgZnJvbSBPRCAtIHNob3VsZCBiZSBjaGFuZ2VkIGZyb20gY2FsbGJhY2sgZnVuY3Rpb24KKworfSB0RXBsT2JkVlN0cmluZ0RvbWFpbjsJCS8vIDAwMEQKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gdHlwZXMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHN1YmluZGV4c3RydWN0CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIENoYW5nZSBub3QgdGhlIG9yZGVyIGZvciB0aGlzIHN0cnVjdCEhIQordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBtX3VpU3ViSW5kZXg7CisJdEVwbE9iZFR5cGUgbV9UeXBlOworCXRFcGxPYmRBY2Nlc3MgbV9BY2Nlc3M7CisJdm9pZCAqbV9wRGVmYXVsdDsKKwl2b2lkIE1FTSAqbV9wQ3VycmVudDsJLy8gcG9pbnRzIGFsd2F5cyB0byBSQU0KKworfSB0RXBsT2JkU3ViRW50cnk7CisKKy8vIHIuZC46IGhhcyBhbHdheXMgdG8gYmUgIGJlY2F1c2UgbmV3IE9CRC1NYWNyb3MgZm9yIGFycmF5cwordHlwZWRlZiB0RXBsT2JkU3ViRW50cnkgKnRFcGxPYmRTdWJFbnRyeVB0cjsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY2FsbGJhY2sgZnVuY3Rpb24gZm9yIG9iamRpY3Rpb25hcnkgbW9kdWwKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gcGFyYW1ldGVycyBmb3IgY2FsbGJhY2sgZnVuY3Rpb24KK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsT2JkRXZlbnQgbV9PYmRFdmVudDsKKwl1bnNpZ25lZCBpbnQgbV91aUluZGV4OworCXVuc2lnbmVkIGludCBtX3VpU3ViSW5kZXg7CisJdm9pZCAqbV9wQXJnOworCURXT1JEIG1fZHdBYm9ydENvZGU7CisKK30gdEVwbE9iZENiUGFyYW07CisKKy8vIGRlZmluZSB0eXBlIGZvciBjYWxsYmFjayBmdW5jdGlvbjogcFBhcmFtX3AgcG9pbnRzIHRvIHRFcGxPYmRDYlBhcmFtCit0eXBlZGVmIHRFcGxLZXJuZWwoUFVCTElDIFJPTSAqIHRFcGxPYmRDYWxsYmFjaykgKENDTV9ERUNMX0lOU1RBTkNFX0hETF8KKwkJCQkJCSAgdEVwbE9iZENiUGFyYW0gTUVNICoKKwkJCQkJCSAgcFBhcmFtX3ApOworCisvLyBkbyBub3QgY2hhbmdlIHRoZSBvcmRlciBmb3IgdGhpcyBzdHJ1Y3QhISEKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBtX3VpSW5kZXg7CisJdEVwbE9iZFN1YkVudHJ5UHRyIG1fcFN1YkluZGV4OworCXVuc2lnbmVkIGludCBtX3VpQ291bnQ7CisJdEVwbE9iZENhbGxiYWNrIG1fZnBDYWxsYmFjazsJLy8gZnVuY3Rpb24gaXMgY2FsbGVkIGJhY2sgaWYgb2JqZWN0IGFjY2VzcworCit9IHRFcGxPYmRFbnRyeTsKKworLy8gYWxsd2F5cyAgcG9pbnRlcgordHlwZWRlZiB0RXBsT2JkRW50cnkgKnRFcGxPYmRFbnRyeVB0cjsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gc3RydWN0dXIgdG8gaW5pdGlhbGl6ZSBPQkQgbW9kdWxlCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsT2JkRW50cnlQdHIgbV9wUGFydDsKKwl0RXBsT2JkRW50cnlQdHIgbV9wTWFudWZhY3R1cmVyUGFydDsKKwl0RXBsT2JkRW50cnlQdHIgbV9wRGV2aWNlUGFydDsKKworI2lmIChkZWZpbmVkIChFUExfT0JEX1VTRVJfT0QpICYmIChFUExfT0JEX1VTRVJfT0QgIT0gRkFMU0UpKQorCisJdEVwbE9iZEVudHJ5UHRyIG1fcFVzZXJQYXJ0OworCisjZW5kaWYKKworfSB0RXBsT2JkSW5pdFBhcmFtOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBzdHJ1Y3R1ciBmb3IgcGFyYW1ldGVycyBvZiBTVE9SRSBSRVNUT1JFIGNvbW1hbmQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxPYmRDb21tYW5kIG1fYkNvbW1hbmQ7CisJdEVwbE9iZFBhcnQgbV9iQ3VycmVudE9kUGFydDsKKwl2b2lkIE1FTSAqbV9wRGF0YTsKKwl0RXBsT2JkU2l6ZSBtX09ialNpemU7CisKK30gdEVwbE9iZENiU3RvcmVQYXJhbTsKKwordHlwZWRlZiB0RXBsS2VybmVsKFBVQkxJQyBST00gKiB0SW5pdFRhYkVudHJ5Q2FsbGJhY2spICh2b2lkIE1FTSAqIHBUYWJFbnRyeV9wLAorCQkJCQkJCXVuc2lnbmVkIGludAorCQkJCQkJCXVpT2JqSW5kZXhfcCk7CisKK3R5cGVkZWYgdEVwbEtlcm5lbChQVUJMSUMgUk9NICoKKwkJICAgdEVwbE9iZFN0b3JlTG9hZE9iakNhbGxiYWNrKSAoQ0NNX0RFQ0xfSU5TVEFOQ0VfSERMXworCQkJCQkJIHRFcGxPYmRDYlN0b3JlUGFyYW0gTUVNICoKKwkJCQkJCSBwQ2JTdG9yZVBhcmFtX3ApOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0aGlzIHN0dWN0dXJlIGlzIHVzZWQgZm9yIHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uIE9iZEluaXRNb2R1bGVUYWIoKQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBtX3VpTG93ZXJPYmpJbmRleDsJLy8gbG93ZXIgbGltaXQgb2YgT2JqSW5kZXgKKwl1bnNpZ25lZCBpbnQgbV91aVVwcGVyT2JqSW5kZXg7CS8vIHVwcGVyIGxpbWl0IG9mIE9iakluZGV4CisJdEluaXRUYWJFbnRyeUNhbGxiYWNrIG1fZnBJbml0VGFiRW50cnk7CS8vIHdpbGwgYmUgY2FsbGVkIGlmIE9iakluZGV4IHdhcyBmb3VuZAorCXZvaWQgTUVNICptX3BUYWJCYXNlOwkvLyBiYXNlIGFkZHJlc3Mgb2YgdGFibGUKKwl1bnNpZ25lZCBpbnQgbV91aUVudHJ5U2l6ZTsJLy8gc2l6ZSBvZiB0YWJsZSBlbnRyeSAgICAgIC8vIDI1LWZlYi0yMDA1IHIuZC46IGV4cGFuc2lvbiBmcm9tIEJZVEUgdG8gV09SRCBuZWNlc3NhcnkgZm9yIFBETyBiaXQgbWFwcGluZworCXVuc2lnbmVkIGludCBtX3VpTWF4RW50cmllczsJLy8gbWF4LiB0YWJlbCBlbnRyaWVzCisKK30gdEVwbE9iZE1vZHVsVGFiUGFyYW07CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIGVudW0gZm9yIGZ1bmN0aW9uIEVwbE9iZFNldE5vZGVJZAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0eXBlZGVmIGVudW0geworCWtFcGxPYmROb2RlSWRVbmtub3duID0gMHgwMCwJLy8gdW5rbm93biBob3cgdGhlIG5vZGUgaWQgd2FzIHNldAorCWtFcGxPYmROb2RlSWRTb2Z0d2FyZSA9IDB4MDEsCS8vIG5vZGUgaWQgc2V0IGJ5IHNvZnR3YXJlCisJa0VwbE9iZE5vZGVJZEhhcmR3YXJlID0gMHgwMgkvLyBub2RlIGlkIHNldCBieSBoYXJkd2FyZQorfSB0RXBsT2JkTm9kZUlkVHlwZTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gZ2xvYmFsIHZhcmlhYmxlcworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBwdWJsaWMgZnVuY3Rpb25zCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExPQkRfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsT2JkTWFjcm8uaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsT2JkTWFjcm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2YyYWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxPYmRNYWNyby5oCkBAIC0wLDAgKzEsMzU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBtYWNyb3Mgb2YgRXBsT0JELU1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE9iZE1hY3JvLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8wNSBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgICAgICAgICAgICAtPiBiYXNlZCBvbiBDQU5vcGVuIE9iZE1hY3JvLmgKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiBkZWZpbmVkIChFUExfT0JEX0RFRklORV9NQUNSTykKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIGRlZmluZWQgKEVQTF9PQkRfQ1JFQVRFX1JPTV9EQVRBKQorCisvLyAgICAgICAgI3ByYWdtYSBtZXNzYWdlICgiRVBMX09CRF9DUkVBVEVfUk9NX0RBVEEiKQorCisjZGVmaW5lIEVQTF9PQkRfQkVHSU4oKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyAgRFdPUkQgIGR3T2JkX09CS19nID0gMHgwMDAwOworI2RlZmluZSBFUExfT0JEX0VORCgpCisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBFUExfT0JEX0JFR0lOX1BBUlRfR0VORVJJQygpCisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fUEFSVF9NQU5VRkFDVFVSRVIoKQorI2RlZmluZSBFUExfT0JEX0JFR0lOX1BBUlRfREVWSUNFKCkKKyNkZWZpbmUgRVBMX09CRF9FTkRfUEFSVCgpCisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBFUExfT0JEX0JFR0lOX0lOREVYX1JBTShpbmQsY250LGNhbGwpCisjZGVmaW5lIEVQTF9PQkRfRU5EX0lOREVYKGluZCkKKyNkZWZpbmUgRVBMX09CRF9SQU1fSU5ERVhfUkFNX0FSUkFZKGluZCxjbnQsY2FsbCx0eXAsYWNjLGR0eXAsbmFtZSxkZWYpICAgICAgICAgc3RhdGljICB0RXBsT2JkVW5zaWduZWQ4ICAgIHhEZWYjI2luZCMjXzB4MDBfZyA9IChjbnQpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljICBkdHlwICB4RGVmIyNpbmQjI18weDAxX2cgPSAoZGVmKTsKKyNkZWZpbmUgRVBMX09CRF9SQU1fSU5ERVhfUkFNX1ZBUkFSUkFZKGluZCxjbnQsY2FsbCx0eXAsYWNjLGR0eXAsbmFtZSxkZWYpICAgICAgc3RhdGljICB0RXBsT2JkVW5zaWduZWQ4ICAgIHhEZWYjI2luZCMjXzB4MDBfZyA9IChjbnQpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljICBkdHlwICB4RGVmIyNpbmQjI18weDAxX2cgPSAoZGVmKTsKKyNkZWZpbmUgRVBMX09CRF9SQU1fSU5ERVhfUkFNX1ZBUkFSUkFZX05PSU5JVChpbmQsY250LGNhbGwsdHlwLGFjYyxkdHlwLG5hbWUpICAgc3RhdGljICB0RXBsT2JkVW5zaWduZWQ4ICAgIHhEZWYjI2luZCMjXzB4MDBfZyA9IChjbnQpOworCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVkFSKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUsdmFsKSAgICAgICAgICAgICAgICAgc3RhdGljICBkdHlwICB4RGVmIyNpbmQjI18jI3N1YiMjX2cgICAgICAgID0gdmFsOworI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WQVJfUkcoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwsbG93LGhpZ2gpICAgICBzdGF0aWMgIGR0eXAgIHhEZWYjI2luZCMjXyMjc3ViIyNfZ1szXSAgICAgPSB7dmFsLGxvdyxoaWdofTsKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVkFSX05PSU5JVChpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lKQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WU1RSSU5HKGluZCxzdWIsYWNjLG5hbWUsc2l6ZSx2YWwpICAgICAgICAgICAgICAgICBzdGF0aWMgY2hhciAgTUVNIHN6Q3VyIyNpbmQjI18jI3N1YiMjX2dbc2l6ZSsxXTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyAgdEVwbE9iZFZTdHJpbmdEZWYgIHhEZWYjI2luZCMjXyMjc3ViIyNfZyA9IHtzaXplLCB2YWwsIHN6Q3VyIyNpbmQjI18jI3N1YiMjX2d9OworCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX09TVFJJTkcoaW5kLHN1YixhY2MsbmFtZSxzaXplKSAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyAgQllURSAgTUVNIGJDdXIjI2luZCMjXyMjc3ViIyNfZ1tzaXplXTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyAgdEVwbE9iZE9TdHJpbmdEZWYgIHhEZWYjI2luZCMjXyMjc3ViIyNfZyA9IHtzaXplLCAoKEJZVEUqKSIiKSwgYkN1ciMjaW5kIyNfIyNzdWIjI19nfTsKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fRE9NQUlOKGluZCxzdWIsYWNjLG5hbWUpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1VTRVJERUYoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwpICAgICAgICAgICAgIHN0YXRpYyAgZHR5cCAgeERlZiMjaW5kIyNfIyNzdWIjI19nICAgICAgICA9IHZhbDsKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRl9SRyhpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCxsb3csaGlnaCkgc3RhdGljICBkdHlwICB4RGVmIyNpbmQjI18jI3N1YiMjX2dbM10gICAgID0ge3ZhbCxsb3csaGlnaH07CisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1VTRVJERUZfTk9JTklUKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VsaWYgZGVmaW5lZCAoRVBMX09CRF9DUkVBVEVfUkFNX0RBVEEpCisKKy8vICAgICAgICAjcHJhZ21hIG1lc3NhZ2UgKCJFUExfT0JEX0NSRUFURV9SQU1fREFUQSIpCisKKyNkZWZpbmUgRVBMX09CRF9CRUdJTigpCisjZGVmaW5lIEVQTF9PQkRfRU5EKCkKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fUEFSVF9HRU5FUklDKCkKKyNkZWZpbmUgRVBMX09CRF9CRUdJTl9QQVJUX01BTlVGQUNUVVJFUigpCisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fUEFSVF9ERVZJQ0UoKQorI2RlZmluZSBFUExfT0JEX0VORF9QQVJUKCkKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fSU5ERVhfUkFNKGluZCxjbnQsY2FsbCkKKyNkZWZpbmUgRVBMX09CRF9FTkRfSU5ERVgoaW5kKQorI2RlZmluZSBFUExfT0JEX1JBTV9JTkRFWF9SQU1fQVJSQVkoaW5kLGNudCxjYWxsLHR5cCxhY2MsZHR5cCxuYW1lLGRlZikgICAgICAgICBzdGF0aWMgZHR5cCAgICAgICAgIE1FTSBheEN1ciMjaW5kIyNfZ1tjbnRdOworI2RlZmluZSBFUExfT0JEX1JBTV9JTkRFWF9SQU1fVkFSQVJSQVkoaW5kLGNudCxjYWxsLHR5cCxhY2MsZHR5cCxuYW1lLGRlZikgICAgICBzdGF0aWMgdEVwbE9iZFZhckVudHJ5IE1FTSBhVmFyRW50cnkjI2luZCMjX2dbY250XTsKKyNkZWZpbmUgRVBMX09CRF9SQU1fSU5ERVhfUkFNX1ZBUkFSUkFZX05PSU5JVChpbmQsY250LGNhbGwsdHlwLGFjYyxkdHlwLG5hbWUpICAgc3RhdGljIHRFcGxPYmRWYXJFbnRyeSBNRU0gYVZhckVudHJ5IyNpbmQjI19nW2NudF07CisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WQVIoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwpICAgICAgICAgICAgICAgICBzdGF0aWMgZHR5cCAgICAgICAgIE1FTSB4Q3VyIyNpbmQjI18jI3N1YiMjX2c7CisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1ZBUl9SRyhpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCxsb3csaGlnaCkgICAgIHN0YXRpYyBkdHlwICAgICAgICAgTUVNIHhDdXIjI2luZCMjXyMjc3ViIyNfZzsKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVlNUUklORyhpbmQsc3ViLGFjYyxuYW1lLHNpemUsdmFsKSAgICAgICAgICAgICAgICAgc3RhdGljIHRFcGxPYmRWU3RyaW5nICBNRU0geEN1ciMjaW5kIyNfIyNzdWIjI19nOworI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9PU1RSSU5HKGluZCxzdWIsYWNjLG5hbWUsc2l6ZSkgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgdEVwbE9iZE9TdHJpbmcgIE1FTSB4Q3VyIyNpbmQjI18jI3N1YiMjX2c7CisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1ZBUl9OT0lOSVQoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSkgICAgICAgICAgICAgIHN0YXRpYyBkdHlwICAgICAgICAgTUVNIHhDdXIjI2luZCMjXyMjc3ViIyNfZzsKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fRE9NQUlOKGluZCxzdWIsYWNjLG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljIHRFcGxPYmRWYXJFbnRyeSBNRU0gVmFyRW50cnkjI2luZCMjXyMjc3ViIyNfZzsKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRihpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCkgICAgICAgICAgICAgc3RhdGljIHRFcGxPYmRWYXJFbnRyeSBNRU0gVmFyRW50cnkjI2luZCMjXyMjc3ViIyNfZzsKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRl9SRyhpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCxsb3csaGlnaCkgc3RhdGljIHRFcGxPYmRWYXJFbnRyeSBNRU0gVmFyRW50cnkjI2luZCMjXyMjc3ViIyNfZzsKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRl9OT0lOSVQoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSkgICAgICAgICAgc3RhdGljIHRFcGxPYmRWYXJFbnRyeSBNRU0gVmFyRW50cnkjI2luZCMjXyMjc3ViIyNfZzsKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VsaWYgZGVmaW5lZCAoRVBMX09CRF9DUkVBVEVfU1VCSU5ERVhfVEFCKQorCisvLyAgICAgICAgI3ByYWdtYSBtZXNzYWdlICgiRVBMX09CRF9DUkVBVEVfU1VCSU5ERVhfVEFCIikKKworI2RlZmluZSBFUExfT0JEX0JFR0lOKCkKKyNkZWZpbmUgRVBMX09CRF9FTkQoKQorCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRVBMX09CRF9CRUdJTl9QQVJUX0dFTkVSSUMoKQorI2RlZmluZSBFUExfT0JEX0JFR0lOX1BBUlRfTUFOVUZBQ1RVUkVSKCkKKyNkZWZpbmUgRVBMX09CRF9CRUdJTl9QQVJUX0RFVklDRSgpCisjZGVmaW5lIEVQTF9PQkRfRU5EX1BBUlQoKQorCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRVBMX09CRF9CRUdJTl9JTkRFWF9SQU0oaW5kLGNudCxjYWxsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljIHRFcGxPYmRTdWJFbnRyeSBNRU0gYU9iZFN1YkVudHJ5IyNpbmQjI1JhbV9nW2NudF09IHsKKyNkZWZpbmUgRVBMX09CRF9FTkRfSU5ERVgoaW5kKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVBMX09CRF9FTkRfU1VCSU5ERVgoKX07CisjZGVmaW5lIEVQTF9PQkRfUkFNX0lOREVYX1JBTV9BUlJBWShpbmQsY250LGNhbGwsdHlwLGFjYyxkdHlwLG5hbWUsZGVmKSAgICAgICAgIHN0YXRpYyB0RXBsT2JkU3ViRW50cnkgTUVNIGFPYmRTdWJFbnRyeSMjaW5kIyNSYW1fZ1tdPSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwga0VwbE9iZFR5cFVJbnQ4LCBrRXBsT2JkQWNjQ1IsICAgICAgICAgICZ4RGVmIyNpbmQjI18weDAwX2csICAgTlVMTH0sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MSwgdHlwLCAgICAgICAgICAoYWNjKXxrRXBsT2JkQWNjQXJyYXksICZ4RGVmIyNpbmQjI18weDAxX2csICAgJmF4Q3VyIyNpbmQjI19nWzBdfSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVQTF9PQkRfRU5EX1NVQklOREVYKCl9OworI2RlZmluZSBFUExfT0JEX1JBTV9JTkRFWF9SQU1fVkFSQVJSQVkoaW5kLGNudCxjYWxsLHR5cCxhY2MsZHR5cCxuYW1lLGRlZikgICAgICBzdGF0aWMgdEVwbE9iZFN1YkVudHJ5IE1FTSBhT2JkU3ViRW50cnkjI2luZCMjUmFtX2dbXT0geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIGtFcGxPYmRUeXBVSW50OCwga0VwbE9iZEFjY0NSLCAgICAgICAgICAgICAgICAgICAgICZ4RGVmIyNpbmQjI18weDAwX2csICAgTlVMTH0sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MSwgdHlwLCAgICAgICAgICAoYWNjKXxrRXBsT2JkQWNjQXJyYXl8a0VwbE9iZEFjY1ZhciwgJnhEZWYjI2luZCMjXzB4MDFfZywgICAmYVZhckVudHJ5IyNpbmQjI19nWzBdfSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVQTF9PQkRfRU5EX1NVQklOREVYKCl9OworI2RlZmluZSBFUExfT0JEX1JBTV9JTkRFWF9SQU1fVkFSQVJSQVlfTk9JTklUKGluZCxjbnQsY2FsbCx0eXAsYWNjLGR0eXAsbmFtZSkgICBzdGF0aWMgdEVwbE9iZFN1YkVudHJ5IE1FTSBhT2JkU3ViRW50cnkjI2luZCMjUmFtX2dbXT0geyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIGtFcGxPYmRUeXBVSW50OCwga0VwbE9iZEFjY0NSLCAgICAgICAgICAgICAgICAgICAgICZ4RGVmIyNpbmQjI18weDAwX2csICAgTlVMTH0sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MSwgdHlwLCAgICAgICAgICAoYWNjKXxrRXBsT2JkQWNjQXJyYXl8a0VwbE9iZEFjY1ZhciwgTlVMTCwgICAgICAgICAgICAgICAgICAmYVZhckVudHJ5IyNpbmQjI19nWzBdfSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVQTF9PQkRfRU5EX1NVQklOREVYKCl9OworCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVkFSKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUsdmFsKSAgICAgICAgICAgICAgICAge3N1Yix0eXAsICAgICAgICAgICAgKGFjYyksICAgICAgICAgICAgICAgICAgICAgICAgJnhEZWYjI2luZCMjXyMjc3ViIyNfZywgICAmeEN1ciMjaW5kIyNfIyNzdWIjI19nfSwKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVkFSX1JHKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUsdmFsLGxvdyxoaWdoKSAgICAge3N1Yix0eXAsICAgICAgICAgICAgKGFjYyl8a0VwbE9iZEFjY1JhbmdlLCAgICAgICAgICAgJnhEZWYjI2luZCMjXyMjc3ViIyNfZ1swXSwmeEN1ciMjaW5kIyNfIyNzdWIjI19nfSwKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVkFSX05PSU5JVChpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lKSAgICAgICAgICAgICAge3N1Yix0eXAsICAgICAgICAgICAgKGFjYyksICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAmeEN1ciMjaW5kIyNfIyNzdWIjI19nfSwKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVlNUUklORyhpbmQsc3ViLGFjYyxuYW1lLHNpemUsdmFsKSAgICAgICAgICAgICAgICAge3N1YixrRXBsT2JkVHlwVlN0cmluZywoYWNjKS8qfGtFcGxPYmRBY2NWYXIqLywgICAgICAgICAmeERlZiMjaW5kIyNfIyNzdWIjI19nLCAgICZ4Q3VyIyNpbmQjI18jI3N1YiMjX2d9LAorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9PU1RSSU5HKGluZCxzdWIsYWNjLG5hbWUsc2l6ZSkgICAgICAgICAgICAgICAgICAgICB7c3ViLGtFcGxPYmRUeXBPU3RyaW5nLChhY2MpLyp8a0VwbE9iZEFjY1ZhciovLCAgICAgICAgICZ4RGVmIyNpbmQjI18jI3N1YiMjX2csICAgJnhDdXIjI2luZCMjXyMjc3ViIyNfZ30sCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX0RPTUFJTihpbmQsc3ViLGFjYyxuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdWIsa0VwbE9iZFR5cERvbWFpbiwgKGFjYyl8a0VwbE9iZEFjY1ZhciwgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAmVmFyRW50cnkjI2luZCMjXyMjc3ViIyNfZ30sCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1VTRVJERUYoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwpICAgICAgICAgICAgIHtzdWIsdHlwLCAgICAgICAgICAgKGFjYyl8a0VwbE9iZEFjY1ZhciwgICAgICAgICAgICAgJnhEZWYjI2luZCMjXyMjc3ViIyNfZywgICAmVmFyRW50cnkjI2luZCMjXyMjc3ViIyNfZ30sCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1VTRVJERUZfUkcoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwsbG93LGhpZ2gpIHtzdWIsdHlwLCAgICAgICAgICAgKGFjYyl8a0VwbE9iZEFjY1ZhcnxrRXBsT2JkQWNjUmFuZ2UsJnhEZWYjI2luZCMjXyMjc3ViIyNfZ1swXSwmVmFyRW50cnkjI2luZCMjXyMjc3ViIyNfZ30sCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1VTRVJERUZfTk9JTklUKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUpICAgICAgICAgIHtzdWIsdHlwLCAgICAgICAgICAgKGFjYyl8a0VwbE9iZEFjY1ZhciwgICAgICAgICAgICAgTlVMTCwgICAgJlZhckVudHJ5IyNpbmQjI18jI3N1YiMjX2d9LAorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZWxpZiBkZWZpbmVkIChFUExfT0JEX0NSRUFURV9JTkRFWF9UQUIpCisKKy8vICAgICAgICAjcHJhZ21hIG1lc3NhZ2UgKCJFUExfT0JEX0NSRUFURV9JTkRFWF9UQUIiKQorCisjZGVmaW5lIEVQTF9PQkRfQkVHSU4oKQorI2RlZmluZSBFUExfT0JEX0VORCgpCisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBFUExfT0JEX0JFR0lOX1BBUlRfR0VORVJJQygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljICB0RXBsT2JkRW50cnkgIGFPYmRUYWJfZ1tdICAgICAgPSB7CisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fUEFSVF9NQU5VRkFDVFVSRVIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyAgdEVwbE9iZEVudHJ5ICBhT2JkVGFiTWFudWZhY3R1cmVyX2dbXSA9IHsKKyNkZWZpbmUgRVBMX09CRF9CRUdJTl9QQVJUX0RFVklDRSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljICB0RXBsT2JkRW50cnkgIGFPYmRUYWJEZXZpY2VfZ1tdICAgICAgID0geworI2RlZmluZSBFUExfT0JEX0VORF9QQVJUKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7RVBMX09CRF9UQUJMRV9JTkRFWF9FTkQsKHRFcGxPYmRTdWJFbnRyeVB0cikmZHdPYmRfT0JLX2csMCxOVUxMfX07CisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBFUExfT0JEX0JFR0lOX0lOREVYX1JBTShpbmQsY250LGNhbGwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aW5kLCh0RXBsT2JkU3ViRW50cnlQdHIpJmFPYmRTdWJFbnRyeSMjaW5kIyNSYW1fZ1swXSxjbnQsKHRFcGxPYmRDYWxsYmFjayljYWxsfSwKKyNkZWZpbmUgRVBMX09CRF9FTkRfSU5ERVgoaW5kKQorI2RlZmluZSBFUExfT0JEX1JBTV9JTkRFWF9SQU1fQVJSQVkoaW5kLGNudCxjYWxsLHR5cCxhY2MsZHR5cCxuYW1lLGRlZikgICAgICAgICB7aW5kLCh0RXBsT2JkU3ViRW50cnlQdHIpJmFPYmRTdWJFbnRyeSMjaW5kIyNSYW1fZ1swXSwoY250KSsxLCh0RXBsT2JkQ2FsbGJhY2spY2FsbH0sCisjZGVmaW5lIEVQTF9PQkRfUkFNX0lOREVYX1JBTV9WQVJBUlJBWShpbmQsY250LGNhbGwsdHlwLGFjYyxkdHlwLG5hbWUsZGVmKSAgICAgIHtpbmQsKHRFcGxPYmRTdWJFbnRyeVB0cikmYU9iZFN1YkVudHJ5IyNpbmQjI1JhbV9nWzBdLChjbnQpKzEsKHRFcGxPYmRDYWxsYmFjayljYWxsfSwKKyNkZWZpbmUgRVBMX09CRF9SQU1fSU5ERVhfUkFNX1ZBUkFSUkFZX05PSU5JVChpbmQsY250LGNhbGwsdHlwLGFjYyxkdHlwLG5hbWUpICAge2luZCwodEVwbE9iZFN1YkVudHJ5UHRyKSZhT2JkU3ViRW50cnkjI2luZCMjUmFtX2dbMF0sKGNudCkrMSwodEVwbE9iZENhbGxiYWNrKWNhbGx9LAorCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVkFSKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUsdmFsKQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WQVJfUkcoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwsbG93LGhpZ2gpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1ZTVFJJTkcoaW5kLHN1YixhY2MsbmFtZSxzaXplLHZhbCkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fT1NUUklORyhpbmQsc3ViLGFjYyxuYW1lLHNpemUpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1ZBUl9OT0lOSVQoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fRE9NQUlOKGluZCxzdWIsYWNjLG5hbWUpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1VTRVJERUYoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1VTRVJERUZfUkcoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwsbG93LGhpZ2gpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1VTRVJERUZfTk9JTklUKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUpCisKKwkgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZWxpZiBkZWZpbmVkIChFUExfT0JEX0NSRUFURV9JTklUX0ZVTkNUSU9OKQorCisvLyAgICAgICAgI3ByYWdtYSBtZXNzYWdlICgiRVBMX09CRF9DUkVBVEVfSU5JVF9GVU5DVElPTiIpCisKKyNkZWZpbmUgRVBMX09CRF9CRUdJTigpCisjZGVmaW5lIEVQTF9PQkRfRU5EKCkKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fUEFSVF9HRU5FUklDKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5pdFBhcmFtLT5tX3BQYXJ0ICAgICAgPSAodEVwbE9iZEVudHJ5UHRyKSAmYU9iZFRhYl9nWzBdOworI2RlZmluZSBFUExfT0JEX0JFR0lOX1BBUlRfTUFOVUZBQ1RVUkVSKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5pdFBhcmFtLT5tX3BNYW51ZmFjdHVyZXJQYXJ0ID0gKHRFcGxPYmRFbnRyeVB0cikgJmFPYmRUYWJNYW51ZmFjdHVyZXJfZ1swXTsKKyNkZWZpbmUgRVBMX09CRF9CRUdJTl9QQVJUX0RFVklDRSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluaXRQYXJhbS0+bV9wRGV2aWNlUGFydCAgICAgICA9ICh0RXBsT2JkRW50cnlQdHIpICZhT2JkVGFiRGV2aWNlX2dbMF07CisjZGVmaW5lIEVQTF9PQkRfRU5EX1BBUlQoKQorCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRVBMX09CRF9CRUdJTl9JTkRFWF9SQU0oaW5kLGNudCxjYWxsKQorI2RlZmluZSBFUExfT0JEX0VORF9JTkRFWChpbmQpCisjZGVmaW5lIEVQTF9PQkRfUkFNX0lOREVYX1JBTV9BUlJBWShpbmQsY250LGNhbGwsdHlwLGFjYyxkdHlwLG5hbWUsZGVmKQorI2RlZmluZSBFUExfT0JEX1JBTV9JTkRFWF9SQU1fVkFSQVJSQVkoaW5kLGNudCxjYWxsLHR5cCxhY2MsZHR5cCxuYW1lLGRlZikKKyNkZWZpbmUgRVBMX09CRF9SQU1fSU5ERVhfUkFNX1ZBUkFSUkFZX05PSU5JVChpbmQsY250LGNhbGwsdHlwLGFjYyxkdHlwLG5hbWUpCisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WQVIoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1ZBUl9SRyhpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCxsb3csaGlnaCkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVlNUUklORyhpbmQsc3ViLGFjYyxuYW1lLHNpemUsdmFsKQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9PU1RSSU5HKGluZCxzdWIsYWNjLG5hbWUsc2l6ZSkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVkFSX05PSU5JVChpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lKQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9ET01BSU4oaW5kLHN1YixhY2MsbmFtZSkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRihpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRl9SRyhpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lLHZhbCxsb3csaGlnaCkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRl9OT0lOSVQoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSkKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VsaWYgZGVmaW5lZCAoRVBMX09CRF9DUkVBVEVfSU5JVF9TVUJJTkRFWCkKKworLy8gICAgICAgICNwcmFnbWEgbWVzc2FnZSAoIkVQTF9PQkRfQ1JFQVRFX0lOSVRfU1VCSU5ERVgiKQorCisjZGVmaW5lIEVQTF9PQkRfQkVHSU4oKQorI2RlZmluZSBFUExfT0JEX0VORCgpCisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBFUExfT0JEX0JFR0lOX1BBUlRfR0VORVJJQygpCisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fUEFSVF9NQU5VRkFDVFVSRVIoKQorI2RlZmluZSBFUExfT0JEX0JFR0lOX1BBUlRfREVWSUNFKCkKKyNkZWZpbmUgRVBMX09CRF9FTkRfUEFSVCgpCisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBFUExfT0JEX0JFR0lOX0lOREVYX1JBTShpbmQsY250LGNhbGwpCS8vQ0NNX1NVQklOREVYX1JBTV9PTkxZIChFUExfTUVNQ1BZICgmYU9iZFN1YkVudHJ5IyNpbmQjI1JhbV9nWzBdLCZhT2JkU3ViRW50cnkjI2luZCMjUm9tX2dbMF0sc2l6ZW9mKGFPYmRTdWJFbnRyeSMjaW5kIyNSYW1fZykpKTsKKyNkZWZpbmUgRVBMX09CRF9FTkRfSU5ERVgoaW5kKQorI2RlZmluZSBFUExfT0JEX1JBTV9JTkRFWF9SQU1fQVJSQVkoaW5kLGNudCxjYWxsLHR5cCxhY2MsZHR5cCxuYW1lLGRlZikJLy9FUExfTUVNQ1BZICgmYU9iZFN1YkVudHJ5IyNpbmQjI1JhbV9nWzBdLCZhT2JkU3ViRW50cnkjI2luZCMjUm9tX2dbMF0sc2l6ZW9mKGFPYmRTdWJFbnRyeSMjaW5kIyNSYW1fZykpOworI2RlZmluZSBFUExfT0JEX1JBTV9JTkRFWF9SQU1fVkFSQVJSQVkoaW5kLGNudCxjYWxsLHR5cCxhY2MsZHR5cCxuYW1lLGRlZikJLy9FUExfTUVNQ1BZICgmYU9iZFN1YkVudHJ5IyNpbmQjI1JhbV9nWzBdLCZhT2JkU3ViRW50cnkjI2luZCMjUm9tX2dbMF0sc2l6ZW9mKGFPYmRTdWJFbnRyeSMjaW5kIyNSYW1fZykpOworI2RlZmluZSBFUExfT0JEX1JBTV9JTkRFWF9SQU1fVkFSQVJSQVlfTk9JTklUKGluZCxjbnQsY2FsbCx0eXAsYWNjLGR0eXAsbmFtZSkJLy9FUExfTUVNQ1BZICgmYU9iZFN1YkVudHJ5IyNpbmQjI1JhbV9nWzBdLCZhT2JkU3ViRW50cnkjI2luZCMjUm9tX2dbMF0sc2l6ZW9mKGFPYmRTdWJFbnRyeSMjaW5kIyNSYW1fZykpOworCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVkFSKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUsdmFsKQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WQVJfUkcoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwsbG93LGhpZ2gpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1ZTVFJJTkcoaW5kLHN1YixhY2MsbmFtZSxzaXplLHZhbCkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fT1NUUklORyhpbmQsc3ViLGFjYyxuYW1lLHNpemUpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1ZBUl9OT0lOSVQoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSkKKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fRE9NQUlOKGluZCxzdWIsYWNjLG5hbWUpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1VTRVJERUYoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1VTRVJERUZfUkcoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwsbG93LGhpZ2gpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1VTRVJERUZfTk9JTklUKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUpCisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNlbHNlCisKKy8vICAgICAgICAjcHJhZ21hIG1lc3NhZ2UgKCJFTFNFIE9GIERFRklORSIpCisKKyNkZWZpbmUgRVBMX09CRF9CRUdJTigpCisjZGVmaW5lIEVQTF9PQkRfRU5EKCkKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fUEFSVF9HRU5FUklDKCkKKyNkZWZpbmUgRVBMX09CRF9CRUdJTl9QQVJUX01BTlVGQUNUVVJFUigpCisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fUEFSVF9ERVZJQ0UoKQorI2RlZmluZSBFUExfT0JEX0VORF9QQVJUKCkKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEVQTF9PQkRfQkVHSU5fSU5ERVhfUkFNKGluZCxjbnQsY2FsbCkKKyNkZWZpbmUgRVBMX09CRF9FTkRfSU5ERVgoaW5kKQorI2RlZmluZSBFUExfT0JEX1JBTV9JTkRFWF9SQU1fQVJSQVkoaW5kLGNudCxjYWxsLHR5cCxhY2MsZHR5cCxuYW1lLGRlZikKKyNkZWZpbmUgRVBMX09CRF9SQU1fSU5ERVhfUkFNX1ZBUkFSUkFZKGluZCxjbnQsY2FsbCx0eXAsYWNjLGR0eXAsbmFtZSxkZWYpCisjZGVmaW5lIEVQTF9PQkRfUkFNX0lOREVYX1JBTV9WQVJBUlJBWV9OT0lOSVQoaW5kLGNudCxjYWxsLHR5cCxhY2MsZHR5cCxuYW1lKQorCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRVBMX09CRF9TVUJJTkRFWF9SQU1fVkFSKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUsdmFsKQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WQVJfUkcoaW5kLHN1Yix0eXAsYWNjLGR0eXAsbmFtZSx2YWwsbG93LGhpZ2gpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1ZTVFJJTkcoaW5kLHN1YixhY2MsbmFtZSxzaXplcyx2YWwpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX09TVFJJTkcoaW5kLHN1YixhY2MsbmFtZSxzaXplKQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9WQVJfTk9JTklUKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUpCisjZGVmaW5lIEVQTF9PQkRfU1VCSU5ERVhfUkFNX0RPTUFJTihpbmQsc3ViLGFjYyxuYW1lKQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9VU0VSREVGKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUsdmFsKQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9VU0VSREVGX1JHKGluZCxzdWIsdHlwLGFjYyxkdHlwLG5hbWUsdmFsLGxvdyxoaWdoKQorI2RlZmluZSBFUExfT0JEX1NVQklOREVYX1JBTV9VU0VSREVGX05PSU5JVChpbmQsc3ViLHR5cCxhY2MsZHR5cCxuYW1lKQorCisjZW5kaWYKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VsaWYgZGVmaW5lZCAoRVBMX09CRF9VTkRFRklORV9NQUNSTykKKworLy8gICAgI3ByYWdtYSBtZXNzYWdlICgiRVBMX09CRF9VTkRFRklORV9NQUNSTyIpCisKKyN1bmRlZiBFUExfT0JEX0JFR0lOCisjdW5kZWYgRVBMX09CRF9FTkQKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjdW5kZWYgRVBMX09CRF9CRUdJTl9QQVJUX0dFTkVSSUMKKyN1bmRlZiBFUExfT0JEX0JFR0lOX1BBUlRfTUFOVUZBQ1RVUkVSCisjdW5kZWYgRVBMX09CRF9CRUdJTl9QQVJUX0RFVklDRQorI3VuZGVmIEVQTF9PQkRfRU5EX1BBUlQKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjdW5kZWYgRVBMX09CRF9CRUdJTl9JTkRFWF9SQU0KKyN1bmRlZiBFUExfT0JEX0VORF9JTkRFWAorI3VuZGVmIEVQTF9PQkRfUkFNX0lOREVYX1JBTV9BUlJBWQorI3VuZGVmIEVQTF9PQkRfUkFNX0lOREVYX1JBTV9WQVJBUlJBWQorI3VuZGVmIEVQTF9PQkRfUkFNX0lOREVYX1JBTV9WQVJBUlJBWV9OT0lOSVQKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjdW5kZWYgRVBMX09CRF9TVUJJTkRFWF9SQU1fVkFSCisjdW5kZWYgRVBMX09CRF9TVUJJTkRFWF9SQU1fVkFSX1JHCisjdW5kZWYgRVBMX09CRF9TVUJJTkRFWF9SQU1fVlNUUklORworI3VuZGVmIEVQTF9PQkRfU1VCSU5ERVhfUkFNX09TVFJJTkcKKyN1bmRlZiBFUExfT0JEX1NVQklOREVYX1JBTV9WQVJfTk9JTklUCisjdW5kZWYgRVBMX09CRF9TVUJJTkRFWF9SQU1fRE9NQUlOCisjdW5kZWYgRVBMX09CRF9TVUJJTkRFWF9SQU1fVVNFUkRFRgorI3VuZGVmIEVQTF9PQkRfU1VCSU5ERVhfUkFNX1VTRVJERUZfUkcKKyN1bmRlZiBFUExfT0JEX1NVQklOREVYX1JBTV9VU0VSREVGX05PSU5JVAorCisjZWxzZQorCisjZXJyb3IgIm5vdGhpbmcgZGVmaW5lZCIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE9iZGtDYWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsT2Jka0NhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjOWFmODkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE9iZGtDYWwuYwpAQCAtMCwwICsxLDE0NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBjb21tdW5pY2F0aW9uIGFic3RyYWN0aW9uIGxheWVyCisgICAgICAgICAgICAgICAgZm9yIHRoZSBFcGwtT2JkLUtlcm5lbHNwYWNlLU1vZHVsCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsT2Jka0NhbC5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgIEtFSUwgdVZpc2lvbiAyCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8xOSBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiRXBsSW5jLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbE9iZGtDYWwuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczoKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246CisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOgorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBFT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsT2JkdS5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxPYmR1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE4ZDE1MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsT2JkdS5jCkBAIC0wLDAgKzEsNTE3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgc291cmNlIGZpbGUgZm9yIEVwbC1PYmQtVXNlcnNwYWNlLW1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE9iZHUuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzE5IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJFcGxJbmMuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbE9iZHUuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbE9iZHVDYWwuaCIKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JEVSkpICE9IDApCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVXcml0ZUVudHJ5KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogRnVuY3Rpb24gd3JpdGVzIGRhdGEgdG8gYW4gT0JEIGVudHJ5LiBTdHJpbmdzCisvLyAgICAgICAgICAgICAgYXJlIHN0b3JlZCB3aXRoIGFkZGVkICdcMCcgY2hhcmFjdGVyLgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aUluZGV4X3AgICAgICAgPSAgIEluZGV4IG9mIHRoZSBPRCBlbnRyeQorLy8gICAgICAgICAgICAgIHVpU3ViSW5kZXhfcCAgICA9ICAgU3ViaW5kZXggb2YgdGhlIE9EIEVudHJ5CisvLyAgICAgICAgICAgICAgcFNyY0RhdGFfcCAgICAgID0gICBQb2ludGVyIHRvIHRoZSBkYXRhIHRvIHdyaXRlCisvLyAgICAgICAgICAgICAgU2l6ZV9wICAgICAgICAgID0gICBTaXplIG9mIHRoZSBkYXRhIGluIEJ5dGUKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgICAgID0gICBFcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1V3JpdGVFbnRyeSh1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCQkgdm9pZCAqcFNyY0RhdGFfcCwKKwkJCQkJCSB0RXBsT2JkU2l6ZSBTaXplX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBFcGxPYmR1Q2FsV3JpdGVFbnRyeSh1aUluZGV4X3AsIHVpU3ViSW5kZXhfcCwgcFNyY0RhdGFfcCwgU2l6ZV9wKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVSZWFkRW50cnkoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBUaGUgZnVuY3Rpb24gcmVhZHMgYW4gb2JqZWN0IGVudHJ5LiBUaGUgYXBwbGljYXRpb24KKy8vICAgICAgICAgICAgICBjYW4gYWx3YXlzIHJlYWQgdGhlIGRhdGEgZXZlbiBpZiBhdHRyaWIga0VwbE9iZEFjY1JlYWQKKy8vICAgICAgICAgICAgICBpcyBub3Qgc2V0LiBUaGUgYXR0cmliIGlzIG9ubHkgY2hlY2tlZCB1cCBmb3IgU0RPIHRyYW5zZmVyLgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aUluZGV4X3AgICAgICAgPSBJbmRleCBvb2YgdGhlIE9EIGVudHJ5IHRvIHJlYWQKKy8vICAgICAgICAgICAgICB1aVN1YkluZGV4X3AgICAgPSBTdWJpbmRleCB0byByZWFkCisvLyAgICAgICAgICAgICAgcERzdERhdGFfcCAgICAgID0gcG9pbnRlciB0byB0aGUgYnVmZmVyIGZvciBkYXRhCisvLyAgICAgICAgICAgICAgT2Zmc2V0X3AgICAgICAgID0gb2Zmc2V0IGluIGRhdGEgZm9yIHJlYWQgYWNjZXNzCisvLyAgICAgICAgICAgICAgcFNpemVfcCAgICAgICAgID0gSU46IFNpemUgb2YgdGhlIGJ1ZmZlcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDogbnVtYmVyIG9mIHJlYWRlZCBCeXRlcworLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgPSAgIGVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdVJlYWRFbnRyeSh1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCwKKwkJCQkJCXZvaWQgKnBEc3REYXRhX3AsCisJCQkJCQl0RXBsT2JkU2l6ZSAqIHBTaXplX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBFcGxPYmR1Q2FsUmVhZEVudHJ5KHVpSW5kZXhfcCwgdWlTdWJJbmRleF9wLCBwRHN0RGF0YV9wLCBwU2l6ZV9wKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZEFjY2Vzc09kUGFydCgpCisvLworLy8gRGVzY3JpcHRpb246IHJlc3RvcmVzIGRlZmF1bHQgdmFsdWVzIG9mIG9uZSBwYXJ0IG9mIE9ECisvLworLy8gUGFyYW1ldGVyczogIE9iZFBhcnRfcCAgICAgICA9IG9kLXBhcnQgdG8gcmVzZXQKKy8vICAgICAgICAgICAgICBEaXJlY3Rpb25fcCAgICAgPSBkaXJlY3RvcnkgZmxhZyBmb3IKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVBY2Nlc3NPZFBhcnQodEVwbE9iZFBhcnQgT2JkUGFydF9wLAorCQkJCQkJICAgdEVwbE9iZERpciBEaXJlY3Rpb25fcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IEVwbE9iZHVDYWxBY2Nlc3NPZFBhcnQoT2JkUGFydF9wLCBEaXJlY3Rpb25fcCk7CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmR1RGVmaW5lVmFyKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZGVmaW5lcyBhIHZhcmlhYmxlIGluIE9ECisvLworLy8gUGFyYW1ldGVyczogIHBFcGxWYXJQYXJhbV9wID0gdmFyZW50cnkKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgPSAgIGVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdURlZmluZVZhcih0RXBsVmFyUGFyYW0gTUVNICogcFZhclBhcmFtX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBFcGxPYmR1Q2FsRGVmaW5lVmFyKHBWYXJQYXJhbV9wKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVHZXRPYmplY3REYXRhUHRyKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogSXQgcmV0dXJuZXMgdGhlIGN1cnJlbnQgZGF0YSBwb2ludGVyLiBCdXQgaWYgb2JqZWN0IGlzIGFuCisvLyAgICAgICAgICAgICAgY29uc3RhbnQgb2JqZWN0IGl0IHJldHVybmVzIHRoZSBkZWZhdWx0IHBvaW50ZXIuCisvLworLy8gUGFyYW1ldGVyczogIHVpSW5kZXhfcCAgICA9ICAgSW5kZXggb2YgdGhlIGVudHJ5CisvLyAgICAgICAgICAgICAgdWlTdWJpbmRleF9wID0gICBTdWJpbmRleCBvZiB0aGUgZW50cnkKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZCAqICAgID0gcG9pbnRlciB0byBvYmplY3QgZGF0YQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdm9pZCAqUFVCTElDIEVwbE9iZHVHZXRPYmplY3REYXRhUHRyKHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3ApCit7CisJdm9pZCAqcERhdGE7CisKKwlwRGF0YSA9IEVwbE9iZHVDYWxHZXRPYmplY3REYXRhUHRyKHVpSW5kZXhfcCwgdWlTdWJJbmRleF9wKTsKKworCXJldHVybiBwRGF0YTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkdVJlZ2lzdGVyVXNlck9kKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gcmVnaXN0ZXJzIHRoZSB1c2VyIE9ECisvLworLy8gUGFyYW1ldGVyczogIHBVc2VyT2RfcCAgID1wb2ludGVyIHRvIHVzZXIgT0RkCisvLworLy8gUmV0dXJuOiAgICAgdEVwbEtlcm5lbCA9IGVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgKGRlZmluZWQgKEVQTF9PQkRfVVNFUl9PRCkgJiYgKEVQTF9PQkRfVVNFUl9PRCAhPSBGQUxTRSkpCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdVJlZ2lzdGVyVXNlck9kKHRFcGxPYmRFbnRyeVB0ciBwVXNlck9kX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBFcGxPYmR1Q2FsUmVnaXN0ZXJVc2VyT2QocFVzZXJPZF9wKTsKKworCXJldHVybiBSZXQ7CisKK30KKyNlbmRpZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkdUluaXRWYXJFbnRyeSgpCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgVmFyRW50cnkgZGVwZW5kZW5lZCBvbiBvYmplY3QgdHlwZQorLy8KKy8vIFBhcmFtZXRlcnM6ICBwVmFyRW50cnlfcCA9IHBvaW50ZXIgdG8gdmFyIGVudHJ5IHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgIGJUeXBlX3AgICAgID0gb2JqZWN0IHR5cGUKKy8vICAgICAgICAgICAgICBPYmRTaXplX3AgICA9IHNpemUgb2Ygb2JqZWN0IGRhdGEKKy8vCisvLyBSZXR1cm5zOiAgICAgbm9uZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdm9pZCBQVUJMSUMgRXBsT2JkdUluaXRWYXJFbnRyeSh0RXBsT2JkVmFyRW50cnkgTUVNICogcFZhckVudHJ5X3AsCisJCQkJCSAgICAgQllURSBiVHlwZV9wLAorCQkJCQkgICAgIHRFcGxPYmRTaXplIE9iZFNpemVfcCkKK3sKKwlFcGxPYmR1Q2FsSW5pdFZhckVudHJ5KHBWYXJFbnRyeV9wLCBiVHlwZV9wLCBPYmRTaXplX3ApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmR1R2V0RGF0YVNpemUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiB0byBpbml0aWFsaXplIFZhckVudHJ5IGRlcGVuZGVuZWQgb24gb2JqZWN0IHR5cGUKKy8vCisvLyAgICAgICAgICAgICAgZ2V0cyB0aGUgZGF0YSBzaXplIG9mIGFuIG9iamVjdAorLy8gICAgICAgICAgICAgIGZvciBzdHJpbmcgb2JqZWN0cyBpdCByZXR1cm5lcyB0aGUgc3RyaW5nIGxlbmd0aAorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aUluZGV4X3AgICA9ICAgSW5kZXgKKy8vICAgICAgICAgICAgICB1aVN1YkluZGV4X3A9ICAgU3ViaW5kZXgKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbE9iZFNpemUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxPYmRTaXplIFBVQkxJQyBFcGxPYmR1R2V0RGF0YVNpemUodW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3ApCit7CisJdEVwbE9iZFNpemUgU2l6ZTsKKworCVNpemUgPSBFcGxPYmR1Q2FsR2V0RGF0YVNpemUodWlJbmRleF9wLCB1aVN1YkluZGV4X3ApOworCisJcmV0dXJuIFNpemU7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVHZXROb2RlSWQoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiByZXR1cm5zIG5vZGVpZCBmcm9tIGVudHJ5IDB4MUY5MworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vIFJldHVybjogICAgICB1bnNpZ25lZCBpbnQgPSBOb2RlIElkCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB1bnNpZ25lZCBpbnQgUFVCTElDIEVwbE9iZHVHZXROb2RlSWQoKQoreworCXVuc2lnbmVkIGludCB1aU5vZGVJZDsKKworCXVpTm9kZUlkID0gRXBsT2JkdUNhbEdldE5vZGVJZCgpOworCisJcmV0dXJuIHVpTm9kZUlkOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmR1U2V0Tm9kZUlkKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gc2V0cyBub2RlaWQgaW4gZW50cnkgMHgxRjkzCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICA9ICAgTm9kZSBJZCB0byBzZXQKKy8vICAgICAgICAgICAgICBOb2RlSWRUeXBlX3A9ICAgVHlwZSBvbiB3aGljaCB3YXkgdGhlIE5vZGUgSWQgd2FzIHNldAorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsID0gRXJyb3Jjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1U2V0Tm9kZUlkKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkJdEVwbE9iZE5vZGVJZFR5cGUgTm9kZUlkVHlwZV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0gRXBsT2JkdUNhbFNldE5vZGVJZCh1aU5vZGVJZF9wLCBOb2RlSWRUeXBlX3ApOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkdUdldEFjY2Vzc1R5cGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiByZXR1cm5zIGFjY2Vzc3R5cGUgb2YgdGhlIGVudHJ5CisvLworLy8gUGFyYW1ldGVyczogIHVpSW5kZXhfcCAgICAgICA9ICAgSW5kZXggb2YgdGhlIE9EIGVudHJ5CisvLyAgICAgICAgICAgICAgdWlTdWJJbmRleF9wICAgID0gICBTdWJpbmRleCBvZiB0aGUgT0QgRW50cnkKKy8vICAgICAgICAgICAgICBwQWNjZXNzVHlwX3AgICAgPSAgIHBvaW50ZXIgdG8gYnVmZmVyIHRvIHN0b3JlIGFjY2Vzc3R5cAorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgPSAgIEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVHZXRBY2Nlc3NUeXBlKHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICAgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCwKKwkJCQkJCSAgICB0RXBsT2JkQWNjZXNzICoKKwkJCQkJCSAgICBwQWNjZXNzVHlwX3ApCit7CisJdEVwbE9iZEFjY2VzcyBBY2Nlc3NUeXBlOworCisJQWNjZXNzVHlwZSA9CisJICAgIEVwbE9iZHVDYWxHZXRBY2Nlc3NUeXBlKHVpSW5kZXhfcCwgdWlTdWJJbmRleF9wLCBwQWNjZXNzVHlwX3ApOworCisJcmV0dXJuIEFjY2Vzc1R5cGU7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZFJlYWR1RW50cnlUb0xlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogVGhlIGZ1bmN0aW9uIHJlYWRzIGFuIG9iamVjdCBlbnRyeSBmcm9tIHRoZSBieXRlb2RlcgorLy8gICAgICAgICAgICAgIG9mIHRoZSBzeXN0ZW0gdG8gdGhlIGxpdHRsZSBlbmRpYW4gYnl0ZW9yZGVyIGZvciBudW1lcmljIHZhbHVlcy4KKy8vICAgICAgICAgICAgICBGb3Igb3RoZXIgdHlwZXMgYSBub3JtYWwgcmVhZCB3aWxsIGJlIHByb2Nlc3NlZC4gVGhpcyBpcyB1c2VmdWxsIGZvcgorLy8gICAgICAgICAgICAgIHRoZSBQRE8gYW5kIFNETyBtb2R1bGUuIFRoZSBhcHBsaWNhdGlvbgorLy8gICAgICAgICAgICAgIGNhbiBhbHdheXMgcmVhZCB0aGUgZGF0YSBldmVuIGlmIGF0dHJpYiBrRXBsT2JkQWNjUmVhZAorLy8gICAgICAgICAgICAgIGlzIG5vdCBzZXQuIFRoZSBhdHRyaWIgaXMgb25seSBjaGVja2VkIHVwIGZvciBTRE8gdHJhbnNmZXIuCisvLworLy8gUGFyYW1ldGVyczogIEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisvLyAgICAgICAgICAgICAgdWlJbmRleF9wICAgICAgID0gSW5kZXggb2YgdGhlIE9EIGVudHJ5IHRvIHJlYWQKKy8vICAgICAgICAgICAgICB1aVN1YkluZGV4X3AgICAgPSBTdWJpbmRleCB0byByZWFkCisvLyAgICAgICAgICAgICAgcERzdERhdGFfcCAgICAgID0gcG9pbnRlciB0byB0aGUgYnVmZmVyIGZvciBkYXRhCisvLyAgICAgICAgICAgICAgT2Zmc2V0X3AgICAgICAgID0gb2Zmc2V0IGluIGRhdGEgZm9yIHJlYWQgYWNjZXNzCisvLyAgICAgICAgICAgICAgcFNpemVfcCAgICAgICAgID0gSU46IFNpemUgb2YgdGhlIGJ1ZmZlcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDogbnVtYmVyIG9mIHJlYWRlZCBCeXRlcworLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1UmVhZEVudHJ5VG9MZSh1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJICAgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCQkgICAgdm9pZCAqcERzdERhdGFfcCwKKwkJCQkJCSAgICB0RXBsT2JkU2l6ZSAqIHBTaXplX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPQorCSAgICBFcGxPYmR1Q2FsUmVhZEVudHJ5VG9MZSh1aUluZGV4X3AsIHVpU3ViSW5kZXhfcCwgcERzdERhdGFfcCwKKwkJCQkgICAgcFNpemVfcCk7CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmR1V3JpdGVFbnRyeUZyb21MZSgpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIHdyaXRlcyBkYXRhIHRvIGFuIE9CRCBlbnRyeSBmcm9tIGEgc291cmNlIHdpdGgKKy8vICAgICAgICAgICAgICBsaXR0bGUgZW5kaWFuIGJ5dGVvcmRlciB0byB0aGUgb2Qgd2l0aCBzeXN0ZW0gc3BlY3VpZmljCisvLyAgICAgICAgICAgICAgYnl0ZW9yZGVyLiBOb3QgbnVtZXJpYyB2YWx1ZXMgd2lsbCBvbmx5IGJ5IGNvcGllZC4gU3RyaW5ncworLy8gICAgICAgICAgICAgIGFyZSBzdG9yZWQgd2l0aCBhZGRlZCAnXDAnIGNoYXJhY3Rlci4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKy8vICAgICAgICAgICAgICB1aUluZGV4X3AgICAgICAgPSAgIEluZGV4IG9mIHRoZSBPRCBlbnRyeQorLy8gICAgICAgICAgICAgIHVpU3ViSW5kZXhfcCAgICA9ICAgU3ViaW5kZXggb2YgdGhlIE9EIEVudHJ5CisvLyAgICAgICAgICAgICAgcFNyY0RhdGFfcCAgICAgID0gICBQb2ludGVyIHRvIHRoZSBkYXRhIHRvIHdyaXRlCisvLyAgICAgICAgICAgICAgU2l6ZV9wICAgICAgICAgID0gICBTaXplIG9mIHRoZSBkYXRhIGluIEJ5dGUKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgICAgID0gICBFcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1V3JpdGVFbnRyeUZyb21MZSh1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJICAgICAgIHVuc2lnbmVkIGludAorCQkJCQkJICAgICAgIHVpU3ViSW5kZXhfcCwKKwkJCQkJCSAgICAgICB2b2lkICpwU3JjRGF0YV9wLAorCQkJCQkJICAgICAgIHRFcGxPYmRTaXplIFNpemVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9CisJICAgIEVwbE9iZHVDYWxXcml0ZUVudHJ5RnJvbUxlKHVpSW5kZXhfcCwgdWlTdWJJbmRleF9wLCBwU3JjRGF0YV9wLAorCQkJCSAgICAgICBTaXplX3ApOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkdVNlYXJjaFZhckVudHJ5KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZ2V0cyB2YXJpYWJsZSBmcm9tIE9ECisvLworLy8gUGFyYW1ldGVyczogIHVpSW5kZXhfcCAgICAgICA9ICAgaW5kZXggb2YgdGhlIHZhciBlbnRyeSB0byBzZWFyY2gKKy8vICAgICAgICAgICAgICB1aVN1YmluZGV4X3AgICAgPSAgIHN1YmluZGV4IG9mIHZhciBlbnRyeSB0byBzZWFyY2gKKy8vICAgICAgICAgICAgICBwcFZhckVudHJ5X3AgICAgPSAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIHZhcmVudHJ5CisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVTZWFyY2hWYXJFbnRyeShFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlTdWJpbmRleF9wLAorCQkJCQkJICAgICB0RXBsT2JkVmFyRW50cnkgTUVNICoqCisJCQkJCQkgICAgIHBwVmFyRW50cnlfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IEVwbE9iZHVDYWxTZWFyY2hWYXJFbnRyeSh1aUluZGV4X3AsIHVpU3ViaW5kZXhfcCwgcHBWYXJFbnRyeV9wKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczoKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmIC8vICNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JEVSkpICE9IDApCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxPYmR1Q2FsLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE9iZHVDYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWIzZGYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxPYmR1Q2FsLmMKQEAgLTAsMCArMSw1NTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgY29tbXVuaWNhdGlvbiBhYnN0cmFjdGlvbiBsYXllcgorICAgICAgICAgICAgICAgIGZvciB0aGUgRXBsLU9iZC1Vc2Vyc3BhY2UtTW9kdWwKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxPYmR1Q2FsLmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8xOSBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgIkVwbEluYy5oIgorI2luY2x1ZGUgInVzZXIvRXBsT2JkdUNhbC5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxPYmRrLmgiCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CRFUpKSAhPSAwKSAmJiAoRVBMX09CRF9VU0VfS0VSTkVMICE9IEZBTFNFKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVDYWxXcml0ZUVudHJ5KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogRnVuY3Rpb24gZW5jYXBzdWxhdGUgYWNjZXNzIG9mIGZ1bmN0aW9uIEVwbE9iZFdyaXRlRW50cnkKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlJbmRleF9wICAgICAgID0gICBJbmRleCBvZiB0aGUgT0QgZW50cnkKKy8vICAgICAgICAgICAgICB1aVN1YkluZGV4X3AgICAgPSAgIFN1YmluZGV4IG9mIHRoZSBPRCBFbnRyeQorLy8gICAgICAgICAgICAgIHBTcmNEYXRhX3AgICAgICA9ICAgUG9pbnRlciB0byB0aGUgZGF0YSB0byB3cml0ZQorLy8gICAgICAgICAgICAgIFNpemVfcCAgICAgICAgICA9ICAgU2l6ZSBvZiB0aGUgZGF0YSBpbiBCeXRlCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgICAgICA9ICAgRXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdUNhbFdyaXRlRW50cnkodW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkJICAgIHZvaWQgKnBTcmNEYXRhX3AsCisJCQkJCQkgICAgdEVwbE9iZFNpemUgU2l6ZV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CREspKSAhPSAwKQorCVJldCA9IEVwbE9iZFdyaXRlRW50cnkodWlJbmRleF9wLCB1aVN1YkluZGV4X3AsIHBTcmNEYXRhX3AsIFNpemVfcCk7CisjZWxzZQorCVJldCA9IGtFcGxTdWNjZXNzZnVsOworI2VuZGlmCisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmR1Q2FsUmVhZEVudHJ5KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogRnVuY3Rpb24gZW5jYXBzdWxhdGUgYWNjZXNzIG9mIGZ1bmN0aW9uIEVwbE9iZFJlYWRFbnRyeQorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aUluZGV4X3AgICAgICAgPSBJbmRleCBvb2YgdGhlIE9EIGVudHJ5IHRvIHJlYWQKKy8vICAgICAgICAgICAgICB1aVN1YkluZGV4X3AgICAgPSBTdWJpbmRleCB0byByZWFkCisvLyAgICAgICAgICAgICAgcERzdERhdGFfcCAgICAgID0gcG9pbnRlciB0byB0aGUgYnVmZmVyIGZvciBkYXRhCisvLyAgICAgICAgICAgICAgT2Zmc2V0X3AgICAgICAgID0gb2Zmc2V0IGluIGRhdGEgZm9yIHJlYWQgYWNjZXNzCisvLyAgICAgICAgICAgICAgcFNpemVfcCAgICAgICAgID0gSU46IFNpemUgb2YgdGhlIGJ1ZmZlcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDogbnVtYmVyIG9mIHJlYWRlZCBCeXRlcworLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgPSAgIGVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdUNhbFJlYWRFbnRyeSh1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJICAgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCwKKwkJCQkJCSAgIHZvaWQgKnBEc3REYXRhX3AsCisJCQkJCQkgICB0RXBsT2JkU2l6ZSAqIHBTaXplX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JESykpICE9IDApCisJUmV0ID0gRXBsT2JkUmVhZEVudHJ5KHVpSW5kZXhfcCwgdWlTdWJJbmRleF9wLCBwRHN0RGF0YV9wLCBwU2l6ZV9wKTsKKyNlbHNlCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVDYWxBY2Nlc3NPZFBhcnQoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiBlbmNhcHN1bGF0ZSBhY2Nlc3Mgb2YgZnVuY3Rpb24gRXBsT2JkQWNjZXNzT2RQYXJ0CisvLworLy8gUGFyYW1ldGVyczogIE9iZFBhcnRfcCAgICAgICA9IG9kLXBhcnQgdG8gcmVzZXQKKy8vICAgICAgICAgICAgICBEaXJlY3Rpb25fcCAgICAgPSBkaXJlY3RvcnkgZmxhZyBmb3IKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVDYWxBY2Nlc3NPZFBhcnQodEVwbE9iZFBhcnQgT2JkUGFydF9wLAorCQkJCQkJICAgICAgdEVwbE9iZERpciBEaXJlY3Rpb25fcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRLKSkgIT0gMCkKKwlSZXQgPSBFcGxPYmRBY2Nlc3NPZFBhcnQoT2JkUGFydF9wLCBEaXJlY3Rpb25fcCk7CisjZWxzZQorCVJldCA9IGtFcGxTdWNjZXNzZnVsOworI2VuZGlmCisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmR1Q2FsRGVmaW5lVmFyKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogRnVuY3Rpb24gZW5jYXBzdWxhdGUgYWNjZXNzIG9mIGZ1bmN0aW9uIEVwbE9iZERlZmluZVZhcgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwRXBsVmFyUGFyYW1fcCA9IHZhcmVudHJ5CisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgID0gICBlcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVDYWxEZWZpbmVWYXIodEVwbFZhclBhcmFtIE1FTSAqCisJCQkJCQkgICBwVmFyUGFyYW1fcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRLKSkgIT0gMCkKKwlSZXQgPSBFcGxPYmREZWZpbmVWYXIocFZhclBhcmFtX3ApOworI2Vsc2UKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkdUNhbEdldE9iamVjdERhdGFQdHIoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiBlbmNhcHN1bGF0ZSBhY2Nlc3Mgb2YgZnVuY3Rpb24gRXBsT2JkR2V0T2JqZWN0RGF0YVB0cgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aUluZGV4X3AgICAgPSAgIEluZGV4IG9mIHRoZSBlbnRyeQorLy8gICAgICAgICAgICAgIHVpU3ViaW5kZXhfcCA9ICAgU3ViaW5kZXggb2YgdGhlIGVudHJ5CisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQgKiAgICA9IHBvaW50ZXIgdG8gb2JqZWN0IGRhdGEKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHZvaWQgKlBVQkxJQyBFcGxPYmR1Q2FsR2V0T2JqZWN0RGF0YVB0cih1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wKQoreworCXZvaWQgKnBEYXRhOworCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CREspKSAhPSAwKQorCXBEYXRhID0gRXBsT2JkR2V0T2JqZWN0RGF0YVB0cih1aUluZGV4X3AsIHVpU3ViSW5kZXhfcCk7CisjZWxzZQorCXBEYXRhID0gTlVMTDsKKyNlbmRpZgorCisJcmV0dXJuIHBEYXRhOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmR1Q2FsUmVnaXN0ZXJVc2VyT2QoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiBlbmNhcHN1bGF0ZSBhY2Nlc3Mgb2YgZnVuY3Rpb24gRXBsT2JkUmVnaXN0ZXJVc2VyT2QKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFVzZXJPZF9wICAgPSBwb2ludGVyIHRvIHVzZXIgT0QKKy8vCisvLyBSZXR1cm46ICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiAoZGVmaW5lZCAoRVBMX09CRF9VU0VSX09EKSAmJiAoRVBMX09CRF9VU0VSX09EICE9IEZBTFNFKSkKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1Q2FsUmVnaXN0ZXJVc2VyT2QodEVwbE9iZEVudHJ5UHRyCisJCQkJCQkJcFVzZXJPZF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CREspKSAhPSAwKQorCVJldCA9IEVwbE9iZFJlZ2lzdGVyVXNlck9kKHBVc2VyT2RfcCk7CisjZWxzZQorCVJldCA9IGtFcGxTdWNjZXNzZnVsOworI2VuZGlmCisKKwlyZXR1cm4gUmV0OworCit9CisjZW5kaWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVDYWxJbml0VmFyRW50cnkoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiBlbmNhcHN1bGF0ZSBhY2Nlc3Mgb2YgZnVuY3Rpb24gRXBsT2JkSW5pdFZhckVudHJ5CisvLworLy8gUGFyYW1ldGVyczogIHBWYXJFbnRyeV9wID0gcG9pbnRlciB0byB2YXIgZW50cnkgc3RydWN0dXJlCisvLyAgICAgICAgICAgICAgYlR5cGVfcCAgICAgPSBvYmplY3QgdHlwZQorLy8gICAgICAgICAgICAgIE9iZFNpemVfcCAgID0gc2l6ZSBvZiBvYmplY3QgZGF0YQorLy8KKy8vIFJldHVybnM6ICAgICBub25lCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB2b2lkIFBVQkxJQyBFcGxPYmR1Q2FsSW5pdFZhckVudHJ5KHRFcGxPYmRWYXJFbnRyeSBNRU0gKgorCQkJCQkJcFZhckVudHJ5X3AsIEJZVEUgYlR5cGVfcCwKKwkJCQkJCXRFcGxPYmRTaXplIE9iZFNpemVfcCkKK3sKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JESykpICE9IDApCisJRXBsT2JkSW5pdFZhckVudHJ5KHBWYXJFbnRyeV9wLCBiVHlwZV9wLCBPYmRTaXplX3ApOworI2VuZGlmCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVDYWxHZXREYXRhU2l6ZSgpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIGVuY2Fwc3VsYXRlIGFjY2VzcyBvZiBmdW5jdGlvbiBFcGxPYmRHZXREYXRhU2l6ZQorLy8KKy8vICAgICAgICAgICAgICBnZXRzIHRoZSBkYXRhIHNpemUgb2YgYW4gb2JqZWN0CisvLyAgICAgICAgICAgICAgZm9yIHN0cmluZyBvYmplY3RzIGl0IHJldHVybmVzIHRoZSBzdHJpbmcgbGVuZ3RoCisvLworLy8gUGFyYW1ldGVyczogIHVpSW5kZXhfcCAgID0gICBJbmRleAorLy8gICAgICAgICAgICAgIHVpU3ViSW5kZXhfcD0gICBTdWJpbmRleAorLy8KKy8vIFJldHVybjogICAgICB0RXBsT2JkU2l6ZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbE9iZFNpemUgUFVCTElDIEVwbE9iZHVDYWxHZXREYXRhU2l6ZSh1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJICAgICAgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCkKK3sKKwl0RXBsT2JkU2l6ZSBTaXplOworCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CREspKSAhPSAwKQorCVNpemUgPSBFcGxPYmRHZXREYXRhU2l6ZSh1aUluZGV4X3AsIHVpU3ViSW5kZXhfcCk7CisjZWxzZQorCVNpemUgPSAwOworI2VuZGlmCisKKwlyZXR1cm4gU2l6ZTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsT2JkdUNhbEdldE5vZGVJZCgpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIGVuY2Fwc3VsYXRlIGFjY2VzcyBvZiBmdW5jdGlvbiBFcGxPYmRHZXROb2RlSWQKKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLyBSZXR1cm46ICAgICAgdW5zaWduZWQgaW50ID0gTm9kZSBJZAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdW5zaWduZWQgaW50IFBVQkxJQyBFcGxPYmR1Q2FsR2V0Tm9kZUlkKCkKK3sKKwl1bnNpZ25lZCBpbnQgdWlOb2RlSWQ7CisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JESykpICE9IDApCisJdWlOb2RlSWQgPSBFcGxPYmRHZXROb2RlSWQoKTsKKyNlbHNlCisJdWlOb2RlSWQgPSAwOworI2VuZGlmCisKKwlyZXR1cm4gdWlOb2RlSWQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVDYWxTZXROb2RlSWQoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiBlbmNhcHN1bGF0ZSBhY2Nlc3Mgb2YgZnVuY3Rpb24gRXBsT2JkU2V0Tm9kZUlkCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICA9ICAgTm9kZSBJZCB0byBzZXQKKy8vICAgICAgICAgICAgICBOb2RlSWRUeXBlX3A9ICAgVHlwZSBvbiB3aGljaCB3YXkgdGhlIE5vZGUgSWQgd2FzIHNldAorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsID0gRXJyb3Jjb2RlCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1Q2FsU2V0Tm9kZUlkKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkJICAgdEVwbE9iZE5vZGVJZFR5cGUKKwkJCQkJCSAgIE5vZGVJZFR5cGVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRLKSkgIT0gMCkKKwlSZXQgPSBFcGxPYmRTZXROb2RlSWQodWlOb2RlSWRfcCwgTm9kZUlkVHlwZV9wKTsKKyNlbHNlCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVDYWxHZXRBY2Nlc3NUeXBlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogRnVuY3Rpb24gZW5jYXBzdWxhdGUgYWNjZXNzIG9mIGZ1bmN0aW9uIEVwbE9iZEdldEFjY2Vzc1R5cGUKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlJbmRleF9wICAgICAgID0gICBJbmRleCBvZiB0aGUgT0QgZW50cnkKKy8vICAgICAgICAgICAgICB1aVN1YkluZGV4X3AgICAgPSAgIFN1YmluZGV4IG9mIHRoZSBPRCBFbnRyeQorLy8gICAgICAgICAgICAgIHBBY2Nlc3NUeXBfcCAgICA9ICAgcG9pbnRlciB0byBidWZmZXIgdG8gc3RvcmUgYWNjZXNzdHlwZQorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgPSAgIGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVDYWxHZXRBY2Nlc3NUeXBlKHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICAgICAgdW5zaWduZWQgaW50CisJCQkJCQkgICAgICAgdWlTdWJJbmRleF9wLAorCQkJCQkJICAgICAgIHRFcGxPYmRBY2Nlc3MgKgorCQkJCQkJICAgICAgIHBBY2Nlc3NUeXBfcCkKK3sKKwl0RXBsT2JkQWNjZXNzIEFjY2VzVHlwZTsKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRLKSkgIT0gMCkKKwlBY2Nlc1R5cGUgPSBFcGxPYmRHZXRBY2Nlc3NUeXBlKHVpSW5kZXhfcCwgdWlTdWJJbmRleF9wLCBwQWNjZXNzVHlwX3ApOworI2Vsc2UKKwlBY2Nlc1R5cGUgPSAwOworI2VuZGlmCisKKwlyZXR1cm4gQWNjZXNUeXBlOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVDYWxSZWFkRW50cnlUb0xlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogRnVuY3Rpb24gZW5jYXBzdWxhdGUgYWNjZXNzIG9mIGZ1bmN0aW9uIEVwbE9iZFJlYWRFbnRyeVRvTGUKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlJbmRleF9wICAgICAgID0gSW5kZXggb2YgdGhlIE9EIGVudHJ5IHRvIHJlYWQKKy8vICAgICAgICAgICAgICB1aVN1YkluZGV4X3AgICAgPSBTdWJpbmRleCB0byByZWFkCisvLyAgICAgICAgICAgICAgcERzdERhdGFfcCAgICAgID0gcG9pbnRlciB0byB0aGUgYnVmZmVyIGZvciBkYXRhCisvLyAgICAgICAgICAgICAgT2Zmc2V0X3AgICAgICAgID0gb2Zmc2V0IGluIGRhdGEgZm9yIHJlYWQgYWNjZXNzCisvLyAgICAgICAgICAgICAgcFNpemVfcCAgICAgICAgID0gSU46IFNpemUgb2YgdGhlIGJ1ZmZlcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDogbnVtYmVyIG9mIHJlYWRlZCBCeXRlcworLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1Q2FsUmVhZEVudHJ5VG9MZSh1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJICAgICAgIHVuc2lnbmVkIGludAorCQkJCQkJICAgICAgIHVpU3ViSW5kZXhfcCwKKwkJCQkJCSAgICAgICB2b2lkICpwRHN0RGF0YV9wLAorCQkJCQkJICAgICAgIHRFcGxPYmRTaXplICogcFNpemVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRLKSkgIT0gMCkKKwlSZXQgPSBFcGxPYmRSZWFkRW50cnlUb0xlKHVpSW5kZXhfcCwgdWlTdWJJbmRleF9wLCBwRHN0RGF0YV9wLCBwU2l6ZV9wKTsKKyNlbHNlCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbE9iZHVDYWxXcml0ZUVudHJ5RnJvbUxlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogRnVuY3Rpb24gZW5jYXBzdWxhdGUgYWNjZXNzIG9mIGZ1bmN0aW9uIEVwbE9iZFdyaXRlRW50cnlGcm9tTGUKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlJbmRleF9wICAgICAgID0gICBJbmRleCBvZiB0aGUgT0QgZW50cnkKKy8vICAgICAgICAgICAgICB1aVN1YkluZGV4X3AgICAgPSAgIFN1YmluZGV4IG9mIHRoZSBPRCBFbnRyeQorLy8gICAgICAgICAgICAgIHBTcmNEYXRhX3AgICAgICA9ICAgUG9pbnRlciB0byB0aGUgZGF0YSB0byB3cml0ZQorLy8gICAgICAgICAgICAgIFNpemVfcCAgICAgICAgICA9ICAgU2l6ZSBvZiB0aGUgZGF0YSBpbiBCeXRlCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgICAgICA9ICAgRXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdUNhbFdyaXRlRW50cnlGcm9tTGUodW5zaWduZWQgaW50CisJCQkJCQkJICB1aUluZGV4X3AsCisJCQkJCQkJICB1bnNpZ25lZCBpbnQKKwkJCQkJCQkgIHVpU3ViSW5kZXhfcCwKKwkJCQkJCQkgIHZvaWQgKnBTcmNEYXRhX3AsCisJCQkJCQkJICB0RXBsT2JkU2l6ZSBTaXplX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JESykpICE9IDApCisJUmV0ID0KKwkgICAgRXBsT2JkV3JpdGVFbnRyeUZyb21MZSh1aUluZGV4X3AsIHVpU3ViSW5kZXhfcCwgcFNyY0RhdGFfcCwgU2l6ZV9wKTsKKyNlbHNlCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisjZW5kaWYKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxPYmR1Q2FsU2VhcmNoVmFyRW50cnkoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBnZXRzIHZhcmlhYmxlIGZyb20gT0QKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlJbmRleF9wICAgICAgID0gICBpbmRleCBvZiB0aGUgdmFyIGVudHJ5IHRvIHNlYXJjaAorLy8gICAgICAgICAgICAgIHVpU3ViaW5kZXhfcCAgICA9ICAgc3ViaW5kZXggb2YgdmFyIGVudHJ5IHRvIHNlYXJjaAorLy8gICAgICAgICAgICAgIHBwVmFyRW50cnlfcCAgICA9ICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgdmFyZW50cnkKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbAorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMKK0VwbE9iZHVDYWxTZWFyY2hWYXJFbnRyeShFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXyB1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJIHVuc2lnbmVkIGludCB1aVN1YmluZGV4X3AsCisJCQkgdEVwbE9iZFZhckVudHJ5IE1FTSAqKiBwcFZhckVudHJ5X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JESykpICE9IDApCisJUmV0ID0gRXBsT2JkU2VhcmNoVmFyRW50cnkodWlJbmRleF9wLCB1aVN1YmluZGV4X3AsIHBwVmFyRW50cnlfcCk7CisjZWxzZQorCVJldCA9IGtFcGxTdWNjZXNzZnVsOworI2VuZGlmCisJcmV0dXJuIFJldDsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246CisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOgorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYgLy8oKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CRFUpKSAhPSAwKQorCisvLyBFT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsT2JqRGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE9iakRlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MTMxMjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbE9iakRlZi5oCkBAIC0wLDAgKzEsMjA4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgZGVmaW5lcyBvYmpkaWN0IGRpY3Rpb25hcnkKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxPYmpEZWYuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzA2ICAgIGsudC46ICAgdGFrZSBPYmpEZWYuaCBmcm9tIENBTm9wZW4gYW5kIG1vZGlmeSBmb3IgRVBMCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTE9CSkRFRl9IXworI2RlZmluZSBfRVBMT0JKREVGX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBzZWN1cml0eSBjaGVja3MKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtYWNyb3MgdG8gaGVscCBidWlsZGluZyBPRAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiAoZGVmaW5lZCAoRVBMX09CRF9VU0VfVkFSSUFCTEVfU1VCSU5ERVhfVEFCKSAmJiAoRVBMX09CRF9VU0VfVkFSSUFCTEVfU1VCSU5ERVhfVEFCICE9IEZBTFNFKSkKKworI2RlZmluZSBDQ01fU1VCSU5ERVhfUkFNX09OTFkoYSkgICAgYTsKKyNkZWZpbmUgQ0NNX1NVQklOREVYX1JBTV9PTkVPRihhLGIpIGEKKworI2Vsc2UKKworI2RlZmluZSBDQ01fU1VCSU5ERVhfUkFNX09OTFkoYSkKKyNkZWZpbmUgQ0NNX1NVQklOREVYX1JBTV9PTkVPRihhLGIpIGIKKworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUbyBwcmV2ZW50IHVudXNlZCBtZW1vcnkgaW4gc3ViaW5kZXggdGFibGVzIHdlIG5lZWQgdGhpcyBtYWNyby4KKy8vIEJ1dCBub3QgYWxsIGNvbXBpbGVycyBzdXBwb3J0IHRvIHByZXNldCB0aGUgbGFzdCBzdHJ1Y3QgdmFsdWUgZm9sbG93ZWQgYnkgYSBjb21tYS4KKy8vIENvbXBpbGVycyB3aGljaCBkb2VzIG5vdCBzdXBwb3J0IGEgY29tbWEgYWZ0ZXIgbGFzdCBzdHJ1Y3QgdmFsdWUgaGFzIHRvIHBsYWNlIGluIGEgZHVtbXkgc3ViaW5kZXguCisjaWYgKChERVZfU1lTVEVNICYgX0RFVl9DT01NQV9FWFRfKSAhPSAwKQorCisjZGVmaW5lIEVQTF9PQkRfRU5EX1NVQklOREVYKCkKKyNkZWZpbmUgRVBMX09CRF9NQVhfQVJSQVlfU1VCRU5UUklFUyAgICAyCisKKyNlbHNlCisKKyNkZWZpbmUgRVBMX09CRF9FTkRfU1VCSU5ERVgoKSAgICAgICAgICB7MCwwLDAsTlVMTCxOVUxMfQorI2RlZmluZSBFUExfT0JEX01BWF9BUlJBWV9TVUJFTlRSSUVTICAgIDMKKworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY3JlYXRpb24gb2YgZGF0YSBpbiBST00gbWVtb3J5CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEVQTF9PQkRfQ1JFQVRFX1JPTV9EQVRBCisjaW5jbHVkZSAib2JqZGljdC5oIgorI3VuZGVmIEVQTF9PQkRfQ1JFQVRFX1JPTV9EQVRBCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNyZWF0aW9uIG9mIGRhdGEgaW4gUkFNIG1lbW9yeQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEVQTF9PQkRfQ1JFQVRFX1JBTV9EQVRBCisjaW5jbHVkZSAib2JqZGljdC5oIgorI3VuZGVmIEVQTF9PQkRfQ1JFQVRFX1JBTV9EQVRBCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNyZWF0aW9uIG9mIHN1YmluZGV4IHRhYmxlcyBpbiBST00gYW5kIFJBTQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEVQTF9PQkRfQ1JFQVRFX1NVQklOREVYX1RBQgorI2luY2x1ZGUgIm9iamRpY3QuaCIKKyN1bmRlZiBFUExfT0JEX0NSRUFURV9TVUJJTkRFWF9UQUIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY3JlYXRpb24gb2YgaW5kZXggdGFibGVzIGZvciBnZW5lcmljLCBtYW51ZmFjdHVyZXIgYW5kIGRldmljZSBwYXJ0CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgRVBMX09CRF9DUkVBVEVfSU5ERVhfVEFCCisjaW5jbHVkZSAib2JqZGljdC5oIgorI3VuZGVmIEVQTF9PQkRfQ1JFQVRFX0lOREVYX1RBQgorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFUExfT0JEX0lOSVRfUkFNX05BTUUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiB0byBpbml0aWFsaXplIG9iamVjdCBkaWN0aW9uYXJ5CisvLworLy8gUGFyYW1ldGVyczogIHBJbml0UGFyYW1fcCAgICA9IHBvaW50ZXIgdG8gaW5pdCBwYXJhbSBzdHJ1Y3Qgb2YgRXBsCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFUExfT0JEX0lOSVRfUkFNX05BTUUodEVwbE9iZEluaXRQYXJhbSBNRU0gKgorCQkJCQkJICAgICBwSW5pdFBhcmFtX3ApCit7CisKKwl0RXBsT2JkSW5pdFBhcmFtIE1FTSAqcEluaXRQYXJhbSA9IHBJbml0UGFyYW1fcDsKKworCS8vIGNoZWNrIGlmIHBvaW50ZXIgdG8gcGFyYW1ldGVyIHN0cnVjdHVyZSBpcyB2YWxpZAorCS8vIGlmIG5vdCB0aGVuIG9ubHkgY29weSBzdWJpbmRleCB0YWJsZXMgYmVsb3cKKwlpZiAocEluaXRQYXJhbSAhPSBOVUxMKSB7CisJCS8vIGF0IGZpcnN0IGRlbGV0ZSBhbGwgcGFyYW1ldGVycyAoYWxsIHBvaW50ZXJzIHdpbGwgYmUgc2V0IHp1IE5VTEwpCisJCUVQTF9NRU1TRVQocEluaXRQYXJhbSwgMCwgc2l6ZW9mKHRFcGxPYmRJbml0UGFyYW0pKTsKKworI2RlZmluZSBFUExfT0JEX0NSRUFURV9JTklUX0ZVTkNUSU9OCisJCXsKKwkJCS8vIGluc2VydHMgY29kZSB0byBpbml0IHBvaW50ZXIgdG8gaW5kZXggdGFibGVzCisjaW5jbHVkZSAib2JqZGljdC5oIgorCQl9CisjdW5kZWYgRVBMX09CRF9DUkVBVEVfSU5JVF9GVU5DVElPTgorCisjaWYgKGRlZmluZWQgKEVQTF9PQkRfVVNFUl9PRCkgJiYgKEVQTF9PQkRfVVNFUl9PRCAhPSBGQUxTRSkpCisJCXsKKwkJCS8vIHRvIGJlZ2luIG5vIHVzZXIgT0QgaXMgZGVmaW5lZAorCQkJcEluaXRQYXJhbV9wLT5tX3BVc2VyUGFydCA9IE5VTEw7CisJCX0KKyNlbmRpZgorCX0KKyNkZWZpbmUgRVBMX09CRF9DUkVBVEVfSU5JVF9TVUJJTkRFWAorCXsKKwkJLy8gaW5zZXJ0cyBjb2RlIHRvIGNvcHkgc3ViaW5kZXggdGFibGVzCisjaW5jbHVkZSAib2JqZGljdC5oIgorCX0KKyN1bmRlZiBFUExfT0JEX0NSRUFURV9JTklUX1NVQklOREVYCisKKwlyZXR1cm4ga0VwbFN1Y2Nlc3NmdWw7CisKK30KKworI2VuZGlmIC8vIF9FUExPQkpERUZfSF8KKworLy8gRGllIGxldHp0ZSBaZWlsZSBtdd8gdW5iZWRpbmd0IGVpbmUgbGVlcmUgWmVpbGUgc2Vpbiwgd2VpbCBtYW5jaGUgQ29tcGlsZXIKKy8vIGRhbWl0IGVpbiBQcm9ibGVtIGhhYmVuLCB3ZW5uIGRhcyBuaWNodCBzbyBpc3QgKHouQi4gR05VIG9kZXIgQm9ybGFuZCBDKysgQnVpbGRlcikuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFBkby5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxQZG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjJhYzg2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxQZG8uaApAQCAtMCwwICsxLDExNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgUERPIG1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbFBkby5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDUvMjIgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExfUERPX0hfCisjZGVmaW5lIF9FUExfUERPX0hfCisKKyNpbmNsdWRlICJFcGxJbmMuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIGludmFsaWQgUERPLU5vZGVJZAorI2RlZmluZSBFUExfUERPX0lOVkFMSURfTk9ERV9JRCAgICAgMHhGRgorLy8gTm9kZUlkIGZvciBQUmVxIFJQRE8KKyNkZWZpbmUgRVBMX1BET19QUkVRX05PREVfSUQgICAgICAgIDB4MDAKKy8vIE5vZGVJZCBmb3IgUFJlcyBUUERPCisjZGVmaW5lIEVQTF9QRE9fUFJFU19OT0RFX0lEICAgICAgICAweDAwCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCB7CisJdm9pZCAqbV9wVmFyOworCVdPUkQgbV93T2Zmc2V0OwkJLy8gaW4gQml0cworCVdPUkQgbV93U2l6ZTsJCS8vIGluIEJpdHMKKwlCT09MIG1fZk51bWVyaWM7CS8vIG51bWVyaWMgdmFsdWUgLT4gdXNlIEFNSSBmdW5jdGlvbnMKKworfSB0RXBsUGRvTWFwcGluZzsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBtX3VpU2l6ZU9mU3RydWN0OworCXVuc2lnbmVkIGludCBtX3VpUGRvSWQ7CisJdW5zaWduZWQgaW50IG1fdWlOb2RlSWQ7CisJLy8gMHhGRj1pbnZhbGlkLCBSUERPOiAweDAwPVBSZXEsIGxvY2FsTm9kZUlkPVBSZXMsIHJlbW90ZU5vZGVJZD1QUmVzCisJLy8gICAgICAgICAgICAgICBUUERPOiAweDAwPVBSZXMsIE1OOiBDbk5vZGVJZD1QUmVxCisKKwlCT09MIG1fZlR4Ung7CisJQllURSBtX2JNYXBwaW5nVmVyc2lvbjsKKwl1bnNpZ25lZCBpbnQgbV91aU1heE1hcHBpbmdFbnRyaWVzOwkvLyBtYXhpbXVtIG51bWJlciBvZiBtYXBwaW5nIGVudHJpZXMsIGkuZS4gc2l6ZSBvZiBtX2FQZG9NYXBwaW5nCisJdEVwbFBkb01hcHBpbmcgbV9hUGRvTWFwcGluZ1sxXTsKKworfSB0RXBsUGRvUGFyYW07CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMX1BET19IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxQZG9rLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFBkb2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTk5OWI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxQZG9rLmMKQEAgLTAsMCArMSw2OTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3Iga2VybmVsIFBETyBtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxQZG9rLmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjggJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNS8yMiBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJrZXJuZWwvRXBsUGRvay5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxQZG9rQ2FsLmgiCisjaW5jbHVkZSAia2VybmVsL0VwbEV2ZW50ay5oIgorI2luY2x1ZGUgImtlcm5lbC9FcGxPYmRrLmgiCisKKyNpZiAoREVWX1NZU1RFTSA9PSBfREVWX0dOVV9DRjU0OFhfKQorI2luY2x1ZGUgInBsY2NvcmUuaCIKKyNkZWZpbmUgUERPX0xFRCAweDA4CisjZW5kaWYKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfUERPSykpICE9IDApCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTEspKSA9PSAwKQorCisjZXJyb3IgJ0VSUk9SOiBNaXNzaW5nIERMTGstTW9kdWwhJworCisjZW5kaWYKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JESykpID09IDApCisKKyNlcnJvciAnRVJST1I6IE1pc3NpbmcgT0JEay1Nb2R1bCEnCisKKyNlbmRpZgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgRVBMX1BET0tfT0JEX0lEWF9SWF9DT01NX1BBUkFNICAweDE0MDAKKyNkZWZpbmUgRVBMX1BET0tfT0JEX0lEWF9SWF9NQVBQX1BBUkFNICAweDE2MDAKKyNkZWZpbmUgRVBMX1BET0tfT0JEX0lEWF9UWF9DT01NX1BBUkFNICAweDE4MDAKKyNkZWZpbmUgRVBMX1BET0tfT0JEX0lEWF9UWF9NQVBQX1BBUkFNICAweDFBMDAKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgQyBMIEEgUyBTICBFcGxQZG9rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFBkb2tBZGRJbnN0YW5jZSgpCisvLworLy8gRGVzY3JpcHRpb246IGFkZCBhbmQgaW5pdGlhbGl6ZSBuZXcgaW5zdGFuY2Ugb2YgRVBMIHN0YWNrCisvLworLy8gUGFyYW1ldGVyczogIG5vbmUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsUGRva0FkZEluc3RhbmNlKHZvaWQpCit7CisKKwlyZXR1cm4ga0VwbFN1Y2Nlc3NmdWw7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFBkb2tEZWxJbnN0YW5jZSgpCisvLworLy8gRGVzY3JpcHRpb246IGRlbGV0ZXMgYW4gaW5zdGFuY2Ugb2YgRVBMIHN0YWNrCisvLworLy8gUGFyYW1ldGVyczogIG5vbmUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsUGRva0RlbEluc3RhbmNlKHZvaWQpCit7CisKKwlyZXR1cm4ga0VwbFN1Y2Nlc3NmdWw7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFBkb2tDYlBkb1JlY2VpdmVkCisvLworLy8gRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IERMTCBpZiBQUmVzIG9yIFBSZXEgZnJhbWUgd2FzCisvLyAgICAgICAgICAgICAgcmVjZWl2ZWQuIEl0IHBvc3RzIHRoZSBmcmFtZSB0byB0aGUgZXZlbnQgcXVldWUuCisvLyAgICAgICAgICAgICAgSXQgaXMgY2FsbGVkIGluIHN0YXRlcyBOTVRfQ1NfUkVBRFlfVE9fT1BFUkFURSBhbmQgTk1UX0NTX09QRVJBVElPTkFMLgorLy8gICAgICAgICAgICAgIFRoZSBwYXNzZWQgUERPIG5lZWRzIG5vdCB0byBiZSB2YWxpZC4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEZyYW1lSW5mb19wICAgICAgICAgICAgPSBwb2ludGVyIHRvIGZyYW1lIGluZm8gc3RydWN0dXJlCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbFBkb2tDYlBkb1JlY2VpdmVkKHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsRXZlbnQgRXZlbnQ7CisKKyNpZiAoREVWX1NZU1RFTSA9PSBfREVWX0dOVV9DRjU0OFhfKQorCS8vIHJlc2V0IExFRAorLy8gICAgTUNGX0dQSU9fUE9EUl9QQ0lCRyAmPSB+UERPX0xFRDsgIC8vIExldmVsCisjZW5kaWYKKworCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua1Bkb2s7CisJRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlUGRvUng7CisJLy8gbGltaXQgY29waWVkIGRhdGEgdG8gc2l6ZSBvZiBQRE8gKGJlY2F1c2UgZnJvbSBzb21lIENOcyB0aGUgZnJhbWUgaXMgbGFyZ2VyIHRoYW4gbmVjZXNzYXJ5KQorCUV2ZW50Lm1fdWlTaXplID0gQW1pR2V0V29yZEZyb21MZSgmcEZyYW1lSW5mb19wLT5tX3BGcmFtZS0+bV9EYXRhLm1fUHJlcy5tX2xlX3dTaXplKSArIDI0OwkvLyBwRnJhbWVJbmZvX3AtPm1fdWlGcmFtZVNpemU7CisJRXZlbnQubV9wQXJnID0gcEZyYW1lSW5mb19wLT5tX3BGcmFtZTsKKwlSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisKKyNpZiAoREVWX1NZU1RFTSA9PSBfREVWX0dOVV9DRjU0OFhfKQorCS8vIHNldCBMRUQKKy8vICAgIE1DRl9HUElPX1BPRFJfUENJQkcgfD0gUERPX0xFRDsgIC8vIExldmVsCisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFBkb2tDYlBkb1RyYW5zbWl0dGVkCisvLworLy8gRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IERMTCBpZiBQUmVzIG9yIFBSZXEgZnJhbWUgd2FzCisvLyAgICAgICAgICAgICAgc2VudC4gSXQgcG9zdHMgdGhlIHBvaW50ZXIgdG8gdGhlIGZyYW1lIHRvIHRoZSBldmVudCBxdWV1ZS4KKy8vICAgICAgICAgICAgICBJdCBpcyBjYWxsZWQgaW4gTk1UX0NTX1BSRV9PUEVSQVRJT05BTF8yLAorLy8gICAgICAgICAgICAgIE5NVF9DU19SRUFEWV9UT19PUEVSQVRFIGFuZCBOTVRfQ1NfT1BFUkFUSU9OQUwuCisvLworLy8gUGFyYW1ldGVyczogIHBGcmFtZUluZm9fcCAgICAgICAgICAgID0gcG9pbnRlciB0byBmcmFtZSBpbmZvIHN0cnVjdHVyZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxQZG9rQ2JQZG9UcmFuc21pdHRlZCh0RXBsRnJhbWVJbmZvICogcEZyYW1lSW5mb19wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbEV2ZW50IEV2ZW50OworCisjaWYgKERFVl9TWVNURU0gPT0gX0RFVl9HTlVfQ0Y1NDhYXykKKwkvLyByZXNldCBMRUQKKwlNQ0ZfR1BJT19QT0RSX1BDSUJHICY9IH5QRE9fTEVEOwkvLyBMZXZlbAorI2VuZGlmCisKKwlFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtQZG9rOworCUV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZVBkb1R4OworCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKHRFcGxGcmFtZUluZm8pOworCUV2ZW50Lm1fcEFyZyA9IHBGcmFtZUluZm9fcDsKKwlSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisKKyNpZiAoREVWX1NZU1RFTSA9PSBfREVWX0dOVV9DRjU0OFhfKQorCS8vIHNldCBMRUQKKwlNQ0ZfR1BJT19QT0RSX1BDSUJHIHw9IFBET19MRUQ7CS8vIExldmVsCisjZW5kaWYKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFBkb2tDYlNvYQorLy8KKy8vIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBETEwgaWYgU29BIGZyYW1lIHdhcworLy8gICAgICAgICAgICAgIHJlY2VpdmVkIHJlc3AuIHNlbnQuIEl0IHBvc3RzIHRoaXMgZXZlbnQgdG8gdGhlIGV2ZW50IHF1ZXVlLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwRnJhbWVJbmZvX3AgICAgICAgICAgICA9IHBvaW50ZXIgdG8gZnJhbWUgaW5mbyBzdHJ1Y3R1cmUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsUGRva0NiU29hKHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsRXZlbnQgRXZlbnQ7CisKKwlFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtQZG9rOworCUV2ZW50Lm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZVBkb1NvYTsKKwlFdmVudC5tX3VpU2l6ZSA9IDA7CisJRXZlbnQubV9wQXJnID0gTlVMTDsKKwlSZXQgPSBFcGxFdmVudGtQb3N0KCZFdmVudCk7CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxQZG9rUHJvY2VzcworLy8KKy8vIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyBhbGwgcmVjZWl2ZWQgYW5kIHRyYW5zbWl0dGVkIFBET3MuCisvLyAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSBhbnkgb3RoZXIgdGFzaworLy8gICAgICAgICAgICAgIGV4Y2VwdCBJU1JzIChsaWtlIHRoZSBldGhlcm5ldCBkcml2ZXIgSVNSLCB3aGljaCBtYXkgY2FsbAorLy8gICAgICAgICAgICAgIEVwbFBkb2tDYkZyYW1lUmVjZWl2ZWQoKSBvciBFcGxQZG9rQ2JGcmFtZVRyYW5zbWl0dGVkKCkpLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwRXZlbnRfcCAgICAgICAgICAgICAgICA9IHBvaW50ZXIgdG8gZXZlbnQgc3RydWN0dXJlCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbFBkb2tQcm9jZXNzKHRFcGxFdmVudCAqIHBFdmVudF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJV09SRCB3UGRvU2l6ZTsKKwlXT1JEIHdCaXRPZmZzZXQ7CisJV09SRCB3Qml0U2l6ZTsKKwlXT1JEIHdWYXJTaXplOworCVFXT1JEIHF3T2JqZWN0TWFwcGluZzsKKwlCWVRFIGJNYXBwU3ViaW5kZXg7CisJQllURSBiT2JkU3ViaW5kZXg7CisJV09SRCB3T2JkTWFwcEluZGV4OworCVdPUkQgd09iZENvbW1JbmRleDsKKwlXT1JEIHdQZG9JZDsKKwlCWVRFIGJPYmREYXRhOworCUJZVEUgYk9iamVjdENvdW50OworCUJZVEUgYkZyYW1lRGF0YTsKKwlCT09MIGZWYWxpZDsKKwl0RXBsT2JkU2l6ZSBPYmRTaXplOworCXRFcGxGcmFtZSAqcEZyYW1lOworCXRFcGxGcmFtZUluZm8gKnBGcmFtZUluZm87CisJdW5zaWduZWQgaW50IHVpTm9kZUlkOworCXRFcGxNc2dUeXBlIE1zZ1R5cGU7CisKKwkvLyAweEZGPWludmFsaWQsIFJQRE86IDB4MDA9UFJlcSwgbG9jYWxOb2RlSWQ9UFJlcywgcmVtb3RlTm9kZUlkPVBSZXMKKwkvLyAgICAgICAgICAgICAgIFRQRE86IDB4MDA9UFJlcywgTU46IENuTm9kZUlkPVBSZXEKKworCXN3aXRjaCAocEV2ZW50X3AtPm1fRXZlbnRUeXBlKSB7CisJY2FzZSBrRXBsRXZlbnRUeXBlUGRvUng6CS8vIFJQRE8gcmVjZWl2ZWQKKwkJcEZyYW1lID0gKHRFcGxGcmFtZSAqKSBwRXZlbnRfcC0+bV9wQXJnOworCisJCS8vIGNoZWNrIGlmIHJlY2VpdmVkIFJQRE8gaXMgdmFsaWQKKwkJYkZyYW1lRGF0YSA9CisJCSAgICBBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWUtPm1fRGF0YS5tX1ByZXMubV9sZV9iRmxhZzEpOworCQlpZiAoKGJGcmFtZURhdGEgJiBFUExfRlJBTUVfRkxBRzFfUkQpID09IDApIHsJLy8gUlBETyBpbnZhbGlkCisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJLy8gcmV0cmlldmUgRVBMIG1lc3NhZ2UgdHlwZQorCQlNc2dUeXBlID0gQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT5tX2xlX2JNZXNzYWdlVHlwZSk7CisJCWlmIChNc2dUeXBlID09IGtFcGxNc2dUeXBlUHJlcSkgewkvLyBSUERPIGlzIFBSZXEgZnJhbWUKKwkJCXVpTm9kZUlkID0gRVBMX1BET19QUkVRX05PREVfSUQ7CS8vIDB4MDAKKwkJfSBlbHNlIHsJLy8gUlBETyBpcyBQUmVzIGZyYW1lCisJCQkvLyByZXRyaWV2ZSBub2RlIElECisJCQl1aU5vZGVJZCA9IEFtaUdldEJ5dGVGcm9tTGUoJnBGcmFtZS0+bV9sZV9iU3JjTm9kZUlkKTsKKwkJfQorCisJCS8vIHNlYXJjaCBmb3IgYXBwcm9wcmlhdGUgdmFsaWQgUlBETyBpbiBPRAorCQl3T2JkTWFwcEluZGV4ID0gRVBMX1BET0tfT0JEX0lEWF9SWF9NQVBQX1BBUkFNOworCQlmb3IgKHdPYmRDb21tSW5kZXggPSBFUExfUERPS19PQkRfSURYX1JYX0NPTU1fUEFSQU07CisJCSAgICAgd09iZENvbW1JbmRleCA8IChFUExfUERPS19PQkRfSURYX1JYX0NPTU1fUEFSQU0gKyAweDAwRkYpOworCQkgICAgIHdPYmRDb21tSW5kZXgrKywgd09iZE1hcHBJbmRleCsrKSB7CisJCQlPYmRTaXplID0gMTsKKwkJCS8vIHJlYWQgbm9kZSBJRCBmcm9tIE9ECisJCQlSZXQgPQorCQkJICAgIEVwbE9iZFJlYWRFbnRyeSh3T2JkQ29tbUluZGV4LCAweDAxLCAmYk9iZERhdGEsCisJCQkJCSAgICAmT2JkU2l6ZSk7CisJCQlpZiAoKFJldCA9PSBrRXBsT2JkSW5kZXhOb3RFeGlzdCkKKwkJCSAgICB8fCAoUmV0ID09IGtFcGxPYmRTdWJpbmRleE5vdEV4aXN0KQorCQkJICAgIHx8IChSZXQgPT0ga0VwbE9iZElsbGVnYWxQYXJ0KSkgewkvLyBQRE8gZG9lcyBub3QgZXhpc3Q7IGxhc3QgUERPIHJlYWNoZWQKKwkJCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9IGVsc2UgaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBvdGhlciBmYXRhbCBlcnJvciBvY2N1cmVkCisJCQkJZ290byBFeGl0OworCQkJfQorCQkJLy8gZW50cnkgcmVhZCBzdWNjZXNzZnVsbHkKKwkJCWlmIChiT2JkRGF0YSAhPSB1aU5vZGVJZCkgewkvLyBub2RlIElEIGRvZXMgbm90IGVxdWFsIC0gd3JvbmcgUERPLCB0cnkgbmV4dCBQRE8gaW4gT0QKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCU9iZFNpemUgPSAxOworCQkJLy8gcmVhZCBudW1iZXIgb2YgbWFwcGVkIG9iamVjdHMgZnJvbSBPRDsgdGhpcyBpbmRpY2F0ZXMgaWYgdGhlIFBETyBpcyB2YWxpZAorCQkJUmV0ID0KKwkJCSAgICBFcGxPYmRSZWFkRW50cnkod09iZE1hcHBJbmRleCwgMHgwMCwgJmJPYmplY3RDb3VudCwKKwkJCQkJICAgICZPYmRTaXplKTsKKwkJCWlmICgoUmV0ID09IGtFcGxPYmRJbmRleE5vdEV4aXN0KQorCQkJICAgIHx8IChSZXQgPT0ga0VwbE9iZFN1YmluZGV4Tm90RXhpc3QpCisJCQkgICAgfHwgKFJldCA9PSBrRXBsT2JkSWxsZWdhbFBhcnQpKSB7CS8vIFBETyBkb2VzIG5vdCBleGlzdDsgbGFzdCBQRE8gcmVhY2hlZAorCQkJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQkJCWdvdG8gRXhpdDsKKwkJCX0gZWxzZSBpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIG90aGVyIGZhdGFsIGVycm9yIG9jY3VyZWQKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQkvLyBlbnRyeSByZWFkIHN1Y2Nlc3NmdWxseQorCQkJaWYgKGJPYmplY3RDb3VudCA9PSAwKSB7CS8vIFBETyBpbiBPRCBub3QgdmFsaWQsIHRyeSBuZXh0IFBETyBpbiBPRAorCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlPYmRTaXplID0gMTsKKwkJCS8vIGNoZWNrIFBETyBtYXBwaW5nIHZlcnNpb24KKwkJCVJldCA9CisJCQkgICAgRXBsT2JkUmVhZEVudHJ5KHdPYmRDb21tSW5kZXgsIDB4MDIsICZiT2JkRGF0YSwKKwkJCQkJICAgICZPYmRTaXplKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gb3RoZXIgZmF0YWwgZXJyb3Igb2NjdXJlZAorCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCS8vIGVudHJ5IHJlYWQgc3VjY2Vzc2Z1bGx5CisJCQkvLyByZXRyaWV2ZSBQRE8gdmVyc2lvbiBmcm9tIGZyYW1lCisJCQliRnJhbWVEYXRhID0KKwkJCSAgICBBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWUtPm1fRGF0YS5tX1ByZXMuCisJCQkJCSAgICAgbV9sZV9iUGRvVmVyc2lvbik7CisJCQlpZiAoKGJPYmREYXRhICYgRVBMX1ZFUlNJT05fTUFJTikgIT0gKGJGcmFtZURhdGEgJiBFUExfVkVSU0lPTl9NQUlOKSkgewkvLyBQRE8gdmVyc2lvbnMgZG8gbm90IG1hdGNoCisJCQkJLy8gJCQkIHJhaXNlIFBETyBlcnJvcgorCQkJCS8vIHRlcm1pYXRlIHByb2Nlc3Npbmcgb2YgdGhpcyBSUERPCisJCQkJZ290byBFeGl0OworCQkJfQorCQkJLy8gdmFsaWQgUlBETyBmb3VuZAorCisJCQkvLyByZXRyaWV2ZSBQRE8gc2l6ZQorCQkJd1Bkb1NpemUgPQorCQkJICAgIEFtaUdldFdvcmRGcm9tTGUoJnBGcmFtZS0+bV9EYXRhLm1fUHJlcy5tX2xlX3dTaXplKTsKKworCQkJLy8gcHJvY2VzcyBtYXBwaW5nCisJCQlmb3IgKGJNYXBwU3ViaW5kZXggPSAxOyBiTWFwcFN1YmluZGV4IDw9IGJPYmplY3RDb3VudDsKKwkJCSAgICAgYk1hcHBTdWJpbmRleCsrKSB7CisJCQkJT2JkU2l6ZSA9IDg7CS8vIFFXT1JECisJCQkJLy8gcmVhZCBvYmplY3QgbWFwcGluZyBmcm9tIE9ECisJCQkJUmV0ID0KKwkJCQkgICAgRXBsT2JkUmVhZEVudHJ5KHdPYmRNYXBwSW5kZXgsCisJCQkJCQkgICAgYk1hcHBTdWJpbmRleCwKKwkJCQkJCSAgICAmcXdPYmplY3RNYXBwaW5nLCAmT2JkU2l6ZSk7CisJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBvdGhlciBmYXRhbCBlcnJvciBvY2N1cmVkCisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisJCQkJLy8gY2hlY2sgaWYgb2JqZWN0IG1hcHBpbmcgZW50cnkgaXMgdmFsaWQsIGkuZS4gdW5lcXVhbCB6ZXJvLCBiZWNhdXNlICJlbXB0eSIgZW50cmllcyBhcmUgYWxsb3dlZAorCQkJCWlmIChxd09iamVjdE1hcHBpbmcgPT0gMCkgewkvLyBpbnZhbGlkIGVudHJ5LCBjb250aW51ZSB3aXRoIG5leHQgZW50cnkKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCS8vIGRlY29kZSBvYmplY3QgbWFwcGluZworCQkJCXdPYmRDb21tSW5kZXggPQorCQkJCSAgICAoV09SRCkgKHF3T2JqZWN0TWFwcGluZyAmCisJCQkJCSAgICAweDAwMDAwMDAwMDAwMEZGRkZMTCk7CisJCQkJYk9iZFN1YmluZGV4ID0KKwkJCQkgICAgKEJZVEUpICgocXdPYmplY3RNYXBwaW5nICYKKwkJCQkJICAgICAweDAwMDAwMDAwMDBGRjAwMDBMTCkgPj4gMTYpOworCQkJCXdCaXRPZmZzZXQgPQorCQkJCSAgICAoV09SRCkgKChxd09iamVjdE1hcHBpbmcgJgorCQkJCQkgICAgIDB4MDAwMEZGRkYwMDAwMDAwMExMKSA+PiAzMik7CisJCQkJd0JpdFNpemUgPQorCQkJCSAgICAoV09SRCkgKChxd09iamVjdE1hcHBpbmcgJgorCQkJCQkgICAgIDB4RkZGRjAwMDAwMDAwMDAwMExMKSA+PiA0OCk7CisKKwkJCQkvLyBjaGVjayBpZiBvYmplY3QgZXhjZWVkcyBQRE8gc2l6ZQorCQkJCWlmICgoKHdCaXRPZmZzZXQgKyB3Qml0U2l6ZSkgPj4gMykgPiB3UGRvU2l6ZSkgewkvLyB3cm9uZyBvYmplY3QgbWFwcGluZzsgUERPIHNpemUgaXMgdG9vIGxvdworCQkJCQkvLyAkJCQgcmFpc2UgUERPIGVycm9yCisJCQkJCS8vIHRlcm1pbmF0ZSBwcm9jZXNzaW5nIG9mIHRoaXMgUlBETworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJCS8vIGNvcHkgb2JqZWN0IGZyb20gUlBETyB0byBwcm9jZXNzL09EIHZhcmlhYmxlCisJCQkJT2JkU2l6ZSA9IHdCaXRTaXplID4+IDM7CisJCQkJUmV0ID0KKwkJCQkgICAgRXBsT2JkV3JpdGVFbnRyeUZyb21MZSh3T2JkQ29tbUluZGV4LAorCQkJCQkJCSAgIGJPYmRTdWJpbmRleCwKKwkJCQkJCQkgICAmcEZyYW1lLT5tX0RhdGEuCisJCQkJCQkJICAgbV9QcmVzLgorCQkJCQkJCSAgIG1fbGVfYWJQYXlsb2FkWyh3Qml0T2Zmc2V0ID4+IDMpXSwgT2JkU2l6ZSk7CisJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBvdGhlciBmYXRhbCBlcnJvciBvY2N1cmVkCisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisKKwkJCX0KKworCQkJLy8gcHJvY2Vzc2luZyBmaW5pc2hlZCBzdWNjZXNzZnVsbHkKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQlicmVhazsKKworCWNhc2Uga0VwbEV2ZW50VHlwZVBkb1R4OgkvLyBUUERPIHRyYW5zbWl0dGVkCisJCXBGcmFtZUluZm8gPSAodEVwbEZyYW1lSW5mbyAqKSBwRXZlbnRfcC0+bV9wQXJnOworCQlwRnJhbWUgPSBwRnJhbWVJbmZvLT5tX3BGcmFtZTsKKworCQkvLyBzZXQgVFBETyBpbnZhbGlkLCBzbyB0aGF0IG9ubHkgZnVsbHkgcHJvY2Vzc2VkIFRQRE9zIGFyZSBzZW50IGFzIHZhbGlkCisJCWJGcmFtZURhdGEgPQorCQkgICAgQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT5tX0RhdGEubV9QcmVzLm1fbGVfYkZsYWcxKTsKKwkJQW1pU2V0Qnl0ZVRvTGUoJnBGcmFtZS0+bV9EYXRhLm1fUHJlcy5tX2xlX2JGbGFnMSwKKwkJCSAgICAgICAoYkZyYW1lRGF0YSAmIH5FUExfRlJBTUVfRkxBRzFfUkQpKTsKKworCQkvLyByZXRyaWV2ZSBFUEwgbWVzc2FnZSB0eXBlCisJCU1zZ1R5cGUgPSBBbWlHZXRCeXRlRnJvbUxlKCZwRnJhbWUtPm1fbGVfYk1lc3NhZ2VUeXBlKTsKKwkJaWYgKE1zZ1R5cGUgPT0ga0VwbE1zZ1R5cGVQcmVzKSB7CS8vIFRQRE8gaXMgUFJlcyBmcmFtZQorCQkJdWlOb2RlSWQgPSBFUExfUERPX1BSRVNfTk9ERV9JRDsJLy8gMHgwMAorCQl9IGVsc2UgewkvLyBUUERPIGlzIFBSZXEgZnJhbWUKKwkJCS8vIHJldHJpZXZlIG5vZGUgSUQKKwkJCXVpTm9kZUlkID0gQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT5tX2xlX2JEc3ROb2RlSWQpOworCQl9CisKKwkJLy8gc2VhcmNoIGZvciBhcHByb3ByaWF0ZSB2YWxpZCBUUERPIGluIE9ECisJCXdPYmRNYXBwSW5kZXggPSBFUExfUERPS19PQkRfSURYX1RYX01BUFBfUEFSQU07CisJCXdPYmRDb21tSW5kZXggPSBFUExfUERPS19PQkRfSURYX1RYX0NPTU1fUEFSQU07CisJCWZvciAod1Bkb0lkID0gMDs7IHdQZG9JZCsrLCB3T2JkQ29tbUluZGV4KyssIHdPYmRNYXBwSW5kZXgrKykgeworCQkJT2JkU2l6ZSA9IDE7CisJCQkvLyByZWFkIG5vZGUgSUQgZnJvbSBPRAorCQkJUmV0ID0KKwkJCSAgICBFcGxPYmRSZWFkRW50cnkod09iZENvbW1JbmRleCwgMHgwMSwgJmJPYmREYXRhLAorCQkJCQkgICAgJk9iZFNpemUpOworCQkJaWYgKChSZXQgPT0ga0VwbE9iZEluZGV4Tm90RXhpc3QpCisJCQkgICAgfHwgKFJldCA9PSBrRXBsT2JkU3ViaW5kZXhOb3RFeGlzdCkKKwkJCSAgICB8fCAoUmV0ID09IGtFcGxPYmRJbGxlZ2FsUGFydCkpIHsJLy8gUERPIGRvZXMgbm90IGV4aXN0OyBsYXN0IFBETyByZWFjaGVkCisJCQkJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJCQkJZ290byBFeGl0OworCQkJfSBlbHNlIGlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gb3RoZXIgZmF0YWwgZXJyb3Igb2NjdXJlZAorCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCS8vIGVudHJ5IHJlYWQgc3VjY2Vzc2Z1bGx5CisJCQlpZiAoYk9iZERhdGEgIT0gdWlOb2RlSWQpIHsJLy8gbm9kZSBJRCBkb2VzIG5vdCBlcXVhbCAtIHdyb25nIFBETywgdHJ5IG5leHQgUERPIGluIE9ECisJCQkJY29udGludWU7CisJCQl9CisJCQlPYmRTaXplID0gMTsKKwkJCS8vIHJlYWQgbnVtYmVyIG9mIG1hcHBlZCBvYmplY3RzIGZyb20gT0Q7IHRoaXMgaW5kaWNhdGVzIGlmIHRoZSBQRE8gaXMgdmFsaWQKKwkJCVJldCA9CisJCQkgICAgRXBsT2JkUmVhZEVudHJ5KHdPYmRNYXBwSW5kZXgsIDB4MDAsICZiT2JqZWN0Q291bnQsCisJCQkJCSAgICAmT2JkU2l6ZSk7CisJCQlpZiAoKFJldCA9PSBrRXBsT2JkSW5kZXhOb3RFeGlzdCkKKwkJCSAgICB8fCAoUmV0ID09IGtFcGxPYmRTdWJpbmRleE5vdEV4aXN0KQorCQkJICAgIHx8IChSZXQgPT0ga0VwbE9iZElsbGVnYWxQYXJ0KSkgewkvLyBQRE8gZG9lcyBub3QgZXhpc3Q7IGxhc3QgUERPIHJlYWNoZWQKKwkJCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9IGVsc2UgaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBvdGhlciBmYXRhbCBlcnJvciBvY2N1cmVkCisJCQkJZ290byBFeGl0OworCQkJfQorCQkJLy8gZW50cnkgcmVhZCBzdWNjZXNzZnVsbHkKKwkJCWlmIChiT2JqZWN0Q291bnQgPT0gMCkgewkvLyBQRE8gaW4gT0Qgbm90IHZhbGlkLCB0cnkgbmV4dCBQRE8gaW4gT0QKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8vIHZhbGlkIFRQRE8gZm91bmQKKworCQkJT2JkU2l6ZSA9IDE7CisJCQkvLyBnZXQgUERPIG1hcHBpbmcgdmVyc2lvbiBmcm9tIE9ECisJCQlSZXQgPQorCQkJICAgIEVwbE9iZFJlYWRFbnRyeSh3T2JkQ29tbUluZGV4LCAweDAyLCAmYk9iZERhdGEsCisJCQkJCSAgICAmT2JkU2l6ZSk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIG90aGVyIGZhdGFsIGVycm9yIG9jY3VyZWQKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisJCQkvLyBlbnRyeSByZWFkIHN1Y2Nlc3NmdWxseQorCQkJLy8gc2V0IFBETyB2ZXJzaW9uIGluIGZyYW1lCisJCQlBbWlTZXRCeXRlVG9MZSgmcEZyYW1lLT5tX0RhdGEubV9QcmVzLm1fbGVfYlBkb1ZlcnNpb24sCisJCQkJICAgICAgIGJPYmREYXRhKTsKKworCQkJLy8gY2FsY3VsYXRlIFBETyBzaXplCisJCQl3UGRvU2l6ZSA9IDA7CisKKwkJCS8vIHByb2Nlc3MgbWFwcGluZworCQkJZm9yIChiTWFwcFN1YmluZGV4ID0gMTsgYk1hcHBTdWJpbmRleCA8PSBiT2JqZWN0Q291bnQ7CisJCQkgICAgIGJNYXBwU3ViaW5kZXgrKykgeworCQkJCU9iZFNpemUgPSA4OwkvLyBRV09SRAorCQkJCS8vIHJlYWQgb2JqZWN0IG1hcHBpbmcgZnJvbSBPRAorCQkJCVJldCA9CisJCQkJICAgIEVwbE9iZFJlYWRFbnRyeSh3T2JkTWFwcEluZGV4LAorCQkJCQkJICAgIGJNYXBwU3ViaW5kZXgsCisJCQkJCQkgICAgJnF3T2JqZWN0TWFwcGluZywgJk9iZFNpemUpOworCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gb3RoZXIgZmF0YWwgZXJyb3Igb2NjdXJlZAorCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorCQkJCS8vIGNoZWNrIGlmIG9iamVjdCBtYXBwaW5nIGVudHJ5IGlzIHZhbGlkLCBpLmUuIHVuZXF1YWwgemVybywgYmVjYXVzZSAiZW1wdHkiIGVudHJpZXMgYXJlIGFsbG93ZWQKKwkJCQlpZiAocXdPYmplY3RNYXBwaW5nID09IDApIHsJLy8gaW52YWxpZCBlbnRyeSwgY29udGludWUgd2l0aCBuZXh0IGVudHJ5CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQkvLyBkZWNvZGUgb2JqZWN0IG1hcHBpbmcKKwkJCQl3T2JkQ29tbUluZGV4ID0KKwkJCQkgICAgKFdPUkQpIChxd09iamVjdE1hcHBpbmcgJgorCQkJCQkgICAgMHgwMDAwMDAwMDAwMDBGRkZGTEwpOworCQkJCWJPYmRTdWJpbmRleCA9CisJCQkJICAgIChCWVRFKSAoKHF3T2JqZWN0TWFwcGluZyAmCisJCQkJCSAgICAgMHgwMDAwMDAwMDAwRkYwMDAwTEwpID4+IDE2KTsKKwkJCQl3Qml0T2Zmc2V0ID0KKwkJCQkgICAgKFdPUkQpICgocXdPYmplY3RNYXBwaW5nICYKKwkJCQkJICAgICAweDAwMDBGRkZGMDAwMDAwMDBMTCkgPj4gMzIpOworCQkJCXdCaXRTaXplID0KKwkJCQkgICAgKFdPUkQpICgocXdPYmplY3RNYXBwaW5nICYKKwkJCQkJICAgICAweEZGRkYwMDAwMDAwMDAwMDBMTCkgPj4gNDgpOworCisJCQkJLy8gY2FsY3VsYXRlIG1heCBQRE8gc2l6ZQorCQkJCU9iZFNpemUgPSB3Qml0U2l6ZSA+PiAzOworCQkJCXdWYXJTaXplID0gKHdCaXRPZmZzZXQgPj4gMykgKyAoV09SRCkgT2JkU2l6ZTsKKwkJCQlpZiAoKHVuc2lnbmVkIGludCkod1ZhclNpemUgKyAyNCkgPiBwRnJhbWVJbmZvLT5tX3VpRnJhbWVTaXplKSB7CS8vIFRQRE8gaXMgdG9vIHNob3J0CisJCQkJCS8vICQkJCByYWlzZSBQRE8gZXJyb3IsIHNldCBSZXQKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKwkJCQlpZiAod1ZhclNpemUgPiB3UGRvU2l6ZSkgewkvLyBtZW1vcml6ZSBuZXcgUERPIHNpemUKKwkJCQkJd1Bkb1NpemUgPSB3VmFyU2l6ZTsKKwkJCQl9CisJCQkJLy8gY29weSBvYmplY3QgZnJvbSBwcm9jZXNzL09EIHZhcmlhYmxlIHRvIFRQRE8KKwkJCQlSZXQgPQorCQkJCSAgICBFcGxPYmRSZWFkRW50cnlUb0xlKHdPYmRDb21tSW5kZXgsCisJCQkJCQkJYk9iZFN1YmluZGV4LAorCQkJCQkJCSZwRnJhbWUtPm1fRGF0YS5tX1ByZXMuCisJCQkJCQkJbV9sZV9hYlBheWxvYWRbKHdCaXRPZmZzZXQgPj4gMyldLCAmT2JkU2l6ZSk7CisJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBvdGhlciBmYXRhbCBlcnJvciBvY2N1cmVkCisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisKKwkJCX0KKworCQkJLy8gc2V0IFBETyBzaXplIGluIGZyYW1lCisJCQlBbWlTZXRXb3JkVG9MZSgmcEZyYW1lLT5tX0RhdGEubV9QcmVzLm1fbGVfd1NpemUsCisJCQkJICAgICAgIHdQZG9TaXplKTsKKworCQkJUmV0ID0gRXBsUGRva0NhbEFyZVRwZG9zVmFsaWQoJmZWYWxpZCk7CisJCQlpZiAoZlZhbGlkICE9IEZBTFNFKSB7CisJCQkJLy8gc2V0IFRQRE8gdmFsaWQKKwkJCQliRnJhbWVEYXRhID0KKwkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZSgmcEZyYW1lLT5tX0RhdGEubV9QcmVzLgorCQkJCQkJICAgICBtX2xlX2JGbGFnMSk7CisJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBGcmFtZS0+bV9EYXRhLm1fUHJlcy4KKwkJCQkJICAgICAgIG1fbGVfYkZsYWcxLAorCQkJCQkgICAgICAgKGJGcmFtZURhdGEgfAorCQkJCQkJRVBMX0ZSQU1FX0ZMQUcxX1JEKSk7CisJCQl9CisJCQkvLyBwcm9jZXNzaW5nIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseQorCisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIGtFcGxFdmVudFR5cGVQZG9Tb2E6CS8vIFNvQSByZWNlaXZlZAorCisJCS8vIGludmFsaWRhdGUgVFBET3MKKwkJUmV0ID0gRXBsUGRva0NhbFNldFRwZG9zVmFsaWQoRkFMU0UpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXsKKwkJCUFTU0VSVE1TRyhGQUxTRSwKKwkJCQkgICJFcGxQZG9rUHJvY2VzcygpOiB1bmhhbmRsZWQgZXZlbnQgdHlwZSFcbiIpOworCQl9CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczoKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmIC8vICNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1BET0spKSAhPSAwKQorCisvLyBFT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsUGRva0NhbC5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxQZG9rQ2FsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ0YzQ3NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsUGRva0NhbC5jCkBAIC0wLDAgKzEsMjY2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgc291cmNlIGZpbGUgZm9yIGtlcm5lbCBQRE8gQ29tbXVuaWNhdGlvbiBBYnN0cmFjdGlvbiBMYXllciBtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxQZG9rQ2FsLmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8yNyBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJrZXJuZWwvRXBsUGRva0NhbC5oIgorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEMgTCBBIFMgUyAgRXBsUGRva0NhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCB7CisJQk9PTCBtX2ZUcGRvc1ZhbGlkOworCit9IHRFcGxQZG9rQ2FsSW5zdGFuY2U7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbFBkb2tDYWxJbnN0YW5jZSBFcGxQZG9rQ2FsSW5zdGFuY2VfZzsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxQZG9rQ2FsQWRkSW5zdGFuY2UoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBhZGQgYW5kIGluaXRpYWxpemUgbmV3IGluc3RhbmNlIG9mIEVQTCBzdGFjaworLy8KKy8vIFBhcmFtZXRlcnM6ICBub25lCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbFBkb2tDYWxBZGRJbnN0YW5jZSh2b2lkKQoreworCisJRVBMX01FTVNFVCgmRXBsUGRva0NhbEluc3RhbmNlX2csIDAsIHNpemVvZihFcGxQZG9rQ2FsSW5zdGFuY2VfZykpOworCisJcmV0dXJuIGtFcGxTdWNjZXNzZnVsOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxQZG9rQ2FsRGVsSW5zdGFuY2UoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBkZWxldGVzIGFuIGluc3RhbmNlIG9mIEVQTCBzdGFjaworLy8KKy8vIFBhcmFtZXRlcnM6ICBub25lCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbFBkb2tDYWxEZWxJbnN0YW5jZSh2b2lkKQoreworCisJcmV0dXJuIGtFcGxTdWNjZXNzZnVsOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxQZG9rQ2FsU2V0VHBkb3NWYWxpZCgpCisvLworLy8gRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgdmFsaWRpdHkgZmxhZyBmb3IgVFBET3MgdG8gdGhlCisvLyAgICAgICAgICAgICAgc3BlY2lmaWVkIHZhbHVlLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBmVmFsaWRfcCAgICAgICAgICAgICAgICA9IHZhbGlkaXR5IGZsYWcKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsUGRva0NhbFNldFRwZG9zVmFsaWQoQk9PTCBmVmFsaWRfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJRXBsUGRva0NhbEluc3RhbmNlX2cubV9mVHBkb3NWYWxpZCA9IGZWYWxpZF9wOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsUGRva0NhbEFyZVRwZG9zVmFsaWQoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHZhbGlkaXR5IGZsYWcgZm9yIFRQRE9zLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwZlZhbGlkX3AgICAgICAgICAgICAgICA9IE9VVDogdmFsaWRpdHkgZmxhZworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxQZG9rQ2FsQXJlVHBkb3NWYWxpZChCT09MICogcGZWYWxpZF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkqcGZWYWxpZF9wID0gRXBsUGRva0NhbEluc3RhbmNlX2cubV9mVHBkb3NWYWxpZDsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczoKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxQZG91LmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFBkb3UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2IxMDY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxQZG91LmMKQEAgLTAsMCArMSw1NjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgdXNlciBQRE8gbW9kdWxlCisgICAgICAgICAgICAgICAgQ3VycmVudGx5LCB0aGlzIG1vZHVsZSBqdXN0IGltcGxlbWVudHMgYSBPRCBjYWxsYmFjayBmdW5jdGlvbgorICAgICAgICAgICAgICAgIHRvIGNoZWNrIGlmIHRoZSBQRE8gY29uZmlndXJhdGlvbiBpcyB2YWxpZC4KKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxQZG91LmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNS8yMiBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAxLjAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJFcGxJbmMuaCIKKy8vI2luY2x1ZGUgInVzZXIvRXBsUGRvdUNhbC5oIgorI2luY2x1ZGUgInVzZXIvRXBsT2JkdS5oIgorI2luY2x1ZGUgInVzZXIvRXBsUGRvdS5oIgorI2luY2x1ZGUgIkVwbFNkb0FjLmgiCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1BET1UpKSAhPSAwKQorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRVKSkgPT0gMCkgJiYgKEVQTF9PQkRfVVNFX0tFUk5FTCA9PSBGQUxTRSkKKyNlcnJvciAiRVBMIFBET3UgbW9kdWxlIG5lZWRzIEVQTCBtb2R1bGUgT0JEVSBvciBPQkRLISIKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBFUExfUERPVV9PQkRfSURYX1JYX0NPTU1fUEFSQU0gIDB4MTQwMAorI2RlZmluZSBFUExfUERPVV9PQkRfSURYX1JYX01BUFBfUEFSQU0gIDB4MTYwMAorI2RlZmluZSBFUExfUERPVV9PQkRfSURYX1RYX0NPTU1fUEFSQU0gIDB4MTgwMAorI2RlZmluZSBFUExfUERPVV9PQkRfSURYX1RYX01BUFBfUEFSQU0gIDB4MUEwMAorI2RlZmluZSBFUExfUERPVV9PQkRfSURYX01BUFBfUEFSQU0gICAgIDB4MDIwMAorI2RlZmluZSBFUExfUERPVV9PQkRfSURYX01BU0sgICAgICAgICAgIDB4RkYwMAorI2RlZmluZSBFUExfUERPVV9QRE9fSURfTUFTSyAgICAgICAgICAgIDB4MDBGRgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBDIEwgQSBTIFMgIEVwbFBkb3UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKy8vIERlc2NyaXB0aW9uOgorLy8KKy8vCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxQZG91Q2hlY2tQZG9WYWxpZGl0eSh0RXBsT2JkQ2JQYXJhbSBNRU0gKiBwUGFyYW1fcCwKKwkJCQkJICB1bnNpZ25lZCBpbnQgdWlJbmRleF9wKTsKKworc3RhdGljIHZvaWQgRXBsUGRvdURlY29kZU9iamVjdE1hcHBpbmcoUVdPUkQgcXdPYmplY3RNYXBwaW5nX3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCAqcHVpSW5kZXhfcCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50ICpwdWlTdWJJbmRleF9wLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKnB1aUJpdE9mZnNldF9wLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKnB1aUJpdFNpemVfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbFBkb3VDaGVja09iamVjdE1hcHBpbmcoUVdPUkQgcXdPYmplY3RNYXBwaW5nX3AsCisJCQkJCSAgICB0RXBsT2JkQWNjZXNzIEFjY2Vzc1R5cGVfcCwKKwkJCQkJICAgIERXT1JEICogcGR3QWJvcnRDb2RlX3AsCisJCQkJCSAgICB1bnNpZ25lZCBpbnQgKnB1aVBkb1NpemVfcCk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxQZG91QWRkSW5zdGFuY2UoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBhZGQgYW5kIGluaXRpYWxpemUgbmV3IGluc3RhbmNlIG9mIEVQTCBzdGFjaworLy8KKy8vIFBhcmFtZXRlcnM6ICBub25lCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbFBkb3VBZGRJbnN0YW5jZSh2b2lkKQoreworCisJcmV0dXJuIGtFcGxTdWNjZXNzZnVsOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxQZG91RGVsSW5zdGFuY2UoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBkZWxldGVzIGFuIGluc3RhbmNlIG9mIEVQTCBzdGFjaworLy8KKy8vIFBhcmFtZXRlcnM6ICBub25lCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbFBkb3VEZWxJbnN0YW5jZSh2b2lkKQoreworCisJcmV0dXJuIGtFcGxTdWNjZXNzZnVsOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxQZG91Q2JPYmRBY2Nlc3MKKy8vCisvLyBEZXNjcmlwdGlvbjogY2FsbGJhY2sgZnVuY3Rpb24gZm9yIE9EIGFjY2Vzc2VzCisvLworLy8gUGFyYW1ldGVyczogIHBQYXJhbV9wICAgICAgICAgICAgICAgID0gT0JEIHBhcmFtZXRlcgorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsUGRvdUNiT2JkQWNjZXNzKHRFcGxPYmRDYlBhcmFtIE1FTSAqIHBQYXJhbV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdW5zaWduZWQgaW50IHVpUGRvSWQ7CisJdW5zaWduZWQgaW50IHVpSW5kZXhUeXBlOworCXRFcGxPYmRTaXplIE9iZFNpemU7CisJQllURSBiT2JqZWN0Q291bnQ7CisJUVdPUkQgcXdPYmplY3RNYXBwaW5nOworCXRFcGxPYmRBY2Nlc3MgQWNjZXNzVHlwZTsKKwlCWVRFIGJNYXBwU3ViaW5kZXg7CisJdW5zaWduZWQgaW50IHVpQ3VyUGRvU2l6ZTsKKwlXT1JEIHdNYXhQZG9TaXplOworCXVuc2lnbmVkIGludCB1aVN1YkluZGV4OworCisJLy8gZmV0Y2ggUERPIElECisJdWlQZG9JZCA9IHBQYXJhbV9wLT5tX3VpSW5kZXggJiBFUExfUERPVV9QRE9fSURfTUFTSzsKKworCS8vIGZldGNoIG9iamVjdCBpbmRleCB0eXBlCisJdWlJbmRleFR5cGUgPSBwUGFyYW1fcC0+bV91aUluZGV4ICYgRVBMX1BET1VfT0JEX0lEWF9NQVNLOworCisJaWYgKHBQYXJhbV9wLT5tX09iZEV2ZW50ICE9IGtFcGxPYmRFdlByZVdyaXRlKSB7CS8vIHJlYWQgYWNjZXNzZXMsIHBvc3Qgd3JpdGUgZXZlbnRzIGV0Yy4gYXJlIE9LCisJCXBQYXJhbV9wLT5tX2R3QWJvcnRDb2RlID0gMDsKKwkJZ290byBFeGl0OworCX0KKwkvLyBjaGVjayBpbmRleCB0eXBlCisJc3dpdGNoICh1aUluZGV4VHlwZSkgeworCWNhc2UgRVBMX1BET1VfT0JEX0lEWF9SWF9DT01NX1BBUkFNOgorCQkvLyBSUERPIGNvbW11bmljYXRpb24gcGFyYW1ldGVyIGFjY2Vzc2VkCisJY2FzZSBFUExfUERPVV9PQkRfSURYX1RYX0NPTU1fUEFSQU06CisJCXsJCS8vIFRQRE8gY29tbXVuaWNhdGlvbiBwYXJhbWV0ZXIgYWNjZXNzZWQKKwkJCVJldCA9IEVwbFBkb3VDaGVja1Bkb1ZhbGlkaXR5KHBQYXJhbV9wLAorCQkJCQkJICAgICAgKEVQTF9QRE9VX09CRF9JRFhfTUFQUF9QQVJBTQorCQkJCQkJICAgICAgIHwgcFBhcmFtX3AtPm1fdWlJbmRleCkpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBQRE8gaXMgdmFsaWQgb3IgZG9lcyBub3QgZXhpc3QKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisKKwkJCWdvdG8gRXhpdDsKKwkJfQorCisJY2FzZSBFUExfUERPVV9PQkRfSURYX1JYX01BUFBfUEFSQU06CisJCXsJCS8vIFJQRE8gbWFwcGluZyBwYXJhbWV0ZXIgYWNjZXNzZWQKKworCQkJQWNjZXNzVHlwZSA9IGtFcGxPYmRBY2NXcml0ZTsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIEVQTF9QRE9VX09CRF9JRFhfVFhfTUFQUF9QQVJBTToKKwkJewkJLy8gVFBETyBtYXBwaW5nIHBhcmFtZXRlciBhY2Nlc3NlZAorCisJCQlBY2Nlc3NUeXBlID0ga0VwbE9iZEFjY1JlYWQ7CisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJewkJLy8gdGhpcyBjYWxsYmFjayBmdW5jdGlvbiBpcyBvbmx5IGZvcgorCQkJLy8gUERPIG1hcHBpbmcgYW5kIGNvbW11bmljYXRpb24gcGFyYW1ldGVycworCQkJcFBhcmFtX3AtPm1fZHdBYm9ydENvZGUgPSBFUExfU0RPQUNfR0VORVJBTF9FUlJPUjsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCX0KKworCS8vIFJQRE8gYW5kIFRQRE8gbWFwcGluZyBwYXJhbWV0ZXIgYWNjZXNzZWQKKworCWlmIChwUGFyYW1fcC0+bV91aVN1YkluZGV4ID09IDApIHsJLy8gb2JqZWN0IG1hcHBpbmcgY291bnQgYWNjZXNzZWQKKworCQkvLyBQRE8gaXMgZW5hYmxlZCBvciBkaXNhYmxlZAorCQliT2JqZWN0Q291bnQgPSAqKChCWVRFICopIHBQYXJhbV9wLT5tX3BBcmcpOworCisJCWlmIChiT2JqZWN0Q291bnQgPT0gMCkgewkvLyBQRE8gc2hhbGwgYmUgZGlzYWJsZWQKKworCQkJLy8gdGhhdCBpcyBhbHdheXMgcG9zc2libGUKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQkvLyBQRE8gc2hhbGwgYmUgZW5hYmxlZAorCQkvLyBpdCBzaG91bGQgaGF2ZSBiZWVuIGRpc2FibGVkIGZvciB0aGlzIG9wZXJhdGlvbgorCQlSZXQgPSBFcGxQZG91Q2hlY2tQZG9WYWxpZGl0eShwUGFyYW1fcCwgcFBhcmFtX3AtPm1fdWlJbmRleCk7CisJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gUERPIGlzIHZhbGlkIG9yIGRvZXMgbm90IGV4aXN0CisJCQlnb3RvIEV4aXQ7CisJCX0KKworCQlpZiAoQWNjZXNzVHlwZSA9PSBrRXBsT2JkQWNjV3JpdGUpIHsKKwkJCXVpU3ViSW5kZXggPSAweDA0OwkvLyBQUmVxQWN0UGF5bG9hZExpbWl0X1UxNgorCQl9IGVsc2UgeworCQkJdWlTdWJJbmRleCA9IDB4MDU7CS8vIFBSZXNBY3RQYXlsb2FkTGltaXRfVTE2CisJCX0KKworCQkvLyBmZXRjaCBtYXhpbXVtIFBETyBzaXplIGZyb20gT2JqZWN0IDFGOThoOiBOTVRfQ3ljbGVUaW1pbmdfUkVDCisJCU9iZFNpemUgPSBzaXplb2Yod01heFBkb1NpemUpOworCQlSZXQgPQorCQkgICAgRXBsT2JkdVJlYWRFbnRyeSgweDFGOTgsIHVpU3ViSW5kZXgsICZ3TWF4UGRvU2l6ZSwKKwkJCQkgICAgICZPYmRTaXplKTsKKwkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBvdGhlciBmYXRhbCBlcnJvciBvY2N1cmVkCisJCQlwUGFyYW1fcC0+bV9kd0Fib3J0Q29kZSA9IEVQTF9TRE9BQ19HRU5FUkFMX0VSUk9SOworCQkJZ290byBFeGl0OworCQl9CisJCS8vIGNoZWNrIGFsbCBvYmplY3RtYXBwaW5ncworCQlmb3IgKGJNYXBwU3ViaW5kZXggPSAxOyBiTWFwcFN1YmluZGV4IDw9IGJPYmplY3RDb3VudDsKKwkJICAgICBiTWFwcFN1YmluZGV4KyspIHsKKwkJCS8vIHJlYWQgb2JqZWN0IG1hcHBpbmcgZnJvbSBPRAorCQkJT2JkU2l6ZSA9IHNpemVvZihxd09iamVjdE1hcHBpbmcpOwkvLyBRV09SRAorCQkJUmV0ID0gRXBsT2JkdVJlYWRFbnRyeShwUGFyYW1fcC0+bV91aUluZGV4LAorCQkJCQkgICAgICAgYk1hcHBTdWJpbmRleCwgJnF3T2JqZWN0TWFwcGluZywKKwkJCQkJICAgICAgICZPYmRTaXplKTsKKwkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gb3RoZXIgZmF0YWwgZXJyb3Igb2NjdXJlZAorCQkJCXBQYXJhbV9wLT5tX2R3QWJvcnRDb2RlID0KKwkJCQkgICAgRVBMX1NET0FDX0dFTkVSQUxfRVJST1I7CisJCQkJZ290byBFeGl0OworCQkJfQorCQkJLy8gY2hlY2sgb2JqZWN0IG1hcHBpbmcKKwkJCVJldCA9IEVwbFBkb3VDaGVja09iamVjdE1hcHBpbmcocXdPYmplY3RNYXBwaW5nLAorCQkJCQkJCUFjY2Vzc1R5cGUsCisJCQkJCQkJJnBQYXJhbV9wLT4KKwkJCQkJCQltX2R3QWJvcnRDb2RlLAorCQkJCQkJCSZ1aUN1clBkb1NpemUpOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBpbGxlZ2FsIG9iamVjdCBtYXBwaW5nCisJCQkJZ290byBFeGl0OworCQkJfQorCisJCQlpZiAodWlDdXJQZG9TaXplID4gd01heFBkb1NpemUpIHsJLy8gbWFwcGluZyBleGNlZWRzIG9iamVjdCBzaXplCisJCQkJcFBhcmFtX3AtPm1fZHdBYm9ydENvZGUgPQorCQkJCSAgICBFUExfU0RPQUNfR0VORVJBTF9FUlJPUjsKKwkJCQlSZXQgPSBrRXBsUGRvVmFyTm90Rm91bmQ7CisJCQl9CisKKwkJfQorCisJfSBlbHNlIHsJCS8vIE9iamVjdE1hcHBpbmcKKwkJUmV0ID0gRXBsUGRvdUNoZWNrUGRvVmFsaWRpdHkocFBhcmFtX3AsIHBQYXJhbV9wLT5tX3VpSW5kZXgpOworCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIFBETyBpcyB2YWxpZCBvciBkb2VzIG5vdCBleGlzdAorCQkJZ290byBFeGl0OworCQl9CisJCS8vIGNoZWNrIGV4aXN0ZW5jZSBvZiBvYmplY3QgYW5kIHZhbGlkaXR5IG9mIG9iamVjdCBsZW5ndGgKKworCQlxd09iamVjdE1hcHBpbmcgPSAqKChRV09SRCAqKSBwUGFyYW1fcC0+bV9wQXJnKTsKKworCQlSZXQgPSBFcGxQZG91Q2hlY2tPYmplY3RNYXBwaW5nKHF3T2JqZWN0TWFwcGluZywKKwkJCQkJCUFjY2Vzc1R5cGUsCisJCQkJCQkmcFBhcmFtX3AtPm1fZHdBYm9ydENvZGUsCisJCQkJCQkmdWlDdXJQZG9TaXplKTsKKworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsUGRvdUNoZWNrUGRvVmFsaWRpdHkKKy8vCisvLyBEZXNjcmlwdGlvbjogY2hlY2sgaWYgUERPIGlzIHZhbGlkCisvLworLy8gUGFyYW1ldGVyczogIHBQYXJhbV9wICAgICAgICAgICAgICAgID0gT0JEIHBhcmFtZXRlcgorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsUGRvdUNoZWNrUGRvVmFsaWRpdHkodEVwbE9iZENiUGFyYW0gTUVNICogcFBhcmFtX3AsCisJCQkJCSAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxPYmRTaXplIE9iZFNpemU7CisJQllURSBiT2JqZWN0Q291bnQ7CisKKwlPYmRTaXplID0gMTsKKwkvLyByZWFkIG51bWJlciBvZiBtYXBwZWQgb2JqZWN0cyBmcm9tIE9EOyB0aGlzIGluZGljYXRlcyBpZiB0aGUgUERPIGlzIHZhbGlkCisJUmV0ID0gRXBsT2JkdVJlYWRFbnRyeSh1aUluZGV4X3AsIDB4MDAsICZiT2JqZWN0Q291bnQsICZPYmRTaXplKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIG90aGVyIGZhdGFsIGVycm9yIG9jY3VyZWQKKwkJcFBhcmFtX3AtPm1fZHdBYm9ydENvZGUgPQorCQkgICAgRVBMX1NET0FDX0dFTl9JTlRFUk5BTF9JTkNPTVBBVElCSUxJVFk7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZW50cnkgcmVhZCBzdWNjZXNzZnVsbHkKKwlpZiAoYk9iamVjdENvdW50ICE9IDApIHsJLy8gUERPIGluIE9EIGlzIHN0aWxsIHZhbGlkCisJCXBQYXJhbV9wLT5tX2R3QWJvcnRDb2RlID0gRVBMX1NET0FDX0dFTl9QQVJBTV9JTkNPTVBBVElCSUxJVFk7CisJCVJldCA9IGtFcGxQZG9Ob3RFeGlzdDsKKwkJZ290byBFeGl0OworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxQZG91RGVjb2RlT2JqZWN0TWFwcGluZworLy8KKy8vIERlc2NyaXB0aW9uOiBkZWNvZGVzIHRoZSBnaXZlbiBvYmplY3QgbWFwcGluZyBlbnRyeSBpbnRvIGluZGV4LCBzdWJpbmRleCwKKy8vICAgICAgICAgICAgICBiaXQgb2Zmc2V0IGFuZCBiaXQgc2l6ZS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcXdPYmplY3RNYXBwaW5nX3AgICAgICAgPSBvYmplY3QgbWFwcGluZyBlbnRyeQorLy8gICAgICAgICAgICAgIHB1aUluZGV4X3AgICAgICAgICAgICAgID0gW09VVF0gcG9pbnRlciB0byBvYmplY3QgaW5kZXgKKy8vICAgICAgICAgICAgICBwdWlTdWJJbmRleF9wICAgICAgICAgICA9IFtPVVRdIHBvaW50ZXIgdG8gc3ViaW5kZXgKKy8vICAgICAgICAgICAgICBwdWlCaXRPZmZzZXRfcCAgICAgICAgICA9IFtPVVRdIHBvaW50ZXIgdG8gYml0IG9mZnNldAorLy8gICAgICAgICAgICAgIHB1aUJpdFNpemVfcCAgICAgICAgICAgID0gW09VVF0gcG9pbnRlciB0byBiaXQgc2l6ZQorLy8KKy8vIFJldHVybnM6ICAgICAodm9pZCkKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBFcGxQZG91RGVjb2RlT2JqZWN0TWFwcGluZyhRV09SRCBxd09iamVjdE1hcHBpbmdfcCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50ICpwdWlJbmRleF9wLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKnB1aVN1YkluZGV4X3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCAqcHVpQml0T2Zmc2V0X3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCAqcHVpQml0U2l6ZV9wKQoreworCSpwdWlJbmRleF9wID0gKHVuc2lnbmVkIGludCkKKwkgICAgKHF3T2JqZWN0TWFwcGluZ19wICYgMHgwMDAwMDAwMDAwMDBGRkZGTEwpOworCisJKnB1aVN1YkluZGV4X3AgPSAodW5zaWduZWQgaW50KQorCSAgICAoKHF3T2JqZWN0TWFwcGluZ19wICYgMHgwMDAwMDAwMDAwRkYwMDAwTEwpID4+IDE2KTsKKworCSpwdWlCaXRPZmZzZXRfcCA9ICh1bnNpZ25lZCBpbnQpCisJICAgICgocXdPYmplY3RNYXBwaW5nX3AgJiAweDAwMDBGRkZGMDAwMDAwMDBMTCkgPj4gMzIpOworCisJKnB1aUJpdFNpemVfcCA9ICh1bnNpZ25lZCBpbnQpCisJICAgICgocXdPYmplY3RNYXBwaW5nX3AgJiAweEZGRkYwMDAwMDAwMDAwMDBMTCkgPj4gNDgpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFBkb3VDaGVja09iamVjdE1hcHBpbmcKKy8vCisvLyBEZXNjcmlwdGlvbjogY2hlY2tzIHRoZSBnaXZlbiBvYmplY3QgbWFwcGluZyBlbnRyeS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcXdPYmplY3RNYXBwaW5nX3AgICAgICAgPSBvYmplY3QgbWFwcGluZyBlbnRyeQorLy8gICAgICAgICAgICAgIEFjY2Vzc1R5cGVfcCAgICAgICAgICAgID0gYWNjZXNzIHR5cGUgdG8gbWFwcGVkIG9iamVjdDoKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlID0gUlBETyBhbmQgcmVhZCA9IFRQRE8KKy8vICAgICAgICAgICAgICBwdWlQZG9TaXplX3AgICAgICAgICAgICA9IFtPVVRdIHBvaW50ZXIgdG8gY292ZXJlZCBQRE8gc2l6ZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9mZnNldCArIHNpemUpIGluIGJ5dGU7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIGlmIG1hcHBpbmcgZmFpbGVkCisvLyAgICAgICAgICAgICAgcGR3QWJvcnRDb2RlX3AgICAgICAgICAgPSBbT1VUXSBwb2ludGVyIHRvIFNETyBhYm9ydCBjb2RlOworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCBpZiBtYXBwaW5nIGlzIHBvc3NpYmxlCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbFBkb3VDaGVja09iamVjdE1hcHBpbmcoUVdPUkQgcXdPYmplY3RNYXBwaW5nX3AsCisJCQkJCSAgICB0RXBsT2JkQWNjZXNzIEFjY2Vzc1R5cGVfcCwKKwkJCQkJICAgIERXT1JEICogcGR3QWJvcnRDb2RlX3AsCisJCQkJCSAgICB1bnNpZ25lZCBpbnQgKnB1aVBkb1NpemVfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxPYmRTaXplIE9iZFNpemU7CisJdW5zaWduZWQgaW50IHVpSW5kZXg7CisJdW5zaWduZWQgaW50IHVpU3ViSW5kZXg7CisJdW5zaWduZWQgaW50IHVpQml0T2Zmc2V0OworCXVuc2lnbmVkIGludCB1aUJpdFNpemU7CisJdEVwbE9iZEFjY2VzcyBBY2Nlc3NUeXBlOworCUJPT0wgZk51bWVyaWNhbDsKKworCWlmIChxd09iamVjdE1hcHBpbmdfcCA9PSAwKSB7CS8vIGRpc2NhcmQgemVybyB2YWx1ZQorCQkqcHVpUGRvU2l6ZV9wID0gMDsKKwkJZ290byBFeGl0OworCX0KKwkvLyBkZWNvZGUgb2JqZWN0IG1hcHBpbmcKKwlFcGxQZG91RGVjb2RlT2JqZWN0TWFwcGluZyhxd09iamVjdE1hcHBpbmdfcCwKKwkJCQkgICAmdWlJbmRleCwKKwkJCQkgICAmdWlTdWJJbmRleCwgJnVpQml0T2Zmc2V0LCAmdWlCaXRTaXplKTsKKworCWlmICgodWlCaXRPZmZzZXQgJiAweDcpICE9IDB4MCkgewkvLyBiaXQgbWFwcGluZyBpcyBub3Qgc3VwcG9ydGVkCisJCSpwZHdBYm9ydENvZGVfcCA9IEVQTF9TRE9BQ19HRU5FUkFMX0VSUk9SOworCQlSZXQgPSBrRXBsUGRvR3JhbnVsYXJpdHlNaXNtYXRjaDsKKwkJZ290byBFeGl0OworCX0KKworCWlmICgodWlCaXRTaXplICYgMHg3KSAhPSAweDApIHsJLy8gYml0IG1hcHBpbmcgaXMgbm90IHN1cHBvcnRlZAorCQkqcGR3QWJvcnRDb2RlX3AgPSBFUExfU0RPQUNfR0VORVJBTF9FUlJPUjsKKwkJUmV0ID0ga0VwbFBkb0dyYW51bGFyaXR5TWlzbWF0Y2g7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gY2hlY2sgYWNjZXNzIHR5cGUKKwlSZXQgPSBFcGxPYmR1R2V0QWNjZXNzVHlwZSh1aUluZGV4LCB1aVN1YkluZGV4LCAmQWNjZXNzVHlwZSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgewkvLyBlbnRyeSBkb2Vzbid0IGV4aXN0CisJCSpwZHdBYm9ydENvZGVfcCA9IEVQTF9TRE9BQ19PQkpFQ1RfTk9UX0VYSVNUOworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKChBY2Nlc3NUeXBlICYga0VwbE9iZEFjY1BkbykgPT0gMCkgewkvLyBvYmplY3QgaXMgbm90IG1hcHBhYmxlCisJCSpwZHdBYm9ydENvZGVfcCA9IEVQTF9TRE9BQ19PQkpFQ1RfTk9UX01BUFBBQkxFOworCQlSZXQgPSBrRXBsUGRvVmFyTm90Rm91bmQ7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAoKEFjY2Vzc1R5cGUgJiBBY2Nlc3NUeXBlX3ApID09IDApIHsJLy8gb2JqZWN0IGlzIG5vdCB3cml0ZWFibGUgKFJQRE8pIG9yIHJlYWRhYmxlIChUUERPKSByZXNwZWN0aXZlbHkKKwkJKnBkd0Fib3J0Q29kZV9wID0gRVBMX1NET0FDX09CSkVDVF9OT1RfTUFQUEFCTEU7CisJCVJldCA9IGtFcGxQZG9WYXJOb3RGb3VuZDsKKwkJZ290byBFeGl0OworCX0KKworCU9iZFNpemUgPSBFcGxPYmR1R2V0RGF0YVNpemUodWlJbmRleCwgdWlTdWJJbmRleCk7CisJaWYgKE9iZFNpemUgPCAodWlCaXRTaXplID4+IDMpKSB7CS8vIG9iamVjdCBkb2VzIG5vdCBleGlzdCBvciBoYXMgc21hbGxlciBzaXplCisJCSpwZHdBYm9ydENvZGVfcCA9IEVQTF9TRE9BQ19HRU5FUkFMX0VSUk9SOworCQlSZXQgPSBrRXBsUGRvVmFyTm90Rm91bmQ7CisJfQorCisJUmV0ID0gRXBsT2JkdUlzTnVtZXJpY2FsKHVpSW5kZXgsIHVpU3ViSW5kZXgsICZmTnVtZXJpY2FsKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVudHJ5IGRvZXNuJ3QgZXhpc3QKKwkJKnBkd0Fib3J0Q29kZV9wID0gRVBMX1NET0FDX09CSkVDVF9OT1RfRVhJU1Q7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAoKGZOdW1lcmljYWwgIT0gRkFMU0UpCisJICAgICYmICgodWlCaXRTaXplID4+IDMpICE9IE9iZFNpemUpKSB7CisJCS8vIG9iamVjdCBpcyBudW1lcmljYWwsCisJCS8vIHRoZXJlZm9yIHNpemUgaGFzIHRvIGZpdCwgYnV0IGl0IGRvZXMgbm90LgorCQkqcGR3QWJvcnRDb2RlX3AgPSBFUExfU0RPQUNfR0VORVJBTF9FUlJPUjsKKwkJUmV0ID0ga0VwbFBkb1Zhck5vdEZvdW5kOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGNhbHVjYWxlZCBuZWVkZWQgUERPIHNpemUKKwkqcHVpUGRvU2l6ZV9wID0gKHVpQml0T2Zmc2V0ID4+IDMpICsgKHVpQml0U2l6ZSA+PiAzKTsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisjZW5kaWYgLy8gI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfUERPVSkpICE9IDApCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxTZG8uaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsU2RvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNiM2YyZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsU2RvLmgKQEAgLTAsMCArMSwyNDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIGFwaSBmdW5jdGlvbiBvZiB0aGUgc2RvIG1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbFNkby5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgMjAwNi8wNi8yNiBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiRXBsSW5jLmgiCisjaW5jbHVkZSAiRXBsRnJhbWUuaCIKKyNpbmNsdWRlICJFcGxTZG9BYy5oIgorCisjaWZuZGVmIF9FUExTRE9fSF8KKyNkZWZpbmUgX0VQTFNET19IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGdsb2JhbCBkZWZpbmVzCisjaWZuZGVmIEVQTF9TRE9fTUFYX1BBWUxPQUQKKyNkZWZpbmUgRVBMX1NET19NQVhfUEFZTE9BRCAgICAgMjU2CisjZW5kaWYKKworLy8gaGFuZGxlIGJldHdlZW4gUHJvdG9jb2wgQWJzdHJhY3Rpb24gTGF5ZXIgYW5kIGFzeW5jaHJvbm91cyBTRE8gU2VxdWVuY2UgTGF5ZXIKKyNkZWZpbmUgRVBMX1NET19VRFBfSEFORExFICAgICAgMHg4MDAwCisjZGVmaW5lIEVQTF9TRE9fQVNORF9IQU5ETEUgICAgIDB4NDAwMAorI2RlZmluZSBFUExfU0RPX0FTWV9IQU5ETEVfTUFTSyAweEMwMDAKKyNkZWZpbmUgRVBMX1NET19BU1lfSU5WQUxJRF9IREwgMHgzRkZGCisKKy8vIGhhbmRsZSBiZXR3ZWVuICBTRE8gU2VxdWVuY2UgTGF5ZXIgYW5kIHNkbyBjb21tYW5kIGxheWVyCisjZGVmaW5lIEVQTF9TRE9fQVNZX0hBTkRMRSAgICAgIDB4ODAwMAorI2RlZmluZSBFUExfU0RPX1BET19IQU5ETEUgICAgICAweDQwMDAKKyNkZWZpbmUgRVBMX1NET19TRVFfSEFORExFX01BU0sgMHhDMDAwCisjZGVmaW5lIEVQTF9TRE9fU0VRX0lOVkFMSURfSERMIDB4M0ZGRgorCisjZGVmaW5lIEVQTF9BU05EX0hFQURFUl9TSVpFICAgICAgICA0CisvLyNkZWZpbmUgRVBMX1NFUV9IRUFERVJfU0laRSAgICAgICAgIDQKKyNkZWZpbmUgRVBMX0VUSEVSTkVUX0hFQURFUl9TSVpFICAgIDE0CisKKyNkZWZpbmUgRVBMX1NFUV9OVU1fTUFTSyAgICAgICAgICAgIDB4RkMKKworLy8gc2l6ZSBmb3Igc2VuZCBidWZmZXIgYW5kIGhpc3RvcnkKKyNkZWZpbmUgRVBMX01BWF9TRE9fRlJBTUVfU0laRSAgICAgIEVQTF9DX0lQX01JTl9NVFUKKy8vIHNpemUgZm9yIHJlY2VpdmUgZnJhbWUKKy8vIC0+IG5lZWRlZCBiZWNhdXNlIFNORC1LaXQgc2VuZHMgdXAgdG8gMTUxOCBCeXRlCisvLyAgICB3aXRob3V0IFNkby1Db21tYW5kOiBNYXhpbXVtIFNlZ21lbnQgU2l6ZQorI2RlZmluZSBFUExfTUFYX1NET19SRUNfRlJBTUVfU0laRSAgRVBMX0NfSVBfTUFYX01UVQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGhhbmRsZSBiZXR3ZWVuIFByb3RvY29sIEFic3RyYWN0aW9uIExheWVyIGFuZCBhc3luY2hyb251dXMgU0RPIFNlcXVlbmNlIExheWVyCit0eXBlZGVmIHVuc2lnbmVkIGludCB0RXBsU2RvQ29uSGRsOworCisvLyBjYWxsYmFjayBmdW5jdGlvbiBwb2ludGVyIGZvciBQcm90b2NvbCBBYnN0cmFjdGlvbiBMYXllciB0byBjYWxsCisvLyBhc3luY2hyb251dXMgU0RPIFNlcXVlbmNlIExheWVyCit0eXBlZGVmIHRFcGxLZXJuZWwoUFVCTElDICogdEVwbFNlcXVMYXllclJlY2VpdmVDYikgKHRFcGxTZG9Db25IZGwgQ29uSGRsX3AsCisJCQkJCQkgICAgIHRFcGxBc3lTZG9TZXEgKgorCQkJCQkJICAgICBwU2RvU2VxRGF0YV9wLAorCQkJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlEYXRhU2l6ZV9wKTsKKworLy8gaGFuZGxlIGJldHdlZW4gYXN5bmNocm9udXVzIFNETyBTZXF1ZW5jZSBMYXllciBhbmQgU0RPIENvbW1hbmQgbGF5ZXIKK3R5cGVkZWYgdW5zaWduZWQgaW50IHRFcGxTZG9TZXFDb25IZGw7CisKKy8vIGNhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXIgZm9yIGFzeW5jaHJvbnV1cyBTRE8gU2VxdWVuY2UgTGF5ZXIgdG8gY2FsbAorLy8gU0RPIENvbW1hbmQgbGF5ZXIgZm9yIHJlY2VpdmVkIGRhdGEKK3R5cGVkZWYgdEVwbEtlcm5lbChQVUJMSUMgKgorCQkgICB0RXBsU2RvQ29tUmVjZWl2ZUNiKSAodEVwbFNkb1NlcUNvbkhkbCBTZG9TZXFDb25IZGxfcCwKKwkJCQkJIHRFcGxBc3lTZG9Db20gKiBwQXN5U2RvQ29tX3AsCisJCQkJCSB1bnNpZ25lZCBpbnQgdWlEYXRhU2l6ZV9wKTsKKworLy8gc3RhdHVzIG9mIGNvbm5lY3Rpb24KK3R5cGVkZWYgZW51bSB7CisJa0FzeVNkb0NvblN0YXRlQ29ubmVjdGVkID0gMHgwMCwKKwlrQXN5U2RvQ29uU3RhdGVJbml0RXJyb3IgPSAweDAxLAorCWtBc3lTZG9Db25TdGF0ZUNvbkNsb3NlZCA9IDB4MDIsCisJa0FzeVNkb0NvblN0YXRlQWNrUmVjZWl2ZWQgPSAweDAzLAorCWtBc3lTZG9Db25TdGF0ZUZyYW1lU2VuZGVkID0gMHgwNCwKKwlrQXN5U2RvQ29uU3RhdGVUaW1lb3V0ID0gMHgwNQorfSB0RXBsQXN5U2RvQ29uU3RhdGU7CisKKy8vIGNhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXIgZm9yIGFzeW5jaHJvbnV1cyBTRE8gU2VxdWVuY2UgTGF5ZXIgdG8gY2FsbAorLy8gU0RPIENvbW1hbmQgbGF5ZXIgZm9yIGNvbm5lY3Rpb24gc3RhdHVzCit0eXBlZGVmIHRFcGxLZXJuZWwoUFVCTElDICogdEVwbFNkb0NvbUNvbkNiKSAodEVwbFNkb1NlcUNvbkhkbCBTZG9TZXFDb25IZGxfcCwKKwkJCQkJICAgICAgdEVwbEFzeVNkb0NvblN0YXRlCisJCQkJCSAgICAgIEFzeVNkb0NvblN0YXRlX3ApOworCisvLyBoYW5kbGUgYmV0d2VlbiAgU0RPIENvbW1hbmQgbGF5ZXIgYW5kIGFwcGxpY2F0aW9uCit0eXBlZGVmIHVuc2lnbmVkIGludCB0RXBsU2RvQ29tQ29uSGRsOworCisvLyBzdGF0dXMgb2YgY29ubmVjdGlvbgordHlwZWRlZiBlbnVtIHsKKwlrRXBsU2RvQ29tVHJhbnNmZXJOb3RBY3RpdmUgPSAweDAwLAorCWtFcGxTZG9Db21UcmFuc2ZlclJ1bm5pbmcgPSAweDAxLAorCWtFcGxTZG9Db21UcmFuc2ZlclR4QWJvcnRlZCA9IDB4MDIsCisJa0VwbFNkb0NvbVRyYW5zZmVyUnhBYm9ydGVkID0gMHgwMywKKwlrRXBsU2RvQ29tVHJhbnNmZXJGaW5pc2hlZCA9IDB4MDQsCisJa0VwbFNkb0NvbVRyYW5zZmVyTG93ZXJMYXllckFib3J0ID0gMHgwNQorfSB0RXBsU2RvQ29tQ29uU3RhdGU7CisKKy8vIFNETyBTZXJ2aWNlcyBhbmQgQ29tbWFuZC1JZHMgZnJvbSBEUyAxLjAuMCBwLjE1MgordHlwZWRlZiBlbnVtIHsKKwlrRXBsU2RvU2VydmljZU5JTCA9IDB4MDAsCisJa0VwbFNkb1NlcnZpY2VXcml0ZUJ5SW5kZXggPSAweDAxLAorCWtFcGxTZG9TZXJ2aWNlUmVhZEJ5SW5kZXggPSAweDAyCisJICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgICAgLy8gdGhlIGZvbGxvd2luZyBzZXJ2aWNlcyBhcmUgb3B0aW9uYWwgYW5kCisJICAgIC8vIG5vdCBzdXBwb3J0ZWQgbm93CisvKgorICAgIGtFcGxTZG9TZXJ2aWNlV3JpdGVBbGxCeUluZGV4ICAgPSAweDAzLAorICAgIGtFcGxTZG9TZXJ2aWNlUmVhZEFsbEJ5SW5kZXggICAgPSAweDA0LAorICAgIGtFcGxTZG9TZXJ2aWNlV3JpdGVCeU5hbWUgICAgICAgPSAweDA1LAorICAgIGtFcGxTZG9TZXJ2aWNlUmVhZEJ5TmFtZSAgICAgICAgPSAweDA2LAorCisgICAga0VwbFNkb1NlcnZpY2VGaWxlV3JpdGUgICAgICAgICA9IDB4MjAsCisgICAga0VwbFNkb1NlcnZpY2VGaWxlUmVhZCAgICAgICAgICA9IDB4MjEsCisKKyAgICBrRXBsU2RvU2VydmljZVdyaXRlTXVsdGlCeUluZGV4ID0gMHgzMSwKKyAgICBrRXBsU2RvU2VydmljZVJlYWRNdWx0aUJ5SW5kZXggID0gMHgzMiwKKworICAgIGtFcGxTZG9TZXJ2aWNlTWF4U2VnU2l6ZSAgICAgICAgPSAweDcwCisKKyAgICAvLyAweDgwIC0gMHhGRiBtYW51ZmFjdHVyZXIgc3BlY2lmaWMKKworICovCit9IHRFcGxTZG9TZXJ2aWNlVHlwZTsKKworLy8gZGVzY3JpYmVzIGlmIHJlYWQgb3Igd3JpdGUgYWNjZXNzCit0eXBlZGVmIGVudW0geworCWtFcGxTZG9BY2Nlc3NUeXBlUmVhZCA9IDB4MDAsCisJa0VwbFNkb0FjY2Vzc1R5cGVXcml0ZSA9IDB4MDEKK30gdEVwbFNkb0FjY2Vzc1R5cGU7CisKK3R5cGVkZWYgZW51bSB7CisJa0VwbFNkb1R5cGVBdXRvID0gMHgwMCwKKwlrRXBsU2RvVHlwZVVkcCA9IDB4MDEsCisJa0VwbFNkb1R5cGVBc25kID0gMHgwMiwKKwlrRXBsU2RvVHlwZVBkbyA9IDB4MDMKK30gdEVwbFNkb1R5cGU7CisKK3R5cGVkZWYgZW51bSB7CisJa0VwbFNkb1RyYW5zQXV0byA9IDB4MDAsCisJa0VwbFNkb1RyYW5zRXhwZWRpdGVkID0gMHgwMSwKKwlrRXBsU2RvVHJhbnNTZWdtZW50ZWQgPSAweDAyCit9IHRFcGxTZG9UcmFuc1R5cGU7CisKKy8vIHN0cnVjdHVyZSB0byBpbmZvcm0gYXBwbGljYXRpb24gYWJvdXQgZmluaXNoIG9mIFNETyB0cmFuc2ZlcgordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxTZG9Db21Db25IZGwgbV9TZG9Db21Db25IZGw7CisJdEVwbFNkb0NvbUNvblN0YXRlIG1fU2RvQ29tQ29uU3RhdGU7CisJRFdPUkQgbV9kd0Fib3J0Q29kZTsKKwl0RXBsU2RvQWNjZXNzVHlwZSBtX1Nkb0FjY2Vzc1R5cGU7CisJdW5zaWduZWQgaW50IG1fdWlOb2RlSWQ7CS8vIE5vZGVJZCBvZiB0aGUgdGFyZ2V0CisJdW5zaWduZWQgaW50IG1fdWlUYXJnZXRJbmRleDsJLy8gaW5kZXggd2hpY2ggd2FzIGFjY2Vzc2VkCisJdW5zaWduZWQgaW50IG1fdWlUYXJnZXRTdWJJbmRleDsJLy8gc3ViaW5kZXggd2hpY2ggd2FzIGFjY2Vzc2VkCisJdW5zaWduZWQgaW50IG1fdWlUcmFuc2ZlcnJlZEJ5dGU7CS8vIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZAorCXZvaWQgKm1fcFVzZXJBcmc7CS8vIHVzZXIgZGVmaW5hYmxlIGFyZ3VtZW50IHBvaW50ZXIKKworfSB0RXBsU2RvQ29tRmluaXNoZWQ7CisKKy8vIGNhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXIgdG8gaW5mb3JtIGFwcGxpY2F0aW9uIGFib3V0IGNvbm5lY3Rpb24KK3R5cGVkZWYgdEVwbEtlcm5lbChQVUJMSUMgKiB0RXBsU2RvRmluaXNoZWRDYikgKHRFcGxTZG9Db21GaW5pc2hlZCAqCisJCQkJCQlwU2RvQ29tRmluaXNoZWRfcCk7CisKKy8vIHN0cnVjdHVyZSB0byBpbml0IFNETyB0cmFuc2ZlciB0byBSZWFkIG9yIFdyaXRlIGJ5IEluZGV4Cit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbFNkb0NvbUNvbkhkbCBtX1Nkb0NvbUNvbkhkbDsKKwl1bnNpZ25lZCBpbnQgbV91aUluZGV4OworCXVuc2lnbmVkIGludCBtX3VpU3ViaW5kZXg7CisJdm9pZCAqbV9wRGF0YTsKKwl1bnNpZ25lZCBpbnQgbV91aURhdGFTaXplOworCXVuc2lnbmVkIGludCBtX3VpVGltZW91dDsJLy8gbm90IHVzZWQgaW4gdGhpcyB2ZXJzaW9uCisJdEVwbFNkb0FjY2Vzc1R5cGUgbV9TZG9BY2Nlc3NUeXBlOworCXRFcGxTZG9GaW5pc2hlZENiIG1fcGZuU2RvRmluaXNoZWRDYjsKKwl2b2lkICptX3BVc2VyQXJnOwkvLyB1c2VyIGRlZmluYWJsZSBhcmd1bWVudCBwb2ludGVyCisKK30gdEVwbFNkb0NvbVRyYW5zUGFyYW1CeUluZGV4OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTFNET19IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxTZG9BYy5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxTZG9BYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMGZiMzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFNkb0FjLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBkZWZpbml0aW9ucyBmb3IgU0RPIEFib3J0IGNvZGVzCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsU2RvQWMuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgLi4uCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8zMCBrLnQuOiBmaXJzdCBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExTRE9BQ19IXworI2RlZmluZSBfRVBMU0RPQUNfSF8KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gU0RPIGFib3J0IGNvZGVzCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNkZWZpbmUgICAgRVBMX1NET0FDX1RJTUVfT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUwNDAwMDBMCisjZGVmaW5lICAgIEVQTF9TRE9BQ19VTktOT1dOX0NPTU1BTkRfU1BFQ0lGSUVSICAgICAgICAgICAweDA1MDQwMDAxTAorI2RlZmluZSAgICBFUExfU0RPQUNfSU5WQUxJRF9CTE9DS19TSVpFICAgICAgICAgICAgICAgICAgMHgwNTA0MDAwMkwKKyNkZWZpbmUgICAgRVBMX1NET0FDX0lOVkFMSURfU0VRVUVOQ0VfTlVNQkVSICAgICAgICAgICAgIDB4MDUwNDAwMDNMCisjZGVmaW5lICAgIEVQTF9TRE9BQ19PVVRfT0ZfTUVNT1JZICAgICAgICAgICAgICAgICAgICAgICAweDA1MDQwMDA1TAorI2RlZmluZSAgICBFUExfU0RPQUNfVU5TVVBQT1JURURfQUNDRVNTICAgICAgICAgICAgICAgICAgMHgwNjAxMDAwMEwKKyNkZWZpbmUgICAgRVBMX1NET0FDX1JFQURfVE9fV1JJVEVfT05MWV9PQkogICAgICAgICAgICAgIDB4MDYwMTAwMDFMCisjZGVmaW5lICAgIEVQTF9TRE9BQ19XUklURV9UT19SRUFEX09OTFlfT0JKICAgICAgICAgICAgICAweDA2MDEwMDAyTAorI2RlZmluZSAgICBFUExfU0RPQUNfT0JKRUNUX05PVF9FWElTVCAgICAgICAgICAgICAgICAgICAgMHgwNjAyMDAwMEwKKyNkZWZpbmUgICAgRVBMX1NET0FDX09CSkVDVF9OT1RfTUFQUEFCTEUgICAgICAgICAgICAgICAgIDB4MDYwNDAwNDFMCisjZGVmaW5lICAgIEVQTF9TRE9BQ19QRE9fTEVOR1RIX0VYQ0VFREVEICAgICAgICAgICAgICAgICAweDA2MDQwMDQyTAorI2RlZmluZSAgICBFUExfU0RPQUNfR0VOX1BBUkFNX0lOQ09NUEFUSUJJTElUWSAgICAgICAgICAgMHgwNjA0MDA0M0wKKyNkZWZpbmUgICAgRVBMX1NET0FDX0lOVkFMSURfSEVBUlRCRUFUX0RFQyAgICAgICAgICAgICAgIDB4MDYwNDAwNDRMCisjZGVmaW5lICAgIEVQTF9TRE9BQ19HRU5fSU5URVJOQUxfSU5DT01QQVRJQklMSVRZICAgICAgICAweDA2MDQwMDQ3TAorI2RlZmluZSAgICBFUExfU0RPQUNfQUNDRVNTX0ZBSUxFRF9EVUVfSFdfRVJST1IgICAgICAgICAgMHgwNjA2MDAwMEwKKyNkZWZpbmUgICAgRVBMX1NET0FDX0RBVEFfVFlQRV9MRU5HVEhfTk9UX01BVENIICAgICAgICAgIDB4MDYwNzAwMTBMCisjZGVmaW5lICAgIEVQTF9TRE9BQ19EQVRBX1RZUEVfTEVOR1RIX1RPT19ISUdIICAgICAgICAgICAweDA2MDcwMDEyTAorI2RlZmluZSAgICBFUExfU0RPQUNfREFUQV9UWVBFX0xFTkdUSF9UT09fTE9XICAgICAgICAgICAgMHgwNjA3MDAxM0wKKyNkZWZpbmUgICAgRVBMX1NET0FDX1NVQl9JTkRFWF9OT1RfRVhJU1QgICAgICAgICAgICAgICAgIDB4MDYwOTAwMTFMCisjZGVmaW5lICAgIEVQTF9TRE9BQ19WQUxVRV9SQU5HRV9FWENFRURFRCAgICAgICAgICAgICAgICAweDA2MDkwMDMwTAorI2RlZmluZSAgICBFUExfU0RPQUNfVkFMVUVfUkFOR0VfVE9PX0hJR0ggICAgICAgICAgICAgICAgMHgwNjA5MDAzMUwKKyNkZWZpbmUgICAgRVBMX1NET0FDX1ZBTFVFX1JBTkdFX1RPT19MT1cgICAgICAgICAgICAgICAgIDB4MDYwOTAwMzJMCisjZGVmaW5lICAgIEVQTF9TRE9BQ19NQVhfVkFMVUVfTEVTU19NSU5fVkFMVUUgICAgICAgICAgICAweDA2MDkwMDM2TAorI2RlZmluZSAgICBFUExfU0RPQUNfR0VORVJBTF9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwMDAwMEwKKyNkZWZpbmUgICAgRVBMX1NET0FDX0RBVEFfTk9UX1RSQU5TRl9PUl9TVE9SRUQgICAgICAgICAgIDB4MDgwMDAwMjBMCisjZGVmaW5lICAgIEVQTF9TRE9BQ19EQVRBX05PVF9UUkFOU0ZfRFVFX0xPQ0FMX0NPTlRST0wgICAweDA4MDAwMDIxTAorI2RlZmluZSAgICBFUExfU0RPQUNfREFUQV9OT1RfVFJBTlNGX0RVRV9ERVZJQ0VfU1RBVEUgICAgMHgwODAwMDAyMkwKKyNkZWZpbmUgICAgRVBMX1NET0FDX09CSkVDVF9ESUNUSU9OQVJZX05PVF9FWElTVCAgICAgICAgIDB4MDgwMDAwMjNMCisjZGVmaW5lICAgIEVQTF9TRE9BQ19DT05GSUdfREFUQV9FTVBUWSAgICAgICAgICAgICAgICAgICAweDA4MDAwMDI0TAorCisjZW5kaWYgLy8gX0VQTFNET0FDX0hfCisKKy8vIERpZSBsZXR6dGUgWmVpbGUgbXXfIHVuYmVkaW5ndCBlaW5lIGxlZXJlIFplaWxlIHNlaW4sIHdlaWwgbWFuY2hlIENvbXBpbGVyCisvLyBkYW1pdCBlaW4gUHJvYmxlbSBoYWJlbiwgd2VubiBkYXMgbmljaHQgc28gaXN0ICh6LkIuIEdOVSBvZGVyIEJvcmxhbmQgQysrIEJ1aWxkZXIpLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxTZG9Bc25kdS5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxTZG9Bc25kdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YTAwYzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFNkb0FzbmR1LmMKQEAgLTAsMCArMSw0ODMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgU0RPL0FzbmQtUHJvdG9jb2xhYnN0cmFjdGlvbmxheWVyIG1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbFNkb0FzbmR1LmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjcgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNy8wNyBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAidXNlci9FcGxTZG9Bc25kdS5oIgorI2luY2x1ZGUgInVzZXIvRXBsRGxsdUNhbC5oIgorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19BU05EKSkgIT0gMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZm5kZWYgRVBMX1NET19NQVhfQ09OTkVDVElPTl9BU05ECisjZGVmaW5lIEVQTF9TRE9fTUFYX0NPTk5FQ1RJT05fQVNORCA1CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBpbnN0YW5jZSB0YWJsZQordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBtX2F1aVNkb0FzbmRDb25uZWN0aW9uW0VQTF9TRE9fTUFYX0NPTk5FQ1RJT05fQVNORF07CisJdEVwbFNlcXVMYXllclJlY2VpdmVDYiBtX2ZwU2RvQXN5U2VxQ2I7CisKK30gdEVwbFNkb0FzbmRJbnN0YW5jZTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxTZG9Bc25kSW5zdGFuY2UgU2RvQXNuZEluc3RhbmNlX2c7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc25kdUNiKHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3ApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBDIEwgQSBTIFMgIDxFUEwgU0RPLUFzbmQgUHJvdG9jb2xhYnN0cmFjdGlvbiBsYXllcj4gICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKy8vIERlc2NyaXB0aW9uOiBFUEwgU0RPLUFzbmQgUHJvdG9jb2xhYnN0cmFjdGlvbiBsYXllcgorLy8KKy8vCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQXNuZHVJbml0CisvLworLy8gRGVzY3JpcHRpb246IGluaXQgZmlyc3QgaW5zdGFuY2Ugb2YgdGhlIG1vZHVsZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHBSZWNlaXZlQ2JfcCAgICA9ICAgZnVuY3Rpb25wb2ludGVyIHRvIFNkby1TZXF1ZW5jZSBsYXllcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2stZnVuY3Rpb24KKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gRXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc25kdUluaXQodEVwbFNlcXVMYXllclJlY2VpdmVDYiBmcFJlY2VpdmVDYl9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0gRXBsU2RvQXNuZHVBZGRJbnN0YW5jZShmcFJlY2VpdmVDYl9wKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb0FzbmR1QWRkSW5zdGFuY2UKKy8vCisvLyBEZXNjcmlwdGlvbjogaW5pdCBhZGRpdGlvbmFsIGluc3RhbmNlIG9mIHRoZSBtb2R1bGUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwUmVjZWl2ZUNiX3AgICAgPSAgIGZ1bmN0aW9ucG9pbnRlciB0byBTZG8tU2VxdWVuY2UgbGF5ZXIKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLWZ1bmN0aW9uCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXNuZHVBZGRJbnN0YW5jZSh0RXBsU2VxdUxheWVyUmVjZWl2ZUNiIGZwUmVjZWl2ZUNiX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGluaXQgY29udHJvbCBzdHJ1Y3R1cmUKKwlFUExfTUVNU0VUKCZTZG9Bc25kSW5zdGFuY2VfZywgMHgwMCwgc2l6ZW9mKFNkb0FzbmRJbnN0YW5jZV9nKSk7CisKKwkvLyBzYXZlIHBvaW50ZXIgdG8gY2FsbGJhY2stZnVuY3Rpb24KKwlpZiAoZnBSZWNlaXZlQ2JfcCAhPSBOVUxMKSB7CisJCVNkb0FzbmRJbnN0YW5jZV9nLm1fZnBTZG9Bc3lTZXFDYiA9IGZwUmVjZWl2ZUNiX3A7CisJfSBlbHNlIHsKKwkJUmV0ID0ga0VwbFNkb1VkcE1pc3NDYjsKKwl9CisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMVSkpICE9IDApCisJUmV0ID0gRXBsRGxsdUNhbFJlZ0FzbmRTZXJ2aWNlKGtFcGxEbGxBc25kU2RvLAorCQkJCSAgICAgICBFcGxTZG9Bc25kdUNiLCBrRXBsRGxsQXNuZEZpbHRlckxvY2FsKTsKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQXNuZHVEZWxJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBkZWwgaW5zdGFuY2Ugb2YgdGhlIG1vZHVsZQorLy8gICAgICAgICAgICAgIGRlbCBzb2NrZXQgYW5kIGRlbCBMaXN0ZW4tVGhyZWFkCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBFcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzbmR1RGVsSW5zdGFuY2UoKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMVSkpICE9IDApCisJLy8gZGVyZWdpc3RlciBjYWxsYmFjayBmdW5jdGlvbiBmcm9tIERMTAorCVJldCA9IEVwbERsbHVDYWxSZWdBc25kU2VydmljZShrRXBsRGxsQXNuZFNkbywKKwkJCQkgICAgICAgTlVMTCwga0VwbERsbEFzbmRGaWx0ZXJOb25lKTsKKyNlbmRpZgorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQXNuZHVJbml0Q29uCisvLworLy8gRGVzY3JpcHRpb246IGluaXQgYSBuZXcgY29ubmVjdAorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHBTZG9Db25IYW5kbGVfcCA9IHBvaW50ZXIgZm9yIHRoZSBuZXcgY29ubmVjdGlvbiBoYW5kbGUKKy8vICAgICAgICAgICAgICB1aVRhcmdldE5vZGVJZF9wID0gTm9kZUlkIG9mIHRoZSB0YXJnZXQgbm9kZQorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBFcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzbmR1SW5pdENvbih0RXBsU2RvQ29uSGRsICogcFNkb0NvbkhhbmRsZV9wLAorCQkJCSAgICAgdW5zaWduZWQgaW50IHVpVGFyZ2V0Tm9kZUlkX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdW5zaWduZWQgaW50IHVpQ291bnQ7CisJdW5zaWduZWQgaW50IHVpRnJlZUNvbjsKKwl1bnNpZ25lZCBpbnQgKnB1aUNvbm5lY3Rpb247CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCWlmICgodWlUYXJnZXROb2RlSWRfcCA9PSBFUExfQ19BRFJfSU5WQUxJRCkKKwkgICAgfHwgKHVpVGFyZ2V0Tm9kZUlkX3AgPj0gRVBMX0NfQURSX0JST0FEQ0FTVCkpIHsKKwkJUmV0ID0ga0VwbFNkb0FzbmRJbnZhbGlkTm9kZUlkOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGdldCBmcmVlIGVudHJ5IGluIGNvbnRyb2wgc3RydWN0dXJlCisJdWlDb3VudCA9IDA7CisJdWlGcmVlQ29uID0gRVBMX1NET19NQVhfQ09OTkVDVElPTl9BU05EOworCXB1aUNvbm5lY3Rpb24gPSAmU2RvQXNuZEluc3RhbmNlX2cubV9hdWlTZG9Bc25kQ29ubmVjdGlvblswXTsKKwl3aGlsZSAodWlDb3VudCA8IEVQTF9TRE9fTUFYX0NPTk5FQ1RJT05fQVNORCkgeworCQlpZiAoKnB1aUNvbm5lY3Rpb24gPT0gdWlUYXJnZXROb2RlSWRfcCkgewkvLyBleGlzdGluZyBjb25uZWN0aW9uIHRvIHRhcmdldCBub2RlIGZvdW5kCisJCQkvLyBzYXZlIGhhbmRsZSBmb3IgaGlnaGVyIGxheWVyCisJCQkqcFNkb0NvbkhhbmRsZV9wID0gKHVpQ291bnQgfCBFUExfU0RPX0FTTkRfSEFORExFKTsKKworCQkJZ290byBFeGl0OworCQl9IGVsc2UgaWYgKCpwdWlDb25uZWN0aW9uID09IDApIHsJLy8gZnJlZSBlbnRyeS0+IHNhdmUgdGFyZ2V0IG5vZGVJZAorCQkJdWlGcmVlQ29uID0gdWlDb3VudDsKKwkJfQorCQl1aUNvdW50Kys7CisJCXB1aUNvbm5lY3Rpb24rKzsKKwl9CisKKwlpZiAodWlGcmVlQ29uID09IEVQTF9TRE9fTUFYX0NPTk5FQ1RJT05fQVNORCkgeworCQkvLyBubyBmcmVlIGNvbm5lY3Rpb24KKwkJUmV0ID0ga0VwbFNkb0FzbmROb0ZyZWVIYW5kbGU7CisJfSBlbHNlIHsKKwkJcHVpQ29ubmVjdGlvbiA9CisJCSAgICAmU2RvQXNuZEluc3RhbmNlX2cubV9hdWlTZG9Bc25kQ29ubmVjdGlvblt1aUZyZWVDb25dOworCQkqcHVpQ29ubmVjdGlvbiA9IHVpVGFyZ2V0Tm9kZUlkX3A7CisJCS8vIHNhdmUgaGFuZGxlIGZvciBoaWdoZXIgbGF5ZXIKKwkJKnBTZG9Db25IYW5kbGVfcCA9ICh1aUZyZWVDb24gfCBFUExfU0RPX0FTTkRfSEFORExFKTsKKworCQlnb3RvIEV4aXQ7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb0FzbmR1U2VuZERhdGEKKy8vCisvLyBEZXNjcmlwdGlvbjogc2VuZCBkYXRhIHVzaW5nIGV4aXNpdGluZyBjb25uZWN0aW9uCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgU2RvQ29uSGFuZGxlX3AgID0gY29ubmVjdGlvbiBoYW5kbGUKKy8vICAgICAgICAgICAgICBwU3JjRGF0YV9wICAgICAgPSBwb2ludGVyIHRvIGRhdGEKKy8vICAgICAgICAgICAgICBkd0RhdGFTaXplX3AgICAgPSBudW1iZXIgb2YgZGF0YWJ5dGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IHdpdGhvdXQgYXNuZC1oZWFkZXIhISEKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBFcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzbmR1U2VuZERhdGEodEVwbFNkb0NvbkhkbCBTZG9Db25IYW5kbGVfcCwKKwkJCQkgICAgICB0RXBsRnJhbWUgKiBwU3JjRGF0YV9wLAorCQkJCSAgICAgIERXT1JEIGR3RGF0YVNpemVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl1bnNpZ25lZCBpbnQgdWlBcnJheTsKKwl0RXBsRnJhbWVJbmZvIEZyYW1lSW5mbzsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJdWlBcnJheSA9IChTZG9Db25IYW5kbGVfcCAmIH5FUExfU0RPX0FTWV9IQU5ETEVfTUFTSyk7CisKKwlpZiAodWlBcnJheSA+IEVQTF9TRE9fTUFYX0NPTk5FQ1RJT05fQVNORCkgeworCQlSZXQgPSBrRXBsU2RvQXNuZEludmFsaWRIYW5kbGU7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZmlsbG91dCBBc25kIGhlYWRlcgorCS8vIG93biBub2RlIGlkIG5vdCBuZWVkZWQgLT4gZmlsbGVkIGJ5IERMTAorCisJLy8gc2V0IG1lc3NhZ2UgdHlwZQorCUFtaVNldEJ5dGVUb0xlKCZwU3JjRGF0YV9wLT5tX2xlX2JNZXNzYWdlVHlwZSwgKEJZVEUpIGtFcGxNc2dUeXBlQXNuZCk7CS8vIEFTbmQgPT0gMHgwNgorCS8vIHRhcmdldCBub2RlIGlkCisJQW1pU2V0Qnl0ZVRvTGUoJnBTcmNEYXRhX3AtPm1fbGVfYkRzdE5vZGVJZCwKKwkJICAgICAgIChCWVRFKSBTZG9Bc25kSW5zdGFuY2VfZy4KKwkJICAgICAgIG1fYXVpU2RvQXNuZENvbm5lY3Rpb25bdWlBcnJheV0pOworCS8vIHNldCBzb3VyY2Utbm9kZWlkIChmaWxsZWQgYnkgRExMIDApCisJQW1pU2V0Qnl0ZVRvTGUoJnBTcmNEYXRhX3AtPm1fbGVfYlNyY05vZGVJZCwgMHgwMCk7CisKKwkvLyBjYWxjIHNpemUKKwlkd0RhdGFTaXplX3AgKz0gRVBMX0FTTkRfSEVBREVSX1NJWkU7CisKKwkvLyBzZW5kIGZ1bmN0aW9uIG9mIERMTAorCUZyYW1lSW5mby5tX3VpRnJhbWVTaXplID0gZHdEYXRhU2l6ZV9wOworCUZyYW1lSW5mby5tX3BGcmFtZSA9IHBTcmNEYXRhX3A7CisJRVBMX01FTVNFVCgmRnJhbWVJbmZvLm1fTmV0VGltZSwgMHgwMCwgc2l6ZW9mKHRFcGxOZXRUaW1lKSk7CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTFUpKSAhPSAwKQorCVJldCA9IEVwbERsbHVDYWxBc3luY1NlbmQoJkZyYW1lSW5mbywga0VwbERsbEFzeW5jUmVxUHJpb0dlbmVyaWMpOworI2VuZGlmCisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9Bc25kdURlbENvbgorLy8KKy8vIERlc2NyaXB0aW9uOiBkZWxldGUgY29ubmVjdGlvbiBmcm9tIGludGVybiBzdHJ1Y3R1cmUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBTZG9Db25IYW5kbGVfcCAgPSBjb25uZWN0aW9uIGhhbmRsZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXNuZHVEZWxDb24odEVwbFNkb0NvbkhkbCBTZG9Db25IYW5kbGVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl1bnNpZ25lZCBpbnQgdWlBcnJheTsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJdWlBcnJheSA9IChTZG9Db25IYW5kbGVfcCAmIH5FUExfU0RPX0FTWV9IQU5ETEVfTUFTSyk7CisJLy8gY2hlY2sgcGFyYW1ldGVyCisJaWYgKHVpQXJyYXkgPiBFUExfU0RPX01BWF9DT05ORUNUSU9OX0FTTkQpIHsKKwkJUmV0ID0ga0VwbFNkb0FzbmRJbnZhbGlkSGFuZGxlOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIHNldCB0YXJnZXQgbm9kZUlkIHRvIDAKKwlTZG9Bc25kSW5zdGFuY2VfZy5tX2F1aVNkb0FzbmRDb25uZWN0aW9uW3VpQXJyYXldID0gMDsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQXNuZHVDYgorLy8KKy8vIERlc2NyaXB0aW9uOiBjYWxsYmFjayBmdW5jdGlvbiBmb3IgU0RPIEFTbmQgZnJhbWVzCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgICAgIHBGcmFtZUluZm9fcCA9IEZyYW1lIHdpdGggU0RPIHBheWxvYWQKKy8vCisvLworLy8gUmV0dXJuczogICAgICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc25kdUNiKHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl1bnNpZ25lZCBpbnQgdWlDb3VudDsKKwl1bnNpZ25lZCBpbnQgKnB1aUNvbm5lY3Rpb247CisJdW5zaWduZWQgaW50IHVpTm9kZUlkOworCXVuc2lnbmVkIGludCB1aUZyZWVFbnRyeSA9IDB4RkZGRjsKKwl0RXBsU2RvQ29uSGRsIFNkb0NvbkhkbDsKKwl0RXBsRnJhbWUgKnBGcmFtZTsKKworCXBGcmFtZSA9IHBGcmFtZUluZm9fcC0+bV9wRnJhbWU7CisKKwl1aU5vZGVJZCA9IEFtaUdldEJ5dGVGcm9tTGUoJnBGcmFtZS0+bV9sZV9iU3JjTm9kZUlkKTsKKworCS8vIHNlYXJjaCBjb3JyZXNwb25kaW5nIGVudHJ5IGluIGNvbnRyb2wgc3RydWN0dXJlCisJdWlDb3VudCA9IDA7CisJcHVpQ29ubmVjdGlvbiA9ICZTZG9Bc25kSW5zdGFuY2VfZy5tX2F1aVNkb0FzbmRDb25uZWN0aW9uWzBdOworCXdoaWxlICh1aUNvdW50IDwgRVBMX1NET19NQVhfQ09OTkVDVElPTl9BU05EKSB7CisJCWlmICh1aU5vZGVJZCA9PSAqcHVpQ29ubmVjdGlvbikgeworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoKCpwdWlDb25uZWN0aW9uID09IDApCisJCQkgICAmJiAodWlGcmVlRW50cnkgPT0gMHhGRkZGKSkgewkvLyBmcmVlIGVudHJ5CisJCQl1aUZyZWVFbnRyeSA9IHVpQ291bnQ7CisJCX0KKwkJdWlDb3VudCsrOworCQlwdWlDb25uZWN0aW9uKys7CisJfQorCisJaWYgKHVpQ291bnQgPT0gRVBMX1NET19NQVhfQ09OTkVDVElPTl9BU05EKSB7CisJCWlmICh1aUZyZWVFbnRyeSAhPSAweEZGRkYpIHsKKwkJCXB1aUNvbm5lY3Rpb24gPQorCQkJICAgICZTZG9Bc25kSW5zdGFuY2VfZy4KKwkJCSAgICBtX2F1aVNkb0FzbmRDb25uZWN0aW9uW3VpRnJlZUVudHJ5XTsKKwkJCSpwdWlDb25uZWN0aW9uID0gdWlOb2RlSWQ7CisJCQl1aUNvdW50ID0gdWlGcmVlRW50cnk7CisJCX0gZWxzZSB7CisJCQlFUExfREJHTFZMX1NET19UUkFDRTAKKwkJCSAgICAoIkVwbFNkb0FzbmR1Q2IoKTogbm8gZnJlZSBoYW5kbGVcbiIpOworCQkJZ290byBFeGl0OworCQl9CisJfQorLy8gICAgaWYgKHVpTm9kZUlkID09ICpwdWlDb25uZWN0aW9uKQorCXsJCQkvLyBlbnRyeSBmb3VuZCBvciBjcmVhdGVkCisJCVNkb0NvbkhkbCA9ICh1aUNvdW50IHwgRVBMX1NET19BU05EX0hBTkRMRSk7CisKKwkJU2RvQXNuZEluc3RhbmNlX2cubV9mcFNkb0FzeVNlcUNiKFNkb0NvbkhkbCwKKwkJCQkJCSAgJnBGcmFtZS0+bV9EYXRhLm1fQXNuZC4KKwkJCQkJCSAgbV9QYXlsb2FkLm1fU2RvU2VxdWVuY2VGcmFtZSwKKwkJCQkJCSAgKHBGcmFtZUluZm9fcC0+bV91aUZyYW1lU2l6ZSAtCisJCQkJCQkgICAxOCkpOworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworCit9CisKKyNlbmRpZiAvLyBlbmQgb2YgI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9fQVNORCkpICE9IDApCisvLyBFT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsU2RvQXN5U2VxdS5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxTZG9Bc3lTZXF1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI2YTk5NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsU2RvQXN5U2VxdS5jCkBAIC0wLDAgKzEsMjUyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBhc3ljaHJvbm91cyBTRE8gU2VxdWVuY2UgTGF5ZXIgbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsU2RvQXN5U2VxdS5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4xMCAkICAkRGF0ZTogMjAwOC8xMS8xMyAxNzoxMzowOSAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzI2IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ1c2VyL0VwbFNkb0FzeVNlcXUuaCIKKworI2lmICgoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19VRFApKSA9PSAwKSAmJlwKKyAgICAgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9fQVNORCkpID09IDApICAgKQorCisjZXJyb3IgJ0VSUk9SOiBBdCBsZWFzdCBVRFAgb3IgQXNuZCBtb2R1bGUgbmVlZGVkIScKKworI2VuZGlmCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBFUExfU0RPX0hJU1RPUllfU0laRSAgICAgICAgNQorCisjaWZuZGVmIEVQTF9NQVhfU0RPX1NFUV9DT04KKyNkZWZpbmUgRVBMX01BWF9TRE9fU0VRX0NPTiAgICAgICAgIDEwCisjZW5kaWYKKworI2RlZmluZSBFUExfU0VRX0RFRkFVTFRfVElNRU9VVCAgICAgNTAwMAkvLyBpbiBbbXNdID0+IDUgc2VjCisKKyNkZWZpbmUgRVBMX1NFUV9SRVRSWV9DT1VOVCAgICAgICAgIDUJLy8gPT4gbWF4LiBUaW1lb3V0IDMwIHNlYworCisjZGVmaW5lIEVQTF9TRVFfTlVNX1RIUkVTSE9MRCAgICAgICAxMDAJLy8gdGhyZXNob2xkIHdoaWNoIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiBvbGQgYW5kIG5ldyBzZXF1ZW5jZSBudW1iZXJzCisKKy8vIGRlZmluZSBmcmFtZSB3aXRoIHNpemUgb2YgQXNuZC1IZWFkZXItLCBTRE8gU2VxdWVuemUgSGVhZGVyIHNpemUsIFNETyBDb21tYW5kIGhlYWRlcgorLy8gYW5kIEV0aGVybmV0LUhlYWRlciBzaXplCisjZGVmaW5lIEVQTF9TRVFfRlJBTUVfU0laRSAgICAgICAgICAyNAorLy8gc2l6ZSBvZiB0aGUgaGVhZGVyIG9mIHRoZSBhc3luY2hyb251cyBTRE8gU2VxdWVuY2UgbGF5ZXIKKyNkZWZpbmUgRVBMX1NFUV9IRUFERVJfU0laRSAgICAgICAgIDQKKworLy8gYnVmZmVyc2l6ZSBmb3Igb25lIGZyYW1lIGluIGhpc3RvcnkKKyNkZWZpbmUgRVBMX1NFUV9ISVNUUk9ZX0ZSQU1FX1NJWkUgIEVQTF9NQVhfU0RPX0ZSQU1FX1NJWkUKKworLy8gbWFzayB0byBnZXQgc2NvbiBhbmQgcmNvbgorI2RlZmluZSBFUExfQVNZX1NET19DT05fTUFTSyAgICAgICAgMHgwMworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIGV2ZW50cyBmb3IgcHJvY2Vzc2Z1bmN0aW9uCit0eXBlZGVmIGVudW0geworCWtBc3lTZG9TZXFFdmVudE5vRXZlbnQgPSAweDAwLAkvLyBubyBFdmVudAorCWtBc3lTZG9TZXFFdmVudEluaXRDb24gPSAweDAxLAkvLyBpbml0IGNvbm5lY3Rpb24KKwlrQXN5U2RvU2VxRXZlbnRGcmFtZVJlYyA9IDB4MDIsCS8vIGZyYW1lIHJlY2VpdmVkCisJa0FzeVNkb1NlcUV2ZW50RnJhbWVTZW5kID0gMHgwMywJLy8gZnJhbWUgdG8gc2VuZAorCWtBc3lTZG9TZXFFdmVudFRpbWVvdXQgPSAweDA0LAkvLyBUaW1lb3V0IGZvciBjb25uZWN0aW9uCisJa0FzeVNkb1NlcUV2ZW50Q2xvc2VDb24gPSAweDA1CS8vIGhpZ2hlciBsYXllciBjbG9zZSBjb25uZWN0aW9uCit9IHRFcGxBc3lTZG9TZXFFdmVudDsKKworLy8gc3RydWN0dXJlIGZvciBIaXN0b3J5LUJ1ZmZlcgordHlwZWRlZiBzdHJ1Y3QgeworCUJZVEUgbV9iRnJlZUVudHJpZXM7CisJQllURSBtX2JXcml0ZTsJCS8vIGluZGV4IG9mIHRoZSBuZXh0IGZyZWUgYnVmZmVyIGVudHJ5CisJQllURSBtX2JBY2s7CQkvLyBpbmRleCBvZiB0aGUgbmV4dCBtZXNzYWdlIHdoaWNoIHNob3VsZCBiZWNvbWUgYWNrbm93bGVkZ2VkCisJQllURSBtX2JSZWFkOwkJLy8gaW5kZXggYmV0d2VlbiBtX2JBY2sgYW5kIG1fYldyaXRlIHRvIHRoZSBuZXh0IG1lc3NhZ2UgZm9yIHJldHJhbnNtaXNzaW9uCisJQllURSBtX2FhYkhpc3RvcnlGcmFtZVtFUExfU0RPX0hJU1RPUllfU0laRV0KKwkgICAgW0VQTF9TRVFfSElTVFJPWV9GUkFNRV9TSVpFXTsKKwl1bnNpZ25lZCBpbnQgbV9hdWlGcmFtZVNpemVbRVBMX1NET19ISVNUT1JZX1NJWkVdOworCit9IHRFcGxBc3lTZG9Db25IaXN0b3J5OworCisvLyBzdGF0ZSBvZiB0aGUgc3RhdGVtYXNjaGluZQordHlwZWRlZiBlbnVtIHsKKwlrRXBsQXN5U2RvU3RhdGVJZGxlID0gMHgwMCwKKwlrRXBsQXN5U2RvU3RhdGVJbml0MSA9IDB4MDEsCisJa0VwbEFzeVNkb1N0YXRlSW5pdDIgPSAweDAyLAorCWtFcGxBc3lTZG9TdGF0ZUluaXQzID0gMHgwMywKKwlrRXBsQXN5U2RvU3RhdGVDb25uZWN0ZWQgPSAweDA0LAorCWtFcGxBc3lTZG9TdGF0ZVdhaXRBY2sgPSAweDA1Cit9IHRFcGxBc3lTZG9TdGF0ZTsKKworLy8gY29ubmVjdGlvbiBjb250cm9sIHN0cnVjdHVyZQordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxTZG9Db25IZGwgbV9Db25IYW5kbGU7CisJdEVwbEFzeVNkb1N0YXRlIG1fU2RvU3RhdGU7CisJQllURSBtX2JSZWNTZXFOdW07CS8vIG5hbWUgZnJvbSB2aWV3IG9mIHRoZSBjb21tdW5pY2F0aW9uIHBhcnRuZXIKKwlCWVRFIG1fYlNlbmRTZXFOdW07CS8vIG5hbWUgZnJvbSB2aWV3IG9mIHRoZSBjb21tdW5pY2F0aW9uIHBhcnRuZXIKKwl0RXBsQXN5U2RvQ29uSGlzdG9yeSBtX1Nkb0Nvbkhpc3Rvcnk7CisJdEVwbFRpbWVySGRsIG1fRXBsVGltZXJIZGw7CisJdW5zaWduZWQgaW50IG1fdWlSZXRyeUNvdW50OwkvLyByZXRyeSBjb3VudGVyCisJdW5zaWduZWQgaW50IG1fdWlVc2VDb3VudDsJLy8gb25lIHNlcXVlbmNlIGxheWVyIGNvbm5lY3Rpb24gbWF5IGJlIHVzZWQgYnkKKwkvLyBtdWx0aXBsZSBjb21tYW5kIGxheWVyIGNvbm5lY3Rpb25zCisKK30gdEVwbEFzeVNkb1NlcUNvbjsKKworLy8gaW5zdGFuY2Ugc3RydWN0dXJlCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbEFzeVNkb1NlcUNvbiBtX0FzeVNkb0Nvbm5lY3Rpb25bRVBMX01BWF9TRE9fU0VRX0NPTl07CisJdEVwbFNkb0NvbVJlY2VpdmVDYiBtX2ZwU2RvQ29tUmVjZWl2ZUNiOworCXRFcGxTZG9Db21Db25DYiBtX2ZwU2RvQ29tQ29uQ2I7CisKKyNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMikKKwlMUENSSVRJQ0FMX1NFQ1RJT04gbV9wQ3JpdGljYWxTZWN0aW9uOworCUNSSVRJQ0FMX1NFQ1RJT04gbV9Dcml0aWNhbFNlY3Rpb247CisKKwlMUENSSVRJQ0FMX1NFQ1RJT04gbV9wQ3JpdGljYWxTZWN0aW9uUmVjZWl2ZTsKKwlDUklUSUNBTF9TRUNUSU9OIG1fQ3JpdGljYWxTZWN0aW9uUmVjZWl2ZTsKKyNlbmRpZgorCit9IHRFcGxBc3lTZG9TZXF1SW5zdGFuY2U7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsQXN5U2RvU2VxdUluc3RhbmNlIEFzeVNkb1NlcXVJbnN0YW5jZV9nOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQXN5U2VxUHJvY2Vzcyh1bnNpZ25lZCBpbnQgdWlIYW5kbGVfcCwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgdWlEYXRhU2l6ZV9wLAorCQkJCSAgICAgIHRFcGxGcmFtZSAqIHBEYXRhX3AsCisJCQkJICAgICAgdEVwbEFzeVNkb1NlcSAqIHBSZWNGcmFtZV9wLAorCQkJCSAgICAgIHRFcGxBc3lTZG9TZXFFdmVudCBFdmVudF9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQXN5U2VxU2VuZEludGVybih0RXBsQXN5U2RvU2VxQ29uICogcEFzeVNkb1NlcUNvbl9wLAorCQkJCQkgdW5zaWduZWQgaW50IHVpRGF0YVNpemVfcCwKKwkJCQkJIHRFcGxGcmFtZSAqIHBEYXRhX3AsCisJCQkJCSBCT09MIGZGcmFtZUluSGlzdG9yeSk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0FzeVNlcVNlbmRMb3dlckxheWVyKHRFcGxBc3lTZG9TZXFDb24gKiBwQXN5U2RvU2VxQ29uX3AsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IHVpRGF0YVNpemVfcCwKKwkJCQkJICAgICB0RXBsRnJhbWUgKiBwRXBsRnJhbWVfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzeVJlY2VpdmVDYih0RXBsU2RvQ29uSGRsIENvbkhkbF9wLAorCQkJCSAgICAgdEVwbEFzeVNkb1NlcSAqIHBTZG9TZXFEYXRhX3AsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlEYXRhU2l6ZV9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQXN5SW5pdEhpc3Rvcnkodm9pZCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0FzeUFkZEZyYW1lVG9IaXN0b3J5KHRFcGxBc3lTZG9TZXFDb24gKiBwQXN5U2RvU2VxQ29uX3AsCisJCQkJCSAgICAgdEVwbEZyYW1lICogcEZyYW1lX3AsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IHVpU2l6ZV9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQXN5QWNrRnJhbWVUb0hpc3RvcnkodEVwbEFzeVNkb1NlcUNvbiAqIHBBc3lTZG9TZXFDb25fcCwKKwkJCQkJICAgICBCWVRFIGJSZWNTZXFOdW1iZXJfcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0FzeVJlYWRGcm9tSGlzdG9yeSh0RXBsQXN5U2RvU2VxQ29uICogcEFzeVNkb1NlcUNvbl9wLAorCQkJCQkgICB0RXBsRnJhbWUgKiogcHBGcmFtZV9wLAorCQkJCQkgICB1bnNpZ25lZCBpbnQgKnB1aVNpemVfcCwKKwkJCQkJICAgQk9PTCBmSW5pdFJlYWQpOworCitzdGF0aWMgdW5zaWduZWQgaW50IEVwbFNkb0FzeUdldEZyZWVFbnRyaWVzRnJvbUhpc3RvcnkodEVwbEFzeVNkb1NlcUNvbiAqCisJCQkJCQkgICAgICAgcEFzeVNkb1NlcUNvbl9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQXN5U2VxU2V0VGltZXIodEVwbEFzeVNkb1NlcUNvbiAqIHBBc3lTZG9TZXFDb25fcCwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB1bFRpbWVvdXQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBDIEwgQSBTIFMgIDxFUEwgYXN5Y2hyb251cyBTRE8gU2VxdWVuY2UgbGF5ZXI+ICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKy8vIERlc2NyaXB0aW9uOiB0aGlzIG1vZHVsZSBjb250YWlucyB0aGUgYXN5bmNocm9udXMgU0RPIFNlcXVlbmNlIExheWVyIGZvcgorLy8gICAgICAgICAgICAgIHRoZSBFUEwgU0RPIHNlcnZpY2UKKy8vCisvLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb0FzeVNlcUluaXQKKy8vCisvLyBEZXNjcmlwdGlvbjogaW5pdCBmaXJzdCBpbnN0YW5jZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIGZwU2RvQ29tQ2JfcCAgICA9IGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGluZm9ybSBDb21tYW5kIGxheWVyCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvdXQgbmV3IGZyYW1lcworLy8gICAgICAgICAgICAgIGZwU2RvQ29tQ29uQ2JfcCA9IGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGluZm9ybSBjb21tYW5kIGxheWVyCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvdXQgY29ubmVjdGlvbiBzdGF0ZQorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXN5U2VxSW5pdCh0RXBsU2RvQ29tUmVjZWl2ZUNiIGZwU2RvQ29tQ2JfcCwKKwkJCQkgICB0RXBsU2RvQ29tQ29uQ2IgZnBTZG9Db21Db25DYl9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0gRXBsU2RvQXN5U2VxQWRkSW5zdGFuY2UoZnBTZG9Db21DYl9wLCBmcFNkb0NvbUNvbkNiX3ApOworCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9Bc3lTZXFBZGRJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBpbml0IGZvbGxvd2luZyBpbnN0YW5jZXMKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBmcFNkb0NvbUNiX3AgICAgPSBjYWxsYmFjayBmdW5jdGlvbiB0byBpbmZvcm0gQ29tbWFuZCBsYXllcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3V0IG5ldyBmcmFtZXMKKy8vICAgICAgICAgICAgICBmcFNkb0NvbUNvbkNiX3AgPSBjYWxsYmFjayBmdW5jdGlvbiB0byBpbmZvcm0gY29tbWFuZCBsYXllcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3V0IGNvbm5lY3Rpb24gc3RhdGUKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXN5U2VxQWRkSW5zdGFuY2UodEVwbFNkb0NvbVJlY2VpdmVDYiBmcFNkb0NvbUNiX3AsCisJCQkJCSAgdEVwbFNkb0NvbUNvbkNiIGZwU2RvQ29tQ29uQ2JfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gY2hlY2sgZnVuY3Rpb25wb2ludGVyCisJaWYgKGZwU2RvQ29tQ2JfcCA9PSBOVUxMKSB7CisJCVJldCA9IGtFcGxTZG9TZXFNaXNzQ2I7CisJCWdvdG8gRXhpdDsKKwl9IGVsc2UgeworCQlBc3lTZG9TZXF1SW5zdGFuY2VfZy5tX2ZwU2RvQ29tUmVjZWl2ZUNiID0gZnBTZG9Db21DYl9wOworCX0KKworCS8vIGNoZWNrIGZ1bmN0aW9ucG9pbnRlcgorCWlmIChmcFNkb0NvbUNvbkNiX3AgPT0gTlVMTCkgeworCQlSZXQgPSBrRXBsU2RvU2VxTWlzc0NiOworCQlnb3RvIEV4aXQ7CisJfSBlbHNlIHsKKwkJQXN5U2RvU2VxdUluc3RhbmNlX2cubV9mcFNkb0NvbUNvbkNiID0gZnBTZG9Db21Db25DYl9wOworCX0KKworCS8vIHNldCBjb250cm9sbHN0cnVjdHVyZSB0byAwCisJRVBMX01FTVNFVCgmQXN5U2RvU2VxdUluc3RhbmNlX2cubV9Bc3lTZG9Db25uZWN0aW9uWzBdLCAweDAwLAorCQkgICBzaXplb2YoQXN5U2RvU2VxdUluc3RhbmNlX2cubV9Bc3lTZG9Db25uZWN0aW9uKSk7CisKKwkvLyBpbml0IEhpc3RvcnkKKwlSZXQgPSBFcGxTZG9Bc3lJbml0SGlzdG9yeSgpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKyNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMikKKwkvLyBjcmVhdGUgY3JpdGljYWwgc2VjdGlvbiBmb3IgcHJvY2VzcyBmdW5jdGlvbgorCUFzeVNkb1NlcXVJbnN0YW5jZV9nLm1fcENyaXRpY2FsU2VjdGlvbiA9CisJICAgICZBc3lTZG9TZXF1SW5zdGFuY2VfZy5tX0NyaXRpY2FsU2VjdGlvbjsKKwlJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKEFzeVNkb1NlcXVJbnN0YW5jZV9nLm1fcENyaXRpY2FsU2VjdGlvbik7CisKKwkvLyBpbml0IGNyaXRpY2FsIHNlY3Rpb24gZm9yIHJlY2VpdmUgY2IgZnVuY3Rpb24KKwlBc3lTZG9TZXF1SW5zdGFuY2VfZy5tX3BDcml0aWNhbFNlY3Rpb25SZWNlaXZlID0KKwkgICAgJkFzeVNkb1NlcXVJbnN0YW5jZV9nLm1fQ3JpdGljYWxTZWN0aW9uUmVjZWl2ZTsKKwlJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKEFzeVNkb1NlcXVJbnN0YW5jZV9nLgorCQkJCSAgbV9wQ3JpdGljYWxTZWN0aW9uUmVjZWl2ZSk7CisjZW5kaWYKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9fVURQKSkgIT0gMCkKKwkvLyBpbml0IGxvd2VyIGxheWVyCisJUmV0ID0gRXBsU2RvVWRwdUFkZEluc3RhbmNlKEVwbFNkb0FzeVJlY2VpdmVDYik7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorI2VuZGlmCisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPX0FTTkQpKSAhPSAwKQorCS8vIGluaXQgbG93ZXIgbGF5ZXIKKwlSZXQgPSBFcGxTZG9Bc25kdUFkZEluc3RhbmNlKEVwbFNkb0FzeVJlY2VpdmVDYik7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorI2VuZGlmCisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9Bc3lTZXFEZWxJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBkZWxldGUgaW5zdGFuY2VzCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXN5U2VxRGVsSW5zdGFuY2UoKQoreworCXRFcGxLZXJuZWwgUmV0OworCXVuc2lnbmVkIGludCB1aUNvdW50OworCXRFcGxBc3lTZG9TZXFDb24gKnBBc3lTZG9TZXFDb247CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGRlbGV0ZSB0aW1lciBvZiBvcGVuIGNvbm5lY3Rpb25zCisJdWlDb3VudCA9IDA7CisJcEFzeVNkb1NlcUNvbiA9ICZBc3lTZG9TZXF1SW5zdGFuY2VfZy5tX0FzeVNkb0Nvbm5lY3Rpb25bMF07CisJd2hpbGUgKHVpQ291bnQgPCBFUExfTUFYX1NET19TRVFfQ09OKSB7CisJCWlmIChwQXN5U2RvU2VxQ29uLT5tX0NvbkhhbmRsZSAhPSAwKSB7CisJCQlFcGxUaW1lcnVEZWxldGVUaW1lcigmcEFzeVNkb1NlcUNvbi0+bV9FcGxUaW1lckhkbCk7CisJCX0KKwkJdWlDb3VudCsrOworCQlwQXN5U2RvU2VxQ29uKys7CisJfQorCisjaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzIpCisJLy8gZGVsZXRlIGNyaXRpY2FsIHNlY3Rpb24gZm9yIHByb2Nlc3MgZnVuY3Rpb24KKwlEZWxldGVDcml0aWNhbFNlY3Rpb24oQXN5U2RvU2VxdUluc3RhbmNlX2cubV9wQ3JpdGljYWxTZWN0aW9uKTsKKyNlbmRpZgorCisJLy8gc2V0IGluc3RhbmNlLXRhYmxlIHRvIDAKKwlFUExfTUVNU0VUKCZBc3lTZG9TZXF1SW5zdGFuY2VfZywgMHgwMCwgc2l6ZW9mKEFzeVNkb1NlcXVJbnN0YW5jZV9nKSk7CisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPX1VEUCkpICE9IDApCisJLy8gZGVsZXRlIGxvd2VyIGxheWVyCisJUmV0ID0gRXBsU2RvVWRwdURlbEluc3RhbmNlKCk7CisjZW5kaWYKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9fQVNORCkpICE9IDApCisJLy8gZGVsZXRlIGxvd2VyIGxheWVyCisJUmV0ID0gRXBsU2RvQXNuZHVEZWxJbnN0YW5jZSgpOworI2VuZGlmCisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9Bc3lTZXFJbml0Q29uCisvLworLy8gRGVzY3JpcHRpb246IHN0YXJ0IGluaXRpYWxpemF0aW9uIG9mIGEgc2VxdWVuY2UgbGF5ZXIgY29ubmVjdGlvbi4KKy8vICAgICAgICAgICAgICBJdCB0cmllcyB0byByZXVzZSBhbiBleGlzdGluZyBjb25uZWN0aW9uIHRvIHRoZSBzYW1lIG5vZGUuCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwU2RvU2VxQ29uSGRsX3AgPSBwb2ludGVyIHRvIHRoZSB2YXJpYWJsZSBmb3IgdGhlIGNvbm5lY3Rpb24gaGFuZGxlCisvLyAgICAgICAgICAgICAgdWlOb2RlSWRfcCAgICAgID0gTm9kZSBJZCBvZiB0aGUgdGFyZ2V0CisvLyAgICAgICAgICAgICAgU2RvVHlwZSAgICAgICAgICA9IFR5cGUgb2YgdGhlIFNETyBjb25uZWN0aW9uCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc3lTZXFJbml0Q29uKHRFcGxTZG9TZXFDb25IZGwgKiBwU2RvU2VxQ29uSGRsX3AsCisJCQkJICAgICAgdW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJICAgICAgdEVwbFNkb1R5cGUgU2RvVHlwZSkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl1bnNpZ25lZCBpbnQgdWlDb3VudDsKKwl1bnNpZ25lZCBpbnQgdWlGcmVlQ29uOworCXRFcGxTZG9Db25IZGwgQ29uSGFuZGxlOworCXRFcGxBc3lTZG9TZXFDb24gKnBBc3lTZG9TZXFDb247CisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBjaGVjayBTZG9UeXBlCisJLy8gY2FsbCBpbml0IGZ1bmN0aW9uIG9mIHRoZSBwcm90Y29sIGFic3RyYWN0aW9uIGxheWVyCisJLy8gd2hpY2ggdHJpZXMgdG8gZmluZCBhbiBleGlzdGluZyBjb25uZWN0aW9uIHRvIHRoZSBzYW1lIG5vZGUKKwlzd2l0Y2ggKFNkb1R5cGUpIHsKKwkJLy8gU0RPIG92ZXIgVURQCisJY2FzZSBrRXBsU2RvVHlwZVVkcDoKKwkJeworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9fVURQKSkgIT0gMCkKKwkJCVJldCA9IEVwbFNkb1VkcHVJbml0Q29uKCZDb25IYW5kbGUsIHVpTm9kZUlkX3ApOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKyNlbHNlCisJCQlSZXQgPSBrRXBsU2RvU2VxVW5zdXBwb3J0ZWRQcm90OworI2VuZGlmCisJCQlicmVhazsKKwkJfQorCisJCS8vIFNETyBvdmVyIEFzbmQKKwljYXNlIGtFcGxTZG9UeXBlQXNuZDoKKwkJeworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9fQVNORCkpICE9IDApCisJCQlSZXQgPSBFcGxTZG9Bc25kdUluaXRDb24oJkNvbkhhbmRsZSwgdWlOb2RlSWRfcCk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJZ290byBFeGl0OworCQkJfQorI2Vsc2UKKwkJCVJldCA9IGtFcGxTZG9TZXFVbnN1cHBvcnRlZFByb3Q7CisjZW5kaWYKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gdW5zdXBwb3J0ZWQgcHJvdG9jb2xzCisJCS8vIC0+IGF1dG8gc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IGNvbW1hbmQgbGF5ZXIKKwljYXNlIGtFcGxTZG9UeXBlQXV0bzoKKwljYXNlIGtFcGxTZG9UeXBlUGRvOgorCWRlZmF1bHQ6CisJCXsKKwkJCVJldCA9IGtFcGxTZG9TZXFVbnN1cHBvcnRlZFByb3Q7CisJCQlnb3RvIEV4aXQ7CisJCX0KKworCX0JCQkvLyBlbmQgb2Ygc3dpdGNoKFNkb1R5cGUpCisKKwkvLyBmaW5kIGV4aXN0aW5nIGNvbm5lY3Rpb24gdG8gdGhlIHNhbWUgbm9kZSBvciBmaW5kIGVtcHR5IGVudHJ5IGZvciBjb25uZWN0aW9uCisJdWlDb3VudCA9IDA7CisJdWlGcmVlQ29uID0gRVBMX01BWF9TRE9fU0VRX0NPTjsKKwlwQXN5U2RvU2VxQ29uID0gJkFzeVNkb1NlcXVJbnN0YW5jZV9nLm1fQXN5U2RvQ29ubmVjdGlvblswXTsKKworCXdoaWxlICh1aUNvdW50IDwgRVBMX01BWF9TRE9fU0VRX0NPTikgeworCQlpZiAocEFzeVNkb1NlcUNvbi0+bV9Db25IYW5kbGUgPT0gQ29uSGFuZGxlKSB7CS8vIGV4aXN0aW5nIGNvbm5lY3Rpb24gZm91bmQKKwkJCWJyZWFrOworCQl9CisJCWlmIChwQXN5U2RvU2VxQ29uLT5tX0NvbkhhbmRsZSA9PSAwKSB7CisJCQl1aUZyZWVDb24gPSB1aUNvdW50OworCQl9CisJCXVpQ291bnQrKzsKKwkJcEFzeVNkb1NlcUNvbisrOworCX0KKworCWlmICh1aUNvdW50ID09IEVQTF9NQVhfU0RPX1NFUV9DT04pIHsKKwkJaWYgKHVpRnJlZUNvbiA9PSBFUExfTUFYX1NET19TRVFfQ09OKSB7CS8vIG5vIGZyZWUgZW50cnkgZm91bmQKKwkJCXN3aXRjaCAoU2RvVHlwZSkgeworCQkJCS8vIFNETyBvdmVyIFVEUAorCQkJY2FzZSBrRXBsU2RvVHlwZVVkcDoKKwkJCQl7CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19VRFApKSAhPSAwKQorCQkJCQlSZXQgPSBFcGxTZG9VZHB1RGVsQ29uKENvbkhhbmRsZSk7CisJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJfQorI2VuZGlmCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIFNETyBvdmVyIEFzbmQKKwkJCWNhc2Uga0VwbFNkb1R5cGVBc25kOgorCQkJCXsKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPX0FTTkQpKSAhPSAwKQorCQkJCQlSZXQgPSBFcGxTZG9Bc25kdURlbENvbihDb25IYW5kbGUpOworCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCX0KKyNlbmRpZgorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyB1bnN1cHBvcnRlZCBwcm90b2NvbHMKKwkJCQkvLyAtPiBhdXRvIHNob3VsZCBiZSByZXBsYWNlZCBieSBjb21tYW5kIGxheWVyCisJCQljYXNlIGtFcGxTZG9UeXBlQXV0bzoKKwkJCWNhc2Uga0VwbFNkb1R5cGVQZG86CisJCQlkZWZhdWx0OgorCQkJCXsKKwkJCQkJUmV0ID0ga0VwbFNkb1NlcVVuc3VwcG9ydGVkUHJvdDsKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKworCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKFNkb1R5cGUpCisKKwkJCVJldCA9IGtFcGxTZG9TZXFOb0ZyZWVIYW5kbGU7CisJCQlnb3RvIEV4aXQ7CisJCX0gZWxzZSB7CS8vIGZyZWUgZW50cnkgZm91bmQKKwkJCXBBc3lTZG9TZXFDb24gPQorCQkJICAgICZBc3lTZG9TZXF1SW5zdGFuY2VfZy5tX0FzeVNkb0Nvbm5lY3Rpb25bdWlGcmVlQ29uXTsKKwkJCXBBc3lTZG9TZXFDb24tPm1fQ29uSGFuZGxlID0gQ29uSGFuZGxlOworCQkJdWlDb3VudCA9IHVpRnJlZUNvbjsKKwkJfQorCX0KKwkvLyBzZXQgaGFuZGxlCisJKnBTZG9TZXFDb25IZGxfcCA9ICh1aUNvdW50IHwgRVBMX1NET19BU1lfSEFORExFKTsKKworCS8vIGluY3JlbWVudCB1c2UgY291bnRlcgorCXBBc3lTZG9TZXFDb24tPm1fdWlVc2VDb3VudCsrOworCisJLy8gY2FsbCBpbnRlcm4gcHJvY2VzcyBmdW5jdGlvbgorCVJldCA9IEVwbFNkb0FzeVNlcVByb2Nlc3ModWlDb3VudCwKKwkJCQkgIDAsIE5VTEwsIE5VTEwsIGtBc3lTZG9TZXFFdmVudEluaXRDb24pOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb0FzeVNlcVNlbmREYXRhCisvLworLy8gRGVzY3JpcHRpb246IHNlbmQgc2F0YSB1bnNpbmcgYSBlc3RhYmxpc2hlZCBjb25uZWN0aW9uCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFNkb1NlcUNvbkhkbF9wID0gY29ubmVjdGlvbiBoYW5kbGUKKy8vICAgICAgICAgICAgICB1aURhdGFTaXplX3AgICAgPSBTaXplIG9mIEZyYW1lIHRvIHNlbmQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IHdpaHRvdXQgU0RPIHNlcXVlbmNlIGxheWVyIGhlYWRlciwgQXNuZCBoZWFkZXIKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBldGhlcm5ldG5ldAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0+IFNETyBTZXF1ZW5jZSBsYXllciBwYXlsb2FkCisvLyAgICAgICAgICAgICAgU2RvVHlwZSAgICAgICAgICA9IFR5cGUgb2YgdGhlIFNETyBjb25uZWN0aW9uCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc3lTZXFTZW5kRGF0YSh0RXBsU2RvU2VxQ29uSGRsIFNkb1NlcUNvbkhkbF9wLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgdWlEYXRhU2l6ZV9wLAorCQkJCSAgICAgICB0RXBsRnJhbWUgKiBwYWJEYXRhX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdW5zaWduZWQgaW50IHVpSGFuZGxlOworCisJdWlIYW5kbGUgPSAoU2RvU2VxQ29uSGRsX3AgJiB+RVBMX1NET19TRVFfSEFORExFX01BU0spOworCisJLy8gY2hlY2sgaWYgY29ubmVjdGlvbiByZWFkeQorCWlmIChBc3lTZG9TZXF1SW5zdGFuY2VfZy5tX0FzeVNkb0Nvbm5lY3Rpb25bdWlIYW5kbGVdLm1fU2RvU3RhdGUgPT0KKwkgICAga0VwbEFzeVNkb1N0YXRlSWRsZSkgeworCQkvLyBubyBjb25uZWN0aW9uIHdpdGggdGhpcyBoYW5kbGUKKwkJUmV0ID0ga0VwbFNkb1NlcUludmFsaWRIZGw7CisJCWdvdG8gRXhpdDsKKwl9IGVsc2UgaWYgKEFzeVNkb1NlcXVJbnN0YW5jZV9nLm1fQXN5U2RvQ29ubmVjdGlvblt1aUhhbmRsZV0uCisJCSAgIG1fU2RvU3RhdGUgIT0ga0VwbEFzeVNkb1N0YXRlQ29ubmVjdGVkKSB7CisJCVJldCA9IGtFcGxTZG9TZXFDb25uZWN0aW9uQnVzeTsKKwkJZ290byBFeGl0OworCX0KKworCVJldCA9IEVwbFNkb0FzeVNlcVByb2Nlc3ModWlIYW5kbGUsCisJCQkJICB1aURhdGFTaXplX3AsCisJCQkJICBwYWJEYXRhX3AsIE5VTEwsIGtBc3lTZG9TZXFFdmVudEZyYW1lU2VuZCk7CisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb0FzeVNlcVByb2Nlc3NFdmVudAorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBwcm9jZXNzZXMgZXh0ZXJuIGV2ZW50cworLy8gICAgICAgICAgICAgIC0+IGxhdGVyIG5lZWRlZCBmb3IgdGltZW91dCBjb250cm9sbCB3aXRoIHRpbWVyLW1vZHVsZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHBFdmVudF9wID0gcG9pbnRlciB0byBldmVudAorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXN5U2VxUHJvY2Vzc0V2ZW50KHRFcGxFdmVudCAqIHBFdmVudF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxUaW1lckV2ZW50QXJnICpwVGltZXJFdmVudEFyZzsKKwl0RXBsQXN5U2RvU2VxQ29uICpwQXN5U2RvU2VxQ29uOworCXRFcGxUaW1lckhkbCBFcGxUaW1lckhkbDsKKwl1bnNpZ25lZCBpbnQgdWlDb3VudDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCS8vIGNoZWNrIHBhcmFtZXRlcgorCWlmIChwRXZlbnRfcCA9PSBOVUxMKSB7CisJCVJldCA9IGtFcGxTZG9TZXFJbnZhbGlkRXZlbnQ7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAocEV2ZW50X3AtPm1fRXZlbnRUeXBlICE9IGtFcGxFdmVudFR5cGVUaW1lcikgeworCQlSZXQgPSBrRXBsU2RvU2VxSW52YWxpZEV2ZW50OworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGdldCB0aW1lcmhkbAorCXBUaW1lckV2ZW50QXJnID0gKHRFcGxUaW1lckV2ZW50QXJnICopIHBFdmVudF9wLT5tX3BBcmc7CisJRXBsVGltZXJIZGwgPSBwVGltZXJFdmVudEFyZy0+bV9UaW1lckhkbDsKKworCS8vIGdldCBwb2ludGVyIHRvIGludGVybiBjb250cm9sIHN0cnVjdHVyZSBvZiBjb25uZWN0aW9uCisJaWYgKHBUaW1lckV2ZW50QXJnLT5tX3VsQXJnID09IDApIHsKKwkJZ290byBFeGl0OworCX0KKwlwQXN5U2RvU2VxQ29uID0gKHRFcGxBc3lTZG9TZXFDb24gKikgcFRpbWVyRXZlbnRBcmctPm1fdWxBcmc7CisKKwkvLyBjaGVjayBpZiB0aW1lIGlzIGN1cnJlbnQKKwlpZiAoRXBsVGltZXJIZGwgIT0gcEFzeVNkb1NlcUNvbi0+bV9FcGxUaW1lckhkbCkgeworCQkvLyBkZWxldGUgdGltZXIKKwkJRXBsVGltZXJ1RGVsZXRlVGltZXIoJkVwbFRpbWVySGRsKTsKKwkJZ290byBFeGl0OworCX0KKwkvLyBkZWxldGUgdGltZXIKKwlFcGxUaW1lcnVEZWxldGVUaW1lcigmcEFzeVNkb1NlcUNvbi0+bV9FcGxUaW1lckhkbCk7CisKKwkvLyBnZXQgaW5kZXhudW1iZXIgb2YgY29udHJvbCBzdHJ1Y3R1cmUKKwl1aUNvdW50ID0gMDsKKwl3aGlsZSAoKCZBc3lTZG9TZXF1SW5zdGFuY2VfZy5tX0FzeVNkb0Nvbm5lY3Rpb25bdWlDb3VudF0pICE9CisJICAgICAgIHBBc3lTZG9TZXFDb24pIHsKKwkJdWlDb3VudCsrOworCQlpZiAodWlDb3VudCA+IEVQTF9NQVhfU0RPX1NFUV9DT04pIHsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCX0KKworCS8vIHByb2Nlc3MgZXZlbnQgYW5kIGNhbGwgcHJvY2Vzc2Z1bmN0aW9uIGlmIG5lZWRlZAorCVJldCA9IEVwbFNkb0FzeVNlcVByb2Nlc3ModWlDb3VudCwKKwkJCQkgIDAsIE5VTEwsIE5VTEwsIGtBc3lTZG9TZXFFdmVudFRpbWVvdXQpOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQXN5U2VxRGVsQ29uCisvLworLy8gRGVzY3JpcHRpb246IGRlbCBhbmQgY2xvc2Ugb25lIGNvbm5lY3Rpb24KKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBTZG9TZXFDb25IZGxfcCA9IGhhbmRsZSBvZiBjb25uZWN0aW9uCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc3lTZXFEZWxDb24odEVwbFNkb1NlcUNvbkhkbCBTZG9TZXFDb25IZGxfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXVuc2lnbmVkIGludCB1aUhhbmRsZTsKKwl0RXBsQXN5U2RvU2VxQ29uICpwQXN5U2RvU2VxQ29uOworCisJdWlIYW5kbGUgPSAoU2RvU2VxQ29uSGRsX3AgJiB+RVBMX1NET19TRVFfSEFORExFX01BU0spOworCisJLy8gY2hlY2sgaWYgaGFuZGxlIGludmFsaWQKKwlpZiAodWlIYW5kbGUgPj0gRVBMX01BWF9TRE9fU0VRX0NPTikgeworCQlSZXQgPSBrRXBsU2RvU2VxSW52YWxpZEhkbDsKKwkJZ290byBFeGl0OworCX0KKwkvLyBnZXQgcG9pbnRlciB0byBjb25uZWN0aW9uCisJcEFzeVNkb1NlcUNvbiA9ICZBc3lTZG9TZXF1SW5zdGFuY2VfZy5tX0FzeVNkb0Nvbm5lY3Rpb25bdWlIYW5kbGVdOworCisJLy8gZGVjcmVtZW50IHVzZSBjb3VudGVyCisJcEFzeVNkb1NlcUNvbi0+bV91aVVzZUNvdW50LS07CisKKwlpZiAocEFzeVNkb1NlcUNvbi0+bV91aVVzZUNvdW50ID09IDApIHsKKwkJLy8gcHJvY2VzcyBjbG9zZSBpbiBwcm9jZXNzZnVuY3Rpb24KKwkJUmV0ID0gRXBsU2RvQXN5U2VxUHJvY2Vzcyh1aUhhbmRsZSwKKwkJCQkJICAwLAorCQkJCQkgIE5VTEwsIE5VTEwsIGtBc3lTZG9TZXFFdmVudENsb3NlQ29uKTsKKworCQkvL2NoZWNrIHByb3RvY29sCisJCWlmICgocEFzeVNkb1NlcUNvbi0+bV9Db25IYW5kbGUgJiBFUExfU0RPX0FTWV9IQU5ETEVfTUFTSykgPT0KKwkJICAgIEVQTF9TRE9fVURQX0hBTkRMRSkgeworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9fVURQKSkgIT0gMCkKKwkJCS8vIGNhbGwgY2xvc2UgZnVuY3Rpb24gb2YgbG93ZXIgbGF5ZXIKKwkJCUVwbFNkb1VkcHVEZWxDb24ocEFzeVNkb1NlcUNvbi0+bV9Db25IYW5kbGUpOworI2VuZGlmIC8vIGVuZCBvZiAjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19VRFApKSAhPSAwKQorCQl9IGVsc2UgeworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9fQVNORCkpICE9IDApCisJCQkvLyBjYWxsIGNsb3NlIGZ1bmN0aW9uIG9mIGxvd2VyIGxheWVyCisJCQlFcGxTZG9Bc25kdURlbENvbihwQXN5U2RvU2VxQ29uLT5tX0NvbkhhbmRsZSk7CisjZW5kaWYgLy8gZW5kIG9mICNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPX0FTTkQpKSAhPSAwKQorCQl9CisKKwkJLy8gZGVsZXRlIHRpbWVyCisJCUVwbFRpbWVydURlbGV0ZVRpbWVyKCZwQXN5U2RvU2VxQ29uLT5tX0VwbFRpbWVySGRsKTsKKworCQkvLyBjbGVhbiBjb250cm9sbHN0cnVjdHVyZQorCQlFUExfTUVNU0VUKHBBc3lTZG9TZXFDb24sIDB4MDAsIHNpemVvZih0RXBsQXN5U2RvU2VxQ29uKSk7CisJCXBBc3lTZG9TZXFDb24tPm1fU2RvQ29uSGlzdG9yeS5tX2JGcmVlRW50cmllcyA9CisJCSAgICBFUExfU0RPX0hJU1RPUllfU0laRTsKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKKworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsRXBsU2RvQXN5U2VxUHJvY2VzcworLy8KKy8vIERlc2NyaXB0aW9uOiBpbnRlcm4gZnVuY3Rpb24gdG8gcHJvY2VzcyB0aGUgYXN5bmNocm9udXMgU0RPIFNlcXVlbmNlIExheWVyCisvLyAgICAgICAgICAgICAgc3RhdGUgbWFzY2hpbmUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICB1aUhhbmRsZV9wICAgICAgPSBpbmRleCBvZiB0aGUgY29udHJvbCBzdHJ1Y3R1cmUgb2YgdGhlIGNvbm5lY3Rpb24KKy8vICAgICAgICAgICAgICB1aURhdGFTaXplX3AgICAgPSBzaXplIG9mIGRhdGEgZnJhbWUgdG8gcHJvY2VzcyAoY2FuIGJlIDApCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiB3aXRob3V0IHNpemUgb2Ygc2VxdWVuY2UgaGVhZGVyIGFuZCBBc25kIGhlYWRlciEhIQorLy8KKy8vICAgICAgICAgICAgICBwRGF0YV9wICAgICAgICAgPSBwb2ludGVyIHRvIGZyYW1lIHRvIHNlbmQgKGNhbiBiZSBOVUxMKQorLy8gICAgICAgICAgICAgIHBSZWNGcmFtZV9wICAgICA9IHBvaW50ZXIgdG8gcmVjZWl2ZWQgZnJhbWUgKGNhbiBiZSBOVUxMKQorLy8gICAgICAgICAgICAgIEV2ZW50X3AgICAgICAgICA9IEV2ZW50IHRvIHByb2Nlc3MKKy8vCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Bc3lTZXFQcm9jZXNzKHVuc2lnbmVkIGludCB1aUhhbmRsZV9wLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCB1aURhdGFTaXplX3AsCisJCQkJICAgICAgdEVwbEZyYW1lICogcERhdGFfcCwKKwkJCQkgICAgICB0RXBsQXN5U2RvU2VxICogcFJlY0ZyYW1lX3AsCisJCQkJICAgICAgdEVwbEFzeVNkb1NlcUV2ZW50IEV2ZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdW5zaWduZWQgaW50IHVpRnJhbWVTaXplOworCXRFcGxGcmFtZSAqcEVwbEZyYW1lOworCXRFcGxBc3lTZG9TZXFDb24gKnBBc3lTZG9TZXFDb247CisJdEVwbFNkb1NlcUNvbkhkbCBTZG9TZXFDb25IZGw7CisJdW5zaWduZWQgaW50IHVpRnJlZUVudHJpZXM7CisKKyNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMikKKwkvLyBlbnRlciAgY3JpdGljYWwgc2VjdGlvbiBmb3IgcHJvY2VzcyBmdW5jdGlvbgorCUVudGVyQ3JpdGljYWxTZWN0aW9uKEFzeVNkb1NlcXVJbnN0YW5jZV9nLm1fcENyaXRpY2FsU2VjdGlvbik7CisjZW5kaWYKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gZ2V0IGhhbmRsZSBmb3IgaGluZ2VyIGxheWVyCisJU2RvU2VxQ29uSGRsID0gdWlIYW5kbGVfcCB8IEVQTF9TRE9fQVNZX0hBTkRMRTsKKworCS8vIGNoZWNrIGlmIGhhbmRsZSBpbnZhbGlkCisJaWYgKChTZG9TZXFDb25IZGwgJiB+RVBMX1NET19TRVFfSEFORExFX01BU0spID09CisJICAgIEVQTF9TRE9fU0VRX0lOVkFMSURfSERMKSB7CisJCVJldCA9IGtFcGxTZG9TZXFJbnZhbGlkSGRsOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGdldCBwb2ludGVyIHRvIGNvbm5lY3Rpb24KKwlwQXN5U2RvU2VxQ29uID0gJkFzeVNkb1NlcXVJbnN0YW5jZV9nLm1fQXN5U2RvQ29ubmVjdGlvblt1aUhhbmRsZV9wXTsKKworCS8vIGNoZWNrIHNpemUKKwlpZiAoKHBEYXRhX3AgPT0gTlVMTCkgJiYgKHBSZWNGcmFtZV9wID09IE5VTEwpICYmICh1aURhdGFTaXplX3AgIT0gMCkpIHsKKwkJUmV0ID0ga0VwbFNkb1NlcUludmFsaWRGcmFtZTsKKwkJZ290byBFeGl0OworCX0KKwkvLyBjaGVjayBzdGF0ZQorCXN3aXRjaCAocEFzeVNkb1NlcUNvbi0+bV9TZG9TdGF0ZSkgeworCQkvLyBpZGxlIHN0YXRlCisJY2FzZSBrRXBsQXN5U2RvU3RhdGVJZGxlOgorCQl7CisJCQkvLyBjaGVjayBldmVudAorCQkJc3dpdGNoIChFdmVudF9wKSB7CisJCQkJLy8gbmV3IGNvbm5lY3Rpb24KKwkJCQkvLyAtPiBzZW5kIGluaXQgZnJhbWUgYW5kIGNoYW5nZSB0bworCQkJCS8vIGtFcGxBc3lTZG9TdGF0ZUluaXQxCisJCQljYXNlIGtBc3lTZG9TZXFFdmVudEluaXRDb246CisJCQkJeworCQkJCQkvLyBzZXQgc2VuZGluZyBzY29uIHRvIDEKKwkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iUmVjU2VxTnVtID0gMHgwMTsKKwkJCQkJLy8gc2V0IHNldCBzZW5kIHJjb24gdG8gMAorCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JTZW5kU2VxTnVtID0gMHgwMDsKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbFNkb0FzeVNlcVNlbmRJbnRlcm4KKwkJCQkJICAgIChwQXN5U2RvU2VxQ29uLCAwLCBOVUxMLCBGQUxTRSk7CisJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJfQorCQkJCQkvLyBjaGFuZ2Ugc3RhdGUKKwkJCQkJcEFzeVNkb1NlcUNvbi0+bV9TZG9TdGF0ZSA9CisJCQkJCSAgICBrRXBsQXN5U2RvU3RhdGVJbml0MTsKKworCQkJCQkvLyBzZXQgdGltZXIKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbFNkb0FzeVNlcVNldFRpbWVyKHBBc3lTZG9TZXFDb24sCisJCQkJCQkJCSBFUExfU0VRX0RFRkFVTFRfVElNRU9VVCk7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gaW5pdCBjb24gZnJvbSBleHRlcm4KKwkJCQkvLyBjaGVjayByY29uIGFuZCBzY29uCisJCQkJLy8gLT4gc2VuZCBhbnN3ZXIKKwkJCWNhc2Uga0FzeVNkb1NlcUV2ZW50RnJhbWVSZWM6CisJCQkJeworLyoKKyAgICAgICAgICAgICAgICAgICAgUFJJTlRGMygiJXMgc2Nvbj0ldSByY29uPSV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWNGcmFtZV9wLT5tX2xlX2JTZW5kU2VxTnVtQ29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWNGcmFtZV9wLT5tX2xlX2JSZWNTZXFOdW1Db24pOworKi8KKwkJCQkJLy8gY2hlY2sgaWYgc2NvbiA9PSAxIGFuZCByY29uID09IDAKKwkJCQkJaWYgKCgocFJlY0ZyYW1lX3AtPgorCQkJCQkgICAgICBtX2xlX2JSZWNTZXFOdW1Db24gJgorCQkJCQkgICAgICBFUExfQVNZX1NET19DT05fTUFTSykgPT0gMHgwMCkKKwkJCQkJICAgICYmCisJCQkJCSAgICAoKHBSZWNGcmFtZV9wLT4KKwkJCQkJICAgICAgbV9sZV9iU2VuZFNlcU51bUNvbiAmCisJCQkJCSAgICAgIEVQTF9BU1lfU0RPX0NPTl9NQVNLKSA9PSAweDAxKSkgeworCQkJCQkJLy8gc2F2ZSBzZXF1ZW5jZSBudW1iZXJzCisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JSZWNTZXFOdW0gPQorCQkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCSAgICAoJnBSZWNGcmFtZV9wLT4KKwkJCQkJCSAgICAgbV9sZV9iUmVjU2VxTnVtQ29uKTsKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlNlbmRTZXFOdW0gPQorCQkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCSAgICAoJnBSZWNGcmFtZV9wLT4KKwkJCQkJCSAgICAgbV9sZV9iU2VuZFNlcU51bUNvbik7CisJCQkJCQkvLyBjcmVhdGUgYW5zd2VyIGFuZCBzZW5kIGFuc3dlcgorCQkJCQkJLy8gc2V0IHJjb24gdG8gMSAoaW4gc2VuZCBkaXJlY3Rpb24gb3duIHNjb24pCisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JSZWNTZXFOdW0rKzsKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2VuZEludGVybgorCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLCAwLCBOVUxMLAorCQkJCQkJICAgICBGQUxTRSk7CisJCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJZ290byBFeGl0OworCQkJCQkJfQorCQkJCQkJLy8gY2hhbmdlIHN0YXRlIHRvIGtFcGxBc3lTZG9TdGF0ZUluaXQyCisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX1Nkb1N0YXRlID0KKwkJCQkJCSAgICBrRXBsQXN5U2RvU3RhdGVJbml0MjsKKworCQkJCQkJLy8gc2V0IHRpbWVyCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbFNkb0FzeVNlcVNldFRpbWVyCisJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sCisJCQkJCQkgICAgIEVQTF9TRVFfREVGQVVMVF9USU1FT1VUKTsKKwkJCQkJfSBlbHNlIHsJLy8gZXJyb3IgLT4gY2xvc2UKKwkJCQkJCS8vIGRlbGV0ZSB0aW1lcgorCQkJCQkJRXBsVGltZXJ1RGVsZXRlVGltZXIKKwkJCQkJCSAgICAoJnBBc3lTZG9TZXFDb24tPgorCQkJCQkJICAgICBtX0VwbFRpbWVySGRsKTsKKwkJCQkJCWlmICgoKHBSZWNGcmFtZV9wLT4KKwkJCQkJCSAgICAgIG1fbGVfYlJlY1NlcU51bUNvbiAmCisJCQkJCQkgICAgICBFUExfQVNZX1NET19DT05fTUFTSykgIT0KKwkJCQkJCSAgICAgMHgwMCkKKwkJCQkJCSAgICB8fCAoKHBSZWNGcmFtZV9wLT5tX2xlX2JTZW5kU2VxTnVtQ29uICYgRVBMX0FTWV9TRE9fQ09OX01BU0spICE9IDB4MDApKSB7CS8vIGQuay4gb25seSBhbnN3ZXIgd2l0aCBjbG9zZSBtZXNzYWdlIGlmIHRoZSBtZXNzYWdlIHNlbnQgd2FzIG5vdCBhIGNsb3NlIG1lc3NhZ2UKKwkJCQkJCQkvLyBzYXZlIHNlcXVlbmNlIG51bWJlcnMKKwkJCQkJCQlwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCQkgICAgbV9iUmVjU2VxTnVtID0KKwkJCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJCSAgICAoJnBSZWNGcmFtZV9wLT4KKwkJCQkJCQkgICAgIG1fbGVfYlJlY1NlcU51bUNvbik7CisJCQkJCQkJcEFzeVNkb1NlcUNvbi0+CisJCQkJCQkJICAgIG1fYlNlbmRTZXFOdW0gPQorCQkJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkJICAgICgmcFJlY0ZyYW1lX3AtPgorCQkJCQkJCSAgICAgbV9sZV9iU2VuZFNlcU51bUNvbik7CisJCQkJCQkJLy8gc2V0IHJjb24gYW5kIHNjb24gdG8gMAorCQkJCQkJCXBBc3lTZG9TZXFDb24tPgorCQkJCQkJCSAgICBtX2JTZW5kU2VxTnVtICY9CisJCQkJCQkJICAgIEVQTF9TRVFfTlVNX01BU0s7CisJCQkJCQkJcEFzeVNkb1NlcUNvbi0+CisJCQkJCQkJICAgIG1fYlJlY1NlcU51bSAmPQorCQkJCQkJCSAgICBFUExfU0VRX05VTV9NQVNLOworCQkJCQkJCS8vIHNlbmQgZnJhbWUKKwkJCQkJCQlFcGxTZG9Bc3lTZXFTZW5kSW50ZXJuCisJCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLCAwLAorCQkJCQkJCSAgICAgTlVMTCwgRkFMU0UpOworCQkJCQkJfQorCQkJCQkJLy8gY2FsbCBDb21tYW5kIExheWVyIENiCisJCQkJCQlBc3lTZG9TZXF1SW5zdGFuY2VfZy4KKwkJCQkJCSAgICBtX2ZwU2RvQ29tQ29uQ2IKKwkJCQkJCSAgICAoU2RvU2VxQ29uSGRsLAorCQkJCQkJICAgICBrQXN5U2RvQ29uU3RhdGVJbml0RXJyb3IpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQkvLyBkLmsuIGRvIG5vdGhpbmcKKwkJCQlicmVhazsKKworCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKEV2ZW50X3ApCisJCQlicmVhazsKKwkJfQorCisJCS8vIGluaXQgY29ubmVjdGlvbiBzdGVwIDEKKwkJLy8gd2FpdCBmb3IgZnJhbWUgd2l0aCBzY29uID0gMQorCQkvLyBhbmQgcmNvbiA9IDEKKwljYXNlIGtFcGxBc3lTZG9TdGF0ZUluaXQxOgorCQl7CisvLyAgICAgICAgICAgIFBSSU5URjAoIkVwbFNkb0FzeVNlcXU6IFN0YXRlSW5pdDFcbiIpOworCisJCQkvLyBjaGVjayBldmVudAorCQkJc3dpdGNoIChFdmVudF9wKSB7CisJCQkJLy8gZnJhbWUgcmVjZWl2ZWQKKwkJCWNhc2Uga0FzeVNkb1NlcUV2ZW50RnJhbWVSZWM6CisJCQkJeworCQkJCQkvLyBjaGVjayBzY29uID09IDEgYW5kIHJjb24gPT0gMQorCQkJCQlpZiAoKChwUmVjRnJhbWVfcC0+CisJCQkJCSAgICAgIG1fbGVfYlJlY1NlcU51bUNvbiAmCisJCQkJCSAgICAgIEVQTF9BU1lfU0RPX0NPTl9NQVNLKSA9PSAweDAxKQorCQkJCQkgICAgJiYgKChwUmVjRnJhbWVfcC0+bV9sZV9iU2VuZFNlcU51bUNvbiAmIEVQTF9BU1lfU0RPX0NPTl9NQVNLKSA9PSAweDAxKSkgewkvLyBjcmVhdGUgYW5zd2VyIG93biBzY29uID0gMgorCQkJCQkJLy8gc2F2ZSBzZXF1ZW5jZSBudW1iZXJzCisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JSZWNTZXFOdW0gPQorCQkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCSAgICAoJnBSZWNGcmFtZV9wLT4KKwkJCQkJCSAgICAgbV9sZV9iUmVjU2VxTnVtQ29uKTsKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlNlbmRTZXFOdW0gPQorCQkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCSAgICAoJnBSZWNGcmFtZV9wLT4KKwkJCQkJCSAgICAgbV9sZV9iU2VuZFNlcU51bUNvbik7CisKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlJlY1NlcU51bSsrOworCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZW5kSW50ZXJuCisJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sIDAsIE5VTEwsCisJCQkJCQkgICAgIEZBTFNFKTsKKwkJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQl9CisJCQkJCQkvLyBjaGFuZ2Ugc3RhdGUgdG8ga0VwbEFzeVNkb1N0YXRlSW5pdDMKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fU2RvU3RhdGUgPQorCQkJCQkJICAgIGtFcGxBc3lTZG9TdGF0ZUluaXQzOworCisJCQkJCQkvLyBzZXQgdGltZXIKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2V0VGltZXIKKwkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwKKwkJCQkJCSAgICAgRVBMX1NFUV9ERUZBVUxUX1RJTUVPVVQpOworCisJCQkJCX0KKwkJCQkJLy8gY2hlY2sgaWYgc2NvbiA9PSAxIGFuZCByY29uID09IDAsIGkuZS4gb3RoZXIgc2lkZSB3YW50cyBtZSB0byBiZSBzZXJ2ZXIKKwkJCQkJZWxzZSBpZiAoKChwUmVjRnJhbWVfcC0+CisJCQkJCQkgICBtX2xlX2JSZWNTZXFOdW1Db24gJgorCQkJCQkJICAgRVBMX0FTWV9TRE9fQ09OX01BU0spID09CisJCQkJCQkgIDB4MDApCisJCQkJCQkgJiYKKwkJCQkJCSAoKHBSZWNGcmFtZV9wLT4KKwkJCQkJCSAgIG1fbGVfYlNlbmRTZXFOdW1Db24gJgorCQkJCQkJICAgRVBMX0FTWV9TRE9fQ09OX01BU0spID09CisJCQkJCQkgIDB4MDEpKSB7CisJCQkJCQkvLyBzYXZlIHNlcXVlbmNlIG51bWJlcnMKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlJlY1NlcU51bSA9CisJCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJICAgICgmcFJlY0ZyYW1lX3AtPgorCQkJCQkJICAgICBtX2xlX2JSZWNTZXFOdW1Db24pOworCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iU2VuZFNlcU51bSA9CisJCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJICAgICgmcFJlY0ZyYW1lX3AtPgorCQkJCQkJICAgICBtX2xlX2JTZW5kU2VxTnVtQ29uKTsKKwkJCQkJCS8vIGNyZWF0ZSBhbnN3ZXIgYW5kIHNlbmQgYW5zd2VyCisJCQkJCQkvLyBzZXQgcmNvbiB0byAxIChpbiBzZW5kIGRpcmVjdGlvbiBvd24gc2NvbikKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlJlY1NlcU51bSsrOworCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZW5kSW50ZXJuCisJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sIDAsIE5VTEwsCisJCQkJCQkgICAgIEZBTFNFKTsKKwkJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQl9CisJCQkJCQkvLyBjaGFuZ2Ugc3RhdGUgdG8ga0VwbEFzeVNkb1N0YXRlSW5pdDIKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fU2RvU3RhdGUgPQorCQkJCQkJICAgIGtFcGxBc3lTZG9TdGF0ZUluaXQyOworCisJCQkJCQkvLyBzZXQgdGltZXIKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2V0VGltZXIKKwkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwKKwkJCQkJCSAgICAgRVBMX1NFUV9ERUZBVUxUX1RJTUVPVVQpOworCQkJCQl9IGVsc2UgewkvLyBlcnJvciAtPiBDbG9zZQorCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9TZG9TdGF0ZSA9CisJCQkJCQkgICAga0VwbEFzeVNkb1N0YXRlSWRsZTsKKwkJCQkJCS8vIGRlbGV0ZSB0aW1lcgorCQkJCQkJRXBsVGltZXJ1RGVsZXRlVGltZXIKKwkJCQkJCSAgICAoJnBBc3lTZG9TZXFDb24tPgorCQkJCQkJICAgICBtX0VwbFRpbWVySGRsKTsKKwkJCQkJCWlmICgoKHBSZWNGcmFtZV9wLT4KKwkJCQkJCSAgICAgIG1fbGVfYlJlY1NlcU51bUNvbiAmCisJCQkJCQkgICAgICBFUExfQVNZX1NET19DT05fTUFTSykgIT0KKwkJCQkJCSAgICAgMHgwMCkKKwkJCQkJCSAgICB8fCAoKHBSZWNGcmFtZV9wLT5tX2xlX2JTZW5kU2VxTnVtQ29uICYgRVBMX0FTWV9TRE9fQ09OX01BU0spICE9IDB4MDApKSB7CS8vIGQuay4gb25seSBhbnN3ZXIgd2l0aCBjbG9zZSBtZXNzYWdlIGlmIHRoZSBtZXNzYWdlIHNlbnQgd2FzIG5vdCBhIGNsb3NlIG1lc3NhZ2UKKwkJCQkJCQkvLyBzYXZlIHNlcXVlbmNlIG51bWJlcnMKKwkJCQkJCQlwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCQkgICAgbV9iUmVjU2VxTnVtID0KKwkJCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJCSAgICAoJnBSZWNGcmFtZV9wLT4KKwkJCQkJCQkgICAgIG1fbGVfYlJlY1NlcU51bUNvbik7CisJCQkJCQkJcEFzeVNkb1NlcUNvbi0+CisJCQkJCQkJICAgIG1fYlNlbmRTZXFOdW0gPQorCQkJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkJICAgICgmcFJlY0ZyYW1lX3AtPgorCQkJCQkJCSAgICAgbV9sZV9iU2VuZFNlcU51bUNvbik7CisKKwkJCQkJCQkvLyBzZXQgcmNvbiBhbmQgc2NvbiB0byAwCisJCQkJCQkJcEFzeVNkb1NlcUNvbi0+CisJCQkJCQkJICAgIG1fYlNlbmRTZXFOdW0gJj0KKwkJCQkJCQkgICAgRVBMX1NFUV9OVU1fTUFTSzsKKwkJCQkJCQlwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCQkgICAgbV9iUmVjU2VxTnVtICY9CisJCQkJCQkJICAgIEVQTF9TRVFfTlVNX01BU0s7CisJCQkJCQkJLy8gc2VuZCBmcmFtZQorCQkJCQkJCUVwbFNkb0FzeVNlcVNlbmRJbnRlcm4KKwkJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sIDAsCisJCQkJCQkJICAgICBOVUxMLCBGQUxTRSk7CisJCQkJCQl9CisJCQkJCQkvLyBjYWxsIENvbW1hbmQgTGF5ZXIgQ2IKKwkJCQkJCUFzeVNkb1NlcXVJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fZnBTZG9Db21Db25DYgorCQkJCQkJICAgIChTZG9TZXFDb25IZGwsCisJCQkJCQkgICAgIGtBc3lTZG9Db25TdGF0ZUluaXRFcnJvcik7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gdGltZW91dAorCQkJY2FzZSBrQXN5U2RvU2VxRXZlbnRUaW1lb3V0OgorCQkJCXsJLy8gZXJyb3IgLT4gQ2xvc2UKKwkJCQkJcEFzeVNkb1NlcUNvbi0+bV9TZG9TdGF0ZSA9CisJCQkJCSAgICBrRXBsQXN5U2RvU3RhdGVJZGxlOworCisJCQkJCS8vIHNldCByY29uIGFuZCBzY29uIHRvIDAKKwkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iU2VuZFNlcU51bSAmPQorCQkJCQkgICAgRVBMX1NFUV9OVU1fTUFTSzsKKwkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iUmVjU2VxTnVtICY9CisJCQkJCSAgICBFUExfU0VRX05VTV9NQVNLOworCQkJCQkvLyBzZW5kIGZyYW1lCisJCQkJCUVwbFNkb0FzeVNlcVNlbmRJbnRlcm4ocEFzeVNkb1NlcUNvbiwKKwkJCQkJCQkgICAgICAgMCwgTlVMTCwgRkFMU0UpOworCQkJCQkvLyBjYWxsIENvbW1hbmQgTGF5ZXIgQ2IKKwkJCQkJQXN5U2RvU2VxdUluc3RhbmNlX2cuCisJCQkJCSAgICBtX2ZwU2RvQ29tQ29uQ2IoU2RvU2VxQ29uSGRsLAorCQkJCQkJCSAgICBrQXN5U2RvQ29uU3RhdGVJbml0RXJyb3IpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJLy8gZC5rLiBkbyBub3RoaW5nCisJCQkJYnJlYWs7CisKKwkJCX0JLy8gZW5kIG9mIHN3aXRjaChFdmVudF9wKQorCQkJYnJlYWs7CisJCX0KKworCQkvLyBpbml0IGNvbm5lY3Rpb24gc3RlcCAyCisJY2FzZSBrRXBsQXN5U2RvU3RhdGVJbml0MjoKKwkJeworLy8gICAgICAgICAgICBQUklOVEYwKCJFcGxTZG9Bc3lTZXF1OiBTdGF0ZUluaXQyXG4iKTsKKworCQkJLy8gY2hlY2sgZXZlbnQKKwkJCXN3aXRjaCAoRXZlbnRfcCkgeworCQkJCS8vIGZyYW1lIHJlY2VpdmVkCisJCQljYXNlIGtBc3lTZG9TZXFFdmVudEZyYW1lUmVjOgorCQkJCXsKKwkJCQkJLy8gY2hlY2sgc2NvbiA9PSAyIGFuZCByY29uID09IDEKKwkJCQkJaWYgKCgocFJlY0ZyYW1lX3AtPgorCQkJCQkgICAgICBtX2xlX2JSZWNTZXFOdW1Db24gJgorCQkJCQkgICAgICBFUExfQVNZX1NET19DT05fTUFTSykgPT0gMHgwMSkKKwkJCQkJICAgICYmICgocFJlY0ZyYW1lX3AtPm1fbGVfYlNlbmRTZXFOdW1Db24gJiBFUExfQVNZX1NET19DT05fTUFTSykgPT0gMHgwMikpIHsJLy8gY3JlYXRlIGFuc3dlciBvd24gcmNvbiA9IDIKKwkJCQkJCS8vIHNhdmUgc2VxdWVuY2UgbnVtYmVycworCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iUmVjU2VxTnVtID0KKwkJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkgICAgKCZwUmVjRnJhbWVfcC0+CisJCQkJCQkgICAgIG1fbGVfYlJlY1NlcU51bUNvbik7CisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JTZW5kU2VxTnVtID0KKwkJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkgICAgKCZwUmVjRnJhbWVfcC0+CisJCQkJCQkgICAgIG1fbGVfYlNlbmRTZXFOdW1Db24pOworCisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JSZWNTZXFOdW0rKzsKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2VuZEludGVybgorCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLCAwLCBOVUxMLAorCQkJCQkJICAgICBGQUxTRSk7CisJCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJZ290byBFeGl0OworCQkJCQkJfQorCQkJCQkJLy8gY2hhbmdlIHN0YXRlIHRvIGtFcGxBc3lTZG9TdGF0ZUNvbm5lY3RlZAorCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9TZG9TdGF0ZSA9CisJCQkJCQkgICAga0VwbEFzeVNkb1N0YXRlQ29ubmVjdGVkOworCisJCQkJCQkvLyBzZXQgdGltZXIKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2V0VGltZXIKKwkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwKKwkJCQkJCSAgICAgRVBMX1NFUV9ERUZBVUxUX1RJTUVPVVQpOworCisJCQkJCQkvLyBjYWxsIENvbW1hbmQgTGF5ZXIgQ2IKKwkJCQkJCUFzeVNkb1NlcXVJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fZnBTZG9Db21Db25DYgorCQkJCQkJICAgIChTZG9TZXFDb25IZGwsCisJCQkJCQkgICAgIGtBc3lTZG9Db25TdGF0ZUNvbm5lY3RlZCk7CisKKwkJCQkJfQorCQkJCQkvLyBjaGVjayBzY29uID09IDEgYW5kIHJjb24gPT0gMSwgaS5lLiBvdGhlciBzaWRlIHdhbnRzIG1lIHRvIGluaXRpYXRlIHRoZSBjb25uZWN0aW9uCisJCQkJCWVsc2UgaWYgKCgocFJlY0ZyYW1lX3AtPgorCQkJCQkJICAgbV9sZV9iUmVjU2VxTnVtQ29uICYKKwkJCQkJCSAgIEVQTF9BU1lfU0RPX0NPTl9NQVNLKSA9PQorCQkJCQkJICAweDAxKQorCQkJCQkJICYmCisJCQkJCQkgKChwUmVjRnJhbWVfcC0+CisJCQkJCQkgICBtX2xlX2JTZW5kU2VxTnVtQ29uICYKKwkJCQkJCSAgIEVQTF9BU1lfU0RPX0NPTl9NQVNLKSA9PQorCQkJCQkJICAweDAxKSkgeworCQkJCQkJLy8gc2F2ZSBzZXF1ZW5jZSBudW1iZXJzCisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JSZWNTZXFOdW0gPQorCQkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCSAgICAoJnBSZWNGcmFtZV9wLT4KKwkJCQkJCSAgICAgbV9sZV9iUmVjU2VxTnVtQ29uKTsKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlNlbmRTZXFOdW0gPQorCQkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCSAgICAoJnBSZWNGcmFtZV9wLT4KKwkJCQkJCSAgICAgbV9sZV9iU2VuZFNlcU51bUNvbik7CisJCQkJCQkvLyBjcmVhdGUgYW5zd2VyIGFuZCBzZW5kIGFuc3dlcgorCQkJCQkJLy8gc2V0IHJjb24gdG8gMSAoaW4gc2VuZCBkaXJlY3Rpb24gb3duIHNjb24pCisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JSZWNTZXFOdW0rKzsKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2VuZEludGVybgorCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLCAwLCBOVUxMLAorCQkJCQkJICAgICBGQUxTRSk7CisJCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJZ290byBFeGl0OworCQkJCQkJfQorCQkJCQkJLy8gc2V0IHRpbWVyCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbFNkb0FzeVNlcVNldFRpbWVyCisJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sCisJCQkJCQkgICAgIEVQTF9TRVFfREVGQVVMVF9USU1FT1VUKTsKKwkJCQkJCS8vIGNoYW5nZSBzdGF0ZSB0byBrRXBsQXN5U2RvU3RhdGVJbml0MworCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9TZG9TdGF0ZSA9CisJCQkJCQkgICAga0VwbEFzeVNkb1N0YXRlSW5pdDM7CisKKwkJCQkJfSBlbHNlIHsJLy8gZXJyb3IgLT4gQ2xvc2UKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fU2RvU3RhdGUgPQorCQkJCQkJICAgIGtFcGxBc3lTZG9TdGF0ZUlkbGU7CisJCQkJCQkvLyBkZWxldGUgdGltZXIKKwkJCQkJCUVwbFRpbWVydURlbGV0ZVRpbWVyCisJCQkJCQkgICAgKCZwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCSAgICAgbV9FcGxUaW1lckhkbCk7CisJCQkJCQlpZiAoKChwUmVjRnJhbWVfcC0+CisJCQkJCQkgICAgICBtX2xlX2JSZWNTZXFOdW1Db24gJgorCQkJCQkJICAgICAgRVBMX0FTWV9TRE9fQ09OX01BU0spICE9CisJCQkJCQkgICAgIDB4MDApCisJCQkJCQkgICAgfHwgKChwUmVjRnJhbWVfcC0+bV9sZV9iU2VuZFNlcU51bUNvbiAmIEVQTF9BU1lfU0RPX0NPTl9NQVNLKSAhPSAweDAwKSkgewkvLyBkLmsuIG9ubHkgYW5zd2VyIHdpdGggY2xvc2UgbWVzc2FnZSBpZiB0aGUgbWVzc2FnZSBzZW50IHdhcyBub3QgYSBjbG9zZSBtZXNzYWdlCisJCQkJCQkJLy8gc2F2ZSBzZXF1ZW5jZSBudW1iZXJzCisJCQkJCQkJcEFzeVNkb1NlcUNvbi0+CisJCQkJCQkJICAgIG1fYlJlY1NlcU51bSA9CisJCQkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCQkgICAgKCZwUmVjRnJhbWVfcC0+CisJCQkJCQkJICAgICBtX2xlX2JSZWNTZXFOdW1Db24pOworCQkJCQkJCXBBc3lTZG9TZXFDb24tPgorCQkJCQkJCSAgICBtX2JTZW5kU2VxTnVtID0KKwkJCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJCSAgICAoJnBSZWNGcmFtZV9wLT4KKwkJCQkJCQkgICAgIG1fbGVfYlNlbmRTZXFOdW1Db24pOworCQkJCQkJCS8vIHNldCByY29uIGFuZCBzY29uIHRvIDAKKwkJCQkJCQlwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCQkgICAgbV9iU2VuZFNlcU51bSAmPQorCQkJCQkJCSAgICBFUExfU0VRX05VTV9NQVNLOworCQkJCQkJCXBBc3lTZG9TZXFDb24tPgorCQkJCQkJCSAgICBtX2JSZWNTZXFOdW0gJj0KKwkJCQkJCQkgICAgRVBMX1NFUV9OVU1fTUFTSzsKKwkJCQkJCQkvLyBzZW5kIGZyYW1lCisJCQkJCQkJRXBsU2RvQXN5U2VxU2VuZEludGVybgorCQkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwgMCwKKwkJCQkJCQkgICAgIE5VTEwsIEZBTFNFKTsKKwkJCQkJCX0KKwkJCQkJCS8vIGNhbGwgQ29tbWFuZCBMYXllciBDYgorCQkJCQkJQXN5U2RvU2VxdUluc3RhbmNlX2cuCisJCQkJCQkgICAgbV9mcFNkb0NvbUNvbkNiCisJCQkJCQkgICAgKFNkb1NlcUNvbkhkbCwKKwkJCQkJCSAgICAga0FzeVNkb0NvblN0YXRlSW5pdEVycm9yKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyB0aW1lb3V0CisJCQljYXNlIGtBc3lTZG9TZXFFdmVudFRpbWVvdXQ6CisJCQkJewkvLyBlcnJvciAtPiBDbG9zZQorCQkJCQlwQXN5U2RvU2VxQ29uLT5tX1Nkb1N0YXRlID0KKwkJCQkJICAgIGtFcGxBc3lTZG9TdGF0ZUlkbGU7CisJCQkJCS8vIHNldCByY29uIGFuZCBzY29uIHRvIDAKKwkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iU2VuZFNlcU51bSAmPQorCQkJCQkgICAgRVBMX1NFUV9OVU1fTUFTSzsKKwkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iUmVjU2VxTnVtICY9CisJCQkJCSAgICBFUExfU0VRX05VTV9NQVNLOworCQkJCQkvLyBzZW5kIGZyYW1lCisJCQkJCUVwbFNkb0FzeVNlcVNlbmRJbnRlcm4ocEFzeVNkb1NlcUNvbiwKKwkJCQkJCQkgICAgICAgMCwgTlVMTCwgRkFMU0UpOworCisJCQkJCS8vIGNhbGwgQ29tbWFuZCBMYXllciBDYgorCQkJCQlBc3lTZG9TZXF1SW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fZnBTZG9Db21Db25DYihTZG9TZXFDb25IZGwsCisJCQkJCQkJICAgIGtBc3lTZG9Db25TdGF0ZUluaXRFcnJvcik7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQkvLyBkLmsuIGRvIG5vdGhpbmcKKwkJCQlicmVhazsKKworCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKEV2ZW50X3ApCisJCQlicmVhazsKKwkJfQorCisJCS8vIGluaXQgY29ubmVjdGlvbiBzdGVwIDMKKwljYXNlIGtFcGxBc3lTZG9TdGF0ZUluaXQzOgorCQl7CisJCQkvLyBjaGVjayBldmVudAorCQkJc3dpdGNoIChFdmVudF9wKSB7CisJCQkJLy8gZnJhbWUgcmVjZWl2ZWQKKwkJCWNhc2Uga0FzeVNkb1NlcUV2ZW50RnJhbWVSZWM6CisJCQkJeworCQkJCQkvLyBjaGVjayBzY29uID09IDIgYW5kIHJjb24gPT0gMgorCQkJCQlpZiAoKChwUmVjRnJhbWVfcC0+CisJCQkJCSAgICAgIG1fbGVfYlJlY1NlcU51bUNvbiAmCisJCQkJCSAgICAgIEVQTF9BU1lfU0RPX0NPTl9NQVNLKSA9PSAweDAyKQorCQkJCQkgICAgJiYKKwkJCQkJICAgICgocFJlY0ZyYW1lX3AtPgorCQkJCQkgICAgICBtX2xlX2JTZW5kU2VxTnVtQ29uICYKKwkJCQkJICAgICAgRVBMX0FTWV9TRE9fQ09OX01BU0spID09IDB4MDIpKSB7CisJCQkJCQkvLyBzYXZlIHNlcXVlbmNlIG51bWJlcnMKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlJlY1NlcU51bSA9CisJCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJICAgICgmcFJlY0ZyYW1lX3AtPgorCQkJCQkJICAgICBtX2xlX2JSZWNTZXFOdW1Db24pOworCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iU2VuZFNlcU51bSA9CisJCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJICAgICgmcFJlY0ZyYW1lX3AtPgorCQkJCQkJICAgICBtX2xlX2JTZW5kU2VxTnVtQ29uKTsKKwkJCQkJCS8vIGNoYW5nZSBzdGF0ZSB0byBrRXBsQXN5U2RvU3RhdGVDb25uZWN0ZWQKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fU2RvU3RhdGUgPQorCQkJCQkJICAgIGtFcGxBc3lTZG9TdGF0ZUNvbm5lY3RlZDsKKworCQkJCQkJLy8gc2V0IHRpbWVyCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbFNkb0FzeVNlcVNldFRpbWVyCisJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sCisJCQkJCQkgICAgIEVQTF9TRVFfREVGQVVMVF9USU1FT1VUKTsKKwkJCQkJCS8vIGNhbGwgQ29tbWFuZCBMYXllciBDYgorCQkJCQkJQXN5U2RvU2VxdUluc3RhbmNlX2cuCisJCQkJCQkgICAgbV9mcFNkb0NvbUNvbkNiCisJCQkJCQkgICAgKFNkb1NlcUNvbkhkbCwKKwkJCQkJCSAgICAga0FzeVNkb0NvblN0YXRlQ29ubmVjdGVkKTsKKworCQkJCQl9CisJCQkJCS8vIGNoZWNrIHNjb24gPT0gMiBhbmQgcmNvbiA9PSAxCisJCQkJCWVsc2UgaWYgKCgocFJlY0ZyYW1lX3AtPgorCQkJCQkJICAgbV9sZV9iUmVjU2VxTnVtQ29uICYKKwkJCQkJCSAgIEVQTF9BU1lfU0RPX0NPTl9NQVNLKSA9PQorCQkJCQkJICAweDAxKQorCQkJCQkJICYmICgocFJlY0ZyYW1lX3AtPm1fbGVfYlNlbmRTZXFOdW1Db24gJiBFUExfQVNZX1NET19DT05fTUFTSykgPT0gMHgwMikpIHsJLy8gY3JlYXRlIGFuc3dlciBvd24gcmNvbiA9IDIKKwkJCQkJCS8vIHNhdmUgc2VxdWVuY2UgbnVtYmVycworCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iUmVjU2VxTnVtID0KKwkJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkgICAgKCZwUmVjRnJhbWVfcC0+CisJCQkJCQkgICAgIG1fbGVfYlJlY1NlcU51bUNvbik7CisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JTZW5kU2VxTnVtID0KKwkJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkgICAgKCZwUmVjRnJhbWVfcC0+CisJCQkJCQkgICAgIG1fbGVfYlNlbmRTZXFOdW1Db24pOworCisJCQkJCQlwQXN5U2RvU2VxQ29uLT5tX2JSZWNTZXFOdW0rKzsKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2VuZEludGVybgorCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLCAwLCBOVUxMLAorCQkJCQkJICAgICBGQUxTRSk7CisJCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJZ290byBFeGl0OworCQkJCQkJfQorCQkJCQkJLy8gY2hhbmdlIHN0YXRlIHRvIGtFcGxBc3lTZG9TdGF0ZUNvbm5lY3RlZAorCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9TZG9TdGF0ZSA9CisJCQkJCQkgICAga0VwbEFzeVNkb1N0YXRlQ29ubmVjdGVkOworCisJCQkJCQkvLyBzZXQgdGltZXIKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2V0VGltZXIKKwkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwKKwkJCQkJCSAgICAgRVBMX1NFUV9ERUZBVUxUX1RJTUVPVVQpOworCisJCQkJCQkvLyBjYWxsIENvbW1hbmQgTGF5ZXIgQ2IKKwkJCQkJCUFzeVNkb1NlcXVJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fZnBTZG9Db21Db25DYgorCQkJCQkJICAgIChTZG9TZXFDb25IZGwsCisJCQkJCQkgICAgIGtBc3lTZG9Db25TdGF0ZUNvbm5lY3RlZCk7CisKKwkJCQkJfSBlbHNlIHsJLy8gZXJyb3IgLT4gQ2xvc2UKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fU2RvU3RhdGUgPQorCQkJCQkJICAgIGtFcGxBc3lTZG9TdGF0ZUlkbGU7CisJCQkJCQkvLyBkZWxldGUgdGltZXIKKwkJCQkJCUVwbFRpbWVydURlbGV0ZVRpbWVyCisJCQkJCQkgICAgKCZwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCSAgICAgbV9FcGxUaW1lckhkbCk7CisJCQkJCQlpZiAoKChwUmVjRnJhbWVfcC0+CisJCQkJCQkgICAgICBtX2xlX2JSZWNTZXFOdW1Db24gJgorCQkJCQkJICAgICAgRVBMX0FTWV9TRE9fQ09OX01BU0spICE9CisJCQkJCQkgICAgIDB4MDApCisJCQkJCQkgICAgfHwgKChwUmVjRnJhbWVfcC0+bV9sZV9iU2VuZFNlcU51bUNvbiAmIEVQTF9BU1lfU0RPX0NPTl9NQVNLKSAhPSAweDAwKSkgewkvLyBkLmsuIG9ubHkgYW5zd2VyIHdpdGggY2xvc2UgbWVzc2FnZSBpZiB0aGUgbWVzc2FnZSBzZW50IHdhcyBub3QgYSBjbG9zZSBtZXNzYWdlCisJCQkJCQkJLy8gc2F2ZSBzZXF1ZW5jZSBudW1iZXJzCisJCQkJCQkJcEFzeVNkb1NlcUNvbi0+CisJCQkJCQkJICAgIG1fYlJlY1NlcU51bSA9CisJCQkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJCQkgICAgKCZwUmVjRnJhbWVfcC0+CisJCQkJCQkJICAgICBtX2xlX2JSZWNTZXFOdW1Db24pOworCQkJCQkJCXBBc3lTZG9TZXFDb24tPgorCQkJCQkJCSAgICBtX2JTZW5kU2VxTnVtID0KKwkJCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJCSAgICAoJnBSZWNGcmFtZV9wLT4KKwkJCQkJCQkgICAgIG1fbGVfYlNlbmRTZXFOdW1Db24pOworCQkJCQkJCS8vIHNldCByY29uIGFuZCBzY29uIHRvIDAKKwkJCQkJCQlwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCQkgICAgbV9iU2VuZFNlcU51bSAmPQorCQkJCQkJCSAgICBFUExfU0VRX05VTV9NQVNLOworCQkJCQkJCXBBc3lTZG9TZXFDb24tPgorCQkJCQkJCSAgICBtX2JSZWNTZXFOdW0gJj0KKwkJCQkJCQkgICAgRVBMX1NFUV9OVU1fTUFTSzsKKwkJCQkJCQkvLyBzZW5kIGZyYW1lCisJCQkJCQkJRXBsU2RvQXN5U2VxU2VuZEludGVybgorCQkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwgMCwKKwkJCQkJCQkgICAgIE5VTEwsIEZBTFNFKTsKKwkJCQkJCX0KKwkJCQkJCS8vIGNhbGwgQ29tbWFuZCBMYXllciBDYgorCQkJCQkJQXN5U2RvU2VxdUluc3RhbmNlX2cuCisJCQkJCQkgICAgbV9mcFNkb0NvbUNvbkNiCisJCQkJCQkgICAgKFNkb1NlcUNvbkhkbCwKKwkJCQkJCSAgICAga0FzeVNkb0NvblN0YXRlSW5pdEVycm9yKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyB0aW1lb3V0CisJCQljYXNlIGtBc3lTZG9TZXFFdmVudFRpbWVvdXQ6CisJCQkJewkvLyBlcnJvciAtPiBDbG9zZQorCQkJCQlwQXN5U2RvU2VxQ29uLT5tX1Nkb1N0YXRlID0KKwkJCQkJICAgIGtFcGxBc3lTZG9TdGF0ZUlkbGU7CisJCQkJCS8vIHNldCByY29uIGFuZCBzY29uIHRvIDAKKwkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iU2VuZFNlcU51bSAmPQorCQkJCQkgICAgRVBMX1NFUV9OVU1fTUFTSzsKKwkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iUmVjU2VxTnVtICY9CisJCQkJCSAgICBFUExfU0VRX05VTV9NQVNLOworCQkJCQkvLyBzZW5kIGZyYW1lCisJCQkJCUVwbFNkb0FzeVNlcVNlbmRJbnRlcm4ocEFzeVNkb1NlcUNvbiwKKwkJCQkJCQkgICAgICAgMCwgTlVMTCwgRkFMU0UpOworCisJCQkJCS8vIGNhbGwgQ29tbWFuZCBMYXllciBDYgorCQkJCQlBc3lTZG9TZXF1SW5zdGFuY2VfZy4KKwkJCQkJICAgIG1fZnBTZG9Db21Db25DYihTZG9TZXFDb25IZGwsCisJCQkJCQkJICAgIGtBc3lTZG9Db25TdGF0ZUluaXRFcnJvcik7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQkvLyBkLmsuIGRvIG5vdGhpbmcKKwkJCQlicmVhazsKKworCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKEV2ZW50X3ApCisJCQlicmVhazsKKwkJfQorCisJCS8vIGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQKKwljYXNlIGtFcGxBc3lTZG9TdGF0ZUNvbm5lY3RlZDoKKwkJeworCQkJLy8gY2hlY2sgZXZlbnQKKwkJCXN3aXRjaCAoRXZlbnRfcCkgeworCisJCQkJLy8gZnJhbWUgdG8gc2VuZAorCQkJY2FzZSBrQXN5U2RvU2VxRXZlbnRGcmFtZVNlbmQ6CisJCQkJeworCQkJCQkvLyBzZXQgdGltZXIKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbFNkb0FzeVNlcVNldFRpbWVyKHBBc3lTZG9TZXFDb24sCisJCQkJCQkJCSBFUExfU0VRX0RFRkFVTFRfVElNRU9VVCk7CisJCQkJCS8vIGNoZWNrIGlmIGRhdGEgZnJhbWUgb3IgYWNrCisJCQkJCWlmIChwRGF0YV9wID09IE5VTEwpIHsJLy8gc2VuZCBhY2sKKwkJCQkJCS8vIGluYyBzY29uCisJCQkJCQkvL3BBc3lTZG9TZXFDb24tPm1fYlJlY1NlcU51bSArPSA0OworCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZW5kSW50ZXJuCisJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sIDAsIE5VTEwsCisJCQkJCQkgICAgIEZBTFNFKTsKKwkJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CS8vIHNlbmQgZGF0YWZyYW1lCisJCQkJCQkvLyBpbmNyZW1lbnQgc2VuZCBzZXF1ZW5jZSBudW1iZXIKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlJlY1NlcU51bSArPQorCQkJCQkJICAgIDQ7CisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbFNkb0FzeVNlcVNlbmRJbnRlcm4KKwkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwKKwkJCQkJCSAgICAgdWlEYXRhU2l6ZV9wLCBwRGF0YV9wLAorCQkJCQkJICAgICBUUlVFKTsKKwkJCQkJCWlmIChSZXQgPT0ga0VwbFNkb1NlcVJlcXVlc3RBY2tOZWVkZWQpIHsJLy8gcmVxdWVzdCBhY2sKKwkJCQkJCQkvLyBjaGFuZ2Ugc3RhdGUgdG8gd2FpdCBhY2sKKwkJCQkJCQlwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCQkgICAgbV9TZG9TdGF0ZSA9CisJCQkJCQkJICAgIGtFcGxBc3lTZG9TdGF0ZVdhaXRBY2s7CisJCQkJCQkJLy8gc2V0IFJldCB0byBrRXBsU3VjY2Vzc2Z1bCwgYmVjYXVzZSBubyBlcnJvcgorCQkJCQkJCS8vIGZvciBoaWdoZXIgbGF5ZXIKKwkJCQkJCQlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCQkJCQkJfSBlbHNlIGlmIChSZXQgIT0KKwkJCQkJCQkgICBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJLy8gY2FsbCBDb21tYW5kIExheWVyIENiCisJCQkJCQkJQXN5U2RvU2VxdUluc3RhbmNlX2cuCisJCQkJCQkJICAgIG1fZnBTZG9Db21Db25DYgorCQkJCQkJCSAgICAoU2RvU2VxQ29uSGRsLAorCQkJCQkJCSAgICAga0FzeVNkb0NvblN0YXRlRnJhbWVTZW5kZWQpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0JLy8gZW5kIG9mIGNhc2Uga0FzeVNkb1NlcUV2ZW50RnJhbWVTZW5kCisKKwkJCQkvLyBmcmFtZSByZWNlaXZlZAorCQkJY2FzZSBrQXN5U2RvU2VxRXZlbnRGcmFtZVJlYzoKKwkJCQl7CisJCQkJCUJZVEUgYlNlbmRTZXFOdW1Db24gPQorCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZSgmcFJlY0ZyYW1lX3AtPgorCQkJCQkJCSAgICAgbV9sZV9iU2VuZFNlcU51bUNvbik7CisKKwkJCQkJLy8gc2V0IHRpbWVyCisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZXRUaW1lcihwQXN5U2RvU2VxQ29uLAorCQkJCQkJCQkgRVBMX1NFUV9ERUZBVUxUX1RJTUVPVVQpOworCQkJCQkvLyBjaGVjayBzY29uCisJCQkJCXN3aXRjaCAoYlNlbmRTZXFOdW1Db24gJgorCQkJCQkJRVBMX0FTWV9TRE9fQ09OX01BU0spIHsKKwkJCQkJCS8vIGNsb3NlIGZyb20gb3RoZXIgbm9kZQorCQkJCQljYXNlIDA6CisJCQkJCWNhc2UgMToKKwkJCQkJCXsKKwkJCQkJCQkvLyByZXR1cm4gdG8gaWRsZQorCQkJCQkJCXBBc3lTZG9TZXFDb24tPgorCQkJCQkJCSAgICBtX1Nkb1N0YXRlID0KKwkJCQkJCQkgICAga0VwbEFzeVNkb1N0YXRlSWRsZTsKKwkJCQkJCQkvLyBkZWxldGUgdGltZXIKKwkJCQkJCQlFcGxUaW1lcnVEZWxldGVUaW1lcgorCQkJCQkJCSAgICAoJnBBc3lTZG9TZXFDb24tPgorCQkJCQkJCSAgICAgbV9FcGxUaW1lckhkbCk7CisJCQkJCQkJLy8gY2FsbCBDb21tYW5kIExheWVyIENiCisJCQkJCQkJQXN5U2RvU2VxdUluc3RhbmNlX2cuCisJCQkJCQkJICAgIG1fZnBTZG9Db21Db25DYgorCQkJCQkJCSAgICAoU2RvU2VxQ29uSGRsLAorCQkJCQkJCSAgICAga0FzeVNkb0NvblN0YXRlQ29uQ2xvc2VkKTsKKworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCisJCQkJCQkvLyBSZXF1ZXN0IEFjayBvciBFcnJvciBBY2sKKwkJCQkJCS8vIHBvc3NpYmxlIGNvbnRhaW4gZGF0YQorCQkJCQljYXNlIDM6CisJCQkJCQkvLyBub3JtYWwgZnJhbWUKKwkJCQkJY2FzZSAyOgorCQkJCQkJeworCQkJCQkJCWlmICgoQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJCSAgICAgKCZwUmVjRnJhbWVfcC0+CisJCQkJCQkJICAgICAgbV9sZV9iUmVjU2VxTnVtQ29uKQorCQkJCQkJCSAgICAgJgorCQkJCQkJCSAgICAgRVBMX0FTWV9TRE9fQ09OX01BU0spCisJCQkJCQkJICAgID09IDMpIHsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklOVEYwKCJFcGxTZG9Bc3lTZXF1OiBlcnJvciByZXNwb25zZSByZWNlaXZlZFxuIik7CisKKwkJCQkJCQkJLy8gZXJyb3IgcmVzcG9uc2UgKHJldHJhbnNtaXNzaW9uIHJlcXVlc3QpCisJCQkJCQkJCS8vIHJlc2VuZCBmcmFtZXMgZnJvbSBoaXN0b3J5CisKKwkJCQkJCQkJLy8gcmVhZCBmcmFtZSBmcm9tIGhpc3RvcnkKKwkJCQkJCQkJUmV0ID0KKwkJCQkJCQkJICAgIEVwbFNkb0FzeVJlYWRGcm9tSGlzdG9yeQorCQkJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sCisJCQkJCQkJCSAgICAgJnBFcGxGcmFtZSwKKwkJCQkJCQkJICAgICAmdWlGcmFtZVNpemUsCisJCQkJCQkJCSAgICAgVFJVRSk7CisJCQkJCQkJCWlmIChSZXQgIT0KKwkJCQkJCQkJICAgIGtFcGxTdWNjZXNzZnVsKQorCQkJCQkJCQl7CisJCQkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQkJCX0KKworCQkJCQkJCQl3aGlsZSAoKHBFcGxGcmFtZSAhPSBOVUxMKQorCQkJCQkJCQkgICAgICAgJiYKKwkJCQkJCQkJICAgICAgICh1aUZyYW1lU2l6ZQorCQkJCQkJCQkJIT0gMCkpIHsKKwkJCQkJCQkJCS8vIHNlbmQgZnJhbWUKKwkJCQkJCQkJCVJldCA9CisJCQkJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2VuZExvd2VyTGF5ZXIKKwkJCQkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwKKwkJCQkJCQkJCSAgICAgdWlGcmFtZVNpemUsCisJCQkJCQkJCQkgICAgIHBFcGxGcmFtZSk7CisJCQkJCQkJCQlpZiAoUmV0CisJCQkJCQkJCQkgICAgIT0KKwkJCQkJCQkJCSAgICBrRXBsU3VjY2Vzc2Z1bCkKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQkJCQl9CisJCQkJCQkJCQkvLyByZWFkIG5leHQgZnJhbWUgZnJvbSBoaXN0b3J5CisJCQkJCQkJCQlSZXQgPQorCQkJCQkJCQkJICAgIEVwbFNkb0FzeVJlYWRGcm9tSGlzdG9yeQorCQkJCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLAorCQkJCQkJCQkJICAgICAmcEVwbEZyYW1lLAorCQkJCQkJCQkJICAgICAmdWlGcmFtZVNpemUsCisJCQkJCQkJCQkgICAgIEZBTFNFKTsKKwkJCQkJCQkJCWlmIChSZXQKKwkJCQkJCQkJCSAgICAhPQorCQkJCQkJCQkJICAgIGtFcGxTdWNjZXNzZnVsKQorCQkJCQkJCQkJeworCQkJCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQkvLyBlbmQgb2Ygd2hpbGUoKHBhYkZyYW1lICE9IE5VTEwpCisJCQkJCQkJfQkvLyBlbmQgb2YgaWYgKGVycm9yIHJlc3BvbnNlKQorCisJCQkJCQkJaWYgKCgocEFzeVNkb1NlcUNvbi0+bV9iU2VuZFNlcU51bSArIDQpICYgRVBMX1NFUV9OVU1fTUFTSykgPT0gKGJTZW5kU2VxTnVtQ29uICYgRVBMX1NFUV9OVU1fTUFTSykpIHsJLy8gbmV4dCBmcmFtZSBvZiBzZXF1ZW5jZSByZWNlaXZlZAorCQkJCQkJCQkvLyBzYXZlIHNlbmQgc2VxdWVuY2UgbnVtYmVyICh3aXRob3V0IGFjayByZXF1ZXN0KQorCQkJCQkJCQlwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCQkJICAgIG1fYlNlbmRTZXFOdW0KKwkJCQkJCQkJICAgID0KKwkJCQkJCQkJICAgIGJTZW5kU2VxTnVtQ29uCisJCQkJCQkJCSAgICAmIH4weDAxOworCisJCQkJCQkJCS8vIGNoZWNrIGlmIGFjayBvciBkYXRhLWZyYW1lCisJCQkJCQkJCS8vaWdub3JlIGFjayAtPiBhbHJlYWR5IHByb2Nlc3NlZAorCQkJCQkJCQlpZiAodWlEYXRhU2l6ZV9wCisJCQkJCQkJCSAgICA+CisJCQkJCQkJCSAgICBFUExfU0VRX0hFQURFUl9TSVpFKQorCQkJCQkJCQl7CisJCQkJCQkJCQlBc3lTZG9TZXF1SW5zdGFuY2VfZy4KKwkJCQkJCQkJCSAgICBtX2ZwU2RvQ29tUmVjZWl2ZUNiCisJCQkJCQkJCQkgICAgKFNkb1NlcUNvbkhkbCwKKwkJCQkJCQkJCSAgICAgKCh0RXBsQXN5U2RvQ29tICopICYgcFJlY0ZyYW1lX3AtPm1fbGVfYWJTZG9TZXFQYXlsb2FkKSwgKHVpRGF0YVNpemVfcCAtIEVQTF9TRVFfSEVBREVSX1NJWkUpKTsKKwkJCQkJCQkJCS8vIGNhbGwgQ29tbWFuZCBMYXllciBDYgorCQkJCQkJCQkJQXN5U2RvU2VxdUluc3RhbmNlX2cuCisJCQkJCQkJCQkgICAgbV9mcFNkb0NvbUNvbkNiCisJCQkJCQkJCQkgICAgKFNkb1NlcUNvbkhkbCwKKwkJCQkJCQkJCSAgICAga0FzeVNkb0NvblN0YXRlRnJhbWVTZW5kZWQpOworCisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQkvLyBjYWxsIENvbW1hbmQgTGF5ZXIgQ2IKKwkJCQkJCQkJCUFzeVNkb1NlcXVJbnN0YW5jZV9nLgorCQkJCQkJCQkJICAgIG1fZnBTZG9Db21Db25DYgorCQkJCQkJCQkJICAgIChTZG9TZXFDb25IZGwsCisJCQkJCQkJCQkgICAgIGtBc3lTZG9Db25TdGF0ZUFja1JlY2VpdmVkKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0gZWxzZSBpZiAoKChiU2VuZFNlcU51bUNvbiAtIHBBc3lTZG9TZXFDb24tPm1fYlNlbmRTZXFOdW0gLSA0KSAmIEVQTF9TRVFfTlVNX01BU0spIDwgRVBMX1NFUV9OVU1fVEhSRVNIT0xEKSB7CS8vIGZyYW1lIG9mIHNlcXVlbmNlIHdhcyBsb3N0LAorCQkJCQkJCQkvLyBiZWNhdXNlIGRpZmZlcmVuY2Ugb2YgcmVjZWl2ZWQgYW5kIG9sZCB2YWx1ZQorCQkJCQkJCQkvLyBpcyBsZXNzIHRoZW4gaGFsdmUgb2YgdGhlIHZhbHVlcyByYW5nZS4KKworCQkJCQkJCQkvLyBzZW5kIGVycm9yIGZyYW1lIHdpdGggb3duIHJjb24gPSAzCisJCQkJCQkJCXBBc3lTZG9TZXFDb24tPgorCQkJCQkJCQkgICAgbV9iU2VuZFNlcU51bQorCQkJCQkJCQkgICAgfD0gMHgwMzsKKwkJCQkJCQkJUmV0ID0KKwkJCQkJCQkJICAgIEVwbFNkb0FzeVNlcVNlbmRJbnRlcm4KKwkJCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLAorCQkJCQkJCQkgICAgIDAsIE5VTEwsCisJCQkJCQkJCSAgICAgRkFMU0UpOworCQkJCQkJCQkvLyByZXN0b3JlIHNlbmQgc2VxdWVuY2UgbnVtYmVyCisJCQkJCQkJCXBBc3lTZG9TZXFDb24tPgorCQkJCQkJCQkgICAgbV9iU2VuZFNlcU51bQorCQkJCQkJCQkgICAgPQorCQkJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24tPgorCQkJCQkJCQkgICAgIG1fYlNlbmRTZXFOdW0KKwkJCQkJCQkJICAgICAmCisJCQkJCQkJCSAgICAgRVBMX1NFUV9OVU1fTUFTSykKKwkJCQkJCQkJICAgIHwgMHgwMjsKKwkJCQkJCQkJaWYgKFJldCAhPQorCQkJCQkJCQkgICAga0VwbFN1Y2Nlc3NmdWwpCisJCQkJCQkJCXsKKwkJCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCQkJfQorCQkJCQkJCQkvLyBicmVhayBoZXJlLCBiZWNhdXNlIGEgcmVxdWVzdGVkIGFja25vd2xlZGdlCisJCQkJCQkJCS8vIHdhcyBzZW50IGltcGxpY2l0bHkgYWJvdmUKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJCS8vIGVsc2UsIGlnbm9yZSByZXBlYXRlZCBmcmFtZQorCisJCQkJCQkJaWYgKChiU2VuZFNlcU51bUNvbiAmIEVQTF9BU1lfU0RPX0NPTl9NQVNLKSA9PSAzKSB7CS8vIGFjayByZXF1ZXN0IHJlY2VpdmVkCisKKwkJCQkJCQkJLy8gY3JlYXRlIGFjayB3aXRoIG93biBzY29uID0gMgorCQkJCQkJCQlSZXQgPQorCQkJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2VuZEludGVybgorCQkJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sCisJCQkJCQkJCSAgICAgMCwgTlVMTCwKKwkJCQkJCQkJICAgICBGQUxTRSk7CisJCQkJCQkJCWlmIChSZXQgIT0KKwkJCQkJCQkJICAgIGtFcGxTdWNjZXNzZnVsKQorCQkJCQkJCQl7CisJCQkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKworCQkJCQl9CS8vIHN3aXRjaChwQXN5U2RvU2VxQ29uLT5tX2JTZW5kU2VxTnVtICYgRVBMX0FTWV9TRE9fQ09OX01BU0spCisJCQkJCWJyZWFrOworCQkJCX0JLy8gZW5kIG9mIGNhc2Uga0FzeVNkb1NlcUV2ZW50RnJhbWVSZWM6CisKKwkJCQkvL2Nsb3NlIGV2ZW50IGZyb20gaGlnaGVyIGxheWVyCisJCQljYXNlIGtBc3lTZG9TZXFFdmVudENsb3NlQ29uOgorCQkJCXsKKwkJCQkJcEFzeVNkb1NlcUNvbi0+bV9TZG9TdGF0ZSA9CisJCQkJCSAgICBrRXBsQXN5U2RvU3RhdGVJZGxlOworCQkJCQkvLyBzZXQgcmNvbiBhbmQgc2NvbiB0byAwCisJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlNlbmRTZXFOdW0gJj0KKwkJCQkJICAgIEVQTF9TRVFfTlVNX01BU0s7CisJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlJlY1NlcU51bSAmPQorCQkJCQkgICAgRVBMX1NFUV9OVU1fTUFTSzsKKwkJCQkJLy8gc2VuZCBmcmFtZQorCQkJCQlFcGxTZG9Bc3lTZXFTZW5kSW50ZXJuKHBBc3lTZG9TZXFDb24sCisJCQkJCQkJICAgICAgIDAsIE5VTEwsIEZBTFNFKTsKKworCQkJCQkvLyBkZWxldGUgdGltZXIKKwkJCQkJRXBsVGltZXJ1RGVsZXRlVGltZXIoJnBBc3lTZG9TZXFDb24tPgorCQkJCQkJCSAgICAgbV9FcGxUaW1lckhkbCk7CisJCQkJCS8vIGNhbGwgQ29tbWFuZCBMYXllciBDYiBpcyBub3QgbmVjZXNzYXJ5LCBiZWNhdXNlIHRoZSBldmVudCBjYW1lIGZyb20gdGhlcmUKKy8vICAgICAgICAgICAgICAgICAgICBBc3lTZG9TZXF1SW5zdGFuY2VfZy5tX2ZwU2RvQ29tQ29uQ2IoU2RvU2VxQ29uSGRsLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQXN5U2RvQ29uU3RhdGVJbml0RXJyb3IpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyB0aW1lb3V0CisJCQljYXNlIGtBc3lTZG9TZXFFdmVudFRpbWVvdXQ6CisJCQkJeworCisJCQkJCXVpRnJlZUVudHJpZXMgPQorCQkJCQkgICAgRXBsU2RvQXN5R2V0RnJlZUVudHJpZXNGcm9tSGlzdG9yeQorCQkJCQkgICAgKHBBc3lTZG9TZXFDb24pOworCQkJCQlpZiAoKHVpRnJlZUVudHJpZXMgPAorCQkJCQkgICAgIEVQTF9TRE9fSElTVE9SWV9TSVpFKQorCQkJCQkgICAgJiYgKHBBc3lTZG9TZXFDb24tPm1fdWlSZXRyeUNvdW50IDwgRVBMX1NFUV9SRVRSWV9DT1VOVCkpIHsJLy8gdW5hY2tub3dsZWdkZWQgZnJhbWVzIGluIGhpc3RvcnkKKwkJCQkJCS8vIGFuZCByZXRyeSBjb3VudGVyIG5vdCBleGNlZWRlZAorCisJCQkJCQkvLyByZXNlbmQgZGF0YSB3aXRoIGFja25vd2xlZGdlIHJlcXVlc3QKKworCQkJCQkJLy8gaW5jcmVtZW50IHJldHJ5IGNvdW50ZXIKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fdWlSZXRyeUNvdW50Kys7CisKKwkJCQkJCS8vIHNldCB0aW1lcgorCQkJCQkJUmV0ID0KKwkJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZXRUaW1lcgorCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLAorCQkJCQkJICAgICBFUExfU0VRX0RFRkFVTFRfVElNRU9VVCk7CisKKwkJCQkJCS8vIHJlYWQgZmlyc3QgZnJhbWUgZnJvbSBoaXN0b3J5CisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbFNkb0FzeVJlYWRGcm9tSGlzdG9yeQorCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLCAmcEVwbEZyYW1lLAorCQkJCQkJICAgICAmdWlGcmFtZVNpemUsIFRSVUUpOworCQkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCX0KKworCQkJCQkJaWYgKChwRXBsRnJhbWUgIT0gTlVMTCkKKwkJCQkJCSAgICAmJiAodWlGcmFtZVNpemUgIT0gMCkpIHsKKworCQkJCQkJCS8vIHNldCBhY2sgcmVxdWVzdCBpbiBzY29uCisJCQkJCQkJQW1pU2V0Qnl0ZVRvTGUKKwkJCQkJCQkgICAgKCZwRXBsRnJhbWUtPm1fRGF0YS4KKwkJCQkJCQkgICAgIG1fQXNuZC5tX1BheWxvYWQuCisJCQkJCQkJICAgICBtX1Nkb1NlcXVlbmNlRnJhbWUuCisJCQkJCQkJICAgICBtX2xlX2JTZW5kU2VxTnVtQ29uLAorCQkJCQkJCSAgICAgQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJCSAgICAgKCZwRXBsRnJhbWUtPgorCQkJCQkJCSAgICAgIG1fRGF0YS5tX0FzbmQuCisJCQkJCQkJICAgICAgbV9QYXlsb2FkLgorCQkJCQkJCSAgICAgIG1fU2RvU2VxdWVuY2VGcmFtZS4KKwkJCQkJCQkgICAgICBtX2xlX2JTZW5kU2VxTnVtQ29uKQorCQkJCQkJCSAgICAgfCAweDAzKTsKKworCQkJCQkJCS8vIHNlbmQgZnJhbWUKKwkJCQkJCQlSZXQgPQorCQkJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZW5kTG93ZXJMYXllcgorCQkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwKKwkJCQkJCQkgICAgIHVpRnJhbWVTaXplLAorCQkJCQkJCSAgICAgcEVwbEZyYW1lKTsKKwkJCQkJCQlpZiAoUmV0ICE9CisJCQkJCQkJICAgIGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCQl9CisKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8vIHRpbWVvdXQsIGJlY2F1c2Ugb2Ygbm8gdHJhZmZpYyAtPiBDbG9zZQorCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9TZG9TdGF0ZSA9CisJCQkJCQkgICAga0VwbEFzeVNkb1N0YXRlSWRsZTsKKwkJCQkJCS8vIHNldCByY29uIGFuZCBzY29uIHRvIDAKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fYlNlbmRTZXFOdW0gJj0KKwkJCQkJCSAgICBFUExfU0VRX05VTV9NQVNLOworCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9iUmVjU2VxTnVtICY9CisJCQkJCQkgICAgRVBMX1NFUV9OVU1fTUFTSzsKKwkJCQkJCS8vIHNlbmQgZnJhbWUKKwkJCQkJCUVwbFNkb0FzeVNlcVNlbmRJbnRlcm4KKwkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwgMCwgTlVMTCwKKwkJCQkJCSAgICAgRkFMU0UpOworCisJCQkJCQkvLyBjYWxsIENvbW1hbmQgTGF5ZXIgQ2IKKwkJCQkJCUFzeVNkb1NlcXVJbnN0YW5jZV9nLgorCQkJCQkJICAgIG1fZnBTZG9Db21Db25DYgorCQkJCQkJICAgIChTZG9TZXFDb25IZGwsCisJCQkJCQkgICAgIGtBc3lTZG9Db25TdGF0ZVRpbWVvdXQpOworCQkJCQl9CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCS8vIGQuay4gZG8gbm90aGluZworCQkJCWJyZWFrOworCisJCQl9CS8vIGVuZCBvZiBzd2l0Y2goRXZlbnRfcCkKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gd2FpdCBmb3IgQWNrbm93bGVkZ2UgKGhpc3RvcnkgYnVmZmVyIGZ1bGwpCisJY2FzZSBrRXBsQXN5U2RvU3RhdGVXYWl0QWNrOgorCQl7CisJCQlQUklOVEYwKCJFcGxTZG9Bc3lTZXF1OiBTdGF0ZVdhaXRBY2tcbiIpOworCisJCQkvLyBzZXQgdGltZXIKKwkJCVJldCA9IEVwbFNkb0FzeVNlcVNldFRpbWVyKHBBc3lTZG9TZXFDb24sCisJCQkJCQkgICBFUExfU0VRX0RFRkFVTFRfVElNRU9VVCk7CisKKwkJCS8vVE9ETzogcmV0cnkgb2YgYWNrbm93bGVkZ2UKKwkJCWlmIChFdmVudF9wID09IGtBc3lTZG9TZXFFdmVudEZyYW1lUmVjKSB7CisJCQkJLy8gY2hlY2sgcmNvbgorCQkJCXN3aXRjaCAocFJlY0ZyYW1lX3AtPgorCQkJCQltX2xlX2JSZWNTZXFOdW1Db24gJgorCQkJCQlFUExfQVNZX1NET19DT05fTUFTSykgeworCQkJCQkvLyBjbG9zZS1mcm9tZSBvdGhlciBub2RlCisJCQkJY2FzZSAwOgorCQkJCQl7CisJCQkJCQkvLyByZXR1cm4gdG8gaWRsZQorCQkJCQkJcEFzeVNkb1NlcUNvbi0+bV9TZG9TdGF0ZSA9CisJCQkJCQkgICAga0VwbEFzeVNkb1N0YXRlSWRsZTsKKwkJCQkJCS8vIGRlbGV0ZSB0aW1lcgorCQkJCQkJRXBsVGltZXJ1RGVsZXRlVGltZXIKKwkJCQkJCSAgICAoJnBBc3lTZG9TZXFDb24tPgorCQkJCQkJICAgICBtX0VwbFRpbWVySGRsKTsKKwkJCQkJCS8vIGNhbGwgQ29tbWFuZCBMYXllciBDYgorCQkJCQkJQXN5U2RvU2VxdUluc3RhbmNlX2cuCisJCQkJCQkgICAgbV9mcFNkb0NvbUNvbkNiCisJCQkJCQkgICAgKFNkb1NlcUNvbkhkbCwKKwkJCQkJCSAgICAga0FzeVNkb0NvblN0YXRlQ29uQ2xvc2VkKTsKKworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQkvLyBub3JtYWwgZnJhbWUKKwkJCQljYXNlIDI6CisJCQkJCXsKKwkJCQkJCS8vIHNob3VsZCBiZSBhY2sKKwkJCQkJCS8vIC0+IGNoYW5nZSB0byBzdGF0ZSBrRXBsQXN5U2RvU3RhdGVDb25uZWN0ZWQKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fU2RvU3RhdGUgPQorCQkJCQkJICAgIGtFcGxBc3lTZG9TdGF0ZUNvbm5lY3RlZDsKKwkJCQkJCS8vIGNhbGwgQ29tbWFuZCBMYXllciBDYgorCQkJCQkJQXN5U2RvU2VxdUluc3RhbmNlX2cuCisJCQkJCQkgICAgbV9mcFNkb0NvbUNvbkNiCisJCQkJCQkgICAgKFNkb1NlcUNvbkhkbCwKKwkJCQkJCSAgICAga0FzeVNkb0NvblN0YXRlQWNrUmVjZWl2ZWQpOworCQkJCQkJLy8gc2VuZCBkYXRhIHRvIGhpZ2hlciBsYXllciBpZiBuZWVkZWQKKwkJCQkJCWlmICh1aURhdGFTaXplX3AgPgorCQkJCQkJICAgIEVQTF9TRVFfSEVBREVSX1NJWkUpIHsKKwkJCQkJCQlBc3lTZG9TZXF1SW5zdGFuY2VfZy4KKwkJCQkJCQkgICAgbV9mcFNkb0NvbVJlY2VpdmVDYgorCQkJCQkJCSAgICAoU2RvU2VxQ29uSGRsLAorCQkJCQkJCSAgICAgKCh0RXBsQXN5U2RvQ29tICopCisJCQkJCQkJICAgICAgJiBwUmVjRnJhbWVfcC0+CisJCQkJCQkJICAgICAgbV9sZV9hYlNkb1NlcVBheWxvYWQpLAorCQkJCQkJCSAgICAgKHVpRGF0YVNpemVfcCAtCisJCQkJCQkJICAgICAgRVBMX1NFUV9IRUFERVJfU0laRSkpOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQkvLyBSZXF1ZXN0IEFjayBvciBFcnJvciBBY2sKKwkJCQljYXNlIDM6CisJCQkJCXsKKwkJCQkJCS8vIC0+IGNoYW5nZSB0byBzdGF0ZSBrRXBsQXN5U2RvU3RhdGVDb25uZWN0ZWQKKwkJCQkJCXBBc3lTZG9TZXFDb24tPm1fU2RvU3RhdGUgPQorCQkJCQkJICAgIGtFcGxBc3lTZG9TdGF0ZUNvbm5lY3RlZDsKKworCQkJCQkJaWYgKHBSZWNGcmFtZV9wLT5tX2xlX2JSZWNTZXFOdW1Db24gPT0gcEFzeVNkb1NlcUNvbi0+bV9iUmVjU2VxTnVtKSB7CS8vIGFjayByZXF1ZXN0CisJCQkJCQkJLy8gLT4gc2VuZCBhY2sKKwkJCQkJCQkvLyBzYXZlIHNlcXVlbmNlIG51bWJlcnMKKwkJCQkJCQlwQXN5U2RvU2VxQ29uLT4KKwkJCQkJCQkgICAgbV9iUmVjU2VxTnVtID0KKwkJCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZQorCQkJCQkJCSAgICAoJnBSZWNGcmFtZV9wLT4KKwkJCQkJCQkgICAgIG1fbGVfYlJlY1NlcU51bUNvbik7CisJCQkJCQkJcEFzeVNkb1NlcUNvbi0+CisJCQkJCQkJICAgIG1fYlNlbmRTZXFOdW0gPQorCQkJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkJICAgICgmcFJlY0ZyYW1lX3AtPgorCQkJCQkJCSAgICAgbV9sZV9iU2VuZFNlcU51bUNvbik7CisKKwkJCQkJCQkvLyBjcmVhdGUgYW5zd2VyIG93biByY29uID0gMgorCQkJCQkJCXBBc3lTZG9TZXFDb24tPgorCQkJCQkJCSAgICBtX2JSZWNTZXFOdW0tLTsKKworCQkJCQkJCS8vIGNoZWNrIGlmIGFjayBvciBkYXRhLWZyYW1lCisJCQkJCQkJaWYgKHVpRGF0YVNpemVfcCA+CisJCQkJCQkJICAgIEVQTF9TRVFfSEVBREVSX1NJWkUpCisJCQkJCQkJeworCQkJCQkJCQlBc3lTZG9TZXF1SW5zdGFuY2VfZy4KKwkJCQkJCQkJICAgIG1fZnBTZG9Db21SZWNlaXZlQ2IKKwkJCQkJCQkJICAgIChTZG9TZXFDb25IZGwsCisJCQkJCQkJCSAgICAgKCh0RXBsQXN5U2RvQ29tICopICYgcFJlY0ZyYW1lX3AtPm1fbGVfYWJTZG9TZXFQYXlsb2FkKSwgKHVpRGF0YVNpemVfcCAtIEVQTF9TRVFfSEVBREVSX1NJWkUpKTsKKwkJCQkJCQkJLy8gY2FsbCBDb21tYW5kIExheWVyIENiCisJCQkJCQkJCUFzeVNkb1NlcXVJbnN0YW5jZV9nLgorCQkJCQkJCQkgICAgbV9mcFNkb0NvbUNvbkNiCisJCQkJCQkJCSAgICAoU2RvU2VxQ29uSGRsLAorCQkJCQkJCQkgICAgIGtBc3lTZG9Db25TdGF0ZUZyYW1lU2VuZGVkKTsKKworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCVJldCA9CisJCQkJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZW5kSW50ZXJuCisJCQkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwKKwkJCQkJCQkJICAgICAwLCBOVUxMLAorCQkJCQkJCQkgICAgIEZBTFNFKTsKKwkJCQkJCQkJaWYgKFJldCAhPQorCQkJCQkJCQkgICAga0VwbFN1Y2Nlc3NmdWwpCisJCQkJCQkJCXsKKwkJCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkvLyBlcnJvciBhY2sKKwkJCQkJCQkvLyByZXNlbmQgZnJhbWVzIGZyb20gaGlzdG9yeQorCisJCQkJCQkJLy8gcmVhZCBmcmFtZSBmcm9tIGhpc3RvcnkKKwkJCQkJCQlSZXQgPQorCQkJCQkJCSAgICBFcGxTZG9Bc3lSZWFkRnJvbUhpc3RvcnkKKwkJCQkJCQkgICAgKHBBc3lTZG9TZXFDb24sCisJCQkJCQkJICAgICAmcEVwbEZyYW1lLAorCQkJCQkJCSAgICAgJnVpRnJhbWVTaXplLAorCQkJCQkJCSAgICAgVFJVRSk7CisJCQkJCQkJd2hpbGUgKChwRXBsRnJhbWUgIT0KKwkJCQkJCQkJTlVMTCkKKwkJCQkJCQkgICAgICAgJiYgKHVpRnJhbWVTaXplCisJCQkJCQkJCSAgICE9IDApKSB7CisJCQkJCQkJCS8vIHNlbmQgZnJhbWUKKwkJCQkJCQkJUmV0ID0KKwkJCQkJCQkJICAgIEVwbFNkb0FzeVNlcVNlbmRMb3dlckxheWVyCisJCQkJCQkJCSAgICAocEFzeVNkb1NlcUNvbiwKKwkJCQkJCQkJICAgICB1aUZyYW1lU2l6ZSwKKwkJCQkJCQkJICAgICBwRXBsRnJhbWUpOworCQkJCQkJCQlpZiAoUmV0ICE9CisJCQkJCQkJCSAgICBrRXBsU3VjY2Vzc2Z1bCkKKwkJCQkJCQkJeworCQkJCQkJCQkJZ290byBFeGl0OworCQkJCQkJCQl9CisJCQkJCQkJCS8vIHJlYWQgbmV4dCBmcmFtZQorCisJCQkJCQkJCS8vIHJlYWQgZnJhbWUgZnJvbSBoaXN0b3J5CisJCQkJCQkJCVJldCA9CisJCQkJCQkJCSAgICBFcGxTZG9Bc3lSZWFkRnJvbUhpc3RvcnkKKwkJCQkJCQkJICAgIChwQXN5U2RvU2VxQ29uLAorCQkJCQkJCQkgICAgICZwRXBsRnJhbWUsCisJCQkJCQkJCSAgICAgJnVpRnJhbWVTaXplLAorCQkJCQkJCQkgICAgIEZBTFNFKTsKKwkJCQkJCQl9CS8vIGVuZCBvZiB3aGlsZSgocGFiRnJhbWUgIT0gTlVMTCkKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKHBSZWNGcmFtZV9wLT5tX2xlX2JSZWNTZXFOdW1Db24gJiBFUExfQVNZX1NET19DT05fTUFTSykKKworCQkJfSBlbHNlIGlmIChFdmVudF9wID09IGtBc3lTZG9TZXFFdmVudFRpbWVvdXQpIHsJLy8gZXJyb3IgLT4gQ2xvc2UKKwkJCQlwQXN5U2RvU2VxQ29uLT5tX1Nkb1N0YXRlID0ga0VwbEFzeVNkb1N0YXRlSWRsZTsKKwkJCQkvLyBzZXQgcmNvbiBhbmQgc2NvbiB0byAwCisJCQkJcEFzeVNkb1NlcUNvbi0+bV9iU2VuZFNlcU51bSAmPQorCQkJCSAgICBFUExfU0VRX05VTV9NQVNLOworCQkJCXBBc3lTZG9TZXFDb24tPm1fYlJlY1NlcU51bSAmPSBFUExfU0VRX05VTV9NQVNLOworCQkJCS8vIHNlbmQgZnJhbWUKKwkJCQlFcGxTZG9Bc3lTZXFTZW5kSW50ZXJuKHBBc3lTZG9TZXFDb24sCisJCQkJCQkgICAgICAgMCwgTlVMTCwgRkFMU0UpOworCisJCQkJLy8gY2FsbCBDb21tYW5kIExheWVyIENiCisJCQkJQXN5U2RvU2VxdUluc3RhbmNlX2cuCisJCQkJICAgIG1fZnBTZG9Db21Db25DYihTZG9TZXFDb25IZGwsCisJCQkJCQkgICAga0FzeVNkb0NvblN0YXRlVGltZW91dCk7CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gdW5rbm93biBzdGF0ZQorCWRlZmF1bHQ6CisJCXsKKwkJCUVQTF9EQkdMVkxfU0RPX1RSQUNFMAorCQkJICAgICgiRXJyb3I6IFVua25vd24gU3RhdGUgaW4gRXBsU2RvQXN5U2VxUHJvY2Vzc1xuIik7CisKKwkJfQorCX0JCQkvLyBlbmQgb2Ygc3dpdGNoKHBBc3lTZG9TZXFDb24tPm1fU2RvU3RhdGUpCisKKyAgICAgIEV4aXQ6CisKKyNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMikKKwkvLyBsZWF2ZSBjcml0aWNhbCBzZWN0aW9uIGZvciBwcm9jZXNzIGZ1bmN0aW9uCisJTGVhdmVDcml0aWNhbFNlY3Rpb24oQXN5U2RvU2VxdUluc3RhbmNlX2cubV9wQ3JpdGljYWxTZWN0aW9uKTsKKyNlbmRpZgorCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQXN5U2VxU2VuZEludGVybgorLy8KKy8vIERlc2NyaXB0aW9uOiBpbnRlcm4gZnVuY3Rpb24gdG8gY3JlYXRlIGFuZCBzZW5kIGEgZnJhbWUKKy8vICAgICAgICAgICAgICAtPiBpZiB1aURhdGFTaXplX3AgPT0gMCBjcmVhdGUgYSBmcmFtZSB3aXRoIGluZm9zIGZyb20KKy8vICAgICAgICAgICAgICAgICBwQXN5U2RvU2VxQ29uX3AKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwQXN5U2RvU2VxQ29uX3AgPSBwb2ludGVyIHRvIGNvbnRyb2wgc3RydWN0dXJlIG9mIHRoZSBjb25uZWN0aW9uCisvLyAgICAgICAgICAgICAgdWlEYXRhU2l6ZV9wICAgID0gc2l6ZSBvZiBkYXRhIGZyYW1lIHRvIHByb2Nlc3MgKGNhbiBiZSAwKQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gd2l0aG91dCBzaXplIG9mIHNlcXVlbmNlIGhlYWRlciBhbmQgQXNuZCBoZWFkZXIhISEKKy8vICAgICAgICAgICAgICBwRGF0YV9wICAgICAgICAgPSBwb2ludGVyIHRvIGZyYW1lIHRvIHByb2Nlc3MgKGNhbiBiZSBOVUxMKQorLy8gICAgICAgICAgICAgIGZGcmFtZUluSGlzdG9yeSA9IGlmIFRSVUUgZnJhbWUgaXMgc2F2ZWQgdG8gaGlzdG9yeSBlbHNlIG5vdAorLy8KKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0FzeVNlcVNlbmRJbnRlcm4odEVwbEFzeVNkb1NlcUNvbiAqIHBBc3lTZG9TZXFDb25fcCwKKwkJCQkJIHVuc2lnbmVkIGludCB1aURhdGFTaXplX3AsCisJCQkJCSB0RXBsRnJhbWUgKiBwRGF0YV9wLAorCQkJCQkgQk9PTCBmRnJhbWVJbkhpc3RvcnlfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwlCWVRFIGFiRnJhbWVbRVBMX1NFUV9GUkFNRV9TSVpFXTsKKwl0RXBsRnJhbWUgKnBFcGxGcmFtZTsKKwl1bnNpZ25lZCBpbnQgdWlGcmVlRW50cmllczsKKworCWlmIChwRGF0YV9wID09IE5VTEwpIHsJLy8gc2V0IHBvaW50ZXIgdG8gb3duIGZyYW1lCisJCUVQTF9NRU1TRVQoJmFiRnJhbWVbMF0sIDB4MDAsIHNpemVvZihhYkZyYW1lKSk7CisJCXBFcGxGcmFtZSA9ICh0RXBsRnJhbWUgKikgJiBhYkZyYW1lWzBdOworCX0gZWxzZSB7CQkvLyBzZXQgcG9pbnRlciB0byBmcmFtZSBmcm9tIGNhbGxpbmcgZnVuY3Rpb24KKwkJcEVwbEZyYW1lID0gcERhdGFfcDsKKwl9CisKKwlpZiAoZkZyYW1lSW5IaXN0b3J5X3AgIT0gRkFMU0UpIHsKKwkJLy8gY2hlY2sgaWYgb25seSBvbmUgZnJlZSBlbnRyeSBpbiBoaXN0b3J5IGJ1ZmZlcgorCQl1aUZyZWVFbnRyaWVzID0KKwkJICAgIEVwbFNkb0FzeUdldEZyZWVFbnRyaWVzRnJvbUhpc3RvcnkocEFzeVNkb1NlcUNvbl9wKTsKKwkJaWYgKHVpRnJlZUVudHJpZXMgPT0gMSkgewkvLyByZXF1ZXN0IGFuIGFja25vd2xlZGdlIGluIGRhdGFmcmFtZQorCQkJLy8gb3duIHNjb24gPSAzCisJCQlwQXN5U2RvU2VxQ29uX3AtPm1fYlJlY1NlcU51bSB8PSAweDAzOworCQl9CisJfQorCS8vIGZpbGxpbiBoZWFkZXIgaW5mb3JtYXRpb25zCisJLy8gc2V0IHNlcnZpY2UgaWQgc2RvCisJQW1pU2V0Qnl0ZVRvTGUoJnBFcGxGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX2xlX2JTZXJ2aWNlSWQsIDB4MDUpOworCUFtaVNldEJ5dGVUb0xlKCZwRXBsRnJhbWUtPm1fRGF0YS5tX0FzbmQubV9QYXlsb2FkLm1fU2RvU2VxdWVuY2VGcmFtZS4KKwkJICAgICAgIG1fbGVfYWJSZXNlcnZlZCwgMHgwMCk7CisJLy8gc2V0IHJlY2VpdmUgc2VxdWVuY2UgbnVtYmVyIGFuZCByY29uCisJQW1pU2V0Qnl0ZVRvTGUoJnBFcGxGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQubV9TZG9TZXF1ZW5jZUZyYW1lLgorCQkgICAgICAgbV9sZV9iUmVjU2VxTnVtQ29uLCBwQXN5U2RvU2VxQ29uX3AtPm1fYlNlbmRTZXFOdW0pOworCS8vIHNldCBzZW5kIHNlcXVlbmNlIG51bWJlciBhbmQgc2NvbgorCUFtaVNldEJ5dGVUb0xlKCZwRXBsRnJhbWUtPm1fRGF0YS5tX0FzbmQubV9QYXlsb2FkLm1fU2RvU2VxdWVuY2VGcmFtZS4KKwkJICAgICAgIG1fbGVfYlNlbmRTZXFOdW1Db24sIHBBc3lTZG9TZXFDb25fcC0+bV9iUmVjU2VxTnVtKTsKKworCS8vIGFkZCBzaXplCisJdWlEYXRhU2l6ZV9wICs9IEVQTF9TRVFfSEVBREVSX1NJWkU7CisKKwkvLyBmb3J3YXJkIGZyYW1lIHRvIGFwcHJvcHJpYXRlIGxvd2VyIGxheWVyCisJUmV0ID0gRXBsU2RvQXN5U2VxU2VuZExvd2VyTGF5ZXIocEFzeVNkb1NlcUNvbl9wLCB1aURhdGFTaXplX3AsIHBFcGxGcmFtZSk7CS8vIHBvaW50ZXIgdG8gZnJhbWUKKworCS8vIGNoZWNrIGlmIGFsbCBhbGxyaWdodAorCWlmICgoUmV0ID09IGtFcGxTdWNjZXNzZnVsKQorCSAgICAmJiAoZkZyYW1lSW5IaXN0b3J5X3AgIT0gRkFMU0UpKSB7CisJCS8vIHNldCBvd24gc2NvbiB0byAyIGlmIG5lZWRlZAorCQlpZiAoKHBBc3lTZG9TZXFDb25fcC0+bV9iUmVjU2VxTnVtICYgMHgwMykgPT0gMHgwMykgeworCQkJcEFzeVNkb1NlcUNvbl9wLT5tX2JSZWNTZXFOdW0tLTsKKwkJfQorCQkvLyBzYXZlIGZyYW1lIHRvIGhpc3RvcnkKKwkJUmV0ID0gRXBsU2RvQXN5QWRkRnJhbWVUb0hpc3RvcnkocEFzeVNkb1NlcUNvbl9wLAorCQkJCQkJIHBFcGxGcmFtZSwgdWlEYXRhU2l6ZV9wKTsKKwkJaWYgKFJldCA9PSBrRXBsU2RvU2VxTm9GcmVlSGlzdG9yeSkgewkvLyByZXF1ZXN0IEFjayBuZWVkZWQKKwkJCVJldCA9IGtFcGxTZG9TZXFSZXF1ZXN0QWNrTmVlZGVkOworCQl9CisKKwl9CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9Bc3lTZXFTZW5kTG93ZXJMYXllcgorLy8KKy8vIERlc2NyaXB0aW9uOiBpbnRlcm4gZnVuY3Rpb24gdG8gc2VuZCBhIHByZXZpb3VzbHkgY3JlYXRlZCBmcmFtZSB0byBsb3dlciBsYXllcgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQXN5U2RvU2VxQ29uX3AgPSBwb2ludGVyIHRvIGNvbnRyb2wgc3RydWN0dXJlIG9mIHRoZSBjb25uZWN0aW9uCisvLyAgICAgICAgICAgICAgdWlEYXRhU2l6ZV9wICAgID0gc2l6ZSBvZiBkYXRhIGZyYW1lIHRvIHByb2Nlc3MgKGNhbiBiZSAwKQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gd2l0aG91dCBzaXplIG9mIEFzbmQgaGVhZGVyISEhCisvLyAgICAgICAgICAgICAgcERhdGFfcCAgICAgICAgID0gcG9pbnRlciB0byBmcmFtZSB0byBwcm9jZXNzIChjYW4gYmUgTlVMTCkKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQXN5U2VxU2VuZExvd2VyTGF5ZXIodEVwbEFzeVNkb1NlcUNvbiAqIHBBc3lTZG9TZXFDb25fcCwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlEYXRhU2l6ZV9wLAorCQkJCQkgICAgIHRFcGxGcmFtZSAqIHBFcGxGcmFtZV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJLy8gY2FsbCBzZW5kLWZ1bmN0aW9uCisJLy8gY2hlY2sgaGFuZGxlIGZvciBVRFAgb3IgQXNuZAorCWlmICgocEFzeVNkb1NlcUNvbl9wLT5tX0NvbkhhbmRsZSAmIEVQTF9TRE9fQVNZX0hBTkRMRV9NQVNLKSA9PSBFUExfU0RPX1VEUF9IQU5ETEUpIHsJLy8gc2VuZCBvdmVyIFVEUAorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9fVURQKSkgIT0gMCkKKwkJUmV0ID0gRXBsU2RvVWRwdVNlbmREYXRhKHBBc3lTZG9TZXFDb25fcC0+bV9Db25IYW5kbGUsIHBFcGxGcmFtZV9wLAkvLyBwb2ludGVyIHRvIGZyYW1lCisJCQkJCSB1aURhdGFTaXplX3ApOworI2Vsc2UKKwkJUmV0ID0ga0VwbFNkb1NlcVVuc3VwcG9ydGVkUHJvdDsKKyNlbmRpZgorCisJfSBlbHNlIGlmICgocEFzeVNkb1NlcUNvbl9wLT5tX0NvbkhhbmRsZSAmIEVQTF9TRE9fQVNZX0hBTkRMRV9NQVNLKSA9PSBFUExfU0RPX0FTTkRfSEFORExFKSB7CS8vIEFTTkQKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPX0FTTkQpKSAhPSAwKQorCQlSZXQgPSBFcGxTZG9Bc25kdVNlbmREYXRhKHBBc3lTZG9TZXFDb25fcC0+bV9Db25IYW5kbGUsIHBFcGxGcmFtZV9wLAkvLyBwb2ludGVyIHRvIGZyYW1lCisJCQkJCSAgdWlEYXRhU2l6ZV9wKTsKKyNlbHNlCisJCVJldCA9IGtFcGxTZG9TZXFVbnN1cHBvcnRlZFByb3Q7CisjZW5kaWYKKwl9IGVsc2UgewkJLy8gZXJyb3IKKwkJUmV0ID0ga0VwbFNkb1NlcUludmFsaWRIZGw7CisJfQorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgICAgIEVwbFNkb0FzeVJlY2VpdmVDYgorLy8KKy8vIERlc2NyaXB0aW9uOiAgICAgY2FsbGJhY2stZnVuY3Rpb24gZm9yIHJlY2VpdmVkIGZyYW1lcyBmcm9tIGxvd2VyIGxheWVyCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgICAgIENvbkhkbF9wICAgICAgICA9IGhhbmRsZSBvZiB0aGUgY29ubmVjdGlvbgorLy8gICAgICAgICAgICAgICAgICBwU2RvU2VxRGF0YV9wICAgPSBwb2ludGVyIHRvIGZyYW1lCisvLyAgICAgICAgICAgICAgICAgIHVpRGF0YVNpemVfcCAgICA9IHNpemUgb2YgZnJhbWUKKy8vCisvLworLy8gUmV0dXJuczogICAgICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc3lSZWNlaXZlQ2IodEVwbFNkb0NvbkhkbCBDb25IZGxfcCwKKwkJCQkgICAgIHRFcGxBc3lTZG9TZXEgKiBwU2RvU2VxRGF0YV9wLAorCQkJCSAgICAgdW5zaWduZWQgaW50IHVpRGF0YVNpemVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl1bnNpZ25lZCBpbnQgdWlDb3VudCA9IDA7CisJdW5zaWduZWQgaW50IHVpRnJlZUVudHJ5ID0gRVBMX01BWF9TRE9fU0VRX0NPTjsKKwl0RXBsQXN5U2RvU2VxQ29uICpwQXN5U2RvU2VxQ29uOworCisjaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzIpCisJLy8gZW50ZXIgIGNyaXRpY2FsIHNlY3Rpb24KKwlFbnRlckNyaXRpY2FsU2VjdGlvbihBc3lTZG9TZXF1SW5zdGFuY2VfZy5tX3BDcml0aWNhbFNlY3Rpb25SZWNlaXZlKTsKKyNlbmRpZgorCisJRVBMX0RCR0xWTF9TRE9fVFJBQ0UyKCJIYW5kbGU6IDB4JXggLCBGaXJzdCBEYXRhYnl0ZSAweCV4XG4iLCBDb25IZGxfcCwKKwkJCSAgICAgICgoQllURSAqKSBwU2RvU2VxRGF0YV9wKVswXSk7CisKKwkvLyBzZWFyY2ggY29udHJvbGwgc3RydWN0dXJlIGZvciB0aGlzIGNvbm5lY3Rpb24KKwlwQXN5U2RvU2VxQ29uID0gJkFzeVNkb1NlcXVJbnN0YW5jZV9nLm1fQXN5U2RvQ29ubmVjdGlvblt1aUNvdW50XTsKKwl3aGlsZSAodWlDb3VudCA8IEVQTF9NQVhfU0RPX1NFUV9DT04pIHsKKwkJaWYgKHBBc3lTZG9TZXFDb24tPm1fQ29uSGFuZGxlID09IENvbkhkbF9wKSB7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmICgocEFzeVNkb1NlcUNvbi0+bV9Db25IYW5kbGUgPT0gMCkKKwkJCSAgICYmICh1aUZyZWVFbnRyeSA9PSBFUExfTUFYX1NET19TRVFfQ09OKSkgeworCQkJLy8gZnJlZSBlbnRyeQorCQkJdWlGcmVlRW50cnkgPSB1aUNvdW50OworCQl9CisJCXVpQ291bnQrKzsKKwkJcEFzeVNkb1NlcUNvbisrOworCX0KKworCWlmICh1aUNvdW50ID09IEVQTF9NQVhfU0RPX1NFUV9DT04pIHsJLy8gbmV3IGNvbm5lY3Rpb24KKwkJaWYgKHVpRnJlZUVudHJ5ID09IEVQTF9NQVhfU0RPX1NFUV9DT04pIHsKKwkJCVJldCA9IGtFcGxTZG9TZXFOb0ZyZWVIYW5kbGU7CisJCQlnb3RvIEV4aXQ7CisJCX0gZWxzZSB7CisJCQlwQXN5U2RvU2VxQ29uID0KKwkJCSAgICAmQXN5U2RvU2VxdUluc3RhbmNlX2cuCisJCQkgICAgbV9Bc3lTZG9Db25uZWN0aW9uW3VpRnJlZUVudHJ5XTsKKwkJCS8vIHNhdmUgaGFuZGxlIGZyb20gbG93ZXIgbGF5ZXIKKwkJCXBBc3lTZG9TZXFDb24tPm1fQ29uSGFuZGxlID0gQ29uSGRsX3A7CisJCQkvLyBpbmNyZW1lbnQgdXNlIGNvdW50ZXIKKwkJCXBBc3lTZG9TZXFDb24tPm1fdWlVc2VDb3VudCsrOworCQkJdWlDb3VudCA9IHVpRnJlZUVudHJ5OworCQl9CisJfQorCS8vIGNhbGwgaGlzdG9yeSBhY2sgZnVuY3Rpb24KKwlSZXQgPSBFcGxTZG9Bc3lBY2tGcmFtZVRvSGlzdG9yeShwQXN5U2RvU2VxQ29uLAorCQkJCQkgKEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJICAoJnBTZG9TZXFEYXRhX3AtPgorCQkJCQkgICBtX2xlX2JSZWNTZXFOdW1Db24pICYKKwkJCQkJICBFUExfU0VRX05VTV9NQVNLKSk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyKQorCS8vIGxlYXZlIGNyaXRpY2FsIHNlY3Rpb24KKwlMZWF2ZUNyaXRpY2FsU2VjdGlvbihBc3lTZG9TZXF1SW5zdGFuY2VfZy5tX3BDcml0aWNhbFNlY3Rpb25SZWNlaXZlKTsKKyNlbmRpZgorCisJLy8gY2FsbCBwcm9jZXNzIGZ1bmN0aW9uIHdpdGggcG9pbnRlciBvZiBmcmFtZSBhbmQgZXZlbnQga0FzeVNkb1NlcUV2ZW50RnJhbWVSZWMKKwlSZXQgPSBFcGxTZG9Bc3lTZXFQcm9jZXNzKHVpQ291bnQsCisJCQkJICB1aURhdGFTaXplX3AsCisJCQkJICBOVUxMLCBwU2RvU2VxRGF0YV9wLCBrQXN5U2RvU2VxRXZlbnRGcmFtZVJlYyk7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgICAgIEVwbFNkb0FzeUluaXRIaXN0b3J5CisvLworLy8gRGVzY3JpcHRpb246ICAgICBpbnRpIGZ1bmN0aW9uIGZvciBoaXN0b3J5IGJ1ZmZlcgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Bc3lJbml0SGlzdG9yeSh2b2lkKQoreworCXRFcGxLZXJuZWwgUmV0OworCXVuc2lnbmVkIGludCB1aUNvdW50OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJLy8gaW5pdCBtX2JGcmVlRW50cmllcyBpbiBoaXN0b3J5LWJ1ZmZlcgorCWZvciAodWlDb3VudCA9IDA7IHVpQ291bnQgPCBFUExfTUFYX1NET19TRVFfQ09OOyB1aUNvdW50KyspIHsKKwkJQXN5U2RvU2VxdUluc3RhbmNlX2cubV9Bc3lTZG9Db25uZWN0aW9uW3VpQ291bnRdLgorCQkgICAgbV9TZG9Db25IaXN0b3J5Lm1fYkZyZWVFbnRyaWVzID0gRVBMX1NET19ISVNUT1JZX1NJWkU7CisJfQorCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgICAgIEVwbFNkb0FzeUFkZEZyYW1lVG9IaXN0b3J5CisvLworLy8gRGVzY3JpcHRpb246ICAgICBmdW5jdGlvbiB0byBhZGQgYSBmcmFtZSB0byB0aGUgaGlzdG9yeSBidWZmZXIKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICAgICAgcEFzeVNkb1NlcUNvbl9wID0gcG9pbnRlciB0byBjb250cm9sIHN0cnVjdHVyZSBvZiB0aGlzIGNvbm5lY3Rpb24KKy8vICAgICAgICAgICAgICAgICAgcEZyYW1lX3AgICAgICAgID0gcG9pbnRlciB0byBmcmFtZQorLy8gICAgICAgICAgICAgICAgICB1aVNpemVfcCAgICAgICAgPSBzaXplIG9mIHRoZSBmcmFtZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gd2l0aG91dCBzaXplIG9mIHRoZSBldGhlcm5ldCBoZWFkZXIKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgYXNuZCBoZWFkZXIKKy8vCisvLyBSZXR1cm5zOiAgICAgICAgIHRFcGxLZXJuZWwgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0FzeUFkZEZyYW1lVG9IaXN0b3J5KHRFcGxBc3lTZG9TZXFDb24gKiBwQXN5U2RvU2VxQ29uX3AsCisJCQkJCSAgICAgdEVwbEZyYW1lICogcEZyYW1lX3AsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IHVpU2l6ZV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxBc3lTZG9Db25IaXN0b3J5ICpwSGlzdG9yeTsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gYWRkIGZyYW1lIHRvIGhpc3RvcnkgYnVmZmVyCisKKwkvLyBjaGVjayBzaXplCisJLy8gJCQkIGQuay4gRVBMX1NFUV9ISVNUT1JZX0ZSQU1FX1NJWkUgaW5jbHVkZXMgdGhlIGhlYWRlciBzaXplLCBidXQgdWlTaXplX3AgZG9lcyBub3QhISEKKwlpZiAodWlTaXplX3AgPiBFUExfU0VRX0hJU1RST1lfRlJBTUVfU0laRSkgeworCQlSZXQgPSBrRXBsU2RvU2VxRnJhbWVTaXplRXJyb3I7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gc2F2ZSBwb2ludGVyIHRvIGhpc3RvcnkKKwlwSGlzdG9yeSA9ICZwQXN5U2RvU2VxQ29uX3AtPm1fU2RvQ29uSGlzdG9yeTsKKworCS8vIGNoZWNrIGlmIGEgZnJlZSBlbnRyeSBpcyBhdmFpbGFibGUKKwlpZiAocEhpc3RvcnktPm1fYkZyZWVFbnRyaWVzID4gMCkgewkvLyB3cml0ZSBtZXNzYWdlIGluIGZyZWUgZW50cnkKKwkJRVBMX01FTUNQWSgmCisJCQkgICAoKHRFcGxGcmFtZSAqKSBwSGlzdG9yeS0+CisJCQkgICAgbV9hYWJIaXN0b3J5RnJhbWVbcEhpc3RvcnktPm1fYldyaXRlXSktPgorCQkJICAgbV9sZV9iTWVzc2FnZVR5cGUsICZwRnJhbWVfcC0+bV9sZV9iTWVzc2FnZVR5cGUsCisJCQkgICB1aVNpemVfcCArIEVQTF9BU05EX0hFQURFUl9TSVpFKTsKKwkJLy8gc3RvcmUgc2l6ZQorCQlwSGlzdG9yeS0+bV9hdWlGcmFtZVNpemVbcEhpc3RvcnktPm1fYldyaXRlXSA9IHVpU2l6ZV9wOworCisJCS8vIGRlY3JlbWVuZCBudW1iZXIgb2YgZnJlZSBidWZmZXJlbnRyaWVzCisJCXBIaXN0b3J5LT5tX2JGcmVlRW50cmllcy0tOworCisJCS8vIGluY3JlbWVudCB3cml0ZWluZGV4CisJCXBIaXN0b3J5LT5tX2JXcml0ZSsrOworCisJCS8vIGNoZWNrIGlmIHdyaXRlLWluZGV4IHJ1biBvdmVyIGFycmF5LWJvYXJkZXIKKwkJaWYgKHBIaXN0b3J5LT5tX2JXcml0ZSA9PSBFUExfU0RPX0hJU1RPUllfU0laRSkgeworCQkJcEhpc3RvcnktPm1fYldyaXRlID0gMDsKKwkJfQorCisJfSBlbHNlIHsJCS8vIG5vIGZyZWUgZW50cnkKKwkJUmV0ID0ga0VwbFNkb1NlcU5vRnJlZUhpc3Rvcnk7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgICAgICBFcGxTZG9Bc3lBY2tGcmFtZVRvSGlzdG9yeQorLy8KKy8vIERlc2NyaXB0aW9uOiAgICAgZnVuY3Rpb24gdG8gZGVsZXRlIGFja25vd2xlZGdlZCBmcmFtZXMgZnJvbiBoaXN0b3J5IGJ1ZmZlcgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogICAgICBwQXN5U2RvU2VxQ29uX3AgPSBwb2ludGVyIHRvIGNvbnRyb2wgc3RydWN0dXJlIG9mIHRoaXMgY29ubmVjdGlvbgorLy8gICAgICAgICAgICAgICAgICBiUmVjU2VxTnVtYmVyX3AgPSByZWNlaXZlIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgcmVjZWl2ZWQgZnJhbWUKKy8vCisvLworLy8gUmV0dXJuczogICAgICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Bc3lBY2tGcmFtZVRvSGlzdG9yeSh0RXBsQXN5U2RvU2VxQ29uICogcEFzeVNkb1NlcUNvbl9wLAorCQkJCQkgICAgIEJZVEUgYlJlY1NlcU51bWJlcl9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxBc3lTZG9Db25IaXN0b3J5ICpwSGlzdG9yeTsKKwlCWVRFIGJBY2tJbmRleDsKKwlCWVRFIGJDdXJyZW50U2VxTnVtOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBnZXQgcG9pbnRlciB0byBoaXN0b3J5IGJ1ZmZlcgorCXBIaXN0b3J5ID0gJnBBc3lTZG9TZXFDb25fcC0+bV9TZG9Db25IaXN0b3J5OworCisJLy8gcmVsZWFzZSBhbGwgYWNrbm93bGVkZ2VkIGZyYW1lcyBmcm9tIGhpc3RvcnkgYnVmZmVyCisKKwkvLyBjaGVjayBpZiB0aGVyZSBhcmUgZW50cmllcyBpbiBoaXN0b3J5CisJaWYgKHBIaXN0b3J5LT5tX2JGcmVlRW50cmllcyA8IEVQTF9TRE9fSElTVE9SWV9TSVpFKSB7CisJCWJBY2tJbmRleCA9IHBIaXN0b3J5LT5tX2JBY2s7CisJCWRvIHsKKwkJCWJDdXJyZW50U2VxTnVtID0KKwkJCSAgICAoKCh0RXBsRnJhbWUgKikgcEhpc3RvcnktPgorCQkJICAgICAgbV9hYWJIaXN0b3J5RnJhbWVbYkFja0luZGV4XSktPm1fRGF0YS5tX0FzbmQuCisJCQkgICAgIG1fUGF5bG9hZC5tX1Nkb1NlcXVlbmNlRnJhbWUuCisJCQkgICAgIG1fbGVfYlNlbmRTZXFOdW1Db24gJiBFUExfU0VRX05VTV9NQVNLKTsKKwkJCWlmICgoKGJSZWNTZXFOdW1iZXJfcCAtCisJCQkgICAgICBiQ3VycmVudFNlcU51bSkgJiBFUExfU0VRX05VTV9NQVNLKQorCQkJICAgIDwgRVBMX1NFUV9OVU1fVEhSRVNIT0xEKSB7CisJCQkJcEhpc3RvcnktPm1fYXVpRnJhbWVTaXplW2JBY2tJbmRleF0gPSAwOworCQkJCWJBY2tJbmRleCsrOworCQkJCXBIaXN0b3J5LT5tX2JGcmVlRW50cmllcysrOworCQkJCWlmIChiQWNrSW5kZXggPT0gRVBMX1NET19ISVNUT1JZX1NJWkUpIHsJLy8gcmVhZCBpbmRleCBydW4gb3ZlciBhcnJheS1ib2FyZGVyCisJCQkJCWJBY2tJbmRleCA9IDA7CisJCQkJfQorCQkJfSBlbHNlIHsJLy8gbm90aGluZyB0byBkbyBhbnltb3JlLAorCQkJCS8vIGJlY2F1c2UgYW55IGZ1cnRoZXIgZnJhbWUgaW4gaGlzdG9yeSBoYXMgbGFyZ2VyIHNlcXVlbmNlCisJCQkJLy8gbnVtYmVyIHRoYW4gdGhlIGFja25vd2xlZGdlCisJCQkJZ290byBFeGl0OworCQkJfQorCQl9CisJCXdoaWxlICgoKChiUmVjU2VxTnVtYmVyX3AgLSAxIC0KKwkJCSAgYkN1cnJlbnRTZXFOdW0pICYgRVBMX1NFUV9OVU1fTUFTSykKKwkJCTwgRVBMX1NFUV9OVU1fVEhSRVNIT0xEKQorCQkgICAgICAgJiYgKHBIaXN0b3J5LT5tX2JXcml0ZSAhPSBiQWNrSW5kZXgpKTsKKworCQkvLyBzdG9yZSBsb2NhbCByZWFkLWluZGV4IHRvIGdsb2JhbCB2YXIKKwkJcEhpc3RvcnktPm1fYkFjayA9IGJBY2tJbmRleDsKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgICAgIEVwbFNkb0FzeVJlYWRGcm9tSGlzdG9yeQorLy8KKy8vIERlc2NyaXB0aW9uOiAgICAgZnVuY3Rpb24gdG8gb25lIGZyYW1lIGZyb20gaGlzdG9yeQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogICAgICBwQXN5U2RvU2VxQ29uX3AgPSBwb2ludGVyIHRvIGNvbnRyb2wgc3RydWN0dXJlIG9mIHRoaXMgY29ubmVjdGlvbgorLy8gICAgICAgICAgICAgICAgICBwcEZyYW1lX3AgICAgICAgPSBwb2ludGVyIHRvIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiB0aGUgc3RvcmVkIGZyYW1lCisvLyAgICAgICAgICAgICAgICAgIHB1aVNpemVfcCAgICAgICA9IE9VVDogc2l6ZSBvZiB0aGUgZnJhbWUKKy8vICAgICAgICAgICAgICAgICAgZkluaXRSZWFkICAgICAgID0gYm9vbCB3aGljaCBpbmRpY2F0ZSBhIHN0YXJ0IG9mIHJldHJhbnNtaXNzaW9uCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gcmV0dXJuIGxhc3Qgbm90IGFja25vd2xlZGdlZCBtZXNzYWdlIGlmIFRSVUUKKy8vCisvLworLy8gUmV0dXJuczogICAgICAgICB0RXBsS2VybmVsID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Bc3lSZWFkRnJvbUhpc3RvcnkodEVwbEFzeVNkb1NlcUNvbiAqIHBBc3lTZG9TZXFDb25fcCwKKwkJCQkJICAgdEVwbEZyYW1lICoqIHBwRnJhbWVfcCwKKwkJCQkJICAgdW5zaWduZWQgaW50ICpwdWlTaXplX3AsCisJCQkJCSAgIEJPT0wgZkluaXRSZWFkX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbEFzeVNkb0Nvbkhpc3RvcnkgKnBIaXN0b3J5OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyByZWFkIG9uZSBtZXNzYWdlIGZyb20gSGlzdG9yeQorCisJLy8gZ2V0IHBvaW50ZXIgdG8gaGlzdG9yeSBidWZmZXIKKwlwSGlzdG9yeSA9ICZwQXN5U2RvU2VxQ29uX3AtPm1fU2RvQ29uSGlzdG9yeTsKKworCS8vIGNoZWNrIGlmIGluaXQKKwlpZiAoZkluaXRSZWFkX3AgIT0gRkFMU0UpIHsJLy8gaW5pdGlhbGl6ZSByZWFkIGluZGV4IHRvIHRoZSBpbmRleCB3aGljaCBzaGFsbCBiZSBhY2tub3dsZWRnZWQgbmV4dAorCQlwSGlzdG9yeS0+bV9iUmVhZCA9IHBIaXN0b3J5LT5tX2JBY2s7CisJfQorCS8vIGNoZWNrIGlmIGVudHJpZXMgYXJlIGF2YWlsYWJsZSBmb3IgcmVhZGluZworCWlmICgocEhpc3RvcnktPm1fYkZyZWVFbnRyaWVzIDwgRVBMX1NET19ISVNUT1JZX1NJWkUpCisJICAgICYmIChwSGlzdG9yeS0+bV9iV3JpdGUgIT0gcEhpc3RvcnktPm1fYlJlYWQpKSB7CisvLyAgICAgICAgUFJJTlRGNCgiRXBsU2RvQXN5UmVhZEZyb21IaXN0b3J5KCk6IGluaXQgPSAlZCwgcmVhZCA9ICV1LCB3cml0ZSA9ICV1LCBhY2sgPSAldSIsIChpbnQpIGZJbml0UmVhZF9wLCAoV09SRClwSGlzdG9yeS0+bV9iUmVhZCwgKFdPUkQpcEhpc3RvcnktPm1fYldyaXRlLCAoV09SRClwSGlzdG9yeS0+bV9iQWNrKTsKKy8vICAgICAgICBQUklOVEYyKCIsIGZyZWUgZW50cmllcyA9ICV1LCBuZXh0IGZyYW1lIHNpemUgPSAldVxuIiwgKFdPUkQpcEhpc3RvcnktPm1fYkZyZWVFbnRyaWVzLCBwSGlzdG9yeS0+bV9hdWlGcmFtZVNpemVbcEhpc3RvcnktPm1fYlJlYWRdKTsKKworCQkvLyByZXR1cm4gcG9pbnRlciB0byBzdG9yZWQgZnJhbWUKKwkJKnBwRnJhbWVfcCA9CisJCSAgICAodEVwbEZyYW1lICopIHBIaXN0b3J5LT5tX2FhYkhpc3RvcnlGcmFtZVtwSGlzdG9yeS0+CisJCQkJCQkJICAgICAgbV9iUmVhZF07CisKKwkJLy8gc2F2ZSBzaXplCisJCSpwdWlTaXplX3AgPSBwSGlzdG9yeS0+bV9hdWlGcmFtZVNpemVbcEhpc3RvcnktPm1fYlJlYWRdOworCisJCXBIaXN0b3J5LT5tX2JSZWFkKys7CisJCWlmIChwSGlzdG9yeS0+bV9iUmVhZCA9PSBFUExfU0RPX0hJU1RPUllfU0laRSkgeworCQkJcEhpc3RvcnktPm1fYlJlYWQgPSAwOworCQl9CisKKwl9IGVsc2UgeworLy8gICAgICAgIFBSSU5URjMoIkVwbFNkb0FzeVJlYWRGcm9tSGlzdG9yeSgpOiByZWFkID0gJXUsIGFjayA9ICV1LCBmcmVlIGVudHJpZXMgPSAldSwgbm8gZnJhbWVcbiIsIChXT1JEKXBIaXN0b3J5LT5tX2JSZWFkLCAoV09SRClwSGlzdG9yeS0+bV9iQWNrLCAoV09SRClwSGlzdG9yeS0+bV9iRnJlZUVudHJpZXMpOworCisJCS8vIG5vIG1vcmUgZnJhbWVzIHRvIHNlbmQKKwkJLy8gcmV0dXJuIG51bGwgcG9pbnRlcgorCQkqcHBGcmFtZV9wID0gTlVMTDsKKworCQkqcHVpU2l6ZV9wID0gMDsKKwl9CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgICAgICBFcGxTZG9Bc3lHZXRGcmVlRW50cmllc0Zyb21IaXN0b3J5CisvLworLy8gRGVzY3JpcHRpb246ICAgICBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgZnJlZSBoaXN0cm95IGVudHJpZXMKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICAgICAgcEFzeVNkb1NlcUNvbl9wID0gcG9pbnRlciB0byBjb250cm9sIHN0cnVjdHVyZSBvZiB0aGlzIGNvbm5lY3Rpb24KKy8vCisvLworLy8gUmV0dXJuczogICAgICAgICB1bnNpZ25lZCBpbnQgICAgPSBudW1iZXIgb2YgZnJlZSBlbnRyaWVzCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdW5zaWduZWQgaW50IEVwbFNkb0FzeUdldEZyZWVFbnRyaWVzRnJvbUhpc3RvcnkodEVwbEFzeVNkb1NlcUNvbiAqCisJCQkJCQkgICAgICAgcEFzeVNkb1NlcUNvbl9wKQoreworCXVuc2lnbmVkIGludCB1aUZyZWVFbnRyaWVzOworCisJdWlGcmVlRW50cmllcyA9CisJICAgICh1bnNpZ25lZCBpbnQpcEFzeVNkb1NlcUNvbl9wLT5tX1Nkb0Nvbkhpc3RvcnkubV9iRnJlZUVudHJpZXM7CisKKwlyZXR1cm4gdWlGcmVlRW50cmllczsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgICAgIEVwbFNkb0FzeVNlcVNldFRpbWVyCisvLworLy8gRGVzY3JpcHRpb246ICAgICBmdW5jdGlvbiBzZXRzIG9yIG1vZGlmeSB0aW1lciBpbiB0aW1lcm1vc3VsZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogICAgICBwQXN5U2RvU2VxQ29uX3AgPSBwb2ludGVyIHRvIGNvbnRyb2wgc3RydWN0dXJlIG9mIHRoaXMgY29ubmVjdGlvbgorLy8gICAgICAgICAgICAgICAgICB1bFRpbWVvdXQgICAgICAgPSB0aW1lb3V0IGluIG1zCisvLworLy8KKy8vIFJldHVybnM6ICAgICAgICAgdW5zaWduZWQgaW50ICAgID0gbnVtYmVyIG9mIGZyZWUgZW50cmllcworLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQXN5U2VxU2V0VGltZXIodEVwbEFzeVNkb1NlcUNvbiAqIHBBc3lTZG9TZXFDb25fcCwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB1bFRpbWVvdXQpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbFRpbWVyQXJnIFRpbWVyQXJnOworCisJVGltZXJBcmcubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rU2RvQXN5U2VxOworCVRpbWVyQXJnLm1fdWxBcmcgPSAodW5zaWduZWQgbG9uZylwQXN5U2RvU2VxQ29uX3A7CisKKwlpZiAocEFzeVNkb1NlcUNvbl9wLT5tX0VwbFRpbWVySGRsID09IDApIHsJLy8gY3JlYXRlIG5ldyB0aW1lcgorCQlSZXQgPSBFcGxUaW1lcnVTZXRUaW1lck1zKCZwQXN5U2RvU2VxQ29uX3AtPm1fRXBsVGltZXJIZGwsCisJCQkJCSAgdWxUaW1lb3V0LCBUaW1lckFyZyk7CisJfSBlbHNlIHsJCS8vIG1vZGlmeSBleGlzaXRpbmcgdGltZXIKKwkJUmV0ID0gRXBsVGltZXJ1TW9kaWZ5VGltZXJNcygmcEFzeVNkb1NlcUNvbl9wLT5tX0VwbFRpbWVySGRsLAorCQkJCQkgICAgIHVsVGltZW91dCwgVGltZXJBcmcpOworCisJfQorCisJcmV0dXJuIFJldDsKK30KKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFNkb0NvbXUuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsU2RvQ29tdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMGViMzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFNkb0NvbXUuYwpAQCAtMCwwICsxLDMzNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgU0RPIENvbW1hbmQgTGF5ZXIgbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsU2RvQ29tdS5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4xNCAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzI2IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ1c2VyL0VwbFNkb0NvbXUuaCIKKworI2lmICgoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET1MpKSA9PSAwKSAmJlwKKyAgICAgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9DKSkgPT0gMCkgICApCisKKyNlcnJvciAnRVJST1I6IEF0IGxlYXN0IFNETyBTZXJ2ZXIgb3IgU0RPIENsaWVudCBzaG91bGQgYmUgYWN0aXZhdGUhJworCisjZW5kaWYKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPUykpICE9IDApCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRVKSkgPT0gMCkgJiYgKEVQTF9PQkRfVVNFX0tFUk5FTCA9PSBGQUxTRSkKKworI2Vycm9yICdFUlJPUjogU0RPIFNlcnZlciBuZWVkcyBPQkR1IG1vZHVsZSEnCisKKyNlbmRpZgorCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZm5kZWYgRVBMX01BWF9TRE9fQ09NX0NPTgorI2RlZmluZSBFUExfTUFYX1NET19DT01fQ09OICAgICAgICAgNQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gaW50ZXJuIGV2ZW50cwordHlwZWRlZiBlbnVtIHsKKwlrRXBsU2RvQ29tQ29uRXZlbnRTZW5kRmlyc3QgPSAweDAwLAkvLyBmaXJzdCBmcmFtZSB0byBzZW5kCisJa0VwbFNkb0NvbUNvbkV2ZW50UmVjID0gMHgwMSwJLy8gZnJhbWUgcmVjZWl2ZWQKKwlrRXBsU2RvQ29tQ29uRXZlbnRDb25Fc3RhYmxpc2hlZCA9IDB4MDIsCS8vIGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQKKwlrRXBsU2RvQ29tQ29uRXZlbnRDb25DbG9zZWQgPSAweDAzLAkvLyBjb25uZWN0aW9uIGNsb3NlZAorCWtFcGxTZG9Db21Db25FdmVudEFja1JlY2VpdmVkID0gMHgwNCwJLy8gYWNrbm93bGVkZ2UgcmVjZWl2ZWQgYnkgbG93ZXIgbGF5ZXIKKwkvLyAtPiBjb250aW51ZSBzZW5kaW5nCisJa0VwbFNkb0NvbUNvbkV2ZW50RnJhbWVTZW5kZWQgPSAweDA1LAkvLyBsb3dlciBoYXMgc2VuZCBhIGZyYW1lCisJa0VwbFNkb0NvbUNvbkV2ZW50SW5pdEVycm9yID0gMHgwNiwJLy8gZXJyb3IgZHVyaW5naW5pdGlhbGlzaWF0aW9uCisJLy8gb2YgdGhlIGNvbm5lY3Rpb24KKwlrRXBsU2RvQ29tQ29uRXZlbnRUaW1lb3V0ID0gMHgwNwkvLyB0aW1lb3V0IGluIGxvd2VyIGxheWVyCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET0MpKSAhPSAwKQorCSAgICAsCisKKwlrRXBsU2RvQ29tQ29uRXZlbnRJbml0Q29uID0gMHgwOCwJLy8gaW5pdCBjb25uZWN0aW9uIChvbmx5IGNsaWVudCkKKwlrRXBsU2RvQ29tQ29uRXZlbnRBYm9ydCA9IDB4MDkJLy8gYWJvcnQgc2RvIHRyYW5zZmVyIChvbmx5IGNsaWVudCkKKyNlbmRpZgorfSB0RXBsU2RvQ29tQ29uRXZlbnQ7CisKK3R5cGVkZWYgZW51bSB7CisJa0VwbFNkb0NvbVNlbmRUeXBlUmVxID0gMHgwMCwJLy8gc2VuZCBhIHJlcXVlc3QKKwlrRXBsU2RvQ29tU2VuZFR5cGVBY2tSZXMgPSAweDAxLAkvLyBzZW5kIGEgcmVzb25zZSB3aXRob3V0IGRhdGEKKwlrRXBsU2RvQ29tU2VuZFR5cGVSZXMgPSAweDAyLAkvLyBzZW5kIHJlc3BvbnNlIHdpdGggZGF0YQorCWtFcGxTZG9Db21TZW5kVHlwZUFib3J0ID0gMHgwMwkvLyBzZW5kIGFib3J0Cit9IHRFcGxTZG9Db21TZW5kVHlwZTsKKworLy8gc3RhdGUgb2YgdGhlIHN0YXRlIG1hc2NoaW5lCit0eXBlZGVmIGVudW0geworCS8vIEdlbmVyYWwgU3RhdGUKKwlrRXBsU2RvQ29tU3RhdGVJZGxlID0gMHgwMCwJLy8gaWRsZSBzdGF0ZQorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET1MpKSAhPSAwKQorCS8vIFNlcnZlciBTdGF0ZXMKKwlrRXBsU2RvQ29tU3RhdGVTZXJ2ZXJTZWdtVHJhbnMgPSAweDAxLAkvLyBzZW5kIGZvbGxvd2luZyBmcmFtZXMKKyNlbmRpZgorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET0MpKSAhPSAwKQorCS8vIENsaWVudCBTdGF0ZXMKKwlrRXBsU2RvQ29tU3RhdGVDbGllbnRXYWl0SW5pdCA9IDB4MTAsCS8vIHdhaXQgZm9yIGluaXQgY29ubmVjdGlvbgorCS8vIG9uIGxvd2VyIGxheWVyCisJa0VwbFNkb0NvbVN0YXRlQ2xpZW50Q29ubmVjdGVkID0gMHgxMSwJLy8gY29ubmVjdGlvbiBlc3RhYmxpc2hlZAorCWtFcGxTZG9Db21TdGF0ZUNsaWVudFNlZ21UcmFucyA9IDB4MTIJLy8gc2VuZCBmb2xsb3dpbmcgZnJhbWVzCisjZW5kaWYKK30gdEVwbFNkb0NvbVN0YXRlOworCisvLyBjb250cm9sIHN0cnVjdHVyZSBmb3IgdHJhbnNhY3Rpb24KK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsU2RvU2VxQ29uSGRsIG1fU2RvU2VxQ29uSGRsOwkvLyBpZiAhPSAwIC0+IGVudHJ5IHVzZWQKKwl0RXBsU2RvQ29tU3RhdGUgbV9TZG9Db21TdGF0ZTsKKwlCWVRFIG1fYlRyYW5zYWN0aW9uSWQ7CisJdW5zaWduZWQgaW50IG1fdWlOb2RlSWQ7CS8vIE5vZGVJZCBvZiB0aGUgdGFyZ2V0CisJLy8gLT4gbmVlZGVkIHRvIHJlaW5pdCBjb25uZWN0aW9uCisJLy8gICAgYWZ0ZXIgdGltZW91dAorCXRFcGxTZG9UcmFuc1R5cGUgbV9TZG9UcmFuc1R5cGU7CS8vIEF1dG8sIEV4cGVkaXRlZCwgU2VnbWVudGVkCisJdEVwbFNkb1NlcnZpY2VUeXBlIG1fU2RvU2VydmljZVR5cGU7CS8vIFdyaXRlQnlJbmRleCwgUmVhZEJ5SW5kZXgKKwl0RXBsU2RvVHlwZSBtX1Nkb1Byb3RUeXBlOwkvLyBwcm90b2NvbCBsYXllcjogQXV0bywgVWRwLCBBc25kLCBQZG8KKwlCWVRFICptX3BEYXRhOwkJLy8gcG9pbnRlciB0byBkYXRhCisJdW5zaWduZWQgaW50IG1fdWlUcmFuc1NpemU7CS8vIG51bWJlciBvZiBieXRlcworCS8vIHRvIHRyYW5zZmVyCisJdW5zaWduZWQgaW50IG1fdWlUcmFuc2ZlcnJlZEJ5dGU7CS8vIG51bWJlciBvZiBieXRlcworCS8vIGFscmVhZHkgdHJhbnNmZXJyZWQKKwl0RXBsU2RvRmluaXNoZWRDYiBtX3BmblRyYW5zZmVyRmluaXNoZWQ7CS8vIGNhbGxiYWNrIGZ1bmN0aW9uIG9mIHRoZQorCS8vIGFwcGxpY2F0aW9uCisJLy8gLT4gY2FsbGVkIGluIHRoZSBlbmQgb2YKKwkvLyAgICB0aGUgU0RPIHRyYW5zZmVyCisJdm9pZCAqbV9wVXNlckFyZzsJLy8gdXNlciBkZWZpbmFibGUgYXJndW1lbnQgcG9pbnRlcgorCisJRFdPUkQgbV9kd0xhc3RBYm9ydENvZGU7CS8vIHNhdmUgdGhlIGxhc3QgYWJvcnQgY29kZQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9DKSkgIT0gMCkKKwkvLyBvbmx5IGZvciBjbGllbnQKKwl1bnNpZ25lZCBpbnQgbV91aVRhcmdldEluZGV4OwkvLyBpbmRleCB0byBhY2Nlc3MKKwl1bnNpZ25lZCBpbnQgbV91aVRhcmdldFN1YkluZGV4OwkvLyBzdWJpb25kZXggdG8gYWNjZXNzCisKKwkvLyBmb3IgZnV0dXJlIHVzZQorCXVuc2lnbmVkIGludCBtX3VpVGltZW91dDsJLy8gdGltZW91dCBmb3IgdGhpcyBjb25uZWN0aW9uCisKKyNlbmRpZgorCit9IHRFcGxTZG9Db21Db247CisKKy8vIGluc3RhbmNlIHRhYmxlCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbFNkb0NvbUNvbiBtX1Nkb0NvbUNvbltFUExfTUFYX1NET19DT01fQ09OXTsKKworI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyKQorCUxQQ1JJVElDQUxfU0VDVElPTiBtX3BDcml0aWNhbFNlY3Rpb247CisJQ1JJVElDQUxfU0VDVElPTiBtX0NyaXRpY2FsU2VjdGlvbjsKKyNlbmRpZgorCit9IHRFcGxTZG9Db21JbnN0YW5jZTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB0RXBsU2RvQ29tSW5zdGFuY2UgU2RvQ29tSW5zdGFuY2VfZzsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQ29tUmVjZWl2ZUNiKHRFcGxTZG9TZXFDb25IZGwgU2RvU2VxQ29uSGRsX3AsCisJCQkJICAgICB0RXBsQXN5U2RvQ29tICogcEFzeVNkb0NvbV9wLAorCQkJCSAgICAgdW5zaWduZWQgaW50IHVpRGF0YVNpemVfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0NvbUNvbkNiKHRFcGxTZG9TZXFDb25IZGwgU2RvU2VxQ29uSGRsX3AsCisJCQkJIHRFcGxBc3lTZG9Db25TdGF0ZSBBc3lTZG9Db25TdGF0ZV9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQ29tU2VhcmNoQ29uSW50ZXJuKHRFcGxTZG9TZXFDb25IZGwgU2RvU2VxQ29uSGRsX3AsCisJCQkJCSAgIHRFcGxTZG9Db21Db25FdmVudCBTZG9Db21Db25FdmVudF9wLAorCQkJCQkgICB0RXBsQXN5U2RvQ29tICogcEFzeVNkb0NvbV9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQ29tUHJvY2Vzc0ludGVybih0RXBsU2RvQ29tQ29uSGRsIFNkb0NvbUNvbl9wLAorCQkJCQkgdEVwbFNkb0NvbUNvbkV2ZW50IFNkb0NvbUNvbkV2ZW50X3AsCisJCQkJCSB0RXBsQXN5U2RvQ29tICogcEFzeVNkb0NvbV9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQ29tVHJhbnNmZXJGaW5pc2hlZCh0RXBsU2RvQ29tQ29uSGRsIFNkb0NvbUNvbl9wLAorCQkJCQkgICAgdEVwbFNkb0NvbUNvbiAqIHBTZG9Db21Db25fcCwKKwkJCQkJICAgIHRFcGxTZG9Db21Db25TdGF0ZQorCQkJCQkgICAgU2RvQ29tQ29uU3RhdGVfcCk7CisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPUykpICE9IDApCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Db21TZXJ2ZXJJbml0UmVhZEJ5SW5kZXgodEVwbFNkb0NvbUNvbiAqIHBTZG9Db21Db25fcCwKKwkJCQkJCSB0RXBsQXN5U2RvQ29tICogcEFzeVNkb0NvbV9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQ29tU2VydmVyU2VuZEZyYW1lSW50ZXJuKHRFcGxTZG9Db21Db24gKiBwU2RvQ29tQ29uX3AsCisJCQkJCQkgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkJIHRFcGxTZG9Db21TZW5kVHlwZSBTZW5kVHlwZV9wKTsKKworc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQ29tU2VydmVySW5pdFdyaXRlQnlJbmRleCh0RXBsU2RvQ29tQ29uICogcFNkb0NvbUNvbl9wLAorCQkJCQkJICB0RXBsQXN5U2RvQ29tICogcEFzeVNkb0NvbV9wKTsKKyNlbmRpZgorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET0MpKSAhPSAwKQorCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Db21DbGllbnRTZW5kKHRFcGxTZG9Db21Db24gKiBwU2RvQ29tQ29uX3ApOworCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Db21DbGllbnRQcm9jZXNzRnJhbWUodEVwbFNkb0NvbUNvbkhkbCBTZG9Db21Db25fcCwKKwkJCQkJICAgICAgdEVwbEFzeVNkb0NvbSAqIHBBc3lTZG9Db21fcCk7CisKK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0NvbUNsaWVudFNlbmRBYm9ydCh0RXBsU2RvQ29tQ29uICogcFNkb0NvbUNvbl9wLAorCQkJCQkgICBEV09SRCBkd0Fib3J0Q29kZV9wKTsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBDIEwgQSBTIFMgIDxTRE8gQ29tbWFuZCBMYXllcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKy8vIERlc2NyaXB0aW9uOiBTRE8gQ29tbWFuZCBsYXllciBNb2R1bAorLy8KKy8vCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQ29tSW5pdAorLy8KKy8vIERlc2NyaXB0aW9uOiBJbml0IGZpcnN0IGluc3RhbmNlIG9mIHRoZSBtb2R1bGUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQ29tSW5pdCh2b2lkKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0gRXBsU2RvQ29tQWRkSW5zdGFuY2UoKTsKKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQ29tQWRkSW5zdGFuY2UKKy8vCisvLyBEZXNjcmlwdGlvbjogSW5pdCBhZGRpdGlvbmFsIGluc3RhbmNlIG9mIHRoZSBtb2R1bGUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQ29tQWRkSW5zdGFuY2Uodm9pZCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gaW5pdCBjb250cm9sbCBzdHJ1Y3R1cmUKKwlFUExfTUVNU0VUKCZTZG9Db21JbnN0YW5jZV9nLCAweDAwLCBzaXplb2YoU2RvQ29tSW5zdGFuY2VfZykpOworCisJLy8gaW5pdCBpbnN0YW5jZSBvZiBsb3dlciBsYXllcgorCVJldCA9IEVwbFNkb0FzeVNlcUFkZEluc3RhbmNlKEVwbFNkb0NvbVJlY2VpdmVDYiwgRXBsU2RvQ29tQ29uQ2IpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKyNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMikKKwkvLyBjcmVhdGUgY3JpdGljYWwgc2VjdGlvbiBmb3IgcHJvY2VzcyBmdW5jdGlvbgorCVNkb0NvbUluc3RhbmNlX2cubV9wQ3JpdGljYWxTZWN0aW9uID0KKwkgICAgJlNkb0NvbUluc3RhbmNlX2cubV9Dcml0aWNhbFNlY3Rpb247CisJSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbihTZG9Db21JbnN0YW5jZV9nLm1fcENyaXRpY2FsU2VjdGlvbik7CisjZW5kaWYKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9Db21EZWxJbnN0YW5jZQorLy8KKy8vIERlc2NyaXB0aW9uOiBkZWxldGUgaW5zdGFuY2Ugb2YgdGhlIG1vZHVsZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Db21EZWxJbnN0YW5jZSh2b2lkKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKyNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMikKKwkvLyBkZWxldGUgY3JpdGljYWwgc2VjdGlvbiBmb3IgcHJvY2VzcyBmdW5jdGlvbgorCURlbGV0ZUNyaXRpY2FsU2VjdGlvbihTZG9Db21JbnN0YW5jZV9nLm1fcENyaXRpY2FsU2VjdGlvbik7CisjZW5kaWYKKworCVJldCA9IEVwbFNkb0FzeVNlcURlbEluc3RhbmNlKCk7CisJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb0NvbURlZmluZUNvbgorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBkZWZpbmVzIGEgU0RPIGNvbm5lY3Rpb24gdG8gYW5vdGhlciBub2RlCisvLyAgICAgICAgICAgICAgLT4gaW5pdCBsb3dlciBsYXllciBhbmQgcmV0dXJucyBhIGhhbmRsZSBmb3IgdGhlIGNvbm5lY3Rpb24uCisvLyAgICAgICAgICAgICAgVHdvIGNsaWVudCBjb25uZWN0aW9ucyB0byB0aGUgc2FtZSBub2RlIHZpYSB0aGUgc2FtZSBwcm90b2NvbAorLy8gICAgICAgICAgICAgIGFyZSBub3QgYWxsb3dlZC4gSWYgdGhpcyBmdW5jdGlvbiBkZXRlY3RzIHN1Y2ggYSBzaXR1YXRpb24KKy8vICAgICAgICAgICAgICBpdCB3aWxsIHJldHVybiBrRXBsU2RvQ29tSGFuZGxlRXhpc3RzIGFuZCB0aGUgaGFuZGxlIG9mCisvLyAgICAgICAgICAgICAgdGhlIGV4aXN0aW5nIGNvbm5lY3Rpb24gaW4gcFNkb0NvbUNvbkhkbF9wLgorLy8gICAgICAgICAgICAgIFVzaW5nIG9mIGV4aXN0aW5nIHNlcnZlciBjb25uZWN0aW9ucyBpcyBwb3NzaWJsZS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFNkb0NvbUNvbkhkbF9wICAgICA9IHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiB0aGUgaGFuZGxlCisvLyAgICAgICAgICAgICAgdWlUYXJnZXROb2RlSWRfcCAgICA9IE5vZGVJZCBvZiB0aGUgdGFyZ2V0bm9kZQorLy8gICAgICAgICAgICAgIFByb3RUeXBlX3AgICAgICAgICAgPSB0eXBlIG9mIHByb3RvY29sIHRvIHVzZSBmb3IgY29ubmVjdGlvbgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Db21EZWZpbmVDb24odEVwbFNkb0NvbUNvbkhkbCAqIHBTZG9Db21Db25IZGxfcCwKKwkJCQkgICAgIHVuc2lnbmVkIGludCB1aVRhcmdldE5vZGVJZF9wLAorCQkJCSAgICAgdEVwbFNkb1R5cGUgUHJvdFR5cGVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl1bnNpZ25lZCBpbnQgdWlDb3VudDsKKwl1bnNpZ25lZCBpbnQgdWlGcmVlSGRsOworCXRFcGxTZG9Db21Db24gKnBTZG9Db21Db247CisKKwkvLyBjaGVjayBQYXJhbWV0ZXIKKwlBU1NFUlQocFNkb0NvbUNvbkhkbF9wICE9IE5VTEwpOworCisJLy8gY2hlY2sgTm9kZUlkCisJaWYgKCh1aVRhcmdldE5vZGVJZF9wID09IEVQTF9DX0FEUl9JTlZBTElEKQorCSAgICB8fCAodWlUYXJnZXROb2RlSWRfcCA+PSBFUExfQ19BRFJfQlJPQURDQVNUKSkgeworCQlSZXQgPSBrRXBsSW52YWxpZE5vZGVJZDsKKworCX0KKwkvLyBzZWFyY2ggZnJlZSBjb250cm9sIHN0cnVjdHVyZQorCXBTZG9Db21Db24gPSAmU2RvQ29tSW5zdGFuY2VfZy5tX1Nkb0NvbUNvblswXTsKKwl1aUNvdW50ID0gMDsKKwl1aUZyZWVIZGwgPSBFUExfTUFYX1NET19DT01fQ09OOworCXdoaWxlICh1aUNvdW50IDwgRVBMX01BWF9TRE9fQ09NX0NPTikgeworCQlpZiAocFNkb0NvbUNvbi0+bV9TZG9TZXFDb25IZGwgPT0gMCkgewkvLyBmcmVlIGVudHJ5CisJCQl1aUZyZWVIZGwgPSB1aUNvdW50OworCQl9IGVsc2UgaWYgKChwU2RvQ29tQ29uLT5tX3VpTm9kZUlkID09IHVpVGFyZ2V0Tm9kZUlkX3ApCisJCQkgICAmJiAocFNkb0NvbUNvbi0+bV9TZG9Qcm90VHlwZSA9PSBQcm90VHlwZV9wKSkgewkvLyBleGlzdGluZyBjbGllbnQgY29ubmVjdGlvbiB3aXRoIHNhbWUgbm9kZSBJRCBhbmQgc2FtZSBwcm90b2NvbCB0eXBlCisJCQkqcFNkb0NvbUNvbkhkbF9wID0gdWlDb3VudDsKKwkJCVJldCA9IGtFcGxTZG9Db21IYW5kbGVFeGlzdHM7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwkJdWlDb3VudCsrOworCQlwU2RvQ29tQ29uKys7CisJfQorCisJaWYgKHVpRnJlZUhkbCA9PSBFUExfTUFYX1NET19DT01fQ09OKSB7CisJCVJldCA9IGtFcGxTZG9Db21Ob0ZyZWVIYW5kbGU7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlwU2RvQ29tQ29uID0gJlNkb0NvbUluc3RhbmNlX2cubV9TZG9Db21Db25bdWlGcmVlSGRsXTsKKwkvLyBzYXZlIGhhbmRsZSBmb3IgYXBwbGljYXRpb24KKwkqcFNkb0NvbUNvbkhkbF9wID0gdWlGcmVlSGRsOworCS8vIHNhdmUgcGFyYW1ldGVycworCXBTZG9Db21Db24tPm1fU2RvUHJvdFR5cGUgPSBQcm90VHlwZV9wOworCXBTZG9Db21Db24tPm1fdWlOb2RlSWQgPSB1aVRhcmdldE5vZGVJZF9wOworCisJLy8gc2V0IFRyYW5zYWN0aW9uIElkCisJcFNkb0NvbUNvbi0+bV9iVHJhbnNhY3Rpb25JZCA9IDA7CisKKwkvLyBjaGVjayBwcm90b2NvbAorCXN3aXRjaCAoUHJvdFR5cGVfcCkgeworCQkvLyB1ZHAKKwljYXNlIGtFcGxTZG9UeXBlVWRwOgorCQl7CisJCQkvLyBjYWxsIGNvbm5lY3Rpb24gaW50IGZ1bmN0aW9uIG9mIGxvd2VyIGxheWVyCisJCQlSZXQgPSBFcGxTZG9Bc3lTZXFJbml0Q29uKCZwU2RvQ29tQ29uLT5tX1Nkb1NlcUNvbkhkbCwKKwkJCQkJCSAgcFNkb0NvbUNvbi0+bV91aU5vZGVJZCwKKwkJCQkJCSAga0VwbFNkb1R5cGVVZHApOworCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCWdvdG8gRXhpdDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJLy8gQXNlbmQKKwljYXNlIGtFcGxTZG9UeXBlQXNuZDoKKwkJeworCQkJLy8gY2FsbCBjb25uZWN0aW9uIGludCBmdW5jdGlvbiBvZiBsb3dlciBsYXllcgorCQkJUmV0ID0gRXBsU2RvQXN5U2VxSW5pdENvbigmcFNkb0NvbUNvbi0+bV9TZG9TZXFDb25IZGwsCisJCQkJCQkgIHBTZG9Db21Db24tPm1fdWlOb2RlSWQsCisJCQkJCQkgIGtFcGxTZG9UeXBlQXNuZCk7CisJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJZ290byBFeGl0OworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQkvLyBQZG8gLT4gbm90IHN1cHBvcnRlZAorCWNhc2Uga0VwbFNkb1R5cGVQZG86CisJZGVmYXVsdDoKKwkJeworCQkJUmV0ID0ga0VwbFNkb0NvbVVuc3VwcG9ydGVkUHJvdDsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCX0JCQkvLyBlbmQgb2Ygc3dpdGNoKG1fUHJvdFR5cGVfcCkKKworCS8vIGNhbGwgcHJvY2VzcyBmdW5jdGlvbgorCVJldCA9IEVwbFNkb0NvbVByb2Nlc3NJbnRlcm4odWlGcmVlSGRsLAorCQkJCSAgICAga0VwbFNkb0NvbUNvbkV2ZW50SW5pdENvbiwgTlVMTCk7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKyNlbmRpZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQ29tSW5pdFRyYW5zZmVyQnlJbmRleAorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBpbml0IFNETyBUcmFuc2ZlciBmb3IgYSBkZWZpbmVkIGNvbm5lY3Rpb24KKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBTZG9Db21UcmFuc1BhcmFtX3AgICAgPSBTdHJ1Y3R1cmUgd2l0aCBwYXJhbWV0ZXJzIGZvciBjb25uZWN0aW9uCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9DKSkgIT0gMCkKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0NvbUluaXRUcmFuc2ZlckJ5SW5kZXgodEVwbFNkb0NvbVRyYW5zUGFyYW1CeUluZGV4ICoKKwkJCQkJICAgICAgIHBTZG9Db21UcmFuc1BhcmFtX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbFNkb0NvbUNvbiAqcFNkb0NvbUNvbjsKKworCS8vIGNoZWNrIHBhcmFtZXRlcgorCWlmICgocFNkb0NvbVRyYW5zUGFyYW1fcC0+bV91aVN1YmluZGV4ID49IDB4RkYpCisJICAgIHx8IChwU2RvQ29tVHJhbnNQYXJhbV9wLT5tX3VpSW5kZXggPT0gMCkKKwkgICAgfHwgKHBTZG9Db21UcmFuc1BhcmFtX3AtPm1fdWlJbmRleCA+IDB4RkZGRikKKwkgICAgfHwgKHBTZG9Db21UcmFuc1BhcmFtX3AtPm1fcERhdGEgPT0gTlVMTCkKKwkgICAgfHwgKHBTZG9Db21UcmFuc1BhcmFtX3AtPm1fdWlEYXRhU2l6ZSA9PSAwKSkgeworCQlSZXQgPSBrRXBsU2RvQ29tSW52YWxpZFBhcmFtOworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKHBTZG9Db21UcmFuc1BhcmFtX3AtPm1fU2RvQ29tQ29uSGRsID49IEVQTF9NQVhfU0RPX0NPTV9DT04pIHsKKwkJUmV0ID0ga0VwbFNkb0NvbUludmFsaWRIYW5kbGU7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZ2V0IHBvaW50ZXIgdG8gY29udHJvbCBzdHJ1Y3R1cmUgb2YgY29ubmVjdGlvbgorCXBTZG9Db21Db24gPQorCSAgICAmU2RvQ29tSW5zdGFuY2VfZy5tX1Nkb0NvbUNvbltwU2RvQ29tVHJhbnNQYXJhbV9wLT5tX1Nkb0NvbUNvbkhkbF07CisKKwkvLyBjaGVjayBpZiBoYW5kbGUgb2sKKwlpZiAocFNkb0NvbUNvbi0+bV9TZG9TZXFDb25IZGwgPT0gMCkgeworCQlSZXQgPSBrRXBsU2RvQ29tSW52YWxpZEhhbmRsZTsKKwkJZ290byBFeGl0OworCX0KKwkvLyBjaGVjayBpZiBjb21tYW5kIGxheWVyIGlzIGlkbGUKKwlpZiAoKHBTZG9Db21Db24tPm1fdWlUcmFuc2ZlcnJlZEJ5dGUgKyBwU2RvQ29tQ29uLT5tX3VpVHJhbnNTaXplKSA+IDApIHsJLy8gaGFuZGxlIGlzIG5vdCBpZGxlCisJCVJldCA9IGtFcGxTZG9Db21IYW5kbGVCdXN5OworCQlnb3RvIEV4aXQ7CisJfQorCS8vIHNhdmUgcGFyYW1ldGVyCisJLy8gY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGVuZCBvZiB0cmFuc2ZlcgorCXBTZG9Db21Db24tPm1fcGZuVHJhbnNmZXJGaW5pc2hlZCA9CisJICAgIHBTZG9Db21UcmFuc1BhcmFtX3AtPm1fcGZuU2RvRmluaXNoZWRDYjsKKwlwU2RvQ29tQ29uLT5tX3BVc2VyQXJnID0gcFNkb0NvbVRyYW5zUGFyYW1fcC0+bV9wVXNlckFyZzsKKworCS8vIHNldCB0eXBlIG9mIFNETyBjb21tYW5kCisJaWYgKHBTZG9Db21UcmFuc1BhcmFtX3AtPm1fU2RvQWNjZXNzVHlwZSA9PSBrRXBsU2RvQWNjZXNzVHlwZVJlYWQpIHsKKwkJcFNkb0NvbUNvbi0+bV9TZG9TZXJ2aWNlVHlwZSA9IGtFcGxTZG9TZXJ2aWNlUmVhZEJ5SW5kZXg7CisJfSBlbHNlIHsKKwkJcFNkb0NvbUNvbi0+bV9TZG9TZXJ2aWNlVHlwZSA9IGtFcGxTZG9TZXJ2aWNlV3JpdGVCeUluZGV4OworCisJfQorCS8vIHNhdmUgcG9pbnRlciB0byBkYXRhCisJcFNkb0NvbUNvbi0+bV9wRGF0YSA9IHBTZG9Db21UcmFuc1BhcmFtX3AtPm1fcERhdGE7CisJLy8gbWF4aW1hbCBieXRlcyB0byB0cmFuc2ZlcgorCXBTZG9Db21Db24tPm1fdWlUcmFuc1NpemUgPSBwU2RvQ29tVHJhbnNQYXJhbV9wLT5tX3VpRGF0YVNpemU7CisJLy8gYnl0ZXMgYWxyZWFkeSB0cmFuc2ZlcmVkCisJcFNkb0NvbUNvbi0+bV91aVRyYW5zZmVycmVkQnl0ZSA9IDA7CisKKwkvLyByZXNldCBwYXJ0cyBvZiBjb250cm9sIHN0cnVjdHVyZQorCXBTZG9Db21Db24tPm1fZHdMYXN0QWJvcnRDb2RlID0gMDsKKwlwU2RvQ29tQ29uLT5tX1Nkb1RyYW5zVHlwZSA9IGtFcGxTZG9UcmFuc0F1dG87CisJLy8gc2F2ZSB0aW1lb3V0CisJLy9wU2RvQ29tQ29uLT5tX3VpVGltZW91dCA9IFNkb0NvbVRyYW5zUGFyYW1fcC5tX3VpVGltZW91dDsKKworCS8vIHNhdmUgaW5kZXggYW5kIHN1YmluZGV4CisJcFNkb0NvbUNvbi0+bV91aVRhcmdldEluZGV4ID0gcFNkb0NvbVRyYW5zUGFyYW1fcC0+bV91aUluZGV4OworCXBTZG9Db21Db24tPm1fdWlUYXJnZXRTdWJJbmRleCA9IHBTZG9Db21UcmFuc1BhcmFtX3AtPm1fdWlTdWJpbmRleDsKKworCS8vIGNhbGwgcHJvY2VzcyBmdW5jdGlvbgorCVJldCA9IEVwbFNkb0NvbVByb2Nlc3NJbnRlcm4ocFNkb0NvbVRyYW5zUGFyYW1fcC0+bV9TZG9Db21Db25IZGwsIGtFcGxTZG9Db21Db25FdmVudFNlbmRGaXJzdCwJLy8gZXZlbnQgdG8gc3RhcnQgdHJhbnNmZXIKKwkJCQkgICAgIE5VTEwpOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7CisKK30KKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9Db21VbmRlZmluZUNvbgorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiB1bmRlZmluZSBhIFNETyBjb25uZWN0aW9uCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgU2RvQ29tQ29uSGRsX3AgICAgPSBoYW5kbGUgZm9yIHRoZSBjb25uZWN0aW9uCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9DKSkgIT0gMCkKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0NvbVVuZGVmaW5lQ29uKHRFcGxTZG9Db21Db25IZGwgU2RvQ29tQ29uSGRsX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdEVwbFNkb0NvbUNvbiAqcFNkb0NvbUNvbjsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJaWYgKFNkb0NvbUNvbkhkbF9wID49IEVQTF9NQVhfU0RPX0NPTV9DT04pIHsKKwkJUmV0ID0ga0VwbFNkb0NvbUludmFsaWRIYW5kbGU7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZ2V0IHBvaW50ZXIgdG8gY29udHJvbCBzdHJ1Y3R1cmUKKwlwU2RvQ29tQ29uID0gJlNkb0NvbUluc3RhbmNlX2cubV9TZG9Db21Db25bU2RvQ29tQ29uSGRsX3BdOworCisJLy8gJCQkIGQuay4gYWJvcnQgYSBydW5uaW5nIHRyYW5zZmVyIGJlZm9yZSBjbG9zaW5nIHRoZSBzZXF1ZW5jZSBsYXllcgorCisJaWYgKCgocFNkb0NvbUNvbi0+bV9TZG9TZXFDb25IZGwgJiB+RVBMX1NET19TRVFfSEFORExFX01BU0spICE9CisJICAgICBFUExfU0RPX1NFUV9JTlZBTElEX0hETCkKKwkgICAgJiYgKHBTZG9Db21Db24tPm1fU2RvU2VxQ29uSGRsICE9IDApKSB7CisJCS8vIGNsb3NlIGNvbm5lY3Rpb24gaW4gbG93ZXIgbGF5ZXIKKwkJc3dpdGNoIChwU2RvQ29tQ29uLT5tX1Nkb1Byb3RUeXBlKSB7CisJCWNhc2Uga0VwbFNkb1R5cGVBc25kOgorCQljYXNlIGtFcGxTZG9UeXBlVWRwOgorCQkJeworCQkJCVJldCA9CisJCQkJICAgIEVwbFNkb0FzeVNlcURlbENvbihwU2RvQ29tQ29uLT4KKwkJCQkJCSAgICAgICBtX1Nkb1NlcUNvbkhkbCk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJY2FzZSBrRXBsU2RvVHlwZVBkbzoKKwkJY2FzZSBrRXBsU2RvVHlwZUF1dG86CisJCWRlZmF1bHQ6CisJCQl7CisJCQkJUmV0ID0ga0VwbFNkb0NvbVVuc3VwcG9ydGVkUHJvdDsKKwkJCQlnb3RvIEV4aXQ7CisJCQl9CisKKwkJfQkJLy8gZW5kIG9mIHN3aXRjaChwU2RvQ29tQ29uLT5tX1Nkb1Byb3RUeXBlKQorCX0KKworCS8vIGNsZWFuIGNvbnRyb2xsIHN0cnVjdHVyZQorCUVQTF9NRU1TRVQocFNkb0NvbUNvbiwgMHgwMCwgc2l6ZW9mKHRFcGxTZG9Db21Db24pKTsKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKyNlbmRpZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQ29tR2V0U3RhdGUKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gcmV0dXJucyB0aGUgc3RhdGUgZm8gdGhlIGNvbm5lY3Rpb24KKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBTZG9Db21Db25IZGxfcCAgICA9IGhhbmRsZSBmb3IgdGhlIGNvbm5lY3Rpb24KKy8vICAgICAgICAgICAgICBwU2RvQ29tRmluaXNoZWRfcCA9IHBvaW50ZXIgdG8gc3RydWN0dXIgZm9yIHNkbyBzdGF0ZQorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Db21HZXRTdGF0ZSh0RXBsU2RvQ29tQ29uSGRsIFNkb0NvbUNvbkhkbF9wLAorCQkJCSAgICB0RXBsU2RvQ29tRmluaXNoZWQgKiBwU2RvQ29tRmluaXNoZWRfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsU2RvQ29tQ29uICpwU2RvQ29tQ29uOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlpZiAoU2RvQ29tQ29uSGRsX3AgPj0gRVBMX01BWF9TRE9fQ09NX0NPTikgeworCQlSZXQgPSBrRXBsU2RvQ29tSW52YWxpZEhhbmRsZTsKKwkJZ290byBFeGl0OworCX0KKwkvLyBnZXQgcG9pbnRlciB0byBjb250cm9sIHN0cnVjdHVyZQorCXBTZG9Db21Db24gPSAmU2RvQ29tSW5zdGFuY2VfZy5tX1Nkb0NvbUNvbltTZG9Db21Db25IZGxfcF07CisKKwkvLyBjaGVjayBpZiBoYW5kbGUgb2sKKwlpZiAocFNkb0NvbUNvbi0+bV9TZG9TZXFDb25IZGwgPT0gMCkgeworCQlSZXQgPSBrRXBsU2RvQ29tSW52YWxpZEhhbmRsZTsKKwkJZ290byBFeGl0OworCX0KKworCXBTZG9Db21GaW5pc2hlZF9wLT5tX3BVc2VyQXJnID0gcFNkb0NvbUNvbi0+bV9wVXNlckFyZzsKKwlwU2RvQ29tRmluaXNoZWRfcC0+bV91aU5vZGVJZCA9IHBTZG9Db21Db24tPm1fdWlOb2RlSWQ7CisJcFNkb0NvbUZpbmlzaGVkX3AtPm1fdWlUYXJnZXRJbmRleCA9IHBTZG9Db21Db24tPm1fdWlUYXJnZXRJbmRleDsKKwlwU2RvQ29tRmluaXNoZWRfcC0+bV91aVRhcmdldFN1YkluZGV4ID0gcFNkb0NvbUNvbi0+bV91aVRhcmdldFN1YkluZGV4OworCXBTZG9Db21GaW5pc2hlZF9wLT5tX3VpVHJhbnNmZXJyZWRCeXRlID0KKwkgICAgcFNkb0NvbUNvbi0+bV91aVRyYW5zZmVycmVkQnl0ZTsKKwlwU2RvQ29tRmluaXNoZWRfcC0+bV9kd0Fib3J0Q29kZSA9IHBTZG9Db21Db24tPm1fZHdMYXN0QWJvcnRDb2RlOworCXBTZG9Db21GaW5pc2hlZF9wLT5tX1Nkb0NvbUNvbkhkbCA9IFNkb0NvbUNvbkhkbF9wOworCWlmIChwU2RvQ29tQ29uLT5tX1Nkb1NlcnZpY2VUeXBlID09IGtFcGxTZG9TZXJ2aWNlV3JpdGVCeUluZGV4KSB7CisJCXBTZG9Db21GaW5pc2hlZF9wLT5tX1Nkb0FjY2Vzc1R5cGUgPSBrRXBsU2RvQWNjZXNzVHlwZVdyaXRlOworCX0gZWxzZSB7CisJCXBTZG9Db21GaW5pc2hlZF9wLT5tX1Nkb0FjY2Vzc1R5cGUgPSBrRXBsU2RvQWNjZXNzVHlwZVJlYWQ7CisJfQorCisJaWYgKHBTZG9Db21Db24tPm1fZHdMYXN0QWJvcnRDb2RlICE9IDApIHsJLy8gc2RvIGFib3J0CisJCXBTZG9Db21GaW5pc2hlZF9wLT5tX1Nkb0NvbUNvblN0YXRlID0KKwkJICAgIGtFcGxTZG9Db21UcmFuc2ZlclJ4QWJvcnRlZDsKKworCQkvLyBkZWxldGUgYWJvcnQgY29kZQorCQlwU2RvQ29tQ29uLT5tX2R3TGFzdEFib3J0Q29kZSA9IDA7CisKKwl9IGVsc2UgaWYgKChwU2RvQ29tQ29uLT5tX1Nkb1NlcUNvbkhkbCAmIH5FUExfU0RPX1NFUV9IQU5ETEVfTUFTSykgPT0gRVBMX1NET19TRVFfSU5WQUxJRF9IREwpIHsJLy8gY2hlY2sgc3RhdGUKKwkJcFNkb0NvbUZpbmlzaGVkX3AtPm1fU2RvQ29tQ29uU3RhdGUgPQorCQkgICAga0VwbFNkb0NvbVRyYW5zZmVyTG93ZXJMYXllckFib3J0OworCX0gZWxzZSBpZiAocFNkb0NvbUNvbi0+bV9TZG9Db21TdGF0ZSA9PSBrRXBsU2RvQ29tU3RhdGVDbGllbnRXYWl0SW5pdCkgeworCQkvLyBmaW5pc2hlZAorCQlwU2RvQ29tRmluaXNoZWRfcC0+bV9TZG9Db21Db25TdGF0ZSA9CisJCSAgICBrRXBsU2RvQ29tVHJhbnNmZXJOb3RBY3RpdmU7CisJfSBlbHNlIGlmIChwU2RvQ29tQ29uLT5tX3VpVHJhbnNTaXplID09IDApIHsJLy8gZmluaXNoZWQKKwkJcFNkb0NvbUZpbmlzaGVkX3AtPm1fU2RvQ29tQ29uU3RhdGUgPQorCQkgICAga0VwbFNkb0NvbVRyYW5zZmVyRmluaXNoZWQ7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7CisKK30KKyNlbmRpZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQ29tU2RvQWJvcnQKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gYWJvcnQgYSBzZG8gdHJhbnNmZXIKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBTZG9Db21Db25IZGxfcCAgICA9IGhhbmRsZSBmb3IgdGhlIGNvbm5lY3Rpb24KKy8vICAgICAgICAgICAgICBkd0Fib3J0Q29kZV9wICAgICA9IGFib3J0IGNvZGUKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET0MpKSAhPSAwKQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQ29tU2RvQWJvcnQodEVwbFNkb0NvbUNvbkhkbCBTZG9Db21Db25IZGxfcCwKKwkJCQkgICAgRFdPUkQgZHdBYm9ydENvZGVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsU2RvQ29tQ29uICpwU2RvQ29tQ29uOworCisJaWYgKFNkb0NvbUNvbkhkbF9wID49IEVQTF9NQVhfU0RPX0NPTV9DT04pIHsKKwkJUmV0ID0ga0VwbFNkb0NvbUludmFsaWRIYW5kbGU7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gZ2V0IHBvaW50ZXIgdG8gY29udHJvbCBzdHJ1Y3R1cmUgb2YgY29ubmVjdGlvbgorCXBTZG9Db21Db24gPSAmU2RvQ29tSW5zdGFuY2VfZy5tX1Nkb0NvbUNvbltTZG9Db21Db25IZGxfcF07CisKKwkvLyBjaGVjayBpZiBoYW5kbGUgb2sKKwlpZiAocFNkb0NvbUNvbi0+bV9TZG9TZXFDb25IZGwgPT0gMCkgeworCQlSZXQgPSBrRXBsU2RvQ29tSW52YWxpZEhhbmRsZTsKKwkJZ290byBFeGl0OworCX0KKwkvLyBzYXZlIHBvaW50ZXIgdG8gYWJvcnQgY29kZQorCXBTZG9Db21Db24tPm1fcERhdGEgPSAoQllURSAqKSAmIGR3QWJvcnRDb2RlX3A7CisKKwlSZXQgPSBFcGxTZG9Db21Qcm9jZXNzSW50ZXJuKFNkb0NvbUNvbkhkbF9wLAorCQkJCSAgICAga0VwbFNkb0NvbUNvbkV2ZW50QWJvcnQsCisJCQkJICAgICAodEVwbEFzeVNkb0NvbSAqKSBOVUxMKTsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorI2VuZGlmCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICAgICAgRXBsU2RvQ29tUmVjZWl2ZUNiCisvLworLy8gRGVzY3JpcHRpb246ICAgICBjYWxsYmFjayBmdW5jdGlvbiBmb3IgU0RPIFNlcXVlbmNlIExheWVyCisvLyAgICAgICAgICAgICAgICAgIC0+IGluZGljYXRlcyBuZXcgZGF0YQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogICAgICBTZG9TZXFDb25IZGxfcCA9IEhhbmRsZSBmb3IgY29ubmVjdGlvbgorLy8gICAgICAgICAgICAgICAgICBwQXN5U2RvQ29tX3AgICA9IHBvaW50ZXIgdG8gZGF0YQorLy8gICAgICAgICAgICAgICAgICB1aURhdGFTaXplX3AgICA9IHNpemUgb2YgZGF0YSAoJCQkIG5vdCB1c2VkIHlldCwgYnV0IGl0IHNob3VsZCkKKy8vCisvLworLy8gUmV0dXJuczoKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0NvbVJlY2VpdmVDYih0RXBsU2RvU2VxQ29uSGRsIFNkb1NlcUNvbkhkbF9wLAorCQkJCSAgICAgdEVwbEFzeVNkb0NvbSAqIHBBc3lTZG9Db21fcCwKKwkJCQkgICAgIHVuc2lnbmVkIGludCB1aURhdGFTaXplX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwkvLyBzZWFyY2ggY29ubmVjdGlvbiBpbnRlcm5hbGx5CisJUmV0ID0gRXBsU2RvQ29tU2VhcmNoQ29uSW50ZXJuKFNkb1NlcUNvbkhkbF9wLAorCQkJCSAgICAgICBrRXBsU2RvQ29tQ29uRXZlbnRSZWMsIHBBc3lTZG9Db21fcCk7CisKKwlFUExfREJHTFZMX1NET19UUkFDRTMKKwkgICAgKCJFcGxTZG9Db21SZWNlaXZlQ2IgU2RvU2VxQ29uSGRsOiAweCVYLCBGaXJzdCBCeXRlIG9mIHBBc3lTZG9Db21fcDogMHglMDJYLCB1aURhdGFTaXplX3A6IDB4JTA0WFxuIiwKKwkgICAgIFNkb1NlcUNvbkhkbF9wLCAoV09SRCkgcEFzeVNkb0NvbV9wLT5tX2xlX2FiQ29tbWFuZERhdGFbMF0sCisJICAgICB1aURhdGFTaXplX3ApOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgICAgIEVwbFNkb0NvbUNvbkNiCisvLworLy8gRGVzY3JpcHRpb246ICAgICBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgYnkgU0RPIFNlcXVlbmNlIExheWVyIHRvIGluZm9ybQorLy8gICAgICAgICAgICAgICAgICBjb21tYW5kIGxheWVyIGFib3V0IHN0YXRlIGNoYW5nZSBvZiBjb25uZWN0aW9uCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgICAgIFNkb1NlcUNvbkhkbF9wICAgICAgPSBIYW5kbGUgb2YgdGhlIGNvbm5lY3Rpb24KKy8vICAgICAgICAgICAgICAgICAgQXN5U2RvQ29uU3RhdGVfcCAgICA9IEV2ZW50IG9mIHRoZSBjb25uZWN0aW9uCisvLworLy8KKy8vIFJldHVybnM6ICAgICAgICAgdEVwbEtlcm5lbCAgPSBFcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0NvbUNvbkNiKHRFcGxTZG9TZXFDb25IZGwgU2RvU2VxQ29uSGRsX3AsCisJCQkJIHRFcGxBc3lTZG9Db25TdGF0ZSBBc3lTZG9Db25TdGF0ZV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxTZG9Db21Db25FdmVudCBTZG9Db21Db25FdmVudCA9IGtFcGxTZG9Db21Db25FdmVudFNlbmRGaXJzdDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gY2hlY2sgc3RhdGUKKwlzd2l0Y2ggKEFzeVNkb0NvblN0YXRlX3ApIHsKKwljYXNlIGtBc3lTZG9Db25TdGF0ZUNvbm5lY3RlZDoKKwkJeworCQkJRVBMX0RCR0xWTF9TRE9fVFJBQ0UwKCJDb25uZWN0aW9uIGVzdGFibGlzaGVkXG4iKTsKKwkJCVNkb0NvbUNvbkV2ZW50ID0ga0VwbFNkb0NvbUNvbkV2ZW50Q29uRXN0YWJsaXNoZWQ7CisJCQkvLyBzdGFydCB0cmFuc21pc3Npb24gaWYgbmVlZGVkCisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrQXN5U2RvQ29uU3RhdGVJbml0RXJyb3I6CisJCXsKKwkJCUVQTF9EQkdMVkxfU0RPX1RSQUNFMCgiRXJyb3IgZHVyaW5nIGluaXRpYWxpc2F0aW9uXG4iKTsKKwkJCVNkb0NvbUNvbkV2ZW50ID0ga0VwbFNkb0NvbUNvbkV2ZW50SW5pdEVycm9yOworCQkJLy8gaW5mb3JtIGFwcCBhYm91dCBlcnJvciBhbmQgY2xvc2Ugc2VxdWVuY2UgbGF5ZXIgaGFuZGxlCisJCQlicmVhazsKKwkJfQorCisJY2FzZSBrQXN5U2RvQ29uU3RhdGVDb25DbG9zZWQ6CisJCXsKKwkJCUVQTF9EQkdMVkxfU0RPX1RSQUNFMCgiQ29ubmVjdGlvbiBjbG9zZWRcbiIpOworCQkJU2RvQ29tQ29uRXZlbnQgPSBrRXBsU2RvQ29tQ29uRXZlbnRDb25DbG9zZWQ7CisJCQkvLyBjbG9zZSBzZXF1ZW5jZSBsYXllciBoYW5kbGUKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtBc3lTZG9Db25TdGF0ZUFja1JlY2VpdmVkOgorCQl7CisJCQlFUExfREJHTFZMX1NET19UUkFDRTAoIkFja25vd2xhZ2UgcmVjZWl2ZWRcbiIpOworCQkJU2RvQ29tQ29uRXZlbnQgPSBrRXBsU2RvQ29tQ29uRXZlbnRBY2tSZWNlaXZlZDsKKwkJCS8vIGNvbnRpbnVlIHRyYW5zbWlzc2lvbgorCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0FzeVNkb0NvblN0YXRlRnJhbWVTZW5kZWQ6CisJCXsKKwkJCUVQTF9EQkdMVkxfU0RPX1RSQUNFMCgiT25lIEZyYW1lIHNlbnRcbiIpOworCQkJU2RvQ29tQ29uRXZlbnQgPSBrRXBsU2RvQ29tQ29uRXZlbnRGcmFtZVNlbmRlZDsKKwkJCS8vIHRvIGNvbnRpbnVlIHRyYW5zbWlzc2lvbgorCQkJYnJlYWs7CisKKwkJfQorCisJY2FzZSBrQXN5U2RvQ29uU3RhdGVUaW1lb3V0OgorCQl7CisJCQlFUExfREJHTFZMX1NET19UUkFDRTAoIlRpbWVvdXRcbiIpOworCQkJU2RvQ29tQ29uRXZlbnQgPSBrRXBsU2RvQ29tQ29uRXZlbnRUaW1lb3V0OworCQkJLy8gY2xvc2Ugc2VxdWVuY2UgbGF5ZXIgaGFuZGxlCisJCQlicmVhazsKKworCQl9CisJfQkJCS8vIGVuZCBvZiBzd2l0Y2goQXN5U2RvQ29uU3RhdGVfcCkKKworCVJldCA9IEVwbFNkb0NvbVNlYXJjaENvbkludGVybihTZG9TZXFDb25IZGxfcCwKKwkJCQkgICAgICAgU2RvQ29tQ29uRXZlbnQsICh0RXBsQXN5U2RvQ29tICopIE5VTEwpOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgICAgIEVwbFNkb0NvbVNlYXJjaENvbkludGVybgorLy8KKy8vIERlc2NyaXB0aW9uOiAgICAgc2VhcmNoIGEgU2RvIFNlcXVlbmNlIExheWVyIGNvbm5lY3Rpb24gaGFuZGxlIGluIHRoZQorLy8gICAgICAgICAgICAgICAgICBjb250cm9sIHN0cnVjdHVyZSBvZiB0aGUgQ29tbWFuZCBMYXllcgorLy8KKy8vIFBhcmFtZXRlcnM6ICAgICAgU2RvU2VxQ29uSGRsX3AgICAgID0gSGFuZGxlIHRvIHNlYXJjaAorLy8gICAgICAgICAgICAgICAgICBTZG9Db21Db25FdmVudF9wID0gZXZlbnQgdG8gcHJvY2VzcworLy8gICAgICAgICAgICAgICAgICBwQXN5U2RvQ29tX3AgICAgID0gcG9pbnRlciB0byByZWNlaXZlZCBmcmFtZQorLy8KKy8vIFJldHVybnM6ICAgICAgICAgdEVwbEtlcm5lbAorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQ29tU2VhcmNoQ29uSW50ZXJuKHRFcGxTZG9TZXFDb25IZGwgU2RvU2VxQ29uSGRsX3AsCisJCQkJCSAgIHRFcGxTZG9Db21Db25FdmVudCBTZG9Db21Db25FdmVudF9wLAorCQkJCQkgICB0RXBsQXN5U2RvQ29tICogcEFzeVNkb0NvbV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxTZG9Db21Db24gKnBTZG9Db21Db247CisJdEVwbFNkb0NvbUNvbkhkbCBIZGxDb3VudDsKKwl0RXBsU2RvQ29tQ29uSGRsIEhkbEZyZWU7CisKKwlSZXQgPSBrRXBsU2RvQ29tTm90UmVzcG9uc2libGU7CisKKwkvLyBnZXQgcG9pbnRlciB0byBmaXJzdCBlbGVtZW50IG9mIHRoZSBhcnJheQorCXBTZG9Db21Db24gPSAmU2RvQ29tSW5zdGFuY2VfZy5tX1Nkb0NvbUNvblswXTsKKwlIZGxDb3VudCA9IDA7CisJSGRsRnJlZSA9IDB4RkZGRjsKKwl3aGlsZSAoSGRsQ291bnQgPCBFUExfTUFYX1NET19DT01fQ09OKSB7CisJCWlmIChwU2RvQ29tQ29uLT5tX1Nkb1NlcUNvbkhkbCA9PSBTZG9TZXFDb25IZGxfcCkgewkvLyBtYXRjaGluZyBjb21tYW5kIGxheWVyIGhhbmRsZSBmb3VuZAorCQkJUmV0ID0gRXBsU2RvQ29tUHJvY2Vzc0ludGVybihIZGxDb3VudCwKKwkJCQkJCSAgICAgU2RvQ29tQ29uRXZlbnRfcCwKKwkJCQkJCSAgICAgcEFzeVNkb0NvbV9wKTsKKwkJfSBlbHNlIGlmICgocFNkb0NvbUNvbi0+bV9TZG9TZXFDb25IZGwgPT0gMCkKKwkJCSAgICYmIChIZGxGcmVlID09IDB4RkZGRikpIHsKKwkJCUhkbEZyZWUgPSBIZGxDb3VudDsKKwkJfQorCisJCXBTZG9Db21Db24rKzsKKwkJSGRsQ291bnQrKzsKKwl9CisKKwlpZiAoUmV0ID09IGtFcGxTZG9Db21Ob3RSZXNwb25zaWJsZSkgewkvLyBubyByZXNwb25zaWJsZSBjb21tYW5kIGxheWVyIGhhbmRsZSBmb3VuZAorCQlpZiAoSGRsRnJlZSA9PSAweEZGRkYpIHsJLy8gbm8gZnJlZSBoYW5kbGUKKwkJCS8vIGRlbGV0ZSBjb25uZWN0aW9uIGltbWVkaWF0ZWx5CisJCQkvLyAyMDA4LzA0LzE0IG0udS4vZC5rLiBUaGlzIGNvbm5lY3Rpb24gYWN0dWFsbHkgZG9lcyBub3QgZXhpc3QuCisJCQkvLyAgICAgICAgICAgICAgICAgICAgICBwU2RvQ29tQ29uIGlzIGludmFsaWQuCisJCQkvLyBSZXQgPSBFcGxTZG9Bc3lTZXFEZWxDb24ocFNkb0NvbUNvbi0+bV9TZG9TZXFDb25IZGwpOworCQkJUmV0ID0ga0VwbFNkb0NvbU5vRnJlZUhhbmRsZTsKKwkJfSBlbHNlIHsJLy8gY3JlYXRlIG5ldyBoYW5kbGUKKwkJCUhkbENvdW50ID0gSGRsRnJlZTsKKwkJCXBTZG9Db21Db24gPSAmU2RvQ29tSW5zdGFuY2VfZy5tX1Nkb0NvbUNvbltIZGxDb3VudF07CisJCQlwU2RvQ29tQ29uLT5tX1Nkb1NlcUNvbkhkbCA9IFNkb1NlcUNvbkhkbF9wOworCQkJUmV0ID0gRXBsU2RvQ29tUHJvY2Vzc0ludGVybihIZGxDb3VudCwKKwkJCQkJCSAgICAgU2RvQ29tQ29uRXZlbnRfcCwKKwkJCQkJCSAgICAgcEFzeVNkb0NvbV9wKTsKKwkJfQorCX0KKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgICAgIEVwbFNkb0NvbVByb2Nlc3NJbnRlcm4KKy8vCisvLyBEZXNjcmlwdGlvbjogICAgIHNlYXJjaCBhIFNkbyBTZXF1ZW5jZSBMYXllciBjb25uZWN0aW9uIGhhbmRsZSBpbiB0aGUKKy8vICAgICAgICAgICAgICAgICAgY29udHJvbCBzdHJ1Y3RlciBvZiB0aGUgQ29tbWFuZCBMYXllcgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogICAgICBTZG9Db21Db25fcCAgICAgPSBpbmRleCBvZiBjb250cm9sIHN0cnVjdHVyZSBvZiBjb25uZWN0aW9uCisvLyAgICAgICAgICAgICAgICAgIFNkb0NvbUNvbkV2ZW50X3AgPSBldmVudCB0byBwcm9jZXNzCisvLyAgICAgICAgICAgICAgICAgIHBBc3lTZG9Db21fcCAgICAgPSBwb2ludGVyIHRvIHJlY2VpdmVkIGZyYW1lCisvLworLy8gUmV0dXJuczogICAgICAgICB0RXBsS2VybmVsICA9ICBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0NvbVByb2Nlc3NJbnRlcm4odEVwbFNkb0NvbUNvbkhkbCBTZG9Db21Db25fcCwKKwkJCQkJIHRFcGxTZG9Db21Db25FdmVudCBTZG9Db21Db25FdmVudF9wLAorCQkJCQkgdEVwbEFzeVNkb0NvbSAqIHBBc3lTZG9Db21fcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl0RXBsU2RvQ29tQ29uICpwU2RvQ29tQ29uOworCUJZVEUgYkZsYWc7CisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPUykpICE9IDApCisJRFdPUkQgZHdBYm9ydENvZGU7CisJdW5zaWduZWQgaW50IHVpU2l6ZTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzIpCisJLy8gZW50ZXIgIGNyaXRpY2FsIHNlY3Rpb24gZm9yIHByb2Nlc3MgZnVuY3Rpb24KKwlFbnRlckNyaXRpY2FsU2VjdGlvbihTZG9Db21JbnN0YW5jZV9nLm1fcENyaXRpY2FsU2VjdGlvbik7CisJRVBMX0RCR0xWTF9TRE9fVFJBQ0UwCisJICAgICgiXG5cdEVudGVyQ2l0aWNhbFNlY3Rpb24gRXBsU2RvQ29tUHJvY2Vzc0ludGVyblxuXG4iKTsKKyNlbmRpZgorCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBnZXQgcG9pbnRlciB0byBjb250cm9sIHN0cnVjdHVyZQorCXBTZG9Db21Db24gPSAmU2RvQ29tSW5zdGFuY2VfZy5tX1Nkb0NvbUNvbltTZG9Db21Db25fcF07CisKKwkvLyBwcm9jZXNzIHN0YXRlIG1hc2NoaW5lCisJc3dpdGNoIChwU2RvQ29tQ29uLT5tX1Nkb0NvbVN0YXRlKSB7CisJCS8vIGlkbGUgc3RhdGUKKwljYXNlIGtFcGxTZG9Db21TdGF0ZUlkbGU6CisJCXsKKwkJCS8vIGNoZWNrIGV2ZW50cworCQkJc3dpdGNoIChTZG9Db21Db25FdmVudF9wKSB7CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET0MpKSAhPSAwKQorCQkJCS8vIGluaXQgY29uIGZvciBjbGllbnQKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50SW5pdENvbjoKKwkJCQl7CisKKwkJCQkJLy8gY2FsbCBvZiB0aGUgaW5pdCBmdW5jdGlvbiBhbHJlYWR5CisJCQkJCS8vIHByb2Nlc3NlZCBpbiBFcGxTZG9Db21EZWZpbmVDb24oKQorCQkJCQkvLyBvbmx5IGNoYW5nZSBzdGF0ZSB0byBrRXBsU2RvQ29tU3RhdGVDbGllbnRXYWl0SW5pdAorCQkJCQlwU2RvQ29tQ29uLT5tX1Nkb0NvbVN0YXRlID0KKwkJCQkJICAgIGtFcGxTZG9Db21TdGF0ZUNsaWVudFdhaXRJbml0OworCQkJCQlicmVhazsKKwkJCQl9CisjZW5kaWYKKworCQkJCS8vIGludCBjb24gZm9yIHNlcnZlcgorCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRSZWM6CisJCQkJeworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9TKSkgIT0gMCkKKwkJCQkJLy8gY2hlY2sgaWYgaW5pdCBvZiBhbiB0cmFuc2ZlciBhbmQgbm8gU0RPIGFib3J0CisJCQkJCWlmICgocEFzeVNkb0NvbV9wLT5tX2xlX2JGbGFncyAmIDB4ODApID09IDApIHsJLy8gU0RPIHJlcXVlc3QKKwkJCQkJCWlmICgocEFzeVNkb0NvbV9wLT5tX2xlX2JGbGFncyAmIDB4NDApID09IDApIHsJLy8gbm8gU0RPIGFib3J0CisJCQkJCQkJLy8gc2F2ZSB0YW5zYWN0aW9uIGlkCisJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJICAgIG1fYlRyYW5zYWN0aW9uSWQgPQorCQkJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlCisJCQkJCQkJICAgICgmcEFzeVNkb0NvbV9wLT4KKwkJCQkJCQkgICAgIG1fbGVfYlRyYW5zYWN0aW9uSWQpOworCQkJCQkJCS8vIGNoZWNrIGNvbW1hbmQKKwkJCQkJCQlzd2l0Y2ggKHBBc3lTZG9Db21fcC0+CisJCQkJCQkJCW1fbGVfYkNvbW1hbmRJZCkKKwkJCQkJCQl7CisJCQkJCQkJY2FzZSBrRXBsU2RvU2VydmljZU5JTDoKKwkJCQkJCQkJewkvLyBzaW1wbHkgYWNrbm93bGVnZGUgTklMIGNvbW1hbmQgb24gc2VxdWVuY2UgbGF5ZXIKKworCQkJCQkJCQkJUmV0ID0KKwkJCQkJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZW5kRGF0YQorCQkJCQkJCQkJICAgIChwU2RvQ29tQ29uLT4KKwkJCQkJCQkJCSAgICAgbV9TZG9TZXFDb25IZGwsCisJCQkJCQkJCQkgICAgIDAsCisJCQkJCQkJCQkgICAgICh0RXBsRnJhbWUKKwkJCQkJCQkJCSAgICAgICopCisJCQkJCQkJCQkgICAgIE5VTEwpOworCisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJfQorCisJCQkJCQkJY2FzZSBrRXBsU2RvU2VydmljZVJlYWRCeUluZGV4OgorCQkJCQkJCQl7CS8vIHJlYWQgYnkgaW5kZXgKKworCQkJCQkJCQkJLy8gc2VhcmNoIGVudHJ5IGFuIHN0YXJ0IHRyYW5zZmVyCisJCQkJCQkJCQlFcGxTZG9Db21TZXJ2ZXJJbml0UmVhZEJ5SW5kZXgKKwkJCQkJCQkJCSAgICAocFNkb0NvbUNvbiwKKwkJCQkJCQkJCSAgICAgcEFzeVNkb0NvbV9wKTsKKwkJCQkJCQkJCS8vIGNoZWNrIG5leHQgc3RhdGUKKwkJCQkJCQkJCWlmIChwU2RvQ29tQ29uLT5tX3VpVHJhbnNTaXplID09IDApIHsJLy8gcmVhZHkgLT4gc3RheSBpZGxlCisJCQkJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJCQkJICAgIG1fU2RvQ29tU3RhdGUKKwkJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJCSAgICBrRXBsU2RvQ29tU3RhdGVJZGxlOworCQkJCQkJCQkJCS8vIHJlc2V0IGFib3J0IGNvZGUKKwkJCQkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkJCQkgICAgbV9kd0xhc3RBYm9ydENvZGUKKwkJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJCSAgICAwOworCQkJCQkJCQkJfSBlbHNlIHsJLy8gc2VnbWVudGVkIHRyYW5zZmVyCisJCQkJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJCQkJICAgIG1fU2RvQ29tU3RhdGUKKwkJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJCSAgICBrRXBsU2RvQ29tU3RhdGVTZXJ2ZXJTZWdtVHJhbnM7CisJCQkJCQkJCQl9CisKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQl9CisKKwkJCQkJCQljYXNlIGtFcGxTZG9TZXJ2aWNlV3JpdGVCeUluZGV4OgorCQkJCQkJCQl7CisKKwkJCQkJCQkJCS8vIHNlYXJjaCBlbnRyeSBhbiBzdGFydCB3cml0ZQorCQkJCQkJCQkJRXBsU2RvQ29tU2VydmVySW5pdFdyaXRlQnlJbmRleAorCQkJCQkJCQkJICAgIChwU2RvQ29tQ29uLAorCQkJCQkJCQkJICAgICBwQXN5U2RvQ29tX3ApOworCQkJCQkJCQkJLy8gY2hlY2sgbmV4dCBzdGF0ZQorCQkJCQkJCQkJaWYgKHBTZG9Db21Db24tPm1fdWlUcmFuc1NpemUgPT0gMCkgewkvLyBhbHJlYWR5IC0+IHN0YXkgaWRsZQorCQkJCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCQkJCSAgICBtX1Nkb0NvbVN0YXRlCisJCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCQkgICAga0VwbFNkb0NvbVN0YXRlSWRsZTsKKwkJCQkJCQkJCQkvLyByZXNldCBhYm9ydCBjb2RlCisJCQkJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJCQkJICAgIG1fZHdMYXN0QWJvcnRDb2RlCisJCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCQkgICAgMDsKKwkJCQkJCQkJCX0gZWxzZSB7CS8vIHNlZ21lbnRlZCB0cmFuc2ZlcgorCQkJCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCQkJCSAgICBtX1Nkb0NvbVN0YXRlCisJCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCQkgICAga0VwbFNkb0NvbVN0YXRlU2VydmVyU2VnbVRyYW5zOworCQkJCQkJCQkJfQorCisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJfQorCisJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJeworCQkJCQkJCQkJLy8gIHVuc3VwcG9ydGVkIGNvbW1hbmQKKwkJCQkJCQkJCS8vICAgICAgIC0+IGFib3J0IHNlbmRlbgorCQkJCQkJCQkJZHdBYm9ydENvZGUKKwkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkgICAgRVBMX1NET0FDX1VOS05PV05fQ09NTUFORF9TUEVDSUZJRVI7CisJCQkJCQkJCQkvLyBzZW5kIGFib3J0CisJCQkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkJCSAgICBtX3BEYXRhCisJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJICAgIChCWVRFCisJCQkJCQkJCQkgICAgICopCisJCQkJCQkJCQkgICAgJgorCQkJCQkJCQkJICAgIGR3QWJvcnRDb2RlOworCQkJCQkJCQkJUmV0ID0KKwkJCQkJCQkJCSAgICBFcGxTZG9Db21TZXJ2ZXJTZW5kRnJhbWVJbnRlcm4KKwkJCQkJCQkJCSAgICAocFNkb0NvbUNvbiwKKwkJCQkJCQkJCSAgICAgMCwKKwkJCQkJCQkJCSAgICAgMCwKKwkJCQkJCQkJCSAgICAga0VwbFNkb0NvbVNlbmRUeXBlQWJvcnQpOworCisJCQkJCQkJCX0KKworCQkJCQkJCX0JLy8gZW5kIG9mIHN3aXRjaChwQXN5U2RvQ29tX3AtPm1fbGVfYkNvbW1hbmRJZCkKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsJLy8gdGhpcyBjb21tYW5kIGxheWVyIGhhbmRsZSBpcyBub3QgcmVzcG9uc2libGUKKwkJCQkJCS8vICh3cm9uZyBkaXJlY3Rpb24gb3Igd3JvbmcgdHJhbnNhY3Rpb24gSUQpCisJCQkJCQlSZXQgPSBrRXBsU2RvQ29tTm90UmVzcG9uc2libGU7CisJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCX0KKyNlbmRpZiAvLyBlbmQgb2YgI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9TKSkgIT0gMCkKKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBjb25uZWN0aW9uIGNsb3NlZAorCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRJbml0RXJyb3I6CisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudFRpbWVvdXQ6CisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudENvbkNsb3NlZDoKKwkJCQl7CisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxTZG9Bc3lTZXFEZWxDb24ocFNkb0NvbUNvbi0+CisJCQkJCQkJICAgICAgIG1fU2RvU2VxQ29uSGRsKTsKKwkJCQkJLy8gY2xlYW4gY29udHJvbCBzdHJ1Y3R1cmUKKwkJCQkJRVBMX01FTVNFVChwU2RvQ29tQ29uLCAweDAwLAorCQkJCQkJICAgc2l6ZW9mKHRFcGxTZG9Db21Db24pKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCS8vIGQuay4gZG8gbm90aGluZworCQkJCWJyZWFrOworCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKFNkb0NvbUNvbkV2ZW50X3ApCisJCQlicmVhazsKKwkJfQorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET1MpKSAhPSAwKQorCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJLy8gU0RPIFNlcnZlciBwYXJ0CisJCS8vIHNlZ21lbnRlZCB0cmFuc2ZlcgorCWNhc2Uga0VwbFNkb0NvbVN0YXRlU2VydmVyU2VnbVRyYW5zOgorCQl7CisJCQkvLyBjaGVjayBldmVudHMKKwkJCXN3aXRjaCAoU2RvQ29tQ29uRXZlbnRfcCkgeworCQkJCS8vIHNlbmQgbmV4dCBmcmFtZQorCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRBY2tSZWNlaXZlZDoKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50RnJhbWVTZW5kZWQ6CisJCQkJeworCQkJCQkvLyBjaGVjayBpZiBpdCBpcyBhIHJlYWQKKwkJCQkJaWYgKHBTZG9Db21Db24tPm1fU2RvU2VydmljZVR5cGUgPT0KKwkJCQkJICAgIGtFcGxTZG9TZXJ2aWNlUmVhZEJ5SW5kZXgpIHsKKwkJCQkJCS8vIHNlbmQgbmV4dCBmcmFtZQorCQkJCQkJRXBsU2RvQ29tU2VydmVyU2VuZEZyYW1lSW50ZXJuCisJCQkJCQkgICAgKHBTZG9Db21Db24sIDAsIDAsCisJCQkJCQkgICAgIGtFcGxTZG9Db21TZW5kVHlwZVJlcyk7CisJCQkJCQkvLyBpZiBhbGwgc2VuZCAtPiBiYWNrIHRvIGlkbGUKKwkJCQkJCWlmIChwU2RvQ29tQ29uLT5tX3VpVHJhbnNTaXplID09IDApIHsJLy8gYmFjayB0byBpZGxlCisJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJICAgIG1fU2RvQ29tU3RhdGUgPQorCQkJCQkJCSAgICBrRXBsU2RvQ29tU3RhdGVJZGxlOworCQkJCQkJCS8vIHJlc2V0IGFib3J0IGNvZGUKKwkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgbV9kd0xhc3RBYm9ydENvZGUgPQorCQkJCQkJCSAgICAwOworCQkJCQkJfQorCisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gcHJvY2VzcyBuZXh0IGZyYW1lCisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudFJlYzoKKwkJCQl7CisJCQkJCS8vIGNoZWNrIGlmIHRoZSBmcmFtZSBpcyBhIFNETyByZXNwb25zZSBhbmQgaGFzIHRoZSByaWdodCB0cmFuc2FjdGlvbiBJRAorCQkJCQliRmxhZyA9CisJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlKCZwQXN5U2RvQ29tX3AtPgorCQkJCQkJCSAgICAgbV9sZV9iRmxhZ3MpOworCQkJCQlpZiAoKChiRmxhZyAmIDB4ODApICE9IDApCisJCQkJCSAgICAmJgorCQkJCQkgICAgKEFtaUdldEJ5dGVGcm9tTGUKKwkJCQkJICAgICAoJnBBc3lTZG9Db21fcC0+CisJCQkJCSAgICAgIG1fbGVfYlRyYW5zYWN0aW9uSWQpID09CisJCQkJCSAgICAgcFNkb0NvbUNvbi0+bV9iVHJhbnNhY3Rpb25JZCkpIHsKKwkJCQkJCS8vIGNoZWNrIGlmIGl0IGlzIGEgYWJvcnQKKwkJCQkJCWlmICgoYkZsYWcgJiAweDQwKSAhPSAwKSB7CS8vIFNETyBhYm9ydAorCQkJCQkJCS8vIGNsZWFyIGNvbnRyb2wgc3RydWN0dXJlCisJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJICAgIG1fdWlUcmFuc1NpemUgPSAwOworCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX3VpVHJhbnNmZXJyZWRCeXRlCisJCQkJCQkJICAgID0gMDsKKwkJCQkJCQkvLyBjaGFuZ2Ugc3RhdGUKKwkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgbV9TZG9Db21TdGF0ZSA9CisJCQkJCQkJICAgIGtFcGxTZG9Db21TdGF0ZUlkbGU7CisJCQkJCQkJLy8gcmVzZXQgYWJvcnQgY29kZQorCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX2R3TGFzdEFib3J0Q29kZSA9CisJCQkJCQkJICAgIDA7CisJCQkJCQkJLy8gZC5rLjogZG8gbm90IGV4ZWN1dGUgYW55dGhpbmcgZnVydGhlciBvbiB0aGlzIGNvbW1hbmQKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCS8vIGNoZWNrIGlmIGl0IGlzIGEgd3JpdGUKKwkJCQkJCWlmIChwU2RvQ29tQ29uLT4KKwkJCQkJCSAgICBtX1Nkb1NlcnZpY2VUeXBlID09CisJCQkJCQkgICAga0VwbFNkb1NlcnZpY2VXcml0ZUJ5SW5kZXgpCisJCQkJCQl7CisJCQkJCQkJLy8gd3JpdGUgZGF0YSB0byBPRAorCQkJCQkJCXVpU2l6ZSA9CisJCQkJCQkJICAgIEFtaUdldFdvcmRGcm9tTGUKKwkJCQkJCQkgICAgKCZwQXN5U2RvQ29tX3AtPgorCQkJCQkJCSAgICAgbV9sZV93U2VnbWVudFNpemUpOworCQkJCQkJCWlmIChwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgbV9kd0xhc3RBYm9ydENvZGUgPT0KKwkJCQkJCQkgICAgMCkgeworCQkJCQkJCQlFUExfTUVNQ1BZCisJCQkJCQkJCSAgICAocFNkb0NvbUNvbi0+CisJCQkJCQkJCSAgICAgbV9wRGF0YSwKKwkJCQkJCQkJICAgICAmcEFzeVNkb0NvbV9wLT4KKwkJCQkJCQkJICAgICBtX2xlX2FiQ29tbWFuZERhdGEKKwkJCQkJCQkJICAgICBbMF0sCisJCQkJCQkJCSAgICAgdWlTaXplKTsKKwkJCQkJCQl9CisJCQkJCQkJLy8gdXBkYXRlIGNvdW50ZXIKKwkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgbV91aVRyYW5zZmVycmVkQnl0ZQorCQkJCQkJCSAgICArPSB1aVNpemU7CisJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJICAgIG1fdWlUcmFuc1NpemUgLT0KKwkJCQkJCQkgICAgdWlTaXplOworCisJCQkJCQkJLy8gdXBkYXRlIHBvaW50ZXIKKwkJCQkJCQlpZiAocFNkb0NvbUNvbi0+CisJCQkJCQkJICAgIG1fZHdMYXN0QWJvcnRDb2RlID09CisJCQkJCQkJICAgIDApIHsKKwkJCQkJCQkJKCAvKihCWVRFKikgKi8KKwkJCQkJCQkJIHBTZG9Db21Db24tPgorCQkJCQkJCQkgbV9wRGF0YSkgKz0KKwkJCQkJCSAgICAgIHVpU2l6ZTsKKwkJCQkJCQl9CisJCQkJCQkJLy8gY2hlY2sgZW5kIG9mIHRyYW5zZmVyCisJCQkJCQkJaWYgKChwQXN5U2RvQ29tX3AtPm1fbGVfYkZsYWdzICYgMHgzMCkgPT0gMHgzMCkgewkvLyB0cmFuc2ZlciByZWFkeQorCQkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkJICAgIG1fdWlUcmFuc1NpemUKKwkJCQkJCQkJICAgID0gMDsKKworCQkJCQkJCQlpZiAocFNkb0NvbUNvbi0+CisJCQkJCQkJCSAgICBtX2R3TGFzdEFib3J0Q29kZQorCQkJCQkJCQkgICAgPT0gMCkgeworCQkJCQkJCQkJLy8gc2VuZCByZXNwb25zZQorCQkJCQkJCQkJLy8gc2VuZCBuZXh0IGZyYW1lCisJCQkJCQkJCQlFcGxTZG9Db21TZXJ2ZXJTZW5kRnJhbWVJbnRlcm4KKwkJCQkJCQkJCSAgICAocFNkb0NvbUNvbiwKKwkJCQkJCQkJCSAgICAgMCwKKwkJCQkJCQkJCSAgICAgMCwKKwkJCQkJCQkJCSAgICAga0VwbFNkb0NvbVNlbmRUeXBlUmVzKTsKKwkJCQkJCQkJCS8vIGlmIGFsbCBzZW5kIC0+IGJhY2sgdG8gaWRsZQorCQkJCQkJCQkJaWYgKHBTZG9Db21Db24tPm1fdWlUcmFuc1NpemUgPT0gMCkgewkvLyBiYWNrIHRvIGlkbGUKKwkJCQkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkJCQkgICAgbV9TZG9Db21TdGF0ZQorCQkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkJICAgIGtFcGxTZG9Db21TdGF0ZUlkbGU7CisJCQkJCQkJCQkJLy8gcmVzZXQgYWJvcnQgY29kZQorCQkJCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCQkJCSAgICBtX2R3TGFzdEFib3J0Q29kZQorCQkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkJICAgIDA7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0gZWxzZSB7CS8vIHNlbmQgZGFib3J0IGNvZGUKKwkJCQkJCQkJCS8vIHNlbmQgYWJvcnQKKwkJCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCQkJICAgIG1fcERhdGEKKwkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkgICAgKEJZVEUKKwkJCQkJCQkJCSAgICAgKikKKwkJCQkJCQkJCSAgICAmCisJCQkJCQkJCQkgICAgcFNkb0NvbUNvbi0+CisJCQkJCQkJCQkgICAgbV9kd0xhc3RBYm9ydENvZGU7CisJCQkJCQkJCQlSZXQgPQorCQkJCQkJCQkJICAgIEVwbFNkb0NvbVNlcnZlclNlbmRGcmFtZUludGVybgorCQkJCQkJCQkJICAgIChwU2RvQ29tQ29uLAorCQkJCQkJCQkJICAgICAwLAorCQkJCQkJCQkJICAgICAwLAorCQkJCQkJCQkJICAgICBrRXBsU2RvQ29tU2VuZFR5cGVBYm9ydCk7CisKKwkJCQkJCQkJCS8vIHJlc2V0IGFib3J0IGNvZGUKKwkJCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCQkJICAgIG1fZHdMYXN0QWJvcnRDb2RlCisJCQkJCQkJCQkgICAgPSAwOworCisJCQkJCQkJCX0KKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkvLyBzZW5kIGFja25vd2xlZGdlIHdpdGhvdXQgYW55IENvbW1hbmQgbGF5ZXIgZGF0YQorCQkJCQkJCQlSZXQgPQorCQkJCQkJCQkgICAgRXBsU2RvQXN5U2VxU2VuZERhdGEKKwkJCQkJCQkJICAgIChwU2RvQ29tQ29uLT4KKwkJCQkJCQkJICAgICBtX1Nkb1NlcUNvbkhkbCwKKwkJCQkJCQkJICAgICAwLAorCQkJCQkJCQkgICAgICh0RXBsRnJhbWUKKwkJCQkJCQkJICAgICAgKikgTlVMTCk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9IGVsc2UgewkvLyB0aGlzIGNvbW1hbmQgbGF5ZXIgaGFuZGxlIGlzIG5vdCByZXNwb25zaWJsZQorCQkJCQkJLy8gKHdyb25nIGRpcmVjdGlvbiBvciB3cm9uZyB0cmFuc2FjdGlvbiBJRCkKKwkJCQkJCVJldCA9IGtFcGxTZG9Db21Ob3RSZXNwb25zaWJsZTsKKwkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBjb25uZWN0aW9uIGNsb3NlZAorCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRJbml0RXJyb3I6CisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudFRpbWVvdXQ6CisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudENvbkNsb3NlZDoKKwkJCQl7CisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxTZG9Bc3lTZXFEZWxDb24ocFNkb0NvbUNvbi0+CisJCQkJCQkJICAgICAgIG1fU2RvU2VxQ29uSGRsKTsKKwkJCQkJLy8gY2xlYW4gY29udHJvbCBzdHJ1Y3R1cmUKKwkJCQkJRVBMX01FTVNFVChwU2RvQ29tQ29uLCAweDAwLAorCQkJCQkJICAgc2l6ZW9mKHRFcGxTZG9Db21Db24pKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCS8vIGQuay4gZG8gbm90aGluZworCQkJCWJyZWFrOworCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKFNkb0NvbUNvbkV2ZW50X3ApCisKKwkJCWJyZWFrOworCQl9CisjZW5kaWYgLy8gZW5kaWYgb2YgI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9TKSkgIT0gMCkKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9DKSkgIT0gMCkKKwkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vIFNETyBDbGllbnQgcGFydAorCQkvLyB3YWl0IGZvciBmaW5pc2ggb2YgZXN0YWJsaXNoaW5nIGNvbm5lY3Rpb24KKwljYXNlIGtFcGxTZG9Db21TdGF0ZUNsaWVudFdhaXRJbml0OgorCQl7CisKKwkJCS8vIGlmIGNvbm5lY3Rpb24gaGFuZGxlIGlzIGludmFsaWQgcmVpbml0IGNvbm5lY3Rpb24KKwkJCS8vIGQuay46IHRoaXMgd2lsbCBiZSBkb25lIG9ubHkgb24gbmV3IGV2ZW50cyAoaS5lLiBJbml0VHJhbnNmZXIpCisJCQlpZiAoKHBTZG9Db21Db24tPgorCQkJICAgICBtX1Nkb1NlcUNvbkhkbCAmIH5FUExfU0RPX1NFUV9IQU5ETEVfTUFTSykgPT0KKwkJCSAgICBFUExfU0RPX1NFUV9JTlZBTElEX0hETCkgeworCQkJCS8vIGNoZWNrIGtpbmQgb2YgY29ubmVjdGlvbiB0byByZWluaXQKKwkJCQkvLyBjaGVjayBwcm90b2NvbAorCQkJCXN3aXRjaCAocFNkb0NvbUNvbi0+bV9TZG9Qcm90VHlwZSkgeworCQkJCQkvLyB1ZHAKKwkJCQljYXNlIGtFcGxTZG9UeXBlVWRwOgorCQkJCQl7CisJCQkJCQkvLyBjYWxsIGNvbm5lY3Rpb24gaW50IGZ1bmN0aW9uIG9mIGxvd2VyIGxheWVyCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbFNkb0FzeVNlcUluaXRDb24KKwkJCQkJCSAgICAoJnBTZG9Db21Db24tPgorCQkJCQkJICAgICBtX1Nkb1NlcUNvbkhkbCwKKwkJCQkJCSAgICAgcFNkb0NvbUNvbi0+bV91aU5vZGVJZCwKKwkJCQkJCSAgICAga0VwbFNkb1R5cGVVZHApOworCQkJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJLy8gQXNlbmQgLT4gbm90IHN1cHBvcnRlZAorCQkJCWNhc2Uga0VwbFNkb1R5cGVBc25kOgorCQkJCQl7CisJCQkJCQkvLyBjYWxsIGNvbm5lY3Rpb24gaW50IGZ1bmN0aW9uIG9mIGxvd2VyIGxheWVyCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbFNkb0FzeVNlcUluaXRDb24KKwkJCQkJCSAgICAoJnBTZG9Db21Db24tPgorCQkJCQkJICAgICBtX1Nkb1NlcUNvbkhkbCwKKwkJCQkJCSAgICAgcFNkb0NvbUNvbi0+bV91aU5vZGVJZCwKKwkJCQkJCSAgICAga0VwbFNkb1R5cGVBc25kKTsKKwkJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCS8vIFBkbyAtPiBub3Qgc3VwcG9ydGVkCisJCQkJY2FzZSBrRXBsU2RvVHlwZVBkbzoKKwkJCQlkZWZhdWx0OgorCQkJCQl7CisJCQkJCQlSZXQgPSBrRXBsU2RvQ29tVW5zdXBwb3J0ZWRQcm90OworCQkJCQkJZ290byBFeGl0OworCQkJCQl9CisJCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKG1fUHJvdFR5cGVfcCkKKwkJCQkvLyBkLmsuOiByZXNldCB0cmFuc2FjdGlvbiBJRCwgYmVjYXVzZSBuZXcgc2VxdWVuY2UgbGF5ZXIgY29ubmVjdGlvbiB3YXMgaW5pdGlhbGl6ZWQKKwkJCQkvLyAkJCQgZC5rLiBpcyB0aGlzIHJlYWxseSBuZWNlc3Nhcnk/CisJCQkJLy9wU2RvQ29tQ29uLT5tX2JUcmFuc2FjdGlvbklkID0gMDsKKwkJCX0KKwkJCS8vIGNoZWNrIGV2ZW50cworCQkJc3dpdGNoIChTZG9Db21Db25FdmVudF9wKSB7CisJCQkJLy8gY29ubmVjdGlvbiBlc3RhYmxpc2hlZAorCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRDb25Fc3RhYmxpc2hlZDoKKwkJCQl7CisJCQkJCS8vc2VuZCBmaXJzdCBmcmFtZSBpZiBuZWVkZWQKKwkJCQkJaWYgKChwU2RvQ29tQ29uLT5tX3VpVHJhbnNTaXplID4gMCkKKwkJCQkJICAgICYmIChwU2RvQ29tQ29uLT5tX3VpVGFyZ2V0SW5kZXggIT0gMCkpIHsJLy8gc3RhcnQgU0RPIHRyYW5zZmVyCisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbFNkb0NvbUNsaWVudFNlbmQKKwkJCQkJCSAgICAocFNkb0NvbUNvbik7CisJCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQkJZ290byBFeGl0OworCQkJCQkJfQorCQkJCQkJLy8gY2hlY2sgaWYgc2VnZW10ZWQgdHJhbnNmZXIKKwkJCQkJCWlmIChwU2RvQ29tQ29uLT4KKwkJCQkJCSAgICBtX1Nkb1RyYW5zVHlwZSA9PQorCQkJCQkJICAgIGtFcGxTZG9UcmFuc1NlZ21lbnRlZCkgeworCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX1Nkb0NvbVN0YXRlID0KKwkJCQkJCQkgICAga0VwbFNkb0NvbVN0YXRlQ2xpZW50U2VnbVRyYW5zOworCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQkvLyBnb3RvIHN0YXRlIGtFcGxTZG9Db21TdGF0ZUNsaWVudENvbm5lY3RlZAorCQkJCQlwU2RvQ29tQ29uLT5tX1Nkb0NvbVN0YXRlID0KKwkJCQkJICAgIGtFcGxTZG9Db21TdGF0ZUNsaWVudENvbm5lY3RlZDsKKwkJCQkJZ290byBFeGl0OworCQkJCX0KKworCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRTZW5kRmlyc3Q6CisJCQkJeworCQkJCQkvLyBpbmZvcyBmb3IgdHJhbnNmZXIgYWxyZWFkeSBzYXZlZCBieSBmdW5jdGlvbiBFcGxTZG9Db21Jbml0VHJhbnNmZXJCeUluZGV4CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRDb25DbG9zZWQ6CisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudEluaXRFcnJvcjoKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50VGltZW91dDoKKwkJCQl7CisJCQkJCS8vIGNsb3NlIHNlcXVlbmNlIGxheWVyIGhhbmRsZQorCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsU2RvQXN5U2VxRGVsQ29uKHBTZG9Db21Db24tPgorCQkJCQkJCSAgICAgICBtX1Nkb1NlcUNvbkhkbCk7CisJCQkJCXBTZG9Db21Db24tPm1fU2RvU2VxQ29uSGRsIHw9CisJCQkJCSAgICBFUExfU0RPX1NFUV9JTlZBTElEX0hETDsKKwkJCQkJLy8gY2FsbCBjYWxsYmFjayBmdW5jdGlvbgorCQkJCQlpZiAoU2RvQ29tQ29uRXZlbnRfcCA9PQorCQkJCQkgICAga0VwbFNkb0NvbUNvbkV2ZW50VGltZW91dCkgeworCQkJCQkJcFNkb0NvbUNvbi0+bV9kd0xhc3RBYm9ydENvZGUgPQorCQkJCQkJICAgIEVQTF9TRE9BQ19USU1FX09VVDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXBTZG9Db21Db24tPm1fZHdMYXN0QWJvcnRDb2RlID0KKwkJCQkJCSAgICAwOworCQkJCQl9CisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxTZG9Db21UcmFuc2ZlckZpbmlzaGVkCisJCQkJCSAgICAoU2RvQ29tQ29uX3AsIHBTZG9Db21Db24sCisJCQkJCSAgICAga0VwbFNkb0NvbVRyYW5zZmVyTG93ZXJMYXllckFib3J0KTsKKwkJCQkJLy8gZC5rLjogZG8gbm90IGNsZWFuIGNvbnRyb2wgc3RydWN0dXJlCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQkvLyBkLmsuIGRvIG5vdGhpbmcKKwkJCQlicmVhazsKKworCQkJfQkvLyBlbmQgb2YgIHN3aXRjaChTZG9Db21Db25FdmVudF9wKQorCQkJYnJlYWs7CisJCX0KKworCQkvLyBjb25uZWN0ZWQKKwljYXNlIGtFcGxTZG9Db21TdGF0ZUNsaWVudENvbm5lY3RlZDoKKwkJeworCQkJLy8gY2hlY2sgZXZlbnRzCisJCQlzd2l0Y2ggKFNkb0NvbUNvbkV2ZW50X3ApIHsKKwkJCQkvLyBzZW5kIGEgZnJhbWUKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50U2VuZEZpcnN0OgorCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRBY2tSZWNlaXZlZDoKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50RnJhbWVTZW5kZWQ6CisJCQkJeworCQkJCQlSZXQgPSBFcGxTZG9Db21DbGllbnRTZW5kKHBTZG9Db21Db24pOworCQkJCQlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCX0KKwkJCQkJLy8gY2hlY2sgaWYgcmVhZCB0cmFuc2ZlciBmaW5pc2hlZAorCQkJCQlpZiAoKHBTZG9Db21Db24tPm1fdWlUcmFuc1NpemUgPT0gMCkKKwkJCQkJICAgICYmIChwU2RvQ29tQ29uLT4KKwkJCQkJCW1fdWlUcmFuc2ZlcnJlZEJ5dGUgIT0gMCkKKwkJCQkJICAgICYmIChwU2RvQ29tQ29uLT5tX1Nkb1NlcnZpY2VUeXBlID09CisJCQkJCQlrRXBsU2RvU2VydmljZVJlYWRCeUluZGV4KSkgeworCQkJCQkJLy8gaW5jIHRyYW5zYWN0aW9uIGlkCisJCQkJCQlwU2RvQ29tQ29uLT5tX2JUcmFuc2FjdGlvbklkKys7CisJCQkJCQkvLyBjYWxsIGNhbGxiYWNrIG9mIGFwcGxpY2F0aW9uCisJCQkJCQlwU2RvQ29tQ29uLT5tX2R3TGFzdEFib3J0Q29kZSA9CisJCQkJCQkgICAgMDsKKwkJCQkJCVJldCA9CisJCQkJCQkgICAgRXBsU2RvQ29tVHJhbnNmZXJGaW5pc2hlZAorCQkJCQkJICAgIChTZG9Db21Db25fcCwgcFNkb0NvbUNvbiwKKwkJCQkJCSAgICAga0VwbFNkb0NvbVRyYW5zZmVyRmluaXNoZWQpOworCisJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCX0KKwkJCQkJLy8gY2hlY2sgaWYgc2VnZW10ZWQgdHJhbnNmZXIKKwkJCQkJaWYgKHBTZG9Db21Db24tPm1fU2RvVHJhbnNUeXBlID09CisJCQkJCSAgICBrRXBsU2RvVHJhbnNTZWdtZW50ZWQpIHsKKwkJCQkJCXBTZG9Db21Db24tPm1fU2RvQ29tU3RhdGUgPQorCQkJCQkJICAgIGtFcGxTZG9Db21TdGF0ZUNsaWVudFNlZ21UcmFuczsKKwkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBmcmFtZSByZWNlaXZlZAorCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRSZWM6CisJCQkJeworCQkJCQkvLyBjaGVjayBpZiB0aGUgZnJhbWUgaXMgYSBTRE8gcmVzcG9uc2UgYW5kIGhhcyB0aGUgcmlnaHQgdHJhbnNhY3Rpb24gSUQKKwkJCQkJYkZsYWcgPQorCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZSgmcEFzeVNkb0NvbV9wLT4KKwkJCQkJCQkgICAgIG1fbGVfYkZsYWdzKTsKKwkJCQkJaWYgKCgoYkZsYWcgJiAweDgwKSAhPSAwKQorCQkJCQkgICAgJiYKKwkJCQkJICAgIChBbWlHZXRCeXRlRnJvbUxlCisJCQkJCSAgICAgKCZwQXN5U2RvQ29tX3AtPgorCQkJCQkgICAgICBtX2xlX2JUcmFuc2FjdGlvbklkKSA9PQorCQkJCQkgICAgIHBTZG9Db21Db24tPm1fYlRyYW5zYWN0aW9uSWQpKSB7CisJCQkJCQkvLyBjaGVjayBpZiBhYm9ydCBvciBub3QKKwkJCQkJCWlmICgoYkZsYWcgJiAweDQwKSAhPSAwKSB7CisJCQkJCQkJLy8gc2VuZCBhY2tub3dsZWRnZSB3aXRob3V0IGFueSBDb21tYW5kIGxheWVyIGRhdGEKKwkJCQkJCQlSZXQgPQorCQkJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZW5kRGF0YQorCQkJCQkJCSAgICAocFNkb0NvbUNvbi0+CisJCQkJCQkJICAgICBtX1Nkb1NlcUNvbkhkbCwgMCwKKwkJCQkJCQkgICAgICh0RXBsRnJhbWUgKikKKwkJCQkJCQkgICAgIE5VTEwpOworCQkJCQkJCS8vIGluYyB0cmFuc2FjdGlvbiBpZAorCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX2JUcmFuc2FjdGlvbklkKys7CisJCQkJCQkJLy8gc2F2ZSBhYm9ydCBjb2RlCisJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJICAgIG1fZHdMYXN0QWJvcnRDb2RlID0KKwkJCQkJCQkgICAgQW1pR2V0RHdvcmRGcm9tTGUKKwkJCQkJCQkgICAgKCZwQXN5U2RvQ29tX3AtPgorCQkJCQkJCSAgICAgbV9sZV9hYkNvbW1hbmREYXRhCisJCQkJCQkJICAgICBbMF0pOworCQkJCQkJCS8vIGNhbGwgY2FsbGJhY2sgb2YgYXBwbGljYXRpb24KKwkJCQkJCQlSZXQgPQorCQkJCQkJCSAgICBFcGxTZG9Db21UcmFuc2ZlckZpbmlzaGVkCisJCQkJCQkJICAgIChTZG9Db21Db25fcCwKKwkJCQkJCQkgICAgIHBTZG9Db21Db24sCisJCQkJCQkJICAgICBrRXBsU2RvQ29tVHJhbnNmZXJSeEFib3J0ZWQpOworCisJCQkJCQkJZ290byBFeGl0OworCQkJCQkJfSBlbHNlIHsJLy8gbm9ybWFsIGZyYW1lIHJlY2VpdmVkCisJCQkJCQkJLy8gY2hlY2sgZnJhbWUKKwkJCQkJCQlSZXQgPQorCQkJCQkJCSAgICBFcGxTZG9Db21DbGllbnRQcm9jZXNzRnJhbWUKKwkJCQkJCQkgICAgKFNkb0NvbUNvbl9wLAorCQkJCQkJCSAgICAgcEFzeVNkb0NvbV9wKTsKKworCQkJCQkJCS8vIGNoZWNrIGlmIHRyYW5zZmVyIHJlYWR5CisJCQkJCQkJaWYgKHBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX3VpVHJhbnNTaXplID09CisJCQkJCQkJICAgIDApIHsKKwkJCQkJCQkJLy8gc2VuZCBhY2tub3dsZWRnZSB3aXRob3V0IGFueSBDb21tYW5kIGxheWVyIGRhdGEKKwkJCQkJCQkJUmV0ID0KKwkJCQkJCQkJICAgIEVwbFNkb0FzeVNlcVNlbmREYXRhCisJCQkJCQkJCSAgICAocFNkb0NvbUNvbi0+CisJCQkJCQkJCSAgICAgbV9TZG9TZXFDb25IZGwsCisJCQkJCQkJCSAgICAgMCwKKwkJCQkJCQkJICAgICAodEVwbEZyYW1lCisJCQkJCQkJCSAgICAgICopIE5VTEwpOworCQkJCQkJCQkvLyBpbmMgdHJhbnNhY3Rpb24gaWQKKwkJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJCSAgICBtX2JUcmFuc2FjdGlvbklkKys7CisJCQkJCQkJCS8vIGNhbGwgY2FsbGJhY2sgb2YgYXBwbGljYXRpb24KKwkJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJCSAgICBtX2R3TGFzdEFib3J0Q29kZQorCQkJCQkJCQkgICAgPSAwOworCQkJCQkJCQlSZXQgPQorCQkJCQkJCQkgICAgRXBsU2RvQ29tVHJhbnNmZXJGaW5pc2hlZAorCQkJCQkJCQkgICAgKFNkb0NvbUNvbl9wLAorCQkJCQkJCQkgICAgIHBTZG9Db21Db24sCisJCQkJCQkJCSAgICAga0VwbFNkb0NvbVRyYW5zZmVyRmluaXNoZWQpOworCisJCQkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJCQl9CisKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsJLy8gdGhpcyBjb21tYW5kIGxheWVyIGhhbmRsZSBpcyBub3QgcmVzcG9uc2libGUKKwkJCQkJCS8vICh3cm9uZyBkaXJlY3Rpb24gb3Igd3JvbmcgdHJhbnNhY3Rpb24gSUQpCisJCQkJCQlSZXQgPSBrRXBsU2RvQ29tTm90UmVzcG9uc2libGU7CisJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gY29ubmVjdGlvbiBjbG9zZWQgZXZlbnQgZ28gYmFjayB0byBrRXBsU2RvQ29tU3RhdGVDbGllbnRXYWl0SW5pdAorCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRDb25DbG9zZWQ6CisJCQkJewkvLyBjb25uZWN0aW9uIGNsb3NlZCBieSBjb21tdW5pY2F0aW9uIHBhcnRuZXIKKwkJCQkJLy8gY2xvc2Ugc2VxdWVuY2UgbGF5ZXIgaGFuZGxlCisJCQkJCVJldCA9CisJCQkJCSAgICBFcGxTZG9Bc3lTZXFEZWxDb24ocFNkb0NvbUNvbi0+CisJCQkJCQkJICAgICAgIG1fU2RvU2VxQ29uSGRsKTsKKwkJCQkJLy8gc2V0IGhhbmRsZSB0byBpbnZhbGlkIGFuZCBlbnRlciBrRXBsU2RvQ29tU3RhdGVDbGllbnRXYWl0SW5pdAorCQkJCQlwU2RvQ29tQ29uLT5tX1Nkb1NlcUNvbkhkbCB8PQorCQkJCQkgICAgRVBMX1NET19TRVFfSU5WQUxJRF9IREw7CisJCQkJCS8vIGNoYW5nZSBzdGF0ZQorCQkJCQlwU2RvQ29tQ29uLT5tX1Nkb0NvbVN0YXRlID0KKwkJCQkJICAgIGtFcGxTZG9Db21TdGF0ZUNsaWVudFdhaXRJbml0OworCisJCQkJCS8vIGNhbGwgY2FsbGJhY2sgb2YgYXBwbGljYXRpb24KKwkJCQkJcFNkb0NvbUNvbi0+bV9kd0xhc3RBYm9ydENvZGUgPSAwOworCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsU2RvQ29tVHJhbnNmZXJGaW5pc2hlZAorCQkJCQkgICAgKFNkb0NvbUNvbl9wLCBwU2RvQ29tQ29uLAorCQkJCQkgICAgIGtFcGxTZG9Db21UcmFuc2Zlckxvd2VyTGF5ZXJBYm9ydCk7CisKKwkJCQkJZ290byBFeGl0OworCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8vIGFib3J0IHRvIHNlbmQgZnJvbSBoaWdoZXIgbGF5ZXIKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50QWJvcnQ6CisJCQkJeworCQkJCQlFcGxTZG9Db21DbGllbnRTZW5kQWJvcnQocFNkb0NvbUNvbiwKKwkJCQkJCQkJICooKERXT1JEICopCisJCQkJCQkJCSAgIHBTZG9Db21Db24tPgorCQkJCQkJCQkgICBtX3BEYXRhKSk7CisKKwkJCQkJLy8gaW5jIHRyYW5zYWN0aW9uIGlkCisJCQkJCXBTZG9Db21Db24tPm1fYlRyYW5zYWN0aW9uSWQrKzsKKwkJCQkJLy8gY2FsbCBjYWxsYmFjayBvZiBhcHBsaWNhdGlvbgorCQkJCQlwU2RvQ29tQ29uLT5tX2R3TGFzdEFib3J0Q29kZSA9CisJCQkJCSAgICAqKChEV09SRCAqKSBwU2RvQ29tQ29uLT5tX3BEYXRhKTsKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbFNkb0NvbVRyYW5zZmVyRmluaXNoZWQKKwkJCQkJICAgIChTZG9Db21Db25fcCwgcFNkb0NvbUNvbiwKKwkJCQkJICAgICBrRXBsU2RvQ29tVHJhbnNmZXJUeEFib3J0ZWQpOworCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRJbml0RXJyb3I6CisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudFRpbWVvdXQ6CisJCQkJeworCQkJCQkvLyBjbG9zZSBzZXF1ZW5jZSBsYXllciBoYW5kbGUKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbFNkb0FzeVNlcURlbENvbihwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgICAgbV9TZG9TZXFDb25IZGwpOworCQkJCQlwU2RvQ29tQ29uLT5tX1Nkb1NlcUNvbkhkbCB8PQorCQkJCQkgICAgRVBMX1NET19TRVFfSU5WQUxJRF9IREw7CisJCQkJCS8vIGNoYW5nZSBzdGF0ZQorCQkJCQlwU2RvQ29tQ29uLT5tX1Nkb0NvbVN0YXRlID0KKwkJCQkJICAgIGtFcGxTZG9Db21TdGF0ZUNsaWVudFdhaXRJbml0OworCQkJCQkvLyBjYWxsIGNhbGxiYWNrIG9mIGFwcGxpY2F0aW9uCisJCQkJCXBTZG9Db21Db24tPm1fZHdMYXN0QWJvcnRDb2RlID0KKwkJCQkJICAgIEVQTF9TRE9BQ19USU1FX09VVDsKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbFNkb0NvbVRyYW5zZmVyRmluaXNoZWQKKwkJCQkJICAgIChTZG9Db21Db25fcCwgcFNkb0NvbUNvbiwKKwkJCQkJICAgICBrRXBsU2RvQ29tVHJhbnNmZXJMb3dlckxheWVyQWJvcnQpOworCisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCS8vIGQuay4gZG8gbm90aGluZworCQkJCWJyZWFrOworCisJCQl9CS8vIGVuZCBvZiBzd2l0Y2goU2RvQ29tQ29uRXZlbnRfcCkKKworCQkJYnJlYWs7CisJCX0KKworCQkvLyBwcm9jZXNzIHNlZ21lbnRlZCB0cmFuc2ZlcgorCWNhc2Uga0VwbFNkb0NvbVN0YXRlQ2xpZW50U2VnbVRyYW5zOgorCQl7CisJCQkvLyBjaGVjayBldmVudHMKKwkJCXN3aXRjaCAoU2RvQ29tQ29uRXZlbnRfcCkgeworCQkJCS8vIHNuZWQgYSBmcmFtZQorCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRTZW5kRmlyc3Q6CisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudEFja1JlY2VpdmVkOgorCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRGcmFtZVNlbmRlZDoKKwkJCQl7CisJCQkJCVJldCA9IEVwbFNkb0NvbUNsaWVudFNlbmQocFNkb0NvbUNvbik7CisJCQkJCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJCQkJCWdvdG8gRXhpdDsKKwkJCQkJfQorCQkJCQkvLyBjaGVjayBpZiByZWFkIHRyYW5zZmVyIGZpbmlzaGVkCisJCQkJCWlmICgocFNkb0NvbUNvbi0+bV91aVRyYW5zU2l6ZSA9PSAwKQorCQkJCQkgICAgJiYgKHBTZG9Db21Db24tPm1fU2RvU2VydmljZVR5cGUgPT0KKwkJCQkJCWtFcGxTZG9TZXJ2aWNlUmVhZEJ5SW5kZXgpKSB7CisJCQkJCQkvLyBpbmMgdHJhbnNhY3Rpb24gaWQKKwkJCQkJCXBTZG9Db21Db24tPm1fYlRyYW5zYWN0aW9uSWQrKzsKKwkJCQkJCS8vIGNoYW5nZSBzdGF0ZQorCQkJCQkJcFNkb0NvbUNvbi0+bV9TZG9Db21TdGF0ZSA9CisJCQkJCQkgICAga0VwbFNkb0NvbVN0YXRlQ2xpZW50Q29ubmVjdGVkOworCQkJCQkJLy8gY2FsbCBjYWxsYmFjayBvZiBhcHBsaWNhdGlvbgorCQkJCQkJcFNkb0NvbUNvbi0+bV9kd0xhc3RBYm9ydENvZGUgPQorCQkJCQkJICAgIDA7CisJCQkJCQlSZXQgPQorCQkJCQkJICAgIEVwbFNkb0NvbVRyYW5zZmVyRmluaXNoZWQKKwkJCQkJCSAgICAoU2RvQ29tQ29uX3AsIHBTZG9Db21Db24sCisJCQkJCQkgICAgIGtFcGxTZG9Db21UcmFuc2ZlckZpbmlzaGVkKTsKKworCQkJCQkJZ290byBFeGl0OworCQkJCQl9CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gZnJhbWUgcmVjZWl2ZWQKKwkJCWNhc2Uga0VwbFNkb0NvbUNvbkV2ZW50UmVjOgorCQkJCXsKKwkJCQkJLy8gY2hlY2sgaWYgdGhlIGZyYW1lIGlzIGEgcmVzcG9uc2UKKwkJCQkJYkZsYWcgPQorCQkJCQkgICAgQW1pR2V0Qnl0ZUZyb21MZSgmcEFzeVNkb0NvbV9wLT4KKwkJCQkJCQkgICAgIG1fbGVfYkZsYWdzKTsKKwkJCQkJaWYgKCgoYkZsYWcgJiAweDgwKSAhPSAwKQorCQkJCQkgICAgJiYKKwkJCQkJICAgIChBbWlHZXRCeXRlRnJvbUxlCisJCQkJCSAgICAgKCZwQXN5U2RvQ29tX3AtPgorCQkJCQkgICAgICBtX2xlX2JUcmFuc2FjdGlvbklkKSA9PQorCQkJCQkgICAgIHBTZG9Db21Db24tPm1fYlRyYW5zYWN0aW9uSWQpKSB7CisJCQkJCQkvLyBjaGVjayBpZiBhYm9ydCBvciBub3QKKwkJCQkJCWlmICgoYkZsYWcgJiAweDQwKSAhPSAwKSB7CisJCQkJCQkJLy8gc2VuZCBhY2tub3dsZWRnZSB3aXRob3V0IGFueSBDb21tYW5kIGxheWVyIGRhdGEKKwkJCQkJCQlSZXQgPQorCQkJCQkJCSAgICBFcGxTZG9Bc3lTZXFTZW5kRGF0YQorCQkJCQkJCSAgICAocFNkb0NvbUNvbi0+CisJCQkJCQkJICAgICBtX1Nkb1NlcUNvbkhkbCwgMCwKKwkJCQkJCQkgICAgICh0RXBsRnJhbWUgKikKKwkJCQkJCQkgICAgIE5VTEwpOworCQkJCQkJCS8vIGluYyB0cmFuc2FjdGlvbiBpZAorCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX2JUcmFuc2FjdGlvbklkKys7CisJCQkJCQkJLy8gY2hhbmdlIHN0YXRlCisJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJICAgIG1fU2RvQ29tU3RhdGUgPQorCQkJCQkJCSAgICBrRXBsU2RvQ29tU3RhdGVDbGllbnRDb25uZWN0ZWQ7CisJCQkJCQkJLy8gc2F2ZSBhYm9ydCBjb2RlCisJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJICAgIG1fZHdMYXN0QWJvcnRDb2RlID0KKwkJCQkJCQkgICAgQW1pR2V0RHdvcmRGcm9tTGUKKwkJCQkJCQkgICAgKCZwQXN5U2RvQ29tX3AtPgorCQkJCQkJCSAgICAgbV9sZV9hYkNvbW1hbmREYXRhCisJCQkJCQkJICAgICBbMF0pOworCQkJCQkJCS8vIGNhbGwgY2FsbGJhY2sgb2YgYXBwbGljYXRpb24KKwkJCQkJCQlSZXQgPQorCQkJCQkJCSAgICBFcGxTZG9Db21UcmFuc2ZlckZpbmlzaGVkCisJCQkJCQkJICAgIChTZG9Db21Db25fcCwKKwkJCQkJCQkgICAgIHBTZG9Db21Db24sCisJCQkJCQkJICAgICBrRXBsU2RvQ29tVHJhbnNmZXJSeEFib3J0ZWQpOworCisJCQkJCQkJZ290byBFeGl0OworCQkJCQkJfSBlbHNlIHsJLy8gbm9ybWFsIGZyYW1lIHJlY2VpdmVkCisJCQkJCQkJLy8gY2hlY2sgZnJhbWUKKwkJCQkJCQlSZXQgPQorCQkJCQkJCSAgICBFcGxTZG9Db21DbGllbnRQcm9jZXNzRnJhbWUKKwkJCQkJCQkgICAgKFNkb0NvbUNvbl9wLAorCQkJCQkJCSAgICAgcEFzeVNkb0NvbV9wKTsKKworCQkJCQkJCS8vIGNoZWNrIGlmIHRyYW5zZmVyIHJlYWR5CisJCQkJCQkJaWYgKHBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX3VpVHJhbnNTaXplID09CisJCQkJCQkJICAgIDApIHsKKwkJCQkJCQkJLy8gc2VuZCBhY2tub3dsZWRnZSB3aXRob3V0IGFueSBDb21tYW5kIGxheWVyIGRhdGEKKwkJCQkJCQkJUmV0ID0KKwkJCQkJCQkJICAgIEVwbFNkb0FzeVNlcVNlbmREYXRhCisJCQkJCQkJCSAgICAocFNkb0NvbUNvbi0+CisJCQkJCQkJCSAgICAgbV9TZG9TZXFDb25IZGwsCisJCQkJCQkJCSAgICAgMCwKKwkJCQkJCQkJICAgICAodEVwbEZyYW1lCisJCQkJCQkJCSAgICAgICopIE5VTEwpOworCQkJCQkJCQkvLyBpbmMgdHJhbnNhY3Rpb24gaWQKKwkJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJCSAgICBtX2JUcmFuc2FjdGlvbklkKys7CisJCQkJCQkJCS8vIGNoYW5nZSBzdGF0ZQorCQkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkJICAgIG1fU2RvQ29tU3RhdGUKKwkJCQkJCQkJICAgID0KKwkJCQkJCQkJICAgIGtFcGxTZG9Db21TdGF0ZUNsaWVudENvbm5lY3RlZDsKKwkJCQkJCQkJLy8gY2FsbCBjYWxsYmFjayBvZiBhcHBsaWNhdGlvbgorCQkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkJICAgIG1fZHdMYXN0QWJvcnRDb2RlCisJCQkJCQkJCSAgICA9IDA7CisJCQkJCQkJCVJldCA9CisJCQkJCQkJCSAgICBFcGxTZG9Db21UcmFuc2ZlckZpbmlzaGVkCisJCQkJCQkJCSAgICAoU2RvQ29tQ29uX3AsCisJCQkJCQkJCSAgICAgcFNkb0NvbUNvbiwKKwkJCQkJCQkJICAgICBrRXBsU2RvQ29tVHJhbnNmZXJGaW5pc2hlZCk7CisKKwkJCQkJCQl9CisKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBjb25uZWN0aW9uIGNsb3NlZCBldmVudCBnbyBiYWNrIHRvIGtFcGxTZG9Db21TdGF0ZUNsaWVudFdhaXRJbml0CisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudENvbkNsb3NlZDoKKwkJCQl7CS8vIGNvbm5lY3Rpb24gY2xvc2VkIGJ5IGNvbW11bmljYXRpb24gcGFydG5lcgorCQkJCQkvLyBjbG9zZSBzZXF1ZW5jZSBsYXllciBoYW5kbGUKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbFNkb0FzeVNlcURlbENvbihwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgICAgbV9TZG9TZXFDb25IZGwpOworCQkJCQkvLyBzZXQgaGFuZGxlIHRvIGludmFsaWQgYW5kIGVudGVyIGtFcGxTZG9Db21TdGF0ZUNsaWVudFdhaXRJbml0CisJCQkJCXBTZG9Db21Db24tPm1fU2RvU2VxQ29uSGRsIHw9CisJCQkJCSAgICBFUExfU0RPX1NFUV9JTlZBTElEX0hETDsKKwkJCQkJLy8gY2hhbmdlIHN0YXRlCisJCQkJCXBTZG9Db21Db24tPm1fU2RvQ29tU3RhdGUgPQorCQkJCQkgICAga0VwbFNkb0NvbVN0YXRlQ2xpZW50V2FpdEluaXQ7CisJCQkJCS8vIGluYyB0cmFuc2FjdGlvbiBpZAorCQkJCQlwU2RvQ29tQ29uLT5tX2JUcmFuc2FjdGlvbklkKys7CisJCQkJCS8vIGNhbGwgY2FsbGJhY2sgb2YgYXBwbGljYXRpb24KKwkJCQkJcFNkb0NvbUNvbi0+bV9kd0xhc3RBYm9ydENvZGUgPSAwOworCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsU2RvQ29tVHJhbnNmZXJGaW5pc2hlZAorCQkJCQkgICAgKFNkb0NvbUNvbl9wLCBwU2RvQ29tQ29uLAorCQkJCQkgICAgIGtFcGxTZG9Db21UcmFuc2ZlckZpbmlzaGVkKTsKKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBhYm9ydCB0byBzZW5kIGZyb20gaGlnaGVyIGxheWVyCisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudEFib3J0OgorCQkJCXsKKwkJCQkJRXBsU2RvQ29tQ2xpZW50U2VuZEFib3J0KHBTZG9Db21Db24sCisJCQkJCQkJCSAqKChEV09SRCAqKQorCQkJCQkJCQkgICBwU2RvQ29tQ29uLT4KKwkJCQkJCQkJICAgbV9wRGF0YSkpOworCisJCQkJCS8vIGluYyB0cmFuc2FjdGlvbiBpZAorCQkJCQlwU2RvQ29tQ29uLT5tX2JUcmFuc2FjdGlvbklkKys7CisJCQkJCS8vIGNoYW5nZSBzdGF0ZQorCQkJCQlwU2RvQ29tQ29uLT5tX1Nkb0NvbVN0YXRlID0KKwkJCQkJICAgIGtFcGxTZG9Db21TdGF0ZUNsaWVudENvbm5lY3RlZDsKKwkJCQkJLy8gY2FsbCBjYWxsYmFjayBvZiBhcHBsaWNhdGlvbgorCQkJCQlwU2RvQ29tQ29uLT5tX2R3TGFzdEFib3J0Q29kZSA9CisJCQkJCSAgICAqKChEV09SRCAqKSBwU2RvQ29tQ29uLT5tX3BEYXRhKTsKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbFNkb0NvbVRyYW5zZmVyRmluaXNoZWQKKwkJCQkJICAgIChTZG9Db21Db25fcCwgcFNkb0NvbUNvbiwKKwkJCQkJICAgICBrRXBsU2RvQ29tVHJhbnNmZXJUeEFib3J0ZWQpOworCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJY2FzZSBrRXBsU2RvQ29tQ29uRXZlbnRJbml0RXJyb3I6CisJCQljYXNlIGtFcGxTZG9Db21Db25FdmVudFRpbWVvdXQ6CisJCQkJeworCQkJCQkvLyBjbG9zZSBzZXF1ZW5jZSBsYXllciBoYW5kbGUKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbFNkb0FzeVNlcURlbENvbihwU2RvQ29tQ29uLT4KKwkJCQkJCQkgICAgICAgbV9TZG9TZXFDb25IZGwpOworCQkJCQlwU2RvQ29tQ29uLT5tX1Nkb1NlcUNvbkhkbCB8PQorCQkJCQkgICAgRVBMX1NET19TRVFfSU5WQUxJRF9IREw7CisJCQkJCS8vIGNoYW5nZSBzdGF0ZQorCQkJCQlwU2RvQ29tQ29uLT5tX1Nkb0NvbVN0YXRlID0KKwkJCQkJICAgIGtFcGxTZG9Db21TdGF0ZUNsaWVudFdhaXRJbml0OworCQkJCQkvLyBjYWxsIGNhbGxiYWNrIG9mIGFwcGxpY2F0aW9uCisJCQkJCXBTZG9Db21Db24tPm1fZHdMYXN0QWJvcnRDb2RlID0KKwkJCQkJICAgIEVQTF9TRE9BQ19USU1FX09VVDsKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbFNkb0NvbVRyYW5zZmVyRmluaXNoZWQKKwkJCQkJICAgIChTZG9Db21Db25fcCwgcFNkb0NvbUNvbiwKKwkJCQkJICAgICBrRXBsU2RvQ29tVHJhbnNmZXJMb3dlckxheWVyQWJvcnQpOworCisJCQkJfQorCisJCQlkZWZhdWx0OgorCQkJCS8vIGQuay4gZG8gbm90aGluZworCQkJCWJyZWFrOworCisJCQl9CS8vIGVuZCBvZiBzd2l0Y2goU2RvQ29tQ29uRXZlbnRfcCkKKworCQkJYnJlYWs7CisJCX0KKyNlbmRpZiAvLyBlbmRvIG9mICNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApCisKKwl9CQkJLy8gZW5kIG9mIHN3aXRjaChwU2RvQ29tQ29uLT5tX1Nkb0NvbVN0YXRlKQorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET0MpKSAhPSAwKQorICAgICAgRXhpdDoKKyNlbmRpZgorCisjaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzIpCisJLy8gbGVhdmUgY3JpdGljYWwgc2VjdGlvbiBmb3IgcHJvY2VzcyBmdW5jdGlvbgorCUVQTF9EQkdMVkxfU0RPX1RSQUNFMAorCSAgICAoIlxuXHRMZWF2ZUNyaXRpY2FsU2VjdGlvbiBFcGxTZG9Db21Qcm9jZXNzSW50ZXJuXG5cbiIpOworCUxlYXZlQ3JpdGljYWxTZWN0aW9uKFNkb0NvbUluc3RhbmNlX2cubV9wQ3JpdGljYWxTZWN0aW9uKTsKKworI2VuZGlmCisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgICAgICBFcGxTZG9Db21TZXJ2ZXJJbml0UmVhZEJ5SW5kZXgKKy8vCisvLyBEZXNjcmlwdGlvbjogICAgZnVuY3Rpb24gc3RhcnQgdGhlIHByb2Nlc3Npbmcgb2YgYW4gcmVhZCBieSBpbmRleCBjb21tYW5kCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgICAgIHBTZG9Db21Db25fcCAgICAgPSBwb2ludGVyIHRvIGNvbnRyb2wgc3RydWN0dXJlIG9mIGNvbm5lY3Rpb24KKy8vICAgICAgICAgICAgICAgICAgcEFzeVNkb0NvbV9wICAgICA9IHBvaW50ZXIgdG8gcmVjZWl2ZWQgZnJhbWUKKy8vCisvLyBSZXR1cm5zOiAgICAgICAgIHRFcGxLZXJuZWwgID0gIGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9TKSkgIT0gMCkKK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0NvbVNlcnZlckluaXRSZWFkQnlJbmRleCh0RXBsU2RvQ29tQ29uICogcFNkb0NvbUNvbl9wLAorCQkJCQkJIHRFcGxBc3lTZG9Db20gKiBwQXN5U2RvQ29tX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdW5zaWduZWQgaW50IHVpSW5kZXg7CisJdW5zaWduZWQgaW50IHVpU3ViaW5kZXg7CisJdEVwbE9iZFNpemUgRW50cnlTaXplOworCXRFcGxPYmRBY2Nlc3MgQWNjZXNzVHlwZTsKKwlEV09SRCBkd0Fib3J0Q29kZTsKKworCWR3QWJvcnRDb2RlID0gMDsKKworCS8vIGEgaW5pdCBvZiBhIHJlYWQgY291bGQgbm90IGJlIGEgc2VnbWVudGVkIHRyYW5zZmVyCisJLy8gLT4gbm8gdmFyaWFibGUgcGFydCBvZiBoZWFkZXIKKworCS8vIGdldCBpbmRleCBhbmQgc3ViaW5kZXgKKwl1aUluZGV4ID0gQW1pR2V0V29yZEZyb21MZSgmcEFzeVNkb0NvbV9wLT5tX2xlX2FiQ29tbWFuZERhdGFbMF0pOworCXVpU3ViaW5kZXggPSBBbWlHZXRCeXRlRnJvbUxlKCZwQXN5U2RvQ29tX3AtPm1fbGVfYWJDb21tYW5kRGF0YVsyXSk7CisKKwkvLyBjaGVjayBhY2Nlc3N0eXBlIG9mIGVudHJ5CisJLy8gZXhpc3RlbnMgb2YgZW50cnkKKy8vI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRVKSkgIT0gMCkKKwlSZXQgPSBFcGxPYmR1R2V0QWNjZXNzVHlwZSh1aUluZGV4LCB1aVN1YmluZGV4LCAmQWNjZXNzVHlwZSk7CisvKiNlbHNlCisgICAgUmV0ID0ga0VwbE9iZFN1YmluZGV4Tm90RXhpc3Q7CisgICAgQWNjZXNzVHlwZSA9IDA7CisjZW5kaWYqLworCWlmIChSZXQgPT0ga0VwbE9iZFN1YmluZGV4Tm90RXhpc3QpIHsJLy8gc3ViZW50cnkgZG9lc24ndCBleGlzdAorCQlkd0Fib3J0Q29kZSA9IEVQTF9TRE9BQ19TVUJfSU5ERVhfTk9UX0VYSVNUOworCQkvLyBzZW5kIGFib3J0CisJCXBTZG9Db21Db25fcC0+bV9wRGF0YSA9IChCWVRFICopICYgZHdBYm9ydENvZGU7CisJCVJldCA9IEVwbFNkb0NvbVNlcnZlclNlbmRGcmFtZUludGVybihwU2RvQ29tQ29uX3AsCisJCQkJCQkgICAgIHVpSW5kZXgsCisJCQkJCQkgICAgIHVpU3ViaW5kZXgsCisJCQkJCQkgICAgIGtFcGxTZG9Db21TZW5kVHlwZUFib3J0KTsKKwkJZ290byBFeGl0OworCX0gZWxzZSBpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVudHJ5IGRvZXNuJ3QgZXhpc3QKKwkJZHdBYm9ydENvZGUgPSBFUExfU0RPQUNfT0JKRUNUX05PVF9FWElTVDsKKwkJLy8gc2VuZCBhYm9ydAorCQlwU2RvQ29tQ29uX3AtPm1fcERhdGEgPSAoQllURSAqKSAmIGR3QWJvcnRDb2RlOworCQlSZXQgPSBFcGxTZG9Db21TZXJ2ZXJTZW5kRnJhbWVJbnRlcm4ocFNkb0NvbUNvbl9wLAorCQkJCQkJICAgICB1aUluZGV4LAorCQkJCQkJICAgICB1aVN1YmluZGV4LAorCQkJCQkJICAgICBrRXBsU2RvQ29tU2VuZFR5cGVBYm9ydCk7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gY29tcGFyZSBhY2Nlc3N0eXBlIG11c3QgYmUgcmVhZCBvciBjb25zdAorCWlmICgoKEFjY2Vzc1R5cGUgJiBrRXBsT2JkQWNjUmVhZCkgPT0gMCkKKwkgICAgJiYgKChBY2Nlc3NUeXBlICYga0VwbE9iZEFjY0NvbnN0KSA9PSAwKSkgeworCisJCWlmICgoQWNjZXNzVHlwZSAmIGtFcGxPYmRBY2NXcml0ZSkgIT0gMCkgeworCQkJLy8gZW50cnkgcmVhZCBhIHdyaXRlIG9ubHkgb2JqZWN0CisJCQlkd0Fib3J0Q29kZSA9IEVQTF9TRE9BQ19SRUFEX1RPX1dSSVRFX09OTFlfT0JKOworCQl9IGVsc2UgeworCQkJZHdBYm9ydENvZGUgPSBFUExfU0RPQUNfVU5TVVBQT1JURURfQUNDRVNTOworCQl9CisJCS8vIHNlbmQgYWJvcnQKKwkJcFNkb0NvbUNvbl9wLT5tX3BEYXRhID0gKEJZVEUgKikgJiBkd0Fib3J0Q29kZTsKKwkJUmV0ID0gRXBsU2RvQ29tU2VydmVyU2VuZEZyYW1lSW50ZXJuKHBTZG9Db21Db25fcCwKKwkJCQkJCSAgICAgdWlJbmRleCwKKwkJCQkJCSAgICAgdWlTdWJpbmRleCwKKwkJCQkJCSAgICAga0VwbFNkb0NvbVNlbmRUeXBlQWJvcnQpOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIHNhdmUgc2VydmljZQorCXBTZG9Db21Db25fcC0+bV9TZG9TZXJ2aWNlVHlwZSA9IGtFcGxTZG9TZXJ2aWNlUmVhZEJ5SW5kZXg7CisKKwkvLyBnZXQgc2l6ZSBvZiBvYmplY3QgdG8gc2VlIGlvZiBzZWdtZW50ZWQgb3IgZXhwZWRpdGVkIHRyYW5zZmVyCisvLyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JEVSkpICE9IDApCisJRW50cnlTaXplID0gRXBsT2JkdUdldERhdGFTaXplKHVpSW5kZXgsIHVpU3ViaW5kZXgpOworLyojZWxzZQorICAgIEVudHJ5U2l6ZSA9IDA7CisjZW5kaWYqLworCWlmIChFbnRyeVNpemUgPiBFUExfU0RPX01BWF9QQVlMT0FEKSB7CS8vIHNlZ21lbnRlZCB0cmFuc2ZlcgorCQlwU2RvQ29tQ29uX3AtPm1fU2RvVHJhbnNUeXBlID0ga0VwbFNkb1RyYW5zU2VnbWVudGVkOworCQkvLyBnZXQgcG9pbnRlciB0byBvYmplY3QtZW50cnkgZGF0YQorLy8jaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CRFUpKSAhPSAwKQorCQlwU2RvQ29tQ29uX3AtPm1fcERhdGEgPQorCQkgICAgRXBsT2JkdUdldE9iamVjdERhdGFQdHIodWlJbmRleCwgdWlTdWJpbmRleCk7CisvLyNlbmRpZgorCX0gZWxzZSB7CQkvLyBleHBlZGl0ZWQgdHJhbnNmZXIKKwkJcFNkb0NvbUNvbl9wLT5tX1Nkb1RyYW5zVHlwZSA9IGtFcGxTZG9UcmFuc0V4cGVkaXRlZDsKKwl9CisKKwlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemUgPSBFbnRyeVNpemU7CisJcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNmZXJyZWRCeXRlID0gMDsKKworCVJldCA9IEVwbFNkb0NvbVNlcnZlclNlbmRGcmFtZUludGVybihwU2RvQ29tQ29uX3AsCisJCQkJCSAgICAgdWlJbmRleCwKKwkJCQkJICAgICB1aVN1YmluZGV4LCBrRXBsU2RvQ29tU2VuZFR5cGVSZXMpOworCWlmIChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJLy8gZXJyb3IgLT4gYWJvcnQKKwkJZHdBYm9ydENvZGUgPSBFUExfU0RPQUNfR0VORVJBTF9FUlJPUjsKKwkJLy8gc2VuZCBhYm9ydAorCQlwU2RvQ29tQ29uX3AtPm1fcERhdGEgPSAoQllURSAqKSAmIGR3QWJvcnRDb2RlOworCQlSZXQgPSBFcGxTZG9Db21TZXJ2ZXJTZW5kRnJhbWVJbnRlcm4ocFNkb0NvbUNvbl9wLAorCQkJCQkJICAgICB1aUluZGV4LAorCQkJCQkJICAgICB1aVN1YmluZGV4LAorCQkJCQkJICAgICBrRXBsU2RvQ29tU2VuZFR5cGVBYm9ydCk7CisJCWdvdG8gRXhpdDsKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICAgICAgRXBsU2RvQ29tU2VydmVyU2VuZEZyYW1lSW50ZXJuKCk7CisvLworLy8gRGVzY3JpcHRpb246ICAgIGZ1bmN0aW9uIGNyZWF0cyBhbmQgc2VuZCBhIGZyYW1lIGZvciBzZXJ2ZXIKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICAgICAgcFNkb0NvbUNvbl9wICAgICA9IHBvaW50ZXIgdG8gY29udHJvbCBzdHJ1Y3R1cmUgb2YgY29ubmVjdGlvbgorLy8gICAgICAgICAgICAgICAgICB1aUluZGV4X3AgICAgICAgID0gaW5kZXggdG8gc2VuZCBpZiBleHBlZGl0ZWQgdHJhbnNmZXIgZWxzZSAwCisvLyAgICAgICAgICAgICAgICAgIHVpU3ViSW5kZXhfcCAgICAgPSBzdWJpbmRleCB0byBzZW5kIGlmIGV4cGVkaXRlZCB0cmFuc2ZlciBlbHNlIDAKKy8vICAgICAgICAgICAgICAgICAgU2VuZFR5cGVfcCAgICAgICA9IHRvIG9mIGZyYW1lIHRvIHNlbmQKKy8vCisvLyBSZXR1cm5zOiAgICAgICAgIHRFcGxLZXJuZWwgID0gIGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9TKSkgIT0gMCkKK3N0YXRpYyB0RXBsS2VybmVsIEVwbFNkb0NvbVNlcnZlclNlbmRGcmFtZUludGVybih0RXBsU2RvQ29tQ29uICogcFNkb0NvbUNvbl9wLAorCQkJCQkJIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCwKKwkJCQkJCSB0RXBsU2RvQ29tU2VuZFR5cGUgU2VuZFR5cGVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwlCWVRFIGFiRnJhbWVbRVBMX01BWF9TRE9fRlJBTUVfU0laRV07CisJdEVwbEZyYW1lICpwRnJhbWU7CisJdEVwbEFzeVNkb0NvbSAqcENvbW1hbmRGcmFtZTsKKwl1bnNpZ25lZCBpbnQgdWlTaXplT2ZGcmFtZTsKKwlCWVRFIGJGbGFnOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlwRnJhbWUgPSAodEVwbEZyYW1lICopICYgYWJGcmFtZVswXTsKKworCUVQTF9NRU1TRVQoJmFiRnJhbWVbMF0sIDB4MDAsIHNpemVvZihhYkZyYW1lKSk7CisKKwkvLyBidWlsZCBnZW5lcmljIHBhcnQgb2YgZnJhbWUKKwkvLyBnZXQgcG9pbnRlciB0byBjb21tYW5kIGxheWVycGFydCBvZiBmcmFtZQorCXBDb21tYW5kRnJhbWUgPQorCSAgICAmcEZyYW1lLT5tX0RhdGEubV9Bc25kLm1fUGF5bG9hZC5tX1Nkb1NlcXVlbmNlRnJhbWUuCisJICAgIG1fbGVfYWJTZG9TZXFQYXlsb2FkOworCUFtaVNldEJ5dGVUb0xlKCZwQ29tbWFuZEZyYW1lLT5tX2xlX2JDb21tYW5kSWQsCisJCSAgICAgICBwU2RvQ29tQ29uX3AtPm1fU2RvU2VydmljZVR5cGUpOworCUFtaVNldEJ5dGVUb0xlKCZwQ29tbWFuZEZyYW1lLT5tX2xlX2JUcmFuc2FjdGlvbklkLAorCQkgICAgICAgcFNkb0NvbUNvbl9wLT5tX2JUcmFuc2FjdGlvbklkKTsKKworCS8vIHNldCBzaXplIHRvIGhlYWRlciBzaXplCisJdWlTaXplT2ZGcmFtZSA9IDg7CisKKwkvLyBjaGVjayBTZW5kVHlwZQorCXN3aXRjaCAoU2VuZFR5cGVfcCkgeworCQkvLyByZXF1ZXN0ZnJhbWUgdG8gc2VuZAorCWNhc2Uga0VwbFNkb0NvbVNlbmRUeXBlUmVxOgorCQl7CisJCQkvLyBub3RoaW5nIHRvIGRvIGZvciBzZXJ2ZXIKKwkJCS8vLT4gZXJyb3IKKwkJCVJldCA9IGtFcGxTZG9Db21JbnZhbGlkU2VuZFR5cGU7CisJCQlicmVhazsKKwkJfQorCisJCS8vIHJlc3BvbnNlIHdpdGhvdXQgZGF0YSB0byBzZW5kCisJY2FzZSBrRXBsU2RvQ29tU2VuZFR5cGVBY2tSZXM6CisJCXsKKwkJCS8vIHNldCByZXNwb25zZSBmbGFnCisJCQlBbWlTZXRCeXRlVG9MZSgmcENvbW1hbmRGcmFtZS0+bV9sZV9iRmxhZ3MsIDB4ODApOworCisJCQkvLyBzZW5kIGZyYW1lCisJCQlSZXQgPSBFcGxTZG9Bc3lTZXFTZW5kRGF0YShwU2RvQ29tQ29uX3AtPm1fU2RvU2VxQ29uSGRsLAorCQkJCQkJICAgdWlTaXplT2ZGcmFtZSwgcEZyYW1lKTsKKworCQkJYnJlYWs7CisJCX0KKworCQkvLyByZXNwb25zZnJhbWUgdG8gc2VuZAorCWNhc2Uga0VwbFNkb0NvbVNlbmRUeXBlUmVzOgorCQl7CisJCQkvLyBzZXQgcmVzcG9uc2UgZmxhZworCQkJYkZsYWcgPSBBbWlHZXRCeXRlRnJvbUxlKCZwQ29tbWFuZEZyYW1lLT5tX2xlX2JGbGFncyk7CisJCQliRmxhZyB8PSAweDgwOworCQkJQW1pU2V0Qnl0ZVRvTGUoJnBDb21tYW5kRnJhbWUtPm1fbGVfYkZsYWdzLCBiRmxhZyk7CisKKwkJCS8vIGNoZWNrIHR5cGUgb2YgcmVzb25zZQorCQkJaWYgKHBTZG9Db21Db25fcC0+bV9TZG9UcmFuc1R5cGUgPT0ga0VwbFNkb1RyYW5zRXhwZWRpdGVkKSB7CS8vIEV4cGVkaXRlZCB0cmFuc2ZlcgorCQkJCS8vIGNvcHkgZGF0YSBpbiBmcmFtZQorLy8jaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CRFUpKSAhPSAwKQorCQkJCVJldCA9IEVwbE9iZHVSZWFkRW50cnlUb0xlKHVpSW5kZXhfcCwKKwkJCQkJCQkgICB1aVN1YkluZGV4X3AsCisJCQkJCQkJICAgJnBDb21tYW5kRnJhbWUtPgorCQkJCQkJCSAgIG1fbGVfYWJDb21tYW5kRGF0YQorCQkJCQkJCSAgIFswXSwKKwkJCQkJCQkgICAodEVwbE9iZFNpemUgKikgJgorCQkJCQkJCSAgIHBTZG9Db21Db25fcC0+CisJCQkJCQkJICAgbV91aVRyYW5zU2l6ZSk7CisJCQkJaWYgKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQkJCQlnb3RvIEV4aXQ7CisJCQkJfQorLy8jZW5kaWYKKworCQkJCS8vIHNldCBzaXplIG9mIGZyYW1lCisJCQkJQW1pU2V0V29yZFRvTGUoJnBDb21tYW5kRnJhbWUtPgorCQkJCQkgICAgICAgbV9sZV93U2VnbWVudFNpemUsCisJCQkJCSAgICAgICAoV09SRCkgcFNkb0NvbUNvbl9wLT4KKwkJCQkJICAgICAgIG1fdWlUcmFuc1NpemUpOworCisJCQkJLy8gY29ycmVjdCBieXRlLWNvdW50ZXIKKwkJCQl1aVNpemVPZkZyYW1lICs9IHBTZG9Db21Db25fcC0+bV91aVRyYW5zU2l6ZTsKKwkJCQlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc2ZlcnJlZEJ5dGUgKz0KKwkJCQkgICAgcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplOworCQkJCXBTZG9Db21Db25fcC0+bV91aVRyYW5zU2l6ZSA9IDA7CisKKwkJCQkvLyBzZW5kIGZyYW1lCisJCQkJdWlTaXplT2ZGcmFtZSArPSBwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemU7CisJCQkJUmV0ID0KKwkJCQkgICAgRXBsU2RvQXN5U2VxU2VuZERhdGEocFNkb0NvbUNvbl9wLT4KKwkJCQkJCQkgbV9TZG9TZXFDb25IZGwsCisJCQkJCQkJIHVpU2l6ZU9mRnJhbWUsIHBGcmFtZSk7CisJCQl9IGVsc2UgaWYgKHBTZG9Db21Db25fcC0+bV9TZG9UcmFuc1R5cGUgPT0ga0VwbFNkb1RyYW5zU2VnbWVudGVkKSB7CS8vIHNlZ21lbnRlZCB0cmFuc2ZlcgorCQkJCS8vIGRpc3Rpbmd1aXNoIGJldHdlZW4gaW5pdCwgc2VnbWVudCBhbmQgY29tcGxldGUKKwkJCQlpZiAocFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNmZXJyZWRCeXRlID09IDApIHsJLy8gaW5pdAorCQkJCQkvLyBzZXQgaW5pdCBmbGFnCisJCQkJCWJGbGFnID0KKwkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUoJnBDb21tYW5kRnJhbWUtPgorCQkJCQkJCSAgICAgbV9sZV9iRmxhZ3MpOworCQkJCQliRmxhZyB8PSAweDEwOworCQkJCQlBbWlTZXRCeXRlVG9MZSgmcENvbW1hbmRGcmFtZS0+CisJCQkJCQkgICAgICAgbV9sZV9iRmxhZ3MsIGJGbGFnKTsKKwkJCQkJLy8gaW5pdCB2YXJpYWJsZSBoZWFkZXIKKwkJCQkJQW1pU2V0RHdvcmRUb0xlKCZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJCQltX2xlX2FiQ29tbWFuZERhdGFbMF0sCisJCQkJCQkJcFNkb0NvbUNvbl9wLT4KKwkJCQkJCQltX3VpVHJhbnNTaXplKTsKKwkJCQkJLy8gY29weSBkYXRhIGluIGZyYW1lCisJCQkJCUVQTF9NRU1DUFkoJnBDb21tYW5kRnJhbWUtPgorCQkJCQkJICAgbV9sZV9hYkNvbW1hbmREYXRhWzRdLAorCQkJCQkJICAgcFNkb0NvbUNvbl9wLT5tX3BEYXRhLAorCQkJCQkJICAgKEVQTF9TRE9fTUFYX1BBWUxPQUQgLSA0KSk7CisKKwkJCQkJLy8gY29ycmVjdCBieXRlLWNvdW50ZXIKKwkJCQkJcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplIC09CisJCQkJCSAgICAoRVBMX1NET19NQVhfUEFZTE9BRCAtIDQpOworCQkJCQlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc2ZlcnJlZEJ5dGUgKz0KKwkJCQkJICAgIChFUExfU0RPX01BWF9QQVlMT0FEIC0gNCk7CisJCQkJCS8vIG1vdmUgZGF0YSBwb2ludGVyCisJCQkJCXBTZG9Db21Db25fcC0+bV9wRGF0YSArPQorCQkJCQkgICAgKEVQTF9TRE9fTUFYX1BBWUxPQUQgLSA0KTsKKworCQkJCQkvLyBzZXQgc2VnbWVudCBzaXplCisJCQkJCUFtaVNldFdvcmRUb0xlKCZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJCSAgICAgICBtX2xlX3dTZWdtZW50U2l6ZSwKKwkJCQkJCSAgICAgICAoRVBMX1NET19NQVhfUEFZTE9BRCAtCisJCQkJCQkJNCkpOworCisJCQkJCS8vIHNlbmQgZnJhbWUKKwkJCQkJdWlTaXplT2ZGcmFtZSArPSBFUExfU0RPX01BWF9QQVlMT0FEOworCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsU2RvQXN5U2VxU2VuZERhdGEocFNkb0NvbUNvbl9wLT4KKwkJCQkJCQkJIG1fU2RvU2VxQ29uSGRsLAorCQkJCQkJCQkgdWlTaXplT2ZGcmFtZSwKKwkJCQkJCQkJIHBGcmFtZSk7CisKKwkJCQl9IGVsc2UKKwkJCQkgICAgaWYgKChwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc2ZlcnJlZEJ5dGUgPiAwKQorCQkJCQkmJiAocFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplID4gRVBMX1NET19NQVhfUEFZTE9BRCkpIHsJLy8gc2VnbWVudAorCQkJCQkvLyBzZXQgc2VnbWVudCBmbGFnCisJCQkJCWJGbGFnID0KKwkJCQkJICAgIEFtaUdldEJ5dGVGcm9tTGUoJnBDb21tYW5kRnJhbWUtPgorCQkJCQkJCSAgICAgbV9sZV9iRmxhZ3MpOworCQkJCQliRmxhZyB8PSAweDIwOworCQkJCQlBbWlTZXRCeXRlVG9MZSgmcENvbW1hbmRGcmFtZS0+CisJCQkJCQkgICAgICAgbV9sZV9iRmxhZ3MsIGJGbGFnKTsKKworCQkJCQkvLyBjb3B5IGRhdGEgaW4gZnJhbWUKKwkJCQkJRVBMX01FTUNQWSgmcENvbW1hbmRGcmFtZS0+CisJCQkJCQkgICBtX2xlX2FiQ29tbWFuZERhdGFbMF0sCisJCQkJCQkgICBwU2RvQ29tQ29uX3AtPm1fcERhdGEsCisJCQkJCQkgICBFUExfU0RPX01BWF9QQVlMT0FEKTsKKworCQkJCQkvLyBjb3JyZWN0IGJ5dGUtY291bnRlcgorCQkJCQlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemUgLT0KKwkJCQkJICAgIEVQTF9TRE9fTUFYX1BBWUxPQUQ7CisJCQkJCXBTZG9Db21Db25fcC0+bV91aVRyYW5zZmVycmVkQnl0ZSArPQorCQkJCQkgICAgRVBMX1NET19NQVhfUEFZTE9BRDsKKwkJCQkJLy8gbW92ZSBkYXRhIHBvaW50ZXIKKwkJCQkJcFNkb0NvbUNvbl9wLT5tX3BEYXRhICs9CisJCQkJCSAgICBFUExfU0RPX01BWF9QQVlMT0FEOworCisJCQkJCS8vIHNldCBzZWdtZW50IHNpemUKKwkJCQkJQW1pU2V0V29yZFRvTGUoJnBDb21tYW5kRnJhbWUtPgorCQkJCQkJICAgICAgIG1fbGVfd1NlZ21lbnRTaXplLAorCQkJCQkJICAgICAgIEVQTF9TRE9fTUFYX1BBWUxPQUQpOworCisJCQkJCS8vIHNlbmQgZnJhbWUKKwkJCQkJdWlTaXplT2ZGcmFtZSArPSBFUExfU0RPX01BWF9QQVlMT0FEOworCQkJCQlSZXQgPQorCQkJCQkgICAgRXBsU2RvQXN5U2VxU2VuZERhdGEocFNkb0NvbUNvbl9wLT4KKwkJCQkJCQkJIG1fU2RvU2VxQ29uSGRsLAorCQkJCQkJCQkgdWlTaXplT2ZGcmFtZSwKKwkJCQkJCQkJIHBGcmFtZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKChwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemUgPT0gMCkKKwkJCQkJICAgICYmIChwU2RvQ29tQ29uX3AtPgorCQkJCQkJbV9TZG9TZXJ2aWNlVHlwZSAhPQorCQkJCQkJa0VwbFNkb1NlcnZpY2VXcml0ZUJ5SW5kZXgpKSB7CisJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCX0KKwkJCQkJLy8gY29tcGxldGUKKwkJCQkJLy8gc2V0IHNlZ21lbnQgY29tcGxldGUgZmxhZworCQkJCQliRmxhZyA9CisJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlKCZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJCQkgICAgIG1fbGVfYkZsYWdzKTsKKwkJCQkJYkZsYWcgfD0gMHgzMDsKKwkJCQkJQW1pU2V0Qnl0ZVRvTGUoJnBDb21tYW5kRnJhbWUtPgorCQkJCQkJICAgICAgIG1fbGVfYkZsYWdzLCBiRmxhZyk7CisKKwkJCQkJLy8gY29weSBkYXRhIGluIGZyYW1lCisJCQkJCUVQTF9NRU1DUFkoJnBDb21tYW5kRnJhbWUtPgorCQkJCQkJICAgbV9sZV9hYkNvbW1hbmREYXRhWzBdLAorCQkJCQkJICAgcFNkb0NvbUNvbl9wLT5tX3BEYXRhLAorCQkJCQkJICAgcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplKTsKKworCQkJCQkvLyBjb3JyZWN0IGJ5dGUtY291bnRlcgorCQkJCQlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc2ZlcnJlZEJ5dGUgKz0KKwkJCQkJICAgIHBTZG9Db21Db25fcC0+bV91aVRyYW5zU2l6ZTsKKworCQkJCQkvLyBtb3ZlIGRhdGEgcG9pbnRlcgorCQkJCQlwU2RvQ29tQ29uX3AtPm1fcERhdGEgKz0KKwkJCQkJICAgIHBTZG9Db21Db25fcC0+bV91aVRyYW5zU2l6ZTsKKworCQkJCQkvLyBzZXQgc2VnbWVudCBzaXplCisJCQkJCUFtaVNldFdvcmRUb0xlKCZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJCSAgICAgICBtX2xlX3dTZWdtZW50U2l6ZSwKKwkJCQkJCSAgICAgICAoV09SRCkgcFNkb0NvbUNvbl9wLT4KKwkJCQkJCSAgICAgICBtX3VpVHJhbnNTaXplKTsKKworCQkJCQkvLyBzZW5kIGZyYW1lCisJCQkJCXVpU2l6ZU9mRnJhbWUgKz0KKwkJCQkJICAgIHBTZG9Db21Db25fcC0+bV91aVRyYW5zU2l6ZTsKKwkJCQkJcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplID0gMDsKKwkJCQkJUmV0ID0KKwkJCQkJICAgIEVwbFNkb0FzeVNlcVNlbmREYXRhKHBTZG9Db21Db25fcC0+CisJCQkJCQkJCSBtX1Nkb1NlcUNvbkhkbCwKKwkJCQkJCQkJIHVpU2l6ZU9mRnJhbWUsCisJCQkJCQkJCSBwRnJhbWUpOworCQkJCX0KKworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJLy8gYWJvcnQgdG8gc2VuZAorCWNhc2Uga0VwbFNkb0NvbVNlbmRUeXBlQWJvcnQ6CisJCXsKKwkJCS8vIHNldCByZXNwb25zZSBhbmQgYWJvcnQgZmxhZworCQkJYkZsYWcgPSBBbWlHZXRCeXRlRnJvbUxlKCZwQ29tbWFuZEZyYW1lLT5tX2xlX2JGbGFncyk7CisJCQliRmxhZyB8PSAweEMwOworCQkJQW1pU2V0Qnl0ZVRvTGUoJnBDb21tYW5kRnJhbWUtPm1fbGVfYkZsYWdzLCBiRmxhZyk7CisKKwkJCS8vIGNvcHkgYWJvcnRjb2RlIHRvIGZyYW1lCisJCQlBbWlTZXREd29yZFRvTGUoJnBDb21tYW5kRnJhbWUtPm1fbGVfYWJDb21tYW5kRGF0YVswXSwKKwkJCQkJKigoRFdPUkQgKikgcFNkb0NvbUNvbl9wLT5tX3BEYXRhKSk7CisKKwkJCS8vIHNldCBzaXplIG9mIHNlZ21lbnQKKwkJCUFtaVNldFdvcmRUb0xlKCZwQ29tbWFuZEZyYW1lLT5tX2xlX3dTZWdtZW50U2l6ZSwKKwkJCQkgICAgICAgc2l6ZW9mKERXT1JEKSk7CisKKwkJCS8vIHVwZGF0ZSBjb3VudGVyCisJCQlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc2ZlcnJlZEJ5dGUgPSBzaXplb2YoRFdPUkQpOworCQkJcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplID0gMDsKKworCQkJLy8gY2FsYyBmcmFtZXNpemUKKwkJCXVpU2l6ZU9mRnJhbWUgKz0gc2l6ZW9mKERXT1JEKTsKKwkJCVJldCA9IEVwbFNkb0FzeVNlcVNlbmREYXRhKHBTZG9Db21Db25fcC0+bV9TZG9TZXFDb25IZGwsCisJCQkJCQkgICB1aVNpemVPZkZyYW1lLCBwRnJhbWUpOworCQkJYnJlYWs7CisJCX0KKwl9CQkJLy8gZW5kIG9mIHN3aXRjaChTZW5kVHlwZV9wKQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisjZW5kaWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgICAgICBFcGxTZG9Db21TZXJ2ZXJJbml0V3JpdGVCeUluZGV4CisvLworLy8gRGVzY3JpcHRpb246ICAgIGZ1bmN0aW9uIHN0YXJ0IHRoZSBwcm9jZXNzaW5nIG9mIGFuIHdyaXRlIGJ5IGluZGV4IGNvbW1hbmQKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICAgICAgcFNkb0NvbUNvbl9wICAgICA9IHBvaW50ZXIgdG8gY29udHJvbCBzdHJ1Y3R1cmUgb2YgY29ubmVjdGlvbgorLy8gICAgICAgICAgICAgICAgICBwQXN5U2RvQ29tX3AgICAgID0gcG9pbnRlciB0byByZWNlaXZlZCBmcmFtZQorLy8KKy8vIFJldHVybnM6ICAgICAgICAgdEVwbEtlcm5lbCAgPSAgZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET1MpKSAhPSAwKQorc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQ29tU2VydmVySW5pdFdyaXRlQnlJbmRleCh0RXBsU2RvQ29tQ29uICogcFNkb0NvbUNvbl9wLAorCQkJCQkJICB0RXBsQXN5U2RvQ29tICogcEFzeVNkb0NvbV9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdW5zaWduZWQgaW50IHVpSW5kZXg7CisJdW5zaWduZWQgaW50IHVpU3ViaW5kZXg7CisJdW5zaWduZWQgaW50IHVpQnl0ZXNUb1RyYW5zZmVyOworCXRFcGxPYmRTaXplIEVudHJ5U2l6ZTsKKwl0RXBsT2JkQWNjZXNzIEFjY2Vzc1R5cGU7CisJRFdPUkQgZHdBYm9ydENvZGU7CisJQllURSAqcGJTcmNEYXRhOworCisJZHdBYm9ydENvZGUgPSAwOworCisJLy8gYSBpbml0IG9mIGEgd3JpdGUKKwkvLyAtPiB2YXJpYWJsZSBwYXJ0IG9mIGhlYWRlciBwb3NzaWJsZQorCisJLy8gY2hlY2sgaWYgZXhwZWRpdGVkIG9yIHNlZ21lbnRlZCB0cmFuc2ZlcgorCWlmICgocEFzeVNkb0NvbV9wLT5tX2xlX2JGbGFncyAmIDB4MzApID09IDB4MTApIHsJLy8gaW5pdGlhdGUgc2VnbWVudGVkIHRyYW5zZmVyCisJCXBTZG9Db21Db25fcC0+bV9TZG9UcmFuc1R5cGUgPSBrRXBsU2RvVHJhbnNTZWdtZW50ZWQ7CisJCS8vIGdldCBpbmRleCBhbmQgc3ViaW5kZXgKKwkJdWlJbmRleCA9CisJCSAgICBBbWlHZXRXb3JkRnJvbUxlKCZwQXN5U2RvQ29tX3AtPm1fbGVfYWJDb21tYW5kRGF0YVs0XSk7CisJCXVpU3ViaW5kZXggPQorCQkgICAgQW1pR2V0Qnl0ZUZyb21MZSgmcEFzeVNkb0NvbV9wLT5tX2xlX2FiQ29tbWFuZERhdGFbNl0pOworCQkvLyBnZXQgc291cmNlLXBvaW50ZXIgZm9yIGNvcHkKKwkJcGJTcmNEYXRhID0gJnBBc3lTZG9Db21fcC0+bV9sZV9hYkNvbW1hbmREYXRhWzhdOworCQkvLyBzYXZlIHNpemUKKwkJcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplID0KKwkJICAgIEFtaUdldER3b3JkRnJvbUxlKCZwQXN5U2RvQ29tX3AtPm1fbGVfYWJDb21tYW5kRGF0YVswXSk7CisKKwl9IGVsc2UgaWYgKChwQXN5U2RvQ29tX3AtPm1fbGVfYkZsYWdzICYgMHgzMCkgPT0gMHgwMCkgewkvLyBleHBlZGl0ZWQgdHJhbnNmZXIKKwkJcFNkb0NvbUNvbl9wLT5tX1Nkb1RyYW5zVHlwZSA9IGtFcGxTZG9UcmFuc0V4cGVkaXRlZDsKKwkJLy8gZ2V0IGluZGV4IGFuZCBzdWJpbmRleAorCQl1aUluZGV4ID0KKwkJICAgIEFtaUdldFdvcmRGcm9tTGUoJnBBc3lTZG9Db21fcC0+bV9sZV9hYkNvbW1hbmREYXRhWzBdKTsKKwkJdWlTdWJpbmRleCA9CisJCSAgICBBbWlHZXRCeXRlRnJvbUxlKCZwQXN5U2RvQ29tX3AtPm1fbGVfYWJDb21tYW5kRGF0YVsyXSk7CisJCS8vIGdldCBzb3VyY2UtcG9pbnRlciBmb3IgY29weQorCQlwYlNyY0RhdGEgPSAmcEFzeVNkb0NvbV9wLT5tX2xlX2FiQ29tbWFuZERhdGFbNF07CisJCS8vIHNhdmUgc2l6ZQorCQlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemUgPQorCQkgICAgQW1pR2V0V29yZEZyb21MZSgmcEFzeVNkb0NvbV9wLT5tX2xlX3dTZWdtZW50U2l6ZSk7CisJCS8vIHN1YnRyYWN0IGhlYWRlcgorCQlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemUgLT0gNDsKKworCX0gZWxzZSB7CisJCS8vIGp1c3QgaWdub3JlIGFueSBvdGhlciB0cmFuc2ZlciB0eXBlCisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLyBjaGVjayBhY2Nlc3N0eXBlIG9mIGVudHJ5CisJLy8gZXhpc3RlbnMgb2YgZW50cnkKKy8vI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9PQkRVKSkgIT0gMCkKKwlSZXQgPSBFcGxPYmR1R2V0QWNjZXNzVHlwZSh1aUluZGV4LCB1aVN1YmluZGV4LCAmQWNjZXNzVHlwZSk7CisvKiNlbHNlCisgICAgUmV0ID0ga0VwbE9iZFN1YmluZGV4Tm90RXhpc3Q7CisgICAgQWNjZXNzVHlwZSA9IDA7CisjZW5kaWYqLworCWlmIChSZXQgPT0ga0VwbE9iZFN1YmluZGV4Tm90RXhpc3QpIHsJLy8gc3ViZW50cnkgZG9lc24ndCBleGlzdAorCQlwU2RvQ29tQ29uX3AtPm1fZHdMYXN0QWJvcnRDb2RlID0gRVBMX1NET0FDX1NVQl9JTkRFWF9OT1RfRVhJU1Q7CisJCS8vIHNlbmQgYWJvcnQKKwkJLy8gZC5rLiBUaGlzIGlzIHdyb25nOiBrLnQuIG5vdCBuZWVkZWQgc2VuZCBhYm9ydCBvbiBlbmQgb2Ygd3JpdGUKKwkJLypwU2RvQ29tQ29uX3AtPm1fcERhdGEgPSAoQllURSopcFNkb0NvbUNvbl9wLT5tX2R3TGFzdEFib3J0Q29kZTsKKwkJICAgUmV0ID0gRXBsU2RvQ29tU2VydmVyU2VuZEZyYW1lSW50ZXJuKHBTZG9Db21Db25fcCwKKwkJICAgdWlJbmRleCwKKwkJICAgdWlTdWJpbmRleCwKKwkJICAga0VwbFNkb0NvbVNlbmRUeXBlQWJvcnQpOyAqLworCQlnb3RvIEFib3J0OworCX0gZWxzZSBpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGVudHJ5IGRvZXNuJ3QgZXhpc3QKKwkJcFNkb0NvbUNvbl9wLT5tX2R3TGFzdEFib3J0Q29kZSA9IEVQTF9TRE9BQ19PQkpFQ1RfTk9UX0VYSVNUOworCQkvLyBzZW5kIGFib3J0CisJCS8vIGQuay4gVGhpcyBpcyB3cm9uZzogay50LiBub3QgbmVlZGVkIHNlbmQgYWJvcnQgb24gZW5kIG9mIHdyaXRlCisJCS8qCisJCSAgIHBTZG9Db21Db25fcC0+bV9wRGF0YSA9IChCWVRFKikmZHdBYm9ydENvZGU7CisJCSAgIFJldCA9IEVwbFNkb0NvbVNlcnZlclNlbmRGcmFtZUludGVybihwU2RvQ29tQ29uX3AsCisJCSAgIHVpSW5kZXgsCisJCSAgIHVpU3ViaW5kZXgsCisJCSAgIGtFcGxTZG9Db21TZW5kVHlwZUFib3J0KTsgKi8KKwkJZ290byBBYm9ydDsKKwl9CisJLy8gY29tcGFyZSBhY2Nlc3N0eXBlIG11c3QgYmUgcmVhZAorCWlmICgoQWNjZXNzVHlwZSAmIGtFcGxPYmRBY2NXcml0ZSkgPT0gMCkgeworCisJCWlmICgoQWNjZXNzVHlwZSAmIGtFcGxPYmRBY2NSZWFkKSAhPSAwKSB7CisJCQkvLyBlbnRyeSB3cml0ZSBhIHJlYWQgb25seSBvYmplY3QKKwkJCXBTZG9Db21Db25fcC0+bV9kd0xhc3RBYm9ydENvZGUgPQorCQkJICAgIEVQTF9TRE9BQ19XUklURV9UT19SRUFEX09OTFlfT0JKOworCQl9IGVsc2UgeworCQkJcFNkb0NvbUNvbl9wLT5tX2R3TGFzdEFib3J0Q29kZSA9CisJCQkgICAgRVBMX1NET0FDX1VOU1VQUE9SVEVEX0FDQ0VTUzsKKwkJfQorCQkvLyBzZW5kIGFib3J0CisJCS8vIGQuay4gVGhpcyBpcyB3cm9uZzogay50LiBub3QgbmVlZGVkIHNlbmQgYWJvcnQgb24gZW5kIG9mIHdyaXRlCisJCS8qcFNkb0NvbUNvbl9wLT5tX3BEYXRhID0gKEJZVEUqKSZkd0Fib3J0Q29kZTsKKwkJICAgUmV0ID0gRXBsU2RvQ29tU2VydmVyU2VuZEZyYW1lSW50ZXJuKHBTZG9Db21Db25fcCwKKwkJICAgdWlJbmRleCwKKwkJICAgdWlTdWJpbmRleCwKKwkJICAga0VwbFNkb0NvbVNlbmRUeXBlQWJvcnQpOyAqLworCQlnb3RvIEFib3J0OworCX0KKwkvLyBzYXZlIHNlcnZpY2UKKwlwU2RvQ29tQ29uX3AtPm1fU2RvU2VydmljZVR5cGUgPSBrRXBsU2RvU2VydmljZVdyaXRlQnlJbmRleDsKKworCXBTZG9Db21Db25fcC0+bV91aVRyYW5zZmVycmVkQnl0ZSA9IDA7CisKKwkvLyB3cml0ZSBkYXRhIHRvIE9ECisJaWYgKHBTZG9Db21Db25fcC0+bV9TZG9UcmFuc1R5cGUgPT0ga0VwbFNkb1RyYW5zRXhwZWRpdGVkKSB7CS8vIGV4cGVkaXRlZCB0cmFuc2ZlcgorCQkvLyBzaXplIGNoZWNraW5nIGlzIGRvbmUgYnkgRXBsT2JkdVdyaXRlRW50cnlGcm9tTGUoKQorCisvLyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JEVSkpICE9IDApCisJCVJldCA9IEVwbE9iZHVXcml0ZUVudHJ5RnJvbUxlKHVpSW5kZXgsCisJCQkJCSAgICAgIHVpU3ViaW5kZXgsCisJCQkJCSAgICAgIHBiU3JjRGF0YSwKKwkJCQkJICAgICAgcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplKTsKKwkJc3dpdGNoIChSZXQpIHsKKwkJY2FzZSBrRXBsU3VjY2Vzc2Z1bDoKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKworCQljYXNlIGtFcGxPYmRBY2Nlc3NWaW9sYXRpb246CisJCQl7CisJCQkJcFNkb0NvbUNvbl9wLT5tX2R3TGFzdEFib3J0Q29kZSA9CisJCQkJICAgIEVQTF9TRE9BQ19VTlNVUFBPUlRFRF9BQ0NFU1M7CisJCQkJLy8gc2VuZCBhYm9ydAorCQkJCWdvdG8gQWJvcnQ7CisJCQl9CisKKwkJY2FzZSBrRXBsT2JkVmFsdWVMZW5ndGhFcnJvcjoKKwkJCXsKKwkJCQlwU2RvQ29tQ29uX3AtPm1fZHdMYXN0QWJvcnRDb2RlID0KKwkJCQkgICAgRVBMX1NET0FDX0RBVEFfVFlQRV9MRU5HVEhfTk9UX01BVENIOworCQkJCS8vIHNlbmQgYWJvcnQKKwkJCQlnb3RvIEFib3J0OworCQkJfQorCisJCWNhc2Uga0VwbE9iZFZhbHVlVG9vSGlnaDoKKwkJCXsKKwkJCQlwU2RvQ29tQ29uX3AtPm1fZHdMYXN0QWJvcnRDb2RlID0KKwkJCQkgICAgRVBMX1NET0FDX1ZBTFVFX1JBTkdFX1RPT19ISUdIOworCQkJCS8vIHNlbmQgYWJvcnQKKwkJCQlnb3RvIEFib3J0OworCQkJfQorCisJCWNhc2Uga0VwbE9iZFZhbHVlVG9vTG93OgorCQkJeworCQkJCXBTZG9Db21Db25fcC0+bV9kd0xhc3RBYm9ydENvZGUgPQorCQkJCSAgICBFUExfU0RPQUNfVkFMVUVfUkFOR0VfVE9PX0xPVzsKKwkJCQkvLyBzZW5kIGFib3J0CisJCQkJZ290byBBYm9ydDsKKwkJCX0KKworCQlkZWZhdWx0OgorCQkJeworCQkJCXBTZG9Db21Db25fcC0+bV9kd0xhc3RBYm9ydENvZGUgPQorCQkJCSAgICBFUExfU0RPQUNfR0VORVJBTF9FUlJPUjsKKwkJCQkvLyBzZW5kIGFib3J0CisJCQkJZ290byBBYm9ydDsKKwkJCX0KKwkJfQorLy8jZW5kaWYKKwkJLy8gc2VuZCBjb21tYW5kIGFja25vd2xlZGdlCisJCVJldCA9IEVwbFNkb0NvbVNlcnZlclNlbmRGcmFtZUludGVybihwU2RvQ29tQ29uX3AsCisJCQkJCQkgICAgIDAsCisJCQkJCQkgICAgIDAsCisJCQkJCQkgICAgIGtFcGxTZG9Db21TZW5kVHlwZUFja1Jlcyk7CisKKwkJcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplID0gMDsKKwkJZ290byBFeGl0OworCX0gZWxzZSB7CisJCS8vIGdldCBzaXplIG9mIHRoZSBvYmplY3QgdG8gY2hlY2sgaWYgaXQgZml0cworCQkvLyBiZWNhdXNlIHdlIGRpcmVjdGx5IHdyaXRlIHRvIHRoZSBkZXN0aW5hdGlvbiBtZW1vcnkKKwkJLy8gZC5rLiBubyBvbmUgY2FsbHMgdGhlIHVzZXIgT0QgY2FsbGJhY2sgZnVuY3Rpb24KKworCQkvLyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JEVSkpICE9IDApCisJCUVudHJ5U2l6ZSA9IEVwbE9iZHVHZXREYXRhU2l6ZSh1aUluZGV4LCB1aVN1YmluZGV4KTsKKwkJLyojZWxzZQorCQkgICBFbnRyeVNpemUgPSAwOworCQkgICAjZW5kaWYgKi8KKwkJaWYgKEVudHJ5U2l6ZSA8IHBTZG9Db21Db25fcC0+bV91aVRyYW5zU2l6ZSkgewkvLyBwYXJhbWV0ZXIgdG9vIGJpZworCQkJcFNkb0NvbUNvbl9wLT5tX2R3TGFzdEFib3J0Q29kZSA9CisJCQkgICAgRVBMX1NET0FDX0RBVEFfVFlQRV9MRU5HVEhfVE9PX0hJR0g7CisJCQkvLyBzZW5kIGFib3J0CisJCQkvLyBkLmsuIFRoaXMgaXMgd3Jvbmc6IGsudC4gbm90IG5lZWRlZCBzZW5kIGFib3J0IG9uIGVuZCBvZiB3cml0ZQorCQkJLypwU2RvQ29tQ29uX3AtPm1fcERhdGEgPSAoQllURSopJmR3QWJvcnRDb2RlOworCQkJICAgUmV0ID0gRXBsU2RvQ29tU2VydmVyU2VuZEZyYW1lSW50ZXJuKHBTZG9Db21Db25fcCwKKwkJCSAgIHVpSW5kZXgsCisJCQkgICB1aVN1YmluZGV4LAorCQkJICAga0VwbFNkb0NvbVNlbmRUeXBlQWJvcnQpOyAqLworCQkJZ290byBBYm9ydDsKKwkJfQorCisJCXVpQnl0ZXNUb1RyYW5zZmVyID0KKwkJICAgIEFtaUdldFdvcmRGcm9tTGUoJnBBc3lTZG9Db21fcC0+bV9sZV93U2VnbWVudFNpemUpOworCQkvLyBlbGVtaW5hdGUgaGVhZGVyIChDb21tYW5kIGhlYWRlciAoOCkgKyB2YXJpYWJsZSBwYXJ0ICg0KSArIENvbW1hbmQgaGVhZGVyICg0KSkKKwkJdWlCeXRlc1RvVHJhbnNmZXIgLT0gMTY7CisJCS8vIGdldCBwb2ludGVyIHRvIG9iamVjdCBlbnRyeQorLy8jaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CRFUpKSAhPSAwKQorCQlwU2RvQ29tQ29uX3AtPm1fcERhdGEgPSBFcGxPYmR1R2V0T2JqZWN0RGF0YVB0cih1aUluZGV4LAorCQkJCQkJCQl1aVN1YmluZGV4KTsKKy8vI2VuZGlmCisJCWlmIChwU2RvQ29tQ29uX3AtPm1fcERhdGEgPT0gTlVMTCkgeworCQkJcFNkb0NvbUNvbl9wLT5tX2R3TGFzdEFib3J0Q29kZSA9CisJCQkgICAgRVBMX1NET0FDX0dFTkVSQUxfRVJST1I7CisJCQkvLyBzZW5kIGFib3J0CisJCQkvLyBkLmsuIFRoaXMgaXMgd3Jvbmc6IGsudC4gbm90IG5lZWRlZCBzZW5kIGFib3J0IG9uIGVuZCBvZiB3cml0ZQorLyogICAgICAgICAgICBwU2RvQ29tQ29uX3AtPm1fcERhdGEgPSAoQllURSopJnBTZG9Db21Db25fcC0+bV9kd0xhc3RBYm9ydENvZGU7CisgICAgICAgICAgICBSZXQgPSBFcGxTZG9Db21TZXJ2ZXJTZW5kRnJhbWVJbnRlcm4ocFNkb0NvbUNvbl9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlTdWJpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRXBsU2RvQ29tU2VuZFR5cGVBYm9ydCk7Ki8KKwkJCWdvdG8gQWJvcnQ7CisJCX0KKwkJLy8gY29weSBkYXRhCisJCUVQTF9NRU1DUFkocFNkb0NvbUNvbl9wLT5tX3BEYXRhLCBwYlNyY0RhdGEsIHVpQnl0ZXNUb1RyYW5zZmVyKTsKKworCQkvLyB1cGRhdGUgaW50ZXJuYWwgY291bnRlcgorCQlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc2ZlcnJlZEJ5dGUgPSB1aUJ5dGVzVG9UcmFuc2ZlcjsKKwkJcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplIC09IHVpQnl0ZXNUb1RyYW5zZmVyOworCisJCS8vIHVwZGF0ZSB0YXJnZXQgcG9pbnRlcgorCQkoIC8qKEJZVEUqKSAqLyBwU2RvQ29tQ29uX3AtPm1fcERhdGEpICs9IHVpQnl0ZXNUb1RyYW5zZmVyOworCisJCS8vIHNlbmQgYWNrbm93bGVkZ2Ugd2l0aG91dCBhbnkgQ29tbWFuZCBsYXllciBkYXRhCisJCVJldCA9IEVwbFNkb0FzeVNlcVNlbmREYXRhKHBTZG9Db21Db25fcC0+bV9TZG9TZXFDb25IZGwsCisJCQkJCSAgIDAsICh0RXBsRnJhbWUgKikgTlVMTCk7CisJCWdvdG8gRXhpdDsKKwl9CisKKyAgICAgIEFib3J0OgorCWlmIChwU2RvQ29tQ29uX3AtPm1fZHdMYXN0QWJvcnRDb2RlICE9IDApIHsKKwkJLy8gc2VuZCBhYm9ydAorCQlwU2RvQ29tQ29uX3AtPm1fcERhdGEgPQorCQkgICAgKEJZVEUgKikgJiBwU2RvQ29tQ29uX3AtPm1fZHdMYXN0QWJvcnRDb2RlOworCQlSZXQgPQorCQkgICAgRXBsU2RvQ29tU2VydmVyU2VuZEZyYW1lSW50ZXJuKHBTZG9Db21Db25fcCwgdWlJbmRleCwKKwkJCQkJCSAgIHVpU3ViaW5kZXgsCisJCQkJCQkgICBrRXBsU2RvQ29tU2VuZFR5cGVBYm9ydCk7CisKKwkJLy8gcmVzZXQgYWJvcnQgY29kZQorCQlwU2RvQ29tQ29uX3AtPm1fZHdMYXN0QWJvcnRDb2RlID0gMDsKKwkJcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplID0gMDsKKwkJZ290byBFeGl0OworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgICAgICBFcGxTZG9Db21DbGllbnRTZW5kCisvLworLy8gRGVzY3JpcHRpb246ICAgIGZ1bmN0aW9uIHN0YXJ0cyBhbiBzZG8gdHJhbnNmZXIgYW4gc2VuZCBhbGwgZnVydGhlciBmcmFtZXMKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICAgICAgcFNkb0NvbUNvbl9wICAgICA9IHBvaW50ZXIgdG8gY29udHJvbCBzdHJ1Y3R1cmUgb2YgY29ubmVjdGlvbgorLy8KKy8vIFJldHVybnM6ICAgICAgICAgdEVwbEtlcm5lbCAgPSAgZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET0MpKSAhPSAwKQorc3RhdGljIHRFcGxLZXJuZWwgRXBsU2RvQ29tQ2xpZW50U2VuZCh0RXBsU2RvQ29tQ29uICogcFNkb0NvbUNvbl9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCUJZVEUgYWJGcmFtZVtFUExfTUFYX1NET19GUkFNRV9TSVpFXTsKKwl0RXBsRnJhbWUgKnBGcmFtZTsKKwl0RXBsQXN5U2RvQ29tICpwQ29tbWFuZEZyYW1lOworCXVuc2lnbmVkIGludCB1aVNpemVPZkZyYW1lOworCUJZVEUgYkZsYWdzOworCUJZVEUgKnBiUGF5bG9hZDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJcEZyYW1lID0gKHRFcGxGcmFtZSAqKSAmIGFiRnJhbWVbMF07CisKKwlFUExfTUVNU0VUKCZhYkZyYW1lWzBdLCAweDAwLCBzaXplb2YoYWJGcmFtZSkpOworCisJLy8gYnVpbGQgZ2VuZXJpYyBwYXJ0IG9mIGZyYW1lCisJLy8gZ2V0IHBvaW50ZXIgdG8gY29tbWFuZCBsYXllcnBhcnQgb2YgZnJhbWUKKwlwQ29tbWFuZEZyYW1lID0KKwkgICAgJnBGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQubV9TZG9TZXF1ZW5jZUZyYW1lLgorCSAgICBtX2xlX2FiU2RvU2VxUGF5bG9hZDsKKwlBbWlTZXRCeXRlVG9MZSgmcENvbW1hbmRGcmFtZS0+bV9sZV9iQ29tbWFuZElkLAorCQkgICAgICAgcFNkb0NvbUNvbl9wLT5tX1Nkb1NlcnZpY2VUeXBlKTsKKwlBbWlTZXRCeXRlVG9MZSgmcENvbW1hbmRGcmFtZS0+bV9sZV9iVHJhbnNhY3Rpb25JZCwKKwkJICAgICAgIHBTZG9Db21Db25fcC0+bV9iVHJhbnNhY3Rpb25JZCk7CisKKwkvLyBzZXQgc2l6ZSBjb25zdGFudCBwYXJ0IG9mIGhlYWRlcgorCXVpU2l6ZU9mRnJhbWUgPSA4OworCisJLy8gY2hlY2sgaWYgZmlyc3QgZnJhbWUgdG8gc2VuZCAtPiBjb21tYW5kIGhlYWRlciBuZWVkZWQKKwlpZiAocFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplID4gMCkgeworCQlpZiAocFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNmZXJyZWRCeXRlID09IDApIHsJLy8gc3RhcnQgU0RPIHRyYW5zZmVyCisJCQkvLyBjaGVjayBpZiBzZWdtZW50ZWQgb3IgZXhwZWRpdGVkIHRyYW5zZmVyCisJCQkvLyBvbmx5IGZvciB3cml0ZSBjb21tYW5kcworCQkJc3dpdGNoIChwU2RvQ29tQ29uX3AtPm1fU2RvU2VydmljZVR5cGUpIHsKKwkJCWNhc2Uga0VwbFNkb1NlcnZpY2VSZWFkQnlJbmRleDoKKwkJCQl7CS8vIGZpcnN0IGZyYW1lIG9mIHJlYWQgYWNjZXNzIGFsd2F5cyBleHBlZGl0ZWQKKwkJCQkJcFNkb0NvbUNvbl9wLT5tX1Nkb1RyYW5zVHlwZSA9CisJCQkJCSAgICBrRXBsU2RvVHJhbnNFeHBlZGl0ZWQ7CisJCQkJCXBiUGF5bG9hZCA9CisJCQkJCSAgICAmcENvbW1hbmRGcmFtZS0+CisJCQkJCSAgICBtX2xlX2FiQ29tbWFuZERhdGFbMF07CisJCQkJCS8vIGZpbGwgcmVzdCBvZiBoZWFkZXIKKwkJCQkJQW1pU2V0V29yZFRvTGUoJnBDb21tYW5kRnJhbWUtPgorCQkJCQkJICAgICAgIG1fbGVfd1NlZ21lbnRTaXplLCA0KTsKKworCQkJCQkvLyBjcmVhdGUgY29tbWFuZCBoZWFkZXIKKwkJCQkJQW1pU2V0V29yZFRvTGUocGJQYXlsb2FkLAorCQkJCQkJICAgICAgIChXT1JEKSBwU2RvQ29tQ29uX3AtPgorCQkJCQkJICAgICAgIG1fdWlUYXJnZXRJbmRleCk7CisJCQkJCXBiUGF5bG9hZCArPSAyOworCQkJCQlBbWlTZXRCeXRlVG9MZShwYlBheWxvYWQsCisJCQkJCQkgICAgICAgKEJZVEUpIHBTZG9Db21Db25fcC0+CisJCQkJCQkgICAgICAgbV91aVRhcmdldFN1YkluZGV4KTsKKwkJCQkJLy8gY2FsYyBzaXplCisJCQkJCXVpU2l6ZU9mRnJhbWUgKz0gNDsKKworCQkJCQkvLyBzZXQgcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNmZXJyZWRCeXRlIHRvIG9uZQorCQkJCQlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc2ZlcnJlZEJ5dGUgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWNhc2Uga0VwbFNkb1NlcnZpY2VXcml0ZUJ5SW5kZXg6CisJCQkJeworCQkJCQlpZiAocFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplID4gRVBMX1NET19NQVhfUEFZTE9BRCkgewkvLyBzZWdtZW50ZWQgdHJhbnNmZXIKKwkJCQkJCS8vIC0+IHZhcmlhYmxlIHBhcnQgb2YgaGVhZGVyIG5lZWRlZAorCQkJCQkJLy8gc2F2ZSB0aGF0IHRyYW5zZmVyIGlzIHNlZ21lbnRlZAorCQkJCQkJcFNkb0NvbUNvbl9wLT5tX1Nkb1RyYW5zVHlwZSA9CisJCQkJCQkgICAga0VwbFNkb1RyYW5zU2VnbWVudGVkOworCQkJCQkJLy8gZmlsbCB2YXJpYWJsZSBwYXJ0IG9mIGhlYWRlcgorCQkJCQkJQW1pU2V0RHdvcmRUb0xlKCZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJCQkJbV9sZV9hYkNvbW1hbmREYXRhCisJCQkJCQkJCVswXSwKKwkJCQkJCQkJcFNkb0NvbUNvbl9wLT4KKwkJCQkJCQkJbV91aVRyYW5zU2l6ZSk7CisJCQkJCQkvLyBzZXQgcG9pbnRlciB0byByZWFsIHBheWxvYWQKKwkJCQkJCXBiUGF5bG9hZCA9CisJCQkJCQkgICAgJnBDb21tYW5kRnJhbWUtPgorCQkJCQkJICAgIG1fbGVfYWJDb21tYW5kRGF0YVs0XTsKKwkJCQkJCS8vIGZpbGwgcmVzdCBvZiBoZWFkZXIKKwkJCQkJCUFtaVNldFdvcmRUb0xlKCZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJCQkgICAgICAgbV9sZV93U2VnbWVudFNpemUsCisJCQkJCQkJICAgICAgIEVQTF9TRE9fTUFYX1BBWUxPQUQpOworCQkJCQkJYkZsYWdzID0gMHgxMDsKKwkJCQkJCUFtaVNldEJ5dGVUb0xlKCZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJCQkgICAgICAgbV9sZV9iRmxhZ3MsCisJCQkJCQkJICAgICAgIGJGbGFncyk7CisJCQkJCQkvLyBjcmVhdGUgY29tbWFuZCBoZWFkZXIKKwkJCQkJCUFtaVNldFdvcmRUb0xlKHBiUGF5bG9hZCwKKwkJCQkJCQkgICAgICAgKFdPUkQpCisJCQkJCQkJICAgICAgIHBTZG9Db21Db25fcC0+CisJCQkJCQkJICAgICAgIG1fdWlUYXJnZXRJbmRleCk7CisJCQkJCQlwYlBheWxvYWQgKz0gMjsKKwkJCQkJCUFtaVNldEJ5dGVUb0xlKHBiUGF5bG9hZCwKKwkJCQkJCQkgICAgICAgKEJZVEUpCisJCQkJCQkJICAgICAgIHBTZG9Db21Db25fcC0+CisJCQkJCQkJICAgICAgIG1fdWlUYXJnZXRTdWJJbmRleCk7CisJCQkJCQkvLyBvbiBieXRlIGZvciByZXNlcnZlZAorCQkJCQkJcGJQYXlsb2FkICs9IDI7CisJCQkJCQkvLyBjYWxjIHNpemUKKwkJCQkJCXVpU2l6ZU9mRnJhbWUgKz0KKwkJCQkJCSAgICBFUExfU0RPX01BWF9QQVlMT0FEOworCisJCQkJCQkvLyBjb3B5IHBheWxvYWQKKwkJCQkJCUVQTF9NRU1DUFkocGJQYXlsb2FkLAorCQkJCQkJCSAgIHBTZG9Db21Db25fcC0+CisJCQkJCQkJICAgbV9wRGF0YSwKKwkJCQkJCQkgICAoRVBMX1NET19NQVhfUEFZTE9BRAorCQkJCQkJCSAgICAtIDgpKTsKKwkJCQkJCXBTZG9Db21Db25fcC0+bV9wRGF0YSArPQorCQkJCQkJICAgIChFUExfU0RPX01BWF9QQVlMT0FEIC0gOCk7CisJCQkJCQkvLyBjb3JyZWN0IGludGVybiBjb3VudGVyCisJCQkJCQlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemUgLT0KKwkJCQkJCSAgICAoRVBMX1NET19NQVhfUEFZTE9BRCAtIDgpOworCQkJCQkJcFNkb0NvbUNvbl9wLT4KKwkJCQkJCSAgICBtX3VpVHJhbnNmZXJyZWRCeXRlID0KKwkJCQkJCSAgICAoRVBMX1NET19NQVhfUEFZTE9BRCAtIDgpOworCisJCQkJCX0gZWxzZSB7CS8vIGV4cGVkaXRlZCB0cmFuZHNmZXIKKwkJCQkJCS8vIHNhdmUgdGhhdCB0cmFuc2ZlciBpcyBleHBlZGl0ZWQKKwkJCQkJCXBTZG9Db21Db25fcC0+bV9TZG9UcmFuc1R5cGUgPQorCQkJCQkJICAgIGtFcGxTZG9UcmFuc0V4cGVkaXRlZDsKKwkJCQkJCXBiUGF5bG9hZCA9CisJCQkJCQkgICAgJnBDb21tYW5kRnJhbWUtPgorCQkJCQkJICAgIG1fbGVfYWJDb21tYW5kRGF0YVswXTsKKworCQkJCQkJLy8gY3JlYXRlIGNvbW1hbmQgaGVhZGVyCisJCQkJCQlBbWlTZXRXb3JkVG9MZShwYlBheWxvYWQsCisJCQkJCQkJICAgICAgIChXT1JEKQorCQkJCQkJCSAgICAgICBwU2RvQ29tQ29uX3AtPgorCQkJCQkJCSAgICAgICBtX3VpVGFyZ2V0SW5kZXgpOworCQkJCQkJcGJQYXlsb2FkICs9IDI7CisJCQkJCQlBbWlTZXRCeXRlVG9MZShwYlBheWxvYWQsCisJCQkJCQkJICAgICAgIChCWVRFKQorCQkJCQkJCSAgICAgICBwU2RvQ29tQ29uX3AtPgorCQkJCQkJCSAgICAgICBtX3VpVGFyZ2V0U3ViSW5kZXgpOworCQkJCQkJLy8gKyAyIC0+IG9uZSBieXRlIGZvciBzdWJpbmRleCBhbmQgb25lIGJ5dGUgcmVzZXJ2ZWQKKwkJCQkJCXBiUGF5bG9hZCArPSAyOworCQkJCQkJLy8gY29weSBkYXRhCisJCQkJCQlFUExfTUVNQ1BZKHBiUGF5bG9hZCwKKwkJCQkJCQkgICBwU2RvQ29tQ29uX3AtPgorCQkJCQkJCSAgIG1fcERhdGEsCisJCQkJCQkJICAgcFNkb0NvbUNvbl9wLT4KKwkJCQkJCQkgICBtX3VpVHJhbnNTaXplKTsKKwkJCQkJCS8vIGNhbGMgc2l6ZQorCQkJCQkJdWlTaXplT2ZGcmFtZSArPQorCQkJCQkJICAgICg0ICsKKwkJCQkJCSAgICAgcFNkb0NvbUNvbl9wLT4KKwkJCQkJCSAgICAgbV91aVRyYW5zU2l6ZSk7CisJCQkJCQkvLyBmaWxsIHJlc3Qgb2YgaGVhZGVyCisJCQkJCQlBbWlTZXRXb3JkVG9MZSgmcENvbW1hbmRGcmFtZS0+CisJCQkJCQkJICAgICAgIG1fbGVfd1NlZ21lbnRTaXplLAorCQkJCQkJCSAgICAgICAoV09SRCkgKDQgKworCQkJCQkJCQkgICAgICAgcFNkb0NvbUNvbl9wLT4KKwkJCQkJCQkJICAgICAgIG1fdWlUcmFuc1NpemUpKTsKKworCQkJCQkJcFNkb0NvbUNvbl9wLT4KKwkJCQkJCSAgICBtX3VpVHJhbnNmZXJyZWRCeXRlID0KKwkJCQkJCSAgICBwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemU7CisJCQkJCQlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc1NpemUgPSAwOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJY2FzZSBrRXBsU2RvU2VydmljZU5JTDoKKwkJCWRlZmF1bHQ6CisJCQkJLy8gaW52YWxpZCBzZXJ2aWNlIHJlcXVlc3RlZAorCQkJCVJldCA9IGtFcGxTZG9Db21JbnZhbGlkU2VydmljZVR5cGU7CisJCQkJZ290byBFeGl0OworCQkJfQkvLyBlbmQgb2Ygc3dpdGNoKHBTZG9Db21Db25fcC0+bV9TZG9TZXJ2aWNlVHlwZSkKKwkJfSBlbHNlCQkvLyAocFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNmZXJyZWRCeXRlID4gMCkKKwkJewkJLy8gY29udGludWUgU0RPIHRyYW5zZmVyCisJCQlzd2l0Y2ggKHBTZG9Db21Db25fcC0+bV9TZG9TZXJ2aWNlVHlwZSkgeworCQkJCS8vIGZvciBleHBlZGl0ZWQgcmVhZCBpcyBub3RoaW5nIHRvIGRvCisJCQkJLy8gLT4gc2VydmVyIHNlbmRzIGRhdGEKKworCQkJY2FzZSBrRXBsU2RvU2VydmljZVdyaXRlQnlJbmRleDoKKwkJCQl7CS8vIHNlbmQgbmV4dCBmcmFtZQorCQkJCQlpZiAocFNkb0NvbUNvbl9wLT5tX1Nkb1RyYW5zVHlwZSA9PQorCQkJCQkgICAga0VwbFNkb1RyYW5zU2VnbWVudGVkKSB7CisJCQkJCQlpZiAocFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplID4gRVBMX1NET19NQVhfUEFZTE9BRCkgewkvLyBuZXh0IHNlZ21lbnQKKwkJCQkJCQlwYlBheWxvYWQgPQorCQkJCQkJCSAgICAmcENvbW1hbmRGcmFtZS0+CisJCQkJCQkJICAgIG1fbGVfYWJDb21tYW5kRGF0YQorCQkJCQkJCSAgICBbMF07CisJCQkJCQkJLy8gZmlsbCByZXN0IG9mIGhlYWRlcgorCQkJCQkJCUFtaVNldFdvcmRUb0xlCisJCQkJCQkJICAgICgmcENvbW1hbmRGcmFtZS0+CisJCQkJCQkJICAgICBtX2xlX3dTZWdtZW50U2l6ZSwKKwkJCQkJCQkgICAgIEVQTF9TRE9fTUFYX1BBWUxPQUQpOworCQkJCQkJCWJGbGFncyA9IDB4MjA7CisJCQkJCQkJQW1pU2V0Qnl0ZVRvTGUKKwkJCQkJCQkgICAgKCZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJCQkgICAgIG1fbGVfYkZsYWdzLAorCQkJCQkJCSAgICAgYkZsYWdzKTsKKwkJCQkJCQkvLyBjb3B5IGRhdGEKKwkJCQkJCQlFUExfTUVNQ1BZKHBiUGF5bG9hZCwKKwkJCQkJCQkJICAgcFNkb0NvbUNvbl9wLT4KKwkJCQkJCQkJICAgbV9wRGF0YSwKKwkJCQkJCQkJICAgRVBMX1NET19NQVhfUEFZTE9BRCk7CisJCQkJCQkJcFNkb0NvbUNvbl9wLT5tX3BEYXRhICs9CisJCQkJCQkJICAgIEVQTF9TRE9fTUFYX1BBWUxPQUQ7CisJCQkJCQkJLy8gY29ycmVjdCBpbnRlcm4gY291bnRlcgorCQkJCQkJCXBTZG9Db21Db25fcC0+CisJCQkJCQkJICAgIG1fdWlUcmFuc1NpemUgLT0KKwkJCQkJCQkgICAgRVBMX1NET19NQVhfUEFZTE9BRDsKKwkJCQkJCQlwU2RvQ29tQ29uX3AtPgorCQkJCQkJCSAgICBtX3VpVHJhbnNmZXJyZWRCeXRlCisJCQkJCQkJICAgID0KKwkJCQkJCQkgICAgRVBMX1NET19NQVhfUEFZTE9BRDsKKwkJCQkJCQkvLyBjYWxjIHNpemUKKwkJCQkJCQl1aVNpemVPZkZyYW1lICs9CisJCQkJCQkJICAgIEVQTF9TRE9fTUFYX1BBWUxPQUQ7CisKKwkJCQkJCX0gZWxzZSB7CS8vIGVuZCBvZiB0cmFuc2ZlcgorCQkJCQkJCXBiUGF5bG9hZCA9CisJCQkJCQkJICAgICZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJCQkgICAgbV9sZV9hYkNvbW1hbmREYXRhCisJCQkJCQkJICAgIFswXTsKKwkJCQkJCQkvLyBmaWxsIHJlc3Qgb2YgaGVhZGVyCisJCQkJCQkJQW1pU2V0V29yZFRvTGUKKwkJCQkJCQkgICAgKCZwQ29tbWFuZEZyYW1lLT4KKwkJCQkJCQkgICAgIG1fbGVfd1NlZ21lbnRTaXplLAorCQkJCQkJCSAgICAgKFdPUkQpCisJCQkJCQkJICAgICBwU2RvQ29tQ29uX3AtPgorCQkJCQkJCSAgICAgbV91aVRyYW5zU2l6ZSk7CisJCQkJCQkJYkZsYWdzID0gMHgzMDsKKwkJCQkJCQlBbWlTZXRCeXRlVG9MZQorCQkJCQkJCSAgICAoJnBDb21tYW5kRnJhbWUtPgorCQkJCQkJCSAgICAgbV9sZV9iRmxhZ3MsCisJCQkJCQkJICAgICBiRmxhZ3MpOworCQkJCQkJCS8vIGNvcHkgZGF0YQorCQkJCQkJCUVQTF9NRU1DUFkocGJQYXlsb2FkLAorCQkJCQkJCQkgICBwU2RvQ29tQ29uX3AtPgorCQkJCQkJCQkgICBtX3BEYXRhLAorCQkJCQkJCQkgICBwU2RvQ29tQ29uX3AtPgorCQkJCQkJCQkgICBtX3VpVHJhbnNTaXplKTsKKwkJCQkJCQlwU2RvQ29tQ29uX3AtPm1fcERhdGEgKz0KKwkJCQkJCQkgICAgcFNkb0NvbUNvbl9wLT4KKwkJCQkJCQkgICAgbV91aVRyYW5zU2l6ZTsKKwkJCQkJCQkvLyBjYWxjIHNpemUKKwkJCQkJCQl1aVNpemVPZkZyYW1lICs9CisJCQkJCQkJICAgIHBTZG9Db21Db25fcC0+CisJCQkJCQkJICAgIG1fdWlUcmFuc1NpemU7CisJCQkJCQkJLy8gY29ycmVjdCBpbnRlcm4gY291bnRlcgorCQkJCQkJCXBTZG9Db21Db25fcC0+CisJCQkJCQkJICAgIG1fdWlUcmFuc1NpemUgPSAwOworCQkJCQkJCXBTZG9Db21Db25fcC0+CisJCQkJCQkJICAgIG1fdWlUcmFuc2ZlcnJlZEJ5dGUKKwkJCQkJCQkgICAgPQorCQkJCQkJCSAgICBwU2RvQ29tQ29uX3AtPgorCQkJCQkJCSAgICBtX3VpVHJhbnNTaXplOworCisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQlnb3RvIEV4aXQ7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCWdvdG8gRXhpdDsKKwkJCQl9CisJCQl9CS8vIGVuZCBvZiBzd2l0Y2gocFNkb0NvbUNvbl9wLT5tX1Nkb1NlcnZpY2VUeXBlKQorCQl9CisJfSBlbHNlIHsKKwkJZ290byBFeGl0OworCX0KKworCS8vIGNhbGwgc2VuZCBmdW5jdGlvbiBvZiBsb3dlciBsYXllcgorCXN3aXRjaCAocFNkb0NvbUNvbl9wLT5tX1Nkb1Byb3RUeXBlKSB7CisJY2FzZSBrRXBsU2RvVHlwZUFzbmQ6CisJY2FzZSBrRXBsU2RvVHlwZVVkcDoKKwkJeworCQkJUmV0ID0gRXBsU2RvQXN5U2VxU2VuZERhdGEocFNkb0NvbUNvbl9wLT5tX1Nkb1NlcUNvbkhkbCwKKwkJCQkJCSAgIHVpU2l6ZU9mRnJhbWUsIHBGcmFtZSk7CisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJeworCQkJUmV0ID0ga0VwbFNkb0NvbVVuc3VwcG9ydGVkUHJvdDsKKwkJfQorCX0JCQkvLyBlbmQgb2Ygc3dpdGNoKHBTZG9Db21Db25fcC0+bV9TZG9Qcm90VHlwZSkKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworCit9CisjZW5kaWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgICAgICBFcGxTZG9Db21DbGllbnRQcm9jZXNzRnJhbWUKKy8vCisvLyBEZXNjcmlwdGlvbjogICAgZnVuY3Rpb24gcHJvY2VzcyBhIHJlY2VpdmVkIGZyYW1lCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgICAgIFNkb0NvbUNvbl9wICAgICAgPSBjb25uZWN0aW9uIGhhbmRsZQorLy8gICAgICAgICAgICAgICAgICBwQXN5U2RvQ29tX3AgICAgID0gcG9pbnRlciB0byBmcmFtZSB0byBwcm9jZXNzCisvLworLy8gUmV0dXJuczogICAgICAgICB0RXBsS2VybmVsICA9ICBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Db21DbGllbnRQcm9jZXNzRnJhbWUodEVwbFNkb0NvbUNvbkhkbCBTZG9Db21Db25fcCwKKwkJCQkJICAgICAgdEVwbEFzeVNkb0NvbSAqIHBBc3lTZG9Db21fcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwlCWVRFIGJCdWZmZXI7CisJdW5zaWduZWQgaW50IHVpQnVmZmVyOworCXVuc2lnbmVkIGludCB1aURhdGFTaXplOworCXVuc2lnbmVkIGxvbmcgdWxCdWZmZXI7CisJdEVwbFNkb0NvbUNvbiAqcFNkb0NvbUNvbjsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gZ2V0IHBvaW50ZXIgdG8gY29udHJvbCBzdHJ1Y3R1cmUKKwlwU2RvQ29tQ29uID0gJlNkb0NvbUluc3RhbmNlX2cubV9TZG9Db21Db25bU2RvQ29tQ29uX3BdOworCisJLy8gY2hlY2sgaWYgdHJhbnNhY3Rpb24gSWQgZml0CisJYkJ1ZmZlciA9IEFtaUdldEJ5dGVGcm9tTGUoJnBBc3lTZG9Db21fcC0+bV9sZV9iVHJhbnNhY3Rpb25JZCk7CisJaWYgKHBTZG9Db21Db24tPm1fYlRyYW5zYWN0aW9uSWQgIT0gYkJ1ZmZlcikgeworCQkvLyBpbmNvcnJlY3QgdHJhbnNhY3Rpb24gaWQKKworCQkvLyBpZiBydW5uaW5nIHRyYW5zZmVyCisJCWlmICgocFNkb0NvbUNvbi0+bV91aVRyYW5zZmVycmVkQnl0ZSAhPSAwKQorCQkgICAgJiYgKHBTZG9Db21Db24tPm1fdWlUcmFuc1NpemUgIT0gMCkpIHsKKwkJCXBTZG9Db21Db24tPm1fZHdMYXN0QWJvcnRDb2RlID0gRVBMX1NET0FDX0dFTkVSQUxfRVJST1I7CisJCQkvLyAtPiBzZW5kIGFib3J0CisJCQlFcGxTZG9Db21DbGllbnRTZW5kQWJvcnQocFNkb0NvbUNvbiwKKwkJCQkJCSBwU2RvQ29tQ29uLT5tX2R3TGFzdEFib3J0Q29kZSk7CisJCQkvLyBjYWxsIGNhbGxiYWNrIG9mIGFwcGxpY2F0aW9uCisJCQlSZXQgPQorCQkJICAgIEVwbFNkb0NvbVRyYW5zZmVyRmluaXNoZWQoU2RvQ29tQ29uX3AsIHBTZG9Db21Db24sCisJCQkJCQkgICAgICBrRXBsU2RvQ29tVHJhbnNmZXJUeEFib3J0ZWQpOworCQl9CisKKwl9IGVsc2UgewkJLy8gY2hlY2sgaWYgY29ycmVjdCBjb21tYW5kCisJCWJCdWZmZXIgPSBBbWlHZXRCeXRlRnJvbUxlKCZwQXN5U2RvQ29tX3AtPm1fbGVfYkNvbW1hbmRJZCk7CisJCWlmIChwU2RvQ29tQ29uLT5tX1Nkb1NlcnZpY2VUeXBlICE9IGJCdWZmZXIpIHsKKwkJCS8vIGluY29ycmVjdCBjb21tYW5kCisJCQkvLyBpZiBydW5uaW5nIHRyYW5zZmVyCisJCQlpZiAoKHBTZG9Db21Db24tPm1fdWlUcmFuc2ZlcnJlZEJ5dGUgIT0gMCkKKwkJCSAgICAmJiAocFNkb0NvbUNvbi0+bV91aVRyYW5zU2l6ZSAhPSAwKSkgeworCQkJCXBTZG9Db21Db24tPm1fZHdMYXN0QWJvcnRDb2RlID0KKwkJCQkgICAgRVBMX1NET0FDX0dFTkVSQUxfRVJST1I7CisJCQkJLy8gLT4gc2VuZCBhYm9ydAorCQkJCUVwbFNkb0NvbUNsaWVudFNlbmRBYm9ydChwU2RvQ29tQ29uLAorCQkJCQkJCSBwU2RvQ29tQ29uLT4KKwkJCQkJCQkgbV9kd0xhc3RBYm9ydENvZGUpOworCQkJCS8vIGNhbGwgY2FsbGJhY2sgb2YgYXBwbGljYXRpb24KKwkJCQlSZXQgPQorCQkJCSAgICBFcGxTZG9Db21UcmFuc2ZlckZpbmlzaGVkKFNkb0NvbUNvbl9wLAorCQkJCQkJCSAgICAgIHBTZG9Db21Db24sCisJCQkJCQkJICAgICAga0VwbFNkb0NvbVRyYW5zZmVyVHhBYm9ydGVkKTsKKwkJCX0KKworCQl9IGVsc2UgewkvLyBzd2l0Y2ggb24gY29tbWFuZAorCQkJc3dpdGNoIChwU2RvQ29tQ29uLT5tX1Nkb1NlcnZpY2VUeXBlKSB7CisJCQljYXNlIGtFcGxTZG9TZXJ2aWNlV3JpdGVCeUluZGV4OgorCQkJCXsJLy8gY2hlY2sgaWYgY29uZmlybWF0aW9uIGZyb20gc2VydmVyCisJCQkJCS8vIG5vdGhpbmcgbW9yZSB0byBkbworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWNhc2Uga0VwbFNkb1NlcnZpY2VSZWFkQnlJbmRleDoKKwkJCQl7CS8vIGNoZWNrIGlmIGl0IGlzIGFuIHNlZ21lbnRlZCBvciBhbiBleHBlZGl0ZWQgdHJhbnNmZXIKKwkJCQkJYkJ1ZmZlciA9CisJCQkJCSAgICBBbWlHZXRCeXRlRnJvbUxlKCZwQXN5U2RvQ29tX3AtPgorCQkJCQkJCSAgICAgbV9sZV9iRmxhZ3MpOworCQkJCQkvLyBtYXNrIHVuaW50ZXJlc3N0aW5nIGJpdHMKKwkJCQkJYkJ1ZmZlciAmPSAweDMwOworCQkJCQlzd2l0Y2ggKGJCdWZmZXIpIHsKKwkJCQkJCS8vIGV4cGVkaXRlZCB0cmFuc2ZlcgorCQkJCQljYXNlIDB4MDA6CisJCQkJCQl7CisJCQkJCQkJLy8gY2hlY2sgc2l6ZSBvZiBidWZmZXIKKwkJCQkJCQl1aUJ1ZmZlciA9CisJCQkJCQkJICAgIEFtaUdldFdvcmRGcm9tTGUKKwkJCQkJCQkgICAgKCZwQXN5U2RvQ29tX3AtPgorCQkJCQkJCSAgICAgbV9sZV93U2VnbWVudFNpemUpOworCQkJCQkJCWlmICh1aUJ1ZmZlciA+IHBTZG9Db21Db24tPm1fdWlUcmFuc1NpemUpIHsJLy8gYnVmZmVyIHByb3ZpZGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBpcyB0byBzbWFsbAorCQkJCQkJCQkvLyBjb3B5IG9ubHkgYSBwYXJ0CisJCQkJCQkJCXVpRGF0YVNpemUgPQorCQkJCQkJCQkgICAgcFNkb0NvbUNvbi0+CisJCQkJCQkJCSAgICBtX3VpVHJhbnNTaXplOworCQkJCQkJCX0gZWxzZSB7CS8vIGJ1ZmZlciBmaXRzCisJCQkJCQkJCXVpRGF0YVNpemUgPQorCQkJCQkJCQkgICAgdWlCdWZmZXI7CisJCQkJCQkJfQorCisJCQkJCQkJLy8gY29weSBkYXRhCisJCQkJCQkJRVBMX01FTUNQWShwU2RvQ29tQ29uLT4KKwkJCQkJCQkJICAgbV9wRGF0YSwKKwkJCQkJCQkJICAgJnBBc3lTZG9Db21fcC0+CisJCQkJCQkJCSAgIG1fbGVfYWJDb21tYW5kRGF0YQorCQkJCQkJCQkgICBbMF0sCisJCQkJCQkJCSAgIHVpRGF0YVNpemUpOworCisJCQkJCQkJLy8gY29ycmVjdCBjb3VudGVyCisJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJICAgIG1fdWlUcmFuc1NpemUgPSAwOworCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX3VpVHJhbnNmZXJyZWRCeXRlCisJCQkJCQkJICAgID0gdWlEYXRhU2l6ZTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKworCQkJCQkJLy8gc3RhcnQgb2YgYSBzZWdtZW50ZWQgdHJhbnNmZXIKKwkJCQkJY2FzZSAweDEwOgorCQkJCQkJewkvLyBnZXQgdG90YWwgc2l6ZSBvZiB0cmFuc2ZlcgorCQkJCQkJCXVsQnVmZmVyID0KKwkJCQkJCQkgICAgQW1pR2V0RHdvcmRGcm9tTGUKKwkJCQkJCQkgICAgKCZwQXN5U2RvQ29tX3AtPgorCQkJCQkJCSAgICAgbV9sZV9hYkNvbW1hbmREYXRhCisJCQkJCQkJICAgICBbMF0pOworCQkJCQkJCWlmICh1bEJ1ZmZlciA8PSBwU2RvQ29tQ29uLT5tX3VpVHJhbnNTaXplKSB7CS8vIGJ1ZmZlciBmaXQKKwkJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJCSAgICBtX3VpVHJhbnNTaXplCisJCQkJCQkJCSAgICA9CisJCQkJCQkJCSAgICAodW5zaWduZWQKKwkJCQkJCQkJICAgICBpbnQpCisJCQkJCQkJCSAgICB1bEJ1ZmZlcjsKKwkJCQkJCQl9IGVsc2UgewkvLyBidWZmZXIgdG8gc21hbGwKKwkJCQkJCQkJLy8gc2VuZCBhYm9ydAorCQkJCQkJCQlwU2RvQ29tQ29uLT4KKwkJCQkJCQkJICAgIG1fZHdMYXN0QWJvcnRDb2RlCisJCQkJCQkJCSAgICA9CisJCQkJCQkJCSAgICBFUExfU0RPQUNfREFUQV9UWVBFX0xFTkdUSF9UT09fSElHSDsKKwkJCQkJCQkJLy8gLT4gc2VuZCBhYm9ydAorCQkJCQkJCQlFcGxTZG9Db21DbGllbnRTZW5kQWJvcnQKKwkJCQkJCQkJICAgIChwU2RvQ29tQ29uLAorCQkJCQkJCQkgICAgIHBTZG9Db21Db24tPgorCQkJCQkJCQkgICAgIG1fZHdMYXN0QWJvcnRDb2RlKTsKKwkJCQkJCQkJLy8gY2FsbCBjYWxsYmFjayBvZiBhcHBsaWNhdGlvbgorCQkJCQkJCQlSZXQgPQorCQkJCQkJCQkgICAgRXBsU2RvQ29tVHJhbnNmZXJGaW5pc2hlZAorCQkJCQkJCQkgICAgKFNkb0NvbUNvbl9wLAorCQkJCQkJCQkgICAgIHBTZG9Db21Db24sCisJCQkJCQkJCSAgICAga0VwbFNkb0NvbVRyYW5zZmVyUnhBYm9ydGVkKTsKKwkJCQkJCQkJZ290byBFeGl0OworCQkJCQkJCX0KKworCQkJCQkJCS8vIGdldCBzZWdtZW50IHNpemUKKwkJCQkJCQkvLyBjaGVjayBzaXplIG9mIGJ1ZmZlcgorCQkJCQkJCXVpQnVmZmVyID0KKwkJCQkJCQkgICAgQW1pR2V0V29yZEZyb21MZQorCQkJCQkJCSAgICAoJnBBc3lTZG9Db21fcC0+CisJCQkJCQkJICAgICBtX2xlX3dTZWdtZW50U2l6ZSk7CisJCQkJCQkJLy8gc3VidHJhY3Qgc2l6ZSBvZiB2YWlhYmxlIGhlYWRlciBmcm9tIGRhdGFzaXplCisJCQkJCQkJdWlCdWZmZXIgLT0gNDsKKwkJCQkJCQkvLyBjb3B5IGRhdGEKKwkJCQkJCQlFUExfTUVNQ1BZKHBTZG9Db21Db24tPgorCQkJCQkJCQkgICBtX3BEYXRhLAorCQkJCQkJCQkgICAmcEFzeVNkb0NvbV9wLT4KKwkJCQkJCQkJICAgbV9sZV9hYkNvbW1hbmREYXRhCisJCQkJCQkJCSAgIFs0XSwKKwkJCQkJCQkJICAgdWlCdWZmZXIpOworCisJCQkJCQkJLy8gY29ycmVjdCBjb3VudGVyIGFuIHBvaW50ZXIKKwkJCQkJCQlwU2RvQ29tQ29uLT5tX3BEYXRhICs9CisJCQkJCQkJICAgIHVpQnVmZmVyOworCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX3VpVHJhbnNmZXJyZWRCeXRlCisJCQkJCQkJICAgICs9IHVpQnVmZmVyOworCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX3VpVHJhbnNTaXplIC09CisJCQkJCQkJICAgIHVpQnVmZmVyOworCisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisKKwkJCQkJCS8vIHNlZ21lbnQKKwkJCQkJY2FzZSAweDIwOgorCQkJCQkJeworCQkJCQkJCS8vIGdldCBzZWdtZW50IHNpemUKKwkJCQkJCQkvLyBjaGVjayBzaXplIG9mIGJ1ZmZlcgorCQkJCQkJCXVpQnVmZmVyID0KKwkJCQkJCQkgICAgQW1pR2V0V29yZEZyb21MZQorCQkJCQkJCSAgICAoJnBBc3lTZG9Db21fcC0+CisJCQkJCQkJICAgICBtX2xlX3dTZWdtZW50U2l6ZSk7CisJCQkJCQkJLy8gY2hlY2sgaWYgZGF0YSB0byBjb3B5IGZpdCB0byBidWZmZXIKKwkJCQkJCQlpZiAodWlCdWZmZXIgPj0gcFNkb0NvbUNvbi0+bV91aVRyYW5zU2l6ZSkgewkvLyB0byBtdWNoIGRhdGEKKwkJCQkJCQkJdWlCdWZmZXIgPQorCQkJCQkJCQkgICAgKHBTZG9Db21Db24tPgorCQkJCQkJCQkgICAgIG1fdWlUcmFuc1NpemUKKwkJCQkJCQkJICAgICAtIDEpOworCQkJCQkJCX0KKwkJCQkJCQkvLyBjb3B5IGRhdGEKKwkJCQkJCQlFUExfTUVNQ1BZKHBTZG9Db21Db24tPgorCQkJCQkJCQkgICBtX3BEYXRhLAorCQkJCQkJCQkgICAmcEFzeVNkb0NvbV9wLT4KKwkJCQkJCQkJICAgbV9sZV9hYkNvbW1hbmREYXRhCisJCQkJCQkJCSAgIFswXSwKKwkJCQkJCQkJICAgdWlCdWZmZXIpOworCisJCQkJCQkJLy8gY29ycmVjdCBjb3VudGVyIGFuIHBvaW50ZXIKKwkJCQkJCQlwU2RvQ29tQ29uLT5tX3BEYXRhICs9CisJCQkJCQkJICAgIHVpQnVmZmVyOworCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX3VpVHJhbnNmZXJyZWRCeXRlCisJCQkJCQkJICAgICs9IHVpQnVmZmVyOworCQkJCQkJCXBTZG9Db21Db24tPgorCQkJCQkJCSAgICBtX3VpVHJhbnNTaXplIC09CisJCQkJCQkJICAgIHVpQnVmZmVyOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCisJCQkJCQkvLyBsYXN0IHNlZ21lbnQKKwkJCQkJY2FzZSAweDMwOgorCQkJCQkJeworCQkJCQkJCS8vIGdldCBzZWdtZW50IHNpemUKKwkJCQkJCQkvLyBjaGVjayBzaXplIG9mIGJ1ZmZlcgorCQkJCQkJCXVpQnVmZmVyID0KKwkJCQkJCQkgICAgQW1pR2V0V29yZEZyb21MZQorCQkJCQkJCSAgICAoJnBBc3lTZG9Db21fcC0+CisJCQkJCQkJICAgICBtX2xlX3dTZWdtZW50U2l6ZSk7CisJCQkJCQkJLy8gY2hlY2sgaWYgZGF0YSB0byBjb3B5IGZpdCB0byBidWZmZXIKKwkJCQkJCQlpZiAodWlCdWZmZXIgPiBwU2RvQ29tQ29uLT5tX3VpVHJhbnNTaXplKSB7CS8vIHRvIG11Y2ggZGF0YQorCQkJCQkJCQl1aUJ1ZmZlciA9CisJCQkJCQkJCSAgICAocFNkb0NvbUNvbi0+CisJCQkJCQkJCSAgICAgbV91aVRyYW5zU2l6ZQorCQkJCQkJCQkgICAgIC0gMSk7CisJCQkJCQkJfQorCQkJCQkJCS8vIGNvcHkgZGF0YQorCQkJCQkJCUVQTF9NRU1DUFkocFNkb0NvbUNvbi0+CisJCQkJCQkJCSAgIG1fcERhdGEsCisJCQkJCQkJCSAgICZwQXN5U2RvQ29tX3AtPgorCQkJCQkJCQkgICBtX2xlX2FiQ29tbWFuZERhdGEKKwkJCQkJCQkJICAgWzBdLAorCQkJCQkJCQkgICB1aUJ1ZmZlcik7CisKKwkJCQkJCQkvLyBjb3JyZWN0IGNvdW50ZXIgYW4gcG9pbnRlcgorCQkJCQkJCXBTZG9Db21Db24tPm1fcERhdGEgKz0KKwkJCQkJCQkgICAgdWlCdWZmZXI7CisJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJICAgIG1fdWlUcmFuc2ZlcnJlZEJ5dGUKKwkJCQkJCQkgICAgKz0gdWlCdWZmZXI7CisJCQkJCQkJcFNkb0NvbUNvbi0+CisJCQkJCQkJICAgIG1fdWlUcmFuc1NpemUgPSAwOworCisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0JLy8gZW5kIG9mIHN3aXRjaChiQnVmZmVyICYgMHgzMCkKKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWNhc2Uga0VwbFNkb1NlcnZpY2VOSUw6CisJCQlkZWZhdWx0OgorCQkJCS8vIGludmFsaWQgc2VydmljZSByZXF1ZXN0ZWQKKwkJCQkvLyAkJCQgZC5rLiBXaGF0IHNob3VsZCB3ZSBkbz8KKwkJCQlicmVhazsKKwkJCX0JLy8gZW5kIG9mIHN3aXRjaChwU2RvQ29tQ29uLT5tX1Nkb1NlcnZpY2VUeXBlKQorCQl9CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvQ29tQ2xpZW50U2VuZEFib3J0CisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIHNlbmQgYSBhYm9ydCBtZXNzYWdlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFNkb0NvbUNvbl9wICAgICA9IHBvaW50ZXIgdG8gY29udHJvbCBzdHJ1Y3R1cmUgb2YgY29ubmVjdGlvbgorLy8gICAgICAgICAgICAgIGR3QWJvcnRDb2RlX3AgICAgPSBTZG8gYWJvcnQgY29kZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9ICBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Db21DbGllbnRTZW5kQWJvcnQodEVwbFNkb0NvbUNvbiAqIHBTZG9Db21Db25fcCwKKwkJCQkJICAgRFdPUkQgZHdBYm9ydENvZGVfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwlCWVRFIGFiRnJhbWVbRVBMX01BWF9TRE9fRlJBTUVfU0laRV07CisJdEVwbEZyYW1lICpwRnJhbWU7CisJdEVwbEFzeVNkb0NvbSAqcENvbW1hbmRGcmFtZTsKKwl1bnNpZ25lZCBpbnQgdWlTaXplT2ZGcmFtZTsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJcEZyYW1lID0gKHRFcGxGcmFtZSAqKSAmIGFiRnJhbWVbMF07CisKKwlFUExfTUVNU0VUKCZhYkZyYW1lWzBdLCAweDAwLCBzaXplb2YoYWJGcmFtZSkpOworCisJLy8gYnVpbGQgZ2VuZXJpYyBwYXJ0IG9mIGZyYW1lCisJLy8gZ2V0IHBvaW50ZXIgdG8gY29tbWFuZCBsYXllcnBhcnQgb2YgZnJhbWUKKwlwQ29tbWFuZEZyYW1lID0KKwkgICAgJnBGcmFtZS0+bV9EYXRhLm1fQXNuZC5tX1BheWxvYWQubV9TZG9TZXF1ZW5jZUZyYW1lLgorCSAgICBtX2xlX2FiU2RvU2VxUGF5bG9hZDsKKwlBbWlTZXRCeXRlVG9MZSgmcENvbW1hbmRGcmFtZS0+bV9sZV9iQ29tbWFuZElkLAorCQkgICAgICAgcFNkb0NvbUNvbl9wLT5tX1Nkb1NlcnZpY2VUeXBlKTsKKwlBbWlTZXRCeXRlVG9MZSgmcENvbW1hbmRGcmFtZS0+bV9sZV9iVHJhbnNhY3Rpb25JZCwKKwkJICAgICAgIHBTZG9Db21Db25fcC0+bV9iVHJhbnNhY3Rpb25JZCk7CisKKwl1aVNpemVPZkZyYW1lID0gODsKKworCS8vIHNldCByZXNwb25zZSBhbmQgYWJvcnQgZmxhZworCXBDb21tYW5kRnJhbWUtPm1fbGVfYkZsYWdzIHw9IDB4NDA7CisKKwkvLyBjb3B5IGFib3J0Y29kZSB0byBmcmFtZQorCUFtaVNldER3b3JkVG9MZSgmcENvbW1hbmRGcmFtZS0+bV9sZV9hYkNvbW1hbmREYXRhWzBdLCBkd0Fib3J0Q29kZV9wKTsKKworCS8vIHNldCBzaXplIG9mIHNlZ21lbnQKKwlBbWlTZXRXb3JkVG9MZSgmcENvbW1hbmRGcmFtZS0+bV9sZV93U2VnbWVudFNpemUsIHNpemVvZihEV09SRCkpOworCisJLy8gdXBkYXRlIGNvdW50ZXIKKwlwU2RvQ29tQ29uX3AtPm1fdWlUcmFuc2ZlcnJlZEJ5dGUgPSBzaXplb2YoRFdPUkQpOworCXBTZG9Db21Db25fcC0+bV91aVRyYW5zU2l6ZSA9IDA7CisKKwkvLyBjYWxjIGZyYW1lc2l6ZQorCXVpU2l6ZU9mRnJhbWUgKz0gc2l6ZW9mKERXT1JEKTsKKworCS8vIHNhdmUgYWJvcnQgY29kZQorCXBTZG9Db21Db25fcC0+bV9kd0xhc3RBYm9ydENvZGUgPSBkd0Fib3J0Q29kZV9wOworCisJLy8gY2FsbCBzZW5kIGZ1bmN0aW9uIG9mIGxvd2VyIGxheWVyCisJc3dpdGNoIChwU2RvQ29tQ29uX3AtPm1fU2RvUHJvdFR5cGUpIHsKKwljYXNlIGtFcGxTZG9UeXBlQXNuZDoKKwljYXNlIGtFcGxTZG9UeXBlVWRwOgorCQl7CisJCQlSZXQgPSBFcGxTZG9Bc3lTZXFTZW5kRGF0YShwU2RvQ29tQ29uX3AtPm1fU2RvU2VxQ29uSGRsLAorCQkJCQkJICAgdWlTaXplT2ZGcmFtZSwgcEZyYW1lKTsKKwkJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQl7CisJCQlSZXQgPSBrRXBsU2RvQ29tVW5zdXBwb3J0ZWRQcm90OworCQl9CisJfQkJCS8vIGVuZCBvZiBzd2l0Y2gocFNkb0NvbUNvbl9wLT5tX1Nkb1Byb3RUeXBlKQorCisJcmV0dXJuIFJldDsKK30KKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9Db21UcmFuc2ZlckZpbmlzaGVkCisvLworLy8gRGVzY3JpcHRpb246IGNhbGxzIGNhbGxiYWNrIGZ1bmN0aW9uIG9mIGFwcGxpY2F0aW9uIGlmIGF2YWlsYWJsZQorLy8gICAgICAgICAgICAgIGFuZCBjbGVhcnMgZW50cnkgaW4gY29udHJvbCBzdHJ1Y3R1cmUKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFNkb0NvbUNvbl9wICAgICA9IHBvaW50ZXIgdG8gY29udHJvbCBzdHJ1Y3R1cmUgb2YgY29ubmVjdGlvbgorLy8gICAgICAgICAgICAgIFNkb0NvbUNvblN0YXRlX3AgPSBzdGF0ZSBvZiBTRE8gdHJhbnNmZXIKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSAgZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdEVwbEtlcm5lbCBFcGxTZG9Db21UcmFuc2ZlckZpbmlzaGVkKHRFcGxTZG9Db21Db25IZGwgU2RvQ29tQ29uX3AsCisJCQkJCSAgICB0RXBsU2RvQ29tQ29uICogcFNkb0NvbUNvbl9wLAorCQkJCQkgICAgdEVwbFNkb0NvbUNvblN0YXRlIFNkb0NvbUNvblN0YXRlX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCWlmIChwU2RvQ29tQ29uX3AtPm1fcGZuVHJhbnNmZXJGaW5pc2hlZCAhPSBOVUxMKSB7CisJCXRFcGxTZG9GaW5pc2hlZENiIHBmblRyYW5zZmVyRmluaXNoZWQ7CisJCXRFcGxTZG9Db21GaW5pc2hlZCBTZG9Db21GaW5pc2hlZDsKKworCQlTZG9Db21GaW5pc2hlZC5tX3BVc2VyQXJnID0gcFNkb0NvbUNvbl9wLT5tX3BVc2VyQXJnOworCQlTZG9Db21GaW5pc2hlZC5tX3VpTm9kZUlkID0gcFNkb0NvbUNvbl9wLT5tX3VpTm9kZUlkOworCQlTZG9Db21GaW5pc2hlZC5tX3VpVGFyZ2V0SW5kZXggPSBwU2RvQ29tQ29uX3AtPm1fdWlUYXJnZXRJbmRleDsKKwkJU2RvQ29tRmluaXNoZWQubV91aVRhcmdldFN1YkluZGV4ID0KKwkJICAgIHBTZG9Db21Db25fcC0+bV91aVRhcmdldFN1YkluZGV4OworCQlTZG9Db21GaW5pc2hlZC5tX3VpVHJhbnNmZXJyZWRCeXRlID0KKwkJICAgIHBTZG9Db21Db25fcC0+bV91aVRyYW5zZmVycmVkQnl0ZTsKKwkJU2RvQ29tRmluaXNoZWQubV9kd0Fib3J0Q29kZSA9IHBTZG9Db21Db25fcC0+bV9kd0xhc3RBYm9ydENvZGU7CisJCVNkb0NvbUZpbmlzaGVkLm1fU2RvQ29tQ29uSGRsID0gU2RvQ29tQ29uX3A7CisJCVNkb0NvbUZpbmlzaGVkLm1fU2RvQ29tQ29uU3RhdGUgPSBTZG9Db21Db25TdGF0ZV9wOworCQlpZiAocFNkb0NvbUNvbl9wLT5tX1Nkb1NlcnZpY2VUeXBlID09CisJCSAgICBrRXBsU2RvU2VydmljZVdyaXRlQnlJbmRleCkgeworCQkJU2RvQ29tRmluaXNoZWQubV9TZG9BY2Nlc3NUeXBlID0ga0VwbFNkb0FjY2Vzc1R5cGVXcml0ZTsKKwkJfSBlbHNlIHsKKwkJCVNkb0NvbUZpbmlzaGVkLm1fU2RvQWNjZXNzVHlwZSA9IGtFcGxTZG9BY2Nlc3NUeXBlUmVhZDsKKwkJfQorCisJCS8vIHJlc2V0IHRyYW5zZmVyIHN0YXRlIHNvIHRoaXMgaGFuZGxlIGlzIG5vdCBidXN5IGFueW1vcmUKKwkJcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNmZXJyZWRCeXRlID0gMDsKKwkJcFNkb0NvbUNvbl9wLT5tX3VpVHJhbnNTaXplID0gMDsKKworCQlwZm5UcmFuc2ZlckZpbmlzaGVkID0gcFNkb0NvbUNvbl9wLT5tX3BmblRyYW5zZmVyRmluaXNoZWQ7CisJCS8vIGRlbGV0ZSBmdW5jdGlvbiBwb2ludGVyIHRvIGluZm9ybSBhcHBsaWNhdGlvbiBvbmx5IG9uY2UgZm9yIGVhY2ggdHJhbnNmZXIKKwkJcFNkb0NvbUNvbl9wLT5tX3BmblRyYW5zZmVyRmluaXNoZWQgPSBOVUxMOworCisJCS8vIGNhbGwgYXBwbGljYXRpb24ncyBjYWxsYmFjayBmdW5jdGlvbgorCQlwZm5UcmFuc2ZlckZpbmlzaGVkKCZTZG9Db21GaW5pc2hlZCk7CisKKwl9CisKKwlyZXR1cm4gUmV0OworfQorCisvLyBFT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsU2RvVWRwdS5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxTZG9VZHB1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU1MjIzMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsU2RvVWRwdS5jCkBAIC0wLDAgKzEsNzkwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgc291cmNlIGZpbGUgZm9yIFNETy9VRFAtUHJvdG9jb2xhYnN0cmFjdGlvbmxheWVyIG1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbFNkb1VkcHUuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzI2IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ1c2VyL0VwbFNkb1VkcHUuaCIKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPX1VEUCkpICE9IDApCisKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfTElOVVhfKSAmJiBkZWZpbmVkKF9fS0VSTkVMX18pCisjaW5jbHVkZSAiU29ja2V0TGludXhLZXJuZWwuaCIKKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBFUExfU0RPX01BWF9DT05ORUNUSU9OX1VEUAorI2RlZmluZSBFUExfU0RPX01BWF9DT05ORUNUSU9OX1VEUCAgNQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgbV91bElwQWRkcjsJLy8gaW4gbmV0d29yayBieXRlIG9yZGVyCisJdW5zaWduZWQgaW50IG1fdWlQb3J0OwkvLyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIKKworfSB0RXBsU2RvVWRwQ29uOworCisvLyBpbnN0YW5jZSB0YWJsZQordHlwZWRlZiBzdHJ1Y3QgeworCXRFcGxTZG9VZHBDb24gbV9hU2RvQWJzVWRwQ29ubmVjdGlvbltFUExfU0RPX01BWF9DT05ORUNUSU9OX1VEUF07CisJdEVwbFNlcXVMYXllclJlY2VpdmVDYiBtX2ZwU2RvQXN5U2VxQ2I7CisJU09DS0VUIG1fVWRwU29ja2V0OworCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1dJTjMyXykKKwlIQU5ETEUgbV9UaHJlYWRIYW5kbGU7CisJTFBDUklUSUNBTF9TRUNUSU9OIG1fcENyaXRpY2FsU2VjdGlvbjsKKwlDUklUSUNBTF9TRUNUSU9OIG1fQ3JpdGljYWxTZWN0aW9uOworCisjZWxpZiAoVEFSR0VUX1NZU1RFTSA9PSBfTElOVVhfKSAmJiBkZWZpbmVkKF9fS0VSTkVMX18pCisJc3RydWN0IGNvbXBsZXRpb24gbV9Db21wbGV0aW9uVWRwVGhyZWFkOworCWludCBtX1RocmVhZEhhbmRsZTsKKwlpbnQgbV9pVGVybWluYXRlVGhyZWFkOworI2VuZGlmCisKK30gdEVwbFNkb1VkcEluc3RhbmNlOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbFNkb1VkcEluc3RhbmNlIFNkb1VkcEluc3RhbmNlX2c7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1dJTjMyXykKK3N0YXRpYyBEV09SRCBQVUJMSUMgRXBsU2RvVWRwVGhyZWFkKExQVk9JRCBscFBhcmFtZXRlcik7CisKKyNlbGlmIChUQVJHRVRfU1lTVEVNID09IF9MSU5VWF8pICYmIGRlZmluZWQoX19LRVJORUxfXykKK3N0YXRpYyBpbnQgRXBsU2RvVWRwVGhyZWFkKHZvaWQgKnBBcmdfcCk7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgQyBMIEEgUyBTICA8RVBMLVNETy1VRFAtTGF5ZXI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vCisvLyBEZXNjcmlwdGlvbjogUHJvdG9jb2xhYnN0cmFjdGlvbiBsYXllciBmb3IgVURQCisvLworLy8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9VZHB1SW5pdAorLy8KKy8vIERlc2NyaXB0aW9uOiBpbml0IGZpcnN0IGluc3RhbmNlIG9mIHRoZSBtb2R1bGUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwUmVjZWl2ZUNiX3AgICAgPSAgIGZ1bmN0aW9ucG9pbnRlciB0byBTZG8tU2VxdWVuY2UgbGF5ZXIKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLWZ1bmN0aW9uCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvVWRwdUluaXQodEVwbFNlcXVMYXllclJlY2VpdmVDYiBmcFJlY2VpdmVDYl9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0gRXBsU2RvVWRwdUFkZEluc3RhbmNlKGZwUmVjZWl2ZUNiX3ApOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvVWRwdUFkZEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGluaXQgYWRkaXRpb25hbCBpbnN0YW5jZSBvZiB0aGUgbW9kdWxlCisvLyAgICAgICAgICAgICAg7m5pdCBzb2NrZXQgYW5kIHN0YXJ0IExpc3Rlbi1UaHJlYWQKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwUmVjZWl2ZUNiX3AgICAgPSAgIGZ1bmN0aW9ucG9pbnRlciB0byBTZG8tU2VxdWVuY2UgbGF5ZXIKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLWZ1bmN0aW9uCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvVWRwdUFkZEluc3RhbmNlKHRFcGxTZXF1TGF5ZXJSZWNlaXZlQ2IgZnBSZWNlaXZlQ2JfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworI2lmIChUQVJHRVRfU1lTVEVNID09IF9XSU4zMl8pCisJaW50IGlFcnJvcjsKKwlXU0FEQVRBIFdzYTsKKworI2VuZGlmCisKKwkvLyBzZXQgaW5zdGFuY2UgdmFyaWFibGVzIHRvIDAKKwlFUExfTUVNU0VUKCZTZG9VZHBJbnN0YW5jZV9nLCAweDAwLCBzaXplb2YoU2RvVWRwSW5zdGFuY2VfZykpOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBzYXZlIHBvaW50ZXIgdG8gY2FsbGJhY2stZnVuY3Rpb24KKwlpZiAoZnBSZWNlaXZlQ2JfcCAhPSBOVUxMKSB7CisJCVNkb1VkcEluc3RhbmNlX2cubV9mcFNkb0FzeVNlcUNiID0gZnBSZWNlaXZlQ2JfcDsKKwl9IGVsc2UgeworCQlSZXQgPSBrRXBsU2RvVWRwTWlzc0NiOworCQlnb3RvIEV4aXQ7CisJfQorCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1dJTjMyXykKKwkvLyBzdGFydCB3aW5zb2NrMiBmb3Igd2luMzIKKwkvLyB3aW5kb3dzIHNwZWNpZmljIHN0YXJ0IG9mIHNvY2tldAorCWlFcnJvciA9IFdTQVN0YXJ0dXAoTUFLRVdPUkQoMiwgMCksICZXc2EpOworCWlmIChpRXJyb3IgIT0gMCkgeworCQlSZXQgPSBrRXBsU2RvVWRwTm9Tb2NrZXQ7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gY3JlYXRlIGNyaXRpY2FsIHNlY3Rpb24gZm9yIGFjY2Nlc3Mgb2YgaW5zdG5hY2UgdmFyaWFibGVzCisJU2RvVWRwSW5zdGFuY2VfZy5tX3BDcml0aWNhbFNlY3Rpb24gPQorCSAgICAmU2RvVWRwSW5zdGFuY2VfZy5tX0NyaXRpY2FsU2VjdGlvbjsKKwlJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKFNkb1VkcEluc3RhbmNlX2cubV9wQ3JpdGljYWxTZWN0aW9uKTsKKworI2VsaWYgKFRBUkdFVF9TWVNURU0gPT0gX0xJTlVYXykgJiYgZGVmaW5lZChfX0tFUk5FTF9fKQorCWluaXRfY29tcGxldGlvbigmU2RvVWRwSW5zdGFuY2VfZy5tX0NvbXBsZXRpb25VZHBUaHJlYWQpOworCVNkb1VkcEluc3RhbmNlX2cubV9pVGVybWluYXRlVGhyZWFkID0gMDsKKyNlbmRpZgorCisJU2RvVWRwSW5zdGFuY2VfZy5tX1RocmVhZEhhbmRsZSA9IDA7CisJU2RvVWRwSW5zdGFuY2VfZy5tX1VkcFNvY2tldCA9IElOVkFMSURfU09DS0VUOworCisJUmV0ID0gRXBsU2RvVWRwdUNvbmZpZyhJTkFERFJfQU5ZLCAwKTsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9VZHB1RGVsSW5zdGFuY2UKKy8vCisvLyBEZXNjcmlwdGlvbjogZGVsIGluc3RhbmNlIG9mIHRoZSBtb2R1bGUKKy8vICAgICAgICAgICAgICBkZWwgc29ja2V0IGFuZCBkZWwgTGlzdGVuLVRocmVhZAorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gRXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9VZHB1RGVsSW5zdGFuY2UoKQoreworCXRFcGxLZXJuZWwgUmV0OworCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1dJTjMyXykKKwlCT09MIGZUZXJtRXJyb3I7CisjZW5kaWYKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJaWYgKFNkb1VkcEluc3RhbmNlX2cubV9UaHJlYWRIYW5kbGUgIT0gMCkgewkvLyBsaXN0ZW4gdGhyZWFkIHdhcyBzdGFydGVkCisJCS8vIGNsb3NlIHRocmVhZAorI2lmIChUQVJHRVRfU1lTVEVNID09IF9XSU4zMl8pCisJCWZUZXJtRXJyb3IgPQorCQkgICAgVGVybWluYXRlVGhyZWFkKFNkb1VkcEluc3RhbmNlX2cubV9UaHJlYWRIYW5kbGUsIDApOworCQlpZiAoZlRlcm1FcnJvciA9PSBGQUxTRSkgeworCQkJUmV0ID0ga0VwbFNkb1VkcFRocmVhZEVycm9yOworCQkJZ290byBFeGl0OworCQl9CisjZWxpZiAoVEFSR0VUX1NZU1RFTSA9PSBfTElOVVhfKSAmJiBkZWZpbmVkKF9fS0VSTkVMX18pCisJCVNkb1VkcEluc3RhbmNlX2cubV9pVGVybWluYXRlVGhyZWFkID0gMTsKKwkJLyoga2lsbF9wcm9jKFNkb1VkcEluc3RhbmNlX2cubV9UaHJlYWRIYW5kbGUsIFNJR1RFUk0sIDEgKTsgKi8KKwkJc2VuZF9zaWcoU0lHVEVSTSwgU2RvVWRwSW5zdGFuY2VfZy5tX1RocmVhZEhhbmRsZSwgMSk7CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJlNkb1VkcEluc3RhbmNlX2cubV9Db21wbGV0aW9uVWRwVGhyZWFkKTsKKyNlbmRpZgorCisJCVNkb1VkcEluc3RhbmNlX2cubV9UaHJlYWRIYW5kbGUgPSAwOworCX0KKworCWlmIChTZG9VZHBJbnN0YW5jZV9nLm1fVWRwU29ja2V0ICE9IElOVkFMSURfU09DS0VUKSB7CisJCS8vIGNsb3NlIHNvY2tldAorCQljbG9zZXNvY2tldChTZG9VZHBJbnN0YW5jZV9nLm1fVWRwU29ja2V0KTsKKwkJU2RvVWRwSW5zdGFuY2VfZy5tX1VkcFNvY2tldCA9IElOVkFMSURfU09DS0VUOworCX0KKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfV0lOMzJfKQorCS8vIGRlbGV0ZSBjcml0aWNhbCBzZWN0aW9uCisJRGVsZXRlQ3JpdGljYWxTZWN0aW9uKFNkb1VkcEluc3RhbmNlX2cubV9wQ3JpdGljYWxTZWN0aW9uKTsKKyNlbmRpZgorCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1dJTjMyXykKKwkvLyBmb3Igd2luIDMyCisJV1NBQ2xlYW51cCgpOworI2VuZGlmCisKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfV0lOMzJfKQorICAgICAgRXhpdDoKKyNlbmRpZgorCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFNkb1VkcHVDb25maWcKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVjb25maWd1cmF0ZSBzb2NrZXQgd2l0aCBuZXcgSVAtQWRkcmVzcworLy8gICAgICAgICAgICAgIC0+IG5lZWRlZCBmb3IgTk1UIFJlc2V0Q29uZmlndXJhdGlvbgorLy8KKy8vIFBhcmFtZXRlcnM6ICB1bElwQWRkcl9wICAgICAgPSBJcEFkZHJlc3MgaW4gcGxhdGZvcm0gYnl0ZSBvcmRlcgorLy8gICAgICAgICAgICAgIHVpUG9ydF9wICAgICAgICA9IHBvcnQgbnVtYmVyIGluIHBsYXRmb3JtIGJ5dGUgb3JkZXIKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gRXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9VZHB1Q29uZmlnKHVuc2lnbmVkIGxvbmcgdWxJcEFkZHJfcCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgdWlQb3J0X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJc3RydWN0IHNvY2thZGRyX2luIEFkZHI7CisJaW50IGlFcnJvcjsKKworI2lmIChUQVJHRVRfU1lTVEVNID09IF9XSU4zMl8pCisJQk9PTCBmVGVybUVycm9yOworCXVuc2lnbmVkIGxvbmcgdWxUaHJlYWRJZDsKKyNlbmRpZgorCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlpZiAodWlQb3J0X3AgPT0gMCkgewkvLyBzZXQgVURQIHBvcnQgdG8gZGVmYXVsdCBwb3J0IG51bWJlcgorCQl1aVBvcnRfcCA9IEVQTF9DX1NET19FUExfUE9SVDsKKwl9IGVsc2UgaWYgKHVpUG9ydF9wID4gNjU1MzUpIHsKKwkJUmV0ID0ga0VwbFNkb1VkcFNvY2tldEVycm9yOworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKFNkb1VkcEluc3RhbmNlX2cubV9UaHJlYWRIYW5kbGUgIT0gMCkgewkvLyBsaXN0ZW4gdGhyZWFkIHdhcyBzdGFydGVkCisKKwkJLy8gY2xvc2Ugb2xkIHRocmVhZAorI2lmIChUQVJHRVRfU1lTVEVNID09IF9XSU4zMl8pCisJCWZUZXJtRXJyb3IgPQorCQkgICAgVGVybWluYXRlVGhyZWFkKFNkb1VkcEluc3RhbmNlX2cubV9UaHJlYWRIYW5kbGUsIDApOworCQlpZiAoZlRlcm1FcnJvciA9PSBGQUxTRSkgeworCQkJUmV0ID0ga0VwbFNkb1VkcFRocmVhZEVycm9yOworCQkJZ290byBFeGl0OworCQl9CisjZWxpZiAoVEFSR0VUX1NZU1RFTSA9PSBfTElOVVhfKSAmJiBkZWZpbmVkKF9fS0VSTkVMX18pCisJCVNkb1VkcEluc3RhbmNlX2cubV9pVGVybWluYXRlVGhyZWFkID0gMTsKKwkJLyoga2lsbF9wcm9jKFNkb1VkcEluc3RhbmNlX2cubV9UaHJlYWRIYW5kbGUsIFNJR1RFUk0sIDEgKTsgKi8KKwkJc2VuZF9zaWcoU0lHVEVSTSwgU2RvVWRwSW5zdGFuY2VfZy5tX1RocmVhZEhhbmRsZSwgMSk7CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJlNkb1VkcEluc3RhbmNlX2cubV9Db21wbGV0aW9uVWRwVGhyZWFkKTsKKwkJU2RvVWRwSW5zdGFuY2VfZy5tX2lUZXJtaW5hdGVUaHJlYWQgPSAwOworI2VuZGlmCisKKwkJU2RvVWRwSW5zdGFuY2VfZy5tX1RocmVhZEhhbmRsZSA9IDA7CisJfQorCisJaWYgKFNkb1VkcEluc3RhbmNlX2cubV9VZHBTb2NrZXQgIT0gSU5WQUxJRF9TT0NLRVQpIHsKKwkJLy8gY2xvc2Ugc29ja2V0CisJCWlFcnJvciA9IGNsb3Nlc29ja2V0KFNkb1VkcEluc3RhbmNlX2cubV9VZHBTb2NrZXQpOworCQlTZG9VZHBJbnN0YW5jZV9nLm1fVWRwU29ja2V0ID0gSU5WQUxJRF9TT0NLRVQ7CisJCWlmIChpRXJyb3IgIT0gMCkgeworCQkJUmV0ID0ga0VwbFNkb1VkcFNvY2tldEVycm9yOworCQkJZ290byBFeGl0OworCQl9CisJfQorCS8vIGNyZWF0ZSBTb2NrZXQKKwlTZG9VZHBJbnN0YW5jZV9nLm1fVWRwU29ja2V0ID0gc29ja2V0KFBGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQKTsKKwlpZiAoU2RvVWRwSW5zdGFuY2VfZy5tX1VkcFNvY2tldCA9PSBJTlZBTElEX1NPQ0tFVCkgeworCQlSZXQgPSBrRXBsU2RvVWRwTm9Tb2NrZXQ7CisJCUVQTF9EQkdMVkxfU0RPX1RSQUNFMCgiRXBsU2RvVWRwdUNvbmZpZzogc29ja2V0KCkgZmFpbGVkXG4iKTsKKwkJZ290byBFeGl0OworCX0KKwkvLyBiaW5kIHNvY2tldAorCUFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJQWRkci5zaW5fcG9ydCA9IGh0b25zKCh1bnNpZ25lZCBzaG9ydCl1aVBvcnRfcCk7CisJQWRkci5zaW5fYWRkci5zX2FkZHIgPSBodG9ubCh1bElwQWRkcl9wKTsKKwlpRXJyb3IgPQorCSAgICBiaW5kKFNkb1VkcEluc3RhbmNlX2cubV9VZHBTb2NrZXQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmQWRkciwKKwkJIHNpemVvZihBZGRyKSk7CisJaWYgKGlFcnJvciA8IDApIHsKKwkJLy9pRXJyb3IgPSBXU0FHZXRMYXN0RXJyb3IoKTsKKwkJRVBMX0RCR0xWTF9TRE9fVFJBQ0UxCisJCSAgICAoIkVwbFNkb1VkcHVDb25maWc6IGJpbmQoKSBmaW5pc2hlZCB3aXRoICVpXG4iLCBpRXJyb3IpOworCQlSZXQgPSBrRXBsU2RvVWRwTm9Tb2NrZXQ7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gY3JlYXRlIExpc3Rlbi1UaHJlYWQKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfV0lOMzJfKQorCS8vIGZvciB3aW4zMgorCisJLy8gY3JlYXRlIHRocmVhZAorCVNkb1VkcEluc3RhbmNlX2cubV9UaHJlYWRIYW5kbGUgPSBDcmVhdGVUaHJlYWQoTlVMTCwKKwkJCQkJCSAgICAgICAwLAorCQkJCQkJICAgICAgIEVwbFNkb1VkcFRocmVhZCwKKwkJCQkJCSAgICAgICAmU2RvVWRwSW5zdGFuY2VfZywKKwkJCQkJCSAgICAgICAwLCAmdWxUaHJlYWRJZCk7CisJaWYgKFNkb1VkcEluc3RhbmNlX2cubV9UaHJlYWRIYW5kbGUgPT0gTlVMTCkgeworCQlSZXQgPSBrRXBsU2RvVWRwVGhyZWFkRXJyb3I7CisJCWdvdG8gRXhpdDsKKwl9CisjZWxpZiAoVEFSR0VUX1NZU1RFTSA9PSBfTElOVVhfKSAmJiBkZWZpbmVkKF9fS0VSTkVMX18pCisKKwlTZG9VZHBJbnN0YW5jZV9nLm1fVGhyZWFkSGFuZGxlID0KKwkgICAga2VybmVsX3RocmVhZChFcGxTZG9VZHBUaHJlYWQsICZTZG9VZHBJbnN0YW5jZV9nLCBDTE9ORV9LRVJORUwpOworCWlmIChTZG9VZHBJbnN0YW5jZV9nLm1fVGhyZWFkSGFuZGxlID09IDApIHsKKwkJUmV0ID0ga0VwbFNkb1VkcFRocmVhZEVycm9yOworCQlnb3RvIEV4aXQ7CisJfQorI2VuZGlmCisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9VZHB1SW5pdENvbgorLy8KKy8vIERlc2NyaXB0aW9uOiBpbml0IGEgbmV3IGNvbm5lY3QKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwU2RvQ29uSGFuZGxlX3AgPSBwb2ludGVyIGZvciB0aGUgbmV3IGNvbm5lY3Rpb24gaGFuZGxlCisvLyAgICAgICAgICAgICAgdWlUYXJnZXROb2RlSWRfcCA9IE5vZGVJZCBvZiB0aGUgdGFyZ2V0IG5vZGUKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gRXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9VZHB1SW5pdENvbih0RXBsU2RvQ29uSGRsICogcFNkb0NvbkhhbmRsZV9wLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgdWlUYXJnZXROb2RlSWRfcCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl1bnNpZ25lZCBpbnQgdWlDb3VudDsKKwl1bnNpZ25lZCBpbnQgdWlGcmVlQ29uOworCXRFcGxTZG9VZHBDb24gKnBTZG9VZHBDb247CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGdldCBmcmVlIGVudHJ5IGluIGNvbnRyb2wgc3RydWN0dXJlCisJdWlDb3VudCA9IDA7CisJdWlGcmVlQ29uID0gRVBMX1NET19NQVhfQ09OTkVDVElPTl9VRFA7CisJcFNkb1VkcENvbiA9ICZTZG9VZHBJbnN0YW5jZV9nLm1fYVNkb0Fic1VkcENvbm5lY3Rpb25bMF07CisJd2hpbGUgKHVpQ291bnQgPCBFUExfU0RPX01BWF9DT05ORUNUSU9OX1VEUCkgeworCQlpZiAoKHBTZG9VZHBDb24tPm1fdWxJcEFkZHIgJiBodG9ubCgweEZGKSkgPT0gaHRvbmwodWlUYXJnZXROb2RlSWRfcCkpIHsJLy8gZXhpc3RpbmcgY29ubmVjdGlvbiB0byB0YXJnZXQgbm9kZSBmb3VuZAorCQkJLy8gc2V0IGhhbmRsZQorCQkJKnBTZG9Db25IYW5kbGVfcCA9ICh1aUNvdW50IHwgRVBMX1NET19VRFBfSEFORExFKTsKKworCQkJZ290byBFeGl0OworCQl9IGVsc2UgaWYgKChwU2RvVWRwQ29uLT5tX3VsSXBBZGRyID09IDApCisJCQkgICAmJiAocFNkb1VkcENvbi0+bV91aVBvcnQgPT0gMCkpIHsKKwkJCXVpRnJlZUNvbiA9IHVpQ291bnQ7CisJCX0KKwkJdWlDb3VudCsrOworCQlwU2RvVWRwQ29uKys7CisJfQorCisJaWYgKHVpRnJlZUNvbiA9PSBFUExfU0RPX01BWF9DT05ORUNUSU9OX1VEUCkgeworCQkvLyBlcnJvciBubyBmcmVlIGhhbmRsZQorCQlSZXQgPSBrRXBsU2RvVWRwTm9GcmVlSGFuZGxlOworCX0gZWxzZSB7CisJCXBTZG9VZHBDb24gPQorCQkgICAgJlNkb1VkcEluc3RhbmNlX2cubV9hU2RvQWJzVWRwQ29ubmVjdGlvblt1aUZyZWVDb25dOworCQkvLyBzYXZlIGluZm9zIGZvciBjb25uZWN0aW9uCisJCXBTZG9VZHBDb24tPm1fdWlQb3J0ID0gaHRvbnMoRVBMX0NfU0RPX0VQTF9QT1JUKTsKKwkJcFNkb1VkcENvbi0+bV91bElwQWRkciA9IGh0b25sKDB4QzBBODY0MDAgfCB1aVRhcmdldE5vZGVJZF9wKTsJLy8gMTkyLjE2OC4xMDAudWlUYXJnZXROb2RlSWRfcAorCisJCS8vIHNldCBoYW5kbGUKKwkJKnBTZG9Db25IYW5kbGVfcCA9ICh1aUZyZWVDb24gfCBFUExfU0RPX1VEUF9IQU5ETEUpOworCisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvVWRwdVNlbmREYXRhCisvLworLy8gRGVzY3JpcHRpb246IHNlbmQgZGF0YSB1c2luZyBleGlzaXRpbmcgY29ubmVjdGlvbgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIFNkb0NvbkhhbmRsZV9wICA9IGNvbm5lY3Rpb24gaGFuZGxlCisvLyAgICAgICAgICAgICAgcFNyY0RhdGFfcCAgICAgID0gcG9pbnRlciB0byBkYXRhCisvLyAgICAgICAgICAgICAgZHdEYXRhU2l6ZV9wICAgID0gbnVtYmVyIG9mIGRhdGFieXRlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiB3aXRob3V0IGFzZW5kLWhlYWRlciEhIQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvVWRwdVNlbmREYXRhKHRFcGxTZG9Db25IZGwgU2RvQ29uSGFuZGxlX3AsCisJCQkJICAgICB0RXBsRnJhbWUgKiBwU3JjRGF0YV9wLCBEV09SRCBkd0RhdGFTaXplX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJaW50IGlFcnJvcjsKKwl1bnNpZ25lZCBpbnQgdWlBcnJheTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gQWRkcjsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJdWlBcnJheSA9IChTZG9Db25IYW5kbGVfcCAmIH5FUExfU0RPX0FTWV9IQU5ETEVfTUFTSyk7CisJaWYgKHVpQXJyYXkgPj0gRVBMX1NET19NQVhfQ09OTkVDVElPTl9VRFApIHsKKwkJUmV0ID0ga0VwbFNkb1VkcEludmFsaWRIZGw7CisJCWdvdG8gRXhpdDsKKwl9CisJLy9zZXQgbWVzc2FnZSB0eXBlCisJQW1pU2V0Qnl0ZVRvTGUoJnBTcmNEYXRhX3AtPm1fbGVfYk1lc3NhZ2VUeXBlLCAweDA2KTsJLy8gU0RPCisJLy8gdGFyZ2V0IG5vZGUgaWQgKGZvciBVZHAgPSAwKQorCUFtaVNldEJ5dGVUb0xlKCZwU3JjRGF0YV9wLT5tX2xlX2JEc3ROb2RlSWQsIDB4MDApOworCS8vIHNldCBzb3VyY2Utbm9kZWlkIChmb3IgVWRwID0gMCkKKwlBbWlTZXRCeXRlVG9MZSgmcFNyY0RhdGFfcC0+bV9sZV9iU3JjTm9kZUlkLCAweDAwKTsKKworCS8vIGNhbGMgc2l6ZQorCWR3RGF0YVNpemVfcCArPSBFUExfQVNORF9IRUFERVJfU0laRTsKKworCS8vIGNhbGwgc2VuZHRvCisJQWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfV0lOMzJfKQorCS8vIGVudGVyICBjcml0aWNhbCBzZWN0aW9uIGZvciBwcm9jZXNzIGZ1bmN0aW9uCisJRW50ZXJDcml0aWNhbFNlY3Rpb24oU2RvVWRwSW5zdGFuY2VfZy5tX3BDcml0aWNhbFNlY3Rpb24pOworI2VuZGlmCisKKwlBZGRyLnNpbl9wb3J0ID0KKwkgICAgKHVuc2lnbmVkIHNob3J0KVNkb1VkcEluc3RhbmNlX2cubV9hU2RvQWJzVWRwQ29ubmVjdGlvblt1aUFycmF5XS4KKwkgICAgbV91aVBvcnQ7CisJQWRkci5zaW5fYWRkci5zX2FkZHIgPQorCSAgICBTZG9VZHBJbnN0YW5jZV9nLm1fYVNkb0Fic1VkcENvbm5lY3Rpb25bdWlBcnJheV0ubV91bElwQWRkcjsKKworI2lmIChUQVJHRVRfU1lTVEVNID09IF9XSU4zMl8pCisJLy8gbGVhdmUgY3JpdGljYWwgc2VjdGlvbiBmb3IgcHJvY2VzcyBmdW5jdGlvbgorCUxlYXZlQ3JpdGljYWxTZWN0aW9uKFNkb1VkcEluc3RhbmNlX2cubV9wQ3JpdGljYWxTZWN0aW9uKTsKKyNlbmRpZgorCisJaUVycm9yID0gc2VuZHRvKFNkb1VkcEluc3RhbmNlX2cubV9VZHBTb2NrZXQsCS8vIHNvY2tldGhhbmRsZQorCQkJKGNvbnN0IGNoYXIgKikmcFNyY0RhdGFfcC0+bV9sZV9iTWVzc2FnZVR5cGUsCS8vIGRhdGEgdG8gc2VuZAorCQkJZHdEYXRhU2l6ZV9wLAkvLyBudW1iZXIgb2YgYnl0ZXMgdG8gc2VuZAorCQkJMCwJLy8gZmxhZ3MKKwkJCShzdHJ1Y3Qgc29ja2FkZHIgKikmQWRkciwJLy8gdGFyZ2V0CisJCQlzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7CS8vIHNpemVvZiB0YXJnZXRhZHJlc3MKKwlpZiAoaUVycm9yIDwgMCkgeworCQlFUExfREJHTFZMX1NET19UUkFDRTEKKwkJICAgICgiRXBsU2RvVWRwdVNlbmREYXRhOiBzZW5kdG8oKSBmaW5pc2hlZCB3aXRoICVpXG4iLCBpRXJyb3IpOworCQlSZXQgPSBrRXBsU2RvVWRwU2VuZEVycm9yOworCQlnb3RvIEV4aXQ7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU2RvVWRwdURlbENvbgorLy8KKy8vIERlc2NyaXB0aW9uOiBkZWxldGUgY29ubmVjdGlvbiBmcm9tIGludGVybiBzdHJ1Y3R1cmUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBTZG9Db25IYW5kbGVfcCAgPSBjb25uZWN0aW9uIGhhbmRsZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IEVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvVWRwdURlbENvbih0RXBsU2RvQ29uSGRsIFNkb0NvbkhhbmRsZV9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCXVuc2lnbmVkIGludCB1aUFycmF5OworCisJdWlBcnJheSA9IChTZG9Db25IYW5kbGVfcCAmIH5FUExfU0RPX0FTWV9IQU5ETEVfTUFTSyk7CisKKwlpZiAodWlBcnJheSA+PSBFUExfU0RPX01BWF9DT05ORUNUSU9OX1VEUCkgeworCQlSZXQgPSBrRXBsU2RvVWRwSW52YWxpZEhkbDsKKwkJZ290byBFeGl0OworCX0gZWxzZSB7CisJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCX0KKworCS8vIGRlbGV0ZSBjb25uZWN0aW9uCisJU2RvVWRwSW5zdGFuY2VfZy5tX2FTZG9BYnNVZHBDb25uZWN0aW9uW3VpQXJyYXldLm1fdWxJcEFkZHIgPSAwOworCVNkb1VkcEluc3RhbmNlX2cubV9hU2RvQWJzVWRwQ29ubmVjdGlvblt1aUFycmF5XS5tX3VpUG9ydCA9IDA7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgICAgICBFcGxTZG9VZHBUaHJlYWQKKy8vCisvLyBEZXNjcmlwdGlvbjogICAgIHRocmVhZCBjaGVjayBzb2NrZXQgZm9yIG5ldyBkYXRhCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgICAgIGxwUGFyYW1ldGVyID0gcG9pbnRlciB0byBwYXJhbWV0ZXIgdHlwZSB0RXBsU2RvVWRwVGhyZWFkUGFyYQorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgICAgIERXT1JEICAgPSAgIGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIChUQVJHRVRfU1lTVEVNID09IF9XSU4zMl8pCitzdGF0aWMgRFdPUkQgUFVCTElDIEVwbFNkb1VkcFRocmVhZChMUFZPSUQgbHBQYXJhbWV0ZXIpCisjZWxpZiAoVEFSR0VUX1NZU1RFTSA9PSBfTElOVVhfKSAmJiBkZWZpbmVkKF9fS0VSTkVMX18pCitzdGF0aWMgaW50IEVwbFNkb1VkcFRocmVhZCh2b2lkICpwQXJnX3ApCisjZW5kaWYKK3sKKworCXRFcGxTZG9VZHBJbnN0YW5jZSAqcEluc3RhbmNlOworCXN0cnVjdCBzb2NrYWRkcl9pbiBSZW1vdGVBZGRyOworCWludCBpRXJyb3I7CisJaW50IGlDb3VudDsKKwlpbnQgaUZyZWVFbnRyeTsKKwlCWVRFIGFiQnVmZmVyW0VQTF9NQVhfU0RPX1JFQ19GUkFNRV9TSVpFXTsKKwl1bnNpZ25lZCBpbnQgdWlTaXplOworCXRFcGxTZG9Db25IZGwgU2RvQ29uSGRsOworCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1dJTjMyXykKKwlwSW5zdGFuY2UgPSAodEVwbFNkb1VkcEluc3RhbmNlICopIGxwUGFyYW1ldGVyOworCisJZm9yICg7OykKKyNlbGlmIChUQVJHRVRfU1lTVEVNID09IF9MSU5VWF8pICYmIGRlZmluZWQoX19LRVJORUxfXykKKwlwSW5zdGFuY2UgPSAodEVwbFNkb1VkcEluc3RhbmNlICopIHBBcmdfcDsKKwlkYWVtb25pemUoIkVwbFNkb1VkcFRocmVhZCIpOworCWFsbG93X3NpZ25hbChTSUdURVJNKTsKKworCWZvciAoOyBwSW5zdGFuY2UtPm1faVRlcm1pbmF0ZVRocmVhZCA9PSAwOykKKyNlbmRpZgorCisJeworCQkvLyB3YWl0IGZvciBkYXRhCisJCXVpU2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpOworCQlpRXJyb3IgPSByZWN2ZnJvbShwSW5zdGFuY2UtPm1fVWRwU29ja2V0LAkvLyBTb2NrZXQKKwkJCQkgIChjaGFyICopJmFiQnVmZmVyWzBdLAkvLyBidWZmZXIgZm9yIGRhdGEKKwkJCQkgIHNpemVvZihhYkJ1ZmZlciksCS8vIHNpemUgb2YgdGhlIGJ1ZmZlcgorCQkJCSAgMCwJLy8gZmxhZ3MKKwkJCQkgIChzdHJ1Y3Qgc29ja2FkZHIgKikmUmVtb3RlQWRkciwKKwkJCQkgIChpbnQgKikmdWlTaXplKTsKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfTElOVVhfKSAmJiBkZWZpbmVkKF9fS0VSTkVMX18pCisJCWlmIChpRXJyb3IgPT0gLUVSRVNUQVJUU1lTKSB7CisJCQlicmVhazsKKwkJfQorI2VuZGlmCisJCWlmIChpRXJyb3IgPiAwKSB7CisJCQkvLyBnZXQgaGFuZGxlIGZvciBoaWdoZXIgbGF5ZXIKKwkJCWlDb3VudCA9IDA7CisJCQlpRnJlZUVudHJ5ID0gMHhGRkZGOworI2lmIChUQVJHRVRfU1lTVEVNID09IF9XSU4zMl8pCisJCQkvLyBlbnRlciAgY3JpdGljYWwgc2VjdGlvbiBmb3IgcHJvY2VzcyBmdW5jdGlvbgorCQkJRW50ZXJDcml0aWNhbFNlY3Rpb24oU2RvVWRwSW5zdGFuY2VfZy4KKwkJCQkJICAgICBtX3BDcml0aWNhbFNlY3Rpb24pOworI2VuZGlmCisJCQl3aGlsZSAoaUNvdW50IDwgRVBMX1NET19NQVhfQ09OTkVDVElPTl9VRFApIHsKKwkJCQkvLyBjaGVjayBpZiB0aGlzIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBrbm93bgorCQkJCWlmICgocEluc3RhbmNlLT5tX2FTZG9BYnNVZHBDb25uZWN0aW9uW2lDb3VudF0uCisJCQkJICAgICBtX3VsSXBBZGRyID09IFJlbW90ZUFkZHIuc2luX2FkZHIuc19hZGRyKQorCQkJCSAgICAmJiAocEluc3RhbmNlLT4KKwkJCQkJbV9hU2RvQWJzVWRwQ29ubmVjdGlvbltpQ291bnRdLgorCQkJCQltX3VpUG9ydCA9PSBSZW1vdGVBZGRyLnNpbl9wb3J0KSkgeworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlpZiAoKHBJbnN0YW5jZS0+bV9hU2RvQWJzVWRwQ29ubmVjdGlvbltpQ291bnRdLgorCQkJCSAgICAgbV91bElwQWRkciA9PSAwKQorCQkJCSAgICAmJiAocEluc3RhbmNlLT4KKwkJCQkJbV9hU2RvQWJzVWRwQ29ubmVjdGlvbltpQ291bnRdLgorCQkJCQltX3VpUG9ydCA9PSAwKQorCQkJCSAgICAmJiAoaUZyZWVFbnRyeSA9PSAweEZGRkYpKQorCQkJCXsKKwkJCQkJaUZyZWVFbnRyeSA9IGlDb3VudDsKKwkJCQl9CisKKwkJCQlpQ291bnQrKzsKKwkJCX0KKworCQkJaWYgKGlDb3VudCA9PSBFUExfU0RPX01BWF9DT05ORUNUSU9OX1VEUCkgeworCQkJCS8vIGNvbm5lY3Rpb24gdW5rbm93bgorCQkJCS8vIHNlZSBpZiB0aGVyZSBpcyBhIGZyZWUgaGFuZGxlCisJCQkJaWYgKGlGcmVlRW50cnkgIT0gMHhGRkZGKSB7CisJCQkJCS8vIHNhdmUgYWRyZXNzIGluZm9zCisJCQkJCXBJbnN0YW5jZS0+CisJCQkJCSAgICBtX2FTZG9BYnNVZHBDb25uZWN0aW9uW2lGcmVlRW50cnldLgorCQkJCQkgICAgbV91bElwQWRkciA9CisJCQkJCSAgICBSZW1vdGVBZGRyLnNpbl9hZGRyLnNfYWRkcjsKKwkJCQkJcEluc3RhbmNlLT4KKwkJCQkJICAgIG1fYVNkb0Fic1VkcENvbm5lY3Rpb25baUZyZWVFbnRyeV0uCisJCQkJCSAgICBtX3VpUG9ydCA9IFJlbW90ZUFkZHIuc2luX3BvcnQ7CisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1dJTjMyXykKKwkJCQkJLy8gbGVhdmUgY3JpdGljYWwgc2VjdGlvbiBmb3IgcHJvY2VzcyBmdW5jdGlvbgorCQkJCQlMZWF2ZUNyaXRpY2FsU2VjdGlvbihTZG9VZHBJbnN0YW5jZV9nLgorCQkJCQkJCSAgICAgbV9wQ3JpdGljYWxTZWN0aW9uKTsKKyNlbmRpZgorCQkJCQkvLyBjYWxsIGNhbGxiYWNrCisJCQkJCVNkb0NvbkhkbCA9IGlGcmVlRW50cnk7CisJCQkJCVNkb0NvbkhkbCB8PSBFUExfU0RPX1VEUF9IQU5ETEU7CisJCQkJCS8vIG9mZnNldCA0IC0+IHN0YXJ0IG9mIFNETyBTZXF1ZW5jZSBoZWFkZXIKKwkJCQkJcEluc3RhbmNlLT5tX2ZwU2RvQXN5U2VxQ2IoU2RvQ29uSGRsLAorCQkJCQkJCQkgICAodEVwbEFzeVNkb1NlcQorCQkJCQkJCQkgICAgKikgJgorCQkJCQkJCQkgICBhYkJ1ZmZlcls0XSwKKwkJCQkJCQkJICAgKGlFcnJvciAtCisJCQkJCQkJCSAgICA0KSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJRVBMX0RCR0xWTF9TRE9fVFJBQ0UwCisJCQkJCSAgICAoIkVycm9yIGluIEVwbFNkb1VkcFRocmVhZCgpIG5vIGZyZWUgaGFuZGxlXG4iKTsKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfV0lOMzJfKQorCQkJCQkvLyBsZWF2ZSBjcml0aWNhbCBzZWN0aW9uIGZvciBwcm9jZXNzIGZ1bmN0aW9uCisJCQkJCUxlYXZlQ3JpdGljYWxTZWN0aW9uKFNkb1VkcEluc3RhbmNlX2cuCisJCQkJCQkJICAgICBtX3BDcml0aWNhbFNlY3Rpb24pOworI2VuZGlmCisJCQkJfQorCisJCQl9IGVsc2UgeworCQkJCS8vIGtub3duIGNvbm5lY3Rpb24KKwkJCQkvLyBjYWxsIGNhbGxiYWNrIHdpdGggY29ycmVjdCBoYW5kbGUKKwkJCQlTZG9Db25IZGwgPSBpQ291bnQ7CisJCQkJU2RvQ29uSGRsIHw9IEVQTF9TRE9fVURQX0hBTkRMRTsKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfV0lOMzJfKQorCQkJCS8vIGxlYXZlIGNyaXRpY2FsIHNlY3Rpb24gZm9yIHByb2Nlc3MgZnVuY3Rpb24KKwkJCQlMZWF2ZUNyaXRpY2FsU2VjdGlvbihTZG9VZHBJbnN0YW5jZV9nLgorCQkJCQkJICAgICBtX3BDcml0aWNhbFNlY3Rpb24pOworI2VuZGlmCisJCQkJLy8gb2Zmc2V0IDQgLT4gc3RhcnQgb2YgU0RPIFNlcXVlbmNlIGhlYWRlcgorCQkJCXBJbnN0YW5jZS0+bV9mcFNkb0FzeVNlcUNiKFNkb0NvbkhkbCwKKwkJCQkJCQkgICAodEVwbEFzeVNkb1NlcSAqKSAmCisJCQkJCQkJICAgYWJCdWZmZXJbNF0sCisJCQkJCQkJICAgKGlFcnJvciAtIDQpKTsKKwkJCX0KKwkJfQkJLy8gZW5kIG9mICBpZihpRXJyb3IhPVNPQ0tFVF9FUlJPUikKKwl9CQkJLy8gZW5kIG9mIGZvcig7OykKKworI2lmIChUQVJHRVRfU1lTVEVNID09IF9MSU5VWF8pICYmIGRlZmluZWQoX19LRVJORUxfXykKKwljb21wbGV0ZV9hbmRfZXhpdCgmU2RvVWRwSW5zdGFuY2VfZy5tX0NvbXBsZXRpb25VZHBUaHJlYWQsIDApOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8vIGVuZCBvZiAjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET19VRFApKSAhPSAwKQorCisvLyBFT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsU3RhdHVzdS5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxTdGF0dXN1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg5ZjkxMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsU3RhdHVzdS5jCkBAIC0wLDAgKzEsMzgwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgc291cmNlIGZpbGUgZm9yIFN0YXR1c3UtTW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsU3RhdHVzdS5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMTEvMTUgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInVzZXIvRXBsU3RhdHVzdS5oIgorI2luY2x1ZGUgInVzZXIvRXBsRGxsdUNhbC5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgQyBMIEEgUyBTICA8eHh4eHg+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsU3RhdHVzdUNiUmVzcG9uc2UgbV9hcGZuQ2JSZXNwb25zZVsyNTRdOworCit9IHRFcGxTdGF0dXN1SW5zdGFuY2U7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdEVwbFN0YXR1c3VJbnN0YW5jZSBFcGxTdGF0dXN1SW5zdGFuY2VfZzsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxTdGF0dXN1Q2JTdGF0dXNSZXNwb25zZSh0RXBsRnJhbWVJbmZvICoKKwkJCQkJCSAgICBwRnJhbWVJbmZvX3ApOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU3RhdHVzdUluaXQKKy8vCisvLyBEZXNjcmlwdGlvbjogaW5pdCBmaXJzdCBpbnN0YW5jZSBvZiB0aGUgbW9kdWxlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbFN0YXR1c3VJbml0KCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IEVwbFN0YXR1c3VBZGRJbnN0YW5jZSgpOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsU3RhdHVzdUFkZEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGluaXQgb3RoZXIgaW5zdGFuY2VzIG9mIHRoZSBtb2R1bGUKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsU3RhdHVzdUFkZEluc3RhbmNlKCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gcmVzZXQgaW5zdGFuY2Ugc3RydWN0dXJlCisJRVBMX01FTVNFVCgmRXBsU3RhdHVzdUluc3RhbmNlX2csIDAsIHNpemVvZihFcGxTdGF0dXN1SW5zdGFuY2VfZykpOworCisJLy8gcmVnaXN0ZXIgU3RhdHVzUmVzcG9uc2UgY2FsbGJhY2sgZnVuY3Rpb24KKwlSZXQgPQorCSAgICBFcGxEbGx1Q2FsUmVnQXNuZFNlcnZpY2Uoa0VwbERsbEFzbmRTdGF0dXNSZXNwb25zZSwKKwkJCQkgICAgIEVwbFN0YXR1c3VDYlN0YXR1c1Jlc3BvbnNlLAorCQkJCSAgICAga0VwbERsbEFzbmRGaWx0ZXJBbnkpOworCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTdGF0dXN1RGVsSW5zdGFuY2UKKy8vCisvLyBEZXNjcmlwdGlvbjogZGVsZXRlIGluc3RhbmNlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbFN0YXR1c3VEZWxJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGRlcmVnaXN0ZXIgU3RhdHVzUmVzcG9uc2UgY2FsbGJhY2sgZnVuY3Rpb24KKwlSZXQgPQorCSAgICBFcGxEbGx1Q2FsUmVnQXNuZFNlcnZpY2Uoa0VwbERsbEFzbmRTdGF0dXNSZXNwb25zZSwgTlVMTCwKKwkJCQkgICAgIGtFcGxEbGxBc25kRmlsdGVyTm9uZSk7CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFN0YXR1c3VSZXNldAorLy8KKy8vIERlc2NyaXB0aW9uOiByZXNldHMgdGhpcyBpbnN0YW5jZQorLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxTdGF0dXN1UmVzZXQoKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyByZXNldCBpbnN0YW5jZSBzdHJ1Y3R1cmUKKwlFUExfTUVNU0VUKCZFcGxTdGF0dXN1SW5zdGFuY2VfZywgMCwgc2l6ZW9mKEVwbFN0YXR1c3VJbnN0YW5jZV9nKSk7CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFN0YXR1c3VSZXF1ZXN0U3RhdHVzUmVzcG9uc2UKKy8vCisvLyBEZXNjcmlwdGlvbjogcmV0dXJucyB0aGUgU3RhdHVzUmVzcG9uc2UgZm9yIHRoZSBzcGVjaWZpZWQgbm9kZS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdWlOb2RlSWRfcCAgICAgICAgICAgICAgICAgID0gSU46IG5vZGUgSUQKKy8vICAgICAgICAgICAgICBwZm5DYlJlc3BvbnNlX3AgICAgICAgICAgICAgPSBJTjogZnVuY3Rpb24gcG9pbnRlciB0byBjYWxsYmFjayBmdW5jdGlvbgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHdpbGwgYmUgY2FsbGVkIGlmIFN0YXR1c1Jlc3BvbnNlIGlzIHJlY2VpdmVkCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFN0YXR1c3VSZXF1ZXN0U3RhdHVzUmVzcG9uc2UodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCQkgIHRFcGxTdGF0dXN1Q2JSZXNwb25zZQorCQkJCQkJICBwZm5DYlJlc3BvbnNlX3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGRlY3JlbWVudCBub2RlIElELCBiZWNhdXNlIGFycmF5IGlzIHplcm8gYmFzZWQKKwl1aU5vZGVJZF9wLS07CisJaWYgKHVpTm9kZUlkX3AgPCB0YWJlbnRyaWVzKEVwbFN0YXR1c3VJbnN0YW5jZV9nLm1fYXBmbkNiUmVzcG9uc2UpKSB7CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJCWlmIChFcGxTdGF0dXN1SW5zdGFuY2VfZy5tX2FwZm5DYlJlc3BvbnNlW3VpTm9kZUlkX3BdICE9IE5VTEwpIHsJLy8gcmVxdWVzdCBhbHJlYWR5IGlzc3VlZCAobWF5YmUgYnkgc29tZW9uZSBlbHNlKQorCQkJUmV0ID0ga0VwbEludmFsaWRPcGVyYXRpb247CisJCX0gZWxzZSB7CisJCQlFcGxTdGF0dXN1SW5zdGFuY2VfZy5tX2FwZm5DYlJlc3BvbnNlW3VpTm9kZUlkX3BdID0KKwkJCSAgICBwZm5DYlJlc3BvbnNlX3A7CisJCQlSZXQgPQorCQkJICAgIEVwbERsbHVDYWxJc3N1ZVJlcXVlc3Qoa0VwbERsbFJlcVNlcnZpY2VTdGF0dXMsCisJCQkJCQkgICAodWlOb2RlSWRfcCArIDEpLCAweEZGKTsKKwkJfQorI2Vsc2UKKwkJUmV0ID0ga0VwbEludmFsaWRPcGVyYXRpb247CisjZW5kaWYKKwl9IGVsc2UgewkJLy8gaW52YWxpZCBub2RlIElEIHNwZWNpZmllZAorCQlSZXQgPSBrRXBsSW52YWxpZE5vZGVJZDsKKwl9CisKKwlyZXR1cm4gUmV0OworCit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTdGF0dXN1Q2JTdGF0dXNSZXNwb25zZQorLy8KKy8vIERlc2NyaXB0aW9uOiBjYWxsYmFjayBmdW5rdGlvbiBmb3IgU3RhdHVzUmVzcG9uc2UKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6ICBwRnJhbWVJbmZvX3AgICAgICAgICAgICA9IEZyYW1lIHdpdGggdGhlIFN0YXR1c1Jlc3BvbnNlCisvLworLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB0RXBsS2VybmVsIFBVQkxJQyBFcGxTdGF0dXN1Q2JTdGF0dXNSZXNwb25zZSh0RXBsRnJhbWVJbmZvICoKKwkJCQkJCSAgICBwRnJhbWVJbmZvX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl1bnNpZ25lZCBpbnQgdWlOb2RlSWQ7CisJdW5zaWduZWQgaW50IHVpSW5kZXg7CisJdEVwbFN0YXR1c3VDYlJlc3BvbnNlIHBmbkNiUmVzcG9uc2U7CisKKwl1aU5vZGVJZCA9IEFtaUdldEJ5dGVGcm9tTGUoJnBGcmFtZUluZm9fcC0+bV9wRnJhbWUtPm1fbGVfYlNyY05vZGVJZCk7CisKKwl1aUluZGV4ID0gdWlOb2RlSWQgLSAxOworCisJaWYgKHVpSW5kZXggPCB0YWJlbnRyaWVzKEVwbFN0YXR1c3VJbnN0YW5jZV9nLm1fYXBmbkNiUmVzcG9uc2UpKSB7CisJCS8vIG1lbW9yaXplIHBvaW50ZXIgdG8gY2FsbGJhY2sgZnVuY3Rpb24KKwkJcGZuQ2JSZXNwb25zZSA9IEVwbFN0YXR1c3VJbnN0YW5jZV9nLm1fYXBmbkNiUmVzcG9uc2VbdWlJbmRleF07CisJCWlmIChwZm5DYlJlc3BvbnNlID09IE5VTEwpIHsJLy8gcmVzcG9uc2Ugd2FzIG5vdCByZXF1ZXN0ZWQKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQkvLyByZXNldCBjYWxsYmFjayBmdW5jdGlvbiBwb2ludGVyIHNvIHRoYXQgY2FsbGVyIG1heSBpc3N1ZSBuZXh0IHJlcXVlc3QKKwkJRXBsU3RhdHVzdUluc3RhbmNlX2cubV9hcGZuQ2JSZXNwb25zZVt1aUluZGV4XSA9IE5VTEw7CisKKwkJaWYgKHBGcmFtZUluZm9fcC0+bV91aUZyYW1lU2l6ZSA8IEVQTF9DX0RMTF9NSU5TSVpFX1NUQVRVU1JFUykgewkvLyBTdGF0dXNSZXNwb25zZSBub3QgcmVjZWl2ZWQgb3IgaXQgaGFzIGludmFsaWQgc2l6ZQorCQkJUmV0ID0gcGZuQ2JSZXNwb25zZSh1aU5vZGVJZCwgTlVMTCk7CisJCX0gZWxzZSB7CS8vIFN0YXR1c1Jlc3BvbnNlIHJlY2VpdmVkCisJCQlSZXQgPQorCQkJICAgIHBmbkNiUmVzcG9uc2UodWlOb2RlSWQsCisJCQkJCSAgJnBGcmFtZUluZm9fcC0+bV9wRnJhbWUtPm1fRGF0YS4KKwkJCQkJICBtX0FzbmQubV9QYXlsb2FkLm1fU3RhdHVzUmVzcG9uc2UpOworCQl9CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxUYXJnZXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsVGFyZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJiNjZmOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsVGFyZ2V0LmgKQEAgLTAsMCArMSwyMzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIHRhcmdldCBhcGkgZnVuY3Rpb24KKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxUYXJnZXQuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA1LzEyLzA1IC1hczogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExUQVJHRVRfSF8KKyNkZWZpbmUgX0VQTFRBUkdFVF9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIG1hY3JvcyBmb3IgbWVtb3J5IGFjY2VzcyAoZGVwZW5kcyBvbiB0YXJnZXQgc3lzdGVtKQorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBOT1RFOgorLy8gVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIHVzZWQgdG8gY29tYmluZSBzdGFuZGFyZCBsaWJyYXJ5IGRlZmluaXRpb25zLiBTb21lCisvLyBhcHBsaWNhdGlvbnMgbmVlZHMgdG8gdXNlIG9uZSBjb21tb24gbGlicmFyeSBmdW5jdGlvbiAoZS5nLiBtZW1jcHkoKSkuIFNvCisvLyB5b3UgY2FuIHNldCAob3IgY2hhbmdlKSBpdCBoZXJlLgorCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1dJTjMyXykKKworI2RlZmluZSBfV0lOMzJfV0lORE9XUyAweDA0MDEKKyNkZWZpbmUgX1dJTjMyX1dJTk5UICAgMHgwNDAwCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisgICAgLy8yOS4xMS4yMDA0IGYuai4gc29uc3QgaXN0IG1lbWNweSB1bmQgbWVtc2V0IHVuYmVrYW5udAorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIEVQTF9NRU1DUFkoZHN0LHNyYyxzaXopICAgICBtZW1jcHkoKHZvaWQqKShkc3QpLChjb25zdCB2b2lkKikoc3JjKSwoc2l6ZV90KShzaXopKTsKKyNkZWZpbmUgRVBMX01FTVNFVChkc3QsdmFsLHNpeikgICAgIG1lbXNldCgodm9pZCopKGRzdCksKGludCkodmFsKSwoc2l6ZV90KShzaXopKTsKKworICAgIC8vIGYuai46IGRpZSBGdW5rdGlvbmVuIGb8ciA8TWVtQWxsb2M+IHVuZCA8TWVtRnJlZT4gc2luZCBpbiBXaW5NZW0uYyBkZWZpbmllcnQKKyAgICAvL2RlZmluaXRpb24gZGVyIFByb3RvdHlwZW4KK3ZvaWQgRkFSICpNZW1BbGxvYyhEV09SRCBkd01lbVNpemVfcCk7Cit2b2lkIE1lbUZyZWUodm9pZCBGQVIgKiBwTWVtX3ApOworCisjZGVmaW5lIEVQTF9NQUxMT0Moc2l6KSAgICAgICAgICAgICBtYWxsb2MoKHNpemVfdCkoc2l6KSkKKyNkZWZpbmUgRVBMX0ZSRUUocHRyKSAgICAgICAgICAgICAgIGZyZWUoKHZvaWQgKilwdHIpCisKKyNpZm5kZWYgUFJJTlRGMAordm9pZCB0cmFjZShjb25zdCBjaGFyICpmbXQsIC4uLik7CisjZGVmaW5lIFBSSU5URiAgICAgICAgICAgICAgICAgICAgICBUUkFDRQorI2RlZmluZSBQUklOVEYwKGFyZykgICAgICAgICAgICAgICAgVFJBQ0UwKGFyZykKKyNkZWZpbmUgUFJJTlRGMShhcmcscDEpICAgICAgICAgICAgIFRSQUNFMShhcmcscDEpCisjZGVmaW5lIFBSSU5URjIoYXJnLHAxLHAyKSAgICAgICAgICBUUkFDRTIoYXJnLHAxLHAyKQorI2RlZmluZSBQUklOVEYzKGFyZyxwMSxwMixwMykgICAgICAgVFJBQ0UzKGFyZyxwMSxwMixwMykKKyNkZWZpbmUgUFJJTlRGNChhcmcscDEscDIscDMscDQpICAgIFRSQUNFNChhcmcscDEscDIscDMscDQpCisJLy8jZGVmaW5lIFBSSU5URiAgICAgICAgICAgICAgICAgICAgICBwcmludGYKKwkvLyNkZWZpbmUgUFJJTlRGMChhcmcpICAgICAgICAgICAgICAgIFBSSU5URihhcmcpCisJLy8jZGVmaW5lIFBSSU5URjEoYXJnLHAxKSAgICAgICAgICAgICBQUklOVEYoYXJnLHAxKQorCS8vI2RlZmluZSBQUklOVEYyKGFyZyxwMSxwMikgICAgICAgICAgUFJJTlRGKGFyZyxwMSxwMikKKwkvLyNkZWZpbmUgUFJJTlRGMyhhcmcscDEscDIscDMpICAgICAgIFBSSU5URihhcmcscDEscDIscDMpCisJLy8jZGVmaW5lIFBSSU5URjQoYXJnLHAxLHAyLHAzLHA0KSAgICBQUklOVEYoYXJnLHAxLHAyLHAzLHA0KQorI2VuZGlmCisKKyNpZmRlZiBBU1NFUlRNU0cKKyN1bmRlZiBBU1NFUlRNU0cKKyNlbmRpZgorCisjZGVmaW5lIEFTU0VSVE1TRyhleHByLHN0cmluZykgIGlmICghKGV4cHIpKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQm94IChOVUxMLCBzdHJpbmcsICJBc3NlcnRpb24gZmFpbGVkIiwgTUJfT0sgfCBNQl9JQ09ORVJST1IpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCAoLTEpO30KKworI2VsaWYgKFRBUkdFVF9TWVNURU0gPT0gX05PX09TXykKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyAgICAvLzI5LjExLjIwMDQgZi5qLiBzb25zdCBpc3QgbWVtY3B5IHVuZCBtZW1zZXQgdW5iZWthbm50CisvLyAgICAjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgRVBMX01FTUNQWShkc3Qsc3JjLHNpeikgICAgIG1lbWNweSgodm9pZCopKGRzdCksKGNvbnN0IHZvaWQqKShzcmMpLChzaXplX3QpKHNpeikpOworI2RlZmluZSBFUExfTUVNU0VUKGRzdCx2YWwsc2l6KSAgICAgbWVtc2V0KCh2b2lkKikoZHN0KSwoaW50KSh2YWwpLChzaXplX3QpKHNpeikpOworCisjZGVmaW5lIEVQTF9NQUxMT0Moc2l6KSAgICAgICAgICAgICBtYWxsb2MoKHNpemVfdCkoc2l6KSkKKyNkZWZpbmUgRVBMX0ZSRUUocHRyKSAgICAgICAgICAgICAgIGZyZWUoKHZvaWQgKilwdHIpCisKKyNpZm5kZWYgUFJJTlRGMAorI2RlZmluZSBQUklOVEYgICAgICAgICAgICAgICAgICAgICAgVFJBQ0UKKyNkZWZpbmUgUFJJTlRGMChhcmcpICAgICAgICAgICAgICAgIFRSQUNFMChhcmcpCisjZGVmaW5lIFBSSU5URjEoYXJnLHAxKSAgICAgICAgICAgICBUUkFDRTEoYXJnLHAxKQorI2RlZmluZSBQUklOVEYyKGFyZyxwMSxwMikgICAgICAgICAgVFJBQ0UyKGFyZyxwMSxwMikKKyNkZWZpbmUgUFJJTlRGMyhhcmcscDEscDIscDMpICAgICAgIFRSQUNFMyhhcmcscDEscDIscDMpCisjZGVmaW5lIFBSSU5URjQoYXJnLHAxLHAyLHAzLHA0KSAgICBUUkFDRTQoYXJnLHAxLHAyLHAzLHA0KQorCS8vI2RlZmluZSBQUklOVEYgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmCisJLy8jZGVmaW5lIFBSSU5URjAoYXJnKSAgICAgICAgICAgICAgICBQUklOVEYoYXJnKQorCS8vI2RlZmluZSBQUklOVEYxKGFyZyxwMSkgICAgICAgICAgICAgUFJJTlRGKGFyZyxwMSkKKwkvLyNkZWZpbmUgUFJJTlRGMihhcmcscDEscDIpICAgICAgICAgIFBSSU5URihhcmcscDEscDIpCisJLy8jZGVmaW5lIFBSSU5URjMoYXJnLHAxLHAyLHAzKSAgICAgICBQUklOVEYoYXJnLHAxLHAyLHAzKQorCS8vI2RlZmluZSBQUklOVEY0KGFyZyxwMSxwMixwMyxwNCkgICAgUFJJTlRGKGFyZyxwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjZWxpZiAoVEFSR0VUX1NZU1RFTSA9PSBfTElOVVhfKQorCisjaWZuZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2Vsc2UKKy8vICAgICAgICAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjZW5kaWYKKworICAgIC8vMjkuMTEuMjAwNCBmLmouIHNvbnN0IGlzdCBtZW1jcHkgdW5kIG1lbXNldCB1bmJla2FubnQKKy8vICAgICNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBFUExfTUVNQ1BZKGRzdCxzcmMsc2l6KSAgICAgbWVtY3B5KCh2b2lkKikoZHN0KSwoY29uc3Qgdm9pZCopKHNyYyksKHNpemVfdCkoc2l6KSk7CisjZGVmaW5lIEVQTF9NRU1TRVQoZHN0LHZhbCxzaXopICAgICBtZW1zZXQoKHZvaWQqKShkc3QpLChpbnQpKHZhbCksKHNpemVfdCkoc2l6KSk7CisKKyNpZm5kZWYgX19LRVJORUxfXworI2RlZmluZSBFUExfTUFMTE9DKHNpeikgICAgICAgICAgICAgbWFsbG9jKChzaXplX3QpKHNpeikpCisjZGVmaW5lIEVQTF9GUkVFKHB0cikgICAgICAgICAgICAgICBmcmVlKCh2b2lkICopcHRyKQorI2Vsc2UKKyNkZWZpbmUgRVBMX01BTExPQyhzaXopICAgICAgICAgICAgIGttYWxsb2MoKHNpemVfdCkoc2l6KSwgR0ZQX0tFUk5FTCkKKyNkZWZpbmUgRVBMX0ZSRUUocHRyKSAgICAgICAgICAgICAgIGtmcmVlKCh2b2lkICopcHRyKQorI2VuZGlmCisKKyNpZm5kZWYgUFJJTlRGMAorI2RlZmluZSBQUklOVEYgICAgICAgICAgICAgICAgICAgICAgVFJBQ0UKKyNkZWZpbmUgUFJJTlRGMChhcmcpICAgICAgICAgICAgICAgIFRSQUNFMChhcmcpCisjZGVmaW5lIFBSSU5URjEoYXJnLHAxKSAgICAgICAgICAgICBUUkFDRTEoYXJnLHAxKQorI2RlZmluZSBQUklOVEYyKGFyZyxwMSxwMikgICAgICAgICAgVFJBQ0UyKGFyZyxwMSxwMikKKyNkZWZpbmUgUFJJTlRGMyhhcmcscDEscDIscDMpICAgICAgIFRSQUNFMyhhcmcscDEscDIscDMpCisjZGVmaW5lIFBSSU5URjQoYXJnLHAxLHAyLHAzLHA0KSAgICBUUkFDRTQoYXJnLHAxLHAyLHAzLHA0KQorCS8vI2RlZmluZSBQUklOVEYgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmCisJLy8jZGVmaW5lIFBSSU5URjAoYXJnKSAgICAgICAgICAgICAgICBQUklOVEYoYXJnKQorCS8vI2RlZmluZSBQUklOVEYxKGFyZyxwMSkgICAgICAgICAgICAgUFJJTlRGKGFyZyxwMSkKKwkvLyNkZWZpbmUgUFJJTlRGMihhcmcscDEscDIpICAgICAgICAgIFBSSU5URihhcmcscDEscDIpCisJLy8jZGVmaW5lIFBSSU5URjMoYXJnLHAxLHAyLHAzKSAgICAgICBQUklOVEYoYXJnLHAxLHAyLHAzKQorCS8vI2RlZmluZSBQUklOVEY0KGFyZyxwMSxwMixwMyxwNCkgICAgUFJJTlRGKGFyZyxwMSxwMixwMyxwNCkKKyNlbmRpZgorCisjZW5kaWYKKworI2RlZmluZSBFUExfVEdUX0lOVE1BU0tfRVRIICAgICAweDAwMDEJLy8gZXRoZXJuZXQgaW50ZXJydXB0CisjZGVmaW5lIEVQTF9UR1RfSU5UTUFTS19ETUEgICAgIDB4MDAwMgkvLyBETUEgaW50ZXJydXB0CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gY3VycmVudGx5IG5vIFRpbWVyIGZ1bmN0aW9ucyBhcmUgbmVlZGVkIGJ5IEVQTCBzdGFjaworLy8gc28gdGhleSBhcmUgbm90IGltcGxlbWVudGVkIHlldAorLy92b2lkICBQVUJMSUMgVGd0VGltZXJJbml0KHZvaWQpOworLy9EV09SRCBQVUJMSUMgVGd0R2V0VGlja0NvdW50KHZvaWQpOworLy92b2lkIFBVQkxJQyBUZ3RHZXROZXRUaW1lKHRFcGxOZXRUaW1lICogcE5ldFRpbWVfcCk7CisKKy8vIGZ1bmN0aW9ucyBmb3IgZXRoZXJuZXQgZHJpdmVyCit0RXBsS2VybmVsIFBVQkxJQyBUZ3RJbml0RXRoSXNyKHZvaWQpOwordm9pZCBQVUJMSUMgVGd0RnJlZUV0aElzcih2b2lkKTsKK3ZvaWQgUFVCTElDIFRndEVuYWJsZUdsb2JhbEludGVycnVwdChCWVRFIGZFbmFibGVfcCk7Cit2b2lkIFBVQkxJQyBUZ3RFbmFibGVFdGhJbnRlcnJ1cHQwKEJZVEUgZkVuYWJsZV9wLAorCQkJCSAgIHVuc2lnbmVkIGludCB1aUludGVycnVwdE1hc2tfcCk7Cit2b2lkIFBVQkxJQyBUZ3RFbmFibGVFdGhJbnRlcnJ1cHQxKEJZVEUgZkVuYWJsZV9wLAorCQkJCSAgIHVuc2lnbmVkIGludCB1aUludGVycnVwdE1hc2tfcCk7CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExUQVJHRVRfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsVGltZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsVGltZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWNiZmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxUaW1lci5oCkBAIC0wLDAgKzEsMTE3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBFcGwgVGltZXItTW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsVGltZXIuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA3LzA2IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJFcGxJbmMuaCIKKyNpbmNsdWRlICJFcGxFdmVudC5oIgorCisjaWZuZGVmIF9FUExUSU1FUl9IXworI2RlZmluZSBfRVBMVElNRVJfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyB0eXBlIGZvciB0aW1lciBoYW5kbGUKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB0RXBsVGltZXJIZGw7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsRXZlbnRTaW5rIG1fRXZlbnRTaW5rOworCXVuc2lnbmVkIGxvbmcgbV91bEFyZzsJLy8gZC5rLjogY29udmVydGVkIHRvIHVuc2lnbmVkIGxvbmcgYmVjYXVzZQorCS8vIGl0IGlzIG5ldmVyIGFjY2Vzc2VkIGFzIGEgcG9pbnRlciBieSB0aGUKKwkvLyB0aW1lciBtb2R1bGUgYW5kIHRoZSBkYXRhIHRoZQorCS8vIHBvaW50ZXIgcG9pbnRzIHRvIGlzIG5vdCBzYXZlZCBpbiBhbnkgd2F5LgorCS8vIEl0IGlzIGp1c3QgYSB2YWx1ZS4gVGhlIHVzZXIgaXMgcmVzcG9uc2libGUKKwkvLyB0byBzdG9yZSB0aGUgZGF0YSBzdGF0aWNhbGx5IGFuZCBjb252ZXJ0CisJLy8gdGhlIHBvaW50ZXIgYmV0d2VlbiBhZGRyZXNzIHNwYWNlcy4KKworfSB0RXBsVGltZXJBcmc7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsVGltZXJIZGwgbV9UaW1lckhkbDsKKwl1bnNpZ25lZCBsb25nIG1fdWxBcmc7CS8vIGQuay46IGNvbnZlcnRlZCB0byB1bnNpZ25lZCBsb25nIGJlY2F1c2UKKwkvLyBpdCBpcyBuZXZlciBhY2Nlc3NlZCBhcyBhIHBvaW50ZXIgYnkgdGhlCisJLy8gdGltZXIgbW9kdWxlIGFuZCB0aGUgZGF0YSB0aGUKKwkvLyBwb2ludGVyIHBvaW50cyB0byBpcyBub3Qgc2F2ZWQgaW4gYW55IHdheS4KKwkvLyBJdCBpcyBqdXN0IGEgdmFsdWUuCisKK30gdEVwbFRpbWVyRXZlbnRBcmc7CisKK3R5cGVkZWYgdEVwbEtlcm5lbChQVUJMSUMgKiB0RXBsVGltZXJrQ2FsbGJhY2spICh0RXBsVGltZXJFdmVudEFyZyAqCisJCQkJCQkgcEV2ZW50QXJnX3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTFRJTUVSX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFRpbWVydUxpbnV4S2VybmVsLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFRpbWVydUxpbnV4S2VybmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg4MjBkMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsVGltZXJ1TGludXhLZXJuZWwuYwpAQCAtMCwwICsxLDQ0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIHNvdXJjZSBmaWxlIGZvciBFUEwgVXNlciBUaW1lcm1vZHVsZSBmb3IgTGludXgga2VybmVsIG1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbFRpbWVydUxpbnV4S2VybmVsLmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgS0VJTCB1VmlzaW9uIDIKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA5LzEyIGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ1c2VyL0VwbFRpbWVydS5oIgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0eXBlZGVmIHN0cnVjdCB7CisJc3RydWN0IHRpbWVyX2xpc3QgbV9UaW1lcjsKKwl0RXBsVGltZXJBcmcgVGltZXJBcmd1bWVudDsKKworfSB0RXBsVGltZXJ1RGF0YTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdm9pZCBQVUJMSUMgRXBsVGltZXJ1Q2JNcyh1bnNpZ25lZCBsb25nIHVsUGFyYW1ldGVyX3ApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBDIEwgQSBTIFMgIDxFcGwgVXNlcnNwYWNlLVRpbWVybW9kdWxlIGZvciBMaW51eCBLZXJuZWw+ICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKy8vIERlc2NyaXB0aW9uOiBFcGwgVXNlcnNwYWNlLVRpbWVybW9kdWxlIGZvciBMaW51eCBLZXJuZWwKKy8vCisvLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFRpbWVydUluaXQKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gaW5pdHMgZmlyc3QgaW5zdGFuY2UKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdm9pZAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVydUluaXQoKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0gRXBsVGltZXJ1QWRkSW5zdGFuY2UoKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFRpbWVydUFkZEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGluaXRzIGFkZGl0aW9uYWwgaW5zdGFuY2UKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdm9pZAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVydUFkZEluc3RhbmNlKCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsVGltZXJ1RGVsSW5zdGFuY2UKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gZGVsZXRlcyBpbnN0YW5jZQorLy8gICAgICAgICAgICAgIC0+IHVuZGVyIExpbnV4IG5vdGhpbmcgdG8gZG8KKy8vICAgICAgICAgICAgICAtPiBubyBpbnN0YW5jZSB0YWJsZSBuZWVkZWQKKy8vCisvLyBQYXJhbWV0ZXJzOiAgdm9pZAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVydURlbEluc3RhbmNlKCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJcmV0dXJuIFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsVGltZXJ1U2V0VGltZXJNcworLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBjcmVhdGVzIGEgdGltZXIgYW5kIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgaGFuZGxlCisvLworLy8gUGFyYW1ldGVyczogIHBUaW1lckhkbF9wID0gcG9pbnRlciB0byBhIGJ1ZmZlciB0byBmaWxsIGluIHRoZSBoYW5kbGUKKy8vICAgICAgICAgICAgICB1bFRpbWVfcCAgICA9IHRpbWUgZm9yIHRpbWVyIGluIG1zCisvLyAgICAgICAgICAgICAgQXJndW1lbnRfcCAgPSBhcmd1bWVudCBmb3IgdGltZXIKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcnVTZXRUaW1lck1zKHRFcGxUaW1lckhkbCAqIHBUaW1lckhkbF9wLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdWxUaW1lX3AsCisJCQkJICAgICAgdEVwbFRpbWVyQXJnIEFyZ3VtZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsVGltZXJ1RGF0YSAqcERhdGE7CisKKwkvLyBjaGVjayBwb2ludGVyIHRvIGhhbmRsZQorCWlmIChwVGltZXJIZGxfcCA9PSBOVUxMKSB7CisJCVJldCA9IGtFcGxUaW1lckludmFsaWRIYW5kbGU7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlwRGF0YSA9ICh0RXBsVGltZXJ1RGF0YSAqKSBFUExfTUFMTE9DKHNpemVvZih0RXBsVGltZXJ1RGF0YSkpOworCWlmIChwRGF0YSA9PSBOVUxMKSB7CisJCVJldCA9IGtFcGxOb1Jlc291cmNlOworCQlnb3RvIEV4aXQ7CisJfQorCisJaW5pdF90aW1lcigmcERhdGEtPm1fVGltZXIpOworCXBEYXRhLT5tX1RpbWVyLmZ1bmN0aW9uID0gRXBsVGltZXJ1Q2JNczsKKwlwRGF0YS0+bV9UaW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcERhdGE7CisJcERhdGEtPm1fVGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyB1bFRpbWVfcCAqIEhaIC8gMTAwMDsKKworCUVQTF9NRU1DUFkoJnBEYXRhLT5UaW1lckFyZ3VtZW50LCAmQXJndW1lbnRfcCwgc2l6ZW9mKHRFcGxUaW1lckFyZykpOworCisJYWRkX3RpbWVyKCZwRGF0YS0+bV9UaW1lcik7CisKKwkqcFRpbWVySGRsX3AgPSAodEVwbFRpbWVySGRsKSBwRGF0YTsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxUaW1lcnVNb2RpZnlUaW1lck1zCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGNoYW5nZXMgYSB0aW1lciBhbmQgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBoYW5kbGUKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFRpbWVySGRsX3AgPSBwb2ludGVyIHRvIGEgYnVmZmVyIHRvIGZpbGwgaW4gdGhlIGhhbmRsZQorLy8gICAgICAgICAgICAgIHVsVGltZV9wICAgID0gdGltZSBmb3IgdGltZXIgaW4gbXMKKy8vICAgICAgICAgICAgICBBcmd1bWVudF9wICA9IGFyZ3VtZW50IGZvciB0aW1lcgorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVydU1vZGlmeVRpbWVyTXModEVwbFRpbWVySGRsICogcFRpbWVySGRsX3AsCisJCQkJCSB1bnNpZ25lZCBsb25nIHVsVGltZV9wLAorCQkJCQkgdEVwbFRpbWVyQXJnIEFyZ3VtZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKwl0RXBsVGltZXJ1RGF0YSAqcERhdGE7CisKKwkvLyBjaGVjayBwb2ludGVyIHRvIGhhbmRsZQorCWlmIChwVGltZXJIZGxfcCA9PSBOVUxMKSB7CisJCVJldCA9IGtFcGxUaW1lckludmFsaWRIYW5kbGU7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gY2hlY2sgaGFuZGxlIGl0c2VsZiwgaS5lLiB3YXMgdGhlIGhhbmRsZSBpbml0aWFsaXplZCBiZWZvcmUKKwlpZiAoKnBUaW1lckhkbF9wID09IDApIHsKKwkJUmV0ID0gRXBsVGltZXJ1U2V0VGltZXJNcyhwVGltZXJIZGxfcCwgdWxUaW1lX3AsIEFyZ3VtZW50X3ApOworCQlnb3RvIEV4aXQ7CisJfQorCXBEYXRhID0gKHRFcGxUaW1lcnVEYXRhICopICogcFRpbWVySGRsX3A7CisJaWYgKCh0RXBsVGltZXJ1RGF0YSAqKSBwRGF0YS0+bV9UaW1lci5kYXRhICE9IHBEYXRhKSB7CisJCVJldCA9IGtFcGxUaW1lckludmFsaWRIYW5kbGU7CisJCWdvdG8gRXhpdDsKKwl9CisKKwltb2RfdGltZXIoJnBEYXRhLT5tX1RpbWVyLCAoamlmZmllcyArIHVsVGltZV9wICogSFogLyAxMDAwKSk7CisKKwkvLyBjb3B5IHRoZSBUaW1lckFyZyBhZnRlciB0aGUgdGltZXIgaXMgcmVzdGFydGVkLAorCS8vIHNvIHRoYXQgYSB0aW1lciBvY2N1cmVkIGltbWVkaWF0ZWx5IGJlZm9yZSBtb2RfdGltZXIKKwkvLyB3b24ndCB1c2UgdGhlIG5ldyBUaW1lckFyZyBhbmQKKwkvLyB0aGVyZWZvcmUgdGhlIG9sZCB0aW1lciBjYW5ub3QgYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIHRoZSBuZXcgb25lLgorCS8vIEJ1dCBpZiB0aGUgbmV3IHRpbWVyIGlzIHRvbyBmYXN0LCBpdCBtYXkgZ2V0IGxvc3QuCisJRVBMX01FTUNQWSgmcERhdGEtPlRpbWVyQXJndW1lbnQsICZBcmd1bWVudF9wLCBzaXplb2YodEVwbFRpbWVyQXJnKSk7CisKKwkvLyBjaGVjayBpZiB0aW1lciBpcyByZWFsbHkgcnVubmluZworCWlmICh0aW1lcl9wZW5kaW5nKCZwRGF0YS0+bV9UaW1lcikgPT0gMCkgewkvLyB0aW1lciBpcyBub3QgcnVubmluZworCQkvLyByZXRyeSBzdGFydGluZyBpdAorCQlhZGRfdGltZXIoJnBEYXRhLT5tX1RpbWVyKTsKKwl9CisJLy8gc2V0IGhhbmRsZSB0byBwb2ludGVyIG9mIHRFcGxUaW1lcnVEYXRhCisvLyAgICAqcFRpbWVySGRsX3AgPSAodEVwbFRpbWVySGRsKSBwRGF0YTsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxUaW1lcnVEZWxldGVUaW1lcgorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBkZWxldGVzIGEgdGltZXIKKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFRpbWVySGRsX3AgPSBwb2ludGVyIHRvIGEgYnVmZmVyIHRvIGZpbGwgaW4gdGhlIGhhbmRsZQorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICA9IGVycm9yY29kZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVydURlbGV0ZVRpbWVyKHRFcGxUaW1lckhkbCAqIHBUaW1lckhkbF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbFRpbWVydURhdGEgKnBEYXRhOworCisJLy8gY2hlY2sgcG9pbnRlciB0byBoYW5kbGUKKwlpZiAocFRpbWVySGRsX3AgPT0gTlVMTCkgeworCQlSZXQgPSBrRXBsVGltZXJJbnZhbGlkSGFuZGxlOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGNoZWNrIGhhbmRsZSBpdHNlbGYsIGkuZS4gd2FzIHRoZSBoYW5kbGUgaW5pdGlhbGl6ZWQgYmVmb3JlCisJaWYgKCpwVGltZXJIZGxfcCA9PSAwKSB7CisJCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCQlnb3RvIEV4aXQ7CisJfQorCXBEYXRhID0gKHRFcGxUaW1lcnVEYXRhICopICogcFRpbWVySGRsX3A7CisJaWYgKCh0RXBsVGltZXJ1RGF0YSAqKSBwRGF0YS0+bV9UaW1lci5kYXRhICE9IHBEYXRhKSB7CisJCVJldCA9IGtFcGxUaW1lckludmFsaWRIYW5kbGU7CisJCWdvdG8gRXhpdDsKKwl9CisKKy8qICAgIGlmIChkZWxfdGltZXIoJnBEYXRhLT5tX1RpbWVyKSA9PSAxKQorICAgIHsKKyAgICAgICAga2ZyZWUocERhdGEpOworICAgIH0KKyovCisJLy8gdHJ5IHRvIGRlbGV0ZSB0aGUgdGltZXIKKwlkZWxfdGltZXIoJnBEYXRhLT5tX1RpbWVyKTsKKwkvLyBmcmVlIG1lbW9yeSBpbiBhbnkgY2FzZQorCWtmcmVlKHBEYXRhKTsKKworCS8vIHVuaW5pdGlhbGl6ZSBoYW5kbGUKKwkqcFRpbWVySGRsX3AgPSAwOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsVGltZXJ1SXNUaW1lckFjdGl2ZQorLy8KKy8vIERlc2NyaXB0aW9uOiBjaGVja3MgaWYgdGhlIHRpbWVyIHJlZmVyZW5jZWQgYnkgdGhlIGhhbmRsZSBpcyBjdXJyZW50bHkKKy8vICAgICAgICAgICAgICBhY3RpdmUuCisvLworLy8gUGFyYW1ldGVyczogIFRpbWVySGRsX3AgID0gaGFuZGxlIG9mIHRoZSB0aW1lciB0byBjaGVjaworLy8KKy8vIFJldHVybnM6ICAgICBCT09MICAgICAgICA9IFRSVUUsIGlmIGFjdGl2ZTsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCBvdGhlcndpc2UKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitCT09MIFBVQkxJQyBFcGxUaW1lcnVJc1RpbWVyQWN0aXZlKHRFcGxUaW1lckhkbCBUaW1lckhkbF9wKQoreworCUJPT0wgZkFjdGl2ZSA9IEZBTFNFOworCXRFcGxUaW1lcnVEYXRhICpwRGF0YTsKKworCS8vIGNoZWNrIGhhbmRsZSBpdHNlbGYsIGkuZS4gd2FzIHRoZSBoYW5kbGUgaW5pdGlhbGl6ZWQgYmVmb3JlCisJaWYgKFRpbWVySGRsX3AgPT0gMCkgewkvLyB0aW1lciB3YXMgbm90IGNyZWF0ZWQgeWV0LCBzbyBpdCBpcyBub3QgYWN0aXZlCisJCWdvdG8gRXhpdDsKKwl9CisJcERhdGEgPSAodEVwbFRpbWVydURhdGEgKikgVGltZXJIZGxfcDsKKwlpZiAoKHRFcGxUaW1lcnVEYXRhICopIHBEYXRhLT5tX1RpbWVyLmRhdGEgIT0gcERhdGEpIHsJLy8gaW52YWxpZCB0aW1lcgorCQlnb3RvIEV4aXQ7CisJfQorCS8vIGNoZWNrIGlmIHRpbWVyIGlzIHJ1bm5pbmcKKwlpZiAodGltZXJfcGVuZGluZygmcERhdGEtPm1fVGltZXIpID09IDApIHsJLy8gdGltZXIgaXMgbm90IHJ1bm5pbmcKKwkJZ290byBFeGl0OworCX0KKworCWZBY3RpdmUgPSBUUlVFOworCisgICAgICBFeGl0OgorCXJldHVybiBmQWN0aXZlOworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsVGltZXJ1Q2JNcworLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiB0byBwcm9jZXNzIHRpbWVyCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgbHBQYXJhbWV0ZXIgPSBwb2ludGVyIHRvIHN0cnVjdHVyIG9mIHR5cGUgdEVwbFRpbWVydURhdGEKKy8vCisvLworLy8gUmV0dXJuczogICAgIChub25lKQorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHZvaWQgUFVCTElDIEVwbFRpbWVydUNiTXModW5zaWduZWQgbG9uZyB1bFBhcmFtZXRlcl9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdEVwbFRpbWVydURhdGEgKnBEYXRhOworCXRFcGxFdmVudCBFcGxFdmVudDsKKwl0RXBsVGltZXJFdmVudEFyZyBUaW1lckV2ZW50QXJnOworCisJcERhdGEgPSAodEVwbFRpbWVydURhdGEgKikgdWxQYXJhbWV0ZXJfcDsKKworCS8vIGNhbGwgZXZlbnQgZnVuY3Rpb24KKwlUaW1lckV2ZW50QXJnLm1fVGltZXJIZGwgPSAodEVwbFRpbWVySGRsKSBwRGF0YTsKKwlUaW1lckV2ZW50QXJnLm1fdWxBcmcgPSBwRGF0YS0+VGltZXJBcmd1bWVudC5tX3VsQXJnOworCisJRXBsRXZlbnQubV9FdmVudFNpbmsgPSBwRGF0YS0+VGltZXJBcmd1bWVudC5tX0V2ZW50U2luazsKKwlFcGxFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVUaW1lcjsKKwlFUExfTUVNU0VUKCZFcGxFdmVudC5tX05ldFRpbWUsIDB4MDAsIHNpemVvZih0RXBsTmV0VGltZSkpOworCUVwbEV2ZW50Lm1fcEFyZyA9ICZUaW1lckV2ZW50QXJnOworCUVwbEV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKFRpbWVyRXZlbnRBcmcpOworCisJUmV0ID0gRXBsRXZlbnR1UG9zdCgmRXBsRXZlbnQpOworCisJLy8gZC5rLiBkbyBub3QgZnJlZSBtZW1vcnksIHVzZXIgaGFzIHRvIGNhbGwgRXBsVGltZXJ1RGVsZXRlVGltZXIoKQorCS8va2ZyZWUocERhdGEpOworCit9CisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxUaW1lcnVOdWxsLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFRpbWVydU51bGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGNlNDAzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxUaW1lcnVOdWxsLmMKQEAgLTAsMCArMSwzMTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgRXBsIFVzZXJzcGFjZS1UaW1lcm1vZHVsZSBOVUxMLUltcGxlbWVudGF0aW9uCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsVGltZXJ1TnVsbC5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgIEtFSUwgdVZpc2lvbiAyCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNy8wNiBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAidXNlci9FcGxUaW1lcnUuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEMgTCBBIFMgUyAgPEVwbCBVc2Vyc3BhY2UtVGltZXJtb2R1bGUgTlVMTC1JbXBsZW1lbnRhdGlvbj4gICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLworLy8gRGVzY3JpcHRpb246IEVwbCBVc2Vyc3BhY2UtVGltZXJtb2R1bGUgTlVMTC1JbXBsZW1lbnRhdGlvbgorLy8KKy8vCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsVGltZXJ1SW5pdAorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBpbml0IGZpcnN0IGluc3RhbmNlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVydUluaXQoKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0gRXBsVGltZXJ1QWRkSW5zdGFuY2UoKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFRpbWVydUFkZEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGluaXQgYWRkaXRpb25hbCBpbnN0YW5jZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcnVBZGRJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFRpbWVydURlbEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGRlbHRlIGluc3RhbmNlCisvLyAgICAgICAgICAgICAgLT4gdW5kZXIgV2luMzIgbm90aGluZyB0byBkbworLy8gICAgICAgICAgICAgIC0+IG5vIGluc3RuYWNlIHRhYmxlIG5lZWRlZAorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcnVEZWxJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFRpbWVydVNldFRpbWVyTXMKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gY3JlYXRlIGEgdGltZXIgYW5kIHJldHVybiBhIGhhbmRsZSB0byB0aGUgcG9pbnRlcgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHBUaW1lckhkbF9wID0gcG9pbnRlciB0byBhIGJ1ZmZlciB0byBmaWxsIGluIHRoZSBoYW5kbGUKKy8vICAgICAgICAgICAgICB1bFRpbWVfcCAgICA9IHRpbWUgZm9yIHRpbWVyIGluIG1zCisvLyAgICAgICAgICAgICAgQXJndW1lbnRfcCAgPSBhcmd1bWVudCBmb3IgdGltZXIKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcnVTZXRUaW1lck1zKHRFcGxUaW1lckhkbCAqIHBUaW1lckhkbF9wLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdWxUaW1lX3AsCisJCQkJICAgICAgdEVwbFRpbWVyQXJnIEFyZ3VtZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGNoZWNrIGhhbmRsZQorCWlmIChwVGltZXJIZGxfcCA9PSBOVUxMKSB7CisJCVJldCA9IGtFcGxUaW1lckludmFsaWRIYW5kbGU7CisJCWdvdG8gRXhpdDsKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFRpbWVydU1vZGlmeVRpbWVyTXMKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gY2hhbmdlIGEgdGltZXIgYW5kIHJldHVybiBhIGhhbmRsZSB0byB0aGUgcG9pbnRlcgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHBUaW1lckhkbF9wID0gcG9pbnRlciB0byBhIGJ1ZmZlciB0byBmaWxsIGluIHRoZSBoYW5kbGUKKy8vICAgICAgICAgICAgICB1bFRpbWVfcCAgICA9IHRpbWUgZm9yIHRpbWVyIGluIG1zCisvLyAgICAgICAgICAgICAgQXJndW1lbnRfcCAgPSBhcmd1bWVudCBmb3IgdGltZXIKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcnVNb2RpZnlUaW1lck1zKHRFcGxUaW1lckhkbCAqIHBUaW1lckhkbF9wLAorCQkJCQkgdW5zaWduZWQgbG9uZyB1bFRpbWVfcCwKKwkJCQkJIHRFcGxUaW1lckFyZyBBcmd1bWVudF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBjaGVjayBwYXJhbWV0ZXIKKwlpZiAocFRpbWVySGRsX3AgPT0gTlVMTCkgeworCQlSZXQgPSBrRXBsVGltZXJJbnZhbGlkSGFuZGxlOworCQlnb3RvIEV4aXQ7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKyAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxUaW1lcnVEZWxldGVUaW1lcgorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBkZWx0ZSBhIHRpbWVyCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFRpbWVySGRsX3AgPSBwb2ludGVyIHRvIGEgYnVmZmVyIHRvIGZpbGwgaW4gdGhlIGhhbmRsZQorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVydURlbGV0ZVRpbWVyKHRFcGxUaW1lckhkbCAqIHBUaW1lckhkbF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBjaGVjayBwYXJhbWV0ZXIKKwlpZiAocFRpbWVySGRsX3AgPT0gTlVMTCkgeworCQlSZXQgPSBrRXBsVGltZXJJbnZhbGlkSGFuZGxlOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIHNldCBoYW5kbGUgaW52YWxpZGUKKwkqcFRpbWVySGRsX3AgPSAwOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7CisKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxUaW1lcnVXaW4zMi5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxUaW1lcnVXaW4zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NjdiNGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFRpbWVydVdpbjMyLmMKQEAgLTAsMCArMSw1MTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBzb3VyY2UgZmlsZSBmb3IgRXBsIFVzZXJzcGFjZS1UaW1lcm1vZHVsZSBmb3IgV2luMzIKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxUaW1lcnVXaW4zMi5jLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDcvMDYgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInVzZXIvRXBsVGltZXJ1LmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbFRpbWVyQXJnIFRpbWVyQXJndW1lbnQ7CisJSEFORExFIERlbHRlSGFuZGxlOworCXVuc2lnbmVkIGxvbmcgdWxUaW1lb3V0OworCit9IHRFcGxUaW1lcnVUaHJlYWQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlMUENSSVRJQ0FMX1NFQ1RJT04gbV9wQ3JpdGljYWxTZWN0aW9uOworCUNSSVRJQ0FMX1NFQ1RJT04gbV9Dcml0aWNhbFNlY3Rpb247Cit9IHRFcGxUaW1lcnVJbnN0YW5jZTsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdEVwbFRpbWVydUluc3RhbmNlIEVwbFRpbWVydUluc3RhbmNlX2c7CitzdGF0aWMgdEVwbFRpbWVydVRocmVhZCBUaHJlYWREYXRhX2w7CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0RXT1JEIFBVQkxJQyBFcGxTZG9UaW1lcnVUaHJlYWRtcyhMUFZPSUQgbHBQYXJhbWV0ZXIpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBDIEwgQSBTIFMgIDxFcGwgVXNlcnNwYWNlLVRpbWVybW9kdWxlIGZvciBXaW4zMj4gICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8KKy8vIERlc2NyaXB0aW9uOiBFcGwgVXNlcnNwYWNlLVRpbWVybW9kdWxlIGZvciBXaW4zMgorLy8KKy8vCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsVGltZXJ1SW5pdAorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBpbml0IGZpcnN0IGluc3RhbmNlCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVydUluaXQoKQoreworCXRFcGxLZXJuZWwgUmV0OworCisJUmV0ID0gRXBsVGltZXJ1QWRkSW5zdGFuY2UoKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFRpbWVydUFkZEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGluaXQgYWRkaXRpb25hbCBpbnN0YW5jZQorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcnVBZGRJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGNyZWF0ZSBjcml0aWNhbCBzZWN0aW9uCisJRXBsVGltZXJ1SW5zdGFuY2VfZy5tX3BDcml0aWNhbFNlY3Rpb24gPQorCSAgICAmRXBsVGltZXJ1SW5zdGFuY2VfZy5tX0NyaXRpY2FsU2VjdGlvbjsKKwlJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKEVwbFRpbWVydUluc3RhbmNlX2cubV9wQ3JpdGljYWxTZWN0aW9uKTsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFRpbWVydURlbEluc3RhbmNlCisvLworLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGRlbHRlIGluc3RhbmNlCisvLyAgICAgICAgICAgICAgLT4gdW5kZXIgV2luMzIgbm90aGluZyB0byBkbworLy8gICAgICAgICAgICAgIC0+IG5vIGluc3RuYWNlIHRhYmxlIG5lZWRlZAorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcnVEZWxJbnN0YW5jZSgpCit7CisJdEVwbEtlcm5lbCBSZXQ7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCXJldHVybiBSZXQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFRpbWVydVNldFRpbWVyTXMKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gY3JlYXRlIGEgdGltZXIgYW5kIHJldHVybiBhIGhhbmRsZSB0byB0aGUgcG9pbnRlcgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHBUaW1lckhkbF9wID0gcG9pbnRlciB0byBhIGJ1ZmZlciB0byBmaWxsIGluIHRoZSBoYW5kbGUKKy8vICAgICAgICAgICAgICB1bFRpbWVfcCAgICA9IHRpbWUgZm9yIHRpbWVyIGluIG1zCisvLyAgICAgICAgICAgICAgQXJndW1lbnRfcCAgPSBhcmd1bWVudCBmb3IgdGltZXIKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcnVTZXRUaW1lck1zKHRFcGxUaW1lckhkbCAqIHBUaW1lckhkbF9wLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdWxUaW1lX3AsCisJCQkJICAgICAgdEVwbFRpbWVyQXJnIEFyZ3VtZW50X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJSEFORExFIERlbGV0ZUhhbmRsZTsKKwlIQU5ETEUgVGhyZWFkSGFuZGxlOworCURXT1JEIFRocmVhZElkOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBjaGVjayBoYW5kbGUKKwlpZiAocFRpbWVySGRsX3AgPT0gTlVMTCkgeworCQlSZXQgPSBrRXBsVGltZXJJbnZhbGlkSGFuZGxlOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGVudGVyICBjcml0aWNhbCBzZWN0aW9uCisJRW50ZXJDcml0aWNhbFNlY3Rpb24oRXBsVGltZXJ1SW5zdGFuY2VfZy5tX3BDcml0aWNhbFNlY3Rpb24pOworCisJLy8gZmlyc3QgY3JlYXRlIGV2ZW50IHRvIGRlbGV0ZSB0aW1lcgorCURlbGV0ZUhhbmRsZSA9IENyZWF0ZUV2ZW50KE5VTEwsIEZBTFNFLCBGQUxTRSwgTlVMTCk7CisJaWYgKERlbGV0ZUhhbmRsZSA9PSBOVUxMKSB7CisJCVJldCA9IGtFcGxUaW1lck5vVGltZXJDcmVhdGVkOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIHNldCBoYW5kbGUgZm9yIGNhbGxlcgorCSpwVGltZXJIZGxfcCA9ICh0RXBsVGltZXJIZGwpIERlbGV0ZUhhbmRsZTsKKworCS8vIGZpbGwgZGF0YSBmb3IgdGhyZWFkCisJVGhyZWFkRGF0YV9sLkRlbHRlSGFuZGxlID0gRGVsZXRlSGFuZGxlOworCUVQTF9NRU1DUFkoJlRocmVhZERhdGFfbC5UaW1lckFyZ3VtZW50LCAmQXJndW1lbnRfcCwKKwkJICAgc2l6ZW9mKHRFcGxUaW1lckFyZykpOworCVRocmVhZERhdGFfbC51bFRpbWVvdXQgPSB1bFRpbWVfcDsKKworCS8vIGNyZWF0ZSB0aHJlYWQgdG8gY3JlYXRlIHdhaXRhYmxlIHRpbWVyIGFuZCB3YWl0IGZvciB0aW1lcgorCVRocmVhZEhhbmRsZSA9IENyZWF0ZVRocmVhZChOVUxMLAorCQkJCSAgICAwLAorCQkJCSAgICBFcGxTZG9UaW1lcnVUaHJlYWRtcywKKwkJCQkgICAgJlRocmVhZERhdGFfbCwgMCwgJlRocmVhZElkKTsKKwlpZiAoVGhyZWFkSGFuZGxlID09IE5VTEwpIHsKKwkJLy8gbGVhdmUgY3JpdGljYWwgc2VjdGlvbgorCQlMZWF2ZUNyaXRpY2FsU2VjdGlvbihFcGxUaW1lcnVJbnN0YW5jZV9nLm1fcENyaXRpY2FsU2VjdGlvbik7CisKKwkJLy8gZGVsdGUgaGFuZGxlCisJCUNsb3NlSGFuZGxlKERlbGV0ZUhhbmRsZSk7CisKKwkJUmV0ID0ga0VwbFRpbWVyTm9UaW1lckNyZWF0ZWQ7CisJCWdvdG8gRXhpdDsKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFRpbWVydU1vZGlmeVRpbWVyTXMKKy8vCisvLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gY2hhbmdlIGEgdGltZXIgYW5kIHJldHVybiBhIGhhbmRsZSB0byB0aGUgcG9pbnRlcgorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIHBUaW1lckhkbF9wID0gcG9pbnRlciB0byBhIGJ1ZmZlciB0byBmaWxsIGluIHRoZSBoYW5kbGUKKy8vICAgICAgICAgICAgICB1bFRpbWVfcCAgICA9IHRpbWUgZm9yIHRpbWVyIGluIG1zCisvLyAgICAgICAgICAgICAgQXJndW1lbnRfcCAgPSBhcmd1bWVudCBmb3IgdGltZXIKKy8vCisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgID0gZXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcnVNb2RpZnlUaW1lck1zKHRFcGxUaW1lckhkbCAqIHBUaW1lckhkbF9wLAorCQkJCQkgdW5zaWduZWQgbG9uZyB1bFRpbWVfcCwKKwkJCQkJIHRFcGxUaW1lckFyZyBBcmd1bWVudF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCUhBTkRMRSBEZWxldGVIYW5kbGU7CisJSEFORExFIFRocmVhZEhhbmRsZTsKKwlEV09SRCBUaHJlYWRJZDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy8gY2hlY2sgcGFyYW1ldGVyCisJaWYgKHBUaW1lckhkbF9wID09IE5VTEwpIHsKKwkJUmV0ID0ga0VwbFRpbWVySW52YWxpZEhhbmRsZTsKKwkJZ290byBFeGl0OworCX0KKworCURlbGV0ZUhhbmRsZSA9IChIQU5ETEUpICgqcFRpbWVySGRsX3ApOworCisJLy8gc2V0IGV2ZW50IHRvIGVuZCB0aW1lciB0YXNrIGZvciB0aGlzIHRpbWVyCisJU2V0RXZlbnQoRGVsZXRlSGFuZGxlKTsKKworCS8vIGNyZWF0ZSBuZXcgdGltZXIKKwkvLyBmaXJzdCBjcmVhdGUgZXZlbnQgdG8gZGVsZXRlIHRpbWVyCisJRGVsZXRlSGFuZGxlID0gQ3JlYXRlRXZlbnQoTlVMTCwgRkFMU0UsIEZBTFNFLCBOVUxMKTsKKwlpZiAoRGVsZXRlSGFuZGxlID09IE5VTEwpIHsKKwkJUmV0ID0ga0VwbFRpbWVyTm9UaW1lckNyZWF0ZWQ7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gc2V0IGhhbmRsZSBmb3IgY2FsbGVyCisJKnBUaW1lckhkbF9wID0gKHRFcGxUaW1lckhkbCkgRGVsZXRlSGFuZGxlOworCisJLy8gZW50ZXIgIGNyaXRpY2FsIHNlY3Rpb24KKwlFbnRlckNyaXRpY2FsU2VjdGlvbihFcGxUaW1lcnVJbnN0YW5jZV9nLm1fcENyaXRpY2FsU2VjdGlvbik7CisKKwkvLyBmaWxsIGRhdGEgZm9yIHRocmVhZAorCVRocmVhZERhdGFfbC5EZWx0ZUhhbmRsZSA9IERlbGV0ZUhhbmRsZTsKKwlFUExfTUVNQ1BZKCZUaHJlYWREYXRhX2wuVGltZXJBcmd1bWVudCwgJkFyZ3VtZW50X3AsCisJCSAgIHNpemVvZih0RXBsVGltZXJBcmcpKTsKKwlUaHJlYWREYXRhX2wudWxUaW1lb3V0ID0gdWxUaW1lX3A7CisKKwkvLyBjcmVhdGUgdGhyZWFkIHRvIGNyZWF0ZSB3YWl0YWJsZSB0aW1lciBhbmQgd2FpdCBmb3IgdGltZXIKKwlUaHJlYWRIYW5kbGUgPSBDcmVhdGVUaHJlYWQoTlVMTCwKKwkJCQkgICAgMCwKKwkJCQkgICAgRXBsU2RvVGltZXJ1VGhyZWFkbXMsCisJCQkJICAgICZUaHJlYWREYXRhX2wsIDAsICZUaHJlYWRJZCk7CisJaWYgKFRocmVhZEhhbmRsZSA9PSBOVUxMKSB7CisJCS8vIGxlYXZlIGNyaXRpY2FsIHNlY3Rpb24KKwkJTGVhdmVDcml0aWNhbFNlY3Rpb24oRXBsVGltZXJ1SW5zdGFuY2VfZy5tX3BDcml0aWNhbFNlY3Rpb24pOworCisJCS8vIGRlbHRlIGhhbmRsZQorCisJCVJldCA9IGtFcGxUaW1lck5vVGltZXJDcmVhdGVkOworCQlnb3RvIEV4aXQ7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7Cit9CisKKyAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxUaW1lcnVEZWxldGVUaW1lcgorLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBkZWx0ZSBhIHRpbWVyCisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFRpbWVySGRsX3AgPSBwb2ludGVyIHRvIGEgYnVmZmVyIHRvIGZpbGwgaW4gdGhlIGhhbmRsZQorLy8KKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgPSBlcnJvcmNvZGUKKy8vCisvLworLy8gU3RhdGU6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVydURlbGV0ZVRpbWVyKHRFcGxUaW1lckhkbCAqIHBUaW1lckhkbF9wKQoreworCXRFcGxLZXJuZWwgUmV0OworCUhBTkRMRSBEZWxldGVIYW5kbGU7CisKKwlSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGNoZWNrIHBhcmFtZXRlcgorCWlmIChwVGltZXJIZGxfcCA9PSBOVUxMKSB7CisJCVJldCA9IGtFcGxUaW1lckludmFsaWRIYW5kbGU7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlEZWxldGVIYW5kbGUgPSAoSEFORExFKSAoKnBUaW1lckhkbF9wKTsKKworCS8vIHNldCBldmVudCB0byBlbmQgdGltZXIgdGFzayBmb3IgdGhpcyB0aW1lcgorCVNldEV2ZW50KERlbGV0ZUhhbmRsZSk7CisKKwkvLyBzZXQgaGFuZGxlIGludmFsaWRlCisJKnBUaW1lckhkbF9wID0gMDsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworCit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxTZG9UaW1lcnVUaHJlYWRtcworLy8KKy8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiB0byBwcm9jZXNzIHRpbWVyIGFzIHRocmVhZAorLy8KKy8vCisvLworLy8gUGFyYW1ldGVyczogIGxwUGFyYW1ldGVyID0gcG9pbnRlciB0byBzdHJ1Y3R1ciBvZiB0eXBlIHRFcGxUaW1lcnVUaHJlYWQKKy8vCisvLworLy8gUmV0dXJuczogICAgIERXT1JEID0gRXJyb3Jjb2RlCisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitEV09SRCBQVUJMSUMgRXBsU2RvVGltZXJ1VGhyZWFkbXMoTFBWT0lEIGxwUGFyYW1ldGVyKQoreworCXRFcGxLZXJuZWwgUmV0OworCXRFcGxUaW1lcnVUaHJlYWQgKnBUaHJlYWREYXRhOworCUhBTkRMRSBhSGFuZGxlc1syXTsKKwlCT09MIGZSZXR1cm47CisJTEFSR0VfSU5URUdFUiBUaW1lb3V0VGltZTsKKwl1bnNpZ25lZCBsb25nIHVsRXZlbnQ7CisJdEVwbEV2ZW50IEVwbEV2ZW50OworCXRFcGxUaW1lcnVUaHJlYWQgVGhyZWFkRGF0YTsKKwl0RXBsVGltZXJFdmVudEFyZyBUaW1lckV2ZW50QXJnOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBnZXQgcG9pbnRlciB0byBkYXRhCisJcFRocmVhZERhdGEgPSAodEVwbFRpbWVydVRocmVhZCAqKSBscFBhcmFtZXRlcjsKKwkvLyBjb3B5IHRocmVhZCBkYXRhCisJRVBMX01FTUNQWSgmVGhyZWFkRGF0YSwgcFRocmVhZERhdGEsIHNpemVvZihUaHJlYWREYXRhKSk7CisJcFRocmVhZERhdGEgPSAmVGhyZWFkRGF0YTsKKworCS8vIGxlYXZlIGNyaXRpY2FsIHNlY3Rpb24KKwlMZWF2ZUNyaXRpY2FsU2VjdGlvbihFcGxUaW1lcnVJbnN0YW5jZV9nLm1fcENyaXRpY2FsU2VjdGlvbik7CisKKwkvLyBjcmVhdGUgd2FpdGFibGUgdGltZXIKKwlhSGFuZGxlc1sxXSA9IENyZWF0ZVdhaXRhYmxlVGltZXIoTlVMTCwgRkFMU0UsIE5VTEwpOworCWlmIChhSGFuZGxlc1sxXSA9PSBOVUxMKSB7CisJCVJldCA9IGtFcGxUaW1lck5vVGltZXJDcmVhdGVkOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIHNldCB0aW1lcgorCS8vIHNldCB0aW1lb3V0IGludGVydmFsIC0+IG5lZWRlZCB0byBiZSBuZWdhdGl2CisJLy8gLT4gYmVjYXVzZSByZWxhdGl2ZSB0aW1lb3V0CisJLy8gLT4gbXVsdGlwbHkgYnkgMTAwMDAgZm9yIDEwMCBucyB0aW1lYmFzZSBvZiBmdW5jdGlvbgorCVRpbWVvdXRUaW1lLlF1YWRQYXJ0ID0gKCgobG9uZyBsb25nKXBUaHJlYWREYXRhLT51bFRpbWVvdXQpICogLTEwMDAwKTsKKwlmUmV0dXJuID0gU2V0V2FpdGFibGVUaW1lcihhSGFuZGxlc1sxXSwKKwkJCQkgICAmVGltZW91dFRpbWUsIDAsIE5VTEwsIE5VTEwsIEZBTFNFKTsKKwlpZiAoZlJldHVybiA9PSAwKSB7CisJCVJldCA9IGtFcGxUaW1lck5vVGltZXJDcmVhdGVkOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIHNhdmUgZGVsdGUgZXZlbnQgaGFuZGxlIGluIGhhbmRsZSBhcnJheQorCWFIYW5kbGVzWzBdID0gcFRocmVhZERhdGEtPkRlbHRlSGFuZGxlOworCisJLy8gd2FpdCBmb3Igb25lIG9mIHRoZSBldmVudHMKKwl1bEV2ZW50ID0gV2FpdEZvck11bHRpcGxlT2JqZWN0cygyLCAmYUhhbmRsZXNbMF0sIEZBTFNFLCBJTkZJTklURSk7CisJaWYgKHVsRXZlbnQgPT0gV0FJVF9PQkpFQ1RfMCkgewkvLyBkZWx0ZSBldmVudAorCisJCS8vIGNsb3NlIGhhbmRlbHMKKwkJQ2xvc2VIYW5kbGUoYUhhbmRsZXNbMV0pOworCQkvLyB0ZXJtaW5hdGUgdGhyZWFkCisJCWdvdG8gRXhpdDsKKwl9IGVsc2UgaWYgKHVsRXZlbnQgPT0gKFdBSVRfT0JKRUNUXzAgKyAxKSkgewkvLyB0aW1lciBldmVudAorCQkvLyBjYWxsIGV2ZW50IGZ1bmN0aW9uCisJCVRpbWVyRXZlbnRBcmcubV9UaW1lckhkbCA9CisJCSAgICAodEVwbFRpbWVySGRsKSBwVGhyZWFkRGF0YS0+RGVsdGVIYW5kbGU7CisJCVRpbWVyRXZlbnRBcmcubV91bEFyZyA9IHBUaHJlYWREYXRhLT5UaW1lckFyZ3VtZW50Lm1fdWxBcmc7CisKKwkJRXBsRXZlbnQubV9FdmVudFNpbmsgPSBwVGhyZWFkRGF0YS0+VGltZXJBcmd1bWVudC5tX0V2ZW50U2luazsKKwkJRXBsRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlVGltZXI7CisJCUVQTF9NRU1TRVQoJkVwbEV2ZW50Lm1fTmV0VGltZSwgMHgwMCwgc2l6ZW9mKHRFcGxOZXRUaW1lKSk7CisJCUVwbEV2ZW50Lm1fcEFyZyA9ICZUaW1lckV2ZW50QXJnOworCQlFcGxFdmVudC5tX3VpU2l6ZSA9IHNpemVvZihUaW1lckV2ZW50QXJnKTsKKworCQlSZXQgPSBFcGxFdmVudHVQb3N0KCZFcGxFdmVudCk7CisKKwkJLy8gY2xvc2UgaGFuZGVscworCQlDbG9zZUhhbmRsZShhSGFuZGxlc1sxXSk7CisJCS8vIHRlcm1pbmF0ZSB0aHJlYWQKKwkJZ290byBFeGl0OworCisJfSBlbHNlIHsJCS8vIGVycm9yCisJCXVsRXZlbnQgPSBHZXRMYXN0RXJyb3IoKTsKKwkJVFJBQ0UxKCJFcnJvciBpbiBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzIEVycm9yY29kZTogMHgleFxuIiwKKwkJICAgICAgIHVsRXZlbnQpOworCQkvLyB0ZXJtaW5hdGUgdGhyZWFkCisJCWdvdG8gRXhpdDsKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFJldDsKK30KKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFZlcnNpb24uaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsVmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NTcwZDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VwbFZlcnNpb24uaApAQCAtMCwwICsxLDk4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIEVQTCB2ZXJzaW9uIGZvciB0aGUgc3RhY2ssIGFzIHN0cmluZworICAgICAgICAgICAgICAgIGFuZCBmb3Igb2JqZWN0IDB4MTAxOCB3aXRoaW4gb2JqZWN0IGRpY3Rpb25hcnkuCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsVmVyc2lvbi5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBhbGwKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRVBMX1ZFUlNJT05fSF8KKyNkZWZpbmUgX0VQTF9WRVJTSU9OX0hfCisKKy8vIE5PVEU6CisvLyBBbGwgdmVyc2lvbiBtYWNyb3Mgc2hvdWxkIGNvbnRhaW4gdGhlIHNhbWUgdmVyc2lvbiBudW1iZXIuIEJ1dCBkbyBub3QgdXNlCisvLyBkZWZpbmVzIGluc3RlYWQgb2YgdGhlIG51bWJlcnMuIEJlY2F1c2UgdGhlIG1hY3JvIEVQTF9TVFJJTkdfVkVSU0lPTigpIGNhbiBub3QKKy8vIGNvbnZlcnQgYSBkZWZpbmUgdG8gYSBzdHJpbmcuCisvLworLy8gRm9ybWF0OiBtYWoubWluLmJ1aWxkCisvLyAgICAgICAgIG1haiAgICAgICAgICAgID0gbWFqb3IgdmVyc2lvbgorLy8gICAgICAgICAgICAgbWluICAgICAgICA9IG1pbm9yIHZlcnNpb24gKHdpbGwgYmUgc2V0IHRvIDAgaWYgbWFqb3IgdmVyc2lvbiB3aWxsIGJlIGluY3JlbWVudGVkKQorLy8gICAgICAgICAgICAgICAgIGJ1aWxkICA9IGN1cnJlbnQgYnVpbGQgKHdpbGwgYmUgc2V0IHRvIDAgaWYgbWlub3IgdmVyc2lvbiB3aWxsIGJlIGluY3JlbWVudGVkKQorLy8KKyNkZWZpbmUgREVGSU5FRF9TVEFDS19WRVJTSU9OICAgICAgIEVQTF9TVEFDS19WRVJTSU9OICAgKDEsIDMsIDApCisjZGVmaW5lIERFRklORURfT0JKMTAxOF9WRVJTSU9OICAgICBFUExfT0JKMTAxOF9WRVJTSU9OICgxLCAzLCAwKQorI2RlZmluZSBERUZJTkVEX1NUUklOR19WRVJTSU9OICAgICAgRVBMX1NUUklOR19WRVJTSU9OICAoMSwgMywgMCkKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRVBMX1BST0RVQ1RfTkFNRSAgICAgICAgICAgICJFUEwgVjIiCisjZGVmaW5lIEVQTF9QUk9EVUNUX1ZFUlNJT04gICAgICAgICBERUZJTkVEX1NUUklOR19WRVJTSU9OCisjZGVmaW5lIEVQTF9QUk9EVUNUX01BTlVGQUNUVVJFUiAgICAiU1lTIFRFQyBlbGVjdHJvbmljIEdtYkgiCisKKyNkZWZpbmUgRVBMX1BST0RVQ1RfS0VZICAgICAgICAgIlNPLTEwODMiCisjZGVmaW5lIEVQTF9QUk9EVUNUX0RFU0NSSVBUSU9OICJvcGVuUE9XRVJMSU5LIFByb3RvY29sIFN0YWNrIFNvdXJjZSIKKworI2VuZGlmIC8vIF9FUExfVkVSU0lPTl9IXworCisvLyBEaWUgbGV0enRlIFplaWxlIG113yB1bmJlZGluZ3QgZWluZSBsZWVyZSBaZWlsZSBzZWluLCB3ZWlsIG1hbmNoZSBDb21waWxlcgorLy8gZGFtaXQgZWluIFByb2JsZW0gaGFiZW4sIHdlbm4gZGFzIG5pY2h0IHNvIGlzdCAoei5CLiBHTlUgb2RlciBCb3JsYW5kIEMrKyBCdWlsZGVyKS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjkzOWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9LY29uZmlnCkBAIC0wLDAgKzEsNiBAQAorY29uZmlnIEVQTAorCXRyaXN0YXRlICJvcGVuUE9XRVJMSU5LIHByb3RvY29sIHN0YWNrIgorCWRlcGVuZHMgb24gTkVUICYmIEhJR0hfUkVTX1RJTUVSUyAmJiBYODYKKwlkZWZhdWx0IE4KKwktLS1oZWxwLS0tCisJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIG9wZW5QT1dFUkxJTksgbmV0d29yayBwcm90b2NvbCBzdGFjay4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYzgyNDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL01ha2VmaWxlCkBAIC0wLDAgKzEsNDEgQEAKK29iai0kKENPTkZJR19FUEwpCSs9IGVwbC5vCisKK2VwbC1vYmpzIDo9IAlcCisJRXBsQXBpR2VuZXJpYy5vCQlcCisJRXBsQXBpTGludXhLZXJuZWwubwlcCisJRXBsQXBpUHJvY2Vzc0ltYWdlLm8JXAorCUVwbERsbGsubwkJXAorCUVwbERsbGtDYWwubwkJXAorCUVwbERsbHVDYWwubwkJXAorCUVwbEVycm9ySGFuZGxlcmsubwlcCisJRXBsRXZlbnRrLm8JCVwKKwlFcGxFdmVudHUubwkJXAorCUVwbElkZW50dS5vCQlcCisJRXBsTm10Q251Lm8JCVwKKwlFcGxObXRrLm8JCVwKKwlFcGxObXRrQ2FsLm8JCVwKKwlFcGxObXRNbnUubwkJXAorCUVwbE5tdHUubwkJXAorCUVwbE5tdHVDYWwubwkJXAorCUVwbE9iZC5vCQlcCisJRXBsT2Jka0NhbC5vCQlcCisJRXBsT2JkdS5vCQlcCisJRXBsT2JkdUNhbC5vCQlcCisJRXBsUGRvay5vCQlcCisJRXBsUGRva0NhbC5vCQlcCisJRXBsUGRvdS5vCQlcCisJRXBsU2RvQXNuZHUubwkJXAorCUVwbFNkb0FzeVNlcXUubwkJXAorCUVwbFNkb0NvbXUubwkJXAorCUVwbFNkb1VkcHUubwkJXAorCUVwbFN0YXR1c3UubwkJXAorCUVwbFRpbWVydUxpbnV4S2VybmVsLm8JXAorCWFtaXg4Ni5vCQlcCisJU2hhcmVkQnVmZi5vCQlcCisJU2hiSXBjLUxpbnV4S2VybmVsLm8JXAorCVRpbWVySGlnaFJlc2tYODYubwlcCisJVmlydHVhbEV0aGVybmV0TGludXgubwlcCisJU29ja2V0TGludXhLZXJuZWwubwlcCisJcHJvY19mcy5vCQlcCisJZGVtb19tYWluLm8JCVwKKwlFZHJ2ODEzOS5vCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL1NoYXJlZEJ1ZmYuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvU2hhcmVkQnVmZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmYjA5ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL1NoYXJlZEJ1ZmYuYwpAQCAtMCwwICsxLDE3OTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBQcm9qZWN0IGluZGVwZW5kZW5kIHNoYXJlZCBidWZmZXIgKGxpbmVhciArIGNpcmN1bGFyKQorCisgIERlc2NyaXB0aW9uOiAgSW1wbGVtZW50YXRpb24gb2YgcGxhdGZvcm0gaW5kZXBlbmRlbmQgcGFydCBmb3IgdGhlCisgICAgICAgICAgICAgICAgc2hhcmVkIGJ1ZmZlcgorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIDIwMDYvMDYvMjcgLXJzOiAgIFYgMS4wMCAoaW5pdGlhbCB2ZXJzaW9uKQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzIpCisKKyNpZmRlZiBVTkRFUl9SVFNTCisJLy8gUlRYIGhlYWRlcgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxwcm9jZXNzLmg+CisjaW5jbHVkZSA8cnRhcGkuaD4KKworI2VsaWYgX19CT1JMQU5EQ19fCisJLy8gYm9ybGFuZCBDIGhlYWRlcgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxwcm9jZXNzLmg+CisKKyNlbGlmIFdJTkNFCisjaW5jbHVkZSA8d2luZG93cy5oPgorCisjZWxzZQorCS8vIE1TVkMgbmVlZHMgdG8gaW5jbHVkZSB3aW5kb3dzLmggYXQgZmlyc3QKKwkvLyB0aGUgZm9sbG93aW5nIGRlZmluZXMgYXIgbmVjZXNzYXJ5IGZvciBmdW5jdGlvbiBwcm90b3R5cGVzIGZvciB3YWl0YWJsZSB0aW1lcnMKKyNkZWZpbmUgX1dJTjMyX1dJTkRPV1MgMHgwNDAxCisjZGVmaW5lIF9XSU4zMl9XSU5OVCAgIDB4MDQwMAorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxwcm9jZXNzLmg+CisjZW5kaWYKKworI2VuZGlmCisKKyNpbmNsdWRlICJnbG9iYWwuaCIKKyNpbmNsdWRlICJTaGFyZWRCdWZmLmgiCisjaW5jbHVkZSAiU2hiSXBjLmgiCisKKy8vIGQuay4gTGludXgga2VybmVsIG1vZHVsZXMgbmVlZHMgb3RoZXIgaGVhZGVyIGZpbGVzIGZvciBtZW1jcHkoKQorI2lmIChUQVJHRVRfU1lTVEVNID09IF9MSU5VWF8pICYmIGRlZmluZWQoX19LRVJORUxfXykKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNlbHNlCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgKCFkZWZpbmVkKFNIQVJFREJVRkZfSU5MSU5FRCkpIHx8IGRlZmluZWQoSU5MSU5FX0VOQUJMRUQpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgQ29uZmlndXJhdGlvbgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBDb25zdGFudCBkZWZpbml0aW9ucworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBTQkNfTUFHSUNfSUQgICAgMHg1MzQyNDMyMwkvLyBtYWdpYyBJRCAoIlNCQyMiKQorI2RlZmluZSBTQkxfTUFHSUNfSUQgICAgMHg1MzQyNEMyMwkvLyBtYWdpYyBJRCAoIlNCTCMiKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIExvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBzdHJ1Y3R1cmUgdG8gYWRtaW5pc3RyYXRlIGNpcmN1bGFyIHNoYXJlZCBidWZmZXIgaGVhZAordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgbV9TaGJDaXJNYWdpY0lEOwkvLyBtYWdpYyBJRCAoIlNCQyMiKQorCXVuc2lnbmVkIGxvbmcgbV91bEJ1ZmZlclRvdGFsU2l6ZTsJLy8gb3Zlci1hbGwgc2l6ZSBvZiBjb21wbGV0ZSBidWZmZXIKKwl1bnNpZ25lZCBsb25nIG1fdWxCdWZmZXJEYXRhU2l6ZTsJLy8gc2l6ZSBvZiBjb21wbGV0ZSBkYXRhIGFyZWEKKwl1bnNpZ25lZCBsb25nIG1fdWxXckluZGV4OwkvLyBjdXJyZW50IHdyaXRlIGluZGV4IChzZXQgYmV2b3JlIHdyaXRlKQorCXVuc2lnbmVkIGxvbmcgbV91bFJkSW5kZXg7CS8vIGN1cnJlbnQgcmVhZCBpbmRleCAoc2V0IGFmdGVyIHJlYWQpCisJdW5zaWduZWQgbG9uZyBtX3VsTnVtT2ZXcml0ZUpvYnM7CS8vIG51bWJlciBvZiBjdXJyZW50bHkgKHBhcmFsbGVsIHJ1bm5pbmcpIHdyaXRlIG9wZXJhdGlvbnMKKwl1bnNpZ25lZCBsb25nIG1fdWxEYXRhSW5Vc2U7CS8vIGN1cnJlbnRseSB1c2VkIGJ1ZmZlciBzaXplIChpbmNsLiB1bmNvbXBsZXRlZCB3cml0ZSBvcGVyYXRpb25zKQorCXVuc2lnbmVkIGxvbmcgbV91bERhdGFBcGVuZGVkOwkvLyBidWZmZXIgc2l6ZSBvZiBjb21wbGV0ZSBuZXcgd3JpdHRlbiBidXQgbm90IHlldCByZWFkYWJsZSBkYXRhIChpbiBjYXNlIG9mIG1fdWxOdW1PZldyaXRlSm9icz4xKQorCXVuc2lnbmVkIGxvbmcgbV91bEJsb2Nrc0FwZW5kZWQ7CS8vIG51bWJlciBvZiBjb21wbGV0ZSBuZXcgd3JpdHRlbiBidXQgbm90IHlldCByZWFkYWJsZSBkYXRhIGJsb2NrcyAoaW4gY2FzZSBvZiBtX3VsTnVtT2ZXcml0ZUpvYnM+MSkKKwl1bnNpZ25lZCBsb25nIG1fdWxEYXRhUmVhZGFibGU7CS8vIGJ1ZmZlciBzaXplIHdpdGggcmVhZGFibGUgKGNvbXBsZXRlIHdyaXR0ZW4pIGRhdGEKKwl1bnNpZ25lZCBsb25nIG1fdWxCbG9ja3NSZWFkYWJsZTsJLy8gbnVtYmVyIG9mIHJlYWRhYmxlIChjb21wbGV0ZSB3cml0dGVuKSBkYXRhIGJsb2NrcworCXRTaGJDaXJTaWdIbmRsck5ld0RhdGEgbV9wZm5TaWdIbmRsck5ld0RhdGE7CS8vIGFwcGxpY2F0aW9uIGhhbmRsZXIgdG8gc2lnbmFsIG5ldyBkYXRhCisJdW5zaWduZWQgaW50IG1fZkJ1ZmZlckxvY2tlZDsJLy8gVFJVRSBpZiBidWZmZXIgaXMgbG9ja2VkIChiZWNhdXNlIG9mIHBlbmRpbmcgcmVzZXQgcmVxdWVzdCkKKwl0U2hiQ2lyU2lnSG5kbHJSZXNldCBtX3BmblNpZ0huZGxyUmVzZXQ7CS8vIGFwcGxpY2F0aW9uIGhhbmRsZXIgdG8gc2lnbmFsIGJ1ZmZlciByZXNldCBpcyBkb25lCisJdW5zaWduZWQgY2hhciBtX0RhdGE7CS8vIHN0YXJ0IG9mIGRhdGEgYXJlYSAodGhlIHJlYWwgZGF0YSBzaXplIGlzIHVua25vd24gYXQgdGhpcyB0aW1lKQorCit9IHRTaGJDaXJCdWZmOworCisvLyBzdHJ1Y3R1cmUgdG8gYWRtaW5pc3RyYXRlIGxpbmVhciBzaGFyZWQgYnVmZmVyIGhlYWQKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgbV9TaGJMaW5NYWdpY0lEOwkvLyBtYWdpYyBJRCAoIlNCTCMiKQorCXVuc2lnbmVkIGxvbmcgbV91bEJ1ZmZlclRvdGFsU2l6ZTsJLy8gb3Zlci1hbGwgc2l6ZSBvZiBjb21wbGV0ZSBidWZmZXIKKwl1bnNpZ25lZCBsb25nIG1fdWxCdWZmZXJEYXRhU2l6ZTsJLy8gc2l6ZSBvZiBjb21wbGV0ZSBkYXRhIGFyZWEKKwl1bnNpZ25lZCBjaGFyIG1fRGF0YTsJLy8gc3RhcnQgb2YgZGF0YSBhcmVhICh0aGUgcmVhbCBkYXRhIHNpemUgaXMgdW5rbm93biBhdCB0aGlzIHRpbWUpCisKK30gdFNoYkxpbkJ1ZmY7CisKKy8vIHR5cGUgdG8gc2F2ZSBzaXplIG9mIGEgc2luZ2xlIGRhdGEgYmxvY2sgaW5zaWRlIHRoZSBjaXJjdWxhciBzaGFyZWQgYnVmZmVyCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IG1fdWlGdWxsQmxvY2tTaXplOjI4OwkvLyBhIHNpbmdsZSBibG9jayBtdXN0IG5vdCBleGNlZWQgYSBsZW5ndGggb2YgMjU2TUJ5dGUgOi0pCisJdW5zaWduZWQgaW50IG1fdWlBbGlnbkZpbGxCeXRlczo0OworCit9IHRTaGJDaXJCbG9ja1NpemU7CisKKyNkZWZpbmUgU0JDX0JMT0NLX0FMSUdOTUVOVCAgICAgICAgICAgICAgICAgIDQJLy8gYWxpZ25tZW50IG11c3QgKm5vdCogYmUgbG93ZXIgdGhhbiBzaXplb2YodFNoYkNpckJsb2NrU2l6ZSkhCisjZGVmaW5lIFNCQ19NQVhfQkxPQ0tfU0laRSAgICAgICAgICgoMTw8MjgpLTEpCS8vID0gKDJeMjggLSAxKSA9ICgyNTZNQnl0ZSAtIDEpIC0+IHNob3VsZCBiZSBlbm91Z2h0IGZvciByZWFsIGxpZmUgOi0pCisKKyNkZWZpbmUgU0JMX0JMT0NLX0FMSUdOTUVOVCAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgU0JMX01BWF9CTE9DS19TSVpFICAgICAgICAgKCgxPDwyOCktMSkJLy8gPSAoMl4yOCAtIDEpID0gKDI1Nk1CeXRlIC0gMSkgLT4gc2hvdWxkIGJlIGVub3VnaHQgZm9yIHJlYWwgbGlmZSA6LSkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBHbG9iYWwgdmFyaWFibGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIExvY2FsIHZhcmlhYmxlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBQcm90b3R5cGVzIG9mIGludGVybmFsIGZ1bmN0aW9ucworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBHZXQgcG9pbnRlciB0byBDaXJjdWxhciBTaGFyZWQgQnVmZmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYkNpckJ1ZmYgKlNoYkNpckdldEJ1ZmZlcih0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApCit7CisKKwl0U2hiQ2lyQnVmZiAqcFNoYkNpckJ1ZmY7CisKKwlwU2hiQ2lyQnVmZiA9ICh0U2hiQ2lyQnVmZiAqKSBTaGJJcGNHZXRTaE1lbVB0cihwU2hiSW5zdGFuY2VfcCk7CisJQVNTRVJUKHBTaGJDaXJCdWZmLT5tX1NoYkNpck1hZ2ljSUQgPT0gU0JDX01BR0lDX0lEKTsKKworCXJldHVybiAocFNoYkNpckJ1ZmYpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgR2V0IHBvaW50ZXIgdG8gTGluZWFyIFNoYXJlZCBCdWZmZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiTGluQnVmZiAqU2hiTGluR2V0QnVmZmVyKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCkKK3sKKworCXRTaGJMaW5CdWZmICpwU2hiTGluQnVmZjsKKworCXBTaGJMaW5CdWZmID0gKHRTaGJMaW5CdWZmICopIFNoYklwY0dldFNoTWVtUHRyKHBTaGJJbnN0YW5jZV9wKTsKKwlBU1NFUlQocFNoYkxpbkJ1ZmYtPm1fU2hiTGluTWFnaWNJRCA9PSBTQkxfTUFHSUNfSUQpOworCisJcmV0dXJuIChwU2hiTGluQnVmZik7CisKK30KKworLy8gbm90IGlubGluZWQgaW50ZXJuYWwgZnVuY3Rpb25zCitpbnQgU2hiQ2lyU2lnbmFsSGFuZGxlck5ld0RhdGEodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKTsKK3ZvaWQgU2hiQ2lyU2lnbmFsSGFuZGxlclJlc2V0KHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBmVGltZU91dF9wKTsKKworI2VuZGlmCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisjaWYgIWRlZmluZWQoSU5MSU5FX0VOQUJMRUQpCisvLyBub3QgaW5saW5lZCBleHRlcm5hbCBmdW5jdGlvbnMKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBJbml0aWFsaXplIFNoYXJlZCBCdWZmZXIgTW9kdWxlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0U2hiRXJyb3IgU2hiSW5pdCh2b2lkKQoreworCisJdFNoYkVycm9yIFNoYkVycm9yOworCisJU2hiRXJyb3IgPSBTaGJJcGNJbml0KCk7CisKKwlyZXR1cm4gKFNoYkVycm9yKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIERlaW5pdGlhbGl6ZSBTaGFyZWQgQnVmZmVyIE1vZHVsZQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordFNoYkVycm9yIFNoYkV4aXQodm9pZCkKK3sKKworCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCVNoYkVycm9yID0gU2hiSXBjRXhpdCgpOworCisJcmV0dXJuIChTaGJFcnJvcik7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBDIGkgciBjIHUgbCBhIHIgICBTIGggYSByIGUgZCAgIEIgdSBmIGYgZSByICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgQWxsb2NhdGUgQ2lyY3VsYXIgU2hhcmVkIEJ1ZmZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordFNoYkVycm9yIFNoYkNpckFsbG9jQnVmZmVyKHVuc2lnbmVkIGxvbmcgdWxCdWZmZXJTaXplX3AsCisJCQkgICAgY29uc3QgY2hhciAqcHN6QnVmZmVySURfcCwKKwkJCSAgICB0U2hiSW5zdGFuY2UgKiBwcFNoYkluc3RhbmNlX3AsCisJCQkgICAgdW5zaWduZWQgaW50ICpwZlNoYk5ld0NyZWF0ZWRfcCkKK3sKKworCXRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2U7CisJdFNoYkNpckJ1ZmYgKnBTaGJDaXJCdWZmOworCXVuc2lnbmVkIGludCBmU2hiTmV3Q3JlYXRlZDsKKwl1bnNpZ25lZCBsb25nIHVsQnVmZmVyRGF0YVNpemU7CisJdW5zaWduZWQgbG9uZyB1bEJ1ZmZlclRvdGFsU2l6ZTsKKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisKKwkvLyBjaGVjayBhcmd1bWVudHMKKwlpZiAoKHVsQnVmZmVyU2l6ZV9wID09IDApIHx8IChwcFNoYkluc3RhbmNlX3AgPT0gTlVMTCkpIHsKKwkJcmV0dXJuIChrU2hiSW52YWxpZEFyZyk7CisJfQorCisJLy8gY2FsY3VsYXRlIGxlbmd0aCBvZiBtZW1vcnkgdG8gYWxsb2NhdGUKKwl1bEJ1ZmZlckRhdGFTaXplID0KKwkgICAgKHVsQnVmZmVyU2l6ZV9wICsKKwkgICAgIChTQkNfQkxPQ0tfQUxJR05NRU5UIC0gMSkpICYgfihTQkNfQkxPQ0tfQUxJR05NRU5UIC0gMSk7CisJdWxCdWZmZXJUb3RhbFNpemUgPSB1bEJ1ZmZlckRhdGFTaXplICsgc2l6ZW9mKHRTaGJDaXJCdWZmKTsKKworCS8vIGFsbG9jYXRlIGEgbmV3IG9yIG9wZW4gYW4gZXhpc3Rpbmcgc2hhcmVkIGJ1ZmZlcgorCVNoYkVycm9yID0gU2hiSXBjQWxsb2NCdWZmZXIodWxCdWZmZXJUb3RhbFNpemUsIHBzekJ1ZmZlcklEX3AsCisJCQkJICAgICAmcFNoYkluc3RhbmNlLCAmZlNoYk5ld0NyZWF0ZWQpOworCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKKwkJZ290byBFeGl0OworCX0KKworCWlmIChwU2hiSW5zdGFuY2UgPT0gTlVMTCkgeworCQlTaGJFcnJvciA9IGtTaGJPdXRPZk1lbTsKKwkJZ290byBFeGl0OworCX0KKworCS8vIGdldCBwb2ludGVyIHRvIHNoYXJlZCBidWZmZXIKKwlwU2hiQ2lyQnVmZiA9ICh0U2hiQ2lyQnVmZiAqKSBTaGJJcGNHZXRTaE1lbVB0cihwU2hiSW5zdGFuY2UpOworCisJLy8gaWYgdGhlIHNoYXJlZCBidWZmZXIgd2FzIG5ldyBjcmVhdGVkLCB0aGFuIHRoaXMgcHJvY2VzcyBoYXMKKwkvLyB0byBpbml0aWFsaXplIGl0LCBvdGhlcndpc2UgdGhlIGJ1ZmZlciBpcyBhbHJlYWR5IGluIHVzZQorCS8vIGFuZCAqbXVzdCBub3QqIGJlIHJlc2V0ZWQKKwlpZiAoZlNoYk5ld0NyZWF0ZWQpIHsKKyNpZm5kZWYgTkRFQlVHCisJCXsKKwkJCW1lbXNldChwU2hiQ2lyQnVmZiwgMHhDQywgdWxCdWZmZXJUb3RhbFNpemUpOworCQl9CisjZW5kaWYKKworCQlwU2hiQ2lyQnVmZi0+bV9TaGJDaXJNYWdpY0lEID0gU0JDX01BR0lDX0lEOworCQlwU2hiQ2lyQnVmZi0+bV91bEJ1ZmZlclRvdGFsU2l6ZSA9IHVsQnVmZmVyVG90YWxTaXplOworCQlwU2hiQ2lyQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplID0gdWxCdWZmZXJEYXRhU2l6ZTsKKwkJcFNoYkNpckJ1ZmYtPm1fdWxXckluZGV4ID0gMDsKKwkJcFNoYkNpckJ1ZmYtPm1fdWxSZEluZGV4ID0gMDsKKwkJcFNoYkNpckJ1ZmYtPm1fdWxOdW1PZldyaXRlSm9icyA9IDA7CisJCXBTaGJDaXJCdWZmLT5tX3VsRGF0YUluVXNlID0gMDsKKwkJcFNoYkNpckJ1ZmYtPm1fdWxEYXRhQXBlbmRlZCA9IDA7CisJCXBTaGJDaXJCdWZmLT5tX3VsQmxvY2tzQXBlbmRlZCA9IDA7CisJCXBTaGJDaXJCdWZmLT5tX3VsRGF0YVJlYWRhYmxlID0gMDsKKwkJcFNoYkNpckJ1ZmYtPm1fdWxCbG9ja3NSZWFkYWJsZSA9IDA7CisJCXBTaGJDaXJCdWZmLT5tX3BmblNpZ0huZGxyTmV3RGF0YSA9IE5VTEw7CisJCXBTaGJDaXJCdWZmLT5tX2ZCdWZmZXJMb2NrZWQgPSBGQUxTRTsKKwkJcFNoYkNpckJ1ZmYtPm1fcGZuU2lnSG5kbHJSZXNldCA9IE5VTEw7CisJfSBlbHNlIHsKKwkJaWYgKHBTaGJDaXJCdWZmLT5tX1NoYkNpck1hZ2ljSUQgIT0gU0JDX01BR0lDX0lEKSB7CisJCQlTaGJFcnJvciA9IGtTaGJJbnZhbGlkQnVmZmVyVHlwZTsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCX0KKworICAgICAgRXhpdDoKKworCSpwcFNoYkluc3RhbmNlX3AgPSBwU2hiSW5zdGFuY2U7CisJKnBmU2hiTmV3Q3JlYXRlZF9wID0gZlNoYk5ld0NyZWF0ZWQ7CisKKwlyZXR1cm4gKFNoYkVycm9yKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFJlbGVhc2UgQ2lyY3VsYXIgU2hhcmVkIEJ1ZmZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordFNoYkVycm9yIFNoYkNpclJlbGVhc2VCdWZmZXIodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKQoreworCisJdFNoYkVycm9yIFNoYkVycm9yOworCisJLy8gY2hlY2sgYXJndW1lbnRzCisJaWYgKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHsKKwkJU2hiRXJyb3IgPSBrU2hiT2s7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlTaGJFcnJvciA9IFNoYklwY1JlbGVhc2VCdWZmZXIocFNoYkluc3RhbmNlX3ApOworCisgICAgICBFeGl0OgorCisJcmV0dXJuIChTaGJFcnJvcik7CisKK30KKworI2VuZGlmIC8vICFkZWZpbmVkKElOTElORV9FTkFCTEVEKQorCisjaWYgKCFkZWZpbmVkKFNIQVJFREJVRkZfSU5MSU5FRCkpIHx8IGRlZmluZWQoSU5MSU5FX0VOQUJMRUQpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgUmVzZXQgQ2lyY3VsYXIgU2hhcmVkIEJ1ZmZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHRTaGJFcnJvciBTaGJDaXJSZXNldEJ1ZmZlcih0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3AsCisJCQkJCSAgICB1bnNpZ25lZCBsb25nIHVsVGltZU91dF9wLAorCQkJCQkgICAgdFNoYkNpclNpZ0huZGxyUmVzZXQKKwkJCQkJICAgIHBmblNpZ25hbEhhbmRsZXJSZXNldF9wKQoreworCisJdFNoYkNpckJ1ZmYgKnBTaGJDaXJCdWZmOworCXVuc2lnbmVkIGxvbmcgdWxOdW1PZldyaXRlSm9icyA9IDA7CS8vIGQuay4gR0NDIGNvbXBsYWlucyBhYm91dCB1bmluaXRpYWxpemVkIHZhcmlhYmxlIG90aGVyd2lzZQorCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCS8vIGNoZWNrIGFyZ3VtZW50cworCWlmIChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB7CisJCVNoYkVycm9yID0ga1NoYkludmFsaWRBcmc7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlwU2hiQ2lyQnVmZiA9IFNoYkNpckdldEJ1ZmZlcihwU2hiSW5zdGFuY2VfcCk7CisJU2hiRXJyb3IgPSBrU2hiT2s7CisKKwlpZiAocFNoYkNpckJ1ZmYtPm1fU2hiQ2lyTWFnaWNJRCAhPSBTQkNfTUFHSUNfSUQpIHsKKwkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEJ1ZmZlclR5cGU7CisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLyBzdGFydCByZXNldCBqb2IgYnkgc2V0dGluZyByZXF1ZXN0IHJlcXVlc3QgaW4gYnVmZmVyIGhlYWRlcgorCVNoYklwY0VudGVyQXRvbWljU2VjdGlvbihwU2hiSW5zdGFuY2VfcCk7CisJeworCQlpZiAoIXBTaGJDaXJCdWZmLT5tX2ZCdWZmZXJMb2NrZWQpIHsKKwkJCXVsTnVtT2ZXcml0ZUpvYnMgPSBwU2hiQ2lyQnVmZi0+bV91bE51bU9mV3JpdGVKb2JzOworCisJCQlwU2hiQ2lyQnVmZi0+bV9mQnVmZmVyTG9ja2VkID0gVFJVRTsKKwkJCXBTaGJDaXJCdWZmLT5tX3BmblNpZ0huZGxyUmVzZXQgPQorCQkJICAgIHBmblNpZ25hbEhhbmRsZXJSZXNldF9wOworCQl9IGVsc2UgeworCQkJU2hiRXJyb3IgPSBrU2hiQWxyZWFkeVJlc2V0aW5nOworCQl9CisJfQorCVNoYklwY0xlYXZlQXRvbWljU2VjdGlvbihwU2hiSW5zdGFuY2VfcCk7CisKKwlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLyBpZiB0aGVyZSBpcyBjdXJyZW50bHkgbm8gcnVubmluZyB3cml0ZSBvcGVyYXRpb24gdGhlbiByZXNldCBidWZmZXIKKwkvLyBpbW1lZGlhdGVseSwgb3RoZXJ3aXNlIHdhaXQgdW50aWwgdGhlIGxhc3Qgd3JpdGUgam9iIGlzIHJlYWR5IGJ5CisJLy8gc3RhcnRpbmcgYSBzaWduYWwgcHJvY2VzcworCWlmICh1bE51bU9mV3JpdGVKb2JzID09IDApIHsKKwkJLy8gdGhlcmUgaXMgY3VycmVudGx5IG5vIHJ1bm5pbmcgd3JpdGUgb3BlcmF0aW9uCisJCS8vIC0+IHJlc2V0IGJ1ZmZlciBpbW1lZGlhdGVseQorCQlTaGJDaXJTaWduYWxIYW5kbGVyUmVzZXQocFNoYkluc3RhbmNlX3AsIEZBTFNFKTsKKwkJU2hiRXJyb3IgPSBrU2hiT2s7CisJfSBlbHNlIHsKKwkJLy8gdGhlcmUgaXMgY3VycmVudGx5IGF0IGxlYXN0IG9uZSBydW5uaW5nIHdyaXRlIG9wZXJhdGlvbgorCQkvLyAtPiBzdGFydGluZyBzaWduYWwgcHJvY2VzcyB0byB3YWl0IHVudGlsIHRoZSBsYXN0IHdyaXRlIGpvYiBpcyByZWFkeQorCQlTaGJFcnJvciA9CisJCSAgICBTaGJJcGNTdGFydFNpZ25hbGluZ0pvYlJlYWR5KHBTaGJJbnN0YW5jZV9wLCB1bFRpbWVPdXRfcCwKKwkJCQkJCSBTaGJDaXJTaWduYWxIYW5kbGVyUmVzZXQpOworCX0KKworICAgICAgRXhpdDoKKworCXJldHVybiAoU2hiRXJyb3IpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgV3JpdGUgZGF0YSBibG9jayB0byBDaXJjdWxhciBTaGFyZWQgQnVmZmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYkVycm9yIFNoYkNpcldyaXRlRGF0YUJsb2NrKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCwKKwkJCQkJICAgICAgIGNvbnN0IHZvaWQgKnBTcmNEYXRhQmxvY2tfcCwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdWxEYXRhQmxvY2tTaXplX3ApCit7CisKKwl0U2hiQ2lyQnVmZiAqcFNoYkNpckJ1ZmY7CisJdFNoYkNpckJsb2NrU2l6ZSBTaGJDaXJCbG9ja1NpemU7CisJdW5zaWduZWQgaW50IHVpRnVsbEJsb2NrU2l6ZTsKKwl1bnNpZ25lZCBpbnQgdWlBbGlnbkZpbGxCeXRlczsKKwl1bnNpZ25lZCBjaGFyICpwU2hiQ2lyRGF0YVB0cjsKKwl1bnNpZ25lZCBjaGFyICpwU2NyRGF0YVB0cjsKKwl1bnNpZ25lZCBsb25nIHVsRGF0YVNpemU7CisJdW5zaWduZWQgbG9uZyB1bENodW5rU2l6ZTsKKwl1bnNpZ25lZCBsb25nIHVsV3JJbmRleCA9IDA7CS8vIGQuay4gR0NDIGNvbXBsYWlucyBhYm91dCB1bmluaXRpYWxpemVkIHZhcmlhYmxlIG90aGVyd2lzZQorCXVuc2lnbmVkIGludCBmU2lnbmFsTmV3RGF0YTsKKwl1bnNpZ25lZCBpbnQgZlNpZ25hbFJlc2V0OworCXRTaGJFcnJvciBTaGJFcnJvcjsKKwl0U2hiRXJyb3IgU2hiRXJyb3IyOworCWludCBmUmVzOworCisJLy8gY2hlY2sgYXJndW1lbnRzCisJaWYgKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHsKKwkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEFyZzsKKwkJZ290byBFeGl0OworCX0KKworCWlmICgocFNyY0RhdGFCbG9ja19wID09IE5VTEwpIHx8ICh1bERhdGFCbG9ja1NpemVfcCA9PSAwKSkgeworCQkvLyBub3RoaW5nIHRvIGRvIGhlcmUKKwkJU2hiRXJyb3IgPSBrU2hiT2s7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAodWxEYXRhQmxvY2tTaXplX3AgPiBTQkNfTUFYX0JMT0NLX1NJWkUpIHsKKwkJU2hiRXJyb3IgPSBrU2hiRXhjZWVkRGF0YVNpemVMaW1pdDsKKwkJZ290byBFeGl0OworCX0KKworCXBTaGJDaXJCdWZmID0gU2hiQ2lyR2V0QnVmZmVyKHBTaGJJbnN0YW5jZV9wKTsKKwlwU2NyRGF0YVB0ciA9ICh1bnNpZ25lZCBjaGFyICopcFNyY0RhdGFCbG9ja19wOworCWZTaWduYWxOZXdEYXRhID0gRkFMU0U7CisJZlNpZ25hbFJlc2V0ID0gRkFMU0U7CisJU2hiRXJyb3IgPSBrU2hiT2s7CisKKwlpZiAocFNoYkNpckJ1ZmYtPm1fU2hiQ2lyTWFnaWNJRCAhPSBTQkNfTUFHSUNfSUQpIHsKKwkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEJ1ZmZlclR5cGU7CisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLyBjYWxjdWxhdGUgZGF0YSBibG9jayBzaXplIGluIGNpcmN1bGFyIGJ1ZmZlcgorCXVsRGF0YVNpemUgPQorCSAgICAodWxEYXRhQmxvY2tTaXplX3AgKworCSAgICAgKFNCQ19CTE9DS19BTElHTk1FTlQgLSAxKSkgJiB+KFNCQ19CTE9DS19BTElHTk1FTlQgLSAxKTsKKwl1aUZ1bGxCbG9ja1NpemUgPSB1bERhdGFTaXplICsgc2l6ZW9mKHRTaGJDaXJCbG9ja1NpemUpOwkvLyBkYXRhIHNpemUgKyBoZWFkZXIKKwl1aUFsaWduRmlsbEJ5dGVzID0gdWxEYXRhU2l6ZSAtIHVsRGF0YUJsb2NrU2l6ZV9wOworCisJU2hiQ2lyQmxvY2tTaXplLm1fdWlGdWxsQmxvY2tTaXplID0gdWlGdWxsQmxvY2tTaXplOworCVNoYkNpckJsb2NrU2l6ZS5tX3VpQWxpZ25GaWxsQnl0ZXMgPSB1aUFsaWduRmlsbEJ5dGVzOworCisJLy8gcmVzZXJ2ZSB0aGUgbmVlZGVkIG1lbW9yeSBmb3IgdGhlIHdyaXRlIG9wZXJhdGlvbiB0byBkbyBub3cKKwkvLyBhbmQgbWFrZSBuZWNlc3NhcnkgYWRqdXN0bWVudHMgaW4gdGhlIGNpcmN1bGFyIGJ1ZmZlciBoZWFkZXIKKwlTaGJJcGNFbnRlckF0b21pY1NlY3Rpb24ocFNoYkluc3RhbmNlX3ApOworCXsKKwkJLy8gY2hlY2sgaWYgdGhlcmUgaXMgc3VmZmljaWVudCBtZW1vcnkgYXZhaWxhYmxlIHRvIHN0b3JlCisJCS8vIHRoZSBuZXcgZGF0YQorCQlmUmVzID0KKwkJICAgIHVpRnVsbEJsb2NrU2l6ZSA8PQorCQkgICAgKHBTaGJDaXJCdWZmLT5tX3VsQnVmZmVyRGF0YVNpemUgLQorCQkgICAgIHBTaGJDaXJCdWZmLT5tX3VsRGF0YUluVXNlKTsKKwkJaWYgKGZSZXMpIHsKKwkJCS8vIHNldCB3cml0ZSBwb2ludGVyIGZvciB0aGUgd3JpdGUgb3BlcmF0aW9uIHRvIGRvIG5vdworCQkJLy8gdG8gdGhlIGN1cnJlbnQgd3JpdGUgcG9pbnRlciBvZiB0aGUgY2lyY3VsYXIgYnVmZmVyCisJCQl1bFdySW5kZXggPSBwU2hiQ2lyQnVmZi0+bV91bFdySW5kZXg7CisKKwkJCS8vIHJlc2VydmUgdGhlIG5lZWRlZCBtZW1vcnkgZm9yIHRoZSB3cml0ZSBvcGVyYXRpb24gdG8gZG8gbm93CisJCQlwU2hiQ2lyQnVmZi0+bV91bERhdGFJblVzZSArPSB1aUZ1bGxCbG9ja1NpemU7CisKKwkJCS8vIHNldCBuZXcgd3JpdGUgcG9pbnRlciBiZWhpbmQgdGhlIHJlc2VydmVkIG1lbW9yeQorCQkJLy8gZm9yIHRoZSB3cml0ZSBvcGVyYXRpb24gdG8gZG8gbm93CisJCQlwU2hiQ2lyQnVmZi0+bV91bFdySW5kZXggKz0gdWlGdWxsQmxvY2tTaXplOworCQkJcFNoYkNpckJ1ZmYtPm1fdWxXckluZGV4ICU9CisJCQkgICAgcFNoYkNpckJ1ZmYtPm1fdWxCdWZmZXJEYXRhU2l6ZTsKKworCQkJLy8gaW5jcmVtZW50IG51bWJlciBvZiBjdXJyZW50bHkgKHBhcmFsbGVsIHJ1bm5pbmcpCisJCQkvLyB3cml0ZSBvcGVyYXRpb25zCisJCQlwU2hiQ2lyQnVmZi0+bV91bE51bU9mV3JpdGVKb2JzKys7CisJCX0KKwl9CisJU2hiSXBjTGVhdmVBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKworCWlmICghZlJlcykgeworCQlTaGJFcnJvciA9IGtTaGJCdWZmZXJGdWxsOworCQlnb3RvIEV4aXQ7CisJfQorCisJLy8gY29weSB0aGUgZGF0YSB0byB0aGUgY2lyY3VsYXIgYnVmZmVyCisJLy8gKHRoZSBjb3B5IHByb2Nlc3MgaXRzZWxmIHdpbGwgYmUgZG9uZSBvdXRzaWRlIG9mIGFueQorCS8vIGNyaXRpY2FsL2xvY2tlZCBzZWN0aW9uKQorCXBTaGJDaXJEYXRhUHRyID0gJnBTaGJDaXJCdWZmLT5tX0RhdGE7CS8vIHB0ciB0byBzdGFydCBvZiBkYXRhIGFyZWEKKworCS8vIHdyaXRlIHJlYWwgc2l6ZSBvZiBjdXJyZW50IGJsb2NrIChpbmNsLiBhbGlnbm1lbnQgZmlsbCBieXRlcykKKwkqKHRTaGJDaXJCbG9ja1NpemUgKikgKHBTaGJDaXJEYXRhUHRyICsgdWxXckluZGV4KSA9IFNoYkNpckJsb2NrU2l6ZTsKKwl1bFdySW5kZXggKz0gc2l6ZW9mKHRTaGJDaXJCbG9ja1NpemUpOworCXVsV3JJbmRleCAlPSBwU2hiQ2lyQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplOworCisJaWYgKHVsV3JJbmRleCArIHVsRGF0YUJsb2NrU2l6ZV9wIDw9IHBTaGJDaXJCdWZmLT5tX3VsQnVmZmVyRGF0YVNpemUpIHsKKwkJLy8gbGluZWFyIHdyaXRlIG9wZXJhdGlvbgorCQltZW1jcHkocFNoYkNpckRhdGFQdHIgKyB1bFdySW5kZXgsIHBTY3JEYXRhUHRyLAorCQkgICAgICAgdWxEYXRhQmxvY2tTaXplX3ApOworCX0gZWxzZSB7CisJCS8vIHdyYXAtYXJvdW5kIHdyaXRlIG9wZXJhdGlvbgorCQl1bENodW5rU2l6ZSA9IHBTaGJDaXJCdWZmLT5tX3VsQnVmZmVyRGF0YVNpemUgLSB1bFdySW5kZXg7CisJCW1lbWNweShwU2hiQ2lyRGF0YVB0ciArIHVsV3JJbmRleCwgcFNjckRhdGFQdHIsIHVsQ2h1bmtTaXplKTsKKwkJbWVtY3B5KHBTaGJDaXJEYXRhUHRyLCBwU2NyRGF0YVB0ciArIHVsQ2h1bmtTaXplLAorCQkgICAgICAgdWxEYXRhQmxvY2tTaXplX3AgLSB1bENodW5rU2l6ZSk7CisJfQorCisJLy8gYWRqdXN0IGhlYWRlciBpbmZvcm1hdGlvbiBmb3IgY2lyY3VsYXIgYnVmZmVyIHdpdGggcHJvcGVydGllcworCS8vIG9mIHRoZSB3aXJpdHRlbiBkYXRhIGJsb2NrCisJU2hiSXBjRW50ZXJBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKwl7CisJCXBTaGJDaXJCdWZmLT5tX3VsRGF0YUFwZW5kZWQgKz0gdWlGdWxsQmxvY2tTaXplOworCQlwU2hiQ2lyQnVmZi0+bV91bEJsb2Nrc0FwZW5kZWQrKzsKKworCQkvLyBkZWNyZW1lbnQgbnVtYmVyIG9mIGN1cnJlbnRseSAocGFyYWxsZWwgcnVubmluZykgd3JpdGUgb3BlcmF0aW9ucworCQlpZiAoIS0tcFNoYkNpckJ1ZmYtPm1fdWxOdW1PZldyaXRlSm9icykgeworCQkJLy8gaWYgdGhlcmUgaXMgbm8gb3RoZXIgd3JpdGUgcHJvY2VzcyBydW5uaW5nIHRoZW4KKwkJCS8vIHNldCBuZXcgc2l6ZSBvZiByZWFkYWJsZSAoY29tcGxldGUgd3JpdHRlbikgZGF0YSBhbmQKKwkJCS8vIGFkanVzdCBudW1iZXIgb2YgcmVhZGFibGUgYmxvY2tzCisJCQlwU2hiQ2lyQnVmZi0+bV91bERhdGFSZWFkYWJsZSArPQorCQkJICAgIHBTaGJDaXJCdWZmLT5tX3VsRGF0YUFwZW5kZWQ7CisJCQlwU2hiQ2lyQnVmZi0+bV91bEJsb2Nrc1JlYWRhYmxlICs9CisJCQkgICAgcFNoYkNpckJ1ZmYtPm1fdWxCbG9ja3NBcGVuZGVkOworCisJCQlwU2hiQ2lyQnVmZi0+bV91bERhdGFBcGVuZGVkID0gMDsKKwkJCXBTaGJDaXJCdWZmLT5tX3VsQmxvY2tzQXBlbmRlZCA9IDA7CisKKwkJCWZTaWduYWxOZXdEYXRhID0gVFJVRTsKKwkJCWZTaWduYWxSZXNldCA9IHBTaGJDaXJCdWZmLT5tX2ZCdWZmZXJMb2NrZWQ7CisJCX0KKwl9CisJU2hiSXBjTGVhdmVBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKworCS8vIHNpZ25hbCBuZXcgZGF0YSBldmVudCB0byBhIHBvdGVudGlhbGx5IHJlYWRpbmcgYXBwbGljYXRpb24KKwlpZiAoZlNpZ25hbE5ld0RhdGEpIHsKKwkJU2hiRXJyb3IyID0gU2hiSXBjU2lnbmFsTmV3RGF0YShwU2hiSW5zdGFuY2VfcCk7CisJCWlmIChTaGJFcnJvciA9PSBrU2hiT2spIHsKKwkJCVNoYkVycm9yID0gU2hiRXJyb3IyOworCQl9CisJfQorCS8vIHNpZ25hbCB0aGF0IHRoZSBsYXN0IHdyaXRlIGpvYiBoYXMgYmVlbiBmaW5pc2hlZCB0byBhbGxvdworCS8vIGEgd2FpdGluZyBhcHBsaWNhdGlvbiB0byByZXNldCB0aGUgYnVmZmVyIG5vdworCWlmIChmU2lnbmFsUmVzZXQpIHsKKwkJU2hiRXJyb3IyID0gU2hiSXBjU2lnbmFsSm9iUmVhZHkocFNoYkluc3RhbmNlX3ApOworCQlpZiAoU2hiRXJyb3IgPT0ga1NoYk9rKSB7CisJCQlTaGJFcnJvciA9IFNoYkVycm9yMjsKKwkJfQorCX0KKworICAgICAgRXhpdDoKKworCXJldHVybiAoU2hiRXJyb3IpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgQWxsb2NhdGUgYmxvY2sgd2l0aGluIHRoZSBDaXJjdWxhciBTaGFyZWQgQnVmZmVyIGZvciBjaHVuayB3cml0aW5nCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYkVycm9yIFNoYkNpckFsbG9jRGF0YUJsb2NrKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCwKKwkJCQkJICAgICAgIHRTaGJDaXJDaHVuayAqIHBTaGJDaXJDaHVua19wLAorCQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB1bERhdGFCdWZmZXJTaXplX3ApCit7CisKKwl0U2hiQ2lyQnVmZiAqcFNoYkNpckJ1ZmY7CisJdFNoYkNpckJsb2NrU2l6ZSBTaGJDaXJCbG9ja1NpemU7CisJdW5zaWduZWQgaW50IHVpRnVsbEJsb2NrU2l6ZTsKKwl1bnNpZ25lZCBpbnQgdWlBbGlnbkZpbGxCeXRlczsKKwl1bnNpZ25lZCBjaGFyICpwU2hiQ2lyRGF0YVB0cjsKKwl1bnNpZ25lZCBsb25nIHVsRGF0YVNpemU7CisJdW5zaWduZWQgbG9uZyB1bFdySW5kZXggPSAwOwkvLyBkLmsuIEdDQyBjb21wbGFpbnMgYWJvdXQgdW5pbml0aWFsaXplZCB2YXJpYWJsZSBvdGhlcndpc2UKKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisJaW50IGZSZXM7CisKKwkvLyBjaGVjayBhcmd1bWVudHMKKwlpZiAoKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHx8IChwU2hiQ2lyQ2h1bmtfcCA9PSBOVUxMKSkgeworCQlTaGJFcnJvciA9IGtTaGJJbnZhbGlkQXJnOworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKHVsRGF0YUJ1ZmZlclNpemVfcCA9PSAwKSB7CisJCVNoYkVycm9yID0ga1NoYkludmFsaWRBcmc7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAodWxEYXRhQnVmZmVyU2l6ZV9wID4gU0JDX01BWF9CTE9DS19TSVpFKSB7CisJCVNoYkVycm9yID0ga1NoYkV4Y2VlZERhdGFTaXplTGltaXQ7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlwU2hiQ2lyQnVmZiA9IFNoYkNpckdldEJ1ZmZlcihwU2hiSW5zdGFuY2VfcCk7CisJU2hiRXJyb3IgPSBrU2hiT2s7CisKKwlpZiAocFNoYkNpckJ1ZmYtPm1fU2hiQ2lyTWFnaWNJRCAhPSBTQkNfTUFHSUNfSUQpIHsKKwkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEJ1ZmZlclR5cGU7CisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLyBjYWxjdWxhdGUgZGF0YSBibG9jayBzaXplIGluIGNpcmN1bGFyIGJ1ZmZlcgorCXVsRGF0YVNpemUgPQorCSAgICAodWxEYXRhQnVmZmVyU2l6ZV9wICsKKwkgICAgIChTQkNfQkxPQ0tfQUxJR05NRU5UIC0gMSkpICYgfihTQkNfQkxPQ0tfQUxJR05NRU5UIC0gMSk7CisJdWlGdWxsQmxvY2tTaXplID0gdWxEYXRhU2l6ZSArIHNpemVvZih0U2hiQ2lyQmxvY2tTaXplKTsJLy8gZGF0YSBzaXplICsgaGVhZGVyCisJdWlBbGlnbkZpbGxCeXRlcyA9IHVsRGF0YVNpemUgLSB1bERhdGFCdWZmZXJTaXplX3A7CisKKwlTaGJDaXJCbG9ja1NpemUubV91aUZ1bGxCbG9ja1NpemUgPSB1aUZ1bGxCbG9ja1NpemU7CisJU2hiQ2lyQmxvY2tTaXplLm1fdWlBbGlnbkZpbGxCeXRlcyA9IHVpQWxpZ25GaWxsQnl0ZXM7CisKKwkvLyByZXNlcnZlIHRoZSBuZWVkZWQgbWVtb3J5IGZvciB0aGUgd3JpdGUgb3BlcmF0aW9uIHRvIGRvIG5vdworCS8vIGFuZCBtYWtlIG5lY2Vzc2FyeSBhZGp1c3RtZW50cyBpbiB0aGUgY2lyY3VsYXIgYnVmZmVyIGhlYWRlcgorCVNoYklwY0VudGVyQXRvbWljU2VjdGlvbihwU2hiSW5zdGFuY2VfcCk7CisJeworCQkvLyBjaGVjayBpZiB0aGVyZSBpcyBzdWZmaWNpZW50IG1lbW9yeSBhdmFpbGFibGUgdG8gc3RvcmUKKwkJLy8gdGhlIG5ldyBkYXRhCisJCWZSZXMgPQorCQkgICAgKHVpRnVsbEJsb2NrU2l6ZSA8PQorCQkgICAgIChwU2hiQ2lyQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplIC0KKwkJICAgICAgcFNoYkNpckJ1ZmYtPm1fdWxEYXRhSW5Vc2UpKTsKKwkJaWYgKGZSZXMpIHsKKwkJCS8vIHNldCB3cml0ZSBwb2ludGVyIGZvciB0aGUgd3JpdGUgb3BlcmF0aW9uIHRvIGRvIG5vdworCQkJLy8gdG8gdGhlIGN1cnJlbnQgd3JpdGUgcG9pbnRlciBvZiB0aGUgY2lyY3VsYXIgYnVmZmVyCisJCQl1bFdySW5kZXggPSBwU2hiQ2lyQnVmZi0+bV91bFdySW5kZXg7CisKKwkJCS8vIHJlc2VydmUgdGhlIG5lZWRlZCBtZW1vcnkgZm9yIHRoZSB3cml0ZSBvcGVyYXRpb24gdG8gZG8gbm93CisJCQlwU2hiQ2lyQnVmZi0+bV91bERhdGFJblVzZSArPSB1aUZ1bGxCbG9ja1NpemU7CisKKwkJCS8vIHNldCBuZXcgd3JpdGUgcG9pbnRlciBiZWhpbmQgdGhlIHJlc2VydmVkIG1lbW9yeQorCQkJLy8gZm9yIHRoZSB3cml0ZSBvcGVyYXRpb24gdG8gZG8gbm93CisJCQlwU2hiQ2lyQnVmZi0+bV91bFdySW5kZXggKz0gdWlGdWxsQmxvY2tTaXplOworCQkJcFNoYkNpckJ1ZmYtPm1fdWxXckluZGV4ICU9CisJCQkgICAgcFNoYkNpckJ1ZmYtPm1fdWxCdWZmZXJEYXRhU2l6ZTsKKworCQkJLy8gaW5jcmVtZW50IG51bWJlciBvZiBjdXJyZW50bHkgKHBhcmFsbGVsIHJ1bm5pbmcpCisJCQkvLyB3cml0ZSBvcGVyYXRpb25zCisJCQlwU2hiQ2lyQnVmZi0+bV91bE51bU9mV3JpdGVKb2JzKys7CisJCX0KKwl9CisJU2hiSXBjTGVhdmVBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKworCWlmICghZlJlcykgeworCQlTaGJFcnJvciA9IGtTaGJCdWZmZXJGdWxsOworCQlnb3RvIEV4aXQ7CisJfQorCisJLy8gc2V0dXAgaGVhZGVyIGluZm9ybWF0aW9uIGZvciBhbGxvY2F0ZWQgYnVmZmVyCisJcFNoYkNpckRhdGFQdHIgPSAmcFNoYkNpckJ1ZmYtPm1fRGF0YTsJLy8gcHRyIHRvIHN0YXJ0IG9mIGRhdGEgYXJlYQorCisJLy8gd3JpdGUgcmVhbCBzaXplIG9mIGN1cnJlbnQgYmxvY2sgKGluY2wuIGFsaWdubWVudCBmaWxsIGJ5dGVzKQorCSoodFNoYkNpckJsb2NrU2l6ZSAqKSAocFNoYkNpckRhdGFQdHIgKyB1bFdySW5kZXgpID0gU2hiQ2lyQmxvY2tTaXplOworCXVsV3JJbmRleCArPSBzaXplb2YodFNoYkNpckJsb2NrU2l6ZSk7CisJdWxXckluZGV4ICU9IHBTaGJDaXJCdWZmLT5tX3VsQnVmZmVyRGF0YVNpemU7CisKKwkvLyBzZXR1cCBjaHVuayBkZXNjcmlwdG9yCisJcFNoYkNpckNodW5rX3AtPm1fdWlGdWxsQmxvY2tTaXplID0gdWlGdWxsQmxvY2tTaXplOworCXBTaGJDaXJDaHVua19wLT5tX3VsQXZhaWxhYmxlU2l6ZSA9IHVsRGF0YUJ1ZmZlclNpemVfcDsKKwlwU2hiQ2lyQ2h1bmtfcC0+bV91bFdySW5kZXggPSB1bFdySW5kZXg7CisJcFNoYkNpckNodW5rX3AtPm1fZkJ1ZmZlckNvbXBsZXRlZCA9IEZBTFNFOworCisgICAgICBFeGl0OgorCisJcmV0dXJuIChTaGJFcnJvcik7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBXcml0ZSBkYXRhIGNodW5rIGludG8gYW4gYWxsb2NhdGVkIGJ1ZmZlciBvZiB0aGUgQ2lyY3VsYXIgU2hhcmVkIEJ1ZmZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHRTaGJFcnJvciBTaGJDaXJXcml0ZURhdGFDaHVuayh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3AsCisJCQkJCSAgICAgICB0U2hiQ2lyQ2h1bmsgKiBwU2hiQ2lyQ2h1bmtfcCwKKwkJCQkJICAgICAgIGNvbnN0IHZvaWQgKnBTcmNEYXRhQ2h1bmtfcCwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdWxEYXRhQ2h1bmtTaXplX3AsCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQKKwkJCQkJICAgICAgICpwZkJ1ZmZlckNvbXBsZXRlZF9wKQoreworCisJdFNoYkNpckJ1ZmYgKnBTaGJDaXJCdWZmOworCXVuc2lnbmVkIGNoYXIgKnBTaGJDaXJEYXRhUHRyOworCXVuc2lnbmVkIGNoYXIgKnBTY3JEYXRhUHRyOworCXVuc2lnbmVkIGxvbmcgdWxTdWJDaHVua1NpemU7CisJdW5zaWduZWQgbG9uZyB1bFdySW5kZXg7CisJdW5zaWduZWQgaW50IGZCdWZmZXJDb21wbGV0ZWQ7CisJdW5zaWduZWQgaW50IGZTaWduYWxOZXdEYXRhOworCXVuc2lnbmVkIGludCBmU2lnbmFsUmVzZXQ7CisJdFNoYkVycm9yIFNoYkVycm9yOworCXRTaGJFcnJvciBTaGJFcnJvcjI7CisKKwkvLyBjaGVjayBhcmd1bWVudHMKKwlpZiAoKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHx8IChwU2hiQ2lyQ2h1bmtfcCA9PSBOVUxMKQorCSAgICB8fCAocGZCdWZmZXJDb21wbGV0ZWRfcCA9PSBOVUxMKSkgeworCQlTaGJFcnJvciA9IGtTaGJJbnZhbGlkQXJnOworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKChwU3JjRGF0YUNodW5rX3AgPT0gTlVMTCkgfHwgKHVsRGF0YUNodW5rU2l6ZV9wID09IDApKSB7CisJCS8vIG5vdGhpbmcgdG8gZG8gaGVyZQorCQlTaGJFcnJvciA9IGtTaGJPazsKKwkJZ290byBFeGl0OworCX0KKworCWlmIChwU2hiQ2lyQ2h1bmtfcC0+bV9mQnVmZmVyQ29tcGxldGVkKSB7CisJCVNoYkVycm9yID0ga1NoYkJ1ZmZlckFscmVhZHlDb21wbGV0ZWQ7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAodWxEYXRhQ2h1bmtTaXplX3AgPiBwU2hiQ2lyQ2h1bmtfcC0+bV91bEF2YWlsYWJsZVNpemUpIHsKKwkJU2hiRXJyb3IgPSBrU2hiRXhjZWVkRGF0YVNpemVMaW1pdDsKKwkJZ290byBFeGl0OworCX0KKworCXBTaGJDaXJCdWZmID0gU2hiQ2lyR2V0QnVmZmVyKHBTaGJJbnN0YW5jZV9wKTsKKwlwU2NyRGF0YVB0ciA9ICh1bnNpZ25lZCBjaGFyICopcFNyY0RhdGFDaHVua19wOworCWZTaWduYWxOZXdEYXRhID0gRkFMU0U7CisJZlNpZ25hbFJlc2V0ID0gRkFMU0U7CisJU2hiRXJyb3IgPSBrU2hiT2s7CisKKwlpZiAocFNoYkNpckJ1ZmYtPm1fU2hiQ2lyTWFnaWNJRCAhPSBTQkNfTUFHSUNfSUQpIHsKKwkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEJ1ZmZlclR5cGU7CisJCWdvdG8gRXhpdDsKKwl9CisKKwl1bFdySW5kZXggPSBwU2hiQ2lyQ2h1bmtfcC0+bV91bFdySW5kZXg7CisKKwkvLyBjb3B5IHRoZSBkYXRhIHRvIHRoZSBjaXJjdWxhciBidWZmZXIKKwkvLyAodGhlIGNvcHkgcHJvY2VzcyBpdHNlbGYgd2lsbCBiZSBkb25lIG91dHNpZGUgb2YgYW55CisJLy8gY3JpdGljYWwvbG9ja2VkIHNlY3Rpb24pCisJcFNoYkNpckRhdGFQdHIgPSAmcFNoYkNpckJ1ZmYtPm1fRGF0YTsJLy8gcHRyIHRvIHN0YXJ0IG9mIGRhdGEgYXJlYQorCisJaWYgKHVsV3JJbmRleCArIHVsRGF0YUNodW5rU2l6ZV9wIDw9IHBTaGJDaXJCdWZmLT5tX3VsQnVmZmVyRGF0YVNpemUpIHsKKwkJLy8gbGluZWFyIHdyaXRlIG9wZXJhdGlvbgorCQltZW1jcHkocFNoYkNpckRhdGFQdHIgKyB1bFdySW5kZXgsIHBTY3JEYXRhUHRyLAorCQkgICAgICAgdWxEYXRhQ2h1bmtTaXplX3ApOworCX0gZWxzZSB7CisJCS8vIHdyYXAtYXJvdW5kIHdyaXRlIG9wZXJhdGlvbgorCQl1bFN1YkNodW5rU2l6ZSA9IHBTaGJDaXJCdWZmLT5tX3VsQnVmZmVyRGF0YVNpemUgLSB1bFdySW5kZXg7CisJCW1lbWNweShwU2hiQ2lyRGF0YVB0ciArIHVsV3JJbmRleCwgcFNjckRhdGFQdHIsIHVsU3ViQ2h1bmtTaXplKTsKKwkJbWVtY3B5KHBTaGJDaXJEYXRhUHRyLCBwU2NyRGF0YVB0ciArIHVsU3ViQ2h1bmtTaXplLAorCQkgICAgICAgdWxEYXRhQ2h1bmtTaXplX3AgLSB1bFN1YkNodW5rU2l6ZSk7CisJfQorCisJLy8gYWRqdXN0IGNodW5rIGRlc2NyaXB0b3IKKwl1bFdySW5kZXggKz0gdWxEYXRhQ2h1bmtTaXplX3A7CisJdWxXckluZGV4ICU9IHBTaGJDaXJCdWZmLT5tX3VsQnVmZmVyRGF0YVNpemU7CisKKwlwU2hiQ2lyQ2h1bmtfcC0+bV91bEF2YWlsYWJsZVNpemUgLT0gdWxEYXRhQ2h1bmtTaXplX3A7CisJcFNoYkNpckNodW5rX3AtPm1fdWxXckluZGV4ID0gdWxXckluZGV4OworCisJZkJ1ZmZlckNvbXBsZXRlZCA9IChwU2hiQ2lyQ2h1bmtfcC0+bV91bEF2YWlsYWJsZVNpemUgPT0gMCk7CisJcFNoYkNpckNodW5rX3AtPm1fZkJ1ZmZlckNvbXBsZXRlZCA9IGZCdWZmZXJDb21wbGV0ZWQ7CisKKwkvLyBpZiB0aGUgY29tcGxldGUgYWxsb2NhdGVkIGJ1ZmZlciBpcyBmaWxsZWQgd2l0aCBkYXRhIHRoZW4KKwkvLyBhZGp1c3QgaGVhZGVyIGluZm9ybWF0aW9uIGZvciBjaXJjdWxhciBidWZmZXIgd2l0aCBwcm9wZXJ0aWVzCisJLy8gb2YgdGhlIHdpcml0dGVuIGRhdGEgYmxvY2sKKwlpZiAoZkJ1ZmZlckNvbXBsZXRlZCkgeworCQlTaGJJcGNFbnRlckF0b21pY1NlY3Rpb24ocFNoYkluc3RhbmNlX3ApOworCQl7CisJCQlwU2hiQ2lyQnVmZi0+bV91bERhdGFBcGVuZGVkICs9CisJCQkgICAgcFNoYkNpckNodW5rX3AtPm1fdWlGdWxsQmxvY2tTaXplOworCQkJcFNoYkNpckJ1ZmYtPm1fdWxCbG9ja3NBcGVuZGVkKys7CisKKwkJCS8vIGRlY3JlbWVudCBudW1iZXIgb2YgY3VycmVudGx5IChwYXJhbGxlbCBydW5uaW5nKSB3cml0ZSBvcGVyYXRpb25zCisJCQlpZiAoIS0tcFNoYkNpckJ1ZmYtPm1fdWxOdW1PZldyaXRlSm9icykgeworCQkJCS8vIGlmIHRoZXJlIGlzIG5vIG90aGVyIHdyaXRlIHByb2Nlc3MgcnVubmluZyB0aGVuCisJCQkJLy8gc2V0IG5ldyBzaXplIG9mIHJlYWRhYmxlIChjb21wbGV0ZSB3cml0dGVuKSBkYXRhIGFuZAorCQkJCS8vIGFkanVzdCBudW1iZXIgb2YgcmVhZGFibGUgYmxvY2tzCisJCQkJcFNoYkNpckJ1ZmYtPm1fdWxEYXRhUmVhZGFibGUgKz0KKwkJCQkgICAgcFNoYkNpckJ1ZmYtPm1fdWxEYXRhQXBlbmRlZDsKKwkJCQlwU2hiQ2lyQnVmZi0+bV91bEJsb2Nrc1JlYWRhYmxlICs9CisJCQkJICAgIHBTaGJDaXJCdWZmLT5tX3VsQmxvY2tzQXBlbmRlZDsKKworCQkJCXBTaGJDaXJCdWZmLT5tX3VsRGF0YUFwZW5kZWQgPSAwOworCQkJCXBTaGJDaXJCdWZmLT5tX3VsQmxvY2tzQXBlbmRlZCA9IDA7CisKKwkJCQlmU2lnbmFsTmV3RGF0YSA9IFRSVUU7CisJCQkJZlNpZ25hbFJlc2V0ID0gcFNoYkNpckJ1ZmYtPm1fZkJ1ZmZlckxvY2tlZDsKKwkJCX0KKwkJfQorCQlTaGJJcGNMZWF2ZUF0b21pY1NlY3Rpb24ocFNoYkluc3RhbmNlX3ApOworCX0KKworCS8vIHNpZ25hbCBuZXcgZGF0YSBldmVudCB0byBhIHBvdGVudGlhbGx5IHJlYWRpbmcgYXBwbGljYXRpb24KKwlpZiAoZlNpZ25hbE5ld0RhdGEpIHsKKwkJU2hiRXJyb3IyID0gU2hiSXBjU2lnbmFsTmV3RGF0YShwU2hiSW5zdGFuY2VfcCk7CisJCWlmIChTaGJFcnJvciA9PSBrU2hiT2spIHsKKwkJCVNoYkVycm9yID0gU2hiRXJyb3IyOworCQl9CisJfQorCS8vIHNpZ25hbCB0aGF0IHRoZSBsYXN0IHdyaXRlIGpvYiBoYXMgYmVlbiBmaW5pc2hlZCB0byBhbGxvdworCS8vIGEgd2FpdGluZyBhcHBsaWNhdGlvbiB0byByZXNldCB0aGUgYnVmZmVyIG5vdworCWlmIChmU2lnbmFsUmVzZXQpIHsKKwkJU2hiRXJyb3IyID0gU2hiSXBjU2lnbmFsSm9iUmVhZHkocFNoYkluc3RhbmNlX3ApOworCQlpZiAoU2hiRXJyb3IgPT0ga1NoYk9rKSB7CisJCQlTaGJFcnJvciA9IFNoYkVycm9yMjsKKwkJfQorCX0KKworCSpwZkJ1ZmZlckNvbXBsZXRlZF9wID0gZkJ1ZmZlckNvbXBsZXRlZDsKKworICAgICAgRXhpdDoKKworCXJldHVybiAoU2hiRXJyb3IpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgUmVhZCBkYXRhIGJsb2NrIGZyb20gQ2lyY3VsYXIgU2hhcmVkIEJ1ZmZlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHRTaGJFcnJvciBTaGJDaXJSZWFkRGF0YUJsb2NrKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCwKKwkJCQkJICAgICAgdm9pZCAqcERzdERhdGFCbG9ja19wLAorCQkJCQkgICAgICB1bnNpZ25lZCBsb25nIHVsUmRCdWZmU2l6ZV9wLAorCQkJCQkgICAgICB1bnNpZ25lZCBsb25nICpwdWxEYXRhQmxvY2tTaXplX3ApCit7CisKKwl0U2hiQ2lyQnVmZiAqcFNoYkNpckJ1ZmY7CisJdFNoYkNpckJsb2NrU2l6ZSBTaGJDaXJCbG9ja1NpemU7CisJdW5zaWduZWQgbG9uZyB1bERhdGFSZWFkYWJsZTsKKwl1bnNpZ25lZCBjaGFyICpwU2hiQ2lyRGF0YVB0cjsKKwl1bnNpZ25lZCBjaGFyICpwRHN0RGF0YVB0cjsKKwl1bnNpZ25lZCBsb25nIHVsRGF0YVNpemUgPSAwOwkvLyBkLmsuIEdDQyBjb21wbGFpbnMgYWJvdXQgdW5pbml0aWFsaXplZCB2YXJpYWJsZSBvdGhlcndpc2UKKwl1bnNpZ25lZCBsb25nIHVsQ2h1bmtTaXplOworCXVuc2lnbmVkIGxvbmcgdWxSZEluZGV4OworCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCS8vIGNoZWNrIGFyZ3VtZW50cworCWlmICgocFNoYkluc3RhbmNlX3AgPT0gTlVMTCkgfHwgKHB1bERhdGFCbG9ja1NpemVfcCA9PSBOVUxMKSkgeworCQlyZXR1cm4gKGtTaGJJbnZhbGlkQXJnKTsKKwl9CisKKwlpZiAoKHBEc3REYXRhQmxvY2tfcCA9PSBOVUxMKSB8fCAodWxSZEJ1ZmZTaXplX3AgPT0gMCkpIHsKKwkJLy8gbm90aGluZyB0byBkbyBoZXJlCisJCVNoYkVycm9yID0ga1NoYk9rOworCQlnb3RvIEV4aXQ7CisJfQorCisJU2hiRXJyb3IgPSBrU2hiT2s7CisJcFNoYkNpckJ1ZmYgPSBTaGJDaXJHZXRCdWZmZXIocFNoYkluc3RhbmNlX3ApOworCXBEc3REYXRhUHRyID0gKHVuc2lnbmVkIGNoYXIgKilwRHN0RGF0YUJsb2NrX3A7CisJdWxEYXRhU2l6ZSA9IDA7CisKKwlpZiAocFNoYkNpckJ1ZmYtPm1fU2hiQ2lyTWFnaWNJRCAhPSBTQkNfTUFHSUNfSUQpIHsKKwkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEJ1ZmZlclR5cGU7CisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLyBnZXQgdG90YWwgbnVtYmVyIG9mIHJlYWRhYmxlIGJ5dGVzIGZvciB0aGUgd2hvbGUgY2lyY3VsYXIgYnVmZmVyCisJU2hiSXBjRW50ZXJBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKwl7CisJCXVsRGF0YVJlYWRhYmxlID0gcFNoYkNpckJ1ZmYtPm1fdWxEYXRhUmVhZGFibGU7CisJfQorCVNoYklwY0xlYXZlQXRvbWljU2VjdGlvbihwU2hiSW5zdGFuY2VfcCk7CisKKwkvLyBpZiB0aGVyZSBhcmUgcmVhZGFibGUgZGF0YSBhdmFpbGFibGUsIHRoZW4gdGhlcmUgbXVzdCBiZSBhdCBsZWFzdAorCS8vIG9uZSBjb21wbGV0ZSByZWFkYWJsZSBkYXRhIGJsb2NrCisJaWYgKHVsRGF0YVJlYWRhYmxlID4gMCkgeworCQkvLyBnZXQgcG9pbnRlciB0byBzdGFydCBvZiBkYXRhIGFyZWEgYW5kIGN1cnJlbnQgcmVhZCBpbmRleAorCQlwU2hiQ2lyRGF0YVB0ciA9ICZwU2hiQ2lyQnVmZi0+bV9EYXRhOwkvLyBwdHIgdG8gc3RhcnQgb2YgZGF0YSBhcmVhCisJCXVsUmRJbmRleCA9IHBTaGJDaXJCdWZmLT5tX3VsUmRJbmRleDsKKworCQkvLyBnZXQgcmVhbCBzaXplIG9mIGN1cnJlbnQgYmxvY2sgKGluY2wuIGFsaWdubWVudCBmaWxsIGJ5dGVzKQorCQlTaGJDaXJCbG9ja1NpemUgPQorCQkgICAgKih0U2hiQ2lyQmxvY2tTaXplICopIChwU2hiQ2lyRGF0YVB0ciArIHVsUmRJbmRleCk7CisJCXVsUmRJbmRleCArPSBzaXplb2YodFNoYkNpckJsb2NrU2l6ZSk7CisJCXVsUmRJbmRleCAlPSBwU2hiQ2lyQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplOworCisJCS8vIGdldCBzaXplIG9mIHVzZXIgZGF0YSBpbnNpZGUgdGhlIGN1cnJlbnQgYmxvY2sKKwkJdWxEYXRhU2l6ZSA9CisJCSAgICBTaGJDaXJCbG9ja1NpemUubV91aUZ1bGxCbG9ja1NpemUgLQorCQkgICAgU2hiQ2lyQmxvY2tTaXplLm1fdWlBbGlnbkZpbGxCeXRlczsKKwkJdWxEYXRhU2l6ZSAtPSBzaXplb2YodFNoYkNpckJsb2NrU2l6ZSk7CisJfQorCisJLy8gdWxEYXRhU2l6ZSA9IE1JTih1bERhdGFTaXplLCB1bFJkQnVmZlNpemVfcCk7CisJaWYgKHVsRGF0YVNpemUgPiB1bFJkQnVmZlNpemVfcCkgeworCQl1bERhdGFTaXplID0gdWxSZEJ1ZmZTaXplX3A7CisJCVNoYkVycm9yID0ga1NoYkRhdGFUcnVuY2F0ZWQ7CisJfQorCisJaWYgKHVsRGF0YVNpemUgPT0gMCkgeworCQkvLyBub3RoaW5nIHRvIGRvIGhlcmUKKwkJU2hiRXJyb3IgPSBrU2hiTm9SZWFkYWJsZURhdGE7CisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLyBjb3B5IHRoZSBkYXRhIGZyb20gdGhlIGNpcmN1bGFyIGJ1ZmZlcgorCS8vICh0aGUgY29weSBwcm9jZXNzIGl0c2VsZiB3aWxsIGJlIGRvbmUgb3V0c2lkZSBvZiBhbnkKKwkvLyBjcml0aWNhbC9sb2NrZWQgc2VjdGlvbikKKwlpZiAodWxSZEluZGV4ICsgdWxEYXRhU2l6ZSA8PSBwU2hiQ2lyQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplKSB7CisJCS8vIGxpbmVhciByZWFkIG9wZXJhdGlvbgorCQltZW1jcHkocERzdERhdGFQdHIsIHBTaGJDaXJEYXRhUHRyICsgdWxSZEluZGV4LCB1bERhdGFTaXplKTsKKwl9IGVsc2UgeworCQkvLyB3cmFwLWFyb3VuZCByZWFkIG9wZXJhdGlvbgorCQl1bENodW5rU2l6ZSA9IHBTaGJDaXJCdWZmLT5tX3VsQnVmZmVyRGF0YVNpemUgLSB1bFJkSW5kZXg7CisJCW1lbWNweShwRHN0RGF0YVB0ciwgcFNoYkNpckRhdGFQdHIgKyB1bFJkSW5kZXgsIHVsQ2h1bmtTaXplKTsKKwkJbWVtY3B5KHBEc3REYXRhUHRyICsgdWxDaHVua1NpemUsIHBTaGJDaXJEYXRhUHRyLAorCQkgICAgICAgdWxEYXRhU2l6ZSAtIHVsQ2h1bmtTaXplKTsKKwl9CisKKyNpZm5kZWYgTkRFQlVHCisJeworCQl0U2hiQ2lyQmxvY2tTaXplIENsclNoYkNpckJsb2NrU2l6ZTsKKworCQlpZiAodWxSZEluZGV4ICsgdWxEYXRhU2l6ZSA8PSBwU2hiQ2lyQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplKSB7CisJCQkvLyBsaW5lYXIgYnVmZmVyCisJCQltZW1zZXQocFNoYkNpckRhdGFQdHIgKyB1bFJkSW5kZXgsIDB4REQsIHVsRGF0YVNpemUpOworCQl9IGVsc2UgeworCQkJLy8gd3JhcC1hcm91bmQgcmVhZCBvcGVyYXRpb24KKwkJCXVsQ2h1bmtTaXplID0KKwkJCSAgICBwU2hiQ2lyQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplIC0gdWxSZEluZGV4OworCQkJbWVtc2V0KHBTaGJDaXJEYXRhUHRyICsgdWxSZEluZGV4LCAweERELCB1bENodW5rU2l6ZSk7CisJCQltZW1zZXQocFNoYkNpckRhdGFQdHIsIDB4REQsIHVsRGF0YVNpemUgLSB1bENodW5rU2l6ZSk7CisJCX0KKworCQlDbHJTaGJDaXJCbG9ja1NpemUubV91aUZ1bGxCbG9ja1NpemUgPSAvKih1bnNpZ25lZCBpbnQpICovIC0xOwkvLyAtMSA9IHhGRkZGRkZGCisJCUNsclNoYkNpckJsb2NrU2l6ZS5tX3VpQWxpZ25GaWxsQnl0ZXMgPSAvKih1bnNpZ25lZCBpbnQpICovIC0xOwkvLyAtMSA9IEZ4eHh4eHh4CisJCSoodFNoYkNpckJsb2NrU2l6ZSAqKSAocFNoYkNpckRhdGFQdHIgKworCQkJCSAgICAgICBwU2hiQ2lyQnVmZi0+bV91bFJkSW5kZXgpID0KKwkJICAgIENsclNoYkNpckJsb2NrU2l6ZTsKKwl9CisjZW5kaWYgLy8gI2lmbmRlZiBOREVCVUcKKworCS8vIHNldCBuZXcgc2l6ZSBvZiByZWFkYWJsZSBkYXRhLCBkYXRhIGluIHVzZSwgbmV3IHJlYWQgaW5kZXgKKwkvLyBhbmQgYWRqdXN0IG51bWJlciBvZiByZWFkYWJsZSBibG9ja3MKKwlTaGJJcGNFbnRlckF0b21pY1NlY3Rpb24ocFNoYkluc3RhbmNlX3ApOworCXsKKwkJcFNoYkNpckJ1ZmYtPm1fdWxEYXRhSW5Vc2UgLT0gU2hiQ2lyQmxvY2tTaXplLm1fdWlGdWxsQmxvY2tTaXplOworCQlwU2hiQ2lyQnVmZi0+bV91bERhdGFSZWFkYWJsZSAtPQorCQkgICAgU2hiQ2lyQmxvY2tTaXplLm1fdWlGdWxsQmxvY2tTaXplOworCQlwU2hiQ2lyQnVmZi0+bV91bEJsb2Nrc1JlYWRhYmxlLS07CisKKwkJLy8kJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQKKwkJaWYgKChwU2hiQ2lyQnVmZi0+bV91bERhdGFJblVzZSA9PSAwKQorCQkgICAgJiYgKHBTaGJDaXJCdWZmLT5tX3VsRGF0YVJlYWRhYmxlID09IDApKSB7CisJCQlBU1NFUlQocFNoYkNpckJ1ZmYtPm1fdWxCbG9ja3NSZWFkYWJsZSA9PSAwKTsKKworCQkJcFNoYkNpckJ1ZmYtPm1fdWxXckluZGV4ID0gMDsKKwkJCXBTaGJDaXJCdWZmLT5tX3VsUmRJbmRleCA9IDA7CisJCX0gZWxzZQorCQkJLy8kJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQKKwkJeworCQkJcFNoYkNpckJ1ZmYtPm1fdWxSZEluZGV4ICs9CisJCQkgICAgU2hiQ2lyQmxvY2tTaXplLm1fdWlGdWxsQmxvY2tTaXplOworCQkJcFNoYkNpckJ1ZmYtPm1fdWxSZEluZGV4ICU9CisJCQkgICAgcFNoYkNpckJ1ZmYtPm1fdWxCdWZmZXJEYXRhU2l6ZTsKKwkJfQorCX0KKwlTaGJJcGNMZWF2ZUF0b21pY1NlY3Rpb24ocFNoYkluc3RhbmNlX3ApOworCisgICAgICBFeGl0OgorCisJKnB1bERhdGFCbG9ja1NpemVfcCA9IHVsRGF0YVNpemU7CisKKwlyZXR1cm4gKFNoYkVycm9yKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEdldCBkYXRhIHNpemUgb2YgbmV4dCByZWFkYWJsZSBibG9jayBmcm9tIENpcmN1bGFyIFNoYXJlZCBCdWZmZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiRXJyb3IgU2hiQ2lyR2V0UmVhZERhdGFTaXplKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCwKKwkJCQkJCXVuc2lnbmVkIGxvbmcKKwkJCQkJCSpwdWxEYXRhQmxvY2tTaXplX3ApCit7CisKKwl0U2hiQ2lyQnVmZiAqcFNoYkNpckJ1ZmY7CisJdW5zaWduZWQgbG9uZyB1bERhdGFSZWFkYWJsZTsKKwl1bnNpZ25lZCBjaGFyICpwU2hiQ2lyRGF0YVB0cjsKKwl0U2hiQ2lyQmxvY2tTaXplIFNoYkNpckJsb2NrU2l6ZTsKKwl1bnNpZ25lZCBsb25nIHVsRGF0YVNpemU7CisJdFNoYkVycm9yIFNoYkVycm9yOworCisJLy8gY2hlY2sgYXJndW1lbnRzCisJaWYgKChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB8fCAocHVsRGF0YUJsb2NrU2l6ZV9wID09IE5VTEwpKSB7CisJCXJldHVybiAoa1NoYkludmFsaWRBcmcpOworCX0KKworCXBTaGJDaXJCdWZmID0gU2hiQ2lyR2V0QnVmZmVyKHBTaGJJbnN0YW5jZV9wKTsKKwl1bERhdGFTaXplID0gMDsKKwlTaGJFcnJvciA9IGtTaGJPazsKKworCWlmIChwU2hiQ2lyQnVmZi0+bV9TaGJDaXJNYWdpY0lEICE9IFNCQ19NQUdJQ19JRCkgeworCQlTaGJFcnJvciA9IGtTaGJJbnZhbGlkQnVmZmVyVHlwZTsKKwkJZ290byBFeGl0OworCX0KKworCS8vIGdldCB0b3RhbCBudW1iZXIgb2YgcmVhZGFibGUgYnl0ZXMgZm9yIHRoZSB3aG9sZSBjaXJjdWxhciBidWZmZXIKKwlTaGJJcGNFbnRlckF0b21pY1NlY3Rpb24ocFNoYkluc3RhbmNlX3ApOworCXsKKwkJdWxEYXRhUmVhZGFibGUgPSBwU2hiQ2lyQnVmZi0+bV91bERhdGFSZWFkYWJsZTsKKwl9CisJU2hiSXBjTGVhdmVBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKworCS8vIGlmIHRoZXJlIGFyZSByZWFkYWJsZSBkYXRhIGF2YWlsYWJsZSwgdGhlbiB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0CisJLy8gb25lIGNvbXBsZXRlIHJlYWRhYmxlIGRhdGEgYmxvY2sKKwlpZiAodWxEYXRhUmVhZGFibGUgPiAwKSB7CisJCXBTaGJDaXJEYXRhUHRyID0KKwkJICAgICZwU2hiQ2lyQnVmZi0+bV9EYXRhICsgcFNoYkNpckJ1ZmYtPm1fdWxSZEluZGV4OworCisJCS8vIGdldCByZWFsIHNpemUgb2YgY3VycmVudCBibG9jayAoaW5jbC4gYWxpZ25tZW50IGZpbGwgYnl0ZXMpCisJCVNoYkNpckJsb2NrU2l6ZSA9ICoodFNoYkNpckJsb2NrU2l6ZSAqKSBwU2hiQ2lyRGF0YVB0cjsKKworCQkvLyBnZXQgc2l6ZSBvZiB1c2VyIGRhdGEgaW5zaWRlIHRoZSBjdXJyZW50IGJsb2NrCisJCXVsRGF0YVNpemUgPQorCQkgICAgU2hiQ2lyQmxvY2tTaXplLm1fdWlGdWxsQmxvY2tTaXplIC0KKwkJICAgIFNoYkNpckJsb2NrU2l6ZS5tX3VpQWxpZ25GaWxsQnl0ZXM7CisJCXVsRGF0YVNpemUgLT0gc2l6ZW9mKHRTaGJDaXJCbG9ja1NpemUpOworCX0KKworICAgICAgRXhpdDoKKworCSpwdWxEYXRhQmxvY2tTaXplX3AgPSB1bERhdGFTaXplOworCisJcmV0dXJuIChTaGJFcnJvcik7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBHZXQgbnVtYmVyIG9mIHJlYWRhYmxlIGJsb2NrcyBmcm9tIENpcmN1bGFyIFNoYXJlZCBCdWZmZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiRXJyb3IgU2hiQ2lyR2V0UmVhZEJsb2NrQ291bnQodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wLAorCQkJCQkJICB1bnNpZ25lZCBsb25nCisJCQkJCQkgICpwdWxEYXRhQmxvY2tDb3VudF9wKQoreworCisJdFNoYkNpckJ1ZmYgKnBTaGJDaXJCdWZmOworCXVuc2lnbmVkIGxvbmcgdWxCbG9ja0NvdW50OworCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCS8vIGNoZWNrIGFyZ3VtZW50cworCWlmICgocFNoYkluc3RhbmNlX3AgPT0gTlVMTCkgfHwgKHB1bERhdGFCbG9ja0NvdW50X3AgPT0gTlVMTCkpIHsKKwkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEFyZzsKKwkJZ290byBFeGl0OworCX0KKworCXBTaGJDaXJCdWZmID0gU2hiQ2lyR2V0QnVmZmVyKHBTaGJJbnN0YW5jZV9wKTsKKwl1bEJsb2NrQ291bnQgPSAwOworCVNoYkVycm9yID0ga1NoYk9rOworCisJaWYgKHBTaGJDaXJCdWZmLT5tX1NoYkNpck1hZ2ljSUQgIT0gU0JDX01BR0lDX0lEKSB7CisJCVNoYkVycm9yID0ga1NoYkludmFsaWRCdWZmZXJUeXBlOworCQlnb3RvIEV4aXQ7CisJfQorCisJU2hiSXBjRW50ZXJBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKwl7CisJCXVsQmxvY2tDb3VudCA9IHBTaGJDaXJCdWZmLT5tX3VsQmxvY2tzUmVhZGFibGU7CisJfQorCVNoYklwY0xlYXZlQXRvbWljU2VjdGlvbihwU2hiSW5zdGFuY2VfcCk7CisKKwkqcHVsRGF0YUJsb2NrQ291bnRfcCA9IHVsQmxvY2tDb3VudDsKKworICAgICAgRXhpdDoKKworCXJldHVybiAoU2hiRXJyb3IpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgU2V0IGFwcGxpY2F0aW9uIGhhbmRsZXIgdG8gc2lnbmFsIG5ldyBkYXRhIGZvciBDaXJjdWxhciBTaGFyZWQgQnVmZmVyCisvLyAgZC5rLjogbmV3IHBhcmFtZXRlciBwcmlvcml0eSBhcyBlbnVtCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYkVycm9yIFNoYkNpclNldFNpZ25hbEhhbmRsZXJOZXdEYXRhKHRTaGJJbnN0YW5jZQorCQkJCQkJCXBTaGJJbnN0YW5jZV9wLAorCQkJCQkJCXRTaGJDaXJTaWdIbmRsck5ld0RhdGEKKwkJCQkJCQlwZm5TaWduYWxIYW5kbGVyTmV3RGF0YV9wLAorCQkJCQkJCXRTaGJQcmlvcml0eQorCQkJCQkJCVNoYlByaW9yaXR5X3ApCit7CisKKwl0U2hiQ2lyQnVmZiAqcFNoYkNpckJ1ZmY7CisJdFNoYkVycm9yIFNoYkVycm9yOworCisJLy8gY2hlY2sgYXJndW1lbnRzCisJaWYgKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHsKKwkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEFyZzsKKwkJZ290byBFeGl0OworCX0KKworCXBTaGJDaXJCdWZmID0gU2hiQ2lyR2V0QnVmZmVyKHBTaGJJbnN0YW5jZV9wKTsKKwlTaGJFcnJvciA9IGtTaGJPazsKKworCWlmIChwU2hiQ2lyQnVmZi0+bV9TaGJDaXJNYWdpY0lEICE9IFNCQ19NQUdJQ19JRCkgeworCQlTaGJFcnJvciA9IGtTaGJJbnZhbGlkQnVmZmVyVHlwZTsKKwkJZ290byBFeGl0OworCX0KKworCWlmIChwZm5TaWduYWxIYW5kbGVyTmV3RGF0YV9wICE9IE5VTEwpIHsKKwkJLy8gc2V0IGEgbmV3IHNpZ25hbCBoYW5kbGVyCisJCWlmIChwU2hiQ2lyQnVmZi0+bV9wZm5TaWdIbmRsck5ld0RhdGEgIT0gTlVMTCkgeworCQkJU2hiRXJyb3IgPSBrU2hiQWxyZWFkeVNpZ25hbGluZzsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCisJCXBTaGJDaXJCdWZmLT5tX3BmblNpZ0huZGxyTmV3RGF0YSA9IHBmblNpZ25hbEhhbmRsZXJOZXdEYXRhX3A7CisJCVNoYkVycm9yID0KKwkJICAgIFNoYklwY1N0YXJ0U2lnbmFsaW5nTmV3RGF0YShwU2hiSW5zdGFuY2VfcCwKKwkJCQkJCVNoYkNpclNpZ25hbEhhbmRsZXJOZXdEYXRhLAorCQkJCQkJU2hiUHJpb3JpdHlfcCk7CisJfSBlbHNlIHsKKwkJLy8gcmVtb3ZlIGV4aXN0aW5nIHNpZ25hbCBoYW5kbGVyCisJCVNoYkVycm9yID0gU2hiSXBjU3RvcFNpZ25hbGluZ05ld0RhdGEocFNoYkluc3RhbmNlX3ApOworCQlpZiAocFNoYkNpckJ1ZmYtPm1fcGZuU2lnSG5kbHJOZXdEYXRhICE9IE5VTEwpIHsKKwkJCXBTaGJDaXJCdWZmLT5tX3BmblNpZ0huZGxyTmV3RGF0YShwU2hiSW5zdGFuY2VfcCwgMCk7CisJCX0KKwkJcFNoYkNpckJ1ZmYtPm1fcGZuU2lnSG5kbHJOZXdEYXRhID0gTlVMTDsKKwl9CisKKyAgICAgIEV4aXQ6CisKKwlyZXR1cm4gKFNoYkVycm9yKTsKKworfQorCisjZW5kaWYKKworI2lmICFkZWZpbmVkKElOTElORV9FTkFCTEVEKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIERFQlVHOiBUcmFjZSBDaXJjdWxhciBTaGFyZWQgQnVmZmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZuZGVmIE5ERUJVRwordFNoYkVycm9yIFNoYkNpclRyYWNlQnVmZmVyKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCkKK3sKKworCXRTaGJDaXJCdWZmICpwU2hiQ2lyQnVmZjsKKwljaGFyIHN6TWFnaWdJRFtzaXplb2YoU0JDX01BR0lDX0lEKSArIDFdOworCXRTaGJDaXJCbG9ja1NpemUgU2hiQ2lyQmxvY2tTaXplOworCXVuc2lnbmVkIGxvbmcgdWxEYXRhUmVhZGFibGU7CisJdW5zaWduZWQgY2hhciAqcFNoYkNpckRhdGFQdHI7CisJdW5zaWduZWQgbG9uZyB1bEJsb2NrSW5kZXg7CisJdW5zaWduZWQgaW50IG5CbG9ja0NvdW50OworCXVuc2lnbmVkIGxvbmcgdWxEYXRhU2l6ZTsKKwl1bnNpZ25lZCBsb25nIHVsQ2h1bmtTaXplOworCXVuc2lnbmVkIGxvbmcgdWxSZEluZGV4OworCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCVRSQUNFMCgiXG5cbiMjIyMjIENpcmN1bGFyIFNoYXJlZCBCdWZmZXIgIyMjIyNcbiIpOworCisJLy8gY2hlY2sgYXJndW1lbnRzCisJaWYgKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHsKKwkJVFJBQ0UxKCJcbkVSUk9SOiBpbnZhbGlkIGJ1ZmZlciBhZGRyZXNzICgweCUwOGxYKVxuIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKXBTaGJJbnN0YW5jZV9wKTsKKwkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEFyZzsKKwkJZ290byBFeGl0OworCX0KKworCXBTaGJDaXJCdWZmID0gU2hiQ2lyR2V0QnVmZmVyKHBTaGJJbnN0YW5jZV9wKTsKKwlTaGJFcnJvciA9IGtTaGJPazsKKworCWlmIChwU2hiQ2lyQnVmZi0+bV9TaGJDaXJNYWdpY0lEICE9IFNCQ19NQUdJQ19JRCkgeworCQlTaGJFcnJvciA9IGtTaGJJbnZhbGlkQnVmZmVyVHlwZTsKKwkJZ290byBFeGl0OworCX0KKworCSoodW5zaWduZWQgbG9uZyAqKSZzek1hZ2lnSURbMF0gPSBwU2hiQ2lyQnVmZi0+bV9TaGJDaXJNYWdpY0lEOworCXN6TWFnaWdJRFtzaXplb2YoU0JDX01BR0lDX0lEKV0gPSAnXDAnOworCisJU2hiSXBjRW50ZXJBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKwl7CisJCVRSQUNFMSgiXG5CdWZmZXIgQWRkcmVzczogICAweCUwOGxYXG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcFNoYkNpckJ1ZmYpOworCisJCVRSQUNFMCgiXG5IZWFkZXIgSW5mbzoiKTsKKwkJVFJBQ0UyKCJcbk1hZ2lnSUQ6ICAgICAgICAgICclcycgKCUwOGxYKSIsIHN6TWFnaWdJRCwKKwkJICAgICAgIHBTaGJDaXJCdWZmLT5tX1NoYkNpck1hZ2ljSUQpOworCQlUUkFDRTEoIlxuQnVmZmVyVG90YWxTaXplOiAgJTRsdSBbQnl0ZXNdIiwKKwkJICAgICAgIHBTaGJDaXJCdWZmLT5tX3VsQnVmZmVyVG90YWxTaXplKTsKKwkJVFJBQ0UxKCJcbkJ1ZmZlckRhdGFTaXplOiAgICU0bHUgW0J5dGVzXSIsCisJCSAgICAgICBwU2hiQ2lyQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplKTsKKwkJVFJBQ0UxKCJcbldySW5kZXg6ICAgICAgICAgICU0bHUiLCBwU2hiQ2lyQnVmZi0+bV91bFdySW5kZXgpOworCQlUUkFDRTEoIlxuUmRJbmRleDogICAgICAgICAgJTRsdSIsIHBTaGJDaXJCdWZmLT5tX3VsUmRJbmRleCk7CisJCVRSQUNFMSgiXG5OdW1PZldyaXRlSm9iczogICAlNGx1IiwKKwkJICAgICAgIHBTaGJDaXJCdWZmLT5tX3VsTnVtT2ZXcml0ZUpvYnMpOworCQlUUkFDRTEoIlxuRGF0YUluVXNlOiAgICAgICAgJTRsdSBbQnl0ZXNdIiwKKwkJICAgICAgIHBTaGJDaXJCdWZmLT5tX3VsRGF0YUluVXNlKTsKKwkJVFJBQ0UxKCJcbkRhdGFBcGVuZGVkOiAgICAgICU0bHUgW0J5dGVzXSIsCisJCSAgICAgICBwU2hiQ2lyQnVmZi0+bV91bERhdGFBcGVuZGVkKTsKKwkJVFJBQ0UxKCJcbkJsb2Nrc0FwZW5kZWQ6ICAgICU0bHUiLAorCQkgICAgICAgcFNoYkNpckJ1ZmYtPm1fdWxCbG9ja3NBcGVuZGVkKTsKKwkJVFJBQ0UxKCJcbkRhdGFSZWFkYWJsZTogICAgICU0bHUgW0J5dGVzXSIsCisJCSAgICAgICBwU2hiQ2lyQnVmZi0+bV91bERhdGFSZWFkYWJsZSk7CisJCVRSQUNFMSgiXG5CbG9ja3NSZWFkYWJsZTogICAlNGx1IiwKKwkJICAgICAgIHBTaGJDaXJCdWZmLT5tX3VsQmxvY2tzUmVhZGFibGUpOworCQlUUkFDRTEoIlxuU2lnSG5kbHJOZXdEYXRhOiAgJTA4bFgiLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcFNoYkNpckJ1ZmYtPm1fcGZuU2lnSG5kbHJOZXdEYXRhKTsKKwkJVFJBQ0UxKCJcbkJ1ZmZlckxvY2tlZDogICAgICVkIiwgcFNoYkNpckJ1ZmYtPm1fZkJ1ZmZlckxvY2tlZCk7CisJCVRSQUNFMSgiXG5TaWdIbmRsclJlc2V0OiAgICAlMDhsWCIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZylwU2hiQ2lyQnVmZi0+bV9wZm5TaWdIbmRsclJlc2V0KTsKKworCQlTaGJUcmFjZUR1bXAoJnBTaGJDaXJCdWZmLT5tX0RhdGEsCisJCQkgICAgIHBTaGJDaXJCdWZmLT5tX3VsQnVmZmVyRGF0YVNpemUsIDB4MDAwMDAwMDBMLAorCQkJICAgICAiXG5EYXRhIEFyZWE6Iik7CisKKwkJdWxEYXRhUmVhZGFibGUgPSBwU2hiQ2lyQnVmZi0+bV91bERhdGFSZWFkYWJsZTsKKwkJbkJsb2NrQ291bnQgPSAxOworCQl1bEJsb2NrSW5kZXggPSBwU2hiQ2lyQnVmZi0+bV91bFJkSW5kZXg7CisKKwkJd2hpbGUgKHVsRGF0YVJlYWRhYmxlID4gMCkgeworCQkJVFJBQ0UxKCJcblxuLS0tIEJsb2NrICMldSAtLS0iLCBuQmxvY2tDb3VudCk7CisKKwkJCS8vIGdldCBwb2ludGVyIHRvIHN0YXJ0IG9mIGRhdGEgYXJlYSBhbmQgY3VycmVudCByZWFkIGluZGV4CisJCQlwU2hiQ2lyRGF0YVB0ciA9ICZwU2hiQ2lyQnVmZi0+bV9EYXRhOwkvLyBwdHIgdG8gc3RhcnQgb2YgZGF0YSBhcmVhCisJCQl1bFJkSW5kZXggPSB1bEJsb2NrSW5kZXg7CisKKwkJCS8vIGdldCByZWFsIHNpemUgb2YgY3VycmVudCBibG9jayAoaW5jbC4gYWxpZ25tZW50IGZpbGwgYnl0ZXMpCisJCQlTaGJDaXJCbG9ja1NpemUgPQorCQkJICAgICoodFNoYkNpckJsb2NrU2l6ZSAqKSAocFNoYkNpckRhdGFQdHIgKyB1bFJkSW5kZXgpOworCQkJdWxSZEluZGV4ICs9IHNpemVvZih0U2hiQ2lyQmxvY2tTaXplKTsKKwkJCXVsUmRJbmRleCAlPSBwU2hiQ2lyQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplOworCisJCQkvLyBnZXQgc2l6ZSBvZiB1c2VyIGRhdGEgaW5zaWRlIHRoZSBjdXJyZW50IGJsb2NrCisJCQl1bERhdGFTaXplID0KKwkJCSAgICBTaGJDaXJCbG9ja1NpemUubV91aUZ1bGxCbG9ja1NpemUgLQorCQkJICAgIFNoYkNpckJsb2NrU2l6ZS5tX3VpQWxpZ25GaWxsQnl0ZXM7CisJCQl1bERhdGFTaXplIC09IHNpemVvZih0U2hiQ2lyQmxvY2tTaXplKTsKKworCQkJVFJBQ0UxCisJCQkgICAgKCJcbkZ1bGwgRGF0YSBTaXplOiAgICAgICAlNHUgW0J5dGVzXSAoaW5jbC4gaGVhZGVyIGFuZCBhbGlnbm1lbnQgZmlsbCBieXRlcykiLAorCQkJICAgICBTaGJDaXJCbG9ja1NpemUubV91aUZ1bGxCbG9ja1NpemUpOworCQkJVFJBQ0UxKCJcblVzZXIgRGF0YSBTaXplOiAgICAgICAlNGx1IFtCeXRlc10iLAorCQkJICAgICAgIHVsRGF0YVNpemUpOworCQkJVFJBQ0UxKCJcbkFsaWdubWVudCBGaWxsIEJ5dGVzOiAlNHUgW0J5dGVzXSIsCisJCQkgICAgICAgU2hiQ2lyQmxvY2tTaXplLm1fdWlBbGlnbkZpbGxCeXRlcyk7CisKKwkJCWlmICh1bFJkSW5kZXggKyB1bERhdGFTaXplIDw9CisJCQkgICAgcFNoYkNpckJ1ZmYtPm1fdWxCdWZmZXJEYXRhU2l6ZSkgeworCQkJCS8vIGxpbmVhciBkYXRhIGJ1ZmZlcgorCQkJCVNoYlRyYWNlRHVtcChwU2hiQ2lyRGF0YVB0ciArIHVsUmRJbmRleCwKKwkJCQkJICAgICB1bERhdGFTaXplLCAweDAwMDAwMDAwTCwgTlVMTCk7CisJCQl9IGVsc2UgeworCQkJCS8vIHdyYXAtYXJvdW5kIGRhdGEgYnVmZmVyCisJCQkJdWxDaHVua1NpemUgPQorCQkJCSAgICBwU2hiQ2lyQnVmZi0+bV91bEJ1ZmZlckRhdGFTaXplIC0gdWxSZEluZGV4OworCQkJCVNoYlRyYWNlRHVtcChwU2hiQ2lyRGF0YVB0ciArIHVsUmRJbmRleCwKKwkJCQkJICAgICB1bENodW5rU2l6ZSwgMHgwMDAwMDAwMEwsIE5VTEwpOworCQkJCVNoYlRyYWNlRHVtcChwU2hiQ2lyRGF0YVB0ciwKKwkJCQkJICAgICB1bERhdGFTaXplIC0gdWxDaHVua1NpemUsCisJCQkJCSAgICAgdWxDaHVua1NpemUsIE5VTEwpOworCQkJfQorCisJCQluQmxvY2tDb3VudCsrOworCisJCQl1bEJsb2NrSW5kZXggKz0gU2hiQ2lyQmxvY2tTaXplLm1fdWlGdWxsQmxvY2tTaXplOworCQkJdWxCbG9ja0luZGV4ICU9IHBTaGJDaXJCdWZmLT5tX3VsQnVmZmVyRGF0YVNpemU7CisKKwkJCXVsRGF0YVJlYWRhYmxlIC09IFNoYkNpckJsb2NrU2l6ZS5tX3VpRnVsbEJsb2NrU2l6ZTsKKwkJfQorCisJCUFTU0VSVChwU2hiQ2lyQnVmZi0+bV91bEJsb2Nrc1JlYWRhYmxlID09IG5CbG9ja0NvdW50IC0gMSk7CisJfQorCVNoYklwY0xlYXZlQXRvbWljU2VjdGlvbihwU2hiSW5zdGFuY2VfcCk7CisKKyAgICAgIEV4aXQ6CisKKwlyZXR1cm4gKFNoYkVycm9yKTsKKworfQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgTCBpIG4gZSBhIHIgICBTIGggYSByIGUgZCAgIEIgdSBmIGYgZSByICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEFsbG9jYXRlIExpbmVhciBTaGFyZWQgQnVmZmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0U2hiRXJyb3IgU2hiTGluQWxsb2NCdWZmZXIodW5zaWduZWQgbG9uZyB1bEJ1ZmZlclNpemVfcCwKKwkJCSAgICBjb25zdCBjaGFyICpwc3pCdWZmZXJJRF9wLAorCQkJICAgIHRTaGJJbnN0YW5jZSAqIHBwU2hiSW5zdGFuY2VfcCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgKnBmU2hiTmV3Q3JlYXRlZF9wKQoreworCisJdFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZTsKKwl0U2hiTGluQnVmZiAqcFNoYkxpbkJ1ZmY7CisJdW5zaWduZWQgaW50IGZTaGJOZXdDcmVhdGVkOworCXVuc2lnbmVkIGxvbmcgdWxCdWZmZXJEYXRhU2l6ZTsKKwl1bnNpZ25lZCBsb25nIHVsQnVmZmVyVG90YWxTaXplOworCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCS8vIGNoZWNrIGFyZ3VtZW50cworCWlmICgodWxCdWZmZXJTaXplX3AgPT0gMCkgfHwgKHBwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSkgeworCQlyZXR1cm4gKGtTaGJJbnZhbGlkQXJnKTsKKwl9CisKKwkvLyBjYWxjdWxhdGUgbGVuZ3RoIG9mIG1lbW9yeSB0byBhbGxvY2F0ZQorCXVsQnVmZmVyRGF0YVNpemUgPQorCSAgICAodWxCdWZmZXJTaXplX3AgKworCSAgICAgKFNCTF9CTE9DS19BTElHTk1FTlQgLSAxKSkgJiB+KFNCTF9CTE9DS19BTElHTk1FTlQgLSAxKTsKKwl1bEJ1ZmZlclRvdGFsU2l6ZSA9IHVsQnVmZmVyRGF0YVNpemUgKyBzaXplb2YodFNoYkxpbkJ1ZmYpOworCisJLy8gYWxsb2NhdGUgYSBuZXcgb3Igb3BlbiBhbiBleGlzdGluZyBzaGFyZWQgYnVmZmVyCisJU2hiRXJyb3IgPSBTaGJJcGNBbGxvY0J1ZmZlcih1bEJ1ZmZlclRvdGFsU2l6ZSwgcHN6QnVmZmVySURfcCwKKwkJCQkgICAgICZwU2hiSW5zdGFuY2UsICZmU2hiTmV3Q3JlYXRlZCk7CisJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgeworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKHBTaGJJbnN0YW5jZSA9PSBOVUxMKSB7CisJCVNoYkVycm9yID0ga1NoYk91dE9mTWVtOworCQlnb3RvIEV4aXQ7CisJfQorCisJLy8gZ2V0IHBvaW50ZXIgdG8gc2hhcmVkIGJ1ZmZlcgorCXBTaGJMaW5CdWZmID0gKHRTaGJMaW5CdWZmICopIFNoYklwY0dldFNoTWVtUHRyKHBTaGJJbnN0YW5jZSk7CisKKwkvLyBpZiB0aGUgc2hhcmVkIGJ1ZmZlciB3YXMgbmV3IGNyZWF0ZWQsIHRoYW4gdGhpcyBwcm9jZXNzIGhhcworCS8vIHRvIGluaXRpYWxpemUgaXQsIG90aGVyd2lzZSB0aGUgYnVmZmVyIGlzIGFscmVhZHkgaW4gdXNlCisJLy8gYW5kICptdXN0IG5vdCogYmUgcmVzZXRlZAorCWlmIChmU2hiTmV3Q3JlYXRlZCkgeworI2lmbmRlZiBOREVCVUcKKwkJeworCQkJbWVtc2V0KHBTaGJMaW5CdWZmLCAweENDLCB1bEJ1ZmZlclRvdGFsU2l6ZSk7CisJCX0KKyNlbmRpZgorCisJCXBTaGJMaW5CdWZmLT5tX1NoYkxpbk1hZ2ljSUQgPSBTQkxfTUFHSUNfSUQ7CisJCXBTaGJMaW5CdWZmLT5tX3VsQnVmZmVyVG90YWxTaXplID0gdWxCdWZmZXJUb3RhbFNpemU7CisJCXBTaGJMaW5CdWZmLT5tX3VsQnVmZmVyRGF0YVNpemUgPSB1bEJ1ZmZlckRhdGFTaXplOworCX0gZWxzZSB7CisJCWlmIChwU2hiTGluQnVmZi0+bV9TaGJMaW5NYWdpY0lEICE9IFNCTF9NQUdJQ19JRCkgeworCQkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEJ1ZmZlclR5cGU7CisJCQlnb3RvIEV4aXQ7CisJCX0KKwl9CisKKyAgICAgIEV4aXQ6CisKKwkqcHBTaGJJbnN0YW5jZV9wID0gcFNoYkluc3RhbmNlOworCSpwZlNoYk5ld0NyZWF0ZWRfcCA9IGZTaGJOZXdDcmVhdGVkOworCisJcmV0dXJuIChTaGJFcnJvcik7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBSZWxlYXNlIExpbmVhciBTaGFyZWQgQnVmZmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0U2hiRXJyb3IgU2hiTGluUmVsZWFzZUJ1ZmZlcih0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApCit7CisKKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisKKwkvLyBjaGVjayBhcmd1bWVudHMKKwlpZiAocFNoYkluc3RhbmNlX3AgPT0gTlVMTCkgeworCQlTaGJFcnJvciA9IGtTaGJPazsKKwkJZ290byBFeGl0OworCX0KKworCVNoYkVycm9yID0gU2hiSXBjUmVsZWFzZUJ1ZmZlcihwU2hiSW5zdGFuY2VfcCk7CisKKyAgICAgIEV4aXQ6CisKKwlyZXR1cm4gKFNoYkVycm9yKTsKKworfQorCisjZW5kaWYgLy8gIWRlZmluZWQoSU5MSU5FX0VOQUJMRUQpCisKKyNpZiAoIWRlZmluZWQoU0hBUkVEQlVGRl9JTkxJTkVEKSkgfHwgZGVmaW5lZChJTkxJTkVfRU5BQkxFRCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBXcml0ZSBkYXRhIGJsb2NrIHRvIExpbmVhciBTaGFyZWQgQnVmZmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYkVycm9yIFNoYkxpbldyaXRlRGF0YUJsb2NrKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdWxEc3RCdWZmZXJPZmZzX3AsCisJCQkJCSAgICAgICBjb25zdCB2b2lkICpwU3JjRGF0YUJsb2NrX3AsCisJCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHVsRGF0YUJsb2NrU2l6ZV9wKQoreworCisJdFNoYkxpbkJ1ZmYgKnBTaGJMaW5CdWZmOworCXVuc2lnbmVkIGNoYXIgKnBTaGJMaW5EYXRhUHRyOworCXVuc2lnbmVkIGNoYXIgKnBTY3JEYXRhUHRyOworCXVuc2lnbmVkIGxvbmcgdWxCdWZmZXJEYXRhU2l6ZTsKKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisKKwkvLyBjaGVjayBhcmd1bWVudHMKKwlpZiAocFNoYkluc3RhbmNlX3AgPT0gTlVMTCkgeworCQlTaGJFcnJvciA9IGtTaGJJbnZhbGlkQXJnOworCQlnb3RvIEV4aXQ7CisJfQorCisJaWYgKChwU3JjRGF0YUJsb2NrX3AgPT0gTlVMTCkgfHwgKHVsRGF0YUJsb2NrU2l6ZV9wID09IDApKSB7CisJCS8vIG5vdGhpbmcgdG8gZG8gaGVyZQorCQlTaGJFcnJvciA9IGtTaGJPazsKKwkJZ290byBFeGl0OworCX0KKworCWlmICh1bERhdGFCbG9ja1NpemVfcCA+IFNCTF9NQVhfQkxPQ0tfU0laRSkgeworCQlTaGJFcnJvciA9IGtTaGJFeGNlZWREYXRhU2l6ZUxpbWl0OworCQlnb3RvIEV4aXQ7CisJfQorCisJcFNoYkxpbkJ1ZmYgPSBTaGJMaW5HZXRCdWZmZXIocFNoYkluc3RhbmNlX3ApOworCXBTY3JEYXRhUHRyID0gKHVuc2lnbmVkIGNoYXIgKilwU3JjRGF0YUJsb2NrX3A7CisJU2hiRXJyb3IgPSBrU2hiT2s7CisKKwlpZiAocFNoYkxpbkJ1ZmYtPm1fU2hiTGluTWFnaWNJRCAhPSBTQkxfTUFHSUNfSUQpIHsKKwkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEJ1ZmZlclR5cGU7CisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLyBjaGVjayBpZiBvZmZlc2V0IGFuZCBzaXplIGZvciB0aGUgd3JpdGUgb3BlcmF0aW9uIG1hdGNoZXMgd2l0aAorCS8vIHRoZSBzaXplIG9mIHRoZSBzaGFyZWQgYnVmZmVyCisJdWxCdWZmZXJEYXRhU2l6ZSA9IHBTaGJMaW5CdWZmLT5tX3VsQnVmZmVyRGF0YVNpemU7CisJaWYgKCh1bERzdEJ1ZmZlck9mZnNfcCA+IHVsQnVmZmVyRGF0YVNpemUpIHx8CisJICAgICh1bERhdGFCbG9ja1NpemVfcCA+IHVsQnVmZmVyRGF0YVNpemUpIHx8CisJICAgICgodWxEc3RCdWZmZXJPZmZzX3AgKyB1bERhdGFCbG9ja1NpemVfcCkgPiB1bEJ1ZmZlckRhdGFTaXplKSkgeworCQlTaGJFcnJvciA9IGtTaGJEYXRhT3V0c2lkZUJ1ZmZlckFyZWE7CisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLyBjb3B5IHRoZSBkYXRhIHRvIHRoZSBsaW5lYXIgYnVmZmVyCisJLy8gKHRoZSBjb3B5IHByb2Nlc3Mgd2lsbCBiZSBkb25lIGluc2lkZSBvZiBhbnkgY3JpdGljYWwvbG9ja2VkIHNlY3Rpb24pCisJcFNoYkxpbkRhdGFQdHIgPSAmcFNoYkxpbkJ1ZmYtPm1fRGF0YTsJLy8gcHRyIHRvIHN0YXJ0IG9mIGRhdGEgYXJlYQorCXBTaGJMaW5EYXRhUHRyICs9IHVsRHN0QnVmZmVyT2Zmc19wOworCisJU2hiSXBjRW50ZXJBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKwl7CisJCW1lbWNweShwU2hiTGluRGF0YVB0ciwgcFNjckRhdGFQdHIsIHVsRGF0YUJsb2NrU2l6ZV9wKTsKKwl9CisJU2hiSXBjTGVhdmVBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKworICAgICAgRXhpdDoKKworCXJldHVybiAoU2hiRXJyb3IpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgUmVhZCBkYXRhIGJsb2NrIGZyb20gTGluZWFyIFNoYXJlZCBCdWZmZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiRXJyb3IgU2hiTGluUmVhZERhdGFCbG9jayh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3AsCisJCQkJCSAgICAgIHZvaWQgKnBEc3REYXRhQmxvY2tfcCwKKwkJCQkJICAgICAgdW5zaWduZWQgbG9uZyB1bFNyY0J1ZmZlck9mZnNfcCwKKwkJCQkJICAgICAgdW5zaWduZWQgbG9uZyB1bERhdGFCbG9ja1NpemVfcCkKK3sKKworCXRTaGJMaW5CdWZmICpwU2hiTGluQnVmZjsKKwl1bnNpZ25lZCBjaGFyICpwU2hiTGluRGF0YVB0cjsKKwl1bnNpZ25lZCBjaGFyICpwRHN0RGF0YVB0cjsKKwl1bnNpZ25lZCBsb25nIHVsQnVmZmVyRGF0YVNpemU7CisJdFNoYkVycm9yIFNoYkVycm9yOworCisJLy8gY2hlY2sgYXJndW1lbnRzCisJaWYgKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHsKKwkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEFyZzsKKwkJZ290byBFeGl0OworCX0KKworCWlmICgocERzdERhdGFCbG9ja19wID09IE5VTEwpIHx8ICh1bERhdGFCbG9ja1NpemVfcCA9PSAwKSkgeworCQkvLyBub3RoaW5nIHRvIGRvIGhlcmUKKwkJU2hiRXJyb3IgPSBrU2hiT2s7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAodWxEYXRhQmxvY2tTaXplX3AgPiBTQkxfTUFYX0JMT0NLX1NJWkUpIHsKKwkJU2hiRXJyb3IgPSBrU2hiRXhjZWVkRGF0YVNpemVMaW1pdDsKKwkJZ290byBFeGl0OworCX0KKworCXBTaGJMaW5CdWZmID0gU2hiTGluR2V0QnVmZmVyKHBTaGJJbnN0YW5jZV9wKTsKKwlwRHN0RGF0YVB0ciA9ICh1bnNpZ25lZCBjaGFyICopcERzdERhdGFCbG9ja19wOworCVNoYkVycm9yID0ga1NoYk9rOworCisJaWYgKHBTaGJMaW5CdWZmLT5tX1NoYkxpbk1hZ2ljSUQgIT0gU0JMX01BR0lDX0lEKSB7CisJCVNoYkVycm9yID0ga1NoYkludmFsaWRCdWZmZXJUeXBlOworCQlnb3RvIEV4aXQ7CisJfQorCisJLy8gY2hlY2sgaWYgb2ZmZXNldCBhbmQgc2l6ZSBmb3IgdGhlIHJlYWQgb3BlcmF0aW9uIG1hdGNoZXMgd2l0aAorCS8vIHRoZSBzaXplIG9mIHRoZSBzaGFyZWQgYnVmZmVyCisJdWxCdWZmZXJEYXRhU2l6ZSA9IHBTaGJMaW5CdWZmLT5tX3VsQnVmZmVyRGF0YVNpemU7CisJaWYgKCh1bFNyY0J1ZmZlck9mZnNfcCA+IHVsQnVmZmVyRGF0YVNpemUpIHx8CisJICAgICh1bERhdGFCbG9ja1NpemVfcCA+IHVsQnVmZmVyRGF0YVNpemUpIHx8CisJICAgICgodWxTcmNCdWZmZXJPZmZzX3AgKyB1bERhdGFCbG9ja1NpemVfcCkgPiB1bEJ1ZmZlckRhdGFTaXplKSkgeworCQlTaGJFcnJvciA9IGtTaGJEYXRhT3V0c2lkZUJ1ZmZlckFyZWE7CisJCWdvdG8gRXhpdDsKKwl9CisKKwkvLyBjb3B5IHRoZSBkYXRhIHRvIHRoZSBsaW5lYXIgYnVmZmVyCisJLy8gKHRoZSBjb3B5IHByb2Nlc3Mgd2lsbCBiZSBkb25lIGluc2lkZSBvZiBhbnkgY3JpdGljYWwvbG9ja2VkIHNlY3Rpb24pCisJcFNoYkxpbkRhdGFQdHIgPSAmcFNoYkxpbkJ1ZmYtPm1fRGF0YTsJLy8gcHRyIHRvIHN0YXJ0IG9mIGRhdGEgYXJlYQorCXBTaGJMaW5EYXRhUHRyICs9IHVsU3JjQnVmZmVyT2Zmc19wOworCisJU2hiSXBjRW50ZXJBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKwl7CisJCW1lbWNweShwRHN0RGF0YVB0ciwgcFNoYkxpbkRhdGFQdHIsIHVsRGF0YUJsb2NrU2l6ZV9wKTsKKwl9CisJU2hiSXBjTGVhdmVBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKworICAgICAgRXhpdDoKKworCXJldHVybiAoU2hiRXJyb3IpOworCit9CisKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoSU5MSU5FX0VOQUJMRUQpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgREVCVUc6IFRyYWNlIExpbmVhciBTaGFyZWQgQnVmZmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZuZGVmIE5ERUJVRwordFNoYkVycm9yIFNoYkxpblRyYWNlQnVmZmVyKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCkKK3sKKworCXRTaGJMaW5CdWZmICpwU2hiTGluQnVmZjsKKwljaGFyIHN6TWFnaWdJRFtzaXplb2YoU0JMX01BR0lDX0lEKSArIDFdOworCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCVRSQUNFMCgiXG5cbiMjIyMjIExpbmVhciBTaGFyZWQgQnVmZmVyICMjIyMjXG4iKTsKKworCS8vIGNoZWNrIGFyZ3VtZW50cworCWlmIChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB7CisJCVRSQUNFMSgiXG5FUlJPUjogaW52YWxpZCBidWZmZXIgYWRkcmVzcyAoMHglMDhsWClcbiIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZylwU2hiSW5zdGFuY2VfcCk7CisJCVNoYkVycm9yID0ga1NoYkludmFsaWRBcmc7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlwU2hiTGluQnVmZiA9IFNoYkxpbkdldEJ1ZmZlcihwU2hiSW5zdGFuY2VfcCk7CisJU2hiRXJyb3IgPSBrU2hiT2s7CisKKwlpZiAocFNoYkxpbkJ1ZmYtPm1fU2hiTGluTWFnaWNJRCAhPSBTQkxfTUFHSUNfSUQpIHsKKwkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEJ1ZmZlclR5cGU7CisJCWdvdG8gRXhpdDsKKwl9CisKKwkqKHVuc2lnbmVkIGludCAqKSZzek1hZ2lnSURbMF0gPSBwU2hiTGluQnVmZi0+bV9TaGJMaW5NYWdpY0lEOworCXN6TWFnaWdJRFtzaXplb2YoU0JMX01BR0lDX0lEKV0gPSAnXDAnOworCisJU2hiSXBjRW50ZXJBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKwl7CisJCVRSQUNFMSgiXG5CdWZmZXIgQWRkcmVzczogICAweCUwOGxYXG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcFNoYkxpbkJ1ZmYpOworCisJCVRSQUNFMCgiXG5IZWFkZXIgSW5mbzoiKTsKKwkJVFJBQ0UyKCJcbk1hZ2lnSUQ6ICAgICAgICAgICclcycgKCUwOFgpIiwgc3pNYWdpZ0lELAorCQkgICAgICAgcFNoYkxpbkJ1ZmYtPm1fU2hiTGluTWFnaWNJRCk7CisJCVRSQUNFMSgiXG5CdWZmZXJUb3RhbFNpemU6ICAlNGx1IFtCeXRlc10iLAorCQkgICAgICAgcFNoYkxpbkJ1ZmYtPm1fdWxCdWZmZXJUb3RhbFNpemUpOworCQlUUkFDRTEoIlxuQnVmZmVyRGF0YVNpemU6ICAgJTRsdSBbQnl0ZXNdIiwKKwkJICAgICAgIHBTaGJMaW5CdWZmLT5tX3VsQnVmZmVyRGF0YVNpemUpOworCisJCVNoYlRyYWNlRHVtcCgmcFNoYkxpbkJ1ZmYtPm1fRGF0YSwKKwkJCSAgICAgcFNoYkxpbkJ1ZmYtPm1fdWxCdWZmZXJEYXRhU2l6ZSwgMHgwMDAwMDAwMEwsCisJCQkgICAgICJcbkRhdGEgQXJlYToiKTsKKwl9CisJU2hiSXBjTGVhdmVBdG9taWNTZWN0aW9uKHBTaGJJbnN0YW5jZV9wKTsKKworICAgICAgRXhpdDoKKworCXJldHVybiAoU2hiRXJyb3IpOworCit9CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBEdW1wIGJ1ZmZlciBjb250ZW50cworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBOREVCVUcKK3RTaGJFcnJvciBTaGJUcmFjZUR1bXAoY29uc3QgdW5zaWduZWQgY2hhciAqcGFiU3RhcnRBZGRyX3AsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIHVsRGF0YVNpemVfcCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgdWxBZGRyT2Zmc2V0X3AsIGNvbnN0IGNoYXIgKnBzekluZm9UZXh0X3ApCit7CisKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwYWJCdWZmRGF0YTsKKwl1bnNpZ25lZCBsb25nIHVsQnVmZlNpemU7CisJdW5zaWduZWQgY2hhciBiRGF0YTsKKwlpbnQgblJvdzsKKwlpbnQgbkNvbDsKKworCS8vIGdldCBwb2ludGVyIHRvIGJ1ZmZlciBhbmQgbGVuZ3RoIG9mIGJ1ZmZlcgorCXBhYkJ1ZmZEYXRhID0gcGFiU3RhcnRBZGRyX3A7CisJdWxCdWZmU2l6ZSA9IHVsRGF0YVNpemVfcDsKKworCWlmIChwc3pJbmZvVGV4dF9wICE9IE5VTEwpIHsKKwkJVFJBQ0UwKHBzekluZm9UZXh0X3ApOworCX0KKwkvLyBkdW1wIGJ1ZmZlciBjb250ZW50cworCWZvciAoblJvdyA9IDA7OyBuUm93KyspIHsKKwkJVFJBQ0UxKCJcbiUwOGxYOiAgICIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZykoblJvdyAqIDB4MTApICsgdWxBZGRyT2Zmc2V0X3ApOworCisJCWZvciAobkNvbCA9IDA7IG5Db2wgPCAxNjsgbkNvbCsrKSB7CisJCQlpZiAoKHVuc2lnbmVkIGxvbmcpbkNvbCA8IHVsQnVmZlNpemUpIHsKKwkJCQlUUkFDRTEoIiUwMlggIiwKKwkJCQkgICAgICAgKHVuc2lnbmVkIGludCkqKHBhYkJ1ZmZEYXRhICsgbkNvbCkpOworCQkJfSBlbHNlIHsKKwkJCQlUUkFDRTAoIiAgICIpOworCQkJfQorCQl9CisKKwkJVFJBQ0UwKCIgIik7CisKKwkJZm9yIChuQ29sID0gMDsgbkNvbCA8IDE2OyBuQ29sKyspIHsKKwkJCWJEYXRhID0gKnBhYkJ1ZmZEYXRhKys7CisJCQlpZiAoKHVuc2lnbmVkIGxvbmcpbkNvbCA8IHVsQnVmZlNpemUpIHsKKwkJCQlpZiAoKGJEYXRhID49IDB4MjApICYmIChiRGF0YSA8IDB4N0YpKSB7CisJCQkJCVRSQUNFMSgiJWMiLCBiRGF0YSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJVFJBQ0UwKCIuIik7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlUUkFDRTAoIiAiKTsKKwkJCX0KKwkJfQorCisJCWlmICh1bEJ1ZmZTaXplID4gMTYpIHsKKwkJCXVsQnVmZlNpemUgLT0gMTY7CisJCX0gZWxzZSB7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiAoa1NoYk9rKTsKKworfQorI2VuZGlmIC8vICNpZm5kZWYgTkRFQlVHCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEhhbmRsZXIgdG8gc2lnbmFsIG5ldyBkYXRhIGV2ZW50IGZvciBDaXJjdWxhciBTaGFyZWQgQnVmZmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgU2hiQ2lyU2lnbmFsSGFuZGxlck5ld0RhdGEodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKQoreworCisJdFNoYkNpckJ1ZmYgKnBTaGJDaXJCdWZmOworCXVuc2lnbmVkIGxvbmcgdWxEYXRhU2l6ZTsKKwl1bnNpZ25lZCBsb25nIHVsQmxvY2tDb3VudDsKKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisKKwkvLyBjaGVjayBhcmd1bWVudHMKKwlpZiAocFNoYkluc3RhbmNlX3AgPT0gTlVMTCkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJcFNoYkNpckJ1ZmYgPSBTaGJDaXJHZXRCdWZmZXIocFNoYkluc3RhbmNlX3ApOworCVNoYkVycm9yID0ga1NoYk9rOworCisJaWYgKHBTaGJDaXJCdWZmLT5tX1NoYkNpck1hZ2ljSUQgIT0gU0JDX01BR0lDX0lEKSB7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkvLyBjYWxsIGFwcGxpY2F0aW9uIGhhbmRsZXIKKwlpZiAocFNoYkNpckJ1ZmYtPm1fcGZuU2lnSG5kbHJOZXdEYXRhICE9IE5VTEwpIHsKKy8qICAgICAgICBkbworICAgICAgICB7Ki8KKwkJU2hiRXJyb3IgPSBTaGJDaXJHZXRSZWFkRGF0YVNpemUocFNoYkluc3RhbmNlX3AsICZ1bERhdGFTaXplKTsKKwkJaWYgKCh1bERhdGFTaXplID4gMCkgJiYgKFNoYkVycm9yID09IGtTaGJPaykpIHsKKwkJCXBTaGJDaXJCdWZmLT5tX3BmblNpZ0huZGxyTmV3RGF0YShwU2hiSW5zdGFuY2VfcCwKKwkJCQkJCQkgIHVsRGF0YVNpemUpOworCQl9CisKKwkJU2hiRXJyb3IgPQorCQkgICAgU2hiQ2lyR2V0UmVhZEJsb2NrQ291bnQocFNoYkluc3RhbmNlX3AsICZ1bEJsb2NrQ291bnQpOworLyogICAgICAgIH0KKyAgICAgICAgd2hpbGUgKCh1bEJsb2NrQ291bnQgPiAwKSAmJiAoU2hiRXJyb3IgPT0ga1NoYk9rKSk7Ki8KKwl9CisJLy8gUmV0dXJuIFRSVUUgaWYgdGhlcmUgYXJlIHBlbmRpbmcgYmxvY2tzLgorCS8vIEluIHRoYXQgY2FzZSBTaGJJcGMgdHJpZXMgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGFnYWluIGltbWVkaWF0ZWx5IGlmIHRoZXJlCisJLy8gaXMgbm8gb3RoZXIgZmlsbGVkIHNoYXJlZCBidWZmZXIgd2l0aCBoaWdoZXIgcHJpb3JpdHkuCisJcmV0dXJuICgodWxCbG9ja0NvdW50ID4gMCkgJiYgKFNoYkVycm9yID09IGtTaGJPaykpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgSGFuZGxlciB0byByZXNldCBDaXJjdWxhciBTaGFyZWQgQnVmZmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFNoYkNpclNpZ25hbEhhbmRsZXJSZXNldCh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3AsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgZlRpbWVPdXRfcCkKK3sKKworCXRTaGJDaXJCdWZmICpwU2hiQ2lyQnVmZjsKKworCS8vIGNoZWNrIGFyZ3VtZW50cworCWlmIChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB7CisJCXJldHVybjsKKwl9CisKKwlwU2hiQ2lyQnVmZiA9IFNoYkNpckdldEJ1ZmZlcihwU2hiSW5zdGFuY2VfcCk7CisJaWYgKHBTaGJDaXJCdWZmLT5tX1NoYkNpck1hZ2ljSUQgIT0gU0JDX01BR0lDX0lEKSB7CisJCXJldHVybjsKKwl9CisKKwkvLyByZXNldCBidWZmZXIgaGVhZGVyCisJaWYgKCFmVGltZU91dF9wKSB7CisJCVNoYklwY0VudGVyQXRvbWljU2VjdGlvbihwU2hiSW5zdGFuY2VfcCk7CisJCXsKKwkJCXBTaGJDaXJCdWZmLT5tX3VsV3JJbmRleCA9IDA7CisJCQlwU2hiQ2lyQnVmZi0+bV91bFJkSW5kZXggPSAwOworCQkJcFNoYkNpckJ1ZmYtPm1fdWxOdW1PZldyaXRlSm9icyA9IDA7CisJCQlwU2hiQ2lyQnVmZi0+bV91bERhdGFJblVzZSA9IDA7CisJCQlwU2hiQ2lyQnVmZi0+bV91bERhdGFBcGVuZGVkID0gMDsKKwkJCXBTaGJDaXJCdWZmLT5tX3VsQmxvY2tzQXBlbmRlZCA9IDA7CisJCQlwU2hiQ2lyQnVmZi0+bV91bERhdGFSZWFkYWJsZSA9IDA7CisJCQlwU2hiQ2lyQnVmZi0+bV91bEJsb2Nrc1JlYWRhYmxlID0gMDsKKwkJfQorCQlTaGJJcGNMZWF2ZUF0b21pY1NlY3Rpb24ocFNoYkluc3RhbmNlX3ApOworCisjaWZuZGVmIE5ERUJVRworCQl7CisJCQltZW1zZXQoJnBTaGJDaXJCdWZmLT5tX0RhdGEsIDB4Q0MsCisJCQkgICAgICAgcFNoYkNpckJ1ZmYtPm1fdWxCdWZmZXJEYXRhU2l6ZSk7CisJCX0KKyNlbmRpZgorCX0KKworCS8vIGNhbGwgYXBwbGljYXRpb24gaGFuZGxlcgorCWlmIChwU2hiQ2lyQnVmZi0+bV9wZm5TaWdIbmRsclJlc2V0ICE9IE5VTEwpIHsKKwkJcFNoYkNpckJ1ZmYtPm1fcGZuU2lnSG5kbHJSZXNldChwU2hiSW5zdGFuY2VfcCwgZlRpbWVPdXRfcCk7CisJfQorCisJLy8gdW5sb2NrIGJ1ZmZlcgorCVNoYklwY0VudGVyQXRvbWljU2VjdGlvbihwU2hiSW5zdGFuY2VfcCk7CisJeworCQlwU2hiQ2lyQnVmZi0+bV9mQnVmZmVyTG9ja2VkID0gRkFMU0U7CisJCXBTaGJDaXJCdWZmLT5tX3BmblNpZ0huZGxyUmVzZXQgPSBOVUxMOworCX0KKwlTaGJJcGNMZWF2ZUF0b21pY1NlY3Rpb24ocFNoYkluc3RhbmNlX3ApOworCisJcmV0dXJuOworCit9CisKKyNlbmRpZgorCisvLyBFT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvU2hhcmVkQnVmZi5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9TaGFyZWRCdWZmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVjMWI0YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvU2hhcmVkQnVmZi5oCkBAIC0wLDAgKzEsMjA0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgUHJvamVjdCBpbmRlcGVuZGVuZCBzaGFyZWQgYnVmZmVyIChsaW5lYXIgKyBjaXJjdWxhcikKKworICBEZXNjcmlwdGlvbjogIERlY2xhcmF0aW9uIG9mIHBsYXRmb3JtIGluZGVwZW5kZW5kIHBhcnQgZm9yIHRoZQorICAgICAgICAgICAgICAgIHNoYXJlZCBidWZmZXIKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAyMDA2LzA2LzI3IC1yczogICBWIDEuMDAgKGluaXRpYWwgdmVyc2lvbikKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfU0hBUkVEQlVGRl9IXworI2RlZmluZSBfU0hBUkVEQlVGRl9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFR5cGUgZGVmaW5pdGlvbnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgZW51bSB7CisJa1NoYk9rID0gMCwKKwlrU2hiTm9SZWFkYWJsZURhdGEgPSAxLAorCWtTaGJEYXRhVHJ1bmNhdGVkID0gMiwKKwlrU2hiQnVmZmVyRnVsbCA9IDMsCisJa1NoYkRhdGFPdXRzaWRlQnVmZmVyQXJlYSA9IDQsCisJa1NoYkJ1ZmZlckFscmVhZHlDb21wbGV0ZWQgPSA1LAorCWtTaGJNZW1Vc2VkQnlPdGhlclByb2NzID0gNiwKKwlrU2hiT3Blbk1pc21hdGNoID0gNywKKwlrU2hiSW52YWxpZEJ1ZmZlclR5cGUgPSA4LAorCWtTaGJJbnZhbGlkQXJnID0gOSwKKwlrU2hiQnVmZmVySW52YWxpZCA9IDEwLAorCWtTaGJPdXRPZk1lbSA9IDExLAorCWtTaGJBbHJlYWR5UmVzZXRpbmcgPSAxMiwKKwlrU2hiQWxyZWFkeVNpZ25hbGluZyA9IDEzLAorCWtTaGJFeGNlZWREYXRhU2l6ZUxpbWl0ID0gMTQsCisKK30gdFNoYkVycm9yOworCisvLyAyMDA2LzA4LzI0IGQuay46IFByaW9yaXR5IGZvciB0aHJlYWRzIChuZXcgZGF0YSwgam9iIHNpZ25hbGluZykKK3R5cGVkZWYgZW51bSB7CisJa1NoYlByaW9yaXR5TG93ID0gMCwKKwlrU2hiUHJpb3JpdHlOb3JtYWwgPSAxLAorCWtzaGJQcmlvcml0eUhpZ2ggPSAyCit9IHRTaGJQcmlvcml0eTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBtX3VpRnVsbEJsb2NrU2l6ZTsJLy8gcmVhbCBzaXplIG9mIGFsbG9jYXRlZCBibG9jayAoaW5jbC4gYWxpZ25tZW50IGZpbGwgYnl0ZXMpCisJdW5zaWduZWQgbG9uZyBtX3VsQXZhaWxhYmxlU2l6ZTsJLy8gc3RpbGwgYXZhaWxhYmxlIHNpemUgZm9yIGRhdGEKKwl1bnNpZ25lZCBsb25nIG1fdWxXckluZGV4OwkvLyBjdXJyZW50IHdyaXRlIGluZGV4CisJdW5zaWduZWQgaW50IG1fZkJ1ZmZlckNvbXBsZXRlZDsJLy8gVFJVRSBpZiBhbGxvY2F0ZWQgYmxvY2sgaXMgY29tcGxldGUgZmlsbGVkIHdpdGggZGF0YQorCit9IHRTaGJDaXJDaHVuazsKKwordHlwZWRlZiB2b2lkICp0U2hiSW5zdGFuY2U7CisKK3R5cGVkZWYgdm9pZCAoKnRTaGJDaXJTaWdIbmRsck5ld0RhdGEpICh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3AsCisJCQkJCXVuc2lnbmVkIGxvbmcgdWxEYXRhQmxvY2tTaXplX3ApOwordHlwZWRlZiB2b2lkICgqdFNoYkNpclNpZ0huZGxyUmVzZXQpICh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3AsCisJCQkJICAgICAgdW5zaWduZWQgaW50IGZUaW1lT3V0X3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyojaWYgZGVmaW5lZChJTkxJTkVfRlVOQ1RJT05fREVGKQorICAgICN1bmRlZiAgSU5MSU5FX0ZVTkNUSU9OCisgICAgI2RlZmluZSBJTkxJTkVfRlVOQ1RJT04gICAgIElOTElORV9GVU5DVElPTl9ERUYKKyAgICAjZGVmaW5lIElOTElORV9FTkFCTEVEICAgICAgVFJVRQorICAgICNkZWZpbmUgU0hBUkVEQlVGRl9JTkxJTkVECisgICAgI2luY2x1ZGUgIlNoYXJlZEJ1ZmYuYyIKKyNlbmRpZgorKi8KKworCXRTaGJFcnJvciBTaGJJbml0KHZvaWQpOworCXRTaGJFcnJvciBTaGJFeGl0KHZvaWQpOworCisvLyBDaXJjdWxhciBTaGFyZWQgQnVmZmVyCisJdFNoYkVycm9yIFNoYkNpckFsbG9jQnVmZmVyKHVuc2lnbmVkIGxvbmcgdWxCdWZmZXJTaXplX3AsCisJCQkJICAgIGNvbnN0IGNoYXIgKnBzekJ1ZmZlcklEX3AsCisJCQkJICAgIHRTaGJJbnN0YW5jZSAqIHBwU2hiSW5zdGFuY2VfcCwKKwkJCQkgICAgdW5zaWduZWQgaW50ICpwZlNoYk5ld0NyZWF0ZWRfcCk7CisJdFNoYkVycm9yIFNoYkNpclJlbGVhc2VCdWZmZXIodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKTsKKworI2lmICFkZWZpbmVkKElOTElORV9FTkFCTEVEKQorCisJdFNoYkVycm9yIFNoYkNpclJlc2V0QnVmZmVyKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyB1bFRpbWVPdXRfcCwKKwkJCQkgICAgdFNoYkNpclNpZ0huZGxyUmVzZXQKKwkJCQkgICAgcGZuU2lnbmFsSGFuZGxlclJlc2V0X3ApOworCXRTaGJFcnJvciBTaGJDaXJXcml0ZURhdGFCbG9jayh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3AsCisJCQkJICAgICAgIGNvbnN0IHZvaWQgKnBTcmNEYXRhQmxvY2tfcCwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB1bERhdGFCbG9ja1NpemVfcCk7CisJdFNoYkVycm9yIFNoYkNpckFsbG9jRGF0YUJsb2NrKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCwKKwkJCQkgICAgICAgdFNoYkNpckNodW5rICogcFNoYkNpckNodW5rX3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdWxEYXRhQnVmZmVyU2l6ZV9wKTsKKwl0U2hiRXJyb3IgU2hiQ2lyV3JpdGVEYXRhQ2h1bmsodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wLAorCQkJCSAgICAgICB0U2hiQ2lyQ2h1bmsgKiBwU2hiQ2lyQ2h1bmtfcCwKKwkJCQkgICAgICAgY29uc3Qgdm9pZCAqcFNyY0RhdGFDaHVua19wLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHVsRGF0YUNodW5rU2l6ZV9wLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKnBmQnVmZmVyQ29tcGxldGVkX3ApOworCXRTaGJFcnJvciBTaGJDaXJSZWFkRGF0YUJsb2NrKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCwKKwkJCQkgICAgICB2b2lkICpwRHN0RGF0YUJsb2NrX3AsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyB1bFJkQnVmZlNpemVfcCwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nICpwdWxEYXRhQmxvY2tTaXplX3ApOworCXRTaGJFcnJvciBTaGJDaXJHZXRSZWFkRGF0YVNpemUodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wLAorCQkJCQl1bnNpZ25lZCBsb25nICpwdWxEYXRhQmxvY2tTaXplX3ApOworCXRTaGJFcnJvciBTaGJDaXJHZXRSZWFkQmxvY2tDb3VudCh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3AsCisJCQkJCSAgdW5zaWduZWQgbG9uZyAqcHVsRGF0YUJsb2NrQ291bnRfcCk7CisJdFNoYkVycm9yIFNoYkNpclNldFNpZ25hbEhhbmRsZXJOZXdEYXRhKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCwKKwkJCQkJCXRTaGJDaXJTaWdIbmRsck5ld0RhdGEKKwkJCQkJCXBmblNoYlNpZ25hbEhhbmRsZXJOZXdEYXRhX3AsCisJCQkJCQl0U2hiUHJpb3JpdHkgU2hiUHJpb3JpdHlfcCk7CisKKyNlbmRpZgorCisvLyBMaW5lYXIgU2hhcmVkIEJ1ZmZlcgorCXRTaGJFcnJvciBTaGJMaW5BbGxvY0J1ZmZlcih1bnNpZ25lZCBsb25nIHVsQnVmZmVyU2l6ZV9wLAorCQkJCSAgICBjb25zdCBjaGFyICpwc3pCdWZmZXJJRF9wLAorCQkJCSAgICB0U2hiSW5zdGFuY2UgKiBwcFNoYkluc3RhbmNlX3AsCisJCQkJICAgIHVuc2lnbmVkIGludCAqcGZTaGJOZXdDcmVhdGVkX3ApOworCXRTaGJFcnJvciBTaGJMaW5SZWxlYXNlQnVmZmVyKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCk7CisKKyNpZiAhZGVmaW5lZChJTkxJTkVfRU5BQkxFRCkKKworCXRTaGJFcnJvciBTaGJMaW5Xcml0ZURhdGFCbG9jayh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdWxEc3RCdWZmZXJPZmZzX3AsCisJCQkJICAgICAgIGNvbnN0IHZvaWQgKnBTcmNEYXRhQmxvY2tfcCwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB1bERhdGFCbG9ja1NpemVfcCk7CisJdFNoYkVycm9yIFNoYkxpblJlYWREYXRhQmxvY2sodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wLAorCQkJCSAgICAgIHZvaWQgKnBEc3REYXRhQmxvY2tfcCwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIHVsU3JjQnVmZmVyT2Zmc19wLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdWxEYXRhQmxvY2tTaXplX3ApOworCisjZW5kaWYKKworI2lmbmRlZiBOREVCVUcKKwl0U2hiRXJyb3IgU2hiQ2lyVHJhY2VCdWZmZXIodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKTsKKwl0U2hiRXJyb3IgU2hiTGluVHJhY2VCdWZmZXIodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKTsKKwl0U2hiRXJyb3IgU2hiVHJhY2VEdW1wKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBhYlN0YXJ0QWRkcl9wLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdWxEYXRhU2l6ZV9wLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdWxBZGRyT2Zmc2V0X3AsCisJCQkgICAgICAgY29uc3QgY2hhciAqcHN6SW5mb1RleHRfcCk7CisjZWxzZQorI2RlZmluZSBTaGJDaXJUcmFjZUJ1ZmZlcihwMCkKKyNkZWZpbmUgU2hiTGluVHJhY2VCdWZmZXIocDApCisjZGVmaW5lIFNoYlRyYWNlRHVtcChwMCwgcDEsIHAyLCBwMykKKyNlbmRpZgorCisjdW5kZWYgIElOTElORV9FTkFCTEVECQkvLyBkaXNhYmxlIGFjdHVhbCBpbmxpbmluZyBvZiBmdW5jdGlvbnMKKyN1bmRlZiAgSU5MSU5FX0ZVTkNUSU9OCisjZGVmaW5lIElOTElORV9GVU5DVElPTgkJLy8gZGVmaW5lIElOTElORV9GVU5DVElPTiB0byBub3RoaW5nCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYJCQkJLy8gI2lmbmRlZiBfU0hBUkVEQlVGRl9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9TaGJJcGMtTGludXhLZXJuZWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvU2hiSXBjLUxpbnV4S2VybmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQzY2IzZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvU2hiSXBjLUxpbnV4S2VybmVsLmMKQEAgLTAsMCArMSw5NjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBQcm9qZWN0IGluZGVwZW5kZW5kIHNoYXJlZCBidWZmZXIgKGxpbmVhciArIGNpcmN1bGFyKQorCisgIERlc2NyaXB0aW9uOiAgSW1wbGVtZW50YXRpb24gb2YgcGxhdGZvcm0gc3BlY2lmaWMgcGFydCBmb3IgdGhlCisgICAgICAgICAgICAgICAgc2hhcmVkIGJ1ZmZlcgorICAgICAgICAgICAgICAgIChJbXBsZW1lbnRhdGlvbiBmb3IgTGludXggS2VybmVsU3BhY2UpCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgMjAwNi8wNi8yOCAtcnM6ICAgViAxLjAwIChpbml0aWFsIHZlcnNpb24pCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJnbG9iYWwuaCIKKyNpbmNsdWRlICJTaGFyZWRCdWZmLmgiCisjaW5jbHVkZSAiU2hiSXBjLmgiCisjaW5jbHVkZSAiU2hiTGludXhLZXJuZWwuaCIKKyNpbmNsdWRlICJEZWJ1Zy5oIgorCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorLy8jaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAoIWRlZmluZWQoU0hCSVBDX0lOTElORUQpKSB8fCBkZWZpbmVkKFNIQklQQ19JTkxJTkVfRU5BQkxFRCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBDb25maWd1cmF0aW9uCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIENvbnN0YW50IGRlZmluaXRpb25zCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIE1BWF9MRU5fQlVGRkVSX0lEICAgICAgIDI1NgorCisjZGVmaW5lIFRJTUVPVVRfRU5URVJfQVRPTUlDICAgIDEwMDAJLy8gKG1zKSBmb3IgZGViZ2dpbmc6IElORklOSVRFCisjZGVmaW5lIFRJTUVPVVRfVEVSTV9USFJFQUQgICAgIDEwMDAKKyNkZWZpbmUgSU5GSU5JVEUgICAgICAgICAgICAgICAgMzYwMAorCisjZGVmaW5lIFNCSV9NQUdJQ19JRCAgICAgICAgICAgIDB4NTM0MjQ5MkIJLy8gbWFnaWMgSUQgKCJTQkkrIikKKyNkZWZpbmUgU0JIX01BR0lDX0lEICAgICAgICAgICAgMHg1MzQyNDgyQQkvLyBtYWdpYyBJRCAoIlNCSCoiKQorCisjZGVmaW5lIElOVkFMSURfSUQgICAgICAgICAgICAgIC0xCisKKyNkZWZpbmUgVEFCTEVfU0laRSAgICAgICAgICAgICAgMTAKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBMb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVGhpcyBzdHJ1Y3R1cmUgaXMgdGhlIGNvbW1vbiBoZWFkZXIgZm9yIHRoZSBzaGFyZWQgbWVtb3J5IHJlZ2lvbiB1c2VkCisvLyBieSBhbGwgcHJvY2Vzc2VzIGF0dGFjaGVkIHRoaXMgc2hhcmVkIG1lbW9yeS4gSXQgaW5jbHVkZXMgY29tbW9uCisvLyBpbmZvcm1hdGlvbiB0byBhZG1pbmlzdHJhdGUvbWFuYWdlIHRoZSBzaGFyZWQgYnVmZmVyIGZyb20gYSBjb3VwbGUgb2YKKy8vIHNlcGFyYXRlZCBwcm9jZXNzZXMgKGUuZy4gdGhlIHJlZmVybmNlIGNvdW50ZXIpLiBUaGlzIHN0cnVjdHVyZSBpcworLy8gbG9jYXRlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIHNoYXJlZCBtZW1vcnkgcmVnaW9uIGl0c2VsZiBhbmQgZXhpc3RzCisvLyBjb25zZXF1ZW50bHkgb25seSBvbmUgdGltZXMgcGVyIHNoYXJlZCBtZW1vcnkgaW5zdGFuY2UuCit0eXBlZGVmIHN0cnVjdCB7CisKKwl1bnNpZ25lZCBsb25nIG1fdWxTaE1lbVNpemU7CisJdW5zaWduZWQgbG9uZyBtX3VsUmVmQ291bnQ7CisJaW50IG1faUJ1ZmZlcklkOworLy8gICAgaW50ICAgICAgICAgICAgICAgICBtX2lVc2VyU3BhY2VNZW07ICAgICAgICAgICAvLzAgZm9yIHVzZXJzcGFjZSBtZW0gICAhPTAga2VybmVsc3BhY2UgbWVtCisJc3BpbmxvY2tfdCBtX1NwaW5sb2NrQnVmZkFjY2VzczsKKwlCT09MIG1fZk5ld0RhdGE7CisJQk9PTCBtX2ZKb2JSZWFkeTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBtX1dhaXRRdWV1ZU5ld0RhdGE7CisJd2FpdF9xdWV1ZV9oZWFkX3QgbV9XYWl0UXVldWVKb2JSZWFkeTsKKworI2lmbmRlZiBOREVCVUcKKwl1bnNpZ25lZCBsb25nIG1fdWxPd25lclByb2NJRDsKKyNlbmRpZgorCit9IHRTaGJNZW1IZWFkZXI7CisKKy8vIFRoaXMgc3RydWN0dXJlIGlzIHRoZSAiZXh0ZXJuYWwgZW50cnkgcG9pbnQiIGZyb20gYSBzZXBhcmF0ZSBwcm9jZXNzCisvLyB0byBnZXQgYWNjZXNzIHRvIGEgc2hhcmVkIGJ1ZmZlci4gVGhpcyBzdHJ1Y3R1cmUgaW5jbHVkZXMgYWxsIHBsYXRmb3JtCisvLyByZXNwLiB0YXJnZXQgc3BlY2lmaWMgaW5mb3JtYXRpb24gdG8gYWRtaW5pc3RyYXRlL21hbmFnZSB0aGUgc2hhcmVkCisvLyBidWZmZXIgZnJvbSBhIHNlcGFyYXRlIHByb2Nlc3MuIEV2ZXJ5IHByb2Nlc3MgYXR0YWNoZWQgdG8gdGhlIHNoYXJlZAorLy8gYnVmZmVyIGhhcyBpdHMgb3duIHJ1bnRpbWUgaW5zdGFuY2Ugb2YgdGhpcyBzdHJ1Y3R1cmUgd2l0aCBpdHMgaW5kaXZpZHVhbAorLy8gcnVudGltZSBkYXRhIChlLmcuIHRoZSBzY29wZSBvZiBhbiBldmVudCBoYW5kbGUgaXMgbGltaXR0ZWQgdG8gdGhlCisvLyBvd25lciBwcm9jZXNzIG9ubHkpLiBUaGUgc3RydWN0dXJlIG1lbWJlciA8bV9wU2hiTWVtSGVhZGVyPiBwb2ludHMKKy8vIHRvIHRoZSAocHJvY2VzcyBzcGVjaWZpYykgc3RhcnQgYWRkcmVzcyBvZiB0aGUgc2hhcmVkIG1lbW9yeSByZWdpb24KKy8vIGl0c2VsZi4KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIG1fU2JpTWFnaWNJRDsJLy8gbWFnaWMgSUQgKCJTQkkrIikKKy8vICAgIHZvaWQqICAgICAgICAgICAgICAgbV9wU2hhcmVkTWVtOworCWludCBtX3RUaHJlYWROZXdEYXRhSWQ7CisJbG9uZyBtX2xUaHJlYWROZXdEYXRhTmljZTsJLy8gbmljZSB2YWx1ZSBvZiB0aGUgbmV3IGRhdGEgdGhyZWFkCisJaW50IG1fdFRocmVhZEpvYlJlYWR5SWQ7CisJdW5zaWduZWQgbG9uZyBtX3VsRmxhZ3NCdWZmQWNjZXNzOwkvLyBkLmsuIG1vdmVkIGZyb20gdFNoYk1lbUhlYWRlciwgYmVjYXVzZSBlYWNoCisJLy8gcHJvY2VzcyBuZWVkcyB0byBzdG9yZSB0aGUgaW50ZXJydXB0IGZsYWdzIHNlcGFyYXRlbHkKKwl0U2lnSG5kbHJOZXdEYXRhIG1fcGZuU2lnSG5kbHJOZXdEYXRhOworCXVuc2lnbmVkIGxvbmcgbV91bFRpbWVPdXRKb2JSZWFkeTsKKwl0U2lnSG5kbHJKb2JSZWFkeSBtX3BmblNpZ0huZGxySm9iUmVhZHk7CisJdFNoYk1lbUhlYWRlciAqbV9wU2hiTWVtSGVhZGVyOworCWludCBtX2lUaHJlYWRUZXJtRmxhZzsKKwlzdHJ1Y3QgY29tcGxldGlvbiBtX0NvbXBsZXRpb25OZXdEYXRhOworLyoKKyAgICBzdHJ1Y3Qgc2VtYXBob3JlICAgICptX3BTZW1CdWZmQWNjZXNzOworICAgIHN0cnVjdCBzZW1hcGhvcmUgICAgKm1fcFNlbU5ld0RhdGE7CisgICAgc3RydWN0IHNlbWFwaG9yZSAgICAqbV9wU2VtU3RvcFNpZ25hbGluZ05ld0RhdGE7CisgICAgc3RydWN0IHNlbWFwaG9yZSAgICAqbV9wU2VtSm9iUmVhZHk7CisqLworI2lmbmRlZiBOREVCVUcKKwl1bnNpZ25lZCBsb25nIG1fdWxUaHJlYWRJRE5ld0RhdGE7CisJdW5zaWduZWQgbG9uZyBtX3VsVGhyZWFkSURKb2JSZWFkeTsKKyNlbmRpZgorfSB0U2hiTWVtSW5zdDsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBQcm90b3R5cGVzIG9mIGludGVybmFsIGZ1bmN0aW9ucworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy90U2hiTWVtSW5zdCogICAgICAgICAgICBTaGJJcGNHZXRTaGJNZW1JbnN0ICAgICAgICAgKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCk7CisvL3RTaGJNZW1IZWFkZXIqICAgICAgICAgIFNoYklwY0dldFNoYk1lbUhlYWRlciAgICAgICAodFNoYk1lbUluc3QqIHBTaGJNZW1JbnN0X3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEdldCBwb2ludGVyIHRvIHByb2Nlc3MgbG9jYWwgaW5mb3JtYXRpb24gc3RydWN0dXJlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW5saW5lIHRTaGJNZW1JbnN0ICpTaGJJcGNHZXRTaGJNZW1JbnN0KHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCkKK3sKKworCXRTaGJNZW1JbnN0ICpwU2hiTWVtSW5zdDsKKworCXBTaGJNZW1JbnN0ID0gKHRTaGJNZW1JbnN0ICopIHBTaGJJbnN0YW5jZV9wOworCisJcmV0dXJuIChwU2hiTWVtSW5zdCk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBHZXQgcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5IGhlYWRlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGlubGluZSB0U2hiTWVtSGVhZGVyICpTaGJJcGNHZXRTaGJNZW1IZWFkZXIodFNoYk1lbUluc3QgKiBwU2hiTWVtSW5zdF9wKQoreworCisJdFNoYk1lbUhlYWRlciAqcFNoYk1lbUhlYWRlcjsKKworCXBTaGJNZW1IZWFkZXIgPSBwU2hiTWVtSW5zdF9wLT5tX3BTaGJNZW1IZWFkZXI7CisKKwlyZXR1cm4gKHBTaGJNZW1IZWFkZXIpOworCit9CisKKy8vICBHZXQgcG9pbnRlciB0byBwcm9jZXNzIGxvY2FsIGluZm9ybWF0aW9uIHN0cnVjdHVyZQorLy8jZGVmaW5lIFNoYklwY0dldFNoYk1lbUluc3QocFNoYkluc3RhbmNlX3ApICgodFNoYk1lbUluc3QqKXBTaGJJbnN0YW5jZV9wKQorCisvLyAgR2V0IHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeSBoZWFkZXIKKy8vI2RlZmluZSBTaGJJcGNHZXRTaGJNZW1IZWFkZXIocFNoYk1lbUluc3RfcCkgKHBTaGJNZW1JbnN0X3AtPm1fcFNoYk1lbUhlYWRlcikKKworLy8gbm90IGlubGluZWQgaW50ZXJuYWwgZnVuY3Rpb25zCitpbnQgU2hiSXBjVGhyZWFkU2lnbmFsTmV3RGF0YSh2b2lkICpwdlRocmVhZFBhcmFtX3ApOworaW50IFNoYklwY1RocmVhZFNpZ25hbEpvYlJlYWR5KHZvaWQgKnB2VGhyZWFkUGFyYW1fcCk7CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmICFkZWZpbmVkKFNIQklQQ19JTkxJTkVfRU5BQkxFRCkKK3N0cnVjdCBzU2hiTWVtVGFibGUgKnBzTWVtVGFibGVFbGVtZW50Rmlyc3RfZzsKKworc3RhdGljIHZvaWQgKlNoYklwY0FsbG9jUHJpdmF0ZU1lbSh1bnNpZ25lZCBsb25nIHVsTWVtU2l6ZV9wKTsKK3N0YXRpYyBpbnQgU2hiSXBjRmluZExpc3RFbGVtZW50KGludCBpQnVmZmVySWQsCisJCQkJIHN0cnVjdCBzU2hiTWVtVGFibGUKKwkJCQkgKipwcHNSZXR1cm5NZW1UYWJsZUVsZW1lbnQpOworc3RhdGljIHZvaWQgU2hiSXBjQXBwZW5kTGlzdEVsZW1lbnQoc3RydWN0IHNTaGJNZW1UYWJsZSAqc05ld01lbVRhYmxlRWxlbWVudCk7CitzdGF0aWMgdm9pZCBTaGJJcGNEZWxldGVMaXN0RWxlbWVudChpbnQgaUJ1ZmZlcklkKTsKK3N0YXRpYyB2b2lkIFNoYklwY0NyYzMyR2VuVGFibGUodW5zaWduZWQgbG9uZyBhdWxDcmNUYWJsZVsyNTZdKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIFNoYklwY0NyYzMyR2V0Q3JjKGNvbnN0IGNoYXIgKnBjU3RyaW5nLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGF1bENyY1RhYmxlWzI1Nl0pOworCisjZW5kaWYKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKyNpZiAhZGVmaW5lZChTSEJJUENfSU5MSU5FX0VOQUJMRUQpCisvLyBub3QgaW5saW5lZCBleHRlcm5hbCBmdW5jdGlvbnMKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBJbml0aWFsaXplIElQQyBmb3IgU2hhcmVkIEJ1ZmZlciBNb2R1bGUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RTaGJFcnJvciBTaGJJcGNJbml0KHZvaWQpCit7CisJcHNNZW1UYWJsZUVsZW1lbnRGaXJzdF9nID0gTlVMTDsKKwlyZXR1cm4gKGtTaGJPayk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBEZWluaXRpYWxpemUgSVBDIGZvciBTaGFyZWQgQnVmZmVyIE1vZHVsZQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordFNoYkVycm9yIFNoYklwY0V4aXQodm9pZCkKK3sKKworCXJldHVybiAoa1NoYk9rKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEFsbG9jYXRlIFNoYXJlZCBCdWZmZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RTaGJFcnJvciBTaGJJcGNBbGxvY0J1ZmZlcih1bnNpZ25lZCBsb25nIHVsQnVmZmVyU2l6ZV9wLAorCQkJICAgIGNvbnN0IGNoYXIgKnBzekJ1ZmZlcklEX3AsCisJCQkgICAgdFNoYkluc3RhbmNlICogcHBTaGJJbnN0YW5jZV9wLAorCQkJICAgIHVuc2lnbmVkIGludCAqcGZTaGJOZXdDcmVhdGVkX3ApCit7CisJdFNoYkVycm9yIFNoYkVycm9yOworCWludCBpQnVmZmVySWQgPSAwOworCXVuc2lnbmVkIGxvbmcgdWxDcmMzMiA9IDA7CisJdW5zaWduZWQgaW50IHVpRmlyc3RQcm9jZXNzID0gMDsKKwl1bnNpZ25lZCBsb25nIHVsU2hNZW1TaXplOworCXRTaGJNZW1IZWFkZXIgKnBTaGJNZW1IZWFkZXI7CisJdFNoYk1lbUluc3QgKnBTaGJNZW1JbnN0ID0gTlVMTDsKKwl0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlOworCXVuc2lnbmVkIGludCBmU2hNZW1OZXdDcmVhdGVkID0gRkFMU0U7CisJdm9pZCAqcFNoYXJlZE1lbSA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBhdWxDcmNUYWJsZVsyNTZdOworCXN0cnVjdCBzU2hiTWVtVGFibGUgKnBzTWVtVGFibGVFbGVtZW50OworCisJREVCVUdfTFZMXzI5X1RSQUNFMCgiU2hiSXBjQWxsb2NCdWZmZXIgXG4iKTsKKwl1bFNoTWVtU2l6ZSA9IHVsQnVmZmVyU2l6ZV9wICsgc2l6ZW9mKHRTaGJNZW1IZWFkZXIpOworCisJLy9jcmVhdGUgQnVmZmVyIElECisJU2hiSXBjQ3JjMzJHZW5UYWJsZShhdWxDcmNUYWJsZSk7CisJdWxDcmMzMiA9IFNoYklwY0NyYzMyR2V0Q3JjKHBzekJ1ZmZlcklEX3AsIGF1bENyY1RhYmxlKTsKKwlpQnVmZmVySWQgPSB1bENyYzMyOworCURFQlVHX0xWTF8yOV9UUkFDRTIKKwkgICAgKCJTaGJJcGNBbGxvY0J1ZmZlciBCdWZmZXJTaXplOiVkIHNpemVvZih0U2hiLi4pOiVkXG4iLAorCSAgICAgdWxCdWZmZXJTaXplX3AsIHNpemVvZih0U2hiTWVtSGVhZGVyKSk7CisJREVCVUdfTFZMXzI5X1RSQUNFMigiU2hiSXBjQWxsb2NCdWZmZXIgQnVmZmVySWQ6JWQgTWVtU2l6ZTolZFxuIiwKKwkJCSAgICBpQnVmZmVySWQsIHVsU2hNZW1TaXplKTsKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vICgxKSBvcGVuIGFuIGV4aXN0aW5nIG9yIGNyZWF0ZSBhIG5ldyBzaGFyZWQgbWVtb3J5CisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvL3Rlc3QgaWYgYnVmZmVyIGFscmVhZHkgZXhpc3RzCisJaWYgKFNoYklwY0ZpbmRMaXN0RWxlbWVudChpQnVmZmVySWQsICZwc01lbVRhYmxlRWxlbWVudCkgPT0gMCkgeworCQkvL0J1ZmZlciBhbHJlYWR5IGV4aXN0cworCQlmU2hNZW1OZXdDcmVhdGVkID0gRkFMU0U7CisJCXBTaGFyZWRNZW0gPSBwc01lbVRhYmxlRWxlbWVudC0+bV9wQnVmZmVyOworCQlERUJVR19MVkxfMjlfVFJBQ0UxCisJCSAgICAoIlNoYklwY0FsbG9jQnVmZmVyIGF0dGFjaCBCdWZmZXIgYXQ6JXAgSWQ6JWRcbiIsCisJCSAgICAgcFNoYXJlZE1lbSk7CisJCXVpRmlyc3RQcm9jZXNzID0gMTsKKwl9IGVsc2UgeworCQkvL2NyZWF0ZSBuZXcgQnVmZmVyCisJCWZTaE1lbU5ld0NyZWF0ZWQgPSBUUlVFOworCQl1aUZpcnN0UHJvY2VzcyA9IDA7CisJCXBTaGFyZWRNZW0gPSBrbWFsbG9jKHVsU2hNZW1TaXplLCBHRlBfS0VSTkVMKTsKKwkJREVCVUdfTFZMXzI5X1RSQUNFMgorCQkgICAgKCJTaGJJcGNBbGxvY0J1ZmZlciBDcmVhdGUgTmV3IEJ1ZmZlciBhdDolcCBJZDolZFxuIiwKKwkJICAgICBwU2hhcmVkTWVtLCBpQnVmZmVySWQpOworCQlpZiAocFNoYXJlZE1lbSA9PSBOVUxMKSB7CisJCQkvL3VuYWJsZSB0byBjcmVhdGUgbWVtCisJCQlTaGJFcnJvciA9IGtTaGJPdXRPZk1lbTsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQlERUJVR19MVkxfMjlfVFJBQ0UwKCJTaGJJcGNBbGxvY0J1ZmZlciBjcmVhdGUgc2VtYXNcbiIpOworCQkvLyBhcHBlbmQgRWxlbWVudCB0byBNZW0gVGFibGUKKwkJcHNNZW1UYWJsZUVsZW1lbnQgPQorCQkgICAga21hbGxvYyhzaXplb2Yoc3RydWN0IHNTaGJNZW1UYWJsZSksIEdGUF9LRVJORUwpOworCQlwc01lbVRhYmxlRWxlbWVudC0+bV9pQnVmZmVySWQgPSBpQnVmZmVySWQ7CisJCXBzTWVtVGFibGVFbGVtZW50LT5tX3BCdWZmZXIgPSBwU2hhcmVkTWVtOworCQlwc01lbVRhYmxlRWxlbWVudC0+bV9wc05leHRNZW1UYWJsZUVsZW1lbnQgPSBOVUxMOworCQlTaGJJcGNBcHBlbmRMaXN0RWxlbWVudChwc01lbVRhYmxlRWxlbWVudCk7CisJfQorCisJREVCVUdfTFZMXzI5X1RSQUNFMCgiU2hiSXBjQWxsb2NCdWZmZXIgdXBkYXRlIGhlYWRlclxuIik7CisJLy91cGRhdGUgaGVhZGVyCisJcFNoYk1lbUhlYWRlciA9ICh0U2hiTWVtSGVhZGVyICopIHBTaGFyZWRNZW07CisJREVCVUdfTFZMXzI5X1RSQUNFMQorCSAgICAoIlNoYklwY0FsbG9jQnVmZmVyIDAgcFNoYk1lbUhlYWRlci0+bV91bFNoTWVtU2l6ZTogJWRcbiIsCisJICAgICBwU2hiTWVtSGVhZGVyLT5tX3VsU2hNZW1TaXplKTsKKwkvLyBhbGxvY2F0ZSBhIG1lbW9yeSBibG9jayBmcm9tIHByb2Nlc3Mgc3BlY2lmaWMgbWVtcG9vbCB0byBzYXZlCisJLy8gcHJvY2VzcyBsb2NhbCBpbmZvcm1hdGlvbiB0byBhZG1pbmlzdHJhdGUvbWFuYWdlIHRoZSBzaGFyZWQgYnVmZmVyCisJREVCVUdfTFZMXzI5X1RSQUNFMCgiU2hiSXBjQWxsb2NCdWZmZXIgYWxsb2MgcHJpdmF0ZSBtZW1cbiIpOworCXBTaGJNZW1JbnN0ID0KKwkgICAgKHRTaGJNZW1JbnN0ICopIFNoYklwY0FsbG9jUHJpdmF0ZU1lbShzaXplb2YodFNoYk1lbUluc3QpKTsKKwlpZiAocFNoYk1lbUluc3QgPT0gTlVMTCkgeworCQlTaGJFcnJvciA9IGtTaGJPdXRPZk1lbTsKKwkJZ290byBFeGl0OworCX0KKwkvLyByZXNldCBjb21wbGV0ZSBoZWFkZXIgdG8gZGVmYXVsdCB2YWx1ZXMKKwkvL3BTaGJNZW1JbnN0LT5tX1NiaU1hZ2ljSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gU0JJX01BR0lDX0lEOworLy8gICAgcFNoYk1lbUluc3QtPm1fcFNoYXJlZE1lbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHBTaGFyZWRNZW07CisJcFNoYk1lbUluc3QtPm1fdFRocmVhZE5ld0RhdGFJZCA9IElOVkFMSURfSUQ7CisJcFNoYk1lbUluc3QtPm1fdFRocmVhZEpvYlJlYWR5SWQgPSBJTlZBTElEX0lEOworCXBTaGJNZW1JbnN0LT5tX3BmblNpZ0huZGxyTmV3RGF0YSA9IE5VTEw7CisJcFNoYk1lbUluc3QtPm1fdWxUaW1lT3V0Sm9iUmVhZHkgPSAwOworCXBTaGJNZW1JbnN0LT5tX3BmblNpZ0huZGxySm9iUmVhZHkgPSBOVUxMOworCXBTaGJNZW1JbnN0LT5tX3BTaGJNZW1IZWFkZXIgPSBwU2hiTWVtSGVhZGVyOworCXBTaGJNZW1JbnN0LT5tX2lUaHJlYWRUZXJtRmxhZyA9IDA7CisKKwkvLyBpbml0aWFsaXplIGNvbXBsZXRpb24gZXRjLgorCWluaXRfY29tcGxldGlvbigmcFNoYk1lbUluc3QtPm1fQ29tcGxldGlvbk5ld0RhdGEpOworCisJU2hiRXJyb3IgPSBrU2hiT2s7CisJaWYgKGZTaE1lbU5ld0NyZWF0ZWQpIHsKKwkJLy8gdGhpcyBwcm9jZXNzIHdhcyB0aGUgZmlyc3Qgd2hvIHdhbnRlZCB0byB1c2UgdGhlIHNoYXJlZCBtZW1vcnksCisJCS8vIHNvIGEgbmV3IHNoYXJlZCBtZW1vcnkgd2FzIGNyZWF0ZWQKKwkJLy8gLT4gc2V0dXAgbmV3IGhlYWRlciBpbmZvcm1hdGlvbiBpbnNpZGUgdGhlIHNoYXJlZCBtZW1vcnkgcmVnaW9uCisJCS8vICAgIGl0c2VsZgorCQlwU2hiTWVtSGVhZGVyLT5tX3VsU2hNZW1TaXplID0gdWxTaE1lbVNpemU7CisJCXBTaGJNZW1IZWFkZXItPm1fdWxSZWZDb3VudCA9IDE7CisJCXBTaGJNZW1IZWFkZXItPm1faUJ1ZmZlcklkID0gaUJ1ZmZlcklkOworCQkvLyBpbml0aWFsaXplIHNwaW5sb2NrCisJCXNwaW5fbG9ja19pbml0KCZwU2hiTWVtSGVhZGVyLT5tX1NwaW5sb2NrQnVmZkFjY2Vzcyk7CisJCS8vIGluaXRpYWxpemUgd2FpdCBxdWV1ZXMKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmcFNoYk1lbUhlYWRlci0+bV9XYWl0UXVldWVOZXdEYXRhKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmcFNoYk1lbUhlYWRlci0+bV9XYWl0UXVldWVKb2JSZWFkeSk7CisJfSBlbHNlIHsKKwkJLy8gYW55IG90aGVyIHByb2Nlc3MgaGFzIGNyZWF0ZWQgdGhlIHNoYXJlZCBtZW1vcnkgYW5kIHRoaXMKKwkJLy8gcHJvY2VzcyBvbmx5IGhhcyB0byBhdHRhY2ggdG8gaXQKKwkJLy8gLT4gY2hlY2sgYW5kIHVwZGF0ZSBleGlzdGluZyBoZWFkZXIgaW5mb3JtYXRpb24gaW5zaWRlIHRoZQorCQkvLyAgICBzaGFyZWQgbWVtb3J5IHJlZ2lvbiBpdHNlbGYKKwkJaWYgKHBTaGJNZW1IZWFkZXItPm1fdWxTaE1lbVNpemUgIT0gdWxTaE1lbVNpemUpIHsKKwkJCVNoYkVycm9yID0ga1NoYk9wZW5NaXNtYXRjaDsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCQlwU2hiTWVtSGVhZGVyLT5tX3VsUmVmQ291bnQrKzsKKwl9CisKKyAgICAgIEV4aXQ6CisJcFNoYkluc3RhbmNlID0gKHRTaGJJbnN0YW5jZSAqKSBwU2hiTWVtSW5zdDsKKwkqcGZTaGJOZXdDcmVhdGVkX3AgPSBmU2hNZW1OZXdDcmVhdGVkOworCSpwcFNoYkluc3RhbmNlX3AgPSBwU2hiSW5zdGFuY2U7CisJcmV0dXJuIChTaGJFcnJvcik7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBSZWxlYXNlIFNoYXJlZCBCdWZmZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RTaGJFcnJvciBTaGJJcGNSZWxlYXNlQnVmZmVyKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCkKK3sKKwl0U2hiTWVtSW5zdCAqcFNoYk1lbUluc3Q7CisJdFNoYk1lbUhlYWRlciAqcFNoYk1lbUhlYWRlcjsKKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisJdFNoYkVycm9yIFNoYkVycm9yMjsKKworCURFQlVHX0xWTF8yNl9UUkFDRTEoIlNoYklwY1JlbGVhc2VCdWZmZXIoJXApXG4iLCBwU2hiSW5zdGFuY2VfcCk7CisJaWYgKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHsKKwkJcmV0dXJuIChrU2hiT2spOworCX0KKwlwU2hiTWVtSW5zdCA9IFNoYklwY0dldFNoYk1lbUluc3QocFNoYkluc3RhbmNlX3ApOworCXBTaGJNZW1IZWFkZXIgPSBTaGJJcGNHZXRTaGJNZW1IZWFkZXIocFNoYk1lbUluc3QpOworCisJLy8gc3RvcCB0aHJlYWRzIGluIGFueSBjYXNlLCBiZWNhdXNlIHRoZXkgYXJlIGJvdW5kIHRvIHRoYXQgc3BlY2lmaWMgaW5zdGFuY2UKKwlTaGJFcnJvcjIgPSBTaGJJcGNTdG9wU2lnbmFsaW5nTmV3RGF0YShwU2hiSW5zdGFuY2VfcCk7CisJLy8gZC5rLjogV2hhdHMgdXAgd2l0aCBKb2JSZWFkeSB0aHJlYWQ/CisJLy8gICAgICAgSnVzdCB3YWtlIGl0IHVwLCBidXQgd2l0aG91dCBzZXR0aW5nIHRoZSBzZW1hcGhvcmUgdmFyaWFibGUKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBTaGJNZW1IZWFkZXItPm1fV2FpdFF1ZXVlSm9iUmVhZHkpOworCisJaWYgKCEtLXBTaGJNZW1IZWFkZXItPm1fdWxSZWZDb3VudCkgeworCQlTaGJFcnJvciA9IGtTaGJPazsKKwkJLy8gZGVsZXRlIG1lbSB0YWJsZSBlbGVtZW50CisJCVNoYklwY0RlbGV0ZUxpc3RFbGVtZW50KHBTaGJNZW1IZWFkZXItPm1faUJ1ZmZlcklkKTsKKwkJLy8gZGVsZXRlIHNoYXJlZCBtZW0KKwkJa2ZyZWUocFNoYk1lbUluc3QtPm1fcFNoYk1lbUhlYWRlcik7CisJfSBlbHNlIHsKKwkJU2hiRXJyb3IgPSBrU2hiTWVtVXNlZEJ5T3RoZXJQcm9jczsKKwl9CisJLy9kZWxldGUgcHJpdmF0IG1lbQorCWtmcmVlKHBTaGJNZW1JbnN0KTsKKwlyZXR1cm4gKFNoYkVycm9yKTsKK30KKworI2VuZGlmIC8vICFkZWZpbmVkKFNIQklQQ19JTkxJTkVfRU5BQkxFRCkKKworI2lmICghZGVmaW5lZChTSEJJUENfSU5MSU5FRCkpIHx8IGRlZmluZWQoU0hCSVBDX0lOTElORV9FTkFCTEVEKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEVudGVyIGF0b21pYyBzZWN0aW9uIGZvciBTaGFyZWQgQnVmZmVyIGFjY2VzcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHRTaGJFcnJvciBTaGJJcGNFbnRlckF0b21pY1NlY3Rpb24odFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKQoreworCisJdFNoYk1lbUluc3QgKnBTaGJNZW1JbnN0OworCXRTaGJNZW1IZWFkZXIgKnBTaGJNZW1IZWFkZXI7CisJdFNoYkVycm9yIFNoYkVycm9yID0ga1NoYk9rOworCisJaWYgKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHsKKwkJU2hiRXJyb3IgPSBrU2hiSW52YWxpZEFyZzsKKwkJZ290byBFeGl0OworCX0KKwlERUJVR19MVkxfMjlfVFJBQ0UwKCJlbnRlciBhdG9taWNcbiIpOworCXBTaGJNZW1JbnN0ID0gU2hiSXBjR2V0U2hiTWVtSW5zdChwU2hiSW5zdGFuY2VfcCk7CisJcFNoYk1lbUhlYWRlciA9IFNoYklwY0dldFNoYk1lbUhlYWRlcihwU2hiTWVtSW5zdCk7CisKKwkvLyBsb2NrIGludGVycnVwdHMKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcFNoYk1lbUhlYWRlci0+bV9TcGlubG9ja0J1ZmZBY2Nlc3MsCisJCQkgIHBTaGJNZW1JbnN0LT5tX3VsRmxhZ3NCdWZmQWNjZXNzKTsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gU2hiRXJyb3I7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBMZWF2ZSBhdG9taWMgc2VjdGlvbiBmb3IgU2hhcmVkIEJ1ZmZlciBhY2Nlc3MKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiRXJyb3IgU2hiSXBjTGVhdmVBdG9taWNTZWN0aW9uKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCkKK3sKKworCXRTaGJNZW1JbnN0ICpwU2hiTWVtSW5zdDsKKwl0U2hiTWVtSGVhZGVyICpwU2hiTWVtSGVhZGVyOworCXRTaGJFcnJvciBTaGJFcnJvciA9IGtTaGJPazsKKworCWlmIChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB7CisJCVNoYkVycm9yID0ga1NoYkludmFsaWRBcmc7CisJCWdvdG8gRXhpdDsKKwl9CisJcFNoYk1lbUluc3QgPSBTaGJJcGNHZXRTaGJNZW1JbnN0KHBTaGJJbnN0YW5jZV9wKTsKKwlwU2hiTWVtSGVhZGVyID0gU2hiSXBjR2V0U2hiTWVtSGVhZGVyKHBTaGJNZW1JbnN0KTsKKwkvLyB1bmxvY2sgaW50ZXJydXB0cworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBTaGJNZW1IZWFkZXItPm1fU3BpbmxvY2tCdWZmQWNjZXNzLAorCQkJICAgICAgIHBTaGJNZW1JbnN0LT5tX3VsRmxhZ3NCdWZmQWNjZXNzKTsKKworICAgICAgRXhpdDoKKwlERUJVR19MVkxfMjlfVFJBQ0UwKCJMZWF2ZSBBdG9taWMgXG4iKTsKKwlyZXR1cm4gU2hiRXJyb3I7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBTdGFydCBzaWduYWxpbmcgb2YgbmV3IGRhdGEgKGNhbGxlZCBmcm9tIHJlYWRpbmcgcHJvY2VzcykKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiRXJyb3IgU2hiSXBjU3RhcnRTaWduYWxpbmdOZXdEYXRhKHRTaGJJbnN0YW5jZQorCQkJCQkJICAgICAgcFNoYkluc3RhbmNlX3AsCisJCQkJCQkgICAgICB0U2lnSG5kbHJOZXdEYXRhCisJCQkJCQkgICAgICBwZm5TaWduYWxIYW5kbGVyTmV3RGF0YV9wLAorCQkJCQkJICAgICAgdFNoYlByaW9yaXR5CisJCQkJCQkgICAgICBTaGJQcmlvcml0eV9wKQoreworCXRTaGJNZW1JbnN0ICpwU2hiTWVtSW5zdDsKKwl0U2hiTWVtSGVhZGVyICpwU2hiTWVtSGVhZGVyOworCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCURFQlVHX0xWTF8yOV9UUkFDRTAoIi0tLS0tLS0+U2hiSXBjU3RhcnRTaWduYWxpbmdOZXdEYXRhXG4iKTsKKwlpZiAoKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHx8IChwZm5TaWduYWxIYW5kbGVyTmV3RGF0YV9wID09IE5VTEwpKSB7CisJCXJldHVybiAoa1NoYkludmFsaWRBcmcpOworCX0KKworCXBTaGJNZW1JbnN0ID0gU2hiSXBjR2V0U2hiTWVtSW5zdChwU2hiSW5zdGFuY2VfcCk7CisJcFNoYk1lbUhlYWRlciA9IFNoYklwY0dldFNoYk1lbUhlYWRlcihwU2hiTWVtSW5zdCk7CisJU2hiRXJyb3IgPSBrU2hiT2s7CisKKwlpZiAoKHBTaGJNZW1JbnN0LT5tX3RUaHJlYWROZXdEYXRhSWQgIT0gSU5WQUxJRF9JRCkKKwkgICAgfHwgKHBTaGJNZW1JbnN0LT5tX3BmblNpZ0huZGxyTmV3RGF0YSAhPSBOVUxMKSkgeworCQlTaGJFcnJvciA9IGtTaGJBbHJlYWR5U2lnbmFsaW5nOworCQlnb3RvIEV4aXQ7CisJfQorCURFQlVHX0xWTF8yNl9UUkFDRTIKKwkgICAgKCJTaGJJcGNTdGFydFNpZ25hbGluZ05ld0RhdGEoJXApIG1fcGZuU2lnSG5kbHJOZXdEYXRhID0gJXBcbiIsCisJICAgICBwU2hiSW5zdGFuY2VfcCwgcGZuU2lnbmFsSGFuZGxlck5ld0RhdGFfcCk7CisJcFNoYk1lbUluc3QtPm1fcGZuU2lnSG5kbHJOZXdEYXRhID0gcGZuU2lnbmFsSGFuZGxlck5ld0RhdGFfcDsKKwlwU2hiTWVtSGVhZGVyLT5tX2ZOZXdEYXRhID0gRkFMU0U7CisJcFNoYk1lbUluc3QtPm1faVRocmVhZFRlcm1GbGFnID0gMDsKKworCXN3aXRjaCAoU2hiUHJpb3JpdHlfcCkgeworCWNhc2Uga1NoYlByaW9yaXR5TG93OgorCQlwU2hiTWVtSW5zdC0+bV9sVGhyZWFkTmV3RGF0YU5pY2UgPSAtMjsKKwkJYnJlYWs7CisKKwljYXNlIGtTaGJQcmlvcml0eU5vcm1hbDoKKwkJcFNoYk1lbUluc3QtPm1fbFRocmVhZE5ld0RhdGFOaWNlID0gLTk7CisJCWJyZWFrOworCisJY2FzZSBrc2hiUHJpb3JpdHlIaWdoOgorCQlwU2hiTWVtSW5zdC0+bV9sVGhyZWFkTmV3RGF0YU5pY2UgPSAtMjA7CisJCWJyZWFrOworCisJfQorCisJLy9jcmVhdGUgdGhyZWFkIGZvciBzaWduYWxsaW5nIG5ldyBkYXRhCisJcFNoYk1lbUluc3QtPm1fdFRocmVhZE5ld0RhdGFJZCA9CisJICAgIGtlcm5lbF90aHJlYWQoU2hiSXBjVGhyZWFkU2lnbmFsTmV3RGF0YSwgcFNoYkluc3RhbmNlX3AsCisJCQkgIENMT05FX0tFUk5FTCk7CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIFNoYkVycm9yOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgU3RvcCBzaWduYWxpbmcgb2YgbmV3IGRhdGEgKGNhbGxlZCBmcm9tIHJlYWRpbmcgcHJvY2VzcykKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiRXJyb3IgU2hiSXBjU3RvcFNpZ25hbGluZ05ld0RhdGEodFNoYkluc3RhbmNlCisJCQkJCQkgICAgIHBTaGJJbnN0YW5jZV9wKQoreworCXRTaGJNZW1JbnN0ICpwU2hiTWVtSW5zdDsKKwl0U2hiTWVtSGVhZGVyICpwU2hiTWVtSGVhZGVyOworCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCURFQlVHX0xWTF8yOV9UUkFDRTAoIi0tLS0tLS0+U2hiSXBjU3RvcFNpZ25hbGluZ05ld0RhdGFcbiIpOworCWlmIChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB7CisJCXJldHVybiAoa1NoYkludmFsaWRBcmcpOworCX0KKwlTaGJFcnJvciA9IGtTaGJPazsKKwlwU2hiTWVtSW5zdCA9IFNoYklwY0dldFNoYk1lbUluc3QocFNoYkluc3RhbmNlX3ApOworCXBTaGJNZW1IZWFkZXIgPSBTaGJJcGNHZXRTaGJNZW1IZWFkZXIocFNoYk1lbUluc3QpOworCisJREVCVUdfTFZMXzI2X1RSQUNFMgorCSAgICAoIlNoYklwY1N0b3BTaWduYWxpbmdOZXdEYXRhKCVwKSBwZm5TaWduSG5kbHJOZXdEYXRhPSVwXG4iLAorCSAgICAgcFNoYkluc3RhbmNlX3AsIHBTaGJNZW1JbnN0LT5tX3BmblNpZ0huZGxyTmV3RGF0YSk7CisJaWYgKHBTaGJNZW1JbnN0LT5tX3BmblNpZ0huZGxyTmV3RGF0YSAhPSBOVUxMKSB7CS8vIHNpZ25hbCBoYW5kbGVyIHdhcyBzZXQgYmVmb3JlCisJCWludCBpRXJyOworCQkvL3NldCB0ZXJtaW5hdGlvbiBmbGFnIGluIG1lbSBoZWFkZXIKKwkJcFNoYk1lbUluc3QtPm1faVRocmVhZFRlcm1GbGFnID0gMTsKKworCQkvLyBjaGVjayBpZiB0aHJlYWQgaXMgc3RpbGwgcnVubmluZyBhdCBhbGwgYnkgc2VuZGluZyB0aGUgbnVsbC1zaWduYWwgdG8gdGhpcyB0aHJlYWQKKwkJLyogaUVyciA9IGtpbGxfcHJvYyhwU2hiTWVtSW5zdC0+bV90VGhyZWFkTmV3RGF0YUlkLCAwLCAxKTsgKi8KKwkJaUVyciA9IHNlbmRfc2lnKDAsIHBTaGJNZW1JbnN0LT5tX3RUaHJlYWROZXdEYXRhSWQsIDEpOworCQlpZiAoaUVyciA9PSAwKSB7CisJCQkvLyB3YWtlIHVwIHRocmVhZCwgYmVjYXVzZSBpdCBpcyBzdGlsbCBydW5uaW5nCisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBTaGJNZW1IZWFkZXItPgorCQkJCQkgICAgICBtX1dhaXRRdWV1ZU5ld0RhdGEpOworCisJCQkvL3dhaXQgZm9yIHRlcm1pbmF0aW9uIG9mIHRocmVhZAorCQkJd2FpdF9mb3JfY29tcGxldGlvbigmcFNoYk1lbUluc3QtPm1fQ29tcGxldGlvbk5ld0RhdGEpOworCQl9CisKKwkJcFNoYk1lbUluc3QtPm1fcGZuU2lnSG5kbHJOZXdEYXRhID0gTlVMTDsKKwkJcFNoYk1lbUluc3QtPm1fdFRocmVhZE5ld0RhdGFJZCA9IElOVkFMSURfSUQ7CisJfQorCisJcmV0dXJuIFNoYkVycm9yOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgU2lnbmFsIG5ldyBkYXRhIChjYWxsZWQgZnJvbSB3cml0aW5nIHByb2Nlc3MpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYkVycm9yIFNoYklwY1NpZ25hbE5ld0RhdGEodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKQoreworCXRTaGJNZW1IZWFkZXIgKnBTaGJNZW1IZWFkZXI7CisKKwlpZiAocFNoYkluc3RhbmNlX3AgPT0gTlVMTCkgeworCQlyZXR1cm4gKGtTaGJJbnZhbGlkQXJnKTsKKwl9CisJcFNoYk1lbUhlYWRlciA9CisJICAgIFNoYklwY0dldFNoYk1lbUhlYWRlcihTaGJJcGNHZXRTaGJNZW1JbnN0KHBTaGJJbnN0YW5jZV9wKSk7CisJLy9zZXQgc2VtYXBob3JlCisJcFNoYk1lbUhlYWRlci0+bV9mTmV3RGF0YSA9IFRSVUU7CisJREVCVUdfTFZMXzI5X1RSQUNFMCgiU2hiSXBjU2lnbmFsTmV3RGF0YSBzZXQgU2VtIC0+IE5ldyBEYXRhXG4iKTsKKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcFNoYk1lbUhlYWRlci0+bV9XYWl0UXVldWVOZXdEYXRhKTsKKwlyZXR1cm4gKGtTaGJPayk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgU3RhcnQgc2lnbmFsaW5nIGZvciBqb2IgcmVhZHkgKGNhbGxlZCBmcm9tIHdhaXRpbmcgcHJvY2VzcykKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiRXJyb3IgU2hiSXBjU3RhcnRTaWduYWxpbmdKb2JSZWFkeSh0U2hiSW5zdGFuY2UKKwkJCQkJCSAgICAgICBwU2hiSW5zdGFuY2VfcCwKKwkJCQkJCSAgICAgICB1bnNpZ25lZCBsb25nCisJCQkJCQkgICAgICAgdWxUaW1lT3V0X3AsCisJCQkJCQkgICAgICAgdFNpZ0huZGxySm9iUmVhZHkKKwkJCQkJCSAgICAgICBwZm5TaWduYWxIYW5kbGVySm9iUmVhZHlfcCkKK3sKKwl0U2hiTWVtSW5zdCAqcFNoYk1lbUluc3Q7CisJdFNoYk1lbUhlYWRlciAqcFNoYk1lbUhlYWRlcjsKKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisKKwlpZiAoKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHx8IChwZm5TaWduYWxIYW5kbGVySm9iUmVhZHlfcCA9PSBOVUxMKSkgeworCQlyZXR1cm4gKGtTaGJJbnZhbGlkQXJnKTsKKwl9CisJcFNoYk1lbUluc3QgPSBTaGJJcGNHZXRTaGJNZW1JbnN0KHBTaGJJbnN0YW5jZV9wKTsKKwlwU2hiTWVtSGVhZGVyID0gU2hiSXBjR2V0U2hiTWVtSGVhZGVyKHBTaGJNZW1JbnN0KTsKKworCVNoYkVycm9yID0ga1NoYk9rOworCWlmICgocFNoYk1lbUluc3QtPm1fdFRocmVhZEpvYlJlYWR5SWQgIT0gSU5WQUxJRF9JRCkKKwkgICAgfHwgKHBTaGJNZW1JbnN0LT5tX3BmblNpZ0huZGxySm9iUmVhZHkgIT0gTlVMTCkpIHsKKwkJU2hiRXJyb3IgPSBrU2hiQWxyZWFkeVNpZ25hbGluZzsKKwkJZ290byBFeGl0OworCX0KKwlwU2hiTWVtSW5zdC0+bV91bFRpbWVPdXRKb2JSZWFkeSA9IHVsVGltZU91dF9wOworCXBTaGJNZW1JbnN0LT5tX3BmblNpZ0huZGxySm9iUmVhZHkgPSBwZm5TaWduYWxIYW5kbGVySm9iUmVhZHlfcDsKKwlwU2hiTWVtSGVhZGVyLT5tX2ZKb2JSZWFkeSA9IEZBTFNFOworCS8vY3JlYXRlIHRocmVhZCBmb3Igc2lnbmFsbGluZyBuZXcgZGF0YQorCXBTaGJNZW1JbnN0LT5tX3RUaHJlYWRKb2JSZWFkeUlkID0KKwkgICAga2VybmVsX3RocmVhZChTaGJJcGNUaHJlYWRTaWduYWxKb2JSZWFkeSwgcFNoYkluc3RhbmNlX3AsCisJCQkgIENMT05FX0tFUk5FTCk7CisgICAgICBFeGl0OgorCXJldHVybiBTaGJFcnJvcjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBTaWduYWwgam9iIHJlYWR5IChjYWxsZWQgZnJvbSBleGVjdXRpbmcgcHJvY2VzcykKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiRXJyb3IgU2hiSXBjU2lnbmFsSm9iUmVhZHkodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKQoreworCXRTaGJNZW1IZWFkZXIgKnBTaGJNZW1IZWFkZXI7CisKKwlERUJVR19MVkxfMjlfVFJBQ0UwKCJTaGJJcGNTaWduYWxKb2JSZWFkeVxuIik7CisJaWYgKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHsKKwkJcmV0dXJuIChrU2hiSW52YWxpZEFyZyk7CisJfQorCXBTaGJNZW1IZWFkZXIgPQorCSAgICBTaGJJcGNHZXRTaGJNZW1IZWFkZXIoU2hiSXBjR2V0U2hiTWVtSW5zdChwU2hiSW5zdGFuY2VfcCkpOworCS8vc2V0IHNlbWFwaG9yZQorCXBTaGJNZW1IZWFkZXItPm1fZkpvYlJlYWR5ID0gVFJVRTsKKwlERUJVR19MVkxfMjlfVFJBQ0UwKCJTaGJJcGNTaWduYWxKb2JSZWFkeSBzZXQgU2VtIC0+IEpvYiBSZWFkeSBcbiIpOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwU2hiTWVtSGVhZGVyLT5tX1dhaXRRdWV1ZUpvYlJlYWR5KTsKKwlyZXR1cm4gKGtTaGJPayk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgR2V0IHBvaW50ZXIgdG8gY29tbW9uIHVzZWQgc2hhcmUgbWVtb3J5IGFyZWEKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB2b2lkICpTaGJJcGNHZXRTaE1lbVB0cih0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApCit7CisKKwl0U2hiTWVtSGVhZGVyICpwU2hiTWVtSGVhZGVyOworCXZvaWQgKnBTaGJTaE1lbVB0cjsKKworCXBTaGJNZW1IZWFkZXIgPQorCSAgICBTaGJJcGNHZXRTaGJNZW1IZWFkZXIoU2hiSXBjR2V0U2hiTWVtSW5zdChwU2hiSW5zdGFuY2VfcCkpOworCWlmIChwU2hiTWVtSGVhZGVyICE9IE5VTEwpIHsKKwkJcFNoYlNoTWVtUHRyID0gKEJZVEUgKikgcFNoYk1lbUhlYWRlciArIHNpemVvZih0U2hiTWVtSGVhZGVyKTsKKwl9IGVsc2UgeworCQlwU2hiU2hNZW1QdHIgPSBOVUxMOworCX0KKworCXJldHVybiAocFNoYlNoTWVtUHRyKTsKKworfQorCisjZW5kaWYKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKyNpZiAhZGVmaW5lZChTSEJJUENfSU5MSU5FX0VOQUJMRUQpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgR2V0IHBvaW50ZXIgdG8gcHJvY2VzcyBsb2NhbCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qdFNoYk1lbUluc3QqICBTaGJJcGNHZXRTaGJNZW1JbnN0ICgKKyAgICB0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApCit7CisKK3RTaGJNZW1JbnN0KiAgcFNoYk1lbUluc3Q7CisKKyAgICBwU2hiTWVtSW5zdCA9ICh0U2hiTWVtSW5zdCopcFNoYkluc3RhbmNlX3A7CisKKyAgICByZXR1cm4gKHBTaGJNZW1JbnN0KTsKKworfQorKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBHZXQgcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5IGhlYWRlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyp0U2hiTWVtSGVhZGVyKiAgU2hiSXBjR2V0U2hiTWVtSGVhZGVyICgKKyAgICB0U2hiTWVtSW5zdCogcFNoYk1lbUluc3RfcCkKK3sKKwordFNoYk1lbUhlYWRlciogIHBTaGJNZW1IZWFkZXI7CisKKyAgICBwU2hiTWVtSGVhZGVyID0gcFNoYk1lbUluc3RfcC0+bV9wU2hiTWVtSGVhZGVyOworCisgICAgcmV0dXJuIChwU2hiTWVtSGVhZGVyKTsKKworfQorKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBBbGxvY2F0ZSBhIG1lbW9yeSBibG9jayBmcm9tIHByb2Nlc3Mgc3BlY2lmaWMgbWVtcG9vbAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgKlNoYklwY0FsbG9jUHJpdmF0ZU1lbSh1bnNpZ25lZCBsb25nIHVsTWVtU2l6ZV9wKQoreworCXRTaGJFcnJvciBTaGJFcnJvcjsKKwl2b2lkICpwTWVtOworCisJREVCVUdfTFZMXzI5X1RSQUNFMCgiU2hiSXBjQWxsb2NQcml2YXRlTWVtIFxuIik7CisJLy9nZXQgcHJpdmF0ZSBtZW0KKwlwTWVtID0ga21hbGxvYyh1bE1lbVNpemVfcCwgR0ZQX0tFUk5FTCk7CisJaWYgKHBNZW0gPT0gTlVMTCkgeworCQkvL3VuYWJsZSB0byBjcmVhdGUgbWVtCisJCVNoYkVycm9yID0ga1NoYk91dE9mTWVtOworCQlnb3RvIEV4aXQ7CisJfQorICAgICAgRXhpdDoKKwlyZXR1cm4gKHBNZW0pOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgVGhyZWFkIGZvciBuZXcgZGF0YSBzaWduYWxpbmcKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBTaGJJcGNUaHJlYWRTaWduYWxOZXdEYXRhKHZvaWQgKnB2VGhyZWFkUGFyYW1fcCkKK3sKKwl0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlOworCXRTaGJNZW1JbnN0ICpwU2hiTWVtSW5zdDsKKwl0U2hiTWVtSGVhZGVyICpwU2hiTWVtSGVhZGVyOworCWludCBpUmV0VmFsID0gLTE7CisJaW50IGZDYWxsQWdhaW47CisKKwlkYWVtb25pemUoIlNoYk5EJXAiLCBwdlRocmVhZFBhcmFtX3ApOworCWFsbG93X3NpZ25hbChTSUdURVJNKTsKKwlwU2hiSW5zdGFuY2UgPSAodFNoYk1lbUluc3QgKikgcHZUaHJlYWRQYXJhbV9wOworCXBTaGJNZW1JbnN0ID0gU2hiSXBjR2V0U2hiTWVtSW5zdChwU2hiSW5zdGFuY2UpOworCXBTaGJNZW1IZWFkZXIgPSBTaGJJcGNHZXRTaGJNZW1IZWFkZXIocFNoYk1lbUluc3QpOworCisJREVCVUdfTFZMXzI2X1RSQUNFMSgiU2hiSXBjVGhyZWFkU2lnbmFsTmV3RGF0YSglcClcbiIsIHB2VGhyZWFkUGFyYW1fcCk7CisKKwlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIHBTaGJNZW1JbnN0LT5tX2xUaHJlYWROZXdEYXRhTmljZSk7CisKKy8vICAgICAgICAgICAgREVCVUdfTFZMXzI5X1RSQUNFMSgiU2hiSXBjVGhyZWFkU2lnbmFsTmV3RGF0YSB3YWl0IGZvciBOZXcgRGF0YSBTZW0gJXBcbiIscFNoYk1lbUluc3QtPm1fcFNlbU5ld0RhdGEpOworCWRvIHsKKwkJaVJldFZhbCA9CisJCSAgICB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocFNoYk1lbUhlYWRlci0+bV9XYWl0UXVldWVOZXdEYXRhLAorCQkJCQkgICAgIChwU2hiTWVtSW5zdC0+bV9pVGhyZWFkVGVybUZsYWcgIT0KKwkJCQkJICAgICAgMCkKKwkJCQkJICAgICB8fCAocFNoYk1lbUhlYWRlci0+bV9mTmV3RGF0YSAhPQorCQkJCQkJIEZBTFNFKSk7CisKKwkJaWYgKGlSZXRWYWwgIT0gMCkgewkvLyBzaWduYWwgcGVuZGluZworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocFNoYk1lbUhlYWRlci0+bV9mTmV3RGF0YSAhPSBGQUxTRSkgeworCQkJcFNoYk1lbUhlYWRlci0+bV9mTmV3RGF0YSA9IEZBTFNFOworCQkJZG8geworCQkJCWZDYWxsQWdhaW4gPQorCQkJCSAgICBwU2hiTWVtSW5zdC0+CisJCQkJICAgIG1fcGZuU2lnSG5kbHJOZXdEYXRhKHBTaGJJbnN0YW5jZSk7CisJCQkJLy8gY2FsbCBzY2hlZHVsZXIsIHdoaWNoIHdpbGwgZXhlY3V0ZSBhbnkgdGFzayB3aXRoIGhpZ2hlciBwcmlvcml0eQorCQkJCXNjaGVkdWxlKCk7CisJCQl9IHdoaWxlIChmQ2FsbEFnYWluICE9IEZBTFNFKTsKKwkJfQorCX0gd2hpbGUgKHBTaGJNZW1JbnN0LT5tX2lUaHJlYWRUZXJtRmxhZyA9PSAwKTsKKwlERUJVR19MVkxfMjlfVFJBQ0UwKCJTaGJJcGNUaHJlYWRTaWduYWxOZXdEYXRhIHRlcm1pbmF0ZWQgXG4iKTsKKwkvL3NldCB0aHJlYWQgY29tcGxldGVkCisJY29tcGxldGVfYW5kX2V4aXQoJnBTaGJNZW1JbnN0LT5tX0NvbXBsZXRpb25OZXdEYXRhLCAwKTsKKwlyZXR1cm4gMDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBUaHJlYWQgZm9yIG5ldyBkYXRhIEpvYiBSZWFkeSBzaWduYWxpbmcKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBTaGJJcGNUaHJlYWRTaWduYWxKb2JSZWFkeSh2b2lkICpwdlRocmVhZFBhcmFtX3ApCit7CisJdFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZTsKKwl0U2hiTWVtSW5zdCAqcFNoYk1lbUluc3Q7CisJdFNoYk1lbUhlYWRlciAqcFNoYk1lbUhlYWRlcjsKKwlsb25nIGxUaW1lT3V0OworCWludCBpUmV0VmFsID0gLTE7CisKKwlkYWVtb25pemUoIlNoYkpSJXAiLCBwdlRocmVhZFBhcmFtX3ApOworCWFsbG93X3NpZ25hbChTSUdURVJNKTsKKwlwU2hiSW5zdGFuY2UgPSAodFNoYk1lbUluc3QgKikgcHZUaHJlYWRQYXJhbV9wOworCXBTaGJNZW1JbnN0ID0gU2hiSXBjR2V0U2hiTWVtSW5zdChwU2hiSW5zdGFuY2UpOworCXBTaGJNZW1IZWFkZXIgPSBTaGJJcGNHZXRTaGJNZW1IZWFkZXIocFNoYk1lbUluc3QpOworCisJREVCVUdfTFZMXzI5X1RSQUNFMAorCSAgICAoIlNoYklwY1RocmVhZFNpZ25hbEpvYlJlYWR5IHdhaXQgZm9yIGpvYiByZWFkeSBTZW1cbiIpOworCWlmIChwU2hiTWVtSW5zdC0+bV91bFRpbWVPdXRKb2JSZWFkeSAhPSAwKSB7CisJCWxUaW1lT3V0ID0gKGxvbmcpcFNoYk1lbUluc3QtPm1fdWxUaW1lT3V0Sm9iUmVhZHk7CisJCS8vd2FpdCBmb3Igam9iIHJlYWR5IHNlbWFwaG9yZQorCQlpUmV0VmFsID0KKwkJICAgIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHBTaGJNZW1IZWFkZXItPgorCQkJCQkJICAgICBtX1dhaXRRdWV1ZUpvYlJlYWR5LAorCQkJCQkJICAgICAocFNoYk1lbUhlYWRlci0+CisJCQkJCQkgICAgICBtX2ZKb2JSZWFkeSAhPSBGQUxTRSksCisJCQkJCQkgICAgIGxUaW1lT3V0KTsKKwl9IGVsc2UgeworCQkvL3dhaXQgZm9yIGpvYiByZWFkeSBzZW1hcGhvcmUKKwkJaVJldFZhbCA9CisJCSAgICB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocFNoYk1lbUhlYWRlci0+bV9XYWl0UXVldWVKb2JSZWFkeSwKKwkJCQkJICAgICAocFNoYk1lbUhlYWRlci0+bV9mSm9iUmVhZHkgIT0KKwkJCQkJICAgICAgRkFMU0UpKTsKKwl9CisKKwlpZiAocFNoYk1lbUluc3QtPm1fcGZuU2lnSG5kbHJKb2JSZWFkeSAhPSBOVUxMKSB7CisJCS8vY2FsbCBIYW5kbGVyCisJCXBTaGJNZW1JbnN0LT5tX3BmblNpZ0huZGxySm9iUmVhZHkocFNoYkluc3RhbmNlLAorCQkJCQkJICAgIXBTaGJNZW1IZWFkZXItPm1fZkpvYlJlYWR5KTsKKwl9CisKKwlwU2hiTWVtSW5zdC0+bV9wZm5TaWdIbmRsckpvYlJlYWR5ID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworLy9CdWlsZCB0aGUgY3JjIHRhYmxlCitzdGF0aWMgdm9pZCBTaGJJcGNDcmMzMkdlblRhYmxlKHVuc2lnbmVkIGxvbmcgYXVsQ3JjVGFibGVbMjU2XSkKK3sKKwl1bnNpZ25lZCBsb25nIHVsQ3JjLCB1bFBvbHk7CisJaW50IGlJbmRleEksIGlJbmRleEo7CisKKwl1bFBvbHkgPSAweEVEQjg4MzIwTDsKKwlmb3IgKGlJbmRleEkgPSAwOyBpSW5kZXhJIDwgMjU2OyBpSW5kZXhJKyspIHsKKwkJdWxDcmMgPSBpSW5kZXhJOworCQlmb3IgKGlJbmRleEogPSA4OyBpSW5kZXhKID4gMDsgaUluZGV4Si0tKSB7CisJCQlpZiAodWxDcmMgJiAxKSB7CisJCQkJdWxDcmMgPSAodWxDcmMgPj4gMSkgXiB1bFBvbHk7CisJCQl9IGVsc2UgeworCQkJCXVsQ3JjID4+PSAxOworCQkJfQorCQl9CisJCWF1bENyY1RhYmxlW2lJbmRleEldID0gdWxDcmM7CisJfQorfQorCisvL0NhbGN1bGF0ZSB0aGUgY3JjIHZhbHVlCitzdGF0aWMgdW5zaWduZWQgbG9uZyBTaGJJcGNDcmMzMkdldENyYyhjb25zdCBjaGFyICpwY1N0cmluZywKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhdWxDcmNUYWJsZVsyNTZdKQoreworCXVuc2lnbmVkIGxvbmcgdWxDcmM7CisJaW50IGlJbmRleDsKKworCXVsQ3JjID0gMHhGRkZGRkZGRjsKKwlmb3IgKGlJbmRleCA9IDA7IGlJbmRleCA8IHN0cmxlbihwY1N0cmluZyk7IGlJbmRleCsrKSB7CisJCXVsQ3JjID0KKwkJICAgICgodWxDcmMgPj4gOCkgJiAweDAwRkZGRkZGKSBeCisJCSAgICBhdWxDcmNUYWJsZVsodWxDcmMgXiBwY1N0cmluZ1tpSW5kZXhdKSAmIDB4RkZdOworCX0KKwlyZXR1cm4gKHVsQ3JjIF4gMHhGRkZGRkZGRik7CisKK30KKworc3RhdGljIHZvaWQgU2hiSXBjQXBwZW5kTGlzdEVsZW1lbnQoc3RydWN0IHNTaGJNZW1UYWJsZSAqcHNOZXdNZW1UYWJsZUVsZW1lbnQpCit7CisJc3RydWN0IHNTaGJNZW1UYWJsZSAqcHNNZW1UYWJsZUVsZW1lbnQgPSBwc01lbVRhYmxlRWxlbWVudEZpcnN0X2c7CisJcHNOZXdNZW1UYWJsZUVsZW1lbnQtPm1fcHNOZXh0TWVtVGFibGVFbGVtZW50ID0gTlVMTDsKKworCWlmIChwc01lbVRhYmxlRWxlbWVudEZpcnN0X2cgIT0gTlVMTCkgewkvKiBzaW5kIEVsZW1lbnRlIHZvcmhhbmRlbiAqLworCQl3aGlsZSAocHNNZW1UYWJsZUVsZW1lbnQtPm1fcHNOZXh0TWVtVGFibGVFbGVtZW50ICE9IE5VTEwpIHsJLyogc3VjaGUgZGFzIGxldHp0ZSBFbGVtZW50ICovCisJCQlwc01lbVRhYmxlRWxlbWVudCA9CisJCQkgICAgcHNNZW1UYWJsZUVsZW1lbnQtPm1fcHNOZXh0TWVtVGFibGVFbGVtZW50OworCQl9CisJCXBzTWVtVGFibGVFbGVtZW50LT5tX3BzTmV4dE1lbVRhYmxlRWxlbWVudCA9IHBzTmV3TWVtVGFibGVFbGVtZW50OwkvKiAgSGFlbmdlIGRhcyBFbGVtZW50IGhpbnRlbiBhbiAqLworCX0gZWxzZSB7CQkvKiB3ZW5uIGRpZSBsaXN0ZSBsZWVyIGlzdCwgYmluIGljaCBkYXMgZXJzdGUgRWxlbWVudCAqLworCQlwc01lbVRhYmxlRWxlbWVudEZpcnN0X2cgPSBwc05ld01lbVRhYmxlRWxlbWVudDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgU2hiSXBjRmluZExpc3RFbGVtZW50KGludCBpQnVmZmVySWQsCisJCQkJIHN0cnVjdCBzU2hiTWVtVGFibGUgKipwcHNSZXR1cm5NZW1UYWJsZUVsZW1lbnQpCit7CisJc3RydWN0IHNTaGJNZW1UYWJsZSAqcHNNZW1UYWJsZUVsZW1lbnQgPSBwc01lbVRhYmxlRWxlbWVudEZpcnN0X2c7CisJd2hpbGUgKHBzTWVtVGFibGVFbGVtZW50ICE9IE5VTEwpIHsKKwkJaWYgKHBzTWVtVGFibGVFbGVtZW50LT5tX2lCdWZmZXJJZCA9PSBpQnVmZmVySWQpIHsKKy8vcHJpbnRrKCJTaGJJcGNGaW5kTGlzdEVsZW1lbnQgQnVmZmVyIGF0OiVwIElkOiVkXG4iLHBzTWVtVGFibGVFbGVtZW50LT5tX3BCdWZmZXIscHNNZW1UYWJsZUVsZW1lbnQtPm1faUJ1ZmZlcklkKTsKKwkJCSpwcHNSZXR1cm5NZW1UYWJsZUVsZW1lbnQgPSBwc01lbVRhYmxlRWxlbWVudDsKKy8vcHJpbnRrKCJTaGJJcGNGaW5kTGlzdEVsZW1lbnQgQnVmZmVyIGF0OiVwIElkOiVkXG4iLCgqcHBzUmV0dXJuTWVtVGFibGVFbGVtZW50KS0+bV9wQnVmZmVyLCgqcHBzUmV0dXJuTWVtVGFibGVFbGVtZW50KS0+bV9pQnVmZmVySWQpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcHNNZW1UYWJsZUVsZW1lbnQgPSBwc01lbVRhYmxlRWxlbWVudC0+bV9wc05leHRNZW1UYWJsZUVsZW1lbnQ7CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgU2hiSXBjRGVsZXRlTGlzdEVsZW1lbnQoaW50IGlCdWZmZXJJZCkKK3sKKwlzdHJ1Y3Qgc1NoYk1lbVRhYmxlICpwc01lbVRhYmxlRWxlbWVudCA9IHBzTWVtVGFibGVFbGVtZW50Rmlyc3RfZzsKKwlzdHJ1Y3Qgc1NoYk1lbVRhYmxlICpwc01lbVRhYmxlRWxlbWVudE9sZCA9IHBzTWVtVGFibGVFbGVtZW50Rmlyc3RfZzsKKwlpZiAocHNNZW1UYWJsZUVsZW1lbnQgIT0gTlVMTCkgeworCQl3aGlsZSAoKHBzTWVtVGFibGVFbGVtZW50ICE9IE5VTEwpCisJCSAgICAgICAmJiAocHNNZW1UYWJsZUVsZW1lbnQtPm1faUJ1ZmZlcklkICE9IGlCdWZmZXJJZCkpIHsKKwkJCXBzTWVtVGFibGVFbGVtZW50T2xkID0gcHNNZW1UYWJsZUVsZW1lbnQ7CisJCQlwc01lbVRhYmxlRWxlbWVudCA9CisJCQkgICAgcHNNZW1UYWJsZUVsZW1lbnQtPm1fcHNOZXh0TWVtVGFibGVFbGVtZW50OworCQl9CisJCWlmIChwc01lbVRhYmxlRWxlbWVudCAhPSBOVUxMKSB7CisJCQlpZiAocHNNZW1UYWJsZUVsZW1lbnQgIT0gcHNNZW1UYWJsZUVsZW1lbnRGaXJzdF9nKSB7CisJCQkJcHNNZW1UYWJsZUVsZW1lbnRPbGQtPm1fcHNOZXh0TWVtVGFibGVFbGVtZW50ID0KKwkJCQkgICAgcHNNZW1UYWJsZUVsZW1lbnQtPm1fcHNOZXh0TWVtVGFibGVFbGVtZW50OworCQkJCWtmcmVlKHBzTWVtVGFibGVFbGVtZW50KTsKKwkJCX0gZWxzZSB7CisJCQkJa2ZyZWUocHNNZW1UYWJsZUVsZW1lbnQpOworCQkJCXBzTWVtVGFibGVFbGVtZW50Rmlyc3RfZyA9IE5VTEw7CisJCQl9CisKKwkJfQorCX0KKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvU2hiSXBjLVdpbjMyLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL1NoYklwYy1XaW4zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MTgxNDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL1NoYklwYy1XaW4zMi5jCkBAIC0wLDAgKzEsMTIwMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIFByb2plY3QgaW5kZXBlbmRlbmQgc2hhcmVkIGJ1ZmZlciAobGluZWFyICsgY2lyY3VsYXIpCisKKyAgRGVzY3JpcHRpb246ICBJbXBsZW1lbnRhdGlvbiBvZiBwbGF0Zm9ybSBzcGVjaWZpYyBwYXJ0IGZvciB0aGUKKyAgICAgICAgICAgICAgICBzaGFyZWQgYnVmZmVyCisgICAgICAgICAgICAgICAgKEltcGxlbWVudGF0aW9uIGZvciBXaW4zMikKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAyMDA2LzA2LzI3IC1yczogICBWIDEuMDAgKGluaXRpYWwgdmVyc2lvbikKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBXSU5WRVIgICAgICAgMHgwNDAwCS8vICNkZWZpbmVzIG5lY2Vzc2FyeSBmb3IgdXNhZ2Ugb2YKKyNkZWZpbmUgX1dJTjMyX1dJTk5UIDB4MDQwMAkvLyBmdW5jdGlvbiA8U2lnbmFsT2JqZWN0QW5kV2FpdD4KKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImdsb2JhbC5oIgorI2luY2x1ZGUgInNoYXJlZGJ1ZmYuaCIKKyNpbmNsdWRlICJzaGJpcGMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmICghZGVmaW5lZChTSEJJUENfSU5MSU5FRCkpIHx8IGRlZmluZWQoU0hCSVBDX0lOTElORV9FTkFCTEVEKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIENvbmZpZ3VyYXRpb24KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgQ29uc3RhbnQgZGVmaW5pdGlvbnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgTUFYX0xFTl9CVUZGRVJfSUQgICAgICAgTUFYX1BBVEgKKworI2RlZmluZSBJRFhfRVZFTlRfTkVXX0RBVEEgICAgICAwCisjZGVmaW5lIElEWF9FVkVOVF9URVJNX1JFUVUgICAgIDEKKyNkZWZpbmUgSURYX0VWRU5UX1RFUk1fUkVTUCAgICAgMgorCisjZGVmaW5lIE5BTUVfTVVURVhfQlVGRl9BQ0NFU1MgICJCdWZmQWNjZXNzIgorI2RlZmluZSBOQU1FX0VWRU5UX05FV19EQVRBICAgICAiTmV3RGF0YSIKKyNkZWZpbmUgTkFNRV9FVkVOVF9URVJNX1JFUVUgICAgIlRlcm1SZXF1IgorI2RlZmluZSBOQU1FX0VWRU5UX1RFUk1fUkVTUCAgICAiVGVybVJlc3AiCisjZGVmaW5lIE5BTUVfRVZFTlRfSk9CX1JFQURZICAgICJKb2JSZWFkeSIKKworI2RlZmluZSBUSU1FT1VUX0VOVEVSX0FUT01JQyAgICAxMDAwCS8vIGZvciBkZWJnZ2luZzogSU5GSU5JVEUKKyNkZWZpbmUgVElNRU9VVF9URVJNX1RIUkVBRCAgICAgMjAwMAorCisjZGVmaW5lIFNCSV9NQUdJQ19JRCAgICAgICAgICAgIDB4NTM0MjQ5MkIJLy8gbWFnaWMgSUQgKCJTQkkrIikKKyNkZWZpbmUgU0JIX01BR0lDX0lEICAgICAgICAgICAgMHg1MzQyNDgyQQkvLyBtYWdpYyBJRCAoIlNCSCoiKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIExvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUaGlzIHN0cnVjdHVyZSBpcyB0aGUgY29tbW9uIGhlYWRlciBmb3IgdGhlIHNoYXJlZCBtZW1vcnkgcmVnaW9uIHVzZWQKKy8vIGJ5IGFsbCBwcm9jZXNzZXMgYXR0YWNoZWQgdGhpcyBzaGFyZWQgbWVtb3J5LiBJdCBpbmNsdWRlcyBjb21tb24KKy8vIGluZm9ybWF0aW9uIHRvIGFkbWluaXN0cmF0ZS9tYW5hZ2UgdGhlIHNoYXJlZCBidWZmZXIgZnJvbSBhIGNvdXBsZSBvZgorLy8gc2VwYXJhdGVkIHByb2Nlc3NlcyAoZS5nLiB0aGUgcmVmZXJuY2UgY291bnRlcikuIFRoaXMgc3RydWN0dXJlIGlzCisvLyBsb2NhdGVkIGF0IHRoZSBzdGFydCBvZiB0aGUgc2hhcmVkIG1lbW9yeSByZWdpb24gaXRzZWxmIGFuZCBleGlzdHMKKy8vIGNvbnNlcXVlbnRseSBvbmx5IG9uZSB0aW1lcyBwZXIgc2hhcmVkIG1lbW9yeSBpbnN0YW5jZS4KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIG1fU2JoTWFnaWNJRDsJLy8gbWFnaWMgSUQgKCJTQkgqIikKKwl1bnNpZ25lZCBsb25nIG1fdWxTaE1lbVNpemU7CisJdW5zaWduZWQgbG9uZyBtX3VsUmVmQ291bnQ7CisJY2hhciBtX3N6QnVmZmVySURbTUFYX0xFTl9CVUZGRVJfSURdOworCisjaWZuZGVmIE5ERUJVRworCXVuc2lnbmVkIGxvbmcgbV91bE93bmVyUHJvY0lEOworI2VuZGlmCisKK30gdFNoYk1lbUhlYWRlcjsKKworLy8gVGhpcyBzdHJ1Y3R1cmUgaXMgdGhlICJleHRlcm5hbCBlbnRyeSBwb2ludCIgZnJvbSBhIHNlcGFyYXRlIHByb2Nlc3MKKy8vIHRvIGdldCBhY2Nlc3MgdG8gYSBzaGFyZWQgYnVmZmVyLiBUaGlzIHN0cnVjdHVyZSBpbmNsdWRlcyBhbGwgcGxhdGZvcm0KKy8vIHJlc3AuIHRhcmdldCBzcGVjaWZpYyBpbmZvcm1hdGlvbiB0byBhZG1pbmlzdHJhdGUvbWFuYWdlIHRoZSBzaGFyZWQKKy8vIGJ1ZmZlciBmcm9tIGEgc2VwYXJhdGUgcHJvY2Vzcy4gRXZlcnkgcHJvY2VzcyBhdHRhY2hlZCB0byB0aGUgc2hhcmVkCisvLyBidWZmZXIgaGFzIGl0cyBvd24gcnVudGltZSBpbnN0YW5jZSBvZiB0aGlzIHN0cnVjdHVyZSB3aXRoIGl0cyBpbmRpdmlkdWFsCisvLyBydW50aW1lIGRhdGEgKGUuZy4gdGhlIHNjb3BlIG9mIGFuIGV2ZW50IGhhbmRsZSBpcyBsaW1pdHRlZCB0byB0aGUKKy8vIG93bmVyIHByb2Nlc3Mgb25seSkuIFRoZSBzdHJ1Y3R1cmUgbWVtYmVyIDxtX3BTaGJNZW1IZWFkZXI+IHBvaW50cworLy8gdG8gdGhlIChwcm9jZXNzIHNwZWNpZmljKSBzdGFydCBhZGRyZXNzIG9mIHRoZSBzaGFyZWQgbWVtb3J5IHJlZ2lvbgorLy8gaXRzZWxmLgordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgbV9TYmlNYWdpY0lEOwkvLyBtYWdpYyBJRCAoIlNCSSsiKQorCUhBTkRMRSBtX2hTaGFyZWRNZW07CisJSEFORExFIG1faE11dGV4QnVmZkFjY2VzczsKKwlIQU5ETEUgbV9oVGhyZWFkTmV3RGF0YTsJLy8gdGhyYWVkIHRvIHNpZ25hbCB0aGF0IG5ldyBkYXRhIGFyZSBhdmFpbGFibGUKKwlIQU5ETEUgbV9haEV2ZW50TmV3RGF0YVszXTsJLy8gSURYX0VWRU5UX05FV19EQVRBICsgSURYX0VWRU5UX1RFUk1fUkVRVSArIElEX0VWRU5UX1RFUk1fUkVTUAorCXRTaWdIbmRsck5ld0RhdGEgbV9wZm5TaWdIbmRsck5ld0RhdGE7CisJSEFORExFIG1faFRocmVhZEpvYlJlYWR5OwkvLyB0aHJlYWQgdG8gc2lnbmFsIHRoYXQgYSBqb2Ivb3BlcmF0aW9uIGlzIHJlYWR5IG5vdyAoZS5nLiByZXNldCBidWZmZXIpCisJSEFORExFIG1faEV2ZW50Sm9iUmVhZHk7CisJdW5zaWduZWQgbG9uZyBtX3VsVGltZU91dEpvYlJlYWR5OworCXRTaWdIbmRsckpvYlJlYWR5IG1fcGZuU2lnSG5kbHJKb2JSZWFkeTsKKwl0U2hiTWVtSGVhZGVyICptX3BTaGJNZW1IZWFkZXI7CisKKyNpZm5kZWYgTkRFQlVHCisJdW5zaWduZWQgbG9uZyBtX3VsVGhyZWFkSUROZXdEYXRhOworCXVuc2lnbmVkIGxvbmcgbV91bFRocmVhZElESm9iUmVhZHk7CisjZW5kaWYKKworfSB0U2hiTWVtSW5zdDsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBHbG9iYWwgdmFyaWFibGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIExvY2FsIHZhcmlhYmxlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBQcm90b3R5cGVzIG9mIGludGVybmFsIGZ1bmN0aW9ucworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBHZXQgcG9pbnRlciB0byBwcm9jZXNzIGxvY2FsIGluZm9ybWF0aW9uIHN0cnVjdHVyZQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHRTaGJNZW1JbnN0ICpTaGJJcGNHZXRTaGJNZW1JbnN0KHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCkKK3sKKworCXRTaGJNZW1JbnN0ICpwU2hiTWVtSW5zdDsKKworCXBTaGJNZW1JbnN0ID0gKHRTaGJNZW1JbnN0ICopIHBTaGJJbnN0YW5jZV9wOworCUFTU0VSVChwU2hiTWVtSW5zdC0+bV9TYmlNYWdpY0lEID09IFNCSV9NQUdJQ19JRCk7CisKKwlyZXR1cm4gKHBTaGJNZW1JbnN0KTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEdldCBwb2ludGVyIHRvIHNoYXJlZCBtZW1vcnkgaGVhZGVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYk1lbUhlYWRlciAqU2hiSXBjR2V0U2hiTWVtSGVhZGVyKHRTaGJJbnN0YW5jZQorCQkJCQkJICAgICBwU2hiSW5zdGFuY2VfcCkKK3sKKworCXRTaGJNZW1JbnN0ICpwU2hiTWVtSW5zdDsKKwl0U2hiTWVtSGVhZGVyICpwU2hiTWVtSGVhZGVyOworCisJcFNoYk1lbUluc3QgPSBTaGJJcGNHZXRTaGJNZW1JbnN0KHBTaGJJbnN0YW5jZV9wKTsKKwlwU2hiTWVtSGVhZGVyID0gcFNoYk1lbUluc3QtPm1fcFNoYk1lbUhlYWRlcjsKKwlBU1NFUlQocFNoYk1lbUhlYWRlci0+bV9TYmhNYWdpY0lEID09IFNCSF9NQUdJQ19JRCk7CisKKwlyZXR1cm4gKHBTaGJNZW1IZWFkZXIpOworCit9CisKKy8vIG5vdCBpbmxpbmVkIGludGVybmFsIGZ1bmN0aW9ucworRFdPUkQgV0lOQVBJIFNoYklwY1RocmVhZFNpZ25hbE5ld0RhdGEoTFBWT0lEIHB2VGhyZWFkUGFyYW1fcCk7CitEV09SRCBXSU5BUEkgU2hiSXBjVGhyZWFkU2lnbmFsSm9iUmVhZHkoTFBWT0lEIHB2VGhyZWFkUGFyYW1fcCk7Citjb25zdCBjaGFyICpTaGJJcGNHZXRVbmlmb3JtT2JqZWN0TmFtZShjb25zdCBjaGFyICpwc3pFdmVudEpvYk5hbWVfcCwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqcHN6QnVmZmVySURfcCwKKwkJCQkgICAgICAgQk9PTCBmR2xvYmFsT2JqZWN0X3ApOworCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFNIQklQQ19JTkxJTkVfRU5BQkxFRCkKKy8vIHRydWUgaW50ZXJuYWwgZnVuY3Rpb25zIChub3QgaW5saW5lZCkKK3N0YXRpYyB2b2lkICpTaGJJcGNBbGxvY1ByaXZhdGVNZW0odW5zaWduZWQgbG9uZyB1bE1lbVNpemVfcCk7CitzdGF0aWMgdm9pZCBTaGJJcGNSZWxlYXNlUHJpdmF0ZU1lbSh2b2lkICpwTWVtX3ApOworI2VuZGlmCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisjaWYgIWRlZmluZWQoU0hCSVBDX0lOTElORV9FTkFCTEVEKQorLy8gbm90IGlubGluZWQgZXh0ZXJuYWwgZnVuY3Rpb25zCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgSW5pdGlhbGl6ZSBJUEMgZm9yIFNoYXJlZCBCdWZmZXIgTW9kdWxlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0U2hiRXJyb3IgU2hiSXBjSW5pdCh2b2lkKQoreworCisJcmV0dXJuIChrU2hiT2spOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgRGVpbml0aWFsaXplIElQQyBmb3IgU2hhcmVkIEJ1ZmZlciBNb2R1bGUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RTaGJFcnJvciBTaGJJcGNFeGl0KHZvaWQpCit7CisKKwlyZXR1cm4gKGtTaGJPayk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBBbGxvY2F0ZSBTaGFyZWQgQnVmZmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0U2hiRXJyb3IgU2hiSXBjQWxsb2NCdWZmZXIodW5zaWduZWQgbG9uZyB1bEJ1ZmZlclNpemVfcCwKKwkJCSAgICBjb25zdCBjaGFyICpwc3pCdWZmZXJJRF9wLAorCQkJICAgIHRTaGJJbnN0YW5jZSAqIHBwU2hiSW5zdGFuY2VfcCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgKnBmU2hiTmV3Q3JlYXRlZF9wKQoreworCisJSEFORExFIGhTaGFyZWRNZW07CisJTFBWT0lEIHBTaGFyZWRNZW07CisJdW5zaWduZWQgbG9uZyB1bFNoTWVtU2l6ZTsKKwl0U2hiTWVtSW5zdCAqcFNoYk1lbUluc3Q7CisJdFNoYk1lbUhlYWRlciAqcFNoYk1lbUhlYWRlcjsKKwl0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlOworCXVuc2lnbmVkIGludCBmU2hNZW1OZXdDcmVhdGVkOworCWNvbnN0IGNoYXIgKnBzek9iamVjdE5hbWU7CisJSEFORExFIGhNdXRleEJ1ZmZBY2Nlc3M7CisJSEFORExFIGhFdmVudE5ld0RhdGE7CisJSEFORExFIGhFdmVudEpvYlJlYWR5OworCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCXVsU2hNZW1TaXplID0gdWxCdWZmZXJTaXplX3AgKyBzaXplb2YodFNoYk1lbUhlYWRlcik7CisJcFNoYXJlZE1lbSA9IE5VTEw7CisJcFNoYkluc3RhbmNlID0gTlVMTDsKKwlmU2hNZW1OZXdDcmVhdGVkID0gRkFMU0U7CisJU2hiRXJyb3IgPSBrU2hiT2s7CisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vICgxKSBvcGVuIGFuIGV4aXN0aW5nIG9yIGNyZWF0ZSBhIG5ldyBzaGFyZWQgbWVtb3J5CisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyB0cnkgdG8gb3BlbiBhbiBhbHJlYWR5IGV4aXN0aW5nIHNoYXJlZCBtZW1vcnkKKwkvLyAoY3JlYXRlZCBieSBhbiBhbm90aGVyIHByb2Nlc3MpCisJaFNoYXJlZE1lbSA9IE9wZW5GaWxlTWFwcGluZyhGSUxFX01BUF9BTExfQUNDRVNTLAkvLyBEV09SRCBkd0Rlc2lyZWRBY2Nlc3MKKwkJCQkgICAgIEZBTFNFLAkvLyBCT09MIGJJbmhlcml0SGFuZGxlCisJCQkJICAgICBwc3pCdWZmZXJJRF9wKTsJLy8gTFBDVFNUUiBscE5hbWUKKwlpZiAoaFNoYXJlZE1lbSAhPSBOVUxMKSB7CisJCS8vIGEgc2hhcmVkIG1lbW9yeSBhbHJlYWR5IGV4aXN0cworCQlmU2hNZW1OZXdDcmVhdGVkID0gRkFMU0U7CisJfSBlbHNlIHsKKwkJLy8gaXQgc2VhbXMgdGhhdCB0aGlzIHByb2Nlc3MgaXMgdGhlIGZpcnN0IHdobyB3YW50cyB0byB1c2UgdGhlCisJCS8vIHNoYXJlZCBtZW1vcnksIHNvIGl0IGhhcyB0byBjcmVhdGUgYSBuZXcgc2hhcmVkIG1lbW9yeQorCQloU2hhcmVkTWVtID0gQ3JlYXRlRmlsZU1hcHBpbmcoSU5WQUxJRF9IQU5ETEVfVkFMVUUsCS8vIEhBTkRMRSBoRmlsZQorCQkJCQkgICAgICAgTlVMTCwJLy8gTFBTRUNVUklUWV9BVFRSSUJVVEVTIGxwQXR0cmlidXRlcworCQkJCQkgICAgICAgUEFHRV9SRUFEV1JJVEUsCS8vIERXT1JEIGZsUHJvdGVjdAorCQkJCQkgICAgICAgMCwJLy8gRFdPUkQgZHdNYXhpbXVtU2l6ZUhpZ2gKKwkJCQkJICAgICAgIHVsU2hNZW1TaXplLAkvLyBEV09SRCBkd01heGltdW1TaXplTG93CisJCQkJCSAgICAgICBwc3pCdWZmZXJJRF9wKTsJLy8gTFBDVFNUUiBscE5hbWUKKworCQlmU2hNZW1OZXdDcmVhdGVkID0gVFJVRTsKKwl9CisKKwlpZiAoaFNoYXJlZE1lbSA9PSBOVUxMKSB7CisJCVNoYkVycm9yID0ga1NoYk91dE9mTWVtOworCQlnb3RvIEV4aXQ7CisJfQorCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyAoMikgZ2V0IHRoZSBwb2ludGVyIHRvIHRoZSBzaGFyZWQgbWVtb3J5CisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlwU2hhcmVkTWVtID0gTWFwVmlld09mRmlsZShoU2hhcmVkTWVtLAkvLyBIQU5ETEUgaEZpbGVNYXBwaW5nT2JqZWN0CisJCQkJICAgRklMRV9NQVBfQUxMX0FDQ0VTUywJLy8gRFdPUkQgZHdEZXNpcmVkQWNjZXNzLAorCQkJCSAgIDAsCS8vIERXT1JEIGR3RmlsZU9mZnNldEhpZ2gsCisJCQkJICAgMCwJLy8gRFdPUkQgZHdGaWxlT2Zmc2V0TG93LAorCQkJCSAgIHVsU2hNZW1TaXplKTsJLy8gU0laRV9UIGR3TnVtYmVyT2ZCeXRlc1RvTWFwCisKKwlpZiAocFNoYXJlZE1lbSA9PSBOVUxMKSB7CisJCVNoYkVycm9yID0ga1NoYk91dE9mTWVtOworCQlnb3RvIEV4aXQ7CisJfQorCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyAoMykgc2V0dXAgb3IgdXBkYXRlIGhlYWRlciBhbmQgbWFuYWdlbWVudCBpbmZvcm1hdGlvbgorCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJcFNoYk1lbUhlYWRlciA9ICh0U2hiTWVtSGVhZGVyICopIHBTaGFyZWRNZW07CisKKwkvLyBhbGxvY2F0ZSBhIG1lbW9yeSBibG9jayBmcm9tIHByb2Nlc3Mgc3BlY2lmaWMgbWVtcG9vbCB0byBzYXZlCisJLy8gcHJvY2VzcyBsb2NhbCBpbmZvcm1hdGlvbiB0byBhZG1pbmlzdHJhdGUvbWFuYWdlIHRoZSBzaGFyZWQgYnVmZmVyCisJcFNoYk1lbUluc3QgPQorCSAgICAodFNoYk1lbUluc3QgKikgU2hiSXBjQWxsb2NQcml2YXRlTWVtKHNpemVvZih0U2hiTWVtSW5zdCkpOworCWlmIChwU2hiTWVtSW5zdCA9PSBOVUxMKSB7CisJCVNoYkVycm9yID0ga1NoYk91dE9mTWVtOworCQlnb3RvIEV4aXQ7CisJfQorCS8vIHJlc2V0IGNvbXBsZXRlIGhlYWRlciB0byBkZWZhdWx0IHZhbHVlcworCXBTaGJNZW1JbnN0LT5tX1NiaU1hZ2ljSUQgPSBTQklfTUFHSUNfSUQ7CisJcFNoYk1lbUluc3QtPm1faFNoYXJlZE1lbSA9IGhTaGFyZWRNZW07CisJcFNoYk1lbUluc3QtPm1faE11dGV4QnVmZkFjY2VzcyA9IElOVkFMSURfSEFORExFX1ZBTFVFOworCXBTaGJNZW1JbnN0LT5tX2hUaHJlYWROZXdEYXRhID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisJcFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbSURYX0VWRU5UX05FV19EQVRBXSA9CisJICAgIElOVkFMSURfSEFORExFX1ZBTFVFOworCXBTaGJNZW1JbnN0LT5tX2FoRXZlbnROZXdEYXRhW0lEWF9FVkVOVF9URVJNX1JFUVVdID0KKwkgICAgSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisJcFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbSURYX0VWRU5UX1RFUk1fUkVTUF0gPQorCSAgICBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKwlwU2hiTWVtSW5zdC0+bV9wZm5TaWdIbmRsck5ld0RhdGEgPSBOVUxMOworCXBTaGJNZW1JbnN0LT5tX2hUaHJlYWRKb2JSZWFkeSA9IElOVkFMSURfSEFORExFX1ZBTFVFOworCXBTaGJNZW1JbnN0LT5tX2hFdmVudEpvYlJlYWR5ID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisJcFNoYk1lbUluc3QtPm1fdWxUaW1lT3V0Sm9iUmVhZHkgPSAwOworCXBTaGJNZW1JbnN0LT5tX3BmblNpZ0huZGxySm9iUmVhZHkgPSBOVUxMOworCXBTaGJNZW1JbnN0LT5tX3BTaGJNZW1IZWFkZXIgPSBwU2hiTWVtSGVhZGVyOworCisjaWZuZGVmIE5ERUJVRworCXsKKwkJcFNoYk1lbUluc3QtPm1fdWxUaHJlYWRJRE5ld0RhdGEgPSAwOworCQlwU2hiTWVtSW5zdC0+bV91bFRocmVhZElESm9iUmVhZHkgPSAwOworCX0KKyNlbmRpZgorCisJLy8gY3JlYXRlIG11dGV4IGZvciBidWZmZXIgYWNjZXNzCisJcHN6T2JqZWN0TmFtZSA9CisJICAgIFNoYklwY0dldFVuaWZvcm1PYmplY3ROYW1lKE5BTUVfTVVURVhfQlVGRl9BQ0NFU1MsIHBzekJ1ZmZlcklEX3AsCisJCQkJICAgICAgIFRSVUUpOworCWhNdXRleEJ1ZmZBY2Nlc3MgPSBDcmVhdGVNdXRleChOVUxMLAkvLyBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgbHBNdXRleEF0dHJpYnV0ZXMKKwkJCQkgICAgICAgRkFMU0UsCS8vIEJPT0wgYkluaXRpYWxPd25lcgorCQkJCSAgICAgICBwc3pPYmplY3ROYW1lKTsJLy8gTFBDVFNUUiBscE5hbWUKKwlwU2hiTWVtSW5zdC0+bV9oTXV0ZXhCdWZmQWNjZXNzID0gaE11dGV4QnVmZkFjY2VzczsKKwlBU1NFUlQocFNoYk1lbUluc3QtPm1faE11dGV4QnVmZkFjY2VzcyAhPSBOVUxMKTsKKworCS8vIFRoZSBFdmVudE5ld0RhdGEgaXMgdXNlZCBmb3Igc2lnbmFsaW5nIG9mIG5ldyBkYXRhIGFmdGVyIGEgd3JpdGUKKwkvLyBvcGVyYXRpb24gKFNldEV2ZW50KSBhcyB3ZWxsIGFzIGZvciB3YWl0aW5nIGZvciBuZXcgZGF0YSBvbiB0aGUKKwkvLyByZWFkZXIgc2lkZSAoV2FpdEZvck11bHRpcGxlT2JqZWN0cykuIEJlY2F1c2UgaXQncyBub3Qga25vd24gaWYKKwkvLyB0aGlzIHByb2Nlc3Mgd2lsbCBiZSByZWFkIG9yIHdyaXRlIGRhdGEsIHRoZSBldmVudCB3aWxsIGJlCisJLy8gYWx3YXlzIGNyZWF0ZWQgaGVyZS4KKwlwc3pPYmplY3ROYW1lID0KKwkgICAgU2hiSXBjR2V0VW5pZm9ybU9iamVjdE5hbWUoTkFNRV9FVkVOVF9ORVdfREFUQSwgcHN6QnVmZmVySURfcCwKKwkJCQkgICAgICAgVFJVRSk7CisJaEV2ZW50TmV3RGF0YSA9IENyZWF0ZUV2ZW50KE5VTEwsCS8vIExQU0VDVVJJVFlfQVRUUklCVVRFUyBscEV2ZW50QXR0cmlidXRlcworCQkJCSAgICBGQUxTRSwJLy8gQk9PTCBiTWFudWFsUmVzZXQKKwkJCQkgICAgRkFMU0UsCS8vIEJPT0wgYkluaXRpYWxTdGF0ZQorCQkJCSAgICBwc3pPYmplY3ROYW1lKTsJLy8gTFBDVFNUUiBscE5hbWUKKwlwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVtJRFhfRVZFTlRfTkVXX0RBVEFdID0gaEV2ZW50TmV3RGF0YTsKKwlBU1NFUlQocFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbSURYX0VWRU5UX05FV19EQVRBXSAhPSBOVUxMKTsKKworCS8vIFRoZSBFdmVudEpvYlJlYWR5IGlzIHVzZWQgZm9yIHNpZ25hbGluZyB0aGF0IGEgam9iIGlzIGRvbmUgKFNldEV2ZW50KQorCS8vIGFzIHdlbGwgYXMgZm9yIHdhaXRpbmcgZm9yIGZpbmlzaGluZyBvZiBhIGpvYiAoV2FpdEZvck11bHRpcGxlT2JqZWN0cykuCisJLy8gQmVjYXVzZSBpdCdzIG5vdCBrbm93biBpZiB0aGlzIHByb2Nlc3Mgd2lsbCBzaWduYWwgb3Igd2FpdCwgdGhlIGV2ZW50CisJLy8gd2lsbCBiZSBhbHdheXMgY3JlYXRlZCBoZXJlLgorCXBzek9iamVjdE5hbWUgPQorCSAgICBTaGJJcGNHZXRVbmlmb3JtT2JqZWN0TmFtZShOQU1FX0VWRU5UX0pPQl9SRUFEWSwgcHN6QnVmZmVySURfcCwKKwkJCQkgICAgICAgVFJVRSk7CisJaEV2ZW50Sm9iUmVhZHkgPSBDcmVhdGVFdmVudChOVUxMLAkvLyBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgbHBFdmVudEF0dHJpYnV0ZXMKKwkJCQkgICAgIEZBTFNFLAkvLyBCT09MIGJNYW51YWxSZXNldAorCQkJCSAgICAgRkFMU0UsCS8vIEJPT0wgYkluaXRpYWxTdGF0ZQorCQkJCSAgICAgcHN6T2JqZWN0TmFtZSk7CS8vIExQQ1RTVFIgbHBOYW1lCisJcFNoYk1lbUluc3QtPm1faEV2ZW50Sm9iUmVhZHkgPSBoRXZlbnRKb2JSZWFkeTsKKwlBU1NFUlQocFNoYk1lbUluc3QtPm1faEV2ZW50Sm9iUmVhZHkgIT0gTlVMTCk7CisKKwlpZiAoZlNoTWVtTmV3Q3JlYXRlZCkgeworCQkvLyB0aGlzIHByb2Nlc3Mgd2FzIHRoZSBmaXJzdCB3aG8gd2FudGVkIHRvIHVzZSB0aGUgc2hhcmVkIG1lbW9yeSwKKwkJLy8gc28gYSBuZXcgc2hhcmVkIG1lbW9yeSB3YXMgY3JlYXRlZAorCQkvLyAtPiBzZXR1cCBuZXcgaGVhZGVyIGluZm9ybWF0aW9uIGluc2lkZSB0aGUgc2hhcmVkIG1lbW9yeSByZWdpb24KKwkJLy8gICAgaXRzZWxmCisJCXBTaGJNZW1IZWFkZXItPm1fU2JoTWFnaWNJRCA9IFNCSF9NQUdJQ19JRDsKKwkJcFNoYk1lbUhlYWRlci0+bV91bFNoTWVtU2l6ZSA9IHVsU2hNZW1TaXplOworCQlwU2hiTWVtSGVhZGVyLT5tX3VsUmVmQ291bnQgPSAxOworCQlzdHJuY3B5KHBTaGJNZW1IZWFkZXItPm1fc3pCdWZmZXJJRCwgcHN6QnVmZmVySURfcCwKKwkJCXNpemVvZihwU2hiTWVtSGVhZGVyLT5tX3N6QnVmZmVySUQpIC0gMSk7CisKKyNpZm5kZWYgTkRFQlVHCisJCXsKKwkJCXBTaGJNZW1IZWFkZXItPm1fdWxPd25lclByb2NJRCA9IEdldEN1cnJlbnRQcm9jZXNzSWQoKTsKKwkJfQorI2VuZGlmCisJfSBlbHNlIHsKKwkJLy8gYW55IG90aGVyIHByb2Nlc3MgaGFzIGNyZWF0ZWQgdGhlIHNoYXJlZCBtZW1vcnkgYW5kIHRoaXMKKwkJLy8gcHJvY2VzcyBoYXMgb25seSBhdHRhY2hlZCB0byBpdAorCQkvLyAtPiBjaGVjayBhbmQgdXBkYXRlIGV4aXN0aW5nIGhlYWRlciBpbmZvcm1hdGlvbiBpbnNpZGUgdGhlCisJCS8vICAgIHNoYXJlZCBtZW1vcnkgcmVnaW9uIGl0c2VsZgorCQlpZiAocFNoYk1lbUhlYWRlci0+bV91bFNoTWVtU2l6ZSAhPSB1bFNoTWVtU2l6ZSkgeworCQkJU2hiRXJyb3IgPSBrU2hiT3Blbk1pc21hdGNoOworCQkJZ290byBFeGl0OworCQl9CisjaWZuZGVmIE5ERUJVRworCQl7CisJCQlpZiAoc3RybmNtcAorCQkJICAgIChwU2hiTWVtSGVhZGVyLT5tX3N6QnVmZmVySUQsIHBzekJ1ZmZlcklEX3AsCisJCQkgICAgIHNpemVvZihwU2hiTWVtSGVhZGVyLT5tX3N6QnVmZmVySUQpIC0gMSkpIHsKKwkJCQlTaGJFcnJvciA9IGtTaGJPcGVuTWlzbWF0Y2g7CisJCQkJZ290byBFeGl0OworCQkJfQorCQl9CisjZW5kaWYKKworCQlwU2hiTWVtSGVhZGVyLT5tX3VsUmVmQ291bnQrKzsKKwl9CisKKwkvLyBzZXQgYWJzdGFyY3QgImhhbmRsZSIgZm9yIHJldHVybmluZyB0byBhcHBsaWNhdGlvbgorCXBTaGJJbnN0YW5jZSA9ICh0U2hiSW5zdGFuY2UgKikgcFNoYk1lbUluc3Q7CisKKyAgICAgIEV4aXQ6CisKKwlpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CisJCWlmIChwU2hiTWVtSW5zdCAhPSBOVUxMKSB7CisJCQlTaGJJcGNSZWxlYXNlUHJpdmF0ZU1lbShwU2hiTWVtSW5zdCk7CisJCX0KKwkJaWYgKHBTaGFyZWRNZW0gIT0gTlVMTCkgeworCQkJVW5tYXBWaWV3T2ZGaWxlKHBTaGFyZWRNZW0pOworCQl9CisJCWlmIChoU2hhcmVkTWVtICE9IE5VTEwpIHsKKwkJCUNsb3NlSGFuZGxlKGhTaGFyZWRNZW0pOworCQl9CisJfQorCisJKnBmU2hiTmV3Q3JlYXRlZF9wID0gZlNoTWVtTmV3Q3JlYXRlZDsKKwkqcHBTaGJJbnN0YW5jZV9wID0gcFNoYkluc3RhbmNlOworCisJcmV0dXJuIChTaGJFcnJvcik7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBSZWxlYXNlIFNoYXJlZCBCdWZmZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RTaGJFcnJvciBTaGJJcGNSZWxlYXNlQnVmZmVyKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCkKK3sKKworCXRTaGJNZW1JbnN0ICpwU2hiTWVtSW5zdDsKKwl0U2hiTWVtSGVhZGVyICpwU2hiTWVtSGVhZGVyOworCUhBTkRMRSBoRXZlbnROZXdEYXRhOworCUhBTkRMRSBoTXV0ZXhCdWZmQWNjZXNzOworCXRTaGJFcnJvciBTaGJFcnJvcjsKKwl0U2hiRXJyb3IgU2hiRXJyb3IyOworCisJaWYgKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHsKKwkJcmV0dXJuIChrU2hiT2spOworCX0KKworCXBTaGJNZW1JbnN0ID0gU2hiSXBjR2V0U2hiTWVtSW5zdChwU2hiSW5zdGFuY2VfcCk7CisJcFNoYk1lbUhlYWRlciA9IFNoYklwY0dldFNoYk1lbUhlYWRlcihwU2hiSW5zdGFuY2VfcCk7CisKKwlpZiAoIS0tcFNoYk1lbUhlYWRlci0+bV91bFJlZkNvdW50KSB7CisJCVNoYkVycm9yID0ga1NoYk9rOworCX0gZWxzZSB7CisJCVNoYkVycm9yID0ga1NoYk1lbVVzZWRCeU90aGVyUHJvY3M7CisJfQorCisJU2hiRXJyb3IyID0gU2hiSXBjU3RvcFNpZ25hbGluZ05ld0RhdGEocFNoYkluc3RhbmNlX3ApOworCWhFdmVudE5ld0RhdGEgPSBwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVtJRFhfRVZFTlRfTkVXX0RBVEFdOworCWlmIChoRXZlbnROZXdEYXRhICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisJCUNsb3NlSGFuZGxlKGhFdmVudE5ld0RhdGEpOworCQlwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVtJRFhfRVZFTlRfTkVXX0RBVEFdID0KKwkJICAgIElOVkFMSURfSEFORExFX1ZBTFVFOworCX0KKworCWhNdXRleEJ1ZmZBY2Nlc3MgPSBwU2hiTWVtSW5zdC0+bV9oTXV0ZXhCdWZmQWNjZXNzOworCWlmIChoTXV0ZXhCdWZmQWNjZXNzICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisJCUNsb3NlSGFuZGxlKGhNdXRleEJ1ZmZBY2Nlc3MpOworCQlwU2hiTWVtSW5zdC0+bV9oTXV0ZXhCdWZmQWNjZXNzID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisJfQorCisJVW5tYXBWaWV3T2ZGaWxlKHBTaGJNZW1IZWFkZXIpOworCWlmIChwU2hiTWVtSW5zdC0+bV9oU2hhcmVkTWVtICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisJCUNsb3NlSGFuZGxlKHBTaGJNZW1JbnN0LT5tX2hTaGFyZWRNZW0pOworCQlwU2hiTWVtSW5zdC0+bV9oU2hhcmVkTWVtID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisJfQorCisJU2hiSXBjUmVsZWFzZVByaXZhdGVNZW0ocFNoYk1lbUluc3QpOworCisJaWYgKFNoYkVycm9yID09IGtTaGJPaykgeworCQlTaGJFcnJvciA9IFNoYkVycm9yMjsKKwl9CisKKwlyZXR1cm4gKFNoYkVycm9yKTsKKworfQorCisjZW5kaWYgLy8gIWRlZmluZWQoU0hCSVBDX0lOTElORV9FTkFCTEVEKQorCisjaWYgKCFkZWZpbmVkKFNIQklQQ19JTkxJTkVEKSkgfHwgZGVmaW5lZChTSEJJUENfSU5MSU5FX0VOQUJMRUQpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgRW50ZXIgYXRvbWljIHNlY3Rpb24gZm9yIFNoYXJlZCBCdWZmZXIgYWNjZXNzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYkVycm9yIFNoYklwY0VudGVyQXRvbWljU2VjdGlvbih0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApCit7CisKKwl0U2hiTWVtSW5zdCAqcFNoYk1lbUluc3Q7CisJSEFORExFIGhNdXRleEJ1ZmZBY2Nlc3M7CisJRFdPUkQgZHdXYWl0UmVzdWx0OworCXRTaGJFcnJvciBTaGJFcnJvcjsKKworCWlmIChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB7CisJCXJldHVybiAoa1NoYkludmFsaWRBcmcpOworCX0KKworCXBTaGJNZW1JbnN0ID0gU2hiSXBjR2V0U2hiTWVtSW5zdChwU2hiSW5zdGFuY2VfcCk7CisJU2hiRXJyb3IgPSBrU2hiT2s7CisKKwloTXV0ZXhCdWZmQWNjZXNzID0gcFNoYk1lbUluc3QtPm1faE11dGV4QnVmZkFjY2VzczsKKwlpZiAoaE11dGV4QnVmZkFjY2VzcyAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworCQlkd1dhaXRSZXN1bHQgPQorCQkgICAgV2FpdEZvclNpbmdsZU9iamVjdChoTXV0ZXhCdWZmQWNjZXNzLCBUSU1FT1VUX0VOVEVSX0FUT01JQyk7CisJCXN3aXRjaCAoZHdXYWl0UmVzdWx0KSB7CisJCWNhc2UgV0FJVF9PQkpFQ1RfMCArIDA6CisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJY2FzZSBXQUlUX1RJTUVPVVQ6CisJCQl7CisJCQkJVFJBQ0UwCisJCQkJICAgICgiXG5TaGJJcGNFbnRlckF0b21pY1NlY3Rpb24oKTogV0FJVF9USU1FT1VUIik7CisJCQkJQVNTRVJUKDApOworCQkJCVNoYkVycm9yID0ga1NoYkJ1ZmZlckludmFsaWQ7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJY2FzZSBXQUlUX0FCQU5ET05FRDoKKwkJCXsKKwkJCQlUUkFDRTAKKwkJCQkgICAgKCJcblNoYklwY0VudGVyQXRvbWljU2VjdGlvbigpOiBXQUlUX0FCQU5ET05FRCIpOworCQkJCUFTU0VSVCgwKTsKKwkJCQlTaGJFcnJvciA9IGtTaGJCdWZmZXJJbnZhbGlkOworCQkJCWJyZWFrOworCQkJfQorCisJCWNhc2UgV0FJVF9GQUlMRUQ6CisJCQl7CisJCQkJVFJBQ0UxCisJCQkJICAgICgiXG5TaGJJcGNFbnRlckF0b21pY1NlY3Rpb24oKTogV0FJVF9GQUlMRUQgLT4gTGFzdEVycm9yPSVsZCIsCisJCQkJICAgICBHZXRMYXN0RXJyb3IoKSk7CisJCQkJQVNTRVJUKDApOworCQkJCVNoYkVycm9yID0ga1NoYkJ1ZmZlckludmFsaWQ7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJZGVmYXVsdDoKKwkJCXsKKwkJCQlUUkFDRTEKKwkJCQkgICAgKCJcblNoYklwY0VudGVyQXRvbWljU2VjdGlvbigpOiB1bmtub3duIGVycm9yIC0+IExhc3RFcnJvcj0lbGQiLAorCQkJCSAgICAgR2V0TGFzdEVycm9yKCkpOworCQkJCUFTU0VSVCgwKTsKKwkJCQlTaGJFcnJvciA9IGtTaGJCdWZmZXJJbnZhbGlkOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJU2hiRXJyb3IgPSBrU2hiQnVmZmVySW52YWxpZDsKKwl9CisKKwlyZXR1cm4gKFNoYkVycm9yKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIExlYXZlIGF0b21pYyBzZWN0aW9uIGZvciBTaGFyZWQgQnVmZmVyIGFjY2VzcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHRTaGJFcnJvciBTaGJJcGNMZWF2ZUF0b21pY1NlY3Rpb24odFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKQoreworCisJdFNoYk1lbUluc3QgKnBTaGJNZW1JbnN0OworCUhBTkRMRSBoTXV0ZXhCdWZmQWNjZXNzOworCUJPT0wgZlJlczsKKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisKKwlpZiAocFNoYkluc3RhbmNlX3AgPT0gTlVMTCkgeworCQlyZXR1cm4gKGtTaGJJbnZhbGlkQXJnKTsKKwl9CisKKwlwU2hiTWVtSW5zdCA9IFNoYklwY0dldFNoYk1lbUluc3QocFNoYkluc3RhbmNlX3ApOworCVNoYkVycm9yID0ga1NoYk9rOworCisJaE11dGV4QnVmZkFjY2VzcyA9IHBTaGJNZW1JbnN0LT5tX2hNdXRleEJ1ZmZBY2Nlc3M7CisJaWYgKGhNdXRleEJ1ZmZBY2Nlc3MgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKwkJZlJlcyA9IFJlbGVhc2VNdXRleChoTXV0ZXhCdWZmQWNjZXNzKTsKKwkJQVNTRVJUKGZSZXMpOworCX0gZWxzZSB7CisJCVNoYkVycm9yID0ga1NoYkJ1ZmZlckludmFsaWQ7CisJfQorCisJcmV0dXJuIChTaGJFcnJvcik7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBTdGFydCBzaWduYWxpbmcgb2YgbmV3IGRhdGEgKGNhbGxlZCBmcm9tIHJlYWRpbmcgcHJvY2VzcykKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiRXJyb3IgU2hiSXBjU3RhcnRTaWduYWxpbmdOZXdEYXRhKHRTaGJJbnN0YW5jZQorCQkJCQkJICAgICAgcFNoYkluc3RhbmNlX3AsCisJCQkJCQkgICAgICB0U2lnSG5kbHJOZXdEYXRhCisJCQkJCQkgICAgICBwZm5TaWduYWxIYW5kbGVyTmV3RGF0YV9wLAorCQkJCQkJICAgICAgdFNoYlByaW9yaXR5CisJCQkJCQkgICAgICBTaGJQcmlvcml0eV9wKQoreworCisJdFNoYk1lbUluc3QgKnBTaGJNZW1JbnN0OworCXRTaGJNZW1IZWFkZXIgKnBTaGJNZW1IZWFkZXI7CisJY29uc3QgY2hhciAqcHN6T2JqZWN0TmFtZTsKKwlIQU5ETEUgaEV2ZW50VGVybVJlcXU7CisJSEFORExFIGhFdmVudFRlcm1SZXNwOworCUhBTkRMRSBoVGhyZWFkTmV3RGF0YTsKKwl1bnNpZ25lZCBsb25nIHVsVGhyZWFkSUROZXdEYXRhOworCXRTaGJFcnJvciBTaGJFcnJvcjsKKwlpbnQgaVByaW9yaXR5OworCisJaWYgKChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB8fCAocGZuU2lnbmFsSGFuZGxlck5ld0RhdGFfcCA9PSBOVUxMKSkgeworCQlyZXR1cm4gKGtTaGJJbnZhbGlkQXJnKTsKKwl9CisKKwlwU2hiTWVtSW5zdCA9IFNoYklwY0dldFNoYk1lbUluc3QocFNoYkluc3RhbmNlX3ApOworCXBTaGJNZW1IZWFkZXIgPSBTaGJJcGNHZXRTaGJNZW1IZWFkZXIocFNoYkluc3RhbmNlX3ApOworCVNoYkVycm9yID0ga1NoYk9rOworCisJaWYgKChwU2hiTWVtSW5zdC0+bV9oVGhyZWFkTmV3RGF0YSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgfHwKKwkgICAgKHBTaGJNZW1JbnN0LT5tX2FoRXZlbnROZXdEYXRhW0lEWF9FVkVOVF9URVJNX1JFUVVdICE9CisJICAgICBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKwkgICAgfHwgKHBTaGJNZW1JbnN0LT5tX2FoRXZlbnROZXdEYXRhW0lEWF9FVkVOVF9URVJNX1JFU1BdICE9CisJCUlOVkFMSURfSEFORExFX1ZBTFVFKQorCSAgICB8fCAocFNoYk1lbUluc3QtPm1fcGZuU2lnSG5kbHJOZXdEYXRhICE9IE5VTEwpKSB7CisJCVNoYkVycm9yID0ga1NoYkFscmVhZHlTaWduYWxpbmc7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlwU2hiTWVtSW5zdC0+bV9wZm5TaWdIbmRsck5ld0RhdGEgPSBwZm5TaWduYWxIYW5kbGVyTmV3RGF0YV9wOworCisJLy8gQmVjYXVzZSB0aGUgZXZlbnQgPHBTaGJNZW1JbnN0LT5tX2FoRXZlbnROZXdEYXRhW0lEWF9FVkVOVF9ORVdfREFUQV0+CisJLy8gaXMgdXNlZCBmb3Igc2lnbmFsaW5nIG9mIG5ldyBkYXRhIGFmdGVyIGEgd3JpdGUgb3BlcmF0aW9uIHRvbyAodXNpbmcKKwkvLyBTZXRFdmVudCksIGl0IGlzIGFsd2F5cyBjcmVhdGVkIGhlcmUgKHNlZSA8U2hiSXBjQWxsb2NCdWZmZXI+KS4KKworCXBzek9iamVjdE5hbWUgPQorCSAgICBTaGJJcGNHZXRVbmlmb3JtT2JqZWN0TmFtZShOQU1FX0VWRU5UX1RFUk1fUkVRVSwKKwkJCQkgICAgICAgcFNoYk1lbUhlYWRlci0+bV9zekJ1ZmZlcklELCBGQUxTRSk7CisJaEV2ZW50VGVybVJlcXUgPSBDcmVhdGVFdmVudChOVUxMLAkvLyBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgbHBFdmVudEF0dHJpYnV0ZXMKKwkJCQkgICAgIEZBTFNFLAkvLyBCT09MIGJNYW51YWxSZXNldAorCQkJCSAgICAgRkFMU0UsCS8vIEJPT0wgYkluaXRpYWxTdGF0ZQorCQkJCSAgICAgcHN6T2JqZWN0TmFtZSk7CS8vIExQQ1RTVFIgbHBOYW1lCisJcFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbSURYX0VWRU5UX1RFUk1fUkVRVV0gPSBoRXZlbnRUZXJtUmVxdTsKKwlBU1NFUlQocFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbSURYX0VWRU5UX1RFUk1fUkVRVV0gIT0gTlVMTCk7CisKKwlwc3pPYmplY3ROYW1lID0KKwkgICAgU2hiSXBjR2V0VW5pZm9ybU9iamVjdE5hbWUoTkFNRV9FVkVOVF9URVJNX1JFU1AsCisJCQkJICAgICAgIHBTaGJNZW1IZWFkZXItPm1fc3pCdWZmZXJJRCwgRkFMU0UpOworCWhFdmVudFRlcm1SZXNwID0gQ3JlYXRlRXZlbnQoTlVMTCwJLy8gTFBTRUNVUklUWV9BVFRSSUJVVEVTIGxwRXZlbnRBdHRyaWJ1dGVzCisJCQkJICAgICBGQUxTRSwJLy8gQk9PTCBiTWFudWFsUmVzZXQKKwkJCQkgICAgIEZBTFNFLAkvLyBCT09MIGJJbml0aWFsU3RhdGUKKwkJCQkgICAgIHBzek9iamVjdE5hbWUpOwkvLyBMUENUU1RSIGxwTmFtZQorCXBTaGJNZW1JbnN0LT5tX2FoRXZlbnROZXdEYXRhW0lEWF9FVkVOVF9URVJNX1JFU1BdID0gaEV2ZW50VGVybVJlc3A7CisJQVNTRVJUKHBTaGJNZW1JbnN0LT5tX2FoRXZlbnROZXdEYXRhW0lEWF9FVkVOVF9URVJNX1JFU1BdICE9IE5VTEwpOworCisJaFRocmVhZE5ld0RhdGEgPSBDcmVhdGVUaHJlYWQoTlVMTCwJLy8gTFBTRUNVUklUWV9BVFRSSUJVVEVTIGxwVGhyZWFkQXR0cmlidXRlcworCQkJCSAgICAgIDAsCS8vIFNJWkVfVCBkd1N0YWNrU2l6ZQorCQkJCSAgICAgIFNoYklwY1RocmVhZFNpZ25hbE5ld0RhdGEsCS8vIExQVEhSRUFEX1NUQVJUX1JPVVRJTkUgbHBTdGFydEFkZHJlc3MKKwkJCQkgICAgICBwU2hiSW5zdGFuY2VfcCwJLy8gTFBWT0lEIGxwUGFyYW1ldGVyCisJCQkJICAgICAgMCwJLy8gRFdPUkQgZHdDcmVhdGlvbkZsYWdzCisJCQkJICAgICAgJnVsVGhyZWFkSUROZXdEYXRhKTsJLy8gTFBEV09SRCBscFRocmVhZElkCisKKwlzd2l0Y2ggKFNoYlByaW9yaXR5X3ApIHsKKwljYXNlIGtTaGJQcmlvcml0eUxvdzoKKwkJaVByaW9yaXR5ID0gVEhSRUFEX1BSSU9SSVRZX0JFTE9XX05PUk1BTDsKKwkJYnJlYWs7CisKKwljYXNlIGtTaGJQcmlvcml0eU5vcm1hbDoKKwkJaVByaW9yaXR5ID0gVEhSRUFEX1BSSU9SSVRZX05PUk1BTDsKKwkJYnJlYWs7CisKKwljYXNlIGtzaGJQcmlvcml0eUhpZ2g6CisJCWlQcmlvcml0eSA9IFRIUkVBRF9QUklPUklUWV9BQk9WRV9OT1JNQUw7CisJCWJyZWFrOworCisJfQorCisJQVNTRVJUKHBTaGJNZW1JbnN0LT5tX2hUaHJlYWROZXdEYXRhICE9IE5VTEwpOworCisJU2V0VGhyZWFkUHJpb3JpdHkoaFRocmVhZE5ld0RhdGEsIGlQcmlvcml0eSk7CisKKwlwU2hiTWVtSW5zdC0+bV9oVGhyZWFkTmV3RGF0YSA9IGhUaHJlYWROZXdEYXRhOworCisjaWZuZGVmIE5ERUJVRworCXsKKwkJcFNoYk1lbUluc3QtPm1fdWxUaHJlYWRJRE5ld0RhdGEgPSB1bFRocmVhZElETmV3RGF0YTsKKwl9CisjZW5kaWYKKworICAgICAgRXhpdDoKKworCXJldHVybiAoU2hiRXJyb3IpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgU3RvcCBzaWduYWxpbmcgb2YgbmV3IGRhdGEgKGNhbGxlZCBmcm9tIHJlYWRpbmcgcHJvY2VzcykKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB0U2hiRXJyb3IgU2hiSXBjU3RvcFNpZ25hbGluZ05ld0RhdGEodFNoYkluc3RhbmNlCisJCQkJCQkgICAgIHBTaGJJbnN0YW5jZV9wKQoreworCisJdFNoYk1lbUluc3QgKnBTaGJNZW1JbnN0OworCUhBTkRMRSBoRXZlbnRUZXJtUmVxdTsKKwlIQU5ETEUgaEV2ZW50VGVybVJlc3A7CisJRFdPUkQgZHdXYWl0UmVzdWx0OworCisJaWYgKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHsKKwkJcmV0dXJuIChrU2hiSW52YWxpZEFyZyk7CisJfQorCisJcFNoYk1lbUluc3QgPSBTaGJJcGNHZXRTaGJNZW1JbnN0KHBTaGJJbnN0YW5jZV9wKTsKKworCS8vIHRlcm1pbmF0ZSBuZXcgZGF0YSBzaWduYWxpbmcgdGhyZWFkCisJLy8gKHNldCBldmVudCA8aEV2ZW50VGVybVJlcXU+IHRvIHdha2V1cCB0aGUgdGhyZWFkIGFuZCBkaXNwb3NlIGl0CisJLy8gdG8gZXhpdCwgdGhlbiB3YWl0IGZvciBjb25maXJtYXRpb24gdXNpbmcgZXZlbnQgPGhFdmVudFRlcm1SZXNwPikKKwloRXZlbnRUZXJtUmVxdSA9IHBTaGJNZW1JbnN0LT5tX2FoRXZlbnROZXdEYXRhW0lEWF9FVkVOVF9URVJNX1JFUVVdOworCWhFdmVudFRlcm1SZXNwID0gcFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbSURYX0VWRU5UX1RFUk1fUkVTUF07CisJaWYgKChoRXZlbnRUZXJtUmVxdSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgJiYKKwkgICAgKGhFdmVudFRlcm1SZXNwICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSkgeworCQlUUkFDRTAoIlxuU2hiSXBjU3RvcFNpZ25hbGluZ05ld0RhdGEoKTogZW50ZXIgd2FpdCBzdGF0ZSIpOworCQlkd1dhaXRSZXN1bHQgPSBTaWduYWxPYmplY3RBbmRXYWl0KGhFdmVudFRlcm1SZXF1LAkvLyBIQU5ETEUgaE9iamVjdFRvU2lnbmFsCisJCQkJCQkgICBoRXZlbnRUZXJtUmVzcCwJLy8gSEFORExFIGhPYmplY3RUb1dhaXRPbgorCQkJCQkJICAgVElNRU9VVF9URVJNX1RIUkVBRCwJLy8gRFdPUkQgZHdNaWxsaXNlY29uZHMKKwkJCQkJCSAgIEZBTFNFKTsJLy8gQk9PTCBiQWxlcnRhYmxlCisJCVRSQUNFMAorCQkgICAgKCJcblNoYklwY1N0b3BTaWduYWxpbmdOZXdEYXRhKCk6IHdhaXQgc3RhdGUgbGVhdmVkOiAtLS0+ICIpOworCQlzd2l0Y2ggKGR3V2FpdFJlc3VsdCkgeworCQljYXNlIFdBSVRfT0JKRUNUXzAgKyAwOgkvLyBldmVudCAibmV3IGRhdGEgc2lnbmFsaW5nIHRocmVhZCB0ZXJtaW5hdGVkIgorCQkJeworCQkJCVRSQUNFMCgiRXZlbnQgPSBXQUlUX09CSkVDVF8wKzAiKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQlkZWZhdWx0OgorCQkJeworCQkJCVRSQUNFMCgiVW5oYW5kbGVkIEV2ZW50Iik7CisJCQkJQVNTRVJUKDApOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKHBTaGJNZW1JbnN0LT5tX2hUaHJlYWROZXdEYXRhICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisJCUNsb3NlSGFuZGxlKHBTaGJNZW1JbnN0LT5tX2hUaHJlYWROZXdEYXRhKTsKKwkJcFNoYk1lbUluc3QtPm1faFRocmVhZE5ld0RhdGEgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKwl9CisKKwlpZiAocFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbSURYX0VWRU5UX1RFUk1fUkVRVV0gIT0KKwkgICAgSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKwkJQ2xvc2VIYW5kbGUocFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbSURYX0VWRU5UX1RFUk1fUkVRVV0pOworCQlwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVtJRFhfRVZFTlRfVEVSTV9SRVFVXSA9CisJCSAgICBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKwl9CisKKwlpZiAocFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbSURYX0VWRU5UX1RFUk1fUkVTUF0gIT0KKwkgICAgSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKwkJQ2xvc2VIYW5kbGUocFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbSURYX0VWRU5UX1RFUk1fUkVTUF0pOworCQlwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVtJRFhfRVZFTlRfVEVSTV9SRVNQXSA9CisJCSAgICBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKwl9CisKKwlwU2hiTWVtSW5zdC0+bV9wZm5TaWdIbmRsck5ld0RhdGEgPSBOVUxMOworCisJcmV0dXJuIChrU2hiT2spOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgU2lnbmFsIG5ldyBkYXRhIChjYWxsZWQgZnJvbSB3cml0aW5nIHByb2Nlc3MpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYkVycm9yIFNoYklwY1NpZ25hbE5ld0RhdGEodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKQoreworCisJdFNoYk1lbUluc3QgKnBTaGJNZW1JbnN0OworCUhBTkRMRSBoRXZlbnROZXdEYXRhOworCUJPT0wgZlJlczsKKworCS8vIFRSQUNFMCgiXG5TaGJJcGNTaWduYWxOZXdEYXRhKCk6IGVudGVyXG4iKTsKKworCWlmIChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB7CisJCXJldHVybiAoa1NoYkludmFsaWRBcmcpOworCX0KKworCXBTaGJNZW1JbnN0ID0gU2hiSXBjR2V0U2hiTWVtSW5zdChwU2hiSW5zdGFuY2VfcCk7CisKKwlBU1NFUlQocFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbSURYX0VWRU5UX05FV19EQVRBXSAhPQorCSAgICAgICBJTlZBTElEX0hBTkRMRV9WQUxVRSk7CisJaEV2ZW50TmV3RGF0YSA9IHBTaGJNZW1JbnN0LT5tX2FoRXZlbnROZXdEYXRhW0lEWF9FVkVOVF9ORVdfREFUQV07CisJaWYgKGhFdmVudE5ld0RhdGEgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKwkJZlJlcyA9IFNldEV2ZW50KGhFdmVudE5ld0RhdGEpOworCQkvLyBUUkFDRTEoIlxuU2hiSXBjU2lnbmFsTmV3RGF0YSgpOiBFdmVudE5ld0RhdGEgc2V0IChSZXN1bHQ9JWQpXG4iLCAoaW50KWZSZXMpOworCQlBU1NFUlQoZlJlcyk7CisJfQorCS8vIFRSQUNFMCgiXG5TaGJJcGNTaWduYWxOZXdEYXRhKCk6IGxlYXZlXG4iKTsKKwlyZXR1cm4gKGtTaGJPayk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBTdGFydCBzaWduYWxpbmcgZm9yIGpvYiByZWFkeSAoY2FsbGVkIGZyb20gd2FpdGluZyBwcm9jZXNzKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHRTaGJFcnJvciBTaGJJcGNTdGFydFNpZ25hbGluZ0pvYlJlYWR5KHRTaGJJbnN0YW5jZQorCQkJCQkJICAgICAgIHBTaGJJbnN0YW5jZV9wLAorCQkJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcKKwkJCQkJCSAgICAgICB1bFRpbWVPdXRfcCwKKwkJCQkJCSAgICAgICB0U2lnSG5kbHJKb2JSZWFkeQorCQkJCQkJICAgICAgIHBmblNpZ25hbEhhbmRsZXJKb2JSZWFkeV9wKQoreworCisJdFNoYk1lbUluc3QgKnBTaGJNZW1JbnN0OworCXRTaGJNZW1IZWFkZXIgKnBTaGJNZW1IZWFkZXI7CisJSEFORExFIGhUaHJlYWRKb2JSZWFkeTsKKwl1bnNpZ25lZCBsb25nIHVsVGhyZWFkSURKb2JSZWFkeTsKKwl0U2hiRXJyb3IgU2hiRXJyb3I7CisKKwlpZiAoKHBTaGJJbnN0YW5jZV9wID09IE5VTEwpIHx8IChwZm5TaWduYWxIYW5kbGVySm9iUmVhZHlfcCA9PSBOVUxMKSkgeworCQlyZXR1cm4gKGtTaGJJbnZhbGlkQXJnKTsKKwl9CisKKwlwU2hiTWVtSW5zdCA9IFNoYklwY0dldFNoYk1lbUluc3QocFNoYkluc3RhbmNlX3ApOworCXBTaGJNZW1IZWFkZXIgPSBTaGJJcGNHZXRTaGJNZW1IZWFkZXIocFNoYkluc3RhbmNlX3ApOworCVNoYkVycm9yID0ga1NoYk9rOworCisJaWYgKChwU2hiTWVtSW5zdC0+bV9oVGhyZWFkSm9iUmVhZHkgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHx8CisJICAgIChwU2hiTWVtSW5zdC0+bV9wZm5TaWdIbmRsckpvYlJlYWR5ICE9IE5VTEwpKSB7CisJCVNoYkVycm9yID0ga1NoYkFscmVhZHlTaWduYWxpbmc7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlwU2hiTWVtSW5zdC0+bV91bFRpbWVPdXRKb2JSZWFkeSA9IHVsVGltZU91dF9wOworCXBTaGJNZW1JbnN0LT5tX3BmblNpZ0huZGxySm9iUmVhZHkgPSBwZm5TaWduYWxIYW5kbGVySm9iUmVhZHlfcDsKKworCS8vIEJlY2F1c2UgdGhlIGV2ZW50IDxwU2hiTWVtSW5zdC0+bV9haEV2ZW50Sm9iUmVhZHk+IGlzIHVzZWQgZm9yCisJLy8gc2lnbmFsaW5nIG9mIGEgZmluaXNoZWQgam9iIHRvbyAodXNpbmcgU2V0RXZlbnQpLCBpdCBpcyBhbHdheXMKKwkvLyBjcmVhdGVkIGhlcmUgKHNlZSA8U2hiSXBjQWxsb2NCdWZmZXI+KS4KKworCWhUaHJlYWRKb2JSZWFkeSA9IENyZWF0ZVRocmVhZChOVUxMLAkvLyBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgbHBUaHJlYWRBdHRyaWJ1dGVzCisJCQkJICAgICAgIDAsCS8vIFNJWkVfVCBkd1N0YWNrU2l6ZQorCQkJCSAgICAgICBTaGJJcGNUaHJlYWRTaWduYWxKb2JSZWFkeSwJLy8gTFBUSFJFQURfU1RBUlRfUk9VVElORSBscFN0YXJ0QWRkcmVzcworCQkJCSAgICAgICBwU2hiSW5zdGFuY2VfcCwJLy8gTFBWT0lEIGxwUGFyYW1ldGVyCisJCQkJICAgICAgIDAsCS8vIERXT1JEIGR3Q3JlYXRpb25GbGFncworCQkJCSAgICAgICAmdWxUaHJlYWRJREpvYlJlYWR5KTsJLy8gTFBEV09SRCBscFRocmVhZElkCisKKwlwU2hiTWVtSW5zdC0+bV9oVGhyZWFkSm9iUmVhZHkgPSBoVGhyZWFkSm9iUmVhZHk7CisJQVNTRVJUKHBTaGJNZW1JbnN0LT5tX2hUaHJlYWRKb2JSZWFkeSAhPSBOVUxMKTsKKworI2lmbmRlZiBOREVCVUcKKwl7CisJCXBTaGJNZW1JbnN0LT5tX3VsVGhyZWFkSURKb2JSZWFkeSA9IHVsVGhyZWFkSURKb2JSZWFkeTsKKwl9CisjZW5kaWYKKworICAgICAgRXhpdDoKKworCXJldHVybiAoU2hiRXJyb3IpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgU2lnbmFsIGpvYiByZWFkeSAoY2FsbGVkIGZyb20gZXhlY3V0aW5nIHByb2Nlc3MpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdFNoYkVycm9yIFNoYklwY1NpZ25hbEpvYlJlYWR5KHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCkKK3sKKworCXRTaGJNZW1JbnN0ICpwU2hiTWVtSW5zdDsKKwlIQU5ETEUgaEV2ZW50Sm9iUmVhZHk7CisJQk9PTCBmUmVzOworCisJLy8gVFJBQ0UwKCJcblNoYklwY1NpZ25hbEpvYlJlYWR5KCk6IGVudGVyXG4iKTsKKworCWlmIChwU2hiSW5zdGFuY2VfcCA9PSBOVUxMKSB7CisJCXJldHVybiAoa1NoYkludmFsaWRBcmcpOworCX0KKworCXBTaGJNZW1JbnN0ID0gU2hiSXBjR2V0U2hiTWVtSW5zdChwU2hiSW5zdGFuY2VfcCk7CisKKwlBU1NFUlQocFNoYk1lbUluc3QtPm1faEV2ZW50Sm9iUmVhZHkgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpOworCWhFdmVudEpvYlJlYWR5ID0gcFNoYk1lbUluc3QtPm1faEV2ZW50Sm9iUmVhZHk7CisJaWYgKGhFdmVudEpvYlJlYWR5ICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisJCWZSZXMgPSBTZXRFdmVudChoRXZlbnRKb2JSZWFkeSk7CisJCS8vIFRSQUNFMSgiXG5TaGJJcGNTaWduYWxKb2JSZWFkeSgpOiBFdmVudEpvYlJlYWR5IHNldCAoUmVzdWx0PSVkKVxuIiwgKGludClmUmVzKTsKKwkJQVNTRVJUKGZSZXMpOworCX0KKwkvLyBUUkFDRTAoIlxuU2hiSXBjU2lnbmFsSm9iUmVhZHkoKTogbGVhdmVcbiIpOworCXJldHVybiAoa1NoYk9rKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEdldCBwb2ludGVyIHRvIGNvbW1vbiB1c2VkIHNoYXJlIG1lbW9yeSBhcmVhCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdm9pZCAqU2hiSXBjR2V0U2hNZW1QdHIodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKQoreworCisJdFNoYk1lbUhlYWRlciAqcFNoYk1lbUhlYWRlcjsKKwl2b2lkICpwU2hiU2hNZW1QdHI7CisKKwlwU2hiTWVtSGVhZGVyID0gU2hiSXBjR2V0U2hiTWVtSGVhZGVyKHBTaGJJbnN0YW5jZV9wKTsKKwlpZiAocFNoYk1lbUhlYWRlciAhPSBOVUxMKSB7CisJCXBTaGJTaE1lbVB0ciA9IChCWVRFICopIHBTaGJNZW1IZWFkZXIgKyBzaXplb2YodFNoYk1lbUhlYWRlcik7CisJfSBlbHNlIHsKKwkJcFNoYlNoTWVtUHRyID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gKHBTaGJTaE1lbVB0cik7CisKK30KKworI2VuZGlmCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgUCBSIEkgViBBIFQgRSAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworCisjaWYgIWRlZmluZWQoU0hCSVBDX0lOTElORV9FTkFCTEVEKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEFsbG9jYXRlIGEgbWVtb3J5IGJsb2NrIGZyb20gcHJvY2VzcyBzcGVjaWZpYyBtZW1wb29sCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCAqU2hiSXBjQWxsb2NQcml2YXRlTWVtKHVuc2lnbmVkIGxvbmcgdWxNZW1TaXplX3ApCit7CisKKwlIR0xPQkFMIGhNZW07CisJdm9pZCAqcE1lbTsKKworCWhNZW0gPSBHbG9iYWxBbGxvYyhHTUVNX0ZJWEVELCB1bE1lbVNpemVfcCArIHNpemVvZihIR0xPQkFMKSk7CisJcE1lbSA9IEdsb2JhbExvY2soaE1lbSk7CisJaWYgKHBNZW0gIT0gTlVMTCkgeworCQkqKEhHTE9CQUwgKikgcE1lbSA9IGhNZW07CisJCShCWVRFICopIHBNZW0gKz0gc2l6ZW9mKEhHTE9CQUwpOworCX0KKworI2lmbmRlZiBOREVCVUcKKwl7CisJCW1lbXNldChwTWVtLCAweGFhLCB1bE1lbVNpemVfcCk7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gKHBNZW0pOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgUmVsZWFzZSBhIG1lbW9yeSBibG9jayBmcm9tIHByb2Nlc3Mgc3BlY2lmaWMgbWVtcG9vbAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgU2hiSXBjUmVsZWFzZVByaXZhdGVNZW0odm9pZCAqcE1lbV9wKQoreworCisJSEdMT0JBTCBoTWVtOworCisJaWYgKHBNZW1fcCA9PSBOVUxMKSB7CisJCXJldHVybjsKKwl9CisKKwkoQllURSAqKSBwTWVtX3AgLT0gc2l6ZW9mKEhHTE9CQUwpOworCWhNZW0gPSAqKEhHTE9CQUwgKikgcE1lbV9wOworCisJR2xvYmFsVW5sb2NrKGhNZW0pOworCUdsb2JhbEZyZWUoaE1lbSk7CisKKwlyZXR1cm47CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBDcmVhdGUgdW5pZm9ybSBvYmplY3QgbmFtZSAobmVlZGVkIGZvciBpbnRlci1wcm9jZXNzIGNvbW11bmljYXRpb24pCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjb25zdCBjaGFyICpTaGJJcGNHZXRVbmlmb3JtT2JqZWN0TmFtZShjb25zdCBjaGFyICpwc3pPYmplY3RKb2JOYW1lX3AsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKnBzekJ1ZmZlcklEX3AsCisJCQkJICAgICAgIEJPT0wgZkdsb2JhbE9iamVjdF9wKQoreworCisJc3RhdGljIGNoYXIgc3pPYmplY3ROYW1lW01BWF9QQVRIXTsKKwljaGFyIHN6T2JqZWN0UHJlZml4W01BWF9QQVRIXTsKKworCWlmIChmR2xvYmFsT2JqZWN0X3ApIHsKKwkJc3RybmNweShzek9iamVjdFByZWZpeCwgIkdsb2JhbFxcIiwgc2l6ZW9mKHN6T2JqZWN0UHJlZml4KSk7CisJfSBlbHNlIHsKKwkJX3NucHJpbnRmKHN6T2JqZWN0UHJlZml4LCBzaXplb2Yoc3pPYmplY3RQcmVmaXgpLCAiUElEJTA4bFhfIiwKKwkJCSAgKHVuc2lnbmVkIGxvbmcpR2V0Q3VycmVudFByb2Nlc3NJZCgpKTsKKwl9CisKKwlfc25wcmludGYoc3pPYmplY3ROYW1lLCBzaXplb2Yoc3pPYmplY3ROYW1lKSwgIiVzJXMjJXMiLAorCQkgIHN6T2JqZWN0UHJlZml4LCBwc3pCdWZmZXJJRF9wLCBwc3pPYmplY3RKb2JOYW1lX3ApOworCisJcmV0dXJuIChzek9iamVjdE5hbWUpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgVGhyZWFkIGZvciBuZXcgZGF0YSBzaWduYWxpbmcKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0RXT1JEIFdJTkFQSSBTaGJJcGNUaHJlYWRTaWduYWxOZXdEYXRhKExQVk9JRCBwdlRocmVhZFBhcmFtX3ApCit7CisKKwl0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlOworCXRTaGJNZW1JbnN0ICpwU2hiTWVtSW5zdDsKKwlEV09SRCBkd1dhaXRSZXN1bHQ7CisJQk9PTCBmVGVybVJlcXU7CisJaW50IGZDYWxsQWdhaW47CisKKwlUUkFDRTEKKwkgICAgKCJcblNoYklwY1RocmVhZFNpZ25hbE5ld0RhdGEoKTogU2lnbmFsVGhyZWFkIHN0YXJ0ZWQgKHBTaGJJbnN0YW5jZT0weCUwOGxYKVxuIiwKKwkgICAgIChEV09SRCkgcHZUaHJlYWRQYXJhbV9wKTsKKworCXBTaGJJbnN0YW5jZSA9ICh0U2hiTWVtSW5zdCAqKSBwdlRocmVhZFBhcmFtX3A7CisJcFNoYk1lbUluc3QgPSBTaGJJcGNHZXRTaGJNZW1JbnN0KHBTaGJJbnN0YW5jZSk7CisJZlRlcm1SZXF1ID0gRkFMU0U7CisKKwlkbyB7CisJCUFTU0VSVCgocFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbMF0gIT0KKwkJCUlOVkFMSURfSEFORExFX1ZBTFVFKQorCQkgICAgICAgJiYgKHBTaGJNZW1JbnN0LT5tX2FoRXZlbnROZXdEYXRhWzBdICE9IE5VTEwpKTsKKwkJQVNTRVJUKChwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVsxXSAhPQorCQkJSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisJCSAgICAgICAmJiAocFNoYk1lbUluc3QtPm1fYWhFdmVudE5ld0RhdGFbMV0gIT0gTlVMTCkpOworCisJCVRSQUNFMCgiXG5TaGJJcGNUaHJlYWRTaWduYWxOZXdEYXRhKCk6IGVudGVyIHdhaXQgc3RhdGUiKTsKKwkJZHdXYWl0UmVzdWx0ID0gV2FpdEZvck11bHRpcGxlT2JqZWN0cygyLAkvLyBEV09SRCBuQ291bnQKKwkJCQkJCSAgICAgIHBTaGJNZW1JbnN0LT5tX2FoRXZlbnROZXdEYXRhLAkvLyBjb25zdCBIQU5ETEUqIGxwSGFuZGxlcworCQkJCQkJICAgICAgRkFMU0UsCS8vIEJPT0wgYldhaXRBbGwKKwkJCQkJCSAgICAgIElORklOSVRFKTsJLy8gRFdPUkQgZHdNaWxsaXNlY29uZHMKKwkJVFJBQ0UwCisJCSAgICAoIlxuU2hiSXBjVGhyZWFkU2lnbmFsTmV3RGF0YSgpOiB3YWl0IHN0YXRlIGxlYXZlZDogLS0tPiAiKTsKKwkJc3dpdGNoIChkd1dhaXRSZXN1bHQpIHsKKwkJY2FzZSBXQUlUX09CSkVDVF8wICsgMDoJLy8gZXZlbnQgIm5ldyBkYXRhIgorCQkJeworCQkJCVRSQUNFMCgiRXZlbnQgPSBXQUlUX09CSkVDVF8wKzAiKTsKKwkJCQlpZiAocFNoYk1lbUluc3QtPm1fcGZuU2lnSG5kbHJOZXdEYXRhICE9IE5VTEwpIHsKKwkJCQkJVFJBQ0UwCisJCQkJCSAgICAoIlxuU2hiSXBjVGhyZWFkU2lnbmFsTmV3RGF0YSgpOiBjYWxsaW5nIFNpZ25hbEhhbmRsZXJOZXdEYXRhIik7CisJCQkJCWRvIHsKKwkJCQkJCWZDYWxsQWdhaW4gPQorCQkJCQkJICAgIHBTaGJNZW1JbnN0LT4KKwkJCQkJCSAgICBtX3BmblNpZ0huZGxyTmV3RGF0YQorCQkJCQkJICAgIChwU2hiSW5zdGFuY2UpOworCQkJCQkJLy8gZC5rLjogdHJ5IHRvIHJ1biBhbnkgc2hhcmVkIGJ1ZmZlciB3aGljaCBoYXMgaGlnaGVyIHByaW9yaXR5LgorCQkJCQkJLy8gICAgICAgICAgIHVuZGVyIFdpbmRvd3MgdGhpcyBpcyBub3QgcmVhbGx5IG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBXaW5kb3dzIHNjaGVkdWxlcgorCQkJCQkJLy8gICAgICAgICAgIGFscmVhZHkgcHJlZW1wdHMgdGFza3Mgd2l0aCBsb3dlciBwcmlvcml0eS4KKwkJCQkJfSB3aGlsZSAoZkNhbGxBZ2FpbiAhPSBGQUxTRSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCWNhc2UgV0FJVF9PQkpFQ1RfMCArIDE6CS8vIGV2ZW50ICJ0ZXJtaW5hdGUiCisJCQl7CisJCQkJVFJBQ0UwKCJFdmVudCA9IFdBSVRfT0JKRUNUXzArMSIpOworCQkJCWZUZXJtUmVxdSA9IFRSVUU7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJZGVmYXVsdDoKKwkJCXsKKwkJCQlUUkFDRTAoIlVuaGFuZGxlZCBFdmVudCIpOworCQkJCUFTU0VSVCgwKTsKKwkJCQlmVGVybVJlcXUgPSBUUlVFOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCXdoaWxlICghZlRlcm1SZXF1KTsKKworCWlmIChwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVtJRFhfRVZFTlRfVEVSTV9SRVNQXSAhPQorCSAgICBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworCQlTZXRFdmVudChwU2hiTWVtSW5zdC0+bV9haEV2ZW50TmV3RGF0YVtJRFhfRVZFTlRfVEVSTV9SRVNQXSk7CisJfQorCisJVFJBQ0UxCisJICAgICgiXG5TaGJJcGNUaHJlYWRTaWduYWxOZXdEYXRhKCk6IFNpZ25hbFRocmVhZCB0ZXJtaW5hdGVkIChwU2hiSW5zdGFuY2U9MHglMDhsWClcbiIsCisJICAgICAoRFdPUkQpIHBTaGJJbnN0YW5jZSk7CisKKwlFeGl0VGhyZWFkKDApOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgVGhyZWFkIGZvciBuZXcgZGF0YSBzaWduYWxpbmcKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0RXT1JEIFdJTkFQSSBTaGJJcGNUaHJlYWRTaWduYWxKb2JSZWFkeShMUFZPSUQgcHZUaHJlYWRQYXJhbV9wKQoreworCisJdFNoYkluc3RhbmNlICpwU2hiSW5zdGFuY2U7CisJdFNoYk1lbUluc3QgKnBTaGJNZW1JbnN0OworCURXT1JEIHVsVGltZU91dDsKKwlEV09SRCBkd1dhaXRSZXN1bHQ7CisJdW5zaWduZWQgaW50IGZUaW1lT3V0OworCisJVFJBQ0UxCisJICAgICgiXG5TaGJJcGNUaHJlYWRTaWduYWxKb2JSZWFkeSgpOiBTaWduYWxUaHJlYWQgc3RhcnRlZCAocFNoYkluc3RhbmNlPTB4JTA4bFgpXG4iLAorCSAgICAgKERXT1JEKSBwdlRocmVhZFBhcmFtX3ApOworCisJcFNoYkluc3RhbmNlID0gKHRTaGJJbnN0YW5jZSAqKSBwdlRocmVhZFBhcmFtX3A7CisJcFNoYk1lbUluc3QgPSBTaGJJcGNHZXRTaGJNZW1JbnN0KHBTaGJJbnN0YW5jZSk7CisJZlRpbWVPdXQgPSBGQUxTRTsKKworCWlmIChwU2hiTWVtSW5zdC0+bV91bFRpbWVPdXRKb2JSZWFkeSAhPSAwKSB7CisJCXVsVGltZU91dCA9IHBTaGJNZW1JbnN0LT5tX3VsVGltZU91dEpvYlJlYWR5OworCX0gZWxzZSB7CisJCXVsVGltZU91dCA9IElORklOSVRFOworCX0KKworCUFTU0VSVCgocFNoYk1lbUluc3QtPm1faEV2ZW50Sm9iUmVhZHkgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisJICAgICAgICYmIChwU2hiTWVtSW5zdC0+bV9oRXZlbnRKb2JSZWFkeSAhPSBOVUxMKSk7CisKKwlUUkFDRTAoIlxuU2hiSXBjVGhyZWFkU2lnbmFsSm9iUmVhZHkoKTogZW50ZXIgd2FpdCBzdGF0ZSIpOworCWR3V2FpdFJlc3VsdCA9IFdhaXRGb3JTaW5nbGVPYmplY3QocFNoYk1lbUluc3QtPm1faEV2ZW50Sm9iUmVhZHksCS8vIEhBTkRMRSBoSGFuZGxlCisJCQkJCSAgIHVsVGltZU91dCk7CS8vIERXT1JEIGR3TWlsbGlzZWNvbmRzCisJVFJBQ0UwKCJcblNoYklwY1RocmVhZFNpZ25hbEpvYlJlYWR5KCk6IHdhaXQgc3RhdGUgbGVhdmVkOiAtLS0+ICIpOworCXN3aXRjaCAoZHdXYWl0UmVzdWx0KSB7CisJY2FzZSBXQUlUX09CSkVDVF8wICsgMDoJLy8gZXZlbnQgIm5ldyBkYXRhIgorCQl7CisJCQlUUkFDRTAoIkV2ZW50ID0gV0FJVF9PQkpFQ1RfMCswIik7CisJCQlmVGltZU91dCA9IEZBTFNFOworCQkJYnJlYWs7CisJCX0KKworCWNhc2UgV0FJVF9USU1FT1VUOgorCQl7CisJCQlUUkFDRTAoIlxuRXZlbnQgPSBXQUlUX1RJTUVPVVQiKTsKKwkJCWZUaW1lT3V0ID0gVFJVRTsKKwkJCS8vIEFTU0VSVCgwKTsKKwkJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQl7CisJCQlUUkFDRTAoIlVuaGFuZGxlZCBFdmVudCIpOworCQkJZlRpbWVPdXQgPSBUUlVFOworCQkJQVNTRVJUKDApOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAocFNoYk1lbUluc3QtPm1fcGZuU2lnSG5kbHJKb2JSZWFkeSAhPSBOVUxMKSB7CisJCVRSQUNFMAorCQkgICAgKCJcblNoYklwY1RocmVhZFNpZ25hbEpvYlJlYWR5KCk6IGNhbGxpbmcgU2lnbmFsSGFuZGxlckpvYlJlYWR5Iik7CisJCXBTaGJNZW1JbnN0LT5tX3BmblNpZ0huZGxySm9iUmVhZHkocFNoYkluc3RhbmNlLCBmVGltZU91dCk7CisJfQorCisJcFNoYk1lbUluc3QtPm1faFRocmVhZEpvYlJlYWR5ID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisJcFNoYk1lbUluc3QtPm1fcGZuU2lnSG5kbHJKb2JSZWFkeSA9IE5VTEw7CisKKwlUUkFDRTEKKwkgICAgKCJcblNoYklwY1RocmVhZFNpZ25hbEpvYlJlYWR5KCk6IFNpZ25hbFRocmVhZCB0ZXJtaW5hdGVkIChwU2hiSW5zdGFuY2U9MHglMDhsWClcbiIsCisJICAgICAoRFdPUkQpIHBTaGJJbnN0YW5jZSk7CisKKwlFeGl0VGhyZWFkKDApOworCit9CisKKyNlbmRpZgorCisvLyBFT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvU2hiSXBjLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL1NoYklwYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZDg4NDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL1NoYklwYy5oCkBAIC0wLDAgKzEsMTI1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgUHJvamVjdCBpbmRlcGVuZGVuZCBzaGFyZWQgYnVmZmVyIChsaW5lYXIgKyBjaXJjdWxhcikKKworICBEZXNjcmlwdGlvbjogIERlY2xhcmF0aW9uIG9mIHBsYXRmb3JtIHNwZWNpZmljIHBhcnQgZm9yIHRoZQorICAgICAgICAgICAgICAgIHNoYXJlZCBidWZmZXIKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAyMDA2LzA2LzI3IC1yczogICBWIDEuMDAgKGluaXRpYWwgdmVyc2lvbikKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfU0hCSVBDX0hfCisjZGVmaW5lIF9TSEJJUENfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBUeXBlIGRlZmluaXRpb25zCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIGludCAoKnRTaWdIbmRsck5ld0RhdGEpICh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApOwordHlwZWRlZiB2b2lkICgqdFNpZ0huZGxySm9iUmVhZHkpICh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3AsCisJCQkJICAgdW5zaWduZWQgaW50IGZUaW1lT3V0X3ApOworCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1dJTjMyXykKKyNpZiBkZWZpbmVkKElOTElORV9GVU5DVElPTl9ERUYpCisjdW5kZWYgIElOTElORV9GVU5DVElPTgorI2RlZmluZSBJTkxJTkVfRlVOQ1RJT04gICAgIElOTElORV9GVU5DVElPTl9ERUYKKyNkZWZpbmUgU0hCSVBDX0lOTElORV9FTkFCTEVEICAgICAgVFJVRQorI2RlZmluZSBTSEJJUENfSU5MSU5FRAorI2luY2x1ZGUgIlNoYklwYy1XaW4zMi5jIgorI2VuZGlmCisKKyNlbGlmIChUQVJHRVRfU1lTVEVNID09IF9MSU5VWF8pCisjaWYgZGVmaW5lZChJTkxJTkVfRlVOQ1RJT05fREVGKQorI3VuZGVmICBJTkxJTkVfRlVOQ1RJT04KKyNkZWZpbmUgSU5MSU5FX0ZVTkNUSU9OICAgICBJTkxJTkVfRlVOQ1RJT05fREVGCisjZGVmaW5lIFNIQklQQ19JTkxJTkVfRU5BQkxFRCAgICAgIFRSVUUKKyNkZWZpbmUgU0hCSVBDX0lOTElORUQKKyNpbmNsdWRlICJTaGJJcGMtTGludXhLZXJuZWwuYyIKKyNlbmRpZgorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgUHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordFNoYkVycm9yIFNoYklwY0luaXQodm9pZCk7Cit0U2hiRXJyb3IgU2hiSXBjRXhpdCh2b2lkKTsKKwordFNoYkVycm9yIFNoYklwY0FsbG9jQnVmZmVyKHVuc2lnbmVkIGxvbmcgdWxCdWZmZXJTaXplX3AsCisJCQkgICAgY29uc3QgY2hhciAqcHN6QnVmZmVySURfcCwKKwkJCSAgICB0U2hiSW5zdGFuY2UgKiBwcFNoYkluc3RhbmNlX3AsCisJCQkgICAgdW5zaWduZWQgaW50ICpwZlNoYk5ld0NyZWF0ZWRfcCk7Cit0U2hiRXJyb3IgU2hiSXBjUmVsZWFzZUJ1ZmZlcih0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApOworCisjaWYgIWRlZmluZWQoU0hCSVBDX0lOTElORV9FTkFCTEVEKQorCit0U2hiRXJyb3IgU2hiSXBjRW50ZXJBdG9taWNTZWN0aW9uKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCk7Cit0U2hiRXJyb3IgU2hiSXBjTGVhdmVBdG9taWNTZWN0aW9uKHRTaGJJbnN0YW5jZSBwU2hiSW5zdGFuY2VfcCk7CisKK3RTaGJFcnJvciBTaGJJcGNTdGFydFNpZ25hbGluZ05ld0RhdGEodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wLAorCQkJCSAgICAgIHRTaWdIbmRsck5ld0RhdGEKKwkJCQkgICAgICBwZm5TaWduYWxIYW5kbGVyTmV3RGF0YV9wLAorCQkJCSAgICAgIHRTaGJQcmlvcml0eSBTaGJQcmlvcml0eV9wKTsKK3RTaGJFcnJvciBTaGJJcGNTdG9wU2lnbmFsaW5nTmV3RGF0YSh0U2hiSW5zdGFuY2UgcFNoYkluc3RhbmNlX3ApOwordFNoYkVycm9yIFNoYklwY1NpZ25hbE5ld0RhdGEodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKTsKKwordFNoYkVycm9yIFNoYklwY1N0YXJ0U2lnbmFsaW5nSm9iUmVhZHkodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHVsVGltZU91dF9wLAorCQkJCSAgICAgICB0U2lnSG5kbHJKb2JSZWFkeQorCQkJCSAgICAgICBwZm5TaWduYWxIYW5kbGVySm9iUmVhZHlfcCk7Cit0U2hiRXJyb3IgU2hiSXBjU2lnbmFsSm9iUmVhZHkodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKTsKKwordm9pZCAqU2hiSXBjR2V0U2hNZW1QdHIodFNoYkluc3RhbmNlIHBTaGJJbnN0YW5jZV9wKTsKKyNlbmRpZgorCisjdW5kZWYgIFNIQklQQ19JTkxJTkVfRU5BQkxFRAkvLyBkaXNhYmxlIGFjdHVhbCBpbmxpbmluZyBvZiBmdW5jdGlvbnMKKyN1bmRlZiAgSU5MSU5FX0ZVTkNUSU9OCisjZGVmaW5lIElOTElORV9GVU5DVElPTgkJLy8gZGVmaW5lIElOTElORV9GVU5DVElPTiB0byBub3RoaW5nCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9TSEJJUENfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvU2hiTGludXhLZXJuZWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvU2hiTGludXhLZXJuZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTI3MDJhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9TaGJMaW51eEtlcm5lbC5oCkBAIC0wLDAgKzEsNjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBQcm9qZWN0IGluZGVwZW5kZW5kIHNoYXJlZCBidWZmZXIgKGxpbmVhciArIGNpcmN1bGFyKQorCisgIERlc2NyaXB0aW9uOiAgRGVjbGFyYXRpb24gb2YgcGxhdGZvcm0gc3BlY2lmaWMgcGFydCBmb3IgdGhlCisgICAgICAgICAgICAgICAgc2hhcmVkIGJ1ZmZlcgorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIDIwMDYvMDcvMjAgLXJzOiAgIFYgMS4wMCAoaW5pdGlhbCB2ZXJzaW9uKQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9TSEJMSU5VWEtFUk5FTF9IXworI2RlZmluZSBfU0hCTElOVVhLRVJORUxfSF8KKworc3RydWN0IHNTaGJNZW1UYWJsZSB7CisJaW50IG1faUJ1ZmZlcklkOworCXZvaWQgKm1fcEJ1ZmZlcjsKKwlzdHJ1Y3Qgc1NoYk1lbVRhYmxlICptX3BzTmV4dE1lbVRhYmxlRWxlbWVudDsKK307CisKK2V4dGVybiBzdHJ1Y3Qgc1NoYk1lbVRhYmxlICpwc01lbVRhYmxlRWxlbWVudEZpcnN0X2c7CisKKyNlbmRpZiAvLyBfU0hCTElOVVhLRVJORUxfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvU29ja2V0TGludXhLZXJuZWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvU29ja2V0TGludXhLZXJuZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjJiYzRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9Tb2NrZXRMaW51eEtlcm5lbC5jCkBAIC0wLDAgKzEsMTk3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgV3JhcHBlciBmb3IgQlNEIHNvY2tldCBBUEkgZm9yIExpbnV4IGtlcm5lbAorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IFNvY2tldExpbnV4S2VybmVsLmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgRGV2IEMrKyBhbmQgR05VLUNvbXBpbGVyIGZvciBtNjhrCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wOC8yNSBkLmsuOiAgIHN0YXJ0IG9mIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgIlNvY2tldExpbnV4S2VybmVsLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWxlIHZhcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEtlcm5lbCBNb2R1bGUgc3BlY2lmaWMgRGF0YSBTdHJ1Y3R1cmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjoKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6CisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NPQ0tFVCBzb2NrZXQoaW50IGFmLCBpbnQgdHlwZSwgaW50IHByb3RvY29sKQoreworCWludCByYzsKKwlTT0NLRVQgc29ja2V0OworCisJcmMgPSBzb2NrX2NyZWF0ZV9rZXJuKGFmLCB0eXBlLCBwcm90b2NvbCwgJnNvY2tldCk7CisJaWYgKHJjIDwgMCkgeworCQlzb2NrZXQgPSBOVUxMOworCQlnb3RvIEV4aXQ7CisJfQorCisgICAgICBFeGl0OgorCXJldHVybiBzb2NrZXQ7Cit9CisKK2ludCBiaW5kKFNPQ0tFVCBzb2NrZXRfcCwgY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyLCBpbnQgYWRkcmxlbikKK3sKKwlpbnQgcmM7CisKKwlyYyA9IHNvY2tldF9wLT5vcHMtPmJpbmQoc29ja2V0X3AsIChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyLCBhZGRybGVuKTsKKworCXJldHVybiByYzsKK30KKworaW50IGNsb3Nlc29ja2V0KFNPQ0tFVCBzb2NrZXRfcCkKK3sKKwlzb2NrX3JlbGVhc2Uoc29ja2V0X3ApOworCisJcmV0dXJuIDA7Cit9CisKK2ludCByZWN2ZnJvbShTT0NLRVQgc29ja2V0X3AsIGNoYXIgKmJ1ZiwgaW50IGxlbiwgaW50IGZsYWdzLAorCSAgICAgc3RydWN0IHNvY2thZGRyICpmcm9tLCBpbnQgKmZyb21sZW4pCit7CisJaW50IHJjOworCXN0cnVjdCBtc2doZHIgbXNnOworCXN0cnVjdCBrdmVjIGlvdjsKKworCW1zZy5tc2dfY29udHJvbCA9IE5VTEw7CisJbXNnLm1zZ19jb250cm9sbGVuID0gMDsKKwltc2cubXNnX25hbWUgPSBmcm9tOwkvLyB3aWxsIGJlIHN0cnVjdCBzb2NrX2FkZHIKKwltc2cubXNnX25hbWVsZW4gPSAqZnJvbWxlbjsKKwlpb3YuaW92X2xlbiA9IGxlbjsKKwlpb3YuaW92X2Jhc2UgPSBidWY7CisKKwlyYyA9IGtlcm5lbF9yZWN2bXNnKHNvY2tldF9wLCAmbXNnLCAmaW92LCAxLCBpb3YuaW92X2xlbiwgMCk7CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBzZW5kdG8oU09DS0VUIHNvY2tldF9wLCBjb25zdCBjaGFyICpidWYsIGludCBsZW4sIGludCBmbGFncywKKwkgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnRvLCBpbnQgdG9sZW4pCit7CisJaW50IHJjOworCXN0cnVjdCBtc2doZHIgbXNnOworCXN0cnVjdCBrdmVjIGlvdjsKKworCW1zZy5tc2dfY29udHJvbCA9IE5VTEw7CisJbXNnLm1zZ19jb250cm9sbGVuID0gMDsKKwltc2cubXNnX25hbWUgPSAoc3RydWN0IHNvY2thZGRyICopdG87CS8vIHdpbGwgYmUgc3RydWN0IHNvY2tfYWRkcgorCW1zZy5tc2dfbmFtZWxlbiA9IHRvbGVuOworCW1zZy5tc2dfZmxhZ3MgPSAwOworCWlvdi5pb3ZfbGVuID0gbGVuOworCWlvdi5pb3ZfYmFzZSA9IChjaGFyICopYnVmOworCisJcmMgPSBrZXJuZWxfc2VuZG1zZyhzb2NrZXRfcCwgJm1zZywgJmlvdiwgMSwgbGVuKTsKKworCXJldHVybiByYzsKK30KKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL1NvY2tldExpbnV4S2VybmVsLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL1NvY2tldExpbnV4S2VybmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUxZDYxOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvU29ja2V0TGludXhLZXJuZWwuaApAQCAtMCwwICsxLDEwNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgQlNEIHNvY2tldCBBUEkgZm9yIExpbnV4IGtlcm5lbAorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IFNvY2tldExpbnV4S2VybmVsLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgS0VJTCB1VmlzaW9uIDIKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA4LzI1IGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1NPQ0tFVExJTlVYS0VSTkVMX0hfCisjZGVmaW5lIF9TT0NLRVRMSU5VWEtFUk5FTF9IXworCisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgSU5WQUxJRF9TT0NLRVQgIDAKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IHNvY2tldCAqU09DS0VUOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IGJpbmQoU09DS0VUIHMsIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkciwgaW50IGFkZHJsZW4pOworCitpbnQgY2xvc2Vzb2NrZXQoU09DS0VUIHMpOworCitpbnQgcmVjdmZyb20oU09DS0VUIHMsIGNoYXIgKmJ1ZiwgaW50IGxlbiwgaW50IGZsYWdzLCBzdHJ1Y3Qgc29ja2FkZHIgKmZyb20sCisJICAgICBpbnQgKmZyb21sZW4pOworCitpbnQgc2VuZHRvKFNPQ0tFVCBzLCBjb25zdCBjaGFyICpidWYsIGludCBsZW4sIGludCBmbGFncywKKwkgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnRvLCBpbnQgdG9sZW4pOworCitTT0NLRVQgc29ja2V0KGludCBhZiwgaW50IHR5cGUsIGludCBwcm90b2NvbCk7CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9TT0NLRVRMSU5VWEtFUk5FTF9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9UaW1lckhpZ2hSZXNrWDg2LmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL1RpbWVySGlnaFJlc2tYODYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmVlZTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9UaW1lckhpZ2hSZXNrWDg2LmMKQEAgLTAsMCArMSw1MjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICB0YXJnZXQgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YKKyAgICAgICAgICAgICAgICBoaWdoIHJlc29sdXRpb24gdGltZXIgbW9kdWxlIGZvciBYODYgdW5kZXIgTGludXgKKyAgICAgICAgICAgICAgICBUaGUgTGludXgga2VybmVsIGhhcyB0byBiZSBjb21waWxlZCB3aXRoIGhpZ2ggcmVzb2x1dGlvbgorICAgICAgICAgICAgICAgIHRpbWVycyBlbmFibGVkLiBUaGlzIGlzIGRvbmUgYnkgY29uZmlndXJpbmcgdGhlIGtlcm5lbAorICAgICAgICAgICAgICAgIHdpdGggQ09ORklHX0hJR0hfUkVTX1RJTUVSUyBlbmFibGVkLgorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IFRpbWVySGlnaFJlc2tYODYuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozODowMSAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR05VCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJFcGxJbmMuaCIKKyNpbmNsdWRlICJrZXJuZWwvRXBsVGltZXJIaWdoUmVzay5oIgorI2luY2x1ZGUgIkJlbmNobWFyay5oIgorCisvLyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIFRJTUVSX0NPVU5UICAgICAgICAgICAyCS8qIG1heCAxNSB0aW1lcnMgc2VsZWN0YWJsZSAqLworI2RlZmluZSBUSU1FUl9NSU5fVkFMX1NJTkdMRSAgNTAwMAkvKiBtaW4gNXVzICovCisjZGVmaW5lIFRJTUVSX01JTl9WQUxfQ1lDTEUgICAxMDAwMDAJLyogbWluIDEwMHVzICovCisKKyNkZWZpbmUgUFJPVkVfT1ZFUlJVTgorCisjaWZuZGVmIENPTkZJR19ISUdIX1JFU19USU1FUlMKKyNlcnJvciAiS2VybmVsIHN5bWJvbCBDT05GSUdfSElHSF9SRVNfVElNRVJTIGlzIHJlcXVpcmVkLiIKKyNlbmRpZgorCisvLyBUcmFjZVBvaW50IHN1cHBvcnQgZm9yIHJlYWx0aW1lLWRlYnVnZ2luZworI2lmZGVmIF9EQkdfVFJBQ0VfUE9JTlRTXwordm9pZCBQVUJMSUMgVGd0RGJnU2lnbmFsVHJhY2VQb2ludChCWVRFIGJUcmFjZVBvaW50TnVtYmVyX3ApOwordm9pZCBQVUJMSUMgVGd0RGJnUG9zdFRyYWNlVmFsdWUoRFdPUkQgZHdUcmFjZVZhbHVlX3ApOworI2RlZmluZSBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVChwKSAgIFRndERiZ1NpZ25hbFRyYWNlUG9pbnQocCkKKyNkZWZpbmUgVEdUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKHYpICAgICBUZ3REYmdQb3N0VHJhY2VWYWx1ZSh2KQorI2Vsc2UKKyNkZWZpbmUgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQocCkKKyNkZWZpbmUgVEdUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKHYpCisjZW5kaWYKKyNkZWZpbmUgSFJUX0RCR19QT1NUX1RSQUNFX1ZBTFVFKEV2ZW50X3AsIHVpTm9kZUlkX3AsIHdFcnJvckNvZGVfcCkgXAorICAgIFRHVF9EQkdfUE9TVF9UUkFDRV9WQUxVRSgoMHhFIDw8IDI4KSB8IChFdmVudF9wIDw8IDI0KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKHVpTm9kZUlkX3AgPDwgMTYpIHwgd0Vycm9yQ29kZV9wKQorCisjZGVmaW5lIFRJTUVSSERMX01BU0sgICAgICAgICAweDBGRkZGRkZGCisjZGVmaW5lIFRJTUVSSERMX1NISUZUICAgICAgICAyOAorI2RlZmluZSBIRExfVE9fSURYKEhkbCkgICAgICAgKChIZGwgPj4gVElNRVJIRExfU0hJRlQpIC0gMSkKKyNkZWZpbmUgSERMX0lOSVQoSWR4KSAgICAgICAgICgoSWR4ICsgMSkgPDwgVElNRVJIRExfU0hJRlQpCisjZGVmaW5lIEhETF9JTkMoSGRsKSAgICAgICAgICAoKChIZGwgKyAxKSAmIFRJTUVSSERMX01BU0spIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChIZGwgJiB+VElNRVJIRExfTUFTSykpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtb2R1bCBnbG9iYWwgdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IHsKKwl0RXBsVGltZXJFdmVudEFyZyBtX0V2ZW50QXJnOworCXRFcGxUaW1lcmtDYWxsYmFjayBtX3BmbkNhbGxiYWNrOworCXN0cnVjdCBocnRpbWVyIG1fVGltZXI7CisJQk9PTCBtX2ZDb250aW51b3VzbHk7CisJdW5zaWduZWQgbG9uZyBsb25nIG1fdWxsUGVyaW9kOworCit9IHRFcGxUaW1lckhpZ2hSZXNrVGltZXJJbmZvOworCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbFRpbWVySGlnaFJlc2tUaW1lckluZm8gbV9hVGltZXJJbmZvW1RJTUVSX0NPVU5UXTsKKworfSB0RXBsVGltZXJIaWdoUmVza0luc3RhbmNlOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHRFcGxUaW1lckhpZ2hSZXNrSW5zdGFuY2UgRXBsVGltZXJIaWdoUmVza0luc3RhbmNlX2w7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitlbnVtIGhydGltZXJfcmVzdGFydCBFcGxUaW1lckhpZ2hSZXNrQ2FsbGJhY2soc3RydWN0IGhydGltZXIgKnBUaW1lcl9wKTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEVwbFRpbWVySGlnaFJlc2tJbml0KCkKKy8vCisvLyBEZXNjcmlwdGlvbjogaW5pdGlhbGl6ZXMgdGhlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lciBtb2R1bGUuCisvLworLy8gUGFyYW1ldGVyczogIHZvaWQKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJIaWdoUmVza0luaXQodm9pZCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKworCVJldCA9IEVwbFRpbWVySGlnaFJlc2tBZGRJbnN0YW5jZSgpOworCisJcmV0dXJuIFJldDsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxUaW1lckhpZ2hSZXNrQWRkSW5zdGFuY2UoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBpbml0aWFsaXplcyB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyIG1vZHVsZS4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdm9pZAorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lckhpZ2hSZXNrQWRkSW5zdGFuY2Uodm9pZCkKK3sKKwl0RXBsS2VybmVsIFJldDsKKwl1bnNpZ25lZCBpbnQgdWlJbmRleDsKKworCVJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJRVBMX01FTVNFVCgmRXBsVGltZXJIaWdoUmVza0luc3RhbmNlX2wsIDAsCisJCSAgIHNpemVvZihFcGxUaW1lckhpZ2hSZXNrSW5zdGFuY2VfbCkpOworCisjaWZuZGVmIENPTkZJR19ISUdIX1JFU19USU1FUlMKKwlwcmludGsKKwkgICAgKCJFcGxUaW1lckhpZ2hSZXNrOiBLZXJuZWwgc3ltYm9sIENPTkZJR19ISUdIX1JFU19USU1FUlMgaXMgcmVxdWlyZWQuXG4iKTsKKwlSZXQgPSBrRXBsTm9SZXNvdXJjZTsKKwlyZXR1cm4gUmV0OworI2VuZGlmCisKKwkvKgorCSAqIEluaXRpYWxpemUgaHJ0aW1lciBzdHJ1Y3R1cmVzIGZvciBhbGwgdXNhYmxlIHRpbWVycy4KKwkgKi8KKwlmb3IgKHVpSW5kZXggPSAwOyB1aUluZGV4IDwgVElNRVJfQ09VTlQ7IHVpSW5kZXgrKykgeworCQl0RXBsVGltZXJIaWdoUmVza1RpbWVySW5mbyAqcFRpbWVySW5mbzsKKwkJc3RydWN0IGhydGltZXIgKnBUaW1lcjsKKworCQlwVGltZXJJbmZvID0gJkVwbFRpbWVySGlnaFJlc2tJbnN0YW5jZV9sLm1fYVRpbWVySW5mb1t1aUluZGV4XTsKKwkJcFRpbWVyID0gJnBUaW1lckluZm8tPm1fVGltZXI7CisJCWhydGltZXJfaW5pdChwVGltZXIsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX0FCUyk7CisKKwkJcFRpbWVyLT5mdW5jdGlvbiA9IEVwbFRpbWVySGlnaFJlc2tDYWxsYmFjazsKKwl9CisKKwlyZXR1cm4gUmV0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBFcGxUaW1lckhpZ2hSZXNrRGVsSW5zdGFuY2UoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBzaHV0cyBkb3duIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIgbW9kdWxlLgorLy8KKy8vIFBhcmFtZXRlcnM6ICB2b2lkCisvLworLy8gUmV0dXJuOiAgICAgIHRFcGxLZXJuZWwgICAgICA9IGVycm9yIGNvZGUKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVySGlnaFJlc2tEZWxJbnN0YW5jZSh2b2lkKQoreworCXRFcGxUaW1lckhpZ2hSZXNrVGltZXJJbmZvICpwVGltZXJJbmZvOworCXRFcGxLZXJuZWwgUmV0OworCXVuc2lnbmVkIGludCB1aUluZGV4OworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlmb3IgKHVpSW5kZXggPSAwOyB1aUluZGV4IDwgVElNRVJfQ09VTlQ7IHVpSW5kZXgrKykgeworCQlwVGltZXJJbmZvID0gJkVwbFRpbWVySGlnaFJlc2tJbnN0YW5jZV9sLm1fYVRpbWVySW5mb1swXTsKKwkJcFRpbWVySW5mby0+bV9wZm5DYWxsYmFjayA9IE5VTEw7CisJCXBUaW1lckluZm8tPm1fRXZlbnRBcmcubV9UaW1lckhkbCA9IDA7CisJCS8qCisJCSAqIEluIHRoaXMgY2FzZSB3ZSBjYW4gbm90IGp1c3QgdHJ5IHRvIGNhbmNlbCB0aGUgdGltZXIuCisJCSAqIFdlIGFjdHVhbGx5IGhhdmUgdG8gd2FpdCB1bnRpbCBpdHMgY2FsbGJhY2sgZnVuY3Rpb24KKwkJICogaGFzIHJldHVybmVkLgorCQkgKi8KKwkJaHJ0aW1lcl9jYW5jZWwoJnBUaW1lckluZm8tPm1fVGltZXIpOworCX0KKworCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsVGltZXJIaWdoUmVza01vZGlmeVRpbWVyTnMoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBtb2RpZmllcyB0aGUgdGltZW91dCBvZiB0aGUgdGltZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGhhbmRsZS4KKy8vICAgICAgICAgICAgICBJZiB0aGUgaGFuZGxlIHRoZSBwb2ludGVyIHBvaW50cyB0byBpcyB6ZXJvLCB0aGUgdGltZXIgbXVzdAorLy8gICAgICAgICAgICAgIGJlIGNyZWF0ZWQgZmlyc3QuCisvLyAgICAgICAgICAgICAgSWYgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHN0b3AgdGhlIG9sZCB0aW1lciwKKy8vICAgICAgICAgICAgICB0aGlzIGZ1bmN0aW9uIGFsd2F5cyBhc3N1cmVzIHRoYXQgdGhlIG9sZCB0aW1lciBkb2VzIG5vdAorLy8gICAgICAgICAgICAgIHRyaWdnZXIgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGggdGhlIHNhbWUgaGFuZGxlIGFzIHRoZSBuZXcKKy8vICAgICAgICAgICAgICB0aW1lci4gVGhhdCBtZWFucyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gbXVzdCBjaGVjayB0aGUgcGFzc2VkCisvLyAgICAgICAgICAgICAgaGFuZGxlIHdpdGggdGhlIG9uZSByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uLiBJZiB0aGVzZSBhcmUKKy8vICAgICAgICAgICAgICB1bmVxdWFsLCB0aGUgY2FsbCBjYW4gYmUgZGlzY2FyZGVkLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwVGltZXJIZGxfcCAgICAgPSBwb2ludGVyIHRvIHRpbWVyIGhhbmRsZQorLy8gICAgICAgICAgICAgIHVsbFRpbWVOc19wICAgICA9IHJlbGF0aXZlIHRpbWVvdXQgaW4gW25zXQorLy8gICAgICAgICAgICAgIHBmbkNhbGxiYWNrX3AgICA9IGNhbGxiYWNrIGZ1bmN0aW9uLCB3aGljaCBpcyBjYWxsZWQgbXV0dWFsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVzaXZlIHdpdGggdGhlIEVkcnYgY2FsbGJhY2sgZnVuY3Rpb25zCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFJ4IGFuZCBUeCkuCisvLyAgICAgICAgICAgICAgdWxBcmd1bWVudF9wICAgID0gdXNlci1zcGVjaWZpYyBhcmd1bWVudAorLy8gICAgICAgICAgICAgIGZDb250aW51b3VzbHlfcCA9IGlmIFRSVUUsIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludW91c2x5OworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSwgaXQgaXMgYSBvbmVzaG90IHRpbWVyLgorLy8KKy8vIFJldHVybjogICAgICB0RXBsS2VybmVsICAgICAgPSBlcnJvciBjb2RlCisvLworLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lckhpZ2hSZXNrTW9kaWZ5VGltZXJOcyh0RXBsVGltZXJIZGwgKiBwVGltZXJIZGxfcCwKKwkJCQkJCXVuc2lnbmVkIGxvbmcgbG9uZyB1bGxUaW1lTnNfcCwKKwkJCQkJCXRFcGxUaW1lcmtDYWxsYmFjaworCQkJCQkJcGZuQ2FsbGJhY2tfcCwKKwkJCQkJCXVuc2lnbmVkIGxvbmcgdWxBcmd1bWVudF9wLAorCQkJCQkJQk9PTCBmQ29udGludW91c2x5X3ApCit7CisJdEVwbEtlcm5lbCBSZXQ7CisJdW5zaWduZWQgaW50IHVpSW5kZXg7CisJdEVwbFRpbWVySGlnaFJlc2tUaW1lckluZm8gKnBUaW1lckluZm87CisJa3RpbWVfdCBSZWxUaW1lOworCisJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBjaGVjayBwb2ludGVyIHRvIGhhbmRsZQorCWlmIChwVGltZXJIZGxfcCA9PSBOVUxMKSB7CisJCVJldCA9IGtFcGxUaW1lckludmFsaWRIYW5kbGU7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAoKnBUaW1lckhkbF9wID09IDApIHsJLy8gbm8gdGltZXIgY3JlYXRlZCB5ZXQKKworCQkvLyBzZWFyY2ggZnJlZSB0aW1lciBpbmZvIHN0cnVjdHVyZQorCQlwVGltZXJJbmZvID0gJkVwbFRpbWVySGlnaFJlc2tJbnN0YW5jZV9sLm1fYVRpbWVySW5mb1swXTsKKwkJZm9yICh1aUluZGV4ID0gMDsgdWlJbmRleCA8IFRJTUVSX0NPVU5UOworCQkgICAgIHVpSW5kZXgrKywgcFRpbWVySW5mbysrKSB7CisJCQlpZiAocFRpbWVySW5mby0+bV9FdmVudEFyZy5tX1RpbWVySGRsID09IDApIHsJLy8gZnJlZSBzdHJ1Y3R1cmUgZm91bmQKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAodWlJbmRleCA+PSBUSU1FUl9DT1VOVCkgewkvLyBubyBmcmVlIHN0cnVjdHVyZSBmb3VuZAorCQkJUmV0ID0ga0VwbFRpbWVyTm9UaW1lckNyZWF0ZWQ7CisJCQlnb3RvIEV4aXQ7CisJCX0KKworCQlwVGltZXJJbmZvLT5tX0V2ZW50QXJnLm1fVGltZXJIZGwgPSBIRExfSU5JVCh1aUluZGV4KTsKKwl9IGVsc2UgeworCQl1aUluZGV4ID0gSERMX1RPX0lEWCgqcFRpbWVySGRsX3ApOworCQlpZiAodWlJbmRleCA+PSBUSU1FUl9DT1VOVCkgewkvLyBpbnZhbGlkIGhhbmRsZQorCQkJUmV0ID0ga0VwbFRpbWVySW52YWxpZEhhbmRsZTsKKwkJCWdvdG8gRXhpdDsKKwkJfQorCisJCXBUaW1lckluZm8gPSAmRXBsVGltZXJIaWdoUmVza0luc3RhbmNlX2wubV9hVGltZXJJbmZvW3VpSW5kZXhdOworCX0KKworCS8qCisJICogaW5jcmVtZW50IHRpbWVyIGhhbmRsZQorCSAqIChpZiB0aW1lciBleHBpcmVzIHJpZ2h0IGFmdGVyIHRoaXMgc3RhdGVtZW50LCB0aGUgdXNlcgorCSAqIHdvdWxkIGRldGVjdCBhbiB1bmtub3duIHRpbWVyIGhhbmRsZSBhbmQgZGlzY2FyZCBpdCkKKwkgKi8KKwlwVGltZXJJbmZvLT5tX0V2ZW50QXJnLm1fVGltZXJIZGwgPQorCSAgICBIRExfSU5DKHBUaW1lckluZm8tPm1fRXZlbnRBcmcubV9UaW1lckhkbCk7CisJKnBUaW1lckhkbF9wID0gcFRpbWVySW5mby0+bV9FdmVudEFyZy5tX1RpbWVySGRsOworCisJLy8gcmVqZWN0IHRvbyBzbWFsbCB0aW1lIHZhbHVlcworCWlmICgoZkNvbnRpbnVvdXNseV9wICYmICh1bGxUaW1lTnNfcCA8IFRJTUVSX01JTl9WQUxfQ1lDTEUpKQorCSAgICB8fCAoIWZDb250aW51b3VzbHlfcCAmJiAodWxsVGltZU5zX3AgPCBUSU1FUl9NSU5fVkFMX1NJTkdMRSkpKSB7CisJCVJldCA9IGtFcGxUaW1lck5vVGltZXJDcmVhdGVkOworCQlnb3RvIEV4aXQ7CisJfQorCisJcFRpbWVySW5mby0+bV9FdmVudEFyZy5tX3VsQXJnID0gdWxBcmd1bWVudF9wOworCXBUaW1lckluZm8tPm1fcGZuQ2FsbGJhY2sgPSBwZm5DYWxsYmFja19wOworCXBUaW1lckluZm8tPm1fZkNvbnRpbnVvdXNseSA9IGZDb250aW51b3VzbHlfcDsKKwlwVGltZXJJbmZvLT5tX3VsbFBlcmlvZCA9IHVsbFRpbWVOc19wOworCisJLyoKKwkgKiBIUlRJTUVSX01PREVfUkVMIGRvZXMgbm90IGluZmx1ZW5jZSBnZW5lcmFsIGhhbmRsaW5nIG9mIHRoaXMgdGltZXIuCisJICogSXQgb25seSBzZXRzIHJlbGF0aXZlIG1vZGUgZm9yIHRoaXMgc3RhcnQgb3BlcmF0aW9uLgorCSAqIC0+IEV4cGlyZSB0aW1lIGlzIGNhbGN1bGF0ZWQgYnk6IE5vdyArIFJlbFRpbWUKKwkgKiBocnRpbWVyX3N0YXJ0IGFsc28gc2tpcHMgcGVuZGluZyB0aW1lciBldmVudHMuCisJICogVGhlIHN0YXRlIEhSVElNRVJfU1RBVEVfQ0FMTEJBQ0sgaXMgaWdub3JlZC4KKwkgKiBXZSBoYXZlIHRvIGNvcGUgd2l0aCB0aGF0IGluIG91ciBjYWxsYmFjayBmdW5jdGlvbi4KKwkgKi8KKwlSZWxUaW1lID0ga3RpbWVfYWRkX25zKGt0aW1lX3NldCgwLCAwKSwgdWxsVGltZU5zX3ApOworCWhydGltZXJfc3RhcnQoJnBUaW1lckluZm8tPm1fVGltZXIsIFJlbFRpbWUsIEhSVElNRVJfTU9ERV9SRUwpOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsVGltZXJIaWdoUmVza0RlbGV0ZVRpbWVyKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogZGVsZXRlcyB0aGUgdGltZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGhhbmRsZS4gQWZ0ZXJ3YXJkIHRoZQorLy8gICAgICAgICAgICAgIGhhbmRsZSBpcyBzZXQgdG8gemVyby4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFRpbWVySGRsX3AgICAgID0gcG9pbnRlciB0byB0aW1lciBoYW5kbGUKKy8vCisvLyBSZXR1cm46ICAgICAgdEVwbEtlcm5lbCAgICAgID0gZXJyb3IgY29kZQorLy8KKy8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJIaWdoUmVza0RlbGV0ZVRpbWVyKHRFcGxUaW1lckhkbCAqIHBUaW1lckhkbF9wKQoreworCXRFcGxLZXJuZWwgUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisJdW5zaWduZWQgaW50IHVpSW5kZXg7CisJdEVwbFRpbWVySGlnaFJlc2tUaW1lckluZm8gKnBUaW1lckluZm87CisKKwkvLyBjaGVjayBwb2ludGVyIHRvIGhhbmRsZQorCWlmIChwVGltZXJIZGxfcCA9PSBOVUxMKSB7CisJCVJldCA9IGtFcGxUaW1lckludmFsaWRIYW5kbGU7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlpZiAoKnBUaW1lckhkbF9wID09IDApIHsJLy8gbm8gdGltZXIgY3JlYXRlZCB5ZXQKKwkJZ290byBFeGl0OworCX0gZWxzZSB7CisJCXVpSW5kZXggPSBIRExfVE9fSURYKCpwVGltZXJIZGxfcCk7CisJCWlmICh1aUluZGV4ID49IFRJTUVSX0NPVU5UKSB7CS8vIGludmFsaWQgaGFuZGxlCisJCQlSZXQgPSBrRXBsVGltZXJJbnZhbGlkSGFuZGxlOworCQkJZ290byBFeGl0OworCQl9CisJCXBUaW1lckluZm8gPSAmRXBsVGltZXJIaWdoUmVza0luc3RhbmNlX2wubV9hVGltZXJJbmZvW3VpSW5kZXhdOworCQlpZiAocFRpbWVySW5mby0+bV9FdmVudEFyZy5tX1RpbWVySGRsICE9ICpwVGltZXJIZGxfcCkgewkvLyBpbnZhbGlkIGhhbmRsZQorCQkJZ290byBFeGl0OworCQl9CisJfQorCisJKnBUaW1lckhkbF9wID0gMDsKKwlwVGltZXJJbmZvLT5tX0V2ZW50QXJnLm1fVGltZXJIZGwgPSAwOworCXBUaW1lckluZm8tPm1fcGZuQ2FsbGJhY2sgPSBOVUxMOworCisJLyoKKwkgKiBUaHJlZSByZXR1cm4gY2FzZXMgb2YgaHJ0aW1lcl90cnlfdG9fY2FuY2VsIGhhdmUgdG8gYmUgdHJhY2tlZDoKKwkgKiAgMSAtIHRpbWVyIGhhcyBiZWVuIHJlbW92ZWQKKwkgKiAgMCAtIHRpbWVyIHdhcyBub3QgYWN0aXZlCisJICogICAgICBXZSBuZWVkIG5vdCBkbyBhbnl0aGluZy4gaHJ0aW1lciB0aW1lcnMganVzdCBjb25zaXN0IG9mCisJICogICAgICBhIGhydGltZXIgc3RydWN0LCB3aGljaCB3ZSBtaWdodCBlbnF1ZXVlIGluIHRoZSBocnRpbWVycworCSAqICAgICAgZXZlbnQgbGlzdCBieSBjYWxsaW5nIGhydGltZXJfc3RhcnQoKS4KKwkgKiAgICAgIElmIGEgdGltZXIgaXMgbm90IGVucXVldWVkLCBpdCBpcyBub3QgcHJlc2VudCBpbiBocnRpbWVycy4KKwkgKiAtMSAtIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIHJ1bm5pbmcKKwkgKiAgICAgIEluIHRoaXMgY2FzZSB3ZSBoYXZlIHRvIGVuc3VyZSB0aGF0IHRoZSB0aW1lciBpcyBub3QKKwkgKiAgICAgIGNvbnRpbnVvdXNseSByZXN0YXJ0ZWQuIFRoaXMgaGFzIGJlZW4gZG9uZSBieSBjbGVhcmluZworCSAqICAgICAgaXRzIGhhbmRsZS4KKwkgKi8KKwlocnRpbWVyX3RyeV90b19jYW5jZWwoJnBUaW1lckluZm8tPm1fVGltZXIpOworCisgICAgICBFeGl0OgorCXJldHVybiBSZXQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgRXBsVGltZXJIaWdoUmVza0NhbGxiYWNrKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogQ2FsbGJhY2sgZnVuY3Rpb24gY29tbW9ubHkgdXNlZCBmb3IgYWxsIHRpbWVycy4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcFRpbWVyX3AgPSBwb2ludGVyIHRvIGhydGltZXIKKy8vCisvLyBSZXR1cm46CisvLworLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitlbnVtIGhydGltZXJfcmVzdGFydCBFcGxUaW1lckhpZ2hSZXNrQ2FsbGJhY2soc3RydWN0IGhydGltZXIgKnBUaW1lcl9wKQoreworCXVuc2lnbmVkIGludCB1aUluZGV4OworCXRFcGxUaW1lckhpZ2hSZXNrVGltZXJJbmZvICpwVGltZXJJbmZvOworCXRFcGxUaW1lckhkbCBPcmdUaW1lckhkbDsKKwllbnVtIGhydGltZXJfcmVzdGFydCBSZXQ7CisKKwlCRU5DSE1BUktfTU9EXzI0X1NFVCg0KTsKKworCVJldCA9IEhSVElNRVJfTk9SRVNUQVJUOworCXBUaW1lckluZm8gPQorCSAgICBjb250YWluZXJfb2YocFRpbWVyX3AsIHRFcGxUaW1lckhpZ2hSZXNrVGltZXJJbmZvLCBtX1RpbWVyKTsKKwl1aUluZGV4ID0gSERMX1RPX0lEWChwVGltZXJJbmZvLT5tX0V2ZW50QXJnLm1fVGltZXJIZGwpOworCWlmICh1aUluZGV4ID49IFRJTUVSX0NPVU5UKSB7CS8vIGludmFsaWQgaGFuZGxlCisJCWdvdG8gRXhpdDsKKwl9CisKKwkvKgorCSAqIFdlIHN0b3JlIHRoZSB0aW1lciBoYW5kbGUgYmVmb3JlIGNhbGxpbmcgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uCisJICogYXMgdGhlIHRpbWVyIGNhbiBiZSBtb2RpZmllZCBpbnNpZGUgaXQuCisJICovCisJT3JnVGltZXJIZGwgPSBwVGltZXJJbmZvLT5tX0V2ZW50QXJnLm1fVGltZXJIZGw7CisKKwlpZiAocFRpbWVySW5mby0+bV9wZm5DYWxsYmFjayAhPSBOVUxMKSB7CisJCXBUaW1lckluZm8tPm1fcGZuQ2FsbGJhY2soJnBUaW1lckluZm8tPm1fRXZlbnRBcmcpOworCX0KKworCWlmIChwVGltZXJJbmZvLT5tX2ZDb250aW51b3VzbHkpIHsKKwkJa3RpbWVfdCBJbnRlcnZhbDsKKyNpZmRlZiBQUk9WRV9PVkVSUlVOCisJCWt0aW1lX3QgTm93OworCQl1bnNpZ25lZCBsb25nIE92ZXJydW5zOworI2VuZGlmCisKKwkJaWYgKE9yZ1RpbWVySGRsICE9IHBUaW1lckluZm8tPm1fRXZlbnRBcmcubV9UaW1lckhkbCkgeworCQkJLyogbW9kaWZpZWQgdGltZXIgaGFzIGFscmVhZHkgYmVlbiByZXN0YXJ0ZWQgKi8KKwkJCWdvdG8gRXhpdDsKKwkJfQorI2lmZGVmIFBST1ZFX09WRVJSVU4KKwkJTm93ID0ga3RpbWVfZ2V0KCk7CisJCUludGVydmFsID0KKwkJICAgIGt0aW1lX2FkZF9ucyhrdGltZV9zZXQoMCwgMCksIHBUaW1lckluZm8tPm1fdWxsUGVyaW9kKTsKKwkJT3ZlcnJ1bnMgPSBocnRpbWVyX2ZvcndhcmQocFRpbWVyX3AsIE5vdywgSW50ZXJ2YWwpOworCQlpZiAoT3ZlcnJ1bnMgPiAxKSB7CisJCQlwcmludGsKKwkJCSAgICAoIkVwbFRpbWVySGlnaFJlc2s6IENvbnRpbnVvdXMgdGltZXIgKGhhbmRsZSAweCVsWCkgaGFkIHRvIHNraXAgJWx1IGludGVydmFsKHMpIVxuIiwKKwkJCSAgICAgcFRpbWVySW5mby0+bV9FdmVudEFyZy5tX1RpbWVySGRsLCBPdmVycnVucyAtIDEpOworCQl9CisjZWxzZQorCQlwVGltZXJfcC0+ZXhwaXJlcyA9IGt0aW1lX2FkZF9ucyhwVGltZXJfcC0+ZXhwaXJlcywKKwkJCQkJCSBwVGltZXJJbmZvLT5tX3VsbFBlcmlvZCk7CisjZW5kaWYKKworCQlSZXQgPSBIUlRJTUVSX1JFU1RBUlQ7CisJfQorCisgICAgICBFeGl0OgorCUJFTkNITUFSS19NT0RfMjRfUkVTRVQoNCk7CisJcmV0dXJuIFJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvVmlydHVhbEV0aGVybmV0TGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvVmlydHVhbEV0aGVybmV0TGludXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDgzOGRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9WaXJ0dWFsRXRoZXJuZXRMaW51eC5jCkBAIC0wLDAgKzEsMzQyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgVmlydHVhbCBFdGhlcm5ldCBEcml2ZXIgZm9yIExpbnV4CisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogVmlydHVhbEV0aGVybmV0TGludXguYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwOC8xMS8yMCAxNzowNjo1MSAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzEyIC1hcjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCisgIDIwMDYvMDkvMTggZC5rLjogIGludGVncmF0aW9uIGludG8gRVBMIERMTGsgbW9kdWxlCisKKyAgVG9EbzoKKworICB2b2lkIG5ldGlmX2NhcnJpZXJfb2ZmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworICB2b2lkIG5ldGlmX2NhcnJpZXJfb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bmV0L2FycC5oPgorCisjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CisjaW5jbHVkZSA8bmV0L3BrdF9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4JLyogZm9yIHN0cnVjdCBza19idWZmICovCisKKyNpbmNsdWRlICJrZXJuZWwvVmlydHVhbEV0aGVybmV0LmgiCisjaW5jbHVkZSAia2VybmVsL0VwbERsbGtDYWwuaCIKKyNpbmNsdWRlICJrZXJuZWwvRXBsRGxsay5oIgorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1ZFVEgpKSAhPSAwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBFUExfVkVUSF9UWF9USU1FT1VUCisvLyNkZWZpbmUgRVBMX1ZFVEhfVFhfVElNRU9VVCAoMipIWikKKyNkZWZpbmUgRVBMX1ZFVEhfVFhfVElNRU9VVCAwCS8vIGQuay46IHdlIHVzZSBubyB0aW1lb3V0CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxvY2FsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsZSB2YXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKnBWRXRoTmV0RGV2aWNlX2cgPSBOVUxMOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludCBWRXRoT3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqcE5ldERldmljZV9wKTsKK3N0YXRpYyBpbnQgVkV0aENsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpwTmV0RGV2aWNlX3ApOworc3RhdGljIGludCBWRXRoWG1pdChzdHJ1Y3Qgc2tfYnVmZiAqcFNrYl9wLCBzdHJ1Y3QgbmV0X2RldmljZSAqcE5ldERldmljZV9wKTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqVkV0aEdldFN0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpwTmV0RGV2aWNlX3ApOworc3RhdGljIHZvaWQgVkV0aFRpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXZpY2VfcCk7CitzdGF0aWMgdEVwbEtlcm5lbCBWRXRoUmVjdkZyYW1lKHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3ApOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjoKKy8vCisvLyBEZXNjcmlwdGlvbjoKKy8vCisvLworLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8KKy8vIFJldHVybnM6CisvLworLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQgVkV0aE9wZW4oc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXZpY2VfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJLy9vcGVuIHRoZSBkZXZpY2UKKy8vCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKiBwU3RhdHMgPSBuZXRkZXZfcHJpdihwTmV0RGV2aWNlX3ApOworCisJLy9zdGFydCB0aGUgaW50ZXJmYWNlIHF1ZXVlIGZvciB0aGUgbmV0d29yayBzdWJzeXN0ZW0KKwluZXRpZl9zdGFydF9xdWV1ZShwTmV0RGV2aWNlX3ApOworCisJLy8gcmVnaXN0ZXIgY2FsbGJhY2sgZnVuY3Rpb24gaW4gRExMCisJUmV0ID0gRXBsRGxsa1JlZ0FzeW5jSGFuZGxlcihWRXRoUmVjdkZyYW1lKTsKKworCUVQTF9EQkdMVkxfVkVUSF9UUkFDRTEKKwkgICAgKCJWRXRoT3BlbjogRXBsRGxsa1JlZ0FzeW5jSGFuZGxlciByZXR1cm5lZCAweCUwMlhcbiIsIFJldCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBWRXRoQ2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXZpY2VfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJRVBMX0RCR0xWTF9WRVRIX1RSQUNFMCgiVkV0aENsb3NlXG4iKTsKKworCVJldCA9IEVwbERsbGtEZXJlZ0FzeW5jSGFuZGxlcihWRXRoUmVjdkZyYW1lKTsKKworCS8vc3RvcCB0aGUgaW50ZXJmYWNlIHF1ZXVlIGZvciB0aGUgbmV0d29yayBzdWJzeXN0ZW0KKwluZXRpZl9zdG9wX3F1ZXVlKHBOZXREZXZpY2VfcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgVkV0aFhtaXQoc3RydWN0IHNrX2J1ZmYgKnBTa2JfcCwgc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXZpY2VfcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXRFcGxGcmFtZUluZm8gRnJhbWVJbmZvOworCisJLy90cmFuc21pdCBmdW5jdGlvbgorCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpwU3RhdHMgPSBuZXRkZXZfcHJpdihwTmV0RGV2aWNlX3ApOworCisJLy9zYXZlIHRpbWVzdGVtcAorCXBOZXREZXZpY2VfcC0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJRnJhbWVJbmZvLm1fcEZyYW1lID0gKHRFcGxGcmFtZSAqKSBwU2tiX3AtPmRhdGE7CisJRnJhbWVJbmZvLm1fdWlGcmFtZVNpemUgPSBwU2tiX3AtPmxlbjsKKworCS8vY2FsbCBzZW5kIGZrdCBvbiBETEwKKwlSZXQgPSBFcGxEbGxrQ2FsQXN5bmNTZW5kKCZGcmFtZUluZm8sIGtFcGxEbGxBc3luY1JlcVByaW9HZW5lcmljKTsKKwlpZiAoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCUVQTF9EQkdMVkxfVkVUSF9UUkFDRTEKKwkJICAgICgiVkV0aFhtaXQ6IEVwbERsbGtDYWxBc3luY1NlbmQgcmV0dXJuZWQgMHglMDJYXG4iLCBSZXQpOworCQluZXRpZl9zdG9wX3F1ZXVlKHBOZXREZXZpY2VfcCk7CisJCWdvdG8gRXhpdDsKKwl9IGVsc2UgeworCQlFUExfREJHTFZMX1ZFVEhfVFJBQ0UwKCJWRXRoWG1pdDogZnJhbWUgcGFzc2VkIHRvIERMTFxuIik7CisJCWRldl9rZnJlZV9za2IocFNrYl9wKTsKKworCQkvL3NldCBzdGF0cyBmb3IgdGhlIGRldmljZQorCQlwU3RhdHMtPnR4X3BhY2tldHMrKzsKKwkJcFN0YXRzLT50eF9ieXRlcyArPSBGcmFtZUluZm8ubV91aUZyYW1lU2l6ZTsKKwl9CisKKyAgICAgIEV4aXQ6CisJcmV0dXJuIDA7CisKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpWRXRoR2V0U3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXZpY2VfcCkKK3sKKwlFUExfREJHTFZMX1ZFVEhfVFJBQ0UwKCJWRXRoR2V0U3RhdHNcbiIpOworCisJcmV0dXJuIG5ldGRldl9wcml2KHBOZXREZXZpY2VfcCk7Cit9CisKK3N0YXRpYyB2b2lkIFZFdGhUaW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpwTmV0RGV2aWNlX3ApCit7CisJRVBMX0RCR0xWTF9WRVRIX1RSQUNFMCgiVkV0aFRpbWVvdXQoXG4iKTsKKworCS8vICQkJCBkLmsuOiBtb3ZlIHRvIGV4dHJhIGZ1bmN0aW9uLCB3aGljaCBpcyBjYWxsZWQgYnkgRExMIHdoZW4gbmV3IHNwYWNlIGlzIGF2YWlsYWJsZSBpbiBUeEZpZm8KKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChwTmV0RGV2aWNlX3ApKSB7CisJCW5ldGlmX3dha2VfcXVldWUocE5ldERldmljZV9wKTsKKwl9Cit9CisKK3N0YXRpYyB0RXBsS2VybmVsIFZFdGhSZWN2RnJhbWUodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCXN0cnVjdCBuZXRfZGV2aWNlICpwTmV0RGV2aWNlID0gcFZFdGhOZXREZXZpY2VfZzsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcFN0YXRzID0gbmV0ZGV2X3ByaXYocE5ldERldmljZSk7CisJc3RydWN0IHNrX2J1ZmYgKnBTa2I7CisKKwlFUExfREJHTFZMX1ZFVEhfVFJBQ0UxKCJWRXRoUmVjdkZyYW1lOiBGcmFtZVNpemU9JXVcbiIsCisJCQkgICAgICAgcEZyYW1lSW5mb19wLT5tX3VpRnJhbWVTaXplKTsKKworCXBTa2IgPSBkZXZfYWxsb2Nfc2tiKHBGcmFtZUluZm9fcC0+bV91aUZyYW1lU2l6ZSArIDIpOworCWlmIChwU2tiID09IE5VTEwpIHsKKwkJcFN0YXRzLT5yeF9kcm9wcGVkKys7CisJCWdvdG8gRXhpdDsKKwl9CisJcFNrYi0+ZGV2ID0gcE5ldERldmljZTsKKworCXNrYl9yZXNlcnZlKHBTa2IsIDIpOworCisJbWVtY3B5KCh2b2lkICopc2tiX3B1dChwU2tiLCBwRnJhbWVJbmZvX3AtPm1fdWlGcmFtZVNpemUpLAorCSAgICAgICBwRnJhbWVJbmZvX3AtPm1fcEZyYW1lLCBwRnJhbWVJbmZvX3AtPm1fdWlGcmFtZVNpemUpOworCisJcFNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhwU2tiLCBwTmV0RGV2aWNlKTsKKwlwU2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKworCS8vIGNhbGwgbmV0aWZfcnggd2l0aCBza2IKKwluZXRpZl9yeChwU2tiKTsKKworCUVQTF9EQkdMVkxfVkVUSF9UUkFDRTEoIlZFdGhSZWN2RnJhbWU6IFNyY01BQz0weCVsbHhcbiIsCisJCQkgICAgICAgQW1pR2V0UXdvcmQ0OEZyb21CZShwRnJhbWVJbmZvX3AtPm1fcEZyYW1lLT4KKwkJCQkJCSAgIG1fYmVfYWJTcmNNYWMpKTsKKworCS8vIHVwZGF0ZSByZWNlaXZlIHN0YXRpc3RpY3MKKwlwU3RhdHMtPnJ4X3BhY2tldHMrKzsKKwlwU3RhdHMtPnJ4X2J5dGVzICs9IHBGcmFtZUluZm9fcC0+bV91aUZyYW1lU2l6ZTsKKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCit0RXBsS2VybmVsIFBVQkxJQyBWRXRoQWRkSW5zdGFuY2UodEVwbERsbGtJbml0UGFyYW0gKiBwSW5pdFBhcmFtX3ApCit7CisJdEVwbEtlcm5lbCBSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKKworCS8vIGFsbG9jYXRlIG5ldCBkZXZpY2Ugc3RydWN0dXJlIHdpdGggcHJpdiBwb2ludGluZyB0byBzdGF0cyBzdHJ1Y3R1cmUKKwlwVkV0aE5ldERldmljZV9nID0KKwkgICAgYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyksIEVQTF9WRVRIX05BTUUsCisJCQkgZXRoZXJfc2V0dXApOworLy8gICAgcFZFdGhOZXREZXZpY2VfZyA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZiAoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMpKTsKKworCWlmIChwVkV0aE5ldERldmljZV9nID09IE5VTEwpIHsKKwkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlwVkV0aE5ldERldmljZV9nLT5vcGVuID0gVkV0aE9wZW47CisJcFZFdGhOZXREZXZpY2VfZy0+c3RvcCA9IFZFdGhDbG9zZTsKKwlwVkV0aE5ldERldmljZV9nLT5nZXRfc3RhdHMgPSBWRXRoR2V0U3RhdHM7CisJcFZFdGhOZXREZXZpY2VfZy0+aGFyZF9zdGFydF94bWl0ID0gVkV0aFhtaXQ7CisJcFZFdGhOZXREZXZpY2VfZy0+dHhfdGltZW91dCA9IFZFdGhUaW1lb3V0OworCXBWRXRoTmV0RGV2aWNlX2ctPndhdGNoZG9nX3RpbWVvID0gRVBMX1ZFVEhfVFhfVElNRU9VVDsKKwlwVkV0aE5ldERldmljZV9nLT5kZXN0cnVjdG9yID0gZnJlZV9uZXRkZXY7CisKKwkvLyBjb3B5IG93biBNQUMgYWRkcmVzcyB0byBuZXQgZGV2aWNlIHN0cnVjdHVyZQorCW1lbWNweShwVkV0aE5ldERldmljZV9nLT5kZXZfYWRkciwgcEluaXRQYXJhbV9wLT5tX2JlX2FiU3JjTWFjLCA2KTsKKworCS8vcmVnaXN0ZXIgVkV0aCB0byB0aGUgbmV0d29yayBzdWJzeXN0ZW0KKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KHBWRXRoTmV0RGV2aWNlX2cpKSB7CisJCUVQTF9EQkdMVkxfVkVUSF9UUkFDRTAKKwkJICAgICgiVkV0aEFkZEluc3RhbmNlOiBDb3VsZCBub3QgcmVnaXN0ZXIgVkV0aC4uLlxuIik7CisJfSBlbHNlIHsKKwkJRVBMX0RCR0xWTF9WRVRIX1RSQUNFMAorCQkgICAgKCJWRXRoQWRkSW5zdGFuY2U6IFJlZ2lzdGVyIFZFdGggc3VjY2Vzc2Z1bGwuLi5cbiIpOworCX0KKworICAgICAgRXhpdDoKKwlyZXR1cm4gUmV0OworfQorCit0RXBsS2VybmVsIFBVQkxJQyBWRXRoRGVsSW5zdGFuY2Uodm9pZCkKK3sKKwl0RXBsS2VybmVsIFJldCA9IGtFcGxTdWNjZXNzZnVsOworCisJaWYgKHBWRXRoTmV0RGV2aWNlX2cgIT0gTlVMTCkgeworCQkvL3VucmVnaXN0ZXIgVkV0aCBmcm9tIHRoZSBuZXR3b3JrIHN1YnN5c3RlbQorCQl1bnJlZ2lzdGVyX25ldGRldihwVkV0aE5ldERldmljZV9nKTsKKwkJLy8gZGVzdHJ1Y3RvciB3YXMgc2V0IHRvIGZyZWVfbmV0ZGV2LAorCQkvLyBzbyB3ZSBkbyBub3QgbmVlZCB0byBjYWxsIGZyZWVfbmV0ZGV2IGhlcmUKKwkJcFZFdGhOZXREZXZpY2VfZyA9IE5VTEw7CisJfQorCisJcmV0dXJuIFJldDsKK30KKworI2VuZGlmIC8vICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfVkVUSCkpICE9IDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL2FtaXg4Ni5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9hbWl4ODYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Zjc0MjM4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9hbWl4ODYuYwpAQCAtMCwwICsxLDkwNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIEFic3RyYWN0IE1lbW9yeSBJbnRlcmZhY2UgZm9yIHg4NiBjb21wYXRpYmxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogYW1peDg2LmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIC4uLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIHIucy46IGZpcnN0IGltcGxlbWV0YXRpb24KKworICAyMDA2LTA2LTEzICBkLmsuOiBkdXBsaWNhdGUgZnVuY3Rpb25zIGZvciBsaXR0bGUgZW5kaWFuIGFuZCBiaWcgZW5kaWFuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vI2luY2x1ZGUgImdsb2JhbC5oIgorLy8jaW5jbHVkZSAiRXBsQW1pLmgiCisjaW5jbHVkZSAiRXBsSW5jLmgiCisKKyNpZiAoIWRlZmluZWQoRVBMX0FNSV9JTkxJTkVEKSkgfHwgZGVmaW5lZChJTkxJTkVfRU5BQkxFRCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IHsKKwlXT1JEIG1fd1dvcmQ7CisKK30gdHdTdHJ1Y3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlEV09SRCBtX2R3RHdvcmQ7CisKK30gdGR3U3RydWN0OworCit0eXBlZGVmIHN0cnVjdCB7CisJUVdPUkQgbV9xd1F3b3JkOworCit9IHRxd1N0cnVjdDsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaVNldFhYWFRvQmUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiB3cml0ZXMgdGhlIHNwZWNpZmllZCB2YWx1ZSB0byB0aGUgYWJzb2x1dGUgYWRkcmVzcyBpbgorLy8gICAgICAgICAgICAgIGJpZyBlbmRpYW4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgICAgICAgICAgPSBhYnNvbHV0ZSBhZGRyZXNzCisvLyAgICAgICAgICAgICAgeFhYWFZhbF9wICAgICAgICAgICAgICAgPSB2YWx1ZQorLy8KKy8vIFJldHVybnM6ICAgICAobm9uZSkKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLTwgd3JpdGUgQllURSBpbiBiaWcgZW5kaWFuID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoKK3ZvaWQgIFBVQkxJQyAgQW1pU2V0Qnl0ZVRvQmUgKHZvaWQgRkFSKiBwQWRkcl9wLCBCWVRFIGJCeXRlVmFsX3ApCit7CisKKyAgICooQllURSBGQVIqKXBBZGRyX3AgPSBiQnl0ZVZhbF9wOworCit9CisqLworCisvLy0tLS0tLS0tLS0tLTwgd3JpdGUgV09SRCBpbiBiaWcgZW5kaWFuID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdm9pZCBQVUJMSUMgQW1pU2V0V29yZFRvQmUodm9pZCBGQVIgKiBwQWRkcl9wLCBXT1JEIHdXb3JkVmFsX3ApCit7CisJdHdTdHJ1Y3QgRkFSICpwd1N0cnVjdDsKKwl0d1N0cnVjdCB3VmFsdWU7CisKKwl3VmFsdWUubV93V29yZCA9IChXT1JEKSAoKHdXb3JkVmFsX3AgJiAweDAwRkYpIDw8IDgpOwkvL0xTQiB0byBNU0IKKwl3VmFsdWUubV93V29yZCB8PSAoV09SRCkgKCh3V29yZFZhbF9wICYgMHhGRjAwKSA+PiA4KTsJLy9NU0IgdG8gTFNCCisKKwlwd1N0cnVjdCA9ICh0d1N0cnVjdCBGQVIgKikgcEFkZHJfcDsKKwlwd1N0cnVjdC0+bV93V29yZCA9IHdWYWx1ZS5tX3dXb3JkOworCit9CisKKy8vLS0tLS0tLS0tLS0tPCB3cml0ZSBEV09SRCBpbiBiaWcgZW5kaWFuID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB2b2lkIFBVQkxJQyBBbWlTZXREd29yZFRvQmUodm9pZCBGQVIgKiBwQWRkcl9wLAorCQkJCQkgICAgRFdPUkQgZHdEd29yZFZhbF9wKQoreworCXRkd1N0cnVjdCBGQVIgKnBkd1N0cnVjdDsKKwl0ZHdTdHJ1Y3QgZHdWYWx1ZTsKKworCWR3VmFsdWUubV9kd0R3b3JkID0gKChkd0R3b3JkVmFsX3AgJiAweDAwMDAwMEZGKSA8PCAyNCk7CS8vTFNCIHRvIE1TQgorCWR3VmFsdWUubV9kd0R3b3JkIHw9ICgoZHdEd29yZFZhbF9wICYgMHgwMDAwRkYwMCkgPDwgOCk7CisJZHdWYWx1ZS5tX2R3RHdvcmQgfD0gKChkd0R3b3JkVmFsX3AgJiAweDAwRkYwMDAwKSA+PiA4KTsKKwlkd1ZhbHVlLm1fZHdEd29yZCB8PSAoKGR3RHdvcmRWYWxfcCAmIDB4RkYwMDAwMDApID4+IDI0KTsJLy9NU0IgdG8gTFNCCisKKwlwZHdTdHJ1Y3QgPSAodGR3U3RydWN0IEZBUiAqKSBwQWRkcl9wOworCXBkd1N0cnVjdC0+bV9kd0R3b3JkID0gZHdWYWx1ZS5tX2R3RHdvcmQ7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pU2V0WFhYVG9MZSgpCisvLworLy8gRGVzY3JpcHRpb246IHdyaXRlcyB0aGUgc3BlY2lmaWVkIHZhbHVlIHRvIHRoZSBhYnNvbHV0ZSBhZGRyZXNzIGluCisvLyAgICAgICAgICAgICAgbGl0dGxlIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgICAgICAgICA9IGFic29sdXRlIGFkZHJlc3MKKy8vICAgICAgICAgICAgICB4WFhYVmFsX3AgICAgICAgICAgICAgICA9IHZhbHVlCisvLworLy8gUmV0dXJuczogICAgIChub25lKQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tPCB3cml0ZSBCWVRFIGluIGxpdHRsZSBlbmRpYW4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKgordm9pZCAgUFVCTElDICBBbWlTZXRCeXRlVG9MZSAodm9pZCBGQVIqIHBBZGRyX3AsIEJZVEUgYkJ5dGVWYWxfcCkKK3sKKworICAgKihCWVRFIEZBUiopcEFkZHJfcCA9IGJCeXRlVmFsX3A7CisKK30KKyovCisKKy8vLS0tLS0tLS0tLS0tPCB3cml0ZSBXT1JEIGluIGxpdHRsZSBlbmRpYW4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB2b2lkIFBVQkxJQyBBbWlTZXRXb3JkVG9MZSh2b2lkIEZBUiAqIHBBZGRyX3AsIFdPUkQgd1dvcmRWYWxfcCkKK3sKKwl0d1N0cnVjdCBGQVIgKnB3U3RydWN0OworCisJcHdTdHJ1Y3QgPSAodHdTdHJ1Y3QgRkFSICopIHBBZGRyX3A7CisJcHdTdHJ1Y3QtPm1fd1dvcmQgPSB3V29yZFZhbF9wOworCit9CisKKy8vLS0tLS0tLS0tLS0tPCB3cml0ZSBEV09SRCBpbiBsaXR0bGUgZW5kaWFuID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB2b2lkIFBVQkxJQyBBbWlTZXREd29yZFRvTGUodm9pZCBGQVIgKiBwQWRkcl9wLAorCQkJCQkgICAgRFdPUkQgZHdEd29yZFZhbF9wKQoreworCXRkd1N0cnVjdCBGQVIgKnBkd1N0cnVjdDsKKworCXBkd1N0cnVjdCA9ICh0ZHdTdHJ1Y3QgRkFSICopIHBBZGRyX3A7CisJcGR3U3RydWN0LT5tX2R3RHdvcmQgPSBkd0R3b3JkVmFsX3A7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pR2V0WFhYRnJvbUJlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogcmVhZHMgdGhlIHNwZWNpZmllZCB2YWx1ZSBmcm9tIHRoZSBhYnNvbHV0ZSBhZGRyZXNzIGluCisvLyAgICAgICAgICAgICAgYmlnIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgICAgICAgICA9IGFic29sdXRlIGFkZHJlc3MKKy8vCisvLyBSZXR1cm5zOiAgICAgWFhYICAgICAgICAgICAgICAgICAgICAgPSB2YWx1ZQorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tPCByZWFkIEJZVEUgaW4gYmlnIGVuZGlhbiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKgorQllURSAgUFVCTElDICBBbWlHZXRCeXRlRnJvbUJlICh2b2lkIEZBUiogcEFkZHJfcCkKK3sKKworICAgcmV0dXJuICggKihCWVRFIEZBUiopcEFkZHJfcCApOworCit9CisqLworCisvLy0tLS0tLS0tLS0tLTwgcmVhZCBXT1JEIGluIGJpZyBlbmRpYW4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gV09SRCBQVUJMSUMgQW1pR2V0V29yZEZyb21CZSh2b2lkIEZBUiAqIHBBZGRyX3ApCit7CisJdHdTdHJ1Y3QgRkFSICpwd1N0cnVjdDsKKwl0d1N0cnVjdCB3VmFsdWU7CisKKwlwd1N0cnVjdCA9ICh0d1N0cnVjdCBGQVIgKikgcEFkZHJfcDsKKworCXdWYWx1ZS5tX3dXb3JkID0gKFdPUkQpICgocHdTdHJ1Y3QtPm1fd1dvcmQgJiAweDAwRkYpIDw8IDgpOwkvL0xTQiB0byBNU0IKKwl3VmFsdWUubV93V29yZCB8PSAoV09SRCkgKChwd1N0cnVjdC0+bV93V29yZCAmIDB4RkYwMCkgPj4gOCk7CS8vTVNCIHRvIExTQgorCisJcmV0dXJuICh3VmFsdWUubV93V29yZCk7CisKK30KKworLy8tLS0tLS0tLS0tLS08IHJlYWQgRFdPUkQgaW4gYmlnIGVuZGlhbiA+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIERXT1JEIFBVQkxJQyBBbWlHZXREd29yZEZyb21CZSh2b2lkIEZBUiAqIHBBZGRyX3ApCit7CisJdGR3U3RydWN0IEZBUiAqcGR3U3RydWN0OworCXRkd1N0cnVjdCBkd1ZhbHVlOworCisJcGR3U3RydWN0ID0gKHRkd1N0cnVjdCBGQVIgKikgcEFkZHJfcDsKKworCWR3VmFsdWUubV9kd0R3b3JkID0gKChwZHdTdHJ1Y3QtPm1fZHdEd29yZCAmIDB4MDAwMDAwRkYpIDw8IDI0KTsJLy9MU0IgdG8gTVNCCisJZHdWYWx1ZS5tX2R3RHdvcmQgfD0gKChwZHdTdHJ1Y3QtPm1fZHdEd29yZCAmIDB4MDAwMEZGMDApIDw8IDgpOworCWR3VmFsdWUubV9kd0R3b3JkIHw9ICgocGR3U3RydWN0LT5tX2R3RHdvcmQgJiAweDAwRkYwMDAwKSA+PiA4KTsKKwlkd1ZhbHVlLm1fZHdEd29yZCB8PSAoKHBkd1N0cnVjdC0+bV9kd0R3b3JkICYgMHhGRjAwMDAwMCkgPj4gMjQpOwkvL01TQiB0byBMU0IKKworCXJldHVybiAoZHdWYWx1ZS5tX2R3RHdvcmQpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaUdldFhYWEZyb21MZSgpCisvLworLy8gRGVzY3JpcHRpb246IHJlYWRzIHRoZSBzcGVjaWZpZWQgdmFsdWUgZnJvbSB0aGUgYWJzb2x1dGUgYWRkcmVzcyBpbgorLy8gICAgICAgICAgICAgIGxpdHRsZSBlbmRpYW4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgICAgICAgICAgPSBhYnNvbHV0ZSBhZGRyZXNzCisvLworLy8gUmV0dXJuczogICAgIFhYWCAgICAgICAgICAgICAgICAgICAgID0gdmFsdWUKKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLTwgcmVhZCBCWVRFIGluIGxpdHRsZSBlbmRpYW4gPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoKK0JZVEUgIFBVQkxJQyAgQW1pR2V0Qnl0ZUZyb21MZSAodm9pZCBGQVIqIHBBZGRyX3ApCit7CisKKyAgIHJldHVybiAoICooQllURSBGQVIqKXBBZGRyX3AgKTsKKworfQorKi8KKworLy8tLS0tLS0tLS0tLS08IHJlYWQgV09SRCBpbiBsaXR0bGUgZW5kaWFuID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIFdPUkQgUFVCTElDIEFtaUdldFdvcmRGcm9tTGUodm9pZCBGQVIgKiBwQWRkcl9wKQoreworCXR3U3RydWN0IEZBUiAqcHdTdHJ1Y3Q7CisKKwlwd1N0cnVjdCA9ICh0d1N0cnVjdCBGQVIgKikgcEFkZHJfcDsKKwlyZXR1cm4gKHB3U3RydWN0LT5tX3dXb3JkKTsKKworfQorCisvLy0tLS0tLS0tLS0tLTwgcmVhZCBEV09SRCBpbiBsaXR0bGUgZW5kaWFuID4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gRFdPUkQgUFVCTElDIEFtaUdldER3b3JkRnJvbUxlKHZvaWQgRkFSICogcEFkZHJfcCkKK3sKKwl0ZHdTdHJ1Y3QgRkFSICpwZHdTdHJ1Y3Q7CisKKwlwZHdTdHJ1Y3QgPSAodGR3U3RydWN0IEZBUiAqKSBwQWRkcl9wOworCXJldHVybiAocGR3U3RydWN0LT5tX2R3RHdvcmQpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaVNldER3b3JkMjRUb0JlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogc2V0cyBhIDI0IGJpdCB2YWx1ZSB0byBhIGJ1ZmZlciBpbiBiaWcgZW5kaWFuCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyCisvLyAgICAgICAgICAgICAgZHdEd29yZFZhbF9wICAgID0gdmFsdWUgdG8gc2V0CisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB2b2lkIFBVQkxJQyBBbWlTZXREd29yZDI0VG9CZSh2b2lkIEZBUiAqIHBBZGRyX3AsCisJCQkJCSAgICAgIERXT1JEIGR3RHdvcmRWYWxfcCkKK3sKKworCSgoQllURSBGQVIgKikgcEFkZHJfcClbMF0gPSAoKEJZVEUgRkFSICopICYgZHdEd29yZFZhbF9wKVsyXTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzFdID0gKChCWVRFIEZBUiAqKSAmIGR3RHdvcmRWYWxfcClbMV07CisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVsyXSA9ICgoQllURSBGQVIgKikgJiBkd0R3b3JkVmFsX3ApWzBdOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaVNldER3b3JkMjRUb0xlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogc2V0cyBhIDI0IGJpdCB2YWx1ZSB0byBhIGJ1ZmZlciBpbiBsaXR0bGUgZW5kaWFuCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyCisvLyAgICAgICAgICAgICAgZHdEd29yZFZhbF9wICAgID0gdmFsdWUgdG8gc2V0CisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB2b2lkIFBVQkxJQyBBbWlTZXREd29yZDI0VG9MZSh2b2lkIEZBUiAqIHBBZGRyX3AsCisJCQkJCSAgICAgIERXT1JEIGR3RHdvcmRWYWxfcCkKK3sKKworCSgoQllURSBGQVIgKikgcEFkZHJfcClbMF0gPSAoKEJZVEUgRkFSICopICYgZHdEd29yZFZhbF9wKVswXTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzFdID0gKChCWVRFIEZBUiAqKSAmIGR3RHdvcmRWYWxfcClbMV07CisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVsyXSA9ICgoQllURSBGQVIgKikgJiBkd0R3b3JkVmFsX3ApWzJdOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaUdldER3b3JkMjRGcm9tQmUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZWFkcyBhIDI0IGJpdCB2YWx1ZSBmcm9tIGEgYnVmZmVyIGluIGJpZyBlbmRpYW4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBzb3VyY2UgYnVmZmVyCisvLworLy8gUmV0dXJuOiAgICAgIERXT1JEICAgICAgICAgICA9IHJlYWQgdmFsdWUKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiBEV09SRCBQVUJMSUMgQW1pR2V0RHdvcmQyNEZyb21CZSh2b2lkIEZBUiAqIHBBZGRyX3ApCit7CisKKwl0ZHdTdHJ1Y3QgZHdTdHJ1Y3Q7CisKKwlkd1N0cnVjdC5tX2R3RHdvcmQgPSBBbWlHZXREd29yZEZyb21CZShwQWRkcl9wKTsKKwlkd1N0cnVjdC5tX2R3RHdvcmQgPj49IDg7CisKKwlyZXR1cm4gKGR3U3RydWN0Lm1fZHdEd29yZCk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pR2V0RHdvcmQyNEZyb21MZSgpCisvLworLy8gRGVzY3JpcHRpb246IHJlYWRzIGEgMjQgYml0IHZhbHVlIGZyb20gYSBidWZmZXIgaW4gbGl0dGxlIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKKy8vCisvLyBSZXR1cm46ICAgICAgRFdPUkQgICAgICAgICAgID0gcmVhZCB2YWx1ZQorLy8KKy8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIERXT1JEIFBVQkxJQyBBbWlHZXREd29yZDI0RnJvbUxlKHZvaWQgRkFSICogcEFkZHJfcCkKK3sKKworCXRkd1N0cnVjdCBkd1N0cnVjdDsKKworCWR3U3RydWN0Lm1fZHdEd29yZCA9IEFtaUdldER3b3JkRnJvbUxlKHBBZGRyX3ApOworCWR3U3RydWN0Lm1fZHdEd29yZCAmPSAweDAwRkZGRkZGOworCisJcmV0dXJuIChkd1N0cnVjdC5tX2R3RHdvcmQpOworCit9CisKKy8vI2lmZGVmIFVTRV9WQVI2NAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlTZXRRd29yZDY0VG9CZSgpCisvLworLy8gRGVzY3JpcHRpb246IHNldHMgYSA2NCBiaXQgdmFsdWUgdG8gYSBidWZmZXIgaW4gYmlnIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlcgorLy8gICAgICAgICAgICAgIHF3UXdvcmRWYWxfcCAgICA9IHF1YWRydXBsZSB3b3JkIHZhbHVlCisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB2b2lkIFBVQkxJQyBBbWlTZXRRd29yZDY0VG9CZSh2b2lkIEZBUiAqIHBBZGRyX3AsCisJCQkJCSAgICAgIFFXT1JEIHF3UXdvcmRWYWxfcCkKK3sKKworCSgoQllURSBGQVIgKikgcEFkZHJfcClbMF0gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVs3XTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzFdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbNl07CisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVsyXSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzVdOworCSgoQllURSBGQVIgKikgcEFkZHJfcClbM10gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVs0XTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzRdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbM107CisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVs1XSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzJdOworCSgoQllURSBGQVIgKikgcEFkZHJfcClbNl0gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVsxXTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzddID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbMF07CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pU2V0UXdvcmQ2NFRvTGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBzZXRzIGEgNjQgYml0IHZhbHVlIHRvIGEgYnVmZmVyIGluIGxpdHRsZSBlbmRpYW4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBkZXN0aW5hdGlvbiBidWZmZXIKKy8vICAgICAgICAgICAgICBxd1F3b3JkVmFsX3AgICAgPSBxdWFkcnVwbGUgd29yZCB2YWx1ZQorLy8KKy8vIFJldHVybjogICAgICB2b2lkCisvLworLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdm9pZCBQVUJMSUMgQW1pU2V0UXdvcmQ2NFRvTGUodm9pZCBGQVIgKiBwQWRkcl9wLAorCQkJCQkgICAgICBRV09SRCBxd1F3b3JkVmFsX3ApCit7CisKKwlRV09SRCBGQVIgKnBxd0RzdDsKKworCXBxd0RzdCA9IChRV09SRCBGQVIgKikgcEFkZHJfcDsKKwkqcHF3RHN0ID0gcXdRd29yZFZhbF9wOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaUdldFF3b3JkNjRGcm9tQmUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZWFkcyBhIDY0IGJpdCB2YWx1ZSBmcm9tIGEgYnVmZmVyIGluIGJpZyBlbmRpYW4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBzb3VyY2UgYnVmZmVyCisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiBRV09SRCBQVUJMSUMgQW1pR2V0UXdvcmQ2NEZyb21CZSh2b2lkIEZBUiAqIHBBZGRyX3ApCit7CisKKwl0cXdTdHJ1Y3QgcXdTdHJ1Y3Q7CisKKwkoKEJZVEUgRkFSICopICYgcXdTdHJ1Y3QubV9xd1F3b3JkKVswXSA9ICgoQllURSBGQVIgKikgcEFkZHJfcClbN107CisJKChCWVRFIEZBUiAqKSAmIHF3U3RydWN0Lm1fcXdRd29yZClbMV0gPSAoKEJZVEUgRkFSICopIHBBZGRyX3ApWzZdOworCSgoQllURSBGQVIgKikgJiBxd1N0cnVjdC5tX3F3UXdvcmQpWzJdID0gKChCWVRFIEZBUiAqKSBwQWRkcl9wKVs1XTsKKwkoKEJZVEUgRkFSICopICYgcXdTdHJ1Y3QubV9xd1F3b3JkKVszXSA9ICgoQllURSBGQVIgKikgcEFkZHJfcClbNF07CisJKChCWVRFIEZBUiAqKSAmIHF3U3RydWN0Lm1fcXdRd29yZClbNF0gPSAoKEJZVEUgRkFSICopIHBBZGRyX3ApWzNdOworCSgoQllURSBGQVIgKikgJiBxd1N0cnVjdC5tX3F3UXdvcmQpWzVdID0gKChCWVRFIEZBUiAqKSBwQWRkcl9wKVsyXTsKKwkoKEJZVEUgRkFSICopICYgcXdTdHJ1Y3QubV9xd1F3b3JkKVs2XSA9ICgoQllURSBGQVIgKikgcEFkZHJfcClbMV07CisJKChCWVRFIEZBUiAqKSAmIHF3U3RydWN0Lm1fcXdRd29yZClbN10gPSAoKEJZVEUgRkFSICopIHBBZGRyX3ApWzBdOworCisJcmV0dXJuIChxd1N0cnVjdC5tX3F3UXdvcmQpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaUdldFF3b3JkNjRGcm9tTGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZWFkcyBhIDY0IGJpdCB2YWx1ZSBmcm9tIGEgYnVmZmVyIGluIGxpdHRsZSBlbmRpYW4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBzb3VyY2UgYnVmZmVyCisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiBRV09SRCBQVUJMSUMgQW1pR2V0UXdvcmQ2NEZyb21MZSh2b2lkIEZBUiAqIHBBZGRyX3ApCit7CisKKwl0cXdTdHJ1Y3QgRkFSICpwcXdTdHJ1Y3Q7CisJdHF3U3RydWN0IHF3U3RydWN0OworCisJcHF3U3RydWN0ID0gKHRxd1N0cnVjdCBGQVIgKikgcEFkZHJfcDsKKwlxd1N0cnVjdC5tX3F3UXdvcmQgPSBwcXdTdHJ1Y3QtPm1fcXdRd29yZDsKKworCXJldHVybiAocXdTdHJ1Y3QubV9xd1F3b3JkKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlTZXRRd29yZDQwVG9CZSgpCisvLworLy8gRGVzY3JpcHRpb246IHNldHMgYSA0MCBiaXQgdmFsdWUgdG8gYSBidWZmZXIgaW4gYmlnIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlcgorLy8gICAgICAgICAgICAgIHF3UXdvcmRWYWxfcCAgICA9IHF1YWRydXBsZSB3b3JkIHZhbHVlCisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB2b2lkIFBVQkxJQyBBbWlTZXRRd29yZDQwVG9CZSh2b2lkIEZBUiAqIHBBZGRyX3AsCisJCQkJCSAgICAgIFFXT1JEIHF3UXdvcmRWYWxfcCkKK3sKKworCSgoQllURSBGQVIgKikgcEFkZHJfcClbMF0gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVs0XTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzFdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbM107CisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVsyXSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzJdOworCSgoQllURSBGQVIgKikgcEFkZHJfcClbM10gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVsxXTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzRdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbMF07CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pU2V0UXdvcmQ0MFRvTGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBzZXRzIGEgNDAgYml0IHZhbHVlIHRvIGEgYnVmZmVyIGluIGxpdHRsZSBlbmRpYW4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBkZXN0aW5hdGlvbiBidWZmZXIKKy8vICAgICAgICAgICAgICBxd1F3b3JkVmFsX3AgICAgPSBxdWFkcnVwbGUgd29yZCB2YWx1ZQorLy8KKy8vIFJldHVybjogICAgICB2b2lkCisvLworLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdm9pZCBQVUJMSUMgQW1pU2V0UXdvcmQ0MFRvTGUodm9pZCBGQVIgKiBwQWRkcl9wLAorCQkJCQkgICAgICBRV09SRCBxd1F3b3JkVmFsX3ApCit7CisKKwkoKERXT1JEIEZBUiAqKSBwQWRkcl9wKVswXSA9ICgoRFdPUkQgRkFSICopICYgcXdRd29yZFZhbF9wKVswXTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzRdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbNF07CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pR2V0UXdvcmQ0MEZyb21CZSgpCisvLworLy8gRGVzY3JpcHRpb246IHJlYWRzIGEgNDAgYml0IHZhbHVlIGZyb20gYSBidWZmZXIgaW4gYmlnIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKKy8vCisvLyBSZXR1cm46ICAgICAgUVdPUkQKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiBRV09SRCBQVUJMSUMgQW1pR2V0UXdvcmQ0MEZyb21CZSh2b2lkIEZBUiAqIHBBZGRyX3ApCit7CisKKwl0cXdTdHJ1Y3QgcXdTdHJ1Y3Q7CisKKwlxd1N0cnVjdC5tX3F3UXdvcmQgPSBBbWlHZXRRd29yZDY0RnJvbUJlKHBBZGRyX3ApOworCXF3U3RydWN0Lm1fcXdRd29yZCA+Pj0gMjQ7CisKKwlyZXR1cm4gKHF3U3RydWN0Lm1fcXdRd29yZCk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pR2V0UXdvcmQ0MEZyb21MZSgpCisvLworLy8gRGVzY3JpcHRpb246IHJlYWRzIGEgNDAgYml0IHZhbHVlIGZyb20gYSBidWZmZXIgaW4gbGl0dGxlIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKKy8vCisvLyBSZXR1cm46ICAgICAgUVdPUkQKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiBRV09SRCBQVUJMSUMgQW1pR2V0UXdvcmQ0MEZyb21MZSh2b2lkIEZBUiAqIHBBZGRyX3ApCit7CisKKwl0cXdTdHJ1Y3QgcXdTdHJ1Y3Q7CisKKwlxd1N0cnVjdC5tX3F3UXdvcmQgPSBBbWlHZXRRd29yZDY0RnJvbUxlKHBBZGRyX3ApOworCXF3U3RydWN0Lm1fcXdRd29yZCAmPSAweDAwMDAwMEZGRkZGRkZGRkZMTDsKKworCXJldHVybiAocXdTdHJ1Y3QubV9xd1F3b3JkKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlTZXRRd29yZDQ4VG9CZSgpCisvLworLy8gRGVzY3JpcHRpb246IHNldHMgYSA0OCBiaXQgdmFsdWUgdG8gYSBidWZmZXIgaW4gYmlnIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlcgorLy8gICAgICAgICAgICAgIHF3UXdvcmRWYWxfcCAgICA9IHF1YWRydXBsZSB3b3JkIHZhbHVlCisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB2b2lkIFBVQkxJQyBBbWlTZXRRd29yZDQ4VG9CZSh2b2lkIEZBUiAqIHBBZGRyX3AsCisJCQkJCSAgICAgIFFXT1JEIHF3UXdvcmRWYWxfcCkKK3sKKworCSgoQllURSBGQVIgKikgcEFkZHJfcClbMF0gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVs1XTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzFdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbNF07CisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVsyXSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzNdOworCSgoQllURSBGQVIgKikgcEFkZHJfcClbM10gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVsyXTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzRdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbMV07CisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVs1XSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzBdOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaVNldFF3b3JkNDhUb0xlKCkKKy8vCisvLyBEZXNjcmlwdGlvbjogc2V0cyBhIDQ4IGJpdCB2YWx1ZSB0byBhIGJ1ZmZlciBpbiBsaXR0bGUgZW5kaWFuCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyCisvLyAgICAgICAgICAgICAgcXdRd29yZFZhbF9wICAgID0gcXVhZHJ1cGxlIHdvcmQgdmFsdWUKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZAorLy8KKy8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHZvaWQgUFVCTElDIEFtaVNldFF3b3JkNDhUb0xlKHZvaWQgRkFSICogcEFkZHJfcCwKKwkJCQkJICAgICAgUVdPUkQgcXdRd29yZFZhbF9wKQoreworCisJKChEV09SRCBGQVIgKikgcEFkZHJfcClbMF0gPSAoKERXT1JEIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbMF07CisJKChXT1JEIEZBUiAqKSBwQWRkcl9wKVsyXSA9ICgoV09SRCBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzJdOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaUdldFF3b3JkNDhGcm9tQmUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZWFkcyBhIDQ4IGJpdCB2YWx1ZSBmcm9tIGEgYnVmZmVyIGluIGJpZyBlbmRpYW4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBzb3VyY2UgYnVmZmVyCisvLworLy8gUmV0dXJuOiAgICAgIFFXT1JECisvLworLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gUVdPUkQgUFVCTElDIEFtaUdldFF3b3JkNDhGcm9tQmUodm9pZCBGQVIgKiBwQWRkcl9wKQoreworCisJdHF3U3RydWN0IHF3U3RydWN0OworCisJcXdTdHJ1Y3QubV9xd1F3b3JkID0gQW1pR2V0UXdvcmQ2NEZyb21CZShwQWRkcl9wKTsKKwlxd1N0cnVjdC5tX3F3UXdvcmQgPj49IDE2OworCisJcmV0dXJuIChxd1N0cnVjdC5tX3F3UXdvcmQpOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaUdldFF3b3JkNDhGcm9tTGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZWFkcyBhIDQ4IGJpdCB2YWx1ZSBmcm9tIGEgYnVmZmVyIGluIGxpdHRsZSBlbmRpYW4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBzb3VyY2UgYnVmZmVyCisvLworLy8gUmV0dXJuOiAgICAgIFFXT1JECisvLworLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gUVdPUkQgUFVCTElDIEFtaUdldFF3b3JkNDhGcm9tTGUodm9pZCBGQVIgKiBwQWRkcl9wKQoreworCisJdHF3U3RydWN0IHF3U3RydWN0OworCisJcXdTdHJ1Y3QubV9xd1F3b3JkID0gQW1pR2V0UXdvcmQ2NEZyb21MZShwQWRkcl9wKTsKKwlxd1N0cnVjdC5tX3F3UXdvcmQgJj0gMHgwMDAwRkZGRkZGRkZGRkZGTEw7CisKKwlyZXR1cm4gKHF3U3RydWN0Lm1fcXdRd29yZCk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pU2V0UXdvcmQ1NlRvQmUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBzZXRzIGEgNTYgYml0IHZhbHVlIHRvIGEgYnVmZmVyIGluIGJpZyBlbmRpYW4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBkZXN0aW5hdGlvbiBidWZmZXIKKy8vICAgICAgICAgICAgICBxd1F3b3JkVmFsX3AgICAgPSBxdWFkcnVwbGUgd29yZCB2YWx1ZQorLy8KKy8vIFJldHVybjogICAgICB2b2lkCisvLworLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdm9pZCBQVUJMSUMgQW1pU2V0UXdvcmQ1NlRvQmUodm9pZCBGQVIgKiBwQWRkcl9wLAorCQkJCQkgICAgICBRV09SRCBxd1F3b3JkVmFsX3ApCit7CisKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzBdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbNl07CisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVsxXSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzVdOworCSgoQllURSBGQVIgKikgcEFkZHJfcClbMl0gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVs0XTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzNdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbM107CisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVs0XSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzJdOworCSgoQllURSBGQVIgKikgcEFkZHJfcClbNV0gPSAoKEJZVEUgRkFSICopICYgcXdRd29yZFZhbF9wKVsxXTsKKwkoKEJZVEUgRkFSICopIHBBZGRyX3ApWzZdID0gKChCWVRFIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbMF07CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pU2V0UXdvcmQ1NlRvTGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBzZXRzIGEgNTYgYml0IHZhbHVlIHRvIGEgYnVmZmVyIGluIGxpdHRsZSBlbmRpYW4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBkZXN0aW5hdGlvbiBidWZmZXIKKy8vICAgICAgICAgICAgICBxd1F3b3JkVmFsX3AgICAgPSBxdWFkcnVwbGUgd29yZCB2YWx1ZQorLy8KKy8vIFJldHVybjogICAgICB2b2lkCisvLworLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gdm9pZCBQVUJMSUMgQW1pU2V0UXdvcmQ1NlRvTGUodm9pZCBGQVIgKiBwQWRkcl9wLAorCQkJCQkgICAgICBRV09SRCBxd1F3b3JkVmFsX3ApCit7CisKKwkoKERXT1JEIEZBUiAqKSBwQWRkcl9wKVswXSA9ICgoRFdPUkQgRkFSICopICYgcXdRd29yZFZhbF9wKVswXTsKKwkoKFdPUkQgRkFSICopIHBBZGRyX3ApWzJdID0gKChXT1JEIEZBUiAqKSAmIHF3UXdvcmRWYWxfcClbMl07CisJKChCWVRFIEZBUiAqKSBwQWRkcl9wKVs2XSA9ICgoQllURSBGQVIgKikgJiBxd1F3b3JkVmFsX3ApWzZdOworCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFtaUdldFF3b3JkNTZGcm9tQmUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZWFkcyBhIDU2IGJpdCB2YWx1ZSBmcm9tIGEgYnVmZmVyIGluIGJpZyBlbmRpYW4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgcEFkZHJfcCAgICAgICAgID0gcG9pbnRlciB0byBzb3VyY2UgYnVmZmVyCisvLworLy8gUmV0dXJuOiAgICAgIFFXT1JECisvLworLy8gU3RhdGU6ICAgICAgIG5vdCB0ZXN0ZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJTkxJTkVfRlVOQ1RJT04gUVdPUkQgUFVCTElDIEFtaUdldFF3b3JkNTZGcm9tQmUodm9pZCBGQVIgKiBwQWRkcl9wKQoreworCisJdHF3U3RydWN0IHF3U3RydWN0OworCisJcXdTdHJ1Y3QubV9xd1F3b3JkID0gQW1pR2V0UXdvcmQ2NEZyb21CZShwQWRkcl9wKTsKKwlxd1N0cnVjdC5tX3F3UXdvcmQgPj49IDg7CisKKwlyZXR1cm4gKHF3U3RydWN0Lm1fcXdRd29yZCk7CisKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQW1pR2V0UXdvcmQ1NkZyb21MZSgpCisvLworLy8gRGVzY3JpcHRpb246IHJlYWRzIGEgNTYgYml0IHZhbHVlIGZyb20gYSBidWZmZXIgaW4gbGl0dGxlIGVuZGlhbgorLy8KKy8vIFBhcmFtZXRlcnM6ICBwQWRkcl9wICAgICAgICAgPSBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKKy8vCisvLyBSZXR1cm46ICAgICAgUVdPUkQKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiBRV09SRCBQVUJMSUMgQW1pR2V0UXdvcmQ1NkZyb21MZSh2b2lkIEZBUiAqIHBBZGRyX3ApCit7CisKKwl0cXdTdHJ1Y3QgcXdTdHJ1Y3Q7CisKKwlxd1N0cnVjdC5tX3F3UXdvcmQgPSBBbWlHZXRRd29yZDY0RnJvbUxlKHBBZGRyX3ApOworCXF3U3RydWN0Lm1fcXdRd29yZCAmPSAweDAwRkZGRkZGRkZGRkZGRkZMTDsKKworCXJldHVybiAocXdTdHJ1Y3QubV9xd1F3b3JkKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlTZXRUaW1lT2ZEYXkoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBzZXRzIGEgVElNRV9PRl9EQVkgKENBTm9wZW4pIHZhbHVlIHRvIGEgYnVmZmVyCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyCisvLyAgICAgICAgICAgICAgcFRpbWVPZkRheV9wICAgID0gcG9pbnRlciB0byBzdHJ1Y3QgVElNRV9PRl9EQVkKKy8vCisvLyBSZXR1cm46ICAgICAgdm9pZAorLy8KKy8vIFN0YXRlOiAgICAgICBub3QgdGVzdGVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5MSU5FX0ZVTkNUSU9OIHZvaWQgUFVCTElDIEFtaVNldFRpbWVPZkRheSh2b2lkIEZBUiAqIHBBZGRyX3AsCisJCQkJCSAgICB0VGltZU9mRGF5IEZBUiAqIHBUaW1lT2ZEYXlfcCkKK3sKKworCUFtaVNldER3b3JkVG9MZSgoKEJZVEUgRkFSICopIHBBZGRyX3ApLAorCQkJcFRpbWVPZkRheV9wLT5tX2R3TXMgJiAweDBGRkZGRkZGKTsKKwlBbWlTZXRXb3JkVG9MZSgoKEJZVEUgRkFSICopIHBBZGRyX3ApICsgNCwgcFRpbWVPZkRheV9wLT5tX3dEYXlzKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZ1bmN0aW9uOiAgICBBbWlHZXRUaW1lT2ZEYXkoKQorLy8KKy8vIERlc2NyaXB0aW9uOiByZWFkcyBhIFRJTUVfT0ZfREFZIChDQU5vcGVuKSB2YWx1ZSBmcm9tIGEgYnVmZmVyCisvLworLy8gUGFyYW1ldGVyczogIHBBZGRyX3AgICAgICAgICA9IHBvaW50ZXIgdG8gc291cmNlIGJ1ZmZlcgorLy8gICAgICAgICAgICAgIHBUaW1lT2ZEYXlfcCAgICA9IHBvaW50ZXIgdG8gc3RydWN0IFRJTUVfT0ZfREFZCisvLworLy8gUmV0dXJuOiAgICAgIHZvaWQKKy8vCisvLyBTdGF0ZTogICAgICAgbm90IHRlc3RlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOTElORV9GVU5DVElPTiB2b2lkIFBVQkxJQyBBbWlHZXRUaW1lT2ZEYXkodm9pZCBGQVIgKiBwQWRkcl9wLAorCQkJCQkgICAgdFRpbWVPZkRheSBGQVIgKiBwVGltZU9mRGF5X3ApCit7CisKKwlwVGltZU9mRGF5X3AtPm1fZHdNcyA9CisJICAgIEFtaUdldER3b3JkRnJvbUxlKCgoQllURSBGQVIgKikgcEFkZHJfcCkpICYgMHgwRkZGRkZGRjsKKwlwVGltZU9mRGF5X3AtPm1fd0RheXMgPSBBbWlHZXRXb3JkRnJvbUxlKCgoQllURSBGQVIgKikgcEFkZHJfcCkgKyA0KTsKKworfQorCisjZW5kaWYKKworLy8gRU9GCisKKy8vIERpZSBsZXR6dGUgWmVpbGUgbXXfIHVuYmVkaW5ndCBlaW5lIGxlZXJlIFplaWxlIHNlaW4sIHdlaWwgbWFuY2hlIENvbXBpbGVyCisvLyBkYW1pdCBlaW4gUHJvYmxlbSBoYWJlbiwgd2VubiBkYXMgbmljaHQgc28gaXN0ICh6LkIuIEdOVSBvZGVyIEJvcmxhbmQgQysrIEJ1aWxkZXIpLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9kZW1vX21haW4uYyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvZGVtb19tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYzZmEwNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvZGVtb19tYWluLmMKQEAgLTAsMCArMSw5NjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBkZW1vYXBwbGljYXRpb24gZm9yIEVQTCBNTiAod2l0aCBTRE8gb3ZlciBVRFApCisgICAgICAgICAgICAgICAgdW5kZXIgTGludXggb24gWDg2IHdpdGggUlRMODEzOSBFdGhlcm5ldCBjb250cm9sbGVyCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogZGVtb19tYWluLmMsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjEwICQgICREYXRlOiAyMDA4LzExLzE5IDE4OjExOjQzICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgIEdDQworCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDkvMDEgZC5rLjogICBzdGFydCBvZiBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKworI2luY2x1ZGUgIkVwbC5oIgorI2luY2x1ZGUgInByb2NfZnMuaCIKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyAgICAvLyByZW1vdmUgKCJtYWtlIGludmlzaWJsZSIpIG9ic29sZXRlIHN5bWJvbHMgZm9yIGtlcm5lbCB2ZXJzaW9ucyAyLjYKKyAgICAvLyBhbmQgaGlnaGVyCisjZGVmaW5lIE1PRF9JTkNfVVNFX0NPVU5UCisjZGVmaW5lIE1PRF9ERUNfVVNFX0NPVU5UCisjZGVmaW5lIEVYUE9SVF9OT19TWU1CT0xTCisjZWxzZQorI2Vycm9yICJUaGlzIGRyaXZlciBuZWVkcyBhIDIuNi54IGtlcm5lbCBvciBoaWdoZXIiCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRyBMIE8gQiBBIEwgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gTWV0YWluZm9ybWF0aW9uCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CisjaWZkZWYgTU9EVUxFX0FVVEhPUgorTU9EVUxFX0FVVEhPUigiRGFuaWVsLktydWVnZXJAU1lTVEVDLWVsZWN0cm9uaWMuY29tIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkVQTCBNTiBkZW1vIik7CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRyYWNlUG9pbnQgc3VwcG9ydCBmb3IgcmVhbHRpbWUtZGVidWdnaW5nCisjaWZkZWYgX0RCR19UUkFDRV9QT0lOVFNfCit2b2lkIFBVQkxJQyBUZ3REYmdTaWduYWxUcmFjZVBvaW50KEJZVEUgYlRyYWNlUG9pbnROdW1iZXJfcCk7CisjZGVmaW5lIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKHApICAgVGd0RGJnU2lnbmFsVHJhY2VQb2ludChwKQorI2Vsc2UKKyNkZWZpbmUgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQocCkKKyNlbmRpZgorCisjZGVmaW5lIE5PREVJRCAgICAgIDB4RjAJLy89PiBNTgorI2RlZmluZSBDWUNMRV9MRU4gICA1MDAwCS8vIFt1c10KKyNkZWZpbmUgSVBfQUREUiAgICAgMHhjMGE4NjQwMQkvLyAxOTIuMTY4LjEwMC4xCisjZGVmaW5lIFNVQk5FVF9NQVNLIDB4RkZGRkZGMDAJLy8gMjU1LjI1NS4yNTUuMAorI2RlZmluZSBIT1NUTkFNRSAgICAiU1lTIFRFQyBlbGVjdHJvbmljIEVQTCBTdGFjayAgICAiCisjZGVmaW5lIElGX0VUSCAgICAgIEVQTF9WRVRIX05BTUUKKworLy8gTElHSFQgRUZGRUNUCisjZGVmaW5lIERFRkFVTFRfTUFYX0NZQ0xFX0NPVU5UIDIwCS8vIDYgaXMgdmVyeSBmYXN0CisjZGVmaW5lIEFQUF9ERUZBVUxUX01PREUgICAgICAgIDB4MDEKKyNkZWZpbmUgQVBQX0xFRF9DT1VOVCAgICAgICAgICAgNQkvLyBudW1iZXIgb2YgTEVEcyBpbiBvbmUgcm93CisjZGVmaW5lIEFQUF9MRURfTUFTSyAgICAgICAgICAgICgoMSA8PCBBUFBfTEVEX0NPVU5UKSAtIDEpCisjZGVmaW5lIEFQUF9ET1VCTEVfTEVEX01BU0sgICAgICgoMSA8PCAoQVBQX0xFRF9DT1VOVCAqIDIpKSAtIDEpCisjZGVmaW5lIEFQUF9NT0RFX0NPVU5UICAgICAgICAgIDUKKyNkZWZpbmUgQVBQX01PREVfTUFTSyAgICAgICAgICAgKCgxIDw8IEFQUF9NT0RFX0NPVU5UKSAtIDEpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCB0eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1vZHVsIGdsb2JhbGUgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ09OU1QgQllURSBhYk1hY0FkZHJbXSA9IHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OworCitCWVRFIGJWYXJJbjFfbDsKK0JZVEUgYlZhck91dDFfbDsKK0JZVEUgYlZhck91dDFPbGRfbDsKK0JZVEUgYk1vZGVTZWxlY3RfbDsJCS8vIHN0YXRlIG9mIHRoZSBwdXNoYnV0dG9ucyB0byBzZWxlY3QgdGhlIG1vZGUKK0JZVEUgYlNwZWVkU2VsZWN0X2w7CQkvLyBzdGF0ZSBvZiB0aGUgcHVzaGJ1dHRvbnMgdG8gaW5jcmVhc2UvZGVjcmVhc2UgdGhlIHNwZWVkCitCWVRFIGJTcGVlZFNlbGVjdE9sZF9sOwkJLy8gb2xkIHN0YXRlIG9mIHRoZSBwdXNoYnV0dG9ucworRFdPUkQgZHdMZWRzX2w7CQkJLy8gY3VycmVudCBzdGF0ZSBvZiBhbGwgTEVEcworQllURSBiTGVkc1JvdzFfbDsJCS8vIGN1cnJlbnQgc3RhdGUgb2YgdGhlIExFRHMgaW4gcm93IDEKK0JZVEUgYkxlZHNSb3cyX2w7CQkvLyBjdXJyZW50IHN0YXRlIG9mIHRoZSBMRURzIGluIHJvdyAyCitCWVRFIGFiU2VsZWN0X2xbM107CQkvLyBwdXNoYnV0dG9ucyBmcm9tIENOcworCitEV09SRCBkd01vZGVfbDsJCQkvLyBjdXJyZW50IG1vZGUKK2ludCBpQ3VyQ3ljbGVDb3VudF9sOwkJLy8gY3VycmVudCBjeWNsZSBjb3VudAoraW50IGlNYXhDeWNsZUNvdW50X2w7CQkvLyBtYXhpbXVtIGN5Y2xlIGNvdW50IChpLmUuIG51bWJlciBvZiBjeWNsZXMgdW50aWwgbmV4dCBsaWdodCBtb3ZlbWVudCBzdGVwKQoraW50IGlUb2dnbGU7CQkJLy8gaW5kaWNhdGVzIHRoZSBsaWdodCBtb3ZlbWVudCBkaXJlY3Rpb24KKworQllURSBhYkRvbWFpbl9sWzMwMDBdOworCitzdGF0aWMgd2FpdF9xdWV1ZV9oZWFkX3QgV2FpdFF1ZXVlU2h1dGRvd25fZzsJLy8gd2FpdCBxdWV1ZSBmb3IgdEVwbE5tdEV2ZW50U3dpdGNoT2ZmCitzdGF0aWMgYXRvbWljX3QgQXRvbWljU2h1dGRvd25fZyA9IEFUT01JQ19JTklUKEZBTFNFKTsKKworc3RhdGljIERXT1JEIGR3X2xlX0N5Y2xlTGVuX2c7CisKK3N0YXRpYyB1aW50IHVpTm9kZUlkX2cgPSBFUExfQ19BRFJfSU5WQUxJRDsKK21vZHVsZV9wYXJhbV9uYW1lZChub2RlaWQsIHVpTm9kZUlkX2csIHVpbnQsIDApOworCitzdGF0aWMgdWludCB1aUN5Y2xlTGVuX2cgPSBDWUNMRV9MRU47Cittb2R1bGVfcGFyYW1fbmFtZWQoY3ljbGVsZW4sIHVpQ3ljbGVMZW5fZywgdWludCwgMCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgeW91ciBvYmplY3QgZGljdGlvbmFyeS4gSXQgaXMgZGVmaW5lZAorLy8gaW4gT0JKRElDVC5DIGJ5IGRlZmluZSBFUExfT0JEX0lOSVRfUkFNX05BTUUuIFVzZSB0aGlzIGZ1bmN0aW9uIG5hbWUgdG8gZGVmaW5lCisvLyB0aGlzIGZ1bmN0aW9uIHByb3RvdHlwZSBoZXJlLiBJZiB5b3Ugd2FudCB0byB1c2UgbW9yZSB0aGFuIG9uZSBFcGwKKy8vIGluc3RhbmNlcyB0aGVuIHRoZSBmdW5jdGlvbiBuYW1lIG9mIGVhY2ggb2JqZWN0IGRpY3Rpb25hcnkgaGFzIHRvIGRpZmZlci4KKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkSW5pdFJhbSh0RXBsT2JkSW5pdFBhcmFtIE1FTSAqIHBJbml0UGFyYW1fcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEFwcENiRXZlbnQodEVwbEFwaUV2ZW50VHlwZSBFdmVudFR5cGVfcCwJLy8gSU46IGV2ZW50IHR5cGUgKGVudW0pCisJCQkgICAgIHRFcGxBcGlFdmVudEFyZyAqIHBFdmVudEFyZ19wLAkvLyBJTjogZXZlbnQgYXJndW1lbnQgKHVuaW9uKQorCQkJICAgICB2b2lkIEdFTkVSSUMgKiBwVXNlckFyZ19wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgQXBwQ2JTeW5jKHZvaWQpOworCitzdGF0aWMgaW50IF9faW5pdCBFcGxMaW5Jbml0KHZvaWQpOworc3RhdGljIHZvaWQgX19leGl0IEVwbExpbkV4aXQodm9pZCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgS2VybmVsIE1vZHVsZSBzcGVjaWZpYyBEYXRhIFN0cnVjdHVyZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VYUE9SVF9OT19TWU1CT0xTOworCisvL21vZHVsZV9pbml0KEVwbExpbkluaXQpOworLy9tb2R1bGVfZXhpdChFcGxMaW5FeGl0KTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFUgQiBMIEkgQyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246CisvLworLy8gRGVzY3JpcHRpb246CisvLworLy8KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8KKy8vCisvLyBSZXR1cm5zOgorLy8KKy8vCisvLyBTdGF0ZToKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIGludCBfX2luaXQgRXBsTGluSW5pdCh2b2lkKQoreworCXRFcGxLZXJuZWwgRXBsUmV0OworCWludCBpUmV0OworCXN0YXRpYyB0RXBsQXBpSW5pdFBhcmFtIEVwbEFwaUluaXRQYXJhbSA9IHsgMCB9OworCWNoYXIgKnNIb3N0bmFtZSA9IEhPU1ROQU1FOworCWNoYXIgKmFyZ3ZbNF0sICplbnZwWzNdOworCWNoYXIgc0J1ZmZlclsxNl07CisJdW5zaWduZWQgaW50IHVpVmFyRW50cmllczsKKwl0RXBsT2JkU2l6ZSBPYmRTaXplOworCisJYXRvbWljX3NldCgmQXRvbWljU2h1dGRvd25fZywgVFJVRSk7CisKKwkvLyBnZXQgbm9kZSBJRCBmcm9tIGluc21vZCBjb21tYW5kIGxpbmUKKwlFcGxBcGlJbml0UGFyYW0ubV91aU5vZGVJZCA9IHVpTm9kZUlkX2c7CisKKwlpZiAoRXBsQXBpSW5pdFBhcmFtLm1fdWlOb2RlSWQgPT0gRVBMX0NfQURSX0lOVkFMSUQpIHsJLy8gaW52YWxpZCBub2RlIElEIHNldAorCQkvLyBzZXQgZGVmYXVsdCBub2RlIElECisJCUVwbEFwaUluaXRQYXJhbS5tX3VpTm9kZUlkID0gTk9ERUlEOworCX0KKworCXVpTm9kZUlkX2cgPSBFcGxBcGlJbml0UGFyYW0ubV91aU5vZGVJZDsKKworCS8vIGNhbGN1bGF0ZSBJUCBhZGRyZXNzCisJRXBsQXBpSW5pdFBhcmFtLm1fZHdJcEFkZHJlc3MgPQorCSAgICAoMHhGRkZGRkYwMCAmIElQX0FERFIpIHwgRXBsQXBpSW5pdFBhcmFtLm1fdWlOb2RlSWQ7CisKKwlFcGxBcGlJbml0UGFyYW0ubV9mQXN5bmNPbmx5ID0gRkFMU0U7CisKKwlFcGxBcGlJbml0UGFyYW0ubV91aVNpemVPZlN0cnVjdCA9IHNpemVvZihFcGxBcGlJbml0UGFyYW0pOworCUVQTF9NRU1DUFkoRXBsQXBpSW5pdFBhcmFtLm1fYWJNYWNBZGRyZXNzLCBhYk1hY0FkZHIsCisJCSAgIHNpemVvZihFcGxBcGlJbml0UGFyYW0ubV9hYk1hY0FkZHJlc3MpKTsKKy8vICAgIEVwbEFwaUluaXRQYXJhbS5tX2FiTWFjQWRkcmVzc1s1XSA9IChCWVRFKSBFcGxBcGlJbml0UGFyYW0ubV91aU5vZGVJZDsKKwlFcGxBcGlJbml0UGFyYW0ubV9kd0ZlYXR1cmVGbGFncyA9IC0xOworCUVwbEFwaUluaXRQYXJhbS5tX2R3Q3ljbGVMZW4gPSB1aUN5Y2xlTGVuX2c7CS8vIHJlcXVpcmVkIGZvciBlcnJvciBkZXRlY3Rpb24KKwlFcGxBcGlJbml0UGFyYW0ubV91aUlzb2NoclR4TWF4UGF5bG9hZCA9IDEwMDsJLy8gY29uc3QKKwlFcGxBcGlJbml0UGFyYW0ubV91aUlzb2NoclJ4TWF4UGF5bG9hZCA9IDEwMDsJLy8gY29uc3QKKwlFcGxBcGlJbml0UGFyYW0ubV9kd1ByZXNNYXhMYXRlbmN5ID0gNTAwMDA7CS8vIGNvbnN0OyBvbmx5IHJlcXVpcmVkIGZvciBJZGVudFJlcworCUVwbEFwaUluaXRQYXJhbS5tX3VpUHJlcUFjdFBheWxvYWRMaW1pdCA9IDM2OwkvLyByZXF1aXJlZCBmb3IgaW5pdGlhbGlzYXRpb24gKCsyOCBieXRlcykKKwlFcGxBcGlJbml0UGFyYW0ubV91aVByZXNBY3RQYXlsb2FkTGltaXQgPSAzNjsJLy8gcmVxdWlyZWQgZm9yIGluaXRpYWxpc2F0aW9uIG9mIFByZXMgZnJhbWUgKCsyOCBieXRlcykKKwlFcGxBcGlJbml0UGFyYW0ubV9kd0FzbmRNYXhMYXRlbmN5ID0gMTUwMDAwOwkvLyBjb25zdDsgb25seSByZXF1aXJlZCBmb3IgSWRlbnRSZXMKKwlFcGxBcGlJbml0UGFyYW0ubV91aU11bHRpcGxDeWNsZUNudCA9IDA7CS8vIHJlcXVpcmVkIGZvciBlcnJvciBkZXRlY3Rpb24KKwlFcGxBcGlJbml0UGFyYW0ubV91aUFzeW5jTXR1ID0gMTUwMDsJLy8gcmVxdWlyZWQgdG8gc2V0IHVwIG1heCBmcmFtZSBzaXplCisJRXBsQXBpSW5pdFBhcmFtLm1fdWlQcmVzY2FsZXIgPSAyOwkvLyByZXF1aXJlZCBmb3Igc3luYworCUVwbEFwaUluaXRQYXJhbS5tX2R3TG9zc09mRnJhbWVUb2xlcmFuY2UgPSA1MDAwMDA7CisJRXBsQXBpSW5pdFBhcmFtLm1fZHdBc3luY1Nsb3RUaW1lb3V0ID0gMzAwMDAwMDsKKwlFcGxBcGlJbml0UGFyYW0ubV9kd1dhaXRTb2NQcmVxID0gMTUwMDAwOworCUVwbEFwaUluaXRQYXJhbS5tX2R3RGV2aWNlVHlwZSA9IC0xOwkvLyBOTVRfRGV2aWNlVHlwZV9VMzIKKwlFcGxBcGlJbml0UGFyYW0ubV9kd1ZlbmRvcklkID0gLTE7CS8vIE5NVF9JZGVudGl0eU9iamVjdF9SRUMuVmVuZG9ySWRfVTMyCisJRXBsQXBpSW5pdFBhcmFtLm1fZHdQcm9kdWN0Q29kZSA9IC0xOwkvLyBOTVRfSWRlbnRpdHlPYmplY3RfUkVDLlByb2R1Y3RDb2RlX1UzMgorCUVwbEFwaUluaXRQYXJhbS5tX2R3UmV2aXNpb25OdW1iZXIgPSAtMTsJLy8gTk1UX0lkZW50aXR5T2JqZWN0X1JFQy5SZXZpc2lvbk5vX1UzMgorCUVwbEFwaUluaXRQYXJhbS5tX2R3U2VyaWFsTnVtYmVyID0gLTE7CS8vIE5NVF9JZGVudGl0eU9iamVjdF9SRUMuU2VyaWFsTm9fVTMyCisJRXBsQXBpSW5pdFBhcmFtLm1fZHdTdWJuZXRNYXNrID0gU1VCTkVUX01BU0s7CisJRXBsQXBpSW5pdFBhcmFtLm1fZHdEZWZhdWx0R2F0ZXdheSA9IDA7CisJRVBMX01FTUNQWShFcGxBcGlJbml0UGFyYW0ubV9zSG9zdG5hbWUsIHNIb3N0bmFtZSwKKwkJICAgc2l6ZW9mKEVwbEFwaUluaXRQYXJhbS5tX3NIb3N0bmFtZSkpOworCisJLy8gY3VycmVudGx5IHVuc2V0IHBhcmFtZXRlcnMgbGVmdCBhdCBkZWZhdWx0IHZhbHVlIDAKKwkvL0VwbEFwaUluaXRQYXJhbS5tX3F3VmVuZG9yU3BlY2lmaWNFeHQxOworCS8vRXBsQXBpSW5pdFBhcmFtLm1fZHdWZXJpZnlDb25maWd1cmF0aW9uRGF0ZTsgLy8gQ0ZNX1ZlcmlmeUNvbmZpZ3VyYXRpb25fUkVDLkNvbmZEYXRlX1UzMgorCS8vRXBsQXBpSW5pdFBhcmFtLm1fZHdWZXJpZnlDb25maWd1cmF0aW9uVGltZTsgLy8gQ0ZNX1ZlcmlmeUNvbmZpZ3VyYXRpb25fUkVDLkNvbmZUaW1lX1UzMgorCS8vRXBsQXBpSW5pdFBhcmFtLm1fZHdBcHBsaWNhdGlvblN3RGF0ZTsgICAgICAgLy8gUERMX0xvY1ZlckFwcGxTd19SRUMuQXBwbFN3RGF0ZV9VMzIgb24gcHJvZ3JhbW1hYmxlIGRldmljZSBvciBkYXRlIHBvcnRpb24gb2YgTk1UX01hbnVmYWN0U3dWZXJzX1ZTIG9uIG5vbi1wcm9ncmFtbWFibGUgZGV2aWNlCisJLy9FcGxBcGlJbml0UGFyYW0ubV9kd0FwcGxpY2F0aW9uU3dUaW1lOyAgICAgICAvLyBQRExfTG9jVmVyQXBwbFN3X1JFQy5BcHBsU3dUaW1lX1UzMiBvbiBwcm9ncmFtbWFibGUgZGV2aWNlIG9yIHRpbWUgcG9ydGlvbiBvZiBOTVRfTWFudWZhY3RTd1ZlcnNfVlMgb24gbm9uLXByb2dyYW1tYWJsZSBkZXZpY2UKKwkvL0VwbEFwaUluaXRQYXJhbS5tX2FiVmVuZG9yU3BlY2lmaWNFeHQyWzQ4XTsKKworCS8vIHNldCBjYWxsYmFjayBmdW5jdGlvbnMKKwlFcGxBcGlJbml0UGFyYW0ubV9wZm5DYkV2ZW50ID0gQXBwQ2JFdmVudDsKKwlFcGxBcGlJbml0UGFyYW0ubV9wZm5DYlN5bmMgPSBBcHBDYlN5bmM7CisKKwlwcmludGsKKwkgICAgKCJcblxuIEhlbGxvLCBJJ20gYSBzaW1wbGUgUE9XRVJMSU5LIG5vZGUgcnVubmluZyBhcyAlcyFcbiAgKGJ1aWxkOiAlcyAvICVzKVxuXG4iLAorCSAgICAgKHVpTm9kZUlkX2cgPT0KKwkgICAgICBFUExfQ19BRFJfTU5fREVGX05PREVfSUQgPyAiTWFuYWdpbmcgTm9kZSIgOiAiQ29udHJvbGxlZCBOb2RlIiksCisJICAgICBfX0RBVEVfXywgX19USU1FX18pOworCisJLy8gaW5pdGlhbGl6ZSB0aGUgTGludXggYSB3YWl0IHF1ZXVlIGZvciBzaHV0ZG93biBvZiB0aGlzIG1vZHVsZQorCWluaXRfd2FpdHF1ZXVlX2hlYWQoJldhaXRRdWV1ZVNodXRkb3duX2cpOworCisJLy8gaW5pdGlhbGl6ZSB0aGUgcHJvY2ZzIGRldmljZQorCUVwbFJldCA9IEVwbExpblByb2NJbml0KCk7CisJaWYgKEVwbFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGluaXRpYWxpemUgUE9XRVJMSU5LIHN0YWNrCisJRXBsUmV0ID0gRXBsQXBpSW5pdGlhbGl6ZSgmRXBsQXBpSW5pdFBhcmFtKTsKKwlpZiAoRXBsUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisJLy8gbGluayBwcm9jZXNzIHZhcmlhYmxlcyB1c2VkIGJ5IENOIHRvIG9iamVjdCBkaWN0aW9uYXJ5CisJT2JkU2l6ZSA9IHNpemVvZihiVmFySW4xX2wpOworCXVpVmFyRW50cmllcyA9IDE7CisJRXBsUmV0ID0KKwkgICAgRXBsQXBpTGlua09iamVjdCgweDYwMDAsICZiVmFySW4xX2wsICZ1aVZhckVudHJpZXMsICZPYmRTaXplLCAweDAxKTsKKwlpZiAoRXBsUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCWdvdG8gRXhpdDsKKwl9CisKKwlPYmRTaXplID0gc2l6ZW9mKGJWYXJPdXQxX2wpOworCXVpVmFyRW50cmllcyA9IDE7CisJRXBsUmV0ID0KKwkgICAgRXBsQXBpTGlua09iamVjdCgweDYyMDAsICZiVmFyT3V0MV9sLCAmdWlWYXJFbnRyaWVzLCAmT2JkU2l6ZSwKKwkJCSAgICAgMHgwMSk7CisJaWYgKEVwbFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlnb3RvIEV4aXQ7CisJfQorCS8vIGxpbmsgcHJvY2VzcyB2YXJpYWJsZXMgdXNlZCBieSBNTiB0byBvYmplY3QgZGljdGlvbmFyeQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCU9iZFNpemUgPSBzaXplb2YoYkxlZHNSb3cxX2wpOworCXVpVmFyRW50cmllcyA9IDE7CisJRXBsUmV0ID0KKwkgICAgRXBsQXBpTGlua09iamVjdCgweDIwMDAsICZiTGVkc1JvdzFfbCwgJnVpVmFyRW50cmllcywgJk9iZFNpemUsCisJCQkgICAgIDB4MDEpOworCWlmIChFcGxSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCU9iZFNpemUgPSBzaXplb2YoYkxlZHNSb3cyX2wpOworCXVpVmFyRW50cmllcyA9IDE7CisJRXBsUmV0ID0KKwkgICAgRXBsQXBpTGlua09iamVjdCgweDIwMDAsICZiTGVkc1JvdzJfbCwgJnVpVmFyRW50cmllcywgJk9iZFNpemUsCisJCQkgICAgIDB4MDIpOworCWlmIChFcGxSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCU9iZFNpemUgPSBzaXplb2YoYlNwZWVkU2VsZWN0X2wpOworCXVpVmFyRW50cmllcyA9IDE7CisJRXBsUmV0ID0KKwkgICAgRXBsQXBpTGlua09iamVjdCgweDIwMDAsICZiU3BlZWRTZWxlY3RfbCwgJnVpVmFyRW50cmllcywgJk9iZFNpemUsCisJCQkgICAgIDB4MDMpOworCWlmIChFcGxSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCU9iZFNpemUgPSBzaXplb2YoYlNwZWVkU2VsZWN0T2xkX2wpOworCXVpVmFyRW50cmllcyA9IDE7CisJRXBsUmV0ID0KKwkgICAgRXBsQXBpTGlua09iamVjdCgweDIwMDAsICZiU3BlZWRTZWxlY3RPbGRfbCwgJnVpVmFyRW50cmllcywKKwkJCSAgICAgJk9iZFNpemUsIDB4MDQpOworCWlmIChFcGxSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKworCU9iZFNpemUgPSBzaXplb2YoYWJTZWxlY3RfbFswXSk7CisJdWlWYXJFbnRyaWVzID0gc2l6ZW9mKGFiU2VsZWN0X2wpOworCUVwbFJldCA9CisJICAgIEVwbEFwaUxpbmtPYmplY3QoMHgyMjAwLCAmYWJTZWxlY3RfbFswXSwgJnVpVmFyRW50cmllcywgJk9iZFNpemUsCisJCQkgICAgIDB4MDEpOworCWlmIChFcGxSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpIHsKKwkJZ290byBFeGl0OworCX0KKyNlbmRpZgorCisJLy8gbGluayBhIERPTUFJTiB0byBvYmplY3QgMHg2MTAwLCBidXQgZG8gbm90IGV4aXQsIGlmIGl0IGlzIG1pc3NpbmcKKwlPYmRTaXplID0gc2l6ZW9mKGFiRG9tYWluX2wpOworCXVpVmFyRW50cmllcyA9IDE7CisJRXBsUmV0ID0KKwkgICAgRXBsQXBpTGlua09iamVjdCgweDYxMDAsICZhYkRvbWFpbl9sLCAmdWlWYXJFbnRyaWVzLCAmT2JkU2l6ZSwKKwkJCSAgICAgMHgwMCk7CisJaWYgKEVwbFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgeworCQlwcmludGsoIkVwbEFwaUxpbmtPYmplY3QoMHg2MTAwKTogcmV0dXJucyAweCVYXG4iLCBFcGxSZXQpOworCX0KKwkvLyByZXNldCBvbGQgcHJvY2VzcyB2YXJpYWJsZXMKKwliVmFyT3V0MU9sZF9sID0gMDsKKwliU3BlZWRTZWxlY3RPbGRfbCA9IDA7CisJZHdNb2RlX2wgPSBBUFBfREVGQVVMVF9NT0RFOworCWlNYXhDeWNsZUNvdW50X2wgPSBERUZBVUxUX01BWF9DWUNMRV9DT1VOVDsKKworCS8vIGNvbmZpZ3VyZSBJUCBhZGRyZXNzIG9mIHZpcnR1YWwgbmV0d29yayBpbnRlcmZhY2UKKwkvLyBmb3IgVENQL0lQIGNvbW11bmljYXRpb24gb3ZlciB0aGUgUE9XRVJMSU5LIG5ldHdvcmsKKwlzcHJpbnRmKHNCdWZmZXIsICIlbHUuJWx1LiVsdS4lbHUiLAorCQkoRXBsQXBpSW5pdFBhcmFtLm1fZHdJcEFkZHJlc3MgPj4gMjQpLAorCQkoKEVwbEFwaUluaXRQYXJhbS5tX2R3SXBBZGRyZXNzID4+IDE2KSAmIDB4RkYpLAorCQkoKEVwbEFwaUluaXRQYXJhbS5tX2R3SXBBZGRyZXNzID4+IDgpICYgMHhGRiksCisJCShFcGxBcGlJbml0UGFyYW0ubV9kd0lwQWRkcmVzcyAmIDB4RkYpKTsKKwkvKiBzZXQgdXAgYSBtaW5pbWFsIGVudmlyb25tZW50ICovCisJaVJldCA9IDA7CisJZW52cFtpUmV0KytdID0gIkhPTUU9LyI7CisJZW52cFtpUmV0KytdID0gIlBBVEg9L3NiaW46L2JpbjovdXNyL3NiaW46L3Vzci9iaW4iOworCWVudnBbaVJldF0gPSBOVUxMOworCisJLyogc2V0IHVwIHRoZSBhcmd1bWVudCBsaXN0ICovCisJaVJldCA9IDA7CisJYXJndltpUmV0KytdID0gIi9zYmluL2lmY29uZmlnIjsKKwlhcmd2W2lSZXQrK10gPSBJRl9FVEg7CisJYXJndltpUmV0KytdID0gc0J1ZmZlcjsKKwlhcmd2W2lSZXRdID0gTlVMTDsKKworCS8qIGNhbGwgaWZjb25maWcgdG8gY29uZmlndXJlIHRoZSB2aXJ0dWFsIG5ldHdvcmsgaW50ZXJmYWNlICovCisJaVJldCA9IGNhbGxfdXNlcm1vZGVoZWxwZXIoYXJndlswXSwgYXJndiwgZW52cCwgMSk7CisJcHJpbnRrKCJpZmNvbmZpZyAlcyAlcyByZXR1cm5lZCAlZFxuIiwgYXJndlsxXSwgYXJndlsyXSwgaVJldCk7CisKKwkvLyBzdGFydCB0aGUgTk1UIHN0YXRlIG1hY2hpbmUKKwlFcGxSZXQgPSBFcGxBcGlFeGVjTm10Q29tbWFuZChrRXBsTm10RXZlbnRTd1Jlc2V0KTsKKwlhdG9taWNfc2V0KCZBdG9taWNTaHV0ZG93bl9nLCBGQUxTRSk7CisKKyAgICAgIEV4aXQ6CisJcHJpbnRrKCJFcGxMaW5Jbml0KCk6IHJldHVybnMgMHglWFxuIiwgRXBsUmV0KTsKKwlyZXR1cm4gRXBsUmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgRXBsTGluRXhpdCh2b2lkKQoreworCXRFcGxLZXJuZWwgRXBsUmV0OworCisJLy8gaGFsdCB0aGUgTk1UIHN0YXRlIG1hY2hpbmUKKwkvLyBzbyB0aGUgcHJvY2Vzc2luZyBvZiBQT1dFUkxJTksgZnJhbWVzIHN0b3BzCisJRXBsUmV0ID0gRXBsQXBpRXhlY05tdENvbW1hbmQoa0VwbE5tdEV2ZW50U3dpdGNoT2ZmKTsKKworCS8vIHdhaXQgdW50aWwgTk1UIHN0YXRlIG1hY2hpbmUgaXMgc2h1dCBkb3duCisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKFdhaXRRdWV1ZVNodXRkb3duX2csCisJCQkJIChhdG9taWNfcmVhZCgmQXRvbWljU2h1dGRvd25fZykgPT0gVFJVRSkpOworLyogICAgaWYgKChpRXJyICE9IDApIHx8IChhdG9taWNfcmVhZCgmQXRvbWljU2h1dGRvd25fZykgPT0gRVZFTlRfU1RBVEVfSU9DVEwpKQorICAgIHsgICAvLyB3YWl0aW5nIHdhcyBpbnRlcnJ1cHRlZCBieSBzaWduYWwgb3IgYXBwbGljYXRpb24gY2FsbGVkIHdyb25nIGZ1bmN0aW9uCisgICAgICAgIEVwbFJldCA9IGtFcGxTaHV0ZG93bjsKKyAgICB9Ki8KKwkvLyBkZWxldGUgaW5zdGFuY2UgZm9yIGFsbCBtb2R1bGVzCisJRXBsUmV0ID0gRXBsQXBpU2h1dGRvd24oKTsKKwlwcmludGsoIkVwbEFwaVNodXRkb3duKCk6ICAweCVYXG4iLCBFcGxSZXQpOworCisJLy8gZGVpbml0aWFsaXplIHByb2MgZnMKKwlFcGxSZXQgPSBFcGxMaW5Qcm9jRnJlZSgpOworCXByaW50aygiRXBsTGluUHJvY0ZyZWUoKTogICAgICAgIDB4JVhcbiIsIEVwbFJldCk7CisKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICBQIFIgSSBWIEEgVCBFICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRnVuY3Rpb246ICAgIEFwcENiRXZlbnQKKy8vCisvLyBEZXNjcmlwdGlvbjogZXZlbnQgY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIGJ5IEVQTCBBUEkgbGF5ZXIgd2l0aGluCisvLyAgICAgICAgICAgICAgdXNlciBwYXJ0IChsb3cgcHJpb3JpdHkpLgorLy8KKy8vIFBhcmFtZXRlcnM6ICBFdmVudFR5cGVfcCAgICAgPSBldmVudCB0eXBlCisvLyAgICAgICAgICAgICAgcEV2ZW50QXJnX3AgICAgID0gcG9pbnRlciB0byB1bmlvbiwgd2hpY2ggZGVzY3JpYmVzCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGV2ZW50IGluIGRldGFpbAorLy8gICAgICAgICAgICAgIHBVc2VyQXJnX3AgICAgICA9IHVzZXIgc3BlY2lmaWMgYXJndW1lbnQKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgID0gZXJyb3IgY29kZSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRXBsU3VjY2Vzc2Z1bCA9IG5vIGVycm9yCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0VwbFJlamVjdCA9IHJlamVjdCBmdXJ0aGVyIHByb2Nlc3NpbmcKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UgPSBwb3N0IGVycm9yIGV2ZW50IHRvIEFQSSBsYXllcgorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEFwcENiRXZlbnQodEVwbEFwaUV2ZW50VHlwZSBFdmVudFR5cGVfcCwJLy8gSU46IGV2ZW50IHR5cGUgKGVudW0pCisJCQkgICAgIHRFcGxBcGlFdmVudEFyZyAqIHBFdmVudEFyZ19wLAkvLyBJTjogZXZlbnQgYXJndW1lbnQgKHVuaW9uKQorCQkJICAgICB2b2lkIEdFTkVSSUMgKiBwVXNlckFyZ19wKQoreworCXRFcGxLZXJuZWwgRXBsUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwkvLyBjaGVjayBpZiBOTVRfR1NfT0ZGIGlzIHJlYWNoZWQKKwlzd2l0Y2ggKEV2ZW50VHlwZV9wKSB7CisJY2FzZSBrRXBsQXBpRXZlbnRObXRTdGF0ZUNoYW5nZToKKwkJeworCQkJc3dpdGNoIChwRXZlbnRBcmdfcC0+bV9ObXRTdGF0ZUNoYW5nZS5tX05ld05tdFN0YXRlKSB7CisJCQljYXNlIGtFcGxObXRHc09mZjoKKwkJCQl7CS8vIE5NVCBzdGF0ZSBtYWNoaW5lIHdhcyBzaHV0IGRvd24sCisJCQkJCS8vIGJlY2F1c2Ugb2YgdXNlciBzaWduYWwgKENUUkwtQykgb3IgY3JpdGljYWwgRVBMIHN0YWNrIGVycm9yCisJCQkJCS8vIC0+IGFsc28gc2h1dCBkb3duIEVwbEFwaVByb2Nlc3MoKSBhbmQgbWFpbigpCisJCQkJCUVwbFJldCA9IGtFcGxTaHV0ZG93bjsKKworCQkJCQlwcmludGsKKwkJCQkJICAgICgiQXBwQ2JFdmVudChrRXBsTm10R3NPZmYpIG9yaWdpbmF0aW5nIGV2ZW50ID0gMHglWFxuIiwKKwkJCQkJICAgICBwRXZlbnRBcmdfcC0+bV9ObXRTdGF0ZUNoYW5nZS4KKwkJCQkJICAgICBtX05tdEV2ZW50KTsKKworCQkJCQkvLyB3YWtlIHVwIEVwbExpbkV4aXQoKQorCQkJCQlhdG9taWNfc2V0KCZBdG9taWNTaHV0ZG93bl9nLCBUUlVFKTsKKwkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlCisJCQkJCSAgICAoJldhaXRRdWV1ZVNodXRkb3duX2cpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWNhc2Uga0VwbE5tdEdzUmVzZXRDb21tdW5pY2F0aW9uOgorCQkJCXsKKwkJCQkJRFdPUkQgZHdCdWZmZXI7CisKKwkJCQkJLy8gY29uZmlndXJlIE9EIGZvciBNTiBpbiBzdGF0ZSBSZXNldENvbW0gYWZ0ZXIgcmVzZXRpbmcgdGhlIE9ECisJCQkJCS8vIFRPRE86IHNldHVwIHlvdXIgb3duIG5ldHdvcmsgY29uZmlndXJhdGlvbiBoZXJlCisJCQkJCWR3QnVmZmVyID0gKEVQTF9OT0RFQVNTSUdOX05PREVfSVNfQ04gfCBFUExfTk9ERUFTU0lHTl9OT0RFX0VYSVNUUyk7CS8vIDB4MDAwMDAwMDNMCisJCQkJCUVwbFJldCA9CisJCQkJCSAgICBFcGxBcGlXcml0ZUxvY2FsT2JqZWN0KDB4MUY4MSwgMHgwMSwKKwkJCQkJCQkJICAgJmR3QnVmZmVyLAorCQkJCQkJCQkgICA0KTsKKwkJCQkJRXBsUmV0ID0KKwkJCQkJICAgIEVwbEFwaVdyaXRlTG9jYWxPYmplY3QoMHgxRjgxLCAweDAyLAorCQkJCQkJCQkgICAmZHdCdWZmZXIsCisJCQkJCQkJCSAgIDQpOworCQkJCQlFcGxSZXQgPQorCQkJCQkgICAgRXBsQXBpV3JpdGVMb2NhbE9iamVjdCgweDFGODEsIDB4MDMsCisJCQkJCQkJCSAgICZkd0J1ZmZlciwKKwkJCQkJCQkJICAgNCk7CisJCQkJCUVwbFJldCA9CisJCQkJCSAgICBFcGxBcGlXcml0ZUxvY2FsT2JqZWN0KDB4MUY4MSwgMHgwNCwKKwkJCQkJCQkJICAgJmR3QnVmZmVyLAorCQkJCQkJCQkgICA0KTsKKwkJCQkJRXBsUmV0ID0KKwkJCQkJICAgIEVwbEFwaVdyaXRlTG9jYWxPYmplY3QoMHgxRjgxLCAweDA1LAorCQkJCQkJCQkgICAmZHdCdWZmZXIsCisJCQkJCQkJCSAgIDQpOworCQkJCQlFcGxSZXQgPQorCQkJCQkgICAgRXBsQXBpV3JpdGVMb2NhbE9iamVjdCgweDFGODEsIDB4MDYsCisJCQkJCQkJCSAgICZkd0J1ZmZlciwKKwkJCQkJCQkJICAgNCk7CisJCQkJCUVwbFJldCA9CisJCQkJCSAgICBFcGxBcGlXcml0ZUxvY2FsT2JqZWN0KDB4MUY4MSwgMHgwNywKKwkJCQkJCQkJICAgJmR3QnVmZmVyLAorCQkJCQkJCQkgICA0KTsKKwkJCQkJRXBsUmV0ID0KKwkJCQkJICAgIEVwbEFwaVdyaXRlTG9jYWxPYmplY3QoMHgxRjgxLCAweDA4LAorCQkJCQkJCQkgICAmZHdCdWZmZXIsCisJCQkJCQkJCSAgIDQpOworCQkJCQlFcGxSZXQgPQorCQkJCQkgICAgRXBsQXBpV3JpdGVMb2NhbE9iamVjdCgweDFGODEsIDB4MjAsCisJCQkJCQkJCSAgICZkd0J1ZmZlciwKKwkJCQkJCQkJICAgNCk7CisJCQkJCUVwbFJldCA9CisJCQkJCSAgICBFcGxBcGlXcml0ZUxvY2FsT2JqZWN0KDB4MUY4MSwgMHhGRSwKKwkJCQkJCQkJICAgJmR3QnVmZmVyLAorCQkJCQkJCQkgICA0KTsKKwkJCQkJRXBsUmV0ID0KKwkJCQkJICAgIEVwbEFwaVdyaXRlTG9jYWxPYmplY3QoMHgxRjgxLCAweDZFLAorCQkJCQkJCQkgICAmZHdCdWZmZXIsCisJCQkJCQkJCSAgIDQpOworCisvLyAgICAgICAgICAgICAgICAgICAgZHdCdWZmZXIgfD0gRVBMX05PREVBU1NJR05fTUFOREFUT1JZX0NOOyAgICAvLyAweDAwMDAwMDBCTAorLy8gICAgICAgICAgICAgICAgICAgIEVwbFJldCA9IEVwbEFwaVdyaXRlTG9jYWxPYmplY3QoMHgxRjgxLCAweDZFLCAmZHdCdWZmZXIsIDQpOworCQkJCQlkd0J1ZmZlciA9IChFUExfTk9ERUFTU0lHTl9NTl9QUkVTIHwgRVBMX05PREVBU1NJR05fTk9ERV9FWElTVFMpOwkvLyAweDAwMDEwMDAxTAorCQkJCQlFcGxSZXQgPQorCQkJCQkgICAgRXBsQXBpV3JpdGVMb2NhbE9iamVjdCgweDFGODEsIDB4RjAsCisJCQkJCQkJCSAgICZkd0J1ZmZlciwKKwkJCQkJCQkJICAgNCk7CisKKwkJCQkJLy8gY29udGludWUKKwkJCQl9CisKKwkJCWNhc2Uga0VwbE5tdEdzUmVzZXRDb25maWd1cmF0aW9uOgorCQkJCXsKKwkJCQkJdW5zaWduZWQgaW50IHVpU2l6ZTsKKworCQkJCQkvLyBmZXRjaCBvYmplY3QgMHgxMDA2IE5NVF9DeWNsZUxlbl9VMzIgZnJvbSBsb2NhbCBPRCAoaW4gbGl0dGxlIGVuZGlhbiBieXRlIG9yZGVyKQorCQkJCQkvLyBmb3IgY29uZmlndXJhdGlvbiBvZiByZW1vdGUgQ04KKwkJCQkJdWlTaXplID0gNDsKKwkJCQkJRXBsUmV0ID0KKwkJCQkJICAgIEVwbEFwaVJlYWRPYmplY3QoTlVMTCwgMCwgMHgxMDA2LAorCQkJCQkJCSAgICAgMHgwMCwKKwkJCQkJCQkgICAgICZkd19sZV9DeWNsZUxlbl9nLAorCQkJCQkJCSAgICAgJnVpU2l6ZSwKKwkJCQkJCQkgICAgIGtFcGxTZG9UeXBlQXNuZCwKKwkJCQkJCQkgICAgIE5VTEwpOworCQkJCQlpZiAoRXBsUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CS8vIGxvY2FsIE9EIGFjY2VzcyBmYWlsZWQKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCS8vIGNvbnRpbnVlCisJCQkJfQorCisJCQljYXNlIGtFcGxObXRNc1ByZU9wZXJhdGlvbmFsMToKKwkJCQl7CisJCQkJCXByaW50aworCQkJCQkgICAgKCJBcHBDYkV2ZW50KDB4JVgpIG9yaWdpbmF0aW5nIGV2ZW50ID0gMHglWFxuIiwKKwkJCQkJICAgICBwRXZlbnRBcmdfcC0+bV9ObXRTdGF0ZUNoYW5nZS4KKwkJCQkJICAgICBtX05ld05tdFN0YXRlLAorCQkJCQkgICAgIHBFdmVudEFyZ19wLT5tX05tdFN0YXRlQ2hhbmdlLgorCQkJCQkgICAgIG1fTm10RXZlbnQpOworCisJCQkJCS8vIGNvbnRpbnVlCisJCQkJfQorCisJCQljYXNlIGtFcGxObXRHc0luaXRpYWxpc2luZzoKKwkJCWNhc2Uga0VwbE5tdEdzUmVzZXRBcHBsaWNhdGlvbjoKKwkJCWNhc2Uga0VwbE5tdE1zTm90QWN0aXZlOgorCQkJY2FzZSBrRXBsTm10Q3NOb3RBY3RpdmU6CisJCQljYXNlIGtFcGxObXRDc1ByZU9wZXJhdGlvbmFsMToKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJY2FzZSBrRXBsTm10Q3NPcGVyYXRpb25hbDoKKwkJCWNhc2Uga0VwbE5tdE1zT3BlcmF0aW9uYWw6CisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKy8qCisgICAgICAgICAgICBzd2l0Y2ggKHBFdmVudEFyZ19wLT5tX05tdFN0YXRlQ2hhbmdlLm1fTm10RXZlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBrRXBsTm10RXZlbnRTd1Jlc2V0OgorICAgICAgICAgICAgICAgIGNhc2Uga0VwbE5tdEV2ZW50UmVzZXROb2RlOgorICAgICAgICAgICAgICAgIGNhc2Uga0VwbE5tdEV2ZW50UmVzZXRDb206CisgICAgICAgICAgICAgICAgY2FzZSBrRXBsTm10RXZlbnRSZXNldENvbmZpZzoKKyAgICAgICAgICAgICAgICBjYXNlIGtFcGxObXRFdmVudEludGVybkNvbUVycm9yOgorICAgICAgICAgICAgICAgIGNhc2Uga0VwbE5tdEV2ZW50Tm10Q3ljbGVFcnJvcjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByaW50aygiQXBwQ2JFdmVudCgweCVYKSBvcmlnaW5hdGluZyBldmVudCA9IDB4JVhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXZlbnRBcmdfcC0+bV9ObXRTdGF0ZUNoYW5nZS5tX05ld05tdFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV2ZW50QXJnX3AtPm1fTm10U3RhdGVDaGFuZ2UubV9ObXRFdmVudCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisqLworCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbEFwaUV2ZW50Q3JpdGljYWxFcnJvcjoKKwljYXNlIGtFcGxBcGlFdmVudFdhcm5pbmc6CisJCXsJCS8vIGVycm9yIG9yIHdhcm5pbmcgb2NjdXJlZCB3aXRoaW4gdGhlIHN0YWNrIG9yIHRoZSBhcHBsaWNhdGlvbgorCQkJLy8gb24gZXJyb3IgdGhlIEFQSSBsYXllciBzdG9wcyB0aGUgTk1UIHN0YXRlIG1hY2hpbmUKKworCQkJcHJpbnRrCisJCQkgICAgKCJBcHBDYkV2ZW50KEVyci9XYXJuKTogU291cmNlPSUwMlggRXBsRXJyb3I9MHglMDNYIiwKKwkJCSAgICAgcEV2ZW50QXJnX3AtPm1fSW50ZXJuYWxFcnJvci5tX0V2ZW50U291cmNlLAorCQkJICAgICBwRXZlbnRBcmdfcC0+bV9JbnRlcm5hbEVycm9yLm1fRXBsRXJyb3IpOworCQkJLy8gY2hlY2sgYWRkaXRpb25hbCBhcmd1bWVudAorCQkJc3dpdGNoIChwRXZlbnRBcmdfcC0+bV9JbnRlcm5hbEVycm9yLm1fRXZlbnRTb3VyY2UpIHsKKwkJCWNhc2Uga0VwbEV2ZW50U291cmNlRXZlbnRrOgorCQkJY2FzZSBrRXBsRXZlbnRTb3VyY2VFdmVudHU6CisJCQkJewkvLyBlcnJvciBvY2N1cmVkIHdpdGhpbiBldmVudCBwcm9jZXNzaW5nCisJCQkJCS8vIGVpdGhlciBpbiBrZXJuZWwgb3IgaW4gdXNlciBwYXJ0CisJCQkJCXByaW50aygiIE9yZ1NvdXJjZT0lMDJYXG4iLAorCQkJCQkgICAgICAgcEV2ZW50QXJnX3AtPm1fSW50ZXJuYWxFcnJvci4KKwkJCQkJICAgICAgIG1fQXJnLm1fRXZlbnRTb3VyY2UpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWNhc2Uga0VwbEV2ZW50U291cmNlRGxsazoKKwkJCQl7CS8vIGVycm9yIG9jY3VyZWQgd2l0aGluIHRoZSBkYXRhIGxpbmsgbGF5ZXIgKGUuZy4gaW50ZXJydXB0IHByb2Nlc3NpbmcpCisJCQkJCS8vIHRoZSBEV09SRCBhcmd1bWVudCBjb250YWlucyB0aGUgRExMIHN0YXRlIGFuZCB0aGUgTk1UIGV2ZW50CisJCQkJCXByaW50aygiIHZhbD0lbFhcbiIsCisJCQkJCSAgICAgICBwRXZlbnRBcmdfcC0+bV9JbnRlcm5hbEVycm9yLgorCQkJCQkgICAgICAgbV9BcmcubV9kd0FyZyk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCXByaW50aygiXG4iKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0KKworCWNhc2Uga0VwbEFwaUV2ZW50Tm9kZToKKwkJeworLy8gICAgICAgICAgICBwcmludGsoIkFwcENiRXZlbnQoTm9kZSk6IFNvdXJjZT0lMDJYIEVwbEVycm9yPTB4JTAzWCIsIHBFdmVudEFyZ19wLT5tX0ludGVybmFsRXJyb3IubV9FdmVudFNvdXJjZSwgcEV2ZW50QXJnX3AtPm1fSW50ZXJuYWxFcnJvci5tX0VwbEVycm9yKTsKKwkJCS8vIGNoZWNrIGFkZGl0aW9uYWwgYXJndW1lbnQKKwkJCXN3aXRjaCAocEV2ZW50QXJnX3AtPm1fTm9kZS5tX05vZGVFdmVudCkgeworCQkJY2FzZSBrRXBsTm10Tm9kZUV2ZW50Q2hlY2tDb25mOgorCQkJCXsKKwkJCQkJdEVwbFNkb0NvbUNvbkhkbCBTZG9Db21Db25IZGw7CisJCQkJCS8vIHVwZGF0ZSBvYmplY3QgMHgxMDA2IG9uIENOCisJCQkJCUVwbFJldCA9CisJCQkJCSAgICBFcGxBcGlXcml0ZU9iamVjdCgmU2RvQ29tQ29uSGRsLAorCQkJCQkJCSAgICAgIHBFdmVudEFyZ19wLT4KKwkJCQkJCQkgICAgICBtX05vZGUubV91aU5vZGVJZCwKKwkJCQkJCQkgICAgICAweDEwMDYsIDB4MDAsCisJCQkJCQkJICAgICAgJmR3X2xlX0N5Y2xlTGVuX2csCisJCQkJCQkJICAgICAgNCwKKwkJCQkJCQkgICAgICBrRXBsU2RvVHlwZUFzbmQsCisJCQkJCQkJICAgICAgTlVMTCk7CisJCQkJCWlmIChFcGxSZXQgPT0ga0VwbEFwaVRhc2tEZWZlcnJlZCkgewkvLyBTRE8gdHJhbnNmZXIgc3RhcnRlZAorCQkJCQkJRXBsUmV0ID0ga0VwbFJlamVjdDsKKwkJCQkJfSBlbHNlIGlmIChFcGxSZXQgPT0ga0VwbFN1Y2Nlc3NmdWwpIHsJLy8gbG9jYWwgT0QgYWNjZXNzIChzaG91bGQgbm90IG9jY3VyKQorCQkJCQkJcHJpbnRrCisJCQkJCQkgICAgKCJBcHBDYkV2ZW50KE5vZGUpIHdyaXRlIHRvIGxvY2FsIE9EXG4iKTsKKwkJCQkJfSBlbHNlIHsJLy8gZXJyb3Igb2NjdXJlZAorCQkJCQkJVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoMSk7CisKKwkJCQkJCUVwbFJldCA9CisJCQkJCQkgICAgRXBsQXBpRnJlZVNkb0NoYW5uZWwKKwkJCQkJCSAgICAoU2RvQ29tQ29uSGRsKTsKKwkJCQkJCVNkb0NvbUNvbkhkbCA9IDA7CisKKwkJCQkJCUVwbFJldCA9CisJCQkJCQkgICAgRXBsQXBpV3JpdGVPYmplY3QKKwkJCQkJCSAgICAoJlNkb0NvbUNvbkhkbCwKKwkJCQkJCSAgICAgcEV2ZW50QXJnX3AtPm1fTm9kZS4KKwkJCQkJCSAgICAgbV91aU5vZGVJZCwgMHgxMDA2LCAweDAwLAorCQkJCQkJICAgICAmZHdfbGVfQ3ljbGVMZW5fZywgNCwKKwkJCQkJCSAgICAga0VwbFNkb1R5cGVBc25kLCBOVUxMKTsKKwkJCQkJCWlmIChFcGxSZXQgPT0ga0VwbEFwaVRhc2tEZWZlcnJlZCkgewkvLyBTRE8gdHJhbnNmZXIgc3RhcnRlZAorCQkJCQkJCUVwbFJldCA9IGtFcGxSZWplY3Q7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXByaW50aworCQkJCQkJCSAgICAoIkFwcENiRXZlbnQoTm9kZSk6IEVwbEFwaVdyaXRlT2JqZWN0KCkgcmV0dXJuZWQgMHglMDJYXG4iLAorCQkJCQkJCSAgICAgRXBsUmV0KTsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQl7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwljYXNlIGtFcGxBcGlFdmVudFNkbzoKKwkJewkJLy8gU0RPIHRyYW5zZmVyIGZpbmlzaGVkCisJCQlFcGxSZXQgPQorCQkJICAgIEVwbEFwaUZyZWVTZG9DaGFubmVsKHBFdmVudEFyZ19wLT5tX1Nkby4KKwkJCQkJCSBtX1Nkb0NvbUNvbkhkbCk7CisJCQlpZiAoRXBsUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSB7CisJCQkJYnJlYWs7CisJCQl9CisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisJCQlpZiAocEV2ZW50QXJnX3AtPm1fU2RvLm1fU2RvQ29tQ29uU3RhdGUgPT0ga0VwbFNkb0NvbVRyYW5zZmVyRmluaXNoZWQpIHsJLy8gY29udGludWUgYm9vdC11cCBvZiBDTiB3aXRoIE5NVCBjb21tYW5kIFJlc2V0IENvbmZpZ3VyYXRpb24KKwkJCQlFcGxSZXQgPQorCQkJCSAgICBFcGxBcGlNblRyaWdnZXJTdGF0ZUNoYW5nZShwRXZlbnRBcmdfcC0+CisJCQkJCQkJICAgICAgIG1fU2RvLm1fdWlOb2RlSWQsCisJCQkJCQkJICAgICAgIGtFcGxObXROb2RlQ29tbWFuZENvbmZSZXNldCk7CisJCQl9IGVsc2UgewkvLyBpbmRpY2F0ZSBjb25maWd1cmF0aW9uIGVycm9yIENOCisJCQkJRXBsUmV0ID0KKwkJCQkgICAgRXBsQXBpTW5UcmlnZ2VyU3RhdGVDaGFuZ2UocEV2ZW50QXJnX3AtPgorCQkJCQkJCSAgICAgICBtX1Nkby5tX3VpTm9kZUlkLAorCQkJCQkJCSAgICAgICBrRXBsTm10Tm9kZUNvbW1hbmRDb25mRXJyKTsKKwkJCX0KKyNlbmRpZgorCisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIEVwbFJldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGdW5jdGlvbjogICAgQXBwQ2JTeW5jCisvLworLy8gRGVzY3JpcHRpb246IHN5bmMgZXZlbnQgY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIGJ5IGV2ZW50IG1vZHVsZSB3aXRoaW4KKy8vICAgICAgICAgICAgICBrZXJuZWwgcGFydCAoaGlnaCBwcmlvcml0eSkuCisvLyAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBvdXRwdXRzLCByZWFkcyB0aGUgaW5wdXRzIGFuZCBydW5zCisvLyAgICAgICAgICAgICAgdGhlIGNvbnRyb2wgbG9vcC4KKy8vCisvLyBQYXJhbWV0ZXJzOiAgdm9pZAorLy8KKy8vIFJldHVybnM6ICAgICB0RXBsS2VybmVsICAgICAgPSBlcnJvciBjb2RlLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtFcGxTdWNjZXNzZnVsID0gbm8gZXJyb3IKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UgPSBwb3N0IGVycm9yIGV2ZW50IHRvIEFQSSBsYXllcgorLy8KKy8vIFN0YXRlOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEFwcENiU3luYyh2b2lkKQoreworCXRFcGxLZXJuZWwgRXBsUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CisKKwlpZiAoYlZhck91dDFPbGRfbCAhPSBiVmFyT3V0MV9sKSB7CS8vIG91dHB1dCB2YXJpYWJsZSBoYXMgY2hhbmdlZAorCQliVmFyT3V0MU9sZF9sID0gYlZhck91dDFfbDsKKwkJLy8gc2V0IExFRHMKKworLy8gICAgICAgIHByaW50aygiYlZhckluID0gMHglMDJYIGJWYXJPdXQgPSAweCUwMlhcbiIsIChXT1JEKSBiVmFySW5fbCwgKFdPUkQpIGJWYXJPdXRfbCk7CisJfQorCWlmICh1aU5vZGVJZF9nICE9IEVQTF9DX0FEUl9NTl9ERUZfTk9ERV9JRCkgeworCQliVmFySW4xX2wrKzsKKwl9CisKKwlpZiAodWlOb2RlSWRfZyA9PSBFUExfQ19BRFJfTU5fREVGX05PREVfSUQpIHsJLy8gd2UgYXJlIHRoZSBtYXN0ZXIgYW5kIG11c3QgcnVuIHRoZSBjb250cm9sIGxvb3AKKworCQkvLyBjb2xsZWN0IGlucHV0cyBmcm9tIENOcyBhbmQgb3duIGlucHV0CisJCWJTcGVlZFNlbGVjdF9sID0gKGJWYXJJbjFfbCB8IGFiU2VsZWN0X2xbMF0pICYgMHgwNzsKKworCQliTW9kZVNlbGVjdF9sID0gYWJTZWxlY3RfbFsxXSB8IGFiU2VsZWN0X2xbMl07CisKKwkJaWYgKChiTW9kZVNlbGVjdF9sICYgQVBQX01PREVfTUFTSykgIT0gMCkgeworCQkJZHdNb2RlX2wgPSBiTW9kZVNlbGVjdF9sICYgQVBQX01PREVfTUFTSzsKKwkJfQorCisJCWlDdXJDeWNsZUNvdW50X2wtLTsKKworCQlpZiAoaUN1ckN5Y2xlQ291bnRfbCA8PSAwKSB7CisJCQlpZiAoKGR3TW9kZV9sICYgMHgwMSkgIT0gMCkgewkvLyBmaWxsLXVwCisJCQkJaWYgKGlUb2dnbGUpIHsKKwkJCQkJaWYgKChkd0xlZHNfbCAmIEFQUF9ET1VCTEVfTEVEX01BU0spID09CisJCQkJCSAgICAweDAwKSB7CisJCQkJCQlkd0xlZHNfbCA9IDB4MDE7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlkd0xlZHNfbCA8PD0gMTsKKwkJCQkJCWR3TGVkc19sKys7CisJCQkJCQlpZiAoZHdMZWRzX2wgPj0KKwkJCQkJCSAgICBBUFBfRE9VQkxFX0xFRF9NQVNLKSB7CisJCQkJCQkJaVRvZ2dsZSA9IDA7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlkd0xlZHNfbCA8PD0gMTsKKwkJCQkJaWYgKChkd0xlZHNfbCAmIEFQUF9ET1VCTEVfTEVEX01BU0spID09CisJCQkJCSAgICAweDAwKSB7CisJCQkJCQlpVG9nZ2xlID0gMTsKKwkJCQkJfQorCQkJCX0KKwkJCQliTGVkc1JvdzFfbCA9CisJCQkJICAgICh1bnNpZ25lZCBjaGFyKShkd0xlZHNfbCAmIEFQUF9MRURfTUFTSyk7CisJCQkJYkxlZHNSb3cyX2wgPQorCQkJCSAgICAodW5zaWduZWQgY2hhcikoKGR3TGVkc19sID4+IEFQUF9MRURfQ09VTlQpCisJCQkJCQkgICAgJiBBUFBfTEVEX01BU0spOworCQkJfQorCisJCQllbHNlIGlmICgoZHdNb2RlX2wgJiAweDAyKSAhPSAwKSB7CS8vIHJ1bm5pbmcgbGlnaHQgZm9yd2FyZAorCQkJCWR3TGVkc19sIDw8PSAxOworCQkJCWlmICgoZHdMZWRzX2wgPiBBUFBfRE9VQkxFX0xFRF9NQVNLKQorCQkJCSAgICB8fCAoZHdMZWRzX2wgPT0gMHgwMDAwMDAwMEwpKSB7CisJCQkJCWR3TGVkc19sID0gMHgwMTsKKwkJCQl9CisJCQkJYkxlZHNSb3cxX2wgPQorCQkJCSAgICAodW5zaWduZWQgY2hhcikoZHdMZWRzX2wgJiBBUFBfTEVEX01BU0spOworCQkJCWJMZWRzUm93Ml9sID0KKwkJCQkgICAgKHVuc2lnbmVkIGNoYXIpKChkd0xlZHNfbCA+PiBBUFBfTEVEX0NPVU5UKQorCQkJCQkJICAgICYgQVBQX0xFRF9NQVNLKTsKKwkJCX0KKworCQkJZWxzZSBpZiAoKGR3TW9kZV9sICYgMHgwNCkgIT0gMCkgewkvLyBydW5uaW5nIGxpZ2h0IGJhY2t3YXJkCisJCQkJZHdMZWRzX2wgPj49IDE7CisJCQkJaWYgKChkd0xlZHNfbCA+IEFQUF9ET1VCTEVfTEVEX01BU0spCisJCQkJICAgIHx8IChkd0xlZHNfbCA9PSAweDAwMDAwMDAwTCkpIHsKKwkJCQkJZHdMZWRzX2wgPSAxIDw8IChBUFBfTEVEX0NPVU5UICogMik7CisJCQkJfQorCQkJCWJMZWRzUm93MV9sID0KKwkJCQkgICAgKHVuc2lnbmVkIGNoYXIpKGR3TGVkc19sICYgQVBQX0xFRF9NQVNLKTsKKwkJCQliTGVkc1JvdzJfbCA9CisJCQkJICAgICh1bnNpZ25lZCBjaGFyKSgoZHdMZWRzX2wgPj4gQVBQX0xFRF9DT1VOVCkKKwkJCQkJCSAgICAmIEFQUF9MRURfTUFTSyk7CisJCQl9CisKKwkJCWVsc2UgaWYgKChkd01vZGVfbCAmIDB4MDgpICE9IDApIHsJLy8gS25pZ2h0cmlkZXIKKwkJCQlpZiAoYkxlZHNSb3cxX2wgPT0gMHgwMCkgeworCQkJCQliTGVkc1JvdzFfbCA9IDB4MDE7CisJCQkJCWlUb2dnbGUgPSAxOworCQkJCX0gZWxzZSBpZiAoaVRvZ2dsZSkgeworCQkJCQliTGVkc1JvdzFfbCA8PD0gMTsKKwkJCQkJaWYgKGJMZWRzUm93MV9sID49CisJCQkJCSAgICAoMSA8PCAoQVBQX0xFRF9DT1VOVCAtIDEpKSkgeworCQkJCQkJaVRvZ2dsZSA9IDA7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQliTGVkc1JvdzFfbCA+Pj0gMTsKKwkJCQkJaWYgKGJMZWRzUm93MV9sIDw9IDB4MDEpIHsKKwkJCQkJCWlUb2dnbGUgPSAxOworCQkJCQl9CisJCQkJfQorCQkJCWJMZWRzUm93Ml9sID0gYkxlZHNSb3cxX2w7CisJCQl9CisKKwkJCWVsc2UgaWYgKChkd01vZGVfbCAmIDB4MTApICE9IDApIHsJLy8gS25pZ2h0cmlkZXIKKwkJCQlpZiAoKGJMZWRzUm93MV9sID09IDB4MDApCisJCQkJICAgIHx8IChiTGVkc1JvdzJfbCA9PSAweDAwKQorCQkJCSAgICB8fCAoKGJMZWRzUm93Ml9sICYgfkFQUF9MRURfTUFTSykgIT0gMCkpIHsKKwkJCQkJYkxlZHNSb3cxX2wgPSAweDAxOworCQkJCQliTGVkc1JvdzJfbCA9CisJCQkJCSAgICAoMSA8PCAoQVBQX0xFRF9DT1VOVCAtIDEpKTsKKwkJCQkJaVRvZ2dsZSA9IDE7CisJCQkJfSBlbHNlIGlmIChpVG9nZ2xlKSB7CisJCQkJCWJMZWRzUm93MV9sIDw8PSAxOworCQkJCQliTGVkc1JvdzJfbCA+Pj0gMTsKKwkJCQkJaWYgKGJMZWRzUm93MV9sID49CisJCQkJCSAgICAoMSA8PCAoQVBQX0xFRF9DT1VOVCAtIDEpKSkgeworCQkJCQkJaVRvZ2dsZSA9IDA7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQliTGVkc1JvdzFfbCA+Pj0gMTsKKwkJCQkJYkxlZHNSb3cyX2wgPDw9IDE7CisJCQkJCWlmIChiTGVkc1JvdzFfbCA8PSAweDAxKSB7CisJCQkJCQlpVG9nZ2xlID0gMTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCS8vIHNldCBvd24gb3V0cHV0CisJCQliVmFyT3V0MV9sID0gYkxlZHNSb3cxX2w7CisvLyAgICAgICAgICAgIGJWYXJPdXQxX2wgPSAoYkxlZHNSb3cxX2wgJiAweDAzKSB8IChiTGVkc1JvdzJfbCA8PCAyKTsKKworCQkJLy8gcmVzdGFydCBjeWNsZSBjb3VudGVyCisJCQlpQ3VyQ3ljbGVDb3VudF9sID0gaU1heEN5Y2xlQ291bnRfbDsKKwkJfQorCisJCWlmIChiU3BlZWRTZWxlY3RPbGRfbCA9PSAwKSB7CisJCQlpZiAoKGJTcGVlZFNlbGVjdF9sICYgMHgwMSkgIT0gMCkgeworCQkJCWlmIChpTWF4Q3ljbGVDb3VudF9sIDwgMjAwKSB7CisJCQkJCWlNYXhDeWNsZUNvdW50X2wrKzsKKwkJCQl9CisJCQkJYlNwZWVkU2VsZWN0T2xkX2wgPSBiU3BlZWRTZWxlY3RfbDsKKwkJCX0gZWxzZSBpZiAoKGJTcGVlZFNlbGVjdF9sICYgMHgwMikgIT0gMCkgeworCQkJCWlmIChpTWF4Q3ljbGVDb3VudF9sID4gMSkgeworCQkJCQlpTWF4Q3ljbGVDb3VudF9sLS07CisJCQkJfQorCQkJCWJTcGVlZFNlbGVjdE9sZF9sID0gYlNwZWVkU2VsZWN0X2w7CisJCQl9IGVsc2UgaWYgKChiU3BlZWRTZWxlY3RfbCAmIDB4MDQpICE9IDApIHsKKwkJCQlpTWF4Q3ljbGVDb3VudF9sID0gREVGQVVMVF9NQVhfQ1lDTEVfQ09VTlQ7CisJCQkJYlNwZWVkU2VsZWN0T2xkX2wgPSBiU3BlZWRTZWxlY3RfbDsKKwkJCX0KKwkJfSBlbHNlIGlmIChiU3BlZWRTZWxlY3RfbCA9PSAwKSB7CisJCQliU3BlZWRTZWxlY3RPbGRfbCA9IDA7CisJCX0KKwl9CisKKwlUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgxKTsKKworCXJldHVybiBFcGxSZXQ7Cit9CisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9lZHJ2LmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2VkcnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDU5ODRkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9lZHJ2LmgKQEAgLTAsMCArMSwxNjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbnRlcmZhY2UgZm9yIGV0aGVybmV0ZHJpdmVyCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogZWRydi5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgIERldiBDKysgYW5kIEdOVS1Db21waWxlciBmb3IgbTY4aworCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDUvMDgvMDEgbS5iLjogICBzdGFydCBvZiBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FRFJWX0hfCisjZGVmaW5lIF9FRFJWX0hfCisKKyNpbmNsdWRlICJFcGxJbmMuaCIKKyNpbmNsdWRlICJFcGxGcmFtZS5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIE1BWF9FVEhfREFUQV9TSVpFICAgICAgIDE1MDAKKyNkZWZpbmUgTUlOX0VUSF9EQVRBX1NJWkUgICAgICAgICA0NgorCisjZGVmaW5lIEVUSF9IRFJfT0ZGU0VUIAkgMAkvLyBFdGhlcm5ldCBoZWFkZXIgYXQgdGhlIHRvcCBvZiB0aGUgZnJhbWUKKyNkZWZpbmUgRVRIX0hEUl9TSVpFCTE0CS8vIHNpemUgb2YgRXRoZXJuZXQgaGVhZGVyCisjZGVmaW5lIE1JTl9FVEhfU0laRSAgICAgKE1JTl9FVEhfREFUQV9TSVpFICsgRVRIX0hEUl9TSVpFKQkvLyB3aXRob3V0IENSQworCisjZGVmaW5lIEVUSF9DUkNfU0laRQkgNAkvLyBzaXplIG9mIEV0aGVybmV0IENSQywgaS5lLiBGQ1MKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBwb3NpdGlvbiBvZiBhIGJ1ZmZlciBpbiBhbiBldGhlcm5ldC1mcmFtZQordHlwZWRlZiBlbnVtIHsKKwlrRWRydkJ1ZmZlckZpcnN0SW5GcmFtZSA9IDB4MDEsCS8vIGZpcnN0IGRhdGEgYnVmZmVyIGluIGFuIGV0aGVybmV0IGZyYW1lCisJa0VkcnZCdWZmZXJNaWRkbGVJbkZyYW1lID0gMHgwMiwJLy8gYSBtaWRkbGUgZGF0YSBidWZmZXIgaW4gYW4gZXRoZXJuZXQgZnJhbWUKKwlrRWRydkJ1ZmZlckxhc3RJbkZyYW1lID0gMHgwNAkvLyBsYXN0IGRhdGEgYnVmZmVyIGluIGFuIGV0aGVybmV0IGZyYW1lCit9IHRFZHJ2QnVmZmVySW5GcmFtZTsKKworLy8gZm9ybWF0IG9mIGEgdHgtYnVmZmVyCit0eXBlZGVmIHN0cnVjdCBfdEVkcnZUeEJ1ZmZlciB7CisJdEVwbE1zZ1R5cGUgbV9FcGxNc2dUeXBlOwkvLyBJTjogdHlwZSBvZiBFUEwgbWVzc2FnZSwgc2V0IGJ5IGNhbGxpbmcgZnVuY3Rpb24KKwl1bnNpZ25lZCBpbnQgbV91aVR4TXNnTGVuOwkvLyBJTjogbGVuZ3RoIG9mIG1lc3NhZ2UgdG8gYmUgc2VuZCAoc2V0IGZvciBlYWNoIHRyYW5zbWl0IGNhbGwpCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCXVuc2lnbmVkIGludCBtX3VpQnVmZmVyTnVtYmVyOwkvLyBPVVQ6IG51bWJlciBvZiB0aGUgYnVmZmVyLCBzZXQgYnkgZXRoZXJuZXRkcml2ZXIKKwlCWVRFICptX3BiQnVmZmVyOwkvLyBPVVQ6IHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciwgc2V0IGJ5IGV0aGVybmV0ZHJpdmVyCisJdEVwbE5ldFRpbWUgbV9OZXRUaW1lOwkvLyBPVVQ6IFRpbWVzdGFtcCBvZiBlbmQgb2YgdHJhbnNtaXNzaW9uLCBzZXQgYnkgZXRoZXJuZXRkcml2ZXIKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJdW5zaWduZWQgaW50IG1fdWlNYXhCdWZmZXJMZW47CS8vIElOL09VVDogbWF4aW11bSBsZW5ndGggb2YgdGhlIGJ1ZmZlcgorfSB0RWRydlR4QnVmZmVyOworCisvLyBmb3JtYXQgb2YgYSByeC1idWZmZXIKK3R5cGVkZWYgc3RydWN0IF90RWRydlJ4QnVmZmVyIHsKKwl0RWRydkJ1ZmZlckluRnJhbWUgbV9CdWZmZXJJbkZyYW1lOwkvLyBPVVQgcG9zaXRpb24gb2YgcmVjZWl2ZWQgYnVmZmVyIGluIGFuIGV0aGVybmV0LWZyYW1lCisJdW5zaWduZWQgaW50IG1fdWlSeE1zZ0xlbjsJLy8gT1VUOiBsZW5ndGggb2YgcmVjZWl2ZWQgYnVmZmVyICh3aXRob3V0IENSQykKKwlCWVRFICptX3BiQnVmZmVyOwkvLyBPVVQ6IHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciwgc2V0IGJ5IGV0aGVybmV0ZHJpdmVyCisJdEVwbE5ldFRpbWUgbV9OZXRUaW1lOwkvLyBPVVQ6IFRpbWVzdGFtcCBvZiBlbmQgb2YgcmVjZWlwdGlvbgorCit9IHRFZHJ2UnhCdWZmZXI7CisKKy8vdHlwZWRlZiB2b2lkICgqdEVkcnZSeEhhbmRsZXIpIChCWVRFIGJCdWZmZXJJbkZyYW1lX3AsIHRCdWZmZXJEZXNjciAqIHBiQnVmZmVyX3ApOworLy90eXBlZGVmIHZvaWQgKCp0RWRydlJ4SGFuZGxlcikgKEJZVEUgYkJ1ZmZlckluRnJhbWVfcCwgQllURSAqIHBiRXRoZXJuZXREYXRhX3AsIFdPUkQgd0RhdGFMZW5fcCk7Cit0eXBlZGVmIHZvaWQgKCp0RWRydlJ4SGFuZGxlcikgKHRFZHJ2UnhCdWZmZXIgKiBwUnhCdWZmZXJfcCk7Cit0eXBlZGVmIHZvaWQgKCp0RWRydlR4SGFuZGxlcikgKHRFZHJ2VHhCdWZmZXIgKiBwVHhCdWZmZXJfcCk7CisKKy8vIGZvcm1hdCBvZiBpbml0IHN0cnVjdHVyZQordHlwZWRlZiBzdHJ1Y3QgeworCUJZVEUgbV9hYk15TWFjQWRkcls2XTsJLy8gdGhlIG93biBNQUMgYWRkcmVzcworCisvLyAgICBCWVRFICAgICAgICAgICAgbV9iTm9PZlJ4QnVmZkRlc2NyOyAgICAgLy8gbnVtYmVyIG9mIGVudHJpZXMgaW4gcnggYnVmZmVyZGVzY3JpcHRvciB0YWJsZQorLy8gICAgdEJ1ZmZlckRlc2NyICogIG1fcFJ4QnVmZkRlc2NyVGFibGU7ICAgIC8vIHJ4IGJ1ZmZlcmRlc2NyaXB0b3IgdGFibGUKKy8vICAgIFdPUkQgICAgICAgICAgICBtX3dSeEJ1ZmZlclNpemU7ICAgICAgICAvLyBzaXplIG9mIHRoZSB3aG9sZSByeCBidWZmZXIKKworCXRFZHJ2UnhIYW5kbGVyIG1fcGZuUnhIYW5kbGVyOworCXRFZHJ2VHhIYW5kbGVyIG1fcGZuVHhIYW5kbGVyOworCit9IHRFZHJ2SW5pdFBhcmFtOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFZHJ2SW5pdCh0RWRydkluaXRQYXJhbSAqIHBFZHJ2SW5pdFBhcmFtX3ApOworCit0RXBsS2VybmVsIEVkcnZTaHV0ZG93bih2b2lkKTsKKwordEVwbEtlcm5lbCBFZHJ2RGVmaW5lUnhNYWNBZGRyRW50cnkoQllURSAqIHBiTWFjQWRkcl9wKTsKK3RFcGxLZXJuZWwgRWRydlVuZGVmaW5lUnhNYWNBZGRyRW50cnkoQllURSAqIHBiTWFjQWRkcl9wKTsKKworLy90RXBsS2VybmVsIEVkcnZEZWZpbmVVbmljYXN0RW50cnkgICAgIChCWVRFICogcGJVQ0VudHJ5X3ApOworLy90RXBsS2VybmVsIEVkcnZVbmRmaW5lVW5pY2FzdEVudHJ5ICAgIChCWVRFICogcGJVQ0VudHJ5X3ApOworCit0RXBsS2VybmVsIEVkcnZBbGxvY1R4TXNnQnVmZmVyKHRFZHJ2VHhCdWZmZXIgKiBwQnVmZmVyX3ApOwordEVwbEtlcm5lbCBFZHJ2UmVsZWFzZVR4TXNnQnVmZmVyKHRFZHJ2VHhCdWZmZXIgKiBwQnVmZmVyX3ApOworCisvL3RFcGxLZXJuZWwgRWRydldyaXRlTXNnICAgICAgICAgICAgICAgKHRCdWZmZXJEZXNjciAqIHBiQnVmZmVyX3ApOwordEVwbEtlcm5lbCBFZHJ2U2VuZFR4TXNnKHRFZHJ2VHhCdWZmZXIgKiBwQnVmZmVyX3ApOwordEVwbEtlcm5lbCBFZHJ2VHhNc2dSZWFkeSh0RWRydlR4QnVmZmVyICogcEJ1ZmZlcl9wKTsKK3RFcGxLZXJuZWwgRWRydlR4TXNnU3RhcnQodEVkcnZUeEJ1ZmZlciAqIHBCdWZmZXJfcCk7CisKKy8vdEVwbEtlcm5lbCBFZHJ2UmVhZE1zZyAgICAgICAgICAgICAgICAodm9pZCk7CisKKy8vIGludGVycnVwdCBoYW5kbGVyIGNhbGxlZCBieSB0YXJnZXQgc3BlY2lmaWMgaW50ZXJydXB0IGhhbmRsZXIKK3ZvaWQgRWRydkludGVycnVwdEhhbmRsZXIodm9pZCk7CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FRFJWX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL2dsb2JhbC5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9nbG9iYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTE2NzE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9nbG9iYWwuaApAQCAtMCwwICsxLDEzOTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBnbG9iYWwgcHJvamVjdCBkZWZpbml0aW9uIGZpbGUKKworICAgIDEyLjA2LjE5OTggICAtcnMKKyAgICAxMS4wMi4yMDAyICAgci5kLiBFcndlaXRlcnVuZ2VuLCBFcmdhZW56dW5nZW4KKyAgICAyMC4wOC4yMDAyICAgU1lTIFRFQyBlbGVjdHJvbmljIC1hcworICAgICAgICAgICAgICAgICBEZWZpbml0aW9uIFNjaGx1ZXNzZWx3b3J0ICdHRU5FUklDJworICAgICAgICAgICAgICAgICBmdWVyIGRhcyBFcnpldWdlbiB2b24gR2VuZXJpYyBQb2ludGVyCisgICAgMjguMDguMjAwMiAgIHIuZC4gZXJ3ZWl0ZXJ0ZXIgU1lTIFRFQyBEZWJ1ZyBDb2RlCisgICAgMTYuMDkuMjAwMiAgIHIuZC4ga29tcGxldHRlIFVlYmVyc2V0enVuZyBpbiBFbmdsaXNjaAorICAgIDExLjA0LjIwMDMgICBmLmouIEVyZ2Flbnp1bmcgZnVlciBNaXRzdWJpc2hpIE5DMzAgQ29tcGlsZXIKKyAgICAxNy4wNi4yMDAzICAgLXJzICBEZWZpbml0aW9uIHZvbiBCYXNpc3R5cGVuIGluIDwjaWZuZGVmIF9XSU5ERUZfPiBnZXNldHp0CisgICAgMTYuMDQuMjAwNCAgIHIuZC4gRXJnYWVuenVuZyBmdWVyIEJvcmxhbmQgQysrIEJ1aWxkZXIKKyAgICAzMC4wOC4yMDA0ICAgLXJzICBUUkFDRTUgZWluZ2Vm/Gd0CisgICAgMjMuMTIuMjAwNSAgIGQuay4gRGVmaW5pdGlvbnMgZm9yIElBUiBjb21waWxlcgorCisgICAgJElkOiBnbG9iYWwuaCx2IDEuNiAyMDA4LzExLzA3IDEzOjU1OjU2IEQuS3J1ZWdlciBFeHAgJAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9HTE9CQUxfSF8KKyNkZWZpbmUgX0dMT0JBTF9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIGVsZW1lbnRzIG9mIGRlZmluZXMgZm9yIGRldmVsb3BtZW50IHN5c3RlbQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gdGhlc2UgZGVmaW5lcyBhcmUgbmVjZXNzYXJ5IHRvIGNoZWNrIHNvbWUgb2YgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBkZXZlbG9wbWVudCBzeXN0ZW0KKyNkZWZpbmUgX0RFVl9CSUdFTkRfICAgICAgICAgICAgMHg4MDAwMDAwMEwJLy8gYmlnIGVuZGlhbiAobW90b3JvbGxhIGZvcm1hdCkKKyNkZWZpbmUgX0RFVl9BTElHTk1FTlRfNF8gICAgICAgMHgwMDQwMDAwMEwJLy8gICAgICAgICAgICAgICAgICB0aGUgQ1BVIG5lZWRzIGFsaWdubWVudCBvZiA0IGJ5dGVzCisjZGVmaW5lIF9ERVZfT05MWV9JTlRfTUFJTl8gICAgIDB4MDAwMDQwMDBMCS8vICAgICAgICAgICAgICAgICAgdGhlIGNvbXBpbGVyIG5lZWRzICJpbnQgbWFpbihpbnQpIiBpbnN0ZWFkIG9mICJ2b2lkIG1haW4odm9pZCkiCisjZGVmaW5lIF9ERVZfQ09NTUFfRVhUXyAgICAgICAgIDB4MDAwMDIwMDBMCS8vICAgICAgICAgICAgICAgICAgc3VwcG9ydCBvZiBsYXN0IGNvbW1hIGluIHN0cnVjdCBwcmVkZWZpbml0aW9uCisjZGVmaW5lIF9ERVZfNjRCSVRfU1VQUE9SVF8gICAgIDB4MDAwMDEwMDBMCS8vICAgICAgICAgICAgICAgICAgc3VwcG9ydCBvZiA2NCBiaXQgb3BlcmF0aW9ucworI2RlZmluZSBfREVWX0JJVDY0XyAgICAgICAgICAgICAweDAwMDAwNDAwTAkvLyBjb3VudCBvZiBiaXRzOiAgIDY0IGJpdAorI2RlZmluZSBfREVWX0JJVDMyXyAgICAgICAgICAgICAweDAwMDAwMzAwTAkvLyAgICAgICAgICAgICAgICAgIDMyIGJpdAorI2RlZmluZSBfREVWX0JJVDE2XyAgICAgICAgICAgICAweDAwMDAwMjAwTAkvLyAgICAgICAgICAgICAgICAgIDE2IGJpdAorI2RlZmluZSBfREVWX0JJVDhfICAgICAgICAgICAgICAweDAwMDAwMTAwTAkvLyAgICAgICAgICAgICAgICAgIDggYml0CisjZGVmaW5lIF9ERVZfUlZDVF9BUk1fICAgICAgICAgIDB4MDAwMDAwMUNMCS8vICAgICAgICAgICAgICAgICAgUmVhbFZpZXcgQVJNCisjZGVmaW5lIF9ERVZfUkVORVNBU00zMkMgICAgICAgIDB4MDAwMDAwMUJMCS8vIGNvbXBpbGVyIGZyb206ICAgUmVuZXNhcworI2RlZmluZSBfREVWX0dOVUNfTUlQUzJfICAgICAgICAweDAwMDAwMDFBTAkvLyAgICAgICAgICAgICAgICAgIEdOVSBmb3IgTUlQUzIKKyNkZWZpbmUgX0RFVl9NUExBQl9DMzBfICAgICAgICAgMHgwMDAwMDAxOUwJLy8gICAgICAgICAgICAgICAgICBNUExBQiBDMzAgZm9yIE1pY3JvY2hpcCBkc1BJQzMzRiBzZXJpZXMKKyNkZWZpbmUgX0RFVl9HTlVDX1RDXyAgICAgICAgICAgMHgwMDAwMDAxOEwJLy8gICAgICAgICAgICAgICAgICBHTlUgZm9yIEluZmluZW9uIFRyaUNvcmUKKyNkZWZpbmUgX0RFVl9HTlVDX1g4Nl8gICAgICAgICAgMHgwMDAwMDAxN0wJLy8gICAgICAgICAgICAgICAgICBHTlUgZm9yIEkzODYKKyNkZWZpbmUgX0RFVl9JQVJfQVJNXyAgICAgICAgICAgMHgwMDAwMDAxNkwJLy8gICAgICAgICAgICAgICAgICBBUk0gSUFSIEMvQysrIENvbXBpbGVyCisjZGVmaW5lIF9ERVZfUEFSQURHTV9YODYgICAgICAgIDB4MDAwMDAwMTVMCS8vICAgICAgICAgICAgICAgICAgUGFyYWRpZ20gQy9DKysgZm9yIEJlY2sgMXgzCisjZGVmaW5lIF9ERVZfR05VQ19DRl8gICAgICAgICAgIDB4MDAwMDAwMTRMCS8vICAgICAgICAgICAgICAgICAgR05VIGZvciBDb2xkZmlyZQorI2RlZmluZSBfREVWX0tFSUxfQVJNXyAgICAgICAgICAweDAwMDAwMDEzTAkvLyAgICAgICAgICAgICAgICAgIEtlaWwgQVJNCisjZGVmaW5lIF9ERVZfTVNFVkNfICAgICAgICAgICAgIDB4MDAwMDAwMTJMCS8vICAgICAgICAgICAgICAgICAgTWljcm9zb2Z0IGVtYmVkZGVkIFZpc3VhbCBDL0MrKworI2RlZmluZSBfREVWX0hJR0hURUNfR05VQ19YODZfICAweDAwMDAwMDExTAkvLyAgICAgICAgICAgICAgICAgIEhpZ2h0ZWMgZWxmMzg2IGdjYworI2RlZmluZSBfREVWX01TVkNfUlRYXyAgICAgICAgICAweDAwMDAwMDEwTAkvLyAgICAgICAgICAgICAgICAgIFZDNjAwICsgUlRYCisjZGVmaW5lIF9ERVZfTVNWQ19WMV81XyAgICAgICAgIDB4MDAwMDAwMEZMCS8vICAgICAgICAgICAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBDL0MrKyBWMS41CisjZGVmaW5lIF9ERVZfR05VQ19BUk03XyAgICAgICAgIDB4MDAwMDAwMEVMCS8vICAgICAgICAgICAgICAgICAgR05VIENvbXBpbGVyIGdjYyBmb3IgQVJNNworI2RlZmluZSBfREVWX01FVFJPV0VSS1NfQ1dfICAgICAweDAwMDAwMDBETAkvLyAgICAgICAgICAgICAgICAgIE1ldHJvd2Vya3MgQ29kZSBXYXJyaW9yCisjZGVmaW5lIF9ERVZfTUlUU1VCSVNISU0xNkNfICAgIDB4MDAwMDAwMENMCS8vY29tcGlsZXIgZnJvbTogICAgTWl0c3ViaXNoaQorI2RlZmluZSBfREVWX0dOVUNfQzE2WF8gICAgICAgICAweDAwMDAwMDBCTAkvLyAgICAgICAgICAgICAgICAgIEdOVSBDb21waWxlciBnY2MxNjYgZm9yIEluZmluZW9uIEMxNngKKyNkZWZpbmUgX0RFVl9MSU5VWF9HQ0NfICAgICAgICAgMHgwMDAwMDAwQUwJLy8gICAgICAgICAgICAgICAgICBMaW51eCBHTlUgQ29tcGlsZXIgZ2NjCisjZGVmaW5lIF9ERVZfR05VQ19NUEM1WDUgICAgICAgIDB4MDAwMDAwMDlMCS8vICAgICAgICAgICAgICAgICAgR05VIGZvciBNb3Rvcm9sYSBQUEM1eDUKKyNkZWZpbmUgX0RFVl9UQVNLSU5HTTE2Q18gICAgICAgMHgwMDAwMDAwOEwJLy8gICAgICAgICAgICAgICAgICBUYXNraW5nIGZvciBNaXRzdWJpc2hpIE0xNkMKKyNkZWZpbmUgX0RFVl9GVUpJVFNVXyAgICAgICAgICAgMHgwMDAwMDAwN0wJLy8gICAgICAgICAgICAgICAgICBGdWppdHN1CisjZGVmaW5lIF9ERVZfVEFTS0lORzhfICAgICAgICAgIDB4MDAwMDAwMDZMCS8vICAgICAgICAgICAgICAgICAgVGFza2luZyA4MDUxCisjZGVmaW5lIF9ERVZfVEFTS0lORzE2XyAgICAgICAgIDB4MDAwMDAwMDVMCS8vICAgICAgICAgICAgICAgICAgVGFza2luZyAxNjYKKyNkZWZpbmUgX0RFVl9LRUlMOF8gICAgICAgICAgICAgMHgwMDAwMDAwNEwJLy8gICAgICAgICAgICAgICAgICBLZWlsIEM1MQorI2RlZmluZSBfREVWX0tFSUwxNl8gICAgICAgICAgICAweDAwMDAwMDAzTAkvLyAgICAgICAgICAgICAgICAgIEtlaWwgQzE2NgorI2RlZmluZSBfREVWX0JPUkxBTkRDXyAgICAgICAgICAweDAwMDAwMDAyTAkvLyAgICAgICAgICAgICAgICAgIEJvcmxhbmQgQy9DKysKKyNkZWZpbmUgX0RFVl9NU1ZDMTZfICAgICAgICAgICAgMHgwMDAwMDAwMUwJLy8gICAgICAgICAgICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMvQysrCisjZGVmaW5lIF9ERVZfTVNWQzMyXyAgICAgICAgICAgIDB4MDAwMDAwMDBMCS8vICAgICAgICAgICAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBDL0MrKworCisvLyB0aGVzZSBkZWZpbmVzIGNhbiBiZSB1c2VkIHRvIG1hc2sgcHJldmlvdXMgZWxlbWVudHMKKyNkZWZpbmUgX0RFVl9NQVNLX0NPTVBJTEVSICAgICAgMHgwMDAwMDBGRkwKKyNkZWZpbmUgX0RFVl9NQVNLX0JJVENPVU5UICAgICAgMHgwMDAwMEYwMEwKKyNkZWZpbmUgX0RFVl9NQVNLX0FERFNVUFBPUlQgICAgMHgwMDAwRjAwMEwKKyNkZWZpbmUgX0RFVl9NQVNLX0FMSUdOTUVOVCAgICAgMHgwMEYwMDAwMEwKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBkZWZpbmVzIGZvciBkZXZlbG9wbWVudCBzeXN0ZW0gKERFVl9TWVNURU0pIGluY2x1ZGluZyBwcmV2aW91cyBlbGVtZW50cworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBfREVWX1dJTjE2XyAgICAgICAgICAgICAoX0RFVl9CSVQxNl8gfCBfREVWX01TVkMxNl8gICAgICAgICAgICAgICAgICApCisjZGVmaW5lIF9ERVZfV0lOMzJfICAgICAgICAgICAgIChfREVWX0JJVDMyXyB8IF9ERVZfTVNWQzMyXyAgICAgICAgICAgICAgICAgICB8IF9ERVZfNjRCSVRfU1VQUE9SVF8gfCBfREVWX0NPTU1BX0VYVF8pCisjZGVmaW5lIF9ERVZfTVNWQ19ET1NfICAgICAgICAgIChfREVWX0JJVDMyXyB8IF9ERVZfTVNWQ19WMV81XyAgICAgICAgICAgICAgICkKKyNkZWZpbmUgX0RFVl9CT1JMQU5EX0RPU18gICAgICAgKF9ERVZfQklUMzJfIHwgX0RFVl9CT1JMQU5EQ18gICAgICAgICAgICAgICAgKQkvL3wgX0RFVl82NEJJVF9TVVBQT1JUXyB8IF9ERVZfQ09NTUFfRVhUXykKKyNkZWZpbmUgX0RFVl9LRUlMX0M1MVhfICAgICAgICAgKF9ERVZfQklUOF8gIHwgX0RFVl9LRUlMOF8gICAgIHwgX0RFVl9CSUdFTkRfIHwgX0RFVl9DT01NQV9FWFRfKQkvLyBhdCBsZWFzdCBDNTEgdmVyc2lvbiA3LjA1IHN1cHBvcnRzIGNvbW1hIGV4dGVuc2lvbgorI2RlZmluZSBfREVWX0tFSUxfQzE2WF8gICAgICAgICAoX0RFVl9CSVQxNl8gfCBfREVWX0tFSUwxNl8gICAgICAgICAgICAgICAgICAgfCBfREVWX0NPTU1BX0VYVF8pCS8vIGF0IGxlYXN0IEMxNjYgdmVyc2lvbiA1LjAzIHN1cHBvcnRzIGNvbW1hIGV4dGVuc2lvbgorI2RlZmluZSBfREVWX1RBU0tJTkdfQzUxWF8gICAgICAoX0RFVl9CSVQ4XyAgfCBfREVWX1RBU0tJTkc4XyAgfCBfREVWX0JJR0VORF8pCisjZGVmaW5lIF9ERVZfVEFTS0lOR19DMTZYXyAgICAgIChfREVWX0JJVDE2XyB8IF9ERVZfVEFTS0lORzE2XyAgICAgICAgICAgICAgICkKKyNkZWZpbmUgX0RFVl9GVUpJVFNVX0Y1OTBfICAgICAgKF9ERVZfQklUOF8gIHwgX0RFVl9GVUpJVFNVXyAgICAgICAgICAgICAgICAgIHwgX0RFVl9DT01NQV9FWFRfKQkvLyBzb2Z0dW5lIGlzIG5vdCBhYmxlIHRvIHN1cHBvcnQgNjQgYml0IHZhcmlhYmxlcyBRV09SRCAhISEKKy8vZi5qLjI5LjA0LjAzIE0xNkMga2FubiBlZmZla3RpdiBtaXQgQnl0ZXMgdW1nZWhlbgorLy8jZGVmaW5lIF9ERVZfVEFTS0lOR19NMTZDXyAgICAgIChfREVWX0JJVDE2XyB8IF9ERVZfVEFTS0lOR00xNkNfICAgICAgICAgICAgICkKKyNkZWZpbmUgX0RFVl9UQVNLSU5HX00xNkNfICAgICAgKF9ERVZfQklUOF8gIHwgX0RFVl9UQVNLSU5HTTE2Q18gICAgICAgICAgICAgKQorI2RlZmluZSBfREVWX01JVFNVQklTSElfTTE2Q18gICAoX0RFVl9CSVQ4XyAgfCBfREVWX01JVFNVQklTSElNMTZDXyAgICAgICAgICApCisjZGVmaW5lIF9ERVZfR05VX01QQzVYNV8gICAgICAgIChfREVWX0JJVDMyXyB8IF9ERVZfR05VQ19NUEM1WDV8IF9ERVZfQklHRU5EXyB8IF9ERVZfNjRCSVRfU1VQUE9SVF8gfCBfREVWX0NPTU1BX0VYVF8pCisjZGVmaW5lIF9ERVZfTElOVVhfICAgICAgICAgICAgIChfREVWX0JJVDMyXyB8IF9ERVZfTElOVVhfR0NDXyAgICAgICAgICAgICAgICB8IF9ERVZfNjRCSVRfU1VQUE9SVF8gfCBfREVWX0NPTU1BX0VYVF8pCisjZGVmaW5lIF9ERVZfR05VX0MxNlhfICAgICAgICAgIChfREVWX0JJVDE2XyB8IF9ERVZfR05VQ19DMTZYXyAgICAgICAgICAgICAgICkJLy98IF9ERVZfQ09NTUFfRVhUXykKKyNkZWZpbmUgX0RFVl9NQ1dfTVBDNVg1XyAgICAgICAgKF9ERVZfQklUMzJfIHwgX0RFVl9NRVRST1dFUktTX0NXXyAgICAgICAgICAgKQkvL3wgX0RFVl82NEJJVF9TVVBQT1JUXyB8IF9ERVZfQ09NTUFfRVhUXykKKyNkZWZpbmUgX0RFVl9HTlVfQVJNN18gICAgICAgICAgKF9ERVZfQklUMzJfIHwgX0RFVl9HTlVDX0FSTTdfICAgICAgICAgICAgICAgIHwgX0RFVl82NEJJVF9TVVBQT1JUXyB8IF9ERVZfQ09NTUFfRVhUXyB8IF9ERVZfT05MWV9JTlRfTUFJTl8pCisjZGVmaW5lIF9ERVZfV0lOMzJfUlRYXyAgICAgICAgIChfREVWX0JJVDMyXyB8IF9ERVZfTVNWQ19SVFhfICAgICAgICAgICAgICAgICkJLy98IF9ERVZfNjRCSVRfU1VQUE9SVF8gfCBfREVWX0NPTU1BX0VYVF8pCisjZGVmaW5lIF9ERVZfSElHSFRFQ19YODZfICAgICAgIChfREVWX0JJVDMyXyB8IF9ERVZfSElHSFRFQ19HTlVDX1g4Nl8gICAgICAgICkJLy98IF9ERVZfNjRCSVRfU1VQUE9SVF8gfCBfREVWX0NPTU1BX0VYVF8pCisjZGVmaW5lIF9ERVZfV0lOX0NFXyAgICAgICAgICAgIChfREVWX0JJVDMyXyB8IF9ERVZfTVNFVkNfICAgICAgICAgICAgICAgICAgICkJLy98IF9ERVZfNjRCSVRfU1VQUE9SVF8gfCBfREVWX0NPTU1BX0VYVF8pCisjZGVmaW5lIF9ERVZfS0VJTF9DQVJNXyAgICAgICAgIChfREVWX0JJVDMyXyB8IF9ERVZfS0VJTF9BUk1fICAgICAgICAgICAgICAgICB8IF9ERVZfNjRCSVRfU1VQUE9SVF8gfCBfREVWX0NPTU1BX0VYVF8pCisjZGVmaW5lIF9ERVZfSUFSX0NBUk1fICAgICAgICAgIChfREVWX0JJVDMyXyB8IF9ERVZfSUFSX0FSTV8gICAgICAgICAgICAgICAgICB8IF9ERVZfNjRCSVRfU1VQUE9SVF8gfCBfREVWX0NPTU1BX0VYVF8pCisjZGVmaW5lIF9ERVZfUlZDVF9DQVJNXyAgICAgICAgIChfREVWX0JJVDMyXyB8IF9ERVZfUlZDVF9BUk1fICAgICAgICAgICAgICAgICB8IF9ERVZfNjRCSVRfU1VQUE9SVF8gfCBfREVWX0NPTU1BX0VYVF8gfCBfREVWX09OTFlfSU5UX01BSU5fKQorI2RlZmluZSBfREVWX01DV19NQ0Y1WFhYXyAgICAgICAoX0RFVl9CSVQzMl8gfCBfREVWX01FVFJPV0VSS1NfQ1dfICAgICAgICAgICApCS8vfCBfREVWXzY0QklUX1NVUFBPUlRfIHwgX0RFVl9DT01NQV9FWFRfKQorI2RlZmluZSBfREVWX0dOVV9DRjUyODJfICAgICAgICAoX0RFVl9CSVQzMl8gfCBfREVWX0dOVUNfQ0ZfICAgfCBfREVWX0JJR0VORF8pCisjZGVmaW5lIF9ERVZfUEFSX0JFQ0sxWDNfICAgICAgIChfREVWX0JJVDE2XyB8IF9ERVZfUEFSQURHTV9YODYpCisjZGVmaW5lIF9ERVZfR05VX0NGNTQ4WF8gICAgICAgIChfREVWX0JJVDMyXyB8IF9ERVZfR05VQ19DRl8gICB8IF9ERVZfQklHRU5EXyB8IF9ERVZfNjRCSVRfU1VQUE9SVF8gfCBfREVWX0NPTU1BX0VYVF8pCisjZGVmaW5lIF9ERVZfR05VX0kzODZfICAgICAgICAgIChfREVWX0JJVDMyXyB8IF9ERVZfR05VQ19YODZfICAgICAgICAgICAgICAgICB8IF9ERVZfNjRCSVRfU1VQUE9SVF8gfCBfREVWX0NPTU1BX0VYVF8gfCBfREVWX09OTFlfSU5UX01BSU5fKQorI2RlZmluZSBfREVWX0dOVV9UUklDT1JFXyAgICAgICAoX0RFVl9CSVQzMl8gfCBfREVWX0dOVUNfVENfICAgICAgICAgICAgICAgICAgfCBfREVWXzY0QklUX1NVUFBPUlRfIHwgX0RFVl9DT01NQV9FWFRfIHwgX0RFVl9PTkxZX0lOVF9NQUlOXyB8IF9ERVZfQUxJR05NRU5UXzRfKQorI2RlZmluZSBfREVWX01QTEFCX0RTUElDMzNGXyAgICAoX0RFVl9CSVQxNl8gfCBfREVWX01QTEFCX0MzMF8gICAgICAgICAgICAgICApCS8vfCBfREVWX0NPTU1BX0VYVF8pCisjZGVmaW5lIF9ERVZfR05VX01JUFNFTF8gICAgICAgIChfREVWX0JJVDMyXyB8IF9ERVZfR05VQ19NSVBTMl8gICAgIHwgX0RFVl9CSUdFTkRfIHwgX0RFVl82NEJJVF9TVVBQT1JUXyB8IF9ERVZfQ09NTUFfRVhUXyB8IF9ERVZfT05MWV9JTlRfTUFJTl8pCisKKyNkZWZpbmUgX0RFVl9SRU5FU0FTX00zMkNfICAgICAgKF9ERVZfQklUMzJfIHwgX0RFVl9SRU5FU0FTTTMyQykKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICB1c2VmdWxsIG1hY3JvcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBDSEVDS19JRl9PTkxZX0lOVF9NQUlOKCkgICAgKERFVl9TWVNURU0gJiBfREVWX09OTFlfSU5UX01BSU5fKQorI2RlZmluZSBDSEVDS19NRU1PUllfQUxJTk1FTlQoKSAgICAgKERFVl9TWVNURU0gJiBfREVWX01BU0tfQUxJR05NRU5UKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIGRlZmluZXMgZm9yIHRhcmdldCBzeXN0ZW0gKFRBUkdFVF9TWVNURU0pCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIF9ET1NfICAgICAgICAgICAgICAoMTYgKyAweDEwMDAwKQorI2RlZmluZSBfV0lOMTZfICAgICAgICAgICAgIDE2CisjZGVmaW5lIF9XSU4zMl8gICAgICAgICAgICAgMzIKKyNkZWZpbmUgX1dJTkNFXyAgICAgICAgICAgICgzMiArIDB4MjAwMDApCisjZGVmaW5lIF9OT19PU18gICAgICAgICAgICAgIDAKKyNkZWZpbmUgX0xJTlVYXyAgICAgICAgICAgICAgMQorI2RlZmluZSBfUFhST1NfICAgICAgICAgICAgICAyCisjZGVmaW5lIF9FQ09TUFJPXyAgICAgICAgICAgIDMKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBkZWZpbml0aW9ucyBmb3IgZnVuY3Rpb24gaW5saW5pbmcKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgSU5MSU5FX0ZVTkNUSU9OCQkvLyBlbXB0eSBkZWZpbmUKKyN1bmRlZiAgSU5MSU5FX0VOQUJMRUQJCS8vIGRpc2FibGUgYWN0dWFsIGlubGluaW5nIG9mIGZ1bmN0aW9ucworI3VuZGVmICBJTkxJTkVfRlVOQ1RJT05fREVGCS8vIGRpc2FibGUgaW5saW5pbmcgZm9yIGFsbCBjb21waWxlcnMgcGVyIGRlZmF1bHQKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBkZWZpbml0aW9ucyBmb3IgS2VpbCBDNTEKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiAgX19DNTFfXworCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICBfTk9fT1NfCisjZGVmaW5lIERFVl9TWVNURU0gICAgICBfREVWX0tFSUxfQzUxWF8KKworI3ByYWdtYSBERUJVRyBPQkpFQ1RFWFRFTkQKKyNwcmFnbWEgV0FSTklOR0xFVkVMKDIpCQkvLyBtYXhpbXVtIHdhcm5pbmcgbGV2ZWwKKworI2RlZmluZSBORUFSICAgICAgICAgICAgaWRhdGEJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgRkFSICAgICAgICAgICAgIHhkYXRhCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIENPTlNUICAgICAgICAgICBjb25zdAkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKyNkZWZpbmUgUk9NICAgICAgICAgICAgIGNvZGUJLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkJLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIEhXQUNDICAgICAgICAgICB4ZGF0YQkvLyBoYXJkd2FyZSBhY2Nlc3MgdGhyb3VnaCBleHRlcm5hbCBtZW1vcnkgKGkuZS4gQ0FOKQorI2RlZmluZSBMQVJHRSAgICAgICAgICAgbGFyZ2UJLy8gZnVuY3Rpb25zIHNldCBwYXJhbWV0ZXJzIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorCisgICAgLy8gVGhlc2UgdHlwZXMgY2FuIGJlIGFkanVzdGVkIGJ5IHVzZXJzIHRvIG1hdGNoIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cy4gVGhlIGdvYWwgaXMgdG8KKyAgICAvLyBtaW5pbWl6ZSBjb2RlIG1lbW9yeSBhbmQgbWF4aW1pemUgc3BlZWQuCisjZGVmaW5lIEdFTkVSSUMJCQkvLyBnZW5lcmljIHBvaW50ZXIgdG8gcG9pbnQgdG8gYXBwbGljYXRpb24gZGF0YQorCQkJCQkvLyBWYXJpYWJsZXMgd2l0aCB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgbG9jYXRlZCBpbiBleHRlcm5hbAorCQkJCQkvLyBvciBpbnRlcm5hbCBkYXRhIG1lbW9yeS4KKyNkZWZpbmUgTUVNICAgICAgICAgICAgIHhkYXRhCS8vIE1lbW9yeSBhdHRyaWJ1dGUgdG8gb3B0aW1pemUgc3BlZWQgYW5kIGNvZGUgb2YgcG9pbnRlciBhY2Nlc3MuCisKKyNkZWZpbmUgUkVFTlRSQU5UICAgICAgIHJlZW50cmFudAorI2RlZmluZSBQVUJMSUMKKworI2lmbmRlZiBOREVCVUcKKyNpbmNsdWRlIDxzdGRpby5oPgkJLy8gcHJvdG90eXBlIHByaW50ZigpIChmb3IgVFJBQ0UpCisjZGVmaW5lIFRSQUNFICBwcmludGYKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIGRlZmluaXRpb25zIGZvciBHTlUgQ29tcGlsZXIgZm9yIEluZmluZW9uIEMxNngKKy8vICAtIGl0IGhhdmUgdG8gYmUgYmVmb3IgS2VpbCAoaXQgaGFzIF9fQzE2Nl9fIHRvbykKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZWxpZiAgZGVmaW5lZCAoX19HTlVDX18pICYmIGRlZmluZWQgKF9fQzE2Nl9fKQorCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICBfTk9fT1NfCisjZGVmaW5lIERFVl9TWVNURU0gICAgICBfREVWX0dOVV9DMTZYXworCisvLyAgICAjZGVmaW5lIE5FQVIgICAgICAgICAgICBpZGF0YSAgICAgICAvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGludGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBORUFSICAgICAgICAgICAgbmVhcgkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGludGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorLy8gICAgI2RlZmluZSBGQVIgICAgICAgICAgICAgeGh1Z2UgICAgICAgLy8gdmFyaWFibGVzIG1hcHBlZCB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgRkFSICAgICAgICAgICAgIGh1Z2UJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgQ09OU1QgICAgICAgICAgIGNvbnN0CS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2RlZmluZSBST00JCQkvLyBjb2RlIG9yIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorCQkJCQkvLyB1c2FnZTogQ09OU1QgQllURSBST00gZm9vID0gMHgwMDsKKy8vICAgICNkZWZpbmUgSFdBQ0MgICAgICAgICAgIHNkYXRhICAgICAgIC8vIGhhcmR3YXJlIGFjY2VzcyB0aHJvdWdoIGV4dGVybmFsIG1lbW9yeSAoaS5lLiBDQU4pCisjZGVmaW5lIEhXQUNDICAgICAgICAgICBodWdlCS8vIGhhcmR3YXJlIGFjY2VzcyB0aHJvdWdoIGV4dGVybmFsIG1lbW9yeSAoaS5lLiBDQU4pCisjZGVmaW5lIExBUkdFCQkJLy8gZnVuY3Rpb25zIHNldCBwYXJhbWV0ZXJzIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorCisgICAgLy8gVGhlc2UgdHlwZXMgY2FuIGJlIGFkanVzdGVkIGJ5IHVzZXJzIHRvIG1hdGNoIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cy4gVGhlIGdvYWwgaXMgdG8KKyAgICAvLyBtaW5pbWl6ZSBjb2RlIG1lbW9yeSBhbmQgbWF4aW1pemUgc3BlZWQuCisvLyAgICAjZGVmaW5lIEdFTkVSSUMgICAgICAgICB4aHVnZSAgICAgICAvLyBnZW5lcmljIHBvaW50ZXIgdG8gcG9pbnQgdG8gYXBwbGljYXRpb24gZGF0YQorI2RlZmluZSBHRU5FUklDICAgICAgICAgaHVnZQkvLyBnZW5lcmljIHBvaW50ZXIgdG8gcG9pbnQgdG8gYXBwbGljYXRpb24gZGF0YQorCQkJCQkvLyBWYXJpYWJsZXMgd2l0aCB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgbG9jYXRlZCBpbiBleHRlcm5hbAorCQkJCQkvLyBvciBpbnRlcm5hbCBkYXRhIG1lbW9yeS4KKyNkZWZpbmUgTUVNCQkJLy8gTWVtb3J5IGF0dHJpYnV0ZSB0byBvcHRpbWl6ZSBzcGVlZCBhbmQgY29kZSBvZiBwb2ludGVyIGFjY2Vzcy4KKworI2RlZmluZSBSRUVOVFJBTlQKKyNkZWZpbmUgUFVCTElDCisKKyNpZm5kZWYgTkRFQlVHCisjaW5jbHVkZSA8c3RkaW8uaD4JCS8vIHByb3RvdHlwZSBwcmludGYoKSAoZm9yIFRSQUNFKQorI2RlZmluZSBUUkFDRSAgcHJpbnRmCisKKyNkZWZpbmUgQVNTRVJUKHApICBcCisgICAgICAgICAgICBpZiAocCkgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgOyAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICBcCisgICAgICAgICAgICBlbHNlICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgUFJJTlRGMCgiQXNzZXJ0IGZhaWxlZDogIiAjcCAiIChmaWxlICVzIGxpbmUgJWQpXG4iLCBfX0ZJTEVfXywgKGludCkgX19MSU5FX18gKTsgXAorICAgICAgICAgICAgICAgIHdoaWxlICgxKTsgXAorICAgICAgICAgICAgfQorI2Vsc2UKKyNkZWZpbmUgQVNTRVJUKHApCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBkZWZpbml0aW9ucyBmb3IgS2VpbCBDMTY2CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VsaWYgIGRlZmluZWQgKF9fQzE2Nl9fKQkvLyAyNC4wMS4yMDA1IHIuZC46IEtlaWwgQVJNNyBuZWVkcyBkaXJlY3RpdmUgJ2RlZmluZWQnCisKKyNkZWZpbmUgVEFSR0VUX1NZU1RFTSAgIF9OT19PU18KKyNkZWZpbmUgREVWX1NZU1RFTSAgICAgIF9ERVZfS0VJTF9DMTZYXworCisjcHJhZ21hIENPREUKKyNwcmFnbWEgTU9EMTY3CisjcHJhZ21hIE5PSU5JVAorI3ByYWdtYSBERUJVRworI3ByYWdtYSBXQVJOSU5HTEVWRUwoMykJCS8vIG1heGltdW0gd2FybmluZyBsZXZlbAorI3ByYWdtYSBXQVJOSU5HIERJU0FCTEUgPSA0NwkvLyB3YXJuaW5nIDx1bnJlZmVyZW5jZWQgcGFyYW1ldGVyPiA9IE9GRgorI3ByYWdtYSBXQVJOSU5HIERJU0FCTEUgPSAzOAkvLyB3YXJuaW5nIDxlbXB0eSB0cmFuc2xhdGlvbiB1bml0PiA9IE9GRgorLy8gICNwcmFnbWEgV0FSTklORyBESVNBQkxFID0gMTAyICAgICAgIC8vIHdhcm5pbmcgPGRpZmZlcmVudCBjb25zdC92b2xhdGlsZSBxdWFsaWZpZXJzPiA9IE9GRgorI3ByYWdtYSBXQVJOSU5HIERJU0FCTEUgPSAxNzQJLy8gd2FybmluZyA8dW5yZWZlcmVuY2VkICdzdGF0aWMnIGZ1bmN0aW9uPiA9IE9GRgorI3ByYWdtYSBXQVJOSU5HIERJU0FCTEUgPSAxODMJLy8gd2FybmluZyA8ZGVhZCBhc3NpZ25lbWVudCBlbGltaW5hdGVkPiA9IE9GRgorCisjZGVmaW5lIE5FQVIgICAgICAgICAgICBpZGF0YQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGludGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBGQVIgICAgICAgICAgICAgeGh1Z2UJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgQ09OU1QgICAgICAgICAgIGNvbnN0CS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2RlZmluZSBST00JCQkvLyBjb2RlIG9yIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorCQkJCQkvLyB1c2FnZTogQ09OU1QgQllURSBST00gZm9vID0gMHgwMDsKKy8vICAgICNkZWZpbmUgSFdBQ0MgICAgICAgICAgIHNkYXRhICAgICAgIC8vIGhhcmR3YXJlIGFjY2VzcyB0aHJvdWdoIGV4dGVybmFsIG1lbW9yeSAoaS5lLiBDQU4pCisjZGVmaW5lIEhXQUNDICAgICAgICAgICBodWdlCS8vIGhhcmR3YXJlIGFjY2VzcyB0aHJvdWdoIGV4dGVybmFsIG1lbW9yeSAoaS5lLiBDQU4pCisjZGVmaW5lIExBUkdFCQkJLy8gZnVuY3Rpb25zIHNldCBwYXJhbWV0ZXJzIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorCisgICAgLy8gVGhlc2UgdHlwZXMgY2FuIGJlIGFkanVzdGVkIGJ5IHVzZXJzIHRvIG1hdGNoIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cy4gVGhlIGdvYWwgaXMgdG8KKyAgICAvLyBtaW5pbWl6ZSBjb2RlIG1lbW9yeSBhbmQgbWF4aW1pemUgc3BlZWQuCisjZGVmaW5lIEdFTkVSSUMgICAgICAgICB4aHVnZQkvLyBnZW5lcmljIHBvaW50ZXIgdG8gcG9pbnQgdG8gYXBwbGljYXRpb24gZGF0YQorCQkJCQkvLyBWYXJpYWJsZXMgd2l0aCB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgbG9jYXRlZCBpbiBleHRlcm5hbAorCQkJCQkvLyBvciBpbnRlcm5hbCBkYXRhIG1lbW9yeS4KKyNkZWZpbmUgTUVNCQkJLy8gTWVtb3J5IGF0dHJpYnV0ZSB0byBvcHRpbWl6ZSBzcGVlZCBhbmQgY29kZSBvZiBwb2ludGVyIGFjY2Vzcy4KKworI2RlZmluZSBSRUVOVFJBTlQKKyNkZWZpbmUgUFVCTElDCisKKyNpZm5kZWYgTkRFQlVHCisjaW5jbHVkZSA8c3RkaW8uaD4JCS8vIHByb3RvdHlwZSBwcmludGYoKSAoZm9yIFRSQUNFKQorI2RlZmluZSBUUkFDRSAgcHJpbnRmCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBkZWZpbml0aW9ucyBmb3IgTVBMQUIgQzMwIGZvciBkc1BJQzMzRiBzZXJpZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZWxpZiAgZGVmaW5lZCAoX19DMzBfXykKKworI2RlZmluZSBUQVJHRVRfU1lTVEVNICAgX05PX09TXworI2RlZmluZSBERVZfU1lTVEVNICAgICAgX0RFVl9NUExBQl9EU1BJQzMzRl8KKworI2RlZmluZSBORUFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgRkFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgQ09OU1QgICAgICAgIGNvbnN0CS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2RlZmluZSBST00JCQkvLyBjb2RlIG9yIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorCQkJCQkvLyB1c2FnZTogQ09OU1QgQllURSBST00gZm9vID0gMHgwMDsKKyNkZWZpbmUgSFdBQ0MJCQkvLyBoYXJkd2FyZSBhY2Nlc3MgdGhyb3VnaCBleHRlcm5hbCBtZW1vcnkgKGkuZS4gQ0FOKQorI2RlZmluZSBMQVJHRQkJCS8vIGZ1bmN0aW9ucyBzZXQgcGFyYW1ldGVycyB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKworICAgIC8vIFRoZXNlIHR5cGVzIGNhbiBiZSBhZGp1c3RlZCBieSB1c2VycyB0byBtYXRjaCBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuIFRoZSBnb2FsIGlzIHRvCisgICAgLy8gbWluaW1pemUgY29kZSBtZW1vcnkgYW5kIG1heGltaXplIHNwZWVkLgorI2RlZmluZSBHRU5FUklDCQkJLy8gZ2VuZXJpYyBwb2ludGVyIHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEKKwkJCQkJLy8gVmFyaWFibGVzIHdpdGggdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIGxvY2F0ZWQgaW4gZXh0ZXJuYWwKKwkJCQkJLy8gb3IgaW50ZXJuYWwgZGF0YSBtZW1vcnkuCisjZGVmaW5lIE1FTQkJCS8vIE1lbW9yeSBhdHRyaWJ1dGUgdG8gb3B0aW1pemUgc3BlZWQgYW5kIGNvZGUgb2YgcG9pbnRlciBhY2Nlc3MuCisKKyNkZWZpbmUgUkVFTlRSQU5UCisjZGVmaW5lIFBVQkxJQworCisvLyAgICAjaWZuZGVmIFFXT1JECisvLyAgICAgICAgI2RlZmluZSBRV09SRCBsb25nIGxvbmcKKy8vICAgICNlbmRpZgorCisjaWZuZGVmIE5ERUJVRworI2luY2x1ZGUgPHN0ZGlvLmg+CQkvLyBwcm90b3R5cGUgcHJpbnRmKCkgKGZvciBUUkFDRSkKKyNkZWZpbmUgVFJBQ0UgIHByaW50ZgorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgZGVmaW5pdGlvbnMgZm9yIEtlaWwgQVJNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VsaWYgIGRlZmluZWQgKF9fQ0FfXykKKworI2RlZmluZSBUQVJHRVRfU1lTVEVNICAgX05PX09TXworI2RlZmluZSBERVZfU1lTVEVNICAgICAgX0RFVl9LRUlMX0NBUk1fCisKKyNkZWZpbmUgTkVBUgkJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gaW50ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIEZBUgkJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIENPTlNUICAgICAgICBjb25zdAkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKyNkZWZpbmUgUk9NCQkJLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkJLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIEhXQUNDCQkJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKyNkZWZpbmUgTEFSR0UJCQkvLyBmdW5jdGlvbnMgc2V0IHBhcmFtZXRlcnMgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisKKyAgICAvLyBUaGVzZSB0eXBlcyBjYW4gYmUgYWRqdXN0ZWQgYnkgdXNlcnMgdG8gbWF0Y2ggYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLiBUaGUgZ29hbCBpcyB0bworICAgIC8vIG1pbmltaXplIGNvZGUgbWVtb3J5IGFuZCBtYXhpbWl6ZSBzcGVlZC4KKyNkZWZpbmUgR0VORVJJQwkJCS8vIGdlbmVyaWMgcG9pbnRlciB0byBwb2ludCB0byBhcHBsaWNhdGlvbiBkYXRhCisJCQkJCS8vIFZhcmlhYmxlcyB3aXRoIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBsb2NhdGVkIGluIGV4dGVybmFsCisJCQkJCS8vIG9yIGludGVybmFsIGRhdGEgbWVtb3J5LgorI2RlZmluZSBNRU0JCQkvLyBNZW1vcnkgYXR0cmlidXRlIHRvIG9wdGltaXplIHNwZWVkIGFuZCBjb2RlIG9mIHBvaW50ZXIgYWNjZXNzLgorCisjZGVmaW5lIFJFRU5UUkFOVAorI2RlZmluZSBQVUJMSUMKKworI2lmbmRlZiBRV09SRAorI2RlZmluZSBRV09SRCBsb25nIGxvbmcKKyNlbmRpZgorCisjaWZuZGVmIE5ERUJVRworI2luY2x1ZGUgPHN0ZGlvLmg+CQkvLyBwcm90b3R5cGUgcHJpbnRmKCkgKGZvciBUUkFDRSkKKyNkZWZpbmUgVFJBQ0UgIHByaW50ZgorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgZGVmaW5pdGlvbnMgZm9yIFJlYWxWaWV3IEFSTSBjb21waWxhdGlvbiB0b29scyAocHJvdmlkZWQgYnkgcmVjZW50IEtlaWwgTWljcm9jb250cm9sbGVyIERldmVsb3BtZW50IEtpdHMpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VsaWYgIGRlZmluZWQgKF9fQVJNQ0NfVkVSU0lPTikKKworI2RlZmluZSBUQVJHRVRfU1lTVEVNICAgX05PX09TXworI2RlZmluZSBERVZfU1lTVEVNICAgICAgX0RFVl9SVkNUX0NBUk1fCisKKyNkZWZpbmUgTkVBUgkJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gaW50ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIEZBUgkJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIENPTlNUICAgICAgICBjb25zdAkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKyNkZWZpbmUgUk9NCQkJLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkJLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIEhXQUNDCQkJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKyNkZWZpbmUgTEFSR0UJCQkvLyBmdW5jdGlvbnMgc2V0IHBhcmFtZXRlcnMgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisKKyAgICAvLyBUaGVzZSB0eXBlcyBjYW4gYmUgYWRqdXN0ZWQgYnkgdXNlcnMgdG8gbWF0Y2ggYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLiBUaGUgZ29hbCBpcyB0bworICAgIC8vIG1pbmltaXplIGNvZGUgbWVtb3J5IGFuZCBtYXhpbWl6ZSBzcGVlZC4KKyNkZWZpbmUgR0VORVJJQwkJCS8vIGdlbmVyaWMgcG9pbnRlciB0byBwb2ludCB0byBhcHBsaWNhdGlvbiBkYXRhCisJCQkJCS8vIFZhcmlhYmxlcyB3aXRoIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBsb2NhdGVkIGluIGV4dGVybmFsCisJCQkJCS8vIG9yIGludGVybmFsIGRhdGEgbWVtb3J5LgorI2RlZmluZSBNRU0JCQkvLyBNZW1vcnkgYXR0cmlidXRlIHRvIG9wdGltaXplIHNwZWVkIGFuZCBjb2RlIG9mIHBvaW50ZXIgYWNjZXNzLgorCisjZGVmaW5lIFJFRU5UUkFOVAorI2RlZmluZSBQVUJMSUMKKworI2lmbmRlZiBRV09SRAorI2RlZmluZSBRV09SRCBsb25nIGxvbmcKKyNlbmRpZgorCisjaWZuZGVmIE5ERUJVRworI2RlZmluZSBBU1NFUlQoZXhwcikgICAgaWYgKCEoZXhwcikpIHtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFMCAoIkFzc2VydGlvbiBmYWlsZWQ6ICIgI2V4cHIgKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgxKTt9CisjZWxzZQorI2RlZmluZSBBU1NFUlQoZXhwcikKKyNlbmRpZgorCisjaWZuZGVmIE5ERUJVRworI2luY2x1ZGUgPHN0ZGlvLmg+CQkvLyBwcm90b3R5cGUgcHJpbnRmKCkgKGZvciBUUkFDRSkKKyNkZWZpbmUgVFJBQ0UgIHByaW50ZgorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgZGVmaW5pdGlvbnMgZm9yIEFSTSBJQVIgQyBDb21waWxlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNlbGlmICBkZWZpbmVkIChfX0lDQ0FSTV9fKQorCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICBfTk9fT1NfCisjZGVmaW5lIERFVl9TWVNURU0gICAgICBfREVWX0lBUl9DQVJNXworCisjZGVmaW5lIE5FQVIJCQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGludGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBGQVIJCQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBDT05TVCAgICAgICAgY29uc3QJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisjZGVmaW5lIFJPTQkJCS8vIGNvZGUgb3IgdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisJCQkJCS8vIHVzYWdlOiBDT05TVCBCWVRFIFJPTSBmb28gPSAweDAwOworI2RlZmluZSBIV0FDQwkJCS8vIGhhcmR3YXJlIGFjY2VzcyB0aHJvdWdoIGV4dGVybmFsIG1lbW9yeSAoaS5lLiBDQU4pCisjZGVmaW5lIExBUkdFCQkJLy8gZnVuY3Rpb25zIHNldCBwYXJhbWV0ZXJzIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorCisgICAgLy8gVGhlc2UgdHlwZXMgY2FuIGJlIGFkanVzdGVkIGJ5IHVzZXJzIHRvIG1hdGNoIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cy4gVGhlIGdvYWwgaXMgdG8KKyAgICAvLyBtaW5pbWl6ZSBjb2RlIG1lbW9yeSBhbmQgbWF4aW1pemUgc3BlZWQuCisjZGVmaW5lIEdFTkVSSUMJCQkvLyBnZW5lcmljIHBvaW50ZXIgdG8gcG9pbnQgdG8gYXBwbGljYXRpb24gZGF0YQorCQkJCQkvLyBWYXJpYWJsZXMgd2l0aCB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgbG9jYXRlZCBpbiBleHRlcm5hbAorCQkJCQkvLyBvciBpbnRlcm5hbCBkYXRhIG1lbW9yeS4KKyNkZWZpbmUgTUVNCQkJLy8gTWVtb3J5IGF0dHJpYnV0ZSB0byBvcHRpbWl6ZSBzcGVlZCBhbmQgY29kZSBvZiBwb2ludGVyIGFjY2Vzcy4KKworI2RlZmluZSBSRUVOVFJBTlQKKyNkZWZpbmUgUFVCTElDCisKKyNpZm5kZWYgUVdPUkQKKyNkZWZpbmUgUVdPUkQgbG9uZyBsb25nCisjZW5kaWYKKworICAgIC8vIFdvcmthcm91bmQ6CisgICAgLy8gSWYgd2UgdXNlIElBUiBhbmQgd2FudCB0byBkZWJ1ZyBidXQgZG9uJ3Qgd2FudCB0byB1c2UgQy1TcHkgRGVidWdnZXIKKyAgICAvLyBhc3NlcnQoKSBkb2Vzbid0IHdvcmsgaW4gZGVidWcgbW9kZSBiZWNhdXNlIGl0IG5lZWRzIHN1cHBvcnQgZm9yIEZJTEUgZGVzY3JpcHRvcnMKKyAgICAvLyAoX0RMSUJfRklMRV9ERVNDUklQVE9SID09IDEpLgorI2lmbmRlZiBOREVCVUcKKyNkZWZpbmUgQVNTRVJUKGV4cHIpICAgIGlmICghKGV4cHIpKSB7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRTAgKCJBc3NlcnRpb24gZmFpbGVkOiAiICNleHByICk7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoMSk7fQorI2Vsc2UKKyNkZWZpbmUgQVNTRVJUKGV4cHIpCisjZW5kaWYKKworI2lmbmRlZiBOREVCVUcKKyNpbmNsdWRlIDxzdGRpby5oPgkJLy8gcHJvdG90eXBlIHByaW50ZigpIChmb3IgVFJBQ0UpCisjZGVmaW5lIFRSQUNFICBwcmludGYKKy8vICAgICAgICAjZGVmaW5lIFRSQUNFICBQUklOVEY0CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBkZWZpbml0aW9ucyBmb3IgVGFza2luZyA4MDUxCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZWxpZiBkZWZpbmVkIChfQ0M1MSkKKworI2luY2x1ZGUgPGNjNTEuaD4KKworI2RlZmluZSBUQVJHRVRfU1lTVEVNICAgX05PX09TXworI2RlZmluZSBERVZfU1lTVEVNICAgICAgX0RFVl9UQVNLSU5HX0M1MVhfCisKKyNkZWZpbmUgTkVBUiAgICAgICAgICAgIF9kYXRhCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gaW50ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIEZBUiAgICAgICAgICAgICBfeGRhdAkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBDT05TVCAgICAgICAgICAgY29uc3QJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisjZGVmaW5lIFJPTQkJCS8vIGNvZGUgb3IgdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisJCQkJCS8vIHVzYWdlOiBDT05TVCBCWVRFIFJPTSBmb28gPSAweDAwOworI2RlZmluZSBIV0FDQyAgICAgICAgICAgX3hkYXQJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKyNkZWZpbmUgTEFSR0UJCQkvLyBmdW5jdGlvbnMgc2V0IHBhcmFtZXRlcnMgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisKKyAgICAvLyBUaGVzZSB0eXBlcyBjYW4gYmUgYWRqdXN0ZWQgYnkgdXNlcnMgdG8gbWF0Y2ggYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLiBUaGUgZ29hbCBpcyB0bworICAgIC8vIG1pbmltaXplIGNvZGUgbWVtb3J5IGFuZCBtYXhpbWl6ZSBzcGVlZC4KKyNkZWZpbmUgR0VORVJJQwkJCS8vIGdlbmVyaWMgcG9pbnRlciB0byBwb2ludCB0byBhcHBsaWNhdGlvbiBkYXRhCisJCQkJCS8vIFZhcmlhYmxlcyB3aXRoIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBsb2NhdGVkIGluIGV4dGVybmFsCisJCQkJCS8vIG9yIGludGVybmFsIGRhdGEgbWVtb3J5LgorI2RlZmluZSBNRU0gICAgICAgICAgICAgX3hkYXQJLy8gTWVtb3J5IGF0dHJpYnV0ZSB0byBvcHRpbWl6ZSBzcGVlZCBhbmQgY29kZSBvZiBwb2ludGVyIGFjY2Vzcy4KKworI2RlZmluZSBSRUVOVFJBTlQgICAgICAgX3JlZW50cmFudAorI2RlZmluZSBQVUJMSUMKKworI2lmbmRlZiBOREVCVUcKKyNpbmNsdWRlIDxzdGRpby5oPgkJLy8gcHJvdG90eXBlIHByaW50ZigpIChmb3IgVFJBQ0UpCisjZGVmaW5lIFRSQUNFICBwcmludGYKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIGRlZmluaXRpb25zIGZvciBUYXNraW5nIEMxNjdDUiBhbmQgQzE2NENJCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZWxpZiBkZWZpbmVkIChfQzE2NikKKworI2RlZmluZSBUQVJHRVRfU1lTVEVNICAgX05PX09TXworI2RlZmluZSBERVZfU1lTVEVNICAgICAgX0RFVl9UQVNLSU5HX0MxNlhfCisKKyNkZWZpbmUgTkVBUiAgICAgICAgICAgIG5lYXIJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgRkFSICAgICAgICAgICAgIGZhcgkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBDT05TVCAgICAgICAgICAgY29uc3QJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisjZGVmaW5lIFJPTQkJCS8vIGNvZGUgb3IgdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisJCQkJCS8vIHVzYWdlOiBDT05TVCBCWVRFIFJPTSBmb28gPSAweDAwOworI2RlZmluZSBIV0FDQyAgIC8qIHRvIGJlIGRlZmluZWQgKi8JLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKyNkZWZpbmUgTEFSR0UJCQkvLyBmdW5jdGlvbnMgc2V0IHBhcmFtZXRlcnMgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisKKyAgICAvLyBUaGVzZSB0eXBlcyBjYW4gYmUgYWRqdXN0ZWQgYnkgdXNlcnMgdG8gbWF0Y2ggYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLiBUaGUgZ29hbCBpcyB0bworICAgIC8vIG1pbmltaXplIGNvZGUgbWVtb3J5IGFuZCBtYXhpbWl6ZSBzcGVlZC4KKyNkZWZpbmUgR0VORVJJQwkJCS8vIGdlbmVyaWMgcG9pbnRlciB0byBwb2ludCB0byBhcHBsaWNhdGlvbiBkYXRhCisJCQkJCS8vIFZhcmlhYmxlcyB3aXRoIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBsb2NhdGVkIGluIGV4dGVybmFsCisJCQkJCS8vIG9yIGludGVybmFsIGRhdGEgbWVtb3J5LgorI2RlZmluZSBNRU0JCQkvLyBNZW1vcnkgYXR0cmlidXRlIHRvIG9wdGltaXplIHNwZWVkIGFuZCBjb2RlIG9mIHBvaW50ZXIgYWNjZXNzLgorCisjZGVmaW5lIFJFRU5UUkFOVAorI2RlZmluZSBQVUJMSUMKKworICAgIC8vIFN0ZGlvLmggaGFzIHRvIGJlIGFsd2F5IGluY2x1ZGVkIGhlcmUuIElmIHByaW50ZigpIGlzIHVzZWQgc3RkaW8uaCBkZWZpbmVzIE5VTEwKKyAgICAvLyB3aXRob3V0IGNoZWNraW5nIGlmIGl0IGlzIGFscmVhZHkgaW5jbHVkZWQuIFNvIGFuIGVycm9yIG9jY3VycyB3aGlsZSBjb21waWxpbmcuCisgICAgLy8gKHIuZC4pCisjaW5jbHVkZSA8c3RkaW8uaD4JCS8vIHByb3RvdHlwZSBwcmludGYoKSAoZm9yIFRSQUNFKQorI2lmbmRlZiBOREVCVUcKKyNkZWZpbmUgVFJBQ0UgIHByaW50ZgorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgZGVmaW5pdGlvbnMgZm9yIEZVSklUU1UgRkZNQy0xNkxYIE1COTA1OTAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vI2VsaWYgKGRlZmluZWQgKEY1OTApIHx8IGRlZmluZWQgKEY1NDMpIHx8IGRlZmluZWQgKEY1OTgpIHx8IGRlZmluZWQgKEY0OTUpIHx8IGRlZmluZWQgKEYzNTApKQorI2VsaWYgZGVmaW5lZChfX0NPTVBJTEVSX0ZDQzkwN19fKQorCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICBfTk9fT1NfCisjZGVmaW5lIERFVl9TWVNURU0gICAgICBfREVWX0ZVSklUU1VfRjU5MF8KKworI2RlZmluZSBORUFSICAgIC8qIHRvIGJlIGRlZmluZWQgKi8JLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgRkFSICAgICAvKiB0byBiZSBkZWZpbmVkICovCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIENPTlNUICAgICAgICAgICBjb25zdAkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKyNkZWZpbmUgUk9NICAgICAvKiB0byBiZSBkZWZpbmVkICovCS8vIGNvZGUgb3IgdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisJCQkJCS8vIHVzYWdlOiBDT05TVCBCWVRFIFJPTSBmb28gPSAweDAwOworI2RlZmluZSBIV0FDQyAgIC8qIHRvIGJlIGRlZmluZWQgKi8JLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKyNkZWZpbmUgTEFSR0UJCQkvLyBmdW5jdGlvbnMgc2V0IHBhcmFtZXRlcnMgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisKKyAgICAvLyBUaGVzZSB0eXBlcyBjYW4gYmUgYWRqdXN0ZWQgYnkgdXNlcnMgdG8gbWF0Y2ggYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLiBUaGUgZ29hbCBpcyB0bworICAgIC8vIG1pbmltaXplIGNvZGUgbWVtb3J5IGFuZCBtYXhpbWl6ZSBzcGVlZC4KKyNkZWZpbmUgR0VORVJJQwkJCS8vIGdlbmVyaWMgcG9pbnRlciB0byBwb2ludCB0byBhcHBsaWNhdGlvbiBkYXRhCisJCQkJCS8vIFZhcmlhYmxlcyB3aXRoIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBsb2NhdGVkIGluIGV4dGVybmFsCisJCQkJCS8vIG9yIGludGVybmFsIGRhdGEgbWVtb3J5LgorI2RlZmluZSBNRU0JCQkvLyBNZW1vcnkgYXR0cmlidXRlIHRvIG9wdGltaXplIHNwZWVkIGFuZCBjb2RlIG9mIHBvaW50ZXIgYWNjZXNzLgorCisgICAgLy8gc29mdHVuZSBpcyBub3QgYWJsZSB0byBzdXBwb3J0IDY0IGJpdCB2YXJpYWJsZXMgUVdPUkQgISEhCisKKyNkZWZpbmUgUkVFTlRSQU5UCisjZGVmaW5lIFBVQkxJQworCisjaWZuZGVmIE5ERUJVRworI2luY2x1ZGUgPHN0ZGlvLmg+CQkvLyBwcm90b3R5cGUgcHJpbnRmKCkgKGZvciBUUkFDRSkKKyNkZWZpbmUgVFJBQ0UgIHByaW50ZgorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgZGVmaW5pdGlvbnMgZm9yIE1pdHN1YmlzaGkgTTE2QyBmYW1pbHkgZm9yIFRBU0tJTkcgQ29tcGlsZXIgQ00xNgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VsaWYgZGVmaW5lZCAoX0NNMTZDKQorCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICBfTk9fT1NfCisjZGVmaW5lIERFVl9TWVNURU0gICAgICBfREVWX1RBU0tJTkdfTTE2Q18KKworI2RlZmluZSBORUFSICAgICAgICAgICAgX25lYXIJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgRkFSICAgICAgICAgICAgIF9mYXIJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgQ09OU1QgICAgICAgICAgIF9mYXJyb20JLy8gdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisjZGVmaW5lIFJPTQkJCS8vIGNvZGUgb3IgdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisJCQkJCS8vIHVzYWdlOiBDT05TVCBCWVRFIFJPTSBmb28gPSAweDAwOworI2RlZmluZSBIV0FDQyAgICAgICAgICAgX25lYXIJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKyNkZWZpbmUgTEFSR0UJCQkvLyBmdW5jdGlvbnMgc2V0IHBhcmFtZXRlcnMgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisKKyAgICAvLyBUaGVzZSB0eXBlcyBjYW4gYmUgYWRqdXN0ZWQgYnkgdXNlcnMgdG8gbWF0Y2ggYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLiBUaGUgZ29hbCBpcyB0bworICAgIC8vIG1pbmltaXplIGNvZGUgbWVtb3J5IGFuZCBtYXhpbWl6ZSBzcGVlZC4KKyNkZWZpbmUgR0VORVJJQyAgICAgICAgIF9mYXIJLy8gZ2VuZXJpYyBwb2ludGVyIHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEKKwkJCQkJLy8gVmFyaWFibGVzIHdpdGggdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIGxvY2F0ZWQgaW4gZXh0ZXJuYWwKKwkJCQkJLy8gb3IgaW50ZXJuYWwgZGF0YSBtZW1vcnkuCisJCQkJCS8vIGRvIHlvdSB1c2UgbWVtb3J5IG1vZGVsIFNNQUxMLCB0aGFuIHlvdSBoYXZlIHRvIHNldCBfZmFyCisjZGVmaW5lIE1FTQkJCS8vIE1lbW9yeSBhdHRyaWJ1dGUgdG8gb3B0aW1pemUgc3BlZWQgYW5kIGNvZGUgb2YgcG9pbnRlciBhY2Nlc3MuCisKKyNkZWZpbmUgUkVFTlRSQU5UCisjZGVmaW5lIFBVQkxJQworCisgICAgLy8gU3RkaW8uaCBoYXMgdG8gYmUgYWx3YXkgaW5jbHVkZWQgaGVyZS4gSWYgcHJpbnRmKCkgaXMgdXNlZCBzdGRpby5oIGRlZmluZXMgTlVMTAorICAgIC8vIHdpdGhvdXQgY2hlY2tpbmcgaWYgaXQgaXMgYWxyZWFkeSBpbmNsdWRlZC4gU28gYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNvbXBpbGluZy4KKyAgICAvLyAoci5kLikKKyNpbmNsdWRlIDxzdGRpby5oPgkJLy8gcHJvdG90eXBlIHByaW50ZigpIChmb3IgVFJBQ0UpCisjaWZuZGVmIE5ERUJVRworI2RlZmluZSBUUkFDRSAgcHJpbnRmCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBkZWZpbml0aW9ucyBmb3IgTWl0c3ViaXNoaSBNMTZDIGZhbWlseSBmb3IgTWl0c3ViaXNoaSBDb21waWxlciBOQzMwCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbmFtZSBOQzMwLCBhbmRlcmUgRm9ybSB3aWxsIGRlciBDb21waWxlciBuaWNodCAhIQorI2VsaWYgZGVmaW5lZCAoTkMzMCkKKworI2RlZmluZSBUQVJHRVRfU1lTVEVNICAgX05PX09TXworI2RlZmluZSBERVZfU1lTVEVNICAgICAgX0RFVl9NSVRTVUJJU0hJX00xNkNfCisKKyNkZWZpbmUgTkVBUiAgICAgICAgICAgIG5lYXIJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgRkFSICAgICAgICAgICAgIGZhcgkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBDT05TVCAgICAgICAgICAgY29uc3QJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisjZGVmaW5lIFJPTQkJCS8vIGNvZGUgb3IgdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisJCQkJCS8vIHVzYWdlOiBDT05TVCBCWVRFIFJPTSBmb28gPSAweDAwOworI2RlZmluZSBIV0FDQyAgICAgICAgICAgbmVhcgkvLyBoYXJkd2FyZSBhY2Nlc3MgdGhyb3VnaCBleHRlcm5hbCBtZW1vcnkgKGkuZS4gQ0FOKQorI2RlZmluZSBMQVJHRQkJCS8vIGZ1bmN0aW9ucyBzZXQgcGFyYW1ldGVycyB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKworICAgIC8vIFRoZXNlIHR5cGVzIGNhbiBiZSBhZGp1c3RlZCBieSB1c2VycyB0byBtYXRjaCBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuIFRoZSBnb2FsIGlzIHRvCisgICAgLy8gbWluaW1pemUgY29kZSBtZW1vcnkgYW5kIG1heGltaXplIHNwZWVkLgorI2RlZmluZSBHRU5FUklDICAgICAgICAgZmFyCS8vIGdlbmVyaWMgcG9pbnRlciB0byBwb2ludCB0byBhcHBsaWNhdGlvbiBkYXRhCisJCQkJCS8vIFZhcmlhYmxlcyB3aXRoIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBsb2NhdGVkIGluIGV4dGVybmFsCisJCQkJCS8vIG9yIGludGVybmFsIGRhdGEgbWVtb3J5LgorI2RlZmluZSBNRU0JCQkvLyBNZW1vcnkgYXR0cmlidXRlIHRvIG9wdGltaXplIHNwZWVkIGFuZCBjb2RlIG9mIHBvaW50ZXIgYWNjZXNzLgorCisjZGVmaW5lIFJFRU5UUkFOVAorI2RlZmluZSBQVUJMSUMKKworI2lmbmRlZiBOREVCVUcKKyNpbmNsdWRlIDxzdGRpby5oPgkJLy8gcHJvdG90eXBlIHByaW50ZigpIChmb3IgVFJBQ0UpCisjZGVmaW5lIFRSQUNFICBwcmludGYKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIGRlZmluaXRpb25zIGZvciBSZW5lc2FzIE0zMkMgZmFtaWx5IGZvciBSZW5lc2FzIENvbXBpbGVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VsaWYgZGVmaW5lZCAoTkMzMDgpCisKKyNkZWZpbmUgVEFSR0VUX1NZU1RFTSAgIF9OT19PU18KKyNkZWZpbmUgREVWX1NZU1RFTSAgICAgIF9ERVZfUkVORVNBU19NMzJDXworCisjZGVmaW5lIE5FQVIgICAgICAgICAgICAgbmVhcgkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGludGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBGQVIgICAgICAgICAgICAgIGZhcgkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBDT05TVCAgICAgICAgICAgIGNvbnN0CS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2RlZmluZSBST00JCQkvLyBjb2RlIG9yIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2RlZmluZSBIV0FDQwkJCS8vIGhhcmR3YXJlIGFjY2VzcyB0aHJvdWdoIGV4dGVybmFsIG1lbW9yeSAoaS5lLiBDQU4pCisjZGVmaW5lIExBUkdFCQkJLy8gZnVuY3Rpb25zIHNldCBwYXJhbWV0ZXJzIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorCisgICAgLy8gVGhlc2UgdHlwZXMgY2FuIGJlIGFkanVzdGVkIGJ5IHVzZXJzIHRvIG1hdGNoIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cy4gVGhlIGdvYWwgaXMgdG8KKyAgICAvLyBtaW5pbWl6ZSBjb2RlIG1lbW9yeSBhbmQgbWF4aW1pemUgc3BlZWQuCisjZGVmaW5lIEdFTkVSSUMJCQkvLyBnZW5lcmljIHBvaW50ZXIgdG8gcG9pbnQgdG8gYXBwbGljYXRpb24gZGF0YQorCQkJCQkvLyBWYXJpYWJsZXMgd2l0aCB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgbG9jYXRlZCBpbiBleHRlcm5hbAorCQkJCQkvLyBvciBpbnRlcm5hbCBkYXRhIG1lbW9yeS4KKyNkZWZpbmUgTUVNICAgICAgICAgICAgICBmYXIJLy8gTWVtb3J5IGF0dHJpYnV0ZSB0byBvcHRpbWl6ZSBzcGVlZCBhbmQgY29kZSBvZiBwb2ludGVyIGFjY2Vzcy4KKworI2RlZmluZSBSRUVOVFJBTlQKKyNkZWZpbmUgUFVCTElDCisKKyNpZm5kZWYgTkRFQlVHCisjaW5jbHVkZSA8c3RkaW8uaD4JCS8vIHByb3RvdHlwZSBwcmludGYoKSAoZm9yIFRSQUNFKQorI2RlZmluZSBUUkFDRSAgcHJpbnRmCisjZW5kaWYKKworLy8gICAgI2Vycm9yICgiUkVORVNBUyBvLmsuIikKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBkZWZpbml0aW9ucyBmb3IgQVJNNyBmYW1pbHkgd2l0aCBHTlUgY29tcGlsZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX19MSU5VWF9BUk1fQVJDSF9fKQorCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICBfTk9fT1NfCisjZGVmaW5lIERFVl9TWVNURU0gICAgICBfREVWX0dOVV9BUk03XworCisjZGVmaW5lIE5FQVIJCQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGludGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBGQVIJCQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2RlZmluZSBDT05TVCAgICAgICAgICAgY29uc3QJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisjZGVmaW5lIFJPTQkJCS8vIGNvZGUgb3IgdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisJCQkJCS8vIHVzYWdlOiBDT05TVCBCWVRFIFJPTSBmb28gPSAweDAwOworI2RlZmluZSBIV0FDQwkJCS8vIGhhcmR3YXJlIGFjY2VzcyB0aHJvdWdoIGV4dGVybmFsIG1lbW9yeSAoaS5lLiBDQU4pCisjZGVmaW5lIExBUkdFCQkJLy8gZnVuY3Rpb25zIHNldCBwYXJhbWV0ZXJzIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorCisgICAgLy8gVGhlc2UgdHlwZXMgY2FuIGJlIGFkanVzdGVkIGJ5IHVzZXJzIHRvIG1hdGNoIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cy4gVGhlIGdvYWwgaXMgdG8KKyAgICAvLyBtaW5pbWl6ZSBjb2RlIG1lbW9yeSBhbmQgbWF4aW1pemUgc3BlZWQuCisjZGVmaW5lIEdFTkVSSUMJCQkvLyBnZW5lcmljIHBvaW50ZXIgdG8gcG9pbnQgdG8gYXBwbGljYXRpb24gZGF0YQorCQkJCQkvLyBWYXJpYWJsZXMgd2l0aCB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgbG9jYXRlZCBpbiBleHRlcm5hbAorCQkJCQkvLyBvciBpbnRlcm5hbCBkYXRhIG1lbW9yeS4KKyNkZWZpbmUgTUVNCQkJLy8gTWVtb3J5IGF0dHJpYnV0ZSB0byBvcHRpbWl6ZSBzcGVlZCBhbmQgY29kZSBvZiBwb2ludGVyIGFjY2Vzcy4KKyNkZWZpbmUgSFdBQ0MJCQkvLyBoYXJkd2FyZSBhY2Nlc3MgdGhyb3VnaCBleHRlcm5hbCBtZW1vcnkgKGkuZS4gQ0FOKQorCisjZGVmaW5lIFJFRU5UUkFOVAorI2RlZmluZSBQVUJMSUMKKworI2lmbmRlZiBRV09SRAorI2RlZmluZSBRV09SRCBsb25nIGxvbmcJCS8vIGkuQS4gZHVyY2ggSGVyciBLdXNjaGVsCisjZW5kaWYKKworI2lmbmRlZiBOREVCVUcKKyNpbmNsdWRlIDxzdGRpby5oPgkJLy8gcHJvdG90eXBlIHByaW50ZigpIChmb3IgVFJBQ0UpCisjZGVmaW5lIFRSQUNFICBwcmludGYKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIGRlZmluaXRpb25zIGZvciBNb3Rvcm9sYSBQb3dlclBDIGZhbWlseSA1eDUgKDU1NS81NjUpCisvLyAgZGVmaW5pdGlvbnMgTGludXgtUEMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbGlmIGRlZmluZWQgKF9fR05VQ19fKQorCisjaWYgZGVmaW5lZCAoTElOVVgpIHx8IGRlZmluZWQgKGxpbnV4KSB8fCBkZWZpbmVkIChfX2xpbnV4X18pCisjZGVmaW5lIExJTlVYX1NZU1RFTQkJLy8gZGVmaW5lICdMSU5VWF9TWVNURU0nIHVuaWZvcm0gZm9yIGFsbCBMaW51eCBiYXNlZCBzeXN0ZW1zCisJLy8gci5kLjogV2Ugd2lsbCBuZWVkIGFuIG90aGVyIHNvbHV0aW9uIGhlcmUhIFRoZXJlIGFyZSB0d28gc2VjdGlvbnMgaGVyZSB3aGljaCBkbyBjaGVjayB0aGUgcHJlcHJvYy1kZWZpbml0aW9uczoKKwkvLyAgICAgTElOVVggYW5kIF9fbGludXhfXyAuIFRoZSBmaXJzdCBvbmUgd2FzIExpbnV4IGZvciBQQywgdGhlIHNlY29uZCBvbmUgaXMgdGhpcyBzZWN0aW9uIGZvciBlbWJlZGRlZCBMaW51eCAoTUNGNXh4eCkuCisJLy8gICAgIEJ1dCBMaW51eCBmb3IgUEMgZG9lcyBub3QgbmVlZCB0aGUgZGVmaW5pdGlvbnMgZm9yIGVtYmVkZGVkIExpbnV4LgorI2VuZGlmCisKKyAgICAvLyBHTlUgQyBjb21waWxlciBzdXBwb3J0cyBmdW5jdGlvbiBpbmxpbmluZworI2RlZmluZSBJTkxJTkVfRlVOQ1RJT05fREVGIGV4dGVybiBpbmxpbmUKKworICAgIC8vIHRvIGFjdHVhbGx5IGVuYWJsZSBpbmxpbmluZyBqdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyB0aHJlZSBsaW5lcworICAgIC8vICN1bmRlZiBJTkxJTkVfRlVOQ1RJT04KKyAgICAvLyAjZGVmaW5lIElOTElORV9GVU5DVElPTiAgICAgSU5MSU5FX0ZVTkNUSU9OX0RFRgorICAgIC8vICNkZWZpbmUgSU5MSU5FX0VOQUJMRUQgICAgICBUUlVFCisKKyNpZmRlZiBQWFJPUworI2RlZmluZSBUQVJHRVRfU1lTVEVNICAgICAgIF9QWFJPU18KKyNpZmRlZiBfX2kzODZfXworI3VuZGVmIExJTlVYCQkJLy8gdGhpcyBkZWZpbmUgc2VlbXMgdG8gYmUgc2V0IGZyb20gY29tcGlsZXIKKyNkZWZpbmUgREVWX1NZU1RFTSAgICAgIF9ERVZfSElHSFRFQ19YODZfCisjZWxpZiBkZWZpbmVkIChfX3RyaWNvcmVfXykKKyNkZWZpbmUgREVWX1NZU1RFTSAgICAgIF9ERVZfR05VX1RSSUNPUkVfCisjZWxzZSAvLyBNUEM1eDUKKyNkZWZpbmUgREVWX1NZU1RFTSAgICAgIF9ERVZfR05VX01QQzVYNV8KKyNlbmRpZgorCisjZWxpZiBkZWZpbmVkIChMSU5VWCkgfHwgZGVmaW5lZCAoX19saW51eF9fKQorI2RlZmluZSBUQVJHRVRfU1lTVEVNICAgICAgIF9MSU5VWF8JLy8gTGludXggZGVmaW5pdGlvbgorI2RlZmluZSBERVZfU1lTVEVNICAgICAgICAgIF9ERVZfTElOVVhfCisKKyNlbGlmIGRlZmluZWQgKEdOVV9DRjUyODIpCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICAgICAgX05PX09TXworI2RlZmluZSBERVZfU1lTVEVNICAgICAgICAgIF9ERVZfR05VX0NGNTI4Ml8KKworI2VsaWYgZGVmaW5lZCAoRUNPU1BST19JMzg2X1BFQUtfUENJKQorI2RlZmluZSBUQVJHRVRfU1lTVEVNICAgICAgIF9FQ09TUFJPXworI2RlZmluZSBERVZfU1lTVEVNICAgICAgICAgIF9ERVZfR05VX0kzODZfCisKKyNlbGlmIGRlZmluZWQgKEdOVV9DRjU0OFgpCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICAgICAgX05PX09TXworI2RlZmluZSBERVZfU1lTVEVNICAgICAgICAgIF9ERVZfR05VX0NGNTQ4WF8KKyNlbHNlCisjZXJyb3IgJ0VSUk9SOiBERVZfU1lTVEVNIG5vdCBmb3VuZCEnCisjZW5kaWYKKworI2lmbmRlZiBRV09SRAorI2RlZmluZSBRV09SRCBsb25nIGxvbmcgaW50CisjZW5kaWYKKworI2lmIChUQVJHRVRfU1lTVEVNID09IF9QWFJPU18pCisKKyNpZm5kZWYgX19LRVJORUxfXworI2luY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisKKyNkZWZpbmUgTkVBUgkJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gaW50ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIEZBUgkJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIENPTlNUICAgICAgICAgICBjb25zdAkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKyNkZWZpbmUgUk9NICAgICAvKiB0byBiZSBkZWZpbmVkICovCS8vIGNvZGUgb3IgdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisJCQkJCSAgICAvLyB1c2FnZTogQ09OU1QgQllURSBST00gZm9vID0gMHgwMDsKKyNkZWZpbmUgTEFSR0UJCQkvLyBmdW5jdGlvbnMgc2V0IHBhcmFtZXRlcnMgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisKKwkvLyBUaGVzZSB0eXBlcyBjYW4gYmUgYWRqdXN0ZWQgYnkgdXNlcnMgdG8gbWF0Y2ggYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLiBUaGUgZ29hbCBpcyB0bworCS8vIG1pbmltaXplIGNvZGUgbWVtb3J5IGFuZCBtYXhpbWl6ZSBzcGVlZC4KKyNkZWZpbmUgR0VORVJJQwkJCS8vIGdlbmVyaWMgcG9pbnRlciB0byBwb2ludCB0byBhcHBsaWNhdGlvbiBkYXRhCisJCQkJCSAgICAvLyBWYXJpYWJsZXMgd2l0aCB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgbG9jYXRlZCBpbiBleHRlcm5hbAorCQkJCQkgICAgLy8gb3IgaW50ZXJuYWwgZGF0YSBtZW1vcnkuCisjZGVmaW5lIE1FTQkJCS8vIE1lbW9yeSBhdHRyaWJ1dGUgdG8gb3B0aW1pemUgc3BlZWQgYW5kIGNvZGUgb2YgcG9pbnRlciBhY2Nlc3MuCisKKyNkZWZpbmUgSFdBQ0MJCQkvLyBoYXJkd2FyZSBhY2Nlc3MgdGhyb3VnaCBleHRlcm5hbCBtZW1vcnkgKGkuZS4gQ0FOKQorCisjZGVmaW5lIFJFRU5UUkFOVAorI2RlZmluZSBQVUJMSUMKKworI2lmbmRlZiBRV09SRAorI2RlZmluZSBRV09SRCBsb25nIGxvbmcgaW50CisjZW5kaWYKKworI2lmbmRlZiBOREVCVUcKKyNpbmNsdWRlIDxzdGRpby5oPgkJLy8gcHJvdG90eXBlIHByaW50ZigpIChmb3IgVFJBQ0UpCisjZGVmaW5lIFRSQUNFICBwcmludGYKKyNlbmRpZgorCisjZW5kaWYKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLSBHTlVDIGZvciBJMzg2IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX0xJTlVYXykgfHwgKFRBUkdFVF9TWVNURU0gPT0gX0VDT1NQUk9fKQorCisjaWZuZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorCisjZGVmaW5lIFJPTQkJCS8vIGNvZGUgb3IgdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisJCQkJCS8vIHVzYWdlOiBDT05TVCBCWVRFIFJPTSBmb28gPSAweDAwOworI2RlZmluZSBIV0FDQwkJCS8vIGhhcmR3YXJlIGFjY2VzcyB0aHJvdWdoIGV4dGVybmFsIG1lbW9yeSAoaS5lLiBDQU4pCisKKwkvLyBUaGVzZSB0eXBlcyBjYW4gYmUgYWRqdXN0ZWQgYnkgdXNlcnMgdG8gbWF0Y2ggYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLiBUaGUgZ29hbCBpcyB0bworCS8vIG1pbmltaXplIGNvZGUgbWVtb3J5IGFuZCBtYXhpbWl6ZSBzcGVlZC4KKyNkZWZpbmUgR0VORVJJQwkJCS8vIGdlbmVyaWMgcG9pbnRlciB0byBwb2ludCB0byBhcHBsaWNhdGlvbiBkYXRhCisJCQkJCS8vIFZhcmlhYmxlcyB3aXRoIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBsb2NhdGVkIGluIGV4dGVybmFsCisJCQkJCS8vIG9yIGludGVybmFsIGRhdGEgbWVtb3J5LgorI2RlZmluZSBNRU0JCQkvLyBNZW1vcnkgYXR0cmlidXRlIHRvIG9wdGltaXplIHNwZWVkIGFuZCBjb2RlIG9mIHBvaW50ZXIgYWNjZXNzLgorCisjaWZuZGVmIE5FQVIKKyNkZWZpbmUgTkVBUgkJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gaW50ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZW5kaWYKKworI2lmbmRlZiBGQVIKKyNkZWZpbmUgRkFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNlbmRpZgorCisjaWZuZGVmIENPTlNUCisjZGVmaW5lIENPTlNUIGNvbnN0CQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKyNlbmRpZgorCisjZGVmaW5lIExBUkdFCisKKyNkZWZpbmUgUkVFTlRSQU5UCisjZGVmaW5lIFBVQkxJQworCisjaWZuZGVmIE5ERUJVRworI2lmbmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8c3RkaW8uaD4JCS8vIHByb3RvdHlwZSBwcmludGYoKSAoZm9yIFRSQUNFKQorI2RlZmluZSBUUkFDRSAgcHJpbnRmCisjZWxzZQorI2RlZmluZSBUUkFDRSAgcHJpbnRrCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0gR05VIHdpdGhvdXQgT1MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiAoVEFSR0VUX1NZU1RFTSA9PSBfTk9fT1NfKQorCisjZGVmaW5lIFJPTQkJCS8vIGNvZGUgb3IgdmFyaWFibGVzIG1hcHBlZCB0byBST00gKGkuZS4gZmxhc2gpCisJCQkJCS8vIHVzYWdlOiBDT05TVCBCWVRFIFJPTSBmb28gPSAweDAwOworI2RlZmluZSBIV0FDQwkJCS8vIGhhcmR3YXJlIGFjY2VzcyB0aHJvdWdoIGV4dGVybmFsIG1lbW9yeSAoaS5lLiBDQU4pCisKKwkvLyBUaGVzZSB0eXBlcyBjYW4gYmUgYWRqdXN0ZWQgYnkgdXNlcnMgdG8gbWF0Y2ggYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLiBUaGUgZ29hbCBpcyB0bworCS8vIG1pbmltaXplIGNvZGUgbWVtb3J5IGFuZCBtYXhpbWl6ZSBzcGVlZC4KKyNkZWZpbmUgR0VORVJJQwkJCS8vIGdlbmVyaWMgcG9pbnRlciB0byBwb2ludCB0byBhcHBsaWNhdGlvbiBkYXRhCisJCQkJCS8vIFZhcmlhYmxlcyB3aXRoIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBsb2NhdGVkIGluIGV4dGVybmFsCisJCQkJCS8vIG9yIGludGVybmFsIGRhdGEgbWVtb3J5LgorI2RlZmluZSBNRU0JCQkvLyBNZW1vcnkgYXR0cmlidXRlIHRvIG9wdGltaXplIHNwZWVkIGFuZCBjb2RlIG9mIHBvaW50ZXIgYWNjZXNzLgorCisjaWZuZGVmIE5FQVIKKyNkZWZpbmUgTkVBUgkJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gaW50ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZW5kaWYKKworI2lmbmRlZiBGQVIKKyNkZWZpbmUgRkFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNlbmRpZgorCisjaWZuZGVmIENPTlNUCisjZGVmaW5lIENPTlNUIGNvbnN0CQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKyNlbmRpZgorCisjZGVmaW5lIExBUkdFCisKKyNkZWZpbmUgUkVFTlRSQU5UCisjZGVmaW5lIFBVQkxJQworCisjaWZuZGVmIE5ERUJVRworLy8gICAgICAgICAgICAjaW5jbHVkZSAieHVhcnRkcnYuaCIKKy8vICAgICAgICAgICAgI2luY2x1ZGUgPHN0ZGlvLmg+ICAgICAgICAgICAgICAvLyBwcm90b3R5cGUgcHJpbnRmKCkgKGZvciBUUkFDRSkKKyNkZWZpbmUgVFJBQ0UgIHByaW50ZgorLy8gICAgICAgICAgICAjZGVmaW5lIFRSQUNFICBtcHJpbnRmCisvLyAgICAgICAgICAgICNpZm5kZWYgVFJBQ0UKKy8vICAgICAgICAgICAgICAgICNkZWZpbmUgVFJBQ0UgdHJhY2UKKy8vICAgICAgICAgICAgICAgIHZvaWQgdHJhY2UgKGNoYXIgKmZtdCwgLi4uKTsKKy8vICAgICAgICAgICAgI2VuZGlmCisjZW5kaWYKKworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgZGVmaW5pdGlvbnMgZm9yIE1QQzU2NQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNlbGlmIF9fTVdFUktTX18KKworI2lmZGVmIF9fTUM2OEtfXworCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gPSBfTUNGNTQ4WF8KKyNkZWZpbmUgREVWX1NZU1RFTSAgICAgIF9ERVZfTUNXX01DRjVYWFhfCisKKyNlbHNlCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gPSBfTVBDNTY1XworI2RlZmluZSBERVZfU1lTVEVNICAgICAgX0RFVl9NQ1dfTVBDNVg1XworI2VuZGlmCisKKyNkZWZpbmUgTkVBUgkJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gaW50ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIEZBUgkJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIENPTlNUICAgICAgICAgICBjb25zdAkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKyNkZWZpbmUgUk9NCQkJLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkJLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIExBUkdFCQkJLy8gZnVuY3Rpb25zIHNldCBwYXJhbWV0ZXJzIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorCisgICAgLy8gVGhlc2UgdHlwZXMgY2FuIGJlIGFkanVzdGVkIGJ5IHVzZXJzIHRvIG1hdGNoIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cy4gVGhlIGdvYWwgaXMgdG8KKyAgICAvLyBtaW5pbWl6ZSBjb2RlIG1lbW9yeSBhbmQgbWF4aW1pemUgc3BlZWQuCisjZGVmaW5lIEdFTkVSSUMJCQkvLyBnZW5lcmljIHBvaW50ZXIgdG8gcG9pbnQgdG8gYXBwbGljYXRpb24gZGF0YQorCQkJCQkvLyBWYXJpYWJsZXMgd2l0aCB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgbG9jYXRlZCBpbiBleHRlcm5hbAorCQkJCQkvLyBvciBpbnRlcm5hbCBkYXRhIG1lbW9yeS4KKyNkZWZpbmUgTUVNCQkJLy8gTWVtb3J5IGF0dHJpYnV0ZSB0byBvcHRpbWl6ZSBzcGVlZCBhbmQgY29kZSBvZiBwb2ludGVyIGFjY2Vzcy4KKworI2RlZmluZSBIV0FDQwkJCS8vIGhhcmR3YXJlIGFjY2VzcyB0aHJvdWdoIGV4dGVybmFsIG1lbW9yeSAoaS5lLiBDQU4pCisKKyNkZWZpbmUgUkVFTlRSQU5UCisjZGVmaW5lIFBVQkxJQworCisjaWZuZGVmIE5ERUJVRworI2luY2x1ZGUgPHN0ZGlvLmg+CQkvLyBwcm90b3R5cGUgcHJpbnRmKCkgKGZvciBUUkFDRSkKKyNkZWZpbmUgVFJBQ0UgIHByaW50ZgorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgZGVmaW5pdGlvbnMgZm9yIEJFQ0sgMXgzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VsaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKSAmJiBkZWZpbmVkIChfX1BBUkFESUdNX18pCisKKyNkZWZpbmUgVEFSR0VUX1NZU1RFTSAgICAgIF9OT19PU18KKyNkZWZpbmUgREVWX1NZU1RFTSAgICAgICAgIF9ERVZfUEFSX0JFQ0sxWDNfCisKKyNkZWZpbmUgUk9NCQkJLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkgICAgIC8vIHVzYWdlOiBDT05TVCBCWVRFIFJPTSBmb28gPSAweDAwOworI2RlZmluZSBIV0FDQwkJCS8vIGhhcmR3YXJlIGFjY2VzcyB0aHJvdWdoIGV4dGVybmFsIG1lbW9yeSAoaS5lLiBDQU4pCisKKyAgICAgLy8gVGhlc2UgdHlwZXMgY2FuIGJlIGFkanVzdGVkIGJ5IHVzZXJzIHRvIG1hdGNoIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cy4gVGhlIGdvYWwgaXMgdG8KKyAgICAgLy8gbWluaW1pemUgY29kZSBtZW1vcnkgYW5kIG1heGltaXplIHNwZWVkLgorI2RlZmluZSBHRU5FUklDCQkJLy8gZ2VuZXJpYyBwb2ludGVyIHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEKKwkJCQkgICAgIC8vIFZhcmlhYmxlcyB3aXRoIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBsb2NhdGVkIGluIGV4dGVybmFsCisJCQkJICAgICAvLyBvciBpbnRlcm5hbCBkYXRhIG1lbW9yeS4KKyNkZWZpbmUgTUVNCQkJLy8gTWVtb3J5IGF0dHJpYnV0ZSB0byBvcHRpbWl6ZSBzcGVlZCBhbmQgY29kZSBvZiBwb2ludGVyIGFjY2Vzcy4KKyNkZWZpbmUgTkVBUiBfX25lYXIJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gaW50ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIEZBUiAgX19mYXIJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIENPTlNUIGNvbnN0CQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKyNkZWZpbmUgTEFSR0UKKworI2RlZmluZSBSRUVOVFJBTlQKKyNkZWZpbmUgUFVCTElDCisKKyNpZm5kZWYgTkRFQlVHCisjaWZuZGVmIFRSQUNFCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNkZWZpbmUgVFJBQ0UgcHJpbnRmCisjZW5kaWYKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIGRlZmluaXRpb25zIGZvciBQQworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VsaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tIGRlZmluaXRpb24gdGFyZ2V0IHN5c3RlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgX1dJTjMyCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICBfV0lOMzJfCS8vIFdJTjMyIGRlZmluaXRpb24KKyNkZWZpbmUgREVWX1NZU1RFTSAgICAgIF9ERVZfV0lOMzJfCisjZWxzZQorI2RlZmluZSBUQVJHRVRfU1lTVEVNICAgX0RPU18KKyNkZWZpbmUgREVWX1NZU1RFTSAgICAgIF9ERVZfQk9STEFORF9ET1NfCisjZW5kaWYKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLSBXSU4zMiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIChUQVJHRVRfU1lTVEVNID09IF9XSU4zMl8pCisKKyNkZWZpbmUgUk9NCQkJLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkJLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIEhXQUNDCQkJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKworCS8vIFRoZXNlIHR5cGVzIGNhbiBiZSBhZGp1c3RlZCBieSB1c2VycyB0byBtYXRjaCBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuIFRoZSBnb2FsIGlzIHRvCisJLy8gbWluaW1pemUgY29kZSBtZW1vcnkgYW5kIG1heGltaXplIHNwZWVkLgorI2RlZmluZSBHRU5FUklDCQkJLy8gZ2VuZXJpYyBwb2ludGVyIHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEKKwkJCQkJLy8gVmFyaWFibGVzIHdpdGggdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIGxvY2F0ZWQgaW4gZXh0ZXJuYWwKKwkJCQkJLy8gb3IgaW50ZXJuYWwgZGF0YSBtZW1vcnkuCisjZGVmaW5lIE1FTQkJCS8vIE1lbW9yeSBhdHRyaWJ1dGUgdG8gb3B0aW1pemUgc3BlZWQgYW5kIGNvZGUgb2YgcG9pbnRlciBhY2Nlc3MuCisKKyNpZm5kZWYgTkVBUgorI2RlZmluZSBORUFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNlbmRpZgorCisjaWZuZGVmIEZBUgorI2RlZmluZSBGQVIJCQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2VuZGlmCisKKyNpZm5kZWYgQ09OU1QKKyNkZWZpbmUgQ09OU1QgY29uc3QJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2VuZGlmCisKKyNkZWZpbmUgTEFSR0UKKworI2RlZmluZSBSRUVOVFJBTlQKKyNkZWZpbmUgUFVCTElDIF9fc3RkY2FsbAorCisjaWZuZGVmIE5ERUJVRworI2lmbmRlZiBUUkFDRQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjZGVmaW5lIFRSQUNFIHByaW50ZgorI2VuZGlmCisjZW5kaWYKKworI2VsaWYgKFRBUkdFVF9TWVNURU0gPT0gX0RPU18pCisKKyNkZWZpbmUgUk9NCQkJLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkJLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIEhXQUNDCQkJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKworCS8vIFRoZXNlIHR5cGVzIGNhbiBiZSBhZGp1c3RlZCBieSB1c2VycyB0byBtYXRjaCBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuIFRoZSBnb2FsIGlzIHRvCisJLy8gbWluaW1pemUgY29kZSBtZW1vcnkgYW5kIG1heGltaXplIHNwZWVkLgorI2RlZmluZSBHRU5FUklDCQkJLy8gZ2VuZXJpYyBwb2ludGVyIHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEKKwkJCQkJLy8gVmFyaWFibGVzIHdpdGggdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIGxvY2F0ZWQgaW4gZXh0ZXJuYWwKKwkJCQkJLy8gb3IgaW50ZXJuYWwgZGF0YSBtZW1vcnkuCisjZGVmaW5lIE1FTQkJCS8vIE1lbW9yeSBhdHRyaWJ1dGUgdG8gb3B0aW1pemUgc3BlZWQgYW5kIGNvZGUgb2YgcG9pbnRlciBhY2Nlc3MuCisjZGVmaW5lIE5FQVIgbmVhcgkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgRkFSICBmYXIJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIENPTlNUIGNvbnN0CQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKyNkZWZpbmUgTEFSR0UKKworI2RlZmluZSBSRUVOVFJBTlQKKyNkZWZpbmUgUFVCTElDCisKKyNpZm5kZWYgTkRFQlVHCisjaWZuZGVmIFRSQUNFCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNkZWZpbmUgVFJBQ0UgcHJpbnRmCisjZW5kaWYKKyNlbmRpZgorCisjZW5kaWYKKworI2VsaWYgKF9NU0NfVkVSID09IDgwMCkJCS8vIFBDIE1TIFZpc3VhbCBDL0MrKyBmb3IgRE9TIGFwcGxpY2F0aW9ucworCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICBfRE9TXworI2RlZmluZSBERVZfU1lTVEVNICAgICAgX0RFVl9NU1ZDX0RPU18KKworI2RlZmluZSBST00JCQkvLyBjb2RlIG9yIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorCQkJCSAgICAvLyB1c2FnZTogQ09OU1QgQllURSBST00gZm9vID0gMHgwMDsKKyNkZWZpbmUgSFdBQ0MgbmVhcgkJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKworICAgIC8vIFRoZXNlIHR5cGVzIGNhbiBiZSBhZGp1c3RlZCBieSB1c2VycyB0byBtYXRjaCBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuIFRoZSBnb2FsIGlzIHRvCisgICAgLy8gbWluaW1pemUgY29kZSBtZW1vcnkgYW5kIG1heGltaXplIHNwZWVkLgorI2RlZmluZSBHRU5FUklDCQkJLy8gZ2VuZXJpYyBwb2ludGVyIHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEKKwkJCQkgICAgLy8gVmFyaWFibGVzIHdpdGggdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIGxvY2F0ZWQgaW4gZXh0ZXJuYWwKKwkJCQkgICAgLy8gb3IgaW50ZXJuYWwgZGF0YSBtZW1vcnkuCisjZGVmaW5lIE1FTQkJCS8vIE1lbW9yeSBhdHRyaWJ1dGUgdG8gb3B0aW1pemUgc3BlZWQgYW5kIGNvZGUgb2YgcG9pbnRlciBhY2Nlc3MuCisjZGVmaW5lIE5FQVIgbmVhcgkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNkZWZpbmUgRkFSICBmYXIJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZGVmaW5lIENPTlNUIGNvbnN0CQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKyNkZWZpbmUgTEFSR0UKKworI2RlZmluZSBSRUVOVFJBTlQKKyNkZWZpbmUgUFVCTElDCisKKyNpZm5kZWYgTkRFQlVHCisjaWZuZGVmIFRSQUNFCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNkZWZpbmUgVFJBQ0UgcHJpbnRmCisjZW5kaWYKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZGVmaW5pdGlvbnMgZm9yIFJUWCB1bmRlciBXSU4zMgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNlbGlmIChkZWZpbmVkIChVTkRFUl9SVFNTKSAmJiBkZWZpbmVkIChXSU4zMikpCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0gZGVmaW5pdGlvbiB0YXJnZXQgc3lzdGVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICBfV0lOMzJfUlRYXworI2RlZmluZSBERVZfU1lTVEVNICAgICAgX0RFVl9XSU4zMl9SVFhfCisKKyNkZWZpbmUgUk9NCQkJLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkgICAgLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIEhXQUNDCQkJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKworICAgIC8vIFRoZXNlIHR5cGVzIGNhbiBiZSBhZGp1c3RlZCBieSB1c2VycyB0byBtYXRjaCBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuIFRoZSBnb2FsIGlzIHRvCisgICAgLy8gbWluaW1pemUgY29kZSBtZW1vcnkgYW5kIG1heGltaXplIHNwZWVkLgorI2RlZmluZSBHRU5FUklDCQkJLy8gZ2VuZXJpYyBwb2ludGVyIHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEKKwkJCQkgICAgLy8gVmFyaWFibGVzIHdpdGggdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIGxvY2F0ZWQgaW4gZXh0ZXJuYWwKKwkJCQkgICAgLy8gb3IgaW50ZXJuYWwgZGF0YSBtZW1vcnkuCisjZGVmaW5lIE1FTQkJCS8vIE1lbW9yeSBhdHRyaWJ1dGUgdG8gb3B0aW1pemUgc3BlZWQgYW5kIGNvZGUgb2YgcG9pbnRlciBhY2Nlc3MuCisKKyNpZm5kZWYgTkVBUgorI2RlZmluZSBORUFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNlbmRpZgorCisjaWZuZGVmIEZBUgorI2RlZmluZSBGQVIJCQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2VuZGlmCisKKyNpZm5kZWYgQ09OU1QKKyNkZWZpbmUgQ09OU1QgY29uc3QJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2VuZGlmCisKKyNkZWZpbmUgTEFSR0UKKworI2RlZmluZSBSRUVOVFJBTlQKKyNkZWZpbmUgUFVCTElDIF9fc3RkY2FsbAorCisjaWZuZGVmIE5ERUJVRworI2lmbmRlZiBUUkFDRQorI2RlZmluZSBUUkFDRSBSdFByaW50ZgorI2VuZGlmCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGRlZmluaXRpb25zIGZvciBXaW5DRQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNlbGlmIGRlZmluZWQgKF9XSU4zMl9XQ0UpCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0gZGVmaW5pdGlvbiB0YXJnZXQgc3lzdGVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICAgICAgICAgIF9XSU5DRV8KKyNkZWZpbmUgREVWX1NZU1RFTSAgICAgICAgICAgICAgX0RFVl9XSU5fQ0VfCisKKyNkZWZpbmUgUk9NCQkJLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkgICAgLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIEhXQUNDCQkJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKworICAgIC8vIFRoZXNlIHR5cGVzIGNhbiBiZSBhZGp1c3RlZCBieSB1c2VycyB0byBtYXRjaCBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuIFRoZSBnb2FsIGlzIHRvCisgICAgLy8gbWluaW1pemUgY29kZSBtZW1vcnkgYW5kIG1heGltaXplIHNwZWVkLgorI2RlZmluZSBHRU5FUklDCQkJLy8gZ2VuZXJpYyBwb2ludGVyIHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEKKwkJCQkgICAgLy8gVmFyaWFibGVzIHdpdGggdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIGxvY2F0ZWQgaW4gZXh0ZXJuYWwKKwkJCQkgICAgLy8gb3IgaW50ZXJuYWwgZGF0YSBtZW1vcnkuCisjZGVmaW5lIE1FTQkJCS8vIE1lbW9yeSBhdHRyaWJ1dGUgdG8gb3B0aW1pemUgc3BlZWQgYW5kIGNvZGUgb2YgcG9pbnRlciBhY2Nlc3MuCisKKyNpZm5kZWYgTkVBUgorI2RlZmluZSBORUFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNlbmRpZgorCisjaWZuZGVmIEZBUgorI2RlZmluZSBGQVIJCQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIGV4dGVybmFsIGRhdGEgc3RvcmFnZSBsb2NhdGlvbgorI2VuZGlmCisKKyNpZm5kZWYgQ09OU1QKKyNkZWZpbmUgQ09OU1QgY29uc3QJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2VuZGlmCisKKyNkZWZpbmUgTEFSR0UKKworI2lmbmRlZiBRV09SRAorICAgICAgLy8jZGVmaW5lIFFXT1JEIGxvbmcgbG9uZyBpbnQgLy8gTVNWQyAuTkVUIGNhbiB1c2UgImxvbmcgbG9uZyBpbnQiIHRvbyAobGlrZSBHTlUpCisjZGVmaW5lIFFXT1JEIF9faW50NjQKKyNlbmRpZgorCisjZGVmaW5lIFJFRU5UUkFOVAorI2RlZmluZSBQVUJMSUMgX19jZGVjbAorCisjaWZkZWYgQVNTRVJUTVNHCisjdW5kZWYgQVNTRVJUTVNHCisjZW5kaWYKKworI2lmbmRlZiBOREVCVUcKKyNpZm5kZWYgVFJBQ0UKKyNkZWZpbmUgVFJBQ0UgcHJpbnRmCisvLyAgICAgICAgICAgIHZvaWQgdHJhY2UgKGNoYXIgKmZtdCwgLi4uKTsKKyNlbmRpZgorI2VuZGlmCisKKyNlbHNlIC8vID09PT4gUEMgTVMgVmlzdWFsIEMvQysrCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0gZGVmaW5pdGlvbiB0YXJnZXQgc3lzdGVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBfV0lOMzIKKyNkZWZpbmUgVEFSR0VUX1NZU1RFTSAgIF9XSU4zMl8JLy8gV0lOMzIgZGVmaW5pdGlvbgorI2RlZmluZSBERVZfU1lTVEVNICAgICAgX0RFVl9XSU4zMl8KKyNlbHNlCisjZGVmaW5lIFRBUkdFVF9TWVNURU0gICBfV0lOMTZfCS8vIFdJTjE2IGRlZmluaXRpb24KKyNkZWZpbmUgREVWX1NZU1RFTSAgICAgIF9ERVZfV0lOMTZfCisjZW5kaWYKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLSBXSU4xNiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIChUQVJHRVRfU1lTVEVNID09IF9XSU4xNl8pCisKKyNkZWZpbmUgUk9NCQkJLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkJLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIEhXQUNDCQkJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKworCS8vIFRoZXNlIHR5cGVzIGNhbiBiZSBhZGp1c3RlZCBieSB1c2VycyB0byBtYXRjaCBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuIFRoZSBnb2FsIGlzIHRvCisJLy8gbWluaW1pemUgY29kZSBtZW1vcnkgYW5kIG1heGltaXplIHNwZWVkLgorI2RlZmluZSBHRU5FUklDCQkJLy8gZ2VuZXJpYyBwb2ludGVyIHRvIHBvaW50IHRvIGFwcGxpY2F0aW9uIGRhdGEKKwkJCQkJLy8gVmFyaWFibGVzIHdpdGggdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIGxvY2F0ZWQgaW4gZXh0ZXJuYWwKKwkJCQkJLy8gb3IgaW50ZXJuYWwgZGF0YSBtZW1vcnkuCisjZGVmaW5lIE1FTQkJCS8vIE1lbW9yeSBhdHRyaWJ1dGUgdG8gb3B0aW1pemUgc3BlZWQgYW5kIGNvZGUgb2YgcG9pbnRlciBhY2Nlc3MuCisKKyNpZm5kZWYgTkVBUgorI2RlZmluZSBORUFSCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBpbnRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNlbmRpZgorCisjaWZuZGVmIEZBUgorI2RlZmluZSBGQVIgZmFyCQkJLy8gdmFyaWFibGVzIG1hcHBlZCB0byBleHRlcm5hbCBkYXRhIHN0b3JhZ2UgbG9jYXRpb24KKyNlbmRpZgorCisjaWZuZGVmIENPTlNUCisjZGVmaW5lIENPTlNUIGNvbnN0CQkvLyB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKyNlbmRpZgorCisjZGVmaW5lIExBUkdFCisKKyNkZWZpbmUgUkVFTlRSQU5UCisjZGVmaW5lIFBVQkxJQyBfZmFyIF9wYXNjYWwgX2V4cG9ydAorCisjaWZuZGVmIE5ERUJVRworI2lmbmRlZiBUUkFDRQorI2RlZmluZSBUUkFDRSB0cmFjZQorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCXZvaWQgdHJhY2UoY29uc3QgY2hhciAqZm10LCAuLi4pOworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0gV0lOMzIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgKFRBUkdFVF9TWVNURU0gPT0gX1dJTjMyXykKKyNkZWZpbmUgUk9NCQkJLy8gY29kZSBvciB2YXJpYWJsZXMgbWFwcGVkIHRvIFJPTSAoaS5lLiBmbGFzaCkKKwkJCQkJLy8gdXNhZ2U6IENPTlNUIEJZVEUgUk9NIGZvbyA9IDB4MDA7CisjZGVmaW5lIEhXQUNDCQkJLy8gaGFyZHdhcmUgYWNjZXNzIHRocm91Z2ggZXh0ZXJuYWwgbWVtb3J5IChpLmUuIENBTikKKwkvLyBUaGVzZSB0eXBlcyBjYW4gYmUgYWRqdXN0ZWQgYnkgdXNlcnMgdG8gbWF0Y2ggYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLiBUaGUgZ29hbCBpcyB0by8vIG1pbmltaXplIGNvZGUgbWVtb3J5IGFuZCBtYXhpbWl6ZSBzcGVlZC4KKyNkZWZpbmUgR0VORVJJQwkJCS8vIGdlbmVyaWMgcG9pbnRlciB0byBwb2ludCB0byBhcHBsaWNhdGlvbiBkYXRhCisJCQkJCS8vIFZhcmlhYmxlcyB3aXRoIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBsb2NhdGVkIGluIGV4dGVybmFsLy8gb3IgaW50ZXJuYWwgZGF0YSBtZW1vcnkuCisjZGVmaW5lIE1FTQkJCS8vIE1lbW9yeSBhdHRyaWJ1dGUgdG8gb3B0aW1pemUgc3BlZWQgYW5kIGNvZGUgb2YgcG9pbnRlciBhY2Nlc3MuCisjaWZuZGVmIE5FQVIKKyNkZWZpbmUgTkVBUgkJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gaW50ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZW5kaWYKKyNpZm5kZWYgRkFSCisjZGVmaW5lIEZBUgkJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gZXh0ZXJuYWwgZGF0YSBzdG9yYWdlIGxvY2F0aW9uCisjZW5kaWYKKyNpZm5kZWYgQ09OU1QKKyNkZWZpbmUgQ09OU1QgY29uc3QJCS8vIHZhcmlhYmxlcyBtYXBwZWQgdG8gUk9NIChpLmUuIGZsYXNoKQorI2VuZGlmCisjZGVmaW5lIExBUkdFCisjZGVmaW5lIFJFRU5UUkFOVAorI2RlZmluZSBQVUJMSUMgX19zdGRjYWxsCisjaWZuZGVmIFFXT1JECisJICAvLyNkZWZpbmUgUVdPUkQgbG9uZyBsb25nIGludCAvLyBNU1ZDIC5ORVQgY2FuIHVzZSAibG9uZyBsb25nIGludCIgdG9vIChsaWtlIEdOVSkKKyNkZWZpbmUgUVdPUkQgX19pbnQ2NAorI2VuZGlmCisjaWZuZGVmIE5ERUJVRworI2lmbmRlZiBUUkFDRQorI2RlZmluZSBUUkFDRSB0cmFjZQorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCXZvaWQgdHJhY2UoY29uc3QgY2hhciAqZm10LCAuLi4pOworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisJLy8gTVMgVmlzdWFsIEMrKyBjb21waWxlciBzdXBwb3J0cyBmdW5jdGlvbiBpbmxpbmluZworI2RlZmluZSBJTkxJTkVfRlVOQ1RJT05fREVGIF9fZm9yY2VpbmxpbmUKKwkvLyB0byBhY3R1YWxseSBlbmFibGUgaW5saW5pbmcganVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgdHdvIGxpbmVzLy8gI2RlZmluZSBJTkxJTkVfRlVOQ1RJT04gICAgIElOTElORV9GVU5DVElPTl9ERUYvLyAjZGVmaW5lIElOTElORV9FTkFCTEVEICAgICAgVFJVRQorI2VuZGlmCisjZW5kaWYJCQkJLy8gPT09PiBQQworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLyAgZGVmaW5pdGlvbnMgb2YgYmFzaWMgdHlwZXMvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmbmRlZiBfV0lOREVGXwkJLy8gZGVmaW5lZCBpbiBXSU5ERUYuSCwgaW5jbHVkZWQgYnkgPHdpbmRvd3MuaD4KKyAgICAvLyAtLS0gYXJpdGhtZXRpYyB0eXBlcyAtLS0KKyNpZm5kZWYgU0hPUlQKKyNkZWZpbmUgU0hPUlQgc2hvcnQgaW50CisjZW5kaWYKKyNpZm5kZWYgVVNIT1JUCisjZGVmaW5lIFVTSE9SVCB1bnNpZ25lZCBzaG9ydCBpbnQKKyNlbmRpZgorI2lmbmRlZiBJTlQKKyNkZWZpbmUgSU5UIGludAorI2VuZGlmCisjaWZuZGVmIFVJTlQKKyNkZWZpbmUgVUlOVCB1bnNpZ25lZCBpbnQKKyNlbmRpZgorI2lmbmRlZiBMT05HCisjZGVmaW5lIExPTkcgbG9uZyBpbnQKKyNlbmRpZgorI2lmbmRlZiBVTE9ORworI2RlZmluZSBVTE9ORyB1bnNpZ25lZCBsb25nIGludAorI2VuZGlmCisgICAgLy8gLS0tIGxvZ2ljIHR5cGVzIC0tLQorI2lmbmRlZiBCWVRFCisjZGVmaW5lIEJZVEUgdW5zaWduZWQgY2hhcgorI2VuZGlmCisjaWZuZGVmIFdPUkQKKyNkZWZpbmUgV09SRCB1bnNpZ25lZCBzaG9ydCBpbnQKKyNlbmRpZgorI2lmbmRlZiBEV09SRAorI2RlZmluZSBEV09SRCB1bnNpZ25lZCBsb25nIGludAorI2VuZGlmCisjaWZuZGVmIEJPT0wKKyNkZWZpbmUgQk9PTCB1bnNpZ25lZCBjaGFyCisjZW5kaWYKKyAgICAvLyAtLS0gYWxpYXMgdHlwZXMgLS0tCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgVFJVRSAgMHhGRgorI2VuZGlmCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFIDB4MDAKKyNlbmRpZgorI2lmbmRlZiBOVUxMCisjZGVmaW5lIE5VTEwgKCh2b2lkICopIDApCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBfVElNRV9PRl9EQVlfREVGSU5FRF8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIGludCBtX2R3TXM7CisJdW5zaWduZWQgc2hvcnQgaW50IG1fd0RheXM7CisKK30gdFRpbWVPZkRheTsKKworI2RlZmluZSBfVElNRV9PRl9EQVlfREVGSU5FRF8KKworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgRGVmaW5pdGlvbiB2b24gVFJBQ0UKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZm5kZWYgTkRFQlVHCisKKyNpZm5kZWYgVFJBQ0UwCisjZGVmaW5lIFRSQUNFMChwMCkgICAgICAgICAgICAgICAgICAgICAgVFJBQ0UocDApCisjZW5kaWYKKworI2lmbmRlZiBUUkFDRTEKKyNkZWZpbmUgVFJBQ0UxKHAwLCBwMSkgICAgICAgICAgICAgICAgICBUUkFDRShwMCwgcDEpCisjZW5kaWYKKworI2lmbmRlZiBUUkFDRTIKKyNkZWZpbmUgVFJBQ0UyKHAwLCBwMSwgcDIpICAgICAgICAgICAgICBUUkFDRShwMCwgcDEsIHAyKQorI2VuZGlmCisKKyNpZm5kZWYgVFJBQ0UzCisjZGVmaW5lIFRSQUNFMyhwMCwgcDEsIHAyLCBwMykgICAgICAgICAgVFJBQ0UocDAsIHAxLCBwMiwgcDMpCisjZW5kaWYKKworI2lmbmRlZiBUUkFDRTQKKyNkZWZpbmUgVFJBQ0U0KHAwLCBwMSwgcDIsIHAzLCBwNCkgICAgICBUUkFDRShwMCwgcDEsIHAyLCBwMywgcDQpCisjZW5kaWYKKworI2lmbmRlZiBUUkFDRTUKKyNkZWZpbmUgVFJBQ0U1KHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUpICBUUkFDRShwMCwgcDEsIHAyLCBwMywgcDQsIHA1KQorI2VuZGlmCisKKyNpZm5kZWYgVFJBQ0U2CisjZGVmaW5lIFRSQUNFNihwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNikgIFRSQUNFKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2KQorI2VuZGlmCisKKyNlbHNlCisKKyNpZm5kZWYgVFJBQ0UwCisjZGVmaW5lIFRSQUNFMChwMCkKKyNlbmRpZgorCisjaWZuZGVmIFRSQUNFMQorI2RlZmluZSBUUkFDRTEocDAsIHAxKQorI2VuZGlmCisKKyNpZm5kZWYgVFJBQ0UyCisjZGVmaW5lIFRSQUNFMihwMCwgcDEsIHAyKQorI2VuZGlmCisKKyNpZm5kZWYgVFJBQ0UzCisjZGVmaW5lIFRSQUNFMyhwMCwgcDEsIHAyLCBwMykKKyNlbmRpZgorCisjaWZuZGVmIFRSQUNFNAorI2RlZmluZSBUUkFDRTQocDAsIHAxLCBwMiwgcDMsIHA0KQorI2VuZGlmCisKKyNpZm5kZWYgVFJBQ0U1CisjZGVmaW5lIFRSQUNFNShwMCwgcDEsIHAyLCBwMywgcDQsIHA1KQorI2VuZGlmCisKKyNpZm5kZWYgVFJBQ0U2CisjZGVmaW5lIFRSQUNFNihwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNikKKyNlbmRpZgorCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBkZWZpbml0aW9uIG9mIEFTU0VSVAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBBU1NFUlQKKyNpZiAhZGVmaW5lZCAoX19saW51eF9fKSAmJiAhZGVmaW5lZCAoX19LRVJORUxfXykKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpZm5kZWYgQVNTRVJUCisjZGVmaW5lIEFTU0VSVChwKSAgICBhc3NlcnQocCkKKyNlbmRpZgorI2Vsc2UKKyNkZWZpbmUgQVNTRVJUKHApCisjZW5kaWYKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFNZUyBURUMgZXh0ZW5zaW9ucworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVGhpcyBtYWNybyBkb2Vzbid0IHByaW50IG91dCBDLWZpbGUgYW5kIGxpbmUgbnVtYmVyIG9mIHRoZSBmYWlsZWQgYXNzZXJ0aW9uCisvLyBidXQgYSBzdHJpbmcsIHdoaWNoIGV4YWN0bHkgbmFtZXMgdGhlIG1pc3Rha2UuCisjaWZuZGVmIE5ERUJVRworCisjZGVmaW5lIEFTU0VSVE1TRyhleHByLHN0cmluZykgIGlmICghKGV4cHIpKSB7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSSU5URjAgKCJBc3NlcnRpb24gZmFpbGVkOiAiIHN0cmluZyApO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoMSk7fQorI2Vsc2UKKyNkZWZpbmUgQVNTRVJUTVNHKGV4cHIsc3RyaW5nKQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9HTE9CQUxfSF8KKworLy8gUGxlYXNlIGtlZXAgYW4gZW1wdHkgbGluZSBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbERsbGsuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbERsbGsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODhlODcxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsRGxsay5oCkBAIC0wLDAgKzEsMTY1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBrZXJuZWxzcGFjZSBETEwgbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsRGxsay5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMDggZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExfRExMS19IXworI2RlZmluZSBfRVBMX0RMTEtfSF8KKworI2luY2x1ZGUgIi4uL0VwbERsbC5oIgorI2luY2x1ZGUgIi4uL0VwbEV2ZW50LmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiB0RXBsS2VybmVsKCp0RXBsRGxsa0NiQXN5bmMpICh0RXBsRnJhbWVJbmZvICogcEZyYW1lSW5mb19wKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUJZVEUgbV9iZV9hYlNyY01hY1s2XTsKKworfSB0RXBsRGxsa0luaXRQYXJhbTsKKworLy8gZm9yd2FyZCBkZWNsYXJhdGlvbgorc3RydWN0IF90RWRydlR4QnVmZmVyOworCitzdHJ1Y3QgX3RFcGxEbGxrTm9kZUluZm8geworCXN0cnVjdCBfdEVwbERsbGtOb2RlSW5mbyAqbV9wTmV4dE5vZGVJbmZvOworCXN0cnVjdCBfdEVkcnZUeEJ1ZmZlciAqbV9wUHJlcVR4QnVmZmVyOworCXVuc2lnbmVkIGludCBtX3VpTm9kZUlkOworCURXT1JEIG1fZHdQcmVzVGltZW91dDsKKwl1bnNpZ25lZCBsb25nIG1fdWxEbGxFcnJvckV2ZW50czsKKwl0RXBsTm10U3RhdGUgbV9ObXRTdGF0ZTsKKwlXT1JEIG1fd1ByZXNQYXlsb2FkTGltaXQ7CisJQllURSBtX2JlX2FiTWFjQWRkcls2XTsKKwlCWVRFIG1fYlNvYUZsYWcxOworCUJPT0wgbV9mU29mdERlbGV0ZTsJLy8gZGVsZXRlIG5vZGUgYWZ0ZXIgZXJyb3IgYW5kIGlnbm9yZSBlcnJvcgorCit9OworCit0eXBlZGVmIHN0cnVjdCBfdEVwbERsbGtOb2RlSW5mbyB0RXBsRGxsa05vZGVJbmZvOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKwordEVwbEtlcm5lbCBFcGxEbGxrQWRkSW5zdGFuY2UodEVwbERsbGtJbml0UGFyYW0gKiBwSW5pdFBhcmFtX3ApOworCit0RXBsS2VybmVsIEVwbERsbGtEZWxJbnN0YW5jZSh2b2lkKTsKKworLy8gY2FsbGVkIGJlZm9yZSBOTVRfR1NfQ09NTVVOSUNBVElORyB3aWxsIGJlIGVudGVyZWQgdG8gY29uZmlndXJlIGZpeGVkIHBhcmFtZXRlcnMKK3RFcGxLZXJuZWwgRXBsRGxsa0NvbmZpZyh0RXBsRGxsQ29uZmlnUGFyYW0gKiBwRGxsQ29uZmlnUGFyYW1fcCk7CisKKy8vIHNldCBpZGVudGl0eSBvZiBsb2NhbCBub2RlIChtYXkgYmUgYXQgYW55IHRpbWUsIGUuZy4gaW4gY2FzZSBvZiBob3N0bmFtZSBjaGFuZ2UpCit0RXBsS2VybmVsIEVwbERsbGtTZXRJZGVudGl0eSh0RXBsRGxsSWRlbnRQYXJhbSAqIHBEbGxJZGVudFBhcmFtX3ApOworCisvLyBwcm9jZXNzIGludGVybmFsIGV2ZW50cyBhbmQgZG8gd29yayB0aGF0IGNhbm5vdCBiZSBkb25lIGluIGludGVycnVwdC1jb250ZXh0Cit0RXBsS2VybmVsIEVwbERsbGtQcm9jZXNzKHRFcGxFdmVudCAqIHBFdmVudF9wKTsKKworLy8gcmVnaXN0ZXJzIGhhbmRsZXIgZm9yIG5vbi1FUEwgZnJhbWVzCit0RXBsS2VybmVsIEVwbERsbGtSZWdBc3luY0hhbmRsZXIodEVwbERsbGtDYkFzeW5jIHBmbkRsbGtDYkFzeW5jX3ApOworCisvLyBkZXJlZ2lzdGVycyBoYW5kbGVyIGZvciBub24tRVBMIGZyYW1lcwordEVwbEtlcm5lbCBFcGxEbGxrRGVyZWdBc3luY0hhbmRsZXIodEVwbERsbGtDYkFzeW5jIHBmbkRsbGtDYkFzeW5jX3ApOworCisvLyByZWdpc3RlciBDX0RMTF9NVUxUSUNBU1RfQVNORCBpbiBldGhlcm5ldCBkcml2ZXIgaWYgYW55IEFzbmRTZXJ2aWNlSWQgaXMgcmVnaXN0ZXJlZAordEVwbEtlcm5lbCBFcGxEbGxrU2V0QXNuZFNlcnZpY2VJZEZpbHRlcih0RXBsRGxsQXNuZFNlcnZpY2VJZCBTZXJ2aWNlSWRfcCwKKwkJCQkJIHRFcGxEbGxBc25kRmlsdGVyIEZpbHRlcl9wKTsKKworLy8gY3JlYXRlcyB0aGUgYnVmZmVyIGZvciBhIFR4IGZyYW1lIGFuZCByZWdpc3RlcnMgaXQgdG8gdGhlIGV0aGVybmV0IGRyaXZlcgordEVwbEtlcm5lbCBFcGxEbGxrQ3JlYXRlVHhGcmFtZSh1bnNpZ25lZCBpbnQgKnB1aUhhbmRsZV9wLAorCQkJCXRFcGxGcmFtZSAqKiBwcEZyYW1lX3AsCisJCQkJdW5zaWduZWQgaW50ICpwdWlGcmFtZVNpemVfcCwKKwkJCQl0RXBsTXNnVHlwZSBNc2dUeXBlX3AsCisJCQkJdEVwbERsbEFzbmRTZXJ2aWNlSWQgU2VydmljZUlkX3ApOworCit0RXBsS2VybmVsIEVwbERsbGtEZWxldGVUeEZyYW1lKHVuc2lnbmVkIGludCB1aUhhbmRsZV9wKTsKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCit0RXBsS2VybmVsIEVwbERsbGtBZGROb2RlKHRFcGxEbGxOb2RlSW5mbyAqIHBOb2RlSW5mb19wKTsKKwordEVwbEtlcm5lbCBFcGxEbGxrRGVsZXRlTm9kZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCk7CisKK3RFcGxLZXJuZWwgRXBsRGxsa1NvZnREZWxldGVOb2RlKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wKTsKKwordEVwbEtlcm5lbCBFcGxEbGxrU2V0RmxhZzFPZk5vZGUodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsIEJZVEUgYlNvYUZsYWcxX3ApOworCit0RXBsS2VybmVsIEVwbERsbGtHZXRGaXJzdE5vZGVJbmZvKHRFcGxEbGxrTm9kZUluZm8gKiogcHBOb2RlSW5mb19wKTsKKworI2VuZGlmIC8vKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCisjZW5kaWYgLy8gI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTF9ETExLX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxEbGxrQ2FsLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxEbGxrQ2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM0ZGM3ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbERsbGtDYWwuaApAQCAtMCwwICsxLDE0MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3Iga2VybmVsc3BhY2UgRExMIENvbW11bmljYXRpb24gQWJzdHJhY3Rpb24gTGF5ZXIgbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsRGxsa0NhbC5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA4LzExLzEzIDE3OjEzOjA5ICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMTMgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExfRExMS0NBTF9IXworI2RlZmluZSBfRVBMX0RMTEtDQUxfSF8KKworI2luY2x1ZGUgIi4uL0VwbERsbC5oIgorI2luY2x1ZGUgIi4uL0VwbEV2ZW50LmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgbV91bEN1clR4RnJhbWVDb3VudEdlbjsKKwl1bnNpZ25lZCBsb25nIG1fdWxDdXJUeEZyYW1lQ291bnRObXQ7CisJdW5zaWduZWQgbG9uZyBtX3VsQ3VyUnhGcmFtZUNvdW50OworCXVuc2lnbmVkIGxvbmcgbV91bE1heFR4RnJhbWVDb3VudEdlbjsKKwl1bnNpZ25lZCBsb25nIG1fdWxNYXhUeEZyYW1lQ291bnRObXQ7CisJdW5zaWduZWQgbG9uZyBtX3VsTWF4UnhGcmFtZUNvdW50OworCit9IHRFcGxEbGxrQ2FsU3RhdGlzdGljczsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMSykpICE9IDApCisKK3RFcGxLZXJuZWwgRXBsRGxsa0NhbEFkZEluc3RhbmNlKHZvaWQpOworCit0RXBsS2VybmVsIEVwbERsbGtDYWxEZWxJbnN0YW5jZSh2b2lkKTsKKwordEVwbEtlcm5lbCBFcGxEbGxrQ2FsQXN5bmNHZXRUeENvdW50KHRFcGxEbGxBc3luY1JlcVByaW9yaXR5ICogcFByaW9yaXR5X3AsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgKnB1aUNvdW50X3ApOwordEVwbEtlcm5lbCBFcGxEbGxrQ2FsQXN5bmNHZXRUeEZyYW1lKHZvaWQgKnBGcmFtZV9wLAorCQkJCSAgICAgdW5zaWduZWQgaW50ICpwdWlGcmFtZVNpemVfcCwKKwkJCQkgICAgIHRFcGxEbGxBc3luY1JlcVByaW9yaXR5IFByaW9yaXR5X3ApOworLy8gb25seSBmcmFtZXMgd2l0aCByZWdpc3RlcmVkIEFzbmRTZXJ2aWNlSWRzIGFyZSBwYXNzZWQgdG8gQ0FMCit0RXBsS2VybmVsIEVwbERsbGtDYWxBc3luY0ZyYW1lUmVjZWl2ZWQodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCk7CisKK3RFcGxLZXJuZWwgRXBsRGxsa0NhbEFzeW5jU2VuZCh0RXBsRnJhbWVJbmZvICogcEZyYW1lSW5mb19wLAorCQkJICAgICAgIHRFcGxEbGxBc3luY1JlcVByaW9yaXR5IFByaW9yaXR5X3ApOworCit0RXBsS2VybmVsIEVwbERsbGtDYWxBc3luY0NsZWFyQnVmZmVyKHZvaWQpOworCit0RXBsS2VybmVsIEVwbERsbGtDYWxHZXRTdGF0aXN0aWNzKHRFcGxEbGxrQ2FsU3RhdGlzdGljcyAqKiBwcFN0YXRpc3RpY3MpOworCit0RXBsS2VybmVsIEVwbERsbGtDYWxQcm9jZXNzKHRFcGxFdmVudCAqIHBFdmVudF9wKTsKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKwordEVwbEtlcm5lbCBFcGxEbGxrQ2FsQXN5bmNDbGVhclF1ZXVlcyh2b2lkKTsKKwordEVwbEtlcm5lbCBFcGxEbGxrQ2FsSXNzdWVSZXF1ZXN0KHRFcGxEbGxSZXFTZXJ2aWNlSWQgU2VydmljZV9wLAorCQkJCSAgdW5zaWduZWQgaW50IHVpTm9kZUlkX3AsIEJZVEUgYlNvYUZsYWcxX3ApOworCit0RXBsS2VybmVsIEVwbERsbGtDYWxBc3luY0dldFNvYVJlcXVlc3QodEVwbERsbFJlcVNlcnZpY2VJZCAqIHBSZXFTZXJ2aWNlSWRfcCwKKwkJCQkJdW5zaWduZWQgaW50ICpwdWlOb2RlSWRfcCk7CisKK3RFcGxLZXJuZWwgRXBsRGxsa0NhbEFzeW5jU2V0UGVuZGluZ1JlcXVlc3RzKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkgICAgIHRFcGxEbGxBc3luY1JlcVByaW9yaXR5CisJCQkJCSAgICAgQXN5bmNSZXFQcmlvX3AsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IHVpQ291bnRfcCk7CisKKyNlbmRpZiAvLygoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKworI2VuZGlmIC8vICNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMSykpICE9IDApCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExfRExMS0NBTF9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsRXJyb3JIYW5kbGVyay5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsRXJyb3JIYW5kbGVyay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNjdlZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxFcnJvckhhbmRsZXJrLmgKQEAgLTAsMCArMSwxMDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIGtlcm5lbCBlcnJvciBoYW5kbGVyIG1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbEVycm9ySGFuZGxlcmsuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzEwLzAyIGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDEuMDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRVBMX0VSUk9SSEFORExFUktfSF8KKyNkZWZpbmUgX0VQTF9FUlJPUkhBTkRMRVJLX0hfCisKKyNpbmNsdWRlICIuLi9FcGxFdmVudC5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBpbml0IGZ1bmN0aW9uCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFcnJvckhhbmRsZXJrSW5pdCh2b2lkKTsKKworLy8gYWRkIGluc3RhbmNlCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFcnJvckhhbmRsZXJrQWRkSW5zdGFuY2Uodm9pZCk7CisKKy8vIGRlbGV0ZSBpbnN0YW5jZQordEVwbEtlcm5lbCBQVUJMSUMgRXBsRXJyb3JIYW5kbGVya0RlbEluc3RhbmNlKHZvaWQpOworCisvLyBwcm9jZXNzZXMgZXJyb3IgZXZlbnRzCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFcnJvckhhbmRsZXJrUHJvY2Vzcyh0RXBsRXZlbnQgKiBwRXZlbnRfcCk7CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExfRVJST1JIQU5ETEVSS19IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsRXZlbnRrLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxFdmVudGsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDI1YWFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsRXZlbnRrLmgKQEAgLTAsMCArMSwxMDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIGtlcm5lbCBldmVudCBtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxFdmVudGsuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzEyIGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDEuMDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRVBMX0VWRU5US19IXworI2RlZmluZSBfRVBMX0VWRU5US19IXworCisjaW5jbHVkZSAiLi4vRXBsRXZlbnQuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gaW5pdCBmdW5jdGlvbgordEVwbEtlcm5lbCBQVUJMSUMgRXBsRXZlbnRrSW5pdCh0RXBsU3luY0NiIGZwU3luY0NiKTsKKworLy8gYWRkIGluc3RhbmNlCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudGtBZGRJbnN0YW5jZSh0RXBsU3luY0NiIGZwU3luY0NiKTsKKworLy8gZGVsZXRlIGluc3RhbmNlCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudGtEZWxJbnN0YW5jZSh2b2lkKTsKKworLy8gS2VybmVsdGhyZWFkIHRoYXQgZGlzcGF0Y2hlcyBldmVudHMgaW4ga2VybmVsc3BhY2UKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEV2ZW50a1Byb2Nlc3ModEVwbEV2ZW50ICogcEV2ZW50X3ApOworCisvLyBwb3N0IGV2ZW50cyBmcm9tIGtlcm5lbHNwYWNlCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudGtQb3N0KHRFcGxFdmVudCAqIHBFdmVudF9wKTsKKworLy8gcG9zdCBlcnJvcmV2ZW50cyBmcm9tIGtlcm5lbHNwYWNlCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudGtQb3N0RXJyb3IodEVwbEV2ZW50U291cmNlIEV2ZW50U291cmNlX3AsCisJCQkJICAgICB0RXBsS2VybmVsIEVwbEVycm9yX3AsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlBcmdTaXplX3AsIHZvaWQgKnBBcmdfcCk7CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExfRVZFTlRLX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxObXRrLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxObXRrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM0MDljYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbE5tdGsuaApAQCAtMCwwICsxLDEwNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgTk1ULUtlcm5lbHNwYWNlLU1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE5tdGsuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzA5IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0VQTE5NVEtfSF8KKyNkZWZpbmUgX0VQTE5NVEtfSF8KKworI2luY2x1ZGUgIi4uL0VwbE5tdC5oIgorI2luY2x1ZGUgIkVwbEV2ZW50ay5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRLKSkgIT0gMCkKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRrSW5pdChFUExfTUNPX0RFQ0xfUFRSX0lOU1RBTkNFX1BUUik7CisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQworRXBsTm10a0FkZEluc3RhbmNlKEVQTF9NQ09fREVDTF9QVFJfSU5TVEFOQ0VfUFRSKTsKKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDCitFcGxObXRrRGVsSW5zdGFuY2UoRVBMX01DT19ERUNMX1BUUl9JTlNUQU5DRV9QVFIpOworCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10a1Byb2Nlc3MoRVBMX01DT19ERUNMX1BUUl9JTlNUQU5DRV9QVFJfCisJCQkJCSAgICAgIHRFcGxFdmVudCAqIHBFdmVudF9wKTsKKworRVBMRExMRVhQT1JUIHRFcGxObXRTdGF0ZSBQVUJMSUMKK0VwbE5tdGtHZXRObXRTdGF0ZShFUExfTUNPX0RFQ0xfUFRSX0lOU1RBTkNFX1BUUik7CisKKyNlbmRpZiAvLyAjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVEspKSAhPSAwKQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMTk1US19IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsTm10a0NhbC5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsTm10a0NhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZGVhZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxObXRrQ2FsLmgKQEAgLTAsMCArMSw4OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgY29tbXVuaWNhdGlvbiBhYnN0cmFjdGlvbiBsYXllciBvZiB0aGUKKyAgICAgICAgICAgICAgICBOTVQtS2VybmVsLU1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE5tdGtDYWwuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICBLRUlMIHVWaXNpb24gMgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMTYgLWsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJFcGxObXRrLmgiCisKKyNpZm5kZWYgX0VQTE5NVEtDQUxfSF8KKyNkZWZpbmUgX0VQTE5NVEtDQUxfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTE5NVEtDQUxfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbE9iZGsuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbE9iZGsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjlmNTgzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsT2Jkay5oCkBAIC0wLDAgKzEsMTk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBFcGwtT2JkLUtlcm5lbC1Nb2R1bAorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE9iZGsuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzE5IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIuLi9FcGxPYmQuaCIKKworI2lmbmRlZiBfRVBMT0JES19IXworI2RlZmluZSBfRVBMT0JES19IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBnbG9iYWwgdmFyaWFibGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitleHRlcm4gQllURSBNRU0gYWJFcGxPYmRUcmFzaE9iamVjdF9nWzhdOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JESykpICE9IDApCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmRJbml0KEVQTF9NQ09fREVDTF9QVFJfSU5TVEFOQ0VfUFRSXworCQkJCQkgIHRFcGxPYmRJbml0UGFyYW0gTUVNICogcEluaXRQYXJhbV9wKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkQWRkSW5zdGFuY2UoRVBMX01DT19ERUNMX1BUUl9JTlNUQU5DRV9QVFJfCisJCQkJCQkgdEVwbE9iZEluaXRQYXJhbSBNRU0gKgorCQkJCQkJIHBJbml0UGFyYW1fcCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZERlbGV0ZUluc3RhbmNlKEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFIpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmRXcml0ZUVudHJ5KEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCQl1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCwKKwkJCQkJCXZvaWQgKnBTcmNEYXRhX3AsCisJCQkJCQl0RXBsT2JkU2l6ZSBTaXplX3ApOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmRSZWFkRW50cnkoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkgICAgICAgdm9pZCAqcERzdERhdGFfcCwKKwkJCQkJICAgICAgIHRFcGxPYmRTaXplICogcFNpemVfcCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDCitFcGxPYmRTZXRTdG9yZUxvYWRPYmpDYWxsYmFjayhFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJICAgICAgdEVwbE9iZFN0b3JlTG9hZE9iakNhbGxiYWNrIGZwQ2FsbGJhY2tfcCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZEFjY2Vzc09kUGFydChFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkJICB0RXBsT2JkUGFydCBPYmRQYXJ0X3AsCisJCQkJCQkgIHRFcGxPYmREaXIgRGlyZWN0aW9uX3ApOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmREZWZpbmVWYXIoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJICAgICAgIHRFcGxWYXJQYXJhbSBNRU0gKiBwVmFyUGFyYW1fcCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHZvaWQgKlBVQkxJQyBFcGxPYmRHZXRPYmplY3REYXRhUHRyKEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCQkgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wKTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZFJlZ2lzdGVyVXNlck9kKEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCQkgICAgdEVwbE9iZEVudHJ5UHRyIHBVc2VyT2RfcCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHZvaWQgUFVCTElDIEVwbE9iZEluaXRWYXJFbnRyeShFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkgICAgdEVwbE9iZFZhckVudHJ5IE1FTSAqIHBWYXJFbnRyeV9wLAorCQkJCQkgICAgdEVwbE9iZFR5cGUgVHlwZV9wLAorCQkJCQkgICAgdEVwbE9iZFNpemUgT2JkU2l6ZV9wKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbE9iZFNpemUgUFVCTElDIEVwbE9iZEdldERhdGFTaXplKEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCQkgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3ApOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB1bnNpZ25lZCBpbnQgUFVCTElDIEVwbE9iZEdldE5vZGVJZChFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkU2V0Tm9kZUlkKEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJICAgICAgIHRFcGxPYmROb2RlSWRUeXBlIE5vZGVJZFR5cGVfcCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZElzTnVtZXJpY2FsKEVQTF9NQ09fREVDTF9JTlNUQU5DRV9QVFJfCisJCQkJCQkgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkJIEJPT0wgKiBwZkVudHJ5TnVtZXJpY2FsKTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZFdyaXRlRW50cnlGcm9tTGUoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSAgICAgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkJICAgICAgdm9pZCAqcFNyY0RhdGFfcCwKKwkJCQkJCSAgICAgIHRFcGxPYmRTaXplIFNpemVfcCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZFJlYWRFbnRyeVRvTGUoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSAgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkJICAgdm9pZCAqcERzdERhdGFfcCwKKwkJCQkJCSAgIHRFcGxPYmRTaXplICogcFNpemVfcCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZEdldEFjY2Vzc1R5cGUoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSAgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkJICAgdEVwbE9iZEFjY2VzcyAqCisJCQkJCQkgICBwQWNjZXNzVHlwX3ApOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmRTZWFyY2hWYXJFbnRyeShFUExfTUNPX0RFQ0xfSU5TVEFOQ0VfUFRSXworCQkJCQkJICAgIHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICAgdW5zaWduZWQgaW50IHVpU3ViaW5kZXhfcCwKKwkJCQkJCSAgICB0RXBsT2JkVmFyRW50cnkgTUVNICoqCisJCQkJCQkgICAgcHBWYXJFbnRyeV9wKTsKKworI2VuZGlmIC8vIGVuZCBvZiAjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CREspKSAhPSAwKQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMT0JES19IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsT2Jka0NhbC5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsT2Jka0NhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNzNhOTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxPYmRrQ2FsLmgKQEAgLTAsMCArMSw4OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgY29tbXVuaWNhdGlvbiBhYnN0cmFjdGlvbiBsYXllcgorICAgICAgICAgICAgICAgIGZvciB0aGUgRXBsLU9iZC1LZXJuZWxzcGFjZS1Nb2R1bAorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE9iZGtDYWwuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzE5IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIuLi9FcGxPYmQuaCIKKworI2lmbmRlZiBfRVBMT0JES0NBTF9IXworI2RlZmluZSBfRVBMT0JES0NBTF9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYgLy8gI2lmbmRlZiBfRVBMT0JES0NBTF9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsUGRvay5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsUGRvay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YjE4ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxQZG9rLmgKQEAgLTAsMCArMSwxMTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIGtlcm5lbCBQRE8gbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsUGRvay5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA4LzA2LzIzIDE0OjU2OjMzICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDUvMjIgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExfUERPS19IXworI2RlZmluZSBfRVBMX1BET0tfSF8KKworI2luY2x1ZGUgIi4uL0VwbFBkby5oIgorI2luY2x1ZGUgIi4uL0VwbEV2ZW50LmgiCisjaW5jbHVkZSAiLi4vRXBsRGxsLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIHByb2Nlc3MgZXZlbnRzIGZyb20gcXVldWUgKFBET3MvZnJhbWVzIGFuZCBTb0EgZm9yIHN5bmNocm9uaXphdGlvbikKK3RFcGxLZXJuZWwgRXBsUGRva1Byb2Nlc3ModEVwbEV2ZW50ICogcEV2ZW50X3ApOworCisvLyBjb3BpZXMgUlBETyB0byBldmVudCBxdWV1ZSBmb3IgcHJvY2Vzc2luZworLy8gaXMgY2FsbGVkIGJ5IERMTCBpbiBOTVRfQ1NfUkVBRFlfVE9fT1BFUkFURSBhbmQgTk1UX0NTX09QRVJBVElPTkFMCisvLyBQRE8gbmVlZHMgbm90IHRvIGJlIHZhbGlkCit0RXBsS2VybmVsIEVwbFBkb2tDYlBkb1JlY2VpdmVkKHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3ApOworCisvLyBwb3N0cyBwb2ludGVyIGFuZCBzaXplIG9mIFRQRE8gdG8gZXZlbnQgcXVldWUKKy8vIGlzIGNhbGxlZCBieSBETEwgaW4gTk1UX0NTX1BSRV9PUEVSQVRJT05BTF8yLAorLy8gICAgIE5NVF9DU19SRUFEWV9UT19PUEVSQVRFIGFuZCBOTVRfQ1NfT1BFUkFUSU9OQUwKK3RFcGxLZXJuZWwgRXBsUGRva0NiUGRvVHJhbnNtaXR0ZWQodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCk7CisKKy8vIHBvc3RzIFNvQSBldmVudCB0byBxdWV1ZQordEVwbEtlcm5lbCBFcGxQZG9rQ2JTb2EodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCk7CisKK3RFcGxLZXJuZWwgRXBsUGRva0FkZEluc3RhbmNlKHZvaWQpOworCit0RXBsS2VybmVsIEVwbFBkb2tEZWxJbnN0YW5jZSh2b2lkKTsKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTF9QRE9LX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxQZG9rQ2FsLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxQZG9rQ2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmExODNlYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbFBkb2tDYWwuaApAQCAtMCwwICsxLDk5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBrZXJuZWwgUERPIENvbW11bmljYXRpb24gQWJzdHJhY3Rpb24gTGF5ZXIgbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsUGRva0NhbC5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMjYgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExfUERPS0NBTF9IXworI2RlZmluZSBfRVBMX1BET0tDQUxfSF8KKworI2luY2x1ZGUgIi4uL0VwbEluYy5oIgorLy8jaW5jbHVkZSAiRXBsUGRvLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgRXBsUGRva0NhbEFkZEluc3RhbmNlKHZvaWQpOworCit0RXBsS2VybmVsIEVwbFBkb2tDYWxEZWxJbnN0YW5jZSh2b2lkKTsKKworLy8gc2V0cyBmbGFnIGZvciB2YWxpZGl0eSBvZiBUUERPcyBpbiBzaGFyZWQgbWVtb3J5Cit0RXBsS2VybmVsIEVwbFBkb2tDYWxTZXRUcGRvc1ZhbGlkKEJPT0wgZlZhbGlkX3ApOworCisvLyBnZXRzIGZsYWcgZm9yIHZhbGlkaXR5IG9mIFRQRE9zIGZyb20gc2hhcmVkIG1lbW9yeQordEVwbEtlcm5lbCBFcGxQZG9rQ2FsQXJlVHBkb3NWYWxpZChCT09MICogcGZWYWxpZF9wKTsKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTF9QRE9LQ0FMX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxUaW1lckhpZ2hSZXNrLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9FcGxUaW1lckhpZ2hSZXNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVkMDQ2ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbFRpbWVySGlnaFJlc2suaApAQCAtMCwwICsxLDEwOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgRVBMIGhpZ2ggcmVzb2x1dGlvbiBUaW1lcm1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbFRpbWVySGlnaFJlc2suaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwOC8wNC8xNyAyMTozNjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA5LzI5IGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIuLi9FcGxUaW1lci5oIgorCisjaWZuZGVmIF9FUExUSU1FUkhJR0hSRVNLX0hfCisjZGVmaW5lIF9FUExUSU1FUkhJR0hSRVNLX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVySGlnaFJlc2tJbml0KHZvaWQpOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lckhpZ2hSZXNrQWRkSW5zdGFuY2Uodm9pZCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVySGlnaFJlc2tEZWxJbnN0YW5jZSh2b2lkKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJIaWdoUmVza1NldFRpbWVyTnModEVwbFRpbWVySGRsICogcFRpbWVySGRsX3AsCisJCQkJCSAgICAgdW5zaWduZWQgbG9uZyBsb25nIHVsbFRpbWVOc19wLAorCQkJCQkgICAgIHRFcGxUaW1lcmtDYWxsYmFjayBwZm5DYWxsYmFja19wLAorCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgdWxBcmd1bWVudF9wLAorCQkJCQkgICAgIEJPT0wgZkNvbnRpbnVvdXNseV9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJIaWdoUmVza01vZGlmeVRpbWVyTnModEVwbFRpbWVySGRsICogcFRpbWVySGRsX3AsCisJCQkJCQl1bnNpZ25lZCBsb25nIGxvbmcgdWxsVGltZU5zX3AsCisJCQkJCQl0RXBsVGltZXJrQ2FsbGJhY2sKKwkJCQkJCXBmbkNhbGxiYWNrX3AsCisJCQkJCQl1bnNpZ25lZCBsb25nIHVsQXJndW1lbnRfcCwKKwkJCQkJCUJPT0wgZkNvbnRpbnVvdXNseV9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJIaWdoUmVza0RlbGV0ZVRpbWVyKHRFcGxUaW1lckhkbCAqIHBUaW1lckhkbF9wKTsKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTFRJTUVSSElHSFJFU0tfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbFRpbWVyay5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvRXBsVGltZXJrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE2MGU3MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwva2VybmVsL0VwbFRpbWVyay5oCkBAIC0wLDAgKzEsMTE4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBFUEwgS2VybmVsLVRpbWVybW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsVGltZXJrLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNy8wNiBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiLi4vRXBsVGltZXIuaCIKKyNpbmNsdWRlICIuLi91c2VyL0VwbEV2ZW50dS5oIgorCisjaWZuZGVmIF9FUExUSU1FUktfSF8KKyNkZWZpbmUgX0VQTFRJTUVSS19IXworCisjaWYgRVBMX1RJTUVSX1VTRV9VU0VSICE9IEZBTFNFCisjaW5jbHVkZSAiLi4vdXNlci9FcGxUaW1lcnUuaCIKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIEVQTF9USU1FUl9VU0VfVVNFUiAhPSBGQUxTRQorI2RlZmluZSBFcGxUaW1lcmtJbml0ICAgICAgICAgICBFcGxUaW1lcnVJbml0CisjZGVmaW5lIEVwbFRpbWVya0FkZEluc3RhbmNlICAgIEVwbFRpbWVydUFkZEluc3RhbmNlCisjZGVmaW5lIEVwbFRpbWVya0RlbEluc3RhbmNlICAgIEVwbFRpbWVydURlbEluc3RhbmNlCisjZGVmaW5lIEVwbFRpbWVya1NldFRpbWVyTXMgICAgIEVwbFRpbWVydVNldFRpbWVyTXMKKyNkZWZpbmUgRXBsVGltZXJrTW9kaWZ5VGltZXJNcyAgRXBsVGltZXJ1TW9kaWZ5VGltZXJNcworI2RlZmluZSBFcGxUaW1lcmtEZWxldGVUaW1lciAgICBFcGxUaW1lcnVEZWxldGVUaW1lcgorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiBFUExfVElNRVJfVVNFX1VTRVIgPT0gRkFMU0UKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVya0luaXQodm9pZCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVya0FkZEluc3RhbmNlKHZvaWQpOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcmtEZWxJbnN0YW5jZSh2b2lkKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJrU2V0VGltZXJNcyh0RXBsVGltZXJIZGwgKiBwVGltZXJIZGxfcCwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIHVsVGltZV9wLAorCQkJCSAgICAgIHRFcGxUaW1lckFyZyBBcmd1bWVudF9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJrTW9kaWZ5VGltZXJNcyh0RXBsVGltZXJIZGwgKiBwVGltZXJIZGxfcCwKKwkJCQkJIHVuc2lnbmVkIGxvbmcgdWxUaW1lX3AsCisJCQkJCSB0RXBsVGltZXJBcmcgQXJndW1lbnRfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVya0RlbGV0ZVRpbWVyKHRFcGxUaW1lckhkbCAqIHBUaW1lckhkbF9wKTsKKyNlbmRpZgorI2VuZGlmIC8vICNpZm5kZWYgX0VQTFRJTUVSS19IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvVmlydHVhbEV0aGVybmV0LmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL2tlcm5lbC9WaXJ0dWFsRXRoZXJuZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWZmODcyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9rZXJuZWwvVmlydHVhbEV0aGVybmV0LmgKQEAgLTAsMCArMSw5NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgdmlydHVhbCBldGhlcm5ldCBkcml2ZXIgbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogVmlydHVhbEV0aGVybmV0LmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDgvMTAvMTcgMTU6MzI6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgS0VJTCB1VmlzaW9uIDIKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA5LzE5IGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDEuMDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRVBMX1ZFVEhfSF8KKyNkZWZpbmUgX0VQTF9WRVRIX0hfCisKKyNpbmNsdWRlICJFcGxEbGxrLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfVkVUSCkpICE9IDApCisKK3RFcGxLZXJuZWwgUFVCTElDIFZFdGhBZGRJbnN0YW5jZSh0RXBsRGxsa0luaXRQYXJhbSAqIHBJbml0UGFyYW1fcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIFZFdGhEZWxJbnN0YW5jZSh2b2lkKTsKKworI2VuZGlmIC8vICNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfVkVUSCkpICE9IDApCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExfVkVUSF9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9wcm9jX2ZzLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3Byb2NfZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDkxMDMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9wcm9jX2ZzLmMKQEAgLTAsMCArMSw0MDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBwcm9jIGZzIGVudHJ5IHdpdGggZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiB1bmRlciBMaW51eAorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IHByb2NfZnMuYyx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuMTMgJCAgJERhdGU6IDIwMDgvMTEvMDcgMTM6NTU6NTYgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdOVQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDcvMzEgZC5rLjogICBzdGFydCBvZiBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAia2VybmVsL0VwbE5tdGsuaCIKKyNpbmNsdWRlICJ1c2VyL0VwbE5tdHUuaCIKKworI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKKyNpbmNsdWRlICJ1c2VyL0VwbE5tdE1udS5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJrZXJuZWwvRXBsRGxsa0NhbC5oIgorCisvLyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2lmZGVmIENPTkZJR19DT0xERklSRQorI2luY2x1ZGUgPGFzbS9jb2xkZmlyZS5oPgorI2luY2x1ZGUgImZlYy5oIgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZuZGVmIEVQTF9QUk9DX0RFVl9OQU1FCisjZGVmaW5lIEVQTF9QUk9DX0RFVl9OQU1FICAgICJlcGwiCisjZW5kaWYKKworI2lmbmRlZiBEQkdfVFJBQ0VfUE9JTlRTCisjZGVmaW5lIERCR19UUkFDRV9QT0lOVFMgICAgMjMJLy8gIyBvZiBzdXBwb3J0ZWQgZGVidWcgdHJhY2UgcG9pbnRzCisjZW5kaWYKKworI2lmbmRlZiBEQkdfVFJBQ0VfVkFMVUVTCisjZGVmaW5lIERCR19UUkFDRV9WQUxVRVMgICAgMjQJLy8gIyBvZiBzdXBwb3J0ZWQgZGVidWcgdHJhY2UgdmFsdWVzIChzaXplIG9mIGNpcmN1bGFyIGJ1ZmZlcikKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbW9kdWwgZ2xvYmFsIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgdmFycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIF9EQkdfVFJBQ0VfUE9JTlRTXworYXRvbWljX3QgYWF0bURiZ1RyYWNlUG9pbnRfbFtEQkdfVFJBQ0VfUE9JTlRTXTsKK0RXT1JEIGFkd0RiZ1RyYWNlVmFsdWVfbFtEQkdfVFJBQ0VfVkFMVUVTXTsKK0RXT1JEIGR3RGJnVHJhY2VWYWx1ZU9sZF9sOwordW5zaWduZWQgaW50IHVpRGJnVHJhY2VWYWx1ZVBvc19sOworc3BpbmxvY2tfdCBzcGlubG9ja0RiZ1RyYWNlVmFsdWVfbDsKK3Vuc2lnbmVkIGxvbmcgdWxEYlRyYWNlVmFsdWVGbGFnc19sOworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IEVwbExpblByb2NSZWFkKGNoYXIgKnBjQnVmZmVyX3AsIGNoYXIgKipwcGNTdGFydF9wLCBvZmZfdCBPZmZzZXRfcCwKKwkJCSAgaW50IG5CdWZmZXJTaXplX3AsIGludCAqcEVvZl9wLCB2b2lkICpwRGF0YV9wKTsKK3N0YXRpYyBpbnQgRXBsTGluUHJvY1dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpOworCit2b2lkIFBVQkxJQyBUZ3REYmdTaWduYWxUcmFjZVBvaW50KEJZVEUgYlRyYWNlUG9pbnROdW1iZXJfcCk7Cit2b2lkIFBVQkxJQyBUZ3REYmdQb3N0VHJhY2VWYWx1ZShEV09SRCBkd1RyYWNlVmFsdWVfcCk7CisKK0VQTERMTEVYUE9SVCBEV09SRCBQVUJMSUMgRXBsSWRlbnR1R2V0UnVubmluZ1JlcXVlc3RzKHZvaWQpOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgIFAgVSBCIEwgSSBDICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKwordEVwbEtlcm5lbCBFcGxMaW5Qcm9jSW5pdCh2b2lkKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcFByb2NEaXJFbnRyeTsKKwlwUHJvY0RpckVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoRVBMX1BST0NfREVWX05BTUUsIFNfSVJVR08sIE5VTEwpOworCWlmIChwUHJvY0RpckVudHJ5ICE9IE5VTEwpIHsKKwkJcFByb2NEaXJFbnRyeS0+cmVhZF9wcm9jID0gRXBsTGluUHJvY1JlYWQ7CisJCXBQcm9jRGlyRW50cnktPndyaXRlX3Byb2MgPSBFcGxMaW5Qcm9jV3JpdGU7CisJCXBQcm9jRGlyRW50cnktPmRhdGEgPSBOVUxMOwkvLyBkZXZpY2UgbnVtYmVyIG9yIHNvbWV0aGluZyBlbHNlCisKKwl9IGVsc2UgeworCQlyZXR1cm4ga0VwbE5vUmVzb3VyY2U7CisJfQorCisjaWZkZWYgX0RCR19UUkFDRV9QT0lOVFNfCisJLy8gaW5pdGlhbGl6ZSBzcGlubG9jayBhbmQgY2lyY3VsYXIgYnVmZmVyIHBvc2l0aW9uCisJc3Bpbl9sb2NrX2luaXQoJnNwaW5sb2NrRGJnVHJhY2VWYWx1ZV9sKTsKKwl1aURiZ1RyYWNlVmFsdWVQb3NfbCA9IDA7CisJZHdEYmdUcmFjZVZhbHVlT2xkX2wgPSAwOworI2VuZGlmCisKKwlyZXR1cm4ga0VwbFN1Y2Nlc3NmdWw7Cit9CisKK3RFcGxLZXJuZWwgRXBsTGluUHJvY0ZyZWUodm9pZCkKK3sKKwlyZW1vdmVfcHJvY19lbnRyeShFUExfUFJPQ19ERVZfTkFNRSwgTlVMTCk7CisKKwlyZXR1cm4ga0VwbFN1Y2Nlc3NmdWw7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgVGFyZ2V0IHNwZWNpZmljIGV2ZW50IHNpZ25hbGluZyAoRkVDIFR4LS9SeC1JbnRlcnJ1cHQsIHVzZWQgYnkgRWRydikKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBfREJHX1RSQUNFX1BPSU5UU18KK3ZvaWQgUFVCTElDIFRndERiZ1NpZ25hbFRyYWNlUG9pbnQoQllURSBiVHJhY2VQb2ludE51bWJlcl9wKQoreworCisJaWYgKGJUcmFjZVBvaW50TnVtYmVyX3AgPj0KKwkgICAgKHNpemVvZihhYXRtRGJnVHJhY2VQb2ludF9sKSAvIHNpemVvZihhYXRtRGJnVHJhY2VQb2ludF9sWzBdKSkpIHsKKwkJZ290byBFeGl0OworCX0KKworCWF0b21pY19pbmMoJmFhdG1EYmdUcmFjZVBvaW50X2xbYlRyYWNlUG9pbnROdW1iZXJfcF0pOworCisgICAgICBFeGl0OgorCisJcmV0dXJuOworCit9CisKK3ZvaWQgUFVCTElDIFRndERiZ1Bvc3RUcmFjZVZhbHVlKERXT1JEIGR3VHJhY2VWYWx1ZV9wKQoreworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNwaW5sb2NrRGJnVHJhY2VWYWx1ZV9sLCB1bERiVHJhY2VWYWx1ZUZsYWdzX2wpOworCWlmIChkd0RiZ1RyYWNlVmFsdWVPbGRfbCAhPSBkd1RyYWNlVmFsdWVfcCkgeworCQlhZHdEYmdUcmFjZVZhbHVlX2xbdWlEYmdUcmFjZVZhbHVlUG9zX2xdID0gZHdUcmFjZVZhbHVlX3A7CisJCXVpRGJnVHJhY2VWYWx1ZVBvc19sID0KKwkJICAgICh1aURiZ1RyYWNlVmFsdWVQb3NfbCArIDEpICUgREJHX1RSQUNFX1ZBTFVFUzsKKwkJZHdEYmdUcmFjZVZhbHVlT2xkX2wgPSBkd1RyYWNlVmFsdWVfcDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BpbmxvY2tEYmdUcmFjZVZhbHVlX2wsIHVsRGJUcmFjZVZhbHVlRmxhZ3NfbCk7CisKKwlyZXR1cm47CisKK30KKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFJlYWQgZnVuY3Rpb24gZm9yIFBST0MtRlMgcmVhZCBhY2Nlc3MKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQgRXBsTGluUHJvY1JlYWQoY2hhciAqcGNCdWZmZXJfcCwKKwkJCSAgY2hhciAqKnBwY1N0YXJ0X3AsCisJCQkgIG9mZl90IE9mZnNldF9wLAorCQkJICBpbnQgbkJ1ZmZlclNpemVfcCwgaW50ICpwRW9mX3AsIHZvaWQgKnBEYXRhX3ApCit7CisKKwlpbnQgblNpemU7CisJaW50IEVvZjsKKwl0RXBsRGxsa0NhbFN0YXRpc3RpY3MgKnBEbGxrQ2FsU3RhdHM7CisKKwluU2l6ZSA9IDA7CisJRW9mID0gMDsKKworCS8vIGNvdW50IGNhbGxzIG9mIHRoaXMgZnVuY3Rpb24KKyNpZmRlZiBfREJHX1RSQUNFX1BPSU5UU18KKwlUZ3REYmdTaWduYWxUcmFjZVBvaW50KDApOworI2VuZGlmCisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIGdlbmVyYXRlIHN0YXRpYyBpbmZvcm1hdGlvbgorCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkvLyAtLS0tIERyaXZlciBpbmZvcm1hdGlvbiAtLS0tCisJblNpemUgKz0gc25wcmludGYocGNCdWZmZXJfcCArIG5TaXplLCBuQnVmZmVyU2l6ZV9wIC0gblNpemUsCisJCQkgICIlcyAgICAlcyAgICAoYykgMjAwNiAlc1xuIiwKKwkJCSAgRVBMX1BST0RVQ1RfTkFNRSwgRVBMX1BST0RVQ1RfVkVSU0lPTiwKKwkJCSAgRVBMX1BST0RVQ1RfTUFOVUZBQ1RVUkVSKTsKKworCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gZ2VuZXJhdGUgcHJvY2VzcyBpbmZvcm1hdGlvbgorCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkvLyAtLS0tIEVQTCBzdGF0ZSAtLS0tCisJblNpemUgKz0gc25wcmludGYocGNCdWZmZXJfcCArIG5TaXplLCBuQnVmZmVyU2l6ZV9wIC0gblNpemUsCisJCQkgICJOTVQgc3RhdGU6ICAgICAgICAgICAgICAgICAgMHglMDRYXG4iLAorCQkJICAoV09SRCkgRXBsTm10a0dldE5tdFN0YXRlKCkpOworCisJRXBsRGxsa0NhbEdldFN0YXRpc3RpY3MoJnBEbGxrQ2FsU3RhdHMpOworCisJblNpemUgKz0gc25wcmludGYocGNCdWZmZXJfcCArIG5TaXplLCBuQnVmZmVyU2l6ZV9wIC0gblNpemUsCisJCQkgICJDdXJBc3luY1R4R2VuPSVsdSBDdXJBc3luY1R4Tm10PSVsdSBDdXJBc3luY1J4PSVsdVxuTWF4QXN5bmNUeEdlbj0lbHUgTWF4QXN5bmNUeE5tdD0lbHUgTWF4QXN5bmNSeD0lbHVcbiIsCisJCQkgIHBEbGxrQ2FsU3RhdHMtPm1fdWxDdXJUeEZyYW1lQ291bnRHZW4sCisJCQkgIHBEbGxrQ2FsU3RhdHMtPm1fdWxDdXJUeEZyYW1lQ291bnRObXQsCisJCQkgIHBEbGxrQ2FsU3RhdHMtPm1fdWxDdXJSeEZyYW1lQ291bnQsCisJCQkgIHBEbGxrQ2FsU3RhdHMtPm1fdWxNYXhUeEZyYW1lQ291bnRHZW4sCisJCQkgIHBEbGxrQ2FsU3RhdHMtPm1fdWxNYXhUeEZyYW1lQ291bnRObXQsCisJCQkgIHBEbGxrQ2FsU3RhdHMtPm1fdWxNYXhSeEZyYW1lQ291bnQpOworCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCS8vIGZldGNoIHJ1bm5pbmcgSWRlbnRSZXF1ZXN0cworCW5TaXplICs9IHNucHJpbnRmKHBjQnVmZmVyX3AgKyBuU2l6ZSwgbkJ1ZmZlclNpemVfcCAtIG5TaXplLAorCQkJICAicnVubmluZyBJZGVudFJlcXVlc3RzOiAgICAgIDB4JTA4bFhcbiIsCisJCQkgIEVwbElkZW50dUdldFJ1bm5pbmdSZXF1ZXN0cygpKTsKKworCS8vIGZldGNoIHN0YXRlIG9mIE5tdE1udSBtb2R1bGUKKwl7CisJCXVuc2lnbmVkIGludCB1aU1hbmRhdG9yeVNsYXZlQ291bnQ7CisJCXVuc2lnbmVkIGludCB1aVNpZ25hbFNsYXZlQ291bnQ7CisJCVdPUkQgd0ZsYWdzOworCisJCUVwbE5tdE1udUdldERpYWdub3N0aWNJbmZvKCZ1aU1hbmRhdG9yeVNsYXZlQ291bnQsCisJCQkJCSAgICZ1aVNpZ25hbFNsYXZlQ291bnQsICZ3RmxhZ3MpOworCisJCW5TaXplICs9IHNucHJpbnRmKHBjQnVmZmVyX3AgKyBuU2l6ZSwgbkJ1ZmZlclNpemVfcCAtIG5TaXplLAorCQkJCSAgIk1OICBNYW5kU2xhdmVDb3VudDogJXUgIFNpZ1NsYXZlQ291bnQ6ICV1ICBGbGFnczogMHglWFxuIiwKKwkJCQkgIHVpTWFuZGF0b3J5U2xhdmVDb3VudCwgdWlTaWduYWxTbGF2ZUNvdW50LAorCQkJCSAgd0ZsYWdzKTsKKworCX0KKyNlbmRpZgorCisJLy8gLS0tLSBGRUMgc3RhdGUgLS0tLQorI2lmZGVmIENPTkZJR19DT0xERklSRQorCXsKKwkJLy8gUmVjZWl2ZSB0aGUgYmFzZSBhZGRyZXNzCisJCXVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyOworI2lmIChFRFJWX1VTRURfRVRIX0NUUkwgPT0gMCkKKwkJLy8gU2V0IHRoZSBiYXNlIGFkZHJlc3Mgb2YgRkVDMAorCQliYXNlX2FkZHIgPSBGRUNfQkFTRV9BRERSX0ZFQzA7CisjZWxzZQorCQkvLyBTZXQgdGhlIGJhc2UgYWRkcmVzcyBvZiBGRUMxCisJCWJhc2VfYWRkciA9IEZFQ19CQVNFX0FERFJfRkVDMTsKKyNlbmRpZgorCisJCW5TaXplICs9IHNucHJpbnRmKHBjQnVmZmVyX3AgKyBuU2l6ZSwgbkJ1ZmZlclNpemVfcCAtIG5TaXplLAorCQkJCSAgIkZFQ19FQ1IgPSAweCUwOFggRkVDX0VJUiA9IDB4JTA4WCBGRUNfRUlNUiA9IDB4JTA4WFxuRkVDX1RDUiA9IDB4JTA4WCBGRUNURlNSID0gMHglMDhYIEZFQ1JGU1IgPSAweCUwOFhcbiIsCisJCQkJICBGRUNfRUNSKGJhc2VfYWRkciksIEZFQ19FSVIoYmFzZV9hZGRyKSwKKwkJCQkgIEZFQ19FSU1SKGJhc2VfYWRkciksIEZFQ19UQ1IoYmFzZV9hZGRyKSwKKwkJCQkgIEZFQ19GRUNURlNSKGJhc2VfYWRkciksCisJCQkJICBGRUNfRkVDUkZTUihiYXNlX2FkZHIpKTsKKwl9CisjZW5kaWYKKworCS8vIC0tLS0gREJHOiBUcmFjZVBvaW50cyAtLS0tCisjaWZkZWYgX0RCR19UUkFDRV9QT0lOVFNfCisJeworCQlpbnQgbk51bTsKKworCQluU2l6ZSArPSBzbnByaW50ZihwY0J1ZmZlcl9wICsgblNpemUsIG5CdWZmZXJTaXplX3AgLSBuU2l6ZSwKKwkJCQkgICJEYmdUcmFjZVBvaW50czpcbiIpOworCQlmb3IgKG5OdW0gPSAwOworCQkgICAgIG5OdW0gPCAoc2l6ZW9mKGFhdG1EYmdUcmFjZVBvaW50X2wpIC8gc2l6ZW9mKGF0b21pY190KSk7CisJCSAgICAgbk51bSsrKSB7CisJCQluU2l6ZSArPQorCQkJICAgIHNucHJpbnRmKHBjQnVmZmVyX3AgKyBuU2l6ZSwgbkJ1ZmZlclNpemVfcCAtIG5TaXplLAorCQkJCSAgICAgIiBUcmFjZVBvaW50WyUyZF06ICVkXG4iLCAoaW50KW5OdW0sCisJCQkJICAgICBhdG9taWNfcmVhZCgmYWF0bURiZ1RyYWNlUG9pbnRfbFtuTnVtXSkpOworCQl9CisKKwkJblNpemUgKz0gc25wcmludGYocGNCdWZmZXJfcCArIG5TaXplLCBuQnVmZmVyU2l6ZV9wIC0gblNpemUsCisJCQkJICAiRGJnVHJhY2VWYWx1ZXM6XG4iKTsKKwkJZm9yIChuTnVtID0gMDsgbk51bSA8IERCR19UUkFDRV9WQUxVRVM7IG5OdW0rKykgeworCQkJaWYgKG5OdW0gPT0gdWlEYmdUcmFjZVZhbHVlUG9zX2wpIHsJLy8gbmV4dCB2YWx1ZSB3aWxsIGJlIHN0b3JlZCBhdCB0aGF0IHBvc2l0aW9uCisJCQkJblNpemUgKz0KKwkJCQkgICAgc25wcmludGYocGNCdWZmZXJfcCArIG5TaXplLAorCQkJCQkgICAgIG5CdWZmZXJTaXplX3AgLSBuU2l6ZSwgIiolMDhsWCIsCisJCQkJCSAgICAgYWR3RGJnVHJhY2VWYWx1ZV9sW25OdW1dKTsKKwkJCX0gZWxzZSB7CisJCQkJblNpemUgKz0KKwkJCQkgICAgc25wcmludGYocGNCdWZmZXJfcCArIG5TaXplLAorCQkJCQkgICAgIG5CdWZmZXJTaXplX3AgLSBuU2l6ZSwgIiAlMDhsWCIsCisJCQkJCSAgICAgYWR3RGJnVHJhY2VWYWx1ZV9sW25OdW1dKTsKKwkJCX0KKwkJCWlmICgobk51bSAmIDB4MDAwMDAwMDcpID09IDB4MDAwMDAwMDcpIHsJLy8gOCB2YWx1ZXMgcHJpbnRlZCAtPiBlbmQgb2YgbGluZSByZWFjaGVkCisJCQkJblNpemUgKz0KKwkJCQkgICAgc25wcmludGYocGNCdWZmZXJfcCArIG5TaXplLAorCQkJCQkgICAgIG5CdWZmZXJTaXplX3AgLSBuU2l6ZSwgIlxuIik7CisJCQl9CisJCX0KKwkJaWYgKChuTnVtICYgMHgwMDAwMDAwNykgIT0gMHgwMDAwMDAwNykgewkvLyBudW1iZXIgb2YgdmFsdWVzIHByaW50ZWQgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAtPiBwcmludCBuZXcgbGluZQorCQkJblNpemUgKz0KKwkJCSAgICBzbnByaW50ZihwY0J1ZmZlcl9wICsgblNpemUsIG5CdWZmZXJTaXplX3AgLSBuU2l6ZSwKKwkJCQkgICAgICJcbiIpOworCQl9CisJfQorI2VuZGlmCisKKwlFb2YgPSAxOworCWdvdG8gRXhpdDsKKworICAgICAgRXhpdDoKKworCSpwRW9mX3AgPSBFb2Y7CisKKwlyZXR1cm4gKG5TaXplKTsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFdyaXRlIGZ1bmN0aW9uIGZvciBQUk9DLUZTIHdyaXRlIGFjY2VzcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludCBFcGxMaW5Qcm9jV3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAorCQkJICAgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKK3sKKwljaGFyIGFiQnVmZmVyW2NvdW50ICsgMV07CisJaW50IGlFcnI7CisJaW50IGlWYWwgPSAwOworCXRFcGxObXRFdmVudCBObXRFdmVudDsKKworCWlmIChjb3VudCA+IDApIHsKKwkJaUVyciA9IGNvcHlfZnJvbV91c2VyKGFiQnVmZmVyLCBidWZmZXIsIGNvdW50KTsKKwkJaWYgKGlFcnIgIT0gMCkgeworCQkJcmV0dXJuIGNvdW50OworCQl9CisJCWFiQnVmZmVyW2NvdW50XSA9ICdcMCc7CisKKwkJaUVyciA9IHNzY2FuZihhYkJ1ZmZlciwgIiVpIiwgJmlWYWwpOworCX0KKwlpZiAoKGlWYWwgPD0gMCkgfHwgKGlWYWwgPiAweDJGKSkgeworCQlObXRFdmVudCA9IGtFcGxObXRFdmVudFN3UmVzZXQ7CisJfSBlbHNlIHsKKwkJTm10RXZlbnQgPSAodEVwbE5tdEV2ZW50KSBpVmFsOworCX0KKwkvLyBleGVjdXRlIHNwZWNpZmllZCBOTVQgY29tbWFuZCBvbiB3cml0ZSBhY2Nlc3Mgb2YgL3Byb2MvZXBsCisJRXBsTm10dU5tdEV2ZW50KE5tdEV2ZW50KTsKKworCXJldHVybiBjb3VudDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvcHJvY19mcy5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9wcm9jX2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU4NmY0OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvcHJvY19mcy5oCkBAIC0wLDAgKzEsODkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbnRlcmZhY2UgZm9yIHByb2MgZnMgZW50cnkgdW5kZXIgTGludXgKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBwcm9jX2ZzLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzMgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdOVQorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDcvMzEgZC5rLjogICBzdGFydCBvZiBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExQUk9DRlNfSF8KKyNkZWZpbmUgX0VQTFBST0NGU19IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxMaW5Qcm9jSW5pdCh2b2lkKTsKK3RFcGxLZXJuZWwgRXBsTGluUHJvY0ZyZWUodm9pZCk7CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExQUk9DRlNfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxDZmdNYXUuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxDZmdNYXUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjVhMWU5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbENmZ01hdS5oCkBAIC0wLDAgKzEsMjg0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBFcGwgQ29uZmlndXJhdGlvbiBNYW5hZ2VyIE1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbENmZ01hdS5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgIFZDNworCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDcvMTQgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKyAgICAgICAgICAgICAgICAgICAgIC0+IGJhc2VkIG9uIENBTm9wZW4gQ2ZnTWEtTW9kdWwgKENBTm9wZW4gdmVyc2lvbiA1LjM0KQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiLi4vRXBsSW5jLmgiCisKKyNpZm5kZWYgX0VQTENGR01BX0hfCisjZGVmaW5lIF9FUExDRkdNQV9IXworCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9DRkdNQSkpICE9IDApCisKKyNpbmNsdWRlICJFcGxPYmR1LmgiCisjaW5jbHVkZSAiRXBsU2RvQ29tdS5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vZGVmaW5lIG1heCBudW1iZXIgb2YgdGltZW91dHMgZm9yIGNvbmZpZ3VyYXRpb24gb2YgMSBkZXZpY2UKKyNkZWZpbmUgRVBMX0NGR01BX01BWF9USU1FT1VUICAgMworCisvL2NhbGxiYWNrZnVuY3Rpb24sIGNhbGxlZCBpZiBjb25maWd1cmF0aW9uIGlzIGZpbmlzaGVkCit0eXBlZGVmIHZvaWQgKFBVQkxJQyAqIHRmcEVwbENmZ01hQ2IpICh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkgICAgICAgdEVwbEtlcm5lbCBFcnJvcnN0YXRlX3ApOworCisvL1N0YXRlIGZvciBjb25maWd1YXJ0aW9uIG1hbmFnZXIgU3RhdGVtYWNoaW5lCit0eXBlZGVmIGVudW0geworCS8vIGdlbmVyYWwgc3RhdGVzCisJa0VwbENmZ01hSWRsZSA9IDB4MDAwMCwJLy8gQ29uZmlndXJhdGlvbnNwcm9jZXNzCisJLy8gaXMgaWRsZQorCWtFcGxDZmdNYVdhaXRGb3JTZG9jRXZlbnQgPSAweDAwMDEsCS8vIHdhaXQgdW50aWwgdGhlIGxhc3QKKwkvLyBTRE9DIGlzIGZpbmlzY2hlZAorCWtFcGxDZmdNYVNraXBNYXBwaW5nU3ViMCA9IDB4MDAwMiwJLy8gd3JpdGUgU3ViMCBvZiBtYXBwaW5nCisJLy8gcGFyYW1ldGVyIHdpdGggMAorCisJa0VwbENmZ01hRmluaXNoZWQgPSAweDAwMDQJLy8gY29uZmlndWFydGlvbiBpcyBmaW5pc2hlZAorfSB0RXBsQ2ZnU3RhdGU7CisKK3R5cGVkZWYgZW51bSB7CisJa0VwbENmZ01hRGNmVHlwU3lzdGVjU2VnID0gMHgwMCwKKwlrRXBsQ2ZnTWFEY2ZUeXBDb25EY2YgPSAweDAxLAorCWtFcGxDZmdNYURjZlR5cERjZiA9IDB4MDIsCS8vIG5vdCBzdXBwb3J0ZWQKKwlrRXBsQ2ZnTWFEY2ZUeXBYZGMgPSAweDAzCS8vIG5vdCBzdXBwb3J0ZWQKK30gdEVwbENmZ01hRGNmVHlwOworCit0eXBlZGVmIGVudW0geworCWtFcGxDZmdNYUNvbW1vbiA9IDAsCS8vIGFsbCBvdGhlciBpbmRleAorCWtFcGxDZmdNYVBkb0NvbW0gPSAxLAkvLyBjb21tdW5pY2F0aW9uIGluZGV4CisJa0VwbENmZ01hUGRvTWFwcCA9IDIsCS8vIG1hcHBpbmcgaW5kZXgKKwlrRXBsQ2ZnTWFQZG9Db21tQWZ0ZXJNYXBwID0gMywJLy8gd3JpdGUgUERPIENvYi1JZCBhZnRlciBtYXBwaW5nIHN1YmluZGV4IDAoc2V0IFBETyB2YWxpZCkKKworfSB0RXBsQ2ZnTWFJbmRleFR5cGU7CisKKy8vYml0Y29kZWQgYW5zd2VyIGFib3V0IHRoZSBsYXN0IHNkbyB0cmFuc2ZlciBzYXZlZCBpbiBtX1Nkb2NTdGF0ZQorLy8gYWxzbyB1c2VkIHRvIHNpbmdhbCBzdGFydCBvZiB0aGUgU3RhdGUgTWFzY2hpbmUKK3R5cGVkZWYgZW51bSB7CisJa0VwbENmZ01hU2RvY0J1c3kgPSAweDAwLAkvLyBTRE9DIGFjdGl2CisJa0VwbENmZ01hU2RvY1JlYWR5ID0gMHgwMSwJLy8gU0RPQyBmaW5pc2hlZAorCWtFcGxDZmdNYVNkb2NUaW1lb3V0ID0gMHgwMiwJLy8gU0RPQyBUaW1lb3V0CisJa0VwbENmZ01hU2RvY0Fib3J0UmVjZWl2ZWQgPSAweDA0LAkvLyBTRE9DIEFib3J0LCBzZWUgQWJvcnRjb2RlCisJa0VwbENmZ01hU2RvY1N0YXJ0ID0gMHgwOAkvLyBzdGFydCBTdGF0ZSBNc2NoaW5lCit9IHRFcGxTZG9jU3RhdGU7CisKKy8vaW50ZXJuYWwgc3RydWN0dXJlIChpbnN0YW5jZXRhYmxlIGZvciBtb2R1bCBjb25maWd1cmF0aW9uIG1hbmFnZXIpCit0eXBlZGVmIHN0cnVjdCB7CisJdEVwbENmZ1N0YXRlIG1fQ2ZnU3RhdGU7CS8vIHN0YXRlIG9mIHRoZSBjb25maWd1cmF0aW9uIHN0YXRlIG1hc2NoaW5lCisJdEVwbFNkb0NvbUNvbkhkbCBtX1Nkb0NvbUNvbkhkbDsJLy8gaGFuZGxlIGZvciBzZG8gY29ubmVjdGlvbgorCURXT1JEIG1fZHdMYXN0QWJvcnRDb2RlOworCXVuc2lnbmVkIGludCBtX3VpTGFzdEluZGV4OwkvLyBsYXN0IGluZGV4IG9mIGNvbmZpZ3VyYXRpb24sIHRvIGNvbXBhaXIgd2l0aCBhY3R1YWwgaW5kZXgKKwlCWVRFICptX3BiQ29uY2lzZTsJLy8gUHRyIHRvIGNvbmNpc2UgRENGCisJQllURSAqbV9wYkFjdHVhbEluZGV4OwkvLyBQdHIgdG8gYWN0dWFsIGluZGV4IGluIHRoZSBEQ0Ygc2VnbWVudAorCXRmcEVwbENmZ01hQ2IgbV9wZm5DZmdNYUNiOwkvLyBQdHIgdG8gQ2ZnTWEgQ2FsbGJhY2ssIGlzIGNhbGwgaWYgY29uZmlndXJhdGlvbiBmaW5pc2hlZAorCXRFcGxLZXJuZWwgbV9FcGxLZXJuZWxFcnJvcjsJLy8gZXJyb3Jjb2RlCisJRFdPUkQgbV9kd051bVZhbHVlQ29weTsJLy8gbnVtZXJpYyB2YWx1ZXMgYXJlIGNvcGllZCBpbiB0aGlzIHZhcmlhYmxlCisJdW5zaWduZWQgaW50IG1fdWlQZG9Ob2RlSWQ7CS8vIGJ1ZmZlciBmb3IgUERPIG5vZGUgaWQKKwlCWVRFIG1fYk5yT2ZNYXBwZWRPYmplY3Q7CS8vIG51bWJlciBvZiBtYXBwZWQgb2JqZWN0cworCXVuc2lnbmVkIGludCBtX3VpTm9kZUlkOwkvLyBFcGwgbm9kZSBhZGRyZXNzZQorCXRFcGxTZG9jU3RhdGUgbV9TZG9jU3RhdGU7CS8vIGJpdGNvZGVkIHN0YXRlIG9mIHRoZSBTRE8gdHJhbnNmZXIKKwl1bnNpZ25lZCBpbnQgbV91aUxhc3RTdWJJbmRleDsJLy8gbGFzdCBzdWJpbmRleCBvZiBjb25maWd1cmF0aW9uCisJQk9PTCBtX2ZPbmVUcmFuZmVyT2s7CS8vIGF0bGVhc2VkIG9uZSB0cmFuc2ZlciB3YXMgc3VjY2Vzc2Z1bAorCUJZVEUgbV9iRXZlbnRGbGFnOwkvLyBmb3IgRXZlbnRzaWduYWxpbmcgdG8gdGhlIFN0YXRlIE1hc2NoaW5lCisJRFdPUkQgbV9kd0NudE9iamVjdEluRGNmOwkvLyBudW1iZXIgb2YgT2JqZWN0cyBpbiBEQ0YKKwl0RXBsQ2ZnTWFJbmRleFR5cGUgbV9Ta2lwQ2ZnOwkvLyBUUlVFIGlmIGEgYWRzaXRpb25hbCBDb25maWd1cmF0aW9ucHJvY2VzcworCS8vIGhhdmUgdG8gaW5zZXJ0IGUuZy4gUERPLW1hcHBpbmcKKwlXT1JEIG1fd1RpbWVPdXRDbnQ7CS8vIFRpbWVvdXQgQ291bnRlciwgYnJlYWsgY29uZmlndXJhdGlvbiBpcworCS8vIG1fd1RpbWVPdXRDbnQgPT0gQ0ZHTUFfTUFYX1RJTUVPVVQKKworfSB0RXBsQ2ZnTWFOb2RlOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZ1bmN0aW9uOiAgICBFcGxDZmdNYUluaXQoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiBjcmVhdGVzIGZpcnN0IGluc3RhbmNlIG9mIENvbmZpZ3VyYXRpb24gTWFuYWdlcgorLy8KKy8vIFBhcmFtZXRlcnM6CisvLworLy8gUmV0dXJuczogICAgIHRFcGxLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbENmZ01hSW5pdCgpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRnVuY3Rpb246ICAgIEVwbENmZ01hQWRkSW5zdGFuY2UoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiBjcmVhdGVzIGFkZGl0aW9uYWwgaW5zdGFuY2Ugb2YgQ29uZmlndXJhdGlvbiBNYW5hZ2VyCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsQ2ZnTWFBZGRJbnN0YW5jZSgpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRnVuY3Rpb246ICAgIEVwbENmZ01hRGVsSW5zdGFuY2UoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiBkZWxldGUgaW5zdGFuY2Ugb2YgQ29uZmlndXJhdGlvbiBNYW5hZ2VyCisvLworLy8gUGFyYW1ldGVyczoKKy8vCisvLyBSZXR1cm5zOiAgICAgdEVwbEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsQ2ZnTWFEZWxJbnN0YW5jZSgpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRnVuY3Rpb246ICAgIEVwbENmZ01hU3RhcnRDb25maWcoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiBzdGFydHMgdGhlIGNvbmZpZ3VyYXRpb24gcHJvY2VzcworLy8gICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uIHRoZSBzdGF0ZW1hY2hpbmUgZm9yIENmZ01hLSBwcm9jZXNzCisvLworLy8gUGFyYW1ldGVyczogIHVpTm9kZUlkX3AgICAgICAgICAgICAgID0gTm9kZUlkIG9mIHRoZSBub2RlIHRvIGNvbmZpZ3VyZQorLy8gICAgICAgICAgICAgIHBiQ29uY2lzZV9wICAgICAgICAgICAgID0gcG9pbnRlciB0byBEQ0YKKy8vICAgICAgICAgICAgICBmcENmZ01hQ2JfcCAgICAgICAgICAgICA9IHBvaW50ZXIgdG8gY2FsbGJhY2sgZnVuY3Rpb24gKHNob3VsZCBub3QgYmUgTlVMTCkKKy8vICAgICAgICAgICAgICBTaXplT2ZDb25jaXNlX3AgICAgICAgICA9IHNpemUgb2YgRENGIGluIEJZVEUgLT4gZm9yIGZ1dHVyZSB1c2UKKy8vICAgICAgICAgICAgICBEY2ZUeXBlX3AgICAgICAgICAgICAgICA9IHR5cGUgb2YgdGhlIERDRgorLy8KKy8vIFJldHVybnM6ICAgICB0Q29wS2VybmVsICAgICAgICAgICAgICA9IGVycm9yIGNvZGUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0RXBsS2VybmVsIFBVQkxJQyBFcGxDZmdNYVN0YXJ0Q29uZmlnKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCSAgICAgIEJZVEUgKiBwYkNvbmNpc2VfcCwKKwkJCQkgICAgICB0ZnBFcGxDZmdNYUNiIGZwQ2ZnTWFDYl9wLAorCQkJCSAgICAgIHRFcGxPYmRTaXplIFNpemVPZkNvbmNpc2VfcCwKKwkJCQkgICAgICB0RXBsQ2ZnTWFEY2ZUeXAgRGNmVHlwZV9wKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZ1bmN0aW9uOiAgICBDZmdNYVN0YXJ0Q29uZmlndXJhdGlvbk5vZGUoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiBzdGFydGVkIHRoZSBjb25maWd1cmF0aW9uIHByb2Nlc3MKKy8vICAgICAgICAgICAgICB3aXRoIHRoZSBEQ0YgZnJvbSBhY2NvcmRpbmcgT0QtZW50cnkgU3ViaW5kZXggPT0gYk5vZGVJZF9wCisvLworLy8gUGFyYW1ldGVyczogIHVpTm9kZUlkX3AgICAgICAgICAgICAgID0gTm9kZUlkIG9mIHRoZSBub2RlIHRvIGNvbmZpZ3VyZQorLy8gICAgICAgICAgICAgIGZwQ2ZnTWFDYl9wICAgICAgICAgICAgID0gcG9pbnRlciB0byBjYWxsYmFjayBmdW5jdGlvbiAoc2hvdWxkIG5vdCBiZSBOVUxMKQorLy8gICAgICAgICAgICAgIERjZlR5cGVfcCAgICAgICAgICAgICAgID0gdHlwZSBvZiB0aGUgRENGCisvLworLy8gUmV0dXJuczogICAgIHRDb3BLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbENmZ01hU3RhcnRDb25maWdOb2RlKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkgIHRmcEVwbENmZ01hQ2IgZnBDZmdNYUNiX3AsCisJCQkJCSAgdEVwbENmZ01hRGNmVHlwIERjZlR5cGVfcCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGdW5jdGlvbjogICAgRXBsQ2ZnTWFTdGFydENvbmZpZ05vZGVEY2YoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiBzdGFydHMgdGhlIGNvbmZpZ3VyYXRpb24gcHJvY2VzcworLy8gICAgICAgICAgICAgIGFuZCBsaW5rcyB0aGUgY29uZmlndXJhdGlvbiBkYXRhIHRvIHRoZSBPRAorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICAgICAgICAgICAgICA9IE5vZGVJZCBvZiB0aGUgbm9kZSB0byBjb25maWd1cmUKKy8vICAgICAgICAgICAgICBwYkNvbmNpc2VfcCAgICAgICAgICAgICA9IHBvaW50ZXIgdG8gRENGCisvLyAgICAgICAgICAgICAgZnBDZmdNYUNiX3AgICAgICAgICAgICAgPSBwb2ludGVyIHRvIGNhbGxiYWNrIGZ1bmN0aW9uIChzaG91bGQgbm90IGJlIE5VTEwpCisvLyAgICAgICAgICAgICAgU2l6ZU9mQ29uY2lzZV9wICAgICAgICAgPSBzaXplIG9mIERDRiBpbiBCWVRFIC0+IGZvciBmdXR1cmUgdXNlCisvLyAgICAgICAgICAgICAgRGNmVHlwZV9wICAgICAgICAgICAgICAgPSB0eXBlIG9mIHRoZSBEQ0YKKy8vCisvLyBSZXR1cm5zOiAgICAgdENvcEtlcm5lbCAgICAgICAgICAgICAgPSBlcnJvciBjb2RlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsQ2ZnTWFTdGFydENvbmZpZ05vZGVEY2YodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCSAgICAgQllURSAqIHBiQ29uY2lzZV9wLAorCQkJCQkgICAgIHRmcEVwbENmZ01hQ2IgZnBDZmdNYUNiX3AsCisJCQkJCSAgICAgdEVwbE9iZFNpemUgU2l6ZU9mQ29uY2lzZV9wLAorCQkJCQkgICAgIHRFcGxDZmdNYURjZlR5cCBEY2ZUeXBlX3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRnVuY3Rpb246ICAgIEVwbENmZ01hTGlua0RjZigpCisvLworLy8gRGVzY3JpcHRpb246IEZ1bmN0aW9uIGxpbmtzIHRoZSBjb25maWd1cmF0aW9uIGRhdGEgdG8gdGhlIE9ECisvLworLy8gUGFyYW1ldGVyczogIHVpTm9kZUlkX3AgICAgICAgICAgICAgID0gTm9kZUlkIG9mIHRoZSBub2RlIHRvIGNvbmZpZ3VyZQorLy8gICAgICAgICAgICAgIHBiQ29uY2lzZV9wICAgICAgICAgICAgID0gcG9pbnRlciB0byBEQ0YKKy8vICAgICAgICAgICAgICBTaXplT2ZDb25jaXNlX3AgICAgICAgID0gc2l6ZSBvZiBEQ0YgaW4gQllURSAtPiBmb3IgZnV0dXJlIHVzZQorLy8gICAgICAgICAgICAgIERjZlR5cGVfcCAgICAgICAgICAgICAgID0gdHlwZSBvZiB0aGUgRENGCisvLworLy8gUmV0dXJuczogICAgIHRDb3BLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbENmZ01hTGlua0RjZih1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkgIEJZVEUgKiBwYkNvbmNpc2VfcCwKKwkJCQkgIHRFcGxPYmRTaXplIFNpemVPZkNvbmNpc2VfcCwKKwkJCQkgIHRFcGxDZmdNYURjZlR5cCBEY2ZUeXBlX3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRnVuY3Rpb246ICAgIEVwbENmZ01hQ2hlY2tEY2YoKQorLy8KKy8vIERlc2NyaXB0aW9uOiBGdW5jdGlvbiBjaGVjayBpZiB0aGVyZSBpcyBhbGxyZWFkeSBhIGNvbmZpZ3VyYXRpb24gZmlsZSBsaW5rZWQKKy8vICAgICAgICAgICAgICB0byB0aGUgT0QgKHR5cGUgaXMgZ2l2ZW4gYnkgRGNmVHlwZV9wKQorLy8KKy8vIFBhcmFtZXRlcnM6ICB1aU5vZGVJZF9wICAgICAgICAgICAgICA9IE5vZGVJZAorLy8gICAgICAgICAgICAgIERjZlR5cGVfcCAgICAgICAgICAgICAgID0gdHlwZSBvZiB0aGUgRENGCisvLworLy8gUmV0dXJuczogICAgIHRDb3BLZXJuZWwgICAgICAgICAgICAgID0gZXJyb3IgY29kZQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RFcGxLZXJuZWwgUFVCTElDIEVwbENmZ01hQ2hlY2tEY2YodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJICAgdEVwbENmZ01hRGNmVHlwIERjZlR5cGVfcCk7CisKKyNlbmRpZiAvLyAjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9DRkdNQSkpICE9IDApCisKKyNlbmRpZiAvLyBfRVBMQ0ZHTUFfSF8KKworLy8gRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsRGxsdS5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbERsbHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmY4YmI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbERsbHUuaApAQCAtMCwwICsxLDEwOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgdXNlcnNwYWNlIERMTCBtb2R1bGUgZm9yIGFzeW5jaHJvbm91cyBjb21tdW5pY2F0aW9uCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsRGxsdS5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMjAgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExfRExMVV9IXworI2RlZmluZSBfRVBMX0RMTFVfSF8KKworI2luY2x1ZGUgIi4uL0VwbERsbC5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgdEVwbEtlcm5lbChQVUJMSUMgKiB0RXBsRGxsdUNiQXNuZCkgKHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvX3ApOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExVKSkgIT0gMCkKKwordEVwbEtlcm5lbCBFcGxEbGx1QWRkSW5zdGFuY2Uodm9pZCk7CisKK3RFcGxLZXJuZWwgRXBsRGxsdURlbEluc3RhbmNlKHZvaWQpOworCit0RXBsS2VybmVsIEVwbERsbHVSZWdBc25kU2VydmljZSh0RXBsRGxsQXNuZFNlcnZpY2VJZCBTZXJ2aWNlSWRfcCwKKwkJCQkgdEVwbERsbHVDYkFzbmQgcGZuRGxsdUNiQXNuZF9wLAorCQkJCSB0RXBsRGxsQXNuZEZpbHRlciBGaWx0ZXJfcCk7CisKK3RFcGxLZXJuZWwgRXBsRGxsdUFzeW5jU2VuZCh0RXBsRnJhbWVJbmZvICogcEZyYW1lSW5mb19wLAorCQkJICAgIHRFcGxEbGxBc3luY1JlcVByaW9yaXR5IFByaW9yaXR5X3ApOworCisvLyBwcm9jZXNzZXMgYXN5bmNoIGZyYW1lcwordEVwbEtlcm5lbCBFcGxEbGx1UHJvY2Vzcyh0RXBsRnJhbWVJbmZvICogcEZyYW1lSW5mb19wKTsKKworI2VuZGlmIC8vICNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMVSkpICE9IDApCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExfRExMVV9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbERsbHVDYWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxEbGx1Q2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFkY2QwNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxEbGx1Q2FsLmgKQEAgLTAsMCArMSwxMTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIERMTCBDb21tdW5pY2F0aW9uIEFic3RyYWN0aW9uIExheWVyIG1vZHVsZSBpbiBFUEwgdXNlciBwYXJ0CisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsRGxsdUNhbC5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMjAgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExfRExMVUNBTF9IXworI2RlZmluZSBfRVBMX0RMTFVDQUxfSF8KKworI2luY2x1ZGUgIi4uL0VwbERsbC5oIgorI2luY2x1ZGUgIi4uL0VwbEV2ZW50LmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiB0RXBsS2VybmVsKFBVQkxJQyAqIHRFcGxEbGx1Q2JBc25kKSAodEVwbEZyYW1lSW5mbyAqIHBGcmFtZUluZm9fcCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIEVwbERsbHVDYWxBZGRJbnN0YW5jZSh2b2lkKTsKKwordEVwbEtlcm5lbCBFcGxEbGx1Q2FsRGVsSW5zdGFuY2Uodm9pZCk7CisKK3RFcGxLZXJuZWwgRXBsRGxsdUNhbFJlZ0FzbmRTZXJ2aWNlKHRFcGxEbGxBc25kU2VydmljZUlkIFNlcnZpY2VJZF9wLAorCQkJCSAgICB0RXBsRGxsdUNiQXNuZCBwZm5EbGx1Q2JBc25kX3AsCisJCQkJICAgIHRFcGxEbGxBc25kRmlsdGVyIEZpbHRlcl9wKTsKKwordEVwbEtlcm5lbCBFcGxEbGx1Q2FsQXN5bmNTZW5kKHRFcGxGcmFtZUluZm8gKiBwRnJhbWVJbmZvLAorCQkJICAgICAgIHRFcGxEbGxBc3luY1JlcVByaW9yaXR5IFByaW9yaXR5X3ApOworCit0RXBsS2VybmVsIEVwbERsbHVDYWxQcm9jZXNzKHRFcGxFdmVudCAqIHBFdmVudF9wKTsKKworI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQorCit0RXBsS2VybmVsIEVwbERsbHVDYWxBZGROb2RlKHRFcGxEbGxOb2RlSW5mbyAqIHBOb2RlSW5mb19wKTsKKwordEVwbEtlcm5lbCBFcGxEbGx1Q2FsRGVsZXRlTm9kZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCk7CisKK3RFcGxLZXJuZWwgRXBsRGxsdUNhbFNvZnREZWxldGVOb2RlKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wKTsKKwordEVwbEtlcm5lbCBFcGxEbGx1Q2FsSXNzdWVSZXF1ZXN0KHRFcGxEbGxSZXFTZXJ2aWNlSWQgU2VydmljZV9wLAorCQkJCSAgdW5zaWduZWQgaW50IHVpTm9kZUlkX3AsIEJZVEUgYlNvYUZsYWcxX3ApOworCisjZW5kaWYKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTF9ETExVQ0FMX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsRXZlbnR1LmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsRXZlbnR1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIyY2ZmZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxFdmVudHUuaApAQCAtMCwwICsxLDEwOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3Iga2VybmVsIGV2ZW50IG1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbEV2ZW50dS5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMTIgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24sIHZlcnNpb24gMS4wMAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9FUExfRVZFTlRVX0hfCisjZGVmaW5lIF9FUExfRVZFTlRVX0hfCisKKyNpbmNsdWRlICIuLi9FcGxFdmVudC5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gaW5pdCBmdW5jdGlvbgordEVwbEtlcm5lbCBQVUJMSUMgRXBsRXZlbnR1SW5pdCh0RXBsUHJvY2Vzc0V2ZW50Q2IgcGZuQXBpUHJvY2Vzc0V2ZW50Q2JfcCk7CisKKy8vIGFkZCBpbnN0YW5jZQordEVwbEtlcm5lbCBQVUJMSUMgRXBsRXZlbnR1QWRkSW5zdGFuY2UodEVwbFByb2Nlc3NFdmVudENiCisJCQkJICAgICAgIHBmbkFwaVByb2Nlc3NFdmVudENiX3ApOworCisvLyBkZWxldGUgaW5zdGFuY2UKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEV2ZW50dURlbEluc3RhbmNlKHZvaWQpOworCisvLyBUYXNrIHRoYXQgZGlzcGF0Y2hlcyBldmVudHMgaW4gdXNlcnNwYWNlCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudHVQcm9jZXNzKHRFcGxFdmVudCAqIHBFdmVudF9wKTsKKworLy8gcG9zdCBldmVudHMgZnJvbSB1c2Vyc3BhY2UKK3RFcGxLZXJuZWwgUFVCTElDIEVwbEV2ZW50dVBvc3QodEVwbEV2ZW50ICogcEV2ZW50X3ApOworCisvLyBwb3N0IGVycm9yZXZlbnRzIGZyb20gdXNlcnNwYWNlCit0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudHVQb3N0RXJyb3IodEVwbEV2ZW50U291cmNlIEV2ZW50U291cmNlX3AsCisJCQkJICAgICB0RXBsS2VybmVsIEVwbEVycm9yX3AsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlBcmdTaXplX3AsIHZvaWQgKnBBcmdfcCk7CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExfRVZFTlRVX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsSWRlbnR1LmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsSWRlbnR1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTczMDIxMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxJZGVudHUuaApAQCAtMCwwICsxLDEwOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgSWRlbnR1LU1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbElkZW50dS5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMTEvMTUgZC5rLjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIi4uL0VwbERsbC5oIgorCisjaWZuZGVmIF9FUExJREVOVFVfSF8KKyNkZWZpbmUgX0VQTElERU5UVV9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgdEVwbEtlcm5lbChQVUJMSUMgKiB0RXBsSWRlbnR1Q2JSZXNwb25zZSkgKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkJICAgdEVwbElkZW50UmVzcG9uc2UgKgorCQkJCQkJICAgcElkZW50UmVzcG9uc2VfcCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxJZGVudHVJbml0KHZvaWQpOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxJZGVudHVBZGRJbnN0YW5jZSh2b2lkKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsSWRlbnR1RGVsSW5zdGFuY2Uodm9pZCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbElkZW50dVJlc2V0KHZvaWQpOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxJZGVudHVHZXRJZGVudFJlc3BvbnNlKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wLAorCQkJCQkgICAgdEVwbElkZW50UmVzcG9uc2UgKioKKwkJCQkJICAgIHBwSWRlbnRSZXNwb25zZV9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsSWRlbnR1UmVxdWVzdElkZW50UmVzcG9uc2UodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCQl0RXBsSWRlbnR1Q2JSZXNwb25zZQorCQkJCQkJcGZuQ2JSZXNwb25zZV9wKTsKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTElERU5UVV9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbExlZHUuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxMZWR1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhlNzBkMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxMZWR1LmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIHN0YXR1cyBhbmQgZXJyb3IgTEVEIHVzZXIgcGFydCBtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxMZWR1LmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjEgJCAgJERhdGU6IDIwMDgvMTEvMTcgMTY6NDA6MzkgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwOC8xMS8xNyBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiLi4vRXBsTGVkLmgiCisjaW5jbHVkZSAiLi4vRXBsTm10LmgiCisjaW5jbHVkZSAiRXBsRXZlbnR1LmgiCisKKyNpZm5kZWYgX0VQTExFRFVfSF8KKyNkZWZpbmUgX0VQTExFRFVfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHRFcGxLZXJuZWwoUFVCTElDICogdEVwbExlZHVTdGF0ZUNoYW5nZUNhbGxiYWNrKSAodEVwbExlZFR5cGUgTGVkVHlwZV9wLAorCQkJCQkJCSAgQk9PTCBmT25fcCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9MRURVKSkgIT0gMCkKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsTGVkdUluaXQodEVwbExlZHVTdGF0ZUNoYW5nZUNhbGxiYWNrIHBmbkNiU3RhdGVDaGFuZ2VfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbExlZHVBZGRJbnN0YW5jZSh0RXBsTGVkdVN0YXRlQ2hhbmdlQ2FsbGJhY2sKKwkJCQkgICAgIHBmbkNiU3RhdGVDaGFuZ2VfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbExlZHVEZWxJbnN0YW5jZSh2b2lkKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsTGVkdUNiTm10U3RhdGVDaGFuZ2UodEVwbEV2ZW50Tm10U3RhdGVDaGFuZ2UKKwkJCQkJICBObXRTdGF0ZUNoYW5nZV9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsTGVkdVByb2Nlc3NFdmVudCh0RXBsRXZlbnQgKiBwRXBsRXZlbnRfcCk7CisKKyNlbmRpZiAvLyAjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9MRURVKSkgIT0gMCkKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTExFRFVfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxObXRDbnUuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxObXRDbnUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTA4MDU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbE5tdENudS5oCkBAIC0wLDAgKzEsMTA4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBOTVQtQ04tVXNlcnNwYWNlLU1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE5tdENudS5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMDkgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkVwbE5tdHUuaCIKKyNpbmNsdWRlICIuLi9FcGxEbGwuaCIKKyNpbmNsdWRlICIuLi9FcGxGcmFtZS5oIgorCisjaWZuZGVmIF9FUExOTVRDTlVfSF8KKyNkZWZpbmUgX0VQTE5NVENOVV9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9DTikpICE9IDApCisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRDbnVJbml0KHVuc2lnbmVkIGludCB1aU5vZGVJZF9wKTsKKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE5tdENudUFkZEluc3RhbmNlKHVuc2lnbmVkIGludCB1aU5vZGVJZF9wKTsKKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE5tdENudURlbEluc3RhbmNlKHZvaWQpOworCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10Q251U2VuZE5tdFJlcXVlc3QodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCQkgICAgICAgdEVwbE5tdENvbW1hbmQKKwkJCQkJCSAgICAgICBObXRDb21tYW5kX3ApOworCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMKK0VwbE5tdENudVJlZ2lzdGVyQ2hlY2tFdmVudENiKHRFcGxObXR1Q2hlY2tFdmVudENhbGxiYWNrCisJCQkgICAgICBwZm5FcGxObXRDaGVja0V2ZW50Q2JfcCk7CisKKyNlbmRpZiAvLyAjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9DTikpICE9IDApCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExOTVRDTlVfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxObXRNbnUuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxObXRNbnUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTRlZmViCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbE5tdE1udS5oCkBAIC0wLDAgKzEsMTMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciBOTVQtTU4tVXNlcnNwYWNlLU1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbE5tdE1udS5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMDkgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkVwbE5tdHUuaCIKKworI2lmbmRlZiBfRVBMTk1UTU5VX0hfCisjZGVmaW5lIF9FUExOTVRNTlVfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHRFcGxLZXJuZWwoUFVCTElDICogdEVwbE5tdE1udUNiTm9kZUV2ZW50KSAodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCQkgICAgdEVwbE5tdE5vZGVFdmVudAorCQkJCQkJICAgIE5vZGVFdmVudF9wLAorCQkJCQkJICAgIHRFcGxObXRTdGF0ZSBObXRTdGF0ZV9wLAorCQkJCQkJICAgIFdPUkQgd0Vycm9yQ29kZV9wLAorCQkJCQkJICAgIEJPT0wgZk1hbmRhdG9yeV9wKTsKKwordHlwZWRlZiB0RXBsS2VybmVsKFBVQkxJQyAqCisJCSAgIHRFcGxObXRNbnVDYkJvb3RFdmVudCkgKHRFcGxObXRCb290RXZlbnQgQm9vdEV2ZW50X3AsCisJCQkJCSAgIHRFcGxObXRTdGF0ZSBObXRTdGF0ZV9wLAorCQkJCQkgICBXT1JEIHdFcnJvckNvZGVfcCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCisKK3RFcGxLZXJuZWwgRXBsTm10TW51SW5pdCh0RXBsTm10TW51Q2JOb2RlRXZlbnQgcGZuQ2JOb2RlRXZlbnRfcCwKKwkJCSB0RXBsTm10TW51Q2JCb290RXZlbnQgcGZuQ2JCb290RXZlbnRfcCk7CisKK3RFcGxLZXJuZWwgRXBsTm10TW51QWRkSW5zdGFuY2UodEVwbE5tdE1udUNiTm9kZUV2ZW50IHBmbkNiTm9kZUV2ZW50X3AsCisJCQkJdEVwbE5tdE1udUNiQm9vdEV2ZW50IHBmbkNiQm9vdEV2ZW50X3ApOworCit0RXBsS2VybmVsIEVwbE5tdE1udURlbEluc3RhbmNlKHZvaWQpOworCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10TW51UHJvY2Vzc0V2ZW50KHRFcGxFdmVudCAqIHBFdmVudF9wKTsKKwordEVwbEtlcm5lbCBFcGxObXRNbnVTZW5kTm10Q29tbWFuZCh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkgICB0RXBsTm10Q29tbWFuZCBObXRDb21tYW5kX3ApOworCit0RXBsS2VybmVsIEVwbE5tdE1udVRyaWdnZXJTdGF0ZUNoYW5nZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkgICAgICAgdEVwbE5tdE5vZGVDb21tYW5kIE5vZGVDb21tYW5kX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxObXRNbnVDYk5tdFN0YXRlQ2hhbmdlKHRFcGxFdmVudE5tdFN0YXRlQ2hhbmdlCisJCQkJCSAgICBObXRTdGF0ZUNoYW5nZV9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10TW51Q2JDaGVja0V2ZW50KHRFcGxObXRFdmVudCBObXRFdmVudF9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10TW51R2V0RGlhZ25vc3RpY0luZm8odW5zaWduZWQgaW50CisJCQkJCSAgICAgKnB1aU1hbmRhdG9yeVNsYXZlQ291bnRfcCwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQKKwkJCQkJICAgICAqcHVpU2lnbmFsU2xhdmVDb3VudF9wLAorCQkJCQkgICAgIFdPUkQgKiBwd0ZsYWdzX3ApOworCisjZW5kaWYKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTE5NVE1OVV9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbE5tdHUuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxObXR1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE1NmM1OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxObXR1LmgKQEAgLTAsMCArMSwxNTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIE5NVC1Vc2Vyc3BhY2UtTW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsTm10dS5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMDkgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIi4uL0VwbE5tdC5oIgorI2luY2x1ZGUgIkVwbEV2ZW50dS5oIgorCisjaWZuZGVmIF9FUExOTVRVX0hfCisjZGVmaW5lIF9FUExOTVRVX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG5tdCBjb21tYW5kcwordHlwZWRlZiBlbnVtIHsKKwkvLyByZXF1ZXN0YWJsZSBBU25kIFNlcnZpY2VJZHMgICAgMHgwMS4uMHgxRgorCWtFcGxObXRDbWRJZGVudFJlc3BvbnNlID0gMHgwMSwKKwlrRXBsTm10Q21kU3RhdHVzUmVzcG9uc2UgPSAweDAyLAorCS8vIHBsYWluIE5NVCBzdGF0ZSBjb21tYW5kcyAgICAgICAweDIwLi4weDNGCisJa0VwbE5tdENtZFN0YXJ0Tm9kZSA9IDB4MjEsCisJa0VwbE5tdENtZFN0b3BOb2RlID0gMHgyMiwKKwlrRXBsTm10Q21kRW50ZXJQcmVPcGVyYXRpb25hbDIgPSAweDIzLAorCWtFcGxObXRDbWRFbmFibGVSZWFkeVRvT3BlcmF0ZSA9IDB4MjQsCisJa0VwbE5tdENtZFJlc2V0Tm9kZSA9IDB4MjgsCisJa0VwbE5tdENtZFJlc2V0Q29tbXVuaWNhdGlvbiA9IDB4MjksCisJa0VwbE5tdENtZFJlc2V0Q29uZmlndXJhdGlvbiA9IDB4MkEsCisJa0VwbE5tdENtZFN3UmVzZXQgPSAweDJCLAorCS8vIGV4dGVuZGVkIE5NVCBzdGF0ZSBjb21tYW5kcyAgICAweDQwLi4weDVGCisJa0VwbE5tdENtZFN0YXJ0Tm9kZUV4ID0gMHg0MSwKKwlrRXBsTm10Q21kU3RvcE5vZGVFeCA9IDB4NDIsCisJa0VwbE5tdENtZEVudGVyUHJlT3BlcmF0aW9uYWwyRXggPSAweDQzLAorCWtFcGxObXRDbWRFbmFibGVSZWFkeVRvT3BlcmF0ZUV4ID0gMHg0NCwKKwlrRXBsTm10Q21kUmVzZXROb2RlRXggPSAweDQ4LAorCWtFcGxObXRDbWRSZXNldENvbW11bmljYXRpb25FeCA9IDB4NDksCisJa0VwbE5tdENtZFJlc2V0Q29uZmlndXJhdGlvbkV4ID0gMHg0QSwKKwlrRXBsTm10Q21kU3dSZXNldEV4ID0gMHg0QiwKKwkvLyBOTVQgbWFuYWdpbmcgY29tbWFuZHMgICAgICAgICAgMHg2MC4uMHg3RgorCWtFcGxObXRDbWROZXRIb3N0TmFtZVNldCA9IDB4NjIsCisJa0VwbE5tdENtZEZsdXNoQXJwRW50cnkgPSAweDYzLAorCS8vIE5NVCBpbmZvIHNlcnZpY2VzICAgICAgICAgICAgICAweDgwLi4weEJGCisJa0VwbE5tdENtZFB1Ymxpc2hDb25maWd1cmVkQ04gPSAweDgwLAorCWtFcGxObXRDbWRQdWJsaXNoQWN0aXZlQ04gPSAweDkwLAorCWtFcGxObXRDbWRQdWJsaXNoUHJlT3BlcmF0aW9uYWwxID0gMHg5MSwKKwlrRXBsTm10Q21kUHVibGlzaFByZU9wZXJhdGlvbmFsMiA9IDB4OTIsCisJa0VwbE5tdENtZFB1Ymxpc2hSZWFkeVRvT3BlcmF0ZSA9IDB4OTMsCisJa0VwbE5tdENtZFB1Ymxpc2hPcGVyYXRpb25hbCA9IDB4OTQsCisJa0VwbE5tdENtZFB1Ymxpc2hTdG9wcGVkID0gMHg5NSwKKwlrRXBsTm10Q21kUHVibGlzaEVtZXJnZW5jeU5ldyA9IDB4QTAsCisJa0VwbE5tdENtZFB1Ymxpc2hUaW1lID0gMHhCMCwKKworCWtFcGxObXRDbWRJbnZhbGlkU2VydmljZSA9IDB4RkYKK30gdEVwbE5tdENvbW1hbmQ7CisKK3R5cGVkZWYgdEVwbEtlcm5lbChQVUJMSUMgKgorCQkgICB0RXBsTm10dVN0YXRlQ2hhbmdlQ2FsbGJhY2spICh0RXBsRXZlbnRObXRTdGF0ZUNoYW5nZQorCQkJCQkJIE5tdFN0YXRlQ2hhbmdlX3ApOworCit0eXBlZGVmIHRFcGxLZXJuZWwoUFVCTElDICoKKwkJICAgdEVwbE5tdHVDaGVja0V2ZW50Q2FsbGJhY2spICh0RXBsTm10RXZlbnQgTm10RXZlbnRfcCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVFUpKSAhPSAwKQorCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsTm10dUluaXQodm9pZCk7CisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXR1QWRkSW5zdGFuY2Uodm9pZCk7CisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXR1RGVsSW5zdGFuY2Uodm9pZCk7CisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXR1Tm10RXZlbnQodEVwbE5tdEV2ZW50IE5tdEV2ZW50X3ApOworCitFUExETExFWFBPUlQgdEVwbE5tdFN0YXRlIFBVQkxJQyBFcGxObXR1R2V0Tm10U3RhdGUodm9pZCk7CisKK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxObXR1UHJvY2Vzc0V2ZW50KHRFcGxFdmVudCAqIHBFcGxFdmVudF9wKTsKKworRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDCitFcGxObXR1UmVnaXN0ZXJTdGF0ZUNoYW5nZUNiKHRFcGxObXR1U3RhdGVDaGFuZ2VDYWxsYmFjaworCQkJICAgICBwZm5FcGxObXRTdGF0ZUNoYW5nZUNiX3ApOworCisjZW5kaWYgLy8gI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRVKSkgIT0gMCkKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTE5NVFVfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxObXR1Q2FsLmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsTm10dUNhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ODE1ODIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsTm10dUNhbC5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIGNvbW11bmljYXRpb24gYWJzdHJhY3Rpb24gbGF5ZXIgb2YgdGhlCisgICAgICAgICAgICAgICAgTk1ULVVzZXJzcGFjZS1Nb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxObXR1Q2FsLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8xNiAtay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkVwbE5tdHUuaCIKKyNpbmNsdWRlICIuLi9rZXJuZWwvRXBsTm10ay5oIgorCisjaWZuZGVmIF9FUExOTVRVQ0FMX0hfCisjZGVmaW5lIF9FUExOTVRVQ0FMX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbE5tdFN0YXRlIFBVQkxJQyBFcGxObXRrQ2FsR2V0Tm10U3RhdGUodm9pZCk7CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExOTVRVQ0FMX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsT2JkdS5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbE9iZHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzFlMTczCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbE9iZHUuaApAQCAtMCwwICsxLDE5MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgRXBsLU9iZC1Vc2Vyc3BhY2UtbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsT2JkdS5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMTkgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIi4uL0VwbE9iZC5oIgorCisjaWZuZGVmIF9FUExPQkRVX0hfCisjZGVmaW5lIF9FUExPQkRVX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX09CRFUpKSAhPSAwKQorCisjaWYgRVBMX09CRF9VU0VfS0VSTkVMICE9IEZBTFNFCisjZXJyb3IgIkVQTCBPQkR1IG1vZHVsZSBlbmFibGVkLCBidXQgT0JEX1VTRV9LRVJORUwgPT0gVFJVRSIKKyNlbmRpZgorCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdVdyaXRlRW50cnkodW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkJIHZvaWQgKnBTcmNEYXRhX3AsCisJCQkJCQkgdEVwbE9iZFNpemUgU2l6ZV9wKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdVJlYWRFbnRyeSh1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJdW5zaWduZWQgaW50IHVpU3ViSW5kZXhfcCwKKwkJCQkJCXZvaWQgKnBEc3REYXRhX3AsCisJCQkJCQl0RXBsT2JkU2l6ZSAqIHBTaXplX3ApOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1QWNjZXNzT2RQYXJ0KHRFcGxPYmRQYXJ0IE9iZFBhcnRfcCwKKwkJCQkJCSAgIHRFcGxPYmREaXIgRGlyZWN0aW9uX3ApOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1RGVmaW5lVmFyKHRFcGxWYXJQYXJhbSBNRU0gKiBwVmFyUGFyYW1fcCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHZvaWQgKlBVQkxJQyBFcGxPYmR1R2V0T2JqZWN0RGF0YVB0cih1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wKTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVSZWdpc3RlclVzZXJPZCh0RXBsT2JkRW50cnlQdHIgcFVzZXJPZF9wKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdm9pZCBQVUJMSUMgRXBsT2JkdUluaXRWYXJFbnRyeSh0RXBsT2JkVmFyRW50cnkgTUVNICogcFZhckVudHJ5X3AsCisJCQkJCSAgICAgQllURSBiVHlwZV9wLAorCQkJCQkgICAgIHRFcGxPYmRTaXplIE9iZFNpemVfcCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxPYmRTaXplIFBVQkxJQyBFcGxPYmR1R2V0RGF0YVNpemUodW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3ApOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB1bnNpZ25lZCBpbnQgUFVCTElDIEVwbE9iZHVHZXROb2RlSWQodm9pZCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVTZXROb2RlSWQodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCQl0RXBsT2JkTm9kZUlkVHlwZSBOb2RlSWRUeXBlX3ApOworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdUdldEFjY2Vzc1R5cGUodW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkJICAgIHRFcGxPYmRBY2Nlc3MgKgorCQkJCQkJICAgIHBBY2Nlc3NUeXBfcCk7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1UmVhZEVudHJ5VG9MZSh1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJICAgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCQkgICAgdm9pZCAqcERzdERhdGFfcCwKKwkJCQkJCSAgICB0RXBsT2JkU2l6ZSAqIHBTaXplX3ApOworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdVdyaXRlRW50cnlGcm9tTGUodW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQKKwkJCQkJCSAgICAgICB1aVN1YkluZGV4X3AsCisJCQkJCQkgICAgICAgdm9pZCAqcFNyY0RhdGFfcCwKKwkJCQkJCSAgICAgICB0RXBsT2JkU2l6ZSBTaXplX3ApOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1U2VhcmNoVmFyRW50cnkoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8KKwkJCQkJCSAgICAgdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgICAgdW5zaWduZWQgaW50IHVpU3ViaW5kZXhfcCwKKwkJCQkJCSAgICAgdEVwbE9iZFZhckVudHJ5IE1FTSAqKgorCQkJCQkJICAgICBwcFZhckVudHJ5X3ApOworCisjZWxpZiBFUExfT0JEX1VTRV9LRVJORUwgIT0gRkFMU0UKKyNpbmNsdWRlICIuLi9rZXJuZWwvRXBsT2Jkay5oIgorCisjZGVmaW5lIEVwbE9iZHVXcml0ZUVudHJ5ICAgICAgIEVwbE9iZFdyaXRlRW50cnkKKworI2RlZmluZSBFcGxPYmR1UmVhZEVudHJ5ICAgICAgICBFcGxPYmRSZWFkRW50cnkKKworI2RlZmluZSBFcGxPYmR1QWNjZXNzT2RQYXJ0ICAgICBFcGxPYmRBY2Nlc3NPZFBhcnQKKworI2RlZmluZSBFcGxPYmR1RGVmaW5lVmFyICAgICAgICBFcGxPYmREZWZpbmVWYXIKKworI2RlZmluZSBFcGxPYmR1R2V0T2JqZWN0RGF0YVB0ciBFcGxPYmRHZXRPYmplY3REYXRhUHRyCisKKyNkZWZpbmUgRXBsT2JkdVJlZ2lzdGVyVXNlck9kICAgRXBsT2JkUmVnaXN0ZXJVc2VyT2QKKworI2RlZmluZSBFcGxPYmR1SW5pdFZhckVudHJ5ICAgICBFcGxPYmRJbml0VmFyRW50cnkKKworI2RlZmluZSBFcGxPYmR1R2V0RGF0YVNpemUgICAgICBFcGxPYmRHZXREYXRhU2l6ZQorCisjZGVmaW5lIEVwbE9iZHVHZXROb2RlSWQgICAgICAgIEVwbE9iZEdldE5vZGVJZAorCisjZGVmaW5lIEVwbE9iZHVTZXROb2RlSWQgICAgICAgIEVwbE9iZFNldE5vZGVJZAorCisjZGVmaW5lIEVwbE9iZHVHZXRBY2Nlc3NUeXBlICAgIEVwbE9iZEdldEFjY2Vzc1R5cGUKKworI2RlZmluZSBFcGxPYmR1UmVhZEVudHJ5VG9MZSAgICBFcGxPYmRSZWFkRW50cnlUb0xlCisKKyNkZWZpbmUgRXBsT2JkdVdyaXRlRW50cnlGcm9tTGUgRXBsT2JkV3JpdGVFbnRyeUZyb21MZQorCisjZGVmaW5lIEVwbE9iZHVTZWFyY2hWYXJFbnRyeSAgIEVwbE9iZFNlYXJjaFZhckVudHJ5CisKKyNkZWZpbmUgRXBsT2JkdUlzTnVtZXJpY2FsICAgICAgRXBsT2JkSXNOdW1lcmljYWwKKworI2VuZGlmIC8vICNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfT0JEVSkpICE9IDApCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExPQkRVX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsT2JkdUNhbC5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbE9iZHVDYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OThlMDExCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbE9iZHVDYWwuaApAQCAtMCwwICsxLDE0OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgY29tbXVuaWNhdGlvbiBhYnN0cmFjdGlvbiBsYXllcgorICAgICAgICAgICAgICAgIGZvciB0aGUgRXBsLU9iZC1Vc2Vyc3BhY2UtTW9kdWwKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxPYmR1Q2FsLmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8xOSBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiLi4vRXBsT2JkLmgiCisKKyNpZm5kZWYgX0VQTE9CRFVDQUxfSF8KKyNkZWZpbmUgX0VQTE9CRFVDQUxfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1Q2FsV3JpdGVFbnRyeSh1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJICAgIHVuc2lnbmVkIGludCB1aVN1YkluZGV4X3AsCisJCQkJCQkgICAgdm9pZCAqcFNyY0RhdGFfcCwKKwkJCQkJCSAgICB0RXBsT2JkU2l6ZSBTaXplX3ApOworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1Q2FsUmVhZEVudHJ5KHVuc2lnbmVkIGludCB1aUluZGV4X3AsCisJCQkJCQkgICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wLAorCQkJCQkJICAgdm9pZCAqcERzdERhdGFfcCwKKwkJCQkJCSAgIHRFcGxPYmRTaXplICogcFNpemVfcCk7CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVDYWxBY2Nlc3NPZFBhcnQodEVwbE9iZFBhcnQgT2JkUGFydF9wLAorCQkJCQkJICAgICAgdEVwbE9iZERpciBEaXJlY3Rpb25fcCk7CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVDYWxEZWZpbmVWYXIodEVwbFZhclBhcmFtIE1FTSAqCisJCQkJCQkgICBwVmFyUGFyYW1fcCk7CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHZvaWQgKlBVQkxJQyBFcGxPYmR1Q2FsR2V0T2JqZWN0RGF0YVB0cih1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJICAgICB1bnNpZ25lZCBpbnQgdWlTdWJJbmRleF9wKTsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdUNhbFJlZ2lzdGVyVXNlck9kKHRFcGxPYmRFbnRyeVB0cgorCQkJCQkJCXBVc2VyT2RfcCk7CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHZvaWQgUFVCTElDIEVwbE9iZHVDYWxJbml0VmFyRW50cnkodEVwbE9iZFZhckVudHJ5IE1FTSAqCisJCQkJCQlwVmFyRW50cnlfcCwgQllURSBiVHlwZV9wLAorCQkJCQkJdEVwbE9iZFNpemUgT2JkU2l6ZV9wKTsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbE9iZFNpemUgUFVCTElDIEVwbE9iZHVDYWxHZXREYXRhU2l6ZSh1bnNpZ25lZCBpbnQgdWlJbmRleF9wLAorCQkJCQkJICAgICAgdW5zaWduZWQgaW50CisJCQkJCQkgICAgICB1aVN1YkluZGV4X3ApOworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB1bnNpZ25lZCBpbnQgUFVCTElDIEVwbE9iZHVDYWxHZXROb2RlSWQodm9pZCk7CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDIEVwbE9iZHVDYWxTZXROb2RlSWQodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCQkgICB0RXBsT2JkTm9kZUlkVHlwZQorCQkJCQkJICAgTm9kZUlkVHlwZV9wKTsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdUNhbEdldEFjY2Vzc1R5cGUodW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQKKwkJCQkJCSAgICAgICB1aVN1YkluZGV4X3AsCisJCQkJCQkgICAgICAgdEVwbE9iZEFjY2VzcyAqCisJCQkJCQkgICAgICAgcEFjY2Vzc1R5cF9wKTsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUExETExFWFBPUlQgdEVwbEtlcm5lbCBQVUJMSUMgRXBsT2JkdUNhbFJlYWRFbnRyeVRvTGUodW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQKKwkJCQkJCSAgICAgICB1aVN1YkluZGV4X3AsCisJCQkJCQkgICAgICAgdm9pZCAqcERzdERhdGFfcCwKKwkJCQkJCSAgICAgICB0RXBsT2JkU2l6ZSAqIHBTaXplX3ApOworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VQTERMTEVYUE9SVCB0RXBsS2VybmVsIFBVQkxJQyBFcGxPYmR1Q2FsV3JpdGVFbnRyeUZyb21MZSh1bnNpZ25lZCBpbnQKKwkJCQkJCQkgIHVpSW5kZXhfcCwKKwkJCQkJCQkgIHVuc2lnbmVkIGludAorCQkJCQkJCSAgdWlTdWJJbmRleF9wLAorCQkJCQkJCSAgdm9pZCAqcFNyY0RhdGFfcCwKKwkJCQkJCQkgIHRFcGxPYmRTaXplIFNpemVfcCk7CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVBMRExMRVhQT1JUIHRFcGxLZXJuZWwgUFVCTElDCitFcGxPYmR1Q2FsU2VhcmNoVmFyRW50cnkoRVBMX01DT19ERUNMX0lOU1RBTkNFX1BUUl8gdW5zaWduZWQgaW50IHVpSW5kZXhfcCwKKwkJCSB1bnNpZ25lZCBpbnQgdWlTdWJpbmRleF9wLAorCQkJIHRFcGxPYmRWYXJFbnRyeSBNRU0gKiogcHBWYXJFbnRyeV9wKTsKKworI2VuZGlmIC8vICNpZm5kZWYgX0VQTE9CRFVDQUxfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxQZG91LmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsUGRvdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZGU0ODYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsUGRvdS5oCkBAIC0wLDAgKzEsMTA4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIChjKSBTWVNURUMgZWxlY3Ryb25pYyBHbWJILCBELTA3OTczIEdyZWl6LCBBdWd1c3QtQmViZWwtU3RyLiAyOQorICAgICAgd3d3LnN5c3RlYy1lbGVjdHJvbmljLmNvbQorCisgIFByb2plY3Q6ICAgICAgb3BlblBPV0VSTElOSworCisgIERlc2NyaXB0aW9uOiAgaW5jbHVkZSBmaWxlIGZvciB1c2Vyc3BhY2UgUERPIG1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbFBkb3UuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwOC8xMS8xOSAxNzoxNDozOCAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA1LzIyIGQuay46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uLCB2ZXJzaW9uIDEuMDAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRVBMX1BET1VfSF8KKyNkZWZpbmUgX0VQTF9QRE9VX0hfCisKKyNpbmNsdWRlICIuLi9FcGxQZG8uaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordEVwbEtlcm5lbCBFcGxQZG91QWRkSW5zdGFuY2Uodm9pZCk7CisKK3RFcGxLZXJuZWwgRXBsUGRvdURlbEluc3RhbmNlKHZvaWQpOworCisjaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9VKSkgIT0gMCkKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFBkb3VDYk9iZEFjY2Vzcyh0RXBsT2JkQ2JQYXJhbSBNRU0gKiBwUGFyYW1fcCk7CisjZWxzZQorI2RlZmluZSBFcGxQZG91Q2JPYmRBY2Nlc3MJCU5VTEwKKyNlbmRpZgorCisvLyByZXR1cm5zIGVycm9yIGlmIGJQZG9JZF9wIGlzIGFscmVhZHkgdmFsaWQKKy8qCit0RXBsS2VybmVsIEVwbFBkb3VTZXRNYXBwaW5nKAorICAgIEJZVEUgYlBkb0lkX3AsIEJPT0wgZlR4UnhfcCwgQllURSBiTm9kZUlkLCBCWVRFIGJNYXBwaW5nVmVyc2lvbiwKKyAgICB0RXBsUGRvTWFwcGluZyAqIHBNYXBwaW5nX3AsIEJZVEUgYk1heEVudHJpZXNfcCk7CisKK3RFcGxLZXJuZWwgRXBsUGRvdUdldE1hcHBpbmcoCisgICAgQllURSBiUGRvSWRfcCwgQk9PTCBmVHhSeF9wLCBCWVRFICogcGJOb2RlSWQsIEJZVEUgKiBwYk1hcHBpbmdWZXJzaW9uLAorICAgIHRFcGxQZG9NYXBwaW5nICogcE1hcHBpbmdfcCwgQllURSAqIHBiTWF4RW50cmllc19wKTsKKyovCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExfUERPVV9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbFNkb0FzbmR1LmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsU2RvQXNuZHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzQ5NTlmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbFNkb0FzbmR1LmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIFNETy9Bc25kLVByb3RvY29sYWJzdHJhY3Rpb25sYXllciBtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxTZG9Bc25kdS5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDcvMDcgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIi4uL0VwbFNkby5oIgorI2luY2x1ZGUgIi4uL0VwbERsbC5oIgorCisjaWZuZGVmIF9FUExTRE9BU05EVV9IXworI2RlZmluZSBfRVBMU0RPQVNORFVfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnVuY3Rpb24gcHJvdG90eXBlcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPX0FTTkQpKSAhPSAwKQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc25kdUluaXQodEVwbFNlcXVMYXllclJlY2VpdmVDYiBmcFJlY2VpdmVDYl9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXNuZHVBZGRJbnN0YW5jZSh0RXBsU2VxdUxheWVyUmVjZWl2ZUNiIGZwUmVjZWl2ZUNiX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc25kdURlbEluc3RhbmNlKHZvaWQpOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc25kdUluaXRDb24odEVwbFNkb0NvbkhkbCAqIHBTZG9Db25IYW5kbGVfcCwKKwkJCQkgICAgIHVuc2lnbmVkIGludCB1aVRhcmdldE5vZGVJZF9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXNuZHVTZW5kRGF0YSh0RXBsU2RvQ29uSGRsIFNkb0NvbkhhbmRsZV9wLAorCQkJCSAgICAgIHRFcGxGcmFtZSAqIHBTcmNEYXRhX3AsCisJCQkJICAgICAgRFdPUkQgZHdEYXRhU2l6ZV9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXNuZHVEZWxDb24odEVwbFNkb0NvbkhkbCBTZG9Db25IYW5kbGVfcCk7CisKKyNlbmRpZiAvLyBlbmQgb2YgI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9fQVNORCkpICE9IDApCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExTRE9BU05EVV9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbFNkb0FzeVNlcXUuaCBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxTZG9Bc3lTZXF1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY1OGI1ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxTZG9Bc3lTZXF1LmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CisgICAgICB3d3cuc3lzdGVjLWVsZWN0cm9uaWMuY29tCisKKyAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCisKKyAgRGVzY3JpcHRpb246ICBpbmNsdWRlIGZpbGUgZm9yIGFzeWNocmlvbnVzIFNETyBTZXF1ZW5jZSBMYXllciBtb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxTZG9Bc3lTZXF1LmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8wNi8yNiBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiLi4vRXBsU2RvLmgiCisjaW5jbHVkZSAiRXBsU2RvVWRwdS5oIgorI2luY2x1ZGUgIkVwbFNkb0FzbmR1LmgiCisjaW5jbHVkZSAiLi4vRXBsRXZlbnQuaCIKKyNpbmNsdWRlICJFcGxUaW1lcnUuaCIKKworI2lmbmRlZiBfRVBMU0RPQVNZU0VRVV9IXworI2RlZmluZSBfRVBMU0RPQVNZU0VRVV9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXN5U2VxSW5pdCh0RXBsU2RvQ29tUmVjZWl2ZUNiIGZwU2RvQ29tQ2JfcCwKKwkJCQkgICB0RXBsU2RvQ29tQ29uQ2IgZnBTZG9Db21Db25DYl9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQXN5U2VxQWRkSW5zdGFuY2UodEVwbFNkb0NvbVJlY2VpdmVDYiBmcFNkb0NvbUNiX3AsCisJCQkJCSAgdEVwbFNkb0NvbUNvbkNiIGZwU2RvQ29tQ29uQ2JfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzeVNlcURlbEluc3RhbmNlKHZvaWQpOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc3lTZXFJbml0Q29uKHRFcGxTZG9TZXFDb25IZGwgKiBwU2RvU2VxQ29uSGRsX3AsCisJCQkJICAgICAgdW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJICAgICAgdEVwbFNkb1R5cGUgU2RvVHlwZSk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0FzeVNlcVNlbmREYXRhKHRFcGxTZG9TZXFDb25IZGwgU2RvU2VxQ29uSGRsX3AsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCB1aURhdGFTaXplX3AsCisJCQkJICAgICAgIHRFcGxGcmFtZSAqIHBEYXRhX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc3lTZXFQcm9jZXNzRXZlbnQodEVwbEV2ZW50ICogcEV2ZW50X3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Bc3lTZXFEZWxDb24odEVwbFNkb1NlcUNvbkhkbCBTZG9TZXFDb25IZGxfcCk7CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExTRE9BU1lTRVFVX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsU2RvQ29tdS5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbFNkb0NvbXUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTQ1NGM3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbFNkb0NvbXUuaApAQCAtMCwwICsxLDEyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgU0RPIENvbW1hbmQgTGF5ZXIgbW9kdWxlCisKKyAgTGljZW5zZToKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNZU1RFQyBlbGVjdHJvbmljIEdtYkggbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0BzeXN0ZWMtZWxlY3Ryb25pYy5jb20uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgICAgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgICAgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgICBTZXZlcmFiaWxpdHkgQ2xhdXNlOgorCisgICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKKyAgICAgICAgdW5lbmZvcmNlYWJsZSBpbiBhbnkganVyaXNkaWN0aW9uLCB0aGF0IHNoYWxsIG5vdCBhZmZlY3Q6CisgICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKKyAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKKyAgICAgICAgMi4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIG90aGVyIGp1cmlzZGljdGlvbnMgb2YgdGhhdCBvcgorICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsU2RvQ29tdS5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDYvMjYgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIi4uL0VwbFNkby5oIgorI2luY2x1ZGUgIi4uL0VwbE9iZC5oIgorI2luY2x1ZGUgIi4uL0VwbFNkb0FjLmgiCisjaW5jbHVkZSAiRXBsT2JkdS5oIgorI2luY2x1ZGUgIkVwbFNkb0FzeVNlcXUuaCIKKworI2lmbmRlZiBfRVBMU0RPQ09NVV9IXworI2RlZmluZSBfRVBMU0RPQ09NVV9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQ29tSW5pdCh2b2lkKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQ29tQWRkSW5zdGFuY2Uodm9pZCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0NvbURlbEluc3RhbmNlKHZvaWQpOworCisjaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1NET0MpKSAhPSAwKQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Db21EZWZpbmVDb24odEVwbFNkb0NvbUNvbkhkbCAqIHBTZG9Db21Db25IZGxfcCwKKwkJCQkgICAgIHVuc2lnbmVkIGludCB1aVRhcmdldE5vZGVJZF9wLAorCQkJCSAgICAgdEVwbFNkb1R5cGUgUHJvdFR5cGVfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb0NvbUluaXRUcmFuc2ZlckJ5SW5kZXgodEVwbFNkb0NvbVRyYW5zUGFyYW1CeUluZGV4ICoKKwkJCQkJICAgICAgIHBTZG9Db21UcmFuc1BhcmFtX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Db21VbmRlZmluZUNvbih0RXBsU2RvQ29tQ29uSGRsIFNkb0NvbUNvbkhkbF9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQ29tR2V0U3RhdGUodEVwbFNkb0NvbUNvbkhkbCBTZG9Db21Db25IZGxfcCwKKwkJCQkgICAgdEVwbFNkb0NvbUZpbmlzaGVkICogcFNkb0NvbUZpbmlzaGVkX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Db21TZG9BYm9ydCh0RXBsU2RvQ29tQ29uSGRsIFNkb0NvbUNvbkhkbF9wLAorCQkJCSAgICBEV09SRCBkd0Fib3J0Q29kZV9wKTsKKworI2VuZGlmCisKKy8vIGZvciBmdXR1cmUgZXh0ZW50aW9uCisvKgordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvQ29tSW5pdFRyYW5zZmVyQWxsQnlJbmRleCh0RXBsU2RvQ29tVHJhbnNQYXJhbUFsbEJ5SW5kZXgqIHBTZG9Db21UcmFuc1BhcmFtX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Db21Jbml0VHJhbnNmZXJCeU5hbWUodEVwbFNkb0NvbVRyYW5zUGFyYW1CeU5hbWUqIHBTZG9Db21UcmFuc1BhcmFtX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9Db21Jbml0VHJhbnNmZXJGaWxlKHRFcGxTZG9Db21UcmFuc1BhcmFtRmlsZSogcFNkb0NvbVRyYW5zUGFyYW1fcCk7CisKKyovCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExTRE9DT01VX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsU2RvVWRwdS5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbFNkb1VkcHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDc3YjZmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbFNkb1VkcHUuaApAQCAtMCwwICsxLDEwOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgU0RPL1VEUC1Qcm90b2NvbGxhYnN0cmFjdGlvbmxheWVyIG1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbFNkb1VkcHUuaCx2ICQKKworICAgICAgICAgICAgICAgICRBdXRob3I6IEQuS3J1ZWdlciAkCisKKyAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwOC8xMC8xNyAxNTozMjozMiAkCisKKyAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCisKKyAgICAgICAgICAgICAgICBCdWlsZCBFbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgUmV2aXNpb24gSGlzdG9yeToKKworICAyMDA2LzA2LzI2IGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICIuLi9FcGxTZG8uaCIKKworI2lmbmRlZiBfRVBMU0RPVURQVV9IXworI2RlZmluZSBfRVBMU0RPVURQVV9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3QgZGVmaW5lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9TRE9fVURQKSkgIT0gMCkKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvVWRwdUluaXQodEVwbFNlcXVMYXllclJlY2VpdmVDYiBmcFJlY2VpdmVDYl9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvVWRwdUFkZEluc3RhbmNlKHRFcGxTZXF1TGF5ZXJSZWNlaXZlQ2IgZnBSZWNlaXZlQ2JfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFNkb1VkcHVEZWxJbnN0YW5jZSh2b2lkKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvVWRwdUNvbmZpZyh1bnNpZ25lZCBsb25nIHVsSXBBZGRyX3AsCisJCQkJICAgdW5zaWduZWQgaW50IHVpUG9ydF9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU2RvVWRwdUluaXRDb24odEVwbFNkb0NvbkhkbCAqIHBTZG9Db25IYW5kbGVfcCwKKwkJCQkgICAgdW5zaWduZWQgaW50IHVpVGFyZ2V0Tm9kZUlkX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9VZHB1U2VuZERhdGEodEVwbFNkb0NvbkhkbCBTZG9Db25IYW5kbGVfcCwKKwkJCQkgICAgIHRFcGxGcmFtZSAqIHBTcmNEYXRhX3AsCisJCQkJICAgICBEV09SRCBkd0RhdGFTaXplX3ApOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTZG9VZHB1RGVsQ29uKHRFcGxTZG9Db25IZGwgU2RvQ29uSGFuZGxlX3ApOworCisjZW5kaWYgLy8gZW5kIG9mICNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPX1VEUCkpICE9IDApCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExTRE9VRFBVX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsU3RhdHVzdS5oIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbFN0YXR1c3UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjExOTM1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC91c2VyL0VwbFN0YXR1c3UuaApAQCAtMCwwICsxLDEwNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgU3RhdHVzdS1Nb2R1bGUKKworICBMaWNlbnNlOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICAgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CisKKyAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgorICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKKyAgICAgICAgMS4gdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IGluIHRoYXQganVyaXNkaWN0aW9uIG9mIGFueSBvdGhlcgorICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgorICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCisgICAgICAgICAgIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxTdGF0dXN1LmgsdiAkCisKKyAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAorCisgICAgICAgICAgICAgICAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDgvMDQvMTcgMjE6MzY6MzIgJAorCisgICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAorCisgICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFJldmlzaW9uIEhpc3Rvcnk6CisKKyAgMjAwNi8xMS8xNSBkLmsuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiLi4vRXBsRGxsLmgiCisKKyNpZm5kZWYgX0VQTFNUQVRVU1VfSF8KKyNkZWZpbmUgX0VQTFNUQVRVU1VfSF8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0IGRlZmluZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHRFcGxLZXJuZWwoUFVCTElDICogdEVwbFN0YXR1c3VDYlJlc3BvbnNlKSAodW5zaWduZWQgaW50IHVpTm9kZUlkX3AsCisJCQkJCQkgICAgdEVwbFN0YXR1c1Jlc3BvbnNlICoKKwkJCQkJCSAgICBwU3RhdHVzUmVzcG9uc2VfcCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdW5jdGlvbiBwcm90b3R5cGVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTdGF0dXN1SW5pdCh2b2lkKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU3RhdHVzdUFkZEluc3RhbmNlKHZvaWQpOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxTdGF0dXN1RGVsSW5zdGFuY2Uodm9pZCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFN0YXR1c3VSZXNldCh2b2lkKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsU3RhdHVzdVJlcXVlc3RTdGF0dXNSZXNwb25zZSh1bnNpZ25lZCBpbnQgdWlOb2RlSWRfcCwKKwkJCQkJCSAgdEVwbFN0YXR1c3VDYlJlc3BvbnNlCisJCQkJCQkgIHBmbkNiUmVzcG9uc2VfcCk7CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExTVEFUVVNVX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsVGltZXJ1LmggYi9kcml2ZXJzL3N0YWdpbmcvZXBsL3VzZXIvRXBsVGltZXJ1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA0NDk1NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lcGwvdXNlci9FcGxUaW1lcnUuaApAQCAtMCwwICsxLDEwNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAoYykgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCwgRC0wNzk3MyBHcmVpeiwgQXVndXN0LUJlYmVsLVN0ci4gMjkKKyAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KKworICBQcm9qZWN0OiAgICAgIG9wZW5QT1dFUkxJTksKKworICBEZXNjcmlwdGlvbjogIGluY2x1ZGUgZmlsZSBmb3IgRXBsIFVzZXJzcGFjZS1UaW1lcm1vZHVsZQorCisgIExpY2Vuc2U6CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgICAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKKworICAgICAgICBJZiBhIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgb3IgYmVjb21lcyBpbGxlZ2FsLCBpbnZhbGlkIG9yCisgICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgorICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCisgICAgICAgICAgIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2U7IG9yCisgICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKKyAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICAgICAgICAgJFJDU2ZpbGU6IEVwbFRpbWVydS5oLHYgJAorCisgICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKKworICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA4LzA0LzE3IDIxOjM2OjMyICQKKworICAgICAgICAgICAgICAgICRTdGF0ZTogRXhwICQKKworICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICAgICBHQ0MgVjMuNAorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBSZXZpc2lvbiBIaXN0b3J5OgorCisgIDIwMDYvMDcvMDYgay50LjogICBzdGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIi4uL0VwbFRpbWVyLmgiCisjaW5jbHVkZSAiRXBsRXZlbnR1LmgiCisKKyNpZm5kZWYgX0VQTFRJTUVSVV9IXworI2RlZmluZSBfRVBMVElNRVJVX0hfCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb25zdCBkZWZpbmVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdHlwZWRlZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVydUluaXQodm9pZCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVydUFkZEluc3RhbmNlKHZvaWQpOworCit0RXBsS2VybmVsIFBVQkxJQyBFcGxUaW1lcnVEZWxJbnN0YW5jZSh2b2lkKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJ1U2V0VGltZXJNcyh0RXBsVGltZXJIZGwgKiBwVGltZXJIZGxfcCwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIHVsVGltZV9wLAorCQkJCSAgICAgIHRFcGxUaW1lckFyZyBBcmd1bWVudF9wKTsKKwordEVwbEtlcm5lbCBQVUJMSUMgRXBsVGltZXJ1TW9kaWZ5VGltZXJNcyh0RXBsVGltZXJIZGwgKiBwVGltZXJIZGxfcCwKKwkJCQkJIHVuc2lnbmVkIGxvbmcgdWxUaW1lX3AsCisJCQkJCSB0RXBsVGltZXJBcmcgQXJndW1lbnRfcCk7CisKK3RFcGxLZXJuZWwgUFVCTElDIEVwbFRpbWVydURlbGV0ZVRpbWVyKHRFcGxUaW1lckhkbCAqIHBUaW1lckhkbF9wKTsKKworQk9PTCBQVUJMSUMgRXBsVGltZXJ1SXNUaW1lckFjdGl2ZSh0RXBsVGltZXJIZGwgVGltZXJIZGxfcCk7CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9FUExUSU1FUlVfSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX3R4LmMgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF90eC5jCmluZGV4IGE5NWMyNjAuLjMwZWFhYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX3R4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfdHguYwpAQCAtMTM0NSw3ICsxMzQ1LDYgQEAKIHsKIAlQTVBfVENCIHBNcFRjYjsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwRW50cnk7Ci0Jc3RydWN0IHNrX2J1ZmYgKnBQYWNrZXQgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgbG9ja2ZsYWdzOwogCXVpbnQzMl90IEZyZWVDb3VudGVyID0gMDsKIApAQCAtMTM1OCw4ICsxMzU3LDYgQEAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcEFkYXB0ZXItPlNlbmRXYWl0TG9jaywgbG9ja2ZsYWdzKTsKIAogCQlwRW50cnkgPSBwQWRhcHRlci0+VHhSaW5nLlNlbmRXYWl0UXVldWUubmV4dDsKLQotCQlwUGFja2V0ID0gTlVMTDsKIAl9CiAKIAlwQWRhcHRlci0+VHhSaW5nLm5XYWl0U2VuZCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeF9kZWJ1Zy5oIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfZGVidWcuaAppbmRleCBkYWI2MDgwLi45OTQxMDhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeF9kZWJ1Zy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X2RlYnVnLmgKQEAgLTgyLDExICs4MiwxMSBAQAogI2RlZmluZSBEQkdfTFZMCTMKICNlbmRpZiAvKiBEQkdfTFZMICovCiAKLSNkZWZpbmUgREJHX0RFRkFVTFRTCQkoREJHX0VSUk9SX09OIHwgREJHX1dBUk5JTkdfT04gfCBEQkdfQlJFQUtfT04gKQorI2RlZmluZSBEQkdfREVGQVVMVFMJCShEQkdfRVJST1JfT04gfCBEQkdfV0FSTklOR19PTiB8IERCR19CUkVBS19PTikKIAotI2RlZmluZSBEQkdfRkxBR1MoQSkJCShBKS0+ZGJnRmxhZ3MKLSNkZWZpbmUgREJHX05BTUUoQSkJCShBKS0+ZGJnTmFtZQotI2RlZmluZSBEQkdfTEVWRUwoQSkJCShBKS0+ZGJnTGV2ZWwKKyNkZWZpbmUgREJHX0ZMQUdTKEEpCQkoKEEpLT5kYmdGbGFncykKKyNkZWZpbmUgREJHX05BTUUoQSkJCSgoQSktPmRiZ05hbWUpCisjZGVmaW5lIERCR19MRVZFTChBKQkJKChBKS0+ZGJnTGV2ZWwpCiAKICNpZm5kZWYgREJHX1BSSU5UCiAjZGVmaW5lIERCR19QUklOVChTLi4uKQkJcHJpbnRrKEtFUk5fREVCVUcgUykKQEAgLTEwOCw1NiArMTA4LDExMCBAQAogI2RlZmluZSBfREJHX0xFQVZFKEEpCXByaW50ayhLRVJOX0RFQlVHICIlczolLipzOiVzXG4iLCBEQkdfTkFNRShBKSwJXAogCQkJCURCR19MRVZFTChBKS0tLCBfTEVBVkVfU1RSLCBfX2Z1bmNfXykKIAotI2RlZmluZSBEQkdfRU5URVIoQSkgICAgICAgIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX1RSQUNFX09OKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQkdfRU5URVIoQSk7fQorI2RlZmluZSBEQkdfRU5URVIoQSkJCQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJaWYgKERCR19GTEFHUyhBKSAmIERCR19UUkFDRV9PTikJCQlcCisJCQlfREJHX0VOVEVSKEEpOwkJCQkJXAorCX0gd2hpbGUgKDApCiAKLSNkZWZpbmUgREJHX0xFQVZFKEEpICAgICAgICB7aWYgKERCR19GTEFHUyhBKSAmIERCR19UUkFDRV9PTikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfREJHX0xFQVZFKEEpO30KKyNkZWZpbmUgREJHX0xFQVZFKEEpCQkJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWlmIChEQkdfRkxBR1MoQSkgJiBEQkdfVFJBQ0VfT04pCQkJXAorCQkJX0RCR19MRUFWRShBKTsJCQkJCVwKKwl9IHdoaWxlICgwKQogCi0jZGVmaW5lIERCR19QQVJBTShBLE4sRixTLi4uKSAgIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX1BBUkFNX09OKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkdfUFJJTlQoIiAgJXMgLS0gIkYiXG4iLE4sUyk7fQorI2RlZmluZSBEQkdfUEFSQU0oQSwgTiwgRiwgUy4uLikJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWlmIChEQkdfRkxBR1MoQSkgJiBEQkdfUEFSQU1fT04pCQkJXAorCQkJREJHX1BSSU5UKCIgICVzIC0tICJGIiAiLCBOLCBTKTsJCVwKKwl9IHdoaWxlICgwKQogCi0jZGVmaW5lIERCR19FUlJPUihBLFMuLi4pCVwKLQlpZiAoREJHX0ZMQUdTKEEpICYgREJHX0VSUk9SX09OKSB7CQkJCVwKLQkJREJHX1BSSU5UKCIlczpFUlJPUjolcyAiLERCR19OQU1FKEEpLCBfX2Z1bmNfXyk7CVwKLQkJREJHX1BSSU5UQyhTKTsJCQkJCQlcCi0JCURCR19UUkFQOwkJCQkJCVwKLQl9CisjZGVmaW5lIERCR19FUlJPUihBLCBTLi4uKQkJCQkJCSBcCisJZG8gewkJCQkJCQkJIFwKKwkJaWYgKERCR19GTEFHUyhBKSAmIERCR19FUlJPUl9PTikgewkJCSBcCisJCQlEQkdfUFJJTlQoIiVzOkVSUk9SOiVzICIsIERCR19OQU1FKEEpLCBfX2Z1bmNfXyk7XAorCQkJREJHX1BSSU5UQyhTKTsJCQkJCSBcCisJCQlEQkdfVFJBUDsJCQkJCSBcCisJCX0JCQkJCQkJIFwKKwl9IHdoaWxlICgwKQogCi0jZGVmaW5lIERCR19XQVJOSU5HKEEsUy4uLikge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfV0FSTklOR19PTikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7REJHX1BSSU5UKCIlczpXQVJOSU5HOiVzICIsREJHX05BTUUoQSksX19mdW5jX18pO0RCR19QUklOVEMoUyk7fX0KKyNkZWZpbmUgREJHX1dBUk5JTkcoQSwgUy4uLikJCQkJCQkgICAgXAorCWRvIHsJCQkJCQkJCSAgICBcCisJCWlmIChEQkdfRkxBR1MoQSkgJiBEQkdfV0FSTklOR19PTikgewkJCSAgICBcCisJCQlEQkdfUFJJTlQoIiVzOldBUk5JTkc6JXMgIiwgREJHX05BTUUoQSksIF9fZnVuY19fKTsgXAorCQkJREJHX1BSSU5UQyhTKTsJCQkJCSAgICBcCisJCX0JCQkJCQkJICAgIFwKKwl9IHdoaWxlICgwKQogCi0jZGVmaW5lIERCR19OT1RJQ0UoQSxTLi4uKSAge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfTk9USUNFX09OKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtEQkdfUFJJTlQoIiVzOk5PVElDRTolcyAiLERCR19OQU1FKEEpLF9fZnVuY19fKTtEQkdfUFJJTlRDKFMpO319CisjZGVmaW5lIERCR19OT1RJQ0UoQSwgUy4uLikJCQkJCQkgICBcCisJZG8gewkJCQkJCQkJICAgXAorCQlpZiAoREJHX0ZMQUdTKEEpICYgREJHX05PVElDRV9PTikgewkJCSAgIFwKKwkJCURCR19QUklOVCgiJXM6Tk9USUNFOiVzICIsIERCR19OQU1FKEEpLCBfX2Z1bmNfXyk7IFwKKwkJCURCR19QUklOVEMoUyk7CQkJCQkgICBcCisJCX0JCQkJCQkJICAgXAorCX0gd2hpbGUgKDApCiAKLSNkZWZpbmUgREJHX1RSQUNFKEEsUy4uLikgICB7aWYgKERCR19GTEFHUyhBKSAmIERCR19UUkFDRV9PTikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7REJHX1BSSU5UKCIlczpUUkFDRTolcyAiLERCR19OQU1FKEEpLCBfX2Z1bmNfXyk7REJHX1BSSU5UQyhTKTt9fQorI2RlZmluZSBEQkdfVFJBQ0UoQSwgUy4uLikJCQkJCQkgIFwKKwlkbyB7CQkJCQkJCQkgIFwKKwkJaWYgKERCR19GTEFHUyhBKSAmIERCR19UUkFDRV9PTikgewkJCSAgXAorCQkJREJHX1BSSU5UKCIlczpUUkFDRTolcyAiLCBEQkdfTkFNRShBKSwgX19mdW5jX18pOyBcCisJCQlEQkdfUFJJTlRDKFMpOwkJCQkJICBcCisJCX0JCQkJCQkJICBcCisJfSB3aGlsZSAoMCkKIAotI2RlZmluZSBEQkdfVkVSQk9TRShBLFMuLi4pIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX1ZFUkJPU0VfT04pIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0RCR19QUklOVCgiJXM6VkVSQk9TRTolcyAiLERCR19OQU1FKEEpLCBfX2Z1bmNfXyk7REJHX1BSSU5UQyhTKTt9fQorI2RlZmluZSBEQkdfVkVSQk9TRShBLCBTLi4uKQkJCQkJCSAgICBcCisJZG8gewkJCQkJCQkJICAgIFwKKwkJaWYgKERCR19GTEFHUyhBKSAmIERCR19WRVJCT1NFX09OKSB7CQkJICAgIFwKKwkJCURCR19QUklOVCgiJXM6VkVSQk9TRTolcyAiLCBEQkdfTkFNRShBKSwgX19mdW5jX18pOyBcCisJCQlEQkdfUFJJTlRDKFMpOwkJCQkJICAgIFwKKwkJfQkJCQkJCQkgICAgXAorCX0gd2hpbGUgKDApCiAKLSNkZWZpbmUgREJHX1JYKEEsUy4uLikgICAgICB7aWYgKERCR19GTEFHUyhBKSAmIERCR19SWF9PTikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7REJHX1BSSU5UKFMpO319CisjZGVmaW5lIERCR19SWChBLCBTLi4uKQkJCQlcCisJZG8gewkJCQkJXAorCQlpZiAoREJHX0ZMQUdTKEEpICYgREJHX1JYX09OKQlcCisJCQlEQkdfUFJJTlQoUyk7CQlcCisJfSB3aGlsZSAoMCkKIAotI2RlZmluZSBEQkdfUlhfRU5URVIoQSkgICAgIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX1JYX09OKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQkdfRU5URVIoQSk7fQorI2RlZmluZSBEQkdfUlhfRU5URVIoQSkJCQkJXAorCWRvIHsJCQkJCVwKKwkJaWYgKERCR19GTEFHUyhBKSAmIERCR19SWF9PTikJXAorCQkJX0RCR19FTlRFUihBKTsJCVwKKwl9IHdoaWxlICgwKQogCi0jZGVmaW5lIERCR19SWF9MRUFWRShBKSAgICAge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfUlhfT04pIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCR19MRUFWRShBKTt9CisjZGVmaW5lIERCR19SWF9MRUFWRShBKQkJCQlcCisJZG8gewkJCQkJXAorCQlpZiAoREJHX0ZMQUdTKEEpICYgREJHX1JYX09OKQlcCisJCQlfREJHX0xFQVZFKEEpOwkJXAorCX0gd2hpbGUgKDApCiAKLSNkZWZpbmUgREJHX1RYKEEsUy4uLikgICAgICB7aWYgKERCR19GTEFHUyhBKSAmIERCR19UWF9PTikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7REJHX1BSSU5UKFMpO319CisjZGVmaW5lIERCR19UWChBLCBTLi4uKQkJCQlcCisJZG8gewkJCQkJXAorCQlpZiAoREJHX0ZMQUdTKEEpICYgREJHX1RYX09OKQlcCisJCQlEQkdfUFJJTlQoUyk7CQlcCisJfSB3aGlsZSAoMCkKIAotI2RlZmluZSBEQkdfVFhfRU5URVIoQSkgICAgIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX1RYX09OKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EQkdfRU5URVIoQSk7fQorI2RlZmluZSBEQkdfVFhfRU5URVIoQSkJCQkJXAorCWRvIHsJCQkJCVwKKwkJaWYgKERCR19GTEFHUyhBKSAmIERCR19UWF9PTikJXAorCQkJX0RCR19FTlRFUihBKTsJCVwKKwl9IHdoaWxlICgwKQogCi0jZGVmaW5lIERCR19UWF9MRUFWRShBKSAgICAge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfVFhfT04pIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RCR19MRUFWRShBKTt9CisjZGVmaW5lIERCR19UWF9MRUFWRShBKQkJCQlcCisJZG8gewkJCQkJXAorCQlpZiAoREJHX0ZMQUdTKEEpICYgREJHX1RYX09OKQlcCisJCQlfREJHX0xFQVZFKEEpOwkJXAorCX0gd2hpbGUgKDApCiAKLSNkZWZpbmUgREJHX0FTU0VSVChDKSAgICAgICB7aWYgKCEoQykpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0RCR19QUklOVCgiQVNTRVJUKCVzKSAtLSAlcyMlZCAoJXMpXG4iLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjQyxfX0ZJTEVfXyxfX0xJTkVfXyxfX2Z1bmNfXyk7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJHX1RSQVA7fX0KKyNkZWZpbmUgREJHX0FTU0VSVChDKQkJCQkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJaWYgKCEoQykpIHsJCQkJCVwKKwkJCURCR19QUklOVCgiQVNTRVJUKCVzKSAtLSAlcyMlZCAoJXMpICIsICBcCisJCQkgICAgICNDLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsgXAorCQkJREJHX1RSQVA7CQkJCVwKKwkJfQkJCQkJCVwKKwl9IHdoaWxlICgwKQorCiAjZGVmaW5lIFNUQVRJQwogCiB0eXBlZGVmIHN0cnVjdCB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMjE4NTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvS2NvbmZpZwpAQCAtMCwwICsxLDYgQEAKK2NvbmZpZyBUUkFOWlBPUlQKKwl0cmlzdGF0ZSAiRnJvbnRpZXIgVHJhbnpwb3J0IGFuZCBBbHBoYXRyYWNrIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBVU0IKKwlkZWZhdWx0IE4KKwktLS1oZWxwLS0tCisJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIEZyb250aWVyIFRyYW56cG9ydCBhbmQgQWxwaGF0cmFjayBkZXZpY2VzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMmFjOTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvTWFrZWZpbGUKQEAgLTAsMCArMSwyIEBACitvYmotJChDT05GSUdfVFJBTlpQT1JUKQkJKz0gdHJhbnpwb3J0Lm8KK29iai0kKENPTkZJR19UUkFOWlBPUlQpCQkrPSBhbHBoYXRyYWNrLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9SRUFETUUgYi9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YzllZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvUkVBRE1FCkBAIC0wLDAgKzEsMjggQEAKK1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSBVU0IgVHJhbnpwb3J0IGFuZCBBbHBoYXRyYWNrIEtlcm5lbCBkcml2ZXJzIGZvciBMaW51eC4KKworQXQgcHJlc2VudCB0aGUgdHJhbnpwb3J0IGRvZXMgcmVhZHMvd3JpdGVzIG9mIDggYnl0ZSBjbWRzIHRvIC9kZXYvdHJhbnpwb3J0MCB0byBjb250cm9sCit0aGUgbGlnaHRzIGFuZCBzY3JlZW4gYW5kIHdoZWVsCisKK0F0IHByZXNlbnQgdGhlIGFscGhhdHJhY2sgYWNjZXB0cyByZWFkcy93cml0ZXMgb2YgMTIgYnl0ZSBjbWRzIHRvIC9kZXYvdHJhbnpwb3J0MCB0byBjb250cm9sCit0aGUgbGlnaHRzIGFuZCBzY3JlZW4gYW5kIGZhZGVyLgorCitCb3RoIGRyaXZlcnMgYWxzbyBoYXZlIHNvbWUgc3lzZnMgaG9va3MgdGhhdCBhcmUgbm9uLWZ1bmN0aW9uYWwgYXQgdGhlIG1vbWVudC4KKworVGhlIEFQSSBpcyBjdXJyZW50bHkgY2xvc2VseSB0aWVkIHRvIHRoZSBhcmRvdXIgcmV2aXNpb24gYW5kIFdJTEwgY2hhbmdlLgorCitBIHN5c2ZzIGludGVyZmFjZSBpcyBQRVJGRUNUIGZvciBzaW1wbGUgdXNlcnNwYWNlIGFwcHMgdG8gZG8gZnVuIHRoaW5ncyB3aXRoIHRoZQorbGlnaHRzIGFuZCBzY3JlZW4uIEl0J3MgZmFpcmx5IGxvdXN5IGZvciBoYW5kbGluZyBpbnB1dCBldmVudHMgYW5kIHZlcnkgbG91c3kKK2ZvciB3YXRjaGluZyB0aGUgc3RhdGUgb2YgdGhlIHNodXR0bGUgd2hlZWwuCisKK0EgbGludXggaW5wdXQgZXZlbnRzIGludGVyZmFjZSBpcyBncmVhdCBmb3IgdGhlIGlucHV0IGV2ZW50cyBhbmQgc2h1dHRsZSB3aGVlbC4gSXQncwordGhlb3JldGljYWxseSBPSyBvbiBMRURzLiBBIEZhZGVyIGNhbiBiZSBtYXBwZWQgdG8gYW4gYWJzb2x1dGUgbW91c2UgZGV2aWNlLgorQnV0IHRoZXJlIGlzIG5vIExDRCBzdXBwb3J0IGF0IGFsbC4KKworSW4gdGhlIGVuZCB0aGlzIGlzIGdvaW5nIHRvIGJlIGRyaXZlbiBieSBhIG1pZGkgbGF5ZXIsIHdoaWNoIGhhbmRsZXMgYWxsIHRob3NlCitjYXNlcyB2aWEgYSBkZWZpbmVkIEFQSSwgYnV0IC0gYW1vbmcgb3RoZXIgdGhpbmdzIC0gaXMgc2xvdywgZG9lc24ndCBkbworZmxvdyBjb250cm9sLCBhbmQgaXMgYSBMT1Qgb2YgZXh0cmEgd29yay4gRnJhbmtseSwgSSdkIGxpa2UgdG8ga2VlcCB0aGUKK2NvcmUgZHJpdmVyIHNpbXBsZSBiZWNhdXNlIHRoZSBvbmx5IHJlYWx0aW1lIHdvcmsgcmVhbGx5IHJlcXVpcmVkIGlzCit0aGUgYm90dG9tIGhhbGYgaW50ZXJydXB0IGhhbmRsZXIgYW5kIHRoZSBvdXRwdXQgb3ZlcmxhcHBpbmcuCisKK0V4cG9zaW5nIHNvbWUgc29ydCBvZiBjbGVhbiBhaW8gYXBpIHRvIHVzZXJzcGFjZSB3b3VsZCBiZSBwZXJmZWN0LiBXaGF0IHRoYXQKK0FQSSBsb29rcyBsaWtlPyBHYWguIGJlYXRzIG1lLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjIwYWQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL1RPRE8KQEAgLTAsMCArMSw5IEBACitUT0RPOgorCS0gY2hlY2twYXRjaC5wbCBjbGVhbgorCS0gc3BhcnNlIGNsZWFuCisJLSBmaXggdXNlcnNwYWNlIGludGVyZmFjZSB0byBiZSBzYW5lCisJLSBwb3NzaWJseSBqdXN0IHBvcnQgdG8gdXNlcnNwYWNlIHdpdGggbGlidXNiCisJLSByZXZpZXcgYnkgdGhlIFVTQiBkZXZlbG9wZXIgY29tbXVuaXR5CisKK1BsZWFzZSBzZW5kIGFueSBwYXRjaGVzIGZvciB0aGlzIGRyaXZlciB0byBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgorYW5kIERhdmlkIFRhaHQgPGRAdGVrbGlicmUuY29tPi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9hbHBoYXRyYWNrLmMgYi9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvYWxwaGF0cmFjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMzZlM2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvYWxwaGF0cmFjay5jCkBAIC0wLDAgKzEsODUzIEBACisvKgorICogRnJvbnRpZXIgRGVzaWducyBBbHBoYXRyYWNrIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNaWNoYWVsIFRhaHQgKG1AdGFodC5uZXQpCisgKgorICogQmFzZWQgb24gdGhlIHVzYmxlZCBkcml2ZXIgYW5kIGxkdXNiIGRyaXZlcnMgYnkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgR3JlZyBLcm9haC1IYXJ0bWFuIChncmVnQGtyb2FoLmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwNSBNaWNoYWVsIEh1bmQgPG1odW5kQGxkLWRpZGFjdGljLmRlPgorICoKKyAqIFRoZSBsZHVzYiBkcml2ZXIgd2FzLCBpbiB0dXJuLCBkZXJpdmVkIGZyb20gTGVnbyBVU0IgVG93ZXIgZHJpdmVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgRGF2aWQgR2xhbmNlIDxhZHZpZGdzZkBzb3VyY2Vmb3JnZS5uZXQ+CisgKgkJIDIwMDEtMjAwNCBKdWVyZ2VuIFN0dWJlciA8c3RhcmJsdWVAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKglwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorICoKKyAqLworCisvKioKKyAqIFRoaXMgZHJpdmVyIHVzZXMgYSByaW5nIGJ1ZmZlciBmb3IgdGltZSBjcml0aWNhbCByZWFkaW5nIG9mCisgKiBpbnRlcnJ1cHQgaW4gcmVwb3J0cyBhbmQgcHJvdmlkZXMgcmVhZCBhbmQgd3JpdGUgbWV0aG9kcyBmb3IKKyAqIHJhdyBpbnRlcnJ1cHQgcmVwb3J0cy4KKyAqLworCisvKiBOb3RlOiB0aGlzIGN1cnJlbnRseSB1c2VzIGEgZHVtYiByaW5nYnVmZmVyIGZvciByZWFkcyBhbmQgd3JpdGVzLgorICogQSBtb3JlIG9wdGltYWwgZHJpdmVyIHdvdWxkIGNhY2hlIGFuZCBraWxsIG9mZiBvdXRzdGFuZGluZyB1cmJzIHRoYXQgYXJlCisgKiBub3cgaW52YWxpZCwgYW5kIGlnbm9yZSBvbmVzIHRoYXQgYWxyZWFkeSB3ZXJlIGluIHRoZSBxdWV1ZSBidXQgdmFsaWQKKyAqIGFzIHdlIG9ubHkgaGF2ZSAzMCBjb21tYW5kcyBmb3IgdGhlIGFscGhhdHJhY2suIEluIHBhcnRpY3VsYXIgdGhpcyBpcworICoga2V5IGZvciBnZXR0aW5nIGxpZ2h0cyB0byBmbGFzaCBpbiB0aW1lIGFzIG90aGVyd2lzZSBtYW55IGNvbW1hbmRzCisgKiBjYW4gYmUgYnVmZmVyZWQgdXAgYmVmb3JlIHRoZSBsaWdodCBjaGFuZ2UgbWFrZXMgaXQgdG8gdGhlIGludGVyZmFjZS4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKworI2luY2x1ZGUgInN1cmZhY2Vfc3lzZnMuaCIKKworLyogbWFrZSB0aGlzIHdvcmsgb24gb2xkZXIga2VybmVsIHZlcnNpb25zICovCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLCA2LCAxOSkKKyNpbmNsdWRlICJmcm9udGllcl9jb21wYXQuaCIKKyNlbmRpZiAvKiBvbGRlciBrZXJuZWwgdmVyc2lvbnMgKi8KKworI2luY2x1ZGUgImFscGhhdHJhY2suaCIKKworI2RlZmluZSBWRU5ET1JfSUQJMHgxNjViCisjZGVmaW5lIFBST0RVQ1RfSUQJMHhmYWQxCisKKyNpZmRlZiBDT05GSUdfVVNCX0RZTkFNSUNfTUlOT1JTCisjZGVmaW5lIFVTQl9BTFBIQVRSQUNLX01JTk9SX0JBU0UJMAorI2Vsc2UKKy8vIEZJWE1FIDE3NiAtIGlzIGFub3RoZXIgZHJpdmVyJ3MgbWlub3IgLSBhcHBseSBmb3IgdGhhdAorLy8gI2RlZmluZSBVU0JfQUxQSEFUUkFDS19NSU5PUl9CQVNFCTE3NworI2RlZmluZSBVU0JfQUxQSEFUUkFDS19NSU5PUl9CQVNFCTE3NgorI2VuZGlmCisKKy8qIHRhYmxlIG9mIGRldmljZXMgdGhhdCB3b3JrIHdpdGggdGhpcyBkcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCB1c2JfYWxwaGF0cmFja190YWJsZSBbXSA9IHsKKwl7IFVTQl9ERVZJQ0UoVkVORE9SX0lELCBQUk9EVUNUX0lEKSB9LAorCXsgfQkJCQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCB1c2JfYWxwaGF0cmFja190YWJsZSk7CitNT0RVTEVfVkVSU0lPTigiMC40MCIpOworTU9EVUxFX0FVVEhPUigiTWlrZSBUYWh0IDxtQHRhaHQubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbHBoYXRyYWNrIFVTQiBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJGcm9udGllciBEZXNpZ25zIEFscGhhdHJhY2sgQ29udHJvbCBTdXJmYWNlIik7CisKKy8qIFRoZXNlIGFyZW4ndCBkb25lIHlldCAqLworCisjZGVmaW5lIFNVUFBSRVNTX0VYVFJBX09OTElORV9FVkVOVFMgMAorI2RlZmluZSBCVUZGRVJFRF9XUklURVMgMAorI2RlZmluZSBTVVBQUkVTU19FWFRSQV9PRkZMSU5FX0VWRU5UUyAwCisjZGVmaW5lIENPTVBSRVNTX0ZBREVSX0VWRU5UUyAwCisKKyNkZWZpbmUgQlVGRkVSRURfUkVBRFMgMQorI2RlZmluZSBSSU5HX0JVRkZFUl9TSVpFIDUxMgorI2RlZmluZSBXUklURV9CVUZGRVJfU0laRSAzNAorI2RlZmluZSBBTFBIQVRSQUNLX1VTQl9USU1FT1VUIDEwCisjZGVmaW5lIE9VVFBVVF9DTURfU0laRSA4CisjZGVmaW5lIElOUFVUX0NNRF9TSVpFIDEyCisKKworc3RhdGljIGludCBkZWJ1ZyA9IDA7CisKKy8qIFVzZSBvdXIgb3duIGRiZyBtYWNybyAqLworI2RlZmluZSBkYmdfaW5mbyhkZXYsIGZvcm1hdCwgYXJnLi4uKSBkbyB7IGlmIChkZWJ1ZykgZGV2X2luZm8oZGV2ICwgZm9ybWF0ICwgIyMgYXJnKTsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBhbHBoYXRyYWNrX29jbWRfaW5mbyhkZXYsIGNtZCwgZm9ybWF0LCBhcmcuLi4pCisKKyNkZWZpbmUgYWxwaGF0cmFja19pY21kX2luZm8oZGV2LCBjbWQsIGZvcm1hdCwgYXJnLi4uKQorCisKKy8qIE1vZHVsZSBwYXJhbWV0ZXJzICovCisKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgZW5hYmxlZCBvciBub3QiKTsKKworLyogQWxsIGludGVycnVwdCBpbiB0cmFuc2ZlcnMgYXJlIGNvbGxlY3RlZCBpbiBhIHJpbmcgYnVmZmVyIHRvCisgKiBhdm9pZCByYWNpbmcgY29uZGl0aW9ucyBhbmQgZ2V0IGJldHRlciBwZXJmb3JtYW5jZSBvZiB0aGUgZHJpdmVyLgorICovCisKK3N0YXRpYyBpbnQgcmluZ19idWZmZXJfc2l6ZSA9IFJJTkdfQlVGRkVSX1NJWkU7CisKK21vZHVsZV9wYXJhbShyaW5nX2J1ZmZlcl9zaXplLCBpbnQsICBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MocmluZ19idWZmZXJfc2l6ZSwgIlJlYWQgcmluZyBidWZmZXIgc2l6ZSIpOworCisvKiBUaGUgd3JpdGVfYnVmZmVyIGNhbiBvbmUgZGF5IGNvbnRhaW4gbW9yZSB0aGFuIG9uZSBpbnRlcnJ1cHQgb3V0IHRyYW5zZmVyLgorICovCisKK3N0YXRpYyBpbnQgd3JpdGVfYnVmZmVyX3NpemUgPSBXUklURV9CVUZGRVJfU0laRTsKK21vZHVsZV9wYXJhbSh3cml0ZV9idWZmZXJfc2l6ZSwgaW50LCAgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKHdyaXRlX2J1ZmZlcl9zaXplLCAiV3JpdGUgYnVmZmVyIHNpemUiKTsKKworLyoKKyAqIEluY3JlYXNlIHRoZSBpbnRlcnZhbCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorICogb3Igc2V0IHRvIDEgdG8gdXNlIHRoZSBzdGFuZGFyZCBpbnRlcnZhbCBmcm9tIHRoZSBlbmRwb2ludCBkZXNjcmlwdG9ycy4KKyAqLworCitzdGF0aWMgaW50IG1pbl9pbnRlcnJ1cHRfaW5faW50ZXJ2YWwgPSBBTFBIQVRSQUNLX1VTQl9USU1FT1VUOworbW9kdWxlX3BhcmFtKG1pbl9pbnRlcnJ1cHRfaW5faW50ZXJ2YWwsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1pbl9pbnRlcnJ1cHRfaW5faW50ZXJ2YWwsICJNaW5pbXVtIGludGVycnVwdCBpbiBpbnRlcnZhbCBpbiBtcyIpOworCitzdGF0aWMgaW50IG1pbl9pbnRlcnJ1cHRfb3V0X2ludGVydmFsID0gQUxQSEFUUkFDS19VU0JfVElNRU9VVDsKK21vZHVsZV9wYXJhbShtaW5faW50ZXJydXB0X291dF9pbnRlcnZhbCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWluX2ludGVycnVwdF9vdXRfaW50ZXJ2YWwsICJNaW5pbXVtIGludGVycnVwdCBvdXQgaW50ZXJ2YWwgaW4gbXMiKTsKKworCisKKy8qIFN0cnVjdHVyZSB0byBob2xkIGFsbCBvZiBvdXIgZGV2aWNlIHNwZWNpZmljIHN0dWZmICovCisKK3N0cnVjdCB1c2JfYWxwaGF0cmFjayB7CisJc3RydWN0IHNlbWFwaG9yZQlzZW07CQkvKiBsb2NrcyB0aGlzIHN0cnVjdHVyZSAqLworCXN0cnVjdCB1c2JfaW50ZXJmYWNlKglpbnRmOwkJLyogc2F2ZSBvZmYgdGhlIHVzYiBpbnRlcmZhY2UgcG9pbnRlciAqLworCWludAkJCW9wZW5fY291bnQ7CS8qIG51bWJlciBvZiB0aW1lcyB0aGlzIHBvcnQgaGFzIGJlZW4gb3BlbmVkICovCisKKwlzdHJ1Y3QgYWxwaGF0cmFja19pY21kCSgqcmluZ19idWZmZXIpW1JJTkdfQlVGRkVSX1NJWkVdOyAvKiBqdXN0IG1ha2UgYyBoYXBweSAqLworCXN0cnVjdCBhbHBoYXRyYWNrX29jbWQJKCp3cml0ZV9idWZmZXIpW1dSSVRFX0JVRkZFUl9TSVpFXTsgLyoganVzdCBtYWtlIGMgaGFwcHkgKi8KKwl1bnNpZ25lZCBpbnQJCXJpbmdfaGVhZDsKKwl1bnNpZ25lZCBpbnQJCXJpbmdfdGFpbDsKKworCXdhaXRfcXVldWVfaGVhZF90CXJlYWRfd2FpdDsKKwl3YWl0X3F1ZXVlX2hlYWRfdAl3cml0ZV93YWl0OworCisJdW5zaWduZWQgY2hhcioJCWludGVycnVwdF9pbl9idWZmZXI7CisJdW5zaWduZWQgY2hhcioJCW9sZGlfYnVmZmVyOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciogaW50ZXJydXB0X2luX2VuZHBvaW50OworCXN0cnVjdCB1cmIqCQlpbnRlcnJ1cHRfaW5fdXJiOworCWludAkJCWludGVycnVwdF9pbl9pbnRlcnZhbDsKKwlzaXplX3QJCQlpbnRlcnJ1cHRfaW5fZW5kcG9pbnRfc2l6ZTsKKwlpbnQJCQlpbnRlcnJ1cHRfaW5fcnVubmluZzsKKwlpbnQJCQlpbnRlcnJ1cHRfaW5fZG9uZTsKKworCWNoYXIqCQkJaW50ZXJydXB0X291dF9idWZmZXI7CisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yKiBpbnRlcnJ1cHRfb3V0X2VuZHBvaW50OworCXN0cnVjdCB1cmIqCQlpbnRlcnJ1cHRfb3V0X3VyYjsKKwlpbnQJCQlpbnRlcnJ1cHRfb3V0X2ludGVydmFsOworCXNpemVfdAkJCWludGVycnVwdF9vdXRfZW5kcG9pbnRfc2l6ZTsKKwlpbnQJCQlpbnRlcnJ1cHRfb3V0X2J1c3k7CisKKwlhdG9taWNfdCB3cml0ZXNfcGVuZGluZzsKKwlpbnQgZXZlbnQ7IC8qIGFsdGVybmF0ZSBpbnRlcmZhY2UgdG8gZXZlbnRzICovCisJaW50IGZhZGVyOyAvKiAxMCBiaXRzICovCisJaW50IGxpZ2h0czsgLyogMjMgYml0cyAqLworCXVuc2lnbmVkIGNoYXIgZHVtcF9zdGF0ZTsgLyogMCBpZiBkaXNhYmxlZCAxIGlmIGVuYWJsZWQgKi8KKwl1bnNpZ25lZCBjaGFyIGVuYWJsZTsgLyogMCBpZiBkaXNhYmxlZCAxIGlmIGVuYWJsZWQgKi8KKwl1bnNpZ25lZCBjaGFyIG9mZmxpbmU7IC8qIGlmIHRoZSBkZXZpY2UgaXMgb3V0IG9mIHJhbmdlIG9yIGFzbGVlcCAqLworCXVuc2lnbmVkIGNoYXIgdmVyYm9zZTsgLyogYmUgdmVyYm9zZSBpbiBlcnJvciByZXBvcnRpbmcgKi8KKwl1bnNpZ25lZCBjaGFyICBsYXN0X2NtZFtPVVRQVVRfQ01EX1NJWkVdOworCXVuc2lnbmVkIGNoYXIgIHNjcmVlblszMl07Cit9OworCisvKiBwcmV2ZW50IHJhY2VzIGJldHdlZW4gb3BlbigpIGFuZCBkaXNjb25uZWN0KCkgKi8KK3N0YXRpYyBERUZJTkVfTVVURVgoZGlzY29ubmVjdF9tdXRleCk7CisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb24gKi8KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHVzYl9hbHBoYXRyYWNrX2RyaXZlcjsKKworLyoqCisgKgl1c2JfYWxwaGF0cmFja19hYm9ydF90cmFuc2ZlcnMKKyAqICAgICAgYWJvcnRzIHRyYW5zZmVycyBhbmQgZnJlZXMgYXNzb2NpYXRlZCBkYXRhIHN0cnVjdHVyZXMKKyAqLworc3RhdGljIHZvaWQgdXNiX2FscGhhdHJhY2tfYWJvcnRfdHJhbnNmZXJzKHN0cnVjdCB1c2JfYWxwaGF0cmFjayAqZGV2KQoreworCS8qIHNodXRkb3duIHRyYW5zZmVyICovCisJaWYgKGRldi0+aW50ZXJydXB0X2luX3J1bm5pbmcpIHsKKwkJZGV2LT5pbnRlcnJ1cHRfaW5fcnVubmluZyA9IDA7CisJCWlmIChkZXYtPmludGYpCisJCQl1c2Jfa2lsbF91cmIoZGV2LT5pbnRlcnJ1cHRfaW5fdXJiKTsKKwl9CisJaWYgKGRldi0+aW50ZXJydXB0X291dF9idXN5KQorCQlpZiAoZGV2LT5pbnRmKQorCQkJdXNiX2tpbGxfdXJiKGRldi0+aW50ZXJydXB0X291dF91cmIpOworfQorCisvKioKKyAqCXVzYl9hbHBoYXRyYWNrX2RlbGV0ZQorICovCitzdGF0aWMgdm9pZCB1c2JfYWxwaGF0cmFja19kZWxldGUoc3RydWN0IHVzYl9hbHBoYXRyYWNrICpkZXYpCit7CisJdXNiX2FscGhhdHJhY2tfYWJvcnRfdHJhbnNmZXJzKGRldik7CisJdXNiX2ZyZWVfdXJiKGRldi0+aW50ZXJydXB0X2luX3VyYik7CisJdXNiX2ZyZWVfdXJiKGRldi0+aW50ZXJydXB0X291dF91cmIpOworCWtmcmVlKGRldi0+cmluZ19idWZmZXIpOworCWtmcmVlKGRldi0+aW50ZXJydXB0X2luX2J1ZmZlcik7CisJa2ZyZWUoZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlcik7CisJa2ZyZWUoZGV2KTsgLy8gZml4bWUgb2xkaV9idWZmZXIKK30KKworLyoqCisgKgl1c2JfYWxwaGF0cmFja19pbnRlcnJ1cHRfaW5fY2FsbGJhY2sKKyAqLworCitzdGF0aWMgdm9pZCB1c2JfYWxwaGF0cmFja19pbnRlcnJ1cHRfaW5fY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCB1c2JfYWxwaGF0cmFjayAqZGV2ID0gdXJiLT5jb250ZXh0OworCXVuc2lnbmVkIGludCBuZXh0X3JpbmdfaGVhZDsKKwlpbnQgcmV0dmFsID0gLTE7CisKKwlpZiAodXJiLT5zdGF0dXMpIHsKKwkJaWYgKHVyYi0+c3RhdHVzID09IC1FTk9FTlQgfHwKKwkJICAgIHVyYi0+c3RhdHVzID09IC1FQ09OTlJFU0VUIHx8CisJCSAgICB1cmItPnN0YXR1cyA9PSAtRVNIVVRET1dOKSB7CisJCQlnb3RvIGV4aXQ7CisJCX0gZWxzZSB7CisJCQlkYmdfaW5mbygmZGV2LT5pbnRmLT5kZXYsICIlczogbm9uemVybyBzdGF0dXMgcmVjZWl2ZWQ6ICVkXG4iLAorCQkJCSBfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOworCQkJZ290byByZXN1Ym1pdDsgLyogbWF5YmUgd2UgY2FuIHJlY292ZXIgKi8KKwkJfQorCX0KKworCWlmICh1cmItPmFjdHVhbF9sZW5ndGggIT0gSU5QVVRfQ01EX1NJWkUpIHsKKwkJZGV2X3dhcm4oJmRldi0+aW50Zi0+ZGV2LAorCQkJICJVcmIgbGVuZ3RoIHdhcyAlZCBieXRlcyEhIERvIHNvbWV0aGluZyBpbnRlbGxpZ2VudCBcbiIsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJfSBlbHNlIHsKKwkJIGFscGhhdHJhY2tfb2NtZF9pbmZvKCZkZXYtPmludGYtPmRldiwmKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kLCIlcyIsICJibGEiKTsKKwkJIGlmKG1lbWNtcChkZXYtPmludGVycnVwdF9pbl9idWZmZXIsZGV2LT5vbGRpX2J1ZmZlcixJTlBVVF9DTURfU0laRSk9PTApIHsKKwkJCQkJCWdvdG8gcmVzdWJtaXQ7CisJCX0KKwkJbWVtY3B5KGRldi0+b2xkaV9idWZmZXIsZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyLElOUFVUX0NNRF9TSVpFKTsKKworI2lmIFNVUFBSRVNTX0VYVFJBX09GRkxJTkVfRVZFTlRTCisJaWYoZGV2LT5vZmZsaW5lID09IDIgJiYgZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyWzFdID09IDB4ZmYpIHsgZ290byByZXN1Ym1pdDsgfQorCQlpZihkZXYtPm9mZmxpbmUgPT0gMSAmJiBkZXYtPmludGVycnVwdF9pbl9idWZmZXJbMV0gPT0gMHhmZikgeyBkZXYtPm9mZmxpbmUgPSAyOyBnb3RvIHJlc3VibWl0OyB9CisvKiBBbHdheXMgcGFzcyBvbmUgb2ZmbGluZSBldmVudCB1cCB0aGUgc3RhY2sgKi8KKwkJaWYoZGV2LT5vZmZsaW5lID4gMCAmJiBkZXYtPmludGVycnVwdF9pbl9idWZmZXJbMV0gIT0gMHhmZikgeyBkZXYtPm9mZmxpbmUgPSAwOyB9CisJCWlmKGRldi0+b2ZmbGluZSA9PSAwICYmIGRldi0+aW50ZXJydXB0X2luX2J1ZmZlclsxXSA9PSAweGZmKSB7IGRldi0+b2ZmbGluZSA9IDE7IH0KKyNlbmRpZgorCQlkYmdfaW5mbygmZGV2LT5pbnRmLT5kZXYsICIlczogaGVhZCwgdGFpbCBhcmUgJXgsICV4XG4iLCBfX2Z1bmNfXyxkZXYtPnJpbmdfaGVhZCxkZXYtPnJpbmdfdGFpbCk7CisJCW5leHRfcmluZ19oZWFkID0gKGRldi0+cmluZ19oZWFkKzEpICUgcmluZ19idWZmZXJfc2l6ZTsKKworCQlpZiAobmV4dF9yaW5nX2hlYWQgIT0gZGV2LT5yaW5nX3RhaWwpIHsKKwkJCW1lbWNweSgmKCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX2hlYWRdKSwKKwkJCQkJCSBkZXYtPmludGVycnVwdF9pbl9idWZmZXIsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCQlkZXYtPnJpbmdfaGVhZCA9IG5leHRfcmluZ19oZWFkOworCQkJcmV0dmFsID0gMDsKKwkJCW1lbXNldChkZXYtPmludGVycnVwdF9pbl9idWZmZXIsIDAsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCX0gZWxzZSB7CisJCQlkZXZfd2FybigmZGV2LT5pbnRmLT5kZXYsCisJCQkJICJSaW5nIGJ1ZmZlciBvdmVyZmxvdywgJWQgYnl0ZXMgZHJvcHBlZFxuIiwKKwkJCQkgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJCW1lbXNldChkZXYtPmludGVycnVwdF9pbl9idWZmZXIsIDAsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCX0KKwl9CisKK3Jlc3VibWl0OgorCS8qIHJlc3VibWl0IGlmIHdlJ3JlIHN0aWxsIHJ1bm5pbmcgKi8KKwlpZiAoZGV2LT5pbnRlcnJ1cHRfaW5fcnVubmluZyAmJiBkZXYtPmludGYpIHsKKwkJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIoZGV2LT5pbnRlcnJ1cHRfaW5fdXJiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHJldHZhbCkKKwkJCWRldl9lcnIoJmRldi0+aW50Zi0+ZGV2LAorCQkJCSJ1c2Jfc3VibWl0X3VyYiBmYWlsZWQgKCVkKVxuIiwgcmV0dmFsKTsKKwl9CisKK2V4aXQ6CisJZGV2LT5pbnRlcnJ1cHRfaW5fZG9uZSA9IDE7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXYtPnJlYWRfd2FpdCk7Cit9CisKKy8qKgorICoJdXNiX2FscGhhdHJhY2tfaW50ZXJydXB0X291dF9jYWxsYmFjaworICovCitzdGF0aWMgdm9pZCB1c2JfYWxwaGF0cmFja19pbnRlcnJ1cHRfb3V0X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgdXNiX2FscGhhdHJhY2sgKmRldiA9IHVyYi0+Y29udGV4dDsKKworCS8qIHN5bmMvYXN5bmMgdW5saW5rIGZhdWx0cyBhcmVuJ3QgZXJyb3JzICovCisJaWYgKHVyYi0+c3RhdHVzICYmICEodXJiLT5zdGF0dXMgPT0gLUVOT0VOVCB8fAorCQkJICAgICB1cmItPnN0YXR1cyA9PSAtRUNPTk5SRVNFVCB8fAorCQkJICAgICB1cmItPnN0YXR1cyA9PSAtRVNIVVRET1dOKSkKKwkJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LAorCQkJICIlcyAtIG5vbnplcm8gd3JpdGUgaW50ZXJydXB0IHN0YXR1cyByZWNlaXZlZDogJWRcbiIsCisJCQkgX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKKwlhdG9taWNfZGVjKCZkZXYtPndyaXRlc19wZW5kaW5nKTsKKwlkZXYtPmludGVycnVwdF9vdXRfYnVzeSA9IDA7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXYtPndyaXRlX3dhaXQpOworfQorCisvKioKKyAqCXVzYl9hbHBoYXRyYWNrX29wZW4KKyAqLworc3RhdGljIGludCB1c2JfYWxwaGF0cmFja19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCB1c2JfYWxwaGF0cmFjayAqZGV2OworCWludCBzdWJtaW5vcjsKKwlpbnQgcmV0dmFsID0gMDsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlOworCisJbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7CisJc3VibWlub3IgPSBpbWlub3IoaW5vZGUpOworCisJbXV0ZXhfbG9jaygmZGlzY29ubmVjdF9tdXRleCk7CisKKwlpbnRlcmZhY2UgPSB1c2JfZmluZF9pbnRlcmZhY2UoJnVzYl9hbHBoYXRyYWNrX2RyaXZlciwgc3VibWlub3IpOworCisJaWYgKCFpbnRlcmZhY2UpIHsKKwkJZXJyKCIlcyAtIGVycm9yLCBjYW4ndCBmaW5kIGRldmljZSBmb3IgbWlub3IgJWRcbiIsCisJCSAgICAgX19mdW5jX18sIHN1Ym1pbm9yKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byB1bmxvY2tfZGlzY29ubmVjdF9leGl0OworCX0KKworCWRldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKKworCWlmICghZGV2KSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gdW5sb2NrX2Rpc2Nvbm5lY3RfZXhpdDsKKwl9CisKKwkvKiBsb2NrIHRoaXMgZGV2aWNlICovCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZGV2LT5zZW0pKSB7CisJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJZ290byB1bmxvY2tfZGlzY29ubmVjdF9leGl0OworCX0KKworCS8qIGFsbG93IG9wZW5pbmcgb25seSBvbmNlICovCisJaWYgKGRldi0+b3Blbl9jb3VudCkgeworCQlyZXR2YWwgPSAtRUJVU1k7CisJCWdvdG8gdW5sb2NrX2V4aXQ7CisJfQorCWRldi0+b3Blbl9jb3VudCA9IDE7CisKKwkvKiBpbml0aWFsaXplIGluIGRpcmVjdGlvbiAqLworCWRldi0+cmluZ19oZWFkID0gMDsKKwlkZXYtPnJpbmdfdGFpbCA9IDA7CisJdXNiX2ZpbGxfaW50X3VyYihkZXYtPmludGVycnVwdF9pbl91cmIsCisJCQkgaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpLAorCQkJIHVzYl9yY3ZpbnRwaXBlKGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKSwKKwkJCQkJZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpLAorCQkJIGRldi0+aW50ZXJydXB0X2luX2J1ZmZlciwKKwkJCSBkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludF9zaXplLAorCQkJIHVzYl9hbHBoYXRyYWNrX2ludGVycnVwdF9pbl9jYWxsYmFjaywKKwkJCSBkZXYsCisJCQkgZGV2LT5pbnRlcnJ1cHRfaW5faW50ZXJ2YWwpOworCisJZGV2LT5pbnRlcnJ1cHRfaW5fcnVubmluZyA9IDE7CisJZGV2LT5pbnRlcnJ1cHRfaW5fZG9uZSA9IDA7CisJZGV2LT5lbmFibGUgPSAxOworCWRldi0+b2ZmbGluZSA9IDA7CisKKwlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYihkZXYtPmludGVycnVwdF9pbl91cmIsIEdGUF9LRVJORUwpOworCWlmIChyZXR2YWwpIHsKKwkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJDb3VsZG4ndCBzdWJtaXQgaW50ZXJydXB0X2luX3VyYiAlZFxuIiwgcmV0dmFsKTsKKwkJZGV2LT5pbnRlcnJ1cHRfaW5fcnVubmluZyA9IDA7CisJCWRldi0+b3Blbl9jb3VudCA9IDA7CisJCWdvdG8gdW5sb2NrX2V4aXQ7CisJfQorCisJLyogc2F2ZSBkZXZpY2UgaW4gdGhlIGZpbGUncyBwcml2YXRlIHN0cnVjdHVyZSAqLworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGRldjsKKworCit1bmxvY2tfZXhpdDoKKwl1cCgmZGV2LT5zZW0pOworCit1bmxvY2tfZGlzY29ubmVjdF9leGl0OgorCW11dGV4X3VubG9jaygmZGlzY29ubmVjdF9tdXRleCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqCXVzYl9hbHBoYXRyYWNrX3JlbGVhc2UKKyAqLworc3RhdGljIGludCB1c2JfYWxwaGF0cmFja19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCB1c2JfYWxwaGF0cmFjayAqZGV2OworCWludCByZXR2YWwgPSAwOworCisJZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKGRldiA9PSBOVUxMKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZkZXYtPnNlbSkpIHsKKwkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWYgKGRldi0+b3Blbl9jb3VudCAhPSAxKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gdW5sb2NrX2V4aXQ7CisJfQorCisJaWYgKGRldi0+aW50ZiA9PSBOVUxMKSB7CisJCS8qIHRoZSBkZXZpY2Ugd2FzIHVucGx1Z2dlZCBiZWZvcmUgdGhlIGZpbGUgd2FzIHJlbGVhc2VkICovCisJCXVwKCZkZXYtPnNlbSk7CisJCS8qIHVubG9jayBoZXJlIGFzIHVzYl9hbHBoYXRyYWNrX2RlbGV0ZSBmcmVlcyBkZXYgKi8KKwkJdXNiX2FscGhhdHJhY2tfZGVsZXRlKGRldik7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiB3YWl0IHVudGlsIHdyaXRlIHRyYW5zZmVyIGlzIGZpbmlzaGVkICovCisJaWYgKGRldi0+aW50ZXJydXB0X291dF9idXN5KQorCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChkZXYtPndyaXRlX3dhaXQsICFkZXYtPmludGVycnVwdF9vdXRfYnVzeSwgMiAqIEhaKTsKKwl1c2JfYWxwaGF0cmFja19hYm9ydF90cmFuc2ZlcnMoZGV2KTsKKwlkZXYtPm9wZW5fY291bnQgPSAwOworCit1bmxvY2tfZXhpdDoKKwl1cCgmZGV2LT5zZW0pOworCitleGl0OgorCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICoJdXNiX2FscGhhdHJhY2tfcG9sbAorICovCitzdGF0aWMgdW5zaWduZWQgaW50IHVzYl9hbHBoYXRyYWNrX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJc3RydWN0IHVzYl9hbHBoYXRyYWNrICpkZXY7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCisJZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJcG9sbF93YWl0KGZpbGUsICZkZXYtPnJlYWRfd2FpdCwgd2FpdCk7CisJcG9sbF93YWl0KGZpbGUsICZkZXYtPndyaXRlX3dhaXQsIHdhaXQpOworCisJaWYgKGRldi0+cmluZ19oZWFkICE9IGRldi0+cmluZ190YWlsKQorCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJaWYgKCFkZXYtPmludGVycnVwdF9vdXRfYnVzeSkKKwkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKworCXJldHVybiBtYXNrOworfQorCisvKioKKyAqCXVzYl9hbHBoYXRyYWNrX3JlYWQKKyAqLworc3RhdGljIHNzaXplX3QgdXNiX2FscGhhdHJhY2tfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LAorCQkJICAgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCB1c2JfYWxwaGF0cmFjayAqZGV2OworCWludCByZXR2YWwgPSAwOworCisJaW50IGMgPSAwOworCisJZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJLyogdmVyaWZ5IHRoYXQgd2UgYWN0dWFsbHkgaGF2ZSBzb21lIGRhdGEgdG8gcmVhZCAqLworCWlmIChjb3VudCA9PSAwKQorCQlnb3RvIGV4aXQ7CisKKwkvKiBsb2NrIHRoaXMgb2JqZWN0ICovCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZGV2LT5zZW0pKSB7CisJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJZ290byBleGl0OworCX0KKworCS8qIHZlcmlmeSB0aGF0IHRoZSBkZXZpY2Ugd2Fzbid0IHVucGx1Z2dlZCAqLworCWlmIChkZXYtPmludGYgPT0gTlVMTCkgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQllcnIoIk5vIGRldmljZSBvciBkZXZpY2UgdW5wbHVnZ2VkICVkXG4iLCByZXR2YWwpOworCQlnb3RvIHVubG9ja19leGl0OworCX0KKworCXdoaWxlIChkZXYtPnJpbmdfaGVhZCA9PSBkZXYtPnJpbmdfdGFpbCkgeworCQkJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQkJCQkJCXJldHZhbCA9IC1FQUdBSU47CisJCQkJCQkJCQlnb3RvIHVubG9ja19leGl0OworCQkJCQl9CisJCQkJCWRldi0+aW50ZXJydXB0X2luX2RvbmUgPSAwIDsKKwkJCQkJcmV0dmFsID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGRldi0+cmVhZF93YWl0LCBkZXYtPmludGVycnVwdF9pbl9kb25lKTsKKwkJCQkJaWYgKHJldHZhbCA8IDApIHsKKwkJCQkJCQkJCWdvdG8gdW5sb2NrX2V4aXQ7CisJCQkJCX0KKwl9CisKKwlhbHBoYXRyYWNrX29jbWRfaW5mbygmZGV2LT5pbnRmLT5kZXYsICYoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWQsICIlcyIsICI6IGNvcHlpbmcgdG8gdXNlcnNwYWNlIik7CisKKwkgICBjID0gMDsKKwkgICB3aGlsZSgoYyA8IGNvdW50KSAmJiAoZGV2LT5yaW5nX3RhaWwgIT0gZGV2LT5yaW5nX2hlYWQpKSB7CisJCQkJCQkgaWYgKGNvcHlfdG9fdXNlcigmYnVmZmVyW2NdLCAmKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0sIElOUFVUX0NNRF9TSVpFKSkgeworCQkJCQkJCQkJCSByZXR2YWwgPSAtRUZBVUxUOworCQkJCQkJCQkJCSBnb3RvIHVubG9ja19leGl0OworCQkJCQkJIH0KKwkJCQkJCSBkZXYtPnJpbmdfdGFpbCA9IChkZXYtPnJpbmdfdGFpbCsxKSAlIHJpbmdfYnVmZmVyX3NpemU7CisJCQkJCQkgYys9SU5QVVRfQ01EX1NJWkU7CisJCQkJCQkgZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LCAiJXM6IGhlYWQsIHRhaWwgYXJlICV4LCAleFxuIiwgX19mdW5jX18sZGV2LT5yaW5nX2hlYWQsZGV2LT5yaW5nX3RhaWwpOworCSAgIH0KKwkgICByZXR2YWwgPSBjOworCit1bmxvY2tfZXhpdDoKKwkvKiB1bmxvY2sgdGhlIGRldmljZSAqLworCXVwKCZkZXYtPnNlbSk7CisKK2V4aXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKgl1c2JfYWxwaGF0cmFja193cml0ZQorICovCitzdGF0aWMgc3NpemVfdCB1c2JfYWxwaGF0cmFja193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgdXNiX2FscGhhdHJhY2sgKmRldjsKKwlzaXplX3QgYnl0ZXNfdG9fd3JpdGU7CisJaW50IHJldHZhbCA9IDA7CisKKwlkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwkvKiB2ZXJpZnkgdGhhdCB3ZSBhY3R1YWxseSBoYXZlIHNvbWUgZGF0YSB0byB3cml0ZSAqLworCWlmIChjb3VudCA9PSAwKQorCQlnb3RvIGV4aXQ7CisKKwkvKiBsb2NrIHRoaXMgb2JqZWN0ICovCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZGV2LT5zZW0pKSB7CisJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJZ290byBleGl0OworCX0KKworCS8qIHZlcmlmeSB0aGF0IHRoZSBkZXZpY2Ugd2Fzbid0IHVucGx1Z2dlZCAqLworCWlmIChkZXYtPmludGYgPT0gTlVMTCkgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQllcnIoIk5vIGRldmljZSBvciBkZXZpY2UgdW5wbHVnZ2VkICVkXG4iLCByZXR2YWwpOworCQlnb3RvIHVubG9ja19leGl0OworCX0KKworCS8qIHdhaXQgdW50aWwgcHJldmlvdXMgdHJhbnNmZXIgaXMgZmluaXNoZWQgKi8KKwlpZiAoZGV2LT5pbnRlcnJ1cHRfb3V0X2J1c3kpIHsKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQlyZXR2YWwgPSAtRUFHQUlOOworCQkJZ290byB1bmxvY2tfZXhpdDsKKwkJfQorCQlyZXR2YWwgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZGV2LT53cml0ZV93YWl0LCAhZGV2LT5pbnRlcnJ1cHRfb3V0X2J1c3kpOworCQlpZiAocmV0dmFsIDwgMCkgeworCQkJZ290byB1bmxvY2tfZXhpdDsKKwkJfQorCX0KKworCS8qIHdyaXRlIHRoZSBkYXRhIGludG8gaW50ZXJydXB0X291dF9idWZmZXIgZnJvbSB1c2Vyc3BhY2UgKi8KKyAgLyogRklYTUUgLSBpZiB5b3Ugd3JpdGUgbW9yZSB0aGFuIDEyIGJ5dGVzIHRoaXMgYnJlYWtzICovCisJYnl0ZXNfdG9fd3JpdGUgPSBtaW4oY291bnQsIHdyaXRlX2J1ZmZlcl9zaXplKmRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludF9zaXplKTsKKwlpZiAoYnl0ZXNfdG9fd3JpdGUgPCBjb3VudCkKKwkJZGV2X3dhcm4oJmRldi0+aW50Zi0+ZGV2LCAiV3JpdGUgYnVmZmVyIG92ZXJmbG93LCAlemQgYnl0ZXMgZHJvcHBlZFxuIixjb3VudC1ieXRlc190b193cml0ZSk7CisKKwlkYmdfaW5mbygmZGV2LT5pbnRmLT5kZXYsICIlczogY291bnQgPSAlemQsIGJ5dGVzX3RvX3dyaXRlID0gJXpkXG4iLCBfX2Z1bmNfXywgY291bnQsIGJ5dGVzX3RvX3dyaXRlKTsKKworCWlmIChjb3B5X2Zyb21fdXNlcihkZXYtPmludGVycnVwdF9vdXRfYnVmZmVyLCBidWZmZXIsIGJ5dGVzX3RvX3dyaXRlKSkgeworCQlyZXR2YWwgPSAtRUZBVUxUOworCQlnb3RvIHVubG9ja19leGl0OworCX0KKworCWlmIChkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQgPT0gTlVMTCkgeworCQllcnIoIkVuZHBvaW50IHNob3VsZCBub3QgYmUgYmUgbnVsbCEgXG4iKTsKKwkJZ290byB1bmxvY2tfZXhpdDsKKwl9CisKKwkvKiBzZW5kIG9mZiB0aGUgdXJiICovCisJdXNiX2ZpbGxfaW50X3VyYihkZXYtPmludGVycnVwdF9vdXRfdXJiLAorCQkJIGludGVyZmFjZV90b191c2JkZXYoZGV2LT5pbnRmKSwKKwkJCSB1c2Jfc25kaW50cGlwZShpbnRlcmZhY2VfdG9fdXNiZGV2KGRldi0+aW50ZiksCisJCQkJCWRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyksCisJCQkgZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlciwKKwkJCSBieXRlc190b193cml0ZSwKKwkJCSB1c2JfYWxwaGF0cmFja19pbnRlcnJ1cHRfb3V0X2NhbGxiYWNrLAorCQkJIGRldiwKKwkJCSBkZXYtPmludGVycnVwdF9vdXRfaW50ZXJ2YWwpOworCWRldi0+aW50ZXJydXB0X291dF9idXN5ID0gMTsKKwlhdG9taWNfaW5jKCZkZXYtPndyaXRlc19wZW5kaW5nKTsKKwl3bWIoKTsKKworCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKGRldi0+aW50ZXJydXB0X291dF91cmIsIEdGUF9LRVJORUwpOworCWlmIChyZXR2YWwpIHsKKwkJZGV2LT5pbnRlcnJ1cHRfb3V0X2J1c3kgPSAwOworCQllcnIoIkNvdWxkbid0IHN1Ym1pdCBpbnRlcnJ1cHRfb3V0X3VyYiAlZFxuIiwgcmV0dmFsKTsKKwkJYXRvbWljX2RlYygmZGV2LT53cml0ZXNfcGVuZGluZyk7CisJCWdvdG8gdW5sb2NrX2V4aXQ7CisJfQorCXJldHZhbCA9IGJ5dGVzX3RvX3dyaXRlOworCit1bmxvY2tfZXhpdDoKKwkvKiB1bmxvY2sgdGhlIGRldmljZSAqLworCXVwKCZkZXYtPnNlbSk7CisKK2V4aXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworLyogZmlsZSBvcGVyYXRpb25zIG5lZWRlZCB3aGVuIHdlIHJlZ2lzdGVyIHRoaXMgZHJpdmVyICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1c2JfYWxwaGF0cmFja19mb3BzID0geworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5yZWFkICA9CXVzYl9hbHBoYXRyYWNrX3JlYWQsCisJLndyaXRlID0JdXNiX2FscGhhdHJhY2tfd3JpdGUsCisJLm9wZW4gPQkJdXNiX2FscGhhdHJhY2tfb3BlbiwKKwkucmVsZWFzZSA9CXVzYl9hbHBoYXRyYWNrX3JlbGVhc2UsCisJLnBvbGwgPQkJdXNiX2FscGhhdHJhY2tfcG9sbCwKK307CisKKy8qCisgKiB1c2IgY2xhc3MgZHJpdmVyIGluZm8gaW4gb3JkZXIgdG8gZ2V0IGEgbWlub3IgbnVtYmVyIGZyb20gdGhlIHVzYiBjb3JlLAorICogYW5kIHRvIGhhdmUgdGhlIGRldmljZSByZWdpc3RlcmVkIHdpdGggdGhlIGRyaXZlciBjb3JlCisgKi8KKworc3RhdGljIHN0cnVjdCB1c2JfY2xhc3NfZHJpdmVyIHVzYl9hbHBoYXRyYWNrX2NsYXNzID0geworCS5uYW1lID0JCSJhbHBoYXRyYWNrJWQiLAorCS5mb3BzID0JCSZ1c2JfYWxwaGF0cmFja19mb3BzLAorCS5taW5vcl9iYXNlID0JVVNCX0FMUEhBVFJBQ0tfTUlOT1JfQkFTRSwKK307CisKKworLyoqCisgKgl1c2JfYWxwaGF0cmFja19wcm9iZQorICoKKyAqCUNhbGxlZCBieSB0aGUgdXNiIGNvcmUgd2hlbiBhIG5ldyBkZXZpY2UgaXMgY29ubmVjdGVkIHRoYXQgaXQgdGhpbmtzCisgKgl0aGlzIGRyaXZlciBtaWdodCBiZSBpbnRlcmVzdGVkIGluLgorICovCitzdGF0aWMgaW50IHVzYl9hbHBoYXRyYWNrX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCXN0cnVjdCB1c2JfYWxwaGF0cmFjayAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppZmFjZV9kZXNjOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CisJaW50IGk7CisJaW50IHRydWVfc2l6ZTsKKwlpbnQgcmV0dmFsID0gLUVOT01FTTsKKworCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3Igb3VyIGRldmljZSBzdGF0ZSBhbmQgaW50aWFsaXplIGl0ICovCisKKwlkZXYgPSBremFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRldiA9PSBOVUxMKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgIk91dCBvZiBtZW1vcnlcbiIpOworCQlnb3RvIGV4aXQ7CisJfQorCWluaXRfTVVURVgoJmRldi0+c2VtKTsKKwlkZXYtPmludGYgPSBpbnRmOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldi0+cmVhZF93YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXYtPndyaXRlX3dhaXQpOworCisJaWZhY2VfZGVzYyA9IGludGYtPmN1cl9hbHRzZXR0aW5nOworCisJLyogc2V0IHVwIHRoZSBlbmRwb2ludCBpbmZvcm1hdGlvbiAqLworCWZvciAoaSA9IDA7IGkgPCBpZmFjZV9kZXNjLT5kZXNjLmJOdW1FbmRwb2ludHM7ICsraSkgeworCQllbmRwb2ludCA9ICZpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjOworCisJCWlmICh1c2JfZW5kcG9pbnRfaXNfaW50X2luKGVuZHBvaW50KSkKKwkJCWRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50ID0gZW5kcG9pbnQ7CisKKwkJaWYgKHVzYl9lbmRwb2ludF9pc19pbnRfb3V0KGVuZHBvaW50KSkKKwkJCWRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludCA9IGVuZHBvaW50OworCX0KKwlpZiAoZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJJbnRlcnJ1cHQgaW4gZW5kcG9pbnQgbm90IGZvdW5kXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisJaWYgKGRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludCA9PSBOVUxMKQorCQlkZXZfd2FybigmaW50Zi0+ZGV2LCAiSW50ZXJydXB0IG91dCBlbmRwb2ludCBub3QgZm91bmQgKHVzaW5nIGNvbnRyb2wgZW5kcG9pbnQgaW5zdGVhZClcbiIpOworCisJZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnRfc2l6ZSA9IGxlMTZfdG9fY3B1KGRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7CisKKwlpZiAoZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnRfc2l6ZSAhPSA2NCkKKwkgICAgZGV2X3dhcm4oJmludGYtPmRldiwgIkludGVycnVwdCBpbiBlbmRwb2ludCBzaXplIGlzIG5vdCA2NCFcbiIpOworCisJaWYocmluZ19idWZmZXJfc2l6ZSA9PSAwKSB7IHJpbmdfYnVmZmVyX3NpemUgPSBSSU5HX0JVRkZFUl9TSVpFOyB9CisKKwl0cnVlX3NpemUgPSBtaW4ocmluZ19idWZmZXJfc2l6ZSxSSU5HX0JVRkZFUl9TSVpFKTsKKworCS8qIEZJWE1FIC0gdGhlcmUgYXJlIG1vcmUgdXNiX2FsbG9jIHJvdXRpbmVzIGZvciBkbWEgY29ycmVjdG5lc3MuIE5lZWRlZD8gKi8KKworLy8JZGV2LT5yaW5nX2J1ZmZlciA9IGttYWxsb2MoKHRydWVfc2l6ZSpzaXplb2Yoc3RydWN0IGFscGhhdHJhY2tfaWNtZCkpKzEyLCBHRlBfS0VSTkVMKTsKKwlkZXYtPnJpbmdfYnVmZmVyID0ga21hbGxvYygodHJ1ZV9zaXplKnNpemVvZihzdHJ1Y3QgYWxwaGF0cmFja19pY21kKSksIEdGUF9LRVJORUwpOworCisJaWYgKCFkZXYtPnJpbmdfYnVmZmVyKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgIkNvdWxkbid0IGFsbG9jYXRlIGlucHV0IHJpbmdfYnVmZmVyIG9mIHNpemUgJWRcbiIsdHJ1ZV9zaXplKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlkZXYtPmludGVycnVwdF9pbl9idWZmZXIgPSBrbWFsbG9jKGRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50X3NpemUsIEdGUF9LRVJORUwpOworCisJaWYgKCFkZXYtPmludGVycnVwdF9pbl9idWZmZXIpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgaW50ZXJydXB0X2luX2J1ZmZlclxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCWRldi0+b2xkaV9idWZmZXIgPSBrbWFsbG9jKGRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50X3NpemUsIEdGUF9LRVJORUwpOworCWlmICghZGV2LT5vbGRpX2J1ZmZlcikgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBvbGQgYnVmZmVyXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisJZGV2LT5pbnRlcnJ1cHRfaW5fdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldi0+aW50ZXJydXB0X2luX3VyYikgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBpbnRlcnJ1cHRfaW5fdXJiXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnRfc2l6ZSA9IGRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludCA/IGxlMTZfdG9fY3B1KGRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludC0+d01heFBhY2tldFNpemUpIDoKKwkJCQkJCQkJCSB1ZGV2LT5kZXNjcmlwdG9yLmJNYXhQYWNrZXRTaXplMDsKKworCWlmIChkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnRfc2l6ZSAhPTY0KQorCQlkZXZfd2FybigmaW50Zi0+ZGV2LCAiSW50ZXJydXB0IG91dCBlbmRwb2ludCBzaXplIGlzIG5vdCA2NCEpXG4iKTsKKworCWlmKHdyaXRlX2J1ZmZlcl9zaXplID09IDApIHsgd3JpdGVfYnVmZmVyX3NpemUgPSBXUklURV9CVUZGRVJfU0laRTsgfQorCXRydWVfc2l6ZSA9IG1pbih3cml0ZV9idWZmZXJfc2l6ZSxXUklURV9CVUZGRVJfU0laRSk7CisKKwlkZXYtPmludGVycnVwdF9vdXRfYnVmZmVyID0ga21hbGxvYyh0cnVlX3NpemUqZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50X3NpemUsIEdGUF9LRVJORUwpOworCisJaWYgKCFkZXYtPmludGVycnVwdF9vdXRfYnVmZmVyKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgIkNvdWxkbid0IGFsbG9jYXRlIGludGVycnVwdF9vdXRfYnVmZmVyXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlkZXYtPndyaXRlX2J1ZmZlciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhbHBoYXRyYWNrX29jbWQpKnRydWVfc2l6ZSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWRldi0+d3JpdGVfYnVmZmVyKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgIkNvdWxkbid0IGFsbG9jYXRlIHdyaXRlX2J1ZmZlciBcbiIpOworCQlnb3RvIGVycm9yOworCX0KKworCWRldi0+aW50ZXJydXB0X291dF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCWlmICghZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYikgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBpbnRlcnJ1cHRfb3V0X3VyYlxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCWRldi0+aW50ZXJydXB0X2luX2ludGVydmFsID0gbWluX2ludGVycnVwdF9pbl9pbnRlcnZhbCA+IGRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50LT5iSW50ZXJ2YWwgPyBtaW5faW50ZXJydXB0X2luX2ludGVydmFsIDogZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQtPmJJbnRlcnZhbDsKKwlpZiAoZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50KQorCQlkZXYtPmludGVycnVwdF9vdXRfaW50ZXJ2YWwgPSBtaW5faW50ZXJydXB0X291dF9pbnRlcnZhbCA+IGRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludC0+YkludGVydmFsID8gbWluX2ludGVycnVwdF9vdXRfaW50ZXJ2YWwgOiBkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQtPmJJbnRlcnZhbDsKKworCS8qIHdlIGNhbiByZWdpc3RlciB0aGUgZGV2aWNlIG5vdywgYXMgaXQgaXMgcmVhZHkgKi8KKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIGRldik7CisKKwlhdG9taWNfc2V0KCZkZXYtPndyaXRlc19wZW5kaW5nLDApOworCXJldHZhbCA9IHVzYl9yZWdpc3Rlcl9kZXYoaW50ZiwgJnVzYl9hbHBoYXRyYWNrX2NsYXNzKTsKKwlpZiAocmV0dmFsKSB7CisJCS8qIHNvbWV0aGluZyBwcmV2ZW50ZWQgdXMgZnJvbSByZWdpc3RlcmluZyB0aGlzIGRyaXZlciAqLworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJOb3QgYWJsZSB0byBnZXQgYSBtaW5vciBmb3IgdGhpcyBkZXZpY2UuXG4iKTsKKwkJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBsZXQgdGhlIHVzZXIga25vdyB3aGF0IG5vZGUgdGhpcyBkZXZpY2UgaXMgbm93IGF0dGFjaGVkIHRvICovCisJZGV2X2luZm8oJmludGYtPmRldiwgIkFscGhhdHJhY2sgRGV2aWNlICMlZCBub3cgYXR0YWNoZWQgdG8gbWFqb3IgJWQgbWlub3IgJWRcbiIsCisJCShpbnRmLT5taW5vciAtIFVTQl9BTFBIQVRSQUNLX01JTk9SX0JBU0UpLCBVU0JfTUFKT1IsIGludGYtPm1pbm9yKTsKKworZXhpdDoKKwlyZXR1cm4gcmV0dmFsOworCitlcnJvcjoKKwl1c2JfYWxwaGF0cmFja19kZWxldGUoZGV2KTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICoJdXNiX2FscGhhdHJhY2tfZGlzY29ubmVjdAorICoKKyAqCUNhbGxlZCBieSB0aGUgdXNiIGNvcmUgd2hlbiB0aGUgZGV2aWNlIGlzIHJlbW92ZWQgZnJvbSB0aGUgc3lzdGVtLgorICovCitzdGF0aWMgdm9pZCB1c2JfYWxwaGF0cmFja19kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCB1c2JfYWxwaGF0cmFjayAqZGV2OworCWludCBtaW5vcjsKKworCW11dGV4X2xvY2soJmRpc2Nvbm5lY3RfbXV0ZXgpOworCisJZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOworCisJZG93bigmZGV2LT5zZW0pOworCisJbWlub3IgPSBpbnRmLT5taW5vcjsKKworCS8qIGdpdmUgYmFjayBvdXIgbWlub3IgKi8KKwl1c2JfZGVyZWdpc3Rlcl9kZXYoaW50ZiwgJnVzYl9hbHBoYXRyYWNrX2NsYXNzKTsKKworCS8qIGlmIHRoZSBkZXZpY2UgaXMgbm90IG9wZW5lZCwgdGhlbiB3ZSBjbGVhbiB1cCByaWdodCBub3cgKi8KKwlpZiAoIWRldi0+b3Blbl9jb3VudCkgeworCQl1cCgmZGV2LT5zZW0pOworCQl1c2JfYWxwaGF0cmFja19kZWxldGUoZGV2KTsKKwl9IGVsc2UgeworCQlkZXYtPmludGYgPSBOVUxMOworCQl1cCgmZGV2LT5zZW0pOworCX0KKworCWF0b21pY19zZXQoJmRldi0+d3JpdGVzX3BlbmRpbmcsMCk7CisJbXV0ZXhfdW5sb2NrKCZkaXNjb25uZWN0X211dGV4KTsKKworCWRldl9pbmZvKCZpbnRmLT5kZXYsICJBbHBoYXRyYWNrIFN1cmZhY2UgIyVkIG5vdyBkaXNjb25uZWN0ZWRcbiIsCisJCSAobWlub3IgLSBVU0JfQUxQSEFUUkFDS19NSU5PUl9CQVNFKSk7Cit9CisKKy8qIHVzYiBzcGVjaWZpYyBvYmplY3QgbmVlZGVkIHRvIHJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIHVzYiBzdWJzeXN0ZW0gKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciB1c2JfYWxwaGF0cmFja19kcml2ZXIgPSB7CisJLm5hbWUgPQkJImFscGhhdHJhY2siLAorCS5wcm9iZSA9CXVzYl9hbHBoYXRyYWNrX3Byb2JlLAorCS5kaXNjb25uZWN0ID0JdXNiX2FscGhhdHJhY2tfZGlzY29ubmVjdCwKKwkuaWRfdGFibGUgPQl1c2JfYWxwaGF0cmFja190YWJsZSwKK307CisKKy8qKgorICoJdXNiX2FscGhhdHJhY2tfaW5pdAorICovCitzdGF0aWMgaW50IF9faW5pdCB1c2JfYWxwaGF0cmFja19pbml0KHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCS8qIHJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIFVTQiBzdWJzeXN0ZW0gKi8KKwlyZXR2YWwgPSB1c2JfcmVnaXN0ZXIoJnVzYl9hbHBoYXRyYWNrX2RyaXZlcik7CisJaWYgKHJldHZhbCkKKwkJZXJyKCJ1c2JfcmVnaXN0ZXIgZmFpbGVkIGZvciB0aGUgIl9fRklMRV9fIiBkcml2ZXIuIEVycm9yIG51bWJlciAlZFxuIiwgcmV0dmFsKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICoJdXNiX2FscGhhdHJhY2tfZXhpdAorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgdXNiX2FscGhhdHJhY2tfZXhpdCh2b2lkKQoreworCS8qIGRlcmVnaXN0ZXIgdGhpcyBkcml2ZXIgd2l0aCB0aGUgVVNCIHN1YnN5c3RlbSAqLworCXVzYl9kZXJlZ2lzdGVyKCZ1c2JfYWxwaGF0cmFja19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh1c2JfYWxwaGF0cmFja19pbml0KTsKK21vZHVsZV9leGl0KHVzYl9hbHBoYXRyYWNrX2V4aXQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvYWxwaGF0cmFjay5oIGIvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL2FscGhhdHJhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWM5MGE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL2FscGhhdHJhY2suaApAQCAtMCwwICsxLDkyIEBACisjZGVmaW5lIHNob3dfc2V0X2JpdChhKSBzaG93X3NldF9tYml0KGFscGhhdHJhY2ssYSkKKyNkZWZpbmUgc2hvd19zZXRfY21kKGEpIHNob3dfc2V0X21jbWQoYWxwaGF0cmFjayxhKQorI2RlZmluZSBzaG93X3NldF9pbnQoYSkgc2hvd19zZXRfbWludChhbHBoYXRyYWNrLGEpCisjZGVmaW5lIHNob3dfc2V0X2NoYXIoYSkgc2hvd19zZXRfbWNoYXIoYWxwaGF0cmFjayxhKQorI2RlZmluZSBzaG93X3NldF9saWdodChhKSBzaG93X3NldF9lYml0KGFscGhhdHJhY2ssTGlnaHRJRCxsaWdodHMsYSkKKyNkZWZpbmUgc2hvd19zZXRfYnV0dG9uKGEpIHNob3dfc2V0X2ViaXQoYWxwaGF0cmFjayxCdXR0b25JRCxidXR0b24sYSkKKworc3RydWN0IGFscGhhdHJhY2tfaWNtZCB7CisgICAgdW5zaWduZWQgY2hhciBjbWRbMTJdOworfTsKKworc3RydWN0IGFscGhhdHJhY2tfb2NtZCB7CisgICAgdW5zaWduZWQgY2hhciBjbWRbOF07Cit9OworCitlbnVtIExpZ2h0SUQgeworICAgICAgICBMSUdIVF9FUSA9IDAsCisgICAgICAgIExJR0hUX09VVCwKKyAgICAgICAgTElHSFRfRjIsCisgICAgICAgIExJR0hUX1NFTkQsCisgICAgICAgIExJR0hUX0lOLAorICAgICAgICBMSUdIVF9GMSwKKyAgICAgICAgTElHSFRfUEFOLAorICAgICAgICBMSUdIVF9VTkRFRjEsCisgICAgICAgIExJR0hUX1VOREVGMiwKKyAgICAgICAgTElHSFRfU0hJRlQsCisgICAgICAgIExJR0hUX1RSQUNLTVVURSwKKyAgICAgICAgTElHSFRfVFJBQ0tTT0xPLAorICAgICAgICBMSUdIVF9UUkFDS1JFQywKKyAgICAgICAgTElHSFRfUkVBRCwKKyAgICAgICAgTElHSFRfV1JJVEUsCisgICAgICAgIExJR0hUX0FOWVNPTE8sCisgICAgICAgIExJR0hUX0FVVE8sCisgICAgICAgIExJR0hUX0Y0LAorICAgICAgICBMSUdIVF9SRUNPUkQsCisgICAgICAgIExJR0hUX1dJTkRPVywKKyAgICAgICAgTElHSFRfUExVR0lOLAorICAgICAgICBMSUdIVF9GMywKKyAgICAgICAgTElHSFRfTE9PUAorfTsKKworI2RlZmluZSBCVVRUT05NQVNLX0JBVFRFUlkgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgQlVUVE9OTUFTS19CQUNLTElHSFQgICAweDAwMDA4MDAwCisjZGVmaW5lIEJVVFRPTk1BU0tfRkFTVEZPUldBUkQgMHgwNDAwMDAwMAorI2RlZmluZSBCVVRUT05NQVNLX1RSQUNLTVVURSAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgQlVUVE9OTUFTS19UUkFDS1NPTE8gICAweDAwODAwMDAwCisjZGVmaW5lIEJVVFRPTk1BU0tfVFJBQ0tMRUZUICAgMHg4MDAwMDAwMAorI2RlZmluZSBCVVRUT05NQVNLX1JFQ09SRCAgICAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgQlVUVE9OTUFTS19TSElGVCAgICAgICAweDIwMDAwMDAwCisjZGVmaW5lIEJVVFRPTk1BU0tfUFVOQ0ggICAgICAgMHgwMDgwMDAwMAorI2RlZmluZSBCVVRUT05NQVNLX1RSQUNLUklHSFQgIDB4MDAwMjAwMDAKKyNkZWZpbmUgQlVUVE9OTUFTS19SRVdJTkQgICAgICAweDAxMDAwMDAwCisjZGVmaW5lIEJVVFRPTk1BU0tfU1RPUCAgICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBCVVRUT05NQVNLX0xPT1AgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgQlVUVE9OTUFTS19UUkFDS1JFQyAgICAweDAwMDAxMDAwCisjZGVmaW5lIEJVVFRPTk1BU0tfUExBWSAgICAgICAgMHgwODAwMDAwMAorI2RlZmluZSBCVVRUT05NQVNLX1RPVUNIMSAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgQlVUVE9OTUFTS19UT1VDSDIgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEJVVFRPTk1BU0tfVE9VQ0gzICAgICAgMHgwMDAwMDAyMAorCisjZGVmaW5lIEJVVFRPTk1BU0tfUFJFU1MxICAgICAgMHgwMDAwMDAwOQorI2RlZmluZSBCVVRUT05NQVNLX1BSRVNTMiAgICAgIDB4MDAwMDgwMTAKKyNkZWZpbmUgQlVUVE9OTUFTS19QUkVTUzMgICAgICAweDAwMDAyMDIwCisKKy8vIGxhc3QgMyBieXRlcyBhcmUgdGhlIHNsaWRlciBwb3NpdGlvbgorLy8gNDAgaXMgdGhlIGFjdHVhbCBzbGlkZXIgbW92aW5nLCB0aGUgbW9zdCBzaWcgYml0cywgYW5kIDMgbHNiCisKKyNkZWZpbmUgQlVUVE9OTUFTS19GTElQICAgICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBCVVRUT05NQVNLX0YxICAgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIEJVVFRPTk1BU0tfRjIgICAgICAgICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgQlVUVE9OTUFTS19GMyAgICAgICAgICAgMHgwMDIwMDAwMAorI2RlZmluZSBCVVRUT05NQVNLX0Y0ICAgICAgICAgICAweDAwMDgwMDAwCisjZGVmaW5lIEJVVFRPTk1BU0tfUEFOICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgQlVUVE9OTUFTS19TRU5EICAgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBCVVRUT05NQVNLX0VRICAgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIEJVVFRPTk1BU0tfUExVR0lOICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgQlVUVE9OTUFTS19BVVRPICAgICAgICAgMHgwMDAwMDEwMAorCisKKy8vICNkZWZpbmUgQlVUVE9OTUFTS19GT09UU1dJVENIIEZJWE1FCisKKy8vIExvb2t1cC4gbmFtZS4gbWlkaSBvdXQuIG1pZGkgaW4uCisKK3N0cnVjdCBidXR0b25tYXBfdCB7CisJdTMyIG1hc2s7CisJc2hvcnQgbWlkaV9pbjsKKwlzaG9ydCBtaWRpX291dDsKKwljaGFyICpuYW1lOworLy8gIAl2b2lkICgqZnVuY3Rpb24pIChidXR0b25tYXBfdCAqKTsKKyAgCXZvaWQgKCpmdW5jdGlvbikgKHZvaWQpOworfTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL2Zyb250aWVyX2NvbXBhdC5oIGIvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL2Zyb250aWVyX2NvbXBhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNDUwZTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvZnJvbnRpZXJfY29tcGF0LmgKQEAgLTAsMCArMSw2MyBAQAorLyogVVNCIGRlZmluZXMgZm9yIG9sZGVyIGtlcm5lbHMgKi8KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDE5KQorCisvKioKKyAqIHVzYl9lbmRwb2ludF9kaXJfb3V0IC0gY2hlY2sgaWYgdGhlIGVuZHBvaW50IGhhcyBPVVQgZGlyZWN0aW9uCisgKiBAZXBkOiBlbmRwb2ludCB0byBiZSBjaGVja2VkCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmRwb2ludCBpcyBvZiB0eXBlIE9VVCwgb3RoZXJ3aXNlIGl0IHJldHVybnMgZmFsc2UuCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgdXNiX2VuZHBvaW50X2Rpcl9vdXQoY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCit7CisgICAgICAgcmV0dXJuICgoZXBkLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSA9PSBVU0JfRElSX09VVCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHVzYl9lbmRwb2ludF9kaXJfaW4oY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCit7CisgICAgICAgcmV0dXJuICgoZXBkLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSA9PSBVU0JfRElSX0lOKTsKK30KKworCisvKioKKyAqIHVzYl9lbmRwb2ludF94ZmVyX2ludCAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBoYXMgaW50ZXJydXB0IHRyYW5zZmVyIHR5cGUKKyAqIEBlcGQ6IGVuZHBvaW50IHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuZHBvaW50IGlzIG9mIHR5cGUgaW50ZXJydXB0LCBvdGhlcndpc2UgaXQgcmV0dXJucworICogZmFsc2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHVzYl9lbmRwb2ludF94ZmVyX2ludChjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKK3sKKyAgICAgICByZXR1cm4gKChlcGQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PQorICAgICAgICAgICAgICAgVVNCX0VORFBPSU5UX1hGRVJfSU5UKTsKK30KKworCisvKioKKyAqIHVzYl9lbmRwb2ludF9pc19pbnRfaW4gLSBjaGVjayBpZiB0aGUgZW5kcG9pbnQgaXMgaW50ZXJydXB0IElOCisgKiBAZXBkOiBlbmRwb2ludCB0byBiZSBjaGVja2VkCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmRwb2ludCBoYXMgaW50ZXJydXB0IHRyYW5zZmVyIHR5cGUgYW5kIElOIGRpcmVjdGlvbiwKKyAqIG90aGVyd2lzZSBpdCByZXR1cm5zIGZhbHNlLgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHVzYl9lbmRwb2ludF9pc19pbnRfaW4oY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCit7CisgICAgICAgcmV0dXJuICh1c2JfZW5kcG9pbnRfeGZlcl9pbnQoZXBkKSAmJiB1c2JfZW5kcG9pbnRfZGlyX2luKGVwZCkpOworfQorCisvKioKKyAqIHVzYl9lbmRwb2ludF9pc19pbnRfb3V0IC0gY2hlY2sgaWYgdGhlIGVuZHBvaW50IGlzIGludGVycnVwdCBPVVQKKyAqIEBlcGQ6IGVuZHBvaW50IHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuZHBvaW50IGhhcyBpbnRlcnJ1cHQgdHJhbnNmZXIgdHlwZSBhbmQgT1VUIGRpcmVjdGlvbiwKKyAqIG90aGVyd2lzZSBpdCByZXR1cm5zIGZhbHNlLgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHVzYl9lbmRwb2ludF9pc19pbnRfb3V0KGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQoreworICAgICAgIHJldHVybiAodXNiX2VuZHBvaW50X3hmZXJfaW50KGVwZCkgJiYgdXNiX2VuZHBvaW50X2Rpcl9vdXQoZXBkKSk7Cit9CisKKyNlbmRpZiAvKiBvbGRlciBrZXJuZWwgdmVyc2lvbnMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9zdXJmYWNlX3N5c2ZzLmggYi9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvc3VyZmFjZV9zeXNmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MGE1NjJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL3N1cmZhY2Vfc3lzZnMuaApAQCAtMCwwICsxLDEwMCBAQAorLyogSWYgeW91IGFyZSBnb2luZyB0byBhYnVzZSB0aGUgcHJlcHJvY2Vzc29yLCB3aHkgbm90IEFCVVNFIHRoZSBwcmVwcm9jZXNzb3I/CisgICBJIHN0dWNrIHRoaXMgaGVhZGVyIGluIGEgc2VwYXJhdGUgZmlsZSBzbyBJIGRvbid0IGhhdmUgdG8gbG9vayBhdCBpdCAqLworCisvLyBGSVhNRSBOZWVkIGxvY2tpbmcgb3IgYXRvbWljIG9wcworCisjZGVmaW5lIHNob3dfc2V0X21iaXQoZG5hbWUsdmFsdWUsYml0KQkJCQkJCQkJCQkJCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93XyMjdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsJCVwKKwlzdHJ1Y3QgdXNiXyMjZG5hbWUgKnQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwkJCVwKKwlpbnQgdGVtcCA9ICgxICYmICh0LT52YWx1ZSAmICgxIDw8IGJpdCkpKTsJCQkJCVwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdGVtcCk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF8jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwkJXAorCXN0cnVjdCB1c2JfIyNkbmFtZSAqdCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CQkJXAorCWludCB0ZW1wID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CQkJXAorCWlmKHRlbXAgPiAwKSB7IGxvbmcgYiA9IDEgPDwgYml0OyB0LT52YWx1ZSB8PSBiOyB9IFwKKwllbHNlIHsgbG9uZyBiID0gfigxIDw8IGJpdCk7IHQtPnZhbHVlICY9IGIgOwkJCQkgXAorCXJldHVybiBjb3VudDsJCQkJCQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUih2YWx1ZSwgU19JV1VHTyB8IFNfSVJVR08sIHNob3dfIyN2YWx1ZSwgc2V0XyMjdmFsdWUpOworCisjZGVmaW5lIHNob3dfc2V0X2ViaXQoZG5hbWUsZW51bW5hbWUsdmFsdWUsYml0KQkJCQkJCQkJCQkJCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93XyMjYml0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CQlcCisJc3RydWN0IHVzYl8jI2RuYW1lICp0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsJCQlcCisgIGVudW0gZW51bW5hbWUgbCA9IGJpdDsgXAorICBpbnQgdGVtcCA9IHQtPnZhbHVlICYgKDEgPDwgbCk7CQkJCQkJXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0ZW1wKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0XyMjYml0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwkJXAorCXN0cnVjdCB1c2JfIyNkbmFtZSAqdCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CQkJXAorCWludCB0ZW1wID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CQkJXAorICBlbnVtIGVudW1uYW1lIGwgPSBiaXQ7XAorCWxvbmcgYiAgPSAxIDw8IGw7IFwKKwlpZih0ZW1wID4gMCkgeyB0LT52YWx1ZSB8PSBiOyB9CVwKKwllbHNlIHsgdC0+dmFsdWUgJj0gfmIgOwkJCQlcCisJcmV0dXJuIGNvdW50OwkJCQkJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKHZhbHVlLCBTX0lXVUdPIHwgU19JUlVHTywgc2hvd18jI3ZhbHVlLCBzZXRfIyN2YWx1ZSk7CisKKy8vIEZJWE1FIEZPUiBDT1JSRUNUTFkgU0VUVElORyBIRVggZnJvbSBhIHN0cmluZworI2RlZmluZSBzaG93X3NldF9tY21kKGRuYW1lLHZhbHVlKQkJCQkJCQkJCQkJCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93XyMjdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsJCVwKKwlzdHJ1Y3QgdXNiXyMjZG5hbWUgKnQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwkJCVwKKyAgaW50IGNvdW50ID0gMDtcCisJaW50IGk7IFwKKwlmb3IgKGkgPSAwLGk8c2l6ZW9mKGRuYW1lKTsgaSsrKSBjb3VudCArPSBzbnByaW50ZihidWYsICIlMDJ4Iix0LT5kbmFtZVtpXSk7IFwKKyAgcmV0dXJuKGNvdW50KTtcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0XyMjdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CQlcCisJc3RydWN0IHVzYl8jI2RuYW1lICp0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsJCQlcCisJaW50IHRlbXAgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsJCQlcCisJdC0+dmFsdWUgPSB0ZW1wOwkJCQkJCVwKKwlyZXR1cm4gY291bnQ7CQkJCQkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIodmFsdWUsIFNfSVdVR08gfCBTX0lSVUdPLCBzaG93XyMjdmFsdWUsIHNldF8jI3ZhbHVlKTsKKworI2RlZmluZSBzaG93X3NldF9taW50KGRuYW1lLHZhbHVlKQkJCQlcCitzdGF0aWMgc3NpemVfdCBzaG93XyMjdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsJCVwKKwlzdHJ1Y3QgdXNiXyMjZG5hbWUgKnQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwkJCVwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdC0+dmFsdWUpOwkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfIyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsJCVwKKwlzdHJ1Y3QgdXNiXyMjZG5hbWUgKnQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwkJCVwKKwlpbnQgdGVtcCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwkJCVwKKwl0LT52YWx1ZSA9IHRlbXA7CQkJCQkJXAorCXJldHVybiBjb3VudDsJCQkJCQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUih2YWx1ZSwgU19JV1VHTyB8IFNfSVJVR08sIHNob3dfIyN2YWx1ZSwgc2V0XyMjdmFsdWUpOworCisjZGVmaW5lIHNob3dfc2V0X21jaGFyKGRuYW1lLHZhbHVlKQkJCQkJCQkJCQkJCQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CQlcCisJc3RydWN0IHVzYl8jI2RuYW1lICp0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsJCQlcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWNcbiIsIHQtPnZhbHVlKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0XyMjdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CQlcCisJc3RydWN0IHVzYl8jI2RuYW1lICp0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsJCQlcCisJaW50IHRlbXAgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsJCQlcCisJdC0+dmFsdWUgPSB0ZW1wOwkJCQkJCVwKKwlyZXR1cm4gY291bnQ7CQkJCQkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIodmFsdWUsIFNfSVdVR08gfCBTX0lSVUdPLCBzaG93XyMjdmFsdWUsIHNldF8jI3ZhbHVlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci90cmFuenBvcnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci90cmFuenBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWFiYjZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL3RyYW56cG9ydC5jCkBAIC0wLDAgKzEsMTAwNiBAQAorLyoKKyAqIEZyb250aWVyIERlc2lnbnMgVHJhbnpwb3J0IGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNaWNoYWVsIFRhaHQgKG1AdGFodC5uZXQpCisgKgorICogQmFzZWQgb24gdGhlIHVzYmxlZCBkcml2ZXIgYW5kIGxkdXNiIGRyaXZlcnMgYnkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgR3JlZyBLcm9haC1IYXJ0bWFuIChncmVnQGtyb2FoLmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwNSBNaWNoYWVsIEh1bmQgPG1odW5kQGxkLWRpZGFjdGljLmRlPgorICoKKyAqIFRoZSBsZHVzYiBkcml2ZXIgd2FzLCBpbiB0dXJuLCBkZXJpdmVkIGZyb20gTGVnbyBVU0IgVG93ZXIgZHJpdmVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgRGF2aWQgR2xhbmNlIDxhZHZpZGdzZkBzb3VyY2Vmb3JnZS5uZXQ+CisgKgkJIDIwMDEtMjAwNCBKdWVyZ2VuIFN0dWJlciA8c3RhcmJsdWVAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKglwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorICoKKyAqLworCisvKioKKyAqIFRoaXMgZHJpdmVyIHVzZXMgYSByaW5nIGJ1ZmZlciBmb3IgdGltZSBjcml0aWNhbCByZWFkaW5nIG9mCisgKiBpbnRlcnJ1cHQgaW4gcmVwb3J0cyBhbmQgcHJvdmlkZXMgcmVhZCBhbmQgd3JpdGUgbWV0aG9kcyBmb3IKKyAqIHJhdyBpbnRlcnJ1cHQgcmVwb3J0cy4KKyAqLworCisvKiBOb3RlOiB0aGlzIGN1cnJlbnRseSB1c2VzIGEgZHVtYiByaW5nYnVmZmVyIGZvciByZWFkcyBhbmQgd3JpdGVzLgorICogQSBtb3JlIG9wdGltYWwgZHJpdmVyIHdvdWxkIGNhY2hlIGFuZCBraWxsIG9mZiBvdXRzdGFuZGluZyB1cmJzIHRoYXQgYXJlCisgKiBub3cgaW52YWxpZCwgYW5kIGlnbm9yZSBvbmVzIHRoYXQgYWxyZWFkeSB3ZXJlIGluIHRoZSBxdWV1ZSBidXQgdmFsaWQKKyAqIGFzIHdlIG9ubHkgaGF2ZSAxNyBjb21tYW5kcyBmb3IgdGhlIHRyYW56cG9ydC4gSW4gcGFydGljdWxhciB0aGlzIGlzCisgKiBrZXkgZm9yIGdldHRpbmcgbGlnaHRzIHRvIGZsYXNoIGluIHRpbWUgYXMgb3RoZXJ3aXNlIG1hbnkgY29tbWFuZHMKKyAqIGNhbiBiZSBidWZmZXJlZCB1cCBiZWZvcmUgdGhlIGxpZ2h0IGNoYW5nZSBtYWtlcyBpdCB0byB0aGUgaW50ZXJmYWNlLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLCA2LCAxOSkKKyNpbmNsdWRlIGZyb250aWVyX2NvbXBhdC5oCisjZW5kaWYKKworLyogRGVmaW5lIHRoZXNlIHZhbHVlcyB0byBtYXRjaCB5b3VyIGRldmljZXMgKi8KKyNkZWZpbmUgVkVORE9SX0lEICAgMHgxNjViCisjZGVmaW5lIFBST0RVQ1RfSUQJMHg4MTAxCisKKyNpZmRlZiBDT05GSUdfVVNCX0RZTkFNSUNfTUlOT1JTCisjZGVmaW5lIFVTQl9UUkFOWlBPUlRfTUlOT1JfQkFTRQkwCisjZWxzZQorLy8gRklYTUUgMTc2IC0gaXMgdGhlIGxkdXNiIGRyaXZlcidzIG1pbm9yIC0gYXBwbHkgZm9yIGEgbWlub3Igc29vbgorI2RlZmluZSBVU0JfVFJBTlpQT1JUX01JTk9SX0JBU0UJMTc3CisjZW5kaWYKKworLyogdGFibGUgb2YgZGV2aWNlcyB0aGF0IHdvcmsgd2l0aCB0aGlzIGRyaXZlciAqLworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHVzYl90cmFuenBvcnRfdGFibGUgW10gPSB7CisJeyBVU0JfREVWSUNFKFZFTkRPUl9JRCwgUFJPRFVDVF9JRCkgfSwKKwl7IH0JCQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgdXNiX3RyYW56cG9ydF90YWJsZSk7CitNT0RVTEVfVkVSU0lPTigiMC4zMyIpOworTU9EVUxFX0FVVEhPUigiTWlrZSBUYWh0IDxtQHRhaHQubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUcmFuenBvcnQgVVNCIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIkZyb250aWVyIERlc2lnbnMgVHJhbnpwb3J0IENvbnRyb2wgU3VyZmFjZSIpOworCisvKiBUaGVzZSB0d28gYXJlbid0IGRvbmUgeWV0ICovCisKKyNkZWZpbmUgU1VQUFJFU1NfRVhUUkFfT05MSU5FX0VWRU5UUyAwCisjZGVmaW5lIEJVRkZFUkVEX1dSSVRFUyAwCisKKyNkZWZpbmUgU1VQUFJFU1NfRVhUUkFfT0ZGTElORV9FVkVOVFMgMQorI2RlZmluZSBDT01QUkVTU19XSEVFTF9FVkVOVFMgMQorI2RlZmluZSBCVUZGRVJFRF9SRUFEUyAxCisjZGVmaW5lIFJJTkdfQlVGRkVSX1NJWkUgMTAwMAorI2RlZmluZSBXUklURV9CVUZGRVJfU0laRSAzNAorI2RlZmluZSBUUkFOWlBPUlRfVVNCX1RJTUVPVVQgMTAKKworCitzdGF0aWMgaW50IGRlYnVnID0gMDsKKworLyogVXNlIG91ciBvd24gZGJnIG1hY3JvICovCisjZGVmaW5lIGRiZ19pbmZvKGRldiwgZm9ybWF0LCBhcmcuLi4pIGRvIHsgaWYgKGRlYnVnKSBkZXZfaW5mbyhkZXYgLCBmb3JtYXQgLCAjIyBhcmcpOyB9IHdoaWxlICgwKQorCisvKiBNb2R1bGUgcGFyYW1ldGVycyAqLworCittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGVuYWJsZWQgb3Igbm90Iik7CisKKy8qIEFsbCBpbnRlcnJ1cHQgaW4gdHJhbnNmZXJzIGFyZSBjb2xsZWN0ZWQgaW4gYSByaW5nIGJ1ZmZlciB0bworICogYXZvaWQgcmFjaW5nIGNvbmRpdGlvbnMgYW5kIGdldCBiZXR0ZXIgcGVyZm9ybWFuY2Ugb2YgdGhlIGRyaXZlci4KKyAqLworCitzdGF0aWMgaW50IHJpbmdfYnVmZmVyX3NpemUgPSBSSU5HX0JVRkZFUl9TSVpFOworCittb2R1bGVfcGFyYW0ocmluZ19idWZmZXJfc2l6ZSwgaW50LCAgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKHJpbmdfYnVmZmVyX3NpemUsICJSZWFkIHJpbmcgYnVmZmVyIHNpemUgaW4gcmVwb3J0cyIpOworCisvKiBUaGUgd3JpdGVfYnVmZmVyIGNhbiBvbmUgZGF5IGNvbnRhaW4gbW9yZSB0aGFuIG9uZSBpbnRlcnJ1cHQgb3V0IHRyYW5zZmVyLgorICovCitzdGF0aWMgaW50IHdyaXRlX2J1ZmZlcl9zaXplID0gV1JJVEVfQlVGRkVSX1NJWkU7Cittb2R1bGVfcGFyYW0od3JpdGVfYnVmZmVyX3NpemUsIGludCwgIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyh3cml0ZV9idWZmZXJfc2l6ZSwgIldyaXRlIGJ1ZmZlciBzaXplIik7CisKKy8qCisgKiBJbmNyZWFzZSB0aGUgaW50ZXJ2YWwgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KKyAqIG9yIHNldCB0byAxIHRvIHVzZSB0aGUgc3RhbmRhcmQgaW50ZXJ2YWwgZnJvbSB0aGUgZW5kcG9pbnQgZGVzY3JpcHRvcnMuCisgKi8KKworc3RhdGljIGludCBtaW5faW50ZXJydXB0X2luX2ludGVydmFsID0gVFJBTlpQT1JUX1VTQl9USU1FT1VUOworbW9kdWxlX3BhcmFtKG1pbl9pbnRlcnJ1cHRfaW5faW50ZXJ2YWwsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1pbl9pbnRlcnJ1cHRfaW5faW50ZXJ2YWwsICJNaW5pbXVtIGludGVycnVwdCBpbiBpbnRlcnZhbCBpbiBtcyIpOworCitzdGF0aWMgaW50IG1pbl9pbnRlcnJ1cHRfb3V0X2ludGVydmFsID0gVFJBTlpQT1JUX1VTQl9USU1FT1VUOworbW9kdWxlX3BhcmFtKG1pbl9pbnRlcnJ1cHRfb3V0X2ludGVydmFsLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtaW5faW50ZXJydXB0X291dF9pbnRlcnZhbCwgIk1pbmltdW0gaW50ZXJydXB0IG91dCBpbnRlcnZhbCBpbiBtcyIpOworCitzdHJ1Y3QgdHJhbnpwb3J0X2NtZCB7CisgICAgdW5zaWduZWQgY2hhciBjbWRbOF07Cit9OworCitlbnVtIExpZ2h0SUQgeworCUxpZ2h0UmVjb3JkID0gMCwKKwlMaWdodFRyYWNrcmVjLAorCUxpZ2h0VHJhY2ttdXRlLAorCUxpZ2h0VHJhY2tzb2xvLAorCUxpZ2h0QW55c29sbywKKwlMaWdodExvb3AsCisJTGlnaHRQdW5jaAorCX07CisKKy8qIFN0cnVjdHVyZSB0byBob2xkIGFsbCBvZiBvdXIgZGV2aWNlIHNwZWNpZmljIHN0dWZmICovCisKK3N0cnVjdCB1c2JfdHJhbnpwb3J0IHsKKwlzdHJ1Y3Qgc2VtYXBob3JlCXNlbTsJCS8qIGxvY2tzIHRoaXMgc3RydWN0dXJlICovCisJc3RydWN0IHVzYl9pbnRlcmZhY2UqCWludGY7CQkvKiBzYXZlIG9mZiB0aGUgdXNiIGludGVyZmFjZSBwb2ludGVyICovCisKKwlpbnQJCQlvcGVuX2NvdW50OwkvKiBudW1iZXIgb2YgdGltZXMgdGhpcyBwb3J0IGhhcyBiZWVuIG9wZW5lZCAqLworCisJc3RydWN0IHRyYW56cG9ydF9jbWQJKCpyaW5nX2J1ZmZlcilbUklOR19CVUZGRVJfU0laRV07IC8qIGp1c3QgbWFrZSBjIGhhcHB5ICovCisJdW5zaWduZWQgaW50CQlyaW5nX2hlYWQ7CisJdW5zaWduZWQgaW50CQlyaW5nX3RhaWw7CisKKwl3YWl0X3F1ZXVlX2hlYWRfdAlyZWFkX3dhaXQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QJd3JpdGVfd2FpdDsKKworCXVuc2lnbmVkIGNoYXIqCQlpbnRlcnJ1cHRfaW5fYnVmZmVyOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciogaW50ZXJydXB0X2luX2VuZHBvaW50OworCXN0cnVjdCB1cmIqCQlpbnRlcnJ1cHRfaW5fdXJiOworCWludAkJCWludGVycnVwdF9pbl9pbnRlcnZhbDsKKwlzaXplX3QJaW50ZXJydXB0X2luX2VuZHBvaW50X3NpemU7CisJaW50CQkJaW50ZXJydXB0X2luX3J1bm5pbmc7CisJaW50CQkJaW50ZXJydXB0X2luX2RvbmU7CisKKwljaGFyKgkJCWludGVycnVwdF9vdXRfYnVmZmVyOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciogaW50ZXJydXB0X291dF9lbmRwb2ludDsKKwlzdHJ1Y3QgdXJiKgkJaW50ZXJydXB0X291dF91cmI7CisJaW50CQkJaW50ZXJydXB0X291dF9pbnRlcnZhbDsKKwlzaXplX3QJaW50ZXJydXB0X291dF9lbmRwb2ludF9zaXplOworCWludAkJCWludGVycnVwdF9vdXRfYnVzeTsKKworCS8qIFN5c2ZzIGFuZCB0cmFuc2xhdGlvbiBzdXBwb3J0ICovCisKKwlpbnQgZXZlbnQ7IC8qIGFsdGVybmF0ZSBpbnRlcmZhY2UgdG8gZXZlbnRzICovCisJaW50IHdoZWVsOyAvKiAtIGZvciBuZWdhdGl2ZSwgMCBmb3Igbm9uZSwgKyBmb3IgcG9zaXRpdmUgKi8KKwl1bnNpZ25lZCBjaGFyIGR1bXBfc3RhdGU7IC8qIDAgaWYgZGlzYWJsZWQgMSBpZiBlbmFibGVkICovCisJdW5zaWduZWQgY2hhciBlbmFibGU7IC8qIDAgaWYgZGlzYWJsZWQgMSBpZiBlbmFibGVkICovCisJdW5zaWduZWQgY2hhciBvZmZsaW5lOyAvKiBpZiB0aGUgZGV2aWNlIGlzIG91dCBvZiByYW5nZSBvciBhc2xlZXAgKi8KKwl1bnNpZ25lZCBjaGFyIGNvbXByZXNzX3doZWVsOyAvKiBmbGFnIHRvIGNvbXByZXNzIHdoZWVsIGV2ZW50cyAqLworCXVuc2lnbmVkIGNoYXIgbGlnaHQ7IC8qIDcgYml0cyB1c2VkICovCisJdW5zaWduZWQgY2hhciBsYXN0X2NtZFs4XTsKKwl1bnNpZ25lZCBjaGFyIGxhc3RfaW5wdXRbOF07CisJdW5zaWduZWQgY2hhciBzY3JlZW5bNDBdOyAvLyBXZSdsbCBhbHNvIGhhdmUgY2VsbHMKKworfTsKKworLyogcHJldmVudCByYWNlcyBiZXR3ZWVuIG9wZW4oKSBhbmQgZGlzY29ubmVjdCgpICovCitzdGF0aWMgREVGSU5FX01VVEVYKGRpc2Nvbm5lY3RfbXV0ZXgpOworCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgdXNiX3RyYW56cG9ydF9kcml2ZXI7CisKKy8qKgorICoJdXNiX3RyYW56cG9ydF9hYm9ydF90cmFuc2ZlcnMKKyAqICAgICAgYWJvcnRzIHRyYW5zZmVycyBhbmQgZnJlZXMgYXNzb2NpYXRlZCBkYXRhIHN0cnVjdHVyZXMKKyAqLworc3RhdGljIHZvaWQgdXNiX3RyYW56cG9ydF9hYm9ydF90cmFuc2ZlcnMoc3RydWN0IHVzYl90cmFuenBvcnQgKmRldikKK3sKKwkvKiBzaHV0ZG93biB0cmFuc2ZlciAqLworCWlmIChkZXYtPmludGVycnVwdF9pbl9ydW5uaW5nKSB7CisJCWRldi0+aW50ZXJydXB0X2luX3J1bm5pbmcgPSAwOworCQlpZiAoZGV2LT5pbnRmKQorCQkJdXNiX2tpbGxfdXJiKGRldi0+aW50ZXJydXB0X2luX3VyYik7CisJfQorCWlmIChkZXYtPmludGVycnVwdF9vdXRfYnVzeSkKKwkJaWYgKGRldi0+aW50ZikKKwkJCXVzYl9raWxsX3VyYihkZXYtPmludGVycnVwdF9vdXRfdXJiKTsKK30KKworLy8gRklYTUUgfmxpZ2h0IG5vdCBnb29kIGVub3VnaCBvciBjb3JyZWN0IC0gbmVlZCBhdG9taWMgc2V0X2JpdAorCisjZGVmaW5lIHNob3dfc2V0X2xpZ2h0KHZhbHVlKQlcCitzdGF0aWMgc3NpemVfdCBzaG93XyMjdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsJCVwKKwlzdHJ1Y3QgdXNiX3RyYW56cG9ydCAqdCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CQlcCisJZW51bSBMaWdodElEIGxpZ2h0ID0gdmFsdWU7CQkJCQlcCisJaW50IHRlbXAgPSAoMSAmJiAodC0+bGlnaHQgJiAoMSA8PCBsaWdodCkpKTsJCQlcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHRlbXAgKTsJCQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF8jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwkJXAorCXN0cnVjdCB1c2JfdHJhbnpwb3J0ICp0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsJCVwKKwlpbnQgdGVtcCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwkJCVwKKwllbnVtIExpZ2h0SUQgbGlnaHQgPSAodGVtcCA8PCB2YWx1ZSkgJiAodC0+bGlnaHQgPDwgdmFsdWUpOwlcCisJdC0+bGlnaHQgPSAodC0+bGlnaHQgJiB+bGlnaHQpIDsJCQkJXAorCXJldHVybiBjb3VudDsJCQkJCQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUih2YWx1ZSwgU19JV1VHTyB8IFNfSVJVR08sIHNob3dfIyN2YWx1ZSwgc2V0XyMjdmFsdWUpOworCitzaG93X3NldF9saWdodChMaWdodFJlY29yZCk7CitzaG93X3NldF9saWdodChMaWdodFRyYWNrcmVjKTsKK3Nob3dfc2V0X2xpZ2h0KExpZ2h0VHJhY2ttdXRlKTsKK3Nob3dfc2V0X2xpZ2h0KExpZ2h0VHJhY2tzb2xvKTsKK3Nob3dfc2V0X2xpZ2h0KExpZ2h0QW55c29sbyk7CitzaG93X3NldF9saWdodChMaWdodExvb3ApOworc2hvd19zZXRfbGlnaHQoTGlnaHRQdW5jaCk7CisKKworI2RlZmluZSBzaG93X3NldF9pbnQodmFsdWUpCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfIyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwkJXAorCXN0cnVjdCB1c2JfdHJhbnpwb3J0ICp0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsJCQlcCisJCQkJCQkJCQlcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHQtPnZhbHVlKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0XyMjdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CQlcCisJc3RydWN0IHVzYl90cmFuenBvcnQgKnQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwkJCVwKKwlpbnQgdGVtcCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwkJCVwKKwkJCQkJCQkJCVwKKwl0LT52YWx1ZSA9IHRlbXA7CQkJCQkJXAorCXJldHVybiBjb3VudDsJCQkJCQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUih2YWx1ZSwgU19JV1VHTyB8IFNfSVJVR08sIHNob3dfIyN2YWx1ZSwgc2V0XyMjdmFsdWUpOworCitzaG93X3NldF9pbnQoZW5hYmxlKTsKK3Nob3dfc2V0X2ludChvZmZsaW5lKTsKK3Nob3dfc2V0X2ludChjb21wcmVzc193aGVlbCk7CitzaG93X3NldF9pbnQoZHVtcF9zdGF0ZSk7CitzaG93X3NldF9pbnQod2hlZWwpOworc2hvd19zZXRfaW50KGV2ZW50KTsKKworI2RlZmluZSBzaG93X3NldF9jbWQodmFsdWUpCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfIyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwkJXAorCXN0cnVjdCB1c2JfdHJhbnpwb3J0ICp0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsJCQlcCisJCQkJCQkJCQlcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHQtPnZhbHVlKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0XyMjdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CQlcCisJc3RydWN0IHVzYl90cmFuenBvcnQgKnQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwkJCVwKKwlpbnQgdGVtcCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwkJCVwKKwkJCQkJCQkJCVwKKwl0LT52YWx1ZSA9IHRlbXA7CQkJCQkJXAorCXJldHVybiBjb3VudDsJCQkJCQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUih2YWx1ZSwgU19JV1VHTyB8IFNfSVJVR08sIHNob3dfIyN2YWx1ZSwgc2V0XyMjdmFsdWUpOworCisKKworCisvKioKKyAqCXVzYl90cmFuenBvcnRfZGVsZXRlCisgKi8KK3N0YXRpYyB2b2lkIHVzYl90cmFuenBvcnRfZGVsZXRlKHN0cnVjdCB1c2JfdHJhbnpwb3J0ICpkZXYpCit7CisJdXNiX3RyYW56cG9ydF9hYm9ydF90cmFuc2ZlcnMoZGV2KTsKKwkvKiAgVGhpcyBpcyBqdXN0IHRvbyB0d2lzdGVkIHRvIGJlIGNvcnJlY3QgKi8KKwlpZihkZXYtPmludGYgIT0gTlVMTCkgeworCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5pbnRmLT5kZXYsICZkZXZfYXR0cl9MaWdodFJlY29yZCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmludGYtPmRldiwgJmRldl9hdHRyX0xpZ2h0VHJhY2tyZWMpOworCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5pbnRmLT5kZXYsICZkZXZfYXR0cl9MaWdodFRyYWNrbXV0ZSk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmludGYtPmRldiwgJmRldl9hdHRyX0xpZ2h0VHJhY2tzb2xvKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+aW50Zi0+ZGV2LCAmZGV2X2F0dHJfTGlnaHRUcmFja211dGUpOworCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5pbnRmLT5kZXYsICZkZXZfYXR0cl9MaWdodEFueXNvbG8pOworCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5pbnRmLT5kZXYsICZkZXZfYXR0cl9MaWdodExvb3ApOworCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5pbnRmLT5kZXYsICZkZXZfYXR0cl9MaWdodFB1bmNoKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+aW50Zi0+ZGV2LCAmZGV2X2F0dHJfd2hlZWwpOworCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5pbnRmLT5kZXYsICZkZXZfYXR0cl9lbmFibGUpOworCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5pbnRmLT5kZXYsICZkZXZfYXR0cl9ldmVudCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmludGYtPmRldiwgJmRldl9hdHRyX29mZmxpbmUpOworCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5pbnRmLT5kZXYsICZkZXZfYXR0cl9jb21wcmVzc193aGVlbCk7CisKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+aW50Zi0+ZGV2LCAmZGV2X2F0dHJfZHVtcF9zdGF0ZSk7CisJfQorCisJLyogZnJlZSBkYXRhIHN0cnVjdHVyZXMgKi8KKwl1c2JfZnJlZV91cmIoZGV2LT5pbnRlcnJ1cHRfaW5fdXJiKTsKKwl1c2JfZnJlZV91cmIoZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYik7CisJa2ZyZWUoZGV2LT5yaW5nX2J1ZmZlcik7CisJa2ZyZWUoZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyKTsKKwlrZnJlZShkZXYtPmludGVycnVwdF9vdXRfYnVmZmVyKTsKKwlrZnJlZShkZXYpOworfQorCisvKioKKyAqCXVzYl90cmFuenBvcnRfaW50ZXJydXB0X2luX2NhbGxiYWNrCisgKi8KKworc3RhdGljIHZvaWQgdXNiX3RyYW56cG9ydF9pbnRlcnJ1cHRfaW5fY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCB1c2JfdHJhbnpwb3J0ICpkZXYgPSB1cmItPmNvbnRleHQ7CisJdW5zaWduZWQgaW50IG5leHRfcmluZ19oZWFkOworCWludCByZXR2YWwgPSAtMTsKKworCWlmICh1cmItPnN0YXR1cykgeworCQlpZiAodXJiLT5zdGF0dXMgPT0gLUVOT0VOVCB8fAorCQkgICAgdXJiLT5zdGF0dXMgPT0gLUVDT05OUkVTRVQgfHwKKwkJICAgIHVyYi0+c3RhdHVzID09IC1FU0hVVERPV04pIHsKKwkJCWdvdG8gZXhpdDsKKwkJfSBlbHNlIHsKKwkJCWRiZ19pbmZvKCZkZXYtPmludGYtPmRldiwgIiVzOiBub256ZXJvIHN0YXR1cyByZWNlaXZlZDogJWRcbiIsCisJCQkJIF9fZnVuY19fLCB1cmItPnN0YXR1cyk7CisJCQlnb3RvIHJlc3VibWl0OyAvKiBtYXliZSB3ZSBjYW4gcmVjb3ZlciAqLworCQl9CisJfQorCisJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCAhPSA4KSB7CisJCWRldl93YXJuKCZkZXYtPmludGYtPmRldiwKKwkJCSAiVXJiIGxlbmd0aCB3YXMgJWQgYnl0ZXMhISBEbyBzb21ldGhpbmcgaW50ZWxsaWdlbnQgXG4iLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCX0gZWxzZSB7CisJCWRiZ19pbmZvKCZkZXYtPmludGYtPmRldiwgIiVzOiByZWNlaXZlZDogJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIsCisJCQkgX19mdW5jX18sIGRldi0+aW50ZXJydXB0X2luX2J1ZmZlclswXSxkZXYtPmludGVycnVwdF9pbl9idWZmZXJbMV0sZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyWzJdLGRldi0+aW50ZXJydXB0X2luX2J1ZmZlclszXSxkZXYtPmludGVycnVwdF9pbl9idWZmZXJbNF0sZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyWzVdLGRldi0+aW50ZXJydXB0X2luX2J1ZmZlcls2XSxkZXYtPmludGVycnVwdF9pbl9idWZmZXJbN10pOworI2lmIFNVUFBSRVNTX0VYVFJBX09GRkxJTkVfRVZFTlRTCisJCWlmKGRldi0+b2ZmbGluZSA9PSAyICYmIGRldi0+aW50ZXJydXB0X2luX2J1ZmZlclsxXSA9PSAweGZmKSB7IGdvdG8gcmVzdWJtaXQ7IH0KKwkJaWYoZGV2LT5vZmZsaW5lID09IDEgJiYgZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyWzFdID09IDB4ZmYpIHsgZGV2LT5vZmZsaW5lID0gMjsgZ290byByZXN1Ym1pdDsgfQorCisvKiBBbHdheXMgcGFzcyBvbmUgb2ZmbGluZSBldmVudCB1cCB0aGUgc3RhY2sgKi8KKwkJaWYoZGV2LT5vZmZsaW5lID4gMCAmJiBkZXYtPmludGVycnVwdF9pbl9idWZmZXJbMV0gIT0gMHhmZikgeyBkZXYtPm9mZmxpbmUgPSAwOyB9CisJCWlmKGRldi0+b2ZmbGluZSA9PSAwICYmIGRldi0+aW50ZXJydXB0X2luX2J1ZmZlclsxXSA9PSAweGZmKSB7IGRldi0+b2ZmbGluZSA9IDE7IH0KKworI2VuZGlmCisJCWRiZ19pbmZvKCZkZXYtPmludGYtPmRldiwgIiVzOiBoZWFkLCB0YWlsIGFyZSAleCwgJXhcbiIsIF9fZnVuY19fLGRldi0+cmluZ19oZWFkLGRldi0+cmluZ190YWlsKTsKKworCQluZXh0X3JpbmdfaGVhZCA9IChkZXYtPnJpbmdfaGVhZCsxKSAlIHJpbmdfYnVmZmVyX3NpemU7CisKKwkJaWYgKG5leHRfcmluZ19oZWFkICE9IGRldi0+cmluZ190YWlsKSB7CisJCQltZW1jcHkoJigoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ19oZWFkXSksIGRldi0+aW50ZXJydXB0X2luX2J1ZmZlciwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJCWRldi0+cmluZ19oZWFkID0gbmV4dF9yaW5nX2hlYWQ7CisJCQlyZXR2YWwgPSAwOworCQkJbWVtc2V0KGRldi0+aW50ZXJydXB0X2luX2J1ZmZlciwgMCwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJfSBlbHNlIHsKKwkJCWRldl93YXJuKCZkZXYtPmludGYtPmRldiwKKwkJCQkgIlJpbmcgYnVmZmVyIG92ZXJmbG93LCAlZCBieXRlcyBkcm9wcGVkXG4iLAorCQkJCSB1cmItPmFjdHVhbF9sZW5ndGgpOworCQkJbWVtc2V0KGRldi0+aW50ZXJydXB0X2luX2J1ZmZlciwgMCwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJfQorCX0KKworcmVzdWJtaXQ6CisJLyogcmVzdWJtaXQgaWYgd2UncmUgc3RpbGwgcnVubmluZyAqLworCWlmIChkZXYtPmludGVycnVwdF9pbl9ydW5uaW5nICYmIGRldi0+aW50ZikgeworCQlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYihkZXYtPmludGVycnVwdF9pbl91cmIsIEdGUF9BVE9NSUMpOworCQlpZiAocmV0dmFsKQorCQkJZGV2X2VycigmZGV2LT5pbnRmLT5kZXYsCisJCQkJInVzYl9zdWJtaXRfdXJiIGZhaWxlZCAoJWQpXG4iLCByZXR2YWwpOworCX0KKworZXhpdDoKKwlkZXYtPmludGVycnVwdF9pbl9kb25lID0gMTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRldi0+cmVhZF93YWl0KTsKK30KKworLyoqCisgKgl1c2JfdHJhbnpwb3J0X2ludGVycnVwdF9vdXRfY2FsbGJhY2sKKyAqLworc3RhdGljIHZvaWQgdXNiX3RyYW56cG9ydF9pbnRlcnJ1cHRfb3V0X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgdXNiX3RyYW56cG9ydCAqZGV2ID0gdXJiLT5jb250ZXh0OworCisJLyogc3luYy9hc3luYyB1bmxpbmsgZmF1bHRzIGFyZW4ndCBlcnJvcnMgKi8KKwlpZiAodXJiLT5zdGF0dXMgJiYgISh1cmItPnN0YXR1cyA9PSAtRU5PRU5UIHx8CisJCQkgICAgIHVyYi0+c3RhdHVzID09IC1FQ09OTlJFU0VUIHx8CisJCQkgICAgIHVyYi0+c3RhdHVzID09IC1FU0hVVERPV04pKQorCQlkYmdfaW5mbygmZGV2LT5pbnRmLT5kZXYsCisJCQkgIiVzIC0gbm9uemVybyB3cml0ZSBpbnRlcnJ1cHQgc3RhdHVzIHJlY2VpdmVkOiAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOworCisJZGV2LT5pbnRlcnJ1cHRfb3V0X2J1c3kgPSAwOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT53cml0ZV93YWl0KTsKK30KKworLyoqCisgKgl1c2JfdHJhbnpwb3J0X29wZW4KKyAqLworc3RhdGljIGludCB1c2JfdHJhbnpwb3J0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHVzYl90cmFuenBvcnQgKmRldjsKKwlpbnQgc3VibWlub3I7CisJaW50IHJldHZhbCA9IDA7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZTsKKworCW5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworCXN1Ym1pbm9yID0gaW1pbm9yKGlub2RlKTsKKworCW11dGV4X2xvY2soJmRpc2Nvbm5lY3RfbXV0ZXgpOworCisJaW50ZXJmYWNlID0gdXNiX2ZpbmRfaW50ZXJmYWNlKCZ1c2JfdHJhbnpwb3J0X2RyaXZlciwgc3VibWlub3IpOworCisJaWYgKCFpbnRlcmZhY2UpIHsKKwkJZXJyKCIlcyAtIGVycm9yLCBjYW4ndCBmaW5kIGRldmljZSBmb3IgbWlub3IgJWRcbiIsCisJCSAgICAgX19mdW5jX18sIHN1Ym1pbm9yKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byB1bmxvY2tfZGlzY29ubmVjdF9leGl0OworCX0KKworCWRldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKKworCWlmICghZGV2KSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gdW5sb2NrX2Rpc2Nvbm5lY3RfZXhpdDsKKwl9CisKKwkvKiBsb2NrIHRoaXMgZGV2aWNlICovCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZGV2LT5zZW0pKSB7CisJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJZ290byB1bmxvY2tfZGlzY29ubmVjdF9leGl0OworCX0KKworCS8qIGFsbG93IG9wZW5pbmcgb25seSBvbmNlICovCisJaWYgKGRldi0+b3Blbl9jb3VudCkgeworCQlyZXR2YWwgPSAtRUJVU1k7CisJCWdvdG8gdW5sb2NrX2V4aXQ7CisJfQorCWRldi0+b3Blbl9jb3VudCA9IDE7CisKKwkvKiBpbml0aWFsaXplIGluIGRpcmVjdGlvbiAqLworCWRldi0+cmluZ19oZWFkID0gMDsKKwlkZXYtPnJpbmdfdGFpbCA9IDA7CisJdXNiX2ZpbGxfaW50X3VyYihkZXYtPmludGVycnVwdF9pbl91cmIsCisJCQkgaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpLAorCQkJIHVzYl9yY3ZpbnRwaXBlKGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKSwKKwkJCQkJZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpLAorCQkJIGRldi0+aW50ZXJydXB0X2luX2J1ZmZlciwKKwkJCSBkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludF9zaXplLAorCQkJIHVzYl90cmFuenBvcnRfaW50ZXJydXB0X2luX2NhbGxiYWNrLAorCQkJIGRldiwKKwkJCSBkZXYtPmludGVycnVwdF9pbl9pbnRlcnZhbCk7CisKKwlkZXYtPmludGVycnVwdF9pbl9ydW5uaW5nID0gMTsKKwlkZXYtPmludGVycnVwdF9pbl9kb25lID0gMDsKKwlkZXYtPmVuYWJsZSA9IDE7CisJZGV2LT5vZmZsaW5lID0gMDsKKwlkZXYtPmNvbXByZXNzX3doZWVsID0gMTsKKworCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKGRldi0+aW50ZXJydXB0X2luX3VyYiwgR0ZQX0tFUk5FTCk7CisJaWYgKHJldHZhbCkgeworCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIkNvdWxkbid0IHN1Ym1pdCBpbnRlcnJ1cHRfaW5fdXJiICVkXG4iLCByZXR2YWwpOworCQlkZXYtPmludGVycnVwdF9pbl9ydW5uaW5nID0gMDsKKwkJZGV2LT5vcGVuX2NvdW50ID0gMDsKKwkJZ290byB1bmxvY2tfZXhpdDsKKwl9CisKKwkvKiBzYXZlIGRldmljZSBpbiB0aGUgZmlsZSdzIHByaXZhdGUgc3RydWN0dXJlICovCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZGV2OworCisKK3VubG9ja19leGl0OgorCXVwKCZkZXYtPnNlbSk7CisKK3VubG9ja19kaXNjb25uZWN0X2V4aXQ6CisJbXV0ZXhfdW5sb2NrKCZkaXNjb25uZWN0X211dGV4KTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICoJdXNiX3RyYW56cG9ydF9yZWxlYXNlCisgKi8KK3N0YXRpYyBpbnQgdXNiX3RyYW56cG9ydF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCB1c2JfdHJhbnpwb3J0ICpkZXY7CisJaW50IHJldHZhbCA9IDA7CisKKwlkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBleGl0OworCX0KKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmRldi0+c2VtKSkgeworCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAoZGV2LT5vcGVuX2NvdW50ICE9IDEpIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byB1bmxvY2tfZXhpdDsKKwl9CisKKwlpZiAoZGV2LT5pbnRmID09IE5VTEwpIHsKKwkJLyogdGhlIGRldmljZSB3YXMgdW5wbHVnZ2VkIGJlZm9yZSB0aGUgZmlsZSB3YXMgcmVsZWFzZWQgKi8KKwkJdXAoJmRldi0+c2VtKTsKKwkJLyogdW5sb2NrIGhlcmUgYXMgdXNiX3RyYW56cG9ydF9kZWxldGUgZnJlZXMgZGV2ICovCisJCXVzYl90cmFuenBvcnRfZGVsZXRlKGRldik7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiB3YWl0IHVudGlsIHdyaXRlIHRyYW5zZmVyIGlzIGZpbmlzaGVkICovCisJaWYgKGRldi0+aW50ZXJydXB0X291dF9idXN5KQorCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChkZXYtPndyaXRlX3dhaXQsICFkZXYtPmludGVycnVwdF9vdXRfYnVzeSwgMiAqIEhaKTsKKwl1c2JfdHJhbnpwb3J0X2Fib3J0X3RyYW5zZmVycyhkZXYpOworCWRldi0+b3Blbl9jb3VudCA9IDA7CisKK3VubG9ja19leGl0OgorCXVwKCZkZXYtPnNlbSk7CisKK2V4aXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKgl1c2JfdHJhbnpwb3J0X3BvbGwKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCB1c2JfdHJhbnpwb3J0X3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJc3RydWN0IHVzYl90cmFuenBvcnQgKmRldjsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisKKwlkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlwb2xsX3dhaXQoZmlsZSwgJmRldi0+cmVhZF93YWl0LCB3YWl0KTsKKwlwb2xsX3dhaXQoZmlsZSwgJmRldi0+d3JpdGVfd2FpdCwgd2FpdCk7CisKKwlpZiAoZGV2LT5yaW5nX2hlYWQgIT0gZGV2LT5yaW5nX3RhaWwpCisJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwlpZiAoIWRldi0+aW50ZXJydXB0X291dF9idXN5KQorCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCisJcmV0dXJuIG1hc2s7Cit9CisKKy8qKgorICoJdXNiX3RyYW56cG9ydF9yZWFkCisgKi8KK3N0YXRpYyBzc2l6ZV90IHVzYl90cmFuenBvcnRfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LAorCQkJICAgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCB1c2JfdHJhbnpwb3J0ICpkZXY7CisJaW50IHJldHZhbCA9IDA7CisKKyNpZiBCVUZGRVJFRF9SRUFEUworCWludCBjID0gMDsKKyNlbmRpZgorCisjaWYgQ09NUFJFU1NfV0hFRUxfRVZFTlRTCisJc2lnbmVkIGNoYXIgb2xkd2hlZWw7CisJc2lnbmVkIGNoYXIgbmV3d2hlZWw7CisJaW50IGNhbmNvbXByZXNzID0gMTsKKwlpbnQgbmV4dF90YWlsOworI2VuZGlmCisKKy8qIGRvIEkgaGF2ZSBzdWNoIGEgdGhpbmcgYXMgYSBudWxsIGV2ZW50PyAqLworCisJZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJLyogdmVyaWZ5IHRoYXQgd2UgYWN0dWFsbHkgaGF2ZSBzb21lIGRhdGEgdG8gcmVhZCAqLworCWlmIChjb3VudCA9PSAwKQorCQlnb3RvIGV4aXQ7CisKKwkvKiBsb2NrIHRoaXMgb2JqZWN0ICovCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZGV2LT5zZW0pKSB7CisJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJZ290byBleGl0OworCX0KKworCS8qIHZlcmlmeSB0aGF0IHRoZSBkZXZpY2Ugd2Fzbid0IHVucGx1Z2dlZCAqLworCWlmIChkZXYtPmludGYgPT0gTlVMTCkgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQllcnIoIk5vIGRldmljZSBvciBkZXZpY2UgdW5wbHVnZ2VkICVkXG4iLCByZXR2YWwpOworCQlnb3RvIHVubG9ja19leGl0OworCX0KKworCXdoaWxlIChkZXYtPnJpbmdfaGVhZCA9PSBkZXYtPnJpbmdfdGFpbCkgeworCisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCWdvdG8gdW5sb2NrX2V4aXQ7CisJCX0KKwkJLy8gYXRvbWljX2NtcF9leGNoYW5nZSgmZGV2LT5pbnRlcnJ1cHRfaW5fZG9uZSwwLDApOworCQlkZXYtPmludGVycnVwdF9pbl9kb25lID0gMCA7IC8qIHRpbnkgcmFjZSAtIEZJWE1FOiBtYWtlIGF0b21pYz8gKi8KKwkJcmV0dmFsID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGRldi0+cmVhZF93YWl0LCBkZXYtPmludGVycnVwdF9pbl9kb25lKTsKKwkJaWYgKHJldHZhbCA8IDApIHsKKwkJCWdvdG8gdW5sb2NrX2V4aXQ7CisJCX0KKwl9CisKKwlkYmdfaW5mbygmZGV2LT5pbnRmLT5kZXYsICIlczogY29weWluZyB0byB1c2Vyc3BhY2U6ICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4XG4iLAorCQkJIF9fZnVuY19fLCAoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbMF0sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzFdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFsyXSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbM10sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzRdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFs1XSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbNl0sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzddKTsKKworI2lmIEJVRkZFUkVEX1JFQURTCisJICAgYyA9IDA7CisJICAgd2hpbGUoKGMgPCBjb3VudCkgJiYgKGRldi0+cmluZ190YWlsICE9IGRldi0+cmluZ19oZWFkKSkgeworCisvKiBUaGlzIHN0YXJ0ZWQgb2ZmIGluIHRoZSBsb3dlciBsZXZlbCBzZXJ2aWNlIHJvdXRpbmUsIGFuZCBJIG1vdmVkIGl0IGhlcmUuIFRoZW4gbXkgYnJhaW4gZGllZC4gTm90IGRvbmUgeWV0LiAqLworI2lmIENPTVBSRVNTX1dIRUVMX0VWRU5UUworCQluZXh0X3RhaWwgPSAoZGV2LT5yaW5nX3RhaWwrMSkgJSByaW5nX2J1ZmZlcl9zaXplOworCQlpZihkZXYtPmNvbXByZXNzX3doZWVsKSBjYW5jb21wcmVzcyA9IDE7CisJCXdoaWxlKGRldi0+cmluZ19oZWFkICE9IG5leHRfdGFpbCAmJiBjYW5jb21wcmVzcyA9PSAxICkgeworCQkJbmV3d2hlZWwgPSAoKmRldi0+cmluZ19idWZmZXIpW25leHRfdGFpbF0uY21kWzZdOworCQkJb2xkd2hlZWwgPSAoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbNl07CisJCQkvLyBpZiBib3RoIGFyZSB3aGVlbCBldmVudHMsIGFuZCBubyBidXR0b25zIGhhdmUgY2hhbmdlcyAoRklYTUUsIGRvIEkgaGF2ZSB0byBjaGVjaz8pLAorCQkJLy8gYW5kIHdlIGFyZSB0aGUgc2FtZSBzaWduLCB3ZSBjYW4gY29tcHJlc3MgKy0gN0YKKwkJCS8vIEZJWE1FOiBzYW5lciBjaGVjayBmb3Igb3ZlcmZsb3chIC0gbWF4IG9mICstIDdGCisJCQkvLyBGSVhNRSB0aGUgbWF0aCBpcyB3cm9uZyBmb3IgZ29pbmcgaW4gcmV2ZXJzZSwgYWN0dWFsbHksIGFzIHRoZSBtaWRpIHNwZWMgZG9lc24ndCBhbGxvdyBzaWduZWQgY2hhcnMKKworCWRiZ19pbmZvKCZkZXYtPmludGYtPmRldiwgIiVzOiB0cnlpbmcgdG8gY29tcHJlc3M6ICUwMnglMDJ4JTAyeCUwMnglMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJIF9fZnVuY19fLCAoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbMF0sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzFdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFsyXSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbM10sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzRdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFs1XSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbNl0sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzddKTsKKworCisJCQlpZigoKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzZdICE9IDAgJiYKKwkJCSAgICAoKmRldi0+cmluZ19idWZmZXIpW25leHRfdGFpbF0uY21kWzZdICE9IDAgKSAmJgorCQkJCSgobmV3d2hlZWwgPiAwICYmIG9sZHdoZWVsID4gMCkgfHwKKwkJCQkobmV3d2hlZWwgPCAwICYmIG9sZHdoZWVsIDwgMCkpICYmCisJCQkJKCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFsyXSA9PSAoKmRldi0+cmluZ19idWZmZXIpW25leHRfdGFpbF0uY21kWzJdKSAmJgorCQkJCSgoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbM10gPT0gKCpkZXYtPnJpbmdfYnVmZmVyKVtuZXh0X3RhaWxdLmNtZFszXSkgJiYKKwkJCQkoKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzRdID09ICgqZGV2LT5yaW5nX2J1ZmZlcilbbmV4dF90YWlsXS5jbWRbNF0pICYmCisJCQkJKCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFs1XSA9PSAoKmRldi0+cmluZ19idWZmZXIpW25leHRfdGFpbF0uY21kWzVdKSkKKyB7CisJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LCAiJXM6IHNob3VsZCBjb21wcmVzczogJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIsCisJCQkgX19mdW5jX18sICgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFswXSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbMV0sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzJdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFszXSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbNF0sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzVdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFs2XSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbN10pOworCisJCQkJbmV3d2hlZWwgKz0gb2xkd2hlZWw7CisJCQkJaWYob2xkd2hlZWwgPiAwICYmICEobmV3d2hlZWwgPiAwKSkgeworCQkJCQluZXd3aGVlbCA9IDB4N2Y7CisJCQkJCWNhbmNvbXByZXNzID0gMDsKKwkJCQl9CisJCQkJaWYob2xkd2hlZWwgPCAwICYmICEobmV3d2hlZWwgPCAwKSkgeworCQkJCQluZXd3aGVlbCA9IDB4ODA7CisJCQkJCWNhbmNvbXByZXNzID0gMDsKKwkJCQl9CisKKwkJCQkoKmRldi0+cmluZ19idWZmZXIpW25leHRfdGFpbF0uY21kWzZdID0gbmV3d2hlZWw7CisJCQkJZGV2LT5yaW5nX3RhaWwgPSBuZXh0X3RhaWw7CisJCQkJbmV4dF90YWlsID0gKGRldi0+cmluZ190YWlsKzEpICUgcmluZ19idWZmZXJfc2l6ZTsKKwkJCX0gZWxzZSB7CisJCQkJY2FuY29tcHJlc3MgPSAwOworCQkJfQorCQl9CisjZW5kaWYgLyogQ09NUFJFU1NfV0hFRUxfRVZFTlRTICovCisKKwkJaWYgKGNvcHlfdG9fdXNlcigmYnVmZmVyW2NdLCAmKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0sIDgpKSB7CisJCQlyZXR2YWwgPSAtRUZBVUxUOworCQkJZ290byB1bmxvY2tfZXhpdDsKKwkJfQorCisJCWRldi0+cmluZ190YWlsID0gKGRldi0+cmluZ190YWlsKzEpICUgcmluZ19idWZmZXJfc2l6ZTsKKwkJYys9ODsKKwkJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LCAiJXM6IGhlYWQsIHRhaWwgYXJlICV4LCAleFxuIiwgX19mdW5jX18sZGV2LT5yaW5nX2hlYWQsZGV2LT5yaW5nX3RhaWwpOworCSAgIH0KKwkgICByZXR2YWwgPSBjOworCisjZWxzZQorCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCAmKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0sIDgpKSB7CisJCXJldHZhbCA9IC1FRkFVTFQ7CisJCWdvdG8gdW5sb2NrX2V4aXQ7CisJfQorCisJZGV2LT5yaW5nX3RhaWwgPSAoZGV2LT5yaW5nX3RhaWwrMSkgJSByaW5nX2J1ZmZlcl9zaXplOworCWRiZ19pbmZvKCZkZXYtPmludGYtPmRldiwgIiVzOiBoZWFkLCB0YWlsIGFyZSAleCwgJXhcbiIsIF9fZnVuY19fLGRldi0+cmluZ19oZWFkLGRldi0+cmluZ190YWlsKTsKKworCXJldHZhbCA9IDg7CisjZW5kaWYgLyogQlVGRkVSRURfUkVBRFMgKi8KKwordW5sb2NrX2V4aXQ6CisJLyogdW5sb2NrIHRoZSBkZXZpY2UgKi8KKwl1cCgmZGV2LT5zZW0pOworCitleGl0OgorCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICoJdXNiX3RyYW56cG9ydF93cml0ZQorICovCitzdGF0aWMgc3NpemVfdCB1c2JfdHJhbnpwb3J0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCB1c2JfdHJhbnpwb3J0ICpkZXY7CisJc2l6ZV90IGJ5dGVzX3RvX3dyaXRlOworCWludCByZXR2YWwgPSAwOworCisJZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJLyogdmVyaWZ5IHRoYXQgd2UgYWN0dWFsbHkgaGF2ZSBzb21lIGRhdGEgdG8gd3JpdGUgKi8KKwlpZiAoY291bnQgPT0gMCkKKwkJZ290byBleGl0OworCisJLyogbG9jayB0aGlzIG9iamVjdCAqLworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmRldi0+c2VtKSkgeworCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiB2ZXJpZnkgdGhhdCB0aGUgZGV2aWNlIHdhc24ndCB1bnBsdWdnZWQgKi8KKwlpZiAoZGV2LT5pbnRmID09IE5VTEwpIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZXJyKCJObyBkZXZpY2Ugb3IgZGV2aWNlIHVucGx1Z2dlZCAlZFxuIiwgcmV0dmFsKTsKKwkJZ290byB1bmxvY2tfZXhpdDsKKwl9CisKKwkvKiB3YWl0IHVudGlsIHByZXZpb3VzIHRyYW5zZmVyIGlzIGZpbmlzaGVkICovCisJaWYgKGRldi0+aW50ZXJydXB0X291dF9idXN5KSB7CisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCWdvdG8gdW5sb2NrX2V4aXQ7CisJCX0KKwkJcmV0dmFsID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGRldi0+d3JpdGVfd2FpdCwgIWRldi0+aW50ZXJydXB0X291dF9idXN5KTsKKwkJaWYgKHJldHZhbCA8IDApIHsKKwkJCWdvdG8gdW5sb2NrX2V4aXQ7CisJCX0KKwl9CisKKwkvKiB3cml0ZSB0aGUgZGF0YSBpbnRvIGludGVycnVwdF9vdXRfYnVmZmVyIGZyb20gdXNlcnNwYWNlICovCisJYnl0ZXNfdG9fd3JpdGUgPSBtaW4oY291bnQsIHdyaXRlX2J1ZmZlcl9zaXplKmRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludF9zaXplKTsKKwlpZiAoYnl0ZXNfdG9fd3JpdGUgPCBjb3VudCkKKwkJZGV2X3dhcm4oJmRldi0+aW50Zi0+ZGV2LCAiV3JpdGUgYnVmZmVyIG92ZXJmbG93LCAlemQgYnl0ZXMgZHJvcHBlZFxuIixjb3VudC1ieXRlc190b193cml0ZSk7CisKKwlkYmdfaW5mbygmZGV2LT5pbnRmLT5kZXYsICIlczogY291bnQgPSAlemQsIGJ5dGVzX3RvX3dyaXRlID0gJXpkXG4iLCBfX2Z1bmNfXywgY291bnQsIGJ5dGVzX3RvX3dyaXRlKTsKKworCWlmIChjb3B5X2Zyb21fdXNlcihkZXYtPmludGVycnVwdF9vdXRfYnVmZmVyLCBidWZmZXIsIGJ5dGVzX3RvX3dyaXRlKSkgeworCQlyZXR2YWwgPSAtRUZBVUxUOworCQlnb3RvIHVubG9ja19leGl0OworCX0KKworCWlmIChkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQgPT0gTlVMTCkgeworCQllcnIoIkVuZHBvaW50IHNob3VsZCBub3QgYmUgYmUgbnVsbCEgXG4iKTsKKwkJZ290byB1bmxvY2tfZXhpdDsKKwl9CisKKwkvKiBzZW5kIG9mZiB0aGUgdXJiICovCisJdXNiX2ZpbGxfaW50X3VyYihkZXYtPmludGVycnVwdF9vdXRfdXJiLAorCQkJIGludGVyZmFjZV90b191c2JkZXYoZGV2LT5pbnRmKSwKKwkJCSB1c2Jfc25kaW50cGlwZShpbnRlcmZhY2VfdG9fdXNiZGV2KGRldi0+aW50ZiksCisJCQkJCWRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyksCisJCQkgZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlciwKKwkJCSBieXRlc190b193cml0ZSwKKwkJCSB1c2JfdHJhbnpwb3J0X2ludGVycnVwdF9vdXRfY2FsbGJhY2ssCisJCQkgZGV2LAorCQkJIGRldi0+aW50ZXJydXB0X291dF9pbnRlcnZhbCk7CisKKwlkZXYtPmludGVycnVwdF9vdXRfYnVzeSA9IDE7CisJd21iKCk7CisKKwlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYihkZXYtPmludGVycnVwdF9vdXRfdXJiLCBHRlBfS0VSTkVMKTsKKwlpZiAocmV0dmFsKSB7CisJCWRldi0+aW50ZXJydXB0X291dF9idXN5ID0gMDsKKwkJZXJyKCJDb3VsZG4ndCBzdWJtaXQgaW50ZXJydXB0X291dF91cmIgJWRcbiIsIHJldHZhbCk7CisJCWdvdG8gdW5sb2NrX2V4aXQ7CisJfQorCXJldHZhbCA9IGJ5dGVzX3RvX3dyaXRlOworCit1bmxvY2tfZXhpdDoKKwkvKiB1bmxvY2sgdGhlIGRldmljZSAqLworCXVwKCZkZXYtPnNlbSk7CisKK2V4aXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworLyogZmlsZSBvcGVyYXRpb25zIG5lZWRlZCB3aGVuIHdlIHJlZ2lzdGVyIHRoaXMgZHJpdmVyICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1c2JfdHJhbnpwb3J0X2ZvcHMgPSB7CisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLnJlYWQgID0JdXNiX3RyYW56cG9ydF9yZWFkLAorCS53cml0ZSA9CXVzYl90cmFuenBvcnRfd3JpdGUsCisJLm9wZW4gPQkJdXNiX3RyYW56cG9ydF9vcGVuLAorCS5yZWxlYXNlID0JdXNiX3RyYW56cG9ydF9yZWxlYXNlLAorCS5wb2xsID0JCXVzYl90cmFuenBvcnRfcG9sbCwKK307CisKKy8qCisgKiB1c2IgY2xhc3MgZHJpdmVyIGluZm8gaW4gb3JkZXIgdG8gZ2V0IGEgbWlub3IgbnVtYmVyIGZyb20gdGhlIHVzYiBjb3JlLAorICogYW5kIHRvIGhhdmUgdGhlIGRldmljZSByZWdpc3RlcmVkIHdpdGggdGhlIGRyaXZlciBjb3JlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2NsYXNzX2RyaXZlciB1c2JfdHJhbnpwb3J0X2NsYXNzID0geworCS5uYW1lID0JCSJ0cmFuenBvcnQlZCIsCisJLmZvcHMgPQkJJnVzYl90cmFuenBvcnRfZm9wcywKKwkubWlub3JfYmFzZSA9CVVTQl9UUkFOWlBPUlRfTUlOT1JfQkFTRSwKK307CisKKworLyoqCisgKgl1c2JfdHJhbnpwb3J0X3Byb2JlCisgKgorICoJQ2FsbGVkIGJ5IHRoZSB1c2IgY29yZSB3aGVuIGEgbmV3IGRldmljZSBpcyBjb25uZWN0ZWQgdGhhdCBpdCB0aGlua3MKKyAqCXRoaXMgZHJpdmVyIG1pZ2h0IGJlIGludGVyZXN0ZWQgaW4uCisgKi8KK3N0YXRpYyBpbnQgdXNiX3RyYW56cG9ydF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlzdHJ1Y3QgdXNiX3RyYW56cG9ydCAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppZmFjZV9kZXNjOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CisJaW50IGk7CisJaW50IHRydWVfc2l6ZTsKKwlpbnQgcmV0dmFsID0gLUVOT01FTTsKKworCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3Igb3VyIGRldmljZSBzdGF0ZSBhbmQgaW50aWFsaXplIGl0ICovCisKKwlkZXYgPSBremFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRldiA9PSBOVUxMKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgIk91dCBvZiBtZW1vcnlcbiIpOworCQlnb3RvIGV4aXQ7CisJfQorCWluaXRfTVVURVgoJmRldi0+c2VtKTsKKwlkZXYtPmludGYgPSBpbnRmOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldi0+cmVhZF93YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXYtPndyaXRlX3dhaXQpOworCisJaWZhY2VfZGVzYyA9IGludGYtPmN1cl9hbHRzZXR0aW5nOworCisJLyogc2V0IHVwIHRoZSBlbmRwb2ludCBpbmZvcm1hdGlvbiAqLworCWZvciAoaSA9IDA7IGkgPCBpZmFjZV9kZXNjLT5kZXNjLmJOdW1FbmRwb2ludHM7ICsraSkgeworCQllbmRwb2ludCA9ICZpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjOworCisJCWlmICh1c2JfZW5kcG9pbnRfaXNfaW50X2luKGVuZHBvaW50KSkKKwkJCWRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50ID0gZW5kcG9pbnQ7CisKKwkJaWYgKHVzYl9lbmRwb2ludF9pc19pbnRfb3V0KGVuZHBvaW50KSkKKwkJCWRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludCA9IGVuZHBvaW50OworCX0KKwlpZiAoZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJJbnRlcnJ1cHQgaW4gZW5kcG9pbnQgbm90IGZvdW5kXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisJaWYgKGRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludCA9PSBOVUxMKQorCQlkZXZfd2FybigmaW50Zi0+ZGV2LCAiSW50ZXJydXB0IG91dCBlbmRwb2ludCBub3QgZm91bmQgKHVzaW5nIGNvbnRyb2wgZW5kcG9pbnQgaW5zdGVhZClcbiIpOworCisKKwlkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludF9zaXplID0gbGUxNl90b19jcHUoZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKTsKKworCWlmIChkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludF9zaXplICE9IDgpCisJICAgIGRldl93YXJuKCZpbnRmLT5kZXYsICJJbnRlcnJ1cHQgaW4gZW5kcG9pbnQgc2l6ZSBpcyBub3QgOCFcbiIpOworCisJaWYocmluZ19idWZmZXJfc2l6ZSA9PSAwKSB7IHJpbmdfYnVmZmVyX3NpemUgPSBSSU5HX0JVRkZFUl9TSVpFOyB9CisJdHJ1ZV9zaXplID0gbWluKHJpbmdfYnVmZmVyX3NpemUsUklOR19CVUZGRVJfU0laRSk7CisJLyogRklYTUUgLSB0aGVyZSBhcmUgbW9yZSB1c2JfYWxsb2Mgcm91dGluZXMgZm9yIGRtYSBjb3JyZWN0bmVzcy4gTmVlZGVkPyAqLworCisJZGV2LT5yaW5nX2J1ZmZlciA9IGttYWxsb2MoKHRydWVfc2l6ZSpzaXplb2Yoc3RydWN0IHRyYW56cG9ydF9jbWQpKSs4LCBHRlBfS0VSTkVMKTsKKworCWlmICghZGV2LT5yaW5nX2J1ZmZlcikgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSByaW5nX2J1ZmZlciBvZiBzaXplICVkXG4iLHRydWVfc2l6ZSk7CisJCWdvdG8gZXJyb3I7CisJfQorCWRldi0+aW50ZXJydXB0X2luX2J1ZmZlciA9IGttYWxsb2MoZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnRfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYtPmludGVycnVwdF9pbl9idWZmZXIpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgaW50ZXJydXB0X2luX2J1ZmZlclxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCWRldi0+aW50ZXJydXB0X2luX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYtPmludGVycnVwdF9pbl91cmIpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgaW50ZXJydXB0X2luX3VyYlxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCWRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludF9zaXplID0gZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50ID8gbGUxNl90b19jcHUoZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50LT53TWF4UGFja2V0U2l6ZSkgOgorCQkJCQkJCQkJIHVkZXYtPmRlc2NyaXB0b3IuYk1heFBhY2tldFNpemUwOworCisJaWYgKGRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludF9zaXplICE9OCkKKwkJZGV2X3dhcm4oJmludGYtPmRldiwgIkludGVycnVwdCBvdXQgZW5kcG9pbnQgc2l6ZSBpcyBub3QgOCEpXG4iKTsKKworCWRldi0+aW50ZXJydXB0X291dF9idWZmZXIgPSBrbWFsbG9jKHdyaXRlX2J1ZmZlcl9zaXplKmRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludF9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldi0+aW50ZXJydXB0X291dF9idWZmZXIpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgaW50ZXJydXB0X291dF9idWZmZXJcbiIpOworCQlnb3RvIGVycm9yOworCX0KKwlkZXYtPmludGVycnVwdF9vdXRfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldi0+aW50ZXJydXB0X291dF91cmIpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgaW50ZXJydXB0X291dF91cmJcbiIpOworCQlnb3RvIGVycm9yOworCX0KKwlkZXYtPmludGVycnVwdF9pbl9pbnRlcnZhbCA9IG1pbl9pbnRlcnJ1cHRfaW5faW50ZXJ2YWwgPiBkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludC0+YkludGVydmFsID8gbWluX2ludGVycnVwdF9pbl9pbnRlcnZhbCA6IGRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50LT5iSW50ZXJ2YWw7CisJaWYgKGRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludCkKKwkJZGV2LT5pbnRlcnJ1cHRfb3V0X2ludGVydmFsID0gbWluX2ludGVycnVwdF9vdXRfaW50ZXJ2YWwgPiBkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQtPmJJbnRlcnZhbCA/IG1pbl9pbnRlcnJ1cHRfb3V0X2ludGVydmFsIDogZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50LT5iSW50ZXJ2YWw7CisKKwkvKiB3ZSBjYW4gcmVnaXN0ZXIgdGhlIGRldmljZSBub3csIGFzIGl0IGlzIHJlYWR5ICovCisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBkZXYpOworCisJcmV0dmFsID0gdXNiX3JlZ2lzdGVyX2RldihpbnRmLCAmdXNiX3RyYW56cG9ydF9jbGFzcyk7CisJaWYgKHJldHZhbCkgeworCQkvKiBzb21ldGhpbmcgcHJldmVudGVkIHVzIGZyb20gcmVnaXN0ZXJpbmcgdGhpcyBkcml2ZXIgKi8KKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiTm90IGFibGUgdG8gZ2V0IGEgbWlub3IgZm9yIHRoaXMgZGV2aWNlLlxuIik7CisJCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJaWYoKHJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfTGlnaHRSZWNvcmQpKSkgZ290byBlcnJvcjsKKwlpZigocmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9MaWdodFRyYWNrcmVjKSkpIGdvdG8gZXJyb3I7CisJaWYoKHJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfTGlnaHRUcmFja211dGUpKSkgZ290byBlcnJvcjsKKwlpZigocmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9MaWdodFRyYWNrc29sbykpKSBnb3RvIGVycm9yOworCWlmKChyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX0xpZ2h0QW55c29sbykpKSBnb3RvIGVycm9yOworCWlmKChyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX0xpZ2h0TG9vcCkpKSBnb3RvIGVycm9yOworCWlmKChyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX0xpZ2h0UHVuY2gpKSkgZ290byBlcnJvcjsKKwlpZigocmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl93aGVlbCkpKSBnb3RvIGVycm9yOworCWlmKChyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX2V2ZW50KSkpIGdvdG8gZXJyb3I7CisJaWYoKHJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfZHVtcF9zdGF0ZSkpKSBnb3RvIGVycm9yOworCWlmKChyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX2NvbXByZXNzX3doZWVsKSkpIGdvdG8gZXJyb3I7CisJaWYoKHJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfZW5hYmxlKSkpIGdvdG8gZXJyb3I7CisJaWYoKHJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfb2ZmbGluZSkpKSBnb3RvIGVycm9yOworCisJLyogbGV0IHRoZSB1c2VyIGtub3cgd2hhdCBub2RlIHRoaXMgZGV2aWNlIGlzIG5vdyBhdHRhY2hlZCB0byAqLworCWRldl9pbmZvKCZpbnRmLT5kZXYsICJUcmFuenBvcnQgRGV2aWNlICMlZCBub3cgYXR0YWNoZWQgdG8gbWFqb3IgJWQgbWlub3IgJWRcbiIsCisJCShpbnRmLT5taW5vciAtIFVTQl9UUkFOWlBPUlRfTUlOT1JfQkFTRSksIFVTQl9NQUpPUiwgaW50Zi0+bWlub3IpOworCitleGl0OgorCXJldHVybiByZXR2YWw7CisKK2Vycm9yOgorCXVzYl90cmFuenBvcnRfZGVsZXRlKGRldik7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqCXVzYl90cmFuenBvcnRfZGlzY29ubmVjdAorICoKKyAqCUNhbGxlZCBieSB0aGUgdXNiIGNvcmUgd2hlbiB0aGUgZGV2aWNlIGlzIHJlbW92ZWQgZnJvbSB0aGUgc3lzdGVtLgorICovCitzdGF0aWMgdm9pZCB1c2JfdHJhbnpwb3J0X2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHVzYl90cmFuenBvcnQgKmRldjsKKwlpbnQgbWlub3I7CisJbXV0ZXhfbG9jaygmZGlzY29ubmVjdF9tdXRleCk7CisJZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOworCWRvd24oJmRldi0+c2VtKTsKKwltaW5vciA9IGludGYtPm1pbm9yOworCS8qIGdpdmUgYmFjayBvdXIgbWlub3IgKi8KKwl1c2JfZGVyZWdpc3Rlcl9kZXYoaW50ZiwgJnVzYl90cmFuenBvcnRfY2xhc3MpOworCisJLyogaWYgdGhlIGRldmljZSBpcyBub3Qgb3BlbmVkLCB0aGVuIHdlIGNsZWFuIHVwIHJpZ2h0IG5vdyAqLworCWlmICghZGV2LT5vcGVuX2NvdW50KSB7CisJCXVwKCZkZXYtPnNlbSk7CisJCXVzYl90cmFuenBvcnRfZGVsZXRlKGRldik7CisJfSBlbHNlIHsKKwkJZGV2LT5pbnRmID0gTlVMTDsKKwkJdXAoJmRldi0+c2VtKTsKKwl9CisKKwltdXRleF91bmxvY2soJmRpc2Nvbm5lY3RfbXV0ZXgpOworCisJZGV2X2luZm8oJmludGYtPmRldiwgIlRyYW56cG9ydCBTdXJmYWNlICMlZCBub3cgZGlzY29ubmVjdGVkXG4iLAorCQkgKG1pbm9yIC0gVVNCX1RSQU5aUE9SVF9NSU5PUl9CQVNFKSk7Cit9CisKKy8qIHVzYiBzcGVjaWZpYyBvYmplY3QgbmVlZGVkIHRvIHJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIHVzYiBzdWJzeXN0ZW0gKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciB1c2JfdHJhbnpwb3J0X2RyaXZlciA9IHsKKwkubmFtZSA9CQkidHJhbnpwb3J0IiwKKwkucHJvYmUgPQl1c2JfdHJhbnpwb3J0X3Byb2JlLAorCS5kaXNjb25uZWN0ID0JdXNiX3RyYW56cG9ydF9kaXNjb25uZWN0LAorCS5pZF90YWJsZSA9CXVzYl90cmFuenBvcnRfdGFibGUsCit9OworCisvKioKKyAqCXVzYl90cmFuenBvcnRfaW5pdAorICovCitzdGF0aWMgaW50IF9faW5pdCB1c2JfdHJhbnpwb3J0X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJLyogcmVnaXN0ZXIgdGhpcyBkcml2ZXIgd2l0aCB0aGUgVVNCIHN1YnN5c3RlbSAqLworCXJldHZhbCA9IHVzYl9yZWdpc3RlcigmdXNiX3RyYW56cG9ydF9kcml2ZXIpOworCWlmIChyZXR2YWwpCisJCWVycigidXNiX3JlZ2lzdGVyIGZhaWxlZCBmb3IgdGhlICJfX0ZJTEVfXyIgZHJpdmVyLiBFcnJvciBudW1iZXIgJWRcbiIsIHJldHZhbCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqCXVzYl90cmFuenBvcnRfZXhpdAorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgdXNiX3RyYW56cG9ydF9leGl0KHZvaWQpCit7CisJLyogZGVyZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSBVU0Igc3Vic3lzdGVtICovCisJdXNiX2RlcmVnaXN0ZXIoJnVzYl90cmFuenBvcnRfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodXNiX3RyYW56cG9ydF9pbml0KTsKK21vZHVsZV9leGl0KHVzYl90cmFuenBvcnRfZXhpdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvS2NvbmZpZwppbmRleCA1OTNmZGI3Li5mMmNmN2Y2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9LY29uZmlnCkBAIC0yNSwzICsyNSwxMyBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZ283MDA3LXVzYgogCitjb25maWcgVklERU9fR083MDA3X1VTQl9TMjI1MF9CT0FSRAorCXRyaXN0YXRlICJTZW5zb3JheSAyMjUwLzIyNTEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFZJREVPX0dPNzAwN19VU0IgJiYgRFZCX1VTQgorCWRlZmF1bHQgTgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSB2aWRlbzRsaW51eCBkcml2ZXIgZm9yIHRoZSBTZW5zb3JheSAyMjUwLzIyNTEgZGV2aWNlCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHMyMjUwLWJvYXJkCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L01ha2VmaWxlCmluZGV4IDliOTMxMGMuLmU1MTRiNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9NYWtlZmlsZQpAQCAtNSwxNCArNSwyMyBAQAogCiBvYmotJChDT05GSUdfVklERU9fR083MDA3KSArPSBnbzcwMDcubwogb2JqLSQoQ09ORklHX1ZJREVPX0dPNzAwN19VU0IpICs9IGdvNzAwNy11c2Iubworb2JqLSQoQ09ORklHX1ZJREVPX0dPNzAwN19VU0JfUzIyNTBfQk9BUkQpICs9IHMyMjUwLm8KIAotZ283MDA3LW9ianMgKz0gZ283MDA3LXY0bDIubyBnbzcwMDctZHJpdmVyLm8gZ283MDA3LWkyYy5vIGdvNzAwNy1mdy5vIHNuZC1nbzcwMDcubworZ283MDA3LW9ianMgKz0gZ283MDA3LXY0bDIubyBnbzcwMDctZHJpdmVyLm8gZ283MDA3LWkyYy5vIGdvNzAwNy1mdy5vIFwKKwkJc25kLWdvNzAwNy5vIHdpcy1zYWE3MTEzLm8KIAorczIyNTAtb2JqcyArPSBzMjI1MC1ib2FyZC5vIHMyMjUwLWxvYWRlci5vCiAKLSNpZm5lcSAoJChTQUE3MTM0X0JVSUxEKSwpCi0jb2JqLW0gKz0gc2FhNzEzNC1nbzcwMDcubworIyBVbmNvbXBpbGUgd2hlbiB0aGUgc2FhNzEzNCBwYXRjaGVzIGdldCBpbnRvIHVwc3RyZWFtCisjaWZuZXEgKCQoQ09ORklHX1ZJREVPX1NBQTcxMzQpLCkKKyNvYmotJChDT05GSUdfVklERU9fU0FBNzEzNCkgKz0gc2FhNzEzNC1nbzcwMDcubworI0VYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNAogI2VuZGlmCiAKK2lmbmVxICgkKENPTkZJR19WSURFT19HTzcwMDdfVVNCX1MyMjUwX0JPQVJEKSwpCitFWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiCitlbmRpZgorCiBFWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL3N0YWdpbmcvc2FhNzEzNAogRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzCiBFWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctZHJpdmVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy1kcml2ZXIuYwppbmRleCBlNGVhZDk2Li41OGJmYzhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy1kcml2ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy1kcml2ZXIuYwpAQCAtMjE3LDYgKzIxNyw5IEBACiAJY2FzZSBJMkNfRFJJVkVSSURfV0lTX09WNzY0MDoKIAkJbW9kbmFtZSA9ICJ3aXMtb3Y3NjQwIjsKIAkJYnJlYWs7CisJY2FzZSBJMkNfRFJJVkVSSURfUzIyNTA6CisJCW1vZG5hbWUgPSAiczIyNTAtYm9hcmQiOworCQlicmVhazsKIAlkZWZhdWx0OgogCQltb2RuYW1lID0gTlVMTDsKIAkJYnJlYWs7CkBAIC0yMjcsNyArMjMwLDcgQEAKIAkJcmV0dXJuIDA7CiAJaWYgKG1vZG5hbWUgIT0gTlVMTCkKIAkJcHJpbnRrKEtFUk5fSU5GTwotCQkJImdvNzAwNzogcHJvYmluZyBmb3IgbW9kdWxlICVzIGZhaWxlZCIsIG1vZG5hbWUpOworCQkJImdvNzAwNzogcHJvYmluZyBmb3IgbW9kdWxlICVzIGZhaWxlZFxuIiwgbW9kbmFtZSk7CiAJZWxzZQogCQlwcmludGsoS0VSTl9JTkZPCiAJCQkiZ283MDA3OiBzZW5zb3IgJXUgc2VlbXMgdG8gYmUgdW5zdXBwb3J0ZWQhXG4iLCBpZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy1mdy5jIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctZncuYwppbmRleCBhMGUxN2IwLi44NzFlZDQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy1mdy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LWZ3LmMKQEAgLTI4NCw3ICsyODQsNyBAQAogCTU4LCA1OSwgNTIsIDQ1LCAzOCwgMzEsIDM5LCA0NiwgNTMsIDYwLCA2MSwgNTQsIDQ3LCA1NSwgNjIsIDYzCiB9OwogCi1zdGF0aWMgaW50IGNvcHlfcGFja2FnZXModTE2ICpkZXN0LCB1MTYgKnNyYywgaW50IHBrZ19jbnQsIGludCBzcGFjZSkKK3N0YXRpYyBpbnQgY29weV9wYWNrYWdlcyhfX2xlMTYgKmRlc3QsIHUxNiAqc3JjLCBpbnQgcGtnX2NudCwgaW50IHNwYWNlKQogewogCWludCBpLCBjbnQgPSBwa2dfY250ICogMzI7CiAKQEAgLTI5Miw3ICsyOTIsNyBAQAogCQlyZXR1cm4gLTE7CiAKIAlmb3IgKGkgPSAwOyBpIDwgY250OyArK2kpCi0JCWRlc3RbaV0gPSBfX2NwdV90b19sZTE2KHNyY1tpXSk7CisJCWRlc3RbaV0gPSBjcHVfdG9fbGUxNnAoc3JjICsgaSk7CiAKIAlyZXR1cm4gY250OwogfQpAQCAtMzcyLDcgKzM3Miw3IEBACiAJcmV0dXJuIHA7CiB9CiAKLXN0YXRpYyBpbnQgZ2VuX21qcGVnaGRyX3RvX3BhY2thZ2Uoc3RydWN0IGdvNzAwNyAqZ28sIHUxNiAqY29kZSwgaW50IHNwYWNlKQorc3RhdGljIGludCBnZW5fbWpwZWdoZHJfdG9fcGFja2FnZShzdHJ1Y3QgZ283MDA3ICpnbywgX19sZTE2ICpjb2RlLCBpbnQgc3BhY2UpCiB7CiAJdTggKmJ1ZjsKIAl1MTYgbWVtID0gMHgzZTAwOwpAQCAtNjQzLDcgKzY0Myw3IEBACiB9CiAKIHN0YXRpYyBpbnQgZ2VuX21wZWcxaGRyX3RvX3BhY2thZ2Uoc3RydWN0IGdvNzAwNyAqZ28sCi0JCQkJCXUxNiAqY29kZSwgaW50IHNwYWNlLCBpbnQgKmZyYW1lbGVuKQorCQkJCQlfX2xlMTYgKmNvZGUsIGludCBzcGFjZSwgaW50ICpmcmFtZWxlbikKIHsKIAl1OCAqYnVmOwogCXUxNiBtZW0gPSAweDNlMDA7CkBAIC04MzEsNyArODMxLDcgQEAKIH0KIAogc3RhdGljIGludCBnZW5fbXBlZzRoZHJfdG9fcGFja2FnZShzdHJ1Y3QgZ283MDA3ICpnbywKLQkJCQkJdTE2ICpjb2RlLCBpbnQgc3BhY2UsIGludCAqZnJhbWVsZW4pCisJCQkJCV9fbGUxNiAqY29kZSwgaW50IHNwYWNlLCBpbnQgKmZyYW1lbGVuKQogewogCXU4ICpidWY7CiAJdTE2IG1lbSA9IDB4M2UwMDsKQEAgLTkzNiw3ICs5MzYsNyBAQAogfQogCiBzdGF0aWMgaW50IGJyY3RybF90b19wYWNrYWdlKHN0cnVjdCBnbzcwMDcgKmdvLAotCQkJCQl1MTYgKmNvZGUsIGludCBzcGFjZSwgaW50ICpmcmFtZWxlbikKKwkJCQkJX19sZTE2ICpjb2RlLCBpbnQgc3BhY2UsIGludCAqZnJhbWVsZW4pCiB7CiAJaW50IGNvbnZlcmdlX3NwZWVkID0gMDsKIAlpbnQgbGFtYmRhID0gKGdvLT5mb3JtYXQgPT0gR083MDA3X0ZPUk1BVF9NSlBFRyB8fCBnby0+ZHZkX21vZGUpID8KQEAgLTEwOTEsNyArMTA5MSw3IEBACiAJcmV0dXJuIGNvcHlfcGFja2FnZXMoY29kZSwgcGFjaywgNiwgc3BhY2UpOwogfQogCi1zdGF0aWMgaW50IGNvbmZpZ19wYWNrYWdlKHN0cnVjdCBnbzcwMDcgKmdvLCB1MTYgKmNvZGUsIGludCBzcGFjZSkKK3N0YXRpYyBpbnQgY29uZmlnX3BhY2thZ2Uoc3RydWN0IGdvNzAwNyAqZ28sIF9fbGUxNiAqY29kZSwgaW50IHNwYWNlKQogewogCWludCBmcHMgPSBnby0+c2Vuc29yX2ZyYW1lcmF0ZSAvIGdvLT5mcHNfc2NhbGUgLyAxMDAwOwogCWludCByb3dzID0gZ28tPmludGVybGFjZV9jb2RpbmcgPyBnby0+aGVpZ2h0IC8gMzIgOiBnby0+aGVpZ2h0IC8gMTY7CkBAIC0xMjEzLDcgKzEyMTMsNyBAQAogCXJldHVybiBjb3B5X3BhY2thZ2VzKGNvZGUsIHBhY2ssIDUsIHNwYWNlKTsKIH0KIAotc3RhdGljIGludCBzZXFoZWFkX3RvX3BhY2thZ2Uoc3RydWN0IGdvNzAwNyAqZ28sIHUxNiAqY29kZSwgaW50IHNwYWNlLAorc3RhdGljIGludCBzZXFoZWFkX3RvX3BhY2thZ2Uoc3RydWN0IGdvNzAwNyAqZ28sIF9fbGUxNiAqY29kZSwgaW50IHNwYWNlLAogCWludCAoKnNlcXVlbmNlX2hlYWRlcl9mdW5jKShzdHJ1Y3QgZ283MDA3ICpnbywKIAkJdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgZXh0KSkKIHsKQEAgLTEyOTIsNyArMTI5Miw3IEBACiAJcmV0dXJuIGJpZzsKIH0KIAotc3RhdGljIGludCBhdnN5bmNfdG9fcGFja2FnZShzdHJ1Y3QgZ283MDA3ICpnbywgdTE2ICpjb2RlLCBpbnQgc3BhY2UpCitzdGF0aWMgaW50IGF2c3luY190b19wYWNrYWdlKHN0cnVjdCBnbzcwMDcgKmdvLCBfX2xlMTYgKmNvZGUsIGludCBzcGFjZSkKIHsKIAlpbnQgYXJhdGUgPSBnby0+Ym9hcmRfaW5mby0+YXVkaW9fcmF0ZSAqIDEwMDEgKiBnby0+ZnBzX3NjYWxlOwogCWludCByYXRpbyA9IGFyYXRlIC8gZ28tPnNlbnNvcl9mcmFtZXJhdGU7CkBAIC0xMzIzLDcgKzEzMjMsNyBAQAogCXJldHVybiBjb3B5X3BhY2thZ2VzKGNvZGUsIHBhY2ssIDEsIHNwYWNlKTsKIH0KIAotc3RhdGljIGludCBmaW5hbF9wYWNrYWdlKHN0cnVjdCBnbzcwMDcgKmdvLCB1MTYgKmNvZGUsIGludCBzcGFjZSkKK3N0YXRpYyBpbnQgZmluYWxfcGFja2FnZShzdHJ1Y3QgZ283MDA3ICpnbywgX19sZTE2ICpjb2RlLCBpbnQgc3BhY2UpCiB7CiAJaW50IHJvd3MgPSBnby0+aW50ZXJsYWNlX2NvZGluZyA/IGdvLT5oZWlnaHQgLyAzMiA6IGdvLT5oZWlnaHQgLyAxNjsKIAl1MTYgcGFja1tdID0gewpAQCAtMTM4Niw3ICsxMzg2LDcgQEAKIAlyZXR1cm4gY29weV9wYWNrYWdlcyhjb2RlLCBwYWNrLCAxLCBzcGFjZSk7CiB9CiAKLXN0YXRpYyBpbnQgYXVkaW9fdG9fcGFja2FnZShzdHJ1Y3QgZ283MDA3ICpnbywgdTE2ICpjb2RlLCBpbnQgc3BhY2UpCitzdGF0aWMgaW50IGF1ZGlvX3RvX3BhY2thZ2Uoc3RydWN0IGdvNzAwNyAqZ28sIF9fbGUxNiAqY29kZSwgaW50IHNwYWNlKQogewogCWludCBjbG9ja19jb25maWcgPSAoKGdvLT5ib2FyZF9pbmZvLT5hdWRpb19mbGFncyAmCiAJCQkJR083MDA3X0FVRElPX0kyU19NQVNURVIgPyAxIDogMCkgPDwgMTEpIHwKQEAgLTE0MzYsNyArMTQzNiw3IEBACiAJcmV0dXJuIGNvcHlfcGFja2FnZXMoY29kZSwgcGFjaywgMiwgc3BhY2UpOwogfQogCi1zdGF0aWMgaW50IG1vZGV0X3RvX3BhY2thZ2Uoc3RydWN0IGdvNzAwNyAqZ28sIHUxNiAqY29kZSwgaW50IHNwYWNlKQorc3RhdGljIGludCBtb2RldF90b19wYWNrYWdlKHN0cnVjdCBnbzcwMDcgKmdvLCBfX2xlMTYgKmNvZGUsIGludCBzcGFjZSkKIHsKIAlpbnQgcmV0LCBtYiwgaSwgYWRkciwgY250ID0gMDsKIAl1MTYgcGFja1szMl07CkBAIC0xNTA1LDcgKzE1MDUsNyBAQAogCXJldHVybiBjbnQ7CiB9CiAKLXN0YXRpYyBpbnQgZG9fc3BlY2lhbChzdHJ1Y3QgZ283MDA3ICpnbywgdTE2IHR5cGUsIHUxNiAqY29kZSwgaW50IHNwYWNlLAorc3RhdGljIGludCBkb19zcGVjaWFsKHN0cnVjdCBnbzcwMDcgKmdvLCB1MTYgdHlwZSwgX19sZTE2ICpjb2RlLCBpbnQgc3BhY2UsCiAJCQlpbnQgKmZyYW1lbGVuKQogewogCXN3aXRjaCAodHlwZSkgewpAQCAtMTU1NSw3ICsxNTU1LDcgQEAKIGludCBnbzcwMDdfY29uc3RydWN0X2Z3X2ltYWdlKHN0cnVjdCBnbzcwMDcgKmdvLCB1OCAqKmZ3LCBpbnQgKmZ3bGVuKQogewogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZndfZW50cnk7Ci0JdTE2ICpjb2RlLCAqc3JjOworCV9fbGUxNiAqY29kZSwgKnNyYzsKIAlpbnQgZnJhbWVsZW5bOF0gPSB7IH07IC8qIGhvbGRzIHRoZSBsZW5ndGhzIG9mIGVtcHR5IGZyYW1lIHRlbXBsYXRlcyAqLwogCWludCBjb2Rlc3BhY2UgPSA2NCAqIDEwMjQsIGkgPSAwLCBzcmNsZW4sIGNodW5rX2xlbiwgY2h1bmtfZmxhZ3M7CiAJaW50IG1vZGVfZmxhZzsKQEAgLTE1OTAsNyArMTU5MCw3IEBACiAJCWdvdG8gZndfZmFpbGVkOwogCX0KIAltZW1zZXQoY29kZSwgMCwgY29kZXNwYWNlICogMik7Ci0Jc3JjID0gKHUxNiAqKWZ3X2VudHJ5LT5kYXRhOworCXNyYyA9IChfX2xlMTYgKilmd19lbnRyeS0+ZGF0YTsKIAlzcmNsZW4gPSBmd19lbnRyeS0+c2l6ZSAvIDI7CiAJd2hpbGUgKHNyY2xlbiA+PSAyKSB7CiAJCWNodW5rX2ZsYWdzID0gX19sZTE2X3RvX2NwdShzcmNbMF0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctcHJpdi5oIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctcHJpdi5oCmluZGV4IDAwNTU0MmQuLjM3MmYxZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LXByaXYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy1wcml2LmgKQEAgLTQwLDYgKzQwLDcgQEAKICNkZWZpbmUgR083MDA3X0JPQVJESURfTElGRVZJRVdfTFIxOTIJMjEgLyogVFYgV2Fsa2VyIFVsdHJhICovCiAjZGVmaW5lIEdPNzAwN19CT0FSRElEX0VORFVSQQkJMjIKICNkZWZpbmUgR083MDA3X0JPQVJESURfQURMSU5LX01QRzI0CTIzCisjZGVmaW5lIEdPNzAwN19CT0FSRElEX1NFTlNPUkFZXzIyNTAJMjQgLyogU2Vuc29yYXkgMjI1MC8yMjUxICovCiAKIC8qIFZhcmlvdXMgY2hhcmFjdGVyaXN0aWNzIG9mIGVhY2ggYm9hcmQgKi8KICNkZWZpbmUgR083MDA3X0JPQVJEX0hBU19BVURJTwkJKDE8PDApCkBAIC0xMDQsNiArMTA1LDcgQEAKIAlpbnQgKCpzdHJlYW1fc3RhcnQpKHN0cnVjdCBnbzcwMDcgKmdvKTsKIAlpbnQgKCpzdHJlYW1fc3RvcCkoc3RydWN0IGdvNzAwNyAqZ28pOwogCWludCAoKnNlbmRfZmlybXdhcmUpKHN0cnVjdCBnbzcwMDcgKmdvLCB1OCAqZGF0YSwgaW50IGxlbik7CisJaW50ICgqc2VuZF9jb21tYW5kKShzdHJ1Y3QgZ283MDA3ICpnbywgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKTsKIH07CiAKIC8qIFRoZSB2aWRlbyBidWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgUEFHRV9TSVpFICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy11c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LXVzYi5jCmluZGV4IDNmNWVlMzQuLjgzZWVjOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LXVzYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LXVzYi5jCkBAIC0yMjUsNyArMjI1LDcgQEAKIAkJLmlucHV0cyAJID0gewogCQkJewogCQkJCS52aWRlb19pbnB1dAk9IDEsCi0JCS5hdWRpb19pbnB1dAkgPSBUVkFVRElPX0lOUFVUX0VYVEVSTiwKKwkJCQkuYXVkaW9faW5wdXQJPSBUVkFVRElPX0lOUFVUX0VYVEVSTiwKIAkJCQkubmFtZQkJPSAiQ29tcG9zaXRlIiwKIAkJCX0sCiAJCQl7CkBAIC0zOTgsNiArMzk4LDQxIEBACiAJfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgZ283MDA3X3VzYl9ib2FyZCBib2FyZF9zZW5zb3JheV8yMjUwID0geworCS5mbGFncwkJPSBHTzcwMDdfVVNCX0VaVVNCIHwgR083MDA3X1VTQl9FWlVTQl9JMkMsCisJLm1haW5faW5mbwk9IHsKKwkJLmZpcm13YXJlCSA9ICJnbzcwMDd0di5iaW4iLAorCQkuYXVkaW9fZmxhZ3MJID0gR083MDA3X0FVRElPX0kyU19NT0RFXzEgfAorCQkJCQlHTzcwMDdfQVVESU9fSTJTX01BU1RFUiB8CisJCQkJCUdPNzAwN19BVURJT19XT1JEXzE2LAorCQkuZmxhZ3MJCSA9IEdPNzAwN19CT0FSRF9IQVNfQVVESU8sCisJCS5hdWRpb19yYXRlCSA9IDQ4MDAwLAorCQkuYXVkaW9fYmNsa19kaXYJID0gOCwKKwkJLmF1ZGlvX21haW5fZGl2CSA9IDIsCisJCS5ocGlfYnVmZmVyX2NhcCAgPSA3LAorCQkuc2Vuc29yX2ZsYWdzCSA9IEdPNzAwN19TRU5TT1JfNjU2IHwKKwkJCQkJR083MDA3X1NFTlNPUl9UViwKKwkJLm51bV9pMmNfZGV2cwkgPSAxLAorCQkuaTJjX2RldnMJID0geworCQkJeworCQkJCS5pZAk9IEkyQ19EUklWRVJJRF9TMjI1MCwKKwkJCQkuYWRkcgk9IDB4MzQsCisJCQl9LAorCQl9LAorCQkubnVtX2lucHV0cwkgPSAyLAorCQkuaW5wdXRzIAkgPSB7CisJCQl7CisJCQkJLnZpZGVvX2lucHV0CT0gMCwKKwkJCQkubmFtZQkJPSAiQ29tcG9zaXRlIiwKKwkJCX0sCisJCQl7CisJCQkJLnZpZGVvX2lucHV0CT0gMSwKKwkJCQkubmFtZQkJPSAiUy1WaWRlbyIsCisJCQl9LAorCQl9LAorCX0sCit9OworCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgZ283MDA3X3VzYl9pZF90YWJsZVtdID0gewogCXsKIAkJLm1hdGNoX2ZsYWdzCT0gVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0VfQU5EX1ZFUlNJT04gfApAQCAtNDkxLDYgKzUyNiwxNCBAQAogCQkuYmNkRGV2aWNlX2hpCT0gMHgxLAogCQkuZHJpdmVyX2luZm8JPSAoa2VybmVsX3Vsb25nX3QpR083MDA3X0JPQVJESURfTElGRVZJRVdfTFIxOTIsCiAJfSwKKwl7CisJCS5tYXRjaF9mbGFncwk9IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFX0FORF9WRVJTSU9OLAorCQkuaWRWZW5kb3IJPSAweDE5NDMsICAvKiBWZW5kb3IgSUQgU2Vuc29yYXkgKi8KKwkJLmlkUHJvZHVjdAk9IDB4MjI1MCwgIC8qIFByb2R1Y3QgSUQgb2YgMjI1MC8yMjUxICovCisJCS5iY2REZXZpY2VfbG8JPSAweDEsCisJCS5iY2REZXZpY2VfaGkJPSAweDEsCisJCS5kcml2ZXJfaW5mbwk9IChrZXJuZWxfdWxvbmdfdClHTzcwMDdfQk9BUkRJRF9TRU5TT1JBWV8yMjUwLAorCX0sCiAJeyB9CQkJCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwogfTsKIApAQCAtNjM3LDkgKzY4MCwxMCBAQAogewogCXN0cnVjdCBnbzcwMDcgKmdvID0gKHN0cnVjdCBnbzcwMDcgKil1cmItPmNvbnRleHQ7CiAJdTE2ICpyZWdzID0gKHUxNiAqKXVyYi0+dHJhbnNmZXJfYnVmZmVyOworCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWlmICh1cmItPnN0YXR1cyAhPSAwKSB7Ci0JCWlmICh1cmItPnN0YXR1cyAhPSAtRVNIVVRET1dOICYmCisJaWYgKHN0YXR1cykgeworCQlpZiAoc3RhdHVzICE9IC1FU0hVVERPV04gJiYKIAkJCQlnby0+c3RhdHVzICE9IFNUQVRVU19TSFVURE9XTikgewogCQkJcHJpbnRrKEtFUk5fRVJSCiAJCQkJImdvNzAwNy11c2I6IGVycm9yIGluIHJlYWQgaW50ZXJydXB0OiAlZFxuIiwKQEAgLTY4MCwxNSArNzI0LDE0IEBACiBzdGF0aWMgdm9pZCBnbzcwMDdfdXNiX3JlYWRfdmlkZW9fcGlwZV9jb21wbGV0ZShzdHJ1Y3QgdXJiICp1cmIpCiB7CiAJc3RydWN0IGdvNzAwNyAqZ28gPSAoc3RydWN0IGdvNzAwNyAqKXVyYi0+Y29udGV4dDsKLQlpbnQgcjsKKwlpbnQgciwgc3RhdHVzID0gdXJiLT4gc3RhdHVzOwogCiAJaWYgKCFnby0+c3RyZWFtaW5nKSB7CiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZ28tPmZyYW1lX3dhaXRxKTsKIAkJcmV0dXJuOwogCX0KLQlpZiAodXJiLT5zdGF0dXMgIT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgImdvNzAwNy11c2I6IGVycm9yIGluIHZpZGVvIHBpcGU6ICVkXG4iLAotCQkJCXVyYi0+c3RhdHVzKTsKKwlpZiAoc3RhdHVzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZ283MDA3LXVzYjogZXJyb3IgaW4gdmlkZW8gcGlwZTogJWRcbiIsIHN0YXR1cyk7CiAJCXJldHVybjsKIAl9CiAJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCAhPSB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpIHsKQEAgLTcwNCwxMyArNzQ3LDEyIEBACiBzdGF0aWMgdm9pZCBnbzcwMDdfdXNiX3JlYWRfYXVkaW9fcGlwZV9jb21wbGV0ZShzdHJ1Y3QgdXJiICp1cmIpCiB7CiAJc3RydWN0IGdvNzAwNyAqZ28gPSAoc3RydWN0IGdvNzAwNyAqKXVyYi0+Y29udGV4dDsKLQlpbnQgcjsKKwlpbnQgciwgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKIAlpZiAoIWdvLT5zdHJlYW1pbmcpCiAJCXJldHVybjsKLQlpZiAodXJiLT5zdGF0dXMgIT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgImdvNzAwNy11c2I6IGVycm9yIGluIGF1ZGlvIHBpcGU6ICVkXG4iLAotCQkJCXVyYi0+c3RhdHVzKTsKKwlpZiAoc3RhdHVzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZ283MDA3LXVzYjogZXJyb3IgaW4gYXVkaW8gcGlwZTogJWRcbiIsIHN0YXR1cyk7CiAJCXJldHVybjsKIAl9CiAJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCAhPSB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpIHsKQEAgLTc1MSw3ICs3OTMsNyBAQAogCXJldHVybiAwOwogCiBhdWRpb19zdWJtaXRfZmFpbGVkOgotCWZvciAoaSA9IDA7IGkgPCA4OyArK2kpCisJZm9yIChpID0gMDsgaSA8IDc7ICsraSkKIAkJdXNiX2tpbGxfdXJiKHVzYi0+YXVkaW9fdXJic1tpXSk7CiB2aWRlb19zdWJtaXRfZmFpbGVkOgogCWZvciAoaSA9IDA7IGkgPCA4OyArK2kpCkBAIC05NjUsMTYgKzEwMDcsMjAgQEAKIAkJbmFtZSA9ICJMaWZldmlldyBUViBXYWxrZXIgVWx0cmEiOwogCQlib2FyZCA9ICZib2FyZF9saWZldmlld19scjE5MjsKIAkJYnJlYWs7CisJY2FzZSBHTzcwMDdfQk9BUkRJRF9TRU5TT1JBWV8yMjUwOgorCQlwcmludGsoS0VSTl9JTkZPICJTZW5zb3JheSAyMjUwIGZvdW5kXG4iKTsKKwkJbmFtZSA9ICJTZW5zb3JheSAyMjUwLzIyNTFcbiI7CisJCWJvYXJkID0gJmJvYXJkX3NlbnNvcmF5XzIyNTA7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByaW50ayhLRVJOX0VSUiAiZ283MDA3LXVzYjogdW5rbm93biBib2FyZCBJRCAlZCFcbiIsCiAJCQkJKHVuc2lnbmVkIGludClpZC0+ZHJpdmVyX2luZm8pOwogCQlyZXR1cm4gMDsKIAl9CiAKLQl1c2IgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZ283MDA3X3VzYiksIEdGUF9LRVJORUwpOworCXVzYiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBnbzcwMDdfdXNiKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHVzYiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKLQltZW1zZXQodXNiLCAwLCBzaXplb2Yoc3RydWN0IGdvNzAwN191c2IpKTsKIAogCS8qIEFsbG9jYXRlIHRoZSBVUkIgYW5kIGJ1ZmZlciBmb3IgcmVjZWl2aW5nIGluY29taW5nIGludGVycnVwdHMgKi8KIAl1c2ItPmludHJfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKQEAgLTExNzksNiArMTIyNSw3IEBACiB7CiAJc3RydWN0IGdvNzAwNyAqZ28gPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwogCXN0cnVjdCBnbzcwMDdfdXNiICp1c2IgPSBnby0+aHBpX2NvbnRleHQ7CisJc3RydWN0IHVyYiAqdnVyYiwgKmF1cmI7CiAJaW50IGk7CiAKIAlnby0+c3RhdHVzID0gU1RBVFVTX1NIVVRET1dOOwpAQCAtMTE4NiwxNSArMTIzMywxOSBAQAogCiAJLyogRnJlZSBVU0ItcmVsYXRlZCBzdHJ1Y3RzICovCiAJZm9yIChpID0gMDsgaSA8IDg7ICsraSkgewotCQlpZiAodXNiLT52aWRlb191cmJzW2ldICE9IE5VTEwpIHsKLQkJCWlmICh1c2ItPnZpZGVvX3VyYnNbaV0tPnRyYW5zZmVyX2J1ZmZlciAhPSBOVUxMKQotCQkJCWtmcmVlKHVzYi0+dmlkZW9fdXJic1tpXS0+dHJhbnNmZXJfYnVmZmVyKTsKLQkJCXVzYl9mcmVlX3VyYih1c2ItPnZpZGVvX3VyYnNbaV0pOworCQl2dXJiID0gdXNiLT52aWRlb191cmJzW2ldOworCQlpZiAodnVyYikgeworCQkJdXNiX2tpbGxfdXJiKHZ1cmIpOworCQkJaWYgKHZ1cmItPnRyYW5zZmVyX2J1ZmZlcikKKwkJCQlrZnJlZSh2dXJiLT50cmFuc2Zlcl9idWZmZXIpOworCQkJdXNiX2ZyZWVfdXJiKHZ1cmIpOwogCQl9Ci0JCWlmICh1c2ItPmF1ZGlvX3VyYnNbaV0gIT0gTlVMTCkgewotCQkJaWYgKHVzYi0+YXVkaW9fdXJic1tpXS0+dHJhbnNmZXJfYnVmZmVyICE9IE5VTEwpCi0JCQkJa2ZyZWUodXNiLT5hdWRpb191cmJzW2ldLT50cmFuc2Zlcl9idWZmZXIpOwotCQkJdXNiX2ZyZWVfdXJiKHVzYi0+YXVkaW9fdXJic1tpXSk7CisJCWF1cmIgPSB1c2ItPmF1ZGlvX3VyYnNbaV07CisJCWlmIChhdXJiKSB7CisJCQl1c2Jfa2lsbF91cmIoYXVyYik7CisJCQlpZiAoYXVyYi0+dHJhbnNmZXJfYnVmZmVyKQorCQkJCWtmcmVlKGF1cmItPnRyYW5zZmVyX2J1ZmZlcik7CisJCQl1c2JfZnJlZV91cmIoYXVyYik7CiAJCX0KIAl9CiAJa2ZyZWUodXNiLT5pbnRyX3VyYi0+dHJhbnNmZXJfYnVmZmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LXY0bDIuYyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LXY0bDIuYwppbmRleCA5NGUxMTQxLi44NjhlZGI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy12NGwyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctdjRsMi5jCkBAIC0zOCw2ICszOCwxNCBAQAogI2luY2x1ZGUgImdvNzAwNy1wcml2LmgiCiAjaW5jbHVkZSAid2lzLWkyYy5oIgogCisvKiBUZW1wb3JhcnkgZGVmaW5lcyB1bnRpbCBhY2NlcHRlZCBpbiB2NGwtZHZiICovCisjaWZuZGVmIFY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHX0VMRU0KKyNkZWZpbmUJVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUdfRUxFTSAgIDYgLyogTVBFRyBlbGVtZW50YXJ5IHN0cmVhbSAqLworI2VuZGlmCisjaWZuZGVmIFY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzQKKyNkZWZpbmUJVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfNCAgIDMKKyNlbmRpZgorCiBzdGF0aWMgdm9pZCBkZWFjdGl2YXRlX2J1ZmZlcihzdHJ1Y3QgZ283MDA3X2J1ZmZlciAqZ29idWYpCiB7CiAJaW50IGk7CkBAIC04MSw3ICs4OSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZ283MDA3X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCitzdGF0aWMgaW50IGdvNzAwN19vcGVuKHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCBnbzcwMDcgKmdvID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxlKSk7CiAJc3RydWN0IGdvNzAwN19maWxlICpnb2ZoOwpAQCAtOTksNyArMTA3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBnbzcwMDdfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3N0YXRpYyBpbnQgZ283MDA3X3JlbGVhc2Uoc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CkBAIC0zMTksNiArMzI3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmIDAKIHN0YXRpYyBpbnQgY2xpcF90b19tb2RldF9tYXAoc3RydWN0IGdvNzAwNyAqZ28sIGludCByZWdpb24sCiAJCXN0cnVjdCB2NGwyX2NsaXAgKmNsaXBfbGlzdCkKIHsKQEAgLTM3NSw0OTkgKzM4NCw4MDEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBnbzcwMDdfZG9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCXVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3N0YXRpYyBpbnQgbXBlZ19xdWVyeWN0cmwodTMyIGlkLCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKmN0cmwpCiB7Ci0Jc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0dmFsID0gMDsKKwlzdGF0aWMgY29uc3QgdTMyIHVzZXJfY3RybHNbXSA9IHsKKwkJVjRMMl9DSURfVVNFUl9DTEFTUywKKwkJMAorCX07CisJc3RhdGljIGNvbnN0IHUzMiBtcGVnX2N0cmxzW10gPSB7CisJCVY0TDJfQ0lEX01QRUdfQ0xBU1MsCisJCVY0TDJfQ0lEX01QRUdfU1RSRUFNX1RZUEUsCisJCVY0TDJfQ0lEX01QRUdfVklERU9fRU5DT0RJTkcsCisJCVY0TDJfQ0lEX01QRUdfVklERU9fQVNQRUNULAorCQlWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9TSVpFLAorCQlWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9DTE9TVVJFLAorCQlWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEUsCisJCTAKKwl9OworCXN0YXRpYyBjb25zdCB1MzIgKmN0cmxfY2xhc3Nlc1tdID0geworCQl1c2VyX2N0cmxzLAorCQltcGVnX2N0cmxzLAorCQlOVUxMCisJfTsKIAotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBWSURJT0NfUVVFUllDQVA6Ci0JewotCQlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXAgPSBhcmc7Ci0KLQkJbWVtc2V0KGNhcCwgMCwgc2l6ZW9mKCpjYXApKTsKLQkJc3RyY3B5KGNhcC0+ZHJpdmVyLCAiZ283MDA3Iik7Ci0JCXN0cm5jcHkoY2FwLT5jYXJkLCBnby0+bmFtZSwgc2l6ZW9mKGNhcC0+Y2FyZCkpOwotCQljYXAtPnZlcnNpb24gPSBLRVJORUxfVkVSU0lPTigwLCA5LCA4KTsKLQkJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwKLQkJCQlWNEwyX0NBUF9TVFJFQU1JTkc7IC8qIHwgVjRMMl9DQVBfQVVESU87ICovCi0JCWlmIChnby0+Ym9hcmRfaW5mby0+ZmxhZ3MgJiBHTzcwMDdfQk9BUkRfSEFTX1RVTkVSKQotCQkJY2FwLT5jYXBhYmlsaXRpZXMgfD0gVjRMMl9DQVBfVFVORVI7CisJLyogVGhlIGN0cmwgbWF5IGFscmVhZHkgY29udGFpbiB0aGUgcXVlcmllZCBpMmMgY29udHJvbHMsCisJICogcXVlcnkgdGhlIG1wZWcgY29udHJvbHMgaWYgdGhlIGV4aXN0aW5nIGN0cmwgaWQgaXMKKwkgKiBncmVhdGVyIHRoYW4gdGhlIG5leHQgbXBlZyBjdHJsIGlkLgorCSAqLworCWlkID0gdjRsMl9jdHJsX25leHQoY3RybF9jbGFzc2VzLCBpZCk7CisJaWYgKGlkID49IGN0cmwtPmlkICYmIGN0cmwtPm5hbWVbMF0pCiAJCXJldHVybiAwOwotCX0KLQljYXNlIFZJRElPQ19FTlVNX0ZNVDoKLQl7Ci0JCXN0cnVjdCB2NGwyX2ZtdGRlc2MgKmZtdCA9IGFyZzsKLQkJdW5zaWduZWQgaW50IGluZGV4OwotCQljaGFyICpkZXNjOwotCQl1MzIgcGl4ZWxmb3JtYXQ7CiAKLQkJaWYgKGZtdC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJc3dpdGNoIChmbXQtPmluZGV4KSB7Ci0JCWNhc2UgMDoKLQkJCXBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX01KUEVHOwotCQkJZGVzYyA9ICJNb3Rpb24tSlBFRyI7CisJbWVtc2V0KGN0cmwsIDAsIHNpemVvZigqY3RybCkpOworCWN0cmwtPmlkID0gaWQ7CisKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9VU0VSX0NMQVNTOgorCWNhc2UgVjRMMl9DSURfTVBFR19DTEFTUzoKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsX3N0ZChjdHJsKTsKKwljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1RZUEU6CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChjdHJsLAorCQkJCVY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMl9EVkQsCisJCQkJVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUdfRUxFTSwgMSwKKwkJCQlWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFR19FTEVNKTsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fRU5DT0RJTkc6CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChjdHJsLAorCQkJCVY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzEsCisJCQkJVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfNCwgMSwKKwkJCQlWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18yKTsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQVNQRUNUOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwoY3RybCwKKwkJCQlWNEwyX01QRUdfVklERU9fQVNQRUNUXzF4MSwKKwkJCQlWNEwyX01QRUdfVklERU9fQVNQRUNUXzE2eDksIDEsCisJCQkJVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF8xeDEpOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19HT1BfU0laRToKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fR09QX0NMT1NVUkU6CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbF9zdGQoY3RybCk7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEU6CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChjdHJsLAorCQkJCTY0MDAwLAorCQkJCTEwMDAwMDAwLCAxLAorCQkJCTk4MDAwMDApOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBtcGVnX3NfY29udHJvbChzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsLCBzdHJ1Y3QgZ283MDA3ICpnbykKK3sKKwkvKiBwcmV0dHkgc3VyZSB3ZSBjYW4ndCBjaGFuZ2UgYW55IG9mIHRoZXNlIHdoaWxlIHN0cmVhbWluZyAqLworCWlmIChnby0+c3RyZWFtaW5nKQorCQlyZXR1cm4gLUVCVVNZOworCisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fVFlQRToKKwkJc3dpdGNoIChjdHJsLT52YWx1ZSkgeworCQljYXNlIFY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMl9EVkQ6CisJCQlnby0+Zm9ybWF0ID0gR083MDA3X0ZPUk1BVF9NUEVHMjsKKwkJCWdvLT5iaXRyYXRlID0gOTgwMDAwMDsKKwkJCWdvLT5nb3Bfc2l6ZSA9IDE1OworCQkJZ28tPnBhbGkgPSAweDQ4OworCQkJZ28tPmNsb3NlZF9nb3AgPSAxOworCQkJZ28tPnJlcGVhdF9zZXFoZWFkID0gMDsKKwkJCWdvLT5zZXFfaGVhZGVyX2VuYWJsZSA9IDE7CisJCQlnby0+Z29wX2hlYWRlcl9lbmFibGUgPSAxOworCQkJZ28tPmR2ZF9tb2RlID0gMTsKIAkJCWJyZWFrOwotCQljYXNlIDE6Ci0JCQlwaXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9NUEVHOwotCQkJZGVzYyA9ICJNUEVHMS9NUEVHMi9NUEVHNCI7CisJCWNhc2UgVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUdfRUxFTToKKwkJCS8qIHRvZG86ICovCiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0JCWluZGV4ID0gZm10LT5pbmRleDsKLQkJbWVtc2V0KGZtdCwgMCwgc2l6ZW9mKCpmbXQpKTsKLQkJZm10LT5pbmRleCA9IGluZGV4OwotCQlmbXQtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7Ci0JCWZtdC0+ZmxhZ3MgPSBWNEwyX0ZNVF9GTEFHX0NPTVBSRVNTRUQ7Ci0JCXN0cm5jcHkoZm10LT5kZXNjcmlwdGlvbiwgZGVzYywgc2l6ZW9mKGZtdC0+ZGVzY3JpcHRpb24pKTsKLQkJZm10LT5waXhlbGZvcm1hdCA9IHBpeGVsZm9ybWF0OwotCi0JCXJldHVybiAwOwotCX0KLQljYXNlIFZJRElPQ19UUllfRk1UOgotCXsKLQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQgPSBhcmc7Ci0KLQkJaWYgKGZtdC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19FTkNPRElORzoKKwkJc3dpdGNoIChjdHJsLT52YWx1ZSkgeworCQljYXNlIFY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzE6CisJCQlnby0+Zm9ybWF0ID0gR083MDA3X0ZPUk1BVF9NUEVHMTsKKwkJCWdvLT5wYWxpID0gMDsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzI6CisJCQlnby0+Zm9ybWF0ID0gR083MDA3X0ZPUk1BVF9NUEVHMjsKKwkJCS8qaWYgKG1wZWctPnBhbGkgPj4gMjQgPT0gMikKKwkJCQlnby0+cGFsaSA9IG1wZWctPnBhbGkgJiAweGZmOworCQkJZWxzZSovCisJCQkJZ28tPnBhbGkgPSAweDQ4OworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfNDoKKwkJCWdvLT5mb3JtYXQgPSBHTzcwMDdfRk9STUFUX01QRUc0OworCQkJLyppZiAobXBlZy0+cGFsaSA+PiAyNCA9PSA0KQorCQkJCWdvLT5wYWxpID0gbXBlZy0+cGFsaSAmIDB4ZmY7CisJCQllbHNlKi8KKwkJCQlnby0+cGFsaSA9IDB4ZjU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKIAkJCXJldHVybiAtRUlOVkFMOwotCQlyZXR1cm4gc2V0X2NhcHR1cmVfc2l6ZShnbywgZm10LCAxKTsKLQl9Ci0JY2FzZSBWSURJT0NfR19GTVQ6Ci0JewotCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCA9IGFyZzsKLQotCQlpZiAoZm10LT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJfQorCQlnby0+Z29wX2hlYWRlcl9lbmFibGUgPQorCQkJLyptcGVnLT5mbGFncyAmIEdPNzAwN19NUEVHX09NSVRfR09QX0hFQURFUgorCQkJPyAwIDoqLyAxOworCQkvKmlmIChtcGVnLT5mbGFncyAmIEdPNzAwN19NUEVHX1JFUEVBVF9TRVFIRUFERVIpCisJCQlnby0+cmVwZWF0X3NlcWhlYWQgPSAxOworCQllbHNlKi8KKwkJCWdvLT5yZXBlYXRfc2VxaGVhZCA9IDA7CisJCWdvLT5kdmRfbW9kZSA9IDA7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19BU1BFQ1Q6CisJCWlmIChnby0+Zm9ybWF0ID09IEdPNzAwN19GT1JNQVRfTUpQRUcpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJbWVtc2V0KGZtdCwgMCwgc2l6ZW9mKCpmbXQpKTsKLQkJZm10LT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwotCQlmbXQtPmZtdC5waXgud2lkdGggPSBnby0+d2lkdGg7Ci0JCWZtdC0+Zm10LnBpeC5oZWlnaHQgPSBnby0+aGVpZ2h0OwotCQlmbXQtPmZtdC5waXgucGl4ZWxmb3JtYXQgPSBnby0+Zm9ybWF0ID09IEdPNzAwN19GT1JNQVRfTUpQRUcgPwotCQkJVjRMMl9QSVhfRk1UX01KUEVHIDogVjRMMl9QSVhfRk1UX01QRUc7Ci0JCWZtdC0+Zm10LnBpeC5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKLQkJZm10LT5mbXQucGl4LmJ5dGVzcGVybGluZSA9IDA7Ci0JCWZtdC0+Zm10LnBpeC5zaXplaW1hZ2UgPSBHTzcwMDdfQlVGX1NJWkU7Ci0JCWZtdC0+Zm10LnBpeC5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NNUFRFMTcwTTsgLyogPz8gKi8KLQkJcmV0dXJuIDA7Ci0JfQotCWNhc2UgVklESU9DX1NfRk1UOgotCXsKLQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQgPSBhcmc7Ci0KLQkJaWYgKGZtdC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCXN3aXRjaCAoY3RybC0+dmFsdWUpIHsKKwkJY2FzZSBWNEwyX01QRUdfVklERU9fQVNQRUNUXzF4MToKKwkJCWdvLT5hc3BlY3RfcmF0aW8gPSBHTzcwMDdfUkFUSU9fMV8xOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF80eDM6CisJCQlnby0+YXNwZWN0X3JhdGlvID0gR083MDA3X1JBVElPXzRfMzsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfTVBFR19WSURFT19BU1BFQ1RfMTZ4OToKKwkJCWdvLT5hc3BlY3RfcmF0aW8gPSBHTzcwMDdfUkFUSU9fMTZfOTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfTVBFR19WSURFT19BU1BFQ1RfMjIxeDEwMDoKKwkJZGVmYXVsdDoKIAkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoZ28tPnN0cmVhbWluZykKLQkJCXJldHVybiAtRUJVU1k7Ci0JCXJldHVybiBzZXRfY2FwdHVyZV9zaXplKGdvLCBmbXQsIDApOwotCX0KLQljYXNlIFZJRElPQ19HX0ZCVUY6Ci0JY2FzZSBWSURJT0NfU19GQlVGOgorCQl9CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19HT1BfU0laRToKKwkJZ28tPmdvcF9zaXplID0gY3RybC0+dmFsdWU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19HT1BfQ0xPU1VSRToKKwkJaWYgKGN0cmwtPnZhbHVlICE9IDAgJiYgY3RybC0+dmFsdWUgIT0gMSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlnby0+Y2xvc2VkX2dvcCA9IGN0cmwtPnZhbHVlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURToKKwkJLyogVXBwZXIgYm91bmQgaXMga2luZCBvZiBhcmJpdHJhcnkgaGVyZSAqLworCQlpZiAoY3RybC0+dmFsdWUgPCA2NDAwMCB8fCBjdHJsLT52YWx1ZSA+IDEwMDAwMDAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWdvLT5iaXRyYXRlID0gY3RybC0+dmFsdWU7CisJCWJyZWFrOworCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwotCWNhc2UgVklESU9DX1JFUUJVRlM6Ci0JewotCQlzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyAqcmVxID0gYXJnOwotCQl1bnNpZ25lZCBpbnQgY291bnQsIGk7CisJfQorCXJldHVybiAwOworfQogCi0JCWlmIChnby0+c3RyZWFtaW5nKQotCQkJcmV0dXJuIC1FQlVTWTsKLQkJaWYgKHJlcS0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgfHwKLQkJCQlyZXEtPm1lbW9yeSAhPSBWNEwyX01FTU9SWV9NTUFQKQorc3RhdGljIGludCBtcGVnX2dfY29udHJvbChzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsLCBzdHJ1Y3QgZ283MDA3ICpnbykKK3sKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9UWVBFOgorCQlpZiAoZ28tPmR2ZF9tb2RlKQorCQkJY3RybC0+dmFsdWUgPSBWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFRzJfRFZEOworCQllbHNlCisJCQljdHJsLT52YWx1ZSA9IFY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHX0VMRU07CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19FTkNPRElORzoKKwkJc3dpdGNoIChnby0+Zm9ybWF0KSB7CisJCWNhc2UgR083MDA3X0ZPUk1BVF9NUEVHMToKKwkJCWN0cmwtPnZhbHVlID0gVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfMTsKKwkJCWJyZWFrOworCQljYXNlIEdPNzAwN19GT1JNQVRfTVBFRzI6CisJCQljdHJsLT52YWx1ZSA9IFY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzI7CisJCQlicmVhazsKKwkJY2FzZSBHTzcwMDdfRk9STUFUX01QRUc0OgorCQkJY3RybC0+dmFsdWUgPSBWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR180OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQVNQRUNUOgorCQlzd2l0Y2ggKGdvLT5hc3BlY3RfcmF0aW8pIHsKKwkJY2FzZSBHTzcwMDdfUkFUSU9fMV8xOgorCQkJY3RybC0+dmFsdWUgPSBWNEwyX01QRUdfVklERU9fQVNQRUNUXzF4MTsKKwkJCWJyZWFrOworCQljYXNlIEdPNzAwN19SQVRJT180XzM6CisJCQljdHJsLT52YWx1ZSA9IFY0TDJfTVBFR19WSURFT19BU1BFQ1RfNHgzOworCQkJYnJlYWs7CisJCWNhc2UgR083MDA3X1JBVElPXzE2Xzk6CisJCQljdHJsLT52YWx1ZSA9IFY0TDJfTVBFR19WSURFT19BU1BFQ1RfMTZ4OTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9TSVpFOgorCQljdHJsLT52YWx1ZSA9IGdvLT5nb3Bfc2l6ZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9DTE9TVVJFOgorCQljdHJsLT52YWx1ZSA9IGdvLT5jbG9zZWRfZ29wOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURToKKwkJY3RybC0+dmFsdWUgPSBnby0+Yml0cmF0ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmCiAKLQkJZG93bigmZ29maC0+bG9jayk7Ci0JCXJldHZhbCA9IC1FQlVTWTsKLQkJZm9yIChpID0gMDsgaSA8IGdvZmgtPmJ1Zl9jb3VudDsgKytpKQotCQkJaWYgKGdvZmgtPmJ1ZnNbaV0ubWFwcGVkID4gMCkKLQkJCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOwotCQlkb3duKCZnby0+aHdfbG9jayk7Ci0JCWlmIChnby0+aW5fdXNlID4gMCAmJiBnb2ZoLT5idWZfY291bnQgPT0gMCkgeworc3RhdGljIGludCB2aWRpb2NfcXVlcnljYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXApCit7CisJc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gcHJpdjsKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IGdvZmgtPmdvOworCisJc3RybGNweShjYXAtPmRyaXZlciwgImdvNzAwNyIsIHNpemVvZihjYXAtPmRyaXZlcikpOworCXN0cmxjcHkoY2FwLT5jYXJkLCBnby0+bmFtZSwgc2l6ZW9mKGNhcC0+Y2FyZCkpOworI2lmIDAKKwlzdHJsY3B5KGNhcC0+YnVzX2luZm8sIGRldl9uYW1lKCZkZXYtPnVkZXYtPmRldiksIHNpemVvZihjYXAtPmJ1c19pbmZvKSk7CisjZW5kaWYKKworCWNhcC0+dmVyc2lvbiA9IEtFUk5FTF9WRVJTSU9OKDAsIDksIDgpOworCisJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwKKwkJCSAgICBWNEwyX0NBUF9TVFJFQU1JTkc7IC8qIHwgVjRMMl9DQVBfQVVESU87ICovCisKKwlpZiAoZ28tPmJvYXJkX2luZm8tPmZsYWdzICYgR083MDA3X0JPQVJEX0hBU19UVU5FUikKKwkJY2FwLT5jYXBhYmlsaXRpZXMgfD0gVjRMMl9DQVBfVFVORVI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfZW51bV9mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2ZtdGRlc2MgKmZtdCkKK3sKKwljaGFyICpkZXNjID0gTlVMTDsKKworCXN3aXRjaCAoZm10LT5pbmRleCkgeworCWNhc2UgMDoKKwkJZm10LT5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9NSlBFRzsKKwkJZGVzYyA9ICJNb3Rpb24tSlBFRyI7CisJCWJyZWFrOworCWNhc2UgMToKKwkJZm10LT5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9NUEVHOworCQlkZXNjID0gIk1QRUcxL01QRUcyL01QRUc0IjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWZtdC0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwlmbXQtPmZsYWdzID0gVjRMMl9GTVRfRkxBR19DT01QUkVTU0VEOworCisJc3RybmNweShmbXQtPmRlc2NyaXB0aW9uLCBkZXNjLCBzaXplb2YoZm10LT5kZXNjcmlwdGlvbikpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10KQoreworCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maCA9IHByaXY7CisJc3RydWN0IGdvNzAwNyAqZ28gPSBnb2ZoLT5nbzsKKworCWZtdC0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwlmbXQtPmZtdC5waXgud2lkdGggPSBnby0+d2lkdGg7CisJZm10LT5mbXQucGl4LmhlaWdodCA9IGdvLT5oZWlnaHQ7CisJZm10LT5mbXQucGl4LnBpeGVsZm9ybWF0ID0gKGdvLT5mb3JtYXQgPT0gR083MDA3X0ZPUk1BVF9NSlBFRykgPworCQkJCSAgIFY0TDJfUElYX0ZNVF9NSlBFRyA6IFY0TDJfUElYX0ZNVF9NUEVHOworCWZtdC0+Zm10LnBpeC5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKKwlmbXQtPmZtdC5waXguYnl0ZXNwZXJsaW5lID0gMDsKKwlmbXQtPmZtdC5waXguc2l6ZWltYWdlID0gR083MDA3X0JVRl9TSVpFOworCWZtdC0+Zm10LnBpeC5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NNUFRFMTcwTTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY190cnlfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCkKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CisKKwlyZXR1cm4gc2V0X2NhcHR1cmVfc2l6ZShnbywgZm10LCAxKTsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc19mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10KQoreworCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maCA9IHByaXY7CisJc3RydWN0IGdvNzAwNyAqZ28gPSBnb2ZoLT5nbzsKKworCWlmIChnby0+c3RyZWFtaW5nKQorCQlyZXR1cm4gLUVCVVNZOworCisJcmV0dXJuIHNldF9jYXB0dXJlX3NpemUoZ28sIGZtdCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3JlcWJ1ZnMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgIHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzICpyZXEpCit7CisJc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gcHJpdjsKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IGdvZmgtPmdvOworCWludCByZXR2YWwgPSAtRUJVU1k7CisJdW5zaWduZWQgaW50IGNvdW50LCBpOworCisJaWYgKGdvLT5zdHJlYW1pbmcpCisJCXJldHVybiByZXR2YWw7CisKKwlpZiAocmVxLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSB8fAorCQkJcmVxLT5tZW1vcnkgIT0gVjRMMl9NRU1PUllfTU1BUCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkb3duKCZnb2ZoLT5sb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgZ29maC0+YnVmX2NvdW50OyArK2kpCisJCWlmIChnb2ZoLT5idWZzW2ldLm1hcHBlZCA+IDApCisJCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOworCisJZG93bigmZ28tPmh3X2xvY2spOworCWlmIChnby0+aW5fdXNlID4gMCAmJiBnb2ZoLT5idWZfY291bnQgPT0gMCkgeworCQl1cCgmZ28tPmh3X2xvY2spOworCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOworCX0KKworCWlmIChnb2ZoLT5idWZfY291bnQgPiAwKQorCQlrZnJlZShnb2ZoLT5idWZzKTsKKworCXJldHZhbCA9IC1FTk9NRU07CisJY291bnQgPSByZXEtPmNvdW50OworCWlmIChjb3VudCA+IDApIHsKKwkJaWYgKGNvdW50IDwgMikKKwkJCWNvdW50ID0gMjsKKwkJaWYgKGNvdW50ID4gMzIpCisJCQljb3VudCA9IDMyOworCisJCWdvZmgtPmJ1ZnMgPSBrbWFsbG9jKGNvdW50ICogc2l6ZW9mKHN0cnVjdCBnbzcwMDdfYnVmZmVyKSwKKwkJCQkgICAgIEdGUF9LRVJORUwpOworCisJCWlmICghZ29maC0+YnVmcykgewogCQkJdXAoJmdvLT5od19sb2NrKTsKIAkJCWdvdG8gdW5sb2NrX2FuZF9yZXR1cm47CiAJCX0KLQkJaWYgKGdvZmgtPmJ1Zl9jb3VudCA+IDApCi0JCQlrZnJlZShnb2ZoLT5idWZzKTsKLQkJcmV0dmFsID0gLUVOT01FTTsKLQkJY291bnQgPSByZXEtPmNvdW50OwotCQlpZiAoY291bnQgPiAwKSB7Ci0JCQlpZiAoY291bnQgPCAyKQotCQkJCWNvdW50ID0gMjsKLQkJCWlmIChjb3VudCA+IDMyKQotCQkJCWNvdW50ID0gMzI7Ci0JCQlnb2ZoLT5idWZzID0ga21hbGxvYyhjb3VudCAqCi0JCQkJCQlzaXplb2Yoc3RydWN0IGdvNzAwN19idWZmZXIpLAotCQkJCQlHRlBfS0VSTkVMKTsKLQkJCWlmIChnb2ZoLT5idWZzID09IE5VTEwpIHsKLQkJCQl1cCgmZ28tPmh3X2xvY2spOwotCQkJCWdvdG8gdW5sb2NrX2FuZF9yZXR1cm47Ci0JCQl9Ci0JCQltZW1zZXQoZ29maC0+YnVmcywgMCwKLQkJCQkJY291bnQgKiBzaXplb2Yoc3RydWN0IGdvNzAwN19idWZmZXIpKTsKLQkJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0JCQkJZ29maC0+YnVmc1tpXS5nbyA9IGdvOwotCQkJCWdvZmgtPmJ1ZnNbaV0uaW5kZXggPSBpOwotCQkJCWdvZmgtPmJ1ZnNbaV0uc3RhdGUgPSBCVUZfU1RBVEVfSURMRTsKLQkJCQlnb2ZoLT5idWZzW2ldLm1hcHBlZCA9IDA7Ci0JCQl9Ci0JCQlnby0+aW5fdXNlID0gMTsKLQkJfSBlbHNlIHsKLQkJCWdvLT5pbl91c2UgPSAwOworCisJCW1lbXNldChnb2ZoLT5idWZzLCAwLCBjb3VudCAqIHNpemVvZihzdHJ1Y3QgZ283MDA3X2J1ZmZlcikpOworCisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisJCQlnb2ZoLT5idWZzW2ldLmdvID0gZ287CisJCQlnb2ZoLT5idWZzW2ldLmluZGV4ID0gaTsKKwkJCWdvZmgtPmJ1ZnNbaV0uc3RhdGUgPSBCVUZfU1RBVEVfSURMRTsKKwkJCWdvZmgtPmJ1ZnNbaV0ubWFwcGVkID0gMDsKIAkJfQotCQlnb2ZoLT5idWZfY291bnQgPSBjb3VudDsKLQkJdXAoJmdvLT5od19sb2NrKTsKLQkJdXAoJmdvZmgtPmxvY2spOwotCQltZW1zZXQocmVxLCAwLCBzaXplb2YoKnJlcSkpOwotCQlyZXEtPmNvdW50ID0gY291bnQ7Ci0JCXJlcS0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLQkJcmVxLT5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOwotCQlyZXR1cm4gMDsKKworCQlnby0+aW5fdXNlID0gMTsKKwl9IGVsc2UgeworCQlnby0+aW5fdXNlID0gMDsKIAl9Ci0JY2FzZSBWSURJT0NfUVVFUllCVUY6Ci0JewotCQlzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZiA9IGFyZzsKLQkJdW5zaWduZWQgaW50IGluZGV4OwogCi0JCXJldHZhbCA9IC1FSU5WQUw7Ci0JCWlmIChidWYtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWluZGV4ID0gYnVmLT5pbmRleDsKLQkJZG93bigmZ29maC0+bG9jayk7Ci0JCWlmIChpbmRleCA+PSBnb2ZoLT5idWZfY291bnQpCi0JCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOwotCQltZW1zZXQoYnVmLCAwLCBzaXplb2YoKmJ1ZikpOwotCQlidWYtPmluZGV4ID0gaW5kZXg7Ci0JCWJ1Zi0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLQkJc3dpdGNoIChnb2ZoLT5idWZzW2luZGV4XS5zdGF0ZSkgewotCQljYXNlIEJVRl9TVEFURV9RVUVVRUQ6Ci0JCQlidWYtPmZsYWdzID0gVjRMMl9CVUZfRkxBR19RVUVVRUQ7Ci0JCQlicmVhazsKLQkJY2FzZSBCVUZfU1RBVEVfRE9ORToKLQkJCWJ1Zi0+ZmxhZ3MgPSBWNEwyX0JVRl9GTEFHX0RPTkU7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJ1Zi0+ZmxhZ3MgPSAwOwotCQl9Ci0JCWlmIChnb2ZoLT5idWZzW2luZGV4XS5tYXBwZWQpCi0JCQlidWYtPmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfTUFQUEVEOwotCQlidWYtPm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7Ci0JCWJ1Zi0+bS5vZmZzZXQgPSBpbmRleCAqIEdPNzAwN19CVUZfU0laRTsKLQkJYnVmLT5sZW5ndGggPSBHTzcwMDdfQlVGX1NJWkU7Ci0JCXVwKCZnb2ZoLT5sb2NrKTsKKwlnb2ZoLT5idWZfY291bnQgPSBjb3VudDsKKwl1cCgmZ28tPmh3X2xvY2spOworCXVwKCZnb2ZoLT5sb2NrKTsKIAotCQlyZXR1cm4gMDsKLQl9Ci0JY2FzZSBWSURJT0NfUUJVRjoKLQl7Ci0JCXN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmID0gYXJnOwotCQlzdHJ1Y3QgZ283MDA3X2J1ZmZlciAqZ29idWY7Ci0JCWludCByZXQ7CisJbWVtc2V0KHJlcSwgMCwgc2l6ZW9mKCpyZXEpKTsKIAotCQlyZXR2YWwgPSAtRUlOVkFMOwotCQlpZiAoYnVmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSB8fAotCQkJCWJ1Zi0+bWVtb3J5ICE9IFY0TDJfTUVNT1JZX01NQVApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJZG93bigmZ29maC0+bG9jayk7Ci0JCWlmIChidWYtPmluZGV4IDwgMCB8fCBidWYtPmluZGV4ID49IGdvZmgtPmJ1Zl9jb3VudCkKLQkJCWdvdG8gdW5sb2NrX2FuZF9yZXR1cm47Ci0JCWdvYnVmID0gJmdvZmgtPmJ1ZnNbYnVmLT5pbmRleF07Ci0JCWlmIChnb2J1Zi0+bWFwcGVkID09IDApCi0JCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOwotCQlyZXR2YWwgPSAtRUJVU1k7Ci0JCWlmIChnb2J1Zi0+c3RhdGUgIT0gQlVGX1NUQVRFX0lETEUpCi0JCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOwotCQkvKiBvZmZzZXQgd2lsbCBiZSAwIHVudGlsIHdlIHJlYWxseSBzdXBwb3J0IFVTRVJQVFIgc3RyZWFtaW5nICovCi0JCWdvYnVmLT5vZmZzZXQgPSBnb2J1Zi0+dXNlcl9hZGRyICYgflBBR0VfTUFTSzsKLQkJZ29idWYtPmJ5dGVzdXNlZCA9IDA7Ci0JCWdvYnVmLT5mcmFtZV9vZmZzZXQgPSAwOwotCQlnb2J1Zi0+bW9kZXRfYWN0aXZlID0gMDsKLQkJaWYgKGdvYnVmLT5vZmZzZXQgPiAwKQotCQkJZ29idWYtPnBhZ2VfY291bnQgPSBHTzcwMDdfQlVGX1BBR0VTICsgMTsKLQkJZWxzZQotCQkJZ29idWYtPnBhZ2VfY291bnQgPSBHTzcwMDdfQlVGX1BBR0VTOwotCQlyZXR2YWwgPSAtRU5PTUVNOwotCQlkb3duX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JCXJldCA9IGdldF91c2VyX3BhZ2VzKGN1cnJlbnQsIGN1cnJlbnQtPm1tLAotCQkJCWdvYnVmLT51c2VyX2FkZHIgJiBQQUdFX01BU0ssIGdvYnVmLT5wYWdlX2NvdW50LAotCQkJCTEsIDEsIGdvYnVmLT5wYWdlcywgTlVMTCk7Ci0JCXVwX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JCWlmIChyZXQgIT0gZ29idWYtPnBhZ2VfY291bnQpIHsKLQkJCWludCBpOwotCQkJZm9yIChpID0gMDsgaSA8IHJldDsgKytpKQotCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShnb2J1Zi0+cGFnZXNbaV0pOwotCQkJZ29idWYtPnBhZ2VfY291bnQgPSAwOwotCQkJZ290byB1bmxvY2tfYW5kX3JldHVybjsKLQkJfQotCQlnb2J1Zi0+c3RhdGUgPSBCVUZfU1RBVEVfUVVFVUVEOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ28tPnNwaW5sb2NrLCBmbGFncyk7Ci0JCWxpc3RfYWRkX3RhaWwoJmdvYnVmLT5zdHJlYW0sICZnby0+c3RyZWFtKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ28tPnNwaW5sb2NrLCBmbGFncyk7Ci0JCXVwKCZnb2ZoLT5sb2NrKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWNhc2UgVklESU9DX0RRQlVGOgotCXsKLQkJc3RydWN0IHY0bDJfYnVmZmVyICpidWYgPSBhcmc7Ci0JCXN0cnVjdCBnbzcwMDdfYnVmZmVyICpnb2J1ZjsKLQkJdTMyIGZyYW1lX3R5cGVfZmxhZzsKLQkJREVGSU5FX1dBSVQod2FpdCk7CisJcmVxLT5jb3VudCA9IGNvdW50OworCXJlcS0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwlyZXEtPm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CiAKLQkJaWYgKGJ1Zi0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKGJ1Zi0+bWVtb3J5ICE9IFY0TDJfTUVNT1JZX01NQVApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJZG93bigmZ29maC0+bG9jayk7Ci0JCXJldHZhbCA9IC1FSU5WQUw7Ci0JCWlmIChsaXN0X2VtcHR5KCZnby0+c3RyZWFtKSkKLQkJCWdvdG8gdW5sb2NrX2FuZF9yZXR1cm47Ci0JCWdvYnVmID0gbGlzdF9lbnRyeShnby0+c3RyZWFtLm5leHQsCi0JCQkJc3RydWN0IGdvNzAwN19idWZmZXIsIHN0cmVhbSk7Ci0JCXJldHZhbCA9IC1FQUdBSU47Ci0JCWlmIChnb2J1Zi0+c3RhdGUgIT0gQlVGX1NUQVRFX0RPTkUgJiYKLQkJCQkhKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSkgewotCQkJZm9yICg7OykgewotCQkJCXByZXBhcmVfdG9fd2FpdCgmZ28tPmZyYW1lX3dhaXRxLCAmd2FpdCwKLQkJCQkJCVRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCQkJaWYgKGdvYnVmLT5zdGF0ZSA9PSBCVUZfU1RBVEVfRE9ORSkKLQkJCQkJYnJlYWs7Ci0JCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCXNjaGVkdWxlKCk7Ci0JCQl9Ci0JCQlmaW5pc2hfd2FpdCgmZ28tPmZyYW1lX3dhaXRxLCAmd2FpdCk7Ci0JCX0KLQkJaWYgKGdvYnVmLT5zdGF0ZSAhPSBCVUZfU1RBVEVfRE9ORSkKLQkJCWdvdG8gdW5sb2NrX2FuZF9yZXR1cm47Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZnby0+c3BpbmxvY2ssIGZsYWdzKTsKLQkJZGVhY3RpdmF0ZV9idWZmZXIoZ29idWYpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnby0+c3BpbmxvY2ssIGZsYWdzKTsKLQkJZnJhbWVfdHlwZV9mbGFnID0gZ2V0X2ZyYW1lX3R5cGVfZmxhZyhnb2J1ZiwgZ28tPmZvcm1hdCk7Ci0JCWdvYnVmLT5zdGF0ZSA9IEJVRl9TVEFURV9JRExFOwotCQltZW1zZXQoYnVmLCAwLCBzaXplb2YoKmJ1ZikpOwotCQlidWYtPmluZGV4ID0gZ29idWYtPmluZGV4OwotCQlidWYtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7Ci0JCWJ1Zi0+Ynl0ZXN1c2VkID0gZ29idWYtPmJ5dGVzdXNlZDsKLQkJYnVmLT5mbGFncyA9IFY0TDJfQlVGX0ZMQUdfTUFQUEVEIHwgZnJhbWVfdHlwZV9mbGFnOwotCQlidWYtPmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOwotCQlidWYtPnRpbWVzdGFtcCA9IGdvYnVmLT50aW1lc3RhbXA7Ci0JCWJ1Zi0+c2VxdWVuY2UgPSBnb2J1Zi0+c2VxOwotCQlidWYtPm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7Ci0JCWJ1Zi0+bS5vZmZzZXQgPSBnb2J1Zi0+aW5kZXggKiBHTzcwMDdfQlVGX1NJWkU7Ci0JCWJ1Zi0+bGVuZ3RoID0gR083MDA3X0JVRl9TSVpFOwotCQlidWYtPnJlc2VydmVkID0gZ29idWYtPm1vZGV0X2FjdGl2ZTsKLQkJdXAoJmdvZmgtPmxvY2spOwotCQlyZXR1cm4gMDsKLQl9Ci0JY2FzZSBWSURJT0NfU1RSRUFNT046Ci0JewotCQl1bnNpZ25lZCBpbnQgKnR5cGUgPSBhcmc7CisJcmV0dXJuIDA7CiAKLQkJaWYgKCp0eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlkb3duKCZnb2ZoLT5sb2NrKTsKLQkJZG93bigmZ28tPmh3X2xvY2spOwotCQlpZiAoIWdvLT5zdHJlYW1pbmcpIHsKLQkJCWdvLT5zdHJlYW1pbmcgPSAxOwotCQkJZ28tPm5leHRfc2VxID0gMDsKLQkJCWdvLT5hY3RpdmVfYnVmID0gTlVMTDsKLQkJCWlmIChnbzcwMDdfc3RhcnRfZW5jb2RlcihnbykgPCAwKQotCQkJCXJldHZhbCA9IC1FSU87Ci0JCQllbHNlCi0JCQkJcmV0dmFsID0gMDsKLQkJfQotCQl1cCgmZ28tPmh3X2xvY2spOwotCQl1cCgmZ29maC0+bG9jayk7Cit1bmxvY2tfYW5kX3JldHVybjoKKwl1cCgmZ29maC0+bG9jayk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCB2aWRpb2NfcXVlcnlidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgICBzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCWludCByZXR2YWwgPSAtRUlOVkFMOworCXVuc2lnbmVkIGludCBpbmRleDsKKworCWlmIChidWYtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQogCQlyZXR1cm4gcmV0dmFsOwotCX0KLQljYXNlIFZJRElPQ19TVFJFQU1PRkY6Ci0JewotCQl1bnNpZ25lZCBpbnQgKnR5cGUgPSBhcmc7CiAKLQkJaWYgKCp0eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlkb3duKCZnb2ZoLT5sb2NrKTsKLQkJZ283MDA3X3N0cmVhbW9mZihnbyk7Ci0JCXVwKCZnb2ZoLT5sb2NrKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWNhc2UgVklESU9DX1FVRVJZQ1RSTDoKLQl7Ci0JCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqY3RybCA9IGFyZzsKLQkJdTMyIGlkOworCWluZGV4ID0gYnVmLT5pbmRleDsKIAotCQlpZiAoIWdvLT5pMmNfYWRhcHRlcl9vbmxpbmUpCi0JCQlyZXR1cm4gLUVJTzsKLQkJaWQgPSBjdHJsLT5pZDsKLQkJbWVtc2V0KGN0cmwsIDAsIHNpemVvZigqY3RybCkpOwotCQljdHJsLT5pZCA9IGlkOwotCQlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19RVUVSWUNUUkwsIGFyZyk7Ci0JCXJldHVybiBjdHJsLT5uYW1lWzBdID09IDAgPyAtRUlOVkFMIDogMDsKLQl9Ci0JY2FzZSBWSURJT0NfR19DVFJMOgotCXsKLQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCA9IGFyZzsKLQkJc3RydWN0IHY0bDJfcXVlcnljdHJsIHF1ZXJ5OworCWRvd24oJmdvZmgtPmxvY2spOworCWlmIChpbmRleCA+PSBnb2ZoLT5idWZfY291bnQpCisJCWdvdG8gdW5sb2NrX2FuZF9yZXR1cm47CiAKLQkJaWYgKCFnby0+aTJjX2FkYXB0ZXJfb25saW5lKQotCQkJcmV0dXJuIC1FSU87Ci0JCW1lbXNldCgmcXVlcnksIDAsIHNpemVvZihxdWVyeSkpOwotCQlxdWVyeS5pZCA9IGN0cmwtPmlkOwotCQlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19RVUVSWUNUUkwsICZxdWVyeSk7Ci0JCWlmIChxdWVyeS5uYW1lWzBdID09IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaTJjX2NsaWVudHNfY29tbWFuZCgmZ28tPmkyY19hZGFwdGVyLCBWSURJT0NfR19DVFJMLCBhcmcpOwotCQlyZXR1cm4gMDsKLQl9Ci0JY2FzZSBWSURJT0NfU19DVFJMOgotCXsKLQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCA9IGFyZzsKLQkJc3RydWN0IHY0bDJfcXVlcnljdHJsIHF1ZXJ5OworCW1lbXNldChidWYsIDAsIHNpemVvZigqYnVmKSk7CisJYnVmLT5pbmRleCA9IGluZGV4OworCWJ1Zi0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKIAotCQlpZiAoIWdvLT5pMmNfYWRhcHRlcl9vbmxpbmUpCi0JCQlyZXR1cm4gLUVJTzsKLQkJbWVtc2V0KCZxdWVyeSwgMCwgc2l6ZW9mKHF1ZXJ5KSk7Ci0JCXF1ZXJ5LmlkID0gY3RybC0+aWQ7Ci0JCWkyY19jbGllbnRzX2NvbW1hbmQoJmdvLT5pMmNfYWRhcHRlciwgVklESU9DX1FVRVJZQ1RSTCwgJnF1ZXJ5KTsKLQkJaWYgKHF1ZXJ5Lm5hbWVbMF0gPT0gMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19TX0NUUkwsIGFyZyk7Ci0JCXJldHVybiAwOworCXN3aXRjaCAoZ29maC0+YnVmc1tpbmRleF0uc3RhdGUpIHsKKwljYXNlIEJVRl9TVEFURV9RVUVVRUQ6CisJCWJ1Zi0+ZmxhZ3MgPSBWNEwyX0JVRl9GTEFHX1FVRVVFRDsKKwkJYnJlYWs7CisJY2FzZSBCVUZfU1RBVEVfRE9ORToKKwkJYnVmLT5mbGFncyA9IFY0TDJfQlVGX0ZMQUdfRE9ORTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnVmLT5mbGFncyA9IDA7CiAJfQotCWNhc2UgVklESU9DX0dfUEFSTToKLQl7Ci0JCXN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKnBhcm0gPSBhcmc7Ci0JCXN0cnVjdCB2NGwyX2ZyYWN0IHRpbWVwZXJmcmFtZSA9IHsKLQkJCS5udW1lcmF0b3IgPSAxMDAxICogIGdvLT5mcHNfc2NhbGUsCi0JCQkuZGVub21pbmF0b3IgPSBnby0+c2Vuc29yX2ZyYW1lcmF0ZSwKLQkJfTsKIAotCQlpZiAocGFybS0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJbWVtc2V0KHBhcm0sIDAsIHNpemVvZigqcGFybSkpOwotCQlwYXJtLT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwotCQlwYXJtLT5wYXJtLmNhcHR1cmUuY2FwYWJpbGl0eSB8PSBWNEwyX0NBUF9USU1FUEVSRlJBTUU7Ci0JCXBhcm0tPnBhcm0uY2FwdHVyZS50aW1lcGVyZnJhbWUgPSB0aW1lcGVyZnJhbWU7Ci0JCXJldHVybiAwOworCWlmIChnb2ZoLT5idWZzW2luZGV4XS5tYXBwZWQpCisJCWJ1Zi0+ZmxhZ3MgfD0gVjRMMl9CVUZfRkxBR19NQVBQRUQ7CisJYnVmLT5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOworCWJ1Zi0+bS5vZmZzZXQgPSBpbmRleCAqIEdPNzAwN19CVUZfU0laRTsKKwlidWYtPmxlbmd0aCA9IEdPNzAwN19CVUZfU0laRTsKKwl1cCgmZ29maC0+bG9jayk7CisKKwlyZXR1cm4gMDsKKwordW5sb2NrX2FuZF9yZXR1cm46CisJdXAoJmdvZmgtPmxvY2spOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3FidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKQoreworCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maCA9IHByaXY7CisJc3RydWN0IGdvNzAwNyAqZ28gPSBnb2ZoLT5nbzsKKwlzdHJ1Y3QgZ283MDA3X2J1ZmZlciAqZ29idWY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0dmFsID0gLUVJTlZBTDsKKwlpbnQgcmV0OworCisJaWYgKGJ1Zi0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgfHwKKwkJCWJ1Zi0+bWVtb3J5ICE9IFY0TDJfTUVNT1JZX01NQVApCisJCXJldHVybiByZXR2YWw7CisKKwlkb3duKCZnb2ZoLT5sb2NrKTsKKwlpZiAoYnVmLT5pbmRleCA8IDAgfHwgYnVmLT5pbmRleCA+PSBnb2ZoLT5idWZfY291bnQpCisJCWdvdG8gdW5sb2NrX2FuZF9yZXR1cm47CisKKwlnb2J1ZiA9ICZnb2ZoLT5idWZzW2J1Zi0+aW5kZXhdOworCWlmICghZ29idWYtPm1hcHBlZCkKKwkJZ290byB1bmxvY2tfYW5kX3JldHVybjsKKworCXJldHZhbCA9IC1FQlVTWTsKKwlpZiAoZ29idWYtPnN0YXRlICE9IEJVRl9TVEFURV9JRExFKQorCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOworCisJLyogb2Zmc2V0IHdpbGwgYmUgMCB1bnRpbCB3ZSByZWFsbHkgc3VwcG9ydCBVU0VSUFRSIHN0cmVhbWluZyAqLworCWdvYnVmLT5vZmZzZXQgPSBnb2J1Zi0+dXNlcl9hZGRyICYgflBBR0VfTUFTSzsKKwlnb2J1Zi0+Ynl0ZXN1c2VkID0gMDsKKwlnb2J1Zi0+ZnJhbWVfb2Zmc2V0ID0gMDsKKwlnb2J1Zi0+bW9kZXRfYWN0aXZlID0gMDsKKwlpZiAoZ29idWYtPm9mZnNldCA+IDApCisJCWdvYnVmLT5wYWdlX2NvdW50ID0gR083MDA3X0JVRl9QQUdFUyArIDE7CisJZWxzZQorCQlnb2J1Zi0+cGFnZV9jb3VudCA9IEdPNzAwN19CVUZfUEFHRVM7CisKKwlyZXR2YWwgPSAtRU5PTUVNOworCWRvd25fcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwlyZXQgPSBnZXRfdXNlcl9wYWdlcyhjdXJyZW50LCBjdXJyZW50LT5tbSwKKwkJCWdvYnVmLT51c2VyX2FkZHIgJiBQQUdFX01BU0ssIGdvYnVmLT5wYWdlX2NvdW50LAorCQkJMSwgMSwgZ29idWYtPnBhZ2VzLCBOVUxMKTsKKwl1cF9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCisJaWYgKHJldCAhPSBnb2J1Zi0+cGFnZV9jb3VudCkgeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IHJldDsgKytpKQorCQkJcGFnZV9jYWNoZV9yZWxlYXNlKGdvYnVmLT5wYWdlc1tpXSk7CisJCWdvYnVmLT5wYWdlX2NvdW50ID0gMDsKKwkJZ290byB1bmxvY2tfYW5kX3JldHVybjsKIAl9Ci0JY2FzZSBWSURJT0NfU19QQVJNOgotCXsKLQkJc3RydWN0IHY0bDJfc3RyZWFtcGFybSAqcGFybSA9IGFyZzsKLQkJdW5zaWduZWQgaW50IG4sIGQ7CiAKLQkJaWYgKHBhcm0tPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmIChwYXJtLT5wYXJtLmNhcHR1cmUuY2FwdHVyZW1vZGUgIT0gMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQluID0gZ28tPnNlbnNvcl9mcmFtZXJhdGUgKgotCQkJcGFybS0+cGFybS5jYXB0dXJlLnRpbWVwZXJmcmFtZS5udW1lcmF0b3I7Ci0JCWQgPSAxMDAxICogcGFybS0+cGFybS5jYXB0dXJlLnRpbWVwZXJmcmFtZS5kZW5vbWluYXRvcjsKLQkJaWYgKG4gIT0gMCAmJiBkICE9IDAgJiYgbiA+IGQpCi0JCQlnby0+ZnBzX3NjYWxlID0gKG4gKyBkLzIpIC8gZDsKLQkJZWxzZQotCQkJZ28tPmZwc19zY2FsZSA9IDE7Ci0JCXJldHVybiAwOwotCX0KLQljYXNlIFZJRElPQ19FTlVNU1REOgotCXsKLQkJc3RydWN0IHY0bDJfc3RhbmRhcmQgKnN0ZCA9IGFyZzsKKwlnb2J1Zi0+c3RhdGUgPSBCVUZfU1RBVEVfUVVFVUVEOworCXNwaW5fbG9ja19pcnFzYXZlKCZnby0+c3BpbmxvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZF90YWlsKCZnb2J1Zi0+c3RyZWFtLCAmZ28tPnN0cmVhbSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ28tPnNwaW5sb2NrLCBmbGFncyk7CisJdXAoJmdvZmgtPmxvY2spOwogCi0JCWlmICgoZ28tPmJvYXJkX2luZm8tPmZsYWdzICYgR083MDA3X0JPQVJEX0hBU19UVU5FUikgJiYKLQkJCQlnby0+aW5wdXQgPT0gZ28tPmJvYXJkX2luZm8tPm51bV9pbnB1dHMgLSAxKSB7Ci0JCQlpZiAoIWdvLT5pMmNfYWRhcHRlcl9vbmxpbmUpCi0JCQkJcmV0dXJuIC1FSU87Ci0JCQlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsCi0JCQkJCQlWSURJT0NfRU5VTVNURCwgYXJnKTsKLQkJCWlmICghc3RkLT5pZCkgLyogaGFjayB0byBpbmRpY2F0ZSBFSU5WQUwgZnJvbSB0dW5lciAqLwotCQkJCXJldHVybiAtRUlOVkFMOwotCQl9IGVsc2UgaWYgKGdvLT5ib2FyZF9pbmZvLT5zZW5zb3JfZmxhZ3MgJiBHTzcwMDdfU0VOU09SX1RWKSB7Ci0JCQlzd2l0Y2ggKHN0ZC0+aW5kZXgpIHsKLQkJCWNhc2UgMDoKLQkJCQl2NGwyX3ZpZGVvX3N0ZF9jb25zdHJ1Y3Qoc3RkLAotCQkJCQkJVjRMMl9TVERfTlRTQywgIk5UU0MiKTsKKwlyZXR1cm4gMDsKKwordW5sb2NrX2FuZF9yZXR1cm46CisJdXAoJmdvZmgtPmxvY2spOworCXJldHVybiByZXR2YWw7Cit9CisKKworc3RhdGljIGludCB2aWRpb2NfZHFidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKQoreworCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maCA9IHByaXY7CisJc3RydWN0IGdvNzAwNyAqZ28gPSBnb2ZoLT5nbzsKKwlzdHJ1Y3QgZ283MDA3X2J1ZmZlciAqZ29idWY7CisJaW50IHJldHZhbCA9IC1FSU5WQUw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgZnJhbWVfdHlwZV9mbGFnOworCURFRklORV9XQUlUKHdhaXQpOworCisJaWYgKGJ1Zi0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCXJldHVybiByZXR2YWw7CisJaWYgKGJ1Zi0+bWVtb3J5ICE9IFY0TDJfTUVNT1JZX01NQVApCisJCXJldHVybiByZXR2YWw7CisKKwlkb3duKCZnb2ZoLT5sb2NrKTsKKwlpZiAobGlzdF9lbXB0eSgmZ28tPnN0cmVhbSkpCisJCWdvdG8gdW5sb2NrX2FuZF9yZXR1cm47CisJZ29idWYgPSBsaXN0X2VudHJ5KGdvLT5zdHJlYW0ubmV4dCwKKwkJCXN0cnVjdCBnbzcwMDdfYnVmZmVyLCBzdHJlYW0pOworCisJcmV0dmFsID0gLUVBR0FJTjsKKwlpZiAoZ29idWYtPnN0YXRlICE9IEJVRl9TVEFURV9ET05FICYmCisJCQkhKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSkgeworCQlmb3IgKDs7KSB7CisJCQlwcmVwYXJlX3RvX3dhaXQoJmdvLT5mcmFtZV93YWl0cSwgJndhaXQsCisJCQkJCVRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlpZiAoZ29idWYtPnN0YXRlID09IEJVRl9TVEFURV9ET05FKQogCQkJCWJyZWFrOwotCQkJY2FzZSAxOgotCQkJCXY0bDJfdmlkZW9fc3RkX2NvbnN0cnVjdChzdGQsCi0JCQkJCQlWNEwyX1NURF9QQUwgfCBWNEwyX1NURF9TRUNBTSwKLQkJCQkJCSJQQUwvU0VDQU0iKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKIAkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoc3RkLT5pbmRleCAhPSAwKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJbWVtc2V0KHN0ZCwgMCwgc2l6ZW9mKCpzdGQpKTsKLQkJCXNucHJpbnRmKHN0ZC0+bmFtZSwgc2l6ZW9mKHN0ZC0+bmFtZSksICIlZHglZCwgJWRmcHMiLAotCQkJCWdvLT5ib2FyZF9pbmZvLT5zZW5zb3Jfd2lkdGgsCi0JCQkJZ28tPmJvYXJkX2luZm8tPnNlbnNvcl9oZWlnaHQsCi0JCQkJZ28tPmJvYXJkX2luZm8tPnNlbnNvcl9mcmFtZXJhdGUgLyAxMDAwKTsKLQkJCXN0ZC0+ZnJhbWVwZXJpb2QubnVtZXJhdG9yID0gMTAwMTsKLQkJCXN0ZC0+ZnJhbWVwZXJpb2QuZGVub21pbmF0b3IgPQotCQkJCQlnby0+Ym9hcmRfaW5mby0+c2Vuc29yX2ZyYW1lcmF0ZTsKKwkJCXNjaGVkdWxlKCk7CiAJCX0KLQkJcmV0dXJuIDA7CisJCWZpbmlzaF93YWl0KCZnby0+ZnJhbWVfd2FpdHEsICZ3YWl0KTsKIAl9Ci0JY2FzZSBWSURJT0NfR19TVEQ6Ci0JewotCQl2NGwyX3N0ZF9pZCAqc3RkID0gYXJnOworCWlmIChnb2J1Zi0+c3RhdGUgIT0gQlVGX1NUQVRFX0RPTkUpCisJCWdvdG8gdW5sb2NrX2FuZF9yZXR1cm47CiAKLQkJaWYgKChnby0+Ym9hcmRfaW5mby0+ZmxhZ3MgJiBHTzcwMDdfQk9BUkRfSEFTX1RVTkVSKSAmJgotCQkJCWdvLT5pbnB1dCA9PSBnby0+Ym9hcmRfaW5mby0+bnVtX2lucHV0cyAtIDEpIHsKLQkJCWlmICghZ28tPmkyY19hZGFwdGVyX29ubGluZSkKLQkJCQlyZXR1cm4gLUVJTzsKLQkJCWkyY19jbGllbnRzX2NvbW1hbmQoJmdvLT5pMmNfYWRhcHRlciwKLQkJCQkJCVZJRElPQ19HX1NURCwgYXJnKTsKLQkJfSBlbHNlIGlmIChnby0+Ym9hcmRfaW5mby0+c2Vuc29yX2ZsYWdzICYgR083MDA3X1NFTlNPUl9UVikgewotCQkJaWYgKGdvLT5zdGFuZGFyZCA9PSBHTzcwMDdfU1REX05UU0MpCi0JCQkJKnN0ZCA9IFY0TDJfU1REX05UU0M7Ci0JCQllbHNlCi0JCQkJKnN0ZCA9IFY0TDJfU1REX1BBTCB8IFY0TDJfU1REX1NFQ0FNOwotCQl9IGVsc2UKLQkJCSpzdGQgPSAwOwotCQlyZXR1cm4gMDsKLQl9Ci0JY2FzZSBWSURJT0NfU19TVEQ6Ci0JewotCQl2NGwyX3N0ZF9pZCAqc3RkID0gYXJnOworCXNwaW5fbG9ja19pcnFzYXZlKCZnby0+c3BpbmxvY2ssIGZsYWdzKTsKKwlkZWFjdGl2YXRlX2J1ZmZlcihnb2J1Zik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ28tPnNwaW5sb2NrLCBmbGFncyk7CisJZnJhbWVfdHlwZV9mbGFnID0gZ2V0X2ZyYW1lX3R5cGVfZmxhZyhnb2J1ZiwgZ28tPmZvcm1hdCk7CisJZ29idWYtPnN0YXRlID0gQlVGX1NUQVRFX0lETEU7CiAKLQkJaWYgKGdvLT5zdHJlYW1pbmcpCi0JCQlyZXR1cm4gLUVCVVNZOwotCQlpZiAoIShnby0+Ym9hcmRfaW5mby0+c2Vuc29yX2ZsYWdzICYgR083MDA3X1NFTlNPUl9UVikgJiYKLQkJCQkqc3RkICE9IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKCpzdGQgPT0gMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoKGdvLT5ib2FyZF9pbmZvLT5mbGFncyAmIEdPNzAwN19CT0FSRF9IQVNfVFVORVIpICYmCi0JCQkJZ28tPmlucHV0ID09IGdvLT5ib2FyZF9pbmZvLT5udW1faW5wdXRzIC0gMSkgewotCQkJaWYgKCFnby0+aTJjX2FkYXB0ZXJfb25saW5lKQotCQkJCXJldHVybiAtRUlPOwotCQkJaTJjX2NsaWVudHNfY29tbWFuZCgmZ28tPmkyY19hZGFwdGVyLAotCQkJCQkJVklESU9DX1NfU1RELCBhcmcpOwotCQkJaWYgKCEqc3RkKSAvKiBoYWNrIHRvIGluZGljYXRlIEVJTlZBTCBmcm9tIHR1bmVyICovCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJaWYgKCpzdGQgJiBWNEwyX1NURF9OVFNDKSB7Ci0JCQlnby0+c3RhbmRhcmQgPSBHTzcwMDdfU1REX05UU0M7Ci0JCQlnby0+c2Vuc29yX2ZyYW1lcmF0ZSA9IDMwMDAwOwotCQl9IGVsc2UgaWYgKCpzdGQgJiBWNEwyX1NURF9QQUwpIHsKLQkJCWdvLT5zdGFuZGFyZCA9IEdPNzAwN19TVERfUEFMOwotCQkJZ28tPnNlbnNvcl9mcmFtZXJhdGUgPSAyNTAyNTsKLQkJfSBlbHNlIGlmICgqc3RkICYgVjRMMl9TVERfU0VDQU0pIHsKLQkJCWdvLT5zdGFuZGFyZCA9IEdPNzAwN19TVERfUEFMOwotCQkJZ28tPnNlbnNvcl9mcmFtZXJhdGUgPSAyNTAyNTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKGdvLT5pMmNfYWRhcHRlcl9vbmxpbmUpCi0JCQlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsCi0JCQkJCSAgICBWSURJT0NfU19TVEQsIHN0ZCk7Ci0JCXNldF9jYXB0dXJlX3NpemUoZ28sIE5VTEwsIDApOwotCQlyZXR1cm4gMDsKKwltZW1zZXQoYnVmLCAwLCBzaXplb2YoKmJ1ZikpOworCWJ1Zi0+aW5kZXggPSBnb2J1Zi0+aW5kZXg7CisJYnVmLT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCWJ1Zi0+Ynl0ZXN1c2VkID0gZ29idWYtPmJ5dGVzdXNlZDsKKwlidWYtPmZsYWdzID0gVjRMMl9CVUZfRkxBR19NQVBQRUQgfCBmcmFtZV90eXBlX2ZsYWc7CisJYnVmLT5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKKwlidWYtPnRpbWVzdGFtcCA9IGdvYnVmLT50aW1lc3RhbXA7CisJYnVmLT5zZXF1ZW5jZSA9IGdvYnVmLT5zZXE7CisJYnVmLT5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOworCWJ1Zi0+bS5vZmZzZXQgPSBnb2J1Zi0+aW5kZXggKiBHTzcwMDdfQlVGX1NJWkU7CisJYnVmLT5sZW5ndGggPSBHTzcwMDdfQlVGX1NJWkU7CisJYnVmLT5yZXNlcnZlZCA9IGdvYnVmLT5tb2RldF9hY3RpdmU7CisKKwl1cCgmZ29maC0+bG9jayk7CisJcmV0dXJuIDA7CisKK3VubG9ja19hbmRfcmV0dXJuOgorCXVwKCZnb2ZoLT5sb2NrKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zdHJlYW1vbihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUpCit7CisJc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gcHJpdjsKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IGdvZmgtPmdvOworCWludCByZXR2YWwgPSAwOworCisJaWYgKHR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRvd24oJmdvZmgtPmxvY2spOworCWRvd24oJmdvLT5od19sb2NrKTsKKworCWlmICghZ28tPnN0cmVhbWluZykgeworCQlnby0+c3RyZWFtaW5nID0gMTsKKwkJZ28tPm5leHRfc2VxID0gMDsKKwkJZ28tPmFjdGl2ZV9idWYgPSBOVUxMOworCQlpZiAoZ283MDA3X3N0YXJ0X2VuY29kZXIoZ28pIDwgMCkKKwkJCXJldHZhbCA9IC1FSU87CisJCWVsc2UKKwkJCXJldHZhbCA9IDA7CiAJfQorCXVwKCZnby0+aHdfbG9jayk7CisJdXAoJmdvZmgtPmxvY2spOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc3RyZWFtb2ZmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CisKKwlpZiAodHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCXJldHVybiAtRUlOVkFMOworCWRvd24oJmdvZmgtPmxvY2spOworCWdvNzAwN19zdHJlYW1vZmYoZ28pOworCXVwKCZnb2ZoLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19xdWVyeWN0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgICBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnF1ZXJ5KQoreworCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maCA9IHByaXY7CisJc3RydWN0IGdvNzAwNyAqZ28gPSBnb2ZoLT5nbzsKKworCWlmICghZ28tPmkyY19hZGFwdGVyX29ubGluZSkKKwkJcmV0dXJuIC1FSU87CisKKwlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19RVUVSWUNUUkwsIHF1ZXJ5KTsKKworCXJldHVybiAoIXF1ZXJ5LT5uYW1lWzBdKSA/IC1FSU5WQUwgOiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19nX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CisJc3RydWN0IHY0bDJfcXVlcnljdHJsIHF1ZXJ5OworCisJaWYgKCFnby0+aTJjX2FkYXB0ZXJfb25saW5lKQorCQlyZXR1cm4gLUVJTzsKKworCW1lbXNldCgmcXVlcnksIDAsIHNpemVvZihxdWVyeSkpOworCXF1ZXJ5LmlkID0gY3RybC0+aWQ7CisJaTJjX2NsaWVudHNfY29tbWFuZCgmZ28tPmkyY19hZGFwdGVyLCBWSURJT0NfUVVFUllDVFJMLCAmcXVlcnkpOworCWlmIChxdWVyeS5uYW1lWzBdID09IDApCisJCXJldHVybiAtRUlOVkFMOworCWkyY19jbGllbnRzX2NvbW1hbmQoJmdvLT5pMmNfYWRhcHRlciwgVklESU9DX0dfQ1RSTCwgY3RybCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCit7CisJc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gcHJpdjsKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IGdvZmgtPmdvOworCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBxdWVyeTsKKworCWlmICghZ28tPmkyY19hZGFwdGVyX29ubGluZSkKKwkJcmV0dXJuIC1FSU87CisKKwltZW1zZXQoJnF1ZXJ5LCAwLCBzaXplb2YocXVlcnkpKTsKKwlxdWVyeS5pZCA9IGN0cmwtPmlkOworCWkyY19jbGllbnRzX2NvbW1hbmQoJmdvLT5pMmNfYWRhcHRlciwgVklESU9DX1FVRVJZQ1RSTCwgJnF1ZXJ5KTsKKwlpZiAocXVlcnkubmFtZVswXSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19TX0NUUkwsIGN0cmwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfcGFybShzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKKwkJc3RydWN0IHY0bDJfc3RyZWFtcGFybSAqcGFybSkKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CisJc3RydWN0IHY0bDJfZnJhY3QgdGltZXBlcmZyYW1lID0geworCQkubnVtZXJhdG9yID0gMTAwMSAqICBnby0+ZnBzX3NjYWxlLAorCQkuZGVub21pbmF0b3IgPSBnby0+c2Vuc29yX2ZyYW1lcmF0ZSwKKwl9OworCisJaWYgKHBhcm0tPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBhcm0tPnBhcm0uY2FwdHVyZS5jYXBhYmlsaXR5IHw9IFY0TDJfQ0FQX1RJTUVQRVJGUkFNRTsKKwlwYXJtLT5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lID0gdGltZXBlcmZyYW1lOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfcGFybShzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKKwkJc3RydWN0IHY0bDJfc3RyZWFtcGFybSAqcGFybSkKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CisJdW5zaWduZWQgaW50IG4sIGQ7CisKKwlpZiAocGFybS0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChwYXJtLT5wYXJtLmNhcHR1cmUuY2FwdHVyZW1vZGUgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwluID0gZ28tPnNlbnNvcl9mcmFtZXJhdGUgKgorCQlwYXJtLT5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lLm51bWVyYXRvcjsKKwlkID0gMTAwMSAqIHBhcm0tPnBhcm0uY2FwdHVyZS50aW1lcGVyZnJhbWUuZGVub21pbmF0b3I7CisJaWYgKG4gIT0gMCAmJiBkICE9IDAgJiYgbiA+IGQpCisJCWdvLT5mcHNfc2NhbGUgPSAobiArIGQvMikgLyBkOworCWVsc2UKKwkJZ28tPmZwc19zY2FsZSA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworLyogVklESU9DX0VOVU1TVEQgb24gZ283MDA3IHdlcmUgdXNlZCBmb3IgZW51bWJlcmF0aW5nIHRoZSBzdXBwb3J0ZWQgZnBzIGFuZAorICAgaXRzIHJlc29sdXRpb24sIHdoZW4gdGhlIGRldmljZSBpcyBub3QgY29ubmVjdGVkIHRvIFRWLgorICAgVGhpcyB3ZXJlIGFuIEFQSSBhYnVzZSwgcHJvYmFibHkgdXNlZCBieSB0aGUgbGFjayBvZiBzcGVjaWZpYyBJT0NUTCdzIHRvCisgICBlbnVtYmVyYXRlIGl0LCBieSB0aGUgdGltZSB0aGUgZHJpdmVyIHdlcmUgd3JpdHRlbi4KKworICAgSG93ZXZlciwgc2luY2Uga2VybmVsIDIuNi4xOSwgdHdvIG5ldyBpb2N0bHMgKFZJRElPQ19FTlVNX0ZSQU1FSU5URVJWQUxTCisgICBhbmQgVklESU9DX0VOVU1fRlJBTUVTSVpFUykgd2VyZSBhZGRlZCBmb3IgdGhpcyBwdXJwb3NlLgorCisgICBUaGUgdHdvIGZ1bmN0aW9ucyBiZWxsb3cgaW1wbGVtZW50cyB0aGUgbmV3ZXIgaW9jdGxzCisqLworc3RhdGljIGludCB2aWRpb2NfZW51bV9mcmFtZXNpemVzKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAorCQkJCSAgc3RydWN0IHY0bDJfZnJtc2l6ZWVudW0gKmZzaXplKQoreworCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maCA9IHByaXY7CisJc3RydWN0IGdvNzAwNyAqZ28gPSBnb2ZoLT5nbzsKKworCS8qIFJldHVybiAtRUlOVkFMLCBpZiBpdCBpcyBhIFRWIGJvYXJkICovCisJaWYgKChnby0+Ym9hcmRfaW5mby0+ZmxhZ3MgJiBHTzcwMDdfQk9BUkRfSEFTX1RVTkVSKSB8fAorCSAgICAoZ28tPmJvYXJkX2luZm8tPnNlbnNvcl9mbGFncyAmIEdPNzAwN19TRU5TT1JfVFYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChmc2l6ZS0+aW5kZXggPiAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZzaXplLT50eXBlID0gVjRMMl9GUk1TSVpFX1RZUEVfRElTQ1JFVEU7CisJZnNpemUtPmRpc2NyZXRlLndpZHRoID0gZ28tPmJvYXJkX2luZm8tPnNlbnNvcl93aWR0aDsKKwlmc2l6ZS0+ZGlzY3JldGUuaGVpZ2h0ID0gZ28tPmJvYXJkX2luZm8tPnNlbnNvcl9oZWlnaHQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfZW51bV9mcmFtZWludGVydmFscyhzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKKwkJCQkgICAgICBzdHJ1Y3QgdjRsMl9mcm1pdmFsZW51bSAqZml2YWwpCit7CisJc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gcHJpdjsKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IGdvZmgtPmdvOworCisJLyogUmV0dXJuIC1FSU5WQUwsIGlmIGl0IGlzIGEgVFYgYm9hcmQgKi8KKwlpZiAoKGdvLT5ib2FyZF9pbmZvLT5mbGFncyAmIEdPNzAwN19CT0FSRF9IQVNfVFVORVIpIHx8CisJICAgIChnby0+Ym9hcmRfaW5mby0+c2Vuc29yX2ZsYWdzICYgR083MDA3X1NFTlNPUl9UVikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGZpdmFsLT5pbmRleCA+IDApCisJCXJldHVybiAtRUlOVkFMOworCisJZml2YWwtPnR5cGUgPSBWNEwyX0ZSTUlWQUxfVFlQRV9ESVNDUkVURTsKKwlmaXZhbC0+ZGlzY3JldGUubnVtZXJhdG9yID0gMTAwMTsKKwlmaXZhbC0+ZGlzY3JldGUuZGVub21pbmF0b3IgPSBnby0+Ym9hcmRfaW5mby0+c2Vuc29yX2ZyYW1lcmF0ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zX3N0ZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgdjRsMl9zdGRfaWQgKnN0ZCkKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CisKKwlpZiAoZ28tPnN0cmVhbWluZykKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmICghKGdvLT5ib2FyZF9pbmZvLT5zZW5zb3JfZmxhZ3MgJiBHTzcwMDdfU0VOU09SX1RWKSAmJgorCQkJKnN0ZCAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgqc3RkID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKChnby0+Ym9hcmRfaW5mby0+ZmxhZ3MgJiBHTzcwMDdfQk9BUkRfSEFTX1RVTkVSKSAmJgorCQkJZ28tPmlucHV0ID09IGdvLT5ib2FyZF9pbmZvLT5udW1faW5wdXRzIC0gMSkgeworCQlpZiAoIWdvLT5pMmNfYWRhcHRlcl9vbmxpbmUpCisJCQlyZXR1cm4gLUVJTzsKKwkJaTJjX2NsaWVudHNfY29tbWFuZCgmZ28tPmkyY19hZGFwdGVyLAorCQkJCQlWSURJT0NfU19TVEQsIHN0ZCk7CisJCWlmICghKnN0ZCkgLyogaGFjayB0byBpbmRpY2F0ZSBFSU5WQUwgZnJvbSB0dW5lciAqLworCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCpzdGQgJiBWNEwyX1NURF9OVFNDKSB7CisJCWdvLT5zdGFuZGFyZCA9IEdPNzAwN19TVERfTlRTQzsKKwkJZ28tPnNlbnNvcl9mcmFtZXJhdGUgPSAzMDAwMDsKKwl9IGVsc2UgaWYgKCpzdGQgJiBWNEwyX1NURF9QQUwpIHsKKwkJZ28tPnN0YW5kYXJkID0gR083MDA3X1NURF9QQUw7CisJCWdvLT5zZW5zb3JfZnJhbWVyYXRlID0gMjUwMjU7CisJfSBlbHNlIGlmICgqc3RkICYgVjRMMl9TVERfU0VDQU0pIHsKKwkJZ28tPnN0YW5kYXJkID0gR083MDA3X1NURF9QQUw7CisJCWdvLT5zZW5zb3JfZnJhbWVyYXRlID0gMjUwMjU7CisJfSBlbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGdvLT5pMmNfYWRhcHRlcl9vbmxpbmUpCisJCWkyY19jbGllbnRzX2NvbW1hbmQoJmdvLT5pMmNfYWRhcHRlciwKKwkJCQkJVklESU9DX1NfU1RELCBzdGQpOworCXNldF9jYXB0dXJlX3NpemUoZ28sIE5VTEwsIDApOworCisJcmV0dXJuIDA7Cit9CisKKyNpZiAwCiAJY2FzZSBWSURJT0NfUVVFUllTVEQ6CiAJewogCQl2NGwyX3N0ZF9pZCAqc3RkID0gYXJnOwpAQCAtODg0LDIxOSArMTE5NSwyNjkgQEAKIAkJCSpzdGQgPSAwOwogCQlyZXR1cm4gMDsKIAl9Ci0JY2FzZSBWSURJT0NfRU5VTUlOUFVUOgotCXsKLQkJc3RydWN0IHY0bDJfaW5wdXQgKmlucCA9IGFyZzsKLQkJaW50IGluZGV4OworI2VuZGlmCiAKLQkJaWYgKGlucC0+aW5kZXggPj0gZ28tPmJvYXJkX2luZm8tPm51bV9pbnB1dHMpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaW5kZXggPSBpbnAtPmluZGV4OwotCQltZW1zZXQoaW5wLCAwLCBzaXplb2YoKmlucCkpOwotCQlpbnAtPmluZGV4ID0gaW5kZXg7Ci0JCXN0cm5jcHkoaW5wLT5uYW1lLCBnby0+Ym9hcmRfaW5mby0+aW5wdXRzW2luZGV4XS5uYW1lLAotCQkJCXNpemVvZihpbnAtPm5hbWUpKTsKLQkJLyogSWYgdGhpcyBib2FyZCBoYXMgYSB0dW5lciwgaXQgd2lsbCBiZSB0aGUgbGFzdCBpbnB1dCAqLwotCQlpZiAoKGdvLT5ib2FyZF9pbmZvLT5mbGFncyAmIEdPNzAwN19CT0FSRF9IQVNfVFVORVIpICYmCi0JCQkJaW5kZXggPT0gZ28tPmJvYXJkX2luZm8tPm51bV9pbnB1dHMgLSAxKQotCQkJaW5wLT50eXBlID0gVjRMMl9JTlBVVF9UWVBFX1RVTkVSOwotCQllbHNlCi0JCQlpbnAtPnR5cGUgPSBWNEwyX0lOUFVUX1RZUEVfQ0FNRVJBOwotCQlpbnAtPmF1ZGlvc2V0ID0gMDsKLQkJaW5wLT50dW5lciA9IDA7Ci0JCWlmIChnby0+Ym9hcmRfaW5mby0+c2Vuc29yX2ZsYWdzICYgR083MDA3X1NFTlNPUl9UVikKLQkJCWlucC0+c3RkID0gVjRMMl9TVERfTlRTQyB8IFY0TDJfU1REX1BBTCB8Ci0JCQkJCQkJVjRMMl9TVERfU0VDQU07Ci0JCWVsc2UKLQkJCWlucC0+c3RkID0gMDsKLQkJcmV0dXJuIDA7CitzdGF0aWMgaW50IHZpZGlvY19lbnVtX2lucHV0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX2lucHV0ICppbnApCit7CisJc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gcHJpdjsKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IGdvZmgtPmdvOworCisJaWYgKGlucC0+aW5kZXggPj0gZ28tPmJvYXJkX2luZm8tPm51bV9pbnB1dHMpCisJCXJldHVybiAtRUlOVkFMOworCisJc3RybmNweShpbnAtPm5hbWUsIGdvLT5ib2FyZF9pbmZvLT5pbnB1dHNbaW5wLT5pbmRleF0ubmFtZSwKKwkJCXNpemVvZihpbnAtPm5hbWUpKTsKKworCS8qIElmIHRoaXMgYm9hcmQgaGFzIGEgdHVuZXIsIGl0IHdpbGwgYmUgdGhlIGxhc3QgaW5wdXQgKi8KKwlpZiAoKGdvLT5ib2FyZF9pbmZvLT5mbGFncyAmIEdPNzAwN19CT0FSRF9IQVNfVFVORVIpICYmCisJCQlpbnAtPmluZGV4ID09IGdvLT5ib2FyZF9pbmZvLT5udW1faW5wdXRzIC0gMSkKKwkJaW5wLT50eXBlID0gVjRMMl9JTlBVVF9UWVBFX1RVTkVSOworCWVsc2UKKwkJaW5wLT50eXBlID0gVjRMMl9JTlBVVF9UWVBFX0NBTUVSQTsKKworCWlucC0+YXVkaW9zZXQgPSAwOworCWlucC0+dHVuZXIgPSAwOworCWlmIChnby0+Ym9hcmRfaW5mby0+c2Vuc29yX2ZsYWdzICYgR083MDA3X1NFTlNPUl9UVikKKwkJaW5wLT5zdGQgPSBWNEwyX1NURF9OVFNDIHwgVjRMMl9TVERfUEFMIHwKKwkJCQkJCVY0TDJfU1REX1NFQ0FNOworCWVsc2UKKwkJaW5wLT5zdGQgPSAwOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCB2aWRpb2NfZ19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50ICppbnB1dCkKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CisKKwkqaW5wdXQgPSBnby0+aW5wdXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50IGlucHV0KQoreworCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maCA9IHByaXY7CisJc3RydWN0IGdvNzAwNyAqZ28gPSBnb2ZoLT5nbzsKKworCWlmIChpbnB1dCA+PSBnby0+Ym9hcmRfaW5mby0+bnVtX2lucHV0cykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGdvLT5zdHJlYW1pbmcpCisJCXJldHVybiAtRUJVU1k7CisKKwlnby0+aW5wdXQgPSBpbnB1dDsKKwlpZiAoZ28tPmkyY19hZGFwdGVyX29ubGluZSkgeworCQlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19TX0lOUFVULAorCQkJJmdvLT5ib2FyZF9pbmZvLT5pbnB1dHNbaW5wdXRdLnZpZGVvX2lucHV0KTsKKwkJaTJjX2NsaWVudHNfY29tbWFuZCgmZ28tPmkyY19hZGFwdGVyLCBWSURJT0NfU19BVURJTywKKwkJCSZnby0+Ym9hcmRfaW5mby0+aW5wdXRzW2lucHV0XS5hdWRpb19pbnB1dCk7CiAJfQotCWNhc2UgVklESU9DX0dfSU5QVVQ6Ci0JewotCQlpbnQgKmlucHV0ID0gYXJnOwogCi0JCSppbnB1dCA9IGdvLT5pbnB1dDsKLQkJcmV0dXJuIDA7Ci0JfQotCWNhc2UgVklESU9DX1NfSU5QVVQ6Ci0JewotCQlpbnQgKmlucHV0ID0gYXJnOworCXJldHVybiAwOworfQogCi0JCWlmICgqaW5wdXQgPj0gZ28tPmJvYXJkX2luZm8tPm51bV9pbnB1dHMpCitzdGF0aWMgaW50IHZpZGlvY19nX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX3R1bmVyICp0KQoreworCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maCA9IHByaXY7CisJc3RydWN0IGdvNzAwNyAqZ28gPSBnb2ZoLT5nbzsKKworCWlmICghKGdvLT5ib2FyZF9pbmZvLT5mbGFncyAmIEdPNzAwN19CT0FSRF9IQVNfVFVORVIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodC0+aW5kZXggIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFnby0+aTJjX2FkYXB0ZXJfb25saW5lKQorCQlyZXR1cm4gLUVJTzsKKworCWkyY19jbGllbnRzX2NvbW1hbmQoJmdvLT5pMmNfYWRhcHRlciwgVklESU9DX0dfVFVORVIsIHQpOworCisJdC0+aW5kZXggPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX3R1bmVyICp0KQoreworCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maCA9IHByaXY7CisJc3RydWN0IGdvNzAwNyAqZ28gPSBnb2ZoLT5nbzsKKworCWlmICghKGdvLT5ib2FyZF9pbmZvLT5mbGFncyAmIEdPNzAwN19CT0FSRF9IQVNfVFVORVIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodC0+aW5kZXggIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFnby0+aTJjX2FkYXB0ZXJfb25saW5lKQorCQlyZXR1cm4gLUVJTzsKKworCXN3aXRjaCAoZ28tPmJvYXJkX2lkKSB7CisJY2FzZSBHTzcwMDdfQk9BUkRJRF9QWF9UVjQwMlVfTkE6CisJY2FzZSBHTzcwMDdfQk9BUkRJRF9QWF9UVjQwMlVfSlA6CisJCS8qIE5vIHNlbGVjdGFibGUgb3B0aW9ucyBjdXJyZW50bHkgKi8KKwkJaWYgKHQtPmF1ZG1vZGUgIT0gVjRMMl9UVU5FUl9NT0RFX1NURVJFTykKIAkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoZ28tPnN0cmVhbWluZykKLQkJCXJldHVybiAtRUJVU1k7Ci0JCWdvLT5pbnB1dCA9ICppbnB1dDsKLQkJaWYgKGdvLT5pMmNfYWRhcHRlcl9vbmxpbmUpIHsKLQkJCWkyY19jbGllbnRzX2NvbW1hbmQoJmdvLT5pMmNfYWRhcHRlciwgVklESU9DX1NfSU5QVVQsCi0JCQkJJmdvLT5ib2FyZF9pbmZvLT5pbnB1dHNbKmlucHV0XS52aWRlb19pbnB1dCk7Ci0JCQlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19TX0FVRElPLAotCQkJCSZnby0+Ym9hcmRfaW5mby0+aW5wdXRzWyppbnB1dF0uYXVkaW9faW5wdXQpOwotCQl9Ci0JCXJldHVybiAwOworCQlicmVhazsKIAl9Ci0JY2FzZSBWSURJT0NfR19UVU5FUjoKLQl7Ci0JCXN0cnVjdCB2NGwyX3R1bmVyICp0ID0gYXJnOwogCi0JCWlmICghKGdvLT5ib2FyZF9pbmZvLT5mbGFncyAmIEdPNzAwN19CT0FSRF9IQVNfVFVORVIpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmICh0LT5pbmRleCAhPSAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmICghZ28tPmkyY19hZGFwdGVyX29ubGluZSkKLQkJCXJldHVybiAtRUlPOwotCQlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19HX1RVTkVSLCBhcmcpOwotCQl0LT5pbmRleCA9IDA7Ci0JCXJldHVybiAwOworCWkyY19jbGllbnRzX2NvbW1hbmQoJmdvLT5pMmNfYWRhcHRlciwgVklESU9DX1NfVFVORVIsIHQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfZnJlcXVlbmN5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CisKKwlpZiAoIShnby0+Ym9hcmRfaW5mby0+ZmxhZ3MgJiBHTzcwMDdfQk9BUkRfSEFTX1RVTkVSKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFnby0+aTJjX2FkYXB0ZXJfb25saW5lKQorCQlyZXR1cm4gLUVJTzsKKworCWYtPnR5cGUgPSBWNEwyX1RVTkVSX0FOQUxPR19UVjsKKwlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19HX0ZSRVFVRU5DWSwgZik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfZnJlcXVlbmN5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKK3sKKwlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBwcml2OworCXN0cnVjdCBnbzcwMDcgKmdvID0gZ29maC0+Z287CisKKwlpZiAoIShnby0+Ym9hcmRfaW5mby0+ZmxhZ3MgJiBHTzcwMDdfQk9BUkRfSEFTX1RVTkVSKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFnby0+aTJjX2FkYXB0ZXJfb25saW5lKQorCQlyZXR1cm4gLUVJTzsKKworCWkyY19jbGllbnRzX2NvbW1hbmQoJmdvLT5pMmNfYWRhcHRlciwgVklESU9DX1NfRlJFUVVFTkNZLCBmKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19jcm9wY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9jcm9wY2FwICpjcm9wY2FwKQoreworCXN0cnVjdCBnbzcwMDdfZmlsZSAqZ29maCA9IHByaXY7CisJc3RydWN0IGdvNzAwNyAqZ28gPSBnb2ZoLT5nbzsKKworCWlmIChjcm9wY2FwLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBUaGVzZSBzcGVjaWZ5IHRoZSByYXcgaW5wdXQgb2YgdGhlIHNlbnNvciAqLworCXN3aXRjaCAoZ28tPnN0YW5kYXJkKSB7CisJY2FzZSBHTzcwMDdfU1REX05UU0M6CisJCWNyb3BjYXAtPmJvdW5kcy50b3AgPSAwOworCQljcm9wY2FwLT5ib3VuZHMubGVmdCA9IDA7CisJCWNyb3BjYXAtPmJvdW5kcy53aWR0aCA9IDcyMDsKKwkJY3JvcGNhcC0+Ym91bmRzLmhlaWdodCA9IDQ4MDsKKwkJY3JvcGNhcC0+ZGVmcmVjdC50b3AgPSAwOworCQljcm9wY2FwLT5kZWZyZWN0LmxlZnQgPSAwOworCQljcm9wY2FwLT5kZWZyZWN0LndpZHRoID0gNzIwOworCQljcm9wY2FwLT5kZWZyZWN0LmhlaWdodCA9IDQ4MDsKKwkJYnJlYWs7CisJY2FzZSBHTzcwMDdfU1REX1BBTDoKKwkJY3JvcGNhcC0+Ym91bmRzLnRvcCA9IDA7CisJCWNyb3BjYXAtPmJvdW5kcy5sZWZ0ID0gMDsKKwkJY3JvcGNhcC0+Ym91bmRzLndpZHRoID0gNzIwOworCQljcm9wY2FwLT5ib3VuZHMuaGVpZ2h0ID0gNTc2OworCQljcm9wY2FwLT5kZWZyZWN0LnRvcCA9IDA7CisJCWNyb3BjYXAtPmRlZnJlY3QubGVmdCA9IDA7CisJCWNyb3BjYXAtPmRlZnJlY3Qud2lkdGggPSA3MjA7CisJCWNyb3BjYXAtPmRlZnJlY3QuaGVpZ2h0ID0gNTc2OworCQlicmVhazsKKwljYXNlIEdPNzAwN19TVERfT1RIRVI6CisJCWNyb3BjYXAtPmJvdW5kcy50b3AgPSAwOworCQljcm9wY2FwLT5ib3VuZHMubGVmdCA9IDA7CisJCWNyb3BjYXAtPmJvdW5kcy53aWR0aCA9IGdvLT5ib2FyZF9pbmZvLT5zZW5zb3Jfd2lkdGg7CisJCWNyb3BjYXAtPmJvdW5kcy5oZWlnaHQgPSBnby0+Ym9hcmRfaW5mby0+c2Vuc29yX2hlaWdodDsKKwkJY3JvcGNhcC0+ZGVmcmVjdC50b3AgPSAwOworCQljcm9wY2FwLT5kZWZyZWN0LmxlZnQgPSAwOworCQljcm9wY2FwLT5kZWZyZWN0LndpZHRoID0gZ28tPmJvYXJkX2luZm8tPnNlbnNvcl93aWR0aDsKKwkJY3JvcGNhcC0+ZGVmcmVjdC5oZWlnaHQgPSBnby0+Ym9hcmRfaW5mby0+c2Vuc29yX2hlaWdodDsKKwkJYnJlYWs7CiAJfQotCWNhc2UgVklESU9DX1NfVFVORVI6Ci0JewotCQlzdHJ1Y3QgdjRsMl90dW5lciAqdCA9IGFyZzsKIAotCQlpZiAoIShnby0+Ym9hcmRfaW5mby0+ZmxhZ3MgJiBHTzcwMDdfQk9BUkRfSEFTX1RVTkVSKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAodC0+aW5kZXggIT0gMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoIWdvLT5pMmNfYWRhcHRlcl9vbmxpbmUpCi0JCQlyZXR1cm4gLUVJTzsKLQkJc3dpdGNoIChnby0+Ym9hcmRfaWQpIHsKLQkJY2FzZSBHTzcwMDdfQk9BUkRJRF9QWF9UVjQwMlVfTkE6Ci0JCWNhc2UgR083MDA3X0JPQVJESURfUFhfVFY0MDJVX0pQOgotCQkJLyogTm8gc2VsZWN0YWJsZSBvcHRpb25zIGN1cnJlbnRseSAqLwotCQkJaWYgKHQtPmF1ZG1vZGUgIT0gVjRMMl9UVU5FUl9NT0RFX1NURVJFTykKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0JCWkyY19jbGllbnRzX2NvbW1hbmQoJmdvLT5pMmNfYWRhcHRlciwgVklESU9DX1NfVFVORVIsIGFyZyk7Ci0JCXJldHVybiAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19nX2Nyb3Aoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2Nyb3AgKmNyb3ApCit7CisJc3RydWN0IGdvNzAwN19maWxlICpnb2ZoID0gcHJpdjsKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IGdvZmgtPmdvOworCisJaWYgKGNyb3AtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNyb3AtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisKKwkvKiBUaGVzZSBzcGVjaWZ5IHRoZSByYXcgaW5wdXQgb2YgdGhlIHNlbnNvciAqLworCXN3aXRjaCAoZ28tPnN0YW5kYXJkKSB7CisJY2FzZSBHTzcwMDdfU1REX05UU0M6CisJCWNyb3AtPmMudG9wID0gMDsKKwkJY3JvcC0+Yy5sZWZ0ID0gMDsKKwkJY3JvcC0+Yy53aWR0aCA9IDcyMDsKKwkJY3JvcC0+Yy5oZWlnaHQgPSA0ODA7CisJCWJyZWFrOworCWNhc2UgR083MDA3X1NURF9QQUw6CisJCWNyb3AtPmMudG9wID0gMDsKKwkJY3JvcC0+Yy5sZWZ0ID0gMDsKKwkJY3JvcC0+Yy53aWR0aCA9IDcyMDsKKwkJY3JvcC0+Yy5oZWlnaHQgPSA1NzY7CisJCWJyZWFrOworCWNhc2UgR083MDA3X1NURF9PVEhFUjoKKwkJY3JvcC0+Yy50b3AgPSAwOworCQljcm9wLT5jLmxlZnQgPSAwOworCQljcm9wLT5jLndpZHRoID0gZ28tPmJvYXJkX2luZm8tPnNlbnNvcl93aWR0aDsKKwkJY3JvcC0+Yy5oZWlnaHQgPSBnby0+Ym9hcmRfaW5mby0+c2Vuc29yX2hlaWdodDsKKwkJYnJlYWs7CiAJfQotCWNhc2UgVklESU9DX0dfRlJFUVVFTkNZOgotCXsKLQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmID0gYXJnOwogCi0JCWlmICghKGdvLT5ib2FyZF9pbmZvLT5mbGFncyAmIEdPNzAwN19CT0FSRF9IQVNfVFVORVIpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmICghZ28tPmkyY19hZGFwdGVyX29ubGluZSkKLQkJCXJldHVybiAtRUlPOwotCQltZW1zZXQoZiwgMCwgc2l6ZW9mKCpmKSk7Ci0JCWYtPnR5cGUgPSBWNEwyX1RVTkVSX0FOQUxPR19UVjsKLQkJaTJjX2NsaWVudHNfY29tbWFuZCgmZ28tPmkyY19hZGFwdGVyLCBWSURJT0NfR19GUkVRVUVOQ1ksIGFyZyk7Ci0JCXJldHVybiAwOwotCX0KLQljYXNlIFZJRElPQ19TX0ZSRVFVRU5DWToKLQl7Ci0JCWlmICghKGdvLT5ib2FyZF9pbmZvLT5mbGFncyAmIEdPNzAwN19CT0FSRF9IQVNfVFVORVIpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmICghZ28tPmkyY19hZGFwdGVyX29ubGluZSkKLQkJCXJldHVybiAtRUlPOwotCQlpMmNfY2xpZW50c19jb21tYW5kKCZnby0+aTJjX2FkYXB0ZXIsIFZJRElPQ19TX0ZSRVFVRU5DWSwgYXJnKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWNhc2UgVklESU9DX0NST1BDQVA6Ci0JewotCQlzdHJ1Y3QgdjRsMl9jcm9wY2FwICpjcm9wY2FwID0gYXJnOworCXJldHVybiAwOworfQogCi0JCWlmIChjcm9wY2FwLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQltZW1zZXQoY3JvcGNhcCwgMCwgc2l6ZW9mKCpjcm9wY2FwKSk7Ci0JCWNyb3BjYXAtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7Ci0JCS8qIFRoZXNlIHNwZWNpZnkgdGhlIHJhdyBpbnB1dCBvZiB0aGUgc2Vuc29yICovCi0JCXN3aXRjaCAoZ28tPnN0YW5kYXJkKSB7Ci0JCWNhc2UgR083MDA3X1NURF9OVFNDOgotCQkJY3JvcGNhcC0+Ym91bmRzLnRvcCA9IDA7Ci0JCQljcm9wY2FwLT5ib3VuZHMubGVmdCA9IDA7Ci0JCQljcm9wY2FwLT5ib3VuZHMud2lkdGggPSA3MjA7Ci0JCQljcm9wY2FwLT5ib3VuZHMuaGVpZ2h0ID0gNDgwOwotCQkJY3JvcGNhcC0+ZGVmcmVjdC50b3AgPSAwOwotCQkJY3JvcGNhcC0+ZGVmcmVjdC5sZWZ0ID0gMDsKLQkJCWNyb3BjYXAtPmRlZnJlY3Qud2lkdGggPSA3MjA7Ci0JCQljcm9wY2FwLT5kZWZyZWN0LmhlaWdodCA9IDQ4MDsKLQkJCWJyZWFrOwotCQljYXNlIEdPNzAwN19TVERfUEFMOgotCQkJY3JvcGNhcC0+Ym91bmRzLnRvcCA9IDA7Ci0JCQljcm9wY2FwLT5ib3VuZHMubGVmdCA9IDA7Ci0JCQljcm9wY2FwLT5ib3VuZHMud2lkdGggPSA3MjA7Ci0JCQljcm9wY2FwLT5ib3VuZHMuaGVpZ2h0ID0gNTc2OwotCQkJY3JvcGNhcC0+ZGVmcmVjdC50b3AgPSAwOwotCQkJY3JvcGNhcC0+ZGVmcmVjdC5sZWZ0ID0gMDsKLQkJCWNyb3BjYXAtPmRlZnJlY3Qud2lkdGggPSA3MjA7Ci0JCQljcm9wY2FwLT5kZWZyZWN0LmhlaWdodCA9IDU3NjsKLQkJCWJyZWFrOwotCQljYXNlIEdPNzAwN19TVERfT1RIRVI6Ci0JCQljcm9wY2FwLT5ib3VuZHMudG9wID0gMDsKLQkJCWNyb3BjYXAtPmJvdW5kcy5sZWZ0ID0gMDsKLQkJCWNyb3BjYXAtPmJvdW5kcy53aWR0aCA9IGdvLT5ib2FyZF9pbmZvLT5zZW5zb3Jfd2lkdGg7Ci0JCQljcm9wY2FwLT5ib3VuZHMuaGVpZ2h0ID0gZ28tPmJvYXJkX2luZm8tPnNlbnNvcl9oZWlnaHQ7Ci0JCQljcm9wY2FwLT5kZWZyZWN0LnRvcCA9IDA7Ci0JCQljcm9wY2FwLT5kZWZyZWN0LmxlZnQgPSAwOwotCQkJY3JvcGNhcC0+ZGVmcmVjdC53aWR0aCA9IGdvLT5ib2FyZF9pbmZvLT5zZW5zb3Jfd2lkdGg7Ci0JCQljcm9wY2FwLT5kZWZyZWN0LmhlaWdodCA9IGdvLT5ib2FyZF9pbmZvLT5zZW5zb3JfaGVpZ2h0OwotCQkJYnJlYWs7Ci0JCX0KKy8qIEZJWE1FOiB2aWRpb2Nfc19jcm9wIGlzIG5vdCByZWFsbHkgaW1wbGVtZW50ZWQhISEKKyAqLworc3RhdGljIGludCB2aWRpb2Nfc19jcm9wKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9jcm9wICpjcm9wKQoreworCWlmIChjcm9wLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJcmV0dXJuIDA7Ci0JfQotCWNhc2UgVklESU9DX0dfQ1JPUDoKLQl7Ci0JCXN0cnVjdCB2NGwyX2Nyb3AgKmNyb3AgPSBhcmc7CisJcmV0dXJuIDA7Cit9CiAKLQkJaWYgKGNyb3AtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCW1lbXNldChjcm9wLCAwLCBzaXplb2YoKmNyb3ApKTsKLQkJY3JvcC0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLQkJLyogVGhlc2Ugc3BlY2lmeSB0aGUgcmF3IGlucHV0IG9mIHRoZSBzZW5zb3IgKi8KLQkJc3dpdGNoIChnby0+c3RhbmRhcmQpIHsKLQkJY2FzZSBHTzcwMDdfU1REX05UU0M6Ci0JCQljcm9wLT5jLnRvcCA9IDA7Ci0JCQljcm9wLT5jLmxlZnQgPSAwOwotCQkJY3JvcC0+Yy53aWR0aCA9IDcyMDsKLQkJCWNyb3AtPmMuaGVpZ2h0ID0gNDgwOwotCQkJYnJlYWs7Ci0JCWNhc2UgR083MDA3X1NURF9QQUw6Ci0JCQljcm9wLT5jLnRvcCA9IDA7Ci0JCQljcm9wLT5jLmxlZnQgPSAwOwotCQkJY3JvcC0+Yy53aWR0aCA9IDcyMDsKLQkJCWNyb3AtPmMuaGVpZ2h0ID0gNTc2OwotCQkJYnJlYWs7Ci0JCWNhc2UgR083MDA3X1NURF9PVEhFUjoKLQkJCWNyb3AtPmMudG9wID0gMDsKLQkJCWNyb3AtPmMubGVmdCA9IDA7Ci0JCQljcm9wLT5jLndpZHRoID0gZ28tPmJvYXJkX2luZm8tPnNlbnNvcl93aWR0aDsKLQkJCWNyb3AtPmMuaGVpZ2h0ID0gZ28tPmJvYXJkX2luZm8tPnNlbnNvcl9oZWlnaHQ7Ci0JCQlicmVhazsKLQkJfQorc3RhdGljIGludCB2aWRpb2NfZ19qcGVnY29tcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCSBzdHJ1Y3QgdjRsMl9qcGVnY29tcHJlc3Npb24gKnBhcmFtcykKK3sKKwltZW1zZXQocGFyYW1zLCAwLCBzaXplb2YoKnBhcmFtcykpOworCXBhcmFtcy0+cXVhbGl0eSA9IDUwOyAvKiA/PyAqLworCXBhcmFtcy0+anBlZ19tYXJrZXJzID0gVjRMMl9KUEVHX01BUktFUl9ESFQgfAorCQkJCVY0TDJfSlBFR19NQVJLRVJfRFFUOwogCi0JCXJldHVybiAwOwotCX0KLQljYXNlIFZJRElPQ19TX0NST1A6Ci0JewotCQlzdHJ1Y3QgdjRsMl9jcm9wICpjcm9wID0gYXJnOworCXJldHVybiAwOworfQogCi0JCWlmIChjcm9wLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlyZXR1cm4gMDsKLQl9Ci0JY2FzZSBWSURJT0NfR19KUEVHQ09NUDoKLQl7Ci0JCXN0cnVjdCB2NGwyX2pwZWdjb21wcmVzc2lvbiAqcGFyYW1zID0gYXJnOworc3RhdGljIGludCB2aWRpb2Nfc19qcGVnY29tcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCSBzdHJ1Y3QgdjRsMl9qcGVnY29tcHJlc3Npb24gKnBhcmFtcykKK3sKKwlpZiAocGFyYW1zLT5xdWFsaXR5ICE9IDUwIHx8CisJCQlwYXJhbXMtPmpwZWdfbWFya2VycyAhPSAoVjRMMl9KUEVHX01BUktFUl9ESFQgfAorCQkJCQkJVjRMMl9KUEVHX01BUktFUl9EUVQpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotCQltZW1zZXQocGFyYW1zLCAwLCBzaXplb2YoKnBhcmFtcykpOwotCQlwYXJhbXMtPnF1YWxpdHkgPSA1MDsgLyogPz8gKi8KLQkJcGFyYW1zLT5qcGVnX21hcmtlcnMgPSBWNEwyX0pQRUdfTUFSS0VSX0RIVCB8Ci0JCQkJCVY0TDJfSlBFR19NQVJLRVJfRFFUOworCXJldHVybiAwOworfQogCi0JCXJldHVybiAwOwotCX0KLQljYXNlIFZJRElPQ19TX0pQRUdDT01QOgotCXsKLQkJc3RydWN0IHY0bDJfanBlZ2NvbXByZXNzaW9uICpwYXJhbXMgPSBhcmc7CisvKiBGSVhNRToKKwlUaG9zZSBpb2N0bHMgYXJlIHByaXZhdGUsIGFuZCBub3QgbmVlZGVkLCBzaW5jZSBzZXZlcmFsIHN0YW5kYXJkCisJZXh0ZW5kZWQgY29udHJvbHMgYWxyZWFkeSBwcm92aWRlIHN0cmVhbWluZyBjb250cm9sLgorCVNvLCB0aG9zZSBpb2N0bHMgc2hvdWxkIGJlIGNvbnZlcnRlZCBpbnRvIHZpZGlvY19nX2V4dF9jdHJscygpCisJYW5kIHZpZGlvY19zX2V4dF9jdHJscygpCisgKi8KIAotCQlpZiAocGFyYW1zLT5xdWFsaXR5ICE9IDUwIHx8Ci0JCQkJcGFyYW1zLT5qcGVnX21hcmtlcnMgIT0gKFY0TDJfSlBFR19NQVJLRVJfREhUIHwKLQkJCQkJCQlWNEwyX0pQRUdfTUFSS0VSX0RRVCkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmV0dXJuIDA7Ci0JfQorI2lmIDAKIAkvKiBUZW1wb3JhcnkgaW9jdGxzIGZvciBjb250cm9sbGluZyBjb21wcmVzc2lvbiBjaGFyYWN0ZXJpc3RpY3MgKi8KIAljYXNlIEdPNzAwN0lPQ19TX0JJVFJBVEU6CiAJewpAQCAtMTMxNiwyNyArMTY3Nyw3IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJcmV0dXJuIGNsaXBfdG9fbW9kZXRfbWFwKGdvLCByZWdpb24tPnJlZ2lvbiwgcmVnaW9uLT5jbGlwcyk7CiAJfQotCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJnbzcwMDc6IHVuc3VwcG9ydGVkIGlvY3RsICVkXG4iLCBjbWQpOwotCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwotCX0KLQlyZXR1cm4gMDsKLQotdW5sb2NrX2FuZF9yZXR1cm46Ci0JdXAoJmdvZmgtPmxvY2spOwotCXJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyBpbnQgZ283MDA3X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgZ283MDA3X2ZpbGUgKmdvZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlpZiAoZ29maC0+Z28tPnN0YXR1cyAhPSBTVEFUVVNfT05MSU5FKQotCQlyZXR1cm4gLUVJTzsKLQotCXJldHVybiB2aWRlb191c2VyY29weShpbm9kZSwgZmlsZSwgY21kLCBhcmcsIGdvNzAwN19kb19pb2N0bCk7Ci19CisjZW5kaWYKIAogc3RhdGljIHNzaXplX3QgZ283MDA3X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpkYXRhLAogCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKQEAgLTEzNzEsOCArMTcxMiw3IEBACiAJcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX1VTRVIgfCBfX0dGUF9ETUEzMik7CiAJaWYgKCFwYWdlKQogCQlyZXR1cm4gVk1fRkFVTFRfT09NOwotCWNsZWFyX3VzZXJfcGFnZShwYWdlX2FkZHJlc3MocGFnZSksICh1bnNpZ25lZCBsb25nKXZtZi0+dmlydHVhbF9hZGRyZXNzLAotCQkJcGFnZSk7CisJY2xlYXJfdXNlcl9oaWdocGFnZShwYWdlLCAodW5zaWduZWQgbG9uZyl2bWYtPnZpcnR1YWxfYWRkcmVzcyk7CiAJdm1mLT5wYWdlID0gcGFnZTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE0NDEsMjMgKzE3ODEsNTkgQEAKIAkJa2ZyZWUoZ28pOwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBnbzcwMDdfZm9wcyA9IHsKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9maWxlX29wZXJhdGlvbnMgZ283MDA3X2ZvcHMgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5vcGVuCQk9IGdvNzAwN19vcGVuLAogCS5yZWxlYXNlCT0gZ283MDA3X3JlbGVhc2UsCi0JLmlvY3RsCQk9IGdvNzAwN19pb2N0bCwKLQkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkuaW9jdGwJCT0gdmlkZW9faW9jdGwyLAogCS5yZWFkCQk9IGdvNzAwN19yZWFkLAogCS5tbWFwCQk9IGdvNzAwN19tbWFwLAogCS5wb2xsCQk9IGdvNzAwN19wb2xsLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2lvY3RsX29wcyB2aWRlb19pb2N0bF9vcHMgPSB7CisJLnZpZGlvY19xdWVyeWNhcCAgICAgICAgICA9IHZpZGlvY19xdWVyeWNhcCwKKwkudmlkaW9jX2VudW1fZm10X3ZpZF9jYXAgID0gdmlkaW9jX2VudW1fZm10X3ZpZF9jYXAsCisJLnZpZGlvY19nX2ZtdF92aWRfY2FwICAgICA9IHZpZGlvY19nX2ZtdF92aWRfY2FwLAorCS52aWRpb2NfdHJ5X2ZtdF92aWRfY2FwICAgPSB2aWRpb2NfdHJ5X2ZtdF92aWRfY2FwLAorCS52aWRpb2Nfc19mbXRfdmlkX2NhcCAgICAgPSB2aWRpb2Nfc19mbXRfdmlkX2NhcCwKKwkudmlkaW9jX3JlcWJ1ZnMgICAgICAgICAgID0gdmlkaW9jX3JlcWJ1ZnMsCisJLnZpZGlvY19xdWVyeWJ1ZiAgICAgICAgICA9IHZpZGlvY19xdWVyeWJ1ZiwKKwkudmlkaW9jX3FidWYgICAgICAgICAgICAgID0gdmlkaW9jX3FidWYsCisJLnZpZGlvY19kcWJ1ZiAgICAgICAgICAgICA9IHZpZGlvY19kcWJ1ZiwKKwkudmlkaW9jX3Nfc3RkICAgICAgICAgICAgID0gdmlkaW9jX3Nfc3RkLAorCS52aWRpb2NfZW51bV9pbnB1dCAgICAgICAgPSB2aWRpb2NfZW51bV9pbnB1dCwKKwkudmlkaW9jX2dfaW5wdXQgICAgICAgICAgID0gdmlkaW9jX2dfaW5wdXQsCisJLnZpZGlvY19zX2lucHV0ICAgICAgICAgICA9IHZpZGlvY19zX2lucHV0LAorCS52aWRpb2NfcXVlcnljdHJsICAgICAgICAgPSB2aWRpb2NfcXVlcnljdHJsLAorCS52aWRpb2NfZ19jdHJsICAgICAgICAgICAgPSB2aWRpb2NfZ19jdHJsLAorCS52aWRpb2Nfc19jdHJsICAgICAgICAgICAgPSB2aWRpb2Nfc19jdHJsLAorCS52aWRpb2Nfc3RyZWFtb24gICAgICAgICAgPSB2aWRpb2Nfc3RyZWFtb24sCisJLnZpZGlvY19zdHJlYW1vZmYgICAgICAgICA9IHZpZGlvY19zdHJlYW1vZmYsCisJLnZpZGlvY19nX3R1bmVyICAgICAgICAgICA9IHZpZGlvY19nX3R1bmVyLAorCS52aWRpb2Nfc190dW5lciAgICAgICAgICAgPSB2aWRpb2Nfc190dW5lciwKKwkudmlkaW9jX2dfZnJlcXVlbmN5ICAgICAgID0gdmlkaW9jX2dfZnJlcXVlbmN5LAorCS52aWRpb2Nfc19mcmVxdWVuY3kgICAgICAgPSB2aWRpb2Nfc19mcmVxdWVuY3ksCisJLnZpZGlvY19nX3Bhcm0gICAgICAgICAgICA9IHZpZGlvY19nX3Bhcm0sCisJLnZpZGlvY19zX3Bhcm0gICAgICAgICAgICA9IHZpZGlvY19zX3Bhcm0sCisJLnZpZGlvY19lbnVtX2ZyYW1lc2l6ZXMgICA9IHZpZGlvY19lbnVtX2ZyYW1lc2l6ZXMsCisJLnZpZGlvY19lbnVtX2ZyYW1laW50ZXJ2YWxzID0gdmlkaW9jX2VudW1fZnJhbWVpbnRlcnZhbHMsCisJLnZpZGlvY19jcm9wY2FwICAgICAgICAgICA9IHZpZGlvY19jcm9wY2FwLAorCS52aWRpb2NfZ19jcm9wICAgICAgICAgICAgPSB2aWRpb2NfZ19jcm9wLAorCS52aWRpb2Nfc19jcm9wICAgICAgICAgICAgPSB2aWRpb2Nfc19jcm9wLAorCS52aWRpb2NfZ19qcGVnY29tcCAgICAgICAgPSB2aWRpb2NfZ19qcGVnY29tcCwKKwkudmlkaW9jX3NfanBlZ2NvbXAgICAgICAgID0gdmlkaW9jX3NfanBlZ2NvbXAsCit9OworCiBzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSBnbzcwMDdfdGVtcGxhdGUgPSB7CiAJLm5hbWUJCT0gImdvNzAwNyIsCiAJLnZmbF90eXBlCT0gVklEX1RZUEVfQ0FQVFVSRSwKIAkuZm9wcwkJPSAmZ283MDA3X2ZvcHMsCiAJLm1pbm9yCQk9IC0xLAogCS5yZWxlYXNlCT0gZ283MDA3X3ZmbF9yZWxlYXNlLAorCS5pb2N0bF9vcHMJPSAmdmlkZW9faW9jdGxfb3BzLAorCS50dm5vcm1zCT0gVjRMMl9TVERfQUxMLAorCS5jdXJyZW50X25vcm0JPSBWNEwyX1NURF9OVFNDLAogfTsKIAogaW50IGdvNzAwN192NGwyX2luaXQoc3RydWN0IGdvNzAwNyAqZ28pCkBAIC0xNDc3LDYgKzE4NTMsOCBAQAogCX0KIAl2aWRlb19zZXRfZHJ2ZGF0YShnby0+dmlkZW9fZGV2LCBnbyk7CiAJKytnby0+cmVmX2NvdW50OworCXByaW50ayhLRVJOX0lORk8gIiVzOiByZWdpc3RlcmVkIGRldmljZSB2aWRlbyVkIFt2NGwyXVxuIiwKKwkgICAgICAgZ28tPnZpZGVvX2Rldi0+bmFtZSwgZ28tPnZpZGVvX2Rldi0+bnVtKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDcudHh0IGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNjc3MmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy50eHQKQEAgLTAsMCArMSw0ODEgQEAKK1RoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBXSVMgR083MDA3U0IgbXVsdGktZm9ybWF0IHZpZGVvIGVuY29kZXIuCisKK1BldGUgRWJlcmxlaW4gPHBldGVAc2Vuc29yYXkuY29tPgorCitUaGUgZHJpdmVyIHdhcyBvcmlnbmFsbHkgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTCBhbmQgaXMgY3VycmVudGx5IGhvc3RlZCBhdDoKK2h0dHA6Ly9uaWtvc2FwaS5vcmcvd2lraS9pbmRleC5waHAvV0lTX0dvNzAwN19MaW51eF9kcml2ZXIKK1RoZSBnbzcwMDcgZmlybXdhcmUgY2FuIGJlIGFjcXVpcmVkIGZyb20gdGhlIHBhY2thZ2Ugb24gdGhlIHNpdGUgYWJvdmUuCisKK0kndmUgbW9kaWZpZWQgdGhlIGRyaXZlciB0byBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgVmlkZW80TGludXgyIE1QRUcKK2NvbnRyb2xzLCB3aXRoIGFjY2VwdGFibGUgdmFsdWVzOgorCitWNEwyX0NJRF9NUEVHX1NUUkVBTV9UWVBFCVY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMl9EVkQKKwkJCQlWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFR19FTEVNCitWNEwyX0NJRF9NUEVHX1ZJREVPX0VOQ09ESU5HCVY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzEKKwkJCQlWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18yCisJCQkJVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfNAorVjRMMl9DSURfTVBFR19WSURFT19BU1BFQ1QJVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF8xeDEKKwkJCQlWNEwyX01QRUdfVklERU9fQVNQRUNUXzR4MworCQkJCVY0TDJfTVBFR19WSURFT19BU1BFQ1RfMTZ4OQorVjRMMl9DSURfTVBFR19WSURFT19HT1BfU0laRQlpbnRlZ2VyCitWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEUJNjQwMDAgLi4gMTAwMDAwMDAKKworVGhlc2Ugc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgbm9uLXN0YW5kYXJkIEdPNzAwNyBpb2N0bHMgZGVzY3JpYmVkCitiZWxvdy4KKworCitUaGUgUkVBRE1FIGZpbGVzIGZyb20gdGhlIG9yaWduYWwgcGFja2FnZSBhcHBlYXIgYmVsb3c6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICAgV0lTIEdPNzAwN1NCIFB1YmxpYyBMaW51eCBEcml2ZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKyoqKiBQbGVhc2Ugc2VlIHRoZSBmaWxlIFJFTEVBU0UtTk9URVMgZm9yIGltcG9ydGFudCBsYXN0LW1pbnV0ZSB1cGRhdGVzICoqKgorCisKKyAgMC4gT1ZFUlZJRVcgQU5EIExJQ0VOU0lORy9ESVNDTEFJTUVSCisKKworVGhpcyBkcml2ZXIga2l0IGNvbnRhaW5zIExpbnV4IGRyaXZlcnMgZm9yIHRoZSBXSVMgR083MDA3U0IgbXVsdGktZm9ybWF0Cit2aWRlbyBlbmNvZGVyLiAgT25seSBrZXJuZWwgdmVyc2lvbiAyLjYueCBpcyBzdXBwb3J0ZWQuICBUaGUgdmlkZW8gc3RyZWFtCitpcyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgVmlkZW80TGludXgyIEFQSSBhbmQgdGhlIGF1ZGlvIHN0cmVhbSBpcyBhdmFpbGFibGUKK3Rocm91Z2ggdGhlIEFMU0EgQVBJIChvciB0aGUgT1NTIGVtdWxhdGlvbiBsYXllciBvZiB0aGUgQUxTQSBzeXN0ZW0pLgorCitUaGUgZmlsZXMgaW4ga2VybmVsLyBhbmQgaG90cGx1Zy8gYXJlIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgVmVyc2lvbiAyIGZyb20gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEEgY29weSBvZiB0aGUgbGljZW5zZQoraXMgaW5jbHVkZWQgaW4gdGhlIGZpbGUgQ09QWUlORy4KKworVGhlIGV4YW1wbGUgYXBwbGljYXRpb25zIGluIGFwcHMvIGFuZCBDIGhlYWRlciBmaWxlcyBpbiBpbmNsdWRlLyBhcmUKK2xpY2Vuc2VkIHVuZGVyIGEgcGVybWlzc2l2ZSBsaWNlbnNlIGluY2x1ZGVkIGluIHRoZSBzb3VyY2UgZmlsZXMgd2hpY2gKK2FsbG93cyBjb3B5aW5nLCBtb2RpZmljYXRpb24gYW5kIHJlZGlzdHJpYnV0aW9uIGZvciBhbnkgcHVycG9zZSB3aXRob3V0CithdHRyaWJ1dGlvbi4KKworVGhlIGZpcm13YXJlIGZpbGVzIGluY2x1ZGVkIGluIHRoZSBmaXJtd2FyZS8gZGlyZWN0b3J5IG1heSBiZSBmcmVlbHkKK3JlZGlzdHJpYnV0ZWQgb25seSBpbiBjb25qdW5jdGlvbiB3aXRoIHRoaXMgZG9jdW1lbnQ7IGJ1dCBtb2RpZmljYXRpb24sCit0YW1wZXJpbmcgYW5kIHJldmVyc2UgZW5naW5lZXJpbmcgYXJlIHByb2hpYml0ZWQuCisKK01JQ1JPTkFTIFVTQSwgSU5DLiwgTUFLRVMgTk8gV0FSUkFOVElFUyBUTyBBTlkgUEVSU09OIE9SIEVOVElUWSBXSVRICitSRVNQRUNUIFRPIFRIRSBTT0ZUV0FSRSBPUiBBTlkgREVSSVZBVElWRVMgVEhFUkVPRiBPUiBBTlkgU0VSVklDRVMgT1IKK0xJQ0VOU0VTIEFORCBESVNDTEFJTVMgQUxMIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTgorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIFNVUFBPUlQsIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKK1BVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCisKKworICAxLiBTWVNURU0gUkVRVUlSRU1FTlRTCisKKworVGhpcyBkcml2ZXIgcmVxdWlyZXMgTGludXgga2VybmVsIDIuNi4gIEtlcm5lbCAyLjQgaXMgbm90IHN1cHBvcnRlZC4gIFVzaW5nCitrZXJuZWwgMi42LjEwIG9yIGxhdGVyIGlzIHJlY29tbWVuZGVkLCBhcyBlYXJsaWVyIGtlcm5lbHMgYXJlIGtub3duIHRvIGhhdmUKK3Vuc3RhYmxlIFVTQiAyLjAgc3VwcG9ydC4KKworQSBmdWxseSBidWlsdCBrZXJuZWwgc291cmNlIHRyZWUgbXVzdCBiZSBhdmFpbGFibGUuICBUeXBpY2FsbHkgdGhpcyB3aWxsIGJlCitsaW5rZWQgZnJvbSAiL2xpYi9tb2R1bGVzLzxLRVJORUwgVkVSU0lPTj4vYnVpbGQiIGZvciBjb252ZW5pZW5jZS4gIElmIHRoaXMKK2xpbmsgZG9lcyBub3QgZXhpc3QsIGFuIGV4dHJhIHBhcmFtZXRlciB3aWxsIG5lZWQgdG8gYmUgcGFzc2VkIHRvIHRoZQorYG1ha2VgIGNvbW1hbmQuCisKK0FsbCB2ZW5kb3ItYnVpbHQga2VybmVscyBzaG91bGQgYWxyZWFkeSBiZSBjb25maWd1cmVkIHByb3Blcmx5LiAgSG93ZXZlciwKK2ZvciBjdXN0b20tYnVpbHQga2VybmVscywgdGhlIGZvbGxvd2luZyBvcHRpb25zIG5lZWQgdG8gYmUgZW5hYmxlZCBpbiB0aGUKK2tlcm5lbCBhcyBidWlsdC1pbiBvciBtb2R1bGVzOgorCisgICAgICAgIENPTkZJR19IT1RQTFVHICAgICAgICAgICAtIFN1cHBvcnQgZm9yIGhvdC1wbHVnZ2FibGUgZGV2aWNlcworICAgICAgICBDT05GSUdfTU9EVUxFUyAgICAgICAgICAgLSBFbmFibGUgbG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKKyAgICAgICAgQ09ORklHX0tNT0QgICAgICAgICAgICAgIC0gQXV0b21hdGljIGtlcm5lbCBtb2R1bGUgbG9hZGluZworICAgICAgICBDT05GSUdfRldfTE9BREVSICAgICAgICAgLSBIb3RwbHVnIGZpcm13YXJlIGxvYWRpbmcgc3VwcG9ydAorICAgICAgICBDT05GSUdfSTJDICAgICAgICAgICAgICAgLSBJMkMgc3VwcG9ydAorICAgICAgICBDT05GSUdfVklERU9fREVWICAgICAgICAgLSBWaWRlbyBGb3IgTGludXgKKyAgICAgICAgQ09ORklHX1NPVU5EICAgICAgICAgICAgIC0gU291bmQgY2FyZCBzdXBwb3J0CisgICAgICAgIENPTkZJR19TTkQgICAgICAgICAgICAgICAtIEFkdmFuY2VkIExpbnV4IFNvdW5kIEFyY2hpdGVjdHVyZQorICAgICAgICBDT05GSUdfVVNCICAgICAgICAgICAgICAgLSBTdXBwb3J0IGZvciBIb3N0LXNpZGUgVVNCCisgICAgICAgIENPTkZJR19VU0JfREVWSUNFRlMgICAgICAtIFVTQiBkZXZpY2UgZmlsZXN5c3RlbQorICAgICAgICBDT05GSUdfVVNCX0VIQ0lfSENEICAgICAgLSBFSENJIEhDRCAoVVNCIDIuMCkgc3VwcG9ydAorCitBZGRpdGlvbmFsbHksIHRvIHVzZSB0aGUgZXhhbXBsZSBhcHBsaWNhdGlvbiwgdGhlIGZvbGxvd2luZyBvcHRpb25zIG5lZWQgdG8KK2JlIGVuYWJsZWQgaW4gdGhlIEFMU0Egc2VjdGlvbjoKKworICAgICAgICBDT05GSUdfU05EX01JWEVSX09TUyAgICAgLSBPU1MgTWl4ZXIgQVBJCisgICAgICAgIENPTkZJR19TTkRfUENNX09TUyAgICAgICAtIE9TUyBQQ00gKGRpZ2l0YWwgYXVkaW8pIEFQSQorCitUaGUgaG90cGx1ZyBzY3JpcHRzLCBhbG9uZyB3aXRoIHRoZSBmeGxvYWQgdXRpbGl0eSwgbXVzdCBhbHNvIGJlIGluc3RhbGxlZC4KK1RoZXNlIHNjcmlwdHMgY2FuIGJlIG9idGFpbmVkIGZyb20gPGh0dHA6Ly9saW51eC1ob3RwbHVnLnNvdXJjZWZvcmdlLm5ldC8+LgorSG90cGx1Z2dpbmcgaXMgdXNlZCBmb3IgbG9hZGluZyBmaXJtd2FyZSBpbnRvIHRoZSBDeXBydXNzIEVaLVVTQiBjaGlwIHVzaW5nCitmeGxvYWQgYW5kIGZvciBsb2FkaW5nIGZpcm13YXJlIGludG8gdGhlIGRyaXZlciB1c2luZyB0aGUgZmlybXdhcmUgYWdlbnQuCisKKworICAyLiBDT01QSUxJTkcgQU5EIElOU1RBTExJTkcgVEhFIERSSVZFUgorCisKK01vc3QgdXNlcnMgc2hvdWxkIGJlIGFibGUgdG8gY29tcGlsZSB0aGUgZHJpdmVyIGJ5IHNpbXBseSBydW5uaW5nOgorCisgICAgICAgICQgbWFrZQorCitpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeSBvZiB0aGUgZHJpdmVyIGtpdC4gIEZpcnN0IHRoZSBrZXJuZWwgbW9kdWxlcword2lsbCBiZSBidWlsdCwgZm9sbG93ZWQgYnkgdGhlIGV4YW1wbGUgYXBwbGljYXRpb25zLgorCitJZiB0aGUgYnVpbGQgc3lzdGVtIGlzIHVuYWJsZSB0byBsb2NhdGUgdGhlIGtlcm5lbCBzb3VyY2UgdHJlZSBmb3IgdGhlCitjdXJyZW50bHktcnVubmluZyBrZXJuZWwsIG9yIGlmIHRoZSBtb2R1bGUgc2hvdWxkIGJlIGJ1aWx0IGZvciBhIGtlcm5lbAorb3RoZXIgdGhhbiB0aGUgY3VycmVudGx5LXJ1bm5pbmcga2VybmVsLCBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlciB3aWxsIG5lZWQKK3RvIGJlIHBhc3NlZCB0byBtYWtlIHRvIHNwZWNpZnkgdGhlIGFwcHJvcHJpYXRlIGtlcm5lbCBzb3VyY2UgZGlyZWN0b3J5OgorCisgICAgICAgICQgbWFrZSBLRVJORUxTUkM9L3Vzci9zcmMvbGludXgtMi42LjEwLWN1c3RvbTMKKworT25jZSB0aGUgY29tcGlsZSBjb21wbGV0ZXMsIHRoZSBkcml2ZXIgYW5kIGZpcm13YXJlIGZpbGVzIHNob3VsZCBiZQoraW5zdGFsbGVkIGJ5IHJ1bm5pbmc6CisKKyAgICAgICAgJCBtYWtlIGluc3RhbGwKKworVGhlIGtlcm5lbCBtb2R1bGVzIHdpbGwgYmUgcGxhY2VkIGluICIvbGliL21vZHVsZXMvPEtFUk5FTCBWRVJTSU9OPi9leHRyYSIKK2FuZCB0aGUgZmlybXdhcmUgZmlsZXMgd2lsbCBiZSBwbGFjZWQgaW4gdGhlIGFwcHJvcHJpYXRlIGhvdHBsdWcgZmlybXdhcmUKK2RpcmVjdG9yeSwgdXN1YWxseSAvbGliL2Zpcm13YXJlLiAgSW4gYWRkaXRpb24sIFVTQiBtYXBzIGFuZCBzY3JpcHRzIHdpbGwKK2JlIHBsYWNlZCBpbiAvZXRjL2hvdHBsdWcvdXNiIHRvIGVuYWJsZSBmeGxvYWQgdG8gaW5pdGlhbGl6ZSB0aGUgRVotVVNCCitjb250cm9sIGNoaXAgd2hlbiB0aGUgZGV2aWNlIGlzIGNvbm5lY3RlZC4KKworCisgIDMuIFBBTC9TRUNBTSBUVU5FUiBDT05GSUdVUkFUSU9OIChUVjQwMlUtRVUgb25seSkKKworCitUaGUgUEFMIG1vZGVsIG9mIHRoZSBQbGV4dG9yIENvbnZlcnRYIFRWNDAyVSBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsCitjb25maWd1cmF0aW9uIHRvIGNvcnJlY3RseSBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIFRWIGZyZXF1ZW5jeSBiYW5kIGFuZAorYXVkaW8gc3ViY2hhbm5lbC4KKworVXNlcnMgd2l0aCBhIGRldmljZSBvdGhlciB0aGFuIHRoZSBQbGV4dG9yIENvbnZlcnRYIFRWNDAyVS1FVSBzaG91bGQgc2tpcAordGhpcyBzZWN0aW9uLgorCitUaGUgd2lkZSB2YXJpZXR5IG9mIFBBTCBUViBzeXN0ZW1zIHVzZWQgaW4gRXVyb3BlIHJlcXVpcmVzIHRoYXQgYWRkaXRpb25hbAoraW5mb3JtYXRpb24gYWJvdXQgdGhlIGxvY2FsIFRWIHN0YW5kYXJkcyBiZSBwYXNzZWQgdG8gdGhlIGRyaXZlciBpbiBvcmRlcgordG8gcHJvcGVybHkgdHVuZSBUViBjaGFubmVscy4gIFRoZSB0d28gbmVjZXNzYXJ5IHBhcmFtZXRlcnMgYXJlIChhKSB0aGUgUEFMCitUViBiYW5kLCBhbmQgKGIpIHRoZSBhdWRpbyBzdWJjaGFubmVsIGZvcm1hdCBpbiB1c2UuCisKK0luIG1hbnkgY2FzZXMsIHRoZSBhcHByb3ByaWF0ZSBUViBiYW5kIHNlbGVjdGlvbiBpcyBwYXNzZWQgdG8gdGhlIGRyaXZlcgorZnJvbSBhcHBsaWNhdGlvbnMuICBIb3dldmVyLCBpbiBzb21lIGNhc2VzLCB0aGUgYXBwbGljYXRpb24gb25seSBzcGVjaWZpZXMKK3RoYXQgdGhlIGRyaXZlciBzaG91bGQgdXNlIFBBTCBidXQgbm90IHRoZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKK2FwcHJvcHJpYXRlIFRWIGJhbmQuICBUbyB3b3JrIGFyb3VuZCB0aGlzIGlzc3VlLCB0aGUgY29ycmVjdCBUViBiYW5kIG1heSBiZQorc3BlY2lmaWVkIGluIHRoZSAiZm9yY2VfYmFuZCIgcGFyYW1ldGVyIHRvIHRoZSB3aXMtc29ueS10dW5lciBtb2R1bGU6CisKKyAgICAgVFYgYmFuZCAgICAgICAgICAgZm9yY2VfYmFuZAorICAgICAtLS0tLS0tICAgICAgICAgICAtLS0tLS0tLS0tCisgICAgIFBBTCBCL0cgICAgICAgICAgICAgICAgQgorICAgICBQQUwgSSAgICAgICAgICAgICAgICAgIEkKKyAgICAgUEFMIEQvSyAgICAgICAgICAgICAgICBECisgICAgIFNFQ0FNIEwgICAgICAgICAgICAgICAgTAorCitJZiB0aGUgImZvcmNlX2JhbmQiIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQsIHRoZSBkcml2ZXIgd2lsbCBpZ25vcmUgYW55IFRWCitiYW5kIHNwZWNpZmllZCBieSBhcHBsaWNhdGlvbnMgYW5kIHdpbGwgYWx3YXlzIHVzZSB0aGUgYmFuZCBwcm92aWRlZCBpbiB0aGUKK21vZHVsZSBwYXJhbWV0ZXIuCisKK1RoZSBvdGhlciBwYXJhbWV0ZXIgdGhhdCBjYW4gYmUgc3BlY2lmaWVkIGlzIHRoZSBhdWRpbyBzdWJjaGFubmVsIGZvcm1hdC4KK1RoZXJlIGFyZSBzZXZlcmFsIHN0ZXJlbyBhdWRpbyBjYXJyaWVyIHN5c3RlbXMgaW4gdXNlLCBpbmNsdWRpbmcgTklDQU0gYW5kCit0aHJlZSB2YXJpZXRpZXMgb2YgQTIuICBUbyByZWNlaXZlIGF1ZGlvIGJyb2FkY2FzdCBvbiBvbmUgb2YgdGhlc2Ugc3RlcmVvCitjYXJyaWVycywgdGhlICJmb3JjZV9tcHhfbW9kZSIgcGFyYW1ldGVyIG11c3QgYmUgc3BlY2lmaWVkIHRvIHRoZQord2lzLXNvbnktdHVuZXIgbW9kdWxlLgorCisgICAgIFRWIGJhbmQgICAgICAgICAgIEF1ZGlvIHN1YmNhcnJpZXIgICAgICAgZm9yY2VfbXB4X21vZGUKKyAgICAgLS0tLS0tLSAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLSAgICAgICAtLS0tLS0tLS0tLS0tLQorICAgICBQQUwgQi9HICAgICAgICAgICAgTW9ubyAoZGVmYXVsdCkgICAgICAgICAgICAgICAxCisgICAgIFBBTCBCL0cgICAgICAgICAgICAgICAgICBBMiAgICAgICAgICAgICAgICAgICAgIDIKKyAgICAgUEFMIEIvRyAgICAgICAgICAgICAgICAgTklDQU0gICAgICAgICAgICAgICAgICAgMworICAgICBQQUwgSSAgICAgICAgICAgICAgTW9ubyAoZGVmYXVsdCkgICAgICAgICAgICAgICA0CisgICAgIFBBTCBJICAgICAgICAgICAgICAgICAgIE5JQ0FNICAgICAgICAgICAgICAgICAgIDUKKyAgICAgUEFMIEQvSyAgICAgICAgICAgIE1vbm8gKGRlZmF1bHQpICAgICAgICAgICAgICAgNgorICAgICBQQUwgRC9LICAgICAgICAgICAgICAgICBBMiAoMSkgICAgICAgICAgICAgICAgICA3CisgICAgIFBBTCBEL0sgICAgICAgICAgICAgICAgIEEyICgyKSAgICAgICAgICAgICAgICAgIDgKKyAgICAgUEFMIEQvSyAgICAgICAgICAgICAgICAgQTIgKDMpICAgICAgICAgICAgICAgICAgOQorICAgICBQQUwgRC9LICAgICAgICAgICAgICAgICBOSUNBTSAgICAgICAgICAgICAgICAgIDEwCisgICAgIFNFQ0FNIEwgICAgICAgICAgICBNb25vIChkZWZhdWx0KSAgICAgICAgICAgICAgMTEKKyAgICAgU0VDQU0gTCAgICAgICAgICAgICAgICAgTklDQU0gICAgICAgICAgICAgICAgICAxMgorCitJZiB0aGUgImZvcmNlX21weF9tb2RlIiBwYXJhbWV0ZXIgaXMgbm90IHNwZWNpZmllZCwgdGhlIGNvcnJlY3QgbW9uby1vbmx5Cittb2RlIHdpbGwgYmUgY2hvc2VuIGJhc2VkIG9uIHRoZSBUViBiYW5kLiAgSG93ZXZlciwgdGhlIHR1bmVyIHdpbGwgbm90CityZWNlaXZlIHN0ZXJlbyBhdWRpbyBvciBiaWxpbmd1YWwgYnJvYWRjYXN0cyBjb3JyZWN0bHkuCisKK1RvIHBhc3MgdGhlICJmb3JjZV9iYW5kIiBvciAiZm9yY2VfbXB4X21vZGUiIHBhcmFtZXRlcnMgdG8gdGhlCit3aXMtc29ueS10dW5lciBtb2R1bGUsIHRoZSBmb2xsb3dpbmcgbGluZSBtdXN0IGJlIGFkZGVkIHRvIHRoZSBtb2Rwcm9iZQorY29uZmlndXJhdGlvbiBmaWxlLCB3aGljaCB2YXJpZXMgZnJvbSBvbmUgTGludXggZGlzdHJpYnV0aW9uIHRvIGFub3RoZXIuCisKKyAgICAgb3B0aW9ucyB3aXMtc29ueS10dW5lciBmb3JjZV9iYW5kPUIgZm9yY2VfbXB4X21vZGU9MgorCitUaGUgYWJvdmUgZXhhbXBsZSB3b3VsZCBmb3JjZSB0aGUgdHVuZXIgdG8gdGhlIFBBTCBCL0cgVFYgYmFuZCBhbmQgcmVjZWl2ZQorc3RlcmVvIGF1ZGlvIGJyb2FkY2FzdHMgb24gdGhlIEEyIGNhcnJpZXIuCisKK1RvIHZlcmlmeSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIGhhcyBiZWVuIHBsYWNlZCBpbiB0aGUgY29ycmVjdCBsb2NhdGlvbiwKK2V4ZWN1dGU6CisKKyAgICAgICAgJCBtb2Rwcm9iZSAtYyB8IGdyZXAgd2lzLXNvbnktdHVuZXIKKworSWYgdGhlIGNvbmZpZ3VyYXRpb24gbGluZSBhcHBlYXJzLCB0aGVuIG1vZHByb2JlIHdpbGwgcGFzcyB0aGUgcGFyYW1ldGVycworY29ycmVjdGx5IHRoZSBuZXh0IHRpbWUgdGhlIHdpcy1zb255LXR1bmVyIG1vZHVsZSBpcyBsb2FkZWQgaW50byB0aGUKK2tlcm5lbC4KKworCisgIDQuIFRFU1RJTkcgVEhFIERSSVZFUgorCisKK0JlY2F1c2UgZmV3IExpbnV4IGFwcGxpY2F0aW9ucyBhcmUgYWJsZSB0byBjb3JyZWN0bHkgY2FwdHVyZSBmcm9tCitWaWRlbzRMaW51eDIgZGV2aWNlcyB3aXRoIG9ubHkgY29tcHJlc3NlZCBmb3JtYXRzIHN1cHBvcnRlZCwgdGhlIG5ldyBkcml2ZXIKK3Nob3VsZCBiZSB0ZXN0ZWQgd2l0aCB0aGUgImdvcmVjb3JkIiBhcHBsaWNhdGlvbiBpbiB0aGUgYXBwcy8gZGlyZWN0b3J5LgorCitGaXJzdCBjb25uZWN0IGEgdmlkZW8gc291cmNlIHRvIHRoZSBkZXZpY2UsIHN1Y2ggYXMgYSBEVkQgcGxheWVyIG9yIFZDUi4KK1RoaXMgd2lsbCBiZSBjYXB0dXJlZCB0byBhIGZpbGUgZm9yIHRlc3RpbmcgdGhlIGRyaXZlci4gIElmIGFuIGlucHV0IHNvdXJjZQoraXMgdW5hdmFpbGFibGUsIGEgdGVzdCBmaWxlIGNhbiBzdGlsbCBiZSBjYXB0dXJlZCwgYnV0IHRoZSB2aWRlbyB3aWxsIGJlCitibGFjayBhbmQgdGhlIGF1ZGlvIHdpbGwgYmUgc2lsZW50LgorCitUaGlzIGFwcGxpY2F0aW9uIHdpbGwgYXV0by1kZXRlY3QgdGhlIFY0TDIgYW5kIEFMU0EvT1NTIGRldmljZSBuYW1lcyBvZiB0aGUKK2hhcmR3YXJlIGFuZCB3aWxsIHJlY29yZCB2aWRlbyBhbmQgYXVkaW8gdG8gYW4gQVZJIGZpbGUgZm9yIGEgc3BlY2lmaWVkCitudW1iZXIgb2Ygc2Vjb25kcy4gIEZvciBleGFtcGxlOgorCisgICAgICAgICQgYXBwcy9nb3JlY29yZCAtZHVyYXRpb24gNjAgY2FwdHVyZS5hdmkKKworSWYgdGhpcyBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdWNjZXNzZnVsbHkgcmVjb3JkIGFuIEFWSSBmaWxlLCB0aGUgZXJyb3IKK21lc3NhZ2VzIHByb2R1Y2VkIGJ5IGdvcmVjb3JkIGFuZCByZWNvcmRlZCBpbiB0aGUgc3lzdGVtIGxvZyAodXN1YWxseSBpbgorL3Zhci9sb2cvbWVzc2FnZXMpIHNob3VsZCBwcm92aWRlIGluZm9ybWF0aW9uIHRvIGhlbHAgcmVzb2x2ZSB0aGUgcHJvYmxlbS4KKworU3VwcGx5aW5nIG5vIHBhcmFtZXRlcnMgdG8gZ29yZWNvcmQgd2lsbCBjYXVzZSBpdCB0byBwcm9iZSB0aGUgYXZhaWxhYmxlCitkZXZpY2VzIGFuZCBleGl0LiAgVXNlIHRoZSAtaGVscCBmbGFnIGZvciB1c2FnZSBpbmZvcm1hdGlvbi4KKworCisgIDUuIFVTSU5HIFRIRSBEUklWRVIKKworCitUaGUgVjRMMiBkZXZpY2UgaW1wbGVtZW50ZWQgYnkgdGhlIGRyaXZlciBwcm92aWRlcyBhIHN0YW5kYXJkIGNvbXByZXNzZWQKK2Zvcm1hdCBBUEksIHdpdGhpbiB0aGUgZm9sbG93aW5nIGNyaXRlcmlhOgorCisgICogQXBwbGljYXRpb25zIHRoYXQgb25seSBzdXBwb3J0IHRoZSBvcmlnaW5hbCBWaWRlbzRMaW51eDEgQVBJIHdpbGwgbm90CisgICAgYmUgYWJsZSB0byBjb21tdW5pY2F0ZSB3aXRoIHRoaXMgZHJpdmVyIGF0IGFsbC4KKworICAqIE5vIHJhdyB2aWRlbyBtb2RlcyBhcmUgc3VwcG9ydGVkLCBzbyBhcHBsaWNhdGlvbnMgbGlrZSB4YXd0diB0aGF0CisgICAgZXhwZWN0IG9ubHkgdW5jb21wcmVzc2VkIHZpZGVvIHdpbGwgbm90IGZ1bmN0aW9uLgorCisgICogU3VwcG9ydGVkIGNvbXByZXNzaW9uIGZvcm1hdHMgYXJlOiBNb3Rpb24tSlBFRywgTVBFRzEsIE1QRUcyIGFuZCBNUEVHNC4KKworICAqIE1QRUcgdmlkZW8gZm9ybWF0cyBhcmUgZGVsaXZlcmVkIGFzIFZpZGVvIEVsZW1lbnRhcnkgU3RyZWFtcyBvbmx5LgorICAgIFByb2dyYW0gU3RyZWFtIChQUyksIFRyYW5zcG9ydCBTdHJlYW0gKFRTKSBhbmQgUGFja2V0aXplZCBFbGVtZW50YXJ5CisgICAgU3RyZWFtIChQRVMpIGZvcm1hdHMgYXJlIG5vdCBzdXBwb3J0ZWQuCisKKyAgKiBWaWRlbyBwYXJhbWV0ZXJzIHN1Y2ggYXMgZm9ybWF0IGFuZCBpbnB1dCBwb3J0IG1heSBub3QgYmUgY2hhbmdlZCB3aGlsZQorICAgIHRoZSBlbmNvZGVyIGlzIGFjdGl2ZS4KKworICAqIFRoZSBhdWRpbyBjYXB0dXJlIGRldmljZSBvbmx5IGZ1bmN0aW9ucyB3aGVuIHRoZSB2aWRlbyBlbmNvZGVyIGlzCisgICAgYWN0aXZlbHkgY2FwdHVyaW5nIHZpZGVvLiAgQXR0ZW1wdHMgdG8gcmVhZCBmcm9tIHRoZSBhdWRpbyBkZXZpY2Ugd2hlbgorICAgIHRoZSBlbmNvZGVyIGlzIGluYWN0aXZlIHdpbGwgcmVzdWx0IGluIGFuIEkvTyBlcnJvci4KKworICAqIFRoZSBuYXRpdmUgZm9ybWF0IG9mIHRoZSBhdWRpbyBkZXZpY2UgaXMgNDhLaHogMi1jaGFubmVsIDE2LWJpdAorICAgIGxpdHRsZS1lbmRpYW4gUENNLCBkZWxpdmVyZWQgdGhyb3VnaCB0aGUgQUxTQSBzeXN0ZW0uICBObyBhdWRpbworICAgIGNvbXByZXNzaW9uIGlzIGltcGxlbWVudGVkIGluIHRoZSBoYXJkd2FyZS4gIEFMU0EgbWF5IGNvbnZlcnQgdG8gb3RoZXIKKyAgICB1bmNvbXByZXNzZWQgZm9ybWF0cyBvbiB0aGUgZmx5LgorCitUaGUgaW5jbHVkZS8gZGlyZWN0b3J5IGNvbnRhaW5zIGEgQyBoZWFkZXIgZmlsZSBkZXNjcmliaW5nIG5vbi1zdGFuZGFyZAorZmVhdHVyZXMgb2YgdGhlIEdPNzAwN1NCIGVuY29kZXIsIHdoaWNoIGFyZSBkZXNjcmliZWQgYmVsb3c6CisKKworICBHTzcwMDdJT0NfU19DT01QX1BBUkFNUywgR083MDA3SU9DX0dfQ09NUF9QQVJBTVMKKworICAgIFRoZXNlIGlvY3RscyBhcmUgdXNlZCB0byBuZWdvdGlhdGUgZ2VuZXJhbCBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzLgorCisgICAgVG8gcXVlcnkgdGhlIGN1cnJlbnQgcGFyYW1ldGVycywgY2FsbCB0aGUgR083MDA3SU9DX0dfQ09NUF9QQVJBTVMgaW9jdGwKKyAgICB3aXRoIGEgcG9pbnRlciB0byBhIHN0cnVjdCBnbzcwMDdfY29tcF9wYXJhbXMuICBJZiB0aGUgZHJpdmVyIGlzIG5vdAorICAgIHNldCB0byBNUEVHIGZvcm1hdCwgdGhlIEVJTlZBTCBlcnJvciBjb2RlIHdpbGwgYmUgcmV0dXJuZWQuCisKKyAgICBUbyBjaGFuZ2UgdGhlIGN1cnJlbnQgcGFyYW1ldGVycywgaW5pdGlhbGl6ZSBhbGwgZmllbGRzIG9mIGEgc3RydWN0CisgICAgZ283MDA3X2NvbXBfcGFyYW1zIGFuZCBjYWxsIHRoZSBHTzcwMDdfSU9DX1NfQ09NUF9QQVJBTVMgaW9jdGwgd2l0aCBhCisgICAgcG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZS4gIFRoZSBkcml2ZXIgd2lsbCByZXR1cm4gdGhlIGN1cnJlbnQKKyAgICBwYXJhbWV0ZXJzIHdpdGggYW55IG5lY2Vzc2FyeSBjaGFuZ2VzIHRvIGNvbmZvcm0gdG8gdGhlIGxpbWl0YXRpb25zIG9mCisgICAgdGhlIGhhcmR3YXJlIG9yIGN1cnJlbnQgY29tcHJlc3Npb24gbW9kZS4gIEFueSBvciBhbGwgZmllbGRzIGNhbiBiZSBzZXQKKyAgICB0byB6ZXJvIHRvIHJlcXVlc3QgYSByZWFzb25hYmxlIGRlZmF1bHQgdmFsdWUuICBJZiB0aGUgZHJpdmVyIGlzIG5vdAorICAgIHNldCB0byBNUEVHIGZvcm1hdCwgdGhlIEVJTlZBTCBlcnJvciBjb2RlIHdpbGwgYmUgcmV0dXJuZWQuICBXaGVuIEkvTworICAgIGlzIGluIHByb2dyZXNzLCB0aGUgRUJVU1kgZXJyb3IgY29kZSB3aWxsIGJlIHJldHVybmVkLgorCisgICAgRmllbGRzIGluIHN0cnVjdCBnbzcwMDdfY29tcF9wYXJhbXM6CisKKyAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgICAgICBUaGUgbWF4aW11bSBudW1iZXIgb2YgZnJhbWVzIGluIGVhY2gKKyAgICAgICAgICBnb3Bfc2l6ZSAgICAgICAgICAgICAgICAgICBHcm91cCBPZiBQaWN0dXJlczsgaS5lLiB0aGUgbWF4aW11bQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiBmcmFtZXMgbWludXMgb25lIGJldHdlZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoIGtleSBmcmFtZS4KKworICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzZXF1ZW50aWFsCisgICAgICAgICAgbWF4X2JfZnJhbWVzICAgICAgICAgICAgICAgYmlkaXJlY3Rpb25hbGx5LXByZWRpY3RlZCBmcmFtZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEItZnJhbWVzIGFyZSBub3QgeWV0IHN1cHBvcnRlZC4pCisKKyAgICAgICAgZW51bSBnbzcwMDdfYXNwZWN0X3JhdGlvICAgICBUaGUgYXNwZWN0IHJhdGlvIHRvIGJlIGVuY29kZWQgaW4gdGhlCisgICAgICAgICAgYXNwZWN0X3JhdGlvICAgICAgICAgICAgICAgbWV0YS1kYXRhIG9mIHRoZSBjb21wcmVzc2VkIGZvcm1hdC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENob2ljZXMgYXJlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPNzAwN19BU1BFQ1RfUkFUSU9fMV8xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR083MDA3X0FTUEVDVF9SQVRJT180XzNfTlRTQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPNzAwN19BU1BFQ1RfUkFUSU9fNF8zX1BBTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPNzAwN19BU1BFQ1RfUkFUSU9fMTZfOV9OVFNDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR083MDA3X0FTUEVDVF9SQVRJT18xNl85X1BBTAorCisgICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgICAgICAgQml0LXdpc2UgT1Igb2YgY29udHJvbCBmbGFncyAoYmVsb3cpCisgICAgICAgICAgZmxhZ3MKKworICAgIEZsYWdzIGluIHN0cnVjdCBnbzcwMDdfY29tcF9wYXJhbXM6CisKKyAgICAgICAgR083MDA3X0NPTVBfQ0xPU0VEX0dPUCAgICAgICBPbmx5IHByb2R1Y2Ugc2VsZi1jb250YWluZWQgR09QcywgdXNlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHByb2R1Y2Ugc3RyZWFtcyBhcHByb3ByaWF0ZSBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gc2Vla2luZy4KKworICAgICAgICBHTzcwMDdfQ09NUF9PTUlUX1NFUV9IRUFERVIgIE9taXQgdGhlIHN0cmVhbSBzZXF1ZW5jZSBoZWFkZXIuCisKKworICBHTzcwMDdJT0NfU19NUEVHX1BBUkFNUywgR083MDA3SU9DX0dfTVBFR19QQVJBTVMKKworICAgIFRoZXNlIGlvY3RscyBhcmUgdXNlZCB0byBuZWdvdGlhdGUgTVBFRy1zcGVjaWZpYyBzdHJlYW0gcGFyYW1ldGVycyB3aGVuCisgICAgdGhlIHBpeGVsZm9ybWF0IGhhcyBiZWVuIHNldCB0byBWNEwyX1BJWF9GTVRfTVBFRy4KKworICAgIFRvIHF1ZXJ5IHRoZSBjdXJyZW50IHBhcmFtZXRlcnMsIGNhbGwgdGhlIEdPNzAwN0lPQ19HX01QRUdfUEFSQU1TIGlvY3RsCisgICAgd2l0aCBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgZ283MDA3X21wZWdfcGFyYW1zLiAgSWYgdGhlIGRyaXZlciBpcyBub3QKKyAgICBzZXQgdG8gTVBFRyBmb3JtYXQsIHRoZSBFSU5WQUwgZXJyb3IgY29kZSB3aWxsIGJlIHJldHVybmVkLgorCisgICAgVG8gY2hhbmdlIHRoZSBjdXJyZW50IHBhcmFtZXRlcnMsIGluaXRpYWxpemUgYWxsIGZpZWxkcyBvZiBhIHN0cnVjdAorICAgIGdvNzAwN19tcGVnX3BhcmFtcyBhbmQgY2FsbCB0aGUgR083MDA3X0lPQ19TX01QRUdfUEFSQU1TIGlvY3RsIHdpdGggYQorICAgIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUuICBUaGUgZHJpdmVyIHdpbGwgcmV0dXJuIHRoZSBjdXJyZW50CisgICAgcGFyYW1ldGVycyB3aXRoIGFueSBuZWNlc3NhcnkgY2hhbmdlcyB0byBjb25mb3JtIHRvIHRoZSBsaW1pdGF0aW9ucyBvZgorICAgIHRoZSBoYXJkd2FyZSBvciBzZWxlY3RlZCBNUEVHIG1vZGUuICBBbnkgb3IgYWxsIGZpZWxkcyBjYW4gYmUgc2V0IHRvCisgICAgemVybyB0byByZXF1ZXN0IGEgcmVhc29uYWJsZSBkZWZhdWx0IHZhbHVlLiAgSWYgdGhlIGRyaXZlciBpcyBub3Qgc2V0CisgICAgdG8gTVBFRyBmb3JtYXQsIHRoZSBFSU5WQUwgZXJyb3IgY29kZSB3aWxsIGJlIHJldHVybmVkLiAgV2hlbiBJL08gaXMgaW4KKyAgICBwcm9ncmVzcywgdGhlIEVCVVNZIGVycm9yIGNvZGUgd2lsbCBiZSByZXR1cm5lZC4KKworICAgIEZpZWxkcyBpbiBzdHJ1Y3QgZ283MDA3X21wZWdfcGFyYW1zOgorCisgICAgICAgIGVudW0gZ283MDA3X21wZWdfdmlkZW9fc3RhbmRhcmQKKyAgICAgICAgICBtcGVnX3ZpZGVvX3N0YW5kYXJkICAgICAgICBUaGUgTVBFRyB2aWRlbyBzdGFuZGFyZCBpbiB3aGljaCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzIHRoZSB2aWRlby4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENob2ljZXMgYXJlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPNzAwN19NUEVHX1ZJREVPX01QRUcxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR083MDA3X01QRUdfVklERU9fTVBFRzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTzcwMDdfTVBFR19WSURFT19NUEVHNAorCisgICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgICAgICAgQml0LXdpc2UgT1Igb2YgY29udHJvbCBmbGFncyAoYmVsb3cpCisgICAgICAgICAgZmxhZ3MKKworICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBwcm9maWxlIGFuZCBsZXZlbCBpbmRpY2F0aW9uIHRvIGJlCisgICAgICAgICAgcGFsaSAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVkIGluIHRoZSBzZXF1ZW5jZSBoZWFkZXIuICBUaGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgb25seSB1c2VkIGFzIGFuIGluZGljYXRvciB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLCBhbmQgZG9lcyBub3QgYWZmZWN0IHRoZSBNUEVHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXMgdXNlZCBpbiB0aGUgdmlkZW8gc3RyZWFtLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdCB2YWxpZCBmb3IgTVBFRzEuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaG9pY2VzIGZvciBNUEVHMiBhcmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR083MDA3X01QRUcyX1BST0ZJTEVfTUFJTl9NQUlOCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaG9pY2VzIGZvciBNUEVHNCBhcmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR083MDA3X01QRUc0X1BST0ZJTEVfU19MMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPNzAwN19NUEVHNF9QUk9GSUxFX1NfTDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTzcwMDdfTVBFRzRfUFJPRklMRV9TX0wyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR083MDA3X01QRUc0X1BST0ZJTEVfU19MMworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPNzAwN19NUEVHNF9QUk9GSUxFX0FSVFNfTDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTzcwMDdfTVBFRzRfUFJPRklMRV9BUlRTX0wyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR083MDA3X01QRUc0X1BST0ZJTEVfQVJUU19MMworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPNzAwN19NUEVHNF9QUk9GSUxFX0FSVFNfTDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTzcwMDdfTVBFRzRfUFJPRklMRV9BU19MMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPNzAwN19NUEVHNF9QUk9GSUxFX0FTX0wxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR083MDA3X01QRUc0X1BST0ZJTEVfQVNfTDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTzcwMDdfTVBFRzRfUFJPRklMRV9BU19MMworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPNzAwN19NUEVHNF9QUk9GSUxFX0FTX0w0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR083MDA3X01QRUc0X1BST0ZJTEVfQVNfTDUKKworICAgIEZsYWdzIGluIHN0cnVjdCBnbzcwMDdfbXBlZ19wYXJhbXM6CisKKyAgICAgICAgR083MDA3X01QRUdfRk9SQ0VfRFZEX01PREUgICBGb3JjZSBhbGwgY29tcHJlc3Npb24gcGFyYW1ldGVycyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRyYXRlIGNvbnRyb2wgc2V0dGluZ3MgdG8gY29tcGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBEVkQgTVBFRzIgc3RyZWFtIHJlcXVpcmVtZW50cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG92ZXJyaWRlcyBtb3N0IGNvbXByZXNzaW9uIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHJhdGUgc2V0dGluZ3MhCisKKyAgICAgICAgR083MDA3X01QRUdfT01JVF9HT1BfSEVBREVSICBPbWl0IHRoZSBHT1AgaGVhZGVyLgorCisgICAgICAgIEdPNzAwN19NUEVHX1JFUEVBVF9TRVFIRUFERVIgUmVwZWF0IHRoZSBNUEVHIHNlcXVlbmNlIGhlYWRlciBhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzdGFydCBvZiBlYWNoIEdPUC4KKworCisgIEdPNzAwN0lPQ19TX0JJVFJBVEUsIEdPNzAwN0lPQ19HX0JJVFJBVEUKKworICAgIFRoZXNlIGlvY3RscyBhcmUgdXNlZCB0byBzZXQgYW5kIHF1ZXJ5IHRoZSB0YXJnZXQgYml0cmF0ZSB2YWx1ZSBmb3IgdGhlCisgICAgY29tcHJlc3NlZCB2aWRlbyBzdHJlYW0uICBUaGUgYml0cmF0ZSBtYXkgYmUgc2VsZWN0ZWQgYnkgc3RvcmluZyB0aGUKKyAgICB0YXJnZXQgYml0cyBwZXIgc2Vjb25kIGluIGFuIGludCBhbmQgY2FsbGluZyBHTzcwMDdJT0NfU19CSVRSQVRFIHdpdGggYQorICAgIHBvaW50ZXIgdG8gdGhlIGludC4gIFRoZSBiaXRyYXRlIG1heSBiZSBxdWVyaWVkIGJ5IGNhbGxpbmcKKyAgICBHTzcwMDdJT0NfR19CSVRSQVRFIHdpdGggYSBwb2ludGVyIHRvIGFuIGludCB3aGVyZSB0aGUgY3VycmVudCBiaXRyYXRlCisgICAgd2lsbCBiZSBzdG9yZWQuCisKKyAgICBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgcHJpbWFyeSBtZWFucyBvZiBjb250cm9sbGluZyB0aGUgdmlkZW8gcXVhbGl0eQorICAgIGZvciBhbGwgY29tcHJlc3Npb24gbW9kZXMsIGluY2x1ZGluZyBWNEwyX1BJWF9GTVRfTUpQRUcuICBUaGUKKyAgICBWSURJT0NfU19KUEVHQ09NUCBpb2N0bCBpcyBub3Qgc3VwcG9ydGVkLgorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgICBJbnN0YWxsaW5nIHRoZSBXSVMgUENJIFZveWFnZXIgRHJpdmVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIFdJUyBQQ0kgVm95YWdlciBkcml2ZXIgcmVxdWlyZXMgc2V2ZXJhbCBwYXRjaGVzIHRvIHRoZSBMaW51eCAyLjYuMTEueAora2VybmVsIHNvdXJjZSB0cmVlIGJlZm9yZSBjb21waWxpbmcgdGhlIGRyaXZlci4gIFRoZXNlIHBhdGNoZXMgdXBkYXRlIHRoZQoraW4ta2VybmVsIFNBQTcxMzQgZHJpdmVyIHRvIHRoZSBuZXdlc3QgZGV2ZWxvcG1lbnQgdmVyc2lvbiBhbmQgcGF0Y2ggYnVncworaW4gdGhlIFREQTgyOTAvVERBODI3NSB0dW5lciBkcml2ZXIuCisKK1RoZSBmb2xsb3dpbmcgcGF0Y2hlcyBtdXN0IGJlIGRvd25sb2FkZWQgZnJvbSBHZXJkIEtub3JyJ3Mgd2Vic2l0ZSBhbmQKK2FwcGxpZWQgaW4gdGhlIG9yZGVyIGxpc3RlZDoKKworCWh0dHA6Ly9kbC5ieXRlc2V4Lm9yZy9wYXRjaGVzLzIuNi4xMS0yL2kyYy10dW5lcgorCWh0dHA6Ly9kbC5ieXRlc2V4Lm9yZy9wYXRjaGVzLzIuNi4xMS0yL2kyYy10dW5lcjIKKwlodHRwOi8vZGwuYnl0ZXNleC5vcmcvcGF0Y2hlcy8yLjYuMTEtMi92NGwyLWFwaS1tcGVnCisJaHR0cDovL2RsLmJ5dGVzZXgub3JnL3BhdGNoZXMvMi42LjExLTIvc2FhNzEzNC11cGRhdGUKKworVGhlIGZvbGxvd2luZyBwYXRjaGVzIGFyZSBpbmNsdWRlZCB3aXRoIHRoaXMgU0RLIGFuZCBjYW4gYmUgYXBwbGllZCBpbiBhbnkKK29yZGVyOgorCisJcGF0Y2hlcy8yLjYuMTEvc2FhNzEzNC12b3lhZ2VyLmRpZmYKKwlwYXRjaGVzLzIuNi4xMS90ZGE4Mjc1LW5ld2FkZHIuZGlmZgorCXBhdGNoZXMvMi42LjExL3RkYTgyOTAtbnRzYy5kaWZmCisKK0NoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgQ09ORklHX1ZJREVPX1NBQTcxMzQgb3B0aW9uIGlzIGVuYWJsZWQgaW4gdGhlIGtlcm5lbAorY29uZmlndXJhdGlvbiwgYW5kIGJ1aWxkIGFuZCBpbnN0YWxsIHRoZSBrZXJuZWwuCisKK0FmdGVyIHJlYm9vdGluZyBpbnRvIHRoZSBuZXcga2VybmVsLCB0aGUgR083MDA3IGRyaXZlciBjYW4gYmUgY29tcGlsZWQgYW5kCitpbnN0YWxsZWQ6CisKKwkkIG1ha2UgU0FBNzEzNF9CVUlMRD15CisJJCBtYWtlIGluc3RhbGwKKwkkIG1vZHByb2JlIHNhYTcxMzQtZ283MDA3CisKK1RoZXJlIHdpbGwgYmUgdHdvIFY0TCB2aWRlbyBkZXZpY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgUENJIFZveWFnZXIuICBUaGUKK2ZpcnN0IGRldmljZSAobW9zdCBsaWtlbHkgL2Rldi92aWRlbzApIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgcmF3IHZpZGVvCitjYXB0dXJlIG1vZGUgb2YgdGhlIFNBQTcxMzMgZGV2aWNlIGFuZCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgc291cmNlCit2aWRlbyBwYXJhbWV0ZXJzIGFuZCB0dW5lIHRoZSBUViB0dW5lci4gIFRoaXMgZGV2aWNlIGNhbiBiZSB1c2VkIHdpdGggeGF3dHYKK29yIG90aGVyIFY0TCgyKSB2aWRlbyBzb2Z0d2FyZSBhcyBhIHN0YW5kYXJkIHVuY29tcHJlc3NlZCBkZXZpY2UuCisKK1RoZSBzZWNvbmQgZGV2aWNlIChtb3N0IGxpa2VseSAvZGV2L3ZpZGVvMSkgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZQorY29tcHJlc3Npb24gZnVuY3Rpb25zIG9mIHRoZSBHTzcwMDcuICBJdCBjYW4gYmUgdGVzdGVkIHVzaW5nIHRoZSBnb3JlY29yZAorYXBwbGljYXRpb24gaW4gdGhlIGFwcHMvIGRpcmVjdG9yeSBvZiB0aGlzIFNESzoKKworCSQgYXBwcy9nb3JlY29yZCAtdmRldmljZSAvZGV2L3ZpZGVvMSAtbm9hdWRpbyB0ZXN0LmF2aQorCitDdXJyZW50bHkgdGhlIGZyYW1lIHJlc29sdXRpb24gaXMgZml4ZWQgYXQgNzIweDQ4MCAoTlRTQykgb3IgNzIweDU3NiAoUEFMKSwKK2FuZCB0aGUgdmlkZW8gc3RhbmRhcmQgbXVzdCBiZSBzcGVjaWZpZWQgdG8gYm90aCB0aGUgcmF3IGFuZCB0aGUgY29tcHJlc3NlZAordmlkZW8gZGV2aWNlcyAoeGF3dHYgYW5kIGdvcmVjb3JkLCBmb3IgZXhhbXBsZSkuCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JFTEVBU0UgTk9URVMgRk9SIFdJUyBHTzcwMDdTQiBMSU5VWCBEUklWRVIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMYXN0IHVwZGF0ZWQ6IDUgTm92ZW1iZXIgMjAwNQorCisgLSBSZWxlYXNlIDAuOS43IGluY2x1ZGVzIG5ldyBzdXBwb3J0IGZvciB1c2luZyB1ZGV2IHRvIHJ1biBmeGxvYWQuICBUaGUKKyAgIGluc3RhbGwgc2NyaXB0IHNob3VsZCBhdXRvbWF0aWNhbGx5IGRldGVjdCB3aGV0aGVyIHRoZSBvbGQgaG90cGx1ZworICAgc2NyaXB0cyBvciB0aGUgbmV3IHVkZXYgcnVsZXMgc2hvdWxkIGJlIHVzZWQuICBUbyBmb3JjZSB0aGUgdXNlIG9mCisgICBob3RwbHVnLCBydW4gIm1ha2UgaW5zdGFsbCBVU0VfVURFVj1uIi4gIFRvIGZvcmNlIHRoZSB1c2Ugb2YgdWRldiwgcnVuCisgICAibWFrZSBpbnN0YWxsIFVTRV9VREVWPXkiLgorCisgLSBNb3Rpb24gZGV0ZWN0aW9uIGlzIHN1cHBvcnRlZCBidXQgdW5kb2N1bWVudGVkLiAgVHJ5IHRoZSBgbW9kZXRgIGFwcAorICAgZm9yIGEgZGVtb25zdHJhdGlvbiBvZiBob3cgdG8gdXNlIHRoZSBmYWNpbGl0eS4KKworIC0gVXNpbmcgVVNCMi4wIGRldmljZXMgc3VjaCBhcyB0aGUgVFY0MDJVIHdpdGggVVNCMS4xIEhDRHMgb3IgaHVicyBjYW4KKyAgIGNhdXNlIGJ1ZmZlciBvdmVycnVucyBhbmQgZnJhbWUgZHJvcHMsIGV2ZW4gYXQgbG93IGZyYW1lcmF0ZXMsIGR1ZSB0bworICAgaW5jb25zaXN0ZW5jeSBpbiB0aGUgYml0cmF0ZSBjb250cm9sIG1lY2hhbmlzbS4KKworIC0gT24gZGV2aWNlcyB3aXRoIGFuIFNBQTcxMTUsIGluY2x1ZGluZyB0aGUgUGxleHRvciBDb252ZXJ0WCwgdmlkZW8gaGVpZ2h0CisgICB2YWx1ZXMgb2YgOTYsIDEyOCwgMTYwLCAxOTIsIDI1NiwgMzIwLCBhbmQgMzg0IGRvIG5vdCB3b3JrIGluIE5UU0MgbW9kZS4KKyAgIEFsbCB2YWxpZCBoZWlnaHRzIHVwIHRvIDUxMiB3b3JrIGNvcnJlY3RseSBpbiBQQUwgbW9kZS4KKworIC0gVGhlIFdJUyBTdGFyIFRyZWsgYW5kIFBDSSBWb3lhZ2VyIGJvYXJkcyBoYXZlIG5vIHN1cHBvcnQgeWV0IGZvciBhdWRpbworICAgb3IgdGhlIFRWIHR1bmVyLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9zMjI1MC1ib2FyZC5jIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9zMjI1MC1ib2FyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNjg0NWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L3MyMjUwLWJvYXJkLmMKQEAgLTAsMCArMSw2MzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggU2Vuc29yYXkgQ29tcGFueSBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKFZlcnNpb24gMikgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgorI2luY2x1ZGUgImdvNzAwNy1wcml2LmgiCisjaW5jbHVkZSAid2lzLWkyYy5oIgorCitleHRlcm4gaW50IHMyMjUwbG9hZGVyX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBzMjI1MGxvYWRlcl9jbGVhbnVwKHZvaWQpOworCisjZGVmaW5lIFRMVjMyMF9BRERSRVNTICAgICAgMHgzNAorI2RlZmluZSBTMjI1MF9WSURERUMgICAgICAgIDB4ODYKKyNkZWZpbmUgVlBYMzIyX0FERFJfQU5BTE9HQ09OVFJPTDEJMHgwMgorI2RlZmluZSBWUFgzMjJfQUREUl9CUklHSFRORVNTMAkJMHgwMTI3CisjZGVmaW5lIFZQWDMyMl9BRERSX0JSSUdIVE5FU1MxCQkweDAxMzEKKyNkZWZpbmUgVlBYMzIyX0FERFJfQ09OVFJBU1QwCQkweDAxMjgKKyNkZWZpbmUgVlBYMzIyX0FERFJfQ09OVFJBU1QxCQkweDAxMzIKKyNkZWZpbmUgVlBYMzIyX0FERFJfSFVFCQkJMHgwMGRjCisjZGVmaW5lIFZQWDMyMl9BRERSX1NBVAkgCSAgICAgICAgMHgwMDMwCisKK3N0cnVjdCBnbzcwMDdfdXNiX2JvYXJkIHsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJc3RydWN0IGdvNzAwN19ib2FyZF9pbmZvIG1haW5faW5mbzsKK307CisKK3N0cnVjdCBnbzcwMDdfdXNiIHsKKwlzdHJ1Y3QgZ283MDA3X3VzYl9ib2FyZCAqYm9hcmQ7CisJc3RydWN0IHNlbWFwaG9yZSBpMmNfbG9jazsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiZGV2OworCXN0cnVjdCB1cmIgKnZpZGVvX3VyYnNbOF07CisJc3RydWN0IHVyYiAqYXVkaW9fdXJic1s4XTsKKwlzdHJ1Y3QgdXJiICppbnRyX3VyYjsKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGF1ZF9yZWdzW10gPSB7CisJMHgxZSwgMHgwMCwKKwkweDAwLCAweDE3LAorCTB4MDIsIDB4MTcsCisJMHgwNCwgMHhmOSwKKwkweDA2LCAweGY5LAorCTB4MDgsIDB4MDIsCisJMHgwYSwgMHgwMCwKKwkweDBjLCAweDAwLAorCTB4MGEsIDB4MDAsCisJMHgwYywgMHgwMCwKKwkweDBlLCAweDAyLAorCTB4MTAsIDB4MDAsCisJMHgxMiwgMHgwMSwKKwkweDAwLCAweDAwLAorfTsKKworCitzdGF0aWMgdW5zaWduZWQgY2hhciB2aWRfcmVnc1tdID0geworCTB4RjIsIDB4MGYsCisJMHhBQSwgMHgwMCwKKwkweEY4LCAweGZmLAorCTB4MDAsIDB4MDAsCit9OworCitzdGF0aWMgdTE2IHZpZF9yZWdzX2ZwW10gPSB7CisJMHgwMjgsIDB4MDY3LAorCTB4MTIwLCAweDAxNiwKKwkweDEyMSwgMHhjRjIsCisJMHgxMjIsIDB4MEYyLAorCTB4MTIzLCAweDAwYywKKwkweDEyNCwgMHgyZDAsCisJMHgxMjUsIDB4MmUwLAorCTB4MTI2LCAweDAwNCwKKwkweDEyOCwgMHgxRTAsCisJMHgxMkEsIDB4MDE2LAorCTB4MTJCLCAweDBGMiwKKwkweDEyQywgMHgwRjIsCisJMHgxMkQsIDB4MDBjLAorCTB4MTJFLCAweDJkMCwKKwkweDEyRiwgMHgyZTAsCisJMHgxMzAsIDB4MDA0LAorCTB4MTMyLCAweDFFMCwKKwkweDE0MCwgMHgwNjAsCisJMHgxNTMsIDB4MDBDLAorCTB4MTU0LCAweDIwMCwKKwkweDE1MCwgMHg4MDEsCisJMHgwMDAsIDB4MDAwCit9OworCisvKiBQQUwgc3BlY2lmaWMgdmFsdWVzICovCitzdGF0aWMgdTE2IHZpZF9yZWdzX2ZwX3BhbFtdID0KK3sKKwkweDEyMCwgMHgwMTcsCisJMHgxMjEsIDB4ZDIyLAorCTB4MTIyLCAweDEyMiwKKwkweDEyQSwgMHgwMTcsCisJMHgxMkIsIDB4MTIyLAorCTB4MTJDLCAweDEyMiwKKwkweDE0MCwgMHgwNjAsCisJMHgwMDAsIDB4MDAwLAorfTsKKworc3RydWN0IHMyMjUwIHsKKwlpbnQgc3RkOworCWludCBpbnB1dDsKKwlpbnQgYnJpZ2h0bmVzczsKKwlpbnQgY29udHJhc3Q7CisJaW50IHNhdHVyYXRpb247CisJaW50IGh1ZTsKKwlpbnQgcmVnMTJiX3ZhbDsKKwlpbnQgYXVkaW9faW5wdXQ7Cit9OworCisvKiBmcm9tIGdvNzAwNy11c2IuYyB3aGljaCBpcyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBNaWNyb25hcyBVU0EgSW5jLiovCitzdGF0aWMgaW50IGdvNzAwN191c2JfdmVuZG9yX3JlcXVlc3Qoc3RydWN0IGdvNzAwNyAqZ28sIHUxNiByZXF1ZXN0LAorCXUxNiB2YWx1ZSwgdTE2IGluZGV4LCB2b2lkICp0cmFuc2Zlcl9idWZmZXIsIGludCBsZW5ndGgsIGludCBpbikKK3sKKwlzdHJ1Y3QgZ283MDA3X3VzYiAqdXNiID0gZ28tPmhwaV9jb250ZXh0OworCWludCB0aW1lb3V0ID0gNTAwMDsKKworCWlmIChpbikgeworCQlyZXR1cm4gdXNiX2NvbnRyb2xfbXNnKHVzYi0+dXNiZGV2LAorCQkJCXVzYl9yY3ZjdHJscGlwZSh1c2ItPnVzYmRldiwgMCksIHJlcXVlc3QsCisJCQkJVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSB8IFVTQl9ESVJfSU4sCisJCQkJdmFsdWUsIGluZGV4LCB0cmFuc2Zlcl9idWZmZXIsIGxlbmd0aCwgdGltZW91dCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHVzYl9jb250cm9sX21zZyh1c2ItPnVzYmRldiwKKwkJCQl1c2Jfc25kY3RybHBpcGUodXNiLT51c2JkZXYsIDApLCByZXF1ZXN0LAorCQkJCVVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCisJCQkJdmFsdWUsIGluZGV4LCB0cmFuc2Zlcl9idWZmZXIsIGxlbmd0aCwgdGltZW91dCk7CisJfQorfQorLyogZW5kIGZyb20gZ283MDA3LXVzYi5jIHdoaWNoIGlzIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IE1pY3JvbmFzIFVTQSBJbmMuKi8KKworc3RhdGljIGludCB3cml0ZV9yZWcoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1OCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IGkyY19nZXRfYWRhcGRhdGEoY2xpZW50LT5hZGFwdGVyKTsKKwlzdHJ1Y3QgZ283MDA3X3VzYiAqdXNiID0gZ28tPmhwaV9jb250ZXh0OworCWludCByYzsKKwlpbnQgZGV2X2FkZHIgPSBjbGllbnQtPmFkZHI7CisJdTggKmJ1ZjsKKworCWlmIChnbyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChnby0+c3RhdHVzID09IFNUQVRVU19TSFVURE9XTikKKwkJcmV0dXJuIC1FQlVTWTsKKworCWJ1ZiA9IGt6YWxsb2MoMTYsIEdGUF9LRVJORUwpOworCWlmIChidWYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZ1c2ItPmkyY19sb2NrKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gImkyYyBsb2NrIGZhaWxlZFxuIik7CisJCXJldHVybiAtRUlOVFI7CisJfQorCXJjID0gZ283MDA3X3VzYl92ZW5kb3JfcmVxdWVzdChnbywgMHg1NSwgZGV2X2FkZHIsCisJCQkJICAgICAgIChyZWc8PDggfCB2YWx1ZSksCisJCQkJICAgICAgIGJ1ZiwKKwkJCQkgICAgICAgMTYsIDEpOworCisJdXAoJnVzYi0+aTJjX2xvY2spOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHdyaXRlX3JlZ19mcChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1MTYgYWRkciwgdTE2IHZhbCkKK3sKKwlzdHJ1Y3QgZ283MDA3ICpnbyA9IGkyY19nZXRfYWRhcGRhdGEoY2xpZW50LT5hZGFwdGVyKTsKKwlzdHJ1Y3QgZ283MDA3X3VzYiAqdXNiID0gZ28tPmhwaV9jb250ZXh0OworCXU4ICpidWY7CisJc3RydWN0IHMyMjUwICpkZWMgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWlmIChnbyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChnby0+c3RhdHVzID09IFNUQVRVU19TSFVURE9XTikKKwkJcmV0dXJuIC1FQlVTWTsKKworCWJ1ZiA9IGt6YWxsb2MoMTYsIEdGUF9LRVJORUwpOworCisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCisKKwltZW1zZXQoYnVmLCAweGNkLCA2KTsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnVzYi0+aTJjX2xvY2spICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaTJjIGxvY2sgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5UUjsKKwl9CisJaWYgKGdvNzAwN191c2JfdmVuZG9yX3JlcXVlc3QoZ28sIDB4NTcsIGFkZHIsIHZhbCwgYnVmLCAxNiwgMSkgPCAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXVwKCZ1c2ItPmkyY19sb2NrKTsKKwlpZiAoYnVmWzBdID09IDApIHsKKwkJdW5zaWduZWQgaW50IHN1YmFkZHIsIHZhbF9yZWFkOworCisJCXN1YmFkZHIgPSAoYnVmWzRdIDw8IDgpICsgYnVmWzVdOworCQl2YWxfcmVhZCA9IChidWZbMl0gPDwgOCkgKyBidWZbM107CisJCWlmICh2YWxfcmVhZCAhPSB2YWwpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gImludmFsaWQgZnAgd3JpdGUgJXggJXhcbiIsCisJCQkgICAgICAgdmFsX3JlYWQsIHZhbCk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlpZiAoc3ViYWRkciAhPSBhZGRyKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJpbnZhbGlkIGZwIHdyaXRlIGFkZHIgJXggJXhcbiIsCisJCQkgICAgICAgc3ViYWRkciwgYWRkcik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0gZWxzZQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qIHNhdmUgbGFzdCAxMmIgdmFsdWUgKi8KKwlpZiAoYWRkciA9PSAweDEyYikKKwkJZGVjLT5yZWcxMmJfdmFsID0gdmFsOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfcmVncyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCAqcmVncykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7ICEoKHJlZ3NbaV0gPT0gMHgwMCkgJiYgKHJlZ3NbaSsxXSA9PSAweDAwKSk7IGkgKz0gMikgeworCQlpZiAod3JpdGVfcmVnKGNsaWVudCwgcmVnc1tpXSwgcmVnc1tpKzFdKSA8IDApIHsKKwkJCXByaW50ayhLRVJOX0lORk8gInMyMjUwOiBmYWlsZWRcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdyaXRlX3JlZ3NfZnAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTE2ICpyZWdzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgISgocmVnc1tpXSA9PSAweDAwKSAmJiAocmVnc1tpKzFdID09IDB4MDApKTsgaSArPSAyKSB7CisJCWlmICh3cml0ZV9yZWdfZnAoY2xpZW50LCByZWdzW2ldLCByZWdzW2krMV0pIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiczIyNTA6IGZhaWxlZCBmcFxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBzMjI1MF9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBzMjI1MCAqZGVjID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVklESU9DX1NfSU5QVVQ6CisJeworCQlpbnQgdmlkc3lzOworCQlpbnQgKmlucHV0ID0gYXJnOworCisJCXZpZHN5cyA9IChkZWMtPnN0ZCA9PSBWNEwyX1NURF9OVFNDKSA/IDB4MDEgOiAweDAwOworCQlpZiAoKmlucHV0ID09IDApIHsKKwkJCS8qIGNvbXBvc2l0ZSAqLworCQkJd3JpdGVfcmVnX2ZwKGNsaWVudCwgMHgyMCwgMHgwMjAgfCB2aWRzeXMpOworCQkJd3JpdGVfcmVnX2ZwKGNsaWVudCwgMHgyMSwgMHg2NjIpOworCQkJd3JpdGVfcmVnX2ZwKGNsaWVudCwgMHgxNDAsIDB4MDYwKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFMtVmlkZW8gKi8KKwkJCXdyaXRlX3JlZ19mcChjbGllbnQsIDB4MjAsIDB4MDQwIHwgdmlkc3lzKTsKKwkJCXdyaXRlX3JlZ19mcChjbGllbnQsIDB4MjEsIDB4NjY2KTsKKwkJCXdyaXRlX3JlZ19mcChjbGllbnQsIDB4MTQwLCAweDA2MCk7CisJCX0KKwkJZGVjLT5pbnB1dCA9ICppbnB1dDsKKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX1NfU1REOgorCXsKKwkJdjRsMl9zdGRfaWQgKnN0ZCA9IGFyZzsKKwkJdTE2IHZpZHNvdXJjZTsKKworCQl2aWRzb3VyY2UgPSAoZGVjLT5pbnB1dCA9PSAxKSA/IDB4MDQwIDogMHgwMjA7CisJCWRlYy0+c3RkID0gKnN0ZDsKKwkJc3dpdGNoIChkZWMtPnN0ZCkgeworCQljYXNlIFY0TDJfU1REX05UU0M6CisJCQl3cml0ZV9yZWdzX2ZwKGNsaWVudCwgdmlkX3JlZ3NfZnApOworCQkJd3JpdGVfcmVnX2ZwKGNsaWVudCwgMHgyMCwgdmlkc291cmNlIHwgMSk7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX1NURF9QQUw6CisJCQl3cml0ZV9yZWdzX2ZwKGNsaWVudCwgdmlkX3JlZ3NfZnApOworCQkJd3JpdGVfcmVnc19mcChjbGllbnQsIHZpZF9yZWdzX2ZwX3BhbCk7CisJCQl3cml0ZV9yZWdfZnAoY2xpZW50LCAweDIwLCB2aWRzb3VyY2UpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfUVVFUllDVFJMOgorCXsKKwkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpjdHJsID0gYXJnOworCQlzdGF0aWMgY29uc3QgdTMyIHVzZXJfY3RybHNbXSA9IHsKKwkJCVY0TDJfQ0lEX0JSSUdIVE5FU1MsCisJCQlWNEwyX0NJRF9DT05UUkFTVCwKKwkJCVY0TDJfQ0lEX1NBVFVSQVRJT04sCisJCQlWNEwyX0NJRF9IVUUsCisJCQkwCisJCX07CisJCXN0YXRpYyBjb25zdCB1MzIgKmN0cmxfY2xhc3Nlc1tdID0geworCQkJdXNlcl9jdHJscywKKwkJCU5VTEwKKwkJfTsKKworCQljdHJsLT5pZCA9IHY0bDJfY3RybF9uZXh0KGN0cmxfY2xhc3NlcywgY3RybC0+aWQpOworCQlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKKwkJCXY0bDJfY3RybF9xdWVyeV9maWxsKGN0cmwsIDAsIDEwMCwgMSwgNTApOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6CisJCQl2NGwyX2N0cmxfcXVlcnlfZmlsbChjdHJsLCAwLCAxMDAsIDEsIDUwKTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046CisJCQl2NGwyX2N0cmxfcXVlcnlfZmlsbChjdHJsLCAwLCAxMDAsIDEsIDUwKTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX0hVRToKKwkJCXY0bDJfY3RybF9xdWVyeV9maWxsKGN0cmwsIC01MCwgNTAsIDEsIDApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQljdHJsLT5uYW1lWzBdID0gJ1wwJzsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19TX0NUUkw6CisJeworCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsID0gYXJnOworCQlpbnQgdmFsdWUxOworCisJCXN3aXRjaCAoY3RybC0+aWQpIHsKKwkJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiczIyNTA6IGZ1dHVyZSBzZXR0aW5nXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiczIyNTA6IGZ1dHVyZSBzZXR0aW5nXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKKwkJCWlmIChjdHJsLT52YWx1ZSA+IDEyNykKKwkJCQlkZWMtPnNhdHVyYXRpb24gPSAxMjc7CisJCQllbHNlIGlmIChjdHJsLT52YWx1ZSA8IDApCisJCQkJZGVjLT5zYXR1cmF0aW9uID0gMDsKKwkJCWVsc2UKKwkJCQlkZWMtPnNhdHVyYXRpb24gPSBjdHJsLT52YWx1ZTsKKworCQkJdmFsdWUxID0gZGVjLT5zYXR1cmF0aW9uICogNDE0MCAvIDEwMDsKKwkJCWlmICh2YWx1ZTEgPiA0MDk0KQorCQkJCXZhbHVlMSA9IDQwOTQ7CisJCQl3cml0ZV9yZWdfZnAoY2xpZW50LCBWUFgzMjJfQUREUl9TQVQsIHZhbHVlMSk7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9IVUU6CisJCQlpZiAoY3RybC0+dmFsdWUgPiA1MCkKKwkJCQlkZWMtPmh1ZSA9IDUwOworCQkJZWxzZSBpZiAoY3RybC0+dmFsdWUgPCAtNTApCisJCQkJZGVjLT5odWUgPSAtNTA7CisJCQllbHNlCisJCQkJZGVjLT5odWUgPSBjdHJsLT52YWx1ZTsKKwkJCS8qIGNsYW1wIHRoZSBodWUgcmFuZ2UgKi8KKwkJCXZhbHVlMSA9IGRlYy0+aHVlICogMjgwIC8gNTA7CisJCQl3cml0ZV9yZWdfZnAoY2xpZW50LCBWUFgzMjJfQUREUl9IVUUsIHZhbHVlMSk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfR19DVFJMOgorCXsKKwkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCA9IGFyZzsKKworCQlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKKwkJCWN0cmwtPnZhbHVlID0gZGVjLT5icmlnaHRuZXNzOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6CisJCQljdHJsLT52YWx1ZSA9IGRlYy0+Y29udHJhc3Q7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgorCQkJY3RybC0+dmFsdWUgPSBkZWMtPnNhdHVyYXRpb247CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9IVUU6CisJCQljdHJsLT52YWx1ZSA9IGRlYy0+aHVlOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX1NfRk1UOgorCXsKKwkJc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQgPSBhcmc7CisJCWlmIChmbXQtPmZtdC5waXguaGVpZ2h0IDwgNjQwKSB7CisJCQl3cml0ZV9yZWdfZnAoY2xpZW50LCAweDEyYiwgZGVjLT5yZWcxMmJfdmFsIHwgMHg0MDApOworCQkJd3JpdGVfcmVnX2ZwKGNsaWVudCwgMHgxNDAsIDB4MDYwKTsKKwkJfSBlbHNlIHsKKwkJCXdyaXRlX3JlZ19mcChjbGllbnQsIDB4MTJiLCBkZWMtPnJlZzEyYl92YWwgJiB+MHg0MDApOworCQkJd3JpdGVfcmVnX2ZwKGNsaWVudCwgMHgxNDAsIDB4MDYwKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURJT0NfR19BVURJTzoKKwl7CisJCXN0cnVjdCB2NGwyX2F1ZGlvICphdWRpbyA9IGFyZzsKKworCQltZW1zZXQoYXVkaW8sIDAsIHNpemVvZigqYXVkaW8pKTsKKwkJYXVkaW8tPmluZGV4ID0gZGVjLT5hdWRpb19pbnB1dDsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJfQorCWNhc2UgVklESU9DX0VOVU1BVURJTzoKKwl7CisJCXN0cnVjdCB2NGwyX2F1ZGlvICphdWRpbyA9IGFyZzsKKworCQlzd2l0Y2ggKGF1ZGlvLT5pbmRleCkgeworCQljYXNlIDA6CisJCQlzdHJjcHkoYXVkaW8tPm5hbWUsICJMaW5lIEluIik7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJc3RyY3B5KGF1ZGlvLT5uYW1lLCAiTWljIik7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJc3RyY3B5KGF1ZGlvLT5uYW1lLCAiTWljIEJvb3N0Iik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWF1ZGlvLT5uYW1lWzBdID0gJ1wwJzsKKwkJCXJldHVybiAwOworCQl9CisJCWF1ZGlvLT5jYXBhYmlsaXR5ID0gVjRMMl9BVURDQVBfU1RFUkVPOworCQlhdWRpby0+bW9kZSA9IDA7CisJCXJldHVybiAwOworCX0KKwljYXNlIFZJRElPQ19TX0FVRElPOgorCXsKKwkJc3RydWN0IHY0bDJfYXVkaW8gKmF1ZGlvID0gYXJnOworCisJCWNsaWVudC0+YWRkciA9IFRMVjMyMF9BRERSRVNTOworCQlzd2l0Y2ggKGF1ZGlvLT5pbmRleCkgeworCQljYXNlIDA6CisJCQl3cml0ZV9yZWcoY2xpZW50LCAweDA4LCAweDAyKTsgLyogTGluZSBJbiAqLworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXdyaXRlX3JlZyhjbGllbnQsIDB4MDgsIDB4MDQpOyAvKiBNaWMgKi8KKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQl3cml0ZV9yZWcoY2xpZW50LCAweDA4LCAweDA1KTsgLyogTWljIEJvb3N0ICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWRlYy0+YXVkaW9faW5wdXQgPSBhdWRpby0+aW5kZXg7CisJCXJldHVybiAwOworCX0KKworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0lORk8gInMyMjUwOiB1bmtub3duIGNvbW1hbmQgMHgleFxuIiwgY21kKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgczIyNTBfZHJpdmVyOworCitzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgczIyNTBfY2xpZW50X3RlbXBsID0geworCS5uYW1lCQk9ICJTZW5zb3JheSAyMjUwIiwKKwkuZHJpdmVyCQk9ICZzMjI1MF9kcml2ZXIsCit9OworCitzdGF0aWMgaW50IHMyMjUwX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyLCBpbnQga2luZCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCBzMjI1MCAqZGVjOworCXU4ICpkYXRhOworCXN0cnVjdCBnbzcwMDcgKmdvID0gaTJjX2dldF9hZGFwZGF0YShhZGFwdGVyKTsKKwlzdHJ1Y3QgZ283MDA3X3VzYiAqdXNiID0gZ28tPmhwaV9jb250ZXh0OworCisJY2xpZW50ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2xpZW50ID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCW1lbWNweShjbGllbnQsICZzMjI1MF9jbGllbnRfdGVtcGwsCisJICAgICAgIHNpemVvZihzMjI1MF9jbGllbnRfdGVtcGwpKTsKKwljbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCisJZGVjID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHMyMjUwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRlYyA9PSBOVUxMKSB7CisJCWtmcmVlKGNsaWVudCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWRlYy0+c3RkID0gVjRMMl9TVERfTlRTQzsKKwlkZWMtPmJyaWdodG5lc3MgPSA1MDsKKwlkZWMtPmNvbnRyYXN0ID0gNTA7CisJZGVjLT5zYXR1cmF0aW9uID0gNTA7CisJZGVjLT5odWUgPSAwOworCWNsaWVudC0+YWRkciA9IFRMVjMyMF9BRERSRVNTOworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGRlYyk7CisKKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAiczIyNTA6IGluaXRpYWxpemluZyB2aWRlbyBkZWNvZGVyIG9uICVzXG4iLAorCSAgICAgICBhZGFwdGVyLT5uYW1lKTsKKworCS8qIGluaXRpYWxpemUgdGhlIGF1ZGlvICovCisJY2xpZW50LT5hZGRyID0gVExWMzIwX0FERFJFU1M7CisJaWYgKHdyaXRlX3JlZ3MoY2xpZW50LCBhdWRfcmVncykgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgInMyMjUwOiBlcnJvciBpbml0aWFsaXppbmcgYXVkaW9cbiIpOworCQlrZnJlZShjbGllbnQpOworCQlrZnJlZShkZWMpOworCQlyZXR1cm4gMDsKKwl9CisJY2xpZW50LT5hZGRyID0gUzIyNTBfVklEREVDOworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGRlYyk7CisKKwlpZiAod3JpdGVfcmVncyhjbGllbnQsIHZpZF9yZWdzKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiczIyNTA6IGVycm9yIGluaXRpYWxpemluZyBkZWNvZGVyXG4iKTsKKwkJa2ZyZWUoY2xpZW50KTsKKwkJa2ZyZWUoZGVjKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICh3cml0ZV9yZWdzX2ZwKGNsaWVudCwgdmlkX3JlZ3NfZnApIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJzMjI1MDogZXJyb3IgaW5pdGlhbGl6aW5nIGRlY29kZXJcbiIpOworCQlrZnJlZShjbGllbnQpOworCQlrZnJlZShkZWMpOworCQlyZXR1cm4gMDsKKwl9CisJLyogc2V0IGRlZmF1bHQgY2hhbm5lbCAqLworCS8qIGNvbXBvc2l0ZSAqLworCXdyaXRlX3JlZ19mcChjbGllbnQsIDB4MjAsIDB4MDIwIHwgMSk7CisJd3JpdGVfcmVnX2ZwKGNsaWVudCwgMHgyMSwgMHg2NjIpOworCXdyaXRlX3JlZ19mcChjbGllbnQsIDB4MTQwLCAweDA2MCk7CisKKwkvKiBzZXQgZGVmYXVsdCBhdWRpbyBpbnB1dCAqLworCWRlYy0+YXVkaW9faW5wdXQgPSAwOworCXdyaXRlX3JlZyhjbGllbnQsIDB4MDgsIDB4MDIpOyAvKiBMaW5lIEluICovCisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZ1c2ItPmkyY19sb2NrKSA9PSAwKSB7CisJCWRhdGEgPSBremFsbG9jKDE2LCBHRlBfS0VSTkVMKTsKKwkJaWYgKGRhdGEgIT0gTlVMTCkgeworCQkJaW50IHJjOworCQkJcmMgPSBnbzcwMDdfdXNiX3ZlbmRvcl9yZXF1ZXN0KGdvLCAweDQxLCAwLCAwLAorCQkJCQkJICAgICAgIGRhdGEsIDE2LCAxKTsKKwkJCWlmIChyYyA+IDApIHsKKwkJCQl1OCBtYXNrOworCQkJCWRhdGFbMF0gPSAwOworCQkJCW1hc2sgPSAxPDw1OworCQkJCWRhdGFbMF0gJj0gfm1hc2s7CisJCQkJZGF0YVsxXSB8PSBtYXNrOworCQkJCWdvNzAwN191c2JfdmVuZG9yX3JlcXVlc3QoZ28sIDB4NDAsIDAsCisJCQkJCQkJICAoZGF0YVsxXTw8OCkKKwkJCQkJCQkgICsgZGF0YVsxXSwKKwkJCQkJCQkgIGRhdGEsIDE2LCAwKTsKKwkJCX0KKwkJCWtmcmVlKGRhdGEpOworCQl9CisJCXVwKCZ1c2ItPmkyY19sb2NrKTsKKwl9CisKKwlpMmNfYXR0YWNoX2NsaWVudChjbGllbnQpOworCXByaW50aygiczIyNTA6IGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseVxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczIyNTBfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHMyMjUwICpkZWMgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgcjsKKworCXIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIHI7CisKKwlrZnJlZShjbGllbnQpOworCWtmcmVlKGRlYyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBzMjI1MF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAiU2Vuc29yYXkgMjI1MCBib2FyZCBkcml2ZXIiLAorCX0sCisJLmlkCQk9IEkyQ19EUklWRVJJRF9TMjI1MCwKKwkuZGV0YWNoX2NsaWVudAk9IHMyMjUwX2RldGFjaCwKKwkuY29tbWFuZAk9IHMyMjUwX2NvbW1hbmQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzMjI1MF9pbml0KHZvaWQpCit7CisJaW50IHI7CisKKwlyID0gczIyNTBsb2FkZXJfaW5pdCgpOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIHI7CisKKwlyID0gaTJjX2FkZF9kcml2ZXIoJnMyMjUwX2RyaXZlcik7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gcjsKKwlyZXR1cm4gd2lzX2kyY19hZGRfZHJpdmVyKHMyMjUwX2RyaXZlci5pZCwgczIyNTBfZGV0ZWN0KTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHMyMjUwX2NsZWFudXAodm9pZCkKK3sKKwl3aXNfaTJjX2RlbF9kcml2ZXIoczIyNTBfZGV0ZWN0KTsKKwlpMmNfZGVsX2RyaXZlcigmczIyNTBfZHJpdmVyKTsKKworCXMyMjUwbG9hZGVyX2NsZWFudXAoKTsKK30KKworbW9kdWxlX2luaXQoczIyNTBfaW5pdCk7Cittb2R1bGVfZXhpdChzMjI1MF9jbGVhbnVwKTsKKworTU9EVUxFX0FVVEhPUigiIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkJvYXJkIGRyaXZlciBmb3IgU2Vuc29yeXJheSAyMjUwIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L3MyMjUwLWxvYWRlci5jIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9zMjI1MC1sb2FkZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWU0YWNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9zMjI1MC1sb2FkZXIuYwpAQCAtMCwwICsxLDE4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBTZW5zb3JheSBDb21wYW55IEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoVmVyc2lvbiAyKSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGR2Yi11c2IuaD4KKworI2RlZmluZSBTMjI1MF9MT0FERVJfRklSTVdBUkUJInMyMjUwX2xvYWRlci5mdyIKKyNkZWZpbmUgUzIyNTBfRklSTVdBUkUJCSJzMjI1MC5mdyIKKwordHlwZWRlZiBzdHJ1Y3QgZGV2aWNlX2V4dGVuc2lvbl9zIHsKKyAgICBzdHJ1Y3Qga3JlZiAgICAga3JlZjsKKyAgICBpbnQgbWlub3I7CisgICAgc3RydWN0IHVzYl9kZXZpY2UgKnVzYmRldjsKK30gZGV2aWNlX2V4dGVuc2lvbl90LCAqcGRldmljZV9leHRlbnNpb25fdDsKKworI2RlZmluZSBVU0JfczIyNTBsb2FkZXJfTUFKT1IgMjQwCisjZGVmaW5lIFVTQl9zMjI1MGxvYWRlcl9NSU5PUl9CQVNFIDAKKyNkZWZpbmUgTUFYX0RFVklDRVMgMjU2CisKK3N0YXRpYyBwZGV2aWNlX2V4dGVuc2lvbl90IHMyMjUwX2Rldl90YWJsZVtNQVhfREVWSUNFU107CitzdGF0aWMgREVDTEFSRV9NVVRFWChzMjI1MF9kZXZfdGFibGVfbXV0ZXgpOworCisjZGVmaW5lIHRvX3MyMjUwbG9hZGVyX2Rldl9jb21tb24oZCkgY29udGFpbmVyX29mKGQsIGRldmljZV9leHRlbnNpb25fdCwga3JlZikKK3N0YXRpYyB2b2lkIHMyMjUwbG9hZGVyX2RlbGV0ZShzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlwZGV2aWNlX2V4dGVuc2lvbl90IHMgPSB0b19zMjI1MGxvYWRlcl9kZXZfY29tbW9uKGtyZWYpOworCXMyMjUwX2Rldl90YWJsZVtzLT5taW5vcl0gPSBOVUxMOworCWtmcmVlKHMpOworfQorCitzdGF0aWMgaW50IHMyMjUwbG9hZGVyX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsCisJCQkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXY7CisJaW50IG1pbm9yLCByZXQ7CisJcGRldmljZV9leHRlbnNpb25fdCBzID0gTlVMTDsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OworCisJdXNiZGV2ID0gdXNiX2dldF9kZXYoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpKTsKKwlpZiAoIXVzYmRldikgeworCQlwcmludGsoS0VSTl9FUlIgIkVudGVyIHMyMjUwbG9hZGVyX3Byb2JlIGZhaWxlZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiRW50ZXIgczIyNTBsb2FkZXJfcHJvYmUgMi42IGtlcm5lbFxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAidmVuZG9yIGlkIDB4JXgsIGRldmljZSBpZCAweCV4IGRldm51bTolZFxuIiwKKwkgICB1c2JkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IsIHVzYmRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QsCisJICAgdXNiZGV2LT5kZXZudW0pOworCisJaWYgKHVzYmRldi0+ZGVzY3JpcHRvci5iTnVtQ29uZmlndXJhdGlvbnMgIT0gMSkgeworCQlwcmludGsoS0VSTl9FUlIgImNhbid0IGhhbmRsZSBtdWx0aXBsZSBjb25maWdcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCWRvd24oJnMyMjUwX2Rldl90YWJsZV9tdXRleCk7CisKKwlmb3IgKG1pbm9yID0gMDsgbWlub3IgPCBNQVhfREVWSUNFUzsgbWlub3IrKykgeworCQlpZiAoczIyNTBfZGV2X3RhYmxlW21pbm9yXSA9PSBOVUxMKQorCQkJYnJlYWs7CisJfQorCisJaWYgKG1pbm9yIDwgMCB8fCBtaW5vciA+PSBNQVhfREVWSUNFUykgeworCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgbWlub3I6ICVkXG4iLCBtaW5vcik7CisJCWdvdG8gZmFpbGVkOworCX0KKworCS8qIEFsbG9jYXRlIGRldiBkYXRhIHN0cnVjdHVyZSAqLworCXMgPSBrbWFsbG9jKHNpemVvZihkZXZpY2VfZXh0ZW5zaW9uX3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAocyA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiT3V0IG9mIG1lbW9yeVxuIik7CisJCWdvdG8gZmFpbGVkOworCX0KKwlzMjI1MF9kZXZfdGFibGVbbWlub3JdID0gczsKKworCXByaW50ayhLRVJOX0lORk8gInMyMjUwbG9hZGVyX3Byb2JlOiBEZXZpY2UgJWQgb24gQnVzICVkIE1pbm9yICVkXG4iLAorCQl1c2JkZXYtPmRldm51bSwgdXNiZGV2LT5idXMtPmJ1c251bSwgbWlub3IpOworCisJbWVtc2V0KHMsIDAsIHNpemVvZihkZXZpY2VfZXh0ZW5zaW9uX3QpKTsKKwlzLT51c2JkZXYgPSB1c2JkZXY7CisJcHJpbnRrKEtFUk5fSU5GTyAibG9hZGluZyAyMjUwIGxvYWRlclxuIik7CisKKwlrcmVmX2luaXQoJihzLT5rcmVmKSk7CisKKwl1cCgmczIyNTBfZGV2X3RhYmxlX211dGV4KTsKKworCWlmIChyZXF1ZXN0X2Zpcm13YXJlKCZmdywgUzIyNTBfTE9BREVSX0ZJUk1XQVJFLCAmdXNiZGV2LT5kZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJInMyMjUwOiB1bmFibGUgdG8gbG9hZCBmaXJtd2FyZSBmcm9tIGZpbGUgXCIlc1wiXG4iLAorCQkJUzIyNTBfTE9BREVSX0ZJUk1XQVJFKTsKKwkJZ290byBmYWlsZWQyOworCX0KKwlyZXQgPSB1c2JfY3lwcmVzc19sb2FkX2Zpcm13YXJlKHVzYmRldiwgZncsIENZUFJFU1NfRlgyKTsKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwlpZiAoMCAhPSByZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJsb2FkZXIgZG93bmxvYWQgZmFpbGVkXG4iKTsKKwkJZ290byBmYWlsZWQyOworCX0KKworCWlmIChyZXF1ZXN0X2Zpcm13YXJlKCZmdywgUzIyNTBfRklSTVdBUkUsICZ1c2JkZXYtPmRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiczIyNTA6IHVuYWJsZSB0byBsb2FkIGZpcm13YXJlIGZyb20gZmlsZSBcIiVzXCJcbiIsCisJCQlTMjI1MF9GSVJNV0FSRSk7CisJCWdvdG8gZmFpbGVkMjsKKwl9CisJcmV0ID0gdXNiX2N5cHJlc3NfbG9hZF9maXJtd2FyZSh1c2JkZXYsIGZ3LCBDWVBSRVNTX0ZYMik7CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CisJaWYgKDAgIT0gcmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiZmlybXdhcmVfczIyNTAgZG93bmxvYWQgZmFpbGVkXG4iKTsKKwkJZ290byBmYWlsZWQyOworCX0KKworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBzKTsKKwlyZXR1cm4gMDsKKworZmFpbGVkOgorCXVwKCZzMjI1MF9kZXZfdGFibGVfbXV0ZXgpOworZmFpbGVkMjoKKwlpZiAocykKKwkJa3JlZl9wdXQoJihzLT5rcmVmKSwgczIyNTBsb2FkZXJfZGVsZXRlKTsKKworCXByaW50ayhLRVJOX0VSUiAicHJvYmUgZmFpbGVkXG4iKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIHMyMjUwbG9hZGVyX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKK3sKKwlwZGV2aWNlX2V4dGVuc2lvbl90IHMgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiczIyNTA6IGRpc2Nvbm5lY3RcbiIpOworCWxvY2tfa2VybmVsKCk7CisJcyA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKKwl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgTlVMTCk7CisJa3JlZl9wdXQoJihzLT5rcmVmKSwgczIyNTBsb2FkZXJfZGVsZXRlKTsKKwl1bmxvY2tfa2VybmVsKCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBzMjI1MGxvYWRlcl9pZHNbXSA9IHsKKwl7VVNCX0RFVklDRSgweDE5NDMsIDB4YTI1MCl9LAorCXt9ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHMyMjUwbG9hZGVyX2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBzMjI1MGxvYWRlcl9kcml2ZXIgPSB7CisJLm5hbWUJCT0gInMyMjUwLWxvYWRlciIsCisJLnByb2JlCQk9IHMyMjUwbG9hZGVyX3Byb2JlLAorCS5kaXNjb25uZWN0CT0gczIyNTBsb2FkZXJfZGlzY29ubmVjdCwKKwkuaWRfdGFibGUJPSBzMjI1MGxvYWRlcl9pZHMsCit9OworCitpbnQgczIyNTBsb2FkZXJfaW5pdCh2b2lkKQoreworCWludCByOworCXVuc2lnbmVkIGkgPSAwOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9ERVZJQ0VTOyBpKyspCisJCXMyMjUwX2Rldl90YWJsZVtpXSA9IE5VTEw7CisKKwlyID0gdXNiX3JlZ2lzdGVyKCZzMjI1MGxvYWRlcl9kcml2ZXIpOworCWlmIChyKSB7CisJCXByaW50ayhLRVJOX0VSUiAidXNiX3JlZ2lzdGVyIGZhaWxlZC4gRXJyb3IgbnVtYmVyICVkXG4iLCByKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXByaW50ayhLRVJOX0lORk8gInMyMjUwbG9hZGVyX2luaXQ6IGRyaXZlciByZWdpc3RlcmVkXG4iKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woczIyNTBsb2FkZXJfaW5pdCk7CisKK3ZvaWQgczIyNTBsb2FkZXJfY2xlYW51cCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gInMyMjUwbG9hZGVyX2NsZWFudXBcbiIpOworCXVzYl9kZXJlZ2lzdGVyKCZzMjI1MGxvYWRlcl9kcml2ZXIpOworfQorRVhQT1JUX1NZTUJPTChzMjI1MGxvYWRlcl9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvc2FhNzEzNC1nbzcwMDcuYyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvc2FhNzEzNC1nbzcwMDcuYwppbmRleCBjNGE2ZDhlLi42NjViYmY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L3NhYTcxMzQtZ283MDA3LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9zYWE3MTM0LWdvNzAwNy5jCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvY2hpcC5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAKICNpbmNsdWRlICJzYWE3MTM0LXJlZy5oIgogI2luY2x1ZGUgInNhYTcxMzQuaCIKQEAgLTMxNCw3ICszMTQsMTMgQEAKIHN0YXRpYyBpbnQgc2FhNzEzNF9nbzcwMDdfc3RyZWFtX3N0b3Aoc3RydWN0IGdvNzAwNyAqZ28pCiB7CiAJc3RydWN0IHNhYTcxMzRfZ283MDA3ICpzYWEgPSBnby0+aHBpX2NvbnRleHQ7Ci0Jc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBzYWEtPmRldjsKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldjsKKworCWlmICghc2FhKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlkZXYgPSBzYWEtPmRldjsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBTaHV0IGRvd24gVFMgRklGTyAqLwogCXNhYV9jbGVhcmwoU0FBNzEzNF9NQUlOX0NUUkwsIFNBQTcxMzRfTUFJTl9DVFJMX1RFNSk7CkBAIC0zNzMsNiArMzc5LDQ3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgc2FhNzEzNF9nbzcwMDdfc2VuZF9jb21tYW5kKHN0cnVjdCBnbzcwMDcgKmdvLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCQl2b2lkICphcmcpCit7CisJc3RydWN0IHNhYTcxMzRfZ283MDA3ICpzYWEgPSBnby0+aHBpX2NvbnRleHQ7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBzYWEtPmRldjsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBWSURJT0NfU19TVEQ6CisJeworCQl2NGwyX3N0ZF9pZCAqc3RkID0gYXJnOworCQlyZXR1cm4gc2FhNzEzNF9zX3N0ZF9pbnRlcm5hbChkZXYsIE5VTEwsIHN0ZCk7CisJfQorCWNhc2UgVklESU9DX0dfU1REOgorCXsKKwkJdjRsMl9zdGRfaWQgKnN0ZCA9IGFyZzsKKwkJKnN0ZCA9IGRldi0+dHZub3JtLT5pZDsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DX1FVRVJZQ1RSTDoKKwl7CisJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqY3RybCA9IGFyZzsKKwkJaWYgKFY0TDJfQ1RSTF9JRDJDTEFTUyhjdHJsLT5pZCkgPT0gVjRMMl9DVFJMX0NMQVNTX1VTRVIpCisJCQlyZXR1cm4gc2FhNzEzNF9xdWVyeWN0cmwoTlVMTCwgTlVMTCwgY3RybCk7CisJfQorCWNhc2UgVklESU9DX0dfQ1RSTDoKKwl7CisJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwgPSBhcmc7CisJCWlmIChWNEwyX0NUUkxfSUQyQ0xBU1MoY3RybC0+aWQpID09IFY0TDJfQ1RSTF9DTEFTU19VU0VSKQorCQkJcmV0dXJuIHNhYTcxMzRfZ19jdHJsX2ludGVybmFsKGRldiwgTlVMTCwgY3RybCk7CisJfQorCWNhc2UgVklESU9DX1NfQ1RSTDoKKwl7CisJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwgPSBhcmc7CisJCWlmIChWNEwyX0NUUkxfSUQyQ0xBU1MoY3RybC0+aWQpID09IFY0TDJfQ1RSTF9DTEFTU19VU0VSKQorCQkJcmV0dXJuIHNhYTcxMzRfc19jdHJsX2ludGVybmFsKGRldiwgTlVMTCwgY3RybCk7CisJfQorCX0KKwlyZXR1cm4gLUVJTlZBTDsKKworfQorCiBzdGF0aWMgc3RydWN0IGdvNzAwN19ocGlfb3BzIHNhYTcxMzRfZ283MDA3X2hwaV9vcHMgPSB7CiAJLmludGVyZmFjZV9yZXNldAk9IHNhYTcxMzRfZ283MDA3X2ludGVyZmFjZV9yZXNldCwKIAkud3JpdGVfaW50ZXJydXB0CT0gc2FhNzEzNF9nbzcwMDdfd3JpdGVfaW50ZXJydXB0LApAQCAtMzgwLDYgKzQyNyw3IEBACiAJLnN0cmVhbV9zdGFydAkJPSBzYWE3MTM0X2dvNzAwN19zdHJlYW1fc3RhcnQsCiAJLnN0cmVhbV9zdG9wCQk9IHNhYTcxMzRfZ283MDA3X3N0cmVhbV9zdG9wLAogCS5zZW5kX2Zpcm13YXJlCQk9IHNhYTcxMzRfZ283MDA3X3NlbmRfZmlybXdhcmUsCisJLnNlbmRfY29tbWFuZAkJPSBzYWE3MTM0X2dvNzAwN19zZW5kX2NvbW1hbmQsCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqIEFkZC9yZW1vdmUgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvd2lzLWkyYy5oIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy93aXMtaTJjLmgKaW5kZXggOTkzZjY1OC4uNDMxZjQxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy93aXMtaTJjLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy93aXMtaTJjLmgKQEAgLTIzLDYgKzIzLDcgQEAKICNkZWZpbmUJSTJDX0RSSVZFUklEX1dJU19TQUE3MTEzCTB4ZjBmNAogI2RlZmluZQlJMkNfRFJJVkVSSURfV0lTX09WNzY0MAkJMHhmMGY1CiAjZGVmaW5lCUkyQ19EUklWRVJJRF9XSVNfVFcyODA0CQkweGYwZjYKKyNkZWZpbmUJSTJDX0RSSVZFUklEX1MyMjUwCQkweGYwZjcKICNkZWZpbmUJSTJDX0FMR09fR083MDA3CQkJMHhmMDAwMDAKICNkZWZpbmUJSTJDX0FMR09fR083MDA3X1VTQgkJMHhmMTAwMDAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy93aXMtc29ueS10dW5lci5jIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy93aXMtc29ueS10dW5lci5jCmluZGV4IDVhOTFlZTQuLjU4ZmRkYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvd2lzLXNvbnktdHVuZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L3dpcy1zb255LXR1bmVyLmMKQEAgLTYwNCw3ICs2MDQsNyBAQAogCXsKIAkJc3RydWN0IHY0bDJfdHVuZXIgKnR1biA9IGFyZzsKIAotCQltZW1zZXQodCwgMCwgc2l6ZW9mKCp0dW4pKTsKKwkJbWVtc2V0KHR1biwgMCwgc2l6ZW9mKCp0dW4pKTsKIAkJc3RyY3B5KHR1bi0+bmFtZSwgIlRlbGV2aXNpb24iKTsKIAkJdHVuLT50eXBlID0gVjRMMl9UVU5FUl9BTkFMT0dfVFY7CiAJCXR1bi0+cmFuZ2Vsb3cgPSAwVUw7IC8qIGRvZXMgYW55dGhpbmcgdXNlIHRoZXNlPyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lNDAwMC9tZTQwMDAuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZTQwMDAvbWU0MDAwLmMKaW5kZXggMDM5NGUyNy4uZTFjNGE4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lNDAwMC9tZTQwMDAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWU0MDAwL21lNDAwMC5jCkBAIC01MzYsMjUgKzUzNiwxOSBAQAogCiBzdGF0aWMgdm9pZCBjbGVhcl9ib2FyZF9pbmZvX2xpc3Qodm9pZCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpib2FyZF9wOwotCXN0cnVjdCBsaXN0X2hlYWQgKmRhY19wOwotCXN0cnVjdCBtZTQwMDBfaW5mbyAqYm9hcmRfaW5mbzsKLQlzdHJ1Y3QgbWU0MDAwX2FvX2NvbnRleHQgKmFvX2NvbnRleHQ7CisJc3RydWN0IG1lNDAwMF9pbmZvICpib2FyZF9pbmZvLCAqYm9hcmRfaW5mb19zYWZlOworCXN0cnVjdCBtZTQwMDBfYW9fY29udGV4dCAqYW9fY29udGV4dCwgKmFvX2NvbnRleHRfc2FmZTsKIAogCS8qIENsZWFyIGNvbnRleHQgbGlzdHMgKi8KLQlmb3IgKGJvYXJkX3AgPSBtZTQwMDBfYm9hcmRfaW5mb19saXN0Lm5leHQ7Ci0JICAgICBib2FyZF9wICE9ICZtZTQwMDBfYm9hcmRfaW5mb19saXN0OyBib2FyZF9wID0gYm9hcmRfcC0+bmV4dCkgewotCQlib2FyZF9pbmZvID0gbGlzdF9lbnRyeShib2FyZF9wLCBzdHJ1Y3QgbWU0MDAwX2luZm8sIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoYm9hcmRfaW5mbywgJm1lNDAwMF9ib2FyZF9pbmZvX2xpc3QsIGxpc3QpIHsKIAkJLyogQ2xlYXIgYW5hbG9nIG91dHB1dCBjb250ZXh0IGxpc3QgKi8KLQkJd2hpbGUgKCFsaXN0X2VtcHR5KCZib2FyZF9pbmZvLT5hb19jb250ZXh0X2xpc3QpKSB7Ci0JCQlkYWNfcCA9IGJvYXJkX2luZm8tPmFvX2NvbnRleHRfbGlzdC5uZXh0OwotCQkJYW9fY29udGV4dCA9Ci0JCQkgICAgbGlzdF9lbnRyeShkYWNfcCwgc3RydWN0IG1lNDAwMF9hb19jb250ZXh0LCBsaXN0KTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGFvX2NvbnRleHQsIGFvX2NvbnRleHRfc2FmZSwKKwkJCQkmYm9hcmRfaW5mby0+YW9fY29udGV4dF9saXN0LCBsaXN0KSB7CiAJCQltZTQwMDBfYW9fcmVzZXQoYW9fY29udGV4dCk7CiAJCQlmcmVlX2lycShhb19jb250ZXh0LT5pcnEsIGFvX2NvbnRleHQpOwogCQkJaWYgKGFvX2NvbnRleHQtPmNpcmNfYnVmLmJ1ZikKIAkJCQlrZnJlZShhb19jb250ZXh0LT5jaXJjX2J1Zi5idWYpOwotCQkJbGlzdF9kZWwoZGFjX3ApOworCQkJbGlzdF9kZWwoJmFvX2NvbnRleHQtPmxpc3QpOwogCQkJa2ZyZWUoYW9fY29udGV4dCk7CiAJCX0KIApAQCAtNTc0LDExICs1NjgsMTAgQEAKIAl9CiAKIAkvKiBDbGVhciB0aGUgYm9hcmQgaW5mbyBsaXN0ICovCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZtZTQwMDBfYm9hcmRfaW5mb19saXN0KSkgewotCQlib2FyZF9wID0gbWU0MDAwX2JvYXJkX2luZm9fbGlzdC5uZXh0OwotCQlib2FyZF9pbmZvID0gbGlzdF9lbnRyeShib2FyZF9wLCBzdHJ1Y3QgbWU0MDAwX2luZm8sIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShib2FyZF9pbmZvLCBib2FyZF9pbmZvX3NhZmUsCisJCQkmbWU0MDAwX2JvYXJkX2luZm9fbGlzdCwgbGlzdCkgewogCQlwY2lfcmVsZWFzZV9yZWdpb25zKGJvYXJkX2luZm8tPnBjaV9kZXZfcCk7Ci0JCWxpc3RfZGVsKGJvYXJkX3ApOworCQlsaXN0X2RlbCgmYm9hcmRfaW5mby0+bGlzdCk7CiAJCWtmcmVlKGJvYXJkX2luZm8pOwogCX0KIH0KQEAgLTY2MywxNiArNjU2LDE3IEBACiAJfQogCiAJLyogR2V0IHRoZSBpbmRleCBvZiB0aGUgYm9hcmQgaW4gdGhlIGdsb2JhbCBsaXN0ICovCi0JZm9yIChib2FyZF9wID0gbWU0MDAwX2JvYXJkX2luZm9fbGlzdC5uZXh0LCBpID0gMDsKLQkgICAgIGJvYXJkX3AgIT0gJm1lNDAwMF9ib2FyZF9pbmZvX2xpc3Q7IGJvYXJkX3AgPSBib2FyZF9wLT5uZXh0LCBpKyspIHsKKwlpID0gMDsKKwlsaXN0X2Zvcl9lYWNoKGJvYXJkX3AsICZtZTQwMDBfYm9hcmRfaW5mb19saXN0KSB7CiAJCWlmIChib2FyZF9wID09ICZib2FyZF9pbmZvLT5saXN0KSB7CiAJCQlib2FyZF9pbmZvLT5ib2FyZF9jb3VudCA9IGk7CiAJCQlicmVhazsKIAkJfQorCQlpKys7CiAJfQogCWlmIChib2FyZF9wID09ICZtZTQwMDBfYm9hcmRfaW5mb19saXN0KSB7CiAJCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgIk1FNDAwMDppbml0X2JvYXJkX2luZm8oKTpDYW5ub3QgZ2V0IGluZGV4IG9mIGJhb3JkXG4iKTsKKwkJICAgICAgICJNRTQwMDA6aW5pdF9ib2FyZF9pbmZvKCk6Q2Fubm90IGdldCBpbmRleCBvZiBib2FyZFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtODYzLDE2ICs4NTcsMTQgQEAKIAogc3RhdGljIHZvaWQgcmVsZWFzZV9hb19jb250ZXh0cyhzdHJ1Y3QgbWU0MDAwX2luZm8gKmJvYXJkX2luZm8pCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZGFjX3A7Ci0Jc3RydWN0IG1lNDAwMF9hb19jb250ZXh0ICphb19jb250ZXh0OworCXN0cnVjdCBtZTQwMDBfYW9fY29udGV4dCAqYW9fY29udGV4dCwgKmFvX2NvbnRleHRfc2FmZTsKIAogCS8qIENsZWFyIGFuYWxvZyBvdXRwdXQgY29udGV4dCBsaXN0ICovCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZib2FyZF9pbmZvLT5hb19jb250ZXh0X2xpc3QpKSB7Ci0JCWRhY19wID0gYm9hcmRfaW5mby0+YW9fY29udGV4dF9saXN0Lm5leHQ7Ci0JCWFvX2NvbnRleHQgPSBsaXN0X2VudHJ5KGRhY19wLCBzdHJ1Y3QgbWU0MDAwX2FvX2NvbnRleHQsIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShhb19jb250ZXh0LCBhb19jb250ZXh0X3NhZmUsCisJCQkmYm9hcmRfaW5mby0+YW9fY29udGV4dF9saXN0LCBsaXN0KSB7CiAJCWZyZWVfaXJxKGFvX2NvbnRleHQtPmlycSwgYW9fY29udGV4dCk7CiAJCWtmcmVlKGFvX2NvbnRleHQtPmNpcmNfYnVmLmJ1Zik7Ci0JCWxpc3RfZGVsKGRhY19wKTsKKwkJbGlzdF9kZWwoJmFvX2NvbnRleHQtPmxpc3QpOwogCQlrZnJlZShhb19jb250ZXh0KTsKIAl9CiB9CkBAIC0xMTgwLDcgKzExNzIsNyBAQAogCiAJLyogV2FpdCB1bnRpbCAvSU5JVCBwaW4gaXMgc2V0ICovCiAJdWRlbGF5KDIwKTsKLQlpZiAoIWlubChpbmZvLT5wbHhfcmVnYmFzZSArIFBMWF9JTlRDU1IpICYgMHgyMCkgeworCWlmICghKGlubChpbmZvLT5wbHhfcmVnYmFzZSArIFBMWF9JTlRDU1IpICYgMHgyMCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczpDYW4ndCBpbml0IFhpbGlueFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0xMzAzLDEyICsxMjk1LDEzIEBACiAJCSAgICAgICBkZXYsIG1vZGUpOwogCiAJCS8qIFNlYXJjaCBmb3IgdGhlIGJvYXJkIGNvbnRleHQgKi8KLQkJZm9yIChwdHIgPSBtZTQwMDBfYm9hcmRfaW5mb19saXN0Lm5leHQsIGkgPSAwOwotCQkgICAgIHB0ciAhPSAmbWU0MDAwX2JvYXJkX2luZm9fbGlzdDsgcHRyID0gcHRyLT5uZXh0LCBpKyspIHsKLQkJCWJvYXJkX2luZm8gPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IG1lNDAwMF9pbmZvLCBsaXN0KTsKKwkJaSA9IDA7CisJCWxpc3RfZm9yX2VhY2gocHRyLCAmbWU0MDAwX2JvYXJkX2luZm9fbGlzdCkgewogCQkJaWYgKGkgPT0gYm9hcmQpCiAJCQkJYnJlYWs7CisJCQlpKys7CiAJCX0KKwkJYm9hcmRfaW5mbyA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgbWU0MDAwX2luZm8sIGxpc3QpOwogCiAJCWlmIChwdHIgPT0gJm1lNDAwMF9ib2FyZF9pbmZvX2xpc3QpIHsKIAkJCXByaW50ayhLRVJOX0VSUgpAQCAtMTMxOCwxNCArMTMxMSwxMyBAQAogCQl9CiAKIAkJLyogU2VhcmNoIGZvciB0aGUgZGFjIGNvbnRleHQgKi8KLQkJZm9yIChwdHIgPSBib2FyZF9pbmZvLT5hb19jb250ZXh0X2xpc3QubmV4dCwgaSA9IDA7Ci0JCSAgICAgcHRyICE9ICZib2FyZF9pbmZvLT5hb19jb250ZXh0X2xpc3Q7Ci0JCSAgICAgcHRyID0gcHRyLT5uZXh0LCBpKyspIHsKLQkJCWFvX2NvbnRleHQgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IG1lNDAwMF9hb19jb250ZXh0LAotCQkJCQkJCQkJbGlzdCk7CisJCWkgPSAwOworCQlsaXN0X2Zvcl9lYWNoKHB0ciwgJmJvYXJkX2luZm8tPmFvX2NvbnRleHRfbGlzdCkgewogCQkJaWYgKGkgPT0gZGV2KQogCQkJCWJyZWFrOworCQkJaSsrOwogCQl9CisJCWFvX2NvbnRleHQgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IG1lNDAwMF9hb19jb250ZXh0LCBsaXN0KTsKIAogCQlpZiAocHRyID09ICZib2FyZF9pbmZvLT5hb19jb250ZXh0X2xpc3QpIHsKIAkJCXByaW50ayhLRVJOX0VSUgpAQCAtMTM4NCwxMiArMTM3NiwxMyBAQAogCQlQREVCVUcoIm1lNDAwMF9vcGVuKCk6YWkgYm9hcmQgPSAlZCBtb2RlID0gJWRcbiIsIGJvYXJkLCBtb2RlKTsKIAogCQkvKiBTZWFyY2ggZm9yIHRoZSBib2FyZCBjb250ZXh0ICovCi0JCWZvciAocHRyID0gbWU0MDAwX2JvYXJkX2luZm9fbGlzdC5uZXh0LCBpID0gMDsKLQkJICAgICBwdHIgIT0gJm1lNDAwMF9ib2FyZF9pbmZvX2xpc3Q7IHB0ciA9IHB0ci0+bmV4dCwgaSsrKSB7Ci0JCQlib2FyZF9pbmZvID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBtZTQwMDBfaW5mbywgbGlzdCk7CisJCWkgPSAwOworCQlsaXN0X2Zvcl9lYWNoKHB0ciwgJm1lNDAwMF9ib2FyZF9pbmZvX2xpc3QpIHsKIAkJCWlmIChpID09IGJvYXJkKQogCQkJCWJyZWFrOworCQkJaSsrOwogCQl9CisJCWJvYXJkX2luZm8gPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IG1lNDAwMF9pbmZvLCBsaXN0KTsKIAogCQlpZiAocHRyID09ICZtZTQwMDBfYm9hcmRfaW5mb19saXN0KSB7CiAJCQlwcmludGsoS0VSTl9FUlIKQEAgLTE0MzgsMTQgKzE0MzEsMTIgQEAKIAkJUERFQlVHKCJtZTQwMDBfb3BlbigpOmJvYXJkID0gJWRcbiIsIGJvYXJkKTsKIAogCQkvKiBTZWFyY2ggZm9yIHRoZSBib2FyZCBjb250ZXh0ICovCi0JCWZvciAocHRyID0gbWU0MDAwX2JvYXJkX2luZm9fbGlzdC5uZXh0OwotCQkgICAgIHB0ciAhPSAmbWU0MDAwX2JvYXJkX2luZm9fbGlzdDsgcHRyID0gcHRyLT5uZXh0KSB7Ci0JCQlib2FyZF9pbmZvID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBtZTQwMDBfaW5mbywgbGlzdCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoYm9hcmRfaW5mbywgJm1lNDAwMF9ib2FyZF9pbmZvX2xpc3QsIGxpc3QpIHsKIAkJCWlmIChib2FyZF9pbmZvLT5ib2FyZF9jb3VudCA9PSBib2FyZCkKIAkJCQlicmVhazsKIAkJfQogCi0JCWlmIChwdHIgPT0gJm1lNDAwMF9ib2FyZF9pbmZvX2xpc3QpIHsKKwkJaWYgKCZib2FyZF9pbmZvLT5saXN0ID09ICZtZTQwMDBfYm9hcmRfaW5mb19saXN0KSB7CiAJCQlwcmludGsoS0VSTl9FUlIKIAkJCSAgICAgICAiTUU0MDAwOm1lNDAwMF9vcGVuKCk6Qm9hcmQgJWQgbm90IGluIGRldmljZSBsaXN0XG4iLAogCQkJICAgICAgIGJvYXJkKTsKQEAgLTE0ODMsMTQgKzE0NzQsMTIgQEAKIAkJUERFQlVHKCJtZTQwMDBfb3BlbigpOmJvYXJkID0gJWRcbiIsIGJvYXJkKTsKIAogCQkvKiBTZWFyY2ggZm9yIHRoZSBib2FyZCBjb250ZXh0ICovCi0JCWZvciAocHRyID0gbWU0MDAwX2JvYXJkX2luZm9fbGlzdC5uZXh0OwotCQkgICAgIHB0ciAhPSAmbWU0MDAwX2JvYXJkX2luZm9fbGlzdDsgcHRyID0gcHRyLT5uZXh0KSB7Ci0JCQlib2FyZF9pbmZvID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBtZTQwMDBfaW5mbywgbGlzdCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoYm9hcmRfaW5mbywgJm1lNDAwMF9ib2FyZF9pbmZvX2xpc3QsIGxpc3QpIHsKIAkJCWlmIChib2FyZF9pbmZvLT5ib2FyZF9jb3VudCA9PSBib2FyZCkKIAkJCQlicmVhazsKIAkJfQogCi0JCWlmIChwdHIgPT0gJm1lNDAwMF9ib2FyZF9pbmZvX2xpc3QpIHsKKwkJaWYgKCZib2FyZF9pbmZvLT5saXN0ID09ICZtZTQwMDBfYm9hcmRfaW5mb19saXN0KSB7CiAJCQlwcmludGsoS0VSTl9FUlIKIAkJCSAgICAgICAiTUU0MDAwOm1lNDAwMF9vcGVuKCk6Qm9hcmQgJWQgbm90IGluIGRldmljZSBsaXN0XG4iLAogCQkJICAgICAgIGJvYXJkKTsKQEAgLTE1MjYsMTQgKzE1MTUsMTIgQEAKIAkJUERFQlVHKCJtZTQwMDBfb3BlbigpOmJvYXJkID0gJWRcbiIsIGJvYXJkKTsKIAogCQkvKiBTZWFyY2ggZm9yIHRoZSBib2FyZCBjb250ZXh0ICovCi0JCWZvciAocHRyID0gbWU0MDAwX2JvYXJkX2luZm9fbGlzdC5uZXh0OwotCQkgICAgIHB0ciAhPSAmbWU0MDAwX2JvYXJkX2luZm9fbGlzdDsgcHRyID0gcHRyLT5uZXh0KSB7Ci0JCQlib2FyZF9pbmZvID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBtZTQwMDBfaW5mbywgbGlzdCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoYm9hcmRfaW5mbywgJm1lNDAwMF9ib2FyZF9pbmZvX2xpc3QsIGxpc3QpIHsKIAkJCWlmIChib2FyZF9pbmZvLT5ib2FyZF9jb3VudCA9PSBib2FyZCkKIAkJCQlicmVhazsKIAkJfQogCi0JCWlmIChwdHIgPT0gJm1lNDAwMF9ib2FyZF9pbmZvX2xpc3QpIHsKKwkJaWYgKCZib2FyZF9pbmZvLT5saXN0ID09ICZtZTQwMDBfYm9hcmRfaW5mb19saXN0KSB7CiAJCQlwcmludGsoS0VSTl9FUlIKIAkJCSAgICAgICAiTUU0MDAwOm1lNDAwMF9vcGVuKCk6Qm9hcmQgJWQgbm90IGluIGRldmljZSBsaXN0XG4iLAogCQkJICAgICAgIGJvYXJkKTsKQEAgLTU5NTUsNyArNTk0Miw2IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBtZTQwMDBfbW9kdWxlX2V4aXQodm9pZCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpib2FyZF9wOwogCXN0cnVjdCBtZTQwMDBfaW5mbyAqYm9hcmRfaW5mbzsKIAogCUNBTExfUERFQlVHKCJjbGVhbnVwX21vZHVsZSgpIGlzIGV4ZWN1dGVkXG4iKTsKQEAgLTU5NzUsOSArNTk2MSw3IEBACiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZtZTQwMDBfZHJpdmVyKTsKIAogCS8qIFJlc2V0IHRoZSBib2FyZHMgKi8KLQlmb3IgKGJvYXJkX3AgPSBtZTQwMDBfYm9hcmRfaW5mb19saXN0Lm5leHQ7Ci0JICAgICBib2FyZF9wICE9ICZtZTQwMDBfYm9hcmRfaW5mb19saXN0OyBib2FyZF9wID0gYm9hcmRfcC0+bmV4dCkgewotCQlib2FyZF9pbmZvID0gbGlzdF9lbnRyeShib2FyZF9wLCBzdHJ1Y3QgbWU0MDAwX2luZm8sIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoYm9hcmRfaW5mbywgJm1lNDAwMF9ib2FyZF9pbmZvX2xpc3QsIGxpc3QpIHsKIAkJbWU0MDAwX3Jlc2V0X2JvYXJkKGJvYXJkX2luZm8pOwogCX0KIApAQCAtNTk5Miw3ICs1OTc2LDYgQEAKIAlpbnQgbGVuID0gMDsKIAlpbnQgbGltaXQgPSBjb3VudCAtIDEwMDA7CiAJc3RydWN0IG1lNDAwMF9pbmZvICpib2FyZF9pbmZvOwotCXN0cnVjdCBsaXN0X2hlYWQgKnB0cjsKIAogCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIlxuTUU0MDAwIERSSVZFUiBWRVJTSU9OICVYLiVYLiVYXG5cbiIsCiAJCSAgICAgICAoTUU0MDAwX0RSSVZFUl9WRVJTSU9OICYgMHhGRjAwMDApID4+IDE2LApAQCAtNjAwMCwxMSArNTk4Myw3IEBACiAJCSAgICAgICAoTUU0MDAwX0RSSVZFUl9WRVJTSU9OICYgMHhGRikpOwogCiAJLyogU2VhcmNoIGZvciB0aGUgYm9hcmQgY29udGV4dCAqLwotCWZvciAocHRyID0gbWU0MDAwX2JvYXJkX2luZm9fbGlzdC5uZXh0OwotCSAgICAgKHB0ciAhPSAmbWU0MDAwX2JvYXJkX2luZm9fbGlzdCkgJiYgKGxlbiA8IGxpbWl0KTsKLQkgICAgIHB0ciA9IHB0ci0+bmV4dCkgewotCQlib2FyZF9pbmZvID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBtZTQwMDBfaW5mbywgbGlzdCk7Ci0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJvYXJkX2luZm8sICZtZTQwMDBfYm9hcmRfaW5mb19saXN0LCBsaXN0KSB7CiAJCWxlbiArPQogCQkgICAgc3ByaW50ZihidWYgKyBsZW4sICJCb2FyZCBudW1iZXIgJWQ6XG4iLAogCQkJICAgIGJvYXJkX2luZm8tPmJvYXJkX2NvdW50KTsKQEAgLTYxMTAsNiArNjA4OSw4IEBACiAJCSAgICBzcHJpbnRmKGJ1ZiArIGxlbiwgIkFPIDMgc3RhdHVzIHJlZ2lzdGVyID0gMHglMDhYXG4iLAogCQkJICAgIGlubChib2FyZF9pbmZvLT5tZTQwMDBfcmVnYmFzZSArCiAJCQkJTUU0MDAwX0FPXzAzX1NUQVRVU19SRUcpKTsKKwkJaWYgKGxlbiA+PSBsaW1pdCkKKwkJCWJyZWFrOwogCX0KIAogCSplb2YgPSAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGVmODNmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL0tjb25maWcKQEAgLTAsMCArMSwxMjcgQEAKKyMKKyMgTWVpbGhhdXMgY29uZmlndXJhdGlvbgorIworCittZW51Y29uZmlnIE1FSUxIQVVTCisJdHJpc3RhdGUgIk1laWxoYXVzIHN1cHBvcnQiCisJLS0taGVscC0tLQorCSAgSWYgeW91IGhhdmUgYSBNZWlsaGF1cyBjYXJkLCBzYXkgWSAob3IgTSkgaGVyZS4KKworCSAgWW91IG5lZWQgYm90aCB0aGlzIGRyaXZlciwgYW5kIHRoZSBkcml2ZXIgZm9yIHRoZSBwYXJ0aWN1bGFyCisJICBkYXRhIGNvbGxlY3Rpb24gY2FyZC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gVGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgbWVtYWluLgorCitpZiBNRUlMSEFVUworCitjb25maWcgTUUwNjAwCisJdHJpc3RhdGUgIk1laWxoYXVzIE1FLTYwMCBzdXBwb3J0IgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gUENJCisJaGVscAorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIE1laWxoYXVzIE1FLTYwMCBmYW1pbHkgb2YgYm9hcmRzCisJICB0aGF0IGRvIGRhdGEgY29sbGVjdGlvbiBhbmQgbXVsdGlwdXJwb3NlIEkvTy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbWUwNjAwLgorCitjb25maWcgTUUwOTAwCisJdHJpc3RhdGUgIk1laWxoYXVzIE1FLTkwMCBzdXBwb3J0IgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gUENJCisJaGVscAorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIE1laWxoYXVzIE1FLTkwMCBmYW1pbHkgb2YgYm9hcmRzCisJICB0aGF0IGRvIGRhdGEgY29sbGVjdGlvbiBhbmQgbXVsdGlwdXJwb3NlIEkvTy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbWUwOTAwLgorCitjb25maWcgTUUxMDAwCisJdHJpc3RhdGUgIk1laWxoYXVzIE1FLTEwMDAgc3VwcG9ydCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFBDSQorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBNZWlsaGF1cyBNRS0xMDAwIGZhbWlseSBvZiBib2FyZHMKKwkgIHRoYXQgZG8gZGF0YSBjb2xsZWN0aW9uIGFuZCBtdWx0aXB1cnBvc2UgSS9PLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBtZTEwMDAuCisKK2NvbmZpZyBNRTE0MDAKKwl0cmlzdGF0ZSAiTWVpbGhhdXMgTUUtMTQwMCBzdXBwb3J0IgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gUENJCisJaGVscAorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIE1laWxoYXVzIE1FLTE0MDAgZmFtaWx5IG9mIGJvYXJkcworCSAgdGhhdCBkbyBkYXRhIGNvbGxlY3Rpb24gYW5kIG11bHRpcHVycG9zZSBJL08uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG1lMTQwMC4KKworY29uZmlnIE1FMTYwMAorCXRyaXN0YXRlICJNZWlsaGF1cyBNRS0xNjAwIHN1cHBvcnQiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBQQ0kKKwloZWxwCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgTWVpbGhhdXMgTUUtMTYwMCBmYW1pbHkgb2YgYm9hcmRzCisJICB0aGF0IGRvIGRhdGEgY29sbGVjdGlvbiBhbmQgbXVsdGlwdXJwb3NlIEkvTy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbWUxNjAwLgorCitjb25maWcgTUU0NjAwCisJdHJpc3RhdGUgIk1laWxoYXVzIE1FLTQ2MDAgc3VwcG9ydCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFBDSQorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBNZWlsaGF1cyBNRS00NjAwIGZhbWlseSBvZiBib2FyZHMKKwkgIHRoYXQgZG8gZGF0YSBjb2xsZWN0aW9uIGFuZCBtdWx0aXB1cnBvc2UgSS9PLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBtZTQ2MDAuCisKK2NvbmZpZyBNRTYwMDAKKwl0cmlzdGF0ZSAiTWVpbGhhdXMgTUUtNjAwMCBzdXBwb3J0IgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gUENJCisJaGVscAorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIE1laWxoYXVzIE1FLTYwMDAgZmFtaWx5IG9mIGJvYXJkcworCSAgdGhhdCBkbyBkYXRhIGNvbGxlY3Rpb24gYW5kIG11bHRpcHVycG9zZSBJL08uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG1lNjAwMC4KKworY29uZmlnIE1FODEwMAorCXRyaXN0YXRlICJNZWlsaGF1cyBNRS04MTAwIHN1cHBvcnQiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBQQ0kKKwloZWxwCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgTWVpbGhhdXMgTUUtODEwMCBmYW1pbHkgb2YgYm9hcmRzCisJICB0aGF0IGRvIGRhdGEgY29sbGVjdGlvbiBhbmQgbXVsdGlwdXJwb3NlIEkvTy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbWU4MTAwLgorCitjb25maWcgTUU4MjAwCisJdHJpc3RhdGUgIk1laWxoYXVzIE1FLTgyMDAgc3VwcG9ydCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFBDSQorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBNZWlsaGF1cyBNRS04MjAwIGZhbWlseSBvZiBib2FyZHMKKwkgIHRoYXQgZG8gZGF0YSBjb2xsZWN0aW9uIGFuZCBtdWx0aXB1cnBvc2UgSS9PLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBtZTgyMDAuCisKK2NvbmZpZyBNRURVTU1ZCisJdHJpc3RhdGUgIk1laWxoYXVzIGR1bW15IGRyaXZlciIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFBDSQorCWhlbHAKKwkgIFRoaXMgcHJvdmlkZXMgYSBkdW1teSBkcml2ZXIgZm9yIHRoZSBNZWlsaGF1cyBkcml2ZXIgcGFja2FnZQorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBtZWR1bW15LgorCitlbmRpZiAjIE1FSUxIQVVTCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFiMmMxYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9NYWtlZmlsZQpAQCAtMCwwICsxLDQzIEBACisjCisjIE1ha2VmaWxlIGZvciBNZWlsaGF1cyBsaW51eCBkcml2ZXIgc3lzdGVtCisjCisKK29iai0kKENPTkZJR19NRUlMSEFVUykgKz0gbWVtYWluLm8KK29iai0kKENPTkZJR19NRTE2MDApICs9IG1lMTYwMC5vCitvYmotJChDT05GSUdfTUUxMDAwKSArPSBtZTEwMDAubworb2JqLSQoQ09ORklHX01FMTQwMCkgKz0gbWUxNDAwLm8KK29iai0kKENPTkZJR19NRTQ2MDApICs9IG1lNDYwMC5vCitvYmotJChDT05GSUdfTUU2MDAwKSArPSBtZTYwMDAubworb2JqLSQoQ09ORklHX01FMDYwMCkgKz0gbWUwNjAwLm8KK29iai0kKENPTkZJR19NRTgxMDApICs9IG1lODEwMC5vCitvYmotJChDT05GSUdfTUU4MjAwKSArPSBtZTgyMDAubworb2JqLSQoQ09ORklHX01FMDkwMCkgKz0gbWUwOTAwLm8KK29iai0kKENPTkZJR19NRURVTU1ZKSArPSBtZWR1bW15Lm8KKworCittZTE2MDAtb2JqcyA6PSBtZWRldmljZS5vIG1lZGxpc3QubyBtZWRsb2NrLm8gbWUxNjAwX2RldmljZS5vCittZTE2MDAtb2JqcyArPSBtZXN1YmRldmljZS5vIG1lc2xpc3QubyBtZXNsb2NrLm8gbWUxNjAwX2FvLm8KKworbWUxMDAwLW9ianMgOj0gbWVkZXZpY2UubyBtZWRsaXN0Lm8gbWVkbG9jay5vIG1lMTAwMF9kZXZpY2UubworbWUxMDAwLW9ianMgKz0gbWVzdWJkZXZpY2UubyBtZXNsaXN0Lm8gbWVzbG9jay5vIG1lMTAwMF9kaW8ubworCittZTE0MDAtb2JqcyA6PSBtZWRldmljZS5vIG1lZGxpc3QubyBtZWRsb2NrLm8gbWUxNDAwX2RldmljZS5vCittZTE0MDAtb2JqcyArPSBtZXN1YmRldmljZS5vIG1lc2xpc3QubyBtZXNsb2NrLm8gbWU4MjU0Lm8gbWU4MjU1Lm8gbWUxNDAwX2V4dF9pcnEubworCittZTQ2MDAtb2JqcyA6PSBtZWRldmljZS5vIG1lZGxpc3QubyBtZWRsb2NrLm8gbWVmaXJtd2FyZS5vIG1lNDYwMF9kZXZpY2UubworbWU0NjAwLW9ianMgKz0gbWVzdWJkZXZpY2UubyBtZXNsaXN0Lm8gbWVzbG9jay5vIG1lNDYwMF9kby5vIG1lNDYwMF9kaS5vIG1lNDYwMF9kaW8ubyBtZTgyNTQubyBtZTQ2MDBfYWkubyBtZTQ2MDBfYW8ubyBtZTQ2MDBfZXh0X2lycS5vCisKK21lNjAwMC1vYmpzIDo9IG1lZGV2aWNlLm8gbWVkbGlzdC5vIG1lZGxvY2subyBtZWZpcm13YXJlLm8gbWU2MDAwX2RldmljZS5vCittZTYwMDAtb2JqcyArPSBtZXN1YmRldmljZS5vIG1lc2xpc3QubyBtZXNsb2NrLm8gbWU2MDAwX2Rpby5vIG1lNjAwMF9hby5vCisKK21lMDYwMC1vYmpzIDo9IG1lZGV2aWNlLm8gbWVkbGlzdC5vIG1lZGxvY2subyBtZTA2MDBfZGV2aWNlLm8KK21lMDYwMC1vYmpzICs9IG1lc3ViZGV2aWNlLm8gbWVzbGlzdC5vIG1lc2xvY2subyBtZTA2MDBfcmVsYXkubyBtZTA2MDBfdHRsaS5vIG1lMDYwMF9vcHRvaS5vIG1lMDYwMF9kaW8ubyBtZTA2MDBfZXh0X2lycS5vCisKK21lODEwMC1vYmpzIDo9IG1lZGV2aWNlLm8gbWVkbGlzdC5vIG1lZGxvY2subyBtZTgxMDBfZGV2aWNlLm8KK21lODEwMC1vYmpzICs9IG1lc3ViZGV2aWNlLm8gbWVzbGlzdC5vIG1lc2xvY2subyBtZTgxMDBfZGkubyBtZTgxMDBfZG8ubyBtZTgyNTQubworCittZTgyMDAtb2JqcyA6PSBtZWRldmljZS5vIG1lZGxpc3QubyBtZWRsb2NrLm8gbWU4MjAwX2RldmljZS5vCittZTgyMDAtb2JqcyArPSBtZXN1YmRldmljZS5vIG1lc2xpc3QubyBtZXNsb2NrLm8gbWU4MjAwX2RpLm8gbWU4MjAwX2RvLm8gbWU4MjAwX2Rpby5vCisKK21lMDkwMC1vYmpzIDo9IG1lZGV2aWNlLm8gbWVkbGlzdC5vIG1lZGxvY2subyBtZTA5MDBfZGV2aWNlLm8KK21lMDkwMC1vYmpzICs9IG1lc3ViZGV2aWNlLm8gbWVzbGlzdC5vIG1lc2xvY2subyBtZTA5MDBfZG8ubyBtZTA5MDBfZGkubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWMyNTIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL1RPRE8KQEAgLTAsMCArMSwxMCBAQAorVE9ETzoKKwktIGNoZWNrcGF0Y2gucGwgY2xlYW51cHMKKwktIHNwYXJzZSBpc3N1ZXMKKwktIExpbmRlbnQKKwktIGF1ZGl0IHVzZXJzcGFjZSBpbnRlcmZhY2UKKwktIGhhbmRsZSBmaXJtd2FyZSBwcm9wZXJseQorCS0gcG9zc2libGUgY29tZWRpIG1lcmdlCisKK1BsZWFzZSBzZW5kIGNsZWFudXAgcGF0Y2hlcyB0byBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgorYW5kIENDOiBEYXZpZCBLaWxpYW5pIDxtYWlsQGRhdmlka2lsaWFuaS5kZT4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfZGV2aWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX2RldmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NTBlNDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX2RldmljZS5jCkBAIC0wLDAgKzEsMjE1IEBACisvKioKKyAqIEBmaWxlIG1lMDYwMF9kZXZpY2UuYworICoKKyAqIEBicmllZiBNRS02MzAgZGV2aWNlIGNsYXNzIGltcGxlbWVudGF0aW9uLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisjaWZuZGVmIE1PRFVMRQorIyAgZGVmaW5lIE1PRFVMRQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgIm1laWRzLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorI2luY2x1ZGUgIm1lY29tbW9uLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisjaW5jbHVkZSAibWUwNjAwX2RldmljZS5oIgorI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisjaW5jbHVkZSAibWUwNjAwX3JlbGF5LmgiCisjaW5jbHVkZSAibWUwNjAwX3R0bGkuaCIKKyNpbmNsdWRlICJtZTA2MDBfb3B0b2kuaCIKKyNpbmNsdWRlICJtZTA2MDBfZGlvLmgiCisjaW5jbHVkZSAibWUwNjAwX2V4dF9pcnEuaCIKKworbWVfZGV2aWNlX3QgKm1lMDYwMF9wY2lfY29uc3RydWN0b3Ioc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2UpCit7CisJbWUwNjAwX2RldmljZV90ICptZTA2MDBfZGV2aWNlOworCW1lX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJdW5zaWduZWQgaW50IHZlcnNpb25faWR4OworCWludCBlcnI7CisJaW50IGk7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBBbGxvY2F0ZSBzdHJ1Y3R1cmUgZm9yIGRldmljZSBpbnN0YW5jZS4KKwltZTA2MDBfZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWUwNjAwX2RldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIW1lMDYwMF9kZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3IgZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChtZTA2MDBfZGV2aWNlLCAwLCBzaXplb2YobWUwNjAwX2RldmljZV90KSk7CisKKwkvLyBJbml0aWFsaXplIGJhc2UgY2xhc3Mgc3RydWN0dXJlLgorCWVyciA9IG1lX2RldmljZV9wY2lfaW5pdCgobWVfZGV2aWNlX3QgKikgbWUwNjAwX2RldmljZSwgcGNpX2RldmljZSk7CisKKwlpZiAoZXJyKSB7CisJCWtmcmVlKG1lMDYwMF9kZXZpY2UpOworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIGRldmljZSBiYXNlIGNsYXNzLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIEdldCB0aGUgaW5kZXggaW4gdGhlIGRldmljZSB2ZXJzaW9uIGluZm9ybWF0aW9uIHRhYmxlLiAqLworCXZlcnNpb25faWR4ID0KKwkgICAgbWUwNjAwX3ZlcnNpb25zX2dldF9kZXZpY2VfaW5kZXgobWUwNjAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS4KKwkJCQkJICAgICBkZXZpY2VfaWQpOworCisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2sgLgorCXNwaW5fbG9ja19pbml0KCZtZTA2MDBfZGV2aWNlLT5kaW9fY3RybF9yZWdfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJm1lMDYwMF9kZXZpY2UtPmludGNzcl9sb2NrKTsKKworCS8vIENyZWF0ZSBzdWJkZXZpY2UgaW5zdGFuY2VzLgorCisJZm9yIChpID0gMDsgaSA8IG1lMDYwMF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0ub3B0b2lfc3ViZGV2aWNlczsgaSsrKSB7CisJCXN1YmRldmljZSA9CisJCSAgICAobWVfc3ViZGV2aWNlX3QgKikgbWUwNjAwX29wdG9pX2NvbnN0cnVjdG9yKG1lMDYwMF9kZXZpY2UtPgorCQkJCQkJCQliYXNlLmluZm8ucGNpLgorCQkJCQkJCQlyZWdfYmFzZXNbMl0pOworCisJCWlmICghc3ViZGV2aWNlKSB7CisJCQltZV9kZXZpY2VfZGVpbml0KChtZV9kZXZpY2VfdCAqKSBtZTA2MDBfZGV2aWNlKTsKKwkJCWtmcmVlKG1lMDYwMF9kZXZpY2UpOworCQkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlLlxuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCW1lX3NsaXN0X2FkZF9zdWJkZXZpY2VfdGFpbCgmbWUwNjAwX2RldmljZS0+YmFzZS5zbGlzdCwKKwkJCQkJICAgIHN1YmRldmljZSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG1lMDYwMF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0ucmVsYXlfc3ViZGV2aWNlczsgaSsrKSB7CisJCXN1YmRldmljZSA9CisJCSAgICAobWVfc3ViZGV2aWNlX3QgKikgbWUwNjAwX3JlbGF5X2NvbnN0cnVjdG9yKG1lMDYwMF9kZXZpY2UtPgorCQkJCQkJCQliYXNlLmluZm8ucGNpLgorCQkJCQkJCQlyZWdfYmFzZXNbMl0pOworCisJCWlmICghc3ViZGV2aWNlKSB7CisJCQltZV9kZXZpY2VfZGVpbml0KChtZV9kZXZpY2VfdCAqKSBtZTA2MDBfZGV2aWNlKTsKKwkJCWtmcmVlKG1lMDYwMF9kZXZpY2UpOworCQkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlLlxuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCW1lX3NsaXN0X2FkZF9zdWJkZXZpY2VfdGFpbCgmbWUwNjAwX2RldmljZS0+YmFzZS5zbGlzdCwKKwkJCQkJICAgIHN1YmRldmljZSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG1lMDYwMF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0udHRsaV9zdWJkZXZpY2VzOyBpKyspIHsKKwkJc3ViZGV2aWNlID0KKwkJICAgIChtZV9zdWJkZXZpY2VfdCAqKSBtZTA2MDBfdHRsaV9jb25zdHJ1Y3RvcihtZTA2MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgICAgYmFzZS5pbmZvLnBjaS4KKwkJCQkJCQkgICAgICAgcmVnX2Jhc2VzWzJdKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWUwNjAwX2RldmljZSk7CisJCQlrZnJlZShtZTA2MDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lMDYwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBtZTA2MDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLmRpb19zdWJkZXZpY2VzOyBpKyspIHsKKwkJc3ViZGV2aWNlID0KKwkJICAgIChtZV9zdWJkZXZpY2VfdCAqKSBtZTA2MDBfZGlvX2NvbnN0cnVjdG9yKG1lMDYwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgIGJhc2UuaW5mby5wY2kuCisJCQkJCQkJICAgICAgcmVnX2Jhc2VzWzJdLCBpLAorCQkJCQkJCSAgICAgICZtZTA2MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgICBkaW9fY3RybF9yZWdfbG9jayk7CisKKwkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lMDYwMF9kZXZpY2UpOworCQkJa2ZyZWUobWUwNjAwX2RldmljZSk7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTA2MDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkgICAgc3ViZGV2aWNlKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbWUwNjAwX3ZlcnNpb25zW3ZlcnNpb25faWR4XS5leHRfaXJxX3N1YmRldmljZXM7IGkrKykgeworCQlzdWJkZXZpY2UgPQorCQkgICAgKG1lX3N1YmRldmljZV90ICopCisJCSAgICBtZTA2MDBfZXh0X2lycV9jb25zdHJ1Y3RvcihtZTA2MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLgorCQkJCQkgICAgICAgcmVnX2Jhc2VzWzFdLAorCQkJCQkgICAgICAgbWUwNjAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS4KKwkJCQkJICAgICAgIHJlZ19iYXNlc1syXSwKKwkJCQkJICAgICAgICZtZTA2MDBfZGV2aWNlLT5pbnRjc3JfbG9jaywgaSwKKwkJCQkJICAgICAgIG1lMDYwMF9kZXZpY2UtPmJhc2UuaXJxKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWUwNjAwX2RldmljZSk7CisJCQlrZnJlZShtZTA2MDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lMDYwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCXJldHVybiAobWVfZGV2aWNlX3QgKikgbWUwNjAwX2RldmljZTsKK30KKworLy8gSW5pdCBhbmQgZXhpdCBvZiBtb2R1bGUuCisKK3N0YXRpYyBpbnQgX19pbml0IG1lMDYwMF9pbml0KHZvaWQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbWUwNjAwX2V4aXQodm9pZCkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7Cit9CisKK21vZHVsZV9pbml0KG1lMDYwMF9pbml0KTsKKworbW9kdWxlX2V4aXQobWUwNjAwX2V4aXQpOworCisvLyBBZG1pbmlzdHJhdGl2ZSBzdHVmZiBmb3IgbW9kaW5mby4KK01PRFVMRV9BVVRIT1IKKyAgICAoIkd1ZW50ZXIgR2ViaGFyZHQgPGcuZ2ViaGFyZHRAbWVpbGhhdXMuZGU+ICYgS3J6eXN6dG9mIEdhbnR6a2UgPGsuZ2FudHprZUBtZWlsaGF1cy5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRGV2aWNlIERyaXZlciBNb2R1bGUgZm9yIE1FLTZ4eCBEZXZpY2UiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJNZWlsaGF1cyBNRS02eHggRGV2aWNlcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvLyBFeHBvcnQgdGhlIGNvbnN0cnVjdG9yLgorRVhQT1JUX1NZTUJPTChtZTA2MDBfcGNpX2NvbnN0cnVjdG9yKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfZGV2aWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX2RldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5M2E4YWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX2RldmljZS5oCkBAIC0wLDAgKzEsOTcgQEAKKy8qKgorICogQGZpbGUgbWUwNjAwX2RldmljZS5oCisgKgorICogQGJyaWVmIE1FLTYzMCBkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUUwNjAwX0RFVklDRV9ICisjZGVmaW5lIF9NRTA2MDBfREVWSUNFX0gKKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlICJtZWRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBTdHJ1Y3R1cmUgaG9sZGluZyBNRS02MzAgZGV2aWNlIGNhcGFiaWxpdGllcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWUwNjAwX3ZlcnNpb24geworCXVpbnQxNl90IGRldmljZV9pZDsKKwl1bnNpZ25lZCBpbnQgcmVsYXlfc3ViZGV2aWNlczsKKwl1bnNpZ25lZCBpbnQgdHRsaV9zdWJkZXZpY2VzOworCXVuc2lnbmVkIGludCBvcHRvaV9zdWJkZXZpY2VzOworCXVuc2lnbmVkIGludCBkaW9fc3ViZGV2aWNlczsKKwl1bnNpZ25lZCBpbnQgZXh0X2lycV9zdWJkZXZpY2VzOworfSBtZTA2MDBfdmVyc2lvbl90OworCisvKioKKyAqIEBicmllZiBEZXZpY2UgY2FwYWJpbGl0aWVzLgorICovCitzdGF0aWMgbWUwNjAwX3ZlcnNpb25fdCBtZTA2MDBfdmVyc2lvbnNbXSA9IHsKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA2MzAsIDEsIDEsIDEsIDIsIDJ9LAorCXswfSwKK307CisKKyNkZWZpbmUgTUUwNjAwX0RFVklDRV9WRVJTSU9OUyAoc2l6ZW9mKG1lMDYwMF92ZXJzaW9ucykgLyBzaXplb2YobWUwNjAwX3ZlcnNpb25fdCkgLSAxKQkvKio8IFJldHVybnMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluICNtZTA2MDBfdmVyc2lvbnMuICovCisKKy8qKgorICogQGJyaWVmIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBkZXZpY2UgZW50cnkgaW4gI21lMDYwMF92ZXJzaW9ucy4KKyAqCisgKiBAcGFyYW0gZGV2aWNlX2lkIFRoZSBQQ0kgZGV2aWNlIGlkIG9mIHRoZSBkZXZpY2UgdG8gcXVlcnkuCisgKiBAcmV0dXJuIFRoZSBpbmRleCBvZiB0aGUgZGV2aWNlIGluICNtZTA2MDBfdmVyc2lvbnMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG1lMDYwMF92ZXJzaW9uc19nZXRfZGV2aWNlX2luZGV4KHVpbnQxNl90IGRldmljZV9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgTUUwNjAwX0RFVklDRV9WRVJTSU9OUzsgaSsrKQorCQlpZiAobWUwNjAwX3ZlcnNpb25zW2ldLmRldmljZV9pZCA9PSBkZXZpY2VfaWQpCisJCQlicmVhazsKKwlyZXR1cm4gaTsKK30KKworLyoqCisgKiBAYnJpZWYgVGhlIE1FLTYzMCBkZXZpY2UgY2xhc3Mgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTA2MDBfZGV2aWNlIHsKKwltZV9kZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIE1laWxoYXVzIGRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQ2hpbGQgY2xhc3MgYXR0cmlidXRlcy4gKi8KKwlzcGlubG9ja190IGRpb19jdHJsX3JlZ19sb2NrOworCXNwaW5sb2NrX3QgaW50Y3NyX2xvY2s7Cit9IG1lMDYwMF9kZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIE1FLTYzMCBkZXZpY2UgY2xhc3MgY29uc3RydWN0b3IuCisgKgorICogQHBhcmFtIHBjaV9kZXZpY2UgVGhlIHBjaSBkZXZpY2Ugc3RydWN0dXJlIGdpdmVuIGJ5IHRoZSBQQ0kgc3Vic3lzdGVtLgorICoKKyAqIEByZXR1cm4gT24gc3VjY2VzIGEgbmV3IE1FLTYzMCBkZXZpY2UgaW5zdGFuY2UuIFxuCisgKiAgICAgICAgIE5VTEwgb24gZXJyb3IuCisgKi8KK21lX2RldmljZV90ICptZTA2MDBfcGNpX2NvbnN0cnVjdG9yKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlKQorICAgIF9fYXR0cmlidXRlX18gKCh3ZWFrKSk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX2Rpby5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9kaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTI3NzU3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9kaW8uYwpAQCAtMCwwICsxLDQxNSBAQAorLyoqCisgKiBAZmlsZSBtZTA2MDBfZGlvLmMKKyAqCisgKiBAYnJpZWYgTUUtNjMwIGRpZ2l0YWwgaW5wdXQvb3V0cHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworLyoKKyAqIEluY2x1ZGVzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lMDYwMF9kaW9fcmVnLmgiCisjaW5jbHVkZSAibWUwNjAwX2Rpby5oIgorCisvKgorICogRGVmaW5lcworICovCisKKy8qCisgKiBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW50IG1lMDYwMF9kaW9faW9fcmVzZXRfc3ViZGV2aWNlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJIHN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGZsYWdzKQoreworCW1lMDYwMF9kaW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQ4X3QgbW9kZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMDYwMF9kaW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwltb2RlID0gaW5iKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJbW9kZSAmPSB+KDB4MyA8PCAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSk7CisJb3V0Yihtb2RlLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBtb2RlKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisKKwlvdXRiKDB4MDAsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJUERFQlVHX1JFRygicG9ydF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+cG9ydF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDB4MDApOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTA2MDBfZGlvX2lvX3NpbmdsZV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgIGludCBzaW5nbGVfY29uZmlnLAorCQkJCSAgICAgICBpbnQgcmVmLAorCQkJCSAgICAgICBpbnQgdHJpZ19jaGFuLAorCQkJCSAgICAgICBpbnQgdHJpZ190eXBlLCBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpCit7CisJbWUwNjAwX2Rpb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdWludDhfdCBtb2RlOworCWludCBzaXplID0KKwkgICAgZmxhZ3MgJiAoTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fQklUIHwgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fQllURQorCQkgICAgIHwgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fV09SRCB8CisJCSAgICAgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fRFdPUkQpOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUwNjAwX2Rpb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwltb2RlID0gaW5iKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJc3dpdGNoIChzaXplKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fSU5QVVQpIHsKKwkJCQltb2RlICY9CisJCQkJICAgIH4oKE1FMDYwMF9ESU9fQ09ORklHX0JJVF9PVVRfMCkgPDwKKwkJCQkgICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSk7CisJCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fT1VUUFVUKSB7CisJCQkJbW9kZSAmPQorCQkJCSAgICB+KChNRTA2MDBfRElPX0NPTkZJR19CSVRfT1VUXzApIDw8CisJCQkJICAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCQkJCW1vZGUgfD0KKwkJCQkgICAgTUUwNjAwX0RJT19DT05GSUdfQklUX09VVF8wIDw8IChpbnN0YW5jZS0+CisJCQkJCQkJCSAgICBkaW9faWR4ICoKKwkJCQkJCQkJICAgIDIpOworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IKKwkJCQkgICAgKCJJbnZhbGlkIHBvcnQgY29uZmlndXJhdGlvbiBzcGVjaWZpZWQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NJTkdMRV9DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBudW1iZXIuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncy5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICghZXJyKSB7CisJCW91dGIobW9kZSwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgbW9kZSk7CisJfQorCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTA2MDBfZGlvX2lvX3NpbmdsZV9yZWFkKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTA2MDBfZGlvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1aW50OF90IG1vZGU7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTA2MDBfZGlvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CSVQ6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDgpKSB7CisJCQltb2RlID0KKwkJCSAgICBpbmIoaW5zdGFuY2UtPgorCQkJCWN0cmxfcmVnKSAmICgoTUUwNjAwX0RJT19DT05GSUdfQklUX09VVF8wKSA8PAorCQkJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKworCQkJaWYgKChtb2RlID09CisJCQkgICAgIChNRTA2MDBfRElPX0NPTkZJR19CSVRfT1VUXzAgPDwKKwkJCSAgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKSkgfHwgIW1vZGUpIHsKKwkJCQkqdmFsdWUgPQorCQkJCSAgICBpbmIoaW5zdGFuY2UtPgorCQkJCQlwb3J0X3JlZykgJiAoMHgwMDAxIDw8IGNoYW5uZWwpOworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IoIlBvcnQgbm90IGluIG91dHB1dCBvciBpbnB1dCBtb2RlLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJpdCBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCW1vZGUgPQorCQkJICAgIGluYihpbnN0YW5jZS0+CisJCQkJY3RybF9yZWcpICYgKChNRTA2MDBfRElPX0NPTkZJR19CSVRfT1VUXzApIDw8CisJCQkJCSAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCisJCQlpZiAoKG1vZGUgPT0KKwkJCSAgICAgKE1FMDYwMF9ESU9fQ09ORklHX0JJVF9PVVRfMCA8PAorCQkJICAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpKSB8fCAhbW9kZSkgeworCQkJCSp2YWx1ZSA9IGluYihpbnN0YW5jZS0+cG9ydF9yZWcpICYgMHgwMEZGOworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IoIlBvcnQgbm90IGluIG91dHB1dCBvciBpbnB1dCBtb2RlLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKworCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lMDYwMF9kaW9faW9fc2luZ2xlX3dyaXRlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lMDYwMF9kaW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQ4X3QgbW9kZTsKKwl1aW50OF90IGJ5dGU7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTA2MDBfZGlvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCXN3aXRjaCAoZmxhZ3MpIHsKKworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCW1vZGUgPQorCQkJICAgIGluYihpbnN0YW5jZS0+CisJCQkJY3RybF9yZWcpICYgKChNRTA2MDBfRElPX0NPTkZJR19CSVRfT1VUXzApIDw8CisJCQkJCSAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCisJCQlpZiAobW9kZSA9PQorCQkJICAgIChNRTA2MDBfRElPX0NPTkZJR19CSVRfT1VUXzAgPDwKKwkJCSAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpKSB7CisJCQkJYnl0ZSA9IGluYihpbnN0YW5jZS0+cG9ydF9yZWcpOworCisJCQkJaWYgKHZhbHVlKQorCQkJCQlieXRlIHw9IDB4MSA8PCBjaGFubmVsOworCQkJCWVsc2UKKwkJCQkJYnl0ZSAmPSB+KDB4MSA8PCBjaGFubmVsKTsKKworCQkJCW91dGIoYnl0ZSwgaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJQb3J0IG5vdCBpbiBvdXRwdXQgb3IgaW5wdXQgbW9kZS5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQltb2RlID0KKwkJCSAgICBpbmIoaW5zdGFuY2UtPgorCQkJCWN0cmxfcmVnKSAmICgoTUUwNjAwX0RJT19DT05GSUdfQklUX09VVF8wKSA8PAorCQkJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKworCQkJaWYgKG1vZGUgPT0KKwkJCSAgICAoTUUwNjAwX0RJT19DT05GSUdfQklUX09VVF8wIDw8CisJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKSkgeworCQkJCW91dGIodmFsdWUsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiUG9ydCBub3QgaW4gb3V0cHV0IG9yIGlucHV0IG1vZGUuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCisJCWJyZWFrOworCX0KKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX2Rpb19xdWVyeV9udW1iZXJfY2hhbm5lbHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgICBpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm51bWJlciA9IDg7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX2Rpb19xdWVyeV9zdWJkZXZpY2VfdHlwZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSp0eXBlID0gTUVfVFlQRV9ESU87CisJKnN1YnR5cGUgPSBNRV9TVUJUWVBFX1NJTkdMRTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTA2MDBfZGlvX3F1ZXJ5X3N1YmRldmljZV9jYXBzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgKmNhcHMpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpjYXBzID0gTUVfQ0FQU19ESU9fRElSX0JZVEU7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK21lMDYwMF9kaW9fc3ViZGV2aWNlX3QgKm1lMDYwMF9kaW9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgZGlvX2lkeCwKKwkJCQkJICAgICAgIHNwaW5sb2NrX3QgKiBjdHJsX3JlZ19sb2NrKQoreworCW1lMDYwMF9kaW9fc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwlpbnQgZXJyOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UgKi8KKwlzdWJkZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTA2MDBfZGlvX3N1YmRldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXN1YmRldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1lMDYwMF9kaW9fc3ViZGV2aWNlX3QpKTsKKworCS8qIEluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgKi8KKwllcnIgPSBtZV9zdWJkZXZpY2VfaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2tzLgorCXNwaW5fbG9ja19pbml0KCZzdWJkZXZpY2UtPnN1YmRldmljZV9sb2NrKTsKKworCXN1YmRldmljZS0+Y3RybF9yZWdfbG9jayA9IGN0cmxfcmVnX2xvY2s7CisKKwkvKiBTYXZlIGRpZ2l0YWwgaS9vIGluZGV4ICovCisJc3ViZGV2aWNlLT5kaW9faWR4ID0gZGlvX2lkeDsKKworCS8qIFNhdmUgdGhlIHN1YmRldmljZSBpbmRleCAqLworCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FMDYwMF9ESU9fQ09ORklHX1JFRzsKKwlzdWJkZXZpY2UtPnBvcnRfcmVnID0gcmVnX2Jhc2UgKyBNRTA2MDBfRElPX1BPUlRfUkVHICsgZGlvX2lkeDsKKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKyNlbmRpZgorCisJLyogT3ZlcmxvYWQgYmFzZSBjbGFzcyBtZXRob2RzLiAqLworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWUwNjAwX2Rpb19pb19yZXNldF9zdWJkZXZpY2U7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfY29uZmlnID0KKwkgICAgbWUwNjAwX2Rpb19pb19zaW5nbGVfY29uZmlnOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3JlYWQgPSBtZTA2MDBfZGlvX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0KKwkgICAgbWUwNjAwX2Rpb19pb19zaW5nbGVfd3JpdGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMgPQorCSAgICBtZTA2MDBfZGlvX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWUwNjAwX2Rpb19xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWUwNjAwX2Rpb19xdWVyeV9zdWJkZXZpY2VfY2FwczsKKworCXJldHVybiBzdWJkZXZpY2U7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX2Rpby5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9kaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDA3NWM3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9kaW8uaApAQCAtMCwwICsxLDY4IEBACisvKioKKyAqIEBmaWxlIG1lMDYwMF9kaW8uaAorICoKKyAqIEBicmllZiBNRS02MzAgZGlnaXRhbCBpbnB1dC9vdXRwdXQgc3ViZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FMDYwMF9ESU9fSF8KKyNkZWZpbmUgX01FMDYwMF9ESU9fSF8KKworI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFRoZSB0ZW1wbGF0ZSBzdWJkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lMDYwMF9kaW9fc3ViZGV2aWNlIHsKKwkvKiBJbmhlcml0YW5jZSAqLworCW1lX3N1YmRldmljZV90IGJhc2U7CQkJLyoqPCBUaGUgc3ViZGV2aWNlIGJhc2UgY2xhc3MuICovCisKKwkvKiBBdHRyaWJ1dGVzICovCisJc3BpbmxvY2tfdCBzdWJkZXZpY2VfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlIHN1YmRldmljZSBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCXNwaW5sb2NrX3QgKmN0cmxfcmVnX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0ICNjdHJsX3JlZyBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCXVuc2lnbmVkIGludCBkaW9faWR4OwkJCS8qKjwgVGhlIGluZGV4IG9mIHRoZSBkaWdpdGFsIGkvbyBvbiB0aGUgZGV2aWNlLiAqLworCisJdW5zaWduZWQgbG9uZyBwb3J0X3JlZzsJCQkvKio8IFJlZ2lzdGVyIGhvbGRpbmcgdGhlIHBvcnQgc3RhdHVzLiAqLworCXVuc2lnbmVkIGxvbmcgY3RybF9yZWc7CQkJLyoqPCBSZWdpc3RlciB0byBjb25maWd1cmUgdGhlIHBvcnQgZGlyZWN0aW9uLiAqLworI2lmZGVmIE1FREVCVUdfREVCVUdfUkVHCisJdW5zaWduZWQgbG9uZyByZWdfYmFzZTsKKyNlbmRpZgorfSBtZTA2MDBfZGlvX3N1YmRldmljZV90OworCisvKioKKyAqIEBicmllZiBUaGUgY29uc3RydWN0b3IgdG8gZ2VuZXJhdGUgYSBNRS02MzAgZGlnaXRhbCBpbnB1dC9vdXB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gZGlvX2lkeCBUaGUgaW5kZXggb2YgdGhlIGRpZ2l0YWwgaS9vIHBvcnQgb24gdGhlIGRldmljZS4KKyAqIEBwYXJhbSBjdHJsX3JlZ19sb2NrIFNwaW4gbG9jayBwcm90ZWN0aW5nIHRoZSBjb250cm9sIHJlZ2lzdGVyLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWUwNjAwX2Rpb19zdWJkZXZpY2VfdCAqbWUwNjAwX2Rpb19jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCBkaW9faWR4LAorCQkJCQkgICAgICAgc3BpbmxvY2tfdCAqIGN0cmxfcmVnX2xvY2spOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9kaW9fcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX2Rpb19yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTE2ZWEzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9kaW9fcmVnLmgKQEAgLTAsMCArMSw0MSBAQAorLyoqCisgKiBAZmlsZSBtZTA2MDBfZGlvX3JlZy5oCisgKgorICogQGJyaWVmIE1FLTYzMCBkaWdpdGFsIGlucHV0L291dHB1dCBzdWJkZXZpY2UgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUUwNjAwX0RJT19SRUdfSF8KKyNkZWZpbmUgX01FMDYwMF9ESU9fUkVHX0hfCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgTUUwNjAwX0RJT19DT05GSUdfUkVHCQkweDAwMDcKKyNkZWZpbmUgTUUwNjAwX0RJT19QT1JUXzBfUkVHCQkweDAwMDgKKyNkZWZpbmUgTUUwNjAwX0RJT19QT1JUXzFfUkVHCQkweDAwMDkKKyNkZWZpbmUgTUUwNjAwX0RJT19QT1JUX1JFRwkJCU1FMDYwMF9ESU9fUE9SVF8wX1JFRworCisjZGVmaW5lIE1FMDYwMF9ESU9fQ09ORklHX0JJVF9PVVRfMAkweDAwMDEKKyNkZWZpbmUgTUUwNjAwX0RJT19DT05GSUdfQklUX09VVF8xCTB4MDAwNAorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9leHRfaXJxLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX2V4dF9pcnEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmExOGFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9leHRfaXJxLmMKQEAgLTAsMCArMSw0NzggQEAKKy8qKgorICogQGZpbGUgbWUwNjAwX2V4dF9pcnEuYworICoKKyAqIEBicmllZiBNRS02MzAgZXh0ZXJuYWwgaW50ZXJydXB0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworLyoKKyAqIEluY2x1ZGVzCisgKi8KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKyNpbmNsdWRlICJtZWlkcy5oIgorI2luY2x1ZGUgIm1lZGVidWcuaCIKKworI2luY2x1ZGUgIm1lcGx4X3JlZy5oIgorI2luY2x1ZGUgIm1lMDYwMF9leHRfaXJxX3JlZy5oIgorI2luY2x1ZGUgIm1lMDYwMF9leHRfaXJxLmgiCisKKy8qCisgKiBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW50IG1lMDYwMF9leHRfaXJxX2lvX2lycV9zdGFydChzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgIGludCBpcnFfc291cmNlLAorCQkJCSAgICAgICBpbnQgaXJxX2VkZ2UsIGludCBpcnFfYXJnLCBpbnQgZmxhZ3MpCit7CisJbWUwNjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQzMl90IHRtcDsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMDYwMF9leHRfaXJxX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncyAmIH5NRV9JT19JUlFfU1RBUlRfRElPX0JJVCkgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKGluc3RhbmNlLT5saW50bm8gPiAxKSB7CisJCVBFUlJPUigiV3JvbmcgaWR4PSVkLlxuIiwgaW5zdGFuY2UtPmxpbnRubyk7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NVQkRFVklDRTsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAoaXJxX3NvdXJjZSAhPSBNRV9JUlFfU09VUkNFX0RJT19MSU5FKSB7CisJCVBFUlJPUigiSW52YWxpZCBpcnEgc291cmNlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9JUlFfU09VUkNFOworCX0KKworCWlmIChpcnFfZWRnZSAhPSBNRV9JUlFfRURHRV9SSVNJTkcpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGlycSBlZGdlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9JUlFfRURHRTsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCXNwaW5fbG9jayhpbnN0YW5jZS0+aW50Y3NyX2xvY2spOworCXRtcCA9IGlubChpbnN0YW5jZS0+aW50Y3NyKTsKKwlzd2l0Y2ggKGluc3RhbmNlLT5saW50bm8pIHsKKwljYXNlIDA6CisJCXRtcCB8PQorCQkgICAgUExYX0lOVENTUl9MT0NBTF9JTlQxX0VOIHwgUExYX0lOVENTUl9MT0NBTF9JTlQxX1BPTCB8CisJCSAgICBQTFhfSU5UQ1NSX1BDSV9JTlRfRU47CisJCWJyZWFrOworCWNhc2UgMToKKwkJdG1wIHw9CisJCSAgICBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfRU4gfCBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfUE9MIHwKKwkJICAgIFBMWF9JTlRDU1JfUENJX0lOVF9FTjsKKwkJYnJlYWs7CisJfQorCW91dGwodG1wLCBpbnN0YW5jZS0+aW50Y3NyKTsKKwlQREVCVUdfUkVHKCJpbnRjc3Igb3V0bChwbHg6MHglWCk9MHgleFxuIiwgaW5zdGFuY2UtPmludGNzciwgdG1wKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+aW50Y3NyX2xvY2spOworCWluc3RhbmNlLT5yaXNlZCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTA2MDBfZXh0X2lycV9pb19pcnFfd2FpdChzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCAqaXJxX2NvdW50LAorCQkJCSAgICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lMDYwMF9leHRfaXJxX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwlsb25nIHQgPSAwOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUwNjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAodGltZV9vdXQgPCAwKSB7CisJCVBFUlJPUigiSW52YWxpZCB0aW1lX291dCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVElNRU9VVDsKKwl9CisKKwlpZiAodGltZV9vdXQpIHsKKwkJdCA9ICh0aW1lX291dCAqIEhaKSAvIDEwMDA7CisKKwkJaWYgKHQgPT0gMCkKKwkJCXQgPSAxOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCWlmIChpbnN0YW5jZS0+cmlzZWQgPD0gMCkgeworCQlpbnN0YW5jZS0+cmlzZWQgPSAwOworCisJCWlmICh0aW1lX291dCkgeworCQkJdCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT4KKwkJCQkJCQkgICAgIHdhaXRfcXVldWUsCisJCQkJCQkJICAgICAoaW5zdGFuY2UtPnJpc2VkICE9CisJCQkJCQkJICAgICAgMCksIHQpOworCisJCQlpZiAodCA9PSAwKSB7CisJCQkJUEVSUk9SKCJXYWl0IG9uIGludGVycnVwdCB0aW1lZCBvdXQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19USU1FT1VUOworCQkJfQorCQl9IGVsc2UgeworCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJIChpbnN0YW5jZS0+cmlzZWQgIT0gMCkpOworCQl9CisKKwkJaWYgKGluc3RhbmNlLT5yaXNlZCA8IDApIHsKKwkJCVBFUlJPUigiV2FpdCBvbiBpbnRlcnJ1cHQgYWJvcnRlZCBieSB1c2VyLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19DQU5DRUxMRUQ7CisJCX0KKwl9CisKKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJUEVSUk9SKCJXYWl0IG9uIGludGVycnVwdCBhYm9ydGVkIGJ5IHNpZ25hbC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwlpbnN0YW5jZS0+cmlzZWQgPSAwOworCSppcnFfY291bnQgPSBpbnN0YW5jZS0+bjsKKwkqdmFsdWUgPSAxOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTA2MDBfZXh0X2lycV9pb19pcnFfc3RvcChzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLCBpbnQgZmxhZ3MpCit7CisJbWUwNjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQzMl90IHRtcDsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMDYwMF9leHRfaXJxX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKGluc3RhbmNlLT5saW50bm8gPiAxKSB7CisJCVBFUlJPUigiV3JvbmcgaWR4PSVkLlxuIiwgaW5zdGFuY2UtPmxpbnRubyk7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NVQkRFVklDRTsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCXNwaW5fbG9jayhpbnN0YW5jZS0+aW50Y3NyX2xvY2spOworCXRtcCA9IGlubChpbnN0YW5jZS0+aW50Y3NyKTsKKwlzd2l0Y2ggKGluc3RhbmNlLT5saW50bm8pIHsKKwljYXNlIDA6CisJCXRtcCAmPSB+UExYX0lOVENTUl9MT0NBTF9JTlQxX0VOOworCQlicmVhazsKKwljYXNlIDE6CisJCXRtcCAmPSB+UExYX0lOVENTUl9MT0NBTF9JTlQyX0VOOworCQlicmVhazsKKwl9CisJb3V0bCh0bXAsIGluc3RhbmNlLT5pbnRjc3IpOworCVBERUJVR19SRUcoImludGNzciBvdXRsKHBseDoweCVYKT0weCV4XG4iLCBpbnN0YW5jZS0+aW50Y3NyLCB0bXApOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5pbnRjc3JfbG9jayk7CisJaW5zdGFuY2UtPnJpc2VkID0gLTE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTA2MDBfZXh0X2lycV9pb19yZXNldF9zdWJkZXZpY2Uoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGZsYWdzKQoreworCW1lMDYwMF9leHRfaXJxX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1aW50MzJfdCB0bXA7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTA2MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5pbnRjc3JfbG9jayk7CisJdG1wID0gaW5sKGluc3RhbmNlLT5pbnRjc3IpOworCXN3aXRjaCAoaW5zdGFuY2UtPmxpbnRubykgeworCWNhc2UgMDoKKwkJdG1wIHw9IFBMWF9JTlRDU1JfTE9DQUxfSU5UMV9QT0wgfCBQTFhfSU5UQ1NSX1BDSV9JTlRfRU47CisJCXRtcCAmPSB+UExYX0lOVENTUl9MT0NBTF9JTlQxX0VOOworCQlicmVhazsKKwljYXNlIDE6CisJCXRtcCB8PSBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfUE9MIHwgUExYX0lOVENTUl9QQ0lfSU5UX0VOOworCQl0bXAgJj0gflBMWF9JTlRDU1JfTE9DQUxfSU5UMl9FTjsKKwkJYnJlYWs7CisJfQorCW91dGwodG1wLCBpbnN0YW5jZS0+aW50Y3NyKTsKKwlQREVCVUdfUkVHKCJpbnRjc3Igb3V0bChwbHg6MHglWCk9MHgleFxuIiwgaW5zdGFuY2UtPmludGNzciwgdG1wKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+aW50Y3NyX2xvY2spOworCisJaW5zdGFuY2UtPnJpc2VkID0gLTE7CisJaW5zdGFuY2UtPm4gPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMDYwMF9leHRfaXJxX3F1ZXJ5X251bWJlcl9jaGFubmVscyhzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCQlpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm51bWJlciA9IDE7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX2V4dF9pcnFfcXVlcnlfc3ViZGV2aWNlX3R5cGUoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgICAgICAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSp0eXBlID0gTUVfVFlQRV9FWFRfSVJROworCSpzdWJ0eXBlID0gTUVfU1VCVFlQRV9TSU5HTEU7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX2V4dF9pcnFfcXVlcnlfc3ViZGV2aWNlX2NhcHMoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgICAgICAgaW50ICpjYXBzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqY2FwcyA9IE1FX0NBUFNfRVhUX0lSUV9FREdFX1JJU0lORzsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgbWUwNjAwX2V4dF9pcnFfZGVzdHJ1Y3RvcihzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UpCit7CisJbWUwNjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUwNjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJZnJlZV9pcnEoaW5zdGFuY2UtPmlycSwgKHZvaWQgKilpbnN0YW5jZSk7CisJbWVfc3ViZGV2aWNlX2RlaW5pdCgmaW5zdGFuY2UtPmJhc2UpOworCWtmcmVlKGluc3RhbmNlKTsKK30KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLCA2LCAxOSkKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTA2MDBfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKKyNlbHNlCitzdGF0aWMgaXJxcmV0dXJuX3QgbWUwNjAwX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorI2VuZGlmCit7CisJbWUwNjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQzMl90IHN0YXR1czsKKwl1aW50MzJfdCBtYXNrID0gUExYX0lOVENTUl9QQ0lfSU5UX0VOOworCWlycXJldHVybl90IHJldCA9IElSUV9IQU5ETEVEOworCisJaW5zdGFuY2UgPSAobWUwNjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKikgZGV2X2lkOworCisJaWYgKGlycSAhPSBpbnN0YW5jZS0+aXJxKSB7CisJCVBFUlJPUigiSW5jb3JyZWN0IGludGVycnVwdCBudW06ICVkLlxuIiwgaXJxKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWlmIChpbnN0YW5jZS0+bGludG5vID4gMSkgeworCQlQRVJST1JfQ1JJVElDQUwKKwkJICAgICgiJXMoKTpXcm9uZyBzdWJkZXZpY2UgaW5kZXg9JWQgcGx4OmlycV9zdGF0dXNfcmVnPTB4JTA0WC5cbiIsCisJCSAgICAgX19mdW5jX18sIGluc3RhbmNlLT5saW50bm8sIGlubChpbnN0YW5jZS0+aW50Y3NyKSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5pbnRjc3JfbG9jayk7CisJc3RhdHVzID0gaW5sKGluc3RhbmNlLT5pbnRjc3IpOworCXN3aXRjaCAoaW5zdGFuY2UtPmxpbnRubykgeworCWNhc2UgMDoKKwkJbWFzayB8PSBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDFfU1RBVEUgfCBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDFfRU47CisJCWJyZWFrOworCWNhc2UgMToKKwkJbWFzayB8PSBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfU1RBVEUgfCBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfRU47CisJCWJyZWFrOworCX0KKworCWlmICgoc3RhdHVzICYgbWFzaykgPT0gbWFzaykgeworCQlpbnN0YW5jZS0+cmlzZWQgPSAxOworCQlpbnN0YW5jZS0+bisrOworCQlpbmIoaW5zdGFuY2UtPnJlc2V0X3JlZyk7CisJCVBERUJVRygiSW50ZXJydXB0IGRldGVjdGVkLlxuIik7CisJfSBlbHNlIHsKKwkJUElORk8KKwkJICAgICgiJWxkIFNoYXJlZCBpbnRlcnJ1cHQuICVzKCk6IGlkeD0wIHBseDppcnFfc3RhdHVzX3JlZz0weCUwNFhcbiIsCisJCSAgICAgamlmZmllcywgX19mdW5jX18sIHN0YXR1cyk7CisJCXJldCA9IElSUV9OT05FOworCX0KKwlzcGluX3VubG9jayhpbnN0YW5jZS0+aW50Y3NyX2xvY2spOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCisJcmV0dXJuIHJldDsKK30KKworbWUwNjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKm1lMDYwMF9leHRfaXJxX2NvbnN0cnVjdG9yKHVpbnQzMl90IHBseF9yZWdfYmFzZSwKKwkJCQkJCSAgICAgICB1aW50MzJfdCBtZTA2MDBfcmVnX2Jhc2UsCisJCQkJCQkgICAgICAgc3BpbmxvY2tfdCAqIGludGNzcl9sb2NrLAorCQkJCQkJICAgICAgIHVuc2lnbmVkIGV4dF9pcnFfaWR4LAorCQkJCQkJICAgICAgIGludCBpcnEpCit7CisJbWUwNjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwlpbnQgZXJyOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UgKi8KKwlzdWJkZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTA2MDBfZXh0X2lycV9zdWJkZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFzdWJkZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3IgNjMwX2V4dF9pcnEgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1lMDYwMF9leHRfaXJxX3N1YmRldmljZV90KSk7CisKKwkvKiBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzICovCisJZXJyID0gbWVfc3ViZGV2aWNlX2luaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlzdWJkZXZpY2UtPmludGNzcl9sb2NrID0gaW50Y3NyX2xvY2s7CisKKwkvKiBJbml0aWFsaXplIHdhaXQgcXVldWUgKi8KKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzdWJkZXZpY2UtPndhaXRfcXVldWUpOworCisJc3ViZGV2aWNlLT5saW50bm8gPSBleHRfaXJxX2lkeDsKKworCS8qIFJlcXVlc3QgaW50ZXJydXB0IGxpbmUgKi8KKwlzdWJkZXZpY2UtPmlycSA9IGlycTsKKworCWVyciA9IHJlcXVlc3RfaXJxKHN1YmRldmljZS0+aXJxLCBtZTA2MDBfaXNyLAorI2lmZGVmIElSUUZfRElTQUJMRUQKKwkJCSAgSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVELAorI2Vsc2UKKwkJCSAgU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEsCisjZW5kaWYKKwkJCSAgTUUwNjAwX05BTUUsICh2b2lkICopc3ViZGV2aWNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IGludGVycnVwdCBsaW5lLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlQSU5GTygiUmVnaXN0ZXJlZCBpcnE9JWQuXG4iLCBzdWJkZXZpY2UtPmlycSk7CisKKwkvKiBJbml0aWFsaXplIHJlZ2lzdGVycyAqLworCXN1YmRldmljZS0+aW50Y3NyID0gcGx4X3JlZ19iYXNlICsgUExYX0lOVENTUjsKKwlzdWJkZXZpY2UtPnJlc2V0X3JlZyA9CisJICAgIG1lMDYwMF9yZWdfYmFzZSArIE1FMDYwMF9JTlRfMF9SRVNFVF9SRUcgKyBleHRfaXJxX2lkeDsKKworCS8qIEluaXRpYWxpemUgdGhlIHN1YmRldmljZSBtZXRob2RzICovCisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19pcnFfc3RhcnQgPSBtZTA2MDBfZXh0X2lycV9pb19pcnFfc3RhcnQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19pcnFfd2FpdCA9IG1lMDYwMF9leHRfaXJxX2lvX2lycV93YWl0OworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9faXJxX3N0b3AgPSBtZTA2MDBfZXh0X2lycV9pb19pcnFfc3RvcDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSA9CisJICAgIG1lMDYwMF9leHRfaXJxX2lvX3Jlc2V0X3N1YmRldmljZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lMDYwMF9leHRfaXJxX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWUwNjAwX2V4dF9pcnFfcXVlcnlfc3ViZGV2aWNlX3R5cGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyA9CisJICAgIG1lMDYwMF9leHRfaXJxX3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfZGVzdHJ1Y3RvciA9IG1lMDYwMF9leHRfaXJxX2Rlc3RydWN0b3I7CisKKwlzdWJkZXZpY2UtPnJpc2VkID0gMDsKKwlzdWJkZXZpY2UtPm4gPSAwOworCisJcmV0dXJuIHN1YmRldmljZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfZXh0X2lycS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9leHRfaXJxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVmMjIwNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfZXh0X2lycS5oCkBAIC0wLDAgKzEsNTggQEAKKy8qKgorICogQGZpbGUgbWUwNjAwX2V4dF9pcnEuaAorICoKKyAqIEBicmllZiBNRS02MzAgZXh0ZXJuYWwgaW50ZXJydXB0IGltcGxlbWVudGF0aW9uLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA2IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKyNpZm5kZWYgX01FMDYwMF9FWFRfSVJRX0hfCisjZGVmaW5lIF9NRTA2MDBfRVhUX0lSUV9IXworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisjaW5jbHVkZSAibWVzbG9jay5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgTUUtNjMwIGV4dGVybmFsIGludGVycnVwdCBzdWJkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lMDYwMF9leHRfaXJxX3N1YmRldmljZSB7CisJLyogSW5oZXJpdGFuY2UgKi8KKwltZV9zdWJkZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0IHRoZSBzdWJkZXZpY2UgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwlzcGlubG9ja190ICppbnRjc3JfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgI2ludGNzci4gKi8KKworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfcXVldWU7CQkvKio8IFF1ZXVlIHRvIHB1dCBvbiB0aHJlYWRzIHdhaXRpbmcgZm9yIGFuIGludGVycnVwdC4gKi8KKworCWludCBpcnE7CQkJCS8qKjwgVGhlIGlycSBudW1iZXIgYXNzaWduZWQgYnkgUENJIEJJT1MuICovCisJaW50IHJpc2VkOwkJCQkvKio8IElmIHRydWUgYW4gaW50ZXJydXB0IGhhcyBvY2N1cmVkLiAqLworCXVuc2lnbmVkIGludCBuOwkJCQkvKio8IFRoZSBudW1iZXIgb2YgaW50ZXJydXB0IHNpbmNlIHRoZSBkcml2ZXIgd2FzIGxvYWRlZC4gKi8KKwl1bnNpZ25lZCBpbnQgbGludG5vOwkJCS8qKjwgVGhlIG51bWJlciBvZiB0aGUgbG9jYWwgUENJIGludGVycnVwdC4gKi8KKworCXVpbnQzMl90IGludGNzcjsJCQkvKio8IFRoZSBQTFggaW50ZXJydXB0IGNvbnRyb2wgYW5kIHN0YXR1cyByZWdpc3Rlci4gKi8KKwl1aW50MzJfdCByZXNldF9yZWc7CQkJLyoqPCBUaGUgY29udHJvbCByZWdpc3Rlci4gKi8KK30gbWUwNjAwX2V4dF9pcnFfc3ViZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBjb25zdHJ1Y3RvciB0byBnZW5lcmF0ZSBhIE1FLTYzMCBleHRlcm5hbCBpbnRlcnJ1cHQgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIHBseF9yZWdfYmFzZSBUaGUgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIG9mIHRoZSBQTFggY2hpcCBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gbWUwNjAwX3JlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIE1FLTYzMCBkZXZpY2UgYXMgcmV0dXJuZWQgYnkgdGhlIFBDSSBCSU9TLgorICogQHBhcmFtIGlycSBUaGUgaXJxIGFzc2lnbmVkIGJ5IHRoZSBQQ0kgQklPUy4KKyAqCisgKiBAcmV0dXJuIFBvaW50ZXIgdG8gbmV3IGluc3RhbmNlIG9uIHN1Y2Nlc3MuXG4KKyAqIE5VTEwgb24gZXJyb3IuCisgKi8KK21lMDYwMF9leHRfaXJxX3N1YmRldmljZV90ICptZTA2MDBfZXh0X2lycV9jb25zdHJ1Y3Rvcih1aW50MzJfdCBwbHhfcmVnX2Jhc2UsCisJCQkJCQkgICAgICAgdWludDMyX3QgbWUwNjAwX3JlZ19iYXNlLAorCQkJCQkJICAgICAgIHNwaW5sb2NrX3QgKiBpbnRjc3JfbG9jaywKKwkJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgZXh0X2lycV9pZHgsCisJCQkJCQkgICAgICAgaW50IGlycSk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX2V4dF9pcnFfcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX2V4dF9pcnFfcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYxOThmYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfZXh0X2lycV9yZWcuaApAQCAtMCwwICsxLDE4IEBACisvKioKKyAqIEBmaWxlIG1lMDYwMF9leHRfaXJxX3JlZy5oCisgKgorICogQGJyaWVmIE1FLTYzMCBleHRlcm5hbCBpbnRlcnJ1cHQgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworI2lmbmRlZiBfTUUwNjAwX0VYVF9JUlFfUkVHX0hfCisjZGVmaW5lIF9NRTA2MDBfRVhUX0lSUV9SRUdfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBNRTA2MDBfSU5UXzBfUkVTRVRfUkVHICAgICAweDAwMDUKKyNkZWZpbmUgTUUwNjAwX0lOVF8xX1JFU0VUX1JFRyAgICAgMHgwMDA2CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX29wdG9pLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX29wdG9pLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZkOTc3ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfb3B0b2kuYwpAQCAtMCwwICsxLDI0MyBAQAorLyoqCisgKiBAZmlsZSBtZTA2MDBfb3B0b2kuYworICoKKyAqIEBicmllZiBNRS02MzAgT3B0b2lzb2xhdGVkIGlucHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworLyoKKyAqIEluY2x1ZGVzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lMDYwMF9vcHRvaV9yZWcuaCIKKyNpbmNsdWRlICJtZTA2MDBfb3B0b2kuaCIKKworLyoKKyAqIERlZmluZXMKKyAqLworCisvKgorICogRnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBtZTA2MDBfb3B0b2lfaW9fcmVzZXRfc3ViZGV2aWNlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTA2MDBfb3B0b2lfaW9fc2luZ2xlX2NvbmZpZyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkJIGludCBjaGFubmVsLAorCQkJCQkgaW50IHNpbmdsZV9jb25maWcsCisJCQkJCSBpbnQgcmVmLAorCQkJCQkgaW50IHRyaWdfY2hhbiwKKwkJCQkJIGludCB0cmlnX3R5cGUsCisJCQkJCSBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpCit7CisJbWUwNjAwX29wdG9pX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMDYwMF9vcHRvaV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJaWYgKHNpbmdsZV9jb25maWcgIT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fSU5QVVQpIHsKKwkJCQlQRVJST1IoIkludmFsaWQgcG9ydCBkaXJlY3Rpb24gc3BlY2lmaWVkLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCisJCWJyZWFrOworCX0KKworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lMDYwMF9vcHRvaV9pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWUwNjAwX29wdG9pX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMDYwMF9vcHRvaV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQklUOgorCQlpZiAoKGNoYW5uZWwgPj0gMCkgJiYgKGNoYW5uZWwgPCA4KSkgeworCQkJKnZhbHVlID0gaW5iKGluc3RhbmNlLT5wb3J0X3JlZykgJiAoMHgxIDw8IGNoYW5uZWwpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJpdCBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCSp2YWx1ZSA9IGluYihpbnN0YW5jZS0+cG9ydF9yZWcpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTA2MDBfb3B0b2lfcXVlcnlfbnVtYmVyX2NoYW5uZWxzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICAgICBpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm51bWJlciA9IDg7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX29wdG9pX3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICAgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqdHlwZSA9IE1FX1RZUEVfREk7CisJKnN1YnR5cGUgPSBNRV9TVUJUWVBFX1NJTkdMRTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTA2MDBfb3B0b2lfcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgICAgaW50ICpjYXBzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqY2FwcyA9IDA7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK21lMDYwMF9vcHRvaV9zdWJkZXZpY2VfdCAqbWUwNjAwX29wdG9pX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlKQoreworCW1lMDYwMF9vcHRvaV9zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCWludCBlcnI7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZSAqLworCXN1YmRldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lMDYwMF9vcHRvaV9zdWJkZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFzdWJkZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzdWJkZXZpY2UsIDAsIHNpemVvZihtZTA2MDBfb3B0b2lfc3ViZGV2aWNlX3QpKTsKKworCS8qIEluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgKi8KKwllcnIgPSBtZV9zdWJkZXZpY2VfaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2tzLgorCXNwaW5fbG9ja19pbml0KCZzdWJkZXZpY2UtPnN1YmRldmljZV9sb2NrKTsKKworCS8qIFNhdmUgdGhlIHN1YmRldmljZSBpbmRleCAqLworCXN1YmRldmljZS0+cG9ydF9yZWcgPSByZWdfYmFzZSArIE1FMDYwMF9PUFRPX0lOUFVUX1JFRzsKKworCS8qIE92ZXJsb2FkIGJhc2UgY2xhc3MgbWV0aG9kcy4gKi8KKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSA9CisJICAgIG1lMDYwMF9vcHRvaV9pb19yZXNldF9zdWJkZXZpY2U7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfY29uZmlnID0KKwkgICAgbWUwNjAwX29wdG9pX2lvX3NpbmdsZV9jb25maWc7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfcmVhZCA9CisJICAgIG1lMDYwMF9vcHRvaV9pb19zaW5nbGVfcmVhZDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lMDYwMF9vcHRvaV9xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lMDYwMF9vcHRvaV9xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWUwNjAwX29wdG9pX3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCisJcmV0dXJuIHN1YmRldmljZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfb3B0b2kuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfb3B0b2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2U2OWJjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9vcHRvaS5oCkBAIC0wLDAgKzEsNTggQEAKKy8qKgorICogQGZpbGUgbWUwNjAwX29wdG9pLmgKKyAqCisgKiBAYnJpZWYgTUUtNjMwIE9wdG9pc29sYXRlZCBpbnB1dCBzdWJkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUUwNjAwX09QVE9JX0hfCisjZGVmaW5lIF9NRTA2MDBfT1BUT0lfSF8KKworI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFRoZSB0ZW1wbGF0ZSBzdWJkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lMDYwMF9vcHRvaV9zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisKKwl1aW50MzJfdCBwb3J0X3JlZzsJCQkvKio8IFJlZ2lzdGVyIGhvbGRpbmcgdGhlIHBvcnQgc3RhdHVzLiAqLworfSBtZTA2MDBfb3B0b2lfc3ViZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBjb25zdHJ1Y3RvciB0byBnZW5lcmF0ZSBhIE1FLTYzMCBPcHRvaXNvbGF0ZWQgaW5wdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICoKKyAqIEBwYXJhbSByZWdfYmFzZSBUaGUgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgYXMgcmV0dXJuZWQgYnkgdGhlIFBDSSBCSU9TLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWUwNjAwX29wdG9pX3N1YmRldmljZV90ICptZTA2MDBfb3B0b2lfY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UpOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9vcHRvaV9yZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfb3B0b2lfcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBiYzQ1MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfb3B0b2lfcmVnLmgKQEAgLTAsMCArMSwzNSBAQAorLyoqCisgKiBAZmlsZSBtZTA2MDBfb3B0b2lfcmVnLmgKKyAqCisgKiBAYnJpZWYgTUUtNjMwIE9wdG9pc29sYXRlZCBpbnB1dCBzdWJkZXZpY2UgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUUwNjAwX09QVE9JX1JFR19IXworI2RlZmluZSBfTUUwNjAwX09QVE9JX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FMDYwMF9PUFRPX0lOUFVUX1JFRyAgICAgIDB4MDAwNAorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9yZWxheS5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9yZWxheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NjVjNjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX3JlbGF5LmMKQEAgLTAsMCArMSwzNTkgQEAKKy8qKgorICogQGZpbGUgbWUwNjAwX3JlbGF5LmMKKyAqCisgKiBAYnJpZWYgTUUtNjMwIHJlbGF5IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworLyoKKyAqIEluY2x1ZGVzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lMDYwMF9yZWxheV9yZWcuaCIKKyNpbmNsdWRlICJtZTA2MDBfcmVsYXkuaCIKKworLyoKKyAqIERlZmluZXMKKyAqLworCisvKgorICogRnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBtZTA2MDBfcmVsYXlfaW9fcmVzZXRfc3ViZGV2aWNlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisJbWUwNjAwX3JlbGF5X3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMDYwMF9yZWxheV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlvdXRiKDB4MCwgaW5zdGFuY2UtPnBvcnRfMF9yZWcpOworCVBERUJVR19SRUcoInBvcnRfMF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+cG9ydF8wX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMCk7CisJb3V0YigweDAsIGluc3RhbmNlLT5wb3J0XzFfcmVnKTsKKwlQREVCVUdfUkVHKCJwb3J0XzFfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnBvcnRfMV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDApOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTA2MDBfcmVsYXlfaW9fc2luZ2xlX2NvbmZpZyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkJIGludCBjaGFubmVsLAorCQkJCQkgaW50IHNpbmdsZV9jb25maWcsCisJCQkJCSBpbnQgcmVmLAorCQkJCQkgaW50IHRyaWdfY2hhbiwKKwkJCQkJIGludCB0cmlnX3R5cGUsCisJCQkJCSBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpCit7CisJbWUwNjAwX3JlbGF5X3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMDYwMF9yZWxheV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fV09SRDoKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJaWYgKHNpbmdsZV9jb25maWcgIT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fT1VUUFVUKSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHdvcmQgZGlyZWN0aW9uIHNwZWNpZmllZC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKworCQlicmVhazsKKwl9CisKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTA2MDBfcmVsYXlfaW9fc2luZ2xlX3JlYWQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lMDYwMF9yZWxheV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTA2MDBfcmVsYXlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJc3dpdGNoIChmbGFncykgeworCisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQklUOgorCQlpZiAoKGNoYW5uZWwgPj0gMCkgJiYgKGNoYW5uZWwgPCA4KSkgeworCQkJKnZhbHVlID0gaW5iKGluc3RhbmNlLT5wb3J0XzBfcmVnKSAmICgweDEgPDwgY2hhbm5lbCk7CisJCX0gZWxzZSBpZiAoKGNoYW5uZWwgPj0gOCkgJiYgKGNoYW5uZWwgPCAxNikpIHsKKwkJCSp2YWx1ZSA9CisJCQkgICAgaW5iKGluc3RhbmNlLT5wb3J0XzFfcmVnKSAmICgweDEgPDwgKGNoYW5uZWwgLSA4KSk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJKnZhbHVlID0gaW5iKGluc3RhbmNlLT5wb3J0XzBfcmVnKTsKKwkJfSBlbHNlIGlmIChjaGFubmVsID09IDEpIHsKKwkJCSp2YWx1ZSA9IGluYihpbnN0YW5jZS0+cG9ydF8xX3JlZyk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX1dPUkQ6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCSp2YWx1ZSA9ICh1aW50MzJfdCkgaW5iKGluc3RhbmNlLT5wb3J0XzFfcmVnKSA8PCA4OworCQkJKnZhbHVlIHw9IGluYihpbnN0YW5jZS0+cG9ydF8wX3JlZyk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgd29yZCBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lMDYwMF9yZWxheV9pb19zaW5nbGVfd3JpdGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCXN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkJaW50IGNoYW5uZWwsCisJCQkJCWludCB2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWUwNjAwX3JlbGF5X3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1aW50OF90IHN0YXRlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUwNjAwX3JlbGF5X3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CSVQ6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDgpKSB7CisJCQlzdGF0ZSA9IGluYihpbnN0YW5jZS0+cG9ydF8wX3JlZyk7CisJCQlzdGF0ZSA9CisJCQkgICAgdmFsdWUgPyAoc3RhdGUgfCAoMHgxIDw8IGNoYW5uZWwpKSA6IChzdGF0ZSAmCisJCQkJCQkJCSAgfigweDEgPDwKKwkJCQkJCQkJICAgIGNoYW5uZWwpKTsKKwkJCW91dGIoc3RhdGUsIGluc3RhbmNlLT5wb3J0XzBfcmVnKTsKKwkJfSBlbHNlIGlmICgoY2hhbm5lbCA+PSA4KSAmJiAoY2hhbm5lbCA8IDE2KSkgeworCQkJc3RhdGUgPSBpbmIoaW5zdGFuY2UtPnBvcnRfMV9yZWcpOworCQkJc3RhdGUgPQorCQkJICAgIHZhbHVlID8gKHN0YXRlIHwgKDB4MSA8PCAoY2hhbm5lbCAtIDgpKSkgOiAoc3RhdGUgJgorCQkJCQkJCQkJfigweDEgPDwKKwkJCQkJCQkJCSAgKGNoYW5uZWwKKwkJCQkJCQkJCSAgIC0KKwkJCQkJCQkJCSAgIDgpKSk7CisJCQlvdXRiKHN0YXRlLCBpbnN0YW5jZS0+cG9ydF8xX3JlZyk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCW91dGIodmFsdWUsIGluc3RhbmNlLT5wb3J0XzBfcmVnKTsKKwkJfSBlbHNlIGlmIChjaGFubmVsID09IDEpIHsKKwkJCW91dGIodmFsdWUsIGluc3RhbmNlLT5wb3J0XzFfcmVnKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBieXRlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX1dPUkQ6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCW91dGIodmFsdWUsIGluc3RhbmNlLT5wb3J0XzBfcmVnKTsKKwkJCW91dGIodmFsdWUgPj4gOCwgaW5zdGFuY2UtPnBvcnRfMV9yZWcpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIHdvcmQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCQlicmVhazsKKwl9CisKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTA2MDBfcmVsYXlfcXVlcnlfbnVtYmVyX2NoYW5uZWxzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICAgICBpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm51bWJlciA9IDE2OworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMDYwMF9yZWxheV9xdWVyeV9zdWJkZXZpY2VfdHlwZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgICBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKnR5cGUgPSBNRV9UWVBFX0RPOworCSpzdWJ0eXBlID0gTUVfU1VCVFlQRV9TSU5HTEU7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX3JlbGF5X3F1ZXJ5X3N1YmRldmljZV9jYXBzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICAgIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPSAwOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCittZTA2MDBfcmVsYXlfc3ViZGV2aWNlX3QgKm1lMDYwMF9yZWxheV9jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSkKK3sKKwltZTA2MDBfcmVsYXlfc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwlpbnQgZXJyOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UgKi8KKwlzdWJkZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTA2MDBfcmVsYXlfc3ViZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghc3ViZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc3ViZGV2aWNlLCAwLCBzaXplb2YobWUwNjAwX3JlbGF5X3N1YmRldmljZV90KSk7CisKKwkvKiBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzICovCisJZXJyID0gbWVfc3ViZGV2aWNlX2luaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwkvKiBTYXZlIHRoZSBzdWJkZXZpY2UgaW5kZXggKi8KKwlzdWJkZXZpY2UtPnBvcnRfMF9yZWcgPSByZWdfYmFzZSArIE1FMDYwMF9SRUxBSVNfMF9SRUc7CisJc3ViZGV2aWNlLT5wb3J0XzFfcmVnID0gcmVnX2Jhc2UgKyBNRTA2MDBfUkVMQUlTXzFfUkVHOworI2lmZGVmIE1FREVCVUdfREVCVUdfUkVHCisJc3ViZGV2aWNlLT5yZWdfYmFzZSA9IHJlZ19iYXNlOworI2VuZGlmCisKKwkvKiBPdmVybG9hZCBiYXNlIGNsYXNzIG1ldGhvZHMuICovCisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19yZXNldF9zdWJkZXZpY2UgPQorCSAgICBtZTA2MDBfcmVsYXlfaW9fcmVzZXRfc3ViZGV2aWNlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX2NvbmZpZyA9CisJICAgIG1lMDYwMF9yZWxheV9pb19zaW5nbGVfY29uZmlnOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3JlYWQgPQorCSAgICBtZTA2MDBfcmVsYXlfaW9fc2luZ2xlX3JlYWQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfd3JpdGUgPQorCSAgICBtZTA2MDBfcmVsYXlfaW9fc2luZ2xlX3dyaXRlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWUwNjAwX3JlbGF5X3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWUwNjAwX3JlbGF5X3F1ZXJ5X3N1YmRldmljZV90eXBlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHMgPQorCSAgICBtZTA2MDBfcmVsYXlfcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisKKwlyZXR1cm4gc3ViZGV2aWNlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9yZWxheS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9yZWxheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZTdkY2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX3JlbGF5LmgKQEAgLTAsMCArMSw2MyBAQAorLyoqCisgKiBAZmlsZSBtZTA2MDBfcmVsYXkuaAorICoKKyAqIEBicmllZiBNRS02MzAgcmVsYXkgc3ViZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FMDYwMF9SRUxBWV9IXworI2RlZmluZSBfTUUwNjAwX1JFTEFZX0hfCisKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgdGVtcGxhdGUgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTA2MDBfcmVsYXlfc3ViZGV2aWNlIHsKKwkvKiBJbmhlcml0YW5jZSAqLworCW1lX3N1YmRldmljZV90IGJhc2U7CQkJLyoqPCBUaGUgc3ViZGV2aWNlIGJhc2UgY2xhc3MuICovCisKKwkvKiBBdHRyaWJ1dGVzICovCisJc3BpbmxvY2tfdCBzdWJkZXZpY2VfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlIHN1YmRldmljZSBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCisJdW5zaWduZWQgbG9uZyBwb3J0XzBfcmVnOwkJCS8qKjwgUmVnaXN0ZXIgaG9sZGluZyB0aGUgcG9ydCBzdGF0dXMuICovCisJdW5zaWduZWQgbG9uZyBwb3J0XzFfcmVnOwkJCS8qKjwgUmVnaXN0ZXIgaG9sZGluZyB0aGUgcG9ydCBzdGF0dXMuICovCisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwl1bnNpZ25lZCBsb25nIHJlZ19iYXNlOworI2VuZGlmCit9IG1lMDYwMF9yZWxheV9zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgTUUtNjMwIHJlbGF5IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gcmVnX2Jhc2UgVGhlIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGFzIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUy4KKyAqIEBwYXJhbSBjdHJsX3JlZ19sb2NrIFNwaW4gbG9jayBwcm90ZWN0aW5nIHRoZSBjb250cm9sIHJlZ2lzdGVyLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWUwNjAwX3JlbGF5X3N1YmRldmljZV90ICptZTA2MDBfcmVsYXlfY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UpOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF9yZWxheV9yZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfcmVsYXlfcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE0ZGIyZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfcmVsYXlfcmVnLmgKQEAgLTAsMCArMSwzNiBAQAorLyoqCisgKiBAZmlsZSBtZTA2MDBfcmVsYXlfcmVnLmgKKyAqCisgKiBAYnJpZWYgTUUtNjMwIHJlbGF5IHN1YmRldmljZSByZWdpc3RlciBkZWZpbml0aW9ucy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTA2MDBfUkVMQVlfUkVHX0hfCisjZGVmaW5lIF9NRTA2MDBfUkVMQVlfUkVHX0hfCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgTUUwNjAwX1JFTEFJU18wX1JFRyAgICAgICAgMHgwMDAxCisjZGVmaW5lIE1FMDYwMF9SRUxBSVNfMV9SRUcgICAgICAgIDB4MDAwMgorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF90dGxpLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX3R0bGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjhlMTNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF90dGxpLmMKQEAgLTAsMCArMSwyMzggQEAKKy8qKgorICogQGZpbGUgbWUwNjAwX3R0bGkuYworICoKKyAqIEBicmllZiBNRS02MzAgVFRMIGlucHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworLyoKKyAqIEluY2x1ZGVzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lMDYwMF90dGxpX3JlZy5oIgorI2luY2x1ZGUgIm1lMDYwMF90dGxpLmgiCisKKy8qCisgKiBEZWZpbmVzCisgKi8KKworLyoKKyAqIEZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbnQgbWUwNjAwX3R0bGlfaW9fcmVzZXRfc3ViZGV2aWNlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTA2MDBfdHRsaV9pb19zaW5nbGVfY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJCWludCBjaGFubmVsLAorCQkJCQlpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkJaW50IHJlZiwKKwkJCQkJaW50IHRyaWdfY2hhbiwKKwkJCQkJaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCW1lMDYwMF90dGxpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMDYwMF90dGxpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9DT05GSUdfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQlpZiAoc2luZ2xlX2NvbmZpZyAhPSBNRV9TSU5HTEVfQ09ORklHX0RJT19JTlBVVCkgeworCQkJCVBFUlJPUigiSW52YWxpZCBwb3J0IGRpcmVjdGlvbiBzcGVjaWZpZWQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NJTkdMRV9DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisKKwkJYnJlYWs7CisJfQorCisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX3R0bGlfaW9fc2luZ2xlX3JlYWQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lMDYwMF90dGxpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMDYwMF90dGxpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CSVQ6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDgpKSB7CisJCQkqdmFsdWUgPSBpbmIoaW5zdGFuY2UtPnBvcnRfcmVnKSAmICgweDEgPDwgY2hhbm5lbCk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCSp2YWx1ZSA9IGluYihpbnN0YW5jZS0+cG9ydF9yZWcpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lMDYwMF90dGxpX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgICBpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm51bWJlciA9IDg7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX3R0bGlfcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgICBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKnR5cGUgPSBNRV9UWVBFX0RJOworCSpzdWJ0eXBlID0gTUVfU1VCVFlQRV9TSU5HTEU7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUwNjAwX3R0bGlfcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgICBpbnQgKmNhcHMpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpjYXBzID0gMDsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworbWUwNjAwX3R0bGlfc3ViZGV2aWNlX3QgKm1lMDYwMF90dGxpX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlKQoreworCW1lMDYwMF90dGxpX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlICovCisJc3ViZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWUwNjAwX3R0bGlfc3ViZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghc3ViZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc3ViZGV2aWNlLCAwLCBzaXplb2YobWUwNjAwX3R0bGlfc3ViZGV2aWNlX3QpKTsKKworCS8qIEluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgKi8KKwllcnIgPSBtZV9zdWJkZXZpY2VfaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2tzLgorCXNwaW5fbG9ja19pbml0KCZzdWJkZXZpY2UtPnN1YmRldmljZV9sb2NrKTsKKworCS8qIFNhdmUgdGhlIHN1YmRldmljZSBpbmRleCAqLworCXN1YmRldmljZS0+cG9ydF9yZWcgPSByZWdfYmFzZSArIE1FMDYwMF9UVExfSU5QVVRfUkVHOworCisJLyogT3ZlcmxvYWQgYmFzZSBjbGFzcyBtZXRob2RzLiAqLworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWUwNjAwX3R0bGlfaW9fcmVzZXRfc3ViZGV2aWNlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX2NvbmZpZyA9CisJICAgIG1lMDYwMF90dGxpX2lvX3NpbmdsZV9jb25maWc7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfcmVhZCA9CisJICAgIG1lMDYwMF90dGxpX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWUwNjAwX3R0bGlfcXVlcnlfbnVtYmVyX2NoYW5uZWxzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGUgPQorCSAgICBtZTA2MDBfdHRsaV9xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWUwNjAwX3R0bGlfcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisKKwlyZXR1cm4gc3ViZGV2aWNlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF90dGxpLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX3R0bGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzkwMzk2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDYwMF90dGxpLmgKQEAgLTAsMCArMSw1OCBAQAorLyoqCisgKiBAZmlsZSBtZTA2MDBfdHRsaS5oCisgKgorICogQGJyaWVmIE1FLTYzMCBUVEwgaW5wdXQgc3ViZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FMDYwMF9UVExJX0hfCisjZGVmaW5lIF9NRTA2MDBfVFRMSV9IXworCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgVGhlIHRlbXBsYXRlIHN1YmRldmljZSBjbGFzcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWUwNjAwX3R0bGlfc3ViZGV2aWNlIHsKKwkvKiBJbmhlcml0YW5jZSAqLworCW1lX3N1YmRldmljZV90IGJhc2U7CQkJLyoqPCBUaGUgc3ViZGV2aWNlIGJhc2UgY2xhc3MuICovCisKKwkvKiBBdHRyaWJ1dGVzICovCisJc3BpbmxvY2tfdCBzdWJkZXZpY2VfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlIHN1YmRldmljZSBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCisJdWludDMyX3QgcG9ydF9yZWc7CQkJLyoqPCBSZWdpc3RlciBob2xkaW5nIHRoZSBwb3J0IHN0YXR1cy4gKi8KK30gbWUwNjAwX3R0bGlfc3ViZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBjb25zdHJ1Y3RvciB0byBnZW5lcmF0ZSBhIE1FLTYzMCBUVEwgaW5wdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICoKKyAqIEBwYXJhbSByZWdfYmFzZSBUaGUgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgYXMgcmV0dXJuZWQgYnkgdGhlIFBDSSBCSU9TLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWUwNjAwX3R0bGlfc3ViZGV2aWNlX3QgKm1lMDYwMF90dGxpX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlKTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfdHRsaV9yZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfdHRsaV9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Zjk4NmQxNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfdHRsaV9yZWcuaApAQCAtMCwwICsxLDM1IEBACisvKioKKyAqIEBmaWxlIG1lMDYwMF90dGxpX3JlZy5oCisgKgorICogQGJyaWVmIE1FLTYzMCBUVEwgaW5wdXQgc3ViZGV2aWNlIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FMDYwMF9UVExJX1JFR19IXworI2RlZmluZSBfTUUwNjAwX1RUTElfUkVHX0hfCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgTUUwNjAwX1RUTF9JTlBVVF9SRUcgICAgICAgMHgwMDAzCisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwOTAwX2RldmljZS5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDkwMF9kZXZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjRkNWQzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDkwMF9kZXZpY2UuYwpAQCAtMCwwICsxLDE4MCBAQAorLyoqCisgKiBAZmlsZSBtZTA5MDBfZGV2aWNlLmMKKyAqCisgKiBAYnJpZWYgTUUtOXggZGV2aWNlIGNsYXNzIGltcGxlbWVudGF0aW9uLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKyNpZm5kZWYgTU9EVUxFCisjICBkZWZpbmUgTU9EVUxFCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAibWVpZHMuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisjaW5jbHVkZSAibWVjb21tb24uaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWVkZXZpY2UuaCIKKyNpbmNsdWRlICJtZTA5MDBfZGV2aWNlLmgiCisjaW5jbHVkZSAibWUwOTAwX3JlZy5oIgorI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisjaW5jbHVkZSAibWUwOTAwX2RvLmgiCisjaW5jbHVkZSAibWUwOTAwX2RpLmgiCisKK21lX2RldmljZV90ICptZTA5MDBfcGNpX2NvbnN0cnVjdG9yKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlKQoreworCW1lMDkwMF9kZXZpY2VfdCAqbWUwOTAwX2RldmljZTsKKwltZV9zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCXVuc2lnbmVkIGludCB2ZXJzaW9uX2lkeDsKKwlpbnQgZXJyOworCWludCBpOworCWludCBwb3J0X3NoaWZ0OworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQWxsb2NhdGUgc3RydWN0dXJlIGZvciBkZXZpY2UgaW5zdGFuY2UuCisJbWUwOTAwX2RldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lMDkwMF9kZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFtZTA5MDBfZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIGRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQobWUwOTAwX2RldmljZSwgMCwgc2l6ZW9mKG1lMDkwMF9kZXZpY2VfdCkpOworCisJLy8gSW5pdGlhbGl6ZSBiYXNlIGNsYXNzIHN0cnVjdHVyZS4KKwllcnIgPSBtZV9kZXZpY2VfcGNpX2luaXQoKG1lX2RldmljZV90ICopIG1lMDkwMF9kZXZpY2UsIHBjaV9kZXZpY2UpOworCisJaWYgKGVycikgeworCQlrZnJlZShtZTA5MDBfZGV2aWNlKTsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBkZXZpY2UgYmFzZSBjbGFzcy5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBHZXQgdGhlIGluZGV4IGluIHRoZSBkZXZpY2UgdmVyc2lvbiBpbmZvcm1hdGlvbiB0YWJsZS4gKi8KKwl2ZXJzaW9uX2lkeCA9CisJICAgIG1lMDkwMF92ZXJzaW9uc19nZXRfZGV2aWNlX2luZGV4KG1lMDkwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuCisJCQkJCSAgICAgZGV2aWNlX2lkKTsKKworCS8qIEluaXRpYWxpemUgODI1NSBjaGlwIHRvIGRlc2lyZWQgbW9kZSAqLworCWlmIChtZTA5MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLmRldmljZV9pZCA9PQorCSAgICBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMDk0MCkgeworCQlvdXRiKDB4OUIsCisJCSAgICAgbWUwOTAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS5yZWdfYmFzZXNbMl0gKworCQkgICAgIE1FMDkwMF9DVFJMX1JFRyk7CisJfSBlbHNlIGlmIChtZTA5MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLmRldmljZV9pZCA9PQorCQkgICBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMDk1MCkgeworCQlvdXRiKDB4ODksCisJCSAgICAgbWUwOTAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS5yZWdfYmFzZXNbMl0gKworCQkgICAgIE1FMDkwMF9DVFJMX1JFRyk7CisJCW91dGIoMHgwMCwKKwkJICAgICBtZTA5MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLnJlZ19iYXNlc1syXSArCisJCSAgICAgTUUwOTAwX1dSSVRFX0VOQUJMRV9SRUcpOworCX0gZWxzZSBpZiAobWUwOTAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS5kZXZpY2VfaWQgPT0KKwkJICAgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA5NjApIHsKKwkJb3V0YigweDhCLAorCQkgICAgIG1lMDkwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kucmVnX2Jhc2VzWzJdICsKKwkJICAgICBNRTA5MDBfQ1RSTF9SRUcpOworCQlvdXRiKDB4MDAsCisJCSAgICAgbWUwOTAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS5yZWdfYmFzZXNbMl0gKworCQkgICAgIE1FMDkwMF9XUklURV9FTkFCTEVfUkVHKTsKKwl9CisKKwlwb3J0X3NoaWZ0ID0KKwkgICAgKG1lMDkwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuZGV2aWNlX2lkID09CisJICAgICBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMDk2MCkgPyAxIDogMDsKKwkvLyBDcmVhdGUgc3ViZGV2aWNlIGluc3RhbmNlcy4KKworCWZvciAoaSA9IDA7IGkgPCBtZTA5MDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLmRpX3N1YmRldmljZXM7IGkrKykgeworCQlzdWJkZXZpY2UgPQorCQkgICAgKG1lX3N1YmRldmljZV90ICopIG1lMDkwMF9kaV9jb25zdHJ1Y3RvcihtZTA5MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGJhc2UuaW5mby5wY2kuCisJCQkJCQkJICAgICByZWdfYmFzZXNbMl0sCisJCQkJCQkJICAgICBpICsgcG9ydF9zaGlmdCk7CisKKwkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lMDkwMF9kZXZpY2UpOworCQkJa2ZyZWUobWUwOTAwX2RldmljZSk7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTA5MDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkgICAgc3ViZGV2aWNlKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbWUwOTAwX3ZlcnNpb25zW3ZlcnNpb25faWR4XS5kb19zdWJkZXZpY2VzOyBpKyspIHsKKwkJc3ViZGV2aWNlID0KKwkJICAgIChtZV9zdWJkZXZpY2VfdCAqKSBtZTA5MDBfZG9fY29uc3RydWN0b3IobWUwOTAwX2RldmljZS0+CisJCQkJCQkJICAgICBiYXNlLmluZm8ucGNpLgorCQkJCQkJCSAgICAgcmVnX2Jhc2VzWzJdLCBpKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWUwOTAwX2RldmljZSk7CisJCQlrZnJlZShtZTA5MDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lMDkwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCXJldHVybiAobWVfZGV2aWNlX3QgKikgbWUwOTAwX2RldmljZTsKK30KKworLy8gSW5pdCBhbmQgZXhpdCBvZiBtb2R1bGUuCisKK3N0YXRpYyBpbnQgX19pbml0IG1lMDkwMF9pbml0KHZvaWQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbi4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1lMDkwMF9leGl0KHZvaWQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbi4iKTsKK30KKworbW9kdWxlX2luaXQobWUwOTAwX2luaXQpOworbW9kdWxlX2V4aXQobWUwOTAwX2V4aXQpOworCisvLyBBZG1pbmlzdHJhdGl2ZSBzdHVmZiBmb3IgbW9kaW5mby4KK01PRFVMRV9BVVRIT1IKKyAgICAoIkd1ZW50ZXIgR2ViaGFyZHQgPGcuZ2ViaGFyZHRAbWVpbGhhdXMuZGU+ICYgS3J6eXN6dG9mIEdhbnR6a2UgPGsuZ2FudHprZUBtZWlsaGF1cy5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRGV2aWNlIERyaXZlciBNb2R1bGUgZm9yIE1FLTl4IERldmljZSIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIk1laWxoYXVzIE1FLTl4IERldmljZXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLy8gRXhwb3J0IHRoZSBjb25zdHJ1Y3Rvci4KK0VYUE9SVF9TWU1CT0wobWUwOTAwX3BjaV9jb25zdHJ1Y3Rvcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwOTAwX2RldmljZS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDkwMF9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDE3ZjI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDkwMF9kZXZpY2UuaApAQCAtMCwwICsxLDkyIEBACisvKioKKyAqIEBmaWxlIG1lMDkwMF9kZXZpY2UuaAorICoKKyAqIEBicmllZiBNRS0wOTAwIChNRS05eCkgZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FMDkwMF9ERVZJQ0VfSAorI2RlZmluZSBfTUUwOTAwX0RFVklDRV9ICisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSAibWVkZXZpY2UuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgU3RydWN0dXJlIGhvbGRpbmcgTUUtMDkwMCAoTUUtOXgpIGRldmljZSBjYXBhYmlsaXRpZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lMDkwMF92ZXJzaW9uIHsKKwl1aW50MTZfdCBkZXZpY2VfaWQ7CisJdW5zaWduZWQgaW50IGRpX3N1YmRldmljZXM7CisJdW5zaWduZWQgaW50IGRvX3N1YmRldmljZXM7Cit9IG1lMDkwMF92ZXJzaW9uX3Q7CisKKy8qKgorICogQGJyaWVmIERldmljZSBjYXBhYmlsaXRpZXMuCisgKi8KK3N0YXRpYyBtZTA5MDBfdmVyc2lvbl90IG1lMDkwMF92ZXJzaW9uc1tdID0geworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMDk0MCwgMiwgMH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUwOTUwLCAwLCAyfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA5NjAsIDEsIDF9LAorCXswfSwKK307CisKKyNkZWZpbmUgTUUwOTAwX0RFVklDRV9WRVJTSU9OUyAoc2l6ZW9mKG1lMDkwMF92ZXJzaW9ucykgLyBzaXplb2YobWUwOTAwX3ZlcnNpb25fdCkgLSAxKQkvKio8IFJldHVybnMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluICNtZTA5MDBfdmVyc2lvbnMuICovCisKKy8qKgorICogQGJyaWVmIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBkZXZpY2UgZW50cnkgaW4gI21lMDkwMF92ZXJzaW9ucy4KKyAqCisgKiBAcGFyYW0gZGV2aWNlX2lkIFRoZSBQQ0kgZGV2aWNlIGlkIG9mIHRoZSBkZXZpY2UgdG8gcXVlcnkuCisgKiBAcmV0dXJuIFRoZSBpbmRleCBvZiB0aGUgZGV2aWNlIGluICNtZTA5MDBfdmVyc2lvbnMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG1lMDkwMF92ZXJzaW9uc19nZXRfZGV2aWNlX2luZGV4KHVpbnQxNl90IGRldmljZV9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgTUUwOTAwX0RFVklDRV9WRVJTSU9OUzsgaSsrKQorCQlpZiAobWUwOTAwX3ZlcnNpb25zW2ldLmRldmljZV9pZCA9PSBkZXZpY2VfaWQpCisJCQlicmVhazsKKwlyZXR1cm4gaTsKK30KKworLyoqCisgKiBAYnJpZWYgVGhlIE1FLTA5MDAgKE1FLTl4KSBkZXZpY2UgY2xhc3Mgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTA5MDBfZGV2aWNlIHsKKwltZV9kZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIE1laWxoYXVzIGRldmljZSBiYXNlIGNsYXNzLiAqLworfSBtZTA5MDBfZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBNRS05eCBkZXZpY2UgY2xhc3MgY29uc3RydWN0b3IuCisgKgorICogQHBhcmFtIHBjaV9kZXZpY2UgVGhlIHBjaSBkZXZpY2Ugc3RydWN0dXJlIGdpdmVuIGJ5IHRoZSBQQ0kgc3Vic3lzdGVtLgorICoKKyAqIEByZXR1cm4gT24gc3VjY2VzIGEgbmV3IE1FLTA5MDAgKE1FLTl4KSBkZXZpY2UgaW5zdGFuY2UuIFxuCisgKiAgICAgICAgIE5VTEwgb24gZXJyb3IuCisgKi8KK21lX2RldmljZV90ICptZTA5MDBfcGNpX2NvbnN0cnVjdG9yKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlKQorICAgIF9fYXR0cmlidXRlX18gKCh3ZWFrKSk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwOTAwX2RpLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwOTAwX2RpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdkNzM5NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA5MDBfZGkuYwpAQCAtMCwwICsxLDI0NiBAQAorLyoqCisgKiBAZmlsZSBtZTA5MDBfZGkuYworICoKKyAqIEBicmllZiBNRS05eCBkaWdpdGFsIGlucHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworLyoKKyAqIEluY2x1ZGVzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKworI2luY2x1ZGUgIm1laWRzLmgiCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lcGx4X3JlZy5oIgorI2luY2x1ZGUgIm1lMDkwMF9yZWcuaCIKKyNpbmNsdWRlICJtZTA5MDBfZGkuaCIKKworLyoKKyAqIERlZmluZXMKKyAqLworCisvKgorICogRnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBtZTA5MDBfZGlfaW9fcmVzZXRfc3ViZGV2aWNlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTA5MDBfZGlfaW9fc2luZ2xlX2NvbmZpZyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgaW50IHNpbmdsZV9jb25maWcsCisJCQkJICAgICAgaW50IHJlZiwKKwkJCQkgICAgICBpbnQgdHJpZ19jaGFuLAorCQkJCSAgICAgIGludCB0cmlnX3R5cGUsIGludCB0cmlnX2VkZ2UsIGludCBmbGFncykKK3sKKwltZTA5MDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUwOTAwX2RpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCWlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfRElPX0lOUFVUKSB7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiSW52YWxpZCBieXRlIGRpcmVjdGlvbiBzcGVjaWZpZWQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NJTkdMRV9DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lMDkwMF9kaV9pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWUwOTAwX2RpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMDkwMF9kaV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCSp2YWx1ZSA9ICh+aW5iKGluc3RhbmNlLT5wb3J0X3JlZykpICYgKDB4MSA8PCBjaGFubmVsKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJKnZhbHVlID0gfmluYihpbnN0YW5jZS0+cG9ydF9yZWcpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTA5MDBfZGlfcXVlcnlfbnVtYmVyX2NoYW5uZWxzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm51bWJlciA9IDg7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUwOTAwX2RpX3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqdHlwZSA9IE1FX1RZUEVfREk7CisJKnN1YnR5cGUgPSBNRV9TVUJUWVBFX1NJTkdMRTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTA5MDBfZGlfcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPSAwOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCittZTA5MDBfZGlfc3ViZGV2aWNlX3QgKm1lMDkwMF9kaV9jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgZGlfaWR4KQoreworCW1lMDkwMF9kaV9zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCWludCBlcnI7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZSAqLworCXN1YmRldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lMDkwMF9kaV9zdWJkZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFzdWJkZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzdWJkZXZpY2UsIDAsIHNpemVvZihtZTA5MDBfZGlfc3ViZGV2aWNlX3QpKTsKKworCS8qIEluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgKi8KKwllcnIgPSBtZV9zdWJkZXZpY2VfaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2tzLgorCXNwaW5fbG9ja19pbml0KCZzdWJkZXZpY2UtPnN1YmRldmljZV9sb2NrKTsKKworCS8qIFNhdmUgdGhlIHN1YmRldmljZSBpbmRleC4gKi8KKwlzdWJkZXZpY2UtPmRpX2lkeCA9IGRpX2lkeDsKKworCS8qIEluaXRpYWxpemUgcmVnaXN0ZXJzICovCisJaWYgKGRpX2lkeCA9PSAwKSB7CisJCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FMDkwMF9DVFJMX1JFRzsKKwkJc3ViZGV2aWNlLT5wb3J0X3JlZyA9IHJlZ19iYXNlICsgTUUwOTAwX1BPUlRfQV9SRUc7CisJfSBlbHNlIHsKKwkJc3ViZGV2aWNlLT5jdHJsX3JlZyA9IHJlZ19iYXNlICsgTUUwOTAwX0NUUkxfUkVHOworCQlzdWJkZXZpY2UtPnBvcnRfcmVnID0gcmVnX2Jhc2UgKyBNRTA5MDBfUE9SVF9CX1JFRzsKKwl9CisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwlzdWJkZXZpY2UtPnJlZ19iYXNlID0gcmVnX2Jhc2U7CisjZW5kaWYKKworCS8qIE92ZXJsb2FkIGJhc2UgY2xhc3MgbWV0aG9kcy4gKi8KKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSA9CisJICAgIG1lMDkwMF9kaV9pb19yZXNldF9zdWJkZXZpY2U7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfY29uZmlnID0KKwkgICAgbWUwOTAwX2RpX2lvX3NpbmdsZV9jb25maWc7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfcmVhZCA9IG1lMDkwMF9kaV9pb19zaW5nbGVfcmVhZDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lMDkwMF9kaV9xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lMDkwMF9kaV9xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWUwOTAwX2RpX3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCisJcmV0dXJuIHN1YmRldmljZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA5MDBfZGkuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA5MDBfZGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTRmMTM0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDkwMF9kaS5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qKgorICogQGZpbGUgbWUwOTAwX2RpLmgKKyAqCisgKiBAYnJpZWYgTUUtOXggZGlnaXRhbCBpbnB1dCBzdWJkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUUwOTAwX0RJX0hfCisjZGVmaW5lIF9NRTA5MDBfRElfSF8KKworI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFRoZSB0ZW1wbGF0ZSBzdWJkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lMDkwMF9kaV9zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisKKwl1bnNpZ25lZCBpbnQgZGlfaWR4OworCisJdW5zaWduZWQgbG9uZyBjdHJsX3JlZzsKKwl1bnNpZ25lZCBsb25nIHBvcnRfcmVnOworI2lmZGVmIE1FREVCVUdfREVCVUdfUkVHCisJdW5zaWduZWQgbG9uZyByZWdfYmFzZTsKKyNlbmRpZgorfSBtZTA5MDBfZGlfc3ViZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBjb25zdHJ1Y3RvciB0byBnZW5lcmF0ZSBhIE1FLTl4IGRpZ2l0YWwgaW5wdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICoKKyAqIEBwYXJhbSByZWdfYmFzZSBUaGUgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgYXMgcmV0dXJuZWQgYnkgdGhlIFBDSSBCSU9TLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWUwOTAwX2RpX3N1YmRldmljZV90ICptZTA5MDBfZGlfY29uc3RydWN0b3IodWludDMyX3QgbWUwOTAwX3JlZ19iYXNlLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBkaV9pZHgpOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDkwMF9kby5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDkwMF9kby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YjljM2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwOTAwX2RvLmMKQEAgLTAsMCArMSwzMTQgQEAKKy8qKgorICogQGZpbGUgbWUwOTAwX2RvLmMKKyAqCisgKiBAYnJpZWYgTUUtOXggZGlnaXRhbCBvdXRwdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvKgorICogSW5jbHVkZXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWUwOTAwX3JlZy5oIgorI2luY2x1ZGUgIm1lMDkwMF9kby5oIgorCisvKgorICogRGVmaW5lcworICovCisKKy8qCisgKiBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW50IG1lMDkwMF9kb19pb19yZXNldF9zdWJkZXZpY2Uoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTA5MDBfZG9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUwOTAwX2RvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCW91dGIoMHhGRiwgaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwlQREVCVUdfUkVHKCJwb3J0X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5wb3J0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMHhmZik7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMDkwMF9kb19pb19zaW5nbGVfY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkgICAgICBpbnQgcmVmLAorCQkJCSAgICAgIGludCB0cmlnX2NoYW4sCisJCQkJICAgICAgaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCW1lMDkwMF9kb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTA5MDBfZG9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9DT05GSUdfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fT1VUUFVUKSB7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiSW52YWxpZCBieXRlIGRpcmVjdGlvbiBzcGVjaWZpZWQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NJTkdMRV9DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lMDkwMF9kb19pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWUwOTAwX2RvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMDkwMF9kb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCSp2YWx1ZSA9ICh+aW5iKGluc3RhbmNlLT5wb3J0X3JlZykpICYgKDB4MSA8PCBjaGFubmVsKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJKnZhbHVlID0gfmluYihpbnN0YW5jZS0+cG9ydF9yZWcpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTA5MDBfZG9faW9fc2luZ2xlX3dyaXRlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICBpbnQgdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lMDkwMF9kb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdW5zaWduZWQgbG9uZyBzdGF0ZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMDkwMF9kb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCXN0YXRlID0gaW5iKGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCQlzdGF0ZSA9CisJCQkgICAgKCF2YWx1ZSkgPyAoc3RhdGUgfCAoMHgxIDw8IGNoYW5uZWwpKSA6IChzdGF0ZSAmCisJCQkJCQkJCSAgICAgfigweDEgPDwKKwkJCQkJCQkJICAgICAgIGNoYW5uZWwpKTsKKwkJCW91dGIoc3RhdGUsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCW91dGIofih2YWx1ZSksIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lMDkwMF9kb19xdWVyeV9udW1iZXJfY2hhbm5lbHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgIGludCAqbnVtYmVyKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqbnVtYmVyID0gODsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTA5MDBfZG9fcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSp0eXBlID0gTUVfVFlQRV9ETzsKKwkqc3VidHlwZSA9IE1FX1NVQlRZUEVfU0lOR0xFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMDkwMF9kb19xdWVyeV9zdWJkZXZpY2VfY2FwcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwgaW50ICpjYXBzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqY2FwcyA9IDA7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK21lMDkwMF9kb19zdWJkZXZpY2VfdCAqbWUwOTAwX2RvX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBkb19pZHgpCit7CisJbWUwOTAwX2RvX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlICovCisJc3ViZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWUwOTAwX2RvX3N1YmRldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXN1YmRldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1lMDkwMF9kb19zdWJkZXZpY2VfdCkpOworCisJLyogSW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyAqLworCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9ja3MuCisJc3Bpbl9sb2NrX2luaXQoJnN1YmRldmljZS0+c3ViZGV2aWNlX2xvY2spOworCisJLyogU2F2ZSB0aGUgc3ViZGV2aWNlIGluZGV4ICovCisJc3ViZGV2aWNlLT5kb19pZHggPSBkb19pZHg7CisKKwkvKiBJbml0aWFsaXplIHJlZ2lzdGVycyAqLworCWlmIChkb19pZHggPT0gMCkgeworCQlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTA5MDBfQ1RSTF9SRUc7CisJCXN1YmRldmljZS0+cG9ydF9yZWcgPSByZWdfYmFzZSArIE1FMDkwMF9QT1JUX0FfUkVHOworCQlzdWJkZXZpY2UtPmVuYWJsZV9yZWcgPSByZWdfYmFzZSArIE1FMDkwMF9XUklURV9FTkFCTEVfUkVHOworCQlzdWJkZXZpY2UtPmRpc2FibGVfcmVnID0gcmVnX2Jhc2UgKyBNRTA5MDBfV1JJVEVfRElTQUJMRV9SRUc7CisJfSBlbHNlIHsKKwkJc3ViZGV2aWNlLT5jdHJsX3JlZyA9IHJlZ19iYXNlICsgTUUwOTAwX0NUUkxfUkVHOworCQlzdWJkZXZpY2UtPnBvcnRfcmVnID0gcmVnX2Jhc2UgKyBNRTA5MDBfUE9SVF9CX1JFRzsKKwkJc3ViZGV2aWNlLT5lbmFibGVfcmVnID0gcmVnX2Jhc2UgKyBNRTA5MDBfV1JJVEVfRU5BQkxFX1JFRzsKKwkJc3ViZGV2aWNlLT5kaXNhYmxlX3JlZyA9IHJlZ19iYXNlICsgTUUwOTAwX1dSSVRFX0RJU0FCTEVfUkVHOworCX0KKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKyNlbmRpZgorCisJLyogT3ZlcmxvYWQgYmFzZSBjbGFzcyBtZXRob2RzLiAqLworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWUwOTAwX2RvX2lvX3Jlc2V0X3N1YmRldmljZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9jb25maWcgPQorCSAgICBtZTA5MDBfZG9faW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWUwOTAwX2RvX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0KKwkgICAgbWUwOTAwX2RvX2lvX3NpbmdsZV93cml0ZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lMDkwMF9kb19xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lMDkwMF9kb19xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWUwOTAwX2RvX3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCisJcmV0dXJuIHN1YmRldmljZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA5MDBfZG8uaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA5MDBfZG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2U4YThiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDkwMF9kby5oCkBAIC0wLDAgKzEsNjggQEAKKy8qKgorICogQGZpbGUgbWUwOTAwX2RvLmgKKyAqCisgKiBAYnJpZWYgTUUtOXggZGlnaXRhbCBvdXRwdXQgc3ViZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FMDkwMF9ET19IXworI2RlZmluZSBfTUUwOTAwX0RPX0hfCisKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgdGVtcGxhdGUgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTA5MDBfZG9fc3ViZGV2aWNlIHsKKwkvKiBJbmhlcml0YW5jZSAqLworCW1lX3N1YmRldmljZV90IGJhc2U7CQkJLyoqPCBUaGUgc3ViZGV2aWNlIGJhc2UgY2xhc3MuICovCisKKwkvKiBBdHRyaWJ1dGVzICovCisJc3BpbmxvY2tfdCBzdWJkZXZpY2VfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlIHN1YmRldmljZSBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCisJdW5zaWduZWQgaW50IGRvX2lkeDsKKworCXVuc2lnbmVkIGxvbmcgY3RybF9yZWc7CisJdW5zaWduZWQgbG9uZyBwb3J0X3JlZzsKKwl1bnNpZ25lZCBsb25nIGVuYWJsZV9yZWc7CisJdW5zaWduZWQgbG9uZyBkaXNhYmxlX3JlZzsKKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2U7CisjZW5kaWYKK30gbWUwOTAwX2RvX3N1YmRldmljZV90OworCisvKioKKyAqIEBicmllZiBUaGUgY29uc3RydWN0b3IgdG8gZ2VuZXJhdGUgYSBNRS05eCBkaWdpdGFsIG91dHB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gZG9faWR4IFRoZSBpbmRleCBvZiB0aGUgZGlnaXRhbCBvdXRwdXQgc3ViZGV2aWNlIG9uIHRoaXMgZGV2aWNlLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWUwOTAwX2RvX3N1YmRldmljZV90ICptZTA5MDBfZG9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGRvX2lkeCk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwOTAwX3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDkwMF9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmYxNjNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMDkwMF9yZWcuaApAQCAtMCwwICsxLDQwIEBACisvKioKKyAqIEBmaWxlIG1lMDkwMF9yZWcuaAorICoKKyAqIEBicmllZiBNRS05eCByZWdpc3RlciBkZWZpbml0aW9ucy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTA5MDBfUkVHX0hfCisjZGVmaW5lIF9NRTA5MDBfUkVHX0hfCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgTUUwOTAwX1BPUlRfQV9SRUcgICAgICAgICAgMHgwMAorI2RlZmluZSBNRTA5MDBfUE9SVF9CX1JFRyAgICAgICAgICAweDAxCisjZGVmaW5lIE1FMDkwMF9QT1JUX0NfUkVHICAgICAgICAgIDB4MDIKKyNkZWZpbmUgTUUwOTAwX0NUUkxfUkVHICAgICAgICAgICAgMHgwMwkvLyAoICx3KQorI2RlZmluZSBNRTA5MDBfV1JJVEVfRU5BQkxFX1JFRyAgICAweDA0CS8vIChyLHcpCisjZGVmaW5lIE1FMDkwMF9XUklURV9ESVNBQkxFX1JFRyAgIDB4MDgJLy8gKHIsdykKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTEwMDBfZGV2aWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxMDAwX2RldmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NGUyMTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxMDAwX2RldmljZS5jCkBAIC0wLDAgKzEsMjA4IEBACisvKioKKyAqIEBmaWxlIG1lMTAwMF9kZXZpY2UuYworICoKKyAqIEBicmllZiBNRS0xMDAwIGRldmljZSBjbGFzcyBpbXBsZW1lbnRhdGlvbi4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworI2lmbmRlZiBNT0RVTEUKKyMgIGRlZmluZSBNT0RVTEUKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJtZWlkcy5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKyNpbmNsdWRlICJtZWNvbW1vbi5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZWRldmljZS5oIgorI2luY2x1ZGUgIm1lMTAwMF9kZXZpY2UuaCIKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorI2luY2x1ZGUgIm1lMTAwMF9kaW8uaCIKKworc3RhdGljIGludCBtZTEwMDBfY29uZmlnX2xvYWQobWVfZGV2aWNlX3QgKiBtZV9kZXZpY2UsIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCSAgICAgIG1lX2NmZ19kZXZpY2VfZW50cnlfdCAqIGNvbmZpZykKK3sKKwltZTEwMDBfZGV2aWNlX3QgKm1lMTAwMF9kZXZpY2U7CisJbWUxMDAwX2Rpb19zdWJkZXZpY2VfdCAqZGlvOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJbWUxMDAwX2RldmljZSA9IChtZTEwMDBfZGV2aWNlX3QgKikgbWVfZGV2aWNlOworCisJaWYgKGNvbmZpZy0+Y291bnQgPT0gMikgeworCQlpZiAobWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKCZtZTEwMDBfZGV2aWNlLT5iYXNlLnNsaXN0KQorCQkgICAgPT0gMikgeworCQkJLy8gTm90aGluZyB0byBkby4KKwkJfSBlbHNlIHsKKwkJCS8vIFJlbW92ZSAyIGV4dHJhIHN1YmRldmljZXMKKwkJCWRpbyA9CisJCQkgICAgKG1lMTAwMF9kaW9fc3ViZGV2aWNlX3QgKikKKwkJCSAgICBtZV9zbGlzdF9kZWxfc3ViZGV2aWNlX3RhaWwoJm1lMTAwMF9kZXZpY2UtPmJhc2UuCisJCQkJCQkJc2xpc3QpOworCQkJaWYgKGRpbykKKwkJCQlkaW8tPmJhc2UuCisJCQkJICAgIG1lX3N1YmRldmljZV9kZXN0cnVjdG9yKChtZV9zdWJkZXZpY2VfdCAqKQorCQkJCQkJCSAgICBkaW8pOworCisJCQlkaW8gPQorCQkJICAgIChtZTEwMDBfZGlvX3N1YmRldmljZV90ICopCisJCQkgICAgbWVfc2xpc3RfZGVsX3N1YmRldmljZV90YWlsKCZtZTEwMDBfZGV2aWNlLT5iYXNlLgorCQkJCQkJCXNsaXN0KTsKKwkJCWlmIChkaW8pCisJCQkJZGlvLT5iYXNlLgorCQkJCSAgICBtZV9zdWJkZXZpY2VfZGVzdHJ1Y3RvcigobWVfc3ViZGV2aWNlX3QgKikKKwkJCQkJCQkgICAgZGlvKTsKKwkJfQorCX0gZWxzZSBpZiAoY29uZmlnLT5jb3VudCA9PSA0KSB7CisJCS8vQWRkIDIgc3ViZGV2aWNlcworCQlpZiAobWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKCZtZTEwMDBfZGV2aWNlLT5iYXNlLnNsaXN0KQorCQkgICAgPT0gMikgeworCQkJZGlvID0KKwkJCSAgICBtZTEwMDBfZGlvX2NvbnN0cnVjdG9yKG1lMTAwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuCisJCQkJCQkgICByZWdfYmFzZXNbMl0sIDIsCisJCQkJCQkgICAmbWUxMDAwX2RldmljZS0+Y3RybF9sb2NrKTsKKwkJCWlmICghZGlvKSB7CisJCQkJUEVSUk9SKCJDYW5ub3QgY3JlYXRlIGRpbyBzdWJkZXZpY2UuXG4iKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisJCQl9CisJCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lMTAwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCQkgICAgKG1lX3N1YmRldmljZV90ICopIGRpbyk7CisKKwkJCWRpbyA9CisJCQkgICAgbWUxMDAwX2Rpb19jb25zdHJ1Y3RvcihtZTEwMDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLgorCQkJCQkJICAgcmVnX2Jhc2VzWzJdLCAzLAorCQkJCQkJICAgJm1lMTAwMF9kZXZpY2UtPmN0cmxfbG9jayk7CisJCQlpZiAoIWRpbykgeworCQkJCWRpbyA9CisJCQkJICAgIChtZTEwMDBfZGlvX3N1YmRldmljZV90ICopCisJCQkJICAgIG1lX3NsaXN0X2RlbF9zdWJkZXZpY2VfdGFpbCgmbWUxMDAwX2RldmljZS0+CisJCQkJCQkJCWJhc2Uuc2xpc3QpOworCQkJCWlmIChkaW8pCisJCQkJCWRpby0+YmFzZS4KKwkJCQkJICAgIG1lX3N1YmRldmljZV9kZXN0cnVjdG9yKChtZV9zdWJkZXZpY2VfdCAqKSBkaW8pOworCisJCQkJUEVSUk9SKCJDYW5ub3QgY3JlYXRlIGRpbyBzdWJkZXZpY2UuXG4iKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisJCQl9CisJCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lMTAwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCQkgICAgKG1lX3N1YmRldmljZV90ICopIGRpbyk7CisJCX0gZWxzZSB7CisJCQkvLyBOb3RoaW5nIHRvIGRvLgorCQl9CisJfSBlbHNlIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNvbmZpZ3VyYXRpb24uXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCittZV9kZXZpY2VfdCAqbWUxMDAwX3BjaV9jb25zdHJ1Y3RvcihzdHJ1Y3QgcGNpX2RldiAqIHBjaV9kZXZpY2UpCit7CisJbWUxMDAwX2RldmljZV90ICptZTEwMDBfZGV2aWNlOworCW1lX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKwlpbnQgaTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vIEFsbG9jYXRlIHN0cnVjdHVyZSBmb3IgZGV2aWNlIGluc3RhbmNlLgorCW1lMTAwMF9kZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTEwMDBfZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghbWUxMDAwX2RldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBNRS0xMDAwIGRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQobWUxMDAwX2RldmljZSwgMCwgc2l6ZW9mKG1lMTAwMF9kZXZpY2VfdCkpOworCisJLy8gSW5pdGlhbGl6ZSBiYXNlIGNsYXNzIHN0cnVjdHVyZS4KKwllcnIgPSBtZV9kZXZpY2VfcGNpX2luaXQoKG1lX2RldmljZV90ICopIG1lMTAwMF9kZXZpY2UsIHBjaV9kZXZpY2UpOworCisJaWYgKGVycikgeworCQlrZnJlZShtZTEwMDBfZGV2aWNlKTsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBkZXZpY2UgYmFzZSBjbGFzcy5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2sgLgorCXNwaW5fbG9ja19pbml0KCZtZTEwMDBfZGV2aWNlLT5jdHJsX2xvY2spOworCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlzdWJkZXZpY2UgPQorCQkgICAgKG1lX3N1YmRldmljZV90ICopIG1lMTAwMF9kaW9fY29uc3RydWN0b3IobWUxMDAwX2RldmljZS0+CisJCQkJCQkJICAgICAgYmFzZS5pbmZvLnBjaS4KKwkJCQkJCQkgICAgICByZWdfYmFzZXNbMl0sIGksCisJCQkJCQkJICAgICAgJm1lMTAwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgIGN0cmxfbG9jayk7CisKKwkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lMTAwMF9kZXZpY2UpOworCQkJa2ZyZWUobWUxMDAwX2RldmljZSk7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTEwMDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkgICAgc3ViZGV2aWNlKTsKKwl9CisKKwkvLyBPdmVyd3JpdGUgYmFzZSBjbGFzcyBtZXRob2RzLgorCW1lMTAwMF9kZXZpY2UtPmJhc2UubWVfZGV2aWNlX2NvbmZpZ19sb2FkID0gbWUxMDAwX2NvbmZpZ19sb2FkOworCisJcmV0dXJuIChtZV9kZXZpY2VfdCAqKSBtZTEwMDBfZGV2aWNlOworfQorCisvLyBJbml0IGFuZCBleGl0IG9mIG1vZHVsZS4KK3N0YXRpYyBpbnQgX19pbml0IG1lMTAwMF9pbml0KHZvaWQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbWUxMDAwX2V4aXQodm9pZCkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7Cit9CisKK21vZHVsZV9pbml0KG1lMTAwMF9pbml0KTsKK21vZHVsZV9leGl0KG1lMTAwMF9leGl0KTsKKworLy8gQWRtaW5pc3RyYXRpdmUgc3R1ZmYgZm9yIG1vZGluZm8uCitNT0RVTEVfQVVUSE9SCisgICAgKCJHdWVudGVyIEdlYmhhcmR0IDxnLmdlYmhhcmR0QG1laWxoYXVzLmRlPiAmIEtyenlzenRvZiBHYW50emtlIDxrLmdhbnR6a2VAbWVpbGhhdXMuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRldmljZSBEcml2ZXIgTW9kdWxlIGZvciBNZWlsaGF1cyBNRS0xMDAwIERldmljZXMiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJNZWlsaGF1cyBNRS0xMDAwIERpZ2l0YWwgSS9PIERldmljZXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLy8gRXhwb3J0IHRoZSBjb25zdHJ1Y3Rvci4KK0VYUE9SVF9TWU1CT0wobWUxMDAwX3BjaV9jb25zdHJ1Y3Rvcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxMDAwX2RldmljZS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTAwMF9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmJlMTI2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTAwMF9kZXZpY2UuaApAQCAtMCwwICsxLDU5IEBACisvKioKKyAqIEBmaWxlIG1lMTAwMF9kZXZpY2UuaAorICoKKyAqIEBicmllZiBNRS0xMDAwIGRldmljZSBjbGFzcyBpbnN0YW5jZS4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTEwMDBfSF8KKyNkZWZpbmUgX01FMTAwMF9IXworCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgTUUxMDAwX01BR0lDX05VTUJFUgkxMDAwCisKKy8qKgorICogQGJyaWVmIFRoZSBNRS0xMDAwIGRldmljZSBjbGFzcyBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lMTAwMF9kZXZpY2UgeworCW1lX2RldmljZV90IGJhc2U7CQkvKio8IFRoZSBNZWlsaGF1cyBkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKwlzcGlubG9ja190IGN0cmxfbG9jazsJCS8qKjwgR3VhcmRzIHRoZSBESU8gbW9kZSByZWdpc3Rlci4gKi8KK30gbWUxMDAwX2RldmljZV90OworCisvKioKKyAqIEBicmllZiBUaGUgTUUtMTAwMCBkZXZpY2UgY2xhc3MgY29uc3RydWN0b3IuCisgKgorICogQHBhcmFtIHBjaV9kZXZpY2UgVGhlIHBjaSBkZXZpY2Ugc3RydWN0dXJlIGdpdmVuIGJ5IHRoZSBQQ0kgc3Vic3lzdGVtLgorICoKKyAqIEByZXR1cm4gT24gc3VjY2VzIGEgbmV3IE1FLTEwMDAgZGV2aWNlIGluc3RhbmNlLiBcbgorICogICAgICAgICBOVUxMIG9uIGVycm9yLgorICovCittZV9kZXZpY2VfdCAqbWUxMDAwX3BjaV9jb25zdHJ1Y3RvcihzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldmljZSkKKyAgICBfX2F0dHJpYnV0ZV9fICgod2VhaykpOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTAwMF9kaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTEwMDBfZGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc2MDVhOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTEwMDBfZGlvLmMKQEAgLTAsMCArMSw0MzggQEAKKy8qKgorICogQGZpbGUgbWUxMDAwX2Rpby5jCisgKgorICogQGJyaWVmIE1FLTEwMDAgRElPIHN1YmRldmljZSBpbnN0YW5jZS4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNiBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworLyoKKyAqIEluY2x1ZGVzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorI2luY2x1ZGUgIm1lZGVidWcuaCIKKworI2luY2x1ZGUgIm1lMTAwMF9kaW9fcmVnLmgiCisjaW5jbHVkZSAibWUxMDAwX2Rpby5oIgorCisvKgorICogRGVmaW5lcworICovCisjZGVmaW5lIE1FMTAwMF9ESU9fTUFHSUNfTlVNQkVSCTB4MTAwMAkvKio8IFRoZSBtYWdpYyBudW1iZXIgb2YgdGhlIGNsYXNzIHN0cnVjdHVyZS4gKi8KKworLyoKKyAqIEZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbnQgbWUxMDAwX2Rpb19pb19yZXNldF9zdWJkZXZpY2Uoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisJbWUxMDAwX2Rpb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdWludDMyX3QgdG1wOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUxMDAwX2Rpb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCXRtcCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCXRtcCAmPSB+KDB4MSA8PCBpbnN0YW5jZS0+ZGlvX2lkeCk7CisJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCisJb3V0bCgweDAwMDAwMDAwLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUxMDAwX2Rpb19pb19zaW5nbGVfY29uZmlnKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICAgaW50IHNpbmdsZV9jb25maWcsCisJCQkJICAgICAgIGludCByZWYsCisJCQkJICAgICAgIGludCB0cmlnX2NoYW4sCisJCQkJICAgICAgIGludCB0cmlnX3R5cGUsIGludCB0cmlnX2VkZ2UsIGludCBmbGFncykKK3sKKwltZTEwMDBfZGlvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwlpbnQgY3RybDsKKwlpbnQgc2l6ZSA9CisJICAgIGZsYWdzICYgKE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0JJVCB8IE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0JZVEUKKwkJICAgICB8IE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX1dPUkQgfAorCQkgICAgIE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0RXT1JEKTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMTAwMF9kaW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCisJc3dpdGNoIChzaXplKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fRFdPUkQ6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCWlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfRElPX0lOUFVUKSB7CisJCQkJY3RybCAmPSB+KDB4MSA8PCBpbnN0YW5jZS0+ZGlvX2lkeCk7CisJCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fT1VUUFVUKSB7CisJCQkJY3RybCB8PSAweDEgPDwgaW5zdGFuY2UtPmRpb19pZHg7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiSW52YWxpZCBwb3J0IGRpcmVjdGlvbi5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKCFlcnIpIHsKKwkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwl9CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lMTAwMF9kaW9faW9fc2luZ2xlX3JlYWQoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTEwMDBfZGlvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMTAwMF9kaW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CSVQ6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDMyKSkgeworCQkJKnZhbHVlID0gaW5sKGluc3RhbmNlLT5wb3J0X3JlZykgJiAoMHgxIDw8IGNoYW5uZWwpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJpdCBudW1iZXIuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDQpKSB7CisJCQkqdmFsdWUgPQorCQkJICAgIChpbmwoaW5zdGFuY2UtPnBvcnRfcmVnKSA+PiAoY2hhbm5lbCAqIDgpKSAmIDB4RkY7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX1dPUkQ6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDIpKSB7CisJCQkqdmFsdWUgPQorCQkJICAgIChpbmwoaW5zdGFuY2UtPnBvcnRfcmVnKSA+PiAoY2hhbm5lbCAqIDE2KSkgJgorCQkJICAgIDB4RkZGRjsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCB3b3JkIG51bWJlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fRFdPUkQ6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCSp2YWx1ZSA9IGlubChpbnN0YW5jZS0+cG9ydF9yZWcpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGR3b3JkIG51bWJlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTEwMDBfZGlvX2lvX3NpbmdsZV93cml0ZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCB2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWUxMDAwX2Rpb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdWludDMyX3QgY29uZmlnOworCXVpbnQzMl90IHN0YXRlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUxMDAwX2Rpb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVIgc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJY29uZmlnID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZykgJiAoMHgxIDw8IGluc3RhbmNlLT5kaW9faWR4KTsKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQklUOgorCQlpZiAoKGNoYW5uZWwgPj0gMCkgJiYgKGNoYW5uZWwgPCAzMikpIHsKKwkJCWlmIChjb25maWcpIHsKKwkJCQlzdGF0ZSA9IGlubChpbnN0YW5jZS0+cG9ydF9yZWcpOworCQkJCXN0YXRlID0KKwkJCQkgICAgdmFsdWUgPyAoc3RhdGUgfCAoMHgxIDw8IGNoYW5uZWwpKSA6IChzdGF0ZQorCQkJCQkJCQkJICAmCisJCQkJCQkJCQkgIH4oMHgxCisJCQkJCQkJCQkgICAgPDwKKwkJCQkJCQkJCSAgICBjaGFubmVsKSk7CisJCQkJb3V0bChzdGF0ZSwgaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJCQlQREVCVUdfUkVHKCJwb3J0X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJCSAgIGluc3RhbmNlLT5wb3J0X3JlZyAtCisJCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwgc3RhdGUpOworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IoIlBvcnQgaXMgbm90IGluIG91dHB1dCBtb2RlLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJpdCBudW1iZXIuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDQpKSB7CisJCQlpZiAoY29uZmlnKSB7CisJCQkJc3RhdGUgPSBpbmwoaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJCQlzdGF0ZSAmPSB+KDB4RkYgPDwgKGNoYW5uZWwgKiA4KSk7CisJCQkJc3RhdGUgfD0gKHZhbHVlICYgMHhGRikgPDwgKGNoYW5uZWwgKiA4KTsKKwkJCQlvdXRsKHN0YXRlLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCQkJCVBERUJVR19SRUcoInBvcnRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkJICAgaW5zdGFuY2UtPnBvcnRfcmVnIC0KKwkJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLCBzdGF0ZSk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiUG9ydCBpcyBub3QgaW4gb3V0cHV0IG1vZGUuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX1dPUkQ6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDIpKSB7CisJCQlpZiAoY29uZmlnKSB7CisJCQkJc3RhdGUgPSBpbmwoaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJCQlzdGF0ZSAmPSB+KDB4RkZGRiA8PCAoY2hhbm5lbCAqIDE2KSk7CisJCQkJc3RhdGUgfD0gKHZhbHVlICYgMHhGRkZGKSA8PCAoY2hhbm5lbCAqIDE2KTsKKwkJCQlvdXRsKHN0YXRlLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCQkJCVBERUJVR19SRUcoInBvcnRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkJICAgaW5zdGFuY2UtPnBvcnRfcmVnIC0KKwkJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLCBzdGF0ZSk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiUG9ydCBpcyBub3QgaW4gb3V0cHV0IG1vZGUuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgd29yZCBudW1iZXIuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0RXT1JEOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQlpZiAoY29uZmlnKSB7CisJCQkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJCQlQREVCVUdfUkVHKCJwb3J0X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJCSAgIGluc3RhbmNlLT5wb3J0X3JlZyAtCisJCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwgdmFsdWUpOworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IoIlBvcnQgaXMgbm90IGluIG91dHB1dCBtb2RlLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGR3b3JkIG51bWJlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWUxMDAwX2Rpb19xdWVyeV9udW1iZXJfY2hhbm5lbHMoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgICAgaW50ICpudW1iZXIpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpudW1iZXIgPSBNRTEwMDBfRElPX05VTUJFUl9DSEFOTkVMUzsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTEwMDBfZGlvX3F1ZXJ5X3N1YmRldmljZV90eXBlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSp0eXBlID0gTUVfVFlQRV9ESU87CisJKnN1YnR5cGUgPSBNRV9TVUJUWVBFX1NJTkdMRTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTEwMDBfZGlvX3F1ZXJ5X3N1YmRldmljZV9jYXBzKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgaW50ICpjYXBzKQoreworCW1lMTAwMF9kaW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUxMDAwX2Rpb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwkqY2FwcyA9IE1FX0NBUFNfRElPX0RJUl9EV09SRDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCittZTEwMDBfZGlvX3N1YmRldmljZV90ICptZTEwMDBfZGlvX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IGRpb19pZHgsCisJCQkJCSAgICAgICBzcGlubG9ja190ICogY3RybF9yZWdfbG9jaykKK3sKKwltZTEwMDBfZGlvX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlICovCisJc3ViZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWUxMDAwX2Rpb19zdWJkZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFzdWJkZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3IgTUUtMTAwMCBESU8gaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1lMTAwMF9kaW9fc3ViZGV2aWNlX3QpKTsKKworCS8qIENoZWNrIGlmIGNvdW50ZXIgaW5kZXggaXMgb3V0IG9mIHJhbmdlICovCisKKwlpZiAoZGlvX2lkeCA+PSBNRTEwMDBfRElPX05VTUJFUl9QT1JUUykgeworCQlQRVJST1IoIkRJTyBpbmRleCBpcyBvdXQgb2YgcmFuZ2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogSW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyAqLworCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9ja3MuCisJc3Bpbl9sb2NrX2luaXQoJnN1YmRldmljZS0+c3ViZGV2aWNlX2xvY2spOworCXN1YmRldmljZS0+Y3RybF9yZWdfbG9jayA9IGN0cmxfcmVnX2xvY2s7CisKKwkvKiBTYXZlIHRoZSBESU8gaW5kZXggKi8KKwlzdWJkZXZpY2UtPmRpb19pZHggPSBkaW9faWR4OworCisJLyogSW5pdGlhbGl6ZSByZWdpc3RlcnMuICovCisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwlzdWJkZXZpY2UtPnJlZ19iYXNlID0gcmVnX2Jhc2U7CisjZW5kaWYKKwlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTEwMDBfUE9SVF9NT0RFOworCXN1YmRldmljZS0+cG9ydF9yZWcgPQorCSAgICByZWdfYmFzZSArIE1FMTAwMF9QT1JUICsgKGRpb19pZHggKiBNRTEwMDBfUE9SVF9TVEVQKTsKKworCS8qIE92ZXJyaWRlIGJhc2UgY2xhc3MgbWV0aG9kcy4gKi8KKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSA9CisJICAgIG1lMTAwMF9kaW9faW9fcmVzZXRfc3ViZGV2aWNlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX2NvbmZpZyA9CisJICAgIG1lMTAwMF9kaW9faW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWUxMDAwX2Rpb19pb19zaW5nbGVfcmVhZDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV93cml0ZSA9CisJICAgIG1lMTAwMF9kaW9faW9fc2luZ2xlX3dyaXRlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWUxMDAwX2Rpb19xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lMTAwMF9kaW9fcXVlcnlfc3ViZGV2aWNlX3R5cGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyA9CisJICAgIG1lMTAwMF9kaW9fcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisKKwlyZXR1cm4gc3ViZGV2aWNlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTAwMF9kaW8uaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTEwMDBfZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI2ZTkzZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTEwMDBfZGlvLmgKQEAgLTAsMCArMSw3MSBAQAorLyoqCisgKiBAZmlsZSBtZTEwMDBfZGlvLmgKKyAqCisgKiBAYnJpZWYgTWVpbGhhdXMgTUUtMTAwMCBkaWdpdGFsIGkvbyBpbXBsZW1lbnRhdGlvbi4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTEwMDBfRElPX0hfCisjZGVmaW5lIF9NRTEwMDBfRElPX0hfCisKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorI2luY2x1ZGUgIm1lc2xvY2suaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgVGhlIE1FLTEwMDAgRElPIHN1YmRldmljZSBjbGFzcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWUxMDAwX2Rpb19zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKy8vICAgICAgdWludDMyX3QgbWFnaWM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgbWFnaWMgbnVtYmVyIHVuaXF1ZSBmb3IgdGhpcyBzdHJ1Y3R1cmUuICovCisKKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJc3BpbmxvY2tfdCAqY3RybF9yZWdfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgI2N0cmxfcmVnIGFuZCAjY3RybF9yZWdfbWlycm9yIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJaW50IGRpb19pZHg7CQkJCQkvKio8IFRoZSBpbmRleCBvZiB0aGUgRElPIHBvcnQgb24gdGhlIGRldmljZS4gKi8KKworCXVuc2lnbmVkIGxvbmcgcG9ydF9yZWc7CQkJLyoqPCBSZWdpc3RlciB0byByZWFkIG9yIHdyaXRlIGEgdmFsdWUgZnJvbSBvciB0byB0aGUgcG9ydCByZXNwZWN0aXZlbHkuICovCisJdW5zaWduZWQgbG9uZyBjdHJsX3JlZzsJCQkvKio8IFJlZ2lzdGVyIHRvIGNvbmZpZ3VyZSB0aGUgRElPIG1vZGVzLiAqLworI2lmZGVmIE1FREVCVUdfREVCVUdfUkVHCisJdW5zaWduZWQgbG9uZyByZWdfYmFzZTsKKyNlbmRpZgorfSBtZTEwMDBfZGlvX3N1YmRldmljZV90OworCisvKioKKyAqIEBicmllZiBUaGUgY29uc3RydWN0b3IgdG8gZ2VuZXJhdGUgYSBNRS0xMDAwIERJTyBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gcmVnX2Jhc2UgVGhlIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGFzIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUy4KKyAqIEBwYXJhbSBkaW9faWR4IFRoZSBpbmRleCBvZiB0aGUgRElPIG9uIHRoZSBkZXZpY2UuCisgKiBAcGFyYW0gY3RybF9yZWdfbG9jayBQb2ludGVyIHRvIHNwaW4gbG9jayBwcm90ZWN0aW5nIHRoZSBjb250cm9sIHJlZ2lzdGVyIGFuZCBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWUxMDAwX2Rpb19zdWJkZXZpY2VfdCAqbWUxMDAwX2Rpb19jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCBkaW9faWR4LAorCQkJCQkgICAgICAgc3BpbmxvY2tfdCAqIGN0cmxfcmVnX2xvY2spOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTAwMF9kaW9fcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxMDAwX2Rpb19yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDViMzhkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTAwMF9kaW9fcmVnLmgKQEAgLTAsMCArMSw1MCBAQAorLyoqCisgKiBAZmlsZSBtZTEwMDBfZGlvX3JlZy5oCisgKgorICogQGJyaWVmIE1FLTEwMDAgZGlnaXRhbCBpL28gcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUUxMDAwX0RJT19SRUdfSF8KKyMgZGVmaW5lIF9NRTEwMDBfRElPX1JFR19IXworCisjIGlmZGVmIF9fS0VSTkVMX18KKworIyBkZWZpbmUgTUUxMDAwX0RJT19OVU1CRVJfQ0hBTk5FTFMJMzIJCQkJLyoqPCBUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIHBlciBESU8gcG9ydC4gKi8KKyMgZGVmaW5lIE1FMTAwMF9ESU9fTlVNQkVSX1BPUlRTCTQJCQkJLyoqPCBUaGUgbnVtYmVyIG9mIHBvcnRzIHBlciBNRS0xMDAwLiAqLworCisvLyAjIGRlZmluZSBNRTEwMDBfUE9SVF9BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMCAgICAgICAgICAgICAgICAgIC8qKjwgUG9ydCBBIGJhc2UgcmVnaXN0ZXIgb2Zmc2V0LiAqLworLy8gIyBkZWZpbmUgTUUxMDAwX1BPUlRfQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgICAgICAgICAgICAgICAgICAvKio8IFBvcnQgQiBiYXNlIHJlZ2lzdGVyIG9mZnNldC4gKi8KKy8vICMgZGVmaW5lIE1FMTAwMF9QT1JUX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAgICAgICAgICAgICAgICAgLyoqPCBQb3J0IEMgYmFzZSByZWdpc3RlciBvZmZzZXQuICovCisvLyAjIGRlZmluZSBNRTEwMDBfUE9SVF9EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwQyAgICAgICAgICAgICAgICAgIC8qKjwgUG9ydCBEIGJhc2UgcmVnaXN0ZXIgb2Zmc2V0LiAqLworIyBkZWZpbmUgTUUxMDAwX1BPUlQJCQkJMHgwMDAwCQkJLyoqPCBCYXNlIGZvciBwb3J0J3MgcmVnaXN0ZXIuICovCisjIGRlZmluZSBNRTEwMDBfUE9SVF9TVEVQCQkJNAkJCQkvKio8IERpc3RhbmNlIGJldHdlZW4gcG9ydCdzIHJlZ2lzdGVyLiAqLworCisjIGRlZmluZSBNRTEwMDBfUE9SVF9NT0RFCQkJMHgwMDEwCQkJLyoqPCBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIHRvIHN3aXRjaCB0aGUgcG9ydCBkaXJlY3Rpb24uICovCisvLyAjIGRlZmluZSBNRTEwMDBfUE9SVF9NT0RFX09VVFBVVF9BICAgKDEgPDwgMCkgICAgICAgICAgICAgICAgLyoqPCBJZiBzZXQsIHBvcnQgQSBpcyBpbiBvdXRwdXQsIG90aGVyd2lzZSBpbiBpbnB1dCBtb2RlLiAqLworLy8gIyBkZWZpbmUgTUUxMDAwX1BPUlRfTU9ERV9PVVRQVVRfQiAgICgxIDw8IDEpICAgICAgICAgICAgICAgIC8qKjwgSWYgc2V0LCBwb3J0IEIgaXMgaW4gb3V0cHV0LCBvdGhlcndpc2UgaW4gaW5wdXQgbW9kZS4gKi8KKy8vICMgZGVmaW5lIE1FMTAwMF9QT1JUX01PREVfT1VUUFVUX0MgICAoMSA8PCAyKSAgICAgICAgICAgICAgICAvKio8IElmIHNldCwgcG9ydCBDIGlzIGluIG91dHB1dCwgb3RoZXJ3aXNlIGluIGlucHV0IG1vZGUuICovCisvLyAjIGRlZmluZSBNRTEwMDBfUE9SVF9NT0RFX09VVFBVVF9EICAgKDEgPDwgMykgICAgICAgICAgICAgICAgLyoqPCBJZiBzZXQsIHBvcnQgRCBpcyBpbiBvdXRwdXQsIG90aGVyd2lzZSBpbiBpbnB1dCBtb2RlLiAqLworCisjIGVuZGlmCS8vX19LRVJORUxfXworI2VuZGlmIC8vX01FMTAwMF9ESU9fUkVHX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNDAwX2RldmljZS5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTQwMF9kZXZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTViYjRmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTQwMF9kZXZpY2UuYwpAQCAtMCwwICsxLDI1NiBAQAorLyoqCisgKiBAZmlsZSBtZTE0MDBfZGV2aWNlLmMKKyAqCisgKiBAYnJpZWYgTUUtMTQwMCBkZXZpY2UgaW5zdGFuY2UuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworLyoKKyAqIFVzZXIgYXBwbGljYXRpb24gY291bGQgYWxzbyBpbmNsdWRlIHRoZSBrZXJuZWwgaGVhZGVyIGZpbGVzLiBCdXQgdGhlCisgKiByZWFsIGtlcm5lbCBmdW5jdGlvbnMgYXJlIHByb3RlY3RlZCBieSAjaWZkZWYgX19LRVJORUxfXy4KKyAqLworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKy8qCisgKiBUaGlzIG11c3QgYmUgZGVmaW5lZCBiZWZvcmUgbW9kdWxlLmggaXMgaW5jbHVkZWQuIE5vdCBuZWVkZWQsIHdoZW4KKyAqIGl0IGlzIGEgYnVpbHQgaW4gZHJpdmVyLgorICovCisjaWZuZGVmIE1PRFVMRQorIyAgZGVmaW5lIE1PRFVMRQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2luY2x1ZGUgIm1laWRzLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorI2luY2x1ZGUgIm1lY29tbW9uLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorCisjaW5jbHVkZSAibWUxNDAwX2RldmljZS5oIgorI2luY2x1ZGUgIm1lODI1NC5oIgorI2luY2x1ZGUgIm1lODI1NF9yZWcuaCIKKyNpbmNsdWRlICJtZTgyNTUuaCIKKyNpbmNsdWRlICJtZTE0MDBfZXh0X2lycS5oIgorCittZV9kZXZpY2VfdCAqbWUxNDAwX3BjaV9jb25zdHJ1Y3RvcihzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldmljZSkKK3sKKwlpbnQgZXJyOworCW1lMTQwMF9kZXZpY2VfdCAqbWUxNDAwX2RldmljZTsKKwltZV9zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCXVuc2lnbmVkIGludCB2ZXJzaW9uX2lkeDsKKwl1bnNpZ25lZCBpbnQgbWU4MjU1X2lkeDsKKwl1bnNpZ25lZCBpbnQgZGlvX2lkeDsKKwl1bnNpZ25lZCBpbnQgbWU4MjU0X2lkeDsKKwl1bnNpZ25lZCBpbnQgY3RyX2lkeDsKKwl1bnNpZ25lZCBpbnQgZXh0X2lycV9pZHg7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBBbGxvY2F0ZSBzdHJ1Y3R1cmUgZm9yIGRldmljZSBpbnN0YW5jZS4KKwltZTE0MDBfZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWUxNDAwX2RldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIW1lMTQwMF9kZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3IgMTQwMGF0ZSBkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KG1lMTQwMF9kZXZpY2UsIDAsIHNpemVvZihtZTE0MDBfZGV2aWNlX3QpKTsKKworCS8vIEluaXRpYWxpemUgYmFzZSBjbGFzcyBzdHJ1Y3R1cmUuCisJZXJyID0gbWVfZGV2aWNlX3BjaV9pbml0KChtZV9kZXZpY2VfdCAqKSBtZTE0MDBfZGV2aWNlLCBwY2lfZGV2aWNlKTsKKworCWlmIChlcnIpIHsKKwkJa2ZyZWUobWUxNDAwX2RldmljZSk7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgZGV2aWNlIGJhc2UgY2xhc3MuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogQ2hlY2sgZm9yIE1FMTQwMCBleHRlbnNpb24gZGV2aWNlLiBJZiBkZXRlY3RlZCB3ZSBmYWtlIGEgTUUtMTQwMCBEIGRldmljZSBpZC4gKi8KKwlpZiAobWUxNDAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS5kZXZpY2VfaWQgPT0KKwkgICAgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEMpIHsKKwkJdWludDhfdCBjdHJsOworCQljdHJsID0KKwkJICAgIGluYihtZTE0MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLnJlZ19iYXNlc1syXSArCisJCQlNRTE0MDBEX0NMS19TUkNfMl9SRUcpOworCQlQREVCVUdfUkVHKCJ4eHhfcmVnIGluYigweCVYKzB4JVgpPTB4JXhcbiIsCisJCQkgICBtZTE0MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLnJlZ19iYXNlc1syXSwKKwkJCSAgIE1FMTQwMERfQ0xLX1NSQ18yX1JFRywgY3RybCk7CisJCW91dGIoY3RybCB8IDB4RjAsCisJCSAgICAgbWUxNDAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS5yZWdfYmFzZXNbMl0gKworCQkgICAgIE1FMTQwMERfQ0xLX1NSQ18yX1JFRyk7CisJCVBERUJVR19SRUcoInh4eF9yZWcgb3V0YigweCVYKzB4JVgpPTB4JXhcbiIsCisJCQkgICBtZTE0MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLnJlZ19iYXNlc1syXSwKKwkJCSAgIE1FMTQwMERfQ0xLX1NSQ18yX1JFRywgY3RybCB8IDB4RjApOworCQljdHJsID0KKwkJICAgIGluYihtZTE0MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLnJlZ19iYXNlc1syXSArCisJCQlNRTE0MDBEX0NMS19TUkNfMl9SRUcpOworCQlQREVCVUdfUkVHKCJ4eHhfcmVnIGluYigweCVYKzB4JVgpPTB4JXhcbiIsCisJCQkgICBtZTE0MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLnJlZ19iYXNlc1syXSwKKwkJCSAgIE1FMTQwMERfQ0xLX1NSQ18yX1JFRywgY3RybCk7CisKKwkJaWYgKChjdHJsICYgMHhGMCkgPT0gMHhGMCkgeworCQkJUElORk8oIk1FMTQwMCBEIGRldGVjdGVkLlxuIik7CisJCQltZTE0MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLmRldmljZV9pZCA9CisJCQkgICAgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEQ7CisJCX0KKwl9CisKKwkvKiBJbml0aWFsaXplIGdsb2JhbCBzdHVmZiBvZiBkaWdpdGFsIGkvbyBzdWJkZXZpY2VzLiAqLworCWZvciAobWU4MjU1X2lkeCA9IDA7IG1lODI1NV9pZHggPCBNRTE0MDBfTUFYXzgyNTU7IG1lODI1NV9pZHgrKykgeworCQltZTE0MDBfZGV2aWNlLT5kaW9fY3VycmVudF9tb2RlW21lODI1NV9pZHhdID0gMDsKKwkJc3Bpbl9sb2NrX2luaXQoJm1lMTQwMF9kZXZpY2UtPmRpb19jdHJsX3JlZ19sb2NrW21lODI1NV9pZHhdKTsKKwl9CisKKwkvKiBJbml0aWFsaXplIGdsb2JhbCBzdHVmZiBvZiBjb3VudGVyIHN1YmRldmljZXMuICovCisJc3Bpbl9sb2NrX2luaXQoJm1lMTQwMF9kZXZpY2UtPmNsa19zcmNfcmVnX2xvY2spOworCisJZm9yIChtZTgyNTRfaWR4ID0gMDsgbWU4MjU0X2lkeCA8IE1FMTQwMF9NQVhfODI1NDsgbWU4MjU0X2lkeCsrKQorCQlzcGluX2xvY2tfaW5pdCgmbWUxNDAwX2RldmljZS0+Y3RyX2N0cmxfcmVnX2xvY2tbbWU4MjU0X2lkeF0pOworCisJLyogR2V0IHRoZSBpbmRleCBpbiB0aGUgZGV2aWNlIHZlcnNpb24gaW5mb3JtYXRpb24gdGFibGUuICovCisJdmVyc2lvbl9pZHggPQorCSAgICBtZTE0MDBfdmVyc2lvbnNfZ2V0X2RldmljZV9pbmRleChtZTE0MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLgorCQkJCQkgICAgIGRldmljZV9pZCk7CisKKwkvKiBHZW5lcmF0ZSBESU8gc3ViZGV2aWNlIGluc3RhbmNlcy4gKi8KKwlmb3IgKG1lODI1NV9pZHggPSAwOworCSAgICAgbWU4MjU1X2lkeCA8IG1lMTQwMF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0uZGlvX2NoaXBzOworCSAgICAgbWU4MjU1X2lkeCsrKSB7CisJCWZvciAoZGlvX2lkeCA9IDA7IGRpb19pZHggPCAzOyBkaW9faWR4KyspIHsKKwkJCXN1YmRldmljZSA9CisJCQkgICAgKG1lX3N1YmRldmljZV90ICopCisJCQkgICAgbWU4MjU1X2NvbnN0cnVjdG9yKG1lMTQwMF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0uCisJCQkJCSAgICAgICBkZXZpY2VfaWQsCisJCQkJCSAgICAgICBtZTE0MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLgorCQkJCQkgICAgICAgcmVnX2Jhc2VzWzJdLCBtZTgyNTVfaWR4LAorCQkJCQkgICAgICAgZGlvX2lkeCwKKwkJCQkJICAgICAgICZtZTE0MDBfZGV2aWNlLT4KKwkJCQkJICAgICAgIGRpb19jdXJyZW50X21vZGVbbWU4MjU1X2lkeF0sCisJCQkJCSAgICAgICAmbWUxNDAwX2RldmljZS0+CisJCQkJCSAgICAgICBkaW9fY3RybF9yZWdfbG9ja1ttZTgyNTVfaWR4XSk7CisKKwkJCWlmICghc3ViZGV2aWNlKSB7CisJCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWUxNDAwX2RldmljZSk7CisJCQkJa2ZyZWUobWUxNDAwX2RldmljZSk7CisJCQkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlLlxuIik7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisKKwkJCW1lX3NsaXN0X2FkZF9zdWJkZXZpY2VfdGFpbCgmbWUxNDAwX2RldmljZS0+YmFzZS5zbGlzdCwKKwkJCQkJCSAgICBzdWJkZXZpY2UpOworCQl9CisJfQorCisJLyogR2VuZXJhdGUgY291bnRlciBzdWJkZXZpY2UgaW5zdGFuY2VzLiAqLworCWZvciAobWU4MjU0X2lkeCA9IDA7CisJICAgICBtZTgyNTRfaWR4IDwgbWUxNDAwX3ZlcnNpb25zW3ZlcnNpb25faWR4XS5jdHJfY2hpcHM7CisJICAgICBtZTgyNTRfaWR4KyspIHsKKwkJZm9yIChjdHJfaWR4ID0gMDsgY3RyX2lkeCA8IDM7IGN0cl9pZHgrKykgeworCQkJc3ViZGV2aWNlID0KKwkJCSAgICAobWVfc3ViZGV2aWNlX3QgKikKKwkJCSAgICBtZTgyNTRfY29uc3RydWN0b3IobWUxNDAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS4KKwkJCQkJICAgICAgIGRldmljZV9pZCwKKwkJCQkJICAgICAgIG1lMTQwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuCisJCQkJCSAgICAgICByZWdfYmFzZXNbMl0sIG1lODI1NF9pZHgsCisJCQkJCSAgICAgICBjdHJfaWR4LAorCQkJCQkgICAgICAgJm1lMTQwMF9kZXZpY2UtPgorCQkJCQkgICAgICAgY3RyX2N0cmxfcmVnX2xvY2tbbWU4MjU0X2lkeF0sCisJCQkJCSAgICAgICAmbWUxNDAwX2RldmljZS0+CisJCQkJCSAgICAgICBjbGtfc3JjX3JlZ19sb2NrKTsKKworCQkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCQltZV9kZXZpY2VfZGVpbml0KChtZV9kZXZpY2VfdCAqKSBtZTE0MDBfZGV2aWNlKTsKKwkJCQlrZnJlZShtZTE0MDBfZGV2aWNlKTsKKwkJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKworCQkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTE0MDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkJICAgIHN1YmRldmljZSk7CisJCX0KKwl9CisKKwkvKiBHZW5lcmF0ZSBleHRlcm5hbCBpbnRlcnJ1cHQgc3ViZGV2aWNlIGluc3RhbmNlcy4gKi8KKwlmb3IgKGV4dF9pcnFfaWR4ID0gMDsKKwkgICAgIGV4dF9pcnFfaWR4IDwgbWUxNDAwX3ZlcnNpb25zW3ZlcnNpb25faWR4XS5leHRfaXJxX3N1YmRldmljZXM7CisJICAgICBleHRfaXJxX2lkeCsrKSB7CisJCXN1YmRldmljZSA9CisJCSAgICAobWVfc3ViZGV2aWNlX3QgKikKKwkJICAgIG1lMTQwMF9leHRfaXJxX2NvbnN0cnVjdG9yKG1lMTQwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuCisJCQkJCSAgICAgICBkZXZpY2VfaWQsCisJCQkJCSAgICAgICBtZTE0MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLgorCQkJCQkgICAgICAgcmVnX2Jhc2VzWzFdLAorCQkJCQkgICAgICAgbWUxNDAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS4KKwkJCQkJICAgICAgIHJlZ19iYXNlc1syXSwKKwkJCQkJICAgICAgICZtZTE0MDBfZGV2aWNlLT5jbGtfc3JjX3JlZ19sb2NrLAorCQkJCQkgICAgICAgbWUxNDAwX2RldmljZS0+YmFzZS5pcnEpOworCisJCWlmICghc3ViZGV2aWNlKSB7CisJCQltZV9kZXZpY2VfZGVpbml0KChtZV9kZXZpY2VfdCAqKSBtZTE0MDBfZGV2aWNlKTsKKwkJCWtmcmVlKG1lMTQwMF9kZXZpY2UpOworCQkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlLlxuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCW1lX3NsaXN0X2FkZF9zdWJkZXZpY2VfdGFpbCgmbWUxNDAwX2RldmljZS0+YmFzZS5zbGlzdCwKKwkJCQkJICAgIHN1YmRldmljZSk7CisJfQorCisJcmV0dXJuIChtZV9kZXZpY2VfdCAqKSBtZTE0MDBfZGV2aWNlOworfQorCisvLyBJbml0IGFuZCBleGl0IG9mIG1vZHVsZS4KKworc3RhdGljIGludCBfX2luaXQgbWUxNDAwX2luaXQodm9pZCkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtZTE0MDBfZXhpdCh2b2lkKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKK30KKworbW9kdWxlX2luaXQobWUxNDAwX2luaXQpOworbW9kdWxlX2V4aXQobWUxNDAwX2V4aXQpOworCisvLyBBZG1pbmlzdHJhdGl2ZSBzdHVmZiBmb3IgbW9kaW5mby4KK01PRFVMRV9BVVRIT1IKKyAgICAoIkd1ZW50ZXIgR2ViaGFyZHQgPGcuZ2ViaGFyZHRAbWVpbGhhdXMuZGU+ICYgS3J6eXN6dG9mIEdhbnR6a2UgPGsuZ2FudHprZUBtZWlsaGF1cy5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRGV2aWNlIERyaXZlciBNb2R1bGUgZm9yIE1laWxoYXVzIE1FLTE0eHggZGV2aWNlcyIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIk1laWxoYXVzIE1FLTE0eHggTUlPIGRldmljZXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLy8gRXhwb3J0IHRoZSBjb25zdHJ1Y3Rvci4KK0VYUE9SVF9TWU1CT0wobWUxNDAwX3BjaV9jb25zdHJ1Y3Rvcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNDAwX2RldmljZS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTQwMF9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjE1YjI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTQwMF9kZXZpY2UuaApAQCAtMCwwICsxLDEwOCBAQAorLyoqCisgKiBAZmlsZSBtZTE0MDBfZGV2aWNlLmMKKyAqCisgKiBAYnJpZWYgTUUtMTQwMCBkZXZpY2UgZmFtaWx5IGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FMTQwMF9ERVZJQ0VfSF8KKyNkZWZpbmUgX01FMTQwMF9ERVZJQ0VfSF8KKworI2luY2x1ZGUgIm1ldHlwZXMuaCIKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisKKyNpbmNsdWRlICJtZWRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBTdHJ1Y3R1cmUgdG8gc3RvcmUgZGV2aWNlIGNhcGFiaWxpdGllcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWUxNDAwX3ZlcnNpb24geworCXVpbnQxNl90IGRldmljZV9pZDsJCQkJCS8qKjwgVGhlIFBDSSBkZXZpY2UgaWQgb2YgdGhlIGRldmljZS4gKi8KKwl1bnNpZ25lZCBpbnQgZGlvX2NoaXBzOwkJCQkvKio8IFRoZSBudW1iZXIgb2YgODI1NSBjaGlwcyBvbiB0aGUgZGV2aWNlLiAqLworCXVuc2lnbmVkIGludCBjdHJfY2hpcHM7CQkJCS8qKjwgVGhlIG51bWJlciBvZiA4MjU0IGNoaXBzIG9uIHRoZSBkZXZpY2UuICovCisJdW5zaWduZWQgaW50IGV4dF9pcnFfc3ViZGV2aWNlczsJLyoqPCBUaGUgbnVtYmVyIG9mIGV4dGVybmFsIGludGVycnVwdCBpbnB1dHMgb24gdGhlIGRldmljZS4gKi8KK30gbWUxNDAwX3ZlcnNpb25fdDsKKworLyoqCisgICogQGJyaWVmIERlZmluZXMgZm9yIGVhY2ggTUUtMTQwMCBkZXZpY2UgdmVyc2lvbiBpdHMgY2FwYWJpbGl0aWVzLgorICovCitzdGF0aWMgbWUxNDAwX3ZlcnNpb25fdCBtZTE0MDBfdmVyc2lvbnNbXSA9IHsKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MDAsIDEsIDAsIDB9LAorCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQSwgMSwgMSwgMX0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBCLCAyLCAyLCAxfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RTAsIDEsIDAsIDB9LAorCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFQSwgMSwgMSwgMX0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNEVCLCAyLCAyLCAxfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEMsIDEsIDUsIDF9LAorCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwRCwgMiwgMTAsIDF9LAorCXswfQorfTsKKworI2RlZmluZSBNRTE0MDBfREVWSUNFX1ZFUlNJT05TIChzaXplb2YobWUxNDAwX3ZlcnNpb25zKSAvIHNpemVvZihtZTE0MDBfdmVyc2lvbl90KSAtIDEpCS8qKjwgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gI21lMTQwMF92ZXJzaW9ucy4gKi8KKworLyoqCisgKiBAYnJpZWYgUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGRldmljZSBlbnRyeSBpbiAjbWUxNDAwX3ZlcnNpb25zLgorICoKKyAqIEBwYXJhbSBkZXZpY2VfaWQgVGhlIFBDSSBkZXZpY2UgaWQgb2YgdGhlIGRldmljZSB0byBxdWVyeS4KKyAqIEByZXR1cm4gVGhlIGluZGV4IG9mIHRoZSBkZXZpY2UgaW4gI21lMTQwMF92ZXJzaW9ucy4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbWUxNDAwX3ZlcnNpb25zX2dldF9kZXZpY2VfaW5kZXgodWludDE2X3QgZGV2aWNlX2lkKQoreworCXVuc2lnbmVkIGludCBpOworCWZvciAoaSA9IDA7IGkgPCBNRTE0MDBfREVWSUNFX1ZFUlNJT05TOyBpKyspCisJCWlmIChtZTE0MDBfdmVyc2lvbnNbaV0uZGV2aWNlX2lkID09IGRldmljZV9pZCkKKwkJCWJyZWFrOworCXJldHVybiBpOworfQorCisjZGVmaW5lIE1FMTQwMF9NQVhfODI1NAkJMTAJLyoqPCBUaGUgbWF4aW11bSBudW1iZXIgb2YgODI1NCBjb3VudGVyIHN1YmRldmljZXMgYXZhaWxhYmxlIG9uIGFueSBNRS0xNDAwIGRldmljZS4gKi8KKyNkZWZpbmUgTUUxNDAwX01BWF84MjU1CQkyCS8qKjwgVGhlIG1heGltdW0gbnVtYmVyIG9mIDgyNTUgZGlnaXRhbCBpL28gc3ViZGV2aWNlcyBhdmFpbGFibGUgb24gYW55IE1FLTE0MDAgZGV2aWNlLiAqLworCisvKioKKyAqIEBicmllZiBUaGUgTUUtMTQwMCBkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lMTQwMF9kZXZpY2UgeworCW1lX2RldmljZV90IGJhc2U7CQkJCQkJCQkJLyoqPCBUaGUgTWVpbGhhdXMgZGV2aWNlIGJhc2UgY2xhc3MuICovCisKKwlzcGlubG9ja190IGNsa19zcmNfcmVnX2xvY2s7CQkJCQkJLyoqPCBHdWFyZHMgdGhlIDgyNTQgY2xvY2sgc291cmNlIHJlZ2lzdGVycy4gKi8KKwlzcGlubG9ja190IGN0cl9jdHJsX3JlZ19sb2NrW01FMTQwMF9NQVhfODI1NF07CQkvKio8IEd1YXJkcyB0aGUgODI1NCBjdHJsIHJlZ2lzdGVycy4gKi8KKworCWludCBkaW9fY3VycmVudF9tb2RlW01FMTQwMF9NQVhfODI1NV07CQkJCS8qKjwgU2F2ZXMgdGhlIGN1cnJlbnQgbW9kZSBzZXR0aW5nIG9mIGEgc2luZ2xlIDgyNTUgRElPIGNoaXAuICovCisJc3BpbmxvY2tfdCBkaW9fY3RybF9yZWdfbG9ja1tNRTE0MDBfTUFYXzgyNTVdOwkJLyoqPCBHdWFyZHMgdGhlIDgyNTUgY3RybCByZWdpc3RlciBhbmQgI2Rpb19jdXJyZW50X21vZGUuICovCit9IG1lMTQwMF9kZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIE1FLTE0MDAgZGV2aWNlIGNsYXNzIGNvbnN0cnVjdG9yLgorICoKKyAqIEBwYXJhbSBwY2lfZGV2aWNlIFRoZSBwY2kgZGV2aWNlIHN0cnVjdHVyZSBnaXZlbiBieSB0aGUgUENJIHN1YnN5c3RlbS4KKyAqCisgKiBAcmV0dXJuIE9uIHN1Y2NlcyBhIG5ldyBNRS0xNDAwIGRldmljZSBpbnN0YW5jZS4gXG4KKyAqICAgICAgICAgTlVMTCBvbiBlcnJvci4KKyAqLworbWVfZGV2aWNlX3QgKm1lMTQwMF9wY2lfY29uc3RydWN0b3Ioc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2UpCisgICAgX19hdHRyaWJ1dGVfXyAoKHdlYWspKTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTE0MDBfZXh0X2lycS5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTQwMF9leHRfaXJxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRkZjdjYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTE0MDBfZXh0X2lycS5jCkBAIC0wLDAgKzEsNTE3IEBACisvKioKKyAqIEBmaWxlIG1lMTQwMF9leHRfaXJxLmMKKyAqCisgKiBAYnJpZWYgTUUtMTQwMCBleHRlcm5hbCBpbnRlcnJ1cHQgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvKgorICogSW5jbHVkZXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZWlkcy5oIgorCisjaW5jbHVkZSAibWUxNDAwX2V4dF9pcnEuaCIKKyNpbmNsdWRlICJtZTE0MDBfZXh0X2lycV9yZWcuaCIKKworLyoKKyAqIERlZmluZXMKKyAqLworI2RlZmluZSBNRTE0MDBfRVhUX0lSUV9NQUdJQ19OVU1CRVIJMHgxNDAxCS8qKjwgVGhlIG1hZ2ljIG51bWJlciBvZiB0aGUgY2xhc3Mgc3RydWN0dXJlLiAqLworI2RlZmluZSBNRTE0MDBfRVhUX0lSUV9OVU1CRVJfQ0hBTk5FTFMgMQkvKio8IE9uZSBjaGFubmVsIHBlciBjb3VudGVyLiAqLworCisvKgorICogRnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBtZTE0MDBfZXh0X2lycV9pb19pcnFfc3RhcnQoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgICBpbnQgaXJxX3NvdXJjZSwKKwkJCQkgICAgICAgaW50IGlycV9lZGdlLCBpbnQgaXJxX2FyZywgaW50IGZsYWdzKQoreworCW1lMTQwMF9leHRfaXJxX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwl1aW50OF90IHRtcDsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMTQwMF9leHRfaXJxX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncyAmIH5NRV9JT19JUlFfU1RBUlRfRElPX0JJVCkgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKGNoYW5uZWwpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAoaXJxX3NvdXJjZSAhPSBNRV9JUlFfU09VUkNFX0RJT19MSU5FKSB7CisJCVBFUlJPUigiSW52YWxpZCBpcnEgc291cmNlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0lSUV9TT1VSQ0U7CisJfQorCisJaWYgKGlycV9lZGdlICE9IE1FX0lSUV9FREdFX1JJU0lORykgeworCQlQRVJST1IoIkludmFsaWQgaXJxIGVkZ2UuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfSVJRX0VER0U7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y2xrX3NyY19yZWdfbG9jayk7CisvLyAgICAgICAgICAgICAgICAgICAgICAvLyBFbmFibGUgSVJRIG9uIFBMWAorLy8gICAgICAgICAgICAgICAgICAgICAgdG1wID0gaW5iKGluc3RhbmNlLT5wbHhfaW50Y3NfcmVnKSB8IChQTFhfTE9DQUxfSU5UMV9FTiB8IFBMWF9MT0NBTF9JTlQxX1BPTCB8IFBMWF9QQ0lfSU5UX0VOKTsKKy8vICAgICAgICAgICAgICAgICAgICAgIG91dGIodG1wLCBpbnN0YW5jZS0+cGx4X2ludGNzX3JlZyk7CisvLyAgICAgICAgICAgICAgICAgICAgICBQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRiKFBMWDoweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnBseF9pbnRjc19yZWcsIHRtcCk7CisKKwkvLyBFbmFibGUgSVJRCisJc3dpdGNoIChpbnN0YW5jZS0+ZGV2aWNlX2lkKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBEOgorCQl0bXAgPSBpbmIoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJdG1wIHw9IE1FMTQwMENEX0VYVF9JUlFfQ0xLX0VOOworCQlvdXRiKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlvdXRiKE1FMTQwMEFCX0VYVF9JUlFfSVJRX0VOLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgTUUxNDAwQUJfRVhUX0lSUV9JUlFfRU4pOworCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmNsa19zcmNfcmVnX2xvY2spOworCWluc3RhbmNlLT5yaXNlZCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTE0MDBfZXh0X2lycV9pb19pcnFfd2FpdChzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCAqaXJxX2NvdW50LAorCQkJCSAgICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lMTQwMF9leHRfaXJxX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwlsb25nIHQgPSAwOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUxNDAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCWlmICh0aW1lX291dCA8IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRpbWUgb3V0LlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RJTUVPVVQ7CisJfQorCisJaWYgKHRpbWVfb3V0KSB7CisJCS8qIENvbnZlcnQgdG8gdGlja3MgKi8KKwkJdCA9ICh0aW1lX291dCAqIEhaKSAvIDEwMDA7CisKKwkJaWYgKHQgPT0gMCkKKwkJCXQgPSAxOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCWlmIChpbnN0YW5jZS0+cmlzZWQgPD0gMCkgeworCQlpbnN0YW5jZS0+cmlzZWQgPSAwOworCQlpZiAodGltZV9vdXQpIHsKKwkJCXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+CisJCQkJCQkJICAgICB3YWl0X3F1ZXVlLAorCQkJCQkJCSAgICAgKGluc3RhbmNlLT5yaXNlZCAhPQorCQkJCQkJCSAgICAgIDApLCB0KTsKKworCQkJaWYgKHQgPT0gMCkgeworCQkJCVBFUlJPUigiV2FpdCBvbiBpbnRlcnJ1cHQgdGltZWQgb3V0LlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSAoaW5zdGFuY2UtPnJpc2VkICE9IDApKTsKKwkJfQorCisJCWlmIChpbnN0YW5jZS0+cmlzZWQgPCAwKSB7CisJCQlQRVJST1IoIldhaXQgb24gaW50ZXJydXB0IGFib3J0ZWQgYnkgdXNlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQl9CisJfQorCisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCVBFUlJPUigiV2FpdCBvbiBpbnRlcnJ1cHQgYWJvcnRlZCBieSBzaWduYWwuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJaW5zdGFuY2UtPnJpc2VkID0gMDsKKwkqaXJxX2NvdW50ID0gaW5zdGFuY2UtPm47CisJKnZhbHVlID0gMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWUxNDAwX2V4dF9pcnFfaW9faXJxX3N0b3Aoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwgaW50IGZsYWdzKQoreworCW1lMTQwMF9leHRfaXJxX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwl1aW50OF90IHRtcDsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMTQwMF9leHRfaXJxX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKGNoYW5uZWwpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y2xrX3NyY19yZWdfbG9jayk7CisvLyAgICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIElSUSBvbiBQTFgKKy8vICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGluYihpbnN0YW5jZS0+cGx4X2ludGNzX3JlZykgJiAoIH4oUExYX0xPQ0FMX0lOVDFfRU4gfCBQTFhfTE9DQUxfSU5UMV9QT0wgfCBQTFhfUENJX0lOVF9FTikpOworLy8gICAgICAgICAgICAgICAgICAgICAgb3V0Yih0bXAsIGluc3RhbmNlLT5wbHhfaW50Y3NfcmVnKTsKKy8vICAgICAgICAgICAgICAgICAgICAgIFBERUJVR19SRUcoImN0cmxfcmVnIG91dGIoUExYOjB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cGx4X2ludGNzX3JlZywgdG1wKTsKKworCXN3aXRjaCAoaW5zdGFuY2UtPmRldmljZV9pZCkgeworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEM6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwRDoKKwkJdG1wID0gaW5iKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCXRtcCAmPSB+TUUxNDAwQ0RfRVhUX0lSUV9DTEtfRU47CisJCW91dGIodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJb3V0YigweDAwLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAweDAwKTsKKwkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwlpbnN0YW5jZS0+cmlzZWQgPSAtMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lMTQwMF9leHRfaXJxX2lvX3Jlc2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisJbWUxNDAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKmluc3RhbmNlID0KKwkgICAgKG1lMTQwMF9leHRfaXJxX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaW5zdGFuY2UtPm4gPSAwOworCXJldHVybiBtZTE0MDBfZXh0X2lycV9pb19pcnFfc3RvcChzdWJkZXZpY2UsIGZpbGVwLCAwLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgbWUxNDAwX2V4dF9pcnFfcXVlcnlfbnVtYmVyX2NoYW5uZWxzKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJCWludCAqbnVtYmVyKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqbnVtYmVyID0gTUUxNDAwX0VYVF9JUlFfTlVNQkVSX0NIQU5ORUxTOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMTQwMF9leHRfaXJxX3F1ZXJ5X3N1YmRldmljZV90eXBlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgICAgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqdHlwZSA9IE1FX1RZUEVfRVhUX0lSUTsKKwkqc3VidHlwZSA9IE1FX1NVQlRZUEVfU0lOR0xFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMTQwMF9leHRfaXJxX3F1ZXJ5X3N1YmRldmljZV9jYXBzKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgICAgIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPSBNRV9DQVBTX0VYVF9JUlFfRURHRV9SSVNJTkc7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUxNDAwX2V4dF9pcnFfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncyhzdHJ1Y3QgbWVfc3ViZGV2aWNlCisJCQkJCQkgICAgKnN1YmRldmljZSwgaW50IGNhcCwKKwkJCQkJCSAgICBpbnQgKmFyZ3MsIGludCBjb3VudCkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7Cit9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiwgNiwgMTkpCitzdGF0aWMgaXJxcmV0dXJuX3QgbWUxNDAwX2V4dF9pcnFfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKKyNlbHNlCitzdGF0aWMgaXJxcmV0dXJuX3QgbWUxNDAwX2V4dF9pcnFfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwKKwkJCQkgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKKyNlbmRpZgoreworCW1lMTQwMF9leHRfaXJxX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1aW50MzJfdCBzdGF0dXM7CisJdWludDhfdCB0bXA7CisKKwlpbnN0YW5jZSA9IChtZTE0MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqKSBkZXZfaWQ7CisKKwlpZiAoaXJxICE9IGluc3RhbmNlLT5pcnEpIHsKKwkJUEVSUk9SKCJJbmNvcnJlY3QgaW50ZXJydXB0IG51bTogJWQuXG4iLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXN0YXR1cyA9IGlubChpbnN0YW5jZS0+cGx4X2ludGNzX3JlZyk7CisvLyAgICAgICAgICAgICAgaWYgKCEoKHN0YXR1cyAmIFBMWF9MT0NBTF9JTlQxX1NUQVRFKSAmJiAoc3RhdHVzICYgUExYX0xPQ0FMX0lOVDFfRU4pICYmIChzdGF0dXMgJiBQTFhfUENJX0lOVF9FTikpKQorCWlmICgoc3RhdHVzICYKKwkgICAgIChQTFhfTE9DQUxfSU5UMV9TVEFURSB8IFBMWF9MT0NBTF9JTlQxX0VOIHwgUExYX1BDSV9JTlRfRU4pKSAhPQorCSAgICAoUExYX0xPQ0FMX0lOVDFfU1RBVEUgfCBQTFhfTE9DQUxfSU5UMV9FTiB8IFBMWF9QQ0lfSU5UX0VOKSkgeworCQlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwkJUElORk8oIiVsZCBTaGFyZWQgaW50ZXJydXB0LiAlcygpOiBpcnFfc3RhdHVzX3JlZz0weCUwNFhcbiIsCisJCSAgICAgIGppZmZpZXMsIF9fZnVuY19fLCBzdGF0dXMpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZS0+bisrOworCWluc3RhbmNlLT5yaXNlZCA9IDE7CisKKwlzd2l0Y2ggKGluc3RhbmNlLT5kZXZpY2VfaWQpIHsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEM6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwRDoKKwkJc3Bpbl9sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJdG1wID0gaW5iKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCXRtcCAmPSB+TUUxNDAwQ0RfRVhUX0lSUV9DTEtfRU47CisJCW91dGIodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRiKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCQl0bXAgfD0gTUUxNDAwQ0RfRVhUX0lSUV9DTEtfRU47CisJCW91dGIodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRiKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCQlzcGluX3VubG9jayhpbnN0YW5jZS0+Y2xrX3NyY19yZWdfbG9jayk7CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlvdXRiKDAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGIoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDApOworCQlvdXRiKE1FMTQwMEFCX0VYVF9JUlFfSVJRX0VOLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRiKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgTUUxNDAwQUJfRVhUX0lSUV9JUlFfRU4pOworCQlicmVhazsKKwl9CisKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIG1lMTQwMF9leHRfaXJxX2Rlc3RydWN0b3Ioc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlKQoreworCW1lMTQwMF9leHRfaXJxX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1aW50OF90IHRtcDsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMTQwMF9leHRfaXJxX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCS8vIERpc2FibGUgSVJRIG9uIFBMWAorCXRtcCA9CisJICAgIGluYihpbnN0YW5jZS0+CisJCXBseF9pbnRjc19yZWcpICYgKH4oUExYX0xPQ0FMX0lOVDFfRU4gfCBQTFhfTE9DQUxfSU5UMV9QT0wgfAorCQkJCSAgICBQTFhfUENJX0lOVF9FTikpOworCW91dGIodG1wLCBpbnN0YW5jZS0+cGx4X2ludGNzX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0YihwbHg6MHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5wbHhfaW50Y3NfcmVnLAorCQkgICB0bXApOworCisJZnJlZV9pcnEoaW5zdGFuY2UtPmlycSwgKHZvaWQgKilpbnN0YW5jZSk7CisJbWVfc3ViZGV2aWNlX2RlaW5pdCgmaW5zdGFuY2UtPmJhc2UpOworCWtmcmVlKGluc3RhbmNlKTsKK30KKworbWUxNDAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKm1lMTQwMF9leHRfaXJxX2NvbnN0cnVjdG9yKHVpbnQzMl90IGRldmljZV9pZCwKKwkJCQkJCSAgICAgICB1aW50MzJfdCBwbHhfcmVnX2Jhc2UsCisJCQkJCQkgICAgICAgdWludDMyX3QgbWUxNDAwX3JlZ19iYXNlLAorCQkJCQkJICAgICAgIHNwaW5sb2NrX3QgKgorCQkJCQkJICAgICAgIGNsa19zcmNfcmVnX2xvY2ssCisJCQkJCQkgICAgICAgaW50IGlycSkKK3sKKwltZTE0MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCWludCBlcnI7CisJdWludDhfdCB0bXA7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZSAqLworCXN1YmRldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lMTQwMF9leHRfaXJxX3N1YmRldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXN1YmRldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciAxNDAwX2V4dF9pcnEgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1lMTQwMF9leHRfaXJxX3N1YmRldmljZV90KSk7CisKKwkvKiBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzICovCisJZXJyID0gbWVfc3ViZGV2aWNlX2luaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3ViZGV2aWNlLT5jbGtfc3JjX3JlZ19sb2NrID0gY2xrX3NyY19yZWdfbG9jazsKKworCS8qIEluaXRpYWxpemUgd2FpdCBxdWV1ZSAqLworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnN1YmRldmljZS0+d2FpdF9xdWV1ZSk7CisKKwlzdWJkZXZpY2UtPmlycSA9IGlycTsKKworCWVyciA9IHJlcXVlc3RfaXJxKGlycSwgbWUxNDAwX2V4dF9pcnFfaXNyLAorI2lmZGVmIElSUUZfRElTQUJMRUQKKwkJCSAgSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVELAorI2Vsc2UKKwkJCSAgU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEsCisjZW5kaWYKKwkJCSAgTUUxNDAwX05BTUUsICh2b2lkICopc3ViZGV2aWNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW4ndCBnZXQgaXJxLlxuIik7CisJCW1lX3N1YmRldmljZV9kZWluaXQoJnN1YmRldmljZS0+YmFzZSk7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlQSU5GTygiUmVnaXN0ZXJlZCBpcnE9JWQuXG4iLCBzdWJkZXZpY2UtPmlycSk7CisKKwkvKiBJbml0aWFsaXplIHJlZ2lzdGVycyAqLworCXN1YmRldmljZS0+cGx4X2ludGNzX3JlZyA9IHBseF9yZWdfYmFzZSArIFBMWF9JTlRDU1JfUkVHOworCXN1YmRldmljZS0+Y3RybF9yZWcgPSBtZTE0MDBfcmVnX2Jhc2UgKyBNRTE0MDBBQl9FWFRfSVJRX0NUUkxfUkVHOworI2lmZGVmIE1FREVCVUdfREVCVUdfUkVHCisJc3ViZGV2aWNlLT5yZWdfYmFzZSA9IG1lMTQwMF9yZWdfYmFzZTsKKyNlbmRpZgorCisJLy8gRW5hYmxlIElSUSBvbiBQTFgKKwl0bXAgPQorCSAgICBpbmIoc3ViZGV2aWNlLT4KKwkJcGx4X2ludGNzX3JlZykgfCAoUExYX0xPQ0FMX0lOVDFfRU4gfCBQTFhfTE9DQUxfSU5UMV9QT0wgfAorCQkJCSAgUExYX1BDSV9JTlRfRU4pOworCW91dGIodG1wLCBzdWJkZXZpY2UtPnBseF9pbnRjc19yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGIoUHBseDoweCVsWCk9MHgleFxuIiwgc3ViZGV2aWNlLT5wbHhfaW50Y3NfcmVnLAorCQkgICB0bXApOworCisJLyogSW5pdGlhbGl6ZSB0aGUgc3ViZGV2aWNlIG1ldGhvZHMgKi8KKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX2lycV9zdGFydCA9IG1lMTQwMF9leHRfaXJxX2lvX2lycV9zdGFydDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX2lycV93YWl0ID0gbWUxNDAwX2V4dF9pcnFfaW9faXJxX3dhaXQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19pcnFfc3RvcCA9IG1lMTQwMF9leHRfaXJxX2lvX2lycV9zdG9wOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWUxNDAwX2V4dF9pcnFfaW9fcmVzZXRfc3ViZGV2aWNlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWUxNDAwX2V4dF9pcnFfcXVlcnlfbnVtYmVyX2NoYW5uZWxzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGUgPQorCSAgICBtZTE0MDBfZXh0X2lycV9xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWUxNDAwX2V4dF9pcnFfcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzID0KKwkgICAgbWUxNDAwX2V4dF9pcnFfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJnczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2Rlc3RydWN0b3IgPSBtZTE0MDBfZXh0X2lycV9kZXN0cnVjdG9yOworCisJc3ViZGV2aWNlLT5yaXNlZCA9IDA7CisJc3ViZGV2aWNlLT5uID0gMDsKKworCXJldHVybiBzdWJkZXZpY2U7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNDAwX2V4dF9pcnEuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTE0MDBfZXh0X2lycS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNzJhMDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNDAwX2V4dF9pcnEuaApAQCAtMCwwICsxLDYyIEBACisvKioKKyAqIEBmaWxlIG1lMTQwMF9leHRfaXJxLmgKKyAqCisgKiBAYnJpZWYgTUUtMTQwMCBleHRlcm5hbCBpbnRlcnJ1cHQgaW1wbGVtZW50YXRpb24uCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDYgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworI2lmbmRlZiBfTUUxNDAwX0VYVF9JUlFfSF8KKyNkZWZpbmUgX01FMTQwMF9FWFRfSVJRX0hfCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKyNpbmNsdWRlICJtZXNsb2NrLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFRoZSBNRS0xNDAwIGV4dGVybmFsIGludGVycnVwdCBzdWJkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lMTQwMF9leHRfaXJxX3N1YmRldmljZSB7CisJLyogSW5oZXJpdGFuY2UgKi8KKwltZV9zdWJkZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0IHRoZSBzdWJkZXZpY2UgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwlzcGlubG9ja190ICpjbGtfc3JjX3JlZ19sb2NrOwkvKio8IExvY2sgcHJvdGVjdGluZyB0aGUgY2xvY2sgY29udHJvbCByZWdpc3Rlci4gKi8KKworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfcXVldWU7CS8qKjwgUXVldWUgdG8gcHV0IG9uIHRocmVhZHMgd2FpdGluZyBmb3IgYW4gaW50ZXJydXB0LiAqLworCisJdWludDMyX3QgZGV2aWNlX2lkOwkJCQkvKio8IFRoZSBkZXZpY2UgaWQgb2YgdGhlIGRldmljZSBob2xkaW5nIHRoZSBzdWJkZXZpY2UuICovCisJaW50IGlycTsJCQkJCQkvKio8IFRoZSBpcnEgbnVtYmVyIGFzc2lnbmVkIGJ5IFBDSSBCSU9TLiAqLworCWludCByaXNlZDsJCQkJCQkvKio8IElmIHRydWUgYW4gaW50ZXJydXB0IGhhcyBvY2N1cmVkLiAqLworCXVuc2lnbmVkIGludCBuOwkJCQkJLyoqPCBUaGUgbnVtYmVyIG9mIGludGVycnVwdCBzaW5jZSB0aGUgZHJpdmVyIHdhcyBsb2FkZWQuICovCisKKwl1bnNpZ25lZCBsb25nIHBseF9pbnRjc19yZWc7CS8qKjwgVGhlIFBMWCBpbnRlcnJ1cHQgY29udHJvbCBhbmQgc3RhdHVzIHJlZ2lzdGVyLiAqLworCXVuc2lnbmVkIGxvbmcgY3RybF9yZWc7CQkJLyoqPCBUaGUgY29udHJvbCByZWdpc3Rlci4gKi8KKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2U7CisjZW5kaWYKK30gbWUxNDAwX2V4dF9pcnFfc3ViZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBjb25zdHJ1Y3RvciB0byBnZW5lcmF0ZSBhIE1FLTE0MDAgZXh0ZXJuYWwgaW50ZXJydXB0IGluc3RhbmNlLgorICoKKyAqIEBwYXJhbSBwbHhfcmVnX2Jhc2UgVGhlIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBvZiB0aGUgUExYIGNoaXAgYXMgcmV0dXJuZWQgYnkgdGhlIFBDSSBCSU9TLgorICogQHBhcmFtIG1lMTQwMF9yZWdfYmFzZSBUaGUgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIG9mIHRoZSBNRS0xNDAwIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gaXJxIFRoZSBpcnEgYXNzaWduZWQgYnkgdGhlIFBDSSBCSU9TLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWUxNDAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKm1lMTQwMF9leHRfaXJxX2NvbnN0cnVjdG9yKHVpbnQzMl90IGRldmljZV9pZCwKKwkJCQkJCSAgICAgICB1aW50MzJfdCBwbHhfcmVnX2Jhc2UsCisJCQkJCQkgICAgICAgdWludDMyX3QgbWUxNDAwX3JlZ19iYXNlLAorCQkJCQkJICAgICAgIHNwaW5sb2NrX3QgKgorCQkJCQkJICAgICAgIGNsa19zcmNfcmVnX2xvY2ssCisJCQkJCQkgICAgICAgaW50IGlycSk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNDAwX2V4dF9pcnFfcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNDAwX2V4dF9pcnFfcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk3NDBmMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTE0MDBfZXh0X2lycV9yZWcuaApAQCAtMCwwICsxLDU2IEBACisvKioKKyAqIEBmaWxlIG1lMTQwMF9leHRfaXJxX3JlZy5oCisgKgorICogQGJyaWVmIE1FLTE0MDAgZXh0ZXJuYWwgaW50ZXJydXB0IHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FMTQwMF9FWFRfSVJRX1JFR19IXworIyBkZWZpbmUgX01FMTQwMF9FWFRfSVJRX1JFR19IXworCisjIGlmZGVmIF9fS0VSTkVMX18KKworIyAgZGVmaW5lIFBMWF9JTlRDU1JfUkVHCQkJCTB4NEMJLyoqPCBUaGUgUExYIGludGVycnVwdCBjb250cm9sIGFuZCBzdGF0dXMgcmVnaXN0ZXIgb2Zmc2V0LiAqLworIyAgZGVmaW5lIFBMWF9JQ1JfUkVHCQkJCQkweDUwCS8qKjwgVGhlIFBMWCBpbml0aWFsaXphdGlvbiBjb250cm9sIHJlZ2lzdGVyIG9mZnNldC4gKi8KKworIyAgZGVmaW5lIFBMWF9MT0NBTF9JTlQxX0VOCQkJCTB4MDEJLyoqPCBJZiBzZXQgdGhlIGxvY2FsIGludGVycnVwdCAxIGlzIGVuYWJsZWQuICovCisjICBkZWZpbmUgUExYX0xPQ0FMX0lOVDFfUE9MCQkJMHgwMgkvKio8IElmIHNldCB0aGUgbG9jYWwgaW50ZXJydXB0IDEgcG9sYXJpdHkgaXMgaGlnaCBhY3RpdmUuICovCisjICBkZWZpbmUgUExYX0xPQ0FMX0lOVDFfU1RBVEUJCQkweDA0CS8qKjwgSWYgc2V0IHRoZSBsb2NhbCBpbnRlcnJ1cHQgMSBpcyBhY3Rpdi4gKi8KKyMgIGRlZmluZSBQTFhfTE9DQUxfSU5UMl9FTgkJCQkweDA4CS8qKjwgSWYgc2V0IHRoZSBsb2NhbCBpbnRlcnJ1cHQgMiBpcyBlbmFibGVkLiAqLworIyAgZGVmaW5lIFBMWF9MT0NBTF9JTlQyX1BPTAkJCTB4MTAJLyoqPCBJZiBzZXQgdGhlIGxvY2FsIGludGVycnVwdCAyIHBvbGFyaXR5IGlzIGhpZ2ggYWN0aXZlLiAqLworIyAgZGVmaW5lIFBMWF9MT0NBTF9JTlQyX1NUQVRFCQkJMHgyMAkvKio8IElmIHNldCB0aGUgbG9jYWwgaW50ZXJydXB0IDIgaXMgYWN0aXYuICovCisjICBkZWZpbmUgUExYX1BDSV9JTlRfRU4JCQkJMHg0MAkvKio8IElmIHNldCB0aGUgUENJIGludGVycnVwdCBpcyBlbmFibGVkLiAqLworIyAgZGVmaW5lIFBMWF9TT0ZUX0lOVAkJCQkJMHg4MAkvKio8IElmIHNldCBhbiBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkLiAqLworCisjICBkZWZpbmUgTUUxNDAwQUJfRVhUX0lSUV9DVFJMX1JFRwkJMHgxMQkvKio8IFRoZSBleHRlcm5hbCBpbnRlcnJ1cHQgY29udHJvbCByZWdpc3RlciBvZmZzZXQuICovCisKKyMgIGRlZmluZSBNRTE0MDBBQl9FWFRfSVJRX0NMS19FTgkJMHgwMQkvKio8IElmIHRoaXMgYml0IGlzIHNldCwgdGhlIGNsb2NrIG91dHB1dCBpcyBlbmFibGVkLiAqLworIyAgZGVmaW5lIE1FMTQwMEFCX0VYVF9JUlFfSVJRX0VOCQkweDAyCS8qKjwgSWYgc2V0IHRoZSBleHRlcm5hbCBpbnRlcnJ1cHQgaXMgZW5hYmxlZC4gQ2xlYXJpbmcgdGhpcyBiaXQgY2xlYXJzIGEgcGVuZGluZyBpbnRlcnJ1cHQuICovCisKKyMgIGRlZmluZSBNRTE0MDBDRF9FWFRfSVJRX0NUUkxfUkVHCQkweDExCS8qKjwgVGhlIGV4dGVybmFsIGludGVycnVwdCBjb250cm9sIHJlZ2lzdGVyIG9mZnNldC4gKi8KKworIyAgZGVmaW5lIE1FMTQwMENEX0VYVF9JUlFfQ0xLX0VOCQkweDEwCS8qKjwgSWYgc2V0IHRoZSBleHRlcm5hbCBpbnRlcnJ1cHQgaXMgZW5hYmxlZC4gQ2xlYXJpbmcgdGhpcyBiaXQgY2xlYXJzIGEgcGVuZGluZyBpbnRlcnJ1cHQuKi8KKworIyBlbmRpZgkvL19fS0VSTkVMX18KKworI2VuZGlmIC8vX01FMTQwMF9FWFRfSVJRX1JFR19IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTYwMF9hby5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTYwMF9hby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMjdjNmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNjAwX2FvLmMKQEAgLTAsMCArMSwxMDMzIEBACisvKioKKyAqIEBmaWxlIG1lMTYwMF9hby5jCisgKgorICogQGJyaWVmIE1FLTE2MDAgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKy8qIEluY2x1ZGVzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorI2luY2x1ZGUgIm1lZGVidWcuaCIKKworI2luY2x1ZGUgIm1lMTYwMF9hb19yZWcuaCIKKyNpbmNsdWRlICJtZTE2MDBfYW8uaCIKKworLyogRGVmaW5lcworICovCisKK3N0YXRpYyB2b2lkIG1lMTYwMF9hb19kZXN0cnVjdG9yKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSk7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjApCitzdGF0aWMgdm9pZCBtZTE2MDBfYW9fd29ya19jb250cm9sX3Rhc2sodm9pZCAqc3ViZGV2aWNlKTsKKyNlbHNlCitzdGF0aWMgdm9pZCBtZTE2MDBfYW9fd29ya19jb250cm9sX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKyNlbmRpZgorCitzdGF0aWMgaW50IG1lMTYwMF9hb19pb19yZXNldF9zdWJkZXZpY2UobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCXN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbnQgbWUxNjAwX2FvX2lvX3NpbmdsZV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgc2luZ2xlX2NvbmZpZywgaW50IHJlZiwgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICBpbnQgdHJpZ190eXBlLCBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpOworc3RhdGljIGludCBtZTE2MDBfYW9faW9fc2luZ2xlX3JlYWQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGNoYW5uZWwsIGludCAqdmFsdWUsCisJCQkJICAgIGludCB0aW1lX291dCwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbnQgbWUxNjAwX2FvX2lvX3NpbmdsZV93cml0ZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGNoYW5uZWwsIGludCB2YWx1ZSwKKwkJCQkgICAgIGludCB0aW1lX291dCwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbnQgbWUxNjAwX2FvX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgaW50ICpudW1iZXIpOworc3RhdGljIGludCBtZTE2MDBfYW9fcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsIGludCAqdHlwZSwKKwkJCQkJICBpbnQgKnN1YnR5cGUpOworc3RhdGljIGludCBtZTE2MDBfYW9fcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgaW50ICpjYXBzKTsKK3N0YXRpYyBpbnQgbWUxNjAwX2FvX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXgobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgICBpbnQgdW5pdCwgaW50ICptaW4sIGludCAqbWF4LAorCQkJCQkgICAgaW50ICptYXhkYXRhLCBpbnQgKnJhbmdlKTsKK3N0YXRpYyBpbnQgbWUxNjAwX2FvX3F1ZXJ5X251bWJlcl9yYW5nZXMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsIGludCB1bml0LAorCQkJCQkgaW50ICpjb3VudCk7CitzdGF0aWMgaW50IG1lMTYwMF9hb19xdWVyeV9yYW5nZV9pbmZvKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLCBpbnQgcmFuZ2UsCisJCQkJICAgICAgaW50ICp1bml0LCBpbnQgKm1pbiwgaW50ICptYXgsCisJCQkJICAgICAgaW50ICptYXhkYXRhKTsKKworLyogRnVuY3Rpb25zCisgKi8KKworbWUxNjAwX2FvX3N1YmRldmljZV90ICptZTE2MDBfYW9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGFvX2lkeCwKKwkJCQkJICAgICBpbnQgY3VyciwKKwkJCQkJICAgICBzcGlubG9ja190ICogY29uZmlnX3JlZ3NfbG9jaywKKwkJCQkJICAgICBzcGlubG9ja190ICogYW9fc2hhZG93c19sb2NrLAorCQkJCQkgICAgIG1lMTYwMF9hb19zaGFkb3dfdCAqCisJCQkJCSAgICAgYW9fcmVnc19zaGFkb3dzLAorCQkJCQkgICAgIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICptZTE2MDBfd3EpCit7CisJbWUxNjAwX2FvX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgYW9faWR4KTsKKworCS8vIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlLgorCXN1YmRldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lMTYwMF9hb19zdWJkZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFzdWJkZXZpY2UpIHsKKwkJUEVSUk9SCisJCSAgICAoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBhbmFsb2cgb3V0cHV0IHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc3ViZGV2aWNlLCAwLCBzaXplb2YobWUxNjAwX2FvX3N1YmRldmljZV90KSk7CisKKwkvLyBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzLgorCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9ja3MuCisJc3Bpbl9sb2NrX2luaXQoJnN1YmRldmljZS0+c3ViZGV2aWNlX2xvY2spOworCXN1YmRldmljZS0+Y29uZmlnX3JlZ3NfbG9jayA9IGNvbmZpZ19yZWdzX2xvY2s7CisJc3ViZGV2aWNlLT5hb19zaGFkb3dzX2xvY2sgPSBhb19zaGFkb3dzX2xvY2s7CisKKwkvLyBTYXZlIHRoZSBzdWJkZXZpY2UgaW5kZXguCisJc3ViZGV2aWNlLT5hb19pZHggPSBhb19pZHg7CisKKwkvLyBJbml0aWFsaXplIHJhbmdlIGxpc3RzLgorCXN1YmRldmljZS0+dV9yYW5nZXNfY291bnQgPSAyOworCisJc3ViZGV2aWNlLT51X3Jhbmdlc1swXS5taW4gPSAwOwkvLzBWCisJc3ViZGV2aWNlLT51X3Jhbmdlc1swXS5tYXggPSA5OTk3NTU4OwkvLzEwVgorCisJc3ViZGV2aWNlLT51X3Jhbmdlc1sxXS5taW4gPSAtMTBFNjsJLy8tMTBWCisJc3ViZGV2aWNlLT51X3Jhbmdlc1sxXS5tYXggPSA5OTk1MTE3OwkvLzEwVgorCisJaWYgKGN1cnIpIHsJCS8vIFRoaXMgaXMgdmVyc2lvbiB3aXRoIGN1cnJlbnQgb3V0cHV0cy4KKwkJc3ViZGV2aWNlLT5pX3Jhbmdlc19jb3VudCA9IDI7CisKKwkJc3ViZGV2aWNlLT5pX3Jhbmdlc1swXS5taW4gPSAwOwkvLzBtQQorCQlzdWJkZXZpY2UtPmlfcmFuZ2VzWzBdLm1heCA9IDE5OTk1MTE3OwkvLzIwbUEKKworCQlzdWJkZXZpY2UtPmlfcmFuZ2VzWzFdLm1pbiA9IDRFMzsJLy80bUEKKwkJc3ViZGV2aWNlLT5pX3Jhbmdlc1sxXS5tYXggPSAxOTk5NTExODsJLy8yMG1BCisJfSBlbHNlIHsJCS8vIFRoaXMgaXMgdmVyc2lvbiB3aXRob3V0IGN1cnJlbnQgb3V0cHV0cy4KKwkJc3ViZGV2aWNlLT5pX3Jhbmdlc19jb3VudCA9IDA7CisKKwkJc3ViZGV2aWNlLT5pX3Jhbmdlc1swXS5taW4gPSAwOwkvLzBtQQorCQlzdWJkZXZpY2UtPmlfcmFuZ2VzWzBdLm1heCA9IDA7CS8vMG1BCisKKwkJc3ViZGV2aWNlLT5pX3Jhbmdlc1sxXS5taW4gPSAwOwkvLzBtQQorCQlzdWJkZXZpY2UtPmlfcmFuZ2VzWzFdLm1heCA9IDA7CS8vMG1BCisJfQorCisJLy8gSW5pdGlhbGl6ZSByZWdpc3RlcnMuCisJc3ViZGV2aWNlLT51bmlfYmlfcmVnID0gcmVnX2Jhc2UgKyBNRTE2MDBfVU5JX0JJX1JFRzsKKwlzdWJkZXZpY2UtPmlfcmFuZ2VfcmVnID0gcmVnX2Jhc2UgKyBNRTE2MDBfMDIwXzQyMF9SRUc7CisJc3ViZGV2aWNlLT5zaW1fb3V0cHV0X3JlZyA9IHJlZ19iYXNlICsgTUUxNjAwX1NJTV9PVVRQVVRfUkVHOworCXN1YmRldmljZS0+Y3VycmVudF9vbl9yZWcgPSByZWdfYmFzZSArIE1FMTYwMF9DVVJSRU5UX09OX1JFRzsKKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKyNlbmRpZgorCisJLy8gSW5pdGlhbGl6ZSBzaGFkb3cgc3RydWN0dXJlLgorCXN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzID0gYW9fcmVnc19zaGFkb3dzOworCisJLy8gT3ZlcnJpZGUgYmFzZSBjbGFzcyBtZXRob2RzLgorCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfZGVzdHJ1Y3RvciA9IG1lMTYwMF9hb19kZXN0cnVjdG9yOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWUxNjAwX2FvX2lvX3Jlc2V0X3N1YmRldmljZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9jb25maWcgPQorCSAgICBtZTE2MDBfYW9faW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWUxNjAwX2FvX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0KKwkgICAgbWUxNjAwX2FvX2lvX3NpbmdsZV93cml0ZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lMTYwMF9hb19xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lMTYwMF9hb19xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWUxNjAwX2FvX3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfcmFuZ2VfYnlfbWluX21heCA9CisJICAgIG1lMTYwMF9hb19xdWVyeV9yYW5nZV9ieV9taW5fbWF4OworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX3JhbmdlcyA9CisJICAgIG1lMTYwMF9hb19xdWVyeV9udW1iZXJfcmFuZ2VzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfcmFuZ2VfaW5mbyA9CisJICAgIG1lMTYwMF9hb19xdWVyeV9yYW5nZV9pbmZvOworCisJLy8gSW5pdGlhbGl6ZSB3YWl0IHF1ZXVlLgorCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnN1YmRldmljZS0+d2FpdF9xdWV1ZSk7CisKKwkvLyBQcmVwYXJlIHdvcmsgcXVldWUuCisJc3ViZGV2aWNlLT5tZTE2MDBfd29ya3F1ZXVlID0gbWUxNjAwX3dxOworCisvKiB3b3JrcXVldWUgQVBJIGNoYW5nZWQgaW4ga2VybmVsIDIuNi4yMCAqLworI2lmICggTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSApCisJSU5JVF9XT1JLKCZzdWJkZXZpY2UtPmFvX2NvbnRyb2xfdGFzaywgbWUxNjAwX2FvX3dvcmtfY29udHJvbF90YXNrLAorCQkgICh2b2lkICopc3ViZGV2aWNlKTsKKyNlbHNlCisJSU5JVF9ERUxBWUVEX1dPUksoJnN1YmRldmljZS0+YW9fY29udHJvbF90YXNrLAorCQkJICBtZTE2MDBfYW9fd29ya19jb250cm9sX3Rhc2spOworI2VuZGlmCisJcmV0dXJuIHN1YmRldmljZTsKK30KKworc3RhdGljIHZvaWQgbWUxNjAwX2FvX2Rlc3RydWN0b3Ioc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlKQoreworCW1lMTYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlpbnN0YW5jZSA9IChtZTE2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWluc3RhbmNlLT5hb19jb250cm9sX3Rhc2tfZmxhZyA9IDA7CisKKwkvLyBSZXNldCBzdWJkZXZpY2UgdG8gYXN1cmUgY2xlYW4gZXhpdC4KKwltZTE2MDBfYW9faW9fcmVzZXRfc3ViZGV2aWNlKHN1YmRldmljZSwgTlVMTCwKKwkJCQkgICAgIE1FX0lPX1JFU0VUX1NVQkRFVklDRV9OT19GTEFHUyk7CisKKwkvLyBSZW1vdmUgYW55IHRhc2tzIGZyb20gd29yayBxdWV1ZS4gVGhpcyBpcyBwYXJhbm9pYyBiZWNhdXNlIGl0IHdhcyBkb25lIGFsbHJlYWR5IGluIHJlc2V0KCkuCisJaWYgKCFjYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrKSkgewkvL1dhaXQgMiB0aWNrcyB0byBiZSBzdXJlIHRoYXQgY29udHJvbCB0YXNrIGlzIHJlbW92ZWQgZnJvbSBxdWV1ZS4KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgyKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbWUxNjAwX2FvX2lvX3Jlc2V0X3N1YmRldmljZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisJbWUxNjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1aW50MTZfdCB0bXA7CisKKwlpbnN0YW5jZSA9IChtZTE2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJLy9DYW5jZWwgY29udHJvbCB0YXNrCisJUERFQlVHKCJDYW5jZWwgY29udHJvbCB0YXNrLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCWluc3RhbmNlLT5hb19jb250cm9sX3Rhc2tfZmxhZyA9IDA7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFzayk7CisJKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT50cmlnZ2VyICY9IH4oMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOwkvL0NhbmNlbGwgd2FpdGluZyBmb3IgdHJpZ2dlci4KKworCS8vIFJlc2V0IGFsbCBzZXR0aW5ncy4KKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5hb19zaGFkb3dzX2xvY2spOworCShpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+c2hhZG93W2luc3RhbmNlLT5hb19pZHhdID0gMDsKKwkoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPm1pcnJvcltpbnN0YW5jZS0+YW9faWR4XSA9IDA7CisJKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT50cmlnZ2VyICY9IH4oMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOwkvL05vdCB3YWl0aW5nIGZvciB0cmlnZ2VyaW5nLgorCShpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+c3luY2hyb25vdXMgJj0gfigweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CS8vSW5kaXZpZHVhbCB0cmlnZ2VyaW5nLgorCisJLy8gU2V0IG91dHB1dCB0byBkZWZhdWx0IChzYWZlKSBzdGF0ZS4KKwlzcGluX2xvY2soaW5zdGFuY2UtPmNvbmZpZ19yZWdzX2xvY2spOworCXRtcCA9IGludyhpbnN0YW5jZS0+dW5pX2JpX3JlZyk7CS8vIHVuaXBvbGFyCisJdG1wIHw9ICgweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJb3V0dyh0bXAsIGluc3RhbmNlLT51bmlfYmlfcmVnKTsKKwlQREVCVUdfUkVHKCJ1bmlfYmlfcmVnIG91dHcoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnVuaV9iaV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisKKwl0bXAgPSBpbncoaW5zdGFuY2UtPmN1cnJlbnRfb25fcmVnKTsJLy8gVm9sdHMgb25seSEKKwl0bXAgJj0gfigweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJdG1wICY9IDB4MDBGRjsKKwlvdXR3KHRtcCwgaW5zdGFuY2UtPmN1cnJlbnRfb25fcmVnKTsKKwlQREVCVUdfUkVHKCJjdXJyZW50X29uX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdXJyZW50X29uX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKworCXRtcCA9IGludyhpbnN0YW5jZS0+aV9yYW5nZV9yZWcpOwkvLyAwLi4yMG1BIDw9IElmIGV4aXN0cy4KKwl0bXAgJj0gfigweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJb3V0dyh0bXAsIGluc3RhbmNlLT5pX3JhbmdlX3JlZyk7CisJUERFQlVHX1JFRygiaV9yYW5nZV9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+aV9yYW5nZV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisKKwlvdXR3KDAsIChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+cmVnaXN0cnlbaW5zdGFuY2UtPmFvX2lkeF0pOworCVBERUJVR19SRUcoImNoYW5uZWxfcmVnIG91dHcoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5yZWdpc3RyeVtpbnN0YW5jZS0+YW9faWR4XSAtCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwgMCk7CisKKwkvLyBUcmlnZ2VyIG91dHB1dC4KKwlvdXR3KDB4MDAwMCwgaW5zdGFuY2UtPnNpbV9vdXRwdXRfcmVnKTsKKwlQREVCVUdfUkVHKCJzaW1fb3V0cHV0X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zaW1fb3V0cHV0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMHgwMDAwKTsKKwlvdXR3KDB4RkZGRiwgaW5zdGFuY2UtPnNpbV9vdXRwdXRfcmVnKTsKKwlQREVCVUdfUkVHKCJzaW1fb3V0cHV0X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zaW1fb3V0cHV0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMHhGRkZGKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y29uZmlnX3JlZ3NfbG9jayk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmFvX3NoYWRvd3NfbG9jayk7CisKKwkvLyBTZXQgc3RhdHVzIHRvICdub25lJworCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfbm9uZTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCS8vU2lnbmFsIHJlc2V0IGlmIHVzZXIgaXMgb24gd2FpdC4KKwl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMTYwMF9hb19pb19zaW5nbGVfY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkgICAgICBpbnQgcmVmLAorCQkJCSAgICAgIGludCB0cmlnX2NoYW4sCisJCQkJICAgICAgaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCW1lMTYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdWludDE2X3QgdG1wOworCisJaW5zdGFuY2UgPSAobWUxNjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwkvLyBDaGVja2luZyBwYXJhbWV0ZXJzLgorCWlmIChmbGFncykgeworCQlQRVJST1IKKwkJICAgICgiSW52YWxpZCBmbGFnIHNwZWNpZmllZC4gTXVzdCBiZSBNRV9JT19TSU5HTEVfQ09ORklHX05PX0ZMQUdTLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICh0cmlnX2VkZ2UgIT0gTUVfVFJJR19FREdFX05PTkUpIHsKKwkJUEVSUk9SCisJCSAgICAoIkludmFsaWQgdHJpZ2dlciBlZGdlLiBTb2Z0d2FyZSB0cmlnZ2VyIGhhcyBub3QgZWRnZS4gTXVzdCBiZSBNRV9UUklHX0VER0VfTk9ORVxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RSSUdfRURHRTsKKwl9CisKKwlpZiAodHJpZ190eXBlICE9IE1FX1RSSUdfVFlQRV9TVykgeworCQlQRVJST1IoIkludmFsaWQgdHJpZ2dlciBlZGdlLiBNdXN0IGJlIE1FX1RSSUdfVFlQRV9TVy5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9UUklHX1RZUEU7CisJfQorCisJaWYgKCh0cmlnX2NoYW4gIT0gTUVfVFJJR19DSEFOX0RFRkFVTFQpCisJICAgICYmICh0cmlnX2NoYW4gIT0gTUVfVFJJR19DSEFOX1NZTkNIUk9OT1VTKSkgeworCQlQRVJST1IoIkludmFsaWQgdHJpZ2dlciBjaGFubmVsIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9UUklHX0NIQU47CisJfQorCisJaWYgKHJlZiAhPSBNRV9SRUZfQU9fR1JPVU5EKSB7CisJCVBFUlJPUgorCQkgICAgKCJJbnZhbGlkIHJlZmVyZW5jZS4gQW5hbG9nIG91dHB1dHMgaGF2ZSB0byBoYXZlIGdvdCBSRUZfQU9fR1JPVU5ELlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1JFRjsKKwl9CisKKwlpZiAoKChzaW5nbGVfY29uZmlnICsgMSkgPgorCSAgICAgKGluc3RhbmNlLT51X3Jhbmdlc19jb3VudCArIGluc3RhbmNlLT5pX3Jhbmdlc19jb3VudCkpCisJICAgIHx8IChzaW5nbGVfY29uZmlnIDwgMCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHJhbmdlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCX0KKworCWlmIChjaGFubmVsKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKwkvLyBDaGVja2luZyBwYXJhbWV0ZXJzIC0gZG9uZS4gQWxsIGlzIGZpbmUuIERvIGNvbmZpZy4KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCS8vQ2FuY2VsIGNvbnRyb2wgdGFzaworCVBERUJVRygiQ2FuY2VsIGNvbnRyb2wgdGFzay4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKwlpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgPSAwOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmluc3RhbmNlLT5hb19jb250cm9sX3Rhc2spOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+YW9fc2hhZG93c19sb2NrKTsKKwkoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnRyaWdnZXIgJj0gfigweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CS8vQ2FuY2VsbCB3YWl0aW5nIGZvciB0cmlnZ2VyLgorCShpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+c2hhZG93W2luc3RhbmNlLT5hb19pZHhdID0gMDsKKwkoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPm1pcnJvcltpbnN0YW5jZS0+YW9faWR4XSA9IDA7CisKKwlzcGluX2xvY2soaW5zdGFuY2UtPmNvbmZpZ19yZWdzX2xvY2spOworCXN3aXRjaCAoc2luZ2xlX2NvbmZpZykgeworCWNhc2UgMDoJCS8vIDBWIDEwVgorCQl0bXAgPSBpbncoaW5zdGFuY2UtPmN1cnJlbnRfb25fcmVnKTsJLy8gVm9sdHMKKwkJdG1wICY9IH4oMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCQlvdXR3KHRtcCwgaW5zdGFuY2UtPmN1cnJlbnRfb25fcmVnKTsKKwkJUERFQlVHX1JFRygiY3VycmVudF9vbl9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdXJyZW50X29uX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKworCQkvLyAwVgorCQlvdXR3KDAsCisJCSAgICAgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5yZWdpc3RyeVtpbnN0YW5jZS0+YW9faWR4XSk7CisJCVBERUJVR19SRUcoImNoYW5uZWxfcmVnIG91dHcoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICAoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnJlZ2lzdHJ5W2luc3RhbmNlLT4KKwkJCQkJCQkJIGFvX2lkeF0gLQorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKworCQl0bXAgPSBpbncoaW5zdGFuY2UtPnVuaV9iaV9yZWcpOwkvLyB1bmlwb2xhcgorCQl0bXAgfD0gKDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwkJb3V0dyh0bXAsIGluc3RhbmNlLT51bmlfYmlfcmVnKTsKKwkJUERFQlVHX1JFRygidW5pX2JpX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnVuaV9iaV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisKKwkJdG1wID0gaW53KGluc3RhbmNlLT5pX3JhbmdlX3JlZyk7CS8vIDAuLjIwbUEgPD0gSWYgZXhpc3RzLgorCQl0bXAgJj0gfigweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCW91dHcodG1wLCBpbnN0YW5jZS0+aV9yYW5nZV9yZWcpOworCQlQREVCVUdfUkVHKCJpX3JhbmdlX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmlfcmFuZ2VfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCQlicmVhazsKKworCWNhc2UgMToJCS8vIC0xMFYgMTBWCisJCXRtcCA9IGludyhpbnN0YW5jZS0+Y3VycmVudF9vbl9yZWcpOwkvLyBWb2x0cworCQl0bXAgJj0gfigweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCW91dHcodG1wLCBpbnN0YW5jZS0+Y3VycmVudF9vbl9yZWcpOworCQlQREVCVUdfUkVHKCJjdXJyZW50X29uX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN1cnJlbnRfb25fcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCisJCS8vIDBWCisJCW91dHcoMHgwODAwLAorCQkgICAgIChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+cmVnaXN0cnlbaW5zdGFuY2UtPmFvX2lkeF0pOworCQlQREVCVUdfUkVHKCJjaGFubmVsX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5yZWdpc3RyeVtpbnN0YW5jZS0+CisJCQkJCQkJCSBhb19pZHhdIC0KKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwgMHgwODAwKTsKKworCQl0bXAgPSBpbncoaW5zdGFuY2UtPnVuaV9iaV9yZWcpOwkvLyBiaXBvbGFyCisJCXRtcCAmPSB+KDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwkJb3V0dyh0bXAsIGluc3RhbmNlLT51bmlfYmlfcmVnKTsKKwkJUERFQlVHX1JFRygidW5pX2JpX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnVuaV9iaV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisKKwkJdG1wID0gaW53KGluc3RhbmNlLT5pX3JhbmdlX3JlZyk7CS8vIDAuLjIwbUEgPD0gSWYgZXhpc3RzLgorCQl0bXAgJj0gfigweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCW91dHcodG1wLCBpbnN0YW5jZS0+aV9yYW5nZV9yZWcpOworCQlQREVCVUdfUkVHKCJpX3JhbmdlX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmlfcmFuZ2VfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCQlicmVhazsKKworCWNhc2UgMjoJCS8vIDBtQSAyMG1BCisJCXRtcCA9IGludyhpbnN0YW5jZS0+Y3VycmVudF9vbl9yZWcpOwkvLyBtQW1wZXJzCisJCXRtcCB8PSAoMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCQlvdXR3KHRtcCwgaW5zdGFuY2UtPmN1cnJlbnRfb25fcmVnKTsKKwkJUERFQlVHX1JFRygiY3VycmVudF9vbl9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdXJyZW50X29uX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKworCQl0bXAgPSBpbncoaW5zdGFuY2UtPmlfcmFuZ2VfcmVnKTsJLy8gMC4uMjBtQQorCQl0bXAgJj0gfigweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCW91dHcodG1wLCBpbnN0YW5jZS0+aV9yYW5nZV9yZWcpOworCQlQREVCVUdfUkVHKCJpX3JhbmdlX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmlfcmFuZ2VfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCisJCS8vIDBtQQorCQlvdXR3KDAsCisJCSAgICAgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5yZWdpc3RyeVtpbnN0YW5jZS0+YW9faWR4XSk7CisJCVBERUJVR19SRUcoImNoYW5uZWxfcmVnIG91dHcoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICAoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnJlZ2lzdHJ5W2luc3RhbmNlLT4KKwkJCQkJCQkJIGFvX2lkeF0gLQorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKworCQl0bXAgPSBpbncoaW5zdGFuY2UtPnVuaV9iaV9yZWcpOwkvLyB1bmlwb2xhcgorCQl0bXAgfD0gKDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwkJb3V0dyh0bXAsIGluc3RhbmNlLT51bmlfYmlfcmVnKTsKKwkJUERFQlVHX1JFRygidW5pX2JpX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnVuaV9iaV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisJCWJyZWFrOworCisJY2FzZSAzOgkJLy8gNG1BIDIwbUEKKwkJdG1wID0gaW53KGluc3RhbmNlLT5jdXJyZW50X29uX3JlZyk7CS8vIG1BbXBlcnMKKwkJdG1wIHw9ICgweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCW91dHcodG1wLCBpbnN0YW5jZS0+Y3VycmVudF9vbl9yZWcpOworCQlQREVCVUdfUkVHKCJjdXJyZW50X29uX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN1cnJlbnRfb25fcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCisJCXRtcCA9IGludyhpbnN0YW5jZS0+aV9yYW5nZV9yZWcpOwkvLyA0Li4yMG1BCisJCXRtcCB8PSAoMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCQlvdXR3KHRtcCwgaW5zdGFuY2UtPmlfcmFuZ2VfcmVnKTsKKwkJUERFQlVHX1JFRygiaV9yYW5nZV9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5pX3JhbmdlX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKworCQkvLyA0bUEKKwkJb3V0dygwLAorCQkgICAgIChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+cmVnaXN0cnlbaW5zdGFuY2UtPmFvX2lkeF0pOworCQlQREVCVUdfUkVHKCJjaGFubmVsX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5yZWdpc3RyeVtpbnN0YW5jZS0+CisJCQkJCQkJCSBhb19pZHhdIC0KKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwgMCk7CisKKwkJdG1wID0gaW53KGluc3RhbmNlLT51bmlfYmlfcmVnKTsJLy8gdW5pcG9sYXIKKwkJdG1wIHw9ICgweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCW91dHcodG1wLCBpbnN0YW5jZS0+dW5pX2JpX3JlZyk7CisJCVBERUJVR19SRUcoInVuaV9iaV9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT51bmlfYmlfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCQlicmVhazsKKwl9CisKKwkvLyBUcmlnZ2VyIG91dHB1dC4KKwlvdXR3KDB4MDAwMCwgaW5zdGFuY2UtPnNpbV9vdXRwdXRfcmVnKTsKKwlQREVCVUdfUkVHKCJzaW1fb3V0cHV0X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zaW1fb3V0cHV0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMHgwMDAwKTsKKwlvdXR3KDB4RkZGRiwgaW5zdGFuY2UtPnNpbV9vdXRwdXRfcmVnKTsKKwlQREVCVUdfUkVHKCJzaW1fb3V0cHV0X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zaW1fb3V0cHV0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMHhGRkZGKTsKKworCWlmICh0cmlnX2NoYW4gPT0gTUVfVFJJR19DSEFOX0RFRkFVTFQpIHsJLy8gSW5kaXZpZHVhbCB0cmlnZ2VyaW5nLgorCQkoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnN5bmNocm9ub3VzICY9CisJCSAgICB+KDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwkJUERFQlVHKCJJbmRpdmlkdWFsIHRyaWdnZXJpbmcuXG4iKTsKKwl9IGVsc2UgaWYgKHRyaWdfY2hhbiA9PSBNRV9UUklHX0NIQU5fU1lOQ0hST05PVVMpIHsJLy8gU3luY2hyb25vdXMgdHJpZ2dlcmluZy4KKwkJKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5zeW5jaHJvbm91cyB8PQorCQkgICAgKDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwkJUERFQlVHKCJTeW5jaHJvbm91cyB0cmlnZ2VyaW5nLlxuIik7CisJfQorCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jb25maWdfcmVnc19sb2NrKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+YW9fc2hhZG93c19sb2NrKTsKKworCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc2luZ2xlX2NvbmZpZ3VyZWQ7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMTYwMF9hb19pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWUxNjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIGRlbGF5ID0gMDsKKwl1bnNpZ25lZCBsb25nIGogPSAwOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCisJaW5zdGFuY2UgPSAobWUxNjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoZmxhZ3MgJiB+TUVfSU9fU0lOR0xFX05PTkJMT0NLSU5HKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC4gJWRcbiIsIGZsYWdzKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKHRpbWVfb3V0IDwgMCkgeworCQlQRVJST1IoIkludmFsaWQgdGltZW91dCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVElNRU9VVDsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAoKCFmbGFncykgJiYgKChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+dHJpZ2dlciAmIGluc3RhbmNlLT5hb19pZHgpKSB7CS8vQmxvY2tpbmcgbW9kZS4gV2FpdCBmb3Igc29mdHdhcmUgdHJpZ2dlci4KKwkJaWYgKHRpbWVfb3V0KSB7CisJCQlkZWxheSA9ICh0aW1lX291dCAqIEhaKSAvIDEwMDA7CisJCQlpZiAoZGVsYXkgPT0gMCkKKwkJCQlkZWxheSA9IDE7CisJCX0KKworCQlqID0gamlmZmllczsKKworCQkvL09ubHkgcnVuaW5nIHByb2Nlc3Mgd2lsbCBpbnRlcnJ1cHQgdGhpcyBjYWxsLiBFdmVudHMgYXJlIHNpZ25hbGVkIHdoZW4gc3RhdHVzIGNoYW5nZS4gVGhpcyBwcm9jZWR1cmUgaGFzIG93biB0aW1lb3V0LgorCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSAoISgoaW5zdGFuY2UtPgorCQkJCQkJICAgICBhb19yZWdzX3NoYWRvd3MpLT4KKwkJCQkJCSAgICB0cmlnZ2VyICYgaW5zdGFuY2UtPgorCQkJCQkJICAgIGFvX2lkeCkpLAorCQkJCQkJIChkZWxheSkgPyBkZWxheSA6IExPTkdfTUFYKTsKKworCQlpZiAoaW5zdGFuY2UgPT0gYW9fc3RhdHVzX25vbmUpIHsJLy8gUmVzZXQgd2FzIGNhbGxlZC4KKwkJCVBERUJVRygiU2luZ2xlIGNhbmNlbGVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19DQU5DRUxMRUQ7CisJCX0KKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCVBFUlJPUigiV2FpdCBvbiBzdGFydCBvZiBzdGF0ZSBtYWNoaW5lIGludGVycnVwdGVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJCX0KKworCQlpZiAoKGRlbGF5KSAmJiAoKGppZmZpZXMgLSBqKSA+PSBkZWxheSkpIHsKKwkJCVBERUJVRygiVGltZW91dCByZWFjaGVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19USU1FT1VUOworCQl9CisJfQorCisJKnZhbHVlID0gKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5taXJyb3JbaW5zdGFuY2UtPmFvX2lkeF07CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lMTYwMF9hb19pb19zaW5nbGVfd3JpdGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgIGludCB2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWUxNjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1bnNpZ25lZCBsb25nIGRlbGF5ID0gMDsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGogPSAwOworCisJaW5zdGFuY2UgPSAobWUxNjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoZmxhZ3MgJgorCSAgICB+KE1FX0lPX1NJTkdMRV9UWVBFX1RSSUdfU1lOQ0hST05PVVMgfAorCSAgICAgIE1FX0lPX1NJTkdMRV9UWVBFX1dSSVRFX05PTkJMT0NLSU5HKSkgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKHRpbWVfb3V0IDwgMCkgeworCQlQRVJST1IoIkludmFsaWQgdGltZW91dCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVElNRU9VVDsKKwl9CisKKwlpZiAodmFsdWUgJiB+TUUxNjAwX0FPX01BWF9EQVRBKSB7CisJCVBFUlJPUigiSW52YWxpZCB2YWx1ZSBwcm92aWRlZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fVkFMVUVfT1VUX09GX1JBTkdFOworCX0KKworCWlmIChjaGFubmVsKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCS8vQ2FuY2VsIGNvbnRyb2wgdGFzaworCVBERUJVRygiQ2FuY2VsIGNvbnRyb2wgdGFzay4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKwlpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgPSAwOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmluc3RhbmNlLT5hb19jb250cm9sX3Rhc2spOworCShpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+dHJpZ2dlciAmPSB+KDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KTsJLy9DYW5jZWxsIHdhaXRpbmcgZm9yIHRyaWdnZXIuCisKKwlpZiAodGltZV9vdXQpIHsKKwkJZGVsYXkgPSAodGltZV9vdXQgKiBIWikgLyAxMDAwOworCisJCWlmIChkZWxheSA9PSAwKQorCQkJZGVsYXkgPSAxOworCX0KKwkvL1dyaXRlIHZhbHVlLgorCXNwaW5fbG9jayhpbnN0YW5jZS0+YW9fc2hhZG93c19sb2NrKTsKKwkoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnNoYWRvd1tpbnN0YW5jZS0+YW9faWR4XSA9CisJICAgICh1aW50MTZfdCkgdmFsdWU7CisKKwlpZiAoZmxhZ3MgJiBNRV9JT19TSU5HTEVfVFlQRV9UUklHX1NZTkNIUk9OT1VTKSB7CS8vIFRyaWdnZXIgYWxsIG91dHB1dHMgZnJvbSBzeW5jaHJvbm91cyBsaXN0LgorCQlmb3IgKGkgPSAwOyBpIDwgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5jb3VudDsgaSsrKSB7CisJCQlpZiAoKChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+c3luY2hyb25vdXMgJiAoMHgxIDw8IGkpKSB8fCAoaSA9PSBpbnN0YW5jZS0+YW9faWR4KSkgewkvLyBTZXQgYWxsIGZyb20gc3luY2hyb25vdXMgbGlzdCB0byBjb3JyZWN0IHN0YXRlLgorCQkJCVBERUJVRworCQkJCSAgICAoIlN5bmNocm9ub3VzIHRyaWdnZXJpbmc6IG91dHB1dCAlZC4gaWR4PSVkXG4iLAorCQkJCSAgICAgaSwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCQkJKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5taXJyb3JbaV0gPQorCQkJCSAgICAoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnNoYWRvd1tpXTsKKworCQkJCW91dHcoKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5zaGFkb3dbaV0sCisJCQkJICAgICAoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnJlZ2lzdHJ5W2ldKTsKKwkJCQlQREVCVUdfUkVHCisJCQkJICAgICgiY2hhbm5lbF9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAgIChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+cmVnaXN0cnlbaV0gLQorCQkJCSAgICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgICAgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5zaGFkb3dbaV0pOworCisJCQkJKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT50cmlnZ2VyICY9CisJCQkJICAgIH4oMHgxIDw8IGkpOworCQkJfQorCQl9CisKKwkJLy8gVHJpZ2dlciBvdXRwdXQuCisJCW91dHcoMHgwMDAwLCBpbnN0YW5jZS0+c2ltX291dHB1dF9yZWcpOworCQlQREVCVUdfUkVHKCJzaW1fb3V0cHV0X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnNpbV9vdXRwdXRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwkJb3V0dygweEZGRkYsIGluc3RhbmNlLT5zaW1fb3V0cHV0X3JlZyk7CisJCVBERUJVR19SRUcoInNpbV9vdXRwdXRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+c2ltX291dHB1dF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICAweEZGRkYpOworCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3NpbmdsZV9lbmQ7CisJfSBlbHNlIHsJCS8vIEluZGl2aWR1YWwgbW9kZS4KKwkJaWYgKChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+c3luY2hyb25vdXMgJiAoMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpKSB7CS8vIFB1dCBvbiBzeW5jaHJvbm91cyBzdGFydCBsaXN0LiBTZXQgb3V0cHV0IGFzIHdhaXRpbmcgZm9yIHRyaWdnZXIuCisJCQlQREVCVUcoIkFkZCB0byBzeW5jaHJvbm91cyBsaXN0LiBpZHg9JWRcbiIsCisJCQkgICAgICAgaW5zdGFuY2UtPmFvX2lkeCk7CisJCQkoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnRyaWdnZXIgfD0KKwkJCSAgICAoMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zaW5nbGVfcnVuOworCQkJUERFQlVHKCJTeW5jaHJvbm91cyBsaXN0OiAweCV4LlxuIiwKKwkJCSAgICAgICAoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnN5bmNocm9ub3VzKTsKKwkJfSBlbHNlIHsJLy8gRmlyZWQgdGhpcyBvbmUuCisJCQlQREVCVUcoIlRyaWdnZXJpbmcuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCQkoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPm1pcnJvcltpbnN0YW5jZS0+YW9faWR4XSA9CisJCQkgICAgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5zaGFkb3dbaW5zdGFuY2UtPgorCQkJCQkJCQlhb19pZHhdOworCisJCQlvdXR3KChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+CisJCQkgICAgIHNoYWRvd1tpbnN0YW5jZS0+YW9faWR4XSwKKwkJCSAgICAgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5yZWdpc3RyeVtpbnN0YW5jZS0+CisJCQkJCQkJCSAgIGFvX2lkeF0pOworCQkJUERFQlVHX1JFRygiY2hhbm5lbF9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT4KKwkJCQkgICByZWdpc3RyeVtpbnN0YW5jZS0+YW9faWR4XSAtCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+CisJCQkJICAgc2hhZG93W2luc3RhbmNlLT5hb19pZHhdKTsKKworCQkJLy8gU2V0IG91dHB1dCBhcyB0cmlnZ2VyZWQuCisJCQkoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnRyaWdnZXIgJj0KKwkJCSAgICB+KDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKworCQkJLy8gVHJpZ2dlciBvdXRwdXQuCisJCQlvdXR3KDB4MDAwMCwgaW5zdGFuY2UtPnNpbV9vdXRwdXRfcmVnKTsKKwkJCVBERUJVR19SRUcoInNpbV9vdXRwdXRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5zaW1fb3V0cHV0X3JlZyAtCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwkJCW91dHcoMHhGRkZGLCBpbnN0YW5jZS0+c2ltX291dHB1dF9yZWcpOworCQkJUERFQlVHX1JFRygic2ltX291dHB1dF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnNpbV9vdXRwdXRfcmVnIC0KKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsIDB4RkZGRik7CisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3NpbmdsZV9lbmQ7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmFvX3NoYWRvd3NfbG9jayk7CisKKwkvL0luaXQgY29udHJvbCB0YXNrCisJaW5zdGFuY2UtPnRpbWVvdXQuZGVsYXkgPSBkZWxheTsKKwlpbnN0YW5jZS0+dGltZW91dC5zdGFydF90aW1lID0gamlmZmllczsKKwlpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgPSAxOworCXF1ZXVlX2RlbGF5ZWRfd29yayhpbnN0YW5jZS0+bWUxNjAwX3dvcmtxdWV1ZSwKKwkJCSAgICZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrLCAxKTsKKworCWlmICgoIWZsYWdzICYgTUVfSU9fU0lOR0xFX1RZUEVfV1JJVEVfTk9OQkxPQ0tJTkcpICYmICgoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnRyaWdnZXIgJiBpbnN0YW5jZS0+YW9faWR4KSkgewkvL0Jsb2NraW5nIG1vZGUuIFdhaXQgZm9yIHNvZnR3YXJlIHRyaWdnZXIuCisJCWlmICh0aW1lX291dCkgeworCQkJZGVsYXkgPSAodGltZV9vdXQgKiBIWikgLyAxMDAwOworCQkJaWYgKGRlbGF5ID09IDApCisJCQkJZGVsYXkgPSAxOworCQl9CisKKwkJaiA9IGppZmZpZXM7CisKKwkJLy9Pbmx5IHJ1bmluZyBwcm9jZXNzIHdpbGwgaW50ZXJydXB0IHRoaXMgY2FsbC4gRXZlbnRzIGFyZSBzaWduYWxlZCB3aGVuIHN0YXR1cyBjaGFuZ2UuIFRoaXMgcHJvY2VkdXJlIGhhcyBvd24gdGltZW91dC4KKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaW5zdGFuY2UtPndhaXRfcXVldWUsCisJCQkJCQkgKCEoKGluc3RhbmNlLT4KKwkJCQkJCSAgICAgYW9fcmVnc19zaGFkb3dzKS0+CisJCQkJCQkgICAgdHJpZ2dlciAmIGluc3RhbmNlLT4KKwkJCQkJCSAgICBhb19pZHgpKSwKKwkJCQkJCSAoZGVsYXkpID8gZGVsYXkgOiBMT05HX01BWCk7CisKKwkJaWYgKGluc3RhbmNlID09IGFvX3N0YXR1c19ub25lKSB7CisJCQlQREVCVUcoIlNpbmdsZSBjYW5jZWxlZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQl9CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJUEVSUk9SKCJXYWl0IG9uIHN0YXJ0IG9mIHN0YXRlIG1hY2hpbmUgaW50ZXJydXB0ZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwkJfQorCisJCWlmICgoZGVsYXkpICYmICgoamlmZmllcyAtIGopID49IGRlbGF5KSkgeworCQkJUERFQlVHKCJUaW1lb3V0IHJlYWNoZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX1RJTUVPVVQ7CisJCX0KKwl9CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWUxNjAwX2FvX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgaW50ICpudW1iZXIpCit7CisJbWUxNjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnN0YW5jZSA9IChtZTE2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCSpudW1iZXIgPSAxOwkJLy9FdmVyeSBzdWJkZXZpY2UgaGFzIG9ubHkgMSBjaGFubmVsLgorCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMTYwMF9hb19xdWVyeV9zdWJkZXZpY2VfdHlwZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwgaW50ICp0eXBlLAorCQkJCQkgIGludCAqc3VidHlwZSkKK3sKKwltZTE2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWluc3RhbmNlID0gKG1lMTYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJKnR5cGUgPSBNRV9UWVBFX0FPOworCSpzdWJ0eXBlID0gTUVfU1VCVFlQRV9TSU5HTEU7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUxNjAwX2FvX3F1ZXJ5X3N1YmRldmljZV9jYXBzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLCBpbnQgKmNhcHMpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpjYXBzID0gTUVfQ0FQU19BT19UUklHX1NZTkNIUk9OT1VTOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMTYwMF9hb19xdWVyeV9yYW5nZV9ieV9taW5fbWF4KG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICAgaW50IHVuaXQsCisJCQkJCSAgICBpbnQgKm1pbiwKKwkJCQkJICAgIGludCAqbWF4LCBpbnQgKm1heGRhdGEsIGludCAqcmFuZ2UpCit7CisJbWUxNjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgaTsKKwlpbnQgciA9IC0xOworCWludCBkaWZmID0gMjFFNjsKKworCWluc3RhbmNlID0gKG1lMTYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKCgqbWF4IC0gKm1pbikgPCAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfTUlOX01BWDsKKwl9CisJLy8gTWF4aW11bSByYW5nZXMgYXJlIHNsaWdodGx5IGxlc3MgdGhlbiAxMFYgb3IgMjBtQS4gRm9yIGNvbnZlbmllbnQgd2UgYWNjZXB0ZWQgdGhpcyB2YWx1ZSBhcyB2YWxpZCBvbmUuCisJaWYgKHVuaXQgPT0gTUVfVU5JVF9WT0xUKSB7CisJCWZvciAoaSA9IDA7IGkgPCBpbnN0YW5jZS0+dV9yYW5nZXNfY291bnQ7IGkrKykgeworCQkJaWYgKChpbnN0YW5jZS0+dV9yYW5nZXNbaV0ubWluIDw9ICptaW4pCisJCQkgICAgJiYgKChpbnN0YW5jZS0+dV9yYW5nZXNbaV0ubWF4ICsgNTAwMCkgPj0gKm1heCkpIHsKKwkJCQlpZiAoKGluc3RhbmNlLT51X3Jhbmdlc1tpXS5tYXggLQorCQkJCSAgICAgaW5zdGFuY2UtPnVfcmFuZ2VzW2ldLm1pbikgLSAoKm1heCAtCisJCQkJCQkJCSAgICptaW4pIDwKKwkJCQkgICAgZGlmZikgeworCQkJCQlyID0gaTsKKwkJCQkJZGlmZiA9CisJCQkJCSAgICAoaW5zdGFuY2UtPnVfcmFuZ2VzW2ldLm1heCAtCisJCQkJCSAgICAgaW5zdGFuY2UtPnVfcmFuZ2VzW2ldLm1pbikgLQorCQkJCQkgICAgKCptYXggLSAqbWluKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAociA8IDApIHsKKwkJCVBFUlJPUigiTm8gbWF0Y2hpbmcgcmFuZ2UgZm91bmQuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19OT19SQU5HRTsKKwkJfSBlbHNlIHsKKwkJCSptaW4gPSBpbnN0YW5jZS0+dV9yYW5nZXNbcl0ubWluOworCQkJKm1heCA9IGluc3RhbmNlLT51X3Jhbmdlc1tyXS5tYXg7CisJCQkqcmFuZ2UgPSByOworCQl9CisJfSBlbHNlIGlmICh1bml0ID09IE1FX1VOSVRfQU1QRVJFKSB7CisJCWZvciAoaSA9IDA7IGkgPCBpbnN0YW5jZS0+aV9yYW5nZXNfY291bnQ7IGkrKykgeworCQkJaWYgKChpbnN0YW5jZS0+aV9yYW5nZXNbaV0ubWluIDw9ICptaW4pCisJCQkgICAgJiYgKGluc3RhbmNlLT5pX3Jhbmdlc1tpXS5tYXggKyA1MDAwID49ICptYXgpKSB7CisJCQkJaWYgKChpbnN0YW5jZS0+aV9yYW5nZXNbaV0ubWF4IC0KKwkJCQkgICAgIGluc3RhbmNlLT5pX3Jhbmdlc1tpXS5taW4pIC0gKCptYXggLQorCQkJCQkJCQkgICAqbWluKSA8CisJCQkJICAgIGRpZmYpIHsKKwkJCQkJciA9IGk7CisJCQkJCWRpZmYgPQorCQkJCQkgICAgKGluc3RhbmNlLT5pX3Jhbmdlc1tpXS5tYXggLQorCQkJCQkgICAgIGluc3RhbmNlLT5pX3Jhbmdlc1tpXS5taW4pIC0KKwkJCQkJICAgICgqbWF4IC0gKm1pbik7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKHIgPCAwKSB7CisJCQlQRVJST1IoIk5vIG1hdGNoaW5nIHJhbmdlIGZvdW5kLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fTk9fUkFOR0U7CisJCX0gZWxzZSB7CisJCQkqbWluID0gaW5zdGFuY2UtPmlfcmFuZ2VzW3JdLm1pbjsKKwkJCSptYXggPSBpbnN0YW5jZS0+aV9yYW5nZXNbcl0ubWF4OworCQkJKnJhbmdlID0gciArIGluc3RhbmNlLT51X3Jhbmdlc19jb3VudDsKKwkJfQorCX0gZWxzZSB7CisJCVBFUlJPUigiSW52YWxpZCBwaHlzaWNhbCB1bml0IHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9VTklUOworCX0KKwkqbWF4ZGF0YSA9IE1FMTYwMF9BT19NQVhfREFUQTsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lMTYwMF9hb19xdWVyeV9udW1iZXJfcmFuZ2VzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgaW50IHVuaXQsIGludCAqY291bnQpCit7CisJbWUxNjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lMTYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisJc3dpdGNoICh1bml0KSB7CisJY2FzZSBNRV9VTklUX1ZPTFQ6CisJCSpjb3VudCA9IGluc3RhbmNlLT51X3Jhbmdlc19jb3VudDsKKwkJYnJlYWs7CisJY2FzZSBNRV9VTklUX0FNUEVSRToKKwkJKmNvdW50ID0gaW5zdGFuY2UtPmlfcmFuZ2VzX2NvdW50OworCQlicmVhazsKKwljYXNlIE1FX1VOSVRfQU5ZOgorCQkqY291bnQgPSBpbnN0YW5jZS0+dV9yYW5nZXNfY291bnQgKyBpbnN0YW5jZS0+aV9yYW5nZXNfY291bnQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCSpjb3VudCA9IDA7CisJfQorCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWUxNjAwX2FvX3F1ZXJ5X3JhbmdlX2luZm8obWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgaW50IHJhbmdlLAorCQkJCSAgICAgIGludCAqdW5pdCwKKwkJCQkgICAgICBpbnQgKm1pbiwgaW50ICptYXgsIGludCAqbWF4ZGF0YSkKK3sKKwltZTE2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWUxNjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmICgoKHJhbmdlICsgMSkgPgorCSAgICAgKGluc3RhbmNlLT51X3Jhbmdlc19jb3VudCArIGluc3RhbmNlLT5pX3Jhbmdlc19jb3VudCkpCisJICAgIHx8IChyYW5nZSA8IDApKSB7CisJCVBFUlJPUigiSW52YWxpZCByYW5nZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1JBTkdFOworCX0KKworCWlmIChyYW5nZSA8IGluc3RhbmNlLT51X3Jhbmdlc19jb3VudCkgeworCQkqdW5pdCA9IE1FX1VOSVRfVk9MVDsKKwkJKm1pbiA9IGluc3RhbmNlLT51X3Jhbmdlc1tyYW5nZV0ubWluOworCQkqbWF4ID0gaW5zdGFuY2UtPnVfcmFuZ2VzW3JhbmdlXS5tYXg7CisJfSBlbHNlIGlmIChyYW5nZSA8IGluc3RhbmNlLT51X3Jhbmdlc19jb3VudCArIGluc3RhbmNlLT5pX3Jhbmdlc19jb3VudCkgeworCQkqdW5pdCA9IE1FX1VOSVRfQU1QRVJFOworCQkqbWluID0gaW5zdGFuY2UtPmlfcmFuZ2VzW3JhbmdlIC0gaW5zdGFuY2UtPnVfcmFuZ2VzX2NvdW50XS5taW47CisJCSptYXggPSBpbnN0YW5jZS0+aV9yYW5nZXNbcmFuZ2UgLSBpbnN0YW5jZS0+dV9yYW5nZXNfY291bnRdLm1heDsKKwl9CisJKm1heGRhdGEgPSBNRTE2MDBfQU9fTUFYX0RBVEE7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKK3N0YXRpYyB2b2lkIG1lMTYwMF9hb193b3JrX2NvbnRyb2xfdGFzayh2b2lkICpzdWJkZXZpY2UpCisjZWxzZQorc3RhdGljIHZvaWQgbWUxNjAwX2FvX3dvcmtfY29udHJvbF90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKKyNlbmRpZgoreworCW1lMTYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IHJlc2NoZWR1bGUgPSAxOworCWludCBzaWduYWxpbmcgPSAwOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorCWluc3RhbmNlID0gKG1lMTYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisjZWxzZQorCWluc3RhbmNlID0KKwkgICAgY29udGFpbmVyX29mKCh2b2lkICopd29yaywgbWUxNjAwX2FvX3N1YmRldmljZV90LCBhb19jb250cm9sX3Rhc2spOworI2VuZGlmCisKKwlQSU5GTygiPCVzOiAlbGQ+IGV4ZWN1dGVkLiBpZHg9JWRcbiIsIF9fZnVuY19fLCBqaWZmaWVzLAorCSAgICAgIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKCEoKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT50cmlnZ2VyICYgaW5zdGFuY2UtPmFvX2lkeCkpIHsJLy8gT3V0cHV0IHdhcyB0cmlnZ2VyZC4KKwkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCXNpZ25hbGluZyA9IDE7CisJCXJlc2NoZWR1bGUgPSAwOworCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfc2luZ2xlX3J1bikgeworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zaW5nbGVfZW5kOworCQl9CisKKwl9IGVsc2UgaWYgKChpbnN0YW5jZS0+dGltZW91dC5kZWxheSkgJiYgKChqaWZmaWVzIC0gaW5zdGFuY2UtPnRpbWVvdXQuc3RhcnRfdGltZSkgPj0gaW5zdGFuY2UtPnRpbWVvdXQuZGVsYXkpKSB7CS8vIFRpbWVvdXQKKwkJUERFQlVHKCJUaW1lb3V0IHJlYWNoZWQuXG4iKTsKKwkJc3Bpbl9sb2NrKGluc3RhbmNlLT5hb19zaGFkb3dzX2xvY2spOworCQkvLyBSZXN0b3JlIG9sZCBzZXR0aW5ncy4KKwkJUERFQlVHKCJXcml0ZSBvbGQgdmFsdWUgYmFjayB0byByZWdpc3Rlci5cbiIpOworCQkoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPnNoYWRvd1tpbnN0YW5jZS0+YW9faWR4XSA9CisJCSAgICAoaW5zdGFuY2UtPmFvX3JlZ3Nfc2hhZG93cyktPm1pcnJvcltpbnN0YW5jZS0+YW9faWR4XTsKKworCQlvdXR3KChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+bWlycm9yW2luc3RhbmNlLT5hb19pZHhdLAorCQkgICAgIChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+cmVnaXN0cnlbaW5zdGFuY2UtPmFvX2lkeF0pOworCQlQREVCVUdfUkVHKCJjaGFubmVsX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT5yZWdpc3RyeVtpbnN0YW5jZS0+CisJCQkJCQkJCSBhb19pZHhdIC0KKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIChpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+bWlycm9yW2luc3RhbmNlLT4KKwkJCQkJCQkgICAgICAgYW9faWR4XSk7CisKKwkJLy9SZW1vdmUgZnJvbSBzeW5jaHJvbm91cyBzdHJ0IGxpc3QuCisJCShpbnN0YW5jZS0+YW9fcmVnc19zaGFkb3dzKS0+dHJpZ2dlciAmPQorCQkgICAgfigweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCWlmIChpbnN0YW5jZS0+c3RhdHVzID09IGFvX3N0YXR1c19ub25lKSB7CisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3NpbmdsZV9lbmQ7CisJCX0KKwkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmFvX3NoYWRvd3NfbG9jayk7CisKKwkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCXNpZ25hbGluZyA9IDE7CisJCXJlc2NoZWR1bGUgPSAwOworCX0KKworCWlmIChzaWduYWxpbmcpIHsJLy9TaWduYWwgaXQuCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKwl9CisKKwlpZiAoaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnICYmIHJlc2NoZWR1bGUpIHsJLy8gUmVzY2hlZHVsZSB0YXNrCisJCXF1ZXVlX2RlbGF5ZWRfd29yayhpbnN0YW5jZS0+bWUxNjAwX3dvcmtxdWV1ZSwKKwkJCQkgICAmaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFzaywgMSk7CisJfSBlbHNlIHsKKwkJUElORk8oIjwlcz4gRW5kaW5nIGNvbnRyb2wgdGFzay5cbiIsIF9fZnVuY19fKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTE2MDBfYW8uaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTE2MDBfYW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODJiZjVhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTYwMF9hby5oCkBAIC0wLDAgKzEsMTMyIEBACisvKioKKyAqIEBmaWxlIG1lMTYwMF9hby5oCisgKgorICogQGJyaWVmIE1laWxoYXVzIE1FLTE2MDAgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUUxNjAwX0FPX0hfCisjZGVmaW5lIF9NRTE2MDBfQU9fSF8KKworIyBpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjIGluY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisKKyMgaWZkZWYgX19LRVJORUxfXworCisjICBkZWZpbmUgTUUxNjAwX01BWF9SQU5HRVMJMgkvKio8IFNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmFuZ2VzIGluIG1lMTYwMF9hb19zdWJkZXZpY2VfdDo6dV9yYW5nZXMgdW5kIG1lMTYwMF9hb19zdWJkZXZpY2VfdDo6aV9yYW5nZXMuICovCisKKy8qKgorICogQGJyaWVmIERlZmluZXMgYSBlbnRyeSBpbiB0aGUgcmFuZ2UgdGFibGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lMTYwMF9hb19yYW5nZV9lbnRyeSB7CisJaW50MzJfdCBtaW47CisJaW50MzJfdCBtYXg7Cit9IG1lMTYwMF9hb19yYW5nZV9lbnRyeV90OworCit0eXBlZGVmIHN0cnVjdCBtZTE2MDBfYW9fdGltZW91dCB7CisJdW5zaWduZWQgbG9uZyBzdGFydF90aW1lOworCXVuc2lnbmVkIGxvbmcgZGVsYXk7Cit9IG1lMTYwMF9hb190aW1lb3V0X3Q7CisKK3R5cGVkZWYgc3RydWN0IG1lMTYwMF9hb19zaGFkb3cgeworCWludCBjb3VudDsKKwl1bnNpZ25lZCBsb25nICpyZWdpc3RyeTsKKwl1aW50MTZfdCAqc2hhZG93OworCXVpbnQxNl90ICptaXJyb3I7CisJdWludDE2X3Qgc3luY2hyb25vdXM7CQkJCQkJCQkJLyoqPCBTeW5jaHJvbml6YXRpb24gbGlzdC4gKi8KKwl1aW50MTZfdCB0cmlnZ2VyOwkJCQkJCQkJCQkvKio8IFN5bmNocm9uaXphdGlvbiBmbGFnLiAqLworfSBtZTE2MDBfYW9fc2hhZG93X3Q7CisKK3R5cGVkZWYgZW51bSBNRTE2MDBfQU9fU1RBVFVTIHsKKwlhb19zdGF0dXNfbm9uZSA9IDAsCisJYW9fc3RhdHVzX3NpbmdsZV9jb25maWd1cmVkLAorCWFvX3N0YXR1c19zaW5nbGVfcnVuLAorCWFvX3N0YXR1c19zaW5nbGVfZW5kLAorCWFvX3N0YXR1c19sYXN0Cit9IE1FMTYwMF9BT19TVEFUVVM7CisKKy8qKgorICogQGJyaWVmIFRoZSBNRS0xNjAwIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTE2MDBfYW9fc3ViZGV2aWNlIHsKKwkvKiBJbmhlcml0YW5jZSAqLworCW1lX3N1YmRldmljZV90IGJhc2U7CQkJCQkJCQkJLyoqPCBUaGUgc3ViZGV2aWNlIGJhc2UgY2xhc3MuICovCisKKwkvKiBBdHRyaWJ1dGVzICovCisJaW50IGFvX2lkeDsJCQkJCQkJCQkJCQkvKio8IFRoZSBpbmRleCBvZiB0aGUgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2Ugb24gdGhlIGRldmljZS4gKi8KKworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkJCQkJCQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0IHRoZSBzdWJkZXZpY2UgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwlzcGlubG9ja190ICpjb25maWdfcmVnc19sb2NrOwkJCQkJCQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisKKwlpbnQgdV9yYW5nZXNfY291bnQ7CQkJCQkJCQkJCS8qKjwgVGhlIG51bWJlciBvZiB2b2x0YWdlIHJhbmdlcyBhdmFpbGFibGUgb24gdGhpcyBzdWJkZXZpY2UuICovCisJbWUxNjAwX2FvX3JhbmdlX2VudHJ5X3QgdV9yYW5nZXNbTUUxNjAwX01BWF9SQU5HRVNdOwkvKio8IEFycmF5IGhvbGRpbmcgdGhlIHZvbHRhZ2UgcmFuZ2VzIG9uIHRoaXMgc3ViZGV2aWNlLiAqLworCWludCBpX3Jhbmdlc19jb3VudDsJCQkJCQkJCQkJLyoqPCBUaGUgbnVtYmVyIG9mIGN1cnJlbnQgcmFuZ2VzIGF2YWlsYWJsZSBvbiB0aGlzIHN1YmRldmljZS4gKi8KKwltZTE2MDBfYW9fcmFuZ2VfZW50cnlfdCBpX3Jhbmdlc1tNRTE2MDBfTUFYX1JBTkdFU107CS8qKjwgQXJyYXkgaG9sZGluZyB0aGUgY3VycmVudCByYW5nZXMgb24gdGhpcyBzdWJkZXZpY2UuICovCisKKwkvKiBSZWdpc3RlcnMgKi8KKwl1bnNpZ25lZCBsb25nIHVuaV9iaV9yZWc7CQkJCQkJCQkvKio8IFJlZ2lzdGVyIGZvciBzd2l0Y2hpbmcgYmV0d2VlbiB1bmlwb2FyIGFuZCBiaXBvbGFyIG91dHB1dCBtb2RlLiAqLworCXVuc2lnbmVkIGxvbmcgaV9yYW5nZV9yZWc7CQkJCQkJCQkvKio8IFJlZ2lzdGVyIGZvciBzd2l0Y2hpbmcgYmV0d2VlbiByYW5nZXMuICovCisJdW5zaWduZWQgbG9uZyBzaW1fb3V0cHV0X3JlZzsJCQkJCQkJLyoqPCBSZWdpc3RlciB1c2VkIGluIG9yZGVyIHRvIHVwZGF0ZSBhbGwgY2hhbm5lbHMgc2ltdWx0YW5lb3VzbHkuICovCisJdW5zaWduZWQgbG9uZyBjdXJyZW50X29uX3JlZzsJCQkJCQkJLyoqPCBSZWdpc3RlciBlbmFibGluZyBjdXJyZW50IG91dHB1dCBvbiB0aGUgZm91cnRoIHN1YmRldmljZS4gKi8KKyMgICBpZmRlZiBQREVCVUdfUkVHCisJdW5zaWduZWQgbG9uZyByZWdfYmFzZTsKKyMgICBlbmRpZgorCisJTUUxNjAwX0FPX1NUQVRVUyBzdGF0dXM7CisJbWUxNjAwX2FvX3NoYWRvd190ICphb19yZWdzX3NoYWRvd3M7CQkJCQkvKio8IEFkZHJlc3NlcyBhbmQgc2hhZG93cyBvZiBvdXRwdXQncyByZWdpc3RlcnMuICovCisJc3BpbmxvY2tfdCAqYW9fc2hhZG93c19sb2NrOwkJCQkJCQkvKio8IFByb3RlY3RzIHRoZSBzaGFkb3cncyBzdHJ1Y3QuICovCisJaW50IG1vZGU7CQkJCQkJCQkJCQkJLyoqPCBNb2RlIGluIHdpdGNoIG91dHB1dCBzaG91bGQgd29ya3MuICovCisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9xdWV1ZTsJCQkJCQkJLyoqPCBXYWl0IHF1ZXVlIHRvIHB1dCBvbiB0YXNrcyB3YWl0aW5nIGZvciBkYXRhIHRvIGFycml2ZS4gKi8KKwltZTE2MDBfYW9fdGltZW91dF90IHRpbWVvdXQ7CQkJCQkJCS8qKjwgVGhlIHRpbWVvdXQgZm9yIHN0YXJ0IGluIGJsb2NraW5nIGFuZCBub24tYmxvY2tpbmcgbW9kZS4gKi8KKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqbWUxNjAwX3dvcmtxdWV1ZTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjApCisJc3RydWN0IHdvcmtfc3RydWN0IGFvX2NvbnRyb2xfdGFzazsKKyNlbHNlCisJc3RydWN0IGRlbGF5ZWRfd29yayBhb19jb250cm9sX3Rhc2s7CisjZW5kaWYKKworCXZvbGF0aWxlIGludCBhb19jb250cm9sX3Rhc2tfZmxhZzsJCQkJCQkvKio8IEZsYWcgY29udHJvbGluZyByZWV4ZWN1dGluZyBvZiBjb250cm9sIHRhc2sgKi8KK30gbWUxNjAwX2FvX3N1YmRldmljZV90OworCisvKioKKyAqIEBicmllZiBUaGUgY29uc3RydWN0b3IgdG8gZ2VuZXJhdGUgYSBzdWJkZXZpY2UgdGVtcGxhdGUgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gYW9faWR4IFRoZSBpbmRleCBvZiB0aGUgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2Ugb24gdGhlIGRldmljZS4KKyAqIEBwYXJhbSBjdXJyZW50IEZsYWcgaW5kaWNhdGluZyB0aGF0IGFuYWxvZyBvdXRwdXQgd2l0aCAjYW9faWR4IG9mIDMgaXMgY2FwYWJsZSBvZiBjdXJyZW50IG91dHB1dC4KKyAqIEBwYXJhbSBjb25maWdfcmVnc19sb2NrIFBvaW50ZXIgdG8gc3BpbiBsb2NrIHByb3RlY3RpbmcgdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIGFuZCBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWUxNjAwX2FvX3N1YmRldmljZV90ICptZTE2MDBfYW9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGFvX2lkeCwKKwkJCQkJICAgICBpbnQgY3VyciwKKwkJCQkJICAgICBzcGlubG9ja190ICogY29uZmlnX3JlZ3NfbG9jaywKKwkJCQkJICAgICBzcGlubG9ja190ICogYW9fc2hhZG93c19sb2NrLAorCQkJCQkgICAgIG1lMTYwMF9hb19zaGFkb3dfdCAqCisJCQkJCSAgICAgYW9fcmVnc19zaGFkb3dzLAorCQkJCQkgICAgIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0CisJCQkJCSAgICAgKm1lMTYwMF93cSk7CisKKyMgZW5kaWYJLy9fX0tFUk5FTF9fCisjZW5kaWYgLy9fTUUxNjAwX0FPX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNjAwX2FvX3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTYwMF9hb19yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWU3ODAwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTYwMF9hb19yZWcuaApAQCAtMCwwICsxLDY2IEBACisvKioKKyAqIEBmaWxlIG1lMTYwMF9hb19yZWcuaAorICoKKyAqIEBicmllZiBNRS0xNjAwIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FMTYwMF9BT19SRUdfSF8KKyNkZWZpbmUgX01FMTYwMF9BT19SRUdfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBNRTE2MDBfQ0hBTk5FTF8wX1JFRyAgICAweDAwCS8qKjwgUmVnaXN0ZXIgdG8gc2V0IGEgZGlnaXRhbCB2YWx1ZSBvbiBjaGFubmVsIDAuICovCisjZGVmaW5lIE1FMTYwMF9DSEFOTkVMXzFfUkVHICAgIDB4MDIJLyoqPCBSZWdpc3RlciB0byBzZXQgYSBkaWdpdGFsIHZhbHVlIG9uIGNoYW5uZWwgMS4gKi8KKyNkZWZpbmUgTUUxNjAwX0NIQU5ORUxfMl9SRUcgICAgMHgwNAkvKio8IFJlZ2lzdGVyIHRvIHNldCBhIGRpZ2l0YWwgdmFsdWUgb24gY2hhbm5lbCAyLiAqLworI2RlZmluZSBNRTE2MDBfQ0hBTk5FTF8zX1JFRyAgICAweDA2CS8qKjwgUmVnaXN0ZXIgdG8gc2V0IGEgZGlnaXRhbCB2YWx1ZSBvbiBjaGFubmVsIDMuICovCisjZGVmaW5lIE1FMTYwMF9DSEFOTkVMXzRfUkVHICAgIDB4MDgJLyoqPCBSZWdpc3RlciB0byBzZXQgYSBkaWdpdGFsIHZhbHVlIG9uIGNoYW5uZWwgNC4gKi8KKyNkZWZpbmUgTUUxNjAwX0NIQU5ORUxfNV9SRUcgICAgMHgwQQkvKio8IFJlZ2lzdGVyIHRvIHNldCBhIGRpZ2l0YWwgdmFsdWUgb24gY2hhbm5lbCA1LiAqLworI2RlZmluZSBNRTE2MDBfQ0hBTk5FTF82X1JFRyAgICAweDBDCS8qKjwgUmVnaXN0ZXIgdG8gc2V0IGEgZGlnaXRhbCB2YWx1ZSBvbiBjaGFubmVsIDYuICovCisjZGVmaW5lIE1FMTYwMF9DSEFOTkVMXzdfUkVHICAgIDB4MEUJLyoqPCBSZWdpc3RlciB0byBzZXQgYSBkaWdpdGFsIHZhbHVlIG9uIGNoYW5uZWwgNy4gKi8KKyNkZWZpbmUgTUUxNjAwX0NIQU5ORUxfOF9SRUcgICAgMHgxMAkvKio8IFJlZ2lzdGVyIHRvIHNldCBhIGRpZ2l0YWwgdmFsdWUgb24gY2hhbm5lbCA4LiAqLworI2RlZmluZSBNRTE2MDBfQ0hBTk5FTF85X1JFRyAgICAweDEyCS8qKjwgUmVnaXN0ZXIgdG8gc2V0IGEgZGlnaXRhbCB2YWx1ZSBvbiBjaGFubmVsIDkuICovCisjZGVmaW5lIE1FMTYwMF9DSEFOTkVMXzEwX1JFRyAgIDB4MTQJLyoqPCBSZWdpc3RlciB0byBzZXQgYSBkaWdpdGFsIHZhbHVlIG9uIGNoYW5uZWwgMTAuICovCisjZGVmaW5lIE1FMTYwMF9DSEFOTkVMXzExX1JFRyAgIDB4MTYJLyoqPCBSZWdpc3RlciB0byBzZXQgYSBkaWdpdGFsIHZhbHVlIG9uIGNoYW5uZWwgMTEuICovCisjZGVmaW5lIE1FMTYwMF9DSEFOTkVMXzEyX1JFRyAgIDB4MTgJLyoqPCBSZWdpc3RlciB0byBzZXQgYSBkaWdpdGFsIHZhbHVlIG9uIGNoYW5uZWwgMTIuICovCisjZGVmaW5lIE1FMTYwMF9DSEFOTkVMXzEzX1JFRyAgIDB4MUEJLyoqPCBSZWdpc3RlciB0byBzZXQgYSBkaWdpdGFsIHZhbHVlIG9uIGNoYW5uZWwgMTMuICovCisjZGVmaW5lIE1FMTYwMF9DSEFOTkVMXzE0X1JFRyAgIDB4MUMJLyoqPCBSZWdpc3RlciB0byBzZXQgYSBkaWdpdGFsIHZhbHVlIG9uIGNoYW5uZWwgMTQuICovCisjZGVmaW5lIE1FMTYwMF9DSEFOTkVMXzE1X1JFRyAgIDB4MUUJLyoqPCBSZWdpc3RlciB0byBzZXQgYSBkaWdpdGFsIHZhbHVlIG9uIGNoYW5uZWwgMTUuICovCisKKy8qIEV2ZXJ5IGNoYW5uZWwgb25lIGJpdDogYmlwb2xhciA9IDAsIHVuaXBvbGFyID0gMSAqLworI2RlZmluZSBNRTE2MDBfVU5JX0JJX1JFRwkJMHgyMAkvKio8IFJlZ2lzdGVyIHRvIHN3aXRjaCBiZXR3ZWVuIHVuaXBvbGFyIGFuZCBiaXBvbGFyLiAqLworCisvKiBFdmVyeSBjaGFubmVsIG9uZSBiaXQgKG9ubHkgbG93ZXIgOCBCaXRzKTogMC4uMjBtQSA9IDAsIDQuLjIwbUEgPSAxICovCisjZGVmaW5lIE1FMTYwMF8wMjBfNDIwX1JFRwkJMHgyMgkvKio8IFJlZ2lzdGVyIHRvIHN3aXRjaCBiZXR3ZWVuIHRoZSB0d28gY3VycmVudCByYW5nZXMuICovCisKKy8qIElmIGEgYml0IGlzIHNldCwgdGhlIGNvcnJlc3BvbmRpbmcgREFDICg0IHBvcnRzIGVhY2gpIGlzCisgICBub3Qgc2V0IGF0IHRoZSBtb21lbnQgeW91IHdyaXRlIHRvIGFuIG91dHB1dCBvZiBpdC4KKyAgIENsZWFyaW5nIHRoZSBiaXQgdXBkYXRlcyB0aGUgcG9ydC4gKi8KKyNkZWZpbmUgTUUxNjAwX1NJTV9PVVRQVVRfUkVHCTB4MjQJLyoqPCBSZWdpc3RlciB0byB1cGRhdGUgYWxsIGNoYW5uZWxzIG9mIGEgc3ViZGV2aWNlIHNpbXVsdGFuZW91c2x5LiAqLworCisvKiBDdXJyZW50IG9uL29mZiAob25seSBsb3dlciA4IGJpdHMpOiBvZmYgPSAwLCBvbiAgPSAxICovCisjZGVmaW5lIE1FMTYwMF9DVVJSRU5UX09OX1JFRwkweDI2CS8qKjwgUmVnaXN0ZXIgdG8gc3dpY2h0IGJldHdlZW4gdm9sdGFnZSBhbmQgY3VycmVudCBvdXRwdXQuICovCisKKyNkZWZpbmUgTUUxNjAwX0FPX01BWF9EQVRBCQkweDBGRkYJLyoqPCBUaGUgbWF4aW11bSBkaWdpdGFsIGRhdGEgYWNjZXB0ZWQgYnkgYW4gYW5hbG9nIG91dHB1dCBjaGFubmVsLiAqLworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTYwMF9kZXZpY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTE2MDBfZGV2aWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JjMmNiMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTE2MDBfZGV2aWNlLmMKQEAgLTAsMCArMSwyNjEgQEAKKy8qKgorICogQGZpbGUgbWUxNjAwX2RldmljZS5jCisgKgorICogQGJyaWVmIE1FLTE2MDAgZGV2aWNlIGNsYXNzIGltcGxlbWVudGF0aW9uLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisjaWZuZGVmIE1PRFVMRQorIyAgZGVmaW5lIE1PRFVMRQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgIm1laWRzLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorI2luY2x1ZGUgIm1lY29tbW9uLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKyNpbmNsdWRlICJtZTE2MDBfZGV2aWNlLmgiCisKK3N0YXRpYyB2b2lkIG1lMTYwMF9zZXRfcmVnaXN0cnkobWUxNjAwX2RldmljZV90ICogc3ViZGV2aWNlLCB1aW50MzJfdCByZWdfYmFzZSk7CitzdGF0aWMgdm9pZCBtZTE2MDBfZGVzdHJ1Y3RvcihzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UpOworCisvKioKKyAqIEBicmllZiBHbG9iYWwgdmFyaWFibGUuCisgKiBUaGlzIGlzIHdvcmtpbmcgcXVldWUgZm9yIHJ1bmluZyBhIHNlcGFyYXRlIGF0YXNrIHRoYXQgd2lsbCBiZSByZXNwb25zaWJsZSBmb3Igd29yayBzdGF0dXMgKHN0YXJ0LCBzdG9wLCB0aW1lb3V0cykuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqbWUxNjAwX3dvcmtxdWV1ZTsKKworbWVfZGV2aWNlX3QgKm1lMTYwMF9wY2lfY29uc3RydWN0b3Ioc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2UpCit7CisJaW50IGVycjsKKwltZTE2MDBfZGV2aWNlX3QgKm1lMTYwMF9kZXZpY2U7CisJbWVfc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwl1bnNpZ25lZCBpbnQgY2hpcF9pZHg7CisJaW50IGk7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBBbGxvY2F0ZSBzdHJ1Y3R1cmUgZm9yIGRldmljZSBpbnN0YW5jZS4KKwltZTE2MDBfZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWUxNjAwX2RldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIW1lMTYwMF9kZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3IgZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChtZTE2MDBfZGV2aWNlLCAwLCBzaXplb2YobWUxNjAwX2RldmljZV90KSk7CisKKwkvLyBJbml0aWFsaXplIGJhc2UgY2xhc3Mgc3RydWN0dXJlLgorCWVyciA9IG1lX2RldmljZV9wY2lfaW5pdCgobWVfZGV2aWNlX3QgKikgbWUxNjAwX2RldmljZSwgcGNpX2RldmljZSk7CisKKwlpZiAoZXJyKSB7CisJCWtmcmVlKG1lMTYwMF9kZXZpY2UpOworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIGRldmljZSBiYXNlIGNsYXNzLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9jayAuCisJc3Bpbl9sb2NrX2luaXQoJm1lMTYwMF9kZXZpY2UtPmNvbmZpZ19yZWdzX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZtZTE2MDBfZGV2aWNlLT5hb19zaGFkb3dzX2xvY2spOworCisJLy8gR2V0IHRoZSBudW1iZXIgb2YgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2VzLgorCWNoaXBfaWR4ID0KKwkgICAgbWUxNjAwX3ZlcnNpb25zX2dldF9kZXZpY2VfaW5kZXgobWUxNjAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS4KKwkJCQkJICAgICBkZXZpY2VfaWQpOworCisJLy8gQ3JlYXRlIHNoYWRvdyBpbnN0YW5jZS4KKwltZTE2MDBfZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MuY291bnQgPQorCSAgICBtZTE2MDBfdmVyc2lvbnNbY2hpcF9pZHhdLmFvX2NoaXBzOworCW1lMTYwMF9kZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5yZWdpc3RyeSA9CisJICAgIGttYWxsb2MobWUxNjAwX3ZlcnNpb25zW2NoaXBfaWR4XS5hb19jaGlwcyAqIHNpemVvZih1bnNpZ25lZCBsb25nKSwKKwkJICAgIEdGUF9LRVJORUwpOworCW1lMTYwMF9zZXRfcmVnaXN0cnkobWUxNjAwX2RldmljZSwKKwkJCSAgICBtZTE2MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLnJlZ19iYXNlc1syXSk7CisJbWUxNjAwX2RldmljZS0+YW9fcmVnc19zaGFkb3dzLnNoYWRvdyA9CisJICAgIGttYWxsb2MobWUxNjAwX3ZlcnNpb25zW2NoaXBfaWR4XS5hb19jaGlwcyAqIHNpemVvZih1aW50MTZfdCksCisJCSAgICBHRlBfS0VSTkVMKTsKKwltZTE2MDBfZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MubWlycm9yID0KKwkgICAga21hbGxvYyhtZTE2MDBfdmVyc2lvbnNbY2hpcF9pZHhdLmFvX2NoaXBzICogc2l6ZW9mKHVpbnQxNl90KSwKKwkJICAgIEdGUF9LRVJORUwpOworCisJLy8gQ3JlYXRlIHN1YmRldmljZSBpbnN0YW5jZXMuCisJZm9yIChpID0gMDsgaSA8IG1lMTYwMF92ZXJzaW9uc1tjaGlwX2lkeF0uYW9fY2hpcHM7IGkrKykgeworCQlzdWJkZXZpY2UgPQorCQkgICAgKG1lX3N1YmRldmljZV90ICopIG1lMTYwMF9hb19jb25zdHJ1Y3RvcihtZTE2MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGJhc2UuaW5mby5wY2kuCisJCQkJCQkJICAgICByZWdfYmFzZXNbMl0sIGksCisJCQkJCQkJICAgICAoKG1lMTYwMF92ZXJzaW9ucworCQkJCQkJCSAgICAgICBbY2hpcF9pZHhdLmN1cnIgPgorCQkJCQkJCSAgICAgICBpKSA/IDEgOiAwKSwKKwkJCQkJCQkgICAgICZtZTE2MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGNvbmZpZ19yZWdzX2xvY2ssCisJCQkJCQkJICAgICAmbWUxNjAwX2RldmljZS0+CisJCQkJCQkJICAgICBhb19zaGFkb3dzX2xvY2ssCisJCQkJCQkJICAgICAmbWUxNjAwX2RldmljZS0+CisJCQkJCQkJICAgICBhb19yZWdzX3NoYWRvd3MsCisJCQkJCQkJICAgICBtZTE2MDBfd29ya3F1ZXVlKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWUxNjAwX2RldmljZSk7CisJCQlrZnJlZShtZTE2MDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lMTYwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCS8vIE92ZXJ3cml0ZSBiYXNlIGNsYXNzIG1ldGhvZHMuCisJbWUxNjAwX2RldmljZS0+YmFzZS5tZV9kZXZpY2VfZGVzdHJ1Y3RvciA9IG1lMTYwMF9kZXN0cnVjdG9yOworCisJcmV0dXJuIChtZV9kZXZpY2VfdCAqKSBtZTE2MDBfZGV2aWNlOworfQorCitzdGF0aWMgdm9pZCBtZTE2MDBfZGVzdHJ1Y3RvcihzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UpCit7CisJbWUxNjAwX2RldmljZV90ICptZTE2MDBfZGV2aWNlID0gKG1lMTYwMF9kZXZpY2VfdCAqKSBkZXZpY2U7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gRGVzdHJveSBzaGFkb3cgaW5zdGFuY2UuCisJa2ZyZWUobWUxNjAwX2RldmljZS0+YW9fcmVnc19zaGFkb3dzLnJlZ2lzdHJ5KTsKKwlrZnJlZShtZTE2MDBfZGV2aWNlLT5hb19yZWdzX3NoYWRvd3Muc2hhZG93KTsKKwlrZnJlZShtZTE2MDBfZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MubWlycm9yKTsKKworCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lMTYwMF9kZXZpY2UpOworCWtmcmVlKG1lMTYwMF9kZXZpY2UpOworfQorCitzdGF0aWMgdm9pZCBtZTE2MDBfc2V0X3JlZ2lzdHJ5KG1lMTYwMF9kZXZpY2VfdCAqIHN1YmRldmljZSwgdWludDMyX3QgcmVnX2Jhc2UpCit7CQkJCS8vIENyZWF0ZSBzaGFkb3cgc3RydWN0dXJlLgorCWlmIChzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5jb3VudCA+PSAxKSB7CisJCXN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLnJlZ2lzdHJ5WzBdID0KKwkJICAgICh1bnNpZ25lZCBsb25nKShyZWdfYmFzZSArIE1FMTYwMF9DSEFOTkVMXzBfUkVHKTsKKwl9CisJaWYgKHN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLmNvdW50ID49IDIpIHsKKwkJc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MucmVnaXN0cnlbMV0gPQorCQkgICAgKHVuc2lnbmVkIGxvbmcpKHJlZ19iYXNlICsgTUUxNjAwX0NIQU5ORUxfMV9SRUcpOworCX0KKwlpZiAoc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MuY291bnQgPj0gMykgeworCQlzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5yZWdpc3RyeVsyXSA9CisJCSAgICAodW5zaWduZWQgbG9uZykocmVnX2Jhc2UgKyBNRTE2MDBfQ0hBTk5FTF8yX1JFRyk7CisJfQorCWlmIChzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5jb3VudCA+PSA0KSB7CisJCXN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLnJlZ2lzdHJ5WzNdID0KKwkJICAgICh1bnNpZ25lZCBsb25nKShyZWdfYmFzZSArIE1FMTYwMF9DSEFOTkVMXzNfUkVHKTsKKwl9CisJaWYgKHN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLmNvdW50ID49IDUpIHsKKwkJc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MucmVnaXN0cnlbNF0gPQorCQkgICAgKHVuc2lnbmVkIGxvbmcpKHJlZ19iYXNlICsgTUUxNjAwX0NIQU5ORUxfNF9SRUcpOworCX0KKwlpZiAoc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MuY291bnQgPj0gNikgeworCQlzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5yZWdpc3RyeVs1XSA9CisJCSAgICAodW5zaWduZWQgbG9uZykocmVnX2Jhc2UgKyBNRTE2MDBfQ0hBTk5FTF81X1JFRyk7CisJfQorCWlmIChzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5jb3VudCA+PSA3KSB7CisJCXN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLnJlZ2lzdHJ5WzZdID0KKwkJICAgICh1bnNpZ25lZCBsb25nKShyZWdfYmFzZSArIE1FMTYwMF9DSEFOTkVMXzZfUkVHKTsKKwl9CisJaWYgKHN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLmNvdW50ID49IDgpIHsKKwkJc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MucmVnaXN0cnlbN10gPQorCQkgICAgKHVuc2lnbmVkIGxvbmcpKHJlZ19iYXNlICsgTUUxNjAwX0NIQU5ORUxfN19SRUcpOworCX0KKwlpZiAoc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MuY291bnQgPj0gOSkgeworCQlzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5yZWdpc3RyeVs4XSA9CisJCSAgICAodW5zaWduZWQgbG9uZykocmVnX2Jhc2UgKyBNRTE2MDBfQ0hBTk5FTF84X1JFRyk7CisJfQorCWlmIChzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5jb3VudCA+PSAxMCkgeworCQlzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5yZWdpc3RyeVs5XSA9CisJCSAgICAodW5zaWduZWQgbG9uZykocmVnX2Jhc2UgKyBNRTE2MDBfQ0hBTk5FTF85X1JFRyk7CisJfQorCWlmIChzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5jb3VudCA+PSAxMSkgeworCQlzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5yZWdpc3RyeVsxMF0gPQorCQkgICAgKHVuc2lnbmVkIGxvbmcpKHJlZ19iYXNlICsgTUUxNjAwX0NIQU5ORUxfMTBfUkVHKTsKKwl9CisJaWYgKHN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLmNvdW50ID49IDEyKSB7CisJCXN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLnJlZ2lzdHJ5WzExXSA9CisJCSAgICAodW5zaWduZWQgbG9uZykocmVnX2Jhc2UgKyBNRTE2MDBfQ0hBTk5FTF8xMV9SRUcpOworCX0KKwlpZiAoc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MuY291bnQgPj0gMTMpIHsKKwkJc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MucmVnaXN0cnlbMTJdID0KKwkJICAgICh1bnNpZ25lZCBsb25nKShyZWdfYmFzZSArIE1FMTYwMF9DSEFOTkVMXzEyX1JFRyk7CisJfQorCWlmIChzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5jb3VudCA+PSAxNCkgeworCQlzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5yZWdpc3RyeVsxM10gPQorCQkgICAgKHVuc2lnbmVkIGxvbmcpKHJlZ19iYXNlICsgTUUxNjAwX0NIQU5ORUxfMTNfUkVHKTsKKwl9CisJaWYgKHN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLmNvdW50ID49IDE1KSB7CisJCXN1YmRldmljZS0+YW9fcmVnc19zaGFkb3dzLnJlZ2lzdHJ5WzE0XSA9CisJCSAgICAodW5zaWduZWQgbG9uZykocmVnX2Jhc2UgKyBNRTE2MDBfQ0hBTk5FTF8xNF9SRUcpOworCX0KKwlpZiAoc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MuY291bnQgPj0gMTYpIHsKKwkJc3ViZGV2aWNlLT5hb19yZWdzX3NoYWRvd3MucmVnaXN0cnlbMTVdID0KKwkJICAgICh1bnNpZ25lZCBsb25nKShyZWdfYmFzZSArIE1FMTYwMF9DSEFOTkVMXzE1X1JFRyk7CisJfQorCWlmIChzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5jb3VudCA+IDE2KSB7CisJCVBFUlJPUigiTW9yZSB0aGFuIDE2IG91dHB1dHMhICglZClcbiIsCisJCSAgICAgICBzdWJkZXZpY2UtPmFvX3JlZ3Nfc2hhZG93cy5jb3VudCk7CisJfQorfQorCisvLyBJbml0IGFuZCBleGl0IG9mIG1vZHVsZS4KKworc3RhdGljIGludCBfX2luaXQgbWUxNjAwX2luaXQodm9pZCkKK3sKKwlQREVCVUcoImV4ZWN1dGVkXG4uIik7CisKKwltZTE2MDBfd29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoIm1lMTYwMCIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbWUxNjAwX2V4aXQodm9pZCkKK3sKKwlQREVCVUcoImV4ZWN1dGVkXG4uIik7CisKKwlmbHVzaF93b3JrcXVldWUobWUxNjAwX3dvcmtxdWV1ZSk7CisJZGVzdHJveV93b3JrcXVldWUobWUxNjAwX3dvcmtxdWV1ZSk7Cit9CisKK21vZHVsZV9pbml0KG1lMTYwMF9pbml0KTsKK21vZHVsZV9leGl0KG1lMTYwMF9leGl0KTsKKworLy8gQWRtaW5pc3RyYXRpdmUgc3R1ZmYgZm9yIG1vZGluZm8uCitNT0RVTEVfQVVUSE9SCisgICAgKCJHdWVudGVyIEdlYmhhcmR0IDxnLmdlYmhhcmR0QG1laWxoYXVzLmRlPiAmIEtyenlzenRvZiBHYW50emtlIDxrLmdhbnR6a2VAbWVpbGhhdXMuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRldmljZSBEcml2ZXIgTW9kdWxlIGZvciBNRS0xNjAwIERldmljZSIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIk1laWxoYXVzIE1FLTE2MDAgRGV2aWNlcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvLyBFeHBvcnQgdGhlIGNvbnN0cnVjdG9yLgorRVhQT1JUX1NZTUJPTChtZTE2MDBfcGNpX2NvbnN0cnVjdG9yKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTE2MDBfZGV2aWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNjAwX2RldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YjIzMWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNjAwX2RldmljZS5oCkBAIC0wLDAgKzEsMTAxIEBACisvKioKKyAqIEBmaWxlIG1lMTYwMF9kZXZpY2UuaAorICoKKyAqIEBicmllZiBNRS0xNjAwIGRldmljZSBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTE2MDBfSAorI2RlZmluZSBfTUUxNjAwX0gKKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlICJtZWRldmljZS5oIgorI2luY2x1ZGUgIm1lMTYwMF9hby5oIgorI2luY2x1ZGUgIm1lMTYwMF9hb19yZWcuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgU3RydWN0dXJlIHRvIHN0b3JlIGRldmljZSBjYXBhYmlsaXRpZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lMTYwMF92ZXJzaW9uIHsKKwl1aW50MTZfdCBkZXZpY2VfaWQ7CQkJCS8qKjwgVGhlIFBDSSBkZXZpY2UgaWQgb2YgdGhlIGRldmljZS4gKi8KKwl1bnNpZ25lZCBpbnQgYW9fY2hpcHM7CQkJLyoqPCBUaGUgbnVtYmVyIG9mIGFuYWxvZyBvdXRwdXRzIG9uIHRoZSBkZXZpY2UuICovCisJaW50IGN1cnI7CQkJCQkJLyoqPCBGbGFnIHRvIGlkZW50aWZ5IGFtb3VudHMgb2YgY3VycmVudCBvdXRwdXQuICovCit9IG1lMTYwMF92ZXJzaW9uX3Q7CisKKy8qKgorICAqIEBicmllZiBEZWZpbmVzIGZvciBlYWNoIE1FLTE2MDAgZGV2aWNlIHZlcnNpb24gaXRzIGNhcGFiaWxpdGllcy4KKyAqLworc3RhdGljIG1lMTYwMF92ZXJzaW9uX3QgbWUxNjAwX3ZlcnNpb25zW10gPSB7CisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNjAwXzRVLCA0LCAwfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfOFUsIDgsIDB9LAorCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF8xMlUsIDEyLCAwfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfMTZVLCAxNiwgMH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNjAwXzE2VV84SSwgMTYsIDh9LAorCXswfQorfTsKKworLyoqPCBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiAjbWUxNjAwX3ZlcnNpb25zLiAqLworI2RlZmluZSBNRTE2MDBfREVWSUNFX1ZFUlNJT05TIChzaXplb2YobWUxNjAwX3ZlcnNpb25zKSAvIHNpemVvZihtZTE2MDBfdmVyc2lvbl90KSAtIDEpCisKKy8qKgorICogQGJyaWVmIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBkZXZpY2UgZW50cnkgaW4gI21lMTYwMF92ZXJzaW9ucy4KKyAqCisgKiBAcGFyYW0gZGV2aWNlX2lkIFRoZSBQQ0kgZGV2aWNlIGlkIG9mIHRoZSBkZXZpY2UgdG8gcXVlcnkuCisgKiBAcmV0dXJuIFRoZSBpbmRleCBvZiB0aGUgZGV2aWNlIGluICNtZTE2MDBfdmVyc2lvbnMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG1lMTYwMF92ZXJzaW9uc19nZXRfZGV2aWNlX2luZGV4KHVpbnQxNl90IGRldmljZV9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgTUUxNjAwX0RFVklDRV9WRVJTSU9OUzsgaSsrKQorCQlpZiAobWUxNjAwX3ZlcnNpb25zW2ldLmRldmljZV9pZCA9PSBkZXZpY2VfaWQpCisJCQlicmVhazsKKwlyZXR1cm4gaTsKK30KKworLyoqCisgKiBAYnJpZWYgVGhlIE1FLTE2MDAgZGV2aWNlIGNsYXNzIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWUxNjAwX2RldmljZSB7CisJbWVfZGV2aWNlX3QgYmFzZTsJCQkJCQkvKio8IFRoZSBNZWlsaGF1cyBkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKwlzcGlubG9ja190IGNvbmZpZ19yZWdzX2xvY2s7CQkJLyoqPCBQcm90ZWN0cyB0aGUgY29uZmlndXJhdGlvbiByZWdpc3RlcnMuICovCisKKwltZTE2MDBfYW9fc2hhZG93X3QgYW9fcmVnc19zaGFkb3dzOwkJLyoqPCBBZGRyZXNzZXMgYW5kIHNoYWRvd3Mgb2Ygb3V0cHV0J3MgcmVnaXN0ZXJzLiAqLworCXNwaW5sb2NrX3QgYW9fc2hhZG93c19sb2NrOwkJCQkvKio8IFByb3RlY3RzIHRoZSBzaGFkb3cncyBzdHJ1Y3QuICovCit9IG1lMTYwMF9kZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIE1FLTE2MDAgZGV2aWNlIGNsYXNzIGNvbnN0cnVjdG9yLgorICoKKyAqIEBwYXJhbSBwY2lfZGV2aWNlIFRoZSBwY2kgZGV2aWNlIHN0cnVjdHVyZSBnaXZlbiBieSB0aGUgUENJIHN1YnN5c3RlbS4KKyAqCisgKiBAcmV0dXJuIE9uIHN1Y2NlcyBhIG5ldyBNRS0xNjAwIGRldmljZSBpbnN0YW5jZS4gXG4KKyAqICAgICAgICAgTlVMTCBvbiBlcnJvci4KKyAqLworbWVfZGV2aWNlX3QgKm1lMTYwMF9wY2lfY29uc3RydWN0b3Ioc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2UpCisgICAgX19hdHRyaWJ1dGVfXyAoKHdlYWspKTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfYWkuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfYWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYThjOWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9haS5jCkBAIC0wLDAgKzEsMzQzNCBAQAorLyoqCisgKiBAZmlsZSBtZTQ2MDBfYWkuYworICoKKyAqIEBicmllZiBNRS00MDAwIGFuYWxvZyBpbnB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworLyoKKyAqIEluY2x1ZGVzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWVpZHMuaCIKKworI2luY2x1ZGUgIm1lNDYwMF9yZWcuaCIKKyNpbmNsdWRlICJtZTQ2MDBfYWlfcmVnLmgiCisjaW5jbHVkZSAibWU0NjAwX2FpLmgiCisKKy8qCisgKiBEZWNsYXJhdGlvbnMgKGxvY2FsKQorICovCisKK3N0YXRpYyB2b2lkIG1lNDYwMF9haV9kZXN0cnVjdG9yKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSk7CitzdGF0aWMgaW50IG1lNDYwMF9haV9pb19yZXNldF9zdWJkZXZpY2UobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCXN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGZsYWdzKTsKKworc3RhdGljIGludCBtZTQ2MDBfYWlfaW9fc2luZ2xlX2NvbmZpZyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgaW50IHNpbmdsZV9jb25maWcsCisJCQkJICAgICAgaW50IHJlZiwKKwkJCQkgICAgICBpbnQgdHJpZ19jaGFuLAorCQkJCSAgICAgIGludCB0cmlnX3R5cGUsIGludCB0cmlnX2VkZ2UsIGludCBmbGFncyk7CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX2lvX3NpbmdsZV9yZWFkKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCBjaGFubmVsLAorCQkJCSAgICBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncyk7CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX2lvX3N0cmVhbV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIG1lSU9TdHJlYW1Db25maWdfdCAqIGNvbmZpZ19saXN0LAorCQkJCSAgICAgIGludCBjb3VudCwKKwkJCQkgICAgICBtZUlPU3RyZWFtVHJpZ2dlcl90ICogdHJpZ2dlciwKKwkJCQkgICAgICBpbnQgZmlmb19pcnFfdGhyZXNob2xkLCBpbnQgZmxhZ3MpOworc3RhdGljIGludCBtZTQ2MDBfYWlfaW9fc3RyZWFtX3JlYWQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IHJlYWRfbW9kZSwKKwkJCQkgICAgaW50ICp2YWx1ZXMsIGludCAqY291bnQsIGludCBmbGFncyk7CitzdGF0aWMgaW50IG1lNDYwMF9haV9pb19zdHJlYW1fbmV3X3ZhbHVlcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJCSAgaW50IHRpbWVfb3V0LCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpOworc3RhdGljIGludCBpbmxpbmUgbWU0NjAwX2FpX2lvX3N0cmVhbV9yZWFkX2dldF92YWx1ZShtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKgorCQkJCQkJICAgICBpbnN0YW5jZSwgaW50ICp2YWx1ZXMsCisJCQkJCQkgICAgIGNvbnN0IGludCBjb3VudCwKKwkJCQkJCSAgICAgY29uc3QgaW50IGZsYWdzKTsKKworc3RhdGljIGludCBtZTQ2MDBfYWlfaW9fc3RyZWFtX3N0YXJ0KG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IHN0YXJ0X21vZGUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX2lvX3N0cmVhbV9zdG9wKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCBzdG9wX21vZGUsIGludCBmbGFncyk7CitzdGF0aWMgaW50IG1lNDYwMF9haV9pb19zdHJlYW1fc3RhdHVzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgd2FpdCwKKwkJCQkgICAgICBpbnQgKnN0YXR1cywgaW50ICp2YWx1ZXMsIGludCBmbGFncyk7CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXgobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgICBpbnQgdW5pdCwKKwkJCQkJICAgIGludCAqbWluLAorCQkJCQkgICAgaW50ICptYXgsIGludCAqbWF4ZGF0YSwgaW50ICpyYW5nZSk7CitzdGF0aWMgaW50IG1lNDYwMF9haV9xdWVyeV9udW1iZXJfcmFuZ2VzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgaW50IHVuaXQsIGludCAqY291bnQpOworc3RhdGljIGludCBtZTQ2MDBfYWlfcXVlcnlfcmFuZ2VfaW5mbyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBpbnQgcmFuZ2UsCisJCQkJICAgICAgaW50ICp1bml0LAorCQkJCSAgICAgIGludCAqbWluLCBpbnQgKm1heCwgaW50ICptYXhkYXRhKTsKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX3F1ZXJ5X3RpbWVyKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSBpbnQgdGltZXIsCisJCQkJIGludCAqYmFzZV9mcmVxdWVuY3ksCisJCQkJIGxvbmcgbG9uZyAqbWluX3RpY2tzLCBsb25nIGxvbmcgKm1heF90aWNrcyk7CitzdGF0aWMgaW50IG1lNDYwMF9haV9xdWVyeV9udW1iZXJfY2hhbm5lbHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgIGludCAqbnVtYmVyKTsKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKTsKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX3F1ZXJ5X3N1YmRldmljZV9jYXBzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIGludCAqY2Fwcyk7CitzdGF0aWMgaW50IG1lNDYwMF9haV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgICAgIGludCBjYXAsIGludCAqYXJncywgaW50IGNvdW50KTsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLCA2LCAxOSkKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTQ2MDBfYWlfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCk7CisjZWxzZQorc3RhdGljIGlycXJldHVybl90IG1lNDYwMF9haV9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisjZW5kaWYKKworc3RhdGljIGludCBhaV9tdXhfdG9nZ2xlcihtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UpOworCisvKiogSW1taWRpYXRlIHN0b3AuCisqIFJlc2V0IGFsbCBJUlEncyBzb3VyY2VzLiAoYmxvY2sgbGFjaGVzKQorKiBQcmVzZXJ2ZSBGSUZPCisqLworc3RhdGljIGludCBhaV9zdG9wX2ltbWVkaWF0ZWx5KG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqIGluc3RhbmNlKTsKKworLyoqIEltbWlkaWF0ZSBzdG9wLgorKiBSZXNldCBhbGwgSVJRJ3Mgc291cmNlcy4gKGJsb2NrIGxhY2hlcykKKyogUmVzZXQgZGF0YSBGSUZPCisqLwordm9pZCBpbmxpbmUgYWlfc3RvcF9pc3IobWU0NjAwX2FpX3N1YmRldmljZV90ICogaW5zdGFuY2UpOworCisvKiogSW50ZXJydXB0IGxvZ2ljcy4KKyogUmVhZCBkYXRhcworKiBSZXNldCBsYXRjaGVzCisqLwordm9pZCBhaV9saW1pdGVkX2lzcihtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgY29uc3QgdWludDMyX3QgaXJxX3N0YXR1cywKKwkJICAgIGNvbnN0IHVpbnQzMl90IGN0cmxfc3RhdHVzKTsKK3ZvaWQgYWlfaW5maW5pdGVfaXNyKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqIGluc3RhbmNlLAorCQkgICAgIGNvbnN0IHVpbnQzMl90IGlycV9zdGF0dXMsIGNvbnN0IHVpbnQzMl90IGN0cmxfc3RhdHVzKTsKKworLyoqIExhc3QgY2h1bmNrIG9mIGRhdGFzLiBXZSBtdXN0IHJlc2NoZWR1bGUgc2FtcGxlIGNvdW50ZXIuCisqIExlYXZpbmcgU0NfUkVMT0FEIGRvZXNuJ3QgZG8gYW55IGhhcm0sIGJ1dCBpbiBzb21lIGJhZCBjYXNlIGNhbiBtYWtlIGV4dHJhIGludGVycnVwdHMuCisqIFdoZW4gdGhyZXNob2xkIGlzIHdyb25nbHkgc2V0IHNvbWUgSVJRIGFyZSBsb3N0LighISEpCisqLwordm9pZCBpbmxpbmUgYWlfcmVzY2hlZHVsZV9TQyhtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSk7CisKKy8qKiBSZWFkIGRhdGFzIGZyb20gRklGTyBhbmQgY29weSB0aGVtIHRvIGJ1ZmZlciAqLworc3RhdGljIGludCBpbmxpbmUgYWlfcmVhZF9kYXRhKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqIGluc3RhbmNlLAorCQkJICAgICAgIGNvbnN0IGludCBjb3VudCk7CisKKy8qKiBDb3B5IHJlc3Qgb2YgZGF0YSBmcm9tIGZpZm8gdG8gY2lyY3VsYXIgYnVmZmVyLiovCitzdGF0aWMgaW50IGlubGluZSBhaV9yZWFkX2RhdGFfcG9vbGluZyhtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSk7CisKKy8qKiBTZXQgSVNNIHRvIG5leHQgc3RhdGUgZm9yIGluZmluaXRlIGRhdGEgYXF1c2F0aW9uIG1vZGUqLwordm9pZCBpbmxpbmUgYWlfaW5maW5pdGVfSVNNKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqIGluc3RhbmNlKTsKKworLyoqIFNldCBJU00gdG8gbmV4dCBzdGF0ZSBmb3IgZGVmaW5lIGFtb3VudCBvZiBkYXRhIGFxdXNhdGlvbiBtb2RlKi8KK3ZvaWQgaW5saW5lIGFpX2xpbWl0ZWRfSVNNKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqIGluc3RhbmNlLAorCQkJICAgdWludDMyX3QgaXJxX3N0YXR1cyk7CisKKy8qKiBTZXQgSVNNIHRvIG5leHQgc3RhZ2UgZm9yIGxpbWl0ZWQgbW9kZSAqLwordm9pZCBpbmxpbmUgYWlfZGF0YV9hY3F1aXNpdGlvbl9sb2dpYyhtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSk7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjApCitzdGF0aWMgdm9pZCBtZTQ2MDBfYWlfd29ya19jb250cm9sX3Rhc2sodm9pZCAqc3ViZGV2aWNlKTsKKyNlbHNlCitzdGF0aWMgdm9pZCBtZTQ2MDBfYWlfd29ya19jb250cm9sX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKyNlbmRpZgorCisvKiBEZWZpbml0aW9ucworICovCisKK21lNDYwMF9haV9zdWJkZXZpY2VfdCAqbWU0NjAwX2FpX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBjaGFubmVscywKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgcmFuZ2VzLAorCQkJCQkgICAgIGludCBpc29sYXRlZCwKKwkJCQkJICAgICBpbnQgc2gsCisJCQkJCSAgICAgaW50IGlycSwKKwkJCQkJICAgICBzcGlubG9ja190ICogY3RybF9yZWdfbG9jaywKKwkJCQkJICAgICBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqbWU0NjAwX3dxKQoreworCW1lNDYwMF9haV9zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCWludCBlcnI7CisJdW5zaWduZWQgaW50IGk7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9MFxuIik7CisKKwkvLyBBbGxvY2F0ZSBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZS4KKwlzdWJkZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTQ2MDBfYWlfc3ViZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghc3ViZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc3ViZGV2aWNlLCAwLCBzaXplb2YobWU0NjAwX2FpX3N1YmRldmljZV90KSk7CisKKwkvLyBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzLgorCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9ja3MuCisJc3Bpbl9sb2NrX2luaXQoJnN1YmRldmljZS0+c3ViZGV2aWNlX2xvY2spOworCisJc3ViZGV2aWNlLT5jdHJsX3JlZ19sb2NrID0gY3RybF9yZWdfbG9jazsKKworCS8vIEluaXRpYWxpemUgY2lyY3VsYXIgYnVmZmVyLgorCXN1YmRldmljZS0+Y2lyY19idWYubWFzayA9IE1FNDYwMF9BSV9DSVJDX0JVRl9DT1VOVCAtIDE7CisKKwlzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZiA9CisJICAgICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBNRTQ2MDBfQUlfQ0lSQ19CVUZfU0laRV9PUkRFUik7CisJUERFQlVHKCJjaXJjX2J1ZiA9ICVwIHNpemU9JWxkXG4iLCBzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZiwKKwkgICAgICAgTUU0NjAwX0FJX0NJUkNfQlVGX1NJWkUpOworCisJaWYgKCFzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZikgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgY2lyY3VsYXIgYnVmZmVyLlxuIik7CisJCW1lX3N1YmRldmljZV9kZWluaXQoKG1lX3N1YmRldmljZV90ICopIHN1YmRldmljZSk7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZiwgMCwgTUU0NjAwX0FJX0NJUkNfQlVGX1NJWkUpOworCXN1YmRldmljZS0+Y2lyY19idWYuaGVhZCA9IDA7CisJc3ViZGV2aWNlLT5jaXJjX2J1Zi50YWlsID0gMDsKKwlzdWJkZXZpY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19ub25lOworCisJLy8gSW5pdGlhbGl6ZSB3YWl0IHF1ZXVlLgorCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnN1YmRldmljZS0+d2FpdF9xdWV1ZSk7CisKKwkvLyBTYXZlIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMuCisJc3ViZGV2aWNlLT5jaGFubmVscyA9IGNoYW5uZWxzOworCisJLyogSW5pdGlhbGl6ZSB0aGUgc2luZ2xlIGNvbmZpZyBlbnRyaWVzIHRvIHJlc2V0IHZhbHVlcyAqLworCWZvciAoaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrKSB7CisJCXN1YmRldmljZS0+c2luZ2xlX2NvbmZpZ1tpXS5zdGF0dXMgPSBNRV9TSU5HTEVfQ0hBTk5FTF9OT1RfQ09ORklHVVJFRDsJLy9ub3QgY29uZmlndXJlZAorCX0KKworCS8vIFNhdmUgaWYgaXNvbGF0ZWQgZGV2aWNlLgorCXN1YmRldmljZS0+aXNvbGF0ZWQgPSBpc29sYXRlZDsKKworCS8vIFNhdmUgaWYgc2FtcGxlIGFuZCBob2xkIGlzIGF2YWlsYWJsZS4KKwlzdWJkZXZpY2UtPnNoID0gc2g7CisKKwkvLyBTZXQgc3RyZWFtIGNvbmZpZyB0byBub3QgY29uZmlndXJlZCBzdGF0ZS4KKwlzdWJkZXZpY2UtPmZpZm9faXJxX3RocmVzaG9sZCA9IDA7CisJc3ViZGV2aWNlLT5kYXRhX3JlcXVpcmVkID0gMDsKKwlzdWJkZXZpY2UtPmNoYW5fbGlzdF9sZW4gPSAwOworCisJLy8gSW5pdGlhbGl6ZSByZWdpc3RlcnMgYWRkcmVzc2VzLgorCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BSV9DVFJMX1JFRzsKKwlzdWJkZXZpY2UtPnN0YXR1c19yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BSV9TVEFUVVNfUkVHOworCXN1YmRldmljZS0+Y2hhbm5lbF9saXN0X3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FJX0NIQU5ORUxfTElTVF9SRUc7CisJc3ViZGV2aWNlLT5kYXRhX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FJX0RBVEFfUkVHOworCXN1YmRldmljZS0+Y2hhbl90aW1lcl9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BSV9DSEFOX1RJTUVSX1JFRzsKKwlzdWJkZXZpY2UtPmNoYW5fcHJlX3RpbWVyX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FJX0NIQU5fUFJFX1RJTUVSX1JFRzsKKwlzdWJkZXZpY2UtPnNjYW5fdGltZXJfbG93X3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FJX1NDQU5fVElNRVJfTE9XX1JFRzsKKwlzdWJkZXZpY2UtPnNjYW5fdGltZXJfaGlnaF9yZWcgPQorCSAgICByZWdfYmFzZSArIE1FNDYwMF9BSV9TQ0FOX1RJTUVSX0hJR0hfUkVHOworCXN1YmRldmljZS0+c2Nhbl9wcmVfdGltZXJfbG93X3JlZyA9CisJICAgIHJlZ19iYXNlICsgTUU0NjAwX0FJX1NDQU5fUFJFX1RJTUVSX0xPV19SRUc7CisJc3ViZGV2aWNlLT5zY2FuX3ByZV90aW1lcl9oaWdoX3JlZyA9CisJICAgIHJlZ19iYXNlICsgTUU0NjAwX0FJX1NDQU5fUFJFX1RJTUVSX0hJR0hfUkVHOworCXN1YmRldmljZS0+c3RhcnRfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQUlfU1RBUlRfUkVHOworCXN1YmRldmljZS0+aXJxX3N0YXR1c19yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9JUlFfU1RBVFVTX1JFRzsKKwlzdWJkZXZpY2UtPnNhbXBsZV9jb3VudGVyX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FJX1NBTVBMRV9DT1VOVEVSX1JFRzsKKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKyNlbmRpZgorCisJLy8gSW5pdGlhbGl6ZSByYW5nZXMuCisJc3ViZGV2aWNlLT5yYW5nZXNfbGVuID0gcmFuZ2VzOworCXN1YmRldmljZS0+cmFuZ2VzWzBdLm1pbiA9IC0xMEU2OworCXN1YmRldmljZS0+cmFuZ2VzWzBdLm1heCA9IDk5OTk2OTQ7CisKKwlzdWJkZXZpY2UtPnJhbmdlc1sxXS5taW4gPSAwOworCXN1YmRldmljZS0+cmFuZ2VzWzFdLm1heCA9IDk5OTk4NDc7CisKKwlzdWJkZXZpY2UtPnJhbmdlc1syXS5taW4gPSAtMjVFNTsKKwlzdWJkZXZpY2UtPnJhbmdlc1syXS5tYXggPSAyNDk5OTIzOworCisJc3ViZGV2aWNlLT5yYW5nZXNbM10ubWluID0gMDsKKwlzdWJkZXZpY2UtPnJhbmdlc1szXS5tYXggPSAyNDk5OTYxOworCisJLy8gV2UgaGF2ZSB0byBzd2l0Y2ggdGhlIG11eCBpbiBvcmRlciB0byBnZXQgaXQgd29yayBjb3JyZWN0bHkuCisJYWlfbXV4X3RvZ2dsZXIoc3ViZGV2aWNlKTsKKworCS8vIFJlZ2lzdGVyIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUuCisJc3ViZGV2aWNlLT5pcnEgPSBpcnE7CisJaWYgKHJlcXVlc3RfaXJxKHN1YmRldmljZS0+aXJxLCBtZTQ2MDBfYWlfaXNyLAorI2lmZGVmIElSUUZfRElTQUJMRUQKKwkJCUlSUUZfRElTQUJMRUQgfCBJUlFGX1NIQVJFRCwKKyNlbHNlCisJCQlTQV9JTlRFUlJVUFQgfCBTQV9TSElSUSwKKyNlbmRpZgorCQkJTUU0NjAwX05BTUUsIHN1YmRldmljZSkpIHsKKwkJUEVSUk9SKCJDYW5ub3QgcmVnaXN0ZXIgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZS5cbiIpOworCQltZV9zdWJkZXZpY2VfZGVpbml0KChtZV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2UpOworCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXN1YmRldmljZS0+Y2lyY19idWYuYnVmLAorCQkJICAgTUU0NjAwX0FJX0NJUkNfQlVGX1NJWkVfT1JERVIpOworCQlzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZiA9IE5VTEw7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlQSU5GTygiUmVnaXN0ZXJlZCBpcnE9JWQuXG4iLCBzdWJkZXZpY2UtPmlycSk7CisKKwkvLyBPdmVycmlkZSBiYXNlIGNsYXNzIG1ldGhvZHMuCisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9kZXN0cnVjdG9yID0gbWU0NjAwX2FpX2Rlc3RydWN0b3I7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19yZXNldF9zdWJkZXZpY2UgPQorCSAgICBtZTQ2MDBfYWlfaW9fcmVzZXRfc3ViZGV2aWNlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX2NvbmZpZyA9CisJICAgIG1lNDYwMF9haV9pb19zaW5nbGVfY29uZmlnOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3JlYWQgPSBtZTQ2MDBfYWlfaW9fc2luZ2xlX3JlYWQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zdHJlYW1fY29uZmlnID0KKwkgICAgbWU0NjAwX2FpX2lvX3N0cmVhbV9jb25maWc7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zdHJlYW1fbmV3X3ZhbHVlcyA9CisJICAgIG1lNDYwMF9haV9pb19zdHJlYW1fbmV3X3ZhbHVlczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9yZWFkID0gbWU0NjAwX2FpX2lvX3N0cmVhbV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3N0YXJ0ID0KKwkgICAgbWU0NjAwX2FpX2lvX3N0cmVhbV9zdGFydDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdGF0dXMgPQorCSAgICBtZTQ2MDBfYWlfaW9fc3RyZWFtX3N0YXR1czsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdG9wID0gbWU0NjAwX2FpX2lvX3N0cmVhbV9zdG9wOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWU0NjAwX2FpX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWU0NjAwX2FpX3F1ZXJ5X3N1YmRldmljZV90eXBlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHMgPQorCSAgICBtZTQ2MDBfYWlfcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzID0KKwkgICAgbWU0NjAwX2FpX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3M7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9yYW5nZV9ieV9taW5fbWF4ID0KKwkgICAgbWU0NjAwX2FpX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXg7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfcmFuZ2VzID0KKwkgICAgbWU0NjAwX2FpX3F1ZXJ5X251bWJlcl9yYW5nZXM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9yYW5nZV9pbmZvID0KKwkgICAgbWU0NjAwX2FpX3F1ZXJ5X3JhbmdlX2luZm87CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV90aW1lciA9IG1lNDYwMF9haV9xdWVyeV90aW1lcjsKKworCS8vIFByZXBhcmUgd29yayBxdWV1ZS4KKwlzdWJkZXZpY2UtPm1lNDYwMF93b3JrcXVldWUgPSBtZTQ2MDBfd3E7CisKKy8qIHdvcmtxdWV1ZSBBUEkgY2hhbmdlZCBpbiBrZXJuZWwgMi42LjIwICovCisjaWYgKCBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjApICkKKwlJTklUX1dPUksoJnN1YmRldmljZS0+YWlfY29udHJvbF90YXNrLCBtZTQ2MDBfYWlfd29ya19jb250cm9sX3Rhc2ssCisJCSAgKHZvaWQgKilzdWJkZXZpY2UpOworI2Vsc2UKKwlJTklUX0RFTEFZRURfV09SSygmc3ViZGV2aWNlLT5haV9jb250cm9sX3Rhc2ssCisJCQkgIG1lNDYwMF9haV93b3JrX2NvbnRyb2xfdGFzayk7CisjZW5kaWYKKworCXJldHVybiBzdWJkZXZpY2U7Cit9CisKK3N0YXRpYyB2b2lkIG1lNDYwMF9haV9kZXN0cnVjdG9yKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSkKK3sKKwltZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0wXG4iKTsKKworCWluc3RhbmNlLT5haV9jb250cm9sX3Rhc2tfZmxhZyA9IDA7CisJLy8gUmVzZXQgc3ViZGV2aWNlIHRvIGFzdXJlIGNsZWFuIGV4aXQuCisJbWU0NjAwX2FpX2lvX3Jlc2V0X3N1YmRldmljZShzdWJkZXZpY2UsIE5VTEwsCisJCQkJICAgICBNRV9JT19SRVNFVF9TVUJERVZJQ0VfTk9fRkxBR1MpOworCisJLy8gUmVtb3ZlIGFueSB0YXNrcyBmcm9tIHdvcmsgcXVldWUuIFRoaXMgaXMgcGFyYW5vaWMgYmVjYXVzZSBpdCB3YXMgZG9uZSBhbGxyZWFkeSBpbiByZXNldCgpLgorCWlmICghY2FuY2VsX2RlbGF5ZWRfd29yaygmaW5zdGFuY2UtPmFpX2NvbnRyb2xfdGFzaykpIHsJLy9XYWl0IDIgdGlja3MgdG8gYmUgc3VyZSB0aGF0IGNvbnRyb2wgdGFzayBpcyByZW1vdmVkIGZyb20gcXVldWUuCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMik7CisJfQorCisJZnJlZV9pcnEoaW5zdGFuY2UtPmlycSwgaW5zdGFuY2UpOworCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZiwKKwkJICAgTUU0NjAwX0FJX0NJUkNfQlVGX1NJWkVfT1JERVIpOworCW1lX3N1YmRldmljZV9kZWluaXQoJmluc3RhbmNlLT5iYXNlKTsKKwlrZnJlZShpbnN0YW5jZSk7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX2lvX3Jlc2V0X3N1YmRldmljZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl2b2xhdGlsZSB1aW50MzJfdCBjdHJsOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzOworCWNvbnN0IGludCB0aW1lb3V0ID0gSFogLyAxMDsJLy8xMDBtcworCWludCBpOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PTBcbiIpOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJaW5zdGFuY2UtPmFpX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKwlpbnN0YW5jZS0+c3RhdHVzID0gYWlfc3RhdHVzX25vbmU7CisKKwlmb3IgKGkgPSAwOyBpIDw9IHRpbWVvdXQ7IGkrKykgeworCQlzcGluX2xvY2tfaXJxc2F2ZShpbnN0YW5jZS0+Y3RybF9yZWdfbG9jaywgc3RhdHVzKTsKKwkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkvL1N0b3AgRE1BCisJCWN0cmwgJj0gfk1FNDYwMF9BSV9DVFJMX1JQQ0lfRklGTzsKKwkJLy8gU3RvcCBhbGwgYWN0aW9ucy4gTm8gY29uZGl0aW9ucyEKKwkJY3RybCAmPSB+TUU0NjAwX0FJX0NUUkxfQklUX1NUT1A7CisJCWN0cmwgfD0gTUU0NjAwX0FJX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCisJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2ssIHN0YXR1cyk7CisKKwkJaWYgKCEoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZTTSkpCisJCQlicmVhazsKKworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCX0KKworCWlmIChpID4gdGltZW91dCkgeworCQlQRVJST1IoIkZTTSBpcyBzdGlsbCBidXN5LlxuIik7CisJCU1FX1NVQkRFVklDRV9FWElUOworCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2ssIHN0YXR1cyk7CisJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCS8vIENsZWFyIGFsbCBmZWF0dXJlcy4gRGlzc2FibGUgaW50ZXJydXB0cy4KKwljdHJsICY9IH4oTUU0NjAwX0FJX0NUUkxfQklUX1NUT1AKKwkJICB8IE1FNDYwMF9BSV9DVFJMX0JJVF9MRV9JUlEKKwkJICB8IE1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlEgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRKTsKKwljdHJsIHw9IChNRTQ2MDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AKKwkJIHwgTUU0NjAwX0FJX0NUUkxfQklUX0xFX0lSUV9SRVNFVAorCQkgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRX1JFU0VUCisJCSB8IE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19JUlFfUkVTRVQpOworCisJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrLCBzdGF0dXMpOworCisJb3V0bChNRTQ2MDBfQUlfTUlOX0NIQU5fVElDS1MgLSAxLCBpbnN0YW5jZS0+Y2hhbl90aW1lcl9yZWcpOworCVBERUJVR19SRUcoImNoYW5fdGltZXJfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JWxseFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y2hhbl90aW1lcl9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIE1FNDYwMF9BSV9NSU5fQ0hBTl9USUNLUyk7CisJb3V0bChNRTQ2MDBfQUlfTUlOX0FDUV9USUNLUyAtIDEsIGluc3RhbmNlLT5jaGFuX3ByZV90aW1lcl9yZWcpOworCVBERUJVR19SRUcoImNoYW5fcHJlX3RpbWVyX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCVsbHhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmNoYW5fcHJlX3RpbWVyX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgTUU0NjAwX0FJX01JTl9BQ1FfVElDS1MpOworCW91dGwoMCwgaW5zdGFuY2UtPnNjYW5fdGltZXJfbG93X3JlZyk7CisJUERFQlVHX1JFRygic2Nhbl90aW1lcl9sb3dfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnNjYW5fdGltZXJfbG93X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMCk7CisJb3V0bCgwLCBpbnN0YW5jZS0+c2Nhbl90aW1lcl9oaWdoX3JlZyk7CisJUERFQlVHX1JFRygic2Nhbl90aW1lcl9oaWdoX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zY2FuX3RpbWVyX2hpZ2hfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwlvdXRsKDAsIGluc3RhbmNlLT5zY2FuX3ByZV90aW1lcl9sb3dfcmVnKTsKKwlQREVCVUdfUkVHKCJzY2FuX3ByZV90aW1lcl9sb3dfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnNjYW5fcHJlX3RpbWVyX2xvd19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDApOworCW91dGwoMCwgaW5zdGFuY2UtPnNjYW5fcHJlX3RpbWVyX2hpZ2hfcmVnKTsKKwlQREVCVUdfUkVHKCJzY2FuX3ByZV90aW1lcl9oaWdoX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zY2FuX3ByZV90aW1lcl9oaWdoX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMCk7CisJb3V0bCgweEVGRkZGRkZGLCBpbnN0YW5jZS0+c2FtcGxlX2NvdW50ZXJfcmVnKTsKKwlQREVCVUdfUkVHKCJzYW1wbGVfY291bnRlcl9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+c2FtcGxlX2NvdW50ZXJfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICAweEVGRkZGRkZGKTsKKworCWluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkID0gMDsKKwlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCA9IDA7CisKKwlpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkID0gMDsKKwlpbnN0YW5jZS0+ZGF0YV9yZXF1aXJlZCA9IDA7CisJaW5zdGFuY2UtPmNoYW5fbGlzdF9sZW4gPSAwOworCisJLy8gSW5pdGlhbGl6ZSB0aGUgc2luZ2xlIGNvbmZpZyBlbnRyaWVzIHRvIHJlc2V0IHZhbHVlcy4KKwlmb3IgKGkgPSAwOyBpIDwgaW5zdGFuY2UtPmNoYW5uZWxzOyBpKyspIHsKKwkJaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbaV0uc3RhdHVzID0KKwkJICAgIE1FX1NJTkdMRV9DSEFOTkVMX05PVF9DT05GSUdVUkVEOworCX0KKwlpbnN0YW5jZS0+c3RhdHVzID0gYWlfc3RhdHVzX25vbmU7CisKKwkvL1NpZ25hbCByZXNldCBpZiB1c2VyIGlzIG9uIHdhaXQuCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9haV9pb19zaW5nbGVfY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkgICAgICBpbnQgcmVmLAorCQkJCSAgICAgIGludCB0cmlnX2NoYW4sCisJCQkJICAgICAgaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCW1lNDYwMF9haV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisJaW50IGk7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PTBcbiIpOworCisJaWYgKGZsYWdzICYgfk1FX0lPX1NJTkdMRV9DT05GSUdfQ09OVElOVUUpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCXN3aXRjaCAodHJpZ190eXBlKSB7CisJY2FzZSBNRV9UUklHX1RZUEVfU1c6CisJCWlmICh0cmlnX2VkZ2UgIT0gTUVfVFJJR19FREdFX05PTkUpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiSW52YWxpZCB0cmlnZ2VyIGVkZ2UuIFNvZnR3YXJlIHRyaWdnZXIgaGFzIG5vdCBlZGdlLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9UUklHX0VER0U7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9FWFRfQU5BTE9HOgorCQlpZiAoaW5zdGFuY2UtPmNoYW5uZWxzIDw9IDE2KQkvL09ubHkgdmVyc2lvbnMgd2l0aCAzMiBjaGFubmVscyBoYXZlIGFuYWxvZyB0cmlnZ2VyICg0NjcwIGFuZCA0NjgwKQorCQl7CisJCQlQRVJST1IoIkludmFsaWQgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVFJJR19UWVBFOworCQl9CisKKwljYXNlIE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTDoKKwkJaWYgKCh0cmlnX2VkZ2UgIT0gTUVfVFJJR19FREdFX0FOWSkKKwkJICAgICYmICh0cmlnX2VkZ2UgIT0gTUVfVFJJR19FREdFX1JJU0lORykKKwkJICAgICYmICh0cmlnX2VkZ2UgIT0gTUVfVFJJR19FREdFX0ZBTExJTkcpKSB7CisJCQlQRVJST1IoIkludmFsaWQgdHJpZ2dlciBlZGdlIHNwZWNpZmllZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVFJJR19FREdFOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVFJJR19UWVBFOworCX0KKworCWlmICh0cmlnX2NoYW4gIT0gTUVfVFJJR19DSEFOX0RFRkFVTFQpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRyaWdnZXIgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVFJJR19DSEFOOworCX0KKworCWlmICgoc2luZ2xlX2NvbmZpZyA8IDApIHx8IChzaW5nbGVfY29uZmlnID49IGluc3RhbmNlLT5yYW5nZXNfbGVuKSkgeworCQlQRVJST1IoIkludmFsaWQgc2luZ2xlIGNvbmZpZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwl9CisKKwlpZiAoKHJlZiAhPSBNRV9SRUZfQUlfR1JPVU5EKSAmJiAocmVmICE9IE1FX1JFRl9BSV9ESUZGRVJFTlRJQUwpKSB7CisJCVBFUlJPUigiSW52YWxpZCBhbmFsb2cgcmVmZXJlbmNlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SRUY7CisJfQorCisJaWYgKChzaW5nbGVfY29uZmlnICUgMikgJiYgKHJlZiAhPSBNRV9SRUZfQUlfR1JPVU5EKSkgeworCQlQRVJST1IoIkludmFsaWQgYW5hbG9nIHJlZmVyZW5jZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfUkVGOworCX0KKworCWlmICgocmVmID09IE1FX1JFRl9BSV9ESUZGRVJFTlRJQUwpCisJICAgICYmICgoaW5zdGFuY2UtPmNoYW5uZWxzID09IDE2KSB8fCAoY2hhbm5lbCA+PSAxNikpKSB7CisJCVBFUlJPUigiSW52YWxpZCBhbmFsb2cgcmVmZXJlbmNlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SRUY7CisJfQorCisJaWYgKGNoYW5uZWwgPCAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAoY2hhbm5lbCA+PSBpbnN0YW5jZS0+Y2hhbm5lbHMpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJLy9QcmVwYXJlIGRhdGEgZW50cnkuCisJLy8gQ29tbW9uIGZvciBhbGwgbW9kZXMuCisJaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbY2hhbm5lbF0uZW50cnkgPQorCSAgICBjaGFubmVsIHwgTUU0NjAwX0FJX0xJU1RfTEFTVF9FTlRSWTsKKworCWlmIChyZWYgPT0gTUVfUkVGX0FJX0RJRkZFUkVOVElBTCkgewkvLyBNRV9SRUZfQUlfRElGRkVSRU5USUFMCisJCWluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2NoYW5uZWxdLmVudHJ5IHw9CisJCSAgICBNRTQ2MDBfQUlfTElTVF9JTlBVVF9ESUZGRVJFTlRJQUw7CisJfQorLyoKKwkJLy8gTUU0NjAwX0FJX0xJU1RfSU5QVVRfU0lOR0xFX0VOREVEID0gMHgwMDAwCisJCS8vICdlbnRyeSB8PSBNRTQ2MDBfQUlfTElTVF9JTlBVVF9TSU5HTEVfRU5ERUQnIDw9PSBEbyBub3RoaW5nLiBSZW1vdmVkLgorCQllbHNlCisJCXsvLyBNRV9SRUZfQUlfR1JPVU5ECisJCQlpbnN0YW5jZS0+c2luZ2xlX2NvbmZpZ1tjaGFubmVsXS5lbnRyeSB8PSBNRTQ2MDBfQUlfTElTVF9JTlBVVF9TSU5HTEVfRU5ERUQ7CisJCX0KKyovCisJc3dpdGNoIChzaW5nbGVfY29uZmlnKSB7CisJY2FzZSAwOgkJLy8tMTBWLi4xMFYKKy8qCisJCQkJCS8vIE1FNDYwMF9BSV9MSVNUX1JBTkdFX0JJUE9MQVJfMTAgPSAweDAwMDAKKwkJCQkJLy8gJ2VudHJ5IHw9IE1FNDYwMF9BSV9MSVNUX1JBTkdFX0JJUE9MQVJfMTAnIDw9PSBEbyBub3RoaW5nLiBSZW1vdmVkLgorCQkJCQlpbnN0YW5jZS0+c2luZ2xlX2NvbmZpZ1tjaGFubmVsXS5lbnRyeSB8PSBNRTQ2MDBfQUlfTElTVF9SQU5HRV9CSVBPTEFSXzEwOworKi8gYnJlYWs7CisKKwljYXNlIDE6CQkvLzBWLi4xMFYKKwkJaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbY2hhbm5lbF0uZW50cnkgfD0KKwkJICAgIE1FNDYwMF9BSV9MSVNUX1JBTkdFX1VOSVBPTEFSXzEwOworCQlicmVhazsKKworCWNhc2UgMjoJCS8vLTIuNVYuLjIuNVYKKwkJaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbY2hhbm5lbF0uZW50cnkgfD0KKwkJICAgIE1FNDYwMF9BSV9MSVNUX1JBTkdFX0JJUE9MQVJfMl81OworCQlicmVhazsKKworCWNhc2UgMzoJCS8vMFYuLjIuNVYKKwkJaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbY2hhbm5lbF0uZW50cnkgfD0KKwkJICAgIE1FNDYwMF9BSV9MSVNUX1JBTkdFX1VOSVBPTEFSXzJfNTsKKwkJYnJlYWs7CisJfQorCisJLy8gUHJlcGFyZSBjb250cm9sIHJlZ2lzdGVyLgorCS8vIENvbW1vbiBmb3IgYWxsIG1vZGVzLgorCWluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2NoYW5uZWxdLmN0cmwgPQorCSAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfQ0hBTk5FTF9GSUZPIHwgTUU0NjAwX0FJX0NUUkxfQklUX0RBVEFfRklGTzsKKworCXN3aXRjaCAodHJpZ190eXBlKSB7CisJY2FzZSBNRV9UUklHX1RZUEVfU1c6CisJCS8vIE5vdGhpbmcgdG8gc2V0LgorCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19UWVBFX0VYVF9BTkFMT0c6CisJCWluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2NoYW5uZWxdLmN0cmwgfD0KKwkJICAgIE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9UUklHX0FOQUxPRzsKKworCWNhc2UgTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMOgorCQlpbnN0YW5jZS0+c2luZ2xlX2NvbmZpZ1tjaGFubmVsXS5jdHJsIHw9CisJCSAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfVFJJRzsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoICh0cmlnX2VkZ2UpIHsKKwljYXNlIE1FX1RSSUdfRURHRV9SSVNJTkc6CisJCS8vIE5vdGhpbmcgdG8gc2V0LgorCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19FREdFX0FOWToKKwkJaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbY2hhbm5lbF0uY3RybCB8PQorCQkgICAgTUU0NjAwX0FJX0NUUkxfQklUX0VYX1RSSUdfQk9USDsKKworCWNhc2UgTUVfVFJJR19FREdFX0ZBTExJTkc6CisJCWluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2NoYW5uZWxdLmN0cmwgfD0KKwkJICAgIE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9UUklHX0ZBTExJTkc7CisJCWJyZWFrOworCX0KKworCS8vIEVuYWJsZSB0aGlzIGNoYW5uZWwKKwlpbnN0YW5jZS0+c2luZ2xlX2NvbmZpZ1tjaGFubmVsXS5zdGF0dXMgPSBNRV9TSU5HTEVfQ0hBTk5FTF9DT05GSUdVUkVEOworCisJLy8gQ29weSB0aGlzIHNldHRpbmdzIHRvIG90aGVyIG91dHB1dHMuCisJaWYgKGZsYWdzID09IE1FX0lPX1NJTkdMRV9DT05GSUdfQ09OVElOVUUpIHsKKwkJZm9yIChpID0gY2hhbm5lbCArIDE7IGkgPCBpbnN0YW5jZS0+Y2hhbm5lbHM7IGkrKykgeworCQkJaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbaV0uY3RybCA9CisJCQkgICAgaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbY2hhbm5lbF0uY3RybDsKKwkJCWluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2ldLmVudHJ5ID0KKwkJCSAgICBpbnN0YW5jZS0+c2luZ2xlX2NvbmZpZ1tjaGFubmVsXS5lbnRyeTsKKwkJCWluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2ldLnN0YXR1cyA9CisJCQkgICAgTUVfU0lOR0xFX0NIQU5ORUxfQ09ORklHVVJFRDsKKwkJfQorCX0KKworCWluc3RhbmNlLT5zdGF0dXMgPSBhaV9zdGF0dXNfc2luZ2xlX2NvbmZpZ3VyZWQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9haV9pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl2b2xhdGlsZSB1aW50MzJfdCB0bXA7CisJdm9sYXRpbGUgdWludDMyX3QgdmFsOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCisJdW5zaWduZWQgbG9uZyBqOworCXVuc2lnbmVkIGxvbmcgZGVsYXkgPSAwOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PTBcbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKGluc3RhbmNlLT5zdGF0dXMgIT0gYWlfc3RhdHVzX3NpbmdsZV9jb25maWd1cmVkKSB7CisJCVBFUlJPUigiU3ViZGV2aWNlIG5vdCBjb25maWd1cmVkIHRvIHdvcmsgaW4gc2luZ2xlIG1vZGUhXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwl9CisKKwlpZiAoKGNoYW5uZWwgPiBpbnN0YW5jZS0+Y2hhbm5lbHMpIHx8IChjaGFubmVsIDwgMCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJfQorCisJaWYgKHRpbWVfb3V0IDwgMCkgeworCQlQRVJST1IoIkludmFsaWQgdGltZW91dCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVElNRU9VVDsKKwl9CisKKwlpZiAoaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbY2hhbm5lbF0uc3RhdHVzICE9CisJICAgIE1FX1NJTkdMRV9DSEFOTkVMX0NPTkZJR1VSRUQpIHsKKwkJUEVSUk9SKCJDaGFubmVsIGlzIG5vdCBjb25maWd1cmVkIHRvIHdvcmsgaW4gc2luZ2xlIG1vZGUhXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwl9CisKKwlpZiAoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZTTSkgeworCQlQRVJST1IoIlN1YmRldmljZSBpcyBidXN5LlxuIik7CisJCXJldHVybiBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwkvLyBDYW5jZWwgY29udHJvbCB0YXNrCisJUERFQlVHKCJDYW5jZWwgY29udHJvbCB0YXNrLlxuIik7CisJaW5zdGFuY2UtPmFpX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YWlfY29udHJvbF90YXNrKTsKKworCWlmICh0aW1lX291dCkgeworCQlkZWxheSA9ICh0aW1lX291dCAqIEhaKSAvIDEwMDA7CisKKwkJaWYgKGRlbGF5ID09IDApCisJCQlkZWxheSA9IDE7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCS8vIE1hcmsgdGhhdCBTdHJlYW1Db25maWcgaXMgcmVtb3ZlZC4KKwlpbnN0YW5jZS0+Y2hhbl9saXN0X2xlbiA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShpbnN0YW5jZS0+Y3RybF9yZWdfbG9jaywgY3B1X2ZsYWdzKTsKKwkvLy8gQG5vdGUgSW1wcnRhbnQ6IFByZXNlcnZlIEVYVCBJUlEgc2V0dGluZ3MuCisJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJLy8gQ2xlYXIgRklGT3MgYW5kIGRpc3NhYmxlIGludGVycnVwdHMKKwl0bXAgJj0KKwkgICAgfihNRTQ2MDBfQUlfQ1RSTF9CSVRfQ0hBTk5FTF9GSUZPIHwgTUU0NjAwX0FJX0NUUkxfQklUX0RBVEFfRklGTyk7CisKKwl0bXAgJj0KKwkgICAgfihNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRIHwgTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUSB8CisJICAgICAgTUU0NjAwX0FJX0NUUkxfQklUX0xFX0lSUSk7CisJdG1wIHw9CisJICAgIE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19JUlFfUkVTRVQgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRX1JFU0VUIHwKKwkgICAgTUU0NjAwX0FJX0NUUkxfQklUX0xFX0lSUV9SRVNFVDsKKworCXRtcCB8PSBNRTQ2MDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisKKwlvdXRsKDAsIGluc3RhbmNlLT5zY2FuX3ByZV90aW1lcl9sb3dfcmVnKTsKKwlQREVCVUdfUkVHKCJzY2FuX3ByZV90aW1lcl9sb3dfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnNjYW5fcHJlX3RpbWVyX2xvd19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDApOworCW91dGwoMCwgaW5zdGFuY2UtPnNjYW5fcHJlX3RpbWVyX2hpZ2hfcmVnKTsKKwlQREVCVUdfUkVHKCJzY2FuX3ByZV90aW1lcl9oaWdoX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zY2FuX3ByZV90aW1lcl9oaWdoX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMCk7CisJb3V0bCgwLCBpbnN0YW5jZS0+c2Nhbl90aW1lcl9sb3dfcmVnKTsKKwlQREVCVUdfUkVHKCJzY2FuX3RpbWVyX2xvd19yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+c2Nhbl90aW1lcl9sb3dfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwlvdXRsKDAsIGluc3RhbmNlLT5zY2FuX3RpbWVyX2hpZ2hfcmVnKTsKKwlQREVCVUdfUkVHKCJzY2FuX3RpbWVyX2hpZ2hfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnNjYW5fdGltZXJfaGlnaF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDApOworCW91dGwoNjUsIGluc3RhbmNlLT5jaGFuX3RpbWVyX3JlZyk7CisJUERFQlVHX1JFRygiY2hhbl90aW1lcl9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y2hhbl90aW1lcl9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDY1KTsKKwlvdXRsKDY1LCBpbnN0YW5jZS0+Y2hhbl9wcmVfdGltZXJfcmVnKTsKKwlQREVCVUdfUkVHKCJjaGFuX3ByZV90aW1lcl9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y2hhbl9wcmVfdGltZXJfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCA2NSk7CisKKwkvL1JlYWN0aXZlIEZJRk9zLiBFbmFibGUgd29yay4KKwl0bXAgfD0gTUU0NjAwX0FJX0NUUkxfQklUX0NIQU5ORUxfRklGTyB8IE1FNDYwMF9BSV9DVFJMX0JJVF9EQVRBX0ZJRk87CisJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisKKwlvdXRsKGluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2NoYW5uZWxdLmVudHJ5LAorCSAgICAgaW5zdGFuY2UtPmNoYW5uZWxfbGlzdF9yZWcpOworCVBERUJVR19SRUcoImNoYW5uZWxfbGlzdF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y2hhbm5lbF9saXN0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnNpbmdsZV9jb25maWdbY2hhbm5lbF0uZW50cnkpOworCisJLy8gUHJlc2VydmUgRVhUIElSUSBzZXR0aW5ncy4KKwl0bXAgJj0gKE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9JUlEgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfSVJRX1JFU0VUKTsKKwlvdXRsKGluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2NoYW5uZWxdLmN0cmwgfCB0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2NoYW5uZWxdLmN0cmwgfCB0bXApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpbnN0YW5jZS0+Y3RybF9yZWdfbG9jaywgY3B1X2ZsYWdzKTsKKworCWlmICghKGluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2NoYW5uZWxdLmN0cmwgJiBNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfVFJJRykpIHsJLy8gU29mdHdhcmUgc3RhcnQKKwkJaW5sKGluc3RhbmNlLT5zdGFydF9yZWcpOworCQlQREVCVUdfUkVHKCJzdGFydF9yZWcgaW5sKDB4JWxYKzB4JWxYKVxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnN0YXJ0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSk7CisKKwkJZGVsYXkgPSAyOworCX0KKworCWogPSBqaWZmaWVzOworCisJd2hpbGUgKCEoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0VGX0RBVEEpKSB7CisJCWlmIChkZWxheSAmJiAoKGppZmZpZXMgLSBqKSA+PSBkZWxheSkpIHsKKwkJCWlmICghKGluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2NoYW5uZWxdLmN0cmwgJiBNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfVFJJRykpIHsJLy8gU29mdHdhcmUgc3RhcnQuCisJCQkJUEVSUk9SKCJWYWx1ZSBub3QgYXZhaWxhYmxlIGFmdGVyIHdhaXQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwkJCX0gZWxzZSB7CS8vIEV4dGVybmFsIHN0YXJ0LgorCQkJCVBFUlJPUigiVGltZW91dCByZWFjaGVkLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCS8vIFdhaXQKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgxKTsKKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiV2FpdCBvbiBleHRlcm5hbCB0cmlnZ2VyIGludGVycnVwdGVkIGJ5IHNpZ25hbC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyAhPSBhaV9zdGF0dXNfc2luZ2xlX2NvbmZpZ3VyZWQpIHsKKwkJCVBFUlJPUigiV2FpdCBpbnRlcnJ1cHRlZCBieSByZXNldC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvLyBSZWFkIHZhbHVlLgorCWlmICghZXJyKSB7CisJCXZhbCA9IGlubChpbnN0YW5jZS0+ZGF0YV9yZWcpIF4gMHg4MDAwOworCQlQREVCVUdfUkVHKCJkYXRhX3JlZyBpbmwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+ZGF0YV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHZhbCk7CisJCSp2YWx1ZSA9IHZhbCAmIE1FNDYwMF9BSV9NQVhfREFUQTsKKwl9IGVsc2UgeworCQkqdmFsdWUgPSAweEZGRkZGRkZGOworCX0KKworCS8vIFJlc3RvcmUgc2V0dGluZ3MuCisJc3Bpbl9sb2NrX2lycXNhdmUoaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2ssIGNwdV9mbGFncyk7CisJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJLy8gQ2xlYXIgRklGT3MgYW5kIGRpc3NhYmxlIGludGVycnVwdHMuCisJdG1wICY9CisJICAgIH4oTUU0NjAwX0FJX0NUUkxfQklUX0NIQU5ORUxfRklGTyB8IE1FNDYwMF9BSV9DVFJMX0JJVF9EQVRBX0ZJRk8pOworCXRtcCB8PSBNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRIHwgTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUTsKKwl0bXAgfD0KKwkgICAgTUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUV9SRVNFVCB8IE1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQgfAorCSAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfTEVfSVJRX1JFU0VUIHwgTUU0NjAwX0FJX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2ssIGNwdV9mbGFncyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX2lvX3N0cmVhbV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIG1lSU9TdHJlYW1Db25maWdfdCAqIGNvbmZpZ19saXN0LAorCQkJCSAgICAgIGludCBjb3VudCwKKwkJCQkgICAgICBtZUlPU3RyZWFtVHJpZ2dlcl90ICogdHJpZ2dlciwKKwkJCQkgICAgICBpbnQgZmlmb19pcnFfdGhyZXNob2xkLCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwlpbnQgaTsJCQkvLyBpbnRlcm5hbCBtdWx0aXB1cnBvc2UgdmFyaWFibGUKKwl1bnNpZ25lZCBsb25nIGxvbmcgZGF0YV9yZXF1aXJlZDsKKworCXZvbGF0aWxlIHVpbnQzMl90IGVudHJ5OworCXZvbGF0aWxlIHVpbnQzMl90IGN0cmwgPSBNRTQ2MDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJdm9sYXRpbGUgdWludDMyX3QgdG1wOwkvLyB1c2Ugd2hlbiBjdXJyZW50IGNvcHkgb2YgcmVnaXN0ZXIncyB2YWx1ZSBuZWVkZWQKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKworCXVpbnQ2NF90IGFjcV90aWNrczsKKwl1aW50NjRfdCBzY2FuX3RpY2tzOworCXVpbnQ2NF90IGNvbnZfdGlja3M7CisJdW5zaWduZWQgaW50IGFjcV9zdGFydF90aWNrc19sb3cgPSB0cmlnZ2VyLT5pQWNxU3RhcnRUaWNrc0xvdzsKKwl1bnNpZ25lZCBpbnQgYWNxX3N0YXJ0X3RpY2tzX2hpZ2ggPSB0cmlnZ2VyLT5pQWNxU3RhcnRUaWNrc0hpZ2g7CisJdW5zaWduZWQgaW50IHNjYW5fc3RhcnRfdGlja3NfbG93ID0gdHJpZ2dlci0+aVNjYW5TdGFydFRpY2tzTG93OworCXVuc2lnbmVkIGludCBzY2FuX3N0YXJ0X3RpY2tzX2hpZ2ggPSB0cmlnZ2VyLT5pU2NhblN0YXJ0VGlja3NIaWdoOworCXVuc2lnbmVkIGludCBjb252X3N0YXJ0X3RpY2tzX2xvdyA9IHRyaWdnZXItPmlDb252U3RhcnRUaWNrc0xvdzsKKwl1bnNpZ25lZCBpbnQgY29udl9zdGFydF90aWNrc19oaWdoID0gdHJpZ2dlci0+aUNvbnZTdGFydFRpY2tzSGlnaDsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0wXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUgorCSAgICAvLyBDb252ZXJ0IHRpY2tzIHRvIDY0IGJpdCBsb25nIHZhbHVlcworCSAgICBhY3FfdGlja3MgPQorCSAgICAodWludDY0X3QpIGFjcV9zdGFydF90aWNrc19sb3cgKworCSAgICAoKHVpbnQ2NF90KSBhY3Ffc3RhcnRfdGlja3NfaGlnaCA8PCAzMik7CisJc2Nhbl90aWNrcyA9CisJICAgICh1aW50NjRfdCkgc2Nhbl9zdGFydF90aWNrc19sb3cgKworCSAgICAoKHVpbnQ2NF90KSBzY2FuX3N0YXJ0X3RpY2tzX2hpZ2ggPDwgMzIpOworCWNvbnZfdGlja3MgPQorCSAgICAodWludDY0X3QpIGNvbnZfc3RhcnRfdGlja3NfbG93ICsKKwkgICAgKCh1aW50NjRfdCkgY29udl9zdGFydF90aWNrc19oaWdoIDw8IDMyKTsKKworCS8vIENoZWNrIHNldHRpbmdzIC0gYmVnaW4KKwlzd2l0Y2ggKHRyaWdnZXItPmlBY3FTdGFydFRyaWdUeXBlKSB7CisJY2FzZSBNRV9UUklHX1RZUEVfU1c6CisJY2FzZSBNRV9UUklHX1RZUEVfRVhUX0RJR0lUQUw6CisJY2FzZSBNRV9UUklHX1RZUEVfRVhUX0FOQUxPRzoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgYWNxdWlzaXRpb24gc3RhcnQgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9UUklHX1RZUEU7CisJCWdvdG8gRVJST1I7CisJCWJyZWFrOworCX0KKworCWlmICgodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ1R5cGUgPT0gTUVfVFJJR19UWVBFX1NXKQorCSAgICAmJiAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ0VkZ2UgIT0gTUVfVFJJR19FREdFX05PTkUpKSB7CisJCVBFUlJPUigiSW52YWxpZCBhY3F1aXNpdGlvbiBzdGFydCB0cmlnZ2VyIGVkZ2Ugc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX1RSSUdfRURHRTsKKwkJZ290byBFUlJPUjsKKwl9CisKKwlpZiAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ1R5cGUgIT0gTUVfVFJJR19UWVBFX1NXKSB7CisJCXN3aXRjaCAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ0VkZ2UpIHsKKwkJY2FzZSBNRV9UUklHX0VER0VfUklTSU5HOgorCQljYXNlIE1FX1RSSUdfRURHRV9GQUxMSU5HOgorCQljYXNlIE1FX1RSSUdfRURHRV9BTlk6CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJUEVSUk9SCisJCQkgICAgKCJJbnZhbGlkIGFjcXVpc2l0aW9uIHN0YXJ0IHRyaWdnZXIgZWRnZSBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX1RSSUdfRURHRTsKKwkJCWdvdG8gRVJST1I7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnQ2hhbiAhPSBNRV9UUklHX0NIQU5fREVGQVVMVCkgeworCQlQRVJST1IKKwkJICAgICgiSW52YWxpZCBhY3F1aXNpdGlvbiBzdGFydCB0cmlnZ2VyIGNoYW5uZWwgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX1RSSUdfQ0hBTjsKKwkJZ290byBFUlJPUjsKKwl9CisKKwlpZiAoKGFjcV90aWNrcyA8IE1FNDYwMF9BSV9NSU5fQUNRX1RJQ0tTKQorCSAgICB8fCAoYWNxX3RpY2tzID4gTUU0NjAwX0FJX01BWF9BQ1FfVElDS1MpKSB7CisJCVBFUlJPUgorCQkgICAgKCJJbnZhbGlkIGFjcXVpc2l0aW9uIHN0YXJ0IHRyaWdnZXIgYXJndW1lbnQgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX0FSRzsKKwkJZ290byBFUlJPUjsKKwl9CisKKwlzd2l0Y2ggKHRyaWdnZXItPmlTY2FuU3RhcnRUcmlnVHlwZSkgeworCisJY2FzZSBNRV9UUklHX1RZUEVfVElNRVI6CisJCWlmICgoc2Nhbl90aWNrcyA8IE1FNDYwMF9BSV9NSU5fU0NBTl9USUNLUykKKwkJICAgIHx8IChzY2FuX3RpY2tzID4gTUU0NjAwX0FJX01BWF9TQ0FOX1RJQ0tTKQorCQkgICAgfHwgKHNjYW5fdGlja3MgPCBjb3VudCAqIGNvbnZfdGlja3MpCisJCSAgICApIHsKKwkJCVBFUlJPUigiSW52YWxpZCBzY2FuIHN0YXJ0IGFyZ3VtZW50IHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TQ0FOX1NUQVJUX0FSRzsKKwkJCWdvdG8gRVJST1I7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTDoKKwkJaWYgKHRyaWdnZXItPmlBY3FTdGFydFRyaWdUeXBlICE9IE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTCkgeworCQkJUEVSUk9SCisJCQkgICAgKCJJbnZhbGlkIHNjYW4gc3RhcnQgdHJpZ2dlciB0eXBlIHNwZWNpZmllZCAoQWNxIGlzIEhXIGRpZ2l0YWwpXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVEFSVF9UUklHX1RZUEU7CisJCQlnb3RvIEVSUk9SOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9UUklHX1RZUEVfRVhUX0FOQUxPRzoKKwkJaWYgKHRyaWdnZXItPmlBY3FTdGFydFRyaWdUeXBlICE9IE1FX1RSSUdfVFlQRV9FWFRfQU5BTE9HKSB7CisJCQlQRVJST1IKKwkJCSAgICAoIkludmFsaWQgc2NhbiBzdGFydCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkIChBY3EgaXMgSFcgYW5hbG9nKVxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NDQU5fU1RBUlRfVFJJR19UWVBFOworCQkJZ290byBFUlJPUjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19UWVBFX0ZPTExPVzoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgc2NhbiBzdGFydCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVEFSVF9UUklHX1RZUEU7CisJCWdvdG8gRVJST1I7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAodHJpZ2dlci0+aUNvbnZTdGFydFRyaWdUeXBlKSB7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9USU1FUjoKKwkJaWYgKChjb252X3RpY2tzIDwgTUU0NjAwX0FJX01JTl9DSEFOX1RJQ0tTKQorCQkgICAgfHwgKGNvbnZfdGlja3MgPiBNRTQ2MDBfQUlfTUFYX0NIQU5fVElDS1MpKSB7CisJCQlQRVJST1IKKwkJCSAgICAoIkludmFsaWQgY29udiBzdGFydCB0cmlnZ2VyIGFyZ3VtZW50IHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DT05WX1NUQVJUX0FSRzsKKwkJCWdvdG8gRVJST1I7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTDoKKwkJaWYgKCh0cmlnZ2VyLT5pU2NhblN0YXJ0VHJpZ1R5cGUgIT0gTUVfVFJJR19UWVBFX0ZPTExPVykKKwkJICAgIHx8ICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnVHlwZSAhPQorCQkJTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMKSkgeworCQkJUEVSUk9SKCJJbnZhbGlkIGNvbnYgc3RhcnQgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DT05WX1NUQVJUX1RSSUdfVFlQRTsKKwkJCWdvdG8gRVJST1I7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9FWFRfQU5BTE9HOgorCQlpZiAoKHRyaWdnZXItPmlTY2FuU3RhcnRUcmlnVHlwZSAhPSBNRV9UUklHX1RZUEVfRk9MTE9XKQorCQkgICAgfHwgKHRyaWdnZXItPmlBY3FTdGFydFRyaWdUeXBlICE9CisJCQlNRV9UUklHX1RZUEVfRVhUX0FOQUxPRykpIHsKKwkJCVBFUlJPUigiSW52YWxpZCBjb252IHN0YXJ0IHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ09OVl9TVEFSVF9UUklHX1RZUEU7CisJCQlnb3RvIEVSUk9SOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGNvbnYgc3RhcnQgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NPTlZfU1RBUlRfVFJJR19UWVBFOworCQlnb3RvIEVSUk9SOworCisJCWJyZWFrOworCX0KKy8qKgorKiBBY2VwdGFibGUgc2V0dGluZ3M6CisqIGlTY2FuU3RvcFRyaWdUeXBlCQk6CWlBY3FTdG9wVHJpZ1R5cGUKKyoKKyogTUVfVFJJR19UWVBFX05PTkUJCToJTUVfVFJJR19UWVBFX05PTkUJLT4gaW5maW5pdGUgY291bnQgd2l0aCBtYW51YWwgc3RvcAorKiBNRV9UUklHX1RZUEVfTk9ORQkJOglNRV9UUklHX1RZUEVfQ09VTlQJLT4gc3RvcCBhZnRlciBnZXR0aW5nIGlTY2FuU3RvcENvdW50IGxpc3Qgb2YgdmFsdWVzIChpU2NhblN0b3BDb3VudCAqIGNvdW50KQorKiBNRV9UUklHX1RZUEVfQ09VTlQJOglNRV9UUklHX1RZUEVfRk9MTE9XCS0+IHN0b3AgYWZ0ZXIgZ2V0dGluZyBpQWNxU3RvcENvdW50IHZhbHVlcyAoaXQgY2FuIHN0b3BzIGluIG1pZGxlIG9mIHRoZSBsaXN0KQorKi8KKwlzd2l0Y2ggKHRyaWdnZXItPmlTY2FuU3RvcFRyaWdUeXBlKSB7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9OT05FOgorCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19UWVBFX0NPVU5UOgorCQlpZiAodHJpZ2dlci0+aVNjYW5TdG9wQ291bnQgPD0gMCkgeworCQkJUEVSUk9SKCJJbnZhbGlkIHNjYW4gc3RvcCBhcmd1bWVudCBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVE9QX0FSRzsKKwkJCWdvdG8gRVJST1I7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgc2NhbiBzdG9wIHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TQ0FOX1NUT1BfVFJJR19UWVBFOworCQlnb3RvIEVSUk9SOworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKHRyaWdnZXItPmlBY3FTdG9wVHJpZ1R5cGUpIHsKKworCWNhc2UgTUVfVFJJR19UWVBFX05PTkU6CisJCWlmICh0cmlnZ2VyLT5pU2NhblN0b3BUcmlnVHlwZSAhPSBNRV9UUklHX1RZUEVfTk9ORSkgeworCQkJUEVSUk9SKCJJbnZhbGlkIGFjcSBzdG9wIHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUT1BfVFJJR19UWVBFOworCQkJZ290byBFUlJPUjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19UWVBFX0ZPTExPVzoKKwkJaWYgKHRyaWdnZXItPmlTY2FuU3RvcFRyaWdUeXBlICE9IE1FX1RSSUdfVFlQRV9DT1VOVCkgeworCQkJUEVSUk9SKCJJbnZhbGlkIGFjcSBzdG9wIHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUT1BfVFJJR19UWVBFOworCQkJZ290byBFUlJPUjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19UWVBFX0NPVU5UOgorCQlpZiAodHJpZ2dlci0+aVNjYW5TdG9wVHJpZ1R5cGUgIT0gTUVfVFJJR19UWVBFX05PTkUpIHsKKwkJCVBFUlJPUigiSW52YWxpZCBhY3Egc3RvcCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0FDUV9TVE9QX1RSSUdfVFlQRTsKKwkJCWdvdG8gRVJST1I7CisJCX0KKworCQlpZiAodHJpZ2dlci0+aUFjcVN0b3BDb3VudCA8PSAwKSB7CisJCQlQRVJST1IKKwkJCSAgICAoIkludmFsaWQgYWNxdWlzaXRpb24gb3Igc2NhbiBzdG9wIGFyZ3VtZW50IHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RPUF9BUkc7CisJCQlnb3RvIEVSUk9SOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGFjcSBzdG9wIHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RPUF9UUklHX1RZUEU7CisJCWdvdG8gRVJST1I7CisJCWJyZWFrOworCX0KKworCWlmICgoY291bnQgPD0gMCkgfHwgKGNvdW50ID4gTUU0NjAwX0FJX0xJU1RfQ09VTlQpKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIGxpc3QgY291bnQgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ09ORklHX0xJU1RfQ09VTlQ7CisJCWdvdG8gRVJST1I7CisJfQorLy8vVGhpcyBpcyBnZW5lcmFsIGxpbWl0YXRpb24KKy8vICAgICAgaWYgKGZpZm9faXJxX3RocmVzaG9sZCA8IDAgfHwgZmlmb19pcnFfdGhyZXNob2xkID49IE1FNDYwMF9BSV9DSVJDX0JVRl9DT1VOVCkKKy8vL1RoaXMgaXMgbGltaXRhdGlvbiBmcm9tIFdpbmRvd3MuIEkgdXNlIGl0IGZvciBjb21wYXRpYmlsaXR5LgorCWlmIChmaWZvX2lycV90aHJlc2hvbGQgPCAwCisJICAgIHx8IGZpZm9faXJxX3RocmVzaG9sZCA+PSBNRTQ2MDBfQUlfRklGT19DT1VOVCkgeworCQlQRVJST1IoIkludmFsaWQgZmlmbyBpcnEgdGhyZXNob2xkIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZJRk9fSVJRX1RIUkVTSE9MRDsKKwkJZ290byBFUlJPUjsKKwl9CisKKwlpZiAoKGNvbmZpZ19saXN0WzBdLmlSZWYgPT0gTUVfUkVGX0FJX0RJRkZFUkVOVElBTCkKKwkgICAgJiYgKGluc3RhbmNlLT5jaGFubmVscyA9PSAxNikpIHsKKwkJUEVSUk9SCisJCSAgICAoIkRpZmZlcmVudGlhbCByZWZlcmVuY2UgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGlzIHN1YmRldmljZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1JFRjsKKwkJZ290byBFUlJPUjsKKwl9CisKKwlpZiAoZmxhZ3MgJiBNRV9JT19TVFJFQU1fQ09ORklHX1NBTVBMRV9BTkRfSE9MRCkgeworCQlpZiAoIWluc3RhbmNlLT5zaCkgeworCQkJUEVSUk9SCisJCQkgICAgKCJTYW1wbGUgYW5kIGhvbGQgaXMgbm90IGF2YWlsYWJsZSBmb3IgdGhpcyBib2FyZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwkJCWdvdG8gRVJST1I7CisJCX0KKwkJaWYgKGNvbmZpZ19saXN0WzBdLmlSZWYgPT0gTUVfUkVGX0FJX0RJRkZFUkVOVElBTCkgeworCQkJUEVSUk9SCisJCQkgICAgKCJTYW1wbGUgYW5kIGhvbGQgaXMgbm90IGF2YWlsYWJsZSBpbiBkaWZmZXJlbnRpYWwgbW9kZS5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwkJCWdvdG8gRVJST1I7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlpZiAoKGNvbmZpZ19saXN0W2ldLmlTdHJlYW1Db25maWcgPCAwKQorCQkgICAgfHwgKGNvbmZpZ19saXN0W2ldLmlTdHJlYW1Db25maWcgPj0gaW5zdGFuY2UtPnJhbmdlc19sZW4pKSB7CisJCQlQRVJST1IoIkludmFsaWQgc3RyZWFtIGNvbmZpZyBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU1RSRUFNX0NPTkZJRzsKKwkJCWdvdG8gRVJST1I7CisJCX0KKworCQlpZiAoKGNvbmZpZ19saXN0W2ldLmlSZWYgIT0gTUVfUkVGX0FJX0dST1VORCkKKwkJICAgICYmIChjb25maWdfbGlzdFtpXS5pUmVmICE9IE1FX1JFRl9BSV9ESUZGRVJFTlRJQUwpKSB7CisJCQlQRVJST1IoIkludmFsaWQgcmVmZXJlbmNlcyBpbiB0aGUgbGlzdC4gUmVmPTB4JXhcbiIsCisJCQkgICAgICAgY29uZmlnX2xpc3RbaV0uaVJlZik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1JFRjsKKwkJCWdvdG8gRVJST1I7CisJCX0KKworCQlpZiAoY29uZmlnX2xpc3RbaV0uaVN0cmVhbUNvbmZpZyAlIDIpIHsJLy8gU3RyZWFtQ29uZmlnOiAxIG9yIDMKKwkJCWlmIChjb25maWdfbGlzdFtpXS5pUmVmID09IE1FX1JFRl9BSV9ESUZGRVJFTlRJQUwpIHsKKwkJCQlQRVJST1IKKwkJCQkgICAgKCJPbmx5IGJpcG9sYXIgbW9kZXMgc3VwcG9ydCBkaWZmZXJlbnRpYWwgbWVhc3VyZW1lbnQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1JFRjsKKwkJCQlnb3RvIEVSUk9SOworCQkJfQorCQl9CisKKwkJaWYgKGNvbmZpZ19saXN0W2ldLmlSZWYgIT0gY29uZmlnX2xpc3RbMF0uaVJlZikgeworCQkJUEVSUk9SCisJCQkgICAgKCJOb3QgYWxsIHJlZmVyZW5jZXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24gbGlzdCBhcmUgZXF1YWwuIFJlZlswXT0weCV4IFJlZlslZF09MHgleFxuIiwKKwkJCSAgICAgY29uZmlnX2xpc3RbMF0uaVJlZiwgaSwgY29uZmlnX2xpc3RbaV0uaVJlZik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1JFRjsKKwkJCWdvdG8gRVJST1I7CisJCX0KKworCQlpZiAoKGNvbmZpZ19saXN0W2ldLmlSZWYgPT0gTUVfUkVGX0FJX0RJRkZFUkVOVElBTCkKKwkJICAgICYmIChjb25maWdfbGlzdFtpXS5pQ2hhbm5lbCA+PSAxNikpIHsKKwkJCVBFUlJPUigiQ2hhbm5lbCBub3QgYXZhaWxhYmxlIGluIGRpZmZlcmVudGlhbCBtb2RlLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCQlnb3RvIEVSUk9SOworCQl9CisKKwkJaWYgKChjb25maWdfbGlzdFtpXS5pQ2hhbm5lbCA8IDApCisJCSAgICB8fCAoY29uZmlnX2xpc3RbaV0uaUNoYW5uZWwgPj0gaW5zdGFuY2UtPmNoYW5uZWxzKSkgeworCQkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQkJZ290byBFUlJPUjsKKwkJfQorCX0KKworCS8vIENoZWNrIHNldHRpbmdzIC0gZW5kCisKKwkvL0NhbmNlbCBjb250cm9sIHRhc2sKKwlQREVCVUcoIkNhbmNlbCBjb250cm9sIHRhc2suXG4iKTsKKwlpbnN0YW5jZS0+YWlfY29udHJvbF90YXNrX2ZsYWcgPSAwOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmluc3RhbmNlLT5haV9jb250cm9sX3Rhc2spOworCisJLy8gV29yayBhcm91bmQgZnJvbSBLZWl0aCBIYXJ0bGV5IC0gYmVnaW4KKwlpZiAodHJpZ2dlci0+aVNjYW5TdGFydFRyaWdUeXBlID09IE1FX1RSSUdfVFlQRV9USU1FUikgeworCQlpZiAoY291bnQgPT0gMSkgeworCQkJLy8gVGhlIGhhcmR3YXJlIGRvZXMgbm90IHdvcmsgcHJvcGVybHkgd2l0aCBhIG5vbi16ZXJvIHNjYW4gdGltZQorCQkJLy8gaWYgdGhlcmUgaXMgb25seSBPTkUgY2hhbm5lbCBpbiB0aGUgY2hhbm5lbCBsaXN0LiBJbiB0aGlzIGNhc2UKKwkJCS8vIHdlIG11c3Qgc2V0IHRoZSBzY2FuIHRpbWUgdG8gemVybyBhbmQgdXNlIHRoZSBjaGFubmVsIHRpbWUuCisKKwkJCWNvbnZfdGlja3MgPSBzY2FuX3RpY2tzOworCQkJdHJpZ2dlci0+aVNjYW5TdGFydFRyaWdUeXBlID0gTUVfVFJJR19UWVBFX0ZPTExPVzsKKwkJfSBlbHNlIGlmIChzY2FuX3RpY2tzID09IGNvdW50ICogY29udl90aWNrcykgeworCQkJLy8gQW5vdGhlciBoYXJkd2FyZSBwcm9ibGVtLiBJZiB0aGUgbnVtYmVyIG9mIHNjYW4gdGlja3MgaXMKKwkJCS8vIGV4YWN0bHkgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBjaGFubmVsIHRpY2tzIG11bHRpcGxpZWQgYnkKKwkJCS8vIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgdGhlbiB0aGUgc2FtcGxpbmcgcmF0ZSBpcyByZWR1Y2VkCisJCQkvLyBieSBoYWxmLgorCQkJdHJpZ2dlci0+aVNjYW5TdGFydFRyaWdUeXBlID0gTUVfVFJJR19UWVBFX0ZPTExPVzsKKwkJfQorCX0KKwkvLyBXb3JrIGFyb3VuZCBmcm9tIEtlaXRoIEhhcnRsZXkgLSBlbmQKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwlpZiAoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZTTSkgeworCQlQRVJST1IoIlN1YmRldmljZSBpcyBidXN5LlxuIik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkJTUVfU1VCREVWSUNFX0VYSVQ7CisJCXJldHVybiBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwl9CisKKwlpbnN0YW5jZS0+c3RhdHVzID0gYWlfc3RhdHVzX25vbmU7CisJc3Bpbl9sb2NrX2lycXNhdmUoaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2ssIGNwdV9mbGFncyk7CisJLy8gU3RvcCBhbGwgYWN0aW9ucy4gQmxvY2sgYWxsIGludGVycnVwdHMuIENsZWFyIChkaXNhYmxlKSBGSUZPcy4KKwljdHJsID0KKwkgICAgTUU0NjAwX0FJX0NUUkxfQklUX0xFX0lSUV9SRVNFVCB8IE1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQgfAorCSAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRX1JFU0VUOworCisJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJLy8gUHJlc2VydmUgRVhUIElSUSBhbmQgT0ZGU0VUIHNldHRpbmdzLiBDbGVhbiBvdGhlciBiaXRzLgorCXRtcCAmPQorCSAgICAoTUU0NjAwX0FJX0NUUkxfQklUX0VYX0lSUSB8IE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9JUlFfUkVTRVQgfAorCSAgICAgTUU0NjAwX0FJX0NUUkxfQklUX0ZVTExTQ0FMRSB8IE1FNDYwMF9BSV9DVFJMX0JJVF9PRkZTRVQpOworCisJLy8gU2VuZCBpdCB0byByZWdpc3Rlci4KKwlvdXRsKHRtcCB8IGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCB8IGN0cmwpOworCisJLy8gRW5hYmxlIGNoYW5uZWwgZmlmbyAtPiBkYXRhIGZpZm8gaW4gc3RyZWFtX3N0YXJ0KCkuCisJY3RybCB8PSBNRTQ2MDBfQUlfQ1RSTF9CSVRfQ0hBTk5FTF9GSUZPOworCW91dGwodG1wIHwgY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wIHwgY3RybCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpbnN0YW5jZS0+Y3RybF9yZWdfbG9jaywgY3B1X2ZsYWdzKTsKKworCS8vIFdyaXRlIHRoZSBjaGFubmVsIGxpc3QKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQllbnRyeSA9IGNvbmZpZ19saXN0W2ldLmlDaGFubmVsOworCisJCXN3aXRjaCAoY29uZmlnX2xpc3RbaV0uaVN0cmVhbUNvbmZpZykgeworCQljYXNlIDA6CS8vQklQT0xBUiAxMFYKKy8qCisJCQkJLy8gTUU0NjAwX0FJX0xJU1RfUkFOR0VfQklQT0xBUl8xMCA9IDB4MDAwMAorCQkJCS8vICdlbnRyeSB8PSBNRTQ2MDBfQUlfTElTVF9SQU5HRV9CSVBPTEFSXzEwJyA8PT0gRG8gbm90aGluZy4gUmVtb3ZlZC4KKwkJCQllbnRyeSB8PSBNRTQ2MDBfQUlfTElTVF9SQU5HRV9CSVBPTEFSXzEwOworKi8KKwkJCWJyZWFrOworCQljYXNlIDE6CS8vVU5JUE9MQVIgMTBWCisJCQllbnRyeSB8PSBNRTQ2MDBfQUlfTElTVF9SQU5HRV9VTklQT0xBUl8xMDsKKwkJCWJyZWFrOworCQljYXNlIDI6CS8vQklQT0xBUiAyLjVWCisJCQllbnRyeSB8PSBNRTQ2MDBfQUlfTElTVF9SQU5HRV9CSVBPTEFSXzJfNTsKKwkJCWJyZWFrOworCQljYXNlIDM6CS8vVU5JUE9MQVIgMi41VgorCQkJZW50cnkgfD0gTUU0NjAwX0FJX0xJU1RfUkFOR0VfVU5JUE9MQVJfMl81OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlQRVJST1JfQ1JJVElDQUwoIlVOQ0hFQ0sgRVJST1IgaW4gY29uZmlnX2xpc3QhXG4iKTsKKwkJCVBFUlJPUl9DUklUSUNBTAorCQkJICAgICgiV1JPTkcgcmFuZ2VcblBvc2l0aW9uOiVkIFJhbmdlOjB4JTA0WFxuIiwgaSwKKwkJCSAgICAgY29uZmlnX2xpc3RbaV0uaVN0cmVhbUNvbmZpZyk7CisJCQlnb3RvIFZFUklGWV9FUlJPUjsKKwkJCWJyZWFrOworCQl9CisKKwkJc3dpdGNoIChjb25maWdfbGlzdFtpXS5pUmVmKSB7CisJCWNhc2UgTUVfUkVGX0FJX0dST1VORDoJLy9TSU5HTEUgRU5ERUQKKy8qCisJCQkJLy8gTUU0NjAwX0FJX0xJU1RfSU5QVVRfU0lOR0xFX0VOREVEID0gMHgwMDAwCisJCQkJLy8gJ2VudHJ5IHw9IE1FNDYwMF9BSV9MSVNUX0lOUFVUX1NJTkdMRV9FTkRFRCcgPT0+IERvIG5vdGhpbmcuIFJlbW92ZWQuCisJCQkJZW50cnkgfD0gTUU0NjAwX0FJX0xJU1RfSU5QVVRfU0lOR0xFX0VOREVEOworKi8gYnJlYWs7CisJCWNhc2UgTUVfUkVGX0FJX0RJRkZFUkVOVElBTDoJLy9ESUZGRVJFTlRJQUwKKwkJCWVudHJ5IHw9IE1FNDYwMF9BSV9MSVNUX0lOUFVUX0RJRkZFUkVOVElBTDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJUEVSUk9SX0NSSVRJQ0FMKCJVTkNIRUNLIEVSUk9SIGluIGNvbmZpZ19saXN0IVxuIik7CisJCQlQRVJST1JfQ1JJVElDQUwKKwkJCSAgICAoIldST05HIHJlZmVyZW5jZVxuUG9zaXRpb246JWQgUmVmZXJlbmNlOjB4JTA0WFxuIiwKKwkJCSAgICAgaSwgY29uZmlnX2xpc3RbaV0uaVJlZik7CisJCQlnb3RvIFZFUklGWV9FUlJPUjsKKwkJCWJyZWFrOworCQl9CisKKwkJLy9BZGQgbGFzdCBlbnRyeSBmbGFnCisJCWlmIChpID09IChjb3VudCAtIDEpKSB7CisJCQllbnRyeSB8PSBNRTQ2MDBfQUlfTElTVF9MQVNUX0VOVFJZOworCQl9CisKKwkJb3V0bChlbnRyeSwgaW5zdGFuY2UtPmNoYW5uZWxfbGlzdF9yZWcpOworCQlQREVCVUdfUkVHKCJjaGFubmVsX2xpc3RfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y2hhbm5lbF9saXN0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGVudHJ5KTsKKwl9CisKKwkvLyBTZXQgdHJpZ2dlcmluZyByZWdpc3RlcnMKKwktLWFjcV90aWNrczsKKwlvdXRsKGFjcV90aWNrcywgaW5zdGFuY2UtPmNoYW5fcHJlX3RpbWVyX3JlZyk7CisJUERFQlVHX1JFRygiY2hhbl9wcmVfdGltZXJfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JWxsWFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y2hhbl9wcmVfdGltZXJfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBhY3FfdGlja3MpOworCW91dGwoYWNxX3RpY2tzLCBpbnN0YW5jZS0+c2Nhbl9wcmVfdGltZXJfbG93X3JlZyk7CisJUERFQlVHX1JFRygic2Nhbl9wcmVfdGltZXJfbG93X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCVsbFhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnNjYW5fcHJlX3RpbWVyX2xvd19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGFjcV90aWNrcyAmIDB4RkZGRkZGRkYpOworCW91dGwoKGFjcV90aWNrcyA+PiAzMiksIGluc3RhbmNlLT5zY2FuX3ByZV90aW1lcl9oaWdoX3JlZyk7CisJUERFQlVHX1JFRygic2Nhbl9wcmVfdGltZXJfaGlnaF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHglbGxYXG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zY2FuX3ByZV90aW1lcl9oaWdoX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgKGFjcV90aWNrcyA+PiAzMikgJiAweEZGRkZGRkZGKTsKKworCS8vIFNldCB0cmlnZ2VycworCXN3aXRjaCAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ1R5cGUpIHsKKwkJLy8gSW50ZXJuYWwKKwljYXNlIE1FX1RSSUdfVFlQRV9TVzoKKwkJLy8gTm90aGluZyB0byBzZXQuCisJCWJyZWFrOworCisJCS8vIEV4dGVybmFsCisJY2FzZSBNRV9UUklHX1RZUEVfRVhUX0FOQUxPRzoKKwkJY3RybCB8PSBNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfVFJJR19BTkFMT0c7CisJY2FzZSBNRV9UUklHX1RZUEVfRVhUX0RJR0lUQUw6CisJCWN0cmwgfD0gTUU0NjAwX0FJX0NUUkxfQklUX0VYX1RSSUc7CisKKwkJLy8gRXh0ZXJuYWwgdHJpZ2dlciBuZWVkcyBlZGdlJ3MgZGVmaW5pdGlvbgorCQlzd2l0Y2ggKHRyaWdnZXItPmlBY3FTdGFydFRyaWdFZGdlKSB7CisJCWNhc2UgTUVfVFJJR19FREdFX1JJU0lORzoKKwkJCS8vIE5vdGhpbmcgdG8gc2V0LgorCQkJYnJlYWs7CisKKwkJY2FzZSBNRV9UUklHX0VER0VfRkFMTElORzoKKwkJCWN0cmwgfD0gTUU0NjAwX0FJX0NUUkxfQklUX0VYX1RSSUdfRkFMTElORzsKKwkJCWJyZWFrOworCisJCWNhc2UgTUVfVFJJR19FREdFX0FOWToKKwkJCWN0cmwgfD0KKwkJCSAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfVFJJR19GQUxMSU5HIHwKKwkJCSAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfVFJJR19CT1RIOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCVBFUlJPUl9DUklUSUNBTAorCQkJICAgICgiVU5DSEVDSyBUUklHR0VSIEVER0UgaW4gdHJpZ2dlcnMgc3RydWN0dXJlIVxuIik7CisJCQlQRVJST1JfQ1JJVElDQUwKKwkJCSAgICAoIldST05HIGFjcXVpc2l0aW9uIHN0YXJ0IHRyaWdnZXI6MHglMDRYLlxuIiwKKwkJCSAgICAgdHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ0VkZ2UpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RBUlRfVFJJR19FREdFOworCQkJZ290byBWRVJJRllfRVJST1I7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUl9DUklUSUNBTCgiVU5DSEVDSyBUUklHR0VSIGluIHRyaWdnZXJzIHN0cnVjdHVyZSFcbiIpOworCQlQRVJST1JfQ1JJVElDQUwoIldST05HIGFjcXVpc2l0aW9uIHN0YXJ0IHRyaWdnZXI6MHglMDRYLlxuIiwKKwkJCQl0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnVHlwZSk7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX1RSSUdfVFlQRTsKKwkJZ290byBWRVJJRllfRVJST1I7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAodHJpZ2dlci0+aVNjYW5TdGFydFRyaWdUeXBlKSB7CisJY2FzZSBNRV9UUklHX1RZUEVfVElNRVI6CisJCS0tc2Nhbl90aWNrczsKKwkJb3V0bChzY2FuX3RpY2tzLCBpbnN0YW5jZS0+c2Nhbl90aW1lcl9sb3dfcmVnKTsKKwkJUERFQlVHX1JFRygic2Nhbl90aW1lcl9sb3dfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JWxsWFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5zY2FuX3RpbWVyX2xvd19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBzY2FuX3RpY2tzICYgMHhGRkZGRkZGRik7CisJCW91dGwoKHNjYW5fdGlja3MgPj4gMzIpLCBpbnN0YW5jZS0+c2Nhbl90aW1lcl9oaWdoX3JlZyk7CisJCVBERUJVR19SRUcoInNjYW5fdGltZXJfaGlnaF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHglbGxYXG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnNjYW5fdGltZXJfaGlnaF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICAoc2Nhbl90aWNrcyA+PiAzMikgJiAweEZGRkZGRkZGKTsKKworCQlpZiAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ1R5cGUgPT0gTUVfVFJJR19UWVBFX1NXKSB7CisJCQljdHJsIHw9IE1FNDYwMF9BSV9DVFJMX0JJVF9NT0RFXzA7CisJCX0gZWxzZSB7CisJCQljdHJsIHw9IE1FNDYwMF9BSV9DVFJMX0JJVF9NT0RFXzE7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTDoKKwljYXNlIE1FX1RSSUdfVFlQRV9FWFRfQU5BTE9HOgorCQlvdXRsKDAsIGluc3RhbmNlLT5zY2FuX3RpbWVyX2xvd19yZWcpOworCQlQREVCVUdfUkVHKCJzY2FuX3RpbWVyX2xvd19yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5zY2FuX3RpbWVyX2xvd19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICAwKTsKKwkJb3V0bCgwLCBpbnN0YW5jZS0+c2Nhbl90aW1lcl9oaWdoX3JlZyk7CisJCVBERUJVR19SRUcoInNjYW5fdGltZXJfaGlnaF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5zY2FuX3RpbWVyX2hpZ2hfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgMCk7CisJCWN0cmwgfD0gTUU0NjAwX0FJX0NUUkxfQklUX01PREVfMjsKKwkJYnJlYWs7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9GT0xMT1c6CisJCW91dGwoMCwgaW5zdGFuY2UtPnNjYW5fdGltZXJfbG93X3JlZyk7CisJCVBERUJVR19SRUcoInNjYW5fdGltZXJfbG93X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnNjYW5fdGltZXJfbG93X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIDApOworCQlvdXRsKDAsIGluc3RhbmNlLT5zY2FuX3RpbWVyX2hpZ2hfcmVnKTsKKwkJUERFQlVHX1JFRygic2Nhbl90aW1lcl9oaWdoX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnNjYW5fdGltZXJfaGlnaF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICAwKTsKKworCQlpZiAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ1R5cGUgPT0gTUVfVFJJR19UWVBFX1NXKSB7CisJCQljdHJsIHw9IE1FNDYwMF9BSV9DVFJMX0JJVF9NT0RFXzA7CisJCX0gZWxzZSB7CisJCQljdHJsIHw9IE1FNDYwMF9BSV9DVFJMX0JJVF9NT0RFXzE7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1JfQ1JJVElDQUwoIlVOQ0hFQ0sgVFJJR0dFUiBpbiB0cmlnZ2VycyBzdHJ1Y3R1cmUhXG4iKTsKKwkJUEVSUk9SX0NSSVRJQ0FMKCJXUk9ORyBzY2FuIHN0YXJ0IHRyaWdnZXI6MHglMDRYLlxuIiwKKwkJCQl0cmlnZ2VyLT5pU2NhblN0YXJ0VHJpZ1R5cGUpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NDQU5fU1RBUlRfVFJJR19UWVBFOworCQlnb3RvIFZFUklGWV9FUlJPUjsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoICh0cmlnZ2VyLT5pQ29udlN0YXJ0VHJpZ1R5cGUpIHsKKworCWNhc2UgTUVfVFJJR19UWVBFX1RJTUVSOgorCQktLWNvbnZfdGlja3M7CisJCW91dGwoY29udl90aWNrcywgaW5zdGFuY2UtPmNoYW5fdGltZXJfcmVnKTsKKwkJUERFQlVHX1JFRygiY2hhbl90aW1lcl9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHglbGxYXG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmNoYW5fdGltZXJfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgY29udl90aWNrcyk7CisJCWJyZWFrOworCisJY2FzZSBNRV9UUklHX1RZUEVfRVhUX0RJR0lUQUw6CisJY2FzZSBNRV9UUklHX1RZUEVfRVhUX0FOQUxPRzoKKwkJb3V0bCgwLCBpbnN0YW5jZS0+Y2hhbl90aW1lcl9yZWcpOworCQlQREVCVUdfUkVHKCJjaGFuX3RpbWVyX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmNoYW5fdGltZXJfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwkJY3RybCB8PSBNRTQ2MDBfQUlfQ1RSTF9CSVRfTU9ERV8wIHwgTUU0NjAwX0FJX0NUUkxfQklUX01PREVfMTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1JfQ1JJVElDQUwoIlVOQ0hFQ0sgVFJJR0dFUiBpbiB0cmlnZ2VycyBzdHJ1Y3R1cmUhXG4iKTsKKwkJUEVSUk9SX0NSSVRJQ0FMKCJXUk9ORyBjb252IHN0YXJ0IHRyaWdnZXI6MHglMDRYLlxuIiwKKwkJCQl0cmlnZ2VyLT5pQ29udlN0YXJ0VHJpZ1R5cGUpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NPTlZfU1RBUlRfVFJJR19UWVBFOworCQlnb3RvIFZFUklGWV9FUlJPUjsKKworCQlicmVhazsKKwl9CisKKwkvL1NhbXBsZSAmIEhvbGQgZmVhdHVyZQorCWlmIChmbGFncyAmIE1FX0lPX1NUUkVBTV9DT05GSUdfU0FNUExFX0FORF9IT0xEKSB7CisJCWlmIChpbnN0YW5jZS0+c2gpIHsKKwkJCWN0cmwgfD0gTUU0NjAwX0FJX0NUUkxfQklUX1NBTVBMRV9IT0xEOworCQl9IGVsc2UgeworCQkJUEVSUk9SX0NSSVRJQ0FMKCJVTkNIRUNLIFMmSCBmZWF0dXJlIVxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCQkJZ290byBWRVJJRllfRVJST1I7CisJCX0KKwl9CisJLy9FbmFibGUgSVJRcyBzb3VyY2VzIGJ1dCBsZWF2ZSBsYXRjaGVzIGJsb2NrZWQuCisJY3RybCB8PSAoTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUSB8IE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19JUlEgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfTEVfSVJRKTsJLy9UaGUgbGFzdCBJUlEgc291cmNlIChNRTQ2MDBfQUlfQ1RSTF9CSVRfTEVfSVJRKSBpcyB1bnVzZWQhCisKKwkvL0V2ZXJ5dGhpbmcgaXMgZ29vZC4gRmluYWxpemUKKwlzcGluX2xvY2tfaXJxc2F2ZShpbnN0YW5jZS0+Y3RybF9yZWdfbG9jaywgY3B1X2ZsYWdzKTsKKwl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCS8vUHJlc2VydmUgRVhUIElSUSBhbmQgT0ZGU0VUIHNldHRpbmdzLiBDbGVhbiBvdGhlciBiaXRzLgorCXRtcCAmPQorCSAgICAoTUU0NjAwX0FJX0NUUkxfQklUX0VYX0lSUSB8IE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9JUlFfUkVTRVQgfAorCSAgICAgTUU0NjAwX0FJX0NUUkxfQklUX0ZVTExTQ0FMRSB8IE1FNDYwMF9BSV9DVFJMX0JJVF9PRkZTRVQpOworCisJLy8gd3JpdGUgdGhlIGNvbnRyb2wgd29yZAorCW91dGwoY3RybCB8IHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCB8IHRtcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpbnN0YW5jZS0+Y3RybF9yZWdfbG9jaywgY3B1X2ZsYWdzKTsKKworCS8vU2V0IHRoZSBnbG9iYWwgcGFyYW1ldGVycyBlbmQgZXhpdC4KKwlpbnN0YW5jZS0+Y2hhbl9saXN0X2xlbiA9IGNvdW50OworCWluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQgPSBmaWZvX2lycV90aHJlc2hvbGQ7CisKKwlpZiAodHJpZ2dlci0+aUFjcVN0b3BUcmlnVHlwZSA9PSBNRV9UUklHX1RZUEVfQ09VTlQpIHsKKwkJZGF0YV9yZXF1aXJlZCA9CisJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKXRyaWdnZXItPmlBY3FTdG9wQ291bnQgKgorCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyljb3VudDsKKwkJaWYgKGRhdGFfcmVxdWlyZWQgPiBVSU5UX01BWCkKKwkJCWRhdGFfcmVxdWlyZWQgPSBVSU5UX01BWDsKKwkJaW5zdGFuY2UtPmRhdGFfcmVxdWlyZWQgPSAodW5zaWduZWQgaW50KWRhdGFfcmVxdWlyZWQ7CisJfSBlbHNlIGlmICh0cmlnZ2VyLT5pU2NhblN0b3BUcmlnVHlwZSA9PSBNRV9UUklHX1RZUEVfQ09VTlQpCisJCWluc3RhbmNlLT5kYXRhX3JlcXVpcmVkID0KKwkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpdHJpZ2dlci0+aVNjYW5TdG9wQ291bnQ7CisJZWxzZQorCQlpbnN0YW5jZS0+ZGF0YV9yZXF1aXJlZCA9IDA7CisKKwkvLyBNYXJrIHN1YmRldmljZSBhcyBjb25maWd1cmVkIHRvIHdvcmsgaW4gc3RyZWFtIG1vZGUuCisJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19zdHJlYW1fY29uZmlndXJlZDsKKworCS8vIERlaW5pdCBzaW5nbGUgY29uZmlnLiBTZXQgYWxsIGVudHJpZXMgdG8gTk9UX0NPTkZJR1VSRUQuCisJZm9yIChpID0gMDsgaSA8IGluc3RhbmNlLT5jaGFubmVsczsgaSsrKSB7CisJCWluc3RhbmNlLT5zaW5nbGVfY29uZmlnW2ldLnN0YXR1cyA9CisJCSAgICBNRV9TSU5HTEVfQ0hBTk5FTF9OT1RfQ09ORklHVVJFRDsKKwl9CisKKyAgICAgIFZFUklGWV9FUlJPUjoJCS8vIEVycm9yIGluIGNvZGUuIFdyb25nIHNldHRpbmcgY2hlY2suIFRoaXMgc2hvdWxkIG5ldmVyIGV2ZXIgaGFwcGVuZCEKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisgICAgICBFUlJPUjoJCQkvLyBFcnJvciBpbiBzZXR0aW5ncy4KKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX2lvX3N0cmVhbV9uZXdfdmFsdWVzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkJICBpbnQgdGltZV9vdXQsIGludCAqY291bnQsIGludCBmbGFncykKK3sKKwltZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVuc2lnbmVkIGxvbmcgdDsKKwl1bnNpZ25lZCBsb25nIGo7CisJaW50IHZvbGF0aWxlIGhlYWQ7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9MFxuIik7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICh0aW1lX291dCA8IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRpbWVfb3V0IHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9USU1FT1VUOworCX0KKworCWlmICh0aW1lX291dCkgeworCQl0ID0gKHRpbWVfb3V0ICogSFopIC8gMTAwMDsKKworCQlpZiAodCA9PSAwKQorCQkJdCA9IDE7CisJfSBlbHNlIHsJCS8vIE1heCB0aW1lLgorCQl0ID0gTE9OR19NQVg7CisJfQorCisJaW5zdGFuY2UgPSAobWU0NjAwX2FpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCWogPSBqaWZmaWVzOworCisJd2hpbGUgKDEpIHsKKwkJLy8gT25seSBydW5pbmcgZGV2aWNlIGNhbiBnZW5lcmF0ZSBicmVhay4KKwkJaGVhZCA9IGluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkOworCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSAoKGhlYWQgIT0KKwkJCQkJCSAgIGluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkKQorCQkJCQkJICB8fAorCQkJCQkJICAoKGluc3RhbmNlLT5zdGF0dXMgPD0KKwkJCQkJCSAgICBhaV9zdGF0dXNfc3RyZWFtX3J1bl93YWl0KQorCQkJCQkJICAgJiYgKGluc3RhbmNlLT5zdGF0dXMgPj0KKwkJCQkJCSAgICAgICBhaV9zdGF0dXNfc3RyZWFtX2VuZF93YWl0KSkpLAorCQkJCQkJIHQpOworCisJCWlmIChoZWFkICE9IGluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkKSB7CS8vIE5ldyBkYXRhIGluIGJ1ZmZlci4KKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKGluc3RhbmNlLT5zdGF0dXMgPT0gYWlfc3RhdHVzX3N0cmVhbV9lbmQpIHsJLy8gRW5kIG9mIHdvcmsuCisJCQlicmVhazsKKwkJfSBlbHNlIGlmIChpbnN0YW5jZS0+c3RhdHVzID09IGFpX3N0YXR1c19zdHJlYW1fZmlmb19lcnJvcikgeworCQkJZXJyID0gTUVfRVJSTk9fRklGT19CVUZGRVJfT1ZFUkZMT1c7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmIChpbnN0YW5jZS0+c3RhdHVzID09IGFpX3N0YXR1c19zdHJlYW1fYnVmZmVyX2Vycm9yKSB7CisJCQllcnIgPSBNRV9FUlJOT19SSU5HX0JVRkZFUl9PVkVSRkxPVzsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKGluc3RhbmNlLT5zdGF0dXMgPT0gYWlfc3RhdHVzX3N0cmVhbV9lcnJvcikgeworCQkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmICgoamlmZmllcyAtIGopID49IHQpIHsKKwkJCVBFUlJPUigiV2FpdCBvbiB2YWx1ZXMgdGltZWQgb3V0LlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19USU1FT1VUOworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCVBFUlJPUigiV2FpdCBvbiB2YWx1ZXMgaW50ZXJydXB0ZWQgZnJvbSBzaWduYWwuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwkJCWJyZWFrOworCQl9CisJCS8vIENvcnJlY3QgdGltZW91dC4KKwkJdCAtPSBqaWZmaWVzIC0gajsKKwl9CisKKwkqY291bnQgPSBtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1Zik7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaW5saW5lIG1lNDYwMF9haV9pb19zdHJlYW1fcmVhZF9nZXRfdmFsdWUobWU0NjAwX2FpX3N1YmRldmljZV90ICoKKwkJCQkJCSAgICAgaW5zdGFuY2UsIGludCAqdmFsdWVzLAorCQkJCQkJICAgICBjb25zdCBpbnQgY291bnQsCisJCQkJCQkgICAgIGNvbnN0IGludCBmbGFncykKK3sKKwlpbnQgbjsKKwlpbnQgaTsKKwl1aW50MzJfdCB2YWx1ZTsKKworCS8vL0NoZWNraW5nIGhvdyBtYW55IGRhdGFzIGNhbiBiZSBjb3BpZWQuCisJbiA9IG1lX2NpcmNfYnVmX3ZhbHVlcygmaW5zdGFuY2UtPmNpcmNfYnVmKTsKKwlpZiAobiA8PSAwKQorCQlyZXR1cm4gMDsKKworCWlmIChuID4gY291bnQpCisJCW4gPSBjb3VudDsKKworCWlmIChmbGFncyAmIE1FX0lPX1NUUkVBTV9SRUFEX0ZSQU1FUykgeworCQlpZiAobiA8IGluc3RhbmNlLT5jaGFuX2xpc3RfbGVuKQkvL05vdCBlbm91Z2ggZGF0YSEKKwkJCXJldHVybiAwOworCQluIC09IG4gJSBpbnN0YW5jZS0+Y2hhbl9saXN0X2xlbjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCXZhbHVlID0gKihpbnN0YW5jZS0+Y2lyY19idWYuYnVmICsgaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwpOworCQlpZiAocHV0X3VzZXIodmFsdWUsIHZhbHVlcyArIGkpKSB7CisJCQlQRVJST1IoIkNhbm5vdCBjb3B5IG5ldyB2YWx1ZXMgdG8gdXNlci5cbiIpOworCQkJcmV0dXJuIC1NRV9FUlJOT19JTlRFUk5BTDsKKwkJfQorCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCsrOworCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCAmPSBpbnN0YW5jZS0+Y2lyY19idWYubWFzazsKKwl9CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX2lvX3N0cmVhbV9yZWFkKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCByZWFkX21vZGUsCisJCQkJICAgIGludCAqdmFsdWVzLCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwlpbnQgcmV0OworCisJaW50IGMgPSAqY291bnQ7CisJaW50IG1pbiA9IGM7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9MFxuIik7CisKKwlpZiAoZmxhZ3MgJiB+TUVfSU9fU1RSRUFNX1JFQURfRlJBTUVTKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoIXZhbHVlcyB8fCAhY291bnQpIHsKKwkJUEVSUk9SKCJSZXF1ZXN0IGhhcyBpbnZhbGlkIHBvaW50ZXIuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfUE9JTlRFUjsKKwl9CisKKwlpZiAoYyA8IDApIHsKKwkJUEVSUk9SKCJSZXF1ZXN0IGhhcyBpbnZhbGlkIHZhbHVlJ3MgY291bnRlci5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9WQUxVRV9DT1VOVDsKKwl9CisKKwlpZiAoKHJlYWRfbW9kZSAhPSBNRV9SRUFEX01PREVfQkxPQ0tJTkcpCisJICAgICYmIChyZWFkX21vZGUgIT0gTUVfUkVBRF9NT0RFX05PTkJMT0NLSU5HKSkgeworCQlQRVJST1IoIkludmFsaWQgcmVhZCBtb2RlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SRUFEX01PREU7CisJfQorCisJaWYgKGMgPT0gMCkgewkJLy9Zb3UgZ2V0IHdoYXQgeW91IHdhbnQhIE5vdGhpbmcgbW9yZSBvciBsZXNzLgorCQlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKKwl9CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCS8vQ2hlY2sgaWYgc3ViZGV2aWNlIGlzIGNvbmZpZ3VyZWQuCisJaWYgKGluc3RhbmNlLT5jaGFuX2xpc3RfbGVuIDw9IDApIHsKKwkJUEVSUk9SKCJTdWJkZXZpY2Ugd2Fzbid0IGNvbmZpZ3VyZWQuXG4iKTsKKwkJTUVfU1VCREVWSUNFX0VYSVQ7CisJCXJldHVybiBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJfQorCisJaWYgKGZsYWdzICYgTUVfSU9fU1RSRUFNX1JFQURfRlJBTUVTKSB7CisJCWlmIChjIDwgaW5zdGFuY2UtPmNoYW5fbGlzdF9sZW4pIHsJLy9Ob3QgZW5vdWdoIGRhdGEgcmVxdWVzdGVkLgorCQkJUEVSUk9SCisJCQkgICAgKCJXaGVuIHVzaW5nIEZSQU1FX1JFQUQgbW9kZSBtaW5pbWFsIHNpemUgaXMgZGVmaW5lZCBieSBjaGFubmVsIGxpc3QuXG4iKTsKKwkJCU1FX1NVQkRFVklDRV9FWElUOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVkFMVUVfQ09VTlQ7CisJCX0KKwl9CisKKwlpZiAoYyA+IChNRTQ2MDBfQUlfQ0lSQ19CVUZfQ09VTlQgLSBpbnN0YW5jZS0+Y2hhbl9saXN0X2xlbikpIHsJLy8gVG8gcmV0dXJuIGFjY2VwdGFibGUgYW1vdW50IG9mIGRhdGEgd2hlbiB1c2VyIHBhc3MgdG9vIGJpZyB2YWx1ZS4KKwkJbWluID0gTUU0NjAwX0FJX0NJUkNfQlVGX0NPVU5UIC0gaW5zdGFuY2UtPmNoYW5fbGlzdF9sZW47CisJfQorCisJaWYgKGZsYWdzICYgTUVfSU9fU1RSRUFNX1JFQURfRlJBTUVTKSB7CisJCS8vV2FpdCBmb3Igd2hvbGUgbGlzdC4KKwkJaWYgKHJlYWRfbW9kZSA9PSBNRV9SRUFEX01PREVfQkxPQ0tJTkcpIHsKKwkJCW1pbiA9IGMgLSAoYyAlIGluc3RhbmNlLT5jaGFuX2xpc3RfbGVuKTsKKwkJfQorCisJCWlmIChyZWFkX21vZGUgPT0gTUVfUkVBRF9NT0RFX05PTkJMT0NLSU5HKSB7CisJCQltaW4gPSBpbnN0YW5jZS0+Y2hhbl9saXN0X2xlbjsKKwkJfQorCX0KKworCWlmICgoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZTTSkpIHsJLy9Xb3JraW5nCisJCS8vSWYgYmxvY2tpbmcgbW9kZSAtPiB3YWl0IGZvciBkYXRhLgorCQlpZiAoKG1lX2NpcmNfYnVmX3ZhbHVlcygmaW5zdGFuY2UtPmNpcmNfYnVmKSA8IG1pbikKKwkJICAgICYmIChyZWFkX21vZGUgPT0gTUVfUkVBRF9NT0RFX0JMT0NLSU5HKSkgeworCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJICgobWVfY2lyY19idWZfdmFsdWVzCisJCQkJCQkgICAoJmluc3RhbmNlLT5jaXJjX2J1ZikgPj0gbWluKQorCQkJCQkJICB8fCAhKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykKKwkJCQkJCSAgICAgICAmCisJCQkJCQkgICAgICAgTUU0NjAwX0FJX1NUQVRVU19CSVRfRlNNKSkpOworCisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlQRVJST1IKKwkJCQkgICAgKCJXYWl0IG9uIHZhbHVlcyBpbnRlcnJ1cHRlZCBmcm9tIHNpZ25hbC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwkJCX0KKwkJfQorCX0KKworCXJldCA9IG1lNDYwMF9haV9pb19zdHJlYW1fcmVhZF9nZXRfdmFsdWUoaW5zdGFuY2UsIHZhbHVlcywgYywgZmxhZ3MpOworCWlmIChyZXQgPCAwKSB7CisJCWVyciA9IC1yZXQ7CisJCSpjb3VudCA9IDA7CisJfSBlbHNlIGlmIChyZXQgPT0gMCkgeworCQkqY291bnQgPSAwOworCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBhaV9zdGF0dXNfc3RyZWFtX2ZpZm9fZXJyb3IpIHsKKwkJCWVyciA9IE1FX0VSUk5PX0ZJRk9fQlVGRkVSX09WRVJGTE9XOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19zdHJlYW1fZW5kOworCQl9IGVsc2UgaWYgKGluc3RhbmNlLT5zdGF0dXMgPT0gYWlfc3RhdHVzX3N0cmVhbV9idWZmZXJfZXJyb3IpIHsKKwkJCWVyciA9IE1FX0VSUk5PX1JJTkdfQlVGRkVSX09WRVJGTE9XOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19zdHJlYW1fZW5kOworCQl9IGVsc2UgaWYgKGluc3RhbmNlLT5zdGF0dXMgPT0gYWlfc3RhdHVzX3N0cmVhbV9lbmQpIHsKKwkJCWVyciA9IE1FX0VSUk5PX1NVQkRFVklDRV9OT1RfUlVOTklORzsKKwkJfSBlbHNlIGlmIChpbnN0YW5jZS0+c3RhdHVzID09IGFpX3N0YXR1c19zdHJlYW1fZXJyb3IpIHsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCQl9IGVsc2UgaWYgKGluc3RhbmNlLT5zdGF0dXMgPT0gYWlfc3RhdHVzX25vbmUpIHsKKwkJCVBERUJVRygiU3RyZWFtIGNhbmNlbGVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwkJfQorCX0gZWxzZSB7CisJCSpjb3VudCA9IHJldDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKKy8qKiBAYnJpZWYgU3RvcCBhcXVzYXRpb24uIFByZXNlcnZlIEZJRk9zLgorKgorKiBAcGFyYW0gaW5zdGFuY2UgVGhlIHN1YmRldmljZSBpbnN0YW5jZSAocG9pbnRlcikuCisqLworCitzdGF0aWMgaW50IGFpX3N0b3BfaW1tZWRpYXRlbHkobWU0NjAwX2FpX3N1YmRldmljZV90ICogaW5zdGFuY2UpCit7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3MgPSAwOworCXZvbGF0aWxlIHVpbnQzMl90IGN0cmw7CisJY29uc3QgaW50IHRpbWVvdXQgPSBIWiAvIDEwOwkvLzEwMG1zCisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDw9IHRpbWVvdXQ7IGkrKykgeworCQlzcGluX2xvY2tfaXJxc2F2ZShpbnN0YW5jZS0+Y3RybF9yZWdfbG9jaywgY3B1X2ZsYWdzKTsKKwkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQljdHJsICY9IH5NRTQ2MDBfQUlfQ1RSTF9CSVRfU1RPUDsKKwkJY3RybCB8PQorCQkgICAgKE1FNDYwMF9BSV9DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCB8CisJCSAgICAgTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUV9SRVNFVCB8CisJCSAgICAgTUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUV9SRVNFVCk7CisJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2ssIGNwdV9mbGFncyk7CisKKwkJaWYgKCEoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZTTSkpIHsJLy8gRXhpdC4KKwkJCWJyZWFrOworCQl9CisKKwkJUElORk8oIldhaXQgZm9yIHN0b3A6ICVkXG4iLCBpICsgMSk7CisJCS8vU3RpbGwgd29ya2luZyEKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwl9CisKKwlpZiAoaSA+IHRpbWVvdXQpIHsKKwkJUEVSUk9SX0NSSVRJQ0FMKCJGU00gSVMgQlVTWSFcbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX2lvX3N0cmVhbV9zdGFydChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBzdGFydF9tb2RlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzID0gMDsKKwl1bnNpZ25lZCBsb25nIHJlZjsKKwl1bnNpZ25lZCBsb25nIGRlbGF5ID0gMDsKKworCXZvbGF0aWxlIHVpbnQzMl90IHRtcDsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0wXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICgoc3RhcnRfbW9kZSAhPSBNRV9TVEFSVF9NT0RFX0JMT0NLSU5HKQorCSAgICAmJiAoc3RhcnRfbW9kZSAhPSBNRV9TVEFSVF9NT0RFX05PTkJMT0NLSU5HKSkgeworCQlQRVJST1IoIkludmFsaWQgc3RhcnQgbW9kZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1RBUlRfTU9ERTsKKwl9CisKKwlpZiAodGltZV9vdXQgPCAwKSB7CisJCVBFUlJPUigiSW52YWxpZCB0aW1lb3V0IHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9USU1FT1VUOworCX0KKworCWlmICh0aW1lX291dCkgeworCQlkZWxheSA9ICh0aW1lX291dCAqIEhaKSAvIDEwMDA7CisKKwkJaWYgKGRlbGF5ID09IDApCisJCQlkZWxheSA9IDE7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSCisJICAgIHNwaW5fbG9ja19pcnFzYXZlKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrLCBjcHVfZmxhZ3MpOworCisJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwlpZiAoKHRtcCAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZTTSkpIHsKKwkJUEVSUk9SKCJDb252ZXJzaW9uIGlzIGFscmVhZHkgcnVubmluZy5cbiIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrLCBjcHVfZmxhZ3MpOworCQllcnIgPSBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwkJZ290byBFUlJPUjsKKwl9CisKKwlpZiAoaW5zdGFuY2UtPmNoYW5fbGlzdF9sZW4gPT0gMCkgewkvL05vdCBjb25maWd1cmVkIQorCQlQRVJST1IoIlN1YmRldmljZSBpcyBub3QgY29uZmlndXJlZCB0byB3b3JrIGluIHN0cmVhbSBtb2RlIVxuIik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2ssIGNwdV9mbGFncyk7CisJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwkJZ290byBFUlJPUjsKKwl9CisKKwlpZiAoISh0bXAgJiAoTUU0NjAwX0FJX0NUUkxfQklUX01PREVfMCB8IE1FNDYwMF9BSV9DVFJMX0JJVF9NT0RFXzEgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfTU9ERV8yKSkpIHsJLy9Nb2RlIDAgPSBzaW5nbGUgd29yayA9PiBubyBzdHJlYW0gY29uZmlnCisJCVBFUlJPUigiU3ViZGV2aWNlIGlzIGNvbmZpZ3VyZWQgdG8gd29yayBpbiBzaW5nbGUgbW9kZS5cbiIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrLCBjcHVfZmxhZ3MpOworCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCWdvdG8gRVJST1I7CisJfQorCS8vUmVzZXQgc3RvcCBiaXRzLgorCXRtcCB8PSBNRTQ2MDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfU1RPUDsKKwlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKworCS8vU3RhcnQgZGF0YXMnIEZJRk8uCisJdG1wIHw9IE1FNDYwMF9BSV9DVFJMX0JJVF9EQVRBX0ZJRk87CisJLy9GcmVlIHN0b3AgYml0cy4KKwl0bXAgJj0gfihNRTQ2MDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfU1RPUCk7CisJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpbnN0YW5jZS0+Y3RybF9yZWdfbG9jaywgY3B1X2ZsYWdzKTsKKworCS8vQ2FuY2VsIGNvbnRyb2wgdGFzaworCVBERUJVRygiQ2FuY2VsIGNvbnRyb2wgdGFzay5cbiIpOworCWluc3RhbmNlLT5haV9jb250cm9sX3Rhc2tfZmxhZyA9IDA7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmaW5zdGFuY2UtPmFpX2NvbnRyb2xfdGFzayk7CisKKwkvL1NldCB0aGUgc3RhcnRpbmcgdmFsdWVzLgorCWluc3RhbmNlLT5JU00uZ2xvYmFsX3JlYWQgPSAwOworCWluc3RhbmNlLT5JU00ucmVhZCA9IDA7CisJLy9DbGVhciBjaXJjdWxhciBidWZmZXIKKwlpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCA9IDA7CisJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgPSAwOworCisJLy9TZXQgZXZlcnl0aGluZy4KKwlhaV9kYXRhX2FjcXVpc2l0aW9uX2xvZ2ljKGluc3RhbmNlKTsKKworCS8vU2V0IHN0YXR1cyB0byAnd2FpdCBmb3Igc3RhcnQnCisJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19zdHJlYW1fcnVuX3dhaXQ7CisKKwkvLyBTZXQgY29udHJvbCB0YXNrJ3MgdGltZW91dAorCWluc3RhbmNlLT50aW1lb3V0LmRlbGF5ID0gZGVsYXk7CisJaW5zdGFuY2UtPnRpbWVvdXQuc3RhcnRfdGltZSA9IGppZmZpZXM7CisKKwkvL0xldHMgZ28hIFN0YXJ0IHdvcmsKKwlpbmwoaW5zdGFuY2UtPnN0YXJ0X3JlZyk7CisJUERFQlVHX1JFRygic3RhcnRfcmVnIGlubCgweCVsWCsweCVsWClcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnN0YXJ0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSk7CisKKwkvLyBTY2hlZHVsZSBjb250cm9sIHRhc2sKKwlpbnN0YW5jZS0+YWlfY29udHJvbF90YXNrX2ZsYWcgPSAxOworCXF1ZXVlX2RlbGF5ZWRfd29yayhpbnN0YW5jZS0+bWU0NjAwX3dvcmtxdWV1ZSwKKwkJCSAgICZpbnN0YW5jZS0+YWlfY29udHJvbF90YXNrLCAxKTsKKworCVBERVZFTE9QKCJEZWxheTolbGRcbiIsIGRlbGF5KTsKKworCWlmIChzdGFydF9tb2RlID09IE1FX1NUQVJUX01PREVfQkxPQ0tJTkcpIHsJLy9XYWl0IGZvciBzdGFydC4KKwkJcmVmID0gamlmZmllczsKKwkJLy9Pbmx5IHJ1bmluZyBwcm9jZXNzIHdpbGwgaW50ZXJydXB0IHRoaXMgY2FsbC4gRXZlbnRzIGFyZSBzaWduYWxlZCB3aGVuIHN0YXR1cyBjaGFuZ2UuIEV4dHJhIHRpbWVvdXQgYWRkIGZvciBzYWZlIHJlYXNvbi4KKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaW5zdGFuY2UtPndhaXRfcXVldWUsCisJCQkJCQkgKGluc3RhbmNlLT5zdGF0dXMgIT0KKwkJCQkJCSAgYWlfc3RhdHVzX3N0cmVhbV9ydW5fd2FpdCksCisJCQkJCQkgKGRlbGF5KSA/IGRlbGF5ICsKKwkJCQkJCSAxIDogTE9OR19NQVgpOworCisJCWlmICgoaW5zdGFuY2UtPnN0YXR1cyAhPSBhaV9zdGF0dXNfc3RyZWFtX3J1bikKKwkJICAgICYmIChpbnN0YW5jZS0+c3RhdHVzICE9IGFpX3N0YXR1c19zdHJlYW1fZW5kKSkgeworCQkJUERFQlVHKCJTdGFydGluZyBzdHJlYW0gY2FuY2VsZWQuICVkXG4iLAorCQkJICAgICAgIGluc3RhbmNlLT5zdGF0dXMpOworCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQl9CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlQRVJST1IoIldhaXQgb24gc3RhcnQgb2Ygc3RhdGUgbWFjaGluZSBpbnRlcnJ1cHRlZC5cbiIpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19ub25lOworCQkJYWlfc3RvcF9pc3IoaW5zdGFuY2UpOworCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQl9IGVsc2UgaWYgKChkZWxheSkgJiYgKChqaWZmaWVzIC0gcmVmKSA+IGRlbGF5KSkgeworCQkJaWYgKGluc3RhbmNlLT5zdGF0dXMgIT0gYWlfc3RhdHVzX3N0cmVhbV9ydW4pIHsKKwkJCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBhaV9zdGF0dXNfc3RyZWFtX2VuZCkgeworCQkJCQlQREVCVUcoIlRpbWVvdXQgcmVhY2hlZC5cbiIpOworCQkJCX0gZWxzZSBpZiAoKGppZmZpZXMgLSByZWYpID4gZGVsYXkgKyAxKSB7CisJCQkJCVBFUlJPUgorCQkJCQkgICAgKCJUaW1lb3V0IHJlYWNoZWQuIE5vdCBoYW5kbGVkIGJ5IGNvbnRyb2wgdGFzayFcbiIpOworCQkJCQlhaV9zdG9wX2lzcihpbnN0YW5jZSk7CisJCQkJCWluc3RhbmNlLT5zdGF0dXMgPQorCQkJCQkgICAgYWlfc3RhdHVzX3N0cmVhbV9lcnJvcjsKKwkJCQl9IGVsc2UgeworCQkJCQlQRVJST1IKKwkJCQkJICAgICgiVGltZW91dCByZWFjaGVkLiBTaWduYWwgY29tZSBidXQgc3RhdHVzIGlzIHN0cmFuZ2U6ICVkXG4iLAorCQkJCQkgICAgIGluc3RhbmNlLT5zdGF0dXMpOworCQkJCQlhaV9zdG9wX2lzcihpbnN0YW5jZSk7CisJCQkJCWluc3RhbmNlLT5zdGF0dXMgPQorCQkJCQkgICAgYWlfc3RhdHVzX3N0cmVhbV9lcnJvcjsKKwkJCQl9CisKKwkJCQlpbnN0YW5jZS0+YWlfY29udHJvbF90YXNrX2ZsYWcgPSAwOworCQkJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmluc3RhbmNlLT5haV9jb250cm9sX3Rhc2spOworCQkJCWVyciA9IE1FX0VSUk5PX1RJTUVPVVQ7CisJCQl9CisJCX0KKwl9CisjaWZkZWYgTUVERUJVR19JTkZPCisJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgaW5sKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKworCVBJTkZPKCJTVEFUVVNfQklUX0ZTTT0lcy5cbiIsCisJICAgICAgKHRtcCAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZTTSkgPyAib24iIDogIm9mZiIpOworCVBJTkZPKCJDVFJMX0JJVF9IRl9JUlE9JXMuXG4iLAorCSAgICAgICh0bXAgJiBNRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRKSA/ICJlbmFibGUiIDogImRpc2FibGUiKTsKKwlQSU5GTygiQ1RSTF9CSVRfSEZfSVJRX1JFU0VUPSVzLlxuIiwKKwkgICAgICAodG1wICYgTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUV9SRVNFVCkgPyAicmVzZXQiIDogIndvcmsiKTsKKwlQSU5GTygiQ1RSTF9CSVRfU0NfSVJRPSVzLlxuIiwKKwkgICAgICAodG1wICYgTUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUSkgPyAiZW5hYmxlIiA6ICJkaXNhYmxlIik7CisJUElORk8oIkNUUkxfQklUX1NDX1JFTE9BRD0lcy5cbiIsCisJICAgICAgKHRtcCAmIE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19SRUxPQUQpID8gIm9uIiA6ICJvZmYiKTsKKwlQSU5GTygiQ1RSTF9CSVRfU0NfSVJRX1JFU0VUPSVzLlxuIiwKKwkgICAgICAodG1wICYgTUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUV9SRVNFVCkgPyAicmVzZXQiIDogIndvcmsiKTsKKyNlbmRpZgorCisgICAgICBFUlJPUjoKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX2lvX3N0cmVhbV9zdGF0dXMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCB3YWl0LAorCQkJCSAgICAgIGludCAqc3RhdHVzLCBpbnQgKnZhbHVlcywgaW50IGZsYWdzKQoreworCW1lNDYwMF9haV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9MFxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzd2l0Y2ggKGluc3RhbmNlLT5zdGF0dXMpIHsKKwljYXNlIGFpX3N0YXR1c19zaW5nbGVfY29uZmlndXJlZDoKKwljYXNlIGFpX3N0YXR1c19zdHJlYW1fY29uZmlndXJlZDoKKwljYXNlIGFpX3N0YXR1c19zdHJlYW1fZW5kOgorCWNhc2UgYWlfc3RhdHVzX3N0cmVhbV9maWZvX2Vycm9yOgorCWNhc2UgYWlfc3RhdHVzX3N0cmVhbV9idWZmZXJfZXJyb3I6CisJY2FzZSBhaV9zdGF0dXNfc3RyZWFtX2Vycm9yOgorCQkqc3RhdHVzID0gTUVfU1RBVFVTX0lETEU7CisJCWJyZWFrOworCisJY2FzZSBhaV9zdGF0dXNfc3RyZWFtX3J1bl93YWl0OgorCWNhc2UgYWlfc3RhdHVzX3N0cmVhbV9ydW46CisJY2FzZSBhaV9zdGF0dXNfc3RyZWFtX2VuZF93YWl0OgorCQkqc3RhdHVzID0gTUVfU1RBVFVTX0JVU1k7CisJCWJyZWFrOworCisJY2FzZSBhaV9zdGF0dXNfbm9uZToKKwlkZWZhdWx0OgorCQkqc3RhdHVzID0KKwkJICAgIChpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYgTUU0NjAwX0FJX1NUQVRVU19CSVRfRlNNKSA/CisJCSAgICBNRV9TVEFUVVNfQlVTWSA6IE1FX1NUQVRVU19JRExFOworCQlicmVhazsKKwl9CisKKwlpZiAoKHdhaXQgPT0gTUVfV0FJVF9JRExFKSAmJiAoKnN0YXR1cyA9PSBNRV9TVEFUVVNfQlVTWSkpIHsKKwkJLy8gT25seSBydW5pbmcgcHJvY2VzcyB3aWxsIGludGVycnVwdCB0aGlzIGNhbGwuIEV2ZW50cyBhcmUgc2lnbmFsZWQgd2hlbiBzdGF0dXMgY2hhbmdlLiBFeHRyYSB0aW1lb3V0IGFkZCBmb3Igc2FmZSByZWFzb24uCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJICgoaW5zdGFuY2UtPnN0YXR1cyAhPQorCQkJCQkJICAgYWlfc3RhdHVzX3N0cmVhbV9ydW5fd2FpdCkKKwkJCQkJCSAgJiYgKGluc3RhbmNlLT5zdGF0dXMgIT0KKwkJCQkJCSAgICAgIGFpX3N0YXR1c19zdHJlYW1fcnVuKQorCQkJCQkJICAmJiAoaW5zdGFuY2UtPnN0YXR1cyAhPQorCQkJCQkJICAgICAgYWlfc3RhdHVzX3N0cmVhbV9lbmRfd2FpdCkpLAorCQkJCQkJIExPTkdfTUFYKTsKKworCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyAhPSBhaV9zdGF0dXNfc3RyZWFtX2VuZCkgeworCQkJUERFQlVHKCJXYWl0IGZvciBJRExFIGNhbmNlbGVkLiAlZFxuIiwKKwkJCSAgICAgICBpbnN0YW5jZS0+c3RhdHVzKTsKKwkJCWVyciA9IE1FX0VSUk5PX0NBTkNFTExFRDsKKwkJfQorCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJUEVSUk9SKCJXYWl0IGZvciBJRExFIGludGVycnVwdGVkLlxuIik7CisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYWlfc3RhdHVzX25vbmU7CisJCQlhaV9zdG9wX2lzcihpbnN0YW5jZSk7CisJCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJCX0KKworCQkqc3RhdHVzID0gTUVfU1RBVFVTX0lETEU7CisJfQorCisJKnZhbHVlcyA9IG1lX2NpcmNfYnVmX3ZhbHVlcygmaW5zdGFuY2UtPmNpcmNfYnVmKTsKKwlQREVCVUcoIm1lX2NpcmNfYnVmX3ZhbHVlcygmaW5zdGFuY2UtPmNpcmNfYnVmKT0lZC5cbiIsICp2YWx1ZXMpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9haV9pb19zdHJlYW1fc3RvcChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgc3RvcF9tb2RlLCBpbnQgZmxhZ3MpCit7CisvKioKKyBAbm90ZSBTdG9wIGlzIGltcGxlbWVudGVkIG9ubHkgaW4gYmxvY2tpbmcgbW9kZS4KKyBAbm90ZSBGdW5jdGlvbiByZXR1cm4gd2hlbiBzdGF0ZSBtYWNoaW5lIGlzIHN0b3BlZC4KKyovCisJbWU0NjAwX2FpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwl1aW50MzJfdCBjdHJsOworCWludCByZXQ7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9MFxuIik7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICgoc3RvcF9tb2RlICE9IE1FX1NUT1BfTU9ERV9JTU1FRElBVEUpCisJICAgICYmIChzdG9wX21vZGUgIT0gTUVfU1RPUF9NT0RFX0xBU1RfVkFMVUUpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdG9wIG1vZGUgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NUT1BfTU9ERTsKKwl9CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJLy8gTWFyayBhcyBzdG9wcGluZy4gPT4gU29mdHdhcmUgc3RvcC4KKwlpbnN0YW5jZS0+c3RhdHVzID0gYWlfc3RhdHVzX3N0cmVhbV9lbmRfd2FpdDsKKworCWlmIChzdG9wX21vZGUgPT0gTUVfU1RPUF9NT0RFX0lNTUVESUFURSkgeworCQlyZXQgPSBhaV9zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKworCQlpZiAocmV0KSB7CisJCQlQRVJST1IoIkZTTSBpcyBzdGlsbCBidXN5LlxuIik7CisJCQlNRV9TVUJERVZJQ0VfRVhJVDsKKwkJCXJldHVybiBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwkJfQorCQlpbnN0YW5jZS0+YWlfY29udHJvbF90YXNrX2ZsYWcgPSAwOworCisJfSBlbHNlIGlmIChzdG9wX21vZGUgPT0gTUVfU1RPUF9NT0RFX0xBU1RfVkFMVUUpIHsKKwkJLy8gU2V0IHN0b3AgYml0IGluIHJlZ2lzdHJ5LgorCQlzcGluX2xvY2tfaXJxc2F2ZShpbnN0YW5jZS0+Y3RybF9yZWdfbG9jaywgY3B1X2ZsYWdzKTsKKwkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQljdHJsIHw9IE1FNDYwMF9BSV9DVFJMX0JJVF9TVE9QOworCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrLCBjcHVfZmxhZ3MpOworCisJCS8vIE9ubHkgcnVuaW5nIHByb2Nlc3Mgd2lsbCBpbnRlcnJ1cHQgdGhpcyBjYWxsLiBFdmVudHMgYXJlIHNpZ25hbGVkIHdoZW4gc3RhdHVzIGNoYW5nZS4KKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaW5zdGFuY2UtPndhaXRfcXVldWUsCisJCQkJCQkgKGluc3RhbmNlLT5zdGF0dXMgIT0KKwkJCQkJCSAgYWlfc3RhdHVzX3N0cmVhbV9lbmRfd2FpdCksCisJCQkJCQkgTE9OR19NQVgpOworCisJCWlmIChpbnN0YW5jZS0+c3RhdHVzICE9IGFpX3N0YXR1c19zdHJlYW1fZW5kKSB7CisJCQlQREVCVUcoIlN0b3BwaW5nIHN0cmVhbSBjYW5jZWxlZC5cbiIpOworCQkJcmV0ID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQl9CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlQRVJST1IoIlN0b3BwaW5nIHN0cmVhbSBpbnRlcnJ1cHRlZC5cbiIpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19ub25lOworCQkJcmV0ID0gTUVfRVJSTk9fU0lHTkFMOworCQl9CisJCS8vIEVuZCBvZiB3b3JrLgorCQlhaV9zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKworCX0KKworCXJldCA9IGFpX3JlYWRfZGF0YV9wb29saW5nKGluc3RhbmNlKTsKKwlpZiAocmV0ID4gMCkgewkJLy8gRXZlcnl0aGluZyBmaW5lLiBNb3JlIGRhdGFzIHB1dCB0byBzb2Z0d2FyZSBidWZmZXIuCisJCWluc3RhbmNlLT5zdGF0dXMgPSBhaV9zdGF0dXNfc3RyZWFtX2VuZDsKKwkJcmV0ID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwkJLy8gU2lnbmFsIHRoYXQgd2UgcHV0IGxhc3QgZGF0YSB0byBzb2Z0d2FyZSBidWZmZXIuCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKwl9IGVsc2UgaWYgKHJldCA9PSAwKSB7CS8vIEV2ZXJ5dGhpbmcgZmluZS4gTm8gbW9yZSBkYXRhcyBpbiBGSUZPLgorCQlpbnN0YW5jZS0+c3RhdHVzID0gYWlfc3RhdHVzX3N0cmVhbV9lbmQ7CisJCXJldCA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJfSBlbHNlIGlmIChyZXQgPT0gLU1FX0VSUk5PX1JJTkdfQlVGRkVSX09WRVJGTE9XKSB7CS8vIFN0b3AgaXMgdW5zdWNjZXNzZnVsLCBidWZmZXIgaXMgb3ZlcmZsb3cuCisJCWluc3RhbmNlLT5zdGF0dXMgPSBhaV9zdGF0dXNfc3RyZWFtX2J1ZmZlcl9lcnJvcjsKKwkJcmV0ID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl9IGVsc2UgewkJLy8gU3RvcCBpcyB1bnN1Y2Nlc3NmdWwKKwkJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19zdHJlYW1fZW5kOworCQlyZXQgPSAtcmV0OworCX0KKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYWlfcXVlcnlfcmFuZ2VfYnlfbWluX21heChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgIGludCB1bml0LAorCQkJCQkgICAgaW50ICptaW4sCisJCQkJCSAgICBpbnQgKm1heCwgaW50ICptYXhkYXRhLCBpbnQgKnJhbmdlKQoreworCW1lNDYwMF9haV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGk7CisJaW50IHIgPSAtMTsKKwlpbnQgZGlmZiA9IDIxRTY7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9MFxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKCgqbWF4IC0gKm1pbikgPCAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfTUlOX01BWDsKKwl9CisKKwlpZiAoKHVuaXQgPT0gTUVfVU5JVF9WT0xUKSB8fCAodW5pdCA9PSBNRV9VTklUX0FOWSkpIHsKKwkJZm9yIChpID0gMDsgaSA8IGluc3RhbmNlLT5yYW5nZXNfbGVuOyBpKyspIHsKKwkJCWlmICgoaW5zdGFuY2UtPnJhbmdlc1tpXS5taW4gPD0gKm1pbikKKwkJCSAgICAmJiAoKGluc3RhbmNlLT5yYW5nZXNbaV0ubWF4ICsgMTAwMCkgPj0gKm1heCkpIHsKKwkJCQlpZiAoKGluc3RhbmNlLT5yYW5nZXNbaV0ubWF4IC0KKwkJCQkgICAgIGluc3RhbmNlLT5yYW5nZXNbaV0ubWluKSAtICgqbWF4IC0gKm1pbikgPAorCQkJCSAgICBkaWZmKSB7CisJCQkJCXIgPSBpOworCQkJCQlkaWZmID0KKwkJCQkJICAgIChpbnN0YW5jZS0+cmFuZ2VzW2ldLm1heCAtCisJCQkJCSAgICAgaW5zdGFuY2UtPnJhbmdlc1tpXS5taW4pIC0gKCptYXggLQorCQkJCQkJCQkJICptaW4pOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChyIDwgMCkgeworCQkJUEVSUk9SKCJObyBtYXRjaGluZyByYW5nZSBmb3VuZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX05PX1JBTkdFOworCQl9IGVsc2UgeworCQkJKm1pbiA9IGluc3RhbmNlLT5yYW5nZXNbcl0ubWluOworCQkJKm1heCA9IGluc3RhbmNlLT5yYW5nZXNbcl0ubWF4OworCQkJKm1heGRhdGEgPSBNRTQ2MDBfQUlfTUFYX0RBVEE7CisJCQkqcmFuZ2UgPSByOworCQl9CisJfSBlbHNlIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHBoeXNpY2FsIHVuaXQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1VOSVQ7CisJfQorCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX3F1ZXJ5X251bWJlcl9yYW5nZXMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSBpbnQgdW5pdCwgaW50ICpjb3VudCkKK3sKKwltZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PTBcbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmICgodW5pdCA9PSBNRV9VTklUX1ZPTFQpIHx8ICh1bml0ID09IE1FX1VOSVRfQU5ZKSkgeworCQkqY291bnQgPSBpbnN0YW5jZS0+cmFuZ2VzX2xlbjsKKwl9IGVsc2UgeworCQkqY291bnQgPSAwOworCX0KKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9haV9xdWVyeV9yYW5nZV9pbmZvKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIGludCByYW5nZSwKKwkJCQkgICAgICBpbnQgKnVuaXQsCisJCQkJICAgICAgaW50ICptaW4sIGludCAqbWF4LCBpbnQgKm1heGRhdGEpCit7CisJbWU0NjAwX2FpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0wXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoKHJhbmdlIDwgaW5zdGFuY2UtPnJhbmdlc19sZW4pICYmIChyYW5nZSA+PSAwKSkgeworCQkqdW5pdCA9IE1FX1VOSVRfVk9MVDsKKwkJKm1pbiA9IGluc3RhbmNlLT5yYW5nZXNbcmFuZ2VdLm1pbjsKKwkJKm1heCA9IGluc3RhbmNlLT5yYW5nZXNbcmFuZ2VdLm1heDsKKwkJKm1heGRhdGEgPSBNRTQ2MDBfQUlfTUFYX0RBVEE7CisJfSBlbHNlIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHJhbmdlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfUkFOR0U7CisJfQorCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX3F1ZXJ5X3RpbWVyKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSBpbnQgdGltZXIsCisJCQkJIGludCAqYmFzZV9mcmVxdWVuY3ksCisJCQkJIGxvbmcgbG9uZyAqbWluX3RpY2tzLCBsb25nIGxvbmcgKm1heF90aWNrcykKK3sKKwltZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PTBcbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCXN3aXRjaCAodGltZXIpIHsKKworCWNhc2UgTUVfVElNRVJfQUNRX1NUQVJUOgorCQkqYmFzZV9mcmVxdWVuY3kgPSBNRTQ2MDBfQUlfQkFTRV9GUkVRVUVOQ1k7CisJCSptaW5fdGlja3MgPSBNRTQ2MDBfQUlfTUlOX0FDUV9USUNLUzsKKwkJKm1heF90aWNrcyA9IE1FNDYwMF9BSV9NQVhfQUNRX1RJQ0tTOworCQlicmVhazsKKworCWNhc2UgTUVfVElNRVJfU0NBTl9TVEFSVDoKKwkJKmJhc2VfZnJlcXVlbmN5ID0gTUU0NjAwX0FJX0JBU0VfRlJFUVVFTkNZOworCQkqbWluX3RpY2tzID0gTUU0NjAwX0FJX01JTl9TQ0FOX1RJQ0tTOworCQkqbWF4X3RpY2tzID0gTUU0NjAwX0FJX01BWF9TQ0FOX1RJQ0tTOworCQlicmVhazsKKworCWNhc2UgTUVfVElNRVJfQ09OVl9TVEFSVDoKKwkJKmJhc2VfZnJlcXVlbmN5ID0gTUU0NjAwX0FJX0JBU0VfRlJFUVVFTkNZOworCQkqbWluX3RpY2tzID0gTUU0NjAwX0FJX01JTl9DSEFOX1RJQ0tTOworCQkqbWF4X3RpY2tzID0gTUU0NjAwX0FJX01BWF9DSEFOX1RJQ0tTOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCB0aW1lciBzcGVjaWZpZWQuKDB4JTA0eClcbiIsIHRpbWVyKTsKKworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9USU1FUjsKKwl9CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYWlfcXVlcnlfbnVtYmVyX2NoYW5uZWxzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgKm51bWJlcikKK3sKKwltZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PTBcbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKwkqbnVtYmVyID0gaW5zdGFuY2UtPmNoYW5uZWxzOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKQoreworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0wXG4iKTsKKworCSp0eXBlID0gTUVfVFlQRV9BSTsKKwkqc3VidHlwZSA9IE1FX1NVQlRZUEVfU1RSRUFNSU5HOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX3F1ZXJ5X3N1YmRldmljZV9jYXBzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLCBpbnQgKmNhcHMpCit7CisJUERFQlVHKCJleGVjdXRlZC4gaWR4PTBcbiIpOworCisJKmNhcHMgPQorCSAgICBNRV9DQVBTX0FJX1RSSUdfU1lOQ0hST05PVVMgfCBNRV9DQVBTX0FJX0ZJRk8gfAorCSAgICBNRV9DQVBTX0FJX0ZJRk9fVEhSRVNIT0xEOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FpX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3Moc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgICAgICAgaW50IGNhcCwgaW50ICphcmdzLCBpbnQgY291bnQpCit7CisJbWU0NjAwX2FpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCWluc3RhbmNlID0gKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9MFxuIik7CisKKwlpZiAoY291bnQgIT0gMSkgeworCQlQRVJST1IoIkludmFsaWQgY2FwYWJpbGl0eSBhcmd1bWVudCBjb3VudC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DQVBfQVJHX0NPVU5UOworCX0KKworCXN3aXRjaCAoY2FwKSB7CisJY2FzZSBNRV9DQVBfQUlfRklGT19TSVpFOgorCQlhcmdzWzBdID0gTUU0NjAwX0FJX0ZJRk9fQ09VTlQ7CisJCWJyZWFrOworCisJY2FzZSBNRV9DQVBfQUlfQlVGRkVSX1NJWkU6CisJCWFyZ3NbMF0gPQorCQkgICAgKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYpID8gTUU0NjAwX0FJX0NJUkNfQlVGX0NPVU5UIDogMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgY2FwYWJpbGl0eS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NBUDsKKwkJYXJnc1swXSA9IDA7CisJfQorCisJcmV0dXJuIGVycjsKK30KKwordm9pZCBhaV9saW1pdGVkX2lzcihtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgY29uc3QgdWludDMyX3QgaXJxX3N0YXR1cywKKwkJICAgIGNvbnN0IHVpbnQzMl90IGN0cmxfc3RhdHVzKQoreworCWludCB0b19yZWFkOworCisJaWYgKCFpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkKSB7CS8vTm8gdGhyZXNob2xkIHByb3ZpZGVkLiBTQyBlbmRzIHdvcmsuIEhGIG5lZWQgcmVzZXRpbmcuCisJCWlmIChpcnFfc3RhdHVzICYgTUU0NjAwX0lSUV9TVEFUVVNfQklUX1NDKSB7CisJCQlpZiAoYWlfcmVhZF9kYXRhKGluc3RhbmNlLCBpbnN0YW5jZS0+SVNNLm5leHQpICE9IGluc3RhbmNlLT5JU00ubmV4dCkgewkvL0VSUk9SIQorCQkJCVBFUlJPUgorCQkJCSAgICAoIkxpbWl0ZWQgYW1vdW50cyBhcXVzaXRpb24gd2l0aCBUSD0wOiBDaXJjdWxhciBidWZmZXIgZnVsbCFcbiIpOworCQkJCWluc3RhbmNlLT5zdGF0dXMgPQorCQkJCSAgICBhaV9zdGF0dXNfc3RyZWFtX2J1ZmZlcl9lcnJvcjsKKwkJCX0gZWxzZSB7CisJCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19zdHJlYW1fZW5kOworCQkJfQorCQkJLy9FbmQgb2Ygd29yay4KKwkJCWFpX3N0b3BfaXNyKGluc3RhbmNlKTsKKwkJfSBlbHNlIGlmIChpcnFfc3RhdHVzICYgTUU0NjAwX0lSUV9TVEFUVVNfQklUX0FJX0hGKSB7CisJCQlpbnN0YW5jZS0+SVNNLmdsb2JhbF9yZWFkICs9IE1FNDYwMF9BSV9GSUZPX0hBTEY7CisKKwkJCWlmIChhaV9yZWFkX2RhdGEoaW5zdGFuY2UsIE1FNDYwMF9BSV9GSUZPX0hBTEYpICE9IE1FNDYwMF9BSV9GSUZPX0hBTEYpIHsJLy9FUlJPUiEKKwkJCQlQRVJST1IKKwkJCQkgICAgKCJMaW1pdGVkIGFtb3VudHMgYXF1c2l0aW9uIHdpdGggVEggPSAwOiBDaXJjdWxhciBidWZmZXIgZnVsbCFcbiIpOworCQkJCS8vRW5kIG9mIHdvcmsuCisJCQkJYWlfc3RvcF9pc3IoaW5zdGFuY2UpOworCQkJCWluc3RhbmNlLT5zdGF0dXMgPQorCQkJCSAgICBhaV9zdGF0dXNfc3RyZWFtX2J1ZmZlcl9lcnJvcjsKKwkJCX0gZWxzZSB7CisJCQkJLy9Db250aW51ZS4KKwkJCQlhaV9saW1pdGVkX0lTTShpbnN0YW5jZSwgaXJxX3N0YXR1cyk7CisJCQl9CisJCX0KKwkJLy9TaWduYWwgdXNlci4KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCX0gZWxzZQkJCS8vaWYoaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZCkKKwl7CisJCWlmIChpcnFfc3RhdHVzICYgTUU0NjAwX0lSUV9TVEFUVVNfQklUX1NDKSB7CisJCQlpbnN0YW5jZS0+SVNNLnJlYWQgPSAwOworCQkJaWYgKChpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkIDwgTUU0NjAwX0FJX0ZJRk9fSEFMRikKKwkJCSAgICAmJiAoIShjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0hGX0RBVEEpKSkKKwkJCXsKKwkJCQl0b19yZWFkID0KKwkJCQkgICAgTUU0NjAwX0FJX0ZJRk9fSEFMRiAtCisJCQkJICAgIChNRTQ2MDBfQUlfRklGT19IQUxGICUKKwkJCQkgICAgIGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQpOworCQkJCVBERUJVRworCQkJCSAgICAoIkxpbWl0ZWQgYW1vdW50cyBhcXVzaXRpb24gd2l0aCBUSCAhPSAwOiBOb3QgZmFzdCBlbm91Z2ggZGF0YSBhcXVzaXRpb24hIGNvcnJlY3Rpb249JWRcbiIsCisJCQkJICAgICB0b19yZWFkKTsKKwkJCX0gZWxzZSB7CisJCQkJdG9fcmVhZCA9IGluc3RhbmNlLT5JU00ubmV4dDsKKwkJCX0KKwkJCWluc3RhbmNlLT5JU00uZ2xvYmFsX3JlYWQgKz0gdG9fcmVhZDsKKworCQkJYWlfcmVzY2hlZHVsZV9TQyhpbnN0YW5jZSk7CisKKwkJCWlmIChhaV9yZWFkX2RhdGEoaW5zdGFuY2UsIHRvX3JlYWQpICE9IHRvX3JlYWQpIHsJLy9FUlJPUiEKKwkJCQlQRVJST1IKKwkJCQkgICAgKCJMaW1pdGVkIGFtb3VudHMgYXF1c2l0aW9uIHdpdGggVEggIT0gMDogQ2lyY3VsYXIgYnVmZmVyIGZ1bGwhXG4iKTsKKwkJCQkvL0VuZCBvZiB3b3JrLgorCQkJCWFpX3N0b3BfaXNyKGluc3RhbmNlKTsKKwkJCQlpbnN0YW5jZS0+c3RhdHVzID0KKwkJCQkgICAgYWlfc3RhdHVzX3N0cmVhbV9idWZmZXJfZXJyb3I7CisJCQl9IGVsc2UgeworCQkJCS8vQ29udGludWUuCisJCQkJYWlfbGltaXRlZF9JU00oaW5zdGFuY2UsIGlycV9zdGF0dXMpOworCQkJfQorCisJCQkvL1NpZ25hbCB1c2VyLgorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCQl9IGVsc2UgaWYgKGlycV9zdGF0dXMgJiBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfQUlfSEYpIHsKKwkJCWluc3RhbmNlLT5JU00ucmVhZCArPSBNRTQ2MDBfQUlfRklGT19IQUxGOworCQkJaW5zdGFuY2UtPklTTS5nbG9iYWxfcmVhZCArPSBNRTQ2MDBfQUlfRklGT19IQUxGOworCisJCQlpZiAoYWlfcmVhZF9kYXRhKGluc3RhbmNlLCBNRTQ2MDBfQUlfRklGT19IQUxGKSAhPSBNRTQ2MDBfQUlfRklGT19IQUxGKSB7CS8vRVJST1IhCisJCQkJUEVSUk9SCisJCQkJICAgICgiTGltaXRlZCBhbW91bnRzIGFxdXNpdGlvbiB3aXRoIFRIICE9IDA6IENpcmN1bGFyIGJ1ZmZlciBmdWxsIVxuIik7CisJCQkJYWlfc3RvcF9pc3IoaW5zdGFuY2UpOworCisJCQkJaW5zdGFuY2UtPnN0YXR1cyA9CisJCQkJICAgIGFpX3N0YXR1c19zdHJlYW1fYnVmZmVyX2Vycm9yOworCQkJCS8vU2lnbmFsIHVzZXIuCisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPgorCQkJCQkJCSAgd2FpdF9xdWV1ZSk7CisJCQl9IGVsc2UgeworCQkJCS8vQ291bnRpbnVlLgorCQkJCWFpX2xpbWl0ZWRfSVNNKGluc3RhbmNlLCBpcnFfc3RhdHVzKTsKKwkJCX0KKwkJfQorCisJCWlmIChpbnN0YW5jZS0+SVNNLmdsb2JhbF9yZWFkID49IGluc3RhbmNlLT5kYXRhX3JlcXVpcmVkKSB7CS8vRW5kIG9mIHdvcmsuIE5leHQgcGFyYW5vaWQgcGljZSBvZiBjb2RlOiAnPj0nIGluc3RlYWQgb2QgJz09JyBvbmx5IHRvIGJlIHN1cmUuCisJCQlhaV9zdG9wX2lzcihpbnN0YW5jZSk7CisJCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyA8IGFpX3N0YXR1c19zdHJlYW1fZW5kKSB7CisJCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19zdHJlYW1fZW5kOworCQkJfQorI2lmZGVmIE1FREVCVUdfRVJST1IKKwkJCWlmIChpbnN0YW5jZS0+SVNNLmdsb2JhbF9yZWFkID4gaW5zdGFuY2UtPmRhdGFfcmVxdWlyZWQpIHsJLy9UaGlzIGlzIHNlY3VyaXR5IGNoZWNrIGNhc2UuIFRoaXMgc2hvdWxkIG5ldmVyIGV2ZXIgaGFwcGVuZCEKKwkJCQlQRVJST1IKKwkJCQkgICAgKCJMaW1pdGVkIGFtb3VudHMgYXF1c2l0aW9uOiBSZWFkIG1vcmUgZGF0YSB0aGFuIG5lY2Vzc2FyeSEgZGF0YV9yZXF1aXJlZD0lZCA8IHJlYWQ9JWRcbiIsCisJCQkJICAgICBpbnN0YW5jZS0+ZGF0YV9yZXF1aXJlZCwKKwkJCQkgICAgIGluc3RhbmNlLT5JU00uZ2xvYmFsX3JlYWQpOworCQkJCS8vU2lnbmFsIGVycm9yICh3YXJuaW5nPz8pLgorCQkJCWluc3RhbmNlLT5zdGF0dXMgPSBhaV9zdGF0dXNfc3RyZWFtX2Vycm9yOworCQkJfQorI2VuZGlmCisJCX0KKwl9Cit9CisKK3ZvaWQgYWlfaW5maW5pdGVfaXNyKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqIGluc3RhbmNlLAorCQkgICAgIGNvbnN0IHVpbnQzMl90IGlycV9zdGF0dXMsIGNvbnN0IHVpbnQzMl90IGN0cmxfc3RhdHVzKQoreworCWludCB0b19yZWFkOworCisJaWYgKGlycV9zdGF0dXMgJiBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfU0MpIHsJLy9uZXh0IGNodW5jayBvZiBkYXRhIC0+IHJlYWQgZmlmbworCQkvL1NldCBuZXcgc3RhdGUgaW4gSVNNLgorCQlpZiAoKGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQgPCBNRTQ2MDBfQUlfRklGT19IQUxGKSAmJiAoIShjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0hGX0RBVEEpKSkgewkvL1RoZXJlIGlzIG1vcmUgZGF0YSB0aGFuIHdlIGVjcGVjdGVkLiBQcm9wYWJseSB3ZSBhcmVuJ3QgZmFzdCBlbm91Z2guIFJlYWQgYXMgbWFueSBhcyBwb3NzaWJsZS4KKwkJCWlmIChpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkKSB7CisJCQkJdG9fcmVhZCA9CisJCQkJICAgIE1FNDYwMF9BSV9GSUZPX0hBTEYgLQorCQkJCSAgICAoTUU0NjAwX0FJX0ZJRk9fSEFMRiAlCisJCQkJICAgICBpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkKTsKKwkJCQlpZiAodG9fcmVhZCA+IGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQpIHsKKwkJCQkJUERFQlVHCisJCQkJCSAgICAoIkluZmluaXRlIGFxdXNpdGlvbjogTm90IGZhc3QgZW5vdWdoIGRhdGEgYXF1c2l0aW9uISBUSCAhPSAwOiBjb3JyZWN0aW9uPSVkXG4iLAorCQkJCQkgICAgIHRvX3JlYWQpOworCQkJCX0KKwkJCX0gZWxzZSB7CS8vTm8gdGhyZXNob2xkIHNwZWNpZmllZC4KKwkJCQl0b19yZWFkID0gTUU0NjAwX0FJX0ZJRk9fSEFMRjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXRvX3JlYWQgPSBpbnN0YW5jZS0+SVNNLm5leHQ7CisJCX0KKworCQlpbnN0YW5jZS0+SVNNLnJlYWQgKz0gdG9fcmVhZDsKKworCQkvL0dldCBkYXRhCisJCWlmIChhaV9yZWFkX2RhdGEoaW5zdGFuY2UsIHRvX3JlYWQpICE9IHRvX3JlYWQpIHsJLy9FUlJPUiEKKwkJCVBFUlJPUigiSW5maW5pdGUgYXF1c2l0aW9uOiBDaXJjdWxhciBidWZmZXIgZnVsbCFcbiIpOworCQkJYWlfc3RvcF9pc3IoaW5zdGFuY2UpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19zdHJlYW1fYnVmZmVyX2Vycm9yOworCQl9IGVsc2UgeworCQkJYWlfaW5maW5pdGVfSVNNKGluc3RhbmNlKTsKKwkJCWluc3RhbmNlLT5JU00uZ2xvYmFsX3JlYWQgKz0gaW5zdGFuY2UtPklTTS5yZWFkOworCQkJaW5zdGFuY2UtPklTTS5yZWFkID0gMDsKKwkJfQorCisJCS8vU2lnbmFsIGRhdGEgdG8gdXNlcgorCQl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisJfSBlbHNlIGlmIChpcnFfc3RhdHVzICYgTUU0NjAwX0lSUV9TVEFUVVNfQklUX0FJX0hGKSB7CS8vZmlmbyBpcyBoYWxmIGZ1bGwgLT4gcmVhZCBmaWZvICAgICAgIExhcmdlIGJsb2NrcyBvbmx5IQorCQlpbnN0YW5jZS0+SVNNLnJlYWQgKz0gTUU0NjAwX0FJX0ZJRk9fSEFMRjsKKworCQlpZiAoYWlfcmVhZF9kYXRhKGluc3RhbmNlLCBNRTQ2MDBfQUlfRklGT19IQUxGKSAhPSBNRTQ2MDBfQUlfRklGT19IQUxGKSB7CS8vRVJST1IhCisJCQlQRVJST1IoIkluZmluaXRlIGFxdXNpdGlvbjogQ2lyY3VsYXIgYnVmZmVyIGZ1bGwhXG4iKTsKKwkJCWFpX3N0b3BfaXNyKGluc3RhbmNlKTsKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhaV9zdGF0dXNfc3RyZWFtX2J1ZmZlcl9lcnJvcjsKKworCQkJLy9TaWduYWwgaXQuCisJCQl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisJCX0gZWxzZSB7CisJCQlhaV9pbmZpbml0ZV9JU00oaW5zdGFuY2UpOworCQl9CisJfQorfQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDE5KQorc3RhdGljIGlycXJldHVybl90IG1lNDYwMF9haV9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQorI2Vsc2UKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTQ2MDBfYWlfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCisjZW5kaWYKK3sJCQkJLy8vIEBub3RlIFRoaXMgaXMgdGltZSBjcml0aWNhbCBmdW5jdGlvbiEKKwl1aW50MzJfdCBpcnFfc3RhdHVzOworCXVpbnQzMl90IGN0cmxfc3RhdHVzOworCW1lNDYwMF9haV9zdWJkZXZpY2VfdCAqaW5zdGFuY2UgPSBkZXZfaWQ7CisJLy9pbnQgdG9fcmVhZDsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0wXG4iKTsKKworCWlmIChpcnEgIT0gaW5zdGFuY2UtPmlycSkgeworCQlQRVJST1IoIkluY29ycmVjdCBpbnRlcnJ1cHQgbnVtOiAlZC5cbiIsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpcnFfc3RhdHVzID0gaW5sKGluc3RhbmNlLT5pcnFfc3RhdHVzX3JlZyk7CisJaWYgKCEKKwkgICAgKGlycV9zdGF0dXMgJgorCSAgICAgKE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9BSV9IRiB8IE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9TQykpKSB7CisjaWZkZWYgTUVERUJVR19JTkZPCisJCWlmICgoaXJxX3N0YXR1cyAmIChNRTQ2MDBfSVJRX1NUQVRVU19CSVRfQUlfSEYgfCBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfU0MgfCBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfTEUpKSA9PSBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfTEUpIHsJLy9UaGlzIGlzIHNlY3VyaXR5IGNoZWNrIGNhc2UuIExFIGlzIHVudXNlZC4gVGhpcyBzaG91bGQgbmV2ZXIgZXZlciBoYXBwZW5kLgorCQkJUElORk8KKwkJCSAgICAoIiVsZCBTaGFyZWQgaW50ZXJydXB0LiAlcygpOiBpcnFfc3RhdHVzX3JlZz1MRV9JUlFcbiIsCisJCQkgICAgIGppZmZpZXMsIF9fZnVuY19fKTsKKwkJfSBlbHNlIHsKKwkJCVBJTkZPCisJCQkgICAgKCIlbGQgU2hhcmVkIGludGVycnVwdC4gJXMoKTogaXJxX3N0YXR1c19yZWc9MHglMDRYXG4iLAorCQkJICAgICBqaWZmaWVzLCBfX2Z1bmNfXywgaXJxX3N0YXR1cyk7CisJCX0KKyNlbmRpZgorCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJaWYgKCFpbnN0YW5jZS0+Y2lyY19idWYuYnVmKSB7CS8vU2VjdXJpdHkgY2hlY2suCisJCVBFUlJPUl9DUklUSUNBTCgiQ0lSQ1VMQVIgQlVGRkVSIE5PVCBFWElTVFMhXG4iKTsKKwkJYWlfc3RvcF9pc3IoaW5zdGFuY2UpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCS8vR2V0IHRoZSBzdGF0dXMgcmVnaXN0ZXIuCisJY3RybF9zdGF0dXMgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpOworCisjaWZkZWYgTUVERUJVR19JTkZPCisJaWYgKGlycV9zdGF0dXMgJiBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfQUlfSEYpCisJCVBJTkZPKCJIRiBpbnRlcnJ1cHQgYWN0aXZlXG4iKTsKKwlpZiAoaXJxX3N0YXR1cyAmIE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9TQykKKwkJUElORk8oIlNDIGludGVycnVwdCBhY3RpdmVcbiIpOworCWlmIChpcnFfc3RhdHVzICYgTUU0NjAwX0lSUV9TVEFUVVNfQklUX0xFKQorCQlQSU5GTygiTEUgaW50ZXJydXB0IGFjdGl2ZVxuIik7CisjZW5kaWYKKworCS8vVGhpcyBpcyBzYWZldHkgY2hlY2shCisJaWYgKChpcnFfc3RhdHVzICYgTUU0NjAwX0lSUV9TVEFUVVNfQklUX0FJX0hGKQorCSAgICAmJiAoY3RybF9zdGF0dXMgJiBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9IRl9EQVRBKSkgeworCQlQREVCVUcoIkhGIGludGVycnVwdCBhY3RpdmUgYnV0IEZJRk8gdW5kZXIgaGFsZlxuIik7CisJCS8vUmVzZXQgSEYgaW50ZXJydXB0IGxhdGNoLgorCQlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCQlvdXRsKGN0cmxfc3RhdHVzIHwgTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUV9SRVNFVCwKKwkJICAgICBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgY3RybF9zdGF0dXMpOworCQlvdXRsKGN0cmxfc3RhdHVzLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgY3RybF9zdGF0dXMpOworCQlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisjaWZkZWYgTUVERUJVR19JTkZPCisJUElORk8oIlNUQVRVU19CSVRfRlNNPSVzLlxuIiwKKwkgICAgICAoY3RybF9zdGF0dXMgJiBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9GU00pID8gIm9uIiA6ICJvZmYiKTsKKworCVBJTkZPKCJTVEFUVVNfQklUX0VGX0NIQU5ORUw9JXMuXG4iLAorCSAgICAgIChjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0VGX0NIQU5ORUwpID8gIm5vdCBlbXB0eSIgOgorCSAgICAgICJlbXB0eSIpOworCVBJTkZPKCJTVEFUVVNfQklUX0hGX0NIQU5ORUw9JXMuXG4iLAorCSAgICAgIChjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0hGX0NIQU5ORUwpID8gIiA8IEhGIiA6CisJICAgICAgIiA+IEhGIik7CisJUElORk8oIlNUQVRVU19CSVRfRkZfQ0hBTk5FTD0lcy5cbiIsCisJICAgICAgKGN0cmxfc3RhdHVzICYgTUU0NjAwX0FJX1NUQVRVU19CSVRfRkZfQ0hBTk5FTCkgPyAibm90IGZ1bGwiIDoKKwkgICAgICAiZnVsbCIpOworCisJUElORk8oIlNUQVRVU19CSVRfRUZfREFUQT0lcy5cbiIsCisJICAgICAgKGN0cmxfc3RhdHVzICYgTUU0NjAwX0FJX1NUQVRVU19CSVRfRUZfREFUQSkgPyAibm90IGVtcHR5IiA6CisJICAgICAgImVtcHR5Iik7CisJUElORk8oIlNUQVRVU19CSVRfSEZfREFUQT0lcy5cbiIsCisJICAgICAgKGN0cmxfc3RhdHVzICYgTUU0NjAwX0FJX1NUQVRVU19CSVRfSEZfREFUQSkgPyAiIDwgSEYiIDogIiA+IEhGIik7CisJUElORk8oIlNUQVRVU19CSVRfRkZfREFUQT0lcy5cbiIsCisJICAgICAgKGN0cmxfc3RhdHVzICYgTUU0NjAwX0FJX1NUQVRVU19CSVRfRkZfREFUQSkgPyAibm90IGZ1bGwiIDoKKwkgICAgICAiZnVsbCIpOworCisJUElORk8oIkNUUkxfQklUX0hGX0lSUT0lcy5cbiIsCisJICAgICAgKGN0cmxfc3RhdHVzICYgTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUSkgPyAiZW5hYmxlIiA6ICJkaXNhYmxlIik7CisJUElORk8oIkNUUkxfQklUX0hGX0lSUV9SRVNFVD0lcy5cbiIsCisJICAgICAgKGN0cmxfc3RhdHVzICYgTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUV9SRVNFVCkgPyAicmVzZXQiIDoKKwkgICAgICAid29yayIpOworCVBJTkZPKCJDVFJMX0JJVF9TQ19JUlE9JXMuXG4iLAorCSAgICAgIChjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19JUlEpID8gImVuYWJsZSIgOiAiZGlzYWJsZSIpOworCVBJTkZPKCJDVFJMX0JJVF9TQ19SRUxPQUQ9JXMuXG4iLAorCSAgICAgIChjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19SRUxPQUQpID8gIm9uIiA6ICJvZmYiKTsKKwlQSU5GTygiQ1RSTF9CSVRfU0NfSVJRX1JFU0VUPSVzLlxuIiwKKwkgICAgICAoY3RybF9zdGF0dXMgJiBNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRX1JFU0VUKSA/ICJyZXNldCIgOgorCSAgICAgICJ3b3JrIik7CisjZW5kaWYKKworCS8vTG9vayBmb3Igb3ZlcmZsb3cgZXJyb3IuCisJaWYgKCEoY3RybF9zdGF0dXMgJiBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9GRl9EQVRBKSkgeworCQkvL0ZJRk8gaXMgZnVsbC4gUmVhZCBkYXRhcyBhbmQgcmVzZXQgYWxsIHNldHRpbmdzLgorCQlQRVJST1IoIkZJRk8gb3ZlcmZsb3cuXG4iKTsKKwkJYWlfcmVhZF9kYXRhKGluc3RhbmNlLCBNRTQ2MDBfQUlfRklGT19DT1VOVCk7CisJCWFpX3N0b3BfaXNyKGluc3RhbmNlKTsKKworCQlpbnN0YW5jZS0+c3RhdHVzID0gYWlfc3RhdHVzX3N0cmVhbV9maWZvX2Vycm9yOworCQkvL1NpZ25hbCBpdC4KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlpZiAoIWluc3RhbmNlLT5kYXRhX3JlcXVpcmVkKSB7CS8vVGhpcyBpcyBpbmZpbml0ZSBhcXVzaXRpb24uCisjaWZkZWYgTUVERUJVR19FUlJPUgorCQlpZiAoKGlycV9zdGF0dXMgJgorCQkgICAgIChNRTQ2MDBfSVJRX1NUQVRVU19CSVRfQUlfSEYgfCBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfU0MpKQorCQkgICAgPT0KKwkJICAgIChNRTQ2MDBfSVJRX1NUQVRVU19CSVRfQUlfSEYgfCBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfU0MpKSB7CisJCQkvLy9JbiBpbmZpbml0ZSBtb2RlIG9ubHkgb25lIGludGVycnVwdCBzb3VyY2Ugc2hvdWxkIGJlIHJlcG9ydGVkIQorCQkJUEVSUk9SCisJCQkgICAgKCJFcnJvciBpbiBJU00hIEluZmluaXRlIGFxdXNpdGlvbjogSEYgYW5kIFNDIGludGVycnVwdHMgYWN0aXZlISB0aHJlc2hvbGQ9JWQgbmV4dD0lZCBjdHJsPTB4JTA0WCBpcnFfc3RhdHVzX3JlZz0weCUwNFgiLAorCQkJICAgICBpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkLCBpbnN0YW5jZS0+SVNNLm5leHQsCisJCQkgICAgIGN0cmxfc3RhdHVzLCBpcnFfc3RhdHVzKTsKKwkJfQorI2VuZGlmCisKKwkJYWlfaW5maW5pdGVfaXNyKGluc3RhbmNlLCBpcnFfc3RhdHVzLCBjdHJsX3N0YXR1cyk7CisKKyNpZmRlZiBNRURFQlVHX0lORk8KKwkJY3RybF9zdGF0dXMgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKyNlbmRpZgorCX0gZWxzZSB7CisKKwkJYWlfbGltaXRlZF9pc3IoaW5zdGFuY2UsIGlycV9zdGF0dXMsIGN0cmxfc3RhdHVzKTsKKwkJY3RybF9zdGF0dXMgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpOworCQlpZiAoIShjdHJsX3N0YXR1cyAmIChNRTQ2MDBfQUlfU1RBVFVTX0JJVF9IRl9EQVRBIHwgTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUV9SRVNFVCkpKSB7CS8vSEYgYWN0aXZlLCBidXQgd2UgaGF2ZSBtb3JlIHRoYW4gaGFsZiBhbHJlYWR5ID0+IEhGIHdpbGwgbmV2ZXIgY29tZQorCQkJUERFQlVHCisJCQkgICAgKCJNSVNTRUQgSEYuIGRhdGFfcmVxdWlyZWQ9JWQgSVNNLnJlYWQ9JWQgSVNNLmdsb2JhbD0lZCBJU00ubmV4dD0lZFxuIiwKKwkJCSAgICAgaW5zdGFuY2UtPmRhdGFfcmVxdWlyZWQsIGluc3RhbmNlLT5JU00ucmVhZCwKKwkJCSAgICAgaW5zdGFuY2UtPklTTS5nbG9iYWxfcmVhZCwgaW5zdGFuY2UtPklTTS5uZXh0KTsKKwkJCWFpX2xpbWl0ZWRfaXNyKGluc3RhbmNlLCBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfQUlfSEYsCisJCQkJICAgICAgIGN0cmxfc3RhdHVzKTsKKwkJfQorCX0KKworI2lmZGVmIE1FREVCVUdfSU5GTworCVBJTkZPKCJTVEFUVVNfQklUX0ZTTT0lcy5cbiIsCisJICAgICAgKGN0cmxfc3RhdHVzICYgTUU0NjAwX0FJX1NUQVRVU19CSVRfRlNNKSA/ICJvbiIgOiAib2ZmIik7CisKKwlQSU5GTygiU1RBVFVTX0JJVF9FRl9DSEFOTkVMPSVzLlxuIiwKKwkgICAgICAoY3RybF9zdGF0dXMgJiBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9FRl9DSEFOTkVMKSA/ICJub3QgZW1wdHkiIDoKKwkgICAgICAiZW1wdHkiKTsKKwlQSU5GTygiU1RBVFVTX0JJVF9IRl9DSEFOTkVMPSVzLlxuIiwKKwkgICAgICAoY3RybF9zdGF0dXMgJiBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9IRl9DSEFOTkVMKSA/ICIgPCBIRiIgOgorCSAgICAgICIgPiBIRiIpOworCVBJTkZPKCJTVEFUVVNfQklUX0ZGX0NIQU5ORUw9JXMuXG4iLAorCSAgICAgIChjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZGX0NIQU5ORUwpID8gIm5vdCBmdWxsIiA6CisJICAgICAgImZ1bGwiKTsKKworCVBJTkZPKCJTVEFUVVNfQklUX0VGX0RBVEE9JXMuXG4iLAorCSAgICAgIChjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0VGX0RBVEEpID8gIm5vdCBlbXB0eSIgOgorCSAgICAgICJlbXB0eSIpOworCVBJTkZPKCJTVEFUVVNfQklUX0hGX0RBVEE9JXMuXG4iLAorCSAgICAgIChjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0hGX0RBVEEpID8gIiA8IEhGIiA6ICIgPiBIRiIpOworCVBJTkZPKCJTVEFUVVNfQklUX0ZGX0RBVEE9JXMuXG4iLAorCSAgICAgIChjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZGX0RBVEEpID8gIm5vdCBmdWxsIiA6CisJICAgICAgImZ1bGwiKTsKKworCVBJTkZPKCJDVFJMX0JJVF9IRl9JUlFfUkVTRVQ9JXMuXG4iLAorCSAgICAgIChjdHJsX3N0YXR1cyAmIE1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQpID8gInJlc2V0IiA6CisJICAgICAgIndvcmsiKTsKKwlQSU5GTygiQ1RSTF9CSVRfU0NfSVJRPSVzLlxuIiwKKwkgICAgICAoY3RybF9zdGF0dXMgJiBNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRKSA/ICJlbmFibGUiIDogImRpc2FibGUiKTsKKwlQSU5GTygiQ1RSTF9CSVRfU0NfUkVMT0FEPSVzLlxuIiwKKwkgICAgICAoY3RybF9zdGF0dXMgJiBNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfUkVMT0FEKSA/ICJvbiIgOiAib2ZmIik7CisJUElORk8oIkNUUkxfQklUX1NDX0lSUV9SRVNFVD0lcy5cbiIsCisJICAgICAgKGN0cmxfc3RhdHVzICYgTUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUV9SRVNFVCkgPyAicmVzZXQiIDoKKwkgICAgICAid29yayIpOworCVBJTkZPKCIlbGQgRU5EXG4iLCBqaWZmaWVzKTsKKyNlbmRpZgorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiogQGJyaWVmIFN0b3AgYXF1c2F0aW9uIG9mIGRhdGEuIFJlc2V0IGludGVycnVwdHMnIGxhY2hlcy4gQ2xlYXIgZGF0YSdzIEZJRk8uCisqCisqIEBwYXJhbSBpbnN0YW5jZSBUaGUgc3ViZGV2aWNlIGluc3RhbmNlIChwb2ludGVyKS4KKyovCit2b2lkIGlubGluZSBhaV9zdG9wX2lzcihtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSkKK3sJCQkJLy8vIEBub3RlIFRoaXMgaXMgc29mdCB0aW1lIGNyaXRpY2FsIGZ1bmN0aW9uIQorCXJlZ2lzdGVyIHVpbnQzMl90IHRtcDsKKworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJLy9TdG9wIGFsbC4gUmVzZXQgaW50ZXJydXB0IGxhY2hlcy4gUmVzZXQgZGF0YSBGSUZPLgorCXRtcCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCXRtcCB8PQorCSAgICAoTUU0NjAwX0FJX0NUUkxfQklUX0lNTUVESUFURV9TVE9QIHwgTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUV9SRVNFVAorCSAgICAgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfTEVfSVJRX1JFU0VUIHwKKwkgICAgIE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19JUlFfUkVTRVQpOworCXRtcCAmPSB+TUU0NjAwX0FJX0NUUkxfQklUX0RBVEFfRklGTzsKKwlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7Cit9CisKKy8qKiBAYnJpZWYgQ29weSBkYXRhIGZyb20gZmlmbyB0byBjaXJjdWxhciBidWZmZXIuCisqCisqIEBwYXJhbSBpbnN0YW5jZSBUaGUgc3ViZGV2aWNlIGluc3RhbmNlIChwb2ludGVyKS4KKyogQHBhcmFtIGNvdW50IFRoZSBudW1iZXIgb2YgcmVxdWVzdGVkIGRhdGEuCisqCisqIEByZXR1cm4gT24gc3VjY2VzczogTnVtYmVyIG9mIGNvcGllZCB2YWx1ZXMuCisqIEByZXR1cm4gT24gZXJyb3I6IC1NRV9FUlJOT19SSU5HX0JVRkZFUl9PVkVSRkxPVy4KKyovCitzdGF0aWMgaW50IGlubGluZSBhaV9yZWFkX2RhdGEobWU0NjAwX2FpX3N1YmRldmljZV90ICogaW5zdGFuY2UsCisJCQkgICAgICAgY29uc3QgaW50IGNvdW50KQorewkJCQkvLy8gQG5vdGUgVGhpcyBpcyB0aW1lIGNyaXRpY2FsIGZ1bmN0aW9uIQorCWludCBjID0gY291bnQ7CisJaW50IGVtcHR5X3NwYWNlOworCWludCBjb3BpZWQgPSAwOworCWludCBpLCBqOworCisJZW1wdHlfc3BhY2UgPSBtZV9jaXJjX2J1Zl9zcGFjZV90b19lbmQoJmluc3RhbmNlLT5jaXJjX2J1Zik7CisJaWYgKGVtcHR5X3NwYWNlIDw9IDApIHsKKwkJUERFQlVHKCJDaXJjdWxhciBidWZmZXIgZnVsbC5cbiIpOworCQlyZXR1cm4gLU1FX0VSUk5PX1JJTkdfQlVGRkVSX09WRVJGTE9XOworCX0KKworCWlmIChlbXB0eV9zcGFjZSA8IGMpIHsJLy9Db3B5IGZpcnN0IHBhcnQuIE1heCB0byBlbmQgb2YgYnVmZmVyLgorCQlQREVCVUcKKwkJICAgICgiVHJ5IHRvIGNvcHkgJWQgdmFsdWVzIGZyb20gRklGTyB0byBjaXJjdWxhciBidWZmZXIgKHBhc3MgMSkuXG4iLAorCQkgICAgIGVtcHR5X3NwYWNlKTsKKwkJZm9yIChpID0gMDsgaSA8IGVtcHR5X3NwYWNlOyBpKyspIHsKKwkJCSooaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZiArIGluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkKSA9CisJCQkgICAgKGludyhpbnN0YW5jZS0+ZGF0YV9yZWcpIF4gMHg4MDAwKTsKKwkJCWluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkKys7CisJCX0KKwkJaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQgJj0gaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJCWMgLT0gZW1wdHlfc3BhY2U7CisJCWNvcGllZCA9IGVtcHR5X3NwYWNlOworCisJCWVtcHR5X3NwYWNlID0gbWVfY2lyY19idWZfc3BhY2VfdG9fZW5kKCZpbnN0YW5jZS0+Y2lyY19idWYpOworCX0KKworCWlmIChlbXB0eV9zcGFjZSA+IDApIHsKKwkJaiA9IChlbXB0eV9zcGFjZSA8IGMpID8gZW1wdHlfc3BhY2UgOiBjOworCQlQREVCVUcKKwkJICAgICgiVHJ5IHRvIGNvcHkgJWQgdmFsdWVzIGZyb20gRklGTyB0byBjaXJjdWxhciBidWZmZXIgKHBhc3MgMikuXG4iLAorCQkgICAgIGMpOworCQlmb3IgKGkgPSAwOyBpIDwgajsgaSsrKSB7CisJCQkqKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYgKyBpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCkgPQorCQkJICAgIChpbncoaW5zdGFuY2UtPmRhdGFfcmVnKSBeIDB4ODAwMCk7CisJCQlpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCsrOworCQl9CisJCWluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkICY9IGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrOworCQljb3BpZWQgKz0gajsKKwl9CisJcmV0dXJuIGNvcGllZDsKK30KKwordm9pZCBpbmxpbmUgYWlfaW5maW5pdGVfSVNNKG1lNDYwMF9haV9zdWJkZXZpY2VfdCAqIGluc3RhbmNlKQorewkJCQkvLy8gQG5vdGUgVGhpcyBpcyB0aW1lIGNyaXRpY2FsIGZ1bmN0aW9uIQorCXJlZ2lzdGVyIHZvbGF0aWxlIHVpbnQzMl90IGN0cmxfc2V0LCBjdHJsX3Jlc2V0LCB0bXA7CisKKwlpZiAoaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZCA8IE1FNDYwMF9BSV9GSUZPX01BWF9TQykgewkvLyBPbmx5IHNhbXBsZSBjb3VudGVyIHdpdGggcmVsb2FkbmlnIGlzIHdvcmtpbmcuIFJlc2V0IGl0LgorCQlQSU5GTworCQkgICAgKCJPbmx5IHNhbXBsZSBjb3VudGVyIHdpdGggcmVsb2FkbmlnIGlzIHdvcmtpbmcuIFJlc2V0IGl0LlxuIik7CisJCWN0cmxfc2V0ID0gTUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUV9SRVNFVDsKKwkJY3RybF9yZXNldCA9IH5NRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRX1JFU0VUOworCX0gZWxzZSBpZiAoaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZCA9PSBpbnN0YW5jZS0+SVNNLnJlYWQpIHsJLy9UaGlzIGlzIFNDIGludGVycnVwdCBmb3IgbGFyZ2UgYmxvY2suIFRoZSB3aG9sZSBzZWN0aW9uIGlzIGRvbmUuIFJlc2V0IFNDX0lSUSBhbiBIRl9JUlEgYW5kIHN0YXJ0IGV2ZXJ5dGhpbmcgYWdhaW4gZnJvbSBiZWdpbm5pbmcuCisJCVBJTkZPCisJCSAgICAoIlRoaXMgaXMgU0MgaW50ZXJydXB0IGZvciBsYXJnZSBibG9jay4gVGhlIHdob2xlIHNlY3Rpb24gaXMgZG9uZS4gUmVzZXQgU0NfSVJRIGFuIEhGX0lSUSBhbmQgc3RhcnQgZXZlcnl0aGluZyBhZ2FpbiBmcm9tIGJlZ2lubmluZy5cbiIpOworCQljdHJsX3NldCA9CisJCSAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRX1JFU0VUIHwKKwkJICAgIE1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQ7CisJCWN0cmxfcmVzZXQgPQorCQkgICAgfihNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRX1JFU0VUIHwKKwkJICAgICAgTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUV9SRVNFVCk7CisJfSBlbHNlIGlmIChpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkID49IChNRTQ2MDBfQUlfRklGT19NQVhfU0MgKyBpbnN0YW5jZS0+SVNNLnJlYWQpKSB7CS8vVGhpcyBpcyBIRiBpbnRlcnJ1cHQgZm9yIGxhcmdlIGJsb2NrLlRoZSBuZXh0IGludGVycnVwdCBzaG91bGQgYmUgZnJvbSBIRiwgYWxzby4gUmVzZXQgSEYuCisJCVBJTkZPCisJCSAgICAoIlRoaXMgaXMgSEYgaW50ZXJydXB0IGZvciBsYXJnZSBibG9jay5UaGUgbmV4dCBpbnRlcnJ1cHQgc2hvdWxkIGJlIGZyb20gSEYsIGFsc28uIFJlc2V0IEhGLlxuIik7CisJCWN0cmxfc2V0ID0gTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUV9SRVNFVDsKKwkJY3RybF9yZXNldCA9IH5NRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRX1JFU0VUOworCX0gZWxzZSB7CQkvL1RoaXMgaXMgSEYgaW50ZXJydXB0IGZvciBsYXJnZSBibG9jay5UaGUgbmV4dCBpbnRlcnJ1cHQgc2hvdWxkIGJlIGZyb20gU0MuIERvbid0IHJlc2V0IEhGIQorCQlQSU5GTworCQkgICAgKCJUaGlzIGlzIEhGIGludGVycnVwdCBmb3IgbGFyZ2UgYmxvY2suVGhlIG5leHQgaW50ZXJydXB0IHNob3VsZCBiZSBmcm9tIFNDLiBEb24ndCByZXNldCBIRiFcbiIpOworCQljdHJsX3NldCA9IE1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQ7CisJCWN0cmxfcmVzZXQgPSAweEZGRkZGRkZGOworCX0KKworCS8vUmVzZXQgaW50ZXJydXB0IGxhdGNoLgorCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUElORk8oImN0cmw9MHgleCBjdHJsX3NldD0weCV4IGN0cmxfcmVzZXQ9MHgleFxuIiwgdG1wLCBjdHJsX3NldCwKKwkgICAgICBjdHJsX3Jlc2V0KTsKKwl0bXAgfD0gY3RybF9zZXQ7CisJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisJaWYgKGN0cmxfcmVzZXQgIT0gMHhGRkZGRkZGRikgeworCQlvdXRsKHRtcCAmIGN0cmxfcmVzZXQsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVzZXQgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIHRtcCAmIGN0cmxfcmVzZXQpOworCX0KKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisKK30KKwordm9pZCBpbmxpbmUgYWlfbGltaXRlZF9JU00obWU0NjAwX2FpX3N1YmRldmljZV90ICogaW5zdGFuY2UsCisJCQkgICB1aW50MzJfdCBpcnFfc3RhdHVzKQorewkJCQkvLy8gQG5vdGUgVGhpcyBpcyB0aW1lIGNyaXRpY2FsIGZ1bmN0aW9uIQorCXJlZ2lzdGVyIHZvbGF0aWxlIHVpbnQzMl90IGN0cmxfc2V0LCBjdHJsX3Jlc2V0ID0gMHhGRkZGRkZGRiwgdG1wOworCisJaWYgKCFpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkKSB7CS8vTm8gdGhyZXNob2xkIHByb3ZpZGVkLiBTQyBlbmRzIHdvcmsuCisJCVBJTkZPKCJObyB0aHJlc2hvbGQgcHJvdmlkZWQuIFNDIGVuZHMgd29yay5cbiIpOworCQljdHJsX3NldCA9IE1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQ7CisJCWlmIChpbnN0YW5jZS0+ZGF0YV9yZXF1aXJlZCA+IChNRTQ2MDBfQUlfRklGT19DT1VOVCAtIDEgKyBpbnN0YW5jZS0+SVNNLmdsb2JhbF9yZWFkKSkgewkvL0hGIG5lZWQgcmVzZXRpbmcuCisJCQljdHJsX3Jlc2V0ICY9IH5NRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRX1JFU0VUOworCQl9CisJfSBlbHNlCQkJLy9pZihpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkKQorCXsKKwkJaWYgKGlycV9zdGF0dXMgJiBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfQUlfSEYpIHsKKwkJCVBJTkZPKCJUaHJlc2hvbGQgcHJvdmlkZWQuIENsZWFyIEhGIGxhdGNoLlxuIik7CisJCQljdHJsX3NldCA9IE1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQ7CisKKwkJCWlmIChpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkID49IChNRTQ2MDBfQUlfRklGT19NQVhfU0MgKyBpbnN0YW5jZS0+SVNNLnJlYWQpKSB7CS8vVGhpcyBpcyBub3QgdGhlIGxhc3Qgb25lLiBIRiBuZWVkIHJlc2V0aW5nLgorCQkJCVBJTkZPCisJCQkJICAgICgiVGhlIG5leHQgaW50ZXJydXB0IGlzIEhGLiBIRiBuZWVkIGJlIGFjdGl2YXRpbmcuXG4iKTsKKwkJCQljdHJsX3Jlc2V0ID0gfk1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQ7CisJCQl9CisJCX0KKworCQlpZiAoaXJxX3N0YXR1cyAmIE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9TQykgeworCQkJUElORk8oIlRocmVzaG9sZCBwcm92aWRlZC4gUmVzdGFydCBTQy5cbiIpOworCQkJY3RybF9zZXQgPSBNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRX1JFU0VUOworCQkJY3RybF9yZXNldCAmPSB+TUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUV9SRVNFVDsKKworCQkJaWYgKGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQgPj0gTUU0NjAwX0FJX0ZJRk9fTUFYX1NDKSB7CS8vVGhpcyBpcyBub3QgdGhlIGxhc3Qgb25lLiBIRiBuZWVkIHRvIGJlIGFjdGl2YXRpbmcuCisJCQkJUElORk8KKwkJCQkgICAgKCJUaGUgbmV4dCBpbnRlcnJ1cHQgaXMgSEYuIEhGIG5lZWQgdG8gYmUgYWN0aXZhdGluZy5cbiIpOworCQkJCWN0cmxfcmVzZXQgJj0gfk1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQ7CisJCQl9CisJCX0KKwl9CisKKwkvL1Jlc2V0IGludGVycnVwdCBsYXRjaC4KKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCXRtcCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCXRtcCB8PSBjdHJsX3NldDsKKwlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKworCWlmIChjdHJsX3Jlc2V0ICE9IDB4RkZGRkZGRkYpIHsKKwkJb3V0bCh0bXAgJiBjdHJsX3Jlc2V0LCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgdG1wICYgY3RybF9yZXNldCk7CisJfQorCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKworfQorCisvKiogQGJyaWVmIExhc3QgY2h1bmNrIG9mIGRhdGFzLiBXZSBtdXN0IHJlc2NoZWR1bGUgc2FtcGxlIGNvdW50ZXIuCisqCUBub3RlIExhc3QgY2h1bmNrLgorKglMZWF2aW5nIFNDX1JFTE9BRCBkb2Vzbid0IGRvIGFueSBoYXJtLCBidXQgaW4gc29tZSBiYWQgY2FzZSBjYW4gbWFrZSBleHRyYSBpbnRlcnJ1cHRzLgorKglAd2FybmluZyBXaGVuIHRocmVzaG9sZCBpcyB3cm9uZ2x5IHNldCBzb21lIElSUSBhcmUgbG9zdC4oISEhKQorKi8KK3ZvaWQgaW5saW5lIGFpX3Jlc2NoZWR1bGVfU0MobWU0NjAwX2FpX3N1YmRldmljZV90ICogaW5zdGFuY2UpCit7CisJcmVnaXN0ZXIgdWludDMyX3QgcmVzdDsKKworCWlmIChpbnN0YW5jZS0+ZGF0YV9yZXF1aXJlZCA8PSBpbnN0YW5jZS0+SVNNLmdsb2JhbF9yZWFkKQorCQlyZXR1cm47CisKKwlyZXN0ID0gaW5zdGFuY2UtPmRhdGFfcmVxdWlyZWQgLSBpbnN0YW5jZS0+SVNNLmdsb2JhbF9yZWFkOworCWlmIChyZXN0IDwgaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZCkgewkvL0VuZCBvZiB3b3JrIHNvb24gLi4uLgorCQlQREVCVUcoIlJlc2NoZWR1bGluZyBTQyBmcm9tICVkIHRvICVkLlxuIiwKKwkJICAgICAgIGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQsIHJlc3QpOworCQkvLy8gQG5vdGUgV3JpdGUgbmV3IHZhbHVlIHRvIFNDIDw9PSAgREFOR0VSISBUaGlzIGlzIG5vdCBzYWZlIHNvbHV0aW9uISBXZSBjYW4gbWlzcyBzb21lIGlucHV0cy4KKwkJb3V0bChyZXN0LCBpbnN0YW5jZS0+c2FtcGxlX2NvdW50ZXJfcmVnKTsKKwkJUERFQlVHX1JFRygic2FtcGxlX2NvdW50ZXJfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+c2FtcGxlX2NvdW50ZXJfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgcmVzdCk7CisJCWluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQgPSByZXN0OworCisJCWlmIChyZXN0IDwgTUU0NjAwX0FJX0ZJRk9fTUFYX1NDKSB7CisJCQlpbnN0YW5jZS0+SVNNLm5leHQgPSByZXN0OworCQl9IGVsc2UgeworCQkJaW5zdGFuY2UtPklTTS5uZXh0ID0gcmVzdCAlIE1FNDYwMF9BSV9GSUZPX0hBTEY7CisJCQlpZiAoaW5zdGFuY2UtPklTTS5uZXh0ICsgTUU0NjAwX0FJX0ZJRk9fSEFMRiA8CisJCQkgICAgTUU0NjAwX0FJX0ZJRk9fTUFYX1NDKSB7CisJCQkJaW5zdGFuY2UtPklTTS5uZXh0ICs9IE1FNDYwMF9BSV9GSUZPX0hBTEY7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qKiBTdGFydCB0aGUgSVNNLiBBbGwgbXVzdCBiZSByZXNldGVkIGJlZm9yZSBlbnRlciB0byB0aGlzIGZ1bmN0aW9uLiAqLwordm9pZCBpbmxpbmUgYWlfZGF0YV9hY3F1aXNpdGlvbl9sb2dpYyhtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSkKK3sKKwlyZWdpc3RlciB1aW50MzJfdCB0bXA7CisKKwlpZiAoIWluc3RhbmNlLT5kYXRhX3JlcXVpcmVkKSB7CS8vVGhpcyBpcyBpbmZpbml0ZSBhcXVzaXRpb24uCisJCWlmICghaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZCkgewkvL05vIHRocmVzaG9sZCBwcm92aWRlZC4gU2V0IFNDIHRvIDAuNSpGSUZPLiBDbGVhciB0aGUgU0MncyBsYXRjaC4KKwkJCS8vU2V0IHRoZSBzYW1wbGUgY291bnRlcgorCQkJb3V0bChNRTQ2MDBfQUlfRklGT19IQUxGLCBpbnN0YW5jZS0+c2FtcGxlX2NvdW50ZXJfcmVnKTsKKwkJCVBERUJVR19SRUcKKwkJCSAgICAoInNhbXBsZV9jb3VudGVyX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICAgIGluc3RhbmNlLT5zYW1wbGVfY291bnRlcl9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICAgIE1FNDYwMF9BSV9GSUZPX0hBTEYpOworCQl9IGVsc2UgewkvL1RocmVzaG9sZCBwcm92aWRlZC4gU2V0IFNDIHRvIHRyZXNob2xkLiBDbGVhciB0aGUgU0MncyBsYXRjaC4KKwkJCS8vU2V0IHRoZSBzYW1wbGUgY291bnRlcgorCQkJb3V0bChpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkLAorCQkJICAgICBpbnN0YW5jZS0+c2FtcGxlX2NvdW50ZXJfcmVnKTsKKwkJCVBERUJVR19SRUcKKwkJCSAgICAoInNhbXBsZV9jb3VudGVyX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICAgIGluc3RhbmNlLT5zYW1wbGVfY291bnRlcl9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICAgIGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQpOworCQl9CisKKwkJaWYgKGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQgPCBNRTQ2MDBfQUlfRklGT19NQVhfU0MpIHsJLy9FbmFibGUgb25seSBzYW1wbGUgY291bnRlcidzIGludGVycnVwdC4gU2V0IHJlbG9hZCBiaXQuIENsZWFyIHRoZSBTQydzIGxhdGNoLgorCQkJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwkJCXRtcCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJdG1wIHw9IE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19SRUxPQUQ7CisJCQl0bXAgJj0gfk1FNDYwMF9BSV9DVFJMX0JJVF9TQ19JUlFfUkVTRVQ7CisJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICB0bXApOworCQkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCQkJaWYgKCFpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkKSB7CS8vTm8gdGhyZXNob2xkIHByb3ZpZGVkLiBTZXQgSVNNLm5leHQgdG8gMC41KkZJRk8uCisJCQkJaW5zdGFuY2UtPklTTS5uZXh0ID0gTUU0NjAwX0FJX0ZJRk9fSEFMRjsKKwkJCX0gZWxzZSB7CS8vVGhyZXNob2xkIHByb3ZpZGVkLiBTZXQgSVNNLm5leHQgdG8gdHJlc2hvbGQuCisJCQkJaW5zdGFuY2UtPklTTS5uZXh0ID0KKwkJCQkgICAgaW5zdGFuY2UtPmZpZm9faXJxX3RocmVzaG9sZDsKKwkJCX0KKwkJfSBlbHNlIHsJLy9FbmFibGUgc2FtcGxlIGNvdW50ZXIncyBhbmQgSEYncyBpbnRlcnJ1cHRzLgorCQkJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwkJCXRtcCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJdG1wIHw9IE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19SRUxPQUQ7CisJCQl0bXAgJj0KKwkJCSAgICB+KE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19JUlFfUkVTRVQgfAorCQkJICAgICAgTUU0NjAwX0FJX0NUUkxfQklUX0hGX0lSUV9SRVNFVCk7CisJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICB0bXApOworCQkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCisJCQlpbnN0YW5jZS0+SVNNLm5leHQgPQorCQkJICAgIGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQgJSBNRTQ2MDBfQUlfRklGT19IQUxGOworCQkJaWYgKGluc3RhbmNlLT5JU00ubmV4dCArIE1FNDYwMF9BSV9GSUZPX0hBTEYgPAorCQkJICAgIE1FNDYwMF9BSV9GSUZPX01BWF9TQykgeworCQkJCWluc3RhbmNlLT5JU00ubmV4dCArPSBNRTQ2MDBfQUlfRklGT19IQUxGOworCQkJfQorCQl9CisJfSBlbHNlIHsJCS8vVGhpcyBhcXVzaXRpb24gaXMgbGltaXRlZCB0byBzZXQgbnVtYmVyIG9mIGRhdGEuCisJCWlmIChpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkID49IGluc3RhbmNlLT5kYXRhX3JlcXVpcmVkKSB7CS8vU3R1cGlkIHNpdHVhdGlvbi4KKwkJCWluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQgPSAwOworCQkJUERFQlVHCisJCQkgICAgKCJTdHVwaWQgc2l0dWF0aW9uOiBkYXRhX3JlcXVpcmVkKCVkKSA8IHRocmVzaG9sZCglZCkuXG4iLAorCQkJICAgICBpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkLAorCQkJICAgICBpbnN0YW5jZS0+ZGF0YV9yZXF1aXJlZCk7CisJCX0KKworCQlpZiAoIWluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQpIHsJLy9ObyB0aHJlc2hvbGQgcHJvdmlkZWQuIEVhc3kgY2FzZTogSEY9cmVhZCBhbmQgU0M9ZW5kLgorCQkJLy9TZXQgdGhlIHNhbXBsZSBjb3VudGVyIHRvIGRhdGFfcmVxdWlyZWQuCisJCQlvdXRsKGluc3RhbmNlLT5kYXRhX3JlcXVpcmVkLAorCQkJICAgICBpbnN0YW5jZS0+c2FtcGxlX2NvdW50ZXJfcmVnKTsKKwkJCVBERUJVR19SRUcKKwkJCSAgICAoInNhbXBsZV9jb3VudGVyX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICAgIGluc3RhbmNlLT5zYW1wbGVfY291bnRlcl9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICAgIGluc3RhbmNlLT5kYXRhX3JlcXVpcmVkKTsKKworCQkJLy9SZXNldCB0aGUgbGF0Y2hlcyBvZiBzYW1wbGUgY291bnRlciBhbmQgSEYgKGlmIFNDPkZJRk8pLgorCQkJLy9ObyBTQyByZWxvYWQhCisJCQlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCQkJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQl0bXAgJj0KKwkJCSAgICB+KE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19JUlFfUkVTRVQgfAorCQkJICAgICAgTUU0NjAwX0FJX0NUUkxfQklUX1NDX1JFTE9BRCk7CisJCQlpZiAoaW5zdGFuY2UtPmRhdGFfcmVxdWlyZWQgPgorCQkJICAgIChNRTQ2MDBfQUlfRklGT19DT1VOVCAtIDEpKSB7CisJCQkJdG1wICY9IH5NRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRX1JFU0VUOworCQkJCWluc3RhbmNlLT5JU00ubmV4dCA9CisJCQkJICAgIGluc3RhbmNlLT5kYXRhX3JlcXVpcmVkICUKKwkJCQkgICAgTUU0NjAwX0FJX0ZJRk9fSEFMRjsKKwkJCQlpbnN0YW5jZS0+SVNNLm5leHQgKz0gTUU0NjAwX0FJX0ZJRk9fSEFMRjsKKworCQkJfSBlbHNlIHsKKwkJCQlpbnN0YW5jZS0+SVNNLm5leHQgPSBpbnN0YW5jZS0+ZGF0YV9yZXF1aXJlZDsKKwkJCX0KKwkJCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHRtcCk7CisJCQlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisKKwkJfSBlbHNlIHsJLy9UaGUgbW9zdCBnZW5lcmFsIGNhc2UuIFdlIGhhdmUgY29uY3JldCBudW1iZSBvZiByZXF1aXJlZCBkYXRhIGFuZCB0aHJlc2hvbGQuIFNDPVRICisJCQkvL1NldCB0aGUgc2FtcGxlIGNvdW50ZXIgdG8gdGhyZXNob2xkLgorCQkJb3V0bChpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkLAorCQkJICAgICBpbnN0YW5jZS0+c2FtcGxlX2NvdW50ZXJfcmVnKTsKKwkJCVBERUJVR19SRUcKKwkJCSAgICAoInNhbXBsZV9jb3VudGVyX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICAgIGluc3RhbmNlLT5zYW1wbGVfY291bnRlcl9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICAgIGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQpOworCisJCQlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCQkJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkvL0luIHRoaXMgbW9tZW50IHdlIGFyZSBzdXJlIHRoYXQgU0Mgd2lsbCBjb21lIG1vcmUgdGhhbiBvbmNlLgorCQkJdG1wIHw9IE1FNDYwMF9BSV9DVFJMX0JJVF9TQ19SRUxPQUQ7CisKKwkJCWlmIChpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkIDwgTUU0NjAwX0FJX0ZJRk9fTUFYX1NDKSB7CS8vVGhlIHRocmVzaG9sZCBpcyBzbyBzbWFsbCB0aGF0IHdlIGRvIG5lZWQgSEYuCisJCQkJdG1wICY9IH5NRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRX1JFU0VUOworCQkJCWluc3RhbmNlLT5JU00ubmV4dCA9CisJCQkJICAgIGluc3RhbmNlLT5maWZvX2lycV90aHJlc2hvbGQ7CisJCQl9IGVsc2UgewkvL1RoZSB0aHJlc2hvbGQgaXMgbGFyZ2UuIFRoZSBIRiBtdXN0IGJlIHVzZS4KKwkJCQl0bXAgJj0KKwkJCQkgICAgfihNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfSVJRX1JFU0VUIHwKKwkJCQkgICAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRX1JFU0VUKTsKKwkJCQlpbnN0YW5jZS0+SVNNLm5leHQgPQorCQkJCSAgICBpbnN0YW5jZS0+Zmlmb19pcnFfdGhyZXNob2xkICUKKwkJCQkgICAgTUU0NjAwX0FJX0ZJRk9fSEFMRjsKKwkJCQlpZiAoaW5zdGFuY2UtPklTTS5uZXh0ICsgTUU0NjAwX0FJX0ZJRk9fSEFMRiA8CisJCQkJICAgIE1FNDYwMF9BSV9GSUZPX01BWF9TQykgeworCQkJCQlpbnN0YW5jZS0+SVNNLm5leHQgKz0KKwkJCQkJICAgIE1FNDYwMF9BSV9GSUZPX0hBTEY7CisJCQkJfQorCQkJfQorCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgdG1wKTsKKwkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBhaV9tdXhfdG9nZ2xlcihtZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSkKK3sKKwl1aW50MzJfdCB0bXA7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9MFxuIik7CisKKwlvdXRsKDAsIGluc3RhbmNlLT5zY2FuX3ByZV90aW1lcl9sb3dfcmVnKTsKKwlQREVCVUdfUkVHKCJzY2FuX3ByZV90aW1lcl9sb3dfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnNjYW5fcHJlX3RpbWVyX2xvd19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDApOworCW91dGwoMCwgaW5zdGFuY2UtPnNjYW5fcHJlX3RpbWVyX2hpZ2hfcmVnKTsKKwlQREVCVUdfUkVHKCJzY2FuX3ByZV90aW1lcl9oaWdoX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zY2FuX3ByZV90aW1lcl9oaWdoX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMCk7CisJb3V0bCgwLCBpbnN0YW5jZS0+c2Nhbl90aW1lcl9sb3dfcmVnKTsKKwlQREVCVUdfUkVHKCJzY2FuX3RpbWVyX2xvd19yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+c2Nhbl90aW1lcl9sb3dfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwlvdXRsKDAsIGluc3RhbmNlLT5zY2FuX3RpbWVyX2hpZ2hfcmVnKTsKKwlQREVCVUdfUkVHKCJzY2FuX3RpbWVyX2hpZ2hfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnNjYW5fdGltZXJfaGlnaF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDApOworCW91dGwoNjUsIGluc3RhbmNlLT5jaGFuX3RpbWVyX3JlZyk7CisJUERFQlVHX1JFRygiY2hhbl90aW1lcl9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y2hhbl90aW1lcl9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDY1KTsKKwlvdXRsKDY1LCBpbnN0YW5jZS0+Y2hhbl9wcmVfdGltZXJfcmVnKTsKKwlQREVCVUdfUkVHKCJjaGFuX3ByZV90aW1lcl9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y2hhbl9wcmVfdGltZXJfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCA2NSk7CisKKwkvLyBUdXJuIG9uIGludGVybmFsIHJlZmVyZW5jZS4KKwl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwl0bXAgfD0gTUU0NjAwX0FJX0NUUkxfQklUX0ZVTExTQ0FMRTsKKwlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKworCS8vIENsZWFyIGRhdGEgYW5kIGNoYW5uZWwgZmlmby4KKwl0bXAgJj0KKwkgICAgfihNRTQ2MDBfQUlfQ1RSTF9CSVRfQ0hBTk5FTF9GSUZPIHwgTUU0NjAwX0FJX0NUUkxfQklUX0RBVEFfRklGTyk7CisJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisJdG1wIHw9IE1FNDYwMF9BSV9DVFJMX0JJVF9DSEFOTkVMX0ZJRk8gfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfREFUQV9GSUZPOworCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCisJLy8gV3JpdGUgY2hhbm5lbCBlbnRyeS4KKwlvdXRsKE1FNDYwMF9BSV9MSVNUX0lOUFVUX0RJRkZFUkVOVElBTCB8CisJICAgICBNRTQ2MDBfQUlfTElTVF9SQU5HRV9VTklQT0xBUl8yXzUgfCAzMSwKKwkgICAgIGluc3RhbmNlLT5jaGFubmVsX2xpc3RfcmVnKTsKKwlQREVCVUdfUkVHKCJjaGFubmVsX2xpc3RfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmNoYW5uZWxfbGlzdF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIE1FNDYwMF9BSV9MSVNUX0lOUFVUX0RJRkZFUkVOVElBTCB8CisJCSAgIE1FNDYwMF9BSV9MSVNUX1JBTkdFX1VOSVBPTEFSXzJfNSB8IDMxKTsKKworCS8vIFN0YXJ0IGNvbnZlcnNpb24uCisJaW5sKGluc3RhbmNlLT5zdGFydF9yZWcpOworCVBERUJVR19SRUcoInN0YXJ0X3JlZyBpbmwoMHglbFgrMHglbFgpXG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zdGFydF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UpOworCXVkZWxheSgxMCk7CisKKwkvLyBDbGVhciBkYXRhIGFuZCBjaGFubmVsIGZpZm8uCisJdG1wICY9CisJICAgIH4oTUU0NjAwX0FJX0NUUkxfQklUX0NIQU5ORUxfRklGTyB8IE1FNDYwMF9BSV9DVFJMX0JJVF9EQVRBX0ZJRk8pOworCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCXRtcCB8PSBNRTQ2MDBfQUlfQ1RSTF9CSVRfQ0hBTk5FTF9GSUZPIHwgTUU0NjAwX0FJX0NUUkxfQklUX0RBVEFfRklGTzsKKwlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKworCS8vIFdyaXRlIGNoYW5uZWwgZW50cnkuCisJLy8gTUU0NjAwX0FJX0xJU1RfSU5QVVRfU0lOR0xFX0VOREVEIHwgTUU0NjAwX0FJX0xJU1RfUkFOR0VfQklQT0xBUl8xMCA8PSAweDAwMDAKKwlvdXRsKE1FNDYwMF9BSV9MSVNUX0lOUFVUX1NJTkdMRV9FTkRFRCB8CisJICAgICBNRTQ2MDBfQUlfTElTVF9SQU5HRV9CSVBPTEFSXzEwLCBpbnN0YW5jZS0+Y2hhbm5lbF9saXN0X3JlZyk7CisJUERFQlVHX1JFRygiY2hhbm5lbF9saXN0X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jaGFubmVsX2xpc3RfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBNRTQ2MDBfQUlfTElTVF9JTlBVVF9TSU5HTEVfRU5ERUQgfAorCQkgICBNRTQ2MDBfQUlfTElTVF9SQU5HRV9CSVBPTEFSXzEwKTsKKworCS8vIFN0YXJ0IGNvbnZlcnNpb24uCisJaW5sKGluc3RhbmNlLT5zdGFydF9yZWcpOworCVBERUJVR19SRUcoInN0YXJ0X3JlZyBpbmwoMHglbFgrMHglbFgpXG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5zdGFydF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UpOworCXVkZWxheSgxMCk7CisKKwkvLyBDbGVhciBjb250cm9sIHJlZ2lzdGVyLgorCXRtcCAmPSAoTUU0NjAwX0FJX0NUUkxfQklUX0VYX0lSUSB8IE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9JUlFfUkVTRVQpOworCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKKy8qKiBAYnJpZWYgQ29weSByZXN0IG9mIGRhdGEgZnJvbSBmaWZvIHRvIGNpcmN1bGFyIGJ1ZmZlci4KKyogQG5vdGUgSGVscGVyIGZvciBTVE9QIGNvbW1hbmQuIEFmdGVyIEZTTSBpcyBzdG9wcGVkLgorKiBAbm90ZSBUaGlzIGlzIHNsb3cgZnVuY3Rpb24gdGhhdCBjb3B5IGFsbCByZW1haW5pZyBkYXRhIGZyb20gRklGTyB0byBidWZmZXIuCisqCisqIEBwYXJhbSBpbnN0YW5jZSBUaGUgc3ViZGV2aWNlIGluc3RhbmNlIChwb2ludGVyKS4KKyoKKyogQHJldHVybiBPbiBzdWNjZXNzOiBOdW1iZXIgb2YgY29waWVkIHZhbHVlcy4KKyogQHJldHVybiBPbiBlcnJvcjogTmVnYXRpdmUgZXJyb3IgY29kZSAtTUVfRVJSTk9fUklOR19CVUZGRVJfT1ZFUkZMT1cuCisqLworc3RhdGljIGludCBpbmxpbmUgYWlfcmVhZF9kYXRhX3Bvb2xpbmcobWU0NjAwX2FpX3N1YmRldmljZV90ICogaW5zdGFuY2UpCit7CQkJCS8vLyBAbm90ZSBUaGlzIGlzIHRpbWUgY3JpdGljYWwgZnVuY3Rpb24hCisJaW50IGVtcHR5X3NwYWNlOworCWludCBjb3BpZWQgPSAwOworCWludCBzdGF0dXMgPSBNRV9FUlJOT19TVUNDRVNTOworCisJUERFQlVHKCJTcGFjZSBsZWZ0IGluIGNpcmN1bGFyIGJ1ZmZlciA9ICVkLlxuIiwKKwkgICAgICAgbWVfY2lyY19idWZfc3BhY2UoJmluc3RhbmNlLT5jaXJjX2J1ZikpOworCisJd2hpbGUgKChlbXB0eV9zcGFjZSA9IG1lX2NpcmNfYnVmX3NwYWNlKCZpbnN0YW5jZS0+Y2lyY19idWYpKSkgeworCQlpZiAoIShzdGF0dXMgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYgTUU0NjAwX0FJX1NUQVRVU19CSVRfRUZfREFUQSkpIHsJLy9ObyBtb3JlIGRhdGEuIHN0YXR1cyA9IE1FX0VSUk5PX1NVQ0NFU1MgPSAwCisJCQlicmVhazsKKwkJfQorCQkqKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYgKyBpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCkgPQorCQkgICAgKGludyhpbnN0YW5jZS0+ZGF0YV9yZWcpIF4gMHg4MDAwKTsKKwkJaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQrKzsKKwkJaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQgJj0gaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJfQorCisjaWZkZWYgTUVERUJVR19FUlJPUgorCWlmICghc3RhdHVzKQorCQlQREVCVUcKKwkJICAgICgiQ29waWVkIGFsbCByZW1haW5pbmcgZGF0YXMgKCVkKSBmcm9tIEZJRk8gdG8gY2lyY3VsYXIgYnVmZmVyLlxuIiwKKwkJICAgICBjb3BpZWQpOworCWVsc2UgeworCQlQREVCVUcoIk5vIG1vcmUgZW1wdHkgc3BhY2UgaW4gYnVmZmVyLlxuIik7CisJCVBERUJVRygiQ29waWVkICVkIGRhdGFzIGZyb20gRklGTyB0byBjaXJjdWxhciBidWZmZXIuXG4iLAorCQkgICAgICAgY29waWVkKTsKKwkJUERFQlVHKCJGSUZPIHN0aWxsIG5vdCBlbXB0eS5cbiIpOworCX0KKyNlbmRpZgorCXJldHVybiAoIXN0YXR1cykgPyBjb3BpZWQgOiAtTUVfRVJSTk9fUklOR19CVUZGRVJfT1ZFUkZMT1c7Cit9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjApCitzdGF0aWMgdm9pZCBtZTQ2MDBfYWlfd29ya19jb250cm9sX3Rhc2sodm9pZCAqc3ViZGV2aWNlKQorI2Vsc2UKK3N0YXRpYyB2b2lkIG1lNDYwMF9haV93b3JrX2NvbnRyb2xfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCisjZW5kaWYKK3sKKwltZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQzMl90IHN0YXR1czsKKwl1aW50MzJfdCBjdHJsOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzID0gMDsKKwlpbnQgcmVzY2hlZHVsZSA9IDA7CisJaW50IHNpZ25hbGluZyA9IDA7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjApCisJaW5zdGFuY2UgPSAobWU0NjAwX2FpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKyNlbHNlCisJaW5zdGFuY2UgPQorCSAgICBjb250YWluZXJfb2YoKHZvaWQgKil3b3JrLCBtZTQ2MDBfYWlfc3ViZGV2aWNlX3QsIGFpX2NvbnRyb2xfdGFzayk7CisjZW5kaWYKKwlQSU5GTygiPCVzOiAlbGQ+IGV4ZWN1dGVkLlxuIiwgX19mdW5jX18sIGppZmZpZXMpOworCisJc3RhdHVzID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKKwlQREVCVUdfUkVHKCJzdGF0dXNfcmVnIGlubCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+c3RhdHVzX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgc3RhdHVzKTsKKworCXN3aXRjaCAoaW5zdGFuY2UtPnN0YXR1cykgewkvLyBDaGVja2luZyBhY3R1YWwgbW9kZS4KKwkJLy8gTm90IGNvbmZpZ3VyZWQgZm9yIHdvcmsuCisJY2FzZSBhaV9zdGF0dXNfbm9uZToKKwkJYnJlYWs7CisKKwkJLy9UaGlzIGFyZSBzdGFibGUgbW9kZXMuIE5vIG5lZWQgdG8gZG8gYW55dGhpbmcuICg/KQorCWNhc2UgYWlfc3RhdHVzX3NpbmdsZV9jb25maWd1cmVkOgorCWNhc2UgYWlfc3RhdHVzX3N0cmVhbV9jb25maWd1cmVkOgorCWNhc2UgYWlfc3RhdHVzX3N0cmVhbV9maWZvX2Vycm9yOgorCWNhc2UgYWlfc3RhdHVzX3N0cmVhbV9idWZmZXJfZXJyb3I6CisJY2FzZSBhaV9zdGF0dXNfc3RyZWFtX2Vycm9yOgorCQlQRVJST1IoIlNob3VsZG4ndCBiZSBydW5uaW5nIS5cbiIpOworCQlicmVhazsKKworCQkvLyBTdHJlYW0gbW9kZXMKKwljYXNlIGFpX3N0YXR1c19zdHJlYW1fcnVuX3dhaXQ6CisJCWlmIChzdGF0dXMgJiBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9GU00pIHsJLy8gSVNNIHN0YXJ0ZWQuLgorCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19zdHJlYW1fcnVuOworCQkJLy8gU2lnbmFsIHRoZSBlbmQgb2Ygd2FpdCBmb3Igc3RhcnQuCisJCQlzaWduYWxpbmcgPSAxOworCQkJLy8gV2FpdCBub3cgZm9yIHN0b3AuCisJCQlyZXNjaGVkdWxlID0gMTsKKwkJCWJyZWFrOworCisJCQkvLyBDaGVjayB0aW1lb3V0LgorCQkJaWYgKChpbnN0YW5jZS0+dGltZW91dC5kZWxheSkgJiYgKChqaWZmaWVzIC0gaW5zdGFuY2UtPnRpbWVvdXQuc3RhcnRfdGltZSkgPj0gaW5zdGFuY2UtPnRpbWVvdXQuZGVsYXkpKSB7CS8vIFRpbWVvdXQKKwkJCQlQREVCVUcoIlRpbWVvdXQgcmVhY2hlZC5cbiIpOworCQkJCS8vIFN0b3AgYWxsIGFjdGlvbnMuIE5vIGNvbmRpdGlvbnMhIEJsb2NrIGludGVycnVwdHMuIFJlc2V0IEZJRk8gPT4gVG9vIGxhdGUhCisJCQkJYWlfc3RvcF9pc3IoaW5zdGFuY2UpOworCisJCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFpX3N0YXR1c19zdHJlYW1fZW5kOworCisJCQkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCQkJc2lnbmFsaW5nID0gMTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgYWlfc3RhdHVzX3N0cmVhbV9ydW46CisJCS8vIFdhaXQgZm9yIHN0b3AgSVNNLgorCQlyZXNjaGVkdWxlID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIGFpX3N0YXR1c19zdHJlYW1fZW5kX3dhaXQ6CisJCWlmICghKHN0YXR1cyAmIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZTTSkpIHsJLy8gSVNNIHN0b3BlZC4gT3ZlcndyaXRlIElTUi4KKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhaV9zdGF0dXNfc3RyZWFtX2VuZDsKKwkJCS8vIFNpZ25hbCB0aGUgZW5kIG9mIHdhaXQgZm9yIHN0b3AuCisJCQlzaWduYWxpbmcgPSAxOworCQl9IGVsc2UgeworCQkJLy8gV2FpdCBmb3Igc3RvcCBJU00uCisJCQlyZXNjaGVkdWxlID0gMTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgYWlfc3RhdHVzX3N0cmVhbV9lbmQ6CisJCS8vRW5kIHdvcmsuCisJCWlmIChzdGF0dXMgJiBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9GU00pIHsJLy8gU3RpbGwgd29ya2luZz8gU3RvcCBpdCEKKwkJCVBFUlJPUgorCQkJICAgICgiU3RhdHVzIGlzICdhaV9zdGF0dXNfc3RyZWFtX2VuZCcgYnV0IGhhcmR3YXJlIGlzIHN0aWxsIHdvcmtpbmchXG4iKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrLCBjcHVfZmxhZ3MpOworCQkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJY3RybCB8PQorCQkJICAgIChNRTQ2MDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfAorCQkJICAgICBNRTQ2MDBfQUlfQ1RSTF9CSVRfSEZfSVJRX1JFU0VUIHwKKwkJCSAgICAgTUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUV9SRVNFVCk7CisJCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgY3RybCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUl9DUklUSUNBTCgiU3RhdHVzIGlzIGluIHdyb25nIHN0YXRlICglZCkhXG4iLAorCQkJCWluc3RhbmNlLT5zdGF0dXMpOworCQlpbnN0YW5jZS0+c3RhdHVzID0gYWlfc3RhdHVzX3N0cmVhbV9lcnJvcjsKKwkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCXNpZ25hbGluZyA9IDE7CisJCWJyZWFrOworCisJfQorCisJaWYgKHNpZ25hbGluZykgewkvL1NpZ25hbCBpdC4KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCX0KKworCWlmIChpbnN0YW5jZS0+YWlfY29udHJvbF90YXNrX2ZsYWcgJiYgcmVzY2hlZHVsZSkgewkvLyBSZXNjaGVkdWxlIHRhc2sKKwkJcXVldWVfZGVsYXllZF93b3JrKGluc3RhbmNlLT5tZTQ2MDBfd29ya3F1ZXVlLAorCQkJCSAgICZpbnN0YW5jZS0+YWlfY29udHJvbF90YXNrLCAxKTsKKwl9IGVsc2UgeworCQlQSU5GTygiPCVzPiBFbmRpbmcgY29udHJvbCB0YXNrLlxuIiwgX19mdW5jX18pOworCX0KKworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9haS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9haS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNWExYjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2FpLmgKQEAgLTAsMCArMSwxODAgQEAKKy8qKgorICogQGZpbGUgbWU0NjAwX2FpLmgKKyAqCisgKiBAYnJpZWYgTWVpbGhhdXMgTUUtNDAwMCBhbmFsb2cgaW5wdXQgc3ViZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZSAgKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTQ2MDBfQUlfSF8KKyNkZWZpbmUgX01FNDYwMF9BSV9IXworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisjaW5jbHVkZSAibWVpb2N0bC5oIgorI2luY2x1ZGUgIm1lY2lyY19idWYuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBNRTQ2MDBfQUlfTUFYX0RBVEEJCQkJMHhGRkZGCisKKyNpZmRlZiBNRV9TWU5BUFNFCisjIGRlZmluZSBNRTQ2MDBfQUlfQ0lSQ19CVUZfU0laRV9PUkRFUgk4CS8vIDJebiBQQUdFUyA9Pj4gTWF4aW11bSB2YWx1ZSBvZiAxTUIgZm9yIFN5bmFwc2UKKyNlbHNlCisjIGRlZmluZSBNRTQ2MDBfQUlfQ0lSQ19CVUZfU0laRV9PUkRFUgk1CS8vIDJebiBQQUdFUyA9Pj4gMTI4S0IKKyNlbmRpZgorI2RlZmluZSBNRTQ2MDBfQUlfQ0lSQ19CVUZfU0laRSAJCVBBR0VfU0laRTw8TUU0NjAwX0FJX0NJUkNfQlVGX1NJWkVfT1JERVIJLy8gQnVmZmVyIHNpemUgaW4gYnl0ZXMuCisKKyNpZmRlZiBfQ0JVRkZfMzJiX3QKKyMgZGVmaW5lIE1FNDYwMF9BSV9DSVJDX0JVRl9DT1VOVAkJKChNRTQ2MDBfQUlfQ0lSQ19CVUZfU0laRSkgLyBzaXplb2YodWludDMyX3QpKQkvLyBTaXplIGluIHZhbHVlcworI2Vsc2UKKyMgZGVmaW5lIE1FNDYwMF9BSV9DSVJDX0JVRl9DT1VOVAkJKChNRTQ2MDBfQUlfQ0lSQ19CVUZfU0laRSkgLyBzaXplb2YodWludDE2X3QpKQkvLyBTaXplIGluIHZhbHVlcworI2VuZGlmCisKKyNkZWZpbmUgTUU0NjAwX0FJX0ZJRk9fSEFMRgkJCQkxMDI0CS8vTUU0NjAwX0FJX0ZJRk9fQ09VTlQvMiAgICAgICAgICAgICAgICAvLzEwMjQKKyNkZWZpbmUgTUU0NjAwX0FJX0ZJRk9fTUFYX1NDCQkJMTM1MgkvLzAuNjYqTUU0NjAwX0FJX0ZJRk9fQ09VTlQgICAgICAgICAgICAgLy8xMzUyCisKK3R5cGVkZWYgZW51bSBNRTQ2MDBfQUlfU1RBVFVTIHsKKwlhaV9zdGF0dXNfbm9uZSA9IDAsCisJYWlfc3RhdHVzX3NpbmdsZV9jb25maWd1cmVkLAorCWFpX3N0YXR1c19zdHJlYW1fY29uZmlndXJlZCwKKwlhaV9zdGF0dXNfc3RyZWFtX3J1bl93YWl0LAorCWFpX3N0YXR1c19zdHJlYW1fcnVuLAorCWFpX3N0YXR1c19zdHJlYW1fZW5kX3dhaXQsCisJYWlfc3RhdHVzX3N0cmVhbV9lbmQsCisJYWlfc3RhdHVzX3N0cmVhbV9maWZvX2Vycm9yLAorCWFpX3N0YXR1c19zdHJlYW1fYnVmZmVyX2Vycm9yLAorCWFpX3N0YXR1c19zdHJlYW1fZXJyb3IsCisJYWlfc3RhdHVzX2xhc3QKK30gTUU0NjAwX0FJX1NUQVRVUzsKKwordHlwZWRlZiBzdHJ1Y3QgbWU0NjAwX3NpbmdsZV9jb25maWdfZW50cnkgeworCXVuc2lnbmVkIHNob3J0IHN0YXR1czsKKwl1aW50MzJfdCBlbnRyeTsKKwl1aW50MzJfdCBjdHJsOworfSBtZTQ2MDBfc2luZ2xlX2NvbmZpZ19lbnRyeV90OworCit0eXBlZGVmIHN0cnVjdCBtZTQ2MDBfcmFuZ2VfZW50cnkgeworCWludCBtaW47CisJaW50IG1heDsKK30gbWU0NjAwX3JhbmdlX2VudHJ5X3Q7CisKK3R5cGVkZWYgc3RydWN0IG1lNDYwMF9haV9JU00geworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBnbG9iYWxfcmVhZDsJCQkJLyoqPCBUaGUgbnVtYmVyIG9mIGRhdGEgcmVhZCBpbiB0b3RhbC4gKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgcmVhZDsJCQkJCQkvKio8IFRoZSBudW1iZXIgb2YgZGF0YSByZWFkIGZvciB0aGlzIGNodW5jay4gKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbmV4dDsJCQkJCQkvKio8IFRoZSBudW1iZXIgb2YgZGF0YSByZXF1ZXN0IGJ5IHVzZXIuICovCit9IG1lNDYwMF9haV9JU01fdDsKKwordHlwZWRlZiBzdHJ1Y3QgbWU0NjAwX2FpX3RpbWVvdXQgeworCXVuc2lnbmVkIGxvbmcgc3RhcnRfdGltZTsKKwl1bnNpZ25lZCBsb25nIGRlbGF5OworfSBtZTQ2MDBfYWlfdGltZW91dF90OworCisvKioKKyAqIEBicmllZiBUaGUgTUUtNDAwMCBhbmFsb2cgaW5wdXQgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTQ2MDBfYWlfc3ViZGV2aWNlIHsKKwkvKiBJbmhlcml0YW5jZSAqLworCW1lX3N1YmRldmljZV90IGJhc2U7CQkJCQkJCS8qKjwgVGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkJCQkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJc3BpbmxvY2tfdCAqY3RybF9yZWdfbG9jazsJCQkJCQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0ICNjdHJsX3JlZyBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCisJLyogSGFyZHdhcmUgZmVhdXRyZXMgKi8KKwl1bnNpZ25lZCBpbnQgaXJxOwkJCQkJCQkJLyoqPCBUaGUgaW50ZXJydXB0IHJlcXVlc3QgbnVtYmVyIGFzc2lnbmVkIGJ5IHRoZSBQQ0kgQklPUy4gKi8KKwlpbnQgaXNvbGF0ZWQ7CQkJCQkJCQkJLyoqPCBNYXJrcyBpZiB0aGlzIHN1YmRldmljZSBpcyBvbiBhbiBvcHRvaXNvbGF0ZWQgZGV2aWNlLiAqLworCWludCBzaDsJCQkJCQkJCQkJCS8qKjwgTWFya3MgaWYgdGhpcyBzdWJkZXZpY2UgaGFzIHNhbXBsZSBhbmQgaG9sZCBkZXZpY2VzLiAqLworCisJdW5zaWduZWQgaW50IGNoYW5uZWxzOwkJCQkJCQkvKio8IFRoZSBudW1iZXIgb2YgY2hhbm5lbHMgYXZhaWxhYmxlIG9uIHRoaXMgc3ViZGV2aWNlLiAqLworCW1lNDYwMF9zaW5nbGVfY29uZmlnX2VudHJ5X3Qgc2luZ2xlX2NvbmZpZ1szMl07CS8qKjwgVGhlIGNvbmZpZ3VyYXRpb24gc2V0IGZvciBzaW5nbGUgYWNxdWlzaXRpb24uICovCisKKwl1bnNpZ25lZCBpbnQgZGF0YV9yZXF1aXJlZDsJCQkJCQkvKio8IFRoZSBudW1iZXIgb2YgZGF0YSByZXF1ZXN0IGJ5IHVzZXIuICovCisJdW5zaWduZWQgaW50IGZpZm9faXJxX3RocmVzaG9sZDsJCQkJLyoqPCBUaGUgdXNlciBhZGp1c3RlZCBGSUZPIGhpZ2ggd2F0ZXIgaW50ZXJydXB0IGxldmVsLiAqLworCXVuc2lnbmVkIGludCBjaGFuX2xpc3RfbGVuOwkJCQkJCS8qKjwgVGhlIGxlbmd0aCBvZiB0aGUgdXNlciBkZWZpbmVkIGNoYW5uZWwgbGlzdC4gKi8KKworCW1lNDYwMF9haV9JU01fdCBJU007CQkJCQkJCS8qKjwgVGhlIGluZm9ybWF0aW9uIHJlcXVlc3QgYnkgSW50ZXJydXB0LVN0YXRlLU1hY2hpbmUuICovCisJdm9sYXRpbGUgZW51bSBNRTQ2MDBfQUlfU1RBVFVTIHN0YXR1czsJCQkvKio8IFRoZSBjdXJyZW50IHN0cmVhbSBzdGF0dXMgZmxhZy4gKi8KKwltZTQ2MDBfYWlfdGltZW91dF90IHRpbWVvdXQ7CQkJCQkvKio8IFRoZSB0aW1lb3V0IGZvciBzdGFydCBpbiBibG9ja2luZyBhbmQgbm9uLWJsb2NraW5nIG1vZGUuICovCisKKwkJCQkJCQkJCQkJLyogUmVnaXN0ZXJzICovLyoqPCBBbGwgcmVnaXN0ZXJzIGFyZSAzMiBiaXRzIGxvbmcuICovCisJdW5zaWduZWQgbG9uZyBjdHJsX3JlZzsKKwl1bnNpZ25lZCBsb25nIHN0YXR1c19yZWc7CisJdW5zaWduZWQgbG9uZyBjaGFubmVsX2xpc3RfcmVnOworCXVuc2lnbmVkIGxvbmcgZGF0YV9yZWc7CisJdW5zaWduZWQgbG9uZyBjaGFuX3RpbWVyX3JlZzsKKwl1bnNpZ25lZCBsb25nIGNoYW5fcHJlX3RpbWVyX3JlZzsKKwl1bnNpZ25lZCBsb25nIHNjYW5fdGltZXJfbG93X3JlZzsKKwl1bnNpZ25lZCBsb25nIHNjYW5fdGltZXJfaGlnaF9yZWc7CisJdW5zaWduZWQgbG9uZyBzY2FuX3ByZV90aW1lcl9sb3dfcmVnOworCXVuc2lnbmVkIGxvbmcgc2Nhbl9wcmVfdGltZXJfaGlnaF9yZWc7CisJdW5zaWduZWQgbG9uZyBzdGFydF9yZWc7CisJdW5zaWduZWQgbG9uZyBpcnFfc3RhdHVzX3JlZzsKKwl1bnNpZ25lZCBsb25nIHNhbXBsZV9jb3VudGVyX3JlZzsKKworCXVuc2lnbmVkIGludCByYW5nZXNfbGVuOworCW1lNDYwMF9yYW5nZV9lbnRyeV90IHJhbmdlc1s0XTsJCQkJCS8qKjwgVGhlIHJhbmdlcyBhdmFpbGFibGUgb24gdGhpcyBzdWJkZXZpY2UuICovCisKKwkvKiBTb2Z0d2FyZSBidWZmZXIgKi8KKwltZV9jaXJjX2J1Zl90IGNpcmNfYnVmOwkJCQkJCQkvKio8IENpcmN1bGFyIGJ1ZmZlciBob2xkaW5nIG1lYXN1cm1lbnQgZGF0YS4gKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3F1ZXVlOwkJCQkJLyoqPCBXYWl0IHF1ZXVlIHRvIHB1dCBvbiB0YXNrcyB3YWl0aW5nIGZvciBkYXRhIHRvIGFycml2ZS4gKi8KKworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICptZTQ2MDBfd29ya3F1ZXVlOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgYWlfY29udHJvbF90YXNrOworI2Vsc2UKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGFpX2NvbnRyb2xfdGFzazsKKyNlbmRpZgorCisJdm9sYXRpbGUgaW50IGFpX2NvbnRyb2xfdGFza19mbGFnOwkJCQkvKio8IEZsYWcgY29udHJvbGluZyByZWV4ZWN1dGluZyBvZiBjb250cm9sIHRhc2sgKi8KKworI2lmZGVmIE1FREVCVUdfREVCVUdfUkVHCisJdW5zaWduZWQgbG9uZyByZWdfYmFzZTsKKyNlbmRpZgorfSBtZTQ2MDBfYWlfc3ViZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBjb25zdHJ1Y3RvciB0byBnZW5lcmF0ZSBhIE1FLTQwMDAgYW5hbG9nIGlucHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gcmVnX2Jhc2UgVGhlIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGFzIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUy4KKyAqIEBwYXJhbSBjaGFubmVscyBUaGUgbnVtYmVyIG9mIGFuYWxvZyBpbnB1dCBjaGFubmVscyBhdmFpbGFibGUgb24gdGhpcyBzdWJkZXZpY2UuCisgKiBAcGFyYW0gY2hhbm5lbHMgVGhlIG51bWJlciBvZiBhbmFsb2cgaW5wdXQgcmFuZ2VzIGF2YWlsYWJsZSBvbiB0aGlzIHN1YmRldmljZS4KKyAqIEBwYXJhbSBpc29sYXRlZCBGbGFnIGluZGljYXRpbmcgaWYgdGhpcyBkZXZpY2UgaXMgb3B0byBpc29sYXRlZC4KKyAqIEBwYXJhbSBzaCBGbGFnIGluZGljYXRpbmcgaWYgc2FtcGxlIGFuZCBob2xkIGRldmljZXMgYXJlIGF2YWlsYWJsZS4KKyAqIEBwYXJhbSBpcnEgVGhlIGlycSBudW1iZXIgYXNzaWduZWQgYnkgUENJIEJJT1MuCisgKiBAcGFyYW0gY3RybF9yZWdfbG9jayBQb2ludGVyIHRvIHNwaW4gbG9jayBwcm90ZWN0aW5nIHRoZSBjb250cm9sIHJlZ2lzdGVyIGZyb20gY29uY3VycmVudCBhY2Nlc3MuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLlxuCisgKiBOVUxMIG9uIGVycm9yLgorICovCittZTQ2MDBfYWlfc3ViZGV2aWNlX3QgKm1lNDYwMF9haV9jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbHMsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IHJhbmdlcywKKwkJCQkJICAgICBpbnQgaXNvbGF0ZWQsCisJCQkJCSAgICAgaW50IHNoLAorCQkJCQkgICAgIGludCBpcnEsCisJCQkJCSAgICAgc3BpbmxvY2tfdCAqIGN0cmxfcmVnX2xvY2ssCisJCQkJCSAgICAgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QKKwkJCQkJICAgICAqbWU0NjAwX3dxKTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfYWlfcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2FpX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4M2ZhYzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2FpX3JlZy5oCkBAIC0wLDAgKzEsMTA3IEBACisvKioKKyAqIEBmaWxlIG1lNDYwMF9haV9yZWcuaAorICoKKyAqIEBicmllZiBNRS00MDAwIGFuYWxvZyBpbnB1dCBzdWJkZXZpY2UgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU0NjAwX0FJX1JFR19IXworI2RlZmluZSBfTUU0NjAwX0FJX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX1JFRwkJCQkJMHg3NAkvLyBfL1cKKyNkZWZpbmUgTUU0NjAwX0FJX1NUQVRVU19SRUcJCQkJMHg3NAkvLyBSL18KKyNkZWZpbmUgTUU0NjAwX0FJX0NIQU5ORUxfTElTVF9SRUcJCQkweDc4CS8vIF8vVworI2RlZmluZSBNRTQ2MDBfQUlfREFUQV9SRUcJCQkJCTB4N0MJLy8gUi9fCisjZGVmaW5lIE1FNDYwMF9BSV9DSEFOX1RJTUVSX1JFRwkJCTB4ODAJLy8gXy9XCisjZGVmaW5lIE1FNDYwMF9BSV9DSEFOX1BSRV9USU1FUl9SRUcJCTB4ODQJLy8gXy9XCisjZGVmaW5lIE1FNDYwMF9BSV9TQ0FOX1RJTUVSX0xPV19SRUcJCTB4ODgJLy8gXy9XCisjZGVmaW5lIE1FNDYwMF9BSV9TQ0FOX1RJTUVSX0hJR0hfUkVHCQkweDhDCS8vIF8vVworI2RlZmluZSBNRTQ2MDBfQUlfU0NBTl9QUkVfVElNRVJfTE9XX1JFRwkweDkwCS8vIF8vVworI2RlZmluZSBNRTQ2MDBfQUlfU0NBTl9QUkVfVElNRVJfSElHSF9SRUcJMHg5NAkvLyBfL1cKKyNkZWZpbmUgTUU0NjAwX0FJX1NUQVJUX1JFRwkJCQkJMHg5OAkvLyBSL18KKworI2RlZmluZSBNRTQ2MDBfQUlfU0FNUExFX0NPVU5URVJfUkVHCQkweEMwCS8vIF8vVworCisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX0JJVF9NT0RFXzAJCQkweDAwMDAwMDAxCisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX0JJVF9NT0RFXzEJCQkweDAwMDAwMDAyCisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX0JJVF9NT0RFXzIJCQkweDAwMDAwMDA0CisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX0JJVF9TQU1QTEVfSE9MRAkJMHgwMDAwMDAwOAorI2RlZmluZSBNRTQ2MDBfQUlfQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AJMHgwMDAwMDAxMAorI2RlZmluZSBNRTQ2MDBfQUlfQ1RSTF9CSVRfU1RPUAkJCQkweDAwMDAwMDIwCisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX0JJVF9DSEFOTkVMX0ZJRk8JCTB4MDAwMDAwNDAKKyNkZWZpbmUgTUU0NjAwX0FJX0NUUkxfQklUX0RBVEFfRklGTwkJMHgwMDAwMDA4MAorI2RlZmluZSBNRTQ2MDBfQUlfQ1RSTF9CSVRfRlVMTFNDQUxFCQkweDAwMDAwMTAwCisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX0JJVF9PRkZTRVQJCQkweDAwMDAwMjAwCisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9UUklHX0FOQUxPRwkweDAwMDAwNDAwCisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9UUklHCQkJMHgwMDAwMDgwMAorI2RlZmluZSBNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfVFJJR19GQUxMSU5HCTB4MDAwMDEwMDAKKyNkZWZpbmUgTUU0NjAwX0FJX0NUUkxfQklUX0VYX0lSUQkJCTB4MDAwMDIwMDAKKyNkZWZpbmUgTUU0NjAwX0FJX0NUUkxfQklUX0VYX0lSUV9SRVNFVAkJMHgwMDAwNDAwMAorI2RlZmluZSBNRTQ2MDBfQUlfQ1RSTF9CSVRfTEVfSVJRCQkJMHgwMDAwODAwMAorI2RlZmluZSBNRTQ2MDBfQUlfQ1RSTF9CSVRfTEVfSVJRX1JFU0VUCQkweDAwMDEwMDAwCisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlEJCQkweDAwMDIwMDAwCisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX0JJVF9IRl9JUlFfUkVTRVQJCTB4MDAwNDAwMDAKKyNkZWZpbmUgTUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUQkJCTB4MDAwODAwMDAKKyNkZWZpbmUgTUU0NjAwX0FJX0NUUkxfQklUX1NDX0lSUV9SRVNFVAkJMHgwMDEwMDAwMAorI2RlZmluZSBNRTQ2MDBfQUlfQ1RSTF9CSVRfU0NfUkVMT0FECQkweDAwMjAwMDAwCisjZGVmaW5lIE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9UUklHX0JPVEgJCTB4ODAwMDAwMDAKKworI2RlZmluZSBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9FRl9DSEFOTkVMCQkweDAwNDAwMDAwCisjZGVmaW5lIE1FNDYwMF9BSV9TVEFUVVNfQklUX0hGX0NIQU5ORUwJCTB4MDA4MDAwMDAKKyNkZWZpbmUgTUU0NjAwX0FJX1NUQVRVU19CSVRfRkZfQ0hBTk5FTAkJMHgwMTAwMDAwMAorI2RlZmluZSBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9FRl9EQVRBCQkweDAyMDAwMDAwCisjZGVmaW5lIE1FNDYwMF9BSV9TVEFUVVNfQklUX0hGX0RBVEEJCTB4MDQwMDAwMDAKKyNkZWZpbmUgTUU0NjAwX0FJX1NUQVRVU19CSVRfRkZfREFUQQkJMHgwODAwMDAwMAorI2RlZmluZSBNRTQ2MDBfQUlfU1RBVFVTX0JJVF9MRQkJCQkweDEwMDAwMDAwCisjZGVmaW5lIE1FNDYwMF9BSV9TVEFUVVNfQklUX0ZTTQkJCTB4MjAwMDAwMDAKKworI2RlZmluZSBNRTQ2MDBfQUlfQ1RSTF9SUENJX0ZJRk8JCQkweDQwMDAwMDAwCS8vQWx3YXlzIHNldCB0byB6ZXJvIQorCisjZGVmaW5lIE1FNDYwMF9BSV9CQVNFX0ZSRVFVRU5DWQkJCTMzRTYKKworI2RlZmluZSBNRTQ2MDBfQUlfTUlOX0FDUV9USUNLUwkJCQk2NkxMCisjZGVmaW5lIE1FNDYwMF9BSV9NQVhfQUNRX1RJQ0tTCQkJCTB4RkZGRkZGRkZMTAorCisjZGVmaW5lIE1FNDYwMF9BSV9NSU5fU0NBTl9USUNLUwkJCTY2TEwKKyNkZWZpbmUgTUU0NjAwX0FJX01BWF9TQ0FOX1RJQ0tTCQkJMHhGRkZGRkZGRkZMTAorCisjZGVmaW5lIE1FNDYwMF9BSV9NSU5fQ0hBTl9USUNLUwkJCTY2TEwKKyNkZWZpbmUgTUU0NjAwX0FJX01BWF9DSEFOX1RJQ0tTCQkJMHhGRkZGRkZGRkxMCisKKyNkZWZpbmUgTUU0NjAwX0FJX0ZJRk9fQ09VTlQJCQkJMjA0OAorCisjZGVmaW5lIE1FNDYwMF9BSV9MSVNUX0NPVU5UCQkJCTEwMjQKKworI2RlZmluZSBNRTQ2MDBfQUlfTElTVF9JTlBVVF9TSU5HTEVfRU5ERUQJMHgwMDAKKyNkZWZpbmUgTUU0NjAwX0FJX0xJU1RfSU5QVVRfRElGRkVSRU5USUFMCTB4MDIwCisKKyNkZWZpbmUgTUU0NjAwX0FJX0xJU1RfUkFOR0VfQklQT0xBUl8xMAkJMHgwMDAKKyNkZWZpbmUgTUU0NjAwX0FJX0xJU1RfUkFOR0VfQklQT0xBUl8yXzUJMHgwNDAKKyNkZWZpbmUgTUU0NjAwX0FJX0xJU1RfUkFOR0VfVU5JUE9MQVJfMTAJMHgwODAKKyNkZWZpbmUgTUU0NjAwX0FJX0xJU1RfUkFOR0VfVU5JUE9MQVJfMl81CTB4MEMwCisKKyNkZWZpbmUgTUU0NjAwX0FJX0xJU1RfTEFTVF9FTlRSWQkJMHgxMDAKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfYW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfYW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmJlYzgyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9hby5jCkBAIC0wLDAgKzEsNjAxMSBAQAorLyoqCisgKiBAZmlsZSBtZTQ2MDBfYW8uYworICoKKyAqIEBicmllZiBNRS00MDAwIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvLy9Db21tb24gcGFydC4gKEZvciBub3JtYWwgYW5kIEJvc2NoIGJ1aWxkcy4pCisKKy8qIEluY2x1ZGVzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZWlkcy5oIgorI2luY2x1ZGUgIm1lNDYwMF9yZWcuaCIKKyNpbmNsdWRlICJtZTQ2MDBfYW9fcmVnLmgiCisjaW5jbHVkZSAibWU0NjAwX2FvLmgiCisKKy8qIERlZmluZXMKKyAqLworCitzdGF0aWMgaW50IG1lNDYwMF9hb19xdWVyeV9yYW5nZV9ieV9taW5fbWF4KG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICAgaW50IHVuaXQsCisJCQkJCSAgICBpbnQgKm1pbiwKKwkJCQkJICAgIGludCAqbWF4LCBpbnQgKm1heGRhdGEsIGludCAqcmFuZ2UpOworCitzdGF0aWMgaW50IG1lNDYwMF9hb19xdWVyeV9udW1iZXJfcmFuZ2VzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgaW50IHVuaXQsIGludCAqY291bnQpOworCitzdGF0aWMgaW50IG1lNDYwMF9hb19xdWVyeV9yYW5nZV9pbmZvKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIGludCByYW5nZSwKKwkJCQkgICAgICBpbnQgKnVuaXQsCisJCQkJICAgICAgaW50ICptaW4sIGludCAqbWF4LCBpbnQgKm1heGRhdGEpOworCitzdGF0aWMgaW50IG1lNDYwMF9hb19xdWVyeV90aW1lcihtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgaW50IHRpbWVyLAorCQkJCSBpbnQgKmJhc2VfZnJlcXVlbmN5LAorCQkJCSBsb25nIGxvbmcgKm1pbl90aWNrcywgbG9uZyBsb25nICptYXhfdGlja3MpOworCitzdGF0aWMgaW50IG1lNDYwMF9hb19xdWVyeV9udW1iZXJfY2hhbm5lbHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgIGludCAqbnVtYmVyKTsKKworc3RhdGljIGludCBtZTQ2MDBfYW9fcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpOworCitzdGF0aWMgaW50IG1lNDYwMF9hb19xdWVyeV9zdWJkZXZpY2VfY2FwcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICBpbnQgKmNhcHMpOworCitzdGF0aWMgaW50IG1lNDYwMF9hb19xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgICAgIGludCBjYXAsIGludCAqYXJncywgaW50IGNvdW50KTsKKworI2lmbmRlZiBCT1NDSAorLy8vIEBub3RlIE5PUk1BTCBCVUlMRAorLy8vIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UgICAoay5nYW50emtlQG1laWxoYXVzLmRlKQorLyogSW5jbHVkZXMKKyAqLworCisjIGluY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisvKiBEZWZpbmVzCisgKi8KKworLyoqIFJlbW92ZSBzdWJkZXZpY2UuCisqLworc3RhdGljIHZvaWQgbWU0NjAwX2FvX2Rlc3RydWN0b3Ioc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlKTsKKworLyoqIFJlc2V0IHN1YmRldmljZS4gU3RvcCBhbGwgYWN0aW9ucy4gUmVzZXQgcmVnaXN0cnkuIERpc2FibGUgRklGTy4gU2V0IG91dHB1dCB0byAwViBhbmQgc3RhdHVzIHRvICdub25lJy4KKyovCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19yZXNldF9zdWJkZXZpY2UobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCXN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGZsYWdzKTsKKworLyoqIFNldCBvdXRwdXQgYXMgc2luZ2xlCisqLworc3RhdGljIGludCBtZTQ2MDBfYW9faW9fc2luZ2xlX2NvbmZpZyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgaW50IHNpbmdsZV9jb25maWcsCisJCQkJICAgICAgaW50IHJlZiwKKwkJCQkgICAgICBpbnQgdHJpZ19jaGFuLAorCQkJCSAgICAgIGludCB0cmlnX3R5cGUsIGludCB0cmlnX2VkZ2UsIGludCBmbGFncyk7CisKKy8qKiBQYXNzIHRvIHVzZXIgYWN0dWFsIHZhbHVlIG9mIG91dHB1dC4KKyovCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpOworCisvKiogV3JpdGUgdG8gb3V0cHV0IHJlcXVlZCB2YWx1ZS4KKyovCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19zaW5nbGVfd3JpdGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgIGludCB2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpOworCisvKiogU2V0IG91dHB1dCBhcyBzdHJlYW1lZCBkZXZpY2UuCisqLworc3RhdGljIGludCBtZTQ2MDBfYW9faW9fc3RyZWFtX2NvbmZpZyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgbWVJT1N0cmVhbUNvbmZpZ190ICogY29uZmlnX2xpc3QsCisJCQkJICAgICAgaW50IGNvdW50LAorCQkJCSAgICAgIG1lSU9TdHJlYW1UcmlnZ2VyX3QgKiB0cmlnZ2VyLAorCQkJCSAgICAgIGludCBmaWZvX2lycV90aHJlc2hvbGQsIGludCBmbGFncyk7CisKKy8qKiBXYWl0IGZvciAvIENoZWNrIGVtcHR5IHNwYWNlIGluIGJ1ZmZlci4KKyovCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19zdHJlYW1fbmV3X3ZhbHVlcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJCSAgaW50IHRpbWVfb3V0LCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpOworCisvKiogU3RhcnQgc3RyZWFtaW5nLgorKi8KK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3N0cmVhbV9zdGFydChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBzdGFydF9tb2RlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncyk7CisKKy8qKiBDaGVjayBhY3R1YWwgc3RhdGUuIC8gV2FpdCBmb3IgZW5kLgorKi8KK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3N0cmVhbV9zdGF0dXMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCB3YWl0LAorCQkJCSAgICAgIGludCAqc3RhdHVzLCBpbnQgKnZhbHVlcywgaW50IGZsYWdzKTsKKworLyoqIFN0b3Agc3RyZWFtaW5nLgorKi8KK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3N0cmVhbV9zdG9wKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCBzdG9wX21vZGUsIGludCBmbGFncyk7CisKKy8qKiBXcml0ZSBkYXRhcyB0byBidWZmb3IuCisqLworc3RhdGljIGludCBtZTQ2MDBfYW9faW9fc3RyZWFtX3dyaXRlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IHdyaXRlX21vZGUsCisJCQkJICAgICBpbnQgKnZhbHVlcywgaW50ICpjb3VudCwgaW50IGZsYWdzKTsKKworLyoqIEludGVycnVwdCBoYW5kbGVyLiBDb3B5IGZyb20gYnVmZmVyIHRvIEZJRk8uCisqLworc3RhdGljIGlycXJldHVybl90IG1lNDYwMF9hb19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwgNiwgMTkpCisJCQkJICwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MKKyNlbmRpZgorICAgICk7CisvKiogQ29weSBkYXRhIGZyb20gY2lyY3VsYXIgYnVmZmVyIHRvIGZpZm8gKGZhc3QpIGluIHdyYXBhcm91bmQgbW9kZS4KKyovCitpbnQgaW5saW5lIGFvX3dyaXRlX2RhdGFfd3JhcGFyb3VuZChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgaW50IGNvdW50LAorCQkJCSAgICBpbnQgc3RhcnRfcG9zKTsKKworLyoqIENvcHkgZGF0YSBmcm9tIGNpcmN1bGFyIGJ1ZmZlciB0byBmaWZvIChmYXN0KS4KKyovCitpbnQgaW5saW5lIGFvX3dyaXRlX2RhdGEobWU0NjAwX2FvX3N1YmRldmljZV90ICogaW5zdGFuY2UsIGludCBjb3VudCwKKwkJCSBpbnQgc3RhcnRfcG9zKTsKKworLyoqIENvcHkgZGF0YSBmcm9tIGNpcmN1bGFyIGJ1ZmZlciB0byBmaWZvIChzbG93KS4KKyovCitpbnQgaW5saW5lIGFvX3dyaXRlX2RhdGFfcG9vbGluZyhtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgaW50IGNvdW50LAorCQkJCSBpbnQgc3RhcnRfcG9zKTsKKworLyoqIENvcHkgZGF0YSBmcm9tIHVzZXIgc3BhY2UgdG8gY2lyY3VsYXIgYnVmZmVyLgorKi8KK2ludCBpbmxpbmUgYW9fZ2V0X2RhdGFfZnJvbV91c2VyKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqIGluc3RhbmNlLCBpbnQgY291bnQsCisJCQkJIGludCAqdXNlcl92YWx1ZXMpOworCisvKiogU3RvcCBwcmVzZW50YXRpb24uIFByZXNlcnZlIEZJRk9zLgorKi8KK2ludCBpbmxpbmUgYW9fc3RvcF9pbW1lZGlhdGVseShtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSk7CisKKy8qKiBUYXNrIGZvciBhc3luY2hyb25pY2FsIHN0YXRlIHZlcmlmeWluZy4KKyovCitzdGF0aWMgdm9pZCBtZTQ2MDBfYW9fd29ya19jb250cm9sX3Rhc2soCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorCQkJCQkgICAgICAgdm9pZCAqc3ViZGV2aWNlCisjZWxzZQorCQkJCQkgICAgICAgc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrCisjZW5kaWYKKyAgICApOworLyogRnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBtZTQ2MDBfYW9faW9fcmVzZXRfc3ViZGV2aWNlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQzMl90IHRtcDsKKworCWluc3RhbmNlID0gKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX25vbmU7CisJaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrKTsKKwlpbnN0YW5jZS0+dGltZW91dC5kZWxheSA9IDA7CisJaW5zdGFuY2UtPnRpbWVvdXQuc3RhcnRfdGltZSA9IGppZmZpZXM7CisKKwkvL1N0b3Agc3RhdGUgbWFjaGluZS4KKwllcnIgPSBhb19zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKworCS8vUmVtb3ZlIGZyb20gc3luY2hyb25vdXMgc3RhcnQuCisJc3Bpbl9sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKwl0bXAgPSBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwl0bXAgJj0KKwkgICAgfigoTUU0NjAwX0FPX1NZTkNfSE9MRCB8IE1FNDYwMF9BT19TWU5DX0VYVF9UUklHKSA8PCBpbnN0YW5jZS0+CisJICAgICAgYW9faWR4KTsKKwlvdXRsKHRtcCwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKwkqaW5zdGFuY2UtPnByZWxvYWRfZmxhZ3MgJj0KKwkgICAgfigoTUU0NjAwX0FPX1NZTkNfSE9MRCB8IE1FNDYwMF9BT19TWU5DX0VYVF9UUklHKSA8PCBpbnN0YW5jZS0+CisJICAgICAgYW9faWR4KTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisKKwkvL1NldCBzaW5nbGUgbW9kZSwgZGlzc2FibGUgRklGTywgZGlzc2FibGUgZXh0ZXJuYWwgdHJpZ2dlciwgc2V0IG91dHB1dCB0byBhbmFsb2csIGJsb2NrIGludGVycnVwdC4KKwlvdXRsKE1FNDYwMF9BT19NT0RFX1NJTkdMRSB8IE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QIHwKKwkgICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCB8IE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlEsCisJICAgICBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBNRTQ2MDBfQU9fTU9ERV9TSU5HTEUgfCBNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8CisJCSAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCB8CisJCSAgIE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlEpOworCisJLy9TZXQgb3V0cHV0IHRvIDBWCisJb3V0bCgweDgwMDAsIGluc3RhbmNlLT5zaW5nbGVfcmVnKTsKKwlQREVCVUdfUkVHKCJzaW5nbGVfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnNpbmdsZV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDB4ODAwMCk7CisKKwlpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCA9IDA7CisJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgPSAwOworCWluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgPSAwOworCWluc3RhbmNlLT5kYXRhX2NvdW50ID0gMDsKKwlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0gMHg4MDAwOworCWluc3RhbmNlLT5zaW5nbGVfdmFsdWVfaW5fZmlmbyA9IDB4ODAwMDsKKworCS8vU2V0IHN0YXR1cyB0byBzaWduYWwgdGhhdCBkZXZpY2UgaXMgdW5jb25maWd1cmVkLgorCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfbm9uZTsKKworCS8vU2lnbmFsIHJlc2V0IGlmIHVzZXIgaXMgb24gd2FpdC4KKwl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3NpbmdsZV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCBzaW5nbGVfY29uZmlnLAorCQkJCSAgICAgIGludCByZWYsCisJCQkJICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICBpbnQgdHJpZ190eXBlLCBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1aW50MzJfdCBjdHJsOworCXVpbnQzMl90IHN5bmM7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCS8vIENoZWNraW5nIHBhcmFtZXRlcnMKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SCisJCSAgICAoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuIE11c3QgYmUgTUVfSU9fU0lOR0xFX0NPTkZJR19OT19GTEFHUy5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlzd2l0Y2ggKHRyaWdfdHlwZSkgeworCWNhc2UgTUVfVFJJR19UWVBFX1NXOgorCQlpZiAodHJpZ19lZGdlICE9IE1FX1RSSUdfRURHRV9OT05FKSB7CisJCQlQRVJST1IKKwkJCSAgICAoIkludmFsaWQgdHJpZ2dlciBlZGdlLiBTb2Z0d2FyZSB0cmlnZ2VyIGhhcyBub3QgZWRnZS5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVFJJR19FREdFOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9UUklHX1RZUEVfRVhUX0RJR0lUQUw6CisJCXN3aXRjaCAodHJpZ19lZGdlKSB7CisJCWNhc2UgTUVfVFJJR19FREdFX0FOWToKKwkJY2FzZSBNRV9UUklHX0VER0VfUklTSU5HOgorCQljYXNlIE1FX1RSSUdfRURHRV9GQUxMSU5HOgorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCVBFUlJPUigiSW52YWxpZCB0cmlnZ2VyIGVkZ2UuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RSSUdfRURHRTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUgorCQkgICAgKCJJbnZhbGlkIHRyaWdnZXIgdHlwZS4gVHJpZ2dlciBtdXN0IGJlIHNvZnR3YXJlIG9yIGRpZ2l0YWwuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVFJJR19UWVBFOworCX0KKworCWlmICgodHJpZ19jaGFuICE9IE1FX1RSSUdfQ0hBTl9ERUZBVUxUKQorCSAgICAmJiAodHJpZ19jaGFuICE9IE1FX1RSSUdfQ0hBTl9TWU5DSFJPTk9VUykpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRyaWdnZXIgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVFJJR19DSEFOOworCX0KKworCWlmIChyZWYgIT0gTUVfUkVGX0FPX0dST1VORCkgeworCQlQRVJST1IKKwkJICAgICgiSW52YWxpZCByZWZlcmVuY2UuIEFuYWxvZyBvdXRwdXRzIGhhdmUgdG8gaGF2ZSBnb3QgUkVGX0FPX0dST1VORC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SRUY7CisJfQorCisJaWYgKHNpbmdsZV9jb25maWcgIT0gMCkgeworCQlQRVJST1IKKwkJICAgICgiSW52YWxpZCBzaW5nbGUgY29uZmlnIHNwZWNpZmllZC4gT25seSBvbmUgcmFuZ2UgZm9yIGFubG9nIG91dHB1dHMgaXMgYXZhaWxhYmxlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NJTkdMRV9DT05GSUc7CisJfQorCisJaWYgKGNoYW5uZWwgIT0gMCkgeworCQlQRVJST1IKKwkJICAgICgiSW52YWxpZCBjaGFubmVsIG51bWJlciBzcGVjaWZpZWQuIEFuYWxvZyBvdXRwdXQgaGF2ZSBvbmx5IG9uZSBjaGFubmVsLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJLy9TdWJkZXZpY2UgcnVubmluZyBpbiBzdHJlYW0gbW9kZSEKKwlpZiAoKGluc3RhbmNlLT5zdGF0dXMgPj0gYW9fc3RhdHVzX3N0cmVhbV9ydW5fd2FpdCkKKwkgICAgJiYgKGluc3RhbmNlLT5zdGF0dXMgPCBhb19zdGF0dXNfc3RyZWFtX2VuZCkpIHsKKwkJUEVSUk9SKCJTdWJkZXZpY2UgaXMgYnVzeS5cbiIpOworCQlNRV9TVUJERVZJQ0VfRVhJVDsKKworCQlyZXR1cm4gTUVfRVJSTk9fU1VCREVWSUNFX0JVU1k7CisJfQorLy8vIEBub3RlIEZvciBzaW5nbGUgYWxsIGNhbGxzIChjb25maWcgYW5kIHdyaXRlKSBhcmUgZXJhc2luZyBwcmV2aW91cyBzdGF0ZSEKKworCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfbm9uZTsKKworCS8vIENvcnJlY3Qgc2luZ2xlIG1pcnJvcnMKKwlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlX2luX2ZpZm8gPSBpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlOworCisJLy9TdG9wIGRldmljZQorCWVyciA9IGFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCWlmIChlcnIpIHsKKwkJUEVSUk9SX0NSSVRJQ0FMKCJGU00gSVMgQlVTWSFcbiIpOworCQlNRV9TVUJERVZJQ0VfRVhJVDsKKworCQlyZXR1cm4gTUVfRVJSTk9fU1VCREVWSUNFX0JVU1k7CisJfQorCS8vIFNldCBjb250cm9sIHJlZ2lzdGVyLgorCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJLy8gU2V0IHN0b3AgYml0LiBTdG9wIHN0cmVhbWluZyBtb2RlLgorCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkvL1Jlc2V0IGFsbCBiaXRzLgorCWN0cmwgPSBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfCBNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUDsKKworCWlmICh0cmlnX3R5cGUgPT0gTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMKSB7CisJCVBJTkZPKCJFeHRlcm5hbCBkaWdpdGFsIHRyaWdnZXIuXG4iKTsKKworCQlpZiAodHJpZ19lZGdlID09IE1FX1RSSUdfRURHRV9BTlkpIHsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RybCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFIHwgTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRV9CT1RIOworCQkJaW5zdGFuY2UtPmN0cmxfdHJnID0KKwkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFIHwKKwkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFX0JPVEg7CisJCX0gZWxzZSBpZiAodHJpZ19lZGdlID09IE1FX1RSSUdfRURHRV9GQUxMSU5HKSB7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmwgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRTsKKwkJCWluc3RhbmNlLT5jdHJsX3RyZyA9IE1FNDYwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0U7CisJCX0gZWxzZSBpZiAodHJpZ19lZGdlID09IE1FX1RSSUdfRURHRV9SSVNJTkcpIHsKKwkJCWluc3RhbmNlLT5jdHJsX3RyZyA9IDB4MDsKKwkJfQorCX0gZWxzZSBpZiAodHJpZ190eXBlID09IE1FX1RSSUdfVFlQRV9TVykgeworCQlQREVCVUcoIlNvZnR3YXJlIHRyaWdnZXJcbiIpOworCQlpbnN0YW5jZS0+Y3RybF90cmcgPSAweDA7CisJfQorCisJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwkvLyBTZXQgcHJlbG9hZC9zeW5jaHJvbml6YXRpb24gcmVnaXN0ZXIuCisJc3Bpbl9sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKwlpZiAodHJpZ190eXBlID09IE1FX1RSSUdfVFlQRV9TVykgeworCQkqaW5zdGFuY2UtPnByZWxvYWRfZmxhZ3MgJj0KKwkJICAgIH4oTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUcgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJfSBlbHNlCQkJLy9pZiAodHJpZ190eXBlID09IE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTCkKKwl7CisJCSppbnN0YW5jZS0+cHJlbG9hZF9mbGFncyB8PQorCQkgICAgTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUcgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKwl9CisKKwlpZiAodHJpZ19jaGFuID09IE1FX1RSSUdfQ0hBTl9ERUZBVUxUKSB7CisJCSppbnN0YW5jZS0+cHJlbG9hZF9mbGFncyAmPQorCQkgICAgfihNRTQ2MDBfQU9fU1lOQ19IT0xEIDw8IGluc3RhbmNlLT5hb19pZHgpOworCX0gZWxzZQkJCS8vaWYgKHRyaWdfY2hhbiA9PSBNRV9UUklHX0NIQU5fU1lOQ0hST05PVVMpCisJeworCQkqaW5zdGFuY2UtPnByZWxvYWRfZmxhZ3MgfD0KKwkJICAgIE1FNDYwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKwl9CisKKwkvL1Jlc2V0IGhhcmR3YXJlIHJlZ2lzdGVyCisJc3luYyA9IGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCVBERUJVR19SRUcoInByZWxvYWRfcmVnIGlubCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHN5bmMpOworCXN5bmMgJj0gfihNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJRyA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwlzeW5jIHw9IE1FNDYwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKworCS8vT3V0cHV0IGNvbmZpZ3VyZWQgaW4gZGVmYXVsdCAoc2FmZSkgbW9kZS4KKwlvdXRsKHN5bmMsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHN5bmMpOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKworCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc2luZ2xlX2NvbmZpZ3VyZWQ7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3NpbmdsZV9yZWFkKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCBjaGFubmVsLAorCQkJCSAgICBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCisJdW5zaWduZWQgbG9uZyBqOworCXVuc2lnbmVkIGxvbmcgZGVsYXkgPSAwOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoZmxhZ3MgJiB+TUVfSU9fU0lOR0xFX05PTkJMT0NLSU5HKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC4gJWRcbiIsIGZsYWdzKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKHRpbWVfb3V0IDwgMCkgeworCQlQRVJST1IoIkludmFsaWQgdGltZW91dCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVElNRU9VVDsKKwl9CisKKwlpZiAoY2hhbm5lbCAhPSAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAoKGluc3RhbmNlLT5zdGF0dXMgPj0gYW9fc3RhdHVzX3N0cmVhbV9jb25maWd1cmVkKQorCSAgICAmJiAoaW5zdGFuY2UtPnN0YXR1cyA8PSBhb19zdGF0dXNfc3RyZWFtX2VuZCkpIHsKKwkJUEVSUk9SKCJTdWJkZXZpY2Ugbm90IGNvbmZpZ3VyZWQgdG8gd29yayBpbiBzaW5nbGUgbW9kZSFcbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKwlpZiAoKCFmbGFncykgJiYgKGluc3RhbmNlLT5zdGF0dXMgPT0gYW9fc3RhdHVzX3NpbmdsZV9ydW5fd2FpdCkpIHsJLy9CbG9ja2luZyBtb2RlLiBXYWl0IGZvciB0cmlnZ2VyLgorCQlpZiAodGltZV9vdXQpIHsKKwkJCWRlbGF5ID0gKHRpbWVfb3V0ICogSFopIC8gMTAwMDsKKwkJCWlmIChkZWxheSA9PSAwKQorCQkJCWRlbGF5ID0gMTsKKwkJfQorCisJCWogPSBqaWZmaWVzOworCisJCS8vT25seSBydW5pbmcgcHJvY2VzcyB3aWxsIGludGVycnVwdCB0aGlzIGNhbGwuIEV2ZW50cyBhcmUgc2lnbmFsZWQgd2hlbiBzdGF0dXMgY2hhbmdlLiBUaGlzIHByb2NlZHVyZSBoYXMgb3duIHRpbWVvdXQuCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJIChpbnN0YW5jZS0+c3RhdHVzICE9CisJCQkJCQkgIGFvX3N0YXR1c19zaW5nbGVfcnVuX3dhaXQpLAorCQkJCQkJIChkZWxheSkgPyBkZWxheSArCisJCQkJCQkgMSA6IExPTkdfTUFYKTsKKworCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfbm9uZSkgeworCQkJUERFQlVHKCJTaW5nbGUgY2FuY2VsZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0NBTkNFTExFRDsKKwkJfQorCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJUEVSUk9SKCJXYWl0IG9uIHN0YXJ0IG9mIHN0YXRlIG1hY2hpbmUgaW50ZXJydXB0ZWQuXG4iKTsKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfbm9uZTsKKwkJCWFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQl9CisKKwkJaWYgKChkZWxheSkgJiYgKChqaWZmaWVzIC0gaikgPj0gZGVsYXkpKSB7CisKKwkJCVBERUJVRygiVGltZW91dCByZWFjaGVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19USU1FT1VUOworCQl9CisKKwkJKnZhbHVlID0KKwkJICAgICghZXJyKSA/IGluc3RhbmNlLT5zaW5nbGVfdmFsdWVfaW5fZmlmbyA6IGluc3RhbmNlLT4KKwkJICAgIHNpbmdsZV92YWx1ZTsKKwl9IGVsc2UgewkJLy9Ob24tYmxvY2tpbmcgbW9kZQorCQkvL1JlYWQgdmFsdWUKKwkJKnZhbHVlID0gaW5zdGFuY2UtPnNpbmdsZV92YWx1ZTsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3NpbmdsZV93cml0ZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgaW50IHZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCXVuc2lnbmVkIGxvbmcgajsKKwl1bnNpZ25lZCBsb25nIGRlbGF5ID0gMHgwOworCisJLy9SZWdpc3RyeSBoYW5kbGluZyB2YXJpYWJsZXMuCisJdWludDMyX3Qgc3luY19tYXNrOworCXVpbnQzMl90IG1vZGU7CisJdWludDMyX3QgdG1wOworCXVpbnQzMl90IGN0cmw7CisJdWludDMyX3Qgc3RhdHVzOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoZmxhZ3MgJgorCSAgICB+KE1FX0lPX1NJTkdMRV9UWVBFX1RSSUdfU1lOQ0hST05PVVMgfAorCSAgICAgIE1FX0lPX1NJTkdMRV9UWVBFX1dSSVRFX05PTkJMT0NLSU5HKSkgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKHRpbWVfb3V0IDwgMCkgeworCQlQRVJST1IoIkludmFsaWQgdGltZW91dCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVElNRU9VVDsKKwl9CisKKwlpZiAodmFsdWUgJiB+TUU0NjAwX0FPX01BWF9EQVRBKSB7CisJCVBFUlJPUigiSW52YWxpZCB2YWx1ZSBwcm92aWRlZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fVkFMVUVfT1VUX09GX1JBTkdFOworCX0KKworCWlmIChjaGFubmVsICE9IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCWlmICgoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfbm9uZSkKKwkgICAgfHwgKGluc3RhbmNlLT5zdGF0dXMgPiBhb19zdGF0dXNfc2luZ2xlX2VuZCkpIHsKKwkJUEVSUk9SKCJTdWJkZXZpY2Ugbm90IGNvbmZpZ3VyZWQgdG8gd29yayBpbiBzaW5nbGUgbW9kZSFcbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworLy8vIEBub3RlIEZvciBzaW5nbGUgYWxsIGNhbGxzIChjb25maWcgYW5kIHdyaXRlKSBhcmUgZXJhc2luZyBwcmV2aW91cyBzdGF0ZSEKKworCS8vQ2FuY2VsIGNvbnRyb2wgdGFzaworCVBERUJVRygiQ2FuY2VsIGNvbnRyb2wgdGFzay4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKwlpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgPSAwOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmluc3RhbmNlLT5hb19jb250cm9sX3Rhc2spOworCisJLy8gQ29ycmVjdCBzaW5nbGUgbWlycm9ycworCWluc3RhbmNlLT5zaW5nbGVfdmFsdWVfaW5fZmlmbyA9IGluc3RhbmNlLT5zaW5nbGVfdmFsdWU7CisKKwkvL1N0b3AgZGV2aWNlCisJZXJyID0gYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJaWYgKGVycikgeworCQlQRVJST1JfQ1JJVElDQUwoIkZTTSBJUyBCVVNZIVxuIik7CisJCU1FX1NVQkRFVklDRV9FWElUOworCisJCXJldHVybiBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwl9CisKKwlpZiAodGltZV9vdXQpIHsKKwkJZGVsYXkgPSAodGltZV9vdXQgKiBIWikgLyAxMDAwOworCisJCWlmIChkZWxheSA9PSAwKQorCQkJZGVsYXkgPSAxOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlX2luX2ZpZm8gPSB2YWx1ZTsKKworCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCWlmICghaW5zdGFuY2UtPmZpZm8pIHsJLy9ObyBGSUZPCisJCS8vU2V0IHRoZSBzaW5nbGUgbW9kZS4KKwkJY3RybCAmPSB+TUU0NjAwX0FPX0NUUkxfTU9ERV9NQVNLOworCisJCS8vV3JpdGUgdmFsdWUKKwkJUERFQlVHKCJXcml0ZSB2YWx1ZVxuIik7CisJCW91dGwodmFsdWUsIGluc3RhbmNlLT5zaW5nbGVfcmVnKTsKKwkJUERFQlVHX1JFRygic2luZ2xlX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnNpbmdsZV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHZhbHVlKTsKKwl9IGVsc2UgewkJLy8gbWl4LW1vZGUKKwkJLy9TZXQgc3BlZWQKKwkJb3V0bChNRTQ2MDBfQU9fTUlOX0NIQU5fVElDS1MgLSAxLCBpbnN0YW5jZS0+dGltZXJfcmVnKTsKKwkJUERFQlVHX1JFRygidGltZXJfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+dGltZXJfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgKGludClNRTQ2MDBfQU9fTUlOX0NIQU5fVElDS1MpOworCQlpbnN0YW5jZS0+aGFyZHdhcmVfc3RvcF9kZWxheSA9IEhaIC8gMTA7CS8vMTAwbXMKKworCQlzdGF0dXMgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpOworCisJCS8vU2V0IHRoZSBjb250aW5vdXMgbW9kZS4KKwkJY3RybCAmPSB+TUU0NjAwX0FPX0NUUkxfTU9ERV9NQVNLOworCQljdHJsIHw9IE1FNDYwMF9BT19NT0RFX0NPTlRJTlVPVVM7CisKKwkJLy9QcmVwYXJlIEZJRk8KKwkJaWYgKCEoY3RybCAmIE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRklGTykpIHsJLy9GSUZPIHdhc24ndCBlbmFiZWxlZC4gRG8gaXQuCisJCQlQSU5GTygiRW5hYmxlaW5nIEZJRk8uXG4iKTsKKwkJCWN0cmwgJj0gfk1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQkJY3RybCB8PQorCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRklGTyB8CisJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKwkJfSBlbHNlIHsJLy9DaGVjayBpZiBGSUZPIGlzIGVtcHR5CisJCQlpZiAoc3RhdHVzICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRUYpIHsJLy9GSUZPIG5vdCBlbXB0eQorCQkJCVBJTkZPKCJSZXNldGluZyBGSUZPLlxuIik7CisJCQkJY3RybCAmPQorCQkJCSAgICB+KE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRklGTyB8CisJCQkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlEpOworCQkJCWN0cmwgfD0gTUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKwkJCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLQorCQkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCisJCQkJY3RybCB8PQorCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk8gfAorCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJROworCQkJfSBlbHNlIHsJLy9GSUZPIGVtcHR5LCBvbmx5IGludGVycnVwdCBuZWVkcyB0byBiZSBkaXNhYmxlZCEKKwkJCQljdHJsICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCQljdHJsIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlE7CisJCQl9CisJCX0KKworCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCisJCS8vV3JpdGUgb3V0cHV0IC0gMSB2YWx1ZSB0byBGSUZPCisJCWlmIChpbnN0YW5jZS0+YW9faWR4ICYgMHgxKSB7CisJCQlvdXRsKHZhbHVlIDw8PSAxNiwgaW5zdGFuY2UtPmZpZm9fcmVnKTsKKwkJCVBERUJVR19SRUcoImZpZm9fcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5maWZvX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICB2YWx1ZSA8PD0gMTYpOworCQl9IGVsc2UgeworCQkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPmZpZm9fcmVnKTsKKwkJCVBERUJVR19SRUcoImZpZm9fcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5maWZvX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICB2YWx1ZSk7CisJCX0KKwl9CisKKwltb2RlID0gKmluc3RhbmNlLT5wcmVsb2FkX2ZsYWdzID4+IGluc3RhbmNlLT5hb19pZHg7CisJbW9kZSAmPSAoTUU0NjAwX0FPX1NZTkNfSE9MRCB8IE1FNDYwMF9BT19TWU5DX0VYVF9UUklHKTsKKworCVBJTkZPKCJUcmlnZ2VyaW5nIG1vZGU6IDB4JXhcbiIsIG1vZGUpOworCisJc3Bpbl9sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKwlzeW5jX21hc2sgPSBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBpbmwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBzeW5jX21hc2spOworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgMDoJCS8vSW5kaXZpZHVhbCBzb2Z0d2FyZQorCQljdHJsICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUc7CisKKwkJaWYgKCFpbnN0YW5jZS0+ZmlmbykgewkvLyBObyBGSUZPIC0gSW4gdGhpcyBjYXNlIHJlc2V0dGluZyAnTUU0NjAwX0FPX1NZTkNfSE9MRCcgd2lsbCB0cmlnZ2VyIG91dHB1dC4KKwkJCWlmICgoc3luY19tYXNrICYgKChNRTQ2MDBfQU9fU1lOQ19IT0xEIHwgTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUcpIDw8IGluc3RhbmNlLT5hb19pZHgpKSAhPSBNRTQ2MDBfQU9fU1lOQ19IT0xEKSB7CS8vTm93IHdlIGNhbiBzZXQgY29ycmVjdCBtb2RlLiBUaGlzIGlzIGV4Y2VwdGlvbi4gSXQgaXMgc2V0IHRvIHN5bmNocm9ub3VzIGFuZCB0cmlnZ2VyZWQgbGF0ZXIuCisJCQkJc3luY19tYXNrICY9CisJCQkJICAgIH4oTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUcgPDwgaW5zdGFuY2UtPgorCQkJCSAgICAgIGFvX2lkeCk7CisJCQkJc3luY19tYXNrIHw9CisJCQkJICAgIE1FNDYwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKworCQkJCW91dGwoc3luY19tYXNrLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJCVBERUJVR19SRUcKKwkJCQkgICAgKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgICAgc3luY19tYXNrKTsKKwkJCX0KKwkJfSBlbHNlIHsJLy8gRklGTworCQkJaWYgKChzeW5jX21hc2sgJiAoKE1FNDYwMF9BT19TWU5DX0hPTEQgfCBNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJRykgPDwgaW5zdGFuY2UtPmFvX2lkeCkpICE9IDB4MCkgewkvL05vdyB3ZSBjYW4gc2V0IGNvcnJlY3QgbW9kZS4KKwkJCQlzeW5jX21hc2sgJj0KKwkJCQkgICAgfigoTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUcgfAorCQkJCSAgICAgICBNRTQ2MDBfQU9fU1lOQ19IT0xEKSA8PCBpbnN0YW5jZS0+CisJCQkJICAgICAgYW9faWR4KTsKKworCQkJCW91dGwoc3luY19tYXNrLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJCVBERUJVR19SRUcKKwkJCQkgICAgKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgICAgc3luY19tYXNrKTsKKwkJCX0KKwkJfQorCQlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0gdmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJRzoJLy9JbmRpdmlkdWFsIGhhcmR3YXJlCisJCWN0cmwgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHOworCisJCWlmICghaW5zdGFuY2UtPmZpZm8pIHsJLy8gTm8gRklGTyAtIEluIHRoaXMgY2FzZSByZXNldHRpbmcgJ01FNDYwMF9BT19TWU5DX0hPTEQnIHdpbGwgdHJpZ2dlciBvdXRwdXQuCisJCQlpZiAoKHN5bmNfbWFzayAmICgoTUU0NjAwX0FPX1NZTkNfSE9MRCB8IE1FNDYwMF9BT19TWU5DX0VYVF9UUklHKSA8PCBpbnN0YW5jZS0+YW9faWR4KSkgIT0gTUU0NjAwX0FPX1NZTkNfSE9MRCkgewkvL05vdyB3ZSBjYW4gc2V0IGNvcnJlY3QgbW9kZQorCQkJCXN5bmNfbWFzayAmPQorCQkJCSAgICB+KE1FNDYwMF9BT19TWU5DX0VYVF9UUklHIDw8IGluc3RhbmNlLT4KKwkJCQkgICAgICBhb19pZHgpOworCQkJCXN5bmNfbWFzayB8PQorCQkJCSAgICBNRTQ2MDBfQU9fU1lOQ19IT0xEIDw8IGluc3RhbmNlLT5hb19pZHg7CisKKwkJCQlvdXRsKHN5bmNfbWFzaywgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCQlQREVCVUdfUkVHCisJCQkJICAgICgicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAgIHN5bmNfbWFzayk7CisJCQl9CisJCX0gZWxzZSB7CS8vIEZJRk8KKwkJCWlmICgoc3luY19tYXNrICYgKChNRTQ2MDBfQU9fU1lOQ19IT0xEIHwgTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUcpIDw8IGluc3RhbmNlLT5hb19pZHgpKSAhPSAweDApIHsJLy9Ob3cgd2UgY2FuIHNldCBjb3JyZWN0IG1vZGUuCisJCQkJc3luY19tYXNrICY9CisJCQkJICAgIH4oKE1FNDYwMF9BT19TWU5DX0VYVF9UUklHIHwKKwkJCQkgICAgICAgTUU0NjAwX0FPX1NZTkNfSE9MRCkgPDwgaW5zdGFuY2UtPgorCQkJCSAgICAgIGFvX2lkeCk7CisKKwkJCQlvdXRsKHN5bmNfbWFzaywgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCQlQREVCVUdfUkVHCisJCQkJICAgICgicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAgIHN5bmNfbWFzayk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FNDYwMF9BT19TWU5DX0hPTEQ6CS8vU3luY2hyb25vdXMgc29mdHdhcmUKKwkJY3RybCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHOworCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKHN5bmNfbWFzayAmICgoTUU0NjAwX0FPX1NZTkNfSE9MRCB8IE1FNDYwMF9BT19TWU5DX0VYVF9UUklHKSA8PCBpbnN0YW5jZS0+YW9faWR4KSkgIT0gTUU0NjAwX0FPX1NZTkNfSE9MRCkKKwkJaWYgKChzeW5jX21hc2sgJiAoKE1FNDYwMF9BT19TWU5DX0hPTEQgfCBNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJRykgPDwgaW5zdGFuY2UtPmFvX2lkeCkpICE9IChNRTQ2MDBfQU9fU1lOQ19IT0xEIHwgTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUcpKSB7CS8vTm93IHdlIGNhbiBzZXQgY29ycmVjdCBtb2RlCisJCQlzeW5jX21hc2sgfD0KKwkJCSAgICBNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJRyA8PCBpbnN0YW5jZS0+YW9faWR4OworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY19tYXNrICY9IH4oTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUcgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCQlzeW5jX21hc2sgfD0gTUU0NjAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4OworCisJCQlvdXRsKHN5bmNfbWFzaywgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBzeW5jX21hc2spOworCQl9CisJCWJyZWFrOworCisJY2FzZSAoTUU0NjAwX0FPX1NZTkNfSE9MRCB8IE1FNDYwMF9BT19TWU5DX0VYVF9UUklHKToJLy9TeW5jaHJvbm91cyBoYXJkd2FyZQorCQljdHJsIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRzsKKwkJaWYgKChzeW5jX21hc2sgJiAoKE1FNDYwMF9BT19TWU5DX0hPTEQgfCBNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJRykgPDwgaW5zdGFuY2UtPmFvX2lkeCkpICE9IChNRTQ2MDBfQU9fU1lOQ19IT0xEIHwgTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUcpKSB7CS8vTm93IHdlIGNhbiBzZXQgY29ycmVjdCBtb2RlCisJCQlzeW5jX21hc2sgfD0KKwkJCSAgICAoTUU0NjAwX0FPX1NZTkNfSE9MRCB8IE1FNDYwMF9BT19TWU5DX0VYVF9UUklHKSA8PAorCQkJICAgIGluc3RhbmNlLT5hb19pZHg7CisKKwkJCW91dGwoc3luY19tYXNrLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHN5bmNfbWFzayk7CisJCX0KKwkJYnJlYWs7CisJfQorLy8gICAgICAgICAgICAgIHNwaW5fdW5sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsgICAgICAgIC8vIE1vdmVkIGRvd24uCisKKwkvL0FjdGl2YXRlIElTTSAocmVtb3ZlICdzdG9wJyBiaXRzKQorCWN0cmwgJj0KKwkgICAgfihNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFIHwKKwkgICAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFX0JPVEgpOworCWN0cmwgfD0gaW5zdGFuY2UtPmN0cmxfdHJnOworCWN0cmwgJj0gfihNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8IE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCk7CisJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKy8vLyBAbm90ZSBXaGVuIGZsYWcgJ01FX0lPX1NJTkdMRV9UWVBFX1RSSUdfU1lOQ0hST05PVVMnIGlzIHNldCB0aGFuIG91dHB1dCBpcyB0cmlnZ2VyZWQuIEFMV0FZUyEKKworCWlmICghaW5zdGFuY2UtPmZpZm8pIHsJLy9ObyBGSUZPCisJCWlmIChmbGFncyAmIE1FX0lPX1NJTkdMRV9UWVBFX1RSSUdfU1lOQ0hST05PVVMpIHsJLy9GaXJlZCBhbGwgc29mdHdhcmUgc3luY2hyb25vdXMgb3V0cHV0cy4KKwkJCXRtcCA9IH4oKmluc3RhbmNlLT5wcmVsb2FkX2ZsYWdzIHwgMHhGRkZGMDAwMCk7CisJCQlQSU5GTworCQkJICAgICgiRmlyZWQgYWxsIHNvZnR3YXJlIHN5bmNocm9ub3VzIG91dHB1dHMuIG1hc2s6MHglMDh4XG4iLAorCQkJICAgICB0bXApOworCQkJdG1wIHw9IHN5bmNfbWFzayAmIDB4RkZGRjAwMDA7CisJCQkvLyBBZGQgdGhpcyBjaGFubmVsIHRvIGxpc3QKKwkJCXRtcCAmPSB+KE1FNDYwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwkJCS8vRmlyZQorCQkJUElORk8oIlNvZnR3YXJlIHRyaWdnZXIuXG4iKTsKKwkJCW91dGwodG1wLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHRtcCk7CisKKwkJCS8vUmVzdG9yZSBzYXZlIHNldHRpbmdzCisJCQlvdXRsKHN5bmNfbWFzaywgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBzeW5jX21hc2spOworCQl9IGVsc2UgaWYgKCFtb2RlKSB7CS8vIEFkZCB0aGlzIGNoYW5uZWwgdG8gbGlzdAorCQkJb3V0bChzeW5jX21hc2sgJgorCQkJICAgICB+KE1FNDYwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeCksCisJCQkgICAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgc3luY19tYXNrICYgfihNRTQ2MDBfQU9fU1lOQ19IT0xEIDw8CisJCQkJCQkgaW5zdGFuY2UtPmFvX2lkeCkpOworCisJCQkvL0ZpcmUKKwkJCVBJTkZPKCJTb2Z0d2FyZSB0cmlnZ2VyLlxuIik7CisKKwkJCS8vUmVzdG9yZSBzYXZlIHNldHRpbmdzCisJCQlvdXRsKHN5bmNfbWFzaywgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBzeW5jX21hc2spOworCQl9CisKKwl9IGVsc2UgewkJLy8gbWl4LW1vZGUgLSBiZWdpbgorCQlpZiAoZmxhZ3MgJiBNRV9JT19TSU5HTEVfVFlQRV9UUklHX1NZTkNIUk9OT1VTKSB7CS8vVHJpZ2dlciBvdXRwdXRzCisJCQkvL0FkZCBjaGFubmVsIHRvIHN0YXJ0IGxpc3QKKwkJCW91dGwoc3luY19tYXNrIHwKKwkJCSAgICAgKE1FNDYwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeCksCisJCQkgICAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgc3luY19tYXNrIHwgKE1FNDYwMF9BT19TWU5DX0hPTEQgPDwKKwkJCQkJCWluc3RhbmNlLT5hb19pZHgpKTsKKworCQkJLy9GaXJlCisJCQlQSU5GTworCQkJICAgICgiRmlyZWQgYWxsIHNvZnR3YXJlIHN5bmNocm9ub3VzIG91dHB1dHMgYnkgc29mdHdhcmUgdHJpZ2dlci5cbiIpOworCQkJb3V0bCgweDgwMDAsIGluc3RhbmNlLT5zaW5nbGVfcmVnKTsKKwkJCVBERUJVR19SRUcoInNpbmdsZV9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnNpbmdsZV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgMHg4MDAwKTsKKworCQkJLy9SZXN0b3JlIHNhdmUgc2V0dGluZ3MKKwkJCW91dGwoc3luY19tYXNrLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHN5bmNfbWFzayk7CisJCX0gZWxzZSBpZiAoIW1vZGUpIHsJLy9UcmlnZ2VyIG91dHB1dHMKKy8qCQkJLy9SZW1vdmUgY2hhbm5lbCBmcm9tIHN0YXJ0IGxpc3QgLy88PT0gVW5uZWNlc3NhcnkuIFJlbW92ZWQuCisJCQlvdXRsKHN5bmNfbWFzayAmIH4oTUU0NjAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4KSwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworKi8KKwkJCS8vRmlyZQorCQkJUElORk8oIlNvZnR3YXJlIHRyaWdnZXIuXG4iKTsKKwkJCW91dGwoMHg4MDAwLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCQlQREVCVUdfUkVHKCJzaW5nbGVfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5zaW5nbGVfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIDB4ODAwMCk7CisKKy8qCQkJLy9SZXN0b3JlIHNhdmUgc2V0dGluZ3MgLy88PT0gVW5uZWNlc3NhcnkuIFJlbW92ZWQuCisJCQlvdXRsKHN5bmNfbWFzaywgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBzeW5jX21hc2spOworKi8KKwkJfQorCX0KKwlzcGluX3VubG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisKKwlqID0gamlmZmllczsKKwlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3NpbmdsZV9ydW5fd2FpdDsKKworCWluc3RhbmNlLT50aW1lb3V0LmRlbGF5ID0gZGVsYXk7CisJaW5zdGFuY2UtPnRpbWVvdXQuc3RhcnRfdGltZSA9IGo7CisJaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnID0gMTsKKwlxdWV1ZV9kZWxheWVkX3dvcmsoaW5zdGFuY2UtPm1lNDYwMF93b3JrcXVldWUsCisJCQkgICAmaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFzaywgMSk7CisKKwlpZiAoIShmbGFncyAmIE1FX0lPX1NJTkdMRV9UWVBFX1dSSVRFX05PTkJMT0NLSU5HKSkgeworCisJCS8vT25seSBydW5pbmcgcHJvY2VzcyB3aWxsIGludGVycnVwdCB0aGlzIGNhbGwuIEV2ZW50cyBhcmUgc2lnbmFsZWQgd2hlbiBzdGF0dXMgY2hhbmdlLiBFeHRyYSB0aW1lb3V0IGFkZCBmb3Igc2FmZSByZWFzb24uCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJIChpbnN0YW5jZS0+c3RhdHVzICE9CisJCQkJCQkgIGFvX3N0YXR1c19zaW5nbGVfcnVuX3dhaXQpLAorCQkJCQkJIChkZWxheSkgPyBkZWxheSArCisJCQkJCQkgMSA6IExPTkdfTUFYKTsKKworCQlpZiAoKCghZGVsYXkpIHx8ICgoamlmZmllcyAtIGopIDw9IGRlbGF5KSkKKwkJICAgICYmIChpbnN0YW5jZS0+c3RhdHVzICE9IGFvX3N0YXR1c19zaW5nbGVfZW5kKSkgeworCQkJUERFQlVHKCJTaW5nbGUgY2FuY2VsZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0NBTkNFTExFRDsKKwkJfQorCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJUEVSUk9SKCJXYWl0IG9uIHN0YXJ0IG9mIHN0YXRlIG1hY2hpbmUgaW50ZXJydXB0ZWQuXG4iKTsKKwkJCWluc3RhbmNlLT5hb19jb250cm9sX3Rhc2tfZmxhZyA9IDA7CisJCQljYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrKTsKKwkJCWFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19ub25lOworCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQl9CisKKwkJaWYgKChkZWxheSkgJiYgKChqaWZmaWVzIC0gaikgPj0gZGVsYXkpKSB7CisJCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfc2luZ2xlX2VuZCkgeworCQkJCVBERUJVRygiVGltZW91dCByZWFjaGVkLlxuIik7CisJCQl9IGVsc2UgeworCQkJCWlmICgoamlmZmllcyAtIGopID4gZGVsYXkpIHsKKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIlRpbWVvdXQgcmVhY2hlZC4gTm90IGhhbmRsZWQgYnkgY29udHJvbCB0YXNrIVxuIik7CisJCQkJfSBlbHNlIHsKKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIlRpbWVvdXQgcmVhY2hlZC4gU2lnbmFsIGNvbWUgYnV0IHN0YXR1cyBpcyBzdHJhbmdlOiAlZFxuIiwKKwkJCQkJICAgICBpbnN0YW5jZS0+c3RhdHVzKTsKKwkJCQl9CisKKwkJCQlhb19zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKwkJCX0KKworCQkJaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKwkJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmluc3RhbmNlLT5hb19jb250cm9sX3Rhc2spOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zaW5nbGVfZW5kOworCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJfQorCX0KKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYW9faW9fc3RyZWFtX2NvbmZpZyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgbWVJT1N0cmVhbUNvbmZpZ190ICogY29uZmlnX2xpc3QsCisJCQkJICAgICAgaW50IGNvdW50LAorCQkJCSAgICAgIG1lSU9TdHJlYW1UcmlnZ2VyX3QgKiB0cmlnZ2VyLAorCQkJCSAgICAgIGludCBmaWZvX2lycV90aHJlc2hvbGQsIGludCBmbGFncykKK3sKKwltZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQzMl90IGN0cmw7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisJdWludDY0X3QgY29udl90aWNrczsKKwl1bnNpZ25lZCBpbnQgY29udl9zdGFydF90aWNrc19sb3cgPSB0cmlnZ2VyLT5pQ29udlN0YXJ0VGlja3NMb3c7CisJdW5zaWduZWQgaW50IGNvbnZfc3RhcnRfdGlja3NfaGlnaCA9IHRyaWdnZXItPmlDb252U3RhcnRUaWNrc0hpZ2g7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmICghaW5zdGFuY2UtPmZpZm8pIHsKKwkJUEVSUk9SKCJOb3QgYSBzdHJlYW1pbmcgYW8uXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7CisJfQorCisJY29udl90aWNrcyA9CisJICAgICh1aW50NjRfdCkgY29udl9zdGFydF90aWNrc19sb3cgKworCSAgICAoKHVpbnQ2NF90KSBjb252X3N0YXJ0X3RpY2tzX2hpZ2ggPDwgMzIpOworCisJaWYgKGZsYWdzICYKKwkgICAgfihNRV9JT19TVFJFQU1fQ09ORklHX0hBUkRXQVJFX09OTFkgfCBNRV9JT19TVFJFQU1fQ09ORklHX1dSQVBBUk9VTkQKKwkgICAgICB8IE1FX0lPX1NUUkVBTV9DT05GSUdfQklUX1BBVFRFUk4pKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFncy5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoZmxhZ3MgJiBNRV9JT19TVFJFQU1fQ09ORklHX0hBUkRXQVJFX09OTFkpIHsKKwkJaWYgKCFmbGFncyAmIE1FX0lPX1NUUkVBTV9DT05GSUdfV1JBUEFST1VORCkgeworCQkJUEVSUk9SCisJCQkgICAgKCJIYXJkd2FyZSBNRV9JT19TVFJFQU1fQ09ORklHX0hBUkRXQVJFX09OTFkgaGFzIHRvIGJlIHdpdGggTUVfSU9fU1RSRUFNX0NPTkZJR19XUkFQQVJPVU5ELlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwkJfQorCisJCWlmICgodHJpZ2dlci0+aUFjcVN0b3BUcmlnVHlwZSAhPSBNRV9UUklHX1RZUEVfTk9ORSkKKwkJICAgIHx8ICh0cmlnZ2VyLT5pU2NhblN0b3BUcmlnVHlwZSAhPSBNRV9UUklHX1RZUEVfTk9ORSkpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiSGFyZHdhcmUgd3JhcGFyb3VuZCBtb2RlIG11c3QgYmUgaW4gaW5maW5pdGUgbW9kZS5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJCX0KKwl9CisKKwlpZiAoY291bnQgIT0gMSkgeworCQlQRVJST1IoIk9ubHkgMSBlbnRyeSBpbiBjb25maWcgbGlzdCBhY2NlcHRhYmxlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NPTkZJR19MSVNUX0NPVU5UOworCX0KKworCWlmIChjb25maWdfbGlzdFswXS5pQ2hhbm5lbCAhPSAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAoY29uZmlnX2xpc3RbMF0uaVN0cmVhbUNvbmZpZyAhPSAwKSB7CisJCVBFUlJPUigiT25seSBvbmUgcmFuZ2UgYXZhaWxhYmxlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NUUkVBTV9DT05GSUc7CisJfQorCisJaWYgKGNvbmZpZ19saXN0WzBdLmlSZWYgIT0gTUVfUkVGX0FPX0dST1VORCkgeworCQlQRVJST1IoIk91dHB1dCBpcyByZWZlcmVuY2VkIHRvIGdyb3VuZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SRUY7CisJfQorCisJaWYgKCh0cmlnZ2VyLT5pQWNxU3RhcnRUaWNrc0xvdyAhPSAwKQorCSAgICB8fCAodHJpZ2dlci0+aUFjcVN0YXJ0VGlja3NIaWdoICE9IDApKSB7CisJCVBFUlJPUgorCQkgICAgKCJJbnZhbGlkIGFjcXVpc2l0aW9uIHN0YXJ0IHRyaWdnZXIgYXJndW1lbnQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9BUkc7CisJfQorCisJaWYgKGNvbmZpZ19saXN0WzBdLmlGbGFncykgeworCQlQRVJST1IoIkludmFsaWQgY29uZmlnIGxpc3QgZmxhZy5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlzd2l0Y2ggKHRyaWdnZXItPmlBY3FTdGFydFRyaWdUeXBlKSB7CisJY2FzZSBNRV9UUklHX1RZUEVfU1c6CisJCWlmICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnRWRnZSAhPSBNRV9UUklHX0VER0VfTk9ORSkgeworCQkJUEVSUk9SCisJCQkgICAgKCJJbnZhbGlkIGFjcXVpc2l0aW9uIHN0YXJ0IHRyaWdnZXIgZWRnZSBzcGVjaWZpZWQuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9UUklHX0VER0U7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTDoKKwkJc3dpdGNoICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnRWRnZSkgeworCQljYXNlIE1FX1RSSUdfRURHRV9BTlk6CisJCWNhc2UgTUVfVFJJR19FREdFX1JJU0lORzoKKwkJY2FzZSBNRV9UUklHX0VER0VfRkFMTElORzoKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlQRVJST1IKKwkJCSAgICAoIkludmFsaWQgYWNxdWlzaXRpb24gc3RhcnQgdHJpZ2dlciBlZGdlIHNwZWNpZmllZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX1RSSUdfRURHRTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBhY3F1aXNpdGlvbiBzdGFydCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9UUklHX1RZUEU7CisJfQorCisJaWYgKHRyaWdnZXItPmlTY2FuU3RhcnRUcmlnVHlwZSAhPSBNRV9UUklHX1RZUEVfRk9MTE9XKSB7CisJCVBFUlJPUigiSW52YWxpZCBzY2FuIHN0YXJ0IHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVEFSVF9UUklHX1RZUEU7CisJfQorCisJaWYgKHRyaWdnZXItPmlDb252U3RhcnRUcmlnVHlwZSAhPSBNRV9UUklHX1RZUEVfVElNRVIpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNvbnYgc3RhcnQgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DT05WX1NUQVJUX1RSSUdfVFlQRTsKKwl9CisKKwlpZiAoKGNvbnZfdGlja3MgPCBNRTQ2MDBfQU9fTUlOX0NIQU5fVElDS1MpCisJICAgIHx8IChjb252X3RpY2tzID4gTUU0NjAwX0FPX01BWF9DSEFOX1RJQ0tTKSkgeworCQlQRVJST1IoIkludmFsaWQgY29udiBzdGFydCB0cmlnZ2VyIGFyZ3VtZW50IHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DT05WX1NUQVJUX0FSRzsKKwl9CisKKwlpZiAodHJpZ2dlci0+aUFjcVN0YXJ0VGlja3NMb3cgfHwgdHJpZ2dlci0+aUFjcVN0YXJ0VGlja3NIaWdoKSB7CisJCVBFUlJPUigiSW52YWxpZCBhY3Egc3RhcnQgdHJpZ2dlciBhcmd1bWVudCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX0FSRzsKKwl9CisKKwlpZiAodHJpZ2dlci0+aVNjYW5TdGFydFRpY2tzTG93IHx8IHRyaWdnZXItPmlTY2FuU3RhcnRUaWNrc0hpZ2gpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHNjYW4gc3RhcnQgdHJpZ2dlciBhcmd1bWVudCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVEFSVF9BUkc7CisJfQorCisJc3dpdGNoICh0cmlnZ2VyLT5pU2NhblN0b3BUcmlnVHlwZSkgeworCWNhc2UgTUVfVFJJR19UWVBFX05PTkU6CisJCWlmICh0cmlnZ2VyLT5pU2NhblN0b3BDb3VudCAhPSAwKSB7CisJCQlQRVJST1IoIkludmFsaWQgc2NhbiBzdG9wIGNvdW50IHNwZWNpZmllZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVE9QX0FSRzsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19UWVBFX0NPVU5UOgorCQlpZiAoZmxhZ3MgJiBNRV9JT19TVFJFQU1fQ09ORklHX1dSQVBBUk9VTkQpIHsKKwkJCWlmICh0cmlnZ2VyLT5pU2NhblN0b3BDb3VudCA8PSAwKSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHNjYW4gc3RvcCBjb3VudCBzcGVjaWZpZWQuXG4iKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TQ0FOX1NUT1BfQVJHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJUaGUgY29udGlub3VzIG1vZGUgaGFzIG5vdCAnc2NhbicgY29udGVjdHMuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0FDUV9TVE9QX1RSSUdfVFlQRTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBzY2FuIHN0b3AgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TQ0FOX1NUT1BfVFJJR19UWVBFOworCX0KKworCXN3aXRjaCAodHJpZ2dlci0+aUFjcVN0b3BUcmlnVHlwZSkgeworCWNhc2UgTUVfVFJJR19UWVBFX05PTkU6CisJCWlmICh0cmlnZ2VyLT5pQWNxU3RvcENvdW50ICE9IDApIHsKKwkJCVBFUlJPUigiSW52YWxpZCBhY3Egc3RvcCBjb3VudCBzcGVjaWZpZWQuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0FDUV9TVE9QX0FSRzsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19UWVBFX0NPVU5UOgorCQlpZiAodHJpZ2dlci0+aVNjYW5TdG9wVHJpZ1R5cGUgIT0gTUVfVFJJR19UWVBFX05PTkUpIHsKKwkJCVBFUlJPUigiSW52YWxpZCBhY3Egc3RvcCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RPUF9UUklHX1RZUEU7CisJCX0KKworCQlpZiAoZmxhZ3MgJiBNRV9JT19TVFJFQU1fQ09ORklHX1dSQVBBUk9VTkQpIHsKKwkJCWlmICh0cmlnZ2VyLT5pQWNxU3RvcENvdW50IDw9IDApIHsKKwkJCQlQRVJST1IKKwkJCQkgICAgKCJUaGUgY29udGlub3VzIG1vZGUgaGFzIG5vdCAnc2NhbicgY29udGVjdHMuXG4iKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RPUF9BUkc7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgYWNxIHN0b3AgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RPUF9UUklHX1RZUEU7CisJfQorCisJc3dpdGNoICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnQ2hhbikgeworCWNhc2UgTUVfVFJJR19DSEFOX0RFRkFVTFQ6CisJY2FzZSBNRV9UUklHX0NIQU5fU1lOQ0hST05PVVM6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGFjcSBzdGFydCB0cmlnZ2VyIGNoYW5uZWwgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9UUklHX0NIQU47CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJaWYgKChmbGFncyAmIE1FX0lPX1NUUkVBTV9DT05GSUdfQklUX1BBVFRFUk4pICYmICFpbnN0YW5jZS0+Yml0cGF0dGVybikgeworCQlQRVJST1IoIlRoaXMgc3ViZGV2aWNlIG5vdCBzdXBwb3J0IG91dHB1dCByZWRpcmVjdGlvbi5cbiIpOworCQlNRV9TVUJERVZJQ0VfRVhJVDsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCS8vU3RvcCBkZXZpY2UKKworCS8vQ2FuY2VsIGNvbnRyb2wgdGFzaworCVBERUJVRygiQ2FuY2VsIGNvbnRyb2wgdGFzay4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKwlpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgPSAwOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmluc3RhbmNlLT5hb19jb250cm9sX3Rhc2spOworCisJLy9DaGVjayBpZiBzdGF0ZSBtYWNoaW5lIGlzIHN0b3BwZWQuCisJZXJyID0gYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJaWYgKGVycikgeworCQlQRVJST1JfQ1JJVElDQUwoIkZTTSBJUyBCVVNZIVxuIik7CisJCU1FX1NVQkRFVklDRV9FWElUOworCisJCXJldHVybiBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCS8vUmVzZXQgY29udHJvbCByZWdpc3Rlci4gQmxvY2sgYWxsIGFjdGlvbnMuIERpc2FibGUgSVJRLiBEaXNhYmxlIEZJRk8uCisJY3RybCA9CisJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCB8IE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QIHwKKwkgICAgTUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKwlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCisJLy9UaGlzIGlzIHBhcmFub2ljLCBidXQgdG8gYmUgc3VyZS4KKwlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ID0gMDsKKwlpbnN0YW5jZS0+ZGF0YV9jb3VudCA9IDA7CisJaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQgPSAwOworCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsID0gMDsKKworCS8qIFNldCBtb2RlLiAqLworCWlmIChmbGFncyAmIE1FX0lPX1NUUkVBTV9DT05GSUdfV1JBUEFST1VORCkgewkvL1dyYXBhcm91bmQKKwkJaWYgKGZsYWdzICYgTUVfSU9fU1RSRUFNX0NPTkZJR19IQVJEV0FSRV9PTkxZKSB7CS8vSGFyZHdhcmUgd3JhcGFyb3VuZAorCQkJUElORk8oIkhhcmR3YXJlIHdyYXBhcm91bmQuXG4iKTsKKwkJCWN0cmwgfD0gTUU0NjAwX0FPX01PREVfV1JBUEFST1VORDsKKwkJCWluc3RhbmNlLT5tb2RlID0gTUU0NjAwX0FPX0hXX1dSQVBfTU9ERTsKKwkJfSBlbHNlIHsJLy9Tb2Z0d2FyZSB3cmFwYXJvdW5kCisJCQlQSU5GTygiU29mdHdhcmUgd3JhcGFyb3VuZC5cbiIpOworCQkJY3RybCB8PSBNRTQ2MDBfQU9fTU9ERV9DT05USU5VT1VTOworCQkJaW5zdGFuY2UtPm1vZGUgPSBNRTQ2MDBfQU9fU1dfV1JBUF9NT0RFOworCQl9CisJfSBlbHNlIHsJCS8vQ29udGlub3VzCisJCVBJTkZPKCJDb250aW5vdXMuXG4iKTsKKwkJY3RybCB8PSBNRTQ2MDBfQU9fTU9ERV9DT05USU5VT1VTOworCQlpbnN0YW5jZS0+bW9kZSA9IE1FNDYwMF9BT19DT05USU5PVVM7CisJfQorCisJLy9TZXQgdGhlIHRyaWdnZXIgZWRnZS4KKwlpZiAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ1R5cGUgPT0gTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMKSB7CS8vU2V0IHRoZSB0cmlnZ2VyIHR5cGUgYW5kIGVkZ2UgZm9yIGV4dGVybmFsIHRyaWdnZXIuCisJCVBJTkZPKCJFeHRlcm5hbCBkaWdpdGFsIHRyaWdnZXIuXG4iKTsKKwkJaW5zdGFuY2UtPnN0YXJ0X21vZGUgPSBNRTQ2MDBfQU9fRVhUX1RSSUc7CisvKgorCQkJY3RybCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUc7CisqLworCQlzd2l0Y2ggKHRyaWdnZXItPmlBY3FTdGFydFRyaWdFZGdlKSB7CisJCWNhc2UgTUVfVFJJR19FREdFX1JJU0lORzoKKwkJCVBJTkZPKCJTZXQgdGhlIHRyaWdnZXIgZWRnZTogcmlzaW5nLlxuIik7CisJCQlpbnN0YW5jZS0+Y3RybF90cmcgPSAweDA7CisJCQlicmVhazsKKworCQljYXNlIE1FX1RSSUdfRURHRV9GQUxMSU5HOgorCQkJUElORk8oIlNldCB0aGUgdHJpZ2dlciBlZGdlOiBmYWxsaW5nLlxuIik7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RybCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFOworCQkJaW5zdGFuY2UtPmN0cmxfdHJnID0gTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUVfVFJJR19FREdFX0FOWToKKwkJCVBJTkZPKCJTZXQgdGhlIHRyaWdnZXIgZWRnZTogYm90aCBlZGdlcy5cbiIpOworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmwgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRSB8IE1FNDYwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0VfQk9USDsKKwkJCWluc3RhbmNlLT5jdHJsX3RyZyA9CisJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRSB8CisJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRV9CT1RIOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlQSU5GTygiSW50ZXJuYWwgc29mdHdhcmUgdHJpZ2dlci5cbiIpOworCQlpbnN0YW5jZS0+c3RhcnRfbW9kZSA9IDA7CisJfQorCisJLy9TZXQgdGhlIHN0b3AgbW9kZSBhbmQgdmFsdWUuCisJaWYgKHRyaWdnZXItPmlBY3FTdG9wVHJpZ1R5cGUgPT0gTUVfVFJJR19UWVBFX0NPVU5UKSB7CS8vQW1vdW50IG9mIGRhdGEKKwkJaW5zdGFuY2UtPnN0b3BfbW9kZSA9IE1FNDYwMF9BT19BQ1FfU1RPUF9NT0RFOworCQlpbnN0YW5jZS0+c3RvcF9jb3VudCA9IHRyaWdnZXItPmlBY3FTdG9wQ291bnQ7CisJfSBlbHNlIGlmICh0cmlnZ2VyLT5pU2NhblN0b3BUcmlnVHlwZSA9PSBNRV9UUklHX1RZUEVfQ09VTlQpIHsJLy9BbW91bnQgb2YgJ3NjYW5zJworCQlpbnN0YW5jZS0+c3RvcF9tb2RlID0gTUU0NjAwX0FPX1NDQU5fU1RPUF9NT0RFOworCQlpbnN0YW5jZS0+c3RvcF9jb3VudCA9IHRyaWdnZXItPmlTY2FuU3RvcENvdW50OworCX0gZWxzZSB7CQkvL0luZmluaXRlCisJCWluc3RhbmNlLT5zdG9wX21vZGUgPSBNRTQ2MDBfQU9fSU5GX1NUT1BfTU9ERTsKKwkJaW5zdGFuY2UtPnN0b3BfY291bnQgPSAwOworCX0KKworCVBJTkZPKCJTdG9wIGNvdW50OiAlZC5cbiIsIGluc3RhbmNlLT5zdG9wX2NvdW50KTsKKworCWlmICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnQ2hhbiA9PSBNRV9UUklHX0NIQU5fU1lOQ0hST05PVVMpIHsJLy9TeW5jaHJvbm91cyBzdGFydAorCQlpbnN0YW5jZS0+c3RhcnRfbW9kZSB8PSBNRTQ2MDBfQU9fU1lOQ19IT0xEOworCQlpZiAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ1R5cGUgPT0gTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMKSB7CS8vRXh0ZXJuYWx5IHRyaWdnZXJlZAorCQkJUElORk8oIlN5bmNocm9ub3VzIHN0YXJ0LiBFeHRlcm5hbHkgdHJpZ2dlciBhY3RpdmUuXG4iKTsKKwkJCWluc3RhbmNlLT5zdGFydF9tb2RlIHw9IE1FNDYwMF9BT19TWU5DX0VYVF9UUklHOworCQl9CisjaWZkZWYgTUVERUJVR19JTkZPCisJCWVsc2UgeworCQkJUElORk8KKwkJCSAgICAoIlN5bmNocm9ub3VzIHN0YXJ0LiBFeHRlcm5hbHkgdHJpZ2dlciBkaXNzYWJsZWQuXG4iKTsKKwkJfQorI2VuZGlmCisKKwl9CisJLy9TZXQgc3BlZWQKKwlvdXRsKGNvbnZfdGlja3MgLSAyLCBpbnN0YW5jZS0+dGltZXJfcmVnKTsKKwlQREVCVUdfUkVHKCJ0aW1lcl9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHglbGx4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT50aW1lcl9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGNvbnZfdGlja3MgLSAyKTsKKwlpbnN0YW5jZS0+aGFyZHdhcmVfc3RvcF9kZWxheSA9IChpbnQpKGNvbnZfdGlja3MgKiBIWikgLyBNRTQ2MDBfQU9fQkFTRV9GUkVRVUVOQ1k7CS8vPD09IE1VU1QgYmUgd2l0aCBjYXN0IQorCisJLy9Db25lY3Qgb3V0cHV0cyB0byBhbmFsb2cgb3IgZGlnaXRhbCBwb3J0LgorCWlmIChmbGFncyAmIE1FX0lPX1NUUkVBTV9DT05GSUdfQklUX1BBVFRFUk4pIHsKKwkJY3RybCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0RPOworCX0KKwkvLyBXcml0ZSB0aGUgY29udHJvbCB3b3JkCisJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKworCS8vU2V0IHN0YXR1cy4KKwlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9jb25maWd1cmVkOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYW9faW9fc3RyZWFtX25ld192YWx1ZXMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCQkgIGludCB0aW1lX291dCwgaW50ICpjb3VudCwgaW50IGZsYWdzKQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbG9uZyB0ID0gMDsKKwlsb25nIGo7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmICghaW5zdGFuY2UtPmZpZm8pIHsKKwkJUEVSUk9SKCJOb3QgYSBzdHJlYW1pbmcgYW8uXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7CisJfQorCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoIWluc3RhbmNlLT5jaXJjX2J1Zi5idWYpIHsKKwkJUEVSUk9SKCJDaXJjdWxhciBidWZmZXIgbm90IGV4aXN0cy5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJaWYgKHRpbWVfb3V0IDwgMCkgeworCQlQRVJST1IoIkludmFsaWQgdGltZV9vdXQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RJTUVPVVQ7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJaWYgKG1lX2NpcmNfYnVmX3NwYWNlKCZpbnN0YW5jZS0+Y2lyY19idWYpKSB7CS8vVGhlIGJ1ZmZlciBpcyBOT1QgZnVsbC4KKwkJKmNvdW50ID0gbWVfY2lyY19idWZfc3BhY2UoJmluc3RhbmNlLT5jaXJjX2J1Zik7CisJfSBlbHNlIHsJCS8vVGhlIGJ1ZmZlciBpcyBmdWxsLgorCQlpZiAodGltZV9vdXQpIHsKKwkJCXQgPSAodGltZV9vdXQgKiBIWikgLyAxMDAwOworCisJCQlpZiAodCA9PSAwKQorCQkJCXQgPSAxOworCQl9IGVsc2UgewkvL01heCB0aW1lLgorCQkJdCA9IExPTkdfTUFYOworCQl9CisKKwkJKmNvdW50ID0gMDsKKworCQlqID0gamlmZmllczsKKworCQkvL09ubHkgcnVuaW5nIHByb2Nlc3Mgd2lsbCBpbnRlcnJ1cHQgdGhpcyBjYWxsLiBJbnRlcnJ1cHRzIGFyZSB3aGVuIEZJRk8gSEYgaXMgc2lnbmFsZWQuCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJICgobWVfY2lyY19idWZfc3BhY2UKKwkJCQkJCSAgICgmaW5zdGFuY2UtPmNpcmNfYnVmKSkKKwkJCQkJCSAgfHwgIShpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpCisJCQkJCQkgICAgICAgJgorCQkJCQkJICAgICAgIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpLAorCQkJCQkJIHQpOworCisJCWlmICghKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CisJCQlQRVJST1IoIkFPIHN1YmRldmljZSBpcyBub3QgcnVubmluZy5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fU1VCREVWSUNFX05PVF9SVU5OSU5HOworCQl9IGVsc2UgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlQRVJST1IoIldhaXQgb24gdmFsdWVzIGludGVycnVwdGVkIGZyb20gc2lnbmFsLlxuIik7CisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX25vbmU7CisJCQlhb19zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKwkJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwkJfSBlbHNlIGlmICgoamlmZmllcyAtIGopID49IHQpIHsKKwkJCVBFUlJPUigiV2FpdCBvbiB2YWx1ZXMgdGltZWQgb3V0LlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19USU1FT1VUOworCQl9IGVsc2UgewkvL1VmZi4uLiBhbGwgaXMgZ29vZC4gSW5mb3JtIHVzZXIgYWJvdXQgZW1wdHkgc3BhY2UuCisJCQkqY291bnQgPSBtZV9jaXJjX2J1Zl9zcGFjZSgmaW5zdGFuY2UtPmNpcmNfYnVmKTsKKwkJfQorCX0KKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYW9faW9fc3RyZWFtX3N0YXJ0KG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IHN0YXJ0X21vZGUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3MgPSAwOworCXVpbnQzMl90IHN0YXR1czsKKwl1aW50MzJfdCBjdHJsOworCXVpbnQzMl90IHN5bmNoOworCWludCBjb3VudCA9IDA7CisJaW50IGNpcmNfYnVmZmVyX2NvdW50OworCisJdW5zaWduZWQgbG9uZyByZWY7CisJdW5zaWduZWQgbG9uZyBkZWxheSA9IDA7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmICghaW5zdGFuY2UtPmZpZm8pIHsKKwkJUEVSUk9SKCJOb3QgYSBzdHJlYW1pbmcgYW8uXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7CisJfQorCisJaWYgKGZsYWdzICYgfk1FX0lPX1NUUkVBTV9TVEFSVF9UWVBFX1RSSUdfU1lOQ0hST05PVVMpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICh0aW1lX291dCA8IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRpbWVvdXQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RJTUVPVVQ7CisJfQorCisJaWYgKChzdGFydF9tb2RlICE9IE1FX1NUQVJUX01PREVfQkxPQ0tJTkcpCisJICAgICYmIChzdGFydF9tb2RlICE9IE1FX1NUQVJUX01PREVfTk9OQkxPQ0tJTkcpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdGFydCBtb2RlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVEFSVF9NT0RFOworCX0KKworCWlmICh0aW1lX291dCkgeworCQlkZWxheSA9ICh0aW1lX291dCAqIEhaKSAvIDEwMDA7CisJCWlmIChkZWxheSA9PSAwKQorCQkJZGVsYXkgPSAxOworCX0KKworCXN3aXRjaCAoaW5zdGFuY2UtPnN0YXR1cykgewkvL0NoZWNraW5nIGFjdHVhbCBtb2RlLgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9jb25maWd1cmVkOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9lbmQ6CisJCS8vQ29ycmVjdCBtb2RlcyEKKwkJYnJlYWs7CisKKwkJLy9UaGUgZGV2aWNlIGlzIGluIHdyb25nIG1vZGUuCisJY2FzZSBhb19zdGF0dXNfbm9uZToKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfY29uZmlndXJlZDoKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfcnVuX3dhaXQ6CisJY2FzZSBhb19zdGF0dXNfc2luZ2xlX3J1bjoKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfZW5kX3dhaXQ6CisJCVBFUlJPUgorCQkgICAgKCJTdWJkZXZpY2UgbXVzdCBiZSBwcmVpbml0aWFsaXplIGNvcnJlY3RseSBmb3Igc3RyZWFtaW5nLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fZmlmb19lcnJvcjoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fYnVmZmVyX2Vycm9yOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9lcnJvcjoKKwkJUERFQlVHKCJCZWZvcmUgcmVzdGFydCBicm9rZSBzdHJlYW0gJ1NUT1AnIG11c3QgYmUgY2FsZWQuXG4iKTsKKwkJcmV0dXJuIE1FX1NUQVRVU19FUlJPUjsKKworCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9ydW5fd2FpdDoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fcnVuOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9lbmRfd2FpdDoKKwkJUERFQlVHKCJTdHJlYW0gaXMgYWxyZWFkeSB3b3JraW5nLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKworCWRlZmF1bHQ6CisJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2Vycm9yOworCQlQRVJST1JfQ1JJVElDQUwoIlN0YXR1cyBpcyBpbiB3cm9uZyBzdGF0ZSFcbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlpZiAoaW5zdGFuY2UtPm1vZGUgPT0gTUU0NjAwX0FPX0NPTlRJTk9VUykgewkvL0NvbnRpbm91cworCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCArPSBpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50OworCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCAmPSBpbnN0YW5jZS0+Y2lyY19idWYubWFzazsKKwl9CisJY2lyY19idWZmZXJfY291bnQgPSBtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1Zik7CisKKwlpZiAoIWNpcmNfYnVmZmVyX2NvdW50ICYmICFpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50KSB7CS8vTm8gdmFsdWVzIGluIGJ1ZmZlcgorCQlNRV9TVUJERVZJQ0VfRVhJVDsKKwkJUEVSUk9SKCJObyB2YWx1ZXMgaW4gYnVmZmVyIVxuIik7CisJCXJldHVybiBNRV9FUlJOT19MQUNLX09GX1JFU09VUkNFUzsKKwl9CisKKwkvL0NhbmNlbCBjb250cm9sIHRhc2sKKwlQREVCVUcoIkNhbmNlbCBjb250cm9sIHRhc2suIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisJaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrKTsKKworCS8vU3RvcCBkZXZpY2UKKwllcnIgPSBhb19zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKwlpZiAoZXJyKSB7CisJCVBFUlJPUl9DUklUSUNBTCgiRlNNIElTIEJVU1khXG4iKTsKKwkJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwkJcmV0dXJuIE1FX0VSUk5PX1NVQkRFVklDRV9CVVNZOworCX0KKwkvL1NldCB2YWx1ZXMgZm9yIHNpbmdsZV9yZWFkKCkKKwlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0gTUU0NjAwX0FPX01BWF9EQVRBICsgMTsKKwlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlX2luX2ZpZm8gPSBNRTQ2MDBfQU9fTUFYX0RBVEEgKyAxOworCisJLy9TZXR0aW5nIHN0b3AgcG9pbnRzCisJaWYgKGluc3RhbmNlLT5zdG9wX21vZGUgPT0gTUU0NjAwX0FPX1NDQU5fU1RPUF9NT0RFKSB7CisJCWluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgPQorCQkgICAgaW5zdGFuY2UtPnN0b3BfY291bnQgKiBjaXJjX2J1ZmZlcl9jb3VudDsKKwl9IGVsc2UgeworCQlpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50ID0gaW5zdGFuY2UtPnN0b3BfY291bnQ7CisJfQorCisJaWYgKChpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50ICE9IDApCisJICAgICYmIChpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50IDwgY2lyY19idWZmZXJfY291bnQpKSB7CisJCVBFUlJPUigiTW9yZSBkYXRhIGluIGJ1ZmZlciB0aGFuIHByZXZpb3VzbHkgc2V0IGxpbWl0IVxuIik7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJLy9DaGVjayBGSUZPCisJaWYgKCEoY3RybCAmIE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRklGTykpIHsJLy9GSUZPIHdhc24ndCBlbmFiZWxlZC4gRG8gaXQuIDw9IFRoaXMgc2hvdWxkIGJlIGRvbmUgYnkgdXNlciBjYWxsIHdpdGggTUVfV1JJVEVfTU9ERV9QUkVMT0FECisJCVBJTkZPKCJFbmFibGVpbmcgRklGTy5cbiIpOworCQljdHJsIHw9CisJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk8gfAorCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKworCQlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ID0gMDsKKwkJaW5zdGFuY2UtPmRhdGFfY291bnQgPSAwOworCX0gZWxzZSB7CQkvL0Jsb2NrIElSUQorCQljdHJsIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlE7CisJfQorCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgY3RybCB8IE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlEpOworCisJLy9GaWxsIEZJRk8gPD0gR2VuZXJhbHkgdGhpcyBzaG91bGQgYmUgZG9uZSBieSB1c2VyIHByZS1sb2FkIGNhbGwgYnV0IHRoaXMgaXMgc2Vjb25kIHBsYWNlIHRvIGRvIGl0LgorCXN0YXR1cyA9IGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZyk7CisJaWYgKCEoc3RhdHVzICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRUYpKSB7CS8vRklGTyBlbXB0eQorCQlpZiAoaW5zdGFuY2UtPnN0b3BfZGF0YV9jb3VudCA9PSAwKSB7CisJCQljb3VudCA9IE1FNDYwMF9BT19GSUZPX0NPVU5UOworCQl9IGVsc2UgeworCQkJY291bnQgPQorCQkJICAgIChNRTQ2MDBfQU9fRklGT19DT1VOVCA8CisJCQkgICAgIGluc3RhbmNlLT4KKwkJCSAgICAgc3RvcF9kYXRhX2NvdW50KSA/IE1FNDYwMF9BT19GSUZPX0NPVU5UIDoKKwkJCSAgICBpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50OworCQl9CisKKwkJLy9Db3B5IGRhdGEKKwkJY291bnQgPQorCQkgICAgYW9fd3JpdGVfZGF0YShpbnN0YW5jZSwgY291bnQsIGluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQpOworCisJCWlmIChjb3VudCA8IDApIHsJLy9UaGlzIHNob3VsZCBuZXZlciBoYXBwZW5kIQorCQkJUEVSUk9SX0NSSVRJQ0FMKCJDT1BZIEZJTklTSCBXSVRIIEVSUk9SIVxuIik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQkJTUVfU1VCREVWSUNFX0VYSVQ7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisJCX0KKwl9CisJLy9TZXQgcHJlLWxvYWQgZmVhdHVyZXMuCisJc3Bpbl9sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKwlzeW5jaCA9IGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCXN5bmNoICY9CisJICAgIH4oKE1FNDYwMF9BT19TWU5DX0hPTEQgfCBNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJRykgPDwgaW5zdGFuY2UtPgorCSAgICAgIGFvX2lkeCk7CisJc3luY2ggfD0KKwkgICAgKGluc3RhbmNlLT5zdGFydF9tb2RlICYgfk1FNDYwMF9BT19FWFRfVFJJRykgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKwlvdXRsKHN5bmNoLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBzeW5jaCk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCisJLy9EZWZhdWx0IGNvdW50IGlzICcwJworCWlmIChpbnN0YW5jZS0+bW9kZSA9PSBNRTQ2MDBfQU9fQ09OVElOT1VTKSB7CS8vQ29udGlub3VzCisJCWluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgPSAwOworCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCArPSBjb3VudDsKKwkJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgJj0gaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJfSBlbHNlIHsJCS8vV3JhcGFyb3VuZAorCQlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ICs9IGNvdW50OworCQlpbnN0YW5jZS0+ZGF0YV9jb3VudCArPSBjb3VudDsKKworCQkvL1NwZWNpYWwgY2FzZTogSW5maW5pdGUgd3JhcGFyb3VuZCB3aXRoIGxlc3MgdGhhbiBGSUZPIGRhdGFzIGFsd2F5cyBzaG91bGQgcnVucyBpbiBoYXJkd2FyZSBtb2RlLgorCQlpZiAoKGluc3RhbmNlLT5zdG9wX21vZGUgPT0gTUU0NjAwX0FPX0lORl9TVE9QX01PREUpCisJCSAgICAmJiAoY2lyY19idWZmZXJfY291bnQgPD0gTUU0NjAwX0FPX0ZJRk9fQ09VTlQpKSB7CS8vQ2hhbmdlIHRvIGhhcmR3YXJlIHdyYXBhcm91bmQKKwkJCVBERUJVRworCQkJICAgICgiQ2hhbmdlaW5nIG1vZGUgZnJvbSBzb2Z0d2FyZSB3cmFwYXJvdW5kIHRvIGhhcmR3YXJlIHdyYXBhcm91bmQuXG4iKTsKKwkJCS8vQ29weSBhbGwgZGF0YQorCQkJY291bnQgPQorCQkJICAgIGFvX3dyaXRlX2RhdGEoaW5zdGFuY2UsIGNpcmNfYnVmZmVyX2NvdW50LAorCQkJCQkgIGluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQpOworCQkJY3RybCAmPSB+TUU0NjAwX0FPX0NUUkxfTU9ERV9NQVNLOworCQkJY3RybCB8PSBNRTQ2MDBfQU9fTU9ERV9XUkFQQVJPVU5EOworCQl9CisKKwkJaWYgKGluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgPT0gbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpKSB7CS8vUmVzZXQgcG9zaXRpb24gaW5kaWNhdG9yLgorCQkJaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCA9IDA7CisJCX0gZWxzZSBpZiAoaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCA+IG1lX2NpcmNfYnVmX3ZhbHVlcygmaW5zdGFuY2UtPmNpcmNfYnVmKSkgewkvL1RoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbmQhCisJCQlQRVJST1JfQ1JJVElDQUwKKwkJCSAgICAoIlBSRUxPQURFRCBNT1JFIFZBTFVFUyBUSEFOIEFSRSBJTiBCVUZGRVIhXG4iKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCQlNRV9TVUJERVZJQ0VfRVhJVDsKKwkJCXJldHVybiBNRV9FUlJOT19JTlRFUk5BTDsKKwkJfQorCX0KKworCS8vU2V0IHN0YXR1cyB0byAnd2FpdCBmb3Igc3RhcnQnCisJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fcnVuX3dhaXQ7CisKKwlzdGF0dXMgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpOworCS8vU3RhcnQgc3RhdGUgbWFjaGluZSBhbmQgaW50ZXJydXB0cworCWN0cmwgJj0gfihNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8IE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCk7CisJaWYgKGluc3RhbmNlLT5zdGFydF9tb2RlID09IE1FNDYwMF9BT19FWFRfVFJJRykgewkvLyBFeHRlcm5hbCB0cmlnZ2VyLgorCQlQSU5GTygiRXh0ZXJuYWwgdHJpZ2dlci5cbiIpOworCQljdHJsIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRzsKKwl9CisJaWYgKCEoc3RhdHVzICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfSEYpKSB7CS8vTW9yZSB0aGFuIGhhbGYhCisJCWlmICgoY3RybCAmIE1FNDYwMF9BT19DVFJMX01PREVfTUFTSykgPT0gTUU0NjAwX0FPX01PREVfQ09OVElOVU9VUykgewkvL0VuYWJsZSBJUlEgb25seSB3aGVuIGhhcmR3YXJlX2NvbnRpbm91cyBpcyBzZXQgYW5kIEZJRk8gaXMgbW9yZSB0aGFuIGhhbGYKKwkJCWN0cmwgJj0gfk1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlE7CisJCQljdHJsIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQl9CisJfQorCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJLy9UcmlnZ2VyIG91dHB1dAorCWlmIChmbGFncyAmIE1FX0lPX1NJTkdMRV9UWVBFX1RSSUdfU1lOQ0hST05PVVMpIHsJLy9UcmlnZ2VyIG91dHB1dHMKKwkJc3Bpbl9sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKwkJc3luY2ggPSBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJLy9BZGQgY2hhbm5lbCB0byBzdGFydCBsaXN0CisJCW91dGwoc3luY2ggfCAoTUU0NjAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4KSwKKwkJICAgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgc3luY2ggfCAoTUU0NjAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4KSk7CisKKwkJLy9GaXJlCisJCVBJTkZPCisJCSAgICAoIkZpcmVkIGFsbCBzb2Z0d2FyZSBzeW5jaHJvbm91cyBvdXRwdXRzIGJ5IHNvZnR3YXJlIHRyaWdnZXIuXG4iKTsKKwkJb3V0bCgweDgwMDAsIGluc3RhbmNlLT5zaW5nbGVfcmVnKTsKKwkJUERFQlVHX1JFRygic2luZ2xlX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnNpbmdsZV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDB4ODAwMCk7CisKKwkJLy9SZXN0b3JlIHNhdmUgc2V0dGluZ3MKKwkJb3V0bChzeW5jaCwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgc3luY2gpOworCQlzcGluX3VubG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisJfSBlbHNlIGlmICghaW5zdGFuY2UtPnN0YXJ0X21vZGUpIHsJLy9UcmlnZ2VyIG91dHB1dHMKKy8qCisJCS8vUmVtb3ZlIGNoYW5uZWwgZnJvbSBzdGFydCBsaXN0LgkvLyA8PT0gVW5uZWNlc3NhcnkuIFJlbW92ZWQuCisJCXNwaW5fbG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisJCQlzeW5jaCA9IGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJb3V0bChzeW5jaCAmIH4oTUU0NjAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4KSwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBzeW5jaCAmIH4oTUU0NjAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4KSk7CisqLworCQkvL0ZpcmUKKwkJUElORk8oIlNvZnR3YXJlIHRyaWdnZXIuXG4iKTsKKwkJb3V0bCgweDgwMDAsIGluc3RhbmNlLT5zaW5nbGVfcmVnKTsKKwkJUERFQlVHX1JFRygic2luZ2xlX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPnNpbmdsZV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDB4ODAwMCk7CisKKy8qCisJCQkvL1Jlc3RvcmUgc2F2ZSBzZXR0aW5ncy4JLy8gPD09IFVubmVjZXNzYXJ5LiBSZW1vdmVkLgorCQkJb3V0bChzeW5jaCwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBzeW5jaCk7CisJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKyovCisJfQorCS8vIFNldCBjb250cm9sIHRhc2sncyB0aW1lb3V0CisJcmVmID0gamlmZmllczsKKwlpbnN0YW5jZS0+dGltZW91dC5kZWxheSA9IGRlbGF5OworCWluc3RhbmNlLT50aW1lb3V0LnN0YXJ0X3RpbWUgPSByZWY7CisKKwlpZiAoc3RhdHVzICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfSEYpIHsJLy9MZXNzIHRoYW4gaGFsZiBidXQgbm90IGVtcHR5IQorCQlQSU5GTygiTGVzcyB0aGFuIGhhbGYuXG4iKTsKKwkJaWYgKGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgIT0gMCkgeworCQkJY291bnQgPSBNRTQ2MDBfQU9fRklGT19DT1VOVCAvIDI7CisJCX0gZWxzZSB7CisJCQljb3VudCA9CisJCQkgICAgKChNRTQ2MDBfQU9fRklGT19DT1VOVCAvIDIpIDwKKwkJCSAgICAgaW5zdGFuY2UtPnN0b3BfZGF0YV9jb3VudCkgPyBNRTQ2MDBfQU9fRklGT19DT1VOVCAvCisJCQkgICAgMiA6IGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQ7CisJCX0KKworCQkvL0NvcHkgZGF0YQorCQljb3VudCA9CisJCSAgICBhb193cml0ZV9kYXRhKGluc3RhbmNlLCBjb3VudCwgaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCk7CisKKwkJaWYgKGNvdW50IDwgMCkgewkvL1RoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbmQhCisJCQlQRVJST1JfQ1JJVElDQUwoIkNPUFkgRklOSVNIIFdJVEggRVJST1IhXG4iKTsKKwkJCU1FX1NVQkRFVklDRV9FWElUOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVEVSTkFMOworCQl9CisKKwkJaWYgKGluc3RhbmNlLT5tb2RlID09IE1FNDYwMF9BT19DT05USU5PVVMpIHsJLy9Db250aW5vdXMKKwkJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICs9IGNvdW50OworCQkJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgJj0gaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJCX0gZWxzZSB7CS8vV3JhcGFyb3VuZAorCQkJaW5zdGFuY2UtPmRhdGFfY291bnQgKz0gY291bnQ7CisJCQlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ICs9IGNvdW50OworCisJCQlpZiAoaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCA9PSBtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1ZikpIHsJLy9SZXNldCBwb3NpdGlvbiBpbmRpY2F0b3IuCisJCQkJaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCA9IDA7CisJCQl9IGVsc2UgaWYgKGluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgPiBtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1ZikpIHsJLy9UaGlzIHNob3VsZCBuZXZlciBoYXBwZW5kIQorCQkJCVBFUlJPUl9DUklUSUNBTAorCQkJCSAgICAoIlBSRUxPQURFRCBNT1JFIFZBTFVFUyBUSEFOIEFSRSBJTiBCVUZGRVIhXG4iKTsKKwkJCQlNRV9TVUJERVZJQ0VfRVhJVDsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisJCQl9CisJCX0KKworCQlzdGF0dXMgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpOworCQlpZiAoIShzdGF0dXMgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9IRikpIHsJLy9Nb3JlIHRoYW4gaGFsZiEKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJCQljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQljdHJsICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJROworCQkJY3RybCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBjdHJsKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCX0KKwl9CisJLy9TcGVjaWFsIGNhc2U6IExpbWl0ZWQgd3JhcGFyb3VuZCB3aXRoIGxlc3MgdGhhbiBIQUxGIEZJRk8gZGF0YXMgbmVlZCB3b3JrIGFyb3VuZCB0byBnZW5lcmF0ZSBmaXJzdCBpbnRlcnJ1cHQuCisJaWYgKChpbnN0YW5jZS0+c3RvcF9tb2RlICE9IE1FNDYwMF9BT19JTkZfU1RPUF9NT0RFKQorCSAgICAmJiAoaW5zdGFuY2UtPm1vZGUgPT0gTUU0NjAwX0FPX1NXX1dSQVBfTU9ERSkKKwkgICAgJiYgKGNpcmNfYnVmZmVyX2NvdW50IDw9IChNRTQ2MDBfQU9fRklGT19DT1VOVCAvIDIpKSkgewkvL1B1dCBtb3JlIGRhdGEgdG8gRklGTworCQlQSU5GTygiTGltaXRlZCB3cmFwYXJvdW5kIHdpdGggbGVzcyB0aGFuIEhBTEYgRklGTyBkYXRhcy5cbiIpOworCQlpZiAoaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCkgewkvL1RoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbmQhCisJCQlQRVJST1JfQ1JJVElDQUwKKwkJCSAgICAoIkVSUk9SIFdIRU4gTE9BRElORyBWQUxVRVMgRk9SIFdSQVBBUk9VTkQhXG4iKTsKKwkJCU1FX1NVQkRFVklDRV9FWElUOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVEVSTkFMOworCQl9CisKKwkJd2hpbGUgKGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgPiBpbnN0YW5jZS0+ZGF0YV9jb3VudCkgewkvL01heGltdW0gZGF0YSBub3Qgc2V0IGpldC4KKwkJCS8vQ29weSB0byBidWZmZXIKKwkJCWlmIChjaXJjX2J1ZmZlcl9jb3VudCAhPSBhb193cml0ZV9kYXRhKGluc3RhbmNlLCBjaXJjX2J1ZmZlcl9jb3VudCwgMCkpIHsJLy9UaGlzIHNob3VsZCBuZXZlciBoYXBwZW5kIQorCQkJCVBFUlJPUl9DUklUSUNBTAorCQkJCSAgICAoIkVSUk9SIFdIRU4gTE9BRElORyBWQUxVRVMgRk9SIFdSQVBBUk9VTkQhXG4iKTsKKwkJCQlNRV9TVUJERVZJQ0VfRVhJVDsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisJCQl9CisJCQlpbnN0YW5jZS0+ZGF0YV9jb3VudCArPSBjaXJjX2J1ZmZlcl9jb3VudDsKKworCQkJaWYgKCEoKHN0YXR1cyA9IGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykpICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfSEYpKSB7CS8vRklGTyBpcyBtb3JlIHRoYW4gaGFsZi4gRW5hYmxlIElSUSBhbmQgZW5kIGNvcHkuCisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJCSAgY3B1X2ZsYWdzKTsKKwkJCQljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkJY3RybCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKwkJCQljdHJsIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQkJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtCisJCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPgorCQkJCQkJICAgICAgIHN1YmRldmljZV9sb2NrLAorCQkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJLy8gU2NoZWR1bGUgY29udHJvbCB0YXNrLgorCWluc3RhbmNlLT5hb19jb250cm9sX3Rhc2tfZmxhZyA9IDE7CisJcXVldWVfZGVsYXllZF93b3JrKGluc3RhbmNlLT5tZTQ2MDBfd29ya3F1ZXVlLAorCQkJICAgJmluc3RhbmNlLT5hb19jb250cm9sX3Rhc2ssIDEpOworCisJaWYgKHN0YXJ0X21vZGUgPT0gTUVfU1RBUlRfTU9ERV9CTE9DS0lORykgewkvL1dhaXQgZm9yIHN0YXJ0LgorCQkvL09ubHkgcnVuaW5nIHByb2Nlc3Mgd2lsbCBpbnRlcnJ1cHQgdGhpcyBjYWxsLiBFdmVudHMgYXJlIHNpZ25hbGVkIHdoZW4gc3RhdHVzIGNoYW5nZS4gRXh0cmEgdGltZW91dCBhZGQgZm9yIHNhZmUgcmVhc29uLgorCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSAoaW5zdGFuY2UtPnN0YXR1cyAhPQorCQkJCQkJICBhb19zdGF0dXNfc3RyZWFtX3J1bl93YWl0KSwKKwkJCQkJCSAoZGVsYXkpID8gZGVsYXkgKworCQkJCQkJIDEgOiBMT05HX01BWCk7CisKKwkJaWYgKChpbnN0YW5jZS0+c3RhdHVzICE9IGFvX3N0YXR1c19zdHJlYW1fcnVuKQorCQkgICAgJiYgKGluc3RhbmNlLT5zdGF0dXMgIT0gYW9fc3RhdHVzX3N0cmVhbV9lbmQpKSB7CisJCQlQREVCVUcoIlN0YXJ0aW5nIHN0cmVhbSBjYW5jZWxlZC4gJWRcbiIsCisJCQkgICAgICAgaW5zdGFuY2UtPnN0YXR1cyk7CisJCQllcnIgPSBNRV9FUlJOT19DQU5DRUxMRUQ7CisJCX0KKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCVBFUlJPUigiV2FpdCBvbiBzdGFydCBvZiBzdGF0ZSBtYWNoaW5lIGludGVycnVwdGVkLlxuIik7CisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX25vbmU7CisJCQlhb19zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKwkJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwkJfSBlbHNlIGlmICgoZGVsYXkpICYmICgoamlmZmllcyAtIHJlZikgPj0gZGVsYXkpKSB7CisJCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyAhPSBhb19zdGF0dXNfc3RyZWFtX3J1bikgeworCQkJCWlmIChpbnN0YW5jZS0+c3RhdHVzID09IGFvX3N0YXR1c19zdHJlYW1fZW5kKSB7CisJCQkJCVBERUJVRygiVGltZW91dCByZWFjaGVkLlxuIik7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKChqaWZmaWVzIC0gcmVmKSA+IGRlbGF5KSB7CisJCQkJCQlQRVJST1IKKwkJCQkJCSAgICAoIlRpbWVvdXQgcmVhY2hlZC4gTm90IGhhbmRsZWQgYnkgY29udHJvbCB0YXNrIVxuIik7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlQRVJST1IKKwkJCQkJCSAgICAoIlRpbWVvdXQgcmVhY2hlZC4gU2lnbmFsIGNvbWUgYnV0IHN0YXR1cyBpcyBzdHJhbmdlOiAlZFxuIiwKKwkJCQkJCSAgICAgaW5zdGFuY2UtPnN0YXR1cyk7CisJCQkJCX0KKwkJCQkJYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJCQkJfQorCisJCQkJaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKwkJCQljYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrKTsKKwkJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9lbmQ7CisJCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJCX0KKwkJfQorCX0KKworCU1FX1NVQkRFVklDRV9FWElUOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3N0cmVhbV9zdGF0dXMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCB3YWl0LAorCQkJCSAgICAgIGludCAqc3RhdHVzLCBpbnQgKnZhbHVlcywgaW50IGZsYWdzKQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmICghaW5zdGFuY2UtPmZpZm8pIHsKKwkJUEVSUk9SKCJOb3QgYSBzdHJlYW1pbmcgYW8uXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7CisJfQorCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoKHdhaXQgIT0gTUVfV0FJVF9OT05FKSAmJiAod2FpdCAhPSBNRV9XQUlUX0lETEUpKSB7CisJCVBFUlJPUigiSW52YWxpZCB3YWl0IGFyZ3VtZW50IHNwZWNpZmllZC5cbiIpOworCQkqc3RhdHVzID0gTUVfU1RBVFVTX0lOVkFMSUQ7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1dBSVQ7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3dpdGNoIChpbnN0YW5jZS0+c3RhdHVzKSB7CisJY2FzZSBhb19zdGF0dXNfc2luZ2xlX2NvbmZpZ3VyZWQ6CisJY2FzZSBhb19zdGF0dXNfc2luZ2xlX2VuZDoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fY29uZmlndXJlZDoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fZW5kOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9maWZvX2Vycm9yOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9idWZmZXJfZXJyb3I6CisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2Vycm9yOgorCQkqc3RhdHVzID0gTUVfU1RBVFVTX0lETEU7CisJCWJyZWFrOworCisJY2FzZSBhb19zdGF0dXNfc2luZ2xlX3J1bl93YWl0OgorCWNhc2UgYW9fc3RhdHVzX3NpbmdsZV9ydW46CisJY2FzZSBhb19zdGF0dXNfc2luZ2xlX2VuZF93YWl0OgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9ydW5fd2FpdDoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fcnVuOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9lbmRfd2FpdDoKKwkJKnN0YXR1cyA9IE1FX1NUQVRVU19CVVNZOworCQlicmVhazsKKworCWNhc2UgYW9fc3RhdHVzX25vbmU6CisJZGVmYXVsdDoKKwkJKnN0YXR1cyA9CisJCSAgICAoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkgPworCQkgICAgTUVfU1RBVFVTX0JVU1kgOiBNRV9TVEFUVVNfSURMRTsKKwkJYnJlYWs7CisJfQorCisJaWYgKCh3YWl0ID09IE1FX1dBSVRfSURMRSkgJiYgKCpzdGF0dXMgPT0gTUVfU1RBVFVTX0JVU1kpKSB7CisJCS8vT25seSBydW5pbmcgcHJvY2VzcyB3aWxsIGludGVycnVwdCB0aGlzIGNhbGwuIEV2ZW50cyBhcmUgc2lnbmFsZWQgd2hlbiBzdGF0dXMgY2hhbmdlLiBFeHRyYSB0aW1lb3V0IGFkZCBmb3Igc2FmZSByZWFzb24uCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJICgoaW5zdGFuY2UtPnN0YXR1cyAhPQorCQkJCQkJICAgYW9fc3RhdHVzX3NpbmdsZV9ydW5fd2FpdCkKKwkJCQkJCSAgJiYgKGluc3RhbmNlLT5zdGF0dXMgIT0KKwkJCQkJCSAgICAgIGFvX3N0YXR1c19zaW5nbGVfcnVuKQorCQkJCQkJICAmJiAoaW5zdGFuY2UtPnN0YXR1cyAhPQorCQkJCQkJICAgICAgYW9fc3RhdHVzX3NpbmdsZV9lbmRfd2FpdCkKKwkJCQkJCSAgJiYgKGluc3RhbmNlLT5zdGF0dXMgIT0KKwkJCQkJCSAgICAgIGFvX3N0YXR1c19zdHJlYW1fcnVuX3dhaXQpCisJCQkJCQkgICYmIChpbnN0YW5jZS0+c3RhdHVzICE9CisJCQkJCQkgICAgICBhb19zdGF0dXNfc3RyZWFtX3J1bikKKwkJCQkJCSAgJiYgKGluc3RhbmNlLT5zdGF0dXMgIT0KKwkJCQkJCSAgICAgIGFvX3N0YXR1c19zdHJlYW1fZW5kX3dhaXQpKSwKKwkJCQkJCSBMT05HX01BWCk7CisKKwkJaWYgKGluc3RhbmNlLT5zdGF0dXMgIT0gYW9fc3RhdHVzX3N0cmVhbV9lbmQpIHsKKwkJCVBERUJVRygiV2FpdCBmb3IgSURMRSBjYW5jZWxlZC4gJWRcbiIsCisJCQkgICAgICAgaW5zdGFuY2UtPnN0YXR1cyk7CisJCQllcnIgPSBNRV9FUlJOT19DQU5DRUxMRUQ7CisJCX0KKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCVBFUlJPUigiV2FpdCBmb3IgSURMRSBpbnRlcnJ1cHRlZC5cbiIpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19ub25lOworCQkJYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJCX0KKworCQkqc3RhdHVzID0gTUVfU1RBVFVTX0lETEU7CisJfQorCisJKnZhbHVlcyA9IG1lX2NpcmNfYnVmX3NwYWNlKCZpbnN0YW5jZS0+Y2lyY19idWYpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19zdHJlYW1fc3RvcChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgc3RvcF9tb2RlLCBpbnQgZmxhZ3MpCit7CQkJCS8vIFN0b3Agd29yayBhbmQgZW1wdHkgYnVmZmVyIGFuZCBGSUZPCisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwl2b2xhdGlsZSB1aW50MzJfdCBjdHJsOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoZmxhZ3MgJiB+TUVfSU9fU1RSRUFNX1NUT1BfUFJFU0VSVkVfQlVGRkVSUykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKChzdG9wX21vZGUgIT0gTUVfU1RPUF9NT0RFX0lNTUVESUFURSkKKwkgICAgJiYgKHN0b3BfbW9kZSAhPSBNRV9TVE9QX01PREVfTEFTVF9WQUxVRSkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN0b3AgbW9kZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1RPUF9NT0RFOworCX0KKworCWlmICghaW5zdGFuY2UtPmZpZm8pIHsKKwkJUEVSUk9SKCJOb3QgYSBzdHJlYW1pbmcgYW8uXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7CisJfQorCisJaWYgKGluc3RhbmNlLT5zdGF0dXMgPCBhb19zdGF0dXNfc3RyZWFtX2NvbmZpZ3VyZWQpIHsKKwkJLy9UaGVyZSBpcyBub3RoaW5nIHRvIHN0b3AhCisJCVBFUlJPUigiU3ViZGV2aWNlIG5vdCBpbiBzdHJlYW1pbmcgbW9kZS4gJWRcbiIsCisJCSAgICAgICBpbnN0YW5jZS0+c3RhdHVzKTsKKwkJcmV0dXJuIE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwkvL01hcmsgYXMgc3RvcHBpbmcuID0+IFNvZnR3YXJlIHN0b3AuCisJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZW5kX3dhaXQ7CisKKwlpZiAoc3RvcF9tb2RlID09IE1FX1NUT1BfTU9ERV9JTU1FRElBVEUpIHsJLy9TdG9wcGVkIG5vdyEKKwkJZXJyID0gYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJfSBlbHNlIGlmIChzdG9wX21vZGUgPT0gTUVfU1RPUF9NT0RFX0xBU1RfVkFMVUUpIHsKKwkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpICYgTUU0NjAwX0FPX0NUUkxfTU9ERV9NQVNLOworCQlpZiAoY3RybCA9PSBNRTQ2MDBfQU9fTU9ERV9XUkFQQVJPVU5EKSB7CS8vSGFyZHdhcmUgd3JhcGFyb3VuZCA9PiBIYXJkd2FyZSBzdG9wLgorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkJCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCWN0cmwgfD0KKwkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8CisJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKwkJCWN0cmwgJj0gfk1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGN0cmwpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKwkJfQorCQkvL09ubHkgcnVuaW5nIHByb2Nlc3Mgd2lsbCBpbnRlcnJ1cHQgdGhpcyBjYWxsLiBFdmVudHMgYXJlIHNpZ25hbGVkIHdoZW4gc3RhdHVzIGNoYW5nZS4KKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaW5zdGFuY2UtPndhaXRfcXVldWUsCisJCQkJCQkgKGluc3RhbmNlLT5zdGF0dXMgIT0KKwkJCQkJCSAgYW9fc3RhdHVzX3N0cmVhbV9lbmRfd2FpdCksCisJCQkJCQkgTE9OR19NQVgpOworCisJCWlmIChpbnN0YW5jZS0+c3RhdHVzICE9IGFvX3N0YXR1c19zdHJlYW1fZW5kKSB7CisJCQlQREVCVUcoIlN0b3BwaW5nIHN0cmVhbSBjYW5jZWxlZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQl9CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlQRVJST1IoIlN0b3BwaW5nIHN0cmVhbSBpbnRlcnJ1cHRlZC5cbiIpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19ub25lOworCQkJYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJCX0KKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwljdHJsIHw9CisJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QIHwgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QIHwKKwkgICAgTUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKwljdHJsICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwlpZiAoIWZsYWdzKSB7CQkvL1Jlc2V0IEZJRk8KKwkJY3RybCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9GSUZPOworCX0KKwlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCWlmICghZmxhZ3MpIHsJCS8vUmVzZXQgc29mdHdhcmUgYnVmZmVyCisJCWluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkID0gMDsKKwkJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgPSAwOworCQlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ID0gMDsKKwkJaW5zdGFuY2UtPmRhdGFfY291bnQgPSAwOworCX0KKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYW9faW9fc3RyZWFtX3dyaXRlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IHdyaXRlX21vZGUsCisJCQkJICAgICBpbnQgKnZhbHVlcywgaW50ICpjb3VudCwgaW50IGZsYWdzKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3MgPSAwOworCXVpbnQzMl90IHJlZ19jb3B5OworCisJaW50IGNvcGllZF9mcm9tX3VzZXIgPSAwOworCWludCBsZWZ0X3RvX2NvcHlfZnJvbV91c2VyID0gKmNvdW50OworCisJaW50IGNvcGllZF92YWx1ZXM7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCS8vQ2hlY2tpbmcgYXJndW1lbnRzCisJaWYgKCFpbnN0YW5jZS0+ZmlmbykgeworCQlQRVJST1IoIk5vdCBhIHN0cmVhbWluZyBhby5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKKwl9CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICgqY291bnQgPD0gMCkgeworCQlQRVJST1IoIkludmFsaWQgY291bnQgb2YgdmFsdWVzIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9WQUxVRV9DT1VOVDsKKwl9CisKKwlpZiAodmFsdWVzID09IE5VTEwpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGFkZHJlc3Mgb2YgdmFsdWVzIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9QT0lOVEVSOworCX0KKworCWlmICgoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfbm9uZSkgfHwgKGluc3RhbmNlLT5zdGF0dXMgPT0gYW9fc3RhdHVzX3NpbmdsZV9jb25maWd1cmVkKSkgewkvL1RoZSBkZXZpY2UgaXMgaW4gc2luZ2xlIG1vZGUuCisJCVBFUlJPUgorCQkgICAgKCJTdWJkZXZpY2UgbXVzdCBiZSBwcmVpbml0aWFsaXplIGNvcnJlY3RseSBmb3Igc3RyZWFtaW5nLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJfQorLy8vIEBub3RlIElmIG5vICdwcmUtbG9hZCcgaXMgdXNlZC4gc3RyZWFtX3N0YXJ0KCkgd2lsbCBtb3ZlIGRhdGEgdG8gRklGTy4KKwlzd2l0Y2ggKHdyaXRlX21vZGUpIHsKKwljYXNlIE1FX1dSSVRFX01PREVfUFJFTE9BRDoKKworCQkvL0RldmljZSBtdXN0IGJlIHN0b3BwZWQuCisJCWlmICgoaW5zdGFuY2UtPnN0YXR1cyAhPSBhb19zdGF0dXNfc3RyZWFtX2NvbmZpZ3VyZWQpCisJCSAgICAmJiAoaW5zdGFuY2UtPnN0YXR1cyAhPSBhb19zdGF0dXNfc3RyZWFtX2VuZCkpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiU3ViZGV2aWNlIG11c3RuJ3QgYmUgcnVuaW5nIHdoZW4gJ3ByZS1sb2FkJyBtb2RlIGlzIHVzZWQuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBNRV9XUklURV9NT0RFX05PTkJMT0NLSU5HOgorCWNhc2UgTUVfV1JJVEVfTU9ERV9CTE9DS0lORzoKKwkJLy8vIEBub3RlIEluIGJsb2NraW5nIG1vZGU6IFdoZW4gZGV2aWNlIGlzIG5vdCBydW5pbmcgYW5kIHRoZXJlIGlzIG5vdCBlbm91Z2h0IHNwYWNlIGNhbGwgd2lsbCBibG9ja2VkIHVwIQorCQkvLy8gQG5vdGUgU29tZSBvdGhlciB0aHJlYWQgbXVzdCBlbXB0eSBidWZmZXIgYnkgc3RhcnRpbmcgZW5naW5lLgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCB3cml0ZSBtb2RlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9XUklURV9NT0RFOworCX0KKworCWlmIChpbnN0YW5jZS0+bW9kZSAmIE1FNDYwMF9BT19XUkFQX01PREUpIHsJLy9XcmFwYXJvdW5kIG1vZGUuIERldmljZSBtdXN0IGJlIHN0b3BwZWQuCisJCWlmICgoaW5zdGFuY2UtPnN0YXR1cyAhPSBhb19zdGF0dXNfc3RyZWFtX2NvbmZpZ3VyZWQpCisJCSAgICAmJiAoaW5zdGFuY2UtPnN0YXR1cyAhPSBhb19zdGF0dXNfc3RyZWFtX2VuZCkpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiU3ViZGV2aWNlIG11c3RuJ3QgYmUgcnVuaW5nIHdoZW4gJ3ByZS1sb2FkJyBtb2RlIGlzIHVzZWQuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1dSSVRFX01PREU7CisJCX0KKwl9CisKKwlpZiAoKGluc3RhbmNlLT5tb2RlID09IE1FNDYwMF9BT19IV19XUkFQX01PREUpICYmICh3cml0ZV9tb2RlICE9IE1FX1dSSVRFX01PREVfUFJFTE9BRCkpIHsJLy8gaGFyZHdhcmUgd3JhcF9hcm91bmQgbW9kZS4KKwkJLy9UaGlzIGlzIHRyYW5zcGFyZW50IGZvciB1c2VyLgorCQlQREVCVUcoIkNoYW5naW5nIHdyaXRlX21vZGUgdG8gTUVfV1JJVEVfTU9ERV9QUkVMT0FELlxuIik7CisJCXdyaXRlX21vZGUgPSBNRV9XUklURV9NT0RFX1BSRUxPQUQ7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJaWYgKHdyaXRlX21vZGUgPT0gTUVfV1JJVEVfTU9ERV9QUkVMT0FEKSB7CS8vSW5pdCBlbnZpcm9tZW50IC0gcHJlbG9hZAorCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQlyZWdfY29weSA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkvL0NoZWNrIEZJRk8KKwkJaWYgKCEocmVnX2NvcHkgJiBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk8pKSB7CS8vRklGTyBub3QgYWN0aXZlLiBFbmFibGUgaXQuCisJCQlyZWdfY29weSB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk87CisJCQlvdXRsKHJlZ19jb3B5LCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHJlZ19jb3B5KTsKKwkJCWluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgPSAwOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwl9CisKKwl3aGlsZSAoMSkgeworCQkvL0NvcHkgdG8gYnVmZmVyLiBUaGlzIHN0ZXAgaXMgY29tbW9uIGZvciBhbGwgbW9kZXMuCisJCWNvcGllZF9mcm9tX3VzZXIgPQorCQkgICAgYW9fZ2V0X2RhdGFfZnJvbV91c2VyKGluc3RhbmNlLCBsZWZ0X3RvX2NvcHlfZnJvbV91c2VyLAorCQkJCQkgIHZhbHVlcyArICgqY291bnQgLQorCQkJCQkJICAgIGxlZnRfdG9fY29weV9mcm9tX3VzZXIpKTsKKwkJbGVmdF90b19jb3B5X2Zyb21fdXNlciAtPSBjb3BpZWRfZnJvbV91c2VyOworCisJCXJlZ19jb3B5ID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKKwkJaWYgKChpbnN0YW5jZS0+c3RhdHVzID09IGFvX3N0YXR1c19zdHJlYW1fcnVuKSAmJiAhKHJlZ19jb3B5ICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkgewkvL0JST0tFTiBQSVBFISBUaGUgc3RhdGUgbWFjaGluZSBpcyBzdG9wZWQgYnV0IGxvZ2ljYWwgc3RhdHVzIHNob3cgdGhhdCBzaG91bGQgYmUgd29ya2luZy4KKwkJCVBFUlJPUigiQnJva2VuIHBpcGUgaW4gd3JpdGUuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX1NVQkRFVklDRV9OT1RfUlVOTklORzsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKChpbnN0YW5jZS0+c3RhdHVzID09IGFvX3N0YXR1c19zdHJlYW1fcnVuKSAmJiAoaW5zdGFuY2UtPm1vZGUgPT0gTUU0NjAwX0FPX0NPTlRJTk9VUykgJiYgKHJlZ19jb3B5ICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfSEYpKSB7CS8vQ29udGlub3VzIG1vZGUgcnVuaW5nIGFuZCBkYXRhIGFyZSBiZWxvdyBoYWxmIQorCisJCQkvLyBCbG9jayBpbnRlcnJ1cHRzLgorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkJCXJlZ19jb3B5ID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkvL3JlZ19jb3B5ICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCXJlZ19jb3B5IHw9IE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlE7CisJCQlvdXRsKHJlZ19jb3B5LCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHJlZ19jb3B5KTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisKKwkJCS8vRmFzdCBjb3B5CisJCQljb3BpZWRfdmFsdWVzID0KKwkJCSAgICBhb193cml0ZV9kYXRhKGluc3RhbmNlLCBNRTQ2MDBfQU9fRklGT19DT1VOVCAvIDIsCisJCQkJCSAgMCk7CisJCQlpZiAoY29waWVkX3ZhbHVlcyA+IDApIHsKKwkJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCArPSBjb3BpZWRfdmFsdWVzOworCQkJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICY9CisJCQkJICAgIGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLy8gQWN0aXZhdGUgaW50ZXJydXB0cy4KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJCQlyZWdfY29weSA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJLy9yZWdfY29weSB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCXJlZ19jb3B5ICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJROworCQkJb3V0bChyZWdfY29weSwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICByZWdfY29weSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCisJCQlpZiAoY29waWVkX3ZhbHVlcyA9PSAwKSB7CS8vVGhpcyB3YXMgY2hlY2tlZCBhbmQgbmV2ZXIgc2hvdWxkIGhhcHBlbmQhCisJCQkJUEVSUk9SX0NSSVRJQ0FMKCJDT1BJTkcgRklOSVNIIFdJVEggMCFcbiIpOworCQkJfQorCisJCQlpZiAoY29waWVkX3ZhbHVlcyA8IDApIHsJLy9UaGlzIHdhcyBjaGVja2VkIGFuZCBuZXZlciBzaG91bGQgaGFwcGVuZCEKKwkJCQlQRVJST1JfQ1JJVElDQUwKKwkJCQkgICAgKCJDT1BJTkcgRklOSVNIIFdJVEggQU4gRVJST1IhXG4iKTsKKwkJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9maWZvX2Vycm9yOworCQkJCWVyciA9IE1FX0VSUk5PX0ZJRk9fQlVGRkVSX09WRVJGTE9XOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKCFsZWZ0X3RvX2NvcHlfZnJvbV91c2VyKSB7CS8vQWxsIGRhdGFzIHdlcmUgY29waWVkLgorCQkJYnJlYWs7CisJCX0gZWxzZSB7CS8vTm90IGFsbCBkYXRhcyB3ZXJlIGNvcGllZC4KKwkJCWlmIChpbnN0YW5jZS0+bW9kZSAmIE1FNDYwMF9BT19XUkFQX01PREUpIHsJLy9FcnJvciB0b28gbXVjaCBkYXRhcyEgV3JhcGFyb3VuZCBpcyBsaW1pdGVkIGluIHNpemUhCisJCQkJUEVSUk9SCisJCQkJICAgICgiVG9vIG11Y2ggZGF0YSBmb3Igd3JhcGFyb3VuZCBtb2RlISAgRXhjZWVkZWQgc2l6ZSBvZiAlbGQuXG4iLAorCQkJCSAgICAgTUU0NjAwX0FPX0NJUkNfQlVGX0NPVU5UIC0gMSk7CisJCQkJZXJyID0gTUVfRVJSTk9fUklOR19CVUZGRVJfT1ZFUkZMT1c7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmICh3cml0ZV9tb2RlICE9IE1FX1dSSVRFX01PREVfQkxPQ0tJTkcpIHsJLy9Ob24gYmxvY2tpbmcgY2FsbHMKKwkJCQlicmVhazsKKwkJCX0KKworCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJIG1lX2NpcmNfYnVmX3NwYWNlKCZpbnN0YW5jZS0+CisJCQkJCQkJCSAgIGNpcmNfYnVmKSk7CisKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCVBFUlJPUigiV3JpdGluZyBpbnRlcnJ1cHRlZCBieSBzaWduYWwuXG4iKTsKKwkJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX25vbmU7CisJCQkJYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfbm9uZSkgewkvL1Jlc2V0CisJCQkJUEVSUk9SKCJXcml0aW5nIGludGVycnVwdGVkIGJ5IHJlc2V0LlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKHdyaXRlX21vZGUgPT0gTUVfV1JJVEVfTU9ERV9QUkVMT0FEKSB7CS8vQ29weSBkYXRhIHRvIEZJRk8gLSBwcmVsb2FkCisJCWNvcGllZF92YWx1ZXMgPQorCQkgICAgYW9fd3JpdGVfZGF0YV9wb29saW5nKGluc3RhbmNlLCBNRTQ2MDBfQU9fRklGT19DT1VOVCwKKwkJCQkJICBpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50KTsKKwkJaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCArPSBjb3BpZWRfdmFsdWVzOworCQlpbnN0YW5jZS0+ZGF0YV9jb3VudCArPSBjb3BpZWRfdmFsdWVzOworCisJCWlmICgoaW5zdGFuY2UtPm1vZGUgPT0gTUU0NjAwX0FPX0hXX1dSQVBfTU9ERSkKKwkJICAgICYmIChtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1ZikgPgorCQkJTUU0NjAwX0FPX0ZJRk9fQ09VTlQpKSB7CisJCQlQRVJST1IKKwkJCSAgICAoIlRvbyBtdWNoIGRhdGEgZm9yIGhhcmR3YXJlIHdyYXBhcm91bmQgbW9kZSEgRXhjZWVkZWQgc2l6ZSBvZiAlZC5cbiIsCisJCQkgICAgIE1FNDYwMF9BT19GSUZPX0NPVU5UKTsKKwkJCWVyciA9IE1FX0VSUk5PX0ZJRk9fQlVGRkVSX09WRVJGTE9XOworCQl9CisJfQorCisJKmNvdW50ID0gKmNvdW50IC0gbGVmdF90b19jb3B5X2Zyb21fdXNlcjsKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CitzdGF0aWMgaXJxcmV0dXJuX3QgbWU0NjAwX2FvX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLCA2LCAxOSkKKwkJCQkgLCBzdHJ1Y3QgcHRfcmVncyAqcmVncworI2VuZGlmCisgICAgKQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2UgPSBkZXZfaWQ7CisJdWludDMyX3QgaXJxX3N0YXR1czsKKwl1aW50MzJfdCBjdHJsOworCXVpbnQzMl90IHN0YXR1czsKKwlpbnQgY291bnQgPSAwOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmIChpcnEgIT0gaW5zdGFuY2UtPmlycSkgeworCQlQRVJST1IoIkluY29ycmVjdCBpbnRlcnJ1cHQgbnVtOiAlZC5cbiIsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpcnFfc3RhdHVzID0gaW5sKGluc3RhbmNlLT5pcnFfc3RhdHVzX3JlZyk7CisJaWYgKCEoaXJxX3N0YXR1cyAmIChNRTQ2MDBfSVJRX1NUQVRVU19CSVRfQU9fSEYgPDwgaW5zdGFuY2UtPmFvX2lkeCkpKSB7CisJCVBJTkZPKCIlbGQgU2hhcmVkIGludGVycnVwdC4gJXMoKTogSUQ9JWQ6IHN0YXR1c19yZWc9MHglMDRYXG4iLAorCQkgICAgICBqaWZmaWVzLCBfX2Z1bmNfXywgaW5zdGFuY2UtPmFvX2lkeCwgaXJxX3N0YXR1cyk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpZiAoIWluc3RhbmNlLT5jaXJjX2J1Zi5idWYpIHsKKwkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZXJyb3I7CisJCVBFUlJPUl9DUklUSUNBTCgiQ0lSQ1VMQVIgQlVGRkVSIE5PVCBFWElTVFMhXG4iKTsKKwkJLy9CbG9jayBpbnRlcnJ1cHRzLiBTdG9wIG1hY2hpbmUuCisJCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJY3RybCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCWN0cmwgfD0KKwkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlEgfAorCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QIHwgTUU0NjAwX0FPX0NUUkxfQklUX1NUT1A7CisJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisKKwkJLy9JbmZvcm0gdXNlcgorCQl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlzdGF0dXMgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpOworCWlmICghKHN0YXR1cyAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsJLy9Ub28gbGF0ZS4gTm90IHdvcmtpbmchIEVORD8gQlJPS0VOIFBJUEU/CisJCVBERUJVRygiSW50ZXJydXB0IGNvbWUgYnV0IElTTSBpcyBub3Qgd29ya2luZyFcbiIpOworCQkvL0Jsb2NrIGludGVycnVwdHMuIFN0b3AgbWFjaGluZS4KKwkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQljdHJsICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJY3RybCB8PQorCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUSB8IE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QIHwKKwkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUDsKKwkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCS8vR2VuZXJhbCBwcm9jZWR1cmUuIFByb2Nlc3MgbW9yZSBkYXRhcy4KKworI2lmZGVmIE1FREVCVUdfREVCVUcKKwlpZiAoIW1lX2NpcmNfYnVmX3ZhbHVlcygmaW5zdGFuY2UtPmNpcmNfYnVmKSkgewkvL0J1ZmZlciBpcyBlbXB0eSEKKwkJUERFQlVHKCJDaXJjdWxhciBidWZmZXIgZW1wdHkhXG4iKTsKKwl9CisjZW5kaWYKKworCS8vQ2hlY2sgRklGTworCWlmIChzdGF0dXMgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9IRikgewkvL09LIGxlc3MgdGhhbiBoYWxmCisKKwkJLy9CbG9jayBpbnRlcnJ1cHRzCisJCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJY3RybCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCWN0cmwgfD0gTUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKwkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKworCQlkbyB7CisJCQkvL0NhbGN1bGF0ZSBob3cgbWFueSBzaG91bGQgYmUgY29waWVkLgorCQkJY291bnQgPQorCQkJICAgIChpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50KSA/IGluc3RhbmNlLT4KKwkJCSAgICBzdG9wX2RhdGFfY291bnQgLQorCQkJICAgIGluc3RhbmNlLT5kYXRhX2NvdW50IDogTUU0NjAwX0FPX0ZJRk9fQ09VTlQgLyAyOworCQkJaWYgKE1FNDYwMF9BT19GSUZPX0NPVU5UIC8gMiA8IGNvdW50KSB7CisJCQkJY291bnQgPSBNRTQ2MDBfQU9fRklGT19DT1VOVCAvIDI7CisJCQl9CisJCQkvL0NvcHkgZGF0YQorCQkJaWYgKGluc3RhbmNlLT5tb2RlID09IE1FNDYwMF9BT19DT05USU5PVVMpIHsJLy9Db250aW5vdXMKKwkJCQljb3VudCA9IGFvX3dyaXRlX2RhdGEoaW5zdGFuY2UsIGNvdW50LCAwKTsKKwkJCQlpZiAoY291bnQgPiAwKSB7CisJCQkJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICs9IGNvdW50OworCQkJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCAmPQorCQkJCQkgICAgaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJCQkJCWluc3RhbmNlLT5kYXRhX2NvdW50ICs9IGNvdW50OworCisJCQkJCWlmICgoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfc3RyZWFtX2VuZF93YWl0KSAmJiAhbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpKSB7CS8vU3RvcGluZy4gV2hvbGUgYnVmZmVyIHdhcyBjb3BpZWQuCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSBpZiAoKGluc3RhbmNlLT5tb2RlID09IE1FNDYwMF9BT19TV19XUkFQX01PREUpICYmICgoY3RybCAmIE1FNDYwMF9BT19DVFJMX01PREVfTUFTSykgPT0gTUU0NjAwX0FPX01PREVfQ09OVElOVU9VUykpIHsJLy9XcmFwYXJvdW5kIChzb2Z0d2FyZSkKKwkJCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfc3RyZWFtX2VuZF93YWl0KSB7CS8vV2Ugc3RvcGluZyA9PiBDb3B5IHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KKwkJCQkJY291bnQgPQorCQkJCQkgICAgYW9fd3JpdGVfZGF0YShpbnN0YW5jZSwgY291bnQsIDApOworCQkJCX0gZWxzZSB7CS8vQ29weSBpbiB3cmFwYXJvdW5kIG1vZGUuCisJCQkJCWNvdW50ID0KKwkJCQkJICAgIGFvX3dyaXRlX2RhdGFfd3JhcGFyb3VuZChpbnN0YW5jZSwKKwkJCQkJCQkJICAgICBjb3VudCwKKwkJCQkJCQkJICAgICBpbnN0YW5jZS0+CisJCQkJCQkJCSAgICAgcHJlbG9hZGVkX2NvdW50KTsKKwkJCQl9CisKKwkJCQlpZiAoY291bnQgPiAwKSB7CisJCQkJCWluc3RhbmNlLT5kYXRhX2NvdW50ICs9IGNvdW50OworCQkJCQlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ICs9IGNvdW50OworCQkJCQlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ICU9CisJCQkJCSAgICBtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT4KKwkJCQkJCQkgICAgICAgY2lyY19idWYpOworCisJCQkJCWlmICgoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfc3RyZWFtX2VuZF93YWl0KSAmJiAhaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCkgewkvL1N0b3BpbmcuIFdob2xlIGJ1ZmZlciB3YXMgY29waWVkLgorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWlmICgoY291bnQgPD0gMCkgfHwgKGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgJiYgKGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgPD0gaW5zdGFuY2UtPmRhdGFfY291bnQpKSkgewkvL0VuZCBvZiB3b3JrLgorCQkJCWJyZWFrOworCQkJfQorCQl9CQkvL1JlcGVhdCBpZiBzdGlsbCBpcyB1bmRlciBoYWxmIGZpZm8KKwkJd2hpbGUgKChzdGF0dXMgPQorCQkJaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSkgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9IRik7CisKKwkJLy9VbmJsb2NrIGludGVycnVwdHMKKwkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlpZiAoY291bnQgPj0gMCkgewkvL0NvcHkgd2FzIHN1Y2Nlc3NmdWwuCisJCQlpZiAoaW5zdGFuY2UtPnN0b3BfZGF0YV9jb3VudCAmJiAoaW5zdGFuY2UtPnN0b3BfZGF0YV9jb3VudCA8PSBpbnN0YW5jZS0+ZGF0YV9jb3VudCkpIHsJLy9GaW5pc2hpbmcgd29yay4gTm8gbW9yZSBpbnRlcnJ1cHRzLgorCQkJCVBERUJVRygiRmluaXNoaW5nIHdvcmsuIEludGVycnVwdCBkaXNhYmxlZC5cbiIpOworCQkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2VuZF93YWl0OworCQkJfSBlbHNlIGlmIChjb3VudCA+IDApIHsJLy9Ob3JtYWwgd29yay4gRW5hYmxlIGludGVycnVwdC4KKwkJCQlQREVCVUcoIk5vcm1hbCB3b3JrLiBFbmFibGUgaW50ZXJydXB0LlxuIik7CisJCQkJY3RybCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKwkJCQljdHJsIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQkJfSBlbHNlIHsJLy9Ob3JtYWwgd29yayBidXQgdGhlcmUgYXJlIG5vIG1vcmUgZGF0YSBpbiBidWZmZXIuIEludGVycnVwdCBhY3RpdmUgYnV0IGJsb2NrZWQuIHN0cmVhbV93cml0ZSgpIHdpbGwgdW5ibG9jayBpdC4KKwkJCQlQREVCVUcKKwkJCQkgICAgKCJObyBkYXRhIGluIHNvZnR3YXJlIGJ1ZmZlci4gSW50ZXJydXB0IGJsb2NrZWQuXG4iKTsKKwkJCQljdHJsIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQkJfQorCQl9IGVsc2UgewkvL0Vycm9yIGR1cmluZyBjb3B5LgorCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZmlmb19lcnJvcjsKKwkJfQorCisJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJfSBlbHNlIHsJCS8vPz8gbW9yZSB0aGFuIGhhbGYKKwkJUERFQlVHCisJCSAgICAoIkludGVycnVwdCBjb21lIGJ1dCBGSUZPIG1vcmUgdGhhbiBoYWxmIGZ1bGwhIFJlc2V0IGludGVycnVwdC5cbiIpOworCQkvL1Jlc2V0IHBlbmRpbmcgaW50ZXJydXB0CisJCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJY3RybCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJROworCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCQljdHJsICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJROworCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCX0KKworCVBJTkZPKCJJU1I6IEJ1ZmZlciBjb3VudDogJWQuKFQ6JWQgSDolZClcbiIsCisJICAgICAgbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpLCBpbnN0YW5jZS0+Y2lyY19idWYudGFpbCwKKwkgICAgICBpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCk7CisJUElORk8oIklTUjogU3RvcCBjb3VudDogJWQuXG4iLCBpbnN0YW5jZS0+c3RvcF9jb3VudCk7CisJUElORk8oIklTUjogU3RvcCBkYXRhIGNvdW50OiAlZC5cbiIsIGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQpOworCVBJTkZPKCJJU1I6IERhdGEgY291bnQ6ICVkLlxuIiwgaW5zdGFuY2UtPmRhdGFfY291bnQpOworCisJLy9JbmZvcm0gdXNlcgorCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgbWU0NjAwX2FvX2Rlc3RydWN0b3Ioc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlKQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWluc3RhbmNlLT5hb19jb250cm9sX3Rhc2tfZmxhZyA9IDA7CisKKwkvLyBSZXNldCBzdWJkZXZpY2UgdG8gYXN1cmUgY2xlYW4gZXhpdC4KKwltZTQ2MDBfYW9faW9fcmVzZXRfc3ViZGV2aWNlKHN1YmRldmljZSwgTlVMTCwKKwkJCQkgICAgIE1FX0lPX1JFU0VUX1NVQkRFVklDRV9OT19GTEFHUyk7CisKKwkvLyBSZW1vdmUgYW55IHRhc2tzIGZyb20gd29yayBxdWV1ZS4gVGhpcyBpcyBwYXJhbm9pYyBiZWNhdXNlIGl0IHdhcyBkb25lIGFsbHJlYWR5IGluIHJlc2V0KCkuCisJaWYgKCFjYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrKSkgewkvL1dhaXQgMiB0aWNrcyB0byBiZSBzdXJlIHRoYXQgY29udHJvbCB0YXNrIGlzIHJlbW92ZWQgZnJvbSBxdWV1ZS4KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgyKTsKKwl9CisKKwlpZiAoaW5zdGFuY2UtPmZpZm8pIHsKKwkJaWYgKGluc3RhbmNlLT5pcnEpIHsKKwkJCWZyZWVfaXJxKGluc3RhbmNlLT5pcnEsIGluc3RhbmNlKTsKKwkJCWluc3RhbmNlLT5pcnEgPSAwOworCQl9CisKKwkJaWYgKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYpIHsKKwkJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZiwKKwkJCQkgICBNRTQ2MDBfQU9fQ0lSQ19CVUZfU0laRV9PUkRFUik7CisJCX0KKwkJaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZiA9IE5VTEw7CisJfQorCisJbWVfc3ViZGV2aWNlX2RlaW5pdCgmaW5zdGFuY2UtPmJhc2UpOworCWtmcmVlKGluc3RhbmNlKTsKK30KKworbWU0NjAwX2FvX3N1YmRldmljZV90ICptZTQ2MDBfYW9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgc3BpbmxvY2tfdCAqIHByZWxvYWRfcmVnX2xvY2ssCisJCQkJCSAgICAgdWludDMyX3QgKiBwcmVsb2FkX2ZsYWdzLAorCQkJCQkgICAgIGludCBhb19pZHgsCisJCQkJCSAgICAgaW50IGZpZm8sCisJCQkJCSAgICAgaW50IGlycSwKKwkJCQkJICAgICBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqbWU0NjAwX3dxKQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCWludCBlcnI7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGFvX2lkeCk7CisKKwkvLyBBbGxvY2F0ZSBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZS4KKwlzdWJkZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTQ2MDBfYW9fc3ViZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghc3ViZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc3ViZGV2aWNlLCAwLCBzaXplb2YobWU0NjAwX2FvX3N1YmRldmljZV90KSk7CisKKwkvLyBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzLgorCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9ja3MuCisJc3Bpbl9sb2NrX2luaXQoJnN1YmRldmljZS0+c3ViZGV2aWNlX2xvY2spOworCisJc3ViZGV2aWNlLT5wcmVsb2FkX3JlZ19sb2NrID0gcHJlbG9hZF9yZWdfbG9jazsKKwlzdWJkZXZpY2UtPnByZWxvYWRfZmxhZ3MgPSBwcmVsb2FkX2ZsYWdzOworCisJLy8gU3RvcmUgYW5hbG9nIG91dHB1dCBpbmRleC4KKwlzdWJkZXZpY2UtPmFvX2lkeCA9IGFvX2lkeDsKKworCS8vIFN0b3JlIGlmIGFuYWxvZyBvdXRwdXQgaGFzIGZpZm8uCisJc3ViZGV2aWNlLT5maWZvID0gKGFvX2lkeCA8IGZpZm8pID8gMSA6IDA7CisKKwlpZiAoc3ViZGV2aWNlLT5maWZvKSB7CS8vIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGNpcmN1bGFyIGJ1ZmZlci4KKwkJc3ViZGV2aWNlLT5jaXJjX2J1Zi5tYXNrID0gTUU0NjAwX0FPX0NJUkNfQlVGX0NPVU5UIC0gMTsKKworCQlzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZiA9CisJCSAgICAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwKKwkJCQkJICAgICBNRTQ2MDBfQU9fQ0lSQ19CVUZfU0laRV9PUkRFUik7CisJCVBERUJVRygiY2lyY19idWYgPSAlcCBzaXplPSVsZFxuIiwgc3ViZGV2aWNlLT5jaXJjX2J1Zi5idWYsCisJCSAgICAgICBNRTQ2MDBfQU9fQ0lSQ19CVUZfU0laRSk7CisKKwkJaWYgKCFzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZikgeworCQkJUEVSUk9SCisJCQkgICAgKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVtc2V0KHN1YmRldmljZS0+Y2lyY19idWYuYnVmLCAwLCBNRTQ2MDBfQU9fQ0lSQ19CVUZfU0laRSk7CisJfSBlbHNlIHsJCS8vIE5vIEZJRk8uCisJCXN1YmRldmljZS0+Y2lyY19idWYubWFzayA9IDA7CisJCXN1YmRldmljZS0+Y2lyY19idWYuYnVmID0gTlVMTDsKKwl9CisKKwlzdWJkZXZpY2UtPmNpcmNfYnVmLmhlYWQgPSAwOworCXN1YmRldmljZS0+Y2lyY19idWYudGFpbCA9IDA7CisKKwlzdWJkZXZpY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19ub25lOworCXN1YmRldmljZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgPSAwOworCXN1YmRldmljZS0+dGltZW91dC5kZWxheSA9IDA7CisJc3ViZGV2aWNlLT50aW1lb3V0LnN0YXJ0X3RpbWUgPSBqaWZmaWVzOworCisJLy8gSW5pdGlhbGl6ZSB3YWl0IHF1ZXVlLgorCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnN1YmRldmljZS0+d2FpdF9xdWV1ZSk7CisKKwkvLyBJbml0aWFsaXplIHNpbmdsZSB2YWx1ZSB0byAwVi4KKwlzdWJkZXZpY2UtPnNpbmdsZV92YWx1ZSA9IDB4ODAwMDsKKwlzdWJkZXZpY2UtPnNpbmdsZV92YWx1ZV9pbl9maWZvID0gMHg4MDAwOworCisJLy8gUmVnaXN0ZXIgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZS4KKwlpZiAoc3ViZGV2aWNlLT5maWZvKSB7CisJCXN1YmRldmljZS0+aXJxID0gaXJxOworCQlpZiAocmVxdWVzdF9pcnEoc3ViZGV2aWNlLT5pcnEsIG1lNDYwMF9hb19pc3IsCisjaWZkZWYgSVJRRl9ESVNBQkxFRAorCQkJCUlSUUZfRElTQUJMRUQgfCBJUlFGX1NIQVJFRCwKKyNlbHNlCisJCQkJU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEsCisjZW5kaWYKKwkJCQlNRTQ2MDBfTkFNRSwgc3ViZGV2aWNlKSkgeworCQkJUEVSUk9SKCJDYW5ub3QgZ2V0IGludGVycnVwdCBsaW5lLlxuIik7CisJCQlQREVCVUcoImZyZWUgY2lyY19idWYgPSAlcCBzaXplPSVkIiwKKwkJCSAgICAgICBzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZiwKKwkJCSAgICAgICBQQUdFX1NISUZUIDw8IE1FNDYwMF9BT19DSVJDX0JVRl9TSVpFX09SREVSKTsKKwkJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpc3ViZGV2aWNlLT5jaXJjX2J1Zi5idWYsCisJCQkJICAgTUU0NjAwX0FPX0NJUkNfQlVGX1NJWkVfT1JERVIpOworCQkJbWVfc3ViZGV2aWNlX2RlaW5pdCgobWVfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlKTsKKwkJCWtmcmVlKHN1YmRldmljZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlQSU5GTygiUmVnaXN0ZXJlZCBpcnE9JWQuXG4iLCBzdWJkZXZpY2UtPmlycSk7CisJfSBlbHNlIHsKKwkJc3ViZGV2aWNlLT5pcnEgPSAwOworCX0KKworCS8vIEluaXRpYWxpemUgcmVnaXN0ZXJzLgorCXN1YmRldmljZS0+aXJxX3N0YXR1c19yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9JUlFfU1RBVFVTX1JFRzsKKwlzdWJkZXZpY2UtPnByZWxvYWRfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fU1lOQ19SRUc7CisJaWYgKGFvX2lkeCA9PSAwKSB7CisJCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMF9DVFJMX1JFRzsKKwkJc3ViZGV2aWNlLT5zdGF0dXNfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDBfU1RBVFVTX1JFRzsKKwkJc3ViZGV2aWNlLT5maWZvX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAwX0ZJRk9fUkVHOworCQlzdWJkZXZpY2UtPnNpbmdsZV9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMF9TSU5HTEVfUkVHOworCQlzdWJkZXZpY2UtPnRpbWVyX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAwX1RJTUVSX1JFRzsKKwkJc3ViZGV2aWNlLT5yZWdfYmFzZSA9IHJlZ19iYXNlOworCQlzdWJkZXZpY2UtPmJpdHBhdHRlcm4gPSAwOworCX0gZWxzZSBpZiAoYW9faWR4ID09IDEpIHsKKwkJc3ViZGV2aWNlLT5jdHJsX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAxX0NUUkxfUkVHOworCQlzdWJkZXZpY2UtPnN0YXR1c19yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMV9TVEFUVVNfUkVHOworCQlzdWJkZXZpY2UtPmZpZm9fcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDFfRklGT19SRUc7CisJCXN1YmRldmljZS0+c2luZ2xlX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAxX1NJTkdMRV9SRUc7CisJCXN1YmRldmljZS0+dGltZXJfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDFfVElNRVJfUkVHOworCQlzdWJkZXZpY2UtPnJlZ19iYXNlID0gcmVnX2Jhc2U7CisJCXN1YmRldmljZS0+Yml0cGF0dGVybiA9IDA7CisJfSBlbHNlIGlmIChhb19pZHggPT0gMikgeworCQlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDJfQ1RSTF9SRUc7CisJCXN1YmRldmljZS0+c3RhdHVzX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAyX1NUQVRVU19SRUc7CisJCXN1YmRldmljZS0+Zmlmb19yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMl9GSUZPX1JFRzsKKwkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDJfU0lOR0xFX1JFRzsKKwkJc3ViZGV2aWNlLT50aW1lcl9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMl9USU1FUl9SRUc7CisJCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKwkJc3ViZGV2aWNlLT5iaXRwYXR0ZXJuID0gMDsKKwl9IGVsc2UgaWYgKGFvX2lkeCA9PSAzKSB7CisJCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wM19DVFJMX1JFRzsKKwkJc3ViZGV2aWNlLT5zdGF0dXNfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDNfU1RBVFVTX1JFRzsKKwkJc3ViZGV2aWNlLT5maWZvX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAzX0ZJRk9fUkVHOworCQlzdWJkZXZpY2UtPnNpbmdsZV9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wM19TSU5HTEVfUkVHOworCQlzdWJkZXZpY2UtPnRpbWVyX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAzX1RJTUVSX1JFRzsKKwkJc3ViZGV2aWNlLT5yZWdfYmFzZSA9IHJlZ19iYXNlOworCQlzdWJkZXZpY2UtPmJpdHBhdHRlcm4gPSAxOworCX0gZWxzZSB7CisJCVBFUlJPUl9DUklUSUNBTCgiV1JPTkcgU1VCREVWSUNFIGlkeD0lZCEiLCBhb19pZHgpOworCQltZV9zdWJkZXZpY2VfZGVpbml0KChtZV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2UpOworCQlpZiAoc3ViZGV2aWNlLT5maWZvKSB7CisJCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXN1YmRldmljZS0+Y2lyY19idWYuYnVmLAorCQkJCSAgIE1FNDYwMF9BT19DSVJDX0JVRl9TSVpFX09SREVSKTsKKwkJfQorCQlzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZiA9IE5VTEw7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8vIE92ZXJyaWRlIGJhc2UgY2xhc3MgbWV0aG9kcy4KKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2Rlc3RydWN0b3IgPSBtZTQ2MDBfYW9fZGVzdHJ1Y3RvcjsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSA9CisJICAgIG1lNDYwMF9hb19pb19yZXNldF9zdWJkZXZpY2U7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfY29uZmlnID0KKwkgICAgbWU0NjAwX2FvX2lvX3NpbmdsZV9jb25maWc7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfcmVhZCA9IG1lNDYwMF9hb19pb19zaW5nbGVfcmVhZDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV93cml0ZSA9CisJICAgIG1lNDYwMF9hb19pb19zaW5nbGVfd3JpdGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zdHJlYW1fY29uZmlnID0KKwkgICAgbWU0NjAwX2FvX2lvX3N0cmVhbV9jb25maWc7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zdHJlYW1fbmV3X3ZhbHVlcyA9CisJICAgIG1lNDYwMF9hb19pb19zdHJlYW1fbmV3X3ZhbHVlczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3N0cmVhbV93cml0ZSA9CisJICAgIG1lNDYwMF9hb19pb19zdHJlYW1fd3JpdGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zdHJlYW1fc3RhcnQgPQorCSAgICBtZTQ2MDBfYW9faW9fc3RyZWFtX3N0YXJ0OworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3N0YXR1cyA9CisJICAgIG1lNDYwMF9hb19pb19zdHJlYW1fc3RhdHVzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3N0b3AgPSBtZTQ2MDBfYW9faW9fc3RyZWFtX3N0b3A7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMgPQorCSAgICBtZTQ2MDBfYW9fcXVlcnlfbnVtYmVyX2NoYW5uZWxzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGUgPQorCSAgICBtZTQ2MDBfYW9fcXVlcnlfc3ViZGV2aWNlX3R5cGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyA9CisJICAgIG1lNDYwMF9hb19xdWVyeV9zdWJkZXZpY2VfY2FwczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3MgPQorCSAgICBtZTQ2MDBfYW9fcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJnczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXggPQorCSAgICBtZTQ2MDBfYW9fcXVlcnlfcmFuZ2VfYnlfbWluX21heDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9yYW5nZXMgPQorCSAgICBtZTQ2MDBfYW9fcXVlcnlfbnVtYmVyX3JhbmdlczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3JhbmdlX2luZm8gPQorCSAgICBtZTQ2MDBfYW9fcXVlcnlfcmFuZ2VfaW5mbzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3RpbWVyID0gbWU0NjAwX2FvX3F1ZXJ5X3RpbWVyOworCisJLy8gUHJlcGFyZSB3b3JrIHF1ZXVlCisJc3ViZGV2aWNlLT5tZTQ2MDBfd29ya3F1ZXVlID0gbWU0NjAwX3dxOworCisvKiB3b3JrcXVldWUgQVBJIGNoYW5nZWQgaW4ga2VybmVsIDIuNi4yMCAqLworI2lmICggTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSApCisJSU5JVF9XT1JLKCZzdWJkZXZpY2UtPmFvX2NvbnRyb2xfdGFzaywgbWU0NjAwX2FvX3dvcmtfY29udHJvbF90YXNrLAorCQkgICh2b2lkICopc3ViZGV2aWNlKTsKKyNlbHNlCisJSU5JVF9ERUxBWUVEX1dPUksoJnN1YmRldmljZS0+YW9fY29udHJvbF90YXNrLAorCQkJICBtZTQ2MDBfYW9fd29ya19jb250cm9sX3Rhc2spOworI2VuZGlmCisKKwlpZiAoc3ViZGV2aWNlLT5maWZvKSB7CS8vIFNldCBzcGVlZCBmb3Igc2luZ2xlIG9wZXJhdGlvbnMuCisJCW91dGwoTUU0NjAwX0FPX01JTl9DSEFOX1RJQ0tTIC0gMSwgc3ViZGV2aWNlLT50aW1lcl9yZWcpOworCQlzdWJkZXZpY2UtPmhhcmR3YXJlX3N0b3BfZGVsYXkgPSBIWiAvIDEwOwkvLzEwMG1zCisJfQorCisJcmV0dXJuIHN1YmRldmljZTsKK30KKworLyoqIEBicmllZiBTdG9wIHByZXNlbnRhdGlvbi4gUHJlc2VydmUgRklGT3MuCisqCisqIEBwYXJhbSBpbnN0YW5jZSBUaGUgc3ViZGV2aWNlIGluc3RhbmNlIChwb2ludGVyKS4KKyovCitpbnQgaW5saW5lIGFvX3N0b3BfaW1tZWRpYXRlbHkobWU0NjAwX2FvX3N1YmRldmljZV90ICogaW5zdGFuY2UpCit7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisJdWludDMyX3QgY3RybDsKKwlpbnQgdGltZW91dDsKKwlpbnQgaTsKKworCXRpbWVvdXQgPQorCSAgICAoaW5zdGFuY2UtPmhhcmR3YXJlX3N0b3BfZGVsYXkgPgorCSAgICAgKEhaIC8gMTApKSA/IGluc3RhbmNlLT5oYXJkd2FyZV9zdG9wX2RlbGF5IDogSFogLyAxMDsKKwlmb3IgKGkgPSAwOyBpIDw9IHRpbWVvdXQ7IGkrKykgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQkvLyBTdG9wIGFsbCBhY3Rpb25zLiBObyBjb25kaXRpb25zISBCbG9jayBpbnRlcnJ1cHRzLiBMZWF2ZSBGSUZPIHVudG91Y2hlZCEKKwkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQljdHJsIHw9CisJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8IE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUAorCQkgICAgfCBNRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJROworCQljdHJsICY9CisJCSAgICB+KE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJRIHwKKwkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHKTsKKwkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJCWlmICghKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CS8vIEV4aXQuCisJCQlicmVhazsKKwkJfQorCQkvL1N0aWxsIHdvcmtpbmchCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJfQorCisJaWYgKGkgPiB0aW1lb3V0KSB7CisJCVBFUlJPUl9DUklUSUNBTCgiRlNNIElTIEJVU1khXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworLyoqIEBicmllZiBDb3B5IGRhdGEgZnJvbSBjaXJjdWxhciBidWZmZXIgdG8gZmlmbyAoZmFzdCkgaW4gd3JhcGFyb3VuZC4KKyogQG5vdGUgVGhpcyBpcyB0aW1lIGNyaXRpY2FsIGZ1bmN0aW9uLiBDaGVja2luZyBpcyBkb25lIGF0IGJlZ2luaW5nIGFuZCBlbmQgb25seS4KKyogQG5vdGUgVGhlIGlzIG5vdCByZWFzb25hYmxlIHdheSB0byBjaGVjayBob3cgbWFueSB3YWx1ZXMgd2FzIGluIEZJRk8gYXQgYmVnaW5pbmcuIFRoZSBjb3VudCBtdXN0IGJlIG1hbmFnZWQgZXh0ZXJuYWx5LgorKgorKiBAcGFyYW0gaW5zdGFuY2UgVGhlIHN1YmRldmljZSBpbnN0YW5jZSAocG9pbnRlcikuCisqIEBwYXJhbSBjb3VudCBNYXhpbXVtIG51bWJlciBvZiBjb3BpZWQgZGF0YS4KKyogQHBhcmFtIHN0YXJ0X3BvcyBQb3NpdGlvbiBvZiB0aGUgZmlycyB2YWx1ZSBpbiBidWZmZXIuCisqCisqIEByZXR1cm4gT24gc3VjY2VzczogTnVtYmVyIG9mIGNvcGllZCBkYXRhLgorKiBAcmV0dXJuIE9uIGVycm9yL3N1Y2Nlc3M6IDAuCU5vIGRhdGFzIHdlcmUgY29waWVkID0+IG5vIGRhdGEgaW4gYnVmZmVyLgorKiBAcmV0dXJuIE9uIGVycm9yOiAtTUVfRVJSTk9fRklGT19CVUZGRVJfT1ZFUkZMT1cuCisqLworaW50IGlubGluZSBhb193cml0ZV9kYXRhX3dyYXBhcm91bmQobWU0NjAwX2FvX3N1YmRldmljZV90ICogaW5zdGFuY2UsIGludCBjb3VudCwKKwkJCQkgICAgaW50IHN0YXJ0X3BvcykKK3sJCQkJLy8vIEBub3RlIFRoaXMgaXMgdGltZSBjcml0aWNhbCBmdW5jdGlvbiEKKwl1aW50MzJfdCBzdGF0dXM7CisJdWludDMyX3QgdmFsdWU7CisJaW50IHBvcyA9CisJICAgIChpbnN0YW5jZS0+Y2lyY19idWYudGFpbCArIHN0YXJ0X3BvcykgJiBpbnN0YW5jZS0+Y2lyY19idWYubWFzazsKKwlpbnQgbG9jYWxfY291bnQgPSBjb3VudDsKKwlpbnQgaSA9IDE7CisKKwlpZiAoY291bnQgPD0gMCkgewkvL1dyb25nIGNvdW50IQorCQlyZXR1cm4gMDsKKwl9CisKKwl3aGlsZSAoaSA8IGxvY2FsX2NvdW50KSB7CisJCS8vR2V0IHZhbHVlIGZyb20gYnVmZmVyCisJCXZhbHVlID0gKihpbnN0YW5jZS0+Y2lyY19idWYuYnVmICsgcG9zKTsKKwkJLy9QcmVwYXJlIGl0CisJCWlmIChpbnN0YW5jZS0+YW9faWR4ICYgMHgxKSB7CisJCQl2YWx1ZSA8PD0gMTY7CisJCX0KKwkJLy9QdXQgdmFsdWUgdG8gRklGTworCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkvL1BERUJVR19SRUcoImlkeD0lZCBmaWZvX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+YW9faWR4LCBpbnN0YW5jZS0+cmVnX2Jhc2UsIGluc3RhbmNlLT5maWZvX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdmFsdWUpOworCisJCXBvcysrOworCQlwb3MgJj0gaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJCWlmIChwb3MgPT0gaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQpIHsKKwkJCXBvcyA9IGluc3RhbmNlLT5jaXJjX2J1Zi50YWlsOworCQl9CisJCWkrKzsKKwl9CisKKwlzdGF0dXMgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpOworCWlmICghKHN0YXR1cyAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZGKSkgewkvL0ZJRk8gaXMgZnVsbCBiZWZvcmUgYWxsIGRhdGFzIHdlcmUgY29waWVkIQorCQlQRVJST1IoIkZJRk8gd2FzIGZ1bGwgYmVmb3JlIGFsbCBkYXRhcyB3ZXJlIGNvcGllZCEgaWR4PSVkXG4iLAorCQkgICAgICAgaW5zdGFuY2UtPmFvX2lkeCk7CisJCXJldHVybiAtTUVfRVJSTk9fRklGT19CVUZGRVJfT1ZFUkZMT1c7CisJfSBlbHNlIHsJCS8vQWRkIGxhc3QgdmFsdWUKKwkJdmFsdWUgPSAqKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYgKyBwb3MpOworCQlpZiAoaW5zdGFuY2UtPmFvX2lkeCAmIDB4MSkgeworCQkJdmFsdWUgPDw9IDE2OworCQl9CisJCS8vUHV0IHZhbHVlIHRvIEZJRk8KKwkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPmZpZm9fcmVnKTsKKwkJLy9QREVCVUdfUkVHKCJpZHg9JWQgZmlmb19yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPmFvX2lkeCwgaW5zdGFuY2UtPnJlZ19iYXNlLCBpbnN0YW5jZS0+Zmlmb19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHZhbHVlKTsKKwl9CisKKwlQSU5GTygiV1JBUEFST1VORCBMT0FERUQgJWQgdmFsdWVzLiBpZHg9JWRcbiIsIGxvY2FsX2NvdW50LAorCSAgICAgIGluc3RhbmNlLT5hb19pZHgpOworCXJldHVybiBsb2NhbF9jb3VudDsKK30KKworLyoqIEBicmllZiBDb3B5IGRhdGEgZnJvbSBzb2Z0d2FyZSBidWZmZXIgdG8gZmlmbyAoZmFzdCkuCisqIEBub3RlIFRoaXMgaXMgdGltZSBjcml0aWNhbCBmdW5jdGlvbi4gQ2hlY2tpbmcgaXMgZG9uZSBhdCBiZWdpbmluZyBhbmQgZW5kIG9ubHkuCisqIEBub3RlIFRoZSBpcyBub3QgcmVhc29uYWJsZSB3YXkgdG8gY2hlY2sgaG93IG1hbnkgd2FsdWVzIHdhcyBpbiBGSUZPIGF0IGJlZ2luaW5nLiBUaGUgY291bnQgbXVzdCBiZSBtYW5hZ2VkIGV4dGVybmFseS4KKyoKKyogQHBhcmFtIGluc3RhbmNlIFRoZSBzdWJkZXZpY2UgaW5zdGFuY2UgKHBvaW50ZXIpLgorKiBAcGFyYW0gY291bnQgTWF4aW11bSBudW1iZXIgb2YgY29waWVkIGRhdGEuCisqIEBwYXJhbSBzdGFydF9wb3MgUG9zaXRpb24gb2YgdGhlIGZpcnMgdmFsdWUgaW4gYnVmZmVyLgorKgorKiBAcmV0dXJuIE9uIHN1Y2Nlc3M6IE51bWJlciBvZiBjb3BpZWQgZGF0YS4KKyogQHJldHVybiBPbiBlcnJvci9zdWNjZXNzOiAwLglObyBkYXRhcyB3ZXJlIGNvcGllZCA9PiBubyBkYXRhIGluIGJ1ZmZlci4KKyogQHJldHVybiBPbiBlcnJvcjogLU1FX0VSUk5PX0ZJRk9fQlVGRkVSX09WRVJGTE9XLgorKi8KK2ludCBpbmxpbmUgYW9fd3JpdGVfZGF0YShtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgaW50IGNvdW50LAorCQkJIGludCBzdGFydF9wb3MpCit7CQkJCS8vLyBAbm90ZSBUaGlzIGlzIHRpbWUgY3JpdGljYWwgZnVuY3Rpb24hCisJdWludDMyX3Qgc3RhdHVzOworCXVpbnQzMl90IHZhbHVlOworCWludCBwb3MgPQorCSAgICAoaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgKyBzdGFydF9wb3MpICYgaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJaW50IGxvY2FsX2NvdW50ID0gY291bnQ7CisJaW50IG1heF9jb3VudDsKKwlpbnQgaSA9IDE7CisKKwlpZiAoY291bnQgPD0gMCkgewkvL1dyb25nIGNvdW50IQorCQlyZXR1cm4gMDsKKwl9CisKKwltYXhfY291bnQgPSBtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1ZikgLSBzdGFydF9wb3M7CisJaWYgKG1heF9jb3VudCA8PSAwKSB7CS8vTm8gZGF0YSB0byBjb3B5IQorCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobWF4X2NvdW50IDwgY291bnQpIHsKKwkJbG9jYWxfY291bnQgPSBtYXhfY291bnQ7CisJfQorCisJd2hpbGUgKGkgPCBsb2NhbF9jb3VudCkgeworCQkvL0dldCB2YWx1ZSBmcm9tIGJ1ZmZlcgorCQl2YWx1ZSA9ICooaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZiArIHBvcyk7CisJCS8vUHJlcGFyZSBpdAorCQlpZiAoaW5zdGFuY2UtPmFvX2lkeCAmIDB4MSkgeworCQkJdmFsdWUgPDw9IDE2OworCQl9CisJCS8vUHV0IHZhbHVlIHRvIEZJRk8KKwkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPmZpZm9fcmVnKTsKKwkJLy9QREVCVUdfUkVHKCJpZHg9JWQgZmlmb19yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPmFvX2lkeCwgaW5zdGFuY2UtPnJlZ19iYXNlLCBpbnN0YW5jZS0+Zmlmb19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHZhbHVlKTsKKworCQlwb3MrKzsKKwkJcG9zICY9IGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrOworCQlpKys7CisJfQorCisJc3RhdHVzID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKKwlpZiAoIShzdGF0dXMgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GRikpIHsJLy9GSUZPIGlzIGZ1bGwgYmVmb3JlIGFsbCBkYXRhcyB3ZXJlIGNvcGllZCEKKwkJUEVSUk9SKCJGSUZPIHdhcyBmdWxsIGJlZm9yZSBhbGwgZGF0YXMgd2VyZSBjb3BpZWQhIGlkeD0lZFxuIiwKKwkJICAgICAgIGluc3RhbmNlLT5hb19pZHgpOworCQlyZXR1cm4gLU1FX0VSUk5PX0ZJRk9fQlVGRkVSX09WRVJGTE9XOworCX0gZWxzZSB7CQkvL0FkZCBsYXN0IHZhbHVlCisJCXZhbHVlID0gKihpbnN0YW5jZS0+Y2lyY19idWYuYnVmICsgcG9zKTsKKwkJaWYgKGluc3RhbmNlLT5hb19pZHggJiAweDEpIHsKKwkJCXZhbHVlIDw8PSAxNjsKKwkJfQorCQkvL1B1dCB2YWx1ZSB0byBGSUZPCisJCW91dGwodmFsdWUsIGluc3RhbmNlLT5maWZvX3JlZyk7CisJCS8vUERFQlVHX1JFRygiaWR4PSVkIGZpZm9fcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5hb19pZHgsIGluc3RhbmNlLT5yZWdfYmFzZSwgaW5zdGFuY2UtPmZpZm9fcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB2YWx1ZSk7CisJfQorCisJUElORk8oIkZBU1QgTE9BREVEICVkIHZhbHVlcy4gaWR4PSVkXG4iLCBsb2NhbF9jb3VudCwgaW5zdGFuY2UtPmFvX2lkeCk7CisJcmV0dXJuIGxvY2FsX2NvdW50OworfQorCisvKiogQGJyaWVmIENvcHkgZGF0YSBmcm9tIHNvZnR3YXJlIGJ1ZmZlciB0byBmaWZvIChzbG93KS4KKyogQG5vdGUgVGhpcyBpcyBzbG93IGZ1bmN0aW9uIHRoYXQgY29weSBhbGwgZGF0YSBmcm9tIGJ1ZmZlciB0byBGSUZPIHdpdGggZnVsbCBjb250cm9sLgorKgorKiBAcGFyYW0gaW5zdGFuY2UgVGhlIHN1YmRldmljZSBpbnN0YW5jZSAocG9pbnRlcikuCisqIEBwYXJhbSBjb3VudCBNYXhpbXVtIG51bWJlciBvZiBjb3BpZWQgZGF0YS4KKyogQHBhcmFtIHN0YXJ0X3BvcyBQb3NpdGlvbiBvZiB0aGUgZmlycyB2YWx1ZSBpbiBidWZmZXIuCisqCisqIEByZXR1cm4gT24gc3VjY2VzczogTnVtYmVyIG9mIGNvcGllZCB2YWx1ZXMuCisqIEByZXR1cm4gT24gZXJyb3Ivc3VjY2VzczogMC4JRklGTyB3YXMgZnVsbCBhdCBiZWdpbmluZy4KKyogQHJldHVybiBPbiBlcnJvcjogLU1FX0VSUk5PX1JJTkdfQlVGRkVSX1VOREVGRkxPVy4KKyovCitpbnQgaW5saW5lIGFvX3dyaXRlX2RhdGFfcG9vbGluZyhtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgaW50IGNvdW50LAorCQkJCSBpbnQgc3RhcnRfcG9zKQorewkJCQkvLy8gQG5vdGUgVGhpcyBpcyBzbG93IGZ1bmN0aW9uIQorCXVpbnQzMl90IHN0YXR1czsKKwl1aW50MzJfdCB2YWx1ZTsKKwlpbnQgcG9zID0KKwkgICAgKGluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICsgc3RhcnRfcG9zKSAmIGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrOworCWludCBsb2NhbF9jb3VudCA9IGNvdW50OworCWludCBpOworCWludCBtYXhfY291bnQ7CisKKwlpZiAoY291bnQgPD0gMCkgewkvL1dyb25nIGNvdW50IQorCQlQRVJST1IoIlNMT1cgTE9BREVEOiBXcm9uZyBjb3VudCEgaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKwkJcmV0dXJuIDA7CisJfQorCisJbWF4X2NvdW50ID0gbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpIC0gc3RhcnRfcG9zOworCWlmIChtYXhfY291bnQgPD0gMCkgewkvL05vIGRhdGEgdG8gY29weSEKKwkJUEVSUk9SKCJTTE9XIExPQURFRDogTm8gZGF0YSB0byBjb3B5ISBpZHg9JWRcbiIsCisJCSAgICAgICBpbnN0YW5jZS0+YW9faWR4KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG1heF9jb3VudCA8IGNvdW50KSB7CisJCWxvY2FsX2NvdW50ID0gbWF4X2NvdW50OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBsb2NhbF9jb3VudDsgaSsrKSB7CisJCXN0YXR1cyA9IGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZyk7CisJCWlmICghKHN0YXR1cyAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZGKSkgewkvL0ZJRk8gaXMgZnVsbCEKKwkJCXJldHVybiBpOworCQl9CisJCS8vR2V0IHZhbHVlIGZyb20gYnVmZmVyCisJCXZhbHVlID0gKihpbnN0YW5jZS0+Y2lyY19idWYuYnVmICsgcG9zKTsKKwkJLy9QcmVwYXJlIGl0CisJCWlmIChpbnN0YW5jZS0+YW9faWR4ICYgMHgxKSB7CisJCQl2YWx1ZSA8PD0gMTY7CisJCX0KKwkJLy9QdXQgdmFsdWUgdG8gRklGTworCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkvL1BERUJVR19SRUcoImlkeD0lZCBmaWZvX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+YW9faWR4LCBpbnN0YW5jZS0+cmVnX2Jhc2UsIGluc3RhbmNlLT5maWZvX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdmFsdWUpOworCisJCXBvcysrOworCQlwb3MgJj0gaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJfQorCisJUElORk8oIlNMT1cgTE9BREVEICVkIHZhbHVlcy4gaWR4PSVkXG4iLCBsb2NhbF9jb3VudCwgaW5zdGFuY2UtPmFvX2lkeCk7CisJcmV0dXJuIGxvY2FsX2NvdW50OworfQorCisvKiogQGJyaWVmIENvcHkgZGF0YSBmcm9tIHVzZXIgc3BhY2UgdG8gY2lyY3VsYXIgYnVmZmVyLgorKiBAcGFyYW0gaW5zdGFuY2UgVGhlIHN1YmRldmljZSBpbnN0YW5jZSAocG9pbnRlcikuCisqIEBwYXJhbSBjb3VudCBOdW1iZXIgb2YgZGF0YXMgaW4gdXNlciBzcGFjZS4KKyogQHBhcmFtIHVzZXJfdmFsdWVzIEJ1ZmZlcidzIHBvaW50ZXIuCisqCisqIEByZXR1cm4gT24gc3VjY2VzczogTnVtYmVyIG9mIGNvcGllZCB2YWx1ZXMuCisqIEByZXR1cm4gT24gZXJyb3I6IC1NRV9FUlJOT19JTlRFUk5BTC4KKyovCitpbnQgaW5saW5lIGFvX2dldF9kYXRhX2Zyb21fdXNlcihtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgaW50IGNvdW50LAorCQkJCSBpbnQgKnVzZXJfdmFsdWVzKQoreworCWludCBpLCBlcnI7CisJaW50IGVtcHR5X3NwYWNlOworCWludCBjb3BpZWQ7CisJaW50IHZhbHVlOworCisJZW1wdHlfc3BhY2UgPSBtZV9jaXJjX2J1Zl9zcGFjZSgmaW5zdGFuY2UtPmNpcmNfYnVmKTsKKwkvL1dlIGhhdmUgb25seSB0aGlzIHNwYWNlIGZyZWUuCisJY29waWVkID0gKGNvdW50IDwgZW1wdHlfc3BhY2UpID8gY291bnQgOiBlbXB0eV9zcGFjZTsKKwlmb3IgKGkgPSAwOyBpIDwgY29waWVkOyBpKyspIHsJLy9Db3B5IGZyb20gdXNlciB0byBidWZmZXIKKwkJaWYgKChlcnIgPSBnZXRfdXNlcih2YWx1ZSwgKGludCAqKSh1c2VyX3ZhbHVlcyArIGkpKSkpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiQlVGRkVSIExPQURFRDogZ2V0X3VzZXIoMHglcCkgcmV0dXJuIGFuIGVycm9yOiAlZC4gaWR4PSVkXG4iLAorCQkJICAgICB1c2VyX3ZhbHVlcyArIGksIGVyciwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCQlyZXR1cm4gLU1FX0VSUk5PX0lOVEVSTkFMOworCQl9CisJCS8vLyBAbm90ZSBUaGUgYW5hbG9nIG91dHB1dCBpbiBtZTQ2MDAgc2VyaWVzIGhhcyBzaXplIG9mIDE2IGJpdHMuCisJCSooaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZiArIGluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkKSA9CisJCSAgICAodWludDE2X3QpIHZhbHVlOworCQlpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCsrOworCQlpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCAmPSBpbnN0YW5jZS0+Y2lyY19idWYubWFzazsKKwl9CisKKwlQSU5GTygiQlVGRkVSIExPQURFRCAlZCB2YWx1ZXMuIGlkeD0lZFxuIiwgY29waWVkLCBpbnN0YW5jZS0+YW9faWR4KTsKKwlyZXR1cm4gY29waWVkOworfQorCisvKiogQGJyaWVmIENoZWNraW5nIGFjdHVhbCBoYXJkd2FyZSBhbmQgbG9naWNhbCBzdGF0ZS4KKyogQHBhcmFtIGluc3RhbmNlIFRoZSBzdWJkZXZpY2UgaW5zdGFuY2UgKHBvaW50ZXIpLgorKi8KK3N0YXRpYyB2b2lkIG1lNDYwMF9hb193b3JrX2NvbnRyb2xfdGFzaygKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjApCisJCQkJCSAgICAgICB2b2lkICpzdWJkZXZpY2UKKyNlbHNlCisJCQkJCSAgICAgICBzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmsKKyNlbmRpZgorICAgICkKK3sKKwltZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzID0gMDsKKwl1aW50MzJfdCBzdGF0dXM7CisJdWludDMyX3QgY3RybDsKKwl1aW50MzJfdCBzeW5jaDsKKwlpbnQgcmVzY2hlZHVsZSA9IDA7CisJaW50IHNpZ25hbGluZyA9IDA7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjApCisJaW5zdGFuY2UgPSAobWU0NjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKyNlbHNlCisJaW5zdGFuY2UgPQorCSAgICBjb250YWluZXJfb2YoKHZvaWQgKil3b3JrLCBtZTQ2MDBfYW9fc3ViZGV2aWNlX3QsIGFvX2NvbnRyb2xfdGFzayk7CisjZW5kaWYKKwlQSU5GTygiPCVzOiAlbGQ+IGV4ZWN1dGVkLiBpZHg9JWRcbiIsIF9fZnVuY19fLCBqaWZmaWVzLAorCSAgICAgIGluc3RhbmNlLT5hb19pZHgpOworCisJc3RhdHVzID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKKwlQREVCVUdfUkVHKCJzdGF0dXNfcmVnIGlubCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+c3RhdHVzX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgc3RhdHVzKTsKKworCXN3aXRjaCAoaW5zdGFuY2UtPnN0YXR1cykgewkvLyBDaGVja2luZyBhY3R1YWwgbW9kZS4KKworCQkvLyBOb3QgY29uZmlndXJlZCBmb3Igd29yay4KKwljYXNlIGFvX3N0YXR1c19ub25lOgorCQlicmVhazsKKworCQkvL1RoaXMgYXJlIHN0YWJsZSBtb2Rlcy4gTm8gbmVlZCB0byBkbyBhbnl0aGluZy4gKD8pCisJY2FzZSBhb19zdGF0dXNfc2luZ2xlX2NvbmZpZ3VyZWQ6CisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2NvbmZpZ3VyZWQ6CisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2ZpZm9fZXJyb3I6CisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2J1ZmZlcl9lcnJvcjoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fZXJyb3I6CisJCVBFUlJPUigiU2hvdWxkbid0IGJlIHJ1bm5pbmchLlxuIik7CisJCWJyZWFrOworCisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2VuZDoKKwkJaWYgKCFpbnN0YW5jZS0+ZmlmbykgeworCQkJUEVSUk9SX0NSSVRJQ0FMCisJCQkgICAgKCJTdHJlYW1pbmcgb24gc2luZ2xlIGRldmljZSEgVGhpcyBmZWF0dXJlIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24hXG4iKTsKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2Vycm9yOworCQkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCQlzaWduYWxpbmcgPSAxOworCQkJYnJlYWs7CisJCX0KKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfZW5kOgorCQlpZiAoc3RhdHVzICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSB7CS8vIFN0YXRlIG1hY2hpbmUgaXMgd29ya2luZyBidXQgdGhlIHN0YXR1cyBpcyBzZXQgdG8gZW5kLiBGb3JjZSBzdG9wLgorCisJCQkvLyBXYWl0IGZvciBzdG9wLgorCQkJcmVzY2hlZHVsZSA9IDE7CisJCX0KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQkvLyBTdG9wIGFsbCBhY3Rpb25zLiBObyBjb25kaXRpb25zISBCbG9jayBpbnRlcnJ1cHRzIGFuZCB0cmlnZ2VyLiBMZWF2ZSBGSUZPIHVudG91Y2hlZCEKKwkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQljdHJsIHw9CisJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfCBNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUAorCQkgICAgfCBNRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJROworCQljdHJsICY9CisJCSAgICB+KE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJRIHwKKwkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHKTsKKwkJY3RybCAmPQorCQkgICAgfihNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFIHwKKwkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRV9CT1RIKTsKKwkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQlicmVhazsKKworCQkvLyBTaW5nbGUgbW9kZXMKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfcnVuX3dhaXQ6CisJY2FzZSBhb19zdGF0dXNfc2luZ2xlX3J1bjoKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfZW5kX3dhaXQ6CisKKwkJaWYgKCEoc3RhdHVzICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkgewkvLyBTdGF0ZSBtYWNoaW5lIGlzIG5vdCB3b3JraW5nLgorCQkJaWYgKCgoaW5zdGFuY2UtPmZpZm8pCisJCQkgICAgICYmICghKHN0YXR1cyAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0VGKSkpCisJCQkgICAgfHwgKCEoaW5zdGFuY2UtPmZpZm8pKSkgewkvLyBTaW5nbGUgaXMgaW4gZW5kIHN0YXRlLgorCQkJCVBERUJVRygiU2luZ2xlIGNhbGwgaGFzIGJlZW4gY29tcGxpdGVkLlxuIik7CisKKwkJCQkvLyBTZXQgY29ycmVjdCB2YWx1ZSBmb3Igc2luZ2xlX3JlYWQoKTsKKwkJCQlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0KKwkJCQkgICAgaW5zdGFuY2UtPnNpbmdsZV92YWx1ZV9pbl9maWZvOworCisJCQkJLy8gU2V0IHN0YXR1cyBhcyAnYW9fc3RhdHVzX3NpbmdsZV9lbmQnCisJCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zaW5nbGVfZW5kOworCisJCQkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCQkJc2lnbmFsaW5nID0gMTsKKwkJCQkvLyBXYWl0IGZvciBzdG9wIElTTS4KKwkJCQlyZXNjaGVkdWxlID0gMTsKKworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCS8vIENoZWNrIHRpbWVvdXQuCisJCWlmICgoaW5zdGFuY2UtPnRpbWVvdXQuZGVsYXkpICYmICgoamlmZmllcyAtIGluc3RhbmNlLT50aW1lb3V0LnN0YXJ0X3RpbWUpID49IGluc3RhbmNlLT50aW1lb3V0LmRlbGF5KSkgewkvLyBUaW1lb3V0CisJCQlQREVCVUcoIlRpbWVvdXQgcmVhY2hlZC5cbiIpOworCQkJLy8gU3RvcCBhbGwgYWN0aW9ucy4gTm8gY29uZGl0aW9ucyEgQmxvY2sgaW50ZXJydXB0cyBhbmQgdHJpZ2dlci4gTGVhdmUgRklGTyB1bnRvdWNoZWQhCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJY3RybCB8PQorCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QIHwKKwkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfAorCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlE7CisJCQljdHJsICY9CisJCQkgICAgfihNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUSB8CisJCQkgICAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUcpOworCQkJLy8vIEZpeCBmb3IgdGltZW91dCBlcnJvci4KKwkJCWN0cmwgJj0KKwkJCSAgICB+KE1FNDYwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0UgfAorCQkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRV9CT1RIKTsKKwkJCWlmIChpbnN0YW5jZS0+ZmlmbykgewkvL0Rpc2FibGluZyBGSUZPCisJCQkJY3RybCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9GSUZPOworCQkJfQorCQkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGN0cmwpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKworCQkJc3Bpbl9sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKwkJCS8vUmVtb3ZlIGZyb20gc3luY2hyb25vdXMgc3RhcnQuIEJsb2NrIHRyaWdnZXJpbmcgZnJvbSB0aGlzIG91dHB1dC4KKwkJCXN5bmNoID0gaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlzeW5jaCAmPQorCQkJICAgIH4oKE1FNDYwMF9BT19TWU5DX0hPTEQgfCBNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJRykgPDwKKwkJCSAgICAgIGluc3RhbmNlLT5hb19pZHgpOworCQkJaWYgKCEoaW5zdGFuY2UtPmZpZm8pKSB7CS8vIE5vIEZJRk8gLSBzZXQgdG8gc2luZ2xlIHNhZmUgbW9kZQorCQkJCXN5bmNoIHw9CisJCQkJICAgIE1FNDYwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKwkJCX0KKwkJCW91dGwoc3luY2gsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgc3luY2gpOworCQkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCisJCQlpZiAoIShpbnN0YW5jZS0+ZmlmbykpIHsJLy8gTm8gRklGTworCQkJCS8vIFJlc3RvcmUgb2xkIHNldHRpbmdzLgorCQkJCVBERUJVRygiV3JpdGUgb2xkIHZhbHVlIGJhY2sgdG8gcmVnaXN0ZXIuXG4iKTsKKwkJCQlvdXRsKGluc3RhbmNlLT5zaW5nbGVfdmFsdWUsCisJCQkJICAgICBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCQkJUERFQlVHX1JFRworCQkJCSAgICAoInNpbmdsZV9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAgIGluc3RhbmNlLT5zaW5nbGVfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgICAgaW5zdGFuY2UtPnNpbmdsZV92YWx1ZSk7CisJCQl9CisJCQkvLyBTZXQgY29ycmVjdCB2YWx1ZSBmb3Igc2luZ2xlX3JlYWQoKTsKKwkJCWluc3RhbmNlLT5zaW5nbGVfdmFsdWVfaW5fZmlmbyA9IGluc3RhbmNlLT5zaW5nbGVfdmFsdWU7CisKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc2luZ2xlX2VuZDsKKworCQkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCQlzaWduYWxpbmcgPSAxOworCQl9CisJCS8vIFdhaXQgZm9yIHN0b3AuCisJCXJlc2NoZWR1bGUgPSAxOworCQlicmVhazsKKworCQkvLyBTdHJlYW0gbW9kZXMKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fcnVuX3dhaXQ6CisJCWlmICghaW5zdGFuY2UtPmZpZm8pIHsKKwkJCVBFUlJPUl9DUklUSUNBTAorCQkJICAgICgiU3RyZWFtaW5nIG9uIHNpbmdsZSBkZXZpY2UhIFRoaXMgZmVhdHVyZSBpcyBub3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uIVxuIik7CisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9lcnJvcjsKKwkJCS8vIFNpZ25hbCB0aGUgZW5kLgorCQkJc2lnbmFsaW5nID0gMTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHN0YXR1cyAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkgewkvLyBTdGF0ZSBtYWNoaW5lIGlzIHdvcmtpbmcuIFdhaXRpbmcgZm9yIHN0YXJ0IGZpbmlzaC4KKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX3J1bjsKKworCQkJLy8gU2lnbmFsIGVuZCBvZiB0aGlzIHN0ZXAKKwkJCXNpZ25hbGluZyA9IDE7CisJCX0gZWxzZSB7CS8vIFN0YXRlIG1hY2hpbmUgaXMgbm90IHdvcmtpbmcuCisJCQlpZiAoIShzdGF0dXMgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9FRikpIHsJLy8gRklGTyBpcyBlbXB0eS4gUHJvY2VkdXJlIGhhcyBzdGFydGVkIGFuZCBmaW5pc2ggYWxyZWFkeSEKKwkJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9lbmQ7CisKKwkJCQkvLyBTaWduYWwgdGhlIGVuZC4KKwkJCQlzaWduYWxpbmcgPSAxOworCQkJCS8vIFdhaXQgZm9yIHN0b3AuCisJCQkJcmVzY2hlZHVsZSA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvLyBDaGVjayB0aW1lb3V0LgorCQlpZiAoKGluc3RhbmNlLT50aW1lb3V0LmRlbGF5KSAmJiAoKGppZmZpZXMgLSBpbnN0YW5jZS0+dGltZW91dC5zdGFydF90aW1lKSA+PSBpbnN0YW5jZS0+dGltZW91dC5kZWxheSkpIHsJLy8gVGltZW91dAorCQkJUERFQlVHKCJUaW1lb3V0IHJlYWNoZWQuXG4iKTsKKwkJCS8vIFN0b3AgYWxsIGFjdGlvbnMuIE5vIGNvbmRpdGlvbnMhIEJsb2NrIGludGVycnVwdHMuIExlYXZlIEZJRk8gdW50b3VjaGVkIQorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkJCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCWN0cmwgfD0KKwkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8CisJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QIHwKKwkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJROworCQkJY3RybCAmPQorCQkJICAgIH4oTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlEgfAorCQkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHKTsKKwkJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBjdHJsKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCQlzcGluX2xvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCQkJLy9SZW1vdmUgZnJvbSBzeW5jaHJvbm91cyBzdGFydC4gQmxvY2sgdHJpZ2dlcmluZyBmcm9tIHRoaXMgb3V0cHV0LgorCQkJc3luY2ggPSBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCXN5bmNoICY9CisJCQkgICAgfigoTUU0NjAwX0FPX1NZTkNfSE9MRCB8IE1FNDYwMF9BT19TWU5DX0VYVF9UUklHKSA8PAorCQkJICAgICAgaW5zdGFuY2UtPmFvX2lkeCk7CisJCQlvdXRsKHN5bmNoLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHN5bmNoKTsKKwkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZW5kOworCisJCQkvLyBTaWduYWwgdGhlIGVuZC4KKwkJCXNpZ25hbGluZyA9IDE7CisJCX0KKwkJLy8gV2FpdCBmb3Igc3RvcC4KKwkJcmVzY2hlZHVsZSA9IDE7CisJCWJyZWFrOworCisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX3J1bjoKKwkJaWYgKCFpbnN0YW5jZS0+ZmlmbykgeworCQkJUEVSUk9SX0NSSVRJQ0FMCisJCQkgICAgKCJTdHJlYW1pbmcgb24gc2luZ2xlIGRldmljZSEgVGhpcyBmZWF0dXJlIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24hXG4iKTsKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2Vycm9yOworCQkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCQlzaWduYWxpbmcgPSAxOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIShzdGF0dXMgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CS8vIFN0YXRlIG1hY2hpbmUgaXMgbm90IHdvcmtpbmcuIFRoaXMgaXMgYW4gZXJyb3IuCisJCQkvLyBCUk9LRU4gUElQRSEKKwkJCWlmICghKHN0YXR1cyAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0VGKSkgewkvLyBGSUZPIGlzIGVtcHR5LgorCQkJCWlmIChtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1ZikpIHsJLy8gU29mdHdhcmUgYnVmZmVyIGlzIG5vdCBlbXB0eS4KKwkJCQkJaWYgKGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgJiYgKGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgPD0gaW5zdGFuY2UtPmRhdGFfY291bnQpKSB7CS8vRmluaXNoaW5nIHdvcmsuIFJlcXVlZCBkYXRhIHNob3duLgorCQkJCQkJUERFQlVHCisJCQkJCQkgICAgKCJJU00gc3RvcGVkLiBObyBkYXRhIGluIEZJRk8uIEJ1ZmZlciBpcyBub3QgZW1wdHkuXG4iKTsKKwkJCQkJCWluc3RhbmNlLT5zdGF0dXMgPQorCQkJCQkJICAgIGFvX3N0YXR1c19zdHJlYW1fZW5kOworCQkJCQl9IGVsc2UgeworCQkJCQkJUEVSUk9SCisJCQkJCQkgICAgKCJPdXRwdXQgc3RyZWFtIGhhcyBiZWVuIGJyb2tlbi4gSVNNIHN0b3BlZC4gTm8gZGF0YSBpbiBGSUZPLiBCdWZmZXIgaXMgbm90IGVtcHR5LlxuIik7CisJCQkJCQlpbnN0YW5jZS0+c3RhdHVzID0KKwkJCQkJCSAgICBhb19zdGF0dXNfc3RyZWFtX2J1ZmZlcl9lcnJvcjsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CS8vIFNvZnR3YXJlIGJ1ZmZlciBpcyBlbXB0eS4KKwkJCQkJUERFQlVHCisJCQkJCSAgICAoIklTTSBzdG9wZWQuIE5vIGRhdGEgaW4gRklGTy4gQnVmZmVyIGlzIGVtcHR5LlxuIik7CisJCQkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2VuZDsKKwkJCQl9CisJCQl9IGVsc2UgewkvLyBUaGVyZSBhcmUgc3RpbGwgZGF0YXMgaW4gRklGTy4KKwkJCQlpZiAobWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpKSB7CS8vIFNvZnR3YXJlIGJ1ZmZlciBpcyBub3QgZW1wdHkuCisJCQkJCVBFUlJPUgorCQkJCQkgICAgKCJPdXRwdXQgc3RyZWFtIGhhcyBiZWVuIGJyb2tlbi4gSVNNIHN0b3BlZCBidXQgc29tZSBkYXRhIGluIEZJRk8gYW5kIGJ1ZmZlci5cbiIpOworCQkJCX0gZWxzZSB7CS8vIFNvZnR3YXJlIGJ1ZmZlciBpcyBlbXB0eS4KKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIk91dHB1dCBzdHJlYW0gaGFzIGJlZW4gYnJva2VuLiBJU00gc3RvcGVkIGJ1dCBzb21lIGRhdGEgaW4gRklGTy4gQnVmZmVyIGlzIGVtcHR5LlxuIik7CisJCQkJfQorCQkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2ZpZm9fZXJyb3I7CisKKwkJCX0KKworCQkJLy8gU2lnbmFsIHRoZSBmYWlsdXJlLgorCQkJc2lnbmFsaW5nID0gMTsKKwkJCWJyZWFrOworCQl9CisJCS8vIFdhaXQgZm9yIHN0b3AuCisJCXJlc2NoZWR1bGUgPSAxOworCQlicmVhazsKKworCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9lbmRfd2FpdDoKKwkJaWYgKCFpbnN0YW5jZS0+ZmlmbykgeworCQkJUEVSUk9SX0NSSVRJQ0FMCisJCQkgICAgKCJTdHJlYW1pbmcgb24gc2luZ2xlIGRldmljZSEgVGhpcyBmZWF0dXJlIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24hXG4iKTsKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2Vycm9yOworCQkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCQlzaWduYWxpbmcgPSAxOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIShzdGF0dXMgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CS8vIFN0YXRlIG1hY2hpbmUgaXMgbm90IHdvcmtpbmcuIFdhaXRpbmcgZm9yIHN0b3AgZmluaXNoLgorCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZW5kOworCQkJc2lnbmFsaW5nID0gMTsKKwkJfQorCQkvLyBTdGF0ZSBtYWNoaW5lIGlzIHdvcmtpbmcuCisJCXJlc2NoZWR1bGUgPSAxOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUl9DUklUSUNBTCgiU3RhdHVzIGlzIGluIHdyb25nIHN0YXRlICglZCkhXG4iLAorCQkJCWluc3RhbmNlLT5zdGF0dXMpOworCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9lcnJvcjsKKwkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCXNpZ25hbGluZyA9IDE7CisJCWJyZWFrOworCisJfQorCisJaWYgKHNpZ25hbGluZykgewkvL1NpZ25hbCBpdC4KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCX0KKworCWlmIChpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgJiYgcmVzY2hlZHVsZSkgewkvLyBSZXNjaGVkdWxlIHRhc2sKKwkJcXVldWVfZGVsYXllZF93b3JrKGluc3RhbmNlLT5tZTQ2MDBfd29ya3F1ZXVlLAorCQkJCSAgICZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrLCAxKTsKKwl9IGVsc2UgeworCQlQSU5GTygiPCVzPiBFbmRpbmcgY29udHJvbCB0YXNrLlxuIiwgX19mdW5jX18pOworCX0KKworfQorI2Vsc2UKKy8vLyBAbm90ZSBTUEVDSUFMIEJVSUxEIEZPUiBCT1NDSAorLy8vIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorc3RhdGljIGludCBtZTQ2MDBfYW9faW9fcmVzZXRfc3ViZGV2aWNlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQzMl90IHRtcDsKKwl1bnNpZ25lZCBsb25nIHN0YXR1czsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVIgc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgc3RhdHVzKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCXRtcCA9IGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCXRtcCAmPSB+KDB4MTAwMDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJb3V0bCh0bXAsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJKmluc3RhbmNlLT5wcmVsb2FkX2ZsYWdzICY9IH4oMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKworCXRtcCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCXRtcCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8IE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUDsKKwlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCXdoaWxlIChpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSA7CisKKwlvdXRsKE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QIHwgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QLAorCSAgICAgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCW91dGwoMHg4MDAwLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisKKwlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0gMHg4MDAwOworCWluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkID0gMDsKKwlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCA9IDA7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIHN0YXR1cyk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3NpbmdsZV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCBzaW5nbGVfY29uZmlnLAorCQkJCSAgICAgIGludCByZWYsCisJCQkJICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICBpbnQgdHJpZ190eXBlLCBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1aW50MzJfdCB0bXA7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSCisJICAgIHNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwlpZiAoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkgeworCQlQRVJST1IoIlN1YmRldmljZSBpcyBidXN5LlxuIik7CisJCWVyciA9IE1FX0VSUk5PX1NVQkRFVklDRV9CVVNZOworCQlnb3RvIEVSUk9SOworCX0KKworCWlmIChjaGFubmVsID09IDApIHsKKwkJaWYgKHNpbmdsZV9jb25maWcgPT0gMCkgeworCQkJaWYgKHJlZiA9PSBNRV9SRUZfQU9fR1JPVU5EKSB7CisJCQkJaWYgKHRyaWdfY2hhbiA9PSBNRV9UUklHX0NIQU5fREVGQVVMVCkgeworCQkJCQlpZiAodHJpZ190eXBlID09IE1FX1RSSUdfVFlQRV9TVykgeworCQkJCQkJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkJCQl0bXAgfD0KKwkJCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJCQkJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCQkJCXRtcCA9CisJCQkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCQkJCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwkJCQkJCXNwaW5fbG9jayhpbnN0YW5jZS0+CisJCQkJCQkJICBwcmVsb2FkX3JlZ19sb2NrKTsKKwkJCQkJCXRtcCA9CisJCQkJCQkgICAgaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQkJCQl0bXAgJj0KKwkJCQkJCSAgICB+KDB4MTAwMDEgPDwgaW5zdGFuY2UtPgorCQkJCQkJICAgICAgYW9faWR4KTsKKwkJCQkJCW91dGwodG1wLAorCQkJCQkJICAgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJCQkJKmluc3RhbmNlLT5wcmVsb2FkX2ZsYWdzICY9CisJCQkJCQkgICAgfigweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCQkJCQlzcGluX3VubG9jayhpbnN0YW5jZS0+CisJCQkJCQkJICAgIHByZWxvYWRfcmVnX2xvY2spOworCQkJCQl9IGVsc2UgaWYgKHRyaWdfdHlwZSA9PQorCQkJCQkJICAgTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMKSB7CisJCQkJCQlpZiAodHJpZ19lZGdlID09CisJCQkJCQkgICAgTUVfVFJJR19FREdFX1JJU0lORykgeworCQkJCQkJCXRtcCA9CisJCQkJCQkJICAgIGlubChpbnN0YW5jZS0+CisJCQkJCQkJCWN0cmxfcmVnKTsKKwkJCQkJCQl0bXAgfD0KKwkJCQkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCQkJCQkJCW91dGwodG1wLAorCQkJCQkJCSAgICAgaW5zdGFuY2UtPgorCQkJCQkJCSAgICAgY3RybF9yZWcpOworCQkJCQkJCXRtcCA9CisJCQkJCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUAorCQkJCQkJCSAgICB8CisJCQkJCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRzsKKwkJCQkJCQlvdXRsKHRtcCwKKwkJCQkJCQkgICAgIGluc3RhbmNlLT4KKwkJCQkJCQkgICAgIGN0cmxfcmVnKTsKKwkJCQkJCX0gZWxzZSBpZiAodHJpZ19lZGdlID09CisJCQkJCQkJICAgTUVfVFJJR19FREdFX0ZBTExJTkcpCisJCQkJCQl7CisJCQkJCQkJdG1wID0KKwkJCQkJCQkgICAgaW5sKGluc3RhbmNlLT4KKwkJCQkJCQkJY3RybF9yZWcpOworCQkJCQkJCXRtcCB8PQorCQkJCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJCQkJCQkJb3V0bCh0bXAsCisJCQkJCQkJICAgICBpbnN0YW5jZS0+CisJCQkJCQkJICAgICBjdHJsX3JlZyk7CisJCQkJCQkJdG1wID0KKwkJCQkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QCisJCQkJCQkJICAgIHwKKwkJCQkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHCisJCQkJCQkJICAgIHwKKwkJCQkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRTsKKwkJCQkJCQlvdXRsKHRtcCwKKwkJCQkJCQkgICAgIGluc3RhbmNlLT4KKwkJCQkJCQkgICAgIGN0cmxfcmVnKTsKKwkJCQkJCX0gZWxzZSBpZiAodHJpZ19lZGdlID09CisJCQkJCQkJICAgTUVfVFJJR19FREdFX0FOWSkgeworCQkJCQkJCXRtcCA9CisJCQkJCQkJICAgIGlubChpbnN0YW5jZS0+CisJCQkJCQkJCWN0cmxfcmVnKTsKKwkJCQkJCQl0bXAgfD0KKwkJCQkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCQkJCQkJCW91dGwodG1wLAorCQkJCQkJCSAgICAgaW5zdGFuY2UtPgorCQkJCQkJCSAgICAgY3RybF9yZWcpOworCQkJCQkJCXRtcCA9CisJCQkJCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUAorCQkJCQkJCSAgICB8CisJCQkJCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRworCQkJCQkJCSAgICB8CisJCQkJCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0UKKwkJCQkJCQkgICAgfAorCQkJCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFX0JPVEg7CisJCQkJCQkJb3V0bCh0bXAsCisJCQkJCQkJICAgICBpbnN0YW5jZS0+CisJCQkJCQkJICAgICBjdHJsX3JlZyk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCVBFUlJPUgorCQkJCQkJCSAgICAoIkludmFsaWQgdHJpZ2dlciBlZGdlLlxuIik7CisJCQkJCQkJZXJyID0KKwkJCQkJCQkgICAgTUVfRVJSTk9fSU5WQUxJRF9UUklHX0VER0U7CisJCQkJCQkJZ290byBFUlJPUjsKKwkJCQkJCX0KKworCQkJCQkJc3Bpbl9sb2NrKGluc3RhbmNlLT4KKwkJCQkJCQkgIHByZWxvYWRfcmVnX2xvY2spOworCisJCQkJCQl0bXAgPQorCQkJCQkJICAgIGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJCQkJdG1wICY9CisJCQkJCQkgICAgfigweDEwMDAxIDw8IGluc3RhbmNlLT4KKwkJCQkJCSAgICAgIGFvX2lkeCk7CisJCQkJCQl0bXAgfD0gMHgxIDw8IGluc3RhbmNlLT5hb19pZHg7CisJCQkJCQlvdXRsKHRtcCwKKwkJCQkJCSAgICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCQkJCSppbnN0YW5jZS0+cHJlbG9hZF9mbGFncyAmPQorCQkJCQkJICAgIH4oMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCQkJCQkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPgorCQkJCQkJCSAgICBwcmVsb2FkX3JlZ19sb2NrKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCVBFUlJPUgorCQkJCQkJICAgICgiSW52YWxpZCB0cmlnZ2VyIHR5cGUuXG4iKTsKKwkJCQkJCWVyciA9CisJCQkJCQkgICAgTUVfRVJSTk9fSU5WQUxJRF9UUklHX1RZUEU7CisJCQkJCQlnb3RvIEVSUk9SOworCQkJCQl9CisJCQkJfSBlbHNlIGlmICh0cmlnX2NoYW4gPT0KKwkJCQkJICAgTUVfVFJJR19DSEFOX1NZTkNIUk9OT1VTKSB7CisJCQkJCWlmICh0cmlnX3R5cGUgPT0gTUVfVFJJR19UWVBFX1NXKSB7CisJCQkJCQl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCQkJCXRtcCB8PQorCQkJCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUDsKKwkJCQkJCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJCQkJdG1wID0KKwkJCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJCQkJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCQkJCQkJc3Bpbl9sb2NrKGluc3RhbmNlLT4KKwkJCQkJCQkgIHByZWxvYWRfcmVnX2xvY2spOworCQkJCQkJdG1wID0KKwkJCQkJCSAgICBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCQkJCXRtcCAmPQorCQkJCQkJICAgIH4oMHgxMDAwMSA8PCBpbnN0YW5jZS0+CisJCQkJCQkgICAgICBhb19pZHgpOworCQkJCQkJdG1wIHw9IDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4OworCQkJCQkJb3V0bCh0bXAsCisJCQkJCQkgICAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQkJCQkqaW5zdGFuY2UtPnByZWxvYWRfZmxhZ3MgfD0KKwkJCQkJCSAgICAweDEgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKwkJCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT4KKwkJCQkJCQkgICAgcHJlbG9hZF9yZWdfbG9jayk7CisJCQkJCX0gZWxzZSBpZiAodHJpZ190eXBlID09CisJCQkJCQkgICBNRV9UUklHX1RZUEVfRVhUX0RJR0lUQUwpIHsKKwkJCQkJCWlmICh0cmlnX2VkZ2UgPT0KKwkJCQkJCSAgICBNRV9UUklHX0VER0VfUklTSU5HKSB7CisJCQkJCQkJdG1wID0KKwkJCQkJCQkgICAgaW5sKGluc3RhbmNlLT4KKwkJCQkJCQkJY3RybF9yZWcpOworCQkJCQkJCXRtcCB8PQorCQkJCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJCQkJCQkJb3V0bCh0bXAsCisJCQkJCQkJICAgICBpbnN0YW5jZS0+CisJCQkJCQkJICAgICBjdHJsX3JlZyk7CisJCQkJCQkJdG1wID0KKwkJCQkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCQkJCQkJCW91dGwodG1wLAorCQkJCQkJCSAgICAgaW5zdGFuY2UtPgorCQkJCQkJCSAgICAgY3RybF9yZWcpOworCQkJCQkJfSBlbHNlIGlmICh0cmlnX2VkZ2UgPT0KKwkJCQkJCQkgICBNRV9UUklHX0VER0VfRkFMTElORykKKwkJCQkJCXsKKwkJCQkJCQl0bXAgPQorCQkJCQkJCSAgICBpbmwoaW5zdGFuY2UtPgorCQkJCQkJCQljdHJsX3JlZyk7CisJCQkJCQkJdG1wIHw9CisJCQkJCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUDsKKwkJCQkJCQlvdXRsKHRtcCwKKwkJCQkJCQkgICAgIGluc3RhbmNlLT4KKwkJCQkJCQkgICAgIGN0cmxfcmVnKTsKKwkJCQkJCQl0bXAgPQorCQkJCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AKKwkJCQkJCQkgICAgfAorCQkJCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFOworCQkJCQkJCW91dGwodG1wLAorCQkJCQkJCSAgICAgaW5zdGFuY2UtPgorCQkJCQkJCSAgICAgY3RybF9yZWcpOworCQkJCQkJfSBlbHNlIGlmICh0cmlnX2VkZ2UgPT0KKwkJCQkJCQkgICBNRV9UUklHX0VER0VfQU5ZKSB7CisJCQkJCQkJdG1wID0KKwkJCQkJCQkgICAgaW5sKGluc3RhbmNlLT4KKwkJCQkJCQkJY3RybF9yZWcpOworCQkJCQkJCXRtcCB8PQorCQkJCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJCQkJCQkJb3V0bCh0bXAsCisJCQkJCQkJICAgICBpbnN0YW5jZS0+CisJCQkJCQkJICAgICBjdHJsX3JlZyk7CisJCQkJCQkJdG1wID0KKwkJCQkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QCisJCQkJCQkJICAgIHwKKwkJCQkJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRQorCQkJCQkJCSAgICB8CisJCQkJCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0VfQk9USDsKKwkJCQkJCQlvdXRsKHRtcCwKKwkJCQkJCQkgICAgIGluc3RhbmNlLT4KKwkJCQkJCQkgICAgIGN0cmxfcmVnKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJUEVSUk9SCisJCQkJCQkJICAgICgiSW52YWxpZCB0cmlnZ2VyIGVkZ2UuXG4iKTsKKwkJCQkJCQllcnIgPQorCQkJCQkJCSAgICBNRV9FUlJOT19JTlZBTElEX1RSSUdfRURHRTsKKwkJCQkJCQlnb3RvIEVSUk9SOworCQkJCQkJfQorCisJCQkJCQlzcGluX2xvY2soaW5zdGFuY2UtPgorCQkJCQkJCSAgcHJlbG9hZF9yZWdfbG9jayk7CisKKwkJCQkJCXRtcCA9CisJCQkJCQkgICAgaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQkJCQl0bXAgfD0KKwkJCQkJCSAgICAweDEwMDAxIDw8IGluc3RhbmNlLT5hb19pZHg7CisJCQkJCQlvdXRsKHRtcCwKKwkJCQkJCSAgICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCQkJCSppbnN0YW5jZS0+cHJlbG9hZF9mbGFncyAmPQorCQkJCQkJICAgIH4oMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCQkJCQkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPgorCQkJCQkJCSAgICBwcmVsb2FkX3JlZ19sb2NrKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCVBFUlJPUgorCQkJCQkJICAgICgiSW52YWxpZCB0cmlnZ2VyIHR5cGUuXG4iKTsKKwkJCQkJCWVyciA9CisJCQkJCQkgICAgTUVfRVJSTk9fSU5WQUxJRF9UUklHX1RZUEU7CisJCQkJCQlnb3RvIEVSUk9SOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIkludmFsaWQgdHJpZ2dlciBjaGFubmVsIHNwZWNpZmllZC5cbiIpOworCQkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1JFRjsKKwkJCQkJZ290byBFUlJPUjsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiSW52YWxpZCBhbmFsb2cgcmVmZXJlbmNlIHNwZWNpZmllZC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfUkVGOworCQkJCWdvdG8gRVJST1I7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgc2luZ2xlIGNvbmZpZyBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCWdvdG8gRVJST1I7CisJCX0KKwl9IGVsc2UgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJZ290byBFUlJPUjsKKwl9CisKKyAgICAgIEVSUk9SOgorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1bnNpZ25lZCBsb25nIHRtcDsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoY2hhbm5lbCAhPSAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVIKKwkgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCWlmICh0bXAgJiAweDMpIHsKKwkJUEVSUk9SKCJOb3QgaW4gc2luZ2xlIG1vZGUuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCX0gZWxzZSB7CisJCSp2YWx1ZSA9IGluc3RhbmNlLT5zaW5nbGVfdmFsdWU7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19zaW5nbGVfd3JpdGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgIGludCB2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1bnNpZ25lZCBsb25nIG1hc2sgPSAwOworCXVuc2lnbmVkIGxvbmcgdG1wOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCWludCBpOworCXdhaXRfcXVldWVfaGVhZF90IHF1ZXVlOworCXVuc2lnbmVkIGxvbmcgajsKKwl1bnNpZ25lZCBsb25nIGRlbGF5ID0gMDsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnF1ZXVlKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoY2hhbm5lbCAhPSAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAodGltZV9vdXQgPCAwKSB7CisJCVBFUlJPUigiSW52YWxpZCB0aW1lb3V0IHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9USU1FT1VUOworCX0KKworCWlmICh0aW1lX291dCkgeworCQlkZWxheSA9ICh0aW1lX291dCAqIEhaKSAvIDEwMDA7CisKKwkJaWYgKGRlbGF5ID09IDApCisJCQlkZWxheSA9IDE7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSCisJICAgIHNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCWlmICh0bXAgJiAweDMpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQlQRVJST1IoIk5vdCBpbiBzaW5nbGUgbW9kZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCWdvdG8gRVJST1I7CisJfQorCisJaWYgKHRtcCAmIE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRykgeworCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCWluc3RhbmNlLT5zaW5nbGVfdmFsdWUgPSB2YWx1ZTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJCWlmICghKGZsYWdzICYgTUVfSU9fU0lOR0xFX1RZUEVfV1JJVEVfTk9OQkxPQ0tJTkcpKSB7CisJCQlqID0gamlmZmllczsKKworCQkJd2hpbGUgKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJgorCQkJICAgICAgIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkgeworCQkJCWludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dCgmcXVldWUsIDEpOworCisJCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJCVBFUlJPUgorCQkJCQkgICAgKCJXYWl0IG9uIGV4dGVybmFsIHRyaWdnZXIgaW50ZXJydXB0ZWQgYnkgc2lnbmFsLlxuIik7CisJCQkJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwkJCQkJZ290byBFUlJPUjsKKwkJCQl9CisKKwkJCQlpZiAoZGVsYXkgJiYgKChqaWZmaWVzIC0gaikgPiBkZWxheSkpIHsKKwkJCQkJUEVSUk9SKCJUaW1lb3V0IHJlYWNoZWQuXG4iKTsKKwkJCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJCQkJZ290byBFUlJPUjsKKwkJCQl9CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKChpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKSAmICgweDEwMDAxIDw8IGluc3RhbmNlLT5hb19pZHgpKQorCQkgICA9PSAoMHgxMDAwMSA8PCBpbnN0YW5jZS0+YW9faWR4KSkgeworCQlpZiAoZmxhZ3MgJiBNRV9JT19TSU5HTEVfVFlQRV9UUklHX1NZTkNIUk9OT1VTKSB7CisJCQl0bXAgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHOworCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCQlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0gdmFsdWU7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCisJCQlpZiAoIShmbGFncyAmIE1FX0lPX1NJTkdMRV9UWVBFX1dSSVRFX05PTkJMT0NLSU5HKSkgeworCQkJCWogPSBqaWZmaWVzOworCisJCQkJd2hpbGUgKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJgorCQkJCSAgICAgICBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pIHsKKwkJCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCZxdWV1ZSwKKwkJCQkJCQkJICAgICAgIDEpOworCisJCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCQkJUEVSUk9SCisJCQkJCQkgICAgKCJXYWl0IG9uIGV4dGVybmFsIHRyaWdnZXIgaW50ZXJydXB0ZWQgYnkgc2lnbmFsLlxuIik7CisJCQkJCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJCQkJCQlnb3RvIEVSUk9SOworCQkJCQl9CisKKwkJCQkJaWYgKGRlbGF5ICYmICgoamlmZmllcyAtIGopID4gZGVsYXkpKSB7CisJCQkJCQlQRVJST1IoIlRpbWVvdXQgcmVhY2hlZC5cbiIpOworCQkJCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJCQkJCWdvdG8gRVJST1I7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCQlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0gdmFsdWU7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQl9CisJfSBlbHNlIGlmICgoaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZykgJiAoMHgxMDAwMSA8PCBpbnN0YW5jZS0+YW9faWR4KSkKKwkJICAgPT0gKDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KSkgeworCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCWluc3RhbmNlLT5zaW5nbGVfdmFsdWUgPSB2YWx1ZTsKKworCQlQREVCVUcoIlN5bmNocm9ub3VzIFNXLCBmbGFncyA9IDB4JVguXG4iLCBmbGFncyk7CisKKwkJaWYgKGZsYWdzICYgTUVfSU9fU0lOR0xFX1RZUEVfVFJJR19TWU5DSFJPTk9VUykgeworCQkJUERFQlVHKCJUcmlnZ2VyIHN5bmNocm9ub3VzIFNXLlxuIik7CisJCQlzcGluX2xvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCQkJdG1wID0gaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBNRTQ2MDBfQU9fTUFYX1NVQkRFVklDRVM7IGkrKykgeworCQkJCWlmICgoKmluc3RhbmNlLT5wcmVsb2FkX2ZsYWdzICYgKDB4MSA8PCBpKSkpIHsKKwkJCQkJaWYgKCh0bXAgJiAoMHgxMDAwMSA8PCBpKSkgPT0KKwkJCQkJICAgICgweDEgPDwgaSkpIHsKKwkJCQkJCW1hc2sgfD0gMHgxIDw8IGk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCXRtcCAmPSB+KG1hc2spOworCisJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKwkJfQorCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwl9IGVsc2UgeworCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCWluc3RhbmNlLT5zaW5nbGVfdmFsdWUgPSB2YWx1ZTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCX0KKworICAgICAgRVJST1I6CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3N0cmVhbV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIG1lSU9TdHJlYW1Db25maWdfdCAqIGNvbmZpZ19saXN0LAorCQkJCSAgICAgIGludCBjb3VudCwKKwkJCQkgICAgICBtZUlPU3RyZWFtVHJpZ2dlcl90ICogdHJpZ2dlciwKKwkJCQkgICAgICBpbnQgZmlmb19pcnFfdGhyZXNob2xkLCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1bnNpZ25lZCBsb25nIGN0cmw7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisJdWludDY0X3QgY29udl90aWNrczsKKwl1bnNpZ25lZCBpbnQgY29udl9zdGFydF90aWNrc19sb3cgPSB0cmlnZ2VyLT5pQ29udlN0YXJ0VGlja3NMb3c7CisJdW5zaWduZWQgaW50IGNvbnZfc3RhcnRfdGlja3NfaGlnaCA9IHRyaWdnZXItPmlDb252U3RhcnRUaWNrc0hpZ2g7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJY29udl90aWNrcyA9CisJICAgICh1aW50NjRfdCkgY29udl9zdGFydF90aWNrc19sb3cgKworCSAgICAoKHVpbnQ2NF90KSBjb252X3N0YXJ0X3RpY2tzX2hpZ2ggPDwgMzIpOworCisJaWYgKCFpbnN0YW5jZS0+ZmlmbykgeworCQlQRVJST1IoIk5vdCBhIHN0cmVhbWluZyBhby5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVIKKwkgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCWlmICgoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSkgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pIHsKKwkJUEVSUk9SKCJTdWJkZXZpY2UgaXMgYnVzeS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwkJZ290byBFUlJPUjsKKwl9CisKKwljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJY3RybCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCWN0cmwgPSBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCisJaWYgKGNvdW50ICE9IDEpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN0cmVhbSBjb25maWd1cmF0aW9uIGxpc3QgY291bnQgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ09ORklHX0xJU1RfQ09VTlQ7CisJCWdvdG8gRVJST1I7CisJfQorCisJaWYgKGNvbmZpZ19saXN0WzBdLmlDaGFubmVsICE9IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCWdvdG8gRVJST1I7CisJfQorCisJaWYgKGNvbmZpZ19saXN0WzBdLmlTdHJlYW1Db25maWcgIT0gMCkgeworCQlQRVJST1IoIkludmFsaWQgc3RyZWFtIGNvbmZpZyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TVFJFQU1fQ09ORklHOworCQlnb3RvIEVSUk9SOworCX0KKworCWlmIChjb25maWdfbGlzdFswXS5pUmVmICE9IE1FX1JFRl9BT19HUk9VTkQpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGFuYWxvZyByZWZlcmVuY2UuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9SRUY7CisJCWdvdG8gRVJST1I7CisJfQorCisJaWYgKCh0cmlnZ2VyLT5pQWNxU3RhcnRUaWNrc0xvdyAhPSAwKQorCSAgICB8fCAodHJpZ2dlci0+aUFjcVN0YXJ0VGlja3NIaWdoICE9IDApKSB7CisJCVBFUlJPUgorCQkgICAgKCJJbnZhbGlkIGFjcXVpc2l0aW9uIHN0YXJ0IHRyaWdnZXIgYXJndW1lbnQgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX0FSRzsKKwkJZ290byBFUlJPUjsKKwl9CisKKwlzd2l0Y2ggKHRyaWdnZXItPmlBY3FTdGFydFRyaWdUeXBlKSB7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9TVzoKKwkJYnJlYWs7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTDoKKwkJY3RybCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUc7CisKKwkJc3dpdGNoICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnRWRnZSkgeworCisJCWNhc2UgTUVfVFJJR19FREdFX1JJU0lORzoKKwkJCWJyZWFrOworCisJCWNhc2UgTUVfVFJJR19FREdFX0ZBTExJTkc6CisJCQljdHJsIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0U7CisKKwkJCWJyZWFrOworCisJCWNhc2UgTUVfVFJJR19FREdFX0FOWToKKwkJCWN0cmwgfD0KKwkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFIHwKKwkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFX0JPVEg7CisKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlQRVJST1IKKwkJCSAgICAoIkludmFsaWQgYWNxdWlzaXRpb24gc3RhcnQgdHJpZ2dlciBlZGdlIHNwZWNpZmllZC5cbiIpOworCisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9UUklHX0VER0U7CisKKwkJCWdvdG8gRVJST1I7CisKKwkJCWJyZWFrOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgYWNxdWlzaXRpb24gc3RhcnQgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX1RSSUdfVFlQRTsKKworCQlnb3RvIEVSUk9SOworCisJCWJyZWFrOworCX0KKworCXN3aXRjaCAodHJpZ2dlci0+aVNjYW5TdGFydFRyaWdUeXBlKSB7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9GT0xMT1c6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIHNjYW4gc3RhcnQgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVEFSVF9UUklHX1RZUEU7CisKKwkJZ290byBFUlJPUjsKKworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKHRyaWdnZXItPmlDb252U3RhcnRUcmlnVHlwZSkgeworCisJY2FzZSBNRV9UUklHX1RZUEVfVElNRVI6CisJCWlmICgoY29udl90aWNrcyA8IE1FNDYwMF9BT19NSU5fQ0hBTl9USUNLUykKKwkJICAgIHx8IChjb252X3RpY2tzID4gTUU0NjAwX0FPX01BWF9DSEFOX1RJQ0tTKSkgeworCQkJUEVSUk9SCisJCQkgICAgKCJJbnZhbGlkIGNvbnYgc3RhcnQgdHJpZ2dlciBhcmd1bWVudCBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ09OVl9TVEFSVF9BUkc7CisJCQlnb3RvIEVSUk9SOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgY29udiBzdGFydCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DT05WX1NUQVJUX1RSSUdfVFlQRTsKKworCQlnb3RvIEVSUk9SOworCisJCWJyZWFrOworCX0KKworCS8qIFByZXNldCB0byBoYXJkd2FyZSB3cmFwYXJvdW5kIG1vZGUgKi8KKwlpbnN0YW5jZS0+ZmxhZ3MgJj0gfihNRTQ2MDBfQU9fRkxBR1NfU1dfV1JBUF9NT0RFX01BU0spOworCisJc3dpdGNoICh0cmlnZ2VyLT5pU2NhblN0b3BUcmlnVHlwZSkgeworCisJY2FzZSBNRV9UUklHX1RZUEVfTk9ORToKKwkJaWYgKGZsYWdzICYgTUVfSU9fU1RSRUFNX0NPTkZJR19XUkFQQVJPVU5EKSB7CisJCQkvKiBTZXQgZmxhZ3MgdG8gaW5kaWNhdGUgdXNhZ2Ugb2Ygc29mdHdhcmUgbW9kZS4gKi8KKwkJCWluc3RhbmNlLT5mbGFncyB8PSBNRTQ2MDBfQU9fRkxBR1NfU1dfV1JBUF9NT0RFX0lORjsKKwkJCWluc3RhbmNlLT53cmFwX2NvdW50ID0gMDsKKwkJCWluc3RhbmNlLT53cmFwX3JlbWFpbmluZyA9IDA7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19UWVBFX0NPVU5UOgorCQlpZiAoZmxhZ3MgJiBNRV9JT19TVFJFQU1fQ09ORklHX1dSQVBBUk9VTkQpIHsKKwkJCWlmICh0cmlnZ2VyLT5pU2NhblN0b3BDb3VudCA8PSAwKSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHNjYW4gc3RvcCBjb3VudCBzcGVjaWZpZWQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NDQU5fU1RPUF9BUkc7CisJCQkJZ290byBFUlJPUjsKKwkJCX0KKworCQkJLyogU2V0IGZsYWdzIHRvIGluZGljYXRlIHVzYWdlIG9mIHNvZnR3YXJlIG1vZGUuICovCisJCQlpbnN0YW5jZS0+ZmxhZ3MgfD0gTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV9GSU47CisJCQlpbnN0YW5jZS0+d3JhcF9jb3VudCA9IHRyaWdnZXItPmlTY2FuU3RvcENvdW50OworCQkJaW5zdGFuY2UtPndyYXBfcmVtYWluaW5nID0gdHJpZ2dlci0+aVNjYW5TdG9wQ291bnQ7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgc2NhbiBzdG9wIHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUT1BfVFJJR19UWVBFOworCQkJZ290byBFUlJPUjsKKwkJfQorCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIHNjYW4gc3RvcCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TQ0FOX1NUT1BfVFJJR19UWVBFOworCisJCWdvdG8gRVJST1I7CisKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoICh0cmlnZ2VyLT5pQWNxU3RvcFRyaWdUeXBlKSB7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9OT05FOgorCQlicmVhazsKKworCWNhc2UgTUVfVFJJR19UWVBFX0NPVU5UOgorCQlpZiAodHJpZ2dlci0+aVNjYW5TdG9wVHJpZ1R5cGUgIT0gTUVfVFJJR19UWVBFX05PTkUpIHsKKwkJCVBFUlJPUigiSW52YWxpZCBhY3Egc3RvcCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0FDUV9TVE9QX1RSSUdfVFlQRTsKKwkJCWdvdG8gRVJST1I7CisJCX0KKworCQlpZiAoZmxhZ3MgJiBNRV9JT19TVFJFQU1fQ09ORklHX1dSQVBBUk9VTkQpIHsKKwkJCWlmICh0cmlnZ2VyLT5pQWNxU3RvcENvdW50IDw9IDApIHsKKwkJCQlQRVJST1IoIkludmFsaWQgYWNxIHN0b3AgY291bnQgc3BlY2lmaWVkLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RPUF9BUkc7CisJCQkJZ290byBFUlJPUjsKKwkJCX0KKworCQkJLyogU2V0IGZsYWdzIHRvIGluZGljYXRlIHVzYWdlIG9mIHNvZnR3YXJlIG1vZGUuICovCisJCQlpbnN0YW5jZS0+ZmxhZ3MgfD0gTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV9GSU47CisJCQlpbnN0YW5jZS0+d3JhcF9jb3VudCA9IHRyaWdnZXItPmlBY3FTdG9wQ291bnQ7CisJCQlpbnN0YW5jZS0+d3JhcF9yZW1haW5pbmcgPSB0cmlnZ2VyLT5pQWNxU3RvcENvdW50OworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGFjcCBzdG9wIHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUT1BfVFJJR19UWVBFOworCQkJZ290byBFUlJPUjsKKwkJfQorCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGFjcSBzdG9wIHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RPUF9UUklHX1RZUEU7CisJCWdvdG8gRVJST1I7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ0NoYW4pIHsKKworCWNhc2UgTUVfVFJJR19DSEFOX0RFRkFVTFQ6CisJCXNwaW5fbG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisJCXRtcCA9IGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQl0bXAgJj0gfigweDEwMDAxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCQlvdXRsKHRtcCwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCisJCWJyZWFrOworCisJY2FzZSBNRV9UUklHX0NIQU5fU1lOQ0hST05PVVM6CisJCWlmICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnVHlwZSA9PSBNRV9UUklHX1RZUEVfU1cpIHsKKwkJCXNwaW5fbG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisJCQl0bXAgPSBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCXRtcCAmPSB+KDB4MTAwMDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCXRtcCB8PSAweDEgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKwkJCW91dGwodG1wLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCQl9IGVsc2UgeworCQkJY3RybCAmPSB+KE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRyk7CisJCQlzcGluX2xvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCQkJdG1wID0gaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQl0bXAgJj0gfigweDEwMDAxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQl0bXAgfD0gMHgxMDAwMCA8PCBpbnN0YW5jZS0+YW9faWR4OworCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlzcGluX3VubG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisJCX0KKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBhY3Egc3RhcnQgdHJpZ2dlciBjaGFubmVsIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9UUklHX0NIQU47CisJCWdvdG8gRVJST1I7CisKKwkJYnJlYWs7CisJfQorCisJb3V0bChjb252X3RpY2tzIC0gMiwgaW5zdGFuY2UtPnRpbWVyX3JlZyk7CisKKwlpZiAoZmxhZ3MgJiBNRV9JT19TVFJFQU1fQ09ORklHX0JJVF9QQVRURVJOKSB7CisJCWlmIChpbnN0YW5jZS0+YW9faWR4ID09IDMpIHsKKwkJCWN0cmwgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9ETzsKKwkJfSBlbHNlIHsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJCQlnb3RvIEVSUk9SOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGluc3RhbmNlLT5hb19pZHggPT0gMykgeworCQkJY3RybCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9ETzsKKwkJfQorCX0KKworCS8qIFNldCBoYXJkd2FyZSBtb2RlLiAqLworCWlmIChmbGFncyAmIE1FX0lPX1NUUkVBTV9DT05GSUdfV1JBUEFST1VORCkgeworCQljdHJsIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9NT0RFXzA7CisJfSBlbHNlIHsKKwkJY3RybCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfTU9ERV8xOworCX0KKworCVBERUJVRygiUHJlbG9hZCB3b3JkID0gMHglWC5cbiIsIGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpKTsKKworCVBERUJVRygiQ3RybCB3b3JkID0gMHglbFguXG4iLCBjdHJsKTsKKwlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CS8vIFdyaXRlIHRoZSBjb250cm9sIHdvcmQKKworICAgICAgRVJST1I6CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX2lvX3N0cmVhbV9uZXdfdmFsdWVzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkJICBpbnQgdGltZV9vdXQsIGludCAqY291bnQsIGludCBmbGFncykKK3sKKwltZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCWxvbmcgdCA9IDA7CisJbG9uZyBqOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmICghaW5zdGFuY2UtPmZpZm8pIHsKKwkJUEVSUk9SKCJOb3QgYSBzdHJlYW1pbmcgYW8uXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7CisJfQorCisJaWYgKHRpbWVfb3V0IDwgMCkgeworCQlQRVJST1IoIkludmFsaWQgdGltZV9vdXQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RJTUVPVVQ7CisJfQorCisJaWYgKHRpbWVfb3V0KSB7CisJCXQgPSAodGltZV9vdXQgKiBIWikgLyAxMDAwOworCisJCWlmICh0ID09IDApCisJCQl0ID0gMTsKKwl9CisKKwkqY291bnQgPSAwOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJaWYgKHQpIHsKKwkJaiA9IGppZmZpZXM7CisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJICgobWVfY2lyY19idWZfc3BhY2UKKwkJCQkJCSAgICgmaW5zdGFuY2UtPmNpcmNfYnVmKSkKKwkJCQkJCSAgfHwgIShpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpCisJCQkJCQkgICAgICAgJgorCQkJCQkJICAgICAgIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpLAorCQkJCQkJIHQpOworCisJCWlmICghKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CisJCQlQRVJST1IoIkFPIHN1YmRldmljZSBpcyBub3QgcnVubmluZy5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fU1VCREVWSUNFX05PVF9SVU5OSU5HOworCQl9IGVsc2UgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlQRVJST1IoIldhaXQgb24gdmFsdWVzIGludGVycnVwdGVkIGZyb20gc2lnbmFsLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJCX0gZWxzZSBpZiAoKGppZmZpZXMgLSBqKSA+PSB0KSB7CisJCQlQRVJST1IoIldhaXQgb24gdmFsdWVzIHRpbWVkIG91dC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJfSBlbHNlIHsKKwkJCSpjb3VudCA9IG1lX2NpcmNfYnVmX3NwYWNlKCZpbnN0YW5jZS0+Y2lyY19idWYpOworCQl9CisJfSBlbHNlIHsKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkgKChtZV9jaXJjX2J1Zl9zcGFjZQorCQkJCQkgICAoJmluc3RhbmNlLT5jaXJjX2J1ZikpCisJCQkJCSAgfHwgIShpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYKKwkJCQkJICAgICAgIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpKTsKKworCQlpZiAoIShpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkgeworCQkJUEVSUk9SKCJBTyBzdWJkZXZpY2UgaXMgbm90IHJ1bm5pbmcuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX1NVQkRFVklDRV9OT1RfUlVOTklORzsKKwkJfSBlbHNlIGlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJUEVSUk9SKCJXYWl0IG9uIHZhbHVlcyBpbnRlcnJ1cHRlZCBmcm9tIHNpZ25hbC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQl9IGVsc2UgeworCQkJKmNvdW50ID0gbWVfY2lyY19idWZfc3BhY2UoJmluc3RhbmNlLT5jaXJjX2J1Zik7CisJCX0KKwl9CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHN0b3BfaW1tZWRpYXRlbHkobWU0NjAwX2FvX3N1YmRldmljZV90ICogaW5zdGFuY2UpCit7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisJdWludDMyX3QgdG1wOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwl0bXAgfD0gTUU0NjAwX0FPX0NUUkxfQklUX1NUT1AgfCBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwl3aGlsZSAoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkgOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19zdHJlYW1fc3RhcnQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICBpbnQgc3RhcnRfbW9kZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFncyA9IDA7CisJdW5zaWduZWQgbG9uZyByZWY7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJdW5zaWduZWQgbG9uZyBkZWxheSA9IDA7CisJd2FpdF9xdWV1ZV9oZWFkX3QgcXVldWU7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmcXVldWUpOworCisJaWYgKHRpbWVfb3V0IDwgMCkgeworCQlQRVJST1IoIkludmFsaWQgdGltZW91dCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVElNRU9VVDsKKwl9CisKKwlpZiAodGltZV9vdXQpIHsKKwkJZGVsYXkgPSAodGltZV9vdXQgKiBIWikgLyAxMDAwOworCisJCWlmIChkZWxheSA9PSAwKQorCQkJZGVsYXkgPSAxOworCX0KKworCWlmICghaW5zdGFuY2UtPmZpZm8pIHsKKwkJUEVSUk9SKCJOb3QgYSBzdHJlYW1pbmcgYW8uXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSCisJICAgIHNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCXN3aXRjaCAodG1wICYgKE1FNDYwMF9BT19DVFJMX01BU0tfTU9ERSkpIHsKKworCWNhc2UgMDoJCS8vIFNpbmdsZSBtb2RlCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkJUEVSUk9SKCJTdWJkZXZpY2UgaXMgY29uZmlndXJlZCBpbiBzaW5nbGUgbW9kZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCWdvdG8gRVJST1I7CisKKwljYXNlIDE6CQkvLyBXcmFwYXJvdW5kIG1vZGUKKwkJaWYgKHRtcCAmIE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRykgewkvLyBOb3JtYWwgd3JhcGFyb3VuZCB3aXRoIGV4dGVybmFsIHRyaWdnZXIKKworCQkJaWYgKChpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYKKwkJCSAgICAgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT4KKwkJCQkJCSAgICAgICBzdWJkZXZpY2VfbG9jaywKKwkJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQkJCVBFUlJPUigiQ29udmVyc2lvbiBpcyBhbHJlYWR5IHJ1bm5pbmcuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwkJCQlnb3RvIEVSUk9SOworCQkJfQorCisJCQl0bXAgJj0KKwkJCSAgICB+KE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJRIHwKKwkJCSAgICAgIE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QIHwKKwkJCSAgICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCk7CisKKwkJCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKworCQkJaWYgKHN0YXJ0X21vZGUgPT0gTUVfU1RBUlRfTU9ERV9CTE9DS0lORykgeworCQkJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnF1ZXVlKTsKKworCQkJCWlmIChkZWxheSkgeworCQkJCQlyZWYgPSBqaWZmaWVzOworCisJCQkJCXdoaWxlICghCisJCQkJCSAgICAgICAoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmCisJCQkJCQlNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CisJCQkJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQKKwkJCQkJCSAgICAoJnF1ZXVlLCAxKTsKKworCQkJCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJCQkJUEVSUk9SCisJCQkJCQkJICAgICgiV2FpdCBvbiBzdGFydCBvZiBzdGF0ZSBtYWNoaW5lIGludGVycnVwdGVkLlxuIik7CisJCQkJCQkJc3RvcF9pbW1lZGlhdGVseQorCQkJCQkJCSAgICAoaW5zdGFuY2UpOworCQkJCQkJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwkJCQkJCQlnb3RvIEVSUk9SOworCQkJCQkJfQorCisJCQkJCQlpZiAoKChqaWZmaWVzIC0gcmVmKSA+PSBkZWxheSkpIHsKKwkJCQkJCQlQRVJST1IKKwkJCQkJCQkgICAgKCJUaW1lb3V0IHJlYWNoZWQuXG4iKTsKKwkJCQkJCQlzdG9wX2ltbWVkaWF0ZWx5CisJCQkJCQkJICAgIChpbnN0YW5jZSk7CisJCQkJCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJCQkJCQlnb3RvIEVSUk9SOworCQkJCQkJfQorCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJd2hpbGUgKCEKKwkJCQkJICAgICAgIChpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYKKwkJCQkJCU1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsKKwkJCQkJCWludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dAorCQkJCQkJICAgICgmcXVldWUsIDEpOworCisJCQkJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQkJCQlQRVJST1IKKwkJCQkJCQkgICAgKCJXYWl0IG9uIHN0YXJ0IG9mIHN0YXRlIG1hY2hpbmUgaW50ZXJydXB0ZWQuXG4iKTsKKwkJCQkJCQlzdG9wX2ltbWVkaWF0ZWx5CisJCQkJCQkJICAgIChpbnN0YW5jZSk7CisJCQkJCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQkJCQkJCWdvdG8gRVJST1I7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgaWYgKHN0YXJ0X21vZGUgPT0gTUVfU1RBUlRfTU9ERV9OT05CTE9DS0lORykgeworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IoIkludmFsaWQgc3RhcnQgbW9kZSBzcGVjaWZpZWQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NUQVJUX01PREU7CisJCQkJZ290byBFUlJPUjsKKwkJCX0KKwkJfSBlbHNlIGlmICgoaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZykgJiAoMHgxMDAwMSA8PCBpbnN0YW5jZS0+YW9faWR4KSkgPT0gKDB4MTAwMDAgPDwgaW5zdGFuY2UtPmFvX2lkeCkpIHsJLy8gU3luY2hyb25vdXMgd2l0aCBleHRlcm5hbCB0cmlnZ2VyCisKKwkJCWlmICgoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmCisJCQkgICAgIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+CisJCQkJCQkgICAgICAgc3ViZGV2aWNlX2xvY2ssCisJCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKwkJCQlQRVJST1IoIkNvbnZlcnNpb24gaXMgYWxyZWFkeSBydW5uaW5nLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fU1VCREVWSUNFX0JVU1k7CisJCQkJZ290byBFUlJPUjsKKwkJCX0KKworCQkJaWYgKGZsYWdzICYgTUVfSU9fU1RSRUFNX1NUQVJUX1RZUEVfVFJJR19TWU5DSFJPTk9VUykgeworCQkJCXRtcCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUc7CisJCQkJdG1wICY9CisJCQkJICAgIH4oTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlEgfAorCQkJCSAgICAgIE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QIHwKKwkJCQkgICAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1ApOworCQkJCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT4KKwkJCQkJCSAgICAgICBzdWJkZXZpY2VfbG9jaywKKwkJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCisJCQkJaWYgKHN0YXJ0X21vZGUgPT0gTUVfU1RBUlRfTU9ERV9CTE9DS0lORykgeworCQkJCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZxdWV1ZSk7CisKKwkJCQkJaWYgKGRlbGF5KSB7CisJCQkJCQlyZWYgPSBqaWZmaWVzOworCisJCQkJCQl3aGlsZSAoIQorCQkJCQkJICAgICAgIChpbmwKKwkJCQkJCQkoaW5zdGFuY2UtPgorCQkJCQkJCSBzdGF0dXNfcmVnKSAmCisJCQkJCQkJTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkKKwkJCQkJCXsKKwkJCQkJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQKKwkJCQkJCQkgICAgKCZxdWV1ZSwgMSk7CisKKwkJCQkJCQlpZiAoc2lnbmFsX3BlbmRpbmcKKwkJCQkJCQkgICAgKGN1cnJlbnQpKSB7CisJCQkJCQkJCVBFUlJPUgorCQkJCQkJCQkgICAgKCJXYWl0IG9uIHN0YXJ0IG9mIHN0YXRlIG1hY2hpbmUgaW50ZXJydXB0ZWQuXG4iKTsKKwkJCQkJCQkJc3RvcF9pbW1lZGlhdGVseQorCQkJCQkJCQkgICAgKGluc3RhbmNlKTsKKwkJCQkJCQkJZXJyID0KKwkJCQkJCQkJICAgIE1FX0VSUk5PX1NJR05BTDsKKwkJCQkJCQkJZ290byBFUlJPUjsKKwkJCQkJCQl9CisKKwkJCQkJCQlpZiAoKChqaWZmaWVzIC0gcmVmKSA+PQorCQkJCQkJCSAgICAgZGVsYXkpKSB7CisJCQkJCQkJCVBFUlJPUgorCQkJCQkJCQkgICAgKCJUaW1lb3V0IHJlYWNoZWQuXG4iKTsKKwkJCQkJCQkJc3RvcF9pbW1lZGlhdGVseQorCQkJCQkJCQkgICAgKGluc3RhbmNlKTsKKwkJCQkJCQkJZXJyID0KKwkJCQkJCQkJICAgIE1FX0VSUk5PX1RJTUVPVVQ7CisJCQkJCQkJCWdvdG8gRVJST1I7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJd2hpbGUgKCEKKwkJCQkJCSAgICAgICAoaW5sCisJCQkJCQkJKGluc3RhbmNlLT4KKwkJCQkJCQkgc3RhdHVzX3JlZykgJgorCQkJCQkJCU1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpCisJCQkJCQl7CisJCQkJCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0CisJCQkJCQkJICAgICgmcXVldWUsIDEpOworCisJCQkJCQkJaWYgKHNpZ25hbF9wZW5kaW5nCisJCQkJCQkJICAgIChjdXJyZW50KSkgeworCQkJCQkJCQlQRVJST1IKKwkJCQkJCQkJICAgICgiV2FpdCBvbiBzdGFydCBvZiBzdGF0ZSBtYWNoaW5lIGludGVycnVwdGVkLlxuIik7CisJCQkJCQkJCXN0b3BfaW1tZWRpYXRlbHkKKwkJCQkJCQkJICAgIChpbnN0YW5jZSk7CisJCQkJCQkJCWVyciA9CisJCQkJCQkJCSAgICBNRV9FUlJOT19TSUdOQUw7CisJCQkJCQkJCWdvdG8gRVJST1I7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfSBlbHNlIGlmIChzdGFydF9tb2RlID09CisJCQkJCSAgIE1FX1NUQVJUX01PREVfTk9OQkxPQ0tJTkcpIHsKKwkJCQl9IGVsc2UgeworCQkJCQlQRVJST1IKKwkJCQkJICAgICgiSW52YWxpZCBzdGFydCBtb2RlIHNwZWNpZmllZC5cbiIpOworCQkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NUQVJUX01PREU7CisJCQkJCWdvdG8gRVJST1I7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQl0bXAgJj0KKwkJCQkgICAgfihNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUSB8CisJCQkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX1NUT1AgfAorCQkJCSAgICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCk7CisJCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPgorCQkJCQkJICAgICAgIHN1YmRldmljZV9sb2NrLAorCQkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCQl9CisJCX0gZWxzZSBpZiAoKGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpICYgKDB4MTAwMDEgPDwgaW5zdGFuY2UtPmFvX2lkeCkpID09ICgweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCkpIHsJLy8gU3luY2hyb25vdXMgd3JhcGFyb3VuZCB3aXRoIHN3IHRyaWdnZXIKKworCQkJaWYgKChpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYKKwkJCSAgICAgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT4KKwkJCQkJCSAgICAgICBzdWJkZXZpY2VfbG9jaywKKwkJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQkJCVBFUlJPUigiQ29udmVyc2lvbiBpcyBhbHJlYWR5IHJ1bm5pbmcuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwkJCQlnb3RvIEVSUk9SOworCQkJfQorCisJCQl0bXAgJj0KKwkJCSAgICB+KE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJRIHwKKwkJCSAgICAgIE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QIHwKKwkJCSAgICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCk7CisKKwkJCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCisJCQlpZiAoZmxhZ3MgJiBNRV9JT19TVFJFQU1fU1RBUlRfVFlQRV9UUklHX1NZTkNIUk9OT1VTKSB7CisJCQkJb3V0bCgweDgwMDAsIGluc3RhbmNlLT5zaW5nbGVfcmVnKTsKKwkJCQlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0gMHg4MDAwOworCQkJfQorCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQl9IGVsc2UgewkvLyBTb2Z0d2FyZSBzdGFydAorCisJCQlpZiAoKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJgorCQkJICAgICBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPgorCQkJCQkJICAgICAgIHN1YmRldmljZV9sb2NrLAorCQkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCQkJUEVSUk9SKCJDb252ZXJzaW9uIGlzIGFscmVhZHkgcnVubmluZy5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1NVQkRFVklDRV9CVVNZOworCQkJCWdvdG8gRVJST1I7CisJCQl9CisKKwkJCXRtcCAmPQorCQkJICAgIH4oTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlEgfAorCQkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX1NUT1AgfAorCQkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QKTsKKworCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwkJCW91dGwoMHg4MDAwLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCQlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0gMHg4MDAwOworCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIDI6CQkvLyBDb250aW51b3VzIG1vZGUKKwkJaWYgKHRtcCAmIE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRykgewkvLyBFeHRlcm5hbGx5IHRyaWdnZXJlZAorCisJCQlpZiAoKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJgorCQkJICAgICBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPgorCQkJCQkJICAgICAgIHN1YmRldmljZV9sb2NrLAorCQkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCQkJUEVSUk9SKCJDb252ZXJzaW9uIGlzIGFscmVhZHkgcnVubmluZy5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1NVQkRFVklDRV9CVVNZOworCQkJCWdvdG8gRVJST1I7CisJCQl9CisKKwkJCXRtcCAmPQorCQkJICAgIH4oTUU0NjAwX0FPX0NUUkxfQklUX1NUT1AgfAorCQkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QKTsKKwkJCXRtcCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJaW5zdGFuY2UtPndyYXBfcmVtYWluaW5nID0gaW5zdGFuY2UtPndyYXBfY291bnQ7CisJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCA9IDA7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCisJCQlpZiAoc3RhcnRfbW9kZSA9PSBNRV9TVEFSVF9NT0RFX0JMT0NLSU5HKSB7CisJCQkJaW5pdF93YWl0cXVldWVfaGVhZCgmcXVldWUpOworCisJCQkJaWYgKGRlbGF5KSB7CisJCQkJCXJlZiA9IGppZmZpZXM7CisKKwkJCQkJd2hpbGUgKCEKKwkJCQkJICAgICAgIChpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYKKwkJCQkJCU1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsKKwkJCQkJCWludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dAorCQkJCQkJICAgICgmcXVldWUsIDEpOworCisJCQkJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQkJCQlQRVJST1IKKwkJCQkJCQkgICAgKCJXYWl0IG9uIHN0YXJ0IG9mIHN0YXRlIG1hY2hpbmUgaW50ZXJydXB0ZWQuXG4iKTsKKwkJCQkJCQlzdG9wX2ltbWVkaWF0ZWx5CisJCQkJCQkJICAgIChpbnN0YW5jZSk7CisJCQkJCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQkJCQkJCWdvdG8gRVJST1I7CisJCQkJCQl9CisKKwkJCQkJCWlmICgoKGppZmZpZXMgLSByZWYpID49IGRlbGF5KSkgeworCQkJCQkJCVBFUlJPUgorCQkJCQkJCSAgICAoIlRpbWVvdXQgcmVhY2hlZC5cbiIpOworCQkJCQkJCXN0b3BfaW1tZWRpYXRlbHkKKwkJCQkJCQkgICAgKGluc3RhbmNlKTsKKwkJCQkJCQllcnIgPSBNRV9FUlJOT19USU1FT1VUOworCQkJCQkJCWdvdG8gRVJST1I7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQl3aGlsZSAoIQorCQkJCQkgICAgICAgKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJgorCQkJCQkJTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkgeworCQkJCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0CisJCQkJCQkgICAgKCZxdWV1ZSwgMSk7CisKKwkJCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCQkJCVBFUlJPUgorCQkJCQkJCSAgICAoIldhaXQgb24gc3RhcnQgb2Ygc3RhdGUgbWFjaGluZSBpbnRlcnJ1cHRlZC5cbiIpOworCQkJCQkJCXN0b3BfaW1tZWRpYXRlbHkKKwkJCQkJCQkgICAgKGluc3RhbmNlKTsKKwkJCQkJCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJCQkJCQkJZ290byBFUlJPUjsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSBpZiAoc3RhcnRfbW9kZSA9PSBNRV9TVEFSVF9NT0RFX05PTkJMT0NLSU5HKSB7CisJCQkJLyogRG8gbm90aGluZyAqLworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IoIkludmFsaWQgc3RhcnQgbW9kZSBzcGVjaWZpZWQuXG4iKTsKKwkJCQlzdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NUQVJUX01PREU7CisJCQkJZ290byBFUlJPUjsKKwkJCX0KKwkJfSBlbHNlIGlmICgoaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZykgJiAoMHgxMDAwMSA8PCBpbnN0YW5jZS0+YW9faWR4KSkgPT0gKDB4MTAwMDAgPDwgaW5zdGFuY2UtPmFvX2lkeCkpIHsJLy8gU3luY2hyb25vdXMgd2l0aCBleHRlcm5hbCB0cmlnZ2VyCisKKwkJCWlmICgoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmCisJCQkgICAgIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+CisJCQkJCQkgICAgICAgc3ViZGV2aWNlX2xvY2ssCisJCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKwkJCQlQRVJST1IoIkNvbnZlcnNpb24gaXMgYWxyZWFkeSBydW5uaW5nLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fU1VCREVWSUNFX0JVU1k7CisJCQkJZ290byBFUlJPUjsKKwkJCX0KKworCQkJaWYgKGZsYWdzICYgTUVfSU9fU1RSRUFNX1NUQVJUX1RZUEVfVFJJR19TWU5DSFJPTk9VUykgeworCQkJCXRtcCB8PQorCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUcgfAorCQkJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCQl0bXAgJj0KKwkJCQkgICAgfihNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8CisJCQkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QKTsKKwkJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCQlpbnN0YW5jZS0+d3JhcF9yZW1haW5pbmcgPSBpbnN0YW5jZS0+d3JhcF9jb3VudDsKKwkJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCA9IDA7CisKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+CisJCQkJCQkgICAgICAgc3ViZGV2aWNlX2xvY2ssCisJCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKworCQkJCWlmIChzdGFydF9tb2RlID09IE1FX1NUQVJUX01PREVfQkxPQ0tJTkcpIHsKKwkJCQkJaW5pdF93YWl0cXVldWVfaGVhZCgmcXVldWUpOworCisJCQkJCWlmIChkZWxheSkgeworCQkJCQkJcmVmID0gamlmZmllczsKKworCQkJCQkJd2hpbGUgKCEKKwkJCQkJCSAgICAgICAoaW5sCisJCQkJCQkJKGluc3RhbmNlLT4KKwkJCQkJCQkgc3RhdHVzX3JlZykgJgorCQkJCQkJCU1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpCisJCQkJCQl7CisJCQkJCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0CisJCQkJCQkJICAgICgmcXVldWUsIDEpOworCisJCQkJCQkJaWYgKHNpZ25hbF9wZW5kaW5nCisJCQkJCQkJICAgIChjdXJyZW50KSkgeworCQkJCQkJCQlQRVJST1IKKwkJCQkJCQkJICAgICgiV2FpdCBvbiBzdGFydCBvZiBzdGF0ZSBtYWNoaW5lIGludGVycnVwdGVkLlxuIik7CisJCQkJCQkJCXN0b3BfaW1tZWRpYXRlbHkKKwkJCQkJCQkJICAgIChpbnN0YW5jZSk7CisJCQkJCQkJCWVyciA9CisJCQkJCQkJCSAgICBNRV9FUlJOT19TSUdOQUw7CisJCQkJCQkJCWdvdG8gRVJST1I7CisJCQkJCQkJfQorCisJCQkJCQkJaWYgKCgoamlmZmllcyAtIHJlZikgPj0KKwkJCQkJCQkgICAgIGRlbGF5KSkgeworCQkJCQkJCQlQRVJST1IKKwkJCQkJCQkJICAgICgiVGltZW91dCByZWFjaGVkLlxuIik7CisJCQkJCQkJCXN0b3BfaW1tZWRpYXRlbHkKKwkJCQkJCQkJICAgIChpbnN0YW5jZSk7CisJCQkJCQkJCWVyciA9CisJCQkJCQkJCSAgICBNRV9FUlJOT19USU1FT1VUOworCQkJCQkJCQlnb3RvIEVSUk9SOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXdoaWxlICghCisJCQkJCQkgICAgICAgKGlubAorCQkJCQkJCShpbnN0YW5jZS0+CisJCQkJCQkJIHN0YXR1c19yZWcpICYKKwkJCQkJCQlNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKQorCQkJCQkJeworCQkJCQkJCWludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dAorCQkJCQkJCSAgICAoJnF1ZXVlLCAxKTsKKworCQkJCQkJCWlmIChzaWduYWxfcGVuZGluZworCQkJCQkJCSAgICAoY3VycmVudCkpIHsKKwkJCQkJCQkJUEVSUk9SCisJCQkJCQkJCSAgICAoIldhaXQgb24gc3RhcnQgb2Ygc3RhdGUgbWFjaGluZSBpbnRlcnJ1cHRlZC5cbiIpOworCQkJCQkJCQlzdG9wX2ltbWVkaWF0ZWx5CisJCQkJCQkJCSAgICAoaW5zdGFuY2UpOworCQkJCQkJCQllcnIgPQorCQkJCQkJCQkgICAgTUVfRVJSTk9fU0lHTkFMOworCQkJCQkJCQlnb3RvIEVSUk9SOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoc3RhcnRfbW9kZSA9PQorCQkJCQkgICBNRV9TVEFSVF9NT0RFX05PTkJMT0NLSU5HKSB7CisJCQkJfSBlbHNlIHsKKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIkludmFsaWQgc3RhcnQgbW9kZSBzcGVjaWZpZWQuXG4iKTsKKwkJCQkJc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU1RBUlRfTU9ERTsKKwkJCQkJZ290byBFUlJPUjsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXRtcCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCQl0bXAgJj0KKwkJCQkgICAgfihNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8CisJCQkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QKTsKKwkJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCQlpbnN0YW5jZS0+d3JhcF9yZW1haW5pbmcgPSBpbnN0YW5jZS0+d3JhcF9jb3VudDsKKwkJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCA9IDA7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPgorCQkJCQkJICAgICAgIHN1YmRldmljZV9sb2NrLAorCQkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCQl9CisJCX0gZWxzZSBpZiAoKGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpICYgKDB4MTAwMDEgPDwgaW5zdGFuY2UtPmFvX2lkeCkpID09ICgweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCkpIHsJLy8gU3luY2hyb25vdXMgd3JhcGFyb3VuZCB3aXRoIHN3IHRyaWdnZXIKKworCQkJaWYgKChpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYKKwkJCSAgICAgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT4KKwkJCQkJCSAgICAgICBzdWJkZXZpY2VfbG9jaywKKwkJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQkJCVBFUlJPUigiQ29udmVyc2lvbiBpcyBhbHJlYWR5IHJ1bm5pbmcuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwkJCQlnb3RvIEVSUk9SOworCQkJfQorCisJCQl0bXAgJj0KKwkJCSAgICB+KE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QIHwKKwkJCSAgICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUCk7CisJCQl0bXAgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCQlpbnN0YW5jZS0+d3JhcF9yZW1haW5pbmcgPSBpbnN0YW5jZS0+d3JhcF9jb3VudDsKKwkJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsID0gMDsKKwkJCVBERUJVRygiQ1RSTCBSZWcgPSAweCVYLlxuIiwgaW5sKGluc3RhbmNlLT5jdHJsX3JlZykpOworCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwkJCWlmIChmbGFncyAmIE1FX0lPX1NUUkVBTV9TVEFSVF9UWVBFX1RSSUdfU1lOQ0hST05PVVMpIHsKKwkJCQlvdXRsKDB4ODAwMCwgaW5zdGFuY2UtPnNpbmdsZV9yZWcpOworCQkJCWluc3RhbmNlLT5zaW5nbGVfdmFsdWUgPSAweDgwMDA7CisJCQl9CisKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCX0gZWxzZSB7CS8vIFNvZnR3YXJlIHN0YXJ0CisKKwkJCWlmICgoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmCisJCQkgICAgIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+CisJCQkJCQkgICAgICAgc3ViZGV2aWNlX2xvY2ssCisJCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKwkJCQlQRVJST1IoIkNvbnZlcnNpb24gaXMgYWxyZWFkeSBydW5uaW5nLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fU1VCREVWSUNFX0JVU1k7CisJCQkJZ290byBFUlJPUjsKKwkJCX0KKworCQkJdG1wICY9CisJCQkgICAgfihNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8CisJCQkgICAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1ApOworCisJCQl0bXAgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCW91dGwoMHg4MDAwLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCQlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0gMHg4MDAwOworCQkJaW5zdGFuY2UtPndyYXBfcmVtYWluaW5nID0gaW5zdGFuY2UtPndyYXBfY291bnQ7CisJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCA9IDA7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJCVBFUlJPUigiSW52YWxpZCBtb2RlIGNvbmZpZ3VyZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJCWdvdG8gRVJST1I7CisJfQorCisgICAgICBFUlJPUjoKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYW9faW9fc3RyZWFtX3N0YXR1cyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IHdhaXQsCisJCQkJICAgICAgaW50ICpzdGF0dXMsIGludCAqdmFsdWVzLCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBxdWV1ZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZxdWV1ZSk7CisKKwlpZiAoIWluc3RhbmNlLT5maWZvKSB7CisJCVBFUlJPUigiTm90IGEgc3RyZWFtaW5nIGFvLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCWlmICh3YWl0ID09IE1FX1dBSVRfTk9ORSkgeworCQkqc3RhdHVzID0KKwkJICAgIChpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSA/CisJCSAgICBNRV9TVEFUVVNfQlVTWSA6IE1FX1NUQVRVU19JRExFOworCQkqdmFsdWVzID0gbWVfY2lyY19idWZfc3BhY2UoJmluc3RhbmNlLT5jaXJjX2J1Zik7CisJfSBlbHNlIGlmICh3YWl0ID09IE1FX1dBSVRfSURMRSkgeworCQl3aGlsZSAoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkgeworCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCZxdWV1ZSwgMSk7CisKKwkJCWlmIChpbnN0YW5jZS0+ZmxhZ3MgJiBNRTQ2MDBfQU9fRkxBR1NfQlJPS0VOX1BJUEUpIHsKKwkJCQlQRVJST1IoIk91dHB1dCBzdHJlYW0gd2FzIGludGVycnVwdGVkLlxuIik7CisJCQkJKnN0YXR1cyA9IE1FX1NUQVRVU19FUlJPUjsKKwkJCQllcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCQkJCWdvdG8gRVJST1I7CisJCQl9CisKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCVBFUlJPUgorCQkJCSAgICAoIldhaXQgb24gc3RhdGUgbWFjaGluZSBpbnRlcnJ1cHRlZCBieSBzaWduYWwuXG4iKTsKKwkJCQkqc3RhdHVzID0gTUVfU1RBVFVTX0lOVkFMSUQ7CisJCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQkJCWdvdG8gRVJST1I7CisJCQl9CisJCX0KKworCQkqc3RhdHVzID0gTUVfU1RBVFVTX0lETEU7CisKKwkJKnZhbHVlcyA9IG1lX2NpcmNfYnVmX3NwYWNlKCZpbnN0YW5jZS0+Y2lyY19idWYpOworCX0gZWxzZSB7CisJCVBFUlJPUigiSW52YWxpZCB3YWl0IGFyZ3VtZW50IHNwZWNpZmllZC5cbiIpOworCQkqc3RhdHVzID0gTUVfU1RBVFVTX0lOVkFMSUQ7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfV0FJVDsKKwkJZ290byBFUlJPUjsKKwl9CisKKyAgICAgIEVSUk9SOgorCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19zdHJlYW1fc3RvcChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgc3RvcF9tb2RlLCBpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoIWluc3RhbmNlLT5maWZvKSB7CisJCVBFUlJPUigiTm90IGEgc3RyZWFtaW5nIGFvLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCWlmIChzdG9wX21vZGUgPT0gTUVfU1RPUF9NT0RFX0lNTUVESUFURSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJdG1wIHw9CisJCSAgICBNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUCB8IE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUDsKKwkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwkJd2hpbGUgKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pIDsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJfSBlbHNlIGlmIChzdG9wX21vZGUgPT0gTUVfU1RPUF9NT0RFX0xBU1RfVkFMVUUpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCXRtcCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfU1RPUDsKKwkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwl9IGVsc2UgeworCQlQRVJST1IoIkludmFsaWQgc3RvcCBtb2RlIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NUT1BfTU9ERTsKKwkJZ290byBFUlJPUjsKKwl9CisKKyAgICAgIEVSUk9SOgorCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9hb19pb19zdHJlYW1fd3JpdGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICBpbnQgd3JpdGVfbW9kZSwKKwkJCQkgICAgIGludCAqdmFsdWVzLCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIHRtcDsKKwlpbnQgaTsKKwlpbnQgdmFsdWU7CisJaW50IGNudCA9ICpjb3VudDsKKwlpbnQgYzsKKwlpbnQgazsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFncyA9IDA7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKCFpbnN0YW5jZS0+ZmlmbykgeworCQlQRVJST1IoIk5vdCBhIHN0cmVhbWluZyBhby5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlpZiAoKmNvdW50IDw9IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNvdW50IG9mIHZhbHVlcyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9WQUxVRV9DT1VOVDsKKwkJZ290byBFUlJPUjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwlzd2l0Y2ggKHRtcCAmIDB4MykgeworCisJY2FzZSAxOgkJLy8gV3JhcGFyb3VuZCBtb2RlCisJCWlmIChpbnN0YW5jZS0+Ym9zY2hfZncpIHsJLy8gQm9zY2ggZmlybXdhcmUKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisKKwkJCWlmIChjbnQgIT0gNykgeworCQkJCVBFUlJPUgorCQkJCSAgICAoIkludmFsaWQgY291bnQgb2YgdmFsdWVzIHNwZWNpZmllZC4gNyBleHBlY3RlZC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfVkFMVUVfQ09VTlQ7CisJCQkJZ290byBFUlJPUjsKKwkJCX0KKworCQkJZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworCQkJCWlmIChnZXRfdXNlcih2YWx1ZSwgdmFsdWVzKSkgeworCQkJCQlQRVJST1IKKwkJCQkJICAgICgiQ2FuJ3QgY29weSB2YWx1ZSBmcm9tIHVzZXIgc3BhY2UuXG4iKTsKKwkJCQkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJCQkJCWdvdG8gRVJST1I7CisJCQkJfQorCisJCQkJaWYgKGkgPT0gMCkgeworCQkJCQkvKiBNYXhpbXVtIHZvbHRhZ2UgKi8KKwkJCQkJdmFsdWUgPDw9IDE2OworCQkJCQl2YWx1ZSB8PQorCQkJCQkgICAgaW5sKGluc3RhbmNlLT5yZWdfYmFzZSArCisJCQkJCQkweEQ0KSAmIDB4RkZGRjsKKwkJCQkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPnJlZ19iYXNlICsgMHhENCk7CisJCQkJfSBlbHNlIGlmIChpID09IDEpIHsKKwkJCQkJLyogTWluaW11bSB2b2x0YWdlICovCisJCQkJCXZhbHVlICY9IDB4RkZGRjsKKwkJCQkJdmFsdWUgfD0KKwkJCQkJICAgIGlubChpbnN0YW5jZS0+cmVnX2Jhc2UgKworCQkJCQkJMHhENCkgJiAweEZGRkYwMDAwOworCQkJCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+cmVnX2Jhc2UgKyAweEQ0KTsKKwkJCQl9IGVsc2UgaWYgKGkgPT0gMikgeworCQkJCQkvKiBEZWx0YSB1cCAqLworCQkJCQl2YWx1ZSA8PD0gMTY7CisJCQkJCXZhbHVlIHw9CisJCQkJCSAgICBpbmwoaW5zdGFuY2UtPnJlZ19iYXNlICsKKwkJCQkJCTB4RDgpICYgMHhGRkZGOworCQkJCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+cmVnX2Jhc2UgKyAweEQ4KTsKKwkJCQl9IGVsc2UgaWYgKGkgPT0gMykgeworCQkJCQkvKiBEZWx0YSBkb3duICovCisJCQkJCXZhbHVlICY9IDB4RkZGRjsKKwkJCQkJdmFsdWUgfD0KKwkJCQkJICAgIGlubChpbnN0YW5jZS0+cmVnX2Jhc2UgKworCQkJCQkJMHhEOCkgJiAweEZGRkYwMDAwOworCQkJCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+cmVnX2Jhc2UgKyAweEQ4KTsKKwkJCQl9IGVsc2UgaWYgKGkgPT0gNCkgeworCQkJCQkvKiBTdGFydCB2YWx1ZSAqLworCQkJCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+cmVnX2Jhc2UgKyAweERDKTsKKwkJCQl9IGVsc2UgaWYgKGkgPT0gNSkgeworCQkJCQkvKiBJbnZlcnQgKi8KKwkJCQkJaWYgKHZhbHVlKSB7CisJCQkJCQl2YWx1ZSA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJCQkJdmFsdWUgfD0gMHgxMDA7CisJCQkJCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJCQl9IGVsc2UgeworCQkJCQkJdmFsdWUgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCQkJCXZhbHVlICY9IH4weDEwMDsKKwkJCQkJCW91dGwodmFsdWUsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKGkgPT0gNikgeworCQkJCQkvKiBUaW1lciBmb3IgcG9zaXRpdmUgcmFtcCAqLworCQkJCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+cmVnX2Jhc2UgKyAweEUwKTsKKwkJCQl9CisKKwkJCQl2YWx1ZXMrKzsKKwkJCX0KKwkJfSBlbHNlIHsJLy8gTm9ybWFsIGZpcm13YXJlCisJCQlQREVCVUcoIldyaXRlIGZvciB3cmFwYXJvdW5kIG1vZGUuXG4iKTsKKworCQkJaWYgKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJgorCQkJICAgIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT4KKwkJCQkJCSAgICAgICBzdWJkZXZpY2VfbG9jaywKKwkJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQkJCVBFUlJPUgorCQkJCSAgICAoIlRoZXJlIGlzIGFscmVhZHkgYSBjb252ZXJzaW9uIHJ1bm5pbmcuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwkJCQlnb3RvIEVSUk9SOworCQkJfQorCisJCQl0bXAgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCQkJdG1wICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk87CisJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCXRtcCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk87CisKKwkJCWlmICgoKmNvdW50ID4gTUU0NjAwX0FPX0ZJRk9fQ09VTlQpIHx8CisJCQkgICAgKChpbnN0YW5jZS0+CisJCQkgICAgICBmbGFncyAmIE1FNDYwMF9BT19GTEFHU19TV19XUkFQX01PREVfTUFTSykgPT0KKwkJCSAgICAgTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV9GSU4pKSB7CisJCQkJdG1wICY9CisJCQkJICAgIH4oTUU0NjAwX0FPX0NUUkxfQklUX01PREVfMCB8CisJCQkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX01PREVfMSk7CisJCQkJdG1wIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9NT0RFXzE7CisJCQl9CisKKwkJCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKworCQkJaWYgKCgqY291bnQgPD0gTUU0NjAwX0FPX0ZJRk9fQ09VTlQpICYmCisJCQkgICAgKChpbnN0YW5jZS0+CisJCQkgICAgICBmbGFncyAmIE1FNDYwMF9BT19GTEFHU19TV19XUkFQX01PREVfTUFTSykgPT0KKwkJCSAgICAgTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV9JTkYpKSB7CisJCQkJZm9yIChpID0gMDsgaSA8ICpjb3VudDsgaSsrKSB7CisJCQkJCWlmIChnZXRfdXNlcih2YWx1ZSwgdmFsdWVzICsgaSkpIHsKKwkJCQkJCVBFUlJPUgorCQkJCQkJICAgICgiQ2Fubm90IGNvcHkgdmFsdWUgZnJvbSB1c2VyIHNwYWNlLlxuIik7CisJCQkJCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwkJCQkJCWdvdG8gRVJST1I7CisJCQkJCX0KKworCQkJCQlpZiAoaW5zdGFuY2UtPmFvX2lkeCAmIDB4MSkKKwkJCQkJCXZhbHVlIDw8PSAxNjsKKworCQkJCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoKCpjb3VudCA8PSBNRTQ2MDBfQU9fQ0lSQ19CVUZfQ09VTlQpICYmCisJCQkJICAgKChpbnN0YW5jZS0+CisJCQkJICAgICBmbGFncyAmIE1FNDYwMF9BT19GTEFHU19TV19XUkFQX01PREVfTUFTSykKKwkJCQkgICAgPT0gTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV9JTkYpKSB7CisJCQkJZm9yIChpID0gMDsgaSA8ICpjb3VudDsgaSsrKSB7CisJCQkJCWlmIChnZXRfdXNlcih2YWx1ZSwgdmFsdWVzICsgaSkpIHsKKwkJCQkJCVBFUlJPUgorCQkJCQkJICAgICgiQ2Fubm90IGNvcHkgdmFsdWUgZnJvbSB1c2VyIHNwYWNlLlxuIik7CisJCQkJCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwkJCQkJCWdvdG8gRVJST1I7CisJCQkJCX0KKworCQkJCQlpbnN0YW5jZS0+Y2lyY19idWYuYnVmW2ldID0gdmFsdWU7CS8qIFVzZWQgdG8gaG9sZCB0aGUgdmFsdWVzLiAqLworCQkJCX0KKworCQkJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsID0gMDsJLyogVXNlZCBhcyB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uLiAqLworCQkJCWluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkID0gKmNvdW50OwkvKiBVc2VkIGFzIHRoZSBidWZmZXIgc2l6ZS4gKi8KKworCQkJCS8qIFByZWxvYWQgdGhlIEZJRk8uICovCisKKwkJCQlmb3IgKGkgPSAwOyBpIDwgTUU0NjAwX0FPX0ZJRk9fQ09VTlQ7CisJCQkJICAgICBpKyssIGluc3RhbmNlLT5jaXJjX2J1Zi50YWlsKyspIHsKKwkJCQkJaWYgKGluc3RhbmNlLT5jaXJjX2J1Zi50YWlsID49CisJCQkJCSAgICBpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCkKKwkJCQkJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsID0gMDsKKworCQkJCQlpZiAoaW5zdGFuY2UtPmFvX2lkeCAmIDB4MSkKKwkJCQkJCW91dGwoaW5zdGFuY2UtPmNpcmNfYnVmLgorCQkJCQkJICAgICBidWZbaW5zdGFuY2UtPmNpcmNfYnVmLgorCQkJCQkJCSB0YWlsXSA8PCAxNiwKKwkJCQkJCSAgICAgaW5zdGFuY2UtPmZpZm9fcmVnKTsKKwkJCQkJZWxzZQorCQkJCQkJb3V0bChpbnN0YW5jZS0+Y2lyY19idWYuCisJCQkJCQkgICAgIGJ1ZltpbnN0YW5jZS0+Y2lyY19idWYuCisJCQkJCQkJIHRhaWxdLAorCQkJCQkJICAgICBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoKCpjb3VudCA8PSBNRTQ2MDBfQU9fQ0lSQ19CVUZfQ09VTlQpICYmCisJCQkJICAgKChpbnN0YW5jZS0+CisJCQkJICAgICBmbGFncyAmIE1FNDYwMF9BT19GTEFHU19TV19XUkFQX01PREVfTUFTSykKKwkJCQkgICAgPT0gTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV9GSU4pKSB7CisJCQkJdW5zaWduZWQgaW50IHByZWxvYWRfY291bnQ7CisKKwkJCQlmb3IgKGkgPSAwOyBpIDwgKmNvdW50OyBpKyspIHsKKwkJCQkJaWYgKGdldF91c2VyKHZhbHVlLCB2YWx1ZXMgKyBpKSkgeworCQkJCQkJUEVSUk9SCisJCQkJCQkgICAgKCJDYW5ub3QgY29weSB2YWx1ZSBmcm9tIHVzZXIgc3BhY2UuXG4iKTsKKwkJCQkJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCQkJCQkJZ290byBFUlJPUjsKKwkJCQkJfQorCisJCQkJCWluc3RhbmNlLT5jaXJjX2J1Zi5idWZbaV0gPSB2YWx1ZTsJLyogVXNlZCB0byBob2xkIHRoZSB2YWx1ZXMuICovCisJCQkJfQorCisJCQkJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgPSAwOwkvKiBVc2VkIGFzIHRoZSBjdXJyZW50IHJlYWQgcG9zaXRpb24uICovCisJCQkJaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQgPSAqY291bnQ7CS8qIFVzZWQgYXMgdGhlIGJ1ZmZlciBzaXplLiAqLworCisJCQkJLyogVHJ5IHRvIHByZWxvYWQgdGhlIHdob2xlIEZJRk8uICovCisJCQkJcHJlbG9hZF9jb3VudCA9IE1FNDYwMF9BT19GSUZPX0NPVU5UOworCisJCQkJaWYgKHByZWxvYWRfY291bnQgPiBpbnN0YW5jZS0+d3JhcF9jb3VudCkKKwkJCQkJcHJlbG9hZF9jb3VudCA9IGluc3RhbmNlLT53cmFwX2NvdW50OworCisJCQkJLyogUHJlbG9hZCB0aGUgRklGTy4gKi8KKwkJCQlmb3IgKGkgPSAwOyBpIDwgcHJlbG9hZF9jb3VudDsKKwkJCQkgICAgIGkrKywgaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwrKykgeworCQkJCQlpZiAoaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgPj0KKwkJCQkJICAgIGluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkKQorCQkJCQkJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgPSAwOworCisJCQkJCWlmIChpbnN0YW5jZS0+YW9faWR4ICYgMHgxKQorCQkJCQkJb3V0bChpbnN0YW5jZS0+Y2lyY19idWYuCisJCQkJCQkgICAgIGJ1ZltpbnN0YW5jZS0+Y2lyY19idWYuCisJCQkJCQkJIHRhaWxdIDw8IDE2LAorCQkJCQkJICAgICBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkJCQllbHNlCisJCQkJCQlvdXRsKGluc3RhbmNlLT5jaXJjX2J1Zi4KKwkJCQkJCSAgICAgYnVmW2luc3RhbmNlLT5jaXJjX2J1Zi4KKwkJCQkJCQkgdGFpbF0sCisJCQkJCQkgICAgIGluc3RhbmNlLT5maWZvX3JlZyk7CisJCQkJfQorCisJCQkJaW5zdGFuY2UtPndyYXBfcmVtYWluaW5nID0KKwkJCQkgICAgaW5zdGFuY2UtPndyYXBfY291bnQgLSBwcmVsb2FkX2NvdW50OworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IoIlRvIG1hbnkgdmFsdWVzIHdyaXR0ZW4uXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1ZBTFVFX0NPVU5UOworCQkJCWdvdG8gRVJST1I7CisJCQl9CisJCX0KKworCQlicmVhazsKKworCWNhc2UgMjoJCS8vIENvbnRpbnVvdXMgbW9kZQorCQkvKiBDaGVjayBpZiBpbiBTVyB3cmFwcm91bmQgbW9kZSAqLworCQlpZiAoaW5zdGFuY2UtPmZsYWdzICYgTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV9NQVNLKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCQkJUEVSUk9SKCJTdWJkZXZpY2UgaXMgY29uZmlndXJlZCBTVyB3cmFwcm91bmQgbW9kZS5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCQkJZ290byBFUlJPUjsKKwkJfQorCisJCXN3aXRjaCAod3JpdGVfbW9kZSkgeworCisJCWNhc2UgTUVfV1JJVEVfTU9ERV9CTE9DS0lORzoKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisKKwkJCVBERUJVRygiV3JpdGUgZm9yIGJsb2NraW5nIGNvbnRpbnVvdXMgbW9kZS5cbiIpOworCisJCQl3aGlsZSAoY250ID4gMCkgeworCQkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCQkgKGMgPQorCQkJCQkJCSAgbWVfY2lyY19idWZfc3BhY2VfdG9fZW5kCisJCQkJCQkJICAoJmluc3RhbmNlLT4KKwkJCQkJCQkgICBjaXJjX2J1ZikpKTsKKworCQkJCWlmIChpbnN0YW5jZS0+CisJCQkJICAgIGZsYWdzICYgTUU0NjAwX0FPX0ZMQUdTX0JST0tFTl9QSVBFKSB7CisJCQkJCVBFUlJPUgorCQkJCQkgICAgKCJCcm9rZW4gcGlwZSBpbiBibG9ja2luZyB3cml0ZS5cbiIpOworCQkJCQllcnIgPSBNRV9FUlJOT19TVUJERVZJQ0VfTk9UX1JVTk5JTkc7CisJCQkJCWdvdG8gRVJST1I7CisJCQkJfSBlbHNlIGlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCQlQRVJST1IKKwkJCQkJICAgICgiV2FpdCBmb3IgZnJlZSBidWZmZXIgaW50ZXJydXB0ZWQgZnJvbSBzaWduYWwuXG4iKTsKKwkJCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQkJCQlnb3RvIEVSUk9SOworCQkJCX0KKworCQkJCVBERUJVRygiU3BhY2UgdG8gZW5kID0gJWQuXG4iLCBjKTsKKworCQkJCS8qIE9ubHkgYWJsZSB0byB3cml0ZSBzaXplIG9mIGZyZWUgYnVmZmVyIG9yIHNpemUgb2YgY291bnQgKi8KKworCQkJCWlmIChjbnQgPCBjKQorCQkJCQljID0gY250OworCQkJCWsgPSBzaXplb2YoaW50KSAqIGM7CisJCQkJayAtPSBjb3B5X2Zyb21fdXNlcihpbnN0YW5jZS0+Y2lyY19idWYuYnVmICsKKwkJCQkJCSAgICBpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCwKKwkJCQkJCSAgICB2YWx1ZXMsIGspOworCQkJCWMgPSBrIC8gc2l6ZW9mKGludCk7CisKKwkJCQlQREVCVUcoIkNvcHkgJWQgdmFsdWVzIGZyb20gdXNlciBzcGFjZS5cbiIsIGMpOworCisJCQkJaWYgKCFjKSB7CisJCQkJCVBFUlJPUgorCQkJCQkgICAgKCJDYW5ub3QgY29weSB2YWx1ZXMgZnJvbSB1c2VyIHNwYWNlLlxuIik7CisJCQkJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCQkJCQlnb3RvIEVSUk9SOworCQkJCX0KKworCQkJCWluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkID0KKwkJCQkgICAgKGluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkICsKKwkJCQkgICAgIGMpICYgKGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrKTsKKworCQkJCXZhbHVlcyArPSBjOworCQkJCWNudCAtPSBjOworCQkJCXJldCArPSBjOworCisJCQkJLyogVmFsdWVzIGFyZSBub3cgYXZhaWxhYmxlIHNvIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJCSAgY3B1X2ZsYWdzKTsKKworCQkJCWlmIChtZV9jaXJjX2J1Zl9zcGFjZSgmaW5zdGFuY2UtPmNpcmNfYnVmKSkgeworCQkJCQl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCQkJdG1wIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQkJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCQl9CisKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+CisJCQkJCQkgICAgICAgc3ViZGV2aWNlX2xvY2ssCisJCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKwkJCX0KKworCQkJKmNvdW50ID0gcmV0OworCisJCQlicmVhazsKKworCQljYXNlIE1FX1dSSVRFX01PREVfTk9OQkxPQ0tJTkc6CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCisJCQlQREVCVUcoIldyaXRlIGZvciBub24gYmxvY2tpbmcgY29udGludW91cyBtb2RlLlxuIik7CisKKwkJCXdoaWxlIChjbnQgPiAwKSB7CisJCQkJaWYgKGluc3RhbmNlLT4KKwkJCQkgICAgZmxhZ3MgJiBNRTQ2MDBfQU9fRkxBR1NfQlJPS0VOX1BJUEUpIHsKKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIk1FNDYwMDpCcm9rZW4gcGlwZSBpbiBub25ibG9ja2luZyB3cml0ZS5cbiIpOworCQkJCQllcnIgPSBNRV9FUlJOT19TVUJERVZJQ0VfTk9UX1JVTk5JTkc7CisJCQkJCWdvdG8gRVJST1I7CisJCQkJfQorCisJCQkJYyA9IG1lX2NpcmNfYnVmX3NwYWNlX3RvX2VuZCgmaW5zdGFuY2UtPgorCQkJCQkJCSAgICAgY2lyY19idWYpOworCisJCQkJaWYgKCFjKSB7CisJCQkJCVBERUJVRworCQkJCQkgICAgKCJSZXR1cm5pbmcgZnJvbSBub25ibG9ja2luZyB3cml0ZS5cbiIpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlQREVCVUcoIlNwYWNlIHRvIGVuZCA9ICVkLlxuIiwgYyk7CisKKwkJCQkvKiBPbmx5IGFibGUgdG8gd3JpdGUgc2l6ZSBvZiBmcmVlIGJ1ZmZlciBvciBzaXplIG9mIGNvdW50ICovCisKKwkJCQlpZiAoY250IDwgYykKKwkJCQkJYyA9IGNudDsKKwkJCQlrID0gc2l6ZW9mKGludCkgKiBjOworCQkJCWsgLT0gY29weV9mcm9tX3VzZXIoaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZiArCisJCQkJCQkgICAgaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQsCisJCQkJCQkgICAgdmFsdWVzLCBrKTsKKwkJCQljID0gayAvIHNpemVvZihpbnQpOworCisJCQkJUERFQlVHKCJDb3B5ICVkIHZhbHVlcyBmcm9tIHVzZXIgc3BhY2UuXG4iLCBjKTsKKworCQkJCWlmICghYykgeworCQkJCQlQRVJST1IKKwkJCQkJICAgICgiQ2Fubm90IGNvcHkgdmFsdWVzIGZyb20gdXNlciBzcGFjZS5cbiIpOworCQkJCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwkJCQkJZ290byBFUlJPUjsKKwkJCQl9CisKKwkJCQlpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCA9CisJCQkJICAgIChpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCArCisJCQkJICAgICBjKSAmIChpbnN0YW5jZS0+Y2lyY19idWYubWFzayk7CisKKwkJCQl2YWx1ZXMgKz0gYzsKKwkJCQljbnQgLT0gYzsKKwkJCQlyZXQgKz0gYzsKKworCQkJCS8qIFZhbHVlcyBhcmUgbm93IGF2YWlsYWJsZSBzbyBlbmFibGUgaW50ZXJydXB0cyAqLworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCQkgIGNwdV9mbGFncyk7CisKKwkJCQlpZiAobWVfY2lyY19idWZfc3BhY2UoJmluc3RhbmNlLT5jaXJjX2J1ZikpIHsKKwkJCQkJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkJCXRtcCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkJfQorCisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPgorCQkJCQkJICAgICAgIHN1YmRldmljZV9sb2NrLAorCQkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCQl9CisKKwkJCSpjb3VudCA9IHJldDsKKworCQkJYnJlYWs7CisKKwkJY2FzZSBNRV9XUklURV9NT0RFX1BSRUxPQUQ6CisJCQlQREVCVUcoIldyaXRlIGZvciBwcmVsb2FkIGNvbnRpbnVvdXMgbW9kZS5cbiIpOworCisJCQlpZiAoKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJgorCQkJICAgICBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPgorCQkJCQkJICAgICAgIHN1YmRldmljZV9sb2NrLAorCQkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCQkJUEVSUk9SCisJCQkJICAgICgiQ2FuJ3QgUHJlbG9hZCBEQUMgRklGTyB3aGlsZSBjb252ZXJzaW9uIGlzIHJ1bm5pbmcuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwkJCQlnb3RvIEVSUk9SOworCQkJfQorCisJCQl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCQkJdG1wIHw9CisJCQkgICAgTUU0NjAwX0FPX0NUUkxfQklUX1NUT1AgfAorCQkJICAgIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUDsKKwkJCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJdG1wICY9CisJCQkgICAgfihNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk8gfAorCQkJICAgICAgTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlEpOworCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQl0bXAgfD0gTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9GSUZPOworCQkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwkJCWluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkID0gMDsKKwkJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsID0gMDsKKwkJCWluc3RhbmNlLT5mbGFncyAmPSB+TUU0NjAwX0FPX0ZMQUdTX0JST0tFTl9QSVBFOworCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCisJCQljID0gTUU0NjAwX0FPX0ZJRk9fQ09VTlQ7CisKKwkJCWlmIChjbnQgPCBjKQorCQkJCWMgPSBjbnQ7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBjOyBpKyspIHsKKwkJCQlpZiAoZ2V0X3VzZXIodmFsdWUsIHZhbHVlcykpIHsKKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIkNhbid0IGNvcHkgdmFsdWUgZnJvbSB1c2VyIHNwYWNlLlxuIik7CisJCQkJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCQkJCQlnb3RvIEVSUk9SOworCQkJCX0KKworCQkJCWlmIChpbnN0YW5jZS0+YW9faWR4ICYgMHgxKQorCQkJCQl2YWx1ZSA8PD0gMTY7CisKKwkJCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+Zmlmb19yZWcpOworCisJCQkJdmFsdWVzKys7CisJCQl9CisKKwkJCWNudCAtPSBjOworCisJCQlyZXQgKz0gYzsKKworCQkJUERFQlVHKCJXcm90ZSAlZCB2YWx1ZXMgdG8gZmlmby5cbiIsIGMpOworCisJCQl3aGlsZSAoMSkgeworCQkJCWMgPSBtZV9jaXJjX2J1Zl9zcGFjZV90b19lbmQoJmluc3RhbmNlLT4KKwkJCQkJCQkgICAgIGNpcmNfYnVmKTsKKworCQkJCWlmIChjID09IDApCisJCQkJCWJyZWFrOworCisJCQkJaWYgKGNudCA8IGMpCisJCQkJCWMgPSBjbnQ7CisKKwkJCQlpZiAoYyA8PSAwKQorCQkJCQlicmVhazsKKworCQkJCWsgPSBzaXplb2YoaW50KSAqIGM7CisKKwkJCQlrIC09IGNvcHlfZnJvbV91c2VyKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYgKworCQkJCQkJICAgIGluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkLAorCQkJCQkJICAgIHZhbHVlcywgayk7CisKKwkJCQljID0gayAvIHNpemVvZihpbnQpOworCisJCQkJUERFQlVHKCJXcm90ZSAlZCB2YWx1ZXMgdG8gY2lyY3VsYXIgYnVmZmVyLlxuIiwKKwkJCQkgICAgICAgYyk7CisKKwkJCQlpZiAoIWMpIHsKKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIkNhbid0IGNvcHkgdmFsdWVzIGZyb20gdXNlciBzcGFjZS5cbiIpOworCQkJCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwkJCQkJZ290byBFUlJPUjsKKwkJCQl9CisKKwkJCQlpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCA9CisJCQkJICAgIChpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCArCisJCQkJICAgICBjKSAmIChpbnN0YW5jZS0+Y2lyY19idWYubWFzayk7CisKKwkJCQl2YWx1ZXMgKz0gYzsKKwkJCQljbnQgLT0gYzsKKwkJCQlyZXQgKz0gYzsKKwkJCX0KKworCQkJKmNvdW50ID0gcmV0OworCisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKworCQkJUEVSUk9SKCJJbnZhbGlkIHdyaXRlIG1vZGUgc3BlY2lmaWVkLlxuIik7CisKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfV1JJVEVfTU9ERTsKKworCQkJZ290byBFUlJPUjsKKwkJfQorCisJCWJyZWFrOworCisJZGVmYXVsdDoJCS8vIFNpbmdsZSBtb2RlIG9mIGludmFsaWQKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQlQRVJST1IoIlN1YmRldmljZSBpcyBjb25maWd1cmVkIGluIHNpbmdsZSBtb2RlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwkJZ290byBFUlJPUjsKKwl9CisKKyAgICAgIEVSUk9SOgorCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDE5KQorc3RhdGljIGlycXJldHVybl90IG1lNDYwMF9hb19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQorI2Vsc2UKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTQ2MDBfYW9faXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCisjZW5kaWYKK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKwlpbnQgdmFsdWU7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZSA9IGRldl9pZDsKKwlpbnQgaTsKKwlpbnQgYyA9IDA7CisJaW50IGMxID0gMDsKKworCWlmIChpcnEgIT0gaW5zdGFuY2UtPmlycSkgeworCQlQREVCVUcoIkluY29ycmVjdCBpbnRlcnJ1cHQgbnVtOiAlZC5cbiIsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpZiAoISgoMHgxIDw8IChpbnN0YW5jZS0+YW9faWR4ICsgMykpICYgaW5sKGluc3RhbmNlLT5pcnFfc3RhdHVzX3JlZykpKSB7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwl0bXAgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpOworCisJaWYgKCEodG1wICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRUYpICYmCisJICAgICh0bXAgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9IRikgJiYKKwkgICAgKHRtcCAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0hGKSkgeworCQljID0gTUU0NjAwX0FPX0ZJRk9fQ09VTlQ7CisJCVBERUJVRygiRmlmbyBlbXB0eS5cbiIpOworCX0gZWxzZSBpZiAoKHRtcCAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0VGKSAmJgorCQkgICAodG1wICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfSEYpICYmCisJCSAgICh0bXAgJiBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9IRikpIHsKKwkJYyA9IE1FNDYwMF9BT19GSUZPX0NPVU5UIC8gMjsKKwkJUERFQlVHKCJGaWZvIHVuZGVyIGhhbGYgZnVsbC5cbiIpOworCX0gZWxzZSB7CisJCWMgPSAwOworCQlQREVCVUcoIkZpZm8gZnVsbC5cbiIpOworCX0KKworCVBERUJVRygiVHJ5IHRvIHdyaXRlIDB4JTA0WCB2YWx1ZXMuXG4iLCBjKTsKKworCWlmICgoaW5zdGFuY2UtPmZsYWdzICYgTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV9NQVNLKSA9PQorCSAgICBNRTQ2MDBfQU9fRkxBR1NfU1dfV1JBUF9NT0RFX0lORikgeworCQl3aGlsZSAoYykgeworCQkJYzEgPSBjOworCisJCQlpZiAoYzEgPiAoaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQgLSBpbnN0YW5jZS0+Y2lyY19idWYudGFpbCkpCS8qIE9ubHkgdXAgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyICovCisJCQkJYzEgPSAoaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQgLQorCQkJCSAgICAgIGluc3RhbmNlLT5jaXJjX2J1Zi50YWlsKTsKKworCQkJLyogV3JpdGUgdGhlIHZhbHVlcyB0byB0aGUgRklGTyAqLworCQkJZm9yIChpID0gMDsgaSA8IGMxOyBpKyssIGluc3RhbmNlLT5jaXJjX2J1Zi50YWlsKyssIGMtLSkgeworCQkJCWlmIChpbnN0YW5jZS0+YW9faWR4ICYgMHgxKQorCQkJCQlvdXRsKGluc3RhbmNlLT5jaXJjX2J1Zi4KKwkJCQkJICAgICBidWZbaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWxdIDw8IDE2LAorCQkJCQkgICAgIGluc3RhbmNlLT5maWZvX3JlZyk7CisJCQkJZWxzZQorCQkJCQlvdXRsKGluc3RhbmNlLT5jaXJjX2J1Zi4KKwkJCQkJICAgICBidWZbaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWxdLAorCQkJCQkgICAgIGluc3RhbmNlLT5maWZvX3JlZyk7CisJCQl9CisKKwkJCWlmIChpbnN0YW5jZS0+Y2lyY19idWYudGFpbCA+PSBpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCkJLyogU3RhcnQgZnJvbSBiZWdpbm5pbmcgKi8KKwkJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCA9IDA7CisJCX0KKworCQlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwkJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCXRtcCB8PSBNRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJROworCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJdG1wICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJROworCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCQlpZiAoIShpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkgeworCQkJUEVSUk9SKCJCcm9rZW4gcGlwZS5cbiIpOworCQkJaW5zdGFuY2UtPmZsYWdzIHw9IE1FNDYwMF9BT19GTEFHU19CUk9LRU5fUElQRTsKKwkJCXRtcCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJfQorCisJCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCX0gZWxzZSBpZiAoKGluc3RhbmNlLT5mbGFncyAmIE1FNDYwMF9BT19GTEFHU19TV19XUkFQX01PREVfTUFTSykgPT0KKwkJICAgTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV9GSU4pIHsKKwkJd2hpbGUgKGMgJiYgaW5zdGFuY2UtPndyYXBfcmVtYWluaW5nKSB7CisJCQljMSA9IGM7CisKKwkJCWlmIChjMSA+IChpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCAtIGluc3RhbmNlLT5jaXJjX2J1Zi50YWlsKSkJLyogT25seSB1cCB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIgKi8KKwkJCQljMSA9IChpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCAtCisJCQkJICAgICAgaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwpOworCisJCQlpZiAoYzEgPiBpbnN0YW5jZS0+d3JhcF9yZW1haW5pbmcpCS8qIE9ubHkgdXAgdG8gY291bnQgb2YgdXNlciBkZWZpbmVkIG51bWJlciBvZiB2YWx1ZXMgKi8KKwkJCQljMSA9IGluc3RhbmNlLT53cmFwX3JlbWFpbmluZzsKKworCQkJLyogV3JpdGUgdGhlIHZhbHVlcyB0byB0aGUgRklGTyAqLworCQkJZm9yIChpID0gMDsgaSA8IGMxOworCQkJICAgICBpKyssIGluc3RhbmNlLT5jaXJjX2J1Zi50YWlsKyssIGMtLSwKKwkJCSAgICAgaW5zdGFuY2UtPndyYXBfcmVtYWluaW5nLS0pIHsKKwkJCQlpZiAoaW5zdGFuY2UtPmFvX2lkeCAmIDB4MSkKKwkJCQkJb3V0bChpbnN0YW5jZS0+Y2lyY19idWYuCisJCQkJCSAgICAgYnVmW2luc3RhbmNlLT5jaXJjX2J1Zi50YWlsXSA8PCAxNiwKKwkJCQkJICAgICBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkJCWVsc2UKKwkJCQkJb3V0bChpbnN0YW5jZS0+Y2lyY19idWYuCisJCQkJCSAgICAgYnVmW2luc3RhbmNlLT5jaXJjX2J1Zi50YWlsXSwKKwkJCQkJICAgICBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkJfQorCisJCQlpZiAoaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgPj0gaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQpCS8qIFN0YXJ0IGZyb20gYmVnaW5uaW5nICovCisJCQkJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgPSAwOworCQl9CisKKwkJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJCXRtcCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCisJCWlmICghaW5zdGFuY2UtPndyYXBfcmVtYWluaW5nKSB7CisJCQlQREVCVUcoIkZpbml0ZSBTVyB3cmFwYXJvdW5kIGRvbmUuXG4iKTsKKwkJCXRtcCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCX0KKworCQl0bXAgfD0gTUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKworCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJdG1wICY9IH5NRTQ2MDBfQU9fQ1RSTF9CSVRfUkVTRVRfSVJROworCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKworCQlpZiAoIShpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYgTUU0NjAwX0FPX1NUQVRVU19CSVRfRlNNKSkgeworCQkJUEVSUk9SKCJCcm9rZW4gcGlwZS5cbiIpOworCQkJaW5zdGFuY2UtPmZsYWdzIHw9IE1FNDYwMF9BT19GTEFHU19CUk9LRU5fUElQRTsKKwkJCXRtcCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJfQorCisJCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJfSBlbHNlIHsJCS8qIFJlZ3VsYXIgY29udGludW91cyBtb2RlICovCisKKwkJd2hpbGUgKDEpIHsKKwkJCWMxID0gbWVfY2lyY19idWZfdmFsdWVzX3RvX2VuZCgmaW5zdGFuY2UtPmNpcmNfYnVmKTsKKwkJCVBERUJVRygiVmFsdWVzIHRvIGVuZCA9ICVkLlxuIiwgYzEpOworCisJCQlpZiAoYzEgPiBjKQorCQkJCWMxID0gYzsKKworCQkJaWYgKGMxIDw9IDApIHsKKwkJCQlQREVCVUcoIldvcmsgZG9uZSBvciBidWZmZXIgZW1wdHkuXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKGluc3RhbmNlLT5hb19pZHggJiAweDEpIHsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgYzE7IGkrKykgeworCQkJCQl2YWx1ZSA9CisJCQkJCSAgICAqKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYgKworCQkJCQkgICAgICBpbnN0YW5jZS0+Y2lyY19idWYudGFpbCArCisJCQkJCSAgICAgIGkpIDw8IDE2OworCQkJCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCW91dHNsKGluc3RhbmNlLT5maWZvX3JlZywKKwkJCQkgICAgICBpbnN0YW5jZS0+Y2lyY19idWYuYnVmICsKKwkJCQkgICAgICBpbnN0YW5jZS0+Y2lyY19idWYudGFpbCwgYzEpOworCisJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCA9CisJCQkgICAgKGluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICsKKwkJCSAgICAgYzEpICYgKGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrKTsKKworCQkJUERFQlVHKCIlZCB2YWx1ZXMgd3JvdGUgdG8gcG9ydCAweCUwNFguXG4iLCBjMSwKKwkJCSAgICAgICBpbnN0YW5jZS0+Zmlmb19yZWcpOworCisJCQljIC09IGMxOworCQl9CisKKwkJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJCXRtcCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCisJCWlmICghbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpKSB7CisJCQlQREVCVUcKKwkJCSAgICAoIkRpc2FibGUgSW50ZXJydXB0IGJlY2F1c2Ugbm8gdmFsdWVzIGxlZnQgaW4gYnVmZmVyLlxuIik7CisJCQl0bXAgJj0gfk1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQl9CisKKwkJdG1wIHw9IE1FNDYwMF9BT19DVFJMX0JJVF9SRVNFVF9JUlE7CisKKwkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCXRtcCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUTsKKwkJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisKKwkJaWYgKCEoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNDYwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsKKwkJCVBERUJVRygiQnJva2VuIHBpcGUgaW4gbWU0NjAwX2FvX2lzci5cbiIpOworCQkJaW5zdGFuY2UtPmZsYWdzIHw9IE1FNDYwMF9BT19GTEFHU19CUk9LRU5fUElQRTsKKwkJCXRtcCAmPSB+TUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJfQorCisJCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgbWU0NjAwX2FvX2Rlc3RydWN0b3Ioc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlKQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJZnJlZV9pcnEoaW5zdGFuY2UtPmlycSwgaW5zdGFuY2UpOworCWtmcmVlKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYpOworCW1lX3N1YmRldmljZV9kZWluaXQoJmluc3RhbmNlLT5iYXNlKTsKKwlrZnJlZShpbnN0YW5jZSk7Cit9CisKK21lNDYwMF9hb19zdWJkZXZpY2VfdCAqbWU0NjAwX2FvX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgIHNwaW5sb2NrX3QgKiBwcmVsb2FkX3JlZ19sb2NrLAorCQkJCQkgICAgIHVpbnQzMl90ICogcHJlbG9hZF9mbGFncywKKwkJCQkJICAgICBpbnQgYW9faWR4LCBpbnQgZmlmbywgaW50IGlycSkKK3sKKwltZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwlpbnQgZXJyOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UgKi8KKwlzdWJkZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTQ2MDBfYW9fc3ViZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghc3ViZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc3ViZGV2aWNlLCAwLCBzaXplb2YobWU0NjAwX2FvX3N1YmRldmljZV90KSk7CisKKwkvKiBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzICovCisJZXJyID0gbWVfc3ViZGV2aWNlX2luaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlzdWJkZXZpY2UtPnByZWxvYWRfcmVnX2xvY2sgPSBwcmVsb2FkX3JlZ19sb2NrOworCXN1YmRldmljZS0+cHJlbG9hZF9mbGFncyA9IHByZWxvYWRfZmxhZ3M7CisKKwkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBjaXJjdWxhciBidWZmZXIgKi8KKwlzdWJkZXZpY2UtPmNpcmNfYnVmLm1hc2sgPSBNRTQ2MDBfQU9fQ0lSQ19CVUZfQ09VTlQgLSAxOworCXN1YmRldmljZS0+Y2lyY19idWYuYnVmID0ga21hbGxvYyhNRTQ2MDBfQU9fQ0lSQ19CVUZfU0laRSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXN1YmRldmljZS0+Y2lyY19idWYuYnVmKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJbWVfc3ViZGV2aWNlX2RlaW5pdCgobWVfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZS0+Y2lyY19idWYuYnVmLCAwLCBNRTQ2MDBfQU9fQ0lSQ19CVUZfU0laRSk7CisKKwlzdWJkZXZpY2UtPmNpcmNfYnVmLmhlYWQgPSAwOworCXN1YmRldmljZS0+Y2lyY19idWYudGFpbCA9IDA7CisKKwkvKiBJbml0aWFsaXplIHdhaXQgcXVldWUgKi8KKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzdWJkZXZpY2UtPndhaXRfcXVldWUpOworCisJLyogSW5pdGlhbGl6ZSBzaW5nbGUgdmFsdWUgdG8gMFYgKi8KKwlzdWJkZXZpY2UtPnNpbmdsZV92YWx1ZSA9IDB4ODAwMDsKKworCS8qIFN0b3JlIGFuYWxvZyBvdXRwdXQgaW5kZXggKi8KKwlzdWJkZXZpY2UtPmFvX2lkeCA9IGFvX2lkeDsKKworCS8qIFN0b3JlIGlmIGFuYWxvZyBvdXRwdXQgaGFzIGZpZm8gKi8KKwlzdWJkZXZpY2UtPmZpZm8gPSBmaWZvOworCisJLyogSW5pdGlhbGl6ZSByZWdpc3RlcnMgKi8KKworCWlmIChhb19pZHggPT0gMCkgeworCQlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDBfQ1RSTF9SRUc7CisJCXN1YmRldmljZS0+c3RhdHVzX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAwX1NUQVRVU19SRUc7CisJCXN1YmRldmljZS0+Zmlmb19yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMF9GSUZPX1JFRzsKKwkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDBfU0lOR0xFX1JFRzsKKwkJc3ViZGV2aWNlLT50aW1lcl9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMF9USU1FUl9SRUc7CisJCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKworCQlpZiAoaW5sKHN1YmRldmljZS0+cmVnX2Jhc2UgKyBNRTQ2MDBfQU9fQk9TQ0hfUkVHKSA9PSAweDIwMDAwKSB7CisJCQlQSU5GTygiQm9zY2ggZmlybXdhcmUgaW4gdXNlIGZvciBjaGFubmVsIDAuXG4iKTsKKwkJCXN1YmRldmljZS0+Ym9zY2hfZncgPSAxOworCQl9IGVsc2UgeworCQkJc3ViZGV2aWNlLT5ib3NjaF9mdyA9IDA7CisJCX0KKwl9IGVsc2UgaWYgKGFvX2lkeCA9PSAxKSB7CisJCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMV9DVFJMX1JFRzsKKwkJc3ViZGV2aWNlLT5zdGF0dXNfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDFfU1RBVFVTX1JFRzsKKwkJc3ViZGV2aWNlLT5maWZvX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAxX0ZJRk9fUkVHOworCQlzdWJkZXZpY2UtPnNpbmdsZV9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMV9TSU5HTEVfUkVHOworCQlzdWJkZXZpY2UtPnRpbWVyX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAxX1RJTUVSX1JFRzsKKwkJc3ViZGV2aWNlLT5yZWdfYmFzZSA9IHJlZ19iYXNlOworCQlzdWJkZXZpY2UtPmJvc2NoX2Z3ID0gMDsKKwl9IGVsc2UgaWYgKGFvX2lkeCA9PSAyKSB7CisJCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMl9DVFJMX1JFRzsKKwkJc3ViZGV2aWNlLT5zdGF0dXNfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDJfU1RBVFVTX1JFRzsKKwkJc3ViZGV2aWNlLT5maWZvX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAyX0ZJRk9fUkVHOworCQlzdWJkZXZpY2UtPnNpbmdsZV9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wMl9TSU5HTEVfUkVHOworCQlzdWJkZXZpY2UtPnRpbWVyX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAyX1RJTUVSX1JFRzsKKwkJc3ViZGV2aWNlLT5yZWdfYmFzZSA9IHJlZ19iYXNlOworCQlzdWJkZXZpY2UtPmJvc2NoX2Z3ID0gMDsKKwl9IGVsc2UgeworCQlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDNfQ1RSTF9SRUc7CisJCXN1YmRldmljZS0+c3RhdHVzX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FPXzAzX1NUQVRVU19SRUc7CisJCXN1YmRldmljZS0+Zmlmb19yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wM19GSUZPX1JFRzsKKwkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfQU9fMDNfU0lOR0xFX1JFRzsKKwkJc3ViZGV2aWNlLT50aW1lcl9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT18wM19USU1FUl9SRUc7CisJCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKwkJc3ViZGV2aWNlLT5ib3NjaF9mdyA9IDA7CisJfQorCisJc3ViZGV2aWNlLT5pcnFfc3RhdHVzX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0lSUV9TVEFUVVNfUkVHOworCXN1YmRldmljZS0+cHJlbG9hZF9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9BT19MT0FEU0VUUkVHX1hYOworCisJLyogUmVnaXN0ZXIgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSAqLworCXN1YmRldmljZS0+aXJxID0gaXJxOworCisJaWYgKHJlcXVlc3RfaXJxCisJICAgIChzdWJkZXZpY2UtPmlycSwgbWU0NjAwX2FvX2lzciwgU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEsCisJICAgICBNRTQ2MDBfTkFNRSwgc3ViZGV2aWNlKSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgaW50ZXJydXB0IGxpbmUuXG4iKTsKKwkJbWVfc3ViZGV2aWNlX2RlaW5pdCgobWVfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlKTsKKwkJa2ZyZWUoc3ViZGV2aWNlLT5jaXJjX2J1Zi5idWYpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBPdmVycmlkZSBiYXNlIGNsYXNzIG1ldGhvZHMuICovCisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9kZXN0cnVjdG9yID0gbWU0NjAwX2FvX2Rlc3RydWN0b3I7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19yZXNldF9zdWJkZXZpY2UgPQorCSAgICBtZTQ2MDBfYW9faW9fcmVzZXRfc3ViZGV2aWNlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX2NvbmZpZyA9CisJICAgIG1lNDYwMF9hb19pb19zaW5nbGVfY29uZmlnOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3JlYWQgPSBtZTQ2MDBfYW9faW9fc2luZ2xlX3JlYWQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfd3JpdGUgPQorCSAgICBtZTQ2MDBfYW9faW9fc2luZ2xlX3dyaXRlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX2NvbmZpZyA9CisJICAgIG1lNDYwMF9hb19pb19zdHJlYW1fY29uZmlnOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX25ld192YWx1ZXMgPQorCSAgICBtZTQ2MDBfYW9faW9fc3RyZWFtX25ld192YWx1ZXM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zdHJlYW1fd3JpdGUgPQorCSAgICBtZTQ2MDBfYW9faW9fc3RyZWFtX3dyaXRlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3N0YXJ0ID0KKwkgICAgbWU0NjAwX2FvX2lvX3N0cmVhbV9zdGFydDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdGF0dXMgPQorCSAgICBtZTQ2MDBfYW9faW9fc3RyZWFtX3N0YXR1czsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdG9wID0gbWU0NjAwX2FvX2lvX3N0cmVhbV9zdG9wOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWU0NjAwX2FvX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWU0NjAwX2FvX3F1ZXJ5X3N1YmRldmljZV90eXBlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHMgPQorCSAgICBtZTQ2MDBfYW9fcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzID0KKwkgICAgbWU0NjAwX2FvX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3M7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9yYW5nZV9ieV9taW5fbWF4ID0KKwkgICAgbWU0NjAwX2FvX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXg7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfcmFuZ2VzID0KKwkgICAgbWU0NjAwX2FvX3F1ZXJ5X251bWJlcl9yYW5nZXM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9yYW5nZV9pbmZvID0KKwkgICAgbWU0NjAwX2FvX3F1ZXJ5X3JhbmdlX2luZm87CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV90aW1lciA9IG1lNDYwMF9hb19xdWVyeV90aW1lcjsKKworCXJldHVybiBzdWJkZXZpY2U7Cit9CisKKyNlbmRpZiAvLyBCT1NDSAorCisvKiBDb21tb24gZnVuY3Rpb25zCisqLworCitzdGF0aWMgaW50IG1lNDYwMF9hb19xdWVyeV9yYW5nZV9ieV9taW5fbWF4KG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICAgaW50IHVuaXQsCisJCQkJCSAgICBpbnQgKm1pbiwKKwkJCQkJICAgIGludCAqbWF4LCBpbnQgKm1heGRhdGEsIGludCAqcmFuZ2UpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKCgqbWF4IC0gKm1pbikgPCAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfTUlOX01BWDsKKwl9CisKKwlpZiAoKHVuaXQgPT0gTUVfVU5JVF9WT0xUKSB8fCAodW5pdCA9PSBNRV9VTklUX0FOWSkpIHsKKwkJaWYgKCgqbWF4IDw9IChNRTQ2MDBfQU9fTUFYX1JBTkdFICsgMTAwMCkpCisJCSAgICAmJiAoKm1pbiA+PSBNRTQ2MDBfQU9fTUlOX1JBTkdFKSkgeworCQkJKm1pbiA9IE1FNDYwMF9BT19NSU5fUkFOR0U7CisJCQkqbWF4ID0gTUU0NjAwX0FPX01BWF9SQU5HRTsKKwkJCSptYXhkYXRhID0gTUU0NjAwX0FPX01BWF9EQVRBOworCQkJKnJhbmdlID0gMDsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiTm8gbWF0Y2hpbmcgcmFuZ2UgYXZhaWxhYmxlLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fTk9fUkFOR0U7CisJCX0KKwl9IGVsc2UgeworCQlQRVJST1IoIkludmFsaWQgcGh5c2ljYWwgdW5pdCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVU5JVDsKKwl9CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYW9fcXVlcnlfbnVtYmVyX3JhbmdlcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJIGludCB1bml0LCBpbnQgKmNvdW50KQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmICgodW5pdCA9PSBNRV9VTklUX1ZPTFQpIHx8ICh1bml0ID09IE1FX1VOSVRfQU5ZKSkgeworCQkqY291bnQgPSAxOworCX0gZWxzZSB7CisJCSpjb3VudCA9IDA7CisJfQorCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX3F1ZXJ5X3JhbmdlX2luZm8obWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgaW50IHJhbmdlLAorCQkJCSAgICAgIGludCAqdW5pdCwKKwkJCQkgICAgICBpbnQgKm1pbiwgaW50ICptYXgsIGludCAqbWF4ZGF0YSkKK3sKKwltZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAocmFuZ2UgPT0gMCkgeworCQkqdW5pdCA9IE1FX1VOSVRfVk9MVDsKKwkJKm1pbiA9IE1FNDYwMF9BT19NSU5fUkFOR0U7CisJCSptYXggPSBNRTQ2MDBfQU9fTUFYX1JBTkdFOworCQkqbWF4ZGF0YSA9IE1FNDYwMF9BT19NQVhfREFUQTsKKwl9IGVsc2UgeworCQlQRVJST1IoIkludmFsaWQgcmFuZ2UgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SQU5HRTsKKwl9CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTQ2MDBfYW9fcXVlcnlfdGltZXIobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJIGludCB0aW1lciwKKwkJCQkgaW50ICpiYXNlX2ZyZXF1ZW5jeSwKKwkJCQkgbG9uZyBsb25nICptaW5fdGlja3MsIGxvbmcgbG9uZyAqbWF4X3RpY2tzKQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmICgodGltZXIgIT0gTUVfVElNRVJfQUNRX1NUQVJUKSAmJiAodGltZXIgIT0gTUVfVElNRVJfQ09OVl9TVEFSVCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRpbWVyIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9USU1FUjsKKwl9CisKKwlpZiAoaW5zdGFuY2UtPmZpZm8pIHsJLy9TdHJlYW1pbmcgZGV2aWNlLgorCQkqYmFzZV9mcmVxdWVuY3kgPSBNRTQ2MDBfQU9fQkFTRV9GUkVRVUVOQ1k7CisJCWlmICh0aW1lciA9PSBNRV9USU1FUl9BQ1FfU1RBUlQpIHsKKwkJCSptaW5fdGlja3MgPSBNRTQ2MDBfQU9fTUlOX0FDUV9USUNLUzsKKwkJCSptYXhfdGlja3MgPSBNRTQ2MDBfQU9fTUFYX0FDUV9USUNLUzsKKwkJfSBlbHNlIGlmICh0aW1lciA9PSBNRV9USU1FUl9DT05WX1NUQVJUKSB7CisJCQkqbWluX3RpY2tzID0gTUU0NjAwX0FPX01JTl9DSEFOX1RJQ0tTOworCQkJKm1heF90aWNrcyA9IE1FNDYwMF9BT19NQVhfQ0hBTl9USUNLUzsKKwkJfQorCX0gZWxzZSB7CQkvL05vdCBzdHJlYW1pbmcgZGV2aWNlIQorCQkqYmFzZV9mcmVxdWVuY3kgPSAwOworCQkqbWluX3RpY2tzID0gMDsKKwkJKm1heF90aWNrcyA9IDA7CisJfQorCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgaW50ICpudW1iZXIpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCSpudW1iZXIgPSAxOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKQoreworCW1lNDYwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCSp0eXBlID0gTUVfVFlQRV9BTzsKKwkqc3VidHlwZSA9IChpbnN0YW5jZS0+ZmlmbykgPyBNRV9TVUJUWVBFX1NUUkVBTUlORyA6IE1FX1NVQlRZUEVfU0lOR0xFOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX3F1ZXJ5X3N1YmRldmljZV9jYXBzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLCBpbnQgKmNhcHMpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnN0YW5jZSA9IChtZTQ2MDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCSpjYXBzID0KKwkgICAgTUVfQ0FQU19BT19UUklHX1NZTkNIUk9OT1VTIHwgKChpbnN0YW5jZS0+ZmlmbykgPyBNRV9DQVBTX0FPX0ZJRk8gOgorCQkJCQkgICBNRV9DQVBTX05PTkUpOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2FvX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3Moc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgICAgICAgaW50IGNhcCwgaW50ICphcmdzLCBpbnQgY291bnQpCit7CisJbWU0NjAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCWluc3RhbmNlID0gKG1lNDYwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKGNvdW50ICE9IDEpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNhcGFiaWxpdHkgYXJndW1lbnQgY291bnQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0FQX0FSR19DT1VOVDsKKwl9CisKKwlzd2l0Y2ggKGNhcCkgeworCWNhc2UgTUVfQ0FQX0FJX0ZJRk9fU0laRToKKwkJYXJnc1swXSA9IChpbnN0YW5jZS0+ZmlmbykgPyBNRTQ2MDBfQU9fRklGT19DT1VOVCA6IDA7CisJCWJyZWFrOworCisJY2FzZSBNRV9DQVBfQUlfQlVGRkVSX1NJWkU6CisJCWFyZ3NbMF0gPQorCQkgICAgKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYpID8gTUU0NjAwX0FPX0NJUkNfQlVGX0NPVU5UIDogMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgY2FwYWJpbGl0eS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NBUDsKKwkJYXJnc1swXSA9IDA7CisJfQorCisJcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfYW8uaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfYW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmJjNGEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9hby5oCkBAIC0wLDAgKzEsMjYzIEBACisvKioKKyAqIEBmaWxlIG1lNDYwMF9hby5oCisgKgorICogQGJyaWVmIE1laWxoYXVzIE1FLTQwMDAgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU0NjAwX0FPX0hfCisjIGRlZmluZSBfTUU0NjAwX0FPX0hfCisKKyMgaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorIyBpbmNsdWRlICJtZXN1YmRldmljZS5oIgorIyBpbmNsdWRlICJtZWNpcmNfYnVmLmgiCisjIGluY2x1ZGUgIm1laW9jdGwuaCIKKworIyBpZmRlZiBfX0tFUk5FTF9fCisKKyMgIGlmZGVmIEJPU0NICisjICAgdW5kZWYgTUVfU1lOQVBTRQorIyAgIGlmbmRlZiBfQ0JVRkZfMzJiX3QKKyMgCSBkZWZpbmUgX0NCVUZGXzMyYl90CisjICAgZW5kaWYgLy9fQ0JVRkZfMzJiX3QKKyMgIGVuZGlmIC8vQk9TQ0gKKworIyAgZGVmaW5lIE1FNDYwMF9BT19NQVhfU1VCREVWSUNFUwkJNAorIyAgZGVmaW5lIE1FNDYwMF9BT19GSUZPX0NPVU5UCQkJNDA5NgorCisjICBkZWZpbmUgTUU0NjAwX0FPX0JBU0VfRlJFUVVFTkNZCQkzMzAwMDAwMExMCisKKyMgIGRlZmluZSBNRTQ2MDBfQU9fTUlOX0FDUV9USUNLUwkJMExMCisjICBkZWZpbmUgTUU0NjAwX0FPX01BWF9BQ1FfVElDS1MJCTBMTAorCisjICBkZWZpbmUgTUU0NjAwX0FPX01JTl9DSEFOX1RJQ0tTCQk2NkxMCisjICBkZWZpbmUgTUU0NjAwX0FPX01BWF9DSEFOX1RJQ0tTCQkweEZGRkZGRkZGTEwKKworIyAgZGVmaW5lIE1FNDYwMF9BT19NSU5fUkFOR0UJCQktMTAwMDAwMDAKKyMgIGRlZmluZSBNRTQ2MDBfQU9fTUFYX1JBTkdFCQkJOTk5OTY5NAorCisjICBkZWZpbmUgTUU0NjAwX0FPX01BWF9EQVRBCQkJMHhGRkZGCisKKyMgIGlmZGVmIE1FX1NZTkFQU0UKKyMgICBkZWZpbmUgTUU0NjAwX0FPX0NJUkNfQlVGX1NJWkVfT1JERVIgCQk4CS8vIDJebiBQQUdFUyA9Pj4gTWF4aW11bSB2YWx1ZSBvZiAxTUIgZm9yIFN5bmFwc2UKKyMgIGVsc2UKKyMgICBkZWZpbmUgTUU0NjAwX0FPX0NJUkNfQlVGX1NJWkVfT1JERVIgCQk1CS8vIDJebiBQQUdFUyA9Pj4gMTI4S0IKKyMgIGVuZGlmCisjICBkZWZpbmUgTUU0NjAwX0FPX0NJUkNfQlVGX1NJWkUgCQlQQUdFX1NJWkU8PE1FNDYwMF9BT19DSVJDX0JVRl9TSVpFX09SREVSCS8vIEJ1ZmZlciBzaXplIGluIGJ5dGVzLgorCisjICBpZmRlZiBfQ0JVRkZfMzJiX3QKKyMgICBkZWZpbmUgTUU0NjAwX0FPX0NJUkNfQlVGX0NPVU5UCSgoTUU0NjAwX0FPX0NJUkNfQlVGX1NJWkUpIC8gc2l6ZW9mKHVpbnQzMl90KSkJLy8gU2l6ZSBpbiB2YWx1ZXMKKyMgIGVsc2UKKyMgICBkZWZpbmUgTUU0NjAwX0FPX0NJUkNfQlVGX0NPVU5UCSgoTUU0NjAwX0FPX0NJUkNfQlVGX1NJWkUpIC8gc2l6ZW9mKHVpbnQxNl90KSkJLy8gU2l6ZSBpbiB2YWx1ZXMKKyMgIGVuZGlmCisKKyMgIGRlZmluZSBNRTQ2MDBfQU9fQ09OVElOT1VTCQkJCQkweDAKKyMgIGRlZmluZSBNRTQ2MDBfQU9fV1JBUF9NT0RFCQkJCQkweDEKKyMgIGRlZmluZSBNRTQ2MDBfQU9fSFdfTU9ERQkJCQkJCTB4MgorCisjICBkZWZpbmUgTUU0NjAwX0FPX0hXX1dSQVBfTU9ERQkJCQkoTUU0NjAwX0FPX1dSQVBfTU9ERSB8IE1FNDYwMF9BT19IV19NT0RFKQorIyAgZGVmaW5lIE1FNDYwMF9BT19TV19XUkFQX01PREUJCQkJTUU0NjAwX0FPX1dSQVBfTU9ERQorCisjICBkZWZpbmUgTUU0NjAwX0FPX0lORl9TVE9QX01PREUJCQkJMHgwCisjICBkZWZpbmUgTUU0NjAwX0FPX0FDUV9TVE9QX01PREUJCQkJMHgxCisjICBkZWZpbmUgTUU0NjAwX0FPX1NDQU5fU1RPUF9NT0RFCQkJCTB4MgorCisjICBpZmRlZiBCT1NDSAkJCS8vU1BFQ0lBTCBCVUlMRCBGT1IgQk9TQ0gKKworLyogQml0cyBmb3IgZmxhZ3MgYXR0cmlidXRlLiAqLworIyAgIGRlZmluZSBNRTQ2MDBfQU9fRkxBR1NfQlJPS0VOX1BJUEUJCQkweDEKKyMgICBkZWZpbmUgTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV8wCQkweDIKKyMgICBkZWZpbmUgTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV8xCQkweDQKKyMgICBkZWZpbmUgTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV9NQVNLCShNRTQ2MDBfQU9fRkxBR1NfU1dfV1JBUF9NT0RFXzAgfCBNRTQ2MDBfQU9fRkxBR1NfU1dfV1JBUF9NT0RFXzEpCisKKyMgICBkZWZpbmUgTUU0NjAwX0FPX0ZMQUdTX1NXX1dSQVBfTU9ERV9OT05FCTB4MAorIyAgIGRlZmluZSBNRTQ2MDBfQU9fRkxBR1NfU1dfV1JBUF9NT0RFX0lORgkJMHgyCisjICAgZGVmaW5lIE1FNDYwMF9BT19GTEFHU19TV19XUkFQX01PREVfRklOCQkweDQKKworCS8qKgorCSogQGJyaWVmIFRoZSBNRS00MDAwIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlIGNsYXNzLgorCSovCit0eXBlZGVmIHN0cnVjdCBtZTQ2MDBfYW9fc3ViZGV2aWNlIHsKKwkvKiBJbmhlcml0YW5jZSAqLworCW1lX3N1YmRldmljZV90IGJhc2U7CQkJCS8qKjwgVGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJc3BpbmxvY2tfdCAqcHJlbG9hZF9yZWdfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgI3ByZWxvYWRfcmVnIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJdWludDMyX3QgKnByZWxvYWRfZmxhZ3M7CisKKwl1bnNpZ25lZCBpbnQgaXJxOwkJCQkJLyoqPCBUaGUgaW50ZXJydXB0IHJlcXVlc3QgbnVtYmVyIGFzc2lnbmVkIGJ5IHRoZSBQQ0kgQklPUy4gKi8KKwltZV9jaXJjX2J1Zl90IGNpcmNfYnVmOwkJCQkvKio8IENpcmN1bGFyIGJ1ZmZlciBob2xkaW5nIG1lYXN1cm1lbnQgZGF0YS4gKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3F1ZXVlOwkJLyoqPCBXYWl0IHF1ZXVlIHRvIHB1dCBvbiB0YXNrcyB3YWl0aW5nIGZvciBkYXRhIHRvIGFycml2ZS4gKi8KKworCWludCBzaW5nbGVfdmFsdWU7CQkJCQkvKio8IE1pcnJvciBvZiB0aGUgdmFsdWUgd3JpdHRlbiBpbiBzaW5nbGUgbW9kZS4gKi8KKworCWludCB2b2xhdGlsZSBmbGFnczsJCQkJCS8qKjwgRmxhZ3MgdXNlZCBmb3Igc3RvcmluZyBTVyB3cmFwYXJvdW5kIHNldHVwIGFuZCBlcnJvciBzaWduYWxsaW5nIGZyb20gSVNSLiAqLworCXVuc2lnbmVkIGludCB3cmFwX2NvdW50OwkJCS8qKjwgVGhlIHVzZXIgZGVmaW5lZCB3cmFwYXJvdW5kIGN5Y2xlIGNvdW50LiAqLworCXVuc2lnbmVkIGludCB3cmFwX3JlbWFpbmluZzsJCS8qKjwgVGhlIHdyYXBhcm91bmQgY3ljbGUgZG93biBjb3VudGVyIHVzZWQgYnkgYSBydW5uaW5nIGNvbnZlcnNpb24uICovCisJdW5zaWduZWQgaW50IGFvX2lkeDsJCQkJLyoqPCBUaGUgaW5kZXggb2YgdGhpcyBhbmFsb2cgb3V0cHV0IG9uIHRoaXMgZGV2aWNlLiAqLworCWludCBmaWZvOwkJCQkJCQkvKio8IElmIHNldCB0aGlzIGRldmljZSBoYXMgYSBGSUZPLiAqLworCisJaW50IGJvc2NoX2Z3OwkJCQkJCS8qKjwgSWYgc2V0IHRoZSBib3NjaCBmaXJtd2FyZSBpcyBpbiBQUk9NLiAqLworCisJLyogUmVnaXN0ZXJzICovCisJdWludDMyX3QgY3RybF9yZWc7CisJdWludDMyX3Qgc3RhdHVzX3JlZzsKKwl1aW50MzJfdCBmaWZvX3JlZzsKKwl1aW50MzJfdCBzaW5nbGVfcmVnOworCXVpbnQzMl90IHRpbWVyX3JlZzsKKwl1aW50MzJfdCBpcnFfc3RhdHVzX3JlZzsKKwl1aW50MzJfdCBwcmVsb2FkX3JlZzsKKwl1aW50MzJfdCByZWdfYmFzZTsKK30gbWU0NjAwX2FvX3N1YmRldmljZV90OworCisJLyoqCisJKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgTUUtNDAwMCBhbmFsb2cgb3V0cHV0IHN1YmRldmljZSBpbnN0YW5jZSBmb3IgQk9TQ0ggcHJvamVjdC4KKwkqCisJKiBAcGFyYW0gcmVnX2Jhc2UgVGhlIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGFzIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUy4KKwkqIEBwYXJhbSBjdHJsX3JlZ19sb2NrIFBvaW50ZXIgdG8gc3BpbiBsb2NrIHByb3RlY3RpbmcgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4KKwkqIEBwYXJhbSBwcmVsb2FkX2ZsYWdzIFBvaW50ZXIgdG8gc3BpbiBsb2NrIHByb3RlY3RpbmcgdGhlIGhvbGQmdHJpZ2dlciByZWdpc3RlciBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLgorCSogQHBhcmFtIGFvX2lkeCBTdWJkZXZpY2UgbnVtYmVyLgorCSogQHBhcmFtIGZpZm8gRmxhZyBzZXQgaWYgc3ViZGV2aWNlIGhhcyBoYXJkd2FyZSBGSUZPLgorCSogQHBhcmFtIGlycSBJUlEgbnVtYmVyLgorCSoKKwkqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorCSogTlVMTCBvbiBlcnJvci4KKwkqLworbWU0NjAwX2FvX3N1YmRldmljZV90ICptZTQ2MDBfYW9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgc3BpbmxvY2tfdCAqIHByZWxvYWRfcmVnX2xvY2ssCisJCQkJCSAgICAgdWludDMyX3QgKiBwcmVsb2FkX2ZsYWdzLAorCQkJCQkgICAgIGludCBhb19pZHgsIGludCBmaWZvLCBpbnQgaXJxKTsKKworIyAgZWxzZQkvL35CT1NDSAorCisvL01FNDYwMF9BT19GTEFHU19CUk9LRU5fUElQRSBpcyBPQlNPTEVURSA9PiBOb3cgcHJvYmxlbXMgYXJlIHJlcG9ydGVkIGluIHN0YXR1cy4KKwordHlwZWRlZiBlbnVtIE1FNDYwMF9BT19TVEFUVVMgeworCWFvX3N0YXR1c19ub25lID0gMCwKKwlhb19zdGF0dXNfc2luZ2xlX2NvbmZpZ3VyZWQsCisJYW9fc3RhdHVzX3NpbmdsZV9ydW5fd2FpdCwKKwlhb19zdGF0dXNfc2luZ2xlX3J1biwKKwlhb19zdGF0dXNfc2luZ2xlX2VuZF93YWl0LAorCWFvX3N0YXR1c19zaW5nbGVfZW5kLAorCWFvX3N0YXR1c19zdHJlYW1fY29uZmlndXJlZCwKKwlhb19zdGF0dXNfc3RyZWFtX3J1bl93YWl0LAorCWFvX3N0YXR1c19zdHJlYW1fcnVuLAorCWFvX3N0YXR1c19zdHJlYW1fZW5kX3dhaXQsCisJYW9fc3RhdHVzX3N0cmVhbV9lbmQsCisJYW9fc3RhdHVzX3N0cmVhbV9maWZvX2Vycm9yLAorCWFvX3N0YXR1c19zdHJlYW1fYnVmZmVyX2Vycm9yLAorCWFvX3N0YXR1c19zdHJlYW1fZXJyb3IsCisJYW9fc3RhdHVzX2xhc3QKK30gTUU0NjAwX0FPX1NUQVRVUzsKKwordHlwZWRlZiBzdHJ1Y3QgbWU0NjAwX2FvX3RpbWVvdXQgeworCXVuc2lnbmVkIGxvbmcgc3RhcnRfdGltZTsKKwl1bnNpZ25lZCBsb25nIGRlbGF5OworfSBtZTQ2MDBfYW9fdGltZW91dF90OworCisJLyoqCisJKiBAYnJpZWYgVGhlIE1FLTQ2MDAgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgY2xhc3MuCisJKi8KK3R5cGVkZWYgc3RydWN0IG1lNDYwMF9hb19zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKwl1bnNpZ25lZCBpbnQgYW9faWR4OwkJCQkJCS8qKjwgVGhlIGluZGV4IG9mIHRoaXMgYW5hbG9nIG91dHB1dCBvbiB0aGlzIGRldmljZS4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJCQkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJc3BpbmxvY2tfdCAqcHJlbG9hZF9yZWdfbG9jazsJCQkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCBwcmVsb2FkX3JlZyBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCisJdWludDMyX3QgKnByZWxvYWRfZmxhZ3M7CisKKwkvKiBIYXJkd2FyZSBmZWF1dHJlcyAqLworCXVuc2lnbmVkIGludCBpcnE7CQkJCQkJCS8qKjwgVGhlIGludGVycnVwdCByZXF1ZXN0IG51bWJlciBhc3NpZ25lZCBieSB0aGUgUENJIEJJT1MuICovCisJaW50IGZpZm87CQkJCQkJCQkJLyoqPCBJZiBzZXQgdGhpcyBkZXZpY2UgaGFzIGEgRklGTy4gKi8KKwlpbnQgYml0cGF0dGVybjsJCQkJCQkJCS8qKjwgSWYgc2V0IHRoaXMgZGV2aWNlIHVzZSBiaXRwYXR0ZXJuLiAqLworCisJaW50IHNpbmdsZV92YWx1ZTsJCQkJCQkJLyoqPCBNaXJyb3Igb2YgdGhlIG91dHB1dCB2YWx1ZSBpbiBzaW5nbGUgbW9kZS4gKi8KKwlpbnQgc2luZ2xlX3ZhbHVlX2luX2ZpZm87CQkJCQkvKio8IE1pcnJvciBvZiB0aGUgdmFsdWUgd3JpdHRlbiBpbiBzaW5nbGUgbW9kZS4gKi8KKwl1aW50MzJfdCBjdHJsX3RyZzsJCQkJCQkJLyoqPCBNaXJyb3Igb2YgdGhlIHRyaWdnZXIgc2V0dGluZ3MuICovCisKKwl2b2xhdGlsZSBpbnQgbW9kZTsJCQkJCQkJLyoqPCBGbGFncyB1c2VkIGZvciBzdG9yaW5nIFNXIHdyYXBhcm91bmQgc2V0dXAqLworCWludCBzdG9wX21vZGU7CQkJCQkJCQkvKio8IFRoZSB1c2VyIGRlZmluZWQgc3RvcCBjb25kaXRpb24gZmxhZy4gKi8KKwl1bnNpZ25lZCBpbnQgc3RhcnRfbW9kZTsKKwl1bnNpZ25lZCBpbnQgc3RvcF9jb3VudDsJCQkJCS8qKjwgVGhlIHVzZXIgZGVmaW5lZCBkYXRlcyBwcmVzZW50YXRpb24gZW5kIGNvdW50LiAqLworCXVuc2lnbmVkIGludCBzdG9wX2RhdGFfY291bnQ7CQkJCS8qKjwgVGhlIHN0b3AgcHJlc2VudGF0aW9uIGNvdW50LiAqLworCXVuc2lnbmVkIGludCBkYXRhX2NvdW50OwkJCQkJLyoqPCBUaGUgcmVhbCBwcmVzZW50YXRpb24gY291bnQuICovCisJdW5zaWduZWQgaW50IHByZWxvYWRlZF9jb3VudDsJCQkJLyoqPCBUaGUgbmV4dCBkYXRhIGFkZHJlcyBpbiBidWZmZXIuIDw9IGZvciB3cmFwYXJvdW5kIG1vZGUuICovCisJaW50IGhhcmR3YXJlX3N0b3BfZGVsYXk7CQkJCQkvKio8IFRoZSB0aW1lIHRoYXQgc3RvcCBjYW4gdGFrZS4gVGhpcyBpcyBvbmx5IHRvIG5vdCBzaG93IGhhcmR3YXJlIGJ1ZyB0byB1c2VyLiAqLworCisJdm9sYXRpbGUgZW51bSBNRTQ2MDBfQU9fU1RBVFVTIHN0YXR1czsJCS8qKjwgVGhlIGN1cnJlbnQgc3RyZWFtIHN0YXR1cyBmbGFnLiAqLworCW1lNDYwMF9hb190aW1lb3V0X3QgdGltZW91dDsJCQkJLyoqPCBUaGUgdGltZW91dCBmb3Igc3RhcnQgaW4gYmxvY2tpbmcgYW5kIG5vbi1ibG9ja2luZyBtb2RlLiAqLworCisJCQkJCQkJCQkJLyogUmVnaXN0ZXJzICovLyoqPCBBbGwgcmVnaXN0ZXJzIGFyZSAzMiBiaXRzIGxvbmcuICovCisJdW5zaWduZWQgbG9uZyBjdHJsX3JlZzsKKwl1bnNpZ25lZCBsb25nIHN0YXR1c19yZWc7CisJdW5zaWduZWQgbG9uZyBmaWZvX3JlZzsKKwl1bnNpZ25lZCBsb25nIHNpbmdsZV9yZWc7CisJdW5zaWduZWQgbG9uZyB0aW1lcl9yZWc7CisJdW5zaWduZWQgbG9uZyBpcnFfc3RhdHVzX3JlZzsKKwl1bnNpZ25lZCBsb25nIHByZWxvYWRfcmVnOworCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2U7CisKKwkvKiBTb2Z0d2FyZSBidWZmZXIgKi8KKwltZV9jaXJjX2J1Zl90IGNpcmNfYnVmOwkJCQkJCS8qKjwgQ2lyY3VsYXIgYnVmZmVyIGhvbGRpbmcgbWVhc3VybWVudCBkYXRhLiAzMiBiaXQgbG9uZyAqLworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfcXVldWU7CQkJCS8qKjwgV2FpdCBxdWV1ZSB0byBwdXQgb24gdGFza3Mgd2FpdGluZyBmb3IgZGF0YSB0byBhcnJpdmUuICovCisKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqbWU0NjAwX3dvcmtxdWV1ZTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjApCisJc3RydWN0IHdvcmtfc3RydWN0IGFvX2NvbnRyb2xfdGFzazsKKyNlbHNlCisJc3RydWN0IGRlbGF5ZWRfd29yayBhb19jb250cm9sX3Rhc2s7CisjZW5kaWYKKworCXZvbGF0aWxlIGludCBhb19jb250cm9sX3Rhc2tfZmxhZzsJCQkvKio8IEZsYWcgY29udHJvbGluZyByZWV4ZWN1dGluZyBvZiBjb250cm9sIHRhc2sgKi8KKworfSBtZTQ2MDBfYW9fc3ViZGV2aWNlX3Q7CisKKwkvKioKKwkqIEBicmllZiBUaGUgY29uc3RydWN0b3IgdG8gZ2VuZXJhdGUgYSBNRS00NjAwIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorCSoKKwkqIEBwYXJhbSByZWdfYmFzZSBUaGUgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgYXMgcmV0dXJuZWQgYnkgdGhlIFBDSSBCSU9TLgorCSogQHBhcmFtIGN0cmxfcmVnX2xvY2sgUG9pbnRlciB0byBzcGluIGxvY2sgcHJvdGVjdGluZyB0aGUgY29udHJvbCByZWdpc3RlciBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLgorCSogQHBhcmFtIHByZWxvYWRfZmxhZ3MgUG9pbnRlciB0byBzcGluIGxvY2sgcHJvdGVjdGluZyB0aGUgaG9sZCZ0cmlnZ2VyIHJlZ2lzdGVyIGZyb20gY29uY3VycmVudCBhY2Nlc3MuCisJKiBAcGFyYW0gYW9faWR4IFN1YmRldmljZSBudW1iZXIuCisJKiBAcGFyYW0gZmlmbyBGbGFnIHNldCBpZiBzdWJkZXZpY2UgaGFzIGhhcmR3YXJlIEZJRk8uCisJKiBAcGFyYW0gaXJxIElSUSBudW1iZXIuCisJKiBAcGFyYW0gbWU0NjAwX3dxIFF1ZXVlIGZvciBhc3luY2hyb25vdXMgdGFzayAoMSBxdWV1ZSBmb3IgYWxsIHN1YmRldmljZSBvbiAxIGJvYXJkKS4KKwkqCisJKiBAcmV0dXJuIFBvaW50ZXIgdG8gbmV3IGluc3RhbmNlIG9uIHN1Y2Nlc3MuXG4KKwkqIE5VTEwgb24gZXJyb3IuCisJKi8KK21lNDYwMF9hb19zdWJkZXZpY2VfdCAqbWU0NjAwX2FvX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgIHNwaW5sb2NrX3QgKiBwcmVsb2FkX3JlZ19sb2NrLAorCQkJCQkgICAgIHVpbnQzMl90ICogcHJlbG9hZF9mbGFncywKKwkJCQkJICAgICBpbnQgYW9faWR4LAorCQkJCQkgICAgIGludCBmaWZvLAorCQkJCQkgICAgIGludCBpcnEsCisJCQkJCSAgICAgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QKKwkJCQkJICAgICAqbWU0NjAwX3dxKTsKKworIyAgZW5kaWYgLy9CT1NDSAorIyBlbmRpZgkvL19fS0VSTkVMX18KKyNlbmRpZiAvLyB+X01FNDYwMF9BT19IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9hb19yZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfYW9fcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgzZDgyZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfYW9fcmVnLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qKgorICogQGZpbGUgbWU0NjAwX2FvX3JlZy5oCisgKgorICogQGJyaWVmIE1FLTQwMDAgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU0NjAwX0FPX1JFR19IXworI2RlZmluZSBfTUU0NjAwX0FPX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FNDYwMF9BT18wMF9DVFJMX1JFRwkJCQkJMHgwMAkvLyBSL1cKKyNkZWZpbmUgTUU0NjAwX0FPXzAwX1NUQVRVU19SRUcJCQkJCTB4MDQJLy8gUi9fCisjZGVmaW5lIE1FNDYwMF9BT18wMF9GSUZPX1JFRwkJCQkJMHgwOAkvLyBfL1cKKyNkZWZpbmUgTUU0NjAwX0FPXzAwX1NJTkdMRV9SRUcJCQkJCTB4MEMJLy8gUi9XCisjZGVmaW5lIE1FNDYwMF9BT18wMF9USU1FUl9SRUcJCQkJCTB4MTAJLy8gXy9XCisKKyNkZWZpbmUgTUU0NjAwX0FPXzAxX0NUUkxfUkVHCQkJCQkweDE4CS8vIFIvVworI2RlZmluZSBNRTQ2MDBfQU9fMDFfU1RBVFVTX1JFRwkJCQkJMHgxQwkvLyBSL18KKyNkZWZpbmUgTUU0NjAwX0FPXzAxX0ZJRk9fUkVHCQkJCQkweDIwCS8vIF8vVworI2RlZmluZSBNRTQ2MDBfQU9fMDFfU0lOR0xFX1JFRwkJCQkJMHgyNAkvLyBSL1cKKyNkZWZpbmUgTUU0NjAwX0FPXzAxX1RJTUVSX1JFRwkJCQkJMHgyOAkvLyBfL1cKKworI2RlZmluZSBNRTQ2MDBfQU9fMDJfQ1RSTF9SRUcJCQkJCTB4MzAJLy8gUi9XCisjZGVmaW5lIE1FNDYwMF9BT18wMl9TVEFUVVNfUkVHCQkJCQkweDM0CS8vIFIvXworI2RlZmluZSBNRTQ2MDBfQU9fMDJfRklGT19SRUcJCQkJCTB4MzgJLy8gXy9XCisjZGVmaW5lIE1FNDYwMF9BT18wMl9TSU5HTEVfUkVHCQkJCQkweDNDCS8vIFIvVworI2RlZmluZSBNRTQ2MDBfQU9fMDJfVElNRVJfUkVHCQkJCQkweDQwCS8vIF8vVworCisjZGVmaW5lIE1FNDYwMF9BT18wM19DVFJMX1JFRwkJCQkJMHg0OAkvLyBSL1cKKyNkZWZpbmUgTUU0NjAwX0FPXzAzX1NUQVRVU19SRUcJCQkJCTB4NEMJLy8gUi9fCisjZGVmaW5lIE1FNDYwMF9BT18wM19GSUZPX1JFRwkJCQkJMHg1MAkvLyBfL1cKKyNkZWZpbmUgTUU0NjAwX0FPXzAzX1NJTkdMRV9SRUcJCQkJCTB4NTQJLy8gUi9XCisjZGVmaW5lIE1FNDYwMF9BT18wM19USU1FUl9SRUcJCQkJCTB4NTgJLy8gXy9XCisKKyNkZWZpbmUgTUU0NjAwX0FPX0RFTVVYX0FESlVTVF9SRUcJCQkJMHhCQwkvLyAtL1cKKyNkZWZpbmUgTUU0NjAwX0FPX0RFTVVYX0FESlVTVF9WQUxVRQkJCTB4NEMKKworI2lmZGVmIEJPU0NICisjIGRlZmluZSBNRTQ2MDBfQU9fQk9TQ0hfUkVHCQkJCQkweEM0CisKKyMgZGVmaW5lIE1FNDYwMF9BT19MT0FEU0VUUkVHX1hYCQkJCTB4QjQJLy8gUi9XCisKKyMgZGVmaW5lIE1FNDYwMF9BT19DVFJMX0JJVF9NT0RFXzAJCQkJMHgwMDEKKyMgZGVmaW5lIE1FNDYwMF9BT19DVFJMX0JJVF9NT0RFXzEJCQkJMHgwMDIKKyMgZGVmaW5lIE1FNDYwMF9BT19DVFJMX01BU0tfTU9ERQkJCQkweDAwMworCisjZWxzZSAvL35CT1NDSAorCisjZGVmaW5lIE1FNDYwMF9BT19TWU5DX1JFRwkJCQkJCTB4QjQJLy8gUi9XICAgIC8vL01FNDYwMF9BT19TWU5DX1JFRyA8PT0+IE1FNDYwMF9BT19QUkVMT0FEX1JFRyA8PT0+IE1FNDYwMF9BT19MT0FEU0VUUkVHX1hYCisKKyMgZGVmaW5lIE1FNDYwMF9BT19NT0RFX1NJTkdMRQkJCQkJMHgwMDAwMDAwMAorIyBkZWZpbmUgTUU0NjAwX0FPX01PREVfV1JBUEFST1VORAkJCQkweDAwMDAwMDAxCisjIGRlZmluZSBNRTQ2MDBfQU9fTU9ERV9DT05USU5VT1VTCQkJCTB4MDAwMDAwMDIKKyMgZGVmaW5lIE1FNDYwMF9BT19DVFJMX01PREVfTUFTSwkJCQkoTUU0NjAwX0FPX01PREVfV1JBUEFST1VORCB8IE1FNDYwMF9BT19NT0RFX0NPTlRJTlVPVVMpCisjZW5kaWYgLy9CT1NDSAorCisjZGVmaW5lIE1FNDYwMF9BT19DVFJMX0JJVF9NT0RFX1dSQVBBUk9VTkQJCU1FNDYwMF9BT19NT0RFX1dSQVBBUk9VTkQKKyNkZWZpbmUgTUU0NjAwX0FPX0NUUkxfQklUX01PREVfQ09OVElOT1VTCQlNRTQ2MDBfQU9fTU9ERV9DT05USU5VT1VTCisjZGVmaW5lIE1FNDYwMF9BT19DVFJMX0JJVF9TVE9QCQkJCQkweDAwMDAwMDA0CisjZGVmaW5lIE1FNDYwMF9BT19DVFJMX0JJVF9FTkFCTEVfRklGTwkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgTUU0NjAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHCQkweDAwMDAwMDEwCisjZGVmaW5lIE1FNDYwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0UJCQkweDAwMDAwMDIwCisjZGVmaW5lIE1FNDYwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUAkJMHgwMDAwMDA4MAorI2RlZmluZSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0RPCQkJMHgwMDAwMDEwMAorI2RlZmluZSBNRTQ2MDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUQkJCTB4MDAwMDAyMDAKKyNkZWZpbmUgTUU0NjAwX0FPX0NUUkxfQklUX1JFU0VUX0lSUQkJCTB4MDAwMDA0MDAKKyNkZWZpbmUgTUU0NjAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRV9CT1RICTB4MDAwMDA4MDAKKy8qCisjZGVmaW5lIE1FNDYwMF9BT19TWU5DX0hPTERfMAkJCQkJMHgwMDAwMDAwMQorI2RlZmluZSBNRTQ2MDBfQU9fU1lOQ19IT0xEXzEJCQkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgTUU0NjAwX0FPX1NZTkNfSE9MRF8yCQkJCQkweDAwMDAwMDA0CisjZGVmaW5lIE1FNDYwMF9BT19TWU5DX0hPTERfMwkJCQkJMHgwMDAwMDAwOAorKi8KKyNkZWZpbmUgTUU0NjAwX0FPX1NZTkNfSE9MRAkJCQkJCTB4MDAwMDAwMDEKKworLyoKKyNkZWZpbmUgTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUdfMAkJCQkweDAwMDEwMDAwCisjZGVmaW5lIE1FNDYwMF9BT19TWU5DX0VYVF9UUklHXzEJCQkJMHgwMDAyMDAwMAorI2RlZmluZSBNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJR18yCQkJCTB4MDAwNDAwMDAKKyNkZWZpbmUgTUU0NjAwX0FPX1NZTkNfRVhUX1RSSUdfMwkJCQkweDAwMDgwMDAwCisqLworI2RlZmluZSBNRTQ2MDBfQU9fU1lOQ19FWFRfVFJJRwkJCQkJMHgwMDAxMDAwMAorCisjZGVmaW5lIE1FNDYwMF9BT19FWFRfVFJJRwkJCQkJCTB4ODAwMDAwMDAKKworI2RlZmluZSBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GU00JCQkJMHgwMDAwMDAwMQorI2RlZmluZSBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9GRgkJCQkJMHgwMDAwMDAwMgorI2RlZmluZSBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9IRgkJCQkJMHgwMDAwMDAwNAorI2RlZmluZSBNRTQ2MDBfQU9fU1RBVFVTX0JJVF9FRgkJCQkJMHgwMDAwMDAwOAorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9kZXZpY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGV2aWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE0NTU4NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGV2aWNlLmMKQEAgLTAsMCArMSwzNzMgQEAKKy8qKgorICogQGZpbGUgbWU0NjAwX2RldmljZS5jCisgKgorICogQGJyaWVmIE1FLTQ2MDAgZGV2aWNlIGNsYXNzIGltcGxlbWVudGF0aW9uLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisjaWZuZGVmIE1PRFVMRQorIyAgZGVmaW5lIE1PRFVMRQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgIm1laWRzLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorI2luY2x1ZGUgIm1lY29tbW9uLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisjaW5jbHVkZSAibWU0NjAwX2RldmljZS5oIgorI2luY2x1ZGUgIm1lcGx4X3JlZy5oIgorCisjaW5jbHVkZSAibWVmaXJtd2FyZS5oIgorCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKyNpbmNsdWRlICJtZTQ2MDBfZG8uaCIKKyNpbmNsdWRlICJtZTQ2MDBfZGkuaCIKKyNpbmNsdWRlICJtZTQ2MDBfZGlvLmgiCisjaW5jbHVkZSAibWU4MjU0LmgiCisjaW5jbHVkZSAibWU0NjAwX2FpLmgiCisjaW5jbHVkZSAibWU0NjAwX2FvLmgiCisjaW5jbHVkZSAibWU0NjAwX2V4dF9pcnEuaCIKKworLyoqCisgKiBAYnJpZWYgR2xvYmFsIHZhcmlhYmxlLgorICogVGhpcyBpcyB3b3JraW5nIHF1ZXVlIGZvciBydW5pbmcgYSBzZXBhcmF0ZSBhdGFzayB0aGF0IHdpbGwgYmUgcmVzcG9uc2libGUgZm9yIHdvcmsgc3RhdHVzIChzdGFydCwgc3RvcCwgdGltZW91dHMpLgorICovCitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKm1lNDYwMF93b3JrcXVldWU7CisKKyNpZmRlZiBCT1NDSAorbWVfZGV2aWNlX3QgKm1lNDYwMF9wY2lfY29uc3RydWN0b3Ioc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2UsIGludCBtZV9ib3NjaF9mdykKKyNlbHNlIC8vfkJPU0NICittZV9kZXZpY2VfdCAqbWU0NjAwX3BjaV9jb25zdHJ1Y3RvcihzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldmljZSkKKyNlbmRpZgkJCQkvL0JPU0NICit7CisJbWU0NjAwX2RldmljZV90ICptZTQ2MDBfZGV2aWNlOworCW1lX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJdW5zaWduZWQgaW50IHZlcnNpb25faWR4OworCWludCBlcnI7CisJaW50IGk7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBBbGxvY2F0ZSBzdHJ1Y3R1cmUgZm9yIGRldmljZSBpbnN0YW5jZS4KKwltZTQ2MDBfZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWU0NjAwX2RldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIW1lNDYwMF9kZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3IgTUUtNDYwMCBkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KG1lNDYwMF9kZXZpY2UsIDAsIHNpemVvZihtZTQ2MDBfZGV2aWNlX3QpKTsKKworCS8vIEluaXRpYWxpemUgYmFzZSBjbGFzcyBzdHJ1Y3R1cmUuCisJZXJyID0gbWVfZGV2aWNlX3BjaV9pbml0KChtZV9kZXZpY2VfdCAqKSBtZTQ2MDBfZGV2aWNlLCBwY2lfZGV2aWNlKTsKKworCWlmIChlcnIpIHsKKwkJa2ZyZWUobWU0NjAwX2RldmljZSk7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgZGV2aWNlIGJhc2UgY2xhc3MuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIERvd25sb2FkIHRoZSB4aWxpbnggZmlybXdhcmUuCisJaWYgKG1lNDYwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuZGV2aWNlX2lkID09IFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjEwKSB7CS8vSmVreWxsIDw9PiBtZTQ2MTAKKwkJZXJyID0KKwkJICAgIG1lX3hpbGlueF9kb3dubG9hZChtZTQ2MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLgorCQkJCSAgICAgICByZWdfYmFzZXNbMV0sCisJCQkJICAgICAgIG1lNDYwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuCisJCQkJICAgICAgIHJlZ19iYXNlc1s1XSwgJnBjaV9kZXZpY2UtPmRldiwKKwkJCQkgICAgICAgIm1lNDYxMC5iaW4iKTsKKwl9IGVsc2UgewkJLy8gR2VuZXJhbCBtZTQ2MDAgZmlybXdhcmUKKyNpZmRlZiBCT1NDSAorCQllcnIgPQorCQkgICAgbWVfeGlsaW54X2Rvd25sb2FkKG1lNDYwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuCisJCQkJICAgICAgIHJlZ19iYXNlc1sxXSwKKwkJCQkgICAgICAgbWU0NjAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS4KKwkJCQkgICAgICAgcmVnX2Jhc2VzWzVdLCAmcGNpX2RldmljZS0+ZGV2LAorCQkJCSAgICAgICAobWVfYm9zY2hfZncpID8gIm1lNDYwMF9ib3NjaC5iaW4iIDoKKwkJCQkgICAgICAgIm1lNDYwMC5iaW4iKTsKKyNlbHNlIC8vfkJPU0NICisJCWVyciA9CisJCSAgICBtZV94aWxpbnhfZG93bmxvYWQobWU0NjAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS4KKwkJCQkgICAgICAgcmVnX2Jhc2VzWzFdLAorCQkJCSAgICAgICBtZTQ2MDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLgorCQkJCSAgICAgICByZWdfYmFzZXNbNV0sICZwY2lfZGV2aWNlLT5kZXYsCisJCQkJICAgICAgICJtZTQ2MDAuYmluIik7CisjZW5kaWYKKwl9CisKKwlpZiAoZXJyKSB7CisJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lNDYwMF9kZXZpY2UpOworCQlrZnJlZShtZTQ2MDBfZGV2aWNlKTsKKwkJUEVSUk9SKCJDYW5ub3QgZG93bmxvYWQgZmlybXdhcmUuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEdldCB0aGUgaW5kZXggaW4gdGhlIGRldmljZSB2ZXJzaW9uIGluZm9ybWF0aW9uIHRhYmxlLgorCXZlcnNpb25faWR4ID0KKwkgICAgbWU0NjAwX3ZlcnNpb25zX2dldF9kZXZpY2VfaW5kZXgobWU0NjAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS4KKwkJCQkJICAgICBkZXZpY2VfaWQpOworCisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2tzLgorCXNwaW5fbG9ja19pbml0KCZtZTQ2MDBfZGV2aWNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKworCW1lNDYwMF9kZXZpY2UtPnByZWxvYWRfZmxhZ3MgPSAwOworCisJc3Bpbl9sb2NrX2luaXQoJm1lNDYwMF9kZXZpY2UtPmRpb19sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmbWU0NjAwX2RldmljZS0+YWlfY3RybF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmbWU0NjAwX2RldmljZS0+Y3RyX2N0cmxfcmVnX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZtZTQ2MDBfZGV2aWNlLT5jdHJfY2xrX3NyY19yZWdfbG9jayk7CisKKwkvLyBDcmVhdGUgZGlnaXRhbCBpbnB1dCBpbnN0YW5jZXMuCisJZm9yIChpID0gMDsgaSA8IG1lNDYwMF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0uZGlfc3ViZGV2aWNlczsgaSsrKSB7CisJCXN1YmRldmljZSA9CisJCSAgICAobWVfc3ViZGV2aWNlX3QgKikgbWU0NjAwX2RpX2NvbnN0cnVjdG9yKG1lNDYwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgYmFzZS5pbmZvLnBjaS4KKwkJCQkJCQkgICAgIHJlZ19iYXNlc1syXSwKKwkJCQkJCQkgICAgICZtZTQ2MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGRpb19sb2NrKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWU0NjAwX2RldmljZSk7CisJCQlrZnJlZShtZTQ2MDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lNDYwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCS8vIENyZWF0ZSBkaWdpdGFsIG91dHB1dCBpbnN0YW5jZXMuCisJZm9yIChpID0gMDsgaSA8IG1lNDYwMF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0uZG9fc3ViZGV2aWNlczsgaSsrKSB7CisJCXN1YmRldmljZSA9CisJCSAgICAobWVfc3ViZGV2aWNlX3QgKikgbWU0NjAwX2RvX2NvbnN0cnVjdG9yKG1lNDYwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgYmFzZS5pbmZvLnBjaS4KKwkJCQkJCQkgICAgIHJlZ19iYXNlc1syXSwKKwkJCQkJCQkgICAgICZtZTQ2MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGRpb19sb2NrKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWU0NjAwX2RldmljZSk7CisJCQlrZnJlZShtZTQ2MDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lNDYwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCS8vIENyZWF0ZSBkaWdpdGFsIGlucHV0L291dHB1dCBpbnN0YW5jZXMuCisJZm9yIChpID0gMDsgaSA8IG1lNDYwMF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0uZGlvX3N1YmRldmljZXM7IGkrKykgeworCQlzdWJkZXZpY2UgPQorCQkgICAgKG1lX3N1YmRldmljZV90ICopIG1lNDYwMF9kaW9fY29uc3RydWN0b3IobWU0NjAwX2RldmljZS0+CisJCQkJCQkJICAgICAgYmFzZS5pbmZvLnBjaS4KKwkJCQkJCQkgICAgICByZWdfYmFzZXNbMl0sCisJCQkJCQkJICAgICAgbWU0NjAwX3ZlcnNpb25zCisJCQkJCQkJICAgICAgW3ZlcnNpb25faWR4XS4KKwkJCQkJCQkgICAgICBkb19zdWJkZXZpY2VzICsKKwkJCQkJCQkgICAgICBtZTQ2MDBfdmVyc2lvbnMKKwkJCQkJCQkgICAgICBbdmVyc2lvbl9pZHhdLgorCQkJCQkJCSAgICAgIGRpX3N1YmRldmljZXMgKyBpLAorCQkJCQkJCSAgICAgICZtZTQ2MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgICBkaW9fbG9jayk7CisKKwkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lNDYwMF9kZXZpY2UpOworCQkJa2ZyZWUobWU0NjAwX2RldmljZSk7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTQ2MDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkgICAgc3ViZGV2aWNlKTsKKwl9CisKKwkvLyBDcmVhdGUgYW5hbG9nIGlucHV0IGluc3RhbmNlcy4KKwlmb3IgKGkgPSAwOyBpIDwgbWU0NjAwX3ZlcnNpb25zW3ZlcnNpb25faWR4XS5haV9zdWJkZXZpY2VzOyBpKyspIHsKKwkJc3ViZGV2aWNlID0KKwkJICAgIChtZV9zdWJkZXZpY2VfdCAqKSBtZTQ2MDBfYWlfY29uc3RydWN0b3IobWU0NjAwX2RldmljZS0+CisJCQkJCQkJICAgICBiYXNlLmluZm8ucGNpLgorCQkJCQkJCSAgICAgcmVnX2Jhc2VzWzJdLAorCQkJCQkJCSAgICAgbWU0NjAwX3ZlcnNpb25zCisJCQkJCQkJICAgICBbdmVyc2lvbl9pZHhdLgorCQkJCQkJCSAgICAgYWlfY2hhbm5lbHMsCisJCQkJCQkJICAgICBtZTQ2MDBfdmVyc2lvbnMKKwkJCQkJCQkgICAgIFt2ZXJzaW9uX2lkeF0uCisJCQkJCQkJICAgICBhaV9yYW5nZXMsCisJCQkJCQkJICAgICBtZTQ2MDBfdmVyc2lvbnMKKwkJCQkJCQkgICAgIFt2ZXJzaW9uX2lkeF0uCisJCQkJCQkJICAgICBhaV9pc29sYXRlZCwKKwkJCQkJCQkgICAgIG1lNDYwMF92ZXJzaW9ucworCQkJCQkJCSAgICAgW3ZlcnNpb25faWR4XS4KKwkJCQkJCQkgICAgIGFpX3NoLAorCQkJCQkJCSAgICAgbWU0NjAwX2RldmljZS0+CisJCQkJCQkJICAgICBiYXNlLmlycSwKKwkJCQkJCQkgICAgICZtZTQ2MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGFpX2N0cmxfbG9jaywKKwkJCQkJCQkgICAgIG1lNDYwMF93b3JrcXVldWUpOworCisJCWlmICghc3ViZGV2aWNlKSB7CisJCQltZV9kZXZpY2VfZGVpbml0KChtZV9kZXZpY2VfdCAqKSBtZTQ2MDBfZGV2aWNlKTsKKwkJCWtmcmVlKG1lNDYwMF9kZXZpY2UpOworCQkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlLlxuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCW1lX3NsaXN0X2FkZF9zdWJkZXZpY2VfdGFpbCgmbWU0NjAwX2RldmljZS0+YmFzZS5zbGlzdCwKKwkJCQkJICAgIHN1YmRldmljZSk7CisJfQorCisJLy8gQ3JlYXRlIGFuYWxvZyBvdXRwdXQgaW5zdGFuY2VzLgorCWZvciAoaSA9IDA7IGkgPCBtZTQ2MDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLmFvX3N1YmRldmljZXM7IGkrKykgeworI2lmZGVmIEJPU0NICisJCXN1YmRldmljZSA9CisJCSAgICAobWVfc3ViZGV2aWNlX3QgKikgbWU0NjAwX2FvX2NvbnN0cnVjdG9yKG1lNDYwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgYmFzZS5pbmZvLnBjaS4KKwkJCQkJCQkgICAgIHJlZ19iYXNlc1syXSwKKwkJCQkJCQkgICAgICZtZTQ2MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIHByZWxvYWRfcmVnX2xvY2ssCisJCQkJCQkJICAgICAmbWU0NjAwX2RldmljZS0+CisJCQkJCQkJICAgICBwcmVsb2FkX2ZsYWdzLCBpLAorCQkJCQkJCSAgICAgbWU0NjAwX3ZlcnNpb25zCisJCQkJCQkJICAgICBbdmVyc2lvbl9pZHhdLgorCQkJCQkJCSAgICAgYW9fZmlmbywKKwkJCQkJCQkgICAgIG1lNDYwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgYmFzZS5pcnEpOworI2Vsc2UgLy9+Qk9TQ0gKKwkJc3ViZGV2aWNlID0KKwkJICAgIChtZV9zdWJkZXZpY2VfdCAqKSBtZTQ2MDBfYW9fY29uc3RydWN0b3IobWU0NjAwX2RldmljZS0+CisJCQkJCQkJICAgICBiYXNlLmluZm8ucGNpLgorCQkJCQkJCSAgICAgcmVnX2Jhc2VzWzJdLAorCQkJCQkJCSAgICAgJm1lNDYwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgcHJlbG9hZF9yZWdfbG9jaywKKwkJCQkJCQkgICAgICZtZTQ2MDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIHByZWxvYWRfZmxhZ3MsIGksCisJCQkJCQkJICAgICBtZTQ2MDBfdmVyc2lvbnMKKwkJCQkJCQkgICAgIFt2ZXJzaW9uX2lkeF0uCisJCQkJCQkJICAgICBhb19maWZvLAorCQkJCQkJCSAgICAgbWU0NjAwX2RldmljZS0+CisJCQkJCQkJICAgICBiYXNlLmlycSwKKwkJCQkJCQkgICAgIG1lNDYwMF93b3JrcXVldWUpOworI2VuZGlmCisKKwkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lNDYwMF9kZXZpY2UpOworCQkJa2ZyZWUobWU0NjAwX2RldmljZSk7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTQ2MDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkgICAgc3ViZGV2aWNlKTsKKwl9CisKKwkvLyBDcmVhdGUgY291bnRlciBpbnN0YW5jZXMuCisJZm9yIChpID0gMDsgaSA8IG1lNDYwMF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0uY3RyX3N1YmRldmljZXM7IGkrKykgeworCQlzdWJkZXZpY2UgPQorCQkgICAgKG1lX3N1YmRldmljZV90ICopIG1lODI1NF9jb25zdHJ1Y3RvcihtZTQ2MDBfZGV2aWNlLT5iYXNlLgorCQkJCQkJCSAgaW5mby5wY2kuZGV2aWNlX2lkLAorCQkJCQkJCSAgbWU0NjAwX2RldmljZS0+YmFzZS4KKwkJCQkJCQkgIGluZm8ucGNpLnJlZ19iYXNlc1szXSwKKwkJCQkJCQkgIDAsIGksCisJCQkJCQkJICAmbWU0NjAwX2RldmljZS0+CisJCQkJCQkJICBjdHJfY3RybF9yZWdfbG9jaywKKwkJCQkJCQkgICZtZTQ2MDBfZGV2aWNlLT4KKwkJCQkJCQkgIGN0cl9jbGtfc3JjX3JlZ19sb2NrKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWU0NjAwX2RldmljZSk7CisJCQlrZnJlZShtZTQ2MDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lNDYwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCS8vIENyZWF0ZSBleHRlcm5hbCBpbnRlcnJ1cHQgaW5zdGFuY2VzLgorCWZvciAoaSA9IDA7IGkgPCBtZTQ2MDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLmV4dF9pcnFfc3ViZGV2aWNlczsgaSsrKSB7CisJCXN1YmRldmljZSA9CisJCSAgICAobWVfc3ViZGV2aWNlX3QgKikKKwkJICAgIG1lNDYwMF9leHRfaXJxX2NvbnN0cnVjdG9yKG1lNDYwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuCisJCQkJCSAgICAgICByZWdfYmFzZXNbMl0sCisJCQkJCSAgICAgICBtZTQ2MDBfZGV2aWNlLT5iYXNlLmlycSwKKwkJCQkJICAgICAgICZtZTQ2MDBfZGV2aWNlLT5haV9jdHJsX2xvY2spOworCisJCWlmICghc3ViZGV2aWNlKSB7CisJCQltZV9kZXZpY2VfZGVpbml0KChtZV9kZXZpY2VfdCAqKSBtZTQ2MDBfZGV2aWNlKTsKKwkJCWtmcmVlKG1lNDYwMF9kZXZpY2UpOworCQkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlLlxuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCW1lX3NsaXN0X2FkZF9zdWJkZXZpY2VfdGFpbCgmbWU0NjAwX2RldmljZS0+YmFzZS5zbGlzdCwKKwkJCQkJICAgIHN1YmRldmljZSk7CisJfQorCisJcmV0dXJuIChtZV9kZXZpY2VfdCAqKSBtZTQ2MDBfZGV2aWNlOworfQorCisvLyBJbml0IGFuZCBleGl0IG9mIG1vZHVsZS4KKworc3RhdGljIGludCBfX2luaXQgbWU0NjAwX2luaXQodm9pZCkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKyNpZm5kZWYgQk9TQ0gKKwltZTQ2MDBfd29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoIm1lNDYwMCIpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtZTQ2MDBfZXhpdCh2b2lkKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworI2lmbmRlZiBCT1NDSAorCWZsdXNoX3dvcmtxdWV1ZShtZTQ2MDBfd29ya3F1ZXVlKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShtZTQ2MDBfd29ya3F1ZXVlKTsKKyNlbmRpZgorfQorCittb2R1bGVfaW5pdChtZTQ2MDBfaW5pdCk7Cittb2R1bGVfZXhpdChtZTQ2MDBfZXhpdCk7CisKKy8vIEFkbWluaXN0cmF0aXZlIHN0dWZmIGZvciBtb2RpbmZvLgorTU9EVUxFX0FVVEhPUgorICAgICgiR3VlbnRlciBHZWJoYXJkdCA8Zy5nZWJoYXJkdEBtZWlsaGF1cy5kZT4gJiBLcnp5c3p0b2YgR2FudHprZSA8ay5nYW50emtlQG1laWxoYXVzLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEZXZpY2UgRHJpdmVyIE1vZHVsZSBmb3IgTUUtNDZ4eCBEZXZpY2VzIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiTWVpbGhhdXMgTUUtNDZ4eCBEZXZpY2VzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8vIEV4cG9ydCB0aGUgY29uc3RydWN0b3IuCitFWFBPUlRfU1lNQk9MKG1lNDYwMF9wY2lfY29uc3RydWN0b3IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9kZXZpY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE4MTJkNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGV2aWNlLmgKQEAgLTAsMCArMSwxNTEgQEAKKy8qKgorICogQGZpbGUgbWU0NjAwX2RldmljZS5oCisgKgorICogQGJyaWVmIE1FLTQ2MDAgZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FNDYwMF9ERVZJQ0VfSAorI2RlZmluZSBfTUU0NjAwX0RFVklDRV9ICisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSAibWVkZXZpY2UuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgU3RydWN0dXJlIGhvbGRpbmcgTUUtNDYwMCBkZXZpY2UgY2FwYWJpbGl0aWVzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTQ2MDBfdmVyc2lvbiB7CisJdWludDE2X3QgZGV2aWNlX2lkOworCXVuc2lnbmVkIGludCBkb19zdWJkZXZpY2VzOworCXVuc2lnbmVkIGludCBkaV9zdWJkZXZpY2VzOworCXVuc2lnbmVkIGludCBkaW9fc3ViZGV2aWNlczsKKwl1bnNpZ25lZCBpbnQgY3RyX3N1YmRldmljZXM7CisJdW5zaWduZWQgaW50IGFpX3N1YmRldmljZXM7CisJdW5zaWduZWQgaW50IGFpX2NoYW5uZWxzOworCXVuc2lnbmVkIGludCBhaV9yYW5nZXM7CisJdW5zaWduZWQgaW50IGFpX2lzb2xhdGVkOworCXVuc2lnbmVkIGludCBhaV9zaDsKKwl1bnNpZ25lZCBpbnQgYW9fc3ViZGV2aWNlczsKKwl1bnNpZ25lZCBpbnQgYW9fZmlmbzsJLy9Ib3cgbWFueSBkZXZpY2VzIGhhdmUgRklGTworCXVuc2lnbmVkIGludCBleHRfaXJxX3N1YmRldmljZXM7Cit9IG1lNDYwMF92ZXJzaW9uX3Q7CisKKy8qKgorICogQGJyaWVmIE1FLTQ2MDAgZGV2aWNlIGNhcGFiaWxpdGllcy4KKyAqLworc3RhdGljIG1lNDYwMF92ZXJzaW9uX3QgbWU0NjAwX3ZlcnNpb25zW10gPSB7CisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjEwLCAwLCAwLCA0LCAzLCAxLCAxNiwgMSwgMCwgMCwgMCwgMCwgMX0sCisKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NTAsIDAsIDAsIDQsIDAsIDEsIDE2LCA0LCAwLCAwLCAwLCAwLCAxfSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MCwgMCwgMCwgNCwgMywgMSwgMTYsIDQsIDAsIDAsIDIsIDAsIDF9LAorCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MEksIDEsIDEsIDIsIDMsIDEsIDE2LCA0LCAxLCAwLCAyLCAwLCAxfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjBTLCAwLCAwLCA0LCAzLCAxLCAxNiwgNCwgMCwgMSwgMiwgMCwgMX0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwSVMsIDEsIDEsIDIsIDMsIDEsIDE2LCA0LCAxLCAxLCAyLCAwLCAxfSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MCwgMCwgMCwgNCwgMywgMSwgMzIsIDQsIDAsIDAsIDQsIDAsIDF9LAorCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MEksIDEsIDEsIDIsIDMsIDEsIDMyLCA0LCAxLCAwLCA0LCAwLCAxfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBTLCAwLCAwLCA0LCAzLCAxLCAzMiwgNCwgMCwgMSwgNCwgMCwgMX0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwSVMsIDEsIDEsIDIsIDMsIDEsIDMyLCA0LCAxLCAxLCA0LCAwLCAxfSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY4MCwgMCwgMCwgNCwgMywgMSwgMzIsIDQsIDAsIDAsIDQsIDQsIDF9LAorCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY4MEksIDEsIDEsIDIsIDMsIDEsIDMyLCA0LCAxLCAwLCA0LCA0LCAxfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBTLCAwLCAwLCA0LCAzLCAxLCAzMiwgNCwgMCwgMSwgNCwgNCwgMX0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwSVMsIDEsIDEsIDIsIDMsIDEsIDMyLCA0LCAxLCAxLCA0LCA0LCAxfSwKKworCXswfSwKK307CisKKyNkZWZpbmUgTUU0NjAwX0RFVklDRV9WRVJTSU9OUyAoc2l6ZW9mKG1lNDYwMF92ZXJzaW9ucykgLyBzaXplb2YobWU0NjAwX3ZlcnNpb25fdCkgLSAxKQkvKio8IFJldHVybnMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluICNtZTQ2MDBfdmVyc2lvbnMuICovCisKKy8qKgorICogQGJyaWVmIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBkZXZpY2UgZW50cnkgaW4gI21lNDYwMF92ZXJzaW9ucy4KKyAqCisgKiBAcGFyYW0gZGV2aWNlX2lkIFRoZSBQQ0kgZGV2aWNlIGlkIG9mIHRoZSBkZXZpY2UgdG8gcXVlcnkuCisgKiBAcmV0dXJuIFRoZSBpbmRleCBvZiB0aGUgZGV2aWNlIGluICNtZTQ2MDBfdmVyc2lvbnMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG1lNDYwMF92ZXJzaW9uc19nZXRfZGV2aWNlX2luZGV4KHVpbnQxNl90IGRldmljZV9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgTUU0NjAwX0RFVklDRV9WRVJTSU9OUzsgaSsrKQorCQlpZiAobWU0NjAwX3ZlcnNpb25zW2ldLmRldmljZV9pZCA9PSBkZXZpY2VfaWQpCisJCQlicmVhazsKKwlyZXR1cm4gaTsKK30KKworLyoqCisgKiBAYnJpZWYgVGhlIE1FLTQ2MDAgZGV2aWNlIGNsYXNzIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWU0NjAwX2RldmljZSB7CisJbWVfZGV2aWNlX3QgYmFzZTsJCQkJCS8qKjwgVGhlIE1laWxoYXVzIGRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQ2hpbGQgY2xhc3MgYXR0cmlidXRlcy4gKi8KKwlzcGlubG9ja190IHByZWxvYWRfcmVnX2xvY2s7CQkvKio8IEd1YXJkcyB0aGUgcHJlbG9hZCByZWdpc3RlciBvZiB0aGUgYW5hb2xvZyBvdXRwdXQgZGV2aWNlcy4gKi8KKwl1bnNpZ25lZCBpbnQgcHJlbG9hZF9mbGFnczsJCQkvKio8IFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCAjcHJlbG9hZF9yZWdfbG9jay4gKi8KKwlzcGlubG9ja190IGRpb19sb2NrOwkJCQkvKio8IExvY2tzIHRoZSBjb250cm9sIHJlZ2lzdGVyIG9mIHRoZSBkaWdpdGFsIGlucHV0L291dHB1dCBzdWJkZXZpY2VzLiAqLworCXNwaW5sb2NrX3QgYWlfY3RybF9sb2NrOwkJCS8qKjwgTG9ja3MgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgb2YgdGhlIGFuYWxvZyBpbnB1dCBzdWJkZXZpY2UuICovCisJc3BpbmxvY2tfdCBjdHJfY3RybF9yZWdfbG9jazsJCS8qKjwgTG9ja3MgdGhlIGNvdW50ZXIgY29udHJvbCByZWdpc3Rlci4gKi8KKwlzcGlubG9ja190IGN0cl9jbGtfc3JjX3JlZ19sb2NrOwkvKio8IE5vdCB1c2VkIG9uIHRoaXMgZGV2aWNlIGJ1dCBuZWVkZWQgZm9yIHRoZSBtZTgyNTQgc3ViZGV2aWNlIGNvbnN0cnVjdG9yIGNhbGwuICovCit9IG1lNDYwMF9kZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIE1FLTQ2MDAgZGV2aWNlIGNsYXNzIGNvbnN0cnVjdG9yLgorICoKKyAqIEBwYXJhbSBwY2lfZGV2aWNlIFRoZSBwY2kgZGV2aWNlIHN0cnVjdHVyZSBnaXZlbiBieSB0aGUgUENJIHN1YnN5c3RlbS4KKyAqIEBwYXJhbSBtZV9ib3NjaF9mdyBJZiBzZXQgdGhlIGRldmljZSBzaGFsbCB1c2UgdGhlIGJvc2NoIGZpcm13YXJlLiAoT25seSBmb3Igc3BlY2lhbCBCT1NDSCBidWlsZCkKKyAqCisgKiBAcmV0dXJuIE9uIHN1Y2NlcyBhIG5ldyBNRS00NjAwIGRldmljZSBpbnN0YW5jZS4gXG4KKyAqICAgICAgICAgTlVMTCBvbiBlcnJvci4KKyAqLworCisjaWZkZWYgQk9TQ0gKKy8qKgorICogQGJyaWVmIFRoZSBNRS00NjAwIGRldmljZSBjbGFzcyBjb25zdHJ1Y3Rvci4KKyAqCisgKiBAcGFyYW0gcGNpX2RldmljZSBUaGUgcGNpIGRldmljZSBzdHJ1Y3R1cmUgZ2l2ZW4gYnkgdGhlIFBDSSBzdWJzeXN0ZW0uCisgKiBAcGFyYW0gbWVfYm9zY2hfZncgSWYgc2V0IHRoZSBkZXZpY2Ugc2hhbGwgdXNlIHRoZSBib3NjaCBmaXJtd2FyZS4KKyAqCisgKiBAcmV0dXJuIE9uIHN1Y2NlcyBhIG5ldyBNRS00NjAwIGRldmljZSBpbnN0YW5jZS4gXG4KKyAqICAgICAgICAgTlVMTCBvbiBlcnJvci4KKyAqLworbWVfZGV2aWNlX3QgKm1lNDYwMF9wY2lfY29uc3RydWN0b3Ioc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2UsIGludCBtZV9ib3NjaF9mdykKKyAgICBfX2F0dHJpYnV0ZV9fICgod2VhaykpOworI2Vsc2UgLy9+Qk9TQ0gKKy8qKgorICogQGJyaWVmIFRoZSBNRS00NjAwIGRldmljZSBjbGFzcyBjb25zdHJ1Y3Rvci4KKyAqCisgKiBAcGFyYW0gcGNpX2RldmljZSBUaGUgcGNpIGRldmljZSBzdHJ1Y3R1cmUgZ2l2ZW4gYnkgdGhlIFBDSSBzdWJzeXN0ZW0uCisgKgorICogQHJldHVybiBPbiBzdWNjZXMgYSBuZXcgTUUtNDYwMCBkZXZpY2UgaW5zdGFuY2UuIFxuCisgKiAgICAgICAgIE5VTEwgb24gZXJyb3IuCisgKi8KK21lX2RldmljZV90ICptZTQ2MDBfcGNpX2NvbnN0cnVjdG9yKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlKQorICAgIF9fYXR0cmlidXRlX18gKCh3ZWFrKSk7CisjZW5kaWYKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGkuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTNjOWY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9kaS5jCkBAIC0wLDAgKzEsMjU2IEBACisvKioKKyAqIEBmaWxlIG1lNDYwMF9kaS5jCisgKgorICogQGJyaWVmIE1FLTQwMDAgZGlnaXRhbCBpbnB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKy8qCisgKiBJbmNsdWRlcworICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZTQ2MDBfZGlvX3JlZy5oIgorI2luY2x1ZGUgIm1lNDYwMF9kaS5oIgorCisvKgorICogRGVmaW5lcworICovCisKKy8qCisgKiBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW50IG1lNDYwMF9kaV9pb19yZXNldF9zdWJkZXZpY2Uoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTQ2MDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQzMl90IG1vZGU7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfZGlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwltb2RlID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJbW9kZSAmPSB+KE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8yIHwgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzMpOwkvLzB4RkZGMworCW91dGwobW9kZSwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgbW9kZSk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCisJb3V0bCgwLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCVBERUJVR19SRUcoInBvcnRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnBvcnRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2RpX2lvX3NpbmdsZV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCBzaW5nbGVfY29uZmlnLAorCQkJCSAgICAgIGludCByZWYsCisJCQkJICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICBpbnQgdHJpZ190eXBlLCBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWU0NjAwX2RpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9kaV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fSU5QVVQpIHsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHBvcnQgZGlyZWN0aW9uIHNwZWNpZmllZC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTQ2MDBfZGlfaW9fc2luZ2xlX3JlYWQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IGNoYW5uZWwsCisJCQkJICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lNDYwMF9kaV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfZGlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCSp2YWx1ZSA9IGlubChpbnN0YW5jZS0+cG9ydF9yZWcpICYgKDB4MSA8PCBjaGFubmVsKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJKnZhbHVlID0gaW5sKGluc3RhbmNlLT5wb3J0X3JlZykgJiAweEZGOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTQ2MDBfZGlfcXVlcnlfbnVtYmVyX2NoYW5uZWxzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm51bWJlciA9IDg7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2RpX3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqdHlwZSA9IE1FX1RZUEVfREk7CisJKnN1YnR5cGUgPSBNRV9TVUJUWVBFX1NJTkdMRTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTQ2MDBfZGlfcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPSAwOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCittZTQ2MDBfZGlfc3ViZGV2aWNlX3QgKm1lNDYwMF9kaV9jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJICAgICBzcGlubG9ja190ICogY3RybF9yZWdfbG9jaykKK3sKKwltZTQ2MDBfZGlfc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwlpbnQgZXJyOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UgKi8KKwlzdWJkZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTQ2MDBfZGlfc3ViZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghc3ViZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc3ViZGV2aWNlLCAwLCBzaXplb2YobWU0NjAwX2RpX3N1YmRldmljZV90KSk7CisKKwkvKiBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzICovCisJZXJyID0gbWVfc3ViZGV2aWNlX2luaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlzdWJkZXZpY2UtPmN0cmxfcmVnX2xvY2sgPSBjdHJsX3JlZ19sb2NrOworCisJLyogU2F2ZSB0aGUgc3ViZGV2aWNlIGluZGV4ICovCisJc3ViZGV2aWNlLT5wb3J0X3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0RJT19QT1JUXzFfUkVHOworCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9ESU9fQ1RSTF9SRUc7CisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwlzdWJkZXZpY2UtPnJlZ19iYXNlID0gcmVnX2Jhc2U7CisjZW5kaWYKKworCS8qIE92ZXJsb2FkIGJhc2UgY2xhc3MgbWV0aG9kcy4gKi8KKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSA9CisJICAgIG1lNDYwMF9kaV9pb19yZXNldF9zdWJkZXZpY2U7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfY29uZmlnID0KKwkgICAgbWU0NjAwX2RpX2lvX3NpbmdsZV9jb25maWc7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfcmVhZCA9IG1lNDYwMF9kaV9pb19zaW5nbGVfcmVhZDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lNDYwMF9kaV9xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lNDYwMF9kaV9xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWU0NjAwX2RpX3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCisJcmV0dXJuIHN1YmRldmljZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGkuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzhiMTc1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9kaS5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qKgorICogQGZpbGUgbWU0NjAwX2RpLmgKKyAqCisgKiBAYnJpZWYgTUUtNDAwMCBkaWdpdGFsIGlucHV0IHN1YmRldmljZSBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTQ2MDBfRElfSF8KKyNkZWZpbmUgX01FNDYwMF9ESV9IXworCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgVGhlIHRlbXBsYXRlIHN1YmRldmljZSBjbGFzcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWU0NjAwX2RpX3N1YmRldmljZSB7CisJLyogSW5oZXJpdGFuY2UgKi8KKwltZV9zdWJkZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0IHRoZSBzdWJkZXZpY2UgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwlzcGlubG9ja190ICpjdHJsX3JlZ19sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCAjY3RybF9yZWcgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKworCXVuc2lnbmVkIGxvbmcgcG9ydF9yZWc7CQkJLyoqPCBSZWdpc3RlciBob2xkaW5nIHRoZSBwb3J0IHN0YXR1cy4gKi8KKwl1bnNpZ25lZCBsb25nIGN0cmxfcmVnOwkJCS8qKjwgUmVnaXN0ZXIgdG8gY29uZmlndXJlIHRoZSBwb3J0IGRpcmVjdGlvbi4gKi8KKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2U7CisjZW5kaWYKK30gbWU0NjAwX2RpX3N1YmRldmljZV90OworCisvKioKKyAqIEBicmllZiBUaGUgY29uc3RydWN0b3IgdG8gZ2VuZXJhdGUgYSBNRS00MDAwIGRpZ2l0YWwgaW5wdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICoKKyAqIEBwYXJhbSByZWdfYmFzZSBUaGUgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgYXMgcmV0dXJuZWQgYnkgdGhlIFBDSSBCSU9TLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWU0NjAwX2RpX3N1YmRldmljZV90ICptZTQ2MDBfZGlfY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgc3BpbmxvY2tfdCAqIGN0cmxfcmVnX2xvY2spOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9kaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFmOTVkMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGlvLmMKQEAgLTAsMCArMSw1MTAgQEAKKy8qKgorICogQGZpbGUgbWU0NjAwX2Rpby5jCisgKgorICogQGJyaWVmIE1FLTQwMDAgZGlnaXRhbCBpbnB1dC9vdXRwdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvKgorICogSW5jbHVkZXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWU0NjAwX2Rpb19yZWcuaCIKKyNpbmNsdWRlICJtZTQ2MDBfZGlvLmgiCisKKy8qCisgKiBEZWZpbmVzCisgKi8KKworLyoKKyAqIEZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbnQgbWU0NjAwX2Rpb19pb19yZXNldF9zdWJkZXZpY2Uoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2Rpb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdWludDMyX3QgbW9kZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9kaW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwkvKiBTZXQgcG9ydCB0byBpbnB1dCBtb2RlICovCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJbW9kZSA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCW1vZGUgJj0KKwkgICAgfigoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfCBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSkgPDwKKwkgICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSk7CisJb3V0bChtb2RlLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBtb2RlKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisKKwlvdXRsKDAsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJUERFQlVHX1JFRygicG9ydF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+cG9ydF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDApOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTQ2MDBfZGlvX2lvX3NpbmdsZV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgIGludCBzaW5nbGVfY29uZmlnLAorCQkJCSAgICAgICBpbnQgcmVmLAorCQkJCSAgICAgICBpbnQgdHJpZ19jaGFuLAorCQkJCSAgICAgICBpbnQgdHJpZ190eXBlLCBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2Rpb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdWludDMyX3QgbW9kZTsKKwl1aW50MzJfdCBzaXplID0KKwkgICAgZmxhZ3MgJiAoTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fQklUIHwgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fQllURQorCQkgICAgIHwgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fV09SRCB8CisJCSAgICAgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fRFdPUkQpOworCXVpbnQzMl90IG1hc2s7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfZGlvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUiBzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwltb2RlID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJc3dpdGNoIChzaXplKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fSU5QVVQpIHsKKwkJCQltb2RlICY9CisJCQkJICAgIH4oKE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkgICAgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEpIDw8CisJCQkJICAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCQkJfSBlbHNlIGlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfRElPX09VVFBVVCkgeworCQkJCW1vZGUgJj0KKwkJCQkgICAgfigoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCSAgICAgICBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSkgPDwKKwkJCQkgICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSk7CisJCQkJbW9kZSB8PQorCQkJCSAgICBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCA8PCAoaW5zdGFuY2UtPgorCQkJCQkJCQkgICBkaW9faWR4ICogMik7CisJCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fTVVYMzJNKSB7CisJCQkJbWFzayA9CisJCQkJICAgIChNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJICAgICBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSkgPDwgKGluc3RhbmNlLT4KKwkJCQkJCQkJICAgICBkaW9faWR4ICoKKwkJCQkJCQkJICAgICAyKTsKKwkJCQltYXNrIHw9CisJCQkJICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRlVOQ1RJT05fMCB8CisJCQkJICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRlVOQ1RJT05fMTsKKwkJCQltYXNrIHw9CisJCQkJICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRklGT19ISUdIXzAgPDwKKwkJCQkgICAgaW5zdGFuY2UtPmRpb19pZHg7CisJCQkJbW9kZSAmPSB+bWFzazsKKworCQkJCWlmIChyZWYgPT0gTUVfUkVGX0RJT19GSUZPX0xPVykgeworCQkJCQltb2RlIHw9CisJCQkJCSAgICAoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCQkgICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCQkgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMik7CisJCQkJCW1vZGUgfD0gTUU0NjAwX0RJT19DVFJMX0JJVF9GVU5DVElPTl8xOworCQkJCX0gZWxzZSBpZiAocmVmID09IE1FX1JFRl9ESU9fRklGT19ISUdIKSB7CisJCQkJCW1vZGUgfD0KKwkJCQkJICAgIChNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCSAgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEpIDw8CisJCQkJCSAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKTsKKwkJCQkJbW9kZSB8PSBNRTQ2MDBfRElPX0NUUkxfQklUX0ZVTkNUSU9OXzE7CisJCQkJCW1vZGUgfD0KKwkJCQkJICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRklGT19ISUdIXzAgPDwKKwkJCQkJICAgIGluc3RhbmNlLT5kaW9faWR4OworCQkJCX0gZWxzZSB7CisJCQkJCVBFUlJPUgorCQkJCQkgICAgKCJJbnZhbGlkIHBvcnQgcmVmZXJlbmNlIHNwZWNpZmllZC5cbiIpOworCQkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NJTkdMRV9DT05GSUc7CisJCQkJfQorCQkJfSBlbHNlIGlmIChzaW5nbGVfY29uZmlnID09CisJCQkJICAgTUVfU0lOR0xFX0NPTkZJR19ESU9fREVNVVgzMikgeworCQkJCW1hc2sgPQorCQkJCSAgICAoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCSAgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEpIDw8IChpbnN0YW5jZS0+CisJCQkJCQkJCSAgICAgZGlvX2lkeCAqCisJCQkJCQkJCSAgICAgMik7CisJCQkJbWFzayB8PQorCQkJCSAgICBNRTQ2MDBfRElPX0NUUkxfQklUX0ZVTkNUSU9OXzAgfAorCQkJCSAgICBNRTQ2MDBfRElPX0NUUkxfQklUX0ZVTkNUSU9OXzE7CisJCQkJbWFzayB8PQorCQkJCSAgICBNRTQ2MDBfRElPX0NUUkxfQklUX0ZJRk9fSElHSF8wIDw8CisJCQkJICAgIGluc3RhbmNlLT5kaW9faWR4OworCQkJCW1vZGUgJj0gfm1hc2s7CisKKwkJCQlpZiAocmVmID09IE1FX1JFRl9ESU9fRklGT19MT1cpIHsKKwkJCQkJbW9kZSB8PQorCQkJCQkgICAgKE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkJICAgICBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSkgPDwKKwkJCQkJICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpOworCQkJCQltb2RlIHw9IE1FNDYwMF9ESU9fQ1RSTF9CSVRfRlVOQ1RJT05fMDsKKwkJCQl9IGVsc2UgaWYgKHJlZiA9PSBNRV9SRUZfRElPX0ZJRk9fSElHSCkgeworCQkJCQltb2RlIHw9CisJCQkJCSAgICAoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCQkgICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCQkgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMik7CisJCQkJCW1vZGUgfD0gTUU0NjAwX0RJT19DVFJMX0JJVF9GVU5DVElPTl8wOworCQkJCQltb2RlIHw9CisJCQkJCSAgICBNRTQ2MDBfRElPX0NUUkxfQklUX0ZJRk9fSElHSF8wIDw8CisJCQkJCSAgICBpbnN0YW5jZS0+ZGlvX2lkeDsKKwkJCQl9IGVsc2UgeworCQkJCQlQRVJST1IKKwkJCQkJICAgICgiSW52YWxpZCBwb3J0IHJlZmVyZW5jZSBzcGVjaWZpZWQuXG4iKTsKKwkJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoc2luZ2xlX2NvbmZpZyA9PQorCQkJCSAgIE1FX1NJTkdMRV9DT05GSUdfRElPX0JJVF9QQVRURVJOKSB7CisJCQkJbWFzayA9CisJCQkJICAgIChNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJICAgICBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSkgPDwgKGluc3RhbmNlLT4KKwkJCQkJCQkJICAgICBkaW9faWR4ICoKKwkJCQkJCQkJICAgICAyKTsKKwkJCQltYXNrIHw9CisJCQkJICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRlVOQ1RJT05fMCB8CisJCQkJICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRlVOQ1RJT05fMTsKKwkJCQltYXNrIHw9CisJCQkJICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRklGT19ISUdIXzAgPDwKKwkJCQkgICAgaW5zdGFuY2UtPmRpb19pZHg7CisJCQkJbW9kZSAmPSB+bWFzazsKKworCQkJCWlmIChyZWYgPT0gTUVfUkVGX0RJT19GSUZPX0xPVykgeworCQkJCQltb2RlIHw9CisJCQkJCSAgICAoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCQkgICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCQkgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMik7CisJCQkJfSBlbHNlIGlmIChyZWYgPT0gTUVfUkVGX0RJT19GSUZPX0hJR0gpIHsKKwkJCQkJbW9kZSB8PQorCQkJCQkgICAgKE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkJICAgICBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSkgPDwKKwkJCQkJICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpOworCQkJCQltb2RlIHw9CisJCQkJCSAgICBNRTQ2MDBfRElPX0NUUkxfQklUX0ZJRk9fSElHSF8wIDw8CisJCQkJCSAgICBpbnN0YW5jZS0+ZGlvX2lkeDsKKwkJCQl9IGVsc2UgeworCQkJCQlQRVJST1IKKwkJCQkJICAgICgiSW52YWxpZCBwb3J0IHJlZmVyZW5jZSBzcGVjaWZpZWQuXG4iKTsKKwkJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SCisJCQkJICAgICgiSW52YWxpZCBwb3J0IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncy5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICghZXJyKSB7CisJCW91dGwobW9kZSwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgbW9kZSk7CisJfQorCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTQ2MDBfZGlvX2lvX3NpbmdsZV9yZWFkKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTQ2MDBfZGlvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1aW50MzJfdCBtb2RlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2Rpb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQklUOgorCQlpZiAoKGNoYW5uZWwgPj0gMCkgJiYgKGNoYW5uZWwgPCA4KSkgeworCQkJbW9kZSA9CisJCQkgICAgaW5sKGluc3RhbmNlLT4KKwkJCQljdHJsX3JlZykgJiAoKE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkJICAgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEpIDw8CisJCQkJCSAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCQkJaWYgKChtb2RlID09CisJCQkgICAgIChNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCA8PAorCQkJICAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpKSB8fCAhbW9kZSkgeworCQkJCSp2YWx1ZSA9CisJCQkJICAgIGlubChpbnN0YW5jZS0+cG9ydF9yZWcpICYgKDB4MSA8PCBjaGFubmVsKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJQb3J0IG5vdCBpbiBvdXRwdXQgb3IgaW5wdXQgbW9kZS5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJbW9kZSA9CisJCQkgICAgaW5sKGluc3RhbmNlLT4KKwkJCQljdHJsX3JlZykgJiAoKE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkJICAgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEpIDw8CisJCQkJCSAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCQkJaWYgKChtb2RlID09CisJCQkgICAgIChNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCA8PAorCQkJICAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpKSB8fCAhbW9kZSkgeworCQkJCSp2YWx1ZSA9IGlubChpbnN0YW5jZS0+cG9ydF9yZWcpICYgMHhGRjsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJQb3J0IG5vdCBpbiBvdXRwdXQgb3IgaW5wdXQgbW9kZS5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBieXRlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9kaW9faW9fc2luZ2xlX3dyaXRlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lNDYwMF9kaW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQzMl90IG1vZGU7CisJdWludDMyX3QgYnl0ZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9kaW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCW1vZGUgPQorCQkJICAgIGlubChpbnN0YW5jZS0+CisJCQkJY3RybF9yZWcpICYgKChNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCSAgICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKworCQkJaWYgKG1vZGUgPT0KKwkJCSAgICAoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgPDwKKwkJCSAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpKSB7CisJCQkJYnl0ZSA9IGlubChpbnN0YW5jZS0+cG9ydF9yZWcpICYgMHhGRjsKKworCQkJCWlmICh2YWx1ZSkKKwkJCQkJYnl0ZSB8PSAweDEgPDwgY2hhbm5lbDsKKwkJCQllbHNlCisJCQkJCWJ5dGUgJj0gfigweDEgPDwgY2hhbm5lbCk7CisKKwkJCQlvdXRsKGJ5dGUsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiUG9ydCBub3QgaW4gb3V0cHV0IG9yIGlucHV0IG1vZGUuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCW1vZGUgPQorCQkJICAgIGlubChpbnN0YW5jZS0+CisJCQkJY3RybF9yZWcpICYgKChNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCSAgICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKworCQkJaWYgKG1vZGUgPT0KKwkJCSAgICAoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgPDwKKwkJCSAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpKSB7CisJCQkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJQb3J0IG5vdCBpbiBvdXRwdXQgb3IgaW5wdXQgbW9kZS5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBieXRlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9kaW9fcXVlcnlfbnVtYmVyX2NoYW5uZWxzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICAgaW50ICpudW1iZXIpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpudW1iZXIgPSA4OworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9kaW9fcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqdHlwZSA9IE1FX1RZUEVfRElPOworCSpzdWJ0eXBlID0gTUVfU1VCVFlQRV9TSU5HTEU7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2Rpb19xdWVyeV9zdWJkZXZpY2VfY2FwcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgaW50ICpjYXBzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqY2FwcyA9IE1FX0NBUFNfRElPX0RJUl9CWVRFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCittZTQ2MDBfZGlvX3N1YmRldmljZV90ICptZTQ2MDBfZGlvX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IGRpb19pZHgsCisJCQkJCSAgICAgICBzcGlubG9ja190ICogY3RybF9yZWdfbG9jaykKK3sKKwltZTQ2MDBfZGlvX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlICovCisJc3ViZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWU0NjAwX2Rpb19zdWJkZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFzdWJkZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzdWJkZXZpY2UsIDAsIHNpemVvZihtZTQ2MDBfZGlvX3N1YmRldmljZV90KSk7CisKKwkvKiBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzICovCisJZXJyID0gbWVfc3ViZGV2aWNlX2luaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3ViZGV2aWNlLT5jdHJsX3JlZ19sb2NrID0gY3RybF9yZWdfbG9jazsKKworCS8qIFNhdmUgZGlnaXRhbCBpL28gaW5kZXggKi8KKwlzdWJkZXZpY2UtPmRpb19pZHggPSBkaW9faWR4OworCisJLyogU2F2ZSB0aGUgc3ViZGV2aWNlIGluZGV4ICovCisJc3ViZGV2aWNlLT5jdHJsX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0RJT19DVFJMX1JFRzsKKwlzdWJkZXZpY2UtPnBvcnRfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfRElPX1BPUlRfUkVHICsgKGRpb19pZHggKiA0KTsKKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKyNlbmRpZgorCisJLyogT3ZlcmxvYWQgYmFzZSBjbGFzcyBtZXRob2RzLiAqLworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWU0NjAwX2Rpb19pb19yZXNldF9zdWJkZXZpY2U7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfY29uZmlnID0KKwkgICAgbWU0NjAwX2Rpb19pb19zaW5nbGVfY29uZmlnOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3JlYWQgPSBtZTQ2MDBfZGlvX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0KKwkgICAgbWU0NjAwX2Rpb19pb19zaW5nbGVfd3JpdGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMgPQorCSAgICBtZTQ2MDBfZGlvX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWU0NjAwX2Rpb19xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWU0NjAwX2Rpb19xdWVyeV9zdWJkZXZpY2VfY2FwczsKKworCXJldHVybiBzdWJkZXZpY2U7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2Rpby5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9kaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjI1YmE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9kaW8uaApAQCAtMCwwICsxLDY5IEBACisvKioKKyAqIEBmaWxlIG1lNDYwMF9kaW8uaAorICoKKyAqIEBicmllZiBNRS00MDAwIGRpZ2l0YWwgaW5wdXQvb3V0cHV0IHN1YmRldmljZSBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTQ2MDBfRElPX0hfCisjZGVmaW5lIF9NRTQ2MDBfRElPX0hfCisKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgdGVtcGxhdGUgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTQ2MDBfZGlvX3N1YmRldmljZSB7CisJLyogSW5oZXJpdGFuY2UgKi8KKwltZV9zdWJkZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0IHRoZSBzdWJkZXZpY2UgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwlzcGlubG9ja190ICpjdHJsX3JlZ19sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCAjY3RybF9yZWcgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwl1bnNpZ25lZCBpbnQgZGlvX2lkeDsJCQkvKio8IFRoZSBpbmRleCBvZiB0aGUgZGlnaXRhbCBpL28gb24gdGhlIGRldmljZS4gKi8KKworCS8qIFJlZ2lzdGVycyAqLworCXVuc2lnbmVkIGxvbmcgcG9ydF9yZWc7CQkJLyoqPCBSZWdpc3RlciBob2xkaW5nIHRoZSBwb3J0IHN0YXR1cy4gKi8KKwl1bnNpZ25lZCBsb25nIGN0cmxfcmVnOwkJCS8qKjwgUmVnaXN0ZXIgdG8gY29uZmlndXJlIHRoZSBwb3J0IGRpcmVjdGlvbi4gKi8KKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2U7CisjZW5kaWYKK30gbWU0NjAwX2Rpb19zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgTUUtNDAwMCBkaWdpdGFsIGlucHV0L291cHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gcmVnX2Jhc2UgVGhlIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGFzIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUy4KKyAqIEBwYXJhbSBkaW9faWR4IFRoZSBpbmRleCBvZiB0aGUgZGlnaXRhbCBpL28gcG9ydCBvbiB0aGUgZGV2aWNlLgorICogQHBhcmFtIGN0cmxfcmVnX2xvY2sgU3BpbiBsb2NrIHByb3RlY3RpbmcgdGhlIGNvbnRyb2wgcmVnaXN0ZXIuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLlxuCisgKiBOVUxMIG9uIGVycm9yLgorICovCittZTQ2MDBfZGlvX3N1YmRldmljZV90ICptZTQ2MDBfZGlvX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IGRpb19pZHgsCisJCQkJCSAgICAgICBzcGlubG9ja190ICogY3RybF9yZWdfbG9jayk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2Rpb19yZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZGlvX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNDAxNmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2Rpb19yZWcuaApAQCAtMCwwICsxLDYzIEBACisvKioKKyAqIEBmaWxlIG1lNDYwMF9kaW9fcmVnLmgKKyAqCisgKiBAYnJpZWYgTUUtNDAwMCBkaWdpdGFsIGlucHV0L291dHB1dCBzdWJkZXZpY2UgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU0NjAwX0RJT19SRUdfSF8KKyNkZWZpbmUgX01FNDYwMF9ESU9fUkVHX0hfCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgTUU0NjAwX0RJT19QT1JUXzBfUkVHCQkJCTB4QTAJCQkJCS8qKjwgUG9ydCAwIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTQ2MDBfRElPX1BPUlRfMV9SRUcJCQkJMHhBNAkJCQkJLyoqPCBQb3J0IDEgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FNDYwMF9ESU9fUE9SVF8yX1JFRwkJCQkweEE4CQkJCQkvKio8IFBvcnQgMiByZWdpc3Rlci4gKi8KKyNkZWZpbmUgTUU0NjAwX0RJT19QT1JUXzNfUkVHCQkJCTB4QUMJCQkJCS8qKjwgUG9ydCAzIHJlZ2lzdGVyLiAqLworCisjZGVmaW5lIE1FNDYwMF9ESU9fRElSX1JFRwkJCQkJMHhCMAkJCQkJLyoqPCBEaXJlY3Rpb24gcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FNDYwMF9ESU9fUE9SVF9SRUcJCQkJCU1FNDYwMF9ESU9fUE9SVF8wX1JFRwkvKio8IEJhc2UgZm9yIHBvcnQncyByZWdpc3Rlci4gKi8KKworI2RlZmluZSBNRTQ2MDBfRElPX0NUUkxfUkVHCQkJCQkweEI4CQkJCQkvKio8IENvbnRyb2wgcmVnaXN0ZXIuICovCisvKiogUG9ydCBBIC0gRE8gKi8KKyNkZWZpbmUgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAJCQkweDAwMDEKKyNkZWZpbmUgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEJCQkweDAwMDIKKy8qKiBQb3J0IEIgLSBESSAqLworI2RlZmluZSBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMgkJCTB4MDAwNAorI2RlZmluZSBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMwkJCTB4MDAwOAorLyoqIFBvcnQgQyAtIERJTyAqLworI2RlZmluZSBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfNAkJCTB4MDAxMAorI2RlZmluZSBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfNQkJCTB4MDAyMAorLyoqIFBvcnQgRCAtIERJTyAqLworI2RlZmluZSBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfNgkJCTB4MDA0MAorI2RlZmluZSBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfNwkJCTB4MDA4MAorCisjZGVmaW5lIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRlVOQ1RJT05fMAkJMHgwMTAwCisjZGVmaW5lIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRlVOQ1RJT05fMQkJMHgwMjAwCisKKyNkZWZpbmUgTUU0NjAwX0RJT19DVFJMX0JJVF9GSUZPX0hJR0hfMAkJMHgwNDAwCisjZGVmaW5lIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRklGT19ISUdIXzEJCTB4MDgwMAorI2RlZmluZSBNRTQ2MDBfRElPX0NUUkxfQklUX0ZJRk9fSElHSF8yCQkweDEwMDAKKyNkZWZpbmUgTUU0NjAwX0RJT19DVFJMX0JJVF9GSUZPX0hJR0hfMwkJMHgyMDAwCisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2RvLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2RvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU1OTFiYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfZG8uYwpAQCAtMCwwICsxLDQzMyBAQAorLyoqCisgKiBAZmlsZSBtZTQ2MDBfZG8uYworICoKKyAqIEBicmllZiBNRS00MDAwIGRpZ2l0YWwgb3V0cHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworLyoKKyAqIEluY2x1ZGVzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lNDYwMF9kaW9fcmVnLmgiCisjaW5jbHVkZSAibWU0NjAwX2RvLmgiCisKKy8qCisgKiBEZWZpbmVzCisgKi8KKworLyoKKyAqIEZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbnQgbWU0NjAwX2RvX2lvX3Jlc2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCXN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGZsYWdzKQoreworCW1lNDYwMF9kb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdWludDMyX3QgbW9kZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9kb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCS8qIFNldCBwb3J0IHRvIG91dHB1dCBtb2RlICovCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJbW9kZSA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCW1vZGUgJj0gfk1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xOwkvLzB4RkZGRAorCW1vZGUgfD0gTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzA7CS8vMHgxCisJb3V0bChtb2RlLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBtb2RlKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisKKwlvdXRsKDAsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJUERFQlVHX1JFRygicG9ydF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+cG9ydF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDApOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTQ2MDBfZG9faW9fc2luZ2xlX2NvbmZpZyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgaW50IHNpbmdsZV9jb25maWcsCisJCQkJICAgICAgaW50IHJlZiwKKwkJCQkgICAgICBpbnQgdHJpZ19jaGFuLAorCQkJCSAgICAgIGludCB0cmlnX3R5cGUsIGludCB0cmlnX2VkZ2UsIGludCBmbGFncykKK3sKKwltZTQ2MDBfZG9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQzMl90IG1vZGU7CisJaW50IHNpemUgPQorCSAgICBmbGFncyAmIChNRV9JT19TSU5HTEVfQ09ORklHX0RJT19CSVQgfCBNRV9JT19TSU5HTEVfQ09ORklHX0RJT19CWVRFCisJCSAgICAgfCBNRV9JT19TSU5HTEVfQ09ORklHX0RJT19XT1JEIHwKKwkJICAgICBNRV9JT19TSU5HTEVfQ09ORklHX0RJT19EV09SRCk7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfZG9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJbW9kZSA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCisJc3dpdGNoIChzaXplKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fT1VUUFVUKSB7CisJCQkJbW9kZSAmPSB+KE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkJICBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSk7CisJCQkJbW9kZSB8PSAoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzApOworCQkJfSBlbHNlIGlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfRElPX01VWDMyTSkgeworCQkJCW1vZGUgJj0gfihNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCSAgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEgfAorCQkJCQkgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRlVOQ1RJT05fMCB8CisJCQkJCSAgTUU0NjAwX0RJT19DVFJMX0JJVF9GVU5DVElPTl8xIHwKKwkJCQkJICBNRTQ2MDBfRElPX0NUUkxfQklUX0ZJRk9fSElHSF8wKTsKKworCQkJCWlmIChyZWYgPT0gTUVfUkVGX0RJT19GSUZPX0xPVykgeworCQkJCQltb2RlIHw9IChNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCQkgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEgfAorCQkJCQkJIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRlVOQ1RJT05fMSk7CisJCQkJfSBlbHNlIGlmIChyZWYgPT0gTUVfUkVGX0RJT19GSUZPX0hJR0gpIHsKKwkJCQkJbW9kZSB8PSAoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCQkJIE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xIHwKKwkJCQkJCSBNRTQ2MDBfRElPX0NUUkxfQklUX0ZVTkNUSU9OXzEKKwkJCQkJCSB8CisJCQkJCQkgTUU0NjAwX0RJT19DVFJMX0JJVF9GSUZPX0hJR0hfMCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIkludmFsaWQgcG9ydCByZWZlcmVuY2Ugc3BlY2lmaWVkLlxuIik7CisJCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0KKwkJCQkgICBNRV9TSU5HTEVfQ09ORklHX0RJT19ERU1VWDMyKSB7CisJCQkJbW9kZSAmPQorCQkJCSAgICB+KE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkgICAgICBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSB8CisJCQkJICAgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9GVU5DVElPTl8wIHwKKwkJCQkgICAgICBNRTQ2MDBfRElPX0NUUkxfQklUX0ZVTkNUSU9OXzEgfAorCQkJCSAgICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRklGT19ISUdIXzApOworCisJCQkJaWYgKHJlZiA9PSBNRV9SRUZfRElPX0ZJRk9fTE9XKSB7CisJCQkJCW1vZGUgfD0gKE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkJCSBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSB8CisJCQkJCQkgTUU0NjAwX0RJT19DVFJMX0JJVF9GVU5DVElPTl8wKTsKKwkJCQl9IGVsc2UgaWYgKHJlZiA9PSBNRV9SRUZfRElPX0ZJRk9fSElHSCkgeworCQkJCQltb2RlIHw9IChNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCQkgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEgfAorCQkJCQkJIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRlVOQ1RJT05fMAorCQkJCQkJIHwKKwkJCQkJCSBNRTQ2MDBfRElPX0NUUkxfQklUX0ZJRk9fSElHSF8wKTsKKwkJCQl9IGVsc2UgeworCQkJCQlQRVJST1IKKwkJCQkJICAgICgiSW52YWxpZCBwb3J0IHJlZmVyZW5jZSBzcGVjaWZpZWQuXG4iKTsKKwkJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoc2luZ2xlX2NvbmZpZyA9PQorCQkJCSAgIE1FX1NJTkdMRV9DT05GSUdfRElPX0JJVF9QQVRURVJOKSB7CisJCQkJbW9kZSAmPQorCQkJCSAgICB+KE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkgICAgICBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSB8CisJCQkJICAgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9GVU5DVElPTl8wIHwKKwkJCQkgICAgICBNRTQ2MDBfRElPX0NUUkxfQklUX0ZVTkNUSU9OXzEgfAorCQkJCSAgICAgIE1FNDYwMF9ESU9fQ1RSTF9CSVRfRklGT19ISUdIXzApOworCisJCQkJaWYgKHJlZiA9PSBNRV9SRUZfRElPX0ZJRk9fTE9XKSB7CisJCQkJCW1vZGUgfD0gKE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkJCSBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSk7CisJCQkJfSBlbHNlIGlmIChyZWYgPT0gTUVfUkVGX0RJT19GSUZPX0hJR0gpIHsKKwkJCQkJbW9kZSB8PSAoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCQkJIE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xIHwKKwkJCQkJCSBNRTQ2MDBfRElPX0NUUkxfQklUX0ZJRk9fSElHSF8wKTsKKwkJCQl9IGVsc2UgeworCQkJCQlQRVJST1IKKwkJCQkJICAgICgiSW52YWxpZCBwb3J0IHJlZmVyZW5jZSBzcGVjaWZpZWQuXG4iKTsKKwkJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHBvcnQgZGlyZWN0aW9uIHNwZWNpZmllZC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKCFlcnIpIHsKKwkJb3V0bChtb2RlLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBtb2RlKTsKKwl9CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9kb19pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU0NjAwX2RvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1aW50MzJfdCBtb2RlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2RvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCW1vZGUgPQorCSAgICBpbmwoaW5zdGFuY2UtPgorCQljdHJsX3JlZykgJiAoTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJICAgICBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMSk7CisKKwlpZiAobW9kZSA9PSBNRTQ2MDBfRElPX0NUUkxfQklUX01PREVfMCkgeworCQlzd2l0Y2ggKGZsYWdzKSB7CisJCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDgpKSB7CisJCQkJKnZhbHVlID0KKwkJCQkgICAgaW5sKGluc3RhbmNlLT5wb3J0X3JlZykgJiAoMHgxIDw8IGNoYW5uZWwpOworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE1FX0lPX1NJTkdMRV9OT19GTEFHUzoKKwkJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJCWlmIChjaGFubmVsID09IDApIHsKKwkJCQkqdmFsdWUgPSBpbmwoaW5zdGFuY2UtPnBvcnRfcmVnKSAmIDB4RkY7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiSW52YWxpZCBieXRlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwkJfQorCX0gZWxzZSB7CisJCVBFUlJPUigiUG9ydCBub3QgaW4gb3V0cHV0IG1vZGUuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCX0KKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2RvX2lvX3NpbmdsZV93cml0ZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgaW50IHZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTQ2MDBfZG9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQzMl90IGJ5dGU7CisJdWludDMyX3QgbW9kZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lNDYwMF9kb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwltb2RlID0KKwkgICAgaW5sKGluc3RhbmNlLT4KKwkJY3RybF9yZWcpICYgKE1FNDYwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCSAgICAgTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzEpOworCisJaWYgKG1vZGUgPT0gTUU0NjAwX0RJT19DVFJMX0JJVF9NT0RFXzApIHsKKwkJc3dpdGNoIChmbGFncykgeworCisJCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDgpKSB7CisJCQkJYnl0ZSA9IGlubChpbnN0YW5jZS0+cG9ydF9yZWcpICYgMHhGRjsKKworCQkJCWlmICh2YWx1ZSkKKwkJCQkJYnl0ZSB8PSAweDEgPDwgY2hhbm5lbDsKKwkJCQllbHNlCisJCQkJCWJ5dGUgJj0gfigweDEgPDwgY2hhbm5lbCk7CisKKwkJCQlvdXRsKGJ5dGUsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCQljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CWVRFOgorCQkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJCW91dGwodmFsdWUsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiSW52YWxpZCBieXRlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwkJfQorCX0gZWxzZSB7CisJCVBFUlJPUigiUG9ydCBub3QgaW4gb3V0cHV0IG1vZGUuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCX0KKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2RvX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgaW50ICpudW1iZXIpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpudW1iZXIgPSA4OworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9kb19xdWVyeV9zdWJkZXZpY2VfdHlwZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKnR5cGUgPSBNRV9UWVBFX0RPOworCSpzdWJ0eXBlID0gTUVfU1VCVFlQRV9TSU5HTEU7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2RvX3F1ZXJ5X3N1YmRldmljZV9jYXBzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLCBpbnQgKmNhcHMpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpjYXBzID0gMDsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworbWU0NjAwX2RvX3N1YmRldmljZV90ICptZTQ2MDBfZG9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgc3BpbmxvY2tfdCAqIGN0cmxfcmVnX2xvY2spCit7CisJbWU0NjAwX2RvX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlICovCisJc3ViZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWU0NjAwX2RvX3N1YmRldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXN1YmRldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1lNDYwMF9kb19zdWJkZXZpY2VfdCkpOworCisJLyogSW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyAqLworCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9ja3MuCisJc3Bpbl9sb2NrX2luaXQoJnN1YmRldmljZS0+c3ViZGV2aWNlX2xvY2spOworCisJc3ViZGV2aWNlLT5jdHJsX3JlZ19sb2NrID0gY3RybF9yZWdfbG9jazsKKworCS8qIFNhdmUgdGhlIHN1YmRldmljZSBpbmRleCAqLworCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9ESU9fQ1RSTF9SRUc7CisJc3ViZGV2aWNlLT5wb3J0X3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0RJT19QT1JUXzBfUkVHOworI2lmZGVmIE1FREVCVUdfREVCVUdfUkVHCisJc3ViZGV2aWNlLT5yZWdfYmFzZSA9IHJlZ19iYXNlOworI2VuZGlmCisKKwkvKiBPdmVybG9hZCBiYXNlIGNsYXNzIG1ldGhvZHMuICovCisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19yZXNldF9zdWJkZXZpY2UgPQorCSAgICBtZTQ2MDBfZG9faW9fcmVzZXRfc3ViZGV2aWNlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX2NvbmZpZyA9CisJICAgIG1lNDYwMF9kb19pb19zaW5nbGVfY29uZmlnOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3JlYWQgPSBtZTQ2MDBfZG9faW9fc2luZ2xlX3JlYWQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfd3JpdGUgPQorCSAgICBtZTQ2MDBfZG9faW9fc2luZ2xlX3dyaXRlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWU0NjAwX2RvX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWU0NjAwX2RvX3F1ZXJ5X3N1YmRldmljZV90eXBlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHMgPQorCSAgICBtZTQ2MDBfZG9fcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisKKwlyZXR1cm4gc3ViZGV2aWNlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9kby5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9kby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4Mzg1NjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2RvLmgKQEAgLTAsMCArMSw2NSBAQAorLyoqCisgKiBAZmlsZSBtZTQ2MDBfZG8uaAorICoKKyAqIEBicmllZiBNRS00MDAwIGRpZ2l0YWwgb3V0cHV0IHN1YmRldmljZSBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTQ2MDBfRE9fSF8KKyNkZWZpbmUgX01FNDYwMF9ET19IXworCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgVGhlIHRlbXBsYXRlIHN1YmRldmljZSBjbGFzcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWU0NjAwX2RvX3N1YmRldmljZSB7CisJLyogSW5oZXJpdGFuY2UgKi8KKwltZV9zdWJkZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0IHRoZSBzdWJkZXZpY2UgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwlzcGlubG9ja190ICpjdHJsX3JlZ19sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCAjY3RybF9yZWcgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKworCXVuc2lnbmVkIGxvbmcgcG9ydF9yZWc7CQkJLyoqPCBSZWdpc3RlciBob2xkaW5nIHRoZSBwb3J0IHN0YXR1cy4gKi8KKwl1bnNpZ25lZCBsb25nIGN0cmxfcmVnOwkJCS8qKjwgUmVnaXN0ZXIgdG8gY29uZmlndXJlIHRoZSBwb3J0IGRpcmVjdGlvbi4gKi8KKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2U7CisjZW5kaWYKK30gbWU0NjAwX2RvX3N1YmRldmljZV90OworCisvKioKKyAqIEBicmllZiBUaGUgY29uc3RydWN0b3IgdG8gZ2VuZXJhdGUgYSBNRS00MDAwIGRpZ2l0YWwgb3V0cHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gcmVnX2Jhc2UgVGhlIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGFzIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUy4KKyAqIEBwYXJhbSBjdHJsX3JlZ19sb2NrIFNwaW4gbG9jayBwcm90ZWN0aW5nIHRoZSBjb250cm9sIHJlZ2lzdGVyLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWU0NjAwX2RvX3N1YmRldmljZV90ICptZTQ2MDBfZG9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgc3BpbmxvY2tfdCAqIGN0cmxfcmVnX2xvY2spOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9leHRfaXJxLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2V4dF9pcnEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGMxZTFiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9leHRfaXJxLmMKQEAgLTAsMCArMSw0NjcgQEAKKy8qKgorICogQGZpbGUgbWU0NjAwX2V4dF9pcnEuYworICoKKyAqIEBicmllZiBNRS00MDAwIGV4dGVybmFsIGludGVycnVwdCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKy8qCisgKiBJbmNsdWRlcworICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWVpZHMuaCIKKyNpbmNsdWRlICJtZTQ2MDBfcmVnLmgiCisjaW5jbHVkZSAibWU0NjAwX2FpX3JlZy5oIgorI2luY2x1ZGUgIm1lNDYwMF9leHRfaXJxX3JlZy5oIgorI2luY2x1ZGUgIm1lNDYwMF9leHRfaXJxLmgiCisKKy8qCisgKiBEZWZpbmVzCisgKi8KKworLyoKKyAqIEZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbnQgbWU0NjAwX2V4dF9pcnFfaW9faXJxX3N0YXJ0KG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgICBpbnQgaXJxX3NvdXJjZSwKKwkJCQkgICAgICAgaW50IGlycV9lZGdlLCBpbnQgaXJxX2FyZywgaW50IGZsYWdzKQoreworCW1lNDYwMF9leHRfaXJxX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwl1aW50MzJfdCB0bXA7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MgJiB+TUVfSU9fSVJRX1NUQVJUX0RJT19CSVQpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICgoaXJxX2VkZ2UgIT0gTUVfSVJRX0VER0VfUklTSU5HKQorCSAgICAmJiAoaXJxX2VkZ2UgIT0gTUVfSVJRX0VER0VfRkFMTElORykKKwkgICAgJiYgKGlycV9lZGdlICE9IE1FX0lSUV9FREdFX0FOWSkKKwkgICAgKSB7CisJCVBFUlJPUigiSW52YWxpZCBpcnEgZWRnZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfSVJRX0VER0U7CisJfQorCisJaWYgKGlycV9zb3VyY2UgIT0gTUVfSVJRX1NPVVJDRV9ESU9fTElORSkgeworCQlQRVJST1IoIkludmFsaWQgaXJxIHNvdXJjZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfSVJRX1NPVVJDRTsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJdG1wID0gMHgwOwkJLy9pbmwoaW5zdGFuY2UtPmV4dF9pcnFfY29uZmlnX3JlZyk7CisKKwlpZiAoaXJxX2VkZ2UgPT0gTUVfSVJRX0VER0VfUklTSU5HKSB7CisJCS8vdG1wICY9IH5NRTQ2MDBfRVhUX0lSUV9DT05GSUdfTUFTSzsKKwkJLy90bXAgfD0gTUU0NjAwX0VYVF9JUlFfQ09ORklHX01BU0tfUklTSU5HOworCX0gZWxzZSBpZiAoaXJxX2VkZ2UgPT0gTUVfSVJRX0VER0VfRkFMTElORykgeworCQkvL3RtcCAmPSB+TUU0NjAwX0VYVF9JUlFfQ09ORklHX01BU0s7CisJCS8vdG1wIHw9IE1FNDYwMF9FWFRfSVJRX0NPTkZJR19NQVNLX0ZBTExJTkc7CisJCXRtcCA9IE1FNDYwMF9FWFRfSVJRX0NPTkZJR19NQVNLX0ZBTExJTkc7CisJfSBlbHNlIGlmIChpcnFfZWRnZSA9PSBNRV9JUlFfRURHRV9BTlkpIHsKKwkJLy90bXAgJj0gfk1FNDYwMF9FWFRfSVJRX0NPTkZJR19NQVNLOworCQkvL3RtcCB8PSBNRTQ2MDBfRVhUX0lSUV9DT05GSUdfTUFTS19BTlk7CisJCXRtcCA9IE1FNDYwMF9FWFRfSVJRX0NPTkZJR19NQVNLX0FOWTsKKwl9CisKKwlvdXRsKHRtcCwgaW5zdGFuY2UtPmV4dF9pcnFfY29uZmlnX3JlZyk7CisJUERFQlVHX1JFRygiZXh0X2lycV9jb25maWdfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmV4dF9pcnFfY29uZmlnX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrLCBjcHVfZmxhZ3MpOworCXRtcCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCXRtcCAmPSB+KE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9JUlEgfCBNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfSVJRX1JFU0VUKTsKKwl0bXAgfD0gTUU0NjAwX0FJX0NUUkxfQklUX0VYX0lSUTsKKwlvdXRsKHRtcCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrLCBjcHVfZmxhZ3MpOworCWluc3RhbmNlLT5yaXNlZCA9IDA7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2V4dF9pcnFfaW9faXJxX3dhaXQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCAqaXJxX2NvdW50LAorCQkJCSAgICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lNDYwMF9leHRfaXJxX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwlsb25nIHQgPSAwOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAodGltZV9vdXQgPCAwKSB7CisJCVBFUlJPUigiSW52YWxpZCB0aW1lX291dCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVElNRU9VVDsKKwl9CisKKwlpZiAodGltZV9vdXQpIHsKKwkJdCA9ICh0aW1lX291dCAqIEhaKSAvIDEwMDA7CisKKwkJaWYgKHQgPT0gMCkKKwkJCXQgPSAxOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCWlmIChpbnN0YW5jZS0+cmlzZWQgPD0gMCkgeworCQlpbnN0YW5jZS0+cmlzZWQgPSAwOworCQlpZiAodGltZV9vdXQpIHsKKwkJCXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+CisJCQkJCQkJICAgICB3YWl0X3F1ZXVlLAorCQkJCQkJCSAgICAgKGluc3RhbmNlLT5yaXNlZCAhPQorCQkJCQkJCSAgICAgIDApLCB0KTsKKworCQkJaWYgKHQgPT0gMCkgeworCQkJCVBFUlJPUgorCQkJCSAgICAoIldhaXQgb24gZXh0ZXJuYWwgaW50ZXJydXB0IHRpbWVkIG91dC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1RJTUVPVVQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoaW5zdGFuY2UtPndhaXRfcXVldWUsCisJCQkJCQkgKGluc3RhbmNlLT5yaXNlZCAhPSAwKSk7CisJCX0KKworCQlpZiAoaW5zdGFuY2UtPnJpc2VkIDwgMCkgeworCQkJUEVSUk9SKCJXYWl0IG9uIGludGVycnVwdCBhYm9ydGVkIGJ5IHVzZXIuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0NBTkNFTExFRDsKKwkJfQorCX0KKworCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQlQRVJST1IoIldhaXQgb24gZXh0ZXJuYWwgaW50ZXJydXB0IGFib3J0ZWQgYnkgc2lnbmFsLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCWluc3RhbmNlLT5yaXNlZCA9IDA7CisJKmlycV9jb3VudCA9IGluc3RhbmNlLT5jb3VudDsKKwkqdmFsdWUgPSBpbnN0YW5jZS0+dmFsdWU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9leHRfaXJxX2lvX2lycV9zdG9wKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwgaW50IGZsYWdzKQoreworCW1lNDYwMF9leHRfaXJxX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwl1aW50MzJfdCB0bXA7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTQ2MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmIChjaGFubmVsKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwl0bXAgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwl0bXAgJj0gfihNRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfSVJRIHwgTUU0NjAwX0FJX0NUUkxfQklUX0VYX0lSUV9SRVNFVCk7CisJb3V0bCh0bXAsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWd2IG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlpbnN0YW5jZS0+cmlzZWQgPSAtMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNDYwMF9leHRfaXJxX2lvX3Jlc2V0X3N1YmRldmljZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTQ2MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisJdWludDMyX3QgdG1wOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJdG1wID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJdG1wICY9IH4oTUU0NjAwX0FJX0NUUkxfQklUX0VYX0lSUSB8IE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9JUlFfUkVTRVQpOworCW91dGwodG1wLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVndiBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJaW5zdGFuY2UtPnJpc2VkID0gLTE7CisJaW5zdGFuY2UtPmNvdW50ID0gMDsKKwlvdXRsKE1FNDYwMF9FWFRfSVJRX0NPTkZJR19NQVNLX0FOWSwgaW5zdGFuY2UtPmV4dF9pcnFfY29uZmlnX3JlZyk7CisJUERFQlVHX1JFRygiZXh0X2lycV9jb25maWdfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmV4dF9pcnFfY29uZmlnX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgTUU0NjAwX0VYVF9JUlFfQ09ORklHX01BU0tfQU5ZKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgbWU0NjAwX2V4dF9pcnFfZGVzdHJ1Y3RvcihzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UpCit7CisJbWU0NjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCWluc3RhbmNlID0gKG1lNDYwMF9leHRfaXJxX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKwltZV9zdWJkZXZpY2VfZGVpbml0KCZpbnN0YW5jZS0+YmFzZSk7CisJZnJlZV9pcnEoaW5zdGFuY2UtPmlycSwgaW5zdGFuY2UpOworCWtmcmVlKGluc3RhbmNlKTsKK30KKworc3RhdGljIGludCBtZTQ2MDBfZXh0X2lycV9xdWVyeV9udW1iZXJfY2hhbm5lbHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCQlpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm51bWJlciA9IDE7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU0NjAwX2V4dF9pcnFfcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgICAgICBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKnR5cGUgPSBNRV9UWVBFX0VYVF9JUlE7CisJKnN1YnR5cGUgPSBNRV9TVUJUWVBFX1NJTkdMRTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTQ2MDBfZXh0X2lycV9xdWVyeV9zdWJkZXZpY2VfY2FwcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgICAgIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPQorCSAgICBNRV9DQVBTX0VYVF9JUlFfRURHRV9SSVNJTkcgfCBNRV9DQVBTX0VYVF9JUlFfRURHRV9GQUxMSU5HIHwKKwkgICAgTUVfQ0FQU19FWFRfSVJRX0VER0VfQU5ZOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDE5KQorc3RhdGljIGlycXJldHVybl90IG1lNDYwMF9leHRfaXJxX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCisjZWxzZQorc3RhdGljIGlycXJldHVybl90IG1lNDYwMF9leHRfaXJxX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsCisJCQkJICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCisjZW5kaWYKK3sKKwltZTQ2MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdWludDMyX3QgY3RybDsKKwl1aW50MzJfdCBpcnFfc3RhdHVzOworCisJaW5zdGFuY2UgPSAobWU0NjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QgKikgZGV2X2lkOworCisJaWYgKGlycSAhPSBpbnN0YW5jZS0+aXJxKSB7CisJCVBFUlJPUigiSW5jb3JyZWN0IGludGVycnVwdCBudW06ICVkLlxuIiwgaXJxKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWlycV9zdGF0dXMgPSBpbmwoaW5zdGFuY2UtPmlycV9zdGF0dXNfcmVnKTsKKwlpZiAoIShpcnFfc3RhdHVzICYgTUU0NjAwX0lSUV9TVEFUVVNfQklUX0VYKSkgeworCQlQSU5GTygiJWxkIFNoYXJlZCBpbnRlcnJ1cHQuICVzKCk6IGlycV9zdGF0dXNfcmVnPTB4JTA0WFxuIiwKKwkJICAgICAgamlmZmllcywgX19mdW5jX18sIGlycV9zdGF0dXMpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCWluc3RhbmNlLT5yaXNlZCA9IDE7CisJaW5zdGFuY2UtPnZhbHVlID0gaW5sKGluc3RhbmNlLT5leHRfaXJxX3ZhbHVlX3JlZyk7CisJaW5zdGFuY2UtPmNvdW50Kys7CisKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwljdHJsIHw9IE1FNDYwMF9BSV9DVFJMX0JJVF9FWF9JUlFfUkVTRVQ7CisJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwljdHJsICY9IH5NRTQ2MDBfQUlfQ1RSTF9CSVRfRVhfSVJRX1JFU0VUOworCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCittZTQ2MDBfZXh0X2lycV9zdWJkZXZpY2VfdCAqbWU0NjAwX2V4dF9pcnFfY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCQkgICAgICAgaW50IGlycSwKKwkJCQkJCSAgICAgICBzcGlubG9ja190ICoKKwkJCQkJCSAgICAgICBjdHJsX3JlZ19sb2NrKQoreworCW1lNDYwMF9leHRfaXJxX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlICovCisJc3ViZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWU0NjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghc3ViZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc3ViZGV2aWNlLCAwLCBzaXplb2YobWU0NjAwX2V4dF9pcnFfc3ViZGV2aWNlX3QpKTsKKworCS8qIEluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgKi8KKwllcnIgPSBtZV9zdWJkZXZpY2VfaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2tzLgorCXNwaW5fbG9ja19pbml0KCZzdWJkZXZpY2UtPnN1YmRldmljZV9sb2NrKTsKKworCXN1YmRldmljZS0+Y3RybF9yZWdfbG9jayA9IGN0cmxfcmVnX2xvY2s7CisKKwkvKiBJbml0aWFsaXplIHdhaXQgcXVldWUgKi8KKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzdWJkZXZpY2UtPndhaXRfcXVldWUpOworCisJLyogUmVnaXN0ZXIgaW50ZXJydXB0ICovCisJc3ViZGV2aWNlLT5pcnEgPSBpcnE7CisKKwlpZiAocmVxdWVzdF9pcnEoc3ViZGV2aWNlLT5pcnEsIG1lNDYwMF9leHRfaXJxX2lzciwKKyNpZmRlZiBJUlFGX0RJU0FCTEVECisJCQlJUlFGX0RJU0FCTEVEIHwgSVJRRl9TSEFSRUQsCisjZWxzZQorCQkJU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEsCisjZW5kaWYKKwkJCU1FNDYwMF9OQU1FLCBzdWJkZXZpY2UpKSB7CisJCVBFUlJPUigiQ2Fubm90IHJlZ2lzdGVyIGludGVycnVwdC5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJUElORk8oIlJlZ2lzdGVyZWQgaXJxPSVkLlxuIiwgc3ViZGV2aWNlLT5pcnEpOworCisJLyogSW5pdGlhbGl6ZSByZWdpc3RlcnMgKi8KKwlzdWJkZXZpY2UtPmlycV9zdGF0dXNfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfSVJRX1NUQVRVU19SRUc7CisJc3ViZGV2aWNlLT5jdHJsX3JlZyA9IHJlZ19iYXNlICsgTUU0NjAwX0FJX0NUUkxfUkVHOworCXN1YmRldmljZS0+ZXh0X2lycV9jb25maWdfcmVnID0gcmVnX2Jhc2UgKyBNRTQ2MDBfRVhUX0lSUV9DT05GSUdfUkVHOworCXN1YmRldmljZS0+ZXh0X2lycV92YWx1ZV9yZWcgPSByZWdfYmFzZSArIE1FNDYwMF9FWFRfSVJRX1ZBTFVFX1JFRzsKKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKyNlbmRpZgorCisJLyogT3ZlcnJpZGUgYmFzZSBjbGFzcyBtZXRob2RzLiAqLworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfZGVzdHJ1Y3RvciA9IG1lNDYwMF9leHRfaXJxX2Rlc3RydWN0b3I7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19yZXNldF9zdWJkZXZpY2UgPQorCSAgICBtZTQ2MDBfZXh0X2lycV9pb19yZXNldF9zdWJkZXZpY2U7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19pcnFfc3RhcnQgPSBtZTQ2MDBfZXh0X2lycV9pb19pcnFfc3RhcnQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19pcnFfd2FpdCA9IG1lNDYwMF9leHRfaXJxX2lvX2lycV93YWl0OworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9faXJxX3N0b3AgPSBtZTQ2MDBfZXh0X2lycV9pb19pcnFfc3RvcDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lNDYwMF9leHRfaXJxX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWU0NjAwX2V4dF9pcnFfcXVlcnlfc3ViZGV2aWNlX3R5cGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyA9CisJICAgIG1lNDYwMF9leHRfaXJxX3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCisJc3ViZGV2aWNlLT5yaXNlZCA9IDA7CisJc3ViZGV2aWNlLT5jb3VudCA9IDA7CisKKwlyZXR1cm4gc3ViZGV2aWNlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9leHRfaXJxLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2V4dF9pcnEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzdiMjdmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9leHRfaXJxLmgKQEAgLTAsMCArMSw3OCBAQAorLyoqCisgKiBAZmlsZSBtZTQ2MDBfZXh0X2lycS5oCisgKgorICogQGJyaWVmIE1laWxoYXVzIE1FLTQwMDAgZXh0ZXJuYWwgaW50ZXJydXB0IHN1YmRldmljZSBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTQ2MDBfRVhUX0lSUV9IXworI2RlZmluZSBfTUU0NjAwX0VYVF9JUlFfSF8KKworI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFRoZSBzdWJkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lNDYwMF9leHRfaXJxX3N1YmRldmljZSB7CisJLyogSW5oZXJpdGFuY2UgKi8KKwltZV9zdWJkZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0IHRoZSBzdWJkZXZpY2UgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwlzcGlubG9ja190ICpjdHJsX3JlZ19sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCAjY3RybF9yZWcgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfcXVldWU7CisKKwlpbnQgaXJxOworCisJaW50IHJpc2VkOworCWludCB2YWx1ZTsKKwlpbnQgY291bnQ7CisKKwl1bnNpZ25lZCBsb25nIGN0cmxfcmVnOworCXVuc2lnbmVkIGxvbmcgaXJxX3N0YXR1c19yZWc7CisJdW5zaWduZWQgbG9uZyBleHRfaXJxX2NvbmZpZ19yZWc7CisJdW5zaWduZWQgbG9uZyBleHRfaXJxX3ZhbHVlX3JlZzsKKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2U7CisjZW5kaWYKK30gbWU0NjAwX2V4dF9pcnFfc3ViZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBjb25zdHJ1Y3RvciB0byBnZW5lcmF0ZSBhIGV4dGVybmFsIGludGVycnVwdCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gaXJxIFRoZSBpbnRlcnJ1cHQgbnVtYmVyIGFzc2lnbmVkIGJ5IHRoZSBQQ0kgQklPUy4KKyAqIEBwYXJhbSBjdHJsX3JlZ19sb2NrIFBvaW50ZXIgdG8gc3BpbiBsb2NrIHByb3RlY3RpbmcgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4KKyAqCisgKiBAcmV0dXJuIFBvaW50ZXIgdG8gbmV3IGluc3RhbmNlIG9uIHN1Y2Nlc3MuXG4KKyAqIE5VTEwgb24gZXJyb3IuCisgKi8KK21lNDYwMF9leHRfaXJxX3N1YmRldmljZV90ICptZTQ2MDBfZXh0X2lycV9jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJCSAgICAgICBpbnQgaXJxLAorCQkJCQkJICAgICAgIHNwaW5sb2NrX3QgKgorCQkJCQkJICAgICAgIGN0cmxfcmVnX2xvY2spOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9leHRfaXJxX3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9leHRfaXJxX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5OGUxZTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2V4dF9pcnFfcmVnLmgKQEAgLTAsMCArMSw0MSBAQAorLyoqCisgKiBAZmlsZSBtZTQ2MDBfZXh0X2lycV9yZWcuaAorICoKKyAqIEBicmllZiBNRS00MDAwIGV4dGVybmFsIGludGVycnVwdCBzdWJkZXZpY2UgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU0NjAwX0VYVF9JUlFfUkVHX0hfCisjZGVmaW5lIF9NRTQ2MDBfRVhUX0lSUV9SRUdfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBNRTQ2MDBfRVhUX0lSUV9DT05GSUdfUkVHCQkweENDCS8vIFIvXworI2RlZmluZSBNRTQ2MDBfRVhUX0lSUV9WQUxVRV9SRUcJCTB4RDAJLy8gUi9fCisKKyNkZWZpbmUgTUU0NjAwX0VYVF9JUlFfQ09ORklHX01BU0tfUklTSU5HCTB4MAorI2RlZmluZSBNRTQ2MDBfRVhUX0lSUV9DT05GSUdfTUFTS19GQUxMSU5HCTB4MQorI2RlZmluZSBNRTQ2MDBfRVhUX0lSUV9DT05GSUdfTUFTS19BTlkJCTB4MworI2RlZmluZSBNRTQ2MDBfRVhUX0lSUV9DT05GSUdfTUFTSwkJMHgzCisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTE1MmJiYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfcmVnLmgKQEAgLTAsMCArMSw0NiBAQAorLyoqCisgKiBAZmlsZSBtZTQ2MDBfcmVnLmgKKyAqCisgKiBAYnJpZWYgTUUtNDAwMCByZWdpc3RlciBkZWZpbml0aW9ucy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTQ2MDBfUkVHX0hfCisjZGVmaW5lIF9NRTQ2MDBfUkVHX0hfCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgTUU0NjAwX0lSUV9TVEFUVVNfUkVHCQkJMHg5QwkvLyBSL18KKworI2RlZmluZSBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfRVgJCTB4MDEKKyNkZWZpbmUgTUU0NjAwX0lSUV9TVEFUVVNfQklUX0xFCQkweDAyCisjZGVmaW5lIE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9BSV9IRgkJMHgwNAorI2RlZmluZSBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfQU9fMF9IRgkweDA4CisjZGVmaW5lIE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9BT18xX0hGCTB4MTAKKyNkZWZpbmUgTUU0NjAwX0lSUV9TVEFUVVNfQklUX0FPXzJfSEYJMHgyMAorI2RlZmluZSBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfQU9fM19IRgkweDQwCisjZGVmaW5lIE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9TQwkJMHg4MAorCisjZGVmaW5lIE1FNDYwMF9JUlFfU1RBVFVTX0JJVF9BT19IRgkJTUU0NjAwX0lSUV9TVEFUVVNfQklUX0FPXzBfSEYKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfYW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfYW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGYwMTIzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9hby5jCkBAIC0wLDAgKzEsMzczOSBAQAorLyoqCisgKiBAZmlsZSBtZTYwMDBfYW8uYworICoKKyAqIEBicmllZiBNRS02MDAwIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvKiBJbmNsdWRlcworICovCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWVpZHMuaCIKKyNpbmNsdWRlICJtZTYwMDBfcmVnLmgiCisjaW5jbHVkZSAibWU2MDAwX2FvX3JlZy5oIgorI2luY2x1ZGUgIm1lNjAwMF9hby5oIgorCisvKiBEZWZpbmVzCisgKi8KKworc3RhdGljIGludCBtZTYwMDBfYW9fcXVlcnlfcmFuZ2VfYnlfbWluX21heChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgIGludCB1bml0LAorCQkJCQkgICAgaW50ICptaW4sCisJCQkJCSAgICBpbnQgKm1heCwgaW50ICptYXhkYXRhLCBpbnQgKnJhbmdlKTsKKworc3RhdGljIGludCBtZTYwMDBfYW9fcXVlcnlfbnVtYmVyX3JhbmdlcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJIGludCB1bml0LCBpbnQgKmNvdW50KTsKKworc3RhdGljIGludCBtZTYwMDBfYW9fcXVlcnlfcmFuZ2VfaW5mbyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBpbnQgcmFuZ2UsCisJCQkJICAgICAgaW50ICp1bml0LAorCQkJCSAgICAgIGludCAqbWluLCBpbnQgKm1heCwgaW50ICptYXhkYXRhKTsKKworc3RhdGljIGludCBtZTYwMDBfYW9fcXVlcnlfdGltZXIobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJIGludCB0aW1lciwKKwkJCQkgaW50ICpiYXNlX2ZyZXF1ZW5jeSwKKwkJCQkgbG9uZyBsb25nICptaW5fdGlja3MsIGxvbmcgbG9uZyAqbWF4X3RpY2tzKTsKKworc3RhdGljIGludCBtZTYwMDBfYW9fcXVlcnlfbnVtYmVyX2NoYW5uZWxzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgKm51bWJlcik7CisKK3N0YXRpYyBpbnQgbWU2MDAwX2FvX3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKTsKKworc3RhdGljIGludCBtZTYwMDBfYW9fcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgaW50ICpjYXBzKTsKKworc3RhdGljIGludCBtZTYwMDBfYW9fcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncyhzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCSAgICAgICBpbnQgY2FwLCBpbnQgKmFyZ3MsIGludCBjb3VudCk7CisKKy8qKiBSZW1vdmUgc3ViZGV2aWNlLiAqLworc3RhdGljIHZvaWQgbWU2MDAwX2FvX2Rlc3RydWN0b3Ioc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlKTsKKworLyoqIFJlc2V0IHN1YmRldmljZS4gU3RvcCBhbGwgYWN0aW9ucy4gUmVzZXQgcmVnaXN0cnkuIERpc2FibGUgRklGTy4gU2V0IG91dHB1dCB0byAwViBhbmQgc3RhdHVzIHRvICdub25lJy4gKi8KK3N0YXRpYyBpbnQgbWU2MDAwX2FvX2lvX3Jlc2V0X3N1YmRldmljZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpOworCisvKiogU2V0IG91dHB1dCBhcyBzaW5nbGUgKi8KK3N0YXRpYyBpbnQgbWU2MDAwX2FvX2lvX3NpbmdsZV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCBzaW5nbGVfY29uZmlnLAorCQkJCSAgICAgIGludCByZWYsCisJCQkJICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICBpbnQgdHJpZ190eXBlLCBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpOworCisvKiogUGFzcyB0byB1c2VyIGFjdHVhbCB2YWx1ZSBvZiBvdXRwdXQuICovCitzdGF0aWMgaW50IG1lNjAwMF9hb19pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpOworCisvKiogV3JpdGUgdG8gb3V0cHV0IHJlcXVlZCB2YWx1ZS4gKi8KK3N0YXRpYyBpbnQgbWU2MDAwX2FvX2lvX3NpbmdsZV93cml0ZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgaW50IHZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncyk7CisKKy8qKiBTZXQgb3V0cHV0IGFzIHN0cmVhbWVkIGRldmljZS4gKi8KK3N0YXRpYyBpbnQgbWU2MDAwX2FvX2lvX3N0cmVhbV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIG1lSU9TdHJlYW1Db25maWdfdCAqIGNvbmZpZ19saXN0LAorCQkJCSAgICAgIGludCBjb3VudCwKKwkJCQkgICAgICBtZUlPU3RyZWFtVHJpZ2dlcl90ICogdHJpZ2dlciwKKwkJCQkgICAgICBpbnQgZmlmb19pcnFfdGhyZXNob2xkLCBpbnQgZmxhZ3MpOworCisvKiogV2FpdCBmb3IgLyBDaGVjayBlbXB0eSBzcGFjZSBpbiBidWZmZXIuICovCitzdGF0aWMgaW50IG1lNjAwMF9hb19pb19zdHJlYW1fbmV3X3ZhbHVlcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJCSAgaW50IHRpbWVfb3V0LCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpOworCisvKiogU3RhcnQgc3RyZWFtaW5nLiAqLworc3RhdGljIGludCBtZTYwMDBfYW9faW9fc3RyZWFtX3N0YXJ0KG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IHN0YXJ0X21vZGUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKTsKKworLyoqIENoZWNrIGFjdHVhbCBzdGF0ZS4gLyBXYWl0IGZvciBlbmQuICovCitzdGF0aWMgaW50IG1lNjAwMF9hb19pb19zdHJlYW1fc3RhdHVzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgd2FpdCwKKwkJCQkgICAgICBpbnQgKnN0YXR1cywgaW50ICp2YWx1ZXMsIGludCBmbGFncyk7CisKKy8qKiBTdG9wIHN0cmVhbWluZy4gKi8KK3N0YXRpYyBpbnQgbWU2MDAwX2FvX2lvX3N0cmVhbV9zdG9wKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCBzdG9wX21vZGUsIGludCBmbGFncyk7CisKKy8qKiBXcml0ZSBkYXRhcyB0byBidWZmb3IuICovCitzdGF0aWMgaW50IG1lNjAwMF9hb19pb19zdHJlYW1fd3JpdGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICBpbnQgd3JpdGVfbW9kZSwKKwkJCQkgICAgIGludCAqdmFsdWVzLCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpOworCisvKiogSW50ZXJydXB0IGhhbmRsZXIuIENvcHkgZnJvbSBidWZmZXIgdG8gRklGTy4gKi8KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiwgNiwgMTkpCitzdGF0aWMgaXJxcmV0dXJuX3QgbWU2MDAwX2FvX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpOworI2Vsc2UKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTYwMDBfYW9faXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworI2VuZGlmCisKKy8qKiBDb3B5IGRhdGEgZnJvbSBjaXJjdWxhciBidWZmZXIgdG8gZmlmbyAoZmFzdCkgaW4gd3JhcGFyb3VuZCBtb2RlLiAqLworaW50IGlubGluZSBhb193cml0ZV9kYXRhX3dyYXBhcm91bmQobWU2MDAwX2FvX3N1YmRldmljZV90ICogaW5zdGFuY2UsIGludCBjb3VudCwKKwkJCQkgICAgaW50IHN0YXJ0X3Bvcyk7CisKKy8qKiBDb3B5IGRhdGEgZnJvbSBjaXJjdWxhciBidWZmZXIgdG8gZmlmbyAoZmFzdCkuKi8KK2ludCBpbmxpbmUgYW9fd3JpdGVfZGF0YShtZTYwMDBfYW9fc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgaW50IGNvdW50LAorCQkJIGludCBzdGFydF9wb3MpOworCisvKiogQ29weSBkYXRhIGZyb20gY2lyY3VsYXIgYnVmZmVyIHRvIGZpZm8gKHNsb3cpLiovCitpbnQgaW5saW5lIGFvX3dyaXRlX2RhdGFfcG9vbGluZyhtZTYwMDBfYW9fc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgaW50IGNvdW50LAorCQkJCSBpbnQgc3RhcnRfcG9zKTsKKworLyoqIENvcHkgZGF0YSBmcm9tIHVzZXIgc3BhY2UgdG8gY2lyY3VsYXIgYnVmZmVyLiAqLworaW50IGlubGluZSBhb19nZXRfZGF0YV9mcm9tX3VzZXIobWU2MDAwX2FvX3N1YmRldmljZV90ICogaW5zdGFuY2UsIGludCBjb3VudCwKKwkJCQkgaW50ICp1c2VyX3ZhbHVlcyk7CisKKy8qKiBTdG9wIHByZXNlbnRhdGlvbi4gUHJlc2VydmUgRklGT3MuICovCitpbnQgaW5saW5lIGFvX3N0b3BfaW1tZWRpYXRlbHkobWU2MDAwX2FvX3N1YmRldmljZV90ICogaW5zdGFuY2UpOworCisvKiogRnVuY3Rpb24gZm9yIGNoZWNraW5nIHRpbWVvdXQgaW4gbm9uLWJsb2NraW5nIG1vZGUuICovCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorc3RhdGljIHZvaWQgbWU2MDAwX2FvX3dvcmtfY29udHJvbF90YXNrKHZvaWQgKnN1YmRldmljZSk7CisjZWxzZQorc3RhdGljIHZvaWQgbWU2MDAwX2FvX3dvcmtfY29udHJvbF90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisjZW5kaWYKKworLyogRnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBtZTYwMDBfYW9faW9fcmVzZXRfc3ViZGV2aWNlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTYwMDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQzMl90IHRtcDsKKwl1aW50MzJfdCBjdHJsOworCisJaW5zdGFuY2UgPSAobWU2MDAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfbm9uZTsKKwlpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgPSAwOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmluc3RhbmNlLT5hb19jb250cm9sX3Rhc2spOworCWluc3RhbmNlLT50aW1lb3V0LmRlbGF5ID0gMDsKKwlpbnN0YW5jZS0+dGltZW91dC5zdGFydF90aW1lID0gamlmZmllczsKKworCS8vU3RvcCBzdGF0ZSBtYWNoaW5lLgorCWVyciA9IGFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCisJLy9SZW1vdmUgZnJvbSBzeW5jaHJvbm91cyBzdGFydC4KKwlzcGluX2xvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCXRtcCA9IGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCXRtcCAmPQorCSAgICB+KChNRTYwMDBfQU9fU1lOQ19IT0xEIHwgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUcpIDw8IGluc3RhbmNlLT4KKwkgICAgICBhb19pZHgpOworCW91dGwodG1wLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCSppbnN0YW5jZS0+cHJlbG9hZF9mbGFncyAmPQorCSAgICB+KChNRTYwMDBfQU9fU1lOQ19IT0xEIHwgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUcpIDw8IGluc3RhbmNlLT4KKwkgICAgICBhb19pZHgpOworCisJLy9SZXNldCB0cmlnZ2VyaW5nIGZsYWcKKwkqaW5zdGFuY2UtPnRyaWdnZXJpbmdfZmxhZ3MgJj0gfigweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCisJaWYgKGluc3RhbmNlLT5maWZvKSB7CisJCS8vU2V0IHNpbmdsZSBtb2RlLCBkaXNzYWJsZSBGSUZPLCBkaXNzYWJsZSBleHRlcm5hbCB0cmlnZ2VyLCBibG9jayBpbnRlcnJ1cHQuCisJCWN0cmwgPSBNRTYwMDBfQU9fTU9ERV9TSU5HTEU7CisKKwkJLy9CbG9jayBJU00uCisJCWN0cmwgfD0KKwkJICAgIChNRTYwMDBfQU9fQ1RSTF9CSVRfU1RPUCB8CisJCSAgICAgTUU2MDAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QKTsKKworCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCQkvL1NldCBzcGVlZAorCQlvdXRsKE1FNjAwMF9BT19NSU5fQ0hBTl9USUNLUyAtIDEsIGluc3RhbmNlLT50aW1lcl9yZWcpOworCQkvL1Jlc2V0IGludGVycnVwdCBsYXRjaAorCQlpbmwoaW5zdGFuY2UtPmlycV9yZXNldF9yZWcpOworCX0KKworCWluc3RhbmNlLT5oYXJkd2FyZV9zdG9wX2RlbGF5ID0gSFogLyAxMDsJLy8xMDBtcworCisJLy9TZXQgb3V0cHV0IHRvIDBWCisJb3V0bCgweDgwMDAsIGluc3RhbmNlLT5zaW5nbGVfcmVnKTsKKwlQREVCVUdfUkVHKCJzaW5nbGVfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnNpbmdsZV9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIDB4ODAwMCk7CisKKwlpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCA9IDA7CisJaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgPSAwOworCWluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgPSAwOworCWluc3RhbmNlLT5kYXRhX2NvdW50ID0gMDsKKwlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0gMHg4MDAwOworCWluc3RhbmNlLT5zaW5nbGVfdmFsdWVfaW5fZmlmbyA9IDB4ODAwMDsKKworCS8vU2V0IHN0YXR1cyB0byBzaWduYWwgdGhhdCBkZXZpY2UgaXMgdW5jb25maWd1cmVkLgorCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfbm9uZTsKKwkvL1NpZ25hbCByZXNldCBpZiB1c2VyIGlzIG9uIHdhaXQuCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNjAwMF9hb19pb19zaW5nbGVfY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkgICAgICBpbnQgcmVmLAorCQkJCSAgICAgIGludCB0cmlnX2NoYW4sCisJCQkJICAgICAgaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCW1lNjAwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdWludDMyX3QgY3RybDsKKwl1aW50MzJfdCBzeW5jOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCisJaW5zdGFuY2UgPSAobWU2MDAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIElEPSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCS8vIENoZWNraW5nIHBhcmFtZXRlcnMKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SCisJCSAgICAoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuIE11c3QgYmUgTUVfSU9fU0lOR0xFX0NPTkZJR19OT19GTEFHUy5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoaW5zdGFuY2UtPmZpZm8pIHsJLy9TdHJlYW0gaGFyZHdhcmUgKHdpdGggb3Igd2l0aG91dCBmaWZvKQorCQlpZiAoKHRyaWdfZWRnZSA9PSBNRV9UUklHX1RZUEVfU1cpCisJCSAgICAmJiAodHJpZ19lZGdlICE9IE1FX1RSSUdfRURHRV9OT05FKSkgeworCQkJUEVSUk9SCisJCQkgICAgKCJJbnZhbGlkIHRyaWdnZXIgZWRnZS4gU29mdHdhcmUgdHJpZ2dlciBoYXMgbm90IGVkZ2UuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RSSUdfRURHRTsKKwkJfQorCisJCWlmICh0cmlnX3R5cGUgPT0gTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMKSB7CisJCQlzd2l0Y2ggKHRyaWdfZWRnZSkgeworCQkJY2FzZSBNRV9UUklHX0VER0VfQU5ZOgorCQkJY2FzZSBNRV9UUklHX0VER0VfUklTSU5HOgorCQkJY2FzZSBNRV9UUklHX0VER0VfRkFMTElORzoKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlQRVJST1IoIkludmFsaWQgdHJpZ2dlciBlZGdlLlxuIik7CisJCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVFJJR19FREdFOworCQkJfQorCQl9CisKKwkJaWYgKCh0cmlnX3R5cGUgIT0gTUVfVFJJR19UWVBFX1NXKQorCQkgICAgJiYgKHRyaWdfdHlwZSAhPSBNRV9UUklHX1RZUEVfRVhUX0RJR0lUQUwpKSB7CisJCQlQRVJST1IKKwkJCSAgICAoIkludmFsaWQgdHJpZ2dlciB0eXBlLiBUcmlnZ2VyIG11c3QgYmUgc29mdHdhcmUgb3IgZGlnaXRhbC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVFJJR19UWVBFOworCQl9CisJfSBlbHNlIHsJCS8vU2luZ2xlCisJCWlmICh0cmlnX2VkZ2UgIT0gTUVfVFJJR19FREdFX05PTkUpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiSW52YWxpZCB0cmlnZ2VyIGVkZ2UuIFNpbmdsZSBvdXRwdXQgdHJpZ2dlciBoYXNuJ3Qgb3duIGVkZ2UuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RSSUdfRURHRTsKKwkJfQorCisJCWlmICh0cmlnX3R5cGUgIT0gTUVfVFJJR19UWVBFX1NXKSB7CisJCQlQRVJST1IKKwkJCSAgICAoIkludmFsaWQgdHJpZ2dlciB0eXBlLiBUcmlnZ2VyIG11c3QgYmUgc29mdHdhcmUuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RSSUdfVFlQRTsKKwkJfQorCisJfQorCisJaWYgKCh0cmlnX2NoYW4gIT0gTUVfVFJJR19DSEFOX0RFRkFVTFQpCisJICAgICYmICh0cmlnX2NoYW4gIT0gTUVfVFJJR19DSEFOX1NZTkNIUk9OT1VTKSkgeworCQlQRVJST1IoIkludmFsaWQgdHJpZ2dlciBjaGFubmVsIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9UUklHX0NIQU47CisJfQorLyoKKwlpZiAoKHRyaWdfdHlwZSA9PSBNRV9UUklHX1RZUEVfRVhUX0RJR0lUQUwpICYmICh0cmlnX2NoYW4gIT0gTUVfVFJJR19DSEFOX1NZTkNIUk9OT1VTKSkKKwl7CisJCVBFUlJPUigiSW52YWxpZCB0cmlnZ2VyIGNoYW5uZWwgc3BlY2lmaWVkLiBNdXN0IGJlIHN5bmNocm9ub3VzIHdoZW4gZGlnaXRhbCBpcyBjaG9vc2UuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVFJJR19DSEFOOworCX0KKyovCisJaWYgKHJlZiAhPSBNRV9SRUZfQU9fR1JPVU5EKSB7CisJCVBFUlJPUgorCQkgICAgKCJJbnZhbGlkIHJlZmVyZW5jZS4gQW5hbG9nIG91dHB1dHMgaGF2ZSB0byBoYXZlIGdvdCBSRUZfQU9fR1JPVU5ELlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1JFRjsKKwl9CisKKwlpZiAoc2luZ2xlX2NvbmZpZyAhPSAwKSB7CisJCVBFUlJPUgorCQkgICAgKCJJbnZhbGlkIHNpbmdsZSBjb25maWcgc3BlY2lmaWVkLiBPbmx5IG9uZSByYW5nZSBmb3IgYW5sb2cgb3V0cHV0cyBpcyBhdmFpbGFibGUuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwl9CisKKwlpZiAoY2hhbm5lbCAhPSAwKSB7CisJCVBFUlJPUgorCQkgICAgKCJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyIHNwZWNpZmllZC4gQW5hbG9nIG91dHB1dCBoYXZlIG9ubHkgb25lIGNoYW5uZWwuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwkvL1N1YmRldmljZSBydW5uaW5nIGluIHN0cmVhbSBtb2RlIQorCWlmICgoaW5zdGFuY2UtPnN0YXR1cyA+PSBhb19zdGF0dXNfc3RyZWFtX3J1bl93YWl0KQorCSAgICAmJiAoaW5zdGFuY2UtPnN0YXR1cyA8IGFvX3N0YXR1c19zdHJlYW1fZW5kKSkgeworCQlQRVJST1IoIlN1YmRldmljZSBpcyBidXN5LlxuIik7CisJCU1FX1NVQkRFVklDRV9FWElUOworCisJCXJldHVybiBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwl9CisvLy8gQG5vdGUgRm9yIHNpbmdsZSBhbGwgY2FsbHMgKGNvbmZpZyBhbmQgd3JpdGUpIGFyZSBlcmFzaW5nIHByZXZpb3VzIHN0YXRlIQorCisJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19ub25lOworCisJLy8gQ29ycmVjdCBzaW5nbGUgbWlycm9ycworCWluc3RhbmNlLT5zaW5nbGVfdmFsdWVfaW5fZmlmbyA9IGluc3RhbmNlLT5zaW5nbGVfdmFsdWU7CisKKwkvL1N0b3AgZGV2aWNlCisJZXJyID0gYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJaWYgKGVycikgeworCQlQRVJST1JfQ1JJVElDQUwoIkZTTSBJUyBCVVNZIVxuIik7CisJCU1FX1NVQkRFVklDRV9FWElUOworCisJCXJldHVybiBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKwl9CisKKwlpZiAoaW5zdGFuY2UtPmZpZm8pIHsJLy8gU2V0IGNvbnRyb2wgcmVnaXN0ZXIuCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJCS8vIFNldCBzdG9wIGJpdC4gU3RvcCBzdHJlYW1pbmcgbW9kZSAoSWYgcnVubmluZy4pLgorCQljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCS8vUmVzZXQgYWxsIGJpdHMuCisJCWN0cmwgPQorCQkgICAgTUU2MDAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QIHwgTUU2MDAwX0FPX0NUUkxfQklUX1NUT1A7CisJCWlmICh0cmlnX3R5cGUgPT0gTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMKSB7CisJCQlQSU5GTygiRXh0ZXJuYWwgZGlnaXRhbCB0cmlnZ2VyLlxuIik7CisKKwkJCWlmICh0cmlnX2VkZ2UgPT0gTUVfVFJJR19FREdFX0FOWSkgeworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmwgfD0gTUU2MDAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRSB8IE1FNjAwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0VfQk9USDsKKwkJCQlpbnN0YW5jZS0+Y3RybF90cmcgPQorCQkJCSAgICBNRTYwMDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFIHwKKwkJCQkgICAgTUU2MDAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRV9CT1RIOworCQkJfSBlbHNlIGlmICh0cmlnX2VkZ2UgPT0gTUVfVFJJR19FREdFX0ZBTExJTkcpIHsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHJsIHw9IE1FNjAwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0U7CisJCQkJaW5zdGFuY2UtPmN0cmxfdHJnID0KKwkJCQkgICAgTUU2MDAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRTsKKwkJCX0gZWxzZSBpZiAodHJpZ19lZGdlID09IE1FX1RSSUdfRURHRV9SSVNJTkcpIHsKKwkJCQlpbnN0YW5jZS0+Y3RybF90cmcgPSAweDA7CisJCQl9CisJCX0gZWxzZSBpZiAodHJpZ190eXBlID09IE1FX1RSSUdfVFlQRV9TVykgeworCQkJUERFQlVHKCJTT0ZUV0FSRSBUUklHR0VSXG4iKTsKKwkJCWluc3RhbmNlLT5jdHJsX3RyZyA9IDB4MDsKKwkJfQorCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJfSBlbHNlIHsKKwkJUERFQlVHKCJTT0ZUV0FSRSBUUklHR0VSXG4iKTsKKwl9CisKKwkvLyBTZXQgcHJlbG9hZC9zeW5jaHJvbml6YXRpb24gcmVnaXN0ZXIuCisJc3Bpbl9sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKworCWlmICh0cmlnX3R5cGUgPT0gTUVfVFJJR19UWVBFX1NXKSB7CisJCSppbnN0YW5jZS0+cHJlbG9hZF9mbGFncyAmPQorCQkgICAgfihNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRyA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwl9IGVsc2UJCQkvL2lmICh0cmlnX3R5cGUgPT0gTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMKQorCXsKKwkJKmluc3RhbmNlLT5wcmVsb2FkX2ZsYWdzIHw9CisJCSAgICBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRyA8PCBpbnN0YW5jZS0+YW9faWR4OworCX0KKworCWlmICh0cmlnX2NoYW4gPT0gTUVfVFJJR19DSEFOX0RFRkFVTFQpIHsKKwkJKmluc3RhbmNlLT5wcmVsb2FkX2ZsYWdzICY9CisJCSAgICB+KE1FNjAwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisJfSBlbHNlCQkJLy9pZiAodHJpZ19jaGFuID09IE1FX1RSSUdfQ0hBTl9TWU5DSFJPTk9VUykKKwl7CisJCSppbnN0YW5jZS0+cHJlbG9hZF9mbGFncyB8PQorCQkgICAgTUU2MDAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4OworCX0KKworCS8vUmVzZXQgaGFyZHdhcmUgcmVnaXN0ZXIKKwlzeW5jID0gaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgaW5sKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgc3luYyk7CisJc3luYyAmPSB+KE1FNjAwMF9BT19TWU5DX0VYVF9UUklHIDw8IGluc3RhbmNlLT5hb19pZHgpOworCXN5bmMgfD0gTUU2MDAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4OworCisJLy9PdXRwdXQgY29uZmlndXJlZCBpbiBkZWZhdWx0IG1vZGUgKHNhZmUgb25lKQorCW91dGwoc3luYywgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgc3luYyk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCisJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zaW5nbGVfY29uZmlndXJlZDsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTYwMDBfYW9faW9fc2luZ2xlX3JlYWQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IGNoYW5uZWwsCisJCQkJICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lNjAwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwl1bnNpZ25lZCBsb25nIGo7CisJdW5zaWduZWQgbG9uZyBkZWxheSA9IDA7CisKKwlpbnN0YW5jZSA9IChtZTYwMDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmIChmbGFncyAmIH5NRV9JT19TSU5HTEVfTk9OQkxPQ0tJTkcpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLiAlZFxuIiwgZmxhZ3MpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoKGluc3RhbmNlLT5zdGF0dXMgPj0gYW9fc3RhdHVzX3N0cmVhbV9jb25maWd1cmVkKQorCSAgICAmJiAoaW5zdGFuY2UtPnN0YXR1cyA8PSBhb19zdGF0dXNfc3RyZWFtX2VuZCkpIHsKKwkJUEVSUk9SKCJTdWJkZXZpY2Ugbm90IGNvbmZpZ3VyZWQgdG8gd29yayBpbiBzaW5nbGUgbW9kZSFcbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCX0KKworCWlmIChjaGFubmVsICE9IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCWlmICh0aW1lX291dCA8IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRpbWVvdXQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RJTUVPVVQ7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCWlmICgoIWZsYWdzKSAmJiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfc2luZ2xlX3J1bl93YWl0KSkgewkvL0Jsb2NraW5nIG1vZGUuIFdhaXQgZm9yIHRyaWdnZXIuCisJCWlmICh0aW1lX291dCkgeworCQkJZGVsYXkgPSAodGltZV9vdXQgKiBIWikgLyAxMDAwOworCQkJaWYgKGRlbGF5ID09IDApCisJCQkJZGVsYXkgPSAxOworCQl9CisKKwkJaiA9IGppZmZpZXM7CisKKwkJLy9Pbmx5IHJ1bmluZyBwcm9jZXNzIHdpbGwgaW50ZXJydXB0IHRoaXMgY2FsbC4gRXZlbnRzIGFyZSBzaWduYWxlZCB3aGVuIHN0YXR1cyBjaGFuZ2UuIFRoaXMgcHJvY2VkdXJlIGhhcyBvd24gdGltZW91dC4KKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaW5zdGFuY2UtPndhaXRfcXVldWUsCisJCQkJCQkgKGluc3RhbmNlLT5zdGF0dXMgIT0KKwkJCQkJCSAgYW9fc3RhdHVzX3NpbmdsZV9ydW5fd2FpdCksCisJCQkJCQkgKGRlbGF5KSA/IGRlbGF5IDogTE9OR19NQVgpOworCisJCWlmIChpbnN0YW5jZS0+c3RhdHVzID09IGFvX3N0YXR1c19ub25lKSB7CisJCQlQREVCVUcoIlNpbmdsZSBjYW5jZWxlZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQl9CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlQRVJST1IoIldhaXQgb24gc3RhcnQgb2Ygc3RhdGUgbWFjaGluZSBpbnRlcnJ1cHRlZC5cbiIpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19ub25lOworCQkJYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJCX0KKworCQlpZiAoKGRlbGF5KSAmJiAoKGppZmZpZXMgLSBqKSA+PSBkZWxheSkpIHsKKwkJCVBERUJVRygiVGltZW91dCByZWFjaGVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19USU1FT1VUOworCQl9CisKKwkJKnZhbHVlID0KKwkJICAgICghZXJyKSA/IGluc3RhbmNlLT5zaW5nbGVfdmFsdWVfaW5fZmlmbyA6IGluc3RhbmNlLT4KKwkJICAgIHNpbmdsZV92YWx1ZTsKKwl9IGVsc2UgewkJLy9Ob24tYmxvY2tpbmcgbW9kZQorCQkvL1JlYWQgdmFsdWUKKwkJKnZhbHVlID0gaW5zdGFuY2UtPnNpbmdsZV92YWx1ZTsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU2MDAwX2FvX2lvX3NpbmdsZV93cml0ZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgaW50IHZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTYwMDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCXVuc2lnbmVkIGxvbmcgajsKKwl1bnNpZ25lZCBsb25nIGRlbGF5ID0gMDsKKworCXVpbnQzMl90IHN5bmNfbWFzazsKKwl1aW50MzJfdCBtb2RlOworCisJdWludDMyX3QgdG1wOworCisvLy8gV29ya2Fyb3VuZCBmb3IgbWl4LW1vZGUgLSBiZWdpbgorCXVpbnQzMl90IGN0cmwgPSAweDA7CisJdWludDMyX3Qgc3RhdHVzOworLy8vIFdvcmthcm91bmQgZm9yIG1peC1tb2RlIC0gZW5kCisKKwlpbnN0YW5jZSA9IChtZTYwMDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmIChmbGFncyAmCisJICAgIH4oTUVfSU9fU0lOR0xFX1RZUEVfVFJJR19TWU5DSFJPTk9VUyB8CisJICAgICAgTUVfSU9fU0lOR0xFX1RZUEVfV1JJVEVfTk9OQkxPQ0tJTkcpKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoKGluc3RhbmNlLT5zdGF0dXMgPT0gYW9fc3RhdHVzX25vbmUpCisJICAgIHx8IChpbnN0YW5jZS0+c3RhdHVzID4gYW9fc3RhdHVzX3NpbmdsZV9lbmQpKSB7CisJCVBFUlJPUigiU3ViZGV2aWNlIG5vdCBjb25maWd1cmVkIHRvIHdvcmsgaW4gc2luZ2xlIG1vZGUhXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwl9CisKKwlpZiAoY2hhbm5lbCAhPSAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAodmFsdWUgJiB+TUU2MDAwX0FPX01BWF9EQVRBKSB7CisJCVBFUlJPUigiSW52YWxpZCB2YWx1ZSBwcm92aWRlZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fVkFMVUVfT1VUX09GX1JBTkdFOworCX0KKworCWlmICh0aW1lX291dCA8IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRpbWVvdXQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RJTUVPVVQ7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisvLy8gQG5vdGUgRm9yIHNpbmdsZSBhbGwgY2FsbHMgKGNvbmZpZyBhbmQgd3JpdGUpIGFyZSBlcmFzaW5nIHByZXZpb3VzIHN0YXRlIQorCisJLy9DYW5jZWwgY29udHJvbCB0YXNrCisJUERFQlVHKCJDYW5jZWwgY29udHJvbCB0YXNrLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCWluc3RhbmNlLT5hb19jb250cm9sX3Rhc2tfZmxhZyA9IDA7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFzayk7CisKKwkvLyBDb3JyZWN0IHNpbmdsZSBtaXJyb3JzCisJaW5zdGFuY2UtPnNpbmdsZV92YWx1ZV9pbl9maWZvID0gaW5zdGFuY2UtPnNpbmdsZV92YWx1ZTsKKworCS8vU3RvcCBkZXZpY2UKKwllcnIgPSBhb19zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKwlpZiAoZXJyKSB7CisJCVBFUlJPUl9DUklUSUNBTCgiRlNNIElTIEJVU1khXG4iKTsKKwkJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwkJcmV0dXJuIE1FX0VSUk5PX1NVQkRFVklDRV9CVVNZOworCX0KKworCWlmICh0aW1lX291dCkgeworCQlkZWxheSA9ICh0aW1lX291dCAqIEhaKSAvIDEwMDA7CisKKwkJaWYgKGRlbGF5ID09IDApCisJCQlkZWxheSA9IDE7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCWluc3RhbmNlLT5zaW5nbGVfdmFsdWVfaW5fZmlmbyA9IHZhbHVlOworCisJaWYgKGluc3RhbmNlLT5maWZvKSB7CisJCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwl9CisKKwlpZiAoaW5zdGFuY2UtPmZpZm8gJiBNRTYwMDBfQU9fSEFTX0ZJRk8pIHsJLy8vIFdvcmthcm91bmQgZm9yIG1peC1tb2RlIC0gYmVnaW4KKwkJLy9TZXQgc3BlZWQKKwkJb3V0bChNRTYwMDBfQU9fTUlOX0NIQU5fVElDS1MgLSAxLCBpbnN0YW5jZS0+dGltZXJfcmVnKTsKKwkJUERFQlVHX1JFRygidGltZXJfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+dGltZXJfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgKGludClNRTYwMDBfQU9fTUlOX0NIQU5fVElDS1MpOworCQlpbnN0YW5jZS0+aGFyZHdhcmVfc3RvcF9kZWxheSA9IEhaIC8gMTA7CS8vMTAwbXMKKworCQlzdGF0dXMgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpOworCisJCS8vU2V0IHRoZSBjb250aW5vdXMgbW9kZS4KKwkJY3RybCAmPSB+TUU2MDAwX0FPX0NUUkxfTU9ERV9NQVNLOworCQljdHJsIHw9IE1FNjAwMF9BT19NT0RFX0NPTlRJTlVPVVM7CisKKwkJLy9QcmVwYXJlIEZJRk8KKwkJaWYgKCEoY3RybCAmIE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfRklGTykpIHsJLy9GSUZPIHdhc24ndCBlbmFiZWxlZC4gRG8gaXQuCisJCQlQSU5GTygiRW5hYmxlaW5nIEZJRk8uXG4iKTsKKwkJCWN0cmwgJj0gfk1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQkJY3RybCB8PSBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk87CisJCX0gZWxzZSB7CS8vQ2hlY2sgaWYgRklGTyBpcyBlbXB0eQorCQkJaWYgKHN0YXR1cyAmIE1FNjAwMF9BT19TVEFUVVNfQklUX0VGKSB7CS8vRklGTyBub3QgZW1wdHkKKwkJCQlQSU5GTygiUmVzZXRpbmcgRklGTy5cbiIpOworCQkJCWN0cmwgJj0KKwkJCQkgICAgfihNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk8gfAorCQkJCSAgICAgIE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJRKTsKKwkJCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLQorCQkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCisJCQkJY3RybCB8PSBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk87CisJCQl9IGVsc2UgewkvL0ZJRk8gZW1wdHksIG9ubHkgaW50ZXJydXB0IG5lZWRzIHRvIGJlIGRpc2FibGVkIQorCQkJCWN0cmwgJj0gfk1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQkJfQorCQl9CisKKwkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKworCQkvL1Jlc2V0IGludGVycnVwdCBsYXRjaAorCQlpbmwoaW5zdGFuY2UtPmlycV9yZXNldF9yZWcpOworCisJCS8vV3JpdGUgb3V0cHV0IC0gMSB2YWx1ZSB0byBGSUZPCisJCWlmIChpbnN0YW5jZS0+YW9faWR4ICYgMHgxKSB7CisJCQlvdXRsKHZhbHVlIDw8PSAxNiwgaW5zdGFuY2UtPmZpZm9fcmVnKTsKKwkJCVBERUJVR19SRUcoImZpZm9fcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5maWZvX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICB2YWx1ZSA8PD0gMTYpOworCQl9IGVsc2UgeworCQkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPmZpZm9fcmVnKTsKKwkJCVBERUJVR19SRUcoImZpZm9fcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5maWZvX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICB2YWx1ZSk7CisJCX0KKwkJLy8vIFdvcmthcm91bmQgZm9yIG1peC1tb2RlIC0gZW5kCisJfSBlbHNlIHsJCS8vTm8gRklGTyAtIGFsd2F5cyBpbiBzaW5nbGUgbW9kZQorCQkvL1dyaXRlIHZhbHVlCisJCVBERUJVRygiV3JpdGUgdmFsdWVcbiIpOworCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCVBERUJVR19SRUcoInNpbmdsZV9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5zaW5nbGVfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB2YWx1ZSk7CisJfQorCisJbW9kZSA9ICppbnN0YW5jZS0+cHJlbG9hZF9mbGFncyA+PiBpbnN0YW5jZS0+YW9faWR4OworCW1vZGUgJj0gKE1FNjAwMF9BT19TWU5DX0hPTEQgfCBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRyk7CisKKwlQSU5GTygiVHJpZ2dlcmluZyBtb2RlOiAweCUwOHhcbiIsIG1vZGUpOworCisJc3Bpbl9sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKwlzeW5jX21hc2sgPSBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBpbmwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBzeW5jX21hc2spOworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgMDoJCS8vMHgwMDAwMDAwMDogSW5kaXZpZHVhbCBzb2Z0d2FyZQorCQljdHJsICY9IH5NRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUc7CisKKwkJaWYgKGluc3RhbmNlLT5maWZvICYgTUU2MDAwX0FPX0hBU19GSUZPKSB7CS8vIEZJRk8gLSBDb250aW5vdXMgbW9kZQorCQkJY3RybCAmPSB+TUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHOworCQkJaWYgKChzeW5jX21hc2sgJiAoKE1FNjAwMF9BT19TWU5DX0hPTEQgfCBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRykgPDwgaW5zdGFuY2UtPmFvX2lkeCkpICE9IDB4MCkgewkvL05vdyB3ZSBjYW4gc2V0IGNvcnJlY3QgbW9kZS4KKwkJCQlzeW5jX21hc2sgJj0KKwkJCQkgICAgfigoTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUcgfAorCQkJCSAgICAgICBNRTYwMDBfQU9fU1lOQ19IT0xEKSA8PCBpbnN0YW5jZS0+CisJCQkJICAgICAgYW9faWR4KTsKKworCQkJCW91dGwoc3luY19tYXNrLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJCVBERUJVR19SRUcKKwkJCQkgICAgKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgICAgc3luY19tYXNrKTsKKwkJCX0KKwkJfSBlbHNlIHsJLy8gTm8gRklGTyAtIFNpbmdsZSBtb2RlOiBJbiB0aGlzIGNhc2UgcmVzZXR0aW5nICdNRTYwMDBfQU9fU1lOQ19IT0xEJyB3aWxsIHRyaWdnZXIgb3V0cHV0LgorCQkJaWYgKChzeW5jX21hc2sgJiAoKE1FNjAwMF9BT19TWU5DX0hPTEQgfCBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRykgPDwgaW5zdGFuY2UtPmFvX2lkeCkpICE9IE1FNjAwMF9BT19TWU5DX0hPTEQpIHsJLy9Ob3cgd2UgY2FuIHNldCBjb3JyZWN0IG1vZGUuIFRoaXMgaXMgZXhjZXB0aW9uLiBJdCBpcyBzZXQgdG8gc3luY2hyb25vdXMgYW5kIHRyaWdnZXJlZCBsYXRlci4KKwkJCQlzeW5jX21hc2sgJj0KKwkJCQkgICAgfihNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRyA8PCBpbnN0YW5jZS0+CisJCQkJICAgICAgYW9faWR4KTsKKwkJCQlzeW5jX21hc2sgfD0KKwkJCQkgICAgTUU2MDAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4OworCisJCQkJb3V0bChzeW5jX21hc2ssIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQkJUERFQlVHX1JFRworCQkJCSAgICAoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgICBzeW5jX21hc2spOworCQkJfQorCQl9CisJCWluc3RhbmNlLT5zaW5nbGVfdmFsdWUgPSB2YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIE1FNjAwMF9BT19TWU5DX0VYVF9UUklHOgkvLzB4MDAwMTAwMDA6IEluZGl2aWR1YWwgaGFyZHdhcmUKKwkJUERFQlVHKCJESUdJVEFMIFRSSUdHRVJcbiIpOworCQljdHJsIHw9IE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRzsKKworCQlpZiAoaW5zdGFuY2UtPmZpZm8gJiBNRTYwMDBfQU9fSEFTX0ZJRk8pIHsJLy8gRklGTyAtIENvbnRpbm91cyBtb2RlCisJCQlpZiAoKHN5bmNfbWFzayAmICgoTUU2MDAwX0FPX1NZTkNfSE9MRCB8IE1FNjAwMF9BT19TWU5DX0VYVF9UUklHKSA8PCBpbnN0YW5jZS0+YW9faWR4KSkgIT0gMHgwKSB7CS8vTm93IHdlIGNhbiBzZXQgY29ycmVjdCBtb2RlLgorCQkJCXN5bmNfbWFzayAmPQorCQkJCSAgICB+KChNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRyB8CisJCQkJICAgICAgIE1FNjAwMF9BT19TWU5DX0hPTEQpIDw8IGluc3RhbmNlLT4KKwkJCQkgICAgICBhb19pZHgpOworCisJCQkJb3V0bChzeW5jX21hc2ssIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQkJUERFQlVHX1JFRworCQkJCSAgICAoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgICBzeW5jX21hc2spOworCQkJfQorCQl9IGVsc2UgewkvLyBObyBGSUZPIC0gU2luZ2xlIG1vZGUKKwkJCWlmICgoc3luY19tYXNrICYKKwkJCSAgICAgKChNRTYwMDBfQU9fU1lOQ19IT0xEIHwgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUcpIDw8CisJCQkgICAgICBpbnN0YW5jZS0+YW9faWR4KSkgIT0gTUU2MDAwX0FPX1NZTkNfSE9MRCkgeworCQkJCS8vTm93IHdlIGNhbiBzZXQgY29ycmVjdCBtb2RlCisJCQkJc3luY19tYXNrICY9CisJCQkJICAgIH4oTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUcgPDwgaW5zdGFuY2UtPgorCQkJCSAgICAgIGFvX2lkeCk7CisJCQkJc3luY19tYXNrIHw9CisJCQkJICAgIE1FNjAwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKworCQkJCW91dGwoc3luY19tYXNrLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJCVBERUJVR19SRUcKKwkJCQkgICAgKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgICAgc3luY19tYXNrKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgTUU2MDAwX0FPX1NZTkNfSE9MRDoJLy8weDAwMDAwMDAxOiBTeW5jaHJvbm91cyBzb2Z0d2FyZQorCQljdHJsICY9IH5NRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUc7CisKKwkJaWYgKChzeW5jX21hc2sgJgorCQkgICAgICgoTUU2MDAwX0FPX1NZTkNfSE9MRCB8IE1FNjAwMF9BT19TWU5DX0VYVF9UUklHKSA8PAorCQkgICAgICBpbnN0YW5jZS0+YW9faWR4KSkgIT0KKwkJICAgIChNRTYwMDBfQU9fU1lOQ19IT0xEIHwgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUcpKSB7CisJCQkvL05vdyB3ZSBjYW4gc2V0IGNvcnJlY3QgbW9kZQorCQkJc3luY19tYXNrIHw9CisJCQkgICAgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUcgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKwkJCXN5bmNfbWFzayB8PSBNRTYwMDBfQU9fU1lOQ19IT0xEIDw8IGluc3RhbmNlLT5hb19pZHg7CisJCQlvdXRsKHN5bmNfbWFzaywgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBzeW5jX21hc2spOworCQl9CisJCS8vU2V0IHRyaWdnZXJpbmcgZmxhZworCQkqaW5zdGFuY2UtPnRyaWdnZXJpbmdfZmxhZ3MgfD0gMHgxIDw8IGluc3RhbmNlLT5hb19pZHg7CisJCWJyZWFrOworCisJY2FzZSAoTUU2MDAwX0FPX1NZTkNfSE9MRCB8IE1FNjAwMF9BT19TWU5DX0VYVF9UUklHKToJLy8weDAwMDEwMDAxOiBTeW5jaHJvbm91cyBoYXJkd2FyZQorCQlQREVCVUcoIkRJR0lUQUwgVFJJR0dFUlxuIik7CisJCWN0cmwgfD0gTUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHOworCisJCWlmICgoc3luY19tYXNrICYKKwkJICAgICAoKE1FNjAwMF9BT19TWU5DX0hPTEQgfCBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRykgPDwKKwkJICAgICAgaW5zdGFuY2UtPmFvX2lkeCkpICE9CisJCSAgICAoTUU2MDAwX0FPX1NZTkNfSE9MRCB8IE1FNjAwMF9BT19TWU5DX0VYVF9UUklHKSkgeworCQkJLy9Ob3cgd2UgY2FuIHNldCBjb3JyZWN0IG1vZGUKKwkJCXN5bmNfbWFzayB8PQorCQkJICAgIChNRTYwMDBfQU9fU1lOQ19IT0xEIHwgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUcpIDw8CisJCQkgICAgaW5zdGFuY2UtPmFvX2lkeDsKKwkJCW91dGwoc3luY19tYXNrLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHN5bmNfbWFzayk7CisJCX0KKwkJLy9TZXQgdHJpZ2dlcmluZyBmbGFnCisJCSppbnN0YW5jZS0+dHJpZ2dlcmluZ19mbGFncyB8PSAweDEgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKwkJYnJlYWs7CisJfQorLy8gICAgICAgICAgICAgIHNwaW5fdW5sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsgICAgICAgIC8vIE1vdmVkIGRvd24uCisKKwlpZiAoaW5zdGFuY2UtPmZpZm8pIHsJLy9BY3RpdmF0ZSBJU00gKHJlbW92ZSAnc3RvcCcgYml0cykKKwkJY3RybCAmPQorCQkgICAgfihNRTYwMDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFIHwKKwkJICAgICAgTUU2MDAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRV9CT1RIKTsKKwkJY3RybCB8PSBpbnN0YW5jZS0+Y3RybF90cmc7CisJCWN0cmwgJj0KKwkJICAgIH4oTUU2MDAwX0FPX0NUUkxfQklUX1NUT1AgfAorCQkgICAgICBNRTYwMDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1ApOworCisJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworLy8vIEBub3RlIFdoZW4gZmxhZyAnTUVfSU9fU0lOR0xFX1RZUEVfVFJJR19TWU5DSFJPTk9VUycgaXMgc2V0IHRoYW4gb3V0cHV0IGlzIHRyaWdnZXJlZC4gQUxXQVlTIQorCisJUElORk8oIjwlcz4gc3RhcnQgbW9kZT0gMHglMDh4ICVzXG4iLCBfX2Z1bmNfXywgbW9kZSwKKwkgICAgICAoZmxhZ3MgJiBNRV9JT19TSU5HTEVfVFlQRV9UUklHX1NZTkNIUk9OT1VTKSA/ICJTWU5DSFJPTk9VUyIgOgorCSAgICAgICIiKTsKKwlpZiAoaW5zdGFuY2UtPmZpZm8gJiBNRTYwMDBfQU9fSEFTX0ZJRk8pIHsJLy8gRklGTyAtIENvbnRpbm91cyBtb2RlCisJCWlmIChmbGFncyAmIE1FX0lPX1NJTkdMRV9UWVBFX1RSSUdfU1lOQ0hST05PVVMpIHsJLy9UcmlnZ2VyIG91dHB1dHMKKwkJCS8vQWRkIGNoYW5uZWwgdG8gc3RhcnQgbGlzdAorCQkJb3V0bChzeW5jX21hc2sgfAorCQkJICAgICAoTUU2MDAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4KSwKKwkJCSAgICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBzeW5jX21hc2sgfCAoTUU2MDAwX0FPX1NZTkNfSE9MRCA8PAorCQkJCQkJaW5zdGFuY2UtPmFvX2lkeCkpOworCisJCQkvL0ZpcmUKKwkJCVBJTkZPCisJCQkgICAgKCJGaXJlZCBhbGwgc29mdHdhcmUgc3luY2hyb25vdXMgb3V0cHV0cyBieSBzb2Z0d2FyZSB0cmlnZ2VyLlxuIik7CisJCQlvdXRsKDB4ODAwMCwgaW5zdGFuY2UtPnNpbmdsZV9yZWcpOworCQkJUERFQlVHX1JFRygic2luZ2xlX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+c2luZ2xlX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAweDgwMDApOworCisJCQkvL1Jlc3RvcmUgc2F2ZSBzZXR0aW5ncworCQkJb3V0bChzeW5jX21hc2ssIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgc3luY19tYXNrKTsKKworCQl9IGVsc2UgaWYgKCFtb2RlKSB7CS8vVHJpZ2dlciBvdXRwdXRzCisvKgkJCS8vUmVtb3ZlIGNoYW5uZWwgZnJvbSBzdGFydCBsaXN0CisJCQlvdXRsKHN5bmNfbWFzayAmIH4oTUU2MDAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+YW9faWR4KSwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBzeW5jX21hc2sgJiB+KE1FNjAwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeCkpOworKi8KKwkJCS8vRmlyZQorCQkJUElORk8oIlNvZnR3YXJlIHRyaWdnZXIuXG4iKTsKKwkJCW91dGwoMHg4MDAwLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCQlQREVCVUdfUkVHKCJzaW5nbGVfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5zaW5nbGVfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIDB4ODAwMCk7CisKKy8qCQkJLy9SZXN0b3JlIHNhdmUgc2V0dGluZ3MKKwkJCW91dGwoc3luY19tYXNrLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHN5bmNfbWFzayk7CisqLworCQl9CisvLy8gQG5vdGUgVGhpcyBpcyBtaXgtbW9kZSBjYXNlLiBGb3Igbm93IEkgZG8gbm90IGhhdmUgcG9zc2liaWxpdHkgdG8gdHJpZ2dlciBmaXJzdCA0IGNoYW5uZWxzIChjb250aW5vdXMgbW9kZSkgYW5kIG90aGVyIChzaW5nbGUpIG9uZXMgYXQgb25jZS4KKy8vLyBAbm90ZSBCZWNhdXNlIHRyaWdnZXJpbmcgaXMgbm90IHdvcmtpbmcgaXQgY2FuIG5vdCBiZSBhZGQgdG8gc3luY2hyb25vdXMgbGlzdC4gRmlyc3QgNCBjaGFubmVscyBkb24ndCBuZWVkIHRoaXMgaW5mb3JtYXRpb24sIGFueXdheS4KKwkJKmluc3RhbmNlLT50cmlnZ2VyaW5nX2ZsYWdzICY9IDB4RkZGRkZGRjA7CisJfSBlbHNlIHsJCS8vIE5vIEZJRk8gLSBTaW5nbGUgbW9kZQorCQlpZiAoZmxhZ3MgJiBNRV9JT19TSU5HTEVfVFlQRV9UUklHX1NZTkNIUk9OT1VTKSB7CS8vRmlyZWQgYWxsIHNvZnR3YXJlIHN5bmNocm9ub3VzIG91dHB1dHMuCisJCQl0bXAgPSB+KCppbnN0YW5jZS0+cHJlbG9hZF9mbGFncyB8IDB4RkZGRjAwMDApOworCQkJUElORk8KKwkJCSAgICAoIkZpcmVkIGFsbCBzb2Z0d2FyZSBzeW5jaHJvbm91cyBvdXRwdXRzLiBtYXNrOjB4JTA4eFxuIiwKKwkJCSAgICAgdG1wKTsKKwkJCXRtcCB8PSBzeW5jX21hc2sgJiAweEZGRkYwMDAwOworCQkJLy8gQWRkIHRoaXMgY2hhbm5lbCB0byBsaXN0CisJCQl0bXAgJj0gfihNRTYwMDBfQU9fU1lOQ19IT0xEIDw8IGluc3RhbmNlLT5hb19pZHgpOworCisJCQkvL0ZpcmUKKwkJCVBJTkZPKCJTb2Z0d2FyZSB0cmlnZ2VyLlxuIik7CisJCQlvdXRsKHRtcCwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICB0bXApOworCisJCQkvL1Jlc3RvcmUgc2F2ZSBzZXR0aW5ncworCQkJb3V0bChzeW5jX21hc2ssIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgc3luY19tYXNrKTsKKworCQkJLy9TZXQgYWxsIGFzIHRyaWdnZXJlZC4KKwkJCSppbnN0YW5jZS0+dHJpZ2dlcmluZ19mbGFncyA9IDB4MDsKKwkJfSBlbHNlIGlmICghbW9kZSkgewkvLyBBZGQgdGhpcyBjaGFubmVsIHRvIGxpc3QKKwkJCW91dGwoc3luY19tYXNrICYKKwkJCSAgICAgfihNRTYwMDBfQU9fU1lOQ19IT0xEIDw8IGluc3RhbmNlLT5hb19pZHgpLAorCQkJICAgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHN5bmNfbWFzayAmIH4oTUU2MDAwX0FPX1NZTkNfSE9MRCA8PAorCQkJCQkJIGluc3RhbmNlLT5hb19pZHgpKTsKKworCQkJLy9GaXJlCisJCQlQSU5GTygiU29mdHdhcmUgdHJpZ2dlci5cbiIpOworCisJCQkvL1Jlc3RvcmUgc2F2ZSBzZXR0aW5ncworCQkJb3V0bChzeW5jX21hc2ssIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlQREVCVUdfUkVHKCJwcmVsb2FkX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgc3luY19tYXNrKTsKKworCQkJLy9TZXQgYWxsIGFzIHRyaWdnZXJlZC4KKwkJCSppbnN0YW5jZS0+dHJpZ2dlcmluZ19mbGFncyA9IDB4MDsKKwkJfQorCisJfQorCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKworCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc2luZ2xlX3J1bl93YWl0OworCisJaW5zdGFuY2UtPnRpbWVvdXQuZGVsYXkgPSBkZWxheTsKKwlpbnN0YW5jZS0+dGltZW91dC5zdGFydF90aW1lID0gamlmZmllczsKKwlpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgPSAxOworCXF1ZXVlX2RlbGF5ZWRfd29yayhpbnN0YW5jZS0+bWU2MDAwX3dvcmtxdWV1ZSwKKwkJCSAgICZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrLCAxKTsKKworCWlmICghKGZsYWdzICYgTUVfSU9fU0lOR0xFX1RZUEVfV1JJVEVfTk9OQkxPQ0tJTkcpKSB7CisJCWogPSBqaWZmaWVzOworCisJCS8vT25seSBydW5pbmcgcHJvY2VzcyB3aWxsIGludGVycnVwdCB0aGlzIGNhbGwuIEV2ZW50cyBhcmUgc2lnbmFsZWQgd2hlbiBzdGF0dXMgY2hhbmdlLiBFeHRyYSB0aW1lb3V0IGFkZCBmb3Igc2FmZSByZWFzb24uCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJIChpbnN0YW5jZS0+c3RhdHVzICE9CisJCQkJCQkgIGFvX3N0YXR1c19zaW5nbGVfcnVuX3dhaXQpLAorCQkJCQkJIChkZWxheSkgPyBkZWxheSArCisJCQkJCQkgMSA6IExPTkdfTUFYKTsKKworCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyAhPSBhb19zdGF0dXNfc2luZ2xlX2VuZCkgeworCQkJUERFQlVHKCJTaW5nbGUgY2FuY2VsZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0NBTkNFTExFRDsKKwkJfQorCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJUEVSUk9SKCJXYWl0IG9uIHN0YXJ0IG9mIHN0YXRlIG1hY2hpbmUgaW50ZXJydXB0ZWQuXG4iKTsKKwkJCWluc3RhbmNlLT5hb19jb250cm9sX3Rhc2tfZmxhZyA9IDA7CisJCQljYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrKTsKKwkJCWFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19ub25lOworCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQl9CisKKwkJaWYgKChkZWxheSkgJiYgKChqaWZmaWVzIC0gaikgPj0gZGVsYXkpKSB7CisJCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfc2luZ2xlX2VuZCkgeworCQkJCVBERUJVRygiVGltZW91dCByZWFjaGVkLlxuIik7CisJCQl9IGVsc2UgaWYgKChqaWZmaWVzIC0gaikgPiBkZWxheSkgeworCQkJCVBFUlJPUgorCQkJCSAgICAoIlRpbWVvdXQgcmVhY2hlZC4gTm90IGhhbmRsZWQgYnkgY29udHJvbCB0YXNrIVxuIik7CisJCQkJYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUgorCQkJCSAgICAoIlRpbWVvdXQgcmVhY2hlZC4gU2lnbmFsIGNvbWUgYnV0IHN0YXR1cyBpcyBzdHJhbmdlOiAlZFxuIiwKKwkJCQkgICAgIGluc3RhbmNlLT5zdGF0dXMpOworCQkJCWFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCQkJfQorCisJCQlpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgPSAwOworCQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFzayk7CisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3NpbmdsZV9lbmQ7CisJCQllcnIgPSBNRV9FUlJOT19USU1FT1VUOworCQl9CisJfQorCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNjAwMF9hb19pb19zdHJlYW1fY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBtZUlPU3RyZWFtQ29uZmlnX3QgKiBjb25maWdfbGlzdCwKKwkJCQkgICAgICBpbnQgY291bnQsCisJCQkJICAgICAgbWVJT1N0cmVhbVRyaWdnZXJfdCAqIHRyaWdnZXIsCisJCQkJICAgICAgaW50IGZpZm9faXJxX3RocmVzaG9sZCwgaW50IGZsYWdzKQoreworCW1lNjAwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdWludDMyX3QgY3RybDsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwl1aW50NjRfdCBjb252X3RpY2tzOworCXVuc2lnbmVkIGludCBjb252X3N0YXJ0X3RpY2tzX2xvdyA9IHRyaWdnZXItPmlDb252U3RhcnRUaWNrc0xvdzsKKwl1bnNpZ25lZCBpbnQgY29udl9zdGFydF90aWNrc19oaWdoID0gdHJpZ2dlci0+aUNvbnZTdGFydFRpY2tzSGlnaDsKKworCWluc3RhbmNlID0gKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKCEoaW5zdGFuY2UtPmZpZm8gJiBNRTYwMDBfQU9fSEFTX0ZJRk8pKSB7CisJCVBFUlJPUigiTm90IGEgc3RyZWFtaW5nIGFvLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworCX0KKworCWNvbnZfdGlja3MgPQorCSAgICAodWludDY0X3QpIGNvbnZfc3RhcnRfdGlja3NfbG93ICsKKwkgICAgKCh1aW50NjRfdCkgY29udl9zdGFydF90aWNrc19oaWdoIDw8IDMyKTsKKworCWlmIChmbGFncyAmCisJICAgIH4oTUVfSU9fU1RSRUFNX0NPTkZJR19IQVJEV0FSRV9PTkxZIHwKKwkgICAgICBNRV9JT19TVFJFQU1fQ09ORklHX1dSQVBBUk9VTkQpKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFncy5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoZmxhZ3MgJiBNRV9JT19TVFJFQU1fQ09ORklHX0hBUkRXQVJFX09OTFkpIHsKKwkJaWYgKCFmbGFncyAmIE1FX0lPX1NUUkVBTV9DT05GSUdfV1JBUEFST1VORCkgeworCQkJUEVSUk9SCisJCQkgICAgKCJIYXJkd2FyZSBNRV9JT19TVFJFQU1fQ09ORklHX0hBUkRXQVJFX09OTFkgaGFzIHRvIGJlIHdpdGggTUVfSU9fU1RSRUFNX0NPTkZJR19XUkFQQVJPVU5ELlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwkJfQorCisJCWlmICgodHJpZ2dlci0+aUFjcVN0b3BUcmlnVHlwZSAhPSBNRV9UUklHX1RZUEVfTk9ORSkKKwkJICAgIHx8ICh0cmlnZ2VyLT5pU2NhblN0b3BUcmlnVHlwZSAhPSBNRV9UUklHX1RZUEVfTk9ORSkpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiSGFyZHdhcmUgd3JhcGFyb3VuZCBtb2RlIG11c3QgYmUgaW4gaW5maW5pdGUgbW9kZS5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJCX0KKwl9CisKKwlpZiAoY291bnQgIT0gMSkgeworCQlQRVJST1IoIk9ubHkgMSBlbnRyeSBpbiBjb25maWcgbGlzdCBhY2NlcHRhYmxlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NPTkZJR19MSVNUX0NPVU5UOworCX0KKworCWlmIChjb25maWdfbGlzdFswXS5pQ2hhbm5lbCAhPSAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAoY29uZmlnX2xpc3RbMF0uaVN0cmVhbUNvbmZpZyAhPSAwKSB7CisJCVBFUlJPUigiT25seSBvbmUgcmFuZ2UgYXZhaWxhYmxlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NUUkVBTV9DT05GSUc7CisJfQorCisJaWYgKGNvbmZpZ19saXN0WzBdLmlSZWYgIT0gTUVfUkVGX0FPX0dST1VORCkgeworCQlQRVJST1IoIk91dHB1dCBpcyByZWZlcmVuY2VkIHRvIGdyb3VuZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SRUY7CisJfQorCisJaWYgKCh0cmlnZ2VyLT5pQWNxU3RhcnRUaWNrc0xvdyAhPSAwKQorCSAgICB8fCAodHJpZ2dlci0+aUFjcVN0YXJ0VGlja3NIaWdoICE9IDApKSB7CisJCVBFUlJPUgorCQkgICAgKCJJbnZhbGlkIGFjcXVpc2l0aW9uIHN0YXJ0IHRyaWdnZXIgYXJndW1lbnQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9BUkc7CisJfQorCisJaWYgKGNvbmZpZ19saXN0WzBdLmlGbGFncykgeworCQlQRVJST1IoIkludmFsaWQgY29uZmlnIGxpc3QgZmxhZy5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoKHRyaWdnZXItPmlBY3FTdGFydFRyaWdUeXBlICE9IE1FX1RSSUdfVFlQRV9TVykKKwkgICAgJiYgKHRyaWdnZXItPmlBY3FTdGFydFRyaWdUeXBlICE9IE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGFjcXVpc2l0aW9uIHN0YXJ0IHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX1RSSUdfVFlQRTsKKwl9CisKKwlpZiAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ1R5cGUgPT0gTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMKSB7CisJCXN3aXRjaCAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ0VkZ2UpIHsKKwkJY2FzZSBNRV9UUklHX0VER0VfUklTSU5HOgorCQljYXNlIE1FX1RSSUdfRURHRV9GQUxMSU5HOgorCQljYXNlIE1FX1RSSUdfRURHRV9BTlk6CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJUEVSUk9SCisJCQkgICAgKCJJbnZhbGlkIGFjcXVpc2l0aW9uIHN0YXJ0IHRyaWdnZXIgZWRnZSBzcGVjaWZpZWQuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9UUklHX0VER0U7CisJCX0KKwl9CisKKwlpZiAoKHRyaWdnZXItPmlBY3FTdGFydFRyaWdUeXBlID09IE1FX1RSSUdfVFlQRV9TVykKKwkgICAgJiYgKHRyaWdnZXItPmlBY3FTdGFydFRyaWdFZGdlICE9IE1FX1RSSUdfVFlQRV9OT05FKSkgeworCQlQRVJST1IoIkludmFsaWQgYWNxdWlzaXRpb24gc3RhcnQgdHJpZ2dlciBlZGdlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RBUlRfVFJJR19FREdFOworCX0KKworCWlmICh0cmlnZ2VyLT5pU2NhblN0YXJ0VHJpZ1R5cGUgIT0gTUVfVFJJR19UWVBFX0ZPTExPVykgeworCQlQRVJST1IoIkludmFsaWQgc2NhbiBzdGFydCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NDQU5fU1RBUlRfVFJJR19UWVBFOworCX0KKworCWlmICh0cmlnZ2VyLT5pQ29udlN0YXJ0VHJpZ1R5cGUgIT0gTUVfVFJJR19UWVBFX1RJTUVSKSB7CisJCVBFUlJPUigiSW52YWxpZCBjb252IHN0YXJ0IHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ09OVl9TVEFSVF9UUklHX1RZUEU7CisJfQorCisJaWYgKChjb252X3RpY2tzIDwgTUU2MDAwX0FPX01JTl9DSEFOX1RJQ0tTKQorCSAgICB8fCAoY29udl90aWNrcyA+IE1FNjAwMF9BT19NQVhfQ0hBTl9USUNLUykpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNvbnYgc3RhcnQgdHJpZ2dlciBhcmd1bWVudCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ09OVl9TVEFSVF9BUkc7CisJfQorCisJaWYgKHRyaWdnZXItPmlBY3FTdGFydFRpY2tzTG93IHx8IHRyaWdnZXItPmlBY3FTdGFydFRpY2tzSGlnaCkgeworCQlQRVJST1IoIkludmFsaWQgYWNxIHN0YXJ0IHRyaWdnZXIgYXJndW1lbnQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9BUkc7CisJfQorCisJaWYgKHRyaWdnZXItPmlTY2FuU3RhcnRUaWNrc0xvdyB8fCB0cmlnZ2VyLT5pU2NhblN0YXJ0VGlja3NIaWdoKSB7CisJCVBFUlJPUigiSW52YWxpZCBzY2FuIHN0YXJ0IHRyaWdnZXIgYXJndW1lbnQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NDQU5fU1RBUlRfQVJHOworCX0KKworCXN3aXRjaCAodHJpZ2dlci0+aVNjYW5TdG9wVHJpZ1R5cGUpIHsKKwljYXNlIE1FX1RSSUdfVFlQRV9OT05FOgorCQlpZiAodHJpZ2dlci0+aVNjYW5TdG9wQ291bnQgIT0gMCkgeworCQkJUEVSUk9SKCJJbnZhbGlkIHNjYW4gc3RvcCBjb3VudCBzcGVjaWZpZWQuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NDQU5fU1RPUF9BUkc7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9DT1VOVDoKKwkJaWYgKGZsYWdzICYgTUVfSU9fU1RSRUFNX0NPTkZJR19XUkFQQVJPVU5EKSB7CisJCQlpZiAodHJpZ2dlci0+aVNjYW5TdG9wQ291bnQgPD0gMCkgeworCQkJCVBFUlJPUigiSW52YWxpZCBzY2FuIHN0b3AgY291bnQgc3BlY2lmaWVkLlxuIik7CisJCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVE9QX0FSRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiVGhlIGNvbnRpbm91cyBtb2RlIGhhcyBub3QgJ3NjYW4nIGNvbnRlY3RzLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RPUF9UUklHX1RZUEU7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgc2NhbiBzdG9wIHRyaWdnZXIgdHlwZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVE9QX1RSSUdfVFlQRTsKKwl9CisKKwlzd2l0Y2ggKHRyaWdnZXItPmlBY3FTdG9wVHJpZ1R5cGUpIHsKKwljYXNlIE1FX1RSSUdfVFlQRV9OT05FOgorCQlpZiAodHJpZ2dlci0+aUFjcVN0b3BDb3VudCAhPSAwKSB7CisJCQlQRVJST1IoIkludmFsaWQgYWNxIHN0b3AgY291bnQgc3BlY2lmaWVkLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RPUF9BUkc7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX1RSSUdfVFlQRV9DT1VOVDoKKwkJaWYgKHRyaWdnZXItPmlTY2FuU3RvcFRyaWdUeXBlICE9IE1FX1RSSUdfVFlQRV9OT05FKSB7CisJCQlQRVJST1IoIkludmFsaWQgYWNxIHN0b3AgdHJpZ2dlciB0eXBlIHNwZWNpZmllZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUT1BfVFJJR19UWVBFOworCQl9CisKKwkJaWYgKGZsYWdzICYgTUVfSU9fU1RSRUFNX0NPTkZJR19XUkFQQVJPVU5EKSB7CisJCQlpZiAodHJpZ2dlci0+aUFjcVN0b3BDb3VudCA8PSAwKSB7CisJCQkJUEVSUk9SCisJCQkJICAgICgiVGhlIGNvbnRpbm91cyBtb2RlIGhhcyBub3QgJ3NjYW4nIGNvbnRlY3RzLlxuIik7CisJCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUT1BfQVJHOworCQkJfQorCQl9CisvLyAgICAgICAgICAgICAgICAgICAgICBlbHNlCisvLyAgICAgICAgICAgICAgICAgICAgICB7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFUlJPUigiSW52YWxpZCBhY3Egc3RvcCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNRV9FUlJOT19JTlZBTElEX0FDUV9TVE9QX1RSSUdfVFlQRTsKKy8vICAgICAgICAgICAgICAgICAgICAgIH0KKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBhY3Egc3RvcCB0cmlnZ2VyIHR5cGUgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0FDUV9TVE9QX1RSSUdfVFlQRTsKKwl9CisKKwlzd2l0Y2ggKHRyaWdnZXItPmlBY3FTdGFydFRyaWdDaGFuKSB7CisJY2FzZSBNRV9UUklHX0NIQU5fREVGQVVMVDoKKwljYXNlIE1FX1RSSUdfQ0hBTl9TWU5DSFJPTk9VUzoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgYWNxIHN0YXJ0IHRyaWdnZXIgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX1RSSUdfQ0hBTjsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwkvL1N0b3AgZGV2aWNlCisKKwkvL0NhbmNlbCBjb250cm9sIHRhc2sKKwlQREVCVUcoIkNhbmNlbCBjb250cm9sIHRhc2suIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisJaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrKTsKKworCS8vQ2hlY2sgaWYgc3RhdGUgbWFjaGluZSBpcyBzdG9wcGVkLgorCWVyciA9IGFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCWlmIChlcnIpIHsKKwkJUEVSUk9SX0NSSVRJQ0FMKCJGU00gSVMgQlVTWSFcbiIpOworCQlNRV9TVUJERVZJQ0VfRVhJVDsKKworCQlyZXR1cm4gTUVfRVJSTk9fU1VCREVWSUNFX0JVU1k7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkvL1Jlc2V0IGNvbnRyb2wgcmVnaXN0ZXIuIEJsb2NrIGFsbCBhY3Rpb25zLiBEaXNhYmxlIElSUS4gRGlzYWJsZSBGSUZPLgorCWN0cmwgPSBNRTYwMDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfCBNRTYwMDBfQU9fQ1RSTF9CSVRfU1RPUDsKKwlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCisJLy9SZXNldCBpbnRlcnJ1cHQgbGF0Y2gKKwlpbmwoaW5zdGFuY2UtPmlycV9yZXNldF9yZWcpOworCisJLy9UaGlzIGlzIHBhcmFub2ljLCBidXQgdG8gYmUgc3VyZS4KKwlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ID0gMDsKKwlpbnN0YW5jZS0+ZGF0YV9jb3VudCA9IDA7CisJaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQgPSAwOworCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsID0gMDsKKworCS8qIFNldCBtb2RlLiAqLworCWlmIChmbGFncyAmIE1FX0lPX1NUUkVBTV9DT05GSUdfV1JBUEFST1VORCkgewkvL1dyYXBhcm91bmQKKwkJaWYgKGZsYWdzICYgTUVfSU9fU1RSRUFNX0NPTkZJR19IQVJEV0FSRV9PTkxZKSB7CS8vSGFyZHdhcmUgd3JhcGFyb3VuZAorCQkJUElORk8oIkhhcmR3YXJlIHdyYXBhcm91bmQuXG4iKTsKKwkJCWN0cmwgfD0gTUU2MDAwX0FPX01PREVfV1JBUEFST1VORDsKKwkJCWluc3RhbmNlLT5tb2RlID0gTUU2MDAwX0FPX0hXX1dSQVBfTU9ERTsKKwkJfSBlbHNlIHsJLy9Tb2Z0d2FyZSB3cmFwYXJvdW5kCisJCQlQSU5GTygiU29mdHdhcmUgd3JhcGFyb3VuZC5cbiIpOworCQkJY3RybCB8PSBNRTYwMDBfQU9fTU9ERV9DT05USU5VT1VTOworCQkJaW5zdGFuY2UtPm1vZGUgPSBNRTYwMDBfQU9fU1dfV1JBUF9NT0RFOworCQl9CisJfSBlbHNlIHsJCS8vQ29udGlub3VzCisJCVBJTkZPKCJDb250aW5vdXMuXG4iKTsKKwkJY3RybCB8PSBNRTYwMDBfQU9fTU9ERV9DT05USU5VT1VTOworCQlpbnN0YW5jZS0+bW9kZSA9IE1FNjAwMF9BT19DT05USU5PVVM7CisJfQorCisJLy9TZXQgdGhlIHRyaWdnZXIgZWRnZS4KKwlpZiAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ1R5cGUgPT0gTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMKSB7CS8vU2V0IHRoZSB0cmlnZ2VyIHR5cGUgYW5kIGVkZ2UgZm9yIGV4dGVybmFsIHRyaWdnZXIuCisJCVBJTkZPKCJFeHRlcm5hbCBkaWdpdGFsIHRyaWdnZXIuXG4iKTsKKwkJaW5zdGFuY2UtPnN0YXJ0X21vZGUgPSBNRTYwMDBfQU9fRVhUX1RSSUc7CisKKwkJc3dpdGNoICh0cmlnZ2VyLT5pQWNxU3RhcnRUcmlnRWRnZSkgeworCQljYXNlIE1FX1RSSUdfRURHRV9SSVNJTkc6CisJCQlQSU5GTygiU2V0IHRoZSB0cmlnZ2VyIGVkZ2U6IHJpc2luZy5cbiIpOworCQkJaW5zdGFuY2UtPmN0cmxfdHJnID0gMHgwOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRV9UUklHX0VER0VfRkFMTElORzoKKwkJCVBJTkZPKCJTZXQgdGhlIHRyaWdnZXIgZWRnZTogZmFsbGluZy5cbiIpOworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmwgfD0gTUU2MDAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRTsKKwkJCWluc3RhbmNlLT5jdHJsX3RyZyA9IE1FNjAwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0U7CisJCQlicmVhazsKKworCQljYXNlIE1FX1RSSUdfRURHRV9BTlk6CisJCQlQSU5GTygiU2V0IHRoZSB0cmlnZ2VyIGVkZ2U6IGJvdGggZWRnZXMuXG4iKTsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHJsIHw9IE1FNjAwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0UgfCBNRTYwMDBfQU9fQ1RSTF9CSVRfRVhfVFJJR19FREdFX0JPVEg7CisJCQlpbnN0YW5jZS0+Y3RybF90cmcgPQorCQkJICAgIE1FNjAwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0UgfAorCQkJICAgIE1FNjAwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0VfQk9USDsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJUElORk8oIkludGVybmFsIHNvZnR3YXJlIHRyaWdnZXIuXG4iKTsKKwkJaW5zdGFuY2UtPnN0YXJ0X21vZGUgPSAwOworCX0KKworCS8vU2V0IHRoZSBzdG9wIG1vZGUgYW5kIHZhbHVlLgorCWlmICh0cmlnZ2VyLT5pQWNxU3RvcFRyaWdUeXBlID09IE1FX1RSSUdfVFlQRV9DT1VOVCkgewkvL0Ftb3VudCBvZiBkYXRhCisJCWluc3RhbmNlLT5zdG9wX21vZGUgPSBNRTYwMDBfQU9fQUNRX1NUT1BfTU9ERTsKKwkJaW5zdGFuY2UtPnN0b3BfY291bnQgPSB0cmlnZ2VyLT5pQWNxU3RvcENvdW50OworCX0gZWxzZSBpZiAodHJpZ2dlci0+aVNjYW5TdG9wVHJpZ1R5cGUgPT0gTUVfVFJJR19UWVBFX0NPVU5UKSB7CS8vQW1vdW50IG9mICdzY2FucycKKwkJaW5zdGFuY2UtPnN0b3BfbW9kZSA9IE1FNjAwMF9BT19TQ0FOX1NUT1BfTU9ERTsKKwkJaW5zdGFuY2UtPnN0b3BfY291bnQgPSB0cmlnZ2VyLT5pU2NhblN0b3BDb3VudDsKKwl9IGVsc2UgewkJLy9JbmZpbml0ZQorCQlpbnN0YW5jZS0+c3RvcF9tb2RlID0gTUU2MDAwX0FPX0lORl9TVE9QX01PREU7CisJCWluc3RhbmNlLT5zdG9wX2NvdW50ID0gMDsKKwl9CisKKwlQSU5GTygiU3RvcCBjb3VudDogJWQuXG4iLCBpbnN0YW5jZS0+c3RvcF9jb3VudCk7CisKKwlpZiAodHJpZ2dlci0+aUFjcVN0YXJ0VHJpZ0NoYW4gPT0gTUVfVFJJR19DSEFOX1NZTkNIUk9OT1VTKSB7CS8vU3luY2hyb25vdXMgc3RhcnQKKwkJaW5zdGFuY2UtPnN0YXJ0X21vZGUgfD0gTUU2MDAwX0FPX1NZTkNfSE9MRDsKKwkJaWYgKHRyaWdnZXItPmlBY3FTdGFydFRyaWdUeXBlID09IE1FX1RSSUdfVFlQRV9FWFRfRElHSVRBTCkgewkvL0V4dGVybmFseSB0cmlnZ2VyZWQKKwkJCVBJTkZPKCJTeW5jaHJvbm91cyBzdGFydC4gRXh0ZXJuYWx5IHRyaWdnZXIgYWN0aXZlLlxuIik7CisJCQlpbnN0YW5jZS0+c3RhcnRfbW9kZSB8PSBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRzsKKwkJfQorI2lmZGVmIE1FREVCVUdfSU5GTworCQllbHNlIHsKKwkJCVBJTkZPCisJCQkgICAgKCJTeW5jaHJvbm91cyBzdGFydC4gRXh0ZXJuYWx5IHRyaWdnZXIgZGlzc2FibGVkLlxuIik7CisJCX0KKyNlbmRpZgorCisJfQorCS8vU2V0IHNwZWVkCisJb3V0bChjb252X3RpY2tzIC0gMiwgaW5zdGFuY2UtPnRpbWVyX3JlZyk7CisJUERFQlVHX1JFRygidGltZXJfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JWxseFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+dGltZXJfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjb252X3RpY2tzIC0gMik7CisJaW5zdGFuY2UtPmhhcmR3YXJlX3N0b3BfZGVsYXkgPSAoaW50KShjb252X3RpY2tzICogSFopIC8gTUU2MDAwX0FPX0JBU0VfRlJFUVVFTkNZOwkvLzw9PSBNVVNUIGJlIHdpdGggY2FzdCEKKworCS8vIFdyaXRlIHRoZSBjb250cm9sIHdvcmQKKwlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCisJLy9TZXQgc3RhdHVzLgorCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2NvbmZpZ3VyZWQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNjAwMF9hb19pb19zdHJlYW1fbmV3X3ZhbHVlcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJCSAgaW50IHRpbWVfb3V0LCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpCit7CisJbWU2MDAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwlsb25nIHQgPSAwOworCWxvbmcgajsKKworCWluc3RhbmNlID0gKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKCEoaW5zdGFuY2UtPmZpZm8gJiBNRTYwMDBfQU9fSEFTX0ZJRk8pKSB7CisJCVBFUlJPUigiTm90IGEgc3RyZWFtaW5nIGFvLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworCX0KKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKCFpbnN0YW5jZS0+Y2lyY19idWYuYnVmKSB7CisJCVBFUlJPUigiQ2lyY3VsYXIgYnVmZmVyIG5vdCBleGlzdHMuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCWlmICh0aW1lX291dCA8IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRpbWVfb3V0IHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9USU1FT1VUOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCWlmIChtZV9jaXJjX2J1Zl9zcGFjZSgmaW5zdGFuY2UtPmNpcmNfYnVmKSkgewkvL1RoZSBidWZmZXIgaXMgTk9UIGZ1bGwuCisJCSpjb3VudCA9IG1lX2NpcmNfYnVmX3NwYWNlKCZpbnN0YW5jZS0+Y2lyY19idWYpOworCX0gZWxzZSB7CQkvL1RoZSBidWZmZXIgaXMgZnVsbC4KKwkJaWYgKHRpbWVfb3V0KSB7CisJCQl0ID0gKHRpbWVfb3V0ICogSFopIC8gMTAwMDsKKworCQkJaWYgKHQgPT0gMCkKKwkJCQl0ID0gMTsKKwkJfSBlbHNlIHsJLy9NYXggdGltZS4KKwkJCXQgPSBMT05HX01BWDsKKwkJfQorCisJCSpjb3VudCA9IDA7CisKKwkJaiA9IGppZmZpZXM7CisKKwkJLy9Pbmx5IHJ1bmluZyBwcm9jZXNzIHdpbGwgaW50ZXJydXB0IHRoaXMgY2FsbC4gSW50ZXJydXB0cyBhcmUgd2hlbiBGSUZPIEhGIGlzIHNpZ25hbGVkLgorCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSAoKG1lX2NpcmNfYnVmX3NwYWNlCisJCQkJCQkgICAoJmluc3RhbmNlLT5jaXJjX2J1ZikpCisJCQkJCQkgIHx8ICEoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKQorCQkJCQkJICAgICAgICYKKwkJCQkJCSAgICAgICBNRTYwMDBfQU9fU1RBVFVTX0JJVF9GU00pKSwKKwkJCQkJCSB0KTsKKworCQlpZiAoIShpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpICYgTUU2MDAwX0FPX1NUQVRVU19CSVRfRlNNKSkgeworCQkJUEVSUk9SKCJBTyBzdWJkZXZpY2UgaXMgbm90IHJ1bm5pbmcuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX1NVQkRFVklDRV9OT1RfUlVOTklORzsKKwkJfSBlbHNlIGlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJUEVSUk9SKCJXYWl0IG9uIHZhbHVlcyBpbnRlcnJ1cHRlZCBmcm9tIHNpZ25hbC5cbiIpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19ub25lOworCQkJYW9fc3RvcF9pbW1lZGlhdGVseShpbnN0YW5jZSk7CisJCQllcnIgPSBNRV9FUlJOT19TSUdOQUw7CisJCX0gZWxzZSBpZiAoKGppZmZpZXMgLSBqKSA+PSB0KSB7CisJCQlQRVJST1IoIldhaXQgb24gdmFsdWVzIHRpbWVkIG91dC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJfSBlbHNlIHsJLy9VZmYuLi4gYWxsIGlzIGdvb2QuIEluZm9ybSB1c2VyIGFib3V0IGVtcHR5IHNwYWNlLgorCQkJKmNvdW50ID0gbWVfY2lyY19idWZfc3BhY2UoJmluc3RhbmNlLT5jaXJjX2J1Zik7CisJCX0KKwl9CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU2MDAwX2FvX2lvX3N0cmVhbV9zdGFydChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBzdGFydF9tb2RlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTYwMDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzID0gMDsKKwl1aW50MzJfdCBzdGF0dXM7CisJdWludDMyX3QgY3RybDsKKwl1aW50MzJfdCBzeW5jaDsKKwlpbnQgY291bnQgPSAwOworCWludCBjaXJjX2J1ZmZlcl9jb3VudDsKKworCXVuc2lnbmVkIGxvbmcgcmVmOworCXVuc2lnbmVkIGxvbmcgZGVsYXkgPSAwOworCisJaW5zdGFuY2UgPSAobWU2MDAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoIShpbnN0YW5jZS0+ZmlmbyAmIE1FNjAwMF9BT19IQVNfRklGTykpIHsKKwkJUEVSUk9SKCJOb3QgYSBzdHJlYW1pbmcgYW8uXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7CisJfQorCisJaWYgKGZsYWdzICYgfk1FX0lPX1NUUkVBTV9TVEFSVF9UWVBFX1RSSUdfU1lOQ0hST05PVVMpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICh0aW1lX291dCA8IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRpbWVvdXQgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1RJTUVPVVQ7CisJfQorCisJaWYgKChzdGFydF9tb2RlICE9IE1FX1NUQVJUX01PREVfQkxPQ0tJTkcpCisJICAgICYmIChzdGFydF9tb2RlICE9IE1FX1NUQVJUX01PREVfTk9OQkxPQ0tJTkcpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdGFydCBtb2RlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVEFSVF9NT0RFOworCX0KKworCWlmICh0aW1lX291dCkgeworCQlkZWxheSA9ICh0aW1lX291dCAqIEhaKSAvIDEwMDA7CisJCWlmIChkZWxheSA9PSAwKQorCQkJZGVsYXkgPSAxOworCX0KKworCXN3aXRjaCAoaW5zdGFuY2UtPnN0YXR1cykgewkvL0NoZWNraW5nIGFjdHVhbCBtb2RlLgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9jb25maWd1cmVkOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9lbmQ6CisJCS8vQ29ycmVjdCBtb2RlcyEKKwkJYnJlYWs7CisKKwkJLy9UaGUgZGV2aWNlIGlzIGluIHdyb25nIG1vZGUuCisJY2FzZSBhb19zdGF0dXNfbm9uZToKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfY29uZmlndXJlZDoKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfcnVuX3dhaXQ6CisJY2FzZSBhb19zdGF0dXNfc2luZ2xlX3J1bjoKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfZW5kX3dhaXQ6CisJCVBFUlJPUgorCQkgICAgKCJTdWJkZXZpY2UgbXVzdCBiZSBwcmVpbml0aWFsaXplIGNvcnJlY3RseSBmb3Igc3RyZWFtaW5nLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fZmlmb19lcnJvcjoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fYnVmZmVyX2Vycm9yOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9lcnJvcjoKKwkJUERFQlVHKCJCZWZvcmUgcmVzdGFydCBicm9rZSBzdHJlYW0gJ1NUT1AnIG11c3QgYmUgY2FsZWQuXG4iKTsKKwkJcmV0dXJuIE1FX1NUQVRVU19FUlJPUjsKKworCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9ydW5fd2FpdDoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fcnVuOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9lbmRfd2FpdDoKKwkJUERFQlVHKCJTdHJlYW0gaXMgYWxyZWFkeSB3b3JraW5nLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19TVUJERVZJQ0VfQlVTWTsKKworCWRlZmF1bHQ6CisJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2Vycm9yOworCQlQRVJST1JfQ1JJVElDQUwoIlN0YXR1cyBpcyBpbiB3cm9uZyBzdGF0ZSFcbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlpZiAoaW5zdGFuY2UtPm1vZGUgPT0gTUU2MDAwX0FPX0NPTlRJTk9VUykgewkvL0NvbnRpbm91cworCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCArPSBpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50OworCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCAmPSBpbnN0YW5jZS0+Y2lyY19idWYubWFzazsKKwl9CisJY2lyY19idWZmZXJfY291bnQgPSBtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1Zik7CisKKwlpZiAoIWNpcmNfYnVmZmVyX2NvdW50ICYmICFpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50KSB7CS8vTm8gdmFsdWVzIGluIGJ1ZmZlcgorCQlNRV9TVUJERVZJQ0VfRVhJVDsKKwkJUEVSUk9SKCJObyB2YWx1ZXMgaW4gYnVmZmVyIVxuIik7CisJCXJldHVybiBNRV9FUlJOT19MQUNLX09GX1JFU09VUkNFUzsKKwl9CisKKwkvL0NhbmNlbCBjb250cm9sIHRhc2sKKwlQREVCVUcoIkNhbmNlbCBjb250cm9sIHRhc2suIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisJaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrKTsKKworCS8vU3RvcCBkZXZpY2UKKwllcnIgPSBhb19zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKwlpZiAoZXJyKSB7CisJCVBFUlJPUl9DUklUSUNBTCgiRlNNIElTIEJVU1khXG4iKTsKKwkJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwkJcmV0dXJuIE1FX0VSUk5PX1NVQkRFVklDRV9CVVNZOworCX0KKwkvL1NldCB2YWx1ZXMgZm9yIHNpbmdsZV9yZWFkKCkKKwlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlID0gTUU2MDAwX0FPX01BWF9EQVRBICsgMTsKKwlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlX2luX2ZpZm8gPSBNRTYwMDBfQU9fTUFYX0RBVEEgKyAxOworCisJLy9TZXR0aW5nIHN0b3AgcG9pbnRzCisJaWYgKGluc3RhbmNlLT5zdG9wX21vZGUgPT0gTUU2MDAwX0FPX1NDQU5fU1RPUF9NT0RFKSB7CisJCWluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgPQorCQkgICAgaW5zdGFuY2UtPnN0b3BfY291bnQgKiBjaXJjX2J1ZmZlcl9jb3VudDsKKwl9IGVsc2UgeworCQlpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50ID0gaW5zdGFuY2UtPnN0b3BfY291bnQ7CisJfQorCisJaWYgKChpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50ICE9IDApCisJICAgICYmIChpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50IDwgY2lyY19idWZmZXJfY291bnQpKSB7CisJCVBFUlJPUigiTW9yZSBkYXRhIGluIGJ1ZmZlciB0aGFuIHByZXZpb3VzbHkgc2V0IGxpbWl0IVxuIik7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJLy9DaGVjayBGSUZPCisJaWYgKCEoY3RybCAmIE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfRklGTykpIHsJLy9GSUZPIHdhc24ndCBlbmFiZWxlZC4gRG8gaXQuIDw9IFRoaXMgc2hvdWxkIGJlIGRvbmUgYnkgdXNlciBjYWxsIHdpdGggTUVfV1JJVEVfTU9ERV9QUkVMT0FECisJCVBJTkZPKCJFbmFibGVpbmcgRklGTy5cbiIpOworCQljdHJsIHw9IE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfRklGTzsKKwkJY3RybCAmPSB+TUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisKKwkJaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCA9IDA7CisJCWluc3RhbmNlLT5kYXRhX2NvdW50ID0gMDsKKwl9IGVsc2UgewkJLy9CbG9jayBJUlEKKwkJY3RybCAmPSB+TUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJfQorCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisKKwkvL1Jlc2V0IGludGVycnVwdCBsYXRjaAorCWlubChpbnN0YW5jZS0+aXJxX3Jlc2V0X3JlZyk7CisKKwkvL0ZpbGwgRklGTyA8PSBHZW5lcmFseSB0aGlzIHNob3VsZCBiZSBkb25lIGJ5IHVzZXIgcHJlLWxvYWQgY2FsbCBidXQgdGhpcyBpcyBzZWNvbmQgcGxhY2UgdG8gZG8gaXQuCisJc3RhdHVzID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKKwlpZiAoIShzdGF0dXMgJiBNRTYwMDBfQU9fU1RBVFVTX0JJVF9FRikpIHsJLy9GSUZPIGVtcHR5CisJCWlmIChpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50ICE9IDApIHsKKwkJCWNvdW50ID0gTUU2MDAwX0FPX0ZJRk9fQ09VTlQ7CisJCX0gZWxzZSB7CisJCQljb3VudCA9CisJCQkgICAgKE1FNjAwMF9BT19GSUZPX0NPVU5UIDwKKwkJCSAgICAgaW5zdGFuY2UtPgorCQkJICAgICBzdG9wX2RhdGFfY291bnQpID8gTUU2MDAwX0FPX0ZJRk9fQ09VTlQgOgorCQkJICAgIGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQ7CisJCX0KKworCQkvL0NvcHkgZGF0YQorCQljb3VudCA9CisJCSAgICBhb193cml0ZV9kYXRhKGluc3RhbmNlLCBjb3VudCwgaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCk7CisKKwkJaWYgKGNvdW50IDwgMCkgewkvL1RoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbmQhCisJCQlQRVJST1JfQ1JJVElDQUwoIkNPUFkgRklOSVNIIFdJVEggRVJST1IhXG4iKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCQlNRV9TVUJERVZJQ0VfRVhJVDsKKwkJCXJldHVybiBNRV9FUlJOT19JTlRFUk5BTDsKKwkJfQorCX0KKwkvL1NldCBwcmUtbG9hZCBmZWF0dXJlcy4KKwlzcGluX2xvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCXN5bmNoID0gaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJc3luY2ggJj0KKwkgICAgfigoTUU2MDAwX0FPX1NZTkNfSE9MRCB8IE1FNjAwMF9BT19TWU5DX0VYVF9UUklHKSA8PCBpbnN0YW5jZS0+CisJICAgICAgYW9faWR4KTsKKwlzeW5jaCB8PQorCSAgICAoaW5zdGFuY2UtPnN0YXJ0X21vZGUgJiB+TUU2MDAwX0FPX0VYVF9UUklHKSA8PCBpbnN0YW5jZS0+YW9faWR4OworCW91dGwoc3luY2gsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHN5bmNoKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisKKwkvL0RlZmF1bHQgY291bnQgaXMgJzAnCisJaWYgKGluc3RhbmNlLT5tb2RlID09IE1FNjAwMF9BT19DT05USU5PVVMpIHsJLy9Db250aW5vdXMKKwkJaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCA9IDA7CisJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICs9IGNvdW50OworCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCAmPSBpbnN0YW5jZS0+Y2lyY19idWYubWFzazsKKwl9IGVsc2UgewkJLy9XcmFwYXJvdW5kCisJCWluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgKz0gY291bnQ7CisJCWluc3RhbmNlLT5kYXRhX2NvdW50ICs9IGNvdW50OworCisJCS8vU3BlY2lhbCBjYXNlOiBJbmZpbml0ZSB3cmFwYXJvdW5kIHdpdGggbGVzcyB0aGFuIEZJRk8gZGF0YXMgYWx3YXlzIHNob3VsZCBydW5zIGluIGhhcmR3YXJlIG1vZGUuCisJCWlmICgoaW5zdGFuY2UtPnN0b3BfbW9kZSA9PSBNRTYwMDBfQU9fSU5GX1NUT1BfTU9ERSkKKwkJICAgICYmIChjaXJjX2J1ZmZlcl9jb3VudCA8PSBNRTYwMDBfQU9fRklGT19DT1VOVCkpIHsJLy9DaGFuZ2UgdG8gaGFyZHdhcmUgd3JhcGFyb3VuZAorCQkJUERFQlVHCisJCQkgICAgKCJDaGFuZ2VpbmcgbW9kZSBmcm9tIHNvZnR3YXJlIHdyYXBhcm91bmQgdG8gaGFyZHdhcmUgd3JhcGFyb3VuZC5cbiIpOworCQkJLy9Db3B5IGFsbCBkYXRhCisJCQljb3VudCA9CisJCQkgICAgYW9fd3JpdGVfZGF0YShpbnN0YW5jZSwgY2lyY19idWZmZXJfY291bnQsCisJCQkJCSAgaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCk7CisJCQljdHJsICY9IH5NRTYwMDBfQU9fQ1RSTF9NT0RFX01BU0s7CisJCQljdHJsIHw9IE1FNjAwMF9BT19NT0RFX1dSQVBBUk9VTkQ7CisJCX0KKworCQlpZiAoaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCA9PSBtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1ZikpIHsJLy9SZXNldCBwb3NpdGlvbiBpbmRpY2F0b3IuCisJCQlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ID0gMDsKKwkJfSBlbHNlIGlmIChpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ID4gbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpKSB7CS8vVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuZCEKKwkJCVBFUlJPUl9DUklUSUNBTAorCQkJICAgICgiUFJFTE9BREVEIE1PUkUgVkFMVUVTIFRIQU4gQVJFIElOIEJVRkZFUiFcbiIpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKwkJCU1FX1NVQkRFVklDRV9FWElUOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVEVSTkFMOworCQl9CisJfQorCisJLy9TZXQgc3RhdHVzIHRvICd3YWl0IGZvciBzdGFydCcKKwlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9ydW5fd2FpdDsKKworCXN0YXR1cyA9IGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZyk7CisJLy9TdGFydCBzdGF0ZSBtYWNoaW5lIGFuZCBpbnRlcnJ1cHRzCisJUElORk8oIjwlczolZD4gU3RhcnQgc3RhdGUgbWFjaGluZS5cbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJY3RybCAmPSB+KE1FNjAwMF9BT19DVFJMX0JJVF9TVE9QIHwgTUU2MDAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QKTsKKwlpZiAoaW5zdGFuY2UtPnN0YXJ0X21vZGUgPT0gTUU2MDAwX0FPX0VYVF9UUklHKSB7CisJCVBERUJVRygiRElHSVRBTCBUUklHR0VSXG4iKTsKKwkJY3RybCB8PSBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUc7CisJfQorCWlmICghKHN0YXR1cyAmIE1FNjAwMF9BT19TVEFUVVNfQklUX0hGKSkgewkvL01vcmUgdGhhbiBoYWxmIQorCQlpZiAoKGN0cmwgJiBNRTYwMDBfQU9fQ1RSTF9NT0RFX01BU0spID09IE1FNjAwMF9BT19NT0RFX0NPTlRJTlVPVVMpIHsJLy9FbmFibGUgSVJRIG9ubHkgd2hlbiBoYXJkd2FyZV9jb250aW5vdXMgaXMgc2V0IGFuZCBGSUZPIGlzIG1vcmUgdGhhbiBoYWxmCisJCQlQSU5GTygiPCVzOiVkPiBTdGFydCBpbnRlcnJ1cHRzLlxuIiwgX19mdW5jX18sCisJCQkgICAgICBfX0xJTkVfXyk7CisJCQljdHJsIHw9IE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQl9CisJfQorCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJLy9UcmlnZ2VyIG91dHB1dAorCVBJTkZPKCI8JXM+IHN0YXJ0IG1vZGU9IDB4JXggJXNcbiIsIF9fZnVuY19fLCBpbnN0YW5jZS0+c3RhcnRfbW9kZSwKKwkgICAgICAoZmxhZ3MgJiBNRV9JT19TSU5HTEVfVFlQRV9UUklHX1NZTkNIUk9OT1VTKSA/ICJTWU5DSFJPTk9VUyIgOgorCSAgICAgICIiKTsKKwlpZiAoZmxhZ3MgJiBNRV9JT19TSU5HTEVfVFlQRV9UUklHX1NZTkNIUk9OT1VTKSB7CS8vVHJpZ2dlciBvdXRwdXRzCisJCXNwaW5fbG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisJCXN5bmNoID0gaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCS8vQWRkIGNoYW5uZWwgdG8gc3RhcnQgbGlzdAorCQlvdXRsKHN5bmNoIHwgKE1FNjAwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeCksCisJCSAgICAgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIHN5bmNoIHwgKE1FNjAwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeCkpOworCisJCS8vRmlyZQorCQlQSU5GTworCQkgICAgKCJGaXJlZCBhbGwgc29mdHdhcmUgc3luY2hyb25vdXMgb3V0cHV0cyBieSBzb2Z0d2FyZSB0cmlnZ2VyLlxuIik7CisJCW91dGwoMHg4MDAwLCBpbnN0YW5jZS0+c2luZ2xlX3JlZyk7CisJCVBERUJVR19SRUcoInNpbmdsZV9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5zaW5nbGVfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAweDgwMDApOworCisJCS8vUmVzdG9yZSBzYXZlIHNldHRpbmdzCisJCW91dGwoc3luY2gsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHN5bmNoKTsKKwkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCX0gZWxzZSBpZiAoIWluc3RhbmNlLT5zdGFydF9tb2RlKSB7CS8vVHJpZ2dlciBvdXRwdXRzCisvKgorCQlzcGluX2xvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCQkJc3luY2ggPSBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCS8vUmVtb3ZlIGNoYW5uZWwgZnJvbSBzdGFydCBsaXN0CisJCQlvdXRsKHN5bmNoICYgfihNRTYwMDBfQU9fU1lOQ19IT0xEIDw8IGluc3RhbmNlLT5hb19pZHgpLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHN5bmNoICYgfihNRTYwMDBfQU9fU1lOQ19IT0xEIDw8IGluc3RhbmNlLT5hb19pZHgpKTsKKyovCisJCS8vRmlyZQorCQlQSU5GTygiU29mdHdhcmUgdHJpZ2dlci5cbiIpOworCQlvdXRsKDB4ODAwMCwgaW5zdGFuY2UtPnNpbmdsZV9yZWcpOworCQlQREVCVUdfUkVHKCJzaW5nbGVfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+c2luZ2xlX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMHg4MDAwKTsKKworLyoKKwkJCS8vUmVzdG9yZSBzYXZlIHNldHRpbmdzCisJCQlvdXRsKHN5bmNoLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJUERFQlVHX1JFRygicHJlbG9hZF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLCBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHN5bmNoKTsKKwkJc3Bpbl91bmxvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworKi8KKwl9CisJLy8gU2V0IGNvbnRyb2wgdGFzaydzIHRpbWVvdXQKKwlpbnN0YW5jZS0+dGltZW91dC5kZWxheSA9IGRlbGF5OworCWluc3RhbmNlLT50aW1lb3V0LnN0YXJ0X3RpbWUgPSBqaWZmaWVzOworCisJaWYgKHN0YXR1cyAmIE1FNjAwMF9BT19TVEFUVVNfQklUX0hGKSB7CS8vTGVzcyB0aGFuIGhhbGYgYnV0IG5vdCBlbXB0eSEKKwkJUElORk8oIkxlc3MgdGhhbiBoYWxmLlxuIik7CisJCWlmIChpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50ID09IDApIHsKKwkJCWNvdW50ID0gTUU2MDAwX0FPX0ZJRk9fQ09VTlQgLyAyOworCQl9IGVsc2UgeworCQkJY291bnQgPQorCQkJICAgICgoTUU2MDAwX0FPX0ZJRk9fQ09VTlQgLyAyKSA8CisJCQkgICAgIGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQpID8gTUU2MDAwX0FPX0ZJRk9fQ09VTlQgLworCQkJICAgIDIgOiBpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50OworCQl9CisKKwkJLy9Db3B5IGRhdGEKKwkJY291bnQgPQorCQkgICAgYW9fd3JpdGVfZGF0YShpbnN0YW5jZSwgY291bnQsIGluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQpOworCisJCWlmIChjb3VudCA8IDApIHsJLy9UaGlzIHNob3VsZCBuZXZlciBoYXBwZW5kIQorCQkJUEVSUk9SX0NSSVRJQ0FMKCJDT1BZIEZJTklTSCBXSVRIIEVSUk9SIVxuIik7CisJCQlNRV9TVUJERVZJQ0VfRVhJVDsKKwkJCXJldHVybiBNRV9FUlJOT19JTlRFUk5BTDsKKwkJfQorCisJCWlmIChpbnN0YW5jZS0+bW9kZSA9PSBNRTYwMDBfQU9fQ09OVElOT1VTKSB7CS8vQ29udGlub3VzCisJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCArPSBjb3VudDsKKwkJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICY9IGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrOworCQl9IGVsc2UgewkvL1dyYXBhcm91bmQKKwkJCWluc3RhbmNlLT5kYXRhX2NvdW50ICs9IGNvdW50OworCQkJaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCArPSBjb3VudDsKKworCQkJaWYgKGluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgPT0gbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpKSB7CS8vUmVzZXQgcG9zaXRpb24gaW5kaWNhdG9yLgorCQkJCWluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgPSAwOworCQkJfSBlbHNlIGlmIChpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ID4gbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpKSB7CS8vVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuZCEKKwkJCQlQRVJST1JfQ1JJVElDQUwKKwkJCQkgICAgKCJQUkVMT0FERUQgTU9SRSBWQUxVRVMgVEhBTiBBUkUgSU4gQlVGRkVSIVxuIik7CisJCQkJTUVfU1VCREVWSUNFX0VYSVQ7CisJCQkJcmV0dXJuIE1FX0VSUk5PX0lOVEVSTkFMOworCQkJfQorCQl9CisKKwkJc3RhdHVzID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKKwkJaWYgKCEoc3RhdHVzICYgTUU2MDAwX0FPX1NUQVRVU19CSVRfSEYpKSB7CS8vTW9yZSB0aGFuIGhhbGYhCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQkJUElORk8oIjwlczolZD4gU3RhcnQgaW50ZXJydXB0cy5cbiIsIF9fZnVuY19fLAorCQkJICAgICAgX19MSU5FX18pOworCQkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJY3RybCB8PSBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBjdHJsKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCX0KKwl9CisJLy9TcGVjaWFsIGNhc2U6IExpbWl0ZWQgd3JhcGFyb3VuZCB3aXRoIGxlc3MgdGhhbiBIQUxGIEZJRk8gZGF0YXMgbmVlZCB3b3JrIGFyb3VuZCB0byBnZW5lcmF0ZSBmaXJzdCBpbnRlcnJ1cHQuCisJaWYgKChpbnN0YW5jZS0+c3RvcF9tb2RlICE9IE1FNjAwMF9BT19JTkZfU1RPUF9NT0RFKQorCSAgICAmJiAoaW5zdGFuY2UtPm1vZGUgPT0gTUU2MDAwX0FPX1NXX1dSQVBfTU9ERSkKKwkgICAgJiYgKGNpcmNfYnVmZmVyX2NvdW50IDw9IChNRTYwMDBfQU9fRklGT19DT1VOVCAvIDIpKSkgewkvL1B1dCBtb3JlIGRhdGEgdG8gRklGTworCQlQSU5GTygiTGltaXRlZCB3cmFwYXJvdW5kIHdpdGggbGVzcyB0aGFuIEhBTEYgRklGTyBkYXRhcy5cbiIpOworCQlpZiAoaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCkgewkvL1RoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbmQhCisJCQlQRVJST1JfQ1JJVElDQUwKKwkJCSAgICAoIkVSUk9SIFdIRU4gTE9BRElORyBWQUxVRVMgRk9SIFdSQVBBUk9VTkQhXG4iKTsKKwkJCU1FX1NVQkRFVklDRV9FWElUOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVEVSTkFMOworCQl9CisKKwkJd2hpbGUgKGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgPiBpbnN0YW5jZS0+ZGF0YV9jb3VudCkgewkvL01heGltdW0gZGF0YSBub3Qgc2V0IGpldC4KKwkJCS8vQ29weSB0byBidWZmZXIKKwkJCWlmIChjaXJjX2J1ZmZlcl9jb3VudCAhPSBhb193cml0ZV9kYXRhKGluc3RhbmNlLCBjaXJjX2J1ZmZlcl9jb3VudCwgMCkpIHsJLy9UaGlzIHNob3VsZCBuZXZlciBoYXBwZW5kIQorCQkJCVBFUlJPUl9DUklUSUNBTAorCQkJCSAgICAoIkVSUk9SIFdIRU4gTE9BRElORyBWQUxVRVMgRk9SIFdSQVBBUk9VTkQhXG4iKTsKKwkJCQlNRV9TVUJERVZJQ0VfRVhJVDsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisJCQl9CisJCQlpbnN0YW5jZS0+ZGF0YV9jb3VudCArPSBjaXJjX2J1ZmZlcl9jb3VudDsKKworCQkJaWYgKCEoKHN0YXR1cyA9IGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykpICYgTUU2MDAwX0FPX1NUQVRVU19CSVRfSEYpKSB7CS8vRklGTyBpcyBtb3JlIHRoYW4gaGFsZi4gRW5hYmxlIElSUSBhbmQgZW5kIGNvcHkuCisJCQkJLy9SZXNldCBpbnRlcnJ1cHQgbGF0Y2gKKwkJCQlpbmwoaW5zdGFuY2UtPmlycV9yZXNldF9yZWcpOworCisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJCSAgY3B1X2ZsYWdzKTsKKwkJCQlQSU5GTygiPCVzOiVkPiBTdGFydCBpbnRlcnJ1cHRzLlxuIiwKKwkJCQkgICAgICBfX2Z1bmNfXywgX19MSU5FX18pOworCQkJCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCQljdHJsIHw9IE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQkJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtCisJCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPgorCQkJCQkJICAgICAgIHN1YmRldmljZV9sb2NrLAorCQkJCQkJICAgICAgIGNwdV9mbGFncyk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJLy8gU2NoZWR1bGUgY29udHJvbCB0YXNrCisJaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnID0gMTsKKwlxdWV1ZV9kZWxheWVkX3dvcmsoaW5zdGFuY2UtPm1lNjAwMF93b3JrcXVldWUsCisJCQkgICAmaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFzaywgMSk7CisKKwlpZiAoc3RhcnRfbW9kZSA9PSBNRV9TVEFSVF9NT0RFX0JMT0NLSU5HKSB7CS8vV2FpdCBmb3Igc3RhcnQuCisJCXJlZiA9IGppZmZpZXM7CisJCS8vT25seSBydW5pbmcgcHJvY2VzcyB3aWxsIGludGVycnVwdCB0aGlzIGNhbGwuIEV2ZW50cyBhcmUgc2lnbmFsZWQgd2hlbiBzdGF0dXMgY2hhbmdlLiBFeHRyYSB0aW1lb3V0IGFkZCBmb3Igc2FmZSByZWFzb24uCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT53YWl0X3F1ZXVlLAorCQkJCQkJIChpbnN0YW5jZS0+c3RhdHVzICE9CisJCQkJCQkgIGFvX3N0YXR1c19zdHJlYW1fcnVuX3dhaXQpLAorCQkJCQkJIChkZWxheSkgPyBkZWxheSArCisJCQkJCQkgMSA6IExPTkdfTUFYKTsKKworCQlpZiAoKGluc3RhbmNlLT5zdGF0dXMgIT0gYW9fc3RhdHVzX3N0cmVhbV9ydW4pCisJCSAgICAmJiAoaW5zdGFuY2UtPnN0YXR1cyAhPSBhb19zdGF0dXNfc3RyZWFtX2VuZCkpIHsKKwkJCVBERUJVRygiU3RhcnRpbmcgc3RyZWFtIGNhbmNlbGVkLiAlZFxuIiwKKwkJCSAgICAgICBpbnN0YW5jZS0+c3RhdHVzKTsKKwkJCWVyciA9IE1FX0VSUk5PX0NBTkNFTExFRDsKKwkJfQorCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJUEVSUk9SKCJXYWl0IG9uIHN0YXJ0IG9mIHN0YXRlIG1hY2hpbmUgaW50ZXJydXB0ZWQuXG4iKTsKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfbm9uZTsKKwkJCWFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQl9CisKKwkJaWYgKChkZWxheSkgJiYgKChqaWZmaWVzIC0gcmVmKSA+PSBkZWxheSkpIHsKKwkJCWlmIChpbnN0YW5jZS0+c3RhdHVzICE9IGFvX3N0YXR1c19zdHJlYW1fcnVuKSB7CisJCQkJaWYgKGluc3RhbmNlLT5zdGF0dXMgPT0gYW9fc3RhdHVzX3N0cmVhbV9lbmQpIHsKKwkJCQkJUERFQlVHKCJUaW1lb3V0IHJlYWNoZWQuXG4iKTsKKwkJCQl9IGVsc2UgaWYgKChqaWZmaWVzIC0gcmVmKSA+IGRlbGF5KSB7CisJCQkJCVBFUlJPUgorCQkJCQkgICAgKCJUaW1lb3V0IHJlYWNoZWQuIE5vdCBoYW5kbGVkIGJ5IGNvbnRyb2wgdGFzayFcbiIpOworCQkJCQlhb19zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKwkJCQl9IGVsc2UgeworCQkJCQlQRVJST1IKKwkJCQkJICAgICgiVGltZW91dCByZWFjaGVkLiBTaWduYWwgY29tZSBidXQgc3RhdHVzIGlzIHN0cmFuZ2U6ICVkXG4iLAorCQkJCQkgICAgIGluc3RhbmNlLT5zdGF0dXMpOworCQkJCQlhb19zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKwkJCQl9CisKKwkJCQlpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgPSAwOworCQkJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmluc3RhbmNlLT5hb19jb250cm9sX3Rhc2spOworCQkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2VuZDsKKwkJCQllcnIgPSBNRV9FUlJOT19USU1FT1VUOworCQkJfQorCQl9CisJfQorCisJTUVfU1VCREVWSUNFX0VYSVQ7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTYwMDBfYW9faW9fc3RyZWFtX3N0YXR1cyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IHdhaXQsCisJCQkJICAgICAgaW50ICpzdGF0dXMsIGludCAqdmFsdWVzLCBpbnQgZmxhZ3MpCit7CisJbWU2MDAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCWluc3RhbmNlID0gKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKCEoaW5zdGFuY2UtPmZpZm8gJiBNRTYwMDBfQU9fSEFTX0ZJRk8pKSB7CisJCVBFUlJPUigiTm90IGEgc3RyZWFtaW5nIGFvLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworCX0KKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKCh3YWl0ICE9IE1FX1dBSVRfTk9ORSkgJiYgKHdhaXQgIT0gTUVfV0FJVF9JRExFKSkgeworCQlQRVJST1IoIkludmFsaWQgd2FpdCBhcmd1bWVudCBzcGVjaWZpZWQuXG4iKTsKKwkJKnN0YXR1cyA9IE1FX1NUQVRVU19JTlZBTElEOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9XQUlUOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXN3aXRjaCAoaW5zdGFuY2UtPnN0YXR1cykgeworCWNhc2UgYW9fc3RhdHVzX3NpbmdsZV9jb25maWd1cmVkOgorCWNhc2UgYW9fc3RhdHVzX3NpbmdsZV9lbmQ6CisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2NvbmZpZ3VyZWQ6CisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2VuZDoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fZmlmb19lcnJvcjoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fYnVmZmVyX2Vycm9yOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9lcnJvcjoKKwkJKnN0YXR1cyA9IE1FX1NUQVRVU19JRExFOworCQlicmVhazsKKworCWNhc2UgYW9fc3RhdHVzX3NpbmdsZV9ydW5fd2FpdDoKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfcnVuOgorCWNhc2UgYW9fc3RhdHVzX3NpbmdsZV9lbmRfd2FpdDoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fcnVuX3dhaXQ6CisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX3J1bjoKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fZW5kX3dhaXQ6CisJCSpzdGF0dXMgPSBNRV9TVEFUVVNfQlVTWTsKKwkJYnJlYWs7CisKKwljYXNlIGFvX3N0YXR1c19ub25lOgorCWRlZmF1bHQ6CisJCSpzdGF0dXMgPQorCQkgICAgKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJiBNRTYwMDBfQU9fU1RBVFVTX0JJVF9GU00pID8KKwkJICAgIE1FX1NUQVRVU19CVVNZIDogTUVfU1RBVFVTX0lETEU7CisJCWJyZWFrOworCX0KKworCWlmICgod2FpdCA9PSBNRV9XQUlUX0lETEUpICYmICgqc3RhdHVzID09IE1FX1NUQVRVU19CVVNZKSkgeworCQkvL09ubHkgcnVuaW5nIHByb2Nlc3Mgd2lsbCBpbnRlcnJ1cHQgdGhpcyBjYWxsLiBFdmVudHMgYXJlIHNpZ25hbGVkIHdoZW4gc3RhdHVzIGNoYW5nZS4gRXh0cmEgdGltZW91dCBhZGQgZm9yIHNhZmUgcmVhc29uLgorCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSAoKGluc3RhbmNlLT5zdGF0dXMgIT0KKwkJCQkJCSAgIGFvX3N0YXR1c19zaW5nbGVfcnVuX3dhaXQpCisJCQkJCQkgICYmIChpbnN0YW5jZS0+c3RhdHVzICE9CisJCQkJCQkgICAgICBhb19zdGF0dXNfc2luZ2xlX3J1bikKKwkJCQkJCSAgJiYgKGluc3RhbmNlLT5zdGF0dXMgIT0KKwkJCQkJCSAgICAgIGFvX3N0YXR1c19zaW5nbGVfZW5kX3dhaXQpCisJCQkJCQkgICYmIChpbnN0YW5jZS0+c3RhdHVzICE9CisJCQkJCQkgICAgICBhb19zdGF0dXNfc3RyZWFtX3J1bl93YWl0KQorCQkJCQkJICAmJiAoaW5zdGFuY2UtPnN0YXR1cyAhPQorCQkJCQkJICAgICAgYW9fc3RhdHVzX3N0cmVhbV9ydW4pCisJCQkJCQkgICYmIChpbnN0YW5jZS0+c3RhdHVzICE9CisJCQkJCQkgICAgICBhb19zdGF0dXNfc3RyZWFtX2VuZF93YWl0KSksCisJCQkJCQkgTE9OR19NQVgpOworCisJCWlmIChpbnN0YW5jZS0+c3RhdHVzICE9IGFvX3N0YXR1c19zdHJlYW1fZW5kKSB7CisJCQlQREVCVUcoIldhaXQgZm9yIElETEUgY2FuY2VsZWQuICVkXG4iLAorCQkJICAgICAgIGluc3RhbmNlLT5zdGF0dXMpOworCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQl9CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlQRVJST1IoIldhaXQgZm9yIElETEUgaW50ZXJydXB0ZWQuXG4iKTsKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfbm9uZTsKKwkJCWFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCQkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCQl9CisKKwkJKnN0YXR1cyA9IE1FX1NUQVRVU19JRExFOworCX0KKworCSp2YWx1ZXMgPSBtZV9jaXJjX2J1Zl9zcGFjZSgmaW5zdGFuY2UtPmNpcmNfYnVmKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTYwMDBfYW9faW9fc3RyZWFtX3N0b3AobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IHN0b3BfbW9kZSwgaW50IGZsYWdzKQorewkJCQkvLy8gQG5vdGUgU3RvcCB3b3JrIGFuZCBlbXB0eSBidWZmZXIgYW5kIEZJRk8KKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwltZTYwMDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCXZvbGF0aWxlIHVpbnQzMl90IGN0cmw7CisKKwlpbnN0YW5jZSA9IChtZTYwMDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmIChmbGFncyAmIH5NRV9JT19TVFJFQU1fU1RPUF9QUkVTRVJWRV9CVUZGRVJTKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoKHN0b3BfbW9kZSAhPSBNRV9TVE9QX01PREVfSU1NRURJQVRFKQorCSAgICAmJiAoc3RvcF9tb2RlICE9IE1FX1NUT1BfTU9ERV9MQVNUX1ZBTFVFKSkgeworCQlQRVJST1IoIkludmFsaWQgc3RvcCBtb2RlIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVE9QX01PREU7CisJfQorCisJaWYgKCEoaW5zdGFuY2UtPmZpZm8gJiBNRTYwMDBfQU9fSEFTX0ZJRk8pKSB7CisJCVBFUlJPUigiTm90IGEgc3RyZWFtaW5nIGFvLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworCX0KKworCWlmIChpbnN0YW5jZS0+c3RhdHVzIDwgYW9fc3RhdHVzX3N0cmVhbV9jb25maWd1cmVkKSB7CisJCS8vVGhlcmUgaXMgbm90aGluZyB0byBzdG9wIQorCQlQRVJST1IoIlN1YmRldmljZSBub3QgaW4gc3RyZWFtaW5nIG1vZGUuICVkXG4iLAorCQkgICAgICAgaW5zdGFuY2UtPnN0YXR1cyk7CisJCXJldHVybiBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJLy9NYXJrIGFzIHN0b3BwaW5nLiA9PiBTb2Z0d2FyZSBzdG9wLgorCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2VuZF93YWl0OworCisJaWYgKHN0b3BfbW9kZSA9PSBNRV9TVE9QX01PREVfSU1NRURJQVRFKSB7CS8vU3RvcHBlZCBub3chCisJCWVyciA9IGFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCX0gZWxzZSBpZiAoc3RvcF9tb2RlID09IE1FX1NUT1BfTU9ERV9MQVNUX1ZBTFVFKSB7CisJCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKSAmIE1FNjAwMF9BT19DVFJMX01PREVfTUFTSzsKKwkJaWYgKGN0cmwgPT0gTUU2MDAwX0FPX01PREVfV1JBUEFST1VORCkgewkvL0hhcmR3YXJlIHdyYXBhcm91bmQgPT4gSGFyZHdhcmUgc3RvcC4KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJCQljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQljdHJsIHw9IE1FNjAwMF9BT19DVFJMX0JJVF9TVE9QOworCQkJY3RybCAmPSB+TUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgY3RybCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCisJCQkvL1Jlc2V0IGludGVycnVwdCBsYXRjaAorCQkJaW5sKGluc3RhbmNlLT5pcnFfcmVzZXRfcmVnKTsKKwkJfQorCQkvL09ubHkgcnVuaW5nIHByb2Nlc3Mgd2lsbCBpbnRlcnJ1cHQgdGhpcyBjYWxsLiBFdmVudHMgYXJlIHNpZ25hbGVkIHdoZW4gc3RhdHVzIGNoYW5nZS4gRXh0cmEgdGltZW91dCBhZGQgZm9yIHNhZmUgcmVhc29uLgorCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSAoaW5zdGFuY2UtPnN0YXR1cyAhPQorCQkJCQkJICBhb19zdGF0dXNfc3RyZWFtX2VuZF93YWl0KSwKKwkJCQkJCSBMT05HX01BWCk7CisKKwkJaWYgKGluc3RhbmNlLT5zdGF0dXMgIT0gYW9fc3RhdHVzX3N0cmVhbV9lbmQpIHsKKwkJCVBERUJVRygiU3RvcHBpbmcgc3RyZWFtIGNhbmNlbGVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19DQU5DRUxMRUQ7CisJCX0KKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCVBFUlJPUigiU3RvcHBpbmcgc3RyZWFtIGludGVycnVwdGVkLlxuIik7CisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX25vbmU7CisJCQlhb19zdG9wX2ltbWVkaWF0ZWx5KGluc3RhbmNlKTsKKwkJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwkJfQorCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCWN0cmwgfD0gTUU2MDAwX0FPX0NUUkxfQklUX1NUT1AgfCBNRTYwMDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJY3RybCAmPSB+TUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJaWYgKCFmbGFncykgewkJLy9SZXNldCBGSUZPCisJCWN0cmwgJj0gfk1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfRklGTzsKKwl9CisJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisKKwkvL1Jlc2V0IGludGVycnVwdCBsYXRjaAorCWlubChpbnN0YW5jZS0+aXJxX3Jlc2V0X3JlZyk7CisKKwlpZiAoIWZsYWdzKSB7CQkvL1Jlc2V0IHNvZnR3YXJlIGJ1ZmZlcgorCQlpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCA9IDA7CisJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsID0gMDsKKwkJaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCA9IDA7CisJCWluc3RhbmNlLT5kYXRhX2NvdW50ID0gMDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU2MDAwX2FvX2lvX3N0cmVhbV93cml0ZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCB3cml0ZV9tb2RlLAorCQkJCSAgICAgaW50ICp2YWx1ZXMsIGludCAqY291bnQsIGludCBmbGFncykKK3sKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwltZTYwMDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzID0gMDsKKwl1aW50MzJfdCByZWdfY29weTsKKworCWludCBjb3BpZWRfZnJvbV91c2VyID0gMDsKKwlpbnQgbGVmdF90b19jb3B5X2Zyb21fdXNlciA9ICpjb3VudDsKKworCWludCBjb3BpZWRfdmFsdWVzOworCisJaW5zdGFuY2UgPSAobWU2MDAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwkvL0NoZWNraW5nIGFyZ3VtZW50cworCWlmICghKGluc3RhbmNlLT5maWZvICYgTUU2MDAwX0FPX0hBU19GSUZPKSkgeworCQlQRVJST1IoIk5vdCBhIHN0cmVhbWluZyBhby5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKKwl9CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICgqY291bnQgPD0gMCkgeworCQlQRVJST1IoIkludmFsaWQgY291bnQgb2YgdmFsdWVzIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9WQUxVRV9DT1VOVDsKKwl9CisKKwlpZiAodmFsdWVzID09IE5VTEwpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGFkZHJlc3Mgb2YgdmFsdWVzIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9QT0lOVEVSOworCX0KKworCWlmICgoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfbm9uZSkgfHwgKGluc3RhbmNlLT5zdGF0dXMgPT0gYW9fc3RhdHVzX3NpbmdsZV9jb25maWd1cmVkKSkgewkvL1RoZSBkZXZpY2UgaXMgaW4gc2luZ2xlIG1vZGUuCisJCVBFUlJPUgorCQkgICAgKCJTdWJkZXZpY2UgbXVzdCBiZSBwcmVpbml0aWFsaXplIGNvcnJlY3RseSBmb3Igc3RyZWFtaW5nLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJfQorCisJc3dpdGNoICh3cml0ZV9tb2RlKSB7CisJY2FzZSBNRV9XUklURV9NT0RFX1BSRUxPQUQ6CisKKwkJLy9EZXZpY2UgbXVzdCBiZSBzdG9wcGVkLgorCQlpZiAoKGluc3RhbmNlLT5zdGF0dXMgIT0gYW9fc3RhdHVzX3N0cmVhbV9jb25maWd1cmVkKQorCQkgICAgJiYgKGluc3RhbmNlLT5zdGF0dXMgIT0gYW9fc3RhdHVzX3N0cmVhbV9lbmQpKSB7CisJCQlQRVJST1IKKwkJCSAgICAoIlN1YmRldmljZSBtdXN0bid0IGJlIHJ1bmluZyB3aGVuICdwcmUtbG9hZCcgbW9kZSBpcyB1c2VkLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCQl9CisJCWJyZWFrOworCWNhc2UgTUVfV1JJVEVfTU9ERV9OT05CTE9DS0lORzoKKwljYXNlIE1FX1dSSVRFX01PREVfQkxPQ0tJTkc6CisJCS8vLyBAbm90ZSBJbiBibG9ja2luZyBtb2RlOiBXaGVuIGRldmljZSBpcyBub3QgcnVuaW5nIGFuZCB0aGVyZSBpcyBub3QgZW5vdWdodCBzcGFjZSBjYWxsIHdpbGwgYmxvY2tlZCB1cCEKKwkJLy8vIEBub3RlIFNvbWUgb3RoZXIgdGhyZWFkIG11c3QgZW1wdHkgYnVmZmVyIGJ5IHN0cmF0aW5nIGVuZ2luZS4KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgd3JpdGUgbW9kZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfV1JJVEVfTU9ERTsKKwl9CisKKwlpZiAoaW5zdGFuY2UtPm1vZGUgJiBNRTYwMDBfQU9fV1JBUF9NT0RFKSB7CS8vV3JhcGFyb3VuZCBtb2RlLiBEZXZpY2UgbXVzdCBiZSBzdG9wcGVkLgorCQlpZiAoKGluc3RhbmNlLT5zdGF0dXMgIT0gYW9fc3RhdHVzX3N0cmVhbV9jb25maWd1cmVkKQorCQkgICAgJiYgKGluc3RhbmNlLT5zdGF0dXMgIT0gYW9fc3RhdHVzX3N0cmVhbV9lbmQpKSB7CisJCQlQRVJST1IKKwkJCSAgICAoIlN1YmRldmljZSBtdXN0bid0IGJlIHJ1bmluZyB3aGVuICdwcmUtbG9hZCcgbW9kZSBpcyB1c2VkLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9XUklURV9NT0RFOworCQl9CisJfQorCisJaWYgKChpbnN0YW5jZS0+bW9kZSA9PSBNRTYwMDBfQU9fSFdfV1JBUF9NT0RFKQorCSAgICAmJiAod3JpdGVfbW9kZSAhPSBNRV9XUklURV9NT0RFX1BSRUxPQUQpKSB7CisvKgorCQlQRVJST1IoIk9ubHkgJ3ByZS1sb2FkJyB3cml0ZSBpcyBhY2NlcHRhYmxlIGluIGhhcmR3YXJlIHdyYXBhcm91bmQgbW9kZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworKi8KKwkJLy9UaGlzIGlzIHRyYW5zcGFyZW50IGZvciB1c2VyLgorCQlQREVCVUcoIkNoYW5naW5nIHdyaXRlX21vZGUgdG8gTUVfV1JJVEVfTU9ERV9QUkVMT0FELlxuIik7CisJCXdyaXRlX21vZGUgPSBNRV9XUklURV9NT0RFX1BSRUxPQUQ7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJaWYgKHdyaXRlX21vZGUgPT0gTUVfV1JJVEVfTU9ERV9QUkVMT0FEKSB7CS8vSW5pdCBlbnZpcm9tZW50IC0gcHJlbG9hZAorCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQlyZWdfY29weSA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkvL0NoZWNrIEZJRk8KKwkJaWYgKCEocmVnX2NvcHkgJiBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk8pKSB7CS8vRklGTyBub3QgYWN0aXZlLiBFbmFibGUgaXQuCisJCQlyZWdfY29weSB8PSBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk87CisJCQlvdXRsKHJlZ19jb3B5LCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHJlZ19jb3B5KTsKKwkJCWluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgPSAwOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwl9CisKKwl3aGlsZSAoMSkgeworCQkvL0NvcHkgdG8gYnVmZmVyLiBUaGlzIHN0ZXAgaXMgY29tbW9uIGZvciBhbGwgbW9kZXMuCisJCWNvcGllZF9mcm9tX3VzZXIgPQorCQkgICAgYW9fZ2V0X2RhdGFfZnJvbV91c2VyKGluc3RhbmNlLCBsZWZ0X3RvX2NvcHlfZnJvbV91c2VyLAorCQkJCQkgIHZhbHVlcyArICgqY291bnQgLQorCQkJCQkJICAgIGxlZnRfdG9fY29weV9mcm9tX3VzZXIpKTsKKwkJbGVmdF90b19jb3B5X2Zyb21fdXNlciAtPSBjb3BpZWRfZnJvbV91c2VyOworCisJCXJlZ19jb3B5ID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKKwkJaWYgKChpbnN0YW5jZS0+c3RhdHVzID09IGFvX3N0YXR1c19zdHJlYW1fcnVuKSAmJiAhKHJlZ19jb3B5ICYgTUU2MDAwX0FPX1NUQVRVU19CSVRfRlNNKSkgewkvL0JST0tFTiBQSVBFISBUaGUgc3RhdGUgbWFjaGluZSBpcyBzdG9wZWQgYnV0IGxvZ2ljYWwgc3RhdHVzIHNob3cgdGhhdCBzaG91bGQgYmUgd29ya2luZy4KKwkJCVBFUlJPUigiQnJva2VuIHBpcGUgaW4gd3JpdGUuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX1NVQkRFVklDRV9OT1RfUlVOTklORzsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKChpbnN0YW5jZS0+c3RhdHVzID09IGFvX3N0YXR1c19zdHJlYW1fcnVuKSAmJiAoaW5zdGFuY2UtPm1vZGUgPT0gTUU2MDAwX0FPX0NPTlRJTk9VUykgJiYgKHJlZ19jb3B5ICYgTUU2MDAwX0FPX1NUQVRVU19CSVRfSEYpKSB7CS8vQ29udGlub3VzIG1vZGUgcnVuaW5nIGFuZCBkYXRhIGFyZSBiZWxvdyBoYWxmIQorCisJCQkvLyBCbG9jayBpbnRlcnJ1cHRzLgorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkJCXJlZ19jb3B5ID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQlyZWdfY29weSAmPSB+TUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCQlvdXRsKHJlZ19jb3B5LCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHJlZ19jb3B5KTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisKKwkJCS8vRmFzdCBjb3B5CisJCQljb3BpZWRfdmFsdWVzID0KKwkJCSAgICBhb193cml0ZV9kYXRhKGluc3RhbmNlLCBNRTYwMDBfQU9fRklGT19DT1VOVCAvIDIsCisJCQkJCSAgMCk7CisJCQlpZiAoY29waWVkX3ZhbHVlcyA+IDApIHsKKwkJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCArPSBjb3BpZWRfdmFsdWVzOworCQkJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICY9CisJCQkJICAgIGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLy9SZXNldCBpbnRlcnJ1cHQgbGF0Y2gKKwkJCWlubChpbnN0YW5jZS0+aXJxX3Jlc2V0X3JlZyk7CisKKwkJCS8vIEFjdGl2YXRlIGludGVycnVwdHMuCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCQkJcmVnX2NvcHkgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCXJlZ19jb3B5IHw9IE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQkJb3V0bChyZWdfY29weSwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICByZWdfY29weSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCisJCQlpZiAoY29waWVkX3ZhbHVlcyA9PSAwKSB7CS8vVGhpcyB3YXMgY2hlY2tlZCBhbmQgbmV2ZXIgc2hvdWxkIGhhcHBlbmQhCisJCQkJUEVSUk9SX0NSSVRJQ0FMKCJDT1BZIEZJTklTSCBXSVRIIDAhXG4iKTsKKwkJCX0KKworCQkJaWYgKGNvcGllZF92YWx1ZXMgPCAwKSB7CS8vVGhpcyB3YXMgY2hlY2tlZCBhbmQgbmV2ZXIgc2hvdWxkIGhhcHBlbmQhCisJCQkJUEVSUk9SX0NSSVRJQ0FMKCJDT1BZIEZJTklTSCBXSVRIIEVSUk9SIVxuIik7CisJCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZmlmb19lcnJvcjsKKwkJCQllcnIgPSBNRV9FUlJOT19GSUZPX0JVRkZFUl9PVkVSRkxPVzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmICghbGVmdF90b19jb3B5X2Zyb21fdXNlcikgewkvL0FsbCBkYXRhcyB3ZXJlIGNvcGllZC4KKwkJCWJyZWFrOworCQl9IGVsc2UgewkvL05vdCBhbGwgZGF0YXMgd2VyZSBjb3BpZWQuCisJCQlpZiAoaW5zdGFuY2UtPm1vZGUgJiBNRTYwMDBfQU9fV1JBUF9NT0RFKSB7CS8vRXJyb3IgdG9vIG11Y2ggZGF0YXMhIFdyYXBhcm91bmQgaXMgbGltaXRlZCBpbiBzaXplIQorCQkJCVBFUlJPUgorCQkJCSAgICAoIlRvbyBtdWNoIGRhdGEgZm9yIHdyYXBhcm91bmQgbW9kZSEgIEV4Y2VlZGVkIHNpemUgb2YgJWxkLlxuIiwKKwkJCQkgICAgIE1FNjAwMF9BT19DSVJDX0JVRl9DT1VOVCAtIDEpOworCQkJCWVyciA9IE1FX0VSUk5PX1JJTkdfQlVGRkVSX09WRVJGTE9XOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAod3JpdGVfbW9kZSAhPSBNRV9XUklURV9NT0RFX0JMT0NLSU5HKSB7CS8vTm9uIGJsb2NraW5nIGNhbGxzCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSBtZV9jaXJjX2J1Zl9zcGFjZSgmaW5zdGFuY2UtPgorCQkJCQkJCQkgICBjaXJjX2J1ZikpOworCisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlQRVJST1IoIldyaXRpbmcgaW50ZXJydXB0ZWQgYnkgc2lnbmFsLlxuIik7CisJCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19ub25lOworCQkJCWFvX3N0b3BfaW1tZWRpYXRlbHkoaW5zdGFuY2UpOworCQkJCWVyciA9IE1FX0VSUk5PX1NJR05BTDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKGluc3RhbmNlLT5zdGF0dXMgPT0gYW9fc3RhdHVzX25vbmUpIHsJLy9SZXNldAorCQkJCVBFUlJPUigiV3JpdGluZyBpbnRlcnJ1cHRlZCBieSByZXNldC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0NBTkNFTExFRDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmICh3cml0ZV9tb2RlID09IE1FX1dSSVRFX01PREVfUFJFTE9BRCkgewkvL0NvcHkgZGF0YSB0byBGSUZPIC0gcHJlbG9hZAorCQljb3BpZWRfdmFsdWVzID0KKwkJICAgIGFvX3dyaXRlX2RhdGFfcG9vbGluZyhpbnN0YW5jZSwgTUU2MDAwX0FPX0ZJRk9fQ09VTlQsCisJCQkJCSAgaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCk7CisJCWluc3RhbmNlLT5wcmVsb2FkZWRfY291bnQgKz0gY29waWVkX3ZhbHVlczsKKwkJaW5zdGFuY2UtPmRhdGFfY291bnQgKz0gY29waWVkX3ZhbHVlczsKKworCQlpZiAoKGluc3RhbmNlLT5tb2RlID09IE1FNjAwMF9BT19IV19XUkFQX01PREUpCisJCSAgICAmJiAobWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpID4KKwkJCU1FNjAwMF9BT19GSUZPX0NPVU5UKSkgeworCQkJUEVSUk9SCisJCQkgICAgKCJUb28gbXVjaCBkYXRhIGZvciBoYXJkd2FyZSB3cmFwYXJvdW5kIG1vZGUhIEV4Y2VlZGVkIHNpemUgb2YgJWQuXG4iLAorCQkJICAgICBNRTYwMDBfQU9fRklGT19DT1VOVCk7CisJCQllcnIgPSBNRV9FUlJOT19GSUZPX0JVRkZFUl9PVkVSRkxPVzsKKwkJfQorCX0KKworCSpjb3VudCA9ICpjb3VudCAtIGxlZnRfdG9fY29weV9mcm9tX3VzZXI7CisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDE5KQorc3RhdGljIGlycXJldHVybl90IG1lNjAwMF9hb19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQorI2Vsc2UKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTYwMDBfYW9faXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCisjZW5kaWYKK3sKKwltZTYwMDBfYW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlID0gZGV2X2lkOworCXVpbnQzMl90IGlycV9zdGF0dXM7CisJdWludDMyX3QgY3RybDsKKwl1aW50MzJfdCBzdGF0dXM7CisJaW50IGNvdW50ID0gMDsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlpZiAoaXJxICE9IGluc3RhbmNlLT5pcnEpIHsKKwkJUEVSUk9SKCJJbmNvcnJlY3QgaW50ZXJydXB0IG51bTogJWQuXG4iLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJaXJxX3N0YXR1cyA9IGlubChpbnN0YW5jZS0+aXJxX3N0YXR1c19yZWcpOworCWlmICghKGlycV9zdGF0dXMgJiAoTUU2MDAwX0lSUV9TVEFUVVNfQklUX0FPX0hGIDw8IGluc3RhbmNlLT5hb19pZHgpKSkgeworCQlQSU5GTygiJWxkIFNoYXJlZCBpbnRlcnJ1cHQuICVzKCk6IElEPSVkOiBzdGF0dXNfcmVnPTB4JTA0WFxuIiwKKwkJICAgICAgamlmZmllcywgX19mdW5jX18sIGluc3RhbmNlLT5hb19pZHgsIGlycV9zdGF0dXMpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJaWYgKCFpbnN0YW5jZS0+Y2lyY19idWYuYnVmKSB7CisJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2Vycm9yOworCQlQRVJST1JfQ1JJVElDQUwoIkNJUkNVTEFSIEJVRkZFUiBOT1QgRVhJU1RTIVxuIik7CisJCS8vQmxvY2sgaW50ZXJydXB0cy4gU3RvcCBtYWNoaW5lLgorCQljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCWN0cmwgJj0gfk1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJROworCQljdHJsIHw9CisJCSAgICBNRTYwMDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfCBNRTYwMDBfQU9fQ1RSTF9CSVRfU1RPUDsKKwkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKworCQkvL0luZm9ybSB1c2VyCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCXN0YXR1cyA9IGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZyk7CisJaWYgKCEoc3RhdHVzICYgTUU2MDAwX0FPX1NUQVRVU19CSVRfRlNNKSkgewkvL1RvbyBsYXRlLiBOb3Qgd29ya2luZyEgRU5EPyBCUk9LRU4gUElQRT8KKwkJLy8vIEBub3RlIEVycm9yIGNoZWNraW5nIHdhcyBtb3ZlZCB0byBzZXBhcmF0ZSB0YXNrLgorCQlQREVCVUcoIkludGVycnVwdCBjb21lIGJ1dCBJU00gaXMgbm90IHdvcmtpbmchXG4iKTsKKwkJLy9CbG9jayBpbnRlcnJ1cHRzLiBTdG9wIG1hY2hpbmUuCisJCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJY3RybCAmPSB+TUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CisJCWN0cmwgfD0KKwkJICAgIE1FNjAwMF9BT19DVFJMX0JJVF9TVE9QIHwgTUU2MDAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QOworCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCisJCS8vUmVzZXQgaW50ZXJydXB0IGxhdGNoCisJCWlubChpbnN0YW5jZS0+aXJxX3Jlc2V0X3JlZyk7CisKKwkJLy8vIEBub3RlIFVzZXIgbm90aWZpY2F0aW9uIHdhcyBhbHNvIG1vdmVkIHRvIHNlcGFyYXRlIHRhc2suCisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisJLy9HZW5lcmFsIHByb2NlZHVyZS4gUHJvY2VzcyBtb3JlIGRhdGFzLgorCisjaWZkZWYgTUVERUJVR19ERUJVRworCWlmICghbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpKSB7CS8vQnVmZmVyIGlzIGVtcHR5IQorCQlQREVCVUcoIkNpcmN1bGFyIGJ1ZmZlciBlbXB0eSFcbiIpOworCX0KKyNlbmRpZgorCisJLy9DaGVjayBGSUZPCisJaWYgKHN0YXR1cyAmIE1FNjAwMF9BT19TVEFUVVNfQklUX0hGKSB7CS8vT0sgbGVzcyB0aGFuIGhhbGYKKworCQkvL0Jsb2NrIGludGVycnVwdHMKKwkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQljdHJsICY9IH5NRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKworCQlkbyB7CisJCQkvL0NhbGN1bGF0ZSBob3cgbWFueSBzaG91bGQgYmUgY29waWVkLgorCQkJY291bnQgPQorCQkJICAgIChpbnN0YW5jZS0+c3RvcF9kYXRhX2NvdW50KSA/IGluc3RhbmNlLT4KKwkJCSAgICBzdG9wX2RhdGFfY291bnQgLQorCQkJICAgIGluc3RhbmNlLT5kYXRhX2NvdW50IDogTUU2MDAwX0FPX0ZJRk9fQ09VTlQgLyAyOworCQkJaWYgKE1FNjAwMF9BT19GSUZPX0NPVU5UIC8gMiA8IGNvdW50KSB7CisJCQkJY291bnQgPSBNRTYwMDBfQU9fRklGT19DT1VOVCAvIDI7CisJCQl9CisJCQkvL0NvcHkgZGF0YQorCQkJaWYgKGluc3RhbmNlLT5tb2RlID09IE1FNjAwMF9BT19DT05USU5PVVMpIHsJLy9Db250aW5vdXMKKwkJCQljb3VudCA9IGFvX3dyaXRlX2RhdGEoaW5zdGFuY2UsIGNvdW50LCAwKTsKKwkJCQlpZiAoY291bnQgPiAwKSB7CisJCQkJCWluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICs9IGNvdW50OworCQkJCQlpbnN0YW5jZS0+Y2lyY19idWYudGFpbCAmPQorCQkJCQkgICAgaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJCQkJCWluc3RhbmNlLT5kYXRhX2NvdW50ICs9IGNvdW50OworCisJCQkJCWlmICgoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfc3RyZWFtX2VuZF93YWl0KSAmJiAhbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpKSB7CS8vU3RvcGluZy4gV2hvbGUgYnVmZmVyIHdhcyBjb3BpZWQuCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSBpZiAoKGluc3RhbmNlLT5tb2RlID09IE1FNjAwMF9BT19TV19XUkFQX01PREUpICYmICgoY3RybCAmIE1FNjAwMF9BT19DVFJMX01PREVfTUFTSykgPT0gTUU2MDAwX0FPX01PREVfQ09OVElOVU9VUykpIHsJLy9XcmFwYXJvdW5kIChzb2Z0d2FyZSkKKwkJCQlpZiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfc3RyZWFtX2VuZF93YWl0KSB7CS8vV2Ugc3RvcGluZyA9PiBDb3B5IHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KKwkJCQkJY291bnQgPQorCQkJCQkgICAgYW9fd3JpdGVfZGF0YShpbnN0YW5jZSwgY291bnQsIDApOworCQkJCX0gZWxzZSB7CS8vQ29weSBpbiB3cmFwYXJvdW5kIG1vZGUuCisJCQkJCWNvdW50ID0KKwkJCQkJICAgIGFvX3dyaXRlX2RhdGFfd3JhcGFyb3VuZChpbnN0YW5jZSwKKwkJCQkJCQkJICAgICBjb3VudCwKKwkJCQkJCQkJICAgICBpbnN0YW5jZS0+CisJCQkJCQkJCSAgICAgcHJlbG9hZGVkX2NvdW50KTsKKwkJCQl9CisKKwkJCQlpZiAoY291bnQgPiAwKSB7CisJCQkJCWluc3RhbmNlLT5kYXRhX2NvdW50ICs9IGNvdW50OworCQkJCQlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ICs9IGNvdW50OworCQkJCQlpbnN0YW5jZS0+cHJlbG9hZGVkX2NvdW50ICU9CisJCQkJCSAgICBtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT4KKwkJCQkJCQkgICAgICAgY2lyY19idWYpOworCisJCQkJCWlmICgoaW5zdGFuY2UtPnN0YXR1cyA9PSBhb19zdGF0dXNfc3RyZWFtX2VuZF93YWl0KSAmJiAhaW5zdGFuY2UtPnByZWxvYWRlZF9jb3VudCkgewkvL1N0b3BpbmcuIFdob2xlIGJ1ZmZlciB3YXMgY29waWVkLgorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWlmICgoY291bnQgPD0gMCkgfHwgKGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgJiYgKGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQgPD0gaW5zdGFuY2UtPmRhdGFfY291bnQpKSkgewkvL0VuZCBvZiB3b3JrLgorCQkJCWJyZWFrOworCQkJfQorCQl9CQkvL1JlcGVhdCBpZiBzdGlsbCBpcyB1bmRlciBoYWxmIGZpZm8KKwkJd2hpbGUgKChzdGF0dXMgPQorCQkJaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSkgJiBNRTYwMDBfQU9fU1RBVFVTX0JJVF9IRik7CisKKwkJLy9VbmJsb2NrIGludGVycnVwdHMKKwkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlpZiAoY291bnQgPj0gMCkgewkvL0NvcHkgd2FzIHN1Y2Nlc3NmdWwuCisJCQlpZiAoaW5zdGFuY2UtPnN0b3BfZGF0YV9jb3VudCAmJiAoaW5zdGFuY2UtPnN0b3BfZGF0YV9jb3VudCA8PSBpbnN0YW5jZS0+ZGF0YV9jb3VudCkpIHsJLy9GaW5pc2hpbmcgd29yay4gTm8gbW9yZSBpbnRlcnJ1cHRzLgorCQkJCVBERUJVRygiRmluaXNoaW5nIHdvcmsuIEludGVycnVwdCBkaXNhYmxlZC5cbiIpOworCQkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2VuZF93YWl0OworCQkJfSBlbHNlIGlmIChjb3VudCA+IDApIHsJLy9Ob3JtYWwgd29yay4gRW5hYmxlIGludGVycnVwdC4KKwkJCQlQREVCVUcoIk5vcm1hbCB3b3JrLiBFbmFibGUgaW50ZXJydXB0LlxuIik7CisJCQkJY3RybCB8PSBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKKwkJCX0gZWxzZSB7CS8vTm9ybWFsIHdvcmsgYnV0IHRoZXJlIGFyZSBubyBtb3JlIGRhdGEgaW4gYnVmZmVyLiBJbnRlcnJ1cHQgYmxvY2tlZC4gc3RyZWFtX3dyaXRlKCkgd2lsbCB1bmJsb2NrIGl0LgorCQkJCVBERUJVRworCQkJCSAgICAoIk5vIGRhdGEgaW4gc29mdHdhcmUgYnVmZmVyLiBJbnRlcnJ1cHQgYmxvY2tlZC5cbiIpOworCQkJfQorCQl9IGVsc2UgewkvL0Vycm9yIGR1cmluZyBjb3B5LgorCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZmlmb19lcnJvcjsKKwkJfQorCisJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJfSBlbHNlIHsJCS8vPz8gbW9yZSB0aGFuIGhhbGYKKwkJUERFQlVHCisJCSAgICAoIkludGVycnVwdCBjb21lIGJ1dCBGSUZPIG1vcmUgdGhhbiBoYWxmIGZ1bGwhIFJlc2V0IGludGVycnVwdC5cbiIpOworCX0KKworCVBJTkZPKCJJU1I6IEJ1ZmZlciBjb3VudDogJWQuKFQ6JWQgSDolZClcbiIsCisJICAgICAgbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpLCBpbnN0YW5jZS0+Y2lyY19idWYudGFpbCwKKwkgICAgICBpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCk7CisJUElORk8oIklTUjogU3RvcCBjb3VudDogJWQuXG4iLCBpbnN0YW5jZS0+c3RvcF9jb3VudCk7CisJUElORk8oIklTUjogU3RvcCBkYXRhIGNvdW50OiAlZC5cbiIsIGluc3RhbmNlLT5zdG9wX2RhdGFfY291bnQpOworCVBJTkZPKCJJU1I6IERhdGEgY291bnQ6ICVkLlxuIiwgaW5zdGFuY2UtPmRhdGFfY291bnQpOworCisJLy9SZXNldCBpbnRlcnJ1cHQgbGF0Y2gKKwlpbmwoaW5zdGFuY2UtPmlycV9yZXNldF9yZWcpOworCisJLy9JbmZvcm0gdXNlcgorCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgbWU2MDAwX2FvX2Rlc3RydWN0b3Ioc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlKQoreworCW1lNjAwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlpbnN0YW5jZSA9IChtZTYwMDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWluc3RhbmNlLT5hb19jb250cm9sX3Rhc2tfZmxhZyA9IDA7CisKKwkvLyBSZXNldCBzdWJkZXZpY2UgdG8gYXN1cmUgY2xlYW4gZXhpdC4KKwltZTYwMDBfYW9faW9fcmVzZXRfc3ViZGV2aWNlKHN1YmRldmljZSwgTlVMTCwKKwkJCQkgICAgIE1FX0lPX1JFU0VUX1NVQkRFVklDRV9OT19GTEFHUyk7CisKKwkvLyBSZW1vdmUgYW55IHRhc2tzIGZyb20gd29yayBxdWV1ZS4gVGhpcyBpcyBwYXJhbm9pYyBiZWNhdXNlIGl0IHdhcyBkb25lIGFsbHJlYWR5IGluIHJlc2V0KCkuCisJaWYgKCFjYW5jZWxfZGVsYXllZF93b3JrKCZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrKSkgewkvL1dhaXQgMiB0aWNrcyB0byBiZSBzdXJlIHRoYXQgY29udHJvbCB0YXNrIGlzIHJlbW92ZWQgZnJvbSBxdWV1ZS4KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgyKTsKKwl9CisKKwlpZiAoaW5zdGFuY2UtPmZpZm8gJiBNRTYwMDBfQU9fSEFTX0ZJRk8pIHsKKwkJaWYgKGluc3RhbmNlLT5pcnEpIHsKKwkJCWZyZWVfaXJxKGluc3RhbmNlLT5pcnEsIGluc3RhbmNlKTsKKwkJCWluc3RhbmNlLT5pcnEgPSAwOworCQl9CisKKwkJaWYgKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYpIHsKKwkJCVBERUJVRygiZnJlZSBjaXJjX2J1ZiA9ICVwIHNpemU9JWQiLAorCQkJICAgICAgIGluc3RhbmNlLT5jaXJjX2J1Zi5idWYsCisJCQkgICAgICAgUEFHRV9TSElGVCA8PCBNRTYwMDBfQU9fQ0lSQ19CVUZfU0laRV9PUkRFUik7CisJCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWluc3RhbmNlLT5jaXJjX2J1Zi5idWYsCisJCQkJICAgTUU2MDAwX0FPX0NJUkNfQlVGX1NJWkVfT1JERVIpOworCQl9CisJCWluc3RhbmNlLT5jaXJjX2J1Zi5idWYgPSBOVUxMOworCX0KKworCW1lX3N1YmRldmljZV9kZWluaXQoJmluc3RhbmNlLT5iYXNlKTsKKwlrZnJlZShpbnN0YW5jZSk7Cit9CisKK21lNjAwMF9hb19zdWJkZXZpY2VfdCAqbWU2MDAwX2FvX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgIHNwaW5sb2NrX3QgKiBwcmVsb2FkX3JlZ19sb2NrLAorCQkJCQkgICAgIHVpbnQzMl90ICogcHJlbG9hZF9mbGFncywKKwkJCQkJICAgICB1aW50MzJfdCAqIHRyaWdnZXJpbmdfZmxhZ3MsCisJCQkJCSAgICAgaW50IGFvX2lkeCwKKwkJCQkJICAgICBpbnQgZmlmbywKKwkJCQkJICAgICBpbnQgaXJxLAorCQkJCQkgICAgIGludCBoaWdoX3JhbmdlLAorCQkJCQkgICAgIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICptZTYwMDBfd3EpCit7CisJbWU2MDAwX2FvX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQgSUQ9JWQuXG4iLCBhb19pZHgpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UgKi8KKwlzdWJkZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTYwMDBfYW9fc3ViZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghc3ViZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc3ViZGV2aWNlLCAwLCBzaXplb2YobWU2MDAwX2FvX3N1YmRldmljZV90KSk7CisKKwkvKiBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzICovCisJZXJyID0gbWVfc3ViZGV2aWNlX2luaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlzdWJkZXZpY2UtPnByZWxvYWRfcmVnX2xvY2sgPSBwcmVsb2FkX3JlZ19sb2NrOworCXN1YmRldmljZS0+cHJlbG9hZF9mbGFncyA9IHByZWxvYWRfZmxhZ3M7CisJc3ViZGV2aWNlLT50cmlnZ2VyaW5nX2ZsYWdzID0gdHJpZ2dlcmluZ19mbGFnczsKKworCS8qIFN0b3JlIGFuYWxvZyBvdXRwdXQgaW5kZXggKi8KKwlzdWJkZXZpY2UtPmFvX2lkeCA9IGFvX2lkeDsKKworCS8qIFN0b3JlIGlmIGFuYWxvZyBvdXRwdXQgaGFzIGZpZm8gKi8KKwlzdWJkZXZpY2UtPmZpZm8gPSBmaWZvOworCisJaWYgKHN1YmRldmljZS0+ZmlmbyAmIE1FNjAwMF9BT19IQVNfRklGTykgeworCQkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBjaXJjdWxhciBidWZmZXIgKi8KKwkJc3ViZGV2aWNlLT5jaXJjX2J1Zi5tYXNrID0gTUU2MDAwX0FPX0NJUkNfQlVGX0NPVU5UIC0gMTsKKwkJc3ViZGV2aWNlLT5jaXJjX2J1Zi5idWYgPQorCQkgICAgKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsCisJCQkJCSAgICAgTUU2MDAwX0FPX0NJUkNfQlVGX1NJWkVfT1JERVIpOworCQlQREVCVUcoImNpcmNfYnVmID0gJXAgc2l6ZT0lbGRcbiIsIHN1YmRldmljZS0+Y2lyY19idWYuYnVmLAorCQkgICAgICAgTUU2MDAwX0FPX0NJUkNfQlVGX1NJWkUpOworCisJCWlmICghc3ViZGV2aWNlLT5jaXJjX2J1Zi5idWYpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJCWtmcmVlKHN1YmRldmljZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCW1lbXNldChzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZiwgMCwgTUU2MDAwX0FPX0NJUkNfQlVGX1NJWkUpOworCX0gZWxzZSB7CisJCXN1YmRldmljZS0+Y2lyY19idWYubWFzayA9IDA7CisJCXN1YmRldmljZS0+Y2lyY19idWYuYnVmID0gTlVMTDsKKwl9CisJc3ViZGV2aWNlLT5jaXJjX2J1Zi5oZWFkID0gMDsKKwlzdWJkZXZpY2UtPmNpcmNfYnVmLnRhaWwgPSAwOworCisJc3ViZGV2aWNlLT5zdGF0dXMgPSBhb19zdGF0dXNfbm9uZTsKKwlzdWJkZXZpY2UtPmFvX2NvbnRyb2xfdGFza19mbGFnID0gMDsKKwlzdWJkZXZpY2UtPnRpbWVvdXQuZGVsYXkgPSAwOworCXN1YmRldmljZS0+dGltZW91dC5zdGFydF90aW1lID0gamlmZmllczsKKworCS8qIEluaXRpYWxpemUgd2FpdCBxdWV1ZSAqLworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnN1YmRldmljZS0+d2FpdF9xdWV1ZSk7CisKKwkvKiBJbml0aWFsaXplIHNpbmdsZSB2YWx1ZSB0byAwViAqLworCXN1YmRldmljZS0+c2luZ2xlX3ZhbHVlID0gMHg4MDAwOworCXN1YmRldmljZS0+c2luZ2xlX3ZhbHVlX2luX2ZpZm8gPSAweDgwMDA7CisKKwkvKiBJbml0aWFsaXplIHJhbmdlIGJvYXJkZXJzICovCisJaWYgKGhpZ2hfcmFuZ2UpIHsKKwkJc3ViZGV2aWNlLT5taW4gPSBNRTYwMDBfQU9fTUlOX1JBTkdFX0hJR0g7CisJCXN1YmRldmljZS0+bWF4ID0gTUU2MDAwX0FPX01BWF9SQU5HRV9ISUdIOworCX0gZWxzZSB7CisJCXN1YmRldmljZS0+bWluID0gTUU2MDAwX0FPX01JTl9SQU5HRTsKKwkJc3ViZGV2aWNlLT5tYXggPSBNRTYwMDBfQU9fTUFYX1JBTkdFOworCX0KKworCS8qIFJlZ2lzdGVyIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgKi8KKworCWlmIChzdWJkZXZpY2UtPmZpZm8gJiBNRTYwMDBfQU9fSEFTX0ZJRk8pIHsKKwkJc3ViZGV2aWNlLT5pcnEgPSBpcnE7CisJCWlmIChyZXF1ZXN0X2lycShzdWJkZXZpY2UtPmlycSwgbWU2MDAwX2FvX2lzciwKKyNpZmRlZiBJUlFGX0RJU0FCTEVECisJCQkJSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVELAorI2Vsc2UKKwkJCQlTQV9JTlRFUlJVUFQgfCBTQV9TSElSUSwKKyNlbmRpZgorCQkJCU1FNjAwMF9OQU1FLCBzdWJkZXZpY2UpKSB7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgaW50ZXJydXB0IGxpbmUuXG4iKTsKKwkJCVBERUJVRygiZnJlZSBjaXJjX2J1ZiA9ICVwIHNpemU9JWQiLAorCQkJICAgICAgIHN1YmRldmljZS0+Y2lyY19idWYuYnVmLAorCQkJICAgICAgIFBBR0VfU0hJRlQgPDwgTUU2MDAwX0FPX0NJUkNfQlVGX1NJWkVfT1JERVIpOworCQkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZiwKKwkJCQkgICBNRTYwMDBfQU9fQ0lSQ19CVUZfU0laRV9PUkRFUik7CisJCQlzdWJkZXZpY2UtPmNpcmNfYnVmLmJ1ZiA9IE5VTEw7CisJCQlrZnJlZShzdWJkZXZpY2UpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJUElORk8oIlJlZ2lzdGVyZWQgaXJxPSVkLlxuIiwgc3ViZGV2aWNlLT5pcnEpOworCX0gZWxzZSB7CisJCXN1YmRldmljZS0+aXJxID0gMDsKKwl9CisKKwkvKiBJbml0aWFsaXplIHJlZ2lzdGVycyAqLworCS8vIE9ubHkgc3RyZWFtZWQgc3ViZGV2aWNlcyBzdXBwb3J0IGludGVycnVwdHMuIEZvciB0aGUgcmVzdCB0aGlzIHJlZ2lzdGVyIGhhcyBubyBtZWFuaW5nLgorCXN1YmRldmljZS0+aXJxX3N0YXR1c19yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9BT19JUlFfU1RBVFVTX1JFRzsKKwlzdWJkZXZpY2UtPnByZWxvYWRfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fUFJFTE9BRF9SRUc7CisKKwlpZiAoYW9faWR4ID09IDApIHsKKwkJc3ViZGV2aWNlLT5jdHJsX3JlZyA9IHJlZ19iYXNlICsgTUU2MDAwX0FPXzAwX0NUUkxfUkVHOworCQlzdWJkZXZpY2UtPnN0YXR1c19yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9BT18wMF9TVEFUVVNfUkVHOworCQlzdWJkZXZpY2UtPmZpZm9fcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDBfRklGT19SRUc7CisJCXN1YmRldmljZS0+dGltZXJfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDBfVElNRVJfUkVHOworCQlzdWJkZXZpY2UtPmlycV9yZXNldF9yZWcgPQorCQkgICAgcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDBfSVJRX1JFU0VUX1JFRzsKKwkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDBfU0lOR0xFX1JFRzsKKwl9IGVsc2UgaWYgKGFvX2lkeCA9PSAxKSB7CisJCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9BT18wMV9DVFJMX1JFRzsKKwkJc3ViZGV2aWNlLT5zdGF0dXNfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDFfU1RBVFVTX1JFRzsKKwkJc3ViZGV2aWNlLT5maWZvX3JlZyA9IHJlZ19iYXNlICsgTUU2MDAwX0FPXzAxX0ZJRk9fUkVHOworCQlzdWJkZXZpY2UtPnRpbWVyX3JlZyA9IHJlZ19iYXNlICsgTUU2MDAwX0FPXzAxX1RJTUVSX1JFRzsKKwkJc3ViZGV2aWNlLT5pcnFfcmVzZXRfcmVnID0KKwkJICAgIHJlZ19iYXNlICsgTUU2MDAwX0FPXzAxX0lSUV9SRVNFVF9SRUc7CisJCXN1YmRldmljZS0+c2luZ2xlX3JlZyA9IHJlZ19iYXNlICsgTUU2MDAwX0FPXzAxX1NJTkdMRV9SRUc7CisJfSBlbHNlIGlmIChhb19pZHggPT0gMikgeworCQlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDJfQ1RSTF9SRUc7CisJCXN1YmRldmljZS0+c3RhdHVzX3JlZyA9IHJlZ19iYXNlICsgTUU2MDAwX0FPXzAyX1NUQVRVU19SRUc7CisJCXN1YmRldmljZS0+Zmlmb19yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9BT18wMl9GSUZPX1JFRzsKKwkJc3ViZGV2aWNlLT50aW1lcl9yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9BT18wMl9USU1FUl9SRUc7CisJCXN1YmRldmljZS0+aXJxX3Jlc2V0X3JlZyA9CisJCSAgICByZWdfYmFzZSArIE1FNjAwMF9BT18wMl9JUlFfUkVTRVRfUkVHOworCQlzdWJkZXZpY2UtPnNpbmdsZV9yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9BT18wMl9TSU5HTEVfUkVHOworCX0gZWxzZSBpZiAoYW9faWR4ID09IDMpIHsKKwkJc3ViZGV2aWNlLT5jdHJsX3JlZyA9IHJlZ19iYXNlICsgTUU2MDAwX0FPXzAzX0NUUkxfUkVHOworCQlzdWJkZXZpY2UtPnN0YXR1c19yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9BT18wM19TVEFUVVNfUkVHOworCQlzdWJkZXZpY2UtPmZpZm9fcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDNfRklGT19SRUc7CisJCXN1YmRldmljZS0+dGltZXJfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDNfVElNRVJfUkVHOworCQlzdWJkZXZpY2UtPmlycV9yZXNldF9yZWcgPQorCQkgICAgcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDNfSVJRX1JFU0VUX1JFRzsKKwkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDNfU0lOR0xFX1JFRzsKKwl9IGVsc2UgeworCQlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fRFVNWTsKKwkJc3ViZGV2aWNlLT5maWZvX3JlZyA9IHJlZ19iYXNlICsgTUU2MDAwX0FPX0RVTVk7CisJCXN1YmRldmljZS0+dGltZXJfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fRFVNWTsKKwkJc3ViZGV2aWNlLT5pcnFfcmVzZXRfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fRFVNWTsKKwkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfQU9fRFVNWTsKKworCQlzdWJkZXZpY2UtPnN0YXR1c19yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9BT19TSU5HTEVfU1RBVFVTX1JFRzsKKwkJaWYgKGFvX2lkeCA9PSA0KSB7CisJCQlzdWJkZXZpY2UtPnNpbmdsZV9yZWcgPQorCQkJICAgIHJlZ19iYXNlICsgTUU2MDAwX0FPXzA0X1NJTkdMRV9SRUc7CisJCX0gZWxzZSBpZiAoYW9faWR4ID09IDUpIHsKKwkJCXN1YmRldmljZS0+c2luZ2xlX3JlZyA9CisJCQkgICAgcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDVfU0lOR0xFX1JFRzsKKwkJfSBlbHNlIGlmIChhb19pZHggPT0gNikgeworCQkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0KKwkJCSAgICByZWdfYmFzZSArIE1FNjAwMF9BT18wNl9TSU5HTEVfUkVHOworCQl9IGVsc2UgaWYgKGFvX2lkeCA9PSA3KSB7CisJCQlzdWJkZXZpY2UtPnNpbmdsZV9yZWcgPQorCQkJICAgIHJlZ19iYXNlICsgTUU2MDAwX0FPXzA3X1NJTkdMRV9SRUc7CisJCX0gZWxzZSBpZiAoYW9faWR4ID09IDgpIHsKKwkJCXN1YmRldmljZS0+c2luZ2xlX3JlZyA9CisJCQkgICAgcmVnX2Jhc2UgKyBNRTYwMDBfQU9fMDhfU0lOR0xFX1JFRzsKKwkJfSBlbHNlIGlmIChhb19pZHggPT0gOSkgeworCQkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0KKwkJCSAgICByZWdfYmFzZSArIE1FNjAwMF9BT18wOV9TSU5HTEVfUkVHOworCQl9IGVsc2UgaWYgKGFvX2lkeCA9PSAxMCkgeworCQkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0KKwkJCSAgICByZWdfYmFzZSArIE1FNjAwMF9BT18xMF9TSU5HTEVfUkVHOworCQl9IGVsc2UgaWYgKGFvX2lkeCA9PSAxMSkgeworCQkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0KKwkJCSAgICByZWdfYmFzZSArIE1FNjAwMF9BT18xMV9TSU5HTEVfUkVHOworCQl9IGVsc2UgaWYgKGFvX2lkeCA9PSAxMikgeworCQkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0KKwkJCSAgICByZWdfYmFzZSArIE1FNjAwMF9BT18xMl9TSU5HTEVfUkVHOworCQl9IGVsc2UgaWYgKGFvX2lkeCA9PSAxMykgeworCQkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0KKwkJCSAgICByZWdfYmFzZSArIE1FNjAwMF9BT18xM19TSU5HTEVfUkVHOworCQl9IGVsc2UgaWYgKGFvX2lkeCA9PSAxNCkgeworCQkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0KKwkJCSAgICByZWdfYmFzZSArIE1FNjAwMF9BT18xNF9TSU5HTEVfUkVHOworCQl9IGVsc2UgaWYgKGFvX2lkeCA9PSAxNSkgeworCQkJc3ViZGV2aWNlLT5zaW5nbGVfcmVnID0KKwkJCSAgICByZWdfYmFzZSArIE1FNjAwMF9BT18xNV9TSU5HTEVfUkVHOworCQl9IGVsc2UgeworCQkJUEVSUk9SX0NSSVRJQ0FMKCJXUk9ORyBTVUJERVZJQ0UgSUQ9JWQhIiwgYW9faWR4KTsKKwkJCW1lX3N1YmRldmljZV9kZWluaXQoKG1lX3N1YmRldmljZV90ICopIHN1YmRldmljZSk7CisJCQlpZiAoc3ViZGV2aWNlLT5maWZvKSB7CisJCQkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylzdWJkZXZpY2UtPmNpcmNfYnVmLgorCQkJCQkgICBidWYsIE1FNjAwMF9BT19DSVJDX0JVRl9TSVpFX09SREVSKTsKKwkJCX0KKwkJCXN1YmRldmljZS0+Y2lyY19idWYuYnVmID0gTlVMTDsKKwkJCWtmcmVlKHN1YmRldmljZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKyNlbmRpZgorCisJLyogT3ZlcnJpZGUgYmFzZSBjbGFzcyBtZXRob2RzLiAqLworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfZGVzdHJ1Y3RvciA9IG1lNjAwMF9hb19kZXN0cnVjdG9yOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWU2MDAwX2FvX2lvX3Jlc2V0X3N1YmRldmljZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9jb25maWcgPQorCSAgICBtZTYwMDBfYW9faW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWU2MDAwX2FvX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0KKwkgICAgbWU2MDAwX2FvX2lvX3NpbmdsZV93cml0ZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9jb25maWcgPQorCSAgICBtZTYwMDBfYW9faW9fc3RyZWFtX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9uZXdfdmFsdWVzID0KKwkgICAgbWU2MDAwX2FvX2lvX3N0cmVhbV9uZXdfdmFsdWVzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3dyaXRlID0KKwkgICAgbWU2MDAwX2FvX2lvX3N0cmVhbV93cml0ZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdGFydCA9CisJICAgIG1lNjAwMF9hb19pb19zdHJlYW1fc3RhcnQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zdHJlYW1fc3RhdHVzID0KKwkgICAgbWU2MDAwX2FvX2lvX3N0cmVhbV9zdGF0dXM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zdHJlYW1fc3RvcCA9IG1lNjAwMF9hb19pb19zdHJlYW1fc3RvcDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lNjAwMF9hb19xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lNjAwMF9hb19xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWU2MDAwX2FvX3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncyA9CisJICAgIG1lNjAwMF9hb19xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfcmFuZ2VfYnlfbWluX21heCA9CisJICAgIG1lNjAwMF9hb19xdWVyeV9yYW5nZV9ieV9taW5fbWF4OworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX3JhbmdlcyA9CisJICAgIG1lNjAwMF9hb19xdWVyeV9udW1iZXJfcmFuZ2VzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfcmFuZ2VfaW5mbyA9CisJICAgIG1lNjAwMF9hb19xdWVyeV9yYW5nZV9pbmZvOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfdGltZXIgPSBtZTYwMDBfYW9fcXVlcnlfdGltZXI7CisKKwkvL3ByZXBhcmUgd29yayBxdWV1ZSBhbmQgd29yayBmdW5jdGlvbgorCXN1YmRldmljZS0+bWU2MDAwX3dvcmtxdWV1ZSA9IG1lNjAwMF93cTsKKworLyogd29ya3F1ZXVlIEFQSSBjaGFuZ2VkIGluIGtlcm5lbCAyLjYuMjAgKi8KKyNpZiAoIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkgKQorCUlOSVRfV09SSygmc3ViZGV2aWNlLT5hb19jb250cm9sX3Rhc2ssIG1lNjAwMF9hb193b3JrX2NvbnRyb2xfdGFzaywKKwkJICAodm9pZCAqKXN1YmRldmljZSk7CisjZWxzZQorCUlOSVRfREVMQVlFRF9XT1JLKCZzdWJkZXZpY2UtPmFvX2NvbnRyb2xfdGFzaywKKwkJCSAgbWU2MDAwX2FvX3dvcmtfY29udHJvbF90YXNrKTsKKyNlbmRpZgorCisJaWYgKHN1YmRldmljZS0+ZmlmbykgewkvL1NldCBzcGVlZAorCQlvdXRsKE1FNjAwMF9BT19NSU5fQ0hBTl9USUNLUyAtIDEsIHN1YmRldmljZS0+dGltZXJfcmVnKTsKKwkJc3ViZGV2aWNlLT5oYXJkd2FyZV9zdG9wX2RlbGF5ID0gSFogLyAxMDsJLy8xMDBtcworCX0KKworCXJldHVybiBzdWJkZXZpY2U7Cit9CisKKy8qKiBAYnJpZWYgU3RvcCBwcmVzZW50YXRpb24uIFByZXNlcnZlIEZJRk9zLgorKgorKiBAcGFyYW0gaW5zdGFuY2UgVGhlIHN1YmRldmljZSBpbnN0YW5jZSAocG9pbnRlcikuCisqLworaW50IGlubGluZSBhb19zdG9wX2ltbWVkaWF0ZWx5KG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqIGluc3RhbmNlKQoreworCXVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzOworCXVpbnQzMl90IGN0cmw7CisJaW50IHRpbWVvdXQ7CisJaW50IGk7CisJdWludDMyX3Qgc2luZ2xlX21hc2s7CisKKwlzaW5nbGVfbWFzayA9CisJICAgIChpbnN0YW5jZS0+YW9faWR4IC0gTUU2MDAwX0FPX1NJTkdMRV9TVEFUVVNfT0ZGU0VUIDwKKwkgICAgIDApID8gMHgwMDAwIDogKDB4MDAwMSA8PCAoaW5zdGFuY2UtPmFvX2lkeCAtCisJCQkJICAgICAgIE1FNjAwMF9BT19TSU5HTEVfU1RBVFVTX09GRlNFVCkpOworCisJdGltZW91dCA9CisJICAgIChpbnN0YW5jZS0+aGFyZHdhcmVfc3RvcF9kZWxheSA+CisJICAgICAoSFogLyAxMCkpID8gaW5zdGFuY2UtPmhhcmR3YXJlX3N0b3BfZGVsYXkgOiBIWiAvIDEwOworCWZvciAoaSA9IDA7IGkgPD0gdGltZW91dDsgaSsrKSB7CisJCWlmIChpbnN0YW5jZS0+ZmlmbykgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwkJCS8vIFN0b3AgYWxsIGFjdGlvbnMuIE5vIGNvbmRpdGlvbnMhIEJsb2NrIGludGVycnVwdHMuIExlYXZlIEZJRk8gdW50b3VjaGVkIQorCQkJY3RybCA9IGlubChpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJY3RybCB8PQorCQkJICAgIE1FNjAwMF9BT19DVFJMX0JJVF9TVE9QIHwKKwkJCSAgICBNRTYwMDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1A7CisJCQljdHJsICY9CisJCQkgICAgfihNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUSB8CisJCQkgICAgICBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUcpOworCQkJb3V0bChjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQkJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGN0cmwpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLAorCQkJCQkgICAgICAgY3B1X2ZsYWdzKTsKKworCQkJaWYgKCEoaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKSAmIE1FNjAwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsJLy8gRXhpdC4KKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICghKGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZykgJiBzaW5nbGVfbWFzaykpIHsJLy8gRXhpdC4KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCVBJTkZPKCI8JXM+IFdhaXQgZm9yIHN0b3A6ICVkXG4iLCBfX2Z1bmNfXywgaSk7CisKKwkJLy9TdGlsbCB3b3JraW5nIQorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCX0KKworCWlmIChpID4gdGltZW91dCkgeworCQlQRVJST1JfQ1JJVElDQUwoIkZTTSBJUyBCVVNZIVxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKKy8qKiBAYnJpZWYgQ29weSBkYXRhIGZyb20gY2lyY3VsYXIgYnVmZmVyIHRvIGZpZm8gKGZhc3QpIGluIHdyYXBhcm91bmQuCisqIEBub3RlIFRoaXMgaXMgdGltZSBjcml0aWNhbCBmdW5jdGlvbi4gQ2hlY2tpbmcgaXMgZG9uZSBhdCBiZWdpbmluZyBhbmQgZW5kIG9ubHkuCisqIEBub3RlIFRoZSBpcyBub3QgcmVhc29uYWJsZSB3YXkgdG8gY2hlY2sgaG93IG1hbnkgd2FsdWVzIHdhcyBpbiBGSUZPIGF0IGJlZ2luaW5nLiBUaGUgY291bnQgbXVzdCBiZSBtYW5hZ2VkIGV4dGVybmFseS4KKyoKKyogQHBhcmFtIGluc3RhbmNlIFRoZSBzdWJkZXZpY2UgaW5zdGFuY2UgKHBvaW50ZXIpLgorKiBAcGFyYW0gY291bnQgTWF4aW11bSBudW1iZXIgb2YgY29waWVkIGRhdGEuCisqIEBwYXJhbSBzdGFydF9wb3MgUG9zaXRpb24gb2YgdGhlIGZpcnMgdmFsdWUgaW4gYnVmZmVyLgorKgorKiBAcmV0dXJuIE9uIHN1Y2Nlc3M6IE51bWJlciBvZiBjb3BpZWQgZGF0YS4KKyogQHJldHVybiBPbiBlcnJvci9zdWNjZXNzOiAwLglObyBkYXRhcyB3ZXJlIGNvcGllZCA9PiBubyBkYXRhIGluIGJ1ZmZlci4KKyogQHJldHVybiBPbiBlcnJvcjogLU1FX0VSUk5PX0ZJRk9fQlVGRkVSX09WRVJGTE9XLgorKi8KK2ludCBpbmxpbmUgYW9fd3JpdGVfZGF0YV93cmFwYXJvdW5kKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqIGluc3RhbmNlLCBpbnQgY291bnQsCisJCQkJICAgIGludCBzdGFydF9wb3MpCit7CQkJCS8vLyBAbm90ZSBUaGlzIGlzIHRpbWUgY3JpdGljYWwgZnVuY3Rpb24hCisJdWludDMyX3Qgc3RhdHVzOworCXVpbnQzMl90IHZhbHVlOworCWludCBwb3MgPQorCSAgICAoaW5zdGFuY2UtPmNpcmNfYnVmLnRhaWwgKyBzdGFydF9wb3MpICYgaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJaW50IGxvY2FsX2NvdW50ID0gY291bnQ7CisJaW50IGkgPSAxOworCisJaWYgKGNvdW50IDw9IDApIHsJLy9Xcm9uZyBjb3VudCEKKwkJcmV0dXJuIDA7CisJfQorCisJd2hpbGUgKGkgPCBsb2NhbF9jb3VudCkgeworCQkvL0dldCB2YWx1ZSBmcm9tIGJ1ZmZlcgorCQl2YWx1ZSA9ICooaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZiArIHBvcyk7CisJCS8vUHJlcGFyZSBpdAorCQlpZiAoaW5zdGFuY2UtPmFvX2lkeCAmIDB4MSkgeworCQkJdmFsdWUgPDw9IDE2OworCQl9CisJCS8vUHV0IHZhbHVlIHRvIEZJRk8KKwkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPmZpZm9fcmVnKTsKKwkJLy9QREVCVUdfUkVHKCJpZHg9JWQgZmlmb19yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPmFvX2lkeCwgaW5zdGFuY2UtPnJlZ19iYXNlLCBpbnN0YW5jZS0+Zmlmb19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHZhbHVlKTsKKworCQlwb3MrKzsKKwkJcG9zICY9IGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrOworCQlpZiAocG9zID09IGluc3RhbmNlLT5jaXJjX2J1Zi5oZWFkKSB7CisJCQlwb3MgPSBpbnN0YW5jZS0+Y2lyY19idWYudGFpbDsKKwkJfQorCQlpKys7CisJfQorCisJc3RhdHVzID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKKwlpZiAoIShzdGF0dXMgJiBNRTYwMDBfQU9fU1RBVFVTX0JJVF9GRikpIHsJLy9GSUZPIGlzIGZ1bGwgYmVmb3JlIGFsbCBkYXRhcyB3ZXJlIGNvcGllZCEKKwkJUEVSUk9SKCJpZHg9JWQgRklGTyBpcyBmdWxsIGJlZm9yZSBhbGwgZGF0YXMgd2VyZSBjb3BpZWQhXG4iLAorCQkgICAgICAgaW5zdGFuY2UtPmFvX2lkeCk7CisJCXJldHVybiAtTUVfRVJSTk9fRklGT19CVUZGRVJfT1ZFUkZMT1c7CisJfSBlbHNlIHsJCS8vQWRkIGxhc3QgdmFsdWUKKwkJdmFsdWUgPSAqKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYgKyBwb3MpOworCQlpZiAoaW5zdGFuY2UtPmFvX2lkeCAmIDB4MSkgeworCQkJdmFsdWUgPDw9IDE2OworCQl9CisJCS8vUHV0IHZhbHVlIHRvIEZJRk8KKwkJb3V0bCh2YWx1ZSwgaW5zdGFuY2UtPmZpZm9fcmVnKTsKKwkJLy9QREVCVUdfUkVHKCJpZHg9JWQgZmlmb19yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPmFvX2lkeCwgaW5zdGFuY2UtPnJlZ19iYXNlLCBpbnN0YW5jZS0+Zmlmb19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHZhbHVlKTsKKwl9CisKKwlQSU5GTygiaWR4PSVkIFdSQVBBUk9VTkQgTE9BREVEICVkIHZhbHVlc1xuIiwgaW5zdGFuY2UtPmFvX2lkeCwKKwkgICAgICBsb2NhbF9jb3VudCk7CisJcmV0dXJuIGxvY2FsX2NvdW50OworfQorCisvKiogQGJyaWVmIENvcHkgZGF0YSBmcm9tIHNvZnR3YXJlIGJ1ZmZlciB0byBmaWZvIChmYXN0KS4KKyogQG5vdGUgVGhpcyBpcyB0aW1lIGNyaXRpY2FsIGZ1bmN0aW9uLiBDaGVja2luZyBpcyBkb25lIGF0IGJlZ2luaW5nIGFuZCBlbmQgb25seS4KKyogQG5vdGUgVGhlIGlzIG5vdCByZWFzb25hYmxlIHdheSB0byBjaGVjayBob3cgbWFueSB3YWx1ZXMgd2FzIGluIEZJRk8gYXQgYmVnaW5pbmcuIFRoZSBjb3VudCBtdXN0IGJlIG1hbmFnZWQgZXh0ZXJuYWx5LgorKgorKiBAcGFyYW0gaW5zdGFuY2UgVGhlIHN1YmRldmljZSBpbnN0YW5jZSAocG9pbnRlcikuCisqIEBwYXJhbSBjb3VudCBNYXhpbXVtIG51bWJlciBvZiBjb3BpZWQgZGF0YS4KKyogQHBhcmFtIHN0YXJ0X3BvcyBQb3NpdGlvbiBvZiB0aGUgZmlycyB2YWx1ZSBpbiBidWZmZXIuCisqCisqIEByZXR1cm4gT24gc3VjY2VzczogTnVtYmVyIG9mIGNvcGllZCBkYXRhLgorKiBAcmV0dXJuIE9uIGVycm9yL3N1Y2Nlc3M6IDAuCU5vIGRhdGFzIHdlcmUgY29waWVkID0+IG5vIGRhdGEgaW4gYnVmZmVyLgorKiBAcmV0dXJuIE9uIGVycm9yOiAtTUVfRVJSTk9fRklGT19CVUZGRVJfT1ZFUkZMT1cuCisqLworaW50IGlubGluZSBhb193cml0ZV9kYXRhKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqIGluc3RhbmNlLCBpbnQgY291bnQsCisJCQkgaW50IHN0YXJ0X3BvcykKK3sJCQkJLy8vIEBub3RlIFRoaXMgaXMgdGltZSBjcml0aWNhbCBmdW5jdGlvbiEKKwl1aW50MzJfdCBzdGF0dXM7CisJdWludDMyX3QgdmFsdWU7CisJaW50IHBvcyA9CisJICAgIChpbnN0YW5jZS0+Y2lyY19idWYudGFpbCArIHN0YXJ0X3BvcykgJiBpbnN0YW5jZS0+Y2lyY19idWYubWFzazsKKwlpbnQgbG9jYWxfY291bnQgPSBjb3VudDsKKwlpbnQgbWF4X2NvdW50OworCWludCBpID0gMTsKKworCWlmIChjb3VudCA8PSAwKSB7CS8vV3JvbmcgY291bnQhCisJCXJldHVybiAwOworCX0KKworCW1heF9jb3VudCA9IG1lX2NpcmNfYnVmX3ZhbHVlcygmaW5zdGFuY2UtPmNpcmNfYnVmKSAtIHN0YXJ0X3BvczsKKwlpZiAobWF4X2NvdW50IDw9IDApIHsJLy9ObyBkYXRhIHRvIGNvcHkhCisJCXJldHVybiAwOworCX0KKworCWlmIChtYXhfY291bnQgPCBjb3VudCkgeworCQlsb2NhbF9jb3VudCA9IG1heF9jb3VudDsKKwl9CisKKwl3aGlsZSAoaSA8IGxvY2FsX2NvdW50KSB7CisJCS8vR2V0IHZhbHVlIGZyb20gYnVmZmVyCisJCXZhbHVlID0gKihpbnN0YW5jZS0+Y2lyY19idWYuYnVmICsgcG9zKTsKKwkJLy9QcmVwYXJlIGl0CisJCWlmIChpbnN0YW5jZS0+YW9faWR4ICYgMHgxKSB7CisJCQl2YWx1ZSA8PD0gMTY7CisJCX0KKwkJLy9QdXQgdmFsdWUgdG8gRklGTworCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkvL1BERUJVR19SRUcoImlkeD0lZCBmaWZvX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+YW9faWR4LCBpbnN0YW5jZS0+cmVnX2Jhc2UsIGluc3RhbmNlLT5maWZvX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdmFsdWUpOworCisJCXBvcysrOworCQlwb3MgJj0gaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJCWkrKzsKKwl9CisKKwlzdGF0dXMgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpOworCWlmICghKHN0YXR1cyAmIE1FNjAwMF9BT19TVEFUVVNfQklUX0ZGKSkgewkvL0ZJRk8gaXMgZnVsbCBiZWZvcmUgYWxsIGRhdGFzIHdlcmUgY29waWVkIQorCQlQRVJST1IoImlkeD0lZCBGSUZPIGlzIGZ1bGwgYmVmb3JlIGFsbCBkYXRhcyB3ZXJlIGNvcGllZCFcbiIsCisJCSAgICAgICBpbnN0YW5jZS0+YW9faWR4KTsKKwkJcmV0dXJuIC1NRV9FUlJOT19GSUZPX0JVRkZFUl9PVkVSRkxPVzsKKwl9IGVsc2UgewkJLy9BZGQgbGFzdCB2YWx1ZQorCQl2YWx1ZSA9ICooaW5zdGFuY2UtPmNpcmNfYnVmLmJ1ZiArIHBvcyk7CisJCWlmIChpbnN0YW5jZS0+YW9faWR4ICYgMHgxKSB7CisJCQl2YWx1ZSA8PD0gMTY7CisJCX0KKwkJLy9QdXQgdmFsdWUgdG8gRklGTworCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkvL1BERUJVR19SRUcoImlkeD0lZCBmaWZvX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+YW9faWR4LCBpbnN0YW5jZS0+cmVnX2Jhc2UsIGluc3RhbmNlLT5maWZvX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdmFsdWUpOworCX0KKworCVBJTkZPKCJpZHg9JWQgRkFTVCBMT0FERUQgJWQgdmFsdWVzXG4iLCBpbnN0YW5jZS0+YW9faWR4LCBsb2NhbF9jb3VudCk7CisJcmV0dXJuIGxvY2FsX2NvdW50OworfQorCisvKiogQGJyaWVmIENvcHkgZGF0YSBmcm9tIHNvZnR3YXJlIGJ1ZmZlciB0byBmaWZvIChzbG93KS4KKyogQG5vdGUgVGhpcyBpcyBzbG93IGZ1bmN0aW9uIHRoYXQgY29weSBhbGwgZGF0YSBmcm9tIGJ1ZmZlciB0byBGSUZPIHdpdGggZnVsbCBjb250cm9sLgorKgorKiBAcGFyYW0gaW5zdGFuY2UgVGhlIHN1YmRldmljZSBpbnN0YW5jZSAocG9pbnRlcikuCisqIEBwYXJhbSBjb3VudCBNYXhpbXVtIG51bWJlciBvZiBjb3BpZWQgZGF0YS4KKyogQHBhcmFtIHN0YXJ0X3BvcyBQb3NpdGlvbiBvZiB0aGUgZmlycyB2YWx1ZSBpbiBidWZmZXIuCisqCisqIEByZXR1cm4gT24gc3VjY2VzczogTnVtYmVyIG9mIGNvcGllZCB2YWx1ZXMuCisqIEByZXR1cm4gT24gZXJyb3Ivc3VjY2VzczogMC4JRklGTyB3YXMgZnVsbCBhdCBiZWdpbmluZy4KKyogQHJldHVybiBPbiBlcnJvcjogLU1FX0VSUk5PX1JJTkdfQlVGRkVSX1VOREVGRkxPVy4KKyovCitpbnQgaW5saW5lIGFvX3dyaXRlX2RhdGFfcG9vbGluZyhtZTYwMDBfYW9fc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgaW50IGNvdW50LAorCQkJCSBpbnQgc3RhcnRfcG9zKQorewkJCQkvLy8gQG5vdGUgVGhpcyBpcyBzbG93IGZ1bmN0aW9uIQorCXVpbnQzMl90IHN0YXR1czsKKwl1aW50MzJfdCB2YWx1ZTsKKwlpbnQgcG9zID0KKwkgICAgKGluc3RhbmNlLT5jaXJjX2J1Zi50YWlsICsgc3RhcnRfcG9zKSAmIGluc3RhbmNlLT5jaXJjX2J1Zi5tYXNrOworCWludCBsb2NhbF9jb3VudCA9IGNvdW50OworCWludCBpOworCWludCBtYXhfY291bnQ7CisKKwlpZiAoY291bnQgPD0gMCkgewkvL1dyb25nIGNvdW50IQorCQlQRVJST1IoImlkeD0lZCBTTE9XIExPQURFRDogV3JvbmcgY291bnQhXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKwkJcmV0dXJuIDA7CisJfQorCisJbWF4X2NvdW50ID0gbWVfY2lyY19idWZfdmFsdWVzKCZpbnN0YW5jZS0+Y2lyY19idWYpIC0gc3RhcnRfcG9zOworCWlmIChtYXhfY291bnQgPD0gMCkgewkvL05vIGRhdGEgdG8gY29weSEKKwkJUEVSUk9SKCJpZHg9JWQgU0xPVyBMT0FERUQ6IE5vIGRhdGEgdG8gY29weSFcbiIsCisJCSAgICAgICBpbnN0YW5jZS0+YW9faWR4KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG1heF9jb3VudCA8IGNvdW50KSB7CisJCWxvY2FsX2NvdW50ID0gbWF4X2NvdW50OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBsb2NhbF9jb3VudDsgaSsrKSB7CisJCXN0YXR1cyA9IGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZyk7CisJCWlmICghKHN0YXR1cyAmIE1FNjAwMF9BT19TVEFUVVNfQklUX0ZGKSkgewkvL0ZJRk8gaXMgZnVsbCEKKwkJCXJldHVybiBpOworCQl9CisJCS8vR2V0IHZhbHVlIGZyb20gYnVmZmVyCisJCXZhbHVlID0gKihpbnN0YW5jZS0+Y2lyY19idWYuYnVmICsgcG9zKTsKKwkJLy9QcmVwYXJlIGl0CisJCWlmIChpbnN0YW5jZS0+YW9faWR4ICYgMHgxKSB7CisJCQl2YWx1ZSA8PD0gMTY7CisJCX0KKwkJLy9QdXQgdmFsdWUgdG8gRklGTworCQlvdXRsKHZhbHVlLCBpbnN0YW5jZS0+Zmlmb19yZWcpOworCQkvL1BERUJVR19SRUcoImlkeD0lZCBmaWZvX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+YW9faWR4LCBpbnN0YW5jZS0+cmVnX2Jhc2UsIGluc3RhbmNlLT5maWZvX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdmFsdWUpOworCisJCXBvcysrOworCQlwb3MgJj0gaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJfQorCisJUElORk8oImlkeD0lZCBTTE9XIExPQURFRCAlZCB2YWx1ZXNcbiIsIGluc3RhbmNlLT5hb19pZHgsIGxvY2FsX2NvdW50KTsKKwlyZXR1cm4gbG9jYWxfY291bnQ7Cit9CisKKy8qKiBAYnJpZWYgQ29weSBkYXRhIGZyb20gdXNlciBzcGFjZSB0byBjaXJjdWxhciBidWZmZXIuCisqIEBwYXJhbSBpbnN0YW5jZSBUaGUgc3ViZGV2aWNlIGluc3RhbmNlIChwb2ludGVyKS4KKyogQHBhcmFtIGNvdW50IE51bWJlciBvZiBkYXRhcyBpbiB1c2VyIHNwYWNlLgorKiBAcGFyYW0gdXNlcl92YWx1ZXMgQnVmZmVyJ3MgcG9pbnRlci4KKyoKKyogQHJldHVybiBPbiBzdWNjZXNzOiBOdW1iZXIgb2YgY29waWVkIHZhbHVlcy4KKyogQHJldHVybiBPbiBlcnJvcjogLU1FX0VSUk5PX0lOVEVSTkFMLgorKi8KK2ludCBpbmxpbmUgYW9fZ2V0X2RhdGFfZnJvbV91c2VyKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqIGluc3RhbmNlLCBpbnQgY291bnQsCisJCQkJIGludCAqdXNlcl92YWx1ZXMpCit7CisJaW50IGksIGVycjsKKwlpbnQgZW1wdHlfc3BhY2U7CisJaW50IGNvcGllZDsKKwlpbnQgdmFsdWU7CisKKwllbXB0eV9zcGFjZSA9IG1lX2NpcmNfYnVmX3NwYWNlKCZpbnN0YW5jZS0+Y2lyY19idWYpOworCS8vV2UgaGF2ZSBvbmx5IHRoaXMgc3BhY2UgZnJlZS4KKwljb3BpZWQgPSAoY291bnQgPCBlbXB0eV9zcGFjZSkgPyBjb3VudCA6IGVtcHR5X3NwYWNlOworCWZvciAoaSA9IDA7IGkgPCBjb3BpZWQ7IGkrKykgewkvL0NvcHkgZnJvbSB1c2VyIHRvIGJ1ZmZlcgorCQlpZiAoKGVyciA9IGdldF91c2VyKHZhbHVlLCAoaW50ICopKHVzZXJfdmFsdWVzICsgaSkpKSkgeworCQkJUEVSUk9SCisJCQkgICAgKCJpZHg9JWQgQlVGRkVSIExPQURFRDogZ2V0X3VzZXIoMHglcCkgcmV0dXJuIGFuIGVycm9yOiAlZFxuIiwKKwkJCSAgICAgaW5zdGFuY2UtPmFvX2lkeCwgdXNlcl92YWx1ZXMgKyBpLCBlcnIpOworCQkJcmV0dXJuIC1NRV9FUlJOT19JTlRFUk5BTDsKKwkJfQorCQkvLy8gQG5vdGUgVGhlIGFuYWxvZyBvdXRwdXQgaW4gbWU2MDAwIHNlcmllcyBoYXMgc2l6ZSBvZiAxNiBiaXRzLgorCQkqKGluc3RhbmNlLT5jaXJjX2J1Zi5idWYgKyBpbnN0YW5jZS0+Y2lyY19idWYuaGVhZCkgPQorCQkgICAgKHVpbnQxNl90KSB2YWx1ZTsKKwkJaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQrKzsKKwkJaW5zdGFuY2UtPmNpcmNfYnVmLmhlYWQgJj0gaW5zdGFuY2UtPmNpcmNfYnVmLm1hc2s7CisJfQorCisJUElORk8oImlkeD0lZCBCVUZGRVIgTE9BREVEICVkIHZhbHVlc1xuIiwgaW5zdGFuY2UtPmFvX2lkeCwgY29waWVkKTsKKwlyZXR1cm4gY29waWVkOworfQorCitzdGF0aWMgdm9pZCBtZTYwMDBfYW9fd29ya19jb250cm9sX3Rhc2soCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorCQkJCQkgICAgICAgdm9pZCAqc3ViZGV2aWNlCisjZWxzZQorCQkJCQkgICAgICAgc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrCisjZW5kaWYKKyAgICApCit7CisJbWU2MDAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFncyA9IDA7CisJdWludDMyX3Qgc3RhdHVzOworCXVpbnQzMl90IGN0cmw7CisJdWludDMyX3Qgc3luY2g7CisJaW50IHJlc2NoZWR1bGUgPSAwOworCWludCBzaWduYWxpbmcgPSAwOworCXVpbnQzMl90IHNpbmdsZV9tYXNrOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorCWluc3RhbmNlID0gKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisjZWxzZQorCWluc3RhbmNlID0KKwkgICAgY29udGFpbmVyX29mKCh2b2lkICopd29yaywgbWU2MDAwX2FvX3N1YmRldmljZV90LCBhb19jb250cm9sX3Rhc2spOworI2VuZGlmCisJUElORk8oIjwlczogJWxkPiBleGVjdXRlZC4gaWR4PSVkXG4iLCBfX2Z1bmNfXywgamlmZmllcywKKwkgICAgICBpbnN0YW5jZS0+YW9faWR4KTsKKworCXN0YXR1cyA9IGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZyk7CisJUERFQlVHX1JFRygic3RhdHVzX3JlZyBpbmwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnN0YXR1c19yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHN0YXR1cyk7CisKKy8vLyBAbm90ZSBBT19TVEFUVVNfQklUX0ZTTSBkb2Vzbid0IHdvcmsgYXMgc2hvdWxkIGJlIGZvciBwdXJlIHNpbmdsZSBjaGFubmVscyAoaWR4Pj00KQorLy8gICAgICBzaW5nbGVfbWFzayA9IChpbnN0YW5jZS0+YW9faWR4LU1FNjAwMF9BT19TSU5HTEVfU1RBVFVTX09GRlNFVCA8IDApID8gMHgwMDAwIDogKDB4MDAwMSA8PCAoaW5zdGFuY2UtPmFvX2lkeC1NRTYwMDBfQU9fU0lOR0xFX1NUQVRVU19PRkZTRVQpKTsKKwlzaW5nbGVfbWFzayA9ICppbnN0YW5jZS0+dHJpZ2dlcmluZ19mbGFncyAmICgweDEgPDwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwlzd2l0Y2ggKGluc3RhbmNlLT5zdGF0dXMpIHsJLy8gQ2hlY2tpbmcgYWN0dWFsIG1vZGUuCisKKwkJLy8gTm90IGNvbmZpZ3VyZWQgZm9yIHdvcmsuCisJY2FzZSBhb19zdGF0dXNfbm9uZToKKwkJYnJlYWs7CisKKwkJLy9UaGlzIGFyZSBzdGFibGUgbW9kZXMuIE5vIG5lZWQgdG8gZG8gYW55dGhpbmcuICg/KQorCWNhc2UgYW9fc3RhdHVzX3NpbmdsZV9jb25maWd1cmVkOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9jb25maWd1cmVkOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9maWZvX2Vycm9yOgorCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9idWZmZXJfZXJyb3I6CisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2Vycm9yOgorCQlQRVJST1IoIlNob3VsZG4ndCBiZSBydW5uaW5nIS5cbiIpOworCQlicmVhazsKKworCQkvLyBTaW5nbGUgbW9kZXMKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfcnVuX3dhaXQ6CisJY2FzZSBhb19zdGF0dXNfc2luZ2xlX3J1bjoKKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfZW5kX3dhaXQ6CisJCWlmIChpbnN0YW5jZS0+ZmlmbykgewkvLyBFeHRyYSByZWdpc3RlcnMuCisJCQlpZiAoIShzdGF0dXMgJiBNRTYwMDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CS8vIFN0YXRlIG1hY2hpbmUgaXMgbm90IHdvcmtpbmcuCisJCQkJaWYgKCgoaW5zdGFuY2UtPmZpZm8gJiBNRTYwMDBfQU9fSEFTX0ZJRk8pCisJCQkJICAgICAmJiAoIShzdGF0dXMgJiBNRTYwMDBfQU9fU1RBVFVTX0JJVF9FRikpKQorCQkJCSAgICB8fCAoIShpbnN0YW5jZS0+ZmlmbyAmIE1FNjAwMF9BT19IQVNfRklGTykpKSB7CS8vIFNpbmdsZSBpcyBpbiBlbmQgc3RhdGUuCisJCQkJCVBERUJVRworCQkJCQkgICAgKCJTaW5nbGUgY2FsbCBoYXMgYmVlbiBjb21wbGl0ZWQuXG4iKTsKKworCQkJCQkvLyBTZXQgY29ycmVjdCB2YWx1ZSBmb3Igc2luZ2xlX3JlYWQoKTsKKwkJCQkJaW5zdGFuY2UtPnNpbmdsZV92YWx1ZSA9CisJCQkJCSAgICBpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlX2luX2ZpZm87CisKKwkJCQkJLy8gU2V0IHN0YXR1cyBhcyAnYW9fc3RhdHVzX3NpbmdsZV9lbmQnCisJCQkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc2luZ2xlX2VuZDsKKworCQkJCQlzcGluX2xvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCQkJCQlpZiAoKHNpbmdsZV9tYXNrKSAmJiAoKmluc3RhbmNlLT5wcmVsb2FkX2ZsYWdzICYgKE1FNjAwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeCkpKSB7CS8vIFRoaXMgaXMgb25lIG9mIHN5bmNocm9ub3VzIHN0YXJ0IGNoYW5uZWxzLiBTZXQgYWxsIGFzIHRyaWdnZXJlZC4KKwkJCQkJCSppbnN0YW5jZS0+dHJpZ2dlcmluZ19mbGFncyA9CisJCQkJCQkgICAgMHgwMDAwMDAwMDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8vU2V0IHRoaXMgY2hhbm5lbCBhcyB0cmlnZ2VyZWQgKG5vbmUgYWN0aXZlKS4KKwkJCQkJCSppbnN0YW5jZS0+dHJpZ2dlcmluZ19mbGFncyAmPQorCQkJCQkJICAgIH4oMHgxIDw8IGluc3RhbmNlLT5hb19pZHgpOworCQkJCQl9CisJCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKworCQkJCQkvLyBTaWduYWwgdGhlIGVuZC4KKwkJCQkJc2lnbmFsaW5nID0gMTsKKwkJCQkJLy8gV2FpdCBmb3Igc3RvcCBJU00uCisJCQkJCXJlc2NoZWR1bGUgPSAxOworCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCS8vIENoZWNrIHRpbWVvdXQuCisJCQlpZiAoKGluc3RhbmNlLT50aW1lb3V0LmRlbGF5KSAmJiAoKGppZmZpZXMgLSBpbnN0YW5jZS0+dGltZW91dC5zdGFydF90aW1lKSA+PSBpbnN0YW5jZS0+dGltZW91dC5kZWxheSkpIHsJLy8gVGltZW91dAorCQkJCVBERUJVRygiVGltZW91dCByZWFjaGVkLlxuIik7CisJCQkJLy8gU3RvcCBhbGwgYWN0aW9ucy4gTm8gY29uZGl0aW9ucyEgQmxvY2sgaW50ZXJydXB0cyBhbmQgdHJpZ2dlci4gTGVhdmUgRklGTyB1bnRvdWNoZWQhCisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJCSAgY3B1X2ZsYWdzKTsKKwkJCQljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQkJY3RybCB8PQorCQkJCSAgICBNRTYwMDBfQU9fQ1RSTF9CSVRfU1RPUCB8CisJCQkJICAgIE1FNjAwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUDsKKwkJCQljdHJsICY9CisJCQkJICAgIH4oTUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlEgfAorCQkJCSAgICAgIE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRyk7CisJCQkJY3RybCAmPQorCQkJCSAgICB+KE1FNjAwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0UgfAorCQkJCSAgICAgIE1FNjAwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0VfQk9USCk7CisJCQkJLy9EaXNhYmxpbmcgRklGTworCQkJCWN0cmwgJj0gfk1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfRklGTzsKKworCQkJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtCisJCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPgorCQkJCQkJICAgICAgIHN1YmRldmljZV9sb2NrLAorCQkJCQkJICAgICAgIGNwdV9mbGFncyk7CisKKwkJCQkvL1Jlc2V0IGludGVycnVwdCBsYXRjaAorCQkJCWlubChpbnN0YW5jZS0+aXJxX3Jlc2V0X3JlZyk7CisKKwkJCQlzcGluX2xvY2soaW5zdGFuY2UtPnByZWxvYWRfcmVnX2xvY2spOworCQkJCS8vUmVtb3ZlIGZyb20gc3luY2hyb25vdXMgc3RhcnQuIEJsb2NrIHRyaWdnZXJpbmcgZnJvbSB0aGlzIG91dHB1dC4KKwkJCQlzeW5jaCA9IGlubChpbnN0YW5jZS0+cHJlbG9hZF9yZWcpOworCQkJCXN5bmNoICY9CisJCQkJICAgIH4oKE1FNjAwMF9BT19TWU5DX0hPTEQgfAorCQkJCSAgICAgICBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRykgPDwgaW5zdGFuY2UtPgorCQkJCSAgICAgIGFvX2lkeCk7CisJCQkJaWYgKCEoaW5zdGFuY2UtPmZpZm8gJiBNRTYwMDBfQU9fSEFTX0ZJRk8pKSB7CS8vIE5vIEZJRk8gLSBzZXQgdG8gc2luZ2xlIHNhZmUgbW9kZQorCQkJCQlzeW5jaCB8PQorCQkJCQkgICAgTUU2MDAwX0FPX1NZTkNfSE9MRCA8PCBpbnN0YW5jZS0+CisJCQkJCSAgICBhb19pZHg7CisJCQkJfQorCQkJCW91dGwoc3luY2gsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQkJUERFQlVHX1JFRworCQkJCSAgICAoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgICBzeW5jaCk7CisJCQkJLy9TZXQgdGhpcyBjaGFubmVsIGFzIHRyaWdnZXJlZCAobm9uZSBhY3RpdmUpLgorCQkJCSppbnN0YW5jZS0+dHJpZ2dlcmluZ19mbGFncyAmPQorCQkJCSAgICB+KDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwkJCQlzcGluX3VubG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisKKwkJCQkvLyBTZXQgY29ycmVjdCB2YWx1ZSBmb3Igc2luZ2xlX3JlYWQoKTsKKwkJCQlpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlX2luX2ZpZm8gPQorCQkJCSAgICBpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlOworCisJCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zaW5nbGVfZW5kOworCisJCQkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCQkJc2lnbmFsaW5nID0gMTsKKwkJCX0KKwkJfSBlbHNlIHsJLy8gTm8gZXh0cmEgcmVnaXN0ZXJzLgorLyoKKwkJCQlpZiAoIShzdGF0dXMgJiBzaW5nbGVfbWFzaykpCisJCQkJey8vIFN0YXRlIG1hY2hpbmUgaXMgbm90IHdvcmtpbmcuCisJCQkJCVBERUJVRygiU2luZ2xlIGNhbGwgaGFzIGJlZW4gY29tcGxpdGVkLlxuIik7CisKKwkJCQkJLy8gU2V0IGNvcnJlY3QgdmFsdWUgZm9yIHNpbmdsZV9yZWFkKCk7CisJCQkJCWluc3RhbmNlLT5zaW5nbGVfdmFsdWUgPSBpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlX2luX2ZpZm87CisKKwkJCQkJLy8gU2V0IHN0YXR1cyBhcyAnYW9fc3RhdHVzX3NpbmdsZV9lbmQnCisJCQkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc2luZ2xlX2VuZDsKKworCQkJCQkvLyBTaWduYWwgdGhlIGVuZC4KKwkJCQkJc2lnbmFsaW5nID0gMTsKKwkJCQkJLy8gV2FpdCBmb3Igc3RvcCBJU00uCisJCQkJCXJlc2NoZWR1bGUgPSAxOworCisJCQkJCWJyZWFrOworCQkJCX0KKyovCisJCQlpZiAoIXNpbmdsZV9tYXNrKSB7CS8vIFdhcyB0cmlnZ2VyZWQuCisJCQkJUERFQlVHKCJTaW5nbGUgY2FsbCBoYXMgYmVlbiBjb21wbGl0ZWQuXG4iKTsKKworCQkJCS8vIFNldCBjb3JyZWN0IHZhbHVlIGZvciBzaW5nbGVfcmVhZCgpOworCQkJCWluc3RhbmNlLT5zaW5nbGVfdmFsdWUgPQorCQkJCSAgICBpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlX2luX2ZpZm87CisKKwkJCQkvLyBTZXQgc3RhdHVzIGFzICdhb19zdGF0dXNfc2luZ2xlX2VuZCcKKwkJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3NpbmdsZV9lbmQ7CisKKwkJCQkvLyBTaWduYWwgdGhlIGVuZC4KKwkJCQlzaWduYWxpbmcgPSAxOworCisJCQkJYnJlYWs7CisJCQl9CisJCQkvLyBDaGVjayB0aW1lb3V0LgorCQkJaWYgKChpbnN0YW5jZS0+dGltZW91dC5kZWxheSkgJiYgKChqaWZmaWVzIC0gaW5zdGFuY2UtPnRpbWVvdXQuc3RhcnRfdGltZSkgPj0gaW5zdGFuY2UtPnRpbWVvdXQuZGVsYXkpKSB7CS8vIFRpbWVvdXQKKwkJCQlQREVCVUcoIlRpbWVvdXQgcmVhY2hlZC5cbiIpOworCisJCQkJc3Bpbl9sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKwkJCQkvL1JlbW92ZSBmcm9tIHN5bmNocm9ub3VzIHN0YXJ0LiBCbG9jayB0cmlnZ2VyaW5nIGZyb20gdGhpcyBvdXRwdXQuCisJCQkJc3luY2ggPSBpbmwoaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCQlzeW5jaCAmPQorCQkJCSAgICB+KE1FNjAwMF9BT19TWU5DX0VYVF9UUklHIDw8IGluc3RhbmNlLT4KKwkJCQkgICAgICBhb19pZHgpOworCQkJCXN5bmNoIHw9CisJCQkJICAgIE1FNjAwMF9BT19TWU5DX0hPTEQgPDwgaW5zdGFuY2UtPmFvX2lkeDsKKworCQkJCW91dGwoc3luY2gsIGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQkJUERFQlVHX1JFRworCQkJCSAgICAoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgICBpbnN0YW5jZS0+cHJlbG9hZF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgICBzeW5jaCk7CisJCQkJLy9TZXQgdGhpcyBjaGFubmVsIGFzIHRyaWdnZXJlZCAobm9uZSBhY3RpdmUpLgorCQkJCSppbnN0YW5jZS0+dHJpZ2dlcmluZ19mbGFncyAmPQorCQkJCSAgICB+KDB4MSA8PCBpbnN0YW5jZS0+YW9faWR4KTsKKwkJCQlzcGluX3VubG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisKKwkJCQkvLyBSZXN0b3JlIG9sZCBzZXR0aW5ncy4KKwkJCQlQREVCVUcoIldyaXRlIG9sZCB2YWx1ZSBiYWNrIHRvIHJlZ2lzdGVyLlxuIik7CisJCQkJb3V0bChpbnN0YW5jZS0+c2luZ2xlX3ZhbHVlLAorCQkJCSAgICAgaW5zdGFuY2UtPnNpbmdsZV9yZWcpOworCQkJCVBERUJVR19SRUcKKwkJCQkgICAgKCJzaW5nbGVfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgICBpbnN0YW5jZS0+c2luZ2xlX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICAgIGluc3RhbmNlLT5zaW5nbGVfdmFsdWUpOworCisJCQkJLy8gU2V0IGNvcnJlY3QgdmFsdWUgZm9yIHNpbmdsZV9yZWFkKCk7CisJCQkJaW5zdGFuY2UtPnNpbmdsZV92YWx1ZV9pbl9maWZvID0KKwkJCQkgICAgaW5zdGFuY2UtPnNpbmdsZV92YWx1ZTsKKworCQkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc2luZ2xlX2VuZDsKKworCQkJCS8vIFNpZ25hbCB0aGUgZW5kLgorCQkJCXNpZ25hbGluZyA9IDE7CisJCQl9CisJCX0KKworCQkvLyBXYWl0IGZvciBzdG9wLgorCQlyZXNjaGVkdWxlID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fZW5kOgorCQlpZiAoIShpbnN0YW5jZS0+ZmlmbyAmIE1FNjAwMF9BT19IQVNfRklGTykpIHsJLy8gTm8gRklGTworCQkJUEVSUk9SX0NSSVRJQ0FMCisJCQkgICAgKCJTdHJlYW1pbmcgb24gc2luZ2xlIGRldmljZSEgVGhpcyBmZWF0dXJlIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24hXG4iKTsKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2Vycm9yOworCQkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCQlzaWduYWxpbmcgPSAxOworCQkJYnJlYWs7CisJCX0KKwljYXNlIGFvX3N0YXR1c19zaW5nbGVfZW5kOgorCQlpZiAoaW5zdGFuY2UtPmZpZm8pIHsJLy8gRXh0cmEgcmVnaXN0ZXJzLgorCQkJaWYgKHN0YXR1cyAmIE1FNjAwMF9BT19TVEFUVVNfQklUX0ZTTSkgewkvLyBTdGF0ZSBtYWNoaW5lIGlzIHdvcmtpbmcgYnV0IHRoZSBzdGF0dXMgaXMgc2V0IHRvIGVuZC4gRm9yY2Ugc3RvcC4KKworCQkJCS8vIFdhaXQgZm9yIHN0b3AuCisJCQkJcmVzY2hlZHVsZSA9IDE7CisJCQl9CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJCQkvLyBTdG9wIGFsbCBhY3Rpb25zLiBObyBjb25kaXRpb25zISBCbG9jayBpbnRlcnJ1cHRzIGFuZCB0cmlnZ2VyLiBMZWF2ZSBGSUZPIHVudG91Y2hlZCEKKwkJCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCWN0cmwgfD0KKwkJCSAgICBNRTYwMDBfQU9fQ1RSTF9CSVRfSU1NRURJQVRFX1NUT1AgfAorCQkJICAgIE1FNjAwMF9BT19DVFJMX0JJVF9TVE9QOworCQkJY3RybCAmPQorCQkJICAgIH4oTUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlEgfAorCQkJICAgICAgTUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9FWF9UUklHKTsKKwkJCW91dGwoY3RybCwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBjdHJsKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywKKwkJCQkJICAgICAgIGNwdV9mbGFncyk7CisKKwkJCS8vUmVzZXQgaW50ZXJydXB0IGxhdGNoCisJCQlpbmwoaW5zdGFuY2UtPmlycV9yZXNldF9yZWcpOworCQl9IGVsc2UgewkvLyBObyBleHRyYSByZWdpc3RlcnMuCisvKgorCQkJCWlmIChzdGF0dXMgJiBzaW5nbGVfbWFzaykKKwkJCQl7Ly8gU3RhdGUgbWFjaGluZSBpcyB3b3JraW5nIGJ1dCB0aGUgc3RhdHVzIGlzIHNldCB0byBlbmQuIEZvcmNlIHN0b3AuCisKKwkJCQkJLy8gV2FpdCBmb3Igc3RvcC4KKwkJCQkJcmVzY2hlZHVsZSA9IDE7CisJCQkJfQorKi8KKwkJfQorCQlicmVhazsKKworCQkvLyBTdHJlYW0gbW9kZXMKKwljYXNlIGFvX3N0YXR1c19zdHJlYW1fcnVuX3dhaXQ6CisJCWlmICghKGluc3RhbmNlLT5maWZvICYgTUU2MDAwX0FPX0hBU19GSUZPKSkgewkvLyBObyBGSUZPCisJCQlQRVJST1JfQ1JJVElDQUwKKwkJCSAgICAoIlN0cmVhbWluZyBvbiBzaW5nbGUgZGV2aWNlISBUaGlzIGZlYXR1cmUgaXMgbm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbiFcbiIpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZXJyb3I7CisJCQkvLyBTaWduYWwgdGhlIGVuZC4KKwkJCXNpZ25hbGluZyA9IDE7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzdGF0dXMgJiBNRTYwMDBfQU9fU1RBVFVTX0JJVF9GU00pIHsJLy8gU3RhdGUgbWFjaGluZSBpcyB3b3JraW5nLiBXYWl0aW5nIGZvciBzdGFydCBmaW5pc2guCisJCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9ydW47CisKKwkJCS8vIFNpZ25hbCBlbmQgb2YgdGhpcyBzdGVwCisJCQlzaWduYWxpbmcgPSAxOworCQl9IGVsc2UgewkvLyBTdGF0ZSBtYWNoaW5lIGlzIG5vdCB3b3JraW5nLgorCQkJaWYgKCEoc3RhdHVzICYgTUU2MDAwX0FPX1NUQVRVU19CSVRfRUYpKSB7CS8vIEZJRk8gaXMgZW1wdHkuIFByb2NlZHVyZSBoYXMgc3RhcnRlZCBhbmQgZmluaXNoIGFscmVhZHkhCisJCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZW5kOworCisJCQkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCQkJc2lnbmFsaW5nID0gMTsKKwkJCQkvLyBXYWl0IGZvciBzdG9wLgorCQkJCXJlc2NoZWR1bGUgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLy8gQ2hlY2sgdGltZW91dC4KKwkJaWYgKChpbnN0YW5jZS0+dGltZW91dC5kZWxheSkgJiYgKChqaWZmaWVzIC0gaW5zdGFuY2UtPnRpbWVvdXQuc3RhcnRfdGltZSkgPj0gaW5zdGFuY2UtPnRpbWVvdXQuZGVsYXkpKSB7CS8vIFRpbWVvdXQKKwkJCVBERUJVRygiVGltZW91dCByZWFjaGVkLlxuIik7CisJCQkvLyBTdG9wIGFsbCBhY3Rpb25zLiBObyBjb25kaXRpb25zISBCbG9jayBpbnRlcnJ1cHRzLiBMZWF2ZSBGSUZPIHVudG91Y2hlZCEKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJCQljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQljdHJsIHw9CisJCQkgICAgTUU2MDAwX0FPX0NUUkxfQklUX1NUT1AgfAorCQkJICAgIE1FNjAwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUDsKKwkJCWN0cmwgJj0KKwkJCSAgICB+KE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfSVJRIHwKKwkJCSAgICAgIE1FNjAwMF9BT19DVFJMX0JJVF9FTkFCTEVfRVhfVFJJRyk7CisJCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgY3RybCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCisJCQkJCSAgICAgICBjcHVfZmxhZ3MpOworCisJCQkvL1Jlc2V0IGludGVycnVwdCBsYXRjaAorCQkJaW5sKGluc3RhbmNlLT5pcnFfcmVzZXRfcmVnKTsKKworCQkJc3Bpbl9sb2NrKGluc3RhbmNlLT5wcmVsb2FkX3JlZ19sb2NrKTsKKwkJCS8vUmVtb3ZlIGZyb20gc3luY2hyb25vdXMgc3RhcnQuIEJsb2NrIHRyaWdnZXJpbmcgZnJvbSB0aGlzIG91dHB1dC4KKwkJCXN5bmNoID0gaW5sKGluc3RhbmNlLT5wcmVsb2FkX3JlZyk7CisJCQlzeW5jaCAmPQorCQkJICAgIH4oKE1FNjAwMF9BT19TWU5DX0hPTEQgfCBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJRykgPDwKKwkJCSAgICAgIGluc3RhbmNlLT5hb19pZHgpOworCQkJb3V0bChzeW5jaCwgaW5zdGFuY2UtPnByZWxvYWRfcmVnKTsKKwkJCVBERUJVR19SRUcoInByZWxvYWRfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wcmVsb2FkX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBzeW5jaCk7CisJCQlzcGluX3VubG9jayhpbnN0YW5jZS0+cHJlbG9hZF9yZWdfbG9jayk7CisKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2VuZDsKKworCQkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCQlzaWduYWxpbmcgPSAxOworCQl9CisJCS8vIFdhaXQgZm9yIHN0b3AuCisJCXJlc2NoZWR1bGUgPSAxOworCQlicmVhazsKKworCWNhc2UgYW9fc3RhdHVzX3N0cmVhbV9ydW46CisJCWlmICghKGluc3RhbmNlLT5maWZvICYgTUU2MDAwX0FPX0hBU19GSUZPKSkgewkvLyBObyBGSUZPCisJCQlQRVJST1JfQ1JJVElDQUwKKwkJCSAgICAoIlN0cmVhbWluZyBvbiBzaW5nbGUgZGV2aWNlISBUaGlzIGZlYXR1cmUgaXMgbm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbiFcbiIpOworCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZXJyb3I7CisJCQkvLyBTaWduYWwgdGhlIGVuZC4KKwkJCXNpZ25hbGluZyA9IDE7CisJCQlicmVhazsKKwkJfQorCisJCWlmICghKHN0YXR1cyAmIE1FNjAwMF9BT19TVEFUVVNfQklUX0ZTTSkpIHsJLy8gU3RhdGUgbWFjaGluZSBpcyBub3Qgd29ya2luZy4gVGhpcyBpcyBhbiBlcnJvci4KKwkJCS8vIEJST0tFTiBQSVBFIQorCQkJaWYgKCEoc3RhdHVzICYgTUU2MDAwX0FPX1NUQVRVU19CSVRfRUYpKSB7CS8vIEZJRk8gaXMgZW1wdHkuCisJCQkJaWYgKG1lX2NpcmNfYnVmX3ZhbHVlcygmaW5zdGFuY2UtPmNpcmNfYnVmKSkgewkvLyBTb2Z0d2FyZSBidWZmZXIgaXMgbm90IGVtcHR5LgorCQkJCQlpZiAoaW5zdGFuY2UtPnN0b3BfZGF0YV9jb3VudCAmJiAoaW5zdGFuY2UtPnN0b3BfZGF0YV9jb3VudCA8PSBpbnN0YW5jZS0+ZGF0YV9jb3VudCkpIHsJLy9GaW5pc2hpbmcgd29yay4gUmVxdWVkIGRhdGEgc2hvd24uCisJCQkJCQlQREVCVUcKKwkJCQkJCSAgICAoIklTTSBzdG9wZWQuIE5vIGRhdGEgaW4gRklGTy4gQnVmZmVyIGlzIG5vdCBlbXB0eS5cbiIpOworCQkJCQkJaW5zdGFuY2UtPnN0YXR1cyA9CisJCQkJCQkgICAgYW9fc3RhdHVzX3N0cmVhbV9lbmQ7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlQRVJST1IKKwkJCQkJCSAgICAoIk91dHB1dCBzdHJlYW0gaGFzIGJlZW4gYnJva2VuLiBJU00gc3RvcGVkLiBObyBkYXRhIGluIEZJRk8uIEJ1ZmZlciBpcyBub3QgZW1wdHkuXG4iKTsKKwkJCQkJCWluc3RhbmNlLT5zdGF0dXMgPQorCQkJCQkJICAgIGFvX3N0YXR1c19zdHJlYW1fYnVmZmVyX2Vycm9yOworCQkJCQl9CisJCQkJfSBlbHNlIHsJLy8gU29mdHdhcmUgYnVmZmVyIGlzIGVtcHR5LgorCQkJCQlQREVCVUcKKwkJCQkJICAgICgiSVNNIHN0b3BlZC4gTm8gZGF0YSBpbiBGSUZPLiBCdWZmZXIgaXMgZW1wdHkuXG4iKTsKKwkJCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZW5kOworCQkJCX0KKwkJCX0gZWxzZSB7CS8vIFRoZXJlIGFyZSBzdGlsbCBkYXRhcyBpbiBGSUZPLgorCQkJCWlmIChtZV9jaXJjX2J1Zl92YWx1ZXMoJmluc3RhbmNlLT5jaXJjX2J1ZikpIHsJLy8gU29mdHdhcmUgYnVmZmVyIGlzIG5vdCBlbXB0eS4KKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIk91dHB1dCBzdHJlYW0gaGFzIGJlZW4gYnJva2VuLiBJU00gc3RvcGVkIGJ1dCBzb21lIGRhdGEgaW4gRklGTyBhbmQgYnVmZmVyLlxuIik7CisJCQkJfSBlbHNlIHsJLy8gU29mdHdhcmUgYnVmZmVyIGlzIGVtcHR5LgorCQkJCQlQRVJST1IKKwkJCQkJICAgICgiT3V0cHV0IHN0cmVhbSBoYXMgYmVlbiBicm9rZW4uIElTTSBzdG9wZWQgYnV0IHNvbWUgZGF0YSBpbiBGSUZPLiBCdWZmZXIgaXMgZW1wdHkuXG4iKTsKKwkJCQl9CisJCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZmlmb19lcnJvcjsKKworCQkJfQorCisJCQkvLyBTaWduYWwgdGhlIGZhaWx1cmUuCisJCQlzaWduYWxpbmcgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJLy8gV2FpdCBmb3Igc3RvcC4KKwkJcmVzY2hlZHVsZSA9IDE7CisJCWJyZWFrOworCisJY2FzZSBhb19zdGF0dXNfc3RyZWFtX2VuZF93YWl0OgorCQlpZiAoIShpbnN0YW5jZS0+ZmlmbyAmIE1FNjAwMF9BT19IQVNfRklGTykpIHsJLy8gTm8gRklGTworCQkJUEVSUk9SX0NSSVRJQ0FMCisJCQkgICAgKCJTdHJlYW1pbmcgb24gc2luZ2xlIGRldmljZSEgVGhpcyBmZWF0dXJlIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24hXG4iKTsKKwkJCWluc3RhbmNlLT5zdGF0dXMgPSBhb19zdGF0dXNfc3RyZWFtX2Vycm9yOworCQkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCQlzaWduYWxpbmcgPSAxOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIShzdGF0dXMgJiBNRTYwMDBfQU9fU1RBVFVTX0JJVF9GU00pKSB7CS8vIFN0YXRlIG1hY2hpbmUgaXMgbm90IHdvcmtpbmcuIFdhaXRpbmcgZm9yIHN0b3AgZmluaXNoLgorCQkJaW5zdGFuY2UtPnN0YXR1cyA9IGFvX3N0YXR1c19zdHJlYW1fZW5kOworCQkJc2lnbmFsaW5nID0gMTsKKwkJfQorCQkvLyBTdGF0ZSBtYWNoaW5lIGlzIHdvcmtpbmcuCisJCXJlc2NoZWR1bGUgPSAxOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUl9DUklUSUNBTCgiU3RhdHVzIGlzIGluIHdyb25nIHN0YXRlICglZCkhXG4iLAorCQkJCWluc3RhbmNlLT5zdGF0dXMpOworCQlpbnN0YW5jZS0+c3RhdHVzID0gYW9fc3RhdHVzX3N0cmVhbV9lcnJvcjsKKwkJLy8gU2lnbmFsIHRoZSBlbmQuCisJCXNpZ25hbGluZyA9IDE7CisJCWJyZWFrOworCisJfQorCisJaWYgKHNpZ25hbGluZykgewkvL1NpZ25hbCBpdC4KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCX0KKworCWlmIChpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrX2ZsYWcgJiYgcmVzY2hlZHVsZSkgewkvLyBSZXNjaGVkdWxlIHRhc2sKKwkJcXVldWVfZGVsYXllZF93b3JrKGluc3RhbmNlLT5tZTYwMDBfd29ya3F1ZXVlLAorCQkJCSAgICZpbnN0YW5jZS0+YW9fY29udHJvbF90YXNrLCAxKTsKKwl9IGVsc2UgeworCQlQSU5GTygiPCVzPiBFbmRpbmcgY29udHJvbCB0YXNrLlxuIiwgX19mdW5jX18pOworCX0KKworfQorCitzdGF0aWMgaW50IG1lNjAwMF9hb19xdWVyeV9yYW5nZV9ieV9taW5fbWF4KG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICAgaW50IHVuaXQsCisJCQkJCSAgICBpbnQgKm1pbiwKKwkJCQkJICAgIGludCAqbWF4LCBpbnQgKm1heGRhdGEsIGludCAqcmFuZ2UpCit7CisJbWU2MDAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCWluc3RhbmNlID0gKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKCgqbWF4IC0gKm1pbikgPCAwKSB7CisJCVBFUlJPUigiSW52YWxpZCBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfTUlOX01BWDsKKwl9CisKKwlpZiAoKHVuaXQgPT0gTUVfVU5JVF9WT0xUKSB8fCAodW5pdCA9PSBNRV9VTklUX0FOWSkpIHsKKwkJaWYgKCgqbWF4IDw9IChpbnN0YW5jZS0+bWF4ICsgMTAwMCkpICYmICgqbWluID49IGluc3RhbmNlLT5taW4pKSB7CisJCQkqbWluID0gaW5zdGFuY2UtPm1pbjsKKwkJCSptYXggPSBpbnN0YW5jZS0+bWF4OworCQkJKm1heGRhdGEgPSBNRTYwMDBfQU9fTUFYX0RBVEE7CisJCQkqcmFuZ2UgPSAwOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJObyBtYXRjaGluZyByYW5nZSBhdmFpbGFibGUuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19OT19SQU5HRTsKKwkJfQorCX0gZWxzZSB7CisJCVBFUlJPUigiSW52YWxpZCBwaHlzaWNhbCB1bml0IHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9VTklUOworCX0KKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNjAwMF9hb19xdWVyeV9udW1iZXJfcmFuZ2VzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgaW50IHVuaXQsIGludCAqY291bnQpCit7CisJbWU2MDAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCWluc3RhbmNlID0gKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKCh1bml0ID09IE1FX1VOSVRfVk9MVCkgfHwgKHVuaXQgPT0gTUVfVU5JVF9BTlkpKSB7CisJCSpjb3VudCA9IDE7CisJfSBlbHNlIHsKKwkJKmNvdW50ID0gMDsKKwl9CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTYwMDBfYW9fcXVlcnlfcmFuZ2VfaW5mbyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBpbnQgcmFuZ2UsCisJCQkJICAgICAgaW50ICp1bml0LAorCQkJCSAgICAgIGludCAqbWluLCBpbnQgKm1heCwgaW50ICptYXhkYXRhKQoreworCW1lNjAwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlpbnN0YW5jZSA9IChtZTYwMDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmIChyYW5nZSA9PSAwKSB7CisJCSp1bml0ID0gTUVfVU5JVF9WT0xUOworCQkqbWluID0gaW5zdGFuY2UtPm1pbjsKKwkJKm1heCA9IGluc3RhbmNlLT5tYXg7CisJCSptYXhkYXRhID0gTUU2MDAwX0FPX01BWF9EQVRBOworCX0gZWxzZSB7CisJCVBFUlJPUigiSW52YWxpZCByYW5nZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1JBTkdFOworCX0KKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNjAwMF9hb19xdWVyeV90aW1lcihtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgaW50IHRpbWVyLAorCQkJCSBpbnQgKmJhc2VfZnJlcXVlbmN5LAorCQkJCSBsb25nIGxvbmcgKm1pbl90aWNrcywgbG9uZyBsb25nICptYXhfdGlja3MpCit7CisJbWU2MDAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCWluc3RhbmNlID0gKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJaWYgKGluc3RhbmNlLT5maWZvKSB7CS8vU3RyZWFtaW5nIGRldmljZS4KKwkJKmJhc2VfZnJlcXVlbmN5ID0gTUU2MDAwX0FPX0JBU0VfRlJFUVVFTkNZOworCQlpZiAodGltZXIgPT0gTUVfVElNRVJfQUNRX1NUQVJUKSB7CisJCQkqbWluX3RpY2tzID0gTUU2MDAwX0FPX01JTl9BQ1FfVElDS1M7CisJCQkqbWF4X3RpY2tzID0gTUU2MDAwX0FPX01BWF9BQ1FfVElDS1M7CisJCX0gZWxzZSBpZiAodGltZXIgPT0gTUVfVElNRVJfQ09OVl9TVEFSVCkgeworCQkJKm1pbl90aWNrcyA9IE1FNjAwMF9BT19NSU5fQ0hBTl9USUNLUzsKKwkJCSptYXhfdGlja3MgPSBNRTYwMDBfQU9fTUFYX0NIQU5fVElDS1M7CisJCX0KKwl9IGVsc2UgewkJLy9Ob3Qgc3RyZWFtaW5nIGRldmljZSEKKwkJKmJhc2VfZnJlcXVlbmN5ID0gMDsKKwkJKm1pbl90aWNrcyA9IDA7CisJCSptYXhfdGlja3MgPSAwOworCX0KKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNjAwMF9hb19xdWVyeV9udW1iZXJfY2hhbm5lbHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgIGludCAqbnVtYmVyKQoreworCW1lNjAwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW5zdGFuY2UgPSAobWU2MDAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwkqbnVtYmVyID0gMTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTYwMDBfYW9fcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpCit7CisJbWU2MDAwX2FvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCWluc3RhbmNlID0gKG1lNjAwMF9hb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLiBpZHg9JWRcbiIsIGluc3RhbmNlLT5hb19pZHgpOworCisJKnR5cGUgPSBNRV9UWVBFX0FPOworCSpzdWJ0eXBlID0KKwkgICAgKGluc3RhbmNlLT4KKwkgICAgIGZpZm8gJiBNRTYwMDBfQU9fSEFTX0ZJRk8pID8gTUVfU1VCVFlQRV9TVFJFQU1JTkcgOgorCSAgICBNRV9TVUJUWVBFX1NJTkdMRTsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNjAwMF9hb19xdWVyeV9zdWJkZXZpY2VfY2FwcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwgaW50ICpjYXBzKQoreworCW1lNjAwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW5zdGFuY2UgPSAobWU2MDAwX2FvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuIGlkeD0lZFxuIiwgaW5zdGFuY2UtPmFvX2lkeCk7CisKKwkqY2FwcyA9CisJICAgIE1FX0NBUFNfQU9fVFJJR19TWU5DSFJPTk9VUyB8ICgoaW5zdGFuY2UtPmZpZm8pID8gTUVfQ0FQU19BT19GSUZPIDoKKwkJCQkJICAgTUVfQ0FQU19OT05FKTsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNjAwMF9hb19xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgICAgIGludCBjYXAsIGludCAqYXJncywgaW50IGNvdW50KQoreworCW1lNjAwMF9hb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlpbnN0YW5jZSA9IChtZTYwMDBfYW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC4gaWR4PSVkXG4iLCBpbnN0YW5jZS0+YW9faWR4KTsKKworCWlmIChjb3VudCAhPSAxKSB7CisJCVBFUlJPUigiSW52YWxpZCBjYXBhYmlsaXR5IGFyZ3VtZW50IGNvdW50LlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NBUF9BUkdfQ09VTlQ7CisJfQorCisJc3dpdGNoIChjYXApIHsKKwljYXNlIE1FX0NBUF9BSV9GSUZPX1NJWkU6CisJCWFyZ3NbMF0gPSAoaW5zdGFuY2UtPmZpZm8pID8gTUU2MDAwX0FPX0ZJRk9fQ09VTlQgOiAwOworCQlicmVhazsKKworCWNhc2UgTUVfQ0FQX0FJX0JVRkZFUl9TSVpFOgorCQlhcmdzWzBdID0KKwkJICAgIChpbnN0YW5jZS0+Y2lyY19idWYuYnVmKSA/IE1FNjAwMF9BT19DSVJDX0JVRl9DT1VOVCA6IDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGNhcGFiaWxpdHkuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DQVA7CisJCWFyZ3NbMF0gPSAwOworCX0KKworCXJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU2MDAwX2FvLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU2MDAwX2FvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYyOTY0OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfYW8uaApAQCAtMCwwICsxLDIwMCBAQAorLyoqCisgKiBAZmlsZSBtZTYwMDBfYW8uaAorICoKKyAqIEBicmllZiBNZWlsaGF1cyBNRS02MDAwIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FNjAwMF9BT19IXworI2RlZmluZSBfTUU2MDAwX0FPX0hfCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKyNpbmNsdWRlICJtZWNpcmNfYnVmLmgiCisjaW5jbHVkZSAibWVpb2N0bC5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FNjAwMF9BT19NQVhfU1VCREVWSUNFUwkxNgorI2RlZmluZSBNRTYwMDBfQU9fRklGT19DT1VOVAkJODE5MgorCisjZGVmaW5lIE1FNjAwMF9BT19CQVNFX0ZSRVFVRU5DWQkzMzAwMDAwMEwKKworI2RlZmluZSBNRTYwMDBfQU9fTUlOX0FDUV9USUNLUwkJMExMCisjZGVmaW5lIE1FNjAwMF9BT19NQVhfQUNRX1RJQ0tTCQkwTEwKKworI2RlZmluZSBNRTYwMDBfQU9fTUlOX0NIQU5fVElDS1MJNjZMTAorI2RlZmluZSBNRTYwMDBfQU9fTUFYX0NIQU5fVElDS1MJMHhGRkZGRkZGRkxMCisKKyNkZWZpbmUgTUU2MDAwX0FPX01JTl9SQU5HRQkJCS0xMDAwMDAwMAorI2RlZmluZSBNRTYwMDBfQU9fTUFYX1JBTkdFCQkJOTk5OTY5NAorCisjZGVmaW5lIE1FNjAwMF9BT19NSU5fUkFOR0VfSElHSAkwCisjZGVmaW5lIE1FNjAwMF9BT19NQVhfUkFOR0VfSElHSAk0OTk5OTIzNworCisjZGVmaW5lIE1FNjAwMF9BT19NQVhfREFUQQkJCTB4RkZGRgorCisjaWZkZWYgTUVfU1lOQVBTRQorIyBkZWZpbmUgTUU2MDAwX0FPX0NJUkNfQlVGX1NJWkVfT1JERVIgCQk4CS8vIDJebiBQQUdFUyA9Pj4gTWF4aW11bSB2YWx1ZSBvZiAxTUIgZm9yIFN5bmFwc2UKKyNlbHNlCisjIGRlZmluZSBNRTYwMDBfQU9fQ0lSQ19CVUZfU0laRV9PUkRFUiAJCTUJLy8gMl5uIFBBR0VTID0+PiAxMjhLQgorI2VuZGlmCisjZGVmaW5lIE1FNjAwMF9BT19DSVJDX0JVRl9TSVpFIAkJUEFHRV9TSVpFPDxNRTYwMDBfQU9fQ0lSQ19CVUZfU0laRV9PUkRFUgkvLyBCdWZmZXIgc2l6ZSBpbiBieXRlcy4KKworIyAgaWZkZWYgX0NCVUZGXzMyYl90CisjICAgZGVmaW5lIE1FNjAwMF9BT19DSVJDX0JVRl9DT1VOVAkoKE1FNjAwMF9BT19DSVJDX0JVRl9TSVpFKSAvIHNpemVvZih1aW50MzJfdCkpCS8vIFNpemUgaW4gdmFsdWVzCisjICBlbHNlCisjICAgZGVmaW5lIE1FNjAwMF9BT19DSVJDX0JVRl9DT1VOVAkoKE1FNjAwMF9BT19DSVJDX0JVRl9TSVpFKSAvIHNpemVvZih1aW50MTZfdCkpCS8vIFNpemUgaW4gdmFsdWVzCisjICBlbmRpZgorCisjICBkZWZpbmUgTUU2MDAwX0FPX0NPTlRJTk9VUwkJCQkJMHgwCisjICBkZWZpbmUgTUU2MDAwX0FPX1dSQVBfTU9ERQkJCQkJMHgxCisjICBkZWZpbmUgTUU2MDAwX0FPX0hXX01PREUJCQkJCQkweDIKKworIyAgZGVmaW5lIE1FNjAwMF9BT19IV19XUkFQX01PREUJCQkJKE1FNjAwMF9BT19XUkFQX01PREUgfCBNRTYwMDBfQU9fSFdfTU9ERSkKKyMgIGRlZmluZSBNRTYwMDBfQU9fU1dfV1JBUF9NT0RFCQkJCU1FNjAwMF9BT19XUkFQX01PREUKKworIyAgZGVmaW5lIE1FNjAwMF9BT19JTkZfU1RPUF9NT0RFCQkJCTB4MAorIyAgZGVmaW5lIE1FNjAwMF9BT19BQ1FfU1RPUF9NT0RFCQkJCTB4MQorIyAgZGVmaW5lIE1FNjAwMF9BT19TQ0FOX1NUT1BfTU9ERQkJCQkweDIKKworIyAgZGVmaW5lIE1FNjAwMF9BT19FWFRSQV9IQVJEV0FSRQkJCQkweDEKKyMgIGRlZmluZSBNRTYwMDBfQU9fSEFTX0ZJRk8JCQkJCTB4MgorCit0eXBlZGVmIGVudW0gTUU2MDAwX0FPX1NUQVRVUyB7CisJYW9fc3RhdHVzX25vbmUgPSAwLAorCWFvX3N0YXR1c19zaW5nbGVfY29uZmlndXJlZCwKKwlhb19zdGF0dXNfc2luZ2xlX3J1bl93YWl0LAorCWFvX3N0YXR1c19zaW5nbGVfcnVuLAorCWFvX3N0YXR1c19zaW5nbGVfZW5kX3dhaXQsCisJYW9fc3RhdHVzX3NpbmdsZV9lbmQsCisJYW9fc3RhdHVzX3N0cmVhbV9jb25maWd1cmVkLAorCWFvX3N0YXR1c19zdHJlYW1fcnVuX3dhaXQsCisJYW9fc3RhdHVzX3N0cmVhbV9ydW4sCisJYW9fc3RhdHVzX3N0cmVhbV9lbmRfd2FpdCwKKwlhb19zdGF0dXNfc3RyZWFtX2VuZCwKKwlhb19zdGF0dXNfc3RyZWFtX2ZpZm9fZXJyb3IsCisJYW9fc3RhdHVzX3N0cmVhbV9idWZmZXJfZXJyb3IsCisJYW9fc3RhdHVzX3N0cmVhbV9lcnJvciwKKwlhb19zdGF0dXNfbGFzdAorfSBNRTYwMDBfQU9fU1RBVFVTOworCit0eXBlZGVmIHN0cnVjdCBtZTYwMDBfYW9fdGltZW91dCB7CisJdW5zaWduZWQgbG9uZyBzdGFydF90aW1lOworCXVuc2lnbmVkIGxvbmcgZGVsYXk7Cit9IG1lNjAwMF9hb190aW1lb3V0X3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBNRS02MDAwIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTYwMDBfYW9fc3ViZGV2aWNlIHsKKwkvKiBJbmhlcml0YW5jZSAqLworCW1lX3N1YmRldmljZV90IGJhc2U7CQkJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKwl1bnNpZ25lZCBpbnQgYW9faWR4OworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlIHN1YmRldmljZSBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCXNwaW5sb2NrX3QgKnByZWxvYWRfcmVnX2xvY2s7CQkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCBwcmVsb2FkX3JlZyBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCisJdWludDMyX3QgKnByZWxvYWRfZmxhZ3M7CisJdWludDMyX3QgKnRyaWdnZXJpbmdfZmxhZ3M7CisKKwkvKiBIYXJkd2FyZSBmZWF1dHJlcyAqLworCXVuc2lnbmVkIGludCBpcnE7CQkJCQkJLyoqPCBUaGUgaW50ZXJydXB0IHJlcXVlc3QgbnVtYmVyIGFzc2lnbmVkIGJ5IHRoZSBQQ0kgQklPUy4gKi8KKwlpbnQgZmlmbzsJCQkJCQkJCS8qKjwgSWYgc2V0IHRoaXMgZGV2aWNlIGhhcyBhIEZJRk8uICovCisKKwkvL1JhbmdlCisJaW50IG1pbjsKKwlpbnQgbWF4OworCisJaW50IHNpbmdsZV92YWx1ZTsJCQkJCQkvKio8IE1pcnJvciBvZiB0aGUgb3V0cHV0IHZhbHVlIGluIHNpbmdsZSBtb2RlLiAqLworCWludCBzaW5nbGVfdmFsdWVfaW5fZmlmbzsJCQkJLyoqPCBNaXJyb3Igb2YgdGhlIHZhbHVlIHdyaXR0ZW4gaW4gc2luZ2xlIG1vZGUuICovCisJdWludDMyX3QgY3RybF90cmc7CQkJCQkJLyoqPCBNaXJyb3Igb2YgdGhlIHRyaWdnZXIgc2V0dGluZ3MuICovCisKKwl2b2xhdGlsZSBpbnQgbW9kZTsJCQkJCQkvKio8IEZsYWdzIHVzZWQgZm9yIHN0b3JpbmcgU1cgd3JhcGFyb3VuZCBzZXR1cCovCisJaW50IHN0b3BfbW9kZTsJCQkJCQkJLyoqPCBUaGUgdXNlciBkZWZpbmVkIHN0b3AgY29uZGl0aW9uIGZsYWcuICovCisJdW5zaWduZWQgaW50IHN0YXJ0X21vZGU7CisJdW5zaWduZWQgaW50IHN0b3BfY291bnQ7CQkJCS8qKjwgVGhlIHVzZXIgZGVmaW5lZCBkYXRlcyBwcmVzZW50YXRpb24gZW5kIGNvdW50LiAqLworCXVuc2lnbmVkIGludCBzdG9wX2RhdGFfY291bnQ7CQkJLyoqPCBUaGUgc3RvcCBwcmVzZW50YXRpb24gY291bnQuICovCisJdW5zaWduZWQgaW50IGRhdGFfY291bnQ7CQkJCS8qKjwgVGhlIHJlYWwgcHJlc2VudGF0aW9uIGNvdW50LiAqLworCXVuc2lnbmVkIGludCBwcmVsb2FkZWRfY291bnQ7CQkJLyoqPCBUaGUgbmV4dCBkYXRhIGFkZHJlcyBpbiBidWZmZXIuIDw9IGZvciB3cmFwYXJvdW5kIG1vZGUuICovCisJaW50IGhhcmR3YXJlX3N0b3BfZGVsYXk7CQkJCS8qKjwgVGhlIHRpbWUgdGhhdCBzdG9wIGNhbiB0YWtlLiBUaGlzIGlzIG9ubHkgdG8gbm90IHNob3cgaGFyZHdhcmUgYnVnIHRvIHVzZXIuICovCisKKwl2b2xhdGlsZSBlbnVtIE1FNjAwMF9BT19TVEFUVVMgc3RhdHVzOwkvKio8IFRoZSBjdXJyZW50IHN0cmVhbSBzdGF0dXMgZmxhZy4gKi8KKwltZTYwMDBfYW9fdGltZW91dF90IHRpbWVvdXQ7CQkJLyoqPCBUaGUgdGltZW91dCBmb3Igc3RhcnQgaW4gYmxvY2tpbmcgYW5kIG5vbi1ibG9ja2luZyBtb2RlLiAqLworCisJCQkJCQkJCQkvKiBSZWdpc3RlcnMgKi8vKio8IEFsbCByZWdpc3RlcnMgYXJlIDMyIGJpdHMgbG9uZy4gKi8KKwl1bnNpZ25lZCBsb25nIGN0cmxfcmVnOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzX3JlZzsKKwl1bnNpZ25lZCBsb25nIGZpZm9fcmVnOworCXVuc2lnbmVkIGxvbmcgc2luZ2xlX3JlZzsKKwl1bnNpZ25lZCBsb25nIHRpbWVyX3JlZzsKKwl1bnNpZ25lZCBsb25nIGlycV9zdGF0dXNfcmVnOworCXVuc2lnbmVkIGxvbmcgcHJlbG9hZF9yZWc7CisJdW5zaWduZWQgbG9uZyBpcnFfcmVzZXRfcmVnOworI2lmZGVmIE1FREVCVUdfREVCVUdfUkVHCisJdW5zaWduZWQgbG9uZyByZWdfYmFzZTsKKyNlbmRpZgorCisJLyogU29mdHdhcmUgYnVmZmVyICovCisJbWVfY2lyY19idWZfdCBjaXJjX2J1ZjsJCQkJCS8qKjwgQ2lyY3VsYXIgYnVmZmVyIGhvbGRpbmcgbWVhc3VybWVudCBkYXRhLiAqLworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfcXVldWU7CQkJLyoqPCBXYWl0IHF1ZXVlIHRvIHB1dCBvbiB0YXNrcyB3YWl0aW5nIGZvciBkYXRhIHRvIGFycml2ZS4gKi8KKworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICptZTYwMDBfd29ya3F1ZXVlOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgYW9fY29udHJvbF90YXNrOworI2Vsc2UKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGFvX2NvbnRyb2xfdGFzazsKKyNlbmRpZgorCisJdm9sYXRpbGUgaW50IGFvX2NvbnRyb2xfdGFza19mbGFnOwkJLyoqPCBGbGFnIGNvbnRyb2xpbmcgcmVleGVjdXRpbmcgb2YgY29udHJvbCB0YXNrICovCisKK30gbWU2MDAwX2FvX3N1YmRldmljZV90OworCisvKioKKyAqIEBicmllZiBUaGUgY29uc3RydWN0b3IgdG8gZ2VuZXJhdGUgYSBNRS02MDAwIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICoKKyAqIEBwYXJhbSByZWdfYmFzZSBUaGUgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgYXMgcmV0dXJuZWQgYnkgdGhlIFBDSSBCSU9TLgorICogQHBhcmFtIGN0cmxfcmVnX2xvY2sgUG9pbnRlciB0byBzcGluIGxvY2sgcHJvdGVjdGluZyB0aGUgY29udHJvbCByZWdpc3RlciBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLgorICogQHBhcmFtIHByZWxvYWRfZmxhZ3MgUG9pbnRlciB0byBzcGluIGxvY2sgcHJvdGVjdGluZyB0aGUgaG9sZCZ0cmlnZ2VyIHJlZ2lzdGVyIGZyb20gY29uY3VycmVudCBhY2Nlc3MuCisgKiBAcGFyYW0gYW9faWR4IFN1YmRldmljZSBudW1iZXIuCisgKiBAcGFyYW0gZmlmbyBGbGFnIHNldCBpZiBzdWJkZXZpY2UgaGFzIGhhcmR3YXJlIEZJRk8uCisgKiBAcGFyYW0gaXJxIElSUSBudW1iZXIuCisgKiBAcGFyYW0gaGlnaF9yYW5nZSBGbGFnIHNldCBpZiBzdWJkZXZpY2UgaGFzIGhpZ2ggY3VycmVuIG91dHB1dC4KKyAqIEBwYXJhbSBtZTYwMDBfd3EgUXVldWUgZm9yIGFzeW5jaHJvbm91cyB0YXNrICgxIHF1ZXVlIGZvciBhbGwgc3ViZGV2aWNlIG9uIDEgYm9hcmQpLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWU2MDAwX2FvX3N1YmRldmljZV90ICptZTYwMDBfYW9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgc3BpbmxvY2tfdCAqIHByZWxvYWRfcmVnX2xvY2ssCisJCQkJCSAgICAgdWludDMyX3QgKiBwcmVsb2FkX2ZsYWdzLAorCQkJCQkgICAgIHVpbnQzMl90ICogdHJpZ2dlcmluZ19mbGFncywKKwkJCQkJICAgICBpbnQgYW9faWR4LAorCQkJCQkgICAgIGludCBmaWZvLAorCQkJCQkgICAgIGludCBpcnEsCisJCQkJCSAgICAgaW50IGhpZ2hfcmFuZ2UsCisJCQkJCSAgICAgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QKKwkJCQkJICAgICAqbWU2MDAwX3dxKTsKKworI2VuZGlmIC8vX19LRVJORUxfXworI2VuZGlmIC8vX01FNjAwMF9BT19IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9hb19yZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfYW9fcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI4ZjQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfYW9fcmVnLmgKQEAgLTAsMCArMSwxNzcgQEAKKy8qKgorICogQGZpbGUgbWU2MDAwX2FvX3JlZy5oCisgKgorICogQGJyaWVmIE1FLTYwMDAgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU2MDAwX0FPX1JFR19IXworI2RlZmluZSBfTUU2MDAwX0FPX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisvLyBBTworI2RlZmluZSBNRTYwMDBfQU9fMDBfQ1RSTF9SRUcJCQkJCTB4MDAJLy8gUi9XCisjZGVmaW5lIE1FNjAwMF9BT18wMF9TVEFUVVNfUkVHCQkJCQkweDA0CS8vIFIvXworI2RlZmluZSBNRTYwMDBfQU9fMDBfRklGT19SRUcJCQkJCTB4MDgJLy8gXy9XCisjZGVmaW5lIE1FNjAwMF9BT18wMF9TSU5HTEVfUkVHCQkJCQkweDBDCS8vIFIvVworI2RlZmluZSBNRTYwMDBfQU9fMDBfVElNRVJfUkVHCQkJCQkweDEwCS8vIF8vVworCisjZGVmaW5lIE1FNjAwMF9BT18wMV9DVFJMX1JFRwkJCQkJMHgxOAkvLyBSL1cKKyNkZWZpbmUgTUU2MDAwX0FPXzAxX1NUQVRVU19SRUcJCQkJCTB4MUMJLy8gUi9fCisjZGVmaW5lIE1FNjAwMF9BT18wMV9GSUZPX1JFRwkJCQkJMHgyMAkvLyBfL1cKKyNkZWZpbmUgTUU2MDAwX0FPXzAxX1NJTkdMRV9SRUcJCQkJCTB4MjQJLy8gUi9XCisjZGVmaW5lIE1FNjAwMF9BT18wMV9USU1FUl9SRUcJCQkJCTB4MjgJLy8gXy9XCisKKyNkZWZpbmUgTUU2MDAwX0FPXzAyX0NUUkxfUkVHCQkJCQkweDMwCS8vIFIvVworI2RlZmluZSBNRTYwMDBfQU9fMDJfU1RBVFVTX1JFRwkJCQkJMHgzNAkvLyBSL18KKyNkZWZpbmUgTUU2MDAwX0FPXzAyX0ZJRk9fUkVHCQkJCQkweDM4CS8vIF8vVworI2RlZmluZSBNRTYwMDBfQU9fMDJfU0lOR0xFX1JFRwkJCQkJMHgzQwkvLyBSL1cKKyNkZWZpbmUgTUU2MDAwX0FPXzAyX1RJTUVSX1JFRwkJCQkJMHg0MAkvLyBfL1cKKworI2RlZmluZSBNRTYwMDBfQU9fMDNfQ1RSTF9SRUcJCQkJCTB4NDgJLy8gUi9XCisjZGVmaW5lIE1FNjAwMF9BT18wM19TVEFUVVNfUkVHCQkJCQkweDRDCS8vIFIvXworI2RlZmluZSBNRTYwMDBfQU9fMDNfRklGT19SRUcJCQkJCTB4NTAJLy8gXy9XCisjZGVmaW5lIE1FNjAwMF9BT18wM19TSU5HTEVfUkVHCQkJCQkweDU0CS8vIFIvVworI2RlZmluZSBNRTYwMDBfQU9fMDNfVElNRVJfUkVHCQkJCQkweDU4CS8vIF8vVworCisjZGVmaW5lIE1FNjAwMF9BT19TSU5HTEVfU1RBVFVTX1JFRwkJCQkweEE0CS8vIFIvXworI2RlZmluZSBNRTYwMDBfQU9fU0lOR0xFX1NUQVRVU19PRkZTRVQJCQk0CS8vVGhlIGZpcnN0IHNpbmdsZSBzdWJkZXZpY2UgPT4gYml0IDAgaW4gTUU2MDAwX0FPX1NJTkdMRV9TVEFUVVNfUkVHLgorCisjZGVmaW5lIE1FNjAwMF9BT18wNF9TVEFUVVNfUkVHCQkJCQlNRTYwMDBfQU9fU0lOR0xFX1NUQVRVU19SRUcKKyNkZWZpbmUgTUU2MDAwX0FPXzA0X1NJTkdMRV9SRUcJCQkJCTB4NzQJLy8gXy9XCisKKyNkZWZpbmUgTUU2MDAwX0FPXzA1X1NUQVRVU19SRUcJCQkJCU1FNjAwMF9BT19TSU5HTEVfU1RBVFVTX1JFRworI2RlZmluZSBNRTYwMDBfQU9fMDVfU0lOR0xFX1JFRwkJCQkJMHg3OAkvLyBfL1cKKworI2RlZmluZSBNRTYwMDBfQU9fMDZfU1RBVFVTX1JFRwkJCQkJTUU2MDAwX0FPX1NJTkdMRV9TVEFUVVNfUkVHCisjZGVmaW5lIE1FNjAwMF9BT18wNl9TSU5HTEVfUkVHCQkJCQkweDdDCS8vIF8vVworCisjZGVmaW5lIE1FNjAwMF9BT18wN19TVEFUVVNfUkVHCQkJCQlNRTYwMDBfQU9fU0lOR0xFX1NUQVRVU19SRUcKKyNkZWZpbmUgTUU2MDAwX0FPXzA3X1NJTkdMRV9SRUcJCQkJCTB4ODAJLy8gXy9XCisKKyNkZWZpbmUgTUU2MDAwX0FPXzA4X1NUQVRVU19SRUcJCQkJCU1FNjAwMF9BT19TSU5HTEVfU1RBVFVTX1JFRworI2RlZmluZSBNRTYwMDBfQU9fMDhfU0lOR0xFX1JFRwkJCQkJMHg4NAkvLyBfL1cKKworI2RlZmluZSBNRTYwMDBfQU9fMDlfU1RBVFVTX1JFRwkJCQkJTUU2MDAwX0FPX1NJTkdMRV9TVEFUVVNfUkVHCisjZGVmaW5lIE1FNjAwMF9BT18wOV9TSU5HTEVfUkVHCQkJCQkweDg4CS8vIF8vVworCisjZGVmaW5lIE1FNjAwMF9BT18xMF9TVEFUVVNfUkVHCQkJCQlNRTYwMDBfQU9fU0lOR0xFX1NUQVRVU19SRUcKKyNkZWZpbmUgTUU2MDAwX0FPXzEwX1NJTkdMRV9SRUcJCQkJCTB4OEMJLy8gXy9XCisKKyNkZWZpbmUgTUU2MDAwX0FPXzExX1NUQVRVU19SRUcJCQkJCU1FNjAwMF9BT19TSU5HTEVfU1RBVFVTX1JFRworI2RlZmluZSBNRTYwMDBfQU9fMTFfU0lOR0xFX1JFRwkJCQkJMHg5MAkvLyBfL1cKKworI2RlZmluZSBNRTYwMDBfQU9fMTJfU1RBVFVTX1JFRwkJCQkJTUU2MDAwX0FPX1NJTkdMRV9TVEFUVVNfUkVHCisjZGVmaW5lIE1FNjAwMF9BT18xMl9TSU5HTEVfUkVHCQkJCQkweDk0CS8vIF8vVworCisjZGVmaW5lIE1FNjAwMF9BT18xM19TVEFUVVNfUkVHCQkJCQlNRTYwMDBfQU9fU0lOR0xFX1NUQVRVU19SRUcKKyNkZWZpbmUgTUU2MDAwX0FPXzEzX1NJTkdMRV9SRUcJCQkJCTB4OTgJLy8gXy9XCisKKyNkZWZpbmUgTUU2MDAwX0FPXzE0X1NUQVRVU19SRUcJCQkJCU1FNjAwMF9BT19TSU5HTEVfU1RBVFVTX1JFRworI2RlZmluZSBNRTYwMDBfQU9fMTRfU0lOR0xFX1JFRwkJCQkJMHg5QwkvLyBfL1cKKworI2RlZmluZSBNRTYwMDBfQU9fMTVfU1RBVFVTX1JFRwkJCQkJTUU2MDAwX0FPX1NJTkdMRV9TVEFUVVNfUkVHCisjZGVmaW5lIE1FNjAwMF9BT18xNV9TSU5HTEVfUkVHCQkJCQkweEEwCS8vIF8vVworCisvL01FNjAwMF9BT19DVFJMX1JFRworI2RlZmluZSBNRTYwMDBfQU9fTU9ERV9TSU5HTEUJCQkJCTB4MDAKKyNkZWZpbmUgTUU2MDAwX0FPX01PREVfV1JBUEFST1VORAkJCQkweDAxCisjZGVmaW5lIE1FNjAwMF9BT19NT0RFX0NPTlRJTlVPVVMJCQkJMHgwMgorI2RlZmluZSBNRTYwMDBfQU9fQ1RSTF9NT0RFX01BU0sJCQkJKE1FNjAwMF9BT19NT0RFX1dSQVBBUk9VTkQgfCBNRTYwMDBfQU9fTU9ERV9DT05USU5VT1VTKQorCisjZGVmaW5lIE1FNjAwMF9BT19DVFJMX0JJVF9NT0RFX1dSQVBBUk9VTkQJCTB4MDAxCisjZGVmaW5lIE1FNjAwMF9BT19DVFJMX0JJVF9NT0RFX0NPTlRJTlVPVVMJCTB4MDAyCisjZGVmaW5lIE1FNjAwMF9BT19DVFJMX0JJVF9TVE9QCQkJCQkweDAwNAorI2RlZmluZSBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0ZJRk8JCQkweDAwOAorI2RlZmluZSBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0VYX1RSSUcJCTB4MDEwCisjZGVmaW5lIE1FNjAwMF9BT19DVFJMX0JJVF9FWF9UUklHX0VER0UJCQkweDAyMAorI2RlZmluZSBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUQkJCTB4MDQwCisjZGVmaW5lIE1FNjAwMF9BT19DVFJMX0JJVF9JTU1FRElBVEVfU1RPUAkJMHgwODAKKyNkZWZpbmUgTUU2MDAwX0FPX0NUUkxfQklUX0VYX1RSSUdfRURHRV9CT1RIIAkweDgwMAorCisvL01FNjAwMF9BT19TVEFUVVNfUkVHCisjZGVmaW5lIE1FNjAwMF9BT19TVEFUVVNfQklUX0ZTTQkJCQkweDAxCisjZGVmaW5lIE1FNjAwMF9BT19TVEFUVVNfQklUX0ZGCQkJCQkweDAyCisjZGVmaW5lIE1FNjAwMF9BT19TVEFUVVNfQklUX0hGCQkJCQkweDA0CisjZGVmaW5lIE1FNjAwMF9BT19TVEFUVVNfQklUX0VGCQkJCQkweDA4CisKKyNkZWZpbmUgTUU2MDAwX0FPX1BSRUxPQURfUkVHCQkJCQkweEE4CS8vIFIvVyAgICAvLy9NRTYwMDBfQU9fU1lOQ19SRUcgPD09PiBNRTYwMDBfQU9fUFJFTE9BRF9SRUcKKy8qCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0hPTERfMAkJCQkJMHgwMDAwMDAwMQorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19IT0xEXzEJCQkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfSE9MRF8yCQkJCQkweDAwMDAwMDA0CisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0hPTERfMwkJCQkJMHgwMDAwMDAwOAorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19IT0xEXzQJCQkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfSE9MRF81CQkJCQkweDAwMDAwMDIwCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0hPTERfNgkJCQkJMHgwMDAwMDA0MAorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19IT0xEXzcJCQkJCTB4MDAwMDAwODAKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfSE9MRF84CQkJCQkweDAwMDAwMTAwCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0hPTERfOQkJCQkJMHgwMDAwMDIwMAorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19IT0xEXzEwCQkJCQkweDAwMDAwNDAwCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0hPTERfMTEJCQkJCTB4MDAwMDA4MDAKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfSE9MRF8xMgkJCQkJMHgwMDAwMTAwMAorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19IT0xEXzEzCQkJCQkweDAwMDAyMDAwCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0hPTERfMTQJCQkJCTB4MDAwMDQwMDAKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfSE9MRF8xNQkJCQkJMHgwMDAwODAwMAorKi8KKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfSE9MRAkJCQkJCTB4MDAwMDAwMDEKKy8qCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0VYVF9UUklHXzAJCQkJMHgwMDAxMDAwMAorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJR18xCQkJCTB4MDAwMjAwMDAKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUdfMgkJCQkweDAwMDQwMDAwCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0VYVF9UUklHXzMJCQkJMHgwMDA4MDAwMAorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJR180CQkJCTB4MDAxMDAwMDAKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUdfNQkJCQkweDAwMjAwMDAwCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0VYVF9UUklHXzYJCQkJMHgwMDQwMDAwMAorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJR183CQkJCTB4MDA4MDAwMDAKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUdfOAkJCQkweDAxMDAwMDAwCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0VYVF9UUklHXzkJCQkJMHgwMjAwMDAwMAorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJR18xMAkJCQkweDA0MDAwMDAwCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0VYVF9UUklHXzExCQkJCTB4MDgwMDAwMDAKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUdfMTIJCQkJMHgxMDAwMDAwMAorI2RlZmluZSBNRTYwMDBfQU9fU1lOQ19FWFRfVFJJR18xMwkJCQkweDIwMDAwMDAwCisjZGVmaW5lIE1FNjAwMF9BT19TWU5DX0VYVF9UUklHXzE0CQkJCTB4NDAwMDAwMDAKKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUdfMTUJCQkJMHg4MDAwMDAwMAorKi8KKyNkZWZpbmUgTUU2MDAwX0FPX1NZTkNfRVhUX1RSSUcJCQkJCTB4MDAwMTAwMDAKKworI2RlZmluZSBNRTYwMDBfQU9fRVhUX1RSSUcJCQkJCQkweDgwMDAwMDAwCisKKy8vIEFPLUlSUQorI2RlZmluZSBNRTYwMDBfQU9fSVJRX1NUQVRVU19SRUcJCQkJMHg2MAkvLyBSL18KKyNkZWZpbmUgTUU2MDAwX0FPXzAwX0lSUV9SRVNFVF9SRUcJCQkJMHg2NAkvLyBSL18KKyNkZWZpbmUgTUU2MDAwX0FPXzAxX0lSUV9SRVNFVF9SRUcJCQkJMHg2OAkvLyBSL18KKyNkZWZpbmUgTUU2MDAwX0FPXzAyX0lSUV9SRVNFVF9SRUcJCQkJMHg2QwkvLyBSL18KKyNkZWZpbmUgTUU2MDAwX0FPXzAzX0lSUV9SRVNFVF9SRUcJCQkJMHg3MAkvLyBSL18KKworI2RlZmluZSBNRTYwMDBfSVJRX1NUQVRVU19CSVRfMAkJCQkJMHgwMQorI2RlZmluZSBNRTYwMDBfSVJRX1NUQVRVU19CSVRfMQkJCQkJMHgwMgorI2RlZmluZSBNRTYwMDBfSVJRX1NUQVRVU19CSVRfMgkJCQkJMHgwNAorI2RlZmluZSBNRTYwMDBfSVJRX1NUQVRVU19CSVRfMwkJCQkJMHgwOAorCisjZGVmaW5lIE1FNjAwMF9JUlFfU1RBVFVTX0JJVF9BT19IRgkJCQlNRTYwMDBfSVJRX1NUQVRVU19CSVRfMAorCisvL0RVTVkgcmVnaXN0ZXIKKyNkZWZpbmUgTUU2MDAwX0FPX0RVTVkJCQkJCQkJCQkweEZDCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9kZXZpY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfZGV2aWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVlNGM1OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfZGV2aWNlLmMKQEAgLTAsMCArMSwyMTEgQEAKKy8qKgorICogQGZpbGUgbWU2MDAwX2RldmljZS5jCisgKgorICogQGJyaWVmIERldmljZSBjbGFzcyB0ZW1wbGF0ZSBpbXBsZW1lbnRhdGlvbi4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworI2lmbmRlZiBNT0RVTEUKKyMgIGRlZmluZSBNT0RVTEUKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJtZWlkcy5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKyNpbmNsdWRlICJtZWNvbW1vbi5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKworI2luY2x1ZGUgIm1lZmlybXdhcmUuaCIKKworI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisjaW5jbHVkZSAibWU2MDAwX3JlZy5oIgorI2luY2x1ZGUgIm1lNjAwMF9kZXZpY2UuaCIKKyNpbmNsdWRlICJtZXBseF9yZWcuaCIKKyNpbmNsdWRlICJtZTYwMDBfZGlvLmgiCisjaW5jbHVkZSAibWU2MDAwX2FvLmgiCisKKy8qKgorICogQGJyaWVmIEdsb2JhbCB2YXJpYWJsZS4KKyAqIFRoaXMgaXMgd29ya2luZyBxdWV1ZSBmb3IgcnVuaW5nIGEgc2VwYXJhdGUgYXRhc2sgdGhhdCB3aWxsIGJlIHJlc3BvbnNpYmxlIGZvciB3b3JrIHN0YXR1cyAoc3RhcnQsIHN0b3AsIHRpbWVvdXRzKS4KKyAqLworc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICptZTYwMDBfd29ya3F1ZXVlOworCittZV9kZXZpY2VfdCAqbWU2MDAwX3BjaV9jb25zdHJ1Y3RvcihzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldmljZSkKK3sKKwltZTYwMDBfZGV2aWNlX3QgKm1lNjAwMF9kZXZpY2U7CisJbWVfc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwl1bnNpZ25lZCBpbnQgdmVyc2lvbl9pZHg7CisJaW50IGVycjsKKwlpbnQgaTsKKwlpbnQgaGlnaF9yYW5nZSA9IDA7CisJaW50IGZpZm87CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBBbGxvY2F0ZSBzdHJ1Y3R1cmUgZm9yIGRldmljZSBpbnN0YW5jZS4KKwltZTYwMDBfZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWU2MDAwX2RldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIW1lNjAwMF9kZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3IgZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChtZTYwMDBfZGV2aWNlLCAwLCBzaXplb2YobWU2MDAwX2RldmljZV90KSk7CisKKwkvLyBJbml0aWFsaXplIGJhc2UgY2xhc3Mgc3RydWN0dXJlLgorCWVyciA9IG1lX2RldmljZV9wY2lfaW5pdCgobWVfZGV2aWNlX3QgKikgbWU2MDAwX2RldmljZSwgcGNpX2RldmljZSk7CisKKwlpZiAoZXJyKSB7CisJCWtmcmVlKG1lNjAwMF9kZXZpY2UpOworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIGRldmljZSBiYXNlIGNsYXNzLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIERvd25sb2FkIHRoZSB4aWxpbnggZmlybXdhcmUgKi8KKwllcnIgPSBtZV94aWxpbnhfZG93bmxvYWQobWU2MDAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS5yZWdfYmFzZXNbMV0sCisJCQkJIG1lNjAwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kucmVnX2Jhc2VzWzJdLAorCQkJCSAmcGNpX2RldmljZS0+ZGV2LCAibWU2MDAwLmJpbiIpOworCisJaWYgKGVycikgeworCQltZV9kZXZpY2VfZGVpbml0KChtZV9kZXZpY2VfdCAqKSBtZTYwMDBfZGV2aWNlKTsKKwkJa2ZyZWUobWU2MDAwX2RldmljZSk7CisJCVBFUlJPUigiQ2FuJ3QgZG93bmxvYWQgZmlybXdhcmUuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogR2V0IHRoZSBpbmRleCBpbiB0aGUgZGV2aWNlIHZlcnNpb24gaW5mb3JtYXRpb24gdGFibGUuICovCisJdmVyc2lvbl9pZHggPQorCSAgICBtZTYwMDBfdmVyc2lvbnNfZ2V0X2RldmljZV9pbmRleChtZTYwMDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLgorCQkJCQkgICAgIGRldmljZV9pZCk7CisKKwkvLyBJbml0aWFsaXplIHNwaW4gbG9jayAuCisJc3Bpbl9sb2NrX2luaXQoJm1lNjAwMF9kZXZpY2UtPnByZWxvYWRfcmVnX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZtZTYwMDBfZGV2aWNlLT5kaW9fY3RybF9yZWdfbG9jayk7CisKKwkvKiBDcmVhdGUgZGlnaXRhbCBpbnB1dC9vdXRwdXQgaW5zdGFuY2VzLiAqLworCWZvciAoaSA9IDA7IGkgPCBtZTYwMDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLmRpb19zdWJkZXZpY2VzOyBpKyspIHsKKwkJc3ViZGV2aWNlID0KKwkJICAgIChtZV9zdWJkZXZpY2VfdCAqKSBtZTYwMDBfZGlvX2NvbnN0cnVjdG9yKG1lNjAwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgIGJhc2UuaW5mby5wY2kuCisJCQkJCQkJICAgICAgcmVnX2Jhc2VzWzNdLCBpLAorCQkJCQkJCSAgICAgICZtZTYwMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgICBkaW9fY3RybF9yZWdfbG9jayk7CisKKwkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lNjAwMF9kZXZpY2UpOworCQkJa2ZyZWUobWU2MDAwX2RldmljZSk7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTYwMDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkgICAgc3ViZGV2aWNlKTsKKwl9CisKKwkvKiBDcmVhdGUgYW5hbG9nIG91dHB1dCBpbnN0YW5jZXMuICovCisJZm9yIChpID0gMDsgaSA8IG1lNjAwMF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0uYW9fc3ViZGV2aWNlczsgaSsrKSB7CisJCWhpZ2hfcmFuZ2UgPSAoKGkgPT0gOCkKKwkJCSAgICAgICYmCisJCQkgICAgICAoKG1lNjAwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuZGV2aWNlX2lkID09CisJCQkJUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYzNTkpCisJCQkgICAgICAgfHwgKG1lNjAwMF9kZXZpY2UtPmJhc2UuaW5mby5wY2kuZGV2aWNlX2lkID09CisJCQkJICAgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYyNTkpCisJCQkgICAgICApCisJCSAgICApPyAxIDogMDsKKworCQlmaWZvID0KKwkJICAgIChpIDwKKwkJICAgICBtZTYwMDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLgorCQkgICAgIGFvX2ZpZm8pID8gTUU2MDAwX0FPX0hBU19GSUZPIDogMHgwOworCQlmaWZvIHw9IChpIDwgNCkgPyBNRTYwMDBfQU9fRVhUUkFfSEFSRFdBUkUgOiAweDA7CisKKwkJc3ViZGV2aWNlID0KKwkJICAgIChtZV9zdWJkZXZpY2VfdCAqKSBtZTYwMDBfYW9fY29uc3RydWN0b3IobWU2MDAwX2RldmljZS0+CisJCQkJCQkJICAgICBiYXNlLmluZm8ucGNpLgorCQkJCQkJCSAgICAgcmVnX2Jhc2VzWzJdLAorCQkJCQkJCSAgICAgJm1lNjAwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgcHJlbG9hZF9yZWdfbG9jaywKKwkJCQkJCQkgICAgICZtZTYwMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIHByZWxvYWRfZmxhZ3MsCisJCQkJCQkJICAgICAmbWU2MDAwX2RldmljZS0+CisJCQkJCQkJICAgICB0cmlnZ2VyaW5nX2ZsYWdzLAorCQkJCQkJCSAgICAgaSwgZmlmbywKKwkJCQkJCQkgICAgIG1lNjAwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgYmFzZS5pcnEsCisJCQkJCQkJICAgICBoaWdoX3JhbmdlLAorCQkJCQkJCSAgICAgbWU2MDAwX3dvcmtxdWV1ZSk7CisKKwkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lNjAwMF9kZXZpY2UpOworCQkJa2ZyZWUobWU2MDAwX2RldmljZSk7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTYwMDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkgICAgc3ViZGV2aWNlKTsKKwl9CisKKwlyZXR1cm4gKG1lX2RldmljZV90ICopIG1lNjAwMF9kZXZpY2U7Cit9CisKKy8vIEluaXQgYW5kIGV4aXQgb2YgbW9kdWxlLgorCitzdGF0aWMgaW50IF9faW5pdCBtZTYwMDBfaW5pdCh2b2lkKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCW1lNjAwMF93b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgibWU2MDAwIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtZTYwMDBfZXhpdCh2b2lkKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWZsdXNoX3dvcmtxdWV1ZShtZTYwMDBfd29ya3F1ZXVlKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShtZTYwMDBfd29ya3F1ZXVlKTsKK30KKworbW9kdWxlX2luaXQobWU2MDAwX2luaXQpOworbW9kdWxlX2V4aXQobWU2MDAwX2V4aXQpOworCisvLyBBZG1pbmlzdHJhdGl2ZSBzdHVmZiBmb3IgbW9kaW5mby4KK01PRFVMRV9BVVRIT1IKKyAgICAoIkd1ZW50ZXIgR2ViaGFyZHQgPGcuZ2ViaGFyZHRAbWVpbGhhdXMuZGU+ICYgS3J6eXN6dG9mIEdhbnR6a2UgPGsuZ2FudHprZUBtZWlsaGF1cy5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRGV2aWNlIERyaXZlciBNb2R1bGUgZm9yIE1FLTYwMDAgRGV2aWNlIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiTWVpbGhhdXMgTUUtNjAwMCBEZXZpY2VzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8vIEV4cG9ydCB0aGUgY29uc3RydWN0b3IuCitFWFBPUlRfU1lNQk9MKG1lNjAwMF9wY2lfY29uc3RydWN0b3IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9kZXZpY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThjYzdkMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfZGV2aWNlLmgKQEAgLTAsMCArMSwxNDkgQEAKKy8qKgorICogQGZpbGUgbWU2MDAwX2RldmljZS5oCisgKgorICogQGJyaWVmIE1FLTYwMDAgZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FNjAwMF9ERVZJQ0VfSAorI2RlZmluZSBfTUU2MDAwX0RFVklDRV9ICisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSAibWVkZXZpY2UuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgU3RydWN0dXJlIGhvbGRpbmcgTUUtNjAwMCBkZXZpY2UgY2FwYWJpbGl0aWVzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTYwMDBfdmVyc2lvbiB7CisJdWludDE2X3QgZGV2aWNlX2lkOworCXVuc2lnbmVkIGludCBkaW9fc3ViZGV2aWNlczsKKwl1bnNpZ25lZCBpbnQgYW9fc3ViZGV2aWNlczsKKwl1bnNpZ25lZCBpbnQgYW9fZmlmbzsJLy9Ib3cgbWFueSBkZXZpY2VzIGhhdmUgRklGTworfSBtZTYwMDBfdmVyc2lvbl90OworCisvKioKKyAqIEBicmllZiBNRS02MDAwIGRldmljZSBjYXBhYmlsaXRpZXMuCisgKi8KK3N0YXRpYyBtZTYwMDBfdmVyc2lvbl90IG1lNjAwMF92ZXJzaW9uc1tdID0geworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAwNCwgMCwgNCwgMH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDA4LCAwLCA4LCAwfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMEYsIDAsIDE2LCAwfSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAxNCwgMCwgNCwgMH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDE4LCAwLCA4LCAwfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMUYsIDAsIDE2LCAwfSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAzNCwgMCwgNCwgMH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDM4LCAwLCA4LCAwfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwM0YsIDAsIDE2LCAwfSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEwNCwgMCwgNCwgNH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTA4LCAwLCA4LCA0fSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMEYsIDAsIDE2LCA0fSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjExNCwgMCwgNCwgNH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTE4LCAwLCA4LCA0fSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMUYsIDAsIDE2LCA0fSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEzNCwgMCwgNCwgNH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTM4LCAwLCA4LCA0fSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxM0YsIDAsIDE2LCA0fSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA0NCwgMiwgNCwgMH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDQ4LCAyLCA4LCAwfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNEYsIDIsIDE2LCAwfSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA1NCwgMiwgNCwgMH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDU4LCAyLCA4LCAwfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNUYsIDIsIDE2LCAwfSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA3NCwgMiwgNCwgMH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDc4LCAyLCA4LCAwfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwN0YsIDIsIDE2LCAwfSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE0NCwgMiwgNCwgNH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTQ4LCAyLCA4LCA0fSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNEYsIDIsIDE2LCA0fSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE1NCwgMiwgNCwgNH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTU4LCAyLCA4LCA0fSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNUYsIDIsIDE2LCA0fSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE3NCwgMiwgNCwgNH0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTc4LCAyLCA4LCA0fSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxN0YsIDIsIDE2LCA0fSwKKworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjI1OSwgMiwgOSwgMH0sCisKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYzNTksIDIsIDksIDR9LAorCisJezB9LAorfTsKKworI2RlZmluZSBNRTYwMDBfREVWSUNFX1ZFUlNJT05TIChzaXplb2YobWU2MDAwX3ZlcnNpb25zKSAvIHNpemVvZihtZTYwMDBfdmVyc2lvbl90KSAtIDEpCS8qKjwgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gI21lNjAwMF92ZXJzaW9ucy4gKi8KKworLyoqCisgKiBAYnJpZWYgUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGRldmljZSBlbnRyeSBpbiAjbWU2MDAwX3ZlcnNpb25zLgorICoKKyAqIEBwYXJhbSBkZXZpY2VfaWQgVGhlIFBDSSBkZXZpY2UgaWQgb2YgdGhlIGRldmljZSB0byBxdWVyeS4KKyAqIEByZXR1cm4gVGhlIGluZGV4IG9mIHRoZSBkZXZpY2UgaW4gI21lNjAwMF92ZXJzaW9ucy4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbWU2MDAwX3ZlcnNpb25zX2dldF9kZXZpY2VfaW5kZXgodWludDE2X3QgZGV2aWNlX2lkKQoreworCXVuc2lnbmVkIGludCBpOworCWZvciAoaSA9IDA7IGkgPCBNRTYwMDBfREVWSUNFX1ZFUlNJT05TOyBpKyspCisJCWlmIChtZTYwMDBfdmVyc2lvbnNbaV0uZGV2aWNlX2lkID09IGRldmljZV9pZCkKKwkJCWJyZWFrOworCXJldHVybiBpOworfQorCisvKioKKyAqIEBicmllZiBUaGUgTUUtNjAwMCBkZXZpY2UgY2xhc3Mgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTYwMDBfZGV2aWNlIHsKKwltZV9kZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIE1laWxoYXVzIGRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQ2hpbGQgY2xhc3MgYXR0cmlidXRlcy4gKi8KKwlzcGlubG9ja190IHByZWxvYWRfcmVnX2xvY2s7CQkvKio8IEd1YXJkcyB0aGUgcHJlbG9hZCByZWdpc3Rlci4gKi8KKwl1aW50MzJfdCBwcmVsb2FkX2ZsYWdzOworCXVpbnQzMl90IHRyaWdnZXJpbmdfZmxhZ3M7CisKKwlzcGlubG9ja190IGRpb19jdHJsX3JlZ19sb2NrOworfSBtZTYwMDBfZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBNRS02MDAwIGRldmljZSBjbGFzcyBjb25zdHJ1Y3Rvci4KKyAqCisgKiBAcGFyYW0gcGNpX2RldmljZSBUaGUgcGNpIGRldmljZSBzdHJ1Y3R1cmUgZ2l2ZW4gYnkgdGhlIFBDSSBzdWJzeXN0ZW0uCisgKgorICogQHJldHVybiBPbiBzdWNjZXMgYSBuZXcgTUUtNjAwMCBkZXZpY2UgaW5zdGFuY2UuIFxuCisgKiAgICAgICAgIE5VTEwgb24gZXJyb3IuCisgKi8KK21lX2RldmljZV90ICptZTYwMDBfcGNpX2NvbnN0cnVjdG9yKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlKQorICAgIF9fYXR0cmlidXRlX18gKCh3ZWFrKSk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU2MDAwX2Rpby5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9kaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2YxMDY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9kaW8uYwpAQCAtMCwwICsxLDQxNSBAQAorLyoqCisgKiBAZmlsZSBtZTYwMDBfZGlvLmMKKyAqCisgKiBAYnJpZWYgTUUtNjAwMCBkaWdpdGFsIGlucHV0L291dHB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKy8qCisgKiBJbmNsdWRlcworICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZTYwMDBfZGlvX3JlZy5oIgorI2luY2x1ZGUgIm1lNjAwMF9kaW8uaCIKKworLyoKKyAqIERlZmluZXMKKyAqLworCisvKgorICogRnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBtZTYwMDBfZGlvX2lvX3Jlc2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCSBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTYwMDBfZGlvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1aW50OF90IG1vZGU7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTYwMDBfZGlvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncykgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJbW9kZSA9IGluYihpbnN0YW5jZS0+Y3RybF9yZWcpOworCW1vZGUgJj0gfigweDMgPDwgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCW91dGIobW9kZSwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgbW9kZSk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCisJb3V0YigweDAwLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAweDAwKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU2MDAwX2Rpb19pb19zaW5nbGVfY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkgICAgICAgaW50IHJlZiwKKwkJCQkgICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICAgaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCW1lNjAwMF9kaW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQ4X3QgbW9kZTsKKwlpbnQgc2l6ZSA9CisJICAgIGZsYWdzICYgKE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0JJVCB8IE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0JZVEUKKwkJICAgICB8IE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX1dPUkQgfAorCQkgICAgIE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX0RXT1JEKTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lNjAwMF9kaW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSIHNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCW1vZGUgPSBpbmIoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlzd2l0Y2ggKHNpemUpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9DT05GSUdfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQlpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0RJT19JTlBVVCkgeworCQkJCW1vZGUgJj0KKwkJCQkgICAgfigoTUU2MDAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCSAgICAgICBNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMSkgPDwKKwkJCQkgICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSk7CisJCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fT1VUUFVUKSB7CisJCQkJbW9kZSAmPQorCQkJCSAgICB+KChNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJICAgICAgIE1FNjAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCSAgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKwkJCQltb2RlIHw9CisJCQkJICAgIE1FNjAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIDw8IChpbnN0YW5jZS0+CisJCQkJCQkJCSAgIGRpb19pZHggKiAyKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SCisJCQkJICAgICgiSW52YWxpZCBwb3J0IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3MuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoIWVycikgeworCQlvdXRiKG1vZGUsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCVBERUJVR19SRUcoImN0cmxfcmVnIG91dGwoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIG1vZGUpOworCX0KKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU2MDAwX2Rpb19pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU2MDAwX2Rpb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdWludDhfdCBtb2RlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU2MDAwX2Rpb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVIgc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCW1vZGUgPQorCQkJICAgIGluYihpbnN0YW5jZS0+CisJCQkJY3RybF9yZWcpICYgKChNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCSAgICAgIE1FNjAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKwkJCWlmICgobW9kZSA9PQorCQkJICAgICAoTUU2MDAwX0RJT19DVFJMX0JJVF9NT0RFXzAgPDwKKwkJCSAgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKSkgfHwgIW1vZGUpIHsKKwkJCQkqdmFsdWUgPQorCQkJCSAgICBpbmIoaW5zdGFuY2UtPnBvcnRfcmVnKSAmICgweDEgPDwgY2hhbm5lbCk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiUG9ydCBub3QgaW4gb3V0cHV0IG9yIGlucHV0IG1vZGUuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCW1vZGUgPQorCQkJICAgIGluYihpbnN0YW5jZS0+CisJCQkJY3RybF9yZWcpICYgKChNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCSAgICAgIE1FNjAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKwkJCWlmICgobW9kZSA9PQorCQkJICAgICAoTUU2MDAwX0RJT19DVFJMX0JJVF9NT0RFXzAgPDwKKwkJCSAgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKSkgfHwgIW1vZGUpIHsKKwkJCQkqdmFsdWUgPSBpbmIoaW5zdGFuY2UtPnBvcnRfcmVnKSAmIDB4MDBGRjsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJQb3J0IG5vdCBpbiBvdXRwdXQgb3IgaW5wdXQgbW9kZS5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBieXRlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lNjAwMF9kaW9faW9fc2luZ2xlX3dyaXRlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lNjAwMF9kaW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQ4X3QgbW9kZTsKKwl1aW50OF90IGJ5dGU7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTYwMDBfZGlvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUiBzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQklUOgorCQlpZiAoKGNoYW5uZWwgPj0gMCkgJiYgKGNoYW5uZWwgPCA4KSkgeworCQkJbW9kZSA9CisJCQkgICAgaW5iKGluc3RhbmNlLT4KKwkJCQljdHJsX3JlZykgJiAoKE1FNjAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIHwKKwkJCQkJICAgICAgTUU2MDAwX0RJT19DVFJMX0JJVF9NT0RFXzEpIDw8CisJCQkJCSAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCisJCQlpZiAobW9kZSA9PQorCQkJICAgIChNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMCA8PAorCQkJICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSkpIHsKKwkJCQlieXRlID0gaW5iKGluc3RhbmNlLT5wb3J0X3JlZykgJiAweDAwRkY7CisKKwkJCQlpZiAodmFsdWUpCisJCQkJCWJ5dGUgfD0gMHgxIDw8IGNoYW5uZWw7CisJCQkJZWxzZQorCQkJCQlieXRlICY9IH4oMHgxIDw8IGNoYW5uZWwpOworCisJCQkJb3V0YihieXRlLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IoIlBvcnQgbm90IGluIG91dHB1dCBvciBpbnB1dCBtb2RlLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJpdCBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQltb2RlID0KKwkJCSAgICBpbmIoaW5zdGFuY2UtPgorCQkJCWN0cmxfcmVnKSAmICgoTUU2MDAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCQkgICAgICBNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMSkgPDwKKwkJCQkJICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSk7CisKKwkJCWlmIChtb2RlID09CisJCQkgICAgKE1FNjAwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIDw8CisJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKSkgeworCQkJCW91dGIodmFsdWUsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiUG9ydCBub3QgaW4gb3V0cHV0IG9yIGlucHV0IG1vZGUuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTYwMDBfZGlvX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgIGludCAqbnVtYmVyKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqbnVtYmVyID0gODsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTYwMDBfZGlvX3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKnR5cGUgPSBNRV9UWVBFX0RJTzsKKwkqc3VidHlwZSA9IE1FX1NVQlRZUEVfU0lOR0xFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lNjAwMF9kaW9fcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPSBNRV9DQVBTX0RJT19ESVJfQllURTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworbWU2MDAwX2Rpb19zdWJkZXZpY2VfdCAqbWU2MDAwX2Rpb19jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCBkaW9faWR4LAorCQkJCQkgICAgICAgc3BpbmxvY2tfdCAqIGN0cmxfcmVnX2xvY2spCit7CisJbWU2MDAwX2Rpb19zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCWludCBlcnI7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZSAqLworCXN1YmRldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lNjAwMF9kaW9fc3ViZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghc3ViZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc3ViZGV2aWNlLCAwLCBzaXplb2YobWU2MDAwX2Rpb19zdWJkZXZpY2VfdCkpOworCisJLyogSW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyAqLworCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBTZXQgdGhlIHN1YmRldmljZSBwb3J0cyAqLworCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FNjAwMF9ESU9fQ1RSTF9SRUc7CisJc3dpdGNoIChkaW9faWR4KSB7CisJY2FzZSAwOgorCQlzdWJkZXZpY2UtPnBvcnRfcmVnID0gcmVnX2Jhc2UgKyBNRTYwMDBfRElPX1BPUlRfMF9SRUc7CisJCWJyZWFrOworCWNhc2UgMToKKwkJc3ViZGV2aWNlLT5wb3J0X3JlZyA9IHJlZ19iYXNlICsgTUU2MDAwX0RJT19QT1JUXzFfUkVHOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NVQkRFVklDRTsKKwl9CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlzdWJkZXZpY2UtPmN0cmxfcmVnX2xvY2sgPSBjdHJsX3JlZ19sb2NrOworCisJLyogU2F2ZSBkaWdpdGFsIGkvbyBpbmRleCAqLworCXN1YmRldmljZS0+ZGlvX2lkeCA9IGRpb19pZHg7CisKKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXN1YmRldmljZS0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKKyNlbmRpZgorCisJLyogT3ZlcmxvYWQgYmFzZSBjbGFzcyBtZXRob2RzLiAqLworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWU2MDAwX2Rpb19pb19yZXNldF9zdWJkZXZpY2U7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfY29uZmlnID0KKwkgICAgbWU2MDAwX2Rpb19pb19zaW5nbGVfY29uZmlnOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3JlYWQgPSBtZTYwMDBfZGlvX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0KKwkgICAgbWU2MDAwX2Rpb19pb19zaW5nbGVfd3JpdGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMgPQorCSAgICBtZTYwMDBfZGlvX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWU2MDAwX2Rpb19xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWU2MDAwX2Rpb19xdWVyeV9zdWJkZXZpY2VfY2FwczsKKworCXJldHVybiBzdWJkZXZpY2U7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU2MDAwX2Rpby5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9kaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NThiZWMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9kaW8uaApAQCAtMCwwICsxLDY4IEBACisvKioKKyAqIEBmaWxlIG1lNjAwMF9kaW8uaAorICoKKyAqIEBicmllZiBNRS02MDAwIGRpZ2l0YWwgaW5wdXQvb3V0cHV0IHN1YmRldmljZSBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTYwMDBfRElPX0hfCisjZGVmaW5lIF9NRTYwMDBfRElPX0hfCisKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgdGVtcGxhdGUgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTYwMDBfZGlvX3N1YmRldmljZSB7CisJLyogSW5oZXJpdGFuY2UgKi8KKwltZV9zdWJkZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQXR0cmlidXRlcyAqLworCXNwaW5sb2NrX3Qgc3ViZGV2aWNlX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0IHRoZSBzdWJkZXZpY2UgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwlzcGlubG9ja190ICpjdHJsX3JlZ19sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCAjY3RybF9yZWcgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwl1bnNpZ25lZCBpbnQgZGlvX2lkeDsJCQkvKio8IFRoZSBpbmRleCBvZiB0aGUgZGlnaXRhbCBpL28gb24gdGhlIGRldmljZS4gKi8KKworCXVuc2lnbmVkIGxvbmcgcG9ydF9yZWc7CQkJLyoqPCBSZWdpc3RlciBob2xkaW5nIHRoZSBwb3J0IHN0YXR1cy4gKi8KKwl1bnNpZ25lZCBsb25nIGN0cmxfcmVnOwkJCS8qKjwgUmVnaXN0ZXIgdG8gY29uZmlndXJlIHRoZSBwb3J0IGRpcmVjdGlvbi4gKi8KKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2U7CisjZW5kaWYKK30gbWU2MDAwX2Rpb19zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgTUUtNjAwMCBkaWdpdGFsIGlucHV0L291cHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gcmVnX2Jhc2UgVGhlIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGFzIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUy4KKyAqIEBwYXJhbSBkaW9faWR4IFRoZSBpbmRleCBvZiB0aGUgZGlnaXRhbCBpL28gcG9ydCBvbiB0aGUgZGV2aWNlLgorICogQHBhcmFtIGN0cmxfcmVnX2xvY2sgU3BpbiBsb2NrIHByb3RlY3RpbmcgdGhlIGNvbnRyb2wgcmVnaXN0ZXIuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLlxuCisgKiBOVUxMIG9uIGVycm9yLgorICovCittZTYwMDBfZGlvX3N1YmRldmljZV90ICptZTYwMDBfZGlvX2NvbnN0cnVjdG9yKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IGRpb19pZHgsCisJCQkJCSAgICAgICBzcGlubG9ja190ICogY3RybF9yZWdfbG9jayk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU2MDAwX2Rpb19yZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfZGlvX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2N2E3OTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU2MDAwX2Rpb19yZWcuaApAQCAtMCwwICsxLDQzIEBACisvKioKKyAqIEBmaWxlIG1lNjAwMF9kaW9fcmVnLmgKKyAqCisgKiBAYnJpZWYgTUUtNjAwMCBkaWdpdGFsIGlucHV0L291dHB1dCBzdWJkZXZpY2UgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU2MDAwX0RJT19SRUdfSF8KKyNkZWZpbmUgX01FNjAwMF9ESU9fUkVHX0hfCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgTUU2MDAwX0RJT19DVFJMX1JFRwkJCQkweDAwCS8vIFIvVworI2RlZmluZSBNRTYwMDBfRElPX1BPUlRfMF9SRUcJCQkweDAxCS8vIFIvVworI2RlZmluZSBNRTYwMDBfRElPX1BPUlRfMV9SRUcJCQkweDAyCS8vIFIvVworI2RlZmluZSBNRTYwMDBfRElPX1BPUlRfUkVHCQkJCU1FNjAwMF9ESU9fUE9SVF8wX1JFRwkvLyBSL1cKKworI2RlZmluZSBNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMAkJMHgwMQorI2RlZmluZSBNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMQkJMHgwMgorI2RlZmluZSBNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMgkJMHgwNAorI2RlZmluZSBNRTYwMDBfRElPX0NUUkxfQklUX01PREVfMwkJMHgwOAorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9yZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM1MjczMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfcmVnLmgKQEAgLTAsMCArMSwzNSBAQAorLyoqCisgKiBAZmlsZSBtZTYwMDBfcmVnLmgKKyAqCisgKiBAYnJpZWYgTUUtNjAwMCBkZXZpY2UgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU2MDAwX1JFR19IXworI2RlZmluZSBfTUU2MDAwX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FNjAwMF9JTklUX1hJTElOWF9SRUcJCTB4QUMJLy8gUi8tCisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX2RldmljZS5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kZXZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmI3OWU0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kZXZpY2UuYwpAQCAtMCwwICsxLDE4NyBAQAorLyoqCisgKiBAZmlsZSBtZTgxMDBfZGV2aWNlLmMKKyAqCisgKiBAYnJpZWYgTUUtODEwMCBkZXZpY2UgY2xhc3MgaW1wbGVtZW50YXRpb24uCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKyNpZm5kZWYgTU9EVUxFCisjICBkZWZpbmUgTU9EVUxFCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAibWVpZHMuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisjaW5jbHVkZSAibWVjb21tb24uaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWVkZXZpY2UuaCIKKyNpbmNsdWRlICJtZTgxMDBfZGV2aWNlLmgiCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKyNpbmNsdWRlICJtZTgxMDBfZGkuaCIKKyNpbmNsdWRlICJtZTgxMDBfZG8uaCIKKyNpbmNsdWRlICJtZTgyNTQuaCIKKworbWVfZGV2aWNlX3QgKm1lODEwMF9wY2lfY29uc3RydWN0b3Ioc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2UpCit7CisJbWU4MTAwX2RldmljZV90ICptZTgxMDBfZGV2aWNlOworCW1lX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJdW5zaWduZWQgaW50IHZlcnNpb25faWR4OworCWludCBlcnI7CisJaW50IGk7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBBbGxvY2F0ZSBzdHJ1Y3R1cmUgZm9yIGRldmljZSBpbnN0YW5jZS4KKwltZTgxMDBfZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWU4MTAwX2RldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIW1lODEwMF9kZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3IgZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChtZTgxMDBfZGV2aWNlLCAwLCBzaXplb2YobWU4MTAwX2RldmljZV90KSk7CisKKwkvLyBJbml0aWFsaXplIGJhc2UgY2xhc3Mgc3RydWN0dXJlLgorCWVyciA9IG1lX2RldmljZV9wY2lfaW5pdCgobWVfZGV2aWNlX3QgKikgbWU4MTAwX2RldmljZSwgcGNpX2RldmljZSk7CisKKwlpZiAoZXJyKSB7CisJCWtmcmVlKG1lODEwMF9kZXZpY2UpOworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIGRldmljZSBiYXNlIGNsYXNzLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIEdldCB0aGUgaW5kZXggaW4gdGhlIGRldmljZSB2ZXJzaW9uIGluZm9ybWF0aW9uIHRhYmxlLiAqLworCXZlcnNpb25faWR4ID0KKwkgICAgbWU4MTAwX3ZlcnNpb25zX2dldF9kZXZpY2VfaW5kZXgobWU4MTAwX2RldmljZS0+YmFzZS5pbmZvLnBjaS4KKwkJCQkJICAgICBkZXZpY2VfaWQpOworCisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2sgLgorCXNwaW5fbG9ja19pbml0KCZtZTgxMDBfZGV2aWNlLT5kaW9fY3RybF9yZWdfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJm1lODEwMF9kZXZpY2UtPmN0cl9jdHJsX3JlZ19sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmbWU4MTAwX2RldmljZS0+Y2xrX3NyY19yZWdfbG9jayk7CisKKwkvLyBDcmVhdGUgc3ViZGV2aWNlIGluc3RhbmNlcy4KKworCWZvciAoaSA9IDA7IGkgPCBtZTgxMDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLmRpX3N1YmRldmljZXM7IGkrKykgeworCQlzdWJkZXZpY2UgPQorCQkgICAgKG1lX3N1YmRldmljZV90ICopIG1lODEwMF9kaV9jb25zdHJ1Y3RvcihtZTgxMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGJhc2UuaW5mby5wY2kuCisJCQkJCQkJICAgICByZWdfYmFzZXNbMl0sCisJCQkJCQkJICAgICBtZTgxMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGJhc2UuaW5mby5wY2kuCisJCQkJCQkJICAgICByZWdfYmFzZXNbMV0sIGksCisJCQkJCQkJICAgICBtZTgxMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGJhc2UuaXJxLAorCQkJCQkJCSAgICAgJm1lODEwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgZGlvX2N0cmxfcmVnX2xvY2spOworCisJCWlmICghc3ViZGV2aWNlKSB7CisJCQltZV9kZXZpY2VfZGVpbml0KChtZV9kZXZpY2VfdCAqKSBtZTgxMDBfZGV2aWNlKTsKKwkJCWtmcmVlKG1lODEwMF9kZXZpY2UpOworCQkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlLlxuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCW1lX3NsaXN0X2FkZF9zdWJkZXZpY2VfdGFpbCgmbWU4MTAwX2RldmljZS0+YmFzZS5zbGlzdCwKKwkJCQkJICAgIHN1YmRldmljZSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG1lODEwMF92ZXJzaW9uc1t2ZXJzaW9uX2lkeF0uZG9fc3ViZGV2aWNlczsgaSsrKSB7CisJCXN1YmRldmljZSA9CisJCSAgICAobWVfc3ViZGV2aWNlX3QgKikgbWU4MTAwX2RvX2NvbnN0cnVjdG9yKG1lODEwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgYmFzZS5pbmZvLnBjaS4KKwkJCQkJCQkgICAgIHJlZ19iYXNlc1syXSwgaSwKKwkJCQkJCQkgICAgICZtZTgxMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGRpb19jdHJsX3JlZ19sb2NrKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWU4MTAwX2RldmljZSk7CisJCQlrZnJlZShtZTgxMDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lODEwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBtZTgxMDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLmN0cl9zdWJkZXZpY2VzOyBpKyspIHsKKwkJc3ViZGV2aWNlID0KKwkJICAgIChtZV9zdWJkZXZpY2VfdCAqKSBtZTgyNTRfY29uc3RydWN0b3IobWU4MTAwX2RldmljZS0+YmFzZS4KKwkJCQkJCQkgIGluZm8ucGNpLmRldmljZV9pZCwKKwkJCQkJCQkgIG1lODEwMF9kZXZpY2UtPmJhc2UuCisJCQkJCQkJICBpbmZvLnBjaS5yZWdfYmFzZXNbMl0sCisJCQkJCQkJICAwLCBpLAorCQkJCQkJCSAgJm1lODEwMF9kZXZpY2UtPgorCQkJCQkJCSAgY3RyX2N0cmxfcmVnX2xvY2ssCisJCQkJCQkJICAmbWU4MTAwX2RldmljZS0+CisJCQkJCQkJICBjbGtfc3JjX3JlZ19sb2NrKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWU4MTAwX2RldmljZSk7CisJCQlrZnJlZShtZTgxMDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lODEwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCXJldHVybiAobWVfZGV2aWNlX3QgKikgbWU4MTAwX2RldmljZTsKK30KKworLy8gSW5pdCBhbmQgZXhpdCBvZiBtb2R1bGUuCisKK3N0YXRpYyBpbnQgX19pbml0IG1lODEwMF9pbml0KHZvaWQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbi4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1lODEwMF9leGl0KHZvaWQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbi4iKTsKK30KKworbW9kdWxlX2luaXQobWU4MTAwX2luaXQpOworCittb2R1bGVfZXhpdChtZTgxMDBfZXhpdCk7CisKKy8vIEFkbWluaXN0cmF0aXZlIHN0dWZmIGZvciBtb2RpbmZvLgorTU9EVUxFX0FVVEhPUigiR3VlbnRlciBHZWJoYXJkdCA8Zy5nZWJoYXJkdEBtZWlsaGF1cy5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRGV2aWNlIERyaXZlciBNb2R1bGUgZm9yIFRlbXBsYXRlIERldmljZSIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIk1laWxoYXVzIFRlbXBsYXRlIERldmljZXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLy8gRXhwb3J0IHRoZSBjb25zdHJ1Y3Rvci4KK0VYUE9SVF9TWU1CT0wobWU4MTAwX3BjaV9jb25zdHJ1Y3Rvcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX2RldmljZS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGM0MmVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kZXZpY2UuaApAQCAtMCwwICsxLDk3IEBACisvKioKKyAqIEBmaWxlIG1lODEwMF9kZXZpY2UuaAorICoKKyAqIEBicmllZiBNRS04MTAwIGRldmljZSBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTgxMDBfREVWSUNFX0gKKyNkZWZpbmUgX01FODEwMF9ERVZJQ0VfSAorCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFN0cnVjdHVyZSBob2xkaW5nIE1FLTgxMDAgZGV2aWNlIGNhcGFiaWxpdGllcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWU4MTAwX3ZlcnNpb24geworCXVpbnQxNl90IGRldmljZV9pZDsKKwl1bnNpZ25lZCBpbnQgZGlfc3ViZGV2aWNlczsKKwl1bnNpZ25lZCBpbnQgZG9fc3ViZGV2aWNlczsKKwl1bnNpZ25lZCBpbnQgY3RyX3N1YmRldmljZXM7Cit9IG1lODEwMF92ZXJzaW9uX3Q7CisKKy8qKgorICogQGJyaWVmIERldmljZSBjYXBhYmlsaXRpZXMuCisgKi8KK3N0YXRpYyBtZTgxMDBfdmVyc2lvbl90IG1lODEwMF92ZXJzaW9uc1tdID0geworCXtQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODEwMF9BLCAxLCAxLCAzfSwKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTgxMDBfQiwgMiwgMiwgM30sCisJezB9LAorfTsKKworI2RlZmluZSBNRTgxMDBfREVWSUNFX1ZFUlNJT05TIChzaXplb2YobWU4MTAwX3ZlcnNpb25zKSAvIHNpemVvZihtZTgxMDBfdmVyc2lvbl90KSAtIDEpCS8qKjwgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gI21lODEwMF92ZXJzaW9ucy4gKi8KKworLyoqCisgKiBAYnJpZWYgUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGRldmljZSBlbnRyeSBpbiAjbWU4MTAwX3ZlcnNpb25zLgorICoKKyAqIEBwYXJhbSBkZXZpY2VfaWQgVGhlIFBDSSBkZXZpY2UgaWQgb2YgdGhlIGRldmljZSB0byBxdWVyeS4KKyAqIEByZXR1cm4gVGhlIGluZGV4IG9mIHRoZSBkZXZpY2UgaW4gI21lODEwMF92ZXJzaW9ucy4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbWU4MTAwX3ZlcnNpb25zX2dldF9kZXZpY2VfaW5kZXgodWludDE2X3QgZGV2aWNlX2lkKQoreworCXVuc2lnbmVkIGludCBpOworCWZvciAoaSA9IDA7IGkgPCBNRTgxMDBfREVWSUNFX1ZFUlNJT05TOyBpKyspCisJCWlmIChtZTgxMDBfdmVyc2lvbnNbaV0uZGV2aWNlX2lkID09IGRldmljZV9pZCkKKwkJCWJyZWFrOworCXJldHVybiBpOworfQorCisvKioKKyAqIEBicmllZiBUaGUgTUUtODEwMCBkZXZpY2UgY2xhc3Mgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTgxMDBfZGV2aWNlIHsKKwltZV9kZXZpY2VfdCBiYXNlOwkJCS8qKjwgVGhlIE1laWxoYXVzIGRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQ2hpbGQgY2xhc3MgYXR0cmlidXRlcy4gKi8KKwlzcGlubG9ja190IGRpb19jdHJsX3JlZ19sb2NrOworCXNwaW5sb2NrX3QgY3RyX2N0cmxfcmVnX2xvY2s7CisJc3BpbmxvY2tfdCBjbGtfc3JjX3JlZ19sb2NrOworfSBtZTgxMDBfZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBNRS04MTAwIGRldmljZSBjbGFzcyBjb25zdHJ1Y3Rvci4KKyAqCisgKiBAcGFyYW0gcGNpX2RldmljZSBUaGUgcGNpIGRldmljZSBzdHJ1Y3R1cmUgZ2l2ZW4gYnkgdGhlIFBDSSBzdWJzeXN0ZW0uCisgKgorICogQHJldHVybiBPbiBzdWNjZXMgYSBuZXcgTUUtODEwMCBkZXZpY2UgaW5zdGFuY2UuIFxuCisgKiAgICAgICAgIE5VTEwgb24gZXJyb3IuCisgKi8KK21lX2RldmljZV90ICptZTgxMDBfcGNpX2NvbnN0cnVjdG9yKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlKQorICAgIF9fYXR0cmlidXRlX18gKCh3ZWFrKSk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX2RpLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX2RpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcxNzI3YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgxMDBfZGkuYwpAQCAtMCwwICsxLDY5MyBAQAorLyoqCisgKiBAZmlsZSBtZTgxMDBfZGkuYworICoKKyAqIEBicmllZiBNRS04MTAwIGRpZ2l0YWwgaW5wdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvKgorICogSW5jbHVkZXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisKKyNpbmNsdWRlICJtZWlkcy5oIgorI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZXBseF9yZWcuaCIKKyNpbmNsdWRlICJtZTgxMDBfcmVnLmgiCisjaW5jbHVkZSAibWU4MTAwX2RpX3JlZy5oIgorI2luY2x1ZGUgIm1lODEwMF9kaS5oIgorCisvKgorICogRGVmaW5lcworICovCisKKy8qCisgKiBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW50IG1lODEwMF9kaV9pb19yZXNldF9zdWJkZXZpY2Uoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTgxMDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVuc2lnbmVkIHNob3J0IGN0cmw7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgxMDBfZGlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJY3RybCA9IGludyhpbnN0YW5jZS0+Y3RybF9yZWcpOworCWN0cmwgJj0gfihNRTgxMDBfRElPX0NUUkxfQklUX0lOVEJfMSB8IE1FODEwMF9ESU9fQ1RSTF9CSVRfSU5UQl8wKTsKKwlvdXR3KGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0bCgweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKworCW91dHcoMCwgaW5zdGFuY2UtPm1hc2tfcmVnKTsKKwlQREVCVUdfUkVHKCJtYXNrX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5tYXNrX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMCk7CisJb3V0dygwLCBpbnN0YW5jZS0+cGF0dGVybl9yZWcpOworCVBERUJVR19SRUcoInBhdHRlcm5fcmVnIG91dHcoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnBhdHRlcm5fcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwlpbnN0YW5jZS0+cmlzZWQgPSAtMTsKKwlpbnN0YW5jZS0+aXJxX2NvdW50ID0gMDsKKwlpbnN0YW5jZS0+ZmlsdGVyaW5nX2ZsYWcgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCW91dGwoUExYX0lOVENTUl9MT0NBTF9JTlQxX0VOIHwKKwkgICAgIFBMWF9JTlRDU1JfTE9DQUxfSU5UMV9QT0wgfAorCSAgICAgUExYX0lOVENTUl9MT0NBTF9JTlQyX0VOIHwKKwkgICAgIFBMWF9JTlRDU1JfTE9DQUxfSU5UMl9QT0wgfAorCSAgICAgUExYX0lOVENTUl9QQ0lfSU5UX0VOLCBpbnN0YW5jZS0+aXJxX3N0YXR1c19yZWcpOworCVBERUJVR19SRUcoInBseDppcnFfc3RhdHVzX3JlZyBvdXRsKDB4JWxYKT0weCV4XG4iLAorCQkgICBpbnN0YW5jZS0+aXJxX3N0YXR1c19yZWcsCisJCSAgIFBMWF9JTlRDU1JfTE9DQUxfSU5UMV9FTiB8IFBMWF9JTlRDU1JfTE9DQUxfSU5UMV9QT0wgfAorCQkgICBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfRU4gfCBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfUE9MIHwKKwkJICAgUExYX0lOVENTUl9QQ0lfSU5UX0VOKTsKKworCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODEwMF9kaV9pb19pcnFfc3RhcnQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICBpbnQgY2hhbm5lbCwKKwkJCQkgIGludCBpcnFfc291cmNlLAorCQkJCSAgaW50IGlycV9lZGdlLCBpbnQgaXJxX2FyZywgaW50IGZsYWdzKQoreworCW1lODEwMF9kaV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdWludDE2X3QgY3RybDsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODEwMF9kaV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoaXJxX3NvdXJjZSA9PSBNRV9JUlFfU09VUkNFX0RJT19QQVRURVJOKSB7CisJCWlmIChmbGFncyAmCisJCSAgICB+KE1FX0lPX0lSUV9TVEFSVF9QQVRURVJOX0ZJTFRFUklORyB8CisJCSAgICAgIE1FX0lPX0lSUV9TVEFSVF9ESU9fV09SRCkpIHsKKwkJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJCX0KKworCQlpZiAoaXJxX2VkZ2UgIT0gTUVfSVJRX0VER0VfTk9UX1VTRUQpIHsKKwkJCVBFUlJPUigiSW52YWxpZCBpcnEgZWRnZSBzcGVjaWZpZWQuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0lSUV9FREdFOworCQl9CisJfSBlbHNlIGlmIChpcnFfc291cmNlID09IE1FX0lSUV9TT1VSQ0VfRElPX01BU0spIHsKKwkJaWYgKGZsYWdzICYKKwkJICAgIH4oTUVfSU9fSVJRX1NUQVJUX0VYVEVOREVEX1NUQVRVUyB8CisJCSAgICAgIE1FX0lPX0lSUV9TVEFSVF9ESU9fV09SRCkpIHsKKwkJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJCX0KKworCQlpZiAoaXJxX2VkZ2UgIT0gTUVfSVJRX0VER0VfQU5ZKSB7CisJCQlQRVJST1IoIkludmFsaWQgaXJxIGVkZ2Ugc3BlY2lmaWVkLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9JUlFfRURHRTsKKwkJfQorCisJCWlmICghKGlycV9hcmcgJiAweEZGRkYpKSB7CisJCQlQRVJST1IoIk5vIG1hc2sgc3BlY2lmaWVkLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9JUlFfQVJHOworCQl9CisJfSBlbHNlIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGlycSBzb3VyY2Ugc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0lSUV9TT1VSQ0U7CisJfQorCisJaWYgKGNoYW5uZWwpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwlpZiAoaXJxX3NvdXJjZSA9PSBNRV9JUlFfU09VUkNFX0RJT19QQVRURVJOKSB7CisJCW91dHcoaXJxX2FyZywgaW5zdGFuY2UtPnBhdHRlcm5fcmVnKTsKKwkJaW5zdGFuY2UtPmNvbXBhcmVfdmFsdWUgPSBpcnFfYXJnOworCQlpbnN0YW5jZS0+ZmlsdGVyaW5nX2ZsYWcgPQorCQkgICAgKGZsYWdzICYgTUVfSU9fSVJRX1NUQVJUX1BBVFRFUk5fRklMVEVSSU5HKSA/IDEgOiAwOworCX0KKwlpZiAoaXJxX3NvdXJjZSA9PSBNRV9JUlFfU09VUkNFX0RJT19NQVNLKSB7CisJCW91dHcoaXJxX2FyZywgaW5zdGFuY2UtPm1hc2tfcmVnKTsKKwl9CisKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCWN0cmwgPSBpbncoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwljdHJsIHw9IE1FODEwMF9ESU9fQ1RSTF9CSVRfSU5UQl8wOworCWlmIChpcnFfc291cmNlID09IE1FX0lSUV9TT1VSQ0VfRElPX1BBVFRFUk4pIHsKKwkJY3RybCAmPSB+TUU4MTAwX0RJT19DVFJMX0JJVF9JTlRCXzE7CisJfQorCisJaWYgKGlycV9zb3VyY2UgPT0gTUVfSVJRX1NPVVJDRV9ESU9fTUFTSykgeworCQljdHJsIHw9IE1FODEwMF9ESU9fQ1RSTF9CSVRfSU5UQl8xOworCX0KKwlvdXR3KGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKworCWluc3RhbmNlLT5yaXNlZCA9IDA7CisJaW5zdGFuY2UtPnN0YXR1c192YWx1ZSA9IDA7CisJaW5zdGFuY2UtPnN0YXR1c192YWx1ZV9lZGdlcyA9IDA7CisJaW5zdGFuY2UtPmxpbmVfdmFsdWUgPSBpbncoaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwlpbnN0YW5jZS0+c3RhdHVzX2ZsYWcgPSBmbGFncyAmIE1FX0lPX0lSUV9TVEFSVF9FWFRFTkRFRF9TVEFUVVM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lODEwMF9kaV9pb19pcnFfd2FpdChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSBpbnQgY2hhbm5lbCwKKwkJCQkgaW50ICppcnFfY291bnQsCisJCQkJIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lODEwMF9kaV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbG9uZyB0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKKwlpbnQgY291bnQ7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJUERFVkVMT1AoIlBJRDogJWQuXG4iLCBjdXJyZW50LT5waWQpOworCisJaW5zdGFuY2UgPSAobWU4MTAwX2RpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncyAmCisJICAgIH4oTUVfSU9fSVJRX1dBSVRfTk9STUFMX1NUQVRVUyB8IE1FX0lPX0lSUV9XQUlUX0VYVEVOREVEX1NUQVRVUykpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmIChjaGFubmVsKSB7CisJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCWlmICh0aW1lX291dCA8IDApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHRpbWVfb3V0IHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9USU1FT1VUOworCX0KKworCWlmICh0aW1lX291dCkgeworCQl0ID0gKHRpbWVfb3V0ICogSFopIC8gMTAwMDsKKworCQlpZiAodCA9PSAwKQorCQkJdCA9IDE7CisJfQorCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJaWYgKGluc3RhbmNlLT5yaXNlZCA8PSAwKSB7CisJCWluc3RhbmNlLT5yaXNlZCA9IDA7CisJCWNvdW50ID0gaW5zdGFuY2UtPmlycV9jb3VudDsKKworCQlpZiAodGltZV9vdXQpIHsKKwkJCXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+CisJCQkJCQkJICAgICB3YWl0X3F1ZXVlLAorCQkJCQkJCSAgICAgKChjb3VudCAhPQorCQkJCQkJCSAgICAgICBpbnN0YW5jZS0+CisJCQkJCQkJICAgICAgIGlycV9jb3VudCkKKwkJCQkJCQkgICAgICB8fCAoaW5zdGFuY2UtPgorCQkJCQkJCQkgIHJpc2VkIDwgMCkpLAorCQkJCQkJCSAgICAgdCk7CisvLyAgICAgICAgICAgICAgICAgICAgICB0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaW5zdGFuY2UtPndhaXRfcXVldWUsIChpbnN0YW5jZS0+cmlzZWQgIT0gMCksIHQpOworCQkJaWYgKHQgPT0gMCkgeworCQkJCVBFUlJPUigiV2FpdCBvbiBpbnRlcnJ1cHQgdGltZWQgb3V0LlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSAoKGNvdW50ICE9IGluc3RhbmNlLT5pcnFfY291bnQpCisJCQkJCQkgIHx8IChpbnN0YW5jZS0+cmlzZWQgPCAwKSkpOworLy8gICAgICAgICAgICAgICAgICAgICAgd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGluc3RhbmNlLT53YWl0X3F1ZXVlLCAoaW5zdGFuY2UtPnJpc2VkICE9IDApKTsKKwkJfQorCisJCWlmIChpbnN0YW5jZS0+cmlzZWQgPCAwKSB7CisJCQlQRVJST1IoIldhaXQgb24gaW50ZXJydXB0IGFib3J0ZWQgYnkgdXNlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQl9CisJfQorCisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCVBFUlJPUigiV2FpdCBvbiBpbnRlcnJ1cHQgYWJvcnRlZCBieSBzaWduYWwuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJKmlycV9jb3VudCA9IGluc3RhbmNlLT5pcnFfY291bnQ7CisJaWYgKCFlcnIpIHsKKwkJaWYgKGZsYWdzICYgTUVfSU9fSVJRX1dBSVRfTk9STUFMX1NUQVRVUykgeworCQkJKnZhbHVlID0gaW5zdGFuY2UtPnN0YXR1c192YWx1ZTsKKwkJfSBlbHNlIGlmIChmbGFncyAmIE1FX0lPX0lSUV9XQUlUX0VYVEVOREVEX1NUQVRVUykgeworCQkJKnZhbHVlID0gaW5zdGFuY2UtPnN0YXR1c192YWx1ZV9lZGdlczsKKwkJfSBlbHNlIHsJLy8gVXNlIGRlZmF1bHQKKwkJCWlmICghaW5zdGFuY2UtPnN0YXR1c19mbGFnKSB7CisJCQkJKnZhbHVlID0gaW5zdGFuY2UtPnN0YXR1c192YWx1ZTsKKwkJCX0gZWxzZSB7CisJCQkJKnZhbHVlID0gaW5zdGFuY2UtPnN0YXR1c192YWx1ZV9lZGdlczsKKwkJCX0KKwkJfQorCQlpbnN0YW5jZS0+cmlzZWQgPSAwOworLyoKKwkJCWluc3RhbmNlLT5zdGF0dXNfdmFsdWUgPSAwOworCQkJaW5zdGFuY2UtPnN0YXR1c192YWx1ZV9lZGdlcyA9IDA7CisqLworCX0gZWxzZSB7CisJCSp2YWx1ZSA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTgxMDBfZGlfaW9faXJxX3N0b3AobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJIHN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGNoYW5uZWwsIGludCBmbGFncykKK3sKKwltZTgxMDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQxNl90IGN0cmw7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgxMDBfZGlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJY3RybCA9IGludyhpbnN0YW5jZS0+Y3RybF9yZWcpOworCWN0cmwgJj0gfihNRTgxMDBfRElPX0NUUkxfQklUX0lOVEJfMSB8IE1FODEwMF9ESU9fQ1RSTF9CSVRfSU5UQl8wKTsKKwlvdXR3KGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiY3RybF9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+Y3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlpbnN0YW5jZS0+cmlzZWQgPSAtMTsKKwlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlID0gMDsKKwlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlX2VkZ2VzID0gMDsKKwlpbnN0YW5jZS0+ZmlsdGVyaW5nX2ZsYWcgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODEwMF9kaV9pb19zaW5nbGVfY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkgICAgICBpbnQgcmVmLAorCQkJCSAgICAgIGludCB0cmlnX2NoYW4sCisJCQkJICAgICAgaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCW1lODEwMF9kaV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgxMDBfZGlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX1dPUkQ6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCWlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfRElPX0lOUFVUKSB7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUgorCQkJCSAgICAoIkludmFsaWQgcG9ydCBjb25maWd1cmF0aW9uIHNwZWNpZmllZC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lODEwMF9kaV9pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU4MTAwX2RpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODEwMF9kaV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlzd2l0Y2ggKGZsYWdzKSB7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CSVQ6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDE2KSkgeworCQkJKnZhbHVlID0gaW53KGluc3RhbmNlLT5wb3J0X3JlZykgJiAoMHgxIDw8IGNoYW5uZWwpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJpdCBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQkqdmFsdWUgPSBpbncoaW5zdGFuY2UtPnBvcnRfcmVnKSAmIDB4RkY7CisJCX0gZWxzZSBpZiAoY2hhbm5lbCA9PSAxKSB7CisJCQkqdmFsdWUgPSAoaW53KGluc3RhbmNlLT5wb3J0X3JlZykgPj4gOCkgJiAweEZGOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fV09SRDoKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJKnZhbHVlID0gaW53KGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgd29yZCBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTgxMDBfZGlfcXVlcnlfbnVtYmVyX2NoYW5uZWxzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm51bWJlciA9IDE2OworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODEwMF9kaV9xdWVyeV9zdWJkZXZpY2VfdHlwZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKnR5cGUgPSBNRV9UWVBFX0RJOworCSpzdWJ0eXBlID0gTUVfU1VCVFlQRV9TSU5HTEU7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MTAwX2RpX3F1ZXJ5X3N1YmRldmljZV9jYXBzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLCBpbnQgKmNhcHMpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpjYXBzID0gTUVfQ0FQU19ESU9fQklUX1BBVFRFUk5fSVJRIHwgTUVfQ0FQU19ESU9fQklUX01BU0tfSVJRX0VER0VfQU5ZOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBtZTgxMDBfZGlfZGVzdHJ1Y3RvcihzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UpCit7CisJbWU4MTAwX2RpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODEwMF9kaV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlmcmVlX2lycShpbnN0YW5jZS0+aXJxLCAodm9pZCAqKWluc3RhbmNlKTsKKwltZV9zdWJkZXZpY2VfZGVpbml0KCZpbnN0YW5jZS0+YmFzZSk7CisJa2ZyZWUoaW5zdGFuY2UpOworfQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDE5KQorc3RhdGljIGlycXJldHVybl90IG1lODEwMF9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQorI2Vsc2UKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTgxMDBfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCisjZW5kaWYKK3sKKwltZTgxMDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQzMl90IGljc3I7CisKKwl1aW50MTZfdCBpcnFfc3RhdHVzOworCXVpbnQxNl90IGxpbmVfdmFsdWUgPSAwOworCisJdWludDMyX3Qgc3RhdHVzX3ZhbCA9IDA7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgxMDBfZGlfc3ViZGV2aWNlX3QgKikgZGV2X2lkOworCisJaWYgKGlycSAhPSBpbnN0YW5jZS0+aXJxKSB7CisJCVBFUlJPUigiSW5jb3JyZWN0IGludGVycnVwdCBudW06ICVkLlxuIiwgaXJxKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWljc3IgPSBpbmwoaW5zdGFuY2UtPmlycV9zdGF0dXNfcmVnKTsKKwlpZiAoaW5zdGFuY2UtPmRpX2lkeCA9PSAwKSB7CisKKwkJaWYgKChpY3NyICYKKwkJICAgICAoUExYX0lOVENTUl9MT0NBTF9JTlQxX1NUQVRFIHwgUExYX0lOVENTUl9QQ0lfSU5UX0VOIHwKKwkJICAgICAgUExYX0lOVENTUl9MT0NBTF9JTlQxX0VOKSkgIT0KKwkJICAgIChQTFhfSU5UQ1NSX0xPQ0FMX0lOVDFfU1RBVEUgfCBQTFhfSU5UQ1NSX1BDSV9JTlRfRU4gfAorCQkgICAgIFBMWF9JTlRDU1JfTE9DQUxfSU5UMV9FTikpIHsKKwkJCVBJTkZPCisJCQkgICAgKCIlbGQgU2hhcmVkIGludGVycnVwdC4gJXMoKTogaWR4PTAgcGx4OmlycV9zdGF0dXNfcmVnPTB4JTA0WFxuIiwKKwkJCSAgICAgamlmZmllcywgX19mdW5jX18sIGljc3IpOworCQkJcmV0dXJuIElSUV9OT05FOworCQl9CisJfSBlbHNlIGlmIChpbnN0YW5jZS0+ZGlfaWR4ID09IDEpIHsKKwkJaWYgKChpY3NyICYKKwkJICAgICAoUExYX0lOVENTUl9MT0NBTF9JTlQyX1NUQVRFIHwgUExYX0lOVENTUl9QQ0lfSU5UX0VOIHwKKwkJICAgICAgUExYX0lOVENTUl9MT0NBTF9JTlQyX0VOKSkgIT0KKwkJICAgIChQTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfU1RBVEUgfCBQTFhfSU5UQ1NSX1BDSV9JTlRfRU4gfAorCQkgICAgIFBMWF9JTlRDU1JfTE9DQUxfSU5UMl9FTikpIHsKKwkJCVBJTkZPCisJCQkgICAgKCIlbGQgU2hhcmVkIGludGVycnVwdC4gJXMoKTogaWR4PTEgcGx4OmlycV9zdGF0dXNfcmVnPTB4JTA0WFxuIiwKKwkJCSAgICAgamlmZmllcywgX19mdW5jX18sIGljc3IpOworCQkJcmV0dXJuIElSUV9OT05FOworCQl9CisJfSBlbHNlIHsKKwkJUEVSUk9SKCIlcygpOldyb25nIGludGVycnVwdCBpZHg9JWQgY3NyPTB4JVguXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgIGluc3RhbmNlLT5kaV9pZHgsIGljc3IpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJUERFQlVHKCJtZTgxMDBfaXNyKCk6SW50ZXJydXB0IGZyb20gaWR4PSVkIG9jY3VyZWQuXG4iLAorCSAgICAgICBpbnN0YW5jZS0+ZGlfaWR4KTsKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJaW53KGluc3RhbmNlLT5pcnFfcmVzZXRfcmVnKTsKKwlsaW5lX3ZhbHVlID0gaW53KGluc3RhbmNlLT5wb3J0X3JlZyk7CisKKwlpcnFfc3RhdHVzID0gaW5zdGFuY2UtPmxpbmVfdmFsdWUgXiBsaW5lX3ZhbHVlOworCisJLy8gTWFrZSBleHRlbmRlZCBpbmZvcm1hdGlvbi4KKwlzdGF0dXNfdmFsIHw9ICgweDAwRkYgJiAofih1aW50MTZfdCkgaW5zdGFuY2UtPmxpbmVfdmFsdWUgJiBsaW5lX3ZhbHVlKSkgPDwgMTY7CS8vUmFpc2UKKwlzdGF0dXNfdmFsIHw9ICgweDAwRkYgJiAoKHVpbnQxNl90KSBpbnN0YW5jZS0+bGluZV92YWx1ZSAmIH5saW5lX3ZhbHVlKSk7CS8vRmFsbAorCisJaW5zdGFuY2UtPmxpbmVfdmFsdWUgPSBsaW5lX3ZhbHVlOworCisJaWYgKGluc3RhbmNlLT5yaXNlZCA9PSAwKSB7CisJCWluc3RhbmNlLT5zdGF0dXNfdmFsdWUgPSBpcnFfc3RhdHVzOworCQlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlX2VkZ2VzID0gc3RhdHVzX3ZhbDsKKwl9IGVsc2UgeworCQlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlIHw9IGlycV9zdGF0dXM7CisJCWluc3RhbmNlLT5zdGF0dXNfdmFsdWVfZWRnZXMgfD0gc3RhdHVzX3ZhbDsKKwl9CisKKwlpZiAoaW5zdGFuY2UtPmZpbHRlcmluZ19mbGFnKSB7CS8vIEZvciBjb21wYXJlIG1vZGUgb25seS4KKwkJaWYgKGluc3RhbmNlLT5jb21wYXJlX3ZhbHVlID09IGluc3RhbmNlLT5saW5lX3ZhbHVlKSB7CisJCQlpbnN0YW5jZS0+cmlzZWQgPSAxOworCQkJaW5zdGFuY2UtPmlycV9jb3VudCsrOworCQl9CisJfSBlbHNlIHsKKwkJaW5zdGFuY2UtPnJpc2VkID0gMTsKKwkJaW5zdGFuY2UtPmlycV9jb3VudCsrOworCX0KKworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworbWU4MTAwX2RpX3N1YmRldmljZV90ICptZTgxMDBfZGlfY29uc3RydWN0b3IodWludDMyX3QgbWU4MTAwX3JlZ19iYXNlLAorCQkJCQkgICAgIHVpbnQzMl90IHBseF9yZWdfYmFzZSwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgZGlfaWR4LAorCQkJCQkgICAgIGludCBpcnEsCisJCQkJCSAgICAgc3BpbmxvY2tfdCAqIGN0cmxfcmVnX2xvY2spCit7CisJbWU4MTAwX2RpX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlICovCisJc3ViZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWU4MTAwX2RpX3N1YmRldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXN1YmRldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1lODEwMF9kaV9zdWJkZXZpY2VfdCkpOworCisJLyogSW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyAqLworCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9ja3MuCisJc3Bpbl9sb2NrX2luaXQoJnN1YmRldmljZS0+c3ViZGV2aWNlX2xvY2spOworCisJc3ViZGV2aWNlLT5jdHJsX3JlZ19sb2NrID0gY3RybF9yZWdfbG9jazsKKworCS8qIFNhdmUgdGhlIHN1YmRldmljZSBpbmRleC4gKi8KKwlzdWJkZXZpY2UtPmRpX2lkeCA9IGRpX2lkeDsKKworCS8qIEluaXRpYWxpemUgd2FpdCBxdWV1ZSAqLworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnN1YmRldmljZS0+d2FpdF9xdWV1ZSk7CisKKwkvKiBSZWdpc3RlciBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLiAqLworCXN1YmRldmljZS0+aXJxID0gaXJxOworCWVyciA9IHJlcXVlc3RfaXJxKHN1YmRldmljZS0+aXJxLCBtZTgxMDBfaXNyLAorI2lmZGVmIElSUUZfRElTQUJMRUQKKwkJCSAgSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVELAorI2Vsc2UKKwkJCSAgU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEsCisjZW5kaWYKKwkJCSAgTUU4MTAwX05BTUUsICh2b2lkICopc3ViZGV2aWNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJUElORk8oIlJlZ2lzdGVyZWQgaXJxPSVkLlxuIiwgc3ViZGV2aWNlLT5pcnEpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgcmVnaXN0ZXJzICovCisJc3ViZGV2aWNlLT5jdHJsX3JlZyA9CisJICAgIG1lODEwMF9yZWdfYmFzZSArIE1FODEwMF9DVFJMX1JFR19BICsgZGlfaWR4ICogTUU4MTAwX1JFR19PRkZTRVQ7CisJc3ViZGV2aWNlLT5wb3J0X3JlZyA9CisJICAgIG1lODEwMF9yZWdfYmFzZSArIE1FODEwMF9ESV9SRUdfQSArIGRpX2lkeCAqIE1FODEwMF9SRUdfT0ZGU0VUOworCXN1YmRldmljZS0+bWFza19yZWcgPQorCSAgICBtZTgxMDBfcmVnX2Jhc2UgKyBNRTgxMDBfTUFTS19SRUdfQSArIGRpX2lkeCAqIE1FODEwMF9SRUdfT0ZGU0VUOworCXN1YmRldmljZS0+cGF0dGVybl9yZWcgPQorCSAgICBtZTgxMDBfcmVnX2Jhc2UgKyBNRTgxMDBfUEFUVEVSTl9SRUdfQSArIGRpX2lkeCAqIE1FODEwMF9SRUdfT0ZGU0VUOworCXN1YmRldmljZS0+ZGluX2ludF9yZWcgPQorCSAgICBtZTgxMDBfcmVnX2Jhc2UgKyBNRTgxMDBfSU5UX0RJX1JFR19BICsgZGlfaWR4ICogTUU4MTAwX1JFR19PRkZTRVQ7CisJc3ViZGV2aWNlLT5pcnFfcmVzZXRfcmVnID0KKwkgICAgbWU4MTAwX3JlZ19iYXNlICsgTUU4MTAwX1JFU19JTlRfUkVHX0EgKyBkaV9pZHggKiBNRTgxMDBfUkVHX09GRlNFVDsKKwlzdWJkZXZpY2UtPmlycV9zdGF0dXNfcmVnID0gcGx4X3JlZ19iYXNlICsgUExYX0lOVENTUjsKKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXN1YmRldmljZS0+cmVnX2Jhc2UgPSBtZTgxMDBfcmVnX2Jhc2U7CisjZW5kaWYKKworCS8qIE92ZXJsb2FkIGJhc2UgY2xhc3MgbWV0aG9kcy4gKi8KKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX2lycV9zdGFydCA9IG1lODEwMF9kaV9pb19pcnFfc3RhcnQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19pcnFfd2FpdCA9IG1lODEwMF9kaV9pb19pcnFfd2FpdDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX2lycV9zdG9wID0gbWU4MTAwX2RpX2lvX2lycV9zdG9wOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWU4MTAwX2RpX2lvX3Jlc2V0X3N1YmRldmljZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9jb25maWcgPQorCSAgICBtZTgxMDBfZGlfaW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWU4MTAwX2RpX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWU4MTAwX2RpX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWU4MTAwX2RpX3F1ZXJ5X3N1YmRldmljZV90eXBlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHMgPQorCSAgICBtZTgxMDBfZGlfcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9kZXN0cnVjdG9yID0gbWU4MTAwX2RpX2Rlc3RydWN0b3I7CisKKwlzdWJkZXZpY2UtPnJpc2VkID0gMDsKKwlzdWJkZXZpY2UtPmlycV9jb3VudCA9IDA7CisKKwlyZXR1cm4gc3ViZGV2aWNlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kaS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZGI3OTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX2RpLmgKQEAgLTAsMCArMSw4OSBAQAorLyoqCisgKiBAZmlsZSBtZTgxMDBfZGkuaAorICoKKyAqIEBicmllZiBNRS04MTAwIGRpZ2l0YWwgaW5wdXQgc3ViZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FODEwMF9ESV9IXworI2RlZmluZSBfTUU4MTAwX0RJX0hfCisKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgdGVtcGxhdGUgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTgxMDBfZGlfc3ViZGV2aWNlIHsKKwkvLyBJbmhlcml0YW5jZQorCW1lX3N1YmRldmljZV90IGJhc2U7CQkJLyoqPCBUaGUgc3ViZGV2aWNlIGJhc2UgY2xhc3MuICovCisKKwkvKiBBdHRyaWJ1dGVzICovCisJc3BpbmxvY2tfdCBzdWJkZXZpY2VfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlIHN1YmRldmljZSBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCXNwaW5sb2NrX3QgKmN0cmxfcmVnX2xvY2s7CisKKwl1bnNpZ25lZCBkaV9pZHg7CisKKwlpbnQgaXJxOworCXZvbGF0aWxlIGludCByaXNlZDsKKwl1bnNpZ25lZCBpbnQgaXJxX2NvdW50OworCisJdWludCBzdGF0dXNfZmxhZzsJCQkJLyoqPCBEZWZhdWx0IGludGVydXB0IHN0YXR1cyBmbGFnICovCisJdWludCBzdGF0dXNfdmFsdWU7CQkJCS8qKjwgSW50ZXJ1cHQgc3RhdHVzICovCisJdWludCBzdGF0dXNfdmFsdWVfZWRnZXM7CQkvKio8IEV4dGVuZGVkIGludGVydXB0IHN0YXR1cyAqLworCXVpbnQgbGluZV92YWx1ZTsKKworCXVpbnQxNl90IGNvbXBhcmVfdmFsdWU7CisJdWludDhfdCBmaWx0ZXJpbmdfZmxhZzsKKworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfcXVldWU7CisKKwl1bnNpZ25lZCBsb25nIGN0cmxfcmVnOworCXVuc2lnbmVkIGxvbmcgcG9ydF9yZWc7CisJdW5zaWduZWQgbG9uZyBtYXNrX3JlZzsKKwl1bnNpZ25lZCBsb25nIHBhdHRlcm5fcmVnOworCXVuc2lnbmVkIGxvbmcgbG9uZyBkaW5faW50X3JlZzsKKwl1bnNpZ25lZCBsb25nIGlycV9yZXNldF9yZWc7CisJdW5zaWduZWQgbG9uZyBpcnFfc3RhdHVzX3JlZzsKKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2U7CisjZW5kaWYKKworfSBtZTgxMDBfZGlfc3ViZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBjb25zdHJ1Y3RvciB0byBnZW5lcmF0ZSBhIE1FLTgxMDAgZGlnaXRhbCBpbnB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLlxuCisgKiBOVUxMIG9uIGVycm9yLgorICovCittZTgxMDBfZGlfc3ViZGV2aWNlX3QgKm1lODEwMF9kaV9jb25zdHJ1Y3Rvcih1aW50MzJfdCBtZTgxMDBfcmVnX2Jhc2UsCisJCQkJCSAgICAgdWludDMyX3QgcGx4X3JlZ19iYXNlLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBkaV9pZHgsCisJCQkJCSAgICAgaW50IGlycSwKKwkJCQkJICAgICBzcGlubG9ja190ICogY3RybF9sZWdfbG9jayk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX2RpX3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kaV9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjNiZDE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kaV9yZWcuaApAQCAtMCwwICsxLDQ3IEBACisvKioKKyAqIEBmaWxlIG1lODEwMF9kaV9yZWcuaAorICoKKyAqIEBicmllZiBNRS04MTAwIGRpZ2l0YWwgaW5wdXQgc3ViZGV2aWNlIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FODEwMF9ESV9SRUdfSF8KKyNkZWZpbmUgX01FODEwMF9ESV9SRUdfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBNRTgxMDBfUkVTX0lOVF9SRUdfQQkJMHgwMgkvLyhyLCApCisjZGVmaW5lIE1FODEwMF9ESV9SRUdfQQkJCTB4MDQJLy8ociwgKQorI2RlZmluZSBNRTgxMDBfUEFUVEVSTl9SRUdfQQkJMHgwOAkvLyggLHcpCisjZGVmaW5lIE1FODEwMF9NQVNLX1JFR19BCQkweDBBCS8vKCAsdykKKyNkZWZpbmUgTUU4MTAwX0lOVF9ESV9SRUdfQQkJMHgwQQkvLyhyLCApCisKKyNkZWZpbmUgTUU4MTAwX1JFU19JTlRfUkVHX0IJCTB4MEUJLy8ociwgKQorI2RlZmluZSBNRTgxMDBfRElfUkVHX0IJCQkweDEwCS8vKHIsICkKKyNkZWZpbmUgTUU4MTAwX1BBVFRFUk5fUkVHX0IJCTB4MTQJLy8oICx3KQorI2RlZmluZSBNRTgxMDBfTUFTS19SRUdfQgkJMHgxNgkvLyggLHcpCisjZGVmaW5lIE1FODEwMF9JTlRfRElfUkVHX0IJCTB4MTYJLy8ociwgKQorCisjZGVmaW5lIE1FODEwMF9SRUdfT0ZGU0VUCQkweDBDCisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX2RvLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX2RvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU3YjlmOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgxMDBfZG8uYwpAQCAtMCwwICsxLDM5MSBAQAorLyoqCisgKiBAZmlsZSBtZTgxMDBfZG8uYworICoKKyAqIEBicmllZiBNRS04MTAwIGRpZ2l0YWwgb3V0cHV0IHN1YmRldmljZSBpbnN0YW5jZS4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqIEBhdXRob3IgS3J6eXN6dG9mIEdhbnR6a2UJKGsuZ2FudHprZUBtZWlsaGF1cy5kZSkKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworLyoKKyAqIEluY2x1ZGVzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lODEwMF9yZWcuaCIKKyNpbmNsdWRlICJtZTgxMDBfZG9fcmVnLmgiCisjaW5jbHVkZSAibWU4MTAwX2RvLmgiCisKKy8qCisgKiBEZWZpbmVzCisgKi8KKworLyoKKyAqIEZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbnQgbWU4MTAwX2RvX2lvX3Jlc2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCXN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGZsYWdzKQoreworCW1lODEwMF9kb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdWludDE2X3QgY3RybDsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODEwMF9kb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCWN0cmwgPSBpbncoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwljdHJsICY9IE1FODEwMF9ESU9fQ1RSTF9CSVRfSU5UQl8xIHwgTUU4MTAwX0RJT19DVFJMX0JJVF9JTlRCXzA7CisJb3V0dyhjdHJsLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCVBERUJVR19SRUcoImN0cmxfcmVnIG91dHcoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjdHJsKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJb3V0dygwLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCWluc3RhbmNlLT5wb3J0X3JlZ19taXJyb3IgPSAwOworCVBERUJVR19SRUcoInBvcnRfcmVnIG91dHcoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPnBvcnRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAwKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MTAwX2RvX2lvX3NpbmdsZV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCBzaW5nbGVfY29uZmlnLAorCQkJCSAgICAgIGludCByZWYsCisJCQkJICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICBpbnQgdHJpZ190eXBlLCBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpCit7CisJbWU4MTAwX2RvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwlpbnQgY29uZmlnOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU4MTAwX2RvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCWNvbmZpZyA9IGludyhpbnN0YW5jZS0+Y3RybF9yZWcpOworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9DT05GSUdfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX0RJT19XT1JEOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQlpZiAoc2luZ2xlX2NvbmZpZyA9PQorCQkJICAgIE1FX1NJTkdMRV9DT05GSUdfRElPX0hJR0hfSU1QRURBTkNFKSB7CisJCQkJY29uZmlnICY9IH4oTUU4MTAwX0RJT19DVFJMX0JJVF9FTkFCTEVfRElPKTsKKwkJCX0gZWxzZSBpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0RJT19TSU5LKSB7CisJCQkJY29uZmlnIHw9IE1FODEwMF9ESU9fQ1RSTF9CSVRfRU5BQkxFX0RJTzsKKwkJCQljb25maWcgJj0gfk1FODEwMF9ESU9fQ1RSTF9CSVRfU09VUkNFOworCQkJfSBlbHNlIGlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfRElPX1NPVVJDRSkgeworCQkJCWNvbmZpZyB8PQorCQkJCSAgICBNRTgxMDBfRElPX0NUUkxfQklUX0VOQUJMRV9ESU8gfAorCQkJCSAgICBNRTgxMDBfRElPX0NUUkxfQklUX1NPVVJDRTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SCisJCQkJICAgICgiSW52YWxpZCBwb3J0IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIHdvcmQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWlmICghZXJyKSB7CisJCW91dHcoY29uZmlnLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBjb25maWcpOworCX0KKworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTgxMDBfZG9faW9fc2luZ2xlX3JlYWQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IGNoYW5uZWwsCisJCQkJICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lODEwMF9kb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgxMDBfZG9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CSVQ6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDE2KSkgeworCQkJKnZhbHVlID0gaW5zdGFuY2UtPnBvcnRfcmVnX21pcnJvciAmICgweDEgPDwgY2hhbm5lbCk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCSp2YWx1ZSA9IGluc3RhbmNlLT5wb3J0X3JlZ19taXJyb3IgJiAweEZGOworCQl9IGVsc2UgaWYgKGNoYW5uZWwgPT0gMSkgeworCQkJKnZhbHVlID0gKGluc3RhbmNlLT5wb3J0X3JlZ19taXJyb3IgPj4gOCkgJiAweEZGOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fV09SRDoKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJKnZhbHVlID0gaW5zdGFuY2UtPnBvcnRfcmVnX21pcnJvcjsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCB3b3JkIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU4MTAwX2RvX2lvX3NpbmdsZV93cml0ZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgaW50IHZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTgxMDBfZG9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU4MTAwX2RvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQklUOgorCQlpZiAoKGNoYW5uZWwgPj0gMCkgJiYgKGNoYW5uZWwgPCAxNikpIHsKKwkJCWluc3RhbmNlLT5wb3J0X3JlZ19taXJyb3IgPQorCQkJICAgIHZhbHVlID8gKGluc3RhbmNlLT4KKwkJCQkgICAgIHBvcnRfcmVnX21pcnJvciB8ICgweDEgPDwgY2hhbm5lbCkpCisJCQkgICAgOiAoaW5zdGFuY2UtPnBvcnRfcmVnX21pcnJvciAmIH4oMHgxIDw8IGNoYW5uZWwpKTsKKwkJCW91dHcoaW5zdGFuY2UtPnBvcnRfcmVnX21pcnJvciwgaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJCVBERUJVR19SRUcoInBvcnRfcmVnIG91dHcoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wb3J0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+cG9ydF9yZWdfbWlycm9yKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJaW5zdGFuY2UtPnBvcnRfcmVnX21pcnJvciAmPSB+MHhGRjsKKwkJCWluc3RhbmNlLT5wb3J0X3JlZ19taXJyb3IgfD0gdmFsdWUgJiAweEZGOworCQkJb3V0dyhpbnN0YW5jZS0+cG9ydF9yZWdfbWlycm9yLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCQkJUERFQlVHX1JFRygicG9ydF9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnBvcnRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wb3J0X3JlZ19taXJyb3IpOworCQl9IGVsc2UgaWYgKGNoYW5uZWwgPT0gMSkgeworCQkJaW5zdGFuY2UtPnBvcnRfcmVnX21pcnJvciAmPSB+MHhGRjAwOworCQkJaW5zdGFuY2UtPnBvcnRfcmVnX21pcnJvciB8PSAodmFsdWUgPDwgOCkgJiAweEZGMDA7CisJCQlvdXR3KGluc3RhbmNlLT5wb3J0X3JlZ19taXJyb3IsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCQlQREVCVUdfUkVHKCJwb3J0X3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+cG9ydF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnBvcnRfcmVnX21pcnJvcik7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19XT1JEOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQlpbnN0YW5jZS0+cG9ydF9yZWdfbWlycm9yID0gdmFsdWU7CisJCQlvdXR3KHZhbHVlLCBpbnN0YW5jZS0+cG9ydF9yZWcpOworCQkJUERFQlVHX1JFRygicG9ydF9yZWcgb3V0dygweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgaW5zdGFuY2UtPnBvcnRfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIHZhbHVlKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBieXRlIG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU4MTAwX2RvX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgaW50ICpudW1iZXIpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpudW1iZXIgPSAxNjsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTgxMDBfZG9fcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSp0eXBlID0gTUVfVFlQRV9ETzsKKwkqc3VidHlwZSA9IE1FX1NVQlRZUEVfU0lOR0xFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODEwMF9kb19xdWVyeV9zdWJkZXZpY2VfY2FwcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwgaW50ICpjYXBzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqY2FwcyA9IE1FX0NBUFNfRElPX1NJTktfU09VUkNFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCittZTgxMDBfZG9fc3ViZGV2aWNlX3QgKm1lODEwMF9kb19jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgZG9faWR4LAorCQkJCQkgICAgIHNwaW5sb2NrX3QgKiBjdHJsX3JlZ19sb2NrKQoreworCW1lODEwMF9kb19zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCWludCBlcnI7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZSAqLworCXN1YmRldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lODEwMF9kb19zdWJkZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFzdWJkZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzdWJkZXZpY2UsIDAsIHNpemVvZihtZTgxMDBfZG9fc3ViZGV2aWNlX3QpKTsKKworCS8qIEluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgKi8KKwllcnIgPSBtZV9zdWJkZXZpY2VfaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBJbml0aWFsaXplIHJlZ2lzdGVycyAqLworCWlmIChkb19pZHggPT0gMCkgeworCQlzdWJkZXZpY2UtPnBvcnRfcmVnID0gcmVnX2Jhc2UgKyBNRTgxMDBfRE9fUkVHX0E7CisJCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FODEwMF9DVFJMX1JFR19BOworCX0gZWxzZSBpZiAoZG9faWR4ID09IDEpIHsKKwkJc3ViZGV2aWNlLT5wb3J0X3JlZyA9IHJlZ19iYXNlICsgTUU4MTAwX0RPX1JFR19COworCQlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTgxMDBfQ1RSTF9SRUdfQjsKKwl9IGVsc2UgeworCQlQRVJST1IoIldyb25nIHN1YmRldmljZSBpZHg9JWQuXG4iLCBkb19pZHgpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwlzdWJkZXZpY2UtPnJlZ19iYXNlID0gcmVnX2Jhc2U7CisjZW5kaWYKKworCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3ViZGV2aWNlLT5jdHJsX3JlZ19sb2NrID0gY3RybF9yZWdfbG9jazsKKworCS8qIFNhdmUgdGhlIHN1YmRldmljZSBpbmRleCAqLworCXN1YmRldmljZS0+ZG9faWR4ID0gZG9faWR4OworCisJLyogT3ZlcmxvYWQgYmFzZSBjbGFzcyBtZXRob2RzLiAqLworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWU4MTAwX2RvX2lvX3Jlc2V0X3N1YmRldmljZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9jb25maWcgPQorCSAgICBtZTgxMDBfZG9faW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWU4MTAwX2RvX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0KKwkgICAgbWU4MTAwX2RvX2lvX3NpbmdsZV93cml0ZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lODEwMF9kb19xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lODEwMF9kb19xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWU4MTAwX2RvX3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCisJcmV0dXJuIHN1YmRldmljZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgxMDBfZG8uaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgxMDBfZG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2Y4ODAxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kby5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qKgorICogQGZpbGUgbWU4MTAwX2RvLmgKKyAqCisgKiBAYnJpZWYgTUUtODEwMCBkaWdpdGFsIG91dHB1dCBzdWJkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU4MTAwX0RPX0hfCisjZGVmaW5lIF9NRTgxMDBfRE9fSF8KKworI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFRoZSB0ZW1wbGF0ZSBzdWJkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lODEwMF9kb19zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJc3BpbmxvY2tfdCAqY3RybF9yZWdfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlICNjdHJsX3JlZy4gKi8KKworCXVuc2lnbmVkIGludCBkb19pZHg7CisKKwl1aW50MTZfdCBwb3J0X3JlZ19taXJyb3I7CQkvKio8IE1pcnJvciB1c2VkIHRvIHN0b3JlIGN1cnJlbnQgcG9ydCByZWdpc3RlciBzZXR0aW5nIHdoaWNoIGlzIHdyaXRlIG9ubHkuICovCisKKwl1bnNpZ25lZCBsb25nIHBvcnRfcmVnOwkJCS8qKjwgUmVnaXN0ZXIgaG9sZGluZyB0aGUgcG9ydCBzdGF0dXMuICovCisJdW5zaWduZWQgbG9uZyBjdHJsX3JlZzsJCQkvKio8IENvbnRyb2wgcmVnaXN0ZXIuICovCisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwl1bnNpZ25lZCBsb25nIHJlZ19iYXNlOworI2VuZGlmCit9IG1lODEwMF9kb19zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgTUUtODEwMCBkaWdpdGFsIG91dHB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gZG9faWR4IFRoZSBpbmRleCBvZiB0aGUgZGlnaXRhbCBvdXRwdXQgc3ViZGV2aWNlIG9uIHRoaXMgZGV2aWNlLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWU4MTAwX2RvX3N1YmRldmljZV90ICptZTgxMDBfZG9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGRvX2lkeCwKKwkJCQkJICAgICBzcGlubG9ja190ICogY3RybF9yZWdfbG9jayk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX2RvX3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kb19yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2EyMzgwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kb19yZWcuaApAQCAtMCwwICsxLDM2IEBACisvKioKKyAqIEBmaWxlIG1lODEwMF9hb19yZWcuaAorICoKKyAqIEBicmllZiBNRS04MTAwIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FODEwMF9ET19SRUdfSF8KKyNkZWZpbmUgX01FODEwMF9ET19SRUdfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBNRTgxMDBfRE9fUkVHX0EJCQkweDA2CS8vKCAsdykKKyNkZWZpbmUgTUU4MTAwX0RPX1JFR19CCQkJMHgxMgkvLyggLHcpCisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGM0YjFjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9yZWcuaApAQCAtMCwwICsxLDQxIEBACisvKioKKyAqIEBmaWxlIG1lODEwMF9yZWcuaAorICoKKyAqIEBicmllZiBNRS04MTAwIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FODEwMF9SRUdfSF8KKyNkZWZpbmUgX01FODEwMF9SRUdfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBNRTgxMDBfQ1RSTF9SRUdfQQkJCTB4MDAJLy8oICx3KQorI2RlZmluZSBNRTgxMDBfQ1RSTF9SRUdfQgkJCTB4MEMJLy8oICx3KQorCisjZGVmaW5lIE1FODEwMF9ESU9fQ1RSTF9CSVRfU09VUkNFCQkweDEwCisjZGVmaW5lIE1FODEwMF9ESU9fQ1RSTF9CSVRfSU5UQl8xCQkweDIwCisjZGVmaW5lIE1FODEwMF9ESU9fQ1RSTF9CSVRfSU5UQl8wCQkweDQwCisjZGVmaW5lIE1FODEwMF9ESU9fQ1RSTF9CSVRfRU5BQkxFX0RJTwkJMHg4MAorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kZXZpY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZGV2aWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYxYzBjYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZGV2aWNlLmMKQEAgLTAsMCArMSwxOTQgQEAKKy8qKgorICogQGZpbGUgbWU4MjAwX2RldmljZS5jCisgKgorICogQGJyaWVmIE1FLTgyMDAgZGV2aWNlIGNsYXNzIGltcGxlbWVudGF0aW9uLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisjaWZuZGVmIE1PRFVMRQorIyAgZGVmaW5lIE1PRFVMRQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgIm1laWRzLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorI2luY2x1ZGUgIm1lY29tbW9uLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lcGx4X3JlZy5oIgorI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisjaW5jbHVkZSAibWU4MjAwX2RldmljZS5oIgorI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisjaW5jbHVkZSAibWU4MjAwX2RpLmgiCisjaW5jbHVkZSAibWU4MjAwX2RvLmgiCisjaW5jbHVkZSAibWU4MjAwX2Rpby5oIgorCittZV9kZXZpY2VfdCAqbWU4MjAwX3BjaV9jb25zdHJ1Y3RvcihzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldmljZSkKK3sKKwltZTgyMDBfZGV2aWNlX3QgKm1lODIwMF9kZXZpY2U7CisJbWVfc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwl1bnNpZ25lZCBpbnQgdmVyc2lvbl9pZHg7CisJaW50IGVycjsKKwlpbnQgaTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vIEFsbG9jYXRlIHN0cnVjdHVyZSBmb3IgZGV2aWNlIGluc3RhbmNlLgorCW1lODIwMF9kZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTgyMDBfZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghbWU4MjAwX2RldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KG1lODIwMF9kZXZpY2UsIDAsIHNpemVvZihtZTgyMDBfZGV2aWNlX3QpKTsKKworCS8vIEluaXRpYWxpemUgYmFzZSBjbGFzcyBzdHJ1Y3R1cmUuCisJZXJyID0gbWVfZGV2aWNlX3BjaV9pbml0KChtZV9kZXZpY2VfdCAqKSBtZTgyMDBfZGV2aWNlLCBwY2lfZGV2aWNlKTsKKworCWlmIChlcnIpIHsKKwkJa2ZyZWUobWU4MjAwX2RldmljZSk7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgZGV2aWNlIGJhc2UgY2xhc3MuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogR2V0IHRoZSBpbmRleCBpbiB0aGUgZGV2aWNlIHZlcnNpb24gaW5mb3JtYXRpb24gdGFibGUuICovCisJdmVyc2lvbl9pZHggPQorCSAgICBtZTgyMDBfdmVyc2lvbnNfZ2V0X2RldmljZV9pbmRleChtZTgyMDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLgorCQkJCQkgICAgIGRldmljZV9pZCk7CisKKwkvLyBJbml0aWFsaXplIHNwaW4gbG9jayAuCisJc3Bpbl9sb2NrX2luaXQoJm1lODIwMF9kZXZpY2UtPmlycV9jdHJsX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZtZTgyMDBfZGV2aWNlLT5pcnFfbW9kZV9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmbWU4MjAwX2RldmljZS0+ZGlvX2N0cmxfbG9jayk7CisKKwkvKiBTZXR1cCB0aGUgUExYIGludGVycnVwdCBjb25maWd1cmF0aW9uICovCisJb3V0bChQTFhfSU5UQ1NSX0xPQ0FMX0lOVDFfRU4gfAorCSAgICAgUExYX0lOVENTUl9MT0NBTF9JTlQxX1BPTCB8CisJICAgICBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfRU4gfAorCSAgICAgUExYX0lOVENTUl9MT0NBTF9JTlQyX1BPTCB8CisJICAgICBQTFhfSU5UQ1NSX1BDSV9JTlRfRU4sCisJICAgICBtZTgyMDBfZGV2aWNlLT5iYXNlLmluZm8ucGNpLnJlZ19iYXNlc1sxXSArIFBMWF9JTlRDU1IpOworCisJLy8gQ3JlYXRlIHN1YmRldmljZSBpbnN0YW5jZXMuCisKKwlmb3IgKGkgPSAwOyBpIDwgbWU4MjAwX3ZlcnNpb25zW3ZlcnNpb25faWR4XS5kaV9zdWJkZXZpY2VzOyBpKyspIHsKKwkJc3ViZGV2aWNlID0KKwkJICAgIChtZV9zdWJkZXZpY2VfdCAqKSBtZTgyMDBfZGlfY29uc3RydWN0b3IobWU4MjAwX2RldmljZS0+CisJCQkJCQkJICAgICBiYXNlLmluZm8ucGNpLgorCQkJCQkJCSAgICAgcmVnX2Jhc2VzWzJdLCBpLAorCQkJCQkJCSAgICAgbWU4MjAwX2RldmljZS0+CisJCQkJCQkJICAgICBiYXNlLmlycSwKKwkJCQkJCQkgICAgICZtZTgyMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGlycV9jdHJsX2xvY2ssCisJCQkJCQkJICAgICAmbWU4MjAwX2RldmljZS0+CisJCQkJCQkJICAgICBpcnFfbW9kZV9sb2NrKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWU4MjAwX2RldmljZSk7CisJCQlrZnJlZShtZTgyMDBfZGV2aWNlKTsKKwkJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIHN1YmRldmljZS5cbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZV9zbGlzdF9hZGRfc3ViZGV2aWNlX3RhaWwoJm1lODIwMF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBtZTgyMDBfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLmRvX3N1YmRldmljZXM7IGkrKykgeworCQlzdWJkZXZpY2UgPQorCQkgICAgKG1lX3N1YmRldmljZV90ICopIG1lODIwMF9kb19jb25zdHJ1Y3RvcihtZTgyMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGJhc2UuaW5mby5wY2kuCisJCQkJCQkJICAgICByZWdfYmFzZXNbMl0sIGksCisJCQkJCQkJICAgICBtZTgyMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgIGJhc2UuaXJxLAorCQkJCQkJCSAgICAgJm1lODIwMF9kZXZpY2UtPgorCQkJCQkJCSAgICAgaXJxX21vZGVfbG9jayk7CisKKwkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lODIwMF9kZXZpY2UpOworCQkJa2ZyZWUobWU4MjAwX2RldmljZSk7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTgyMDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkgICAgc3ViZGV2aWNlKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbWU4MjAwX3ZlcnNpb25zW3ZlcnNpb25faWR4XS5kaW9fc3ViZGV2aWNlczsgaSsrKSB7CisJCXN1YmRldmljZSA9CisJCSAgICAobWVfc3ViZGV2aWNlX3QgKikgbWU4MjAwX2Rpb19jb25zdHJ1Y3RvcihtZTgyMDBfZGV2aWNlLT4KKwkJCQkJCQkgICAgICBiYXNlLmluZm8ucGNpLgorCQkJCQkJCSAgICAgIHJlZ19iYXNlc1syXSwgaSwKKwkJCQkJCQkgICAgICAmbWU4MjAwX2RldmljZS0+CisJCQkJCQkJICAgICAgZGlvX2N0cmxfbG9jayk7CisKKwkJaWYgKCFzdWJkZXZpY2UpIHsKKwkJCW1lX2RldmljZV9kZWluaXQoKG1lX2RldmljZV90ICopIG1lODIwMF9kZXZpY2UpOworCQkJa2ZyZWUobWU4MjAwX2RldmljZSk7CisJCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UuXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKCZtZTgyMDBfZGV2aWNlLT5iYXNlLnNsaXN0LAorCQkJCQkgICAgc3ViZGV2aWNlKTsKKwl9CisKKwlyZXR1cm4gKG1lX2RldmljZV90ICopIG1lODIwMF9kZXZpY2U7Cit9CisKKy8vIEluaXQgYW5kIGV4aXQgb2YgbW9kdWxlLgorCitzdGF0aWMgaW50IF9faW5pdCBtZTgyMDBfaW5pdCh2b2lkKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4uIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtZTgyMDBfZXhpdCh2b2lkKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4uIik7Cit9CisKK21vZHVsZV9pbml0KG1lODIwMF9pbml0KTsKKworbW9kdWxlX2V4aXQobWU4MjAwX2V4aXQpOworCisvLyBBZG1pbmlzdHJhdGl2ZSBzdHVmZiBmb3IgbW9kaW5mby4KK01PRFVMRV9BVVRIT1IoIkd1ZW50ZXIgR2ViaGFyZHQgPGcuZ2ViaGFyZHRAbWVpbGhhdXMuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRldmljZSBEcml2ZXIgTW9kdWxlIGZvciBUZW1wbGF0ZSBEZXZpY2UiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJNZWlsaGF1cyBUZW1wbGF0ZSBEZXZpY2VzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8vIEV4cG9ydCB0aGUgY29uc3RydWN0b3IuCitFWFBPUlRfU1lNQk9MKG1lODIwMF9wY2lfY29uc3RydWN0b3IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kZXZpY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JkMmEwMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZGV2aWNlLmgKQEAgLTAsMCArMSw5NyBAQAorLyoqCisgKiBAZmlsZSBtZTgyMDBfZGV2aWNlLmgKKyAqCisgKiBAYnJpZWYgTUUtODIwMCBkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU4MjAwX0RFVklDRV9ICisjZGVmaW5lIF9NRTgyMDBfREVWSUNFX0gKKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlICJtZWRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBTdHJ1Y3R1cmUgaG9sZGluZyBNRS04MjAwIGRldmljZSBjYXBhYmlsaXRpZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lODIwMF92ZXJzaW9uIHsKKwl1aW50MTZfdCBkZXZpY2VfaWQ7CisJdW5zaWduZWQgaW50IGRpX3N1YmRldmljZXM7CisJdW5zaWduZWQgaW50IGRvX3N1YmRldmljZXM7CisJdW5zaWduZWQgaW50IGRpb19zdWJkZXZpY2VzOworfSBtZTgyMDBfdmVyc2lvbl90OworCisvKioKKyAqIEBicmllZiBEZXZpY2UgY2FwYWJpbGl0aWVzLgorICovCitzdGF0aWMgbWU4MjAwX3ZlcnNpb25fdCBtZTgyMDBfdmVyc2lvbnNbXSA9IHsKKwl7UENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTgyMDBfQSwgMSwgMSwgMn0sCisJe1BDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU4MjAwX0IsIDIsIDIsIDJ9LAorCXswfSwKK307CisKKyNkZWZpbmUgTUU4MjAwX0RFVklDRV9WRVJTSU9OUyAoc2l6ZW9mKG1lODIwMF92ZXJzaW9ucykgLyBzaXplb2YobWU4MjAwX3ZlcnNpb25fdCkgLSAxKQkvKio8IFJldHVybnMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluICNtZTgyMDBfdmVyc2lvbnMuICovCisKKy8qKgorICogQGJyaWVmIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBkZXZpY2UgZW50cnkgaW4gI21lODIwMF92ZXJzaW9ucy4KKyAqCisgKiBAcGFyYW0gZGV2aWNlX2lkIFRoZSBQQ0kgZGV2aWNlIGlkIG9mIHRoZSBkZXZpY2UgdG8gcXVlcnkuCisgKiBAcmV0dXJuIFRoZSBpbmRleCBvZiB0aGUgZGV2aWNlIGluICNtZTgyMDBfdmVyc2lvbnMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG1lODIwMF92ZXJzaW9uc19nZXRfZGV2aWNlX2luZGV4KHVpbnQxNl90IGRldmljZV9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgTUU4MjAwX0RFVklDRV9WRVJTSU9OUzsgaSsrKQorCQlpZiAobWU4MjAwX3ZlcnNpb25zW2ldLmRldmljZV9pZCA9PSBkZXZpY2VfaWQpCisJCQlicmVhazsKKwlyZXR1cm4gaTsKK30KKworLyoqCisgKiBAYnJpZWYgVGhlIE1FLTgyMDAgZGV2aWNlIGNsYXNzIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWU4MjAwX2RldmljZSB7CisJbWVfZGV2aWNlX3QgYmFzZTsJCS8qKjwgVGhlIE1laWxoYXVzIGRldmljZSBiYXNlIGNsYXNzLiAqLworCisJLyogQ2hpbGQgY2xhc3MgYXR0cmlidXRlcy4gKi8KKwlzcGlubG9ja190IGlycV9jdHJsX2xvY2s7CS8qKjwgTG9jayBmb3IgdGhlIGludGVycnVwdCBjb250cm9sIHJlZ2lzdGVyLiAqLworCXNwaW5sb2NrX3QgaXJxX21vZGVfbG9jazsJLyoqPCBMb2NrIGZvciB0aGUgaW50ZXJydXB0IG1vZGUgcmVnaXN0ZXIuICovCisJc3BpbmxvY2tfdCBkaW9fY3RybF9sb2NrOwkvKio8IExvY2sgZm9yIHRoZSBkaWdpdGFsIGkvbyBjb250cm9sIHJlZ2lzdGVyLiAqLworfSBtZTgyMDBfZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBNRS04MjAwIGRldmljZSBjbGFzcyBjb25zdHJ1Y3Rvci4KKyAqCisgKiBAcGFyYW0gcGNpX2RldmljZSBUaGUgcGNpIGRldmljZSBzdHJ1Y3R1cmUgZ2l2ZW4gYnkgdGhlIFBDSSBzdWJzeXN0ZW0uCisgKgorICogQHJldHVybiBPbiBzdWNjZXMgYSBuZXcgTUUtODIwMCBkZXZpY2UgaW5zdGFuY2UuIFxuCisgKiAgICAgICAgIE5VTEwgb24gZXJyb3IuCisgKi8KK21lX2RldmljZV90ICptZTgyMDBfcGNpX2NvbnN0cnVjdG9yKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlKQorICAgIF9fYXR0cmlidXRlX18gKCh3ZWFrKSk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2RpLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2RpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc1MjViYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZGkuYwpAQCAtMCwwICsxLDg1NyBAQAorLyoqCisgKiBAZmlsZSBtZTgyMDBfZGkuYworICoKKyAqIEBicmllZiBNRS04MjAwIGRpZ2l0YWwgaW5wdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvLy9JbmNsdWRlcworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisKKyNpbmNsdWRlICJtZWlkcy5oIgorI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZTgyMDBfcmVnLmgiCisjaW5jbHVkZSAibWU4MjAwX2RpX3JlZy5oIgorI2luY2x1ZGUgIm1lODIwMF9kaS5oIgorCisvLy8gRGVmaW5lcworc3RhdGljIHZvaWQgbWU4MjAwX2RpX2Rlc3RydWN0b3Ioc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlKTsKK3N0YXRpYyBpbnQgbWU4MjAwX2RpX2lvX2lycV9zdGFydChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgIGludCBjaGFubmVsLAorCQkJCSAgaW50IGlycV9zb3VyY2UsCisJCQkJICBpbnQgaXJxX2VkZ2UsIGludCBpcnFfYXJnLCBpbnQgZmxhZ3MpOworc3RhdGljIGludCBtZTgyMDBfZGlfaW9faXJxX3dhaXQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgaW50IGNoYW5uZWwsCisJCQkJIGludCAqaXJxX2NvdW50LAorCQkJCSBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncyk7CitzdGF0aWMgaW50IG1lODIwMF9kaV9pb19pcnFfc3RvcChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgY2hhbm5lbCwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbnQgbWU4MjAwX2RpX2lvX3NpbmdsZV9jb25maWcobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCBzaW5nbGVfY29uZmlnLAorCQkJCSAgICAgIGludCByZWYsCisJCQkJICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkgICAgICBpbnQgdHJpZ190eXBlLCBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpOworc3RhdGljIGludCBtZTgyMDBfZGlfaW9fc2luZ2xlX3JlYWQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IGNoYW5uZWwsCisJCQkJICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbnQgbWU4MjAwX2RpX2lvX3Jlc2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCXN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbnQgbWU4MjAwX2RpX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgaW50ICpudW1iZXIpOworc3RhdGljIGludCBtZTgyMDBfZGlfcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpOworc3RhdGljIGludCBtZTgyMDBfZGlfcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgaW50ICpjYXBzKTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiwgNiwgMTkpCitzdGF0aWMgaXJxcmV0dXJuX3QgbWU4MjAwX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpOworI2Vsc2UKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTgyMDBfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworI2VuZGlmCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDE5KQorc3RhdGljIGlycXJldHVybl90IG1lODIwMF9pc3JfRVgoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKKyNlbHNlCitzdGF0aWMgaXJxcmV0dXJuX3QgbWU4MjAwX2lzcl9FWChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgbWU4MjAwX2RpX2NoZWNrX3ZlcnNpb24obWU4MjAwX2RpX3N1YmRldmljZV90ICogaW5zdGFuY2UsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkcik7CisKKy8vL0Z1bmN0aW9ucworc3RhdGljIGludCBtZTgyMDBfZGlfaW9faXJxX3N0YXJ0KG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgaW50IGNoYW5uZWwsCisJCQkJICBpbnQgaXJxX3NvdXJjZSwKKwkJCQkgIGludCBpcnFfZWRnZSwgaW50IGlycV9hcmcsIGludCBmbGFncykKK3sKKwltZTgyMDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXZvbGF0aWxlIHVpbnQ4X3QgdG1wOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU4MjAwX2RpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChpcnFfc291cmNlID09IE1FX0lSUV9TT1VSQ0VfRElPX1BBVFRFUk4pIHsKKwkJaWYgKGZsYWdzICYKKwkJICAgIH4oTUVfSU9fSVJRX1NUQVJUX1BBVFRFUk5fRklMVEVSSU5HIHwKKwkJICAgICAgTUVfSU9fSVJRX1NUQVJUX0RJT19CWVRFKSkgeworCQkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwkJfQorCisJCWlmIChpcnFfZWRnZSAhPSBNRV9JUlFfRURHRV9OT1RfVVNFRCkgeworCQkJUEVSUk9SKCJJbnZhbGlkIGlycSBlZGdlIHNwZWNpZmllZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfSVJRX0VER0U7CisJCX0KKwl9IGVsc2UgaWYgKGlycV9zb3VyY2UgPT0gTUVfSVJRX1NPVVJDRV9ESU9fTUFTSykgeworCQlpZiAoZmxhZ3MgJgorCQkgICAgfihNRV9JT19JUlFfU1RBUlRfRVhURU5ERURfU1RBVFVTIHwKKwkJICAgICAgTUVfSU9fSVJRX1NUQVJUX0RJT19CWVRFKSkgeworCQkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwkJfQorCisJCWlmICgoaXJxX2VkZ2UgIT0gTUVfSVJRX0VER0VfUklTSU5HKQorCQkgICAgJiYgKGlycV9lZGdlICE9IE1FX0lSUV9FREdFX0ZBTExJTkcpCisJCSAgICAmJiAoaXJxX2VkZ2UgIT0gTUVfSVJRX0VER0VfQU5ZKSkgeworCQkJUEVSUk9SKCJJbnZhbGlkIGlycSBlZGdlIHNwZWNpZmllZC5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfSVJRX0VER0U7CisJCX0KKworCQlpZiAoIShpcnFfYXJnICYgMHhGRikpIHsKKwkJCVBFUlJPUigiTm8gbWFzayBzcGVjaWZpZWQuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0lSUV9BUkc7CisJCX0KKwl9IGVsc2UgeworCQlQRVJST1IoIkludmFsaWQgaXJxIHNvdXJjZSBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfSVJRX1NPVVJDRTsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBzdGF0dXMpOworCWlmIChpcnFfc291cmNlID09IE1FX0lSUV9TT1VSQ0VfRElPX1BBVFRFUk4pIHsKKwkJb3V0YihpcnFfYXJnLCBpbnN0YW5jZS0+Y29tcGFyZV9yZWcpOworCQlQREVCVUdfUkVHKCJjb21wYXJlX3JlZyBvdXRiKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmNvbXBhcmVfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBpcnFfYXJnKTsKKwkJb3V0YigweEZGLCBpbnN0YW5jZS0+bWFza19yZWcpOworCQlQREVCVUdfUkVHKCJtYXNrX3JlZyBvdXRiKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPm1hc2tfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCAweGZmKTsKKwkJaW5zdGFuY2UtPmNvbXBhcmVfdmFsdWUgPSBpcnFfYXJnOworCQlpbnN0YW5jZS0+ZmlsdGVyaW5nX2ZsYWcgPQorCQkgICAgKGZsYWdzICYgTUVfSU9fSVJRX1NUQVJUX1BBVFRFUk5fRklMVEVSSU5HKSA/IDEgOiAwOworCX0KKwlpZiAoaXJxX3NvdXJjZSA9PSBNRV9JUlFfU09VUkNFX0RJT19NQVNLKSB7CisJCW91dGIoaXJxX2FyZywgaW5zdGFuY2UtPm1hc2tfcmVnKTsKKwkJUERFQlVHX1JFRygibWFza19yZWcgb3V0YigweCVsWCsweCVsWCk9MHgleFxuIiwKKwkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCSAgIGluc3RhbmNlLT5tYXNrX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgaXJxX2FyZyk7CisJCWluc3RhbmNlLT5maWx0ZXJpbmdfZmxhZyA9IDA7CisJfQorCisJc3Bpbl9sb2NrKGluc3RhbmNlLT5pcnFfbW9kZV9sb2NrKTsKKwl0bXAgPSBpbmIoaW5zdGFuY2UtPmlycV9tb2RlX3JlZyk7CisJdG1wICY9CisJICAgIH4oTUU4MjAwX0lSUV9NT0RFX01BU0sgPDwKKwkgICAgICAoTUU4MjAwX0lSUV9NT0RFX0RJX1NISUZUICogaW5zdGFuY2UtPmRpX2lkeCkpOworCWlmIChpcnFfc291cmNlID09IE1FX0lSUV9TT1VSQ0VfRElPX1BBVFRFUk4pIHsKKwkJdG1wIHw9CisJCSAgICBNRTgyMDBfSVJRX01PREVfTUFTS19DT01QQVJFIDw8IChNRTgyMDBfSVJRX01PREVfRElfU0hJRlQgKgorCQkJCQkJICAgICBpbnN0YW5jZS0+ZGlfaWR4KTsKKwl9CisKKwlpZiAoaXJxX3NvdXJjZSA9PSBNRV9JUlFfU09VUkNFX0RJT19NQVNLKSB7CisJCXRtcCB8PQorCQkgICAgTUU4MjAwX0lSUV9NT0RFX01BU0tfTUFTSyA8PCAoTUU4MjAwX0lSUV9NT0RFX0RJX1NISUZUICoKKwkJCQkJCSAgaW5zdGFuY2UtPmRpX2lkeCk7CisJfQorCW91dGIodG1wLCBpbnN0YW5jZS0+aXJxX21vZGVfcmVnKTsKKwlQREVCVUdfUkVHKCJpcnFfbW9kZV9yZWcgb3V0YigweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+aXJxX21vZGVfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5pcnFfbW9kZV9sb2NrKTsKKworCXNwaW5fbG9jayhpbnN0YW5jZS0+aXJxX2N0cmxfbG9jayk7CisJdG1wID0gaW5iKGluc3RhbmNlLT5pcnFfY3RybF9yZWcpOworCXRtcCB8PQorCSAgICAoTUU4MjAwX0RJX0lSUV9DVFJMX0JJVF9DTEVBUiA8PAorCSAgICAgKE1FODIwMF9ESV9JUlFfQ1RSTF9TSElGVCAqIGluc3RhbmNlLT5kaV9pZHgpKTsKKwl0bXAgfD0KKwkgICAgTUU4MjAwX0RJX0lSUV9DVFJMX0JJVF9FTkFCTEUgPDwgKE1FODIwMF9ESV9JUlFfQ1RSTF9TSElGVCAqCisJCQkJCSAgICAgIGluc3RhbmNlLT5kaV9pZHgpOworCisJaWYgKGlycV9zb3VyY2UgPT0gTUVfSVJRX1NPVVJDRV9ESU9fTUFTSykgeworCQl0bXAgJj0KKwkJICAgIH4oTUU4MjAwX0RJX0lSUV9DVFJMX01BU0tfRURHRSA8PAorCQkgICAgICAoTUU4MjAwX0RJX0lSUV9DVFJMX1NISUZUICogaW5zdGFuY2UtPmRpX2lkeCkpOworCQlpZiAoaXJxX2VkZ2UgPT0gTUVfSVJRX0VER0VfUklTSU5HKSB7CisJCQl0bXAgfD0KKwkJCSAgICBNRTgyMDBfRElfSVJRX0NUUkxfTUFTS19FREdFX1JJU0lORyA8PAorCQkJICAgIChNRTgyMDBfRElfSVJRX0NUUkxfU0hJRlQgKiBpbnN0YW5jZS0+ZGlfaWR4KTsKKwkJfSBlbHNlIGlmIChpcnFfZWRnZSA9PSBNRV9JUlFfRURHRV9GQUxMSU5HKSB7CisJCQl0bXAgfD0KKwkJCSAgICBNRTgyMDBfRElfSVJRX0NUUkxfTUFTS19FREdFX0ZBTExJTkcgPDwKKwkJCSAgICAoTUU4MjAwX0RJX0lSUV9DVFJMX1NISUZUICogaW5zdGFuY2UtPmRpX2lkeCk7CisJCX0gZWxzZSBpZiAoaXJxX2VkZ2UgPT0gTUVfSVJRX0VER0VfQU5ZKSB7CisJCQl0bXAgfD0KKwkJCSAgICBNRTgyMDBfRElfSVJRX0NUUkxfTUFTS19FREdFX0FOWSA8PAorCQkJICAgIChNRTgyMDBfRElfSVJRX0NUUkxfU0hJRlQgKiBpbnN0YW5jZS0+ZGlfaWR4KTsKKwkJfQorCX0KKwlvdXRiKHRtcCwgaW5zdGFuY2UtPmlycV9jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiaXJxX2N0cmxfcmVnIG91dGIoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmlycV9jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKwl0bXAgJj0KKwkgICAgfihNRTgyMDBfRElfSVJRX0NUUkxfQklUX0NMRUFSIDw8CisJICAgICAgKE1FODIwMF9ESV9JUlFfQ1RSTF9TSElGVCAqIGluc3RhbmNlLT5kaV9pZHgpKTsKKwlvdXRiKHRtcCwgaW5zdGFuY2UtPmlycV9jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiaXJxX2N0cmxfcmVnIG91dGIoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmlycV9jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKworCWluc3RhbmNlLT5saW5lX3ZhbHVlID0gaW5iKGluc3RhbmNlLT5wb3J0X3JlZyk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmlycV9jdHJsX2xvY2spOworCisJaW5zdGFuY2UtPnJpc2VkID0gMDsKKwlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlID0gMDsKKwlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlX2VkZ2VzID0gMDsKKwlpbnN0YW5jZS0+c3RhdHVzX2ZsYWcgPSBmbGFncyAmIE1FX0lPX0lSUV9TVEFSVF9FWFRFTkRFRF9TVEFUVVM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBzdGF0dXMpOworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTgyMDBfZGlfaW9faXJxX3dhaXQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgaW50IGNoYW5uZWwsCisJCQkJIGludCAqaXJxX2NvdW50LAorCQkJCSBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTgyMDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCWxvbmcgdCA9IDA7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisJaW50IGNvdW50OworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCVBERVZFTE9QKCJQSUQ6ICVkLlxuIiwgY3VycmVudC0+cGlkKTsKKworCWluc3RhbmNlID0gKG1lODIwMF9kaV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MgJgorCSAgICB+KE1FX0lPX0lSUV9XQUlUX05PUk1BTF9TVEFUVVMgfCBNRV9JT19JUlFfV0FJVF9FWFRFTkRFRF9TVEFUVVMpKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAodGltZV9vdXQgPCAwKSB7CisJCVBFUlJPUigiSW52YWxpZCB0aW1lX291dCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVElNRU9VVDsKKwl9CisKKwlpZiAodGltZV9vdXQpIHsKKwkJdCA9ICh0aW1lX291dCAqIEhaKSAvIDEwMDA7CisKKwkJaWYgKHQgPT0gMCkKKwkJCXQgPSAxOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCWlmIChpbnN0YW5jZS0+cmlzZWQgPD0gMCkgeworCQlpbnN0YW5jZS0+cmlzZWQgPSAwOworCQljb3VudCA9IGluc3RhbmNlLT5jb3VudDsKKworCQlpZiAodGltZV9vdXQpIHsKKwkJCXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChpbnN0YW5jZS0+CisJCQkJCQkJICAgICB3YWl0X3F1ZXVlLAorCQkJCQkJCSAgICAgKChjb3VudCAhPQorCQkJCQkJCSAgICAgICBpbnN0YW5jZS0+Y291bnQpCisJCQkJCQkJICAgICAgfHwgKGluc3RhbmNlLT4KKwkJCQkJCQkJICByaXNlZCA8IDApKSwKKwkJCQkJCQkgICAgIHQpOworLy8gICAgICAgICAgICAgICAgICAgICAgdCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT53YWl0X3F1ZXVlLCAoaW5zdGFuY2UtPnJpc2VkICE9IDApLCB0KTsKKwkJCWlmICh0ID09IDApIHsKKwkJCQlQRVJST1IoIldhaXQgb24gaW50ZXJydXB0IHRpbWVkIG91dC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1RJTUVPVVQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoaW5zdGFuY2UtPndhaXRfcXVldWUsCisJCQkJCQkgKChjb3VudCAhPSBpbnN0YW5jZS0+Y291bnQpCisJCQkJCQkgIHx8IChpbnN0YW5jZS0+cmlzZWQgPCAwKSkpOworLy8gICAgICAgICAgICAgICAgICAgICAgd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGluc3RhbmNlLT53YWl0X3F1ZXVlLCAoaW5zdGFuY2UtPnJpc2VkICE9IDApKTsKKwkJfQorCisJCWlmIChpbnN0YW5jZS0+cmlzZWQgPCAwKSB7CisJCQlQRVJST1IoIldhaXQgb24gaW50ZXJydXB0IGFib3J0ZWQgYnkgdXNlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQl9CisJfQorCisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCVBFUlJPUigiV2FpdCBvbiBpbnRlcnJ1cHQgYWJvcnRlZCBieSBzaWduYWwuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJKmlycV9jb3VudCA9IGluc3RhbmNlLT5jb3VudDsKKwlpZiAoIWVycikgeworCQlpZiAoZmxhZ3MgJiBNRV9JT19JUlFfV0FJVF9OT1JNQUxfU1RBVFVTKSB7CisJCQkqdmFsdWUgPSBpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlOworCQl9IGVsc2UgaWYgKGZsYWdzICYgTUVfSU9fSVJRX1dBSVRfRVhURU5ERURfU1RBVFVTKSB7CisJCQkqdmFsdWUgPSBpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlX2VkZ2VzOworCQl9IGVsc2UgewkvLyBVc2UgZGVmYXVsdAorCQkJaWYgKCFpbnN0YW5jZS0+c3RhdHVzX2ZsYWcpIHsKKwkJCQkqdmFsdWUgPSBpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlOworCQkJfSBlbHNlIHsKKwkJCQkqdmFsdWUgPSBpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlX2VkZ2VzOworCQkJfQorCQl9CisJCWluc3RhbmNlLT5yaXNlZCA9IDA7CisvKgorCQkJaW5zdGFuY2UtPnN0YXR1c192YWx1ZSA9IDA7CisJCQlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlX2VkZ2VzID0gMDsKKyovCisJfSBlbHNlIHsKKwkJKnZhbHVlID0gMDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lODIwMF9kaV9pb19pcnFfc3RvcChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgY2hhbm5lbCwgaW50IGZsYWdzKQoreworCW1lODIwMF9kaV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdWludDhfdCB0bXA7CisJdW5zaWduZWQgbG9uZyBzdGF0dXM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgyMDBfZGlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVIgc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgc3RhdHVzKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmlycV9jdHJsX2xvY2spOworCXRtcCA9IGluYihpbnN0YW5jZS0+aXJxX2N0cmxfcmVnKTsKKwl0bXAgfD0KKwkgICAgKE1FODIwMF9ESV9JUlFfQ1RSTF9CSVRfRU5BQkxFIDw8CisJICAgICAoTUU4MjAwX0RJX0lSUV9DVFJMX1NISUZUICogaW5zdGFuY2UtPmRpX2lkeCkpOworCW91dGIodG1wLCBpbnN0YW5jZS0+aXJxX2N0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJpcnFfY3RybF9yZWcgb3V0YigweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+aXJxX2N0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCXRtcCAmPQorCSAgICB+KE1FODIwMF9ESV9JUlFfQ1RSTF9CSVRfRU5BQkxFIDw8CisJICAgICAgKE1FODIwMF9ESV9JUlFfQ1RSTF9TSElGVCAqIGluc3RhbmNlLT5kaV9pZHgpKTsKKwl0bXAgfD0KKwkgICAgKE1FODIwMF9ESV9JUlFfQ1RSTF9CSVRfQ0xFQVIgPDwKKwkgICAgIChNRTgyMDBfRElfSVJRX0NUUkxfU0hJRlQgKiBpbnN0YW5jZS0+ZGlfaWR4KSk7CisvLyAgICAgICAgICAgICAgICAgICAgICB0bXAgJj0gfihNRTgyMDBfRElfSVJRX0NUUkxfQklUX0NMRUFSIDw8IChNRTgyMDBfRElfSVJRX0NUUkxfU0hJRlQgKiBpbnN0YW5jZS0+ZGlfaWR4KSk7CisJb3V0Yih0bXAsIGluc3RhbmNlLT5pcnFfY3RybF9yZWcpOworCVBERUJVR19SRUcoImlycV9jdHJsX3JlZyBvdXRiKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5pcnFfY3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIHRtcCk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmlycV9jdHJsX2xvY2spOworCisJaW5zdGFuY2UtPnJpc2VkID0gLTE7CisJaW5zdGFuY2UtPnN0YXR1c192YWx1ZSA9IDA7CisJaW5zdGFuY2UtPnN0YXR1c192YWx1ZV9lZGdlcyA9IDA7CisJaW5zdGFuY2UtPmZpbHRlcmluZ19mbGFnID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIHN0YXR1cyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTgyMDBfZGlfaW9fc2luZ2xlX2NvbmZpZyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgaW50IHNpbmdsZV9jb25maWcsCisJCQkJICAgICAgaW50IHJlZiwKKwkJCQkgICAgICBpbnQgdHJpZ19jaGFuLAorCQkJCSAgICAgIGludCB0cmlnX3R5cGUsIGludCB0cmlnX2VkZ2UsIGludCBmbGFncykKK3sKKwltZTgyMDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU4MjAwX2RpX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIHN0YXR1cyk7CisKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fSU5QVVQpIHsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHBvcnQgZGlyZWN0aW9uIHNwZWNpZmllZC5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBjaGFubmVsIG51bWJlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgc3RhdHVzKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTgyMDBfZGlfaW9fc2luZ2xlX3JlYWQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IGNoYW5uZWwsCisJCQkJICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lODIwMF9kaV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdW5zaWduZWQgbG9uZyBzdGF0dXM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgyMDBfZGlfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgc3RhdHVzKTsKKworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CSVQ6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDgpKSB7CisJCQkqdmFsdWUgPSBpbmIoaW5zdGFuY2UtPnBvcnRfcmVnKSAmICgweDEgPDwgY2hhbm5lbCk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCSp2YWx1ZSA9IGluYihpbnN0YW5jZS0+cG9ydF9yZWcpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZmxhZ3Mgc3BlY2lmaWVkLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBzdGF0dXMpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lODIwMF9kaV9pb19yZXNldF9zdWJkZXZpY2Uoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTgyMDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlID0gKG1lODIwMF9kaV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWluc3RhbmNlLT5jb3VudCA9IDA7CisJcmV0dXJuIG1lODIwMF9kaV9pb19pcnFfc3RvcChzdWJkZXZpY2UsIGZpbGVwLCAwLCAwKTsKK30KKworc3RhdGljIGludCBtZTgyMDBfZGlfcXVlcnlfbnVtYmVyX2NoYW5uZWxzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm51bWJlciA9IDg7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjAwX2RpX3F1ZXJ5X3N1YmRldmljZV90eXBlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqdHlwZSA9IE1FX1RZUEVfREk7CisJKnN1YnR5cGUgPSBNRV9TVUJUWVBFX1NJTkdMRTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTgyMDBfZGlfcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPQorCSAgICBNRV9DQVBTX0RJT19CSVRfUEFUVEVSTl9JUlEgfAorCSAgICBNRV9DQVBTX0RJT19CSVRfTUFTS19JUlFfRURHRV9SSVNJTkcgfAorCSAgICBNRV9DQVBTX0RJT19CSVRfTUFTS19JUlFfRURHRV9GQUxMSU5HIHwKKwkgICAgTUVfQ0FQU19ESU9fQklUX01BU0tfSVJRX0VER0VfQU5ZOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDE5KQorc3RhdGljIGlycXJldHVybl90IG1lODIwMF9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQorI2Vsc2UKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTgyMDBfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCisjZW5kaWYKK3sKKwltZTgyMDBfZGlfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQ4X3QgY3RybDsKKwl1aW50OF90IGlycV9zdGF0dXM7CisJdWludDhfdCBsaW5lX3ZhbHVlID0gMDsKKwl1aW50OF90IGxpbmVfc3RhdHVzID0gMDsKKwl1aW50MzJfdCBzdGF0dXNfdmFsID0gMDsKKworCWluc3RhbmNlID0gKG1lODIwMF9kaV9zdWJkZXZpY2VfdCAqKSBkZXZfaWQ7CisKKwlpZiAoaXJxICE9IGluc3RhbmNlLT5pcnEpIHsKKwkJUEVSUk9SKCJJbmNvcnJlY3QgaW50ZXJydXB0IG51bTogJWQuXG4iLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJaXJxX3N0YXR1cyA9IGluYihpbnN0YW5jZS0+aXJxX3N0YXR1c19yZWcpOworCWlmICghaXJxX3N0YXR1cykgeworCQlQSU5GTworCQkgICAgKCIlbGQgU2hhcmVkIGludGVycnVwdC4gJXMoKTogaWR4PSVkIGlycV9zdGF0dXNfcmVnPTB4JTA0WFxuIiwKKwkJICAgICBqaWZmaWVzLCBfX2Z1bmNfXywgaW5zdGFuY2UtPmRpX2lkeCwgaXJxX3N0YXR1cyk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5pcnFfY3RybF9sb2NrKTsKKwljdHJsID0gaW5iKGluc3RhbmNlLT5pcnFfY3RybF9yZWcpOworCWN0cmwgfD0KKwkgICAgTUU4MjAwX0RJX0lSUV9DVFJMX0JJVF9DTEVBUiA8PCAoTUU4MjAwX0RJX0lSUV9DVFJMX1NISUZUICoKKwkJCQkJICAgICBpbnN0YW5jZS0+ZGlfaWR4KTsKKwlvdXRiKGN0cmwsIGluc3RhbmNlLT5pcnFfY3RybF9yZWcpOworCVBERUJVR19SRUcoImlycV9jdHJsX3JlZyBvdXRiKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5pcnFfY3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCWN0cmwgJj0KKwkgICAgfihNRTgyMDBfRElfSVJRX0NUUkxfQklUX0NMRUFSIDw8CisJICAgICAgKE1FODIwMF9ESV9JUlFfQ1RSTF9TSElGVCAqIGluc3RhbmNlLT5kaV9pZHgpKTsKKwlvdXRiKGN0cmwsIGluc3RhbmNlLT5pcnFfY3RybF9yZWcpOworCVBERUJVR19SRUcoImlycV9jdHJsX3JlZyBvdXRiKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5pcnFfY3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCisJbGluZV92YWx1ZSA9IGluYihpbnN0YW5jZS0+cG9ydF9yZWcpOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5pcnFfY3RybF9sb2NrKTsKKworCWxpbmVfc3RhdHVzID0gKCh1aW50OF90KSBpbnN0YW5jZS0+bGluZV92YWx1ZSBeIGxpbmVfdmFsdWUpOworCisJLy8gTWFrZSBleHRlbmRlZCBpbmZvcm1hdGlvbi4KKwlzdGF0dXNfdmFsIHw9ICgweDAwRkYgJiAofih1aW50OF90KSBpbnN0YW5jZS0+bGluZV92YWx1ZSAmIGxpbmVfdmFsdWUpKSA8PCAxNjsJLy9SYWlzZQorCXN0YXR1c192YWwgfD0gKDB4MDBGRiAmICgodWludDhfdCkgaW5zdGFuY2UtPmxpbmVfdmFsdWUgJiB+bGluZV92YWx1ZSkpOwkvL0ZhbGwKKworCWluc3RhbmNlLT5saW5lX3ZhbHVlID0gKGludClsaW5lX3ZhbHVlOworCisJaWYgKGluc3RhbmNlLT5yaXNlZCA9PSAwKSB7CisJCWluc3RhbmNlLT5zdGF0dXNfdmFsdWUgPSBpcnFfc3RhdHVzIHwgbGluZV9zdGF0dXM7CisJCWluc3RhbmNlLT5zdGF0dXNfdmFsdWVfZWRnZXMgPSBzdGF0dXNfdmFsOworCX0gZWxzZSB7CisJCWluc3RhbmNlLT5zdGF0dXNfdmFsdWUgfD0gaXJxX3N0YXR1cyB8IGxpbmVfc3RhdHVzOworCQlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlX2VkZ2VzIHw9IHN0YXR1c192YWw7CisJfQorCisJaWYgKGluc3RhbmNlLT5maWx0ZXJpbmdfZmxhZykgewkvLyBGb3IgY29tcGFyZSBtb2RlIG9ubHkuCisJCWlmIChpbnN0YW5jZS0+Y29tcGFyZV92YWx1ZSA9PSBpbnN0YW5jZS0+bGluZV92YWx1ZSkgeworCQkJaW5zdGFuY2UtPnJpc2VkID0gMTsKKwkJCWluc3RhbmNlLT5jb3VudCsrOworCQl9CisJfSBlbHNlIHsKKwkJaW5zdGFuY2UtPnJpc2VkID0gMTsKKwkJaW5zdGFuY2UtPmNvdW50Kys7CisJfQorCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiwgNiwgMTkpCitzdGF0aWMgaXJxcmV0dXJuX3QgbWU4MjAwX2lzcl9FWChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCisjZWxzZQorc3RhdGljIGlycXJldHVybl90IG1lODIwMF9pc3JfRVgoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKKyNlbmRpZgoreworCW1lODIwMF9kaV9zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdWludDhfdCBpcnFfc3RhdHVzID0gMDsKKwl1aW50MTZfdCBpcnFfc3RhdHVzX0VYID0gMDsKKwl1aW50MzJfdCBzdGF0dXNfdmFsID0gMDsKKwlpbnQgaSwgajsKKworCWluc3RhbmNlID0gKG1lODIwMF9kaV9zdWJkZXZpY2VfdCAqKSBkZXZfaWQ7CisKKwlpZiAoaXJxICE9IGluc3RhbmNlLT5pcnEpIHsKKwkJUEVSUk9SKCJJbmNvcnJlY3QgaW50ZXJydXB0IG51bTogJWQuXG4iLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy9SZXNldCBsYXRjaGVzLiBDb3B5IHN0YXR1cyB0byBleHRlbmRlZCByZWdpc3RlcnMuCisJaXJxX3N0YXR1cyA9IGluYihpbnN0YW5jZS0+aXJxX3N0YXR1c19yZWcpOworCVBERUJVR19SRUcoImlkeD0lZCBpcnFfc3RhdHVzX3JlZz0weCUwMlhcbiIsIGluc3RhbmNlLT5kaV9pZHgsCisJCSAgIGlycV9zdGF0dXMpOworCisJaWYgKCFpcnFfc3RhdHVzKSB7CisJCVBJTkZPCisJCSAgICAoIiVsZCBTaGFyZWQgaW50ZXJydXB0LiAlcygpOiBpZHg9JWQgaXJxX3N0YXR1c19yZWc9MHglMDRYXG4iLAorCQkgICAgIGppZmZpZXMsIF9fZnVuY19fLCBpbnN0YW5jZS0+ZGlfaWR4LCBpcnFfc3RhdHVzKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWlycV9zdGF0dXNfRVggPSBpbmIoaW5zdGFuY2UtPmlycV9zdGF0dXNfbG93X3JlZyk7CisJaXJxX3N0YXR1c19FWCB8PSAoaW5iKGluc3RhbmNlLT5pcnFfc3RhdHVzX2hpZ2hfcmVnKSA8PCA4KTsKKworCVBERVZFTE9QKCJFWFRFTkRFRCBSRUc6IDB4JTA0eFxuIiwgaXJxX3N0YXR1c19FWCk7CisJaW5zdGFuY2UtPmxpbmVfdmFsdWUgPSBpbmIoaW5zdGFuY2UtPnBvcnRfcmVnKTsKKworCS8vIEZvcm1hdCBleHRlbmRlZCBpbmZvcm1hdGlvbi4KKwlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IDg7IGkrKywgaiArPSAyKSB7CisJCXN0YXR1c192YWwgfD0gKCgweDAxIDw8IGopICYgaXJxX3N0YXR1c19FWCkgPj4gKGogLSBpKTsJLy9GYWxsCisJCXN0YXR1c192YWwgfD0gKCgweDAxIDw8IChqICsgMSkpICYgaXJxX3N0YXR1c19FWCkgPDwgKDE1IC0gaiArIGkpOwkvL1JhaXNlCisJfQorCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCWlmIChpbnN0YW5jZS0+cmlzZWQgPT0gMCkgeworCQlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlID0gaXJxX3N0YXR1czsKKwkJaW5zdGFuY2UtPnN0YXR1c192YWx1ZV9lZGdlcyA9IHN0YXR1c192YWw7CisJfSBlbHNlIHsKKwkJaW5zdGFuY2UtPnN0YXR1c192YWx1ZSB8PSBpcnFfc3RhdHVzOworCQlpbnN0YW5jZS0+c3RhdHVzX3ZhbHVlX2VkZ2VzIHw9IHN0YXR1c192YWw7CisJfQorCisJaWYgKGluc3RhbmNlLT5maWx0ZXJpbmdfZmxhZykgewkvLyBGb3IgY29tcGFyZSBtb2RlIG9ubHkuCisJCWlmIChpbnN0YW5jZS0+Y29tcGFyZV92YWx1ZSA9PSBpbnN0YW5jZS0+bGluZV92YWx1ZSkgeworCQkJaW5zdGFuY2UtPnJpc2VkID0gMTsKKwkJCWluc3RhbmNlLT5jb3VudCsrOworCQl9CisJfSBlbHNlIHsKKwkJaW5zdGFuY2UtPnJpc2VkID0gMTsKKwkJaW5zdGFuY2UtPmNvdW50Kys7CisJfQorCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmaW5zdGFuY2UtPndhaXRfcXVldWUpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBtZTgyMDBfZGlfZGVzdHJ1Y3RvcihzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UpCit7CisJbWU4MjAwX2RpX3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODIwMF9kaV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlmcmVlX2lycShpbnN0YW5jZS0+aXJxLCAodm9pZCAqKWluc3RhbmNlKTsKKwltZV9zdWJkZXZpY2VfZGVpbml0KCZpbnN0YW5jZS0+YmFzZSk7CisJa2ZyZWUoaW5zdGFuY2UpOworfQorCittZTgyMDBfZGlfc3ViZGV2aWNlX3QgKm1lODIwMF9kaV9jb25zdHJ1Y3Rvcih1aW50MzJfdCBtZTgyMDBfcmVnYmFzZSwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgZGlfaWR4LAorCQkJCQkgICAgIGludCBpcnEsCisJCQkJCSAgICAgc3BpbmxvY2tfdCAqIGlycV9jdHJsX2xvY2ssCisJCQkJCSAgICAgc3BpbmxvY2tfdCAqIGlycV9tb2RlX2xvY2spCit7CisJbWU4MjAwX2RpX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlICovCisJc3ViZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWU4MjAwX2RpX3N1YmRldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXN1YmRldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1lODIwMF9kaV9zdWJkZXZpY2VfdCkpOworCisJLyogSW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyAqLworCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBDaGVjayBmaXJtd2FyZSB2ZXJzaW9uLgorCW1lODIwMF9kaV9jaGVja192ZXJzaW9uKHN1YmRldmljZSwKKwkJCQltZTgyMDBfcmVnYmFzZSArIE1FODIwMF9GSVJNV0FSRV9WRVJTSU9OX1JFRyk7CisKKwkvLyBJbml0aWFsaXplIHNwaW4gbG9ja3MuCisJc3Bpbl9sb2NrX2luaXQoJnN1YmRldmljZS0+c3ViZGV2aWNlX2xvY2spOworCisJc3ViZGV2aWNlLT5pcnFfY3RybF9sb2NrID0gaXJxX2N0cmxfbG9jazsKKwlzdWJkZXZpY2UtPmlycV9tb2RlX2xvY2sgPSBpcnFfbW9kZV9sb2NrOworCisJLyogU2F2ZSB0aGUgc3ViZGV2aWNlIGluZGV4LiAqLworCXN1YmRldmljZS0+ZGlfaWR4ID0gZGlfaWR4OworCisJLyogSW5pdGlhbGl6ZSByZWdpc3RlcnMgKi8KKwlpZiAoZGlfaWR4ID09IDApIHsKKwkJc3ViZGV2aWNlLT5wb3J0X3JlZyA9IG1lODIwMF9yZWdiYXNlICsgTUU4MjAwX0RJX1BPUlRfMF9SRUc7CisJCXN1YmRldmljZS0+bWFza19yZWcgPSBtZTgyMDBfcmVnYmFzZSArIE1FODIwMF9ESV9NQVNLXzBfUkVHOworCQlzdWJkZXZpY2UtPmNvbXBhcmVfcmVnID0KKwkJICAgIG1lODIwMF9yZWdiYXNlICsgTUU4MjAwX0RJX0NPTVBBUkVfMF9SRUc7CisJCXN1YmRldmljZS0+aXJxX3N0YXR1c19yZWcgPQorCQkgICAgbWU4MjAwX3JlZ2Jhc2UgKyBNRTgyMDBfRElfQ0hBTkdFXzBfUkVHOworCisJCXN1YmRldmljZS0+aXJxX3N0YXR1c19sb3dfcmVnID0KKwkJICAgIG1lODIwMF9yZWdiYXNlICsgTUU4MjAwX0RJX0VYVEVORF9DSEFOR0VfMF9MT1dfUkVHOworCQlzdWJkZXZpY2UtPmlycV9zdGF0dXNfaGlnaF9yZWcgPQorCQkgICAgbWU4MjAwX3JlZ2Jhc2UgKyBNRTgyMDBfRElfRVhURU5EX0NIQU5HRV8wX0hJR0hfUkVHOworCX0gZWxzZSBpZiAoZGlfaWR4ID09IDEpIHsKKwkJc3ViZGV2aWNlLT5wb3J0X3JlZyA9IG1lODIwMF9yZWdiYXNlICsgTUU4MjAwX0RJX1BPUlRfMV9SRUc7CisJCXN1YmRldmljZS0+bWFza19yZWcgPSBtZTgyMDBfcmVnYmFzZSArIE1FODIwMF9ESV9NQVNLXzFfUkVHOworCQlzdWJkZXZpY2UtPmNvbXBhcmVfcmVnID0KKwkJICAgIG1lODIwMF9yZWdiYXNlICsgTUU4MjAwX0RJX0NPTVBBUkVfMV9SRUc7CisJCXN1YmRldmljZS0+aXJxX3N0YXR1c19yZWcgPQorCQkgICAgbWU4MjAwX3JlZ2Jhc2UgKyBNRTgyMDBfRElfQ0hBTkdFXzFfUkVHOworCisJCXN1YmRldmljZS0+aXJxX3N0YXR1c19sb3dfcmVnID0KKwkJICAgIG1lODIwMF9yZWdiYXNlICsgTUU4MjAwX0RJX0VYVEVORF9DSEFOR0VfMV9MT1dfUkVHOworCQlzdWJkZXZpY2UtPmlycV9zdGF0dXNfaGlnaF9yZWcgPQorCQkgICAgbWU4MjAwX3JlZ2Jhc2UgKyBNRTgyMDBfRElfRVhURU5EX0NIQU5HRV8xX0hJR0hfUkVHOworCX0gZWxzZSB7CisJCVBFUlJPUigiV3Jvbmcgc3ViZGV2aWNlIGlkeD0lZC5cbiIsIGRpX2lkeCk7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlzdWJkZXZpY2UtPmlycV9jdHJsX3JlZyA9IG1lODIwMF9yZWdiYXNlICsgTUU4MjAwX0RJX0lSUV9DVFJMX1JFRzsKKwlzdWJkZXZpY2UtPmlycV9tb2RlX3JlZyA9IG1lODIwMF9yZWdiYXNlICsgTUU4MjAwX0lSUV9NT0RFX1JFRzsKKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXN1YmRldmljZS0+cmVnX2Jhc2UgPSBtZTgyMDBfcmVnYmFzZTsKKyNlbmRpZgorCisJLyogSW5pdGlhbGl6ZSB3YWl0IHF1ZXVlICovCisJaW5pdF93YWl0cXVldWVfaGVhZCgmc3ViZGV2aWNlLT53YWl0X3F1ZXVlKTsKKworCS8qIE92ZXJsb2FkIGJhc2UgY2xhc3MgbWV0aG9kcy4gKi8KKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX2lycV9zdGFydCA9IG1lODIwMF9kaV9pb19pcnFfc3RhcnQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19pcnFfd2FpdCA9IG1lODIwMF9kaV9pb19pcnFfd2FpdDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX2lycV9zdG9wID0gbWU4MjAwX2RpX2lvX2lycV9zdG9wOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWU4MjAwX2RpX2lvX3Jlc2V0X3N1YmRldmljZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9jb25maWcgPQorCSAgICBtZTgyMDBfZGlfaW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWU4MjAwX2RpX2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWU4MjAwX2RpX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWU4MjAwX2RpX3F1ZXJ5X3N1YmRldmljZV90eXBlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHMgPQorCSAgICBtZTgyMDBfZGlfcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9kZXN0cnVjdG9yID0gbWU4MjAwX2RpX2Rlc3RydWN0b3I7CisKKwlzdWJkZXZpY2UtPnJpc2VkID0gMDsKKwlzdWJkZXZpY2UtPmNvdW50ID0gMDsKKworCS8qIFJlZ2lzdGVyIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUuICovCisJc3ViZGV2aWNlLT5pcnEgPSBpcnE7CisJaWYgKHN1YmRldmljZS0+dmVyc2lvbiA+IDApIHsJLy8gTkVXCisJCWVyciA9IHJlcXVlc3RfaXJxKHN1YmRldmljZS0+aXJxLCBtZTgyMDBfaXNyX0VYLAorI2lmZGVmIElSUUZfRElTQUJMRUQKKwkJCQkgIElSUUZfRElTQUJMRUQgfCBJUlFGX1NIQVJFRCwKKyNlbHNlCisJCQkJICBTQV9JTlRFUlJVUFQgfCBTQV9TSElSUSwKKyNlbmRpZgorCQkJCSAgTUU4MjAwX05BTUUsICh2b2lkICopc3ViZGV2aWNlKTsKKwl9IGVsc2UgewkJLy9PTEQKKwkJZXJyID0gcmVxdWVzdF9pcnEoc3ViZGV2aWNlLT5pcnEsIG1lODIwMF9pc3IsCisjaWZkZWYgSVJRRl9ESVNBQkxFRAorCQkJCSAgSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVELAorI2Vsc2UKKwkJCQkgIFNBX0lOVEVSUlVQVCB8IFNBX1NISVJRLAorI2VuZGlmCisJCQkJICBNRTgyMDBfTkFNRSwgKHZvaWQgKilzdWJkZXZpY2UpOworCX0KKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJUERFQlVHKCJSZWdpc3RyZWQgaXJxPSVkLlxuIiwgc3ViZGV2aWNlLT5pcnEpOworCisJcmV0dXJuIHN1YmRldmljZTsKK30KKworc3RhdGljIHZvaWQgbWU4MjAwX2RpX2NoZWNrX3ZlcnNpb24obWU4MjAwX2RpX3N1YmRldmljZV90ICogaW5zdGFuY2UsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlpbnN0YW5jZS0+dmVyc2lvbiA9IDB4MDAwMDAwRkYgJiBpbmIoYWRkcik7CisJUERFVkVMT1AoIm1lODIwMCBmaXJtd2FyZSB2ZXJzaW9uOiAlZFxuIiwgaW5zdGFuY2UtPnZlcnNpb24pOworCisJLy8vIEBub3RlIEZpeCBmb3Igd3JvbmcgdmFsdWVzIGluIHRoaXMgcmVnaXN0cnkuCisJaWYgKChpbnN0YW5jZS0+dmVyc2lvbiA8IDB4NykgfHwgKGluc3RhbmNlLT52ZXJzaW9uID4gMHgxRikpCisJCWluc3RhbmNlLT52ZXJzaW9uID0gMHgwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kaS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhM2IwMDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2RpLmgKQEAgLTAsMCArMSw5MiBAQAorLyoqCisgKiBAZmlsZSBtZTgyMDBfZGkuaAorICoKKyAqIEBicmllZiBNRS04MjAwIGRpZ2l0YWwgaW5wdXQgc3ViZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FODIwMF9ESV9IXworI2RlZmluZSBfTUU4MjAwX0RJX0hfCisKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgdGVtcGxhdGUgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTgyMDBfZGlfc3ViZGV2aWNlIHsKKwkvKiBJbmhlcml0YW5jZSAqLworCW1lX3N1YmRldmljZV90IGJhc2U7CQkJLyoqPCBUaGUgc3ViZGV2aWNlIGJhc2UgY2xhc3MuICovCisKKwkvKiBBdHRyaWJ1dGVzICovCisJc3BpbmxvY2tfdCBzdWJkZXZpY2VfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlIHN1YmRldmljZSBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCXNwaW5sb2NrX3QgKmN0cmxfcmVnX2xvY2s7CisJc3BpbmxvY2tfdCAqaXJxX2N0cmxfbG9jazsKKwlzcGlubG9ja190ICppcnFfbW9kZV9sb2NrOworCisJdW5zaWduZWQgaW50IGRpX2lkeDsKKwl1bnNpZ25lZCBpbnQgdmVyc2lvbjsKKworCWludCBpcnE7CQkJCQkJLyoqPCBUaGUgbnVtYmVyIG9mIHRoZSBpbnRlcnJ1cHQgcmVxdWVzdC4gKi8KKwl2b2xhdGlsZSBpbnQgcmlzZWQ7CQkJCS8qKjwgRmxhZyB0byBpbmRpY2F0ZSBpZiBhbiBpbnRlcnJ1cHQgb2NjdXJlZC4gKi8KKwl1aW50IHN0YXR1c19mbGFnOwkJCQkvKio8IERlZmF1bHQgaW50ZXJ1cHQgc3RhdHVzIGZsYWcgKi8KKwl1aW50IHN0YXR1c192YWx1ZTsJCQkJLyoqPCBJbnRlcnVwdCBzdGF0dXMgKi8KKwl1aW50IHN0YXR1c192YWx1ZV9lZGdlczsJCQkvKio8IEV4dGVuZGVkIGludGVydXB0IHN0YXR1cyAqLworCXVpbnQgbGluZV92YWx1ZTsKKwlpbnQgY291bnQ7CQkJCQkJLyoqPCBDb3VudHMgdGhlIG51bWJlciBvZiBpbnRlcnJ1cHRzIG9jY3VyZWQuICovCisJdWludDhfdCBjb21wYXJlX3ZhbHVlOworCXVpbnQ4X3QgZmlsdGVyaW5nX2ZsYWc7CisKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3F1ZXVlOwkvKio8IFRvIHdhaXQgb24gaW50ZXJydXB0cy4gKi8KKworCXVuc2lnbmVkIGxvbmcgcG9ydF9yZWc7CQkJLyoqPCBUaGUgZGlnaXRhbCBpbnB1dCBwb3J0LiAqLworCXVuc2lnbmVkIGxvbmcgY29tcGFyZV9yZWc7CQkvKio8IFRoZSByZWdpc3RlciB0byBob2xkIHRoZSB2YWx1ZSB0byBjb21wYXJlIHdpdGguICovCisJdW5zaWduZWQgbG9uZyBtYXNrX3JlZzsJCQkvKio8IFRoZSByZWdpc3RlciB0byBob2xkIHRoZSBtYXNrLiAqLworCXVuc2lnbmVkIGxvbmcgaXJxX21vZGVfcmVnOwkJLyoqPCBUaGUgaW50ZXJydXB0IG1vZGUgcmVnaXN0ZXIuICovCisJdW5zaWduZWQgbG9uZyBpcnFfY3RybF9yZWc7CQkvKio8IFRoZSBpbnRlcnJ1cHQgY29udHJvbCByZWdpc3Rlci4gKi8KKwl1bnNpZ25lZCBsb25nIGlycV9zdGF0dXNfcmVnOwkvKio8IFRoZSBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyLiBBbHNvIGludGVycnVwdCByZXNldGluZyByZWdpc3RlciAoZmlybXdhcmUgdmVyc2lvbiA3IGFuZCBsYXRlcikuKi8KKyNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRworCXVuc2lnbmVkIGxvbmcgcmVnX2Jhc2U7CisjZW5kaWYKKwl1bnNpZ25lZCBsb25nIGZpcm13YXJlX3ZlcnNpb25fcmVnOwkvKio8IFRoZSBpbnRlcnJ1cHQgcmVzZXRpbmcgcmVnaXN0ZXIuICovCisKKwl1bnNpZ25lZCBsb25nIGlycV9zdGF0dXNfbG93X3JlZzsJLyoqPCBUaGUgaW50ZXJydXB0IGV4dGVuZGVkIHN0YXR1cyByZWdpc3RlciAobG93IHBhcnQpLiAqLworCXVuc2lnbmVkIGxvbmcgaXJxX3N0YXR1c19oaWdoX3JlZzsJLyoqPCBUaGUgaW50ZXJydXB0IGV4dGVuZGVkIHN0YXR1cyByZWdpc3RlciAoaGlnaCBwYXJ0KS4gKi8KK30gbWU4MjAwX2RpX3N1YmRldmljZV90OworCisvKioKKyAqIEBicmllZiBUaGUgY29uc3RydWN0b3IgdG8gZ2VuZXJhdGUgYSBNRS04MjAwIGRpZ2l0YWwgaW5wdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICoKKyAqIEBwYXJhbSByZWdfYmFzZSBUaGUgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgYXMgcmV0dXJuZWQgYnkgdGhlIFBDSSBCSU9TLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWU4MjAwX2RpX3N1YmRldmljZV90ICptZTgyMDBfZGlfY29uc3RydWN0b3IodWludDMyX3QgbWU4MjAwX3JlZ19iYXNlLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBkaV9pZHgsCisJCQkJCSAgICAgaW50IGlycSwKKwkJCQkJICAgICBzcGlubG9ja190ICogaXJxX2N0cmxfbG9jaywKKwkJCQkJICAgICBzcGlubG9ja190ICogaXJxX21vZGVfbG9jayk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2RpX3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kaV9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWE2MTlkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kaV9yZWcuaApAQCAtMCwwICsxLDc1IEBACisvKioKKyAqIEBmaWxlIG1lODIwMF9kaV9yZWcuaAorICoKKyAqIEBicmllZiBNRS04MjAwIGRpZ2l0YWwgaW5wdXQgc3ViZGV2aWNlIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FODIwMF9ESV9SRUdfSF8KKyNkZWZpbmUgX01FODIwMF9ESV9SRUdfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworLy8gQ29tbW9uIHJlZ2lzdHJ5IGZvciB3aG9sZSBmYW1pbHkuCisjZGVmaW5lIE1FODIwMF9ESV9QT1JUXzBfUkVHCQkJCQkweDMJLy8gUgorI2RlZmluZSBNRTgyMDBfRElfUE9SVF8xX1JFRwkJCQkJMHg0CS8vIFIKKworI2RlZmluZSBNRTgyMDBfRElfTUFTS18wX1JFRwkJCQkJMHg1CS8vIFIvVworI2RlZmluZSBNRTgyMDBfRElfTUFTS18xX1JFRwkJCQkJMHg2CS8vIFIvVworCisjZGVmaW5lIE1FODIwMF9ESV9DT01QQVJFXzBfUkVHCQkJCQkweEEJLy8gUi9XCisjZGVmaW5lIE1FODIwMF9ESV9DT01QQVJFXzFfUkVHCQkJCQkweEIJLy8gUi9XCisKKyNkZWZpbmUgTUU4MjAwX0RJX0lSUV9DVFJMX1JFRwkJCQkJMHhDCS8vIFIvVworCisjaWZuZGVmIE1FODIwMF9JUlFfTU9ERV9SRUcKKyMgZGVmaW5lIE1FODIwMF9JUlFfTU9ERV9SRUcJCQkJCTB4RAkvLyBSL1cKKyNlbmRpZgorCisvLyBUaGlzIHJlZ2lzdHJ5IGFyZSBmb3IgYWxsIHZlcnNpb25zCisjZGVmaW5lIE1FODIwMF9ESV9DSEFOR0VfMF9SRUcJCQkJCTB4RQkvLyBSCisjZGVmaW5lIE1FODIwMF9ESV9DSEFOR0VfMV9SRUcJCQkJCTB4RgkvLyBSCisKKyNkZWZpbmUgTUU4MjAwX0RJX0lSUV9DVFJMX0JJVF9DTEVBUgkJCTB4NAorI2RlZmluZSBNRTgyMDBfRElfSVJRX0NUUkxfQklUX0VOQUJMRQkJCTB4OAorCisvLyBUaGlzIHJlZ2lzdHJ5IGFyZSBmb3IgZmlybXdhcmUgdmVyc2lvbnMgNyBhbmQgbGF0ZXIKKyNkZWZpbmUgTUU4MjAwX0RJX0VYVEVORF9DSEFOR0VfMF9MT1dfUkVHCQkweDEwCS8vIFIKKyNkZWZpbmUgTUU4MjAwX0RJX0VYVEVORF9DSEFOR0VfMF9ISUdIX1JFRwkJMHgxMQkvLyBSCisjZGVmaW5lIE1FODIwMF9ESV9FWFRFTkRfQ0hBTkdFXzFfTE9XX1JFRwkJMHgxMgkvLyBSCisjZGVmaW5lIE1FODIwMF9ESV9FWFRFTkRfQ0hBTkdFXzFfSElHSF9SRUcJCTB4MTMJLy8gUgorCisjaWZuZGVmIE1FODIwMF9GSVJNV0FSRV9WRVJTSU9OX1JFRworIyBkZWZpbmUgTUU4MjAwX0ZJUk1XQVJFX1ZFUlNJT05fUkVHCQkJMHgxNAkvLyBSCisjZW5kaWYKKworLy8gQml0IGRlZmluaXRpb25zCisjZGVmaW5lIE1FODIwMF9ESV9JUlFfQ1RSTF9NQVNLX0VER0UJCQkweDMKKyNkZWZpbmUgTUU4MjAwX0RJX0lSUV9DVFJMX01BU0tfRURHRV9SSVNJTkcJCTB4MAorI2RlZmluZSBNRTgyMDBfRElfSVJRX0NUUkxfTUFTS19FREdFX0ZBTExJTkcJMHgxCisjZGVmaW5lIE1FODIwMF9ESV9JUlFfQ1RSTF9NQVNLX0VER0VfQU5ZCQkweDMKKworLy8gT3RoZXJzCisjZGVmaW5lIE1FODIwMF9ESV9JUlFfQ1RSTF9TSElGVAkJCQk0CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2Rpby5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjhjYTFiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kaW8uYwpAQCAtMCwwICsxLDQxOCBAQAorLyoqCisgKiBAZmlsZSBtZTgyMDBfZGlvLmMKKyAqCisgKiBAYnJpZWYgTUUtODIwMCBkaWdpdGFsIGlucHV0L291dHB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKy8qCisgKiBJbmNsdWRlcworICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZTgyMDBfZGlvX3JlZy5oIgorI2luY2x1ZGUgIm1lODIwMF9kaW8uaCIKKworLyoKKyAqIERlZmluZXMKKyAqLworCisvKgorICogRnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBtZTgyMDBfZGlvX2lvX3Jlc2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCSBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTgyMDBfZGlvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1aW50OF90IG1vZGU7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCWluc3RhbmNlID0gKG1lODIwMF9kaW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJbW9kZSA9IGluYihpbnN0YW5jZS0+Y3RybF9yZWcpOworCW1vZGUgJj0gfigweDMgPDwgKGluc3RhbmNlLT5kaW9faWR4ICogMikpOworCW91dGIobW9kZSwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgbW9kZSk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCW91dGIoMHgwMCwgaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwlQREVCVUdfUkVHKCJwb3J0X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5wb3J0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMHgwMCk7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODIwMF9kaW9faW9fc2luZ2xlX2NvbmZpZyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICAgaW50IHNpbmdsZV9jb25maWcsCisJCQkJICAgICAgIGludCByZWYsCisJCQkJICAgICAgIGludCB0cmlnX2NoYW4sCisJCQkJICAgICAgIGludCB0cmlnX3R5cGUsIGludCB0cmlnX2VkZ2UsIGludCBmbGFncykKK3sKKwltZTgyMDBfZGlvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1aW50MzJfdCBtb2RlOworCXVpbnQzMl90IHNpemUgPQorCSAgICBmbGFncyAmIChNRV9JT19TSU5HTEVfQ09ORklHX0RJT19CSVQgfCBNRV9JT19TSU5HTEVfQ09ORklHX0RJT19CWVRFCisJCSAgICAgfCBNRV9JT19TSU5HTEVfQ09ORklHX0RJT19XT1JEIHwKKwkJICAgICBNRV9JT19TSU5HTEVfQ09ORklHX0RJT19EV09SRCk7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgyMDBfZGlvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCW1vZGUgPSBpbmIoaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlzd2l0Y2ggKHNpemUpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9DT05GSUdfTk9fRkxBR1M6CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQlpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0RJT19JTlBVVCkgeworCQkJCW1vZGUgJj0KKwkJCQkgICAgfigoTUU4MjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgfAorCQkJCSAgICAgICBNRTgyMDBfRElPX0NUUkxfQklUX01PREVfMSkgPDwKKwkJCQkgICAgICAoaW5zdGFuY2UtPmRpb19pZHggKiAyKSk7CisJCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fT1VUUFVUKSB7CisJCQkJbW9kZSAmPQorCQkJCSAgICB+KChNRTgyMDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJICAgICAgIE1FODIwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCSAgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKwkJCQltb2RlIHw9CisJCQkJICAgIE1FODIwMF9ESU9fQ1RSTF9CSVRfTU9ERV8wIDw8IChpbnN0YW5jZS0+CisJCQkJCQkJCSAgIGRpb19pZHggKiAyKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SCisJCQkJICAgICgiSW52YWxpZCBwb3J0IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwgbnVtYmVyLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncy5cbiIpOworCisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKCFlcnIpIHsKKwkJb3V0Yihtb2RlLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlQREVCVUdfUkVHKCJjdHJsX3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJICAgaW5zdGFuY2UtPmN0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCBtb2RlKTsKKwl9CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lODIwMF9kaW9faW9fc2luZ2xlX3JlYWQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCW1lODIwMF9kaW9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQ4X3QgbW9kZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODIwMF9kaW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCW1vZGUgPQorCQkJICAgIGluYihpbnN0YW5jZS0+CisJCQkJY3RybF9yZWcpICYgKChNRTgyMDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCSAgICAgIE1FODIwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKworCQkJaWYgKChtb2RlID09CisJCQkgICAgIChNRTgyMDBfRElPX0NUUkxfQklUX01PREVfMCA8PAorCQkJICAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpKSB8fCAhbW9kZSkgeworCQkJCSp2YWx1ZSA9CisJCQkJICAgIGluYihpbnN0YW5jZS0+CisJCQkJCXBvcnRfcmVnKSAmICgweDAwMDEgPDwgY2hhbm5lbCk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiUG9ydCBub3QgaW4gb3V0cHV0IG9yIGlucHV0IG1vZGUuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCW1vZGUgPQorCQkJICAgIGluYihpbnN0YW5jZS0+CisJCQkJY3RybF9yZWcpICYgKChNRTgyMDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCSAgICAgIE1FODIwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKworCQkJaWYgKChtb2RlID09CisJCQkgICAgIChNRTgyMDBfRElPX0NUUkxfQklUX01PREVfMCA8PAorCQkJICAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpKSB8fCAhbW9kZSkgeworCQkJCSp2YWx1ZSA9IGluYihpbnN0YW5jZS0+cG9ydF9yZWcpICYgMHgwMEZGOworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IoIlBvcnQgbm90IGluIG91dHB1dCBvciBpbnB1dCBtb2RlLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjAwX2Rpb19pb19zaW5nbGVfd3JpdGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgIGludCB2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU4MjAwX2Rpb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdWludDhfdCBtb2RlOworCXVpbnQ4X3QgYnl0ZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODIwMF9kaW9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCW1vZGUgPQorCQkJICAgIGluYihpbnN0YW5jZS0+CisJCQkJY3RybF9yZWcpICYgKChNRTgyMDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCSAgICAgIE1FODIwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKworCQkJaWYgKG1vZGUgPT0KKwkJCSAgICAoTUU4MjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgPDwKKwkJCSAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpKSB7CisJCQkJYnl0ZSA9IGluYihpbnN0YW5jZS0+cG9ydF9yZWcpOworCisJCQkJaWYgKHZhbHVlKQorCQkJCQlieXRlIHw9IDB4MSA8PCBjaGFubmVsOworCQkJCWVsc2UKKwkJCQkJYnl0ZSAmPSB+KDB4MSA8PCBjaGFubmVsKTsKKworCQkJCW91dGIoYnl0ZSwgaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJCQlQREVCVUdfUkVHKCJwb3J0X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJCSAgIGluc3RhbmNlLT5wb3J0X3JlZyAtCisJCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwgYnl0ZSk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiUG9ydCBub3QgaW4gb3V0cHV0IG9yIGlucHV0IG1vZGUuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCW1vZGUgPQorCQkJICAgIGluYihpbnN0YW5jZS0+CisJCQkJY3RybF9yZWcpICYgKChNRTgyMDBfRElPX0NUUkxfQklUX01PREVfMCB8CisJCQkJCSAgICAgIE1FODIwMF9ESU9fQ1RSTF9CSVRfTU9ERV8xKSA8PAorCQkJCQkgICAgIChpbnN0YW5jZS0+ZGlvX2lkeCAqIDIpKTsKKworCQkJaWYgKG1vZGUgPT0KKwkJCSAgICAoTUU4MjAwX0RJT19DVFJMX0JJVF9NT0RFXzAgPDwKKwkJCSAgICAgKGluc3RhbmNlLT5kaW9faWR4ICogMikpKSB7CisJCQkJb3V0Yih2YWx1ZSwgaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJCQlQREVCVUdfUkVHKCJwb3J0X3JlZyBvdXRsKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCQkgICBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJCSAgIGluc3RhbmNlLT5wb3J0X3JlZyAtCisJCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwgdmFsdWUpOworCQkJfSBlbHNlIHsKKwkJCQlQRVJST1IoIlBvcnQgbm90IGluIG91dHB1dCBvciBpbnB1dCBtb2RlLlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fUFJFVklPVVNfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjAwX2Rpb19xdWVyeV9udW1iZXJfY2hhbm5lbHMobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgICBpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm51bWJlciA9IDg7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjAwX2Rpb19xdWVyeV9zdWJkZXZpY2VfdHlwZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSp0eXBlID0gTUVfVFlQRV9ESU87CisJKnN1YnR5cGUgPSBNRV9TVUJUWVBFX1NJTkdMRTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTgyMDBfZGlvX3F1ZXJ5X3N1YmRldmljZV9jYXBzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgKmNhcHMpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpjYXBzID0gTUVfQ0FQU19ESU9fRElSX0JZVEU7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK21lODIwMF9kaW9fc3ViZGV2aWNlX3QgKm1lODIwMF9kaW9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgZGlvX2lkeCwKKwkJCQkJICAgICAgIHNwaW5sb2NrX3QgKiBjdHJsX3JlZ19sb2NrKQoreworCW1lODIwMF9kaW9fc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwlpbnQgZXJyOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UgKi8KKwlzdWJkZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTgyMDBfZGlvX3N1YmRldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXN1YmRldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1lODIwMF9kaW9fc3ViZGV2aWNlX3QpKTsKKworCS8qIEluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgKi8KKwllcnIgPSBtZV9zdWJkZXZpY2VfaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2tzLgorCXNwaW5fbG9ja19pbml0KCZzdWJkZXZpY2UtPnN1YmRldmljZV9sb2NrKTsKKworCXN1YmRldmljZS0+Y3RybF9yZWdfbG9jayA9IGN0cmxfcmVnX2xvY2s7CisKKwkvKiBTYXZlIGRpZ2l0YWwgaS9vIGluZGV4ICovCisJc3ViZGV2aWNlLT5kaW9faWR4ID0gZGlvX2lkeDsKKworCS8qIFNhdmUgdGhlIHN1YmRldmljZSBpbmRleCAqLworCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FODIwMF9ESU9fQ1RSTF9SRUc7CisJc3ViZGV2aWNlLT5wb3J0X3JlZyA9IHJlZ19iYXNlICsgTUU4MjAwX0RJT19QT1JUX1JFRyArIGRpb19pZHg7CisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwlzdWJkZXZpY2UtPnJlZ19iYXNlID0gcmVnX2Jhc2U7CisjZW5kaWYKKworCS8qIE92ZXJsb2FkIGJhc2UgY2xhc3MgbWV0aG9kcy4gKi8KKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSA9CisJICAgIG1lODIwMF9kaW9faW9fcmVzZXRfc3ViZGV2aWNlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX2NvbmZpZyA9CisJICAgIG1lODIwMF9kaW9faW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWU4MjAwX2Rpb19pb19zaW5nbGVfcmVhZDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV93cml0ZSA9CisJICAgIG1lODIwMF9kaW9faW9fc2luZ2xlX3dyaXRlOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzID0KKwkgICAgbWU4MjAwX2Rpb19xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lODIwMF9kaW9fcXVlcnlfc3ViZGV2aWNlX3R5cGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyA9CisJICAgIG1lODIwMF9kaW9fcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisKKwlyZXR1cm4gc3ViZGV2aWNlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kaW8uaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRkZDkzZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZGlvLmgKQEAgLTAsMCArMSw2OCBAQAorLyoqCisgKiBAZmlsZSBtZTgyMDBfZGlvLmgKKyAqCisgKiBAYnJpZWYgTUUtODIwMCBkaWdpdGFsIGlucHV0L291dHB1dCBzdWJkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU4MjAwX0RJT19IXworI2RlZmluZSBfTUU4MjAwX0RJT19IXworCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgVGhlIHRlbXBsYXRlIHN1YmRldmljZSBjbGFzcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWU4MjAwX2Rpb19zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJc3BpbmxvY2tfdCAqY3RybF9yZWdfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgI2N0cmxfcmVnIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJdW5zaWduZWQgaW50IGRpb19pZHg7CQkJLyoqPCBUaGUgaW5kZXggb2YgdGhlIGRpZ2l0YWwgaS9vIG9uIHRoZSBkZXZpY2UuICovCisKKwl1bnNpZ25lZCBsb25nIHBvcnRfcmVnOwkJCS8qKjwgUmVnaXN0ZXIgaG9sZGluZyB0aGUgcG9ydCBzdGF0dXMuICovCisJdW5zaWduZWQgbG9uZyBjdHJsX3JlZzsJCQkvKio8IFJlZ2lzdGVyIHRvIGNvbmZpZ3VyZSB0aGUgcG9ydCBkaXJlY3Rpb24uICovCisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwl1bnNpZ25lZCBsb25nIHJlZ19iYXNlOworI2VuZGlmCit9IG1lODIwMF9kaW9fc3ViZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBjb25zdHJ1Y3RvciB0byBnZW5lcmF0ZSBhIE1FLTgyMDAgZGlnaXRhbCBpbnB1dC9vdXB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gZGlvX2lkeCBUaGUgaW5kZXggb2YgdGhlIGRpZ2l0YWwgaS9vIHBvcnQgb24gdGhlIGRldmljZS4KKyAqIEBwYXJhbSBjdHJsX3JlZ19sb2NrIFNwaW4gbG9jayBwcm90ZWN0aW5nIHRoZSBjb250cm9sIHJlZ2lzdGVyLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWU4MjAwX2Rpb19zdWJkZXZpY2VfdCAqbWU4MjAwX2Rpb19jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCBkaW9faWR4LAorCQkJCQkgICAgICAgc3BpbmxvY2tfdCAqIGN0cmxfcmVnX2xvY2spOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kaW9fcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2Rpb19yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzk0YTEzMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZGlvX3JlZy5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qKgorICogQGZpbGUgbWU4MjAwX2Rpb19yZWcuaAorICoKKyAqIEBicmllZiBNRS04MjAwIGRpZ2l0YWwgaW5wdXQvb3V0cHV0IHN1YmRldmljZSByZWdpc3RlciBkZWZpbml0aW9ucy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRTgyMDBfRElPX1JFR19IXworI2RlZmluZSBfTUU4MjAwX0RJT19SRUdfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBNRTgyMDBfRElPX0NUUkxfUkVHCQkJCQkweDcJLy8gUi9XCisjZGVmaW5lIE1FODIwMF9ESU9fUE9SVF8wX1JFRwkJCQkweDgJLy8gUi9XCisjZGVmaW5lIE1FODIwMF9ESU9fUE9SVF8xX1JFRwkJCQkweDkJLy8gUi9XCisjZGVmaW5lIE1FODIwMF9ESU9fUE9SVF9SRUcJCQkJCU1FODIwMF9ESU9fUE9SVF8wX1JFRwkvLyBSL1cKKworI2RlZmluZSBNRTgyMDBfRElPX0NUUkxfQklUX01PREVfMAkJCTB4MDEKKyNkZWZpbmUgTUU4MjAwX0RJT19DVFJMX0JJVF9NT0RFXzEJCQkweDAyCisjZGVmaW5lIE1FODIwMF9ESU9fQ1RSTF9CSVRfTU9ERV8yCQkJMHgwNAorI2RlZmluZSBNRTgyMDBfRElPX0NUUkxfQklUX01PREVfMwkJCTB4MDgKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZG8uYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZG8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmJlYmQxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kby5jCkBAIC0wLDAgKzEsNjAwIEBACisvKioKKyAqIEBmaWxlIG1lODIwMF9kby5jCisgKgorICogQGJyaWVmIE1FLTgyMDAgZGlnaXRhbCBvdXRwdXQgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvKgorICogSW5jbHVkZXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorCisjaW5jbHVkZSAibWVpZHMuaCIKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWU4MjAwX3JlZy5oIgorI2luY2x1ZGUgIm1lODIwMF9kb19yZWcuaCIKKyNpbmNsdWRlICJtZTgyMDBfZG8uaCIKKworLyoKKyAqIERlZmluZXMKKyAqLworCisvKgorICogRnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBtZTgyMDBfZG9faW9faXJxX3N0YXJ0KG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgaW50IGNoYW5uZWwsCisJCQkJICBpbnQgaXJxX3NvdXJjZSwKKwkJCQkgIGludCBpcnFfZWRnZSwgaW50IGlycV9hcmcsIGludCBmbGFncykKK3sKKwltZTgyMDBfZG9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQ4X3QgdG1wOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzOworCisJaWYgKGZsYWdzICYgfk1FX0lPX0lSUV9TVEFSVF9ESU9fQllURSkgeworCQlQRVJST1IoIkludmFsaWQgZmxhZyBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfRkxBR1M7CisJfQorCisJaWYgKGNoYW5uZWwgIT0gMCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpZiAoaXJxX3NvdXJjZSAhPSBNRV9JUlFfU09VUkNFX0RJT19PVkVSX1RFTVApIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGludGVycnVwdCBzb3VyY2Ugc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0lSUV9TT1VSQ0U7CisJfQorCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU4MjAwX2RvX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIHN0YXR1cyk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5pcnFfbW9kZV9sb2NrKTsKKwl0bXAgPSBpbmIoaW5zdGFuY2UtPmlycV9jdHJsX3JlZyk7CisJdG1wIHw9CisJICAgIE1FODIwMF9JUlFfTU9ERV9CSVRfRU5BQkxFX1BPV0VSIDw8IChNRTgyMDBfSVJRX01PREVfUE9XRVJfU0hJRlQgKgorCQkJCQkJIGluc3RhbmNlLT5kb19pZHgpOworCW91dGIodG1wLCBpbnN0YW5jZS0+aXJxX2N0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJpcnFfY3RybF9yZWcgb3V0YigweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+aXJxX2N0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5pcnFfbW9kZV9sb2NrKTsKKwlpbnN0YW5jZS0+cmlzZWQgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgc3RhdHVzKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTgyMDBfZG9faW9faXJxX3dhaXQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgaW50IGNoYW5uZWwsCisJCQkJIGludCAqaXJxX2NvdW50LAorCQkJCSBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTgyMDBfZG9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCWxvbmcgdCA9IDA7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgyMDBfZG9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAodGltZV9vdXQgPCAwKSB7CisJCVBFUlJPUigiSW52YWxpZCB0aW1lX291dCBzcGVjaWZpZWQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfVElNRU9VVDsKKwl9CisKKwlpZiAodGltZV9vdXQpIHsKKwkJdCA9ICh0aW1lX291dCAqIEhaKSAvIDEwMDA7CisKKwkJaWYgKHQgPT0gMCkKKwkJCXQgPSAxOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCWlmIChpbnN0YW5jZS0+cmlzZWQgPD0gMCkgeworCQlpbnN0YW5jZS0+cmlzZWQgPSAwOworCisJCWlmICh0aW1lX291dCkgeworCQkJdCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGluc3RhbmNlLT4KKwkJCQkJCQkgICAgIHdhaXRfcXVldWUsCisJCQkJCQkJICAgICAoaW5zdGFuY2UtPnJpc2VkICE9CisJCQkJCQkJICAgICAgMCksIHQpOworCisJCQlpZiAodCA9PSAwKSB7CisJCQkJUEVSUk9SCisJCQkJICAgICgiV2FpdCBvbiBleHRlcm5hbCBpbnRlcnJ1cHQgdGltZWQgb3V0LlxuIik7CisJCQkJZXJyID0gTUVfRVJSTk9fVElNRU9VVDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShpbnN0YW5jZS0+d2FpdF9xdWV1ZSwKKwkJCQkJCSAoaW5zdGFuY2UtPnJpc2VkICE9IDApKTsKKwkJfQorCisJCWlmIChpbnN0YW5jZS0+cmlzZWQgPCAwKSB7CisJCQlQRVJST1IoIldhaXQgb24gaW50ZXJydXB0IGFib3J0ZWQgYnkgdXNlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fQ0FOQ0VMTEVEOworCQl9CisJfQorCisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCVBFUlJPUigiV2FpdCBvbiBleHRlcm5hbCBpbnRlcnJ1cHQgYWJvcnRlZCBieSBzaWduYWwuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fU0lHTkFMOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CisJaW5zdGFuY2UtPnJpc2VkID0gMDsKKwkqaXJxX2NvdW50ID0gaW5zdGFuY2UtPmNvdW50OworCSp2YWx1ZSA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lODIwMF9kb19pb19pcnFfc3RvcChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgY2hhbm5lbCwgaW50IGZsYWdzKQoreworCW1lODIwMF9kb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdWludDhfdCB0bXA7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgyMDBfZG9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCXNwaW5fbG9jayhpbnN0YW5jZS0+aXJxX21vZGVfbG9jayk7CisJdG1wID0gaW5iKGluc3RhbmNlLT5pcnFfY3RybF9yZWcpOworCXRtcCAmPQorCSAgICB+KE1FODIwMF9JUlFfTU9ERV9CSVRfRU5BQkxFX1BPV0VSIDw8CisJICAgICAgKE1FODIwMF9JUlFfTU9ERV9QT1dFUl9TSElGVCAqIGluc3RhbmNlLT5kb19pZHgpKTsKKwlvdXRiKHRtcCwgaW5zdGFuY2UtPmlycV9jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiaXJxX2N0cmxfcmVnIG91dGIoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmlycV9jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgdG1wKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+aXJxX21vZGVfbG9jayk7CisJaW5zdGFuY2UtPnJpc2VkID0gLTE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjAwX2RvX2lvX3Jlc2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCXN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGZsYWdzKQoreworCW1lODIwMF9kb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJdW5zaWduZWQgbG9uZyBjcHVfZmxhZ3M7CisJdWludDhfdCB0bXA7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgyMDBfZG9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOworCW91dGIoMHgwMCwgaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwlQREVCVUdfUkVHKCJwb3J0X3JlZyBvdXRiKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5wb3J0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgMHgwMCk7CisJc3Bpbl9sb2NrKGluc3RhbmNlLT5pcnFfbW9kZV9sb2NrKTsKKwl0bXAgPSBpbmIoaW5zdGFuY2UtPmlycV9jdHJsX3JlZyk7CisJdG1wICY9CisJICAgIH4oTUU4MjAwX0lSUV9NT0RFX0JJVF9FTkFCTEVfUE9XRVIgPDwKKwkgICAgICAoTUU4MjAwX0lSUV9NT0RFX1BPV0VSX1NISUZUICogaW5zdGFuY2UtPmRvX2lkeCkpOworCW91dGIodG1wLCBpbnN0YW5jZS0+aXJxX2N0cmxfcmVnKTsKKwlQREVCVUdfUkVHKCJpcnFfY3RybF9yZWcgb3V0YigweCVsWCsweCVsWCk9MHgleFxuIiwgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkgICBpbnN0YW5jZS0+aXJxX2N0cmxfcmVnIC0gaW5zdGFuY2UtPnJlZ19iYXNlLCB0bXApOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5pcnFfbW9kZV9sb2NrKTsKKwlpbnN0YW5jZS0+cmlzZWQgPSAtMTsKKwlpbnN0YW5jZS0+Y291bnQgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgY3B1X2ZsYWdzKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZpbnN0YW5jZS0+d2FpdF9xdWV1ZSk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODIwMF9kb19pb19zaW5nbGVfY29uZmlnKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkgICAgICBpbnQgcmVmLAorCQkJCSAgICAgIGludCB0cmlnX2NoYW4sCisJCQkJICAgICAgaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCW1lODIwMF9kb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJdW5zaWduZWQgbG9uZyBzdGF0dXM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgyMDBfZG9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgc3RhdHVzKTsKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfQ09ORklHX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fQllURToKKwkJaWYgKGNoYW5uZWwgPT0gMCkgeworCQkJaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fT1VUUFVUKSB7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiSW52YWxpZCBieXRlIGRpcmVjdGlvbiBzcGVjaWZpZWQuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX1NJTkdMRV9DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBzdGF0dXMpOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lODIwMF9kb19pb19zaW5nbGVfcmVhZChtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU4MjAwX2RvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl1bnNpZ25lZCBsb25nIHN0YXR1czsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODIwMF9kb19zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBzdGF0dXMpOworCXN3aXRjaCAoZmxhZ3MpIHsKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CSVQ6CisJCWlmICgoY2hhbm5lbCA+PSAwKSAmJiAoY2hhbm5lbCA8IDgpKSB7CisJCQkqdmFsdWUgPSBpbmIoaW5zdGFuY2UtPnBvcnRfcmVnKSAmICgweDEgPDwgY2hhbm5lbCk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCSp2YWx1ZSA9IGluYihpbnN0YW5jZS0+cG9ydF9yZWcpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIHN0YXR1cyk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjAwX2RvX2lvX3NpbmdsZV93cml0ZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgaW50IHZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTgyMDBfZG9fc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCXVpbnQ4X3Qgc3RhdGU7CisJdW5zaWduZWQgbG9uZyBzdGF0dXM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgyMDBfZG9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJTUVfU1VCREVWSUNFX0VOVEVSOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jaywgc3RhdHVzKTsKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQklUOgorCQlpZiAoKGNoYW5uZWwgPj0gMCkgJiYgKGNoYW5uZWwgPCA4KSkgeworCQkJc3RhdGUgPSBpbmIoaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJCXN0YXRlID0KKwkJCSAgICB2YWx1ZSA/IChzdGF0ZSB8ICgweDEgPDwgY2hhbm5lbCkpIDogKHN0YXRlICYKKwkJCQkJCQkJICB+KDB4MSA8PAorCQkJCQkJCQkgICAgY2hhbm5lbCkpOworCQkJb3V0YihzdGF0ZSwgaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJCVBERUJVR19SRUcoInBvcnRfcmVnIG91dGIoMHglbFgrMHglbFgpPTB4JXhcbiIsCisJCQkJICAgaW5zdGFuY2UtPnJlZ19iYXNlLAorCQkJCSAgIGluc3RhbmNlLT5wb3J0X3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBzdGF0ZSk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYml0IG51bWJlciBzcGVjaWZpZWQuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUVfSU9fU0lOR0xFX05PX0ZMQUdTOgorCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JZVEU6CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCW91dGIodmFsdWUsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCQlQREVCVUdfUkVHKCJwb3J0X3JlZyBvdXRiKDB4JWxYKzB4JWxYKT0weCV4XG4iLAorCQkJCSAgIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJCQkgICBpbnN0YW5jZS0+cG9ydF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCQkJICAgdmFsdWUpOworCQl9IGVsc2UgeworCQkJUEVSUk9SKCJJbnZhbGlkIGJ5dGUgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIHN0YXR1cyk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjAwX2RvX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgaW50ICpudW1iZXIpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpudW1iZXIgPSA4OworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODIwMF9kb19xdWVyeV9zdWJkZXZpY2VfdHlwZShtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKnR5cGUgPSBNRV9UWVBFX0RPOworCSpzdWJ0eXBlID0gTUVfU1VCVFlQRV9TSU5HTEU7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjAwX2RvX3F1ZXJ5X3N1YmRldmljZV9jYXBzKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLCBpbnQgKmNhcHMpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpjYXBzID0gTUVfQ0FQU19ESU9fT1ZFUl9URU1QX0lSUTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgbWU4MjAwX2RvX2Rlc3RydWN0b3Ioc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlKQoreworCW1lODIwMF9kb19zdWJkZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpbnN0YW5jZSA9IChtZTgyMDBfZG9fc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJZnJlZV9pcnEoaW5zdGFuY2UtPmlycSwgKHZvaWQgKilpbnN0YW5jZSk7CisJbWVfc3ViZGV2aWNlX2RlaW5pdCgmaW5zdGFuY2UtPmJhc2UpOworCWtmcmVlKGluc3RhbmNlKTsKK30KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLCA2LCAxOSkKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZTgyMDBfZG9faXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKKyNlbHNlCitzdGF0aWMgaXJxcmV0dXJuX3QgbWU4MjAwX2RvX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorI2VuZGlmCit7CisJbWU4MjAwX2RvX3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1aW50MTZfdCBjdHJsOworCXVpbnQ4X3QgaXJxX3N0YXR1czsKKworCWluc3RhbmNlID0gKG1lODIwMF9kb19zdWJkZXZpY2VfdCAqKSBkZXZfaWQ7CisKKwlpZiAoaXJxICE9IGluc3RhbmNlLT5pcnEpIHsKKwkJUEVSUk9SKCJJbmNvcnJlY3QgaW50ZXJydXB0IG51bTogJWQuXG4iLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJaXJxX3N0YXR1cyA9IGluYihpbnN0YW5jZS0+aXJxX3N0YXR1c19yZWcpOworCWlmICghCisJICAgIChpcnFfc3RhdHVzICYKKwkgICAgIChNRTgyMDBfRE9fSVJRX1NUQVRVU19CSVRfQUNUSVZFIDw8IGluc3RhbmNlLT5kb19pZHgpKSkgeworCQlQSU5GTworCQkgICAgKCIlbGQgU2hhcmVkIGludGVycnVwdC4gJXMoKTogaWR4PSVkIGlycV9zdGF0dXNfcmVnPTB4JTA0WFxuIiwKKwkJICAgICBqaWZmaWVzLCBfX2Z1bmNfXywgaW5zdGFuY2UtPmRvX2lkeCwgaXJxX3N0YXR1cyk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJaW5zdGFuY2UtPnJpc2VkID0gMTsKKwlpbnN0YW5jZS0+Y291bnQrKzsKKworCXNwaW5fbG9jayhpbnN0YW5jZS0+aXJxX21vZGVfbG9jayk7CisJY3RybCA9IGludyhpbnN0YW5jZS0+aXJxX2N0cmxfcmVnKTsKKwljdHJsIHw9IE1FODIwMF9JUlFfTU9ERV9CSVRfQ0xFQVJfUE9XRVIgPDwgaW5zdGFuY2UtPmRvX2lkeDsKKwlvdXR3KGN0cmwsIGluc3RhbmNlLT5pcnFfY3RybF9yZWcpOworCVBERUJVR19SRUcoImlycV9jdHJsX3JlZyBvdXR3KDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCisJCSAgIGluc3RhbmNlLT5pcnFfY3RybF9yZWcgLSBpbnN0YW5jZS0+cmVnX2Jhc2UsIGN0cmwpOworCWN0cmwgJj0gfihNRTgyMDBfSVJRX01PREVfQklUX0NMRUFSX1BPV0VSIDw8IGluc3RhbmNlLT5kb19pZHgpOworCW91dHcoY3RybCwgaW5zdGFuY2UtPmlycV9jdHJsX3JlZyk7CisJUERFQlVHX1JFRygiaXJxX2N0cmxfcmVnIG91dHcoMHglbFgrMHglbFgpPTB4JXhcbiIsIGluc3RhbmNlLT5yZWdfYmFzZSwKKwkJICAgaW5zdGFuY2UtPmlycV9jdHJsX3JlZyAtIGluc3RhbmNlLT5yZWdfYmFzZSwgY3RybCk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmlycV9tb2RlX2xvY2spOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmluc3RhbmNlLT53YWl0X3F1ZXVlKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworbWU4MjAwX2RvX3N1YmRldmljZV90ICptZTgyMDBfZG9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGRvX2lkeCwKKwkJCQkJICAgICBpbnQgaXJxLAorCQkJCQkgICAgIHNwaW5sb2NrX3QgKiBpcnFfbW9kZV9sb2NrKQoreworCW1lODIwMF9kb19zdWJkZXZpY2VfdCAqc3ViZGV2aWNlOworCWludCBlcnI7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHN1YmRldmljZSBpbnN0YW5jZSAqLworCXN1YmRldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1lODIwMF9kb19zdWJkZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFzdWJkZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzdWJkZXZpY2UsIDAsIHNpemVvZihtZTgyMDBfZG9fc3ViZGV2aWNlX3QpKTsKKworCS8qIEluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgKi8KKwllcnIgPSBtZV9zdWJkZXZpY2VfaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2tzLgorCXNwaW5fbG9ja19pbml0KCZzdWJkZXZpY2UtPnN1YmRldmljZV9sb2NrKTsKKworCXN1YmRldmljZS0+aXJxX21vZGVfbG9jayA9IGlycV9tb2RlX2xvY2s7CisKKwkvKiBTYXZlIHRoZSBpbmRleCBvZiB0aGUgZGlnaXRhbCBvdXRwdXQgKi8KKwlzdWJkZXZpY2UtPmRvX2lkeCA9IGRvX2lkeDsKKwlzdWJkZXZpY2UtPmlycSA9IGlycTsKKworCS8qIEluaXRpYWxpemUgdGhlIHJlZ2lzdGVycyAqLworCWlmIChkb19pZHggPT0gMCkgeworCQlzdWJkZXZpY2UtPnBvcnRfcmVnID0gcmVnX2Jhc2UgKyBNRTgyMDBfRE9fUE9SVF8wX1JFRzsKKwl9IGVsc2UgaWYgKGRvX2lkeCA9PSAxKSB7CisJCXN1YmRldmljZS0+cG9ydF9yZWcgPSByZWdfYmFzZSArIE1FODIwMF9ET19QT1JUXzFfUkVHOworCX0gZWxzZSB7CisJCVBFUlJPUigiV3Jvbmcgc3ViZGV2aWNlIGlkeD0lZC5cbiIsIGRvX2lkeCk7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlzdWJkZXZpY2UtPmlycV9jdHJsX3JlZyA9IHJlZ19iYXNlICsgTUU4MjAwX0lSUV9NT0RFX1JFRzsKKwlzdWJkZXZpY2UtPmlycV9zdGF0dXNfcmVnID0gcmVnX2Jhc2UgKyBNRTgyMDBfRE9fSVJRX1NUQVRVU19SRUc7CisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwlzdWJkZXZpY2UtPnJlZ19iYXNlID0gcmVnX2Jhc2U7CisjZW5kaWYKKworCS8qIEluaXRpYWxpemUgdGhlIHdhaXQgcXVldWUgKi8KKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzdWJkZXZpY2UtPndhaXRfcXVldWUpOworCisJLyogUmVxdWVzdCB0aGUgaW50ZXJydXB0IGxpbmUgKi8KKwllcnIgPSByZXF1ZXN0X2lycShpcnEsIG1lODIwMF9kb19pc3IsCisjaWZkZWYgSVJRRl9ESVNBQkxFRAorCQkJICBJUlFGX0RJU0FCTEVEIHwgSVJRRl9TSEFSRUQsCisjZWxzZQorCQkJICBTQV9JTlRFUlJVUFQgfCBTQV9TSElSUSwKKyNlbmRpZgorCQkJICBNRTgyMDBfTkFNRSwgKHZvaWQgKilzdWJkZXZpY2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgaW50ZXJydXB0IGxpbmUuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCVBJTkZPKCJSZWdpc3RlcmVkIGlycT0lZC5cbiIsIGlycSk7CisKKwkvKiBPdmVybG9hZCBiYXNlIGNsYXNzIG1ldGhvZHMuICovCisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19pcnFfc3RhcnQgPSBtZTgyMDBfZG9faW9faXJxX3N0YXJ0OworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9faXJxX3dhaXQgPSBtZTgyMDBfZG9faW9faXJxX3dhaXQ7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19pcnFfc3RvcCA9IG1lODIwMF9kb19pb19pcnFfc3RvcDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSA9CisJICAgIG1lODIwMF9kb19pb19yZXNldF9zdWJkZXZpY2U7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfY29uZmlnID0KKwkgICAgbWU4MjAwX2RvX2lvX3NpbmdsZV9jb25maWc7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9pb19zaW5nbGVfcmVhZCA9IG1lODIwMF9kb19pb19zaW5nbGVfcmVhZDsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV93cml0ZSA9CisJICAgIG1lODIwMF9kb19pb19zaW5nbGVfd3JpdGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMgPQorCSAgICBtZTgyMDBfZG9fcXVlcnlfbnVtYmVyX2NoYW5uZWxzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGUgPQorCSAgICBtZTgyMDBfZG9fcXVlcnlfc3ViZGV2aWNlX3R5cGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyA9CisJICAgIG1lODIwMF9kb19xdWVyeV9zdWJkZXZpY2VfY2FwczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2Rlc3RydWN0b3IgPSBtZTgyMDBfZG9fZGVzdHJ1Y3RvcjsKKworCXN1YmRldmljZS0+cmlzZWQgPSAwOworCXN1YmRldmljZS0+Y291bnQgPSAwOworCisJcmV0dXJuIHN1YmRldmljZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZG8uaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzU4MTI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kby5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qKgorICogQGZpbGUgbWU4MjAwX2RvLmgKKyAqCisgKiBAYnJpZWYgTUUtODIwMCBkaWdpdGFsIG91dHB1dCBzdWJkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU4MjAwX0RPX0hfCisjZGVmaW5lIF9NRTgyMDBfRE9fSF8KKworI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFRoZSB0ZW1wbGF0ZSBzdWJkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lODIwMF9kb19zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJc3BpbmxvY2tfdCAqaXJxX21vZGVfbG9jazsKKworCWludCBpcnE7CQkJCS8qKjwgVGhlIG51bWJlciBvZiB0aGUgaW50ZXJydXB0IHJlcXVlc3QgKi8KKwlpbnQgcmlzZWQ7CQkJCS8qKjwgRmxhZyB0byBpbmRpY2F0ZSBpZiBhbiBpbnRlcnJ1cHQgb2NjdXJlZCAqLworCWludCBjb3VudDsJCQkJLyoqPCBDb3VudHMgdGhlIG51bWJlciBvZiBpbnRlcnJ1cHRzIG9jY3VyZWQgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3F1ZXVlOwkJLyoqPCBUbyB3YWl0IG9uIGludGVycnVwdHMgKi8KKworCXVuc2lnbmVkIGludCBkb19pZHg7CQkJLyoqPCBUaGUgbnVtYmVyIG9mIHRoZSBkaWdpdGFsIG91dHB1dCAqLworCisJdW5zaWduZWQgbG9uZyBwb3J0X3JlZzsJCQkvKio8IFRoZSBkaWdpdGFsIG91dHB1dCBwb3J0ICovCisJdW5zaWduZWQgbG9uZyBpcnFfY3RybF9yZWc7CQkvKio8IFRoZSBpbnRlcnJ1cHQgY29udHJvbCByZWdpc3RlciAqLworCXVuc2lnbmVkIGxvbmcgaXJxX3N0YXR1c19yZWc7CQkvKio8IFRoZSBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyICovCisjaWZkZWYgTUVERUJVR19ERUJVR19SRUcKKwl1bnNpZ25lZCBsb25nIHJlZ19iYXNlOworI2VuZGlmCit9IG1lODIwMF9kb19zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgTUUtODIwMCBkaWdpdGFsIG91dHB1dCBzdWJkZXZpY2UgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gZG9faWR4IFRoZSBpbmRleCBvZiB0aGUgZGlnaXRhbCBvdXRwdXQgc3ViZGV2aWNlIG9uIHRoaXMgZGV2aWNlLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byBuZXcgaW5zdGFuY2Ugb24gc3VjY2Vzcy5cbgorICogTlVMTCBvbiBlcnJvci4KKyAqLworbWU4MjAwX2RvX3N1YmRldmljZV90ICptZTgyMDBfZG9fY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGRvX2lkeCwKKwkJCQkJICAgICBpbnQgaXJxLAorCQkJCQkgICAgIHNwaW5sb2NrX3QgKiBpcnFfbW9kZV9sb2NrKTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZG9fcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2RvX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMDk1MDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2RvX3JlZy5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qKgorICogQGZpbGUgbWU4MjAwX2FvX3JlZy5oCisgKgorICogQGJyaWVmIE1FLTgyMDAgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU4MjAwX0RPX1JFR19IXworI2RlZmluZSBfTUU4MjAwX0RPX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FODIwMF9ET19JUlFfU1RBVFVTX1JFRwkJCTB4MAkvLyBSCisjZGVmaW5lIE1FODIwMF9ET19QT1JUXzBfUkVHCQkJCTB4MQkvLyBSL1cKKyNkZWZpbmUgTUU4MjAwX0RPX1BPUlRfMV9SRUcJCQkJMHgyCS8vIFIvVworCisjZGVmaW5lIE1FODIwMF9ET19JUlFfU1RBVFVTX0JJVF9BQ1RJVkUJCTB4MQorI2RlZmluZSBNRTgyMDBfRE9fSVJRX1NUQVRVU19TSElGVAkJCTEKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3M2ZlNGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX3JlZy5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qKgorICogQGZpbGUgbWU4MjAwX3JlZy5oCisgKgorICogQGJyaWVmIE1FLTgyMDAgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUU4MjAwX1JFR19IXworI2RlZmluZSBfTUU4MjAwX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FODIwMF9JUlFfTU9ERV9SRUcJCQkJMHhECS8vIFIvVworCisjZGVmaW5lIE1FODIwMF9JUlFfTU9ERV9NQVNLICAgICAJCQkweDMKKworI2RlZmluZSBNRTgyMDBfSVJRX01PREVfTUFTS19NQVNLCQkJMHgwCisjZGVmaW5lIE1FODIwMF9JUlFfTU9ERV9NQVNLX0NPTVBBUkUJCQkweDEKKworI2RlZmluZSBNRTgyMDBfSVJRX01PREVfQklUX0VOQUJMRV9QT1dFUgkJMHgxMAorI2RlZmluZSBNRTgyMDBfSVJRX01PREVfQklUX0NMRUFSX1BPV0VSCQkJMHg0MAorCisjZGVmaW5lIE1FODIwMF9JUlFfTU9ERV9ESV9TSElGVAkJCTIKKyNkZWZpbmUgTUU4MjAwX0lSUV9NT0RFX1BPV0VSX1NISUZUCQkJMQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODI1NC5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODI1NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNDRjM2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjU0LmMKQEAgLTAsMCArMSwxMTc2IEBACisvKioKKyAqIEBmaWxlIG1lODI1NC5jCisgKgorICogQGJyaWVmIDgyNTQgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvKgorICogSW5jbHVkZXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWU4MjU0X3JlZy5oIgorI2luY2x1ZGUgIm1lODI1NC5oIgorCisvKgorICogRGVmaW5lcworICovCisjZGVmaW5lIE1FODI1NF9OVU1CRVJfQ0hBTk5FTFMgMQkvKio8IE9uZSBjaGFubmVsIHBlciBjb3VudGVyLiAqLworI2RlZmluZSBNRTgyNTRfQ1RSX1dJRFRIIDE2CQkJLyoqPCBPbmUgY291bnRlciBoYXMgMTYgYml0cy4gKi8KKworLyoKKyAqIEZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbnQgbWU4MjU0X2lvX3Jlc2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBmbGFncykKK3sKKwltZTgyNTRfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQ4X3QgY2xrX3NyYzsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODI1NF9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCWlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAwKQorCQlvdXRiKE1FODI1NF9DVFJMX1NDMCB8IE1FODI1NF9DVFJMX0xNIHwgTUU4MjU0X0NUUkxfTTAgfAorCQkgICAgIE1FODI1NF9DVFJMX0JJTiwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwllbHNlIGlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAxKQorCQlvdXRiKE1FODI1NF9DVFJMX1NDMSB8IE1FODI1NF9DVFJMX0xNIHwgTUU4MjU0X0NUUkxfTTAgfAorCQkgICAgIE1FODI1NF9DVFJMX0JJTiwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwllbHNlCisJCW91dGIoTUU4MjU0X0NUUkxfU0MyIHwgTUU4MjU0X0NUUkxfTE0gfCBNRTgyNTRfQ1RSTF9NMCB8CisJCSAgICAgTUU4MjU0X0NUUkxfQklOLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKworCW91dGIoMHgwMCwgaW5zdGFuY2UtPnZhbF9yZWcpOworCW91dGIoMHgwMCwgaW5zdGFuY2UtPnZhbF9yZWcpOworCisJc3Bpbl9sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwljbGtfc3JjID0gaW5iKGluc3RhbmNlLT5jbGtfc3JjX3JlZyk7CisKKwlzd2l0Y2ggKGluc3RhbmNlLT5kZXZpY2VfaWQpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDAwOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEE6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQjoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNEUwOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RUE6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFQjoKKwkJaWYgKGluc3RhbmNlLT5tZTgyNTRfaWR4ID09IDApIHsKKwkJCWlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAwKQorCQkJCWNsa19zcmMgJj0KKwkJCQkgICAgfihNRTE0MDBBQl84MjU0X0FfMF9DTEtfU1JDXzEwTUhaIHwKKwkJCQkgICAgICBNRTE0MDBBQl84MjU0X0FfMF9DTEtfU1JDX1FVQVJaKTsKKwkJCWVsc2UgaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDEpCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMEFCXzgyNTRfQV8xX0NMS19TUkNfUFJFVik7CisJCQllbHNlCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMEFCXzgyNTRfQV8yX0NMS19TUkNfUFJFVik7CisJCX0gZWxzZSB7CisJCQlpZiAoaW5zdGFuY2UtPmN0cl9pZHggPT0gMCkKKwkJCQljbGtfc3JjICY9CisJCQkJICAgIH4oTUUxNDAwQUJfODI1NF9CXzBfQ0xLX1NSQ18xME1IWiB8CisJCQkJICAgICAgTUUxNDAwQUJfODI1NF9CXzBfQ0xLX1NSQ19RVUFSWik7CisJCQllbHNlIGlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAxKQorCQkJCWNsa19zcmMgJj0gfihNRTE0MDBBQl84MjU0X0JfMV9DTEtfU1JDX1BSRVYpOworCQkJZWxzZQorCQkJCWNsa19zcmMgJj0gfihNRTE0MDBBQl84MjU0X0JfMl9DTEtfU1JDX1BSRVYpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBEOgorCQlzd2l0Y2ggKGluc3RhbmNlLT5tZTgyNTRfaWR4KSB7CisJCWNhc2UgMDoKKwkJY2FzZSAyOgorCQljYXNlIDQ6CisJCWNhc2UgNjoKKwkJY2FzZSA4OgorCQkJaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDApCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMENEXzgyNTRfQUNFXzBfQ0xLX1NSQ19NQVNLKTsKKwkJCWVsc2UgaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDEpCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMENEXzgyNTRfQUNFXzFfQ0xLX1NSQ19NQVNLKTsKKwkJCWVsc2UKKwkJCQljbGtfc3JjICY9IH4oTUUxNDAwQ0RfODI1NF9BQ0VfMl9DTEtfU1JDX01BU0spOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAwKQorCQkJCWNsa19zcmMgJj0gfihNRTE0MDBDRF84MjU0X0JEXzBfQ0xLX1NSQ19NQVNLKTsKKwkJCWVsc2UgaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDEpCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMENEXzgyNTRfQkRfMV9DTEtfU1JDX01BU0spOworCQkJZWxzZQorCQkJCWNsa19zcmMgJj0gfihNRTE0MDBDRF84MjU0X0JEXzJfQ0xLX1NSQ19NQVNLKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDYxMDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjBJOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjBTOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjBJUzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBJOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBTOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBJUzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBJOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBTOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBJUzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU4MTAwX0E6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODEwMF9COgorCisJCS8qIE5vIGNsb2NrIHNvdXJjZSByZWdpc3RlciBhdmFpbGFibGUgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZGV2aWNlIHR5cGUuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJaWYgKCFlcnIpCisJCW91dGIoY2xrX3NyYywgaW5zdGFuY2UtPmNsa19zcmNfcmVnKTsKKworCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTE0MDBfYWJfcmVmX2NvbmZpZyhtZTgyNTRfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgaW50IHJlZikKK3sKKwl1aW50OF90IGNsa19zcmM7CisKKwlzcGluX2xvY2soaW5zdGFuY2UtPmNsa19zcmNfcmVnX2xvY2spOworCWNsa19zcmMgPSBpbmIoaW5zdGFuY2UtPmNsa19zcmNfcmVnKTsKKworCXN3aXRjaCAocmVmKSB7CisJY2FzZSBNRV9SRUZfQ1RSX0VYVEVSTkFMOgorCQlpZiAoaW5zdGFuY2UtPm1lODI1NF9pZHggPT0gMCkgeworCQkJaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDApCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMEFCXzgyNTRfQV8wX0NMS19TUkNfUVVBUlopOworCQkJZWxzZSBpZiAoaW5zdGFuY2UtPmN0cl9pZHggPT0gMSkKKwkJCQljbGtfc3JjICY9IH4oTUUxNDAwQUJfODI1NF9BXzFfQ0xLX1NSQ19QUkVWKTsKKwkJCWVsc2UKKwkJCQljbGtfc3JjICY9IH4oTUUxNDAwQUJfODI1NF9BXzJfQ0xLX1NSQ19QUkVWKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAwKQorCQkJCWNsa19zcmMgJj0gfihNRTE0MDBBQl84MjU0X0JfMF9DTEtfU1JDX1FVQVJaKTsKKwkJCWVsc2UgaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDEpCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMEFCXzgyNTRfQl8xX0NMS19TUkNfUFJFVik7CisJCQllbHNlCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMEFCXzgyNTRfQl8yX0NMS19TUkNfUFJFVik7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgTUVfUkVGX0NUUl9QUkVWSU9VUzoKKwkJaWYgKGluc3RhbmNlLT5tZTgyNTRfaWR4ID09IDApIHsKKwkJCWlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAwKSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHJlZmVyZW5jZS5cbiIpOworCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfSBlbHNlIGlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAxKQorCQkJCWNsa19zcmMgfD0gKE1FMTQwMEFCXzgyNTRfQV8xX0NMS19TUkNfUFJFVik7CisJCQllbHNlCisJCQkJY2xrX3NyYyB8PSAoTUUxNDAwQUJfODI1NF9BXzJfQ0xLX1NSQ19QUkVWKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAwKSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHJlZmVyZW5jZS5cbiIpOworCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfSBlbHNlIGlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAxKQorCQkJCWNsa19zcmMgfD0gKE1FMTQwMEFCXzgyNTRfQl8xX0NMS19TUkNfUFJFVik7CisJCQllbHNlCisJCQkJY2xrX3NyYyB8PSAoTUUxNDAwQUJfODI1NF9CXzJfQ0xLX1NSQ19QUkVWKTsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBNRV9SRUZfQ1RSX0lOVEVSTkFMXzFNSFo6CisJCWlmIChpbnN0YW5jZS0+bWU4MjU0X2lkeCA9PSAwKSB7CisJCQlpZiAoaW5zdGFuY2UtPmN0cl9pZHggPT0gMCkgeworCQkJCWNsa19zcmMgfD0gKE1FMTQwMEFCXzgyNTRfQV8wX0NMS19TUkNfUVVBUlopOworCQkJCWNsa19zcmMgJj0gfihNRTE0MDBBQl84MjU0X0FfMF9DTEtfU1JDXzEwTUhaKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHJlZmVyZW5jZS5cbiIpOworCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDApIHsKKwkJCQljbGtfc3JjIHw9IChNRTE0MDBBQl84MjU0X0JfMF9DTEtfU1JDX1FVQVJaKTsKKwkJCQljbGtfc3JjICY9IH4oTUUxNDAwQUJfODI1NF9CXzBfQ0xLX1NSQ18xME1IWik7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiSW52YWxpZCByZWZlcmVuY2UuXG4iKTsKKwkJCQlzcGluX3VubG9jayhpbnN0YW5jZS0+Y2xrX3NyY19yZWdfbG9jayk7CisJCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJCX0KKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBNRV9SRUZfQ1RSX0lOVEVSTkFMXzEwTUhaOgorCQlpZiAoaW5zdGFuY2UtPm1lODI1NF9pZHggPT0gMCkgeworCQkJaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDApIHsKKwkJCQljbGtfc3JjIHw9IChNRTE0MDBBQl84MjU0X0FfMF9DTEtfU1JDX1FVQVJaKTsKKwkJCQljbGtfc3JjIHw9IChNRTE0MDBBQl84MjU0X0FfMF9DTEtfU1JDXzEwTUhaKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHJlZmVyZW5jZS5cbiIpOworCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDApIHsKKwkJCQljbGtfc3JjIHw9IChNRTE0MDBBQl84MjU0X0FfMF9DTEtfU1JDX1FVQVJaKTsKKwkJCQljbGtfc3JjIHw9IChNRTE0MDBBQl84MjU0X0FfMF9DTEtfU1JDXzEwTUhaKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHJlZmVyZW5jZS5cbiIpOworCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQkJfQorCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgcmVmZXJlbmNlLlxuIik7CisJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfUkVGOworCX0KKworCW91dGIoY2xrX3NyYywgaW5zdGFuY2UtPmNsa19zcmNfcmVnKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y2xrX3NyY19yZWdfbG9jayk7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTE0MDBfY2RfcmVmX2NvbmZpZyhtZTgyNTRfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgaW50IHJlZikKK3sKKwl1aW50OF90IGNsa19zcmM7CisKKwlzcGluX2xvY2soaW5zdGFuY2UtPmNsa19zcmNfcmVnX2xvY2spOworCWNsa19zcmMgPSBpbmIoaW5zdGFuY2UtPmNsa19zcmNfcmVnKTsKKworCXN3aXRjaCAocmVmKSB7CisJY2FzZSBNRV9SRUZfQ1RSX0VYVEVSTkFMOgorCQlzd2l0Y2ggKGluc3RhbmNlLT5tZTgyNTRfaWR4KSB7CisJCWNhc2UgMDoKKwkJY2FzZSAyOgorCQljYXNlIDQ6CisJCWNhc2UgNjoKKwkJY2FzZSA4OgorCQkJaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDApCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMENEXzgyNTRfQUNFXzBfQ0xLX1NSQ19NQVNLKTsKKwkJCWVsc2UgaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDEpCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMENEXzgyNTRfQUNFXzFfQ0xLX1NSQ19NQVNLKTsKKwkJCWVsc2UKKwkJCQljbGtfc3JjICY9IH4oTUUxNDAwQ0RfODI1NF9BQ0VfMl9DTEtfU1JDX01BU0spOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAwKQorCQkJCWNsa19zcmMgJj0gfihNRTE0MDBDRF84MjU0X0JEXzBfQ0xLX1NSQ19NQVNLKTsKKwkJCWVsc2UgaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDEpCisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMENEXzgyNTRfQkRfMV9DTEtfU1JDX01BU0spOworCQkJZWxzZQorCQkJCWNsa19zcmMgJj0gfihNRTE0MDBDRF84MjU0X0JEXzJfQ0xLX1NSQ19NQVNLKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNRV9SRUZfQ1RSX1BSRVZJT1VTOgorCQlzd2l0Y2ggKGluc3RhbmNlLT5tZTgyNTRfaWR4KSB7CisJCWNhc2UgMDoKKwkJY2FzZSAyOgorCQljYXNlIDQ6CisJCWNhc2UgNjoKKwkJY2FzZSA4OgorCQkJaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDApIHsKKwkJCQljbGtfc3JjICY9IH4oTUUxNDAwQ0RfODI1NF9BQ0VfMF9DTEtfU1JDX01BU0spOworCQkJCWNsa19zcmMgfD0gKE1FMTQwMENEXzgyNTRfQUNFXzBfQ0xLX1NSQ19QUkVWKTsKKwkJCX0gZWxzZSBpZiAoaW5zdGFuY2UtPmN0cl9pZHggPT0gMSkgeworCQkJCWNsa19zcmMgJj0gfihNRTE0MDBDRF84MjU0X0FDRV8xX0NMS19TUkNfTUFTSyk7CisJCQkJY2xrX3NyYyB8PSAoTUUxNDAwQ0RfODI1NF9BQ0VfMV9DTEtfU1JDX1BSRVYpOworCQkJfSBlbHNlIHsKKwkJCQljbGtfc3JjICY9IH4oTUUxNDAwQ0RfODI1NF9BQ0VfMl9DTEtfU1JDX01BU0spOworCQkJCWNsa19zcmMgfD0gKE1FMTQwMENEXzgyNTRfQUNFXzJfQ0xLX1NSQ19QUkVWKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlpZiAoaW5zdGFuY2UtPmN0cl9pZHggPT0gMCkgeworCQkJCWNsa19zcmMgJj0gfihNRTE0MDBDRF84MjU0X0JEXzBfQ0xLX1NSQ19NQVNLKTsKKwkJCQljbGtfc3JjIHw9IChNRTE0MDBDRF84MjU0X0JEXzBfQ0xLX1NSQ19QUkVWKTsKKwkJCX0gZWxzZSBpZiAoaW5zdGFuY2UtPmN0cl9pZHggPT0gMSkgeworCQkJCWNsa19zcmMgJj0gfihNRTE0MDBDRF84MjU0X0JEXzFfQ0xLX1NSQ19NQVNLKTsKKwkJCQljbGtfc3JjIHw9IChNRTE0MDBDRF84MjU0X0JEXzFfQ0xLX1NSQ19QUkVWKTsKKwkJCX0gZWxzZSB7CisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMENEXzgyNTRfQkRfMl9DTEtfU1JDX01BU0spOworCQkJCWNsa19zcmMgfD0gKE1FMTQwMENEXzgyNTRfQkRfMl9DTEtfU1JDX1BSRVYpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgTUVfUkVGX0NUUl9JTlRFUk5BTF8xTUhaOgorCQlzd2l0Y2ggKGluc3RhbmNlLT5tZTgyNTRfaWR4KSB7CisJCWNhc2UgMDoKKwkJY2FzZSAyOgorCQljYXNlIDQ6CisJCWNhc2UgNjoKKwkJY2FzZSA4OgorCQkJaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDApIHsKKwkJCQljbGtfc3JjICY9IH4oTUUxNDAwQ0RfODI1NF9BQ0VfMF9DTEtfU1JDX01BU0spOworCQkJCWNsa19zcmMgfD0gKE1FMTQwMENEXzgyNTRfQUNFXzBfQ0xLX1NSQ18xTUhaKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHJlZmVyZW5jZS5cbiIpOworCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SRUY7CisJCQl9CisKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlpZiAoaW5zdGFuY2UtPmN0cl9pZHggPT0gMCkgeworCQkJCWNsa19zcmMgJj0gfihNRTE0MDBDRF84MjU0X0JEXzBfQ0xLX1NSQ19NQVNLKTsKKwkJCQljbGtfc3JjIHw9IChNRTE0MDBDRF84MjU0X0JEXzBfQ0xLX1NSQ18xTUhaKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHJlZmVyZW5jZS5cbiIpOworCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SRUY7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBNRV9SRUZfQ1RSX0lOVEVSTkFMXzEwTUhaOgorCQlzd2l0Y2ggKGluc3RhbmNlLT5tZTgyNTRfaWR4KSB7CisJCWNhc2UgMDoKKwkJY2FzZSAyOgorCQljYXNlIDQ6CisJCWNhc2UgNjoKKwkJY2FzZSA4OgorCQkJaWYgKGluc3RhbmNlLT5jdHJfaWR4ID09IDApIHsKKwkJCQljbGtfc3JjICY9IH4oTUUxNDAwQ0RfODI1NF9BQ0VfMF9DTEtfU1JDX01BU0spOworCQkJCWNsa19zcmMgfD0gKE1FMTQwMENEXzgyNTRfQUNFXzBfQ0xLX1NSQ18xME1IWik7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiSW52YWxpZCByZWZlcmVuY2UuXG4iKTsKKwkJCQlzcGluX3VubG9jayhpbnN0YW5jZS0+Y2xrX3NyY19yZWdfbG9jayk7CisJCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfUkVGOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAwKSB7CisJCQkJY2xrX3NyYyAmPSB+KE1FMTQwMENEXzgyNTRfQkRfMF9DTEtfU1JDX01BU0spOworCQkJCWNsa19zcmMgfD0gKE1FMTQwMENEXzgyNTRfQkRfMF9DTEtfU1JDXzEwTUhaKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJJbnZhbGlkIHJlZmVyZW5jZS5cbiIpOworCQkJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SRUY7CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgcmVmZXJlbmNlLlxuIik7CisJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfUkVGOworCX0KKworCW91dGIoY2xrX3NyYywgaW5zdGFuY2UtPmNsa19zcmNfcmVnKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y2xrX3NyY19yZWdfbG9jayk7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTQ2MDBfcmVmX2NvbmZpZyhtZTgyNTRfc3ViZGV2aWNlX3QgKiBpbnN0YW5jZSwgaW50IHJlZikKK3sKKwlzd2l0Y2ggKHJlZikgeworCisJY2FzZSBNRV9SRUZfQ1RSX0VYVEVSTkFMOgorCQkvLyBOb3RoaW5nIHRvIGRvCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIHJlZmVyZW5jZS5cbiIpOworLy8gICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2soaW5zdGFuY2UtPmNsa19zcmNfcmVnX2xvY2spOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9SRUY7CisJfQorCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MTAwX3JlZl9jb25maWcobWU4MjU0X3N1YmRldmljZV90ICogaW5zdGFuY2UsIGludCByZWYpCit7CisJc3dpdGNoIChyZWYpIHsKKworCWNhc2UgTUVfUkVGX0NUUl9FWFRFUk5BTDoKKwkJLy8gTm90aGluZyB0byBkbworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCByZWZlcmVuY2UuXG4iKTsKKy8vICAgICAgICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrKGluc3RhbmNlLT5jbGtfc3JjX3JlZ19sb2NrKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfUkVGOworCX0KKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODI1NF9pb19zaW5nbGVfY29uZmlnKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgaW50IGNoYW5uZWwsCisJCQkJICAgaW50IHNpbmdsZV9jb25maWcsCisJCQkJICAgaW50IHJlZiwKKwkJCQkgICBpbnQgdHJpZ19jaGFuLAorCQkJCSAgIGludCB0cmlnX3R5cGUsIGludCB0cmlnX2VkZ2UsIGludCBmbGFncykKK3sKKwltZTgyNTRfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnI7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCWluc3RhbmNlID0gKG1lODI1NF9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwkvLyBDb25maWd1cmUgdGhlIGNvdW50ZXIgbW9kZXMKKwlpZiAoaW5zdGFuY2UtPmN0cl9pZHggPT0gMCkgeworCQlpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0NUUl84MjU0X01PREVfMCkgeworCQkJb3V0YihNRTgyNTRfQ1RSTF9TQzAgfCBNRTgyNTRfQ1RSTF9MTSB8IE1FODI1NF9DVFJMX00wIHwKKwkJCSAgICAgTUU4MjU0X0NUUkxfQklOLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19DVFJfODI1NF9NT0RFXzEpIHsKKwkJCW91dGIoTUU4MjU0X0NUUkxfU0MwIHwgTUU4MjU0X0NUUkxfTE0gfCBNRTgyNTRfQ1RSTF9NMSB8CisJCQkgICAgIE1FODI1NF9DVFJMX0JJTiwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJfSBlbHNlIGlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfQ1RSXzgyNTRfTU9ERV8yKSB7CisJCQlvdXRiKE1FODI1NF9DVFJMX1NDMCB8IE1FODI1NF9DVFJMX0xNIHwgTUU4MjU0X0NUUkxfTTIgfAorCQkJICAgICBNRTgyNTRfQ1RSTF9CSU4sIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCX0gZWxzZSBpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0NUUl84MjU0X01PREVfMykgeworCQkJb3V0YihNRTgyNTRfQ1RSTF9TQzAgfCBNRTgyNTRfQ1RSTF9MTSB8IE1FODI1NF9DVFJMX00zIHwKKwkJCSAgICAgTUU4MjU0X0NUUkxfQklOLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19DVFJfODI1NF9NT0RFXzQpIHsKKwkJCW91dGIoTUU4MjU0X0NUUkxfU0MwIHwgTUU4MjU0X0NUUkxfTE0gfCBNRTgyNTRfQ1RSTF9NNCB8CisJCQkgICAgIE1FODI1NF9DVFJMX0JJTiwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJfSBlbHNlIGlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfQ1RSXzgyNTRfTU9ERV81KSB7CisJCQlvdXRiKE1FODI1NF9DVFJMX1NDMCB8IE1FODI1NF9DVFJMX0xNIHwgTUU4MjU0X0NUUkxfTTUgfAorCQkJICAgICBNRTgyNTRfQ1RSTF9CSU4sIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgc2luZ2xlIGNvbmZpZ3VyYXRpb24uXG4iKTsKKwkJCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJfQorCX0gZWxzZSBpZiAoaW5zdGFuY2UtPmN0cl9pZHggPT0gMSkgeworCQlpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0NUUl84MjU0X01PREVfMCkgeworCQkJb3V0YihNRTgyNTRfQ1RSTF9TQzEgfCBNRTgyNTRfQ1RSTF9MTSB8IE1FODI1NF9DVFJMX00wIHwKKwkJCSAgICAgTUU4MjU0X0NUUkxfQklOLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19DVFJfODI1NF9NT0RFXzEpIHsKKwkJCW91dGIoTUU4MjU0X0NUUkxfU0MxIHwgTUU4MjU0X0NUUkxfTE0gfCBNRTgyNTRfQ1RSTF9NMSB8CisJCQkgICAgIE1FODI1NF9DVFJMX0JJTiwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJfSBlbHNlIGlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfQ1RSXzgyNTRfTU9ERV8yKSB7CisJCQlvdXRiKE1FODI1NF9DVFJMX1NDMSB8IE1FODI1NF9DVFJMX0xNIHwgTUU4MjU0X0NUUkxfTTIgfAorCQkJICAgICBNRTgyNTRfQ1RSTF9CSU4sIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCX0gZWxzZSBpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0NUUl84MjU0X01PREVfMykgeworCQkJb3V0YihNRTgyNTRfQ1RSTF9TQzEgfCBNRTgyNTRfQ1RSTF9MTSB8IE1FODI1NF9DVFJMX00zIHwKKwkJCSAgICAgTUU4MjU0X0NUUkxfQklOLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19DVFJfODI1NF9NT0RFXzQpIHsKKwkJCW91dGIoTUU4MjU0X0NUUkxfU0MxIHwgTUU4MjU0X0NUUkxfTE0gfCBNRTgyNTRfQ1RSTF9NNCB8CisJCQkgICAgIE1FODI1NF9DVFJMX0JJTiwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJfSBlbHNlIGlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfQ1RSXzgyNTRfTU9ERV81KSB7CisJCQlvdXRiKE1FODI1NF9DVFJMX1NDMSB8IE1FODI1NF9DVFJMX0xNIHwgTUU4MjU0X0NUUkxfTTUgfAorCQkJICAgICBNRTgyNTRfQ1RSTF9CSU4sIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgc2luZ2xlIGNvbmZpZ3VyYXRpb24uXG4iKTsKKwkJCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCQkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfQ1RSXzgyNTRfTU9ERV8wKSB7CisJCQlvdXRiKE1FODI1NF9DVFJMX1NDMiB8IE1FODI1NF9DVFJMX0xNIHwgTUU4MjU0X0NUUkxfTTAgfAorCQkJICAgICBNRTgyNTRfQ1RSTF9CSU4sIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCX0gZWxzZSBpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0NUUl84MjU0X01PREVfMSkgeworCQkJb3V0YihNRTgyNTRfQ1RSTF9TQzIgfCBNRTgyNTRfQ1RSTF9MTSB8IE1FODI1NF9DVFJMX00xIHwKKwkJCSAgICAgTUU4MjU0X0NUUkxfQklOLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19DVFJfODI1NF9NT0RFXzIpIHsKKwkJCW91dGIoTUU4MjU0X0NUUkxfU0MyIHwgTUU4MjU0X0NUUkxfTE0gfCBNRTgyNTRfQ1RSTF9NMiB8CisJCQkgICAgIE1FODI1NF9DVFJMX0JJTiwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJfSBlbHNlIGlmIChzaW5nbGVfY29uZmlnID09IE1FX1NJTkdMRV9DT05GSUdfQ1RSXzgyNTRfTU9ERV8zKSB7CisJCQlvdXRiKE1FODI1NF9DVFJMX1NDMiB8IE1FODI1NF9DVFJMX0xNIHwgTUU4MjU0X0NUUkxfTTMgfAorCQkJICAgICBNRTgyNTRfQ1RSTF9CSU4sIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCX0gZWxzZSBpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0NUUl84MjU0X01PREVfNCkgeworCQkJb3V0YihNRTgyNTRfQ1RSTF9TQzIgfCBNRTgyNTRfQ1RSTF9MTSB8IE1FODI1NF9DVFJMX000IHwKKwkJCSAgICAgTUU4MjU0X0NUUkxfQklOLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19DVFJfODI1NF9NT0RFXzUpIHsKKwkJCW91dGIoTUU4MjU0X0NUUkxfU0MyIHwgTUU4MjU0X0NUUkxfTE0gfCBNRTgyNTRfQ1RSTF9NNSB8CisJCQkgICAgIE1FODI1NF9DVFJMX0JJTiwgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBzaW5nbGUgY29uZmlndXJhdGlvbi5cbiIpOworCQkJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCQl9CisJfQorCisJc3dpdGNoIChpbnN0YW5jZS0+ZGV2aWNlX2lkKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwMDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNEUwOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEE6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFQToKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBCOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RUI6CisJCWVyciA9IG1lMTQwMF9hYl9yZWZfY29uZmlnKGluc3RhbmNlLCByZWYpOworCisJCWlmIChlcnIpIHsKKwkJCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBEOgorCQllcnIgPSBtZTE0MDBfY2RfcmVmX2NvbmZpZyhpbnN0YW5jZSwgcmVmKTsKKworCQlpZiAoZXJyKSB7CisJCQlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2MTA6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwSToKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwUzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwSVM6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwSToKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwUzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwSVM6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY4MDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwSToKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwUzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwSVM6CisJCWVyciA9IG1lNDYwMF9yZWZfY29uZmlnKGluc3RhbmNlLCByZWYpOworCisJCWlmIChlcnIpIHsKKwkJCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODEwMF9BOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTgxMDBfQjoKKwkJZXJyID0gbWU4MTAwX3JlZl9jb25maWcoaW5zdGFuY2UsIHJlZik7CisKKwkJaWYgKGVycikgeworCQkJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJCQlyZXR1cm4gZXJyOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgZGV2aWNlIHR5cGUuXG4iKTsKKworCQlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2soaW5zdGFuY2UtPmNsa19zcmNfcmVnX2xvY2spOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TSU5HTEVfQ09ORklHOworCX0KKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjU0X2lvX3NpbmdsZV9yZWFkKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSBpbnQgY2hhbm5lbCwKKwkJCQkgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU4MjU0X3N1YmRldmljZV90ICppbnN0YW5jZTsKKwl1aW50MTZfdCBsb19ieXRlOworCXVpbnQxNl90IGhpX2J5dGU7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCWluc3RhbmNlID0gKG1lODI1NF9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCWlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAwKQorCQlvdXRiKE1FODI1NF9DVFJMX1NDMCB8IE1FODI1NF9DVFJMX1RMTywgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwllbHNlIGlmIChpbnN0YW5jZS0+Y3RyX2lkeCA9PSAxKQorCQlvdXRiKE1FODI1NF9DVFJMX1NDMSB8IE1FODI1NF9DVFJMX1RMTywgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwllbHNlCisJCW91dGIoTUU4MjU0X0NUUkxfU0MyIHwgTUU4MjU0X0NUUkxfVExPLCBpbnN0YW5jZS0+Y3RybF9yZWcpOworCisJbG9fYnl0ZSA9IGluYihpbnN0YW5jZS0+dmFsX3JlZyk7CisJaGlfYnl0ZSA9IGluYihpbnN0YW5jZS0+dmFsX3JlZyk7CisJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCisJKnZhbHVlID0gbG9fYnl0ZSB8IChoaV9ieXRlIDw8IDgpOworCXNwaW5fdW5sb2NrKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2spOworCisJTUVfU1VCREVWSUNFX0VYSVQ7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTgyNTRfaW9fc2luZ2xlX3dyaXRlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgIGludCBjaGFubmVsLAorCQkJCSAgaW50IHZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTgyNTRfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaWYgKGNoYW5uZWwpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNoYW5uZWwuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwl9CisKKwlpbnN0YW5jZSA9IChtZTgyNTRfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCisJaWYgKGZsYWdzKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJb3V0Yih2YWx1ZSwgaW5zdGFuY2UtPnZhbF9yZWcpOworCW91dGIoKHZhbHVlID4+IDgpLCBpbnN0YW5jZS0+dmFsX3JlZyk7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODI1NF9xdWVyeV9udW1iZXJfY2hhbm5lbHMoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQlpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm51bWJlciA9IE1FODI1NF9OVU1CRVJfQ0hBTk5FTFM7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjU0X3F1ZXJ5X3N1YmRldmljZV90eXBlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgICAgICAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSp0eXBlID0gTUVfVFlQRV9DVFI7CisJKnN1YnR5cGUgPSBNRV9TVUJUWVBFX0NUUl84MjU0OworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODI1NF9xdWVyeV9zdWJkZXZpY2VfY2FwcyhzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgICAgIGludCAqY2FwcykKK3sKKwltZTgyNTRfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlpbnN0YW5jZSA9IChtZTgyNTRfc3ViZGV2aWNlX3QgKikgc3ViZGV2aWNlOworCSpjYXBzID0gaW5zdGFuY2UtPmNhcHM7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjU0X3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3Moc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgICAgaW50IGNhcCwgaW50ICphcmdzLCBpbnQgY291bnQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaWYgKGNvdW50ICE9IDEpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNhcGFiaWxpdHkgYXJndW1lbnQgY291bnQuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0FQX0FSR19DT1VOVDsKKwl9CisKKwlpZiAoY2FwID09IE1FX0NBUF9DVFJfV0lEVEgpIHsKKwkJYXJnc1swXSA9IE1FODI1NF9DVFJfV0lEVEg7CisJfSBlbHNlIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGNhcGFiaWxpdHkuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfQ0FQOworCX0KKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgdWludDMyX3QgbWUxNDAwQUJfZ2V0X3ZhbF9yZWcodWludDMyX3QgcmVnX2Jhc2UsIHVuc2lnbmVkIGludCBtZTgyNTRfaWR4LAorCQkJCSAgICAgdW5zaWduZWQgaW50IGN0cl9pZHgpCit7CisJc3dpdGNoIChtZTgyNTRfaWR4KSB7CisKKwljYXNlIDA6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBBQl84MjU0X0FfMF9WQUxfUkVHICsgY3RyX2lkeCk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwQUJfODI1NF9CXzBfVkFMX1JFRyArIGN0cl9pZHgpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdWludDMyX3QgbWUxNDAwQUJfZ2V0X2N0cmxfcmVnKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBtZTgyNTRfaWR4LAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBjdHJfaWR4KQoreworCXN3aXRjaCAobWU4MjU0X2lkeCkgeworCWNhc2UgMDoKKwkJcmV0dXJuIChyZWdfYmFzZSArIE1FMTQwMEFCXzgyNTRfQV9DVFJMX1JFRyk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwQUJfODI1NF9CX0NUUkxfUkVHKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVpbnQzMl90IG1lMTQwMEFCX2dldF9jbGtfc3JjX3JlZyh1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJIHVuc2lnbmVkIGludCBtZTgyNTRfaWR4LAorCQkJCQkgdW5zaWduZWQgaW50IGN0cl9pZHgpCit7CisJc3dpdGNoIChtZTgyNTRfaWR4KSB7CisJY2FzZSAwOgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwQUJfQ0xLX1NSQ19SRUcpOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIChyZWdfYmFzZSArIE1FMTQwMEFCX0NMS19TUkNfUkVHKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVpbnQzMl90IG1lMTQwMENEX2dldF92YWxfcmVnKHVpbnQzMl90IHJlZ19iYXNlLCB1bnNpZ25lZCBpbnQgbWU4MjU0X2lkeCwKKwkJCQkgICAgIHVuc2lnbmVkIGludCBjdHJfaWR4KQoreworCXN3aXRjaCAobWU4MjU0X2lkeCkgeworCWNhc2UgMDoKKwkJcmV0dXJuIChyZWdfYmFzZSArIE1FMTQwMENfODI1NF9BXzBfVkFMX1JFRyArIGN0cl9pZHgpOworCisJY2FzZSAxOgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwQ184MjU0X0JfMF9WQUxfUkVHICsgY3RyX2lkeCk7CisKKwljYXNlIDI6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBDXzgyNTRfQ18wX1ZBTF9SRUcgKyBjdHJfaWR4KTsKKworCWNhc2UgMzoKKwkJcmV0dXJuIChyZWdfYmFzZSArIE1FMTQwMENfODI1NF9EXzBfVkFMX1JFRyArIGN0cl9pZHgpOworCisJY2FzZSA0OgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwQ184MjU0X0VfMF9WQUxfUkVHICsgY3RyX2lkeCk7CisKKwljYXNlIDU6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBEXzgyNTRfQV8wX1ZBTF9SRUcgKyBjdHJfaWR4KTsKKworCWNhc2UgNjoKKwkJcmV0dXJuIChyZWdfYmFzZSArIE1FMTQwMERfODI1NF9CXzBfVkFMX1JFRyArIGN0cl9pZHgpOworCisJY2FzZSA3OgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwRF84MjU0X0NfMF9WQUxfUkVHICsgY3RyX2lkeCk7CisKKwljYXNlIDg6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBEXzgyNTRfRF8wX1ZBTF9SRUcgKyBjdHJfaWR4KTsKKworCWRlZmF1bHQ6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBEXzgyNTRfRV8wX1ZBTF9SRUcgKyBjdHJfaWR4KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVpbnQzMl90IG1lMTQwMENEX2dldF9jdHJsX3JlZyh1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgbWU4MjU0X2lkeCwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgY3RyX2lkeCkKK3sKKwlzd2l0Y2ggKG1lODI1NF9pZHgpIHsKKwljYXNlIDA6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBDXzgyNTRfQV9DVFJMX1JFRyk7CisKKwljYXNlIDE6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBDXzgyNTRfQl9DVFJMX1JFRyk7CisKKwljYXNlIDI6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBDXzgyNTRfQ19DVFJMX1JFRyk7CisKKwljYXNlIDM6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBDXzgyNTRfRF9DVFJMX1JFRyk7CisKKwljYXNlIDQ6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBDXzgyNTRfRV9DVFJMX1JFRyk7CisKKwljYXNlIDU6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBEXzgyNTRfQV9DVFJMX1JFRyk7CisKKwljYXNlIDY6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBEXzgyNTRfQl9DVFJMX1JFRyk7CisKKwljYXNlIDc6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBEXzgyNTRfQ19DVFJMX1JFRyk7CisKKwljYXNlIDg6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBEXzgyNTRfRF9DVFJMX1JFRyk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwRF84MjU0X0VfQ1RSTF9SRUcpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdWludDMyX3QgbWUxNDAwQ0RfZ2V0X2Nsa19zcmNfcmVnKHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCQkgdW5zaWduZWQgaW50IG1lODI1NF9pZHgsCisJCQkJCSB1bnNpZ25lZCBpbnQgY3RyX2lkeCkKK3sKKwlzd2l0Y2ggKG1lODI1NF9pZHgpIHsKKwljYXNlIDA6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBDX0NMS19TUkNfMF9SRUcpOworCisJY2FzZSAxOgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwQ19DTEtfU1JDXzBfUkVHKTsKKworCWNhc2UgMjoKKwkJcmV0dXJuIChyZWdfYmFzZSArIE1FMTQwMENfQ0xLX1NSQ18xX1JFRyk7CisKKwljYXNlIDM6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBDX0NMS19TUkNfMV9SRUcpOworCisJY2FzZSA0OgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwQ19DTEtfU1JDXzJfUkVHKTsKKworCWNhc2UgNToKKwkJcmV0dXJuIChyZWdfYmFzZSArIE1FMTQwMERfQ0xLX1NSQ18wX1JFRyk7CisKKwljYXNlIDY6CisJCXJldHVybiAocmVnX2Jhc2UgKyBNRTE0MDBEX0NMS19TUkNfMF9SRUcpOworCisJY2FzZSA3OgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwRF9DTEtfU1JDXzFfUkVHKTsKKworCWNhc2UgODoKKwkJcmV0dXJuIChyZWdfYmFzZSArIE1FMTQwMERfQ0xLX1NSQ18xX1JFRyk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gKHJlZ19iYXNlICsgTUUxNDAwRF9DTEtfU1JDXzJfUkVHKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVpbnQzMl90IG1lNDYwMF9nZXRfdmFsX3JlZyh1aW50MzJfdCByZWdfYmFzZSwgdW5zaWduZWQgaW50IG1lODI1NF9pZHgsCisJCQkJICAgdW5zaWduZWQgaW50IGN0cl9pZHgpCit7CisJcmV0dXJuIChyZWdfYmFzZSArIE1FNDYwMF84MjU0XzBfVkFMX1JFRyArIGN0cl9pZHgpOworfQorCitzdGF0aWMgdWludDMyX3QgbWU0NjAwX2dldF9jdHJsX3JlZyh1aW50MzJfdCByZWdfYmFzZSwgdW5zaWduZWQgaW50IG1lODI1NF9pZHgsCisJCQkJICAgIHVuc2lnbmVkIGludCBjdHJfaWR4KQoreworCXJldHVybiAocmVnX2Jhc2UgKyBNRTQ2MDBfODI1NF9DVFJMX1JFRyk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBtZTgxMDBfZ2V0X3ZhbF9yZWcodWludDMyX3QgcmVnX2Jhc2UsIHVuc2lnbmVkIGludCBtZTgyNTRfaWR4LAorCQkJCSAgIHVuc2lnbmVkIGludCBjdHJfaWR4KQoreworCXJldHVybiAocmVnX2Jhc2UgKyBNRTgxMDBfQ09VTlRFUl9SRUdfMCArIGN0cl9pZHggKiAyKTsKK30KKworc3RhdGljIHVpbnQzMl90IG1lODEwMF9nZXRfY3RybF9yZWcodWludDMyX3QgcmVnX2Jhc2UsIHVuc2lnbmVkIGludCBtZTgyNTRfaWR4LAorCQkJCSAgICB1bnNpZ25lZCBpbnQgY3RyX2lkeCkKK3sKKwlyZXR1cm4gKHJlZ19iYXNlICsgTUU4MTAwX0NPVU5URVJfQ1RSTF9SRUcpOworfQorCittZTgyNTRfc3ViZGV2aWNlX3QgKm1lODI1NF9jb25zdHJ1Y3Rvcih1aW50MzJfdCBkZXZpY2VfaWQsCisJCQkJICAgICAgIHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbWU4MjU0X2lkeCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IGN0cl9pZHgsCisJCQkJICAgICAgIHNwaW5sb2NrX3QgKiBjdHJsX3JlZ19sb2NrLAorCQkJCSAgICAgICBzcGlubG9ja190ICogY2xrX3NyY19yZWdfbG9jaykKK3sKKwltZTgyNTRfc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwlpbnQgZXJyOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQWxsb2NhdGUgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UKKwlzdWJkZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZTgyNTRfc3ViZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghc3ViZGV2aWNlKSB7CisJCVBFUlJPUigiQ2Fubm90IGdldCBtZW1vcnkgZm9yIDgyNTQgaW5zdGFuY2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHN1YmRldmljZSwgMCwgc2l6ZW9mKG1lODI1NF9zdWJkZXZpY2VfdCkpOworCisJLy8gQ2hlY2sgaWYgY291bnRlciBpbmRleCBpcyBvdXQgb2YgcmFuZ2UKKworCWlmIChjdHJfaWR4ID4gMikgeworCQlQRVJST1IoIkNvdW50ZXIgaW5kZXggaXMgb3V0IG9mIHJhbmdlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzCisJZXJyID0gbWVfc3ViZGV2aWNlX2luaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgaW5zdGFuY2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8vIEluaXRpYWxpemUgc3BpbiBsb2Nrcy4KKwlzcGluX2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3ViZGV2aWNlLT5jdHJsX3JlZ19sb2NrID0gY3RybF9yZWdfbG9jazsKKwlzdWJkZXZpY2UtPmNsa19zcmNfcmVnX2xvY2sgPSBjbGtfc3JjX3JlZ19sb2NrOworCisJLy8gU2F2ZSB0eXBlIG9mIE1laWxoYXVzIGRldmljZQorCXN1YmRldmljZS0+ZGV2aWNlX2lkID0gZGV2aWNlX2lkOworCisJLy8gU2F2ZSB0aGUgaW5kaWNlcworCXN1YmRldmljZS0+bWU4MjU0X2lkeCA9IG1lODI1NF9pZHg7CisJc3ViZGV2aWNlLT5jdHJfaWR4ID0gY3RyX2lkeDsKKworCS8vIERvIGRldmljZSBzcGVjaWZpYyBpbml0aWFsaXphdGlvbgorCXN3aXRjaCAoZGV2aWNlX2lkKSB7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBBOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RUE6CisJCS8vIENoZWNrIGlmIDgyNTQgaW5kZXggaXMgb3V0IG9mIHJhbmdlCisJCWlmIChtZTgyNTRfaWR4ID4gMCkgeworCQkJUEVSUk9SKCI4MjU0IGluZGV4IGlzIG91dCBvZiByYW5nZS5cbiIpOworCQkJbWVfc3ViZGV2aWNlX2RlaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKwkJCWtmcmVlKHN1YmRldmljZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQjoJLy8gRmFsbCB0aHJvdWdoCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFQjoKKwkJLy8gQ2hlY2sgaWYgODI1NCBpbmRleCBpcyBvdXQgb2YgcmFuZ2UKKwkJaWYgKG1lODI1NF9pZHggPiAxKSB7CisJCQlQRVJST1IoIjgyNTQgaW5kZXggaXMgb3V0IG9mIHJhbmdlLlxuIik7CisJCQltZV9zdWJkZXZpY2VfZGVpbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCQkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCS8vIEluaXRpYWxpemUgdGhlIGNvdW50ZXJzIGNhcGFiaWxpdGllcworCQlpZiAoY3RyX2lkeCA9PSAwKQorCQkJc3ViZGV2aWNlLT5jYXBzID0KKwkJCSAgICBNRV9DQVBTX0NUUl9DTEtfSU5URVJOQUxfMU1IWiB8CisJCQkgICAgTUVfQ0FQU19DVFJfQ0xLX0lOVEVSTkFMXzEwTUhaIHwKKwkJCSAgICBNRV9DQVBTX0NUUl9DTEtfRVhURVJOQUw7CisJCWVsc2UKKwkJCXN1YmRldmljZS0+Y2FwcyA9CisJCQkgICAgTUVfQ0FQU19DVFJfQ0xLX1BSRVZJT1VTIHwgTUVfQ0FQU19DVFJfQ0xLX0VYVEVSTkFMOworCisJCS8vIEdldCB0aGUgY291bnRlcnMgcmVnaXN0ZXJzCisJCXN1YmRldmljZS0+dmFsX3JlZyA9CisJCSAgICBtZTE0MDBBQl9nZXRfdmFsX3JlZyhyZWdfYmFzZSwgbWU4MjU0X2lkeCwgY3RyX2lkeCk7CisJCXN1YmRldmljZS0+Y3RybF9yZWcgPQorCQkgICAgbWUxNDAwQUJfZ2V0X2N0cmxfcmVnKHJlZ19iYXNlLCBtZTgyNTRfaWR4LCBjdHJfaWR4KTsKKwkJc3ViZGV2aWNlLT5jbGtfc3JjX3JlZyA9CisJCSAgICBtZTE0MDBBQl9nZXRfY2xrX3NyY19yZWcocmVnX2Jhc2UsIG1lODI1NF9pZHgsIGN0cl9pZHgpOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEM6CisJCS8vIENoZWNrIGlmIDgyNTQgaW5kZXggaXMgb3V0IG9mIHJhbmdlCisJCWlmIChtZTgyNTRfaWR4ID4gNCkgeworCQkJUEVSUk9SKCI4MjU0IGluZGV4IGlzIG91dCBvZiByYW5nZS5cbiIpOworCQkJbWVfc3ViZGV2aWNlX2RlaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKwkJCWtmcmVlKHN1YmRldmljZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwRDoKKwkJLy8gQ2hlY2sgaWYgODI1NCBpbmRleCBpcyBvdXQgb2YgcmFuZ2UKKwkJaWYgKG1lODI1NF9pZHggPiA5KSB7CisJCQlQRVJST1IoIjgyNTQgaW5kZXggaXMgb3V0IG9mIHJhbmdlLlxuIik7CisJCQltZV9zdWJkZXZpY2VfZGVpbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCQkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCS8vIEluaXRpYWxpemUgdGhlIGNvdW50ZXJzIGNhcGFiaWxpdGllcworCQlpZiAoY3RyX2lkeCA9PSAwKSB7CisJCQlpZiAobWU4MjU0X2lkeCA9PSAwKQorCQkJCXN1YmRldmljZS0+Y2FwcyA9CisJCQkJICAgIE1FX0NBUFNfQ1RSX0NMS19QUkVWSU9VUyB8CisJCQkJICAgIE1FX0NBUFNfQ1RSX0NMS19JTlRFUk5BTF8xTUhaIHwKKwkJCQkgICAgTUVfQ0FQU19DVFJfQ0xLX0lOVEVSTkFMXzEwTUhaIHwKKwkJCQkgICAgTUVfQ0FQU19DVFJfQ0xLX0VYVEVSTkFMOworCQkJZWxzZQorCQkJCXN1YmRldmljZS0+Y2FwcyA9CisJCQkJICAgIE1FX0NBUFNfQ1RSX0NMS19JTlRFUk5BTF8xTUhaIHwKKwkJCQkgICAgTUVfQ0FQU19DVFJfQ0xLX0lOVEVSTkFMXzEwTUhaIHwKKwkJCQkgICAgTUVfQ0FQU19DVFJfQ0xLX0VYVEVSTkFMOworCQl9IGVsc2UKKwkJCXN1YmRldmljZS0+Y2FwcyA9CisJCQkgICAgTUVfQ0FQU19DVFJfQ0xLX1BSRVZJT1VTIHwgTUVfQ0FQU19DVFJfQ0xLX0VYVEVSTkFMOworCisJCS8vIEdldCB0aGUgY291bnRlcnMgcmVnaXN0ZXJzCisJCXN1YmRldmljZS0+dmFsX3JlZyA9CisJCSAgICBtZTE0MDBDRF9nZXRfdmFsX3JlZyhyZWdfYmFzZSwgbWU4MjU0X2lkeCwgY3RyX2lkeCk7CisJCXN1YmRldmljZS0+Y3RybF9yZWcgPQorCQkgICAgbWUxNDAwQ0RfZ2V0X2N0cmxfcmVnKHJlZ19iYXNlLCBtZTgyNTRfaWR4LCBjdHJfaWR4KTsKKwkJc3ViZGV2aWNlLT5jbGtfc3JjX3JlZyA9CisJCSAgICBtZTE0MDBDRF9nZXRfY2xrX3NyY19yZWcocmVnX2Jhc2UsIG1lODI1NF9pZHgsIGN0cl9pZHgpOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2MTA6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwSToKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwUzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwSVM6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwSToKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwUzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwSVM6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY4MDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwSToKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwUzoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwSVM6CisJCS8vIENoZWNrIGlmIDgyNTQgaW5kZXggaXMgb3V0IG9mIHJhbmdlCisJCWlmIChtZTgyNTRfaWR4ID4gMCkgeworCQkJUEVSUk9SKCI4MjU0IGluZGV4IGlzIG91dCBvZiByYW5nZS5cbiIpOworCQkJbWVfc3ViZGV2aWNlX2RlaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKwkJCWtmcmVlKHN1YmRldmljZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQkvLyBJbml0aWFsaXplIHRoZSBjb3VudGVycyBjYXBhYmlsaXRpZXMKKwkJc3ViZGV2aWNlLT5jYXBzID0gTUVfQ0FQU19DVFJfQ0xLX0VYVEVSTkFMOworCisJCS8vIEdldCB0aGUgY291bnRlcnMgcmVnaXN0ZXJzCisJCXN1YmRldmljZS0+dmFsX3JlZyA9CisJCSAgICBtZTQ2MDBfZ2V0X3ZhbF9yZWcocmVnX2Jhc2UsIG1lODI1NF9pZHgsIGN0cl9pZHgpOworCQlzdWJkZXZpY2UtPmN0cmxfcmVnID0KKwkJICAgIG1lNDYwMF9nZXRfY3RybF9yZWcocmVnX2Jhc2UsIG1lODI1NF9pZHgsIGN0cl9pZHgpOworCQlzdWJkZXZpY2UtPmNsa19zcmNfcmVnID0gMDsJLy8gTm90IHVzZWQKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU4MTAwX0E6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODEwMF9COgorCQkvLyBDaGVjayBpZiA4MjU0IGluZGV4IGlzIG91dCBvZiByYW5nZQorCQlpZiAobWU4MjU0X2lkeCA+IDApIHsKKwkJCVBFUlJPUigiODI1NCBpbmRleCBpcyBvdXQgb2YgcmFuZ2UuXG4iKTsKKwkJCW1lX3N1YmRldmljZV9kZWluaXQoJnN1YmRldmljZS0+YmFzZSk7CisJCQlrZnJlZShzdWJkZXZpY2UpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJLy8gSW5pdGlhbGl6ZSB0aGUgY291bnRlcnMgY2FwYWJpbGl0aWVzCisJCXN1YmRldmljZS0+Y2FwcyA9IE1FX0NBUFNfQ1RSX0NMS19FWFRFUk5BTDsKKworCQkvLyBHZXQgdGhlIGNvdW50ZXJzIHJlZ2lzdGVycworCQlzdWJkZXZpY2UtPnZhbF9yZWcgPQorCQkgICAgbWU4MTAwX2dldF92YWxfcmVnKHJlZ19iYXNlLCBtZTgyNTRfaWR4LCBjdHJfaWR4KTsKKwkJc3ViZGV2aWNlLT5jdHJsX3JlZyA9CisJCSAgICBtZTgxMDBfZ2V0X2N0cmxfcmVnKHJlZ19iYXNlLCBtZTgyNTRfaWR4LCBjdHJfaWR4KTsKKwkJc3ViZGV2aWNlLT5jbGtfc3JjX3JlZyA9IDA7CS8vIE5vdCB1c2VkCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY1MDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDAwOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RTA6CisJCVBFUlJPUigiTm8gODI1NCBzdWJkZXZpY2VzIGF2YWlsYWJsZSBmb3Igc3ViZGV2aWNlIGRldmljZS5cbiIpOworCQltZV9zdWJkZXZpY2VfZGVpbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiVW5rbm93biBkZXZpY2UgdHlwZS5cbiIpOworCQltZV9zdWJkZXZpY2VfZGVpbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvLyBPdmVybG9hZCBzdWJkZXZpY2UgYmFzZSBjbGFzcyBtZXRob2RzLgorCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWU4MjU0X2lvX3Jlc2V0X3N1YmRldmljZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9jb25maWcgPSBtZTgyNTRfaW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWU4MjU0X2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0gbWU4MjU0X2lvX3NpbmdsZV93cml0ZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lODI1NF9xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lODI1NF9xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWU4MjU0X3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncyA9CisJICAgIG1lODI1NF9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzOworCisJcmV0dXJuIHN1YmRldmljZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyNTQuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyNTQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzJiNzE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODI1NC5oCkBAIC0wLDAgKzEsODAgQEAKKy8qKgorICogQGZpbGUgbWU4MjU0LmgKKyAqCisgKiBAYnJpZWYgODI1NCBjb3VudGVyIGltcGxlbWVudGF0aW9uLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FODI1NF9IXworI2RlZmluZSBfTUU4MjU0X0hfCisKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorI2luY2x1ZGUgIm1lc2xvY2suaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgVGhlIDgyNTQgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZTgyNTRfc3ViZGV2aWNlIHsKKwkvKiBJbmhlcml0YW5jZSAqLworCW1lX3N1YmRldmljZV90IGJhc2U7CQkJLyoqPCBUaGUgc3ViZGV2aWNlIGJhc2UgY2xhc3MuICovCisKKwkvKiBBdHRyaWJ1dGVzICovCisJc3BpbmxvY2tfdCBzdWJkZXZpY2VfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlIHN1YmRldmljZSBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCisJc3BpbmxvY2tfdCAqY3RybF9yZWdfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KKwlzcGlubG9ja190ICpjbGtfc3JjX3JlZ19sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgY2xvY2sgc291cmNlIHJlZ2lzdGVyIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisKKwl1aW50MzJfdCBkZXZpY2VfaWQ7CQkJLyoqPCBUaGUgTWVpbGhhdXMgZGV2aWNlIHR5cGUgY2FycnlpbmcgdGhlIDgyNTQgY2hpcC4gKi8KKwlpbnQgbWU4MjU0X2lkeDsJCQkJLyoqPCBUaGUgaW5kZXggb2YgdGhlIDgyNTQgY2hpcCBvbiB0aGUgZGV2aWNlLiAqLworCWludCBjdHJfaWR4OwkJCQkvKio8IFRoZSBpbmRleCBvZiB0aGUgY291bnRlciBvbiB0aGUgODI1NCBjaGlwLiAqLworCisJaW50IGNhcHM7CQkJCS8qKjwgSG9sZHMgdGhlIGRldmljZSBjYXBhYmlsaXRpZXMuICovCisKKwl1bnNpZ25lZCBsb25nIHZhbF9yZWc7CQkJLyoqPCBIb2xkcyB0aGUgYWN0dWFsIGNvdW50ZXIgdmFsdWUuICovCisJdW5zaWduZWQgbG9uZyBjdHJsX3JlZzsJCQkvKio8IFJlZ2lzdGVyIHRvIGNvbmZpZ3VyZSB0aGUgODI1NCBtb2Rlcy4gKi8KKwl1bnNpZ25lZCBsb25nIGNsa19zcmNfcmVnOwkJLyoqPCBSZWdpc3RlciB0byBjb25maWd1cmUgdGhlIGNvdW50ZXIgY29ubmVjdGlvbnMuICovCit9IG1lODI1NF9zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgODI1NCBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gZGV2aWNlX2lkIFRoZSBraW5kIG9mIE1laWxoYXVzIGRldmljZSBob2xkaW5nIHRoZSA4MjU0LgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gbWU4MjU0X2lkeCBUaGUgaW5kZXggb2YgdGhlIDgyNTQgY2hpcCBvbiB0aGUgTWVpbGhhdXMgZGV2aWNlLgorICogQHBhcmFtIGN0cl9pZHggVGhlIGluZGV4IG9mIHRoZSBjb3VudGVyIGluc2lkZSBhIDgyNTQgY2hpcC4KKyAqIEBwYXJhbSBjdHJsX3JlZ19sb2NrIFBvaW50ZXIgdG8gc3BpbiBsb2NrIHByb3RlY3RpbmcgdGhlIDgyNTQgY29udHJvbCByZWdpc3RlciBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLgorICogQHBhcmFtIGNsa19zcmNfcmVnX2xvY2sgUG9pbnRlciB0byBzcGluIGxvY2sgcHJvdGVjdGluZyB0aGUgY2xvY2sgc291cmNlIHJlZ2lzdGVyIGZyb20gY29uY3VycmVudCBhY2Nlc3MuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLlxuCisgKiBOVUxMIG9uIGVycm9yLgorICovCittZTgyNTRfc3ViZGV2aWNlX3QgKm1lODI1NF9jb25zdHJ1Y3Rvcih1aW50MzJfdCBkZXZpY2VfaWQsCisJCQkJICAgICAgIHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbWU4MjU0X2lkeCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IGN0cl9pZHgsCisJCQkJICAgICAgIHNwaW5sb2NrX3QgKiBjdHJsX3JlZ19sb2NrLAorCQkJCSAgICAgICBzcGlubG9ja190ICogY2xrX3NyY19yZWdfbG9jayk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjU0X3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODI1NF9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTJjMzZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODI1NF9yZWcuaApAQCAtMCwwICsxLDE3MiBAQAorLyoqCisgKiBAZmlsZSBtZTgyNTRfcmVnLmgKKyAqCisgKiBAYnJpZWYgODI1NCBjb3VudGVyIHJlZ2lzdGVyIGRlZmluaXRpb25zLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA2IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKyNpZm5kZWYgX01FODI1NF9SRUdfSF8KKyNkZWZpbmUgX01FODI1NF9SRUdfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworLyogTUUxNDAwIEEvQiByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIE1FMTQwMEFCXzgyNTRfQV8wX1ZBTF9SRUcJCTB4MDAwNCAvKio8IE9mZnNldCBvZiA4MjU0IEEgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBBQl84MjU0X0FfMV9WQUxfUkVHCQkweDAwMDUgLyoqPCBPZmZzZXQgb2YgODI1NCBBIGNvdW50ZXIgMSB2YWx1ZSByZWdpc3Rlci4gKi8KKyNkZWZpbmUgTUUxNDAwQUJfODI1NF9BXzJfVkFMX1JFRwkJMHgwMDA2IC8qKjwgT2Zmc2V0IG9mIDgyNTQgQSBjb3VudGVyIDIgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMEFCXzgyNTRfQV9DVFJMX1JFRwkJMHgwMDA3IC8qKjwgT2Zmc2V0IG9mIDgyNTQgQSBjb250cm9sIHJlZ2lzdGVyLiAqLworCisjZGVmaW5lIE1FMTQwMEFCXzgyNTRfQl8wX1ZBTF9SRUcJCTB4MDAwQyAvKio8IE9mZnNldCBvZiA4MjU0IEIgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBBQl84MjU0X0JfMV9WQUxfUkVHCQkweDAwMEQgLyoqPCBPZmZzZXQgb2YgODI1NCBCIGNvdW50ZXIgMSB2YWx1ZSByZWdpc3Rlci4gKi8KKyNkZWZpbmUgTUUxNDAwQUJfODI1NF9CXzJfVkFMX1JFRwkJMHgwMDBFIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQiBjb3VudGVyIDIgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMEFCXzgyNTRfQl9DVFJMX1JFRwkJMHgwMDBGIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQiBjb250cm9sIHJlZ2lzdGVyLiAqLworCisjZGVmaW5lIE1FMTQwMEFCX0NMS19TUkNfUkVHCQkJMHgwMDEwIC8qKjwgT2Zmc2V0IG9mIGNsb2NrIHNvdXJjZSByZWdpc3Rlci4gKi8KKworLyogTUUxNDAwIEMgcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQV8wX1ZBTF9SRUcJCTB4MDAwNCAvKio8IE9mZnNldCBvZiA4MjU0IEEgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQV8xX1ZBTF9SRUcJCTB4MDAwNSAvKio8IE9mZnNldCBvZiA4MjU0IEEgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQV8yX1ZBTF9SRUcJCTB4MDAwNiAvKio8IE9mZnNldCBvZiA4MjU0IEEgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQV9DVFJMX1JFRwkJCTB4MDAwNyAvKio8IE9mZnNldCBvZiA4MjU0IEEgY29udHJvbCByZWdpc3Rlci4gKi8KKworI2RlZmluZSBNRTE0MDBDXzgyNTRfQl8wX1ZBTF9SRUcJCTB4MDAwQyAvKio8IE9mZnNldCBvZiA4MjU0IEIgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQl8xX1ZBTF9SRUcJCTB4MDAwRCAvKio8IE9mZnNldCBvZiA4MjU0IEIgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQl8yX1ZBTF9SRUcJCTB4MDAwRSAvKio8IE9mZnNldCBvZiA4MjU0IEIgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQl9DVFJMX1JFRwkJCTB4MDAwRiAvKio8IE9mZnNldCBvZiA4MjU0IEIgY29udHJvbCByZWdpc3Rlci4gKi8KKworI2RlZmluZSBNRTE0MDBDXzgyNTRfQ18wX1ZBTF9SRUcJCTB4MDAxMCAvKio8IE9mZnNldCBvZiA4MjU0IEMgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQ18xX1ZBTF9SRUcJCTB4MDAxMSAvKio8IE9mZnNldCBvZiA4MjU0IEMgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQ18yX1ZBTF9SRUcJCTB4MDAxMiAvKio8IE9mZnNldCBvZiA4MjU0IEMgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfQ19DVFJMX1JFRwkJCTB4MDAxMyAvKio8IE9mZnNldCBvZiA4MjU0IEMgY29udHJvbCByZWdpc3Rlci4gKi8KKworI2RlZmluZSBNRTE0MDBDXzgyNTRfRF8wX1ZBTF9SRUcJCTB4MDAxNCAvKio8IE9mZnNldCBvZiA4MjU0IEQgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfRF8xX1ZBTF9SRUcJCTB4MDAxNSAvKio8IE9mZnNldCBvZiA4MjU0IEQgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfRF8yX1ZBTF9SRUcJCTB4MDAxNiAvKio8IE9mZnNldCBvZiA4MjU0IEQgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfRF9DVFJMX1JFRwkJCTB4MDAxNyAvKio8IE9mZnNldCBvZiA4MjU0IEQgY29udHJvbCByZWdpc3Rlci4gKi8KKworI2RlZmluZSBNRTE0MDBDXzgyNTRfRV8wX1ZBTF9SRUcJCTB4MDAxOCAvKio8IE9mZnNldCBvZiA4MjU0IEUgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfRV8xX1ZBTF9SRUcJCTB4MDAxOSAvKio8IE9mZnNldCBvZiA4MjU0IEUgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfRV8yX1ZBTF9SRUcJCTB4MDAxQSAvKio8IE9mZnNldCBvZiA4MjU0IEUgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTE0MDBDXzgyNTRfRV9DVFJMX1JFRwkJCTB4MDAxQiAvKio8IE9mZnNldCBvZiA4MjU0IEUgY29udHJvbCByZWdpc3Rlci4gKi8KKworI2RlZmluZSBNRTE0MDBDX0NMS19TUkNfMF9SRUcgIAkJCTB4MDAxQyAvKio8IE9mZnNldCBvZiBjbG9jayBzb3VyY2UgcmVnaXN0ZXIgMC4gKi8KKyNkZWZpbmUgTUUxNDAwQ19DTEtfU1JDXzFfUkVHICAJCQkweDAwMUQgLyoqPCBPZmZzZXQgb2YgY2xvY2sgc291cmNlIHJlZ2lzdGVyIDEuICovCisjZGVmaW5lIE1FMTQwMENfQ0xLX1NSQ18yX1JFRyAgCQkJMHgwMDFFIC8qKjwgT2Zmc2V0IG9mIGNsb2NrIHNvdXJjZSByZWdpc3RlciAyLiAqLworCisvKiBNRTE0MDAgRCByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9BXzBfVkFMX1JFRwkJMHgwMDQ0IC8qKjwgT2Zmc2V0IG9mIDgyNTQgQSBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9BXzFfVkFMX1JFRwkJMHgwMDQ1IC8qKjwgT2Zmc2V0IG9mIDgyNTQgQSBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9BXzJfVkFMX1JFRwkJMHgwMDQ2IC8qKjwgT2Zmc2V0IG9mIDgyNTQgQSBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9BX0NUUkxfUkVHCQkJMHgwMDQ3IC8qKjwgT2Zmc2V0IG9mIDgyNTQgQSBjb250cm9sIHJlZ2lzdGVyLiAqLworCisjZGVmaW5lIE1FMTQwMERfODI1NF9CXzBfVkFMX1JFRwkJMHgwMDRDIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQiBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9CXzFfVkFMX1JFRwkJMHgwMDREIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQiBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9CXzJfVkFMX1JFRwkJMHgwMDRFIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQiBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9CX0NUUkxfUkVHCQkJMHgwMDRGIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQiBjb250cm9sIHJlZ2lzdGVyLiAqLworCisjZGVmaW5lIE1FMTQwMERfODI1NF9DXzBfVkFMX1JFRwkJMHgwMDUwIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQyBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9DXzFfVkFMX1JFRwkJMHgwMDUxIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQyBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9DXzJfVkFMX1JFRwkJMHgwMDUyIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQyBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9DX0NUUkxfUkVHCQkJMHgwMDUzIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQyBjb250cm9sIHJlZ2lzdGVyLiAqLworCisjZGVmaW5lIE1FMTQwMERfODI1NF9EXzBfVkFMX1JFRwkJMHgwMDU0IC8qKjwgT2Zmc2V0IG9mIDgyNTQgRCBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9EXzFfVkFMX1JFRwkJMHgwMDU1IC8qKjwgT2Zmc2V0IG9mIDgyNTQgRCBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9EXzJfVkFMX1JFRwkJMHgwMDU2IC8qKjwgT2Zmc2V0IG9mIDgyNTQgRCBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9EX0NUUkxfUkVHCQkJMHgwMDU3IC8qKjwgT2Zmc2V0IG9mIDgyNTQgRCBjb250cm9sIHJlZ2lzdGVyLiAqLworCisjZGVmaW5lIE1FMTQwMERfODI1NF9FXzBfVkFMX1JFRwkJMHgwMDU4IC8qKjwgT2Zmc2V0IG9mIDgyNTQgRSBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9FXzFfVkFMX1JFRwkJMHgwMDU5IC8qKjwgT2Zmc2V0IG9mIDgyNTQgRSBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9FXzJfVkFMX1JFRwkJMHgwMDVBIC8qKjwgT2Zmc2V0IG9mIDgyNTQgRSBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FMTQwMERfODI1NF9FX0NUUkxfUkVHCQkJMHgwMDVCIC8qKjwgT2Zmc2V0IG9mIDgyNTQgRSBjb250cm9sIHJlZ2lzdGVyLiAqLworCisjZGVmaW5lIE1FMTQwMERfQ0xLX1NSQ18wX1JFRyAgCQkJMHgwMDVDIC8qKjwgT2Zmc2V0IG9mIGNsb2NrIHNvdXJjZSByZWdpc3RlciAwLiAqLworI2RlZmluZSBNRTE0MDBEX0NMS19TUkNfMV9SRUcgIAkJCTB4MDA1RCAvKio8IE9mZnNldCBvZiBjbG9jayBzb3VyY2UgcmVnaXN0ZXIgMS4gKi8KKyNkZWZpbmUgTUUxNDAwRF9DTEtfU1JDXzJfUkVHICAJCQkweDAwNUUgLyoqPCBPZmZzZXQgb2YgY2xvY2sgc291cmNlIHJlZ2lzdGVyIDIuICovCisKKy8qIE1FNDYwMCByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIE1FNDYwMF84MjU0XzBfVkFMX1JFRwkJCTB4MDAwMCAvKio8IE9mZnNldCBvZiA4MjU0IEEgY291bnRlciAwIHZhbHVlIHJlZ2lzdGVyLiAqLworI2RlZmluZSBNRTQ2MDBfODI1NF8xX1ZBTF9SRUcJCQkweDAwMDEgLyoqPCBPZmZzZXQgb2YgODI1NCBBIGNvdW50ZXIgMCB2YWx1ZSByZWdpc3Rlci4gKi8KKyNkZWZpbmUgTUU0NjAwXzgyNTRfMl9WQUxfUkVHCQkJMHgwMDAyIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQSBjb3VudGVyIDAgdmFsdWUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE1FNDYwMF84MjU0X0NUUkxfUkVHCQkJMHgwMDAzIC8qKjwgT2Zmc2V0IG9mIDgyNTQgQSBjb250cm9sIHJlZ2lzdGVyLiAqLworCisvKiBDb21tYW5kIHdvcmRzIGZvciA4MjU0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUU4MjU0X0NUUkxfU0MwICAgMHgwMAkgLyoqPCBDb3VudGVyIDAgc2VsZWN0aW9uLiAqLworI2RlZmluZSBNRTgyNTRfQ1RSTF9TQzEgICAweDQwCSAvKio8IENvdW50ZXIgMSBzZWxlY3Rpb24uICovCisjZGVmaW5lIE1FODI1NF9DVFJMX1NDMiAgIDB4ODAJIC8qKjwgQ291bnRlciAyIHNlbGVjdGlvbi4gKi8KKworI2RlZmluZSBNRTgyNTRfQ1RSTF9UTE8gICAweDAwCSAvKio8IENvdW50ZXIgbGF0Y2hpbmcgb3BlcmF0aW9uLiAqLworI2RlZmluZSBNRTgyNTRfQ1RSTF9MU0IgICAweDEwCSAvKio8IE9ubHkgcmVhZCBMU0IuICovCisjZGVmaW5lIE1FODI1NF9DVFJMX01TQiAgIDB4MjAJIC8qKjwgT25seSByZWFkIE1TQi4gKi8KKyNkZWZpbmUgTUU4MjU0X0NUUkxfTE0gICAgMHgzMAkgLyoqPCBGaXJzdCByZWFkIExTQiwgdGhlbiBNU0IuICAqLworCisjZGVmaW5lIE1FODI1NF9DVFJMX00wICAgIDB4MDAJIC8qKjwgTW9kZSAwIHNlbGVjdGlvbi4gKi8KKyNkZWZpbmUgTUU4MjU0X0NUUkxfTTEgICAgMHgwMgkgLyoqPCBNb2RlIDEgc2VsZWN0aW9uLiAqLworI2RlZmluZSBNRTgyNTRfQ1RSTF9NMiAgICAweDA0CSAvKio8IE1vZGUgMiBzZWxlY3Rpb24uICovCisjZGVmaW5lIE1FODI1NF9DVFJMX00zICAgIDB4MDYJIC8qKjwgTW9kZSAzIHNlbGVjdGlvbi4gKi8KKyNkZWZpbmUgTUU4MjU0X0NUUkxfTTQgICAgMHgwOAkgLyoqPCBNb2RlIDQgc2VsZWN0aW9uLiAqLworI2RlZmluZSBNRTgyNTRfQ1RSTF9NNSAgICAweDBBCSAvKio8IE1vZGUgNSBzZWxlY3Rpb24uICovCisKKyNkZWZpbmUgTUU4MjU0X0NUUkxfQklOICAgMHgwMAkgLyoqPCBCaW5hcnkgY291bnRlci4gKi8KKyNkZWZpbmUgTUU4MjU0X0NUUkxfQkNEICAgMHgwMQkgLyoqPCBCQ0QgY291bnRlci4gKi8KKworLyogTUUtMTQwMCBBL0IgY2xvY2sgc291cmNlIHJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUgTUUxNDAwQUJfODI1NF9BXzBfQ0xLX1NSQ18xTUhaCQkoMCA8PCA3KQkvKio8IDFNSHogY2xvY2suICovCisjZGVmaW5lIE1FMTQwMEFCXzgyNTRfQV8wX0NMS19TUkNfMTBNSFoJCSgxIDw8IDcpCS8qKjwgMTBNSHogY2xvY2suICovCisjZGVmaW5lIE1FMTQwMEFCXzgyNTRfQV8wX0NMS19TUkNfUElOCQkoMCA8PCA2KQkvKio8IENMSyAwIHRvIFNVQi1ELiAqLworI2RlZmluZSBNRTE0MDBBQl84MjU0X0FfMF9DTEtfU1JDX1FVQVJaCQkoMSA8PCA2KQkvKio8IENvbm5lY3QgQ0xLIDAgd2l0aCBxdWFyei4gKi8KKworI2RlZmluZSBNRTE0MDBBQl84MjU0X0FfMV9DTEtfU1JDX1BJTgkJKDAgPDwgNSkJLyoqPCBDTEsgMSB0byBTVUItRC4gKi8KKyNkZWZpbmUgTUUxNDAwQUJfODI1NF9BXzFfQ0xLX1NSQ19QUkVWCQkoMSA8PCA1KQkvKio8IENvbm5lY3QgT1VUIDAgd2l0aCBDTEsgMS4gKi8KKworI2RlZmluZSBNRTE0MDBBQl84MjU0X0FfMl9DTEtfU1JDX1BJTgkJKDAgPDwgNCkJLyoqPCBDTEsgMiB0byBTVUItRC4gKi8KKyNkZWZpbmUgTUUxNDAwQUJfODI1NF9BXzJfQ0xLX1NSQ19QUkVWCQkoMSA8PCA0KQkvKio8IENvbm5lY3QgT1VUIDEgd2l0aCBDTEsgMi4gKi8KKworI2RlZmluZSBNRTE0MDBBQl84MjU0X0JfMF9DTEtfU1JDXzFNSFoJCSgwIDw8IDMpCS8qKjwgMU1IeiBjbG9jay4gKi8KKyNkZWZpbmUgTUUxNDAwQUJfODI1NF9CXzBfQ0xLX1NSQ18xME1IWgkJKDEgPDwgMykJLyoqPCAxME1IeiBjbG9jay4gKi8KKyNkZWZpbmUgTUUxNDAwQUJfODI1NF9CXzBfQ0xLX1NSQ19QSU4JCSgwIDw8IDIpCS8qKjwgQ0xLIDAgdG8gU1VCLUQuICovCisjZGVmaW5lIE1FMTQwMEFCXzgyNTRfQl8wX0NMS19TUkNfUVVBUloJCSgxIDw8IDIpCS8qKjwgQ29ubmVjdCBDTEsgMCB3aXRoIHF1YXJ6LiAqLworCisjZGVmaW5lIE1FMTQwMEFCXzgyNTRfQl8xX0NMS19TUkNfUElOCQkoMCA8PCAxKQkvKio8IENMSyAxIHRvIFNVQi1ELiAqLworI2RlZmluZSBNRTE0MDBBQl84MjU0X0JfMV9DTEtfU1JDX1BSRVYJCSgxIDw8IDEpCS8qKjwgQ29ubmVjdCBPVVQgMCB3aXRoIENMSyAxLiAqLworCisjZGVmaW5lIE1FMTQwMEFCXzgyNTRfQl8yX0NMS19TUkNfUElOCQkoMCA8PCAwKQkvKio8IENMSyAyIHRvIFNVQi1ELiAqLworI2RlZmluZSBNRTE0MDBBQl84MjU0X0JfMl9DTEtfU1JDX1BSRVYJCSgxIDw8IDApCS8qKjwgQ29ubmVjdCBPVVQgMSB3aXRoIENMSyAyLiAqLworCisvKiBNRS0xNDAwIEMvRCBjbG9jayBzb3VyY2UgcmVnaXN0ZXJzIGJpdHMgKi8KKyNkZWZpbmUgTUUxNDAwQ0RfODI1NF9BQ0VfMF9DTEtfU1JDX01BU0sJMHgwMwkvKio8IE1hc2tzIGFsbCBDTEsgc291cmNlIGJpdHMuICovCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQUNFXzBfQ0xLX1NSQ19QSU4JCTB4MDAJLyoqPCBDb25uZWN0IENMSyB0byBTVUItRC4gKi8KKyNkZWZpbmUgTUUxNDAwQ0RfODI1NF9BQ0VfMF9DTEtfU1JDXzFNSFoJMHgwMQkvKio8IENvbm5lY3QgQ0xLIHRvIDFNSHouICovCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQUNFXzBfQ0xLX1NSQ18xME1IWgkweDAyCS8qKjwgQ29ubmVjdCBDTEsgdG8gMTBNSHouICovCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQUNFXzBfQ0xLX1NSQ19QUkVWCTB4MDMJLyoqPCBDb25uZWN0IENMSyB0byBwcmV2aW91cyBjb3VudGVyIG91dHB1dCBvbiBNRS0xNDAwIEQgZXh0ZW5zaW9uLiAqLworCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQUNFXzFfQ0xLX1NSQ19NQVNLCTB4MDQJLyoqPCBNYXNrcyBhbGwgQ0xLIHNvdXJjZSBiaXRzLiAqLworI2RlZmluZSBNRTE0MDBDRF84MjU0X0FDRV8xX0NMS19TUkNfUElOCQkweDAwCS8qKjwgQ29ubmVjdCBDTEsgdG8gU1VCLUQuICovCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQUNFXzFfQ0xLX1NSQ19QUkVWCTB4MDQJLyoqPCBDb25uZWN0IENMSyB0byBwcmV2aW91cyBjb3VudGVyIG91dHB1dC4gKi8KKworI2RlZmluZSBNRTE0MDBDRF84MjU0X0FDRV8yX0NMS19TUkNfTUFTSwkweDA4CS8qKjwgTWFza3MgYWxsIENMSyBzb3VyY2UgYml0cy4gKi8KKyNkZWZpbmUgTUUxNDAwQ0RfODI1NF9BQ0VfMl9DTEtfU1JDX1BJTgkJMHgwMAkvKio8IENvbm5lY3QgdG8gU1VCLUQuICovCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQUNFXzJfQ0xLX1NSQ19QUkVWCTB4MDgJLyoqPCBDb25uZWN0IENMSyB0byBwcmV2aW91cyBjb3VudGVyIG91dHB1dC4gKi8KKworI2RlZmluZSBNRTE0MDBDRF84MjU0X0JEXzBfQ0xLX1NSQ19NQVNLCQkweDMwCS8qKjwgTWFza3MgYWxsIENMSyBzb3VyY2UgYml0cy4gKi8KKyNkZWZpbmUgTUUxNDAwQ0RfODI1NF9CRF8wX0NMS19TUkNfUElOCQkweDAwCS8qKjwgQ29ubmVjdCBDTEsgdG8gU1VCLUQuICovCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQkRfMF9DTEtfU1JDXzFNSFoJCTB4MTAJLyoqPCBDb25uZWN0IENMSyB0byAxTUh6LiAqLworI2RlZmluZSBNRTE0MDBDRF84MjU0X0JEXzBfQ0xLX1NSQ18xME1IWgkweDIwCS8qKjwgQ29ubmVjdCBDTEsgdG8gMTBNSHouICovCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQkRfMF9DTEtfU1JDX1BSRVYJCTB4MzAJLyoqPCBDb25uZWN0IENMSyB0byBwcmV2aW91cyBjb3VudGVyIG91dHB1dC4gKi8KKworI2RlZmluZSBNRTE0MDBDRF84MjU0X0JEXzFfQ0xLX1NSQ19NQVNLCQkweDQwCS8qKjwgTWFza3MgYWxsIENMSyBzb3VyY2UgYml0cy4gKi8KKyNkZWZpbmUgTUUxNDAwQ0RfODI1NF9CRF8xX0NMS19TUkNfUElOCQkweDAwCS8qKjwgQ29ubmVjdCBDTEsgdG8gU1VCLUQuICovCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQkRfMV9DTEtfU1JDX1BSRVYJCTB4NDAJLyoqPCBDb25uZWN0IENMSyB0byBwcmV2aW91cyBjb3VudGVyIG91dHB1dC4gKi8KKworI2RlZmluZSBNRTE0MDBDRF84MjU0X0JEXzJfQ0xLX1NSQ19NQVNLCQkweDgwCS8qKjwgTWFza3MgYWxsIENMSyBzb3VyY2UgYml0cy4gKi8KKyNkZWZpbmUgTUUxNDAwQ0RfODI1NF9CRF8yX0NMS19TUkNfUElOCQkweDAwCS8qKjwgQ29ubmVjdCBDTEsgdG8gU1VCLUQuICovCisjZGVmaW5lIE1FMTQwMENEXzgyNTRfQkRfMl9DTEtfU1JDX1BSRVYJCTB4ODAJLyoqPCBDb25uZWN0IENMSyB0byBwcmV2aW91cyBjb3VudGVyIG91dHB1dC4gKi8KKworLyogTUUtODEwMCBjb3VudGVyIHJlZ2lzdGVycyAqLworI2RlZmluZSBNRTgxMDBfQ09VTlRFUl9SRUdfMAkJCQkweDE4CS8vKHIsdykKKyNkZWZpbmUgTUU4MTAwX0NPVU5URVJfUkVHXzEJCQkJMHgxQQkvLyhyLHcpCisjZGVmaW5lIE1FODEwMF9DT1VOVEVSX1JFR18yCQkJCTB4MUMJLy8ocix3KQorI2RlZmluZSBNRTgxMDBfQ09VTlRFUl9DVFJMX1JFRwkJCQkweDFFCS8vKHIsdykKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyNTUuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyNTUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODBlN2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODI1NS5jCkBAIC0wLDAgKzEsNDYyIEBACisvKioKKyAqIEBmaWxlIG1lODI1NS5jCisgKgorICogQGJyaWVmIDgyNTUgc3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvKgorICogSW5jbHVkZXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorCisjaW5jbHVkZSAibWU4MjU1X3JlZy5oIgorI2luY2x1ZGUgIm1lODI1NS5oIgorCisvKgorICogRGVmaW5lcworICovCisKKy8qCisgKiBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgdWludDhfdCBnZXRfbW9kZV9mcm9tX21pcnJvcih1aW50MzJfdCBtaXJyb3IpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaWYgKG1pcnJvciAmIE1FODI1NV9QT1JUXzBfT1VUUFVUKSB7CisJCWlmIChtaXJyb3IgJiBNRTgyNTVfUE9SVF8xX09VVFBVVCkgeworCQkJaWYgKG1pcnJvciAmIE1FODI1NV9QT1JUXzJfT1VUUFVUKSB7CisJCQkJcmV0dXJuIE1FODI1NV9NT0RFX09PTzsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIE1FODI1NV9NT0RFX0lPTzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChtaXJyb3IgJiBNRTgyNTVfUE9SVF8yX09VVFBVVCkgeworCQkJCXJldHVybiBNRTgyNTVfTU9ERV9PSU87CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBNRTgyNTVfTU9ERV9JSU87CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZiAobWlycm9yICYgTUU4MjU1X1BPUlRfMV9PVVRQVVQpIHsKKwkJCWlmIChtaXJyb3IgJiBNRTgyNTVfUE9SVF8yX09VVFBVVCkgeworCQkJCXJldHVybiBNRTgyNTVfTU9ERV9PT0k7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBNRTgyNTVfTU9ERV9JT0k7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAobWlycm9yICYgTUU4MjU1X1BPUlRfMl9PVVRQVVQpIHsKKwkJCQlyZXR1cm4gTUU4MjU1X01PREVfT0lJOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gTUU4MjU1X01PREVfSUlJOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgaW50IG1lODI1NV9pb19yZXNldF9zdWJkZXZpY2Uoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisJbWU4MjU1X3N1YmRldmljZV90ICppbnN0YW5jZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODI1NV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlpZiAoZmxhZ3MpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWcgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCSppbnN0YW5jZS0+Y3RybF9yZWdfbWlycm9yICY9CisJICAgIH4oTUU4MjU1X1BPUlRfMF9PVVRQVVQgPDwgaW5zdGFuY2UtPmRpb19pZHgpOworCW91dGIoZ2V0X21vZGVfZnJvbV9taXJyb3IoKmluc3RhbmNlLT5jdHJsX3JlZ19taXJyb3IpLAorCSAgICAgaW5zdGFuY2UtPmN0cmxfcmVnKTsKKwlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisKKwlvdXRiKDAsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODI1NV9pb19zaW5nbGVfY29uZmlnKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgaW50IGNoYW5uZWwsCisJCQkJICAgaW50IHNpbmdsZV9jb25maWcsCisJCQkJICAgaW50IHJlZiwKKwkJCQkgICBpbnQgdHJpZ19jaGFuLAorCQkJCSAgIGludCB0cmlnX3R5cGUsIGludCB0cmlnX2VkZ2UsIGludCBmbGFncykKK3sKKwltZTgyNTVfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJaW5zdGFuY2UgPSAobWU4MjU1X3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCWlmIChmbGFncyAmIH5NRV9JT19TSU5HTEVfQ09ORklHX0RJT19CWVRFKSB7CisJCVBFUlJPUigiSW52YWxpZCBmbGFnIHNwZWNpZmllZC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisKKwlpZiAoY2hhbm5lbCkgeworCQlQRVJST1IoIkludmFsaWQgY2hhbm5lbC5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCX0KKworCU1FX1NVQkRFVklDRV9FTlRFUjsKKworCXNwaW5fbG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKwlpZiAoc2luZ2xlX2NvbmZpZyA9PSBNRV9TSU5HTEVfQ09ORklHX0RJT19JTlBVVCkgeworCQlzcGluX2xvY2soaW5zdGFuY2UtPmN0cmxfcmVnX2xvY2spOworCQkqaW5zdGFuY2UtPmN0cmxfcmVnX21pcnJvciAmPQorCQkgICAgfihNRTgyNTVfUE9SVF8wX09VVFBVVCA8PCBpbnN0YW5jZS0+ZGlvX2lkeCk7CisJCW91dGIoZ2V0X21vZGVfZnJvbV9taXJyb3IoKmluc3RhbmNlLT5jdHJsX3JlZ19taXJyb3IpLAorCQkgICAgIGluc3RhbmNlLT5jdHJsX3JlZyk7CisJCXNwaW5fdW5sb2NrKGluc3RhbmNlLT5jdHJsX3JlZ19sb2NrKTsKKwl9IGVsc2UgaWYgKHNpbmdsZV9jb25maWcgPT0gTUVfU0lOR0xFX0NPTkZJR19ESU9fT1VUUFVUKSB7CisJCXNwaW5fbG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJCSppbnN0YW5jZS0+Y3RybF9yZWdfbWlycm9yIHw9CisJCSAgICAoTUU4MjU1X1BPUlRfMF9PVVRQVVQgPDwgaW5zdGFuY2UtPmRpb19pZHgpOworCQlvdXRiKGdldF9tb2RlX2Zyb21fbWlycm9yKCppbnN0YW5jZS0+Y3RybF9yZWdfbWlycm9yKSwKKwkJICAgICBpbnN0YW5jZS0+Y3RybF9yZWcpOworCQlzcGluX3VubG9jayhpbnN0YW5jZS0+Y3RybF9yZWdfbG9jayk7CisJfSBlbHNlIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHBvcnQgZGlyZWN0aW9uLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRzsKKwl9CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjU1X2lvX3NpbmdsZV9yZWFkKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSBpbnQgY2hhbm5lbCwKKwkJCQkgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJbWU4MjU1X3N1YmRldmljZV90ICppbnN0YW5jZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODI1NV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCSp2YWx1ZSA9IGluYihpbnN0YW5jZS0+cG9ydF9yZWcpICYgKDB4MSA8PCBjaGFubmVsKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQkqdmFsdWUgPSBpbmIoaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBieXRlIG51bWJlci5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9DSEFOTkVMOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUEVSUk9SKCJJbnZhbGlkIGZsYWdzIHNwZWNpZmllZC5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0ZMQUdTOworCX0KKwlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKKworCU1FX1NVQkRFVklDRV9FWElUOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZTgyNTVfaW9fc2luZ2xlX3dyaXRlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgIGludCBjaGFubmVsLAorCQkJCSAgaW50IHZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwltZTgyNTVfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCXVpbnQ4X3QgYnl0ZTsKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWluc3RhbmNlID0gKG1lODI1NV9zdWJkZXZpY2VfdCAqKSBzdWJkZXZpY2U7CisKKwlNRV9TVUJERVZJQ0VfRU5URVI7CisKKwlzcGluX2xvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisJc3dpdGNoIChmbGFncykgeworCWNhc2UgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVDoKKwkJaWYgKChjaGFubmVsID49IDApICYmIChjaGFubmVsIDwgOCkpIHsKKwkJCWlmICgqaW5zdGFuY2UtPgorCQkJICAgIGN0cmxfcmVnX21pcnJvciAmIChNRTgyNTVfUE9SVF8wX09VVFBVVCA8PAorCQkJCQkgICAgICAgaW5zdGFuY2UtPmRpb19pZHgpKSB7CisJCQkJYnl0ZSA9IGluYihpbnN0YW5jZS0+cG9ydF9yZWcpOworCisJCQkJaWYgKHZhbHVlKQorCQkJCQlieXRlIHw9IDB4MSA8PCBjaGFubmVsOworCQkJCWVsc2UKKwkJCQkJYnl0ZSAmPSB+KDB4MSA8PCBjaGFubmVsKTsKKworCQkJCW91dGIoYnl0ZSwgaW5zdGFuY2UtPnBvcnRfcmVnKTsKKwkJCX0gZWxzZSB7CisJCQkJUEVSUk9SKCJQb3J0IG5vdCBpbiBvdXRwdXQgbW9kZS5cbiIpOworCQkJCWVyciA9IE1FX0VSUk5PX1BSRVZJT1VTX0NPTkZJRzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVBFUlJPUigiSW52YWxpZCBiaXQgbnVtYmVyLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19JTlZBTElEX0NIQU5ORUw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1FX0lPX1NJTkdMRV9OT19GTEFHUzoKKwljYXNlIE1FX0lPX1NJTkdMRV9UWVBFX0RJT19CWVRFOgorCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQlpZiAoKmluc3RhbmNlLT4KKwkJCSAgICBjdHJsX3JlZ19taXJyb3IgJiAoTUU4MjU1X1BPUlRfMF9PVVRQVVQgPDwKKwkJCQkJICAgICAgIGluc3RhbmNlLT5kaW9faWR4KSkgeworCQkJCW91dGIodmFsdWUsIGluc3RhbmNlLT5wb3J0X3JlZyk7CisJCQl9IGVsc2UgeworCQkJCVBFUlJPUigiUG9ydCBub3QgaW4gb3V0cHV0IG1vZGUuXG4iKTsKKwkJCQllcnIgPSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUc7CisJCQl9CisJCX0gZWxzZSB7CisJCQlQRVJST1IoIkludmFsaWQgYnl0ZSBudW1iZXIuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBmbGFncyBzcGVjaWZpZWQuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5WQUxJRF9GTEFHUzsKKwl9CisJc3Bpbl91bmxvY2soJmluc3RhbmNlLT5zdWJkZXZpY2VfbG9jayk7CisKKwlNRV9TVUJERVZJQ0VfRVhJVDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWU4MjU1X3F1ZXJ5X251bWJlcl9jaGFubmVscyhzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCWludCAqbnVtYmVyKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkqbnVtYmVyID0gTUU4MjU1X05VTUJFUl9DSEFOTkVMUzsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZTgyNTVfcXVlcnlfc3ViZGV2aWNlX3R5cGUoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCSAgICAgICBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKnR5cGUgPSBNRV9UWVBFX0RJTzsKKwkqc3VidHlwZSA9IE1FX1NVQlRZUEVfU0lOR0xFOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lODI1NV9xdWVyeV9zdWJkZXZpY2VfY2FwcyhzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgICAgIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPSBNRV9DQVBTX0RJT19ESVJfQllURTsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworbWU4MjU1X3N1YmRldmljZV90ICptZTgyNTVfY29uc3RydWN0b3IodWludDMyX3QgZGV2aWNlX2lkLAorCQkJCSAgICAgICB1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IG1lODI1NV9pZHgsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBkaW9faWR4LAorCQkJCSAgICAgICBpbnQgKmN0cmxfcmVnX21pcnJvciwKKwkJCQkgICAgICAgc3BpbmxvY2tfdCAqIGN0cmxfcmVnX2xvY2spCit7CisJbWU4MjU1X3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlICovCisJc3ViZGV2aWNlID0ga21hbGxvYyhzaXplb2YobWU4MjU1X3N1YmRldmljZV90KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXN1YmRldmljZSkgeworCQlQRVJST1IoIkNhbm5vdCBnZXQgbWVtb3J5IGZvciA4MjU1IGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzdWJkZXZpY2UsIDAsIHNpemVvZihtZTgyNTVfc3ViZGV2aWNlX3QpKTsKKworCS8qIENoZWNrIGlmIGNvdW50ZXIgaW5kZXggaXMgb3V0IG9mIHJhbmdlICovCisKKwlpZiAoZGlvX2lkeCA+IDIpIHsKKwkJUEVSUk9SKCJESU8gaW5kZXggaXMgb3V0IG9mIHJhbmdlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIEluaXRpYWxpemUgc3ViZGV2aWNlIGJhc2UgY2xhc3MgKi8KKwllcnIgPSBtZV9zdWJkZXZpY2VfaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyBpbnN0YW5jZS5cbiIpOworCQlrZnJlZShzdWJkZXZpY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLy8gSW5pdGlhbGl6ZSBzcGluIGxvY2tzLgorCXNwaW5fbG9ja19pbml0KCZzdWJkZXZpY2UtPnN1YmRldmljZV9sb2NrKTsKKworCXN1YmRldmljZS0+Y3RybF9yZWdfbG9jayA9IGN0cmxfcmVnX2xvY2s7CisKKwkvKiBTYXZlIHRoZSBwb2ludGVyIHRvIGdsb2JhbCBwb3J0IHNldHRpbmdzICovCisJc3ViZGV2aWNlLT5jdHJsX3JlZ19taXJyb3IgPSBjdHJsX3JlZ19taXJyb3I7CisKKwkvKiBTYXZlIHR5cGUgb2YgTWVpbGhhdXMgZGV2aWNlICovCisJc3ViZGV2aWNlLT5kZXZpY2VfaWQgPSBkZXZpY2VfaWQ7CisKKwkvKiBTYXZlIHRoZSBpbmRpY2VzICovCisJc3ViZGV2aWNlLT5tZTgyNTVfaWR4ID0gbWU4MjU1X2lkeDsKKwlzdWJkZXZpY2UtPmRpb19pZHggPSBkaW9faWR4OworCisJLyogRG8gZGV2aWNlIHNwZWNpZmljIGluaXRpYWxpemF0aW9uICovCisJc3dpdGNoIChkZXZpY2VfaWQpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDAwOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RTA6CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBBOgorCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RUE6CisJCS8qIENoZWNrIGlmIDgyNTUgaW5kZXggaXMgb3V0IG9mIHJhbmdlICovCisJCWlmIChtZTgyNTVfaWR4ID4gMCkgeworCQkJUEVSUk9SKCI4MjU1IGluZGV4IGlzIG91dCBvZiByYW5nZS5cbiIpOworCQkJbWVfc3ViZGV2aWNlX2RlaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKwkJCWtmcmVlKHN1YmRldmljZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQjoJLyogRmFsbCB0aHJvdWdoICovCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFQjoKKwkJLyogQ2hlY2sgaWYgODI1NSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UgKi8KKwkJaWYgKG1lODI1NV9pZHggPiAxKSB7CisJCQlQRVJST1IoIjgyNTUgaW5kZXggaXMgb3V0IG9mIHJhbmdlLlxuIik7CisJCQltZV9zdWJkZXZpY2VfZGVpbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCQkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJLyogR2V0IHRoZSByZWdpc3RlcnMgKi8KKwkJaWYgKG1lODI1NV9pZHggPT0gMCkgeworCQkJc3ViZGV2aWNlLT5jdHJsX3JlZyA9IHJlZ19iYXNlICsgTUUxNDAwQUJfUE9SVF9BX0NUUkw7CisJCQlzdWJkZXZpY2UtPnBvcnRfcmVnID0KKwkJCSAgICByZWdfYmFzZSArIE1FMTQwMEFCX1BPUlRfQV8wICsgZGlvX2lkeDsKKwkJfSBlbHNlIGlmIChtZTgyNTVfaWR4ID09IDEpIHsKKwkJCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FMTQwMEFCX1BPUlRfQl9DVFJMOworCQkJc3ViZGV2aWNlLT5wb3J0X3JlZyA9CisJCQkgICAgcmVnX2Jhc2UgKyBNRTE0MDBBQl9QT1JUX0JfMCArIGRpb19pZHg7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEM6CisJCS8qIENoZWNrIGlmIDgyNTUgaW5kZXggaXMgb3V0IG9mIHJhbmdlICovCisJCWlmIChtZTgyNTVfaWR4ID4gMCkgeworCQkJUEVSUk9SKCI4MjU1IGluZGV4IGlzIG91dCBvZiByYW5nZS5cbiIpOworCQkJbWVfc3ViZGV2aWNlX2RlaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKwkJCWtmcmVlKHN1YmRldmljZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwRDoJLyogRmFsbCB0aHJvdWdoICovCisJCS8qIENoZWNrIGlmIDgyNTUgaW5kZXggaXMgb3V0IG9mIHJhbmdlICovCisJCWlmIChtZTgyNTVfaWR4ID4gMSkgeworCQkJUEVSUk9SKCI4MjU1IGluZGV4IGlzIG91dCBvZiByYW5nZS5cbiIpOworCQkJbWVfc3ViZGV2aWNlX2RlaW5pdCgmc3ViZGV2aWNlLT5iYXNlKTsKKwkJCWtmcmVlKHN1YmRldmljZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCS8qIEdldCB0aGUgcmVnaXN0ZXJzICovCisJCWlmIChtZTgyNTVfaWR4ID09IDApIHsKKwkJCXN1YmRldmljZS0+Y3RybF9yZWcgPSByZWdfYmFzZSArIE1FMTQwMENEX1BPUlRfQV9DVFJMOworCQkJc3ViZGV2aWNlLT5wb3J0X3JlZyA9CisJCQkgICAgcmVnX2Jhc2UgKyBNRTE0MDBDRF9QT1JUX0FfMCArIGRpb19pZHg7CisJCX0gZWxzZSBpZiAobWU4MjU1X2lkeCA9PSAxKSB7CisJCQlzdWJkZXZpY2UtPmN0cmxfcmVnID0gcmVnX2Jhc2UgKyBNRTE0MDBDRF9QT1JUX0JfQ1RSTDsKKwkJCXN1YmRldmljZS0+cG9ydF9yZWcgPQorCQkJICAgIHJlZ19iYXNlICsgTUUxNDAwQ0RfUE9SVF9CXzAgKyBkaW9faWR4OworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIlVua25vd24gZGV2aWNlIHR5cGUuIGRldiBJRDogMHglMDR4XG4iLCBkZXZpY2VfaWQpOworCisJCW1lX3N1YmRldmljZV9kZWluaXQoJnN1YmRldmljZS0+YmFzZSk7CisKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBPdmVybG9hZCBzdWJkZXZpY2UgYmFzZSBjbGFzcyBtZXRob2RzLiAqLworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlID0KKwkgICAgbWU4MjU1X2lvX3Jlc2V0X3N1YmRldmljZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9jb25maWcgPSBtZTgyNTVfaW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWU4MjU1X2lvX3NpbmdsZV9yZWFkOworCXN1YmRldmljZS0+YmFzZS5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlID0gbWU4MjU1X2lvX3NpbmdsZV93cml0ZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lODI1NV9xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSA9CisJICAgIG1lODI1NV9xdWVyeV9zdWJkZXZpY2VfdHlwZTsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzID0KKwkgICAgbWU4MjU1X3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCisJcmV0dXJuIHN1YmRldmljZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyNTUuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyNTUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzgyMzAwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODI1NS5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qKgorICogQGZpbGUgbWU4MjU1LmgKKyAqCisgKiBAYnJpZWYgTWVpbGhhdXMgUElPIDgyNTUgaW1wbGVtZW50YXRpb24uCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDYgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworI2lmbmRlZiBfTUU4MjU1X0hfCisjZGVmaW5lIF9NRTgyNTVfSF8KKworI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisjaW5jbHVkZSAibWVzbG9jay5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgODI1NSBzdWJkZXZpY2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lODI1NV9zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisKKwlpbnQgKmN0cmxfcmVnX21pcnJvcjsJCQkvKio8IFBvaW50ZXIgdG8gbWlycm9yIG9mIHRoZSBjb250cm9sIHJlZ2lzdGVyLiAqLworCXNwaW5sb2NrX3QgKmN0cmxfcmVnX2xvY2s7CQkvKio8IFNwaW4gbG9jayB0byBwcm90ZWN0ICNjdHJsX3JlZyBhbmQgI2N0cmxfcmVnX21pcnJvciBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzLiAqLworCisJdWludDMyX3QgZGV2aWNlX2lkOwkJCQkvKio8IFRoZSBQQ0kgZGV2aWNlIGlkIG9mIHRoZSBkZXZpY2UgaG9sZGluZyB0aGUgODI1NSBjaGlwLiAqLworCWludCBtZTgyNTVfaWR4OwkJCQkJLyoqPCBUaGUgaW5kZXggb2YgdGhlIDgyNTUgY2hpcCBvbiB0aGUgZGV2aWNlLiAqLworCWludCBkaW9faWR4OwkJCQkJLyoqPCBUaGUgaW5kZXggb2YgdGhlIERJTyBwb3J0IG9uIHRoZSA4MjU1IGNoaXAuICovCisKKwl1bnNpZ25lZCBsb25nIHBvcnRfcmVnOwkJCS8qKjwgUmVnaXN0ZXIgdG8gcmVhZCBvciB3cml0ZSBhIHZhbHVlIGZyb20gb3IgdG8gdGhlIHBvcnQgcmVzcGVjdGl2ZWx5LiAqLworCXVuc2lnbmVkIGxvbmcgY3RybF9yZWc7CQkJLyoqPCBSZWdpc3RlciB0byBjb25maWd1cmUgdGhlIDgyNTUgbW9kZXMuICovCit9IG1lODI1NV9zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgODI1NSBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gZGV2aWNlX2lkIFRoZSBraW5kIG9mIE1laWxoYXVzIGRldmljZSBob2xkaW5nIHRoZSA4MjU1LgorICogQHBhcmFtIHJlZ19iYXNlIFRoZSByZWdpc3RlciBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBhcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MuCisgKiBAcGFyYW0gbWU4MjU1X2lkeCBUaGUgaW5kZXggb2YgdGhlIDgyNTUgY2hpcCBvbiB0aGUgTWVpbGhhdXMgZGV2aWNlLgorICogQHBhcmFtIGRpb19pZHggVGhlIGluZGV4IG9mIHRoZSBjb3VudGVyIGluc2lkZSBhIDgyNTUgY2hpcC4KKyAqIEBwYXJhbSBjdHJfcmVnX21pcnJvciBQb2ludGVyIHRvIG1pcnJvciBvZiBjb250cm9sIHJlZ2lzdGVyLgorICogQHBhcmFtIGN0cmxfcmVnX2xvY2sgUG9pbnRlciB0byBzcGluIGxvY2sgcHJvdGVjdGluZyB0aGUgODI1NSBjb250cm9sIHJlZ2lzdGVyIGFuZCAjY3RybF9yZWdfbWlycm9yIGZyb20gY29uY3VycmVudCBhY2Nlc3MuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIG5ldyBpbnN0YW5jZSBvbiBzdWNjZXNzLlxuCisgKiBOVUxMIG9uIGVycm9yLgorICovCittZTgyNTVfc3ViZGV2aWNlX3QgKm1lODI1NV9jb25zdHJ1Y3Rvcih1aW50MzJfdCBkZXZpY2VfaWQsCisJCQkJICAgICAgIHVpbnQzMl90IHJlZ19iYXNlLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbWU4MjU1X2lkeCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IGRpb19pZHgsCisJCQkJICAgICAgIGludCAqY3RybF9yZWdfbWlycm9yLAorCQkJCSAgICAgICBzcGlubG9ja190ICogY3RybF9yZWdfbG9jayk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjU1X3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODI1NV9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWRlYTFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODI1NV9yZWcuaApAQCAtMCwwICsxLDUwIEBACisvKioKKyAqIEBmaWxlIG1lODI1NV9yZWcuaAorICoKKyAqIEBicmllZiA4MjU1IGNvdW50ZXIgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDYgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworI2lmbmRlZiBfTUU4MjU1X1JFR19IXworI2RlZmluZSBfTUU4MjU1X1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FODI1NV9OVU1CRVJfQ0hBTk5FTFMJCTgJCS8qKjwgVGhlIG51bWJlciBvZiBjaGFubmVscyBwZXIgODI1NSBwb3J0LiAqLworCisjZGVmaW5lIE1FMTQwMEFCX1BPUlRfQV8wCQkJMHgwMDAwCS8qKjwgUG9ydCAwIG9mZnNldC4gKi8KKyNkZWZpbmUgTUUxNDAwQUJfUE9SVF9BXzEJCQkweDAwMDEJLyoqPCBQb3J0IDEgb2Zmc2V0LiAqLworI2RlZmluZSBNRTE0MDBBQl9QT1JUX0FfMgkJCTB4MDAwMgkvKio8IFBvcnQgMiBvZmZzZXQuICovCisjZGVmaW5lIE1FMTQwMEFCX1BPUlRfQV9DVFJMCQkweDAwMDMJLyoqPCBDb250cm9sIHJlZ2lzdGVyIGZvciA4MjU1IEEuICovCisKKyNkZWZpbmUgTUUxNDAwQUJfUE9SVF9CXzAJCQkweDAwMDgJLyoqPCBQb3J0IDAgb2Zmc2V0LiAqLworI2RlZmluZSBNRTE0MDBBQl9QT1JUX0JfMQkJCTB4MDAwOQkvKio8IFBvcnQgMSBvZmZzZXQuICovCisjZGVmaW5lIE1FMTQwMEFCX1BPUlRfQl8yCQkJMHgwMDBBCS8qKjwgUG9ydCAyIG9mZnNldC4gKi8KKyNkZWZpbmUgTUUxNDAwQUJfUE9SVF9CX0NUUkwJCTB4MDAwQgkvKio8IENvbnRyb2wgcmVnaXN0ZXIgZm9yIDgyNTUgQi4gKi8KKworI2RlZmluZSBNRTE0MDBDRF9QT1JUX0FfMAkJCTB4MDAwMAkvKio8IFBvcnQgMCBvZmZzZXQuICovCisjZGVmaW5lIE1FMTQwMENEX1BPUlRfQV8xCQkJMHgwMDAxCS8qKjwgUG9ydCAxIG9mZnNldC4gKi8KKyNkZWZpbmUgTUUxNDAwQ0RfUE9SVF9BXzIJCQkweDAwMDIJLyoqPCBQb3J0IDIgb2Zmc2V0LiAqLworI2RlZmluZSBNRTE0MDBDRF9QT1JUX0FfQ1RSTAkJMHgwMDAzCS8qKjwgQ29udHJvbCByZWdpc3RlciBmb3IgODI1NSBBLiAqLworCisjZGVmaW5lIE1FMTQwMENEX1BPUlRfQl8wCQkJMHgwMDQwCS8qKjwgUG9ydCAwIG9mZnNldC4gKi8KKyNkZWZpbmUgTUUxNDAwQ0RfUE9SVF9CXzEJCQkweDAwNDEJLyoqPCBQb3J0IDEgb2Zmc2V0LiAqLworI2RlZmluZSBNRTE0MDBDRF9QT1JUX0JfMgkJCTB4MDA0MgkvKio8IFBvcnQgMiBvZmZzZXQuICovCisjZGVmaW5lIE1FMTQwMENEX1BPUlRfQl9DVFJMCQkweDAwNDMJLyoqPCBDb250cm9sIHJlZ2lzdGVyIGZvciA4MjU1IEIuICovCisKKyNkZWZpbmUgTUU4MjU1X01PREVfT09PCQkJCTB4ODAJLyoqPCBQb3J0IDIgPSBPdXRwdXQsIFBvcnQgMSA9IE91dHB1dCwgUG9ydCAwID0gT3V0cHV0ICovCisjZGVmaW5lIE1FODI1NV9NT0RFX0lPTwkJCQkweDg5CS8qKjwgUG9ydCAyID0gSW5wdXQsICBQb3J0IDEgPSBPdXRwdXQsIFBvcnQgMCA9IE91dHB1dCAqLworI2RlZmluZSBNRTgyNTVfTU9ERV9PSU8JCQkJMHg4MgkvKio8IFBvcnQgMiA9IE91dHB1dCwgUG9ydCAxID0gSW5wdXQsICBQb3J0IDAgPSBPdXRwdXQgKi8KKyNkZWZpbmUgTUU4MjU1X01PREVfSUlPCQkJCTB4OEIJLyoqPCBQb3J0IDIgPSBJbnB1dCwgIFBvcnQgMSA9IElucHV0LCAgUG9ydCAwID0gT3V0cHV0ICovCisjZGVmaW5lIE1FODI1NV9NT0RFX09PSQkJCQkweDkwCS8qKjwgUG9ydCAyID0gT3V0cHV0LCBQb3J0IDEgPSBPdXRwdXQsIFBvcnQgMCA9IElucHV0ICovCisjZGVmaW5lIE1FODI1NV9NT0RFX0lPSQkJCQkweDk5CS8qKjwgUG9ydCAyID0gSW5wdXQsICBQb3J0IDEgPSBPdXRwdXQsIFBvcnQgMCA9IElucHV0ICovCisjZGVmaW5lIE1FODI1NV9NT0RFX09JSQkJCQkweDkyCS8qKjwgUG9ydCAyID0gT3V0cHV0LCBQb3J0IDEgPSBJbnB1dCwgIFBvcnQgMCA9IElucHV0ICovCisjZGVmaW5lIE1FODI1NV9NT0RFX0lJSQkJCQkweDlCCS8qKjwgUG9ydCAyID0gSW5wdXQsICBQb3J0IDEgPSBJbnB1dCwgIFBvcnQgMCA9IElucHV0ICovCisKKyNkZWZpbmUgTUU4MjU1X1BPUlRfMF9PVVRQVVQJCTB4MQkJLyoqPCBJZiBzZXQgaW4gbWlycm9yIHRoZW4gcG9ydCAwIGlzIGluIG91dHB1dCBtb2RlLiAqLworI2RlZmluZSBNRTgyNTVfUE9SVF8xX09VVFBVVAkJMHgyCQkvKio8IElmIHNldCBpbiBtaXJyb3IgdGhlbiBwb3J0IDEgaXMgaW4gb3V0cHV0IG1vZGUuICovCisjZGVmaW5lIE1FODI1NV9QT1JUXzJfT1VUUFVUCQkweDQJCS8qKjwgSWYgc2V0IGluIG1pcnJvciB0aGVuIHBvcnQgMiBpcyBpbiBvdXRwdXQgbW9kZS4gKi8KKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWNpcmNfYnVmLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVjaXJjX2J1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YjU5MWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVjaXJjX2J1Zi5oCkBAIC0wLDAgKzEsMTMxIEBACisvKioKKyAqIEBmaWxlIG1lY2lyY19idWYuaAorICoKKyAqIEBicmllZiBNZWlsaGF1cyBjaXJjdWxhciBidWZmZXIgaW1wbGVtZW50YXRpb24uCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlICAoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FQ0lSQ19CVUZfSF8KKyNkZWZpbmUgX01FQ0lSQ19CVUZfSF8KKworIyBpZmRlZiBfX0tFUk5FTF9fCisKKyMgIGlmZGVmIEJPU0NICisKK3R5cGVkZWYgc3RydWN0IG1lX2NpcmNfYnVmIHsKKwl1bnNpZ25lZCBpbnQgbWFzazsKKy8vICAgICAgdW5zaWduZWQgaW50IGNvdW50OworCXVpbnQzMl90ICpidWY7CisJaW50IHZvbGF0aWxlIGhlYWQ7CisJaW50IHZvbGF0aWxlIHRhaWw7Cit9IG1lX2NpcmNfYnVmX3Q7CisKK3N0YXRpYyBpbnQgaW5saW5lIG1lX2NpcmNfYnVmX3ZhbHVlcyhtZV9jaXJjX2J1Zl90ICogYnVmKQoreworLy8gICAgICByZXR1cm4gKChidWYtPmhlYWQgLSBidWYtPnRhaWwpICYgKGJ1Zi0+Y291bnQgLSAxKSk7CisJcmV0dXJuICgoYnVmLT5oZWFkIC0gYnVmLT50YWlsKSAmIChidWYtPm1hc2spKTsKK30KKworc3RhdGljIGludCBpbmxpbmUgbWVfY2lyY19idWZfc3BhY2UobWVfY2lyY19idWZfdCAqIGJ1ZikKK3sKKy8vICAgICAgcmV0dXJuICgoYnVmLT50YWlsIC0gKGJ1Zi0+aGVhZCArIDEpKSAmIChidWYtPmNvdW50IC0gMSkpOworCXJldHVybiAoKGJ1Zi0+dGFpbCAtIChidWYtPmhlYWQgKyAxKSkgJiAoYnVmLT5tYXNrKSk7Cit9CisKK3N0YXRpYyBpbnQgaW5saW5lIG1lX2NpcmNfYnVmX3ZhbHVlc190b19lbmQobWVfY2lyY19idWZfdCAqIGJ1ZikKK3sKKwlpbnQgZW5kOworCWludCBuOworLy8gICAgICBlbmQgPSBidWYtPmNvdW50IC0gYnVmLT50YWlsOworLy8gICAgICBuID0gKGJ1Zi0+aGVhZCArIGVuZCkgJiAoYnVmLT5jb3VudCAtIDEpOworCWVuZCA9IGJ1Zi0+bWFzayArIDEgLSBidWYtPnRhaWw7CisJbiA9IChidWYtPmhlYWQgKyBlbmQpICYgKGJ1Zi0+bWFzayk7CisJcmV0dXJuIChuIDwgZW5kKSA/IG4gOiBlbmQ7Cit9CisKK3N0YXRpYyBpbnQgaW5saW5lIG1lX2NpcmNfYnVmX3NwYWNlX3RvX2VuZChtZV9jaXJjX2J1Zl90ICogYnVmKQoreworCWludCBlbmQ7CisJaW50IG47CisKKy8vICAgICAgZW5kID0gYnVmLT5jb3VudCAtIDEgLSBidWYtPmhlYWQ7CisvLyAgICAgIG4gPSAoZW5kICsgYnVmLT50YWlsKSAmIChidWYtPmNvdW50IC0gMSk7CisJZW5kID0gYnVmLT5tYXNrIC0gYnVmLT5oZWFkOworCW4gPSAoZW5kICsgYnVmLT50YWlsKSAmIChidWYtPm1hc2spOworCXJldHVybiAobiA8PSBlbmQpID8gbiA6IChlbmQgKyAxKTsKK30KKworI2RlZmluZSBfQ0JVRkZfMzJiX3QKKworIyAgZWxzZQkvL35CT1NDSAorLy8vIEBub3RlIGJ1Zi0+bWFzayA9IGJ1Zi0+Y291bnQtMSA9IE1FNDYwMF9BSV9DSVJDX0JVRl9DT1VOVC0xCisKKyMgICBpZmRlZiBfQ0JVRkZfMzJiX3QKKwkvLzMyIGJpdAordHlwZWRlZiBzdHJ1Y3QgbWVfY2lyY19idWZfMzJiIHsKKwlpbnQgdm9sYXRpbGUgaGVhZDsKKwlpbnQgdm9sYXRpbGUgdGFpbDsKKwl1bnNpZ25lZCBpbnQgbWFzazsJLy9idWZmb3Igc2l6ZS0xIG11c3QgYmUgMl5uLTEgdG8gd29yaworCXVpbnQzMl90ICpidWY7Cit9IG1lX2NpcmNfYnVmX3Q7CisjICAgZWxzZQorCS8vMTYgYml0Cit0eXBlZGVmIHN0cnVjdCBtZV9jaXJjX2J1Zl8xNmIgeworCWludCB2b2xhdGlsZSBoZWFkOworCWludCB2b2xhdGlsZSB0YWlsOworCXVuc2lnbmVkIGludCBtYXNrOwkvL2J1ZmZvciBzaXplLTEgbXVzdCBiZSAyXm4tMSB0byB3b3JrCisJdWludDE2X3QgKmJ1ZjsKK30gbWVfY2lyY19idWZfdDsKKyMgICBlbmRpZiAvL19DQlVGRl8zMmJfdAorCisvKiogSG93IG1hbnkgdmFsdWVzIGlzIGluIGJ1ZmZlciAqLworc3RhdGljIGludCBpbmxpbmUgbWVfY2lyY19idWZfdmFsdWVzKG1lX2NpcmNfYnVmX3QgKiBidWYpCit7CisJcmV0dXJuICgoYnVmLT5oZWFkIC0gYnVmLT50YWlsKSAmIChidWYtPm1hc2spKTsKK30KKworLyoqIEhvdyBtYW55IHNwYWNlIGxlZnQgKi8KK3N0YXRpYyBpbnQgaW5saW5lIG1lX2NpcmNfYnVmX3NwYWNlKG1lX2NpcmNfYnVmX3QgKiBidWYpCit7CisJcmV0dXJuICgoYnVmLT50YWlsIC0gKGJ1Zi0+aGVhZCArIDEpKSAmIChidWYtPm1hc2spKTsKK30KKworLyoqIEhvdyBtYW55IHZhbHVlcyBjYW4gYmUgcmVhZCBmcm9tIGJ1ZmZvciBpbiBvbmUgY2h1bmNrLiAqLworc3RhdGljIGludCBpbmxpbmUgbWVfY2lyY19idWZfdmFsdWVzX3RvX2VuZChtZV9jaXJjX2J1Zl90ICogYnVmKQoreworCXJldHVybiAoYnVmLT50YWlsIDw9CisJCWJ1Zi0+aGVhZCkgPyAoYnVmLT5oZWFkIC0gYnVmLT50YWlsKSA6IChidWYtPm1hc2sgLSBidWYtPnRhaWwgKworCQkJCQkJCTEpOworfQorCisvKiogSG93IG1hbnkgdmFsdWVzIGNhbiBiZSB3cml0ZSB0byBidWZmZXIgaW4gb25lIGNodW5jay4gKi8KK3N0YXRpYyBpbnQgaW5saW5lIG1lX2NpcmNfYnVmX3NwYWNlX3RvX2VuZChtZV9jaXJjX2J1Zl90ICogYnVmKQoreworCXJldHVybiAoYnVmLT50YWlsIDw9CisJCWJ1Zi0+aGVhZCkgPyAoYnVmLT5tYXNrIC0gYnVmLT5oZWFkICsgMSkgOiAoYnVmLT50YWlsIC0KKwkJCQkJCQkgICAgYnVmLT5oZWFkIC0gMSk7Cit9CisKKyMgIGVuZGlmIC8vQk9TQ0gKKyMgZW5kaWYJLy9fX0tFUk5FTF9fCisjZW5kaWYgLy9fTUVDSVJDX0JVRl9IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lY29tbW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVjb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjQ3YzM4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lY29tbW9uLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogU291cmNlIEZpbGUJOm1lY29tbW9uLmgKKyAqIEF1dGhvcgk6R0cgKEd1ZW50ZXIgR2ViaGFyZHQpCTxnLmdlYmhhcmR0QG1laWxoYXVzLmRlPgorICogQXV0aG9yCTpLRyAoS3J6eXN6dG9mIEdhbnR6a2UpCTxrLmdhbnR6a2VAbWVpbGhhdXMuZGU+CisgKi8KKworI2lmbmRlZiBfTUVDT01NT05fSF8KKyNkZWZpbmUgX01FQ09NTU9OX0hfCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFRoZSB2ZXJzaW9uIG9mIHRoaXMgcmVsZWFzZQorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2lmbmRlZiBNRV9WRVJTSU9OX0RSSVZFUgorLyogVW5rbm93biB2ZXJzaW9uICovCisjIGRlZmluZSBNRV9WRVJTSU9OX0RSSVZFUgkweEZGRkZGRkZGCisjZW5kaWYKKworI2lmbmRlZiBMSUJNRURSSVZFUl9WRVJTSU9OCisvKiBVbmtub3duIHZlcnNpb24gKi8KKyMgZGVmaW5lIExJQk1FRFJJVkVSX1ZFUlNJT04JMHhGRkZGRkZGRgorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZGVidWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNmYjk3YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRlYnVnLmgKQEAgLTAsMCArMSwxMjUgQEAKKy8qKgorICogQGZpbGUgbWVkZWJ1Zy5oCisgKgorICogQGJyaWVmIERlYnVnZ2luZyBkZWZpbmVzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA2IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKyNpZm5kZWYgX01FREVCVUdfSF8KKyNkZWZpbmUgX01FREVCVUdfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisvL01lc3NhZ2VzIGNvbnRyb2wuCisKKyNpZmRlZiBNRURFQlVHX1RFU1RfQUxMCQkvKiBTd2l0Y2ggdG8gZW5hYmxlIGFsbCBpbmZvIG1lc3NhZ2VzLiAqLworIyBpZm5kZWYgTUVERUJVR19URVNUCisjICBkZWZpbmUgTUVERUJVR19URVNUCisjIGVuZGlmCisjIGlmbmRlZiBNRURFQlVHX1RFU1RfSU5GTworIyAgZGVmaW5lIE1FREVCVUdfVEVTVF9JTkZPCisjIGVuZGlmCisjIGlmbmRlZiBNRURFQlVHX0RFQlVHX1JFRworIyAgZGVmaW5lIE1FREVCVUdfREVCVUdfUkVHCS8qIFN3aXRjaCB0byBlbmFibGUgcmVnaXN0cnkgYWNjZXNzIGRlYnVnaW5nIG1lc3NhZ2VzLiAqLworIyBlbmRpZgorIyBpZm5kZWYgTUVERUJVR19ERUJVR19MT0NLUworIyAgZGVmaW5lIE1FREVCVUdfREVCVUdfTE9DS1MJLyogU3dpdGNoIHRvIGVuYWJsZSBsb2NraW5nIG1lc3NhZ2VzLiAqLworIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBNRURFQlVHX1RFU1RfSU5GTwkvKiBTd2l0Y2ggdG8gZW5hYmxlIGluZm8gIGFuZCB0ZXN0IG1lc3NhZ2VzLiAqLworIyBpZm5kZWYgTUVERUJVR19JTkZPCisjICBkZWZpbmUgTUVERUJVR19JTkZPCQkvKiBTd2l0Y2ggdG8gZW5hYmxlIGluZm8gbWVzc2FnZXMuICovCisjIGVuZGlmCisjIGlmbmRlZiBNRURFQlVHX1RFU1QKKyMgIGRlZmluZSBNRURFQlVHX1RFU1QKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgTUVERUJVR19URVNUCQkvKiBTd2l0Y2ggdG8gZW5hYmxlIGRlYnVnIHRlc3QgbWVzc2FnZXMuICovCisjIGlmbmRlZiBNRURFQlVHX0RFQlVHCisjICBkZWZpbmUgTUVERUJVR19ERUJVRwkJLyogU3dpdGNoIHRvIGVuYWJsZSBkZWJ1ZyBtZXNzYWdlcy4gKi8KKyMgZW5kaWYKKyMgaWZuZGVmIE1FREVCVUdfRVJST1IKKyMgIGRlZmluZSBNRURFQlVHX0VSUk9SCQkvKiBTd2l0Y2ggdG8gZW5hYmxlIGVycm9yIG1lc3NhZ2VzLiAqLworIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBNRURFQlVHX0VSUk9SCQkvKiBTd2l0Y2ggdG8gZW5hYmxlIGVycm9yIG1lc3NhZ2VzLiAqLworIyBpZm5kZWYgTUVERUJVR19FUlJPUl9DUklUSUNBTAkvKiBBbHNvIGNyaXRpY2FsIGVycm9yIG1lc3NhZ2VzLiAqLworIyAgZGVmaW5lIE1FREVCVUdfRVJST1JfQ1JJVElDQUwJLyogU3dpdGNoIHRvIGVuYWJsZSBoaWdoIGltcG9ydGFuY2UgZXJyb3IgbWVzc2FnZXMuICovCisjIGVuZGlmCisjZW5kaWYKKworI3VuZGVmIFBERUJVRwkJCS8qIE9ubHkgdG8gYmUgc3VyZS4gKi8KKyN1bmRlZiBQSU5GTwkJCS8qIE9ubHkgdG8gYmUgc3VyZS4gKi8KKyN1bmRlZiBQRVJST1IJCQkvKiBPbmx5IHRvIGJlIHN1cmUuICovCisjdW5kZWYgUEVSUk9SX0NSSVRJQ0FMCQkvKiBPbmx5IHRvIGJlIHN1cmUuICovCisjdW5kZWYgUERFQlVHX1JFRwkJLyogT25seSB0byBiZSBzdXJlLiAqLworI3VuZGVmIFBERUJVR19MT0NLUwkJLyogT25seSB0byBiZSBzdXJlLiAqLworI3VuZGVmIFBTRUNVUklUWQkJLyogT25seSB0byBiZSBzdXJlLiAqLworI3VuZGVmIFBMT0cJCQkvKiBPbmx5IHRvIGJlIHN1cmUuICovCisKKyNpZmRlZiBNRURFQlVHX0RFQlVHCisjIGRlZmluZSBQREVCVUcoZm10LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUciTUVfRFJWIEQ6IDwlcz4gIiBmbXQsIF9fZnVuY19fLCAjI2FyZ3MpCisjZWxzZQorIyBkZWZpbmUgUERFQlVHKGZtdCwgYXJncy4uLikKKyNlbmRpZgorCisjaWZkZWYgTUVERUJVR19ERUJVR19MT0NLUworIyBkZWZpbmUgUERFQlVHX0xPQ0tTKGZtdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIk1FX0RSViBMOiA8JXM+ICIgZm10LCBfX2Z1bmNfXywgIyNhcmdzKQorI2Vsc2UKKyMgZGVmaW5lIFBERUJVR19MT0NLUyhmbXQsIGFyZ3MuLi4pCisjZW5kaWYKKworI2lmZGVmIE1FREVCVUdfREVCVUdfUkVHCisjIGRlZmluZSBQREVCVUdfUkVHKGZtdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIk1FX0RSViBSOiA8JXM6JWQ+IFJFRzoiIGZtdCwgX19mdW5jX18sIF9fTElORV9fLCAjI2FyZ3MpCisjZWxzZQorIyBkZWZpbmUgUERFQlVHX1JFRyhmbXQsIGFyZ3MuLi4pCisjZW5kaWYKKworI2lmZGVmIE1FREVCVUdfSU5GTworIyBkZWZpbmUgUElORk8oZm10LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fSU5GTyJNRV9EUlYgSTogIiBmbXQsICMjYXJncykKKyNlbHNlCisjIGRlZmluZSBQSU5GTyhmbXQsIGFyZ3MuLi4pCisjZW5kaWYKKworI2lmZGVmIE1FREVCVUdfRVJST1IKKyMgZGVmaW5lIFBFUlJPUihmbXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9FUlIiTUVfRFJWIEU6IDwlczolaT4gIiBmbXQsIF9fRklMRV9fLCBfX0xJTkVfXywgIyNhcmdzKQorI2Vsc2UKKyMgZGVmaW5lIFBFUlJPUihmbXQsIGFyZ3MuLi4pCisjZW5kaWYKKworI2lmZGVmIE1FREVCVUdfRVJST1JfQ1JJVElDQUwKKyMgZGVmaW5lIFBFUlJPUl9DUklUSUNBTChmbXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9DUklUIk1FX0RSViBDOiA8JXM6JWk+ICIgZm10LCBfX0ZJTEVfXywgX19MSU5FX18sICMjYXJncykKKyNlbHNlCisjIGRlZmluZSBQRVJST1JfQ1JJVElDQUwoZm10LCBhcmdzLi4uKQorI2VuZGlmCisKKy8vVGhpcyBkZWJ1ZyBpcyBvbmx5IHRvIGRldGVjdCBsb2dpY2FsIGVycm9ycyEKKyMgZGVmaW5lIFBTRUNVUklUWShmbXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9DUklUIk1FX0RSViBTRUNVUklUWTogPCVzOiVzOiVpPiAiIGZtdCwgX19GSUxFX18sIF9fZnVuY19fLCBfX0xJTkVfXywgIyNhcmdzKQorLy9UaGlzIGRlYnVnIGlzIHRvIGtlZXAgdHJhY2sgaW4gY3VzdG9tZXJzJyBzeXN0ZW0KKyMgZGVmaW5lIFBMT0coZm10LCBhcmdzLi4uKSBcCisJcHJpbnRrKEtFUk5fSU5GTyJNRV9EUlY6ICIgZm10LCAjI2FyZ3MpCisKKy8vVGhpcyBkZWJ1ZyBpcyB0byBjaGVjayBuZXcgcGFydHMgZHVyaW5nIGRldmVsb3BtZW50CisjaWZkZWYgTUVERUJVR19ERVZFTE9QCisjIGRlZmluZSBQREVWRUxPUChmbXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9DUklUIk1FX0RSVjogPCVzOiVzOiVpPiAiIGZtdCwgX19GSUxFX18sIF9fZnVuY19fLCBfX0xJTkVfXywgIyNhcmdzKQorI2Vsc2UKKyMgZGVmaW5lIFBERVZFTE9QKGZtdCwgYXJncy4uLikKKyNlbmRpZgorCisjZW5kaWYgLy9fX0tFUk5FTF9fCisjZW5kaWYgLy9fTUVERUJVR19IXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZGVmaW5lcy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZGVmaW5lcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNThlZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkZWZpbmVzLmgKQEAgLTAsMCArMSw0NDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFNvdXJjZSBGaWxlIDogbWVkZWZpbmVzLmgKKyAqIEF1dGhvciAgICAgIDogR0cgKEd1ZW50ZXIgR2ViaGFyZHQpICA8Zy5nZWJoYXJkdEBtZWlsaGF1cy5kZT4KKyAqIEF1dGhvciAgICAgIDogS0cgKEtyenlzenRvZiBHYW50emtlKSAgPGsuZ2FudHprZUBtZWlsaGF1cy5kZT4KKyAqLworCisjaWZuZGVmIF9NRURFRklORVNfSF8KKyNkZWZpbmUgX01FREVGSU5FU19IXworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBHZW5lcmFsCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX1ZBTFVFX05PVF9VU0VECQkJCQkJCTB4MAorI2RlZmluZSBNRV9WQUxVRV9JTlZBTElECQkJCQkJCX4weDAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBjb21tb24gdG8gYWNjZXNzIGZ1bmN0aW9ucworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9MT0NLX1JFTEVBU0UJCQkJCQkJCTB4MDAwMTAwMDEKKyNkZWZpbmUgTUVfTE9DS19TRVQJCQkJCQkJCQkweDAwMDEwMDAyCisjZGVmaW5lIE1FX0xPQ0tfQ0hFQ0sJCQkJCQkJCTB4MDAwMTAwMDMKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBtZU9wZW4gZnVuY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfT1BFTl9OT19GTEFHUwkJCQkJCQkweDAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBtZUNsb3NlIGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX0NMT1NFX05PX0ZMQUdTCQkJCQkJCTB4MAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIG1lTG9ja0RyaXZlciBmdW5jdGlvbgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9MT0NLX0RSSVZFUl9OT19GTEFHUwkJCQkJCTB4MAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIG1lTG9ja0RldmljZSBmdW5jdGlvbgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9MT0NLX0RFVklDRV9OT19GTEFHUwkJCQkJCTB4MAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIG1lTG9ja1N1YmRldmljZSBmdW5jdGlvbgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9MT0NLX1NVQkRFVklDRV9OT19GTEFHUwkJCQkJMHgwCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBjb21tb24gdG8gZXJyb3IgZnVuY3Rpb25zCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX0VSUk9SX01TR19NQVhfQ09VTlQJCQkJCQkyNTYKKworI2RlZmluZSBNRV9TV0lUQ0hfRElTQUJMRQkJCQkJCQkweDAwMDIwMDAxCisjZGVmaW5lIE1FX1NXSVRDSF9FTkFCTEUJCQkJCQkJMHgwMDAyMDAwMgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGNvbW1vbiB0byBpbyBmdW5jdGlvbnMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfUkVGX0RJT19GSUZPX0xPVwkJCQkJCQkweDAwMDMwMDAxCisjZGVmaW5lIE1FX1JFRl9ESU9fRklGT19ISUdICQkJCQkJMHgwMDAzMDAwMgorCisjZGVmaW5lIE1FX1JFRl9DVFJfUFJFVklPVVMJCQkJCQkJMHgwMDA0MDAwMQorI2RlZmluZSBNRV9SRUZfQ1RSX0lOVEVSTkFMXzFNSFoJCQkJCTB4MDAwNDAwMDIKKyNkZWZpbmUgTUVfUkVGX0NUUl9JTlRFUk5BTF8xME1IWgkJCQkJMHgwMDA0MDAwMworI2RlZmluZSBNRV9SRUZfQ1RSX0VYVEVSTkFMCQkJCQkJCTB4MDAwNDAwMDQKKworI2RlZmluZSBNRV9SRUZfQUlfR1JPVU5ECQkJCQkJCTB4MDAwNTAwMDEKKyNkZWZpbmUgTUVfUkVGX0FJX0RJRkZFUkVOVElBTAkJCQkJCTB4MDAwNTAwMDIKKworI2RlZmluZSBNRV9SRUZfQU9fR1JPVU5ECQkJCQkJCTB4MDAwNjAwMDEKKworI2RlZmluZSBNRV9UUklHX0NIQU5fREVGQVVMVAkJCQkJCTB4MDAwNzAwMDEKKyNkZWZpbmUgTUVfVFJJR19DSEFOX1NZTkNIUk9OT1VTCQkJCQkweDAwMDcwMDAyCisKKyNkZWZpbmUgTUVfVFJJR19UWVBFX05PTkUJCQkJCQkJMHgwMDAwMDAwMAorI2RlZmluZSBNRV9UUklHX1RZUEVfU1cJCQkJCQkJCTB4MDAwODAwMDEKKyNkZWZpbmUgTUVfVFJJR19UWVBFX1RIUkVTSE9MRAkJCQkJCTB4MDAwODAwMDIKKyNkZWZpbmUgTUVfVFJJR19UWVBFX1dJTkRPVwkJCQkJCQkweDAwMDgwMDAzCisjZGVmaW5lIE1FX1RSSUdfVFlQRV9FREdFCQkJCQkJCTB4MDAwODAwMDQKKyNkZWZpbmUgTUVfVFJJR19UWVBFX1NMT1BFCQkJCQkJCTB4MDAwODAwMDUKKyNkZWZpbmUgTUVfVFJJR19UWVBFX0VYVF9ESUdJVEFMCQkJCQkweDAwMDgwMDA2CisjZGVmaW5lIE1FX1RSSUdfVFlQRV9FWFRfQU5BTE9HCQkJCQkJMHgwMDA4MDAwNworI2RlZmluZSBNRV9UUklHX1RZUEVfUEFUVEVSTgkJCQkJCTB4MDAwODAwMDgKKyNkZWZpbmUgTUVfVFJJR19UWVBFX1RJTUVSCQkJCQkJCTB4MDAwODAwMDkKKyNkZWZpbmUgTUVfVFJJR19UWVBFX0NPVU5UCQkJCQkJCTB4MDAwODAwMEEKKyNkZWZpbmUgTUVfVFJJR19UWVBFX0ZPTExPVwkJCQkJCQkweDAwMDgwMDBCCisKKyNkZWZpbmUgTUVfVFJJR19FREdFX05PTkUJCQkJCQkJMHgwMDAwMDAwMAorI2RlZmluZSBNRV9UUklHX0VER0VfQUJPVkUJCQkJCQkJMHgwMDA5MDAwMQorI2RlZmluZSBNRV9UUklHX0VER0VfQkVMT1cJCQkJCQkJMHgwMDA5MDAwMgorI2RlZmluZSBNRV9UUklHX0VER0VfRU5UUlkJCQkJCQkJMHgwMDA5MDAwMworI2RlZmluZSBNRV9UUklHX0VER0VfRVhJVAkJCQkJCQkweDAwMDkwMDA0CisjZGVmaW5lIE1FX1RSSUdfRURHRV9SSVNJTkcJCQkJCQkJMHgwMDA5MDAwNQorI2RlZmluZSBNRV9UUklHX0VER0VfRkFMTElORwkJCQkJCTB4MDAwOTAwMDYKKyNkZWZpbmUgTUVfVFJJR19FREdFX0FOWQkJCQkJCQkweDAwMDkwMDA3CisKKyNkZWZpbmUgTUVfVElNRVJfQUNRX1NUQVJUCQkJCQkJCTB4MDAwQTAwMDEKKyNkZWZpbmUgTUVfVElNRVJfU0NBTl9TVEFSVAkJCQkJCQkweDAwMEEwMDAyCisjZGVmaW5lIE1FX1RJTUVSX0NPTlZfU1RBUlQJCQkJCQkJMHgwMDBBMDAwMworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGZvciBtZUlPRnJlcXVlbmN5VG9UaWNrcyBmdW5jdGlvbgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9JT19GUkVRVUVOQ1lfVE9fVElDS1NfTk9fRkxBR1MJCQkweDAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBmb3IgbWVJT0lycVN0YXJ0IGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX0lSUV9TT1VSQ0VfRElPX1BBVFRFUk4JCQkJCTB4MDAwQjAwMDEKKyNkZWZpbmUgTUVfSVJRX1NPVVJDRV9ESU9fTUFTSwkJCQkJCTB4MDAwQjAwMDIKKyNkZWZpbmUgTUVfSVJRX1NPVVJDRV9ESU9fTElORQkJCQkJCTB4MDAwQjAwMDMKKyNkZWZpbmUgTUVfSVJRX1NPVVJDRV9ESU9fT1ZFUl9URU1QCQkJCQkweDAwMEIwMDA0CisKKyNkZWZpbmUgTUVfSVJRX0VER0VfTk9UX1VTRUQJCQkJCQkweDAwMDAwMDAwCisjZGVmaW5lIE1FX0lSUV9FREdFX1JJU0lORwkJCQkJCQkweDAwMEMwMDAxCisjZGVmaW5lIE1FX0lSUV9FREdFX0ZBTExJTkcJCQkJCQkJMHgwMDBDMDAwMgorI2RlZmluZSBNRV9JUlFfRURHRV9BTlkJCQkJCQkJCTB4MDAwQzAwMDMKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBmb3IgbWVJT0lycVN0YXJ0IGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX0lPX0lSUV9TVEFSVF9OT19GTEFHUwkJCQkJMHgwMDAwMDAKKyNkZWZpbmUgTUVfSU9fSVJRX1NUQVJUX0RJT19CSVQJCQkJCQkweDAwMDAwMQorI2RlZmluZSBNRV9JT19JUlFfU1RBUlRfRElPX0JZVEUJCQkJCTB4MDAwMDAyCisjZGVmaW5lIE1FX0lPX0lSUV9TVEFSVF9ESU9fV09SRAkJCQkJMHgwMDAwMDQKKyNkZWZpbmUgTUVfSU9fSVJRX1NUQVJUX0RJT19EV09SRAkJCQkJMHgwMDAwMDgKKyNkZWZpbmUgTUVfSU9fSVJRX1NUQVJUX1BBVFRFUk5fRklMVEVSSU5HCQkJMHgwMDAwMTAKKyNkZWZpbmUgTUVfSU9fSVJRX1NUQVJUX0VYVEVOREVEX1NUQVRVUwkJCQkweDAwMDAyMAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGZvciBtZUlPSXJxV2FpdCBmdW5jdGlvbgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9JT19JUlFfV0FJVF9OT19GTEFHUwkJCQkJCTB4MDAwMDAwCisjZGVmaW5lIE1FX0lPX0lSUV9XQUlUX05PUk1BTF9TVEFUVVMJCQkJMHgwMDAwMDEKKyNkZWZpbmUgTUVfSU9fSVJRX1dBSVRfRVhURU5ERURfU1RBVFVTCQkJCTB4MDAwMDAyCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlZmluZXMgZm9yIG1lSU9JcnFTdG9wIGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX0lPX0lSUV9TVE9QX05PX0ZMQUdTCQkJCQkJMHgwMDAwMDAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBmb3IgbWVJT0lycVNldENhbGxiYWNrIGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX0lPX0lSUV9TRVRfQ0FMTEJBQ0tfTk9fRkxBR1MJCQkJMHgwCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlZmluZXMgZm9yIG1lSU9SZXNldERldmljZSBmdW5jdGlvbgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9JT19SRVNFVF9ERVZJQ0VfTk9fRkxBR1MJCQkJCTB4MAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGZvciBtZUlPUmVzZXRTdWJkZXZpY2UgZnVuY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfSU9fUkVTRVRfU1VCREVWSUNFX05PX0ZMQUdTCQkJCTB4MAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGZvciBtZUlPU2luZ2xlQ29uZmlnIGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX1NJTkdMRV9DT05GSUdfRElPX0lOUFVUCQkJCQkweDAwMEQwMDAxCisjZGVmaW5lIE1FX1NJTkdMRV9DT05GSUdfRElPX09VVFBVVAkJCQkJMHgwMDBEMDAwMgorI2RlZmluZSBNRV9TSU5HTEVfQ09ORklHX0RJT19ISUdIX0lNUEVEQU5DRQkJCTB4MDAwRDAwMDMKKyNkZWZpbmUgTUVfU0lOR0xFX0NPTkZJR19ESU9fU0lOSwkJCQkJMHgwMDBEMDAwNAorI2RlZmluZSBNRV9TSU5HTEVfQ09ORklHX0RJT19TT1VSQ0UJCQkJCTB4MDAwRDAwMDUKKyNkZWZpbmUgTUVfU0lOR0xFX0NPTkZJR19ESU9fTVVYMzJNCQkJCQkweDAwMEQwMDA2CisjZGVmaW5lIE1FX1NJTkdMRV9DT05GSUdfRElPX0RFTVVYMzIJCQkJMHgwMDBEMDAwNworI2RlZmluZSBNRV9TSU5HTEVfQ09ORklHX0RJT19CSVRfUEFUVEVSTgkJCTB4MDAwRDAwMDgKKworI2RlZmluZSBNRV9TSU5HTEVfQ09ORklHX0NUUl84MjU0X01PREVfMAkJCTB4MDAwRTAwMDEKKyNkZWZpbmUgTUVfU0lOR0xFX0NPTkZJR19DVFJfODI1NF9NT0RFXzEJCQkweDAwMEUwMDAyCisjZGVmaW5lIE1FX1NJTkdMRV9DT05GSUdfQ1RSXzgyNTRfTU9ERV8yCQkJMHgwMDBFMDAwMworI2RlZmluZSBNRV9TSU5HTEVfQ09ORklHX0NUUl84MjU0X01PREVfMwkJCTB4MDAwRTAwMDQKKyNkZWZpbmUgTUVfU0lOR0xFX0NPTkZJR19DVFJfODI1NF9NT0RFXzQJCQkweDAwMEUwMDA1CisjZGVmaW5lIE1FX1NJTkdMRV9DT05GSUdfQ1RSXzgyNTRfTU9ERV81CQkJMHgwMDBFMDAwNgorCisjZGVmaW5lIE1FX0lPX1NJTkdMRV9DT05GSUdfTk9fRkxBR1MJCQkJMHgwMAorI2RlZmluZSBNRV9JT19TSU5HTEVfQ09ORklHX0RJT19CSVQJCQkJCTB4MDEKKyNkZWZpbmUgTUVfSU9fU0lOR0xFX0NPTkZJR19ESU9fQllURQkJCQkweDAyCisjZGVmaW5lIE1FX0lPX1NJTkdMRV9DT05GSUdfRElPX1dPUkQJCQkJMHgwNAorI2RlZmluZSBNRV9JT19TSU5HTEVfQ09ORklHX0RJT19EV09SRAkJCQkweDA4CisjZGVmaW5lIE1FX0lPX1NJTkdMRV9DT05GSUdfTVVMVElTSUdfTEVEX09OCQkJMHgxMAorI2RlZmluZSBNRV9JT19TSU5HTEVfQ09ORklHX01VTFRJU0lHX0xFRF9PRkYJCTB4MjAKKyNkZWZpbmUgTUVfSU9fU0lOR0xFX0NPTkZJR19BSV9STVMJCQkJCTB4NDAKKyNkZWZpbmUgTUVfSU9fU0lOR0xFX0NPTkZJR19DT05USU5VRQkJCQkweDgwCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlZmluZXMgZm9yIG1lSU9TaW5nbGUgZnVuY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfSU9fU0lOR0xFX05PX0ZMQUdTCQkJCQkJMHgwCisjZGVmaW5lIE1FX0lPX1NJTkdMRV9OT05CTE9DS0lORwkJCQkJMHgyMAorCisjZGVmaW5lIE1FX0RJUl9JTlBVVAkJCQkJCQkJMHgwMDBGMDAwMQorI2RlZmluZSBNRV9ESVJfT1VUUFVUCQkJCQkJCQkweDAwMEYwMDAyCisKKyNkZWZpbmUgTUVfSU9fU0lOR0xFX1RZUEVfTk9fRkxBR1MJCQkJCTB4MDAKKyNkZWZpbmUgTUVfSU9fU0lOR0xFX1RZUEVfRElPX0JJVAkJCQkJMHgwMQorI2RlZmluZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fQllURQkJCQkJMHgwMgorI2RlZmluZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fV09SRAkJCQkJMHgwNAorI2RlZmluZSBNRV9JT19TSU5HTEVfVFlQRV9ESU9fRFdPUkQJCQkJCTB4MDgKKyNkZWZpbmUgTUVfSU9fU0lOR0xFX1RZUEVfVFJJR19TWU5DSFJPTk9VUwkJCTB4MTAKKyNkZWZpbmUgTUVfSU9fU0lOR0xFX1RZUEVfV1JJVEVfTk9OQkxPQ0tJTkcJCQkweDIwCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlZmluZXMgZm9yIG1lSU9TdHJlYW1Db25maWcgZnVuY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfSU9fU1RSRUFNX0NPTkZJR19OT19GTEFHUwkJCQkweDAKKyNkZWZpbmUgTUVfSU9fU1RSRUFNX0NPTkZJR19CSVRfUEFUVEVSTgkJCQkweDEKKyNkZWZpbmUgTUVfSU9fU1RSRUFNX0NPTkZJR19XUkFQQVJPVU5ECQkJCTB4MgorI2RlZmluZSBNRV9JT19TVFJFQU1fQ09ORklHX1NBTVBMRV9BTkRfSE9MRAkJCTB4NAorI2RlZmluZSBNRV9JT19TVFJFQU1fQ09ORklHX0hBUkRXQVJFX09OTFkJCQkweDgKKworI2RlZmluZSBNRV9JT19TVFJFQU1fQ09ORklHX1RZUEVfTk9fRkxBR1MJCQkweDAKKworI2RlZmluZSBNRV9JT19TVFJFQU1fVFJJR0dFUl9UWVBFX05PX0ZMQUdTCQkJMHgwCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlZmluZXMgZm9yIG1lSU9TdHJlYW1SZWFkIGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX1JFQURfTU9ERV9CTE9DS0lORwkJCQkJCTB4MDAxMDAwMDEKKyNkZWZpbmUgTUVfUkVBRF9NT0RFX05PTkJMT0NLSU5HCQkJCQkweDAwMTAwMDAyCisKKyNkZWZpbmUgTUVfSU9fU1RSRUFNX1JFQURfTk9fRkxBR1MJCQkJCTB4MAorI2RlZmluZSBNRV9JT19TVFJFQU1fUkVBRF9GUkFNRVMJCQkJCTB4MQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGZvciBtZUlPU3RyZWFtV3JpdGUgZnVuY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfV1JJVEVfTU9ERV9CTE9DS0lORwkJCQkJCTB4MDAxMTAwMDEKKyNkZWZpbmUgTUVfV1JJVEVfTU9ERV9OT05CTE9DS0lORwkJCQkJMHgwMDExMDAwMgorI2RlZmluZSBNRV9XUklURV9NT0RFX1BSRUxPQUQJCQkJCQkweDAwMTEwMDAzCisKKyNkZWZpbmUgTUVfSU9fU1RSRUFNX1dSSVRFX05PX0ZMQUdTCQkJCQkweDAwMDAwMDAwCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlZmluZXMgZm9yIG1lSU9TdHJlYW1TdGFydCBmdW5jdGlvbgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9JT19TVFJFQU1fU1RBUlRfTk9fRkxBR1MJCQkJCTB4MDAwMDAwMDAKKworI2RlZmluZSBNRV9TVEFSVF9NT0RFX0JMT0NLSU5HCQkJCQkJMHgwMDEyMDAwMQorI2RlZmluZSBNRV9TVEFSVF9NT0RFX05PTkJMT0NLSU5HCQkJCQkweDAwMTIwMDAyCisKKyNkZWZpbmUgTUVfSU9fU1RSRUFNX1NUQVJUX1RZUEVfTk9fRkxBR1MJCQkweDAKKyNkZWZpbmUgTUVfSU9fU1RSRUFNX1NUQVJUX1RZUEVfVFJJR19TWU5DSFJPTk9VUwkweDEKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBmb3IgbWVJT1N0cmVhbVN0b3AgZnVuY3Rpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfSU9fU1RSRUFNX1NUT1BfTk9fRkxBR1MJCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgTUVfSU9fU1RSRUFNX1NUT1BfUFJFU0VSVkVfQlVGRkVSUwkJCTB4MDAwMDAwMDEKKworI2RlZmluZSBNRV9TVE9QX01PREVfSU1NRURJQVRFCQkJCQkJMHgwMDEzMDAwMQorI2RlZmluZSBNRV9TVE9QX01PREVfTEFTVF9WQUxVRQkJCQkJCTB4MDAxMzAwMDIKKworI2RlZmluZSBNRV9JT19TVFJFQU1fU1RPUF9UWVBFX05PX0ZMQUdTCQkJCTB4MDAwMDAwMDAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBmb3IgbWVJT1N0cmVhbVN0YXR1cyBmdW5jdGlvbgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9XQUlUX05PTkUJCQkJCQkJCTB4MDAxNDAwMDEKKyNkZWZpbmUgTUVfV0FJVF9JRExFCQkJCQkJCQkweDAwMTQwMDAyCisKKyNkZWZpbmUgTUVfU1RBVFVTX0lOVkFMSUQJCQkJCQkJMHgwMDAwMDAwMAorI2RlZmluZSBNRV9TVEFUVVNfSURMRQkJCQkJCQkJMHgwMDE1MDAwMQorI2RlZmluZSBNRV9TVEFUVVNfQlVTWQkJCQkJCQkJMHgwMDE1MDAwMgorI2RlZmluZSBNRV9TVEFUVVNfRVJST1IJCQkJCQkJCTB4MDAxNTAwMDMKKworI2RlZmluZSBNRV9JT19TVFJFQU1fU1RBVFVTX05PX0ZMQUdTCQkJCTB4MDAwMDAwMDAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBmb3IgbWVJT1N0cmVhbVNldENhbGxiYWNrcyBmdW5jdGlvbgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9JT19TVFJFQU1fU0VUX0NBTExCQUNLU19OT19GTEFHUwkJCTB4MDAwMDAwMDAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBmb3IgbWVJT1N0cmVhbU5ld1ZhbHVlcyBmdW5jdGlvbgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRV9JT19TVFJFQU1fTkVXX1ZBTFVFU19OT19GTEFHUwkJCTB4MDAwMDAwMDAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBmb3IgbWVJT1RpbWVUb1RpY2tzIGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX0lPX1NUUkVBTV9USU1FX1RPX1RJQ0tTX05PX0ZMQUdTCQkJMHgwMDAwMDAwMAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEZWZpbmVzIGZvciBtb2R1bGUgdHlwZXMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfTU9EVUxFX1RZUEVfTVVMVElTSUdfTk9ORQkJCQkweDAwMDAwMDAwCisjZGVmaW5lIE1FX01PRFVMRV9UWVBFX01VTFRJU0lHX0RJRkYxNl8xMFYJCQkweDAwMTYwMDAxCisjZGVmaW5lIE1FX01PRFVMRV9UWVBFX01VTFRJU0lHX0RJRkYxNl8yMFYJCQkweDAwMTYwMDAyCisjZGVmaW5lIE1FX01PRFVMRV9UWVBFX01VTFRJU0lHX0RJRkYxNl81MFYJCQkweDAwMTYwMDAzCisjZGVmaW5lIE1FX01PRFVMRV9UWVBFX01VTFRJU0lHX0NVUlJFTlQxNl8wXzIwTUEJMHgwMDE2MDAwNAorI2RlZmluZSBNRV9NT0RVTEVfVFlQRV9NVUxUSVNJR19SVEQ4X1BUMTAwCQkJMHgwMDE2MDAwNQorI2RlZmluZSBNRV9NT0RVTEVfVFlQRV9NVUxUSVNJR19SVEQ4X1BUNTAwCQkJMHgwMDE2MDAwNgorI2RlZmluZSBNRV9NT0RVTEVfVFlQRV9NVUxUSVNJR19SVEQ4X1BUMTAwMAkJCTB4MDAxNjAwMDcKKyNkZWZpbmUgTUVfTU9EVUxFX1RZUEVfTVVMVElTSUdfVEU4X1RZUEVfQgkJCTB4MDAxNjAwMDgKKyNkZWZpbmUgTUVfTU9EVUxFX1RZUEVfTVVMVElTSUdfVEU4X1RZUEVfRQkJCTB4MDAxNjAwMDkKKyNkZWZpbmUgTUVfTU9EVUxFX1RZUEVfTVVMVElTSUdfVEU4X1RZUEVfSgkJCTB4MDAxNjAwMEEKKyNkZWZpbmUgTUVfTU9EVUxFX1RZUEVfTVVMVElTSUdfVEU4X1RZUEVfSwkJCTB4MDAxNjAwMEIKKyNkZWZpbmUgTUVfTU9EVUxFX1RZUEVfTVVMVElTSUdfVEU4X1RZUEVfTgkJCTB4MDAxNjAwMEMKKyNkZWZpbmUgTUVfTU9EVUxFX1RZUEVfTVVMVElTSUdfVEU4X1RZUEVfUgkJCTB4MDAxNjAwMEQKKyNkZWZpbmUgTUVfTU9EVUxFX1RZUEVfTVVMVElTSUdfVEU4X1RZUEVfUwkJCTB4MDAxNjAwMEUKKyNkZWZpbmUgTUVfTU9EVUxFX1RZUEVfTVVMVElTSUdfVEU4X1RZUEVfVAkJCTB4MDAxNjAwMEYKKyNkZWZpbmUgTUVfTU9EVUxFX1RZUEVfTVVMVElTSUdfVEU4X1RFTVBfU0VOU09SCQkweDAwMTYwMDEwCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIERlZmluZXMgZm9yIG1lUXVlcnlTdWJkZXZpY2VDYXBzIGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX0NBUFNfTk9ORQkJCQkJCQkJMHgwMDAwMDAwMAorCisjZGVmaW5lIE1FX0NBUFNfRElPX0RJUl9CSVQJCQkJCQkJMHgwMDAwMDAwMQorI2RlZmluZSBNRV9DQVBTX0RJT19ESVJfQllURQkJCQkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgTUVfQ0FQU19ESU9fRElSX1dPUkQJCQkJCQkweDAwMDAwMDA0CisjZGVmaW5lIE1FX0NBUFNfRElPX0RJUl9EV09SRAkJCQkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgTUVfQ0FQU19ESU9fU0lOS19TT1VSQ0UJCQkJCQkweDAwMDAwMDEwCisjZGVmaW5lIE1FX0NBUFNfRElPX0JJVF9QQVRURVJOX0lSUQkJCQkJMHgwMDAwMDAyMAorI2RlZmluZSBNRV9DQVBTX0RJT19CSVRfTUFTS19JUlFfRURHRV9SSVNJTkcJCTB4MDAwMDAwNDAKKyNkZWZpbmUgTUVfQ0FQU19ESU9fQklUX01BU0tfSVJRX0VER0VfRkFMTElORwkJMHgwMDAwMDA4MAorI2RlZmluZSBNRV9DQVBTX0RJT19CSVRfTUFTS19JUlFfRURHRV9BTlkJCQkweDAwMDAwMTAwCisjZGVmaW5lIE1FX0NBUFNfRElPX09WRVJfVEVNUF9JUlEJCQkJCTB4MDAwMDAyMDAKKworI2RlZmluZSBNRV9DQVBTX0NUUl9DTEtfUFJFVklPVVMJCQkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgTUVfQ0FQU19DVFJfQ0xLX0lOVEVSTkFMXzFNSFoJCQkJMHgwMDAwMDAwMgorI2RlZmluZSBNRV9DQVBTX0NUUl9DTEtfSU5URVJOQUxfMTBNSFoJCQkJMHgwMDAwMDAwNAorI2RlZmluZSBNRV9DQVBTX0NUUl9DTEtfRVhURVJOQUwJCQkJCTB4MDAwMDAwMDgKKworI2RlZmluZSBNRV9DQVBTX0FJX1RSSUdfU1lOQ0hST05PVVMJCQkJCTB4MDAwMDAwMDEKKy8vLyBAbm90ZSBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IGZvciBtZTE2MDAgaW4gb2xkIHN0eWxlLgorI2RlZmluZSBNRV9DQVBTX0FJX1RSSUdfU0lNVUxUQU5FT1VTCQkJCU1FX0NBUFNfQUlfVFJJR19TWU5DSFJPTk9VUworI2RlZmluZSBNRV9DQVBTX0FJX0ZJRk8JCQkJCQkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgTUVfQ0FQU19BSV9GSUZPX1RIUkVTSE9MRAkJCQkJMHgwMDAwMDAwNAorCisjZGVmaW5lIE1FX0NBUFNfQU9fVFJJR19TWU5DSFJPTk9VUwkJCQkJMHgwMDAwMDAwMQorLy8vIEBub3RlIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgZm9yIG1lMTYwMCBpbiBvbGQgc3R5bGUuCisjZGVmaW5lIE1FX0NBUFNfQU9fVFJJR19TSU1VTFRBTkVPVVMJCQkJTUVfQ0FQU19BT19UUklHX1NZTkNIUk9OT1VTCisjZGVmaW5lIE1FX0NBUFNfQU9fRklGTwkJCQkJCQkJMHgwMDAwMDAwMgorI2RlZmluZSBNRV9DQVBTX0FPX0ZJRk9fVEhSRVNIT0xECQkJCQkweDAwMDAwMDA0CisKKyNkZWZpbmUgTUVfQ0FQU19FWFRfSVJRX0VER0VfUklTSU5HCQkJCQkweDAwMDAwMDAxCisjZGVmaW5lIE1FX0NBUFNfRVhUX0lSUV9FREdFX0ZBTExJTkcJCQkJMHgwMDAwMDAwMgorI2RlZmluZSBNRV9DQVBTX0VYVF9JUlFfRURHRV9BTlkJCQkJCTB4MDAwMDAwMDQKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBmb3IgbWVRdWVyeVN1YmRldmljZUNhcHNBcmdzIGZ1bmN0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX0NBUF9BSV9GSUZPX1NJWkUJCQkJCQkJMHgwMDFEMDAwMAorI2RlZmluZSBNRV9DQVBfQUlfQlVGRkVSX1NJWkUJCQkJCQkweDAwMUQwMDAxCisKKyNkZWZpbmUgTUVfQ0FQX0FPX0ZJRk9fU0laRQkJCQkJCQkweDAwMUYwMDAwCisjZGVmaW5lIE1FX0NBUF9BT19CVUZGRVJfU0laRQkJCQkJCTB4MDAxRjAwMDEKKworI2RlZmluZSBNRV9DQVBfQ1RSX1dJRFRICQkJCQkJCTB4MDAyMDAwMDAKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBjb21tb24gdG8gcXVlcnkgZnVuY3Rpb25zCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1FX1VOSVRfSU5WQUxJRAkJCQkJCQkJMHgwMDAwMDAwMAorI2RlZmluZSBNRV9VTklUX1ZPTFQJCQkJCQkJCTB4MDAxNzAwMDEKKyNkZWZpbmUgTUVfVU5JVF9BTVBFUkUJCQkJCQkJCTB4MDAxNzAwMDIKKyNkZWZpbmUgTUVfVU5JVF9BTlkJCQkJCQkJCQkweDAwMTcwMDAzCisKKyNkZWZpbmUgTUVfVFlQRV9JTlZBTElECQkJCQkJCQkweDAwMDAwMDAwCisjZGVmaW5lIE1FX1RZUEVfQU8JCQkJCQkJCQkweDAwMTgwMDAxCisjZGVmaW5lIE1FX1RZUEVfQUkJCQkJCQkJCQkweDAwMTgwMDAyCisjZGVmaW5lIE1FX1RZUEVfRElPCQkJCQkJCQkJMHgwMDE4MDAwMworI2RlZmluZSBNRV9UWVBFX0RPCQkJCQkJCQkJMHgwMDE4MDAwNAorI2RlZmluZSBNRV9UWVBFX0RJCQkJCQkJCQkJMHgwMDE4MDAwNQorI2RlZmluZSBNRV9UWVBFX0NUUgkJCQkJCQkJCTB4MDAxODAwMDYKKyNkZWZpbmUgTUVfVFlQRV9FWFRfSVJRCQkJCQkJCQkweDAwMTgwMDA3CisKKyNkZWZpbmUgTUVfU1VCVFlQRV9JTlZBTElECQkJCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgTUVfU1VCVFlQRV9TSU5HTEUJCQkJCQkJMHgwMDE5MDAwMQorI2RlZmluZSBNRV9TVUJUWVBFX1NUUkVBTUlORwkJCQkJCTB4MDAxOTAwMDIKKyNkZWZpbmUgTUVfU1VCVFlQRV9DVFJfODI1NAkJCQkJCQkweDAwMTkwMDAzCisjZGVmaW5lIE1FX1NVQlRZUEVfQU5ZCQkJCQkJCQkweDAwMTkwMDA0CisKKyNkZWZpbmUgTUVfREVWSUNFX0RSSVZFUl9OQU1FX01BWF9DT1VOVAkJCQk2NAorI2RlZmluZSBNRV9ERVZJQ0VfTkFNRV9NQVhfQ09VTlQJCQkJCTY0CisKKyNkZWZpbmUgTUVfREVWSUNFX0RFU0NSSVBUSU9OX01BWF9DT1VOVAkJCQkyNTYKKworI2RlZmluZSBNRV9CVVNfVFlQRV9JTlZBTElECQkJCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgTUVfQlVTX1RZUEVfUENJCQkJCQkJCQkweDAwMUEwMDAxCisjZGVmaW5lIE1FX0JVU19UWVBFX1VTQgkJCQkJCQkJMHgwMDFBMDAwMgorCisjZGVmaW5lIE1FX1BMVUdHRURfSU5WQUxJRAkJCQkJCQkweDAwMDAwMDAwCisjZGVmaW5lIE1FX1BMVUdHRURfSU4JCQkJCQkJCTB4MDAxQjAwMDEKKyNkZWZpbmUgTUVfUExVR0dFRF9PVVQJCQkJCQkJCTB4MDAxQjAwMDIKKworI2RlZmluZSBNRV9FWFRFTlNJT05fVFlQRV9JTlZBTElECQkJCQkweDAwMDAwMDAwCisjZGVmaW5lIE1FX0VYVEVOU0lPTl9UWVBFX05PTkUJCQkJCQkweDAwMUMwMDAxCisjZGVmaW5lIE1FX0VYVEVOU0lPTl9UWVBFX01VWDMyTQkJCQkJMHgwMDFDMDAwMgorI2RlZmluZSBNRV9FWFRFTlNJT05fVFlQRV9ERU1VWDMyCQkJCQkweDAwMUMwMDAzCisjZGVmaW5lIE1FX0VYVEVOU0lPTl9UWVBFX01VWDMyUwkJCQkJMHgwMDFDMDAwNAorCisjZGVmaW5lIE1FX0FDQ0VTU19UWVBFX0lOVkFMSUQJCQkJCQkweDAwMDAwMDAwCisjZGVmaW5lIE1FX0FDQ0VTU19UWVBFX0xPQ0FMCQkJCQkJMHgwMDFEMDAwMQorI2RlZmluZSBNRV9BQ0NFU1NfVFlQRV9SRU1PVEUJCQkJCQkweDAwMUQwMDAyCisKKy8vLyBAbm90ZSBBZGQgYnkgS0cKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVmaW5lcyBmb3IgbWVVdGlsaXR5UFdNCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2RlZmluZSBNRV9QV01fU1RBUlRfQ09OTkVDVF9JTlRFUk5BTAkJCQkweDAwMjAwMDAxCisKKy8qIEZsYWdzIGZvciBTaW5nbGVDb25maWcgY2hhbm5lbHMgY29uZmlndXJlICovCisjZGVmaW5lIE1FX1NJTkdMRV9DSEFOTkVMX05PVF9DT05GSUdVUkVECQkJMHgwMAorI2RlZmluZSBNRV9TSU5HTEVfQ0hBTk5FTF9DT05GSUdVUkVECQkJCTB4MDEKKworLyogRGVmaW5lIGlmIGNvbmZpZ3VyYXRpb24gc2hvdWxkIGJlIGRvd25sb2FkZWQgdG8gZHJpdmVyICovCisjZGVmaW5lIE1FX0NPTkZJR19MT0FEX05PX0ZMQUdTCQkJCQkJMHgwCisjZGVmaW5lIE1FX0NPTkZJR19MT0FEX1RPX0RSSVZFUgkJCQkJMHgxCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZGV2aWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkZXZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjYyZTE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZGV2aWNlLmMKQEAgLTAsMCArMSwxNzQwIEBACisvKioKKyAqIEBmaWxlIG1lZGV2aWNlLmMKKyAqCisgKiBAYnJpZWYgTWVpbGhhdXMgZGV2aWNlIGJhc2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgIm1lY29tbW9uLmgiCisjaW5jbHVkZSAibWVpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZWRldmljZS5oIgorCisjaWZuZGVmIF9fS0VSTkVMX18KKyMgIGRlZmluZSBfX0tFUk5FTF9fCisjZW5kaWYKKworc3RhdGljIGludCBtZV9kZXZpY2VfaW9faXJxX3N0YXJ0KHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgIGludCBzdWJkZXZpY2UsCisJCQkJICBpbnQgY2hhbm5lbCwKKwkJCQkgIGludCBpcnFfc291cmNlLAorCQkJCSAgaW50IGlycV9lZGdlLCBpbnQgaXJxX2FyZywgaW50IGZsYWdzKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lX3N1YmRldmljZV90ICpzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQ2hlY2sgc3ViZGV2aWNlIGluZGV4LgorCWlmIChzdWJkZXZpY2UgPj0gbWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKCZkZXZpY2UtPnNsaXN0KSkgeworCQlQRVJST1IoIkludmFsaWQgc3ViZGV2aWNlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NVQkRFVklDRTsKKwl9CisJLy8gRW50ZXIgZGV2aWNlLgorCWVyciA9IG1lX2Rsb2NrX2VudGVyKCZkZXZpY2UtPmRsb2NrLCBmaWxlcCk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGVudGVyIGRldmljZS5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKwkvLyBHZXQgc3ViZGV2aWNlIGluc3RhbmNlLgorCXMgPSBtZV9zbGlzdF9nZXRfc3ViZGV2aWNlKCZkZXZpY2UtPnNsaXN0LCBzdWJkZXZpY2UpOworCisJaWYgKHMpIHsKKwkJLy8gQ2FsbCBzdWJkZXZpY2UgbWV0aG9kLgorCQllcnIgPSBzLT5tZV9zdWJkZXZpY2VfaW9faXJxX3N0YXJ0KHMsCisJCQkJCQkgICBmaWxlcCwKKwkJCQkJCSAgIGNoYW5uZWwsCisJCQkJCQkgICBpcnFfc291cmNlLAorCQkJCQkJICAgaXJxX2VkZ2UsIGlycV9hcmcsIGZsYWdzKTsKKwl9IGVsc2UgeworCQkvLyBTb21ldGhpbmcgcmVhbGx5IGJhZCBoYXBwZW5lZC4KKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisKKwkvLyBFeGl0IGRldmljZS4KKwltZV9kbG9ja19leGl0KCZkZXZpY2UtPmRsb2NrLCBmaWxlcCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9pb19pcnFfd2FpdChzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UsCisJCQkJIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgaW50IHN1YmRldmljZSwKKwkJCQkgaW50IGNoYW5uZWwsCisJCQkJIGludCAqaXJxX2NvdW50LAorCQkJCSBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwltZV9zdWJkZXZpY2VfdCAqczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vIENoZWNrIHN1YmRldmljZSBpbmRleC4KKwlpZiAoc3ViZGV2aWNlID49IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcygmZGV2aWNlLT5zbGlzdCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN1YmRldmljZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVUJERVZJQ0U7CisJfQorCS8vIEVudGVyIGRldmljZS4KKwllcnIgPSBtZV9kbG9ja19lbnRlcigmZGV2aWNlLT5kbG9jaywgZmlsZXApOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBlbnRlciBkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJLy8gR2V0IHN1YmRldmljZSBpbnN0YW5jZS4KKwlzID0gbWVfc2xpc3RfZ2V0X3N1YmRldmljZSgmZGV2aWNlLT5zbGlzdCwgc3ViZGV2aWNlKTsKKworCWlmIChzKSB7CisJCS8vIENhbGwgc3ViZGV2aWNlIG1ldGhvZC4KKwkJZXJyID0gcy0+bWVfc3ViZGV2aWNlX2lvX2lycV93YWl0KHMsCisJCQkJCQkgIGZpbGVwLAorCQkJCQkJICBjaGFubmVsLAorCQkJCQkJICBpcnFfY291bnQsCisJCQkJCQkgIHZhbHVlLCB0aW1lX291dCwgZmxhZ3MpOworCX0gZWxzZSB7CisJCS8vIFNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbmVkLgorCQlQRVJST1IoIkNhbm5vdCBnZXQgc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCS8vIEV4aXQgZGV2aWNlLgorCW1lX2Rsb2NrX2V4aXQoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX2lvX2lycV9zdG9wKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSBpbnQgc3ViZGV2aWNlLCBpbnQgY2hhbm5lbCwgaW50IGZsYWdzKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lX3N1YmRldmljZV90ICpzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQ2hlY2sgc3ViZGV2aWNlIGluZGV4LgorCWlmIChzdWJkZXZpY2UgPj0gbWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKCZkZXZpY2UtPnNsaXN0KSkgeworCQlQRVJST1IoIkludmFsaWQgc3ViZGV2aWNlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NVQkRFVklDRTsKKwl9CisJLy8gRW50ZXIgZGV2aWNlLgorCWVyciA9IG1lX2Rsb2NrX2VudGVyKCZkZXZpY2UtPmRsb2NrLCBmaWxlcCk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGVudGVyIGRldmljZS5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKwkvLyBHZXQgc3ViZGV2aWNlIGluc3RhbmNlLgorCXMgPSBtZV9zbGlzdF9nZXRfc3ViZGV2aWNlKCZkZXZpY2UtPnNsaXN0LCBzdWJkZXZpY2UpOworCisJaWYgKHMpIHsKKwkJLy8gQ2FsbCBzdWJkZXZpY2UgbWV0aG9kLgorCQllcnIgPSBzLT5tZV9zdWJkZXZpY2VfaW9faXJxX3N0b3AocywgZmlsZXAsIGNoYW5uZWwsIGZsYWdzKTsKKwl9IGVsc2UgeworCQkvLyBTb21ldGhpbmcgcmVhbGx5IGJhZCBoYXBwZW5lZC4KKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisKKwkvLyBFeGl0IGRldmljZS4KKwltZV9kbG9ja19leGl0KCZkZXZpY2UtPmRsb2NrLCBmaWxlcCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9pb19yZXNldF9kZXZpY2Uoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWVfc3ViZGV2aWNlX3QgKnM7CisJaW50IGksIG47CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvKiBHZXQgdGhlIG51bWJlciBvZiBzdWJkZXZpY2VzLiAqLworCW4gPSBtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoJmRldmljZS0+c2xpc3QpOworCisJLy8gRW50ZXIgZGV2aWNlLgorCWVyciA9IG1lX2Rsb2NrX2VudGVyKCZkZXZpY2UtPmRsb2NrLCBmaWxlcCk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGVudGVyIGRldmljZS5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qIFJlc2V0IGV2ZXJ5IHN1YmRldmljZSBpbiBsaXN0LiAqLworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIGkpOworCQllcnIgPSBzLT5tZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlKHMsIGZpbGVwLCBmbGFncyk7CisKKwkJaWYgKGVycikgeworCQkJUEVSUk9SKCJDYW5ub3QgcmVzZXQgc3ViZGV2aWNlLlxuIik7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8vIEV4aXQgZGV2aWNlLgorCW1lX2Rsb2NrX2V4aXQoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UsCisJCQkJCXN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkJaW50IHN1YmRldmljZSwgaW50IGZsYWdzKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lX3N1YmRldmljZV90ICpzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQ2hlY2sgc3ViZGV2aWNlIGluZGV4LgorCisJaWYgKHN1YmRldmljZSA+PSBtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoJmRldmljZS0+c2xpc3QpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdWJkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1VCREVWSUNFOworCX0KKwkvLyBFbnRlciBkZXZpY2UuCisJZXJyID0gbWVfZGxvY2tfZW50ZXIoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZW50ZXIgZGV2aWNlLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCS8vIEdldCBzdWJkZXZpY2UgaW5zdGFuY2UuCisJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIHN1YmRldmljZSk7CisKKwlpZiAocykgeworCQkvLyBDYWxsIHN1YmRldmljZSBtZXRob2QuCisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9pb19yZXNldF9zdWJkZXZpY2UocywgZmlsZXAsIGZsYWdzKTsKKwl9IGVsc2UgeworCQkvLyBTb21ldGhpbmcgcmVhbGx5IGJhZCBoYXBwZW5lZC4KKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisKKwkvLyBFeGl0IGRldmljZS4KKwltZV9kbG9ja19leGl0KCZkZXZpY2UtPmRsb2NrLCBmaWxlcCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9pb19zaW5nbGVfY29uZmlnKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IHN1YmRldmljZSwKKwkJCQkgICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkgICAgICBpbnQgcmVmLAorCQkJCSAgICAgIGludCB0cmlnX2NoYW4sCisJCQkJICAgICAgaW50IHRyaWdfdHlwZSwgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lX3N1YmRldmljZV90ICpzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQ2hlY2sgc3ViZGV2aWNlIGluZGV4LgorCisJaWYgKHN1YmRldmljZSA+PSBtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoJmRldmljZS0+c2xpc3QpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdWJkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1VCREVWSUNFOworCX0KKwkvLyBFbnRlciBkZXZpY2UuCisJZXJyID0gbWVfZGxvY2tfZW50ZXIoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZW50ZXIgZGV2aWNlLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCS8vIEdldCBzdWJkZXZpY2UgaW5zdGFuY2UuCisJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIHN1YmRldmljZSk7CisKKwlpZiAocykgeworCQkvLyBDYWxsIHN1YmRldmljZSBtZXRob2QuCisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9pb19zaW5nbGVfY29uZmlnKHMsCisJCQkJCQkgICAgICAgZmlsZXAsCisJCQkJCQkgICAgICAgY2hhbm5lbCwKKwkJCQkJCSAgICAgICBzaW5nbGVfY29uZmlnLAorCQkJCQkJICAgICAgIHJlZiwKKwkJCQkJCSAgICAgICB0cmlnX2NoYW4sCisJCQkJCQkgICAgICAgdHJpZ190eXBlLAorCQkJCQkJICAgICAgIHRyaWdfZWRnZSwgZmxhZ3MpOworCX0gZWxzZSB7CisJCS8vIFNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbmVkLgorCQlQRVJST1IoIkNhbm5vdCBnZXQgc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCS8vIEV4aXQgZGV2aWNlLgorCW1lX2Rsb2NrX2V4aXQoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX2lvX3NpbmdsZV9yZWFkKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgc3ViZGV2aWNlLAorCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWVfc3ViZGV2aWNlX3QgKnM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBDaGVjayBzdWJkZXZpY2UgaW5kZXguCisKKwlpZiAoc3ViZGV2aWNlID49IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcygmZGV2aWNlLT5zbGlzdCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN1YmRldmljZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVUJERVZJQ0U7CisJfQorCS8vIEVudGVyIGRldmljZS4KKwllcnIgPSBtZV9kbG9ja19lbnRlcigmZGV2aWNlLT5kbG9jaywgZmlsZXApOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBlbnRlciBkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJLy8gR2V0IHN1YmRldmljZSBpbnN0YW5jZS4KKwlzID0gbWVfc2xpc3RfZ2V0X3N1YmRldmljZSgmZGV2aWNlLT5zbGlzdCwgc3ViZGV2aWNlKTsKKworCWlmIChzKSB7CisJCS8vIENhbGwgc3ViZGV2aWNlIG1ldGhvZC4KKwkJZXJyID0gcy0+bWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9yZWFkKHMsCisJCQkJCQkgICAgIGZpbGVwLAorCQkJCQkJICAgICBjaGFubmVsLAorCQkJCQkJICAgICB2YWx1ZSwgdGltZV9vdXQsIGZsYWdzKTsKKwl9IGVsc2UgeworCQkvLyBTb21ldGhpbmcgcmVhbGx5IGJhZCBoYXBwZW5lZC4KKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisKKwkvLyBFeGl0IGRldmljZS4KKwltZV9kbG9ja19leGl0KCZkZXZpY2UtPmRsb2NrLCBmaWxlcCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9pb19zaW5nbGVfd3JpdGUoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICAgaW50IHN1YmRldmljZSwKKwkJCQkgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgaW50IHZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwltZV9zdWJkZXZpY2VfdCAqczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vIENoZWNrIHN1YmRldmljZSBpbmRleC4KKworCWlmIChzdWJkZXZpY2UgPj0gbWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKCZkZXZpY2UtPnNsaXN0KSkgeworCQlQRVJST1IoIkludmFsaWQgc3ViZGV2aWNlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NVQkRFVklDRTsKKwl9CisJLy8gRW50ZXIgZGV2aWNlLgorCWVyciA9IG1lX2Rsb2NrX2VudGVyKCZkZXZpY2UtPmRsb2NrLCBmaWxlcCk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGVudGVyIGRldmljZS5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKwkvLyBHZXQgc3ViZGV2aWNlIGluc3RhbmNlLgorCXMgPSBtZV9zbGlzdF9nZXRfc3ViZGV2aWNlKCZkZXZpY2UtPnNsaXN0LCBzdWJkZXZpY2UpOworCisJaWYgKHMpIHsKKwkJLy8gQ2FsbCBzdWJkZXZpY2UgbWV0aG9kLgorCQllcnIgPSBzLT5tZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlKHMsCisJCQkJCQkgICAgICBmaWxlcCwKKwkJCQkJCSAgICAgIGNoYW5uZWwsCisJCQkJCQkgICAgICB2YWx1ZSwgdGltZV9vdXQsIGZsYWdzKTsKKwl9IGVsc2UgeworCQkvLyBTb21ldGhpbmcgcmVhbGx5IGJhZCBoYXBwZW5lZC4KKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisKKwkvLyBFeGl0IGRldmljZS4KKwltZV9kbG9ja19leGl0KCZkZXZpY2UtPmRsb2NrLCBmaWxlcCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9pb19zdHJlYW1fY29uZmlnKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IHN1YmRldmljZSwKKwkJCQkgICAgICBtZUlPU3RyZWFtQ29uZmlnX3QgKiBjb25maWdfbGlzdCwKKwkJCQkgICAgICBpbnQgY291bnQsCisJCQkJICAgICAgbWVJT1N0cmVhbVRyaWdnZXJfdCAqIHRyaWdnZXIsCisJCQkJICAgICAgaW50IGZpZm9faXJxX3RocmVzaG9sZCwgaW50IGZsYWdzKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lX3N1YmRldmljZV90ICpzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQ2hlY2sgc3ViZGV2aWNlIGluZGV4LgorCisJaWYgKHN1YmRldmljZSA+PSBtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoJmRldmljZS0+c2xpc3QpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdWJkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1VCREVWSUNFOworCX0KKwkvLyBFbnRlciBkZXZpY2UuCisJZXJyID0gbWVfZGxvY2tfZW50ZXIoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZW50ZXIgZGV2aWNlLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCS8vIEdldCBzdWJkZXZpY2UgaW5zdGFuY2UuCisJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIHN1YmRldmljZSk7CisKKwlpZiAocykgeworCQkvLyBDYWxsIHN1YmRldmljZSBtZXRob2QuCisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9pb19zdHJlYW1fY29uZmlnKHMsCisJCQkJCQkgICAgICAgZmlsZXAsCisJCQkJCQkgICAgICAgY29uZmlnX2xpc3QsCisJCQkJCQkgICAgICAgY291bnQsCisJCQkJCQkgICAgICAgdHJpZ2dlciwKKwkJCQkJCSAgICAgICBmaWZvX2lycV90aHJlc2hvbGQsCisJCQkJCQkgICAgICAgZmxhZ3MpOworCX0gZWxzZSB7CisJCS8vIFNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbmVkLgorCQlQRVJST1IoIkNhbm5vdCBnZXQgc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCS8vIEV4aXQgZGV2aWNlLgorCW1lX2Rsb2NrX2V4aXQoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX2lvX3N0cmVhbV9uZXdfdmFsdWVzKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkJICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJCSAgaW50IHN1YmRldmljZSwKKwkJCQkJICBpbnQgdGltZV9vdXQsIGludCAqY291bnQsIGludCBmbGFncykKK3sKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwltZV9zdWJkZXZpY2VfdCAqczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vIENoZWNrIHN1YmRldmljZSBpbmRleC4KKworCWlmIChzdWJkZXZpY2UgPj0gbWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKCZkZXZpY2UtPnNsaXN0KSkgeworCQlQRVJST1IoIkludmFsaWQgc3ViZGV2aWNlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NVQkRFVklDRTsKKwl9CisJLy8gRW50ZXIgZGV2aWNlLgorCWVyciA9IG1lX2Rsb2NrX2VudGVyKCZkZXZpY2UtPmRsb2NrLCBmaWxlcCk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGVudGVyIGRldmljZS5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKwkvLyBHZXQgc3ViZGV2aWNlIGluc3RhbmNlLgorCXMgPSBtZV9zbGlzdF9nZXRfc3ViZGV2aWNlKCZkZXZpY2UtPnNsaXN0LCBzdWJkZXZpY2UpOworCisJaWYgKHMpIHsKKwkJLy8gQ2FsbCBzdWJkZXZpY2UgbWV0aG9kLgorCQllcnIgPSBzLT5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX25ld192YWx1ZXMocywKKwkJCQkJCQkgICBmaWxlcCwKKwkJCQkJCQkgICB0aW1lX291dCwKKwkJCQkJCQkgICBjb3VudCwgZmxhZ3MpOworCX0gZWxzZSB7CisJCS8vIFNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbmVkLgorCQlQRVJST1IoIkNhbm5vdCBnZXQgc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCS8vIEV4aXQgZGV2aWNlLgorCW1lX2Rsb2NrX2V4aXQoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX2lvX3N0cmVhbV9yZWFkKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgc3ViZGV2aWNlLAorCQkJCSAgICBpbnQgcmVhZF9tb2RlLAorCQkJCSAgICBpbnQgKnZhbHVlcywgaW50ICpjb3VudCwgaW50IGZsYWdzKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lX3N1YmRldmljZV90ICpzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQ2hlY2sgc3ViZGV2aWNlIGluZGV4LgorCisJaWYgKHN1YmRldmljZSA+PSBtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoJmRldmljZS0+c2xpc3QpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdWJkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1VCREVWSUNFOworCX0KKwkvLyBFbnRlciBkZXZpY2UuCisJZXJyID0gbWVfZGxvY2tfZW50ZXIoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZW50ZXIgZGV2aWNlLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCS8vIEdldCBzdWJkZXZpY2UgaW5zdGFuY2UuCisJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIHN1YmRldmljZSk7CisKKwlpZiAocykgeworCQkvLyBDYWxsIHN1YmRldmljZSBtZXRob2QuCisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9pb19zdHJlYW1fcmVhZChzLAorCQkJCQkJICAgICBmaWxlcCwKKwkJCQkJCSAgICAgcmVhZF9tb2RlLAorCQkJCQkJICAgICB2YWx1ZXMsIGNvdW50LCBmbGFncyk7CisJfSBlbHNlIHsKKwkJLy8gU29tZXRoaW5nIHJlYWxseSBiYWQgaGFwcGVuZWQuCisJCVBFUlJPUigiQ2Fubm90IGdldCBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJLy8gRXhpdCBkZXZpY2UuCisJbWVfZGxvY2tfZXhpdCgmZGV2aWNlLT5kbG9jaywgZmlsZXApOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfaW9fc3RyZWFtX3N0YXJ0KHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgIGludCBzdWJkZXZpY2UsCisJCQkJICAgICBpbnQgc3RhcnRfbW9kZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWVfc3ViZGV2aWNlX3QgKnM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBDaGVjayBzdWJkZXZpY2UgaW5kZXguCisKKwlpZiAoc3ViZGV2aWNlID49IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcygmZGV2aWNlLT5zbGlzdCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN1YmRldmljZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVUJERVZJQ0U7CisJfQorCS8vIEVudGVyIGRldmljZS4KKwllcnIgPSBtZV9kbG9ja19lbnRlcigmZGV2aWNlLT5kbG9jaywgZmlsZXApOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBlbnRlciBkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJLy8gR2V0IHN1YmRldmljZSBpbnN0YW5jZS4KKwlzID0gbWVfc2xpc3RfZ2V0X3N1YmRldmljZSgmZGV2aWNlLT5zbGlzdCwgc3ViZGV2aWNlKTsKKworCWlmIChzKSB7CisJCS8vIENhbGwgc3ViZGV2aWNlIG1ldGhvZC4KKwkJZXJyID0gcy0+bWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdGFydChzLAorCQkJCQkJICAgICAgZmlsZXAsCisJCQkJCQkgICAgICBzdGFydF9tb2RlLAorCQkJCQkJICAgICAgdGltZV9vdXQsIGZsYWdzKTsKKwl9IGVsc2UgeworCQkvLyBTb21ldGhpbmcgcmVhbGx5IGJhZCBoYXBwZW5lZC4KKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisKKwkvLyBFeGl0IGRldmljZS4KKwltZV9kbG9ja19leGl0KCZkZXZpY2UtPmRsb2NrLCBmaWxlcCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9pb19zdHJlYW1fc3RhdHVzKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgaW50IHN1YmRldmljZSwKKwkJCQkgICAgICBpbnQgd2FpdCwKKwkJCQkgICAgICBpbnQgKnN0YXR1cywgaW50ICpjb3VudCwgaW50IGZsYWdzKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lX3N1YmRldmljZV90ICpzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQ2hlY2sgc3ViZGV2aWNlIGluZGV4LgorCisJaWYgKHN1YmRldmljZSA+PSBtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoJmRldmljZS0+c2xpc3QpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdWJkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1VCREVWSUNFOworCX0KKwkvLyBFbnRlciBkZXZpY2UuCisJZXJyID0gbWVfZGxvY2tfZW50ZXIoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZW50ZXIgZGV2aWNlLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCS8vIEdldCBzdWJkZXZpY2UgaW5zdGFuY2UuCisJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIHN1YmRldmljZSk7CisKKwlpZiAocykgeworCQkvLyBDYWxsIHN1YmRldmljZSBtZXRob2QuCisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9pb19zdHJlYW1fc3RhdHVzKHMsCisJCQkJCQkgICAgICAgZmlsZXAsCisJCQkJCQkgICAgICAgd2FpdCwKKwkJCQkJCSAgICAgICBzdGF0dXMsIGNvdW50LCBmbGFncyk7CisJfSBlbHNlIHsKKwkJLy8gU29tZXRoaW5nIHJlYWxseSBiYWQgaGFwcGVuZWQuCisJCVBFUlJPUigiQ2Fubm90IGdldCBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJLy8gRXhpdCBkZXZpY2UuCisJbWVfZGxvY2tfZXhpdCgmZGV2aWNlLT5kbG9jaywgZmlsZXApOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfaW9fc3RyZWFtX3N0b3Aoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCBzdWJkZXZpY2UsIGludCBzdG9wX21vZGUsIGludCBmbGFncykKK3sKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwltZV9zdWJkZXZpY2VfdCAqczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vIENoZWNrIHN1YmRldmljZSBpbmRleC4KKworCWlmIChzdWJkZXZpY2UgPj0gbWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKCZkZXZpY2UtPnNsaXN0KSkgeworCQlQRVJST1IoIkludmFsaWQgc3ViZGV2aWNlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NVQkRFVklDRTsKKwl9CisJLy8gRW50ZXIgZGV2aWNlLgorCWVyciA9IG1lX2Rsb2NrX2VudGVyKCZkZXZpY2UtPmRsb2NrLCBmaWxlcCk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGVudGVyIGRldmljZS5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKwkvLyBHZXQgc3ViZGV2aWNlIGluc3RhbmNlLgorCXMgPSBtZV9zbGlzdF9nZXRfc3ViZGV2aWNlKCZkZXZpY2UtPnNsaXN0LCBzdWJkZXZpY2UpOworCisJaWYgKHMpIHsKKwkJLy8gQ2FsbCBzdWJkZXZpY2UgbWV0aG9kLgorCQllcnIgPSBzLT5tZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3N0b3AocywKKwkJCQkJCSAgICAgZmlsZXAsIHN0b3BfbW9kZSwgZmxhZ3MpOworCX0gZWxzZSB7CisJCS8vIFNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbmVkLgorCQlQRVJST1IoIkNhbm5vdCBnZXQgc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCS8vIEV4aXQgZGV2aWNlLgorCW1lX2Rsb2NrX2V4aXQoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX2lvX3N0cmVhbV93cml0ZShzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICBpbnQgc3ViZGV2aWNlLAorCQkJCSAgICAgaW50IHdyaXRlX21vZGUsCisJCQkJICAgICBpbnQgKnZhbHVlcywgaW50ICpjb3VudCwgaW50IGZsYWdzKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lX3N1YmRldmljZV90ICpzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQ2hlY2sgc3ViZGV2aWNlIGluZGV4LgorCisJaWYgKHN1YmRldmljZSA+PSBtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoJmRldmljZS0+c2xpc3QpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdWJkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1VCREVWSUNFOworCX0KKwkvLyBFbnRlciBkZXZpY2UuCisJZXJyID0gbWVfZGxvY2tfZW50ZXIoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZW50ZXIgZGV2aWNlLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCS8vIEdldCBzdWJkZXZpY2UgaW5zdGFuY2UuCisJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIHN1YmRldmljZSk7CisKKwlpZiAocykgeworCQkvLyBDYWxsIHN1YmRldmljZSBtZXRob2QuCisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9pb19zdHJlYW1fd3JpdGUocywKKwkJCQkJCSAgICAgIGZpbGVwLAorCQkJCQkJICAgICAgd3JpdGVfbW9kZSwKKwkJCQkJCSAgICAgIHZhbHVlcywgY291bnQsIGZsYWdzKTsKKwl9IGVsc2UgeworCQkvLyBTb21ldGhpbmcgcmVhbGx5IGJhZCBoYXBwZW5lZC4KKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisKKwkvLyBFeGl0IGRldmljZS4KKwltZV9kbG9ja19leGl0KCZkZXZpY2UtPmRsb2NrLCBmaWxlcCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9sb2NrX2RldmljZShzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UsCisJCQkJIHN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGxvY2ssIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlyZXR1cm4gbWVfZGxvY2tfbG9jaygmZGV2aWNlLT5kbG9jaywKKwkJCSAgICAgZmlsZXAsIGxvY2ssIGZsYWdzLCAmZGV2aWNlLT5zbGlzdCk7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX2xvY2tfc3ViZGV2aWNlKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgc3ViZGV2aWNlLCBpbnQgbG9jaywgaW50IGZsYWdzKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lX3N1YmRldmljZV90ICpzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQ2hlY2sgc3ViZGV2aWNlIGluZGV4LgorCisJaWYgKHN1YmRldmljZSA+PSBtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoJmRldmljZS0+c2xpc3QpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdWJkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1VCREVWSUNFOworCX0KKwkvLyBFbnRlciBkZXZpY2UuCisJZXJyID0gbWVfZGxvY2tfZW50ZXIoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZW50ZXIgZGV2aWNlLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCS8vIEdldCBzdWJkZXZpY2UgaW5zdGFuY2UuCisJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIHN1YmRldmljZSk7CisKKwlpZiAocykgeworCQkvLyBDYWxsIHN1YmRldmljZSBtZXRob2QuCisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9sb2NrX3N1YmRldmljZShzLCBmaWxlcCwgbG9jaywgZmxhZ3MpOworCX0gZWxzZSB7CisJCS8vIFNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbmVkLgorCQlQRVJST1IoIkNhbm5vdCBnZXQgc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCS8vIEV4aXQgZGV2aWNlLgorCW1lX2Rsb2NrX2V4aXQoJmRldmljZS0+ZGxvY2ssIGZpbGVwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX3F1ZXJ5X2Rlc2NyaXB0aW9uX2RldmljZShzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UsCisJCQkJCSAgICAgIGNoYXIgKipkZXNjcmlwdGlvbikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmRlc2NyaXB0aW9uID0gZGV2aWNlLT5kZXZpY2VfZGVzY3JpcHRpb247CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX3F1ZXJ5X2luZm9fZGV2aWNlKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkgICAgICAgaW50ICp2ZW5kb3JfaWQsCisJCQkJICAgICAgIGludCAqZGV2aWNlX2lkLAorCQkJCSAgICAgICBpbnQgKnNlcmlhbF9ubywKKwkJCQkgICAgICAgaW50ICpidXNfdHlwZSwKKwkJCQkgICAgICAgaW50ICpidXNfbm8sCisJCQkJICAgICAgIGludCAqZGV2X25vLCBpbnQgKmZ1bmNfbm8sIGludCAqcGx1Z2dlZCkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpZiAoZGV2aWNlLT5idXNfdHlwZSA9PSBNRV9CVVNfVFlQRV9QQ0kpIHsKKwkJKnZlbmRvcl9pZCA9IGRldmljZS0+aW5mby5wY2kudmVuZG9yX2lkOworCQkqZGV2aWNlX2lkID0gZGV2aWNlLT5pbmZvLnBjaS5kZXZpY2VfaWQ7CisJCSpzZXJpYWxfbm8gPSBkZXZpY2UtPmluZm8ucGNpLnNlcmlhbF9ubzsKKwkJKmJ1c190eXBlID0gTUVfQlVTX1RZUEVfUENJOworCQkqYnVzX25vID0gZGV2aWNlLT5pbmZvLnBjaS5wY2lfYnVzX25vOworCQkqZGV2X25vID0gZGV2aWNlLT5pbmZvLnBjaS5wY2lfZGV2X25vOworCQkqZnVuY19ubyA9IGRldmljZS0+aW5mby5wY2kucGNpX2Z1bmNfbm87CisJCSpwbHVnZ2VkID0gTUVfUExVR0dFRF9JTjsKKwl9IGVsc2UgeworCQkqcGx1Z2dlZCA9IE1FX1BMVUdHRURfT1VUOworCX0KKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfcXVlcnlfbmFtZV9kZXZpY2Uoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLCBjaGFyICoqbmFtZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm5hbWUgPSBkZXZpY2UtPmRldmljZV9uYW1lOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9xdWVyeV9uYW1lX2RldmljZV9kcml2ZXIoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCQkgICAgICBjaGFyICoqbmFtZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm5hbWUgPSBkZXZpY2UtPmRyaXZlcl9uYW1lOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9xdWVyeV9udW1iZXJfc3ViZGV2aWNlcyhzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UsCisJCQkJCSAgICAgaW50ICpudW1iZXIpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBtZV9zbGlzdF9xdWVyeV9udW1iZXJfc3ViZGV2aWNlcygmZGV2aWNlLT5zbGlzdCwgbnVtYmVyKTsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkJICAgaW50IHN1YmRldmljZSwgaW50ICpudW1iZXIpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWVfc3ViZGV2aWNlX3QgKnM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBDaGVjayBzdWJkZXZpY2UgaW5kZXguCisKKwlpZiAoc3ViZGV2aWNlID49IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcygmZGV2aWNlLT5zbGlzdCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN1YmRldmljZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVUJERVZJQ0U7CisJfQorCS8vIEdldCBzdWJkZXZpY2UgaW5zdGFuY2UuCisJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIHN1YmRldmljZSk7CisKKwlpZiAocykgeworCQkvLyBDYWxsIHN1YmRldmljZSBtZXRob2QuCisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMocywgbnVtYmVyKTsKKwl9IGVsc2UgeworCQkvLyBTb21ldGhpbmcgcmVhbGx5IGJhZCBoYXBwZW5lZC4KKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9xdWVyeV9udW1iZXJfcmFuZ2VzKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkJIGludCBzdWJkZXZpY2UsIGludCB1bml0LCBpbnQgKmNvdW50KQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lX3N1YmRldmljZV90ICpzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQ2hlY2sgc3ViZGV2aWNlIGluZGV4LgorCisJaWYgKHN1YmRldmljZSA+PSBtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoJmRldmljZS0+c2xpc3QpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdWJkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1VCREVWSUNFOworCX0KKwkvLyBHZXQgc3ViZGV2aWNlIGluc3RhbmNlLgorCXMgPSBtZV9zbGlzdF9nZXRfc3ViZGV2aWNlKCZkZXZpY2UtPnNsaXN0LCBzdWJkZXZpY2UpOworCisJaWYgKHMpIHsKKwkJLy8gQ2FsbCBzdWJkZXZpY2UgbWV0aG9kLgorCQllcnIgPSBzLT5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX3JhbmdlcyhzLCB1bml0LCBjb3VudCk7CisJfSBlbHNlIHsKKwkJLy8gU29tZXRoaW5nIHJlYWxseSBiYWQgaGFwcGVuZWQuCisJCVBFUlJPUigiQ2Fubm90IGdldCBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfcXVlcnlfcmFuZ2VfYnlfbWluX21heChzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UsCisJCQkJCSAgICBpbnQgc3ViZGV2aWNlLAorCQkJCQkgICAgaW50IHVuaXQsCisJCQkJCSAgICBpbnQgKm1pbiwKKwkJCQkJICAgIGludCAqbWF4LCBpbnQgKm1heGRhdGEsIGludCAqcmFuZ2UpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWVfc3ViZGV2aWNlX3QgKnM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBDaGVjayBzdWJkZXZpY2UgaW5kZXguCisKKwlpZiAoc3ViZGV2aWNlID49IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcygmZGV2aWNlLT5zbGlzdCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN1YmRldmljZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVUJERVZJQ0U7CisJfQorCS8vIEdldCBzdWJkZXZpY2UgaW5zdGFuY2UuCisJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIHN1YmRldmljZSk7CisKKwlpZiAocykgeworCQkvLyBDYWxsIHN1YmRldmljZSBtZXRob2QuCisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9xdWVyeV9yYW5nZV9ieV9taW5fbWF4KHMsCisJCQkJCQkJICAgICB1bml0LAorCQkJCQkJCSAgICAgbWluLAorCQkJCQkJCSAgICAgbWF4LAorCQkJCQkJCSAgICAgbWF4ZGF0YSwgcmFuZ2UpOworCX0gZWxzZSB7CisJCS8vIFNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbmVkLgorCQlQRVJST1IoIkNhbm5vdCBnZXQgc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX3F1ZXJ5X3JhbmdlX2luZm8oc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCSAgICAgIGludCBzdWJkZXZpY2UsCisJCQkJICAgICAgaW50IHJhbmdlLAorCQkJCSAgICAgIGludCAqdW5pdCwKKwkJCQkgICAgICBpbnQgKm1pbiwgaW50ICptYXgsIGludCAqbWF4ZGF0YSkKK3sKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwltZV9zdWJkZXZpY2VfdCAqczsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8vIENoZWNrIHN1YmRldmljZSBpbmRleC4KKworCWlmIChzdWJkZXZpY2UgPj0gbWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKCZkZXZpY2UtPnNsaXN0KSkgeworCQlQRVJST1IoIkludmFsaWQgc3ViZGV2aWNlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX1NVQkRFVklDRTsKKwl9CisJLy8gR2V0IHN1YmRldmljZSBpbnN0YW5jZS4KKwlzID0gbWVfc2xpc3RfZ2V0X3N1YmRldmljZSgmZGV2aWNlLT5zbGlzdCwgc3ViZGV2aWNlKTsKKworCWlmIChzKSB7CisJCS8vIENhbGwgc3ViZGV2aWNlIG1ldGhvZC4KKwkJZXJyID0gcy0+bWVfc3ViZGV2aWNlX3F1ZXJ5X3JhbmdlX2luZm8ocywKKwkJCQkJCSAgICAgICByYW5nZSwKKwkJCQkJCSAgICAgICB1bml0LCBtaW4sIG1heCwgbWF4ZGF0YSk7CisJfSBlbHNlIHsKKwkJLy8gU29tZXRoaW5nIHJlYWxseSBiYWQgaGFwcGVuZWQuCisJCVBFUlJPUigiQ2Fubm90IGdldCBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2J5X3R5cGUoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCQkgICAgIGludCBzdGFydF9zdWJkZXZpY2UsCisJCQkJCSAgICAgaW50IHR5cGUsCisJCQkJCSAgICAgaW50IHN1YnR5cGUsIGludCAqc3ViZGV2aWNlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCXJldHVybiBtZV9zbGlzdF9nZXRfc3ViZGV2aWNlX2J5X3R5cGUoJmRldmljZS0+c2xpc3QsCisJCQkJCSAgICAgIHN0YXJ0X3N1YmRldmljZSwKKwkJCQkJICAgICAgdHlwZSwgc3VidHlwZSwgc3ViZGV2aWNlKTsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGUoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCQkgIGludCBzdWJkZXZpY2UsCisJCQkJCSAgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWVfc3ViZGV2aWNlX3QgKnM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBDaGVjayBzdWJkZXZpY2UgaW5kZXguCisKKwlpZiAoc3ViZGV2aWNlID49IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcygmZGV2aWNlLT5zbGlzdCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN1YmRldmljZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVUJERVZJQ0U7CisJfQorCS8vIEdldCBzdWJkZXZpY2UgaW5zdGFuY2UuCisJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIHN1YmRldmljZSk7CisKKwlpZiAocykgeworCQkvLyBDYWxsIHN1YmRldmljZSBtZXRob2QuCisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZShzLCB0eXBlLCBzdWJ0eXBlKTsKKwl9IGVsc2UgeworCQkvLyBTb21ldGhpbmcgcmVhbGx5IGJhZCBoYXBwZW5lZC4KKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyhzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UsCisJCQkJCSAgaW50IHN1YmRldmljZSwgaW50ICpjYXBzKQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCW1lX3N1YmRldmljZV90ICpzOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQ2hlY2sgc3ViZGV2aWNlIGluZGV4LgorCisJaWYgKHN1YmRldmljZSA+PSBtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoJmRldmljZS0+c2xpc3QpKSB7CisJCVBFUlJPUigiSW52YWxpZCBzdWJkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0lOVkFMSURfU1VCREVWSUNFOworCX0KKwkvLyBHZXQgc3ViZGV2aWNlIGluc3RhbmNlLgorCXMgPSBtZV9zbGlzdF9nZXRfc3ViZGV2aWNlKCZkZXZpY2UtPnNsaXN0LCBzdWJkZXZpY2UpOworCisJaWYgKHMpIHsKKwkJLy8gQ2FsbCBzdWJkZXZpY2UgbWV0aG9kLgorCQllcnIgPSBzLT5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHMocywgY2Fwcyk7CisJfSBlbHNlIHsKKwkJLy8gU29tZXRoaW5nIHJlYWxseSBiYWQgaGFwcGVuZWQuCisJCVBFUlJPUigiQ2Fubm90IGdldCBzdWJkZXZpY2UgaW5zdGFuY2UuXG4iKTsKKwkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncyhzdHJ1Y3QgbWVfZGV2aWNlICpkZXZpY2UsCisJCQkJCSAgICAgICBpbnQgc3ViZGV2aWNlLAorCQkJCQkgICAgICAgaW50IGNhcCwgaW50ICphcmdzLCBpbnQgY291bnQpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWVfc3ViZGV2aWNlX3QgKnM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBDaGVjayBzdWJkZXZpY2UgaW5kZXguCisKKwlpZiAoc3ViZGV2aWNlID49IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcygmZGV2aWNlLT5zbGlzdCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN1YmRldmljZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVUJERVZJQ0U7CisJfQorCS8vIEdldCBzdWJkZXZpY2UgaW5zdGFuY2UuCisJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIHN1YmRldmljZSk7CisKKwlpZiAocykgeworCQkvLyBDYWxsIHN1YmRldmljZSBtZXRob2QuCisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzKHMsCisJCQkJCQkJCWNhcCwKKwkJCQkJCQkJYXJncywgY291bnQpOworCX0gZWxzZSB7CisJCS8vIFNvbWV0aGluZyByZWFsbHkgYmFkIGhhcHBlbmVkLgorCQlQRVJST1IoIkNhbm5vdCBnZXQgc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfZGV2aWNlX3F1ZXJ5X3RpbWVyKHN0cnVjdCBtZV9kZXZpY2UgKmRldmljZSwKKwkJCQkgaW50IHN1YmRldmljZSwKKwkJCQkgaW50IHRpbWVyLAorCQkJCSBpbnQgKmJhc2VfZnJlcXVlbmN5LAorCQkJCSB1aW50NjRfdCAqIG1pbl90aWNrcywgdWludDY0X3QgKiBtYXhfdGlja3MpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJbWVfc3ViZGV2aWNlX3QgKnM7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBDaGVjayBzdWJkZXZpY2UgaW5kZXguCisKKwlpZiAoc3ViZGV2aWNlID49IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcygmZGV2aWNlLT5zbGlzdCkpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIHN1YmRldmljZS5cbiIpOworCQlyZXR1cm4gTUVfRVJSTk9fSU5WQUxJRF9TVUJERVZJQ0U7CisJfQorCS8vIEdldCBzdWJkZXZpY2UgaW5zdGFuY2UuCisJcyA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2UoJmRldmljZS0+c2xpc3QsIHN1YmRldmljZSk7CisKKwlpZiAocykgeworCQkvLyBDYWxsIHN1YmRldmljZSBtZXRob2QuCisJCWVyciA9IHMtPm1lX3N1YmRldmljZV9xdWVyeV90aW1lcihzLAorCQkJCQkJICB0aW1lciwKKwkJCQkJCSAgYmFzZV9mcmVxdWVuY3ksCisJCQkJCQkgIG1pbl90aWNrcywgbWF4X3RpY2tzKTsKKwl9IGVsc2UgeworCQkvLyBTb21ldGhpbmcgcmVhbGx5IGJhZCBoYXBwZW5lZC4KKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IHN1YmRldmljZSBpbnN0YW5jZS5cbiIpOworCQllcnIgPSBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lX2RldmljZV9xdWVyeV92ZXJzaW9uX2RldmljZV9kcml2ZXIoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLAorCQkJCQkJIGludCAqdmVyc2lvbikKKy8qKiBAdG9kbyBWZXJzaW9ucyBzaG9sZCBiZSByZWFkIGZyb20gZHJpdmVyLiBJIG11c3Qgb3ZlcndyaXRlIHRoaXMgZnVuY3Rpb24gaW4gZWFjaCBtb2R1bGUuIEhlcmUgc2hvdWxkIGJlIHJldHVybmVkIGFuIGVycm9yIQorKi8KK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKnZlcnNpb24gPSBNRV9WRVJTSU9OX0RSSVZFUjsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZV9kZXZpY2VfY29uZmlnX2xvYWQoc3RydWN0IG1lX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJIG1lX2NmZ19kZXZpY2VfZW50cnlfdCAqIGNvbmZpZykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7CS8vSWYgbm8gbmVlZCBmb3IgY29uZmlnIHJldHVybiBzdWNjZXNzLgorLy8gICAgICByZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKK30KKworc3RhdGljIHZvaWQgbWVfZGV2aWNlX2Rlc3RydWN0b3IobWVfZGV2aWNlX3QgKiBtZV9kZXZpY2UpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCW1lX2RldmljZV9kZWluaXQobWVfZGV2aWNlKTsKKwlrZnJlZShtZV9kZXZpY2UpOworfQorCisvKiAvL21lX2RldmljZV91c2JfaW5pdAoraW50IG1lX2RldmljZV91c2JfaW5pdChtZV9kZXZpY2VfdCAqbWVfZGV2aWNlLCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gLTE7Cit9CisqLworCitzdGF0aWMgaW50IGdldF9kZXZpY2VfZGVzY3JpcHRpb25zKHVpbnQxNl90IGRldmljZV9pZCwKKwkJCQkgICBjaGFyICoqZGV2aWNlX25hbWUsCisJCQkJICAgY2hhciAqKmRldmljZV9kZXNjcmlwdGlvbiwKKwkJCQkgICBjaGFyICoqZHJpdmVyX25hbWUpCisvKiogQHRvZG8gVGhpcyBpcyB3cm9uZyBjb25jZXB0ISBTdGF0aWMgdGFibGUgaGFzIHRvbyBzdHJvbmcgbGltaXRhdGlvbnMhCisqICdkZXZpY2VfbmFtZScgYW5kICdkcml2ZXJfbmFtZScgc2hvdWxkIGJlIGNhbGN1bGF0ZWQgZnJvbSAnZGV2aWNlX2lkJworKiAnZGV2aWNlX2Rlc2NyaXB0aW9uJyBzaG91bGQgYmUgcmVhZCBmcm9tIGRldmljZSBvciBtb3ZlZCB0byB1c2VyIHNwYWNlIGFuZCBoYW5kbGVkIGJ5IGxpYnJhcnkhCisqLworeworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCXN3aXRjaCAoZGV2aWNlX2lkKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTAwMDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxMDAwX0E6CisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTAwMF9COgorCQkqZGV2aWNlX25hbWUgPSBNRTEwMDBfTkFNRV9ERVZJQ0VfTUUxMDAwOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUUxMDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTEwMDA7CisJCSpkcml2ZXJfbmFtZSA9IE1FMTAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDAwOgorCQkqZGV2aWNlX25hbWUgPSBNRTE0MDBfTkFNRV9ERVZJQ0VfTUUxNDAwOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUUxNDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE0MDA7CisJCSpkcml2ZXJfbmFtZSA9IE1FMTQwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBBOgorCQkqZGV2aWNlX25hbWUgPSBNRTE0MDBfTkFNRV9ERVZJQ0VfTUUxNDAwQTsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FMTQwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNDAwQTsKKwkJKmRyaXZlcl9uYW1lID0gTUUxNDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEI6CisJCSpkZXZpY2VfbmFtZSA9IE1FMTQwMF9OQU1FX0RFVklDRV9NRTE0MDBCOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUUxNDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE0MDBCOworCQkqZHJpdmVyX25hbWUgPSBNRTE0MDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFMDoKKwkJKmRldmljZV9uYW1lID0gTUUxNDAwX05BTUVfREVWSUNFX01FMTQwMEU7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTE0MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTQwMEU7CisJCSpkcml2ZXJfbmFtZSA9IE1FMTQwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNEVBOgorCQkqZGV2aWNlX25hbWUgPSBNRTE0MDBfTkFNRV9ERVZJQ0VfTUUxNDAwRUE7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTE0MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTQwMEVBOworCQkqZHJpdmVyX25hbWUgPSBNRTE0MDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFQjoKKwkJKmRldmljZV9uYW1lID0gTUUxNDAwX05BTUVfREVWSUNFX01FMTQwMEVCOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUUxNDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE0MDBFQjsKKwkJKmRyaXZlcl9uYW1lID0gTUUxNDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEM6CisJCSpkZXZpY2VfbmFtZSA9IE1FMTQwMF9OQU1FX0RFVklDRV9NRTE0MDBDOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUUxNDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE0MDBDOworCQkqZHJpdmVyX25hbWUgPSBNRTE0MDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwRDoKKwkJKmRldmljZV9uYW1lID0gTUUxNDAwX05BTUVfREVWSUNFX01FMTQwMEQ7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTE0MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTQwMEQ7CisJCSpkcml2ZXJfbmFtZSA9IE1FMTQwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNjAwXzRVOgorCQkqZGV2aWNlX25hbWUgPSBNRTE2MDBfTkFNRV9ERVZJQ0VfTUUxNjAwNFU7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTE2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTYwMDRVOworCQkqZHJpdmVyX25hbWUgPSBNRTE2MDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF84VToKKwkJKmRldmljZV9uYW1lID0gTUUxNjAwX05BTUVfREVWSUNFX01FMTYwMDhVOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUUxNjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE2MDA4VTsKKwkJKmRyaXZlcl9uYW1lID0gTUUxNjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfMTJVOgorCQkqZGV2aWNlX25hbWUgPSBNRTE2MDBfTkFNRV9ERVZJQ0VfTUUxNjAwMTJVOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUUxNjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE2MDAxMlU7CisJCSpkcml2ZXJfbmFtZSA9IE1FMTYwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNjAwXzE2VToKKwkJKmRldmljZV9uYW1lID0gTUUxNjAwX05BTUVfREVWSUNFX01FMTYwMDE2VTsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FMTYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNjAwMTZVOworCQkqZHJpdmVyX25hbWUgPSBNRTE2MDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF8xNlVfOEk6CisJCSpkZXZpY2VfbmFtZSA9IE1FMTYwMF9OQU1FX0RFVklDRV9NRTE2MDAxNlU4STsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FMTYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNjAwMTZVOEk7CisJCSpkcml2ZXJfbmFtZSA9IE1FMTYwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjEwOgorCQkqZGV2aWNlX25hbWUgPSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjEwOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2MTA7CisJCSpkcml2ZXJfbmFtZSA9IE1FNDYwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjUwOgorCQkqZGV2aWNlX25hbWUgPSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjUwOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2NTA7CisJCSpkcml2ZXJfbmFtZSA9IE1FNDYwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwOgorCQkqZGV2aWNlX25hbWUgPSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjYwOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2NjA7CisJCSpkcml2ZXJfbmFtZSA9IE1FNDYwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwSToKKwkJKmRldmljZV9uYW1lID0gTUU0NjAwX05BTUVfREVWSUNFX01FNDY2MEk7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY2MEk7CisJCSpkcml2ZXJfbmFtZSA9IE1FNDYwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwUzoKKwkJKmRldmljZV9uYW1lID0gTUU0NjAwX05BTUVfREVWSUNFX01FNDY2MFM7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY2MFM7CisJCSpkcml2ZXJfbmFtZSA9IE1FNDYwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwSVM6CisJCSpkZXZpY2VfbmFtZSA9IE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2NjBJUzsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjYwSVM7CisJCSpkcml2ZXJfbmFtZSA9IE1FNDYwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwOgorCQkqZGV2aWNlX25hbWUgPSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjcwOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2NzA7CisJCSpkcml2ZXJfbmFtZSA9IE1FNDYwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwSToKKwkJKmRldmljZV9uYW1lID0gTUU0NjAwX05BTUVfREVWSUNFX01FNDY3MEk7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY3MEk7CisJCSpkcml2ZXJfbmFtZSA9IE1FNDYwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwUzoKKwkJKmRldmljZV9uYW1lID0gTUU0NjAwX05BTUVfREVWSUNFX01FNDY3MFM7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY3MFM7CisJCSpkcml2ZXJfbmFtZSA9IE1FNDYwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwSVM6CisJCSpkZXZpY2VfbmFtZSA9IE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2NzBJUzsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjcwSVM7CisJCSpkcml2ZXJfbmFtZSA9IE1FNDYwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwOgorCQkqZGV2aWNlX25hbWUgPSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjgwOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2ODA7CisJCSpkcml2ZXJfbmFtZSA9IE1FNDYwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwSToKKwkJKmRldmljZV9uYW1lID0gTUU0NjAwX05BTUVfREVWSUNFX01FNDY4MEk7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY4MEk7CisJCSpkcml2ZXJfbmFtZSA9IE1FNDYwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwUzoKKwkJKmRldmljZV9uYW1lID0gTUU0NjAwX05BTUVfREVWSUNFX01FNDY4MFM7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY4MFM7CisJCSpkcml2ZXJfbmFtZSA9IE1FNDYwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwSVM6CisJCSpkZXZpY2VfbmFtZSA9IE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2ODBJUzsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjgwSVM7CisJCSpkcml2ZXJfbmFtZSA9IE1FNDYwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDA0OgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwNDsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwNDsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMDg6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDA4OworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDA4OworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAwRjoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMDE2OworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDAxNjsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMTQ6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJNDsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSTQ7CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDE4OgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSTg7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMEk4OworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAxRjoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMEkxNjsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSTE2OworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAzNDoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMElTTEU0OworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJU0xFNDsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMzg6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJU0xFODsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSVNMRTg7CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDNGOgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSVNMRTE2OworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJU0xFMTY7CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTA0OgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwNDsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwNDsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMDg6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDA4OworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDA4OworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEwRjoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMDE2OworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDAxNjsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMTQ6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJNDsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSTQ7CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTE4OgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSTg7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMEk4OworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjExRjoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMEkxNjsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSTE2OworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEzNDoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMElTTEU0OworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJU0xFNDsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMzg6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJU0xFODsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSVNMRTg7CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTNGOgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSVNMRTE2OworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJU0xFMTY7CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDQ0OgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwNERJTzsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwNERJTzsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNDg6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDA4RElPOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDA4RElPOworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA0RjoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMDE2RElPOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDAxNkRJTzsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNTQ6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJNERJTzsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSTRESU87CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDU4OgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSThESU87CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMEk4RElPOworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA1RjoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMEkxNkRJTzsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSTE2RElPOworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA3NDoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMElTTEU0RElPOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJU0xFNERJTzsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNzg6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJU0xFOERJTzsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSVNMRThESU87CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDdGOgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSVNMRTE2RElPOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJU0xFMTZESU87CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTQ0OgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwNERJTzsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwNERJTzsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNDg6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDA4RElPOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDA4RElPOworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE0RjoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMDE2RElPOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDAxNkRJTzsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNTQ6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJNERJTzsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSTRESU87CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTU4OgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSThESU87CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMEk4RElPOworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE1RjoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMEkxNkRJTzsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSTE2RElPOworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE3NDoKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMElTTEU0RElPOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJU0xFNERJTzsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNzg6CisJCSpkZXZpY2VfbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJU0xFOERJTzsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSVNMRThESU87CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTdGOgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSVNMRTE2RElPOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJU0xFMTZESU87CisJCSpkcml2ZXJfbmFtZSA9IE1FNjAwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MjU5OgorCQkqZGV2aWNlX25hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MjAwSTlESU87CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjIwMEk5RElPOworCQkqZHJpdmVyX25hbWUgPSBNRTYwMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjM1OToKKwkJKmRldmljZV9uYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjMwMEk5RElPOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYzMDBJOURJTzsKKwkJKmRyaXZlcl9uYW1lID0gTUU2MDAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA2MzA6CisJCSpkZXZpY2VfbmFtZSA9IE1FMDYwMF9OQU1FX0RFVklDRV9NRTA2MzA7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTA2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMDYzMDsKKwkJKmRyaXZlcl9uYW1lID0gTUUwNjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTgxMDBfQToKKwkJKmRldmljZV9uYW1lID0gTUU4MTAwX05BTUVfREVWSUNFX01FODEwMEE7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTgxMDBfREVTQ1JJUFRJT05fREVWSUNFX01FODEwMEE7CisJCSpkcml2ZXJfbmFtZSA9IE1FODEwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU4MTAwX0I6CisJCSpkZXZpY2VfbmFtZSA9IE1FODEwMF9OQU1FX0RFVklDRV9NRTgxMDBCOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUU4MTAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTgxMDBCOworCQkqZHJpdmVyX25hbWUgPSBNRTgxMDBfTkFNRV9EUklWRVI7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODIwMF9BOgorCQkqZGV2aWNlX25hbWUgPSBNRTgyMDBfTkFNRV9ERVZJQ0VfTUU4MjAwQTsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IE1FODIwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU4MjAwQTsKKwkJKmRyaXZlcl9uYW1lID0gTUU4MjAwX05BTUVfRFJJVkVSOworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTgyMDBfQjoKKwkJKmRldmljZV9uYW1lID0gTUU4MjAwX05BTUVfREVWSUNFX01FODIwMEI7CisJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRTgyMDBfREVTQ1JJUFRJT05fREVWSUNFX01FODIwMEI7CisJCSpkcml2ZXJfbmFtZSA9IE1FODIwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUwOTQwOgorCQkqZGV2aWNlX25hbWUgPSBNRTA5MDBfTkFNRV9ERVZJQ0VfTUUwOTQwOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUUwOTAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTA5NDA7CisJCSpkcml2ZXJfbmFtZSA9IE1FMDkwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUwOTUwOgorCQkqZGV2aWNlX25hbWUgPSBNRTA5MDBfTkFNRV9ERVZJQ0VfTUUwOTUwOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUUwOTAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTA5NTA7CisJCSpkcml2ZXJfbmFtZSA9IE1FMDkwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUwOTYwOgorCQkqZGV2aWNlX25hbWUgPSBNRTA5MDBfTkFNRV9ERVZJQ0VfTUUwOTYwOworCQkqZGV2aWNlX2Rlc2NyaXB0aW9uID0gTUUwOTAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTA5NjA7CisJCSpkcml2ZXJfbmFtZSA9IE1FMDkwMF9OQU1FX0RSSVZFUjsKKwkJYnJlYWs7CisvKgorCQljYXNlIFVTQl9ERVZJQ0VfSURfTUVQSElTVE9fUzE6CisJCQkqZGV2aWNlX25hbWUgPSBNRVBISVNUT19TMV9OQU1FX0RFVklDRTsKKwkJCSpkZXZpY2VfZGVzY3JpcHRpb24gPSBNRVBISVNUT19TMV9ERVNDUklQVElPTl9ERVZJQ0U7CisJCQkqZHJpdmVyX25hbWUgPSBNRVBISVNUT19TMV9OQU1FX0RSSVZFUjsKKwkJCWJyZWFrOworKi8KKwlkZWZhdWx0OgorCQkqZGV2aWNlX25hbWUgPSBFTVBUWV9OQU1FX0RFVklDRTsKKwkJKmRldmljZV9kZXNjcmlwdGlvbiA9IEVNUFRZX0RFU0NSSVBUSU9OX0RFVklDRTsKKwkJKmRyaXZlcl9uYW1lID0gRU1QVFlfTkFNRV9EUklWRVI7CisKKwkJUEVSUk9SKCJJbnZhbGlkIGRldmljZSBpZC5cbiIpOworCisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgbWVfZGV2aWNlX3BjaV9pbml0KG1lX2RldmljZV90ICogbWVfZGV2aWNlLCBzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldmljZSkKK3sKKwlpbnQgZXJyOworCWludCBpOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gSW5pdGlhbGl6ZSBkZXZpY2UgbGlzdCBoZWFkLgorCUlOSVRfTElTVF9IRUFEKCZtZV9kZXZpY2UtPmxpc3QpOworCisJLy8gSW5pdGlhbGl6ZSBkZXZpY2UgZGVzY3JpcHRpb24gc3RyaW5ncy4KKwllcnIgPSBnZXRfZGV2aWNlX2Rlc2NyaXB0aW9ucyhwY2lfZGV2aWNlLT5kZXZpY2UsCisJCQkJICAgICAgJm1lX2RldmljZS0+ZGV2aWNlX25hbWUsCisJCQkJICAgICAgJm1lX2RldmljZS0+ZGV2aWNlX2Rlc2NyaXB0aW9uLAorCQkJCSAgICAgICZtZV9kZXZpY2UtPmRyaXZlcl9uYW1lKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBkZXZpY2UgZGVzY3JpcHRpb24gc3RyaW5ncy5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisJLy8gRW5hYmxlIHRoZSBwY2kgZGV2aWNlLgorCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBjaV9kZXZpY2UpOworCisJaWYgKGVyciA8IDApIHsKKwkJUEVSUk9SKCJDYW5ub3QgZW5hYmxlIFBDSSBkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCS8vIFJlcXVlc3QgdGhlIFBDSSByZWdpc3RlciByZWdpb25zLgorCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGNpX2RldmljZSwgbWVfZGV2aWNlLT5kZXZpY2VfbmFtZSk7CisKKwlpZiAoZXJyIDwgMCkgeworCQlQRVJST1IoIkNhbm5vdCByZXF1ZXN0IFBDSSByZWdpb25zLlxuIik7CisJCWdvdG8gRVJST1JfMDsKKwl9CisJLy8gVGhlIGJ1cyBjYXJyeWluZyB0aGUgZGV2aWNlIGlzIGEgUENJIGJ1cy4KKwltZV9kZXZpY2UtPmJ1c190eXBlID0gTUVfQlVTX1RZUEVfUENJOworCisJLy8gU3RvcmUgdGhlIFBDSSBpbmZvcm1hdGlvbiBmb3IgbGF0ZXIgdXNhZ2UuCisJbWVfZGV2aWNlLT5pbmZvLnBjaS5wY2lfZGV2aWNlID0gcGNpX2RldmljZTsKKworCS8vIEdldCBQQ0kgcmVnaXN0ZXIgYmFzZXMgYW5kIHNpemVzLgorCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJbWVfZGV2aWNlLT5pbmZvLnBjaS5yZWdfYmFzZXNbaV0gPQorCQkgICAgcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXZpY2UsIGkpOworCQltZV9kZXZpY2UtPmluZm8ucGNpLnJlZ19zaXplc1tpXSA9CisJCSAgICBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXZpY2UsIGkpOworCX0KKworCS8vIEdldCB0aGUgUENJIGxvY2F0aW9uLgorCW1lX2RldmljZS0+aW5mby5wY2kucGNpX2J1c19ubyA9IHBjaV9kZXZpY2UtPmJ1cy0+bnVtYmVyOworCW1lX2RldmljZS0+aW5mby5wY2kucGNpX2Rldl9ubyA9IFBDSV9TTE9UKHBjaV9kZXZpY2UtPmRldmZuKTsKKwltZV9kZXZpY2UtPmluZm8ucGNpLnBjaV9mdW5jX25vID0gUENJX0ZVTkMocGNpX2RldmljZS0+ZGV2Zm4pOworCisJLy8gR2V0IE1laWxoYXVzIHNwZWNpZmljIGRldmljZSBpbmZvcm1hdGlvbi4KKwltZV9kZXZpY2UtPmluZm8ucGNpLnZlbmRvcl9pZCA9IHBjaV9kZXZpY2UtPnZlbmRvcjsKKwltZV9kZXZpY2UtPmluZm8ucGNpLmRldmljZV9pZCA9IHBjaV9kZXZpY2UtPmRldmljZTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZGV2aWNlLCAweDA4LAorCQkJICAgICAmbWVfZGV2aWNlLT5pbmZvLnBjaS5od19yZXZpc2lvbik7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaV9kZXZpY2UsIDB4MkMsICZtZV9kZXZpY2UtPmluZm8ucGNpLnNlcmlhbF9ubyk7CisKKwkvLyBHZXQgdGhlIGludGVycnVwdCByZXF1ZXN0IG51bWJlci4KKwltZV9kZXZpY2UtPmlycSA9IHBjaV9kZXZpY2UtPmlycTsKKworCS8vIEluaXRpYWxpemUgZGV2aWNlIGxvY2sgaW5zdGFuY2UuCisJZXJyID0gbWVfZGxvY2tfaW5pdCgmbWVfZGV2aWNlLT5kbG9jayk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2Fubm90IGluaXRpYWxpemUgZGV2aWNlIGxvY2sgaW5zdGFuY2UuXG4iKTsKKwkJZ290byBFUlJPUl8xOworCX0KKwkvLyBJbml0aWFsaXplIHN1YmRldmljZSBsaXN0IGluc3RhbmNlLgorCW1lX3NsaXN0X2luaXQoJm1lX2RldmljZS0+c2xpc3QpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBsaXN0IGluc3RhbmNlLlxuIik7CisJCWdvdG8gRVJST1JfMjsKKwl9CisJLy8gSW5pdGlhbGl6ZSBtZXRob2QgcG9pbnRlcnMuCisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfaW9faXJxX3N0YXJ0ID0gbWVfZGV2aWNlX2lvX2lycV9zdGFydDsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9pb19pcnFfd2FpdCA9IG1lX2RldmljZV9pb19pcnFfd2FpdDsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9pb19pcnFfc3RvcCA9IG1lX2RldmljZV9pb19pcnFfc3RvcDsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9pb19yZXNldF9kZXZpY2UgPSBtZV9kZXZpY2VfaW9fcmVzZXRfZGV2aWNlOworCW1lX2RldmljZS0+bWVfZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSA9IG1lX2RldmljZV9pb19yZXNldF9zdWJkZXZpY2U7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfaW9fc2luZ2xlX2NvbmZpZyA9IG1lX2RldmljZV9pb19zaW5nbGVfY29uZmlnOworCW1lX2RldmljZS0+bWVfZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWVfZGV2aWNlX2lvX3NpbmdsZV9yZWFkOworCW1lX2RldmljZS0+bWVfZGV2aWNlX2lvX3NpbmdsZV93cml0ZSA9IG1lX2RldmljZV9pb19zaW5nbGVfd3JpdGU7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfaW9fc3RyZWFtX2NvbmZpZyA9IG1lX2RldmljZV9pb19zdHJlYW1fY29uZmlnOworCW1lX2RldmljZS0+bWVfZGV2aWNlX2lvX3N0cmVhbV9uZXdfdmFsdWVzID0KKwkgICAgbWVfZGV2aWNlX2lvX3N0cmVhbV9uZXdfdmFsdWVzOworCW1lX2RldmljZS0+bWVfZGV2aWNlX2lvX3N0cmVhbV9yZWFkID0gbWVfZGV2aWNlX2lvX3N0cmVhbV9yZWFkOworCW1lX2RldmljZS0+bWVfZGV2aWNlX2lvX3N0cmVhbV9zdGFydCA9IG1lX2RldmljZV9pb19zdHJlYW1fc3RhcnQ7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfaW9fc3RyZWFtX3N0YXR1cyA9IG1lX2RldmljZV9pb19zdHJlYW1fc3RhdHVzOworCW1lX2RldmljZS0+bWVfZGV2aWNlX2lvX3N0cmVhbV9zdG9wID0gbWVfZGV2aWNlX2lvX3N0cmVhbV9zdG9wOworCW1lX2RldmljZS0+bWVfZGV2aWNlX2lvX3N0cmVhbV93cml0ZSA9IG1lX2RldmljZV9pb19zdHJlYW1fd3JpdGU7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfbG9ja19kZXZpY2UgPSBtZV9kZXZpY2VfbG9ja19kZXZpY2U7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfbG9ja19zdWJkZXZpY2UgPSBtZV9kZXZpY2VfbG9ja19zdWJkZXZpY2U7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfZGVzY3JpcHRpb25fZGV2aWNlID0KKwkgICAgbWVfZGV2aWNlX3F1ZXJ5X2Rlc2NyaXB0aW9uX2RldmljZTsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9xdWVyeV9pbmZvX2RldmljZSA9IG1lX2RldmljZV9xdWVyeV9pbmZvX2RldmljZTsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9xdWVyeV9uYW1lX2RldmljZSA9IG1lX2RldmljZV9xdWVyeV9uYW1lX2RldmljZTsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9xdWVyeV9uYW1lX2RldmljZV9kcml2ZXIgPQorCSAgICBtZV9kZXZpY2VfcXVlcnlfbmFtZV9kZXZpY2VfZHJpdmVyOworCW1lX2RldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X251bWJlcl9zdWJkZXZpY2VzID0KKwkgICAgbWVfZGV2aWNlX3F1ZXJ5X251bWJlcl9zdWJkZXZpY2VzOworCW1lX2RldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lX2RldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfbnVtYmVyX3JhbmdlcyA9CisJICAgIG1lX2RldmljZV9xdWVyeV9udW1iZXJfcmFuZ2VzOworCW1lX2RldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXggPQorCSAgICBtZV9kZXZpY2VfcXVlcnlfcmFuZ2VfYnlfbWluX21heDsKKwltZV9kZXZpY2UtPm1lX2RldmljZV9xdWVyeV9yYW5nZV9pbmZvID0gbWVfZGV2aWNlX3F1ZXJ5X3JhbmdlX2luZm87CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2J5X3R5cGUgPQorCSAgICBtZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2J5X3R5cGU7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGUgPQorCSAgICBtZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGU7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHMgPQorCSAgICBtZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncyA9CisJICAgIG1lX2RldmljZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzOworCW1lX2RldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X3RpbWVyID0gbWVfZGV2aWNlX3F1ZXJ5X3RpbWVyOworCW1lX2RldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X3ZlcnNpb25fZGV2aWNlX2RyaXZlciA9CisJICAgIG1lX2RldmljZV9xdWVyeV92ZXJzaW9uX2RldmljZV9kcml2ZXI7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfY29uZmlnX2xvYWQgPSBtZV9kZXZpY2VfY29uZmlnX2xvYWQ7CisJbWVfZGV2aWNlLT5tZV9kZXZpY2VfZGVzdHJ1Y3RvciA9IG1lX2RldmljZV9kZXN0cnVjdG9yOworCisJcmV0dXJuIDA7CisKKyAgICAgIEVSUk9SXzA6CisJbWVfZGxvY2tfZGVpbml0KCZtZV9kZXZpY2UtPmRsb2NrKTsKKworICAgICAgRVJST1JfMToKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBjaV9kZXZpY2UpOworCisgICAgICBFUlJPUl8yOgorCXBjaV9kaXNhYmxlX2RldmljZShwY2lfZGV2aWNlKTsKKworCXJldHVybiAxOworfQorCit2b2lkIG1lX2RldmljZV9kZWluaXQobWVfZGV2aWNlX3QgKiBtZV9kZXZpY2UpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJbWVfc2xpc3RfZGVpbml0KCZtZV9kZXZpY2UtPnNsaXN0KTsKKwltZV9kbG9ja19kZWluaXQoJm1lX2RldmljZS0+ZGxvY2spOworCisJaWYgKG1lX2RldmljZS0+YnVzX3R5cGUgPT0gTUVfQlVTX1RZUEVfUENJKSB7CisJCXBjaV9yZWxlYXNlX3JlZ2lvbnMobWVfZGV2aWNlLT5pbmZvLnBjaS5wY2lfZGV2aWNlKTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKG1lX2RldmljZS0+aW5mby5wY2kucGNpX2RldmljZSk7CisJfQorLyoKKwllbHNlCisJeworCQkvLyBNdXN0IGJlIGFuIFVTQiBkZXZpY2UuCisJfQorKi8KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRldmljZS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVkYTgyOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRldmljZS5oCkBAIC0wLDAgKzEsMzA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBTb3VyY2UgRmlsZSA6IG1lZGV2aWNlLmgKKyAqIEF1dGhvciAgICAgIDogR0cgKEd1ZW50ZXIgR2ViaGFyZHQpICA8c3VwcG9ydEBtZWlsaGF1cy5kZT4KKyAqLworCisjaWZuZGVmIF9NRURFVklDRV9IXworI2RlZmluZSBfTUVERVZJQ0VfSF8KKworI2lmbmRlZiBLQlVJTERfTU9ETkFNRQorIyAgZGVmaW5lIEtCVUlMRF9NT0ROQU1FIEtCVUlMRF9TVFIobWVtYWluKQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgIm1ldHlwZXMuaCIKKyNpbmNsdWRlICJtZXNsaXN0LmgiCisjaW5jbHVkZSAibWVkbG9jay5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBEZWZpbmVzIGEgcG9pbnRlciB0eXBlIHRvIGEgUENJIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCBtZV9kZXZpY2UgKigqbWVfcGNpX2NvbnN0cnVjdG9yX3QpIChzdHJ1Y3QgcGNpX2RldiAqKTsKKworLyoqCisgKiBAYnJpZWYgRGVmaW5lcyBhIHBvaW50ZXIgdHlwZSB0byBhIE1FLTQwMDAgUENJIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLgorICovCisjaWZkZWYgQk9TQ0gKK3R5cGVkZWYgc3RydWN0IG1lX2RldmljZSAqKCptZV9ib3NjaF9jb25zdHJ1Y3Rvcl90KSAoc3RydWN0IHBjaV9kZXYgKiwKKwkJCQkJCSAgICAgaW50IG1lX2Jvc2NoX2Z3KTsKKyNlbmRpZgorCisvKioKKyAqIEBicmllZiBEZWZpbmVzIGEgcG9pbnRlciB0eXBlIHRvIGEgVVNCIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLgorICovCisvL3R5cGVkZWYgc3RydWN0IG1lX2RldmljZSAqKCptZV91c2JfY29uc3RydWN0b3JfdCkoc3RydWN0IHVzYl9pbnRlcmZhY2UgKik7CisKKy8qKgorICogQGJyaWVmIERlZmluZXMgYSBwb2ludGVyIHR5cGUgdG8gdGhlIGR1bW15IGNvbnN0cnVjdG9yIGZ1bmN0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCBtZV9kZXZpY2UgKigqbWVfZHVtbXlfY29uc3RydWN0b3JfdCkgKHVuc2lnbmVkIHNob3J0IHZlbmRvcl9pZCwKKwkJCQkJCSAgICAgdW5zaWduZWQgc2hvcnQgZGV2aWNlX2lkLAorCQkJCQkJICAgICB1bnNpZ25lZCBpbnQgc2VyaWFsX25vLAorCQkJCQkJICAgICBpbnQgYnVzX3R5cGUsCisJCQkJCQkgICAgIGludCBidXNfbm8sCisJCQkJCQkgICAgIGludCBkZXZfbm8sIGludCBmdW5jX25vKTsKKworLy9leHRlcm4gbWVfdXNiX2NvbnN0cnVjdG9yX3QgbWVwaGlzdG9fczFfY29uc3RydWN0b3IgX19hdHRyaWJ1dGVfXyAoKHdlYWspKTsKKworLyoqCisgKiBAYnJpZWYgSG9sZHMgdGhlIFBDSSBkZXZpY2UgaW5mb3JtYXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lX3BjaV9pbmZvIHsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldmljZTsJCQkvKio8IEtlcm5lbCBQQ0kgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKwl1aW50MzJfdCByZWdfYmFzZXNbNl07CQkJCS8qKjwgVGhlIGJhc2UgYWRyZXNzZXMgb2YgdGhlIFBDSSBiYXJzLiAqLworCXVpbnQzMl90IHJlZ19zaXplc1s2XTsJCQkJLyoqPCBUaGUgc2l6ZXMgb2YgdGhlIFBDSSBiYXJzLiAqLworCisJdWludDMyX3QgcGNpX2J1c19ubzsJCQkJLyoqPCBQQ0kgYnVzIG51bWJlci4gKi8KKwl1aW50MzJfdCBwY2lfZGV2X25vOwkJCQkvKio8IFBDSSBkZXZpY2UgbnVtYmVyLiAqLworCXVpbnQzMl90IHBjaV9mdW5jX25vOwkJCQkvKio8IFBDSSBmdW5jdGlvbiBudW1iZXIuICovCisKKwl1aW50MTZfdCB2ZW5kb3JfaWQ7CQkJCQkvKio8IE1laWxoYXVzIFBDSSB2ZW5kb3IgaWQuICovCisJdWludDE2X3QgZGV2aWNlX2lkOwkJCQkJLyoqPCBNZWlsaGF1cyBkZXZpY2UgaWQuICovCisJdWludDhfdCBod19yZXZpc2lvbjsJCQkJLyoqPCBIYXJkd2FyZSByZXZpc2lvbiBvZiB0aGUgZGV2aWNlLiAqLworCXVpbnQzMl90IHNlcmlhbF9ubzsJCQkJCS8qKjwgU2VyaWFsIG51bWJlciBvZiB0aGUgZGV2aWNlLiAqLworfSBtZV9wY2lfaW5mb190OworCisvKioKKyAqIEBicmllZiBIb2xkcyB0aGUgVVNCIGRldmljZSBpbmZvcm1hdGlvbi4KKyAqLworLy90eXBlZGVmIHN0cnVjdCBtZV91c2JfaW5mbyB7CisvL30gbWVfdXNiX2luZm9fdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIE1laWxoYXVzIGRldmljZSBiYXNlIGNsYXNzIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWVfZGV2aWNlIHsKKwkvKiBBdHRyaWJ1dGVzICovCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkJCQkvKio8IEVuYWJsZXMgdGhlIGRldmljZSB0byBiZSBhZGRlZCB0byBhIGR5bmFtaWMgbGlzdC4gKi8KKy8vICAgICAgaW50IG1hZ2ljOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVGhlIG1hZ2ljIG51bWJlciBvZiB0aGUgc3RydWN0dXJlLiAqLworCisJaW50IGJ1c190eXBlOwkJCQkJCS8qKjwgVGhlIGRlc2NyaW1pbmF0b3IgZm9yIHRoZSB1bmlvbi4gKi8KKwl1bmlvbiB7CisJCW1lX3BjaV9pbmZvX3QgcGNpOwkJCQkvKio8IFBDSSBzcGVjaWZpYyBkZXZpY2UgaW5mb3JtYXRpb24uICovCisvLyAgICAgICAgICAgICAgbWVfdXNiX2luZm9fdCB1c2I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBVU0Igc3BlY2lmaWMgZGV2aWNlIGluZm9ybWF0aW9uLiAqLworCX0gaW5mbzsJCQkJCQkJCS8qKjwgSG9sZHMgdGhlIGRldmljZSBpbmZvcm1hdGlvbi4gKi8KKworCWludCBpcnE7CQkJCQkJCS8qKjwgVGhlIGlycSBhc3NpZ25lZCB0byB0aGlzIGRldmljZS4gKi8KKworCW1lX2Rsb2NrX3QgZGxvY2s7CQkJCQkvKio8IFRoZSBkZXZpY2UgbG9ja2luZyBzdHJ1Y3R1cmUuICovCisJbWVfc2xpc3RfdCBzbGlzdDsJCQkJCS8qKjwgVGhlIGNvbnRhaW5lciBob2xkaW5nIGFsbCBzdWJkZXZpY2VzIGJlbG9uZ2luZyB0byB0aGlzIGRldmljZS4gKi8KKworCWNoYXIgKmRldmljZV9uYW1lOwkJCQkJLyoqPCBUaGUgbmFtZSBvZiB0aGUgTWVpbGhhdXMgZGV2aWNlLiAqLworCWNoYXIgKmRldmljZV9kZXNjcmlwdGlvbjsJCQkvKio8IFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgTWVpbGhhdXMgZGV2aWNlLiAqLworCWNoYXIgKmRyaXZlcl9uYW1lOwkJCQkJLyoqPCBUaGUgbmFtZSBvZiB0aGUgZGV2aWNlIGRyaXZlciBtb2R1bGUgc3VwcG9ydGluZyB0aGUgZGV2aWNlIGZhbWlseS4gKi8KKworCS8qIE1ldGhvZHMgKi8KKwlpbnQgKCptZV9kZXZpY2VfaW9faXJxX3N0YXJ0KSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkgICAgICAgc3RydWN0IGZpbGUgKiBmaWxlcCwKKwkJCQkgICAgICAgaW50IHN1YmRldmljZSwKKwkJCQkgICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgIGludCBpcnFfc291cmNlLAorCQkJCSAgICAgICBpbnQgaXJxX2VkZ2UsIGludCBpcnFfYXJnLCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfZGV2aWNlX2lvX2lycV93YWl0KSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqIGZpbGVwLAorCQkJCSAgICAgIGludCBzdWJkZXZpY2UsCisJCQkJICAgICAgaW50IGNoYW5uZWwsCisJCQkJICAgICAgaW50ICppcnFfY291bnQsCisJCQkJICAgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfZGV2aWNlX2lvX2lycV9zdG9wKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqIGZpbGVwLAorCQkJCSAgICAgIGludCBzdWJkZXZpY2UsIGludCBjaGFubmVsLCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfZGV2aWNlX2lvX3Jlc2V0X2RldmljZSkgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJCSAgc3RydWN0IGZpbGUgKiBmaWxlcCwgaW50IGZsYWdzKTsKKworCWludCAoKm1lX2RldmljZV9pb19yZXNldF9zdWJkZXZpY2UpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCQkgICAgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSAgICAgaW50IHN1YmRldmljZSwgaW50IGZsYWdzKTsKKworCWludCAoKm1lX2RldmljZV9pb19zaW5nbGVfY29uZmlnKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkJICAgc3RydWN0IGZpbGUgKiBmaWxlcCwKKwkJCQkJICAgaW50IHN1YmRldmljZSwKKwkJCQkJICAgaW50IGNoYW5uZWwsCisJCQkJCSAgIGludCBzaW5nbGVfY29uZmlnLAorCQkJCQkgICBpbnQgcmVmLAorCQkJCQkgICBpbnQgdHJpZ19jaGFuLAorCQkJCQkgICBpbnQgdHJpZ190eXBlLAorCQkJCQkgICBpbnQgdHJpZ19lZGdlLCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfZGV2aWNlX2lvX3NpbmdsZV9yZWFkKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkJIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSBpbnQgc3ViZGV2aWNlLAorCQkJCQkgaW50IGNoYW5uZWwsCisJCQkJCSBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncyk7CisKKwlpbnQgKCptZV9kZXZpY2VfaW9fc2luZ2xlX3dyaXRlKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkJICBzdHJ1Y3QgZmlsZSAqIGZpbGVwLAorCQkJCQkgIGludCBzdWJkZXZpY2UsCisJCQkJCSAgaW50IGNoYW5uZWwsCisJCQkJCSAgaW50IHZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncyk7CisKKwlpbnQgKCptZV9kZXZpY2VfaW9fc3RyZWFtX2NvbmZpZykgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJCSAgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSAgIGludCBzdWJkZXZpY2UsCisJCQkJCSAgIG1lSU9TdHJlYW1Db25maWdfdCAqIGNvbmZpZ19saXN0LAorCQkJCQkgICBpbnQgY291bnQsCisJCQkJCSAgIG1lSU9TdHJlYW1UcmlnZ2VyX3QgKiB0cmlnZ2VyLAorCQkJCQkgICBpbnQgZmlmb19pcnFfdGhyZXNob2xkLCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfZGV2aWNlX2lvX3N0cmVhbV9uZXdfdmFsdWVzKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkJICAgICAgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSAgICAgICBpbnQgc3ViZGV2aWNlLAorCQkJCQkgICAgICAgaW50IHRpbWVfb3V0LAorCQkJCQkgICAgICAgaW50ICpjb3VudCwgaW50IGZsYWdzKTsKKworCWludCAoKm1lX2RldmljZV9pb19zdHJlYW1fcmVhZCkgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJCSBzdHJ1Y3QgZmlsZSAqIGZpbGVwLAorCQkJCQkgaW50IHN1YmRldmljZSwKKwkJCQkJIGludCByZWFkX21vZGUsCisJCQkJCSBpbnQgKnZhbHVlcywgaW50ICpjb3VudCwgaW50IGZsYWdzKTsKKworCWludCAoKm1lX2RldmljZV9pb19zdHJlYW1fc3RhcnQpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCQkgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSAgaW50IHN1YmRldmljZSwKKwkJCQkJICBpbnQgc3RhcnRfbW9kZSwKKwkJCQkJICBpbnQgdGltZV9vdXQsIGludCBmbGFncyk7CisKKwlpbnQgKCptZV9kZXZpY2VfaW9fc3RyZWFtX3N0YXR1cykgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJCSAgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSAgIGludCBzdWJkZXZpY2UsCisJCQkJCSAgIGludCB3YWl0LAorCQkJCQkgICBpbnQgKnN0YXR1cywgaW50ICpjb3VudCwgaW50IGZsYWdzKTsKKworCWludCAoKm1lX2RldmljZV9pb19zdHJlYW1fc3RvcCkgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJCSBzdHJ1Y3QgZmlsZSAqIGZpbGVwLAorCQkJCQkgaW50IHN1YmRldmljZSwKKwkJCQkJIGludCBzdG9wX21vZGUsIGludCBmbGFncyk7CisKKwlpbnQgKCptZV9kZXZpY2VfaW9fc3RyZWFtX3dyaXRlKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkJICBzdHJ1Y3QgZmlsZSAqIGZpbGVwLAorCQkJCQkgIGludCBzdWJkZXZpY2UsCisJCQkJCSAgaW50IHdyaXRlX21vZGUsCisJCQkJCSAgaW50ICp2YWx1ZXMsIGludCAqY291bnQsIGludCBmbGFncyk7CisKKwlpbnQgKCptZV9kZXZpY2VfbG9ja19kZXZpY2UpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICogZmlsZXAsIGludCBsb2NrLCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfZGV2aWNlX2xvY2tfc3ViZGV2aWNlKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkJIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSBpbnQgc3ViZGV2aWNlLCBpbnQgbG9jaywgaW50IGZsYWdzKTsKKworCWludCAoKm1lX2RldmljZV9xdWVyeV9kZXNjcmlwdGlvbl9kZXZpY2UpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCQkJICAgY2hhciAqKmRlc2NyaXB0aW9uKTsKKworCWludCAoKm1lX2RldmljZV9xdWVyeV9pbmZvX2RldmljZSkgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJCSAgICBpbnQgKnZlbmRvcl9pZCwKKwkJCQkJICAgIGludCAqZGV2aWNlX2lkLAorCQkJCQkgICAgaW50ICpzZXJpYWxfbm8sCisJCQkJCSAgICBpbnQgKmJ1c190eXBlLAorCQkJCQkgICAgaW50ICpidXNfbm8sCisJCQkJCSAgICBpbnQgKmRldl9ubywKKwkJCQkJICAgIGludCAqZnVuY19ubywgaW50ICpwbHVnZ2VkKTsKKworCWludCAoKm1lX2RldmljZV9xdWVyeV9uYW1lX2RldmljZSkgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJCSAgICBjaGFyICoqbmFtZSk7CisKKwlpbnQgKCptZV9kZXZpY2VfcXVlcnlfbmFtZV9kZXZpY2VfZHJpdmVyKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkJCSAgIGNoYXIgKipuYW1lKTsKKworCWludCAoKm1lX2RldmljZV9xdWVyeV9udW1iZXJfc3ViZGV2aWNlcykgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJCQkgIGludCAqbnVtYmVyKTsKKworCWludCAoKm1lX2RldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCQkJaW50IHN1YmRldmljZSwgaW50ICpudW1iZXIpOworCisJaW50ICgqbWVfZGV2aWNlX3F1ZXJ5X251bWJlcl9yYW5nZXMpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCQkgICAgICBpbnQgc3ViZGV2aWNlLAorCQkJCQkgICAgICBpbnQgdW5pdCwgaW50ICpjb3VudCk7CisKKwlpbnQgKCptZV9kZXZpY2VfcXVlcnlfcmFuZ2VfYnlfbWluX21heCkgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJCQkgaW50IHN1YmRldmljZSwKKwkJCQkJCSBpbnQgdW5pdCwKKwkJCQkJCSBpbnQgKm1pbiwKKwkJCQkJCSBpbnQgKm1heCwKKwkJCQkJCSBpbnQgKm1heGRhdGEsIGludCAqcmFuZ2UpOworCisJaW50ICgqbWVfZGV2aWNlX3F1ZXJ5X3JhbmdlX2luZm8pIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCQkgICBpbnQgc3ViZGV2aWNlLAorCQkJCQkgICBpbnQgcmFuZ2UsCisJCQkJCSAgIGludCAqdW5pdCwKKwkJCQkJICAgaW50ICptaW4sIGludCAqbWF4LCBpbnQgKm1heGRhdGEpOworCisJaW50ICgqbWVfZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9ieV90eXBlKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkJCSAgaW50IHN0YXJ0X3N1YmRldmljZSwKKwkJCQkJCSAgaW50IHR5cGUsCisJCQkJCQkgIGludCBzdWJ0eXBlLCBpbnQgKnN1YmRldmljZSk7CisKKwlpbnQgKCptZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGUpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCQkgICAgICAgaW50IHN1YmRldmljZSwKKwkJCQkJICAgICAgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKTsKKworCWludCAoKm1lX2RldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcykgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJCSAgICAgICBpbnQgc3ViZGV2aWNlLCBpbnQgKmNhcHMpOworCisJaW50ICgqbWVfZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3MpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCQkJICAgIGludCBzdWJkZXZpY2UsCisJCQkJCQkgICAgaW50IGNhcCwKKwkJCQkJCSAgICBpbnQgKmFyZ3MsIGludCBjb3VudCk7CisKKwlpbnQgKCptZV9kZXZpY2VfcXVlcnlfdGltZXIpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlLAorCQkJCSAgICAgIGludCBzdWJkZXZpY2UsCisJCQkJICAgICAgaW50IHRpbWVyLAorCQkJCSAgICAgIGludCAqYmFzZV9mcmVxdWVuY3ksCisJCQkJICAgICAgdWludDY0X3QgKiBtaW5fdGlja3MsCisJCQkJICAgICAgdWludDY0X3QgKiBtYXhfdGlja3MpOworCisJaW50ICgqbWVfZGV2aWNlX3F1ZXJ5X3ZlcnNpb25fZGV2aWNlX2RyaXZlcikgKHN0cnVjdCBtZV9kZXZpY2UgKiBkZXZpY2UsCisJCQkJCQkgICAgICBpbnQgKnZlcnNpb24pOworCisJaW50ICgqbWVfZGV2aWNlX2NvbmZpZ19sb2FkKSAoc3RydWN0IG1lX2RldmljZSAqIGRldmljZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqIGZpbGVwLAorCQkJCSAgICAgIG1lX2NmZ19kZXZpY2VfZW50cnlfdCAqIGNvbmZpZyk7CisKKwl2b2lkICgqbWVfZGV2aWNlX2Rlc3RydWN0b3IpIChzdHJ1Y3QgbWVfZGV2aWNlICogZGV2aWNlKTsKK30gbWVfZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIEluaXRpYWxpemVzIGEgUENJIGRldmljZSBiYXNlIGNsYXNzIHN0cnVjdHVyZS4KKyAqCisgKiBAcGFyYW0gcGNpX2RldmljZSBUaGUgUENJIGRldmljZSBjb250ZXh0IGFzIGhhbmRlZCBvdmVyIGJ5IGtlcm5lbC4KKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcy4KKyAqLworaW50IG1lX2RldmljZV9wY2lfaW5pdChtZV9kZXZpY2VfdCAqIG1lX2RldmljZSwgc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2UpOworCisvKioKKyAqIEBicmllZiBJbml0aWFsaXplcyBhIFVTQiBkZXZpY2UgYmFzZSBjbGFzcyBzdHJ1Y3R1cmUuCisgKgorICogQHBhcmFtIHVzYl9pbnRlcmZhY2UgVGhlIFVTQiBkZXZpY2UgaW50ZXJmYWNlIGFzIGhhbmRlZCBvdmVyIGJ5IGtlcm5lbC4KKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcy4KKyAqLworLy9pbnQgbWVfZGV2aWNlX3VzYl9pbml0KG1lX2RldmljZV90ICptZV9kZXZpY2UsIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpOworCisvKioKKyAgKiBAYnJpZWYgRGVpbml0aWFsaXplcyBhIGRldmljZSBiYXNlIGNsYXNzIHN0cnVjdHVyZSBhbmQgZnJlZXMgYW55IHByZXZpb3VzbHkKKyAgKiByZXF1ZXN0ZWQgcmVzb3VyY2VzIHJlbGF0ZWQgd2l0aCB0aGlzIHN0cnVjdHVyZS4gSXQgYWxzbyBmcmVlcyBhbnkgc3ViZGV2aWNlCisgICogaW5zdGFuY2UgaG9sZCBieSB0aGUgc3ViZGV2aWNlIGxpc3QuCisgICoKKyAgKiBAcGFyYW0gbWVfZGV2aWNlIFRoZSBkZXZpY2UgY2xhc3MgdG8gZGVpbml0aWFsaXplLgorICAqLwordm9pZCBtZV9kZXZpY2VfZGVpbml0KG1lX2RldmljZV90ICogbWVfZGV2aWNlKTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRsaXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkbGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNGUzNjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkbGlzdC5jCkBAIC0wLDAgKzEsMTI3IEBACisvKioKKyAqIEBmaWxlIG1lX2RsaXN0LmMKKyAqCisgKiBAYnJpZWYgSW1wbGVtZW50cyB0aGUgZGV2aWNlIGxpc3QgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgIm1lZXJyb3IuaCIKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKworI2luY2x1ZGUgIm1lZGxpc3QuaCIKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisKK2ludCBtZV9kbGlzdF9xdWVyeV9udW1iZXJfZGV2aWNlcyhzdHJ1Y3QgbWVfZGxpc3QgKmRsaXN0LCBpbnQgKm51bWJlcikKK3sKKwlQREVCVUdfTE9DS1MoImNhbGxlZC5cbiIpOworCSpudW1iZXIgPSBkbGlzdC0+bjsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKwordW5zaWduZWQgaW50IG1lX2RsaXN0X2dldF9udW1iZXJfZGV2aWNlcyhzdHJ1Y3QgbWVfZGxpc3QgKmRsaXN0KQoreworCVBERUJVR19MT0NLUygiY2FsbGVkLlxuIik7CisJcmV0dXJuIGRsaXN0LT5uOworfQorCittZV9kZXZpY2VfdCAqbWVfZGxpc3RfZ2V0X2RldmljZShzdHJ1Y3QgbWVfZGxpc3QgKiBkbGlzdCwgdW5zaWduZWQgaW50IGluZGV4KQoreworCisJc3RydWN0IGxpc3RfaGVhZCAqcG9zOworCW1lX2RldmljZV90ICpkZXZpY2UgPSBOVUxMOworCXVuc2lnbmVkIGludCBpID0gMDsKKworCVBERUJVR19MT0NLUygiY2FsbGVkLlxuIik7CisKKwlpZiAoaW5kZXggPj0gZGxpc3QtPm4pIHsKKwkJUEVSUk9SKCJJbmRleCBvdXQgb2YgcmFuZ2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbGlzdF9mb3JfZWFjaChwb3MsICZkbGlzdC0+aGVhZCkgeworCQlpZiAoaSA9PSBpbmRleCkgeworCQkJZGV2aWNlID0gbGlzdF9lbnRyeShwb3MsIG1lX2RldmljZV90LCBsaXN0KTsKKwkJCWJyZWFrOworCQl9CisKKwkJKytpOworCX0KKworCXJldHVybiBkZXZpY2U7Cit9CisKK3ZvaWQgbWVfZGxpc3RfYWRkX2RldmljZV90YWlsKHN0cnVjdCBtZV9kbGlzdCAqZGxpc3QsIG1lX2RldmljZV90ICogZGV2aWNlKQoreworCVBERUJVR19MT0NLUygiY2FsbGVkLlxuIik7CisKKwlsaXN0X2FkZF90YWlsKCZkZXZpY2UtPmxpc3QsICZkbGlzdC0+aGVhZCk7CisJKytkbGlzdC0+bjsKK30KKworbWVfZGV2aWNlX3QgKm1lX2RsaXN0X2RlbF9kZXZpY2VfdGFpbChzdHJ1Y3QgbWVfZGxpc3QgKmRsaXN0KQoreworCisJc3RydWN0IGxpc3RfaGVhZCAqbGFzdDsKKwltZV9kZXZpY2VfdCAqZGV2aWNlOworCisJUERFQlVHX0xPQ0tTKCJjYWxsZWQuXG4iKTsKKworCWlmIChsaXN0X2VtcHR5KCZkbGlzdC0+aGVhZCkpCisJCXJldHVybiBOVUxMOworCisJbGFzdCA9IGRsaXN0LT5oZWFkLnByZXY7CisKKwlkZXZpY2UgPSBsaXN0X2VudHJ5KGxhc3QsIG1lX2RldmljZV90LCBsaXN0KTsKKworCWxpc3RfZGVsKGxhc3QpOworCisJLS1kbGlzdC0+bjsKKworCXJldHVybiBkZXZpY2U7Cit9CisKK2ludCBtZV9kbGlzdF9pbml0KG1lX2RsaXN0X3QgKiBkbGlzdCkKK3sKKwlQREVCVUdfTE9DS1MoImNhbGxlZC5cbiIpOworCisJSU5JVF9MSVNUX0hFQUQoJmRsaXN0LT5oZWFkKTsKKwlkbGlzdC0+biA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbWVfZGxpc3RfZGVpbml0KG1lX2RsaXN0X3QgKiBkbGlzdCkKK3sKKworCXN0cnVjdCBsaXN0X2hlYWQgKnM7CisJbWVfZGV2aWNlX3QgKmRldmljZTsKKworCVBERUJVR19MT0NLUygiY2FsbGVkLlxuIik7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmRsaXN0LT5oZWFkKSkgeworCQlzID0gZGxpc3QtPmhlYWQubmV4dDsKKwkJbGlzdF9kZWwocyk7CisJCWRldmljZSA9IGxpc3RfZW50cnkocywgbWVfZGV2aWNlX3QsIGxpc3QpOworCQlkZXZpY2UtPm1lX2RldmljZV9kZXN0cnVjdG9yKGRldmljZSk7CisJfQorCisJZGxpc3QtPm4gPSAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZGxpc3QuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRsaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkxYzExZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRsaXN0LmgKQEAgLTAsMCArMSw5MSBAQAorLyoqCisgKiBAZmlsZSBtZV9kbGlzdC5oCisgKgorICogQGJyaWVmIFByb3ZpZGVzIHRoZSBkZXZpY2UgbGlzdCBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisjaWZuZGVmIF9NRV9ETElTVF9IXworI2RlZmluZSBfTUVfRExJU1RfSF8KKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFRoZSBkZXZpY2UgbGlzdCBjb250YWluZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lX2RsaXN0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7CQkvKio8IFRoZSBoZWFkIG9mIHRoZSBpbnRlcm5hbCBsaXN0LiAqLworCXVuc2lnbmVkIGludCBuOwkJCS8qKjwgVGhlIG51bWJlciBvZiBkZXZpY2VzIGluIHRoZSBsaXN0LiAqLworfSBtZV9kbGlzdF90OworCisvKioKKyAqIEBicmllZiBRdWVyaWVzIHRoZSBudW1iZXIgb2YgZGV2aWNlcyBjdXJyZW50bHkgaW5zaWRlIHRoZSBsaXN0LgorICoKKyAqIEBwYXJhbSBkbGlzdCBUaGUgZGV2aWNlIGxpc3QgdG8gcXVlcnkuCisgKiBAcGFyYW1bb3V0XSBudW1iZXIgVGhlIG51bWJlciBvZiBkZXZpY2VzLgorICoKKyAqIEByZXR1cm4gTUUtaURTIGVycm9yIGNvZGUuCisgKi8KK2ludCBtZV9kbGlzdF9xdWVyeV9udW1iZXJfZGV2aWNlcyhzdHJ1Y3QgbWVfZGxpc3QgKmRsaXN0LCBpbnQgKm51bWJlcik7CisKKy8qKgorICogQGJyaWVmIFJldHVybnMgdGhlIG51bWJlciBvZiBkZXZpY2VzIGN1cnJlbnRseSBpbnNpZGUgdGhlIGxpc3QuCisgKgorICogQHBhcmFtIGRsaXN0IFRoZSBkZXZpY2UgbGlzdCB0byBxdWVyeS4KKyAqCisgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgZGV2aWNlcyBpbiB0aGUgbGlzdC4KKyAqLwordW5zaWduZWQgaW50IG1lX2RsaXN0X2dldF9udW1iZXJfZGV2aWNlcyhzdHJ1Y3QgbWVfZGxpc3QgKmRsaXN0KTsKKworLyoqCisgKiBAYnJpZWYgR2V0IGEgZGV2aWNlIGJ5IGluZGV4LgorICoKKyAqIEBwYXJhbSBkbGlzdCBUaGUgZGV2aWNlIGxpc3QgdG8gcXVlcnkuCisgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBkZXZpY2UgdG8gZ2V0IGluIHRoZSBsaXN0LgorICoKKyAqIEByZXR1cm4gVGhlIGRldmljZSBhdCBpbmRleCBpZiBhdmFpbGFibGUuXG4KKyAqICAgICAgICAgTlVMTCBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIHJhbmdlLgorICovCittZV9kZXZpY2VfdCAqbWVfZGxpc3RfZ2V0X2RldmljZShzdHJ1Y3QgbWVfZGxpc3QgKmRsaXN0LCB1bnNpZ25lZCBpbnQgaW5kZXgpOworCisvKioKKyAqIEBicmllZiBBZGRzIGEgZGV2aWNlIHRvIHRoZSB0YWlsIG9mIHRoZSBsaXN0LgorICoKKyAqIEBwYXJhbSBkbGlzdCBUaGUgZGV2aWNlIGxpc3QgdG8gYWRkIGEgZGV2aWNlIHRvLgorICogQHBhcmFtIGRldmljZSBUaGUgZGV2aWNlIHRvIGFkZCB0byB0aGUgbGlzdC4KKyAqLwordm9pZCBtZV9kbGlzdF9hZGRfZGV2aWNlX3RhaWwoc3RydWN0IG1lX2RsaXN0ICpkbGlzdCwgbWVfZGV2aWNlX3QgKiBkZXZpY2UpOworCisvKioKKyAqIEBicmllZiBSZW1vdmVzIGEgZGV2aWNlIGZyb20gdGhlIHRhaWwgb2YgdGhlIGxpc3QuCisgKgorICogQHBhcmFtIGRsaXN0IFRoZSBkZXZpY2UgbGlzdC4KKyAqCisgKiBAcmV0dXJuIFBvaW50ZXIgdG8gdGhlIHJlbW92ZWQgc3ViZGVpdmNlLlxuCisgKiAgICAgICAgIE5VTEwgaW4gY2FzZXMgd2hlcmUgdGhlIGxpc3Qgd2FzIGVtcHR5LgorICovCittZV9kZXZpY2VfdCAqbWVfZGxpc3RfZGVsX2RldmljZV90YWlsKHN0cnVjdCBtZV9kbGlzdCAqZGxpc3QpOworCisvKioKKyAqIEBicmllZiBJbml0aWFsaXplcyBhIGRldmljZSBsaXN0IHN0cnVjdHVyZS4KKyAqCisgKiBAcGFyYW0gbG9jayBUaGUgZGV2aWNlIGxpc3Qgc3RydWN0dXJlIHRvIGluaXRpYWxpemUuCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcy4KKyAqLworaW50IG1lX2RsaXN0X2luaXQobWVfZGxpc3RfdCAqIGRsaXN0KTsKKworLyoqCisgKiBAYnJpZWYgRGVpbml0aWFsaXplcyBhIGRldmljZSBsaXN0IHN0cnVjdHVyZSBhbmQgZGVzdHJ1Y3RzIGV2ZXJ5IGRldmljZSBpbiBpdC4KKyAqCisgKiBAcGFyYW0gZGxpc3QgVGhlIGRldmljZSBsaXN0IHN0cnVjdHVyZSB0byBkZWluaXRpYWxpemUuCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcy4KKyAqLwordm9pZCBtZV9kbGlzdF9kZWluaXQobWVfZGxpc3RfdCAqIGRsaXN0KTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRsb2NrLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NDllM2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkbG9jay5jCkBAIC0wLDAgKzEsMTk1IEBACisvKioKKyAqIEBmaWxlIG1lZGxvY2suYworICoKKyAqIEBicmllZiBJbXBsZW1lbnRzIHRoZSBkZXZpY2UgbG9jayBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNiBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZXNsaXN0LmgiCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKyNpbmNsdWRlICJtZWRsb2NrLmgiCisKK2ludCBtZV9kbG9ja19lbnRlcihzdHJ1Y3QgbWVfZGxvY2sgKmRsb2NrLCBzdHJ1Y3QgZmlsZSAqZmlsZXApCit7CisJUERFQlVHX0xPQ0tTKCJleGVjdXRlZC5cbiIpOworCisJc3Bpbl9sb2NrKCZkbG9jay0+c3Bpbl9sb2NrKTsKKworCWlmICgoZGxvY2stPmZpbGVwKSAhPSBOVUxMICYmIChkbG9jay0+ZmlsZXAgIT0gZmlsZXApKSB7CisJCVBFUlJPUigiRGV2aWNlIGlzIGxvY2tlZCBieSBhbm90aGVyIHByb2Nlc3MuXG4iKTsKKwkJc3Bpbl91bmxvY2soJmRsb2NrLT5zcGluX2xvY2spOworCQlyZXR1cm4gTUVfRVJSTk9fTE9DS0VEOworCX0KKworCWRsb2NrLT5jb3VudCsrOworCisJc3Bpbl91bmxvY2soJmRsb2NrLT5zcGluX2xvY2spOworCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK2ludCBtZV9kbG9ja19leGl0KHN0cnVjdCBtZV9kbG9jayAqZGxvY2ssIHN0cnVjdCBmaWxlICpmaWxlcCkKK3sKKwlQREVCVUdfTE9DS1MoImV4ZWN1dGVkLlxuIik7CisKKwlzcGluX2xvY2soJmRsb2NrLT5zcGluX2xvY2spOworCWRsb2NrLT5jb3VudC0tOworCXNwaW5fdW5sb2NrKCZkbG9jay0+c3Bpbl9sb2NrKTsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitpbnQgbWVfZGxvY2tfbG9jayhzdHJ1Y3QgbWVfZGxvY2sgKmRsb2NrLAorCQkgIHN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGxvY2ssIGludCBmbGFncywgbWVfc2xpc3RfdCAqIHNsaXN0KQoreworCWludCBlcnIgPSBNRV9FUlJOT19TVUNDRVNTOworCWludCBpOworCW1lX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisKKwlQREVCVUdfTE9DS1MoImV4ZWN1dGVkLlxuIik7CisKKwlzcGluX2xvY2soJmRsb2NrLT5zcGluX2xvY2spOworCisJc3dpdGNoIChsb2NrKSB7CisKKwljYXNlIE1FX0xPQ0tfUkVMRUFTRToKKwkJaWYgKChkbG9jay0+ZmlsZXAgPT0gZmlsZXApIHx8IChkbG9jay0+ZmlsZXAgPT0gTlVMTCkpIHsKKwkJCWRsb2NrLT5maWxlcCA9IE5VTEw7CisKKwkJCS8qIFVubG9jayBhbGwgcG9zc2libHkgbG9ja2VkIHN1YmRldmljZXMuICovCisKKwkJCWZvciAoaSA9IDA7IGkgPCBtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoc2xpc3QpOworCQkJICAgICBpKyspIHsKKwkJCQlzdWJkZXZpY2UgPSBtZV9zbGlzdF9nZXRfc3ViZGV2aWNlKHNsaXN0LCBpKTsKKworCQkJCWlmIChzdWJkZXZpY2UpCisJCQkJCWVyciA9CisJCQkJCSAgICBzdWJkZXZpY2UtPgorCQkJCQkgICAgbWVfc3ViZGV2aWNlX2xvY2tfc3ViZGV2aWNlCisJCQkJCSAgICAoc3ViZGV2aWNlLCBmaWxlcCwgTUVfTE9DS19SRUxFQVNFLAorCQkJCQkgICAgIGZsYWdzKTsKKwkJCQllbHNlCisJCQkJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCQkJfQorCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIE1FX0xPQ0tfU0VUOgorCQlpZiAoZGxvY2stPmNvdW50KSB7CisJCQlQRVJST1IoIkRldmljZSBpcyB1c2VkIGJ5IGFub3RoZXIgcHJvY2Vzcy5cbiIpOworCQkJZXJyID0gTUVfRVJSTk9fVVNFRDsKKwkJfSBlbHNlIGlmICgoZGxvY2stPmZpbGVwICE9IE5VTEwpICYmIChkbG9jay0+ZmlsZXAgIT0gZmlsZXApKSB7CisJCQlQRVJST1IoIkRldmljZSBpcyBsb2NrZWQgYnkgYW5vdGhlciBwcm9jZXNzLlxuIik7CisJCQllcnIgPSBNRV9FUlJOT19MT0NLRUQ7CisJCX0gZWxzZSBpZiAoZGxvY2stPmZpbGVwID09IE5VTEwpIHsKKwkJCS8qIENoZWNrIGFueSBzdWJkZXZpY2UgaXMgbG9ja2VkIGJ5IGFub3RoZXIgcHJvY2Vzcy4gKi8KKworCQkJZm9yIChpID0gMDsgaSA8IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcyhzbGlzdCk7CisJCQkgICAgIGkrKykgeworCQkJCXN1YmRldmljZSA9IG1lX3NsaXN0X2dldF9zdWJkZXZpY2Uoc2xpc3QsIGkpOworCisJCQkJaWYgKHN1YmRldmljZSkgeworCQkJCQlpZiAoKGVyciA9CisJCQkJCSAgICAgc3ViZGV2aWNlLT4KKwkJCQkJICAgICBtZV9zdWJkZXZpY2VfbG9ja19zdWJkZXZpY2UKKwkJCQkJICAgICAoc3ViZGV2aWNlLCBmaWxlcCwgTUVfTE9DS19DSEVDSywKKwkJCQkJICAgICAgZmxhZ3MpKSkgeworCQkJCQkJUEVSUk9SCisJCQkJCQkgICAgKCJBIHN1YmRldmljZSBpcyBsb2NrZWQgYnkgYW5vdGhlciBwcm9jZXNzLlxuIik7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWVyciA9IE1FX0VSUk5PX0lOVEVSTkFMOworCQkJCX0KKwkJCX0KKworCQkJLyogSWYgbm8gc3ViZGV2aWNlcyBhcmUgbG9ja2VkIGJ5IG90aGVyIHByb2Nlc3NlcywKKwkJCSAgIHdlIGNhbiB0YWtlIG93bmVyc2hpcCBvZiB0aGUgZGV2aWNlLiBPdGhlcndpc2Ugd2UganVtcCBhaGVhZC4gKi8KKwkJCWlmICghZXJyKQorCQkJCWRsb2NrLT5maWxlcCA9IGZpbGVwOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIE1FX0xPQ0tfQ0hFQ0s6CisJCWlmIChkbG9jay0+Y291bnQpIHsKKwkJCWVyciA9IE1FX0VSUk5PX1VTRUQ7CisJCX0gZWxzZSBpZiAoKGRsb2NrLT5maWxlcCAhPSBOVUxMKSAmJiAoZGxvY2stPmZpbGVwICE9IGZpbGVwKSkgeworCQkJZXJyID0gTUVfRVJSTk9fTE9DS0VEOworCQl9IGVsc2UgaWYgKGRsb2NrLT5maWxlcCA9PSBOVUxMKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgbWVfc2xpc3RfZ2V0X251bWJlcl9zdWJkZXZpY2VzKHNsaXN0KTsKKwkJCSAgICAgaSsrKSB7CisJCQkJc3ViZGV2aWNlID0gbWVfc2xpc3RfZ2V0X3N1YmRldmljZShzbGlzdCwgaSk7CisKKwkJCQlpZiAoc3ViZGV2aWNlKSB7CisJCQkJCWlmICgoZXJyID0KKwkJCQkJICAgICBzdWJkZXZpY2UtPgorCQkJCQkgICAgIG1lX3N1YmRldmljZV9sb2NrX3N1YmRldmljZQorCQkJCQkgICAgIChzdWJkZXZpY2UsIGZpbGVwLCBNRV9MT0NLX0NIRUNLLAorCQkJCQkgICAgICBmbGFncykpKSB7CisJCQkJCQlQRVJST1IKKwkJCQkJCSAgICAoIkEgc3ViZGV2aWNlIGlzIGxvY2tlZCBieSBhbm90aGVyIHByb2Nlc3MuXG4iKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJZXJyID0gTUVfRVJSTk9fSU5URVJOQUw7CisJCQkJfQorCQkJfQorCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlQRVJST1IoIkludmFsaWQgbG9jay5cbiIpOworCisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfTE9DSzsKKworCQlicmVhazsKKwl9CisKKwlzcGluX3VubG9jaygmZGxvY2stPnNwaW5fbG9jayk7CisKKwlyZXR1cm4gZXJyOworfQorCit2b2lkIG1lX2Rsb2NrX2RlaW5pdChzdHJ1Y3QgbWVfZGxvY2sgKmRsb2NrKQoreworCVBERUJVR19MT0NLUygiZXhlY3V0ZWQuXG4iKTsKK30KKworaW50IG1lX2Rsb2NrX2luaXQobWVfZGxvY2tfdCAqIGRsb2NrKQoreworCVBERUJVR19MT0NLUygiZXhlY3V0ZWQuXG4iKTsKKworCWRsb2NrLT5maWxlcCA9IE5VTEw7CisJZGxvY2stPmNvdW50ID0gMDsKKwlzcGluX2xvY2tfaW5pdCgmZGxvY2stPnNwaW5fbG9jayk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRsb2NrLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkbG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNmRkYzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkbG9jay5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qKgorICogQGZpbGUgbWVkbG9jay5oCisgKgorICogQGJyaWVmIFByb3ZpZGVzIHRoZSBkZXZpY2UgbG9jayBjbGFzcy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNiBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisjaWZuZGVmIF9NRURMT0NLX0hfCisjZGVmaW5lIF9NRURMT0NLX0hfCisKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgZGV2aWNlIGxvY2sgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lX2Rsb2NrIHsKKwlzdHJ1Y3QgZmlsZSAqZmlsZXA7CQkvKio8IFBvaW50ZXIgdG8gZmlsZSBzdHJ1Y3R1cmUgaG9sZGluZyB0aGUgZGV2aWNlLiAqLworCWludCBjb3VudDsJCQkJLyoqPCBOdW1iZXIgb2YgdGFza3Mgd2hpY2ggYXJlIGluc2lkZSB0aGUgZGV2aWNlLiAqLworCXNwaW5sb2NrX3Qgc3Bpbl9sb2NrOwkvKio8IFNwaW4gbG9jayBwcm90ZWN0aW5nIHRoZSBhdHRyaWJ1dGVzIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCit9IG1lX2Rsb2NrX3Q7CisKKy8qKgorICogQGJyaWVmIFRyaWVzIHRvIGVudGVyIGEgZGV2aWNlLgorICoKKyAqIEBwYXJhbSBkbG9jayBUaGUgZGV2aWNlIGxvY2sgaW5zdGFuY2UuCisgKiBAcGFyYW0gZmlsZXAgVGhlIGZpbGUgc3RydWN0dXJlIGlkZW50aWZ5aW5nIHRoZSBjYWxsaW5nIHByb2Nlc3MuCisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBtZV9kbG9ja19lbnRlcihzdHJ1Y3QgbWVfZGxvY2sgKmRsb2NrLCBzdHJ1Y3QgZmlsZSAqZmlsZXApOworCisvKioKKyAqIEBicmllZiBFeGl0cyBhIGRldmljZS4KKyAqCisgKiBAcGFyYW0gZGxvY2sgVGhlIGRldmljZSBsb2NrIGluc3RhbmNlLgorICogQHBhcmFtIGZpbGVwIFRoZSBmaWxlIHN0cnVjdHVyZSBpZGVudGlmeWluZyB0aGUgY2FsbGluZyBwcm9jZXNzLgorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLgorICovCitpbnQgbWVfZGxvY2tfZXhpdChzdHJ1Y3QgbWVfZGxvY2sgKmRsb2NrLCBzdHJ1Y3QgZmlsZSAqZmlsZXApOworCisvKioKKyAqIEBicmllZiBUcmllcyB0byBwZXJmb3JtIGEgbG9ja2luZyBhY3Rpb24gb24gYSBkZXZpY2UuCisgKgorICogQHBhcmFtIGRsb2NrIFRoZSBkZXZpY2UgbG9jayBpbnN0YW5jZS4KKyAqIEBwYXJhbSBmaWxlcCBUaGUgZmlsZSBzdHJ1Y3R1cmUgaWRlbnRpZnlpbmcgdGhlIGNhbGxpbmcgcHJvY2Vzcy4KKyAqIEBwYXJhbSBUaGUgYWN0aW9uIHRvIGJlIGRvbmUuCisgKiBAcGFyYW0gZmxhZ3MgRmxhZ3MgZnJvbSB1c2VyIHNwYWNlLgorICogQHBhcmFtIHNsaXN0IFRoZSBzdWJkZXZpY2UgbGlzdCBvZiB0aGUgZGV2aWNlLgorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLgorICovCitpbnQgbWVfZGxvY2tfbG9jayhzdHJ1Y3QgbWVfZGxvY2sgKmRsb2NrLAorCQkgIHN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGxvY2ssIGludCBmbGFncywgbWVfc2xpc3RfdCAqIHNsaXN0KTsKKworLyoqCisgKiBAYnJpZWYgSW5pdGlhbGl6ZXMgYSBsb2NrIHN0cnVjdHVyZS4KKyAqCisgKiBAcGFyYW0gZGxvY2sgVGhlIGxvY2sgc3RydWN0dXJlIHRvIGluaXRpYWxpemUuCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcy4KKyAqLworaW50IG1lX2Rsb2NrX2luaXQobWVfZGxvY2tfdCAqIGRsb2NrKTsKKworLyoqCisgKiBAYnJpZWYgRGVpbml0aWFsaXplcyBhIGxvY2sgc3RydWN0dXJlLgorICoKKyAqIEBwYXJhbSBkbG9jayBUaGUgbG9jayBzdHJ1Y3R1cmUgdG8gZGVpbml0aWFsaXplLgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MuCisgKi8KK3ZvaWQgbWVfZGxvY2tfZGVpbml0KG1lX2Rsb2NrX3QgKiBkbG9jayk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkcml2ZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRyaXZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZTI0MDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkcml2ZXIuaApAQCAtMCwwICsxLDM1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogU291cmNlIEZpbGUgOiBtZWRyaXZlci5oCisgKiBBdXRob3IgICAgICA6IEdHIChHdWVudGVyIEdlYmhhcmR0KSAgPGcuZ2ViaGFyZHRAbWVpbGhhdXMuZGU+CisgKiAgQXV0aG9yOglLcnp5c3p0b2YgR2FudHprZQk8ay5nYW50emtlQG1laWxoYXVzLmRlPgorICovCisKKyNpZm5kZWYgX01FRFJJVkVSX0hfCisjZGVmaW5lIF9NRURSSVZFUl9IXworCisjaW5jbHVkZSAibWV0eXBlcy5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisJLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkgIEZ1bmN0aW9ucyB0byBhY2Nlc3MgdGhlIGRyaXZlciBzeXN0ZW0KKwkgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisJaW50IG1lT3BlbihpbnQgaUZsYWdzKTsKKwlpbnQgbWVDbG9zZShpbnQgaUZsYWdzKTsKKworCWludCBtZUxvY2tEcml2ZXIoaW50IGlMb2NrLCBpbnQgaUZsYWdzKTsKKwlpbnQgbWVMb2NrRGV2aWNlKGludCBpRGV2aWNlLCBpbnQgaUxvY2ssIGludCBpRmxhZ3MpOworCWludCBtZUxvY2tTdWJkZXZpY2UoaW50IGlEZXZpY2UsIGludCBpU3ViZGV2aWNlLCBpbnQgaUxvY2ssIGludCBpRmxhZ3MpOworCisJLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkgIEVycm9yIGhhbmRsaW5nIGZ1bmN0aW9ucworCSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKwlpbnQgbWVFcnJvckdldExhc3RNZXNzYWdlKGNoYXIgKnBjRXJyb3JNc2csIGludCBpQ291bnQpOworCWludCBtZUVycm9yR2V0TWVzc2FnZShpbnQgaUVycm9yQ29kZSwgY2hhciAqcGNFcnJvck1zZywgaW50IGlDb3VudCk7CisJaW50IG1lRXJyb3JTZXREZWZhdWx0UHJvYyhpbnQgaVN3aXRjaCk7CisJaW50IG1lRXJyb3JTZXRVc2VyUHJvYyhtZUVycm9yQ0JfdCBwRXJyb3JQcm9jKTsKKworCisJLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkgIEZ1bmN0aW9ucyB0byBwZXJmb3JtIEkvTyBvbiBhIGRldmljZQorCSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKwlpbnQgbWVJT0lycVNldENhbGxiYWNrKAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZSwKKwkJCW1lSU9JcnFDQl90IHBDYWxsYmFjaywKKwkJCXZvaWQgKnBDYWxsYmFja0NvbnRleHQsCisJCQlpbnQgaUZsYWdzKTsKKwlpbnQgbWVJT0lycVN0YXJ0KAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZSwKKwkJCWludCBpQ2hhbm5lbCwKKwkJCWludCBpSXJxU291cmNlLAorCQkJaW50IGlJcnFFZGdlLAorCQkJaW50IGlJcnFBcmcsCisJCQlpbnQgaUZsYWdzKTsKKwlpbnQgbWVJT0lycVN0b3AoCisJCQlpbnQgaURldmljZSwKKwkJCWludCBpU3ViZGV2aWNlLAorCQkJaW50IGlDaGFubmVsLAorCQkJaW50IGlGbGFncyk7CisJaW50IG1lSU9JcnFXYWl0KAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZSwKKwkJCWludCBpQ2hhbm5lbCwKKwkJCWludCAqcGlJcnFDb3VudCwKKwkJCWludCAqcGlWYWx1ZSwKKwkJCWludCBpVGltZU91dCwKKwkJCWludCBpRmxhZ3MpOworCisJaW50IG1lSU9SZXNldERldmljZShpbnQgaURldmljZSwgaW50IGlGbGFncyk7CisJaW50IG1lSU9SZXNldFN1YmRldmljZShpbnQgaURldmljZSwgaW50IGlTdWJkZXZpY2UsIGludCBpRmxhZ3MpOworCisJaW50IG1lSU9TdHJlYW1GcmVxdWVuY3lUb1RpY2tzKAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZSwKKwkJCWludCBpVGltZXIsCisJCQlkb3VibGUgKnBkRnJlcXVlbmN5LAorCQkJaW50ICpwaVRpY2tzTG93LAorCQkJaW50ICpwaVRpY2tzSGlnaCwKKwkJCWludCBpRmxhZ3MpOworCisJaW50IG1lSU9TaW5nbGVDb25maWcoCisJCQlpbnQgaURldmljZSwKKwkJCWludCBpU3ViZGV2aWNlLAorCQkJaW50IGlDaGFubmVsLAorCQkJaW50IGlTaW5nbGVDb25maWcsCisJCQlpbnQgaVJlZiwKKwkJCWludCBpVHJpZ0NoYW4sCisJCQlpbnQgaVRyaWdUeXBlLAorCQkJaW50IGlUcmlnRWRnZSwKKwkJCWludCBpRmxhZ3MpOworCWludCBtZUlPU2luZ2xlKG1lSU9TaW5nbGVfdCAqcFNpbmdsZUxpc3QsIGludCBpQ291bnQsIGludCBpRmxhZ3MpOworCisJaW50IG1lSU9TdHJlYW1Db25maWcoCisJCQlpbnQgaURldmljZSwKKwkJCWludCBpU3ViZGV2aWNlLAorCQkJbWVJT1N0cmVhbUNvbmZpZ190ICpwQ29uZmlnTGlzdCwKKwkJCWludCBpQ291bnQsCisJCQltZUlPU3RyZWFtVHJpZ2dlcl90ICpwVHJpZ2dlciwKKwkJCWludCBpRmlmb0lycVRocmVzaG9sZCwKKwkJCWludCBpRmxhZ3MpOworCWludCBtZUlPU3RyZWFtTmV3VmFsdWVzKAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZSwKKwkJCWludCBpVGltZU91dCwKKwkJCWludCAqcGlDb3VudCwKKwkJCWludCBpRmxhZ3MpOworCWludCBtZUlPU3RyZWFtUmVhZCgKKwkJCWludCBpRGV2aWNlLAorCQkJaW50IGlTdWJkZXZpY2UsCisJCQlpbnQgaVJlYWRNb2RlLAorCQkJaW50ICpwaVZhbHVlcywKKwkJCWludCAqcGlDb3VudCwKKwkJCWludCBpRmxhZ3MpOworCWludCBtZUlPU3RyZWFtV3JpdGUoCisJCQlpbnQgaURldmljZSwKKwkJCWludCBpU3ViZGV2aWNlLAorCQkJaW50IGlXcml0ZU1vZGUsCisJCQlpbnQgKnBpVmFsdWVzLAorCQkJaW50ICpwaUNvdW50LAorCQkJaW50IGlGbGFncyk7CisJaW50IG1lSU9TdHJlYW1TdGFydChtZUlPU3RyZWFtU3RhcnRfdCAqcFN0YXJ0TGlzdCwgaW50IGlDb3VudCwgaW50IGlGbGFncyk7CisJaW50IG1lSU9TdHJlYW1TdG9wKG1lSU9TdHJlYW1TdG9wX3QgKnBTdG9wTGlzdCwgaW50IGlDb3VudCwgaW50IGlGbGFncyk7CisJaW50IG1lSU9TdHJlYW1TdGF0dXMoCisJCQlpbnQgaURldmljZSwKKwkJCWludCBpU3ViZGV2aWNlLAorCQkJaW50IGlXYWl0LAorCQkJaW50ICpwaVN0YXR1cywKKwkJCWludCAqcGlDb3VudCwKKwkJCWludCBpRmxhZ3MpOworCWludCBtZUlPU3RyZWFtU2V0Q2FsbGJhY2tzKAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZSwKKwkJCW1lSU9TdHJlYW1DQl90IHBTdGFydENCLAorCQkJdm9pZCAqcFN0YXJ0Q0JDb250ZXh0LAorCQkJbWVJT1N0cmVhbUNCX3QgcE5ld1ZhbHVlc0NCLAorCQkJdm9pZCAqcE5ld1ZhbHVlc0NCQ29udGV4dCwKKwkJCW1lSU9TdHJlYW1DQl90IHBFbmRDQiwKKwkJCXZvaWQgKnBFbmRDQkNvbnRleHQsCisJCQlpbnQgaUZsYWdzKTsKKwlpbnQgbWVJT1N0cmVhbVRpbWVUb1RpY2tzKAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZSwKKwkJCWludCBpVGltZXIsCisJCQlkb3VibGUgKnBkVGltZSwKKwkJCWludCAqcGlUaWNrc0xvdywKKwkJCWludCAqcGlUaWNrc0hpZ2gsCisJCQlpbnQgaUZsYWdzKTsKKworCisJLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkgIEZ1bmN0aW9ucyB0byBxdWVyeSB0aGUgZHJpdmVyIHN5c3RlbQorCSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKwlpbnQgbWVRdWVyeURlc2NyaXB0aW9uRGV2aWNlKGludCBpRGV2aWNlLCBjaGFyICpwY0Rlc2NyaXB0aW9uLCBpbnQgaUNvdW50KTsKKworCWludCBtZVF1ZXJ5SW5mb0RldmljZSgKKwkJCWludCBpRGV2aWNlLAorCQkJaW50ICpwaVZlbmRvcklkLAorCQkJaW50ICpwaURldmljZUlkLAorCQkJaW50ICpwaVNlcmlhbE5vLAorCQkJaW50ICpwaUJ1c1R5cGUsCisJCQlpbnQgKnBpQnVzTm8sCisJCQlpbnQgKnBpRGV2Tm8sCisJCQlpbnQgKnBpRnVuY05vLAorCQkJaW50ICpwaVBsdWdnZWQpOworCisJaW50IG1lUXVlcnlOYW1lRGV2aWNlKGludCBpRGV2aWNlLCBjaGFyICpwY05hbWUsIGludCBpQ291bnQpOworCWludCBtZVF1ZXJ5TmFtZURldmljZURyaXZlcihpbnQgaURldmljZSwgY2hhciAqcGNOYW1lLCBpbnQgaUNvdW50KTsKKworCWludCBtZVF1ZXJ5TnVtYmVyRGV2aWNlcyhpbnQgKnBpTnVtYmVyKTsKKwlpbnQgbWVRdWVyeU51bWJlclN1YmRldmljZXMoaW50IGlEZXZpY2UsIGludCAqcGlOdW1iZXIpOworCWludCBtZVF1ZXJ5TnVtYmVyQ2hhbm5lbHMoaW50IGlEZXZpY2UsIGludCBpU3ViZGV2aWNlLCBpbnQgKnBpTnVtYmVyKTsKKwlpbnQgbWVRdWVyeU51bWJlclJhbmdlcygKKwkJCWludCBpRGV2aWNlLAorCQkJaW50IGlTdWJkZXZpY2UsCisJCQlpbnQgaVVuaXQsCisJCQlpbnQgKnBpTnVtYmVyKTsKKworCWludCBtZVF1ZXJ5UmFuZ2VCeU1pbk1heCgKKwkJCWludCBpRGV2aWNlLAorCQkJaW50IGlTdWJkZXZpY2UsCisJCQlpbnQgaVVuaXQsCisJCQlkb3VibGUgKnBkTWluLAorCQkJZG91YmxlICpwZE1heCwKKwkJCWludCAqcGlNYXhEYXRhLAorCQkJaW50ICpwaVJhbmdlKTsKKwlpbnQgbWVRdWVyeVJhbmdlSW5mbygKKwkJCWludCBpRGV2aWNlLAorCQkJaW50IGlTdWJkZXZpY2UsCisJCQlpbnQgaVJhbmdlLAorCQkJaW50ICpwaVVuaXQsCisJCQlkb3VibGUgKnBkTWluLAorCQkJZG91YmxlICpwZE1heCwKKwkJCWludCAqcGlNYXhEYXRhKTsKKworCWludCBtZVF1ZXJ5U3ViZGV2aWNlQnlUeXBlKAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN0YXJ0U3ViZGV2aWNlLAorCQkJaW50IGlUeXBlLAorCQkJaW50IGlTdWJ0eXBlLAorCQkJaW50ICpwaVN1YmRldmljZSk7CisJaW50IG1lUXVlcnlTdWJkZXZpY2VUeXBlKAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZSwKKwkJCWludCAqcGlUeXBlLAorCQkJaW50ICpwaVN1YnR5cGUpOworCWludCBtZVF1ZXJ5U3ViZGV2aWNlQ2FwcygKKwkJCWludCBpRGV2aWNlLAorCQkJaW50IGlTdWJkZXZpY2UsCisJCQlpbnQgKnBpQ2Fwcyk7CisJaW50IG1lUXVlcnlTdWJkZXZpY2VDYXBzQXJncygKKwkJCWludCBpRGV2aWNlLAorCQkJaW50IGlTdWJkZXZpY2UsCisJCQlpbnQgaUNhcCwKKwkJCWludCAqcGlBcmdzLAorCQkJaW50IGlDb3VudCk7CisKKwlpbnQgbWVRdWVyeVZlcnNpb25MaWJyYXJ5KGludCAqcGlWZXJzaW9uKTsKKwlpbnQgbWVRdWVyeVZlcnNpb25NYWluRHJpdmVyKGludCAqcGlWZXJzaW9uKTsKKwlpbnQgbWVRdWVyeVZlcnNpb25EZXZpY2VEcml2ZXIoaW50IGlEZXZpY2UsIGludCAqcGlWZXJzaW9uKTsKKworCisJLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkgIENvbW1vbiB1dGlsaXR5IGZ1bmN0aW9ucworCSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKwlpbnQgbWVVdGlsaXR5RXh0cmFjdFZhbHVlcygKKwkJCWludCBpQ2hhbm5lbCwKKwkJCWludCAqcGlBSUJ1ZmZlciwKKwkJCWludCBpQUlCdWZmZXJDb3VudCwKKwkJCW1lSU9TdHJlYW1Db25maWdfdCAqcENvbmZpZ0xpc3QsCisJCQlpbnQgaUNvbmZpZ0xpc3RDb3VudCwKKwkJCWludCAqcGlDaGFuQnVmZmVyLAorCQkJaW50ICpwaUNoYW5CdWZmZXJDb3VudCk7CisJaW50IG1lVXRpbGl0eURpZ2l0YWxUb1BoeXNpY2FsKAorCQkJZG91YmxlIGRNaW4sCisJCQlkb3VibGUgZE1heCwKKwkJCWludCBpTWF4RGF0YSwKKwkJCWludCBpRGF0YSwKKwkJCWludCBpTW9kdWxlVHlwZSwKKwkJCWRvdWJsZSBkUmVmVmFsdWUsCisJCQlkb3VibGUgKnBkUGh5c2ljYWwpOworCWludCBtZVV0aWxpdHlEaWdpdGFsVG9QaHlzaWNhbFYoCisJCQlkb3VibGUgZE1pbiwKKwkJCWRvdWJsZSBkTWF4LAorCQkJaW50IGlNYXhEYXRhLAorCQkJaW50ICpwaURhdGFCdWZmZXIsCisJCQlpbnQgaUNvdW50LAorCQkJaW50IGlNb2R1bGVUeXBlLAorCQkJZG91YmxlIGRSZWZWYWx1ZSwKKwkJCWRvdWJsZSAqcGRQaHlzaWNhbEJ1ZmZlcik7CisJaW50IG1lVXRpbGl0eVBoeXNpY2FsVG9EaWdpdGFsKAorCQkJZG91YmxlIGRNaW4sCisJCQlkb3VibGUgZE1heCwKKwkJCWludCBpTWF4RGF0YSwKKwkJCWRvdWJsZSBkUGh5c2ljYWwsCisJCQlpbnQgKnBpRGF0YSk7CisJaW50IG1lVXRpbGl0eVBXTVN0YXJ0KAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZTEsCisJCQlpbnQgaVN1YmRldmljZTIsCisJCQlpbnQgaVN1YmRldmljZTMsCisJCQlpbnQgaVJlZiwKKwkJCWludCBpUHJlc2NhbGVyLAorCQkJaW50IGlEdXR5Q3ljbGUsCisJCQlpbnQgaUZsYWcpOworCWludCBtZVV0aWxpdHlQV01TdG9wKGludCBpRGV2aWNlLAorCQkJaW50IGlTdWJkZXZpY2UxKTsKKwlpbnQgbWVVdGlsaXR5UFdNUmVzdGFydCgKKwkJCWludCBpRGV2aWNlLAorCQkJaW50IGlTdWJkZXZpY2UxLAorCQkJaW50IGlSZWYsCisJCQlpbnQgaVByZXNjYWxlcik7CisKKworCS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJICBMb2FkIGNvbmZpZ3VyYXRpb24gZnJvbSBmaWxlIGludG8gZHJpdmVyIHN5c3RlbQorCSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKwlpbnQgbWVDb25maWdMb2FkKGNoYXIgKnBjQ29uZmlnRmlsZSk7CisKKworCS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJICBGdW5jdGlvbnMgdG8gcXVlcnkgYSByZW1vdGUgZHJpdmVyIHN5c3RlbQorCSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKwlpbnQgbWVSUXVlcnlEZXNjcmlwdGlvbkRldmljZSgKKwkJCWNoYXIgKmxvY2F0aW9uLAorCQkJaW50IGlEZXZpY2UsCisJCQljaGFyICpwY0Rlc2NyaXB0aW9uLAorCQkJaW50IGlDb3VudCk7CisKKwlpbnQgbWVSUXVlcnlJbmZvRGV2aWNlKAorCQkJY2hhciAqbG9jYXRpb24sCisJCQlpbnQgaURldmljZSwKKwkJCWludCAqcGlWZW5kb3JJZCwKKwkJCWludCAqcGlEZXZpY2VJZCwKKwkJCWludCAqcGlTZXJpYWxObywKKwkJCWludCAqcGlCdXNUeXBlLAorCQkJaW50ICpwaUJ1c05vLAorCQkJaW50ICpwaURldk5vLAorCQkJaW50ICpwaUZ1bmNObywKKwkJCWludCAqcGlQbHVnZ2VkKTsKKworCWludCBtZVJRdWVyeU5hbWVEZXZpY2UoCisJCQljaGFyICpsb2NhdGlvbiwKKwkJCWludCBpRGV2aWNlLAorCQkJY2hhciAqcGNOYW1lLAorCQkJaW50IGlDb3VudCk7CisKKwlpbnQgbWVSUXVlcnlOdW1iZXJEZXZpY2VzKGNoYXIgKmxvY2F0aW9uLCBpbnQgKnBpTnVtYmVyKTsKKwlpbnQgbWVSUXVlcnlOdW1iZXJTdWJkZXZpY2VzKGNoYXIgKmxvY2F0aW9uLCBpbnQgaURldmljZSwgaW50ICpwaU51bWJlcik7CisJaW50IG1lUlF1ZXJ5TnVtYmVyQ2hhbm5lbHMoCisJCQljaGFyICpsb2NhdGlvbiwKKwkJCWludCBpRGV2aWNlLAorCQkJaW50IGlTdWJkZXZpY2UsCisJCQlpbnQgKnBpTnVtYmVyKTsKKwlpbnQgbWVSUXVlcnlOdW1iZXJSYW5nZXMoCisJCQljaGFyICpsb2NhdGlvbiwKKwkJCWludCBpRGV2aWNlLAorCQkJaW50IGlTdWJkZXZpY2UsCisJCQlpbnQgaVVuaXQsCisJCQlpbnQgKnBpTnVtYmVyKTsKKworCWludCBtZVJRdWVyeVJhbmdlSW5mbygKKwkJCWNoYXIgKmxvY2F0aW9uLAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZSwKKwkJCWludCBpUmFuZ2UsCisJCQlpbnQgKnBpVW5pdCwKKwkJCWRvdWJsZSAqcGRNaW4sCisJCQlkb3VibGUgKnBkTWF4LAorCQkJaW50ICpwaU1heERhdGEpOworCisJaW50IG1lUlF1ZXJ5U3ViZGV2aWNlVHlwZSgKKwkJCWNoYXIgKmxvY2F0aW9uLAorCQkJaW50IGlEZXZpY2UsCisJCQlpbnQgaVN1YmRldmljZSwKKwkJCWludCAqcGlUeXBlLAorCQkJaW50ICpwaVN1YnR5cGUpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWR1bW15LmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkdW1teS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhOWYwOGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkdW1teS5jCkBAIC0wLDAgKzEsMTI2NiBAQAorLyogRGV2aWNlIGRyaXZlciBmb3IgTWVpbGhhdXMgTUUtRFVNTVkgZGV2aWNlcy4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDUgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqICAgIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKy8qCisgKiBVc2VyIGFwcGxpY2F0aW9uIGNvdWxkIGFsc28gaW5jbHVkZSB0aGUga2VybmVsIGhlYWRlciBmaWxlcy4gQnV0IHRoZQorICogcmVhbCBrZXJuZWwgZnVuY3Rpb25zIGFyZSBwcm90ZWN0ZWQgYnkgI2lmZGVmIF9fS0VSTkVMX18uCisgKi8KKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvKgorICogVGhpcyBtdXN0IGJlIGRlZmluZWQgYmVmb3JlIG1vZHVsZS5oIGlzIGluY2x1ZGVkLiBOb3QgbmVlZGVkLCB3aGVuCisgKiBpdCBpcyBhIGJ1aWx0IGluIGRyaXZlci4KKyAqLworI2lmbmRlZiBNT0RVTEUKKyMgIGRlZmluZSBNT0RVTEUKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAibWVlcnJvci5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKworI2luY2x1ZGUgIm1laWRzLmgiCisjaW5jbHVkZSAibWVjb21tb24uaCIKKyNpbmNsdWRlICJtZWRldmljZS5oIgorI2luY2x1ZGUgIm1lZGVidWcuaCIKKworI2luY2x1ZGUgIm1lZHVtbXkuaCIKKworc3RhdGljIGludCBtZWR1bW15X2lvX2lycV9zdGFydChtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCQlzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJaW50IHN1YmRldmljZSwKKwkJCQlpbnQgY2hhbm5lbCwKKwkJCQlpbnQgaXJxX3NvdXJjZSwKKwkJCQlpbnQgaXJxX2VkZ2UsIGludCBpcnFfYXJnLCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19ERVZJQ0VfVU5QTFVHR0VEOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfaW9faXJxX3dhaXQobWVfZGV2aWNlX3QgKiBkZXZpY2UsCisJCQkgICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJICAgICAgIGludCBzdWJkZXZpY2UsCisJCQkgICAgICAgaW50IGNoYW5uZWwsCisJCQkgICAgICAgaW50ICppcnFfY291bnQsCisJCQkgICAgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVvdXQsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9pb19pcnFfc3RvcChtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkgICAgICAgaW50IHN1YmRldmljZSwgaW50IGNoYW5uZWwsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9pb19yZXNldF9kZXZpY2UobWVfZGV2aWNlX3QgKiBkZXZpY2UsCisJCQkJICAgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19ERVZJQ0VfVU5QTFVHR0VEOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfaW9fcmVzZXRfc3ViZGV2aWNlKG1lX2RldmljZV90ICogZGV2aWNlLAorCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICBpbnQgc3ViZGV2aWNlLCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19ERVZJQ0VfVU5QTFVHR0VEOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfaW9fc2luZ2xlX2NvbmZpZyhtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgc3ViZGV2aWNlLAorCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgaW50IHNpbmdsZV9jb25maWcsCisJCQkJICAgIGludCByZWYsCisJCQkJICAgIGludCB0cmlnX2NoYW4sCisJCQkJICAgIGludCB0cmlnX3R5cGUsIGludCB0cmlnX2VkZ2UsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9pb19zaW5nbGVfcmVhZChtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCQkgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgIGludCBzdWJkZXZpY2UsCisJCQkJICBpbnQgY2hhbm5lbCwKKwkJCQkgIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fREVWSUNFX1VOUExVR0dFRDsKK30KKworc3RhdGljIGludCBtZWR1bW15X2lvX3NpbmdsZV93cml0ZShtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCQkgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgaW50IHN1YmRldmljZSwKKwkJCQkgICBpbnQgY2hhbm5lbCwKKwkJCQkgICBpbnQgdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fREVWSUNFX1VOUExVR0dFRDsKK30KKworc3RhdGljIGludCBtZWR1bW15X2lvX3N0cmVhbV9jb25maWcobWVfZGV2aWNlX3QgKiBkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgaW50IHN1YmRldmljZSwKKwkJCQkgICAgbWVJT1N0cmVhbUNvbmZpZ190ICogY29uZmlnX2xpc3QsCisJCQkJICAgIGludCBjb3VudCwKKwkJCQkgICAgbWVJT1N0cmVhbVRyaWdnZXJfdCAqIHRyaWdnZXIsCisJCQkJICAgIGludCBmaWZvX2lycV90aHJlc2hvbGQsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9pb19zdHJlYW1fbmV3X3ZhbHVlcyhtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCQkJc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCQlpbnQgc3ViZGV2aWNlLAorCQkJCQlpbnQgdGltZW91dCwgaW50ICpjb3VudCwgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fREVWSUNFX1VOUExVR0dFRDsKK30KKworc3RhdGljIGludCBtZWR1bW15X2lvX3N0cmVhbV9yZWFkKG1lX2RldmljZV90ICogZGV2aWNlLAorCQkJCSAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgaW50IHN1YmRldmljZSwKKwkJCQkgIGludCByZWFkX21vZGUsCisJCQkJICBpbnQgKnZhbHVlcywgaW50ICpjb3VudCwgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fREVWSUNFX1VOUExVR0dFRDsKK30KKworc3RhdGljIGludCBtZWR1bW15X2lvX3N0cmVhbV9zdGFydChtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCQkgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgaW50IHN1YmRldmljZSwKKwkJCQkgICBpbnQgc3RhcnRfbW9kZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19ERVZJQ0VfVU5QTFVHR0VEOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfaW9fc3RyZWFtX3N0YXR1cyhtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgICBpbnQgc3ViZGV2aWNlLAorCQkJCSAgICBpbnQgd2FpdCwKKwkJCQkgICAgaW50ICpzdGF0dXMsIGludCAqdmFsdWVzLCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19ERVZJQ0VfVU5QTFVHR0VEOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfaW9fc3RyZWFtX3N0b3AobWVfZGV2aWNlX3QgKiBkZXZpY2UsCisJCQkJICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICBpbnQgc3ViZGV2aWNlLCBpbnQgc3RvcF9tb2RlLCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19ERVZJQ0VfVU5QTFVHR0VEOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfaW9fc3RyZWFtX3dyaXRlKG1lX2RldmljZV90ICogZGV2aWNlLAorCQkJCSAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICBpbnQgc3ViZGV2aWNlLAorCQkJCSAgIGludCB3cml0ZV9tb2RlLAorCQkJCSAgIGludCAqdmFsdWVzLCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19ERVZJQ0VfVU5QTFVHR0VEOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfbG9ja19kZXZpY2UobWVfZGV2aWNlX3QgKiBkZXZpY2UsCisJCQkgICAgICAgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgbG9jaywgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fREVWSUNFX1VOUExVR0dFRDsKK30KKworc3RhdGljIGludCBtZWR1bW15X2xvY2tfc3ViZGV2aWNlKG1lX2RldmljZV90ICogZGV2aWNlLAorCQkJCSAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgaW50IHN1YmRldmljZSwgaW50IGxvY2ssIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9xdWVyeV9kZXNjcmlwdGlvbl9kZXZpY2UobWVfZGV2aWNlX3QgKiBkZXZpY2UsCisJCQkJCSAgICBjaGFyICoqZGVzY3JpcHRpb24pCit7CisJbWVkdW1teV9kZXZpY2VfdCAqaW5zdGFuY2UgPSAobWVkdW1teV9kZXZpY2VfdCAqKSBkZXZpY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKy8vICAgICAgaWYgKGluc3RhbmNlLT5tYWdpYyAhPSBNRURVTU1ZX01BR0lDX05VTUJFUikKKy8vICAgICAgeworLy8gICAgICAgICAgICAgIFBFUlJPUigiV3JvbmcgbWFnaWMgbnVtYmVyLlxuIik7CisvLyAgICAgICAgICAgICAgcmV0dXJuIE1FX0VSUk5PX0lOVEVSTkFMOworLy8gICAgICB9CisKKwlzd2l0Y2ggKGluc3RhbmNlLT5kZXZpY2VfaWQpIHsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTEwMDA6CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxMDAwX0E6CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxMDAwX0I6CisJCSpkZXNjcmlwdGlvbiA9IE1FMTAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxMDAwOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwMDoKKwkJKmRlc2NyaXB0aW9uID0gTUUxNDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE0MDA7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBBOgorCQkqZGVzY3JpcHRpb24gPSBNRTE0MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTQwMEE7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBCOgorCQkqZGVzY3JpcHRpb24gPSBNRTE0MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTQwMEI7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNEUwOgorCQkqZGVzY3JpcHRpb24gPSBNRTE0MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTQwMEU7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNEVBOgorCQkqZGVzY3JpcHRpb24gPSBNRTE0MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTQwMEVBOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFQjoKKwkJKmRlc2NyaXB0aW9uID0gTUUxNDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE0MDBFQjsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEM6CisJCSpkZXNjcmlwdGlvbiA9IE1FMTQwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNDAwQzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEQ6CisJCSpkZXNjcmlwdGlvbiA9IE1FMTQwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNDAwRDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfNFU6CisJCSpkZXNjcmlwdGlvbiA9IE1FMTYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNjAwNFU7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNjAwXzhVOgorCQkqZGVzY3JpcHRpb24gPSBNRTE2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTYwMDhVOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF8xMlU6CisJCSpkZXNjcmlwdGlvbiA9IE1FMTYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNjAwMTJVOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF8xNlU6CisJCSpkZXNjcmlwdGlvbiA9IE1FMTYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNjAwMTZVOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF8xNlVfOEk6CisJCSpkZXNjcmlwdGlvbiA9IE1FMTYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNjAwMTZVOEk7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjEwOgorCQkqZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDYxMDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NTA6CisJCSpkZXNjcmlwdGlvbiA9IE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjUwOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MDoKKwkJKmRlc2NyaXB0aW9uID0gTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2NjA7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwSToKKwkJKmRlc2NyaXB0aW9uID0gTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2NjBJOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MFM6CisJCSpkZXNjcmlwdGlvbiA9IE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjYwUzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjBJUzoKKwkJKmRlc2NyaXB0aW9uID0gTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2NjBJUzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzA6CisJCSpkZXNjcmlwdGlvbiA9IE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjcwOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MEk6CisJCSpkZXNjcmlwdGlvbiA9IE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjcwSTsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBTOgorCQkqZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY3MFM7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwSVM6CisJCSpkZXNjcmlwdGlvbiA9IE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjcwSVM7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwOgorCQkqZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY4MDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBJOgorCQkqZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY4MEk7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwUzoKKwkJKmRlc2NyaXB0aW9uID0gTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2ODBTOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY4MElTOgorCQkqZGVzY3JpcHRpb24gPSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY4MElTOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAwNDoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDA0OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAwODoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDA4OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAwRjoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDAxNjsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMTQ6CisJCSpkZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSTQ7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDE4OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMEk4OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAxRjoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJMTY7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDM0OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMElTTEU0OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAzODoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJU0xFODsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwM0Y6CisJCSpkZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSVNMRTE2OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEwNDoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDA0OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEwODoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDA4OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEwRjoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDAxNjsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMTQ6CisJCSpkZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSTQ7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTE4OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMEk4OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjExRjoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJMTY7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTM0OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMElTTEU0OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEzODoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJU0xFODsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxM0Y6CisJCSpkZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSVNMRTE2OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA0NDoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDA0RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA0ODoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDA4RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA0RjoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDAxNkRJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNTQ6CisJCSpkZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSTRESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDU4OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMEk4RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA1RjoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJMTZESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDc0OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMElTTEU0RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA3ODoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJU0xFOERJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwN0Y6CisJCSpkZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSVNMRTE2RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE0NDoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDA0RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE0ODoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDA4RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE0RjoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDAxNkRJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNTQ6CisJCSpkZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSTRESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTU4OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMEk4RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE1RjoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJMTZESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTc0OgorCQkqZGVzY3JpcHRpb24gPSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMElTTEU0RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE3ODoKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJU0xFOERJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxN0Y6CisJCSpkZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSVNMRTE2RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjI1OToKKwkJKmRlc2NyaXB0aW9uID0gTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYyMDBJOURJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYzNTk6CisJCSpkZXNjcmlwdGlvbiA9IE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MzAwSTlESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUwNjMwOgorCQkqZGVzY3JpcHRpb24gPSBNRTA2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMDYzMDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTgxMDBfQToKKwkJKmRlc2NyaXB0aW9uID0gTUU4MTAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTgxMDBBOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODEwMF9COgorCQkqZGVzY3JpcHRpb24gPSBNRTgxMDBfREVTQ1JJUFRJT05fREVWSUNFX01FODEwMEI7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUwOTQwOgorCQkqZGVzY3JpcHRpb24gPSBNRTA5MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMDk0MDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA5NTA6CisJCSpkZXNjcmlwdGlvbiA9IE1FMDkwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUwOTUwOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMDk2MDoKKwkJKmRlc2NyaXB0aW9uID0gTUUwOTAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTA5NjA7CisKKwkJYnJlYWs7CisvKgorCQljYXNlIFVTQl9ERVZJQ0VfSURfTUVQSElTVE9fUzE6CisJCQkqZGVzY3JpcHRpb24gPSBNRVBISVNUT19TMV9ERVNDUklQVElPTl9ERVZJQ0U7CisKKwkJCWJyZWFrOworKi8KKwlkZWZhdWx0OgorCQkqZGVzY3JpcHRpb24gPSBFTVBUWV9ERVNDUklQVElPTl9ERVZJQ0U7CisJCVBFUlJPUigiSW52YWxpZCBkZXZpY2UgaWQgaW4gZGV2aWNlIGluZm8uXG4iKTsKKworCQlyZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisJfQorCisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9xdWVyeV9pbmZvX2RldmljZShtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCQkgICAgIGludCAqdmVuZG9yX2lkLAorCQkJCSAgICAgaW50ICpkZXZpY2VfaWQsCisJCQkJICAgICBpbnQgKnNlcmlhbF9ubywKKwkJCQkgICAgIGludCAqYnVzX3R5cGUsCisJCQkJICAgICBpbnQgKmJ1c19ubywKKwkJCQkgICAgIGludCAqZGV2X25vLCBpbnQgKmZ1bmNfbm8sIGludCAqcGx1Z2dlZCkKK3sKKwltZWR1bW15X2RldmljZV90ICppbnN0YW5jZSA9IChtZWR1bW15X2RldmljZV90ICopIGRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworLy8gICAgICBpZiAoaW5zdGFuY2UtPm1hZ2ljICE9IE1FRFVNTVlfTUFHSUNfTlVNQkVSKQorLy8gICAgICB7CisvLyAgICAgICAgICAgICAgUEVSUk9SKCJXcm9uZyBtYWdpYyBudW1iZXIuXG4iKTsKKy8vICAgICAgICAgICAgICByZXR1cm4gTUVfRVJSTk9fSU5URVJOQUw7CisvLyAgICAgIH0KKworCSp2ZW5kb3JfaWQgPSBpbnN0YW5jZS0+dmVuZG9yX2lkOworCSpkZXZpY2VfaWQgPSBpbnN0YW5jZS0+ZGV2aWNlX2lkOworCSpzZXJpYWxfbm8gPSBpbnN0YW5jZS0+c2VyaWFsX25vOworCSpidXNfdHlwZSA9IGluc3RhbmNlLT5idXNfdHlwZTsKKwkqYnVzX25vID0gaW5zdGFuY2UtPmJ1c19ubzsKKwkqZGV2X25vID0gaW5zdGFuY2UtPmRldl9ubzsKKwkqZnVuY19ubyA9IGluc3RhbmNlLT5mdW5jX25vOworCSpwbHVnZ2VkID0gTUVfUExVR0dFRF9PVVQ7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZWR1bW15X3F1ZXJ5X25hbWVfZGV2aWNlX2RyaXZlcihtZV9kZXZpY2VfdCAqIGRldmljZSwgY2hhciAqKm5hbWUpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCSpuYW1lID0gTUVEVU1NWV9OQU1FX0RSSVZFUjsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZWR1bW15X3F1ZXJ5X25hbWVfZGV2aWNlKG1lX2RldmljZV90ICogZGV2aWNlLCBjaGFyICoqbmFtZSkKK3sKKwltZWR1bW15X2RldmljZV90ICppbnN0YW5jZSA9IChtZWR1bW15X2RldmljZV90ICopIGRldmljZTsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworLy8gLy8gLy8gICAgICAgIGlmIChpbnN0YW5jZS0+bWFnaWMgIT0gTUVEVU1NWV9NQUdJQ19OVU1CRVIpCisvLyAvLyAvLyAgICAgICAgeworLy8gLy8gLy8gICAgICAgICAgICAgICAgUEVSUk9SKCJXcm9uZyBtYWdpYyBudW1iZXIuXG4iKTsKKy8vIC8vIC8vICAgICAgICAgICAgICAgIHJldHVybiBNRV9FUlJOT19JTlRFUk5BTDsKKy8vIC8vIC8vICAgICAgICB9CisKKwlzd2l0Y2ggKGluc3RhbmNlLT5kZXZpY2VfaWQpIHsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTEwMDA6CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxMDAwX0E6CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxMDAwX0I6CisJCSpuYW1lID0gTUUxMDAwX05BTUVfREVWSUNFX01FMTAwMDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MDA6CisJCSpuYW1lID0gTUUxNDAwX05BTUVfREVWSUNFX01FMTQwMDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEE6CisJCSpuYW1lID0gTUUxNDAwX05BTUVfREVWSUNFX01FMTQwMEE7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBCOgorCQkqbmFtZSA9IE1FMTQwMF9OQU1FX0RFVklDRV9NRTE0MDBCOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFMDoKKwkJKm5hbWUgPSBNRTE0MDBfTkFNRV9ERVZJQ0VfTUUxNDAwRTsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RUE6CisJCSpuYW1lID0gTUUxNDAwX05BTUVfREVWSUNFX01FMTQwMEVBOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFQjoKKwkJKm5hbWUgPSBNRTE0MDBfTkFNRV9ERVZJQ0VfTUUxNDAwRUI7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBDOgorCQkqbmFtZSA9IE1FMTQwMF9OQU1FX0RFVklDRV9NRTE0MDBDOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwRDoKKwkJKm5hbWUgPSBNRTE0MDBfTkFNRV9ERVZJQ0VfTUUxNDAwRDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfNFU6CisJCSpuYW1lID0gTUUxNjAwX05BTUVfREVWSUNFX01FMTYwMDRVOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF84VToKKwkJKm5hbWUgPSBNRTE2MDBfTkFNRV9ERVZJQ0VfTUUxNjAwOFU7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNjAwXzEyVToKKwkJKm5hbWUgPSBNRTE2MDBfTkFNRV9ERVZJQ0VfTUUxNjAwMTJVOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF8xNlU6CisJCSpuYW1lID0gTUUxNjAwX05BTUVfREVWSUNFX01FMTYwMDE2VTsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfMTZVXzhJOgorCQkqbmFtZSA9IE1FMTYwMF9OQU1FX0RFVklDRV9NRTE2MDAxNlU4STsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2MTA6CisJCSpuYW1lID0gTUU0NjAwX05BTUVfREVWSUNFX01FNDYxMDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NTA6CisJCSpuYW1lID0gTUU0NjAwX05BTUVfREVWSUNFX01FNDY1MDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjA6CisJCSpuYW1lID0gTUU0NjAwX05BTUVfREVWSUNFX01FNDY2MDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjBJOgorCQkqbmFtZSA9IE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2NjBJOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MDoKKwkJKm5hbWUgPSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjcwOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MEk6CisJCSpuYW1lID0gTUU0NjAwX05BTUVfREVWSUNFX01FNDY3MEk7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwUzoKKwkJKm5hbWUgPSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjcwUzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBJUzoKKwkJKm5hbWUgPSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjcwSVM7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwOgorCQkqbmFtZSA9IE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2ODA7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwSToKKwkJKm5hbWUgPSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjgwSTsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBTOgorCQkqbmFtZSA9IE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2ODBTOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY4MElTOgorCQkqbmFtZSA9IE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2ODBJUzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMDQ6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMDQ7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDA4OgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDA4OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAwRjoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwMTY7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDE0OgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJNDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMTg6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMEk4OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAxRjoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSTE2OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAzNDoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSVNMRTQ7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDM4OgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJU0xFODsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwM0Y6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMElTTEUxNjsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMDQ6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMDQ7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTA4OgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDA4OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEwRjoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwMTY7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTE0OgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJNDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMTg6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMEk4OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjExRjoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSTE2OworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEzNDoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSVNMRTQ7CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTM4OgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJU0xFODsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxM0Y6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMElTTEUxNjsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNDQ6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMDRESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDQ4OgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDA4RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA0RjoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwMTZESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDU0OgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJNERJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNTg6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMEk4RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA1RjoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSTE2RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA3NDoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSVNMRTRESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDc4OgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJU0xFOERJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwN0Y6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMElTTEUxNkRJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNDQ6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMDRESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTQ4OgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDA4RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE0RjoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwMTZESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTU0OgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJNERJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNTg6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMEk4RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE1RjoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSTE2RElPOworCisJCWJyZWFrOworCisJY2FzZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE3NDoKKwkJKm5hbWUgPSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSVNMRTRESU87CisKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTc4OgorCQkqbmFtZSA9IE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJU0xFOERJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxN0Y6CisJCSpuYW1lID0gTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMElTTEUxNkRJTzsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA2MzA6CisJCSpuYW1lID0gTUUwNjAwX05BTUVfREVWSUNFX01FMDYzMDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTgxMDBfQToKKwkJKm5hbWUgPSBNRTgxMDBfTkFNRV9ERVZJQ0VfTUU4MTAwQTsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTgxMDBfQjoKKwkJKm5hbWUgPSBNRTgxMDBfTkFNRV9ERVZJQ0VfTUU4MTAwQjsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA5NDA6CisJCSpuYW1lID0gTUUwOTAwX05BTUVfREVWSUNFX01FMDk0MDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA5NTA6CisJCSpuYW1lID0gTUUwOTAwX05BTUVfREVWSUNFX01FMDk1MDsKKworCQlicmVhazsKKworCWNhc2UgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA5NjA6CisJCSpuYW1lID0gTUUwOTAwX05BTUVfREVWSUNFX01FMDk2MDsKKworCQlicmVhazsKKy8qCisJCWNhc2UgVVNCX0RFVklDRV9JRF9NRVBISVNUT19TMToKKwkJCSpuYW1lID0gTUVQSElTVE9fUzFfTkFNRV9ERVZJQ0U7CisKKwkJCWJyZWFrOworKi8KKwlkZWZhdWx0OgorCQkqbmFtZSA9IEVNUFRZX05BTUVfREVWSUNFOworCQlQRVJST1IoIkludmFsaWQgUENJIGRldmljZSBpZC5cbiIpOworCisJCXJldHVybiBNRV9FUlJOT19JTlRFUk5BTDsKKwl9CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZWR1bW15X3F1ZXJ5X251bWJlcl9zdWJkZXZpY2VzKG1lX2RldmljZV90ICogZGV2aWNlLCBpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9xdWVyeV9udW1iZXJfY2hhbm5lbHMobWVfZGV2aWNlX3QgKiBkZXZpY2UsCisJCQkJCSBpbnQgc3ViZGV2aWNlLCBpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9xdWVyeV9udW1iZXJfcmFuZ2VzKG1lX2RldmljZV90ICogZGV2aWNlLAorCQkJCSAgICAgICBpbnQgc3ViZGV2aWNlLCBpbnQgdW5pdCwgaW50ICpjb3VudCkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9xdWVyeV9zdWJkZXZpY2VfdHlwZShtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCQkJaW50IHN1YmRldmljZSwgaW50ICp0eXBlLCBpbnQgKnN1YnR5cGUpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19ERVZJQ0VfVU5QTFVHR0VEOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfcXVlcnlfc3ViZGV2aWNlX2NhcHMobWVfZGV2aWNlX3QgKiBkZXZpY2UsCisJCQkJCWludCBzdWJkZXZpY2UsIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzKG1lX2RldmljZV90ICogZGV2aWNlLAorCQkJCQkgICAgIGludCBzdWJkZXZpY2UsCisJCQkJCSAgICAgaW50IGNhcCwgaW50ICphcmdzLCBpbnQgY291bnQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfcXVlcnlfc3ViZGV2aWNlX2J5X3R5cGUobWVfZGV2aWNlX3QgKiBkZXZpY2UsCisJCQkJCSAgIGludCBzdGFydF9zdWJkZXZpY2UsCisJCQkJCSAgIGludCB0eXBlLAorCQkJCQkgICBpbnQgc3VidHlwZSwgaW50ICpzdWJkZXZpY2UpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19ERVZJQ0VfVU5QTFVHR0VEOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfcXVlcnlfcmFuZ2VfYnlfbWluX21heChtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCQkJICBpbnQgc3ViZGV2aWNlLAorCQkJCQkgIGludCB1bml0LAorCQkJCQkgIGludCAqbWluLAorCQkJCQkgIGludCAqbWF4LCBpbnQgKm1heGRhdGEsIGludCAqcmFuZ2UpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19ERVZJQ0VfVU5QTFVHR0VEOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfcXVlcnlfcmFuZ2VfaW5mbyhtZV9kZXZpY2VfdCAqIGRldmljZSwKKwkJCQkgICAgaW50IHN1YmRldmljZSwKKwkJCQkgICAgaW50IHJhbmdlLAorCQkJCSAgICBpbnQgKnVuaXQsIGludCAqbWluLCBpbnQgKm1heCwgaW50ICptYXhkYXRhKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fREVWSUNFX1VOUExVR0dFRDsKK30KKworaW50IG1lZHVtbXlfcXVlcnlfdGltZXIobWVfZGV2aWNlX3QgKiBkZXZpY2UsCisJCQlpbnQgc3ViZGV2aWNlLAorCQkJaW50IHRpbWVyLAorCQkJaW50ICpiYXNlX2ZyZXF1ZW5jeSwKKwkJCXVpbnQ2NF90ICogbWluX3RpY2tzLCB1aW50NjRfdCAqIG1heF90aWNrcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX0RFVklDRV9VTlBMVUdHRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkdW1teV9xdWVyeV92ZXJzaW9uX2RldmljZV9kcml2ZXIobWVfZGV2aWNlX3QgKiBkZXZpY2UsCisJCQkJCSAgICAgICBpbnQgKnZlcnNpb24pCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJKnZlcnNpb24gPSBNRV9WRVJTSU9OX0RSSVZFUjsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgbWVkdW1teV9kZXN0cnVjdG9yKG1lX2RldmljZV90ICogZGV2aWNlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlrZnJlZShkZXZpY2UpOworfQorCitzdGF0aWMgaW50IGluaXRfZGV2aWNlX2luZm8odW5zaWduZWQgc2hvcnQgdmVuZG9yX2lkLAorCQkJICAgIHVuc2lnbmVkIHNob3J0IGRldmljZV9pZCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgc2VyaWFsX25vLAorCQkJICAgIGludCBidXNfdHlwZSwKKwkJCSAgICBpbnQgYnVzX25vLAorCQkJICAgIGludCBkZXZfbm8sCisJCQkgICAgaW50IGZ1bmNfbm8sIG1lZHVtbXlfZGV2aWNlX3QgKiBpbnN0YW5jZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKy8vICAgICAgaW5zdGFuY2UtPm1hZ2ljID0gTUVEVU1NWV9NQUdJQ19OVU1CRVI7CisJaW5zdGFuY2UtPnZlbmRvcl9pZCA9IHZlbmRvcl9pZDsKKwlpbnN0YW5jZS0+ZGV2aWNlX2lkID0gZGV2aWNlX2lkOworCWluc3RhbmNlLT5zZXJpYWxfbm8gPSBzZXJpYWxfbm87CisJaW5zdGFuY2UtPmJ1c190eXBlID0gYnVzX3R5cGU7CisJaW5zdGFuY2UtPmJ1c19ubyA9IGJ1c19ubzsKKwlpbnN0YW5jZS0+ZGV2X25vID0gZGV2X25vOworCWluc3RhbmNlLT5mdW5jX25vID0gZnVuY19ubzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1lZHVtbXlfY29uZmlnX2xvYWQobWVfZGV2aWNlX3QgKiBkZXZpY2UsIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCSAgICAgICBtZV9jZmdfZGV2aWNlX2VudHJ5X3QgKiBjb25maWcpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IGluaXRfZGV2aWNlX2luc3RhbmNlKG1lX2RldmljZV90ICogZGV2aWNlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCUlOSVRfTElTVF9IRUFEKCZkZXZpY2UtPmxpc3QpOworCisJZGV2aWNlLT5tZV9kZXZpY2VfaW9faXJxX3N0YXJ0ID0gbWVkdW1teV9pb19pcnFfc3RhcnQ7CisJZGV2aWNlLT5tZV9kZXZpY2VfaW9faXJxX3dhaXQgPSBtZWR1bW15X2lvX2lycV93YWl0OworCWRldmljZS0+bWVfZGV2aWNlX2lvX2lycV9zdG9wID0gbWVkdW1teV9pb19pcnFfc3RvcDsKKwlkZXZpY2UtPm1lX2RldmljZV9pb19yZXNldF9kZXZpY2UgPSBtZWR1bW15X2lvX3Jlc2V0X2RldmljZTsKKwlkZXZpY2UtPm1lX2RldmljZV9pb19yZXNldF9zdWJkZXZpY2UgPSBtZWR1bW15X2lvX3Jlc2V0X3N1YmRldmljZTsKKwlkZXZpY2UtPm1lX2RldmljZV9pb19zaW5nbGVfY29uZmlnID0gbWVkdW1teV9pb19zaW5nbGVfY29uZmlnOworCWRldmljZS0+bWVfZGV2aWNlX2lvX3NpbmdsZV9yZWFkID0gbWVkdW1teV9pb19zaW5nbGVfcmVhZDsKKwlkZXZpY2UtPm1lX2RldmljZV9pb19zaW5nbGVfd3JpdGUgPSBtZWR1bW15X2lvX3NpbmdsZV93cml0ZTsKKwlkZXZpY2UtPm1lX2RldmljZV9pb19zdHJlYW1fY29uZmlnID0gbWVkdW1teV9pb19zdHJlYW1fY29uZmlnOworCWRldmljZS0+bWVfZGV2aWNlX2lvX3N0cmVhbV9uZXdfdmFsdWVzID0gbWVkdW1teV9pb19zdHJlYW1fbmV3X3ZhbHVlczsKKwlkZXZpY2UtPm1lX2RldmljZV9pb19zdHJlYW1fcmVhZCA9IG1lZHVtbXlfaW9fc3RyZWFtX3JlYWQ7CisJZGV2aWNlLT5tZV9kZXZpY2VfaW9fc3RyZWFtX3N0YXJ0ID0gbWVkdW1teV9pb19zdHJlYW1fc3RhcnQ7CisJZGV2aWNlLT5tZV9kZXZpY2VfaW9fc3RyZWFtX3N0YXR1cyA9IG1lZHVtbXlfaW9fc3RyZWFtX3N0YXR1czsKKwlkZXZpY2UtPm1lX2RldmljZV9pb19zdHJlYW1fc3RvcCA9IG1lZHVtbXlfaW9fc3RyZWFtX3N0b3A7CisJZGV2aWNlLT5tZV9kZXZpY2VfaW9fc3RyZWFtX3dyaXRlID0gbWVkdW1teV9pb19zdHJlYW1fd3JpdGU7CisKKwlkZXZpY2UtPm1lX2RldmljZV9sb2NrX2RldmljZSA9IG1lZHVtbXlfbG9ja19kZXZpY2U7CisJZGV2aWNlLT5tZV9kZXZpY2VfbG9ja19zdWJkZXZpY2UgPSBtZWR1bW15X2xvY2tfc3ViZGV2aWNlOworCisJZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfZGVzY3JpcHRpb25fZGV2aWNlID0KKwkgICAgbWVkdW1teV9xdWVyeV9kZXNjcmlwdGlvbl9kZXZpY2U7CisJZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfaW5mb19kZXZpY2UgPSBtZWR1bW15X3F1ZXJ5X2luZm9fZGV2aWNlOworCWRldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X25hbWVfZGV2aWNlX2RyaXZlciA9CisJICAgIG1lZHVtbXlfcXVlcnlfbmFtZV9kZXZpY2VfZHJpdmVyOworCWRldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X25hbWVfZGV2aWNlID0gbWVkdW1teV9xdWVyeV9uYW1lX2RldmljZTsKKworCWRldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X251bWJlcl9zdWJkZXZpY2VzID0KKwkgICAgbWVkdW1teV9xdWVyeV9udW1iZXJfc3ViZGV2aWNlczsKKwlkZXZpY2UtPm1lX2RldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMgPSBtZWR1bW15X3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlkZXZpY2UtPm1lX2RldmljZV9xdWVyeV9udW1iZXJfcmFuZ2VzID0gbWVkdW1teV9xdWVyeV9udW1iZXJfcmFuZ2VzOworCisJZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfcmFuZ2VfYnlfbWluX21heCA9CisJICAgIG1lZHVtbXlfcXVlcnlfcmFuZ2VfYnlfbWluX21heDsKKwlkZXZpY2UtPm1lX2RldmljZV9xdWVyeV9yYW5nZV9pbmZvID0gbWVkdW1teV9xdWVyeV9yYW5nZV9pbmZvOworCisJZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGUgPSBtZWR1bW15X3F1ZXJ5X3N1YmRldmljZV90eXBlOworCWRldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9ieV90eXBlID0KKwkgICAgbWVkdW1teV9xdWVyeV9zdWJkZXZpY2VfYnlfdHlwZTsKKwlkZXZpY2UtPm1lX2RldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyA9IG1lZHVtbXlfcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisJZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncyA9CisJICAgIG1lZHVtbXlfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJnczsKKworCWRldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X3RpbWVyID0gbWVkdW1teV9xdWVyeV90aW1lcjsKKworCWRldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X3ZlcnNpb25fZGV2aWNlX2RyaXZlciA9CisJICAgIG1lZHVtbXlfcXVlcnlfdmVyc2lvbl9kZXZpY2VfZHJpdmVyOworCisJZGV2aWNlLT5tZV9kZXZpY2VfZGVzdHJ1Y3RvciA9IG1lZHVtbXlfZGVzdHJ1Y3RvcjsKKwlkZXZpY2UtPm1lX2RldmljZV9jb25maWdfbG9hZCA9IG1lZHVtbXlfY29uZmlnX2xvYWQ7CisJcmV0dXJuIDA7Cit9CisKK21lX2RldmljZV90ICptZWR1bW15X2NvbnN0cnVjdG9yKHVuc2lnbmVkIHNob3J0IHZlbmRvcl9pZCwKKwkJCQkgdW5zaWduZWQgc2hvcnQgZGV2aWNlX2lkLAorCQkJCSB1bnNpZ25lZCBpbnQgc2VyaWFsX25vLAorCQkJCSBpbnQgYnVzX3R5cGUsCisJCQkJIGludCBidXNfbm8sIGludCBkZXZfbm8sIGludCBmdW5jX25vKQoreworCWludCByZXN1bHQgPSAwOworCW1lZHVtbXlfZGV2aWNlX3QgKmluc3RhbmNlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLyogQWxsb2NhdGUgc3RydWN0dXJlIGZvciBkZXZpY2UgYXR0cmlidXRlcyAqLworCWluc3RhbmNlID0ga21hbGxvYyhzaXplb2YobWVkdW1teV9kZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFpbnN0YW5jZSkgeworCQlQRVJST1IoIkNhbid0IGdldCBtZW1vcnkgZm9yIGRldmljZSBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoaW5zdGFuY2UsIDAsIHNpemVvZihtZWR1bW15X2RldmljZV90KSk7CisKKwkvKiBJbml0aWFsaXplIGRldmljZSBpbmZvICovCisJcmVzdWx0ID0gaW5pdF9kZXZpY2VfaW5mbyh2ZW5kb3JfaWQsCisJCQkJICBkZXZpY2VfaWQsCisJCQkJICBzZXJpYWxfbm8sCisJCQkJICBidXNfdHlwZSwgYnVzX25vLCBkZXZfbm8sIGZ1bmNfbm8sIGluc3RhbmNlKTsKKworCWlmIChyZXN1bHQpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdCBiYW9yZCBpbmZvLlxuIik7CisJCWtmcmVlKGluc3RhbmNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogSW5pdGlhbGl6ZSBkZXZpY2UgaW5zdGFuY2UgKi8KKwlyZXN1bHQgPSBpbml0X2RldmljZV9pbnN0YW5jZSgobWVfZGV2aWNlX3QgKikgaW5zdGFuY2UpOworCisJaWYgKHJlc3VsdCkgeworCQlQRVJST1IoIkNhbm5vdCBpbml0IGJhb3JkIGluZm8uXG4iKTsKKwkJa2ZyZWUoaW5zdGFuY2UpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gKG1lX2RldmljZV90ICopIGluc3RhbmNlOworfQorCisvLyBJbml0IGFuZCBleGl0IG9mIG1vZHVsZS4KKworc3RhdGljIGludCBfX2luaXQgZHVtbXlfaW5pdCh2b2lkKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGR1bW15X2V4aXQodm9pZCkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7Cit9CisKK21vZHVsZV9pbml0KGR1bW15X2luaXQpOworCittb2R1bGVfZXhpdChkdW1teV9leGl0KTsKKworLy8gQWRtaW5pc3RyYXRpdmUgc3R1ZmYgZm9yIG1vZGluZm8uCitNT0RVTEVfQVVUSE9SKCJHdWVudGVyIEdlYmhhcmR0IDxnLmdlYmhhcmR0QG1laWxoYXVzLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEZXZpY2UgRHJpdmVyIE1vZHVsZSBmb3IgTWVpbGhhdXMgTUUtRFVNTVkgRGV2aWNlcyIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIk1laWxoYXVzIE1FLURVTU1ZIERldmljZXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLy8gRXhwb3J0IHRoZSBjb25zdHJ1Y3Rvci4KK0VYUE9SVF9TWU1CT0wobWVkdW1teV9jb25zdHJ1Y3Rvcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkdW1teS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZHVtbXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTcwMDBmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZHVtbXkuaApAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBTb3VyY2UgRmlsZSA6IG1lZHVtbXkuaAorICogQXV0aG9yICAgICAgOiBHRyAoR3VlbnRlciBHZWJoYXJkdCkgIDxnLmdlYmhhcmR0QG1laWxoYXVzLmRlPgorICovCisKKyNpZm5kZWYgX01FRFVNTVlfSF8KKyNkZWZpbmUgX01FRFVNTVlfSF8KKworI2luY2x1ZGUgIm1ldHlwZXMuaCIKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FRFVNTVlfTUFHSUNfTlVNQkVSCTB4RERERAorCit0eXBlZGVmIHN0cnVjdCBtZWR1bW15X2RldmljZSB7CisJbWVfZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBNZWlsaGF1cyBkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKy8vICAgICAgaW50IG1hZ2ljOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgbWFnaWMgbnVtYmVyIG9mIHRoZSBzdHJ1Y3R1cmUgKi8KKwl1bnNpZ25lZCBzaG9ydCB2ZW5kb3JfaWQ7CS8qKjwgVmVuZG9yIElEICovCisJdW5zaWduZWQgc2hvcnQgZGV2aWNlX2lkOwkvKio8IERldmljZSBJRCAqLworCXVuc2lnbmVkIGludCBzZXJpYWxfbm87CQkvKio8IFNlcmlhbCBudW1iZXIgb2YgdGhlIGRldmljZSAqLworCWludCBidXNfdHlwZTsJCQkJLyoqPCBCdXMgdHlwZSAqLworCWludCBidXNfbm87CQkJCQkvKio8IEJ1cyBudW1iZXIgKi8KKwlpbnQgZGV2X25vOwkJCQkJLyoqPCBEZXZpY2UgbnVtYmVyICovCisJaW50IGZ1bmNfbm87CQkJCS8qKjwgRnVuY3Rpb24gbnVtYmVyICovCit9IG1lZHVtbXlfZGV2aWNlX3Q7CisKK21lX2RldmljZV90ICptZWR1bW15X2NvbnN0cnVjdG9yKHVuc2lnbmVkIHNob3J0IHZlbmRvcl9pZCwKKwkJCQkgdW5zaWduZWQgc2hvcnQgZGV2aWNlX2lkLAorCQkJCSB1bnNpZ25lZCBpbnQgc2VyaWFsX25vLAorCQkJCSBpbnQgYnVzX3R5cGUsCisJCQkJIGludCBidXNfbm8sCisJCQkJIGludCBkZXZfbm8sCisJCQkJIGludCBmdW5jX25vKSBfX2F0dHJpYnV0ZV9fICgod2VhaykpOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZXJyb3IuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWVycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVkYTRiZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWVycm9yLmgKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFNvdXJjZSBGaWxlIDogbWVlcnJvci5oCisgKiBBdXRob3IgICAgICA6IEdHIChHdWVudGVyIEdlYmhhcmR0KSAgPGcuZ2ViaGFyZHRAbWVpbGhhdXMuZGU+CisgKiBBdXRob3IgICAgICA6IEtHIChLcnp5c3p0b2YgR2FudHprZSkJPGsuZ2FudHprZUBtZWlsaGF1cy5kZT4KKyAqLworCisjaWZuZGVmIF9NRUVSUk9SX0hfCisjZGVmaW5lIF9NRUVSUk9SX0hfCisKK2V4dGVybiBjaGFyICptZUVycm9yTXNnVGFibGVbXTsKKworI2RlZmluZSBNRV9FUlJOT19TVUNDRVNTCQkJCQkJMAorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX0RFVklDRQkJCQkJMQorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX1NVQkRFVklDRQkJCQkyCisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfQ0hBTk5FTAkJCQkzCisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfU0lOR0xFX0NPTkZJRwkJCTQKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9SRUYJCQkJCTUKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9UUklHX0NIQU4JCQkJNgorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX1RSSUdfVFlQRQkJCQk3CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfVFJJR19FREdFCQkJCTgKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9USU1FT1VUCQkJCTkKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9GTEFHUwkJCQkJMTAKKyNkZWZpbmUgTUVfRVJSTk9fT1BFTgkJCQkJCQkxMQorI2RlZmluZSBNRV9FUlJOT19DTE9TRQkJCQkJCQkxMgorI2RlZmluZSBNRV9FUlJOT19OT1RfT1BFTgkJCQkJCTEzCisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfRElSCQkJCQkxNAorI2RlZmluZSBNRV9FUlJOT19QUkVWSU9VU19DT05GSUcJCQkJMTUKKyNkZWZpbmUgTUVfRVJSTk9fTk9UX1NVUFBPUlRFRAkJCQkJMTYKKyNkZWZpbmUgTUVfRVJSTk9fU1VCREVWSUNFX1RZUEUJCQkJCTE3CisjZGVmaW5lIE1FX0VSUk5PX1VTRVJfQlVGRkVSX1NJWkUJCQkJMTgKKyNkZWZpbmUgTUVfRVJSTk9fTE9DS0VECQkJCQkJCTE5CisjZGVmaW5lIE1FX0VSUk5PX05PTU9SRV9TVUJERVZJQ0VfVFlQRQkJCTIwCisjZGVmaW5lIE1FX0VSUk5PX1RJTUVPVVQJCQkJCQkyMQorI2RlZmluZSBNRV9FUlJOT19TSUdOQUwJCQkJCQkJMjIKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9JUlFfU09VUkNFCQkJCTIzCisjZGVmaW5lIE1FX0VSUk5PX1RIUkVBRF9SVU5OSU5HCQkJCQkyNAorI2RlZmluZSBNRV9FUlJOT19TVEFSVF9USFJFQUQJCQkJCTI1CisjZGVmaW5lIE1FX0VSUk5PX0NBTkNFTF9USFJFQUQJCQkJCTI2CisjZGVmaW5lIE1FX0VSUk5PX05PX0NBTExCQUNLCQkJCQkyNworI2RlZmluZSBNRV9FUlJOT19VU0VECQkJCQkJCTI4CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfVU5JVAkJCQkJMjkKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9NSU5fTUFYCQkJCTMwCisjZGVmaW5lIE1FX0VSUk5PX05PX1JBTkdFCQkJCQkJMzEKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9SQU5HRQkJCQkJMzIKKyNkZWZpbmUgTUVfRVJSTk9fU1VCREVWSUNFX0JVU1kJCQkJCTMzCisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfTE9DSwkJCQkJMzQKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9TV0lUQ0gJCQkJCTM1CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfRVJST1JfTVNHX0NPVU5UCQkzNgorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX1NUUkVBTV9DT05GSUcJCQkzNworI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX0NPTkZJR19MSVNUX0NPVU5UCQkzOAorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9UUklHX1RZUEUJMzkKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RBUlRfVFJJR19FREdFCTQwCisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUQVJUX1RSSUdfQ0hBTgk0MQorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9USU1FT1VUCQk0MgorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX0FDUV9TVEFSVF9BUkcJCQk0MworI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX1NDQU5fU1RBUlRfVFJJR19UWVBFCTQ0CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfU0NBTl9TVEFSVF9BUkcJCQk0NQorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX0NPTlZfU1RBUlRfVFJJR19UWVBFCTQ2CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfQ09OVl9TVEFSVF9BUkcJCQk0NworI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX1NDQU5fU1RPUF9UUklHX1RZUEUJNDgKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9TQ0FOX1NUT1BfQVJHCQkJNDkKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9BQ1FfU1RPUF9UUklHX1RZUEUJCTUwCisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfQUNRX1NUT1BfQVJHCQkJNTEKKyNkZWZpbmUgTUVfRVJSTk9fU1VCREVWSUNFX05PVF9SVU5OSU5HCQkJNTIKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9SRUFEX01PREUJCQkJNTMKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9WQUxVRV9DT1VOVAkJCTU0CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfV1JJVEVfTU9ERQkJCQk1NQorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX1RJTUVSCQkJCQk1NgorI2RlZmluZSBNRV9FUlJOT19ERVZJQ0VfVU5QTFVHR0VECQkJCTU3CisjZGVmaW5lIE1FX0VSUk5PX1VTRURfSU5URVJOQUwJCQkJCTU4CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfRFVUWV9DWUNMRQkJCQk1OQorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX1dBSVQJCQkJCTYwCisjZGVmaW5lIE1FX0VSUk5PX0NPTk5FQ1RfUkVNT1RFCQkJCQk2MQorI2RlZmluZSBNRV9FUlJOT19DT01NVU5JQ0FUSU9OCQkJCQk2MgorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX1NJTkdMRV9MSVNUCQkJNjMKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9NT0RVTEVfVFlQRQkJCTY0CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfU1RBUlRfTU9ERQkJCQk2NQorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX1NUT1BfTU9ERQkJCQk2NgorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX0ZJRk9fSVJRX1RIUkVTSE9MRAkJNjcKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9QT0lOVEVSCQkJCTY4CisjZGVmaW5lIE1FX0VSUk5PX0NSRUFURV9FVkVOVAkJCQkJNjkKKyNkZWZpbmUgTUVfRVJSTk9fTEFDS19PRl9SRVNPVVJDRVMJCQkJNzAKKyNkZWZpbmUgTUVfRVJSTk9fQ0FOQ0VMTEVECQkJCQkJNzEKKyNkZWZpbmUgTUVfRVJSTk9fUklOR19CVUZGRVJfT1ZFUkZMT1cJCQk3MgorI2RlZmluZSBNRV9FUlJOT19SSU5HX0JVRkZFUl9VTkRFRkZMT1cJCQk3MworI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX0lSUV9FREdFCQkJCTc0CisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfSVJRX0FSRwkJCQk3NQorI2RlZmluZSBNRV9FUlJOT19JTlZBTElEX0NBUAkJCQkJNzYKKyNkZWZpbmUgTUVfRVJSTk9fSU5WQUxJRF9DQVBfQVJHX0NPVU5UCQkJNzcKKyNkZWZpbmUgTUVfRVJSTk9fSU5URVJOQUwJCQkJCQk3OAorCisvKiogTmV3IGVycm9yIGZvciByYW5nZSBjaGVjayAqLworI2RlZmluZSBNRV9FUlJOT19WQUxVRV9PVVRfT0ZfUkFOR0UJCQkJNzkKKyNkZWZpbmUgTUVfRVJSTk9fRklGT19CVUZGRVJfT1ZFUkZMT1cJCQk4MAorI2RlZmluZSBNRV9FUlJOT19GSUZPX0JVRkZFUl9VTkRFRkZMT1cJCQk4MQorCisjZGVmaW5lIE1FX0VSUk5PX0lOVkFMSURfRVJST1JfTlVNQkVSCQkJODIKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZmlybXdhcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWZpcm13YXJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA3ZDIwMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWZpcm13YXJlLmMKQEAgLTAsMCArMSwxMzcgQEAKKy8qKgorICogQGZpbGUgbWVmaXJtd2FyZS5jCisgKgorICogQGJyaWVmIEltcGxlbWVudHMgdGhlIGZpcm13YXJlIGhhbmRsaW5nLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICogQGF1dGhvciBLcnp5c3p0b2YgR2FudHprZQkoay5nYW50emtlQG1laWxoYXVzLmRlKQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkgICAgICoKKyAqICAgQ29weXJpZ2h0IChDKSAyMDA3IGJ5IEtyenlzenRvZiBHYW50emtlIGsuZ2FudHprZUBtZWlsaGF1cy5kZSAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKyNpZm5kZWYgS0JVSUxEX01PRE5BTUUKKyMgIGRlZmluZSBLQlVJTERfTU9ETkFNRSBLQlVJTERfU1RSKG1lZmlybXdhcmUpCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorCisjaW5jbHVkZSAibWVwbHhfcmVnLmgiCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorCisjaW5jbHVkZSAibWVmaXJtd2FyZS5oIgorCitpbnQgbWVfeGlsaW54X2Rvd25sb2FkKHVuc2lnbmVkIGxvbmcgcmVnaXN0ZXJfYmFzZV9jb250cm9sLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyByZWdpc3Rlcl9iYXNlX2RhdGEsCisJCSAgICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZpcm13YXJlX25hbWUpCit7CisJaW50IGVyciA9IE1FX0VSUk5PX0ZJUk1XQVJFOworCXVpbnQzMl90IHZhbHVlID0gMDsKKwlpbnQgaWR4ID0gMDsKKworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpZiAoIWZpcm13YXJlX25hbWUpIHsKKwkJUEVSUk9SKCJSZXF1ZXN0IGZvciBmaXJtd2FyZSBmYWlsZWQuIE5vIG5hbWUgcHJvdmlkZWQuIFxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJUElORk8oIlJlcXVlc3QgJyVzJyBmaXJtd2FyZS5cbiIsIGZpcm13YXJlX25hbWUpOworCWVyciA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmaXJtd2FyZV9uYW1lLCBkZXYpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIlJlcXVlc3QgZm9yIGZpcm13YXJlIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKwkvLyBTZXQgUExYIGxvY2FsIGludGVycnVwdCAyIHBvbGFyaXR5IHRvIGhpZ2guCisJLy8gSW50ZXJydXB0IGlzIHRocm93biBieSBpbml0IHBpbiBvZiB4aWxpbnguCisJb3V0bChQTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfUE9MLCByZWdpc3Rlcl9iYXNlX2NvbnRyb2wgKyBQTFhfSU5UQ1NSKTsKKworCS8vIFNldCAvQ1MgYW5kIC9XUklURSBvZiB0aGUgWGlsaW54CisJdmFsdWUgPSBpbmwocmVnaXN0ZXJfYmFzZV9jb250cm9sICsgUExYX0lDUik7CisJdmFsdWUgfD0gTUVfRklSTVdBUkVfQ1NfV1JJVEU7CisJb3V0bCh2YWx1ZSwgcmVnaXN0ZXJfYmFzZV9jb250cm9sICsgUExYX0lDUik7CisKKwkvLyBJbml0IFhpbGlueCB3aXRoIENTMQorCWlubChyZWdpc3Rlcl9iYXNlX2RhdGEgKyBNRV9YSUxJTlhfQ1MxX1JFRyk7CisKKwkvLyBXYWl0IGZvciBpbml0IHRvIGNvbXBsZXRlCisJdWRlbGF5KDIwKTsKKworCS8vIENoZWNrbCAvSU5JVCBwaW4KKwlpZiAoIQorCSAgICAoaW5sKHJlZ2lzdGVyX2Jhc2VfY29udHJvbCArIFBMWF9JTlRDU1IpICYKKwkgICAgIFBMWF9JTlRDU1JfTE9DQUxfSU5UMl9TVEFURSkpIHsKKwkJUEVSUk9SKCJDYW4ndCBpbml0IFhpbGlueC5cbiIpOworCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwkJcmV0dXJuIC1FSU87CisJfQorCS8vIFJlc2V0IC9DUyBhbmQgL1dSSVRFIG9mIHRoZSBYaWxpbngKKwl2YWx1ZSA9IGlubChyZWdpc3Rlcl9iYXNlX2NvbnRyb2wgKyBQTFhfSUNSKTsKKwl2YWx1ZSAmPSB+TUVfRklSTVdBUkVfQ1NfV1JJVEU7CisJb3V0bCh2YWx1ZSwgcmVnaXN0ZXJfYmFzZV9jb250cm9sICsgUExYX0lDUik7CisKKwkvLyBEb3dubG9hZCBYaWxpbnggZmlybXdhcmUKKwl1ZGVsYXkoMTApOworCisJZm9yIChpZHggPSAwOyBpZHggPCBmdy0+c2l6ZTsgaWR4KyspIHsKKwkJb3V0bChmdy0+ZGF0YVtpZHhdLCByZWdpc3Rlcl9iYXNlX2RhdGEpOworI2lmZGVmIE1FNjAwMF92Ml80CisvLy8gICAgIFRoaXMgY2hlY2tpbmcgb25seSBmb3IgYm9hcmQncyB2ZXJzaW9uIDIuNAorCQkvLyBDaGVjayBpZiBCVVNZIGZsYWcgaXMgc2V0IChsb3cgPSByZWFkeSwgaGlnaCA9IGJ1c3kpCisJCWlmIChpbmwocmVnaXN0ZXJfYmFzZV9jb250cm9sICsgUExYX0lDUikgJgorCQkgICAgTUVfRklSTVdBUkVfQlVTWV9GTEFHKSB7CisJCQlQRVJST1IoIlhpbGlueCBpcyBzdGlsbCBidXN5IChpZHggPSAlZClcbiIsIGlkeCk7CisJCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwkJCXJldHVybiAtRUlPOworCQl9CisjZW5kaWYgLy9NRTYwMDBfdjJfNAorCX0KKwlQREVCVUcoIkRvd25sb2FkIGZpbmlzaGVkLiAlZCBieXRlcyB3cml0dGVuIHRvIFBMWC5cbiIsIGlkeCk7CisKKwkvLyBJZiBkb25lIGZsYWcgaXMgaGlnaCBkb3dubG9hZCB3YXMgc3VjY2Vzc2Z1bAorCWlmIChpbmwocmVnaXN0ZXJfYmFzZV9jb250cm9sICsgUExYX0lDUikgJiBNRV9GSVJNV0FSRV9ET05FX0ZMQUcpIHsKKwkJUERFQlVHKCJTVUNDRVNTLiBEb25lIGZsYWcgaXMgc2V0LlxuIik7CisJfSBlbHNlIHsKKwkJUEVSUk9SKCJGQUlMVVJFLiBET05FIGZsYWcgaXMgbm90IHNldC5cbiIpOworCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLy8gU2V0IC9DUyBhbmQgL1dSSVRFCisJdmFsdWUgPSBpbmwocmVnaXN0ZXJfYmFzZV9jb250cm9sICsgUExYX0lDUik7CisJdmFsdWUgfD0gTUVfRklSTVdBUkVfQ1NfV1JJVEU7CisJb3V0bCh2YWx1ZSwgcmVnaXN0ZXJfYmFzZV9jb250cm9sICsgUExYX0lDUik7CisKKwlQREVCVUcoIkVuYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBQQ0kgaW50ZXJmYWNlLlxuIik7CisJb3V0bChNRV9QTFhfUENJX0FDVElWQVRFLCByZWdpc3Rlcl9iYXNlX2NvbnRyb2wgKyBQTFhfSU5UQ1NSKTsKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZmlybXdhcmUuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWZpcm13YXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI2ODUwOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWZpcm13YXJlLmgKQEAgLTAsMCArMSw1NyBAQAorLyoqCisgKiBAZmlsZSBtZWZpcm13YXJlLmgKKyAqCisgKiBAYnJpZWYgRGVmaW5pdGlvbnMgb2YgdGhlIGZpcm13YXJlIGhhbmRsaW5nIGZ1bmN0aW9ucy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKSAgICAgKgorICogICBDb3B5cmlnaHQgKEMpIDIwMDcgYnkgS3J6eXN6dG9mIEdhbnR6a2Ugay5nYW50emtlQG1laWxoYXVzLmRlICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfTUVGSVJNV0FSRV9ICisjIGRlZmluZSBfTUVGSVJNV0FSRV9ICisKKyMgaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FX0VSUk5PX0ZJUk1XQVJFCQktMQorCisvKioKKyogUmVnaXN0cnkKKyovCisjZGVmaW5lIE1FX1hJTElOWF9DUzFfUkVHCQkweDAwQzgKKworLyoqCisqIEZsYWdzIChiaXRzKQorKi8KKworI2RlZmluZSBNRV9GSVJNV0FSRV9CVVNZX0ZMQUcJMHgwMDAwMDAyMAorI2RlZmluZSBNRV9GSVJNV0FSRV9ET05FX0ZMQUcJMHgwMDAwMDAwNAorI2RlZmluZSBNRV9GSVJNV0FSRV9DU19XUklURQkweDAwMDAwMTAwCisKKyNkZWZpbmUgTUVfUExYX1BDSV9BQ1RJVkFURQkJMHg0MworCitpbnQgbWVfeGlsaW54X2Rvd25sb2FkKHVuc2lnbmVkIGxvbmcgcmVnaXN0ZXJfYmFzZV9jb250cm9sLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyByZWdpc3Rlcl9iYXNlX2RhdGEsCisJCSAgICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZpcm13YXJlX25hbWUpOworCisjIGVuZGlmCS8vX19LRVJORUxfXworCisjZW5kaWYgLy9fTUVGSVJNV0FSRV9ICmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVpZHMuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWlkcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZTc1N2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVpZHMuaApAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBTb3VyY2UgRmlsZSA6IG1laWRzLmgKKyAqIEF1dGhvciAgICAgIDogR0cgKEd1ZW50ZXIgR2ViaGFyZHQpICA8Zy5nZWJoYXJkdEBtZWlsaGF1cy5kZT4KKyAqLworCisjaWZuZGVmIF9NRUlEU19IXworI2RlZmluZSBfTUVJRFNfSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBEcml2ZXIgbmFtZXMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRU1BSU5fTkFNRQkJCQkibWVtYWluIgorI2RlZmluZSBNRTEwMDBfTkFNRQkJCQkibWUxMDAwIgorI2RlZmluZSBNRTE0MDBfTkFNRQkJCQkibWUxNDAwIgorI2RlZmluZSBNRTE2MDBfTkFNRQkJCQkibWUxNjAwIgorI2RlZmluZSBNRTQ2MDBfTkFNRQkJCQkibWU0NjAwIgorI2RlZmluZSBNRTYwMDBfTkFNRQkJCQkibWU2MDAwIgorI2RlZmluZSBNRTA2MDBfTkFNRQkJCQkibWUwNjAwIgkvLyJtZTYzMCIKKyNkZWZpbmUgTUU4MTAwX05BTUUJCQkJIm1lODEwMCIKKyNkZWZpbmUgTUU4MjAwX05BTUUJCQkJIm1lODIwMCIKKyNkZWZpbmUgTUUwOTAwX05BTUUJCQkJIm1lMDkwMCIJLy8ibWU5eCIKKy8vI2RlZmluZSBNRVBISVNUT19TMV9OQU1FICAgICAgICAgICAgICAgICAgICAgICJtZXBoaXN0b19zMSIKKyNkZWZpbmUgTUVEVU1NWV9OQU1FCQkJIm1lZHVtbXkiCisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVpbnRlcm5hbC5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21laW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDEyNmI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21laW50ZXJuYWwuaApAQCAtMCwwICsxLDM2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogU291cmNlIEZpbGUgOiBtZWludGVybmFsLmgKKyAqIEF1dGhvciAgICAgIDogR0cgKEd1ZW50ZXIgR2ViaGFyZHQpICA8Zy5nZWJoYXJkdEBtZWlsaGF1cy5kZT4KKyAqLworCisjaWZuZGVmIF9NRUlOVEVSTkFMX0hfCisjZGVmaW5lIF9NRUlOVEVSTkFMX0hfCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgUENJIFZlbmRvciBJRHMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX01FSUxIQVVTCQkJCQkJMHgxNDAyCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgUENJIERldmljZSBJRHMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTAwMAkJCQkweDEwMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTEwMDBfQQkJCQkweDEwMEEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTEwMDBfQgkJCQkweDEwMEIKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwMAkJCQkweDE0MDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEEJCQkJMHgxNDBBCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBCCQkJCTB4MTQwQgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFMAkJCQkweDE0RTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RUEJCQkJMHgxNEVBCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNEVCCQkJCTB4MTRFQgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQwkJCQkwWDE0MEMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEQJCQkJMFgxNDBECisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfNFUJCQkweDE2MDQgLy8gNCB2b2x0YWdlIG91dHB1dHMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfOFUJCQkweDE2MDggLy8gOCB2b2x0YWdlIG91dHB1dHMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfMTJVCQkJMHgxNjBDIC8vIDEyIHZvbHRhZ2Ugb3V0cHV0cworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF8xNlUJCQkweDE2MEYgLy8gMTYgdm9sdGFnZSBvdXRwdXRzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNjAwXzE2VV84SQkJMHgxNjhGIC8vIDE2IHZvbHRhZ2UvOCBjdXJyZW50IG8uCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2MTAJCQkJMHg0NjEwIC8vIEpla3lsbAorCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjUwCQkJCTB4NDY1MCAvLyBMb3cgQ29zdCB2ZXJzaW9uCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjAJCQkJMHg0NjYwIC8vIFN0YW5kYXJkIHZlcnNpb24KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjBJCQkJCTB4NDY2MSAvLyBJc29sYXRlZCB2ZXJzaW9uCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjYwUwkJCQkweDQ2NjIgLy8gU3RhbmRhcmQgdmVyc2lvbiB3aXRoIFNhbXBsZSBhbmQgSG9sZAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MElTCQkJCTB4NDY2MyAvLyBJc29sYXRlZCB2ZXJzaW9uIHdpdGggU2FtcGxlIGFuZCBIb2xkCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzAJCQkJMHg0NjcwIC8vIFN0YW5kYXJkIHZlcnNpb24KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NzBJCQkJCTB4NDY3MSAvLyBJc29sYXRlZCB2ZXJzaW9uCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwUwkJCQkweDQ2NzIgLy8gU3RhbmRhcmQgdmVyc2lvbiB3aXRoIFNhbXBsZSBhbmQgSG9sZAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MElTCQkJCTB4NDY3MyAvLyBJc29sYXRlZCB2ZXJzaW9uIHdpdGggU2FtcGxlIGFuZCBIb2xkCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODAJCQkJMHg0NjgwIC8vIFN0YW5kYXJkIHZlcnNpb24KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2ODBJCQkJCTB4NDY4MSAvLyBJc29sYXRlZCB2ZXJzaW9uCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwUwkJCQkweDQ2ODIgLy8gU3RhbmRhcmQgdmVyc2lvbiB3aXRoIFNhbXBsZSBhbmQgSG9sZAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY4MElTCQkJCTB4NDY4MyAvLyBJc29sYXRlZCB2ZXJzaW9uIHdpdGggU2FtcGxlIGFuZCBIb2xkCisKKy8qIE1FNjAwMCBzdGFuZGFyZCB2ZXJzaW9uICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDA0ICAgCQkJMHg2MDA0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDA4ICAgCQkJMHg2MDA4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDBGICAgCQkJMHg2MDBGCisKKy8qIE1FNjAwMCBpc29sYXRlZCB2ZXJzaW9uICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDE0ICAgCQkJMHg2MDE0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDE4ICAgCQkJMHg2MDE4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDFGICAgCQkJMHg2MDFGCisKKy8qIE1FNjAwMCBpc2xlIHZlcnNpb24gKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMzQgICAJCQkweDYwMzQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMzggICAJCQkweDYwMzgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwM0YgICAJCQkweDYwM0YKKworLyogTUU2MDAwIHN0YW5kYXJkIHZlcnNpb24gd2l0aCBESU8gKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNDQgICAJCQkweDYwNDQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNDggICAJCQkweDYwNDgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNEYgICAJCQkweDYwNEYKKworLyogTUU2MDAwIGlzb2xhdGVkIHZlcnNpb24gd2l0aCBESU8gKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNTQgICAJCQkweDYwNTQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNTggICAJCQkweDYwNTgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNUYgICAJCQkweDYwNUYKKworLyogTUU2MDAwIGlzbGUgdmVyc2lvbiB3aXRoIERJTyAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA3NCAgIAkJCTB4NjA3NAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA3OCAgIAkJCTB4NjA3OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA3RiAgIAkJCTB4NjA3RgorCisvKiBNRTYxMDAgc3RhbmRhcmQgdmVyc2lvbiAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEwNCAgIAkJCTB4NjEwNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEwOCAgIAkJCTB4NjEwOAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEwRiAgIAkJCTB4NjEwRgorCisvKiBNRTYxMDAgaXNvbGF0ZWQgdmVyc2lvbiAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjExNCAgIAkJCTB4NjExNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjExOCAgIAkJCTB4NjExOAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjExRiAgIAkJCTB4NjExRgorCisvKiBNRTYxMDAgaXNsZSB2ZXJzaW9uICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTM0ICAgCQkJMHg2MTM0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTM4ICAgCQkJMHg2MTM4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTNGICAgCQkJMHg2MTNGCisKKy8qIE1FNjEwMCBzdGFuZGFyZCB2ZXJzaW9uIHdpdGggRElPICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTQ0CQkJCTB4NjE0NAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE0OCAgIAkJCTB4NjE0OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE0RiAgIAkJCTB4NjE0RgorCisvKiBNRTYxMDAgaXNvbGF0ZWQgdmVyc2lvbiB3aXRoIERJTyAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE1NCAgIAkJCTB4NjE1NAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE1OCAgIAkJCTB4NjE1OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE1RiAgIAkJCTB4NjE1RgorCisvKiBNRTYxMDAgaXNsZSB2ZXJzaW9uIHdpdGggRElPICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTc0ICAgCQkJMHg2MTc0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTc4ICAgCQkJMHg2MTc4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTdGICAgCQkJMHg2MTdGCisKKy8qIE1FNjIwMCBpc29sYXRlZCB2ZXJzaW9uIHdpdGggRElPICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MjU5CQkJCTB4NjI1OQorCisvKiBNRTYzMDAgaXNvbGF0ZWQgdmVyc2lvbiB3aXRoIERJTyAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjM1OQkJCQkweDYzNTkKKworLyogTUUwNjMwICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUwNjMwCQkJCTB4MDYzMAorCisvKiBNRTgxMDAgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTgxMDBfQQkJCQkweDgxMEEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTgxMDBfQiAgCQkJMHg4MTBCCisKKy8qIE1FODIwMCAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODIwMF9BCQkJCTB4ODIwQQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODIwMF9CICAJCQkweDgyMEIKKworLyogTUUwOTAwICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUwOTQwCQkJCTB4MDk0MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMDk1MAkJCQkweDA5NTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA5NjAJCQkJMHgwOTYwCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBVU0IgVmVuZG9yIElEcworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvLyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9NRVBISVNUT19TMQkJCQkJMHgwNDAzCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBVU0IgRGV2aWNlIElEcworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvLyNkZWZpbmUgVVNCX0RFVklDRV9JRF9NRVBISVNUT19TMQkJCQkJMHhEQ0QwCisKKworLyogTUUtMTAwMCBkZWZpbmVzICovCisjZGVmaW5lIE1FMTAwMF9OQU1FX0RSSVZFUgkJCQkJCQkiTUUtMTAwMCIKKworI2RlZmluZSBNRTEwMDBfTkFNRV9ERVZJQ0VfTUUxMDAwCQkJCQkiTUUtMTAwMCIKKworI2RlZmluZSBNRTEwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTAwMAkJCSJNRS0xMDAwIGRldmljZSwgMTI4IGRpZ2l0YWwgaS9vIGxpbmVzLiIKKworLyogTUUtMTQwMCBkZWZpbmVzICovCisjZGVmaW5lIE1FMTQwMF9OQU1FX0RSSVZFUgkJCQkJCQkiTUUtMTQwMCIKKworI2RlZmluZSBNRTE0MDBfTkFNRV9ERVZJQ0VfTUUxNDAwCQkJCQkiTUUtMTQwMCIKKyNkZWZpbmUgTUUxNDAwX05BTUVfREVWSUNFX01FMTQwMEUJCQkJCSJNRS0xNDAwRSIKKyNkZWZpbmUgTUUxNDAwX05BTUVfREVWSUNFX01FMTQwMEEJCQkJCSJNRS0xNDAwQSIKKyNkZWZpbmUgTUUxNDAwX05BTUVfREVWSUNFX01FMTQwMEVBCQkJCQkiTUUtMTQwMEVBIgorI2RlZmluZSBNRTE0MDBfTkFNRV9ERVZJQ0VfTUUxNDAwQgkJCQkJIk1FLTE0MDBCIgorI2RlZmluZSBNRTE0MDBfTkFNRV9ERVZJQ0VfTUUxNDAwRUIJCQkJCSJNRS0xNDAwRUIiCisjZGVmaW5lIE1FMTQwMF9OQU1FX0RFVklDRV9NRTE0MDBDCQkJCQkiTUUtMTQwMEMiCisjZGVmaW5lIE1FMTQwMF9OQU1FX0RFVklDRV9NRTE0MDBECQkJCQkiTUUtMTQwMEQiCisKKyNkZWZpbmUgTUUxNDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE0MDAJCQkiTUUtMTQwMCBkZXZpY2UsIDI0IGRpZ2l0YWwgaS9vIGxpbmVzLiIKKyNkZWZpbmUgTUUxNDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE0MDBFCQkJIk1FLTE0MDBFIGRldmljZSwgMjQgZGlnaXRhbCBpL28gbGluZXMuIgorI2RlZmluZSBNRTE0MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTQwMEEJCQkiTUUtMTQwMEEgZGV2aWNlLCAyNCBkaWdpdGFsIGkvbyBsaW5lcywgMyBjb3VudGVycy4iCisjZGVmaW5lIE1FMTQwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNDAwRUEJCQkiTUUtMTQwMEVBIGRldmljZSwgMjQgZGlnaXRhbCBpL28gbGluZXMsIDMgY291bnRlcnMuIgorI2RlZmluZSBNRTE0MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTQwMEIJCQkiTUUtMTQwMEIgZGV2aWNlLCA0OCBkaWdpdGFsIGkvbyBsaW5lcywgNiBjb3VudGVycy4iCisjZGVmaW5lIE1FMTQwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNDAwRUIJCQkiTUUtMTQwMEVCIGRldmljZSwgNDggZGlnaXRhbCBpL28gbGluZXMsIDYgY291bnRlcnMuIgorI2RlZmluZSBNRTE0MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTQwMEMJCQkiTUUtMTQwMEMgZGV2aWNlLCAyNCBkaWdpdGFsIGkvbyBsaW5lcywgMTUgY291bnRlcnMuIgorI2RlZmluZSBNRTE0MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTQwMEQJCQkiTUUtMTQwMEQgZGV2aWNlLCA0OCBkaWdpdGFsIGkvbyBsaW5lcywgMzAgY291bnRlcnMuIgorCisvKiBNRS0xNjAwIGRlZmluZXMgKi8KKyNkZWZpbmUgTUUxNjAwX05BTUVfRFJJVkVSCQkJCQkJCSJNRS0xNjAwIgorCisjZGVmaW5lIE1FMTYwMF9OQU1FX0RFVklDRV9NRTE2MDA0VQkJCQkJIk1FLTE2MDAvNFUiCisjZGVmaW5lIE1FMTYwMF9OQU1FX0RFVklDRV9NRTE2MDA4VQkJCQkJIk1FLTE2MDAvOFUiCisjZGVmaW5lIE1FMTYwMF9OQU1FX0RFVklDRV9NRTE2MDAxMlUJCQkJIk1FLTE2MDAvMTJVIgorI2RlZmluZSBNRTE2MDBfTkFNRV9ERVZJQ0VfTUUxNjAwMTZVCQkJCSJNRS0xNjAwLzE2VSIKKyNkZWZpbmUgTUUxNjAwX05BTUVfREVWSUNFX01FMTYwMDE2VThJCQkJCSJNRS0xNjAwLzE2VThJIgorCisjZGVmaW5lIE1FMTYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNjAwNFUJCQkiTUUtMTYwMC80VSBkZXZpY2UsIDQgdm9sdGFnZSBvdXRwdXRzLiIKKyNkZWZpbmUgTUUxNjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE2MDA4VQkJCSJNRS0xNjAwLzhVIGRldmljZSwgOCB2b2x0YWdlIG91dHB1dHMuIgorI2RlZmluZSBNRTE2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMTYwMDEyVQkJCSJNRS0xNjAwLzEyVSBkZXZpY2UsIDEyIHZvbHRhZ2Ugb3V0cHV0cy4iCisjZGVmaW5lIE1FMTYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUxNjAwMTZVCQkJIk1FLTE2MDAvMTZVIGRldmljZSwgMTYgdm9sdGFnZSBvdXRwdXRzLiIKKyNkZWZpbmUgTUUxNjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTE2MDAxNlU4SQkJIk1FLTE2MDAvMTZVOEkgZGV2aWNlLCAxNiB2b2x0YWdlLCA4IGN1cnJlbnQgb3V0cHV0cy4iCisKKy8qIE1FLTQwMDAgZGVmaW5lcyAqLworI2RlZmluZSBNRTQ2MDBfTkFNRV9EUklWRVIJCQkJCQkJIk1FLTQ2MDAiCisKKyNkZWZpbmUgTUU0NjAwX05BTUVfREVWSUNFX01FNDYxMAkJCQkJIk1FLTQ2MTAiCisjZGVmaW5lIE1FNDYwMF9OQU1FX0RFVklDRV9NRTQ2NTAJCQkJCSJNRS00NjUwIgorI2RlZmluZSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjYwCQkJCQkiTUUtNDY2MCIKKyNkZWZpbmUgTUU0NjAwX05BTUVfREVWSUNFX01FNDY2MEkJCQkJCSJNRS00NjYwSSIKKyNkZWZpbmUgTUU0NjAwX05BTUVfREVWSUNFX01FNDY2MFMJCQkJCSJNRS00NjYwUyIKKyNkZWZpbmUgTUU0NjAwX05BTUVfREVWSUNFX01FNDY2MElTCQkJCQkiTUUtNDY2MElTIgorI2RlZmluZSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjcwCQkJCQkiTUUtNDY3MCIKKyNkZWZpbmUgTUU0NjAwX05BTUVfREVWSUNFX01FNDY3MEkJCQkJCSJNRS00NjcwSSIKKyNkZWZpbmUgTUU0NjAwX05BTUVfREVWSUNFX01FNDY3MFMJCQkJCSJNRS00NjcwUyIKKyNkZWZpbmUgTUU0NjAwX05BTUVfREVWSUNFX01FNDY3MElTCQkJCQkiTUUtNDY3MElTIgorI2RlZmluZSBNRTQ2MDBfTkFNRV9ERVZJQ0VfTUU0NjgwCQkJCQkiTUUtNDY4MCIKKyNkZWZpbmUgTUU0NjAwX05BTUVfREVWSUNFX01FNDY4MEkJCQkJCSJNRS00NjgwSSIKKyNkZWZpbmUgTUU0NjAwX05BTUVfREVWSUNFX01FNDY4MFMJCQkJCSJNRS00NjgwUyIKKyNkZWZpbmUgTUU0NjAwX05BTUVfREVWSUNFX01FNDY4MElTCQkJCQkiTUUtNDY4MElTIgorCisjZGVmaW5lIE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjEwCQkJIk1FLTQ2MTAgZGV2aWNlLCAxNiBzdHJlYW1pbmcgYW5hbG9nIGlucHV0cywgMzIgZGlnaXRhbCBpL28gbGluZXMsIDMgY291bnRlcnMsIDEgZXh0ZXJuYWwgaW50ZXJydXB0LiIKKyNkZWZpbmUgTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2NTAJCQkiTUUtNDY1MCBkZXZpY2UsIDE2IHN0cmVhbWluZyBhbmFsb2cgaW5wdXRzLCAzMiBkaWdpdGFsIGkvbyBsaW5lcywgMSBleHRlcm5hbCBpbnRlcnJ1cHQuIgorI2RlZmluZSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY2MAkJCSJNRS00NjYwIGRldmljZSwgMTYgc3RyZWFtaW5nIGFuYWxvZyBpbnB1dHMsIDIgc2luZ2xlIGFuYWxvZyBvdXRwdXRzLCAzMiBkaWdpdGFsIGkvbyBsaW5lcywgMyBjb3VudGVycywgMSBleHRlcm5hbCBpbnRlcnJ1cHQuIgorI2RlZmluZSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY2MEkJCQkiTUUtNDY2MEkgb3B0byBpc29sYXRlZCBkZXZpY2UsIDE2IHN0cmVhbWluZyBhbmFsb2cgaW5wdXRzLCAyIHNpbmdsZSBhbmFsb2cgb3V0cHV0cywgMzIgZGlnaXRhbCBpL28gbGluZXMsIDMgY291bnRlcnMsIDEgZXh0ZXJuYWwgaW50ZXJydXB0LiIKKyNkZWZpbmUgTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2NjBTCQkJIk1FLTQ2NjAgZGV2aWNlLCAxNiBzdHJlYW1pbmcgYW5hbG9nIGlucHV0cyAoOCBTJkgpLCAyIHNpbmdsZSBhbmFsb2cgb3V0cHV0cywgMzIgZGlnaXRhbCBpL28gbGluZXMsIDMgY291bnRlcnMsIDEgZXh0ZXJuYWwgaW50ZXJydXB0LiIKKyNkZWZpbmUgTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2NjBJUwkJCSJNRS00NjYwSSBvcHRvIGlzb2xhdGVkIGRldmljZSwgMTYgc3RyZWFtaW5nIGFuYWxvZyBpbnB1dHMgKDggUyZIKSwgMiBzaW5nbGUgYW5hbG9nIG91dHB1dHMsIDMyIGRpZ2l0YWwgaS9vIGxpbmVzLCAzIGNvdW50ZXJzLCAxIGV4dGVybmFsIGludGVycnVwdC4iCisjZGVmaW5lIE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjcwCQkJIk1FLTQ2NzAgZGV2aWNlLCAzMiBzdHJlYW1pbmcgYW5hbG9nIGlucHV0cywgNCBzaW5nbGUgYW5hbG9nIG91dHB1dHMsIDMyIGRpZ2l0YWwgaS9vIGxpbmVzLCAzIGNvdW50ZXJzLCAxIGV4dGVybmFsIGludGVycnVwdC4iCisjZGVmaW5lIE1FNDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU0NjcwSQkJCSJNRS00NjcwSSBvcHRvIGlzb2xhdGVkIGRldmljZSwgMzIgc3RyZWFtaW5nIGFuYWxvZyBpbnB1dHMsIDQgc2luZ2xlIGFuYWxvZyBvdXRwdXRzLCAzMiBkaWdpdGFsIGkvbyBsaW5lcywgMyBjb3VudGVycywgMSBleHRlcm5hbCBpbnRlcnJ1cHQuIgorI2RlZmluZSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY3MFMJCQkiTUUtNDY3MFMgZGV2aWNlLCAzMiBzdHJlYW1pbmcgYW5hbG9nIGlucHV0cyAoOCBTJkgpLCA0IHNpbmdsZSBhbmFsb2cgb3V0cHV0cywgMzIgZGlnaXRhbCBpL28gbGluZXMsIDMgY291bnRlcnMsIDEgZXh0ZXJuYWwgaW50ZXJydXB0LiIKKyNkZWZpbmUgTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2NzBJUwkJCSJNRS00NjcwSVMgb3B0byBpc29sYXRlZCBkZXZpY2UsIDMyIHN0cmVhbWluZyBhbmFsb2cgaW5wdXRzICg4IFMmSCksIDQgc2luZ2xlIGFuYWxvZyBvdXRwdXRzLCAzMiBkaWdpdGFsIGkvbyBsaW5lcywgMyBjb3VudGVycywgMSBleHRlcm5hbCBpbnRlcnJ1cHQuIgorI2RlZmluZSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY4MAkJCSJNRS00NjgwIGRldmljZSwgMzIgc3RyZWFtaW5nIGFuYWxvZyBpbnB1dHMsIDQgc3RyZWFtaW5nIGFuYWxvZyBvdXRwdXRzLCAzMiBkaWdpdGFsIGkvbyBsaW5lcywgMyBjb3VudGVycywgMSBleHRlcm5hbCBpbnRlcnJ1cHQuIgorI2RlZmluZSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY4MEkJCQkiTUUtNDY4MEkgb3B0byBpc29sYXRlZCBkZXZpY2UsIDMyIHN0cmVhbWluZyBhbmFsb2cgaW5wdXRzLCA0IHN0cmVhbWluZyBhbmFsb2cgb3V0cHV0cywgMzIgZGlnaXRhbCBpL28gbGluZXMsIDMgY291bnRlcnMsIDEgZXh0ZXJuYWwgaW50ZXJydXB0LiIKKyNkZWZpbmUgTUU0NjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTQ2ODBTCQkJIk1FLTQ2ODBTIGRldmljZSwgMzIgc3RyZWFtaW5nIGFuYWxvZyBpbnB1dHMsIDQgc3RyZWFtaW5nIGFuYWxvZyBvdXRwdXRzLCAzMiBkaWdpdGFsIGkvbyBsaW5lcywgMyBjb3VudGVycywgMSBleHRlcm5hbCBpbnRlcnJ1cHQuIgorI2RlZmluZSBNRTQ2MDBfREVTQ1JJUFRJT05fREVWSUNFX01FNDY4MElTCQkJIk1FLTQ2ODBJUyBvcHRvIGlzb2xhdGVkIGRldmljZSwgMzIgc3RyZWFtaW5nIGFuYWxvZyBpbnB1dHMgKDggUyZIKSwgNCBzdHJlYW1pbmcgYW5hbG9nIG91dHB1dHMsIDMyIGRpZ2l0YWwgaS9vIGxpbmVzLCAzIGNvdW50ZXJzLCAxIGV4dGVybmFsIGludGVycnVwdC4iCisKKy8qIE1FLTYwMDAgZGVmaW5lcyAqLworI2RlZmluZSBNRTYwMDBfTkFNRV9EUklWRVIJCQkJCQkJIk1FLTYwMDAiCisKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMDQJCQkJCSJNRS02MDAwLzQiCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDA4CQkJCQkiTUUtNjAwMC84IgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwMTYJCQkJCSJNRS02MDAwLzE2IgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSTQJCQkJCSJNRS02MDAwSS80IgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSTgJCQkJCSJNRS02MDAwSS84IgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSTE2CQkJCSJNRS02MDAwSS8xNiIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMElTTEU0CQkJCSJNRS02MDAwSVNMRS80IgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSVNMRTgJCQkJIk1FLTYwMDBJU0xFLzgiCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJU0xFMTYJCQkJIk1FLTYwMDBJU0xFLzE2IgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwNAkJCQkJIk1FLTYxMDAvNCIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMDgJCQkJCSJNRS02MTAwLzgiCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDAxNgkJCQkJIk1FLTYxMDAvMTYiCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJNAkJCQkJIk1FLTYxMDBJLzQiCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJOAkJCQkJIk1FLTYxMDBJLzgiCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJMTYJCQkJIk1FLTYxMDBJLzE2IgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSVNMRTQJCQkJIk1FLTYxMDBJU0xFLzQiCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJU0xFOAkJCQkiTUUtNjEwMElTTEUvOCIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMElTTEUxNgkJCQkiTUUtNjEwMElTTEUvMTYiCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDA0RElPCQkJCSJNRS02MDAwLzQvRElPIgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwOERJTwkJCQkiTUUtNjAwMC84L0RJTyIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMDE2RElPCQkJCSJNRS02MDAwLzE2L0RJTyIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMEk0RElPCQkJCSJNRS02MDAwSS80L0RJTyIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMEk4RElPCQkJCSJNRS02MDAwSS84L0RJTyIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMEkxNkRJTwkJCQkiTUUtNjAwMEkvMTYvRElPIgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MDAwSVNMRTRESU8JCQkiTUUtNjAwMElTTEUvNC9ESU8iCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYwMDBJU0xFOERJTwkJCSJNRS02MDAwSVNMRS84L0RJTyIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjAwMElTTEUxNkRJTwkJCSJNRS02MDAwSVNMRS8xNi9ESU8iCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDA0RElPCQkJCSJNRS02MTAwLzQvRElPIgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwOERJTwkJCQkiTUUtNjEwMC84L0RJTyIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMDE2RElPCQkJCSJNRS02MTAwLzE2L0RJTyIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMEk0RElPCQkJCSJNRS02MTAwSS80L0RJTyIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMEk4RElPCQkJCSJNRS02MTAwSS84L0RJTyIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMEkxNkRJTwkJCQkiTUUtNjEwMEkvMTYvRElPIgorI2RlZmluZSBNRTYwMDBfTkFNRV9ERVZJQ0VfTUU2MTAwSVNMRTRESU8JCQkiTUUtNjEwMElTTEUvNC9ESU8iCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYxMDBJU0xFOERJTwkJCSJNRS02MTAwSVNMRS84L0RJTyIKKyNkZWZpbmUgTUU2MDAwX05BTUVfREVWSUNFX01FNjEwMElTTEUxNkRJTwkJCSJNRS02MTAwSVNMRS8xNi9ESU8iCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYyMDBJOURJTwkJCQkiTUUtNjIwMEkvOS9ESU8iCisjZGVmaW5lIE1FNjAwMF9OQU1FX0RFVklDRV9NRTYzMDBJOURJTwkJCQkiTUUtNjMwMEkvOS9ESU8iCisKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDA0CQkJIk1FLTYwMDAvNCBkZXZpY2UsIDQgc2luZ2xlIGFuYWxvZyBvdXRwdXRzLiIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDA4CQkJIk1FLTYwMDAvOCBkZXZpY2UsIDggc2luZ2xlIGFuYWxvZyBvdXRwdXRzIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMDE2CQkJIk1FLTYwMDAvMTYgZGV2aWNlLCAxNiBzaW5nbGUgYW5hbG9nIG91dHB1dHMiCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSTQJCQkiTUUtNjAwMEkvNCBpc29sYXRlZCBkZXZpY2UsIDQgc2luZ2xlIGFuYWxvZyBvdXRwdXRzIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMEk4CQkJIk1FLTYwMDBJLzggaXNvbGF0ZWQgZGV2aWNlLCA4IHNpbmdsZSBhbmFsb2cgb3V0cHV0cyIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJMTYJCQkiTUUtNjAwMEkvMTYgaXNvbGF0ZWQgZGV2aWNlLCAxNiBzaW5nbGUgYW5hbG9nIG91dHB1dHMiCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSVNMRTQJCSJNRS02MDAwSVNMRS80IGlzbGUgZGV2aWNlLCA0IHNpbmdsZSBhbmFsb2cgb3V0cHV0cyIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJU0xFOAkJIk1FLTYwMDBJU0xFLzggaXNsZSBkZXZpY2UsIDggc2luZ2xlIGFuYWxvZyBvdXRwdXRzIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMElTTEUxNgkJIk1FLTYwMDBJU0xFLzE2IGlzbGUgZGV2aWNlLCAxNiBzaW5nbGUgYW5hbG9nIG91dHB1dHMiCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwNAkJCSJNRS02MTAwLzQgZGV2aWNlLCA0IHN0cmVhbWluZyBhbmFsb2cgb3V0cHV0cy4iCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwOAkJCSJNRS02MTAwLzggZGV2aWNlLCA0IHN0cmVhbWluZywgNCBzaW5nbGUgYW5hbG9nIG91dHB1dHMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMDE2CQkJIk1FLTYxMDAvMTYgZGV2aWNlLCA0IHN0cmVhbWluZywgMTIgc2luZ2xlIGFuYWxvZyBvdXRwdXRzLiIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJNAkJCSJNRS02MTAwSS80IGlzb2xhdGVkIGRldmljZSwgNCBzdHJlYW1pbmcgYW5hbG9nIG91dHB1dHMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMEk4CQkJIk1FLTYxMDBJLzggaXNvbGF0ZWQgZGV2aWNlLCA0IHN0cmVhbWluZywgNCBzaW5nbGUgYW5hbG9nIG91dHB1dHMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMEkxNgkJCSJNRS02MTAwSS8xNiBpc29sYXRlZCBkZXZpY2UsIDQgc3RyZWFtaW5nLCAxMiBzaW5nbGUgYW5hbG9nIG91dHB1dHMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMElTTEU0CQkiTUUtNjEwMElTTEUvNCBpc2xlIGRldmljZSwgNCBzdHJlYW1pbmcgYW5hbG9nIG91dHB1dHMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMElTTEU4CQkiTUUtNjEwMElTTEUvOCBpc2xlIGRldmljZSwgNCBzdHJlYW1pbmcsIDQgc2luZ2xlIGFuYWxvZyBvdXRwdXRzLiIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJU0xFMTYJCSJNRS02MTAwSVNMRS8xNiBpc2xlIGRldmljZSwgNCBzdHJlYW1pbmcsIDEyIHNpbmdsZSBhbmFsb2cgb3V0cHV0cy4iCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwNERJTwkJIk1FLTYwMDAvNC9ESU8gZGV2aWNlLCA0IHNpbmdsZSBhbmFsb2cgb3V0cHV0cywgMTYgZGlnaXRhbCBpL28gbGluZXMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMDhESU8JCSJNRS02MDAwLzgvRElPIGRldmljZSwgOCBzaW5nbGUgYW5hbG9nIG91dHB1dHMsIDE2IGRpZ2l0YWwgaS9vIGxpbmVzLiIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDAxNkRJTwkJIk1FLTYwMDAvMTYvRElPIGRldmljZSwgOCBzaW5nbGUgYW5hbG9nIG91dHB1dHMsIDE2IGRpZ2l0YWwgaS9vIGxpbmVzLiIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJNERJTwkJIk1FLTYwMDBJLzQvRElPIGlzb2xhdGVkIGRldmljZSwgNCBzaW5nbGUgYW5hbG9nIG91dHB1dHMsIDE2IGRpZ2l0YWwgaS9vIGxpbmVzLiIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJOERJTwkJIk1FLTYwMDBJLzgvRElPIGlzb2xhdGVkIGRldmljZSwgOCBzaW5nbGUgYW5hbG9nIG91dHB1dHMsIDE2IGRpZ2l0YWwgaS9vIGxpbmVzLiIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJMTZESU8JCSJNRS02MDAwSS8xNi9ESU8gaXNvbGF0ZWQgZGV2aWNlLCAxNiBzaW5nbGUgYW5hbG9nIG91dHB1dHMsIDE2IGRpZ2l0YWwgaS9vIGxpbmVzLiIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYwMDBJU0xFNERJTwkiTUUtNjAwMElTTEUvNC9ESU8gaXNsZSBkZXZpY2UsIDQgc2luZ2xlIGFuYWxvZyBvdXRwdXRzLCAxNiBkaWdpdGFsIGkvbyBsaW5lcy4iCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MDAwSVNMRThESU8JIk1FLTYwMDBJU0xFLzgvRElPIGlzbGUgZGV2aWNlLCA4IHNpbmdsZSBhbmFsb2cgb3V0cHV0cywgMTYgZGlnaXRhbCBpL28gbGluZXMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjAwMElTTEUxNkRJTwkiTUUtNjAwMElTTEUvMTYvRElPIGlzbGUgZGV2aWNlLCAxNiBzaW5nbGUgYW5hbG9nIG91dHB1dHMsIDE2IGRpZ2l0YWwgaS9vIGxpbmVzLiIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDA0RElPCQkiTUUtNjEwMC80L0RJTyBkZXZpY2UsIDQgc3RyZWFtaW5nIGFuYWxvZyBvdXRwdXRzLCAxNiBkaWdpdGFsIGkvbyBsaW5lcy4iCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwOERJTwkJIk1FLTYxMDAvOC9ESU8gZGV2aWNlLCA0IHN0cmVhbWluZywgNCBzaW5nbGUgYW5hbG9nIG91dHB1dHMsIDE2IGRpZ2l0YWwgaS9vIGxpbmVzLiIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDAxNkRJTwkJIk1FLTYxMDAvMTYvRElPIGRldmljZSwgNCBzdHJlYW1pbmcsIDEyIHNpbmdsZSBhbmFsb2cgb3V0cHV0cywgMTYgZGlnaXRhbCBpL28gbGluZXMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMEk0RElPCQkiTUUtNjEwMEkvNC9ESU8gaXNvbGF0ZWQgZGV2aWNlLCA0IHN0cmVhbWluZyBhbmFsb2cgb3V0cHV0cywgMTYgZGlnaXRhbCBpL28gbGluZXMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMEk4RElPCQkiTUUtNjEwMEkvOC9ESU8gaXNvbGF0ZWQgZGV2aWNlLCA0IHN0cmVhbWluZywgNCBzaW5nbGUgYW5hbG9nIG91dHB1dHMsIDE2IGRpZ2l0YWwgaS9vIGxpbmVzLiIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYxMDBJMTZESU8JCSJNRS02MTAwSS8xNi9ESU8gaXNvbGF0ZWQgZGV2aWNlLCA0IHN0cmVhbWluZywgMTIgc2luZ2xlIGFuYWxvZyBvdXRwdXRzLCAxNiBkaWdpdGFsIGkvbyBsaW5lcy4iCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSVNMRTRESU8JIk1FLTYxMDBJU0xFLzQvRElPIGlzbGUgZGV2aWNlLCA0IHN0cmVhbWluZyBhbmFsb2cgb3V0cHV0cywgMTYgZGlnaXRhbCBpL28gbGluZXMuIgorI2RlZmluZSBNRTYwMDBfREVTQ1JJUFRJT05fREVWSUNFX01FNjEwMElTTEU4RElPCSJNRS02MTAwSVNMRS84L0RJTyBpc2xlIGRldmljZSwgNCBzdHJlYW1pbmcsIDQgc2luZ2xlIGFuYWxvZyBvdXRwdXRzLCAxNiBkaWdpdGFsIGkvbyBsaW5lcy4iCisjZGVmaW5lIE1FNjAwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU2MTAwSVNMRTE2RElPCSJNRS02MTAwSVNMRS8xNi9ESU8gaXNsZSBkZXZpY2UsIDQgc3RyZWFtaW5nLCAxMiBzaW5nbGUgYW5hbG9nIG91dHB1dHMsIDE2IGRpZ2l0YWwgaS9vIGxpbmVzLiIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYyMDBJOURJTwkJIk1FLTYyMDBJLzkvRElPIGlzb2xhdGVkIGRldmljZSwgOSBzaW5nbGUgYW5hbG9nIG91dHB1dHMsIDE2IGRpZ2l0YWwgaS9vIGxpbmVzLiIKKyNkZWZpbmUgTUU2MDAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTYzMDBJOURJTwkJIk1FLTYzMDBJLzkvRElPIGlzb2xhdGVkIGRldmljZSwgNCBzdHJlYW1pbmcsIDUgc2luZ2xlIGFuYWxvZyBvdXRwdXRzLCAxNiBkaWdpdGFsIGkvbyBsaW5lcy4iCisKKy8qIE1FLTYzMCBkZWZpbmVzICovCisjZGVmaW5lIE1FMDYwMF9OQU1FX0RSSVZFUgkJCQkJCQkiTUUtMDYwMCIKKworI2RlZmluZSBNRTA2MDBfTkFNRV9ERVZJQ0VfTUUwNjMwCQkJCQkiTUUtNjMwIgorCisjZGVmaW5lIE1FMDYwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUwNjMwCQkJIk1FLTYzMCBkZXZpY2UsIHVwIHRvIDE2IHJlbGF5LCA4IGRpZ2l0YWwgdHRsIGlucHV0IGxpbmVzLCA4IGlzb2xhdGVkIGRpZ2l0YWwgaW5wdXQgbGluZXMsIDE2IGRpZ2l0YWwgaS9vIGxpbmVzLCAyIGV4dGVybmFsIGludGVycnVwdHMuIgorCisvKiBNRS04MTAwIGRlZmluZXMgKi8KKyNkZWZpbmUgTUU4MTAwX05BTUVfRFJJVkVSCQkJCQkJCSJNRS04MTAwIgorCisjZGVmaW5lIE1FODEwMF9OQU1FX0RFVklDRV9NRTgxMDBBCQkJCQkiTUUtODEwMEEiCisjZGVmaW5lIE1FODEwMF9OQU1FX0RFVklDRV9NRTgxMDBCCQkJCQkiTUUtODEwMEIiCisKKyNkZWZpbmUgTUU4MTAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTgxMDBBCQkJIk1FLTgxMDBBIG9wdG8gaXNvbGF0ZWQgZGV2aWNlLCAxNiBkaWdpdGFsIGlucHV0IGxpbmVzLCAxNiBkaWdpdGFsIG91dHB1dCBsaW5lcy4iCisjZGVmaW5lIE1FODEwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUU4MTAwQgkJCSJNRS04MTAwQiBvcHRvIGlzb2xhdGVkIGRldmljZSwgMzIgZGlnaXRhbCBpbnB1dCBsaW5lcywgMzIgZGlnaXRhbCBvdXRwdXQgbGluZXMsIDMgY291bnRlcnMuIgorCisvKiBNRS04MjAwIGRlZmluZXMgKi8KKyNkZWZpbmUgTUU4MjAwX05BTUVfRFJJVkVSCQkJCQkJCSJNRS04MjAwIgorCisjZGVmaW5lIE1FODIwMF9OQU1FX0RFVklDRV9NRTgyMDBBCQkJCQkiTUUtODIwMEEiCisjZGVmaW5lIE1FODIwMF9OQU1FX0RFVklDRV9NRTgyMDBCCQkJCQkiTUUtODIwMEIiCisKKyNkZWZpbmUgTUU4MjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTgyMDBBCQkJIk1FLTgyMDBBIG9wdG8gaXNvbGF0ZWQgZGV2aWNlLCA4IGRpZ2l0YWwgb3V0cHV0IGxpbmVzLCA4IGRpZ2l0YWwgaW5wdXQgbGluZXMsIDE2IGRpZ2l0YWwgaS9vIGxpbmVzLiIKKyNkZWZpbmUgTUU4MjAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTgyMDBCCQkJIk1FLTgyMDBCIG9wdG8gaXNvbGF0ZWQgZGV2aWNlLCAxNiBkaWdpdGFsIG91dHB1dCBsaW5lcywgMTYgZGlnaXRhbCBpbnB1dCBsaW5lcywgMTYgZGlnaXRhbCBpL28gbGluZXMuIgorCisvKiBNRS0wOTAwIGRlZmluZXMgKi8KKyNkZWZpbmUgTUUwOTAwX05BTUVfRFJJVkVSCQkJCQkJCSJNRS0wOTAwIgorCisjZGVmaW5lIE1FMDkwMF9OQU1FX0RFVklDRV9NRTA5NDAJCQkJCSJNRS05NCIKKyNkZWZpbmUgTUUwOTAwX05BTUVfREVWSUNFX01FMDk1MAkJCQkJIk1FLTk1IgorI2RlZmluZSBNRTA5MDBfTkFNRV9ERVZJQ0VfTUUwOTYwCQkJCQkiTUUtOTYiCisKKyNkZWZpbmUgTUUwOTAwX0RFU0NSSVBUSU9OX0RFVklDRV9NRTA5NDAJCQkiTUUtOTQgZGV2aWNlLCAxNiBkaWdpdGFsIGlucHV0IGxpbmVzLCAyIGV4dGVybmFsIGludGVycnVwdCBsaW5lcy4iCisjZGVmaW5lIE1FMDkwMF9ERVNDUklQVElPTl9ERVZJQ0VfTUUwOTUwCQkJIk1FLTk1IGRldmljZSwgMTYgZGlnaXRhbCBvdXRwdXQgbGluZXMuIgorI2RlZmluZSBNRTA5MDBfREVTQ1JJUFRJT05fREVWSUNFX01FMDk2MAkJCSJNRS05NiBkZXZpY2UsIDggZGlnaXRhbCBpbnB1dCBsaW5lcywgOCBkaWdpdGFsIG91dHB1dCBsaW5lcywgMiBleHRlcm5hbCBpbnRlcnJ1cHQgbGluZXMuIgorCisvKiBNRS1EVU1NWSBkZWZpbmVzICovCisjZGVmaW5lIE1FRFVNTVlfTkFNRV9EUklWRVIJCQkJCQkJIk1FLUR1bW15IgorCisvKiBNRVBISVNUT19TMSBkZWZpbmVzICovCisvKgorI2RlZmluZSBNRVBISVNUT19TMV9OQU1FX0RSSVZFUgkJCQkJCSJNRXBoaXN0byBTY29wZSAxIgorI2RlZmluZSBNRVBISVNUT19TMV9OQU1FX0RFVklDRQkJCQkJCSJNRXBoaXN0byBTY29wZSAxIgorI2RlZmluZSBNRVBISVNUT19TMV9ERVNDUklQVElPTl9ERVZJQ0UJCQkJIk1FcGhpc3RvIFNjb3BlIDEgZGV2aWNlLCAyIGFuYWxvZyBpbnB1dHMsIDI0IGRpZ2l0YWwgaS9vLiIKKyovCisvKiBFcnJvciBkZWZpbmVzICovCisjZGVmaW5lIEVNUFRZX05BTUVfRFJJVkVSCQkJCQkJCSJNRS0/Pz8iCisjZGVmaW5lIEVNUFRZX05BTUVfREVWSUNFCQkJCQkJCSJNRS0/Pz8iCisjZGVmaW5lIEVNUFRZX0RFU0NSSVBUSU9OX0RFVklDRQkJCQkJIk1FLT8/PyB1bmtub3duIGRldmljZSIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVpb2N0bC5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21laW9jdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGM3MTlmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21laW9jdGwuaApAQCAtMCwwICsxLDUxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogU291cmNlIEZpbGUgOiBtZWlvY3RsLmgKKyAqIEF1dGhvciAgICAgIDogR0cgKEd1ZW50ZXIgR2ViaGFyZHQpICA8Zy5nZWJoYXJkdEBtZWlsaGF1cy5kZT4KKyAqLworCisjaWZuZGVmIF9NRUlPQ1RMX0hfCisjZGVmaW5lIF9NRUlPQ1RMX0hfCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBUeXBlcyBmb3IgdGhlIGlucHV0L291dHB1dCBpb2N0bHMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwordHlwZWRlZiBzdHJ1Y3QgbWVfaW9faXJxX3N0YXJ0IHsKKwlpbnQgZGV2aWNlOworCWludCBzdWJkZXZpY2U7CisJaW50IGNoYW5uZWw7CisJaW50IGlycV9zb3VyY2U7CisJaW50IGlycV9lZGdlOworCWludCBpcnFfYXJnOworCWludCBmbGFnczsKKwlpbnQgZXJybm87Cit9IG1lX2lvX2lycV9zdGFydF90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX2lvX2lycV93YWl0IHsKKwlpbnQgZGV2aWNlOworCWludCBzdWJkZXZpY2U7CisJaW50IGNoYW5uZWw7CisJaW50IGlycV9jb3VudDsKKwlpbnQgdmFsdWU7CisJaW50IHRpbWVfb3V0OworCWludCBmbGFnczsKKwlpbnQgZXJybm87Cit9IG1lX2lvX2lycV93YWl0X3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfaW9faXJxX3N0b3AgeworCWludCBkZXZpY2U7CisJaW50IHN1YmRldmljZTsKKwlpbnQgY2hhbm5lbDsKKwlpbnQgZmxhZ3M7CisJaW50IGVycm5vOworfSBtZV9pb19pcnFfc3RvcF90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX2lvX3Jlc2V0X2RldmljZSB7CisJaW50IGRldmljZTsKKwlpbnQgZmxhZ3M7CisJaW50IGVycm5vOworfSBtZV9pb19yZXNldF9kZXZpY2VfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9pb19yZXNldF9zdWJkZXZpY2UgeworCWludCBkZXZpY2U7CisJaW50IHN1YmRldmljZTsKKwlpbnQgZmxhZ3M7CisJaW50IGVycm5vOworfSBtZV9pb19yZXNldF9zdWJkZXZpY2VfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9pb19zaW5nbGVfY29uZmlnIHsKKwlpbnQgZGV2aWNlOworCWludCBzdWJkZXZpY2U7CisJaW50IGNoYW5uZWw7CisJaW50IHNpbmdsZV9jb25maWc7CisJaW50IHJlZjsKKwlpbnQgdHJpZ19jaGFuOworCWludCB0cmlnX3R5cGU7CisJaW50IHRyaWdfZWRnZTsKKwlpbnQgZmxhZ3M7CisJaW50IGVycm5vOworfSBtZV9pb19zaW5nbGVfY29uZmlnX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfaW9fc2luZ2xlIHsKKwltZUlPU2luZ2xlX3QgKnNpbmdsZV9saXN0OworCWludCBjb3VudDsKKwlpbnQgZmxhZ3M7CisJaW50IGVycm5vOworfSBtZV9pb19zaW5nbGVfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9pb19zdHJlYW1fY29uZmlnIHsKKwlpbnQgZGV2aWNlOworCWludCBzdWJkZXZpY2U7CisJbWVJT1N0cmVhbUNvbmZpZ190ICpjb25maWdfbGlzdDsKKwlpbnQgY291bnQ7CisJbWVJT1N0cmVhbVRyaWdnZXJfdCB0cmlnZ2VyOworCWludCBmaWZvX2lycV90aHJlc2hvbGQ7CisJaW50IGZsYWdzOworCWludCBlcnJubzsKK30gbWVfaW9fc3RyZWFtX2NvbmZpZ190OworCisKK3R5cGVkZWYgc3RydWN0IG1lX2lvX3N0cmVhbV9uZXdfdmFsdWVzIHsKKwlpbnQgZGV2aWNlOworCWludCBzdWJkZXZpY2U7CisJaW50IHRpbWVfb3V0OworCWludCBjb3VudDsKKwlpbnQgZmxhZ3M7CisJaW50IGVycm5vOworfSBtZV9pb19zdHJlYW1fbmV3X3ZhbHVlc190OworCisKK3R5cGVkZWYgc3RydWN0IG1lX2lvX3N0cmVhbV9yZWFkIHsKKwlpbnQgZGV2aWNlOworCWludCBzdWJkZXZpY2U7CisJaW50IHJlYWRfbW9kZTsKKwlpbnQgKnZhbHVlczsKKwlpbnQgY291bnQ7CisJaW50IGZsYWdzOworCWludCBlcnJubzsKK30gbWVfaW9fc3RyZWFtX3JlYWRfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9pb19zdHJlYW1fc3RhcnQgeworCW1lSU9TdHJlYW1TdGFydF90ICpzdGFydF9saXN0OworCWludCBjb3VudDsKKwlpbnQgZmxhZ3M7CisJaW50IGVycm5vOworfSBtZV9pb19zdHJlYW1fc3RhcnRfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9pb19zdHJlYW1fc3RhdHVzIHsKKwlpbnQgZGV2aWNlOworCWludCBzdWJkZXZpY2U7CisJaW50IHdhaXQ7CisJaW50IHN0YXR1czsKKwlpbnQgY291bnQ7CisJaW50IGZsYWdzOworCWludCBlcnJubzsKK30gbWVfaW9fc3RyZWFtX3N0YXR1c190OworCisKK3R5cGVkZWYgc3RydWN0IG1lX2lvX3N0cmVhbV9zdG9wIHsKKwltZUlPU3RyZWFtU3RvcF90ICpzdG9wX2xpc3Q7CisJaW50IGNvdW50OworCWludCBmbGFnczsKKwlpbnQgZXJybm87Cit9IG1lX2lvX3N0cmVhbV9zdG9wX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfaW9fc3RyZWFtX3dyaXRlIHsKKwlpbnQgZGV2aWNlOworCWludCBzdWJkZXZpY2U7CisJaW50IHdyaXRlX21vZGU7CisJaW50ICp2YWx1ZXM7CisJaW50IGNvdW50OworCWludCBmbGFnczsKKwlpbnQgZXJybm87Cit9IG1lX2lvX3N0cmVhbV93cml0ZV90OworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgVHlwZXMgZm9yIHRoZSBsb2NrIGlvY3RscworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCit0eXBlZGVmIHN0cnVjdCBtZV9sb2NrX2RldmljZSB7CisJaW50IGRldmljZTsKKwlpbnQgbG9jazsKKwlpbnQgZmxhZ3M7CisJaW50IGVycm5vOworfSBtZV9sb2NrX2RldmljZV90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX2xvY2tfZHJpdmVyIHsKKwlpbnQgZmxhZ3M7CisJaW50IGxvY2s7CisJaW50IGVycm5vOworfSBtZV9sb2NrX2RyaXZlcl90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX2xvY2tfc3ViZGV2aWNlIHsKKwlpbnQgZGV2aWNlOworCWludCBzdWJkZXZpY2U7CisJaW50IGxvY2s7CisJaW50IGZsYWdzOworCWludCBlcnJubzsKK30gbWVfbG9ja19zdWJkZXZpY2VfdDsKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFR5cGVzIGZvciB0aGUgcXVlcnkgaW9jdGxzCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3R5cGVkZWYgc3RydWN0IG1lX3F1ZXJ5X2luZm9fZGV2aWNlIHsKKwlpbnQgZGV2aWNlOworCWludCB2ZW5kb3JfaWQ7CisJaW50IGRldmljZV9pZDsKKwlpbnQgc2VyaWFsX25vOworCWludCBidXNfdHlwZTsKKwlpbnQgYnVzX25vOworCWludCBkZXZfbm87CisJaW50IGZ1bmNfbm87CisJaW50IHBsdWdnZWQ7CisJaW50IGVycm5vOworfSBtZV9xdWVyeV9pbmZvX2RldmljZV90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX3F1ZXJ5X2Rlc2NyaXB0aW9uX2RldmljZSB7CisJaW50IGRldmljZTsKKwljaGFyICpuYW1lOworCWludCBjb3VudDsKKwlpbnQgZXJybm87Cit9IG1lX3F1ZXJ5X2Rlc2NyaXB0aW9uX2RldmljZV90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX3F1ZXJ5X25hbWVfZGV2aWNlIHsKKwlpbnQgZGV2aWNlOworCWNoYXIgKm5hbWU7CisJaW50IGNvdW50OworCWludCBlcnJubzsKK30gbWVfcXVlcnlfbmFtZV9kZXZpY2VfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9xdWVyeV9uYW1lX2RldmljZV9kcml2ZXIgeworCWludCBkZXZpY2U7CisJY2hhciAqbmFtZTsKKwlpbnQgY291bnQ7CisJaW50IGVycm5vOworfSBtZV9xdWVyeV9uYW1lX2RldmljZV9kcml2ZXJfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9xdWVyeV92ZXJzaW9uX21haW5fZHJpdmVyIHsKKwlpbnQgdmVyc2lvbjsKKwlpbnQgZXJybm87Cit9IG1lX3F1ZXJ5X3ZlcnNpb25fbWFpbl9kcml2ZXJfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9xdWVyeV92ZXJzaW9uX2RldmljZV9kcml2ZXIgeworCWludCBkZXZpY2U7CisJaW50IHZlcnNpb247CisJaW50IGVycm5vOworfSBtZV9xdWVyeV92ZXJzaW9uX2RldmljZV9kcml2ZXJfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9xdWVyeV9udW1iZXJfZGV2aWNlcyB7CisJaW50IG51bWJlcjsKKwlpbnQgZXJybm87Cit9IG1lX3F1ZXJ5X251bWJlcl9kZXZpY2VzX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfcXVlcnlfbnVtYmVyX3N1YmRldmljZXMgeworCWludCBkZXZpY2U7CisJaW50IG51bWJlcjsKKwlpbnQgZXJybm87Cit9IG1lX3F1ZXJ5X251bWJlcl9zdWJkZXZpY2VzX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfcXVlcnlfbnVtYmVyX2NoYW5uZWxzIHsKKwlpbnQgZGV2aWNlOworCWludCBzdWJkZXZpY2U7CisJaW50IG51bWJlcjsKKwlpbnQgZXJybm87Cit9IG1lX3F1ZXJ5X251bWJlcl9jaGFubmVsc190OworCisKK3R5cGVkZWYgc3RydWN0IG1lX3F1ZXJ5X251bWJlcl9yYW5nZXMgeworCWludCBkZXZpY2U7CisJaW50IHN1YmRldmljZTsKKwlpbnQgY2hhbm5lbDsKKwlpbnQgdW5pdDsKKwlpbnQgbnVtYmVyOworCWludCBlcnJubzsKK30gbWVfcXVlcnlfbnVtYmVyX3Jhbmdlc190OworCisKK3R5cGVkZWYgc3RydWN0IG1lX3F1ZXJ5X3N1YmRldmljZV9ieV90eXBlIHsKKwlpbnQgZGV2aWNlOworCWludCBzdGFydF9zdWJkZXZpY2U7CisJaW50IHR5cGU7CisJaW50IHN1YnR5cGU7CisJaW50IHN1YmRldmljZTsKKwlpbnQgZXJybm87Cit9IG1lX3F1ZXJ5X3N1YmRldmljZV9ieV90eXBlX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfcXVlcnlfc3ViZGV2aWNlX3R5cGUgeworCWludCBkZXZpY2U7CisJaW50IHN1YmRldmljZTsKKwlpbnQgdHlwZTsKKwlpbnQgc3VidHlwZTsKKwlpbnQgZXJybm87Cit9IG1lX3F1ZXJ5X3N1YmRldmljZV90eXBlX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfcXVlcnlfc3ViZGV2aWNlX2NhcHMgeworCWludCBkZXZpY2U7CisJaW50IHN1YmRldmljZTsKKwlpbnQgY2FwczsKKwlpbnQgZXJybm87Cit9IG1lX3F1ZXJ5X3N1YmRldmljZV9jYXBzX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncyB7CisJaW50IGRldmljZTsKKwlpbnQgc3ViZGV2aWNlOworCWludCBjYXA7CisJaW50IGFyZ3NbOF07CisJaW50IGNvdW50OworCWludCBlcnJubzsKK30gbWVfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJnc190OworCisKK3R5cGVkZWYgc3RydWN0IG1lX3F1ZXJ5X3RpbWVyIHsKKwlpbnQgZGV2aWNlOworCWludCBzdWJkZXZpY2U7CisJaW50IHRpbWVyOworCWludCBiYXNlX2ZyZXF1ZW5jeTsKKwlsb25nIGxvbmcgbWluX3RpY2tzOworCWxvbmcgbG9uZyBtYXhfdGlja3M7CisJaW50IGVycm5vOworfSBtZV9xdWVyeV90aW1lcl90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXggeworCWludCBkZXZpY2U7CisJaW50IHN1YmRldmljZTsKKwlpbnQgY2hhbm5lbDsKKwlpbnQgdW5pdDsKKwlpbnQgbWluOworCWludCBtYXg7CisJaW50IG1heF9kYXRhOworCWludCByYW5nZTsKKwlpbnQgZXJybm87Cit9IG1lX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXhfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9xdWVyeV9yYW5nZV9pbmZvIHsKKwlpbnQgZGV2aWNlOworCWludCBzdWJkZXZpY2U7CisJaW50IGNoYW5uZWw7CisJaW50IHVuaXQ7CisJaW50IHJhbmdlOworCWludCBtaW47CisJaW50IG1heDsKKwlpbnQgbWF4X2RhdGE7CisJaW50IGVycm5vOworfSBtZV9xdWVyeV9yYW5nZV9pbmZvX3Q7CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBUeXBlcyBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gaW9jdGxzCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3R5cGVkZWYgc3RydWN0IG1lX2NmZ190Y3BpcF9sb2NhdGlvbiB7CisJaW50IGFjY2Vzc190eXBlOworCWNoYXIgKnJlbW90ZV9ob3N0OworCWludCByZW1vdGVfZGV2aWNlX251bWJlcjsKK30gbWVfY2ZnX3RjcGlwX2xvY2F0aW9uX3Q7CisKKwordHlwZWRlZiB1bmlvbiBtZV9jZmdfdGNwaXAgeworCWludCBhY2Nlc3NfdHlwZTsKKwltZV9jZmdfdGNwaXBfbG9jYXRpb25fdCBsb2NhdGlvbjsKK30gbWVfY2ZnX3RjcGlwX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfY2ZnX3BjaV9od19sb2NhdGlvbiB7CisJdW5zaWduZWQgaW50IGJ1c190eXBlOworCXVuc2lnbmVkIGludCBidXNfbm87CisJdW5zaWduZWQgaW50IGRldmljZV9ubzsKKwl1bnNpZ25lZCBpbnQgZnVuY3Rpb25fbm87Cit9IG1lX2NmZ19wY2lfaHdfbG9jYXRpb25fdDsKKworLyoKK3R5cGVkZWYgc3RydWN0IG1lX2NmZ191c2JfaHdfbG9jYXRpb24geworCXVuc2lnbmVkIGludCBidXNfdHlwZTsKKwl1bnNpZ25lZCBpbnQgcm9vdF9odWJfbm87Cit9IG1lX2NmZ191c2JfaHdfbG9jYXRpb25fdDsKKyovCisKK3R5cGVkZWYgdW5pb24gbWVfY2ZnX2h3X2xvY2F0aW9uIHsKKwl1bnNpZ25lZCBpbnQgYnVzX3R5cGU7CisJbWVfY2ZnX3BjaV9od19sb2NhdGlvbl90IHBjaTsKKy8vCW1lX2NmZ191c2JfaHdfbG9jYXRpb25fdCB1c2I7Cit9IG1lX2NmZ19od19sb2NhdGlvbl90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX2NmZ19kZXZpY2VfaW5mbyB7CisJdW5zaWduZWQgaW50IHZlbmRvcl9pZDsKKwl1bnNpZ25lZCBpbnQgZGV2aWNlX2lkOworCXVuc2lnbmVkIGludCBzZXJpYWxfbm87CisJbWVfY2ZnX2h3X2xvY2F0aW9uX3QgaHdfbG9jYXRpb247Cit9IG1lX2NmZ19kZXZpY2VfaW5mb190OworCisKK3R5cGVkZWYgc3RydWN0IG1lX2NmZ19zdWJkZXZpY2VfaW5mbyB7CisJaW50IHR5cGU7CisJaW50IHN1Yl90eXBlOworCXVuc2lnbmVkIGludCBudW1iZXJfY2hhbm5lbHM7Cit9IG1lX2NmZ19zdWJkZXZpY2VfaW5mb190OworCisKK3R5cGVkZWYgc3RydWN0IG1lX2NmZ19yYW5nZV9lbnRyeSB7CisJaW50IHVuaXQ7CisJZG91YmxlIG1pbjsKKwlkb3VibGUgbWF4OworCXVuc2lnbmVkIGludCBtYXhfZGF0YTsKK30gbWVfY2ZnX3JhbmdlX2VudHJ5X3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVfY2ZnX211eDMybV9kZXZpY2UgeworCWludCB0eXBlOworCWludCB0aW1lZDsKKwl1bnNpZ25lZCBpbnQgYWlfY2hhbm5lbDsKKwl1bnNpZ25lZCBpbnQgZGlvX2RldmljZTsKKwl1bnNpZ25lZCBpbnQgZGlvX3N1YmRldmljZTsKKwl1bnNpZ25lZCBpbnQgdGltZXJfZGV2aWNlOworCXVuc2lnbmVkIGludCB0aW1lcl9zdWJkZXZpY2U7CisJdW5zaWduZWQgaW50IG11eDMyc19jb3VudDsKK30gbWVfY2ZnX211eDMybV9kZXZpY2VfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9jZmdfZGVtdXgzMl9kZXZpY2UgeworCWludCB0eXBlOworCWludCB0aW1lZDsKKwl1bnNpZ25lZCBpbnQgYW9fY2hhbm5lbDsKKwl1bnNpZ25lZCBpbnQgZGlvX2RldmljZTsKKwl1bnNpZ25lZCBpbnQgZGlvX3N1YmRldmljZTsKKwl1bnNpZ25lZCBpbnQgdGltZXJfZGV2aWNlOworCXVuc2lnbmVkIGludCB0aW1lcl9zdWJkZXZpY2U7Cit9IG1lX2NmZ19kZW11eDMyX2RldmljZV90OworCisKK3R5cGVkZWYgdW5pb24gbWVfY2ZnX2V4dGVybmFsX2RldmljZSB7CisJaW50IHR5cGU7CisJbWVfY2ZnX211eDMybV9kZXZpY2VfdCBtdXgzMm07CisJbWVfY2ZnX2RlbXV4MzJfZGV2aWNlX3QgZGVtdXgzMjsKK30gbWVfY2ZnX2V4dGVybmFsX2RldmljZV90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX2NmZ19zdWJkZXZpY2VfZW50cnkgeworCW1lX2NmZ19zdWJkZXZpY2VfaW5mb190IGluZm87CisJbWVfY2ZnX3JhbmdlX2VudHJ5X3QgKnJhbmdlX2xpc3Q7CisJdW5zaWduZWQgaW50IGNvdW50OworCWludCBsb2NrZWQ7CisJbWVfY2ZnX2V4dGVybmFsX2RldmljZV90IGV4dGVybmFsX2RldmljZTsKK30gbWVfY2ZnX3N1YmRldmljZV9lbnRyeV90OworCisKK3R5cGVkZWYgc3RydWN0IG1lX2NmZ19kZXZpY2VfZW50cnkgeworCW1lX2NmZ190Y3BpcF90IHRjcGlwOworCW1lX2NmZ19kZXZpY2VfaW5mb190IGluZm87CisJbWVfY2ZnX3N1YmRldmljZV9lbnRyeV90ICpzdWJkZXZpY2VfbGlzdDsKKwl1bnNpZ25lZCBpbnQgY291bnQ7Cit9IG1lX2NmZ19kZXZpY2VfZW50cnlfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZV9jb25maWdfbG9hZCB7CisJbWVfY2ZnX2RldmljZV9lbnRyeV90ICpkZXZpY2VfbGlzdDsKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisJaW50IGVycm5vOworfSBtZV9jb25maWdfbG9hZF90OworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgVGhlIGlvY3RscyBvZiB0aGUgYm9hcmQKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBNRU1BSU5fTUFHSUMgJ3knCisKKyNkZWZpbmUgTUVfSU9fSVJRX0VOQUJMRQkJCQlfSU9SIChNRU1BSU5fTUFHSUMsIDEsIG1lX2lvX2lycV9zdGFydF90KQorI2RlZmluZSBNRV9JT19JUlFfV0FJVAkJCQkJX0lPUiAoTUVNQUlOX01BR0lDLCAyLCBtZV9pb19pcnFfd2FpdF90KQorI2RlZmluZSBNRV9JT19JUlFfRElTQUJMRQkJCQlfSU9SIChNRU1BSU5fTUFHSUMsIDMsIG1lX2lvX2lycV9zdG9wX3QpCisKKyNkZWZpbmUgTUVfSU9fUkVTRVRfREVWSUNFCQkJCV9JT1cgKE1FTUFJTl9NQUdJQywgNCwgbWVfaW9fcmVzZXRfZGV2aWNlX3QpCisjZGVmaW5lIE1FX0lPX1JFU0VUX1NVQkRFVklDRQkJCV9JT1cgKE1FTUFJTl9NQUdJQywgNSwgbWVfaW9fcmVzZXRfc3ViZGV2aWNlX3QpCisKKyNkZWZpbmUgTUVfSU9fU0lOR0xFCQkJCQlfSU9XUihNRU1BSU5fTUFHSUMsIDYsIG1lX2lvX3NpbmdsZV90KQorI2RlZmluZSBNRV9JT19TSU5HTEVfQ09ORklHCQkJCV9JT1cgKE1FTUFJTl9NQUdJQywgNywgbWVfaW9fc2luZ2xlX2NvbmZpZ190KQorCisjZGVmaW5lIE1FX0lPX1NUUkVBTV9DT05GSUcJCQkJX0lPVyAoTUVNQUlOX01BR0lDLCA4LCBtZV9pb19zdHJlYW1fY29uZmlnX3QpCisjZGVmaW5lIE1FX0lPX1NUUkVBTV9ORVdfVkFMVUVTCQkJX0lPUiAoTUVNQUlOX01BR0lDLCA5LCBtZV9pb19zdHJlYW1fbmV3X3ZhbHVlc190KQorI2RlZmluZSBNRV9JT19TVFJFQU1fUkVBRAkJCQlfSU9SIChNRU1BSU5fTUFHSUMsIDEwLCBtZV9pb19zdHJlYW1fcmVhZF90KQorI2RlZmluZSBNRV9JT19TVFJFQU1fU1RBUlQJCQkJX0lPVyAoTUVNQUlOX01BR0lDLCAxMSwgbWVfaW9fc3RyZWFtX3N0YXJ0X3QpCisjZGVmaW5lIE1FX0lPX1NUUkVBTV9TVEFUVVMJCQkJX0lPUiAoTUVNQUlOX01BR0lDLCAxMiwgbWVfaW9fc3RyZWFtX3N0YXR1c190KQorI2RlZmluZSBNRV9JT19TVFJFQU1fU1RPUAkJCQlfSU9XIChNRU1BSU5fTUFHSUMsIDEzLCBtZV9pb19zdHJlYW1fc3RvcF90KQorI2RlZmluZSBNRV9JT19TVFJFQU1fV1JJVEUJCQkJX0lPVyAoTUVNQUlOX01BR0lDLCAxNCwgbWVfaW9fc3RyZWFtX3dyaXRlX3QpCisKKyNkZWZpbmUgTUVfTE9DS19EUklWRVIJCQkJCV9JT1cgKE1FTUFJTl9NQUdJQywgMTUsIG1lX2xvY2tfZHJpdmVyX3QpCisjZGVmaW5lIE1FX0xPQ0tfREVWSUNFCQkJCQlfSU9XIChNRU1BSU5fTUFHSUMsIDE2LCBtZV9sb2NrX2RldmljZV90KQorI2RlZmluZSBNRV9MT0NLX1NVQkRFVklDRQkJCQlfSU9XIChNRU1BSU5fTUFHSUMsIDE3LCBtZV9sb2NrX3N1YmRldmljZV90KQorCisjZGVmaW5lIE1FX1FVRVJZX0RFU0NSSVBUSU9OX0RFVklDRQkJX0lPUiAoTUVNQUlOX01BR0lDLCAxOCwgbWVfcXVlcnlfZGVzY3JpcHRpb25fZGV2aWNlX3QpCisKKyNkZWZpbmUgTUVfUVVFUllfSU5GT19ERVZJQ0UJCQlfSU9SIChNRU1BSU5fTUFHSUMsIDE5LCBtZV9xdWVyeV9pbmZvX2RldmljZV90KQorCisjZGVmaW5lIE1FX1FVRVJZX05BTUVfREVWSUNFCQkJX0lPUiAoTUVNQUlOX01BR0lDLCAyMCwgbWVfcXVlcnlfbmFtZV9kZXZpY2VfdCkKKyNkZWZpbmUgTUVfUVVFUllfTkFNRV9ERVZJQ0VfRFJJVkVSCQlfSU9SIChNRU1BSU5fTUFHSUMsIDIxLCBtZV9xdWVyeV9uYW1lX2RldmljZV9kcml2ZXJfdCkKKworI2RlZmluZSBNRV9RVUVSWV9OVU1CRVJfREVWSUNFUwkJCV9JT1IgKE1FTUFJTl9NQUdJQywgMjIsIG1lX3F1ZXJ5X251bWJlcl9kZXZpY2VzX3QpCisjZGVmaW5lIE1FX1FVRVJZX05VTUJFUl9TVUJERVZJQ0VTCQlfSU9SIChNRU1BSU5fTUFHSUMsIDIzLCBtZV9xdWVyeV9udW1iZXJfc3ViZGV2aWNlc190KQorI2RlZmluZSBNRV9RVUVSWV9OVU1CRVJfQ0hBTk5FTFMJCV9JT1IgKE1FTUFJTl9NQUdJQywgMjQsIG1lX3F1ZXJ5X251bWJlcl9jaGFubmVsc190KQorI2RlZmluZSBNRV9RVUVSWV9OVU1CRVJfUkFOR0VTCQkJX0lPUiAoTUVNQUlOX01BR0lDLCAyNSwgbWVfcXVlcnlfbnVtYmVyX3Jhbmdlc190KQorCisjZGVmaW5lIE1FX1FVRVJZX1JBTkdFX0JZX01JTl9NQVgJCV9JT1IgKE1FTUFJTl9NQUdJQywgMjYsIG1lX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXhfdCkKKyNkZWZpbmUgTUVfUVVFUllfUkFOR0VfSU5GTwkJCQlfSU9SIChNRU1BSU5fTUFHSUMsIDI3LCBtZV9xdWVyeV9yYW5nZV9pbmZvX3QpCisKKyNkZWZpbmUgTUVfUVVFUllfU1VCREVWSUNFX0JZX1RZUEUJCV9JT1IgKE1FTUFJTl9NQUdJQywgMjgsIG1lX3F1ZXJ5X3N1YmRldmljZV9ieV90eXBlX3QpCisjZGVmaW5lIE1FX1FVRVJZX1NVQkRFVklDRV9UWVBFCQkJX0lPUiAoTUVNQUlOX01BR0lDLCAyOSwgbWVfcXVlcnlfc3ViZGV2aWNlX3R5cGVfdCkKKyNkZWZpbmUgTUVfUVVFUllfU1VCREVWSUNFX0NBUFMJCQlfSU9SIChNRU1BSU5fTUFHSUMsIDI5LCBtZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc190KQorI2RlZmluZSBNRV9RVUVSWV9TVUJERVZJQ0VfQ0FQU19BUkdTCV9JT1IgKE1FTUFJTl9NQUdJQywgMzAsIG1lX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3NfdCkKKworI2RlZmluZSBNRV9RVUVSWV9USU1FUgkJCQkJX0lPUiAoTUVNQUlOX01BR0lDLCAzMSwgbWVfcXVlcnlfdGltZXJfdCkKKworI2RlZmluZSBNRV9RVUVSWV9WRVJTSU9OX0RFVklDRV9EUklWRVIJX0lPUiAoTUVNQUlOX01BR0lDLCAzMiwgbWVfcXVlcnlfdmVyc2lvbl9kZXZpY2VfZHJpdmVyX3QpCisjZGVmaW5lIE1FX1FVRVJZX1ZFUlNJT05fTUFJTl9EUklWRVIJX0lPUiAoTUVNQUlOX01BR0lDLCAzMywgbWVfcXVlcnlfdmVyc2lvbl9tYWluX2RyaXZlcl90KQorCisjZGVmaW5lIE1FX0NPTkZJR19MT0FECQkJCQlfSU9XUihNRU1BSU5fTUFHSUMsIDM0LCBtZV9jb25maWdfbG9hZF90KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZW1haW4uYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZW1haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDlkMWE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lbWFpbi5jCkBAIC0wLDAgKzEsMjAyMiBAQAorLyoqCisgKiBAZmlsZSBtZW1haW4uYworICoKKyAqIEBicmllZiBNYWluIE1laWxoYXVzIGRldmljZSBkcml2ZXIuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKiBAYXV0aG9yIEtyenlzenRvZiBHYW50emtlCShrLmdhbnR6a2VAbWVpbGhhdXMuZGUpCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKyNpZm5kZWYgTU9EVUxFCisjICBkZWZpbmUgTU9EVUxFCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorLy8jaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgorCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWV0eXBlcy5oIgorI2luY2x1ZGUgIm1lZXJyb3IuaCIKKworI2luY2x1ZGUgIm1lZGVidWcuaCIKKyNpbmNsdWRlICJtZW1haW4uaCIKKyNpbmNsdWRlICJtZWRldmljZS5oIgorI2luY2x1ZGUgIm1laW9jdGwuaCIKKyNpbmNsdWRlICJtZWNvbW1vbi5oIgorCisvKiBNb2R1bGUgcGFyYW1ldGVycworKi8KKworI2lmZGVmIEJPU0NICitzdGF0aWMgdW5zaWduZWQgaW50IG1lX2Jvc2NoX2Z3ID0gMDsKKworIyBpZmRlZiBtb2R1bGVfcGFyYW0KK21vZHVsZV9wYXJhbShtZV9ib3NjaF9mdywgaW50LCBTX0lSVUdPKTsKKyMgZWxzZQorTU9EVUxFX1BBUk0obWVfYm9zY2hfZncsICJpIik7CisjIGVuZGlmCisKK01PRFVMRV9QQVJNX0RFU0MobWVfYm9zY2hfZncsCisJCSAiRmxhZ3Mgd2hpY2ggc2lnbmFscyB0aGUgTUUtNDYwMCBkcml2ZXIgdG8gbG9hZCB0aGUgYm9zY2ggZmlybXdhcmUgKGRlZmF1bHQgPSAwKS4iKTsKKyNlbmRpZiAvL0JPU0NICisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWFqb3IgPSAwOworI2lmZGVmIG1vZHVsZV9wYXJhbQorbW9kdWxlX3BhcmFtKG1ham9yLCBpbnQsIFNfSVJVR08pOworI2Vsc2UKK01PRFVMRV9QQVJNKG1ham9yLCAiaSIpOworI2VuZGlmCisKKy8qIEdsb2JhbCBEcml2ZXIgTG9jaworKi8KKworc3RhdGljIHN0cnVjdCBmaWxlICptZV9maWxlcCA9IE5VTEw7CitzdGF0aWMgaW50IG1lX2NvdW50ID0gMDsKK3N0YXRpYyBzcGlubG9ja190IG1lX2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CitzdGF0aWMgREVDTEFSRV9SV1NFTShtZV9yd3NlbSk7CisKKy8qIEJvYXJkIGluc3RhbmNlcyBhcmUga2VwdCBpbiBhIGdsb2JhbCBsaXN0ICovCitMSVNUX0hFQUQobWVfZGV2aWNlX2xpc3QpOworCisvKiBQcm90b3R5cGVzCisqLworCitzdGF0aWMgaW50IG1lX3Byb2JlX3BjaShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpOworc3RhdGljIHZvaWQgbWVfcmVtb3ZlX3BjaShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKK3N0YXRpYyBpbnQgaW5zZXJ0X3RvX2RldmljZV9saXN0KG1lX2RldmljZV90ICogbl9kZXZpY2UpOworc3RhdGljIGludCByZXBsYWNlX3dpdGhfZHVtbXkoaW50IHZlbmRvcl9pZCwgaW50IGRldmljZV9pZCwgaW50IHNlcmlhbF9ubyk7CitzdGF0aWMgdm9pZCBjbGVhcl9kZXZpY2VfbGlzdCh2b2lkKTsKK3N0YXRpYyBpbnQgbWVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlX3B0ciwgc3RydWN0IGZpbGUgKmZpbGVwKTsKK3N0YXRpYyBpbnQgbWVfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CitzdGF0aWMgaW50IG1lX2lvY3RsKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOworLy9zdGF0aWMgaW50IG1lX3Byb2JlX3VzYihzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpOworLy9zdGF0aWMgdm9pZCBtZV9kaXNjb25uZWN0X3VzYihzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKTsKKworLyogQ2hhcmFjdGVyIGRldmljZSBzdHJ1Y3R1cmUKKyovCisKK3N0YXRpYyBzdHJ1Y3QgY2RldiAqY2RldnA7CisKKy8qIEZpbGUgb3BlcmF0aW9ucyBwcm92aWRlZCBieSB0aGUgbW9kdWxlCisqLworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtZV9maWxlX29wZXJhdGlvbnMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmlvY3RsID0gbWVfaW9jdGwsCisJLm9wZW4gPSBtZV9vcGVuLAorCS5yZWxlYXNlID0gbWVfcmVsZWFzZSwKK307CisKK3N0cnVjdCBwY2lfZHJpdmVyIG1lX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUgPSBNRU1BSU5fTkFNRSwKKwkuaWRfdGFibGUgPSBtZV9wY2lfdGFibGUsCisJLnByb2JlID0gbWVfcHJvYmVfcGNpLAorCS5yZW1vdmUgPSBtZV9yZW1vdmVfcGNpCit9OworCisvKiAvL21lX3VzYl9kcml2ZXIKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBtZV91c2JfZHJpdmVyID0KK3sKKwkubmFtZSA9IE1FTUFJTl9OQU1FLAorCS5pZF90YWJsZSA9IG1lX3VzYl90YWJsZSwKKwkucHJvYmUgPSBtZV9wcm9iZV91c2IsCisJLmRpc2Nvbm5lY3QgPSBtZV9kaXNjb25uZWN0X3VzYgorfTsKKyovCisKKyNpZmRlZiBNRV9MT0NLX01VTFRJUExFWF9URU1QTEFURQorTUVfTE9DS19NVUxUSVBMRVhfVEVNUExBVEUoIm1lX2xvY2tfZGV2aWNlIiwKKwkJCSAgIG1lX2xvY2tfZGV2aWNlX3QsCisJCQkgICBtZV9sb2NrX2RldmljZSwKKwkJCSAgIG1lX2RldmljZV9sb2NrX2RldmljZSwKKwkJCSAgIChkZXZpY2UsIGZpbGVwLCBrYXJnLmxvY2ssIGthcmcuZmxhZ3MpKQorCisgICAgTUVfTE9DS19NVUxUSVBMRVhfVEVNUExBVEUoIm1lX2xvY2tfc3ViZGV2aWNlIiwKKwkJCSAgIG1lX2xvY2tfc3ViZGV2aWNlX3QsCisJCQkgICBtZV9sb2NrX3N1YmRldmljZSwKKwkJCSAgIG1lX2RldmljZV9sb2NrX3N1YmRldmljZSwKKwkJCSAgIChkZXZpY2UsIGZpbGVwLCBrYXJnLnN1YmRldmljZSwga2FyZy5sb2NrLAorCQkJa2FyZy5mbGFncykpCisjZWxzZQorI2Vycm9yIG1hY3JvIE1FX0xPQ0tfTVVMVElQTEVYX1RFTVBMQVRFIG5vdCBkZWZpbmVkCisjZW5kaWYKKworI2lmZGVmIE1FX0lPX01VTFRJUExFWF9URU1QTEFURQorTUVfSU9fTVVMVElQTEVYX1RFTVBMQVRFKCJtZV9pb19pcnFfc3RhcnQiLAorCQkJIG1lX2lvX2lycV9zdGFydF90LAorCQkJIG1lX2lvX2lycV9zdGFydCwKKwkJCSBtZV9kZXZpY2VfaW9faXJxX3N0YXJ0LAorCQkJIChkZXZpY2UsCisJCQkgIGZpbGVwLAorCQkJICBrYXJnLnN1YmRldmljZSwKKwkJCSAga2FyZy5jaGFubmVsLAorCQkJICBrYXJnLmlycV9zb3VyY2UsCisJCQkgIGthcmcuaXJxX2VkZ2UsIGthcmcuaXJxX2FyZywga2FyZy5mbGFncykpCisKKyAgICBNRV9JT19NVUxUSVBMRVhfVEVNUExBVEUoIm1lX2lvX2lycV93YWl0IiwKKwkJCSBtZV9pb19pcnFfd2FpdF90LAorCQkJIG1lX2lvX2lycV93YWl0LAorCQkJIG1lX2RldmljZV9pb19pcnFfd2FpdCwKKwkJCSAoZGV2aWNlLAorCQkgICAgICBmaWxlcCwKKwkJICAgICAga2FyZy5zdWJkZXZpY2UsCisJCSAgICAgIGthcmcuY2hhbm5lbCwKKwkJICAgICAgJmthcmcuaXJxX2NvdW50LCAma2FyZy52YWx1ZSwga2FyZy50aW1lX291dCwga2FyZy5mbGFncykpCisKKyAgICBNRV9JT19NVUxUSVBMRVhfVEVNUExBVEUoIm1lX2lvX2lycV9zdG9wIiwKKwkJCSBtZV9pb19pcnFfc3RvcF90LAorCQkJIG1lX2lvX2lycV9zdG9wLAorCQkJIG1lX2RldmljZV9pb19pcnFfc3RvcCwKKwkJCSAoZGV2aWNlLAorCQkgICAgICBmaWxlcCwga2FyZy5zdWJkZXZpY2UsIGthcmcuY2hhbm5lbCwga2FyZy5mbGFncykpCisKKyAgICBNRV9JT19NVUxUSVBMRVhfVEVNUExBVEUoIm1lX2lvX3Jlc2V0X2RldmljZSIsCisJCQkgbWVfaW9fcmVzZXRfZGV2aWNlX3QsCisJCQkgbWVfaW9fcmVzZXRfZGV2aWNlLAorCQkJIG1lX2RldmljZV9pb19yZXNldF9kZXZpY2UsIChkZXZpY2UsIGZpbGVwLCBrYXJnLmZsYWdzKSkKKworICAgIE1FX0lPX01VTFRJUExFWF9URU1QTEFURSgibWVfaW9fcmVzZXRfc3ViZGV2aWNlIiwKKwkJCSBtZV9pb19yZXNldF9zdWJkZXZpY2VfdCwKKwkJCSBtZV9pb19yZXNldF9zdWJkZXZpY2UsCisJCQkgbWVfZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZSwKKwkJCSAoZGV2aWNlLCBmaWxlcCwga2FyZy5zdWJkZXZpY2UsIGthcmcuZmxhZ3MpKQorCisgICAgTUVfSU9fTVVMVElQTEVYX1RFTVBMQVRFKCJtZV9pb19zaW5nbGVfY29uZmlnIiwKKwkJCSBtZV9pb19zaW5nbGVfY29uZmlnX3QsCisJCQkgbWVfaW9fc2luZ2xlX2NvbmZpZywKKwkJCSBtZV9kZXZpY2VfaW9fc2luZ2xlX2NvbmZpZywKKwkJCSAoZGV2aWNlLAorCQkgICAgICBmaWxlcCwKKwkJICAgICAga2FyZy5zdWJkZXZpY2UsCisJCSAgICAgIGthcmcuY2hhbm5lbCwKKwkJICAgICAga2FyZy5zaW5nbGVfY29uZmlnLAorCQkgICAgICBrYXJnLnJlZiwKKwkJICAgICAga2FyZy50cmlnX2NoYW4sCisJCSAgICAgIGthcmcudHJpZ190eXBlLCBrYXJnLnRyaWdfZWRnZSwga2FyZy5mbGFncykpCisKKyAgICBNRV9JT19NVUxUSVBMRVhfVEVNUExBVEUoIm1lX2lvX3N0cmVhbV9uZXdfdmFsdWVzIiwKKwkJCSBtZV9pb19zdHJlYW1fbmV3X3ZhbHVlc190LAorCQkJIG1lX2lvX3N0cmVhbV9uZXdfdmFsdWVzLAorCQkJIG1lX2RldmljZV9pb19zdHJlYW1fbmV3X3ZhbHVlcywKKwkJCSAoZGV2aWNlLAorCQkgICAgICBmaWxlcCwKKwkJICAgICAga2FyZy5zdWJkZXZpY2UsIGthcmcudGltZV9vdXQsICZrYXJnLmNvdW50LCBrYXJnLmZsYWdzKSkKKworICAgIE1FX0lPX01VTFRJUExFWF9URU1QTEFURSgibWVfaW9fc3RyZWFtX3JlYWQiLAorCQkJIG1lX2lvX3N0cmVhbV9yZWFkX3QsCisJCQkgbWVfaW9fc3RyZWFtX3JlYWQsCisJCQkgbWVfZGV2aWNlX2lvX3N0cmVhbV9yZWFkLAorCQkJIChkZXZpY2UsCisJCSAgICAgIGZpbGVwLAorCQkgICAgICBrYXJnLnN1YmRldmljZSwKKwkJICAgICAga2FyZy5yZWFkX21vZGUsIGthcmcudmFsdWVzLCAma2FyZy5jb3VudCwga2FyZy5mbGFncykpCisKKyAgICBNRV9JT19NVUxUSVBMRVhfVEVNUExBVEUoIm1lX2lvX3N0cmVhbV9zdGF0dXMiLAorCQkJIG1lX2lvX3N0cmVhbV9zdGF0dXNfdCwKKwkJCSBtZV9pb19zdHJlYW1fc3RhdHVzLAorCQkJIG1lX2RldmljZV9pb19zdHJlYW1fc3RhdHVzLAorCQkJIChkZXZpY2UsCisJCSAgICAgIGZpbGVwLAorCQkgICAgICBrYXJnLnN1YmRldmljZSwKKwkJICAgICAga2FyZy53YWl0LCAma2FyZy5zdGF0dXMsICZrYXJnLmNvdW50LCBrYXJnLmZsYWdzKSkKKworICAgIE1FX0lPX01VTFRJUExFWF9URU1QTEFURSgibWVfaW9fc3RyZWFtX3dyaXRlIiwKKwkJCSBtZV9pb19zdHJlYW1fd3JpdGVfdCwKKwkJCSBtZV9pb19zdHJlYW1fd3JpdGUsCisJCQkgbWVfZGV2aWNlX2lvX3N0cmVhbV93cml0ZSwKKwkJCSAoZGV2aWNlLAorCQkgICAgICBmaWxlcCwKKwkJICAgICAga2FyZy5zdWJkZXZpY2UsCisJCSAgICAgIGthcmcud3JpdGVfbW9kZSwga2FyZy52YWx1ZXMsICZrYXJnLmNvdW50LCBrYXJnLmZsYWdzKSkKKyNlbHNlCisjZXJyb3IgbWFjcm8gTUVfSU9fTVVMVElQTEVYX1RFTVBMQVRFIG5vdCBkZWZpbmVkCisjZW5kaWYKKworI2lmZGVmIE1FX1FVRVJZX01VTFRJUExFWF9TVFJfVEVNUExBVEUKK01FX1FVRVJZX01VTFRJUExFWF9TVFJfVEVNUExBVEUoIm1lX3F1ZXJ5X25hbWVfZGV2aWNlIiwKKwkJCQltZV9xdWVyeV9uYW1lX2RldmljZV90LAorCQkJCW1lX3F1ZXJ5X25hbWVfZGV2aWNlLAorCQkJCW1lX2RldmljZV9xdWVyeV9uYW1lX2RldmljZSwgKGRldmljZSwgJm1zZykpCisKKyAgICBNRV9RVUVSWV9NVUxUSVBMRVhfU1RSX1RFTVBMQVRFKCJtZV9xdWVyeV9uYW1lX2RldmljZV9kcml2ZXIiLAorCQkJCW1lX3F1ZXJ5X25hbWVfZGV2aWNlX2RyaXZlcl90LAorCQkJCW1lX3F1ZXJ5X25hbWVfZGV2aWNlX2RyaXZlciwKKwkJCQltZV9kZXZpY2VfcXVlcnlfbmFtZV9kZXZpY2VfZHJpdmVyLAorCQkJCShkZXZpY2UsICZtc2cpKQorCisgICAgTUVfUVVFUllfTVVMVElQTEVYX1NUUl9URU1QTEFURSgibWVfcXVlcnlfZGVzY3JpcHRpb25fZGV2aWNlIiwKKwkJCQltZV9xdWVyeV9kZXNjcmlwdGlvbl9kZXZpY2VfdCwKKwkJCQltZV9xdWVyeV9kZXNjcmlwdGlvbl9kZXZpY2UsCisJCQkJbWVfZGV2aWNlX3F1ZXJ5X2Rlc2NyaXB0aW9uX2RldmljZSwKKwkJCQkoZGV2aWNlLCAmbXNnKSkKKyNlbHNlCisjZXJyb3IgbWFjcm8gTUVfUVVFUllfTVVMVElQTEVYX1NUUl9URU1QTEFURSBub3QgZGVmaW5lZAorI2VuZGlmCisKKyNpZmRlZiBNRV9RVUVSWV9NVUxUSVBMRVhfVEVNUExBVEUKK01FX1FVRVJZX01VTFRJUExFWF9URU1QTEFURSgibWVfcXVlcnlfaW5mb19kZXZpY2UiLAorCQkJICAgIG1lX3F1ZXJ5X2luZm9fZGV2aWNlX3QsCisJCQkgICAgbWVfcXVlcnlfaW5mb19kZXZpY2UsCisJCQkgICAgbWVfZGV2aWNlX3F1ZXJ5X2luZm9fZGV2aWNlLAorCQkJICAgIChkZXZpY2UsCisJCQkgICAgICZrYXJnLnZlbmRvcl9pZCwKKwkJCSAgICAgJmthcmcuZGV2aWNlX2lkLAorCQkJICAgICAma2FyZy5zZXJpYWxfbm8sCisJCQkgICAgICZrYXJnLmJ1c190eXBlLAorCQkJICAgICAma2FyZy5idXNfbm8sCisJCQkgICAgICZrYXJnLmRldl9ubywgJmthcmcuZnVuY19ubywgJmthcmcucGx1Z2dlZCkpCisKKyAgICBNRV9RVUVSWV9NVUxUSVBMRVhfVEVNUExBVEUoIm1lX3F1ZXJ5X251bWJlcl9zdWJkZXZpY2VzIiwKKwkJCSAgICBtZV9xdWVyeV9udW1iZXJfc3ViZGV2aWNlc190LAorCQkJICAgIG1lX3F1ZXJ5X251bWJlcl9zdWJkZXZpY2VzLAorCQkJICAgIG1lX2RldmljZV9xdWVyeV9udW1iZXJfc3ViZGV2aWNlcywKKwkJCSAgICAoZGV2aWNlLCAma2FyZy5udW1iZXIpKQorCisgICAgTUVfUVVFUllfTVVMVElQTEVYX1RFTVBMQVRFKCJtZV9xdWVyeV9udW1iZXJfY2hhbm5lbHMiLAorCQkJICAgIG1lX3F1ZXJ5X251bWJlcl9jaGFubmVsc190LAorCQkJICAgIG1lX3F1ZXJ5X251bWJlcl9jaGFubmVscywKKwkJCSAgICBtZV9kZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzLAorCQkJICAgIChkZXZpY2UsIGthcmcuc3ViZGV2aWNlLCAma2FyZy5udW1iZXIpKQorCisgICAgTUVfUVVFUllfTVVMVElQTEVYX1RFTVBMQVRFKCJtZV9xdWVyeV9zdWJkZXZpY2VfYnlfdHlwZSIsCisJCQkgICAgbWVfcXVlcnlfc3ViZGV2aWNlX2J5X3R5cGVfdCwKKwkJCSAgICBtZV9xdWVyeV9zdWJkZXZpY2VfYnlfdHlwZSwKKwkJCSAgICBtZV9kZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2J5X3R5cGUsCisJCQkgICAgKGRldmljZSwKKwkJCSBrYXJnLnN0YXJ0X3N1YmRldmljZSwKKwkJCSBrYXJnLnR5cGUsIGthcmcuc3VidHlwZSwgJmthcmcuc3ViZGV2aWNlKSkKKworICAgIE1FX1FVRVJZX01VTFRJUExFWF9URU1QTEFURSgibWVfcXVlcnlfc3ViZGV2aWNlX3R5cGUiLAorCQkJICAgIG1lX3F1ZXJ5X3N1YmRldmljZV90eXBlX3QsCisJCQkgICAgbWVfcXVlcnlfc3ViZGV2aWNlX3R5cGUsCisJCQkgICAgbWVfZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlLAorCQkJICAgIChkZXZpY2UsIGthcmcuc3ViZGV2aWNlLCAma2FyZy50eXBlLCAma2FyZy5zdWJ0eXBlKSkKKworICAgIE1FX1FVRVJZX01VTFRJUExFWF9URU1QTEFURSgibWVfcXVlcnlfc3ViZGV2aWNlX2NhcHMiLAorCQkJICAgIG1lX3F1ZXJ5X3N1YmRldmljZV9jYXBzX3QsCisJCQkgICAgbWVfcXVlcnlfc3ViZGV2aWNlX2NhcHMsCisJCQkgICAgbWVfZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzLAorCQkJICAgIChkZXZpY2UsIGthcmcuc3ViZGV2aWNlLCAma2FyZy5jYXBzKSkKKworICAgIE1FX1FVRVJZX01VTFRJUExFWF9URU1QTEFURSgibWVfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncyIsCisJCQkgICAgbWVfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJnc190LAorCQkJICAgIG1lX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3MsCisJCQkgICAgbWVfZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3MsCisJCQkgICAgKGRldmljZSwga2FyZy5zdWJkZXZpY2UsIGthcmcuY2FwLCBrYXJnLmFyZ3MsCisJCQkga2FyZy5jb3VudCkpCisKKyAgICBNRV9RVUVSWV9NVUxUSVBMRVhfVEVNUExBVEUoIm1lX3F1ZXJ5X251bWJlcl9yYW5nZXMiLAorCQkJICAgIG1lX3F1ZXJ5X251bWJlcl9yYW5nZXNfdCwKKwkJCSAgICBtZV9xdWVyeV9udW1iZXJfcmFuZ2VzLAorCQkJICAgIG1lX2RldmljZV9xdWVyeV9udW1iZXJfcmFuZ2VzLAorCQkJICAgIChkZXZpY2UsIGthcmcuc3ViZGV2aWNlLCBrYXJnLnVuaXQsICZrYXJnLm51bWJlcikpCisKKyAgICBNRV9RVUVSWV9NVUxUSVBMRVhfVEVNUExBVEUoIm1lX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXgiLAorCQkJICAgIG1lX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXhfdCwKKwkJCSAgICBtZV9xdWVyeV9yYW5nZV9ieV9taW5fbWF4LAorCQkJICAgIG1lX2RldmljZV9xdWVyeV9yYW5nZV9ieV9taW5fbWF4LAorCQkJICAgIChkZXZpY2UsCisJCQkga2FyZy5zdWJkZXZpY2UsCisJCQkga2FyZy51bml0LAorCQkJICZrYXJnLm1pbiwgJmthcmcubWF4LCAma2FyZy5tYXhfZGF0YSwgJmthcmcucmFuZ2UpKQorCisgICAgTUVfUVVFUllfTVVMVElQTEVYX1RFTVBMQVRFKCJtZV9xdWVyeV9yYW5nZV9pbmZvIiwKKwkJCSAgICBtZV9xdWVyeV9yYW5nZV9pbmZvX3QsCisJCQkgICAgbWVfcXVlcnlfcmFuZ2VfaW5mbywKKwkJCSAgICBtZV9kZXZpY2VfcXVlcnlfcmFuZ2VfaW5mbywKKwkJCSAgICAoZGV2aWNlLAorCQkJIGthcmcuc3ViZGV2aWNlLAorCQkJIGthcmcucmFuZ2UsCisJCQkgJmthcmcudW5pdCwgJmthcmcubWluLCAma2FyZy5tYXgsICZrYXJnLm1heF9kYXRhKSkKKworICAgIE1FX1FVRVJZX01VTFRJUExFWF9URU1QTEFURSgibWVfcXVlcnlfdGltZXIiLAorCQkJICAgIG1lX3F1ZXJ5X3RpbWVyX3QsCisJCQkgICAgbWVfcXVlcnlfdGltZXIsCisJCQkgICAgbWVfZGV2aWNlX3F1ZXJ5X3RpbWVyLAorCQkJICAgIChkZXZpY2UsCisJCQkga2FyZy5zdWJkZXZpY2UsCisJCQkga2FyZy50aW1lciwKKwkJCSAma2FyZy5iYXNlX2ZyZXF1ZW5jeSwKKwkJCSAma2FyZy5taW5fdGlja3MsICZrYXJnLm1heF90aWNrcykpCisKKyAgICBNRV9RVUVSWV9NVUxUSVBMRVhfVEVNUExBVEUoIm1lX3F1ZXJ5X3ZlcnNpb25fZGV2aWNlX2RyaXZlciIsCisJCQkgICAgbWVfcXVlcnlfdmVyc2lvbl9kZXZpY2VfZHJpdmVyX3QsCisJCQkgICAgbWVfcXVlcnlfdmVyc2lvbl9kZXZpY2VfZHJpdmVyLAorCQkJICAgIG1lX2RldmljZV9xdWVyeV92ZXJzaW9uX2RldmljZV9kcml2ZXIsCisJCQkgICAgKGRldmljZSwgJmthcmcudmVyc2lvbikpCisjZWxzZQorI2Vycm9yIG1hY3JvIE1FX1FVRVJZX01VTFRJUExFWF9URU1QTEFURSBub3QgZGVmaW5lZAorI2VuZGlmCisKKy8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi8KKworc3RhdGljIG1lX2RldmljZV90ICpnZXRfZHVtbXlfaW5zdGFuY2UodW5zaWduZWQgc2hvcnQgdmVuZG9yX2lkLAorCQkJCSAgICAgICB1bnNpZ25lZCBzaG9ydCBkZXZpY2VfaWQsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBzZXJpYWxfbm8sCisJCQkJICAgICAgIGludCBidXNfdHlwZSwKKwkJCQkgICAgICAgaW50IGJ1c19ubywgaW50IGRldl9ubywgaW50IGZ1bmNfbm8pCit7CisJaW50IGVycjsKKwltZV9kdW1teV9jb25zdHJ1Y3Rvcl90IGNvbnN0cnVjdG9yID0gTlVMTDsKKwltZV9kZXZpY2VfdCAqaW5zdGFuY2U7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpZiAoKGNvbnN0cnVjdG9yID0gc3ltYm9sX2dldChtZWR1bW15X2NvbnN0cnVjdG9yKSkgPT0gTlVMTCkgeworCQllcnIgPSByZXF1ZXN0X21vZHVsZShNRURVTU1ZX05BTUUpOworCisJCWlmIChlcnIpIHsKKwkJCVBFUlJPUigiRXJyb3Igd2hpbGUgcmVxdWVzdCBmb3IgbW9kdWxlICVzLlxuIiwKKwkJCSAgICAgICBNRURVTU1ZX05BTUUpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlpZiAoKGNvbnN0cnVjdG9yID0gc3ltYm9sX2dldChtZWR1bW15X2NvbnN0cnVjdG9yKSkgPT0gTlVMTCkgeworCQkJUEVSUk9SKCJDYW4ndCBnZXQgJXMgZHJpdmVyIG1vZHVsZSBjb25zdHJ1Y3Rvci5cbiIsCisJCQkgICAgICAgTUVEVU1NWV9OQU1FKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCisJaWYgKChpbnN0YW5jZSA9ICgqY29uc3RydWN0b3IpICh2ZW5kb3JfaWQsCisJCQkJCWRldmljZV9pZCwKKwkJCQkJc2VyaWFsX25vLAorCQkJCQlidXNfdHlwZSwKKwkJCQkJYnVzX25vLCBkZXZfbm8sIGZ1bmNfbm8pKSA9PSBOVUxMKQorCQlzeW1ib2xfcHV0KG1lZHVtbXlfY29uc3RydWN0b3IpOworCisJcmV0dXJuIGluc3RhbmNlOworfQorCitzdGF0aWMgaW50IG1lX3Byb2JlX3BjaShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJaW50IGVycjsKKwltZV9wY2lfY29uc3RydWN0b3JfdCBjb25zdHJ1Y3RvciA9IE5VTEw7CisjaWZkZWYgQk9TQ0gKKwltZV9ib3NjaF9jb25zdHJ1Y3Rvcl90IGNvbnN0cnVjdG9yX2Jvc2NoID0gTlVMTDsKKyNlbmRpZgorCW1lX2RldmljZV90ICpuX2RldmljZSA9IE5VTEw7CisJdWludDMyX3QgZGV2aWNlOworCisJY2hhciBjb25zdHJ1Y3Rvcl9uYW1lWzI0XSA9ICJtZTAwMDBfcGNpX2NvbnN0cnVjdG9yIjsKKwljaGFyIG1vZHVsZV9uYW1lWzddID0gIm1lMDAwMCI7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJZGV2aWNlID0gZGV2LT5kZXZpY2U7CisJaWYgKChkZXZpY2UgJiAweEYwMDApID09IDB4NjAwMCkgewkvLyBFeGNlcHRpb25zOiBtZTYxeHgsIG1lNjJ4eCwgbWU2M3h4IGFyZSBoYW5kbGVkIGJ5IG9uZSBkcml2ZXIuCisJCWRldmljZSAmPSAweEYwRkY7CisJfQorCisJY29uc3RydWN0b3JfbmFtZVsyXSArPSAoY2hhcikoKGRldmljZSA+PiAxMikgJiAweDAwMEYpOworCWNvbnN0cnVjdG9yX25hbWVbM10gKz0gKGNoYXIpKChkZXZpY2UgPj4gOCkgJiAweDAwMEYpOworCVBERUJVRygiY29uc3RydWN0b3JfbmFtZTogJXNcbiIsIGNvbnN0cnVjdG9yX25hbWUpOworCW1vZHVsZV9uYW1lWzJdICs9IChjaGFyKSgoZGV2aWNlID4+IDEyKSAmIDB4MDAwRik7CisJbW9kdWxlX25hbWVbM10gKz0gKGNoYXIpKChkZXZpY2UgPj4gOCkgJiAweDAwMEYpOworCVBERUJVRygibW9kdWxlX25hbWU6ICVzXG4iLCBtb2R1bGVfbmFtZSk7CisKKwlpZiAoKGNvbnN0cnVjdG9yID0KKwkgICAgIChtZV9wY2lfY29uc3RydWN0b3JfdCkgc3ltYm9sX2dldChjb25zdHJ1Y3Rvcl9uYW1lKSkgPT0gTlVMTCkgeworCQlpZiAocmVxdWVzdF9tb2R1bGUobW9kdWxlX25hbWUpKSB7CisJCQlQRVJST1IoIkVycm9yIHdoaWxlIHJlcXVlc3QgZm9yIG1vZHVsZSAlcy5cbiIsCisJCQkgICAgICAgbW9kdWxlX25hbWUpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQlpZiAoKGNvbnN0cnVjdG9yID0KKwkJICAgICAobWVfcGNpX2NvbnN0cnVjdG9yX3QpIHN5bWJvbF9nZXQoY29uc3RydWN0b3JfbmFtZSkpID09CisJCSAgICBOVUxMKSB7CisJCQlQRVJST1IoIkNhbid0IGdldCAlcyBkcml2ZXIgbW9kdWxlIGNvbnN0cnVjdG9yLlxuIiwKKwkJCSAgICAgICBtb2R1bGVfbmFtZSk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0KKyNpZmRlZiBCT1NDSAorCWlmICgoZGV2aWNlICYgMHhGMDAwKSA9PSAweDQwMDApIHsJLy8gQm9zY2ggYnVpbGQgaGFzIGRpZmZlcm50IGNvbnN0cnVjdG9yIGZvciBtZTQ2MDAuCisJCWlmICgobl9kZXZpY2UgPQorCQkgICAgICgqY29uc3RydWN0b3JfYm9zY2gpIChkZXYsIG1lX2Jvc2NoX2Z3KSkgPT0gTlVMTCkgeworCQkJc3ltYm9sX3B1dChjb25zdHJ1Y3Rvcl9uYW1lKTsKKwkJCVBFUlJPUgorCQkJICAgICgiQ2FuJ3QgZ2V0IGRldmljZSBpbnN0YW5jZSBvZiAlcyBkcml2ZXIgbW9kdWxlLlxuIiwKKwkJCSAgICAgbW9kdWxlX25hbWUpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9IGVsc2UgeworI2VuZGlmCisJCWlmICgobl9kZXZpY2UgPSAoKmNvbnN0cnVjdG9yKSAoZGV2KSkgPT0gTlVMTCkgeworCQkJc3ltYm9sX3B1dChjb25zdHJ1Y3Rvcl9uYW1lKTsKKwkJCVBFUlJPUgorCQkJICAgICgiQ2FuJ3QgZ2V0IGRldmljZSBpbnN0YW5jZSBvZiAlcyBkcml2ZXIgbW9kdWxlLlxuIiwKKwkJCSAgICAgbW9kdWxlX25hbWUpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKyNpZmRlZiBCT1NDSAorCX0KKyNlbmRpZgorCisJaW5zZXJ0X3RvX2RldmljZV9saXN0KG5fZGV2aWNlKTsKKwllcnIgPQorCSAgICBuX2RldmljZS0+bWVfZGV2aWNlX2lvX3Jlc2V0X2RldmljZShuX2RldmljZSwgTlVMTCwKKwkJCQkJCU1FX0lPX1JFU0VUX0RFVklDRV9OT19GTEFHUyk7CisJaWYgKGVycikgeworCQlQRVJST1IoIkVycm9yIHdoaWxlIHJlc2V0aW5nIGRldmljZS5cbiIpOworCX0gZWxzZSB7CisJCVBERUJVRygiUmVzZXRpbmcgZGV2aWNlIHdhcyBzdWNlc3NmdWwuXG4iKTsKKwl9CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIHJlbGVhc2VfaW5zdGFuY2UobWVfZGV2aWNlX3QgKiBkZXZpY2UpCit7CisJaW50IHZlbmRvcl9pZDsKKwlpbnQgZGV2aWNlX2lkOworCWludCBzZXJpYWxfbm87CisJaW50IGJ1c190eXBlOworCWludCBidXNfbm87CisJaW50IGRldl9ubzsKKwlpbnQgZnVuY19ubzsKKwlpbnQgcGx1Z2dlZDsKKworCXVpbnQzMl90IGRldl9pZDsKKworCWNoYXIgY29uc3RydWN0b3JfbmFtZVsyNF0gPSAibWUwMDAwX3BjaV9jb25zdHJ1Y3RvciI7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlkZXZpY2UtPm1lX2RldmljZV9xdWVyeV9pbmZvX2RldmljZShkZXZpY2UsCisJCQkJCSAgICAmdmVuZG9yX2lkLAorCQkJCQkgICAgJmRldmljZV9pZCwKKwkJCQkJICAgICZzZXJpYWxfbm8sCisJCQkJCSAgICAmYnVzX3R5cGUsCisJCQkJCSAgICAmYnVzX25vLAorCQkJCQkgICAgJmRldl9ubywgJmZ1bmNfbm8sICZwbHVnZ2VkKTsKKworCWRldl9pZCA9IGRldmljZV9pZDsKKwlkZXZpY2UtPm1lX2RldmljZV9kZXN0cnVjdG9yKGRldmljZSk7CisKKwlpZiAocGx1Z2dlZCAhPSBNRV9QTFVHR0VEX0lOKSB7CisJCVBERUJVRygicmVsZWFzZTogbWVkdW1teV9jb25zdHJ1Y3RvclxuIik7CisKKwkJc3ltYm9sX3B1dCgibWVkdW1teV9jb25zdHJ1Y3RvciIpOworCX0gZWxzZSB7CisJCWlmICgoZGV2X2lkICYgMHhGMDAwKSA9PSAweDYwMDApIHsJLy8gRXhjZXB0aW9uczogbWU2MXh4LCBtZTYyeHgsIG1lNjN4eCBhcmUgaGFuZGxlZCBieSBvbmUgZHJpdmVyLgorCQkJZGV2X2lkICY9IDB4RjBGRjsKKwkJfQorCisJCWNvbnN0cnVjdG9yX25hbWVbMl0gKz0gKGNoYXIpKChkZXZfaWQgPj4gMTIpICYgMHgwMDBGKTsKKwkJY29uc3RydWN0b3JfbmFtZVszXSArPSAoY2hhcikoKGRldl9pZCA+PiA4KSAmIDB4MDAwRik7CisJCVBERUJVRygicmVsZWFzZTogJXNcbiIsIGNvbnN0cnVjdG9yX25hbWUpOworCisJCXN5bWJvbF9wdXQoY29uc3RydWN0b3JfbmFtZSk7CisJfQorfQorCitzdGF0aWMgaW50IGluc2VydF90b19kZXZpY2VfbGlzdChtZV9kZXZpY2VfdCAqIG5fZGV2aWNlKQoreworCW1lX2RldmljZV90ICpvX2RldmljZSA9IE5VTEw7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJaW50IG5fdmVuZG9yX2lkOworCWludCBuX2RldmljZV9pZDsKKwlpbnQgbl9zZXJpYWxfbm87CisJaW50IG5fYnVzX3R5cGU7CisJaW50IG5fYnVzX25vOworCWludCBuX2Rldl9ubzsKKwlpbnQgbl9mdW5jX25vOworCWludCBuX3BsdWdnZWQ7CisJaW50IG9fdmVuZG9yX2lkOworCWludCBvX2RldmljZV9pZDsKKwlpbnQgb19zZXJpYWxfbm87CisJaW50IG9fYnVzX3R5cGU7CisJaW50IG9fYnVzX25vOworCWludCBvX2Rldl9ubzsKKwlpbnQgb19mdW5jX25vOworCWludCBvX3BsdWdnZWQ7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwluX2RldmljZS0+bWVfZGV2aWNlX3F1ZXJ5X2luZm9fZGV2aWNlKG5fZGV2aWNlLAorCQkJCQkgICAgICAmbl92ZW5kb3JfaWQsCisJCQkJCSAgICAgICZuX2RldmljZV9pZCwKKwkJCQkJICAgICAgJm5fc2VyaWFsX25vLAorCQkJCQkgICAgICAmbl9idXNfdHlwZSwKKwkJCQkJICAgICAgJm5fYnVzX25vLAorCQkJCQkgICAgICAmbl9kZXZfbm8sCisJCQkJCSAgICAgICZuX2Z1bmNfbm8sICZuX3BsdWdnZWQpOworCisJZG93bl93cml0ZSgmbWVfcndzZW0pOworCisJbGlzdF9mb3JfZWFjaChwb3MsICZtZV9kZXZpY2VfbGlzdCkgeworCQlvX2RldmljZSA9IGxpc3RfZW50cnkocG9zLCBtZV9kZXZpY2VfdCwgbGlzdCk7CisJCW9fZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfaW5mb19kZXZpY2Uob19kZXZpY2UsCisJCQkJCQkgICAgICAmb192ZW5kb3JfaWQsCisJCQkJCQkgICAgICAmb19kZXZpY2VfaWQsCisJCQkJCQkgICAgICAmb19zZXJpYWxfbm8sCisJCQkJCQkgICAgICAmb19idXNfdHlwZSwKKwkJCQkJCSAgICAgICZvX2J1c19ubywKKwkJCQkJCSAgICAgICZvX2Rldl9ubywKKwkJCQkJCSAgICAgICZvX2Z1bmNfbm8sICZvX3BsdWdnZWQpOworCisJCWlmIChvX3BsdWdnZWQgPT0gTUVfUExVR0dFRF9PVVQpIHsKKwkJCWlmICgoKG9fdmVuZG9yX2lkID09IG5fdmVuZG9yX2lkKSAmJgorCQkJICAgICAob19kZXZpY2VfaWQgPT0gbl9kZXZpY2VfaWQpICYmCisJCQkgICAgIChvX3NlcmlhbF9ubyA9PSBuX3NlcmlhbF9ubykgJiYKKwkJCSAgICAgKG9fYnVzX3R5cGUgPT0gbl9idXNfdHlwZSkpIHx8CisJCQkgICAgKChvX3ZlbmRvcl9pZCA9PSBuX3ZlbmRvcl9pZCkgJiYKKwkJCSAgICAgKG9fZGV2aWNlX2lkID09IG5fZGV2aWNlX2lkKSAmJgorCQkJICAgICAob19idXNfdHlwZSA9PSBuX2J1c190eXBlKSAmJgorCQkJICAgICAob19idXNfbm8gPT0gbl9idXNfbm8pICYmCisJCQkgICAgIChvX2Rldl9ubyA9PSBuX2Rldl9ubykgJiYKKwkJCSAgICAgKG9fZnVuY19ubyA9PSBuX2Z1bmNfbm8pKSkgeworCQkJCW5fZGV2aWNlLT5saXN0LnByZXYgPSBwb3MtPnByZXY7CisJCQkJbl9kZXZpY2UtPmxpc3QubmV4dCA9IHBvcy0+bmV4dDsKKwkJCQlwb3MtPnByZXYtPm5leHQgPSAmbl9kZXZpY2UtPmxpc3Q7CisJCQkJcG9zLT5uZXh0LT5wcmV2ID0gJm5fZGV2aWNlLT5saXN0OworCQkJCXJlbGVhc2VfaW5zdGFuY2Uob19kZXZpY2UpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKHBvcyA9PSAmbWVfZGV2aWNlX2xpc3QpIHsKKwkJbGlzdF9hZGRfdGFpbCgmbl9kZXZpY2UtPmxpc3QsICZtZV9kZXZpY2VfbGlzdCk7CisJfQorCisJdXBfd3JpdGUoJm1lX3J3c2VtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtZV9yZW1vdmVfcGNpKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaW50IHZlbmRvcl9pZCA9IGRldi0+dmVuZG9yOworCWludCBkZXZpY2VfaWQgPSBkZXYtPmRldmljZTsKKwlpbnQgc3Vic3lzdGVtX3ZlbmRvciA9IGRldi0+c3Vic3lzdGVtX3ZlbmRvcjsKKwlpbnQgc3Vic3lzdGVtX2RldmljZSA9IGRldi0+c3Vic3lzdGVtX2RldmljZTsKKwlpbnQgc2VyaWFsX25vID0gKHN1YnN5c3RlbV9kZXZpY2UgPDwgMTYpIHwgc3Vic3lzdGVtX3ZlbmRvcjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCVBJTkZPKCJWZW5kb3IgaWQgPSAweCUwOFhcbiIsIHZlbmRvcl9pZCk7CisJUElORk8oIkRldmljZSBpZCA9IDB4JTA4WFxuIiwgZGV2aWNlX2lkKTsKKwlQSU5GTygiU2VyaWFsIE51bWJlciA9IDB4JTA4WFxuIiwgc2VyaWFsX25vKTsKKworCXJlcGxhY2Vfd2l0aF9kdW1teSh2ZW5kb3JfaWQsIGRldmljZV9pZCwgc2VyaWFsX25vKTsKK30KKworc3RhdGljIGludCByZXBsYWNlX3dpdGhfZHVtbXkoaW50IHZlbmRvcl9pZCwgaW50IGRldmljZV9pZCwgaW50IHNlcmlhbF9ubykKK3sKKworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKwltZV9kZXZpY2VfdCAqbl9kZXZpY2UgPSBOVUxMOworCW1lX2RldmljZV90ICpvX2RldmljZSA9IE5VTEw7CisJaW50IG9fdmVuZG9yX2lkOworCWludCBvX2RldmljZV9pZDsKKwlpbnQgb19zZXJpYWxfbm87CisJaW50IG9fYnVzX3R5cGU7CisJaW50IG9fYnVzX25vOworCWludCBvX2Rldl9ubzsKKwlpbnQgb19mdW5jX25vOworCWludCBvX3BsdWdnZWQ7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlkb3duX3dyaXRlKCZtZV9yd3NlbSk7CisKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJm1lX2RldmljZV9saXN0KSB7CisJCW9fZGV2aWNlID0gbGlzdF9lbnRyeShwb3MsIG1lX2RldmljZV90LCBsaXN0KTsKKwkJb19kZXZpY2UtPm1lX2RldmljZV9xdWVyeV9pbmZvX2RldmljZShvX2RldmljZSwKKwkJCQkJCSAgICAgICZvX3ZlbmRvcl9pZCwKKwkJCQkJCSAgICAgICZvX2RldmljZV9pZCwKKwkJCQkJCSAgICAgICZvX3NlcmlhbF9ubywKKwkJCQkJCSAgICAgICZvX2J1c190eXBlLAorCQkJCQkJICAgICAgJm9fYnVzX25vLAorCQkJCQkJICAgICAgJm9fZGV2X25vLAorCQkJCQkJICAgICAgJm9fZnVuY19ubywgJm9fcGx1Z2dlZCk7CisKKwkJaWYgKG9fcGx1Z2dlZCA9PSBNRV9QTFVHR0VEX0lOKSB7CisJCQlpZiAoKChvX3ZlbmRvcl9pZCA9PSB2ZW5kb3JfaWQpICYmCisJCQkgICAgIChvX2RldmljZV9pZCA9PSBkZXZpY2VfaWQpICYmCisJCQkgICAgIChvX3NlcmlhbF9ubyA9PSBzZXJpYWxfbm8pKSkgeworCQkJCW5fZGV2aWNlID0gZ2V0X2R1bW15X2luc3RhbmNlKG9fdmVuZG9yX2lkLAorCQkJCQkJCSAgICAgIG9fZGV2aWNlX2lkLAorCQkJCQkJCSAgICAgIG9fc2VyaWFsX25vLAorCQkJCQkJCSAgICAgIG9fYnVzX3R5cGUsCisJCQkJCQkJICAgICAgb19idXNfbm8sCisJCQkJCQkJICAgICAgb19kZXZfbm8sCisJCQkJCQkJICAgICAgb19mdW5jX25vKTsKKworCQkJCWlmICghbl9kZXZpY2UpIHsKKwkJCQkJdXBfd3JpdGUoJm1lX3J3c2VtKTsKKwkJCQkJUEVSUk9SKCJDYW5ub3QgZ2V0IGR1bW15IGluc3RhbmNlLlxuIik7CisJCQkJCXJldHVybiAxOworCQkJCX0KKworCQkJCW5fZGV2aWNlLT5saXN0LnByZXYgPSBwb3MtPnByZXY7CisKKwkJCQluX2RldmljZS0+bGlzdC5uZXh0ID0gcG9zLT5uZXh0OworCQkJCXBvcy0+cHJldi0+bmV4dCA9ICZuX2RldmljZS0+bGlzdDsKKwkJCQlwb3MtPm5leHQtPnByZXYgPSAmbl9kZXZpY2UtPmxpc3Q7CisJCQkJcmVsZWFzZV9pbnN0YW5jZShvX2RldmljZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwl1cF93cml0ZSgmbWVfcndzZW0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyX2RldmljZV9saXN0KHZvaWQpCit7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKwltZV9kZXZpY2VfdCAqZGV2aWNlOworCisJLy8gQ2xlYXIgdGhlIGRldmljZSBpbmZvIGxpc3QgLgorCWRvd25fd3JpdGUoJm1lX3J3c2VtKTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmbWVfZGV2aWNlX2xpc3QpKSB7CisJCWVudHJ5ID0gbWVfZGV2aWNlX2xpc3QubmV4dDsKKwkJZGV2aWNlID0gbGlzdF9lbnRyeShlbnRyeSwgbWVfZGV2aWNlX3QsIGxpc3QpOworCQlsaXN0X2RlbChlbnRyeSk7CisJCXJlbGVhc2VfaW5zdGFuY2UoZGV2aWNlKTsKKwl9CisKKwl1cF93cml0ZSgmbWVfcndzZW0pOworfQorCitzdGF0aWMgaW50IGxvY2tfZHJpdmVyKHN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGxvY2ssIGludCBmbGFncykKK3sKKwlpbnQgZXJyID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwltZV9kZXZpY2VfdCAqZGV2aWNlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJZG93bl9yZWFkKCZtZV9yd3NlbSk7CisKKwlzcGluX2xvY2soJm1lX2xvY2spOworCisJc3dpdGNoIChsb2NrKSB7CisKKwljYXNlIE1FX0xPQ0tfU0VUOgorCQlpZiAobWVfY291bnQpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiRHJpdmVyIFN5c3RlbSBpcyBjdXJyZW50bHkgdXNlZCBieSBhbm90aGVyIHByb2Nlc3MuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX1VTRUQ7CisJCX0gZWxzZSBpZiAoKG1lX2ZpbGVwICE9IE5VTEwpICYmIChtZV9maWxlcCAhPSBmaWxlcCkpIHsKKwkJCVBFUlJPUgorCQkJICAgICgiRHJpdmVyIFN5c3RlbSBpcyBhbHJlYWR5IGxvZ2dlZCBieSBhbm90aGVyIHByb2Nlc3MuXG4iKTsKKwkJCWVyciA9IE1FX0VSUk5PX0xPQ0tFRDsKKwkJfSBlbHNlIHsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2aWNlLCAmbWVfZGV2aWNlX2xpc3QsIGxpc3QpIHsKKwkJCQllcnIgPQorCQkJCSAgICBkZXZpY2UtPm1lX2RldmljZV9sb2NrX2RldmljZShkZXZpY2UsIGZpbGVwLAorCQkJCQkJCQkgIE1FX0xPQ0tfQ0hFQ0ssCisJCQkJCQkJCSAgZmxhZ3MpOworCisJCQkJaWYgKGVycikKKwkJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmICghZXJyKQorCQkJCW1lX2ZpbGVwID0gZmlsZXA7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgTUVfTE9DS19SRUxFQVNFOgorCQlpZiAoKG1lX2ZpbGVwICE9IE5VTEwpICYmIChtZV9maWxlcCAhPSBmaWxlcCkpIHsKKwkJCWVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJCX0gZWxzZSB7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldmljZSwgJm1lX2RldmljZV9saXN0LCBsaXN0KSB7CisJCQkJZGV2aWNlLT5tZV9kZXZpY2VfbG9ja19kZXZpY2UoZGV2aWNlLCBmaWxlcCwKKwkJCQkJCQkgICAgICBNRV9MT0NLX1JFTEVBU0UsCisJCQkJCQkJICAgICAgZmxhZ3MpOworCQkJfQorCisJCQltZV9maWxlcCA9IE5VTEw7CisJCX0KKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBFUlJPUigiSW52YWxpZCBsb2NrIHNwZWNpZmllZC5cbiIpOworCisJCWVyciA9IE1FX0VSUk5PX0lOVkFMSURfTE9DSzsKKworCQlicmVhazsKKwl9CisKKwlzcGluX3VubG9jaygmbWVfbG9jayk7CisKKwl1cF9yZWFkKCZtZV9yd3NlbSk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lX2xvY2tfZHJpdmVyKHN0cnVjdCBmaWxlICpmaWxlcCwgbWVfbG9ja19kcml2ZXJfdCAqIGFyZykKK3sKKwlpbnQgZXJyID0gMDsKKworCW1lX2xvY2tfZHJpdmVyX3QgbG9jazsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWVyciA9IGNvcHlfZnJvbV91c2VyKCZsb2NrLCBhcmcsIHNpemVvZihtZV9sb2NrX2RyaXZlcl90KSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2FuJ3QgY29weSBhcmd1bWVudHMgdG8ga2VybmVsIHNwYWNlLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWxvY2suZXJybm8gPSBsb2NrX2RyaXZlcihmaWxlcCwgbG9jay5sb2NrLCBsb2NrLmZsYWdzKTsKKworCWVyciA9IGNvcHlfdG9fdXNlcihhcmcsICZsb2NrLCBzaXplb2YobWVfbG9ja19kcml2ZXJfdCkpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbid0IGNvcHkgcXVlcnkgYmFjayB0byB1c2VyIHNwYWNlLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lX29wZW4oc3RydWN0IGlub2RlICppbm9kZV9wdHIsIHN0cnVjdCBmaWxlICpmaWxlcCkKK3sKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwkvLyBOb3RoaW5nIHRvIGRvIGhlcmUuCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWVfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlX3B0ciwgc3RydWN0IGZpbGUgKmZpbGVwKQoreworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCWxvY2tfZHJpdmVyKGZpbGVwLCBNRV9MT0NLX1JFTEVBU0UsIE1FX0xPQ0tfRFJJVkVSX05PX0ZMQUdTKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1lX3F1ZXJ5X3ZlcnNpb25fbWFpbl9kcml2ZXIoc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCQltZV9xdWVyeV92ZXJzaW9uX21haW5fZHJpdmVyX3QgKiBhcmcpCit7CisJaW50IGVycjsKKwltZV9xdWVyeV92ZXJzaW9uX21haW5fZHJpdmVyX3Qga2FyZzsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWthcmcudmVyc2lvbiA9IE1FX1ZFUlNJT05fRFJJVkVSOworCWthcmcuZXJybm8gPSBNRV9FUlJOT19TVUNDRVNTOworCisJZXJyID0gY29weV90b191c2VyKGFyZywgJmthcmcsIHNpemVvZihtZV9xdWVyeV92ZXJzaW9uX21haW5fZHJpdmVyX3QpKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IHF1ZXJ5IGJhY2sgdG8gdXNlciBzcGFjZS5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZV9jb25maWdfbG9hZF9kZXZpY2Uoc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSBtZV9jZmdfZGV2aWNlX2VudHJ5X3QgKiBrYXJnLCBpbnQgZGV2aWNlX25vKQoreworCisJaW50IGVyciA9IE1FX0VSUk5PX1NVQ0NFU1M7CisJaW50IGsgPSAwOworCisJc3RydWN0IGxpc3RfaGVhZCAqcG9zID0gTlVMTDsKKwltZV9kZXZpY2VfdCAqZGV2aWNlID0gTlVMTDsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWxpc3RfZm9yX2VhY2gocG9zLCAmbWVfZGV2aWNlX2xpc3QpIHsKKwkJaWYgKGsgPT0gZGV2aWNlX25vKSB7CisJCQlkZXZpY2UgPSBsaXN0X2VudHJ5KHBvcywgbWVfZGV2aWNlX3QsIGxpc3QpOworCQkJYnJlYWs7CisJCX0KKworCQlrKys7CisJfQorCisJaWYgKHBvcyA9PSAmbWVfZGV2aWNlX2xpc3QpIHsKKwkJUEVSUk9SKCJJbnZhbGlkIGRldmljZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19JTlZBTElEX0RFVklDRTsKKwl9IGVsc2UgeworCQlzcGluX2xvY2soJm1lX2xvY2spOworCisJCWlmICgobWVfZmlsZXAgIT0gTlVMTCkgJiYgKG1lX2ZpbGVwICE9IGZpbGVwKSkgeworCQkJc3Bpbl91bmxvY2soJm1lX2xvY2spOworCQkJUEVSUk9SKCJSZXNvdXJjZSBpcyBsb2NrZWQgYnkgYW5vdGhlciBwcm9jZXNzLlxuIik7CisJCQlyZXR1cm4gTUVfRVJSTk9fTE9DS0VEOworCQl9IGVsc2UgeworCQkJbWVfY291bnQrKzsKKwkJCXNwaW5fdW5sb2NrKCZtZV9sb2NrKTsKKworCQkJZXJyID0KKwkJCSAgICBkZXZpY2UtPm1lX2RldmljZV9jb25maWdfbG9hZChkZXZpY2UsIGZpbGVwLCBrYXJnKTsKKworCQkJc3Bpbl9sb2NrKCZtZV9sb2NrKTsKKwkJCW1lX2NvdW50LS07CisJCQlzcGluX3VubG9jaygmbWVfbG9jayk7CisJCX0KKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lX2NvbmZpZ19sb2FkKHN0cnVjdCBmaWxlICpmaWxlcCwgbWVfY29uZmlnX2xvYWRfdCAqIGFyZykKK3sKKwlpbnQgZXJyOworCWludCBpOworCW1lX2NvbmZpZ19sb2FkX3QgY2ZnX3NldHVwOworCW1lX2NvbmZpZ19sb2FkX3Qga2FyZ19jZmdfc2V0dXA7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MgPSBOVUxMOworCisJc3RydWN0IGxpc3RfaGVhZCBuZXdfbGlzdDsKKwltZV9kZXZpY2VfdCAqb19kZXZpY2U7CisJbWVfZGV2aWNlX3QgKm5fZGV2aWNlOworCWludCBvX3ZlbmRvcl9pZDsKKwlpbnQgb19kZXZpY2VfaWQ7CisJaW50IG9fc2VyaWFsX25vOworCWludCBvX2J1c190eXBlOworCWludCBvX2J1c19ubzsKKwlpbnQgb19kZXZfbm87CisJaW50IG9fZnVuY19ubzsKKwlpbnQgb19wbHVnZ2VkOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLy8gQ29weSBhcmd1bWVudCB0byBrZXJuZWwgc3BhY2UuCisJZXJyID0gY29weV9mcm9tX3VzZXIoJmthcmdfY2ZnX3NldHVwLCBhcmcsIHNpemVvZihtZV9jb25maWdfbG9hZF90KSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2FuJ3QgY29weSBhcmd1bWVudHMgdG8ga2VybmVsIHNwYWNlLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwkvLyBBbGxvY2F0ZSBrZXJuZWwgYnVmZmVyIGZvciBkZXZpY2UgbGlzdC4KKwljZmdfc2V0dXAuZGV2aWNlX2xpc3QgPQorCSAgICBrbWFsbG9jKHNpemVvZihtZV9jZmdfZGV2aWNlX2VudHJ5X3QpICoga2FyZ19jZmdfc2V0dXAuY291bnQsCisJCSAgICBHRlBfS0VSTkVMKTsKKworCWlmICghY2ZnX3NldHVwLmRldmljZV9saXN0KSB7CisJCVBFUlJPUigiQ2FuJ3QgZ2V0IGJ1ZmZlciAlbGkgZm9yIGRldmljZSBsaXN0LlxuIiwKKwkJICAgICAgIHNpemVvZihtZV9jZmdfZGV2aWNlX2VudHJ5X3QpICoga2FyZ19jZmdfc2V0dXAuY291bnQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLy8gQ29weSBkZXZpY2UgbGlzdCB0byBrZXJuZWwgc3BhY2UuCisJZXJyID0KKwkgICAgY29weV9mcm9tX3VzZXIoY2ZnX3NldHVwLmRldmljZV9saXN0LCBrYXJnX2NmZ19zZXR1cC5kZXZpY2VfbGlzdCwKKwkJCSAgIHNpemVvZihtZV9jZmdfZGV2aWNlX2VudHJ5X3QpICoKKwkJCSAgIGthcmdfY2ZnX3NldHVwLmNvdW50KTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IGRldmljZSBsaXN0IHRvIGtlcm5lbCBzcGFjZS5cbiIpOworCQlrZnJlZShjZmdfc2V0dXAuZGV2aWNlX2xpc3QpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwljZmdfc2V0dXAuY291bnQgPSBrYXJnX2NmZ19zZXR1cC5jb3VudDsKKworCUlOSVRfTElTVF9IRUFEKCZuZXdfbGlzdCk7CisKKwlkb3duX3dyaXRlKCZtZV9yd3NlbSk7CisKKwlzcGluX2xvY2soJm1lX2xvY2spOworCisJaWYgKChtZV9maWxlcCAhPSBOVUxMKSAmJiAobWVfZmlsZXAgIT0gZmlsZXApKSB7CisJCXNwaW5fdW5sb2NrKCZtZV9sb2NrKTsKKwkJUEVSUk9SKCJEcml2ZXIgU3lzdGVtIGlzIGxvZ2dlZCBieSBhbm90aGVyIHByb2Nlc3MuXG4iKTsKKwkJa2FyZ19jZmdfc2V0dXAuZXJybm8gPSBNRV9FUlJOT19MT0NLRUQ7CisJfSBlbHNlIHsKKwkJbWVfY291bnQrKzsKKwkJc3Bpbl91bmxvY2soJm1lX2xvY2spOworCisJCWZvciAoaSA9IDA7IGkgPCBrYXJnX2NmZ19zZXR1cC5jb3VudDsgaSsrKSB7CisJCQlQREVCVUcoIm1lX2NvbmZpZ19sb2FkKCkgZGV2aWNlPSVkLlxuIiwgaSk7CisJCQlpZiAoY2ZnX3NldHVwLmRldmljZV9saXN0W2ldLnRjcGlwLmFjY2Vzc190eXBlID09CisJCQkgICAgTUVfQUNDRVNTX1RZUEVfTE9DQUwpIHsKKwkJCQlsaXN0X2Zvcl9lYWNoKHBvcywgJm1lX2RldmljZV9saXN0KSB7CisJCQkJCW9fZGV2aWNlID0KKwkJCQkJICAgIGxpc3RfZW50cnkocG9zLCBtZV9kZXZpY2VfdCwgbGlzdCk7CisJCQkJCW9fZGV2aWNlLT4KKwkJCQkJICAgIG1lX2RldmljZV9xdWVyeV9pbmZvX2RldmljZQorCQkJCQkgICAgKG9fZGV2aWNlLCAmb192ZW5kb3JfaWQsCisJCQkJCSAgICAgJm9fZGV2aWNlX2lkLCAmb19zZXJpYWxfbm8sCisJCQkJCSAgICAgJm9fYnVzX3R5cGUsICZvX2J1c19ubywgJm9fZGV2X25vLAorCQkJCQkgICAgICZvX2Z1bmNfbm8sICZvX3BsdWdnZWQpOworCisJCQkJCWlmIChjZmdfc2V0dXAuZGV2aWNlX2xpc3RbaV0uaW5mby4KKwkJCQkJICAgIGh3X2xvY2F0aW9uLmJ1c190eXBlID09CisJCQkJCSAgICBNRV9CVVNfVFlQRV9QQ0kpIHsKKwkJCQkJCWlmICgoKG9fdmVuZG9yX2lkID09CisJCQkJCQkgICAgICBjZmdfc2V0dXAuZGV2aWNlX2xpc3RbaV0uCisJCQkJCQkgICAgICBpbmZvLnZlbmRvcl9pZCkKKwkJCQkJCSAgICAgJiYgKG9fZGV2aWNlX2lkID09CisJCQkJCQkJIGNmZ19zZXR1cC4KKwkJCQkJCQkgZGV2aWNlX2xpc3RbaV0uaW5mby4KKwkJCQkJCQkgZGV2aWNlX2lkKQorCQkJCQkJICAgICAmJiAob19zZXJpYWxfbm8gPT0KKwkJCQkJCQkgY2ZnX3NldHVwLgorCQkJCQkJCSBkZXZpY2VfbGlzdFtpXS5pbmZvLgorCQkJCQkJCSBzZXJpYWxfbm8pCisJCQkJCQkgICAgICYmIChvX2J1c190eXBlID09CisJCQkJCQkJIGNmZ19zZXR1cC4KKwkJCQkJCQkgZGV2aWNlX2xpc3RbaV0uaW5mby4KKwkJCQkJCQkgaHdfbG9jYXRpb24uYnVzX3R5cGUpKQorCQkJCQkJICAgIHx8CisJCQkJCQkgICAgKChvX3ZlbmRvcl9pZCA9PQorCQkJCQkJICAgICAgY2ZnX3NldHVwLmRldmljZV9saXN0W2ldLgorCQkJCQkJICAgICAgaW5mby52ZW5kb3JfaWQpCisJCQkJCQkgICAgICYmIChvX2RldmljZV9pZCA9PQorCQkJCQkJCSBjZmdfc2V0dXAuCisJCQkJCQkJIGRldmljZV9saXN0W2ldLmluZm8uCisJCQkJCQkJIGRldmljZV9pZCkKKwkJCQkJCSAgICAgJiYgKG9fYnVzX3R5cGUgPT0KKwkJCQkJCQkgY2ZnX3NldHVwLgorCQkJCQkJCSBkZXZpY2VfbGlzdFtpXS5pbmZvLgorCQkJCQkJCSBod19sb2NhdGlvbi5idXNfdHlwZSkKKwkJCQkJCSAgICAgJiYgKG9fYnVzX25vID09CisJCQkJCQkJIGNmZ19zZXR1cC4KKwkJCQkJCQkgZGV2aWNlX2xpc3RbaV0uaW5mby4KKwkJCQkJCQkgaHdfbG9jYXRpb24ucGNpLmJ1c19ubykKKwkJCQkJCSAgICAgJiYgKG9fZGV2X25vID09CisJCQkJCQkJIGNmZ19zZXR1cC4KKwkJCQkJCQkgZGV2aWNlX2xpc3RbaV0uaW5mby4KKwkJCQkJCQkgaHdfbG9jYXRpb24ucGNpLgorCQkJCQkJCSBkZXZpY2Vfbm8pCisJCQkJCQkgICAgICYmIChvX2Z1bmNfbm8gPT0KKwkJCQkJCQkgY2ZnX3NldHVwLgorCQkJCQkJCSBkZXZpY2VfbGlzdFtpXS5pbmZvLgorCQkJCQkJCSBod19sb2NhdGlvbi5wY2kuCisJCQkJCQkJIGZ1bmN0aW9uX25vKSkpIHsKKwkJCQkJCQlsaXN0X21vdmVfdGFpbChwb3MsCisJCQkJCQkJCSAgICAgICAmbmV3X2xpc3QpOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisvKgorCQkJCQllbHNlIGlmIChjZmdfc2V0dXAuZGV2aWNlX2xpc3RbaV0uaW5mby5od19sb2NhdGlvbi5idXNfdHlwZSA9PSBNRV9CVVNfVFlQRV9VU0IpCisJCQkJCXsKKwkJCQkJCWlmICgoKG9fdmVuZG9yX2lkID09IGNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXS5pbmZvLnZlbmRvcl9pZCkgJiYKKwkJCQkJCSAgICAgICAgKG9fZGV2aWNlX2lkID09IGNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXS5pbmZvLmRldmljZV9pZCkgJiYKKwkJCQkJCSAgICAgICAgKG9fc2VyaWFsX25vID09IGNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXS5pbmZvLnNlcmlhbF9ubykgJiYKKwkJCQkJCSAgICAgICAgKG9fYnVzX3R5cGUgPT0gY2ZnX3NldHVwLmRldmljZV9saXN0W2ldLmluZm8uaHdfbG9jYXRpb24uYnVzX3R5cGUpKSB8fAorCQkJCQkJICAgICAgICAoKG9fdmVuZG9yX2lkID09IGNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXS5pbmZvLnZlbmRvcl9pZCkgJiYKKwkJCQkJCSAgICAgICAgIChvX2RldmljZV9pZCA9PSBjZmdfc2V0dXAuZGV2aWNlX2xpc3RbaV0uaW5mby5kZXZpY2VfaWQpICYmCisJCQkJCQkgICAgICAgICAob19idXNfdHlwZSA9PSBjZmdfc2V0dXAuZGV2aWNlX2xpc3RbaV0uaW5mby5od19sb2NhdGlvbi5idXNfdHlwZSkgJiYKKwkJCQkJCSAgICAgICAgIChvX2J1c19ubyA9PSBjZmdfc2V0dXAuZGV2aWNlX2xpc3RbaV0uaW5mby5od19sb2NhdGlvbi51c2Iucm9vdF9odWJfbm8pKSkKKwkJCQkJCXsKKwkJCQkJCQlsaXN0X21vdmVfdGFpbChwb3MsICZuZXdfbGlzdCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKyovCisJCQkJCWVsc2UgeworCQkJCQkJUEVSUk9SKCJXcm9uZyBidXMgdHlwZTogJWQuXG4iLAorCQkJCQkJICAgICAgIGNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXS4KKwkJCQkJCSAgICAgICBpbmZvLmh3X2xvY2F0aW9uLgorCQkJCQkJICAgICAgIGJ1c190eXBlKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmIChwb3MgPT0gJm1lX2RldmljZV9saXN0KSB7CS8vIERldmljZSBpcyBub3QgYWxyZWFkeSBpbiB0aGUgbGlzdAorCQkJCQlpZiAoY2ZnX3NldHVwLmRldmljZV9saXN0W2ldLmluZm8uCisJCQkJCSAgICBod19sb2NhdGlvbi5idXNfdHlwZSA9PQorCQkJCQkgICAgTUVfQlVTX1RZUEVfUENJKSB7CisJCQkJCQluX2RldmljZSA9CisJCQkJCQkgICAgZ2V0X2R1bW15X2luc3RhbmNlCisJCQkJCQkgICAgKGNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXS4KKwkJCQkJCSAgICAgaW5mby52ZW5kb3JfaWQsCisJCQkJCQkgICAgIGNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXS4KKwkJCQkJCSAgICAgaW5mby5kZXZpY2VfaWQsCisJCQkJCQkgICAgIGNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXS4KKwkJCQkJCSAgICAgaW5mby5zZXJpYWxfbm8sCisJCQkJCQkgICAgIGNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXS4KKwkJCQkJCSAgICAgaW5mby5od19sb2NhdGlvbi5idXNfdHlwZSwKKwkJCQkJCSAgICAgY2ZnX3NldHVwLmRldmljZV9saXN0W2ldLgorCQkJCQkJICAgICBpbmZvLmh3X2xvY2F0aW9uLnBjaS4KKwkJCQkJCSAgICAgYnVzX25vLAorCQkJCQkJICAgICBjZmdfc2V0dXAuZGV2aWNlX2xpc3RbaV0uCisJCQkJCQkgICAgIGluZm8uaHdfbG9jYXRpb24ucGNpLgorCQkJCQkJICAgICBkZXZpY2Vfbm8sCisJCQkJCQkgICAgIGNmZ19zZXR1cC5kZXZpY2VfbGlzdFtpXS4KKwkJCQkJCSAgICAgaW5mby5od19sb2NhdGlvbi5wY2kuCisJCQkJCQkgICAgIGZ1bmN0aW9uX25vKTsKKworCQkJCQkJaWYgKCFuX2RldmljZSkgeworCQkJCQkJCVBFUlJPUgorCQkJCQkJCSAgICAoIkNhbid0IGdldCBkdW1teSBpbnN0YW5jZS5cbiIpOworCQkJCQkJCWtmcmVlKGNmZ19zZXR1cC4KKwkJCQkJCQkgICAgICBkZXZpY2VfbGlzdCk7CisJCQkJCQkJc3Bpbl9sb2NrKCZtZV9sb2NrKTsKKwkJCQkJCQltZV9jb3VudC0tOworCQkJCQkJCXNwaW5fdW5sb2NrKCZtZV9sb2NrKTsKKwkJCQkJCQl1cF93cml0ZSgmbWVfcndzZW0pOworCQkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQkJfQorCisJCQkJCQlsaXN0X2FkZF90YWlsKCZuX2RldmljZS0+bGlzdCwKKwkJCQkJCQkgICAgICAmbmV3X2xpc3QpOworCQkJCQl9CisvKgorCQkJCQllbHNlIGlmIChjZmdfc2V0dXAuZGV2aWNlX2xpc3RbaV0uaW5mby5od19sb2NhdGlvbi5idXNfdHlwZSA9PSBNRV9CVVNfVFlQRV9VU0IpCisJCQkJCXsKKwkJCQkJCW5fZGV2aWNlID0gZ2V0X2R1bW15X2luc3RhbmNlKAorCQkJCQkJICAgICAgICAgICAgICAgY2ZnX3NldHVwLmRldmljZV9saXN0W2ldLmluZm8udmVuZG9yX2lkLAorCQkJCQkJICAgICAgICAgICAgICAgY2ZnX3NldHVwLmRldmljZV9saXN0W2ldLmluZm8uZGV2aWNlX2lkLAorCQkJCQkJICAgICAgICAgICAgICAgY2ZnX3NldHVwLmRldmljZV9saXN0W2ldLmluZm8uc2VyaWFsX25vLAorCQkJCQkJICAgICAgICAgICAgICAgY2ZnX3NldHVwLmRldmljZV9saXN0W2ldLmluZm8uaHdfbG9jYXRpb24uYnVzX3R5cGUsCisJCQkJCQkgICAgICAgICAgICAgICBjZmdfc2V0dXAuZGV2aWNlX2xpc3RbaV0uaW5mby5od19sb2NhdGlvbi51c2Iucm9vdF9odWJfbm8sCisJCQkJCQkgICAgICAgICAgICAgICAwLAorCQkJCQkJICAgICAgICAgICAgICAgMCk7CisKKwkJCQkJCWlmICghbl9kZXZpY2UpCisJCQkJCQl7CisJCQkJCQkJUEVSUk9SKCJDYW4ndCBnZXQgZHVtbXkgaW5zdGFuY2UuXG4iKTsKKwkJCQkJCQlrZnJlZShjZmdfc2V0dXAuZGV2aWNlX2xpc3QpOworCQkJCQkJCXNwaW5fbG9jaygmbWVfbG9jayk7CisJCQkJCQkJbWVfY291bnQtLTsKKwkJCQkJCQlzcGluX3VubG9jaygmbWVfbG9jayk7CisJCQkJCQkJdXBfd3JpdGUoJm1lX3J3c2VtKTsKKwkJCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQkJCX0KKworCQkJCQkJbGlzdF9hZGRfdGFpbCgmbl9kZXZpY2UtPmxpc3QsICZuZXdfbGlzdCk7CisJCQkJCX0KKyovCisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQluX2RldmljZSA9IGdldF9kdW1teV9pbnN0YW5jZSgwLAorCQkJCQkJCSAgICAgIDAsIDAsIDAsIDAsIDAsIDApOworCisJCQkJaWYgKCFuX2RldmljZSkgeworCQkJCQlQRVJST1IoIkNhbid0IGdldCBkdW1teSBpbnN0YW5jZS5cbiIpOworCQkJCQlrZnJlZShjZmdfc2V0dXAuZGV2aWNlX2xpc3QpOworCQkJCQlzcGluX2xvY2soJm1lX2xvY2spOworCQkJCQltZV9jb3VudC0tOworCQkJCQlzcGluX3VubG9jaygmbWVfbG9jayk7CisJCQkJCXVwX3dyaXRlKCZtZV9yd3NlbSk7CisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKworCQkJCWxpc3RfYWRkX3RhaWwoJm5fZGV2aWNlLT5saXN0LCAmbmV3X2xpc3QpOworCQkJfQorCQl9CisKKwkJd2hpbGUgKCFsaXN0X2VtcHR5KCZtZV9kZXZpY2VfbGlzdCkpIHsKKwkJCW9fZGV2aWNlID0KKwkJCSAgICBsaXN0X2VudHJ5KG1lX2RldmljZV9saXN0Lm5leHQsIG1lX2RldmljZV90LCBsaXN0KTsKKwkJCW9fZGV2aWNlLT5tZV9kZXZpY2VfcXVlcnlfaW5mb19kZXZpY2Uob19kZXZpY2UsCisJCQkJCQkJICAgICAgJm9fdmVuZG9yX2lkLAorCQkJCQkJCSAgICAgICZvX2RldmljZV9pZCwKKwkJCQkJCQkgICAgICAmb19zZXJpYWxfbm8sCisJCQkJCQkJICAgICAgJm9fYnVzX3R5cGUsCisJCQkJCQkJICAgICAgJm9fYnVzX25vLAorCQkJCQkJCSAgICAgICZvX2Rldl9ubywKKwkJCQkJCQkgICAgICAmb19mdW5jX25vLAorCQkJCQkJCSAgICAgICZvX3BsdWdnZWQpOworCisJCQlpZiAob19wbHVnZ2VkID09IE1FX1BMVUdHRURfSU4pIHsKKwkJCQlsaXN0X21vdmVfdGFpbChtZV9kZXZpY2VfbGlzdC5uZXh0LCAmbmV3X2xpc3QpOworCQkJfSBlbHNlIHsKKwkJCQlsaXN0X2RlbChtZV9kZXZpY2VfbGlzdC5uZXh0KTsKKwkJCQlyZWxlYXNlX2luc3RhbmNlKG9fZGV2aWNlKTsKKwkJCX0KKwkJfQorCisJCS8vIE1vdmUgdGVtcG9yYXJ5IG5ldyBsaXN0IHRvIGdsb2JhbCBkcml2ZXIgbGlzdC4KKwkJbGlzdF9zcGxpY2UoJm5ld19saXN0LCAmbWVfZGV2aWNlX2xpc3QpOworCisJCWthcmdfY2ZnX3NldHVwLmVycm5vID0gTUVfRVJSTk9fU1VDQ0VTUzsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgY2ZnX3NldHVwLmNvdW50OyBpKyspIHsKKworCQlrYXJnX2NmZ19zZXR1cC5lcnJubyA9CisJCSAgICBtZV9jb25maWdfbG9hZF9kZXZpY2UoZmlsZXAsICZjZmdfc2V0dXAuZGV2aWNlX2xpc3RbaV0sIGkpOworCQlpZiAoa2FyZ19jZmdfc2V0dXAuZXJybm8pIHsKKwkJCVBFUlJPUigibWVfY29uZmlnX2xvYWRfZGV2aWNlKCVkKT0lZFxuIiwgaSwKKwkJCSAgICAgICBrYXJnX2NmZ19zZXR1cC5lcnJubyk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXNwaW5fbG9jaygmbWVfbG9jayk7CisKKwltZV9jb3VudC0tOworCXNwaW5fdW5sb2NrKCZtZV9sb2NrKTsKKwl1cF93cml0ZSgmbWVfcndzZW0pOworCisJZXJyID0gY29weV90b191c2VyKGFyZywgJmthcmdfY2ZnX3NldHVwLCBzaXplb2YobWVfY29uZmlnX2xvYWRfdCkpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbid0IGNvcHkgY29uZmlnIGxpc3QgdG8gdXNlciBzcGFjZS5cbiIpOworCQlrZnJlZShjZmdfc2V0dXAuZGV2aWNlX2xpc3QpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlrZnJlZShjZmdfc2V0dXAuZGV2aWNlX2xpc3QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1lX2lvX3N0cmVhbV9zdGFydChzdHJ1Y3QgZmlsZSAqZmlsZXAsIG1lX2lvX3N0cmVhbV9zdGFydF90ICogYXJnKQoreworCWludCBlcnI7CisJaW50IGksIGs7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJbWVfZGV2aWNlX3QgKmRldmljZTsKKwltZV9pb19zdHJlYW1fc3RhcnRfdCBrYXJnOworCW1lSU9TdHJlYW1TdGFydF90ICpsaXN0OworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJZXJyID0gY29weV9mcm9tX3VzZXIoJmthcmcsIGFyZywgc2l6ZW9mKG1lX2lvX3N0cmVhbV9zdGFydF90KSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2FuJ3QgY29weSBhcmd1bWVudHMgdG8ga2VybmVsIHNwYWNlLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWthcmcuZXJybm8gPSBNRV9FUlJOT19TVUNDRVNTOworCisJbGlzdCA9IGttYWxsb2Moc2l6ZW9mKG1lSU9TdHJlYW1TdGFydF90KSAqIGthcmcuY291bnQsIEdGUF9LRVJORUwpOworCisJaWYgKCFsaXN0KSB7CisJCVBFUlJPUigiQ2FuJ3QgZ2V0IGJ1ZmZlciBmb3Igc3RhcnQgbGlzdC5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwllcnIgPQorCSAgICBjb3B5X2Zyb21fdXNlcihsaXN0LCBrYXJnLnN0YXJ0X2xpc3QsCisJCQkgICBzaXplb2YobWVJT1N0cmVhbVN0YXJ0X3QpICoga2FyZy5jb3VudCk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2FuJ3QgY29weSBzdGFydCBsaXN0IHRvIGtlcm5lbCBzcGFjZS5cbiIpOworCQlrZnJlZShsaXN0KTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJc3Bpbl9sb2NrKCZtZV9sb2NrKTsKKworCWlmICgobWVfZmlsZXAgIT0gTlVMTCkgJiYgKG1lX2ZpbGVwICE9IGZpbGVwKSkgeworCQlzcGluX3VubG9jaygmbWVfbG9jayk7CisJCVBFUlJPUigiRHJpdmVyIFN5c3RlbSBpcyBsb2dnZWQgYnkgYW5vdGhlciBwcm9jZXNzLlxuIik7CisKKwkJZm9yIChpID0gMDsgaSA8IGthcmcuY291bnQ7IGkrKykgeworCQkJbGlzdFtpXS5pRXJybm8gPSBNRV9FUlJOT19MT0NLRUQ7CisJCX0KKwl9IGVsc2UgeworCQltZV9jb3VudCsrOworCQlzcGluX3VubG9jaygmbWVfbG9jayk7CisKKwkJZm9yIChpID0gMDsgaSA8IGthcmcuY291bnQ7IGkrKykgeworCQkJZG93bl9yZWFkKCZtZV9yd3NlbSk7CisJCQlrID0gMDsKKwkJCWxpc3RfZm9yX2VhY2gocG9zLCAmbWVfZGV2aWNlX2xpc3QpIHsKKwkJCQlpZiAoayA9PSBsaXN0W2ldLmlEZXZpY2UpIHsKKwkJCQkJZGV2aWNlID0KKwkJCQkJICAgIGxpc3RfZW50cnkocG9zLCBtZV9kZXZpY2VfdCwgbGlzdCk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWsrKzsKKwkJCX0KKworCQkJaWYgKHBvcyA9PSAmbWVfZGV2aWNlX2xpc3QpIHsKKwkJCQl1cF9yZWFkKCZtZV9yd3NlbSk7CisJCQkJUEVSUk9SKCJJbnZhbGlkIGRldmljZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQkJbGlzdFtpXS5pRXJybm8gPSBNRV9FUlJOT19JTlZBTElEX0RFVklDRTsKKwkJCQlrYXJnLmVycm5vID0gTUVfRVJSTk9fSU5WQUxJRF9ERVZJQ0U7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCWxpc3RbaV0uaUVycm5vID0KKwkJCQkgICAgZGV2aWNlLT5tZV9kZXZpY2VfaW9fc3RyZWFtX3N0YXJ0KGRldmljZSwKKwkJCQkJCQkJICAgICAgZmlsZXAsCisJCQkJCQkJCSAgICAgIGxpc3RbaV0uCisJCQkJCQkJCSAgICAgIGlTdWJkZXZpY2UsCisJCQkJCQkJCSAgICAgIGxpc3RbaV0uCisJCQkJCQkJCSAgICAgIGlTdGFydE1vZGUsCisJCQkJCQkJCSAgICAgIGxpc3RbaV0uCisJCQkJCQkJCSAgICAgIGlUaW1lT3V0LAorCQkJCQkJCQkgICAgICBsaXN0W2ldLgorCQkJCQkJCQkgICAgICBpRmxhZ3MpOworCisJCQkJaWYgKGxpc3RbaV0uaUVycm5vKSB7CisJCQkJCXVwX3JlYWQoJm1lX3J3c2VtKTsKKwkJCQkJa2FyZy5lcnJubyA9IGxpc3RbaV0uaUVycm5vOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCXVwX3JlYWQoJm1lX3J3c2VtKTsKKwkJfQorCisJCXNwaW5fbG9jaygmbWVfbG9jayk7CisKKwkJbWVfY291bnQtLTsKKwkJc3Bpbl91bmxvY2soJm1lX2xvY2spOworCX0KKworCWVyciA9IGNvcHlfdG9fdXNlcihhcmcsICZrYXJnLCBzaXplb2YobWVfaW9fc3RyZWFtX3N0YXJ0X3QpKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IGFyZ3VtZW50cyB0byB1c2VyIHNwYWNlLlxuIik7CisJCWtmcmVlKGxpc3QpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwllcnIgPQorCSAgICBjb3B5X3RvX3VzZXIoa2FyZy5zdGFydF9saXN0LCBsaXN0LAorCQkJIHNpemVvZihtZUlPU3RyZWFtU3RhcnRfdCkgKiBrYXJnLmNvdW50KTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IHN0YXJ0IGxpc3QgdG8gdXNlciBzcGFjZS5cbiIpOworCQlrZnJlZShsaXN0KTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJa2ZyZWUobGlzdCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1lX2lvX3NpbmdsZShzdHJ1Y3QgZmlsZSAqZmlsZXAsIG1lX2lvX3NpbmdsZV90ICogYXJnKQoreworCWludCBlcnI7CisJaW50IGksIGs7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJbWVfZGV2aWNlX3QgKmRldmljZTsKKwltZV9pb19zaW5nbGVfdCBrYXJnOworCW1lSU9TaW5nbGVfdCAqbGlzdDsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWVyciA9IGNvcHlfZnJvbV91c2VyKCZrYXJnLCBhcmcsIHNpemVvZihtZV9pb19zaW5nbGVfdCkpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbid0IGNvcHkgYXJndW1lbnRzIHRvIGtlcm5lbCBzcGFjZS5cbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlrYXJnLmVycm5vID0gTUVfRVJSTk9fU1VDQ0VTUzsKKworCWxpc3QgPSBrbWFsbG9jKHNpemVvZihtZUlPU2luZ2xlX3QpICoga2FyZy5jb3VudCwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWxpc3QpIHsKKwkJUEVSUk9SKCJDYW4ndCBnZXQgYnVmZmVyIGZvciBzaW5nbGUgbGlzdC5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwllcnIgPQorCSAgICBjb3B5X2Zyb21fdXNlcihsaXN0LCBrYXJnLnNpbmdsZV9saXN0LAorCQkJICAgc2l6ZW9mKG1lSU9TaW5nbGVfdCkgKiBrYXJnLmNvdW50KTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IHNpbmdsZSBsaXN0IHRvIGtlcm5lbCBzcGFjZS5cbiIpOworCQlrZnJlZShsaXN0KTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJc3Bpbl9sb2NrKCZtZV9sb2NrKTsKKworCWlmICgobWVfZmlsZXAgIT0gTlVMTCkgJiYgKG1lX2ZpbGVwICE9IGZpbGVwKSkgeworCQlzcGluX3VubG9jaygmbWVfbG9jayk7CisJCVBFUlJPUigiRHJpdmVyIFN5c3RlbSBpcyBsb2dnZWQgYnkgYW5vdGhlciBwcm9jZXNzLlxuIik7CisKKwkJZm9yIChpID0gMDsgaSA8IGthcmcuY291bnQ7IGkrKykgeworCQkJbGlzdFtpXS5pRXJybm8gPSBNRV9FUlJOT19MT0NLRUQ7CisJCX0KKwl9IGVsc2UgeworCQltZV9jb3VudCsrOworCQlzcGluX3VubG9jaygmbWVfbG9jayk7CisKKwkJZm9yIChpID0gMDsgaSA8IGthcmcuY291bnQ7IGkrKykgeworCQkJayA9IDA7CisKKwkJCWRvd25fcmVhZCgmbWVfcndzZW0pOworCisJCQlsaXN0X2Zvcl9lYWNoKHBvcywgJm1lX2RldmljZV9saXN0KSB7CisJCQkJaWYgKGsgPT0gbGlzdFtpXS5pRGV2aWNlKSB7CisJCQkJCWRldmljZSA9CisJCQkJCSAgICBsaXN0X2VudHJ5KHBvcywgbWVfZGV2aWNlX3QsIGxpc3QpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlrKys7CisJCQl9CisKKwkJCWlmIChwb3MgPT0gJm1lX2RldmljZV9saXN0KSB7CisJCQkJdXBfcmVhZCgmbWVfcndzZW0pOworCQkJCVBFUlJPUigiSW52YWxpZCBkZXZpY2UgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJCWxpc3RbaV0uaUVycm5vID0gTUVfRVJSTk9fSU5WQUxJRF9ERVZJQ0U7CisJCQkJa2FyZy5lcnJubyA9IE1FX0VSUk5PX0lOVkFMSURfREVWSUNFOworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlpZiAobGlzdFtpXS5pRGlyID09IE1FX0RJUl9PVVRQVVQpIHsKKwkJCQkJbGlzdFtpXS5pRXJybm8gPQorCQkJCQkgICAgZGV2aWNlLT4KKwkJCQkJICAgIG1lX2RldmljZV9pb19zaW5nbGVfd3JpdGUoZGV2aWNlLAorCQkJCQkJCQkgICAgICBmaWxlcCwKKwkJCQkJCQkJICAgICAgbGlzdFtpXS4KKwkJCQkJCQkJICAgICAgaVN1YmRldmljZSwKKwkJCQkJCQkJICAgICAgbGlzdFtpXS4KKwkJCQkJCQkJICAgICAgaUNoYW5uZWwsCisJCQkJCQkJCSAgICAgIGxpc3RbaV0uCisJCQkJCQkJCSAgICAgIGlWYWx1ZSwKKwkJCQkJCQkJICAgICAgbGlzdFtpXS4KKwkJCQkJCQkJICAgICAgaVRpbWVPdXQsCisJCQkJCQkJCSAgICAgIGxpc3RbaV0uCisJCQkJCQkJCSAgICAgIGlGbGFncyk7CisKKwkJCQkJaWYgKGxpc3RbaV0uaUVycm5vKSB7CisJCQkJCQl1cF9yZWFkKCZtZV9yd3NlbSk7CisJCQkJCQlrYXJnLmVycm5vID0gbGlzdFtpXS5pRXJybm87CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAobGlzdFtpXS5pRGlyID09IE1FX0RJUl9JTlBVVCkgeworCQkJCQlsaXN0W2ldLmlFcnJubyA9CisJCQkJCSAgICBkZXZpY2UtPgorCQkJCQkgICAgbWVfZGV2aWNlX2lvX3NpbmdsZV9yZWFkKGRldmljZSwKKwkJCQkJCQkJICAgICBmaWxlcCwKKwkJCQkJCQkJICAgICBsaXN0W2ldLgorCQkJCQkJCQkgICAgIGlTdWJkZXZpY2UsCisJCQkJCQkJCSAgICAgbGlzdFtpXS4KKwkJCQkJCQkJICAgICBpQ2hhbm5lbCwKKwkJCQkJCQkJICAgICAmbGlzdFtpXS4KKwkJCQkJCQkJICAgICBpVmFsdWUsCisJCQkJCQkJCSAgICAgbGlzdFtpXS4KKwkJCQkJCQkJICAgICBpVGltZU91dCwKKwkJCQkJCQkJICAgICBsaXN0W2ldLgorCQkJCQkJCQkgICAgIGlGbGFncyk7CisKKwkJCQkJaWYgKGxpc3RbaV0uaUVycm5vKSB7CisJCQkJCQl1cF9yZWFkKCZtZV9yd3NlbSk7CisJCQkJCQlrYXJnLmVycm5vID0gbGlzdFtpXS5pRXJybm87CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXVwX3JlYWQoJm1lX3J3c2VtKTsKKwkJCQkJUEVSUk9SCisJCQkJCSAgICAoIkludmFsaWQgc2luZ2xlIGRpcmVjdGlvbiBzcGVjaWZpZWQuXG4iKTsKKwkJCQkJbGlzdFtpXS5pRXJybm8gPSBNRV9FUlJOT19JTlZBTElEX0RJUjsKKwkJCQkJa2FyZy5lcnJubyA9IE1FX0VSUk5PX0lOVkFMSURfRElSOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCXVwX3JlYWQoJm1lX3J3c2VtKTsKKwkJfQorCisJCXNwaW5fbG9jaygmbWVfbG9jayk7CisKKwkJbWVfY291bnQtLTsKKwkJc3Bpbl91bmxvY2soJm1lX2xvY2spOworCX0KKworCWVyciA9IGNvcHlfdG9fdXNlcihhcmcsICZrYXJnLCBzaXplb2YobWVfaW9fc2luZ2xlX3QpKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IGFyZ3VtZW50cyB0byB1c2VyIHNwYWNlLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWVyciA9CisJICAgIGNvcHlfdG9fdXNlcihrYXJnLnNpbmdsZV9saXN0LCBsaXN0LAorCQkJIHNpemVvZihtZUlPU2luZ2xlX3QpICoga2FyZy5jb3VudCk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2FuJ3QgY29weSBzaW5nbGUgbGlzdCB0byB1c2VyIHNwYWNlLlxuIik7CisJCWtmcmVlKGxpc3QpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlrZnJlZShsaXN0KTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfaW9fc3RyZWFtX2NvbmZpZyhzdHJ1Y3QgZmlsZSAqZmlsZXAsIG1lX2lvX3N0cmVhbV9jb25maWdfdCAqIGFyZykKK3sKKwlpbnQgZXJyOworCWludCBrID0gMDsKKworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKwltZV9kZXZpY2VfdCAqZGV2aWNlOworCW1lX2lvX3N0cmVhbV9jb25maWdfdCBrYXJnOworCW1lSU9TdHJlYW1Db25maWdfdCAqbGlzdDsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWVyciA9IGNvcHlfZnJvbV91c2VyKCZrYXJnLCBhcmcsIHNpemVvZihtZV9pb19zdHJlYW1fY29uZmlnX3QpKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IGFyZ3VtZW50cyB0byBrZXJuZWwgc3BhY2UuXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJbGlzdCA9IGttYWxsb2Moc2l6ZW9mKG1lSU9TdHJlYW1Db25maWdfdCkgKiBrYXJnLmNvdW50LCBHRlBfS0VSTkVMKTsKKworCWlmICghbGlzdCkgeworCQlQRVJST1IoIkNhbid0IGdldCBidWZmZXIgZm9yIGNvbmZpZyBsaXN0LlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWVyciA9CisJICAgIGNvcHlfZnJvbV91c2VyKGxpc3QsIGthcmcuY29uZmlnX2xpc3QsCisJCQkgICBzaXplb2YobWVJT1N0cmVhbUNvbmZpZ190KSAqIGthcmcuY291bnQpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbid0IGNvcHkgY29uZmlnIGxpc3QgdG8ga2VybmVsIHNwYWNlLlxuIik7CisJCWtmcmVlKGxpc3QpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlzcGluX2xvY2soJm1lX2xvY2spOworCisJaWYgKChtZV9maWxlcCAhPSBOVUxMKSAmJiAobWVfZmlsZXAgIT0gZmlsZXApKSB7CisJCXNwaW5fdW5sb2NrKCZtZV9sb2NrKTsKKwkJUEVSUk9SKCJEcml2ZXIgU3lzdGVtIGlzIGxvZ2dlZCBieSBhbm90aGVyIHByb2Nlc3MuXG4iKTsKKwkJa2FyZy5lcnJubyA9IE1FX0VSUk5PX0xPQ0tFRDsKKwl9IGVsc2UgeworCQltZV9jb3VudCsrOworCQlzcGluX3VubG9jaygmbWVfbG9jayk7CisKKwkJZG93bl9yZWFkKCZtZV9yd3NlbSk7CisKKwkJbGlzdF9mb3JfZWFjaChwb3MsICZtZV9kZXZpY2VfbGlzdCkgeworCQkJaWYgKGsgPT0ga2FyZy5kZXZpY2UpIHsKKwkJCQlkZXZpY2UgPSBsaXN0X2VudHJ5KHBvcywgbWVfZGV2aWNlX3QsIGxpc3QpOworCQkJCWJyZWFrOworCQkJfQorCisJCQlrKys7CisJCX0KKworCQlpZiAocG9zID09ICZtZV9kZXZpY2VfbGlzdCkgeworCQkJUEVSUk9SKCJJbnZhbGlkIGRldmljZSBudW1iZXIgc3BlY2lmaWVkLlxuIik7CisJCQlrYXJnLmVycm5vID0gTUVfRVJSTk9fSU5WQUxJRF9ERVZJQ0U7CisJCX0gZWxzZSB7CisJCQlrYXJnLmVycm5vID0KKwkJCSAgICBkZXZpY2UtPm1lX2RldmljZV9pb19zdHJlYW1fY29uZmlnKGRldmljZSwgZmlsZXAsCisJCQkJCQkJICAgICAgIGthcmcuc3ViZGV2aWNlLAorCQkJCQkJCSAgICAgICBsaXN0LCBrYXJnLmNvdW50LAorCQkJCQkJCSAgICAgICAma2FyZy50cmlnZ2VyLAorCQkJCQkJCSAgICAgICBrYXJnLgorCQkJCQkJCSAgICAgICBmaWZvX2lycV90aHJlc2hvbGQsCisJCQkJCQkJICAgICAgIGthcmcuZmxhZ3MpOworCQl9CisKKwkJdXBfcmVhZCgmbWVfcndzZW0pOworCisJCXNwaW5fbG9jaygmbWVfbG9jayk7CisJCW1lX2NvdW50LS07CisJCXNwaW5fdW5sb2NrKCZtZV9sb2NrKTsKKwl9CisKKwllcnIgPSBjb3B5X3RvX3VzZXIoYXJnLCAma2FyZywgc2l6ZW9mKG1lX2lvX3N0cmVhbV9jb25maWdfdCkpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbid0IGNvcHkgYmFjayB0byB1c2VyIHNwYWNlLlxuIik7CisJCWtmcmVlKGxpc3QpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlrZnJlZShsaXN0KTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWVfcXVlcnlfbnVtYmVyX2RldmljZXMoc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCSAgIG1lX3F1ZXJ5X251bWJlcl9kZXZpY2VzX3QgKiBhcmcpCit7CisJaW50IGVycjsKKwltZV9xdWVyeV9udW1iZXJfZGV2aWNlc190IGthcmc7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlrYXJnLm51bWJlciA9IDA7CisJZG93bl9yZWFkKCZtZV9yd3NlbSk7CisJbGlzdF9mb3JfZWFjaChwb3MsICZtZV9kZXZpY2VfbGlzdCkgeworCQlrYXJnLm51bWJlcisrOworCX0KKworCXVwX3JlYWQoJm1lX3J3c2VtKTsKKworCWthcmcuZXJybm8gPSBNRV9FUlJOT19TVUNDRVNTOworCisJZXJyID0gY29weV90b191c2VyKGFyZywgJmthcmcsIHNpemVvZihtZV9xdWVyeV9udW1iZXJfZGV2aWNlc190KSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2FuJ3QgY29weSBxdWVyeSBiYWNrIHRvIHVzZXIgc3BhY2UuXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWVfaW9fc3RyZWFtX3N0b3Aoc3RydWN0IGZpbGUgKmZpbGVwLCBtZV9pb19zdHJlYW1fc3RvcF90ICogYXJnKQoreworCWludCBlcnI7CisJaW50IGksIGs7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJbWVfZGV2aWNlX3QgKmRldmljZTsKKwltZV9pb19zdHJlYW1fc3RvcF90IGthcmc7CisJbWVJT1N0cmVhbVN0b3BfdCAqbGlzdDsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCWVyciA9IGNvcHlfZnJvbV91c2VyKCZrYXJnLCBhcmcsIHNpemVvZihtZV9pb19zdHJlYW1fc3RvcF90KSk7CisKKwlpZiAoZXJyKSB7CisJCVBFUlJPUigiQ2FuJ3QgY29weSBhcmd1bWVudHMgdG8ga2VybmVsIHNwYWNlLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWthcmcuZXJybm8gPSBNRV9FUlJOT19TVUNDRVNTOworCisJbGlzdCA9IGttYWxsb2Moc2l6ZW9mKG1lSU9TdHJlYW1TdG9wX3QpICoga2FyZy5jb3VudCwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWxpc3QpIHsKKwkJUEVSUk9SKCJDYW4ndCBnZXQgYnVmZmVyIGZvciBzdG9wIGxpc3QuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZXJyID0KKwkgICAgY29weV9mcm9tX3VzZXIobGlzdCwga2FyZy5zdG9wX2xpc3QsCisJCQkgICBzaXplb2YobWVJT1N0cmVhbVN0b3BfdCkgKiBrYXJnLmNvdW50KTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IHN0b3AgbGlzdCB0byBrZXJuZWwgc3BhY2UuXG4iKTsKKwkJa2ZyZWUobGlzdCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXNwaW5fbG9jaygmbWVfbG9jayk7CisKKwlpZiAoKG1lX2ZpbGVwICE9IE5VTEwpICYmIChtZV9maWxlcCAhPSBmaWxlcCkpIHsKKwkJc3Bpbl91bmxvY2soJm1lX2xvY2spOworCQlQRVJST1IoIkRyaXZlciBTeXN0ZW0gaXMgbG9nZ2VkIGJ5IGFub3RoZXIgcHJvY2Vzcy5cbiIpOworCisJCWZvciAoaSA9IDA7IGkgPCBrYXJnLmNvdW50OyBpKyspIHsKKwkJCWxpc3RbaV0uaUVycm5vID0gTUVfRVJSTk9fTE9DS0VEOworCQl9CisJfSBlbHNlIHsKKwkJbWVfY291bnQrKzsKKwkJc3Bpbl91bmxvY2soJm1lX2xvY2spOworCisJCWZvciAoaSA9IDA7IGkgPCBrYXJnLmNvdW50OyBpKyspIHsKKwkJCWsgPSAwOworCQkJZG93bl9yZWFkKCZtZV9yd3NlbSk7CisJCQlsaXN0X2Zvcl9lYWNoKHBvcywgJm1lX2RldmljZV9saXN0KSB7CisJCQkJaWYgKGsgPT0gbGlzdFtpXS5pRGV2aWNlKSB7CisJCQkJCWRldmljZSA9CisJCQkJCSAgICBsaXN0X2VudHJ5KHBvcywgbWVfZGV2aWNlX3QsIGxpc3QpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlrKys7CisJCQl9CisKKwkJCWlmIChwb3MgPT0gJm1lX2RldmljZV9saXN0KSB7CisJCQkJdXBfcmVhZCgmbWVfcndzZW0pOworCQkJCVBFUlJPUigiSW52YWxpZCBkZXZpY2UgbnVtYmVyIHNwZWNpZmllZC5cbiIpOworCQkJCWxpc3RbaV0uaUVycm5vID0gTUVfRVJSTk9fSU5WQUxJRF9ERVZJQ0U7CisJCQkJa2FyZy5lcnJubyA9IE1FX0VSUk5PX0lOVkFMSURfREVWSUNFOworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlsaXN0W2ldLmlFcnJubyA9CisJCQkJICAgIGRldmljZS0+bWVfZGV2aWNlX2lvX3N0cmVhbV9zdG9wKGRldmljZSwKKwkJCQkJCQkJICAgICBmaWxlcCwKKwkJCQkJCQkJICAgICBsaXN0W2ldLgorCQkJCQkJCQkgICAgIGlTdWJkZXZpY2UsCisJCQkJCQkJCSAgICAgbGlzdFtpXS4KKwkJCQkJCQkJICAgICBpU3RvcE1vZGUsCisJCQkJCQkJCSAgICAgbGlzdFtpXS4KKwkJCQkJCQkJICAgICBpRmxhZ3MpOworCisJCQkJaWYgKGxpc3RbaV0uaUVycm5vKSB7CisJCQkJCXVwX3JlYWQoJm1lX3J3c2VtKTsKKwkJCQkJa2FyZy5lcnJubyA9IGxpc3RbaV0uaUVycm5vOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCXVwX3JlYWQoJm1lX3J3c2VtKTsKKwkJfQorCisJCXNwaW5fbG9jaygmbWVfbG9jayk7CisKKwkJbWVfY291bnQtLTsKKwkJc3Bpbl91bmxvY2soJm1lX2xvY2spOworCX0KKworCWVyciA9IGNvcHlfdG9fdXNlcihhcmcsICZrYXJnLCBzaXplb2YobWVfaW9fc3RyZWFtX3N0b3BfdCkpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbid0IGNvcHkgYXJndW1lbnRzIHRvIHVzZXIgc3BhY2UuXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJZXJyID0KKwkgICAgY29weV90b191c2VyKGthcmcuc3RvcF9saXN0LCBsaXN0LAorCQkJIHNpemVvZihtZUlPU3RyZWFtU3RvcF90KSAqIGthcmcuY291bnQpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbid0IGNvcHkgc3RvcCBsaXN0IHRvIHVzZXIgc3BhY2UuXG4iKTsKKwkJa2ZyZWUobGlzdCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWtmcmVlKGxpc3QpOworCisJcmV0dXJuIGVycjsKK30KKworLyogIC8vbWVfcHJvYmVfdXNiCitzdGF0aWMgaW50IG1lX3Byb2JlX3VzYihzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJLy9pbnQgZXJyOworCS8vbWVfdXNiX2NvbnN0cnVjdG9yX3QgKmNvbnN0cnVjdG9yID0gTlVMTDsKKwltZV9kZXZpY2VfdCAqbl9kZXZpY2UgPSBOVUxMOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJc3dpdGNoIChpZC0+aWRQcm9kdWN0KQorCXsKKwkJCWNhc2UgVVNCX0RFVklDRV9JRF9NRVBISVNUT19TMToKKwkJCQlpZigoY29uc3RydWN0b3IgPSBzeW1ib2xfZ2V0KG1lcGhpc3RvX3MxX2NvbnN0cnVjdG9yKSkgPT0gTlVMTCl7CisJCQkJCWVyciA9IHJlcXVlc3RfbW9kdWxlKE1FUEhJU1RPX1MxX05BTUUpOworCQkJCQlpZihlcnIpeworCQkJCQkJUEVSUk9SKCJFcnJvciB3aGlsZSByZXF1ZXN0IGZvciBtb2R1bGUgJXMuXG4iLCBNRVBISVNUT19TMV9OQU1FKTsKKwkJCQkJCXJldHVybiAtRU5PREVWOworCQkJCQl9CisJCQkJCWlmKChjb25zdHJ1Y3RvciA9IHN5bWJvbF9nZXQobWVwaGlzdG9fczFfY29uc3RydWN0b3IpKSA9PSBOVUxMKXsKKwkJCQkJCVBFUlJPUigiQ2FuJ3QgZ2V0ICVzIGRyaXZlciBtb2R1bGUgY29uc3RydWN0b3IuXG4iLCBNRVBISVNUT19TMV9OQU1FKTsKKwkJCQkJCXJldHVybiAtRU5PREVWOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYoKG5fZGV2aWNlID0gKCpjb25zdHJ1Y3RvcikoaW50ZXJmYWNlKSkgPT0gTlVMTCl7CisJCQkJCXN5bWJvbF9wdXQobWVwaGlzdG9fczFfY29uc3RydWN0b3IpOworCQkJCQlQRVJST1IoIkNhbid0IGdldCBkZXZpY2UgaW5zdGFuY2Ugb2YgJXMgZHJpdmVyIG1vZHVsZS5cbiIsIE1FUEhJU1RPX1MxX05BTUUpOworCQkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCQl9CisKKwkJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJUEVSUk9SKCJJbnZhbGlkIHByb2R1Y3QgaWQuXG4iKTsKKworCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIGluc2VydF90b19kZXZpY2VfbGlzdChuX2RldmljZSk7Cit9CisqLworCisvKiAgLy9tZV9kaXNjb25uZWN0X3VzYgorc3RhdGljIHZvaWQgbWVfZGlzY29ubmVjdF91c2Ioc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKK3sKKworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXZpY2UgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSk7CisJaW50IHZlbmRvcl9pZCA9IGRldmljZS0+ZGVzY3JpcHRvci5pZFZlbmRvcjsKKwlpbnQgZGV2aWNlX2lkID0gZGV2aWNlLT5kZXNjcmlwdG9yLmlkUHJvZHVjdDsKKwlpbnQgc2VyaWFsX25vOworCisJc3NjYW5mKCZkZXZpY2UtPnNlcmlhbFsyXSwgIiV4IiwgJnNlcmlhbF9ubyk7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlQSU5GTygiVmVuZG9yIGlkID0gMHglMDhYXG4iLCB2ZW5kb3JfaWQpOworCVBJTkZPKCJEZXZpY2UgaWQgPSAweCUwOFhcbiIsIGRldmljZV9pZCk7CisJUElORk8oIlNlcmlhbCBOdW1iZXIgPSAweCUwOFhcbiIsIHNlcmlhbF9ubyk7CisKKwlyZXBsYWNlX3dpdGhfZHVtbXkodmVuZG9yX2lkLCBkZXZpY2VfaWQsIHNlcmlhbF9ubyk7Cit9CisqLworCitzdGF0aWMgaW50IG1lX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGVwLAorCQkgICAgc3RydWN0IGZpbGUgKmZpbGVwLCB1bnNpZ25lZCBpbnQgc2VydmljZSwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwlpZiAoX0lPQ19UWVBFKHNlcnZpY2UpICE9IE1FTUFJTl9NQUdJQykgeworCQlQRVJST1IoIkludmFsaWQgbWFnaWMgbnVtYmVyLlxuIik7CisJCXJldHVybiAtRU5PVFRZOworCX0KKworCVBERUJVRygic2VydmljZSBudW1iZXI6IDB4JXguXG4iLCBzZXJ2aWNlKTsKKworCXN3aXRjaCAoc2VydmljZSkgeworCWNhc2UgTUVfSU9fSVJRX0VOQUJMRToKKwkJcmV0dXJuIG1lX2lvX2lycV9zdGFydChmaWxlcCwgKG1lX2lvX2lycV9zdGFydF90ICopIGFyZyk7CisKKwljYXNlIE1FX0lPX0lSUV9XQUlUOgorCQlyZXR1cm4gbWVfaW9faXJxX3dhaXQoZmlsZXAsIChtZV9pb19pcnFfd2FpdF90ICopIGFyZyk7CisKKwljYXNlIE1FX0lPX0lSUV9ESVNBQkxFOgorCQlyZXR1cm4gbWVfaW9faXJxX3N0b3AoZmlsZXAsIChtZV9pb19pcnFfc3RvcF90ICopIGFyZyk7CisKKwljYXNlIE1FX0lPX1JFU0VUX0RFVklDRToKKwkJcmV0dXJuIG1lX2lvX3Jlc2V0X2RldmljZShmaWxlcCwgKG1lX2lvX3Jlc2V0X2RldmljZV90ICopIGFyZyk7CisKKwljYXNlIE1FX0lPX1JFU0VUX1NVQkRFVklDRToKKwkJcmV0dXJuIG1lX2lvX3Jlc2V0X3N1YmRldmljZShmaWxlcCwKKwkJCQkJICAgICAobWVfaW9fcmVzZXRfc3ViZGV2aWNlX3QgKikgYXJnKTsKKworCWNhc2UgTUVfSU9fU0lOR0xFX0NPTkZJRzoKKwkJcmV0dXJuIG1lX2lvX3NpbmdsZV9jb25maWcoZmlsZXAsCisJCQkJCSAgIChtZV9pb19zaW5nbGVfY29uZmlnX3QgKikgYXJnKTsKKworCWNhc2UgTUVfSU9fU0lOR0xFOgorCQlyZXR1cm4gbWVfaW9fc2luZ2xlKGZpbGVwLCAobWVfaW9fc2luZ2xlX3QgKikgYXJnKTsKKworCWNhc2UgTUVfSU9fU1RSRUFNX0NPTkZJRzoKKwkJcmV0dXJuIG1lX2lvX3N0cmVhbV9jb25maWcoZmlsZXAsCisJCQkJCSAgIChtZV9pb19zdHJlYW1fY29uZmlnX3QgKikgYXJnKTsKKworCWNhc2UgTUVfSU9fU1RSRUFNX05FV19WQUxVRVM6CisJCXJldHVybiBtZV9pb19zdHJlYW1fbmV3X3ZhbHVlcyhmaWxlcCwKKwkJCQkJICAgICAgIChtZV9pb19zdHJlYW1fbmV3X3ZhbHVlc190ICopCisJCQkJCSAgICAgICBhcmcpOworCisJY2FzZSBNRV9JT19TVFJFQU1fUkVBRDoKKwkJcmV0dXJuIG1lX2lvX3N0cmVhbV9yZWFkKGZpbGVwLCAobWVfaW9fc3RyZWFtX3JlYWRfdCAqKSBhcmcpOworCisJY2FzZSBNRV9JT19TVFJFQU1fU1RBUlQ6CisJCXJldHVybiBtZV9pb19zdHJlYW1fc3RhcnQoZmlsZXAsIChtZV9pb19zdHJlYW1fc3RhcnRfdCAqKSBhcmcpOworCisJY2FzZSBNRV9JT19TVFJFQU1fU1RBVFVTOgorCQlyZXR1cm4gbWVfaW9fc3RyZWFtX3N0YXR1cyhmaWxlcCwKKwkJCQkJICAgKG1lX2lvX3N0cmVhbV9zdGF0dXNfdCAqKSBhcmcpOworCisJY2FzZSBNRV9JT19TVFJFQU1fU1RPUDoKKwkJcmV0dXJuIG1lX2lvX3N0cmVhbV9zdG9wKGZpbGVwLCAobWVfaW9fc3RyZWFtX3N0b3BfdCAqKSBhcmcpOworCisJY2FzZSBNRV9JT19TVFJFQU1fV1JJVEU6CisJCXJldHVybiBtZV9pb19zdHJlYW1fd3JpdGUoZmlsZXAsIChtZV9pb19zdHJlYW1fd3JpdGVfdCAqKSBhcmcpOworCisJY2FzZSBNRV9MT0NLX0RSSVZFUjoKKwkJcmV0dXJuIG1lX2xvY2tfZHJpdmVyKGZpbGVwLCAobWVfbG9ja19kcml2ZXJfdCAqKSBhcmcpOworCisJY2FzZSBNRV9MT0NLX0RFVklDRToKKwkJcmV0dXJuIG1lX2xvY2tfZGV2aWNlKGZpbGVwLCAobWVfbG9ja19kZXZpY2VfdCAqKSBhcmcpOworCisJY2FzZSBNRV9MT0NLX1NVQkRFVklDRToKKwkJcmV0dXJuIG1lX2xvY2tfc3ViZGV2aWNlKGZpbGVwLCAobWVfbG9ja19zdWJkZXZpY2VfdCAqKSBhcmcpOworCisJY2FzZSBNRV9RVUVSWV9JTkZPX0RFVklDRToKKwkJcmV0dXJuIG1lX3F1ZXJ5X2luZm9fZGV2aWNlKGZpbGVwLAorCQkJCQkgICAgKG1lX3F1ZXJ5X2luZm9fZGV2aWNlX3QgKikgYXJnKTsKKworCWNhc2UgTUVfUVVFUllfREVTQ1JJUFRJT05fREVWSUNFOgorCQlyZXR1cm4gbWVfcXVlcnlfZGVzY3JpcHRpb25fZGV2aWNlKGZpbGVwLAorCQkJCQkJICAgKG1lX3F1ZXJ5X2Rlc2NyaXB0aW9uX2RldmljZV90CisJCQkJCQkgICAgKikgYXJnKTsKKworCWNhc2UgTUVfUVVFUllfTkFNRV9ERVZJQ0U6CisJCXJldHVybiBtZV9xdWVyeV9uYW1lX2RldmljZShmaWxlcCwKKwkJCQkJICAgIChtZV9xdWVyeV9uYW1lX2RldmljZV90ICopIGFyZyk7CisKKwljYXNlIE1FX1FVRVJZX05BTUVfREVWSUNFX0RSSVZFUjoKKwkJcmV0dXJuIG1lX3F1ZXJ5X25hbWVfZGV2aWNlX2RyaXZlcihmaWxlcCwKKwkJCQkJCSAgIChtZV9xdWVyeV9uYW1lX2RldmljZV9kcml2ZXJfdAorCQkJCQkJICAgICopIGFyZyk7CisKKwljYXNlIE1FX1FVRVJZX05VTUJFUl9ERVZJQ0VTOgorCQlyZXR1cm4gbWVfcXVlcnlfbnVtYmVyX2RldmljZXMoZmlsZXAsCisJCQkJCSAgICAgICAobWVfcXVlcnlfbnVtYmVyX2RldmljZXNfdCAqKQorCQkJCQkgICAgICAgYXJnKTsKKworCWNhc2UgTUVfUVVFUllfTlVNQkVSX1NVQkRFVklDRVM6CisJCXJldHVybiBtZV9xdWVyeV9udW1iZXJfc3ViZGV2aWNlcyhmaWxlcCwKKwkJCQkJCSAgKG1lX3F1ZXJ5X251bWJlcl9zdWJkZXZpY2VzX3QKKwkJCQkJCSAgICopIGFyZyk7CisKKwljYXNlIE1FX1FVRVJZX05VTUJFUl9DSEFOTkVMUzoKKwkJcmV0dXJuIG1lX3F1ZXJ5X251bWJlcl9jaGFubmVscyhmaWxlcCwKKwkJCQkJCShtZV9xdWVyeV9udW1iZXJfY2hhbm5lbHNfdCAqKQorCQkJCQkJYXJnKTsKKworCWNhc2UgTUVfUVVFUllfTlVNQkVSX1JBTkdFUzoKKwkJcmV0dXJuIG1lX3F1ZXJ5X251bWJlcl9yYW5nZXMoZmlsZXAsCisJCQkJCSAgICAgIChtZV9xdWVyeV9udW1iZXJfcmFuZ2VzX3QgKikgYXJnKTsKKworCWNhc2UgTUVfUVVFUllfUkFOR0VfQllfTUlOX01BWDoKKwkJcmV0dXJuIG1lX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXgoZmlsZXAsCisJCQkJCQkgKG1lX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXhfdCAqKQorCQkJCQkJIGFyZyk7CisKKwljYXNlIE1FX1FVRVJZX1JBTkdFX0lORk86CisJCXJldHVybiBtZV9xdWVyeV9yYW5nZV9pbmZvKGZpbGVwLAorCQkJCQkgICAobWVfcXVlcnlfcmFuZ2VfaW5mb190ICopIGFyZyk7CisKKwljYXNlIE1FX1FVRVJZX1NVQkRFVklDRV9CWV9UWVBFOgorCQlyZXR1cm4gbWVfcXVlcnlfc3ViZGV2aWNlX2J5X3R5cGUoZmlsZXAsCisJCQkJCQkgIChtZV9xdWVyeV9zdWJkZXZpY2VfYnlfdHlwZV90CisJCQkJCQkgICAqKSBhcmcpOworCisJY2FzZSBNRV9RVUVSWV9TVUJERVZJQ0VfVFlQRToKKwkJcmV0dXJuIG1lX3F1ZXJ5X3N1YmRldmljZV90eXBlKGZpbGVwLAorCQkJCQkgICAgICAgKG1lX3F1ZXJ5X3N1YmRldmljZV90eXBlX3QgKikKKwkJCQkJICAgICAgIGFyZyk7CisKKwljYXNlIE1FX1FVRVJZX1NVQkRFVklDRV9DQVBTOgorCQlyZXR1cm4gbWVfcXVlcnlfc3ViZGV2aWNlX2NhcHMoZmlsZXAsCisJCQkJCSAgICAgICAobWVfcXVlcnlfc3ViZGV2aWNlX2NhcHNfdCAqKQorCQkJCQkgICAgICAgYXJnKTsKKworCWNhc2UgTUVfUVVFUllfU1VCREVWSUNFX0NBUFNfQVJHUzoKKwkJcmV0dXJuIG1lX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3MoZmlsZXAsCisJCQkJCQkgICAgKG1lX3F1ZXJ5X3N1YmRldmljZV9jYXBzX2FyZ3NfdAorCQkJCQkJICAgICAqKSBhcmcpOworCisJY2FzZSBNRV9RVUVSWV9USU1FUjoKKwkJcmV0dXJuIG1lX3F1ZXJ5X3RpbWVyKGZpbGVwLCAobWVfcXVlcnlfdGltZXJfdCAqKSBhcmcpOworCisJY2FzZSBNRV9RVUVSWV9WRVJTSU9OX01BSU5fRFJJVkVSOgorCQlyZXR1cm4gbWVfcXVlcnlfdmVyc2lvbl9tYWluX2RyaXZlcihmaWxlcCwKKwkJCQkJCSAgICAobWVfcXVlcnlfdmVyc2lvbl9tYWluX2RyaXZlcl90CisJCQkJCQkgICAgICopIGFyZyk7CisKKwljYXNlIE1FX1FVRVJZX1ZFUlNJT05fREVWSUNFX0RSSVZFUjoKKwkJcmV0dXJuIG1lX3F1ZXJ5X3ZlcnNpb25fZGV2aWNlX2RyaXZlcihmaWxlcCwKKwkJCQkJCSAgICAgIChtZV9xdWVyeV92ZXJzaW9uX2RldmljZV9kcml2ZXJfdAorCQkJCQkJICAgICAgICopIGFyZyk7CisKKwljYXNlIE1FX0NPTkZJR19MT0FEOgorCQlyZXR1cm4gbWVfY29uZmlnX2xvYWQoZmlsZXAsIChtZV9jb25maWdfbG9hZF90ICopIGFyZyk7CisJfQorCisJUEVSUk9SKCJJbnZhbGlkIGlvY3RsIG51bWJlci5cbiIpOworCXJldHVybiAtRU5PVFRZOworfQorCisvLyBJbml0IGFuZCBleGl0IG9mIG1vZHVsZS4KK3N0YXRpYyBpbnQgbWVtYWluX2luaXQodm9pZCkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlkZXZfdCBkZXYgPSBNS0RFVihtYWpvciwgMCk7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBSZWdpc3RlciBwY2kgZHJpdmVyLiBUaGlzIHdpbGwgcmV0dXJuIDAgaWYgdGhlIFBDSSBzdWJzeXN0ZW0gaXMgbm90IGF2YWlsYWJsZS4KKwlyZXN1bHQgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZtZV9wY2lfZHJpdmVyKTsKKworCWlmIChyZXN1bHQgPCAwKSB7CisJCVBFUlJPUigiQ2FuJ3QgcmVnaXN0ZXIgcGNpIGRyaXZlci5cbiIpOworCQlnb3RvIElOSVRfRVJST1JfMTsKKwl9CisKKy8qCisJLy8gUmVnaXN0ZXIgdXNiIGRyaXZlci4gVGhpcyB3aWxsIHJldHVybiAtRU5PREVWIGlmIG5vIFVTQiBzdWJzeXN0ZW0gaXMgYXZhaWxhYmxlLgorCXJlc3VsdCA9IHVzYl9yZWdpc3RlcigmbWVfdXNiX2RyaXZlcik7CisKKwlpZiAocmVzdWx0KQorCXsKKwkJaWYgKHJlc3VsdCA9PSAtRU5PREVWKQorCQl7CisJCQlQRVJST1IoIk5vIFVTQiBzdWJzeXN0ZW0gYXZhaWxhYmxlLlxuIik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlQRVJST1IoIkNhbid0IHJlZ2lzdGVyIHVzYiBkcml2ZXIuXG4iKTsKKwkJCWdvdG8gSU5JVF9FUlJPUl8yOworCQl9CisJfQorKi8KKwkvLyBSZWdpc3RlciB0aGUgY2hhcmFjdGVyIGRldmljZS4KKwlpZiAobWFqb3IpIHsKKwkJcmVzdWx0ID0gcmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihkZXYsIDEsIE1FTUFJTl9OQU1FKTsKKwl9IGVsc2UgeworCQlyZXN1bHQgPSBhbGxvY19jaHJkZXZfcmVnaW9uKCZkZXYsIDAsIDEsIE1FTUFJTl9OQU1FKTsKKwkJbWFqb3IgPSBNQUpPUihkZXYpOworCX0KKworCWlmIChyZXN1bHQgPCAwKSB7CisJCVBFUlJPUigiQ2FuJ3QgZ2V0IG1ham9yIGRyaXZlciBuby5cbiIpOworCQlnb3RvIElOSVRfRVJST1JfMzsKKwl9CisKKwljZGV2cCA9IGNkZXZfYWxsb2MoKTsKKworCWlmICghY2RldnApIHsKKwkJUEVSUk9SKCJDYW4ndCBnZXQgY2hhcmFjdGVyIGRldmljZSBzdHJ1Y3R1cmUuXG4iKTsKKwkJcmVzdWx0ID0gLUVOT01FTTsKKwkJZ290byBJTklUX0VSUk9SXzQ7CisJfQorCisJY2RldnAtPm9wcyA9ICZtZV9maWxlX29wZXJhdGlvbnM7CisKKwljZGV2cC0+b3duZXIgPSBUSElTX01PRFVMRTsKKworCXJlc3VsdCA9IGNkZXZfYWRkKGNkZXZwLCBkZXYsIDEpOworCisJaWYgKHJlc3VsdCA8IDApIHsKKwkJUEVSUk9SKCJDYW5ub3QgYWRkIGNoYXJhY3RlciBkZXZpY2Ugc3RydWN0dXJlLlxuIik7CisJCWdvdG8gSU5JVF9FUlJPUl81OworCX0KKworCXJldHVybiAwOworCisgICAgICBJTklUX0VSUk9SXzU6CisJY2Rldl9kZWwoY2RldnApOworCisgICAgICBJTklUX0VSUk9SXzQ6CisJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKGRldiwgMSk7CisKKyAgICAgIElOSVRfRVJST1JfMzoKKy8vICAgICAgdXNiX2RlcmVnaXN0ZXIoJm1lX3VzYl9kcml2ZXIpOworCisvL0lOSVRfRVJST1JfMjoKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJm1lX3BjaV9kcml2ZXIpOworCWNsZWFyX2RldmljZV9saXN0KCk7CisKKyAgICAgIElOSVRfRVJST1JfMToKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbWVtYWluX2V4aXQodm9pZCkKK3sKKwlkZXZfdCBkZXYgPSBNS0RFVihtYWpvciwgMCk7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwljZGV2X2RlbChjZGV2cCk7CisJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKGRldiwgMSk7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZtZV9wY2lfZHJpdmVyKTsKKy8vICAgICAgdXNiX2RlcmVnaXN0ZXIoJm1lX3VzYl9kcml2ZXIpOworCWNsZWFyX2RldmljZV9saXN0KCk7Cit9CisKK21vZHVsZV9pbml0KG1lbWFpbl9pbml0KTsKK21vZHVsZV9leGl0KG1lbWFpbl9leGl0KTsKKworLy8gQWRtaW5pc3RyYXRpdmUgc3R1ZmYgZm9yIG1vZGluZm8uCitNT0RVTEVfQVVUSE9SCisgICAgKCJHdWVudGVyIEdlYmhhcmR0IDxnLmdlYmhhcmR0QG1laWxoYXVzLmRlPiAmIEtyenlzenRvZiBHYW50emtlIDxrLmdhbnR6a2VAbWVpbGhhdXMuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNlbnRyYWwgbW9kdWxlIGZvciBNZWlsaGF1cyBEcml2ZXIgU3lzdGVtLiIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIk1laWxoYXVzIFBDSS9jUENJIGJvYXJkcy4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2lmZGVmIEJPU0NICisvLyBFeHBvcnQgdGhlIGZsYWcgZm9yIHRoZSBCT1NDSCBmaXJtd2FyZS4KK0VYUE9SVF9TWU1CT0wobWVfYm9zY2hfZncpOworI2VuZGlmIC8vIEJPU0NICmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVtYWluLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVtYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYxNmZmNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZW1haW4uaApAQCAtMCwwICsxLDQ2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogU291cmNlIEZpbGUgOiBtZW1haW4uaAorICogQXV0aG9yICAgICAgOiBHRyAoR3VlbnRlciBHZWJoYXJkdCkgIDxnLmdlYmhhcmR0QG1laWxoYXVzLmRlPgorICovCisKKyNpZm5kZWYgX01FTUFJTl9IXworI2RlZmluZSBfTUVNQUlOX0hfCisKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisKKyNpbmNsdWRlICJtZWlkcy5oIgorI2luY2x1ZGUgIm1lZGVidWcuaCIKKworI2luY2x1ZGUgIm1lZGV2aWNlLmgiCisvKiNpbmNsdWRlICJtZTEwMDBfZGV2aWNlLmgiCisjaW5jbHVkZSAibWUxNDAwX2RldmljZS5oIgorI2luY2x1ZGUgIm1lMTYwMF9kZXZpY2UuaCIqLworI2luY2x1ZGUgIm1lNDYwMF9kZXZpY2UuaCIKKy8qI2luY2x1ZGUgIm1lNjAwMF9kZXZpY2UuaCIKKyNpbmNsdWRlICJtZTA2MDBfZGV2aWNlLmgiCisjaW5jbHVkZSAibWU4MTAwX2RldmljZS5oIgorI2luY2x1ZGUgIm1lODIwMF9kZXZpY2UuaCIKKyNpbmNsdWRlICJtZTA5MDBfZGV2aWNlLmgiKi8KKyNpbmNsdWRlICJtZWR1bW15LmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgUENJIGRldmljZSB0YWJsZS4KKyAgVGhpcyBpcyB1c2VkIGJ5IG1vZHByb2JlIHRvIHRyYW5zbGF0ZSBQQ0kgSURzIHRvIGRyaXZlcnMuCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBtZV9wY2lfdGFibGVbXSBfX2RldmluaXRkYXRhID0geworCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTAwMCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxMDAwX0EsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTAwMF9CLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwMCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBBLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0MEIsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTRFMCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNEVBLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE0RUIsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTQwQywgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNDBELCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMTYwMF80VSwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUxNjAwXzhVLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfMTJVLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfMTZVLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTE2MDBfMTZVXzhJLAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDYxMCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjUwLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTQ2NjAsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY2MEksIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY3MCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwSSwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwUywgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjcwSVMsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNDY4MCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwSSwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwUywgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU0NjgwSVMsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDA0LCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMDgsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAwRiwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwMTQsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAxOCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDFGLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjAzNCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDM4LCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwM0YsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTA0LCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMDgsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEwRiwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxMTQsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjExOCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTFGLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjEzNCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTM4LCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxM0YsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDQ0LCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNDgsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA0RiwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwNTQsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA1OCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDVGLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjA3NCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MDc4LCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYwN0YsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTQ0LCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNDgsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE0RiwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxNTQsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE1OCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTVGLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjE3NCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MTc4LCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTYxN0YsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU2MjU5LCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FNjM1OSwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA2MzAsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUU4MTAwX0EsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODEwMF9CLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FODIwMF9BLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTgyMDBfQiwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisKKwl7UENJX1ZFTkRPUl9JRF9NRUlMSEFVUywgUENJX0RFVklDRV9JRF9NRUlMSEFVU19NRTA5NDAsIFBDSV9BTllfSUQsCisJIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX01FSUxIQVVTLCBQQ0lfREVWSUNFX0lEX01FSUxIQVVTX01FMDk1MCwgUENJX0FOWV9JRCwKKwkgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTUVJTEhBVVMsIFBDSV9ERVZJQ0VfSURfTUVJTEhBVVNfTUUwOTYwLCBQQ0lfQU5ZX0lELAorCSBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCXswfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG1lX3BjaV90YWJsZSk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgVVNCIGRldmljZSB0YWJsZS4KKyAgVGhpcyBpcyB1c2VkIGJ5IG1vZHByb2JlIHRvIHRyYW5zbGF0ZSBVU0IgSURzIHRvIGRyaXZlcnMuCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKgorc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIG1lX3VzYl90YWJsZVtdIF9fZGV2aW5pdGRhdGEgPSB7CisJeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTUVQSElTVE9fUzEsIFVTQl9ERVZJQ0VfSURfTUVQSElTVE9fUzEpIH0sCisJeyAwIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUgKHVzYiwgbWVfdXNiX3RhYmxlKTsKKyovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgVGVtcGxhdGVzCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgTUVfTE9DS19NVUxUSVBMRVhfVEVNUExBVEUoTkFNRSwgVFlQRSwgQ0FMTCwgREVWX0NBTEwsIEFSR1MpCVwKK3N0YXRpYyBpbnQgQ0FMTChzdHJ1Y3QgZmlsZSAqZmlsZXAsIFRZUEUgKmFyZyl7CVwKKwlpbnQgZXJyID0gMDsgXAorCWludCBrID0gMDsgXAorCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsgXAorCW1lX2RldmljZV90ICpkZXZpY2U7IFwKKwlUWVBFIGthcmc7IFwKKwlcCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOyBcCisJXAorCWVyciA9IGNvcHlfZnJvbV91c2VyKCZrYXJnLCBhcmcsIHNpemVvZihUWVBFKSk7IFwKKwlpZihlcnIpeyBcCisJCVBFUlJPUigiQ2FuJ3QgY29weSBhcmd1bWVudHMgdG8ga2VybmVsIHNwYWNlXG4iKTsgXAorCQlyZXR1cm4gLUVGQVVMVDsgXAorCX0gXAorCVwKKwlkb3duX3JlYWQoJm1lX3J3c2VtKTsJXAorCVwKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJm1lX2RldmljZV9saXN0KXsJXAorCQlpZihrID09IGthcmcuZGV2aWNlKXsJXAorCQkJZGV2aWNlID0gbGlzdF9lbnRyeShwb3MsIG1lX2RldmljZV90LCBsaXN0KTsJXAorCQkJCWJyZWFrOwlcCisJCX0JXAorCQlrKys7CVwKKwl9CVwKKwlcCisJaWYocG9zID09ICZtZV9kZXZpY2VfbGlzdCl7IFwKKwkJUEVSUk9SKCJJbnZhbGlkIGRldmljZSBudW1iZXIgc3BlY2lmaWVkXG4iKTsgXAorCQlrYXJnLmVycm5vID0gTUVfRVJSTk9fSU5WQUxJRF9ERVZJQ0U7IFwKKwl9IFwKKwllbHNleyBcCisJCXNwaW5fbG9jaygmbWVfbG9jayk7CVwKKwkJaWYoKG1lX2ZpbGVwICE9IE5VTEwpICYmIChtZV9maWxlcCAhPSBmaWxlcCkpewlcCisJCQlzcGluX3VubG9jaygmbWVfbG9jayk7CVwKKwkJCVBFUlJPUigiUmVzb3VyY2UgaXMgbG9ja2VkIGJ5IGFub3RoZXIgcHJvY2Vzc1xuIik7CVwKKwkJCWlmKGthcmcubG9jayA9PSBNRV9MT0NLX1NFVCkJXAorCQkJCWthcmcuZXJybm8gPSBNRV9FUlJOT19MT0NLRUQ7CVwKKwkJCWVsc2UgaWYoa2FyZy5sb2NrID09IE1FX0xPQ0tfUkVMRUFTRSkJXAorCQkJCWthcmcuZXJybm8gPSBNRV9FUlJOT19TVUNDRVNTOwlcCisJCQllbHNlewlcCisJCQkJUEVSUk9SKCJJbnZhbGlkIGxvY2sgc3BlY2lmaWVkXG4iKTsJXAorCQkJCWthcmcuZXJybm8gPSBNRV9FUlJOT19JTlZBTElEX0xPQ0s7CVwKKwkJCX1cCisJCX0JXAorCQllbHNlIHsJXAorCQkJbWVfY291bnQrKzsJXAorCQkJc3Bpbl91bmxvY2soJm1lX2xvY2spOwlcCisJCQlcCisJCQlrYXJnLmVycm5vID0gZGV2aWNlLT5ERVZfQ0FMTCBBUkdTOwlcCisJCQlcCisJCQlzcGluX2xvY2soJm1lX2xvY2spOwlcCisJCQltZV9jb3VudC0tOwlcCisJCQlzcGluX3VubG9jaygmbWVfbG9jayk7CVwKKwkJfQlcCisJfSBcCisJXAorCXVwX3JlYWQoJm1lX3J3c2VtKTsJXAorCVwKKwllcnIgPSBjb3B5X3RvX3VzZXIoYXJnLCAma2FyZywgc2l6ZW9mKFRZUEUpKTsgXAorCWlmKGVycil7IFwKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IGFyZ3VtZW50cyBiYWNrIHRvIHVzZXIgc3BhY2VcbiIpOyBcCisJCXJldHVybiAtRUZBVUxUOyBcCisJfSBcCisJXAorCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOyBcCit9CisKKyNkZWZpbmUgTUVfSU9fTVVMVElQTEVYX1RFTVBMQVRFKE5BTUUsIFRZUEUsIENBTEwsIERFVl9DQUxMLCBBUkdTKQlcCitzdGF0aWMgaW50IENBTEwoc3RydWN0IGZpbGUgKmZpbGVwLCBUWVBFICphcmcpewlcCisJaW50IGVyciA9IDA7IFwKKwlpbnQgayA9IDA7IFwKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7IFwKKwltZV9kZXZpY2VfdCAqZGV2aWNlOyBcCisJVFlQRSBrYXJnOyBcCisJXAorCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsgXAorCVwKKwllcnIgPSBjb3B5X2Zyb21fdXNlcigma2FyZywgYXJnLCBzaXplb2YoVFlQRSkpOyBcCisJaWYoZXJyKXsgXAorCQlQRVJST1IoIkNhbid0IGNvcHkgYXJndW1lbnRzIHRvIGtlcm5lbCBzcGFjZVxuIik7IFwKKwkJcmV0dXJuIC1FRkFVTFQ7IFwKKwl9IFwKKwlcCisJZG93bl9yZWFkKCZtZV9yd3NlbSk7CVwKKwlcCisJbGlzdF9mb3JfZWFjaChwb3MsICZtZV9kZXZpY2VfbGlzdCl7CVwKKwkJaWYoayA9PSBrYXJnLmRldmljZSl7CVwKKwkJCWRldmljZSA9IGxpc3RfZW50cnkocG9zLCBtZV9kZXZpY2VfdCwgbGlzdCk7CVwKKwkJCQlicmVhazsJXAorCQl9CVwKKwkJaysrOwlcCisJfQlcCisJXAorCWlmKHBvcyA9PSAmbWVfZGV2aWNlX2xpc3QpeyBcCisJCVBFUlJPUigiSW52YWxpZCBkZXZpY2UgbnVtYmVyIHNwZWNpZmllZFxuIik7IFwKKwkJa2FyZy5lcnJubyA9IE1FX0VSUk5PX0lOVkFMSURfREVWSUNFOyBcCisJfSBcCisJZWxzZXsgXAorCQlzcGluX2xvY2soJm1lX2xvY2spOwlcCisJCWlmKChtZV9maWxlcCAhPSBOVUxMKSAmJiAobWVfZmlsZXAgIT0gZmlsZXApKXsJXAorCQkJc3Bpbl91bmxvY2soJm1lX2xvY2spOwlcCisJCQlQRVJST1IoIlJlc291cmNlIGlzIGxvY2tlZCBieSBhbm90aGVyIHByb2Nlc3NcbiIpOwlcCisJCQlrYXJnLmVycm5vID0gTUVfRVJSTk9fTE9DS0VEOwlcCisJCX0JXAorCQllbHNlIHsJXAorCQkJbWVfY291bnQrKzsJXAorCQkJc3Bpbl91bmxvY2soJm1lX2xvY2spOwlcCisJCQlcCisJCQlrYXJnLmVycm5vID0gZGV2aWNlLT5ERVZfQ0FMTCBBUkdTOwlcCisJCQlcCisJCQlzcGluX2xvY2soJm1lX2xvY2spOwlcCisJCQltZV9jb3VudC0tOwlcCisJCQlzcGluX3VubG9jaygmbWVfbG9jayk7CVwKKwkJfQlcCisJfSBcCisJXAorCXVwX3JlYWQoJm1lX3J3c2VtKTsJXAorCVwKKwllcnIgPSBjb3B5X3RvX3VzZXIoYXJnLCAma2FyZywgc2l6ZW9mKFRZUEUpKTsgXAorCWlmKGVycil7IFwKKwkJUEVSUk9SKCJDYW4ndCBjb3B5IGFyZ3VtZW50cyBiYWNrIHRvIHVzZXIgc3BhY2VcbiIpOyBcCisJCXJldHVybiAtRUZBVUxUOyBcCisJfSBcCisgXAorCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOyBcCit9CisKKyNkZWZpbmUgTUVfUVVFUllfTVVMVElQTEVYX1NUUl9URU1QTEFURShOQU1FLCBUWVBFLCBDQUxMLCBERVZfQ0FMTCwgQVJHUykJXAorc3RhdGljIGludCBDQUxMKHN0cnVjdCBmaWxlICpmaWxlcCwgVFlQRSAqYXJnKXsJXAorCWludCBlcnIgPSAwOwlcCisJaW50IGsgPSAwOwlcCisJc3RydWN0IGxpc3RfaGVhZCAqcG9zOwlcCisJbWVfZGV2aWNlX3QgKmRldmljZTsJXAorCWNoYXIgKm1zZyA9IE5VTEw7CVwKKwlUWVBFIGthcmc7CVwKKwlcCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOyBcCisJXAorCWVyciA9IGNvcHlfZnJvbV91c2VyKCZrYXJnLCBhcmcsIHNpemVvZihUWVBFKSk7CVwKKwlpZihlcnIpewlcCisJCVBFUlJPUigiQ2FuJ3QgY29weSBhcmd1bWVudHMgdG8ga2VybmVsIHNwYWNlXG4iKTsJXAorCQlyZXR1cm4gLUVGQVVMVDsJXAorCX0JXAorCVwKKwlkb3duX3JlYWQoJm1lX3J3c2VtKTsJXAorCVwKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJm1lX2RldmljZV9saXN0KXsJXAorCQlpZihrID09IGthcmcuZGV2aWNlKXsJXAorCQkJZGV2aWNlID0gbGlzdF9lbnRyeShwb3MsIG1lX2RldmljZV90LCBsaXN0KTsJXAorCQkJCWJyZWFrOwlcCisJCX0JXAorCQlrKys7CVwKKwl9CVwKKwlcCisJaWYocG9zID09ICZtZV9kZXZpY2VfbGlzdCl7CVwKKwkJUEVSUk9SKCJJbnZhbGlkIGRldmljZSBudW1iZXIgc3BlY2lmaWVkXG4iKTsJXAorCQlrYXJnLmVycm5vID0gTUVfRVJSTk9fSU5WQUxJRF9ERVZJQ0U7CVwKKwl9CVwKKwllbHNlewlcCisJCWthcmcuZXJybm8gPSBkZXZpY2UtPkRFVl9DQUxMIEFSR1M7CVwKKwkJaWYoIWthcmcuZXJybm8pewlcCisJCQlpZigoc3RybGVuKG1zZykgKyAxKSA+IGthcmcuY291bnQpewlcCisJCQkJUEVSUk9SKCJVc2VyIGJ1ZmZlciBmb3IgZGV2aWNlIG5hbWUgaXMgdG8gbGl0dGxlXG4iKTsJXAorCQkJCWthcmcuZXJybm8gPSBNRV9FUlJOT19VU0VSX0JVRkZFUl9TSVpFOwlcCisJCQl9CVwKKwkJCWVsc2V7CVwKKwkJCQllcnIgPSBjb3B5X3RvX3VzZXIoa2FyZy5uYW1lLCBtc2csIHN0cmxlbihtc2cpICsgMSk7CVwKKwkJCQlpZihlcnIpewlcCisJCQkJCVBFUlJPUigiQ2FuJ3QgY29weSBkZXZpY2UgbmFtZSB0byB1c2VyIHNwYWNlXG4iKTsJXAorCQkJCQlyZXR1cm4gLUVGQVVMVDsJXAorCQkJCX0JXAorCQkJfQlcCisJCX0JXAorCX0JXAorCVwKKwl1cF9yZWFkKCZtZV9yd3NlbSk7CVwKKwlcCisJZXJyID0gY29weV90b191c2VyKGFyZywgJmthcmcsIHNpemVvZihUWVBFKSk7CVwKKwlpZihlcnIpewlcCisJCVBFUlJPUigiQ2FuJ3QgY29weSBxdWVyeSBiYWNrIHRvIHVzZXIgc3BhY2VcbiIpOwlcCisJCXJldHVybiAtRUZBVUxUOwlcCisJfQlcCisJXAorCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOwlcCit9CisKKyNkZWZpbmUgTUVfUVVFUllfTVVMVElQTEVYX1RFTVBMQVRFKE5BTUUsIFRZUEUsIENBTEwsIERFVl9DQUxMLCBBUkdTKQlcCitzdGF0aWMgaW50IENBTEwoc3RydWN0IGZpbGUgKmZpbGVwLCBUWVBFICphcmcpewlcCisJaW50IGVyciA9IDA7CVwKKwlpbnQgayA9IDA7CVwKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CVwKKwltZV9kZXZpY2VfdCAqZGV2aWNlOwlcCisJVFlQRSBrYXJnOwlcCisJCVwKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7IFwKKwkgXAorCWVyciA9IGNvcHlfZnJvbV91c2VyKCZrYXJnLCBhcmcsIHNpemVvZihUWVBFKSk7CVwKKwlpZihlcnIpewlcCisJCVBFUlJPUigiQ2FuJ3QgY29weSBhcmd1bWVudHMgZnJvbSB1c2VyIHNwYWNlXG4iKTsJXAorCQlyZXR1cm4gLUVGQVVMVDsJXAorCX0JXAorCVwKKwlkb3duX3JlYWQoJm1lX3J3c2VtKTsJXAorCVwKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJm1lX2RldmljZV9saXN0KXsJXAorCQlpZihrID09IGthcmcuZGV2aWNlKXsJXAorCQkJZGV2aWNlID0gbGlzdF9lbnRyeShwb3MsIG1lX2RldmljZV90LCBsaXN0KTsJXAorCQkJYnJlYWs7CVwKKwkJfQlcCisJCWsrKzsJXAorCX0JXAorCQlcCisJaWYocG9zID09ICZtZV9kZXZpY2VfbGlzdCl7CVwKKwkJUEVSUk9SKCJJbnZhbGlkIGRldmljZSBudW1iZXIgc3BlY2lmaWVkXG4iKTsJXAorCQlrYXJnLmVycm5vID0gTUVfRVJSTk9fSU5WQUxJRF9ERVZJQ0U7CVwKKwl9CVwKKwllbHNlewlcCisJCWthcmcuZXJybm8gPSBkZXZpY2UtPkRFVl9DQUxMIEFSR1M7CVwKKwl9CVwKKwlcCisJdXBfcmVhZCgmbWVfcndzZW0pOwlcCisJXAorCWVyciA9IGNvcHlfdG9fdXNlcihhcmcsICZrYXJnLCBzaXplb2YoVFlQRSkpOwlcCisJaWYoZXJyKXsJXAorCQlQRVJST1IoIkNhbid0IGNvcHkgYXJndW1lbnRzIHRvIHVzZXIgc3BhY2VcbiIpOwlcCisJCXJldHVybiAtRUZBVUxUOwlcCisJfQlcCisJCVwKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsJXAorfQorCisjZW5kaWYgLy9fX0tFUk5FTF9fCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXBseF9yZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXBseF9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODY4NjE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lcGx4X3JlZy5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qKgorICogQGZpbGUgbWVwbHhfcmVnLmgKKyAqCisgKiBAYnJpZWYgUExYIDkwNTIgUENJIGJyaWRnZSByZWdpc3RlciBkZWZpbml0aW9ucy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRVBMWF9SRUdfSF8KKyNkZWZpbmUgX01FUExYX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIFBMWF9JTlRDU1IJCQkJMHg0QwkJLyoqPCBJbnRlcnJ1cHQgY29udHJvbCBhbmQgc3RhdHVzIHJlZ2lzdGVyLiAqLworI2RlZmluZSBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDFfRU4JCTB4MDEJCS8qKjwgSWYgc2V0LCBsb2NhbCBpbnRlcnJ1cHQgMSBpcyBlbmFibGVkIChyL3cpLiAqLworI2RlZmluZSBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDFfUE9MCQkweDAyCQkvKio8IElmIHNldCwgbG9jYWwgaW50ZXJydXB0IDEgcG9sYXJpdHkgaXMgYWN0aXZlIGhpZ2ggKHIvdykuICovCisjZGVmaW5lIFBMWF9JTlRDU1JfTE9DQUxfSU5UMV9TVEFURQkJMHgwNAkJLyoqPCBJZiBzZXQsIGxvY2FsIGludGVycnVwdCAxIGlzIGFjdGl2ZSAoci9fKS4gKi8KKyNkZWZpbmUgUExYX0lOVENTUl9MT0NBTF9JTlQyX0VOCQkweDA4CQkvKio8IElmIHNldCwgbG9jYWwgaW50ZXJydXB0IDIgaXMgZW5hYmxlZCAoci93KS4gKi8KKyNkZWZpbmUgUExYX0lOVENTUl9MT0NBTF9JTlQyX1BPTAkJMHgxMAkJLyoqPCBJZiBzZXQsIGxvY2FsIGludGVycnVwdCAyIHBvbGFyaXR5IGlzIGFjdGl2ZSBoaWdoIChyL3cpLiAqLworI2RlZmluZSBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfU1RBVEUJCTB4MjAJCS8qKjwgSWYgc2V0LCBsb2NhbCBpbnRlcnJ1cHQgMiBpcyBhY3RpdmUgIChyL18pLiAqLworI2RlZmluZSBQTFhfSU5UQ1NSX1BDSV9JTlRfRU4JCQkweDQwCQkvKio8IElmIHNldCwgUENJIGludGVycnVwdCBpcyBlbmFibGVkIChyL3cpLiAqLworI2RlZmluZSBQTFhfSU5UQ1NSX1NPRlRfSU5UCQkJMHg4MAkJLyoqPCBJZiBzZXQsIGEgc29mdHdhcmUgaW50ZXJydXB0IGlzIGdlbmVyYXRlZCAoci93KS4gKi8KKworI2RlZmluZSBQTFhfSUNSCQkJCQkweDUwCQkvKio8IEluaXRpYWxpemF0aW9uIGNvbnRyb2wgcmVnaXN0ZXIuICovCisjZGVmaW5lIFBMWF9JQ1JfQklUX0VFUFJPTV9DTE9DS19TRVQJCTB4MDEwMDAwMDAKKyNkZWZpbmUgUExYX0lDUl9CSVRfRUVQUk9NX0NISVBfU0VMRUNUCQkweDAyMDAwMDAwCisjZGVmaW5lIFBMWF9JQ1JfQklUX0VFUFJPTV9XUklURQkJMHgwNDAwMDAwMAorI2RlZmluZSBQTFhfSUNSX0JJVF9FRVBST01fUkVBRAkJCTB4MDgwMDAwMDAKKyNkZWZpbmUgUExYX0lDUl9CSVRfRUVQUk9NX1ZBTElECQkweDEwMDAwMDAwCisKKyNkZWZpbmUgUExYX0lDUl9NQVNLX0VFUFJPTQkJCTB4MUYwMDAwMDAKKyNkZWZpbmUgRUVQUk9NX0RFTEFZCQkJCTEKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXNsaXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVzbGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlOGI2NmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVzbGlzdC5jCkBAIC0wLDAgKzEsMTczIEBACisvKioKKyAqIEBmaWxlIG1lX3NsaXN0LmMKKyAqCisgKiBAYnJpZWYgSW1wbGVtZW50cyB0aGUgc3ViZGV2aWNlIGxpc3QgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgIm1lZXJyb3IuaCIKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKworI2luY2x1ZGUgIm1lc2xpc3QuaCIKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisKK2ludCBtZV9zbGlzdF9xdWVyeV9udW1iZXJfc3ViZGV2aWNlcyhzdHJ1Y3QgbWVfc2xpc3QgKnNsaXN0LCBpbnQgKm51bWJlcikKK3sKKwlQREVCVUdfTE9DS1MoImNhbGxlZC5cbiIpOworCSpudW1iZXIgPSBzbGlzdC0+bjsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKwordW5zaWduZWQgaW50IG1lX3NsaXN0X2dldF9udW1iZXJfc3ViZGV2aWNlcyhzdHJ1Y3QgbWVfc2xpc3QgKnNsaXN0KQoreworCVBERUJVR19MT0NLUygiY2FsbGVkLlxuIik7CisJcmV0dXJuIHNsaXN0LT5uOworfQorCittZV9zdWJkZXZpY2VfdCAqbWVfc2xpc3RfZ2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc2xpc3QgKiBzbGlzdCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IGluZGV4KQoreworCisJc3RydWN0IGxpc3RfaGVhZCAqcG9zOworCW1lX3N1YmRldmljZV90ICpzdWJkZXZpY2UgPSBOVUxMOworCXVuc2lnbmVkIGludCBpID0gMDsKKworCVBERUJVR19MT0NLUygiY2FsbGVkLlxuIik7CisKKwlpZiAoaW5kZXggPj0gc2xpc3QtPm4pIHsKKwkJUEVSUk9SKCJJbmRleCBvdXQgb2YgcmFuZ2UuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbGlzdF9mb3JfZWFjaChwb3MsICZzbGlzdC0+aGVhZCkgeworCQlpZiAoaSA9PSBpbmRleCkgeworCQkJc3ViZGV2aWNlID0gbGlzdF9lbnRyeShwb3MsIG1lX3N1YmRldmljZV90LCBsaXN0KTsKKwkJCWJyZWFrOworCQl9CisKKwkJKytpOworCX0KKworCXJldHVybiBzdWJkZXZpY2U7Cit9CisKK2ludCBtZV9zbGlzdF9nZXRfc3ViZGV2aWNlX2J5X3R5cGUoc3RydWN0IG1lX3NsaXN0ICpzbGlzdCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgc3RhcnRfc3ViZGV2aWNlLAorCQkJCSAgIGludCB0eXBlLCBpbnQgc3VidHlwZSwgaW50ICpzdWJkZXZpY2UpCit7CisJbWVfc3ViZGV2aWNlX3QgKnBvczsKKwlpbnQgc190eXBlLCBzX3N1YnR5cGU7CisJdW5zaWduZWQgaW50IGluZGV4ID0gMDsKKworCVBERUJVR19MT0NLUygiY2FsbGVkLlxuIik7CisKKwlpZiAoc3RhcnRfc3ViZGV2aWNlID49IHNsaXN0LT5uKSB7CisJCVBFUlJPUigiU3RhcnQgaW5kZXggb3V0IG9mIHJhbmdlLlxuIik7CisJCXJldHVybiBNRV9FUlJOT19OT01PUkVfU1VCREVWSUNFX1RZUEU7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsICZzbGlzdC0+aGVhZCwgbGlzdCkgeworCQlpZiAoaW5kZXggPCBzdGFydF9zdWJkZXZpY2UpIHsJLy8gR28gZm9yd2FyZCB0byBzdGFydCBzdWJkZXZpY2UuCisJCQkrK2luZGV4OworCQkJY29udGludWU7CisJCX0KKworCQlwb3MtPm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZShwb3MsCisJCQkJCQkgICAgICAgJnNfdHlwZSwgJnNfc3VidHlwZSk7CisKKwkJaWYgKHN1YnR5cGUgPT0gTUVfU1VCVFlQRV9BTlkpIHsKKwkJCWlmIChzX3R5cGUgPT0gdHlwZSkKKwkJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCWlmICgoc190eXBlID09IHR5cGUpICYmIChzX3N1YnR5cGUgPT0gc3VidHlwZSkpCisJCQkJYnJlYWs7CisJCX0KKworCQkrK2luZGV4OworCX0KKworCWlmIChpbmRleCA+PSBzbGlzdC0+bikgeworCQlyZXR1cm4gTUVfRVJSTk9fTk9NT1JFX1NVQkRFVklDRV9UWVBFOworCX0KKworCSpzdWJkZXZpY2UgPSBpbmRleDsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCit2b2lkIG1lX3NsaXN0X2FkZF9zdWJkZXZpY2VfdGFpbChzdHJ1Y3QgbWVfc2xpc3QgKnNsaXN0LAorCQkJCSBtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSkKK3sKKwlQREVCVUdfTE9DS1MoImNhbGxlZC5cbiIpOworCisJbGlzdF9hZGRfdGFpbCgmc3ViZGV2aWNlLT5saXN0LCAmc2xpc3QtPmhlYWQpOworCSsrc2xpc3QtPm47Cit9CisKK21lX3N1YmRldmljZV90ICptZV9zbGlzdF9kZWxfc3ViZGV2aWNlX3RhaWwoc3RydWN0IG1lX3NsaXN0ICpzbGlzdCkKK3sKKworCXN0cnVjdCBsaXN0X2hlYWQgKmxhc3Q7CisJbWVfc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKworCVBERUJVR19MT0NLUygiY2FsbGVkLlxuIik7CisKKwlpZiAobGlzdF9lbXB0eSgmc2xpc3QtPmhlYWQpKQorCQlyZXR1cm4gTlVMTDsKKworCWxhc3QgPSBzbGlzdC0+aGVhZC5wcmV2OworCisJc3ViZGV2aWNlID0gbGlzdF9lbnRyeShsYXN0LCBtZV9zdWJkZXZpY2VfdCwgbGlzdCk7CisKKwlsaXN0X2RlbChsYXN0KTsKKworCS0tc2xpc3QtPm47CisKKwlyZXR1cm4gc3ViZGV2aWNlOworfQorCitpbnQgbWVfc2xpc3RfaW5pdChtZV9zbGlzdF90ICogc2xpc3QpCit7CisJUERFQlVHX0xPQ0tTKCJjYWxsZWQuXG4iKTsKKworCUlOSVRfTElTVF9IRUFEKCZzbGlzdC0+aGVhZCk7CisJc2xpc3QtPm4gPSAwOworCXJldHVybiAwOworfQorCit2b2lkIG1lX3NsaXN0X2RlaW5pdChtZV9zbGlzdF90ICogc2xpc3QpCit7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkICpzOworCW1lX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisKKwlQREVCVUdfTE9DS1MoImNhbGxlZC5cbiIpOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZzbGlzdC0+aGVhZCkpIHsKKwkJcyA9IHNsaXN0LT5oZWFkLm5leHQ7CisJCWxpc3RfZGVsKHMpOworCQlzdWJkZXZpY2UgPSBsaXN0X2VudHJ5KHMsIG1lX3N1YmRldmljZV90LCBsaXN0KTsKKwkJc3ViZGV2aWNlLT5tZV9zdWJkZXZpY2VfZGVzdHJ1Y3RvcihzdWJkZXZpY2UpOworCX0KKworCXNsaXN0LT5uID0gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXNsaXN0LmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVzbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNmM4OTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVzbGlzdC5oCkBAIC0wLDAgKzEsMTA4IEBACisvKioKKyAqIEBmaWxlIG1lX3NsaXN0LmgKKyAqCisgKiBAYnJpZWYgUHJvdmlkZXMgdGhlIHN1YmRldmljZSBsaXN0IGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKyNpZm5kZWYgX01FX1NMSVNUX0hfCisjZGVmaW5lIF9NRV9TTElTVF9IXworCisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisjaW5jbHVkZSAibWVzdWJkZXZpY2UuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoqCisgKiBAYnJpZWYgVGhlIHN1YmRldmljZSBsaXN0IGNvbnRhaW5lci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWVfc2xpc3QgeworCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsJCS8qKjwgVGhlIGhlYWQgb2YgdGhlIGludGVybmFsIGxpc3QuICovCisJdW5zaWduZWQgaW50IG47CQkJLyoqPCBUaGUgbnVtYmVyIG9mIHN1YmRldmljZXMgaW4gdGhlIGxpc3QuICovCit9IG1lX3NsaXN0X3Q7CisKKy8qKgorICogQGJyaWVmIFF1ZXJpZXMgdGhlIG51bWJlciBvZiBzdWJkZXZpY2VzIGN1cnJlbnRseSBpbnNpZGUgdGhlIGxpc3QuCisgKgorICogQHBhcmFtIHNsaXN0IFRoZSBzdWJkZXZpY2UgbGlzdCB0byBxdWVyeS4KKyAqIEBwYXJhbVtvdXRdIG51bWJlciBUaGUgbnVtYmVyIG9mIHN1YmRldmljZXMgb2YgdGhlIGRldmljZS4KKyAqCisgKiBAcmV0dXJuIE1FLWlEUyBlcnJvciBjb2RlLgorICovCitpbnQgbWVfc2xpc3RfcXVlcnlfbnVtYmVyX3N1YmRldmljZXMoc3RydWN0IG1lX3NsaXN0ICpzbGlzdCwgaW50ICpudW1iZXIpOworCisvKioKKyAqIEBicmllZiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygc3ViZGV2aWNlcyBjdXJyZW50bHkgaW5zaWRlIHRoZSBsaXN0LgorICoKKyAqIEBwYXJhbSBzbGlzdCBUaGUgc3ViZGV2aWNlIGxpc3QgdG8gcXVlcnkuCisgKgorICogQHJldHVybiBUaGUgbnVtYmVyIG9mIHN1YmRldmljZXMgaW4gdGhlIGxpc3QuCisgKi8KK3Vuc2lnbmVkIGludCBtZV9zbGlzdF9nZXRfbnVtYmVyX3N1YmRldmljZXMoc3RydWN0IG1lX3NsaXN0ICpzbGlzdCk7CisKKy8qKgorICogQGJyaWVmIEdldCBhIHN1YmRldmljZSBieSBpbmRleC4KKyAqCisgKiBAcGFyYW0gc2xpc3QgVGhlIHN1YmRldmljZSBsaXN0IHRvIHF1ZXJ5LgorICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgc3ViZGV2aWNlIHRvIGdldCBpbiB0aGUgbGlzdC4KKyAqCisgKiBAcmV0dXJuIFRoZSBzdWJkZXZpY2UgYXQgaW5kZXggaWYgYXZhaWxhYmxlLlxuCisgKiAgICAgICAgIE5VTEwgaWYgdGhlIGluZGV4IGlzIG91dCBvZiByYW5nZS4KKyAqLworbWVfc3ViZGV2aWNlX3QgKm1lX3NsaXN0X2dldF9zdWJkZXZpY2Uoc3RydWN0IG1lX3NsaXN0ICpzbGlzdCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IGluZGV4KTsKKworLyoqCisgKiBAYnJpZWYgR2V0IGEgc3ViZGV2aWNlIGluZGV4IGJ5IHR5cGUgYW5kIHN1YnR5cGUuCisgKgorICogQHBhcmFtIHNsaXN0IFRoZSBzdWJkZXZpY2UgbGlzdCB0byBxdWVyeS4KKyAqIEBwYXJhbSBzdGFydF9zdWJkZXZpY2UgVGhlIHN1YmRldmljZSBpbmRleCBhdCB3aGljaCB0aGUgc3RhcnQgc2hhbGwgYmVnaW4uCisgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgc3ViZGV2aWNlIHRvIHF1ZXJ5LgorICogQHBhcmFtIHN1YnR5cGUgVGhlIHN1YnR5cGUgb2YgdGhlIHN1YmRldmljZSB0byBxdWVyeS4KKyAqIEBwYXJhbVtvdXRdIHN1YmRldmljZSBPbiBzdWNjZXNzIHRoaXMgcGFyYW1ldGVyIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBzdWJkZXZpY2UgbWF0Y2hpbmcgdGhlIHJlcXVlc3RlZCB0eXBlLgorICoKKyAqIEByZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUyBvbiBzdWNjZXNzLgorICovCitpbnQgbWVfc2xpc3RfZ2V0X3N1YmRldmljZV9ieV90eXBlKHN0cnVjdCBtZV9zbGlzdCAqc2xpc3QsCisJCQkJICAgdW5zaWduZWQgaW50IHN0YXJ0X3N1YmRldmljZSwKKwkJCQkgICBpbnQgdHlwZSwgaW50IHN1YnR5cGUsIGludCAqc3ViZGV2aWNlKTsKKworLyoqCisgKiBAYnJpZWYgQWRkcyBhIHN1YmRldmljZSB0byB0aGUgdGFpbCBvZiB0aGUgbGlzdC4KKyAqCisgKiBAcGFyYW0gc2xpc3QgVGhlIHN1YmRldmljZSBsaXN0IHRvIGFkZCBhIHN1YmRldmljZSB0by4KKyAqIEBwYXJhbSBzdWJkZXZpY2UgVGhlIHN1YmRldmljZSB0byBhZGQgdG8gdGhlIGxpc3QuCisgKi8KK3ZvaWQgbWVfc2xpc3RfYWRkX3N1YmRldmljZV90YWlsKHN0cnVjdCBtZV9zbGlzdCAqc2xpc3QsCisJCQkJIG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlKTsKKworLyoqCisgKiBAYnJpZWYgUmVtb3ZlcyBhIHN1YmRldmljZSBmcm9tIHRoZSB0YWlsIG9mIHRoZSBsaXN0LgorICoKKyAqIEBwYXJhbSBzbGlzdCBUaGUgc3ViZGV2aWNlIGxpc3QuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIHRoZSByZW1vdmVkIHN1YmRlaXZjZS5cbgorICogICAgICAgICBOVUxMIGluIGNhc2VzIHdoZXJlIHRoZSBsaXN0IHdhcyBlbXB0eS4KKyAqLworbWVfc3ViZGV2aWNlX3QgKm1lX3NsaXN0X2RlbF9zdWJkZXZpY2VfdGFpbChzdHJ1Y3QgbWVfc2xpc3QgKnNsaXN0KTsKKworLyoqCisgKiBAYnJpZWYgSW5pdGlhbGl6ZXMgYSBzdWJkZXZpY2UgbGlzdCBzdHJ1Y3R1cmUuCisgKgorICogQHBhcmFtIGxvY2sgVGhlIHN1YmRldmljZSBsaXN0IHN0cnVjdHVyZSB0byBpbml0aWFsaXplLgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBtZV9zbGlzdF9pbml0KG1lX3NsaXN0X3QgKiBzbGlzdCk7CisKKy8qKgorICogQGJyaWVmIERlaW5pdGlhbGl6ZXMgYSBzdWJkZXZpY2UgbGlzdCBzdHJ1Y3R1cmUgYW5kIGRlc3RydWN0cyBldmVyeSBzdWJkZXZpY2UgaW4gaXQuCisgKgorICogQHBhcmFtIHNsaXN0IFRoZSBzdWJkZXZpY2UgbGlzdCBzdHJ1Y3R1cmUgdG8gZGVpbml0aWFsaXplLgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MuCisgKi8KK3ZvaWQgbWVfc2xpc3RfZGVpbml0KG1lX3NsaXN0X3QgKiBzbGlzdCk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVzbG9jay5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lc2xvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjMwYjg5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lc2xvY2suYwpAQCAtMCwwICsxLDEzNiBAQAorLyoqCisgKiBAZmlsZSBtZXNsb2NrLmMKKyAqCisgKiBAYnJpZWYgSW1wbGVtZW50cyB0aGUgc3ViZGV2aWNlIGxvY2sgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDYgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlICJtZWRlZmluZXMuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWVzbG9jay5oIgorCitpbnQgbWVfc2xvY2tfZW50ZXIoc3RydWN0IG1lX3Nsb2NrICpzbG9jaywgc3RydWN0IGZpbGUgKmZpbGVwKQoreworCVBERUJVR19MT0NLUygiZXhlY3V0ZWQuXG4iKTsKKworCXNwaW5fbG9jaygmc2xvY2stPnNwaW5fbG9jayk7CisKKwlpZiAoKHNsb2NrLT5maWxlcCkgIT0gTlVMTCAmJiAoc2xvY2stPmZpbGVwICE9IGZpbGVwKSkgeworCQlQRVJST1IoIlN1YmRldmljZSBpcyBsb2NrZWQgYnkgYW5vdGhlciBwcm9jZXNzLlxuIik7CisJCXNwaW5fdW5sb2NrKCZzbG9jay0+c3Bpbl9sb2NrKTsKKwkJcmV0dXJuIE1FX0VSUk5PX0xPQ0tFRDsKKwl9CisKKwlzbG9jay0+Y291bnQrKzsKKworCXNwaW5fdW5sb2NrKCZzbG9jay0+c3Bpbl9sb2NrKTsKKworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitpbnQgbWVfc2xvY2tfZXhpdChzdHJ1Y3QgbWVfc2xvY2sgKnNsb2NrLCBzdHJ1Y3QgZmlsZSAqZmlsZXApCit7CisJUERFQlVHX0xPQ0tTKCJleGVjdXRlZC5cbiIpOworCisJc3Bpbl9sb2NrKCZzbG9jay0+c3Bpbl9sb2NrKTsKKwlzbG9jay0+Y291bnQtLTsKKwlzcGluX3VubG9jaygmc2xvY2stPnNwaW5fbG9jayk7CisKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworaW50IG1lX3Nsb2NrX2xvY2soc3RydWN0IG1lX3Nsb2NrICpzbG9jaywgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgbG9jaykKK3sKKwlQREVCVUdfTE9DS1MoImV4ZWN1dGVkLlxuIik7CisKKwlzd2l0Y2ggKGxvY2spIHsKKworCWNhc2UgTUVfTE9DS19SRUxFQVNFOgorCQlzcGluX2xvY2soJnNsb2NrLT5zcGluX2xvY2spOworCisJCWlmIChzbG9jay0+ZmlsZXAgPT0gZmlsZXApCisJCQlzbG9jay0+ZmlsZXAgPSBOVUxMOworCisJCXNwaW5fdW5sb2NrKCZzbG9jay0+c3Bpbl9sb2NrKTsKKworCQlicmVhazsKKworCWNhc2UgTUVfTE9DS19TRVQ6CisJCXNwaW5fbG9jaygmc2xvY2stPnNwaW5fbG9jayk7CisKKwkJaWYgKHNsb2NrLT5jb3VudCkgeworCQkJc3Bpbl91bmxvY2soJnNsb2NrLT5zcGluX2xvY2spOworCQkJUEVSUk9SKCJTdWJkZXZpY2UgaXMgdXNlZCBieSBhbm90aGVyIHByb2Nlc3MuXG4iKTsKKwkJCXJldHVybiBNRV9FUlJOT19VU0VEOworCQl9IGVsc2UgaWYgKHNsb2NrLT5maWxlcCA9PSBOVUxMKQorCQkJc2xvY2stPmZpbGVwID0gZmlsZXA7CisJCWVsc2UgaWYgKHNsb2NrLT5maWxlcCAhPSBmaWxlcCkgeworCQkJc3Bpbl91bmxvY2soJnNsb2NrLT5zcGluX2xvY2spOworCQkJUEVSUk9SKCJTdWJkZXZpY2UgaXMgbG9ja2VkIGJ5IGFub3RoZXIgcHJvY2Vzcy5cbiIpOworCQkJcmV0dXJuIE1FX0VSUk5PX0xPQ0tFRDsKKwkJfQorCisJCXNwaW5fdW5sb2NrKCZzbG9jay0+c3Bpbl9sb2NrKTsKKworCQlicmVhazsKKworCWNhc2UgTUVfTE9DS19DSEVDSzoKKwkJc3Bpbl9sb2NrKCZzbG9jay0+c3Bpbl9sb2NrKTsKKworCQlpZiAoc2xvY2stPmNvdW50KSB7CisJCQlzcGluX3VubG9jaygmc2xvY2stPnNwaW5fbG9jayk7CisJCQlyZXR1cm4gTUVfRVJSTk9fVVNFRDsKKwkJfSBlbHNlIGlmICgoc2xvY2stPmZpbGVwICE9IE5VTEwpICYmIChzbG9jay0+ZmlsZXAgIT0gZmlsZXApKSB7CisJCQlzcGluX3VubG9jaygmc2xvY2stPnNwaW5fbG9jayk7CisJCQlyZXR1cm4gTUVfRVJSTk9fTE9DS0VEOworCQl9CisKKwkJc3Bpbl91bmxvY2soJnNsb2NrLT5zcGluX2xvY2spOworCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3ZvaWQgbWVfc2xvY2tfZGVpbml0KHN0cnVjdCBtZV9zbG9jayAqc2xvY2spCit7CisJUERFQlVHX0xPQ0tTKCJleGVjdXRlZC5cbiIpOworfQorCitpbnQgbWVfc2xvY2tfaW5pdChtZV9zbG9ja190ICogc2xvY2spCit7CisJUERFQlVHX0xPQ0tTKCJleGVjdXRlZC5cbiIpOworCisJc2xvY2stPmZpbGVwID0gTlVMTDsKKwlzbG9jay0+Y291bnQgPSAwOworCXNwaW5fbG9ja19pbml0KCZzbG9jay0+c3Bpbl9sb2NrKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lc2xvY2suaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXNsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQyYjI1YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXNsb2NrLmgKQEAgLTAsMCArMSw3MyBAQAorLyoqCisgKiBAZmlsZSBtZXNsb2NrLmgKKyAqCisgKiBAYnJpZWYgUHJvdmlkZXMgdGhlIHN1YmRldmljZSBsb2NrIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA2IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKyNpZm5kZWYgX01FU0xPQ0tfSF8KKyNkZWZpbmUgX01FU0xPQ0tfSF8KKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIFRoZSBzdWJkZXZpY2UgbG9jayBjbGFzcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWVfc2xvY2sgeworCXN0cnVjdCBmaWxlICpmaWxlcDsJCS8qKjwgUG9pbnRlciB0byBmaWxlIHN0cnVjdHVyZSBob2xkaW5nIHRoZSBzdWJkZXZpY2UuICovCisJaW50IGNvdW50OwkJCS8qKjwgTnVtYmVyIG9mIHRhc2tzIHdoaWNoIGFyZSBpbnNpZGUgdGhlIHN1YmRldmljZS4gKi8KKwlzcGlubG9ja190IHNwaW5fbG9jazsJCS8qKjwgU3BpbiBsb2NrIHByb3RlY3RpbmcgdGhlIGF0dHJpYnV0ZXMgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gKi8KK30gbWVfc2xvY2tfdDsKKworLyoqCisgKiBAYnJpZWYgVHJpZXMgdG8gZW50ZXIgYSBzdWJkZXZpY2UuCisgKgorICogQHBhcmFtIHNsb2NrIFRoZSBzdWJkZXZpY2UgbG9jayBpbnN0YW5jZS4KKyAqIEBwYXJhbSBmaWxlcCBUaGUgZmlsZSBzdHJ1Y3R1cmUgaWRlbnRpZnlpbmcgdGhlIGNhbGxpbmcgcHJvY2Vzcy4KKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcy4KKyAqLworaW50IG1lX3Nsb2NrX2VudGVyKHN0cnVjdCBtZV9zbG9jayAqc2xvY2ssIHN0cnVjdCBmaWxlICpmaWxlcCk7CisKKy8qKgorICogQGJyaWVmIEV4aXRzIGEgc3ViZGV2aWNlLgorICoKKyAqIEBwYXJhbSBzbG9jayBUaGUgc3ViZGV2aWNlIGxvY2sgaW5zdGFuY2UuCisgKiBAcGFyYW0gZmlsZXAgVGhlIGZpbGUgc3RydWN0dXJlIGlkZW50aWZ5aW5nIHRoZSBjYWxsaW5nIHByb2Nlc3MuCisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBtZV9zbG9ja19leGl0KHN0cnVjdCBtZV9zbG9jayAqc2xvY2ssIHN0cnVjdCBmaWxlICpmaWxlcCk7CisKKy8qKgorICogQGJyaWVmIFRyaWVzIHRvIHBlcmZvcm0gYSBsb2NraW5nIGFjdGlvbiBvbiBhIHN1YmRldmljZS4KKyAqCisgKiBAcGFyYW0gc2xvY2sgVGhlIHN1YmRldmljZSBsb2NrIGluc3RhbmNlLgorICogQHBhcmFtIGZpbGVwIFRoZSBmaWxlIHN0cnVjdHVyZSBpZGVudGlmeWluZyB0aGUgY2FsbGluZyBwcm9jZXNzLgorICogQHBhcmFtIFRoZSBhY3Rpb24gdG8gYmUgZG9uZS4KKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcy4KKyAqLworaW50IG1lX3Nsb2NrX2xvY2soc3RydWN0IG1lX3Nsb2NrICpzbG9jaywgc3RydWN0IGZpbGUgKmZpbGVwLCBpbnQgbG9jayk7CisKKy8qKgorICogQGJyaWVmIEluaXRpYWxpemVzIGEgbG9jayBzdHJ1Y3R1cmUuCisgKgorICogQHBhcmFtIHNsb2NrIFRoZSBsb2NrIHN0cnVjdHVyZSB0byBpbml0aWFsaXplLgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBtZV9zbG9ja19pbml0KG1lX3Nsb2NrX3QgKiBzbG9jayk7CisKKy8qKgorICogQGJyaWVmIERlaW5pdGlhbGl6ZXMgYSBsb2NrIHN0cnVjdHVyZS4KKyAqCisgKiBAcGFyYW0gc2xvY2sgVGhlIGxvY2sgc3RydWN0dXJlIHRvIGRlaW5pdGlhbGl6ZS4KKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLgorICovCit2b2lkIG1lX3Nsb2NrX2RlaW5pdChtZV9zbG9ja190ICogc2xvY2spOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lc3ViZGV2aWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVzdWJkZXZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGQ0ZjFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lc3ViZGV2aWNlLmMKQEAgLTAsMCArMSwzMTcgQEAKKy8qKgorICogQGZpbGUgbWVzdWJkZXZpY2UuYworICoKKyAqIEBicmllZiBTdWJkZXZpY2UgYmFzZSBjbGFzcyBpbXBsZW1lbnRpb24uCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAibWVkZWZpbmVzLmgiCisjaW5jbHVkZSAibWVlcnJvci5oIgorCisjaW5jbHVkZSAibWVkZWJ1Zy5oIgorI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisKK3N0YXRpYyBpbnQgbWVfc3ViZGV2aWNlX2lvX2lycV9zdGFydChzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgIGludCBpcnFfc291cmNlLAorCQkJCSAgICAgaW50IGlycV9lZGdlLCBpbnQgaXJxX2FyZywgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKK30KKworc3RhdGljIGludCBtZV9zdWJkZXZpY2VfaW9faXJxX3dhaXQoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgIGludCBjaGFubmVsLAorCQkJCSAgICBpbnQgKmlycV9jb3VudCwKKwkJCQkgICAgaW50ICp2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworfQorCitzdGF0aWMgaW50IG1lX3N1YmRldmljZV9pb19pcnFfc3RvcChzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGNoYW5uZWwsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVfc3ViZGV2aWNlX2lvX3Jlc2V0X3N1YmRldmljZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCSAgIHN0cnVjdCBmaWxlICpmaWxlcCwgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKK30KKworc3RhdGljIGludCBtZV9zdWJkZXZpY2VfaW9fc2luZ2xlX2NvbmZpZyhzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCSBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJCSBpbnQgY2hhbm5lbCwKKwkJCQkJIGludCBzaW5nbGVfY29uZmlnLAorCQkJCQkgaW50IHJlZiwKKwkJCQkJIGludCB0cmlnX2NoYW4sCisJCQkJCSBpbnQgdHJpZ190eXBlLAorCQkJCQkgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKK30KKworc3RhdGljIGludCBtZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3JlYWQoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJICAgICAgIGludCBjaGFubmVsLAorCQkJCSAgICAgICBpbnQgKnZhbHVlLCBpbnQgdGltZV9vdXQsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVfc3ViZGV2aWNlX2lvX3NpbmdsZV93cml0ZShzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCXN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkJaW50IGNoYW5uZWwsCisJCQkJCWludCB2YWx1ZSwgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworfQorCitzdGF0aWMgaW50IG1lX3N1YmRldmljZV9pb19zdHJlYW1fY29uZmlnKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkJIG1lSU9TdHJlYW1Db25maWdfdCAqIGNvbmZpZ19saXN0LAorCQkJCQkgaW50IGNvdW50LAorCQkJCQkgbWVJT1N0cmVhbVRyaWdnZXJfdCAqIHRyaWdnZXIsCisJCQkJCSBpbnQgZmlmb19pcnFfdGhyZXNob2xkLCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworfQorCitzdGF0aWMgaW50IG1lX3N1YmRldmljZV9pb19zdHJlYW1fbmV3X3ZhbHVlcyhzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCQkgICAgIGludCB0aW1lX291dCwKKwkJCQkJICAgICBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworfQorCitzdGF0aWMgaW50IG1lX3N1YmRldmljZV9pb19zdHJlYW1fcmVhZChzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICAgaW50IHJlYWRfbW9kZSwKKwkJCQkgICAgICAgaW50ICp2YWx1ZXMsIGludCAqY291bnQsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdGFydChzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCXN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkJaW50IHN0YXJ0X21vZGUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKK30KKworc3RhdGljIGludCBtZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3N0YXR1cyhzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCSBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCQkJCSBpbnQgd2FpdCwKKwkJCQkJIGludCAqc3RhdHVzLCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworfQorCitzdGF0aWMgaW50IG1lX3N1YmRldmljZV9pb19zdHJlYW1fc3RvcChzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJCQkgICAgICAgaW50IHN0b3BfbW9kZSwgaW50IGZsYWdzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKK30KKworc3RhdGljIGludCBtZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3dyaXRlKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJc3RydWN0IGZpbGUgKmZpbGVwLAorCQkJCQlpbnQgd3JpdGVfbW9kZSwKKwkJCQkJaW50ICp2YWx1ZXMsIGludCAqY291bnQsIGludCBmbGFncykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJcmV0dXJuIE1FX0VSUk5PX05PVF9TVVBQT1JURUQ7Cit9CisKK3N0YXRpYyBpbnQgbWVfc3ViZGV2aWNlX2xvY2tfc3ViZGV2aWNlKG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlLAorCQkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZXAsIGludCBsb2NrLCBpbnQgZmxhZ3MpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBtZV9zbG9ja19sb2NrKCZzdWJkZXZpY2UtPmxvY2ssIGZpbGVwLCBsb2NrKTsKK30KKworc3RhdGljIGludCBtZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgICAgaW50ICpudW1iZXIpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworfQorCitzdGF0aWMgaW50IG1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfcmFuZ2VzKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJICAgIGludCB1bml0LCBpbnQgKmNvdW50KQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKK30KKworc3RhdGljIGludCBtZV9zdWJkZXZpY2VfcXVlcnlfcmFuZ2VfYnlfbWluX21heChzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJCSAgICAgICBpbnQgdW5pdCwKKwkJCQkJICAgICAgIGludCAqbWluLAorCQkJCQkgICAgICAgaW50ICptYXgsCisJCQkJCSAgICAgICBpbnQgKm1heGRhdGEsIGludCAqcmFuZ2UpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworfQorCitzdGF0aWMgaW50IG1lX3N1YmRldmljZV9xdWVyeV9yYW5nZV9pbmZvKHN0cnVjdCBtZV9zdWJkZXZpY2UgKnN1YmRldmljZSwKKwkJCQkJIGludCByYW5nZSwKKwkJCQkJIGludCAqdW5pdCwKKwkJCQkJIGludCAqbWluLCBpbnQgKm1heCwgaW50ICptYXhkYXRhKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKK30KKworc3RhdGljIGludCBtZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGUoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgICAgIGludCAqdHlwZSwgaW50ICpzdWJ0eXBlKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKK30KKworc3RhdGljIGludCBtZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHMoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCQkgICAgIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPSAwOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzKHN0cnVjdCBtZV9zdWJkZXZpY2UKKwkJCQkJCSAgKnN1YmRldmljZSwgaW50IGNhcCwKKwkJCQkJCSAgaW50ICphcmdzLCBpbnQgY291bnQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19OT1RfU1VQUE9SVEVEOworfQorCitzdGF0aWMgaW50IG1lX3N1YmRldmljZV9xdWVyeV90aW1lcihzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UsCisJCQkJICAgIGludCB0aW1lciwKKwkJCQkgICAgaW50ICpiYXNlX2ZyZXF1ZW5jeSwKKwkJCQkgICAgbG9uZyBsb25nICptaW5fdGlja3MsIGxvbmcgbG9uZyAqbWF4X3RpY2tzKQoreworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKwlyZXR1cm4gTUVfRVJSTk9fTk9UX1NVUFBPUlRFRDsKK30KKworc3RhdGljIGludCBtZV9zdWJkZXZpY2VfY29uZmlnX2xvYWQoc3RydWN0IG1lX3N1YmRldmljZSAqc3ViZGV2aWNlLAorCQkJCSAgICBtZV9jZmdfZGV2aWNlX2VudHJ5X3QgKiBjb25maWcpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBtZV9zdWJkZXZpY2VfZGVzdHJ1Y3RvcihzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCW1lX3N1YmRldmljZV9kZWluaXQoc3ViZGV2aWNlKTsKKwlrZnJlZShzdWJkZXZpY2UpOworfQorCitpbnQgbWVfc3ViZGV2aWNlX2luaXQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UpCit7CisJaW50IGVycjsKKworCVBERUJVRygiZXhlY3V0ZWQuXG4iKTsKKworCS8qIEluaXQgbGlzdCBoZWFkICovCisJSU5JVF9MSVNUX0hFQUQoJnN1YmRldmljZS0+bGlzdCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBzdWJkZXZpY2UgbG9jayBpbnN0YW5jZSAqLworCisJZXJyID0gbWVfc2xvY2tfaW5pdCgmc3ViZGV2aWNlLT5sb2NrKTsKKworCWlmIChlcnIpIHsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBzdWJkZXZpY2UgbG9jayBpbnN0YW5jZS5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBTdWJkZXZpY2UgYmFzZSBjbGFzcyBtZXRob2RzICovCisJc3ViZGV2aWNlLT5tZV9zdWJkZXZpY2VfaW9faXJxX3N0YXJ0ID0gbWVfc3ViZGV2aWNlX2lvX2lycV9zdGFydDsKKwlzdWJkZXZpY2UtPm1lX3N1YmRldmljZV9pb19pcnFfd2FpdCA9IG1lX3N1YmRldmljZV9pb19pcnFfd2FpdDsKKwlzdWJkZXZpY2UtPm1lX3N1YmRldmljZV9pb19pcnFfc3RvcCA9IG1lX3N1YmRldmljZV9pb19pcnFfc3RvcDsKKwlzdWJkZXZpY2UtPm1lX3N1YmRldmljZV9pb19yZXNldF9zdWJkZXZpY2UgPQorCSAgICBtZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlOworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX2lvX3NpbmdsZV9jb25maWcgPQorCSAgICBtZV9zdWJkZXZpY2VfaW9fc2luZ2xlX2NvbmZpZzsKKwlzdWJkZXZpY2UtPm1lX3N1YmRldmljZV9pb19zaW5nbGVfcmVhZCA9IG1lX3N1YmRldmljZV9pb19zaW5nbGVfcmVhZDsKKwlzdWJkZXZpY2UtPm1lX3N1YmRldmljZV9pb19zaW5nbGVfd3JpdGUgPSBtZV9zdWJkZXZpY2VfaW9fc2luZ2xlX3dyaXRlOworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9jb25maWcgPQorCSAgICBtZV9zdWJkZXZpY2VfaW9fc3RyZWFtX2NvbmZpZzsKKwlzdWJkZXZpY2UtPm1lX3N1YmRldmljZV9pb19zdHJlYW1fbmV3X3ZhbHVlcyA9CisJICAgIG1lX3N1YmRldmljZV9pb19zdHJlYW1fbmV3X3ZhbHVlczsKKwlzdWJkZXZpY2UtPm1lX3N1YmRldmljZV9pb19zdHJlYW1fcmVhZCA9IG1lX3N1YmRldmljZV9pb19zdHJlYW1fcmVhZDsKKwlzdWJkZXZpY2UtPm1lX3N1YmRldmljZV9pb19zdHJlYW1fc3RhcnQgPSBtZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3N0YXJ0OworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdGF0dXMgPQorCSAgICBtZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3N0YXR1czsKKwlzdWJkZXZpY2UtPm1lX3N1YmRldmljZV9pb19zdHJlYW1fc3RvcCA9IG1lX3N1YmRldmljZV9pb19zdHJlYW1fc3RvcDsKKwlzdWJkZXZpY2UtPm1lX3N1YmRldmljZV9pb19zdHJlYW1fd3JpdGUgPSBtZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3dyaXRlOworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX2xvY2tfc3ViZGV2aWNlID0gbWVfc3ViZGV2aWNlX2xvY2tfc3ViZGV2aWNlOworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfY2hhbm5lbHM7CisJc3ViZGV2aWNlLT5tZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX3JhbmdlcyA9CisJICAgIG1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfcmFuZ2VzOworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX3F1ZXJ5X3JhbmdlX2J5X21pbl9tYXggPQorCSAgICBtZV9zdWJkZXZpY2VfcXVlcnlfcmFuZ2VfYnlfbWluX21heDsKKwlzdWJkZXZpY2UtPm1lX3N1YmRldmljZV9xdWVyeV9yYW5nZV9pbmZvID0KKwkgICAgbWVfc3ViZGV2aWNlX3F1ZXJ5X3JhbmdlX2luZm87CisJc3ViZGV2aWNlLT5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGUgPQorCSAgICBtZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX3R5cGU7CisJc3ViZGV2aWNlLT5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHMgPQorCSAgICBtZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHM7CisJc3ViZGV2aWNlLT5tZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncyA9CisJICAgIG1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2Fwc19hcmdzOworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX3F1ZXJ5X3RpbWVyID0gbWVfc3ViZGV2aWNlX3F1ZXJ5X3RpbWVyOworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX2NvbmZpZ19sb2FkID0gbWVfc3ViZGV2aWNlX2NvbmZpZ19sb2FkOworCXN1YmRldmljZS0+bWVfc3ViZGV2aWNlX2Rlc3RydWN0b3IgPSBtZV9zdWJkZXZpY2VfZGVzdHJ1Y3RvcjsKKworCXJldHVybiAwOworfQorCit2b2lkIG1lX3N1YmRldmljZV9kZWluaXQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCW1lX3N1YmRldmljZV9pb19yZXNldF9zdWJkZXZpY2Uoc3ViZGV2aWNlLCBOVUxMLAorCQkJCQlNRV9JT19SRVNFVF9TVUJERVZJQ0VfTk9fRkxBR1MpOworCW1lX3Nsb2NrX2RlaW5pdCgmc3ViZGV2aWNlLT5sb2NrKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXN1YmRldmljZS5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lc3ViZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTllYzJiNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXN1YmRldmljZS5oCkBAIC0wLDAgKzEsMTk3IEBACisvKioKKyAqIEBmaWxlIG1lc3ViZGV2aWNlLmgKKyAqCisgKiBAYnJpZWYgUHJvdmlkZXMgdGhlIHN1YmRldmljZSBiYXNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKyNpZm5kZWYgX01FU1VCREVWSUNFX0hfCisjZGVmaW5lIF9NRVNVQkRFVklDRV9IXworCisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisjaW5jbHVkZSAibWV0eXBlcy5oIgorI2luY2x1ZGUgIm1laW9jdGwuaCIKKyNpbmNsdWRlICJtZXNsb2NrLmgiCisKKyMgaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKgorICogQGJyaWVmIE1hY3JvIHVzZWQgdG8gZW50ZXIgYSBzdWJkZXZpY2UuCisgKi8KKyNkZWZpbmUgTUVfU1VCREVWSUNFX0VOVEVSCVwKK3sgXAorCWludCBlcnI7IFwKKwllcnIgPSBtZV9zbG9ja19lbnRlcigmaW5zdGFuY2UtPmJhc2UubG9jaywgZmlsZXApOyBcCisJaWYoZXJyKXsgXAorCQlQRVJST1IoIkNhbm5vdCBlbnRlciBzdWJkZXZpY2UuXG4iKTsgXAorCQlyZXR1cm4gZXJyOyBcCisJfSBcCit9CisKKy8qKgorICogQGJyaWVmIE1hY3JvIHVzZWQgdG8gZXhpdCBhIHN1YmRldmljZS4KKyAqLworI2RlZmluZSBNRV9TVUJERVZJQ0VfRVhJVAlcCit7XAorCWludCBlcnI7IFwKKwllcnIgPSBtZV9zbG9ja19leGl0KCZpbnN0YW5jZS0+YmFzZS5sb2NrLCBmaWxlcCk7IFwKKwlpZihlcnIpeyBcCisJCVBFUlJPUigiQ2Fubm90IGV4aXQgc3ViZGV2aWNlLlxuIik7IFwKKwkJcmV0dXJuIGVycjsgXAorCX0gXAorfQorCisvKioKKyAqIEBicmllZiBUaGUgc3ViZGV2aWNlIGJhc2UgY2xhc3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1lX3N1YmRldmljZSB7CisJLyogQXR0cmlidXRlcyAqLworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsJCS8qKjwgRW5hYmxlcyB0aGUgc3ViZGV2aWNlIHRvIGJlIGFkZGVkIHRvIGEgZHluYW1pYyBsaXN0LiAqLworCW1lX3Nsb2NrX3QgbG9jazsJCS8qKjwgVXNlZCBieSB1c2VyIGFwcGxpY2F0aW9uIGluIG9yZGVyIHRvIGxvY2sgdGhlIHN1YmRldmljZSBmb3IgZXhjbHVzaXZlIHVzYWdlLiAqLworCisJLyogTWV0aG9kcyAqLworCWludCAoKm1lX3N1YmRldmljZV9pb19pcnFfc3RhcnQpIChzdHJ1Y3QgbWVfc3ViZGV2aWNlICogc3ViZGV2aWNlLAorCQkJCQkgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSAgaW50IGNoYW5uZWwsCisJCQkJCSAgaW50IGlycV9zb3VyY2UsCisJCQkJCSAgaW50IGlycV9lZGdlLCBpbnQgaXJxX2FyZywgaW50IGZsYWdzKTsKKworCWludCAoKm1lX3N1YmRldmljZV9pb19pcnFfd2FpdCkgKHN0cnVjdCBtZV9zdWJkZXZpY2UgKiBzdWJkZXZpY2UsCisJCQkJCSBzdHJ1Y3QgZmlsZSAqIGZpbGVwLAorCQkJCQkgaW50IGNoYW5uZWwsCisJCQkJCSBpbnQgKmlycV9jb3VudCwKKwkJCQkJIGludCAqdmFsdWUsIGludCB0aW1lX291dCwgaW50IGZsYWdzKTsKKworCWludCAoKm1lX3N1YmRldmljZV9pb19pcnFfc3RvcCkgKHN0cnVjdCBtZV9zdWJkZXZpY2UgKiBzdWJkZXZpY2UsCisJCQkJCSBzdHJ1Y3QgZmlsZSAqIGZpbGVwLAorCQkJCQkgaW50IGNoYW5uZWwsIGludCBmbGFncyk7CisKKwlpbnQgKCptZV9zdWJkZXZpY2VfaW9fcmVzZXRfc3ViZGV2aWNlKSAoc3RydWN0IG1lX3N1YmRldmljZSAqIHN1YmRldmljZSwKKwkJCQkJCXN0cnVjdCBmaWxlICogZmlsZXAsIGludCBmbGFncyk7CisKKwlpbnQgKCptZV9zdWJkZXZpY2VfaW9fc2luZ2xlX2NvbmZpZykgKHN0cnVjdCBtZV9zdWJkZXZpY2UgKiBzdWJkZXZpY2UsCisJCQkJCSAgICAgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSAgICAgIGludCBjaGFubmVsLAorCQkJCQkgICAgICBpbnQgc2luZ2xlX2NvbmZpZywKKwkJCQkJICAgICAgaW50IHJlZiwKKwkJCQkJICAgICAgaW50IHRyaWdfY2hhbiwKKwkJCQkJICAgICAgaW50IHRyaWdfdHlwZSwKKwkJCQkJICAgICAgaW50IHRyaWdfZWRnZSwgaW50IGZsYWdzKTsKKworCWludCAoKm1lX3N1YmRldmljZV9pb19zaW5nbGVfcmVhZCkgKHN0cnVjdCBtZV9zdWJkZXZpY2UgKiBzdWJkZXZpY2UsCisJCQkJCSAgICBzdHJ1Y3QgZmlsZSAqIGZpbGVwLAorCQkJCQkgICAgaW50IGNoYW5uZWwsCisJCQkJCSAgICBpbnQgKnZhbHVlLAorCQkJCQkgICAgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfc3ViZGV2aWNlX2lvX3NpbmdsZV93cml0ZSkgKHN0cnVjdCBtZV9zdWJkZXZpY2UgKiBzdWJkZXZpY2UsCisJCQkJCSAgICAgc3RydWN0IGZpbGUgKiBmaWxlcCwKKwkJCQkJICAgICBpbnQgY2hhbm5lbCwKKwkJCQkJICAgICBpbnQgdmFsdWUsCisJCQkJCSAgICAgaW50IHRpbWVfb3V0LCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9jb25maWcpIChzdHJ1Y3QgbWVfc3ViZGV2aWNlICogc3ViZGV2aWNlLAorCQkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqIGZpbGVwLAorCQkJCQkgICAgICBtZUlPU3RyZWFtQ29uZmlnX3QgKiBjb25maWdfbGlzdCwKKwkJCQkJICAgICAgaW50IGNvdW50LAorCQkJCQkgICAgICBtZUlPU3RyZWFtVHJpZ2dlcl90ICogdHJpZ2dlciwKKwkJCQkJICAgICAgaW50IGZpZm9faXJxX3RocmVzaG9sZCwKKwkJCQkJICAgICAgaW50IGZsYWdzKTsKKworCWludCAoKm1lX3N1YmRldmljZV9pb19zdHJlYW1fbmV3X3ZhbHVlcykgKHN0cnVjdCBtZV9zdWJkZXZpY2UgKgorCQkJCQkJICBzdWJkZXZpY2UsCisJCQkJCQkgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCQkgIGludCB0aW1lX291dCwgaW50ICpjb3VudCwKKwkJCQkJCSAgaW50IGZsYWdzKTsKKworCWludCAoKm1lX3N1YmRldmljZV9pb19zdHJlYW1fcmVhZCkgKHN0cnVjdCBtZV9zdWJkZXZpY2UgKiBzdWJkZXZpY2UsCisJCQkJCSAgICBzdHJ1Y3QgZmlsZSAqIGZpbGVwLAorCQkJCQkgICAgaW50IHJlYWRfbW9kZSwKKwkJCQkJICAgIGludCAqdmFsdWVzLCBpbnQgKmNvdW50LCBpbnQgZmxhZ3MpOworCisJaW50ICgqbWVfc3ViZGV2aWNlX2lvX3N0cmVhbV9zdGFydCkgKHN0cnVjdCBtZV9zdWJkZXZpY2UgKiBzdWJkZXZpY2UsCisJCQkJCSAgICAgc3RydWN0IGZpbGUgKiBmaWxlcCwKKwkJCQkJICAgICBpbnQgc3RhcnRfbW9kZSwKKwkJCQkJICAgICBpbnQgdGltZV9vdXQsIGludCBmbGFncyk7CisKKwlpbnQgKCptZV9zdWJkZXZpY2VfaW9fc3RyZWFtX3N0YXR1cykgKHN0cnVjdCBtZV9zdWJkZXZpY2UgKiBzdWJkZXZpY2UsCisJCQkJCSAgICAgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSAgICAgIGludCB3YWl0LAorCQkJCQkgICAgICBpbnQgKnN0YXR1cywKKwkJCQkJICAgICAgaW50ICpjb3VudCwgaW50IGZsYWdzKTsKKworCWludCAoKm1lX3N1YmRldmljZV9pb19zdHJlYW1fc3RvcCkgKHN0cnVjdCBtZV9zdWJkZXZpY2UgKiBzdWJkZXZpY2UsCisJCQkJCSAgICBzdHJ1Y3QgZmlsZSAqIGZpbGVwLAorCQkJCQkgICAgaW50IHN0b3BfbW9kZSwgaW50IGZsYWdzKTsKKworCWludCAoKm1lX3N1YmRldmljZV9pb19zdHJlYW1fd3JpdGUpIChzdHJ1Y3QgbWVfc3ViZGV2aWNlICogc3ViZGV2aWNlLAorCQkJCQkgICAgIHN0cnVjdCBmaWxlICogZmlsZXAsCisJCQkJCSAgICAgaW50IHdyaXRlX21vZGUsCisJCQkJCSAgICAgaW50ICp2YWx1ZXMsCisJCQkJCSAgICAgaW50ICpjb3VudCwgaW50IGZsYWdzKTsKKworCWludCAoKm1lX3N1YmRldmljZV9sb2NrX3N1YmRldmljZSkgKHN0cnVjdCBtZV9zdWJkZXZpY2UgKiBzdWJkZXZpY2UsCisJCQkJCSAgICBzdHJ1Y3QgZmlsZSAqIGZpbGVwLAorCQkJCQkgICAgaW50IGxvY2ssIGludCBmbGFncyk7CisKKwlpbnQgKCptZV9zdWJkZXZpY2VfcXVlcnlfbnVtYmVyX2NoYW5uZWxzKSAoc3RydWN0IG1lX3N1YmRldmljZSAqCisJCQkJCQkgICBzdWJkZXZpY2UsIGludCAqbnVtYmVyKTsKKworCWludCAoKm1lX3N1YmRldmljZV9xdWVyeV9udW1iZXJfcmFuZ2VzKSAoc3RydWN0IG1lX3N1YmRldmljZSAqCisJCQkJCQkgc3ViZGV2aWNlLCBpbnQgdW5pdCwKKwkJCQkJCSBpbnQgKmNvdW50KTsKKworCWludCAoKm1lX3N1YmRldmljZV9xdWVyeV9yYW5nZV9ieV9taW5fbWF4KSAoc3RydWN0IG1lX3N1YmRldmljZSAqCisJCQkJCQkgICAgc3ViZGV2aWNlLCBpbnQgdW5pdCwKKwkJCQkJCSAgICBpbnQgKm1pbiwgaW50ICptYXgsCisJCQkJCQkgICAgaW50ICptYXhkYXRhLCBpbnQgKnJhbmdlKTsKKworCWludCAoKm1lX3N1YmRldmljZV9xdWVyeV9yYW5nZV9pbmZvKSAoc3RydWN0IG1lX3N1YmRldmljZSAqIHN1YmRldmljZSwKKwkJCQkJICAgICAgaW50IHJhbmdlLAorCQkJCQkgICAgICBpbnQgKnVuaXQsCisJCQkJCSAgICAgIGludCAqbWluLCBpbnQgKm1heCwgaW50ICptYXhkYXRhKTsKKworCWludCAoKm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfdHlwZSkgKHN0cnVjdCBtZV9zdWJkZXZpY2UgKgorCQkJCQkJICBzdWJkZXZpY2UsIGludCAqdHlwZSwKKwkJCQkJCSAgaW50ICpzdWJ0eXBlKTsKKworCWludCAoKm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcykgKHN0cnVjdCBtZV9zdWJkZXZpY2UgKgorCQkJCQkJICBzdWJkZXZpY2UsIGludCAqY2Fwcyk7CisKKwlpbnQgKCptZV9zdWJkZXZpY2VfcXVlcnlfc3ViZGV2aWNlX2NhcHNfYXJncykgKHN0cnVjdCBtZV9zdWJkZXZpY2UgKgorCQkJCQkJICAgICAgIHN1YmRldmljZSwgaW50IGNhcCwKKwkJCQkJCSAgICAgICBpbnQgKmFyZ3MsIGludCBjb3VudCk7CisKKwlpbnQgKCptZV9zdWJkZXZpY2VfcXVlcnlfdGltZXIpIChzdHJ1Y3QgbWVfc3ViZGV2aWNlICogc3ViZGV2aWNlLAorCQkJCQkgaW50IHRpbWVyLAorCQkJCQkgaW50ICpiYXNlX2ZyZXF1ZW5jeSwKKwkJCQkJIGxvbmcgbG9uZyAqbWluX3RpY2tzLAorCQkJCQkgbG9uZyBsb25nICptYXhfdGlja3MpOworCisJaW50ICgqbWVfc3ViZGV2aWNlX2NvbmZpZ19sb2FkKSAoc3RydWN0IG1lX3N1YmRldmljZSAqIHN1YmRldmljZSwKKwkJCQkJIG1lX2NmZ19kZXZpY2VfZW50cnlfdCAqIGNvbmZpZyk7CisKKwl2b2lkICgqbWVfc3ViZGV2aWNlX2Rlc3RydWN0b3IpIChzdHJ1Y3QgbWVfc3ViZGV2aWNlICogc3ViZGV2aWNlKTsKK30gbWVfc3ViZGV2aWNlX3Q7CisKKy8qKgorICogQGJyaWVmIEluaXRpYWxpemVzIGEgc3ViZGV2aWNlIHN0cnVjdHVyZS4KKyAqCisgKiBAcGFyYW0gc3ViZGV2aWNlIFRoZSBzdWJkZXZpY2Ugc3RydWN0dXJlIHRvIGluaXRpYWxpemUuCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcy4KKyAqLworaW50IG1lX3N1YmRldmljZV9pbml0KG1lX3N1YmRldmljZV90ICogc3ViZGV2aWNlKTsKKworLyoqCisgKiBAYnJpZWYgRGVpbml0aWFsaXplcyBhIHN1YmRldmljZSBzdHJ1Y3R1cmUuCisgKgorICogQHBhcmFtIHN1YmRldmljZSBUaGUgc3ViZGV2aWNlIHN0cnVjdHVyZSB0byBpbml0aWFsaXplLgorICovCit2b2lkIG1lX3N1YmRldmljZV9kZWluaXQobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UpOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21ldGVtcGxfZGV2aWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWV0ZW1wbF9kZXZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDg2MzJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21ldGVtcGxfZGV2aWNlLmMKQEAgLTAsMCArMSwxMzcgQEAKKy8qKgorICogQGZpbGUgbWV0ZW1wbF9kZXZpY2UuYworICoKKyAqIEBicmllZiB0ZW1wbGF0ZSBkZXZpY2UgY2xhc3MgaW1wbGVtZW50YXRpb24uCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjICBkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKyNpZm5kZWYgTU9EVUxFCisjICBkZWZpbmUgTU9EVUxFCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSA8bWVpZHMuaD4KKyNpbmNsdWRlICJtZWVycm9yLmgiCisjaW5jbHVkZSAibWVjb21tb24uaCIKKyNpbmNsdWRlICJtZWludGVybmFsLmgiCisKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWVkZXZpY2UuaCIKKyNpbmNsdWRlICJtZXRlbXBsX2RldmljZS5oIgorI2luY2x1ZGUgIm1lc3ViZGV2aWNlLmgiCisjaW5jbHVkZSAibWV0ZW1wbF9zdWIuaCIKKworbWVfZGV2aWNlX3QgKm1ldGVtcGxfcGNpX2NvbnN0cnVjdG9yKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2aWNlKQoreworCW1ldGVtcGxfZGV2aWNlX3QgKm1ldGVtcGxfZGV2aWNlOworCW1lX3N1YmRldmljZV90ICpzdWJkZXZpY2U7CisJdW5zaWduZWQgaW50IHZlcnNpb25faWR4OworCWludCBlcnI7CisJaW50IGk7CisKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisKKwkvLyBBbGxvY2F0ZSBzdHJ1Y3R1cmUgZm9yIGRldmljZSBpbnN0YW5jZS4KKwltZXRlbXBsX2RldmljZSA9IGttYWxsb2Moc2l6ZW9mKG1ldGVtcGxfZGV2aWNlX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmICghbWV0ZW1wbF9kZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3IgZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChtZXRlbXBsX2RldmljZSwgMCwgc2l6ZW9mKG1ldGVtcGxfZGV2aWNlX3QpKTsKKworCS8vIEluaXRpYWxpemUgYmFzZSBjbGFzcyBzdHJ1Y3R1cmUuCisJZXJyID0gbWVfZGV2aWNlX3BjaV9pbml0KChtZV9kZXZpY2VfdCAqKSBtZXRlbXBsX2RldmljZSwgcGNpX2RldmljZSk7CisKKwlpZiAoZXJyKSB7CisJCWtmcmVlKG1ldGVtcGxfZGV2aWNlKTsKKwkJUEVSUk9SKCJDYW5ub3QgaW5pdGlhbGl6ZSBkZXZpY2UgYmFzZSBjbGFzcy5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBHZXQgdGhlIGluZGV4IGluIHRoZSBkZXZpY2UgdmVyc2lvbiBpbmZvcm1hdGlvbiB0YWJsZS4gKi8KKwl2ZXJzaW9uX2lkeCA9CisJICAgIG1ldGVtcGxfdmVyc2lvbnNfZ2V0X2RldmljZV9pbmRleChtZXRlbXBsX2RldmljZS0+YmFzZS5pbmZvLnBjaS4KKwkJCQkJICAgICAgZGV2aWNlX2lkKTsKKworCS8vIEluaXRpYWxpemUgc3BpbiBsb2NrIC4KKwlzcGluX2xvY2tfaW5pdCgmbWV0ZW1wbF9kZXZpY2UtPmN0cmxfcmVnX2xvY2spOworCisJLy8gQ3JlYXRlIHN1YmRldmljZSBpbnN0YW5jZXMuCisJZm9yIChpID0gMDsgaSA8IG1ldGVtcGxfdmVyc2lvbnNbdmVyc2lvbl9pZHhdLnN1YmRldmljZXM7IGkrKykgeworCQlzdWJkZXZpY2UgPQorCQkgICAgKG1lX3N1YmRldmljZV90ICopIG1ldGVtcGxfc3ViX2NvbnN0cnVjdG9yKG1ldGVtcGxfZGV2aWNlLT4KKwkJCQkJCQkgICAgICAgYmFzZS5pbmZvLnBjaS4KKwkJCQkJCQkgICAgICAgcmVnX2Jhc2VzWzJdLCBpLAorCQkJCQkJCSAgICAgICAmbWV0ZW1wbF9kZXZpY2UtPgorCQkJCQkJCSAgICAgICBjdHJsX3JlZ19sb2NrKTsKKworCQlpZiAoIXN1YmRldmljZSkgeworCQkJbWVfZGV2aWNlX2RlaW5pdCgobWVfZGV2aWNlX3QgKikgbWV0ZW1wbF9kZXZpY2UpOworCQkJa2ZyZWUobWV0ZW1wbF9kZXZpY2UpOworCQkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlLlxuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCW1lX3NsaXN0X2FkZF9zdWJkZXZpY2VfdGFpbCgmbWV0ZW1wbF9kZXZpY2UtPmJhc2Uuc2xpc3QsCisJCQkJCSAgICBzdWJkZXZpY2UpOworCX0KKworCS8qIE92ZXJ3cml0ZSBiYXNlIGNsYXNzIG1ldGhvZHMgaWYgYXBwbGljYWJsZS4gKi8KKworCXJldHVybiAobWVfZGV2aWNlX3QgKikgbWV0ZW1wbF9kZXZpY2U7Cit9CisKKy8vIEluaXQgYW5kIGV4aXQgb2YgbW9kdWxlLgorCitzdGF0aWMgaW50IF9faW5pdCBtZXRlbXBsX2luaXQodm9pZCkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuLiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbWV0ZW1wbF9leGl0KHZvaWQpCit7CisJUERFQlVHKCJleGVjdXRlZC5cbi4iKTsKK30KKworbW9kdWxlX2luaXQobWV0ZW1wbF9pbml0KTsKKworbW9kdWxlX2V4aXQobWV0ZW1wbF9leGl0KTsKKworLy8gQWRtaW5pc3RyYXRpdmUgc3R1ZmYgZm9yIG1vZGluZm8uCitNT0RVTEVfQVVUSE9SKCJHdWVudGVyIEdlYmhhcmR0IDxnLmdlYmhhcmR0QG1laWxoYXVzLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEZXZpY2UgRHJpdmVyIE1vZHVsZSBmb3IgVGVtcGxhdGUgRGV2aWNlIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiTWVpbGhhdXMgVGVtcGxhdGUgRGV2aWNlcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvLyBFeHBvcnQgdGhlIGNvbnN0cnVjdG9yLgorRVhQT1JUX1NZTUJPTChtZXRlbXBsX3BjaV9jb25zdHJ1Y3Rvcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWV0ZW1wbF9kZXZpY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXRlbXBsX2RldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMzcwMmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWV0ZW1wbF9kZXZpY2UuaApAQCAtMCwwICsxLDkyIEBACisvKioKKyAqIEBmaWxlIG1ldGVtcGxfZGV2aWNlLmgKKyAqCisgKiBAYnJpZWYgdGVtcGxhdGUgZGV2aWNlIGNsYXNzLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX01FVEVNUExfREVWSUNFX0gKKyNkZWZpbmUgX01FVEVNUExfREVWSUNFX0gKKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlICJtZWRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBTdHJ1Y3R1cmUgaG9sZGluZyB0ZW1wbGF0ZSBkZXZpY2UgY2FwYWJpbGl0aWVzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZXRlbXBsX3ZlcnNpb24geworCXVpbnQxNl90IGRldmljZV9pZDsKKwl1bnNpZ25lZCBpbnQgc3ViZGV2aWNlczsKK30gbWV0ZW1wbF92ZXJzaW9uX3Q7CisKKy8qKgorICogQGJyaWVmIERldmljZSBjYXBhYmlsaXRpZXMuCisgKi8KK3N0YXRpYyBtZXRlbXBsX3ZlcnNpb25fdCBtZXRlbXBsX3ZlcnNpb25zW10gPSB7CisJezB4REVBRCwgMX0sCisJezB9LAorfTsKKworI2RlZmluZSBNRVRFTVBMX0RFVklDRV9WRVJTSU9OUyAoc2l6ZW9mKG1ldGVtcGxfdmVyc2lvbnMpIC8gc2l6ZW9mKG1ldGVtcGxfdmVyc2lvbl90KSAtIDEpIC8qKjwgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gI21ldGVtcGxfdmVyc2lvbnMuICovCisKKy8qKgorICogQGJyaWVmIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBkZXZpY2UgZW50cnkgaW4gI21ldGVtcGxfdmVyc2lvbnMuCisgKgorICogQHBhcmFtIGRldmljZV9pZCBUaGUgUENJIGRldmljZSBpZCBvZiB0aGUgZGV2aWNlIHRvIHF1ZXJ5LgorICogQHJldHVybiBUaGUgaW5kZXggb2YgdGhlIGRldmljZSBpbiAjbWV0ZW1wbF92ZXJzaW9ucy4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbWV0ZW1wbF92ZXJzaW9uc19nZXRfZGV2aWNlX2luZGV4KHVpbnQxNl90IGRldmljZV9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgTUVURU1QTF9ERVZJQ0VfVkVSU0lPTlM7IGkrKykKKwkJaWYgKG1ldGVtcGxfdmVyc2lvbnNbaV0uZGV2aWNlX2lkID09IGRldmljZV9pZCkKKwkJCWJyZWFrOworCXJldHVybiBpOworfQorCisvKioKKyAqIEBicmllZiBUaGUgdGVtcGxhdGUgZGV2aWNlIGNsYXNzIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbWV0ZW1wbF9kZXZpY2UgeworCW1lX2RldmljZV90IGJhc2U7CQkJLyoqPCBUaGUgTWVpbGhhdXMgZGV2aWNlIGJhc2UgY2xhc3MuICovCisKKwkvKiBDaGlsZCBjbGFzcyBhdHRyaWJ1dGVzLiAqLworCXNwaW5sb2NrX3QgY3RybF9yZWdfbG9jazsKK30gbWV0ZW1wbF9kZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIHRlbXBsYXRlIGRldmljZSBjbGFzcyBjb25zdHJ1Y3Rvci4KKyAqCisgKiBAcGFyYW0gcGNpX2RldmljZSBUaGUgcGNpIGRldmljZSBzdHJ1Y3R1cmUgZ2l2ZW4gYnkgdGhlIFBDSSBzdWJzeXN0ZW0uCisgKgorICogQHJldHVybiBPbiBzdWNjZXMgYSBuZXcgdGVtcGxhdGUgZGV2aWNlIGluc3RhbmNlLiBcbgorICogICAgICAgICBOVUxMIG9uIGVycm9yLgorICovCittZV9kZXZpY2VfdCAqbWV0ZW1wbF9wY2lfY29uc3RydWN0b3Ioc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2UpCisgICAgX19hdHRyaWJ1dGVfXyAoKHdlYWspKTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXRlbXBsX3N1Yi5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21ldGVtcGxfc3ViLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFkNjVkOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXRlbXBsX3N1Yi5jCkBAIC0wLDAgKzEsMTQ5IEBACisvKioKKyAqIEBmaWxlIG1ldGVtcGxfc3ViLmMKKyAqCisgKiBAYnJpZWYgU3ViZGV2aWNlIGluc3RhbmNlLgorICogQG5vdGUgQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqIEBhdXRob3IgR3VlbnRlciBHZWJoYXJkdAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19LRVJORUxfXworIyAgZGVmaW5lIF9fS0VSTkVMX18KKyNlbmRpZgorCisvKgorICogSW5jbHVkZXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgIm1lZGVmaW5lcy5oIgorI2luY2x1ZGUgIm1laW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZWVycm9yLmgiCisKKyNpbmNsdWRlICJtZWRlYnVnLmgiCisjaW5jbHVkZSAibWV0ZW1wbF9zdWJfcmVnLmgiCisjaW5jbHVkZSAibWV0ZW1wbF9zdWIuaCIKKworLyoKKyAqIERlZmluZXMKKyAqLworCisvKgorICogRnVuY3Rpb25zCisgKi8KKworc3RhdGljIHZvaWQgbWV0ZW1wbF9zdWJfZGVzdHJ1Y3RvcihzdHJ1Y3QgbWVfc3ViZGV2aWNlICpzdWJkZXZpY2UpCit7CisJbWV0ZW1wbF9zdWJfc3ViZGV2aWNlX3QgKmluc3RhbmNlOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCWluc3RhbmNlID0gKG1ldGVtcGxfc3ViX3N1YmRldmljZV90ICopIHN1YmRldmljZTsKKworCS8qIFVudGlsIHRoZXJlIHRoaXMgd2FzIHRoZSB0aGluZ3MgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgZG9lcy4KKwkgICBJZiB5b3UgZG8gbm90IGhhdmUgYW55IGFkZGl0aW9uYWwgdGhpbmdzIHRvIGRvIHlvdSBjYW4gd2lwZSBpdCBvdXQuICovCisKKwltZV9zdWJkZXZpY2VfZGVpbml0KCZpbnN0YW5jZS0+YmFzZSk7CisJa2ZyZWUoaW5zdGFuY2UpOworfQorCitzdGF0aWMgaW50IG1ldGVtcGxfc3ViX3F1ZXJ5X251bWJlcl9jaGFubmVscyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgICBpbnQgKm51bWJlcikKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKm51bWJlciA9IDA7CisJcmV0dXJuIE1FX0VSUk5PX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWV0ZW1wbF9zdWJfcXVlcnlfc3ViZGV2aWNlX3R5cGUobWVfc3ViZGV2aWNlX3QgKiBzdWJkZXZpY2UsCisJCQkJCSAgICBpbnQgKnR5cGUsIGludCAqc3VidHlwZSkKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKnR5cGUgPSAwOworCSpzdWJ0eXBlID0gMDsKKwlyZXR1cm4gTUVfRVJSTk9fU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtZXRlbXBsX3N1Yl9xdWVyeV9zdWJkZXZpY2VfY2FwcyhtZV9zdWJkZXZpY2VfdCAqIHN1YmRldmljZSwKKwkJCQkJICAgIGludCAqY2FwcykKK3sKKwlQREVCVUcoImV4ZWN1dGVkLlxuIik7CisJKmNhcHMgPSAwOworCXJldHVybiBNRV9FUlJOT19TVUNDRVNTOworfQorCittZXRlbXBsX3N1Yl9zdWJkZXZpY2VfdCAqbWV0ZW1wbF9zdWJfY29uc3RydWN0b3IodWludDMyX3QgcmVnX2Jhc2UsCisJCQkJCQkgdW5zaWduZWQgaW50IHN1Yl9pZHgsCisJCQkJCQkgc3BpbmxvY2tfdCAqIGN0cmxfcmVnX2xvY2spCit7CisJbWV0ZW1wbF9zdWJfc3ViZGV2aWNlX3QgKnN1YmRldmljZTsKKwlpbnQgZXJyOworCisJUERFQlVHKCJleGVjdXRlZC5cbiIpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBzdWJkZXZpY2UgaW5zdGFuY2UgKi8KKwlzdWJkZXZpY2UgPSBrbWFsbG9jKHNpemVvZihtZXRlbXBsX3N1Yl9zdWJkZXZpY2VfdCksIEdGUF9LRVJORUwpOworCisJaWYgKCFzdWJkZXZpY2UpIHsKKwkJUEVSUk9SKCJDYW5ub3QgZ2V0IG1lbW9yeSBmb3Igc3ViZGV2aWNlIGluc3RhbmNlLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzdWJkZXZpY2UsIDAsIHNpemVvZihtZXRlbXBsX3N1Yl9zdWJkZXZpY2VfdCkpOworCisJLyogQ2hlY2sgaWYgc3ViZGV2aWNlIGluZGV4IGlzIG91dCBvZiByYW5nZSAqLworCisJaWYgKHN1Yl9pZHggPj0gMikgeworCQlQRVJST1IoIlRlbXBsYXRlIHN1YmRldmljZSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UuXG4iKTsKKwkJa2ZyZWUoc3ViZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogSW5pdGlhbGl6ZSBzdWJkZXZpY2UgYmFzZSBjbGFzcyAqLworCWVyciA9IG1lX3N1YmRldmljZV9pbml0KCZzdWJkZXZpY2UtPmJhc2UpOworCisJaWYgKGVycikgeworCQlQRVJST1IoIkNhbm5vdCBpbml0aWFsaXplIHN1YmRldmljZSBiYXNlIGNsYXNzIGluc3RhbmNlLlxuIik7CisJCWtmcmVlKHN1YmRldmljZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvLyBJbml0aWFsaXplIHNwaW4gbG9ja3MuCisJc3Bpbl9sb2NrX2luaXQoJnN1YmRldmljZS0+c3ViZGV2aWNlX2xvY2spOworCisJc3ViZGV2aWNlLT5jdHJsX3JlZ19sb2NrID0gY3RybF9yZWdfbG9jazsKKworCS8qIFNhdmUgdGhlIHN1YmRldmljZSBpbmRleCAqLworCXN1YmRldmljZS0+c3ViX2lkeCA9IHN1Yl9pZHg7CisKKwkvKiBPdmVycmlkZSBiYXNlIGNsYXNzIG1ldGhvZHMuICovCisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9kZXN0cnVjdG9yID0gbWV0ZW1wbF9zdWJfZGVzdHJ1Y3RvcjsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X251bWJlcl9jaGFubmVscyA9CisJICAgIG1ldGVtcGxfc3ViX3F1ZXJ5X251bWJlcl9jaGFubmVsczsKKwlzdWJkZXZpY2UtPmJhc2UubWVfc3ViZGV2aWNlX3F1ZXJ5X3N1YmRldmljZV90eXBlID0KKwkgICAgbWV0ZW1wbF9zdWJfcXVlcnlfc3ViZGV2aWNlX3R5cGU7CisJc3ViZGV2aWNlLT5iYXNlLm1lX3N1YmRldmljZV9xdWVyeV9zdWJkZXZpY2VfY2FwcyA9CisJICAgIG1ldGVtcGxfc3ViX3F1ZXJ5X3N1YmRldmljZV9jYXBzOworCisJcmV0dXJuIHN1YmRldmljZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXRlbXBsX3N1Yi5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21ldGVtcGxfc3ViLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBjOGFmOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXRlbXBsX3N1Yi5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qKgorICogQGZpbGUgbWV0ZW1wbF9zdWIuaAorICoKKyAqIEBicmllZiBNZWlsaGF1cyBzdWJkZXZpY2UgY2xhc3MuCisgKiBAbm90ZSBDb3B5cmlnaHQgKEMpIDIwMDcgTWVpbGhhdXMgRWxlY3Ryb25pYyBHbWJIIChzdXBwb3J0QG1laWxoYXVzLmRlKQorICogQGF1dGhvciBHdWVudGVyIEdlYmhhcmR0CisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUVURU1QTF9TVUJfSF8KKyNkZWZpbmUgX01FVEVNUExfU1VCX0hfCisKKyNpbmNsdWRlICJtZXN1YmRldmljZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIEBicmllZiBUaGUgc3ViZGV2aWNlIGNsYXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtZXRlbXBsX3N1Yl9zdWJkZXZpY2UgeworCS8qIEluaGVyaXRhbmNlICovCisJbWVfc3ViZGV2aWNlX3QgYmFzZTsJCQkvKio8IFRoZSBzdWJkZXZpY2UgYmFzZSBjbGFzcy4gKi8KKworCS8qIEF0dHJpYnV0ZXMgKi8KKwlzcGlubG9ja190IHN1YmRldmljZV9sb2NrOwkJLyoqPCBTcGluIGxvY2sgdG8gcHJvdGVjdCB0aGUgc3ViZGV2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJc3BpbmxvY2tfdCAqY3RybF9yZWdfbG9jazsJCS8qKjwgU3BpbiBsb2NrIHRvIHByb3RlY3QgI2N0cmxfcmVnIGZyb20gY29uY3VycmVudCBhY2Nlc3MuICovCisJaW50IHN1Yl9pZHg7CQkJCS8qKjwgVGhlIGluZGV4IG9mIHRoZSBzdWJkZXZpY2Ugb24gdGhlIGRldmljZS4gKi8KKworCXVuc2lnbmVkIGxvbmcgY3RybF9yZWc7CQkJLyoqPCBSZWdpc3RlciB0byBjb25maWd1cmUgdGhlIG1vZGVzLiAqLworfSBtZXRlbXBsX3N1Yl9zdWJkZXZpY2VfdDsKKworLyoqCisgKiBAYnJpZWYgVGhlIGNvbnN0cnVjdG9yIHRvIGdlbmVyYXRlIGEgc3ViZGV2aWNlIGluc3RhbmNlLgorICoKKyAqIEBwYXJhbSByZWdfYmFzZSBUaGUgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgYXMgcmV0dXJuZWQgYnkgdGhlIFBDSSBCSU9TLgorICogQHBhcmFtIHN1Yl9pZHggVGhlIGluZGV4IG9mIHRoZSBzdWJkZXZpY2Ugb24gdGhlIGRldmljZS4KKyAqIEBwYXJhbSBjdHJsX3JlZ19sb2NrIFBvaW50ZXIgdG8gc3BpbiBsb2NrIHByb3RlY3RpbmcgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4KKyAqCisgKiBAcmV0dXJuIFBvaW50ZXIgdG8gbmV3IGluc3RhbmNlIG9uIHN1Y2Nlc3MuXG4KKyAqIE5VTEwgb24gZXJyb3IuCisgKi8KK21ldGVtcGxfc3ViX3N1YmRldmljZV90ICptZXRlbXBsX3N1Yl9jb25zdHJ1Y3Rvcih1aW50MzJfdCByZWdfYmFzZSwKKwkJCQkJCSB1bnNpZ25lZCBpbnQgc3ViX2lkeCwKKwkJCQkJCSBzcGlubG9ja190ICogY3RybF9yZWdfbG9jayk7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWV0ZW1wbF9zdWJfcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWV0ZW1wbF9zdWJfcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEyY2FiNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZXRlbXBsX3N1Yl9yZWcuaApAQCAtMCwwICsxLDM1IEBACisvKioKKyAqIEBmaWxlIG1ldGVtcGxfc3ViX3JlZy5oCisgKgorICogQGJyaWVmIFN1YmRldmljZSByZWdpc3RlciBkZWZpbml0aW9ucy4KKyAqIEBub3RlIENvcHlyaWdodCAoQykgMjAwNyBNZWlsaGF1cyBFbGVjdHJvbmljIEdtYkggKHN1cHBvcnRAbWVpbGhhdXMuZGUpCisgKiBAYXV0aG9yIEd1ZW50ZXIgR2ViaGFyZHQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRVRFTVBMX1NVQl9SRUdfSF8KKyNkZWZpbmUgX01FVEVNUExfU1VCX1JFR19IXworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE1FVEVNUExfUE9SVF9NT0RFCQkJMHgwMDEwCQkvKio8IENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIuICovCisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWV0eXBlcy5oIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21ldHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjhlYTE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21ldHlwZXMuaApAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IE1laWxoYXVzIEVsZWN0cm9uaWMgR21iSCAoc3VwcG9ydEBtZWlsaGF1cy5kZSkKKyAqCisgKiBTb3VyY2UgRmlsZSA6IG1ldHlwZXMuaAorICogQXV0aG9yICAgICAgOiBHRyAoR3VlbnRlciBHZWJoYXJkdCkgIDxnLmdlYmhhcmR0QG1laWxoYXVzLmRlPgorICovCisKKyNpZm5kZWYgX01FVFlQRVNfSF8KKyNkZWZpbmUgX01FVFlQRVNfSF8KKworCit0eXBlZGVmIGludCAoKm1lRXJyb3JDQl90KShjaGFyICpwY0Z1bmN0aW9uTmFtZSwgaW50IGlFcnJvckNvZGUpOworCit0eXBlZGVmIGludCAoKm1lSU9TdHJlYW1DQl90KSgKKwkJaW50IGlEZXZpY2UsCisJCWludCBpU3ViZGV2aWNlLAorCQlpbnQgaUNvdW50LAorCSAgIAl2b2lkICpwdkNvbnRleHQsCisJICAgCWludCBpRXJyb3JDb2RlKTsKKwordHlwZWRlZiBpbnQgKCptZUlPSXJxQ0JfdCkoCisJCWludCBpRGV2aWNlLAorCSAgIAlpbnQgaVN1YmRldmljZSwKKwkgICAJaW50IGlDaGFubmVsLAorCQlpbnQgaUlycUNvdW50LAorCSAgIAlpbnQgaVZhbHVlLAorCSAgIAl2b2lkICpwdkNvbnRleHQsCisJICAgCWludCBpRXJyb3JDb2RlKTsKKworCit0eXBlZGVmIHN0cnVjdCBtZUlPU2luZ2xlIHsKKwlpbnQgaURldmljZTsKKwlpbnQgaVN1YmRldmljZTsKKwlpbnQgaUNoYW5uZWw7CisJaW50IGlEaXI7CisJaW50IGlWYWx1ZTsKKwlpbnQgaVRpbWVPdXQ7CisJaW50IGlGbGFnczsKKwlpbnQgaUVycm5vOworfSBtZUlPU2luZ2xlX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVJT1N0cmVhbUNvbmZpZyB7CisJaW50IGlDaGFubmVsOworCWludCBpU3RyZWFtQ29uZmlnOworCWludCBpUmVmOworCWludCBpRmxhZ3M7Cit9IG1lSU9TdHJlYW1Db25maWdfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZUlPU3RyZWFtVHJpZ2dlciB7CisJaW50IGlBY3FTdGFydFRyaWdUeXBlOworCWludCBpQWNxU3RhcnRUcmlnRWRnZTsKKwlpbnQgaUFjcVN0YXJ0VHJpZ0NoYW47CisJaW50IGlBY3FTdGFydFRpY2tzTG93OworCWludCBpQWNxU3RhcnRUaWNrc0hpZ2g7CisJaW50IGlBY3FTdGFydEFyZ3NbMTBdOworCWludCBpU2NhblN0YXJ0VHJpZ1R5cGU7CisJaW50IGlTY2FuU3RhcnRUaWNrc0xvdzsKKwlpbnQgaVNjYW5TdGFydFRpY2tzSGlnaDsKKwlpbnQgaVNjYW5TdGFydEFyZ3NbMTBdOworCWludCBpQ29udlN0YXJ0VHJpZ1R5cGU7CisJaW50IGlDb252U3RhcnRUaWNrc0xvdzsKKwlpbnQgaUNvbnZTdGFydFRpY2tzSGlnaDsKKwlpbnQgaUNvbnZTdGFydEFyZ3NbMTBdOworCWludCBpU2NhblN0b3BUcmlnVHlwZTsKKwlpbnQgaVNjYW5TdG9wQ291bnQ7CisJaW50IGlTY2FuU3RvcEFyZ3NbMTBdOworCWludCBpQWNxU3RvcFRyaWdUeXBlOworCWludCBpQWNxU3RvcENvdW50OworCWludCBpQWNxU3RvcEFyZ3NbMTBdOworCWludCBpRmxhZ3M7Cit9IG1lSU9TdHJlYW1UcmlnZ2VyX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgbWVJT1N0cmVhbVN0YXJ0IHsKKwlpbnQgaURldmljZTsKKwlpbnQgaVN1YmRldmljZTsKKwlpbnQgaVN0YXJ0TW9kZTsKKwlpbnQgaVRpbWVPdXQ7CisJaW50IGlGbGFnczsKKwlpbnQgaUVycm5vOworfSBtZUlPU3RyZWFtU3RhcnRfdDsKKworCit0eXBlZGVmIHN0cnVjdCBtZUlPU3RyZWFtU3RvcCB7CisJaW50IGlEZXZpY2U7CisJaW50IGlTdWJkZXZpY2U7CisJaW50IGlTdG9wTW9kZTsKKwlpbnQgaUZsYWdzOworCWludCBpRXJybm87Cit9IG1lSU9TdHJlYW1TdG9wX3Q7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWltaW8vS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9taW1pby9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYmE0YzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWltaW8vS2NvbmZpZwpAQCAtMCwwICsxLDEwIEBACitjb25maWcgSU5QVVRfTUlNSU8KKwl0cmlzdGF0ZSAiTWltaW8gWGkgaW50ZXJhY3RpdmUgd2hpdGVib2FyZCBzdXBwb3J0IgorCWRlcGVuZHMgb24gVVNCCisJZGVmYXVsdCBOCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgYSBNaW1pbyBYaSBpbnRlcmFjdGl2ZQorCSAgd2hpdGVib2FyZCBkZXZpY2UuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG1pbWlvLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21pbWlvL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL21pbWlvL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ODA3ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWltaW8vTWFrZWZpbGUKQEAgLTAsMCArMSBAQAorb2JqLSQoQ09ORklHX0lOUFVUX01JTUlPKQkrPSBtaW1pby5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWltaW8vbWltaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9taW1pby9taW1pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYTgxMDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWltaW8vbWltaW8uYwpAQCAtMCwwICsxLDkxNCBAQAorLyoKKyAqIEhhcmR3YXJlIGV2ZW50ID0+IGlucHV0IGV2ZW50IG1hcHBpbmc6CisgKgorICoKKyAqCisgaW5wdXQuaDojZGVmaW5lIEJUTl9UT09MX1BFTiAgICAgICAgICAgIDB4MTQwIGJsYWNrCisgaW5wdXQuaDojZGVmaW5lIEJUTl9UT09MX1JVQkJFUiAgICAgICAgIDB4MTQxIGJsdWUKKyBpbnB1dC5oOiNkZWZpbmUgQlROX1RPT0xfQlJVU0ggICAgICAgICAgMHgxNDIgZ3JlZW4KKyBpbnB1dC5oOiNkZWZpbmUgQlROX1RPT0xfUEVOQ0lMICAgICAgICAgMHgxNDMgcmVkCisgaW5wdXQuaDojZGVmaW5lIEJUTl9UT09MX0FJUkJSVVNIICAgICAgIDB4MTQ0IGVyYXNlcgorIGlucHV0Lmg6I2RlZmluZSBCVE5fVE9PTF9GSU5HRVIgICAgICAgICAweDE0NSBzbWFsbCBlcmFzZXIKKyBpbnB1dC5oOiNkZWZpbmUgQlROX1RPT0xfTU9VU0UgICAgICAgICAgMHgxNDYgbWltaW8gaW50ZXJhY3RpdmUKKyBpbnB1dC5oOiNkZWZpbmUgQlROX1RPT0xfTEVOUyAgICAgICAgICAgMHgxNDcgbWltaW8gaW50ZXJhY3RpdmUgYnV0MQorIGlucHV0Lmg6I2RlZmluZSBMT0NBTEJUTl9UT09MX0VYVFJBMSAgICAweDE0YSBtaW1pbyBpbnRlcmFjdGl2ZSBidXQyID09IEJUTl9UT1VDSAorIGlucHV0Lmg6I2RlZmluZSBMT0NBTEJUTl9UT09MX0VYVFJBMiAgICAweDE0YiBtaW1pbyBleHRyYSBwZW5zIChvcmFuZ2UsIGJyb3duLCB5ZWxsb3csIHB1cnBsZSkgPT0gQlROX1NUWUxVUworIGlucHV0Lmg6I2RlZmluZSBMT0NBTEJUTl9UT09MX0VYVFJBMyAgICAweDE0YyB1bnVzZWQgPT0gQlROX1NUWUxVUzIKKyBpbnB1dC5oOiNkZWZpbmUgQlROX1RPT0xfRE9VQkxFVEFQICAgICAgMHgxNGQgdW51c2VkCisgaW5wdXQuaDojZGVmaW5lIEJUTl9UT09MX1RSSVBMRVRBUCAgICAgIDB4MTRlIHVudXNlZAorICoKKyAqIE1JTUlPX0VWX1BFTkRPV04oTUlNSU9fUEVOX0spICAgICA9PiBFVl9LRVkgQklUKEJUTl9UT09MX1BFTikKKyAqIE1JTUlPX0VWX1BFTkRPV04oTUlNSU9fUEVOX0IpICAgICA9PiBFVl9LRVkgQklUKEJUTl9UT09MX1JVQkJFUikKKyAqIE1JTUlPX0VWX1BFTkRPV04oTUlNSU9fUEVOX0cpICAgICA9PiBFVl9LRVkgQklUKEJUTl9UT09MX0JSVVNIKQorICogTUlNSU9fRVZfUEVORE9XTihNSU1JT19QRU5fUikgICAgID0+IEVWX0tFWSBCSVQoQlROX1RPT0xfUEVOQ0lMKQorICogTUlNSU9fRVZfUEVORE9XTihNSU1JT19QRU5fRSkgICAgID0+IEVWX0tFWSBCSVQoQlROX1RPT0xfQUlSQlJVU0gpCisgKiBNSU1JT19FVl9QRU5ET1dOKE1JTUlPX1BFTl9FUykgICAgPT4gRVZfS0VZIEJJVChCVE5fVE9PTF9GSU5HRVIpCisgKiBNSU1JT19FVl9QRU5ET1dOKE1JTUlPX1BFTl9JKSAgICAgPT4gRVZfS0VZIEJJVChCVE5fVE9PTF9NT1VTRSkKKyAqIE1JTUlPX0VWX1BFTkRPV04oTUlNSU9fUEVOX0lMKSAgICA9PiBFVl9LRVkgQklUKEJUTl9UT09MX0xFTlMpCisgKiBNSU1JT19FVl9QRU5ET1dOKE1JTUlPX1BFTl9JUikgICAgPT4gRVZfS0VZIEJJVChCVE5fVE9PTF9ET1VCTEVUQVApCisgKiBNSU1JT19FVl9QRU5ET1dOKE1JTUlPX1BFTl9FWCkgICAgPT4gRVZfS0VZIEJJVChCVE5fVE9PTF9UUklQTEVUQVApCisgKiBNSU1JT19FVl9QRU5EQVRBICAgICAgICAgICAgICAgICA9PiBFVl9BQlMgQklUKEFCU19YKSwgQklUKEFCU19ZKQorICogTUlNSU9fRVZfTUVNUkVTRVQgICAgICAgICAgICAgID0+IEVWX0tFWSBCSVQoQlROXzApCisgKiBNSU1JT19FVl9BQ0MoQUNDX05FV1BBR0UpICAgICAgID0+IEVWX0tFWSBCSVQoQlROXzEpCisgKiBNSU1JT19FVl9BQ0MoQUNDX1RBR1BBR0UpICAgICAgPT4gRVZfS0VZIEJJVChCVE5fMikKKyAqIE1JTUlPX0VWX0FDQyhBQ0NfUFJJTlRQQUdFKSAgICAgID0+IEVWX0tFWSBCSVQoQlROXzMpCisgKiBNSU1JT19FVl9BQ0MoQUNDX01BWElNSVpFKSAgICAgID0+IEVWX0tFWSBCSVQoQlROXzQpCisgKiBNSU1JT19FVl9BQ0MoQUNDX0ZJTkRDVExQTkwpICAgICAgPT4gRVZfS0VZIEJJVChCVE5fNSkKKyAqCisgKgorICogb3BlbiBpc3N1ZXM6CisgKiAgICAgIC0gY29sZC1sb2FkIG9mIGRhdGEgY2FwdHVyZWQgd2hlbiBtaW1pbyBpbiBzdGFuZGFsb25lIG1vZGUgbm90IHlldAorICogICAgICAgICBzdXBwb3J0ZWQ7IG5lZWQgdG8gc25vb3AgV2luMzIgYm94IHRvIHNlZSBkYXRhc3RyZWFtIGZvciB0aGlzLgorICogICAgICAgLSBtaW1pbyBtb3VzZSBub3QgeWV0IHN1cHBvcnRlZDsgbmVlZCB0byBzbm9vcCBXaW4zMiBib3ggdG8gc2VlIHRoZQorICogICAgICAgICBkYXRhc3RyZWFtIGZvciB0aGlzLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JCSJ2MC4wMzEiCisjZGVmaW5lIERSSVZFUl9BVVRIT1IJCSJtd2lsZGVyQGNzLm5tc3UuZWR1IgorI2RlZmluZSBEUklWRVJfREVTQwkJIlVTQiBtaW1pby14aSBkcml2ZXIiCisKK2VudW0ge1VQVkFMVUUsIERPV05WQUxVRSwgTU9WRVZBTFVFfTsKKworI2RlZmluZSBNSU1JT19YUkFOR0VfTUFYCTk2MDAKKyNkZWZpbmUgTUlNSU9fWVJBTkdFX01BWAk0ODAwCisKKyNkZWZpbmUgTE9DQUxCVE5fVE9PTF9FWFRSQTEJQlROX1RPVUNICisjZGVmaW5lIExPQ0FMQlROX1RPT0xfRVhUUkEyCUJUTl9TVFlMVVMKKyNkZWZpbmUgTE9DQUxCVE5fVE9PTF9FWFRSQTMJQlROX1NUWUxVUzIKKworI2RlZmluZSBNSU1JT19WRU5ET1JfSUQJCTB4MDhkMworI2RlZmluZSBNSU1JT19QUk9EVUNUX0lECTB4MDAwMQorI2RlZmluZSBNSU1JT19NQVhQQVlMT0FECSg4KQorI2RlZmluZSBNSU1JT19NQVhOQU1FTEVOCSg2NCkKKyNkZWZpbmUgTUlNSU9fVFhXQUlUCQkoMSkKKyNkZWZpbmUgTUlNSU9fVFhET05FCQkoMikKKworI2RlZmluZSBNSU1JT19FVl9QRU5ET1dOCSgweDIyKQorI2RlZmluZSBNSU1JT19FVl9QRU5EQVRBCSgweDI0KQorI2RlZmluZSBNSU1JT19FVl9QRU5VUAkJKDB4NTEpCisjZGVmaW5lIE1JTUlPX0VWX01FTVJFU0VUCSgweDQ1KQorI2RlZmluZSBNSU1JT19FVl9BQ0MJCSgweGIyKQorCisjZGVmaW5lIE1JTUlPX1BFTl9LCQkoMSkJLyogYmxhY2sgcGVuICovCisjZGVmaW5lIE1JTUlPX1BFTl9CCQkoMikJLyogYmx1ZSBwZW4gKi8KKyNkZWZpbmUgTUlNSU9fUEVOX0cJCSgzKQkvKiBncmVlbiBwZW4gKi8KKyNkZWZpbmUgTUlNSU9fUEVOX1IJCSg0KQkvKiByZWQgcGVuICovCisvKiA1LCA2LCA3LCA4IGFyZSBleHRyYSBwZW5zICovCisjZGVmaW5lIE1JTUlPX1BFTl9FCQkoOSkJLyogYmlnIGVyYXNlciAqLworI2RlZmluZSBNSU1JT19QRU5fRVMJCSgxMCkJLyogbGlsIGVyYXNlciAqLworI2RlZmluZSBNSU1JT19QRU5KVU1QX1NUQVJUCSgxMCkKKyNkZWZpbmUgTUlNSU9fUEVOSlVNUAkJKDYpCisjZGVmaW5lIE1JTUlPX1BFTl9JCQkoMTcpCS8qIG1pbWlvIGludGVyYWN0aXZlICovCisjZGVmaW5lIE1JTUlPX1BFTl9JTAkJKDE4KQkvKiBtaW1pbyBpbnRlcmFjdGl2ZSBidXR0b24gMSAqLworI2RlZmluZSBNSU1JT19QRU5fSVIJCSgxOSkJLyogbWltaW8gaW50ZXJhY3RpdmUgYnV0dG9uIDIgKi8KKworI2RlZmluZSBNSU1JT19QRU5fTUFYCQkoTUlNSU9fUEVOX0lSKQorCisjZGVmaW5lIEFDQ19ET05FCQkoMCkKKyNkZWZpbmUgQUNDX05FV1BBR0UJCSgxKQorI2RlZmluZSBBQ0NfVEFHUEFHRQkJKDIpCisjZGVmaW5lIEFDQ19QUklOVFBBR0UJCSg0KQorI2RlZmluZSBBQ0NfTUFYSU1JWkUJCSg4KQorI2RlZmluZSBBQ0NfRklORENUTFBOTAkJKDE2KQorCisjZGVmaW5lIGlzdmFsaWR0eHNpemUobikJKChuKSA+IDAgJiYgKG4pIDw9IE1JTUlPX01BWFBBWUxPQUQpCisKKworc3RydWN0IHBrdGJ1ZiB7CisJdW5zaWduZWQgY2hhciBpbnN0cjsKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsxNl07CisJdW5zaWduZWQgY2hhciAqcDsKKwl1bnNpZ25lZCBjaGFyICpxOworfTsKKworc3RydWN0IHVzYmludGVuZHB0IHsKKwlkbWFfYWRkcl90IGRtYTsKKwlzdHJ1Y3QgdXJiICp1cmI7CisJdW5zaWduZWQgY2hhciAqYnVmOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZGVzYzsKK307CisKK3N0cnVjdCBtaW1pbyB7CisJc3RydWN0IGlucHV0X2RldiAqaWRldjsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqdWlmYzsKKwlpbnQgb3BlbjsKKwlpbnQgcHJlc2VudDsKKwlpbnQgZ3JlZXRlZDsKKwlpbnQgdHhmbGFnczsKKwljaGFyIHBoeXNbTUlNSU9fTUFYTkFNRUxFTl07CisJc3RydWN0IHVzYmludGVuZHB0IGluOworCXN0cnVjdCB1c2JpbnRlbmRwdCBvdXQ7CisJc3RydWN0IHBrdGJ1ZiBwa3RidWY7CisJdW5zaWduZWQgY2hhciBtaW5vcjsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0cTsKKwlzcGlubG9ja190IHR4bG9jazsKKwl2b2lkICgqcnhoYW5kbGVyKShzdHJ1Y3QgbWltaW8gKiwgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBpbnQpOworCWludCBsYXN0X3Blbl9kb3duOworfTsKKworc3RhdGljIHZvaWQgbWltaW9fY2xvc2Uoc3RydWN0IGlucHV0X2RldiAqKTsKK3N0YXRpYyB2b2lkIG1pbWlvX2RlYWxsb2Moc3RydWN0IG1pbWlvICopOworc3RhdGljIHZvaWQgbWltaW9fZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqKTsKK3N0YXRpYyBpbnQgbWltaW9fZ3JlZXQoc3RydWN0IG1pbWlvICopOworc3RhdGljIHZvaWQgbWltaW9faXJxX2luKHN0cnVjdCB1cmIgKik7CitzdGF0aWMgdm9pZCBtaW1pb19pcnFfb3V0KHN0cnVjdCB1cmIgKik7CitzdGF0aWMgaW50IG1pbWlvX29wZW4oc3RydWN0IGlucHV0X2RldiAqKTsKK3N0YXRpYyBpbnQgbWltaW9fcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKik7CitzdGF0aWMgdm9pZCBtaW1pb19yeF9oYW5kbGVyKHN0cnVjdCBtaW1pbyAqLCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCk7CitzdGF0aWMgaW50IG1pbWlvX3R4KHN0cnVjdCBtaW1pbyAqLCBjb25zdCBjaGFyICosIGludCk7CisKK3N0YXRpYyBjaGFyIG1pbWlvX25hbWVbXSA9ICJWaXJ0dWFsSW5rIG1pbWlvLVhpIjsKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBtaW1pb190YWJsZSBbXSA9IHsKKwl7IFVTQl9ERVZJQ0UoTUlNSU9fVkVORE9SX0lELCBNSU1JT19QUk9EVUNUX0lEKSB9LAorCXsgVVNCX0RFVklDRSgweDA1MjUsIDB4YTRhMCkgfSwgLyogZ2FkZ2V0IHplcm8gZmlybXdhcmUgKi8KKwl7IH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBtaW1pb190YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBtaW1pb19kcml2ZXIgPSB7CisJLm5hbWUgPSAibWltaW8iLAorCS5wcm9iZSA9IG1pbWlvX3Byb2JlLAorCS5kaXNjb25uZWN0ID0gbWltaW9fZGlzY29ubmVjdCwKKwkuaWRfdGFibGUgPSBtaW1pb190YWJsZSwKK307CisKK3N0YXRpYyBERUNMQVJFX01VVEVYKGRpc2Nvbm5lY3Rfc2VtKTsKKworc3RhdGljIHZvaWQgbWltaW9fY2xvc2Uoc3RydWN0IGlucHV0X2RldiAqaWRldikKK3sKKwlzdHJ1Y3QgbWltaW8gKm1pbWlvOworCisJbWltaW8gPSBpbnB1dF9nZXRfZHJ2ZGF0YShpZGV2KTsKKwlpZiAoIW1pbWlvKSB7CisJCWRldl9lcnIoJmlkZXYtPmRldiwgIm51bGwgbWltaW8gYXR0YWNoZWQgdG8gaW5wdXQgZGV2aWNlXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChtaW1pby0+b3BlbiA8PSAwKQorCQlkZXZfZXJyKCZpZGV2LT5kZXYsICJtaW1pbyBub3Qgb3Blbi5cbiIpOworCWVsc2UKKwkJbWltaW8tPm9wZW4tLTsKKworCWlmIChtaW1pby0+cHJlc2VudCA9PSAwICYmIG1pbWlvLT5vcGVuID09IDApCisJCW1pbWlvX2RlYWxsb2MobWltaW8pOworfQorCitzdGF0aWMgdm9pZCBtaW1pb19kZWFsbG9jKHN0cnVjdCBtaW1pbyAqbWltaW8pCit7CisJaWYgKG1pbWlvID09IE5VTEwpCisJCXJldHVybjsKKworCXVzYl9raWxsX3VyYihtaW1pby0+aW4udXJiKTsKKworCXVzYl9raWxsX3VyYihtaW1pby0+b3V0LnVyYik7CisKKwlpZiAobWltaW8tPmlkZXYpIHsKKwkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UobWltaW8tPmlkZXYpOworCQlpZiAobWltaW8tPmlkZXYtPmdyYWIpCisJCQlpbnB1dF9jbG9zZV9kZXZpY2UobWltaW8tPmlkZXYtPmdyYWIpOworCQllbHNlCisJCQlkZXZfZGJnKCZtaW1pby0+aWRldi0+ZGV2LCAibWltaW8tPmlkZXYtPmdyYWIgPT0gTlVMTCIKKwkJCQkiIC0tIGRpZG4ndCBjYWxsIGlucHV0X2Nsb3NlX2RldmljZVxuIik7CisJfQorCisJdXNiX2ZyZWVfdXJiKG1pbWlvLT5pbi51cmIpOworCisJdXNiX2ZyZWVfdXJiKG1pbWlvLT5vdXQudXJiKTsKKworCWlmIChtaW1pby0+aW4uYnVmKSB7CisJCXVzYl9idWZmZXJfZnJlZShtaW1pby0+dWRldiwgTUlNSU9fTUFYUEFZTE9BRCwgbWltaW8tPmluLmJ1ZiwKKwkJCQltaW1pby0+aW4uZG1hKTsKKwl9CisKKwlpZiAobWltaW8tPm91dC5idWYpCisJCXVzYl9idWZmZXJfZnJlZShtaW1pby0+dWRldiwgTUlNSU9fTUFYUEFZTE9BRCwgbWltaW8tPm91dC5idWYsCisJCQkJbWltaW8tPm91dC5kbWEpOworCisJaWYgKG1pbWlvLT5pZGV2KQorCQlpbnB1dF9mcmVlX2RldmljZShtaW1pby0+aWRldik7CisKKwlrZnJlZShtaW1pbyk7Cit9CisKK3N0YXRpYyB2b2lkIG1pbWlvX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYykKK3sKKwlzdHJ1Y3QgbWltaW8gKm1pbWlvOworCisJZG93bigmZGlzY29ubmVjdF9zZW0pOworCisJbWltaW8gPSB1c2JfZ2V0X2ludGZkYXRhKGlmYyk7CisJdXNiX3NldF9pbnRmZGF0YShpZmMsIE5VTEwpOworCWRldl9kYmcoJm1pbWlvLT5pZGV2LT5kZXYsICJkaXNjb25uZWN0XG4iKTsKKworCWlmIChtaW1pbykgeworCQltaW1pby0+cHJlc2VudCA9IDA7CisKKwkJaWYgKG1pbWlvLT5vcGVuIDw9IDApCisJCQltaW1pb19kZWFsbG9jKG1pbWlvKTsKKwl9CisKKwl1cCgmZGlzY29ubmVjdF9zZW0pOworfQorCitzdGF0aWMgaW50IG1pbWlvX2dyZWV0KHN0cnVjdCBtaW1pbyAqbWltaW8pCit7CisJY29uc3Qgc3RydWN0IGdydHBrdCB7CisJCWludCBuYnl0ZXM7CisJCXVuc2lnbmVkIGRlbGF5OworCQljaGFyIGRhdGFbOF07CisJfSBncnRwa3RzW10gPSB7CisJCXsgMywgMCwgeyAweDExLCAweDU1LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0gfSwKKwkJeyA1LCAwLCB7IDB4NTMsIDB4NTUsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAgfSB9LAorCQl7IDUsIDAsIHsgMHg0MywgMHg1NSwgMHgwMCwgMHgwMCwgMHgxNiwgMHgwMCwgMHgwMCwgMHgwMCB9IH0sCisJCXsgNSwgMCwgeyAweDMzLCAweDU1LCAweDAwLCAweDAwLCAweDY2LCAweDAwLCAweDAwLCAweDAwIH0gfSwKKwkJeyA1LCAwLCB7IDB4MTMsIDB4MDAsIDB4NWUsIDB4MDIsIDB4NGYsIDB4MDAsIDB4MDAsIDB4MDAgfSB9LAorCQl7IDUsIDAsIHsgMHgxMywgMHgwMCwgMHgwNCwgMHgwMywgMHgxNCwgMHgwMCwgMHgwMCwgMHgwMCB9IH0sCisJCXsgNSwgMiwgeyAweDEzLCAweDAwLCAweDAwLCAweDA0LCAweDE3LCAweDAwLCAweDAwLCAweDAwIH0gfSwKKwkJeyA1LCAwLCB7IDB4MTMsIDB4MDAsIDB4MGQsIDB4MDgsIDB4MTYsIDB4MDAsIDB4MDAsIDB4MDAgfSB9LAorCQl7IDUsIDAsIHsgMHgxMywgMHgwMCwgMHg0ZCwgMHgwMSwgMHg1ZiwgMHgwMCwgMHgwMCwgMHgwMCB9IH0sCisJCXsgMywgMCwgeyAweGYxLCAweDU1LCAweGE0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0gfSwKKwkJeyA3LCAyLCB7IDB4NTIsIDB4NTUsIDB4MDAsIDB4MDcsIDB4MzEsIDB4NTUsIDB4NjQsIDB4MDAgfSB9LAorCQl7IDAsIDAsIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9IH0sCisJfTsKKwlpbnQgcnNsdDsKKwljb25zdCBzdHJ1Y3QgZ3J0cGt0ICpwa3Q7CisKKwlmb3IgKHBrdCA9IGdydHBrdHM7IHBrdC0+bmJ5dGVzOyBwa3QrKykgeworCQlyc2x0ID0gbWltaW9fdHgobWltaW8sIHBrdC0+ZGF0YSwgcGt0LT5uYnl0ZXMpOworCQlpZiAocnNsdCkKKwkJCXJldHVybiByc2x0OworCQlpZiAocGt0LT5kZWxheSkKKwkJCW1zbGVlcChwa3QtPmRlbGF5KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbWltaW9faXJxX2luKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlpbnQgcnNsdDsKKwljaGFyICpkYXRhOworCWNvbnN0IGNoYXIgKnJlYXNvbiA9ICJnb2luZyBkb3duIjsKKwlzdHJ1Y3QgbWltaW8gKm1pbWlvOworCisJbWltaW8gPSB1cmItPmNvbnRleHQ7CisKKwlpZiAobWltaW8gPT0gTlVMTCkKKwkJLyogcGFyYW5vaWEgKi8KKwkJcmV0dXJuOworCisJc3dpdGNoICh1cmItPnN0YXR1cykgeworCWNhc2UgMDoKKwkJLyogc3VjY2VzcyAqLworCQlicmVhazsKKwljYXNlIC1FVElNRURPVVQ6CisJCXJlYXNvbiA9ICJ0aW1lb3V0IC0tIHVucGx1Z2dlZD8iOworCWNhc2UgLUVDT05OUkVTRVQ6CisJY2FzZSAtRU5PRU5UOgorCWNhc2UgLUVTSFVURE9XTjoKKwkJZGV2X2RiZygmbWltaW8tPmlkZXYtPmRldiwgIiVzLlxuIiwgcmVhc29uKTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCWRldl9kYmcoJm1pbWlvLT5pZGV2LT5kZXYsICJ1bmtub3duIHVyYi1zdGF0dXM6ICVkLlxuIiwKKwkJCXVyYi0+c3RhdHVzKTsKKwkJZ290byBleGl0OworCX0KKwlkYXRhID0gbWltaW8tPmluLmJ1ZjsKKworCWlmIChtaW1pby0+cnhoYW5kbGVyKQorCQltaW1pby0+cnhoYW5kbGVyKG1pbWlvLCBkYXRhLCB1cmItPmFjdHVhbF9sZW5ndGgpOworZXhpdDoKKwkvKgorCSAqIEtlZXAgbGlzdGVuaW5nIHRvIGRldmljZSBvbiBzYW1lIHVyYi4KKwkgKi8KKwlyc2x0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAocnNsdCkKKwkJZGV2X2VycigmbWltaW8tPmlkZXYtPmRldiwgInVzYl9zdWJtaXRfdXJiIGZhaWx1cmU6ICVkLlxuIiwKKwkJCXJzbHQpOworfQorCitzdGF0aWMgdm9pZCBtaW1pb19pcnFfb3V0KHN0cnVjdCB1cmIgKnVyYikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBtaW1pbyAqbWltaW87CisKKwltaW1pbyA9IHVyYi0+Y29udGV4dDsKKworCWlmICh1cmItPnN0YXR1cykKKwkJZGV2X2RiZygmbWltaW8tPmlkZXYtPmRldiwgInVyYi1zdGF0dXM6ICVkLlxuIiwgdXJiLT5zdGF0dXMpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1pbWlvLT50eGxvY2ssIGZsYWdzKTsKKwltaW1pby0+dHhmbGFncyB8PSBNSU1JT19UWERPTkU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWltaW8tPnR4bG9jaywgZmxhZ3MpOworCXdtYigpOworCXdha2VfdXAoJm1pbWlvLT53YWl0cSk7Cit9CisKK3N0YXRpYyBpbnQgbWltaW9fb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2KQoreworCWludCByc2x0OworCXN0cnVjdCBtaW1pbyAqbWltaW87CisKKwlyc2x0ID0gMDsKKwlkb3duKCZkaXNjb25uZWN0X3NlbSk7CisJbWltaW8gPSBpbnB1dF9nZXRfZHJ2ZGF0YShpZGV2KTsKKwlkZXZfZGJnKCZpZGV2LT5kZXYsICJtaW1pb19vcGVuXG4iKTsKKworCWlmIChtaW1pbyA9PSBOVUxMKSB7CisJCWRldl9lcnIoJmlkZXYtPmRldiwgIm51bGwgbWltaW8uXG4iKTsKKwkJcnNsdCA9IC1FTk9ERVY7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAobWltaW8tPm9wZW4rKykKKwkJZ290byBleGl0OworCisJaWYgKG1pbWlvLT5wcmVzZW50ICYmICFtaW1pby0+Z3JlZXRlZCkgeworCQlzdHJ1Y3QgdXJiICp1cmIgPSBtaW1pby0+aW4udXJiOworCQltaW1pby0+aW4udXJiLT5kZXYgPSBtaW1pby0+dWRldjsKKwkJcnNsdCA9IHVzYl9zdWJtaXRfdXJiKG1pbWlvLT5pbi51cmIsIEdGUF9LRVJORUwpOworCQlpZiAocnNsdCkgeworCQkJZGV2X2VycigmaWRldi0+ZGV2LCAidXNiX3N1Ym1pdF91cmIgZmFpbHVyZSAiCisJCQkJIihyZXMgPSAlZDogJXMpLiBOb3QgZ3JlZXRpbmcuXG4iLAorCQkJCXJzbHQsCisJCQkJKCF1cmIgPyAidXJiIGlzIE5VTEwiIDoKKwkJCQkgKHVyYi0+aGNwcml2ID8gInVyYi0+aGNwcml2IGlzIG5vbi1OVUxMIiA6CisJCQkJICAoIXVyYi0+Y29tcGxldGUgPyAidXJiIGlzIG5vdCBjb21wbGV0ZSIgOgorCQkJCSAgICh1cmItPm51bWJlcl9vZl9wYWNrZXRzIDw9IDAgPyAidXJiIGhhcyBubyBwYWNrZXRzIiA6CisJCQkJICAgICh1cmItPmludGVydmFsIDw9IDAgPyAidXJiIGludGVydmFsIHRvbyBzbWFsbCIgOgorCQkJCSAgICAgInVyYiBpbnRlcnZhbCB0b28gbGFyZ2Ugb3Igc29tZSBvdGhlciBlcnJvciIpKSkpKSk7CisJCQlyc2x0ID0gLUVJTzsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCQlyc2x0ID0gbWltaW9fZ3JlZXQobWltaW8pOworCQlpZiAocnNsdCA9PSAwKSB7CisJCQlkZXZfZGJnKCZpZGV2LT5kZXYsICJNaW1pbyBncmVldGVkIE9LLlxuIik7CisJCQltaW1pby0+Z3JlZXRlZCA9IDE7CisJCX0gZWxzZSB7CisJCQlkZXZfZGJnKCZpZGV2LT5kZXYsICJNaW1pbyBncmVldCBGYWlsdXJlICglZClcbiIsCisJCQkJcnNsdCk7CisJCX0KKwl9CisKK2V4aXQ6CisJdXAoJmRpc2Nvbm5lY3Rfc2VtKTsKKwlyZXR1cm4gcnNsdDsKK30KKworc3RhdGljIGludCBtaW1pb19wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZjLAorCQkgICAgICAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCWNoYXIgcGF0aFs2NF07CisJaW50IHBpcGUsIG1heHA7CisJc3RydWN0IG1pbWlvICptaW1pbzsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKKwlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICpob3N0aWZjOworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKKwlpbnQgcmVzID0gMDsKKwlpbnQgaTsKKworCXVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGlmYyk7CisKKwltaW1pbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtaW1pbyksIEdGUF9LRVJORUwpOworCWlmICghbWltaW8pCisJCXJldHVybiAtRU5PTUVNOworCisJaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKCFpbnB1dF9kZXYpIHsKKwkJbWltaW9fZGVhbGxvYyhtaW1pbyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1pbWlvLT51aWZjID0gaWZjOworCW1pbWlvLT51ZGV2ID0gdWRldjsKKwltaW1pby0+cGt0YnVmLnAgPSBtaW1pby0+cGt0YnVmLmJ1ZjsKKwltaW1pby0+cGt0YnVmLnEgPSBtaW1pby0+cGt0YnVmLmJ1ZjsKKwkvKiBpbml0X2lucHV0X2RldihtaW1pby0+aWRldik7ICovCisJbWltaW8tPmlkZXYgPSBpbnB1dF9kZXY7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmbWltaW8tPndhaXRxKTsKKwlzcGluX2xvY2tfaW5pdCgmbWltaW8tPnR4bG9jayk7CisJaG9zdGlmYyA9IGlmYy0+Y3VyX2FsdHNldHRpbmc7CisKKwlpZiAoaG9zdGlmYy0+ZGVzYy5iTnVtRW5kcG9pbnRzICE9IDIpIHsKKwkJZGV2X2VycigmdWRldi0+ZGV2LCAiVW5leHBlY3RlZCBlbmRwb2ludCBjb3VudDogJWQuXG4iLAorCQkJaG9zdGlmYy0+ZGVzYy5iTnVtRW5kcG9pbnRzKTsKKwkJbWltaW9fZGVhbGxvYyhtaW1pbyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCW1pbWlvLT5pbi5kZXNjID0gJihob3N0aWZjLT5lbmRwb2ludFswXS5kZXNjKTsKKwltaW1pby0+b3V0LmRlc2MgPSAmKGhvc3RpZmMtPmVuZHBvaW50WzFdLmRlc2MpOworCisJbWltaW8tPmluLmJ1ZiA9IHVzYl9idWZmZXJfYWxsb2ModWRldiwgTUlNSU9fTUFYUEFZTE9BRCwgR0ZQX0tFUk5FTCwKKwkJCQkJICZtaW1pby0+aW4uZG1hKTsKKwltaW1pby0+b3V0LmJ1ZiA9IHVzYl9idWZmZXJfYWxsb2ModWRldiwgTUlNSU9fTUFYUEFZTE9BRCwgR0ZQX0tFUk5FTCwKKwkJCQkJICAmbWltaW8tPm91dC5kbWEpOworCisJaWYgKG1pbWlvLT5pbi5idWYgPT0gTlVMTCB8fCBtaW1pby0+b3V0LmJ1ZiA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnVkZXYtPmRldiwgInVzYl9idWZmZXJfYWxsb2MgZmFpbHVyZS5cbiIpOworCQltaW1pb19kZWFsbG9jKG1pbWlvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWltaW8tPmluLnVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJbWltaW8tPm91dC51cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCisJaWYgKG1pbWlvLT5pbi51cmIgPT0gTlVMTCB8fCBtaW1pby0+b3V0LnVyYiA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnVkZXYtPmRldiwgInVzYl9hbGxvY191cmIgZmFpbHVyZS5cbiIpOworCQltaW1pb19kZWFsbG9jKG1pbWlvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyoKKwkgKiBCdWlsZCB0aGUgaW5wdXQgdXJiLgorCSAqLworCXBpcGUgPSB1c2JfcmN2aW50cGlwZSh1ZGV2LCBtaW1pby0+aW4uZGVzYy0+YkVuZHBvaW50QWRkcmVzcyk7CisJbWF4cCA9IHVzYl9tYXhwYWNrZXQodWRldiwgcGlwZSwgdXNiX3BpcGVvdXQocGlwZSkpOworCWlmIChtYXhwID4gTUlNSU9fTUFYUEFZTE9BRCkKKwkJbWF4cCA9IE1JTUlPX01BWFBBWUxPQUQ7CisJdXNiX2ZpbGxfaW50X3VyYihtaW1pby0+aW4udXJiLCB1ZGV2LCBwaXBlLCBtaW1pby0+aW4uYnVmLCBtYXhwLAorCQkJIG1pbWlvX2lycV9pbiwgbWltaW8sIG1pbWlvLT5pbi5kZXNjLT5iSW50ZXJ2YWwpOworCW1pbWlvLT5pbi51cmItPnRyYW5zZmVyX2RtYSA9IG1pbWlvLT5pbi5kbWE7CisJbWltaW8tPmluLnVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CisKKwkvKgorCSAqIEJ1aWxkIHRoZSBvdXRwdXQgdXJiLgorCSAqLworCXBpcGUgPSB1c2Jfc25kaW50cGlwZSh1ZGV2LCBtaW1pby0+b3V0LmRlc2MtPmJFbmRwb2ludEFkZHJlc3MpOworCW1heHAgPSB1c2JfbWF4cGFja2V0KHVkZXYsIHBpcGUsIHVzYl9waXBlb3V0KHBpcGUpKTsKKwlpZiAobWF4cCA+IE1JTUlPX01BWFBBWUxPQUQpCisJCW1heHAgPSBNSU1JT19NQVhQQVlMT0FEOworCXVzYl9maWxsX2ludF91cmIobWltaW8tPm91dC51cmIsIHVkZXYsIHBpcGUsIG1pbWlvLT5vdXQuYnVmLCBtYXhwLAorCQkJIG1pbWlvX2lycV9vdXQsIG1pbWlvLCBtaW1pby0+b3V0LmRlc2MtPmJJbnRlcnZhbCk7CisJbWltaW8tPm91dC51cmItPnRyYW5zZmVyX2RtYSA9IG1pbWlvLT5vdXQuZG1hOworCW1pbWlvLT5vdXQudXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKworCS8qCisJICogQnVpbGQgaW5wdXQgZGV2aWNlIGluZm8KKwkgKi8KKwl1c2JfbWFrZV9wYXRoKHVkZXYsIHBhdGgsIDY0KTsKKwlzbnByaW50ZihtaW1pby0+cGh5cywgTUlNSU9fTUFYTkFNRUxFTiwgIiVzL2lucHV0MCIsIHBhdGgpOworCWlucHV0X3NldF9kcnZkYXRhKGlucHV0X2RldiwgbWltaW8pOworCS8qIGlucHV0X2Rldi0+ZGV2ID0gJmlmYy0+ZGV2OyAqLworCWlucHV0X2Rldi0+b3BlbiA9IG1pbWlvX29wZW47CisJaW5wdXRfZGV2LT5jbG9zZSA9IG1pbWlvX2Nsb3NlOworCWlucHV0X2Rldi0+bmFtZSA9IG1pbWlvX25hbWU7CisJaW5wdXRfZGV2LT5waHlzID0gbWltaW8tPnBoeXM7CisJaW5wdXRfZGV2LT5kZXYucGFyZW50ID0gJmlmYy0+ZGV2OworCisJaW5wdXRfZGV2LT5pZC5idXN0eXBlID0gQlVTX1VTQjsKKwlpbnB1dF9kZXYtPmlkLnZlbmRvciA9IGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpOworCWlucHV0X2Rldi0+aWQucHJvZHVjdCA9IGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KTsKKwlpbnB1dF9kZXYtPmlkLnZlcnNpb24gPSBsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmJjZERldmljZSk7CisKKwlpbnB1dF9kZXYtPmV2Yml0WzBdIHw9IEJJVChFVl9LRVkpIHwgQklUKEVWX0FCUyk7CisJZm9yIChpID0gQlROX1RPT0xfUEVOOyBpIDw9IExPQ0FMQlROX1RPT0xfRVhUUkEyOyArK2kpCisJCXNldF9iaXQoaSwgaW5wdXRfZGV2LT5rZXliaXQpOworCisJaW5wdXRfZGV2LT5rZXliaXRbQklUX1dPUkQoQlROX01JU0MpXSB8PSBCSVRfTUFTSyhCVE5fMCkgfAorCQkJCQkJIEJJVF9NQVNLKEJUTl8xKSB8CisJCQkJCQkgQklUX01BU0soQlROXzIpIHwKKwkJCQkJCSBCSVRfTUFTSyhCVE5fMykgfAorCQkJCQkJIEJJVF9NQVNLKEJUTl80KSB8CisJCQkJCQkgQklUX01BU0soQlROXzUpOworCS8qICAgaW5wdXRfZGV2LT5rZXliaXRbQlROX01PVVNFXSB8PSBCSVQoQlROX0xFRlQpOyAqLworCWlucHV0X2Rldi0+YWJzYml0WzBdIHw9IEJJVF9NQVNLKEFCU19YKSB8IEJJVF9NQVNLKEFCU19ZKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19YLCAwLCBNSU1JT19YUkFOR0VfTUFYLCAwLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19ZLCAwLCBNSU1JT19ZUkFOR0VfTUFYLCAwLCAwKTsKKwlpbnB1dF9kZXYtPmFic2JpdFtCSVRfV09SRChBQlNfTUlTQyldIHw9IEJJVF9NQVNLKEFCU19NSVNDKTsKKworI2lmIDAKKwlpbnB1dF9kZXYtPmFic21pbltBQlNfWF0gPSAwOworCWlucHV0X2Rldi0+YWJzbWluW0FCU19ZXSA9IDA7CisJaW5wdXRfZGV2LT5hYnNtYXhbQUJTX1hdID0gOTYwMDsKKwlpbnB1dF9kZXYtPmFic21heFtBQlNfWV0gPSA0ODAwOworCWlucHV0X2Rldi0+YWJzZnV6eltBQlNfWF0gPSAwOworCWlucHV0X2Rldi0+YWJzZnV6eltBQlNfWV0gPSAwOworCWlucHV0X2Rldi0+YWJzZmxhdFtBQlNfWF0gPSAwOworCWlucHV0X2Rldi0+YWJzZmxhdFtBQlNfWV0gPSAwOworI2VuZGlmCisKKyNpZiAwCisJLyogdGhpcyB3aWxsIGp1c3QgcmVkdWNlIHRoZSBwcmVjaXNpb24gKi8KKwlpbnB1dF9kZXYtPmFic2Z1enpbQUJTX1hdID0gODsgLyogZXhwZXJpbWVudGFsOyBtYXkgbmVlZCB0byBjaGFuZ2UgKi8KKwlpbnB1dF9kZXYtPmFic2Z1enpbQUJTX1ldID0gODsgLyogZXhwZXJpbWVudGFsOyBtYXkgbmVlZCB0byBjaGFuZ2UgKi8KKyNlbmRpZgorCisJLyoKKwkgKiBSZWdpc3RlciB0aGUgaW5wdXQgZGV2aWNlLgorCSAqLworCXJlcyA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShtaW1pby0+aWRldik7CisJaWYgKHJlcykgeworCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsICJpbnB1dF9yZWdpc3Rlcl9kZXZpY2UgZmFpbHVyZSAoJWQpXG4iLAorCQkJcmVzKTsKKwkJbWltaW9fZGVhbGxvYyhtaW1pbyk7CisJCXJldHVybiAtRUlPOworCX0KKwlkZXZfZGJnKCZtaW1pby0+aWRldi0+ZGV2LCAiaW5wdXQ6ICVzIG9uICVzIChyZXMgPSAlZCkuXG4iLAorCQlpbnB1dF9kZXYtPm5hbWUsIGlucHV0X2Rldi0+cGh5cywgcmVzKTsKKworCXVzYl9zZXRfaW50ZmRhdGEoaWZjLCBtaW1pbyk7CisJbWltaW8tPnByZXNlbnQgPSAxOworCisJLyoKKwkgKiBTdWJtaXQgdGhlIGlucHV0IHVyYiB0byB0aGUgdXNiIHN1YnN5c3RlbS4KKwkgKi8KKwltaW1pby0+aW4udXJiLT5kZXYgPSBtaW1pby0+dWRldjsKKwlyZXMgPSB1c2Jfc3VibWl0X3VyYihtaW1pby0+aW4udXJiLCBHRlBfS0VSTkVMKTsKKwlpZiAocmVzKSB7CisJCWRldl9lcnIoJm1pbWlvLT5pZGV2LT5kZXYsICJ1c2Jfc3VibWl0X3VyYiBmYWlsdXJlICglZClcbiIsCisJCQlyZXMpOworCQltaW1pb19kZWFsbG9jKG1pbWlvKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyoKKwkgKiBBdHRlbXB0IHRvIGdyZWV0IHRoZSBtaW1pbyBhZnRlciBnaXZpbmcKKwkgKiBpdCBzb21lIHBvc3QtaW5pdCBzZXR0bGluZyB0aW1lLgorCSAqCisJICogbm90ZTogc29tZXRpbWVzIHRoaXMgc2xlZXAgaW50ZXJ2YWwgaXNuJ3QKKwkgKiBsb25nIGVub3VnaCB0byBwZXJtaXQgdGhlIGRldmljZSB0byByZS1pbml0CisJICogYWZ0ZXIgYSBob3Qtc3dhcDsgbWF5YmUgbmVlZCB0byBidW1wIGl0IHVwLgorCSAqCisJICogQXMgaXQgaXMsIHRoaXMgcHJvYmFibHkgYnJlYWtzIG1vZHVsZSB1bmxvYWRpbmcgc3VwcG9ydCEKKwkgKi8KKwltc2xlZXAoMTAyNCk7CisKKwlyZXMgPSBtaW1pb19ncmVldChtaW1pbyk7CisJaWYgKHJlcyA9PSAwKSB7CisJCWRldl9kYmcoJm1pbWlvLT5pZGV2LT5kZXYsICJNaW1pbyBncmVldGVkIE9LLlxuIik7CisJCW1pbWlvLT5ncmVldGVkID0gMTsKKwkJbWltaW8tPnJ4aGFuZGxlciA9IG1pbWlvX3J4X2hhbmRsZXI7CisJfSBlbHNlIHsKKwkJZGV2X2RiZygmbWltaW8tPmlkZXYtPmRldiwgIk1pbWlvIGdyZWV0IEZhaWx1cmUgKCVkKVxuIiwgcmVzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYW5kbGVfbWltaW9fcnhfcGVudXBkb3duKHN0cnVjdCBtaW1pbyAqbWltaW8sCisJCQkJICAgICBpbnQgZG93biwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmNvbnN0IGluc3RyW10sCisJCQkJICAgICBjb25zdCBpbnQgaW5zdHJfb2ZzdFtdKQoreworCWludCBwZW5pZCwgeDsKKwlpZiAobWltaW8tPnBrdGJ1Zi5xIC0gbWltaW8tPnBrdGJ1Zi5wIDwgKGRvd24gPyA0IDogMykpCisJCXJldHVybiAxOyAJCS8qIHBhcnRpYWwgcGt0ICovCisKKwlpZiAoZG93bikgeworCQl4ID0gKm1pbWlvLT5wa3RidWYucCBeICoobWltaW8tPnBrdGJ1Zi5wICsgMSkgXgorCQkJKihtaW1pby0+cGt0YnVmLnAgKyAyKTsKKwkJaWYgKHggIT0gKihtaW1pby0+cGt0YnVmLnAgKyAzKSkgeworCQkJZGV2X2RiZygmbWltaW8tPmlkZXYtPmRldiwgIkVWX1BFTiVzOiBiYWQgeHN1bS5cbiIsCisJCQkJZG93biA/ICJET1dOIjoiVVAiKTsKKwkJCS8qIHNraXAgdGhpcyBldmVudCBkYXRhICovCisJCQltaW1pby0+cGt0YnVmLnAgKz0gNDsKKwkJCS8qIGRlY29kZSBhbnkgcmVtYWluaW5nIGV2ZW50cyAqLworCQkJcmV0dXJuIDA7CisJCX0KKwkJcGVuaWQgPSBtaW1pby0+cGt0YnVmLmluc3RyID0gKihtaW1pby0+cGt0YnVmLnAgKyAyKTsKKwkJaWYgKHBlbmlkID4gTUlNSU9fUEVOX01BWCkgeworCQkJZGV2X2RiZygmbWltaW8tPmlkZXYtPmRldiwKKwkJCQkiVW5tYXBwZWQgcGVuSUQgKG5vdCBpbiBbMCwgJWRdKTogJWRcbiIsCisJCQkJTUlNSU9fUEVOX01BWCwgKGludCltaW1pby0+cGt0YnVmLmluc3RyKTsKKwkJCXBlbmlkID0gbWltaW8tPnBrdGJ1Zi5pbnN0ciA9IDA7CisJCX0KKwkJbWltaW8tPmxhc3RfcGVuX2Rvd24gPSBwZW5pZDsKKwl9IGVsc2UgeworCQlwZW5pZCA9IG1pbWlvLT5sYXN0X3Blbl9kb3duOworCX0KKwlkZXZfZGJnKCZtaW1pby0+aWRldi0+ZGV2LCAiJXMgKGlkICVkLCBjb2RlICVkKSAlcy5cbiIsIGluc3RyW3BlbmlkXSwKKwkJaW5zdHJfb2ZzdFtwZW5pZF0sIHBlbmlkLCBkb3duID8gImRvd24iIDogInVwIik7CisKKwlpZiAoaW5zdHJfb2ZzdFtwZW5pZF0gPj0gMCkgeworCQlpbnQgY29kZSA9IEJUTl9UT09MX1BFTiArIGluc3RyX29mc3RbcGVuaWRdOworCQlpbnQgdmFsdWUgPSBkb3duID8gRE9XTlZBTFVFIDogVVBWQUxVRTsKKwkJaWYgKGNvZGUgPiBLRVlfTUFYKQorCQkJZGV2X2RiZygmbWltaW8tPmlkZXYtPmRldiwgImlucHV0X2V2ZW50IHdpbGwgaWdub3JlICIKKwkJCQkiLS0gY29kZSAoJWQpID4gS0VZX01BWFxuIiwgY29kZSk7CisJCWlmICghdGVzdF9iaXQoY29kZSwgbWltaW8tPmlkZXYtPmtleWJpdCkpCisJCQlkZXZfZGJnKCZtaW1pby0+aWRldi0+ZGV2LCAiaW5wdXRfZXZlbnQgd2lsbCBpZ25vcmUgIgorCQkJCSItLSBiaXQgZm9yIGNvZGUgKCVkKSBub3QgZW5hYmxlZFxuIiwgY29kZSk7CisJCWlmICghIXRlc3RfYml0KGNvZGUsIG1pbWlvLT5pZGV2LT5rZXkpID09IHZhbHVlKQorCQkJZGV2X2RiZygmbWltaW8tPmlkZXYtPmRldiwgImlucHV0X2V2ZW50IHdpbGwgaWdub3JlICIKKwkJCQkiLS0gYml0IGZvciBjb2RlICglZCkgYWxyZWFkeSBzZXQgdG8gJWRcbiIsCisJCQkJY29kZSwgdmFsdWUpOworCQlpZiAodmFsdWUgIT0gRE9XTlZBTFVFKSB7CisJCQkvKiBpbnB1dF9yZWdzKG1pbWlvLT5pZGV2LCByZWdzKTsgKi8KKwkJCWlucHV0X3JlcG9ydF9rZXkobWltaW8tPmlkZXYsIGNvZGUsIHZhbHVlKTsKKwkJCWlucHV0X3N5bmMobWltaW8tPmlkZXYpOworCQl9IGVsc2UgeworCQkJLyogd2FpdCB1bnRpbCB3ZSBnZXQgc29tZSBjb29yZGluYXRlcyAqLworCQl9CisJfSBlbHNlIHsKKwkJZGV2X2RiZygmbWltaW8tPmlkZXYtPmRldiwgInBlbklEIG9mZnNldFslZF0gPT0gJWQgaXMgPCAwICIKKwkJCSItIG5vdCBzZW5kaW5nXG4iLCBwZW5pZCwgaW5zdHJfb2ZzdFtwZW5pZF0pOworCX0KKwltaW1pby0+cGt0YnVmLnAgKz0gZG93biA/IDQgOiAzOyAvKiAzIGZvciB1cCwgNCBmb3IgZG93biAqLworCXJldHVybiAwOworfQorCisvKgorICogU3RheSB0dW5lZCBmb3IgcGFydGlhbC1wYWNrZXQgZXhjaXRlbWVudC4KKyAqCisgKiBUaGlzIHJvdXRpbmUgYnVmZmVycyBkYXRhIHBhY2tldHMgcmVjZWl2ZWQgZnJvbSB0aGUgbWltaW8gZGV2aWNlCisgKiBpbiB0aGUgbWltaW8ncyBkYXRhIHNwYWNlLiAgVGhpcyBidWZmZXJpbmcgaXMgbmVjZXNzYXJ5IGJlY2F1c2UKKyAqIHRoZSBtaW1pbydzIGluIGVuZHBvaW50IGNhbiBzZXJ2ZSB1cyBwYXJ0aWFsIHBhY2tldHMgb2YgZGF0YSwgYW5kCisgKiB3ZSB3YW50IHRoZSBkcml2ZXIgdG8gc3VwcG9ydCB0aGUgc2VydmljaW5nIG9mIG11bHRpcGxlIG1pbWlvcy4KKyAqIEVtcGlyaWNhbCBldmlkZW5jZSBnYXRoZXJlZCBzbyBmYXIgc3VnZ2VzdHMgdGhhdCB0aGUgbWV0aG9kIG9mCisgKiBidWZmZXJpbmcgcGFja2V0IGRhdGEgaW4gdGhlIG1pbWlvJ3MgZGF0YSBzcGFjZSB3b3Jrcy4gIFByZXZpb3VzCisgKiB2ZXJzaW9ucyBvZiB0aGlzIGRyaXZlciBkaWQgbm90IGJ1ZmZlciBwYWNrZXQgZGF0YSBpbiBlYWNoIG1pbWlvJ3MKKyAqIGRhdGEtc3BhY2UsIGFuZCB3ZXJlIHRoZXJlZm9yZSBub3QgYWJsZSB0byBzZXJ2aWNlIG11bHRpcGxlIG1pbWlvcy4KKyAqIE5vdGUgdGhhdCBzaW5jZSB0aGUgY2FsbGVyIG9mIHRoaXMgcm91dGluZSBpcyBydW5uaW5nIGluIGludGVycnVwdAorICogY29udGV4dCwgY2FyZSBuZWVkcyB0byBiZSB0YWtlbiB0byBlbnN1cmUgdGhhdCB0aGlzIHJvdXRpbmUgZG9lcyBub3QKKyAqIGJlY29tZSBibG9hdGVkLCBhbmQgaXQgbWF5IGJlIHRoYXQgYW5vdGhlciBzcGlubG9jayBpcyBuZWVkZWQgaW4gZWFjaAorICogbWltaW8gdG8gZ3VhcmQgdGhlIGJ1ZmZlcmVkIHBhY2tldCBkYXRhIHByb3Blcmx5LgorICovCitzdGF0aWMgdm9pZCBtaW1pb19yeF9oYW5kbGVyKHN0cnVjdCBtaW1pbyAqbWltaW8sCisJCQkgICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEsCisJCQkgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJm1pbWlvLT5pZGV2LT5kZXY7CisJdW5zaWduZWQgaW50IHg7CisJdW5zaWduZWQgaW50IHk7CisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpbnN0cltdID0geworCQkiPzAiLAorCQkiYmxhY2sgcGVuIiwgImJsdWUgcGVuIiwgImdyZWVuIHBlbiIsICJyZWQgcGVuIiwKKwkJImJyb3duIHBlbiIsICJvcmFuZ2UgcGVuIiwgInB1cnBsZSBwZW4iLCAieWVsbG93IHBlbiIsCisJCSJiaWcgZXJhc2VyIiwgImxpbCBlcmFzZXIiLAorCQkiPzExIiwgIj8xMiIsICI/MTMiLCAiPzE0IiwgIj8xNSIsICI/MTYiLAorCQkibWltaW8gaW50ZXJhY3RpdmUiLCAiaW50ZXJhY3RpdmUgYnV0dG9uMSIsCisJCSJpbnRlcmFjdGl2ZSBidXR0b24yIgorCX07CisKKwkvKiBNaW1pbyBJbnRlcmFjdGl2ZSBnaXZlczoKKwkgKiBkb3duOiBbMHgyMiAweDAxIDB4MTEgMHgzMiAweDI0XQorCSAqIGIxICA6IFsweDIyIDB4MDEgMHgxMiAweDMxIDB4MjRdCisJICogYjIgIDogWzB4MjIgMHgwMSAweDEzIDB4MzAgMHgyNF0KKwkgKi8KKwlzdGF0aWMgY29uc3QgaW50IGluc3RyX29mc3RbXSA9IHsKKwkJLTEsCisJCTAsIDEsIDIsIDMsCisJCTksIDksIDksIDksCisJCTQsIDUsCisJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisJCTYsIDcsIDgsCisJfTsKKworCW1lbWNweShtaW1pby0+cGt0YnVmLnEsIGRhdGEsIG5ieXRlcyk7CisJbWltaW8tPnBrdGJ1Zi5xICs9IG5ieXRlczsKKworCXdoaWxlIChtaW1pby0+cGt0YnVmLnAgPCBtaW1pby0+cGt0YnVmLnEpIHsKKwkJaW50IHQgPSAqbWltaW8tPnBrdGJ1Zi5wOworCQlzd2l0Y2ggKHQpIHsKKwkJY2FzZSBNSU1JT19FVl9QRU5VUDoKKwkJY2FzZSBNSU1JT19FVl9QRU5ET1dOOgorCQkJaWYgKGhhbmRsZV9taW1pb19yeF9wZW51cGRvd24obWltaW8sCisJCQkJCQkgICAgICB0ID09IE1JTUlPX0VWX1BFTkRPV04sCisJCQkJCQkgICAgICBpbnN0ciwgaW5zdHJfb2ZzdCkpCisJCQkJcmV0dXJuOyAvKiBwYXJ0aWFsIHBhY2tldCAqLworCQkJYnJlYWs7CisKKwkJY2FzZSBNSU1JT19FVl9QRU5EQVRBOgorCQkJaWYgKG1pbWlvLT5wa3RidWYucSAtIG1pbWlvLT5wa3RidWYucCA8IDYpCisJCQkJLyogcGFydGlhbCBwa3QgKi8KKwkJCQlyZXR1cm47CisJCQl4ID0gKm1pbWlvLT5wa3RidWYucCBeICoobWltaW8tPnBrdGJ1Zi5wICsgMSkgXgorCQkJCSoobWltaW8tPnBrdGJ1Zi5wICsgMikgXgorCQkJCSoobWltaW8tPnBrdGJ1Zi5wICsgMykgXgorCQkJCSoobWltaW8tPnBrdGJ1Zi5wICsgNCk7CisJCQlpZiAoeCAhPSAqKG1pbWlvLT5wa3RidWYucCArIDUpKSB7CisJCQkJZGV2X2RiZyhkZXYsICJFVl9QRU5EQVRBOiBiYWQgeHN1bS5cbiIpOworCQkJCW1pbWlvLT5wa3RidWYucCArPSA2OyAvKiBza2lwIHRoaXMgZXZlbnQgZGF0YSAqLworCQkJCWJyZWFrOyAvKiBkZWNvZGUgYW55IHJlbWFpbmluZyBldmVudHMgKi8KKwkJCX0KKwkJCXggPSAqKG1pbWlvLT5wa3RidWYucCArIDEpOworCQkJeCA8PD0gODsKKwkJCXggfD0gKihtaW1pby0+cGt0YnVmLnAgKyAyKTsKKwkJCXkgPSAqKG1pbWlvLT5wa3RidWYucCArIDMpOworCQkJeSA8PD0gODsKKwkJCXkgfD0gKihtaW1pby0+cGt0YnVmLnAgKyA0KTsKKwkJCWRldl9kYmcoZGV2LCAiY29vcmQ6ICglZCwgJWQpXG4iLCB4LCB5KTsKKwkJCWlmIChpbnN0cl9vZnN0W21pbWlvLT5wa3RidWYuaW5zdHJdID49IDApIHsKKwkJCQlpbnQgY29kZSA9IEJUTl9UT09MX1BFTiArCisJCQkJCSAgIGluc3RyX29mc3RbbWltaW8tPmxhc3RfcGVuX2Rvd25dOworI2lmIDAKKwkJCQkvKiBVdHRlciBoYWNrIHRvIGVuc3VyZSB3ZSBnZXQgZm9yd2FyZGVkIF9BTkRfCisJCQkJICogc28gd2UgY2FuIGlkZW50aWZ5IHdoZW4gYSBjb21wbGV0ZSBzaWduYWwgaXMKKwkJCQkgKiByZWNlaXZlZCAqLworCQkJCW1pbWlvLT5pZGV2LT5hYnNbQUJTX1ldID0gLTE7CisJCQkJbWltaW8tPmlkZXYtPmFic1tBQlNfWF0gPSAtMTsKKyNlbmRpZgorCQkJCS8qIGlucHV0X3JlZ3MobWltaW8tPmlkZXYsIHJlZ3MpOyAqLworCQkJCWlucHV0X3JlcG9ydF9hYnMobWltaW8tPmlkZXYsIEFCU19YLCB4KTsKKwkJCQlpbnB1dF9yZXBvcnRfYWJzKG1pbWlvLT5pZGV2LCBBQlNfWSwgeSk7CisJCQkJLyogZmFrZSBhIHBlbnVwICovCisJCQkJY2hhbmdlX2JpdChjb2RlLCBtaW1pby0+aWRldi0+a2V5KTsKKwkJCQlpbnB1dF9yZXBvcnRfa2V5KG1pbWlvLT5pZGV2LAorCQkJCQkJIGNvZGUsCisJCQkJCQkgRE9XTlZBTFVFKTsKKwkJCQkvKiBhbHdheXMgc3luYyBoZXJlICovCisJCQkJbWltaW8tPmlkZXYtPnN5bmMgPSAwOworCQkJCWlucHV0X3N5bmMobWltaW8tPmlkZXYpOworCQkJfQorCQkJbWltaW8tPnBrdGJ1Zi5wICs9IDY7CisJCQlicmVhazsKKwkJY2FzZSBNSU1JT19FVl9NRU1SRVNFVDoKKwkJCWlmIChtaW1pby0+cGt0YnVmLnEgLSBtaW1pby0+cGt0YnVmLnAgPCA3KQorCQkJCS8qIHBhcnRpYWwgcGt0ICovCisJCQkJcmV0dXJuOworCQkJZGV2X2RiZyhkZXYsICJtZW0tcmVzZXQuXG4iKTsKKwkJCS8qIGlucHV0X3JlZ3MobWltaW8tPmlkZXYsIHJlZ3MpOyAqLworCQkJaW5wdXRfZXZlbnQobWltaW8tPmlkZXYsIEVWX0tFWSwgQlROXzAsIDEpOworCQkJaW5wdXRfZXZlbnQobWltaW8tPmlkZXYsIEVWX0tFWSwgQlROXzAsIDApOworCQkJaW5wdXRfc3luYyhtaW1pby0+aWRldik7CisJCQltaW1pby0+cGt0YnVmLnAgKz0gNzsKKwkJCWJyZWFrOworCQljYXNlIE1JTUlPX0VWX0FDQzoKKwkJCWlmIChtaW1pby0+cGt0YnVmLnEgLSBtaW1pby0+cGt0YnVmLnAgPCA0KQorCQkJCS8qIHBhcnRpYWwgcGt0ICovCisJCQkJcmV0dXJuOworCQkJeCA9ICptaW1pby0+cGt0YnVmLnAgXiAqKG1pbWlvLT5wa3RidWYucCArIDEpIF4KKwkJCQkqKG1pbWlvLT5wa3RidWYucCArIDIpOworCQkJaWYgKHggIT0gKihtaW1pby0+cGt0YnVmLnAgKyAzKSkgeworCQkJCWRldl9kYmcoZGV2LCAiRVZfQUNDOiBiYWQgeHN1bS5cbiIpOworCQkJCW1pbWlvLT5wa3RidWYucCArPSA0OyAvKiBza2lwIHRoaXMgZXZlbnQgZGF0YSAqLworCQkJCWJyZWFrOyAvKiBkZWNvZGUgYW55IHJlbWFpbmluZyBldmVudHMgKi8KKwkJCX0KKwkJCXN3aXRjaCAoKihtaW1pby0+cGt0YnVmLnAgKyAyKSkgeworCQkJY2FzZSBBQ0NfTkVXUEFHRToKKwkJCQlkZXZfZGJnKCZtaW1pby0+aWRldi0+ZGV2LCAibmV3LXBhZ2UuXG4iKTsKKwkJCQkvKiBpbnB1dF9yZWdzKG1pbWlvLT5pZGV2LCByZWdzKTsgKi8KKwkJCQlpbnB1dF9ldmVudChtaW1pby0+aWRldiwgRVZfS0VZLCBCVE5fMSwgMSk7CisJCQkJaW5wdXRfZXZlbnQobWltaW8tPmlkZXYsIEVWX0tFWSwgQlROXzEsIDApOworCQkJCWlucHV0X3N5bmMobWltaW8tPmlkZXYpOworCQkJCWJyZWFrOworCQkJY2FzZSBBQ0NfVEFHUEFHRToKKwkJCQlkZXZfZGJnKCZtaW1pby0+aWRldi0+ZGV2LCAidGFnLXBhZ2UuXG4iKTsKKwkJCQkvKiBpbnB1dF9yZWdzKG1pbWlvLT5pZGV2LCByZWdzKTsgKi8KKwkJCQlpbnB1dF9ldmVudChtaW1pby0+aWRldiwgRVZfS0VZLCBCVE5fMiwgMSk7CisJCQkJaW5wdXRfZXZlbnQobWltaW8tPmlkZXYsIEVWX0tFWSwgQlROXzIsIDApOworCQkJCWlucHV0X3N5bmMobWltaW8tPmlkZXYpOworCQkJCWJyZWFrOworCQkJY2FzZSBBQ0NfUFJJTlRQQUdFOgorCQkJCWRldl9kYmcoJm1pbWlvLT5pZGV2LT5kZXYsICJwcmludC1wYWdlLlxuIik7CisJCQkJLyogaW5wdXRfcmVncyhtaW1pby0+aWRldiwgcmVncyk7Ki8KKwkJCQlpbnB1dF9ldmVudChtaW1pby0+aWRldiwgRVZfS0VZLCBCVE5fMywgMSk7CisJCQkJaW5wdXRfZXZlbnQobWltaW8tPmlkZXYsIEVWX0tFWSwgQlROXzMsIDApOworCQkJCWlucHV0X3N5bmMobWltaW8tPmlkZXYpOworCQkJCWJyZWFrOworCQkJY2FzZSBBQ0NfTUFYSU1JWkU6CisJCQkJZGV2X2RiZygmbWltaW8tPmlkZXYtPmRldiwKKwkJCQkJIm1heGltaXplLXdpbmRvdy5cbiIpOworCQkJCS8qIGlucHV0X3JlZ3MobWltaW8tPmlkZXYsIHJlZ3MpOyAqLworCQkJCWlucHV0X2V2ZW50KG1pbWlvLT5pZGV2LCBFVl9LRVksIEJUTl80LCAxKTsKKwkJCQlpbnB1dF9ldmVudChtaW1pby0+aWRldiwgRVZfS0VZLCBCVE5fNCwgMCk7CisJCQkJaW5wdXRfc3luYyhtaW1pby0+aWRldik7CisJCQkJYnJlYWs7CisJCQljYXNlIEFDQ19GSU5EQ1RMUE5MOgorCQkJCWRldl9kYmcoJm1pbWlvLT5pZGV2LT5kZXYsICJmaW5kLWN0bC1wYW5lbC5cbiIpOworCQkJCS8qIGlucHV0X3JlZ3MobWltaW8tPmlkZXYsIHJlZ3MpOyAqLworCQkJCWlucHV0X2V2ZW50KG1pbWlvLT5pZGV2LCBFVl9LRVksIEJUTl81LCAxKTsKKwkJCQlpbnB1dF9ldmVudChtaW1pby0+aWRldiwgRVZfS0VZLCBCVE5fNSwgMCk7CisJCQkJaW5wdXRfc3luYyhtaW1pby0+aWRldik7CisJCQkJYnJlYWs7CisJCQljYXNlIEFDQ19ET05FOgorCQkJCWRldl9kYmcoJm1pbWlvLT5pZGV2LT5kZXYsICJhY2MtZG9uZS5cbiIpOworCQkJCS8qIG5vIGV2ZW50IGlzIGRpc3BhdGNoZWQgdG8gdGhlIGlucHV0CisJCQkJICogc3Vic3lzdGVtIGZvciB0aGlzIGRldmljZSBldmVudC4KKwkJCQkgKi8KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZGV2X2RiZyhkZXYsICJ1bmtub3duIGFjYyBldmVudC5cbiIpOworCQkJCWJyZWFrOworCQkJfQorCQkJbWltaW8tPnBrdGJ1Zi5wICs9IDQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCW1pbWlvLT5wa3RidWYucCsrOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKgorCSAqIE5vIHBhcnRpYWwgZXZlbnQgd2FzIHJlY2VpdmVkLCBzbyByZXNldCBtaW1pbydzIHBrdGJ1ZiBwdHJzLgorCSAqLworCW1pbWlvLT5wa3RidWYucCA9IG1pbWlvLT5wa3RidWYucSA9IG1pbWlvLT5wa3RidWYuYnVmOworfQorCitzdGF0aWMgaW50IG1pbWlvX3R4KHN0cnVjdCBtaW1pbyAqbWltaW8sIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IG5ieXRlcykKK3sKKwlpbnQgcnNsdDsKKwlpbnQgdGltZW91dDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJaWYgKCEoaXN2YWxpZHR4c2l6ZShuYnl0ZXMpKSkgeworCQlkZXZfZXJyKCZtaW1pby0+aWRldi0+ZGV2LCAiaW52YWxpZCBhcmc6IG5ieXRlczogJWQuXG4iLAorCQkJbmJ5dGVzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBJbml0IHRoZSBvdXQgdXJiIGFuZCBjb3B5IHRoZSBkYXRhIHRvIHNlbmQuCisJICovCisJbWltaW8tPm91dC51cmItPmRldiA9IG1pbWlvLT51ZGV2OworCW1pbWlvLT5vdXQudXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gbmJ5dGVzOworCW1lbWNweShtaW1pby0+b3V0LnVyYi0+dHJhbnNmZXJfYnVmZmVyLCBidWYsIG5ieXRlcyk7CisKKwkvKgorCSAqIFNlbmQgdGhlIGRhdGEuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1pbWlvLT50eGxvY2ssIGZsYWdzKTsKKwltaW1pby0+dHhmbGFncyA9IE1JTUlPX1RYV0FJVDsKKwlyc2x0ID0gdXNiX3N1Ym1pdF91cmIobWltaW8tPm91dC51cmIsIEdGUF9BVE9NSUMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pbWlvLT50eGxvY2ssIGZsYWdzKTsKKwlkZXZfZGJnKCZtaW1pby0+aWRldi0+ZGV2LCAicnNsdDogJWQuXG4iLCByc2x0KTsKKworCWlmIChyc2x0KSB7CisJCWRldl9lcnIoJm1pbWlvLT5pZGV2LT5kZXYsICJ1c2Jfc3VibWl0X3VyYiBmYWlsdXJlOiAlZC5cbiIsCisJCQlyc2x0KTsKKwkJcmV0dXJuIHJzbHQ7CisJfQorCisJLyoKKwkgKiBXYWl0IGZvciBjb21wbGV0aW9uIHRvIGJlIHNpZ25hbGxlZCAodGhlIG1pbWlvX2lycV9vdXQKKwkgKiBjb21wbGV0aW9uIHJvdXRpbmUgd2lsbCBvciBNSU1JT19UWERPTkUgaW4gd2l0aCB0eGZsYWdzKS4KKwkgKi8KKwl0aW1lb3V0ID0gSFo7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwlhZGRfd2FpdF9xdWV1ZSgmbWltaW8tPndhaXRxLCAmd2FpdCk7CisKKwl3aGlsZSAodGltZW91dCAmJiAoKG1pbWlvLT50eGZsYWdzICYgTUlNSU9fVFhET05FKSA9PSAwKSkgeworCQl0aW1lb3V0ID0gc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKKwkJcm1iKCk7CisJfQorCisJaWYgKChtaW1pby0+dHhmbGFncyAmIE1JTUlPX1RYRE9ORSkgPT0gMCkKKwkJZGV2X2RiZygmbWltaW8tPmlkZXYtPmRldiwgInR4IHRpbWVkIG91dC5cbiIpOworCisJLyoKKwkgKiBOb3cgdGhhdCBjb21wbGV0aW9uIGhhcyBiZWVuIHNpZ25hbGxlZCwKKwkgKiB1bmxpbmsgdGhlIHVyYiBzbyB0aGF0IGl0IGNhbiBiZSByZWN5Y2xlZC4KKwkgKi8KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZtaW1pby0+d2FpdHEsICZ3YWl0KTsKKwl1c2JfdW5saW5rX3VyYihtaW1pby0+b3V0LnVyYik7CisKKwlyZXR1cm4gcnNsdDsKK30KKworc3RhdGljIGludCBfX2luaXQgbWltaW9faW5pdCh2b2lkKQoreworCWludCByc2x0OworCisJcnNsdCA9IHVzYl9yZWdpc3RlcigmbWltaW9fZHJpdmVyKTsKKwlpZiAocnNsdCAhPSAwKSB7CisJCWVycigiJXM6IHVzYl9yZWdpc3RlciBmYWlsdXJlOiAlZCIsIF9fZnVuY19fLCByc2x0KTsKKwkJcmV0dXJuIHJzbHQ7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyBLQlVJTERfTU9ETkFNRSAiOiIKKwkgICAgICAgRFJJVkVSX0RFU0MgIiAiIERSSVZFUl9WRVJTSU9OICJcbiIpOworCXJldHVybiByc2x0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbWltaW9fZXhpdCh2b2lkKQoreworCXVzYl9kZXJlZ2lzdGVyKCZtaW1pb19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChtaW1pb19pbml0KTsKK21vZHVsZV9leGl0KG1pbWlvX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9hbXNkdS5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2Ftc2R1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkxMjNkNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9hbXNkdS5jCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImNwcmVjb21wLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmR2V0QW1zZHVTdWJGcmFtZSAgICAgICAgICAqLworLyogICAgICBHZXQgYSBzdWJmcmFtZSBmcm9tIGEtTVNEVS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogQS1NU0RVIGZyYW1lIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG9mZnNldCA6IG9mZnNldCBvZiBzdWJmcmFtZSBpbiB0aGUgQS1NU0RVICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5VTEwgb3Igc3ViZnJhbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjIgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit6YnVmX3QqIHpmR2V0QW1zZHVTdWJGcmFtZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90KiBvZmZzZXQpCit7CisgICAgdTE2X3Qgc3ViZnJhbWVMZW47CisgICAgdTE2X3QgYW1zZHVMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKyAgICB6YnVmX3QqIG5ld0J1ZjsKKworICAgIFpNX1BFUkZPUk1BTkNFX1JYX0FNU0RVKGRldiwgYnVmLCBhbXNkdUxlbik7CisKKyAgICAvKiBWZXJpZnkgQS1NU0RVIGxlbmd0aCAqLworICAgIGlmIChhbXNkdUxlbiA8ICgqb2Zmc2V0ICsgMTQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyogTG9jYXRlIEEtTVNEVSBzdWJmcmFtZSBieSBvZmZzZXQgYW5kIHZlcmlmeSBzdWJmcmFtZSBsZW5ndGggKi8KKyAgICBzdWJmcmFtZUxlbiA9ICh6bXdfYnVmX3JlYWRiKGRldiwgYnVmLCAqb2Zmc2V0ICsgMTIpIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgIHptd19idWZfcmVhZGIoZGV2LCBidWYsICpvZmZzZXQgKyAxMyk7CisgICAgaWYgKHN1YmZyYW1lTGVuID09IDApCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBWZXJpZnkgQS1NU0RVIHN1YmZyYW1lIGxlbmd0aCAqLworICAgIGlmICgoKm9mZnNldCsxNCtzdWJmcmFtZUxlbikgPD0gYW1zZHVMZW4pCisgICAgeworICAgICAgICAvKiBBbGxvY2F0ZSBhIG5ldyBidWZmZXIgKi8KKyAgICAgICAgaWYgKChuZXdCdWYgPSB6ZndCdWZBbGxvY2F0ZShkZXYsIDI0KzIrc3ViZnJhbWVMZW4pKSAhPSBOVUxMKQorICAgICAgICB7CisjaWZkZWYgWk1fRU5BQkxFX05BVElWRV9XSUZJCisgICAgICAgICAgICAvKiBDb3B5IGFuZCBjb252ZXJ0IHN1YmZyYW1lIHRvIHdsYW4gZnJhbWUgZm9ybWF0ICovCisgICAgICAgICAgICAvKiBTSEFMTCBOT1QgSU5DTFVERSBRT1MgYW5kIEFNU0RVIGhlYWRlci4gUmF5IDIwMDcwODA3IEZvciBWaXN0YSAqLworICAgICAgICAgICAgemZSeEJ1ZmZlckNvcHkoZGV2LCBuZXdCdWYsIGJ1ZiwgMCwgMCwgMjQpOworICAgICAgICAgICAgemZSeEJ1ZmZlckNvcHkoZGV2LCBuZXdCdWYsIGJ1ZiwgMjQsICpvZmZzZXQrMTQsIHN1YmZyYW1lTGVuKTsKKyAgICAgICAgICAgIHpmd0J1ZlNldFNpemUoZGV2LCBuZXdCdWYsIDI0K3N1YmZyYW1lTGVuKTsKKyNlbHNlCisgICAgICAgICAgICAvKiBDb3B5IHN1YmZyYW1lIHRvIG5ldyBidWZmZXIgKi8KKyAgICAgICAgICAgIHpmUnhCdWZmZXJDb3B5KGRldiwgbmV3QnVmLCBidWYsIDAsICpvZmZzZXQsIDE0K3N1YmZyYW1lTGVuKTsKKyAgICAgICAgICAgIHpmd0J1ZlNldFNpemUoZGV2LCBuZXdCdWYsIDE0K3N1YmZyYW1lTGVuKTsKKyNlbmRpZgorICAgICAgICAgICAgLyogVXBkYXRlIG9mZnNldCAqLworICAgICAgICAgICAgKm9mZnNldCArPSAoKCgxNCtzdWJmcmFtZUxlbikrMykgJiAweGZmZmMpOworCisgICAgICAgICAgICAvKiBSZXR1cm4gYnVmZmVyIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIHJldHVybiBuZXdCdWY7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmRGVBbXNkdSAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBEZS1BTVNEVS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogQS1NU0RVIGZyYW1lIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHZhcCA6IFZBUCBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjIgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmRGVBbXNkdSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IHZhcCwgdThfdCBlbmNyeU1vZGUpCit7CisgICAgdTE2X3Qgb2Zmc2V0ID0gWk1fU0laRV9PRl9XTEFOX0RBVEFfSEVBREVSK1pNX1NJWkVfT0ZfUU9TX0NUUkw7CisgICAgemJ1Zl90KiBzdWJmcmFtZUJ1ZjsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBaTV9CVUZGRVJfVFJBQ0UoZGV2LCBidWYpCisKKyAgICBpZiAoZW5jcnlNb2RlID09IFpNX0FFUyB8fCBlbmNyeU1vZGUgPT0gWk1fVEtJUCkKKyAgICB7CisgICAgICAgIG9mZnNldCArPSAoWk1fU0laRV9PRl9JViArIFpNX1NJWkVfT0ZfRVhUX0lWKTsKKyAgICB9CisgICAgZWxzZSBpZiAoZW5jcnlNb2RlID09IFpNX1dFUDY0IHx8IGVuY3J5TW9kZSA9PSBaTV9XRVAxMjgpCisgICAgeworICAgICAgICBvZmZzZXQgKz0gWk1fU0laRV9PRl9JVjsKKyAgICB9CisKKyAgICAvKiBSZXBlYXRseSBjYWxsaW5nIHpmR2V0QW1zZHVTdWJGcmFtZSgpIHVudGlsIE5VTEwgcmV0dXJuZWQgKi8KKyAgICB3aGlsZSAoKHN1YmZyYW1lQnVmID0gemZHZXRBbXNkdVN1YkZyYW1lKGRldiwgYnVmLCAmb2Zmc2V0KSkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHdkLT5jb21tVGFsbHkuTm90aWZ5TkRJU1J4RnJtQ250Kys7CisgICAgICAgIGlmICh3ZC0+emZjYlJlY3ZFdGggIT0gTlVMTCkKKyAgICAJeworICAgICAgICAgICAgd2QtPnpmY2JSZWN2RXRoKGRldiwgc3ViZnJhbWVCdWYsICh1OF90KXZhcCk7CisgICAgICAgICAgICBaTV9QRVJGT1JNQU5DRV9SWF9NU0RVKGRldiwgd2QtPnRpY2spOworICAgICAgICB9CisgICAgfQorICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworCisgICAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NhZ2cuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jYWdnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk0MjE5MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jYWdnLmMKQEAgLTAsMCArMSwzNjExIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kdWxlIE5hbWUgOiBjYWdnLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIEEtTVBEVSBhZ2dyZWdhdGlvbiByZWxhdGVkIGZ1bmN0aW9ucy4gICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJjcHJlY29tcC5oIgorCitleHRlcm4gdThfdCB6Y1VwVG9BY1s4XTsKK2NvbnN0IHU4X3QgcHJpW10gPSB7MywzLDIsMywyLDEsMywyLDEsMH07CisKKwordTE2X3QgYWdncl9jb3VudDsKK3UzMl90IHN1Y2Nlc3NfbXBkdTsKK3UzMl90IHRvdGFsX21wZHU7CisKK3ZvaWQgemZBZ2dJbml0KHpkZXZfdCogZGV2KQoreworICAgIHUxNl90IGksajsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisgICAgLyoKKyAgICAgKiByZXNldCBzdGEgaW5mb3JtYXRpb24KKyAgICAgKi8KKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgd2QtPmFnZ0luaXRpYXRlZCA9IDA7CisgICAgd2QtPmFkZGJhQ29tcGxldGUgPSAwOworICAgIHdkLT5hZGRiYUNvdW50ID0gMDsKKyAgICB3ZC0+cmVvcmRlciA9IDE7CisgICAgZm9yIChpPTA7IGk8Wk1fTUFYX1NUQV9TVVBQT1JUOyBpKyspCisgICAgeworICAgICAgICBmb3IgKGo9MDsgajxaTV9BQzsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICAvL3dkLT5hZ2dTdGFbaV0uYWdnUU51bWJlcltqXSA9IFpNX0FHR19QT09MX1NJWkU7CisgICAgICAgICAgICB3ZC0+YWdnU3RhW2ldLmFnZ0ZsYWdbal0gPSB3ZC0+YWdnU3RhW2ldLmNvdW50W2pdID0gMDsKKyAgICAgICAgICAgIHdkLT5hZ2dTdGFbaV0udGlkX3R4W2pdID0gTlVMTDsKKyAgICAgICAgICAgIHdkLT5hZ2dTdGFbaV0udGlkX3R4W2orMV0gPSBOVUxMOworCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIHJlc2V0IFR4L1J4IGFnZ3JlZ2F0aW9uIHF1ZXVlIGluZm9ybWF0aW9uCisgICAgICovCisgICAgd2QtPmFnZ1N0YXRlID0gMDsKKyAgICBmb3IgKGk9MDsgaTxaTV9BR0dfUE9PTF9TSVpFOyBpKyspCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiByZXNldCB0eCBhZ2dyZWdhdGlvbiBxdWV1ZQorICAgICAgICAgKi8KKyAgICAgICAgd2QtPmFnZ1FQb29sW2ldID0gemZ3TWVtQWxsb2NhdGUoZGV2LCBzaXplb2Yoc3RydWN0IGFnZ1F1ZXVlKSk7CisgICAgICAgIGlmKCF3ZC0+YWdnUVBvb2xbaV0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgd2QtPmFnZ1FQb29sW2ldLT5hZ2dIZWFkID0gd2QtPmFnZ1FQb29sW2ldLT5hZ2dUYWlsID0KKyAgICAgICAgd2QtPmFnZ1FQb29sW2ldLT5hZ2dRRW5hYmxlZCA9IHdkLT5hZ2dRUG9vbFtpXS0+YWdnUmVhZHkgPQorICAgICAgICB3ZC0+YWdnUVBvb2xbaV0tPmNsZWFyRmxhZyA9IHdkLT5hZ2dRUG9vbFtpXS0+ZGVsZXRlRmxhZyA9IDA7CisgICAgICAgIC8vd2QtPmFnZ1FQb29sW2ldLT5hZ2dTaXplID0gMTY7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogcmVzZXQgcnggYWdncmVnYXRpb24gcXVldWUKKyAgICAgICAgICovCisgICAgICAgIHdkLT50aWRfcnhbaV0gPSB6ZndNZW1BbGxvY2F0ZShkZXYsIHNpemVvZihzdHJ1Y3QgYWdnX3RpZF9yeCkpOworICAgICAgICBpZiAoIXdkLT50aWRfcnhbaV0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgd2QtPnRpZF9yeFtpXS0+YWlkID0gWk1fTUFYX1NUQV9TVVBQT1JUOworICAgICAgICB3ZC0+dGlkX3J4W2ldLT5zZXFfc3RhcnQgPSB3ZC0+dGlkX3J4W2ldLT5iYXdfaGVhZCA9IFwKKyAgICAgICAgd2QtPnRpZF9yeFtpXS0+YmF3X3RhaWwgPSAwOworICAgICAgICB3ZC0+dGlkX3J4W2ldLT5zcV9leGNlZWRfY291bnQgPSB3ZC0+dGlkX3J4W2ldLT5zcV9iZWhpbmRfY291bnQgPSAwOworICAgICAgICBmb3IgKGo9MDsgajw9Wk1fQUdHX0JBV19TSVpFOyBqKyspCisgICAgICAgICAgICB3ZC0+dGlkX3J4W2ldLT5mcmFtZVtqXS5idWYgPSAwOworICAgICAgICAvKgorICAgICAgICAgKiByZXNldCBBRERCQSBleGNoYW5nZSBzdGF0dXMgY29kZQorICAgICAgICAgKiAwOiBOVUxMCisgICAgICAgICAqIDE6IEFEREJBIFJlcXVlc3Qgc2VudC9yZWNlaXZlZAorICAgICAgICAgKiAyOiBBQ0sgZm9yIEFEREJBIFJlcXVlc3Qgc2VudC9yZWNlaXZlZAorICAgICAgICAgKiAzOiBBRERCQSBSZXNwb25zZSBzZW50L3JlY2VpdmVkCisgICAgICAgICAqIDQ6IEFDSyBmb3IgQUREQkEgUmVzcG9uc2Ugc2VudC9yZWNlaXZlZAorICAgICAgICAgKi8KKyAgICAgICAgd2QtPnRpZF9yeFtpXS0+YWRkQmFFeGNoYW5nZVN0YXR1c0NvZGUgPSAwOworCisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgemZBZ2dUYWxseVJlc2V0KGRldik7CisgICAgREVTVFEuaW5pdCA9IHpmQWdnRGVzdEluaXQ7CisgICAgREVTVFEuaW5pdChkZXYpOworICAgIHdkLT5hZ2dJbml0aWF0ZWQgPSAxOworICAgIGFnZ3JfY291bnQgPSAwOworICAgIHN1Y2Nlc3NfbXBkdSA9IDA7CisgICAgdG90YWxfbXBkdSA9IDA7CisjaWZkZWYgWk1fRU5BQkxFX0FHR1JFR0FUSU9OCisjaWZuZGVmIFpNX0VOQUJMRV9GV19CQV9SRVRSQU5TTUlTU0lPTiAvL2Rpc2FibGUgQkFXCisgICAgQkFXID0gemZ3TWVtQWxsb2NhdGUoZGV2LCBzaXplb2Yoc3RydWN0IGJhd19lbmFibGVyKSk7CisgICAgaWYoIUJBVykKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQkFXLT5pbml0ID0gemZCYXdJbml0OworICAgIEJBVy0+aW5pdChkZXYpOworI2VuZGlmIC8vZGlzYWJsZSBCQVcKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBZ2dHZXRTdGEgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHJldHVybiBTVEEgQUlELiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB0YWtlIGJ1ZiBhcyBpbnB1dCwgdXNlIHRoZSBkZXN0IGFkZHJlc3Mgb2YgYnVmIGFzIGluZGV4IHRvICAgICAgKi8KKy8qICAgICAgc2VhcmNoIFNUQSBBSUQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGJ1ZmZlciBmb3Igb25lIHBhcnRpY3VsYXIgcGFja2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEFJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEhvbmRhICAgICAgICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA2LjExICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworCit1MTZfdCB6ZkFnZ0dldFN0YSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdTE2X3QgaWQ7CisgICAgdTE2X3QgZHN0WzNdOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGRzdFswXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDApOworICAgIGRzdFsxXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDIpOworICAgIGRzdFsyXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDQpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKSB7CisgICAgICAgIGlkID0gemZBcEZpbmRTdGEoZGV2LCBkc3QpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWQgPSAwOworICAgIH0KKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisjaWYgWk1fQUdHX0ZQR0FfREVCVUcKKyAgICBpZCA9IDA7CisjZW5kaWYKKworICAgIHJldHVybiBpZDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBZ2dUeEdldFF1ZXVlICAgICAgICAgICAgICovCisvKiAgICAgIHJldHVybiBRdWV1ZSBQb29sIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB0YWtlIGFpZCBhcyBpbnB1dCwgbG9vayBmb3IgdGhlIHF1ZXVlIGluZGV4IGFzc29jaWF0ZWQgICAgICAgICAgKi8KKy8qICAgICAgd2l0aCB0aGlzIGFpZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGFpZCA6IGFzc29jaWF0ZWQgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFF1ZXVlIG51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEhvbmRhICAgICAgICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA2LjExICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitUSURfVFggemZBZ2dUeEdldFF1ZXVlKHpkZXZfdCogZGV2LCB1MTZfdCBhaWQsIHUxNl90IHRpZCkKK3sKKyAgICAvL3UxNl90ICAgaTsKKyAgICBUSURfVFggIHRpZF90eDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICAvKgorICAgICAqIG5vdCBhIFNUQSBhaWQKKyAgICAgKi8KKyAgICBpZiAoMHhmZmZmID09IGFpZCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvL3ptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICB0aWRfdHggPSB3ZC0+YWdnU3RhW2FpZF0udGlkX3R4W3RpZF07CisgICAgaWYgKCF0aWRfdHgpIHJldHVybiBOVUxMOworICAgIGlmICgwID09IHRpZF90eC0+YWdnUUVuYWJsZWQpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLy96bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuIHRpZF90eDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmQWdnVHhOZXdRdWV1ZSAgICAgICAgICAgICAqLworLyogICAgICByZXR1cm4gUXVldWUgUG9vbCBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdGFrZSBhaWQgYXMgaW5wdXQsIGZpbmQgYSBuZXcgcXVldWUgZm9yIHRoaXMgYWlkLiAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGFpZCA6IGFzc29jaWF0ZWQgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFF1ZXVlIG51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEhvbmRhICAgICAgICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA2LjEyICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitUSURfVFggemZBZ2dUeE5ld1F1ZXVlKHpkZXZfdCogZGV2LCB1MTZfdCBhaWQsIHUxNl90IHRpZCwgemJ1Zl90KiBidWYpCit7CisgICAgdTE2X3QgICBpOworICAgIFRJRF9UWCAgdGlkX3R4PU5VTEw7CisgICAgdTE2X3QgICBhYyA9IHpjVXBUb0FjW3RpZCYweDddICYgMHgzOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICAvKgorICAgICAqIG5vdCBhIFNUQSBhaWQKKyAgICAgKi8KKyAgICBpZiAoMHhmZmZmID09IGFpZCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgLyoKKyAgICAgKiBmaW5kIG9uZSBuZXcgcXVldWUgZm9yIHN0YQorICAgICAqLworICAgIGZvciAoaT0wOyBpPFpNX0FHR19QT09MX1NJWkU7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh3ZC0+YWdnUVBvb2xbaV0tPmFnZ1FFbmFibGVkKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiB0aGlzIHEgaXMgZW5hYmxlZAorICAgICAgICAgICAgICAgICAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGlkX3R4ID0gd2QtPmFnZ1FQb29sW2ldOworICAgICAgICAgICAgdGlkX3R4LT5hZ2dRRW5hYmxlZCA9IDE7CisgICAgICAgICAgICB0aWRfdHgtPmFnZ1FTVEEgPSBhaWQ7CisgICAgICAgICAgICB0aWRfdHgtPmFjID0gYWM7CisgICAgICAgICAgICB0aWRfdHgtPnRpZCA9IHRpZDsKKyAgICAgICAgICAgIHRpZF90eC0+YWdnSGVhZCA9IHRpZF90eC0+YWdnVGFpbCA9IHRpZF90eC0+c2l6ZSA9IDA7CisgICAgICAgICAgICB0aWRfdHgtPmFnZ1JlYWR5ID0gMDsKKyAgICAgICAgICAgIHdkLT5hZ2dTdGFbYWlkXS50aWRfdHhbdGlkXSA9IHRpZF90eDsKKyAgICAgICAgICAgIHRpZF90eC0+ZHN0WzBdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMCk7CisgICAgICAgICAgICB0aWRfdHgtPmRzdFsxXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDIpOworICAgICAgICAgICAgdGlkX3R4LT5kc3RbMl0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCA0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybiB0aWRfdHg7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBZ2dUeEVucXVldWUgICAgICAgICAgICAgICovCisvKiAgICAgIHJldHVybiBTdGF0dXMgY29kZSBaTV9TVUNDRVNTIG9yIGVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB0YWtlIChhaWQsYWMscW51bSxidWYpIGFzIGlucHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWlkIDogYXNzb2NpYXRlZCBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGFjICA6IGFjY2VzcyBjYXRlZ29yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBxbnVtOiB0aGUgcXVldWUgbnVtYmVyIHRvIHdoaWNoIHdpbGwgYmUgZW5xdWV1ZWQgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogdGhlIHBhY2tldCB0byBiZSBxdWV1ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgc3RhdHVzIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgSG9uZGEgICAgICAgICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDYuMTIgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmQWdnVHhFbnF1ZXVlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgYWlkLCBUSURfVFggdGlkX3R4KQoreworICAgIC8vdTE2X3QgICBxbGVuLCBmcmFtZUxlbjsKKyAgICB1MzJfdCAgIHRpbWU7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHRpZF90eC0+c2l6ZSA9IHptX2FnZ19xbGVuKGRldiwgdGlkX3R4LT5hZ2dIZWFkLCB0aWRfdHgtPmFnZ1RhaWwpOworCisgICAgaWYgKHRpZF90eC0+c2l6ZSA8IChaTV9BR0dRX1NJWkUgLSAyKSkKKyAgICB7CisgICAgICAgIC8qIFF1ZXVlIG5vdCBmdWxsICovCisKKworICAgICAgICAvKgorICAgICAgICAgKiBidWZmZXIgY29weQorICAgICAgICAgKiBpbiB6ZndCdWZGcmVlIHdpbGwgcmV0dXJuIGEgbmRpc21zZW5kY29tcGxldGUKKyAgICAgICAgICogdG8gcmVzb2x2ZSB0aGUgc3luY2hyb25pemUgcHJvYmxlbSBpbiBhZ2dyZWdhdGUKKyAgICAgICAgICovCisKKyAgICAgICAgdThfdCAgICBzZW5kQ29tcGxldGUgPSAwOworCisgICAgICAgIHRpZF90eC0+YWdndnR4cVt0aWRfdHgtPmFnZ0hlYWRdLmJ1ZiA9IGJ1ZjsKKyAgICAgICAgdGltZSA9IHptX2FnZ19HZXRUaW1lKCk7CisgICAgICAgIHRpZF90eC0+YWdndnR4cVt0aWRfdHgtPmFnZ0hlYWRdLmFycml2YWxUaW1lID0gdGltZTsKKyAgICAgICAgdGlkX3R4LT5hZ2d2dHhxW3RpZF90eC0+YWdnSGVhZF0uYmF3X3JldHJhbnNtaXQgPSAwOworCisgICAgICAgIHRpZF90eC0+YWdnSGVhZCA9ICgodGlkX3R4LT5hZ2dIZWFkICsgMSkgJiBaTV9BR0dRX1NJWkVfTUFTSyk7CisgICAgICAgIHRpZF90eC0+bGFzdEFycml2YWwgPSB0aW1lOworICAgICAgICB0aWRfdHgtPnNpemUrKzsKKyAgICAgICAgdGlkX3R4LT5zaXplID0gem1fYWdnX3FsZW4oZGV2LCB0aWRfdHgtPmFnZ0hlYWQsIHRpZF90eC0+YWdnVGFpbCk7CisgICAgICAgIGlmIChidWYgJiYgKHRpZF90eC0+c2l6ZSA8IChaTV9BR0dRX1NJWkUgLSAxMCkpKSB7CisgICAgICAgICAgICB0aWRfdHgtPmNvbXBsZXRlID0gdGlkX3R4LT5hZ2dIZWFkOworICAgICAgICAgICAgc2VuZENvbXBsZXRlID0gMTsKKyAgICAgICAgfQorICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIGlmICghREVTVFEuZXhpc3QoZGV2LCAwLCB0aWRfdHgtPmFjLCB0aWRfdHgsIE5VTEwpKSB7CisgICAgICAgICAgICBERVNUUS5pbnNlcnQoZGV2LCAwLCB0aWRfdHgtPmFjLCB0aWRfdHgsIE5VTEwpOworICAgICAgICB9CisKKyAgICAgICAgem1fbXNnMV9hZ2coWk1fTFZfMCwgInRpZF90eC0+c2l6ZT0iLCB0aWRfdHgtPnNpemUpOworICAgICAgICAvL3ptX2RlYnVnX21zZzEoInRpZF90eC0+c2l6ZT0iLCB0aWRfdHgtPnNpemUpOworCisgICAgICAgIGlmIChidWYgJiYgc2VuZENvbXBsZXRlICYmIHdkLT56ZmNiU2VuZENvbXBsZXRlSW5kaWNhdGlvbikgeworICAgICAgICAgICAgLy96bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgd2QtPnpmY2JTZW5kQ29tcGxldGVJbmRpY2F0aW9uKGRldiwgYnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qaWYgKHRpZF90eC0+c2l6ZSA+PSAxNiAmJiB6ZkhwR2V0RnJlZVR4ZENvdW50KGRldikgPiAyMCkKKyAgICAgICAgICAgIHpmQWdnVHhTZW5kKGRldiwgemZIcEdldEZyZWVUeGRDb3VudChkZXYpLCB0aWRfdHgpOworICAgICAgICAqLworICAgICAgICByZXR1cm4gWk1fU1VDQ0VTUzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgem1fbXNnMV9hZ2coWk1fTFZfMCwgImNhbid0IGVucXVldWUsIHRpZF90eC0+c2l6ZT0iLCB0aWRfdHgtPnNpemUpOworICAgICAgICAvKgorICAgICAgICAgKiBRdWV1ZSBGdWxsCisgICAgICAgICAqLworCisgICAgICAgIC8qCisgICAgICAgICAqIHptX21zZzFfYWdnKFpNX0xWXzAsICJRdWV1ZSBmdWxsLCBxbnVtID0gIiwgcW51bSk7CisgICAgICAgICAqIHdkLT5jb21tVGFsbHkudHhRb3NEcm9wQ291bnRbYWNdKys7CisgICAgICAgICAqIHpmd0J1ZkZyZWUoZGV2LCBidWYsIFpNX1NVQ0NFU1MpOworICAgICAgICAgKiB6bV9tc2cxX2FnZyhaTV9MVl8xLCAiUGFja2V0IGRpc2NhcmRlZCwgVlRYUSBmdWxsLCBhYz0iLCBhYyk7CisgICAgICAgICAqCisgICAgICAgICAqIHJldHVybiBaTV9FUlJfRVhDRUVEX1BSSU9SSVRZX1RIUkVTSE9MRDsKKyAgICAgICAgICovCisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICghREVTVFEuZXhpc3QoZGV2LCAwLCB0aWRfdHgtPmFjLCB0aWRfdHgsIE5VTEwpKSB7CisgICAgICAgICAgICBERVNUUS5pbnNlcnQoZGV2LCAwLCB0aWRfdHgtPmFjLCB0aWRfdHgsIE5VTEwpOworICAgIH0KKworICAgIHJldHVybiBaTV9FUlJfRVhDRUVEX1BSSU9SSVRZX1RIUkVTSE9MRDsKK30KKwordTE2X3QgICAgemZBZ2dEZXN0RXhpc3QoemRldl90KiBkZXYsIHUxNl90IFF0eXBlLCB1MTZfdCBhYywgVElEX1RYIHRpZF90eCwgdm9pZCogdnR4cSkgeworICAgIHN0cnVjdCBkZXN0KiBkZXN0OworICAgIHUxNl90ICAgZXhpc3QgPSAwOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIGlmICghREVTVFEuSGVhZFthY10pIHsKKyAgICAgICAgZXhpc3QgPSAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZGVzdCA9IERFU1RRLkhlYWRbYWNdOworICAgICAgICBpZiAoZGVzdC0+dGlkX3R4ID09IHRpZF90eCkgeworICAgICAgICAgICAgZXhpc3QgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgd2hpbGUgKGRlc3QtPm5leHQgIT0gREVTVFEuSGVhZFthY10pIHsKKyAgICAgICAgICAgICAgICBkZXN0ID0gZGVzdC0+bmV4dDsKKyAgICAgICAgICAgICAgICBpZiAoZGVzdC0+dGlkX3R4ID09IHRpZF90eCl7CisgICAgICAgICAgICAgICAgICAgIGV4aXN0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybiBleGlzdDsKK30KKwordm9pZCAgICB6ZkFnZ0Rlc3RJbnNlcnQoemRldl90KiBkZXYsIHUxNl90IFF0eXBlLCB1MTZfdCBhYywgVElEX1RYIHRpZF90eCwgdm9pZCogdnR4cSkKK3sKKyAgICBzdHJ1Y3QgZGVzdCogbmV3X2Rlc3Q7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIG5ld19kZXN0ID0gemZ3TWVtQWxsb2NhdGUoZGV2LCBzaXplb2Yoc3RydWN0IGRlc3QpKTsKKyAgICBpZighbmV3X2Rlc3QpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG5ld19kZXN0LT5RdHlwZSA9IFF0eXBlOworICAgIG5ld19kZXN0LT50aWRfdHggPSB0aWRfdHg7CisgICAgaWYgKDAgPT0gUXR5cGUpCisgICAgICAgIG5ld19kZXN0LT50aWRfdHggPSB0aWRfdHg7CisgICAgZWxzZQorICAgICAgICBuZXdfZGVzdC0+dnR4cSA9IHZ0eHE7CisgICAgaWYgKCFERVNUUS5IZWFkW2FjXSkgeworCisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIG5ld19kZXN0LT5uZXh0ID0gbmV3X2Rlc3Q7CisgICAgICAgIERFU1RRLkhlYWRbYWNdID0gREVTVFEuZGVzdFthY10gPSBuZXdfZGVzdDsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB9CisgICAgZWxzZSB7CisKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgbmV3X2Rlc3QtPm5leHQgPSBERVNUUS5kZXN0W2FjXS0+bmV4dDsKKyAgICAgICAgREVTVFEuZGVzdFthY10tPm5leHQgPSBuZXdfZGVzdDsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB9CisKKworICAgIC8vREVTVFEuc2l6ZVthY10rKzsKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgICAgemZBZ2dEZXN0RGVsZXRlKHpkZXZfdCogZGV2LCB1MTZfdCBRdHlwZSwgVElEX1RYIHRpZF90eCwgdm9pZCogdnR4cSkKK3sKKyAgICBzdHJ1Y3QgZGVzdCogZGVzdCwgKnRlbXA7CisgICAgdTE2X3QgICBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgaWYgKHdkLT5kZXN0TG9jaykgeworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICByZXR1cm47CisgICAgfQorCisKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisgICAgZm9yIChpPTA7IGk8NDsgaSsrKSB7CisgICAgICAgIGlmICghREVTVFEuSGVhZFtpXSkgY29udGludWU7CisgICAgICAgIGRlc3QgPSBERVNUUS5IZWFkW2ldOworICAgICAgICBpZiAoIWRlc3QpIGNvbnRpbnVlOworCisKKyAgICAgICAgd2hpbGUgKGRlc3QgJiYgKGRlc3QtPm5leHQgIT0gREVTVFEuSGVhZFtpXSkpIHsKKyAgICAgICAgICAgIGlmIChRdHlwZSA9PSAwICYmIGRlc3QtPm5leHQtPnRpZF90eCA9PSB0aWRfdHgpeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFF0eXBlID09IDEgJiYgZGVzdC0+bmV4dC0+dnR4cSA9PSB2dHhxKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXN0ID0gZGVzdC0+bmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoUXR5cGUgPT0gMCAmJiBkZXN0LT5uZXh0LT50aWRfdHggPT0gdGlkX3R4KSB8fCAoUXR5cGUgPT0gMSAmJiBkZXN0LT5uZXh0LT52dHhxID09IHZ0eHEpKSB7CisKKyAgICAgICAgICAgIHRpZF90eC0+c2l6ZSA9IHptX2FnZ19xbGVuKGRldiwgdGlkX3R4LT5hZ2dIZWFkLCB0aWRfdHgtPmFnZ1RhaWwpOworICAgICAgICAgICAgaWYgKHRpZF90eC0+c2l6ZSkgeworICAgICAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFERVNUUS5IZWFkW2ldKSB7CisgICAgICAgICAgICAgICAgdGVtcCA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB0ZW1wID0gZGVzdC0+bmV4dDsKKyAgICAgICAgICAgICAgICBpZiAodGVtcCA9PSBkZXN0KSB7CisgICAgICAgICAgICAgICAgICAgIERFU1RRLkhlYWRbaV0gPSBERVNUUS5kZXN0W2ldID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgLy9ERVNUUS5zaXplW2ldID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRlc3QtPm5leHQgPSBkZXN0LT5uZXh0LT5uZXh0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRlbXAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7LyogZG8gbm90aGluZyAqL30gLy96ZndNZW1GcmVlKGRldiwgdGVtcCwgc2l6ZW9mKHN0cnVjdCBkZXN0KSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgemZ3TWVtRnJlZShkZXYsIHRlbXAsIHNpemVvZihzdHJ1Y3QgZGVzdCkpOworCisgICAgICAgICAgICAvKnptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICBpZiAoREVTVFEuc2l6ZVtpXSA+IDApCisgICAgICAgICAgICAgICAgREVTVFEuc2l6ZVtpXS0tOworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICovCisgICAgICAgIH0KKworICAgIH0KKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHJldHVybjsKK30KKwordm9pZCAgICB6ZkFnZ0Rlc3RJbml0KHpkZXZfdCogZGV2KQoreworICAgIHUxNl90IGk7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgZm9yIChpPTA7IGk8NDsgaSsrKSB7CisgICAgICAgIC8vd2QtPmRlc3RRLkhlYWRbaV0ubmV4dCA9IHdkLT5kZXN0US5IZWFkW2ldOworICAgICAgICAvL3dkLT5kZXN0US5kZXN0W2ldID0gd2QtPmRlc3RRLkhlYWRbaV07CisgICAgICAgIC8vREVTVFEuc2l6ZVtpXSA9IDA7CisgICAgICAgIERFU1RRLkhlYWRbaV0gPSBOVUxMOworICAgIH0KKyAgICBERVNUUS5pbnNlcnQgID0gemZBZ2dEZXN0SW5zZXJ0OworICAgIERFU1RRLmRlbGV0ZSAgPSB6ZkFnZ0Rlc3REZWxldGU7CisgICAgREVTVFEuaW5pdCAgICA9IHpmQWdnRGVzdEluaXQ7CisgICAgREVTVFEuZ2V0TmV4dCA9IHpmQWdnRGVzdEdldE5leHQ7CisgICAgREVTVFEuZXhpc3QgICA9IHpmQWdnRGVzdEV4aXN0OworICAgIERFU1RRLnBwcmkgPSAwOworICAgIHJldHVybjsKK30KKworc3RydWN0IGRlc3QqIHpmQWdnRGVzdEdldE5leHQoemRldl90KiBkZXYsIHUxNl90IGFjKQoreworICAgIHN0cnVjdCBkZXN0ICpkZXN0ID0gTlVMTDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZiAoREVTVFEuZGVzdFthY10pIHsKKyAgICAgICAgZGVzdCA9IERFU1RRLmRlc3RbYWNdOworICAgICAgICBERVNUUS5kZXN0W2FjXSA9IERFU1RRLmRlc3RbYWNdLT5uZXh0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZGVzdCA9IE5VTEw7CisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXR1cm4gZGVzdDsKK30KKworI2lmZGVmIFpNX0VOQUJMRV9BR0dSRUdBVElPTgorI2lmbmRlZiBaTV9FTkFCTEVfRldfQkFfUkVUUkFOU01JU1NJT04gLy9kaXNhYmxlIEJBVwordTE2X3QgICB6ZkFnZ1RpZFR4SW5zZXJ0SGVhZCh6ZGV2X3QqIGRldiwgc3RydWN0IGJ1ZkluZm8gKmJ1Zl9pbmZvLFRJRF9UWCB0aWRfdHgpCit7CisgICAgemJ1Zl90KiBidWY7CisgICAgdTMyX3QgdGltZTsKKyAgICBzdHJ1Y3QgYmF3X2hlYWRlciAqYmF3X2hlYWRlcjsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKworICAgIGJ1ZiA9IGJ1Zl9pbmZvLT5idWY7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHRpZF90eC0+c2l6ZSA9IHptX2FnZ19xbGVuKGRldiwgdGlkX3R4LT5hZ2dIZWFkLCB0aWRfdHgtPmFnZ1RhaWwpOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAodGlkX3R4LT5zaXplID49IChaTV9BR0dRX1NJWkUgLSAyKSkgeworICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCBaTV9TVUNDRVNTKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB0aWRfdHgtPmFnZ1RhaWwgPSAodGlkX3R4LT5hZ2dUYWlsID09IDApPyBaTV9BR0dRX1NJWkVfTUFTSzogdGlkX3R4LT5hZ2dUYWlsIC0gMTsKKyAgICB0aWRfdHgtPmFnZ3Z0eHFbdGlkX3R4LT5hZ2dUYWlsXS5idWYgPSBidWY7CisgICAgLy90aW1lID0gem1fYWdnX0dldFRpbWUoKTsKKyAgICB0aWRfdHgtPmFnZ3Z0eHFbdGlkX3R4LT5hZ2dUYWlsXS5hcnJpdmFsVGltZSA9IGJ1Zl9pbmZvLT50aW1lc3RhbXA7CisgICAgdGlkX3R4LT5hZ2d2dHhxW3RpZF90eC0+YWdnVGFpbF0uYmF3X3JldHJhbnNtaXQgPSBidWZfaW5mby0+YmF3X3JldHJhbnNtaXQ7CisKKyAgICBiYXdfaGVhZGVyID0gJnRpZF90eC0+YWdndnR4cVt0aWRfdHgtPmFnZ1RhaWxdLmJhd19oZWFkZXI7CisgICAgYmF3X2hlYWRlci0+aGVhZGVyTGVuICAgPSBidWZfaW5mby0+YmF3X2hlYWRlci0+aGVhZGVyTGVuOworICAgIGJhd19oZWFkZXItPm1pY0xlbiAgICAgID0gYnVmX2luZm8tPmJhd19oZWFkZXItPm1pY0xlbjsKKyAgICBiYXdfaGVhZGVyLT5zbmFwTGVuICAgICA9IGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5zbmFwTGVuOworICAgIGJhd19oZWFkZXItPnJlbW92ZUxlbiAgID0gYnVmX2luZm8tPmJhd19oZWFkZXItPnJlbW92ZUxlbjsKKyAgICBiYXdfaGVhZGVyLT5rZXlJZHggICAgICA9IGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5rZXlJZHg7CisgICAgemZ3TWVtb3J5Q29weSgodThfdCAqKWJhd19oZWFkZXItPmhlYWRlciwgKHU4X3QgKilidWZfaW5mby0+YmF3X2hlYWRlci0+aGVhZGVyLCA1OCk7CisgICAgemZ3TWVtb3J5Q29weSgodThfdCAqKWJhd19oZWFkZXItPm1pYyAgICwgKHU4X3QgKilidWZfaW5mby0+YmF3X2hlYWRlci0+bWljICAgLCA4KTsKKyAgICB6ZndNZW1vcnlDb3B5KCh1OF90ICopYmF3X2hlYWRlci0+c25hcCAgLCAodThfdCAqKWJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5zbmFwICAsIDgpOworCisgICAgdGlkX3R4LT5zaXplKys7CisgICAgdGlkX3R4LT5zaXplID0gem1fYWdnX3FsZW4oZGV2LCB0aWRfdHgtPmFnZ0hlYWQsIHRpZF90eC0+YWdnVGFpbCk7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIC8vdGlkX3R4LT5sYXN0QXJyaXZhbCA9IHRpbWU7CisgICAgaWYgKDEgPT0gdGlkX3R4LT5zaXplKSB7CisgICAgICAgIERFU1RRLmluc2VydChkZXYsIDAsIHRpZF90eC0+YWMsIHRpZF90eCwgTlVMTCk7CisgICAgfQorCisKKyAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAiMHhDMjppbnNlcnRIZWFkLCB0aWRfdHgtPnNpemU9IiwgdGlkX3R4LT5zaXplKTsKKworICAgIHJldHVybiBUUlVFOworfQorI2VuZGlmIC8vZGlzYWJsZSBCQVcKKyNlbmRpZgorCit2b2lkICAgIHpmaVR4Q29tcGxldGUoemRldl90KiBkZXYpCit7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBpZiggKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKSB8fAorICAgICAgICAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgJiYgd2QtPnN0YS5FbmFibGVIVCkgfHwKKyAgICAgICAgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX1BTRVVETykgKSB7CisgICAgICAgIHpmQWdnVHhTY2hlZHVsZXIoZGV2LCAwKTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKK1RJRF9UWCAgemZBZ2dUeFJlYWR5KHpkZXZfdCogZGV2KSB7CisgICAgLy9zdHJ1Y3QgZGVzdCogZGVzdDsKKyAgICB1MTZfdCAgIGk7CisgICAgVElEX1RYICB0aWRfdHggPSBOVUxMOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIGZvciAoaT0wOyBpPFpNX0FHR19QT09MX1NJWkU7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh3ZC0+YWdnUVBvb2xbaV0tPmFnZ1FFbmFibGVkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAod2QtPmFnZ1FQb29sW2ldLT5zaXplID49IDE2KSB7CisgICAgICAgICAgICAgICAgdGlkX3R4ID0gd2QtPmFnZ1FQb29sW2ldOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICB9CisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgcmV0dXJuIHRpZF90eDsKK30KKwordTE2X3QgICB6ZkFnZ1ZhbGlkVGlkVHgoemRldl90KiBkZXYsIFRJRF9UWCB0aWRfdHgpIHsKKyAgICB1MTZfdCAgIGksIHZhbGlkID0gMDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBmb3IgKGk9MDsgaTxaTV9BR0dfUE9PTF9TSVpFOyBpKyspCisgICAgeworICAgICAgICBpZiAod2QtPmFnZ1FQb29sW2ldID09IHRpZF90eCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsaWQgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgIH0KKyAgICB9CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybiB2YWxpZDsKK30KKwordm9pZCAgICB6ZkFnZ1R4U2NoZWR1bGVyKHpkZXZfdCogZGV2LCB1OF90IFNjYW5BbmRDbGVhcikKK3sKKyAgICBUSURfVFggIHRpZF90eCA9IE5VTEw7CisgICAgdm9pZCogICB2dHhxOworICAgIHN0cnVjdCBkZXN0KiBkZXN0OworICAgIHpidWZfdCogIGJ1ZjsKKyAgICB1MzJfdCB0eHFsLCBtaW5fdHhxbDsKKyAgICAvL3UxNl90IGFnZ3Jfc2l6ZSA9IDE7CisgICAgdTE2X3QgdHhxX3RocmVzaG9sZDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgaWYgKCF3ZC0+YWdnSW5pdGlhdGVkKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIGRlYnVnICovCisgICAgdHhxbCA9IFRYUUw7CisgICAgbWluX3R4cWwgPSBBR0dfTUlOX1RYUUw7CisKKyAgICBpZih3ZC0+dHhxX3RocmVzaG9sZCkKKyAgICAgICAgdHhxX3RocmVzaG9sZCA9IHdkLT50eHFfdGhyZXNob2xkOworICAgIGVsc2UKKyAgICAgICAgdHhxX3RocmVzaG9sZCA9IEFHR19NSU5fVFhRTDsKKworICAgIHRpZF90eCA9IHpmQWdnVHhSZWFkeShkZXYpOworICAgIGlmICh0aWRfdHgpIFNjYW5BbmRDbGVhciA9IDA7CisgICAgd2hpbGUgKHpmSHBHZXRGcmVlVHhkQ291bnQoZGV2KSA+IDIwICYmIChUWFFMIDwgdHhxX3RocmVzaG9sZCB8fCB0aWRfdHgpKSB7CisgICAgLy93aGlsZSAoemZIcEdldEZyZWVUeGRDb3VudChkZXYpID4gMjAgJiYgKFNjYW5BbmRDbGVhciB8fCB0aWRfdHgpKSB7CisgICAgLy93aGlsZSAoVFhRTCA8IHR4cV90aHJlc2hvbGQpIHsKKyAgICAgICAgdTE2X3QgaTsKKyAgICAgICAgdThfdCBhYzsKKyAgICAgICAgczhfdCBkZXN0UV9jb3VudCA9IDA7CisgICAgLy93aGlsZSAoKHpmSHBHZXRGcmVlVHhkQ291bnQoZGV2KSkgPiAzMikgeworCisgICAgICAgIC8vRGJnUHJpbnQoInpmQWdnVHhTY2hlZHVsZXI6IGluIHdoaWxlIGxvb3AiKTsKKyAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoREVTVFEuSGVhZFtpXSkgZGVzdFFfY291bnQrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoMCA+PSBkZXN0UV9jb3VudCkgYnJlYWs7CisKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgYWMgPSBwcmlbREVTVFEucHByaV07IERFU1RRLnBwcmkgPSAoREVTVFEucHByaSArIDEpICUgMTA7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgZm9yIChpPTA7IGk8MTA7IGkrKyl7CisgICAgICAgICAgICBpZihERVNUUS5IZWFkW2FjXSkgYnJlYWs7CisKKyAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICBhYyA9IHByaVtERVNUUS5wcHJpXTsgREVTVFEucHByaSA9IChERVNUUS5wcHJpICsgMSkgJSAxMDsKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgPT0gMTApIGJyZWFrOworICAgICAgICAvL0RiZ1ByaW50KCJ6ZkFnZ1R4U2NoZWR1bGVyOiBoYXZlIGRlc3QgUSIpOworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB3ZC0+ZGVzdExvY2sgPSAxOworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIGRlc3QgPSBERVNUUS5nZXROZXh0KGRldiwgYWMpOworICAgICAgICBpZiAoIWRlc3QpIHsKKyAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICB3ZC0+ZGVzdExvY2sgPSAwOworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgRGJnUHJpbnQoImJ1ZyByZXBvcnQhIERFU1RRLmdldE5leHQgZ290IG5vdGhpbmchIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVzdC0+UXR5cGUgPT0gMCkgeworICAgICAgICAgICAgdGlkX3R4ID0gZGVzdC0+dGlkX3R4OworCisgICAgICAgICAgICAvL0RiZ1ByaW50KCJ6ZkFnZ1R4U2NoZWR1bGVyOiBoYXZlIHRpZF90eCBRIik7CisKKyAgICAgICAgICAgIGlmKHRpZF90eCAmJiB6ZkFnZ1ZhbGlkVGlkVHgoZGV2LCB0aWRfdHgpKQorICAgICAgICAgICAgICAgIHRpZF90eC0+c2l6ZSA9IHptX2FnZ19xbGVuKGRldiwgdGlkX3R4LT5hZ2dIZWFkLCB0aWRfdHgtPmFnZ1RhaWwpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICB3ZC0+ZGVzdExvY2sgPSAwOworICAgICAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgICAgICB0aWRfdHggPSB6ZkFnZ1R4UmVhZHkoZGV2KTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHdkLT5kZXN0TG9jayA9IDA7CisgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgLy96bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgaWYgKHRpZF90eCAmJiAhdGlkX3R4LT5zaXplKSB7CisKKyAgICAgICAgICAgICAgICAvL3ptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgLy9ERVNUUS5kZWxldGUoZGV2LCAwLCB0aWRfdHgsIE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZih3ZC0+YWdnU3RhdGUgPT0gMCl7CisgICAgICAgICAgICAgICAgLy93ZC0+YWdnU3RhdGUgPSAxOworICAgICAgICAgICAgICAgIC8vem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICB6ZkFnZ1R4U2VuZChkZXYsIHpmSHBHZXRGcmVlVHhkQ291bnQoZGV2KSwgdGlkX3R4KTsKKyAgICAgICAgICAgICAgICAvL3dkLT5hZ2dTdGF0ZSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvL3ptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB2dHhxID0gZGVzdC0+dnR4cTsKKyAgICAgICAgICAgIGJ1ZiA9IHpmR2V0VnR4cShkZXYsIGFjKTsKKyAgICAgICAgICAgIHptX2Fzc2VydCggYnVmICE9IDAgKTsKKworICAgICAgICAgICAgemZUeFNlbmRFdGgoZGV2LCBidWYsIDAsIFpNX0VYVEVSTkFMX0FMTE9DX0JVRiwgMCk7CisKKyAgICAgICAgfQorICAgICAgICAvKmZsdXNoIGFsbCBidXQgPCAxNiBmcmFtZXMgaW4gdGlkX3R4IHRvIFRYUSovCisgICAgICAgIHRpZF90eCA9IHpmQWdnVHhSZWFkeShkZXYpOworICAgIH0KKworICAgIC8qd2hpbGUgKCh6ZkhwR2V0RnJlZVR4ZENvdW50KGRldikpID4gMzIpIHsKKyAgICAvL3doaWxlICgoemZIcEdldEZyZWVUeGRDb3VudChkZXYpKSA+IDMyKSB7CisKKyAgICAgICAgZGVzdFFfY291bnQgPSAwOworICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspIGRlc3RRX2NvdW50ICs9IHdkLT5kZXN0US5zaXplW2ldOworICAgICAgICBpZiAoMCA+PSBkZXN0UV9jb3VudCkgYnJlYWs7CisKKyAgICAgICAgYWMgPSBwcmlbd2QtPmRlc3RRLnBwcmldOyB3ZC0+ZGVzdFEucHByaSA9ICh3ZC0+ZGVzdFEucHByaSArIDEpICUgMTA7CisgICAgICAgIGZvciAoaT0wOyBpPDEwOyBpKyspeworICAgICAgICAgICAgaWYod2QtPmRlc3RRLnNpemVbYWNdIT0wKSBicmVhazsKKyAgICAgICAgICAgIGFjID0gcHJpW3dkLT5kZXN0US5wcHJpXTsgd2QtPmRlc3RRLnBwcmkgPSAod2QtPmRlc3RRLnBwcmkgKyAxKSAlIDEwOworICAgICAgICB9CisgICAgICAgIGlmIChpID09IDEwKSBicmVhazsKKyAgICAgICAgZGVzdCA9IHdkLT5kZXN0US5nZXROZXh0KGRldiwgYWMpOworICAgICAgICBpZiAoZGVzdC0+UXR5cGUgPT0gMCkgeworICAgICAgICAgICAgdGlkX3R4ID0gZGVzdC0+dGlkX3R4OworICAgICAgICAgICAgdGlkX3R4LT5zaXplID0gem1fYWdnX3FsZW4oZGV2LCB0aWRfdHgtPmFnZ0hlYWQsIHRpZF90eC0+YWdnVGFpbCk7CisgICAgICAgICAgICBpZiAoIXRpZF90eC0+c2l6ZSkgeworICAgICAgICAgICAgICAgIHdkLT5kZXN0US5kZWxldGUoZGV2LCAwLCB0aWRfdHgsIE5VTEwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZigod2QtPmFnZ1N0YXRlID09IDApICYmICh0aWRfdHgtPnNpemUgPj0gMTYpKXsKKyAgICAgICAgICAgICAgICB6ZkFnZ1R4U2VuZChkZXYsIHpmSHBHZXRGcmVlVHhkQ291bnQoZGV2KSwgdGlkX3R4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisgICAgKi8KKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFnZ1R4ICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcmV0dXJuIFN0YXR1cyBjb2RlIFpNX1NVQ0NFU1Mgb3IgZXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG1hbmFnZW1lbnQgQS1NUERVIGFnZ3JlZ2F0aW9uIGZ1bmN0aW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBtYW5hZ2VtZW50IGFnZ3JlZ2F0aW9uIHF1ZXVlLCBjYWxjdWxhdGUgYXJyaXZhbHJhdGUsICAgICAgICAgICAgKi8KKy8qICAgICAgYWRkL2RlbGV0ZSBhbiBhZ2dyZWdhdGlvbiBxdWV1ZSBvZiBhIHN0cmVhbSwgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGVucXVldWUgcGFja2V0cyBpbnRvIHJlc3BvbnNpYmxlIGFnZ3JlZ2F0ZSBxdWV1ZS4gICAgICAgICAgICAgICAqLworLyogICAgICB0YWtlIChkZXYsIGJ1ZiwgYWMpIGFzIGlucHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogcGFja2V0IGJ1ZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGFjICA6IGFjY2VzcyBjYXRlZ29yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHN0YXR1cyBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEhvbmRhICAgICAgICAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA2LjEyICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZkFnZ1R4KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgdGlkKQoreworICAgIHUxNl90IGFpZDsKKyAgICAvL3UxNl90IHFudW07CisgICAgLy91MTZfdCBhZ2dmbGFnID0gMDsKKyAgICAvL3UxNl90IGFycml2YWxyYXRlID0gMDsKKyAgICBUSURfVFggdGlkX3R4OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmKCF3ZC0+YWdnSW5pdGlhdGVkKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFpNX0VSUl9UWF9CVUZGRVJfVU5BVkFJTEFCTEU7CisgICAgfQorCisgICAgYWlkID0gemZBZ2dHZXRTdGEoZGV2LCBidWYpOworCisgICAgLy9hcnJpdmFscmF0ZSA9IHpmQWdnVHhBcnJpdmFsUmF0ZShkZXYsIGFpZCwgdGlkKTsKKworICAgIGlmICgweGZmZmYgPT0gYWlkKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogU1RBIG5vdCBhc3NvY2lhdGVkLCB0aGlzIGlzIGEgQkMvTUMgb3IgU1RBLT5BUCBwYWNrZXQKKyAgICAgICAgICovCisKKyAgICAgICAgcmV0dXJuIFpNX0VSUl9UWF9CVUZGRVJfVU5BVkFJTEFCTEU7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTVEEgYXNzb2NpYXRlZCwgYSB1bmljYXN0IHBhY2tldAorICAgICAqLworCisgICAgdGlkX3R4ID0gemZBZ2dUeEdldFF1ZXVlKGRldiwgYWlkLCB0aWQpOworCisgICAgLyp0aWRfcS50aWRfdHggPSB0aWRfdHg7CisgICAgd2QtPmRlc3RRLmluc2VydCA9IHpmQWdnRGVzdEluc2VydDsKKyAgICB3ZC0+ZGVzdFEuaW5zZXJ0KGRldiwgMCwgdGlkX3EpOworICAgICovCisgICAgaWYgKHRpZF90eCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogdGhpcyAoYWlkLCBhYykgaXMgYWdncmVnYXRlZAorICAgICAgICAgKi8KKworICAgICAgICAvL2lmIChhcnJpdmFscmF0ZSA8IFpNX0FHR19MT1dfVEhSRVNIT0xEKQorICAgICAgICBpZiAoMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIGFycml2YWwgcmF0ZSB0b28gbG93CisgICAgICAgICAgICAgKiBkZWxldGUgdGhpcyBhZ2dyZWdhdGUgcXVldWUKKyAgICAgICAgICAgICAqLworCisgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgICAgICAvL3dkLT5hZ2dRUG9vbFtxbnVtXS0+Y2xlYXJGbGFnID0gd2QtPmFnZ1FQb29sW3FudW1dLT5kZWxldGVGbGFnID0xOworCisgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gemZBZ2dUeEVucXVldWUoZGV2LCBidWYsIGFpZCwgdGlkX3R4KTsKKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiB0aGlzIChhaWQsIGFjKSBub3QgeWV0IGFnZ3JlZ2F0ZWQKKyAgICAgICAgICogcXVldWUgbm90IGZvdW5kCisgICAgICAgICAqLworCisgICAgICAgIC8vaWYgKGFycml2YWxyYXRlID4gWk1fQUdHX0hJR0hfVEhSRVNIT0xEKQorICAgICAgICBpZiAoMSkKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIGFycml2YWxyYXRlIGhpZ2ggZW5vdWdoIHRvIGdldCBhIG5ldyBhZ2cgcXVldWUKKyAgICAgICAgICAgICAqLworCisgICAgICAgICAgICB0aWRfdHggPSB6ZkFnZ1R4TmV3UXVldWUoZGV2LCBhaWQsIHRpZCwgYnVmKTsKKworICAgICAgICAgICAgLy96bV9tc2cxX2FnZyhaTV9MVl8wLCAiZ2V0IG5ldyBBZ2dRdWV1ZSBxbnVtID0gIiwgdGlkX3R4LT4pOworCisgICAgICAgICAgICBpZiAodGlkX3R4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogZ290IGEgbmV3IGFnZ3JlZ2F0ZSBxdWV1ZQorICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgLy96bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgICAgICAgICAgLy93ZC0+YWdnU3RhW2FpZF0uYWdnRmxhZ1thY10gPSAxOworCisgICAgICAgICAgICAgICAgLy96bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBhZGQgQUREQkEgZnVuY3Rpb25zIGhlcmUKKyAgICAgICAgICAgICAgICAgKiByZXR1cm4gWk1fRVJSX1RYX0JVRkZFUl9VTkFWQUlMQUJMRTsKKyAgICAgICAgICAgICAgICAgKi8KKworCisgICAgICAgICAgICAgICAgLy96ZkFnZ1NlbmRBZGRiYVJlcXVlc3QoZGV2LCB0aWRfdHgtPmRzdCwgdGlkX3R4LT5hYywgdGlkX3R4LT50aWQpOworICAgICAgICAgICAgICAgIC8vem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgICAgIC8vd2QtPmFnZ1N0YVthaWRdLmFnZ0ZsYWdbYWNdID0gMDsKKworICAgICAgICAgICAgICAgIC8vem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgICAgIHJldHVybiB6ZkFnZ1R4RW5xdWV1ZShkZXYsIGJ1ZiwgYWlkLCB0aWRfdHgpOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBqdXN0IGNhbid0IGdldCBhIG5ldyBhZ2dyZWdhdGUgcXVldWUKKyAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgIHJldHVybiBaTV9FUlJfVFhfQlVGRkVSX1VOQVZBSUxBQkxFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIGFycml2YWwgcmF0ZSBpcyBub3QgaGlnaCBlbm91Z2ggdG8gZ2V0IGEgbmV3IGFnZyBxdWV1ZQorICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIHJldHVybiBaTV9FUlJfVFhfQlVGRkVSX1VOQVZBSUxBQkxFOworICAgICAgICB9CisgICAgfQorCisKKworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFnZ1R4UmVhZHlDb3VudCAgICAgICAgICAgKi8KKy8qICAgICAgcmV0dXJuIGNvdW50ZXIgb2YgcmVhZHkgdG8gYWdncmVnYXRlIHF1ZXVlcy4gICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHRha2UgKGRldiwgYWMpIGFzIGlucHV0LCBvbmx5IGNhbGN1bGF0ZSB0aGUgcmVhZHkgdG8gYWdncmVnYXRlICAqLworLyogICAgICBxdWV1ZXMgb2Ygb25lIHBhcnRpY3VsYXIgYWMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWMgIDogYWNjZXNzIGNhdGVnb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgY291bnRlciBvZiByZWFkeSB0byBhZ2dyZWdhdGUgcXVldWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgSG9uZGEgICAgICAgICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDYuMTIgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmQWdnVHhSZWFkeUNvdW50KHpkZXZfdCogZGV2LCB1MTZfdCBhYykKK3sKKyAgICB1MTZfdCBpOworICAgIHUxNl90IHJlYWR5Y291bnQgPSAwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBmb3IgKGk9MCA7IGk8Wk1fQUdHX1BPT0xfU0laRTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHdkLT5hZ2dRUG9vbFtpXS0+YWdnUUVuYWJsZWQgJiYgKHdkLT5hZ2dRUG9vbFtpXS0+YWdnUmVhZHkgfHwgXAorICAgICAgICAgICAgICAgIHdkLT5hZ2dRUG9vbFtpXS0+Y2xlYXJGbGFnKSAmJiBhYyA9PSB3ZC0+YWdnUVBvb2xbaV0tPmFjKQorICAgICAgICAgICAgcmVhZHljb3VudCsrOworICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXR1cm4gcmVhZHljb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmQWdnVHhQYXJ0aWFsICAgICAgICAgICAgICAqLworLyogICAgICByZXR1cm4gdGhlIG51bWJlciB0aGF0IFZ0eHEgaGFzIHRvIHNlbmQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdGFrZSAoZGV2LCBhYywgcmVhZHljb3VudCkgYXMgaW5wdXQsIGNhbGN1bGF0ZSB0aGUgcmF0aW8gb2YgICAgICovCisvKiAgICAgIFZ0eHEgbGVuZ3RoIHRvIChWdHhxIGxlbmd0aCArIHJlYWR5Y291bnQpIG9mIGEgcGFydGljdWxhciBhYywgICAqLworLyogICAgICBhbmQgcmV0dXJucyB0aGUgVnR4cSBsZW5ndGggKiB0aGUgcmF0aW8gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWMgIDogYWNjZXNzIGNhdGVnb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHJlYWR5Y291bnQ6IHRoZSBudW1iZXIgb2YgcmVhZHkgdG8gYWdncmVnYXRlIHF1ZXVlcyBvZiB0aGlzIGFjICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFZ0eHEgbGVuZ3RoICogcmF0aW8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEhvbmRhICAgICAgICAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA2LjEyICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZkFnZ1R4UGFydGlhbCh6ZGV2X3QqIGRldiwgdTE2X3QgYWMsIHUxNl90IHJlYWR5Y291bnQpCit7CisgICAgdTE2X3QgcWxlbjsKKyAgICB1MTZfdCBwYXJ0aWFsOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBxbGVuID0gem1fYWdnX3FsZW4oZGV2LCB3ZC0+dnR4cUhlYWRbYWNdLCB3ZC0+dnR4cVRhaWxbYWNdKTsKKworICAgIGlmICgocWxlbiArIHJlYWR5Y291bnQpID4gMCkKKyAgICB7CisgICAgICAgIHBhcnRpYWwgPSAodTE2X3QpKCB6bV9hZ2dfd2VpZ2h0KGFjKSAqICgodTE2X3QpcWxlbi8ocWxlbiArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWR5Y291bnQpKSApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwYXJ0aWFsID0gMDsKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKHBhcnRpYWwgPiBxbGVuKQorICAgICAgICBwYXJ0aWFsID0gcWxlbjsKKworICAgIHJldHVybiBwYXJ0aWFsOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFnZ1R4U2VuZCAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcmV0dXJuIHNlbnRjb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHRha2UgKGRldiwgYWMsIG4pIGFzIGlucHV0LCBuIGlzIHRoZSBudW1iZXIgb2Ygc2NoZWR1bGVkIGFnZyAgICAqLworLyogICAgICBxdWV1ZXMgdG8gYmUgc2VudCBvZiB0aGUgcGFydGljdWxhciBhYy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWMgIDogYWNjZXNzIGNhdGVnb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG4gICA6IHRoZSBudW1iZXIgb2Ygc2NoZWR1bGVkIGFnZ3JlZ2F0aW9uIHF1ZXVlcyB0byBiZSBzZW50ICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHNlbnRjb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEhvbmRhICAgICAgICAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA2LjEyICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZkFnZ1R4U2VuZCh6ZGV2X3QqIGRldiwgdTMyX3QgZnJlZVR4ZCwgVElEX1RYIHRpZF90eCkKK3sKKyAgICAvL3UxNl90ICAgcW51bTsKKyAgICAvL3UxNl90ICAgcWxlbjsKKyAgICB1MTZfdCAgIGo7CisgICAgLy91MTZfdCAgIHNlbnRjb3VudCA9IDA7CisgICAgemJ1Zl90KiBidWY7CisgICAgc3RydWN0ICBhZ2dDb250cm9sIGFnZ0NvbnRyb2w7CisgICAgdTE2X3QgICBhZ2dMZW47CisgICAgLy96YnVmX3QqICBuZXdCdWY7CisgICAgLy91MTZfdCAgIGJ1ZkxlbjsKKyAgICAvL1RJRF9CQVcgdGlkX2JhdyA9IE5VTEw7CisgICAgLy9zdHJ1Y3QgYnVmSW5mbyAqYnVmX2luZm87CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgLy93aGlsZSAodGlkX3R4LT5zaXplID4gMCkKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgdGlkX3R4LT5zaXplID0gem1fYWdnX3FsZW4oZGV2LCB0aWRfdHgtPmFnZ0hlYWQsIHRpZF90eC0+YWdnVGFpbCk7CisgICAgYWdnTGVuID0gem1fYWdnX21pbigxNiwgem1fYWdnX21pbih0aWRfdHgtPnNpemUsICh1MTZfdCkoZnJlZVR4ZCAtIDIpKSk7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIHdoeSB0aGVyZSBoYXZlIHRvIGJlIDIgZnJlZSBUeGQ/CisgICAgICAgICAgICAgKi8KKyAgICBpZiAoYWdnTGVuIDw9MCApCisgICAgICAgIHJldHVybiAwOworCisKKyAgICBpZiAoYWdnTGVuID09IDEpIHsKKyAgICAgICAgYnVmID0gemZBZ2dUeEdldFZ0eHEoZGV2LCB0aWRfdHgpOworICAgICAgICBpZiAoYnVmKQorICAgICAgICAgICAgemZUeFNlbmRFdGgoZGV2LCBidWYsIDAsIFpNX0VYVEVSTkFMX0FMTE9DX0JVRiwgMCk7CisgICAgICAgIGlmICh0aWRfdHgtPnNpemUgPT0gMCkgeworICAgICAgICAgICAgLy9ERVNUUS5kZWxldGUoZGV2LCAwLCB0aWRfdHgsIE5VTEwpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogRnJlZSBUeGQgcXVldWUgaXMgYmlnIGVub3VnaCB0byBwdXQgYWdncmVnYXRpb24KKyAgICAgICAgICAgICAgICAgKi8KKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIGlmICh3ZC0+YWdnU3RhdGUgPT0gMSkgeworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgd2QtPmFnZ1N0YXRlID0gMTsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisKKyAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAiYWdnTGVuPSIsIGFnZ0xlbik7CisgICAgdGlkX3R4LT5hZ2dGcmFtZVNpemUgPSAwOworICAgIGZvciAoaj0wOyBqIDwgYWdnTGVuOyBqKyspIHsKKyAgICAgICAgYnVmID0gemZBZ2dUeEdldFZ0eHEoZGV2LCB0aWRfdHgpOworCisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHRpZF90eC0+c2l6ZSA9IHptX2FnZ19xbGVuKGRldiwgdGlkX3R4LT5hZ2dIZWFkLCB0aWRfdHgtPmFnZ1RhaWwpOworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIGlmICggYnVmICkgeworICAgICAgICAgICAgLy9zdHJ1Y3QgYWdnVGFsbHkgKmFnZ190YWw7CisgICAgICAgICAgICB1MTZfdCBjb21wbGV0ZUluZGV4OworCisgICAgICAgICAgICBpZiAoMCA9PSBqKSB7CisgICAgICAgICAgICAgICAgYWdnQ29udHJvbC5hbXBkdUluZGljYXRpb24gPSBaTV9BR0dfRklSU1RfTVBEVTsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoKGogPT0gKGFnZ0xlbiAtIDEpKSB8fCB0aWRfdHgtPnNpemUgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhZ2dDb250cm9sLmFtcGR1SW5kaWNhdGlvbiA9IFpNX0FHR19MQVNUX01QRFU7CisgICAgICAgICAgICAgICAgLy93ZC0+YWdnU3RhdGUgPSAwOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWdnQ29udHJvbC5hbXBkdUluZGljYXRpb24gPSBaTV9BR0dfTUlERExFX01QRFU7CisgICAgICAgICAgICAgICAgLyogdGhlIHBhY2tldCBpcyBkZWxheWVkIG1vcmUgdGhhbiA1MDAgbXMsIGRyb3AgaXQgKi8KKworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGlkX3R4LT5hZ2dGcmFtZVNpemUgKz0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CisgICAgICAgICAgICBhZ2dDb250cm9sLmFkZGJhSW5kaWNhdGlvbiA9IDA7CisgICAgICAgICAgICBhZ2dDb250cm9sLmFnZ0VuYWJsZWQgPSAxOworCisjaWZkZWYgWk1fQUdHX1RBTExZCisgICAgICAgICAgICBhZ2dfdGFsID0gJndkLT5hZ2dfdGFsOworICAgICAgICAgICAgYWdnX3RhbC0+c2VudF9wYWNrZXRzX3N1bSsrOworCisjZW5kaWYKKworICAgICAgICAgICAgemZBZ2dUeFNlbmRFdGgoZGV2LCBidWYsIDAsIFpNX0VYVEVSTkFMX0FMTE9DX0JVRiwgMCwgJmFnZ0NvbnRyb2wsIHRpZF90eCk7CisKKyAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICBjb21wbGV0ZUluZGV4ID0gdGlkX3R4LT5jb21wbGV0ZTsKKyAgICAgICAgICAgIGlmKHptX2FnZ19pblEodGlkX3R4LCB0aWRfdHgtPmNvbXBsZXRlKSkKKyAgICAgICAgICAgICAgICB6bV9hZ2dfcGx1cyh0aWRfdHgtPmNvbXBsZXRlKTsKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgIGlmKHptX2FnZ19pblEodGlkX3R4LCBjb21wbGV0ZUluZGV4KSAmJiB3ZC0+emZjYlNlbmRDb21wbGV0ZUluZGljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgJiYgdGlkX3R4LT5hZ2d2dHhxW2NvbXBsZXRlSW5kZXhdLmJ1ZikgeworICAgICAgICAgICAgICAgIHdkLT56ZmNiU2VuZENvbXBsZXRlSW5kaWNhdGlvbihkZXYsIHRpZF90eC0+YWdndnR4cVtjb21wbGV0ZUluZGV4XS5idWYpOworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoImluIHF1ZXVlIGNvbXBsZXRlIHdvcmtlZCEiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIHRoaXMgYWdncmVnYXRpb24gcXVldWUgaXMgZW1wdHkKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgem1fbXNnMV9hZ2coWk1fTFZfMCwgImFnZ0xlbiBub3QgcmVhY2hlZCwgYnV0IG5vIG1vcmUgZnJhbWUsIGo9Iiwgaik7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgd2QtPmFnZ1N0YXRlID0gMDsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgLy96bV9hY3F1aXJlX2FnZ19zcGluX2xvY2soQWRhcHRlcik7CisgICAgdGlkX3R4LT5zaXplID0gem1fYWdnX3FsZW4oZGV2LCB0aWRfdHgtPmFnZ0hlYWQsIHRpZF90eC0+YWdnVGFpbCk7CisgICAgLy96bV9yZWxlYXNlX2FnZ19zcGluX2xvY2soQWRhcHRlcik7CisKKyAgICBpZiAodGlkX3R4LT5zaXplID09IDApIHsKKyAgICAgICAgLy9ERVNUUS5kZWxldGUoZGV2LCAwLCB0aWRfdHgsIE5VTEwpOworICAgIH0KKworCisKKyAgICAvL3pmQWdnSW52b2tlQmFyKGRldiwgdGlkX3R4KTsKKyAgICBpZihqPjApIHsKKyAgICAgICAgYWdncl9jb3VudCsrOworICAgICAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAiMHhDMjpzZW50IDEgYWdnciwgYWdncl9jb3VudD0iLCBhZ2dyX2NvdW50KTsKKyAgICAgICAgem1fbXNnMV9hZ2coWk1fTFZfMCwgIjB4QzI6c2VudCAxIGFnZ3IsIGFnZ3Jfc2l6ZT0iLCBqKTsKKyAgICB9CisgICAgcmV0dXJuIGo7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmQWdnVHhHZXRSZWFkeVF1ZXVlICAgICAgICAqLworLyogICAgICByZXR1cm4gdGhlIG51bWJlciBvZiB0aGUgYWdncmVnYXRpb24gcXVldWUgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdGFrZSAoZGV2LCBhYykgYXMgaW5wdXQsIGZpbmQgdGhlIGFnZyBxdWV1ZSB3aXRoIHNtYWxsZXN0ICAgICAgICovCisvKiAgICAgIGFycml2YWwgdGltZSAod2FpdGVkIGxvbmdlc3QpIGFtb25nIHRob3NlIHJlYWR5IG9yIGNsZWFyRmxhZyAgICAqLworLyogICAgICBzZXQgcXVldWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWMgIDogYWNjZXNzIGNhdGVnb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWdncmVnYXRpb24gcXVldWUgbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgSG9uZGEgICAgICAgICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDYuMTIgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1RJRF9UWCB6ZkFnZ1R4R2V0UmVhZHlRdWV1ZSh6ZGV2X3QqIGRldiwgdTE2X3QgYWMpCit7CisgICAgLy91MTZfdCAgICAgICBxbnVtID0gWk1fQUdHX1BPT0xfU0laRTsKKyAgICB1MTZfdCAgICAgICBpOworICAgIHUzMl90ICAgICAgIHRpbWUgPSAwOworICAgIFRJRF9UWCAgICAgIHRpZF90eCA9IE5VTEw7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGZvciAoaT0wIDtpPFpNX0FHR19QT09MX1NJWkU7IGkrKykKKyAgICB7CisgICAgICAgIGlmICgxID09IHdkLT5hZ2dRUG9vbFtpXS0+YWdnUUVuYWJsZWQgJiYgYWMgPT0gd2QtPmFnZ1FQb29sW2ldLT5hYyAmJgorICAgICAgICAgICAgICAgICh3ZC0+YWdnUVBvb2xbaV0tPnNpemUgPiAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKDAgPT0gdGltZSB8fCB0aW1lID4gd2QtPmFnZ1FQb29sW2ldLT5hZ2d2dHhxWyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmFnZ1FQb29sW2ldLT5hZ2dIZWFkIF0uYXJyaXZhbFRpbWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGlkX3R4ID0gd2QtPmFnZ1FQb29sW2ldOworICAgICAgICAgICAgICAgIHRpbWUgPSB0aWRfdHgtPmFnZ3Z0eHFbIHRpZF90eC0+YWdnSGVhZCBdLmFycml2YWxUaW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybiB0aWRfdHg7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBZ2dUeEdldFZ0eHEgICAgICAgICAgICAgICovCisvKiAgICAgIHJldHVybiBhbiBNU0RVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB0YWtlIChkZXYsIHFudW0pIGFzIGlucHV0LCByZXR1cm4gYW4gTVNEVSBvdXQgb2YgdGhlIGFnZyBxdWV1ZS4gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcW51bTogcXVldWUgbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYSBNU0RVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgSG9uZGEgICAgICAgICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDYuMTIgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3pidWZfdCogemZBZ2dUeEdldFZ0eHEoemRldl90KiBkZXYsIFRJRF9UWCB0aWRfdHgpCit7CisgICAgemJ1Zl90KiBidWYgPSBOVUxMOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmICh0aWRfdHgtPmFnZ0hlYWQgIT0gdGlkX3R4LT5hZ2dUYWlsKQorICAgIHsKKyAgICAgICAgYnVmID0gdGlkX3R4LT5hZ2d2dHhxWyB0aWRfdHgtPmFnZ1RhaWwgXS5idWY7CisKKyAgICAgICAgdGlkX3R4LT5hZ2d2dHhxW3RpZF90eC0+YWdnVGFpbF0uYnVmID0gTlVMTDsKKworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB0aWRfdHgtPmFnZ1RhaWwgPSAoKHRpZF90eC0+YWdnVGFpbCArIDEpICYgWk1fQUdHUV9TSVpFX01BU0spOworICAgICAgICBpZih0aWRfdHgtPnNpemUgPiAwKSB0aWRfdHgtPnNpemUtLTsKKyAgICAgICAgdGlkX3R4LT5zaXplID0gem1fYWdnX3FsZW4oZGV2LCB0aWRfdHgtPmFnZ0hlYWQsIHRpZF90eC0+YWdnVGFpbCk7CisgICAgICAgIGlmIChOVUxMID09IGJ1ZikgeworICAgICAgICAgICAgLy90aWRfdHgtPmFnZ1RhaWwgPSB0aWRfdHgtPmFnZ0hlYWQgPSB0aWRfdHgtPnNpemUgPSAwOworICAgICAgICAgICAgLy96bV9tc2cxX2FnZyhaTV9MVl8wLCAiR2V0VnR4cSBidWYgPT0gTlVMTCwgdGlkX3R4LT5zaXplPSIsIHRpZF90eC0+c2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogcXVldWUgaXMgZW1wdHkKKyAgICAgICAgICovCisgICAgICAgIHptX21zZzFfYWdnKFpNX0xWXzAsICJ0aWRfdHgtPmFnZ0hlYWQgPT0gdGlkX3R4LT5hZ2dUYWlsLCB0aWRfdHgtPnNpemU9IiwgdGlkX3R4LT5zaXplKTsKKworICAgIH0KKworICAgIGlmICh6bV9hZ2dfcWxlbihkZXYsIHRpZF90eC0+YWdnSGVhZCwgdGlkX3R4LT5hZ2dUYWlsKSAhPSB0aWRfdHgtPnNpemUpCisgICAgICAgIHptX21zZzFfYWdnKFpNX0xWXzAsICJxbGVuIT10aWRfdHgtPnNpemUhIHRpZF90eC0+c2l6ZT0iLCB0aWRfdHgtPnNpemUpOworICAgIHJldHVybiBidWY7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmQWdnVHhEZWxldGVRdWV1ZSAgICAgICAgICAqLworLyogICAgICByZXR1cm4gWk1fU1VDQ0VTUyAoY2FuJ3QgZmFpbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdGFrZSAoZGV2LCBxbnVtKSBhcyBpbnB1dCwgcmVzZXQgKGRlbGV0ZSkgdGhpcyBhZ2dyZWdhdGUgcXVldWUsICovCisvKiAgICAgIHRoaXMgcXVldWUgaXMgdmlydHVhbGx5IHJldHVybmVkIHRvIHRoZSBhZ2dyZWdhdGUgcXVldWUgcG9vbC4gICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBxbnVtOiBxdWV1ZSBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBaTV9TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBIb25kYSAgICAgICAgICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNi4xMiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZBZ2dUeERlbGV0ZVF1ZXVlKHpkZXZfdCogZGV2LCB1MTZfdCBxbnVtKQoreworICAgIHUxNl90IGFjLCB0aWQ7CisgICAgc3RydWN0IGFnZ1F1ZXVlICp0eF90aWQ7CisgICAgc3RydWN0IGFnZ1N0YSAgICphZ2dfc3RhOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHR4X3RpZCA9IHdkLT5hZ2dRUG9vbFtxbnVtXTsKKyAgICBhZ2dfc3RhID0gJndkLT5hZ2dTdGFbdHhfdGlkLT5hZ2dRU1RBXTsKKyAgICBhYyA9IHR4X3RpZC0+YWM7CisgICAgdGlkID0gdHhfdGlkLT50aWQ7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgdHhfdGlkLT5hZ2dRRW5hYmxlZCA9IDA7CisgICAgdHhfdGlkLT5hZ2dIZWFkID0gdHhfdGlkLT5hZ2dUYWlsID0gMDsKKyAgICB0eF90aWQtPmFnZ1JlYWR5ID0gMDsKKyAgICB0eF90aWQtPmNsZWFyRmxhZyA9IHR4X3RpZC0+ZGVsZXRlRmxhZyA9IDA7CisgICAgdHhfdGlkLT5zaXplID0gMDsKKyAgICBhZ2dfc3RhLT5jb3VudFthY10gPSAwOworCisgICAgYWdnX3N0YS0+dGlkX3R4W3RpZF0gPSBOVUxMOworICAgIGFnZ19zdGEtPmFnZ0ZsYWdbYWNdID0gMDsKKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAicXVldWUgZGVsZXRlZCEgcW51bT0iLCBxbnVtKTsKKworICAgIHJldHVybiBaTV9TVUNDRVNTOworfQorCisjaWZkZWYgWk1fRU5BQkxFX0FHR1JFR0FUSU9OCisjaWZuZGVmIFpNX0VOQUJMRV9GV19CQV9SRVRSQU5TTUlTU0lPTiAvL2Rpc2FibGUgQkFXCit2b2lkIHpmQmF3Q29yZSh6ZGV2X3QqIGRldiwgdTE2X3QgYmF3X3NlcSwgdTMyX3QgYml0bWFwLCB1MTZfdCBhZ2dMZW4pIHsKKyAgICBUSURfQkFXIHRpZF9iYXc7CisgICAgczE2X3QgaTsKKyAgICB6YnVmX3QqIGJ1ZjsKKyAgICBzdHJ1Y3QgYnVmSW5mbyAqYnVmX2luZm87CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworICAgIHRpZF9iYXcgPSBCQVctPmdldFEoZGV2LCBiYXdfc2VxKTsKKyAgICAvL3RpZF9iYXcgPSBOVUxMOworICAgIGlmIChOVUxMID09IHRpZF9iYXcpCisgICAgICAgIHJldHVybjsKKworICAgIHRvdGFsX21wZHUgKz0gYWdnTGVuOworICAgIGZvciAoaSA9IGFnZ0xlbiAtIDE7IGk+PTA7IGktLSkgeworICAgICAgICBpZiAoKChiaXRtYXAgPj4gaSkgJiAweDEpID09IDApIHsKKyAgICAgICAgICAgIGJ1Zl9pbmZvID0gQkFXLT5wb3AoZGV2LCBpLCB0aWRfYmF3KTsKKyAgICAgICAgICAgIGJ1ZiA9IGJ1Zl9pbmZvLT5idWY7CisgICAgICAgICAgICBpZiAoYnVmKSB7CisgICAgICAgICAgICAgICAgLy93ZC0+emZjYlNldEJhd1EoZGV2LCBidWYsIDApOworICAgICAgICAgICAgICAgIHpmQWdnVGlkVHhJbnNlcnRIZWFkKGRldiwgYnVmX2luZm8sIHRpZF9iYXctPnRpZF90eCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzdWNjZXNzX21wZHUrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBCQVctPmRpc2FibGUoZGV2LCB0aWRfYmF3KTsKKyAgICB6ZkFnZ1R4U2NoZWR1bGVyKGRldik7CisgICAgem1fZGVidWdfbXNnMSgic3VjY2Vzc19tcGR1ID0gIiwgc3VjY2Vzc19tcGR1KTsKKyAgICB6bV9kZWJ1Z19tc2cxKCIgIHRvdGFsX21wZHUgPSAiLCB0b3RhbF9tcGR1KTsKK30KKwordm9pZCAgICB6ZkJhd0luaXQoemRldl90KiBkZXYpIHsKKyAgICBUSURfQkFXIHRpZF9iYXc7CisgICAgdTE2X3QgaSxqOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBmb3IgKGk9MDsgaTxaTV9CQVdfUE9PTF9TSVpFOyBpKyspeworICAgICAgICB0aWRfYmF3ID0gJkJBVy0+dGlkX2Jhd1tpXTsKKyAgICAgICAgZm9yIChqPTA7IGo8Wk1fVlRYUV9TSVpFOyBqKyspIHsKKyAgICAgICAgICAgIHRpZF9iYXctPmZyYW1lW2pdLmJ1ZiA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgdGlkX2Jhdy0+ZW5hYmxlZCA9IHRpZF9iYXctPmhlYWQgPSB0aWRfYmF3LT50YWlsID0gdGlkX2Jhdy0+c2l6ZSA9IDA7CisgICAgICAgIHRpZF9iYXctPnN0YXJ0X3NlcSA9IDA7CisgICAgfQorICAgIEJBVy0+ZGVsUG9pbnQgPSAwOworICAgIEJBVy0+Y29yZSA9IHpmQmF3Q29yZTsKKyAgICBCQVctPmdldE5ld1EgPSB6ZkJhd0dldE5ld1E7CisgICAgQkFXLT5pbnNlcnQgPSB6ZkJhd0luc2VydDsKKyAgICBCQVctPnBvcCA9IHpmQmF3UG9wOworICAgIEJBVy0+ZW5hYmxlID0gemZCYXdFbmFibGU7CisgICAgQkFXLT5kaXNhYmxlID0gemZCYXdEaXNhYmxlOworICAgIEJBVy0+Z2V0USA9IHpmQmF3R2V0UTsKK30KKworCisKK1RJRF9CQVcgemZCYXdHZXROZXdRKHpkZXZfdCogZGV2LCB1MTZfdCBzdGFydF9zZXEsIFRJRF9UWCB0aWRfdHgpIHsKKyAgICBUSURfQkFXIHRpZF9iYXc9TlVMTDsKKyAgICBUSURfQkFXIG5leHRfYmF3PU5VTEw7CisgICAgdTE2X3QgaTsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgLyoKKyAgICBmb3IgKGk9MDsgaTxaTV9CQVdfUE9PTF9TSVpFOyBpKyspeworICAgICAgICB0aWRfYmF3ID0gJkJBVy0+dGlkX2Jhd1tpXTsKKyAgICAgICAgaWYgKEZBTFNFID09IHRpZF9iYXctPmVuYWJsZWQpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgKi8KKworICAgIHRpZF9iYXcgPSAmQkFXLT50aWRfYmF3W0JBVy0+ZGVsUG9pbnRdOworICAgIGkgPSBCQVctPmRlbFBvaW50OworICAgIC8vaWYgKFpNX0JBV19QT09MX1NJWkUgPT0gaSkgeworICAgICAgICAvL3JldHVybiBOVUxMOworICAgIC8vICAgIHU4X3QgdGVtcCA9IEJBVy0+ZGVsUG9pbnQ7CisgICAgLy8gICAgdGlkX2JhdyA9ICZCQVctPnRpZF9iYXdbQkFXLT5kZWxQb2ludF07CisgICAgLy8gICAgQkFXLT5kaXNhYmxlKGRldiwgdGlkX2Jhdyk7CisgICAgLy8gICAgQkFXLT5kZWxQb2ludCA9IChCQVctPmRlbFBvaW50IDwgKFpNX0JBV19QT09MX1NJWkUgLSAxKSk/IChCQVctPmRlbFBvaW50ICsgMSk6IDA7CisgICAgLy8gICAgdGVtcCA9IEJBVy0+ZGVsUG9pbnQ7CisgICAgLy99CisKKyAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAiZ2V0IG5ldyB0aWRfYmF3LCBpbmRleD0iLCBpKTsKKyAgICBCQVctPmRlbFBvaW50ID0gKGkgPCAoWk1fQkFXX1BPT0xfU0laRSAtMSkpPyAoaSArIDEpOiAwOworICAgIG5leHRfYmF3ID0gJkJBVy0+dGlkX2Jhd1tCQVctPmRlbFBvaW50XTsKKyAgICBpZiAoMSA9PSBuZXh0X2Jhdy0+ZW5hYmxlZCkgQkFXLT5kaXNhYmxlKGRldiwgbmV4dF9iYXcpOworCisgICAgQkFXLT5lbmFibGUoZGV2LCB0aWRfYmF3LCBzdGFydF9zZXEpOworICAgIHRpZF9iYXctPnRpZF90eCA9IHRpZF90eDsKKworICAgIHJldHVybiB0aWRfYmF3OworfQorCit1MTZfdCAgIHpmQmF3SW5zZXJ0KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgYmF3X3NlcSwgVElEX0JBVyB0aWRfYmF3LCB1OF90IGJhd19yZXRyYW5zbWl0LCBzdHJ1Y3QgYmF3X2hlYWRlcl9yICpoZWFkZXJfcikgeworICAgIC8vVElEX0JBVyB0aWRfYmF3OworICAgIC8vdTE2X3QgICBidWZMZW47CisKKyAgICAvL3ptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBpZih0aWRfYmF3LT5zaXplIDwgKFpNX1ZUWFFfU0laRSAtIDEpKSB7CisgICAgICAgIHN0cnVjdCBiYXdfaGVhZGVyICpiYXdfaGVhZGVyID0gJnRpZF9iYXctPmZyYW1lW3RpZF9iYXctPmhlYWRdLmJhd19oZWFkZXI7CisKKyAgICAgICAgYmF3X2hlYWRlci0+aGVhZGVyTGVuICAgPSBoZWFkZXJfci0+aGVhZGVyTGVuOworICAgICAgICBiYXdfaGVhZGVyLT5taWNMZW4gICAgICA9IGhlYWRlcl9yLT5taWNMZW47CisgICAgICAgIGJhd19oZWFkZXItPnNuYXBMZW4gICAgID0gaGVhZGVyX3ItPnNuYXBMZW47CisgICAgICAgIGJhd19oZWFkZXItPnJlbW92ZUxlbiAgID0gaGVhZGVyX3ItPnJlbW92ZUxlbjsKKyAgICAgICAgYmF3X2hlYWRlci0+a2V5SWR4ICAgICAgPSBoZWFkZXJfci0+a2V5SWR4OworICAgICAgICB6ZndNZW1vcnlDb3B5KCh1OF90ICopYmF3X2hlYWRlci0+aGVhZGVyLCAodThfdCAqKWhlYWRlcl9yLT5oZWFkZXIsIDU4KTsKKyAgICAgICAgemZ3TWVtb3J5Q29weSgodThfdCAqKWJhd19oZWFkZXItPm1pYyAgICwgKHU4X3QgKiloZWFkZXJfci0+bWljICAgLCA4KTsKKyAgICAgICAgemZ3TWVtb3J5Q29weSgodThfdCAqKWJhd19oZWFkZXItPnNuYXAgICwgKHU4X3QgKiloZWFkZXJfci0+c25hcCAgLCA4KTsKKyAgICAgICAgLy93ZC0+emZjYlNldEJhd1EoZGV2LCBidWYsIDEpOworICAgICAgICB0aWRfYmF3LT5mcmFtZVt0aWRfYmF3LT5oZWFkXS5idWYgPSBidWY7CisgICAgICAgIHRpZF9iYXctPmZyYW1lW3RpZF9iYXctPmhlYWRdLmJhd19zZXEgPSBiYXdfc2VxOworICAgICAgICB0aWRfYmF3LT5mcmFtZVt0aWRfYmF3LT5oZWFkXS5iYXdfcmV0cmFuc21pdCA9IGJhd19yZXRyYW5zbWl0ICsgMTsKKworICAgICAgICAvL3RpZF9iYXctPmZyYW1lW3RpZF9iYXctPmhlYWRdLmRhdGEgPSBwQnVmLT5kYXRhOworICAgICAgICB0aWRfYmF3LT5oZWFkKys7CisgICAgICAgIHRpZF9iYXctPnNpemUrKzsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8vd2QtPnpmY2JTZXRCYXdRKGRldiwgYnVmLCAwKTsKKyAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgWk1fU1VDQ0VTUyk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7Cit9CisKK3N0cnVjdCBidWZJbmZvKiB6ZkJhd1BvcCh6ZGV2X3QqIGRldiwgdTE2X3QgaW5kZXgsIFRJRF9CQVcgdGlkX2JhdykgeworICAgIC8vVElEX0JBVyB0aWRfYmF3OworICAgIC8vemJ1Zl90KiBidWY7CisgICAgc3RydWN0IGJ1ZkluZm8gKmJ1Zl9pbmZvOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGJ1Zl9pbmZvID0gJndkLT5idWZfaW5mbzsKKyAgICBidWZfaW5mby0+YmF3X2hlYWRlciA9IE5VTEw7CisKKyAgICBpZiAoTlVMTCA9PSAoYnVmX2luZm8tPmJ1ZiA9IHRpZF9iYXctPmZyYW1lW2luZGV4XS5idWYpKQorICAgICAgICByZXR1cm4gYnVmX2luZm87CisKKyAgICBidWZfaW5mby0+YmF3X3JldHJhbnNtaXQgPSB0aWRfYmF3LT5mcmFtZVtpbmRleF0uYmF3X3JldHJhbnNtaXQ7CisgICAgYnVmX2luZm8tPmJhd19oZWFkZXIgPSAmdGlkX2Jhdy0+ZnJhbWVbaW5kZXhdLmJhd19oZWFkZXI7CisgICAgYnVmX2luZm8tPnRpbWVzdGFtcCA9IHRpZF9iYXctPmZyYW1lW2luZGV4XS50aW1lc3RhbXA7CisgICAgLy9wQnVmLT5kYXRhID0gcEJ1Zi0+YnVmZmVyOworICAgIC8vd2QtPnpmY2JSZXN0b3JlQnVmRGF0YShkZXYsIGJ1Zik7CisgICAgdGlkX2Jhdy0+ZnJhbWVbaW5kZXhdLmJ1ZiA9IE5VTEw7CisKKyAgICByZXR1cm4gYnVmX2luZm87Cit9CisKK3ZvaWQgICAgemZCYXdFbmFibGUoemRldl90KiBkZXYsIFRJRF9CQVcgdGlkX2JhdywgdTE2X3Qgc3RhcnRfc2VxKSB7CisgICAgLy9USURfQkFXIHRpZF9iYXc7CisKKyAgICAvL3ptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB0aWRfYmF3LT5lbmFibGVkID0gVFJVRTsKKyAgICB0aWRfYmF3LT5oZWFkID0gdGlkX2Jhdy0+dGFpbCA9IHRpZF9iYXctPnNpemUgPSAwOworICAgIHRpZF9iYXctPnN0YXJ0X3NlcSA9IHN0YXJ0X3NlcTsKK30KKwordm9pZCAgICB6ZkJhd0Rpc2FibGUoemRldl90KiBkZXYsIFRJRF9CQVcgdGlkX2JhdykgeworICAgIC8vVElEX0JBVyB0aWRfYmF3OworICAgIHUxNl90IGk7CisKKyAgICAvL3ptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisgICAgZm9yIChpPTA7IGk8Wk1fVlRYUV9TSVpFOyBpKyspIHsKKyAgICAgICAgaWYgKHRpZF9iYXctPmZyYW1lW2ldLmJ1ZikgeworCisgICAgICAgICAgICAvL3dkLT56ZmNiU2V0QmF3UShkZXYsIHRpZF9iYXctPmZyYW1lW2ldLmJ1ZiwgMCk7CisgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgdGlkX2Jhdy0+ZnJhbWVbaV0uYnVmLCBaTV9TVUNDRVNTKTsKKyAgICAgICAgICAgIHRpZF9iYXctPmZyYW1lW2ldLmJ1ZiA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB0aWRfYmF3LT5lbmFibGVkID0gRkFMU0U7Cit9CisKK1RJRF9CQVcgemZCYXdHZXRRKHpkZXZfdCogZGV2LCB1MTZfdCBiYXdfc2VxKSB7CisgICAgVElEX0JBVyB0aWRfYmF3PU5VTEw7CisgICAgdTE2X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisgICAgZm9yIChpPTA7IGk8Wk1fQkFXX1BPT0xfU0laRTsgaSsrKXsKKyAgICAgICAgdGlkX2JhdyA9ICZCQVctPnRpZF9iYXdbaV07CisgICAgICAgIGlmIChUUlVFID09IHRpZF9iYXctPmVuYWJsZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX21zZzFfYWdnKFpNX0xWXzAsICJnZXQgYW4gb2xkIHRpZF9iYXcsIGJhd19zZXE9IiwgYmF3X3NlcSk7CisgICAgICAgICAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAiY2hlY2sgYSAgdGlkX2Jhdy0+c3RhcnRfc2VxPSIsIHRpZF9iYXctPnN0YXJ0X3NlcSk7CisgICAgICAgICAgICBpZihiYXdfc2VxID09IHRpZF9iYXctPnN0YXJ0X3NlcSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgfQorICAgIGlmIChaTV9CQVdfUE9PTF9TSVpFID09IGkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiB0aWRfYmF3OworfQorI2VuZGlmIC8vZGlzYWJsZSBCQVcKKyNlbmRpZgorCit1MTZfdCB6ZkFnZ1RhbGx5UmVzZXQoemRldl90KiBkZXYpCit7CisgICAgc3RydWN0IGFnZ1RhbGx5KiBhZ2dfdGFsOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgYWdnX3RhbCA9ICZ3ZC0+YWdnX3RhbDsKKyAgICBhZ2dfdGFsLT5nb3RfcGFja2V0c19zdW0gPSAwOworICAgIGFnZ190YWwtPmdvdF9ieXRlc19zdW0gPSAwOworICAgIGFnZ190YWwtPnNlbnRfYnl0ZXNfc3VtID0gMDsKKyAgICBhZ2dfdGFsLT5zZW50X3BhY2tldHNfc3VtID0gMDsKKyAgICBhZ2dfdGFsLT5hdmdfZ290X3BhY2tldHMgPSAwOworICAgIGFnZ190YWwtPmF2Z19nb3RfYnl0ZXMgPSAwOworICAgIGFnZ190YWwtPmF2Z19zZW50X3BhY2tldHMgPSAwOworICAgIGFnZ190YWwtPmF2Z19zZW50X2J5dGVzID0gMDsKKyAgICBhZ2dfdGFsLT50aW1lID0gMDsKKyAgICByZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBZ2dTY2FuQW5kQ2xlYXIgICAgICAgICAgICovCisvKiAgICAgIElmIHRoZSBwYWNrZXRzIGluIGEgcXVldWUgaGF2ZSB3YWl0ZWQgZm9yIHRvbyBsb25nLCBjbGVhciBhbmQgICAqLworLyogICAgICBkZWxldGUgdGhpcyBhZ2dyZWdhdGlvbiBxdWV1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgICAgIDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdGltZSAgICA6IGN1cnJlbnQgdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgWk1fU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgSG9uZGEgICAgICAgICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDYuMTIgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90ICAgemZBZ2dTY2FuQW5kQ2xlYXIoemRldl90KiBkZXYsIHUzMl90IHRpbWUpCit7CisgICAgdTE2X3QgaTsKKyAgICB1MTZfdCBoZWFkOworICAgIHUxNl90IHRhaWw7CisgICAgdTMyX3QgdGljazsKKyAgICB1MzJfdCBhcnJpdmFsVGltZTsKKyAgICAvL3UxNl90IGFpZCwgYWM7CisgICAgVElEX1RYIHRpZF90eDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBpZighKHdkLT5zdGF0ZSA9PSBaTV9XTEFOX1NUQVRFX0VOQUJMRUQpKSByZXR1cm4gMDsKKyAgICB6ZkFnZ1R4U2NoZWR1bGVyKGRldiwgMSk7CisgICAgdGljayA9IHptX2FnZ19HZXRUaW1lKCk7CisgICAgZm9yIChpPTA7IGk8Wk1fQUdHX1BPT0xfU0laRTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKCF3ZC0+YWdnUVBvb2xbaV0pIHJldHVybiAwOworICAgICAgICBpZiAoMSA9PSB3ZC0+YWdnUVBvb2xbaV0tPmFnZ1FFbmFibGVkKQorICAgICAgICB7CisgICAgICAgICAgICB0aWRfdHggPSB3ZC0+YWdnUVBvb2xbaV07CisgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgICAgICBoZWFkID0gdGlkX3R4LT5hZ2dIZWFkOworICAgICAgICAgICAgdGFpbCA9IHRpZF90eC0+YWdnVGFpbDsKKworICAgICAgICAgICAgYXJyaXZhbFRpbWUgPSAodTMyX3QpdGlkX3R4LT5hZ2d2dHhxW3RpZF90eC0+YWdnVGFpbF0uYXJyaXZhbFRpbWU7CisKKworICAgICAgICAgICAgaWYoKHRpY2sgLSBhcnJpdmFsVGltZSkgPD0gWk1fQUdHX0NMRUFSX1RJTUUpCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoKHRpZF90eC0+c2l6ZSA9IHptX2FnZ19xbGVuKGRldiwgdGlkX3R4LT5hZ2dIZWFkLCB0aWRfdHgtPmFnZ1RhaWwpKSA+IDApCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICB0aWRfdHgtPmNsZWFyRmxhZyA9IDE7CisKKyAgICAgICAgICAgICAgICAvL3ptX21zZzFfYWdnKFpNX0xWXzAsICJjbGVhciBxdWV1ZSAgICB0aWNrID0iLCB0aWNrKTsKKyAgICAgICAgICAgICAgICAvL3ptX21zZzFfYWdnKFpNX0xWXzAsICJjbGVhciBxdWV1ZSBhcnJpdmFsID0iLCBhcnJpdmFsVGltZSk7CisKKworICAgICAgICAgICAgICAgIC8vem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICAvL3pmQWdnVHhTY2hlZHVsZXIoZGV2KTsKKyAgICAgICAgICAgICAgICAvL3ptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRpZF90eC0+c2l6ZSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogcXVldWUgZW1wdHkKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAodGljayAtIHRpZF90eC0+bGFzdEFycml2YWwgPiBaTV9BR0dfREVMRVRFX1RJTUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAiZGVsZXRlIHF1ZXVlLCBpZGxlIGZvciBuIHNlYy4gbiA9ICIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9BR0dfREVMRVRFX1RJTUUvMTApOworCisgICAgICAgICAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgICAgIHpmQWdnVHhEZWxldGVRdWV1ZShkZXYsIGkpOworICAgICAgICAgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgfQorICAgIH0KKworICAgICAgICB6ZkFnZ1J4Q2xlYXIoZGV2LCB0aW1lKTsKKworI2lmZGVmIFpNX0FHR19UQUxMWQorICAgIGlmKCh3ZC0+dGljayAlIDEwMCkgPT0gMCkgeworICAgICAgICB6ZkFnZ1ByaW50VGFsbHkoZGV2KTsKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiBaTV9TVUNDRVNTOworfQorCit1MTZfdCAgIHpmQWdnUHJpbnRUYWxseSh6ZGV2X3QqIGRldikKK3sKKyAgICBzdHJ1Y3QgYWdnVGFsbHkqIGFnZ190YWw7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBhZ2dfdGFsID0gJndkLT5hZ2dfdGFsOworCisgICAgaWYoYWdnX3RhbC0+Z290X3BhY2tldHNfc3VtIDwgMTApCisgICAgeworICAgICAgICB6ZkFnZ1RhbGx5UmVzZXQoZGV2KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgYWdnX3RhbC0+dGltZSsrOworICAgIGFnZ190YWwtPmF2Z19nb3RfcGFja2V0cyA9IChhZ2dfdGFsLT5hdmdfZ290X3BhY2tldHMgKiAoYWdnX3RhbC0+dGltZSAtIDEpICsKKyAgICAgICAgICAgIGFnZ190YWwtPmdvdF9wYWNrZXRzX3N1bSkgLyBhZ2dfdGFsLT50aW1lOworICAgIGFnZ190YWwtPmF2Z19nb3RfYnl0ZXMgPSAoYWdnX3RhbC0+YXZnX2dvdF9ieXRlcyAqIChhZ2dfdGFsLT50aW1lIC0gMSkgKworICAgICAgICAgICAgYWdnX3RhbC0+Z290X2J5dGVzX3N1bSkgLyBhZ2dfdGFsLT50aW1lOworICAgIGFnZ190YWwtPmF2Z19zZW50X3BhY2tldHMgPSAoYWdnX3RhbC0+YXZnX3NlbnRfcGFja2V0cyAqIChhZ2dfdGFsLT50aW1lIC0gMSkKKyAgICAgICAgICAgICsgYWdnX3RhbC0+c2VudF9wYWNrZXRzX3N1bSkgLyBhZ2dfdGFsLT50aW1lOworICAgIGFnZ190YWwtPmF2Z19zZW50X2J5dGVzID0gKGFnZ190YWwtPmF2Z19zZW50X2J5dGVzICogKGFnZ190YWwtPnRpbWUgLSAxKSArCisgICAgICAgICAgICBhZ2dfdGFsLT5zZW50X2J5dGVzX3N1bSkgLyBhZ2dfdGFsLT50aW1lOworICAgIHptX21zZzFfYWdnKFpNX0xWXzAsICJnb3RfcGFja2V0c19zdW0gPSIsIGFnZ190YWwtPmdvdF9wYWNrZXRzX3N1bSk7CisgICAgem1fbXNnMV9hZ2coWk1fTFZfMCwgIiAgZ290X2J5dGVzX3N1bSA9IiwgYWdnX3RhbC0+Z290X2J5dGVzX3N1bSk7CisgICAgem1fbXNnMV9hZ2coWk1fTFZfMCwgInNlbnRfcGFja2V0c19zdW09IiwgYWdnX3RhbC0+c2VudF9wYWNrZXRzX3N1bSk7CisgICAgem1fbXNnMV9hZ2coWk1fTFZfMCwgIiBzZW50X2J5dGVzX3N1bSA9IiwgYWdnX3RhbC0+c2VudF9ieXRlc19zdW0pOworICAgIGFnZ190YWwtPmdvdF9wYWNrZXRzX3N1bSA9IGFnZ190YWwtPmdvdF9ieXRlc19zdW0gPWFnZ190YWwtPnNlbnRfcGFja2V0c19zdW0KKyAgICAgICAgICAgICAgICA9IGFnZ190YWwtPnNlbnRfYnl0ZXNfc3VtID0gMDsKKyAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAiYXZnX2dvdF9wYWNrZXRzID0iLCBhZ2dfdGFsLT5hdmdfZ290X3BhY2tldHMpOworICAgIHptX21zZzFfYWdnKFpNX0xWXzAsICIgIGF2Z19nb3RfYnl0ZXMgPSIsIGFnZ190YWwtPmF2Z19nb3RfYnl0ZXMpOworICAgIHptX21zZzFfYWdnKFpNX0xWXzAsICJhdmdfc2VudF9wYWNrZXRzPSIsIGFnZ190YWwtPmF2Z19zZW50X3BhY2tldHMpOworICAgIHptX21zZzFfYWdnKFpNX0xWXzAsICIgYXZnX3NlbnRfYnl0ZXMgPSIsIGFnZ190YWwtPmF2Z19zZW50X2J5dGVzKTsKKyAgICBpZiAoKHdkLT5jb21tVGFsbHkuQkFfRmFpbCA9PSAwKSB8fCAod2QtPmNvbW1UYWxseS5Id19UeF9NUERVID09IDApKQorICAgIHsKKyAgICAgICAgem1fbXNnMV9hZ2coWk1fTFZfMCwgIkhhcmR3YXJlIFR4IE1QRFU9Iiwgd2QtPmNvbW1UYWxseS5Id19UeF9NUERVKTsKKyAgICAgICAgem1fbXNnMV9hZ2coWk1fTFZfMCwgIiAgQkEgRmFpbCBudW1iZXI9Iiwgd2QtPmNvbW1UYWxseS5CQV9GYWlsKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAiMS8oQkEgZmFpbCByYXRlKT0iLCB3ZC0+Y29tbVRhbGx5Lkh3X1R4X01QRFUvd2QtPmNvbW1UYWxseS5CQV9GYWlsKTsKKworICAgIHJldHVybiAwOworfQorCit1MTZfdCB6ZkFnZ1J4Q2xlYXIoemRldl90KiBkZXYsIHUzMl90IHRpbWUpCit7CisgICAgdTE2X3QgICBpOworICAgIHN0cnVjdCBhZ2dfdGlkX3J4ICp0aWRfcng7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgZm9yIChpPTA7IGk8Wk1fQUdHX1BPT0xfU0laRTsgaSsrKQorICAgIHsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgdGlkX3J4ID0gd2QtPnRpZF9yeFtpXTsKKyAgICAgICAgaWYgKHRpZF9yeC0+YmF3X2hlYWQgIT0gdGlkX3J4LT5iYXdfdGFpbCkKKyAgICAgICAgeworICAgICAgICAgICAgdTE2X3QgaiA9IHRpZF9yeC0+YmF3X3RhaWw7CisgICAgICAgICAgICB3aGlsZSAoKGogIT0gdGlkX3J4LT5iYXdfaGVhZCkgJiYgIXRpZF9yeC0+ZnJhbWVbal0uYnVmKSB7CisgICAgICAgICAgICAJaiA9IChqICsgMSkgJiBaTV9BR0dfQkFXX01BU0s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGogIT0gdGlkX3J4LT5iYXdfaGVhZCkgJiYgKHRpbWUgLSB0aWRfcngtPmZyYW1lW2pdLmFycml2YWxUaW1lKSA+CisgICAgICAgICAgICAgICAgICAgIChaTV9BR0dfQ0xFQVJfVElNRSAtIDUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgem1fbXNnMF9hZ2coWk1fTFZfMSwgInF1ZXVlIFJ4Rmx1c2ggYnkgUnhDbGVhciIpOworICAgICAgICAgICAgICAgIHpmQWdnUnhGbHVzaChkZXYsIDAsIHRpZF9yeCk7CisgICAgICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIH0KKworICAgIHJldHVybiBaTV9TVUNDRVNTOworfQorCitzdHJ1Y3QgYWdnX3RpZF9yeCogemZBZ2dSeEVuYWJsZWQoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHUxNl90ICAgZHN0MCwgc3JjWzNdLCBhYywgYWlkLCBmcmFnT2ZmOworICAgIHU4X3QgICAgdXA7CisgICAgdTE2X3QgICBvZmZzZXQgPSAwOworICAgIHUxNl90ICAgc2VxX25vOworICAgIHUxNl90IGZyYW1lVHlwZTsKKyAgICB1MTZfdCBmcmFtZUN0cmw7CisgICAgdTE2X3QgZnJhbWVTdWJ0eXBlOworICAgIHUzMl90IHRjcF9zZXE7CisgICAgLy9zdHJ1Y3QgYWdnU3RhICphZ2dfc3RhOworI2lmIFpNX0FHR19GUEdBX1JFT1JERVJJTkcKKyAgICBzdHJ1Y3QgYWdnX3RpZF9yeCAqdGlkX3J4OworI2VuZGlmCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworICAgIHNlcV9ubyA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDIyKSA+PiA0OworICAgIC8vRGJnUHJpbnQoIlJ4IHNlcT0lZFxuIiwgc2VxX25vKTsKKyAgICBpZiAod2QtPnN0YS5FbmFibGVIVCA9PSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZnJhbWVDdHJsID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCk7CisgICAgZnJhbWVUeXBlID0gZnJhbWVDdHJsICYgMHhmOworICAgIGZyYW1lU3VidHlwZSA9IGZyYW1lQ3RybCAmIDB4ZjA7CisKKworICAgIGlmIChmcmFtZVR5cGUgIT0gWk1fV0xBTl9EQVRBX0ZSQU1FKSAvL25vbi1Rb3MgRGF0YT8gKGZyYW1lU3VidHlwZSYweDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorI2lmZGVmIFpNX0VOQUJMRV9QRVJGT1JNQU5DRV9FVkFMVUFUSU9OCisgICAgdGNwX3NlcSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDIyKzM2KSA8PCAyNDsKKyAgICB0Y3Bfc2VxICs9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDIyKzM3KSA8PCAxNjsKKyAgICB0Y3Bfc2VxICs9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDIyKzM4KSA8PCA4OworICAgIHRjcF9zZXEgKz0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMjIrMzkpOworI2VuZGlmCisKKyAgICBaTV9TRVFfREVCVUcoIkluICAgICAgICAgICAgICAgICAgICU1ZCwgJTEydVxuIiwgc2VxX25vLCB0Y3Bfc2VxKTsKKyAgICBkc3QwID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KzQpOworCisgICAgc3JjWzBdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KzEwKTsKKyAgICBzcmNbMV0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBvZmZzZXQrMTIpOworICAgIHNyY1syXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCsxNCk7CisKKyNpZiBaTV9BR0dfRlBHQV9ERUJVRworICAgIGFpZCA9IDA7CisjZWxzZQorICAgIGFpZCA9IHpmQXBGaW5kU3RhKGRldiwgc3JjKTsKKyNlbmRpZgorCisgICAgLy9hZ2dfc3RhID0gJndkLT5hZ2dTdGFbYWlkXTsKKyAgICAvL3pmVHhHZXRJcFRvc0FuZEZyYWcoZGV2LCBidWYsICZ1cCwgJmZyYWdPZmYpOworICAgIC8vYWMgPSB6Y1VwVG9BY1t1cCYweDddICYgMHgzOworCisgICAgLyoKKyAgICAgKiBGaWx0ZXIgdW5pY2FzdCBmcmFtZSBvbmx5LCBhaWQgPT0gMCBpcyBmb3IgZGVidWcgb25seQorICAgICAqLworICAgIGlmICgoZHN0MCAmIDB4MSkgPT0gMCAmJiBhaWQgPT0gMCkKKyAgICB7CisjaWYgWk1fQUdHX0ZQR0FfUkVPUkRFUklORworICAgICAgICB0aWRfcnggPSB6ZkFnZ1J4R2V0UXVldWUoZGV2LCBidWYpIDsKKyAgICAgICAgaWYoIXRpZF9yeCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vaWYgKHRpZF9yeC0+YWRkQmFFeGNoYW5nZVN0YXR1c0NvZGUgPT0gWk1fQUdHX0FEREJBX1JFU1BPTlNFKQorICAgICAgICAgICAgcmV0dXJuIHRpZF9yeDsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKwordTE2X3QgemZBZ2dSeCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyAqYWRkSW5mbywgc3RydWN0IGFnZ190aWRfcnggKnRpZF9yeCkKK3sKKyAgICB1MTZfdCAgIHNlcV9ubzsKKyAgICBzMTZfdCAgIGluZGV4OworICAgIHUxNl90ICAgb2Zmc2V0ID0gMDsKKyAgICB6YnVmX3QqIHBidWY7CisgICAgdThfdCAgICBmcmFtZVN1YlR5cGU7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgWk1fQlVGRkVSX1RSQUNFKGRldiwgYnVmKQorCisgICAgWk1fUEVSRk9STUFOQ0VfUlhfUkVPUkRFUihkZXYpOworCisgICAgc2VxX25vID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KzIyKSA+PiA0OworCisgICAgaW5kZXggPSBzZXFfbm8gLSB0aWRfcngtPnNlcV9zdGFydDsKKyAgICAvKgorICAgICAqIGZvciBkZWJ1ZworICAgICAqLworCisgICAgLyogem1fbXNnMl9hZ2coWk1fTFZfMCwgInF1ZXVlIHNlcSA9ICIsIHNlcV9ubyk7CisgICAgICogRGJnUHJpbnQoIiVzOiVzJWx4aCAlcyVseGhcbiIsIF9fZnVuY19fLCAicXVldWUgc2VxPSIsIHNlcV9ubywKKyAgICAgKiAgICI7IHNlcV9zdGFydD0iLCB0aWRfcngtPnNlcV9zdGFydCk7CisgICAgICovCisKKyAgICAvL0RiZ1ByaW50KCJzZXFfbm89JWQsIHNlcV9zdGFydD0lZFxuIiwgc2VxX25vLCB0aWRfcngtPnNlcV9zdGFydCk7CisKKyAgICAvKiBJbiBzb21lIEFQcywgd2UgZm91bmQgdGhhdCBpdCBtaWdodCB0cmFuc21pdCBOVUxMIGRhdGEgd2hvc2Ugc2VxdWVuY2UgbnVtYmVyCisgICAgICAgaXMgb3V0IG9yIG9yZGVyLiBJbiBvcmRlciB0byBhdm9pZCB0aGlzIHByb2JsZW0sIHdlIGlnbm9yZSB0aGVzZSBOVUxMIGRhdGEuCisgICAgICovCisKKyAgICBmcmFtZVN1YlR5cGUgPSAoem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMCkgJiAweEYwKSA+PiA0OworCisgICAgLyogSWYgdGhpcyBpcyBhIE5VTEwgZGF0YSBpbnN0ZWFkIG9mIFFvcyBOVUxMIGRhdGEgKi8KKyAgICBpZiAoKGZyYW1lU3ViVHlwZSAmIDB4MEMpID09IDB4MDQpCisgICAgeworICAgICAgICBzMTZfdCBzZXFfZGlmZjsKKworICAgICAgICBzZXFfZGlmZiA9IChzZXFfbm8gPiB0aWRfcngtPnNlcV9zdGFydCkgPworICAgICAgICAgICAgICAgICAgICAgICBzZXFfbm8gLSB0aWRfcngtPnNlcV9zdGFydCA6IHRpZF9yeC0+c2VxX3N0YXJ0IC0gc2VxX25vOworCisgICAgICAgIGlmIChzZXFfZGlmZiA+IFpNX0FHR19CQVdfU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiRnJlZSBSeCBOVUxMIGRhdGEgaW4gemZBZ2dSeCIpOworCisgICAgICAgICAgICAvKiBGcmVlIFJ4IGJ1ZmZlciAqLworICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgICAgICByZXR1cm4gWk1fRVJSX09VVF9PRl9PUkRFUl9OVUxMX0RBVEE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIHNlcXVlbmNlIG51bWJlciB3cmFwIGF0IDRrCisgICAgICovCisgICAgaWYgKHRpZF9yeC0+c2VxX3N0YXJ0ID4gc2VxX25vKQorICAgIHsKKyAgICAgICAgLy9pbmRleCArPSA0MDk2OworCisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIGlmICh0aWRfcngtPnNlcV9zdGFydCA+PSA0MDk2KSB7CisgICAgICAgICAgICB0aWRfcngtPnNlcV9zdGFydCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIH0KKworICAgIGlmICh0aWRfcngtPnNlcV9zdGFydCA9PSBzZXFfbm8pIHsKKyAgICAJem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAJaWYgKCgodGlkX3J4LT5iYXdfaGVhZCAtIHRpZF9yeC0+YmF3X3RhaWwpICYgWk1fQUdHX0JBV19NQVNLKSA+IDApIHsKKyAgICAJICAgIC8vRGJnUHJpbnQoImhlYWQ9JWQsIHRhaWw9JWQiLCB0aWRfcngtPmJhd19oZWFkLCB0aWRfcngtPmJhd190YWlsKTsKKyAgICAgICAgICAgIHRpZF9yeC0+YmF3X3RhaWwgPSAodGlkX3J4LT5iYXdfdGFpbCArIDEpICYgWk1fQUdHX0JBV19NQVNLOworICAgICAgICB9CisgICAgICAgIHRpZF9yeC0+c2VxX3N0YXJ0ID0gKHRpZF9yeC0+c2VxX3N0YXJ0ICsgMSkgJiAoNDA5NiAtIDEpOworICAgIAl6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIFpNX1BFUkZPUk1BTkNFX1JYX1NFUShkZXYsIGJ1Zik7CisKKyAgICAJaWYgKHdkLT56ZmNiUmVjdjgwMjExICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8vc2VxX25vID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KzIyKSA+PiA0OworICAgICAgICAgICAgLy9EYmdQcmludCgiUmVjdiBpbmRpY2F0ZSBzZXE9JWRcbiIsIHNlcV9ubyk7CisgICAgICAgICAgICAvL0RiZ1ByaW50KCIxLiBzZXE9JWRcbiIsIHNlcV9ubyk7CisKKyAgICAgICAgICAgIHdkLT56ZmNiUmVjdjgwMjExKGRldiwgYnVmLCBhZGRJbmZvKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHpmaVJlY3Y4MDIxMShkZXYsIGJ1ZiwgYWRkSW5mbyk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIXpmQWdnUnhFbnF1ZXVlKGRldiwgYnVmLCB0aWRfcngsIGFkZEluZm8pKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogZHVwbGljYXRlZCBwYWNrZXQKKyAgICAgICAgICovCisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHdoaWxlICh0aWRfcngtPmJhd19oZWFkICE9IHRpZF9yeC0+YmF3X3RhaWwpIHsvLyAmJiB0aWRfcngtPmZyYW1lW3RpZF9yeC0+YmF3X3RhaWxdLmJ1ZikKKyAgICAgICAgdTE2X3QgdGFpbEluZGV4OworCisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgdGFpbEluZGV4ID0gdGlkX3J4LT5iYXdfdGFpbDsKKyAgICAgICAgcGJ1ZiA9IHRpZF9yeC0+ZnJhbWVbdGFpbEluZGV4XS5idWY7CisgICAgICAgIHRpZF9yeC0+ZnJhbWVbdGFpbEluZGV4XS5idWYgPSAwOworICAgICAgICBpZiAoIXBidWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHRpZF9yeC0+YmF3X3RhaWwgPSAodGlkX3J4LT5iYXdfdGFpbCArIDEpICYgWk1fQUdHX0JBV19NQVNLOworICAgICAgICB0aWRfcngtPnNlcV9zdGFydCA9ICh0aWRfcngtPnNlcV9zdGFydCArIDEpICYgKDQwOTYgLSAxKTsKKworCisgICAgICAgIC8vaWYocGJ1ZiAmJiB0aWRfcngtPmJhd19zaXplID4gMCkKKyAgICAgICAgLy8gICAgdGlkX3J4LT5iYXdfc2l6ZS0tOworCisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgWk1fUEVSRk9STUFOQ0VfUlhfU0VRKGRldiwgcGJ1Zik7CisKKyAgICAgICAgaWYgKHdkLT56ZmNiUmVjdjgwMjExICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vc2VxX25vID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIHBidWYsIG9mZnNldCsyMikgPj4gNDsKKyAgICAgICAgICAgIC8vRGJnUHJpbnQoIlJlY3YgaW5kaWNhdGUgc2VxPSVkXG4iLCBzZXFfbm8pOworICAgICAgICAgICAgLy9EYmdQcmludCgiMS4gc2VxPSVkXG4iLCBzZXFfbm8pOworICAgICAgICAgICAgd2QtPnpmY2JSZWN2ODAyMTEoZGV2LCBwYnVmLCBhZGRJbmZvKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vc2VxX25vID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIHBidWYsIG9mZnNldCsyMikgPj4gNDsKKyAgICAgICAgICAgIC8vRGJnUHJpbnQoIlJlY3YgaW5kaWNhdGUgc2VxPSVkXG4iLCBzZXFfbm8pOworICAgICAgICAgICAgemZpUmVjdjgwMjExKGRldiwgcGJ1ZiwgYWRkSW5mbyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworc3RydWN0IGFnZ190aWRfcnggKnpmQWdnUnhHZXRRdWV1ZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdTE2X3QgICBzcmNbM107CisgICAgdTE2X3QgICBhaWQsIGFjLCBpOworICAgIHUxNl90ICAgb2Zmc2V0ID0gMDsKKyAgICBzdHJ1Y3QgYWdnX3RpZF9yeCAqdGlkX3J4ID0gTlVMTDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHNyY1swXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCsxMCk7CisgICAgc3JjWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KzEyKTsKKyAgICBzcmNbMl0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBvZmZzZXQrMTQpOworICAgIGFpZCA9IHpmQXBGaW5kU3RhKGRldiwgc3JjKTsKKworICAgIGFjID0gKHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDI0KSAmIDB4Rik7CisKKyAgICAvLyBtYXJrIGJ5IHNwaW4gbG9jayBkZWJ1ZworICAgIC8vem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGZvciAoaT0wOyBpPFpNX0FHR19QT09MX1NJWkUgOyBpKyspCisgICAgeworICAgICAgICBpZigod2QtPnRpZF9yeFtpXS0+YWlkID09IGFpZCkgJiYgKHdkLT50aWRfcnhbaV0tPmFjID09IGFjKSkKKyAgICAgICAgeworICAgICAgICAgICAgdGlkX3J4ID0gd2QtPnRpZF9yeFtpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gbWFyayBieSBzcGluIGxvY2sgZGVidWcKKyAgICAvL3ptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgcmV0dXJuIHRpZF9yeDsKK30KKworCit1MTZfdCAgIHpmQWdnUnhFbnF1ZXVlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IGFnZ190aWRfcnggKnRpZF9yeCwgc3RydWN0IHpzQWRkaXRpb25JbmZvICphZGRJbmZvKQoreworICAgIHUxNl90IHNlcV9ubywgb2Zmc2V0ID0gMDsKKyAgICB1MTZfdCBxX2luZGV4OworICAgIHMxNl90IGluZGV4OworICAgIHU4X3QgIGJkcm9wZnJhbWUgPSAwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIFpNX0JVRkZFUl9UUkFDRShkZXYsIGJ1ZikKKworICAgIHNlcV9ubyA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCsyMikgPj4gNDsKKyAgICBpbmRleCAgPSBzZXFfbm8gLSB0aWRfcngtPnNlcV9zdGFydDsKKworICAgIC8qCisgICAgICogc2VxdWVuY2UgbnVtYmVyIHdyYXAgYXQgNGsKKyAgICAgKiAtMTAwMDogY2hlY2sgZm9yIGR1cGxpY2F0ZSBwYXN0IHBhY2tldAorICAgICAqLworICAgIGJkcm9wZnJhbWUgPSAwOworICAgIGlmICh0aWRfcngtPnNlcV9zdGFydCA+IHNlcV9ubykgeworICAgICAgICBpZiAoKHRpZF9yeC0+c2VxX3N0YXJ0ID4gMzk2NykgJiYgKHNlcV9ubyA8IDEyOCkpIHsKKyAgICAgICAgICAgIGluZGV4ICs9IDQwOTY7CisgICAgICAgIH0gZWxzZSBpZiAodGlkX3J4LT5zZXFfc3RhcnQgLSBzZXFfbm8gPiA3MCkgeworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHRpZF9yeC0+c3FfYmVoaW5kX2NvdW50Kys7CisgICAgICAgICAgICBpZiAodGlkX3J4LT5zcV9iZWhpbmRfY291bnQgPiAzKSB7CisgICAgICAgICAgICAgICAgdGlkX3J4LT5zcV9iZWhpbmRfY291bnQgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBiZHJvcGZyYW1lID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBiZHJvcGZyYW1lID0gMTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzZXFfbm8gLSB0aWRfcngtPnNlcV9zdGFydCA+IDcwKSB7CisgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgdGlkX3J4LT5zcV9leGNlZWRfY291bnQrKzsKKyAgICAgICAgICAgIGlmICh0aWRfcngtPnNxX2V4Y2VlZF9jb3VudCA+IDMpIHsKKyAgICAgICAgICAgICAgICB0aWRfcngtPnNxX2V4Y2VlZF9jb3VudCA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJkcm9wZnJhbWUgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChiZHJvcGZyYW1lID09IDEpIHsKKyAgICAgICAgLyppZiAod2QtPnpmY2JSZWN2ODAyMTEgIT0gTlVMTCkgeworICAgICAgICAgICAgd2QtPnpmY2JSZWN2ODAyMTEoZGV2LCBidWYsIGFkZEluZm8pOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgemZpUmVjdjgwMjExKGRldiwgYnVmLCBhZGRJbmZvKTsKKyAgICAgICAgfSovCisKKyAgICAgICAgWk1fUEVSRk9STUFOQ0VfRlJFRShkZXYsIGJ1Zik7CisKKyAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgIC8qemZBZ2dSeEZsdXNoKGRldiwgc2VxX25vLCB0aWRfcngpOworICAgICAgICB0aWRfcngtPnNlcV9zdGFydCA9IHNlcV9ubzsKKyAgICAgICAgaW5kZXggPSBzZXFfbm8gLSB0aWRfcngtPnNlcV9zdGFydDsKKyAgICAgICAgKi8KKworICAgICAgICAvL0RiZ1ByaW50KCJGcmVlIGFuIG9sZCBwYWNrZXQsIHNlcV9zdGFydD0lZCwgc2VxX25vPSVkXG4iLCB0aWRfcngtPnNlcV9zdGFydCwgc2VxX25vKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBkdXBsaWNhdGUgcGFzdCBwYWNrZXQKKyAgICAgICAgICogaGFwcGVucyBvbmx5IGluIHNpbXVsYXRlZCBhZ2dyZWdhdGlvbiBlbnZpcm9ubWVudAorICAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgaWYgKHRpZF9yeC0+c3FfZXhjZWVkX2NvdW50ID4gMCl7CisgICAgICAgICAgICB0aWRfcngtPnNxX2V4Y2VlZF9jb3VudC0tOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRpZF9yeC0+c3FfYmVoaW5kX2NvdW50ID4gMCkgeworICAgICAgICAgICAgdGlkX3J4LT5zcV9iZWhpbmRfY291bnQtLTsKKyAgICAgICAgfQorICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIH0KKworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgemZBZ2dSeEZsdXNoKGRldiwgc2VxX25vLCB0aWRfcngpOworICAgICAgICB0aWRfcngtPnNlcV9zdGFydCA9IHNlcV9ubzsKKyAgICAgICAgaW5kZXggPSAwOworICAgIH0KKworICAgIC8vaWYgKGluZGV4ID49IChaTV9BR0dfQkFXX1NJWkUgLSAxKSkKKyAgICBpZiAoaW5kZXggPj0gKFpNX0FHR19CQVdfTUFTSykpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBxdWV1ZSBmdWxsCisgICAgICAgICAqLworICAgICAgICAvL0RiZ1ByaW50KCJpbmRleCA+PSA2NCwgc2VxX3N0YXJ0PSVkLCBzZXFfbm89JWRcbiIsIHRpZF9yeC0+c2VxX3N0YXJ0LCBzZXFfbm8pOworICAgICAgICB6ZkFnZ1J4Rmx1c2goZGV2LCBzZXFfbm8sIHRpZF9yeCk7CisgICAgICAgIC8vdGlkX3J4LT5zZXFfc3RhcnQgPSBzZXFfbm87CisgICAgICAgIGluZGV4ID0gc2VxX25vIC0gdGlkX3J4LT5zZXFfc3RhcnQ7CisgICAgICAgIGlmICgodGlkX3J4LT5zZXFfc3RhcnQgPiBzZXFfbm8pICYmICh0aWRfcngtPnNlcV9zdGFydCA+IDEwMDApICYmICh0aWRfcngtPnNlcV9zdGFydCAtIDEwMDApID4gc2VxX25vKQorICAgICAgICB7CisgICAgICAgIC8vaW5kZXggPSBzZXFfbm8gLSB0aWRfcngtPnNlcV9zdGFydDsKKyAgICAgICAgICAgIGluZGV4ICs9IDQwOTY7CisgICAgICAgIH0KKyAgICAgICAgLy9pbmRleCA9IHNlcV9ubyAtIHRpZF9yeC0+c2VxX3N0YXJ0OworICAgICAgICB3aGlsZSAoaW5kZXggPj0gKFpNX0FHR19CQVdfTUFTSykpIHsKKyAgICAgICAgICAgIC8vRGJnUHJpbnQoImluZGV4ID49IDY0LCBzZXFfc3RhcnQ9JWQsIHNlcV9ubz0lZFxuIiwgdGlkX3J4LT5zZXFfc3RhcnQsIHNlcV9ubyk7CisgICAgICAgICAgICB0aWRfcngtPnNlcV9zdGFydCA9ICh0aWRfcngtPnNlcV9zdGFydCArIFpNX0FHR19CQVdfTUFTSykgJiAoNDA5NiAtIDEpOworICAgICAgICAgICAgaW5kZXggPSBzZXFfbm8gLSB0aWRfcngtPnNlcV9zdGFydDsKKyAgICAgICAgICAgIGlmICgodGlkX3J4LT5zZXFfc3RhcnQgPiBzZXFfbm8pICYmICh0aWRfcngtPnNlcV9zdGFydCA+IDEwMDApICYmICh0aWRfcngtPnNlcV9zdGFydCAtIDEwMDApID4gc2VxX25vKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGluZGV4ICs9IDQwOTY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHFfaW5kZXggPSAodGlkX3J4LT5iYXdfdGFpbCArIGluZGV4KSAmIFpNX0FHR19CQVdfTUFTSzsKKyAgICBpZiAodGlkX3J4LT5mcmFtZVtxX2luZGV4XS5idWYgJiYgKCgodGlkX3J4LT5iYXdfaGVhZCAtIHRpZF9yeC0+YmF3X3RhaWwpICYgWk1fQUdHX0JBV19NQVNLKSA+CisgICAgICAgICAgICAgICAgKCgocV9pbmRleCkgLSB0aWRfcngtPmJhd190YWlsKSAmIFpNX0FHR19CQVdfTUFTSykpKQorICAgIHsKKworICAgICAgICBaTV9QRVJGT1JNQU5DRV9EVVAoZGV2LCB0aWRfcngtPmZyYW1lW3FfaW5kZXhdLmJ1ZiwgYnVmKTsKKyAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgIC8vRGJnUHJpbnQoIkZyZWUgYSBkdXBsaWNhdGUgcGFja2V0LCBzZXFfc3RhcnQ9JWQsIHNlcV9ubz0lZFxuIiwgdGlkX3J4LT5zZXFfc3RhcnQsIHNlcV9ubyk7CisgICAgICAgIC8vRGJnUHJpbnQoImhlYWQ9JWQsIHRhaWw9JWQiLCB0aWRfcngtPmJhd19oZWFkLCB0aWRfcngtPmJhd190YWlsKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogZHVwbGljYXRlIHBhY2tldAorICAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZih0aWRfcngtPmZyYW1lW3FfaW5kZXhdLmJ1ZikgeworICAgICAgICB6ZndCdWZGcmVlKGRldiwgdGlkX3J4LT5mcmFtZVtxX2luZGV4XS5idWYsIDApOworICAgICAgICB0aWRfcngtPmZyYW1lW3FfaW5kZXhdLmJ1ZiA9IDA7CisgICAgfQorCisgICAgdGlkX3J4LT5mcmFtZVtxX2luZGV4XS5idWYgPSBidWY7CisgICAgdGlkX3J4LT5mcmFtZVtxX2luZGV4XS5hcnJpdmFsVGltZSA9IHptX2FnZ19HZXRUaW1lKCk7CisgICAgemZ3TWVtb3J5Q29weSgodm9pZCopJnRpZF9yeC0+ZnJhbWVbcV9pbmRleF0uYWRkSW5mbywgKHZvaWQqKWFkZEluZm8sIHNpemVvZihzdHJ1Y3QgenNBZGRpdGlvbkluZm8pKTsKKworICAgIC8qCisgICAgICogZm9yIGRlYnVnIHNpbXVsYXRlZCBhZ2dyZWdhdGlvbiBvbmx5LAorICAgICAqIHNob3VsZCBiZSBkb25lIGluIHJ4IG9mIEFEREJBIFJlcXVlc3QKKyAgICAgKi8KKyAgICAvL3RpZF9yeC0+YWRkSW5mbyA9IGFkZEluZm87CisKKworICAgIGlmICgoKHRpZF9yeC0+YmF3X2hlYWQgLSB0aWRfcngtPmJhd190YWlsKSAmIFpNX0FHR19CQVdfTUFTSykgPD0gaW5kZXgpCisgICAgeworICAgICAgICAvL3RpZF9yeC0+YmF3X3NpemUgPSBpbmRleCArIDE7CisgICAgICAgIGlmICgoKHRpZF9yeC0+YmF3X2hlYWQgLSB0aWRfcngtPmJhd190YWlsKSAmIFpNX0FHR19CQVdfTUFTSykgPD0KKyAgICAgICAgICAgICAgICAvLygocV9pbmRleCArIDEpICYgWk1fQUdHX0JBV19NQVNLKSkKKyAgICAgICAgICAgICAgICAoKChxX2luZGV4KSAtIHRpZF9yeC0+YmF3X3RhaWwpICYgWk1fQUdHX0JBV19NQVNLKSkvL3RpZF9yeC0+YmF3X3NpemUgKQorICAgICAgICAgICAgdGlkX3J4LT5iYXdfaGVhZCA9IChxX2luZGV4ICsgMSkgJiBaTV9BR0dfQkFXX01BU0s7CisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAvKgorICAgICAqIHN1Y2Nlc3MKKyAgICAgKi8KKyAgICAvL0RiZ1ByaW50KCJoZWFkPSVkLCB0YWlsPSVkLCBzdGFydD0lZCIsIHRpZF9yeC0+YmF3X2hlYWQsIHRpZF9yeC0+YmF3X3RhaWwsIHRpZF9yeC0+c2VxX3N0YXJ0KTsKKyAgICByZXR1cm4gMTsKK30KKwordTE2X3QgemZBZ2dSeEZsdXNoKHpkZXZfdCogZGV2LCB1MTZfdCBzZXFfbm8sIHN0cnVjdCBhZ2dfdGlkX3J4ICp0aWRfcngpCit7CisgICAgemJ1Zl90KiBwYnVmOworICAgIHUxNl90ICAgc2VxOworICAgIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyBhZGRJbmZvOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgWk1fUEVSRk9STUFOQ0VfUlhfRkxVU0goZGV2KTsKKworICAgIHdoaWxlICgxKQorICAgIHsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgaWYgKHRpZF9yeC0+YmF3X3RhaWwgPT0gdGlkX3J4LT5iYXdfaGVhZCkgeworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcGJ1ZiA9IHRpZF9yeC0+ZnJhbWVbdGlkX3J4LT5iYXdfdGFpbF0uYnVmOworICAgICAgICB6ZndNZW1vcnlDb3B5KCh2b2lkKikmYWRkSW5mbywgKHZvaWQqKSZ0aWRfcngtPmZyYW1lW3RpZF9yeC0+YmF3X3RhaWxdLmFkZEluZm8sIHNpemVvZihzdHJ1Y3QgenNBZGRpdGlvbkluZm8pKTsKKyAgICAgICAgdGlkX3J4LT5mcmFtZVt0aWRfcngtPmJhd190YWlsXS5idWYgPSAwOworICAgICAgICAvL2lmKHBidWYgJiYgdGlkX3J4LT5iYXdfc2l6ZSA+IDApIHRpZF9yeC0+YmF3X3NpemUtLTsKKyAgICAgICAgdGlkX3J4LT5iYXdfdGFpbCA9ICh0aWRfcngtPmJhd190YWlsICsgMSkgJiBaTV9BR0dfQkFXX01BU0s7CisgICAgICAgIHRpZF9yeC0+c2VxX3N0YXJ0ID0gKHRpZF9yeC0+c2VxX3N0YXJ0ICsgMSkgJiAoNDA5NiAtIDEpOworCSAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIGlmIChwYnVmKQorICAgICAgICB7CisKKyAgICAgICAgICAgIFpNX1BFUkZPUk1BTkNFX1JYX1NFUShkZXYsIHBidWYpOworCisgICAgICAgICAgICBpZiAod2QtPnpmY2JSZWN2ODAyMTEgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZXEgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgcGJ1ZiwgMjIpID4+IDQ7CisgICAgICAgICAgICAgICAgLy9EYmdQcmludCgiUmVjdiBpbmRpY2F0ZSBzZXE9JWRcbiIsIHNlcSk7CisgICAgICAgICAgICAgICAgLy9EYmdQcmludCgiMi4gc2VxPSVkXG4iLCBzZXEpOworICAgICAgICAgICAgICAgIHdkLT56ZmNiUmVjdjgwMjExKGRldiwgcGJ1ZiwgJmFkZEluZm8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlcSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBwYnVmLCAyMikgPj4gNDsKKyAgICAgICAgICAgICAgICAvL0RiZ1ByaW50KCJSZWN2IGluZGljYXRlIHNlcT0lZFxuIiwgc2VxKTsKKyAgICAgICAgICAgICAgICB6ZmlSZWN2ODAyMTEoZGV2LCBwYnVmLCAmYWRkSW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHRpZF9yeC0+YmF3X2hlYWQgPSB0aWRfcngtPmJhd190YWlsID0gMDsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHJldHVybiAxOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmQWdnUnhGcmVlQnVmICAgICAgICAgICAgICAqLworLyogICAgICBGcmVlcyBhbGwgcXVldWVkIHBhY2tldHMgaW4gYnVmZmVyIHdoZW4gdGhlIGRyaXZlciBpcyBkb3duLiAgICAgKi8KKy8qICAgICAgVGhlIHpmRnJlZVJlc291cmNlKCkgd2lsbCBjaGVjayBpZiB0aGUgYnVmZmVyIGlzIGFsbCBmcmVlZC4gICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2ICAgICA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgWk1fU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgSG9uZGEgICAgICAgICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDYuMTIgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90ICAgemZBZ2dSeEZyZWVCdWYoemRldl90KiBkZXYsIHUxNl90IGRlc3Ryb3kpCit7CisgICAgdTE2X3QgICBpOworICAgIHpidWZfdCogYnVmOworICAgIHN0cnVjdCBhZ2dfdGlkX3J4ICp0aWRfcng7CisKKyAgICBUSURfVFggIHRpZF90eDsKKyAgICAvL3N0cnVjdCBidWZJbmZvICpidWZfaW5mbzsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgZm9yIChpPTA7IGk8Wk1fQUdHX1BPT0xfU0laRTsgaSsrKQorICAgIHsKKyAgICAgICAgdTE2X3QgajsKKworICAgICAgICB0aWRfcnggPSB3ZC0+dGlkX3J4W2ldOworCisgICAgICAgIGZvcihqPTA7IGogPD0gWk1fQUdHX0JBV19TSVpFOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICBidWYgPSB0aWRfcngtPmZyYW1lW2pdLmJ1ZjsKKyAgICAgICAgICAgIHRpZF9yeC0+ZnJhbWVbal0uYnVmID0gMDsKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgIGlmIChidWYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjaWYgMAorICAgICAgICBpZiAoIHRpZF9yeC0+YmF3X2hlYWQgIT0gdGlkX3J4LT5iYXdfdGFpbCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlICh0aWRfcngtPmJhd19oZWFkICE9IHRpZF9yeC0+YmF3X3RhaWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnVmID0gdGlkX3J4LT5mcmFtZVt0aWRfcngtPmJhd190YWlsXS5idWY7CisgICAgICAgICAgICAgICAgdGlkX3J4LT5mcmFtZVt0aWRfcngtPmJhd190YWlsXS5idWYgPSAwOworICAgICAgICAgICAgICAgIGlmIChidWYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKworICAgICAgICAgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgICAgICAgICB0aWRfcngtPmZyYW1lW3RpZF9yeC0+YmF3X3RhaWxdLmJ1ZiA9IDA7CisgICAgICAgICAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgLy9pZiAodGlkX3J4LT5iYXdfc2l6ZSA+IDApdGlkX3J4LT5iYXdfc2l6ZS0tOworICAgICAgICAgICAgICAgIHRpZF9yeC0+YmF3X3RhaWwgPSAodGlkX3J4LT5iYXdfdGFpbCArIDEpICYgWk1fQUdHX0JBV19NQVNLOworICAgICAgICAgICAgICAgIHRpZF9yeC0+c2VxX3N0YXJ0Kys7CisgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAjZW5kaWYKKworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB0aWRfcngtPnNlcV9zdGFydCA9IDA7CisgICAgICAgIHRpZF9yeC0+YmF3X2hlYWQgPSB0aWRfcngtPmJhd190YWlsID0gMDsKKyAgICAgICAgdGlkX3J4LT5haWQgPSBaTV9NQVhfU1RBX1NVUFBPUlQ7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9BR0dSRUdBVElPTgorICAgICAgICAjaWZuZGVmIFpNX0VOQUJMRV9GV19CQV9SRVRSQU5TTUlTU0lPTiAvL2Rpc2FibGUgQkFXCisgICAgICAgIGlmICh0aWRfYmF3LT5lbmFibGVkKSB7CisgICAgICAgICAgICB6bV9tc2cxX2FnZyhaTV9MVl8wLCAiRGV2aWNlIGRvd24sIGNsZWFyIEJBVyBxdWV1ZToiLCBpKTsKKyAgICAgICAgICAgIEJBVy0+ZGlzYWJsZShkZXYsIHRpZF9iYXcpOworICAgICAgICB9CisgICAgICAgICNlbmRpZgorICAgICAgICAjZW5kaWYKKyAgICAgICAgaWYgKDEgPT0gd2QtPmFnZ1FQb29sW2ldLT5hZ2dRRW5hYmxlZCkgeworICAgICAgICAgICAgdGlkX3R4ID0gd2QtPmFnZ1FQb29sW2ldOworICAgICAgICAgICAgYnVmID0gemZBZ2dUeEdldFZ0eHEoZGV2LCB0aWRfdHgpOworICAgICAgICAgICAgd2hpbGUgKGJ1ZikgeworICAgICAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgICAgICAgICAgICAgIGJ1ZiA9IHpmQWdnVHhHZXRWdHhxKGRldiwgdGlkX3R4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKGRlc3Ryb3kpIHsKKyAgICAgICAgICAgIHpmd01lbUZyZWUoZGV2LCB3ZC0+YWdnUVBvb2xbaV0sIHNpemVvZihzdHJ1Y3QgYWdnUXVldWUpKTsKKyAgICAgICAgICAgIHpmd01lbUZyZWUoZGV2LCB3ZC0+dGlkX3J4W2ldLCBzaXplb2Yoc3RydWN0IGFnZ190aWRfcngpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAjaWZkZWYgWk1fRU5BQkxFX0FHR1JFR0FUSU9OCisgICAgI2lmbmRlZiBaTV9FTkFCTEVfRldfQkFfUkVUUkFOU01JU1NJT04gLy9kaXNhYmxlIEJBVworICAgIGlmKGRlc3Ryb3kpIHpmd01lbUZyZWUoZGV2LCBCQVcsIHNpemVvZihzdHJ1Y3QgYmF3X2VuYWJsZXIpKTsKKyAgICAjZW5kaWYKKyAgICAjZW5kaWYKKyAgICByZXR1cm4gWk1fU1VDQ0VTUzsKK30KKworCit2b2lkIHpmQWdnUmVjdkJBUih6ZGV2X3QqIGRldiwgemJ1Zl90ICpidWYpIHsKKyAgICB1MTZfdCBzdGFydF9zZXEsIGxlbjsKKyAgICB1OF90IGksIGJpdG1hcFs4XTsKKyAgICBsZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKyAgICBzdGFydF9zZXEgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBsZW4tMik7CisgICAgRGJnUHJpbnQoIlJlY2VpdmVkIGEgQkFSIENvbnRyb2wgZnJhbWUsIHN0YXJ0X3NlcT0lZCIsIHN0YXJ0X3NlcT4+NCk7CisgICAgLyogdG9kbzogc2V0IHRoZSBiaXRtYXAgYnkgcmVvcmRlcmluZyBidWZmZXIhICovCisgICAgZm9yIChpPTA7IGk8ODsgaSsrKSBiaXRtYXBbaV09MDsKKyAgICB6ZlNlbmRCQShkZXYsIHN0YXJ0X3NlcSwgYml0bWFwKTsKK30KKworI2lmZGVmIFpNX0VOQUJMRV9BR0dSRUdBVElPTgorI2lmbmRlZiBaTV9FTkFCTEVfRldfQkFfUkVUUkFOU01JU1NJT04gLy9kaXNhYmxlIEJBVwordm9pZCB6ZkFnZ1R4UmV0cmFuc21pdCh6ZGV2X3QqIGRldiwgc3RydWN0IGJ1ZkluZm8gKmJ1Zl9pbmZvLCBzdHJ1Y3QgYWdnQ29udHJvbCAqYWdnQ29udHJvbCwgVElEX1RYIHRpZF90eCkgeworICAgIHUxNl90IHJlbW92ZUxlbjsKKyAgICB1MTZfdCBlcnI7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgaWYgKGFnZ0NvbnRyb2wgJiYgKFpNX0FHR19GSVJTVF9NUERVID09IGFnZ0NvbnRyb2wtPmFtcGR1SW5kaWNhdGlvbikgKSB7CisgICAgICAgIHRpZF90eC0+YmFyX3NzbiA9IGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5oZWFkZXJbMTVdOworICAgICAgICBhZ2dDb250cm9sLT50aWRfYmF3LT5zdGFydF9zZXEgPSB0aWRfdHgtPmJhcl9zc24gPj4gNDsKKyAgICAgICAgem1fbXNnMV9hZ2coWk1fTFZfMCwgInN0YXJ0IHNlcT0iLCB0aWRfdHgtPmJhcl9zc24gPj4gNCk7CisgICAgfQorICAgIGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5oZWFkZXJbNF0gfD0gKDEgPDwgMTEpOworICAgIGlmIChhZ2dDb250cm9sICYmIGFnZ0NvbnRyb2wtPmFnZ0VuYWJsZWQpIHsKKyAgICAgICAgLy9pZiAod2QtPmVuYWJsZUFnZ3JlZ2F0aW9uPT0wICYmICEoYnVmX2luZm8tPmJhd19oZWFkZXItPmhlYWRlcls2XSYweDEpKQorICAgICAgICAvL3sKKyAgICAgICAgICAgIC8vaWYgKCgoYnVmX2luZm8tPmJhd19oZWFkZXItPmhlYWRlclsyXSAmIDB4MykgPT0gMikpCisgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgICAgICAvKiBFbmFibGUgYWdncmVnYXRpb24gKi8KKyAgICAgICAgICAgICAgICBidWZfaW5mby0+YmF3X2hlYWRlci0+aGVhZGVyWzFdIHw9IDB4MjA7CisgICAgICAgICAgICAgICAgaWYgKFpNX0FHR19MQVNUX01QRFUgPT0gYWdnQ29udHJvbC0+YW1wZHVJbmRpY2F0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5oZWFkZXJbMV0gfD0gMHg0MDAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmX2luZm8tPmJhd19oZWFkZXItPmhlYWRlclsxXSAmPSB+MHg0MDAwOworICAgICAgICAgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzAoIlpNX0FHR19MQVNUX01QRFUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAvL30KKyAgICAgICAgICAgIC8vZWxzZSB7CisgICAgICAgICAgICAvLyAgICB6bV9kZWJ1Z19tc2cxKCJubyBhZ2dyLCBoZWFkZXJbMl0mMHgzID0gIixidWZfaW5mby0+YmF3X2hlYWRlci0+aGVhZGVyWzJdICYgMHgzKQorICAgICAgICAgICAgLy8gICAgYWdnQ29udHJvbC0+YWdnRW5hYmxlZCA9IDA7CisgICAgICAgICAgICAvL30KKyAgICAgICAgLy99CisgICAgICAgIC8vZWxzZSB7CisgICAgICAgIC8vICAgIHptX2RlYnVnX21zZzEoIm5vIGFnZ3IsIHdkLT5lbmFibGVBZ2dyZWdhdGlvbiA9ICIsIHdkLT5lbmFibGVBZ2dyZWdhdGlvbik7CisgICAgICAgIC8vICAgIHptX2RlYnVnX21zZzEoIm5vIGFnZ3IsICFoZWFkZXJbNl0mMHgxID0gIiwhKGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5oZWFkZXJbNl0mMHgxKSk7CisgICAgICAgIC8vICAgIGFnZ0NvbnRyb2wtPmFnZ0VuYWJsZWQgPSAwOworICAgICAgICAvL30KKyAgICB9CisKKyAgICAvKmlmIChhZ2dDb250cm9sLT50aWRfYmF3KSB7CisgICAgICAgIHN0cnVjdCBiYXdfaGVhZGVyX3IgaGVhZGVyX3I7CisKKyAgICAgICAgaGVhZGVyX3IuaGVhZGVyICAgICAgPSBidWZfaW5mby0+YmF3X2hlYWRlci0+aGVhZGVyOworICAgICAgICBoZWFkZXJfci5taWMgICAgICAgICA9IGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5taWM7CisgICAgICAgIGhlYWRlcl9yLnNuYXAgICAgICAgID0gYnVmX2luZm8tPmJhd19oZWFkZXItPnNuYXA7CisgICAgICAgIGhlYWRlcl9yLmhlYWRlckxlbiAgID0gYnVmX2luZm8tPmJhd19oZWFkZXItPmhlYWRlckxlbjsKKyAgICAgICAgaGVhZGVyX3IubWljTGVuICAgICAgPSBidWZfaW5mby0+YmF3X2hlYWRlci0+bWljTGVuOworICAgICAgICBoZWFkZXJfci5zbmFwTGVuICAgICA9IGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5zbmFwTGVuOworICAgICAgICBoZWFkZXJfci5yZW1vdmVMZW4gICA9IGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5yZW1vdmVMZW47CisgICAgICAgIGhlYWRlcl9yLmtleUlkeCAgICAgID0gYnVmX2luZm8tPmJhd19oZWFkZXItPmtleUlkeDsKKworICAgICAgICBCQVctPmluc2VydChkZXYsIGJ1Zl9pbmZvLT5idWYsIHRpZF90eC0+YmFyX3NzbiA+PiA0LCBhZ2dDb250cm9sLT50aWRfYmF3LCBidWZfaW5mby0+YmF3X3JldHJhbnNtaXQsICZoZWFkZXJfcik7CisgICAgfSovCisKKyAgICBpZiAoKGVyciA9IHpmSHBTZW5kKGRldiwKKyAgICAgICAgICAgICAgICAgICAgYnVmX2luZm8tPmJhd19oZWFkZXItPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgYnVmX2luZm8tPmJhd19oZWFkZXItPmhlYWRlckxlbiwKKyAgICAgICAgICAgICAgICAgICAgYnVmX2luZm8tPmJhd19oZWFkZXItPnNuYXAsCisgICAgICAgICAgICAgICAgICAgIGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5zbmFwTGVuLAorICAgICAgICAgICAgICAgICAgICBidWZfaW5mby0+YmF3X2hlYWRlci0+bWljLAorICAgICAgICAgICAgICAgICAgICBidWZfaW5mby0+YmF3X2hlYWRlci0+bWljTGVuLAorICAgICAgICAgICAgICAgICAgICBidWZfaW5mby0+YnVmLAorICAgICAgICAgICAgICAgICAgICBidWZfaW5mby0+YmF3X2hlYWRlci0+cmVtb3ZlTGVuLAorICAgICAgICAgICAgICAgICAgICBaTV9FWFRFUk5BTF9BTExPQ19CVUYsCisgICAgICAgICAgICAgICAgICAgICh1OF90KXRpZF90eC0+YWMsCisgICAgICAgICAgICAgICAgICAgIGJ1Zl9pbmZvLT5iYXdfaGVhZGVyLT5rZXlJZHgpKSAhPSBaTV9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgZ290byB6bEVycm9yOworICAgIH0KKworICAgIHJldHVybjsKKworemxFcnJvcjoKKyAgICB6ZndCdWZGcmVlKGRldiwgYnVmX2luZm8tPmJ1ZiwgMCk7CisgICAgcmV0dXJuOworCit9CisjZW5kaWYgLy9kaXNhYmxlIEJBVworI2VuZGlmCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBZ2dUeFNlbmRFdGggICAgICAgICAgICAgICovCisvKiAgICAgIENhbGxlZCB0byB0cmFuc21pdCBFdGhlcm5ldCBmcmFtZSBmcm9tIHVwcGVyIGVsYXllci4gICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWYgOiBidWZmZXIgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcG9ydCA6IFdMQU4gcG9ydCwgMD0+c3RhbmRhcmQsIDB4MTAtMHgxNz0+VkFQLCAweDIwLTB4MjU9PldEUyAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiwgSG9uZGEgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJbmMuICAgIDIwMDYuMTIgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmQWdnVHhTZW5kRXRoKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCwgdTE2X3QgYnVmVHlwZSwgdThfdCBmbGFnLCBzdHJ1Y3QgYWdnQ29udHJvbCAqYWdnQ29udHJvbCwgVElEX1RYIHRpZF90eCkKK3sKKyAgICB1MTZfdCBlcnI7CisgICAgLy91MTZfdCBhZGRyVGJsU2l6ZTsKKyAgICAvL3N0cnVjdCB6c0FkZHJUYmwgYWRkclRibDsKKyAgICB1MTZfdCByZW1vdmVMZW47CisgICAgdTE2X3QgaGVhZGVyWyg4KzMwKzIrMTgpLzJdOyAgICAvKiBjdHIrKDQrYTErYTIrYTMrMithNCkrcW9zK2l2ICovCisgICAgdTE2X3QgaGVhZGVyTGVuOworICAgIHUxNl90IG1pY1s4LzJdOworICAgIHUxNl90IG1pY0xlbjsKKyAgICB1MTZfdCBzbmFwWzgvMl07CisgICAgdTE2X3Qgc25hcExlbjsKKyAgICB1MTZfdCBmcmFnTGVuOworICAgIHUxNl90IGZyYW1lTGVuOworICAgIHUxNl90IGZyYWdOdW07CisgICAgc3RydWN0IHpzRnJhZyBmcmFnOworICAgIHUxNl90IGksIGlkOworICAgIHUxNl90IGRhWzNdOworICAgIHUxNl90IHNhWzNdOworICAgIHU4X3QgdXA7CisgICAgdThfdCBxb3NUeXBlLCBrZXlJZHggPSAwOworICAgIHUxNl90IGZyYWdPZmY7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem1fbXNnMV90eChaTV9MVl8yLCAiemZUeFNlbmRFdGgoKSwgcG9ydD0iLCBwb3J0KTsKKworICAgIC8qIEdldCBJUCBUT1MgZm9yIFFvUyBBQyBhbmQgSVAgZnJhZyBvZmZzZXQgKi8KKyAgICB6ZlR4R2V0SXBUb3NBbmRGcmFnKGRldiwgYnVmLCAmdXAsICZmcmFnT2ZmKTsKKworI2lmZGVmIFpNX0VOQUJMRV9OQVRJVkVfV0lGSQorICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgIHsKKyAgICAgICAgLyogREEgKi8KKyAgICAgICAgZGFbMF0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAxNik7CisgICAgICAgIGRhWzFdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTgpOworICAgICAgICBkYVsyXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDIwKTsKKyAgICAgICAgLyogU0EgKi8KKyAgICAgICAgc2FbMF0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAxMCk7CisgICAgICAgIHNhWzFdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTIpOworICAgICAgICBzYVsyXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDE0KTsKKyAgICB9CisgICAgZWxzZSBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MgKQorICAgIHsKKyAgICAgICAgLyogREEgKi8KKyAgICAgICAgZGFbMF0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCA0KTsKKyAgICAgICAgZGFbMV0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCA2KTsKKyAgICAgICAgZGFbMl0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCA4KTsKKyAgICAgICAgLyogU0EgKi8KKyAgICAgICAgc2FbMF0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAxMCk7CisgICAgICAgIHNhWzFdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTIpOworICAgICAgICBzYVsyXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDE0KTsKKyAgICB9CisgICAgZWxzZSBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQICkKKyAgICB7CisgICAgICAgIC8qIERBICovCisgICAgICAgIGRhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNCk7CisgICAgICAgIGRhWzFdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNik7CisgICAgICAgIGRhWzJdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgOCk7CisgICAgICAgIC8qIFNBICovCisgICAgICAgIHNhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTYpOworICAgICAgICBzYVsxXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDE4KTsKKyAgICAgICAgc2FbMl0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAyMCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vCisgICAgfQorI2Vsc2UKKyAgICAvKiBEQSAqLworICAgIGRhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMCk7CisgICAgZGFbMV0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAyKTsKKyAgICBkYVsyXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDQpOworICAgIC8qIFNBICovCisgICAgc2FbMF0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCA2KTsKKyAgICBzYVsxXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDgpOworICAgIHNhWzJdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTApOworI2VuZGlmCisgICAgLy9EZWNpZGUgS2V5IEluZGV4IGluIEFUT00sIE5vIG1lYW5pbmcgaW4gT1RVUy0tQ1dZYW5nKG0pCisgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgIHsKKyAgICAgICAga2V5SWR4ID0gd2QtPmFwLmJjSGFsS2V5SWR4W3BvcnRdOworICAgICAgICBpZCA9IHpmQXBGaW5kU3RhKGRldiwgZGEpOworICAgICAgICBpZiAoaWQgIT0gMHhmZmZmKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKHdkLT5hcC5zdGFUYWJsZVtpZF0uZW5jcnlNb2RlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBaTV9BRVM6CisgICAgICAgICAgICBjYXNlIFpNX1RLSVA6CisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgIGNhc2UgWk1fQ0VOQzoKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICAgICAga2V5SWR4ID0gd2QtPmFwLnN0YVRhYmxlW2lkXS5rZXlJZHg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3dpdGNoICh3ZC0+c3RhLmVuY3J5TW9kZSkKKyAgICAgICAgeworICAgICAgICBjYXNlIFpNX1dFUDY0OgorICAgICAgICBjYXNlIFpNX1dFUDEyODoKKyAgICAgICAgY2FzZSBaTV9XRVAyNTY6CisgICAgICAgICAgICBrZXlJZHggPSB3ZC0+c3RhLmtleUlkOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgWk1fQUVTOgorICAgICAgICBjYXNlIFpNX1RLSVA6CisgICAgICAgICAgICBpZiAoKGRhWzBdJiAweDEpKQorICAgICAgICAgICAgICAgIGtleUlkeCA9IDU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAga2V5SWR4ID0gNDsKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgICAgIGNhc2UgWk1fQ0VOQzoKKyAgICAgICAgICAgIGtleUlkeCA9IHdkLT5zdGEuY2VuY0tleUlkOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICB9CisgICAgfQorCisgICAgLyogQ3JlYXRlIFNOQVAgKi8KKyAgICByZW1vdmVMZW4gPSB6ZlR4R2VuV2xhblNuYXAoZGV2LCBidWYsIHNuYXAsICZzbmFwTGVuKTsKKyAgICAvL3ptX21zZzFfdHgoWk1fTFZfMCwgImZyYWdPZmY9IiwgZnJhZ09mZik7CisKKyAgICBmcmFnTGVuID0gd2QtPmZyYWdUaHJlc2hvbGQ7CisgICAgZnJhbWVMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKyAgICBmcmFtZUxlbiAtPSByZW1vdmVMZW47CisKKyNpZiAwCisgICAgLyogQ3JlYXRlIE1JQyAqLworICAgIGlmICggKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFKSYmCisgICAgICAgICAod2QtPnN0YS5lbmNyeU1vZGUgPT0gWk1fVEtJUCkgKQorICAgIHsKKyAgICAgICAgaWYgKCBmcmFtZUxlbiA+IGZyYWdMZW4gKQorICAgICAgICB7CisgICAgICAgICAgICBtaWNMZW4gPSB6ZlR4R2VuV2xhblRhaWwoZGV2LCBidWYsIHNuYXAsIHNuYXBMZW4sIG1pYyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBhcHBlbmQgTUlDIGJ5IEhNQUMgKi8KKyAgICAgICAgICAgIG1pY0xlbiA9IDg7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbWljTGVuID0gMDsKKyAgICB9CisjZWxzZQorICAgIGlmICggZnJhbWVMZW4gPiBmcmFnTGVuICkKKyAgICB7CisgICAgICAgIG1pY0xlbiA9IHpmVHhHZW5XbGFuVGFpbChkZXYsIGJ1Ziwgc25hcCwgc25hcExlbiwgbWljKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogYXBwZW5kIE1JQyBieSBITUFDICovCisgICAgICAgIG1pY0xlbiA9IDA7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBBY2Nlc3MgQ2F0ZWdvcnkgKi8KKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgeworICAgICAgICB6ZkFwR2V0U3RhUW9zVHlwZShkZXYsIGRhLCAmcW9zVHlwZSk7CisgICAgICAgIGlmIChxb3NUeXBlID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVwID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+c3RhLndtZUNvbm5lY3RlZCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB1cCA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogVE9ETyA6IFNUQSBRb1MgY29udHJvbCBmaWVsZCAqLworICAgICAgICB1cCA9IDA7CisgICAgfQorCisgICAgLyogQXNzaWduIHNlcXVlbmNlIG51bWJlciAqLworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgZnJhZy5zZXFbMF0gPSAoKHdkLT5zZXFbemNVcFRvQWNbdXAmMHg3XV0rKykgPDwgNCk7CisgICAgaWYgKGFnZ0NvbnRyb2wgJiYgKFpNX0FHR19GSVJTVF9NUERVID09IGFnZ0NvbnRyb2wtPmFtcGR1SW5kaWNhdGlvbikgKSB7CisgICAgICAgIHRpZF90eC0+YmFyX3NzbiA9IGZyYWcuc2VxWzBdOworCisgICAgICAgIHptX21zZzFfYWdnKFpNX0xWXzAsICJzdGFydCBzZXE9IiwgdGlkX3R4LT5iYXJfc3NuID4+IDQpOworICAgIH0KKyAgICAvL3RpZF90eC0+YmF3X2J1Zlt0aWRfdHgtPmJhd19oZWFkLTFdLmJhd19zZXE9ZnJhZy5zZXFbMF07CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworCisgICAgICAgIGZyYWcuYnVmWzBdID0gYnVmOworICAgICAgICBmcmFnLmJ1ZlR5cGVbMF0gPSBidWZUeXBlOworICAgICAgICBmcmFnLmZsYWdbMF0gPSBmbGFnOworICAgICAgICBmcmFnTnVtID0gMTsKKworICAgIGZvciAoaT0wOyBpPGZyYWdOdW07IGkrKykKKyAgICB7CisgICAgICAgIC8qIENyZWF0ZSBXTEFOIGhlYWRlcihDb250cm9sIFNldHRpbmcgKyA4MDIuMTEgaGVhZGVyICsgSVYpICovCisgICAgICAgIGlmICh1cCAhPTAgKSB6bV9kZWJ1Z19tc2cxKCJ1cCBub3QgMCwgdXA9Iix1cCk7CisgICAgICAgIGhlYWRlckxlbiA9IHpmVHhHZW5XbGFuSGVhZGVyKGRldiwgZnJhZy5idWZbaV0sIGhlYWRlciwgZnJhZy5zZXFbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWcuZmxhZ1tpXSwgc25hcExlbittaWNMZW4sIHJlbW92ZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCwgZGEsIHNhLCB1cCwgJm1pY0xlbiwgc25hcCwgc25hcExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdnQ29udHJvbCk7CisKKyAgICAgICAgLyogR2V0IGJ1ZmZlciBETUEgYWRkcmVzcyAqLworICAgICAgICAvL2lmICgoYWRkclRibFNpemUgPSB6ZndCdWZNYXBEbWEoZGV2LCBmcmFnLmJ1ZltpXSwgJmFkZHJUYmwpKSA9PSAwKQorICAgICAgICAvL2lmICgoYWRkclRibFNpemUgPSB6ZndNYXBUeERtYShkZXYsIGZyYWcuYnVmW2ldLCAmYWRkclRibCkpID09IDApCisgICAgICAgIC8veworICAgICAgICAvLyAgICBlcnIgPSBaTV9FUlJfQlVGRkVSX0RNQV9BRERSOworICAgICAgICAvLyAgICBnb3RvIHpsRXJyb3I7CisgICAgICAgIC8vfQorCisgICAgICAgIC8qIEZsdXNoIGJ1ZmZlciBvbiBjYWNoZSAqLworICAgICAgICAvL3pmd0J1ZkZsdXNoKGRldiwgZnJhZy5idWZbaV0pOworCisjaWYgMAorICAgICAgICB6bV9tc2cxX3R4KFpNX0xWXzAsICJoZWFkZXJMZW49IiwgaGVhZGVyTGVuKTsKKyAgICAgICAgem1fbXNnMV90eChaTV9MVl8wLCAic25hcExlbj0iLCBzbmFwTGVuKTsKKyAgICAgICAgem1fbXNnMV90eChaTV9MVl8wLCAibWljTGVuPSIsIG1pY0xlbik7CisgICAgICAgIHptX21zZzFfdHgoWk1fTFZfMCwgInJlbW92ZUxlbj0iLCByZW1vdmVMZW4pOworICAgICAgICB6bV9tc2cxX3R4KFpNX0xWXzAsICJhZGRyVGJsU2l6ZT0iLCBhZGRyVGJsU2l6ZSk7CisgICAgICAgIHptX21zZzFfdHgoWk1fTFZfMCwgImZyYWcuYnVmVHlwZVswXT0iLCBmcmFnLmJ1ZlR5cGVbMF0pOworI2VuZGlmCisKKyAgICAgICAgZnJhZ0xlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBmcmFnLmJ1ZltpXSk7CisgICAgICAgIGlmICgoZGFbMF0mMHgxKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+Y29tbVRhbGx5LnR4VW5pY2FzdEZybSsrOworICAgICAgICAgICAgd2QtPmNvbW1UYWxseS50eFVuaWNhc3RPY3RldHMgKz0gKGZyYWdMZW4rc25hcExlbik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKGRhWzBdJiAweDEpKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+Y29tbVRhbGx5LnR4QnJvYWRjYXN0RnJtKys7CisgICAgICAgICAgICB3ZC0+Y29tbVRhbGx5LnR4QnJvYWRjYXN0T2N0ZXRzICs9IChmcmFnTGVuK3NuYXBMZW4pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPmNvbW1UYWxseS50eE11bHRpY2FzdEZybSsrOworICAgICAgICAgICAgd2QtPmNvbW1UYWxseS50eE11bHRpY2FzdE9jdGV0cyArPSAoZnJhZ0xlbitzbmFwTGVuKTsKKyAgICAgICAgfQorICAgICAgICB3ZC0+bGVkU3RydWN0LnR4VHJhZmZpYysrOworCisjaWYgMCAvL1dobyBjYXJlIHRoaXM/CisgICAgICAgIGlmICggKGkpJiYoaSA9PSAoZnJhZ051bS0xKSkgKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+dHJhZlRhbGx5LnR4RGF0YUJ5dGVDb3VudCAtPSBtaWNMZW47CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIC8qaWYgKGFnZ0NvbnRyb2wtPnRpZF9iYXcgJiYgYWdnQ29udHJvbC0+YWdnRW5hYmxlZCkgeworICAgICAgICAgICAgc3RydWN0IGJhd19oZWFkZXJfciBoZWFkZXJfcjsKKworICAgICAgICAgICAgaGVhZGVyX3IuaGVhZGVyICAgICAgPSBoZWFkZXI7CisgICAgICAgICAgICBoZWFkZXJfci5taWMgICAgICAgICA9IG1pYzsKKyAgICAgICAgICAgIGhlYWRlcl9yLnNuYXAgICAgICAgID0gc25hcDsKKyAgICAgICAgICAgIGhlYWRlcl9yLmhlYWRlckxlbiAgID0gaGVhZGVyTGVuOworICAgICAgICAgICAgaGVhZGVyX3IubWljTGVuICAgICAgPSBtaWNMZW47CisgICAgICAgICAgICBoZWFkZXJfci5zbmFwTGVuICAgICA9IHNuYXBMZW47CisgICAgICAgICAgICBoZWFkZXJfci5yZW1vdmVMZW4gICA9IHJlbW92ZUxlbjsKKyAgICAgICAgICAgIGhlYWRlcl9yLmtleUlkeCAgICAgID0ga2V5SWR4OworCisgICAgICAgICAgICBCQVctPmluc2VydChkZXYsIGJ1ZiwgdGlkX3R4LT5iYXJfc3NuID4+IDQsIGFnZ0NvbnRyb2wtPnRpZF9iYXcsIDAsICZoZWFkZXJfcik7CisgICAgICAgIH0qLworCisgICAgICAgIGlmICgoZXJyID0gemZIcFNlbmQoZGV2LCBoZWFkZXIsIGhlYWRlckxlbiwgc25hcCwgc25hcExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWljLCBtaWNMZW4sIGZyYWcuYnVmW2ldLCByZW1vdmVMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWcuYnVmVHlwZVtpXSwgemNVcFRvQWNbdXAmMHg3XSwga2V5SWR4KSkgIT0gWk1fU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgZ290byB6bEVycm9yOworICAgICAgICB9CisKKworICAgICAgICBjb250aW51ZTsKKworemxFcnJvcjoKKyAgICAgICAgaWYgKGZyYWcuYnVmVHlwZVtpXSA9PSBaTV9FWFRFUk5BTF9BTExPQ19CVUYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBmcmFnLmJ1ZltpXSwgZXJyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChmcmFnLmJ1ZlR5cGVbaV0gPT0gWk1fSU5URVJOQUxfQUxMT0NfQlVGKQorICAgICAgICB7CisgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgZnJhZy5idWZbaV0sIDApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fYXNzZXJ0KDApOworICAgICAgICB9CisgICAgfSAvKiBmb3IgKGk9MDsgaTxmcmFnTnVtOyBpKyspICovCisKKyAgICByZXR1cm4gWk1fU1VDQ0VTUzsKK30KKworLyoKKyAqIHpmQWdnU2VuZEFEREJBKCkgcmVmZXJzIHpmU2VuZE1tRnJhbWUoKSBpbiBjbW0uYworICovCit1MTZfdCAgIHpmQWdnU2VuZEFkZGJhUmVxdWVzdCh6ZGV2X3QqIGRldiwgdTE2X3QgKmRzdCwgdTE2X3QgYWMsIHUxNl90IHVwKQoreworICAgIHpidWZfdCogYnVmOworICAgIC8vdTE2X3QgYWRkclRibFNpemU7CisgICAgLy9zdHJ1Y3QgenNBZGRyVGJsIGFkZHJUYmw7CisgICAgLy91MTZfdCBlcnI7CisgICAgdTE2X3Qgb2Zmc2V0ID0gMDsKKyAgICB1MTZfdCBobGVuID0gMzI7CisgICAgdTE2X3QgaGVhZGVyWygyNCsyNSsxKS8yXTsKKyAgICB1MTZfdCB2YXAgPSAwOworICAgIHUxNl90IGk7CisgICAgdThfdCBlbmNyeXB0ID0gMDsKKworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisKKyAgICAvKgorICAgICAqIFRCRCA6IE1heGltdW0gc2l6ZSBvZiBtYW5hZ21lbnQgZnJhbWUKKyAgICAgKi8KKyAgICBpZiAoKGJ1ZiA9IHpmd0J1ZkFsbG9jYXRlKGRldiwgMTAyNCkpID09IE5VTEwpCisgICAgeworICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJBbGxvYyBtbSBidWYgRmFpbCEiKTsKKyAgICAgICAgcmV0dXJuIFpNX1NVQ0NFU1M7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBSZXNlcnZlIHJvb20gZm9yIHdsYW4gaGVhZGVyCisgICAgICovCisgICAgb2Zmc2V0ID0gaGxlbjsKKworICAgIC8qCisgICAgICogYWRkIGFkZGJhIGZyYW1lIGJvZHkKKyAgICAgKi8KKyAgICBvZmZzZXQgPSB6ZkFnZ1NldEFkZGJhRnJhbWVCb2R5KGRldiwgYnVmLCBvZmZzZXQsIGFjLCB1cCk7CisKKworICAgIHpmd0J1ZlNldFNpemUoZGV2LCBidWYsIG9mZnNldCk7CisKKyAgICAvKgorICAgICAqIENvcHkgd2xhbiBoZWFkZXIKKyAgICAgKi8KKyAgICB6ZkFnZ0dlbkFkZGJhSGVhZGVyKGRldiwgZHN0LCBoZWFkZXIsIG9mZnNldC1obGVuLCBidWYsIHZhcCwgZW5jcnlwdCk7CisgICAgZm9yIChpPTA7IGk8KGhsZW4+PjEpOyBpKyspCisgICAgeworICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgaSoyLCBoZWFkZXJbaV0pOworICAgIH0KKworICAgIC8qIEdldCBidWZmZXIgRE1BIGFkZHJlc3MgKi8KKyAgICAvL2lmICgoYWRkclRibFNpemUgPSB6ZndCdWZNYXBEbWEoZGV2LCBidWYsICZhZGRyVGJsKSkgPT0gMCkKKyAgICAvL2lmICgoYWRkclRibFNpemUgPSB6ZndNYXBUeERtYShkZXYsIGJ1ZiwgJmFkZHJUYmwpKSA9PSAwKQorICAgIC8veworICAgIC8vICAgIGdvdG8gemxFcnJvcjsKKyAgICAvL30KKworICAgIC8vem1fbXNnMl9tbShaTV9MVl8yLCAib2Zmc2V0PSIsIG9mZnNldCk7CisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJobGVuPSIsIGhsZW4pOworICAgIC8vem1fbXNnMl9tbShaTV9MVl8yLCAiYWRkclRibFNpemU9IiwgYWRkclRibFNpemUpOworICAgIC8vem1fbXNnMl9tbShaTV9MVl8yLCAiYWRkclRibC5sZW5bMF09IiwgYWRkclRibC5sZW5bMF0pOworICAgIC8vem1fbXNnMl9tbShaTV9MVl8yLCAiYWRkclRibC5waHlzQWRkcmxbMF09IiwgYWRkclRibC5waHlzQWRkcmxbMF0pOworICAgIC8vem1fbXNnMl9tbShaTV9MVl8yLCAiYnVmLT5kYXRhPSIsIGJ1Zi0+ZGF0YSk7CisKKyAgICAjaWYgMAorICAgIGlmICgoZXJyID0gemZIcFNlbmQoZGV2LCBOVUxMLCAwLCBOVUxMLCAwLCBOVUxMLCAwLCBidWYsIDAsCisgICAgICAgICAgICBaTV9JTlRFUk5BTF9BTExPQ19CVUYsIDAsIDB4ZmYpKSAhPSBaTV9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgZ290byB6bEVycm9yOworICAgIH0KKyAgICAjZWxzZQorICAgIHpmUHV0Vm1tcShkZXYsIGJ1Zik7CisgICAgemZQdXNoVnR4cShkZXYpOworICAgICNlbmRpZgorCisgICAgcmV0dXJuIFpNX1NVQ0NFU1M7CisKK30KKwordTE2X3QgICB6ZkFnZ1NldEFkZGJhRnJhbWVCb2R5KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1MTZfdCBhYywgdTE2X3QgdXApCit7CisgICAgdTE2X3QgYmFfcGFyYW1ldGVyLCBzdGFydF9zZXE7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisgICAgLyoKKyAgICAgKiBBRERCQSBSZXF1ZXN0IGZyYW1lIGJvZHkKKyAgICAgKi8KKworICAgIC8qCisgICAgICogQ2F0ZWdvcnkKKyAgICAgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDMpOworICAgIC8qCisgICAgICogQWN0aW9uIGRldGFpbHMgPSAwCisgICAgICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBaTV9XTEFOX0FEREJBX1JFUVVFU1RfRlJBTUUpOworICAgIC8qCisgICAgICogRGlhbG9nIFRva2VuID0gbm9uemVybworICAgICAqIFRCRDogZGVmaW5lIGhvdyB0byBnZXQgZGlhbG9nIHRva2VuPworICAgICAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMik7CisgICAgLyoKKyAgICAgKiBCbG9jayBBY2sgcGFyYW1ldGVyIHNldAorICAgICAqIEJBIHBvbGljeSA9IDEgZm9yIGltbWVkaWF0ZSBCQSwgMCBmb3IgZGVsYXllZCBCQQorICAgICAqIFRJRCg0Yml0cykgJiBidWZmZXIgc2l6ZSg0Yml0cykgKFRJRD11cCAmIGJ1ZmZlciBzaXplPTB4ODApCisgICAgICogVEJEOiBob3cgdG8gZ2V0IGJ1ZmZlciBzaXplPworICAgICAqIKJ6oneid6J3oneid6J3oneid6J3oneic6J3oneid6J3oneid6J3oneid6J3oneic6J3oneid6J3oneid6J3oneic6J3oneid6J3oneid6J3oneid6J3oneid6J3onsKKyAgICAgKiCieCAgICBCMCAgICCieCAgICBCMSAgICAgonggQjIgIEI1IKJ4IEI2ICAgICAgQjE1IKJ4CisgICAgICogonWid6J3oneid6J3oneid6J3oneid6Jxoneid6J3oneid6J3oneid6J3oneid6Jxoneid6J3oneid6J3oneid6Jxoneid6J3oneid6J3oneid6J3oneid6J3oneidAorICAgICAqIKJ4IFJlc2VydmVkIKJ4IEJBIHBvbGljeSCieCAgVElEICAgonggQnVmZmVyIHNpemUgongKKyAgICAgKiCifKJ3oneid6J3oneid6J3oneid6J3onKid6J3oneid6J3oneid6J3oneid6J3onKid6J3oneid6J3oneid6J3onKid6J3oneid6J3oneid6J3oneid6J3oneid6J9CisgICAgICovCisgICAgYmFfcGFyYW1ldGVyID0gMSA8PCAxMjsgICAgIC8vIGJ1ZmZlciBzaXplID0gMHg0MCg2NCkKKyAgICBiYV9wYXJhbWV0ZXIgfD0gdXAgPDwgMjsgICAgLy8gdGlkID0gdXAKKyAgICBiYV9wYXJhbWV0ZXIgfD0gMjsgICAgICAgICAgLy8gYmEgcG9saWN5ID0gMQorICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIGJhX3BhcmFtZXRlcik7CisgICAgb2Zmc2V0Kz0yOworICAgIC8qCisgICAgICogQkEgdGltZW91dCB2YWx1ZQorICAgICAqLworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIDApOworICAgIG9mZnNldCs9MjsKKyAgICAvKgorICAgICAqIEJBIHN0YXJ0aW5nIHNlcXVlbmNlIG51bWJlcgorICAgICAqIKJ6oneid6J3oneid6J3oneid6J3oneid6J3oneic6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J7CisgICAgICogonggQjAgICAgICAgQjMgonggQjQgICAgICAgICAgICAgIEIxNSCieAorICAgICAqIKJ1oneid6J3oneid6J3oneid6J3oneid6J3oneicaJ3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J0CisgICAgICogonggRnJhZyBudW0oMCkgonggQkEgc3RhcnRpbmcgc2VxIG51bSCieAorICAgICAqIKJ8oneid6J3oneid6J3oneid6J3oneid6J3oneicqJ3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J9CisgICAgICovCisgICAgc3RhcnRfc2VxID0gKCh3ZC0+c2VxW2FjXSkgPDwgNCkgJiAweEZGRjA7CisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgc3RhcnRfc2VxKTsKKyAgICBvZmZzZXQrPTI7CisKKyAgICByZXR1cm4gb2Zmc2V0OworfQorCit1MTZfdCB6ZkFnZ0dlbkFkZGJhSGVhZGVyKHpkZXZfdCogZGV2LCB1MTZfdCogZHN0LAorICAgICAgICB1MTZfdCogaGVhZGVyLCB1MTZfdCBsZW4sIHpidWZfdCogYnVmLCB1MTZfdCB2YXAsIHU4X3QgZW5jcnlwdCkKK3sKKyAgICB1OF90ICBobGVuID0gMzI7ICAgICAgICAvLyBNQUMgY3RybCArIFBIWSBjdHJsICsgODAyLjExIE1NIGhlYWRlcgorICAgIC8vdThfdCBmcmFtZVR5cGUgPSBaTV9XTEFOX0ZSQU1FX1RZUEVfQUNUSU9OOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8qCisgICAgICogR2VuZXJhdGUgY29udHJvbCBzZXR0aW5nCisgICAgICovCisgICAgLy9ib2R5TGVuID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CisgICAgaGVhZGVyWzBdID0gMjQrbGVuKzQ7ICAgLy9MZW5ndGgKKyAgICBoZWFkZXJbMV0gPSAweDg7ICAgICAgICAvL01BQyBjb250cm9sLCBiYWNrb2ZmICsgKGFjaykKKworI2lmIDAKKyAgICAvKiBDQ0sgMU0gKi8KKyAgICBoZWFkZXJbMl0gPSAweDBmMDA7ICAgICAgICAgIC8vUEhZIGNvbnRyb2wgTAorICAgIGhlYWRlclszXSA9IDB4MDAwMDsgICAgICAgICAgLy9QSFkgY29udHJvbCBICisjZWxzZQorICAgIC8qIE9GRE0gNk0gKi8KKyAgICBoZWFkZXJbMl0gPSAweDBmMDE7ICAgICAgICAgIC8vUEhZIGNvbnRyb2wgTAorICAgIGhlYWRlclszXSA9IDB4MDAwQjsgICAgICAgICAgLy9QSFkgY29udHJvbCBICisjZW5kaWYKKworICAgIC8qCisgICAgICogR2VuZXJhdGUgV0xBTiBoZWFkZXIKKyAgICAgKiBGcmFtZSBjb250cm9sIGZyYW1lIHR5cGUgYW5kIHN1YnR5cGUKKyAgICAgKi8KKyAgICBoZWFkZXJbNCswXSA9IFpNX1dMQU5fRlJBTUVfVFlQRV9BQ1RJT047CisgICAgLyoKKyAgICAgKiBEdXJhdGlvbgorICAgICAqLworICAgIGhlYWRlcls0KzFdID0gMDsKKworICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkKKyAgICB7CisgICAgICAgIGhlYWRlcls0KzhdID0gd2QtPnN0YS5ic3NpZFswXTsKKyAgICAgICAgaGVhZGVyWzQrOV0gPSB3ZC0+c3RhLmJzc2lkWzFdOworICAgICAgICBoZWFkZXJbNCsxMF0gPSB3ZC0+c3RhLmJzc2lkWzJdOworICAgIH0KKyAgICBlbHNlIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9QU0VVRE8pCisgICAgeworICAgICAgICAvKiBBZGRyZXNzIDMgPSAwMDowMDowMDowMDowMDowMCAqLworICAgICAgICBoZWFkZXJbNCs4XSA9IDA7CisgICAgICAgIGhlYWRlcls0KzldID0gMDsKKyAgICAgICAgaGVhZGVyWzQrMTBdID0gMDsKKyAgICB9CisgICAgZWxzZSBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUykKKyAgICB7CisgICAgICAgIGhlYWRlcls0KzhdID0gd2QtPnN0YS5ic3NpZFswXTsKKyAgICAgICAgaGVhZGVyWzQrOV0gPSB3ZC0+c3RhLmJzc2lkWzFdOworICAgICAgICBoZWFkZXJbNCsxMF0gPSB3ZC0+c3RhLmJzc2lkWzJdOworICAgIH0KKyAgICBlbHNlIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICB7CisgICAgICAgIC8qIEFkZHJlc3MgMyA9IEJTU0lEICovCisgICAgICAgIGhlYWRlcls0KzhdID0gd2QtPm1hY0FkZHJbMF07CisgICAgICAgIGhlYWRlcls0KzldID0gd2QtPm1hY0FkZHJbMV07CisgICAgICAgIGhlYWRlcls0KzEwXSA9IHdkLT5tYWNBZGRyWzJdICsgKHZhcDw8OCk7CisgICAgfQorCisgICAgLyogQWRkcmVzcyAxID0gREEgKi8KKyAgICBoZWFkZXJbNCsyXSA9IGRzdFswXTsKKyAgICBoZWFkZXJbNCszXSA9IGRzdFsxXTsKKyAgICBoZWFkZXJbNCs0XSA9IGRzdFsyXTsKKworICAgIC8qIEFkZHJlc3MgMiA9IFNBICovCisgICAgaGVhZGVyWzQrNV0gPSB3ZC0+bWFjQWRkclswXTsKKyAgICBoZWFkZXJbNCs2XSA9IHdkLT5tYWNBZGRyWzFdOworICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICB7CisgICAgICAgIGhlYWRlcls0KzddID0gd2QtPm1hY0FkZHJbMl0gKyAodmFwPDw4KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaGVhZGVyWzQrN10gPSB3ZC0+bWFjQWRkclsyXTsKKyAgICB9CisKKyAgICAvKiBTZXF1ZW5jZSBDb250cm9sICovCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBoZWFkZXJbNCsxMV0gPSAoKHdkLT5tbXNlcSsrKTw8NCk7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworCisgICAgcmV0dXJuIGhsZW47Cit9CisKKwordTE2X3QgICB6ZkFnZ1Byb2Nlc3NBY3Rpb24oemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHUxNl90IGNhdGVnb3J5OworCisgICAgLy96bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBjYXRlZ29yeSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDI0KTsKKworICAgIHN3aXRjaCAoY2F0ZWdvcnkpCisgICAgeworICAgIGNhc2UgWk1fV0xBTl9CTE9DS19BQ0tfQUNUSU9OX0ZSQU1FOgorICAgICAgICB6ZkFnZ0Jsb2NrQWNrQWN0aW9uRnJhbWUoZGV2LCBidWYpOworICAgICAgICBicmVhazsKKworICAgIH0KKworICAgIHJldHVybiBaTV9TVUNDRVNTOworfQorCisKK3UxNl90ICAgemZBZ2dCbG9ja0Fja0FjdGlvbkZyYW1lKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB1OF90IGFjdGlvbjsKKworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgYWN0aW9uID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMjUpOworI2lmZGVmIFpNX0VOQUJMRV9BR0dSRUdBVElPTgorICAgIHN3aXRjaCAoYWN0aW9uKQorICAgIHsKKyAgICBjYXNlIFpNX1dMQU5fQUREQkFfUkVRVUVTVF9GUkFNRToKKyAgICAgICAgem1fbXNnMF9hZ2coWk1fTFZfMCwgIlJlY2VpdmVkIEJBIEFjdGlvbiBmcmFtZSBpcyBBRERCQSByZXF1ZXN0Iik7CisgICAgICAgIHpmQWdnUmVjdkFkZGJhUmVxdWVzdChkZXYsIGJ1Zik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgWk1fV0xBTl9BRERCQV9SRVNQT05TRV9GUkFNRToKKyAgICAgICAgem1fbXNnMF9hZ2coWk1fTFZfMCwgIlJlY2VpdmVkIEJBIEFjdGlvbiBmcmFtZSBpcyBBRERCQSByZXNwb25zZSIpOworICAgICAgICB6ZkFnZ1JlY3ZBZGRiYVJlc3BvbnNlKGRldiwgYnVmKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBaTV9XTEFOX0RFTEJBX0ZSQU1FOgorICAgICAgICB6ZkFnZ1JlY3ZEZWxiYShkZXYsIGJ1Zik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBaTV9TVUNDRVNTOworfQorCit1MTZfdCAgIHpmQWdnUmVjdkFkZGJhUmVxdWVzdCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgLy91MTZfdCBkaWFsb2c7CisgICAgc3RydWN0IGFnZ0JhRnJhbWVQYXJhbWV0ZXIgYmY7CisgICAgdTE2X3QgaTsKKyAgICAvL3ptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGJmLmJ1ZiA9IGJ1ZjsKKyAgICBiZi5kaWFsb2cgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAyNik7CisgICAgLyoKKyAgICAgKiBiYSBwYXJhbWV0ZXIgc2V0CisgICAgICovCisgICAgYmYuYmFfcGFyYW1ldGVyID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMjcpOworICAgIGJmLmJhX3BvbGljeSAgID0gKGJmLmJhX3BhcmFtZXRlciA+PiAxKSAmIDE7CisgICAgYmYudGlkICAgICAgICAgPSAoYmYuYmFfcGFyYW1ldGVyID4+IDIpICYgMHhGOworICAgIGJmLmJ1ZmZlcl9zaXplID0gKGJmLmJhX3BhcmFtZXRlciA+PiA2KTsKKyAgICAvKgorICAgICAqIEJBIHRpbWVvdXQgdmFsdWUKKyAgICAgKi8KKyAgICBiZi5iYV90aW1lb3V0ID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMjkpOworICAgIC8qCisgICAgICogQkEgc3RhcnRpbmcgc2VxdWVuY2UgbnVtYmVyCisgICAgICovCisgICAgYmYuYmFfc3RhcnRfc2VxID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMzEpID4+IDQ7CisKKyAgICBpPTI2OworICAgIHdoaWxlKGkgPCAzMikgeworICAgICAgICB6bV9kZWJ1Z19tc2cyKCJSZWN2IEFEREJBIFJlcToiLCB6bXdfcnhfYnVmX3JlYWRiKGRldixidWYsaSkpOworICAgICAgICBpKys7CisgICAgfQorCisgICAgemZBZ2dTZW5kQWRkYmFSZXNwb25zZShkZXYsICZiZik7CisKKyAgICB6ZkFnZ0FkZGJhU2V0VGlkUngoZGV2LCBidWYsICZiZik7CisKKyAgICByZXR1cm4gWk1fU1VDQ0VTUzsKK30KKwordTE2X3QgICB6ZkFnZ0FkZGJhU2V0VGlkUngoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBzdHJ1Y3QgYWdnQmFGcmFtZVBhcmFtZXRlciAqYmYpCit7CisgICAgdTE2X3QgaSwgYWMsIGFpZCwgZnJhZ09mZjsKKyAgICB1MTZfdCBzcmNbM107CisgICAgdTE2X3Qgb2Zmc2V0ID0gMDsKKyAgICB1OF90ICB1cDsKKyAgICBzdHJ1Y3QgYWdnX3RpZF9yeCAqdGlkX3J4ID0gTlVMTDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBzcmNbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBvZmZzZXQrMTApOworICAgIHNyY1sxXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCsxMik7CisgICAgc3JjWzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KzE0KTsKKyAgICBhaWQgPSB6ZkFwRmluZFN0YShkZXYsIHNyYyk7CisKKyAgICB6ZlR4R2V0SXBUb3NBbmRGcmFnKGRldiwgYnVmLCAmdXAsICZmcmFnT2ZmKTsKKyAgICBhYyA9IHpjVXBUb0FjW3VwJjB4N10gJiAweDM7CisKKyAgICBhYyA9IGJmLT50aWQ7CisKKyAgICBmb3IgKGk9MDsgaTxaTV9BR0dfUE9PTF9TSVpFIDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYoKHdkLT50aWRfcnhbaV0tPmFpZCA9PSBhaWQpICYmICh3ZC0+dGlkX3J4W2ldLT5hYyA9PSBhYykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRpZF9yeCA9IHdkLT50aWRfcnhbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghdGlkX3J4KQorICAgIHsKKyAgICAgICAgZm9yIChpPTA7IGk8Wk1fQUdHX1BPT0xfU0laRTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAod2QtPnRpZF9yeFtpXS0+YWlkID09IFpNX01BWF9TVEFfU1VQUE9SVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aWRfcnggPSB3ZC0+dGlkX3J4W2ldOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghdGlkX3J4KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHRpZF9yeC0+YWlkID0gYWlkOworICAgIHRpZF9yeC0+YWMgPSBhYzsKKyAgICB0aWRfcngtPmFkZEJhRXhjaGFuZ2VTdGF0dXNDb2RlID0gWk1fQUdHX0FEREJBX1JFU1BPTlNFOworICAgIHRpZF9yeC0+c2VxX3N0YXJ0ID0gYmYtPmJhX3N0YXJ0X3NlcTsKKyAgICB0aWRfcngtPmJhd19oZWFkID0gdGlkX3J4LT5iYXdfdGFpbCA9IDA7CisgICAgdGlkX3J4LT5zcV9leGNlZWRfY291bnQgPSB0aWRfcngtPnNxX2JlaGluZF9jb3VudCA9IDA7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybiAwOworfQorCit1MTZfdCAgIHpmQWdnUmVjdkFkZGJhUmVzcG9uc2UoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHUxNl90IGksYWMsIGFpZD0wOworICAgIHUxNl90IHNyY1szXTsKKyAgICBzdHJ1Y3QgYWdnQmFGcmFtZVBhcmFtZXRlciBiZjsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHNyY1swXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDEwKTsKKyAgICBzcmNbMV0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAxMik7CisgICAgc3JjWzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTQpOworCisgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgICAgICBhaWQgPSB6ZkFwRmluZFN0YShkZXYsIHNyYyk7CisKKworICAgIGJmLmJ1ZiA9IGJ1ZjsKKyAgICBiZi5kaWFsb2cgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAyNik7CisgICAgYmYuc3RhdHVzX2NvZGUgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAyNyk7CisgICAgaWYgKCFiZi5zdGF0dXNfY29kZSkKKyAgICB7CisgICAgICAgIHdkLT5hZGRiYUNvbXBsZXRlPTE7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBiYSBwYXJhbWV0ZXIgc2V0CisgICAgICovCisgICAgYmYuYmFfcGFyYW1ldGVyID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMjkpOworICAgIGJmLmJhX3BvbGljeSAgID0gKGJmLmJhX3BhcmFtZXRlciA+PiAxKSAmIDE7CisgICAgYmYudGlkICAgICAgICAgPSAoYmYuYmFfcGFyYW1ldGVyID4+IDIpICYgMHhGOworICAgIGJmLmJ1ZmZlcl9zaXplID0gKGJmLmJhX3BhcmFtZXRlciA+PiA2KTsKKyAgICAvKgorICAgICAqIEJBIHRpbWVvdXQgdmFsdWUKKyAgICAgKi8KKyAgICBiZi5iYV90aW1lb3V0ID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMzEpOworCisgICAgaT0yNjsKKyAgICB3aGlsZShpIDwgMzIpIHsKKyAgICAgICAgem1fZGVidWdfbXNnMigiUmVjdiBBRERCQSBSc3A6Iiwgem13X3J4X2J1Zl9yZWFkYihkZXYsYnVmLGkpKTsKKyAgICAgICAgaSsrOworICAgIH0KKworICAgIGFjID0gemNVcFRvQWNbYmYudGlkJjB4N10gJiAweDM7CisKKyAgICAvL3ptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAvL3dkLT5hZ2dTdGFbYWlkXS5hZ2dGbGFnW2FjXSA9IDA7CisKKyAgICAvL3ptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXR1cm4gWk1fU1VDQ0VTUzsKK30KKwordTE2X3QgICB6ZkFnZ1JlY3ZEZWxiYSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgLy96bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisgICAgcmV0dXJuIFpNX1NVQ0NFU1M7Cit9CisKK3UxNl90ICAgemZBZ2dTZW5kQWRkYmFSZXNwb25zZSh6ZGV2X3QqIGRldiwgc3RydWN0IGFnZ0JhRnJhbWVQYXJhbWV0ZXIgKmJmKQoreworICAgIHpidWZfdCogYnVmOworICAgIC8vdTE2X3QgYWRkclRibFNpemU7CisgICAgLy9zdHJ1Y3QgenNBZGRyVGJsIGFkZHJUYmw7CisgICAgLy91MTZfdCBlcnI7CisgICAgdTE2X3Qgb2Zmc2V0ID0gMDsKKyAgICB1MTZfdCBobGVuID0gMzI7CisgICAgdTE2X3QgaGVhZGVyWygyNCsyNSsxKS8yXTsKKyAgICB1MTZfdCB2YXAgPSAwOworICAgIHUxNl90IGk7CisgICAgdThfdCBlbmNyeXB0ID0gMDsKKyAgICB1MTZfdCBkc3RbM107CisKKyAgICAvL3ptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworCisgICAgLyoKKyAgICAgKiBUQkQgOiBNYXhpbXVtIHNpemUgb2YgbWFuYWdtZW50IGZyYW1lCisgICAgICovCisgICAgaWYgKChidWYgPSB6ZndCdWZBbGxvY2F0ZShkZXYsIDEwMjQpKSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgem1fbXNnMF9tbShaTV9MVl8wLCAiQWxsb2MgbW0gYnVmIEZhaWwhIik7CisgICAgICAgIHJldHVybiBaTV9TVUNDRVNTOworICAgIH0KKworICAgIC8qCisgICAgICogUmVzZXJ2ZSByb29tIGZvciB3bGFuIGhlYWRlcgorICAgICAqLworICAgIG9mZnNldCA9IGhsZW47CisKKyAgICAvKgorICAgICAqIGFkZCBhZGRiYSBmcmFtZSBib2R5CisgICAgICovCisgICAgb2Zmc2V0ID0gemZBZ2dTZXRBZGRiYVJlc3BvbnNlRnJhbWVCb2R5KGRldiwgYnVmLCBiZiwgb2Zmc2V0KTsKKworCisgICAgemZ3QnVmU2V0U2l6ZShkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgIC8qCisgICAgICogQ29weSB3bGFuIGhlYWRlcgorICAgICAqLworCisgICAgZHN0WzBdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJmLT5idWYsIDEwKTsKKyAgICBkc3RbMV0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYmYtPmJ1ZiwgMTIpOworICAgIGRzdFsyXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBiZi0+YnVmLCAxNCk7CisgICAgemZBZ2dHZW5BZGRiYUhlYWRlcihkZXYsIGRzdCwgaGVhZGVyLCBvZmZzZXQtaGxlbiwgYnVmLCB2YXAsIGVuY3J5cHQpOworICAgIGZvciAoaT0wOyBpPChobGVuPj4xKTsgaSsrKQorICAgIHsKKyAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIGkqMiwgaGVhZGVyW2ldKTsKKyAgICB9CisKKyAgICAvKiBHZXQgYnVmZmVyIERNQSBhZGRyZXNzICovCisgICAgLy9pZiAoKGFkZHJUYmxTaXplID0gemZ3QnVmTWFwRG1hKGRldiwgYnVmLCAmYWRkclRibCkpID09IDApCisgICAgLy9pZiAoKGFkZHJUYmxTaXplID0gemZ3TWFwVHhEbWEoZGV2LCBidWYsICZhZGRyVGJsKSkgPT0gMCkKKyAgICAvL3sKKyAgICAvLyAgICBnb3RvIHpsRXJyb3I7CisgICAgLy99CisKKyAgICAvL3ptX21zZzJfbW0oWk1fTFZfMiwgIm9mZnNldD0iLCBvZmZzZXQpOworICAgIC8vem1fbXNnMl9tbShaTV9MVl8yLCAiaGxlbj0iLCBobGVuKTsKKyAgICAvL3ptX21zZzJfbW0oWk1fTFZfMiwgImFkZHJUYmxTaXplPSIsIGFkZHJUYmxTaXplKTsKKyAgICAvL3ptX21zZzJfbW0oWk1fTFZfMiwgImFkZHJUYmwubGVuWzBdPSIsIGFkZHJUYmwubGVuWzBdKTsKKyAgICAvL3ptX21zZzJfbW0oWk1fTFZfMiwgImFkZHJUYmwucGh5c0FkZHJsWzBdPSIsIGFkZHJUYmwucGh5c0FkZHJsWzBdKTsKKyAgICAvL3ptX21zZzJfbW0oWk1fTFZfMiwgImJ1Zi0+ZGF0YT0iLCBidWYtPmRhdGEpOworCisgICAgI2lmIDAKKyAgICBpZiAoKGVyciA9IHpmSHBTZW5kKGRldiwgTlVMTCwgMCwgTlVMTCwgMCwgTlVMTCwgMCwgYnVmLCAwLAorICAgICAgICAgICAgWk1fSU5URVJOQUxfQUxMT0NfQlVGLCAwLCAweGZmKSkgIT0gWk1fU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGdvdG8gemxFcnJvcjsKKyAgICB9CisgICAgI2Vsc2UKKyAgICB6ZlB1dFZtbXEoZGV2LCBidWYpOworICAgIHpmUHVzaFZ0eHEoZGV2KTsKKyAgICAjZW5kaWYKKworICAgIC8vemZBZ2dTZW5kQWRkYmFSZXF1ZXN0KGRldiwgZHN0LCB6Y1VwVG9BY1tiZi0+dGlkJjB4N10gJiAweDMsIGJmLT50aWQpOworICAgIHJldHVybiBaTV9TVUNDRVNTOworCit9CisKK3UxNl90ICAgemZBZ2dTZXRBZGRiYVJlc3BvbnNlRnJhbWVCb2R5KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgYWdnQmFGcmFtZVBhcmFtZXRlciAqYmYsIHUxNl90IG9mZnNldCkKK3sKKworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworICAgIC8qCisgICAgICogQUREQkEgUmVxdWVzdCBmcmFtZSBib2R5CisgICAgICovCisKKyAgICAvKgorICAgICAqIENhdGVnb3J5CisgICAgICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAzKTsKKyAgICAvKgorICAgICAqIEFjdGlvbiBkZXRhaWxzID0gMAorICAgICAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgWk1fV0xBTl9BRERCQV9SRVNQT05TRV9GUkFNRSk7CisgICAgLyoKKyAgICAgKiBEaWFsb2cgVG9rZW4gPSBub256ZXJvCisgICAgICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBiZi0+ZGlhbG9nKTsKKyAgICAvKgorICAgICAqIFN0YXR1cyBjb2RlCisgICAgICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgMCk7CisgICAgb2Zmc2V0Kz0yOworICAgIC8qCisgICAgICogQmxvY2sgQWNrIHBhcmFtZXRlciBzZXQKKyAgICAgKiBCQSBwb2xpY3kgPSAxIGZvciBpbW1lZGlhdGUgQkEsIDAgZm9yIGRlbGF5ZWQgQkEKKyAgICAgKiBUSUQoNGJpdHMpICYgYnVmZmVyIHNpemUoNGJpdHMpIChUSUQ9MHgxICYgYnVmZmVyIHNpemU9MHg4MCkKKyAgICAgKiBUQkQ6IGhvdyB0byBnZXQgVElEIG51bWJlciBhbmQgYnVmZmVyIHNpemU/CisgICAgICogonqid6J3oneid6J3oneid6J3oneid6Jzoneid6J3oneid6J3oneid6J3oneid6Jzoneid6J3oneid6J3oneid6Jzoneid6J3oneid6J3oneid6J3oneid6J3oneieworICAgICAqIKJ4ICAgIEIwICAgIKJ4ICAgIEIxICAgICCieCBCMiAgQjUgonggQjYgICAgICBCMTUgongKKyAgICAgKiCidaJ3oneid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneid6J3oneid6J3oneid6J0CisgICAgICogonggUmVzZXJ2ZWQgonggQkEgcG9saWN5IKJ4ICBUSUQgICCieCBCdWZmZXIgc2l6ZSCieAorICAgICAqIKJ8oneid6J3oneid6J3oneid6J3oneicqJ3oneid6J3oneid6J3oneid6J3oneicqJ3oneid6J3oneid6J3oneicqJ3oneid6J3oneid6J3oneid6J3oneid6J3on0KKyAgICAgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCBiZi0+YmFfcGFyYW1ldGVyKTsKKyAgICBvZmZzZXQrPTI7CisgICAgLyoKKyAgICAgKiBCQSB0aW1lb3V0IHZhbHVlCisgICAgICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgYmYtPmJhX3RpbWVvdXQpOworICAgIG9mZnNldCs9MjsKKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKK3ZvaWQgICB6ZkFnZ0ludm9rZUJhcih6ZGV2X3QqIGRldiwgVElEX1RYIHRpZF90eCkKK3sKKyAgICBzdHJ1Y3QgYWdnQmFyQ29udHJvbCBhZ2dCYXJDb250cm9sOworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworICAgIC8vYmFyX2NvbnRyb2wgPSBhZ2dCYXJDb250cm9sLT50aWRfaW5mbyA8PCAxMiB8IGFnZ0JhckNvbnRyb2wtPmNvbXByZXNzZWRfYml0bWFwIDw8IDIKKyAgICAvLyAgICAgICAgfCBhZ2dCYXJDb250cm9sLT5tdWx0aV90aWQgPDwgMSB8IGFnZ0JhckNvbnRyb2wtPmJhcl9hY2tfcG9saWN5OworICAgIGFnZ0JhckNvbnRyb2wuYmFyX2Fja19wb2xpY3kgPSAwOworICAgIGFnZ0JhckNvbnRyb2wubXVsdGlfdGlkID0gMDsKKyAgICBhZ2dCYXJDb250cm9sLmNvbXByZXNzZWRfYml0bWFwID0gMDsKKyAgICBhZ2dCYXJDb250cm9sLnRpZF9pbmZvID0gdGlkX3R4LT50aWQ7CisgICAgemZBZ2dTZW5kQmFyKGRldiwgdGlkX3R4LCAmYWdnQmFyQ29udHJvbCk7CisKKyAgICByZXR1cm47CisKK30KKy8qCisgKiB6ZkFnZ1NlbmRCYXIoKSByZWZlcnMgemZBZ2dTZW5kQWRkYmFSZXF1ZXN0KCkKKyAqLwordTE2X3QgICB6ZkFnZ1NlbmRCYXIoemRldl90KiBkZXYsIFRJRF9UWCB0aWRfdHgsIHN0cnVjdCBhZ2dCYXJDb250cm9sICphZ2dCYXJDb250cm9sKQoreworICAgIHpidWZfdCogYnVmOworICAgIC8vdTE2X3QgYWRkclRibFNpemU7CisgICAgLy9zdHJ1Y3QgenNBZGRyVGJsIGFkZHJUYmw7CisgICAgLy91MTZfdCBlcnI7CisgICAgdTE2X3Qgb2Zmc2V0ID0gMDsKKyAgICB1MTZfdCBobGVuID0gMTYrODsgIC8qIG1hYyBoZWFkZXIgKyBjb250cm9sIGhlYWRlcnMqLworICAgIHUxNl90IGhlYWRlclsoOCsyNCsxKS8yXTsKKyAgICB1MTZfdCB2YXAgPSAwOworICAgIHUxNl90IGk7CisgICAgdThfdCBlbmNyeXB0ID0gMDsKKworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisKKyAgICAvKgorICAgICAqIFRCRCA6IE1heGltdW0gc2l6ZSBvZiBtYW5hZ21lbnQgZnJhbWUKKyAgICAgKi8KKyAgICBpZiAoKGJ1ZiA9IHpmd0J1ZkFsbG9jYXRlKGRldiwgMTAyNCkpID09IE5VTEwpCisgICAgeworICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJBbGxvYyBtbSBidWYgRmFpbCEiKTsKKyAgICAgICAgcmV0dXJuIFpNX1NVQ0NFU1M7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBSZXNlcnZlIHJvb20gZm9yIHdsYW4gaGVhZGVyCisgICAgICovCisgICAgb2Zmc2V0ID0gaGxlbjsKKworICAgIC8qCisgICAgICogYWRkIGFkZGJhIGZyYW1lIGJvZHkKKyAgICAgKi8KKyAgICBvZmZzZXQgPSB6ZkFnZ1NldEJhckJvZHkoZGV2LCBidWYsIG9mZnNldCwgdGlkX3R4LCBhZ2dCYXJDb250cm9sKTsKKworCisgICAgemZ3QnVmU2V0U2l6ZShkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgIC8qCisgICAgICogQ29weSB3bGFuIGhlYWRlcgorICAgICAqLworICAgIHpmQWdnR2VuQmFySGVhZGVyKGRldiwgdGlkX3R4LT5kc3QsIGhlYWRlciwgb2Zmc2V0LWhsZW4sIGJ1ZiwgdmFwLCBlbmNyeXB0KTsKKyAgICBmb3IgKGk9MDsgaTwoaGxlbj4+MSk7IGkrKykKKyAgICB7CisgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBpKjIsIGhlYWRlcltpXSk7CisgICAgfQorCisgICAgLyogR2V0IGJ1ZmZlciBETUEgYWRkcmVzcyAqLworICAgIC8vaWYgKChhZGRyVGJsU2l6ZSA9IHpmd0J1Zk1hcERtYShkZXYsIGJ1ZiwgJmFkZHJUYmwpKSA9PSAwKQorICAgIC8vaWYgKChhZGRyVGJsU2l6ZSA9IHpmd01hcFR4RG1hKGRldiwgYnVmLCAmYWRkclRibCkpID09IDApCisgICAgLy97CisgICAgLy8gICAgZ290byB6bEVycm9yOworICAgIC8vfQorCisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJvZmZzZXQ9Iiwgb2Zmc2V0KTsKKyAgICAvL3ptX21zZzJfbW0oWk1fTFZfMiwgImhsZW49IiwgaGxlbik7CisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJhZGRyVGJsU2l6ZT0iLCBhZGRyVGJsU2l6ZSk7CisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJhZGRyVGJsLmxlblswXT0iLCBhZGRyVGJsLmxlblswXSk7CisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJhZGRyVGJsLnBoeXNBZGRybFswXT0iLCBhZGRyVGJsLnBoeXNBZGRybFswXSk7CisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJidWYtPmRhdGE9IiwgYnVmLT5kYXRhKTsKKworICAgICNpZiAwCisgICAgaWYgKChlcnIgPSB6ZkhwU2VuZChkZXYsIE5VTEwsIDAsIE5VTEwsIDAsIE5VTEwsIDAsIGJ1ZiwgMCwKKyAgICAgICAgICAgIFpNX0lOVEVSTkFMX0FMTE9DX0JVRiwgMCwgMHhmZikpICE9IFpNX1NVQ0NFU1MpCisgICAgeworICAgICAgICBnb3RvIHpsRXJyb3I7CisgICAgfQorICAgICNlbHNlCisgICAgemZQdXRWbW1xKGRldiwgYnVmKTsKKyAgICB6ZlB1c2hWdHhxKGRldik7CisgICAgI2VuZGlmCisKKyAgICByZXR1cm4gWk1fU1VDQ0VTUzsKKworfQorCit1MTZfdCAgIHpmQWdnU2V0QmFyQm9keSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgVElEX1RYIHRpZF90eCwgc3RydWN0IGFnZ0JhckNvbnRyb2wgKmFnZ0JhckNvbnRyb2wpCit7CisgICAgdTE2X3QgYmFyX2NvbnRyb2wsIHN0YXJ0X3NlcTsKKworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworICAgIC8qCisgICAgICogQkFSIENvbnRyb2wgZnJhbWUgYm9keQorICAgICAqLworCisgICAgLyoKKyAgICAgKiBCQVIgQ29udHJvbCBGaWVsZAorICAgICAqIKJ6oneid6J3oneid6J3oneid6J3onOid6J3oneid6J3oneid6J3oneid6J3onOid6J3oneid6J3oneid6J3oneid6J3oneic6J3oneid6J3oneid6J3oneid6J3onOid6J3oneid6J3oneid6J3oneid6J7CisgICAgICogonggICAgQjAgICCieCAgICBCMSAgICAgonggICAgIEIyICAgICCieCBCMyAgIEIxMSCieCBCMTIgIEIxNSCieAorICAgICAqIKJ1oneid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneid6J3oneid6J3oneicaJ3oneid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneid6J3oneid6J0CisgICAgICogonggQkFSIEFjayCieCBNdWx0aS1USUQgonggQ29tcHJlc3NlZCCieCBSZXNlcnZlZCCieCBUSURfSU5GTyCieAorICAgICAqIKJ4ICBQb2xpY3kgonggICAgICAgICAgIKJ4ICAgQml0bWFwICAgonggICAgICAgICAgonggICAgICAgICAgongKKyAgICAgKiCifKJ3oneid6J3oneid6J3oneid6Jyoneid6J3oneid6J3oneid6J3oneid6Jyoneid6J3oneid6J3oneid6J3oneid6J3onKid6J3oneid6J3oneid6J3oneid6Jyoneid6J3oneid6J3oneid6J3oneifQorICAgICAqLworICAgIGJhcl9jb250cm9sID0gYWdnQmFyQ29udHJvbC0+dGlkX2luZm8gPDwgMTIgfCBhZ2dCYXJDb250cm9sLT5jb21wcmVzc2VkX2JpdG1hcCA8PCAyCisgICAgICAgICAgICB8IGFnZ0JhckNvbnRyb2wtPm11bHRpX3RpZCA8PCAxIHwgYWdnQmFyQ29udHJvbC0+YmFyX2Fja19wb2xpY3k7CisKKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCBiYXJfY29udHJvbCk7CisgICAgb2Zmc2V0Kz0yOworICAgIGlmICgwID09IGFnZ0JhckNvbnRyb2wtPm11bHRpX3RpZCkgeworICAgICAgICAvKgorICAgICAgICAgKiBCQSBzdGFydGluZyBzZXF1ZW5jZSBudW1iZXIKKyAgICAgICAgICogonqid6J3oneid6J3oneid6J3oneid6J3oneid6Jzoneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3onsKKyAgICAgICAgICogonggQjAgICAgICAgQjMgonggQjQgICAgICAgICAgICAgIEIxNSCieAorICAgICAgICAgKiCidaJ3oneid6J3oneid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneidAorICAgICAgICAgKiCieCBGcmFnIG51bSgwKSCieCBCQSBzdGFydGluZyBzZXEgbnVtIKJ4CisgICAgICAgICAqIKJ8oneid6J3oneid6J3oneid6J3oneid6J3oneicqJ3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J3oneid6J9CisgICAgICAgICAqLworICAgICAgICBzdGFydF9zZXEgPSAodGlkX3R4LT5iYXJfc3NuIDw8IDQpICYgMHhGRkYwOworICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCBzdGFydF9zZXEpOworICAgICAgICBvZmZzZXQrPTI7CisgICAgfQorICAgIGlmICgxID09IGFnZ0JhckNvbnRyb2wtPm11bHRpX3RpZCAmJiAxID09IGFnZ0JhckNvbnRyb2wtPmNvbXByZXNzZWRfYml0bWFwKSB7CisgICAgICAgIC8qIG11bHRpLXRpZCBCbG9ja0Fja1JlcSB2YXJpYW50LCBub3QgaW1wbGVtZW50ZWQqLworICAgIH0KKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKK3UxNl90IHpmQWdnR2VuQmFySGVhZGVyKHpkZXZfdCogZGV2LCB1MTZfdCogZHN0LAorICAgICAgICB1MTZfdCogaGVhZGVyLCB1MTZfdCBsZW4sIHpidWZfdCogYnVmLCB1MTZfdCB2YXAsIHU4X3QgZW5jcnlwdCkKK3sKKyAgICB1OF90ICBobGVuID0gMTYrODsgICAgICAgIC8vIE1BQyBjdHJsICsgUEhZIGN0cmwgKyA4MDIuMTEgTU0gaGVhZGVyCisgICAgLy91OF90IGZyYW1lVHlwZSA9IFpNX1dMQU5fRlJBTUVfVFlQRV9BQ1RJT047CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgLyoKKyAgICAgKiBHZW5lcmF0ZSBjb250cm9sIHNldHRpbmcKKyAgICAgKi8KKyAgICAvL2JvZHlMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKyAgICBoZWFkZXJbMF0gPSAxNitsZW4rNDsgICAvL0xlbmd0aAorICAgIGhlYWRlclsxXSA9IDB4ODsgICAgICAgIC8vTUFDIGNvbnRyb2wsIGJhY2tvZmYgKyAoYWNrKQorCisjaWYgMQorICAgIC8qIENDSyAxTSAqLworICAgIGhlYWRlclsyXSA9IDB4MGYwMDsgICAgICAgICAgLy9QSFkgY29udHJvbCBMCisgICAgaGVhZGVyWzNdID0gMHgwMDAwOyAgICAgICAgICAvL1BIWSBjb250cm9sIEgKKyNlbHNlCisgICAgLyogQ0NLIDZNICovCisgICAgaGVhZGVyWzJdID0gMHgwZjAxOyAgICAgICAgICAvL1BIWSBjb250cm9sIEwKKyAgICBoZWFkZXJbM10gPSAweDAwMEI7ICAgICAgICAgIC8vUEhZIGNvbnRyb2wgSAorCisjZW5kaWYKKyAgICAvKgorICAgICAqIEdlbmVyYXRlIFdMQU4gaGVhZGVyCisgICAgICogRnJhbWUgY29udHJvbCBmcmFtZSB0eXBlIGFuZCBzdWJ0eXBlCisgICAgICovCisgICAgaGVhZGVyWzQrMF0gPSBaTV9XTEFOX0ZSQU1FX1RZUEVfQkFSOworICAgIC8qCisgICAgICogRHVyYXRpb24KKyAgICAgKi8KKyAgICBoZWFkZXJbNCsxXSA9IDA7CisKKyAgICAvKiBBZGRyZXNzIDEgPSBEQSAqLworICAgIGhlYWRlcls0KzJdID0gZHN0WzBdOworICAgIGhlYWRlcls0KzNdID0gZHN0WzFdOworICAgIGhlYWRlcls0KzRdID0gZHN0WzJdOworCisgICAgLyogQWRkcmVzcyAyID0gU0EgKi8KKyAgICBoZWFkZXJbNCs1XSA9IHdkLT5tYWNBZGRyWzBdOworICAgIGhlYWRlcls0KzZdID0gd2QtPm1hY0FkZHJbMV07CisgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgIHsKKyNpZmRlZiBaTV9WQVBNT0RFX01VTFRJTEVfU1NJRAorICAgICAgICBoZWFkZXJbNCs3XSA9IHdkLT5tYWNBZGRyWzJdOyAvL011bHRpcGxlIFNTSUQKKyNlbHNlCisgICAgICAgIGhlYWRlcls0KzddID0gd2QtPm1hY0FkZHJbMl0gKyAodmFwPDw4KTsgLy9WQVAKKyNlbmRpZgorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBoZWFkZXJbNCs3XSA9IHdkLT5tYWNBZGRyWzJdOworICAgIH0KKworICAgIC8qIFNlcXVlbmNlIENvbnRyb2wgKi8KKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIGhlYWRlcls0KzExXSA9ICgod2QtPm1tc2VxKyspPDw0KTsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisKKyAgICByZXR1cm4gaGxlbjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jYWdnLmggYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY2FnZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkODdhNTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY2FnZy5oCkBAIC0wLDAgKzEsNDM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogY2FnZy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBBLU1QRFUgYWdncmVnYXRpb24gcmVsYXRpdmVkIGZ1bmN0aW9ucy4gICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLypSZXZpc2lvbiBIaXN0b3J5OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBXaG8gICAgICAgICBXaGVuICAgICAgICBXaGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBIb25kYSAgICAgICAxMi00LTA2ICAgICBjcmVhdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0NBR0dfSAorI2RlZmluZSBfQ0FHR19ICisKKworLyoKKyAqIHRoZSBhZ2dyZWdhdGlvbiBmdW5jdGlvbnMgZmxhZywgMCBpZiBkb24ndCBkbyBhZ2dyZWdhdGUKKyAqLworCisjZGVmaW5lIFpNX0FHR19GUEdBX0RFQlVHICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWk1fQUdHX0ZQR0FfUkVPUkRFUklORyAgICAgICAgICAgICAgMQorCisjaWZuZGVmIFpNX0FHR19UQUxMWQorLy8jZGVmaW5lIFpNX0FHR19UQUxMWQorI2VuZGlmCisvKgorICogQWdncmVnYXRlIGNvbnRyb2wKKyAqLworCisKKyNkZWZpbmUgWk1fQUdHX1BPT0xfU0laRSAgICAgICAgICAgICAgICAgICAgMjAKKyNkZWZpbmUgWk1fQkFXX1BPT0xfU0laRSAgICAgICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgWk1fQUdHUV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgNjQKKyNkZWZpbmUgWk1fQUdHUV9TSVpFX01BU0sgICAgICAgICAgICAgICAgICAgKFpNX0FHR1FfU0laRS0xKQorI2RlZmluZSBaTV9BR0dfTE9XX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpNX0FHR19ISUdIX1RIUkVTSE9MRCAgICAgICAgICAgICAgIDUKKworLyoKKyAqIG51bWJlciBvZiBhY2Nlc3MgY2F0ZWdvcmllcyAoYWMpCisgKi8KKyNkZWZpbmUgWk1fQUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNAorLyoKKyAqIHRoZSB0aW1lciB0byBjbGVhciBhZ2dyZWdhdGlvbiBxdWV1ZSwgdW5pdDogMSB0aWNrCisgKiBpZiB0aGUgcGFja2V0IGlzIHRvbyBvbGQgKGN1cnJlbnQgdGltZSAtIGFycml2YWwgdGltZSkKKyAqIHRoZSBwYWNrZXQgYW5kIHRoZSBhZ2dyZWdhdGUgcXVldWUgd2lsbCBiZSBjbGVhcmVkCisgKi8KKyNkZWZpbmUgWk1fQUdHX0NMRUFSX1RJTUUgICAgICAgICAgICAgICAgICAgMTAKKy8qCisgKiBkZWxldGUgdGhlIHF1ZXVlIGlmIGlkbGUgZm9yIFpNX0RFTEVURV9USU1FCisgKiB1bml0OiAxMG1zCisgKi8KKyNkZWZpbmUgWk1fQUdHX0RFTEVURV9USU1FICAgICAgICAgICAgICAgICAgMTAwMDAKKworLyoKKyAqIGJsb2NrIGFjayB3aW5kb3cgc2l6ZQorICovCisjZGVmaW5lIFpNX0FHR19CQVdfU0laRSAgICAgICAgICAgICAgICAgICAgIDY0CisjZGVmaW5lIFpNX0FHR19CQVdfTUFTSyAgICAgICAgICAgICAgICAgICAgIChaTV9BR0dfQkFXX1NJWkUtMSkKKy8qCisgKiBvcmlnaW5hdG9yICAgICBBRERCQSBSZXNxdWVzdCAgICByZWNlaXZlcgorICogICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+fAorICogICAgIDF8ICAgICAgICAgIEFDSyAgICAgICAgICAgICAgICAgfDEKKyAqICAgICAgfDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqICAgICAyfCAgICAgICAgIEFEREJBIFJlc3BvbnNlICAgICAgIHwyCisgKiAgICAgIHw8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiAgICAgM3wgICAgICAgICAgQUNLICAgICAgICAgICAgICAgICB8MworICogICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+fAorICogICAgIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyAqLworI2RlZmluZSBaTV9BR0dfQUREQkFfUkVRVUVTVCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpNX0FHR19BRERCQV9SRVFVRVNUX0FDSyAgICAgICAgICAgIDIKKyNkZWZpbmUgWk1fQUdHX0FEREJBX1JFU1BPTlNFICAgICAgICAgICAgICAgMworI2RlZmluZSBaTV9BR0dfQUREQkFfUkVTUE9OU0VfQUNLICAgICAgICAgICA0CisKKyNkZWZpbmUgWk1fQUdHX1NJTkdMRV9NUERVICAgICAgICAgICAgICAgICAgMDAKKyNkZWZpbmUgWk1fQUdHX0ZJUlNUX01QRFUgICAgICAgICAgICAgICAgICAgMDEKKyNkZWZpbmUgWk1fQUdHX01JRERMRV9NUERVICAgICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgWk1fQUdHX0xBU1RfTVBEVSAgICAgICAgICAgICAgICAgICAgMTAKKy8qCisgKiBlbmQgb2YgQWdncmVnYXRlIGNvbnRyb2wKKyAqLworCisjZGVmaW5lIFRJRF9UWCAgc3RydWN0IGFnZ1F1ZXVlKgorI2RlZmluZSBUSURfQkFXIHN0cnVjdCBiYXdfcSoKKyNkZWZpbmUgQkFXIHdkLT5iYXdfZW5hYmxlcgorI2RlZmluZSBERVNUUSB3ZC0+ZGVzdFEKKworLyoKKyAqIFF1ZXVlIGFjY2VzcworICovCisjZGVmaW5lIHptX2FnZ19xbGVuKGRldiwgaGVhZCwgdGFpbCkgKChoZWFkIC0gdGFpbCkgJiBaTV9BR0dRX1NJWkVfTUFTSykKKyNkZWZpbmUgem1fYWdnX2luUSh0aWRfdHgsIHB0KSAoKCgocHQgLSB0aWRfdHgtPmFnZ1RhaWwpICYgWk1fQUdHUV9TSVpFX01BU0spIDwgXAorICAgICAgICAoKHRpZF90eC0+YWdnSGVhZCAtIHRpZF90eC0+YWdnVGFpbCkgJiBaTV9BR0dRX1NJWkVfTUFTSykpPyBUUlVFOkZBTFNFKQorI2RlZmluZSB6bV9hZ2dfcGx1cyhwdCkgcHQgPSAocHQgKyAxKSAmIFpNX0FHR1FfU0laRV9NQVNLCisjZGVmaW5lIHptX2FnZ19taW4oQSwgQikgKChBPkIpPyBCOkEpCisjZGVmaW5lIHptX2FnZ19HZXRUaW1lKCkgd2QtPnRpY2sKKyNkZWZpbmUgVFhRTCAoemZIcEdldE1heFR4ZENvdW50KGRldikgLSB6ZkhwR2V0RnJlZVR4ZENvdW50KGRldikpCisKKy8qIGRvbid0IGNoYW5nZSBBR0dfTUlOX1RYUUwgZWFzaWx5LCB0aGlzIG1pZ2h0IGNhdXNlIEJBVyBCU09EICovCisjZGVmaW5lIEFHR19NSU5fVFhRTCAgICAgICAgICAgICAgICAgICAgICAgIDIKKy8qCisgKiBjb25zaWRlciB0Y3AsdWRwLGFjKDEyMzQpCisgKi8KKyNkZWZpbmUgem1fYWdnX2R5bmFtaWNfdGhyZXNob2xkKGRldiwgYXIpICAgKChhciA+IDE2KT8gMTE6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhciA+IDEyKT8gODogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFyID4gOCk/IDU6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhciA+IDQpPyAyOjEpCisjZGVmaW5lIHptX2FnZ193ZWlnaHQoYWMpICAgKCgzID09IGFjKT8gNDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiA9PSBhYyk/IDM6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAgPT0gYWMpPyAyOjEpCisvKgorICogdGhlIHJlcXVpcmVkIGZyZWUgcXVldWUgcmF0aW8gcGVyIGFjCisgKi8KKworI2RlZmluZSB6bV9hZ2dfcmF0aW8oYWMpICAgICgoMyA9PSBhYyk/IDM6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIgPT0gYWMpPyAoemZIcEdldE1heFR4ZENvdW50KGRldikqMS80KTogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCA9PSBhYyk/ICh6ZkhwR2V0TWF4VHhkQ291bnQoZGV2KSoyLzQpOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHpmSHBHZXRNYXhUeGRDb3VudChkZXYpKjMvNCkpCisKKy8vI2RlZmluZSB6bV9hZ2dfcmF0aW8oYWMpICAgIDMKKy8qCisgKiBlbmQgb2YgUXVldWUgYWNjZXNzCisgKi8KKworI2RlZmluZSBaTV9BR0dNU0dfTEVWICAgIFpNX0xWXzMKKyNkZWZpbmUgem1fbXNnMF9hZ2cobHYsIG1zZykgaWYgKFpNX0FHR01TR19MRVYgPj0gbHYpIFwKKyAgICAgICAge3ptX2RlYnVnX21zZzAobXNnKTt9CisjZGVmaW5lIHptX21zZzFfYWdnKGx2LCBtc2csIHZhbCkgaWYgKFpNX0FHR01TR19MRVYgPj0gbHYpIFwKKyAgICAgICAge3ptX2RlYnVnX21zZzEobXNnLCB2YWwpO30KKyNkZWZpbmUgem1fbXNnMl9hZ2cobHYsIG1zZywgdmFsKSBpZiAoWk1fQUdHTVNHX0xFViA+PSBsdikgXAorICAgICAgICB7em1fZGVidWdfbXNnMihtc2csIHZhbCk7fQorCisjaWZuZGVmIFpNX0VOQUJMRV9GV19CQV9SRVRSQU5TTUlTU0lPTiAvL2Rpc2FibGUgQkFXCitzdHJ1Y3QgYmF3X2hlYWRlcl9yIHsKKyAgICB1MTZfdCAgICAgICAqaGVhZGVyOworICAgIHUxNl90ICAgICAgICptaWM7CisgICAgdTE2X3QgICAgICAgKnNuYXA7CisgICAgdTE2X3QgICAgICAgaGVhZGVyTGVuOworICAgIHUxNl90ICAgICAgIG1pY0xlbjsKKyAgICB1MTZfdCAgICAgICBzbmFwTGVuOworICAgIHUxNl90ICAgICAgIHJlbW92ZUxlbjsKKyAgICB1OF90ICAgICAgICBrZXlJZHg7Cit9OworCitzdHJ1Y3QgYmF3X2hlYWRlciB7CisgICAgdTE2X3QgICAgICAgaGVhZGVyWzI5XTsvL1soOCszMCsyKzE4KS8yXTsgIDU4IGJ5dGVzICAvKiBjdHIrKDQrYTErYTIrYTMrMithNCkrcW9zK2l2ICovCisgICAgdTE2X3QgICAgICAgaGVhZGVyTGVuOworICAgIHUxNl90ICAgICAgIG1pY1s0XTsgLy9bOC8yXTsgOCBieXRlcworICAgIHUxNl90ICAgICAgIG1pY0xlbjsKKyAgICB1MTZfdCAgICAgICBzbmFwWzRdOyAvL1s4LzJdOyA4IGJ5dGVzCisgICAgdTE2X3QgICAgICAgc25hcExlbjsKKyAgICB1MTZfdCAgICAgICByZW1vdmVMZW47CisgICAgdThfdCAgICAgICAga2V5SWR4OworfTsKKworc3RydWN0IGJ1ZkluZm8geworICAgIHpidWZfdCogICAgIGJ1ZjsKKyAgICB1OF90ICAgICAgICBiYXdfcmV0cmFuc21pdDsKKyAgICB1MzJfdCAgICAgICB0aW1lc3RhbXA7CisgICAgc3RydWN0IGJhd19oZWFkZXIgICAqYmF3X2hlYWRlcjsKK307CisjZW5kaWYKK3N0cnVjdCBhZ2dFbGVtZW50Cit7CisgICAgemJ1Zl90KiAgICAgYnVmOworICAgIHUzMl90ICAgICAgIGFycml2YWxUaW1lOworICAgIHU4X3QgICAgICAgIGJhd19yZXRyYW5zbWl0OworICAgIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyBhZGRJbmZvOworICAgIC8vc3RydWN0IGJhd19oZWFkZXIgIGJhd19oZWFkZXI7Cit9OworCisKKyNpZm5kZWYgWk1fRU5BQkxFX0ZXX0JBX1JFVFJBTlNNSVNTSU9OIC8vZGlzYWJsZSBCQVcKK3N0cnVjdCBiYXdfYnVmCit7CisgICAgemJ1Zl90KiAgICAgYnVmOworICAgIHUxNl90ICAgICAgIGJhd19zZXE7CisgICAgdTMyX3QgICAgICAgdGltZXN0YW1wOworICAgIHU4X3QgICAgICAgIGJhd19yZXRyYW5zbWl0OworICAgIHN0cnVjdCBiYXdfaGVhZGVyIGJhd19oZWFkZXI7Cit9OworCitzdHJ1Y3QgYmF3X3EgeworICAgIHN0cnVjdCBiYXdfYnVmICBmcmFtZVtaTV9WVFhRX1NJWkVdOworICAgIHUxNl90ICAgICAgIGVuYWJsZWQ7CisgICAgdTE2X3QgICAgICAgc3RhcnRfc2VxOworICAgIHUxNl90ICAgICAgIGhlYWQ7CisgICAgdTE2X3QgICAgICAgdGFpbDsKKyAgICB1MTZfdCAgICAgICBzaXplOworICAgIFRJRF9UWCAgICAgIHRpZF90eDsKKworICAgIC8vc3RydWN0IGJhd19oZWFkZXIgKmJhd19oZWFkZXI7Cit9OworCitzdHJ1Y3QgYmF3X2VuYWJsZXIKK3sKKyAgICBzdHJ1Y3QgYmF3X3EgICAgdGlkX2Jhd1taTV9CQVdfUE9PTF9TSVpFXTsKKyAgICB1OF90ICAgIGRlbFBvaW50OworICAgIHZvaWQgICAgKCpjb3JlKSh6ZGV2X3QqIGRldiwgdTE2X3QgYmF3X3NlcSwgdTMyX3QgYml0bWFwLCB1MTZfdCBhZ2dMZW4pOworICAgIC8vdm9pZCAgICAoKmNvcmUpOworICAgIHZvaWQgICAgKCppbml0KSh6ZGV2X3QqIGRldik7CisgICAgVElEX0JBVyAoKmdldE5ld1EpKHpkZXZfdCogZGV2LCB1MTZfdCBzdGFydF9zZXEsIFRJRF9UWCB0aWRfdHgpOworICAgIFRJRF9CQVcgKCpnZXRRKSh6ZGV2X3QqIGRldiwgdTE2X3QgYmF3X3NlcSk7CisgICAgdTE2X3QgICAoKmluc2VydCkoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBiYXdfc2VxLCBUSURfQkFXIHRpZF9iYXcsIHU4X3QgYmF3X3JldHJhbnNtaXQsIHN0cnVjdCBiYXdfaGVhZGVyX3IgKmhlYWRlcl9yKTsKKyAgICBzdHJ1Y3QgYnVmSW5mbyogKCpwb3ApKHpkZXZfdCogZGV2LCB1MTZfdCBpbmRleCwgVElEX0JBVyB0aWRfYmF3KTsKKyAgICB2b2lkICAgICgqZW5hYmxlKSh6ZGV2X3QqIGRldiwgVElEX0JBVyB0aWRfYmF3LCB1MTZfdCBzdGFydF9zZXEpOworICAgIHZvaWQgICAgKCpkaXNhYmxlKSh6ZGV2X3QqIGRldiwgVElEX0JBVyB0aWRfYmF3KTsKKworfTsKKyNlbmRpZgorc3RydWN0IGFnZ1F1ZXVlCit7CisgICAgc3RydWN0ICAgICAgYWdnRWxlbWVudCAgYWdndnR4cVtaTV9BR0dRX1NJWkVdOworICAgIHUxNl90ICAgICAgIGFnZ0hlYWQ7CisgICAgdTE2X3QgICAgICAgYWdnVGFpbDsKKyAgICBzMTZfdCAgICAgICBzaXplOworICAgIHUxNl90ICAgICAgIGFnZ1FTVEE7CisgICAgdTE2X3QgICAgICAgYWdnUUVuYWJsZWQ7CisgICAgdTE2X3QgICAgICAgYWM7CisgICAgdTE2X3QgICAgICAgdGlkOworICAgIHUxNl90ICAgICAgIGFnZ1JlYWR5OworICAgIHUxNl90ICAgICAgIGNsZWFyRmxhZzsKKyAgICB1MTZfdCAgICAgICBkZWxldGVGbGFnOworICAgIHUzMl90ICAgICAgIGxhc3RBcnJpdmFsOworICAgIHUxNl90ICAgICAgIGFnZ0ZyYW1lU2l6ZTsKKyAgICB1MTZfdCAgICAgICBiYXJfc3NuOyAgICAvKiBzdGFydGluZyBzZXF1ZW5jZSBudW1iZXIgaW4gQkFSICovCisgICAgdTE2X3QgICAgICAgZHN0WzNdOworICAgIHUxNl90ICAgICAgIGNvbXBsZXRlOyAgICAgLyogY29tcGxldGUgaW5kaWNhdGlvbiBwb2ludGVyICovCit9OworCitzdHJ1Y3QgYWdnU3RhCit7CisgICAgdTE2X3QgICAgICAgY291bnRbWk1fQUNdOworICAgIFRJRF9UWCAgICAgIHRpZF90eFs4XTsKKyAgICB1MTZfdCAgICAgICBhZ2dGbGFnW1pNX0FDXTsKK307CisKK3N0cnVjdCBhZ2dfdGlkX3J4Cit7CisgICAgdTE2X3QgICAgICAgYWlkOworICAgIHUxNl90ICAgICAgIGFjOworICAgIHUxNl90ICAgICAgIGFkZEJhRXhjaGFuZ2VTdGF0dXNDb2RlOworICAgIC8vc3RydWN0IHpzQWRkaXRpb25JbmZvICphZGRJbmZvOworICAgIHUxNl90ICAgICAgIHNlcV9zdGFydDsJCS8qIGZpcnN0IHNlcSBleHBlY3RlZCBuZXh0ICovCisgICAgdTE2X3QgICAgICAgYmF3X2hlYWQ7CQkvKiBoZWFkIG9mIHZhbGlkIGJsb2NrIGFjayB3aW5kb3cgKi8KKyAgICB1MTZfdCAgICAgICBiYXdfdGFpbDsJCS8qIHRhaWwgb2YgdmFsaWQgYmxvY2sgYWNrIHdpbmRvdyAqLworICAgIC8vdTE2X3QgICAgICAgZnJlZV9jb3VudDsJCS8qIGJsb2NrIGFjayB3aW5kb3cgc2l6ZQkqLworICAgIHU4X3QgICAgICAgIHNxX2V4Y2VlZF9jb3VudDsKKyAgICB1OF90ICAgICAgICBzcV9iZWhpbmRfY291bnQ7CisgICAgc3RydWN0IGFnZ0VsZW1lbnQgZnJhbWVbWk1fQUdHX0JBV19TSVpFICsgMV07IC8qIG91dC1vZi1vcmRlciByeCBmcmFtZXMgKi8KK307CisKK3N0cnVjdCBhZ2dDb250cm9sCit7CisgICAgdTE2X3QgICAgICAgYWdnRW5hYmxlZDsKKyAgICB1MTZfdCAgICAgICBhbXBkdUluZGljYXRpb247CisgICAgdTE2X3QgICAgICAgYWRkYmFJbmRpY2F0aW9uOworICAgIC8vVElEX0JBVyAgICAgdGlkX2JhdzsKKyAgICB1MzJfdCAgICAgICB0aW1lc3RhbXA7Cit9OworCitzdHJ1Y3QgYWdnQmFGcmFtZVBhcmFtZXRlcgoreworICAgIHpidWZfdCogICAgIGJ1ZjsKKyAgICB1MTZfdCAgICAgICBiYV9wYXJhbWV0ZXI7CisgICAgdThfdCAgICAgICAgZGlhbG9nOworICAgIHUxNl90ICAgICAgIGJhX3BvbGljeTsKKyAgICB1MTZfdCAgICAgICB0aWQ7CisgICAgdTE2X3QgICAgICAgYnVmZmVyX3NpemU7CisgICAgdTE2X3QgICAgICAgYmFfdGltZW91dDsKKyAgICB1MTZfdCAgICAgICBiYV9zdGFydF9zZXE7CisgICAgdTE2X3QgICAgICAgc3RhdHVzX2NvZGU7Cit9OworCitzdHJ1Y3QgYWdnQmFyQ29udHJvbAoreworICAgIHUxNl90ICAgICAgIGJhcl9hY2tfcG9saWN5ICAgICAgOworICAgIHUxNl90ICAgICAgIG11bHRpX3RpZCAgICAgICAgICAgOworICAgIHUxNl90ICAgICAgIGNvbXByZXNzZWRfYml0bWFwICAgOworICAgIHUxNl90ICAgICAgIHRpZF9pbmZvICAgICAgICAgICAgOworfTsKKworc3RydWN0IGFnZ1RhbGx5Cit7CisgICAgdTMyX3QgICAgICAgZ290X3BhY2tldHNfc3VtOworICAgIHUzMl90ICAgICAgIGdvdF9ieXRlc19zdW07CisgICAgdTMyX3QgICAgICAgc2VudF9wYWNrZXRzX3N1bTsKKyAgICB1MzJfdCAgICAgICBzZW50X2J5dGVzX3N1bTsKKyAgICB1MzJfdCAgICAgICBhdmdfZ290X3BhY2tldHM7CisgICAgdTMyX3QgICAgICAgYXZnX2dvdF9ieXRlczsKKyAgICB1MzJfdCAgICAgICBhdmdfc2VudF9wYWNrZXRzOworICAgIHUzMl90ICAgICAgIGF2Z19zZW50X2J5dGVzOworICAgIHUxNl90ICAgICAgIHRpbWU7Cit9OworCisKK3N0cnVjdCBkZXN0USB7CisgICAgc3RydWN0IGRlc3R7CisgICAgICAgIHUxNl90ICAgUXR5cGUgOiAxOyAvKiAwIGFnZ3IsIDEgdnR4cSAqLworICAgICAgICBUSURfVFggIHRpZF90eDsKKyAgICAgICAgdm9pZCogICB2dHhxOworCisgICAgICAgIHN0cnVjdCBkZXN0KiBuZXh0OworICAgIH0gKmRlc3RbNF07CisgICAgc3RydWN0IGRlc3QqIEhlYWRbNF07CisgICAgLy9zMTZfdCAgIHNpemVbNF07CisgICAgdTE2X3QgICBwcHJpOworICAgIHZvaWQgICAgKCppbnNlcnQpKHpkZXZfdCogZGV2LCB1MTZfdCBRdHlwZSwgdTE2X3QgYWMsIFRJRF9UWCB0aWRfdHgsIHZvaWQqIHZ0eHEpOworICAgIHZvaWQgICAgKCpkZWxldGUpKHpkZXZfdCogZGV2LCB1MTZfdCBRdHlwZSwgVElEX1RYIHRpZF90eCwgdm9pZCogdnR4cSk7CisgICAgdm9pZCAgICAoKmluaXQpKHpkZXZfdCogZGV2KTsKKyAgICBzdHJ1Y3QgZGVzdCogKCpnZXROZXh0KSh6ZGV2X3QqIGRldiwgdTE2X3QgYWMpOworICAgIHUxNl90ICAgKCpleGlzdCkoemRldl90KiBkZXYsIHUxNl90IFF0eXBlLCB1MTZfdCBhYywgVElEX1RYIHRpZF90eCwgdm9pZCogdnR4cSk7CisgICAgLy92b2lkICAgICgqc2NhbikoemRldl90KiBkZXYpOworfTsKKy8qCisgKiBhZ2dyZWdhdGlvbiB0eAorICovCit2b2lkICAgIHpmQWdnSW5pdCh6ZGV2X3QqIGRldik7Cit1MTZfdCAgIHpmQXBGaW5kU3RhKHpkZXZfdCogZGV2LCB1MTZfdCogYWRkcik7Cit1MTZfdCAgIHpmQWdnR2V0U3RhKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7CitUSURfVFggIHpmQWdnVHhHZXRRdWV1ZSh6ZGV2X3QqIGRldiwgdTE2X3QgYWlkLCB1MTZfdCB0aWQpOworVElEX1RYICB6ZkFnZ1R4TmV3UXVldWUoemRldl90KiBkZXYsIHUxNl90IGFpZCwgdTE2X3QgdGlkLCB6YnVmX3QqIGJ1Zik7Cit1MTZfdCAgIHpmQWdnVHhFbnF1ZXVlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgYWlkLCBUSURfVFggdGlkX3R4KTsKK3UxNl90ICAgemZBZ2dUeCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IHRpZCk7Cit1MTZfdCAgIHpmQWdnVHhSZWFkeUNvdW50KHpkZXZfdCogZGV2LCB1MTZfdCBhYyk7Cit1MTZfdCAgIHpmQWdnVHhQYXJ0aWFsKHpkZXZfdCogZGV2LCB1MTZfdCBhYywgdTE2X3QgcmVhZHljb3VudCk7Cit1MTZfdCAgIHpmQWdnVHhTZW5kKHpkZXZfdCogZGV2LCB1MzJfdCBmcmVlVHhkLCBUSURfVFggdGlkX3R4KTsKK1RJRF9UWCAgemZBZ2dUeEdldFJlYWR5UXVldWUoemRldl90KiBkZXYsIHUxNl90IGFjKTsKK3pidWZfdCogemZBZ2dUeEdldFZ0eHEoemRldl90KiBkZXYsIFRJRF9UWCB0aWRfdHgpOwordTE2X3QgICB6ZkFnZ1R4RGVsZXRlUXVldWUoemRldl90KiBkZXYsIHUxNl90IHFudW0pOwordTE2X3QgICB6ZkFnZ1NjYW5BbmRDbGVhcih6ZGV2X3QqIGRldiwgdTMyX3QgdGltZSk7Cit1MTZfdCAgIHpmQWdnQ2xlYXJRdWV1ZSh6ZGV2X3QqIGRldik7Cit2b2lkICAgIHpmQWdnVHhTY2hlZHVsZXIoemRldl90KiBkZXYsIHU4X3QgU2NhbkFuZENsZWFyKTsKKworLyogdGlkX3R4IG1hbmlwdWxhdGlvbiAqLworI2lmbmRlZiBaTV9FTkFCTEVfRldfQkFfUkVUUkFOU01JU1NJT04gLy9kaXNhYmxlIEJBVwordTE2X3QgICB6ZkFnZ1RpZFR4SW5zZXJ0SGVhZCh6ZGV2X3QqIGRldiwgc3RydWN0IGJ1ZkluZm8qIGJ1Zl9pbmZvLCBUSURfVFggdGlkX3R4KTsKKyNlbmRpZgordm9pZCAgICB6ZkFnZ0Rlc3RJbnNlcnQoemRldl90KiBkZXYsIHUxNl90IFF0eXBlLCB1MTZfdCBhYywgVElEX1RYIHRpZF90eCwgdm9pZCogdnR4cSk7Cit2b2lkICAgIHpmQWdnRGVzdERlbGV0ZSh6ZGV2X3QqIGRldiwgdTE2X3QgUXR5cGUsIFRJRF9UWCB0aWRfdHgsIHZvaWQqIHZ0eHEpOwordm9pZCAgICB6ZkFnZ0Rlc3RJbml0KHpkZXZfdCogZGV2KTsKK3N0cnVjdCBkZXN0KiB6ZkFnZ0Rlc3RHZXROZXh0KHpkZXZfdCogZGV2LCB1MTZfdCBhYyk7Cit1MTZfdCAgIHpmQWdnRGVzdEV4aXN0KHpkZXZfdCogZGV2LCB1MTZfdCBRdHlwZSwgdTE2X3QgYWMsIFRJRF9UWCB0aWRfdHgsIHZvaWQqIHZ0eHEpOworLyoKKyAqIGFnZ3JlZ2F0aW9uIHJ4CisgKi8KK3N0cnVjdCBhZ2dfdGlkX3J4ICp6ZkFnZ1J4RW5hYmxlZCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordTE2X3QgICB6ZkFnZ1J4KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvICphZGRJbmZvLCBzdHJ1Y3QgYWdnX3RpZF9yeCAqdGlkX3J4KTsKK3N0cnVjdCBhZ2dfdGlkX3J4ICp6ZkFnZ1J4R2V0UXVldWUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3UxNl90ICAgemZBZ2dSeEVucXVldWUoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBzdHJ1Y3QgYWdnX3RpZF9yeCAqdGlkX3J4LCBzdHJ1Y3QgenNBZGRpdGlvbkluZm8gKmFkZEluZm8pOwordTE2X3QgICB6ZkFnZ1J4Rmx1c2goemRldl90KiBkZXYsIHUxNl90IHNlcV9ubywgc3RydWN0IGFnZ190aWRfcnggKnRpZF9yeCk7Cit1MTZfdCAgIHpmQWdnUnhGcmVlQnVmKHpkZXZfdCogZGV2LCB1MTZfdCBkZXN0cm95KTsKK3UxNl90ICAgemZBZ2dSeENsZWFyKHpkZXZfdCogZGV2LCB1MzJfdCB0aW1lKTsKK3ZvaWQgICAgemZBZ2dSZWN2QkFSKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7CisvKgorICogZW5kIG9mIGFnZ3JlZ2F0aW9uIHJ4CisgKi8KKworLyoKKyAqIEFEREJBCisgKi8KK3UxNl90ICAgemZBZ2dTZW5kQWRkYmFSZXF1ZXN0KHpkZXZfdCogZGV2LCB1MTZfdCAqZHN0LCB1MTZfdCBhYywgdTE2X3QgdXApOwordTE2X3QgICB6ZkFnZ1NldEFkZGJhRnJhbWVCb2R5KHpkZXZfdCogZGV2LHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHUxNl90IGFjLCB1MTZfdCB1cCk7Cit1MTZfdCAgIHpmQWdnR2VuQWRkYmFIZWFkZXIoemRldl90KiBkZXYsIHUxNl90KiBkc3QsCisgICAgICAgICAgICAgICAgdTE2X3QqIGhlYWRlciwgdTE2X3QgbGVuLCB6YnVmX3QqIGJ1ZiwgdTE2X3QgdmFwLCB1OF90IGVuY3J5cHQpOwordTE2X3QgICB6ZkFnZ1Byb2Nlc3NBY3Rpb24oemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3UxNl90ICAgemZBZ2dCbG9ja0Fja0FjdGlvbkZyYW1lKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit1MTZfdCAgIHpmQWdnUmVjdkFkZGJhUmVxdWVzdCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordTE2X3QgICB6ZkFnZ1JlY3ZBZGRiYVJlc3BvbnNlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit1MTZfdCAgIHpmQWdnUmVjdkRlbGJhKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit1MTZfdCAgIHpmQWdnU2VuZEFkZGJhUmVzcG9uc2UoemRldl90KiBkZXYsIHN0cnVjdCBhZ2dCYUZyYW1lUGFyYW1ldGVyICpiZik7Cit1MTZfdCAgIHpmQWdnU2V0QWRkYmFSZXNwb25zZUZyYW1lQm9keSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsCisgICAgICAgICAgICAgICAgc3RydWN0IGFnZ0JhRnJhbWVQYXJhbWV0ZXIgKmJmLCB1MTZfdCBvZmZzZXQpOwordTE2X3QgICB6ZkFnZ0FkZGJhU2V0VGlkUngoemRldl90KiBkZXYsIHpidWZfdCogYnVmLAorICAgICAgICAgICAgICAgIHN0cnVjdCBhZ2dCYUZyYW1lUGFyYW1ldGVyICpiZik7CisvKgorICogemZBZ2dUeFNlbmRFdGgKKyAqLwordTE2X3QgemZBZ2dUeFNlbmRFdGgoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBwb3J0LCB1MTZfdCBidWZUeXBlLCB1OF90IGZsYWcsIHN0cnVjdCBhZ2dDb250cm9sICphZ2dDb250cm9sLCBUSURfVFggdGlkX3R4KTsKKworLyoKKyAqIHN0YXRpc3RpY3MgZnVuY3Rpb25zCisgKi8KK3UxNl90IHpmQWdnVGFsbHlSZXNldCh6ZGV2X3QqIGRldik7CisKK3UxNl90ICAgemZBZ2dQcmludFRhbGx5KHpkZXZfdCogZGV2KTsKKworLyoKKyAqIEJBUgorICovCit2b2lkICAgIHpmQWdnSW52b2tlQmFyKHpkZXZfdCogZGV2LCBUSURfVFggdGlkX3R4KTsKK3UxNl90ICAgemZBZ2dTZW5kQmFyKHpkZXZfdCogZGV2LCBUSURfVFggdGlkX3R4LCBzdHJ1Y3QgYWdnQmFyQ29udHJvbCAqYWdnQmFyQ29udHJvbCk7Cit1MTZfdCAgIHpmQWdnU2V0QmFyQm9keSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgVElEX1RYIHRpZF90eCwgc3RydWN0IGFnZ0JhckNvbnRyb2wgKmFnZ0JhckNvbnRyb2wpOwordTE2X3QgICB6ZkFnZ0dlbkJhckhlYWRlcih6ZGV2X3QqIGRldiwgdTE2X3QqIGRzdCwKKyAgICAgICAgICAgICAgICB1MTZfdCogaGVhZGVyLCB1MTZfdCBsZW4sIHpidWZfdCogYnVmLCB1MTZfdCB2YXAsIHU4X3QgZW5jcnlwdCk7CisKKyNpZm5kZWYgWk1fRU5BQkxFX0ZXX0JBX1JFVFJBTlNNSVNTSU9OIC8vZGlzYWJsZSBCQVcKKy8qIEJBVyBCQSByZXRyYW5zbWlzc2lvbiAqLwordm9pZCAgICB6ZkJhd0NvcmUoemRldl90KiBkZXYsIHUxNl90IGJhd19zZXEsIHUzMl90IGJpdG1hcCwgdTE2X3QgYWdnTGVuKTsKK3ZvaWQgICAgemZCYXdJbml0KHpkZXZfdCogZGV2KTsKK1RJRF9CQVcgemZCYXdHZXROZXdRKHpkZXZfdCogZGV2LCB1MTZfdCBzdGFydF9zZXEsIFRJRF9UWCB0aWRfdHgpOwordTE2X3QgICB6ZkJhd0luc2VydCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IGJhd19zZXEsIFRJRF9CQVcgdGlkX2JhdywgdThfdCBiYXdfcmV0cmFuc21pdCwgc3RydWN0IGJhd19oZWFkZXJfciAqaGVhZGVyX3IpOworc3RydWN0IGJ1ZkluZm8qIHpmQmF3UG9wKHpkZXZfdCogZGV2LCB1MTZfdCBpbmRleCwgVElEX0JBVyB0aWRfYmF3KTsKK3ZvaWQgICAgemZCYXdFbmFibGUoemRldl90KiBkZXYsIFRJRF9CQVcgdGlkX2JhdywgdTE2X3Qgc3RhcnRfc2VxKTsKK3ZvaWQgICAgemZCYXdEaXNhYmxlKHpkZXZfdCogZGV2LCBUSURfQkFXIHRpZF9iYXcpOworVElEX0JBVyB6ZkJhd0dldFEoemRldl90KiBkZXYsIHUxNl90IGJhd19zZXEpOwordm9pZCB6ZkFnZ1R4UmV0cmFuc21pdCh6ZGV2X3QqIGRldiwgc3RydWN0IGJ1ZkluZm8gKmJ1Zl9pbmZvLCBzdHJ1Y3QgYWdnQ29udHJvbCAqYWdnQ29udHJvbCwgVElEX1RYIHRpZF90eCk7CisjZW5kaWYKKy8qIGV4dGVybiBmdW5jdGlvbnMgKi8KK2V4dGVybiB6YnVmX3QqIHpmR2V0VnR4cSh6ZGV2X3QqIGRldiwgdThfdCBhYyk7CisKKyNlbmRpZiAvKiAjaWZuZGVmIF9DQUdHX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NjbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jY21kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc5OTc3OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jY21kLmMKQEAgLTAsMCArMSwxODYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kdWxlIE5hbWUgOiBjbWQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGNvbW1hbmQgaW50ZXJmYWNlIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiY3ByZWNvbXAuaCIKKyNpbmNsdWRlICIuLi9oYWwvaHByZWcuaCIKKworCit1MTZfdCB6ZldsYW5SZXNldCh6ZGV2X3QqIGRldik7Cit1MzJfdCB6ZlVwZGF0ZVJ4UmF0ZSh6ZGV2X3QqIGRldik7CisKKworZXh0ZXJuIHZvaWQgemZpVXNiUmVjdih6ZGV2X3QgKmRldiwgemJ1Zl90ICpidWYpOworZXh0ZXJuIHZvaWQgemZpVXNiUmVnSW4oemRldl90KiBkZXYsIHUzMl90KiByc3AsIHUxNl90IHJzcExlbik7CitleHRlcm4gdm9pZCB6ZmlVc2JPdXRDb21wbGV0ZSh6ZGV2X3QqIGRldiwgemJ1Zl90ICpidWYsIHU4X3Qgc3RhdHVzLCB1OF90ICpoZHIpOworZXh0ZXJuIHZvaWQgemZpVXNiUmVnT3V0Q29tcGxldGUoemRldl90KiBkZXYpOworZXh0ZXJuIHUxNl90IHpmSHBSZWluaXQoemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSk7CisKKy8qIEdldCBzaXplIChieXRlKSBvZiBkcml2ZXIgY29yZSBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmUuICAgICovCisvKiBUaGlzIHNpemUgd2lsbCBiZSB1c2VkIGJ5IGRyaXZlciB3cmFwcGVyIHRvIGFsbG9jYXRlICAgICAqLworLyogYSBtZW1vcnkgc3BhY2UgZm9yIGRyaXZlciBjb3JlIHRvIHN0b3JlIGdsb2JhbCB2YXJpYWJsZXMgKi8KK3UxNl90IHpmaUdsb2JhbERhdGFTaXplKHpkZXZfdCogZGV2KQoreworICAgIHUzMl90IHJldDsKKyAgICByZXQgPSAoc2l6ZW9mKHN0cnVjdCB6c1dsYW5EZXYpKTsKKyAgICB6bV9hc3NlcnQoKHJldD4+MTYpID09IDApOworICAgIHJldHVybiAodTE2X3QpcmV0OworfQorCisKKy8qIEluaXRpYWxpemUgV0xBTiBoYXJkd2FyZSBhbmQgc29mdHdhcmUsIHJlc291cmNlIHdpbGwgYmUgYWxsb2NhdGVkICovCisvKiBmb3IgV0xBTiBvcGVyYXRpb24sIG11c3QgYmUgY2FsbGVkIGZpcnN0IGJlZm9yZSBvdGhlciBmdW5jdGlvbi4gICAqLworZXh0ZXJuIHUxNl90IHpmaVdsYW5PcGVuKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNDYkZ1bmNUYmwqIGNiRnVuY1RibCkKK3sKKyAgICAvL3UxNl90IHJldDsKKyAgICAvL3UzMl90IGk7CisgICAgLy91OF90KiBjaDsKKyAgICAvL3U4X3QgIGJQYXNzaXZlOworICAgIHUzMl90IGRldlNpemU7CisgICAgc3RydWN0IHpmQ2JVc2JGdW5jVGJsIGNiVXNiRnVuY1RibDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9kZWJ1Z19tc2cwKCJzdGFydCIpOworCisgICAgZGV2U2l6ZSA9IHNpemVvZihzdHJ1Y3QgenNXbGFuRGV2KTsKKyAgICAvKiBaZXJvaXplIHpzV2xhbkRldiBzdHJ1Y3QgKi8KKyAgICB6Zlplcm9NZW1vcnkoKHU4X3QqKXdkLCAodTE2X3QpZGV2U2l6ZSk7CisKKyNpZmRlZiBaTV9FTkFCTEVfQUdHUkVHQVRJT04KKyAgICB6ZkFnZ0luaXQoZGV2KTsKKyNlbmRpZgorCisgICAgemZDd21Jbml0KGRldik7CisKKyAgICB3ZC0+Y29tbVRhbGx5LlJhdGVDdHJsVHhNUERVID0gMDsKKyAgICB3ZC0+Y29tbVRhbGx5LlJhdGVDdHJsQkFGYWlsID0gMDsKKyAgICB3ZC0+cHJlYW1ibGVUeXBlSW5Vc2VkID0gWk1fUFJFQU1CTEVfVFlQRV9TSE9SVDsKKworICAgIGlmIChjYkZ1bmNUYmwgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8qIHpmY2JSZWN2RXRoKCkgaXMgbWFuZGF0b3J5ICovCisgICAgICAgIHptX2Fzc2VydCgwKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKGNiRnVuY1RibC0+emZjYlJlY3ZFdGggPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogemZjYlJlY3ZFdGgoKSBpcyBtYW5kYXRvcnkgKi8KKyAgICAgICAgICAgIHptX2Fzc2VydCgwKTsKKyAgICAgICAgfQorICAgICAgICB3ZC0+emZjYkF1dGhOb3RpZnkgPSBjYkZ1bmNUYmwtPnpmY2JBdXRoTm90aWZ5OworICAgICAgICB3ZC0+emZjYkF1dGhOb3RpZnkgPSBjYkZ1bmNUYmwtPnpmY2JBdXRoTm90aWZ5OworICAgICAgICB3ZC0+emZjYkFzb2NOb3RpZnkgPSBjYkZ1bmNUYmwtPnpmY2JBc29jTm90aWZ5OworICAgICAgICB3ZC0+emZjYkRpc0Fzb2NOb3RpZnkgPSBjYkZ1bmNUYmwtPnpmY2JEaXNBc29jTm90aWZ5OworICAgICAgICB3ZC0+emZjYkFwQ29ubmVjdE5vdGlmeSA9IGNiRnVuY1RibC0+emZjYkFwQ29ubmVjdE5vdGlmeTsKKyAgICAgICAgd2QtPnpmY2JDb25uZWN0Tm90aWZ5ID0gY2JGdW5jVGJsLT56ZmNiQ29ubmVjdE5vdGlmeTsKKyAgICAgICAgd2QtPnpmY2JTY2FuTm90aWZ5ID0gY2JGdW5jVGJsLT56ZmNiU2Nhbk5vdGlmeTsKKyAgICAgICAgd2QtPnpmY2JNaWNGYWlsdXJlTm90aWZ5ID0gY2JGdW5jVGJsLT56ZmNiTWljRmFpbHVyZU5vdGlmeTsKKyAgICAgICAgd2QtPnpmY2JBcE1pY0ZhaWx1cmVOb3RpZnkgPSBjYkZ1bmNUYmwtPnpmY2JBcE1pY0ZhaWx1cmVOb3RpZnk7CisgICAgICAgIHdkLT56ZmNiSWJzc1BhcnRuZXJOb3RpZnkgPSBjYkZ1bmNUYmwtPnpmY2JJYnNzUGFydG5lck5vdGlmeTsKKyAgICAgICAgd2QtPnpmY2JNYWNBZGRyZXNzTm90aWZ5ID0gY2JGdW5jVGJsLT56ZmNiTWFjQWRkcmVzc05vdGlmeTsKKyAgICAgICAgd2QtPnpmY2JTZW5kQ29tcGxldGVJbmRpY2F0aW9uID0gY2JGdW5jVGJsLT56ZmNiU2VuZENvbXBsZXRlSW5kaWNhdGlvbjsKKyAgICAgICAgd2QtPnpmY2JSZWN2RXRoID0gY2JGdW5jVGJsLT56ZmNiUmVjdkV0aDsKKyAgICAgICAgd2QtPnpmY2JSZXN0b3JlQnVmRGF0YSA9IGNiRnVuY1RibC0+emZjYlJlc3RvcmVCdWZEYXRhOworICAgICAgICB3ZC0+emZjYlJlY3Y4MDIxMSA9IGNiRnVuY1RibC0+emZjYlJlY3Y4MDIxMTsKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICB3ZC0+emZjYkNlbmNBc29jTm90aWZ5ID0gY2JGdW5jVGJsLT56ZmNiQ2VuY0Fzb2NOb3RpZnk7CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICB3ZC0+emZjYkNsYXNzaWZ5VHhQYWNrZXQgPSBjYkZ1bmNUYmwtPnpmY2JDbGFzc2lmeVR4UGFja2V0OworICAgICAgICB3ZC0+emZjYkh3V2F0Y2hEb2dOb3RpZnkgPSBjYkZ1bmNUYmwtPnpmY2JId1dhdGNoRG9nTm90aWZ5OworICAgIH0KKworICAgIC8vYWRkIGJ5IGhvbmRhIDAzMzAKKyAgICBjYlVzYkZ1bmNUYmwuemZjYlVzYlJlY3YgPSB6ZmlVc2JSZWN2OworICAgIGNiVXNiRnVuY1RibC56ZmNiVXNiUmVnSW4gPSB6ZmlVc2JSZWdJbjsKKyAgICBjYlVzYkZ1bmNUYmwuemZjYlVzYk91dENvbXBsZXRlID0gemZpVXNiT3V0Q29tcGxldGU7CisgICAgY2JVc2JGdW5jVGJsLnpmY2JVc2JSZWdPdXRDb21wbGV0ZSA9IHpmaVVzYlJlZ091dENvbXBsZXRlOworICAgIHpmd1VzYlJlZ2lzdGVyQ2FsbEJhY2soZGV2LCAmY2JVc2JGdW5jVGJsKTsKKyAgICAvKiBJbml0IE9XTiBNQUMgYWRkcmVzcyAqLworICAgIHdkLT5tYWNBZGRyWzBdID0gMHg4MDAwOworICAgIHdkLT5tYWNBZGRyWzFdID0gMHgwMDAwOworICAgIHdkLT5tYWNBZGRyWzJdID0gMHgwMDAwOworCisgICAgd2QtPnJlZ3VsYXRpb25UYWJsZS5yZWdpb25Db2RlID0gMHhmZmZmOworCisgICAgemZIcEluaXQoZGV2LCB3ZC0+ZnJlcXVlbmN5KTsKKworICAgIC8qIGluaXQgcmVnaW9uIGNvZGUgKi8KKyAgICAvL3dkLT5yZWd1bGF0aW9uVGFibGUucmVnaW9uQ29kZSA9IE5VTEwxX1dPUkxEOyAvL09ubHkgMi40ZyBSZWdDb2RlCisgICAgLy96ZkhwR2V0UmVndWxhdGlvblRhYmxlZnJvbVJlZ2lvbkNvZGUoZGV2LCBOVUxMMV9XT1JMRCk7CisgICAgLy96ZmlXbGFuU2V0RG90MTFETW9kZShkZXYgLCAxKTsgLy8gRW5hYmxlIDgwMi4xMWQKKyAgICAvKiBHZXQgdGhlIGZpcnN0IGNoYW5uZWwgKi8KKyAgICAvL3dkLT5mcmVxdWVuY3kgPSB6ZkNoR2V0Rmlyc3RDaGFubmVsKGRldiwgJmJQYXNzaXZlKTsKKyNpZmRlZiBaTV9BUF9ERUJVRworICAgIC8vd2QtPmZyZXF1ZW5jeSA9IDI0Mzc7CisjZW5kaWYKKworICAgIC8vU1RBIG1vZGUKKyAgICB3ZC0+c3RhLm1UeFJhdGUgPSAweDA7CisgICAgd2QtPnN0YS51VHhSYXRlID0gMHgzOworICAgIHdkLT5zdGEubW1UeFJhdGUgPSAweDA7CisgICAgd2QtPnN0YS5hZGFwdGVyU3RhdGUgPSBaTV9TVEFfU1RBVEVfRElTQ09OTkVDVDsKKyAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gPSAweDAxOworICAgIHdkLT5zdGEuY2FwYWJpbGl0eVsxXSA9IDB4MDA7CisKKyAgICB3ZC0+c3RhLnByZWFtYmxlVHlwZUhUID0gMDsKKyAgICB3ZC0+c3RhLmh0Q3RybEJhbmR3aWR0aCA9IDA7CisgICAgd2QtPnN0YS5odEN0cmxTVEJDID0gMDsKKyAgICB3ZC0+c3RhLmh0Q3RybFNHID0gMDsKKyAgICB3ZC0+c3RhLmRlZmF1bHRUQSA9IDA7CisgICAgLy93ZC0+c3RhLmFjdGl2ZXNjYW5UaWNrUGVyQ2hhbm5lbCA9IFpNX1RJTUVfQUNUSVZFX1NDQU4vWk1fTVNfUEVSX1RJQ0s7CisJeworCQl1OF90IER1ciA9IFpNX1RJTUVfQUNUSVZFX1NDQU47CisJCXpmd0dldEFjdGl2ZVNjYW5EdXIoZGV2LCAmRHVyKTsKKwkJd2QtPnN0YS5hY3RpdmVzY2FuVGlja1BlckNoYW5uZWwgPSBEdXIvWk1fTVNfUEVSX1RJQ0s7CisKKwl9CisgICAgd2QtPnN0YS5wYXNzaXZlU2NhblRpY2tQZXJDaGFubmVsID0gWk1fVElNRV9QQVNTSVZFX1NDQU4vWk1fTVNfUEVSX1RJQ0s7CisgICAgd2QtPnN0YS5iQXV0b1JlY29ubmVjdCA9IFRSVUU7CisgICAgd2QtPnN0YS5kcm9wVW5lbmNyeXB0ZWRQa3RzID0gRkFMU0U7CisKKyAgICAvKiBzZXQgZGVmYXVsdCB0byBieXBhc3MgYWxsIG11bHRpY2FzdCBwYWNrZXQgZm9yIGxpbnV4LCB3aW5kb3cgWFAgd291bGQgc2V0IDAgYnkgd3JhcHBlciBpbml0aWFsaXphdGlvbiAqLworCXdkLT5zdGEuYkFsbE11bHRpY2FzdCA9IDE7CisKKyAgICAvKiBJbml0aWFsIHRoZSBSSUZTIFN0YXR1cyAvIFJJRlMtbGlrZSBmcmFtZSBjb3VudCAvIFJJRlMgY291bnQgKi8KKyAgICB3ZC0+c3RhLnJpZnNTdGF0ZSA9IFpNX1JJRlNfU1RBVEVfREVURUNUSU5HOworICAgIHdkLT5zdGEucmlmc0xpa2VGcmFtZUNudCA9IDA7CisgICAgd2QtPnN0YS5yaWZzQ291bnQgPSAwOworCisgICAgd2QtPnN0YS5vc1J4RmlsdGVyID0gMDsKKyAgICB3ZC0+c3RhLmJTYWZlTW9kZSA9IDA7CisKKyAgICAvL0NvbW1vbgorICAgIHpmUmVzZXRTdXBwb3J0UmF0ZShkZXYsIFpNX0RFRkFVTFRfU1VQUE9SVF9SQVRFX0RJU0NPTk5FQ1QpOworICAgIHdkLT5iZWFjb25JbnRlcnZhbCA9IDEwMDsKKyAgICB3ZC0+cnRzVGhyZXNob2xkID0gMjM0NjsKKyAgICB3ZC0+ZnJhZ1RocmVzaG9sZCA9IDMyNzY3OworICAgIHdkLT53bGFuTW9kZSA9IFpNX01PREVfSU5GUkFTVFJVQ1RVUkU7CisgICAgd2QtPnR4TUNTID0gMHhmZjsgICAgLy9BVVRPCisgICAgd2QtPmR0aW0gPSAxOworICAgIC8vd2QtPnR4TVQgPSAxOyAgICAgICAvL09GRE0KKyAgICB3ZC0+dGljayA9IDE7CisgICAgd2QtPm1heFR4UG93ZXIyID0gMHhmZjsKKyAgICB3ZC0+bWF4VHhQb3dlcjUgPSAweGZmOworICAgIHdkLT5zdXBwb3J0TW9kZSA9IDB4ZmZmZmZmZmY7CisgICAgd2QtPndzLmFkaG9jTW9kZSA9IFpNX0FESE9DQkFORF9HOworICAgIHdkLT53cy5hdXRvU2V0RnJlcXVlbmN5ID0gMHhmZjsKKworICAgIC8vQVAgbW9kZQorICAgIC8vd2QtPmJnTW9kZSA9IHdkLT53cy5iZ01vZGU7CisgICAgd2QtPmFwLnNzaWRMZW5bMF0gPSA2OworICAgIHdkLT5hcC5zc2lkWzBdWzBdID0gJ1onOworICAgIHdkLT5hcC5zc2lkWzBdWzFdID0gJ0QnOworICAgIHdkLT5hcC5zc2lkWzBdWzJdID0gJzEnOworICAgIHdkLT5hcC5zc2lkWzBdWzNdID0gJzInOworICAgIHdkLT5hcC5zc2lkWzBdWzRdID0gJzInOworICAgIHdkLT5hcC5zc2lkWzBdWzVdID0gJzEnOworCisgICAgLy8gSW5pdCB0aGUgY291bnRyeSBpc28gbmFtZSBhcyBOQQorICAgIHdkLT53cy5jb3VudHJ5SXNvTmFtZVswXSA9IDA7CisgICAgd2QtPndzLmNvdW50cnlJc29OYW1lWzFdID0gMDsKKyAgICB3ZC0+d3MuY291bnRyeUlzb05hbWVbMl0gPSAnXDAnOworCisJLyogaW5pdCBmcmFnbWVudGF0aW9uIGlzIGRpc2FibGVkICovCisJLy96ZmlXbGFuU2V0RnJhZ1RocmVzaG9sZChkZXYsIDApOworCisJLyogYWlyb3BlZWsgOiBzd1NuaWZmZXIgMT0+b24gIDA9Pm9mZiAqLworCXdkLT5zd1NuaWZmZXIgPSAwOworICAgIHdkLT5YTGlua01vZGUgPSAwOworCisvLyBqaGxlZSBIVCAwCisjaWYgMQorICAgIC8qIEFQIE1vZGUqLworICAgIC8qIEluaXQgSFQgQ2FwYWJpbGl0eSBJbmZvICovCisgICAgd2QtPmFwLkhUQ2FwLkRhdGEuRWxlbWVudElEID0gWk1fV0xBTl9FSURfSFRfQ0FQQUJJTElUWTsKKyAgICB3ZC0+YXAuSFRDYXAuRGF0YS5MZW5ndGggPSAyNjsKKyAgICAvL3dkLT5hcC5IVENhcC5EYXRhLlN1cENoYW5uZWxXaWR0aFNldCA9IDA7CisgICAgLy93ZC0+YXAuSFRDYXAuRGF0YS5NSU1PUG93ZXJTYXZlID0gMzsKKyAgICAvL3dkLT5hcC5IVENhcC5EYXRhLlNob3J0R0lmb3I0ME1IeiA9IDA7CisgICAgLy93ZC0+YXAuSFRDYXAuRGF0YS5TaG9ydEdJZm9yMjBNSHogPSAwOworICAgIC8vd2QtPmFwLkhUQ2FwLkRhdGEuRFNTU2FuZENDS2luNDBNSHogPSAwOworICAgIHdkLT5hcC5IVENhcC5EYXRhLkFNUERVUGFyYW0gfD0gSFRDQVBfTWF4UnhBTVBEVTM7CisgICAgd2QtPmFwLkhUQ2FwLkRhdGEuTUNTU2V0WzBdID0gMHhGRjsgLy8gTUNTIDAgfiAgNworICAgIHdkLT5hcC5IVENhcC5EYXRhLk1DU1NldFsxXSA9IDB4RkY7IC8vIE1DUyA4IH4gMTUKKworICAgIC8qIEluaXQgRXh0ZW5kZWQgSFQgQ2FwYWJpbGl0eSBJbmZvICovCisgICAgd2QtPmFwLkV4dEhUQ2FwLkRhdGEuRWxlbWVudElEID0gWk1fV0xBTl9FSURfRVhURU5ERURfSFRfQ0FQQUJJTElUWTsKKyAgICB3ZC0+YXAuRXh0SFRDYXAuRGF0YS5MZW5ndGggPSAyMjsKKyAgICB3ZC0+YXAuRXh0SFRDYXAuRGF0YS5Db250cm9sQ2hhbm5lbCA9IDY7CisgICAgLy93ZC0+YXAuRXh0SFRDYXAuRGF0YS5FeHRDaGFubmVsT2Zmc2V0ID0gMzsKKyAgICB3ZC0+YXAuRXh0SFRDYXAuRGF0YS5DaGFubmVsSW5mbyB8PSBFeHRIdENhcF9SZWNvbVR4V2lkdGhTZXQ7CisgICAgLy93ZC0+YXAuRXh0SFRDYXAuRGF0YS5SSUZTTW9kZSA9IDE7CisgICAgd2QtPmFwLkV4dEhUQ2FwLkRhdGEuT3BlcmF0aW5nSW5mbyB8PSAxOworCisgICAgLyogU1RBIE1vZGUqLworICAgIC8qIEluaXQgSFQgQ2FwYWJpbGl0eSBJbmZvICovCisgICAgd2QtPnN0YS5IVENhcC5EYXRhLkVsZW1lbnRJRCA9IFpNX1dMQU5fRUlEX0hUX0NBUEFCSUxJVFk7CisgICAgd2QtPnN0YS5IVENhcC5EYXRhLkxlbmd0aCA9IDI2OworCisgICAgLyogVGVzdCB3aXRoIDVHLUFQIDogNzYwMyAqLworICAgIC8vd2QtPnN0YS5IVENhcC5EYXRhLlN1cENoYW5uZWxXaWR0aFNldCA9IDE7CisgICAgd2QtPnN0YS5IVENhcC5EYXRhLkh0Q2FwSW5mbyB8PSBIVENBUF9TTUVuYWJsZWQ7CisgICAgd2QtPnN0YS5IVENhcC5EYXRhLkh0Q2FwSW5mbyB8PSBIVENBUF9TdXBDaGFubmVsV2lkdGhTZXQ7CisgICAgd2QtPnN0YS5IVENhcC5EYXRhLkh0Q2FwSW5mbyB8PSBIVENBUF9TaG9ydEdJZm9yNDBNSHo7CisgICAgd2QtPnN0YS5IVENhcC5EYXRhLkh0Q2FwSW5mbyB8PSBIVENBUF9EU1NTYW5kQ0NLaW40ME1IejsKKyNpZm5kZWYgWk1fRElTQUJMRV9BTVNEVThLX1NVUFBPUlQKKyAgICB3ZC0+c3RhLkhUQ2FwLkRhdGEuSHRDYXBJbmZvIHw9IEhUQ0FQX01heEFNU0RVTGVuZ3RoOworI2VuZGlmCisgICAgLy93ZC0+c3RhLkhUQ2FwLkRhdGEuTUlNT1Bvd2VyU2F2ZSA9IDA7CisgICAgLy93ZC0+c3RhLkhUQ2FwLkRhdGEuU2hvcnRHSWZvcjQwTUh6ID0gMDsKKyAgICAvL3dkLT5zdGEuSFRDYXAuRGF0YS5TaG9ydEdJZm9yMjBNSHogPSAwOworICAgIC8vd2QtPnN0YS5IVENhcC5EYXRhLkRTU1NhbmRDQ0tpbjQwTUh6ID0gMDsKKyAgICB3ZC0+c3RhLkhUQ2FwLkRhdGEuQU1QRFVQYXJhbSB8PSBIVENBUF9NYXhSeEFNUERVMzsKKyAgICB3ZC0+c3RhLkhUQ2FwLkRhdGEuTUNTU2V0WzBdID0gMHhGRjsgLy8gTUNTIDAgfiAgNworICAgIHdkLT5zdGEuSFRDYXAuRGF0YS5NQ1NTZXRbMV0gPSAweEZGOyAvLyBNQ1MgOCB+IDE1CisgICAgd2QtPnN0YS5IVENhcC5EYXRhLlBDTyB8PSBIVENBUF9UcmFuc21pc3Npb25UaW1lMzsKKyAgICAvL3dkLT5zdGEuSFRDYXAuRGF0YS5UcmFuc21pc3Npb25UaW1lID0gMDsKKyAgICAvKiBJbml0IEV4dGVuZGVkIEhUIENhcGFiaWxpdHkgSW5mbyAqLworICAgIHdkLT5zdGEuRXh0SFRDYXAuRGF0YS5FbGVtZW50SUQgPSBaTV9XTEFOX0VJRF9FWFRFTkRFRF9IVF9DQVBBQklMSVRZOworICAgIHdkLT5zdGEuRXh0SFRDYXAuRGF0YS5MZW5ndGggPSAyMjsKKyAgICB3ZC0+c3RhLkV4dEhUQ2FwLkRhdGEuQ29udHJvbENoYW5uZWwgPSA2OworCisgICAgLy93ZC0+c3RhLkV4dEhUQ2FwLkRhdGEuRXh0Q2hhbm5lbE9mZnNldCB8PSAzOworICAgIHdkLT5zdGEuRXh0SFRDYXAuRGF0YS5DaGFubmVsSW5mbyB8PSBFeHRIdENhcF9FeHRDaGFubmVsT2Zmc2V0QmVsb3c7CisKKyAgICAvL3dkLT5zdGEuRXh0SFRDYXAuRGF0YS5SZWNvbVR4V2lkdGhTZXQgPSAxOworICAgIC8vd2QtPnN0YS5FeHRIVENhcC5EYXRhLlJJRlNNb2RlID0gMTsKKyAgICB3ZC0+c3RhLkV4dEhUQ2FwLkRhdGEuT3BlcmF0aW5nSW5mbyB8PSAxOworI2VuZGlmCisKKyNpZiAwCisgICAgLyogV01FIHRlc3QgY29kZSAqLworICAgIHdkLT5hcC5xb3NNb2RlWzBdID0gMTsKKyNlbmRpZgorCisgICAgd2QtPmxlZFN0cnVjdC5sZWRNb2RlWzBdID0gMHgyMjIxOworICAgIHdkLT5sZWRTdHJ1Y3QubGVkTW9kZVsxXSA9IDB4MjIyMTsKKworICAgIHpmVGltZXJJbml0KGRldik7CisKKyAgICBaTV9QRVJGT1JNQU5DRV9JTklUKGRldik7CisKKyAgICB6ZkJzc0luZm9DcmVhdGUoZGV2KTsKKyAgICB6ZlNjYW5NZ3JJbml0KGRldik7CisgICAgemZQb3dlclNhdmluZ01nckluaXQoZGV2KTsKKworI2lmIDAKKyAgICAvKiBUZXN0IGNvZGUgKi8KKyAgICB7CisgICAgICAgIHUzMl90IGtleVs0XSA9IHsweGZmZmZmZmZmLCAweGZmLCAwLCAwfTsKKyAgICAgICAgdTE2X3QgYWRkclszXSA9IHsweDgwMDAsIDB4MDFhYiwgMHgwMDAwfTsKKyAgICAgICAgLy96ZlNldEtleShkZXYsIDAsIDAsIFpNX1dFUDY0LCBhZGRyLCBrZXkpOworICAgICAgICAvL3pmU2V0S2V5KGRldiwgMCwgMCwgWk1fQUVTLCBhZGRyLCBrZXkpOworICAgICAgICAvL3pmU2V0S2V5KGRldiwgNjQsIDAsIDEsIHdkLT5tYWNBZGRyLCBrZXkpOworICAgIH0KKyNlbmRpZgorCisgICAgLy8gV01FIHNldHRpbmdzCisgICAgd2QtPndzLnN0YVdtZUVuYWJsZWQgPSAxOyAgICAgICAgICAgLy8gRW5hYmxlIFdNRSBieSBkZWZhdWx0CisgICAgI2RlZmluZSBaTV9VQVBTRF9RX1NJWkUgMzIgLy8yXk4KKyAgICB3ZC0+YXAudWFwc2RRID0gemZRdWV1ZUNyZWF0ZShkZXYsIFpNX1VBUFNEX1FfU0laRSk7CisgICAgem1fYXNzZXJ0KHdkLT5hcC51YXBzZFEgIT0gTlVMTCk7CisgICAgd2QtPnN0YS51YXBzZFEgPSB6ZlF1ZXVlQ3JlYXRlKGRldiwgWk1fVUFQU0RfUV9TSVpFKTsKKyAgICB6bV9hc3NlcnQod2QtPnN0YS51YXBzZFEgIT0gTlVMTCk7CisKKyAgICAvL3pmSHBJbml0KGRldiwgd2QtPmZyZXF1ZW5jeSk7CisKKyAgICAvKiBNQUMgYWRkcmVzcyAqLworICAgIC8vemZIcFNldE1hY0FkZHJlc3MoZGV2LCB3ZC0+bWFjQWRkciwgMCk7CisgICAgemZIcEdldE1hY0FkZHJlc3MoZGV2KTsKKworICAgIHpmQ29yZVNldEZyZXF1ZW5jeShkZXYsIHdkLT5mcmVxdWVuY3kpOworCisjaWYgWk1fUENJX0xPT1BfQkFDSyA9PSAxCisgICAgemZ3V3JpdGVSZWcoZGV2LCBaTV9SRUdfUENJX0NPTlRST0wsIDYpOworI2VuZGlmIC8qICNpZiBaTV9QQ0lfTE9PUF9CQUNLID09IDEgKi8KKworICAgIC8vemZpV2xhblNldERvdDExRE1vZGUoZGV2ICwgMSk7IC8vIEVuYWJsZSA4MDIuMTFkCisgICAgLy96ZmlXbGFuU2V0RG90MTFIREZTTW9kZShkZXYgLCAxKTsgLy8gRW5hYmxlIDgwMi4xMWggREZTCisgICAgd2QtPnN0YS5ERlNFbmFibGUgPSAxOworICAgIHdkLT5zdGEuY2FwYWJpbGl0eVsxXSB8PSBaTV9CSVRfMDsKKworICAgIC8vemZpV2xhblNldEZyZXF1ZW5jeShkZXYsIDUyNjAwMDAsIFRSVUUpOworICAgIC8vemZpV2xhblNldEFuaU1vZGUoZGV2ICwgMSk7IC8vIEVuYWJsZSBBTkkKKworICAgIC8qIFRyZ2dlciBSeCBETUEgKi8KKyAgICB6ZkhwU3RhcnRSZWN2KGRldik7CisKKyAgICB6bV9kZWJ1Z19tc2cwKCJlbmQiKTsKKworICAgIHJldHVybiAwOworfQorCisvKiBXTEFOIGhhcmR3YXJlIHdpbGwgYmUgc2h1dGRvd24gYW5kIGFsbCByZXNvdXJjZSB3aWxsIGJlIHJlbGVhc2UgKi8KK3UxNl90IHpmaVdsYW5DbG9zZSh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9tc2cwX2luaXQoWk1fTFZfMCwgImVudGVyIik7CisKKyAgICB3ZC0+c3RhdGUgPSBaTV9XTEFOX1NUQVRFX0NMT1NFREVEOworCisgICAgLy96ZmlXbGFuRGlzYWJsZShkZXYsIDEpOworICAgIHpmV2xhblJlc2V0KGRldik7CisKKyAgICB6ZkhwU3RvcFJlY3YoZGV2KTsKKworICAgIC8qIERpc2FibGUgTUFDICovCisgICAgLyogRGlzYWJsZSBQSFkgKi8KKyAgICAvKiBEaXNhYmxlIFJGICovCisKKyAgICB6ZkhwUmVsZWFzZShkZXYpOworCisgICAgemZRdWV1ZURlc3Ryb3koZGV2LCB3ZC0+YXAudWFwc2RRKTsKKyAgICB6ZlF1ZXVlRGVzdHJveShkZXYsIHdkLT5zdGEudWFwc2RRKTsKKworICAgIHpmQnNzSW5mb0Rlc3Ryb3koZGV2KTsKKworI2lmZGVmIFpNX0VOQUJMRV9BR0dSRUdBVElPTgorICAgIC8qIGFkZCBieSBob25kYSAqLworICAgIHpmQWdnUnhGcmVlQnVmKGRldiwgMSk7ICAvLzEgZm9yIHJlbGVhc2Ugc3RydWN0dXJlIG1lbW9yeQorICAgIC8qIGVuZCBvZiBhZGQgYnkgaG9uZGEgKi8KKyNlbmRpZgorCisgICAgem1fbXNnMF9pbml0KFpNX0xWXzAsICJleGl0Iik7CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCB6ZkdldFdyYXBwZXJTZXR0aW5nKHpkZXZfdCogZGV2KQoreworICAgIHU4X3QgICBiUGFzc2l2ZTsKKyAgICB1MTZfdCB2YXBJZCA9IDA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworI2lmIDAKKyAgICBpZiAoICh3ZC0+d3MuY291bnRyeUlzb05hbWVbMF0gIT0gMCkKKyAgICAgICAgIHx8ICh3ZC0+d3MuY291bnRyeUlzb05hbWVbMV0gIT0gMCkKKyAgICAgICAgIHx8ICh3ZC0+d3MuY291bnRyeUlzb05hbWVbMl0gIT0gJ1wwJykgKQorICAgIHsKKyAgICAgICAgemZIcEdldFJlZ3VsYXRpb25UYWJsZWZyb21SZWdpb25Db2RlKAorICAgICAgICAgICAgZGV2LAorICAgICAgICAgICAgemZIcEdldFJlZ2lvbkNvZGVGcm9tSXNvTmFtZShkZXYsIHdkLT53cy5jb3VudHJ5SXNvTmFtZSkgKTsKKyAgICB9CisjZW5kaWYKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgd2QtPndsYW5Nb2RlID0gd2QtPndzLndsYW5Nb2RlOworCisgICAgLyogc2V0IGNoYW5uZWwgKi8KKyAgICBpZiAoIHdkLT53cy5mcmVxdWVuY3kgKQorICAgIHsKKyAgICAgICAgd2QtPmZyZXF1ZW5jeSA9IHdkLT53cy5mcmVxdWVuY3k7CisgICAgICAgIHdkLT53cy5mcmVxdWVuY3kgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3ZC0+ZnJlcXVlbmN5ID0gemZDaEdldEZpcnN0Q2hhbm5lbChkZXYsICZiUGFzc2l2ZSk7CisKKyAgICAgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdkLT53cy5hZGhvY01vZGUgPT0gWk1fQURIT0NCQU5EX0EpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPmZyZXF1ZW5jeSA9IFpNX0NIX0FfMzY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICB3ZC0+ZnJlcXVlbmN5ID0gWk1fQ0hfR182OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2lmZGVmIFpNX0FQX0RFQlVHCisgICAgLyogaG9uZGEgYWRkIGZvciBkZWJ1ZywgMjQzNyBjaGFubmVsIDYsIDI0NTIgY2hhbm5lbCA5ICovCisgICAgd2QtPmZyZXF1ZW5jeSA9IDI0Mzc7CisgICAgLyogZW5kIG9mIGFkZCBieSBob25kYSAqLworI2VuZGlmCisKKyAgICAvKiBzZXQgcHJlYW1ibGUgdHlwZSAqLworICAgIHN3aXRjaCAod2QtPndzLnByZWFtYmxlVHlwZSkKKyAgICB7CisgICAgY2FzZSBaTV9QUkVBTUJMRV9UWVBFX0FVVE86CisgICAgY2FzZSBaTV9QUkVBTUJMRV9UWVBFX1NIT1JUOgorICAgIGNhc2UgWk1fUFJFQU1CTEVfVFlQRV9MT05HOgorICAgICAgICB3ZC0+cHJlYW1ibGVUeXBlID0gd2QtPndzLnByZWFtYmxlVHlwZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgd2QtPnByZWFtYmxlVHlwZSA9IFpNX1BSRUFNQkxFX1RZUEVfU0hPUlQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB3ZC0+d3MucHJlYW1ibGVUeXBlID0gMDsKKworICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfQVAgKQorICAgIHsKKyAgICAgICAgdmFwSWQgPSB6ZndHZXRWYXBJZChkZXYpOworCisgICAgICAgIGlmICh2YXBJZCA9PSAweGZmZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5hcC5hdXRoQWxnb1swXSA9IHdkLT53cy5hdXRoTW9kZTsKKyAgICAgICAgICAgIHdkLT5hcC5lbmNyeU1vZGVbMF0gPSB3ZC0+d3MuZW5jcnlNb2RlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPmFwLmF1dGhBbGdvW3ZhcElkICsgMV0gPSB3ZC0+d3MuYXV0aE1vZGU7CisgICAgICAgICAgICB3ZC0+YXAuZW5jcnlNb2RlW3ZhcElkICsgMV0gPSB3ZC0+d3MuZW5jcnlNb2RlOworICAgICAgICB9CisgICAgICAgIHdkLT53cy5hdXRoTW9kZSA9IDA7CisgICAgICAgIHdkLT53cy5lbmNyeU1vZGUgPSBaTV9OT19XRVA7CisKKyAgICAgICAgLyogR2V0IGJlYWNvbkludGVydmFsIGZyb20gV3JhcHBlclNldHRpbmcgKi8KKyAgICAgICAgaWYgKCh3ZC0+d3MuYmVhY29uSW50ZXJ2YWwgPj0gMjApICYmICh3ZC0+d3MuYmVhY29uSW50ZXJ2YWwgPD0gMTAwMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5iZWFjb25JbnRlcnZhbCA9IHdkLT53cy5iZWFjb25JbnRlcnZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5iZWFjb25JbnRlcnZhbCA9IDEwMDsgLy8xMDBtcworICAgICAgICB9CisKKyAgICAgICAgaWYgKHdkLT53cy5kdGltID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPmR0aW0gPSB3ZC0+d3MuZHRpbTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5kdGltID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIHdkLT5hcC5xb3NNb2RlID0gd2QtPndzLmFwV21lRW5hYmxlZCAmIDB4MTsKKyAgICAgICAgd2QtPmFwLnVhcHNkRW5hYmxlZCA9ICh3ZC0+d3MuYXBXbWVFbmFibGVkICYgMHgyKSA+PiAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3ZC0+c3RhLmF1dGhNb2RlID0gd2QtPndzLmF1dGhNb2RlOworICAgICAgICB3ZC0+c3RhLmN1cnJlbnRBdXRoTW9kZSA9IHdkLT53cy5hdXRoTW9kZTsKKyAgICAgICAgd2QtPnN0YS53ZXBTdGF0dXMgPSB3ZC0+d3Mud2VwU3RhdHVzOworCisgICAgICAgIGlmICggd2QtPndzLmJlYWNvbkludGVydmFsICkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPmJlYWNvbkludGVydmFsID0gd2QtPndzLmJlYWNvbkludGVydmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPmJlYWNvbkludGVydmFsID0gMHg2NDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIDEuIFNldCBkZWZhdWx0IGNoYW5uZWwgNiAoMjQzN01IeikgKi8KKy8vICAgICAgICAgICAgd2QtPmZyZXF1ZW5jeSA9IDI0Mzc7CisKKyAgICAgICAgICAgIC8qIDIuIE90dXMgc3VwcG9ydCA4MDIuMTFnIE1vZGUgKi8KKyAgICAgICAgICAgIGlmICgod2QtPndzLmFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfRykgfHwKKyAgICAgICAgICAgICAgICAod2QtPndzLmFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfQkcpIHx8CisgICAgICAgICAgICAgICAgKHdkLT53cy5hZGhvY01vZGUgPT0gWk1fQURIT0NCQU5EX0FCRykgKSB7CisgICAgICAgICAgICAgICAgd2QtPndmYy5iSWJzc0dNb2RlID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgd2QtPndmYy5iSWJzc0dNb2RlID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogMy4gc2V0IHNob3J0IHByZWFtYmxlICAqLworICAgICAgICAgICAgLy93ZC0+c3RhLnByZWFtYmxlVHlwZSA9IFpNX1BSRUFNQkxFX1RZUEVfU0hPUlQgOworICAgICAgICB9CisKKyAgICAgICAgLyogc2V0IEFUSU0gd2luZG93ICovCisgICAgICAgIGlmICggd2QtPndzLmF0aW1XaW5kb3cgKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLmF0aW1XaW5kb3cgPSB3ZC0+d3MuYXRpbVdpbmRvdzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vd2QtPnN0YS5hdGltV2luZG93ID0gMHgwYTsKKyAgICAgICAgICAgIHdkLT5zdGEuYXRpbVdpbmRvdyA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvL3dkLT5zdGEuY29ubmVjdGluZ0hpZGRlbkFQID0gMTsvL3dkLT53cy5jb25uZWN0aW5nSGlkZGVuQVA7CisgICAgICAgIHdkLT5zdGEuZHJvcFVuZW5jcnlwdGVkUGt0cyA9IHdkLT53cy5kcm9wVW5lbmNyeXB0ZWRQa3RzOworICAgICAgICB3ZC0+c3RhLmlic3NKb2luT25seSA9IHdkLT53cy5pYnNzSm9pbk9ubHk7CisKKyAgICAgICAgaWYgKCB3ZC0+d3MuYkRlc2lyZWRCc3NpZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmTWVtb3J5Q29weSh3ZC0+c3RhLmRlc2lyZWRCc3NpZCwgd2QtPndzLmRlc2lyZWRCc3NpZCwgNik7CisgICAgICAgICAgICB3ZC0+c3RhLmJEZXNpcmVkQnNzaWQgPSBUUlVFOworICAgICAgICAgICAgd2QtPndzLmJEZXNpcmVkQnNzaWQgPSBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5zdGEuYkRlc2lyZWRCc3NpZCA9IEZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgLyogY2hlY2sgc3NpZCAqLworICAgICAgICBpZiAoIHdkLT53cy5zc2lkTGVuICE9IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoICghemZNZW1vcnlJc0VxdWFsKHdkLT53cy5zc2lkLCB3ZC0+c3RhLnNzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuc3NpZExlbikpfHwKKyAgICAgICAgICAgICAgICAgKHdkLT53cy5zc2lkTGVuICE9IHdkLT5zdGEuc3NpZExlbil8fAorICAgICAgICAgICAgICAgICAod2QtPnN0YS5hdXRoTW9kZSA9PSBaTV9BVVRIX01PREVfV1BBKXx8CisgICAgICAgICAgICAgICAgICh3ZC0+c3RhLmF1dGhNb2RlID09IFpNX0FVVEhfTU9ERV9XUEFQU0spIHx8CisgICAgICAgICAgICAgICAgICh3ZC0+d3Muc3RhV21lUW9zSW5mbyE9IDApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKmlmIHUtQVBTRCB0ZXN0KHNldCBRb3NJbmZvKSwgY2xlYXIgY29ubmVjdEJ5UmVhc3NvIHRvIGRvIGFzc29jaWF0aW9uIChub3QgcmVhc3NvY2lhdGlvbikqLworICAgICAgICAgICAgICAgIHdkLT5zdGEuY29ubmVjdEJ5UmVhc3NvID0gRkFMU0U7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5mYWlsQ250T2ZSZWFzc28gPSAwOworICAgICAgICAgICAgICAgIHdkLT5zdGEucG1raWRJbmZvLmJzc2lkQ291bnQgPSAwOworCisgICAgICAgICAgICAgICAgd2QtPnN0YS5zc2lkTGVuID0gd2QtPndzLnNzaWRMZW47CisgICAgICAgICAgICAgICAgemZNZW1vcnlDb3B5KHdkLT5zdGEuc3NpZCwgd2QtPndzLnNzaWQsIHdkLT5zdGEuc3NpZExlbik7CisKKyAgICAgICAgICAgICAgICBpZiAoIHdkLT5zdGEuc3NpZExlbiA8IDMyICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuc3NpZFt3ZC0+c3RhLnNzaWRMZW5dID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7ICAgLyogQU5ZIEJTUyAqLworICAgICAgICAgICAgd2QtPnN0YS5zc2lkWzBdID0gMDsKKyAgICAgICAgICAgIHdkLT5zdGEuc3NpZExlbiA9IDA7CisgICAgICAgIH0KKworICAgICAgICB3ZC0+c3RhLndtZUVuYWJsZWQgPSB3ZC0+d3Muc3RhV21lRW5hYmxlZDsKKyAgICAgICAgd2QtPnN0YS53bWVRb3NJbmZvID0gd2QtPndzLnN0YVdtZVFvc0luZm87CisKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCit1MTZfdCB6ZldsYW5FbmFibGUoemRldl90KiBkZXYpCit7CisgICAgdThfdCAgICAgYnNzaWRbNl0gPSB7MHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MH07CisgICAgdTE2X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX1VOS05PV04gKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiVW5rbm93biBNb2RlLi4uU2tpcC4uLiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgeworICAgICAgICB1MTZfdCB2YXBJZDsKKworICAgICAgICB2YXBJZCA9IHpmd0dldFZhcElkKGRldik7CisKKyAgICAgICAgaWYgKHZhcElkID09IDB4ZmZmZikKKyAgICAgICAgeworICAgICAgICAgICAgLyogQVAgbW9kZSAqLworICAgICAgICAgICAgemZBcEluaXRTdGFUYmwoZGV2KTsKKworICAgICAgICAgICAgLyogQVAgZGVmYXVsdCBwYXJhbWV0ZXJzICovCisgICAgICAgICAgICB3ZC0+YlJhdGUgPSAweGY7CisgICAgICAgICAgICB3ZC0+Z1JhdGUgPSAweGZmOworICAgICAgICAgICAgd2QtPmJSYXRlQmFzaWMgPSAweGY7CisgICAgICAgICAgICB3ZC0+Z1JhdGVCYXNpYyA9IDB4MDsKKyAgICAgICAgICAgIC8vd2QtPmJlYWNvbkludGVydmFsID0gMTAwOworICAgICAgICAgICAgd2QtPmFwLmFwQml0bWFwID0gMTsKKyAgICAgICAgICAgIHdkLT5hcC5iZWFjb25Db3VudGVyID0gMDsKKyAgICAgICAgICAgIC8vd2QtPmFwLnZhcE51bWJlciA9IDE7ICAgIC8vbWFyayBieSB5Z3dlaSBmb3IgVmFwCisKKyAgICAgICAgICAgIHdkLT5hcC5oaWRlU3NpZFswXSA9IDA7CisgICAgICAgICAgICB3ZC0+YXAuc3RhQWdpbmdUaW1lU2VjID0gMTAqNjA7CisgICAgICAgICAgICB3ZC0+YXAuc3RhUHJvYmluZ1RpbWVTZWMgPSA2MDsKKworICAgICAgICAgICAgZm9yIChpPTA7IGk8Wk1fTUFYX0FQX1NVUFBPUlQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuYmNtY0hlYWRbaV0gPSB3ZC0+YXAuYmNtY1RhaWxbaV0gPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL3dkLT5hcC51bmlIZWFkID0gd2QtPmFwLnVuaVRhaWwgPSAwOworCisgICAgICAgICAgICAvKiBsb2FkIEFQIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgICAgIHdkLT5iUmF0ZUJhc2ljID0gd2QtPndzLmJSYXRlQmFzaWM7CisgICAgICAgICAgICB3ZC0+Z1JhdGVCYXNpYyA9IHdkLT53cy5nUmF0ZUJhc2ljOworICAgICAgICAgICAgd2QtPmJnTW9kZSA9IHdkLT53cy5iZ01vZGU7CisgICAgICAgICAgICBpZiAoKHdkLT53cy5zc2lkTGVuIDw9IDMyKSAmJiAod2QtPndzLnNzaWRMZW4gIT0gMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPmFwLnNzaWRMZW5bMF0gPSB3ZC0+d3Muc3NpZExlbjsKKyAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPHdkLT53cy5zc2lkTGVuOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3NpZFswXVtpXSA9IHdkLT53cy5zc2lkW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3ZC0+d3Muc3NpZExlbiA9IDA7IC8vIFJlc2V0IFdyYXBwZXIgVmFyaWFibGUKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHdkLT5hcC5lbmNyeU1vZGVbMF0gPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuY2FwYWJbMF0gPSAweDAwMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuY2FwYWJbMF0gPSAweDAxMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIHNldCBTaG9ydCBTbG90IFRpbWUgYml0IGlmIG5vdCAxMWIgKi8KKyAgICAgICAgICAgIGlmICh3ZC0+YXAud2xhblR5cGVbMF0gIT0gWk1fV0xBTl9UWVBFX1BVUkVfQikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgd2QtPmFwLmNhcGFiWzBdIHw9IDB4NDAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB3ZC0+YXAudmFwTnVtYmVyID0gMTsgICAgLy8gbWFyayBieSB5Z3dlaSBmb3IgVmFwIFRlc3QKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyNpZiAwCisgICAgICAgICAgICAvKiBWQVAgVGVzdCBDb2RlICovCisgICAgICAgICAgICB3ZC0+YXAuYXBCaXRtYXAgPSAweDM7CisgICAgICAgICAgICB3ZC0+YXAuY2FwYWJbMV0gPSAweDQwMTsKKyAgICAgICAgICAgIHdkLT5hcC5zc2lkTGVuWzFdID0gNDsKKyAgICAgICAgICAgIHdkLT5hcC5zc2lkWzFdWzBdID0gJ3YnOworICAgICAgICAgICAgd2QtPmFwLnNzaWRbMV1bMV0gPSAnYSc7CisgICAgICAgICAgICB3ZC0+YXAuc3NpZFsxXVsyXSA9ICdwJzsKKyAgICAgICAgICAgIHdkLT5hcC5zc2lkWzFdWzNdID0gJzEnOworICAgICAgICAgICAgd2QtPmFwLmF1dGhBbGdvWzFdID0gd2QtPndzLmF1dGhNb2RlOworICAgICAgICAgICAgd2QtPmFwLmVuY3J5TW9kZVsxXSA9IHdkLT53cy5lbmNyeU1vZGU7CisgICAgICAgICAgICB3ZC0+YXAudmFwTnVtYmVyID0gMjsKKyNlbHNlCisgICAgICAgICAgICAvKiBWQVAgVGVzdCBDb2RlICovCisgICAgICAgICAgICB3ZC0+YXAuYXBCaXRtYXAgPSAweDEgfCAoMHgwMSA8PCAodmFwSWQrMSkpOworCisgICAgICAgICAgICBpZiAoKHdkLT53cy5zc2lkTGVuIDw9IDMyKSAmJiAod2QtPndzLnNzaWRMZW4gIT0gMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPmFwLnNzaWRMZW5bdmFwSWQrMV0gPSB3ZC0+d3Muc3NpZExlbjsKKyAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPHdkLT53cy5zc2lkTGVuOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3NpZFt2YXBJZCsxXVtpXSA9IHdkLT53cy5zc2lkW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3ZC0+d3Muc3NpZExlbiA9IDA7IC8vIFJlc2V0IFdyYXBwZXIgVmFyaWFibGUKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHdkLT5hcC5lbmNyeU1vZGVbdmFwSWQrMV0gPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuY2FwYWJbdmFwSWQrMV0gPSAweDQwMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuY2FwYWJbdmFwSWQrMV0gPSAweDQxMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2QtPmFwLmF1dGhBbGdvW3ZhcElkKzFdID0gd2QtPndzLmF1dGhNb2RlOworICAgICAgICAgICAgd2QtPmFwLmVuY3J5TW9kZVt2YXBJZCsxXSA9IHdkLT53cy5lbmNyeU1vZGU7CisKKyAgICAgICAgICAgIC8qIE5lZWQgdG8gYmUgbW9kaWZpZWQgd2hlbiBWQVAgaXMgdXNlZCAqLworICAgICAgICAgICAgLy93ZC0+YXAudmFwTnVtYmVyID0gMjsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgd2QtPmFwLnZhcE51bWJlcisrOworCisgICAgICAgIHpmQ29yZVNldEZyZXF1ZW5jeShkZXYsIHdkLT5mcmVxdWVuY3kpOworCisgICAgICAgIHpmSW5pdE1hY0FwTW9kZShkZXYpOworCisgICAgICAgIC8qIERpc2FibGUgcHJvdGVjdGlvbiBtb2RlICovCisgICAgICAgIHpmQXBTZXRQcm90ZWN0aW9uTW9kZShkZXYsIDApOworCisgICAgICAgIHpmQXBTZW5kQmVhY29uKGRldik7CisgICAgfSAvKmlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkgKi8KKyAgICBlbHNlCisgICAgeworICAgICAgICB6ZlNjYW5NZ3JTY2FuU3RvcChkZXYsIFpNX1NDQU5fTUdSX1NDQU5fSU5URVJOQUwpOworICAgICAgICB6ZlNjYW5NZ3JTY2FuU3RvcChkZXYsIFpNX1NDQU5fTUdSX1NDQU5fRVhURVJOQUwpOworCisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHdkLT5zdGEub3Bwb3NpdGVDb3VudCA9IDA7ICAgIC8qIHJlc2V0IG9wcG9zaXRlIGNvdW50ICovCisgICAgICAgIC8vd2QtPnN0YS5iQXV0b1JlY29ubmVjdCA9IHdkLT5zdGEuYkF1dG9SZWNvbm5lY3RFbmFibGVkOworICAgICAgICAvL3dkLT5zdGEuc2NhbldpdGhTU0lEID0gMDsKKyAgICAgICAgemZTdGFJbml0T3Bwb3NpdGVJbmZvKGRldik7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgemZTdGFSZXNldFN0YXR1cyhkZXYsIDApOworCisgICAgICAgIGlmICggKHdkLT5zdGEuY21EaXNhbGxvd1NzaWRMZW5ndGggIT0gMCkmJgorICAgICAgICAgICAgICh3ZC0+c3RhLnNzaWRMZW4gPT0gd2QtPnN0YS5jbURpc2FsbG93U3NpZExlbmd0aCkmJgorICAgICAgICAgICAgICh6Zk1lbW9yeUlzRXF1YWwod2QtPnN0YS5zc2lkLCB3ZC0+c3RhLmNtRGlzYWxsb3dTc2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5zc2lkTGVuKSkgJiYKKyAgICAgICAgICAgICAod2QtPnN0YS53ZXBTdGF0dXMgPT0gWk1fRU5DUllQVElPTl9US0lQKSkKKyAgICAgICAgeyAgIC8qIGNvdW50ZXJtZWFzdXJlcyAqLworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiY291bnRlcm1lYXN1cmVzIGRpc2FsbG93IGFzc29jaWF0aW9uIik7CisKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCggd2QtPndsYW5Nb2RlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFpNX01PREVfSUJTUzoKKyAgICAgICAgICAgICAgICAgICAgLyogc29tZSByZWdpc3RlcnMgbWF5IGJlIHNldCBoZXJlICovCisgICAgICAgICAgICAgICAgICAgIGlmICggd2QtPnN0YS5hdXRoTW9kZSA9PSBaTV9BVVRIX01PREVfV1BBMlBTSyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHpmSHBTZXRBcFN0YU1vZGUoZGV2LCBaTV9IQUxfODAyMTFfTU9ERV9JQlNTX1dQQTJQU0spOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgemZIcFNldEFwU3RhTW9kZShkZXYsIFpNX0hBTF84MDIxMV9NT0RFX0lCU1NfR0VORVJBTCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJaTV9NT0RFX0lCU1MiKTsKKyAgICAgICAgICAgICAgICAgICAgemZJYnNzQ29ubmVjdE5ldHdvcmsoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFpNX01PREVfSU5GUkFTVFJVQ1RVUkU6CisgICAgICAgICAgICAgICAgICAgIC8qIHNvbWUgcmVnaXN0ZXJzIG1heSBiZSBzZXQgaGVyZSAqLworICAgICAgICAgICAgICAgICAgICB6ZkhwU2V0QXBTdGFNb2RlKGRldiwgWk1fSEFMXzgwMjExX01PREVfU1RBKTsKKworICAgICAgICAgICAgICAgICAgICB6ZkluZnJhQ29ubmVjdE5ldHdvcmsoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFpNX01PREVfUFNFVURPOgorICAgICAgICAgICAgICAgICAgICAvKiBzb21lIHJlZ2lzdGVycyBtYXkgYmUgc2V0IGhlcmUgKi8KKyAgICAgICAgICAgICAgICAgICAgemZIcFNldEFwU3RhTW9kZShkZXYsIFpNX0hBTF84MDIxMV9NT0RFX1NUQSk7CisKKyAgICAgICAgICAgICAgICAgICAgemZVcGRhdGVCc3NpZChkZXYsIGJzc2lkKTsKKyAgICAgICAgICAgICAgICAgICAgemZDb3JlU2V0RnJlcXVlbmN5KGRldiwgd2QtPmZyZXF1ZW5jeSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLy9pZiAoICh3ZC0+d2xhbk1vZGUgIT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkmJgorICAgIC8vICAgICAod2QtPndsYW5Nb2RlICE9IFpNX01PREVfQVApICkKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX1BTRVVETyApCisgICAgeworICAgICAgICAvKiBSZXNldCBXbGFuIHN0YXR1cyAqLworICAgICAgICB6ZldsYW5SZXNldChkZXYpOworCisgICAgICAgIGlmICh3ZC0+emZjYkNvbm5lY3ROb3RpZnkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnpmY2JDb25uZWN0Tm90aWZ5KGRldiwgWk1fU1RBVFVTX01FRElBX0NPTk5FQ1QsIHdkLT5zdGEuYnNzaWQpOworICAgICAgICB9CisgICAgICAgIHpmQ2hhbmdlQWRhcHRlclN0YXRlKGRldiwgWk1fU1RBX1NUQVRFX0NPTk5FQ1RFRCk7CisgICAgfQorCisKKyAgICBpZih3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+emZjYkNvbm5lY3ROb3RpZnkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnpmY2JDb25uZWN0Tm90aWZ5KGRldiwgWk1fU1RBVFVTX01FRElBX0NPTk5FQ1QsIHdkLT5zdGEuYnNzaWQpOworICAgICAgICB9CisgICAgICAgIC8vemZDaGFuZ2VBZGFwdGVyU3RhdGUoZGV2LCBaTV9TVEFfU1RBVEVfQ09OTkVDVEVEKTsKKyAgICB9CisKKyAgICAvLyBBc3NpZ24gZGVmYXVsdCBUeCBSYXRlCisgICAgaWYgKCB3ZC0+c3RhLkVuYWJsZUhUICkKKyAgICB7CisJCXUzMl90IG9uZVR4U3RyZWFtQ2FwOworCQlvbmVUeFN0cmVhbUNhcCA9ICh6ZkhwQ2FwYWJpbGl0eShkZXYpICYgWk1fSFBfQ0FQXzExTl9PTkVfVFhfU1RSRUFNKTsKKwkJaWYob25lVHhTdHJlYW1DYXApCisJCQl3ZC0+Q3VycmVudFR4UmF0ZUticHMgPSAxMzUwMDA7CisJCWVsc2UKKwkJCXdkLT5DdXJyZW50VHhSYXRlS2JwcyA9IDI3MDAwMDsKKyAgICAgICAgd2QtPkN1cnJlbnRSeFJhdGVLYnBzID0gMjcwMDAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3ZC0+Q3VycmVudFR4UmF0ZUticHMgPSA1NDAwMDsKKyAgICAgICAgd2QtPkN1cnJlbnRSeFJhdGVLYnBzID0gNTQwMDA7CisgICAgfQorCisgICAgd2QtPnN0YXRlID0gWk1fV0xBTl9TVEFURV9FTkFCTEVEOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIEVuYWJsZS9kaXNhYmxlIFdsYW4gb3BlcmF0aW9uICovCit1MTZfdCB6ZmlXbGFuRW5hYmxlKHpkZXZfdCogZGV2KQoreworICAgIHUxNl90IHJldDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptX21zZzBfbW0oWk1fTFZfMSwgIkVuYWJsZSBXbGFuIik7CisKKyAgICB6ZkdldFdyYXBwZXJTZXR0aW5nKGRldik7CisKKyAgICB6Zlplcm9NZW1vcnkoKHU4X3QqKSAmd2QtPnRyYWZUYWxseSwgc2l6ZW9mKHN0cnVjdCB6c1RyYWZUYWxseSkpOworCisgICAgLy8gUmVzZXQgY21NaWNGYWlsdXJlQ291bnQgdG8gMCBmb3IgbmV3IGFzc29jaWF0aW9uIHJlcXVlc3QKKyAgICBpZiAoIHdkLT5zdGEuY21NaWNGYWlsdXJlQ291bnQgPT0gMSApCisgICAgeworICAgICAgICB6ZlRpbWVyQ2FuY2VsKGRldiwgWk1fRVZFTlRfQ01fVElNRVIpOworICAgICAgICB3ZC0+c3RhLmNtTWljRmFpbHVyZUNvdW50ID0gMDsKKyAgICB9CisKKyAgICB6ZkZsdXNoVnR4cShkZXYpOworICAgIGlmICgod2QtPnF1ZXVlRmx1c2hlZCAmIDB4MTApICE9IDApCisgICAgeworICAgICAgICB6ZkhwVXNiUmVzZXQoZGV2KTsKKyAgICB9CisgICAgcmV0ID0gemZXbGFuRW5hYmxlKGRldik7CisKKyAgICByZXR1cm4gcmV0OworfQorLyogQWRkIGEgZmxhZyBuYW1lZCBSZXNldEtleUNhY2hlIHRvIHNob3cgaWYgS2V5Q2FjaGUgc2hvdWxkIGJlIGNsZWFyZWQuCisgICBmb3IgaG9zdGFwZCBpbiBBUCBtb2RlLCBpZiBkcml2ZXIgcmVjZWl2ZXMgaXdjb25maWcgaW9jdGwKKyAgIGFmdGVyIHNldHRpbmcgZ3JvdXAga2V5LCBpdCBzaG91bGRuJ3QgY2xlYXIgS2V5Q2FjaGUuICAgICAgICAgICAgICAgICAqLwordTE2X3QgemZpV2xhbkRpc2FibGUoemRldl90KiBkZXYsIHU4X3QgUmVzZXRLZXlDYWNoZSkKK3sKKyAgICB1MTZfdCAgaTsKKyAgICB1OF90IGlzQ29ubmVjdGVkOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisjaWZkZWYgWk1fRU5BQkxFX0lCU1NfV1BBMlBTSworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisjZW5kaWYKKyAgICB3ZC0+c3RhdGUgPSBaTV9XTEFOX1NUQVRFX0RJU0FCTEVEOworCisgICAgem1fbXNnMF9tbShaTV9MVl8xLCAiRGlzYWJsZSBXbGFuIik7CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0FQICkKKyAgICB7CisgICAgICAgIGlzQ29ubmVjdGVkID0gemZTdGFJc0Nvbm5lY3RlZChkZXYpOworCisgICAgICAgIGlmICggKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFKSYmCisgICAgICAgICAgICAgKHdkLT5zdGEuY3VycmVudEF1dGhNb2RlICE9IFpNX0FVVEhfTU9ERV9XUEEyKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHNlbmQgZGVhdXRoZW50aWNhdGlvbiBmcmFtZSAqLworICAgICAgICAgICAgaWYgKGlzQ29ubmVjdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vemZpV2xhbkRlYXV0aChkZXYsIE5VTEwsIDApOworICAgICAgICAgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfREVBVVRILCB3ZC0+c3RhLmJzc2lkLCAzLCAwLCAwKTsKKyAgICAgICAgICAgICAgICAvL3ptd19kZWJ1Z19tc2cwKCJzZW5kIGEgRGVhdXRoIGZyYW1lISIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVtb3ZlIGFsbCB0aGUgY29ubmVjdGVkIHBlZXIgc3RhdGlvbnMKKyAgICAgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTICkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnN0YS5pYnNzQnNzSXNDcmVhdG9yID0gMDsKKyAgICAgICAgICAgIHpmVGltZXJDYW5jZWwoZGV2LCBaTV9FVkVOVF9JQlNTX01PTklUT1IpOworICAgICAgICAgICAgemZTdGFJYnNzTW9uaXRvcmluZyhkZXYsIDEpOworICAgICAgICB9CisKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHdkLT5zdGEuaWJzc1dwYTJQc2sgPSAwOworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworI2VuZGlmCisKKyAgICAgICAgd2QtPnN0YS53cGFTdGF0ZSA9IFpNX1NUQV9XUEFfU1RBVEVfSU5JVDsKKworICAgICAgICAvKiByZXNldCBjb25uZWN0IHRpbWVvdXQgY291bnRlciAqLworICAgICAgICB3ZC0+c3RhLmNvbm5lY3RUaW1lb3V0Q291bnQgPSAwOworCisgICAgICAgIC8qIHJlc2V0IGNvbm5lY3RTdGF0ZSB0byBOb25lICovCisgICAgICAgIHdkLT5zdGEuY29ubmVjdFN0YXRlID0gWk1fU1RBX0NPTk5fU1RBVEVfTk9ORTsKKworICAgICAgICAvKiByZXNldCBsZWFwIGVuYWJsZSB2YXJpYWJsZSAqLworICAgICAgICB3ZC0+c3RhLmxlYXBFbmFibGVkID0gMDsKKworICAgICAgICAvKiBEaXNhYmxlIHRoZSBSSUZTIFN0YXR1cyAvIFJJRlMtbGlrZSBmcmFtZSBjb3VudCAvIFJJRlMgY291bnQgKi8KKyAgICAgICAgaWYoIHdkLT5zdGEucmlmc1N0YXRlID09IFpNX1JJRlNfU1RBVEVfREVURUNURUQgKQorICAgICAgICAgICAgemZIcERpc2FibGVSaWZzKGRldik7CisgICAgICAgIHdkLT5zdGEucmlmc1N0YXRlID0gWk1fUklGU19TVEFURV9ERVRFQ1RJTkc7CisgICAgICAgIHdkLT5zdGEucmlmc0xpa2VGcmFtZUNudCA9IDA7CisgICAgICAgIHdkLT5zdGEucmlmc0NvdW50ID0gMDsKKworICAgICAgICB3ZC0+c3RhLm9zUnhGaWx0ZXIgPSAwOworICAgICAgICB3ZC0+c3RhLmJTYWZlTW9kZSA9IDA7CisKKyAgICAgICAgemZDaGFuZ2VBZGFwdGVyU3RhdGUoZGV2LCBaTV9TVEFfU1RBVEVfRElTQ09OTkVDVCk7CisgICAgICAgIGlmIChSZXNldEtleUNhY2hlKQorICAgICAgICAgICAgemZIcFJlc2V0S2V5Q2FjaGUoZGV2KTsKKworICAgICAgICBpZiAoaXNDb25uZWN0ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3ZC0+emZjYkNvbm5lY3ROb3RpZnkgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+emZjYkNvbm5lY3ROb3RpZnkoZGV2LCBaTV9TVEFUVVNfTUVESUFfQ09OTkVDVElPTl9ESVNBQkxFRCwgd2QtPnN0YS5ic3NpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAod2QtPnpmY2JDb25uZWN0Tm90aWZ5ICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnpmY2JDb25uZWN0Tm90aWZ5KGRldiwgWk1fU1RBVFVTX01FRElBX0RJU0FCTEVELCB3ZC0+c3RhLmJzc2lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8vaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgIHsKKyAgICAgICAgZm9yIChpPTA7IGk8Wk1fTUFYX1NUQV9TVVBQT1JUOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHNlbmQgZGVhdXRoZW50aWNhdGlvbiBmcmFtZSAqLworICAgICAgICAgICAgaWYgKHdkLT5hcC5zdGFUYWJsZVtpXS52YWxpZCA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFJlYXNvbiA6IFNlbmRpbmcgc3RhdGlvbiBpcyBsZWF2aW5nICovCisgICAgICAgICAgICAgICAgemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9ERUFVVEgsCisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaV0uYWRkciwgMywgMCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoUmVzZXRLZXlDYWNoZSkKKyAgICAgICAgICAgIHpmSHBSZXNldEtleUNhY2hlKGRldik7CisKKyAgICAgICAgd2QtPmFwLnZhcE51bWJlci0tOworICAgIH0KKworICAgIC8qIHN0b3AgYmVhY29uICovCisgICAgemZIcERpc2FibGVCZWFjb24oZGV2KTsKKworICAgIC8qIEZsdXNoIFZUeFEgYW5kIE1tUSAqLworICAgIHpmRmx1c2hWdHhxKGRldik7CisgICAgLyogRmx1c2ggQVAgUFMgcXVldWVzICovCisgICAgemZBcEZsdXNoQnVmZmVyZWRQc0ZyYW1lKGRldik7CisgICAgLyogRnJlZSBidWZmZXIgaW4gZGVmcmFnbWVudCBsaXN0Ki8KKyAgICB6ZkFnaW5nRGVmcmFnTGlzdChkZXYsIDEpOworCisgICAgI2lmZGVmIFpNX0VOQUJMRV9BR0dSRUdBVElPTgorICAgIC8qIGFkZCBieSBob25kYSAqLworICAgIHpmQWdnUnhGcmVlQnVmKGRldiwgMCk7ICAvLzEgZm9yIHJlbGVhc2Ugc3RydWN0dXJlIG1lbW9yeQorICAgIC8qIGVuZCBvZiBhZGQgYnkgaG9uZGEgKi8KKyAgICAjZW5kaWYKKworICAgIC8vIENsZWFyIHRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHBlZXIgc3RhdGlvbnMgb2YgSUJTUyBvciBBUCBvZiBTdGF0aW9uIG1vZGUKKyAgICB6Zlplcm9NZW1vcnkoKHU4X3QqKXdkLT5zdGEub3Bwb3NpdGVJbmZvLCBzaXplb2Yoc3RydWN0IHpzT3Bwb3NpdGVJbmZvKSAqIFpNX01BWF9PUFBPU0lURV9DT1VOVCk7CisKKyAgICAvKiBUdXJuIG9mZiBTb2Z0d2FyZSBXRVAvVEtJUCAqLworICAgIGlmICh3ZC0+c3RhLlNXRW5jcnlwdEVuYWJsZSAhPSAwKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiRGlzYWJsZSBzb2Z0d2FyZSBlbmNyeXB0aW9uIik7CisgICAgICAgIHpmU3RhRGlzYWJsZVNXRW5jcnlwdGlvbihkZXYpOworICAgIH0KKworICAgIC8qIEltcHJvdmUgV0VQL1RLSVAgcGVyZm9ybWFjZSB3aXRoIEhUIEFQLCBkZXRhaWwgaW5mb3JtYXRpb24gcGxlYXNlIGxvb2sgYnVnIzMyNDk1ICovCisgICAgLy96ZkhwU2V0VFRTSUZTVGltZShkZXYsIDB4OCk7CisKKyAgICByZXR1cm4gMDsKK30KKwordTE2X3QgemZpV2xhblN1c3BlbmQoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICAvLyBDaGFuZ2UgdGhlIEhBTCBzdGF0ZSB0byBpbml0IHNvIHRoYXQgYW55IHBhY2tldCBjYW4ndCBiZSB0cmFuc21pdHRlZCBiZXR3ZWVuCisgICAgLy8gcmVzdW1lICYgSEFMIHJlaW5pdC4gVGhpcyB3b3VsZCBjYXVzZSB0aGUgY2hpcCBoYW5nIGlzc3VlIGluIE9UVVMuCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB3ZC0+aGFsU3RhdGUgPSBaTV9IQUxfU1RBVEVfSU5JVDsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3UxNl90IHpmaVdsYW5SZXN1bWUoemRldl90KiBkZXYsIHU4X3QgZG9SZWNvbm4pCit7CisgICAgdTE2X3QgcmV0OworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgLyogUmVkb3dubG9hZCBmaXJtd2FyZSwgUmVpbml0IE1BQyxQSFksUkYgKi8KKyAgICB6ZkhwUmVpbml0KGRldiwgd2QtPmZyZXF1ZW5jeSk7CisKKyAgICAvL1NldCBjaGFubmVsIGFjY29yZGluZyB0byBBUCdzIGNvbmZpZ3VyYXRpb24KKyAgICB6ZkNvcmVTZXRGcmVxdWVuY3lFeFYyKGRldiwgd2QtPmZyZXF1ZW5jeSwgd2QtPkJhbmRXaWR0aDQwLAorICAgICAgICAgICAgd2QtPkV4dE9mZnNldCwgTlVMTCwgMSk7CisKKyAgICB6ZkhwU2V0TWFjQWRkcmVzcyhkZXYsIHdkLT5tYWNBZGRyLCAwKTsKKworICAgIC8qIFN0YXJ0IFJ4ICovCisgICAgemZIcFN0YXJ0UmVjdihkZXYpOworCisgICAgemZGbHVzaFZ0eHEoZGV2KTsKKworICAgIGlmICggd2QtPndsYW5Nb2RlICE9IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgJiYKKyAgICAgICAgIHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0lCU1MgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgem1fbXNnMF9tbShaTV9MVl8xLCAiUmVzdW1lIFdsYW4iKTsKKyAgICBpZiAoICh6ZlN0YUlzQ29ubmVjdGVkKGRldikpIHx8ICh6ZlN0YUlzQ29ubmVjdGluZyhkZXYpKSApCisgICAgeworICAgICAgICBpZiAoZG9SZWNvbm4gPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgem1fbXNnMF9tbShaTV9MVl8xLCAiUmUtY29ubmVjdC4uLiIpOworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHdkLT5zdGEuY29ubmVjdEJ5UmVhc3NvID0gRkFMU0U7CisgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgICAgICB6ZldsYW5FbmFibGUoZGV2KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChkb1JlY29ubiA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkhwU2V0Um9sbENhbGxUYWJsZShkZXYpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0ID0gMDsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgIHpmaVdsYW5GbHVzaEFsbFF1ZXVlZEJ1ZmZlcnMgKi8KKy8qICAgICAgRmx1c2ggVmlydHVhbCBUeFEsIE1tUSwgUFMgZnJhbWVzIGFuZCBkZWZyYWdtZW50IGxpc3QgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuMSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZpV2xhbkZsdXNoQWxsUXVldWVkQnVmZmVycyh6ZGV2X3QqIGRldikKK3sKKyAgICAvKiBGbHVzaCBWVHhRIGFuZCBNbVEgKi8KKyAgICB6ZkZsdXNoVnR4cShkZXYpOworICAgIC8qIEZsdXNoIEFQIFBTIHF1ZXVlcyAqLworICAgIHpmQXBGbHVzaEJ1ZmZlcmVkUHNGcmFtZShkZXYpOworICAgIC8qIEZyZWUgYnVmZmVyIGluIGRlZnJhZ21lbnQgbGlzdCovCisgICAgemZBZ2luZ0RlZnJhZ0xpc3QoZGV2LCAxKTsKK30KKworLyogRG8gV0xBTiBzaXRlIHN1cnZleSAqLwordTE2X3QgemZpV2xhblNjYW4oemRldl90KiBkZXYpCit7CisgICAgdTE2X3QgcmV0ID0gMTsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9kZWJ1Z19tc2cwKCIiKTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgIHsKKyAgICAgICAgd2QtPmhlYXJ0QmVhdE5vdGlmaWNhdGlvbiB8PSBaTV9CU1NJRF9MSVNUX1NDQU47CisgICAgICAgIHdkLT5zdGEuc2NhbkZyZXF1ZW5jeSA9IDA7CisgICAgICAgIC8vd2QtPnN0YS5wVXBkYXRlQnNzTGlzdC0+YnNzQ291bnQgPSAwOworICAgICAgICByZXQgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAjaWYgMAorICAgICAgICBpZiAoICF6ZlN0YUJsb2NrV2xhblNjYW4oZGV2KSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoInNjYW4gcmVxdWVzdCIpOworICAgICAgICAgICAgLy96ZlRpbWVyU2NoZWR1bGUoZGV2LCBaTV9FVkVOVF9TQ0FOLCBaTV9USUNLX1pFUk8pOworICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgICAgIGdvdG8gc3RhcnRfc2NhbjsKKyAgICAgICAgfQorICAgICAgICAjZWxzZQorICAgICAgICAgICAgZ290byBzdGFydF9zY2FuOworICAgICAgICAjZW5kaWYKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuIHJldDsKKworc3RhcnRfc2NhbjoKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYod2QtPmxlZFN0cnVjdC5MRURDdHJsRmxhZ0Zyb21SZWcgJiBaTV9MRURfQ1RSTF9GTEFHX0FMUEhBKSAgIC8vIGZsYWcgZm9yIEFscGhhCisgICAgICAgIHdkLT5sZWRTdHJ1Y3QuTEVEQ3RybEZsYWcgfD0gWk1fTEVEX0NUUkxfRkxBR19BTFBIQTsKKworICAgIHJldCA9IHpmU2Nhbk1nclNjYW5TdGFydChkZXYsIFpNX1NDQU5fTUdSX1NDQU5fRVhURVJOQUwpOworCisgICAgem1fZGVidWdfbXNnMSgicmV0ID0gIiwgcmV0KTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKworLyogcmF0ZSAgICAgICAgICovCisvKiAgICAwIDogQVVUTyAgKi8KKy8qICAgIDEgOiBDQ0sgMU0gKi8KKy8qICAgIDIgOiBDQ0sgMk0gKi8KKy8qICAgIDMgOiBDQ0sgNS41TSAqLworLyogICAgNCA6IENDSyAxMU0gKi8KKy8qICAgIDUgOiBPRkRNIDZNICovCisvKiAgICA2IDogT0ZETSA5TSAqLworLyogICAgNyA6IE9GRE0gMTJNICovCisvKiAgICA4IDogT0ZETSAxOE0gKi8KKy8qICAgIDkgOiBPRkRNIDI0TSAqLworLyogICAgMTAgOiBPRkRNIDM2TSAqLworLyogICAgMTEgOiBPRkRNIDQ4TSAqLworLyogICAgMTIgOiBPRkRNIDU0TSAqLworLyogICAgMTMgOiBNQ1MgMCAqLworLyogICAgMjggOiBNQ1MgMTUgKi8KK3UxNl90IHpjUmF0ZVRvTUNTW10gPQorICAgIHsweGZmLCAwLCAxLCAyLCAzLCAweGIsIDB4ZiwgMHhhLCAweGUsIDB4OSwgMHhkLCAweDgsIDB4Y307Cit1MTZfdCB6Y1JhdGVUb01UW10gPSB7MCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMX07CisKK3UxNl90IHpmaVdsYW5TZXRUeFJhdGUoemRldl90KiBkZXYsIHUxNl90IHJhdGUpCit7ICAgLy8gamhsZWUgSFQgMAorICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmIChyYXRlIDw9MTIpCisgICAgeworICAgICAgICB3ZC0+dHhNQ1MgPSB6Y1JhdGVUb01DU1tyYXRlXTsKKyAgICAgICAgd2QtPnR4TVQgPSB6Y1JhdGVUb01UW3JhdGVdOworICAgICAgICByZXR1cm4gWk1fU1VDQ0VTUzsKKyAgICB9CisgICAgZWxzZSBpZiAoKHJhdGU8PTI4KXx8KHJhdGU9PTEzKzMyKSkKKyAgICB7CisgICAgICAgIHdkLT50eE1DUyA9IHJhdGUgLSAxMiAtIDE7CisgICAgICAgIHdkLT50eE1UID0gMjsKKyAgICAgICAgcmV0dXJuIFpNX1NVQ0NFU1M7CisgICAgfQorCisgICAgcmV0dXJuIFpNX0VSUl9JTlZBTElEX1RYX1JBVEU7Cit9CisKK2NvbnN0IHUzMl90IHpjUmF0ZUlkVG9LYnBzNDBNW10gPQorICAgIHsKKyAgICAgICAgMTAwMCwgMjAwMCwgNTUwMCwgMTEwMDAsICAgICAgICAgICAgICAgICAgLyogMU0sIDJNLCA1TSwgMTFNICAgICAgICAgICwgIDAgIDEgIDIgIDMqLworICAgICAgICA2MDAwLCA5MDAwLCAxMjAwMCwgMTgwMDAsICAgICAgICAgICAgICAgICAvKiA2TSAgOU0gIDEyTSAgMThNICAgICAgICAgLCAgNCAgNSAgNiAgNyovCisgICAgICAgIDI0MDAwLCAzNjAwMCwgNDgwMDAsIDU0MDAwLCAgICAgICAgICAgICAgIC8qIDI0TSAgMzZNICA0OE0gIDU0TSAgICAgICAsICA4ICA5IDEwIDExKi8KKyAgICAgICAgMTM1MDAsIDI3MDAwLCA0MDUwMCwgNTQwMDAsICAgICAgICAgICAgICAgLyogTUNTMCBNQ1MxIE1DUzIgTUNTMyAgICAgICwgMTIgMTMgMTQgMTUqLworICAgICAgICA4MTAwMCwgMTA4MDAwLCAxMjE1MDAsIDEzNTAwMCwgICAgICAgICAgICAvKiBNQ1M0IE1DUzUgTUNTNiBNQ1M3ICAgICAgLCAxNiAxNyAxOCAxOSovCisgICAgICAgIDI3MDAwLCA1NDAwMCwgODEwMDAsIDEwODAwMCwgICAgICAgICAgICAgIC8qIE1DUzggTUNTOSBNQ1MxMCBNQ1MxMSAgICAsIDIwIDIxIDIyIDIzKi8KKyAgICAgICAgMTYyMDAwLCAyMTYwMDAsIDI0MzAwMCwgMjcwMDAwLCAgICAgICAgICAgLyogTUNTMTIgTUNTMTMgTUNTMTQgTUNTMTUgICwgMjQgMjUgMjYgMjcqLworICAgICAgICAyNzAwMDAsIDMwMDAwMCwgMTUwMDAwICAgICAgICAgICAgICAgICAgICAvKiBNQ1MxNFNHLCBNQ1MxNVNHLCBNQ1M3U0cgLCAyOCAyOSAzMCovCisgICAgfTsKKworY29uc3QgdTMyX3QgemNSYXRlSWRUb0ticHMyME1bXSA9CisgICAgeworICAgICAgICAxMDAwLCAyMDAwLCA1NTAwLCAxMTAwMCwgICAgICAgICAgICAgICAgICAvKiAxTSwgMk0sIDVNLCAxMU0gICAgICAgICAgLCAgMCAgMSAgMiAgMyovCisgICAgICAgIDYwMDAsIDkwMDAsIDEyMDAwLCAxODAwMCwgICAgICAgICAgICAgICAgIC8qIDZNICA5TSAgMTJNICAxOE0gICAgICAgICAsICA0ICA1ICA2ICA3Ki8KKyAgICAgICAgMjQwMDAsIDM2MDAwLCA0ODAwMCwgNTQwMDAsICAgICAgICAgICAgICAgLyogMjRNICAzNk0gIDQ4TSAgNTRNICAgICAgICwgIDggIDkgMTAgMTEqLworICAgICAgICA2NTAwLCAxMzAwMCwgMTk1MDAsIDI2MDAwLCAgICAgICAgICAgICAgICAvKiBNQ1MwIE1DUzEgTUNTMiBNQ1MzICAgICAgLCAxMiAxMyAxNCAxNSovCisgICAgICAgIDM5MDAwLCA1MjAwMCwgNTg1MDAsIDY1MDAwLCAgICAgICAgICAgICAgIC8qIE1DUzQgTUNTNSBNQ1M2IE1DUzcgICAgICAsIDE2IDE3IDE4IDE5Ki8KKyAgICAgICAgMTMwMDAsIDI2MDAwLCAzOTAwMCwgNTIwMDAsICAgICAgICAgICAgICAgLyogTUNTOCBNQ1M5IE1DUzEwIE1DUzExICAgICwgMjAgMjEgMjIgMjMqLworICAgICAgICA3ODAwMCwgMTA0MDAwLCAxMTcwMDAsIDEzMDAwMCwgICAgICAgICAgICAvKiBNQ1MxMiBNQ1MxMyBNQ1MxNCBNQ1MxNSAgLCAyNCAyNSAyNiAyNyovCisgICAgICAgIDEzMDAwMCwgMTQ0NDAwLCA3MjIwMCAgICAgICAgICAgICAgICAgICAgIC8qIE1DUzE0U0csIE1DUzE1U0csIE1TRzdTRyAsIDI4IDI5IDMwKi8KKyAgICB9OworCit1MzJfdCB6ZmlXbGFuUXVlcnlUeFJhdGUoemRldl90KiBkZXYpCit7CisgICAgdThfdCByYXRlSWQgPSAweGZmOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgLyogSWYgVHggcmF0ZSBoYWQgbm90IGJlZW4gdHJhaW5lZCwgcmV0dXJuIG1heGltdW0gVHggcmF0ZSBpbnN0ZWFkICovCisgICAgaWYgKCh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkgJiYgKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSkpCisgICAgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAvL05vdCBpbiBmaXhlZCByYXRlIG1vZGUKKyAgICAgICAgaWYgKHdkLT50eE1DUyA9PSAweGZmKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHdkLT5zdGEub3Bwb3NpdGVJbmZvWzBdLnJjQ2VsbC5mbGFnICYgWk1fUkNfVFJBSU5FRF9CSVQpID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmF0ZUlkID0gd2QtPnN0YS5vcHBvc2l0ZUluZm9bMF0ucmNDZWxsLm9wZXJhdGlvblJhdGVTZXRbd2QtPnN0YS5vcHBvc2l0ZUluZm9bMF0ucmNDZWxsLm9wZXJhdGlvblJhdGVDb3VudC0xXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYXRlSWQgPSB3ZC0+c3RhLm9wcG9zaXRlSW5mb1swXS5yY0NlbGwub3BlcmF0aW9uUmF0ZVNldFt3ZC0+c3RhLm9wcG9zaXRlSW5mb1swXS5yY0NlbGwuY3VycmVudFJhdGVJbmRleF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB9CisgICAgaWYgKHJhdGVJZCAhPSAweGZmKQorICAgIHsKKyAgICAgICAgaWYgKHdkLT5zdGEuaHRDdHJsQmFuZHdpZHRoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gemNSYXRlSWRUb0ticHM0ME1bcmF0ZUlkXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB6Y1JhdGVJZFRvS2JwczIwTVtyYXRlSWRdOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiB3ZC0+Q3VycmVudFR4UmF0ZUticHM7CisgICAgfQorfQorCit2b2lkIHpmV2xhblVwZGF0ZVJ4UmF0ZSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBhZGRJbmZvKQoreworICAgIHUzMl90IHJ4UmF0ZUticHM7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIC8vem1fbXNnMV9tbShaTV9MVl8wLCAiYWRkSW5mby0+VGFpbC5EYXRhLlJ4TWFjU3RhdHVzID0iLCBhZGRJbmZvLT5UYWlsLkRhdGEuUnhNYWNTdGF0dXMgJiAweDAzKTsKKworICAgIC8qIGI1fmI0OiBNUERVIGluZGljYXRpb24uICAgICAgICAgICAgICAgICovCisgICAgLyogICAgICAgIDAwOiBTaW5nbGUgTVBEVS4gICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICAgMTA6IEZpcnN0IE1QRFUgb2YgQS1NUERVLiAgICAgICAqLworICAgIC8qICAgICAgICAxMTogTWlkZGxlIE1QRFUgb2YgQS1NUERVLiAgICAgICovCisgICAgLyogICAgICAgIDAxOiBMYXN0IE1QRFUgb2YgQS1NUERVLiAgICAgICAgKi8KKyAgICAvKiBPbmx5IEZpcnN0IE1QRFUgYW5kIFNpbmdsZSBNUERVIGhhdmUgUExDUCBoZWFkZXIgKi8KKyAgICAvKiBGaXJzdCBNUERVICA6IChtcGR1SW5kICYgMHgzMCkgPT0gMHgwMCAqLworICAgIC8qIFNpbmdsZSBNUERVIDogKG1wZHVJbmQgJiAweDMwKSA9PSAweDIwICovCisgICAgaWYgKChhZGRJbmZvLT5UYWlsLkRhdGEuUnhNYWNTdGF0dXMgJiAweDEwKSA9PSAwKQorICAgIHsKKyAgICAgICAgLyogTW9kdWxhdGlvbiB0eXBlICovCisgICAgICAgIHdkLT5tb2R1bGF0aW9uVHlwZSA9IGFkZEluZm8tPlRhaWwuRGF0YS5SeE1hY1N0YXR1cyAmIDB4MDM7CisgICAgICAgIHN3aXRjaCh3ZC0+bW9kdWxhdGlvblR5cGUpCisgICAgICAgIHsKKyAgICAJCWNhc2UgMHgwOiB3ZC0+cmF0ZUZpZWxkID0gYWRkSW5mby0+UGxjcEhlYWRlclswXSAmIDB4ZmY7IC8vQ0NLIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgICB3ZC0+cnhJbmZvID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAJCWNhc2UgMHgxOiB3ZC0+cmF0ZUZpZWxkID0gYWRkSW5mby0+UGxjcEhlYWRlclswXSAmIDB4MGY7IC8vTGVnYWN5LU9GRE0gbW9kZQorICAgICAgICAgICAgICAgICAgICAgIHdkLT5yeEluZm8gPSAwOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgIAkJY2FzZSAweDI6IHdkLT5yYXRlRmllbGQgPSBhZGRJbmZvLT5QbGNwSGVhZGVyWzNdOyAvL0hULU9GRE0gbW9kZQorICAgIAkJICAgICAgICAgIHdkLT5yeEluZm8gPSBhZGRJbmZvLT5QbGNwSGVhZGVyWzZdOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAgICB9CisKKyAgICAgICAgcnhSYXRlS2JwcyA9IHpmVXBkYXRlUnhSYXRlKGRldik7CisgICAgICAgIGlmICh3ZC0+Q3VycmVudFJ4UmF0ZVVwZGF0ZWQgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHJ4UmF0ZUticHMgPiB3ZC0+Q3VycmVudFJ4UmF0ZUticHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPkN1cnJlbnRSeFJhdGVLYnBzID0gcnhSYXRlS2JwczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5DdXJyZW50UnhSYXRlS2JwcyA9IHJ4UmF0ZUticHM7CisgICAgICAgICAgICB3ZC0+Q3VycmVudFJ4UmF0ZVVwZGF0ZWQgPSAxOworICAgICAgICB9CisgICAgfQorfQorI2lmIDAKK3UxNl90IHpjSW5kZXh0b1JhdGVCR1sxNl0gPSB7MTAwMCwgMjAwMCwgNTUwMCwgMTEwMDAsIDAsIDAsIDAsIDAsIDQ4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MDAwLCAxMjAwMCwgNjAwMCwgNTQwMDAsIDM2MDAwLCAxODAwMCwgOTAwMH07Cit1MzJfdCB6Y0luZGV4dG9SYXRlTjIwTFsxNl0gPSB7NjUwMCwgMTMwMDAsIDE5NTAwLCAyNjAwMCwgMzkwMDAsIDUyMDAwLCA1ODUwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY1MDAwLCAxMzAwMCwgMjYwMDAsIDM5MDAwLCA1MjAwMCwgNzgwMDAsIDEwNDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExNzAwMCwgMTMwMDAwfTsKK3UzMl90IHpjSW5kZXh0b1JhdGVOMjBTWzE2XSA9IHs3MjAwLCAxNDQwMCwgMjE3MDAsIDI4OTAwLCA0MzMwMCwgNTc4MDAsIDY1MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzIyMDAsIDE0NDAwLCAyODkwMCwgNDMzMDAsIDU3ODAwLCA4NjcwMCwgMTE1NjAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMwMDAwLCAxNDQ0MDB9OwordTMyX3QgemNJbmRleHRvUmF0ZU40MExbMTZdID0gezEzNTAwLCAyNzAwMCwgNDA1MDAsIDU0MDAwLCA4MTAwMCwgMTA4MDAwLCAxMjE1MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzUwMDAsIDI3MDAwLCA1NDAwMCwgODEwMDAsIDEwODAwMCwgMTYyMDAwLCAyMTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDMwMDAsIDI3MDAwMH07Cit1MzJfdCB6Y0luZGV4dG9SYXRlTjQwU1sxNl0gPSB7MTUwMDAsIDMwMDAwLCA0NTAwMCwgNjAwMDAsIDkwMDAwLCAxMjAwMDAsIDEzNTAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1MDAwMCwgMzAwMDAsIDYwMDAwLCA5MDAwMCwgMTIwMDAwLCAxODAwMDAsIDI0MDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3MDAwMCwgMzAwMDAwfTsKKyNlbmRpZgorCitleHRlcm4gdTE2X3QgemNJbmRleHRvUmF0ZUJHWzE2XTsKK2V4dGVybiB1MzJfdCB6Y0luZGV4dG9SYXRlTjIwTFsxNl07CitleHRlcm4gdTMyX3QgemNJbmRleHRvUmF0ZU4yMFNbMTZdOworZXh0ZXJuIHUzMl90IHpjSW5kZXh0b1JhdGVONDBMWzE2XTsKK2V4dGVybiB1MzJfdCB6Y0luZGV4dG9SYXRlTjQwU1sxNl07CisKK3UzMl90IHpmaVdsYW5RdWVyeVJ4UmF0ZSh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+Q3VycmVudFJ4UmF0ZVVwZGF0ZWQgPSAwOworICAgIHJldHVybiB3ZC0+Q3VycmVudFJ4UmF0ZUticHM7Cit9CisKK3UzMl90IHpmVXBkYXRlUnhSYXRlKHpkZXZfdCogZGV2KQoreworICAgIHU4X3QgbWNzLCBiYW5kd2lkdGg7CisgICAgdTMyX3QgcnhSYXRlS2JwcyA9IDEzMDAwMDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzd2l0Y2ggKHdkLT5tb2R1bGF0aW9uVHlwZSkKKyAgICB7CisJCWNhc2UgMHgwOiAvL0NDSyBtb2RlCisgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHdkLT5yYXRlRmllbGQpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDBhOiByeFJhdGVLYnBzID0gMTAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MTQ6IHJ4UmF0ZUticHMgPSAyMDAwOworCisgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDM3OiByeFJhdGVLYnBzID0gNTUwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4NmU6IHJ4UmF0ZUticHMgPSAxMTAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCWNhc2UgMHgxOiAvL0xlZ2FjeS1PRkRNIG1vZGUKKyAgICAgICAgICAgICAgICAgIGlmICh3ZC0+cmF0ZUZpZWxkIDw9IDE1KQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIHJ4UmF0ZUticHMgPSB6Y0luZGV4dG9SYXRlQkdbd2QtPnJhdGVGaWVsZF07CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKwkJY2FzZSAweDI6IC8vSFQtT0ZETSBtb2RlCisJCSAgICAgICAgICBtY3MgPSB3ZC0+cmF0ZUZpZWxkICYgMHg3RjsKKwkJICAgICAgICAgIGJhbmR3aWR0aCA9IHdkLT5yYXRlRmllbGQgJiAweDgwOworICAgICAgICAgICAgICAgICAgaWYgKG1jcyA8PSAxNSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFuZHdpZHRoICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICBpZigod2QtPnJ4SW5mbyAmIDB4ODApICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNob3J0IEdJIDQwIE1IeiBNSU1PIFJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ4UmF0ZUticHMgPSB6Y0luZGV4dG9SYXRlTjQwU1ttY3NdOworICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG9uZyBHSSA0MCBNSHogTUlNTyBSYXRlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByeFJhdGVLYnBzID0gemNJbmRleHRvUmF0ZU40MExbbWNzXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICBpZigod2QtPnJ4SW5mbyAmIDB4ODApICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNob3J0IEdJIDIwIE1IeiBNSU1PIFJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ4UmF0ZUticHMgPSB6Y0luZGV4dG9SYXRlTjIwU1ttY3NdOworICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG9uZyBHSSAyMCBNSHogTUlNTyBSYXRlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByeFJhdGVLYnBzID0gemNJbmRleHRvUmF0ZU4yMExbbWNzXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIC8vem1fbXNnMV9tbShaTV9MVl8wLCAid2QtPkN1cnJlbnRSeFJhdGVLYnBzPSIsIHdkLT5DdXJyZW50UnhSYXRlS2Jwcyk7CisKKyAgICAgLy8gVG9EbzogdXNlIGJhbmR3aXRoIGZpZWxkIHRvIGRlZmluZSA0ME1CCisgICAgcmV0dXJuIHJ4UmF0ZUticHM7Cit9CisKKy8qIEdldCBXTEFOIHN0YXN0aWNzICovCit1MTZfdCB6ZmlXbGFuR2V0U3RhdGlzdGljcyh6ZGV2X3QqIGRldikKK3sKKyAgICAvKiBSZXR1cm4gbGluayBzdGF0aXN0aWNzICovCisgICAgcmV0dXJuIDA7Cit9CisKK3UxNl90IHpmaVdsYW5SZXNldCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+c3RhdGUgPSBaTV9XTEFOX1NUQVRFX0RJU0FCTEVEOworCisgICAgcmV0dXJuIHpmV2xhblJlc2V0KGRldik7Cit9CisKKy8qIFJlc2V0IFdMQU4gKi8KK3UxNl90IHpmV2xhblJlc2V0KHpkZXZfdCogZGV2KQoreworICAgIHU4X3QgaXNDb25uZWN0ZWQ7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptX2RlYnVnX21zZzAoInpmV2xhblJlc2V0Iik7CisKKyAgICBpc0Nvbm5lY3RlZCA9IHpmU3RhSXNDb25uZWN0ZWQoZGV2KTsKKworICAgIC8vaWYgKCB3ZC0+d2xhbk1vZGUgIT0gWk1fTU9ERV9BUCApCisgICAgeworICAgICAgICBpZiAoICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkmJgorICAgICAgICAgICAgICh3ZC0+c3RhLmN1cnJlbnRBdXRoTW9kZSAhPSBaTV9BVVRIX01PREVfV1BBMikgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBzZW5kIGRlYXV0aGVudGljYXRpb24gZnJhbWUgKi8KKyAgICAgICAgICAgIGlmIChpc0Nvbm5lY3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3pmaVdsYW5EZWF1dGgoZGV2LCBOVUxMLCAwKTsKKyAgICAgICAgICAgICAgICB6ZlNlbmRNbUZyYW1lKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX0RFQVVUSCwgd2QtPnN0YS5ic3NpZCwgMywgMCwgMCk7CisgICAgICAgICAgICAgICAgLy96bXdfZGVidWdfbXNnMCgic2VuZCBhIERlYXV0aCBmcmFtZSEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHpmQ2hhbmdlQWRhcHRlclN0YXRlKGRldiwgWk1fU1RBX1NUQVRFX0RJU0NPTk5FQ1QpOworICAgIHpmSHBSZXNldEtleUNhY2hlKGRldik7CisKKyAgICBpZiAoaXNDb25uZWN0ZWQpCisgICAgeworICAgICAgICAvL3pmaVdsYW5EaXNhYmxlKGRldik7CisgICAgICAgIGlmICh3ZC0+emZjYkNvbm5lY3ROb3RpZnkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnpmY2JDb25uZWN0Tm90aWZ5KGRldiwgWk1fU1RBVFVTX01FRElBX0NPTk5FQ1RJT05fUkVTRVQsIHdkLT5zdGEuYnNzaWQpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICh3ZC0+emZjYkNvbm5lY3ROb3RpZnkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnpmY2JDb25uZWN0Tm90aWZ5KGRldiwgWk1fU1RBVFVTX01FRElBX1JFU0VULCB3ZC0+c3RhLmJzc2lkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHN0b3AgYmVhY29uICovCisgICAgemZIcERpc2FibGVCZWFjb24oZGV2KTsKKworICAgIC8qIEZyZWUgYnVmZmVyIGluIGRlZnJhZ21lbnQgbGlzdCovCisgICAgemZBZ2luZ0RlZnJhZ0xpc3QoZGV2LCAxKTsKKworICAgIC8qIEZsdXNoIFZUeFEgYW5kIE1tUSAqLworICAgIHpmRmx1c2hWdHhxKGRldik7CisKKyAgICAjaWZkZWYgWk1fRU5BQkxFX0FHR1JFR0FUSU9OCisgICAgLyogYWRkIGJ5IGhvbmRhICovCisgICAgemZBZ2dSeEZyZWVCdWYoZGV2LCAwKTsgIC8vMSBmb3IgcmVsZWFzZSBzdHJ1Y3R1cmUgbWVtb3J5CisgICAgLyogZW5kIG9mIGFkZCBieSBob25kYSAqLworICAgICNlbmRpZgorCisgICAgemZTdGFSZWZyZXNoQmxvY2tMaXN0KGRldiwgMSk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgemZUaW1lckNhbmNlbChkZXYsIFpNX0VWRU5UX0lCU1NfTU9OSVRPUik7CisgICAgemZUaW1lckNhbmNlbChkZXYsIFpNX0VWRU5UX0NNX0JMT0NLX1RJTUVSKTsKKyAgICB6ZlRpbWVyQ2FuY2VsKGRldiwgWk1fRVZFTlRfQ01fRElTQ09OTkVDVCk7CisKKyAgICB3ZC0+c3RhLmNvbm5lY3RTdGF0ZSA9IFpNX1NUQV9DT05OX1NUQVRFX05PTkU7CisgICAgd2QtPnN0YS5jb25uZWN0QnlSZWFzc28gPSBGQUxTRTsKKyAgICB3ZC0+c3RhLmNtRGlzYWxsb3dTc2lkTGVuZ3RoID0gMDsKKyAgICB3ZC0+c3RhLmJBdXRvUmVjb25uZWN0ID0gMDsKKyAgICB3ZC0+c3RhLkludGVybmFsU2NhblJlcSA9IDA7CisgICAgd2QtPnN0YS5lbmNyeU1vZGUgPSBaTV9OT19XRVA7CisgICAgd2QtPnN0YS53ZXBTdGF0dXMgPSBaTV9FTkNSWVBUSU9OX1dFUF9ESVNBQkxFRDsKKyAgICB3ZC0+c3RhLndwYVN0YXRlID0gWk1fU1RBX1dQQV9TVEFURV9JTklUOworICAgIHdkLT5zdGEuY21NaWNGYWlsdXJlQ291bnQgPSAwOworICAgIHdkLT5zdGEuaWJzc0Jzc0lzQ3JlYXRvciA9IDA7CisjaWZkZWYgWk1fRU5BQkxFX0lCU1NfV1BBMlBTSworICAgIHdkLT5zdGEuaWJzc1dwYTJQc2sgPSAwOworI2VuZGlmCisgICAgLyogcmVzZXQgY29ubmVjdCB0aW1lb3V0IGNvdW50ZXIgKi8KKyAgICB3ZC0+c3RhLmNvbm5lY3RUaW1lb3V0Q291bnQgPSAwOworCisgICAgLyogcmVzZXQgbGVhcCBlbmFibGUgdmFyaWFibGUgKi8KKyAgICB3ZC0+c3RhLmxlYXBFbmFibGVkID0gMDsKKworICAgIC8qIFJlc2V0IHRoZSBSSUZTIFN0YXR1cyAvIFJJRlMtbGlrZSBmcmFtZSBjb3VudCAvIFJJRlMgY291bnQgKi8KKyAgICBpZiggd2QtPnN0YS5yaWZzU3RhdGUgPT0gWk1fUklGU19TVEFURV9ERVRFQ1RFRCApCisgICAgICAgIHpmSHBEaXNhYmxlUmlmcyhkZXYpOworICAgIHdkLT5zdGEucmlmc1N0YXRlID0gWk1fUklGU19TVEFURV9ERVRFQ1RJTkc7CisgICAgd2QtPnN0YS5yaWZzTGlrZUZyYW1lQ250ID0gMDsKKyAgICB3ZC0+c3RhLnJpZnNDb3VudCA9IDA7CisKKyAgICB3ZC0+c3RhLm9zUnhGaWx0ZXIgPSAwOworICAgIHdkLT5zdGEuYlNhZmVNb2RlID0gMDsKKworICAgIC8vIENsZWFyIHRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHBlZXIgc3RhdGlvbnMgb2YgSUJTUyBvciBBUCBvZiBTdGF0aW9uIG1vZGUKKyAgICB6Zlplcm9NZW1vcnkoKHU4X3QqKXdkLT5zdGEub3Bwb3NpdGVJbmZvLCBzaXplb2Yoc3RydWN0IHpzT3Bwb3NpdGVJbmZvKSAqIFpNX01BWF9PUFBPU0lURV9DT1VOVCk7CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgemZTY2FuTWdyU2NhblN0b3AoZGV2LCBaTV9TQ0FOX01HUl9TQ0FOX0lOVEVSTkFMKTsKKyAgICB6ZlNjYW5NZ3JTY2FuU3RvcChkZXYsIFpNX1NDQU5fTUdSX1NDQU5fRVhURVJOQUwpOworCisgICAgLyogVHVybiBvZmYgU29mdHdhcmUgV0VQL1RLSVAgKi8KKyAgICBpZiAod2QtPnN0YS5TV0VuY3J5cHRFbmFibGUgIT0gMCkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIkRpc2FibGUgc29mdHdhcmUgZW5jcnlwdGlvbiIpOworICAgICAgICB6ZlN0YURpc2FibGVTV0VuY3J5cHRpb24oZGV2KTsKKyAgICB9CisKKyAgICAvKiBJbXByb3ZlIFdFUC9US0lQIHBlcmZvcm1hY2Ugd2l0aCBIVCBBUCwgZGV0YWlsIGluZm9ybWF0aW9uIHBsZWFzZSBsb29rIGJ1ZyMzMjQ5NSAqLworICAgIC8vemZIcFNldFRUU0lGU1RpbWUoZGV2LCAweDgpOworCisgICAgLyogS2VlcCBQc2V1ZG8gbW9kZSAqLworICAgIGlmICggd2QtPndsYW5Nb2RlICE9IFpNX01PREVfUFNFVURPICkKKyAgICB7CisgICAgICAgIHdkLT53bGFuTW9kZSA9IFpNX01PREVfSU5GUkFTVFJVQ1RVUkU7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiBEZWF1dGhlbnRpY2F0ZSBhIFNUQSAqLwordTE2X3QgemZpV2xhbkRlYXV0aCh6ZGV2X3QqIGRldiwgdTE2X3QqIG1hY0FkZHIsIHUxNl90IHJlYXNvbikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQICkKKyAgICB7CisgICAgICAgIC8vdTE2X3QgaWQ7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogd2Ugd2lsbCByZXNldCBhbGwga2V5IGluIHpmSHBSZXNldEtleUNhY2hlKCkgd2hlbiBjYWxsCisgICAgICAgICAqIHpmaVdsYW5EaXNhYmxlKCksIGlmIHdlIHdhbnQgdG8gcmVzZXQgUGFpcndpc2VLZXkgZm9yIGVhY2ggc3RhLAorICAgICAgICAgKiBuZWVkIHRvIHVzZSBhIG51bGxBZGRyIHRvIGxldCBrZXlpbmRleCBub3QgbWF0Y2guCisgICAgICAgICAqIG90aGVyd2lzZSBoYXJkd2FyZSB3aWxsIHN0aWxsIGZpbmQgUGFpcndpc2VLZXkgd2hlbiBBUCBjaGFuZ2UKKyAgICAgICAgICogZW5jcnlwdGlvbiBtb2RlIGZyb20gV1BBIHRvIFdFUAorICAgICAgICAgKi8KKworICAgICAgICAvKgorICAgICAgICBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBtYWNBZGRyKSkgIT0gMHhmZmZmKQorICAgICAgICB7CisgICAgICAgICAgICB1MzJfdCBrZXlbOF07CisgICAgICAgICAgICB1MTZfdCBudWxsQWRkclszXSA9IHsgMHgwLCAweDAsIDB4MCB9OworCisgICAgICAgICAgICBpZiAod2QtPmFwLnN0YVRhYmxlW2ldLmVuY3J5TW9kZSAhPSBaTV9OT19XRVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZIcFNldEFwUGFpcndpc2VLZXkoZGV2LCBudWxsQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFpNX05PX1dFUCwgJmtleVswXSwgJmtleVs0XSwgaSsxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vemZIcFNldEFwUGFpcndpc2VLZXkoZGV2LCAodTE2X3QgKiltYWNBZGRyLAorICAgICAgICAgICAgLy8gICAgICAgIFpNX05PX1dFUCwgJmtleVswXSwgJmtleVs0XSwgaWQrMSk7CisgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLmVuY3J5TW9kZSA9IFpNX05PX1dFUDsKKyAgICAgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpZF0ua2V5SWR4ID0gMHhmZjsKKyAgICAgICAgfQorICAgICAgICAqLworCisgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfREVBVVRILCBtYWNBZGRyLCByZWFzb24sIDAsIDApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6ZlNlbmRNbUZyYW1lKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX0RFQVVUSCwgd2QtPnN0YS5ic3NpZCwgMywgMCwgMCk7CisgICAgfQorCisgICAgLyogSXNzdWUgREVBVVRIIGNvbW1hbmQgdG8gRlcgKi8KKyAgICByZXR1cm4gMDsKK30KKworCisvKiBYUCBwYWNrZXQgZmlsdGVyIGZlYXR1cmUgOiAqLworLyogMT0+ZW5hYmxlOiBBbGwgbXVsdGljYXN0IGFkZHJlc3MgcGFja2V0cywgbm90IGp1c3QgdGhlIG9uZXMgZW51bWVyYXRlZCBpbiB0aGUgbXVsdGljYXN0IGFkZHJlc3MgbGlzdC4gKi8KKy8qIDA9PmRpc2FibGUgKi8KK3ZvaWQgemZpV2xhblNldEFsbE11bHRpY2FzdCh6ZGV2X3QqIGRldiwgdTMyX3Qgc2V0dGluZykKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem1fbXNnMV9tbShaTV9MVl8wLCAic3RhLmJBbGxNdWx0aWNhc3QgPSAiLCBzZXR0aW5nKTsKKyAgICB3ZC0+c3RhLmJBbGxNdWx0aWNhc3QgPSAodThfdClzZXR0aW5nOworfQorCisKKy8qIEhUIGNvbmZpZ3VyZSBBUEkgKi8KK3ZvaWQgemZpV2xhblNldEhUQ3RybCh6ZGV2X3QqIGRldiwgdTMyX3QgKnNldHRpbmcsIHUzMl90IGZvcmNlVHhUUEMpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnByZWFtYmxlVHlwZSAgICAgICAgPSAodThfdClzZXR0aW5nWzBdOworICAgIHdkLT5zdGEucHJlYW1ibGVUeXBlSFQgID0gKHU4X3Qpc2V0dGluZ1sxXTsKKyAgICB3ZC0+c3RhLmh0Q3RybEJhbmR3aWR0aCA9ICh1OF90KXNldHRpbmdbMl07CisgICAgd2QtPnN0YS5odEN0cmxTVEJDICAgICAgPSAodThfdClzZXR0aW5nWzNdOworICAgIHdkLT5zdGEuaHRDdHJsU0cgICAgICAgID0gKHU4X3Qpc2V0dGluZ1s0XTsKKyAgICB3ZC0+c3RhLmRlZmF1bHRUQSAgICAgICA9ICh1OF90KXNldHRpbmdbNV07CisgICAgd2QtPmVuYWJsZUFnZ3JlZ2F0aW9uICAgPSAodThfdClzZXR0aW5nWzZdOworICAgIHdkLT5lbmFibGVXRFMgICAgICAgICAgID0gKHU4X3Qpc2V0dGluZ1s3XTsKKworICAgIHdkLT5mb3JjZVR4VFBDICAgICAgICAgID0gZm9yY2VUeFRQQzsKK30KKworLyogRkI1MCBpbiBPUyBYUCwgUkQgcHJpdmF0ZSB0ZXN0IGNvZGUgKi8KK3ZvaWQgemZpV2xhblF1ZXJ5SFRDdHJsKHpkZXZfdCogZGV2LCB1MzJfdCAqc2V0dGluZywgdTMyX3QgKmZvcmNlVHhUUEMpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc2V0dGluZ1swXSA9IHdkLT5wcmVhbWJsZVR5cGU7CisgICAgc2V0dGluZ1sxXSA9IHdkLT5zdGEucHJlYW1ibGVUeXBlSFQ7CisgICAgc2V0dGluZ1syXSA9IHdkLT5zdGEuaHRDdHJsQmFuZHdpZHRoOworICAgIHNldHRpbmdbM10gPSB3ZC0+c3RhLmh0Q3RybFNUQkM7CisgICAgc2V0dGluZ1s0XSA9IHdkLT5zdGEuaHRDdHJsU0c7CisgICAgc2V0dGluZ1s1XSA9IHdkLT5zdGEuZGVmYXVsdFRBOworICAgIHNldHRpbmdbNl0gPSB3ZC0+ZW5hYmxlQWdncmVnYXRpb247CisgICAgc2V0dGluZ1s3XSA9IHdkLT5lbmFibGVXRFM7CisKKyAgICAqZm9yY2VUeFRQQyA9IHdkLT5mb3JjZVR4VFBDOworfQorCit2b2lkIHpmaVdsYW5EYmcoemRldl90KiBkZXYsIHU4X3Qgc2V0dGluZykKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+ZW5hYmxlSEFMRGJnSW5mbyA9IHNldHRpbmc7Cit9CisKKy8qIEZCNTAgaW4gT1MgWFAsIFJEIHByaXZhdGUgdGVzdCBjb2RlICovCit2b2lkIHpmaVdsYW5TZXRSeFBhY2tldER1bXAoemRldl90KiBkZXYsIHUzMl90IHNldHRpbmcpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIGlmIChzZXR0aW5nKQorICAgIHsKKyAgICAgICAgd2QtPnJ4UGFja2V0RHVtcCA9IDE7ICAgLyogZW5hYmxlICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHdkLT5yeFBhY2tldER1bXAgPSAwOyAgIC8qIGRpc2FibGUgKi8KKyAgICB9Cit9CisKKworLyogRkI1MCBpbiBPUyBYUCwgUkQgcHJpdmF0ZSB0ZXN0IGNvZGUgKi8KKy8qIFRhbGx5ICovCit2b2lkIHpmaVdsYW5SZXNldFRhbGx5KHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisJICAgd2QtPmNvbW1UYWxseS50eFVuaWNhc3RGcm0gPSAwOwkJLy90eFVuaWNhc3RGcmFtZXMKKwkgICB3ZC0+Y29tbVRhbGx5LnR4TXVsdGljYXN0RnJtID0gMDsJCS8vdHhNdWx0aWNhc3RGcmFtZXMKKwkgICB3ZC0+Y29tbVRhbGx5LnR4VW5pY2FzdE9jdGV0cyA9IDA7CS8vdHhVbmlPY3RldHMgIGJ5dGUgc2l6ZQorCSAgIHdkLT5jb21tVGFsbHkudHhNdWx0aWNhc3RPY3RldHMgPSAwOwkvL3R4TXVsdGlPY3RldHMgIGJ5dGUgc2l6ZQorCSAgIHdkLT5jb21tVGFsbHkudHhGcm1VcHBlck5ESVMgPSAwOworCSAgIHdkLT5jb21tVGFsbHkudHhGcm1EcnZNZ3QgPSAwOworCSAgIHdkLT5jb21tVGFsbHkuUmV0cnlGYWlsQ250ID0gMDsKKwkgICB3ZC0+Y29tbVRhbGx5Lkh3X1RvdGFsVHhGcm0gPSAwOwkJLy9IYXJkd2FyZSB0b3RhbCBUeCBGcmFtZQorCSAgIHdkLT5jb21tVGFsbHkuSHdfUmV0cnlDbnQgPSAwOwkJLy90eE11bHRpcGxlUmV0cmllc0ZyYW1lcworCSAgIHdkLT5jb21tVGFsbHkuSHdfVW5kZXJydW5DbnQgPSAwOy8vCisJICAgd2QtPmNvbW1UYWxseS5Ecml2ZXJSeEZybUNudCA9IDA7Ly8KKwkgICB3ZC0+Y29tbVRhbGx5LnJ4VW5pY2FzdEZybSA9IDA7CQkvL3J4VW5pY2FzdEZyYW1lcworCSAgIHdkLT5jb21tVGFsbHkucnhNdWx0aWNhc3RGcm0gPSAwOwkvL3J4TXVsdGljYXN0RnJhbWVzCisJICAgd2QtPmNvbW1UYWxseS5Ob3RpZnlORElTUnhGcm1DbnQgPSAwOy8vCisJICAgd2QtPmNvbW1UYWxseS5yeFVuaWNhc3RPY3RldHMgPSAwOwkvL3J4VW5pT2N0ZXRzICBieXRlIHNpemUKKwkgICB3ZC0+Y29tbVRhbGx5LnJ4TXVsdGljYXN0T2N0ZXRzID0gMDsJLy9yeE11bHRpT2N0ZXRzICBieXRlIHNpemUKKwkgICB3ZC0+Y29tbVRhbGx5LkRyaXZlckRpc2NhcmRlZEZybSA9IDA7Ly8gRGlzY2FyZCBieSBWYWxpZGF0ZUZyYW1lCisJICAgd2QtPmNvbW1UYWxseS5MZXNzVGhhbkRhdGFNaW5MZW4gPSAwOy8vCisJICAgd2QtPmNvbW1UYWxseS5HcmVhdGVyVGhhbk1heExlbiA9IDA7Ly8KKwkgICB3ZC0+Y29tbVRhbGx5LkRyaXZlckRpc2NhcmRlZEZybUNhdXNlQnlNdWx0aWNhc3RMaXN0ID0gMDsKKwkgICB3ZC0+Y29tbVRhbGx5LkRyaXZlckRpc2NhcmRlZEZybUNhdXNlQnlGcm1DdHJsID0gMDsKKwkgICB3ZC0+Y29tbVRhbGx5LnJ4TmVlZEZyZ0ZybSA9IDA7CQkvLyBuZWVkIG1vcmUgZnJnIGZybQorCSAgIHdkLT5jb21tVGFsbHkuRHJpdmVyUnhNZ3RGcm1DbnQgPSAwOworCSAgIHdkLT5jb21tVGFsbHkucnhCcm9hZGNhc3RGcm0gPSAwOwkvL1JlY2VpdmUgYnJvYWRjYXN0IGZyYW1lIGNvdW50CisJICAgd2QtPmNvbW1UYWxseS5yeEJyb2FkY2FzdE9jdGV0cyA9IDA7CS8vUmVjZWl2ZSBicm9hZGNhc3QgZnJhbWUgYnl0ZSBzaXplCisJICAgd2QtPmNvbW1UYWxseS5Id19Ub3RhbFJ4RnJtID0gMDsvLworCSAgIHdkLT5jb21tVGFsbHkuSHdfQ1JDMTZDbnQgPSAwOwkJLy9yeFBMQ1BDUkNFcnJDbnQKKwkgICB3ZC0+Y29tbVRhbGx5Lkh3X0NSQzMyQ250ID0gMDsJCS8vcnhDUkMzMkVyckNudAorCSAgIHdkLT5jb21tVGFsbHkuSHdfRGVjcnlwRXJyX1VOSSA9IDA7Ly8KKwkgICB3ZC0+Y29tbVRhbGx5Lkh3X0RlY3J5cEVycl9NdWwgPSAwOy8vCisJICAgd2QtPmNvbW1UYWxseS5Id19SeEZJRk9PdmVycnVuID0gMDsvLworCSAgIHdkLT5jb21tVGFsbHkuSHdfUnhUaW1lT3V0ID0gMDsKKwkgICB3ZC0+Y29tbVRhbGx5Lkxvc3NBUCA9IDA7Ly8KKworCSAgIHdkLT5jb21tVGFsbHkuVHhfTVBEVSA9IDA7CisJICAgd2QtPmNvbW1UYWxseS5CQV9GYWlsID0gMDsKKwkgICB3ZC0+Y29tbVRhbGx5Lkh3X1R4X0FNUERVID0gMDsKKwkgICB3ZC0+Y29tbVRhbGx5Lkh3X1R4X01QRFUgPSAwOworCisgICAgd2QtPmNvbW1UYWxseS50eFFvc0Ryb3BDb3VudFswXSA9IDA7CisgICAgd2QtPmNvbW1UYWxseS50eFFvc0Ryb3BDb3VudFsxXSA9IDA7CisgICAgd2QtPmNvbW1UYWxseS50eFFvc0Ryb3BDb3VudFsyXSA9IDA7CisgICAgd2QtPmNvbW1UYWxseS50eFFvc0Ryb3BDb3VudFszXSA9IDA7CisgICAgd2QtPmNvbW1UYWxseS50eFFvc0Ryb3BDb3VudFs0XSA9IDA7CisKKyAgICB3ZC0+Y29tbVRhbGx5Lkh3X1J4TVBEVSA9IDA7CisgICAgd2QtPmNvbW1UYWxseS5Id19SeERyb3BNUERVID0gMDsKKyAgICB3ZC0+Y29tbVRhbGx5Lkh3X1J4RGVsTVBEVSA9IDA7CisKKyAgICB3ZC0+Y29tbVRhbGx5Lkh3X1J4UGh5TWlzY0Vycm9yID0gMDsKKyAgICB3ZC0+Y29tbVRhbGx5Lkh3X1J4UGh5WFJFcnJvciA9IDA7CisgICAgd2QtPmNvbW1UYWxseS5Id19SeFBoeU9GRE1FcnJvciA9IDA7CisgICAgd2QtPmNvbW1UYWxseS5Id19SeFBoeUNDS0Vycm9yID0gMDsKKyAgICB3ZC0+Y29tbVRhbGx5Lkh3X1J4UGh5SFRFcnJvciA9IDA7CisgICAgd2QtPmNvbW1UYWxseS5Id19SeFBoeVRvdGFsQ291bnQgPSAwOworCisjaWYJKGRlZmluZWQoR0NDSykgJiYgZGVmaW5lZChPRkRNKSkKKwkgICB3ZC0+Y29tbVRhbGx5LnJ4MTFiRGF0YUZyYW1lID0gMDsKKwkgICB3ZC0+Y29tbVRhbGx5LnJ4T0ZETURhdGFGcmFtZSA9IDA7CisjZW5kaWYKKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7Cit9CisKKy8qIEZCNTAgaW4gT1MgWFAsIFJEIHByaXZhdGUgdGVzdCBjb2RlICovCit2b2lkIHpmaVdsYW5RdWVyeVRhbGx5KHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNDb21tVGFsbHkgKnRhbGx5KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHpmTWVtb3J5Q29weSgodThfdCopdGFsbHksICh1OF90Kikmd2QtPmNvbW1UYWxseSwgc2l6ZW9mKHN0cnVjdCB6c0NvbW1UYWxseSkpOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7Cit9Cit2b2lkIHpmaVdsYW5RdWVyeVRyYWZUYWxseSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzVHJhZlRhbGx5ICp0YWxseSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB6Zk1lbW9yeUNvcHkoKHU4X3QqKXRhbGx5LCAodThfdCopJndkLT50cmFmVGFsbHksIHNpemVvZihzdHJ1Y3QgenNUcmFmVGFsbHkpKTsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCit2b2lkIHpmaVdsYW5RdWVyeU1vbkhhbFJ4SW5mbyh6ZGV2X3QqIGRldiwgc3RydWN0IHpzTW9uSGFsUnhJbmZvICptb25IYWxSeEluZm8pCit7CisgICAgemZIcFF1ZXJ5TW9uSGFsUnhJbmZvKGRldiwgKHU4X3QgKiltb25IYWxSeEluZm8pOworfQorCisvKiBwYXJzZSB0aGUgbW9kZU1ES0VuYWJsZSB0byBEcnZDb3JlICovCit2b2lkIHpmaURLRW5hYmxlKHpkZXZfdCogZGV2LCB1MzJfdCBlbmFibGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPm1vZGVNREtFbmFibGUgPSBlbmFibGU7CisgICAgem1fZGVidWdfbXNnMSgibW9kZU1ES0VuYWJsZSA9ICIsIHdkLT5tb2RlTURLRW5hYmxlKTsKK30KKworLyogYWlyb1BlZWsgKi8KK3UzMl90IHpmaVdsYW5RdWVyeVBhY2tldFR5cGVQcm9taXNjdW91cyh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICByZXR1cm4gd2QtPnN3U25pZmZlcjsKK30KKworLyogYWlyb1BlZWsgKi8KK3ZvaWQgemZpV2xhblNldFBhY2tldFR5cGVQcm9taXNjdW91cyh6ZGV2X3QqIGRldiwgdTMyX3Qgc2V0VmFsdWUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisJICAgd2QtPnN3U25pZmZlciA9IHNldFZhbHVlOworCSAgIHptX21zZzFfbW0oWk1fTFZfMCwgIndkLT5zd1NuaWZmZXIgIiwgd2QtPnN3U25pZmZlcik7CisJICAgaWYgKHNldFZhbHVlKQorCSAgIHsKKwkgICAgICAgCS8qIHdyaXRlIHJlZ2lzdGVyIGZvciBzbmlmZmVyIG1vZGUgKi8KKyAgICAgICAgICAgIHpmSHBTZXRTbmlmZmVyTW9kZShkZXYsIDEpOworICAgICAgICAgICAgem1fbXNnMF9tbShaTV9MVl8xLCAiZW5hbGJlIHNuaWZmZXIgbW9kZSIpOworCSAgIH0KKwkgICBlbHNlCisJICAgeworICAgICAgICAgICAgemZIcFNldFNuaWZmZXJNb2RlKGRldiwgMCk7CisgICAgICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJkaXNhbGJlIHNuaWZmZXIgbW9kZSIpOworCSAgIH0KK30KKwordm9pZCB6ZmlXbGFuU2V0WExpbmtNb2RlKHpkZXZfdCogZGV2LCB1MzJfdCBzZXRWYWx1ZSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+WExpbmtNb2RlID0gc2V0VmFsdWU7CisgICAgaWYgKHNldFZhbHVlKQorICAgIHsKKyAgICAgICAgLyogd3JpdGUgcmVnaXN0ZXIgZm9yIHNuaWZmZXIgbW9kZSAqLworICAgICAgICB6ZkhwU2V0U25pZmZlck1vZGUoZGV2LCAxKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgemZIcFNldFNuaWZmZXJNb2RlKGRldiwgMCk7CisgICAgfQorfQorCitleHRlcm4gdm9pZCB6ZlN0YUNoYW5uZWxNYW5hZ2VtZW50KHpkZXZfdCogZGV2LCB1OF90IHNjYW4pOwordm9pZCB6ZmlTZXRDaGFubmVsTWFuYWdlbWVudCh6ZGV2X3QqIGRldiwgdTMyX3Qgc2V0dGluZykKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzd2l0Y2ggKHNldHRpbmcpCisgICAgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICB3ZC0+c3RhLkVuYWJsZUhUID0gMTsKKyAgICAgICAgICAgIHdkLT5CYW5kV2lkdGg0MCA9IDE7CisgICAgICAgICAgICB3ZC0+RXh0T2Zmc2V0ICAgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHdkLT5zdGEuRW5hYmxlSFQgPSAxOworICAgICAgICAgICAgd2QtPkJhbmRXaWR0aDQwID0gMTsKKyAgICAgICAgICAgIHdkLT5FeHRPZmZzZXQgICA9IDM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgd2QtPnN0YS5FbmFibGVIVCA9IDE7CisgICAgICAgICAgICB3ZC0+QmFuZFdpZHRoNDAgPSAwOworICAgICAgICAgICAgd2QtPkV4dE9mZnNldCAgID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgd2QtPkJhbmRXaWR0aDQwID0gMDsKKyAgICAgICAgICAgIHdkLT5FeHRPZmZzZXQgICA9IDA7CisgICAgICAgICAgICBicmVhazsKKworICAgIH0KKyAgICB6ZkNvcmVTZXRGcmVxdWVuY3lFeChkZXYsIHdkLT5mcmVxdWVuY3ksIHdkLT5CYW5kV2lkdGg0MCwKKyAgICAgICAgICAgICAgICAgICAgd2QtPkV4dE9mZnNldCwgTlVMTCk7Cit9CisKK3ZvaWQgemZpU2V0Umlmcyh6ZGV2X3QqIGRldiwgdTE2X3Qgc2V0dGluZykKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+c3RhLmllLkh0SW5mby5DaGFubmVsSW5mbyB8PSBFeHRIdENhcF9SSUZTTW9kZTsKKyAgICB3ZC0+c3RhLkVuYWJsZUhUID0gMTsKKyAgICBzd2l0Y2ggKHNldHRpbmcpCisgICAgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB3ZC0+c3RhLkhUMjA0MCA9IDA7CisvLyAgICAgICAgICAgIHpmSHBTZXRSaWZzKGRldiwgMSwgMCwgKHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeSA8IDMwMDApPyAxOjApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHdkLT5zdGEuSFQyMDQwID0gMTsKKy8vICAgICAgICAgICAgemZIcFNldFJpZnMoZGV2LCAxLCAxLCAod2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5IDwgMzAwMCk/IDE6MCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHdkLT5zdGEuSFQyMDQwID0gMDsKKy8vICAgICAgICAgICAgemZIcFNldFJpZnMoZGV2LCAxLCAwLCAod2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5IDwgMzAwMCk/IDE6MCk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgemZpQ2hlY2tSaWZzKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmKHdkLT5zdGEuaWUuSHRJbmZvLkNoYW5uZWxJbmZvICYgRXh0SHRDYXBfUklGU01vZGUpCisgICAgeworLy8gICAgICAgIHpmSHBTZXRSaWZzKGRldiwgd2QtPnN0YS5FbmFibGVIVCwgd2QtPnN0YS5IVDIwNDAsICh3ZC0+c3RhLmN1cnJlbnRGcmVxdWVuY3kgPCAzMDAwKT8gMTowKTsKKyAgICB9Cit9CisKK3ZvaWQgemZpU2V0UmVvcmRlcih6ZGV2X3QqIGRldiwgdTE2X3QgdmFsdWUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnJlb3JkZXIgPSB2YWx1ZTsKK30KKwordm9pZCB6ZmlTZXRTZXFEZWJ1Zyh6ZGV2X3QqIGRldiwgdTE2X3QgdmFsdWUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnNlcV9kZWJ1ZyA9IHZhbHVlOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NmdW5jLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY2Z1bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2M0OWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NmdW5jLmMKQEAgLTAsMCArMSwxMjI3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImNwcmVjb21wLmgiCisKK3U4X3QgemZRdWVyeU9wcG9zaXRlUmF0ZSh6ZGV2X3QqIGRldiwgdThfdCBkc3RfbWFjWzZdLCB1OF90IGZyYW1lVHlwZSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBGb3IgQVAncyByYXRlIGFkYXB0aW9uICovCisgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCApCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBGb3IgU1RBJ3MgcmF0ZSBhZGFwdGlvbiAqLworICAgIGlmICggKGZyYW1lVHlwZSAmIDB4MGMpID09IFpNX1dMQU5fREFUQV9GUkFNRSApCisgICAgeworICAgICAgICBpZiAoIFpNX0lTX01VTFRJQ0FTVChkc3RfbWFjKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB3ZC0+c3RhLm1UeFJhdGU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gd2QtPnN0YS51VHhSYXRlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHdkLT5zdGEubW1UeFJhdGU7Cit9CisKK3ZvaWQgemZDb3B5VG9JbnRUeEJ1ZmZlcih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBvZmZzZXQsIHUxNl90IGxlbmd0aCkKK3sKKyAgICB1MTZfdCBpOworCisgICAgZm9yKGk9MDsgaTxsZW5ndGg7aSsrKQorICAgIHsKKyAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCtpLCBzcmNbaV0pOworICAgIH0KK30KKwordm9pZCB6ZkNvcHlUb1J4QnVmZmVyKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgIHUxNl90IG9mZnNldCwgdTE2X3QgbGVuZ3RoKQoreworICAgIHUxNl90IGk7CisKKyAgICBmb3IoaT0wOyBpPGxlbmd0aDtpKyspCisgICAgeworICAgICAgICB6bXdfcnhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0K2ksIHNyY1tpXSk7CisgICAgfQorfQorCit2b2lkIHpmQ29weUZyb21JbnRUeEJ1ZmZlcih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90IG9mZnNldCwgdTE2X3QgbGVuZ3RoKQoreworICAgIHUxNl90IGk7CisKKyAgICBmb3IoaT0wOyBpPGxlbmd0aDsgaSsrKQorICAgIHsKKyAgICAgICAgZHN0W2ldID0gem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0K2kpOworICAgIH0KK30KKwordm9pZCB6ZkNvcHlGcm9tUnhCdWZmZXIoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBvZmZzZXQsIHUxNl90IGxlbmd0aCkKK3sKKyAgICB1MTZfdCBpOworCisgICAgZm9yKGk9MDsgaTxsZW5ndGg7IGkrKykKKyAgICB7CisgICAgICAgIGRzdFtpXSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCtpKTsKKyAgICB9Cit9CisKKyNpZiAxCit2b2lkIHpmTWVtb3J5Q29weSh1OF90KiBkc3QsIHU4X3QqIHNyYywgdTE2X3QgbGVuZ3RoKQoreworICAgIHpmd01lbW9yeUNvcHkoZHN0LCBzcmMsIGxlbmd0aCk7Cit9CisKK3ZvaWQgemZNZW1vcnlNb3ZlKHU4X3QqIGRzdCwgdThfdCogc3JjLCB1MTZfdCBsZW5ndGgpCit7CisgICAgemZ3TWVtb3J5TW92ZShkc3QsIHNyYywgbGVuZ3RoKTsKK30KKwordm9pZCB6Zlplcm9NZW1vcnkodThfdCogdmEsIHUxNl90IGxlbmd0aCkKK3sKKyAgICB6ZndaZXJvTWVtb3J5KHZhLCBsZW5ndGgpOworfQorCit1OF90IHpmTWVtb3J5SXNFcXVhbCh1OF90KiBtMSwgdThfdCogbTIsIHUxNl90IGxlbmd0aCkKK3sKKyAgICByZXR1cm4gemZ3TWVtb3J5SXNFcXVhbChtMSwgbTIsIGxlbmd0aCk7Cit9CisjZW5kaWYKKwordThfdCB6ZlJ4QnVmZmVyRXF1YWxUb1N0cih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4X3QqIHN0ciwgdTE2X3Qgb2Zmc2V0LCB1MTZfdCBsZW5ndGgpCit7CisgICAgdTE2X3QgaTsKKyAgICB1OF90IGNoOworCisgICAgZm9yKGk9MDsgaTxsZW5ndGg7IGkrKykKKyAgICB7CisgICAgICAgIGNoID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0K2kpOworICAgICAgICBpZiAoIGNoICE9IHN0cltpXSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCit2b2lkIHpmVHhCdWZmZXJDb3B5KHpkZXZfdCpkZXYsIHpidWZfdCogZHN0LCB6YnVmX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgdTE2X3QgZHN0T2Zmc2V0LCB1MTZfdCBzcmNPZmZzZXQsIHUxNl90IGxlbmd0aCkKK3sKKyAgICB1MTZfdCBpOworCisgICAgZm9yKGk9MDsgaTxsZW5ndGg7IGkrKykKKyAgICB7CisgICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgZHN0LCBkc3RPZmZzZXQraSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgem13X3R4X2J1Zl9yZWFkYihkZXYsIHNyYywgc3JjT2Zmc2V0K2kpKTsKKyAgICB9Cit9CisKK3ZvaWQgemZSeEJ1ZmZlckNvcHkoemRldl90KmRldiwgemJ1Zl90KiBkc3QsIHpidWZfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICB1MTZfdCBkc3RPZmZzZXQsIHUxNl90IHNyY09mZnNldCwgdTE2X3QgbGVuZ3RoKQoreworICAgIHUxNl90IGk7CisKKyAgICBmb3IoaT0wOyBpPGxlbmd0aDsgaSsrKQorICAgIHsKKyAgICAgICAgem13X3J4X2J1Zl93cml0ZWIoZGV2LCBkc3QsIGRzdE9mZnNldCtpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgc3JjLCBzcmNPZmZzZXQraSkpOworICAgIH0KK30KKworCit2b2lkIHpmQ29sbGVjdEhXVGFsbHkoemRldl90KmRldiwgdTMyX3QqIHJzcCwgdThfdCBpZCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmIChpZCA9PSAwKQorICAgIHsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19VbmRlcnJ1bkNudCArPSAoMHhGRkZGICYgcnNwWzFdKTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19Ub3RhbFJ4RnJtICs9IHJzcFsyXTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19DUkMzMkNudCArPSByc3BbM107CisgICAgICAgIHdkLT5jb21tVGFsbHkuSHdfQ1JDMTZDbnQgKz0gcnNwWzRdOworICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX05BVElWRV9XSUZJCisgICAgICAgIC8qIFRoZXNlIGNvZGUgYXJlIGhlcmUgdG8gc2F0aXNmeSBWaXN0YSBEVE0gKi8KKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19EZWNyeXBFcnJfVU5JICs9ICgocnNwWzVdPjUwKSAmJiAocnNwWzVdPDYwKSk/NTA6cnNwWzVdOworICAgICAgICAjZWxzZQorICAgICAgICB3ZC0+Y29tbVRhbGx5Lkh3X0RlY3J5cEVycl9VTkkgKz0gcnNwWzVdOworICAgICAgICAjZW5kaWYKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19SeEZJRk9PdmVycnVuICs9IHJzcFs2XTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19EZWNyeXBFcnJfTXVsICs9IHJzcFs3XTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19SZXRyeUNudCArPSByc3BbOF07CisgICAgICAgIHdkLT5jb21tVGFsbHkuSHdfVG90YWxUeEZybSArPSByc3BbOV07CisgICAgICAgIHdkLT5jb21tVGFsbHkuSHdfUnhUaW1lT3V0ICs9cnNwWzEwXTsKKworICAgICAgICB3ZC0+Y29tbVRhbGx5LlR4X01QRFUgKz0gcnNwWzExXTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5CQV9GYWlsICs9IHJzcFsxMl07CisgICAgICAgIHdkLT5jb21tVGFsbHkuSHdfVHhfQU1QRFUgKz0gcnNwWzEzXTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19UeF9NUERVICs9IHJzcFsxNF07CisgICAgICAgIHdkLT5jb21tVGFsbHkuUmF0ZUN0cmxUeE1QRFUgKz0gcnNwWzExXTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5SYXRlQ3RybEJBRmFpbCArPSByc3BbMTJdOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3ZC0+Y29tbVRhbGx5Lkh3X1J4TVBEVSArPSByc3BbMV07CisgICAgICAgIHdkLT5jb21tVGFsbHkuSHdfUnhEcm9wTVBEVSArPSByc3BbMl07CisgICAgICAgIHdkLT5jb21tVGFsbHkuSHdfUnhEZWxNUERVICs9IHJzcFszXTsKKworICAgICAgICB3ZC0+Y29tbVRhbGx5Lkh3X1J4UGh5TWlzY0Vycm9yICs9IHJzcFs0XTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19SeFBoeVhSRXJyb3IgKz0gcnNwWzVdOworICAgICAgICB3ZC0+Y29tbVRhbGx5Lkh3X1J4UGh5T0ZETUVycm9yICs9IHJzcFs2XTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19SeFBoeUNDS0Vycm9yICs9IHJzcFs3XTsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5Id19SeFBoeUhURXJyb3IgKz0gcnNwWzhdOworICAgICAgICB3ZC0+Y29tbVRhbGx5Lkh3X1J4UGh5VG90YWxDb3VudCArPSByc3BbOV07CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmIChpZCA9PSAwKQorICAgIHsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAicnNwbGVuID0iLCByc3BbMF0pOworICAgICAgICB6bV9tc2cxX21tKFpNX0xWXzEsICJId19VbmRlcnJ1bkNudCAgICA9ICIsICgweEZGRkYgJiByc3BbMV0pKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfVG90YWxSeEZybSAgICAgPSAiLCByc3BbMl0pOworICAgICAgICB6bV9tc2cxX21tKFpNX0xWXzEsICJId19DUkMzMkNudCAgICAgICA9ICIsIHJzcFszXSk7CisgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X0NSQzE2Q250ICAgICAgID0gIiwgcnNwWzRdKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfRGVjcnlwRXJyX1VOSSAgPSAiLCByc3BbNV0pOworICAgICAgICB6bV9tc2cxX21tKFpNX0xWXzEsICJId19SeEZJRk9PdmVycnVuICA9ICIsIHJzcFs2XSk7CisgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X0RlY3J5cEVycl9NdWwgID0gIiwgcnNwWzddKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUmV0cnlDbnQgICAgICAgPSAiLCByc3BbOF0pOworICAgICAgICB6bV9tc2cxX21tKFpNX0xWXzEsICJId19Ub3RhbFR4RnJtICAgICA9ICIsIHJzcFs5XSk7CisgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X1J4VGltZU91dCAgICAgID0gIiwgcnNwWzEwXSk7CisgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIlR4X01QRFUgICAgICAgICAgID0gIiwgcnNwWzExXSk7CisgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkJBX0ZhaWwgICAgICAgICAgID0gIiwgcnNwWzEyXSk7CisgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X1R4X0FNUERVICAgICAgID0gIiwgcnNwWzEzXSk7CisgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X1R4X01QRFUgICAgICAgID0gIiwgcnNwWzE0XSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMSwgInJzcGxlbiAgICAgICAgICAgICA9ICIsIHJzcFswXSk7CisgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X1J4TVBEVSAgICAgICAgICA9ICIsICgweEZGRkYgJiByc3BbMV0pKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhEcm9wTVBEVSAgICAgID0gIiwgcnNwWzJdKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhEZWxNUERVICAgICAgID0gIiwgcnNwWzNdKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhQaHlNaXNjRXJyb3IgID0gIiwgcnNwWzRdKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhQaHlYUkVycm9yICAgID0gIiwgcnNwWzVdKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhQaHlPRkRNRXJyb3IgID0gIiwgcnNwWzZdKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhQaHlDQ0tFcnJvciAgID0gIiwgcnNwWzddKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhQaHlIVEVycm9yICAgID0gIiwgcnNwWzhdKTsKKyAgICAgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhQaHlUb3RhbENvdW50ID0gIiwgcnNwWzldKTsKKyAgICB9CisKK30KKworLyogVGltZXIgcmVsYXRlZCBmdW5jdGlvbnMgKi8KK3ZvaWQgemZUaW1lckluaXQoemRldl90KiBkZXYpCit7CisgICAgdThfdCAgIGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9kZWJ1Z19tc2cwKCIiKTsKKworICAgIHdkLT50aW1lckxpc3QuZnJlZUNvdW50ID0gWk1fTUFYX1RJTUVSX0NPVU5UOworICAgIHdkLT50aW1lckxpc3QuaGVhZCA9ICYod2QtPnRpbWVyTGlzdC5saXN0WzBdKTsKKyAgICB3ZC0+dGltZXJMaXN0LnRhaWwgPSAmKHdkLT50aW1lckxpc3QubGlzdFtaTV9NQVhfVElNRVJfQ09VTlQtMV0pOworICAgIHdkLT50aW1lckxpc3QuaGVhZC0+cHJlID0gTlVMTDsKKyAgICB3ZC0+dGltZXJMaXN0LmhlYWQtPm5leHQgPSAmKHdkLT50aW1lckxpc3QubGlzdFsxXSk7CisgICAgd2QtPnRpbWVyTGlzdC50YWlsLT5wcmUgPSAmKHdkLT50aW1lckxpc3QubGlzdFtaTV9NQVhfVElNRVJfQ09VTlQtMl0pOworICAgIHdkLT50aW1lckxpc3QudGFpbC0+bmV4dCA9IE5VTEw7CisKKyAgICBmb3IoIGk9MTsgaTwoWk1fTUFYX1RJTUVSX0NPVU5ULTEpOyBpKysgKQorICAgIHsKKyAgICAgICAgd2QtPnRpbWVyTGlzdC5saXN0W2ldLnByZSA9ICYod2QtPnRpbWVyTGlzdC5saXN0W2ktMV0pOworICAgICAgICB3ZC0+dGltZXJMaXN0Lmxpc3RbaV0ubmV4dCA9ICYod2QtPnRpbWVyTGlzdC5saXN0W2krMV0pOworICAgIH0KKworICAgIHdkLT5iVGltZXJSZWFkeSA9IFRSVUU7Cit9CisKKwordTE2X3QgemZUaW1lclNjaGVkdWxlKHpkZXZfdCogZGV2LCB1MTZfdCBldmVudCwgdTMyX3QgdGljaykKK3sKKyAgICBzdHJ1Y3QgenNUaW1lckVudHJ5ICpwRnJlZUVudHJ5OworICAgIHN0cnVjdCB6c1RpbWVyRW50cnkgKnBFbnRyeTsKKyAgICB1OF90ICAgaSwgY291bnQ7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoIHdkLT50aW1lckxpc3QuZnJlZUNvdW50ID09IDAgKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgibm8gbW9yZSB0aW1lciIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvL3ptX2RlYnVnX21zZzIoImV2ZW50ID0gIiwgZXZlbnQpOworICAgIC8vem1fZGVidWdfbXNnMSgidGFyZ2V0IHRpY2sgPSAiLCB3ZC0+dGljayArIHRpY2spOworCisgICAgY291bnQgPSBaTV9NQVhfVElNRVJfQ09VTlQgLSB3ZC0+dGltZXJMaXN0LmZyZWVDb3VudDsKKworICAgIGlmICggY291bnQgPT0gMCApCisgICAgeworICAgICAgICB3ZC0+dGltZXJMaXN0LmZyZWVDb3VudC0tOworICAgICAgICB3ZC0+dGltZXJMaXN0LmhlYWQtPmV2ZW50ID0gZXZlbnQ7CisgICAgICAgIHdkLT50aW1lckxpc3QuaGVhZC0+dGltZXIgPSB3ZC0+dGljayArIHRpY2s7CisgICAgICAgIC8vem1fZGVidWdfbXNnMSgiZnJlZSB0aW1lciBjb3VudCA9ICIsIHdkLT50aW1lckxpc3QuZnJlZUNvdW50KTsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwRnJlZUVudHJ5ID0gd2QtPnRpbWVyTGlzdC50YWlsOworICAgIHBGcmVlRW50cnktPnRpbWVyID0gd2QtPnRpY2sgKyB0aWNrOworICAgIHBGcmVlRW50cnktPmV2ZW50ID0gZXZlbnQ7CisgICAgd2QtPnRpbWVyTGlzdC50YWlsID0gcEZyZWVFbnRyeS0+cHJlOworICAgIHBFbnRyeSA9IHdkLT50aW1lckxpc3QuaGVhZDsKKworICAgIGZvciggaT0wOyBpPGNvdW50OyBpKysgKQorICAgIHsKKyAgICAgICAgLy8gcHJldmVudCBmcm9tIHRoZSBjYXNlIG9mIHRpY2sgb3ZlcmZsb3cKKyAgICAgICAgaWYgKCAoIHBFbnRyeS0+dGltZXIgPiBwRnJlZUVudHJ5LT50aW1lciApJiYKKyAgICAgICAgICAgICAoKHBFbnRyeS0+dGltZXIgLSBwRnJlZUVudHJ5LT50aW1lcikgPCAxMDAwMDAwMDAwKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggaSAhPSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRnJlZUVudHJ5LT5wcmUgPSBwRW50cnktPnByZTsKKyAgICAgICAgICAgICAgICBwRnJlZUVudHJ5LT5wcmUtPm5leHQgPSBwRnJlZUVudHJ5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBGcmVlRW50cnktPnByZSA9IE5VTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBFbnRyeS0+cHJlID0gcEZyZWVFbnRyeTsKKyAgICAgICAgICAgIHBGcmVlRW50cnktPm5leHQgPSBwRW50cnk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHBFbnRyeSA9IHBFbnRyeS0+bmV4dDsKKyAgICB9CisKKyAgICBpZiAoIGkgPT0gMCApCisgICAgeworICAgICAgICB3ZC0+dGltZXJMaXN0LmhlYWQgPSBwRnJlZUVudHJ5OworICAgIH0KKworICAgIGlmICggaSA9PSBjb3VudCApCisgICAgeworICAgICAgICBwRnJlZUVudHJ5LT5wcmUgPSBwRW50cnktPnByZTsKKyAgICAgICAgcEZyZWVFbnRyeS0+cHJlLT5uZXh0ID0gcEZyZWVFbnRyeTsKKyAgICAgICAgcEVudHJ5LT5wcmUgPSBwRnJlZUVudHJ5OworICAgICAgICBwRnJlZUVudHJ5LT5uZXh0ID0gcEVudHJ5OworICAgIH0KKworICAgIHdkLT50aW1lckxpc3QuZnJlZUNvdW50LS07CisgICAgLy96bV9kZWJ1Z19tc2cxKCJmcmVlIHRpbWVyIGNvdW50ID0gIiwgd2QtPnRpbWVyTGlzdC5mcmVlQ291bnQpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3UxNl90IHpmVGltZXJDYW5jZWwoemRldl90KiBkZXYsIHUxNl90IGV2ZW50KQoreworICAgIHN0cnVjdCB6c1RpbWVyRW50cnkgKnBFbnRyeTsKKyAgICB1OF90ICAgaSwgY291bnQ7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvL3ptX2RlYnVnX21zZzIoImV2ZW50ID0gIiwgZXZlbnQpOworICAgIC8vem1fZGVidWdfbXNnMSgiZnJlZSB0aW1lciBjb3VudChiKSA9ICIsIHdkLT50aW1lckxpc3QuZnJlZUNvdW50KTsKKworICAgIHBFbnRyeSA9IHdkLT50aW1lckxpc3QuaGVhZDsKKyAgICBjb3VudCA9IFpNX01BWF9USU1FUl9DT1VOVCAtIHdkLT50aW1lckxpc3QuZnJlZUNvdW50OworCisgICAgZm9yKCBpPTA7IGk8Y291bnQ7IGkrKyApCisgICAgeworICAgICAgICBpZiAoIHBFbnRyeS0+ZXZlbnQgPT0gZXZlbnQgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHBFbnRyeSA9PSB3ZC0+dGltZXJMaXN0LmhlYWQgKQorICAgICAgICAgICAgeyAgIC8qIHJlbW92ZSBoZWFkIGVudHJ5ICovCisgICAgICAgICAgICAgICAgd2QtPnRpbWVyTGlzdC5oZWFkID0gcEVudHJ5LT5uZXh0OworICAgICAgICAgICAgICAgIHdkLT50aW1lckxpc3QudGFpbC0+bmV4dCA9IHBFbnRyeTsKKyAgICAgICAgICAgICAgICBwRW50cnktPnByZSA9IHdkLT50aW1lckxpc3QudGFpbDsKKyAgICAgICAgICAgICAgICB3ZC0+dGltZXJMaXN0LnRhaWwgPSBwRW50cnk7CisgICAgICAgICAgICAgICAgcEVudHJ5ID0gd2QtPnRpbWVyTGlzdC5oZWFkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyAgIC8qIHJlbW92ZSBub24taGVhZCBlbnRyeSAqLworICAgICAgICAgICAgICAgIHBFbnRyeS0+cHJlLT5uZXh0ID0gcEVudHJ5LT5uZXh0OworICAgICAgICAgICAgICAgIHBFbnRyeS0+bmV4dC0+cHJlID0gcEVudHJ5LT5wcmU7CisgICAgICAgICAgICAgICAgd2QtPnRpbWVyTGlzdC50YWlsLT5uZXh0ID0gcEVudHJ5OworICAgICAgICAgICAgICAgIHBFbnRyeS0+cHJlID0gd2QtPnRpbWVyTGlzdC50YWlsOworICAgICAgICAgICAgICAgIHdkLT50aW1lckxpc3QudGFpbCA9IHBFbnRyeTsKKyAgICAgICAgICAgICAgICBwRW50cnkgPSBwRW50cnktPm5leHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdkLT50aW1lckxpc3QuZnJlZUNvdW50Kys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwRW50cnkgPSBwRW50cnktPm5leHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvL3ptX2RlYnVnX21zZzEoImZyZWUgdGltZXIgY291bnQoYSkgPSAiLCB3ZC0+dGltZXJMaXN0LmZyZWVDb3VudCk7CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCB6ZlRpbWVyQ2xlYXIoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnRpbWVyTGlzdC5mcmVlQ291bnQgPSBaTV9NQVhfVElNRVJfQ09VTlQ7Cit9CisKK3UxNl90IHpmVGltZXJDaGVja0FuZEhhbmRsZSh6ZGV2X3QqIGRldikKK3sKKyAgICBzdHJ1Y3QgenNUaW1lckVudHJ5ICpwRW50cnk7CisgICAgc3RydWN0IHpzVGltZXJFbnRyeSAqcFRoZUxhc3RFbnRyeSA9IE5VTEw7CisgICAgdTE2X3QgIGV2ZW50W1pNX01BWF9USU1FUl9DT1VOVF07CisgICAgdThfdCAgIGksIGo9MCwgY291bnQ7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgaWYgKCAhd2QtPmJUaW1lclJlYWR5ICkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBwRW50cnkgPSB3ZC0+dGltZXJMaXN0LmhlYWQ7CisgICAgY291bnQgPSBaTV9NQVhfVElNRVJfQ09VTlQgLSB3ZC0+dGltZXJMaXN0LmZyZWVDb3VudDsKKworICAgIGZvciggaT0wOyBpPGNvdW50OyBpKysgKQorICAgIHsKKyAgICAgICAgLy8gcHJldmVudCBmcm9tIHRoZSBjYXNlIG9mIHRpY2sgb3ZlcmZsb3cKKyAgICAgICAgaWYgKCAoIHBFbnRyeS0+dGltZXIgPiB3ZC0+dGljayApJiYKKyAgICAgICAgICAgICAoKHBFbnRyeS0+dGltZXIgLSB3ZC0+dGljaykgPCAxMDAwMDAwMDAwKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZXZlbnRbaisrXSA9IHBFbnRyeS0+ZXZlbnQ7CisgICAgICAgIHBUaGVMYXN0RW50cnkgPSBwRW50cnk7CisgICAgICAgIHBFbnRyeSA9IHBFbnRyeS0+bmV4dDsKKyAgICB9CisKKyAgICBpZiAoIGogPiAwICkKKyAgICB7CisgICAgICAgIHdkLT50aW1lckxpc3QudGFpbC0+bmV4dCA9IHdkLT50aW1lckxpc3QuaGVhZDsKKyAgICAgICAgd2QtPnRpbWVyTGlzdC5oZWFkLT5wcmUgPSB3ZC0+dGltZXJMaXN0LnRhaWw7CisgICAgICAgIHdkLT50aW1lckxpc3QuaGVhZCA9IHBFbnRyeTsKKyAgICAgICAgd2QtPnRpbWVyTGlzdC50YWlsID0gcFRoZUxhc3RFbnRyeTsKKyAgICAgICAgd2QtPnRpbWVyTGlzdC5mcmVlQ291bnQgKz0gajsKKyAgICAgICAgLy96bV9kZWJ1Z19tc2cxKCJmcmVlIHRpbWVyIGNvdW50ID0gIiwgd2QtPnRpbWVyTGlzdC5mcmVlQ291bnQpOworICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICB6ZlByb2Nlc3NFdmVudChkZXYsIGV2ZW50LCBqKTsKKworICAgIHJldHVybiAwOworfQorCit1MzJfdCB6ZkNvcmVTZXRLZXkoemRldl90KiBkZXYsIHU4X3QgdXNlciwgdThfdCBrZXlJZCwgdThfdCB0eXBlLAorICAgICAgICB1MTZfdCogbWFjLCB1MzJfdCoga2V5KQoreworICAgIHUzMl90IHJldDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB3ZC0+c3RhLmZsYWdLZXlDaGFuZ2luZysrOworICAgIHptX2RlYnVnX21zZzEoIiAgIHpmQ29yZVNldEtleSsrKysgIiwgd2QtPnN0YS5mbGFnS2V5Q2hhbmdpbmcpOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXQgPSB6ZkhwU2V0S2V5KGRldiwgdXNlciwga2V5SWQsIHR5cGUsIG1hYywga2V5KTsKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIHpmQ29yZVNldEtleUNvbXBsZXRlKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisjaWYgMAorICAgIHdkLT5zdGEuZmxhZ0tleUNoYW5naW5nID0gMDsKKyNlbHNlCisgICAgaWYod2QtPnN0YS5mbGFnS2V5Q2hhbmdpbmcpCisgICAgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB3ZC0+c3RhLmZsYWdLZXlDaGFuZ2luZy0tOworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIH0KKyNlbmRpZgorICAgIHptX2RlYnVnX21zZzEoIiAgemZDb3JlU2V0S2V5Q29tcGxldGUtLS0gIiwgd2QtPnN0YS5mbGFnS2V5Q2hhbmdpbmcpOworCisgICAgemZQdXNoVnR4cShkZXYpOworfQorCit2b2lkIHpmQ29yZUhhbEluaXRDb21wbGV0ZSh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgd2QtPmhhbFN0YXRlID0gWk1fSEFMX1NUQVRFX1JVTk5JTkc7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHpmUHVzaFZ0eHEoZGV2KTsKK30KKwordm9pZCB6ZkNvcmVNYWNBZGRyZXNzTm90aWZ5KHpkZXZfdCogZGV2LCB1OF90KiBhZGRyKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT5tYWNBZGRyWzBdID0gYWRkclswXSB8ICgodTE2X3QpYWRkclsxXTw8OCk7CisgICAgd2QtPm1hY0FkZHJbMV0gPSBhZGRyWzJdIHwgKCh1MTZfdClhZGRyWzNdPDw4KTsKKyAgICB3ZC0+bWFjQWRkclsyXSA9IGFkZHJbNF0gfCAoKHUxNl90KWFkZHJbNV08PDgpOworCisKKyAgICAvL3pmSHBTZXRNYWNBZGRyZXNzKGRldiwgd2QtPm1hY0FkZHIsIDApOworICAgIGlmICh3ZC0+emZjYk1hY0FkZHJlc3NOb3RpZnkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHdkLT56ZmNiTWFjQWRkcmVzc05vdGlmeShkZXYsIGFkZHIpOworICAgIH0KK30KKwordm9pZCB6ZkNvcmVTZXRJc29OYW1lKHpkZXZfdCogZGV2LCB1OF90KiBpc29OYW1lKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT53cy5jb3VudHJ5SXNvTmFtZVswXSA9IGlzb05hbWVbMF07CisgICAgd2QtPndzLmNvdW50cnlJc29OYW1lWzFdID0gaXNvTmFtZVsxXTsKKyAgICB3ZC0+d3MuY291bnRyeUlzb05hbWVbMl0gPSAnXDAnOworIH0KKworCitleHRlcm4gdm9pZCB6ZlNjYW5NZ3JTY2FuRXZlbnRTdGFydCh6ZGV2X3QqIGRldik7CitleHRlcm4gdThfdCB6ZlNjYW5NZ3JTY2FuRXZlbnRUaW1lb3V0KHpkZXZfdCogZGV2KTsKK2V4dGVybiB2b2lkIHpmU2Nhbk1nclNjYW5FdmVudFJldHJ5KHpkZXZfdCogZGV2KTsKKwordm9pZCB6ZlByb2Nlc3NFdmVudCh6ZGV2X3QqIGRldiwgdTE2X3QqIGV2ZW50QXJyYXksIHU4X3QgZXZlbnRDb3VudCkKK3sKKyAgICB1OF90IGksIGosIGJ5cGFzcyA9IEZBTFNFOworICAgIHUxNl90IGV2ZW50QnlwYXNzWzMyXTsKKyAgICB1OF90IGV2ZW50QnlwYXNzQ291bnQgPSAwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHpmWmVyb01lbW9yeSgodThfdCopIGV2ZW50QnlwYXNzLCA2NCk7CisKKyAgICBmb3IoIGk9MDsgaTxldmVudENvdW50OyBpKysgKQorICAgIHsKKyAgICAgICAgZm9yKCBqPTA7IGo8ZXZlbnRCeXBhc3NDb3VudDsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBldmVudEJ5cGFzc1tqXSA9PSBldmVudEFycmF5W2ldICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBieXBhc3MgPSBUUlVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCBieXBhc3MgKQorICAgICAgICB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCggZXZlbnRBcnJheVtpXSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgWk1fRVZFTlRfU0NBTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHpmU2Nhbk1nclNjYW5FdmVudFN0YXJ0KGRldik7CisgICAgICAgICAgICAgICAgICAgIGV2ZW50QnlwYXNzW2V2ZW50QnlwYXNzQ291bnQrK10gPSBaTV9FVkVOVF9JTl9TQ0FOOworICAgICAgICAgICAgICAgICAgICBldmVudEJ5cGFzc1tldmVudEJ5cGFzc0NvdW50KytdID0gWk1fRVZFTlRfVElNRU9VVF9TQ0FOOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBaTV9FVkVOVF9USU1FT1VUX1NDQU46CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1OF90IHJlczsKKworICAgICAgICAgICAgICAgICAgICByZXMgPSB6ZlNjYW5NZ3JTY2FuRXZlbnRUaW1lb3V0KGRldik7CisgICAgICAgICAgICAgICAgICAgIGlmICggcmVzID09IDAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBldmVudEJ5cGFzc1tldmVudEJ5cGFzc0NvdW50KytdID0gWk1fRVZFTlRfVElNRU9VVF9TQ0FOOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCByZXMgPT0gMSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50QnlwYXNzW2V2ZW50QnlwYXNzQ291bnQrK10gPSBaTV9FVkVOVF9JTl9TQ0FOOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFpNX0VWRU5UX0lCU1NfTU9OSVRPUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHpmU3RhSWJzc01vbml0b3JpbmcoZGV2LCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgWk1fRVZFTlRfSU5fU0NBTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHpmU2Nhbk1nclNjYW5FdmVudFJldHJ5KGRldik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFpNX0VWRU5UX0NNX1RJTUVSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgem1fbXNnMF9tbShaTV9MVl8wLCAiWk1fRVZFTlRfQ01fVElNRVIiKTsKKworICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLmNtTWljRmFpbHVyZUNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgWk1fRVZFTlRfQ01fRElTQ09OTkVDVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIlpNX0VWRU5UX0NNX0RJU0NPTk5FQ1QiKTsKKworICAgICAgICAgICAgICAgICAgICB6ZkNoYW5nZUFkYXB0ZXJTdGF0ZShkZXYsIFpNX1NUQV9TVEFURV9ESVNDT05ORUNUKTsKKworICAgICAgICAgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgICAgICAgICAvL3pmVGltZXJTY2hlZHVsZShkZXYsIFpNX0VWRU5UX0NNX0JMT0NLX1RJTUVSLAorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBaTV9USUNLX0NNX0JMT0NLX1RJTUVPVVQpOworCisgICAgICAgICAgICAgICAgICAgIC8qIFRpbWVyIFJlc29sdXRpb24gb24gV2luWFAgaXMgMTUvMTYgbXMgICovCisgICAgICAgICAgICAgICAgICAgIC8qIERlY3JlYXNlIFRpbWUgb2Zmc2V0IGZvciA8WFA+IENvdW50ZXIgTWVhc3VyZSAqLworICAgICAgICAgICAgICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCBaTV9FVkVOVF9DTV9CTE9DS19USU1FUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fVElDS19DTV9CTE9DS19USU1FT1VUIC0gWk1fVElDS19DTV9CTE9DS19USU1FT1VUX09GRlNFVCk7CisKKyAgICAgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5jbU1pY0ZhaWx1cmVDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgIC8vemZpV2xhbkRpc2FibGUoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgemZIcFJlc2V0S2V5Q2FjaGUoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT56ZmNiQ29ubmVjdE5vdGlmeSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+emZjYkNvbm5lY3ROb3RpZnkoZGV2LCBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9NSUNfRkFJTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5ic3NpZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgWk1fRVZFTlRfQ01fQkxPQ0tfVElNRVI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJaTV9FVkVOVF9DTV9CTE9DS19USU1FUiIpOworCisgICAgICAgICAgICAgICAgICAgIC8vem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5jbURpc2FsbG93U3NpZExlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmICggd2QtPnN0YS5iQXV0b1JlY29ubmVjdCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIlpNX0VWRU5UX0NNX0JMT0NLX1RJTUVSOmJBdXRvUmVjb25uZWN0IT0wIik7CisgICAgICAgICAgICAgICAgICAgICAgICB6ZlNjYW5NZ3JTY2FuU3RvcChkZXYsIFpNX1NDQU5fTUdSX1NDQU5fSU5URVJOQUwpOworICAgICAgICAgICAgICAgICAgICAgICAgemZTY2FuTWdyU2NhblN0YXJ0KGRldiwgWk1fU0NBTl9NR1JfU0NBTl9JTlRFUk5BTCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy96bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBaTV9FVkVOVF9USU1FT1VUX0FEREJBOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCF3ZC0+YWRkYmFDb21wbGV0ZSAmJiAod2QtPmFkZGJhQ291bnQgPCA1KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgemZBZ2dTZW5kQWRkYmFSZXF1ZXN0KGRldiwgd2QtPnN0YS5ic3NpZCwgMCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+YWRkYmFDb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgemZUaW1lclNjaGVkdWxlKGRldiwgWk1fRVZFTlRfVElNRU9VVF9BRERCQSwgMTAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHpmVGltZXJDYW5jZWwoZGV2LCBaTV9FVkVOVF9USU1FT1VUX0FEREJBKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9QRVJGT1JNQU5DRV9FVkFMVUFUSU9OCisgICAgICAgICAgICBjYXNlIFpNX0VWRU5UX1RJTUVPVVRfUEVSRk9STUFOQ0U6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6ZmlQZXJmb3JtYW5jZVJlZnJlc2goZGV2KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIGNhc2UgWk1fRVZFTlRfU0tJUF9DT1VOVEVSTUVBU1VSRToKKwkJCQkvL2VuYWJsZSB0aGUgQ291bnRlcm1lYXN1cmUKKwkJCQl7CisJCQkJCXptX2RlYnVnX21zZzAoIkNvdW50ZXJtZWFzdXJlIDogRW5hYmxlIE1JQyBDaGVjayAiKTsKKwkJCQkJd2QtPlRLSVBfR3JvdXBfS2V5Q2hhbmdpbmcgPSAweDA7CisJCQkJfQorCQkJCWJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIHpmQnNzSW5mb0NyZWF0ZSh6ZGV2X3QqIGRldikKK3sKKyAgICB1OF90ICAgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgd2QtPnN0YS5ic3NMaXN0LmJzc0NvdW50ID0gMDsKKyAgICB3ZC0+c3RhLmJzc0xpc3QuaGVhZCA9IE5VTEw7CisgICAgd2QtPnN0YS5ic3NMaXN0LnRhaWwgPSBOVUxMOworICAgIHdkLT5zdGEuYnNzSW5mb0FycmF5SGVhZCA9IDA7CisgICAgd2QtPnN0YS5ic3NJbmZvQXJyYXlUYWlsID0gMDsKKyAgICB3ZC0+c3RhLmJzc0luZm9GcmVlQ291bnQgPSBaTV9NQVhfQlNTOworCisgICAgZm9yKCBpPTA7IGk8IFpNX01BWF9CU1M7IGkrKyApCisgICAgeworICAgICAgICAvL3dkLT5zdGEuYnNzSW5mb0FycmF5W2ldID0gJih3ZC0+c3RhLmJzc0luZm9Qb29sW2ldKTsKKyAgICAgICAgd2QtPnN0YS5ic3NJbmZvQXJyYXlbaV0gPSB6ZndNZW1BbGxvY2F0ZShkZXYsIHNpemVvZihzdHJ1Y3QgenNCc3NJbmZvKSk7CisKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCit2b2lkIHpmQnNzSW5mb0Rlc3Ryb3koemRldl90KiBkZXYpCit7CisgICAgdThfdCAgIGk7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgemZCc3NJbmZvUmVmcmVzaChkZXYsIDEpOworCisgICAgZm9yKCBpPTA7IGk8IFpNX01BWF9CU1M7IGkrKyApCisgICAgeworICAgICAgICBpZiAod2QtPnN0YS5ic3NJbmZvQXJyYXlbaV0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgemZ3TWVtRnJlZShkZXYsIHdkLT5zdGEuYnNzSW5mb0FycmF5W2ldLCBzaXplb2Yoc3RydWN0IHpzQnNzSW5mbykpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fYXNzZXJ0KDApOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybjsKK30KKworc3RydWN0IHpzQnNzSW5mbyogemZCc3NJbmZvQWxsb2NhdGUoemRldl90KiBkZXYpCit7CisgICAgc3RydWN0IHpzQnNzSW5mbyogcEJzc0luZm87CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAod2QtPnN0YS5ic3NJbmZvRnJlZUNvdW50ID09IDApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcEJzc0luZm8gPSB3ZC0+c3RhLmJzc0luZm9BcnJheVt3ZC0+c3RhLmJzc0luZm9BcnJheUhlYWRdOworICAgIHdkLT5zdGEuYnNzSW5mb0FycmF5W3dkLT5zdGEuYnNzSW5mb0FycmF5SGVhZF0gPSBOVUxMOworICAgIHdkLT5zdGEuYnNzSW5mb0FycmF5SGVhZCA9ICh3ZC0+c3RhLmJzc0luZm9BcnJheUhlYWQgKyAxKSAmIChaTV9NQVhfQlNTIC0gMSk7CisgICAgd2QtPnN0YS5ic3NJbmZvRnJlZUNvdW50LS07CisKKyAgICB6Zlplcm9NZW1vcnkoKHU4X3QqKXBCc3NJbmZvLCBzaXplb2Yoc3RydWN0IHpzQnNzSW5mbykpOworCisgICAgcmV0dXJuIHBCc3NJbmZvOworfQorCit2b2lkIHpmQnNzSW5mb0ZyZWUoemRldl90KiBkZXYsIHN0cnVjdCB6c0Jzc0luZm8qIHBCc3NJbmZvKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptX2Fzc2VydCh3ZC0+c3RhLmJzc0luZm9BcnJheVt3ZC0+c3RhLmJzc0luZm9BcnJheVRhaWxdID09IE5VTEwpOworCisgICAgcEJzc0luZm8tPnNpZ25hbFN0cmVuZ3RoID0gcEJzc0luZm8tPnNpZ25hbFF1YWxpdHkgPSAwOworICAgIHBCc3NJbmZvLT5zb3J0VmFsdWUgPSAwOworCisgICAgd2QtPnN0YS5ic3NJbmZvQXJyYXlbd2QtPnN0YS5ic3NJbmZvQXJyYXlUYWlsXSA9IHBCc3NJbmZvOworICAgIHdkLT5zdGEuYnNzSW5mb0FycmF5VGFpbCA9ICh3ZC0+c3RhLmJzc0luZm9BcnJheVRhaWwgKyAxKSAmIChaTV9NQVhfQlNTIC0gMSk7CisgICAgd2QtPnN0YS5ic3NJbmZvRnJlZUNvdW50Kys7Cit9CisKK3ZvaWQgemZCc3NJbmZvUmVvcmRlckxpc3QoemRldl90KiBkZXYpCit7CisgICAgc3RydWN0IHpzQnNzSW5mbyogcEJzc0luZm8gPSBOVUxMOworICAgIHN0cnVjdCB6c0Jzc0luZm8qIHBJbnNCc3NJbmZvID0gTlVMTDsKKyAgICBzdHJ1Y3QgenNCc3NJbmZvKiBwTmV4dEJzc0luZm8gPSBOVUxMOworICAgIHN0cnVjdCB6c0Jzc0luZm8qIHBQcmVCc3NJbmZvID0gTlVMTDsKKyAgICB1OF90IGkgPSAwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAod2QtPnN0YS5ic3NMaXN0LmJzc0NvdW50ID4gMSkKKyAgICB7CisgICAgICAgIHBJbnNCc3NJbmZvID0gd2QtPnN0YS5ic3NMaXN0LmhlYWQ7CisgICAgICAgIHdkLT5zdGEuYnNzTGlzdC50YWlsID0gcEluc0Jzc0luZm87CisgICAgICAgIHBCc3NJbmZvID0gcEluc0Jzc0luZm8tPm5leHQ7CisgICAgICAgIHBJbnNCc3NJbmZvLT5uZXh0ID0gTlVMTDsKKyAgICAgICAgd2hpbGUgKHBCc3NJbmZvICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgd2hpbGUgKDEpCisgICAgICAgICAgICB7CisvLyAgICAgICAgICAgICAgICBpZiAocEJzc0luZm8tPnNpZ25hbFN0cmVuZ3RoID49IHBJbnNCc3NJbmZvLT5zaWduYWxTdHJlbmd0aCkKKyAgICAgICAgICAgICAgICBpZiggcEJzc0luZm8tPnNvcnRWYWx1ZSA+PSBwSW5zQnNzSW5mby0+c29ydFZhbHVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGk9PTApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vSW5zZXJ0IEJzc0luZm8gdG8gaGVhZAorICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5ic3NMaXN0LmhlYWQgPSBwQnNzSW5mbzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBOZXh0QnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPm5leHQgPSBwSW5zQnNzSW5mbzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9JbnNlcnQgQnNzSW5mbyB0byBuZWl0aGVyIGhlYWQgbm9yIHRhaWwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBQcmVCc3NJbmZvLT5uZXh0ID0gcEJzc0luZm87CisgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dEJzc0luZm8gPSBwQnNzSW5mby0+bmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5uZXh0ID0gcEluc0Jzc0luZm87CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocEluc0Jzc0luZm8tPm5leHQgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9TaWduYWwgc3RyZW5ndGggc21hbGxlciB0aGFuIGN1cnJlbnQgQnNzSW5mbywgY2hlY2sgbmV4dAorICAgICAgICAgICAgICAgICAgICAgICAgcFByZUJzc0luZm8gPSBwSW5zQnNzSW5mbzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBJbnNCc3NJbmZvID0gcEluc0Jzc0luZm8tPm5leHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL0luc2VydCBCc3NJbmZvIHRvIHRhaWwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBJbnNCc3NJbmZvLT5uZXh0ID0gcEJzc0luZm87CisgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dEJzc0luZm8gPSBwQnNzSW5mby0+bmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuYnNzTGlzdC50YWlsID0gcEJzc0luZm87CisgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+bmV4dCA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQnNzSW5mbyA9IHBOZXh0QnNzSW5mbzsKKyAgICAgICAgICAgIHBJbnNCc3NJbmZvID0gd2QtPnN0YS5ic3NMaXN0LmhlYWQ7CisgICAgICAgIH0KKyAgICB9IC8vaWYgKHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudCA+IDEpCisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCit2b2lkIHpmQnNzSW5mb0luc2VydFRvTGlzdCh6ZGV2X3QqIGRldiwgc3RydWN0IHpzQnNzSW5mbyogcEJzc0luZm8pCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem1fYXNzZXJ0KHBCc3NJbmZvKTsKKworICAgIC8vem1fZGVidWdfbXNnMigicEJzc0luZm8gPSAiLCBwQnNzSW5mbyk7CisKKyAgICBpZiAoIHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudCA9PSAwICkKKyAgICB7CisgICAgICAgIHdkLT5zdGEuYnNzTGlzdC5oZWFkID0gcEJzc0luZm87CisgICAgICAgIHdkLT5zdGEuYnNzTGlzdC50YWlsID0gcEJzc0luZm87CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHdkLT5zdGEuYnNzTGlzdC50YWlsLT5uZXh0ID0gcEJzc0luZm87CisgICAgICAgIHdkLT5zdGEuYnNzTGlzdC50YWlsID0gcEJzc0luZm87CisgICAgfQorCisgICAgcEJzc0luZm8tPm5leHQgPSBOVUxMOworICAgIHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudCsrOworCisgICAgLy96bV9kZWJ1Z19tc2cyKCJic3MgY291bnQgPSAiLCB3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQpOworfQorCit2b2lkIHpmQnNzSW5mb1JlbW92ZUZyb21MaXN0KHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNCc3NJbmZvKiBwQnNzSW5mbykKK3sKKyAgICBzdHJ1Y3QgenNCc3NJbmZvKiBwTm93QnNzSW5mbzsKKyAgICBzdHJ1Y3QgenNCc3NJbmZvKiBwUHJlQnNzSW5mbyA9IE5VTEw7CisgICAgdThfdCAgIGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9hc3NlcnQocEJzc0luZm8pOworICAgIHptX2Fzc2VydCh3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQpOworCisgICAgLy96bV9kZWJ1Z19tc2cyKCJwQnNzSW5mbyA9ICIsIHBCc3NJbmZvKTsKKworICAgIHBOb3dCc3NJbmZvID0gd2QtPnN0YS5ic3NMaXN0LmhlYWQ7CisKKyAgICBmb3IoIGk9MDsgaTx3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQ7IGkrKyApCisgICAgeworICAgICAgICBpZiAoIHBOb3dCc3NJbmZvID09IHBCc3NJbmZvICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBpID09IDAgKQorICAgICAgICAgICAgeyAgIC8qIHJlbW92ZSBoZWFkICovCisgICAgICAgICAgICAgICAgd2QtPnN0YS5ic3NMaXN0LmhlYWQgPSBwQnNzSW5mby0+bmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwUHJlQnNzSW5mby0+bmV4dCA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGkgPT0gKHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudCAtIDEpICkKKyAgICAgICAgICAgIHsgICAvKiByZW1vdmUgdGFpbCAqLworICAgICAgICAgICAgICAgIHdkLT5zdGEuYnNzTGlzdC50YWlsID0gcFByZUJzc0luZm87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcFByZUJzc0luZm8gPSBwTm93QnNzSW5mbzsKKyAgICAgICAgcE5vd0Jzc0luZm8gPSBwTm93QnNzSW5mby0+bmV4dDsKKyAgICB9CisKKyAgICB6bV9hc3NlcnQoaSAhPSB3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQpOworICAgIHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudC0tOworCisgICAgLy96bV9kZWJ1Z19tc2cyKCJic3MgY291bnQgPSAiLCB3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQpOworfQorCit2b2lkIHpmQnNzSW5mb1JlZnJlc2goemRldl90KiBkZXYsIHUxNl90IG1vZGUpCit7CisgICAgc3RydWN0IHpzQnNzSW5mbyogICBwQnNzSW5mbzsKKyAgICBzdHJ1Y3QgenNCc3NJbmZvKiAgIHBOZXh0QnNzSW5mbzsKKyAgICB1OF90ICAgaSwgYnNzQ291bnQ7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBwQnNzSW5mbyA9IHdkLT5zdGEuYnNzTGlzdC5oZWFkOworICAgIGJzc0NvdW50ID0gd2QtPnN0YS5ic3NMaXN0LmJzc0NvdW50OworCisgICAgZm9yKCBpPTA7IGk8YnNzQ291bnQ7IGkrKyApCisgICAgeworICAgICAgICBpZiAobW9kZSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICBwTmV4dEJzc0luZm8gPSBwQnNzSW5mby0+bmV4dDsKKyAgICAgICAgICAgIHpmQnNzSW5mb1JlbW92ZUZyb21MaXN0KGRldiwgcEJzc0luZm8pOworICAgICAgICAgICAgemZCc3NJbmZvRnJlZShkZXYsIHBCc3NJbmZvKTsKKyAgICAgICAgICAgIHBCc3NJbmZvID0gcE5leHRCc3NJbmZvOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBwQnNzSW5mby0+ZmxhZyAmIFpNX0JTU19JTkZPX1ZBTElEX0JJVCApCisgICAgICAgICAgICB7ICAgLyogdGhpcyBvbmUgbXVzdCBiZSBrZXB0ICovCisgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZsYWcgJj0gflpNX0JTU19JTkZPX1ZBTElEX0JJVDsKKyAgICAgICAgICAgICAgICBwQnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICNkZWZpbmUgWk1fQlNTX0NBQ0hFX1RJTUVfSU5fTVMgICAyMDAwMAorICAgICAgICAgICAgICAgIGlmICgod2QtPnRpY2sgLSBwQnNzSW5mby0+dGljaykgPiAoWk1fQlNTX0NBQ0hFX1RJTUVfSU5fTVMvWk1fTVNfUEVSX1RJQ0spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcE5leHRCc3NJbmZvID0gcEJzc0luZm8tPm5leHQ7CisgICAgICAgICAgICAgICAgICAgIHpmQnNzSW5mb1JlbW92ZUZyb21MaXN0KGRldiwgcEJzc0luZm8pOworICAgICAgICAgICAgICAgICAgICB6ZkJzc0luZm9GcmVlKGRldiwgcEJzc0luZm8pOworICAgICAgICAgICAgICAgICAgICBwQnNzSW5mbyA9IHBOZXh0QnNzSW5mbzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8gPSBwQnNzSW5mby0+bmV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IC8vZm9yKCBpPTA7IGk8YnNzQ291bnQ7IGkrKyApCisgICAgcmV0dXJuOworfQorCit2b2lkIHpmRHVtcFNTSUQodThfdCBsZW5ndGgsIHU4X3QgKnZhbHVlKQoreworICAgIHU4X3QgYnVmWzUwXTsKKyAgICB1OF90IHRtcExlbmd0aCA9IGxlbmd0aDsKKworICAgIGlmICggdG1wTGVuZ3RoID4gNDkgKQorICAgIHsKKyAgICAgICAgdG1wTGVuZ3RoID0gNDk7CisgICAgfQorCisgICAgemZNZW1vcnlDb3B5KGJ1ZiwgdmFsdWUsIHRtcExlbmd0aCk7CisgICAgYnVmW3RtcExlbmd0aF0gPSAnXDAnOworICAgIC8vcHJpbnRrKCJTU0lEOiAlc1xuIiwgYnVmKTsKKyAgICAvL3ptX2RlYnVnX21zZ19zKCJzc2lkID0gIiwgdmFsdWUpOworfQorCit2b2lkIHpmQ29yZVJlaW5pdCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+c3RhLmZsYWdLZXlDaGFuZ2luZyA9IDA7CisgICAgd2QtPnN0YS5mbGFnRnJlcUNoYW5naW5nID0gMDsKK30KKwordm9pZCB6ZkdlbmVyYXRlUmFuZG9tQlNTSUQoemRldl90KiBkZXYsIHU4X3QgKk1BQ0FkZHIsIHU4X3QgKkJTU0lEKQoreworICAgIC8vVUxPTkdMT05HICAgdGltZTsKKyAgICB1MzJfdCB0aW1lOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgdGltZSA9IHdkLT50aWNrOworCisgICAgLy8KKyAgICAvLyBJbml0aWFsaXplIHRoZSByYW5kb20gQlNTSUQgdG8gYmUgdGhlIHNhbWUgYXMgTUFDIGFkZHJlc3MuCisgICAgLy8KKworICAgIC8vIFJ0bENvcHlNZW1vcnkoQlNTSUQsIE1BQ0FkZHIsIHNpemVvZihET1QxMV9NQUNfQUREUkVTUykpOworICAgIHpmTWVtb3J5Q29weShCU1NJRCwgTUFDQWRkciwgNik7CisKKyAgICAvLworICAgIC8vIEdldCB0aGUgc3lzdGVtIHRpbWUgaW4gMTAgbWlsbGlzZWNvbmQuCisgICAgLy8KKworICAgIC8vIE5kaXNHZXRDdXJyZW50U3lzdGVtVGltZSgoUExBUkdFX0lOVEVHRVIpJnRpbWUpOworICAgIC8vIHRpbWUgLz0gMTAwMDAwOworCisgICAgLy8KKyAgICAvLyBSYW5kb21pemUgdGhlIGZpcnN0IDQgYnl0ZXMgb2YgQlNTSUQuCisgICAgLy8KKworICAgIEJTU0lEWzBdIF49ICh1OF90KSh0aW1lICYgMHhmZik7CisgICAgQlNTSURbMF0gJj0gfjB4MDE7ICAgICAgICAgICAgICAvLyBUdXJuIG9mZiBtdWx0aWNhc3QgYml0CisgICAgQlNTSURbMF0gfD0gMHgwMjsgICAgICAgICAgICAgICAvLyBUdXJuIG9uIGxvY2FsIGJpdAorCisgICAgdGltZSA+Pj0gODsKKyAgICBCU1NJRFsxXSBePSAodThfdCkodGltZSAmIDB4ZmYpOworCisgICAgdGltZSA+Pj0gODsKKyAgICBCU1NJRFsyXSBePSAodThfdCkodGltZSAmIDB4ZmYpOworCisgICAgdGltZSA+Pj0gODsKKyAgICBCU1NJRFszXSBePSAodThfdCkodGltZSAmIDB4ZmYpOworfQorCit1OF90IHpmaVdsYW5HZXREZXN0QWRkckZyb21CdWYoemRldl90ICpkZXYsIHpidWZfdCAqYnVmLCB1MTZfdCAqbWFjQWRkcikKK3sKKyNpZmRlZiBaTV9FTkFCTEVfTkFUSVZFX1dJRkkKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICB7CisgICAgICAgIC8qIERBICovCisgICAgICAgIG1hY0FkZHJbMF0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAxNik7CisgICAgICAgIG1hY0FkZHJbMV0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAxOCk7CisgICAgICAgIG1hY0FkZHJbMl0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAyMCk7CisgICAgfQorICAgIGVsc2UgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTICkKKyAgICB7CisgICAgICAgIC8qIERBICovCisgICAgICAgIG1hY0FkZHJbMF0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCA0KTsKKyAgICAgICAgbWFjQWRkclsxXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDYpOworICAgICAgICBtYWNBZGRyWzJdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgOCk7CisgICAgfQorICAgIGVsc2UgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCApCisgICAgeworICAgICAgICAvKiBEQSAqLworICAgICAgICBtYWNBZGRyWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNCk7CisgICAgICAgIG1hY0FkZHJbMV0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCA2KTsKKyAgICAgICAgbWFjQWRkclsyXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisjZWxzZQorICAgIC8qIERBICovCisgICAgbWFjQWRkclswXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDApOworICAgIG1hY0FkZHJbMV0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAyKTsKKyAgICBtYWNBZGRyWzJdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNCk7CisjZW5kaWYKKworICAgIHJldHVybiAwOworfQorCisvKiBMZWF2ZSBhbiBlbXB0eSBsaW5lIGJlbG93IHRvIHJlbW92ZSB3YXJuaW5nIG1lc3NhZ2Ugb24gc29tZSBjb21waWxlciAqLworCit1MTZfdCB6ZkZpbmRDbGVhbkZyZXF1ZW5jeSh6ZGV2X3QqIGRldiwgdTMyX3QgYWRob2NNb2RlKQoreworICAgIHU4X3QgICBpLCBqOworICAgIHUxNl90ICByZXR1cm5DaGFubmVsOworICAgIHUxNl90ICBjb3VudF8yNEcgPSAwLCBtaW4yNEdJbmRleCA9IDA7CisgICAgdTE2X3QgIGNvdW50XzVHID0gMCwgIG1pbjVHSW5kZXggPSAwOworICAgIHUxNl90ICBDb21iaW5hdGlvbkJzc051bWJlckluMjRHWzE1XSA9IHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH07CisgICAgdTE2X3QgIEJzc051bWJlckluMjRHWzE3XSAgPSB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfTsKKyAgICB1MTZfdCAgQXJyYXlfMjRHWzE1XSAgICAgICA9IHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH07CisgICAgdTE2X3QgIEJzc051bWJlckluNUdbMzFdICAgPSB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH07CisgICAgdTE2X3QgIEFycmF5XzVHWzMxXSAgICAgICAgPSB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH07CisgICAgc3RydWN0IHpzQnNzSW5mbyogcEJzc0luZm87CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoKHBCc3NJbmZvID0gd2QtPnN0YS5ic3NMaXN0LmhlYWQpID09IE5VTEwpCisgICAgeworICAgICAgICBpZiggYWRob2NNb2RlID09IFpNX0FESE9DQkFORF9CIHx8IGFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfRyB8fAorICAgICAgICAgICAgYWRob2NNb2RlID09IFpNX0FESE9DQkFORF9CRyB8fCBhZGhvY01vZGUgPT0gWk1fQURIT0NCQU5EX0FCRyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybkNoYW5uZWwgPSB6ZkNoR2V0Rmlyc3QyR2h6Q2hhbm5lbChkZXYpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuQ2hhbm5lbCA9IHpmQ2hHZXRGaXJzdDVHaHpDaGFubmVsKGRldik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0dXJuQ2hhbm5lbDsKKyAgICB9CisKKyAgICAvKiAjMSBHZXQgQWxsb3dlZCBDaGFubmVsIGZvbGxvd2luZyBDb3VudHJ5IENvZGUgISAqLworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsIDwgMzAwMCkKKyAgICAgICAgeyAvLyAyLjRHSHoKKyAgICAgICAgICAgIEFycmF5XzI0R1tjb3VudF8yNEddID0gd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbDsKKyAgICAgICAgICAgIGNvdW50XzI0RysrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAvLyA1R0h6CisgICAgICAgICAgICBjb3VudF81RysrOworICAgICAgICAgICAgQXJyYXlfNUdbaV0gPSB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsOworICAgICAgICB9CisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICB3aGlsZSggcEJzc0luZm8gIT0gTlVMTCApCisgICAgeworICAgICAgICAvKiAjMl8xIENvdW50IEJTUyBudW1iZXIgaW4gc29tZSBzcGVjaWZpY2VkIGZyZXF1ZW5jeSBpbiAyLjRHSHogYmFuZCAhICovCisgICAgICAgIGlmKCBhZGhvY01vZGUgPT0gWk1fQURIT0NCQU5EX0IgfHwgYWRob2NNb2RlID09IFpNX0FESE9DQkFORF9HIHx8CisgICAgICAgICAgICBhZGhvY01vZGUgPT0gWk1fQURIT0NCQU5EX0JHIHx8IGFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfQUJHICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBpPTA7IGk8PShjb3VudF8yNEcrMyk7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIHBCc3NJbmZvLT5mcmVxdWVuY3kgPT0gQXJyYXlfMjRHW2ldICkKKyAgICAgICAgICAgICAgICB7IC8vIEFycmF5XzI0R1swXSBjb3JyZXNwb25kIHRvIEJzc051bWJlckluMjRHWzJdCisgICAgICAgICAgICAgICAgICAgIEJzc051bWJlckluMjRHW3BCc3NJbmZvLT5jaGFubmVsKzFdKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogIzJfMiBDb3VudCBCU1MgbnVtYmVyIGluIHNvbWUgc3BlY2lmaWNlZCBmcmVxdWVuY3kgaW4gNUdIeiBiYW5kICEgKi8KKyAgICAgICAgaWYoIGFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfQSB8fCBhZGhvY01vZGUgPT0gWk1fQURIT0NCQU5EX0FCRyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaT0wOyBpPGNvdW50XzVHOyBpKysgKQorICAgICAgICAgICAgeyAvLyA1R0h6IGNoYW5uZWwgaXMgbm90IGVxdWFsIHRvIGFycmF5IGluZGV4CisgICAgICAgICAgICAgICAgaWYoIHBCc3NJbmZvLT5mcmVxdWVuY3kgPT0gQXJyYXlfNUdbaV0gKQorICAgICAgICAgICAgICAgIHsgLy8gQXJyYXlfNUdbMF0gY29ycmVzcG9uZCB0byBCc3NOdW1iZXJJbjVHWzBdCisgICAgICAgICAgICAgICAgICAgIEJzc051bWJlckluNUdbaV0rKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwQnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgIH0KKworI2lmIDAKKyAgICBmb3IoaT0wOyBpPD0oY291bnRfMjRHKzMpOyBpKyspCisgICAgeworICAgICAgICBwcmludGsoIjIuNEdIeiBCZWZvcmUgY29tYmluLCAlZCBCU1MgbmV0d29yayA6ICVkIiwgaSwgQnNzTnVtYmVySW4yNEdbaV0pOworICAgIH0KKworICAgIGZvcihpPTA7IGk8Y291bnRfNUc7IGkrKykKKyAgICB7CisgICAgICAgIHByaW50aygiNUdIeiBCZWZvcmUgY29tYmluLCAlZCBCU1MgbmV0d29yayA6ICVkIiwgaSwgQnNzTnVtYmVySW41R1tpXSk7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiggYWRob2NNb2RlID09IFpNX0FESE9DQkFORF9CIHx8IGFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfRyB8fAorICAgICAgICBhZGhvY01vZGUgPT0gWk1fQURIT0NCQU5EX0JHIHx8IGFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfQUJHICkKKyAgICB7CisgICAgICAgIC8qICMzXzEgQ291bnQgQlNTIG51bWJlciB0aGF0IGluZmx1ZW5jZSB0aGUgc3BlY2lmaWNlZCBmcmVxdWVuY3kgaW4gMi40R0h6ICEgKi8KKyAgICAgICAgZm9yKCBqPTA7IGo8Y291bnRfMjRHOyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBDb21iaW5hdGlvbkJzc051bWJlckluMjRHW2pdID0gQnNzTnVtYmVySW4yNEdbal0gICArIEJzc051bWJlckluMjRHW2orMV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJzc051bWJlckluMjRHW2orMl0gKyBCc3NOdW1iZXJJbjI0R1tqKzNdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCc3NOdW1iZXJJbjI0R1tqKzRdOworICAgICAgICAgICAgLy9wcmludGsoIkFmdGVyIGNvbWJpbmUsIHRoZSBudW1iZXIgb2YgQlNTIG5ldHdvcmsgY2hhbm5lbCAlZCBpcyAlZCIsCisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiAsIENvbWJpbmF0aW9uQnNzTnVtYmVySW4yNEdbal0pOworICAgICAgICB9CisKKyAgICAgICAgLyogIzRfMSBGaW5kIHRoZSBsZXNzIHV0aWxpemVkIGZyZXF1ZW5jeSBpbiAyLjRHSHogYmFuZCAhICovCisgICAgICAgIG1pbjI0R0luZGV4ID0gemZGaW5kTWluaW11bVV0aWxpemF0aW9uQ2hhbm5lbEluZGV4KGRldiwgQ29tYmluYXRpb25Cc3NOdW1iZXJJbjI0RywgY291bnRfMjRHKTsKKyAgICB9CisKKyAgICAvKiAjNF8yIEZpbmQgdGhlIGxlc3MgdXRpbGl6ZWQgZnJlcXVlbmN5IGluIDVHSHogYmFuZCAhICovCisgICAgaWYoIGFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfQSB8fCBhZGhvY01vZGUgPT0gWk1fQURIT0NCQU5EX0FCRyApCisgICAgeworICAgICAgICBtaW41R0luZGV4ID0gemZGaW5kTWluaW11bVV0aWxpemF0aW9uQ2hhbm5lbEluZGV4KGRldiwgQnNzTnVtYmVySW41RywgY291bnRfNUcpOworICAgIH0KKworICAgIGlmKCBhZGhvY01vZGUgPT0gWk1fQURIT0NCQU5EX0IgfHwgYWRob2NNb2RlID09IFpNX0FESE9DQkFORF9HIHx8IGFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfQkcgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFycmF5XzI0R1ttaW4yNEdJbmRleF07CisgICAgfQorICAgIGVsc2UgaWYoIGFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfQSApCisgICAgeworICAgICAgICByZXR1cm4gQXJyYXlfNUdbbWluNUdJbmRleF07CisgICAgfQorICAgIGVsc2UgaWYoIGFkaG9jTW9kZSA9PSBaTV9BREhPQ0JBTkRfQUJHICkKKyAgICB7CisgICAgICAgIGlmICggQ29tYmluYXRpb25Cc3NOdW1iZXJJbjI0R1ttaW4yNEdJbmRleF0gPD0gQnNzTnVtYmVySW41R1ttaW41R0luZGV4XSApCisgICAgICAgICAgICByZXR1cm4gQXJyYXlfMjRHW21pbjI0R0luZGV4XTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIEFycmF5XzVHW21pbjVHSW5kZXhdOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiAyNDEyOworfQorCit1MTZfdCB6ZkZpbmRNaW5pbXVtVXRpbGl6YXRpb25DaGFubmVsSW5kZXgoemRldl90KiBkZXYsIHUxNl90KiBhcnJheSwgdTE2X3QgY291bnQpCit7CisgICAgdThfdCAgIGk7CisgICAgdTE2X3QgIHRlbXBNaW5JbmRleCwgdGVtcE1pblZhbHVlOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaSA9IDE7CisgICAgdGVtcE1pbkluZGV4ID0gMDsKKyAgICB0ZW1wTWluVmFsdWUgPSBhcnJheVt0ZW1wTWluSW5kZXhdOworICAgIHdoaWxlKCBpPCBjb3VudCApCisgICAgeworICAgICAgICBpZiggYXJyYXlbaV0gPCB0ZW1wTWluVmFsdWUgKQorICAgICAgICB7CisgICAgICAgICAgICB0ZW1wTWluVmFsdWUgPSBhcnJheVtpXTsKKyAgICAgICAgICAgIHRlbXBNaW5JbmRleCA9IGk7CisgICAgICAgIH0KKyAgICAgICAgaSsrOworICAgIH0KKworICAgIHJldHVybiB0ZW1wTWluSW5kZXg7Cit9CisKK3U4X3QgemZDb21wYXJlV2l0aEJzc2lkKHpkZXZfdCogZGV2LCB1MTZfdCogYnNzaWQpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCB6Zk1lbW9yeUlzRXF1YWwoKHU4X3QqKWJzc2lkLCAodThfdCopd2QtPnN0YS5ic3NpZCwgNikgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jZnVuYy5oIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NmdW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM3NTQ4YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jZnVuYy5oCkBAIC0wLDAgKzEsNDQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kdWxlIE5hbWUgOiBmdW5jX2V4dHIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGZ1bmN0aW9uIHByb3RvdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0NGVU5DX0gKKyNkZWZpbmUgX0NGVU5DX0gKKworI2luY2x1ZGUgInF1ZXVlLmgiCisKKy8qIGFtc2R1LmMgKi8KK3ZvaWQgemZEZUFtc2R1KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgdmFwLCB1OF90IGVuY3J5TW9kZSk7CisKKy8qIGNzY2FubWdyLmMgKi8KK3ZvaWQgemZTY2FuTWdySW5pdCh6ZGV2X3QqIGRldik7Cit1OF90IHpmU2Nhbk1nclNjYW5TdGFydCh6ZGV2X3QqIGRldiwgdThfdCBzY2FuVHlwZSk7Cit2b2lkIHpmU2Nhbk1nclNjYW5TdG9wKHpkZXZfdCogZGV2LCB1OF90IHNjYW5UeXBlKTsKK3ZvaWQgemZTY2FuTWdyU2NhbkFjayh6ZGV2X3QqIGRldik7CisKKy8qIGNwc21nci5jICovCit2b2lkIHpmUG93ZXJTYXZpbmdNZ3JJbml0KHpkZXZfdCogZGV2KTsKK3ZvaWQgemZQb3dlclNhdmluZ01nclNldE1vZGUoemRldl90KiBkZXYsIHU4X3QgbW9kZSk7Cit2b2lkIHpmUG93ZXJTYXZpbmdNZ3JNYWluKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZQb3dlclNhdmluZ01ncldha2V1cCh6ZGV2X3QqIGRldik7Cit1OF90IHpmUG93ZXJTYXZpbmdNZ3JJc1NsZWVwaW5nKHpkZXZfdCAqZGV2KTsKK3ZvaWQgemZQb3dlclNhdmluZ01nclByb2Nlc3NCZWFjb24oemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3ZvaWQgemZQb3dlclNhdmluZ01nckF0aW1XaW5FeHBpcmVkKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZQb3dlclNhdmluZ01nckNvbm5lY3ROb3RpZnkoemRldl90ICpkZXYpOwordm9pZCB6ZlBvd2VyU2F2aW5nTWdyUHJlVEJUVEludGVycnVwdCh6ZGV2X3QgKmRldik7CisKKy8qIGNjbWQuYyAqLwordTE2X3QgemZXbGFuRW5hYmxlKHpkZXZfdCogZGV2KTsKKworLyogY2Z1bmMuYyAqLwordThfdCB6ZlF1ZXJ5T3Bwb3NpdGVSYXRlKHpkZXZfdCogZGV2LCB1OF90IGRzdF9tYWNbNl0sIHU4X3QgZnJhbWVUeXBlKTsKK3ZvaWQgemZDb3B5VG9JbnRUeEJ1ZmZlcih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBvZmZzZXQsIHUxNl90IGxlbmd0aCk7Cit2b2lkIHpmQ29weVRvUnhCdWZmZXIoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgdTE2X3Qgb2Zmc2V0LCB1MTZfdCBsZW5ndGgpOwordm9pZCB6ZkNvcHlGcm9tSW50VHhCdWZmZXIoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBvZmZzZXQsIHUxNl90IGxlbmd0aCk7Cit2b2lkIHpmQ29weUZyb21SeEJ1ZmZlcih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90IG9mZnNldCwgdTE2X3QgbGVuZ3RoKTsKK3ZvaWQgemZNZW1vcnlDb3B5KHU4X3QqIGRzdCwgdThfdCogc3JjLCB1MTZfdCBsZW5ndGgpOwordm9pZCB6Zk1lbW9yeU1vdmUodThfdCogZHN0LCB1OF90KiBzcmMsIHUxNl90IGxlbmd0aCk7Cit2b2lkIHpmWmVyb01lbW9yeSh1OF90KiB2YSwgdTE2X3QgbGVuZ3RoKTsKK3U4X3QgemZNZW1vcnlJc0VxdWFsKHU4X3QqIG0xLCB1OF90KiBtMiwgdTE2X3QgbGVuZ3RoKTsKK3U4X3QgemZSeEJ1ZmZlckVxdWFsVG9TdHIoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBjb25zdCB1OF90KiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90IG9mZnNldCwgdTE2X3QgbGVuZ3RoKTsKK3ZvaWQgemZUeEJ1ZmZlckNvcHkoemRldl90KmRldiwgemJ1Zl90KiBkc3QsIHpidWZfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICB1MTZfdCBkc3RPZmZzZXQsIHUxNl90IHNyY09mZnNldCwgdTE2X3QgbGVuZ3RoKTsKK3ZvaWQgemZSeEJ1ZmZlckNvcHkoemRldl90KmRldiwgemJ1Zl90KiBkc3QsIHpidWZfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICB1MTZfdCBkc3RPZmZzZXQsIHUxNl90IHNyY09mZnNldCwgdTE2X3QgbGVuZ3RoKTsKKwordm9pZCB6ZkNvbGxlY3RIV1RhbGx5KHpkZXZfdCpkZXYsIHUzMl90KiByc3AsIHU4X3QgaWQpOwordm9pZCB6ZlRpbWVySW5pdCh6ZGV2X3QqIGRldik7Cit1MTZfdCB6ZlRpbWVyU2NoZWR1bGUoemRldl90KiBkZXYsIHUxNl90IGV2ZW50LCB1MzJfdCB0aWNrKTsKK3UxNl90IHpmVGltZXJDYW5jZWwoemRldl90KiBkZXYsIHUxNl90IGV2ZW50KTsKK3ZvaWQgemZUaW1lckNsZWFyKHpkZXZfdCogZGV2KTsKK3UxNl90IHpmVGltZXJDaGVja0FuZEhhbmRsZSh6ZGV2X3QqIGRldik7Cit2b2lkIHpmUHJvY2Vzc0V2ZW50KHpkZXZfdCogZGV2LCB1MTZfdCogZXZlbnRBcnJheSwgdThfdCBldmVudENvdW50KTsKKwordm9pZCB6ZkJzc0luZm9DcmVhdGUoemRldl90KiBkZXYpOwordm9pZCB6ZkJzc0luZm9EZXN0cm95KHpkZXZfdCogZGV2KTsKKworc3RydWN0IHpzQnNzSW5mbyogemZCc3NJbmZvQWxsb2NhdGUoemRldl90KiBkZXYpOwordm9pZCB6ZkJzc0luZm9GcmVlKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNCc3NJbmZvKiBwQnNzSW5mbyk7Cit2b2lkIHpmQnNzSW5mb1Jlb3JkZXJMaXN0KHpkZXZfdCogZGV2KTsKK3ZvaWQgemZCc3NJbmZvSW5zZXJ0VG9MaXN0KHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNCc3NJbmZvKiBwQnNzSW5mbyk7Cit2b2lkIHpmQnNzSW5mb1JlbW92ZUZyb21MaXN0KHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNCc3NJbmZvKiBwQnNzSW5mbyk7Cit2b2lkIHpmQnNzSW5mb1JlZnJlc2goemRldl90KiBkZXYsIHUxNl90IG1vZGUpOwordm9pZCB6ZkNvcmVTZXRGcmVxdWVuY3lDb21wbGV0ZSh6ZGV2X3QqIGRldik7Cit2b2lkIHpmQ29yZVNldEZyZXF1ZW5jeSh6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcXVlbmN5KTsKK3ZvaWQgemZDb3JlU2V0RnJlcXVlbmN5VjIoemRldl90KiBkZXYsIHUxNl90IGZyZXF1ZW5jeSwKKyAgICAgICAgemZwRnJlcUNoYW5nZUNvbXBsZXRlQ2IgY2IpOwordm9pZCB6ZkNvcmVTZXRGcmVxdWVuY3lFeCh6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcXVlbmN5LCB1OF90IGJ3NDAsCisgICAgICAgIHU4X3QgZXh0T2Zmc2V0LCB6ZnBGcmVxQ2hhbmdlQ29tcGxldGVDYiBjYik7Cit2b2lkIHpmQ29yZVNldEZyZXF1ZW5jeUV4VjIoemRldl90KiBkZXYsIHUxNl90IGZyZXF1ZW5jeSwgdThfdCBidzQwLAorICAgICAgICB1OF90IGV4dE9mZnNldCwgemZwRnJlcUNoYW5nZUNvbXBsZXRlQ2IgY2IsIHU4X3QgZm9yY2VTZXRGcmVxKTsKK3ZvaWQgemZSZVNldEN1cnJlbnRGcmVxdWVuY3koemRldl90KiBkZXYpOwordTMyX3QgemZDb3JlU2V0S2V5KHpkZXZfdCogZGV2LCB1OF90IHVzZXIsIHU4X3Qga2V5SWQsIHU4X3QgdHlwZSwKKyAgICAgICAgdTE2X3QqIG1hYywgdTMyX3QqIGtleSk7Cit2b2lkIHpmQ29yZVNldEtleUNvbXBsZXRlKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZDb3JlUmVpbml0KHpkZXZfdCogZGV2KTsKK3ZvaWQgemZDb3JlTWFjQWRkcmVzc05vdGlmeSh6ZGV2X3QqIGRldiwgdThfdCAqYWRkcik7Cit2b2lkIHpmQ29yZVNldElzb05hbWUoemRldl90KiBkZXYsIHU4X3QqIGlzb05hbWUpOwordm9pZCB6ZkdlbmVyYXRlUmFuZG9tQlNTSUQoemRldl90KiBkZXYsIHU4X3QgKk1BQ0FkZHIsIHU4X3QgKkJTU0lEKTsKK3ZvaWQgemZDb3JlSGFsSW5pdENvbXBsZXRlKHpkZXZfdCogZGV2KTsKKwordTE2X3QgemZGaW5kQ2xlYW5GcmVxdWVuY3koemRldl90KiBkZXYsIHUzMl90IGFkaG9jTW9kZSk7Cit1MTZfdCB6ZkZpbmRNaW5pbXVtVXRpbGl6YXRpb25DaGFubmVsSW5kZXgoemRldl90KiBkZXYsIHUxNl90KiBhcnJheSwgdTE2X3QgY291bnQpOwordThfdCB6ZkNvbXBhcmVXaXRoQnNzaWQoemRldl90KiBkZXYsIHUxNl90KiBic3NpZCk7CisKKy8qIGNoYi5jICovCit2b2lkIHpmRHVtcEJzc0xpc3QoemRldl90KiBkZXYpOworCisKK3UxNl90IHpmSXNzdWVDbWQoemRldl90KiBkZXYsIHUzMl90KiBjbWQsIHUxNl90IGNtZExlbiwgdTE2X3Qgc3JjLCB1OF90KiBidWYpOworCisKKy8qIGNpYy5jICovCit2b2lkIHpmVXBkYXRlQnNzaWQoemRldl90KiBkZXYsIHU4X3QqIGJzc2lkKTsKK3ZvaWQgemZSZXNldFN1cHBvcnRSYXRlKHpkZXZfdCogZGV2LCB1OF90IHR5cGUpOwordm9pZCB6ZlVwZGF0ZVN1cHBvcnRSYXRlKHpkZXZfdCogZGV2LCB1OF90KiByYXRlQXJyYXkpOwordThfdCB6ZklzR09ubHlNb2RlKHpkZXZfdCogZGV2LCB1MTZfdCAgZnJlcXVlbmN5LCB1OF90KiByYXRlQXJyYXkpOwordm9pZCB6ZkdhdGhlckJNb2RlKHpkZXZfdCogZGV2LCB1OF90KiByYXRlQXJyYXksIHU4X3QqIGV4dHJhdGVBcnJheSk7Cit1OF90IHpmUFNEZXZpY2VTbGVlcCh6ZGV2X3QqIGRldik7Cit1MTZfdCB6ZkdldFJhbmRvbU51bWJlcih6ZGV2X3QqIGRldiwgdTE2X3QgaW5pdFZhbHVlKTsKK3ZvaWQgemZDb3JlRXZlbnQoemRldl90KiBkZXYsIHUxNl90IGV2ZW50LCB1OF90KiByc3ApOwordm9pZCB6ZkJlYWNvbkNmZ0ludGVycnVwdCh6ZGV2X3QqIGRldiwgdThfdCogcnNwKTsKK3ZvaWQgemZFbmRPZkF0aW1XaW5kb3dJbnRlcnJ1cHQoemRldl90KiBkZXYpOworCisvKiBjaW5pdC5jICovCit1MTZfdCB6ZlR4R2VuV2xhbkhlYWRlcih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90KiBoZWFkZXIsIHUxNl90IHNlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHU4X3QgZmxhZywgdTE2X3QgcGx1c0xlbiwgdTE2X3QgbWludXNMZW4sIHUxNl90IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCogZGEsIHUxNl90KiBzYSwgdThfdCB1cCwgdTE2X3QgKm1pY0xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90KiBzbmFwLCB1MTZfdCBzbmFwTGVuLCBzdHJ1Y3QgYWdnQ29udHJvbCAqYWdnQ29udHJvbCk7Cit1MTZfdCB6ZlR4R2VuTW1IZWFkZXIoemRldl90KiBkZXYsIHU4X3QgZnJhbWVUeXBlLCB1MTZfdCogZHN0LAorICAgICAgICB1MTZfdCogaGVhZGVyLCB1MTZfdCBsZW4sIHpidWZfdCogYnVmLCB1MTZfdCB2YXAsIHU4X3QgZW5jcnlwdCk7Cit2b2lkIHpmSW5pdE1hY0FwTW9kZSh6ZGV2X3QqIGRldik7Cit1MTZfdCB6ZkNoR2V0TmV4dENoYW5uZWwoemRldl90KiBkZXYsIHUxNl90IGZyZXF1ZW5jeSwgdThfdCogcGJQYXNzaXZlKTsKK3UxNl90IHpmQ2hHZXRGaXJzdENoYW5uZWwoemRldl90KiBkZXYsIHU4X3QqIHBiUGFzc2l2ZSk7Cit1MTZfdCB6ZkNoR2V0Rmlyc3QyR2h6Q2hhbm5lbCh6ZGV2X3QqIGRldik7Cit1MTZfdCB6ZkNoR2V0Rmlyc3Q1R2h6Q2hhbm5lbCh6ZGV2X3QqIGRldik7Cit1MTZfdCB6ZkNoR2V0TGFzdENoYW5uZWwoemRldl90KiBkZXYsIHU4X3QqIHBiUGFzc2l2ZSk7Cit1MTZfdCB6ZkNoR2V0TGFzdDVHaHpDaGFubmVsKHpkZXZfdCogZGV2KTsKK3UxNl90IHpmQ2hOdW1Ub0ZyZXEoemRldl90KiBkZXYsIHU4X3QgY2gsIHU4X3QgZnJlcUJhbmQpOwordThfdCB6ZkNoRnJlcVRvTnVtKHUxNl90IGZyZXEsIHU4X3QqIGJJczVHQmFuZCk7CisKKy8qIGNtbS5jICovCit2b2lkIHpmUHJvY2Vzc01hbmFnZW1lbnQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBzdHJ1Y3QgenNBZGRpdGlvbkluZm8qIEFkZEluZm8pOyAvL0NXWWFuZyhtKQordm9pZCB6ZlNlbmRNbUZyYW1lKHpkZXZfdCogZGV2LCB1OF90IGZyYW1lVHlwZSwgdTE2X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICB1MzJfdCBwMSwgdTMyX3QgcDIsIHUzMl90IHAzKTsKK3UxNl90IHpmRmluZEVsZW1lbnQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90IGVpZCk7Cit1MTZfdCB6ZkZpbmRXaWZpRWxlbWVudCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QgdHlwZSwgdThfdCBzdWJ0eXBlKTsKK3UxNl90IHpmRmluZFN1cGVyR0VsZW1lbnQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90IHR5cGUpOwordTE2X3QgemZGaW5kWFJFbGVtZW50KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCB0eXBlKTsKK3UxNl90IHpmUmVtb3ZlRWxlbWVudCh6ZGV2X3QqIGRldiwgdThfdCogYnVmLCB1MTZfdCBzaXplLCB1OF90IGVpZCk7Cit1MTZfdCB6ZlVwZGF0ZUVsZW1lbnQoemRldl90KiBkZXYsIHU4X3QqIGJ1ZiwgdTE2X3Qgc2l6ZSwgdThfdCogdXBkYXRlZWlkKTsKK3ZvaWQgemZQcm9jZXNzUHJvYmVSZXEoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCogc3JjKTsKK3ZvaWQgemZQcm9jZXNzUHJvYmVSc3AoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBzdHJ1Y3QgenNBZGRpdGlvbkluZm8qIEFkZEluZm8pOwordTE2X3QgemZTZW5kUHJvYmVSZXEoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHU4X3QgYldpdGhTU0lEKTsKK3UxNl90IHpmTW1BZGRJZVN1cHBvcnRSYXRlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90IG9mZnNldCwgdThfdCBlaWQsIHU4X3QgcmF0ZVNldCk7Cit1MTZfdCB6Zk1tQWRkSWVEcyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCk7Cit1MTZfdCB6Zk1tQWRkSWVFcnAoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQpOwordm9pZCB6ZlVwZGF0ZURlZmF1bHRRb3NQYXJhbWV0ZXIoemRldl90KiBkZXYsIHU4X3QgbW9kZSk7Cit1MTZfdCB6Zk1tQWRkSWVXcGEoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHUxNl90IGFwSWQpOwordTE2X3QgemZNbUFkZEhUQ2FwYWJpbGl0eSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCk7IC8vQ1dZYW5nKCspCit1MTZfdCB6Zk1tQWRkUHJlTkhUQ2FwYWJpbGl0eSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCk7Cit1MTZfdCB6Zk1tQWRkRXh0ZW5kZWRIVENhcGFiaWxpdHkoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQpOyAvL0NXWWFuZygrKQordTE2X3QgemZGaW5kQVRIRXh0Q2FwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCB0eXBlLCB1OF90IHN1YnR5cGUpOwordTE2X3QgemZGaW5kQnJkY21NcnZsUmxua0V4dENhcCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordTE2X3QgemZGaW5kTWFydmVsRXh0Q2FwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit1MTZfdCB6ZkZpbmRCcm9hZGNvbUV4dENhcCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordTE2X3QgemZGaW5kUmxua0V4dENhcCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworCisvKiBjbW1hcC5jICovCit2b2lkIHpmTW1BcFRpbWVUaWNrKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZBcEFnaW5nU3RhKHpkZXZfdCogZGV2KTsKK3UxNl90IHpmQXBBZGRTdGEoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MTZfdCBzdGF0ZSwgdTE2X3QgYXBJZCwgdThfdCB0eXBlLAorICAgICAgICAgICAgICAgICB1OF90IHFvc1R5cGUsIHU4X3QgcW9zSW5mbyk7Cit2b2lkIHpmQXBQcm90Y3Rpb25Nb25pdG9yKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZBcFByb2Nlc3NCZWFjb24oemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3ZvaWQgemZBcFByb2Nlc3NBdXRoKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIHNyYywgdTE2X3QgYXBJZCk7Cit2b2lkIHpmQXBQcm9jZXNzQXNvY1JlcSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90KiBzcmMsIHUxNl90IGFwSWQpOwordm9pZCB6ZkFwUHJvY2Vzc0Fzb2NSc3AoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3ZvaWQgemZBcFByb2Nlc3NEZWF1dGgoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCogc3JjLCB1MTZfdCBhcElkKTsKK3ZvaWQgemZBcFByb2Nlc3NEaXNhc29jKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIHNyYywgdTE2X3QgYXBJZCk7Cit2b2lkIHpmQXBQcm9jZXNzUHJvYmVSc3AoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBzdHJ1Y3QgenNBZGRpdGlvbkluZm8qIEFkZEluZm8pOwordm9pZCB6ZkFwU3RvcmVBc29jUmVxSWUoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBhaWQpOwordTE2X3QgemZBcEFkZEllU3NpZCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgdTE2X3QgdmFwKTsKK3ZvaWQgemZBcFNlbmRCZWFjb24oemRldl90KiBkZXYpOwordTE2X3QgemZBcEdldFNUQUluZm8oemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MTZfdCogc3RhdGUsIHU4X3QqIHZhcCk7Cit1MTZfdCB6ZkludHJhYnNzRm9yd2FyZCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3Qgc3JjVmFwKTsKK3UxNl90IHpmQXBCdWZmZXJQc0ZyYW1lKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCk7Cit2b2lkIHpmQXBJbml0U3RhVGJsKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZBcEdldFN0YVR4UmF0ZUFuZFFvc1R5cGUoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MzJfdCogcGh5Q3RybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdThfdCogcW9zVHlwZSwgdTE2X3QqIHJjUHJvYmluZ0ZsYWcpOwordm9pZCB6ZkFwR2V0U3RhUW9zVHlwZSh6ZGV2X3QqIGRldiwgdTE2X3QqIGFkZHIsIHU4X3QqIHFvc1R5cGUpOwordm9pZCB6ZkFwU2V0U3RhVHhSYXRlKHpkZXZfdCogZGV2LCB1MTZfdCogYWRkciwgdTMyX3QgcGh5Q3RybCk7CitzdHJ1Y3QgenNNaWNWYXIqIHpmQXBHZXRSeE1pY0tleSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworc3RydWN0IHpzTWljVmFyKiB6ZkFwR2V0VHhNaWNLZXkoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90KiBxb3NUeXBlKTsKK3UxNl90IHpmQXBBZGRJZVdtZVBhcmEoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHUxNl90IHZhcCk7Cit1MTZfdCB6ZkFwVXBkYXRlUHNCaXQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90KiB2YXAsIHU4X3QqIHVhcHNkVHJpZyk7Cit2b2lkIHpmQXBQcm9jZXNzUHNQb2xsKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit1MTZfdCB6ZkFwRmluZFN0YSh6ZGV2X3QqIGRldiwgdTE2X3QqIGFkZHIpOwordm9pZCB6ZkFwR2V0U3RhRW5jcnlUeXBlKHpkZXZfdCogZGV2LCB1MTZfdCogYWRkciwgdThfdCogZW5jcnlUeXBlKTsKK3ZvaWQgemZBcEdldFN0YVdwYUl2KHpkZXZfdCogZGV2LCB1MTZfdCogYWRkciwgdTE2X3QqIGl2MTYsIHUzMl90KiBpdjMyKTsKK3ZvaWQgemZBcFNldFN0YVdwYUl2KHpkZXZfdCogZGV2LCB1MTZfdCogYWRkciwgdTE2X3QgaXYxNiwgdTMyX3QgaXYzMik7Cit2b2lkIHpmQXBDbGVhclN0YUtleSh6ZGV2X3QqIGRldiwgdTE2X3QqIGFkZHIpOworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCit2b2lkIHpmQXBHZXRTdGFDZW5jSXZBbmRLZXlJZHgoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MzJfdCAqaXYsCisgICAgICAgIHU4X3QgKmtleUlkeCk7Cit2b2lkIHpmQXBTZXRTdGFDZW5jSXYoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MzJfdCAqaXYpOworI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKK3ZvaWQgemZBcFNldFByb3RlY3Rpb25Nb2RlKHpkZXZfdCogZGV2LCB1MTZfdCBtb2RlKTsKK3ZvaWQgemZBcEZsdXNoQnVmZmVyZWRQc0ZyYW1lKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZBcFNlbmRGYWlsdXJlKHpkZXZfdCogZGV2LCB1OF90KiBhZGRyKTsKK3U4X3QgemZBcFJlbW92ZUZyb21Qc1F1ZXVlKHpkZXZfdCogZGV2LCB1MTZfdCBpZCwgdTE2X3QqIHNyYyk7Cit2b2lkIHpmQXBQcm9jZXNzQWN0aW9uKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7CisvKiBjbW1zdGEuYyAqLwordm9pZCB6Zk1tU3RhVGltZVRpY2soemRldl90KiBkZXYpOwordm9pZCB6ZlJlV3JpdGVCZWFjb25TdGFydEFkZHJlc3MoemRldl90KiBkZXYpOyAgLy8gTXh6ZW5nCit2b2lkIHpmU3RhUHJvY2Vzc0JlYWNvbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogQWRkSW5mbyk7IC8vQ1dZYW5nKG0pCit2b2lkIHpmU3RhUHJvY2Vzc0F1dGgoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCogc3JjLCB1MTZfdCBhcElkKTsKK3ZvaWQgemZTdGFQcm9jZXNzQXNvY1JlcSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90KiBzcmMsIHUxNl90IGFwSWQpOwordm9pZCB6ZlN0YVByb2Nlc3NBc29jUnNwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit2b2lkIHpmU3RhUHJvY2Vzc0RlYXV0aCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordm9pZCB6ZlN0YVByb2Nlc3NEaXNhc29jKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit2b2lkIHpmU3RhUHJvY2Vzc1Byb2JlUnNwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBBZGRJbmZvKTsKK3ZvaWQgemZTdGFQcm9jZXNzQXRpbSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordm9pZCB6ZlN0YVN0b3JlQXNvY1JzcEllKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit2b2lkIHpmU3RhQ2hhbm5lbE1hbmFnZW1lbnQoemRldl90KiBkZXYsIHU4X3Qgc2Nhbik7Cit2b2lkIHpmSWJzc0Nvbm5lY3ROZXR3b3JrKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZJbmZyYUNvbm5lY3ROZXR3b3JrKHpkZXZfdCogZGV2KTsKK3U4X3QgemZDaGVja0F1dGhlbnRpY2F0aW9uKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNCc3NJbmZvKiBwQnNzSW5mbyk7Cit1OF90IHpmQ2hhbmdlQWRhcHRlclN0YXRlKHpkZXZfdCogZGV2LCB1OF90IG5ld1N0YXRlKTsKK3UxNl90IHpmU3RhQWRkSWVTc2lkKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KTsKK3UxNl90IHpmU3RhQWRkSWVXcGFSc24oemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHU4X3QgZnJhbWVUeXBlKTsKK3UxNl90IHpmU3RhQWRkSWVJYnNzKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KTsKK3ZvaWQgemZTdGFTdGFydENvbm5lY3QoemRldl90KiBkZXYsIHU4X3QgYklzU2hhcmVkS2V5KTsKK3U4X3QgemZTdGFJc0Nvbm5lY3RlZCh6ZGV2X3QqIGRldik7Cit1OF90IHpmU3RhSXNDb25uZWN0aW5nKHpkZXZfdCogZGV2KTsKK3U4X3QgemZTdGFJc0Rpc2Nvbm5lY3QoemRldl90KiBkZXYpOwordm9pZCB6ZlN0YVNlbmRCZWFjb24oemRldl90KiBkZXYpOwordm9pZCB6ZlNlbmROdWxsRGF0YSh6ZGV2X3QqIGRldiwgdThfdCB0eXBlKTsKK3ZvaWQgemZTZW5kUFNQb2xsKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZTZW5kQkEoemRldl90KiBkZXYsIHUxNl90IHN0YXJ0X3NlcSwgdThfdCAqYml0bWFwKTsKK3ZvaWQgemRSYXRlSW5mb0NvdW50VHgoemRldl90KiBkZXYsIHUxNl90KiBtYWNBZGRyKTsKK3N0cnVjdCB6c01pY1ZhciogemZTdGFHZXRSeE1pY0tleSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworc3RydWN0IHpzTWljVmFyKiB6ZlN0YUdldFR4TWljS2V5KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit1MTZfdCB6ZlN0YVJ4VmFsaWRhdGVGcmFtZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordm9pZCB6ZlN0YU1pY0ZhaWx1cmVIYW5kbGluZyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordThfdCB6ZlN0YUJsb2NrV2xhblNjYW4oemRldl90KiBkZXYpOwordm9pZCB6ZlN0YUlic3NQU0NoZWNrU3RhdGUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3U4X3QgemZTdGFJYnNzUFNRdWV1ZURhdGEoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3ZvaWQgemZTdGFJYnNzUFNTZW5kKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZTdGFSZXNldFN0YXR1cyh6ZGV2X3QqIGRldiwgdThfdCBiSW5pdCk7Cit1MTZfdCB6ZlN0YUFkZEllV21lSW5mbyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgdThfdCBxb3NJbmZvKTsKK3ZvaWQgemZJbml0UGFydG5lck5vdGlmeUV2ZW50KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzUGFydG5lck5vdGlmeUV2ZW50ICpldmVudCk7Cit2b2lkIHpmU3RhSW5pdE9wcG9zaXRlSW5mbyh6ZGV2X3QqIGRldik7Cit2b2lkIHpmU3RhSWJzc01vbml0b3JpbmcoemRldl90KiBkZXYsIHU4X3QgcmVzZXQpOworc3RydWN0IHpzQnNzSW5mbyogemZTdGFGaW5kQnNzSW5mbyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c1dsYW5Qcm9iZVJzcEZyYW1lSGVhZGVyICpwUHJvYmVSc3BIZWFkZXIpOwordThfdCB6ZlN0YUluaXRCc3NJbmZvKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwKKyAgICAgICAgc3RydWN0IHpzV2xhblByb2JlUnNwRnJhbWVIZWFkZXIgKnBQcm9iZVJzcEhlYWRlciwKKyAgICAgICAgc3RydWN0IHpzQnNzSW5mbyogcEJzc0luZm8sIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogQWRkSW5mbywgdThfdCB0eXBlKTsKK3M4X3QgemZTdGFGaW5kRnJlZU9wcG9zaXRlKHpkZXZfdCogZGV2LCB1MTZfdCAqc2EsIGludCAqcEZvdW5kSWR4KTsKK3M4X3QgemZTdGFGaW5kT3Bwb3NpdGVCeU1BQ0FkZHIoemRldl90KiBkZXYsIHUxNl90ICpzYSwgdThfdCAqcEZvdW5kSWR4KTsKK3ZvaWQgemZTdGFSZWZyZXNoQmxvY2tMaXN0KHpkZXZfdCogZGV2LCB1MTZfdCBmbHVzaEZsYWcpOwordm9pZCB6ZlN0YUNvbm5lY3RGYWlsKHpkZXZfdCogZGV2LCB1MTZfdCByZWFzb24sIHUxNl90KiBic3NpZCwgdThfdCB3ZWlnaHQpOwordm9pZCB6ZlN0YUdldFR4UmF0ZSh6ZGV2X3QqIGRldiwgdTE2X3QqIG1hY0FkZHIsIHUzMl90KiBwaHlDdHJsLAorICAgICAgICB1MTZfdCogcmNQcm9iaW5nRmxhZyk7Cit1MTZfdCB6ZlN0YVByb2Nlc3NBY3Rpb24oemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3N0cnVjdCB6c1RraXBTZWVkKiB6ZlN0YUdldFJ4U2VlZCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisvKiBDRU5DICovCit1MTZfdCB6ZlN0YUFkZEllQ2VuYyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCk7CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQwordm9pZCB6ZlN0YUVuYWJsZVNXRW5jcnlwdGlvbih6ZGV2X3QgKmRldiwgdThfdCB2YWx1ZSk7Cit2b2lkIHpmU3RhRGlzYWJsZVNXRW5jcnlwdGlvbih6ZGV2X3QgKmRldik7Cit1MTZfdCB6ZkNvbXB1dGVCc3NJbmZvV2VpZ2h0VmFsdWUoemRldl90ICpkZXYsIHU4X3QgaXNCTW9kZSwgdThfdCBpc0hULCB1OF90IGlzSFQ0MCwgdThfdCBzaWduYWxTdHJlbmd0aCk7Cit1MTZfdCB6ZlN0YUFkZElic3NBZGRpdGlvbmFsSUUoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQpOworCisvKiBjdGtpcC5jICovCit2b2lkIHpmVGtpcEluaXQodThfdCoga2V5LCB1OF90KiB0YSwgc3RydWN0IHpzVGtpcFNlZWQqIHBTZWVkLCB1OF90KiBpbml0SXYpOwordm9pZCB6Zk1pY1NldEtleSh1OF90KiBrZXksIHN0cnVjdCB6c01pY1ZhciogcE1pYyk7Cit2b2lkIHpmTWljQXBwZW5kQnl0ZSh1OF90IGIsIHN0cnVjdCB6c01pY1ZhciogcE1pYyk7Cit2b2lkIHpmTWljQ2xlYXIoc3RydWN0IHpzTWljVmFyKiBwTWljKTsKK3ZvaWQgemZNaWNBcHBlbmRUeEJ1Zih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QqIGRhLCB1OF90KiBzYSwKKyAgICAgICAgICAgICAgICAgICAgICB1MTZfdCByZW1vdmVMZW4sIHU4X3QqIG1pYyk7Cit1OF90IHpmTWljUnhWZXJpZnkoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3ZvaWQgemZNaWNHZXRNaWModThfdCogZHN0LCBzdHJ1Y3QgenNNaWNWYXIqIHBNaWMpOwordm9pZCB6ZkNhbFR4TWljKHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZiwgdThfdCAqc25hcCwgdTE2X3Qgc25hcExlbiwgdTE2X3Qgb2Zmc2V0LCB1MTZfdCAqZGEsIHUxNl90ICpzYSwgdThfdCB1cCwgdThfdCAqbWljKTsKK3ZvaWQgemZUS0lQRW5jcnlwdCh6ZGV2X3QgKmRldiwgemJ1Zl90ICpidWYsIHU4X3QgKnNuYXAsIHUxNl90IHNuYXBMZW4sIHUxNl90IG9mZnNldCwgdThfdCBrZXlMZW4sIHU4X3QqIGtleSwgdTMyX3QqIGljdik7Cit1MTZfdCB6ZlRLSVBEZWNyeXB0KHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGtleUxlbiwgdThfdCoga2V5KTsKK3ZvaWQgemZUa2lwR2V0c2VlZHModTE2X3QgaXYxNiwgdThfdCAqUkM0S2V5LCBzdHJ1Y3QgenNUa2lwU2VlZCAqU2VlZCk7Cit1OF90IHpmVGtpcFBoYXNlMUtleU1peCh1MzJfdCBpdjMyLCBzdHJ1Y3QgenNUa2lwU2VlZCogcFNlZWQpOwordThfdCB6ZlRraXBQaGFzZTJLZXlNaXgodTE2X3QgaXYxNiwgc3RydWN0IHpzVGtpcFNlZWQqIHBTZWVkKTsKK3ZvaWQgemZXRVBFbmNyeXB0KHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZiwgdThfdCAqc25hcCwgdTE2X3Qgc25hcExlbiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGtleUxlbiwgdThfdCogV2VwS2V5LCB1OF90ICppdik7Cit1MTZfdCB6ZldFUERlY3J5cHQoemRldl90ICpkZXYsIHpidWZfdCAqYnVmLCB1MTZfdCBvZmZzZXQsIHU4X3Qga2V5TGVuLCB1OF90KiBXZXBLZXksIHU4X3QgKml2KTsKKworLyogY3R4cnguYyAqLwordTE2X3QgemZTZW5kODAyMTFGcmFtZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordm9pZCB6ZklzclBjaVR4Q29tcCh6ZGV2X3QqIGRldik7Cit2b2lkIHpmVHhQY2lEbWFTdGFydCh6ZGV2X3QqIGRldik7Cit1MTZfdCB6ZlR4UG9ydENvbnRyb2woemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBwb3J0KTsKK3UxNl90IHpmVHhTZW5kRXRoKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCwKKyAgICAgICAgICAgICAgICAgIHUxNl90IGJ1ZlR5cGUsIHUxNl90IGZsYWcpOwordTE2X3QgemZUeEdlbldsYW5UYWlsKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIHNuYXAsIHUxNl90IHNuYXBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgdTE2X3QqIG1pYyk7Cit1MTZfdCB6ZlR4R2VuV2xhblNuYXAoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCogc25hcCwgdTE2X3QqIHNuYXBsZW4pOwordm9pZCB6ZlR4R2V0SXBUb3NBbmRGcmFnKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCogdXAsIHUxNl90KiBmcmFnT2ZmKTsKK3UxNl90IHpmUHV0VnR4cSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordm9pZCB6ZlB1c2hWdHhxKHpkZXZfdCogZGV2KTsKK3U4X3QgemZJc1Z0eHFFbXB0eSh6ZGV2X3QqIGRldik7Cit1MTZfdCB6ZkdldFNlcUN0cmwoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQpOwordThfdCB6ZkdldEZyYWdObyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordm9pZCB6ZlNob3dSeEVBUE9MKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KTsKK3ZvaWQgemZTaG93VHhFQVBPTCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCk7Cit2b2lkIHpmQ29yZVJlY3YoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBzdHJ1Y3QgenNBZGRpdGlvbkluZm8qIGFkZEluZm8pOwordTE2X3QgemZQdXRWbW1xKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7Cit2b2lkIHpmRmx1c2hWdHhxKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZBZ2luZ0RlZnJhZ0xpc3QoemRldl90KiBkZXYsIHUxNl90IGZsdXNoRmxhZyk7CisKK3ZvaWQgemZMZWQxMDBtc0N0cmwoemRldl90KiBkZXYpOwordm9pZCB6ZjgwMjExRnJhbWVTZW5kKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIGhlYWRlciwgdTE2X3Qgc25hcExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90KiBkYSwgdTE2X3QqIHNhLCB1OF90IHVwLCB1MTZfdCBoZWFkZXJMZW4sIHUxNl90KiBzbmFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2X3QqIHRhaWwsIHUxNl90IHRhaWxMZW4sIHUxNl90IG9mZnNldCwgdTE2X3QgYnVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4X3QgYWMsIHU4X3Qga2V5SWR4KTsKK3ZvaWQgemZDaGVja0lzUklGU0ZyYW1lKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgZnJhbWVTdWJUeXBlKTsKKworLyogcXVldWUuYyAqLworc3RydWN0IHpzUXVldWUqIHpmUXVldWVDcmVhdGUoemRldl90KiBkZXYsIHUxNl90IHNpemUpOwordm9pZCB6ZlF1ZXVlRGVzdHJveSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzUXVldWUqIHEpOwordTE2X3QgemZRdWV1ZVB1dE5jcyh6ZGV2X3QqIGRldiwgc3RydWN0IHpzUXVldWUqIHEsIHpidWZfdCogYnVmLCB1MzJfdCB0aWNrKTsKK3UxNl90IHpmUXVldWVQdXQoemRldl90KiBkZXYsIHN0cnVjdCB6c1F1ZXVlKiBxLCB6YnVmX3QqIGJ1ZiwgdTMyX3QgdGljayk7Cit6YnVmX3QqIHpmUXVldWVHZXQoemRldl90KiBkZXYsIHN0cnVjdCB6c1F1ZXVlKiBxKTsKK3pidWZfdCogemZRdWV1ZUdldFdpdGhNYWMoemRldl90KiBkZXYsIHN0cnVjdCB6c1F1ZXVlKiBxLCB1OF90KiBhZGRyLCB1OF90KiBtYik7Cit2b2lkIHpmUXVldWVGbHVzaCh6ZGV2X3QqIGRldiwgc3RydWN0IHpzUXVldWUqIHEpOwordm9pZCB6ZlF1ZXVlQWdlKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNRdWV1ZSogcSwgdTMyX3QgdGljaywgdTMyX3QgbXNBZ2UpOwordm9pZCB6ZlF1ZXVlR2VuZXJhdGVVYXBzZFRpbSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzUXVldWUqIHEsCisgICAgICAgIHU4X3QqIHVuaUJpdE1hcCwgdTE2X3QqIGhpZ2hlc3RCeXRlKTsKKworLyogaHBtYWluLmMgKi8KK3UxNl90IHpmSHBJbml0KHpkZXZfdCogZGV2LCB1MzJfdCBmcmVxdWVuY3kpOwordTE2X3QgemZIcFJlbGVhc2UoemRldl90KiBkZXYpOwordm9pZCB6ZkhwU2V0RnJlcXVlbmN5RXgoemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSwgdThfdCBidzQwLAorICAgICAgICB1OF90IGV4dE9mZnNldCwgdThfdCBpbml0UkYpOwordTE2X3QgemZIcFN0YXJ0UmVjdih6ZGV2X3QqIGRldik7Cit1MTZfdCB6ZkhwU3RvcFJlY3YoemRldl90KiBkZXYpOwordTE2X3QgemZIcFJlc2V0S2V5Q2FjaGUoemRldl90KiBkZXYpOwordTE2X3QgemZIcFNldEFwU3RhTW9kZSh6ZGV2X3QqIGRldiwgdThfdCBtb2RlKTsKK3UxNl90IHpmSHBTZXRCc3NpZCh6ZGV2X3QqIGRldiwgdThfdCogYnNzaWQpOwordTE2X3QgemZIcFNldFNuaWZmZXJNb2RlKHpkZXZfdCogZGV2LCB1MTZfdCBvbik7Cit1OF90IHpmSHBVcGRhdGVRb3NQYXJhbWV0ZXIoemRldl90KiBkZXYsIHUxNl90KiBjd21pblRibCwgdTE2X3QqIGN3bWF4VGJsLAorICAgICAgICB1MTZfdCogYWlmc1RibCwgdTE2X3QqIHR4b3BUYmwpOwordm9pZCB6ZkhwU2V0QXRpbVdpbmRvdyh6ZGV2X3QqIGRldiwgdTE2X3QgYXRpbVdpbik7Cit2b2lkIHpmSHBFbmFibGVCZWFjb24oemRldl90KiBkZXYsIHUxNl90IG1vZGUsIHUxNl90IGJjbkludGVydmFsLCB1MTZfdCBkdGltLCB1OF90IGVuYWJsZUF0aW0pOwordm9pZCB6ZkhwRGlzYWJsZUJlYWNvbih6ZGV2X3QqIGRldik7Cit2b2lkIHpmSHBTZXRCYXNpY1JhdGVTZXQoemRldl90KiBkZXYsIHUxNl90IGJSYXRlQmFzaWMsIHUxNl90IGdSYXRlQmFzaWMpOwordm9pZCB6ZkhwU2V0UlRTQ1RTUmF0ZSh6ZGV2X3QqIGRldiwgdTMyX3QgcmF0ZSk7Cit2b2lkIHpmSHBTZXRNYWNBZGRyZXNzKHpkZXZfdCogZGV2LCB1MTZfdCogbWFjQWRkciwgdTE2X3QgbWFjQWRkcklkKTsKK3UzMl90IHpmSHBHZXRNYWNBZGRyZXNzKHpkZXZfdCogZGV2KTsKK3UzMl90IHpmSHBHZXRUcmFuc21pdFBvd2VyKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZIcFNldE11bHRpY2FzdExpc3QoemRldl90KiBkZXYsIHU4X3Qgc2l6ZSwgdThfdCogcExpc3QsIHU4X3QgYkFsbE11bHRpY2FzdCk7CisKK3UxNl90IHpmSHBSZW1vdmVLZXkoemRldl90KiBkZXYsIHUxNl90IHVzZXIpOwordTMyX3QgemZIcFNldEtleSh6ZGV2X3QqIGRldiwgdThfdCB1c2VyLCB1OF90IGtleUlkLCB1OF90IHR5cGUsCisgICAgICAgIHUxNl90KiBtYWMsIHUzMl90KiBrZXkpOworLy91MzJfdCB6ZkhwU2V0U3RhUGFpcndpc2VLZXkoemRldl90KiBkZXYsIHUxNl90KiBhcE1hY0FkZHIsIHU4X3QgdHlwZSwKKy8vICAgICAgICB1MzJfdCoga2V5LCB1MzJfdCogbWljS2V5KTsKKy8vdTMyX3QgemZIcFNldFN0YUdyb3VwS2V5KHpkZXZfdCogZGV2LCB1MTZfdCogYXBNYWNBZGRyLCB1OF90IHR5cGUsCisvLyAgICAgICAgdTMyX3QqIGtleSwgdTMyX3QqIG1pY0tleSk7Cit1MzJfdCB6ZkhwU2V0QXBQYWlyd2lzZUtleSh6ZGV2X3QqIGRldiwgdTE2X3QqIHN0YU1hY0FkZHIsIHU4X3QgdHlwZSwKKyAgICAgICAgdTMyX3QqIGtleSwgdTMyX3QqIG1pY0tleSwgdTE2X3Qgc3RhQWlkKTsKK3UzMl90IHpmSHBTZXRBcEdyb3VwS2V5KHpkZXZfdCogZGV2LCB1MTZfdCogYXBNYWNBZGRyLCB1OF90IHR5cGUsCisgICAgICAgIHUzMl90KiBrZXksIHUzMl90KiBtaWNLZXksIHUxNl90IHZhcElkKTsKK3UzMl90IHpmSHBTZXREZWZhdWx0S2V5KHpkZXZfdCogZGV2LCB1OF90IGtleUlkLCB1OF90IHR5cGUsIHUzMl90KiBrZXksIHUzMl90KiBtaWNLZXkpOwordTMyX3QgemZIcFNldFBlclVzZXJLZXkoemRldl90KiBkZXYsIHU4X3QgdXNlciwgdThfdCBrZXlJZCwgdThfdCogbWFjLCB1OF90IHR5cGUsIHUzMl90KiBrZXksIHUzMl90KiBtaWNLZXkpOworCit2b2lkIHpmSHBTZW5kQmVhY29uKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgbGVuKTsKK3UxNl90IHpmSHBHZXRQYXlsb2FkTGVuKHpkZXZfdCogZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgemJ1Zl90KiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBwbGNwSGRyTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3QgKnJ4TVQsCisgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdCAqcnhNQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdCAqcnhCVywKKyAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ICpyeFNHCisgICAgICAgICAgICAgICAgICAgICAgICApOwordTMyX3QgemZIcEdldEZyZWVUeGRDb3VudCh6ZGV2X3QqIGRldik7Cit1MzJfdCB6ZkhwR2V0TWF4VHhkQ291bnQoemRldl90KiBkZXYpOwordTE2X3QgemZIcFNlbmQoemRldl90KiBkZXYsIHUxNl90KiBoZWFkZXIsIHUxNl90IGhlYWRlckxlbiwKKyAgICAgICAgdTE2X3QqIHNuYXAsIHUxNl90IHNuYXBMZW4sIHUxNl90KiB0YWlsLCB1MTZfdCB0YWlsTGVuLCB6YnVmX3QqIGJ1ZiwKKyAgICAgICAgdTE2X3Qgb2Zmc2V0LCB1MTZfdCBidWZUeXBlLCB1OF90IGFjLCB1OF90IGtleUlkeCk7Cit2b2lkIHpmSHBHZXRSZWd1bGF0aW9uVGFibGVmcm9tUmVnaW9uQ29kZSh6ZGV2X3QqIGRldiwgdTE2X3QgcmVnaW9uQ29kZSk7Cit2b2lkIHpmSHBHZXRSZWd1bGF0aW9uVGFibGVmcm9tQ291bnRyeSh6ZGV2X3QqIGRldiwgdTE2X3QgQ291bnRyeUNvZGUpOwordThfdCB6ZkhwR2V0UmVndWxhdGlvblRhYmxlZnJvbUlTTyh6ZGV2X3QqIGRldiwgdThfdCAqY291bnRyeUluZm8sIHU4X3QgbGVuZ3RoKTsKK2NvbnN0IGNoYXIqIHpmSHBHZXRpc29OYW1lZnJvbXJlZ2lvbkNvZGUoemRldl90KiBkZXYsIHUxNl90IHJlZ2lvbkNvZGUpOwordTE2X3QgemZIcEdldFJlZ2lvbkNvZGVGcm9tSXNvTmFtZSh6ZGV2X3QqIGRldiwgdThfdCAqY291bnRyeUlzb05hbWUpOwordThfdCB6ZkhwR2V0UmVndWxhdG9yeURvbWFpbih6ZGV2X3QqIGRldik7Cit2b2lkIHpmSHBMZWRDdHJsKHpkZXZfdCogZGV2LCB1MTZfdCBsZWRJZCwgdThfdCBtb2RlKTsKK3UxNl90IHpmSHBSZXNldFR4UngoemRldl90KiBkZXYpOwordTE2X3QgemZIcERlbGV0ZUFsbG93Q2hhbm5lbCh6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcSk7Cit1MTZfdCB6ZkhwQWRkQWxsb3dDaGFubmVsKHpkZXZfdCogZGV2LCB1MTZfdCBmcmVxKTsKK3UzMl90IHpmSHBDd21VcGRhdGUoemRldl90KiBkZXYpOwordTMyX3QgemZIcEFuaVVwZGF0ZSh6ZGV2X3QqIGRldik7Cit1MzJfdCB6ZkhwQW5pVXBkYXRlUnNzaSh6ZGV2X3QqIGRldiwgdThfdCByc3NpKTsKK3ZvaWQgemZIcEFuaUF0dGFjaCh6ZGV2X3QqIGRldik7Cit2b2lkIHpmSHBBbmlBclBvbGwoemRldl90KiBkZXYsIHUzMl90IGxpc3RlblRpbWUsIHUzMl90IHBoeUNudDEsIHUzMl90IHBoeUNudDIpOwordm9pZCB6ZkhwSGVhcnRCZWF0KHpkZXZfdCogZGV2KTsKK3ZvaWQgemZIcFBvd2VyU2F2ZVNldFN0YXRlKHpkZXZfdCogZGV2LCB1OF90IHBzU3RhdGUpOwordm9pZCB6ZkhwUG93ZXJTYXZlU2V0TW9kZSh6ZGV2X3QqIGRldiwgdThfdCBzdGFNb2RlLCB1OF90IHBzTW9kZSwgdTE2X3QgYmNuSW50ZXJ2YWwpOwordTE2X3QgemZIcElzRGZzQ2hhbm5lbCh6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcSk7Cit1MTZfdCB6ZkhwSXNEZnNDaGFubmVsTkNTKHpkZXZfdCogZGV2LCB1MTZfdCBmcmVxKTsKK3UxNl90IHpmSHBGaW5kRmlyc3ROb25EZnNDaGFubmVsKHpkZXZfdCogZGV2LCB1MTZfdCBhQmFuZCk7Cit1MTZfdCB6ZkhwSXNBbGxvd2VkQ2hhbm5lbCh6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcSk7Cit2b2lkIHpmSHBEaXNhYmxlRGZzQ2hhbm5lbCh6ZGV2X3QqIGRldiwgdThfdCBkaXNhYmxlRmxhZyk7Cit2b2lkIHpmSHBTZXRUVFNJRlNUaW1lKHpkZXZfdCogZGV2LCB1OF90IHNpZnNfdGltZSk7CisKK3ZvaWQgemZIcFF1ZXJ5TW9uSGFsUnhJbmZvKHpkZXZfdCogZGV2LCB1OF90ICptb25IYWxSeEluZm8pOworCit2b2lkIHpmRHVtcFNTSUQodThfdCBsZW5ndGgsIHU4X3QgKnZhbHVlKTsKK3ZvaWQgemZIcFNldEFnZ1BrdE51bSh6ZGV2X3QqIGRldiwgdTMyX3QgbnVtKTsKK3ZvaWQgemZIcFNldE1QRFVEZW5zaXR5KHpkZXZfdCogZGV2LCB1OF90IGRlbnNpdHkpOwordm9pZCB6ZkhwU2V0U2xvdFRpbWUoemRldl90KiBkZXYsIHU4X3QgdHlwZSk7Cit2b2lkIHpmSHBTZXRTbG90VGltZVJlZ2lzdGVyKHpkZXZfdCogZGV2LCB1OF90IHR5cGUpOwordm9pZCB6ZkhwU2V0Umlmcyh6ZGV2X3QqIGRldiwgdThfdCBodF9lbmFibGUsIHU4X3QgaHQyMDQwLCB1OF90IGdfbW9kZSk7Cit2b2lkIHpmSHBCZWdpblNpdGVTdXJ2ZXkoemRldl90KiBkZXYsIHU4X3Qgc3RhdHVzKTsKK3ZvaWQgemZIcEZpbmlzaFNpdGVTdXJ2ZXkoemRldl90KiBkZXYsIHU4X3Qgc3RhdHVzKTsKK3UxNl90IHpmSHBFbmFibGVId1JldHJ5KHpkZXZfdCogZGV2KTsKK3UxNl90IHpmSHBEaXNhYmxlSHdSZXRyeSh6ZGV2X3QqIGRldik7Cit2b2lkIHpmSHBTV0RlY3J5cHQoemRldl90KiBkZXYsIHU4X3QgZW5hYmxlKTsKK3ZvaWQgemZIcFNXRW5jcnlwdCh6ZGV2X3QqIGRldiwgdThfdCBlbmFibGUpOwordTMyX3QgemZIcENhcGFiaWxpdHkoemRldl90KiBkZXYpOwordm9pZCB6ZkhwU2V0Um9sbENhbGxUYWJsZSh6ZGV2X3QqIGRldik7Cit1OF90IHpmSHByZWd1bGF0b3J5RG9tYWluKHpkZXZfdCogZGV2KTsKK3UxNl90IHpmU3RhQWRkSWVQb3dlckNhcCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCk7Cit1OF90IHpmSHBHZXRNYXhUeFBvd2VyKHpkZXZfdCogZGV2KTsKK3U4X3QgemZIcEdldE1pblR4UG93ZXIoemRldl90KiBkZXYpOwordTE2X3QgemZTdGFBZGRJZVN1cHBvcnRDaCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCk7Cit2b2lkIHpmSHBFbmFibGVSaWZzKHpkZXZfdCogZGV2LCB1OF90IG1vZGUyNGcsIHU4X3QgbW9kZUh0LCB1OF90IG1vZGVIdDIwNDApOwordm9pZCB6ZkhwRGlzYWJsZVJpZnMoemRldl90KiBkZXYpOwordTE2X3QgemZIcFVzYlJlc2V0KHpkZXZfdCogZGV2KTsKKworCisjZW5kaWYgLyogI2lmbmRlZiBfQ0ZVTkNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NoYi5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NoYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYWMxNTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY2hiLmMKQEAgLTAsMCArMSwyMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IGhiLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgaG91c2Uga2VlcGluZyBhbmQgdGltZXIgZnVuY3Rpb25zLiAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJjcHJlY29tcC5oIgorCisvKiBDYWxsZWQgYnkgd3JhcHBlciBldmVyeSAxMCBtc2VjICovCit2b2lkIHpmaUhlYXJ0QmVhdCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+dGljaysrOworCisjaWYgMAorICAgIC8qID0+IGV2ZXJ5IDEuMjggc2Vjb25kcyAqLworICAgIGlmICh3ZC0+Y3dtLmN3X2VuYWJsZSAmJiAoKHdkLT50aWNrICYgMHg3ZikgPT0gMHgzZikpCisgICAgeworICAgICAgICB6ZkhwQ3dtVXBkYXRlKGRldik7CisgICAgfQorI2VuZGlmCisgICAgLyogPT4gZXZlcnkgMi41NiBzZWNvbmRzICovCisgICAgaWYgKCh3ZC0+dGljayAmIDB4ZmYpID09IDApCisgICAgeworICAgICAgICB6ZkFnaW5nRGVmcmFnTGlzdChkZXYsIDEpOworICAgIH0KKworICAgIC8qIFdhdGNoIERvZyAqLworICAgIC8vemZXYXRjaERvZygpOworCisgICAgLyogTEVEIENvbnRyb2wgKHBlciAxMDBtcykgKi8KKyAgICBpZiAoKHdkLT50aWNrICUgMTApID09IDkpCisgICAgeworICAgICAgICB6ZkxlZDEwMG1zQ3RybChkZXYpOworI2lmZGVmIFpNX0VOQUJMRV9CQV9SQVRFQ1RSTAorICAgICAgICBpZiAoIXdkLT5tb2RlTURLRW5hYmxlKQorICAgICAgICB7CisgICAgICAgICAgICB6ZmlEYmdSZWFkVGFsbHkoZGV2KTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorCisjaWZkZWYgWk1fRU5BQkxFX1JFV1JJVEVfQkVBQ09OX1NUQVJUX0FERFJFU1MKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MgKQorICAgIHsKKyAgICAgICAgaWYgKCB6ZlN0YUlzQ29ubmVjdGVkKGRldikgKQorICAgICAgICB7CisgICAgICAgICAgICB6ZlJlV3JpdGVCZWFjb25TdGFydEFkZHJlc3MoZGV2KTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTICkKKyAgICB7CisgICAgICAgIGlmICggemZTdGFJc0Nvbm5lY3RlZChkZXYpICkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnRpY2tJYnNzUmVjZWl2ZUJlYWNvbisrOyAgLy8gYWRkIDEwbXMKKworICAgICAgICAgICAgaWYgKCAod2QtPnN0YS5pYnNzU2l0ZVN1cnZleVN0YXR1cyA9PSAyKSAmJgorICAgICAgICAgICAgICAgICAod2QtPnRpY2tJYnNzUmVjZWl2ZUJlYWNvbiA9PSAzMDApICYmCisgICAgICAgICAgICAgICAgICh3ZC0+c3RhLmlic3NSZWNlaXZlQmVhY29uQ291bnQgPCAzKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiSXQgaXMgaGFwcGVuISEhIE5vIGVycm9yIG1lc3NhZ2UiKTsKKyAgICAgICAgICAgICAgICB6ZlJlU2V0Q3VycmVudEZyZXF1ZW5jeShkZXYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYod2QtPnN0YS5SZWNlaXZlZFBhY2tldFJhdGVDb3VudGVyIDw9IDApCisgICAgeworICAgICAgICB3ZC0+c3RhLlJlY2VpdmVkUGt0UmF0ZVBlclNlY29uZCA9IHdkLT5zdGEuVG90YWxOdW1iZXJPZlJlY2VpdmVQYWNrZXRzOworCS8vem1fZGVidWdfbXNnMSgiUmVjZWl2ZSBQYWNrZXQgUGVyIFNlY29uZCAgPSAiLCB3ZC0+c3RhLlJlY2VpdmVkUGt0UmF0ZVBlclNlY29uZCk7CisJICAgIGlmICh3ZC0+c3RhLlRvdGFsTnVtYmVyT2ZSZWNlaXZlUGFja2V0cyAhPSAwKQorCSAgICB7CisJICAgICAgICB3ZC0+c3RhLmF2Z1NpemVPZlJlY2VpdmVQYWNrZXRzID0gd2QtPnN0YS5Ub3RhbE51bWJlck9mUmVjZWl2ZUJ5dGVzL3dkLT5zdGEuVG90YWxOdW1iZXJPZlJlY2VpdmVQYWNrZXRzOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCSAgICAgICAgd2QtPnN0YS5hdmdTaXplT2ZSZWNlaXZlUGFja2V0cyA9IDY0MDsKKwkgICAgfQorICAgICAgICB3ZC0+c3RhLlRvdGFsTnVtYmVyT2ZSZWNlaXZlUGFja2V0cyA9IDA7CisgICAgICAgIHdkLT5zdGEuVG90YWxOdW1iZXJPZlJlY2VpdmVCeXRlcyA9IDA7CisgICAgICAgIHdkLT5zdGEuUmVjZWl2ZWRQYWNrZXRSYXRlQ291bnRlciA9IDEwMDsgLypmb3IgYW5vdGhlciAxcyovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHdkLT5zdGEuUmVjZWl2ZWRQYWNrZXRSYXRlQ291bnRlci0tOworICAgIH0KKworCS8qID0+IGV2ZXJ5IDEuMjggc2Vjb25kcyAqLworCWlmKCh3ZC0+dGljayAmIDB4N2YpID09IDB4M2YpCisJeworCQlpZiggd2QtPnN0YS5Ob25OQVBjb3VudCA+IDApCisJCXsKKwkJCXdkLT5zdGEuUlRTSW5BR0dNb2RlID0gVFJVRTsKKwkJCXdkLT5zdGEuTm9uTkFQY291bnQgPSAwOworCQl9CisJCWVsc2UKKwkJeworCQkJd2QtPnN0YS5SVFNJbkFHR01vZGUgPSBGQUxTRTsKKwkJfQorCX0KKworCisKKyAgICAvKiBNYWludGFpbiBtYW5hZ2VtZW50IHRpbWUgdGljayAqLworICAgIHpmTW1BcFRpbWVUaWNrKGRldik7CisgICAgemZNbVN0YVRpbWVUaWNrKGRldik7CisKKyAgICAvL3pmUGh5Q3JUdW5pbmcoZGV2KTsKKworICAgIC8vemZUeFBvd2VyQ29udHJvbChkZXYpOworICAgIHpmSHBIZWFydEJlYXQoZGV2KTsKKworfQorCisKK3ZvaWQgemZEdW1wQnNzTGlzdCh6ZGV2X3QqIGRldikKK3sKKyAgICBzdHJ1Y3QgenNCc3NJbmZvKiBwQnNzSW5mbzsKKyAgICB1OF90ICAgc3RyWzMzXTsKKyAgICB1OF90ICAgaSwgajsKKyAgICB1MzJfdCAgYWRkcjEsIGFkZHIyOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem1fZGVidWdfbXNnMCgiKioqKiogQnNzIHNjYW4gcmVzdWx0ICoqKioqIik7CisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHBCc3NJbmZvID0gd2QtPnN0YS5ic3NMaXN0LmhlYWQ7CisKKyAgICBmb3IoIGk9MDsgaTx3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQ7IGkrKyApCisgICAgeworICAgICAgICBpZiAoIGkgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKyAgICAgICAgfQorCisgICAgICAgIHptX2RlYnVnX21zZzEoIkJTUyAjIiwgaSk7CisgICAgICAgIGZvcihqPTA7IGo8cEJzc0luZm8tPnNzaWRbMV07IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgc3RyW2pdID0gcEJzc0luZm8tPnNzaWRbMitqXTsKKyAgICAgICAgfQorICAgICAgICBzdHJbcEJzc0luZm8tPnNzaWRbMV1dID0gMDsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiU1NJRCA9ICIpOworICAgICAgICB6bV9kZWJ1Z19tc2cwKHN0cik7CisKKyAgICAgICAgYWRkcjEgPSAocEJzc0luZm8tPmJzc2lkWzBdIDw8IDE2KSArIChwQnNzSW5mby0+YnNzaWRbMV0gPDwgOCApCisgICAgICAgICAgICAgICAgKyBwQnNzSW5mby0+YnNzaWRbMl07CisgICAgICAgIGFkZHIyID0gKHBCc3NJbmZvLT5ic3NpZFszXSA8PCAxNikgKyAocEJzc0luZm8tPmJzc2lkWzRdIDw8IDggKQorICAgICAgICAgICAgICAgICsgcEJzc0luZm8tPmJzc2lkWzVdOworICAgICAgICB6bV9kZWJ1Z19tc2cyKCJCc3NpZCA9ICIsIGFkZHIxKTsKKyAgICAgICAgem1fZGVidWdfbXNnMigiICAgICAgICAiLCBhZGRyMik7CisgICAgICAgIHptX2RlYnVnX21zZzEoImZyZXF1ZW5jeSA9ICIsIHBCc3NJbmZvLT5mcmVxdWVuY3kpOworICAgICAgICB6bV9kZWJ1Z19tc2cxKCJzZWN1cml0eSB0eXBlID0gIiwgcEJzc0luZm8tPnNlY3VyaXR5VHlwZSk7CisgICAgICAgIHptX2RlYnVnX21zZzEoIldNRSA9ICIsIHBCc3NJbmZvLT53bWVTdXBwb3J0KTsKKyAgICAgICAgem1fZGVidWdfbXNnMSgiYmVhY29uIGludGVydmFsID0gIiwgcEJzc0luZm8tPmJlYWNvbkludGVydmFsWzBdCisgICAgICAgICAgICAgICAgICAgICAgKyAocEJzc0luZm8tPmJlYWNvbkludGVydmFsWzFdIDw8IDgpKTsKKyAgICAgICAgem1fZGVidWdfbXNnMSgiY2FwYWJpbGl0eSA9ICIsIHBCc3NJbmZvLT5jYXBhYmlsaXR5WzBdCisgICAgICAgICAgICAgICAgICAgICAgKyAocEJzc0luZm8tPmNhcGFiaWxpdHlbMV0gPDwgOCkpOworICAgICAgICBpZiAoIHBCc3NJbmZvLT5zdXBwb3J0ZWRSYXRlc1sxXSA+IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGo9MDsgajxwQnNzSW5mby0+c3VwcG9ydGVkUmF0ZXNbMV07IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMigic3VwcG9ydGVkIHJhdGVzID0gIiwgcEJzc0luZm8tPnN1cHBvcnRlZFJhdGVzWzIral0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yKCBqPTA7IGo8cEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzWzFdOyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cyKCJleHQgc3VwcG9ydGVkIHJhdGVzID0gIiwgcEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzWzIral0pOworICAgICAgICB9CisKKyAgICAgICAgcEJzc0luZm8gPSBwQnNzSW5mby0+bmV4dDsKKyAgICB9CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHptX2RlYnVnX21zZzAoIioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY2ljLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY2ljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg0ZjA3OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jaWMuYwpAQCAtMCwwICsxLDQ5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJjcHJlY29tcC5oIgorI2luY2x1ZGUgInJhdGVjdHJsLmgiCisKKwordm9pZCB6ZlVwZGF0ZUJzc2lkKHpkZXZfdCogZGV2LCB1OF90KiBic3NpZCkKK3sKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8vem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB3ZC0+c3RhLmJzc2lkWzBdID0gYnNzaWRbMF0gKyAoKCh1MTZfdCkgYnNzaWRbMV0pIDw8IDgpOworICAgIHdkLT5zdGEuYnNzaWRbMV0gPSBic3NpZFsyXSArICgoKHUxNl90KSBic3NpZFszXSkgPDwgOCk7CisgICAgd2QtPnN0YS5ic3NpZFsyXSA9IGJzc2lkWzRdICsgKCgodTE2X3QpIGJzc2lkWzVdKSA8PCA4KTsKKyAgICAvL3ptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICB6ZkhwU2V0QnNzaWQoZGV2LCBic3NpZCk7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmUmVzZXRTdXBwb3J0UmF0ZSAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBSZXNldCBzdXBwb3J0IHJhdGUgdG8gZGVmYXVsdCB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdHlwZTogWk1fREVGQVVMVF9TVVBQT1JUX1JBVEVfWkVSTyAgICAgICA9PiByZXNldCB0byB6ZXJvICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgIFpNX0RFRkFVTFRfU1VQUE9SVF9SQVRFX0RJU0NPTk5FQ1QgPT4gcmVzZXQgdG8gZGlzY29ubmVjdCBzdGF0dXMgICAgICAqLworLyogICAgICAgICAgICBaTV9ERUZBVUxUX1NVUFBPUlRfUkFURV9JQlNTX0IgICAgID0+IHJlc2V0IHRvIElCU1MgY3JlYXRvcihiIG1vZGUpICAgKi8KKy8qICAgICAgICAgICAgWk1fREVGQVVMVF9TVVBQT1JUX1JBVEVfSUJTU19BRyAgICA9PiByZXNldCB0byBJQlNTIGNyZWF0b3IoYS9nIG1vZGUpICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZSZXNldFN1cHBvcnRSYXRlKHpkZXZfdCogZGV2LCB1OF90IHR5cGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc3dpdGNoKHR5cGUpCisgICAgeworICAgIGNhc2UgWk1fREVGQVVMVF9TVVBQT1JUX1JBVEVfWkVSTzoKKyAgICAgICAgd2QtPmJSYXRlID0gMDsKKyAgICAgICAgd2QtPmJSYXRlQmFzaWMgPSAwOworICAgICAgICB3ZC0+Z1JhdGUgPSAwOworICAgICAgICB3ZC0+Z1JhdGVCYXNpYyA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgWk1fREVGQVVMVF9TVVBQT1JUX1JBVEVfRElTQ09OTkVDVDoKKyAgICAgICAgd2QtPmJSYXRlID0gMHhmOworICAgICAgICB3ZC0+YlJhdGVCYXNpYyA9IDB4ZjsKKyAgICAgICAgd2QtPmdSYXRlID0gMHhmZjsKKyAgICAgICAgd2QtPmdSYXRlQmFzaWMgPSAweDE1OworICAgICAgICBicmVhazsKKyAgICBjYXNlIFpNX0RFRkFVTFRfU1VQUE9SVF9SQVRFX0lCU1NfQjoKKyAgICAgICAgd2QtPmJSYXRlID0gMHhmOworICAgICAgICB3ZC0+YlJhdGVCYXNpYyA9IDB4ZjsKKyAgICAgICAgd2QtPmdSYXRlID0gMDsKKyAgICAgICAgd2QtPmdSYXRlQmFzaWMgPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFpNX0RFRkFVTFRfU1VQUE9SVF9SQVRFX0lCU1NfQUc6CisgICAgICAgIHdkLT5iUmF0ZSA9IDB4ZjsKKyAgICAgICAgd2QtPmJSYXRlQmFzaWMgPSAweGY7CisgICAgICAgIHdkLT5nUmF0ZSA9IDB4ZmY7CisgICAgICAgIHdkLT5nUmF0ZUJhc2ljID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIHpmVXBkYXRlU3VwcG9ydFJhdGUoemRldl90KiBkZXYsIHU4X3QqIHJhdGVBcnJheSkKK3sKKyAgICB1OF90IGJSYXRlPTAsIGJSYXRlQmFzaWM9MCwgZ1JhdGU9MCwgZ1JhdGVCYXNpYz0wOworICAgIHU4X3QgbGVuZ3RoID0gcmF0ZUFycmF5WzFdOworICAgIHU4X3QgaSwgajsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGZvcihpPTI7IGk8bGVuZ3RoKzI7IGkrKykKKyAgICB7CisgICAgICAgIGZvcihqPTA7IGo8NDsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIChyYXRlQXJyYXlbaV0gJiAweDdmKSA9PSB6ZzExYlJhdGVUYmxbal0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJSYXRlIHw9ICgxIDw8IGopOworICAgICAgICAgICAgICAgIGlmICggcmF0ZUFycmF5W2ldICYgMHg4MCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiUmF0ZUJhc2ljIHw9ICgxIDw8IGopOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggaiA9PSA0ICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKGo9MDsgajw4OyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCAocmF0ZUFycmF5W2ldICYgMHg3ZikgPT0gemcxMWdSYXRlVGJsW2pdICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGdSYXRlIHw9ICgxIDw8IGopOworICAgICAgICAgICAgICAgICAgICBpZiAoIHJhdGVBcnJheVtpXSAmIDB4ODAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBnUmF0ZUJhc2ljIHw9ICgxIDw8IGopOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICB3ZC0+YlJhdGUgfD0gYlJhdGU7CisgICAgd2QtPmJSYXRlQmFzaWMgfD0gYlJhdGVCYXNpYzsKKyAgICB3ZC0+Z1JhdGUgfD0gZ1JhdGU7CisgICAgd2QtPmdSYXRlQmFzaWMgfD0gZ1JhdGVCYXNpYzsKK30KKwordThfdCB6ZklzR09ubHlNb2RlKHpkZXZfdCogZGV2LCB1MTZfdCAgZnJlcXVlbmN5LCB1OF90KiByYXRlQXJyYXkpCit7CisgICAgdThfdCBsZW5ndGggPSByYXRlQXJyYXlbMV07CisgICAgdThfdCBpLCBqOworCisgICAgaWYgKGZyZXF1ZW5jeSA8IDMwMDApIHsKKyAgICAgICAgZm9yIChpID0gMjsgaSA8IGxlbmd0aCsyOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoICgocmF0ZUFycmF5W2ldICYgMHg3ZikgPT0gemcxMWdSYXRlVGJsW2pdKQorICAgICAgICAgICAgICAgICAgICAgJiYgKHJhdGVBcnJheVtpXSAmIDB4ODApICkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCB6ZkdhdGhlckJNb2RlKHpkZXZfdCogZGV2LCB1OF90KiByYXRlQXJyYXksIHU4X3QqIGV4dHJhdGVBcnJheSkKK3sKKyAgICB1OF90IGdhdGhlckJNb2RlW1pNX01BWF9TVVBQX1JBVEVTX0lFX1NJWkUgKyAyXTsKKyAgICB1OF90IGksIGosIGsgPSAwOworICAgIHU4X3QgbGVuZ3RoOworCisgICAgZ2F0aGVyQk1vZGVbMF0gPSBaTV9XTEFOX0VJRF9TVVBQT1JUX1JBVEU7CisgICAgZ2F0aGVyQk1vZGVbMV0gPSAwOworCisgICAgbGVuZ3RoID0gcmF0ZUFycmF5WzFdOworICAgIGZvciAoaSA9IDI7IGkgPCBsZW5ndGgrMjsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKKyAgICAgICAgICAgIGlmICggKHJhdGVBcnJheVtpXSAmIDB4N2YpID09IHpnMTFiUmF0ZVRibFtqXSApIHsKKyAgICAgICAgICAgICAgICBnYXRoZXJCTW9kZVsyK2tdID0gcmF0ZUFycmF5W2ldOworCisgICAgICAgICAgICAgICAgZ2F0aGVyQk1vZGVbMV0rKzsKKyAgICAgICAgICAgICAgICBrKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsZW5ndGggPSBleHRyYXRlQXJyYXlbMV07CisgICAgZm9yIChpID0gMjsgaSA8IGxlbmd0aCsyOyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworICAgICAgICAgICAgaWYgKCAoZXh0cmF0ZUFycmF5W2ldICYgMHg3ZikgPT0gemcxMWJSYXRlVGJsW2pdICkgeworICAgICAgICAgICAgICAgIGdhdGhlckJNb2RlWzIra10gPSBleHRyYXRlQXJyYXlbaV07CisKKyAgICAgICAgICAgICAgICBnYXRoZXJCTW9kZVsxXSsrOworICAgICAgICAgICAgICAgIGsrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGV4dHJhdGVBcnJheVswXSA9IGV4dHJhdGVBcnJheVsxXSA9IDA7CisgICAgemZNZW1vcnlDb3B5KHJhdGVBcnJheSwgZ2F0aGVyQk1vZGUsIGdhdGhlckJNb2RlWzFdKzIpOworfQorCit1MTZfdCB6ZkdldFJhbmRvbU51bWJlcih6ZGV2X3QqIGRldiwgdTE2X3QgaW5pdFZhbHVlKQoreworI2lmIDAKKyAgICAvKiBDb21waWxlci9MaW5rZXIgZXJyb3Igb24gTGludXggKi8KKyAgICBpZiAoIGluaXRWYWx1ZSApCisgICAgeworICAgICAgICBzcmFuZChpbml0VmFsdWUpOworICAgIH0KKworICAgIHJldHVybiAoKHUxNl90KXJhbmQoKSk7CisjZW5kaWYKKyAgICByZXR1cm4gMDsKK30KKwordThfdCB6ZlBTRGV2aWNlU2xlZXAoemRldl90KiBkZXYpCit7CisgICAgLy96bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBlbnRlciBQUyBtb2RlICovCisKKyAgICByZXR1cm4gMDsKK30KKwordThfdCB6Y09mZG1QaHlDcnRsVG9SYXRlW10gPQoreworICAgIC8qIDB4OD00OE0sIDB4OT0yNE0sIDB4YT0xMk0sIDB4Yj02TSwgMHhjPTU0TSwgMHhkPTM2TSwgMHhlPTE4TSwgMHhmPTlNICovCisgICAgICAgICAgICAxMCwgICAgICAgOCwgICAgICAgNiwgICAgICA0LCAgICAgIDExLCAgICAgICA5LCAgICAgICA3LCAgICAgIDUKK307CisKK3U4X3QgemZQaHlDdHJsVG9SYXRlKHUzMl90IHBoeUN0cmwpCit7CisgICAgdTMyX3QgbXQsIG1jcywgc2c7CisgICAgdThfdCByYXRlID0gMDsKKworICAgIG10ID0gcGh5Q3RybCAmIDB4MzsKKyAgICBtY3MgPSAocGh5Q3RybD4+MTgpICYgMHgzZjsKKyAgICBzZyA9IChwaHlDdHJsPj4zMSkgJiAweDE7CisKKyAgICBpZiAoKG10ID09IDApICYmIChtY3MgPD0zKSkKKyAgICB7CisgICAgICAgIHJhdGUgPSAodThfdCltY3M7CisgICAgfQorICAgIGVsc2UgaWYgKChtdCA9PSAxKSAmJiAobWNzID49IDB4OCkgJiYgKG1jcyA8PSAweGYpKQorICAgIHsKKyAgICAgICAgcmF0ZSA9IHpjT2ZkbVBoeUNydGxUb1JhdGVbbWNzLThdOworICAgIH0KKyAgICBlbHNlIGlmICgobXQgPT0gMikgJiYgKG1jcyA8PSAxNSkpCisgICAgeworICAgICAgICByYXRlID0gKHU4X3QpbWNzICsgMTI7CisgICAgICAgIGlmKHNnKSB7CisgICAgICAgICAgICBpZiAobWNzICE9IDcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmF0ZSA9ICh1OF90KW1jcyArIDEyICsgMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgLy9NQ1M3LVNHCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmF0ZSA9ICh1OF90KTMwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJhdGU7Cit9CisKKwordm9pZCB6ZkNvcmVFdmVudCh6ZGV2X3QqIGRldiwgdTE2X3QgZXZlbnQsIHU4X3QqIHJzcCkKK3sKKyAgICB1MTZfdCBpOworICAgIHpidWZfdCogcHNCdWY7CisgICAgdThfdCBtb3JlRGF0YTsKKyAgICB1OF90IHZhcCA9IDA7CisgICAgdThfdCBwZWVySWR4OworICAgIHM4X3QgcmVzOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisKKyAgICBpZiAoZXZlbnQgPT0gMCkgLy9CZWFjb24gRXZlbnQKKyAgICB7CisgICAgICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfQVAgKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkFwU2VuZEJlYWNvbihkZXYpOworCisgICAgICAgICAgICBpZiAod2QtPkN1cnJlbnREdGltQ291bnQgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBUT0RPIDogU2VuZCBxdWV1ZWQgYnJvYWRjYXN0IGZyYW1lcyBhdCBCQy9NQyBldmVudCAqLworICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwc0J1ZiA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIG1vcmVEYXRhID0gMDsKKyAgICAgICAgICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5hcC5iY21jVGFpbFt2YXBdICE9IHdkLT5hcC5iY21jSGVhZFt2YXBdKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3ptX21zZzBfbW0oWk1fTFZfMCwgIlNlbmQgQkNNQyBmcmFtZXMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBzQnVmID0gd2QtPmFwLmJjbWNBcnJheVt2YXBdW3dkLT5hcC5iY21jSGVhZFt2YXBdXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5hcC5iY21jSGVhZFt2YXBdID0gKHdkLT5hcC5iY21jSGVhZFt2YXBdICsgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiAoWk1fQkNNQ19BUlJBWV9TSVpFIC0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2QtPmFwLmJjbWNUYWlsW3ZhcF0gIT0gd2QtPmFwLmJjbWNIZWFkW3ZhcF0pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yZURhdGEgPSAweDIwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgICAgIGlmIChwc0J1ZiAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPIDogY29uZmlnIG1vcmVEYXRhIGJpdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgemZUeFNlbmRFdGgoZGV2LCBwc0J1ZiwgMCwgWk1fRVhURVJOQUxfQUxMT0NfQlVGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlRGF0YSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IHdoaWxlKHBzQnVmICE9IE5VTEwpOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTVEEgbW9kZSAqLworICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLnBvd2VyU2F2ZU1vZGUgPiBaTV9TVEFfUFNfTk9ORSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogc2VuZCBxdWV1ZWQgcGFja2V0cyAqLworICAgICAgICAgICAgICAgIGZvcihpPTA7IGk8d2QtPnN0YS5zdGFQU0RhdGFDb3VudDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgemZUeFNlbmRFdGgoZGV2LCB3ZC0+c3RhLnN0YVBTRGF0YVF1ZXVlW2ldLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9FWFRFUk5BTF9BTExPQ19CVUYsIDApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdkLT5zdGEuc3RhUFNEYXRhQ291bnQgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmU3RhU2VuZEJlYWNvbihkZXYpOworICAgICAgICAgICAgICAgIHdkLT5zdGEuaWJzc0F0aW1UaW1lciA9IFpNX0JJVF8xNSB8IHdkLT5zdGEuYXRpbVdpbmRvdzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgemZQb3dlclNhdmluZ01nclByZVRCVFRJbnRlcnJ1cHQoZGV2KTsKKyAgICAgICAgfQorICAgIH0gLy9pZiAoZXZlbnQgPT0gMCkgLy9CZWFjb24gRXZlbnQKKyAgICBlbHNlIGlmIChldmVudCA9PSAxKSAvL1JldHJ5IGNvbXBsZXRlZCBldmVudAorICAgIHsKKyAgICAgICAgdTMyX3QgcmV0cnlSYXRlOworCisgICAgICAgIHJldHJ5UmF0ZSA9ICh1MzJfdCkocnNwWzZdKSArICgoKHUzMl90KShyc3BbN10pKTw8OCkKKyAgICAgICAgICAgICAgICArICgoKHUzMl90KShyc3BbOF0pKTw8MTYpICsgKCgodTMyX3QpKHJzcFs5XSkpPDwyNCk7CisgICAgICAgIC8qIERlZ3JhZGUgVHggUmF0ZSAqLworICAgICAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICBpZiAoKGk9emZBcEZpbmRTdGEoZGV2LCAodTE2X3QqKXJzcCkpICE9IDB4ZmZmZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsVHhGYWlsRXZlbnQoZGV2LCAmd2QtPmFwLnN0YVRhYmxlW2ldLnJjQ2VsbCwgMCwodTMyX3QpemZQaHlDdHJsVG9SYXRlKHJldHJ5UmF0ZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICByZXMgPSB6ZlN0YUZpbmRPcHBvc2l0ZUJ5TUFDQWRkcihkZXYsICh1MTZfdCopcnNwLCAmcGVlcklkeCk7CisgICAgICAgICAgICBpZiAoIHJlcyA9PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsVHhGYWlsRXZlbnQoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9bcGVlcklkeF0ucmNDZWxsLCAwLCh1MzJfdCl6ZlBoeUN0cmxUb1JhdGUocmV0cnlSYXRlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB9CisgICAgfSAvL2Vsc2UgaWYgKGV2ZW50ID09IDEpIC8vUmV0cnkgY29tcGxldGVkIGV2ZW50CisgICAgZWxzZSBpZiAoZXZlbnQgPT0gMikgLy9UeCBGYWlsIGV2ZW50CisgICAgeworICAgICAgICB1MzJfdCByZXRyeVJhdGU7CisKKyAgICAgICAgcmV0cnlSYXRlID0gKHUzMl90KShyc3BbNl0pICsgKCgodTMyX3QpKHJzcFs3XSkpPDw4KQorICAgICAgICAgICAgICAgICsgKCgodTMyX3QpKHJzcFs4XSkpPDwxNikgKyAoKCh1MzJfdCkocnNwWzldKSk8PDI0KTsKKworICAgICAgICAvKiBEZWdyYWRlIFR4IFJhdGUgKi8KKyAgICAgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgICAgICB7CisgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgaWYgKChpPXpmQXBGaW5kU3RhKGRldiwgKHUxNl90Kilyc3ApKSAhPSAweGZmZmYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZSYXRlQ3RybFR4RmFpbEV2ZW50KGRldiwgJndkLT5hcC5zdGFUYWJsZVtpXS5yY0NlbGwsIDAsKHUzMl90KXpmUGh5Q3RybFRvUmF0ZShyZXRyeVJhdGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgIHpmQXBTZW5kRmFpbHVyZShkZXYsIHJzcCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgcmVzID0gemZTdGFGaW5kT3Bwb3NpdGVCeU1BQ0FkZHIoZGV2LCAodTE2X3QqKXJzcCwgJnBlZXJJZHgpOworICAgICAgICAgICAgaWYgKCByZXMgPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZSYXRlQ3RybFR4RmFpbEV2ZW50KGRldiwgJndkLT5zdGEub3Bwb3NpdGVJbmZvW3BlZXJJZHhdLnJjQ2VsbCwgMCwodTMyX3QpemZQaHlDdHJsVG9SYXRlKHJldHJ5UmF0ZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgfQorICAgIH0gLy9lbHNlIGlmIChldmVudCA9PSAyKSAvL1R4IEZhaWwgZXZlbnQKKyAgICBlbHNlIGlmIChldmVudCA9PSAzKSAvL1R4IENvbXAgZXZlbnQKKyAgICB7CisgICAgICAgIHUzMl90IHJldHJ5UmF0ZTsKKworICAgICAgICByZXRyeVJhdGUgPSAodTMyX3QpKHJzcFs2XSkgKyAoKCh1MzJfdCkocnNwWzddKSk8PDgpCisgICAgICAgICAgICAgICAgKyAoKCh1MzJfdCkocnNwWzhdKSk8PDE2KSArICgoKHUzMl90KShyc3BbOV0pKTw8MjQpOworCisgICAgICAgIC8qIFRPRE8gOiBUeCBjb21wbGV0ZWQsIHVzZWQgZm9yIHJhdGUgY29udHJvbCBwcm9iaW5nICovCisgICAgICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICAgICAgeworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIGlmICgoaT16ZkFwRmluZFN0YShkZXYsICh1MTZfdCopcnNwKSkgIT0gMHhmZmZmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmUmF0ZUN0cmxUeFN1Y2Nlc3NFdmVudChkZXYsICZ3ZC0+YXAuc3RhVGFibGVbaV0ucmNDZWxsLCB6ZlBoeUN0cmxUb1JhdGUocmV0cnlSYXRlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHJlcyA9IHpmU3RhRmluZE9wcG9zaXRlQnlNQUNBZGRyKGRldiwgKHUxNl90Kilyc3AsICZwZWVySWR4KTsKKyAgICAgICAgICAgIGlmICggcmVzID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmUmF0ZUN0cmxUeFN1Y2Nlc3NFdmVudChkZXYsICZ3ZC0+c3RhLm9wcG9zaXRlSW5mb1twZWVySWR4XS5yY0NlbGwsIHpmUGh5Q3RybFRvUmF0ZShyZXRyeVJhdGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIH0KKyAgICB9IC8vZWxzZSBpZiAoZXZlbnQgPT0gMykgLy9UeCBDb21wIGV2ZW50CisgICAgZWxzZSBpZiAoZXZlbnQgPT0gNCkgLy9CQSBmYWlsZWQgY291bnQKKyAgICB7CisgICAgICAgIHUzMl90IGZhaWw7CisgICAgICAgIHUzMl90IHJhdGU7CisgICAgICAgIHBlZXJJZHggPSAwOworCisgICAgICAgIGZhaWw9KCh1MzJfdCopcnNwKVswXSAmIDB4RkZGRjsKKyAgICAgICAgcmF0ZT0oKHUzMl90Kilyc3ApWzBdID4+IDE2OworCisgICAgICAgIGlmIChyYXRlID4gMTUpIHsKKyAgICAgICAgICAgIHJhdGUgPSAocmF0ZSAmIDB4RikgKyAxMiArIDI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByYXRlID0gcmF0ZSArIDEyOworICAgICAgICB9CisKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgemZSYXRlQ3RybFR4RmFpbEV2ZW50KGRldiwgJndkLT5zdGEub3Bwb3NpdGVJbmZvW3BlZXJJZHhdLnJjQ2VsbCwgKHU4X3QpcmF0ZSwgZmFpbCk7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorfQorCit2b2lkIHpmQmVhY29uQ2ZnSW50ZXJydXB0KHpkZXZfdCogZGV2LCB1OF90KiByc3ApCit7CisgICAgdTMyX3QgdHhCZWFjb25Db3VudGVyOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUyApCisgICAgeworICAgICAgICB0eEJlYWNvbkNvdW50ZXIgPSAqKCh1MzJfdCAqKXJzcCk7CisgICAgICAgIGlmICggd2QtPnN0YS5iZWFjb25UeENudCAhPSB0eEJlYWNvbkNvdW50ZXIgKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLnR4QmVhY29uSW5kID0gMTsKKworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHdkLT50aWNrSWJzc1NlbmRCZWFjb24gPSAwOworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5zdGEudHhCZWFjb25JbmQgPSAwOworICAgICAgICB9CisKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19ERUxBWUVEX0pPSU5fSU5ESUNBVElPTgorICAgICAgICBpZiAoIHdkLT5zdGEudHhCZWFjb25JbmQgJiYgd2QtPnN0YS5pYnNzRGVsYXllZEluZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3ZC0+emZjYklic3NQYXJ0bmVyTm90aWZ5ICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnpmY2JJYnNzUGFydG5lck5vdGlmeShkZXYsIDEsICZ3ZC0+c3RhLmlic3NEZWxheWVkSW5kRXZlbnQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3ZC0+c3RhLmlic3NEZWxheWVkSW5kID0gMDsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgd2QtPnN0YS5iZWFjb25UeENudCA9IHR4QmVhY29uQ291bnRlcjsKKworICAgICAgICAvLyBOZWVkIHRvIGNoZWNrIGlmIHRoZSB0aW1lIGlzIGV4cGlyZWQgYWZ0ZXIgQVRJTSB3aW5kb3c/PworCisgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYnVmZmVyZWQgYW55IGRhdGEgZm9yIHRob3NlIHN0YXRpb25zIHRoYXQgYXJlIHNsZWVwaW5nCisgICAgICAgIC8vIElmIGl0J3MgdHJ1ZSwgdGhlbiB0cmFuc21pdHRpbmcgQVRJTSBwa3QgdG8gbm90aWZ5IHRoZW0KKworI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1BTCisgICAgICAgIC8vIFRPRE86IE5lZWQgdG8gY2hlY2sgaWYgdGhlIHN0YXRpb24gcmVjZWl2ZSBvdXIgQVRJTSBwa3Q/Pz8KKyAgICAgICAgemZTdGFJYnNzUFNTZW5kKGRldik7CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLmF0aW1XaW5kb3cgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFdlIHdvbid0IHJlY2VpdmUgdGhlIGVuZCBvZiBBVElNIGlzciBzbyB3ZSBmYWtlIGl0CisgICAgICAgICAgICB6ZlBvd2VyU2F2aW5nTWdyQXRpbVdpbkV4cGlyZWQoZGV2KTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorfQorCit2b2lkIHpmRW5kT2ZBdGltV2luZG93SW50ZXJydXB0KHpkZXZfdCogZGV2KQoreworI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1BTCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTICkKKyAgICB7CisgICAgICAgIC8vIFRyYW5zbWl0IGFueSBxdWV1ZWQgcGt0IGZvciB0aGUgc3RhdGlvbnMhIQorICAgICAgICB6ZlBvd2VyU2F2aW5nTWdyQXRpbVdpbkV4cGlyZWQoZGV2KTsKKyAgICB9CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jaW5pdC5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2Npbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY4NTNjZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jaW5pdC5jCkBAIC0wLDAgKzEsMTkxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogaW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBpbml0IGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgImNwcmVjb21wLmgiCisjaW5jbHVkZSAiLi4vaGFsL2hwcmVnLmgiCisKK2V4dGVybiBjb25zdCB1OF90IHpjVXBUb0FjWzhdOworCit1MTZfdCB6Y0luZGV4dG9SYXRlQkdbMTZdID0gezEwMDAsIDIwMDAsIDU1MDAsIDExMDAwLCAwLCAwLCAwLCAwLCA0ODAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDAwMCwgMTIwMDAsIDYwMDAsIDU0MDAwLCAzNjAwMCwgMTgwMDAsIDkwMDB9OwordTMyX3QgemNJbmRleHRvUmF0ZU4yMExbMTZdID0gezY1MDAsIDEzMDAwLCAxOTUwMCwgMjYwMDAsIDM5MDAwLCA1MjAwMCwgNTg1MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NTAwMCwgMTMwMDAsIDI2MDAwLCAzOTAwMCwgNTIwMDAsIDc4MDAwLCAxMDQwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTcwMDAsIDEzMDAwMH07Cit1MzJfdCB6Y0luZGV4dG9SYXRlTjIwU1sxNl0gPSB7NzIwMCwgMTQ0MDAsIDIxNzAwLCAyODkwMCwgNDMzMDAsIDU3ODAwLCA2NTAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyMjAwLCAxNDQwMCwgMjg5MDAsIDQzMzAwLCA1NzgwMCwgODY3MDAsIDExNTYwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzMDAwMCwgMTQ0NDAwfTsKK3UzMl90IHpjSW5kZXh0b1JhdGVONDBMWzE2XSA9IHsxMzUwMCwgMjcwMDAsIDQwNTAwLCA1NDAwMCwgODEwMDAsIDEwODAwMCwgMTIxNTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM1MDAwLCAyNzAwMCwgNTQwMDAsIDgxMDAwLCAxMDgwMDAsIDE2MjAwMCwgMjE2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQzMDAwLCAyNzAwMDB9OwordTMyX3QgemNJbmRleHRvUmF0ZU40MFNbMTZdID0gezE1MDAwLCAzMDAwMCwgNDUwMDAsIDYwMDAwLCA5MDAwMCwgMTIwMDAwLCAxMzUwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTAwMDAsIDMwMDAwLCA2MDAwMCwgOTAwMDAsIDEyMDAwMCwgMTgwMDAwLCAyNDAwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNzAwMDAsIDMwMDAwMH07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlR4R2VuV2xhbkhlYWRlciAgICAgICAgICAgKi8KKy8qICAgICAgR2VuZXJhdGUgV0xBTiBNQUMgaGVhZGVyIGFuZCBMTEMgaGVhZGVyLiAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGJ1ZmZlciBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBpZCA6IEluZGV4IG9mIFR4RCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcG9ydCA6IFdMQU4gcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgbGVuZ3RoIG9mIHJlbW92ZWQgRXRoZXJuZXQgaGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiAgICAgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuNSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmVHhHZW5XbGFuSGVhZGVyKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIGhlYWRlciwgdTE2X3Qgc2VxLAorICAgICAgICAgICAgICAgICAgICAgICAgdThfdCBmbGFnLCB1MTZfdCBwbHVzTGVuLCB1MTZfdCBtaW51c0xlbiwgdTE2X3QgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90KiBkYSwgdTE2X3QqIHNhLCB1OF90IHVwLCB1MTZfdCAqbWljTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgdTE2X3QqIHNuYXAsIHUxNl90IHNuYXBMZW4sIHN0cnVjdCBhZ2dDb250cm9sICphZ2dDb250cm9sKQoreworCisgICAgdTE2X3QgbGVuOworICAgIHUxNl90IG1hY0N0cmw7CisgICAgdTMyX3QgcGh5Q3RybDsKKyAgICB1MTZfdCBobGVuID0gMTY7CisgICAgdTE2X3QgaWN2TGVuID0gMDsKKyAgICB1MTZfdCB3ZHNQb3J0SWQ7CisgICAgdTE2X3QgdmFwID0gMDsKKyAgICB1MTZfdCBtY3MgPSAwOworICAgIHUxNl90IG10ID0gMDsKKyAgICB1OF90ICBxb3NUeXBlOworICAgIHU4X3QgIGIxLCBiMjsKKyAgICB1MTZfdCB3ZHNQb3J0OworICAgIHU4X3QgIGVuY0V4ZW1wdGlvbkFjdGlvblR5cGU7CisgICAgdTE2X3QgcmF0ZVByb2JpbmdGbGFnID0gMDsKKyAgICB1OF90ICB0a2lwRnJhbWVPZmZzZXQgPSAwOworCisjaWZkZWYgWk1fRU5BQkxFX0lCU1NfV1BBMlBTSworICAgIHU4X3QgICAgcmVzLCBwZWVySWR4OworICAgIHU4X3QgICAgdXNlcklkeD0wOworICAgIHUxNl90ICAgKml2MTY7CisgICAgdTMyX3QgICAqaXYzMjsKKyNlbmRpZgorCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAvKiBHZW5lcmF0ZSBXTEFOIGhlYWRlciAqLworICAgIC8qIEZyYW1lIGNvbnRyb2wgKi8KKyAgICBoZWFkZXJbNF0gPSAweDAwMDggfCAoZmxhZzw8OCk7CisgICAgLyogRHVyYXRpb24gKi8KKyAgICBoZWFkZXJbNV0gPSAweDAwMDA7CisKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUpCisgICAgeworICAgICAgICAvKiBUb0RTIGJpdCAqLworICAgICAgICBoZWFkZXJbNF0gfD0gMHgwMTAwOworCisgICAgICAgIC8qU29tZXRpbWVzIHdlIHdha2UgdXAgdG8gdHgvcnggYnV0IEFQIHN0aWxsIHRoaW5rIHdlIGFyZSBzbGVlcGluZywgc28gc3RpbGwgbmVlZCB0byBzZXQgdGhpcyBiaXQqLworICAgICAgICBpZiAoIHpmUG93ZXJTYXZpbmdNZ3JJc1NsZWVwaW5nKGRldikgfHwgd2QtPnN0YS5wc01nci50ZW1wV2FrZVVwID09IDEgKQorICAgICAgICB7CisgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHgxMDAwOworICAgICAgICB9CisKKyAgICAgICAgLyogQWRkcmVzcyAxID0gQlNTSUQgKi8KKyAgICAgICAgaGVhZGVyWzZdID0gd2QtPnN0YS5ic3NpZFswXTsKKyAgICAgICAgaGVhZGVyWzddID0gd2QtPnN0YS5ic3NpZFsxXTsKKyAgICAgICAgaGVhZGVyWzhdID0gd2QtPnN0YS5ic3NpZFsyXTsKKyAgICAgICAgLyogQWRkcmVzcyAzID0gREEgKi8KKyAgICAgICAgaGVhZGVyWzEyXSA9IGRhWzBdOworICAgICAgICBoZWFkZXJbMTNdID0gZGFbMV07CisgICAgICAgIGhlYWRlclsxNF0gPSBkYVsyXTsKKyAgICB9CisgICAgZWxzZSBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfUFNFVURPKQorICAgIHsKKyAgICAgICAgLyogQWRkcmVzcyAxID0gREEgKi8KKyAgICAgICAgaGVhZGVyWzZdID0gZGFbMF07CisgICAgICAgIGhlYWRlcls3XSA9IGRhWzFdOworICAgICAgICBoZWFkZXJbOF0gPSBkYVsyXTsKKyAgICAgICAgLyogQWRkcmVzcyAzID0gMDA6MDA6MDA6MDA6MDA6MDAgKi8KKyAgICAgICAgaGVhZGVyWzEyXSA9IDA7CisgICAgICAgIGhlYWRlclsxM10gPSAwOworICAgICAgICBoZWFkZXJbMTRdID0gMDsKKworICAgICAgICAvKiBQU0VVRE8gdGVzdCA6IFdEUyAqLworICAgICAgICBpZiAod2QtPmVuYWJsZVdEUykKKyAgICAgICAgeworICAgICAgICAgICAgLyogVG9EUyBhbmQgRnJvbURTIGJpdCAqLworICAgICAgICAgICAgaGVhZGVyWzRdIHw9IDB4MDMwMDsKKworICAgICAgICAgICAgLyogQWRkcmVzcyA0ID0gU0EgKi8KKyAgICAgICAgICAgIGhlYWRlclsxNl0gPSAwOworICAgICAgICAgICAgaGVhZGVyWzE3XSA9IDA7CisgICAgICAgICAgICBoZWFkZXJbMThdID0gMDsKKworICAgICAgICAgICAgaGxlbiA9IDE5OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MpCisgICAgeworICAgICAgICAvKiBBZGRyZXNzIDEgPSBEQSAqLworICAgICAgICBoZWFkZXJbNl0gPSBkYVswXTsKKyAgICAgICAgaGVhZGVyWzddID0gZGFbMV07CisgICAgICAgIGhlYWRlcls4XSA9IGRhWzJdOworICAgICAgICAvKiBBZGRyZXNzIDMgPSBCU1NJRCAqLworICAgICAgICBoZWFkZXJbMTJdID0gd2QtPnN0YS5ic3NpZFswXTsKKyAgICAgICAgaGVhZGVyWzEzXSA9IHdkLT5zdGEuYnNzaWRbMV07CisgICAgICAgIGhlYWRlclsxNF0gPSB3ZC0+c3RhLmJzc2lkWzJdOworCisjaWZkZWYgWk1fRU5BQkxFX0lCU1NfV1BBMlBTSworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICByZXMgPSB6ZlN0YUZpbmRPcHBvc2l0ZUJ5TUFDQWRkcihkZXYsIGRhLCAmcGVlcklkeCk7CisgICAgICAgIGlmKHJlcyA9PSAwKSAvLyBGaW5kIG9wcG9zaXRlIGluIG91ciBPcHBvc2l0ZUluZm8gU3RydWN0dXJlICEKKyAgICAgICAgeworICAgICAgICAgICAgdXNlcklkeCA9IHBlZXJJZHg7CisgICAgICAgIH0KKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyNlbmRpZgorICAgIH0KKyAgICBlbHNlIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICB7CisgICAgICAgIGlmIChwb3J0IDwgMHgyMCkKKyAgICAgICAgLyogQVAgbW9kZSAqLworICAgICAgICB7CisgICAgICAgICAgICAvKiBGcm9tRFMgYml0ICovCisgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHgwMjAwOworCisgICAgICAgICAgICAvKiBBZGRyZXNzIDEgPSBEQSAqLworICAgICAgICAgICAgaGVhZGVyWzZdID0gZGFbMF07CisgICAgICAgICAgICBoZWFkZXJbN10gPSBkYVsxXTsKKyAgICAgICAgICAgIGhlYWRlcls4XSA9IGRhWzJdOworICAgICAgICAgICAgLyogQWRkcmVzcyAzID0gU0EgKi8KKyAgICAgICAgICAgIGhlYWRlclsxMl0gPSBzYVswXTsKKyAgICAgICAgICAgIGhlYWRlclsxM10gPSBzYVsxXTsKKyAgICAgICAgICAgIGhlYWRlclsxNF0gPSBzYVsyXTsKKworICAgICAgICAgICAgaWYgKHBvcnQgPCBaTV9NQVhfQVBfU1VQUE9SVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXAgPSBwb3J0OworICAgICAgICAgICAgICAgIGhlYWRlclsxNF0gKz0gKHZhcDw8OCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAvKiBXRFMgcG9ydCAqLworICAgICAgICB7CisgICAgICAgICAgICAvKiBUb0RTIGFuZCBGcm9tRFMgYml0ICovCisgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHgwMzAwOworCisgICAgICAgICAgICB3ZHNQb3J0SWQgPSBwb3J0IC0gMHgyMDsKKworICAgICAgICAgICAgLyogQWRkcmVzcyAxID0gUkEgKi8KKyAgICAgICAgICAgIGhlYWRlcls2XSA9IHdkLT5hcC53ZHMubWFjQWRkclt3ZHNQb3J0SWRdWzBdOworICAgICAgICAgICAgaGVhZGVyWzddID0gd2QtPmFwLndkcy5tYWNBZGRyW3dkc1BvcnRJZF1bMV07CisgICAgICAgICAgICBoZWFkZXJbOF0gPSB3ZC0+YXAud2RzLm1hY0FkZHJbd2RzUG9ydElkXVsyXTsKKyAgICAgICAgICAgIC8qIEFkZHJlc3MgMyA9IERBICovCisgICAgICAgICAgICBoZWFkZXJbMTJdID0gZGFbMF07CisgICAgICAgICAgICBoZWFkZXJbMTNdID0gZGFbMV07CisgICAgICAgICAgICBoZWFkZXJbMTRdID0gZGFbMl07CisgICAgICAgICAgICAvKiBBZGRyZXNzIDQgPSBTQSAqLworICAgICAgICAgICAgaGVhZGVyWzE2XSA9IHNhWzBdOworICAgICAgICAgICAgaGVhZGVyWzE3XSA9IHNhWzFdOworICAgICAgICAgICAgaGVhZGVyWzE4XSA9IHNhWzJdOworCisgICAgICAgICAgICBobGVuID0gMTk7CisgICAgICAgIH0KKyAgICB9IC8qIGVsc2UgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKSAqLworCisgICAgLyogQWRkcmVzcyAyID0gVEEgKi8KKyAgICBoZWFkZXJbOV0gPSB3ZC0+bWFjQWRkclswXTsKKyAgICBoZWFkZXJbMTBdID0gd2QtPm1hY0FkZHJbMV07CisjaWZkZWYgWk1fVkFQTU9ERV9NVUxUSUxFX1NTSUQKKyAgICBoZWFkZXJbMTFdID0gd2QtPm1hY0FkZHJbMl07IC8vTXVsdGlwbGUgU1NJRAorI2Vsc2UKKyAgICBoZWFkZXJbMTFdID0gd2QtPm1hY0FkZHJbMl0gKyAodmFwPDw4KTsgLy9WQVAKKyNlbmRpZgorCisgICAgaWYgKCAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUykgJiYgKHdkLT5YTGlua01vZGUpICkKKyAgICB7CisgICAgICAgIGhlYWRlcls5XSAgPSBzYVswXTsKKyAgICAgICAgaGVhZGVyWzEwXSA9IHNhWzFdOworICAgICAgICBoZWFkZXJbMTFdID0gc2FbMl07CisgICAgfQorCisgICAgLyogU2VxdWVuY2UgQ29udHJvbCAqLworICAgIGhlYWRlclsxNV0gPSBzZXE7CisKKworICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICB7CisgICAgICAgIHpmQXBHZXRTdGFUeFJhdGVBbmRRb3NUeXBlKGRldiwgZGEsICZwaHlDdHJsLCAmcW9zVHlwZSwgJnJhdGVQcm9iaW5nRmxhZyk7CisgICAgICAgIG10ID0gKHUxNl90KShwaHlDdHJsICYgMHgzKTsKKyAgICAgICAgbWNzID0gKHUxNl90KSgocGh5Q3RybCA+PiAxNikgJiAweDNmKTsKKyNpZiAxCisgICAgICAgIC8vemZBcEdldFN0YVFvc1R5cGUoZGV2LCBkYSwgJnFvc1R5cGUpOworCisgICAgICAgIC8qIGlmIERBID09IFdNRSBTVEEgKi8KKyAgICAgICAgaWYgKHFvc1R5cGUgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogUW9TIGRhdGEgKi8KKyAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDAwODA7CisKKyAgICAgICAgICAgIC8qIFFvUyBDb250cm9sICovCisgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSB1cDsKKyAgICAgICAgICAgIGhsZW4gKz0gMTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorCisjaWYgMAorICAgIC8vQUdHIFRlc3QgQ29kZQorICAgIGlmIChoZWFkZXJbNl0gPT0gMHg4MDAwKQorICAgIHsKKyAgICAgICAgLyogUW9TIGRhdGEgKi8KKyAgICAgICAgaGVhZGVyWzRdIHw9IDB4MDA4MDsKKworICAgICAgICAvKiBRb1MgQ29udHJvbCAqLworICAgICAgICBoZWFkZXJbaGxlbl0gPSAwOworICAgICAgICBobGVuICs9IDE7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApIHsKKyAgICAgICAgLyogVG9kbzogcmF0ZSBjb250cm9sIGhlcmUgZm9yIHFvcyBmaWVsZCAqLworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogUmF0ZSBjb250cm9sICovCisgICAgICAgIHpmU3RhR2V0VHhSYXRlKGRldiwgZGEsICZwaHlDdHJsLCAmcmF0ZVByb2JpbmdGbGFnKTsKKyAgICAgICAgbXQgPSAodTE2X3QpKHBoeUN0cmwgJiAweDMpOworICAgICAgICBtY3MgPSAodTE2X3QpKChwaHlDdHJsID4+IDE2KSAmIDB4M2YpOworICAgIH0KKworICAgIGlmICh3ZC0+dHhNQ1MgIT0gMHhmZikKKyAgICB7CisgICAgICAgIC8qIGZpeGVkIHJhdGUgKi8KKwkgICAgcGh5Q3RybCA9ICgodTMyX3Qpd2QtPnR4TUNTPDwxNikgKyB3ZC0+dHhNVDsKKyAgICAgICAgbWNzID0gd2QtPnR4TUNTOworICAgICAgICBtdCA9IHdkLT50eE1UOworICAgIH0KKworICAgIGlmICh3ZC0+ZW5hYmxlQWdncmVnYXRpb24pCisgICAgeworICAgICAgICAvKiBmb3JjZSBlbmFibGUgYWdncmVnYXRpb24gKi8KKyAgICAgICAgaWYgKHdkLT5lbmFibGVBZ2dyZWdhdGlvbj09MiAmJiAhKGhlYWRlcls2XSYweDEpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBRb1MgZGF0YSAqLworICAgICAgICAgICAgaGVhZGVyWzRdIHw9IDB4MDA4MDsKKworICAgICAgICAgICAgLyogUW9TIENvbnRyb2wgKi8KKyAgICAgICAgICAgIGhlYWRlcltobGVuXSA9IDA7CisgICAgICAgICAgICBobGVuICs9IDE7CisgICAgICAgIH0KKyAgICAgICAgLyogaWYgd2QtPmVuYWJsZUFnZ3JlZ2F0aW9uPTEgPT4gZm9yY2UgZGlzYWJsZSAqLworICAgICAgICAvKiBpZiB3ZC0+ZW5hYmxlQWdncmVnYXRpb249MCA9PiBhdXRvICovCisgICAgfQorCisjaWZkZWYgWk1fRU5BQkxFX0FHR1JFR0FUSU9OCisgICAgLyoKKyAgICAgKiBhZ2dyZWdhdGlvbiBjb250cm9sCisgICAgICovCisKKyAgICAvKgorICAgICAqIFFvUyBkYXRhCisgICAgICovCisgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKSB7CisgICAgICAgIGlmIChhZ2dDb250cm9sICYmIG10ID09IDIpIHsKKyAgICAgICAgICAgIGlmICh3ZC0+ZW5hYmxlQWdncmVnYXRpb249PTAgJiYgIShoZWFkZXJbNl0mMHgxKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHgwMDgwOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBRb1MgQ29udHJvbAorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuXSA9IDA7CisgICAgICAgICAgICAgICAgaGxlbiArPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICAvLyBNU0RVIExlbmd0aAorICAgIGxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworCisgICAgLyogR2VuZXJhdGUgY29udHJvbCBzZXR0aW5nICovCisgICAgLyogQmFja29mZiwgTm9uLUJ1cnN0IGFuZCBoYXJkd2FyZSBkdXJhdGlvbiAqLworICAgIG1hY0N0cmwgPSAweDIwODsKKworICAgIC8qIEFDSyAqLworICAgIGlmICgoaGVhZGVyWzZdICYgMHgxKSA9PSAweDEpCisgICAgeworICAgICAgICAvKiBtdWx0aWNhc3QgZnJhbWUgOiBTZXQgTk8tQUNLIGJpdCAqLworICAgICAgICBtYWNDdHJsIHw9IDB4NDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogdW5pY2FzdCBmcmFtZSAqLworICAgICNpZiAwCisgICAgICAgIC8vIEVuYWJsZSBSVFMgYWNjb3JkaW5nIHRvIE1QRFUgTGVuZ3RocyAoIG5vdCBNU0RVIExlbmd0aHMgKQorICAgICAgICBpZiAobGVuID49IHdkLT5ydHNUaHJlc2hvbGQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEVuYWJsZSBSVFMgKi8KKyAgICAgICAgICAgIG1hY0N0cmwgfD0gMTsKKyAgICAgICAgfQorICAgICNlbmRpZgorICAgIH0KKyAgICAvKiBWQVAgdGVzdCBjb2RlICovCisgICAgLy9tYWNDdHJsIHw9IDB4NDsKKworICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICB7CisgICAgICAgIHU4X3QgZW5jcnlUeXBlOworICAgICAgICB1MTZfdCBpdjE2OworICAgICAgICB1MzJfdCBpdjMyOworCisgICAgICAgIC8qIENoZWNrIHdoZXRoZXIgdGhpcyBpcyBhIG11bHRpY2FzdCBmcmFtZSAqLworICAgICAgICBpZiAoKGhlYWRlcls2XSAmIDB4MSkgPT0gMHgxKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBtdWx0aWNhc3QgZnJhbWUgKi8KKyAgICAgICAgICAgIGlmICh3ZC0+YXAuZW5jcnlNb2RlW3ZhcF0gPT0gWk1fVEtJUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuaXYxNlt2YXBdKys7CisKKyAgICAgICAgICAgICAgICBpZih3ZC0+YXAuaXYxNlt2YXBdID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuaXYzMlt2YXBdKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYjEgPSAodThfdCkgKHdkLT5hcC5pdjE2W3ZhcF0gPj4gOCk7CisgICAgICAgICAgICAgICAgYjIgPSAoYjEgfCAweDIwKSAmIDB4N2Y7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW5dID0gKCh1MTZfdCliMiA8PCA4KSArIGIxOworICAgICAgICAgICAgICAgIGIxID0gKHU4X3QpIHdkLT5hcC5pdjE2W3ZhcF07CisgICAgICAgICAgICAgICAgYjIgPSAweDIwIHwgKHdkLT5hcC5iY0tleUluZGV4W3ZhcF0gPDwgNik7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMV0gPSAoKHUxNl90KWIyIDw8IDgpICsgYjE7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMl0gPSAodTE2X3QpIHdkLT5hcC5pdjMyW3ZhcF07CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rM10gPSAodTE2X3QpICh3ZC0+YXAuaXYzMlt2YXBdID4+IDE2KTsKKworICAgICAgICAgICAgICAgIC8vbWFjQ3RybCB8PSAweDgwOworICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHg0MDsKKyAgICAgICAgICAgICAgICBpY3ZMZW4gPSA0OworCisgICAgICAgICAgICAgICAgLyogc2V0IGhhcmR3YXJlIE1JQyAqLworICAgICAgICAgICAgICAgIGlmICggKCEoc2VxICYgMHhmKSkmJighKGZsYWcgJiAweDQpKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYWNDdHJsIHw9IDB4MTAwOworICAgICAgICAgICAgICAgICAgICBwbHVzTGVuICs9IDg7CisgICAgICAgICAgICAgICAgICAgICptaWNMZW4gPSA4OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgaGxlbiArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAod2QtPmFwLmVuY3J5TW9kZVt2YXBdID09IFpNX0FFUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuaXYxNlt2YXBdKys7CisKKyAgICAgICAgICAgICAgICBpZih3ZC0+YXAuaXYxNlt2YXBdID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuaXYzMlt2YXBdKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYjEgPSAodThfdCkgd2QtPmFwLml2MTZbdmFwXTsKKyAgICAgICAgICAgICAgICBiMiA9ICh1OF90KSAod2QtPmFwLml2MTZbdmFwXSA+PiA4KTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSAoKHUxNl90KWIyIDw8IDgpICsgYjE7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMV0gPSAweDIwMDAgfCAod2QtPmFwLmJjS2V5SW5kZXhbdmFwXSA8PCAxNCk7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMl0gPSAodTE2X3QpICh3ZC0+YXAuaXYzMlt2YXBdKTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbiszXSA9ICh1MTZfdCkgKHdkLT5hcC5pdjMyW3ZhcF0gPj4gMTYpOworCisgICAgICAgICAgICAgICAgbWFjQ3RybCB8PSAweGMwOworICAgICAgICAgICAgICAgIGljdkxlbiA9IDg7ICAvKiBNSUMgKi8KKworICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgaGxlbiArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICBlbHNlIGlmICh3ZC0+YXAuZW5jcnlNb2RlW3ZhcF0gPT0gWk1fQ0VOQykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3UzMl90IHR4aXZbNF07CisKKyAgICAgICAgICAgICAgICB3ZC0+YXAudHhpdlt2YXBdWzBdKys7CisKKyAgICAgICAgICAgICAgICBpZiAod2QtPmFwLnR4aXZbdmFwXVswXSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnR4aXZbdmFwXVsxXSsrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh3ZC0+YXAudHhpdlt2YXBdWzFdID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAudHhpdlt2YXBdWzJdKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHdkLT5hcC50eGl2W3ZhcF1bMl0gPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT5hcC50eGl2W3ZhcF1bM10rKzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAod2QtPmFwLnR4aXZbdmFwXVszXSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnR4aXZbdmFwXVswXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIHdkLT5hcC50eGl2W3ZhcF1bMV0gPSAwOworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAudHhpdlt2YXBdWzJdID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSAod2QtPmFwLmJjS2V5SW5kZXhbdmFwXSAmIDB4MDAwMSk7ICAgIC8qIEZvciBLZXkgSWQgYW5kIHJlc2VydmVkIGZpZWxkICovCisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMV0gPSAodTE2X3Qpd2QtPmFwLnR4aXZbdmFwXVswXTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisyXSA9ICh1MTZfdCkod2QtPmFwLnR4aXZbdmFwXVswXSA+PiAxNik7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rM10gPSAodTE2X3Qpd2QtPmFwLnR4aXZbdmFwXVsxXTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbis0XSA9ICh1MTZfdCkod2QtPmFwLnR4aXZbdmFwXVsxXSA+PiAxNik7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rNV0gPSAodTE2X3Qpd2QtPmFwLnR4aXZbdmFwXVsyXTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbis2XSA9ICh1MTZfdCkod2QtPmFwLnR4aXZbdmFwXVsyXSA+PiAxNik7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rN10gPSAodTE2X3Qpd2QtPmFwLnR4aXZbdmFwXVszXTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbis4XSA9ICh1MTZfdCkod2QtPmFwLnR4aXZbdmFwXVszXSA+PiAxNik7CisKKyAgICAgICAgICAgICAgICBtYWNDdHJsIHw9IDB4ODA7CisgICAgICAgICAgICAgICAgaWN2TGVuID0gMTY7ICAvKiBNSUMgKi8KKworICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgaGxlbiArPSA5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEdldCBTVEEncyBlbmNyeXB0aW9uIHR5cGUgKi8KKyAgICAgICAgICAgIHpmQXBHZXRTdGFFbmNyeVR5cGUoZGV2LCBkYSwgJmVuY3J5VHlwZSk7CisKKyAgICAgICAgICAgIGlmIChlbmNyeVR5cGUgPT0gWk1fVEtJUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBHZXQgaXYxNiBhbmQgaXYzMiAqLworICAgICAgICAgICAgICAgIHpmQXBHZXRTdGFXcGFJdihkZXYsIGRhLCAmaXYxNiwgJml2MzIpOworCisgICAgICAgICAgICAgICAgaXYxNisrOworICAgICAgICAgICAgICAgIGlmIChpdjE2ID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpdjMyKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYjEgPSAodThfdCkgKGl2MTYgPj4gOCk7CisgICAgICAgICAgICAgICAgYjIgPSAoYjEgfCAweDIwKSAmIDB4N2Y7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW5dID0gKCh1MTZfdCliMiA8PCA4KSArIGIxOworICAgICAgICAgICAgICAgIGIxID0gKHU4X3QpIGl2MTY7CisgICAgICAgICAgICAgICAgYjIgPSAweDIwOworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzFdID0gKCh1MTZfdCliMiA8PCA4KSArIGIxOworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzJdID0gKHUxNl90KSBpdjMyOworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzNdID0gKHUxNl90KSAoaXYzMiA+PiAxNik7CisKKyAgICAgICAgICAgICAgICAvL21hY0N0cmwgfD0gMHg4MDsKKyAgICAgICAgICAgICAgICBtYWNDdHJsIHw9IDB4NDA7CisgICAgICAgICAgICAgICAgaWN2TGVuID0gNDsKKworICAgICAgICAgICAgICAgIC8qIHNldCBoYXJkd2FyZSBNSUMgKi8KKyAgICAgICAgICAgICAgICBpZiAoICghKHNlcSAmIDB4ZikpJiYoIShmbGFnICYgMHg0KSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWFjQ3RybCB8PSAweDEwMDsKKyAgICAgICAgICAgICAgICAgICAgcGx1c0xlbiArPSA4OworICAgICAgICAgICAgICAgICAgICAqbWljTGVuID0gODsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHg0MDAwOworICAgICAgICAgICAgICAgIGhsZW4gKz0gNDsKKworICAgICAgICAgICAgICAgIC8qIFNldCBpdjE2IGFuZCBpdjMyICovCisgICAgICAgICAgICAgICAgemZBcFNldFN0YVdwYUl2KGRldiwgZGEsIGl2MTYsIGl2MzIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoZW5jcnlUeXBlID09IFpNX0FFUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBHZXQgaXYxNiBhbmQgaXYzMiAqLworICAgICAgICAgICAgICAgIHpmQXBHZXRTdGFXcGFJdihkZXYsIGRhLCAmaXYxNiwgJml2MzIpOworCisgICAgICAgICAgICAgICAgaXYxNisrOworICAgICAgICAgICAgICAgIGlmIChpdjE2ID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpdjMyKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYjEgPSAodThfdCkgaXYxNjsKKyAgICAgICAgICAgICAgICBiMiA9ICh1OF90KSAoaXYxNiA+PiA4KTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSAoKHUxNl90KWIyIDw8IDgpICsgYjE7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMV0gPSAweDIwMDA7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMl0gPSAodTE2X3QpIChpdjMyKTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbiszXSA9ICh1MTZfdCkgKGl2MzIgPj4gMTYpOworCisgICAgICAgICAgICAgICAgbWFjQ3RybCB8PSAweGMwOworICAgICAgICAgICAgICAgIGljdkxlbiA9IDg7ICAvKiBNSUMgKi8KKworICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgaGxlbiArPSA0OworCisgICAgICAgICAgICAgICAgLyogU2V0IGl2MTYgYW5kIGl2MzIgKi8KKyAgICAgICAgICAgICAgICB6ZkFwU2V0U3RhV3BhSXYoZGV2LCBkYSwgaXYxNiwgaXYzMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgIGVsc2UgaWYgKGVuY3J5VHlwZSA9PSBaTV9DRU5DKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHUzMl90IHR4aXZbNF07CisgICAgICAgICAgICAgICAgdThfdCBrZXlJZHg7CisKKyAgICAgICAgICAgICAgICAvKiBHZXQgQ0VOQyBUeElWICovCisgICAgICAgICAgICAgICAgemZBcEdldFN0YUNlbmNJdkFuZEtleUlkeChkZXYsIGRhLCB0eGl2LCAma2V5SWR4KTsKKworICAgICAgICAgICAgICAgIHR4aXZbMF0gKz0gMjsKKworICAgICAgICAgICAgICAgIGlmICh0eGl2WzBdID09IDAgfHwgdHhpdlswXSA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHhpdlsxXSsrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0eGl2WzFdID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0eGl2WzJdKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHR4aXZbMl0gPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHR4aXZbM10rKzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodHhpdlszXSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHhpdlswXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIHR4aXZbMV0gPSAwOworICAgICAgICAgICAgICAgICAgICB0eGl2WzJdID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSAoa2V5SWR4ICYgMHgwMDAxKTsgICAgLyogRm9yIEtleSBJZCBhbmQgcmVzZXJ2ZWQgZmllbGQgKi8KKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9ICh1MTZfdCl0eGl2WzBdOworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzJdID0gKHUxNl90KSh0eGl2WzBdID4+IDE2KTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbiszXSA9ICh1MTZfdCl0eGl2WzFdOworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzRdID0gKHUxNl90KSh0eGl2WzFdID4+IDE2KTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbis1XSA9ICh1MTZfdCl0eGl2WzJdOworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzZdID0gKHUxNl90KSh0eGl2WzJdID4+IDE2KTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbis3XSA9ICh1MTZfdCl0eGl2WzNdOworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzhdID0gKHUxNl90KSh0eGl2WzNdID4+IDE2KTsKKworICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHg4MDsKKyAgICAgICAgICAgICAgICBpY3ZMZW4gPSAxNjsgIC8qIE1JQyAqLworCisgICAgICAgICAgICAgICAgaGVhZGVyWzRdIHw9IDB4NDAwMDsKKyAgICAgICAgICAgICAgICBobGVuICs9IDk7CisKKyAgICAgICAgICAgICAgICAvKiBTZXQgQ0VOQyBJViAqLworICAgICAgICAgICAgICAgIHpmQXBTZXRTdGFDZW5jSXYoZGV2LCBkYSwgdHhpdik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICB9CisKKyAgICAgICAgLyogcHJvdGVjdGlvbiBtb2RlICovCisgICAgICAgIGlmICh3ZC0+YXAucHJvdGVjdGlvbk1vZGUgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRW5hYmxlIFNlbGYtQ1RTICovCisgICAgICAgICAgICBtYWNDdHJsICY9IDB4RkZGQzsKKyAgICAgICAgICAgIG1hY0N0cmwgfD0gMjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFJhdGUgQ29udHJvbCAqLworICAgICAgICBpZiAocG9ydCA8IDB4MjApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEFQICovCisgICAgICAgICAgICAvKiBJViAqLworICAgICAgICAgICAgaWYgKCh3ZC0+YXAuZW5jcnlNb2RlW3ZhcF0gPT0gWk1fV0VQNjQpIHx8CisgICAgICAgICAgICAgICAgICAgICh3ZC0+YXAuZW5jcnlNb2RlW3ZhcF0gPT0gWk1fV0VQMTI4KSB8fAorICAgICAgICAgICAgICAgICAgICAod2QtPmFwLmVuY3J5TW9kZVt2YXBdID09IFpNX1dFUDI1NikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGVhZGVyWzRdIHw9IDB4NDAwMDsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSAweDA7ICAgLy9JVgorICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzFdID0gd2QtPmFwLmJjS2V5SW5kZXhbdmFwXSA8PCAxNDsgLy9JViB3aXRoIEtleWlkLS1DV1lhbmcobSkKKyAgICAgICAgICAgICAgICBobGVuICs9IDI7CisgICAgICAgICAgICAgICAgaWN2TGVuID0gNDsKKyAgICAgICAgICAgICAgICBtYWNDdHJsIHw9IDB4NDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBXRFMgKi8KKworICAgICAgICAgICAgLyogVE9ETyA6IEZpeGVkIHJhdGUgdG8gNTRNICovCisgICAgICAgICAgICBwaHlDdHJsID0gMHhjMDAwMTsgICAvL1BIWSBjb250cm9sIEwKKworICAgICAgICAgICAgLyogV0RTIHBvcnQgY2hlY2tpbmcgKi8KKyAgICAgICAgICAgIGlmICgod2RzUG9ydCA9IChwb3J0IC0gMHgyMCkpID49IFpNX01BWF9XRFNfU1VQUE9SVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZHNQb3J0ID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgI2lmIDEKKyAgICAgICAgICAgIC8qIElWICovCisgICAgICAgICAgICBzd2l0Y2ggKHdkLT5hcC53ZHMuZW5jcnlNb2RlW3dkc1BvcnRdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBaTV9XRVA2NDoKKyAgICAgICAgICAgIGNhc2UgWk1fV0VQMTI4OgorICAgICAgICAgICAgY2FzZSBaTV9XRVAyNTY6CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuXSA9IDB4MDsgICAvL0lWCisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzFdID0gd2QtPmFwLmJjS2V5SW5kZXhbdmFwXSA8PCAxNDsgLy9JViB3aXRoIEtleWlkCisgICAgICAgICAgICAgICAgICAgIGhsZW4gKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgaWN2TGVuID0gNDsKKyAgICAgICAgICAgICAgICAgICAgbWFjQ3RybCB8PSAweDQwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBaTV9US0lQOgorICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLml2MTYrKzsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIHdkLT5zdGEuaXYxNiA9PSAwICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5pdjMyKys7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBiMSA9ICh1OF90KSAod2QtPnN0YS5pdjE2ID4+IDgpOworICAgICAgICAgICAgICAgICAgICBiMiA9IChiMSB8IDB4MjApICYgMHg3ZjsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW5dID0gKCh1MTZfdCliMiA8PCA4KSArIGIxOworICAgICAgICAgICAgICAgICAgICBiMSA9ICh1OF90KSB3ZC0+c3RhLml2MTY7CisgICAgICAgICAgICAgICAgICAgIGIyID0gMHgyMDsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMV0gPSAoKHUxNl90KWIyIDw8IDgpICsgYjE7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzJdID0gKHUxNl90KSB3ZC0+c3RhLml2MzI7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzNdID0gKHUxNl90KSAod2QtPnN0YS5pdjMyID4+IDE2KTsKKworICAgICAgICAgICAgICAgICAgICAvL21hY0N0cmwgfD0gMHg4MDsKKyAgICAgICAgICAgICAgICAgICAgbWFjQ3RybCB8PSAweDQwOworICAgICAgICAgICAgICAgICAgICBpY3ZMZW4gPSA0OworCisgICAgICAgICAgICAgICAgICAgIC8qIHNldCBoYXJkd2FyZSBNSUMgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoIShzZXEgJiAweGYpKSYmKCEoZmxhZyAmIDB4NCkpICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbWFjQ3RybCB8PSAweDEwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBsdXNMZW4gKz0gODsKKyAgICAgICAgICAgICAgICAgICAgICAgICptaWNMZW4gPSA4OworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyWzRdIHw9IDB4NDAwMDsKKyAgICAgICAgICAgICAgICAgICAgaGxlbiArPSA0OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBaTV9BRVM6CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuaXYxNisrOworICAgICAgICAgICAgICAgICAgICBpZiAoIHdkLT5zdGEuaXYxNiA9PSAwICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5pdjMyKys7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBiMSA9ICh1OF90KSB3ZC0+c3RhLml2MTY7CisgICAgICAgICAgICAgICAgICAgIGIyID0gKHU4X3QpICh3ZC0+c3RhLml2MTYgPj4gOCk7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuXSA9ICgodTE2X3QpYjIgPDwgOCkgKyBiMTsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMV0gPSAweDIwMDA7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzJdID0gKHUxNl90KSAod2QtPnN0YS5pdjMyKTsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rM10gPSAodTE2X3QpICh3ZC0+c3RhLml2MzIgPj4gMTYpOworCisgICAgICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHhjMDsgLyogU2V0IHRvIEFFUyBpbiBjb250cm9sIHNldHRpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgaWN2TGVuID0gODsgIC8qIE1JQyAqLworCisgICAgICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7IC8qIFNldCBXRVAgYml0IGluIHdsYW4gaGVhZGVyICovCisgICAgICAgICAgICAgICAgICAgIGhsZW4gKz0gNDsgLyogcGx1cyBJViBsZW5ndGggKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9LyogZW5kIG9mIHN3aXRjaCAqLworICAgICAgICAgICAgI2VuZGlmCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSAgIC8qIHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0FQICovCisgICAgeworICAgICAgICBlbmNFeGVtcHRpb25BY3Rpb25UeXBlID0gemZ3R2V0UGt0RW5jRXhlbXB0aW9uQWN0aW9uVHlwZShkZXYsIGJ1Zik7CisKKyAgICAgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSApCisgICAgICAgIHsKKyAgICAgICAgICAgICNpZiAxCisgICAgICAgICAgICAvKiBpZiBXTUUgQVAgKi8KKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLndtZUNvbm5lY3RlZCAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFFvUyBkYXRhICovCisgICAgICAgICAgICAgICAgaGVhZGVyWzRdIHw9IDB4MDA4MDsKKworICAgICAgICAgICAgICAgIC8qIFFvUyBDb250cm9sICovCisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW5dID0gdXA7CisgICAgICAgICAgICAgICAgaGxlbiArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgIGlmICggZW5jRXhlbXB0aW9uQWN0aW9uVHlwZSA9PSBaTV9FTkNSWVBUSU9OX0VYRU1QVF9OT19FWEVNUFRJT04gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggd2QtPnN0YS5hdXRoTW9kZSA8IFpNX0FVVEhfTU9ERV9XUEEgKQorICAgICAgICAgICAgICAgIHsgICAvKiBub24tV1BBICovCisgICAgICAgICAgICAgICAgICAgIGlmICggd2QtPnN0YS53ZXBTdGF0dXMgPT0gWk1fRU5DUllQVElPTl9XRVBfRU5BQkxFRCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHdkLT5zdGEuZW5jcnlNb2RlID09IFpNX1dFUDY0KXx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3ZC0+c3RhLmVuY3J5TW9kZSA9PSBaTV9XRVAxMjgpfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdkLT5zdGEuZW5jcnlNb2RlID09IFpNX1dFUDI1NikgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW5dID0gMHgwOyAgIC8vSVYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9IDB4MDsgLy9JVgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzFdIHw9ICgoKHUxNl90KSB3ZC0+c3RhLmtleUlkKSA8PCAxNCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGxlbiArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljdkxlbiA9IDQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGb3IgU29mdHdhcmUgV0VQICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh3ZC0+c3RhLlNXRW5jcnlwdEVuYWJsZSAmIFpNX1NXX1dFUF9FTkNSWV9FTikgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4X3Qga2V5TGVuID0gNTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdThfdCBpdlszXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdlswXSA9IDB4MDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXZbMV0gPSAweDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2WzJdID0gMHgwOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLlNXRW5jcnlNb2RlW3dkLT5zdGEua2V5SWRdID09IFpNX1dFUDY0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlMZW4gPSA1OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdkLT5zdGEuU1dFbmNyeU1vZGVbd2QtPnN0YS5rZXlJZF0gPT0gWk1fV0VQMTI4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlMZW4gPSAxMzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh3ZC0+c3RhLlNXRW5jcnlNb2RlW3dkLT5zdGEua2V5SWRdID09IFpNX1dFUDI1NikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5TGVuID0gMjk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZldFUEVuY3J5cHQoZGV2LCBidWYsICh1OF90Kikgc25hcCwgc25hcExlbiwgbWludXNMZW4sIGtleUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLndlcEtleVt3ZC0+c3RhLmtleUlkXSwgaXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNDdHJsIHw9IDB4NDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7ICAgLyogV1BBICovCisgICAgICAgICAgICAgICAgICAgIGlmICggd2QtPnN0YS53cGFTdGF0ZSA+PSBaTV9TVEFfV1BBX1NUQVRFX1BLX09LICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5pdjE2Kys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHdkLT5zdGEuaXYxNiA9PSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLml2MzIrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IGVuY3J5cHRpb24gbW9kZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLmVuY3J5TW9kZSA9PSBaTV9US0lQICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiMSA9ICh1OF90KSAod2QtPnN0YS5pdjE2ID4+IDgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIyID0gKGIxIHwgMHgyMCkgJiAweDdmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuXSA9ICgodTE2X3QpYjIgPDwgOCkgKyBiMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiMSA9ICh1OF90KSB3ZC0+c3RhLml2MTY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYjIgPSAweDIwOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVhZGVyW2hsZW4rMV0gPSAoKCh1MTZfdCkgd2QtPnN0YS5rZXlJZCkgPDwgMTQpIHwgKCgodTE2X3QpYjIgPDwgOCkgKyBiMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU1RBIGluIGluZnJhc3RydWN0dXJlIG1vZGUgc2hvdWxkIHVzZSBrZXlJZCA9IDAgdG8gdHJhbnNtaXQgdW5pY2FzdCAhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMV0gPSAoKCh1MTZfdCliMiA8PCA4KSArIGIxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisyXSA9ICh1MTZfdCkgd2QtPnN0YS5pdjMyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzNdID0gKHUxNl90KSAod2QtPnN0YS5pdjMyID4+IDE2KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHNvZnR3YXJlIGVuY3J5cHRpb24gZW5hYmxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh3ZC0+c3RhLlNXRW5jcnlwdEVuYWJsZSAmIFpNX1NXX1RLSVBfRU5DUllfRU4pID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL21hY0N0cmwgfD0gMHg4MDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVEtJUCBzYW1lIHRvIFdFUCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNDdHJsIHw9IDB4NDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljdkxlbiA9IDQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IGhhcmR3YXJlIE1JQyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICghKHNlcSAmIDB4ZikpJiYoIShmbGFnICYgMHg0KSkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNDdHJsIHw9IDB4MTAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1c0xlbiArPSA4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1pY0xlbiA9IDg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdThfdCBtaWNbOF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90IG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3QgaWN2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OF90IFJDNEtleVsxNl07CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETzogUmVtb3ZlIHRoZSBjcml0aWNpYWwgc2VjdGlvbiBoZXJlLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENhbGN1bGF0ZSBNSUMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZDYWxUeE1pYyhkZXYsIGJ1ZiwgKHU4X3QgKilzbmFwLCBzbmFwTGVuLCBtaW51c0xlbiwgZGEsIHNhLCB1cCwgbWljKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBcHBlbmQgTUlDIHRvIHRoZSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZDb3B5VG9JbnRUeEJ1ZmZlcihkZXYsIGJ1ZiwgbWljLCBvZmZzZXQsIDgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZndCdWZTZXRTaXplKGRldiwgYnVmLCBvZmZzZXQrOCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVEtJUCBLZXkgTWl4aW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmVGtpcFBoYXNlMUtleU1peCh3ZC0+c3RhLml2MzIsICZ3ZC0+c3RhLnR4U2VlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmVGtpcFBoYXNlMktleU1peCh3ZC0+c3RhLml2MTYsICZ3ZC0+c3RhLnR4U2VlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmVGtpcEdldHNlZWRzKHdkLT5zdGEuaXYxNiwgUkM0S2V5LCAmd2QtPnN0YS50eFNlZWQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVuY3J5cHQgRGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZlRLSVBFbmNyeXB0KGRldiwgYnVmLCAodThfdCAqKXNuYXAsIHNuYXBMZW4sIG1pbnVzTGVuLCAxNiwgUkM0S2V5LCAmaWN2KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY3ZMZW4gPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gKz0gODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHg0MDAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhsZW4gKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCB3ZC0+c3RhLmVuY3J5TW9kZSA9PSBaTV9BRVMgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIxID0gKHU4X3QpIHdkLT5zdGEuaXYxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiMiA9ICh1OF90KSAod2QtPnN0YS5pdjE2ID4+IDgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuXSA9ICgodTE2X3QpYjIgPDwgOCkgKyBiMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoZWFkZXJbaGxlbisxXSA9ICgoKHUxNl90KSB3ZC0+c3RhLmtleUlkKSA8PCAxNCkgfCAoMHgyMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTVEEgaW4gaW5mcmFzdHJ1Y3R1cmUgbW9kZSBzaG91bGQgdXNlIGtleUlkID0gMCB0byB0cmFuc21pdCB1bmljYXN0ICEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9IDB4MjAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisyXSA9ICh1MTZfdCkgKHdkLT5zdGEuaXYzMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rM10gPSAodTE2X3QpICh3ZC0+c3RhLml2MzIgPj4gMTYpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjQ3RybCB8PSAweGMwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljdkxlbiA9IDg7ICAvKiBNSUMgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGxlbiArPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggd2QtPnN0YS5lbmNyeU1vZGUgPT0gWk1fQ0VOQyApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWNjdW1sYXRlIHRoZSBQTiBzZXF1ZW5jZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEudHhpdlswXSArPSAyOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEudHhpdlswXSA9PSAwIHx8IHdkLT5zdGEudHhpdlswXSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzFdKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEudHhpdlsxXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzJdKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEudHhpdlsyXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzNdKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEudHhpdlszXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzBdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzFdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzJdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSAod2QtPnN0YS5jZW5jS2V5SWQgJiAweDAwMDEpOyAgICAvKiBGb3IgS2V5IElkIGFuZCByZXNlcnZlZCBmaWVsZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzFdID0gKHUxNl90KSB3ZC0+c3RhLnR4aXZbMF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rMl0gPSAodTE2X3QpICh3ZC0+c3RhLnR4aXZbMF0gPj4gMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzNdID0gKHUxNl90KSB3ZC0+c3RhLnR4aXZbMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rNF0gPSAodTE2X3QpICh3ZC0+c3RhLnR4aXZbMV0gPj4gMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzVdID0gKHUxNl90KSB3ZC0+c3RhLnR4aXZbMl07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rNl0gPSAodTE2X3QpICh3ZC0+c3RhLnR4aXZbMl0gPj4gMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzddID0gKHUxNl90KSB3ZC0+c3RhLnR4aXZbM107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rOF0gPSAodTE2X3QpICh3ZC0+c3RhLnR4aXZbM10gPj4gMTYpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjQ3RybCB8PSAweDgwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljdkxlbiA9IDE2OyAgLyogTUlDICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHg0MDAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhsZW4gKz0gOTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IC8vIGlmICggZW5jRXhlbXB0aW9uQWN0aW9uVHlwZSA9PSBaTV9FTkNSWVBUSU9OX0VYRU1QVF9OT19FWEVNUFRJT04gKQorICAgICAgICB9IC8qIGlmICggd2QtPndsYW5Nb2RlICE9IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKSAqLworCisgICAgICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggZW5jRXhlbXB0aW9uQWN0aW9uVHlwZSA9PSBaTV9FTkNSWVBUSU9OX0VYRU1QVF9OT19FWEVNUFRJT04gKQorICAgICAgICAgICAgeworI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1dQQTJQU0sKKyAgICAgICAgICAgICAgICBpZiggd2QtPnN0YS5vcHBvc2l0ZUluZm9bdXNlcklkeF0ud3BhU3RhdGUgPj0gWk1fU1RBX1dQQV9TVEFURV9QS19PSyB8fCB3ZC0+c3RhLndwYVN0YXRlID49IFpNX1NUQV9XUEFfU1RBVEVfUEtfT0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgaXNVbmljYXN0ID0gMSA7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoKGRhWzBdJiAweDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpc1VuaWNhc3QgPSAwIDsgLy8gTm90IHVuaWNhc3QgLCBpcyBicm9hZGNhc3QKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmKCB3ZC0+c3RhLmlic3NXcGEyUHNrID09IDEgKQorICAgICAgICAgICAgICAgICAgICB7IC8qIFRoZSBJViBvcmRlciBpcyBub3QgdGhlIHNhbWUgYmV0d2VlbiB1bmljYXN0IGFuZCBicm9hZGNhc3QgISAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpc1VuaWNhc3QgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2MTYgPSAmd2QtPnN0YS5vcHBvc2l0ZUluZm9bdXNlcklkeF0uaXYxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdjMyID0gJndkLT5zdGEub3Bwb3NpdGVJbmZvW3VzZXJJZHhdLml2MzI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXYxNiA9ICZ3ZC0+c3RhLml2MTY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXYzMiA9ICZ3ZC0+c3RhLml2MzI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpdjE2ID0gJndkLT5zdGEuaXYxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl2MzIgPSAmd2QtPnN0YS5pdjMyOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgKCppdjE2KSsrOworICAgICAgICAgICAgICAgICAgICBpZiAoICppdjE2ID09IDAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAqaXYzMisrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLm9wcG9zaXRlSW5mb1t1c2VySWR4XS5lbmNyeU1vZGUgPT0gWk1fQUVTIHx8IHdkLT5zdGEuZW5jcnlNb2RlID09IFpNX0FFUykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmludGsoIlN0YXRpb24gZW5jcnlwdGlvbiBtb2RlIGlzIEFFUy1DQ01QXG4iKSA7CisgICAgICAgICAgICAgICAgICAgICAgICBiMSA9ICh1OF90KSAoKml2MTYpOworICAgICAgICAgICAgICAgICAgICAgICAgYjIgPSAodThfdCkgKCgqaXYxNikgPj4gOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSAoKHUxNl90KWIyIDw8IDgpICsgYjE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaXNVbmljYXN0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9IDB4MjAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9IDB4MjAwMCB8ICgoKHUxNl90KSB3ZC0+c3RhLmtleUlkKSA8PCAxNCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzJdID0gKHUxNl90KSAoKml2MzIpOworICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rM10gPSAodTE2X3QpICgoKml2MzIpID4+IDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHhjMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGljdkxlbiA9IDg7ICAvKiBNSUMgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgICAgIGhsZW4gKz0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHdkLT5zdGEud2VwU3RhdHVzID09IFpNX0VOQ1JZUFRJT05fV0VQX0VOQUJMRUQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoICh3ZC0+c3RhLmVuY3J5TW9kZSA9PSBaTV9XRVA2NCl8fAorICAgICAgICAgICAgICAgICAgICAgICAgKHdkLT5zdGEuZW5jcnlNb2RlID09IFpNX1dFUDEyOCl8fAorICAgICAgICAgICAgICAgICAgICAgICAgKHdkLT5zdGEuZW5jcnlNb2RlID09IFpNX1dFUDI1NikgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHg0MDAwOworICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW5dID0gMHgwOyAgIC8vSVYKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzFdID0gMHgwOyAvL0lWCisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSB8PSAoKCh1MTZfdCkgd2QtPnN0YS5rZXlJZCkgPDwgMTQpOworICAgICAgICAgICAgICAgICAgICAgICAgaGxlbiArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgaWN2TGVuID0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHg0MDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgICAgLyogLS0tLS0gMjAwNzA0MDUgYWRkIGJ5IE14emVuZyAtLS0tLSAqLworICAgICAgICAgICAgICAgIGlmKCB3ZC0+c3RhLndwYVN0YXRlID49IFpNX1NUQV9XUEFfU1RBVEVfUEtfT0sgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGlzVW5pY2FzdCA9IDEgOworCisgICAgICAgICAgICAgICAgICAgIGlmKChkYVswXSYgMHgxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaXNVbmljYXN0ID0gMCA7IC8vIE5vdCB1bmljYXN0ICwgaXMgYnJvYWRjYXN0CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLml2MTYrKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLml2MTYgPT0gMCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuaXYzMisrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLmVuY3J5TW9kZSA9PSBaTV9BRVMgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50aygiU3RhdGlvbiBlbmNyeXB0aW9uIG1vZGUgaXMgQUVTLUNDTVBcbiIpIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGIxID0gKHU4X3QpIHdkLT5zdGEuaXYxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGIyID0gKHU4X3QpICh3ZC0+c3RhLml2MTYgPj4gOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSAoKHUxNl90KWIyIDw8IDgpICsgYjE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaXNVbmljYXN0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9IDB4MjAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9IDB4MjAwMCB8ICgoKHUxNl90KSB3ZC0+c3RhLmtleUlkKSA8PCAxNCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisyXSA9ICh1MTZfdCkgKHdkLT5zdGEuaXYzMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rM10gPSAodTE2X3QpICh3ZC0+c3RhLml2MzIgPj4gMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHhjMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY3ZMZW4gPSA4OyAgLyogTUlDICovCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHg0MDAwOworICAgICAgICAgICAgICAgICAgICBobGVuICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCB3ZC0+c3RhLndlcFN0YXR1cyA9PSBaTV9FTkNSWVBUSU9OX1dFUF9FTkFCTEVEKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAod2QtPnN0YS5lbmNyeU1vZGUgPT0gWk1fV0VQNjQpfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAod2QtPnN0YS5lbmNyeU1vZGUgPT0gWk1fV0VQMTI4KXx8CisgICAgICAgICAgICAgICAgICAgICAgICAgKHdkLT5zdGEuZW5jcnlNb2RlID09IFpNX1dFUDI1NikgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbNF0gfD0gMHg0MDAwOworICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW5dID0gMHgwOyAgIC8vSVYKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzFdID0gMHgwOyAvL0lWCisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSB8PSAoKCh1MTZfdCkgd2QtPnN0YS5rZXlJZCkgPDwgMTQpOworICAgICAgICAgICAgICAgICAgICAgICAgaGxlbiArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgaWN2TGVuID0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHg0MDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgfSAgIC8vIEVuZCBpZiAoIGVuY0V4ZW1wdGlvbkFjdGlvblR5cGUgPT0gWk1fRU5DUllQVElPTl9FWEVNUFRfTk9fRVhFTVBUSU9OICkKKyAgICAgICAgfSAgIC8vIEVuZCBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MgKQorICAgICAgICBlbHNlIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfUFNFVURPICkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICh3ZC0+c3RhLmVuY3J5TW9kZSkKKwkgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgWk1fV0VQNjQ6CisgICAgICAgICAgICBjYXNlIFpNX1dFUDEyODoKKyAgICAgICAgICAgIGNhc2UgWk1fV0VQMjU2OgorICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW5dID0gMHgwOyAgIC8vSVYKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9IDB4MDsgLy9JVgorICAgICAgICAgICAgICAgIGhsZW4gKz0gMjsKKyAgICAgICAgICAgICAgICBpY3ZMZW4gPSA0OworICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHg0MDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBaTV9US0lQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuaXYxNisrOworICAgICAgICAgICAgICAgIGlmICggd2QtPnN0YS5pdjE2ID09IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5pdjMyKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYjEgPSAodThfdCkgKHdkLT5zdGEuaXYxNiA+PiA4KTsKKyAgICAgICAgICAgICAgICBiMiA9IChiMSB8IDB4MjApICYgMHg3ZjsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbl0gPSAoKHUxNl90KWIyIDw8IDgpICsgYjE7CisgICAgICAgICAgICAgICAgYjEgPSAodThfdCkgd2QtPnN0YS5pdjE2OworICAgICAgICAgICAgICAgIGIyID0gMHgyMDsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9ICgodTE2X3QpYjIgPDwgOCkgKyBiMTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisyXSA9ICh1MTZfdCkgd2QtPnN0YS5pdjMyOworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzNdID0gKHUxNl90KSAod2QtPnN0YS5pdjMyID4+IDE2KTsKKworICAgICAgICAgICAgICAgIC8vbWFjQ3RybCB8PSAweDgwOworICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHg0MDsKKyAgICAgICAgICAgICAgICBpY3ZMZW4gPSA0OworCisgICAgICAgICAgICAgICAgLyogc2V0IGhhcmR3YXJlIE1JQyAqLworICAgICAgICAgICAgICAgIGlmICggKCEoc2VxICYgMHhmKSkmJighKGZsYWcgJiAweDQpKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYWNDdHJsIHw9IDB4MTAwOworICAgICAgICAgICAgICAgICAgICBwbHVzTGVuICs9IDg7CisgICAgICAgICAgICAgICAgICAgICptaWNMZW4gPSA4OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgaGxlbiArPSA0OworICAgICAgICAgICAgfS8qIGVuZCBvZiBQU0VVRE8gVEtJUCAqLworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFpNX0FFUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLml2MTYrKzsKKyAgICAgICAgICAgICAgICBpZiAoIHdkLT5zdGEuaXYxNiA9PSAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuaXYzMisrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGIxID0gKHU4X3QpIHdkLT5zdGEuaXYxNjsKKyAgICAgICAgICAgICAgICBiMiA9ICh1OF90KSAod2QtPnN0YS5pdjE2ID4+IDgpOworICAgICAgICAgICAgICAgIGhlYWRlcltobGVuXSA9ICgodTE2X3QpYjIgPDwgOCkgKyBiMTsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisxXSA9IDB4MjAwMDsKKyAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbisyXSA9ICh1MTZfdCkgKHdkLT5zdGEuaXYzMik7CisgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rM10gPSAodTE2X3QpICh3ZC0+c3RhLml2MzIgPj4gMTYpOworICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMHhjMDsKKyAgICAgICAgICAgICAgICBpY3ZMZW4gPSA4OyAgLyogTUlDICovCisgICAgICAgICAgICAgICAgaGVhZGVyWzRdIHw9IDB4NDAwMDsKKyAgICAgICAgICAgICAgICBobGVuICs9IDQ7CisgICAgICAgICAgICB9LyogZW5kIG9mIFBTRVVETyBBRVMgKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICAgIGNhc2UgWk1fQ0VOQzoKKyAgICAgICAgICAgICAgICAgICAgLyogQWNjdW1sYXRlIHRoZSBQTiBzZXF1ZW5jZSAqLworICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnR4aXZbMF0gKz0gMjsKKworICAgICAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS50eGl2WzBdID09IDAgfHwgd2QtPnN0YS50eGl2WzBdID09IDEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEudHhpdlsxXSsrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEudHhpdlsxXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnR4aXZbMl0rKzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLnR4aXZbMl0gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzNdKys7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS50eGl2WzNdID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEudHhpdlswXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnR4aXZbMV0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzJdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzFdID0gKHUxNl90KSB3ZC0+c3RhLnR4aXZbMF07CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzJdID0gKHUxNl90KSAod2QtPnN0YS50eGl2WzBdID4+IDE2KTsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rM10gPSAodTE2X3QpIHdkLT5zdGEudHhpdlsxXTsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2hsZW4rNF0gPSAodTE2X3QpICh3ZC0+c3RhLnR4aXZbMV0gPj4gMTYpOworICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbis1XSA9ICh1MTZfdCkgd2QtPnN0YS50eGl2WzJdOworICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaGxlbis2XSA9ICh1MTZfdCkgKHdkLT5zdGEudHhpdlsyXSA+PiAxNik7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzddID0gKHUxNl90KSB3ZC0+c3RhLnR4aXZbM107CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcltobGVuKzhdID0gKHUxNl90KSAod2QtPnN0YS50eGl2WzNdID4+IDE2KTsKKworICAgICAgICAgICAgICAgICAgICBtYWNDdHJsIHw9IDB4ODA7CisgICAgICAgICAgICAgICAgICAgIGljdkxlbiA9IDE2OyAgLyogTUlDICovCisKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyWzRdIHw9IDB4NDAwMDsKKyAgICAgICAgICAgICAgICAgICAgaGxlbiArPSA5OworCQkJCWJyZWFrOworCQkgICAgI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKwkJCX0vKiBlbmQgb2Ygc3dpdGNoICovCisJCX0KKworICAgICAgICAvKiBHZW5lcmF0ZSBjb250cm9sIHNldHRpbmcgKi8KKworICAgICAgICAvKiBwcm90ZWN0aW9uIG1vZGUgKi8KKyAgICAgICAgaWYgKHdkLT5lbmFibGVQcm90ZWN0aW9uTW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdkLT5lbmFibGVQcm90ZWN0aW9uTW9kZT09MikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBGb3JjZSBlbmFibGUgcHJvdGVjdGlvbjogc2VsZiBjdHMgICovCisgICAgICAgICAgICAgICAgbWFjQ3RybCAmPSAweEZGRkM7CisgICAgICAgICAgICAgICAgbWFjQ3RybCB8PSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogaWYgd2QtPmVuYWJsZVByb3RlY3Rpb25Nb2RlPTEgPT4gZm9yY2UgZGlzYWJsZSAqLworICAgICAgICAgICAgLyogaWYgd2QtPmVuYWJsZVByb3RlY3Rpb25Nb2RlPTAgPT4gYXV0byAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworCisgICAgICAgICAgICAvKiBwcm90ZWN0aW9uIG1vZGUgKi8KKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLmJQcm90ZWN0aW9uTW9kZSA9PSBUUlVFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEVuYWJsZSBTZWxmLUNUUyAqLworICAgICAgICAgICAgICAgIG1hY0N0cmwgJj0gMHhGRkZDOworICAgICAgICAgICAgICAgIG1hY0N0cmwgfD0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgaWYgKHdkLT50eE1DUyAhPSAweGZmKQorICAgIHsKKyAgICAgICAgLyogZml4ZWQgcmF0ZSAqLworCSAgICBwaHlDdHJsID0gKCh1MzJfdCl3ZC0+dHhNQ1M8PDE2KSArIHdkLT50eE1UOworICAgICAgICBtY3MgPSB3ZC0+dHhNQ1M7CisgICAgICAgIG10ID0gd2QtPnR4TVQ7CisgICAgfQorCisgICAgaWYgKG10ID09IDIpCisgICAgeworI2lmIDAKKyAgICAgICAgLyogSFQgUFQ6IDAgTWl4ZWQgbW9kZSAgICAxIEdyZWVuIGZpZWxkICovCisJICAgIGlmICh3ZC0+c3RhLnByZWFtYmxlVHlwZUhUID09IFpNX1BSRUFNQkxFX1RZUEVfR1JFRU5fRklFTEQpCisJICAgIHsKKyAgICAgICAgICAgIHBoeUN0cmwgfD0gMHg0OyAgICAgLyogQml0IDIgKi8KKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIC8qIEJhbmR3aWR0aCAqLworICAgICAgICBpZiAod2QtPnN0YS5odEN0cmxCYW5kd2lkdGggPT0gWk1fQkFORFdJRFRIXzQwTUhaKQorICAgICAgICB7CisgICAgICAgICAgICBwaHlDdHJsIHw9ICgweDgwPDwxNik7ICAvKiBCSVQgMjMgKi8KKyAgICAgICAgfQorI2lmIDAKKyAgICAgICAgLyogU1RCQyAqLworICAgICAgICBpZiAod2QtPnN0YS5odEN0cmxTVEJDPD0weDMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBoeUN0cmwgfD0gKHdkLT5zdGEuaHRDdHJsU1RCQzw8MjgpOyAgIC8qIEJJVCAyMyAqLworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgLyogU2hvcnQgR0kgKi8KKyAgICAgICAgaWYod2QtPnN0YS5odEN0cmxTRykKKyAgICAgICAgeworICAgICAgICAgICAgcGh5Q3RybCB8PSAoMHg4MDAwPDwxNik7ICAgICAgICAgLyogQklUIDMxICovCisgICAgICAgIH0KKworICAgICAgICAvKiBUQSAqLworICAgICAgICBpZiAoICgobWNzID49MHg4KSAmJiAobWNzPD0weGYpKSAgfHwgKHdkLT5zdGEuaHRDdHJsU1RCQykgKQorICAgICAgICB7CisgICAgICAgCSAgICBwaHlDdHJsIHw9IDB4MTgwMDsgICAgICAgICAgICAgICAvKiBCSVQgMTEgMTIgKi8KKyAgICAJfQorICAgIH0KKyAgICBlbHNlIGlmKG10ID09IDEpCisgICAgeworICAgICAgICAjaWYgMAorICAgICAgICAvL2J1ZyB0aGF0IGNhdXNlIE9GRE0gcmF0ZSBiZWNvbWUgZHVwbGljYXRlIGxlZ2FjeSByYXRlCisgICAgICAgIC8qIEJhbmR3aWR0aCAqLworICAgICAgICBpZiAod2QtPnN0YS5odEN0cmxCYW5kd2lkdGggPT0gWk1fQkFORFdJRFRIXzQwTUhaKQorICAgICAgICB7CisgICAgICAgICAgICBwaHlDdHJsIHw9ICgweDgwPDwxNik7ICAvKiBCSVQgMjMgKi8KKyAgICAgICAgICAgIG10ID0gMzsgICAgICAgICAgICAgICAgIC8qIGR1cGxpY2F0ZSBsZWdhY3kgKi8KKyAgICAgICAgICAgIHBoeUN0cmwgfD0gbXQ7CisgICAgICAgIH0KKyAgICAgICAgI2VuZGlmCisgICAgfQorICAgIGVsc2UgaWYobXQgPT0gMCkKKyAgICB7CisJLyogQ0NLIFBUOiBMZWdjeSBQcmVhbWJsZTogMSBsb25nIHByZWFtYmxlICAgIDIgc2hvcnQgcHJlYW1ibGUgKi8KKyAgICAgICAgaWYgKHdkLT5wcmVhbWJsZVR5cGVJblVzZWQgPT0gWk1fUFJFQU1CTEVfVFlQRV9TSE9SVCkKKyAgICAgICAgeworICAgIAkgICAgICAgLy9waHlDdHJsIHw9IDB4NDsgICAgLyogQklUIDIgKi8KKyAgICAJfQorICAgIH0KKworICAgIC8qIFRBICovCisgICAgaWYgKHdkLT5zdGEuZGVmYXVsdFRBKQorICAgIHsKKyAgICAgICAgcGh5Q3RybCB8PSAweDEwMDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBoeUN0cmwgfD0gMHgwODAwOworICAgIH0KKworICAgIC8vR2V0IEN1cnJlbnRUeFJhdGUgLS0gQ1dZYW5nKCspCisgICAgaWYgKChtdCA9PSAwKSB8fCAobXQgPT0gMSkpIC8vQixHIFJhdGUKKyAgICB7CisgICAgICAgIGlmIChtY3MgPCAxNikKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPkN1cnJlbnRUeFJhdGVLYnBzID0gemNJbmRleHRvUmF0ZUJHW21jc107CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAobXQgPT0gMikKKyAgICB7CisgICAgICAgIGlmIChtY3MgPCAxNikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdkLT5zdGEuaHRDdHJsQmFuZHdpZHRoID09IFpNX0JBTkRXSURUSF80ME1IWikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigocGh5Q3RybCAmIDB4ODAwMDAwMDApICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBTaG9ydCBHSSA0MCBNSHogTUlNTyBSYXRlICovCisgICAgICAgICAgICAgICAgICAgIHdkLT5DdXJyZW50VHhSYXRlS2JwcyA9IHpjSW5kZXh0b1JhdGVONDBTW21jc107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIExvbmcgR0kgNDAgTUh6IE1JTU8gUmF0ZSAqLworICAgICAgICAgICAgICAgICAgICB3ZC0+Q3VycmVudFR4UmF0ZUticHMgPSB6Y0luZGV4dG9SYXRlTjQwTFttY3NdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigocGh5Q3RybCAmIDB4ODAwMDAwMDApICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBTaG9ydCBHSSAyMCBNSHogTUlNTyBSYXRlICovCisgICAgICAgICAgICAgICAgICAgIHdkLT5DdXJyZW50VHhSYXRlS2JwcyA9IHpjSW5kZXh0b1JhdGVOMjBTW21jc107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIExvbmcgR0kgMjAgTUh6IE1JTU8gUmF0ZSAqLworICAgICAgICAgICAgICAgICAgICB3ZC0+Q3VycmVudFR4UmF0ZUticHMgPSB6Y0luZGV4dG9SYXRlTjIwTFttY3NdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vODAyLjExIGhlYWRlcihpbmNsdWRlIElWKSA9IChobGVuPDwxKS04CisgICAgLy9ldGhlcm5ldCBmcmFtZSA9IGxlbgorICAgIC8vc25hcCArIG1pYyA9IHBsdXNMZW4KKyAgICAvL2V0aGVybmV0IGhlYWRlciA9IG1pbnVzTGVuCisgICAgLy9pY3YgPSBpY3ZMZW4KKyAgICAvL2NyYzMyID0gNAorICAgIC8vbGVuZ3RoPTgwMi4xMSBoZWFkZXIrc25hcCsoZXRoZXJuZXQgZnJhbWUtZXRoZXJuZXQgaGVhZGVyKSttaWMraWN2K2NyYzMyCisgICAgaGVhZGVyWzBdID0gKChobGVuPDwxKS04KStwbHVzTGVuKyhsZW4tbWludXNMZW4pK2ljdkxlbis0OyAgLy9MZW5ndGgKKworICAgIC8vIGhlYWRlclswXSA6IE1QRFUgTGVuZ3RocworICAgIGlmICgoaGVhZGVyWzZdICYgMHgxKSAhPSAweDEpIC8vIFVuaWNhc3QgRnJhbWUKKyAgICB7CisgICAgICAgIGlmIChoZWFkZXJbMF0gPj0gd2QtPnJ0c1RocmVzaG9sZCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRW5hYmxlIFJUUyAqLworICAgICAgICAgICAgbWFjQ3RybCB8PSAxOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCB3ZC0+c3RhLmVuY3J5TW9kZSA9PSBaTV9US0lQICkKKyAgICAgICAgdGtpcEZyYW1lT2Zmc2V0ID0gODsKKworICAgIGlmKCB3ZC0+c3RhLkVuYWJsZUhUICE9IDEgKQorICAgIHsgLy8gQWdncmVnYXRpb24gc2hvdWxkIG5vdCBiZSBmcmFnbWVudGVkICEKKyAgICAgICAgaWYgKCBoZWFkZXJbMF0gPiAoIHdkLT5mcmFnVGhyZXNob2xkICsgdGtpcEZyYW1lT2Zmc2V0ICkgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMDsgLy8gTmVlZCB0byBiZSBmcmFnbWVudGVkICEgIQorICAgICAgICB9CisgICAgfQorCisgICAgLy9pZiAoIHdkLT5zdGEuZW5jcnlNb2RlID09IFpNX1RLSVAgKQorICAgIC8veworICAgIC8vICAgIHptX2RlYnVnX21zZzEoImN0cmwgbGVuZ3RoID0gIiwgaGVhZGVyWzBdKTsKKyAgICAvL30KKworICAgIC8vTUFDIGNvbnRyb2wKKyAgICBpZiAocmF0ZVByb2JpbmdGbGFnICE9IDApCisgICAgeworICAgICAgICBtYWNDdHJsIHw9IDB4ODAwMDsKKyAgICB9CisgICAgaGVhZGVyWzFdID0gbWFjQ3RybDsKKyAgICAvL1BIWSBjb250cm9sIEwKKyAgICBoZWFkZXJbMl0gPSAodTE2X3QpICgocGh5Q3RybCYweGZmZmYpIHwgMHg3MDAgfCAoemNVcFRvQWNbdXAmMHg3XTw8MTMpKTsKKyAgICAvL1BIWSBjb250cm9sIEgKKyAgICBoZWFkZXJbM10gPSAodTE2X3QpICgocGh5Q3RybD4+MTYpIHwgMHg3MDApOworCisgICAgaWYgKHdkLT5lbmFibGVBZ2dyZWdhdGlvbikKKyAgICB7CisgICAgICAgIC8qIGZvcmNlIGVuYWJsZSBhZ2dyZWdhdGlvbiAqLworICAgICAgICBpZiAod2QtPmVuYWJsZUFnZ3JlZ2F0aW9uPT0yICYmICEoaGVhZGVyWzZdJjB4MSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoKGhlYWRlclsyXSAmIDB4MykgPT0gMikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRW5hYmxlIGFnZ3JlZ2F0aW9uICovCisgICAgICAgICAgICAgICAgaGVhZGVyWzFdIHw9IDB4MjA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogaWYgd2QtPmVuYWJsZUFnZ3JlZ2F0aW9uPTEgPT4gZm9yY2UgZGlzYWJsZSAqLworICAgICAgICAvKiBpZiB3ZC0+ZW5hYmxlQWdncmVnYXRpb249MCA9PiBhdXRvICovCisgICAgfQorCisjaWZkZWYgWk1fRU5BQkxFX0FHR1JFR0FUSU9OCisgICAgaWYgKHdkLT5hZGRiYUNvbXBsZXRlKSB7CisgICAgICAgICNpZmRlZiBaTV9CWVBBU1NfQUdHUl9TQ0hFRFVMSU5HCisgICAgICAgIGlmICghKGhlYWRlcls2XSYweDEpICYmICFyYXRlUHJvYmluZ0ZsYWcgJiYgKHdkLT5lbmFibGVBZ2dyZWdhdGlvbiAhPSAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCgoaGVhZGVyWzJdICYgMHgzKSA9PSAyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBVbmljYXN0IGZyYW1lIHdpdGggSFQgcmF0ZSA9PiBFbmFibGUgYWdncmVnYXRpb24gKi8KKyAgICAgICAgICAgICAgICAvKiBXZSBvbmx5IHN1cHBvcnQgc29mdHdhcmUgZW5jcnlwdGlvbiBpbiBzaW5nbGUgcGFja2V0IG1vZGUgKi8KKyAgICAgICAgICAgICAgICBpZiAoKHdkLT5zdGEuU1dFbmNyeXB0RW5hYmxlICYgWk1fU1dfVEtJUF9FTkNSWV9FTikgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAod2QtPnN0YS5TV0VuY3J5cHRFbmFibGUgJiBaTV9TV19XRVBfRU5DUllfRU4pID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBTZXQgYWdncmVnYXRpb24gZ3JvdXAgYml0cyBwZXIgQUMgKi8KKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyWzFdIHw9ICgweDIwIHwgKHpjVXBUb0FjW3VwJjB4N108PDEwKSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy9pZiAod2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5IDwgMzAwMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogaXNzdWU6IC1QQjQyIEVuYWJsZSBSVFMvQ1RTIHRvIHByZXZlbnQgT1dMIFR4IGhhbmcgdXAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHRoaXMgaXMgT3dsIEFwLCBlbmFibGUgUlRTL0NUUyBwcm90ZWN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICh3ZC0+c3RhLmF0aE93bEFwID09IDEpIHx8ICh3ZC0+c3RhLlJUU0luQUdHTW9kZSA9PSBUUlVFKSApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyWzFdICY9IDB4ZmZmYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbMV0gfD0gMHgxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgUklGUyA6IHdvcmthcm91bmQgODU0VCBSVFMvQ1RTICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBCaXQxMyA6IFRJIGVuYWJsZSBSSUZTICovCisgICAgICAgICAgICAgICAgICAgICAgICAvL2hlYWRlclsxXSB8PSAweDIwMDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgI2Vsc2UKKyAgICAgICAgLyoKKyAgICAgICAgICogYWdncmVnYXRpb24gYW1wZHVJbmRpY2F0aW9uIGNvbnRyb2wKKyAgICAgICAgICovCisgICAgICAgIGlmIChhZ2dDb250cm9sICYmIGFnZ0NvbnRyb2wtPmFnZ0VuYWJsZWQpIHsKKyAgICAgICAgICAgIGlmICh3ZC0+ZW5hYmxlQWdncmVnYXRpb249PTAgJiYgIShoZWFkZXJbNl0mMHgxKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKChoZWFkZXJbMl0gJiAweDMpID09IDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRW5hYmxlIGFnZ3JlZ2F0aW9uICovCisgICAgICAgICAgICAgICAgICAgIGhlYWRlclsxXSB8PSAweDIwOworICAgICAgICAgICAgICAgICAgICBpZiAoWk1fQUdHX0xBU1RfTVBEVSA9PSBhZ2dDb250cm9sLT5hbXBkdUluZGljYXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbMV0gfD0gMHg0MDAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgibm8gYWdnciwgaGVhZGVyWzJdJjB4MyA9ICIsaGVhZGVyWzJdICYgMHgzKQorICAgICAgICAgICAgICAgICAgICBhZ2dDb250cm9sLT5hZ2dFbmFibGVkID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJubyBhZ2dyLCB3ZC0+ZW5hYmxlQWdncmVnYXRpb24gPSAiLCB3ZC0+ZW5hYmxlQWdncmVnYXRpb24pOworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIm5vIGFnZ3IsICFoZWFkZXJbNl0mMHgxID0gIiwhKGhlYWRlcls2XSYweDEpKTsKKyAgICAgICAgICAgICAgICBhZ2dDb250cm9sLT5hZ2dFbmFibGVkID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAjZW5kaWYKKworICAgICAgICAjaWZkZWYgWk1fQUdHUl9CSVRfT04KKyAgICAgICAgaWYgKCEoaGVhZGVyWzZdJjB4MSkgJiYgIXJhdGVQcm9iaW5nRmxhZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCgoaGVhZGVyWzJdICYgMHgzKSA9PSAyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBVbmljYXN0IGZyYW1lIHdpdGggSFQgcmF0ZSA9PiBFbmFibGUgYWdncmVnYXRpb24gKi8KKyAgICAgICAgICAgICAgICAvKiBTZXQgYWdncmVnYXRpb24gZ3JvdXAgYml0cyBwZXIgQUMgKi8KKyAgICAgICAgICAgICAgICBoZWFkZXJbMV0gfD0gKDB4MjAgfCAoemNVcFRvQWNbdXAmMHg3XTw8MTApKTsKKworICAgICAgICAgICAgICAgIC8vaWYgKHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeSA8IDMwMDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgUlRTL0NUUyB0byBwcmV2ZW50IE9XTCBUeCBoYW5nIHVwICovCisgICAgICAgICAgICAgICAgICAgIGhlYWRlclsxXSAmPSAweGZmZmM7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlclsxXSB8PSAweDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICNlbmRpZgorICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIChobGVuPDwxKTsKK30KKworCit1MTZfdCB6ZlR4R2VuTW1IZWFkZXIoemRldl90KiBkZXYsIHU4X3QgZnJhbWVUeXBlLCB1MTZfdCogZHN0LAorICAgICAgICB1MTZfdCogaGVhZGVyLCB1MTZfdCBsZW4sIHpidWZfdCogYnVmLCB1MTZfdCB2YXAsIHU4X3QgZW5jcnlwdCkKK3sKKyAgICAvL3UxNl90IGJvZHlMZW47CisgICAgdThfdCAgaGxlbiA9IDMyOyAgICAgICAgLy8gTUFDIGN0cmwgKyBQSFkgY3RybCArIDgwMi4xMSBNTSBoZWFkZXIKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICAvKiBHZW5lcmF0ZSBjb250cm9sIHNldHRpbmcgKi8KKyAgICAvL2JvZHlMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKyAgICBoZWFkZXJbMF0gPSAyNCtsZW4rNDsgICAvL0xlbmd0aAorICAgIGlmICgoZHN0WzBdICYgMHgxKSAhPSAwKSAvL0Jyb2FkY2FzdCwgbXVsdGljYXN0IGZyYW1lcworICAgIHsKKyAgICAgICAgaGVhZGVyWzFdID0gMHhjOyAgICAgICAgICAgIC8vTUFDIGNvbnRyb2wsIGJhY2tvZmYgKyBub2FjaworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBoZWFkZXJbMV0gPSAweDg7ICAgICAgICAgICAgLy9NQUMgY29udHJvbCwgYmFja29mZiArIChhY2spCisgICAgfQorICAgIC8qIER1YWxiYW5kIE1hbmFnZW1lbnQgZnJhbWUgdHggUmF0ZSAqLworICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+ZnJlcXVlbmN5IDwgMzAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQ0NLIDFNICovCisgICAgICAgICAgICBoZWFkZXJbMl0gPSAweDBmMDA7ICAgICAgICAgIC8vUEhZIGNvbnRyb2wgTAorICAgICAgICAgICAgaGVhZGVyWzNdID0gMHgwMDAwOyAgICAgICAgICAvL1BIWSBjb250cm9sIEgKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENDSyA2TSAqLworICAgICAgICAgICAgaGVhZGVyWzJdID0gMHgwZjAxOyAgICAgICAgICAvL1BIWSBjb250cm9sIEwKKyAgICAgICAgICAgIGhlYWRlclszXSA9IDB4MDAwQjsgICAgICAgICAgLy9QSFkgY29udHJvbCBICisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeSA8IDMwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENDSyAyTSAqLworICAgICAgICAgICAgaGVhZGVyWzJdID0gMHgwZjAwOyAgICAgICAgICAvL1BIWSBjb250cm9sIEwKKyAgICAgICAgICAgIGhlYWRlclszXSA9IDB4MDAwMTsgICAgICAgICAgLy9QSFkgY29udHJvbCBICisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBDQ0sgNk0gKi8KKyAgICAgICAgICAgIGhlYWRlclsyXSA9IDB4MGYwMTsgICAgICAgICAgLy9QSFkgY29udHJvbCBMCisgICAgICAgICAgICBoZWFkZXJbM10gPSAweDAwMEI7ICAgICAgICAgIC8vUEhZIGNvbnRyb2wgSAorICAgICAgICB9CisgICAgfQorICAgIC8qIEdlbmVyYXRlIFdMQU4gaGVhZGVyICovCisgICAgLyogRnJhbWUgY29udHJvbCAqLworICAgIGhlYWRlcls0KzBdID0gZnJhbWVUeXBlOworICAgIC8qIER1cmF0aW9uICovCisgICAgaGVhZGVyWzQrMV0gPSAwOworCisgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFKQorICAgIHsKKyAgICAgICAgaWYgKCBmcmFtZVR5cGUgPT0gWk1fV0xBTl9GUkFNRV9UWVBFX1BST0JFUkVRICkKKyAgICAgICAgeworICAgICAgICAgICAgaGVhZGVyWzQrOF0gPSAweEZGRkY7CisgICAgICAgICAgICBoZWFkZXJbNCs5XSA9IDB4RkZGRjsKKyAgICAgICAgICAgIGhlYWRlcls0KzEwXSA9IDB4RkZGRjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggZnJhbWVUeXBlID09IFpNX1dMQU5fRlJBTUVfVFlQRV9CQSApIHsKKyAgICAgICAgICAgIC8qIGRvIG5vdGhpbmcgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGhlYWRlcls0KzhdID0gd2QtPnN0YS5ic3NpZFswXTsKKyAgICAgICAgICAgIGhlYWRlcls0KzldID0gd2QtPnN0YS5ic3NpZFsxXTsKKyAgICAgICAgICAgIGhlYWRlcls0KzEwXSA9IHdkLT5zdGEuYnNzaWRbMl07CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfUFNFVURPKQorICAgIHsKKyAgICAgICAgLyogQWRkcmVzcyAzID0gMDA6MDA6MDA6MDA6MDA6MDAgKi8KKyAgICAgICAgaGVhZGVyWzQrOF0gPSAwOworICAgICAgICBoZWFkZXJbNCs5XSA9IDA7CisgICAgICAgIGhlYWRlcls0KzEwXSA9IDA7CisgICAgfQorICAgIGVsc2UgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MpCisgICAgeworICAgICAgICBoZWFkZXJbNCs4XSA9IHdkLT5zdGEuYnNzaWRbMF07CisgICAgICAgIGhlYWRlcls0KzldID0gd2QtPnN0YS5ic3NpZFsxXTsKKyAgICAgICAgaGVhZGVyWzQrMTBdID0gd2QtPnN0YS5ic3NpZFsyXTsKKworICAgICAgICBpZiAoIGZyYW1lVHlwZSA9PSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVRJTSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHB1dCBBVElNIHRvIHF1ZXVlIDV0aCAqLworICAgICAgICAgICAgLy9oZWFkZXJbMl0gfD0gKFpNX0JJVF8xM3xaTV9CSVRfMTQpOworICAgICAgICAgICAgaGVhZGVyWzJdIHw9IFpNX0JJVF8xNTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICB7CisgICAgICAgIC8qIEFkZHJlc3MgMyA9IEJTU0lEICovCisgICAgICAgIGhlYWRlcls0KzhdID0gd2QtPm1hY0FkZHJbMF07CisgICAgICAgIGhlYWRlcls0KzldID0gd2QtPm1hY0FkZHJbMV07CisjaWZkZWYgWk1fVkFQTU9ERV9NVUxUSUxFX1NTSUQKKyAgICAgICAgaGVhZGVyWzQrMTBdID0gd2QtPm1hY0FkZHJbMl07IC8vTXVsdGlwbGUgU1NJRAorI2Vsc2UKKyAgICAgICAgaGVhZGVyWzQrMTBdID0gd2QtPm1hY0FkZHJbMl0gKyAodmFwPDw4KTsgLy9WQVAKKyNlbmRpZgorICAgICAgICAvL2lmIGluIHNjYW4sIG11c3Qgc2V0IGFkZHJlc3MgMyB0byBicm9hZGNhc3QgYmVjYXVzZSBvZiBzb21lIGFwIHdvdWxkIGNhcmUgdGhpcworICAgICAgICAvL2lmICgod2QtPmhlYXJ0QmVhdE5vdGlmaWNhdGlvbiAmIFpNX0JTU0lEX0xJU1RfU0NBTikKKyAgICAgICAgLy8gICAgICAgID09IFpNX0JTU0lEX0xJU1RfU0NBTikKKyAgICAgICAgLy9pZiBGcmFtZVR5cGUgaXMgUHJvYmUgUmVxdWVzdCwgQWRkcmVzczMgc2hvdWxkIGJlIGJvcmFkY2FzdAorICAgICAgICBpZiAoZnJhbWVUeXBlID09IFpNX1dMQU5fRlJBTUVfVFlQRV9QUk9CRVJFUSkKKyAgICAgICAgeworICAgICAgICAgICAgaGVhZGVyWzQrOF0gPSAweEZGRkY7CisgICAgICAgICAgICBoZWFkZXJbNCs5XSA9IDB4RkZGRjsKKyAgICAgICAgICAgIGhlYWRlcls0KzEwXSA9IDB4RkZGRjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEFkZHJlc3MgMSA9IERBICovCisgICAgaGVhZGVyWzQrMl0gPSBkc3RbMF07CisgICAgaGVhZGVyWzQrM10gPSBkc3RbMV07CisgICAgaGVhZGVyWzQrNF0gPSBkc3RbMl07CisKKyAgICAvKiBBZGRyZXNzIDIgPSBTQSAqLworICAgIGhlYWRlcls0KzVdID0gd2QtPm1hY0FkZHJbMF07CisgICAgaGVhZGVyWzQrNl0gPSB3ZC0+bWFjQWRkclsxXTsKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgeworI2lmZGVmIFpNX1ZBUE1PREVfTVVMVElMRV9TU0lECisgICAgICAgIGhlYWRlcls0KzddID0gd2QtPm1hY0FkZHJbMl07IC8vTXVsdGlwbGUgU1NJRAorI2Vsc2UKKyAgICAgICAgaGVhZGVyWzQrN10gPSB3ZC0+bWFjQWRkclsyXSArICh2YXA8PDgpOyAvL1ZBUAorI2VuZGlmCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGhlYWRlcls0KzddID0gd2QtPm1hY0FkZHJbMl07CisgICAgfQorCisgICAgLyogU2VxdWVuY2UgQ29udHJvbCAqLworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgaGVhZGVyWzQrMTFdID0gKCh3ZC0+bW1zZXErKyk8PDQpOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiggZnJhbWVUeXBlID09IFpNX1dMQU5fRlJBTUVfVFlQRV9RT1NfTlVMTCApCisgICAgeworICAgICAgICAvKlFvcyBDb250cm9sKi8KKyAgICAgICAgaGVhZGVyWzQrMTJdID0gMHgwOworICAgICAgICBobGVuKz0yOworICAgICAgICBoZWFkZXJbMF0rPTI7CisgICAgfQorCisgICAgaWYgKCBlbmNyeXB0ICkKKyAgICB7CisgICAgICAgIGlmICggd2QtPnN0YS53ZXBTdGF0dXMgPT0gWk1fRU5DUllQVElPTl9XRVBfRU5BQkxFRCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggKHdkLT5zdGEuZW5jcnlNb2RlID09IFpNX1dFUDY0KXx8CisgICAgICAgICAgICAgICAgICh3ZC0+c3RhLmVuY3J5TW9kZSA9PSBaTV9XRVAxMjgpfHwKKyAgICAgICAgICAgICAgICAgKHdkLT5zdGEuZW5jcnlNb2RlID09IFpNX1dFUDI1NikgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhlYWRlcls0XSB8PSAweDQwMDA7CisgICAgICAgICAgICAgICAgaGVhZGVyWzE2XSA9IDB4MDsgICAvL0lWCisgICAgICAgICAgICAgICAgaGVhZGVyWzE3XSA9IDB4MDsgLy9JVgorICAgICAgICAgICAgICAgIGhlYWRlclsxN10gfD0gKCgodTE2X3QpIHdkLT5zdGEua2V5SWQpIDw8IDE0KTsKKyAgICAgICAgICAgICAgICBobGVuICs9IDQ7CisKKyAgICAgICAgICAgICAgICBoZWFkZXJbMF0gKz0gODsgICAgICAgICAvLyBpY3ZMZW4gPSA0OworICAgICAgICAgICAgICAgIGhlYWRlclsxXSB8PSAweDQwOyAgICAgIC8vIGVuYWJsZSBlbmNyeXB0aW9uIG9uIG1hY0N0cmwKKyAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBFbmFibGUgSFcgZHVyYXRpb24KKyAgICBpZiAoIGZyYW1lVHlwZSAhPSBaTV9XTEFOX0ZSQU1FX1RZUEVfUFNQT0xMICkKKyAgICB7CisgICAgICAgIGhlYWRlclsxXSB8PSAweDIwMDsKKyAgICB9CisKKyAgICByZXR1cm4gaGxlbjsKK30KKwordm9pZCB6ZkluaXRNYWNBcE1vZGUoemRldl90KiBkZXYpCit7CisgICAgdTE2X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHpmSHBFbmFibGVCZWFjb24oZGV2LCBaTV9NT0RFX0FQLCAod2QtPmJlYWNvbkludGVydmFsL3dkLT5hcC52YXBOdW1iZXIpLCAxLCAwKTsKKworICAgIC8qIEFQIG1vZGUgKi8KKyAgICB6ZkhwU2V0QXBTdGFNb2RlKGRldiwgWk1fSEFMXzgwMjExX01PREVfQVApOworCisgICAgLyogVkFQIHRlc3QgY29kZSAqLworICAgIC8qIEFQICsgVkFQIG1vZGUgKi8KKyAgICBpZiAod2QtPmFwLnZhcE51bWJlciA+PSAyKQorICAgIHsKKyAgICAgICAgZm9yIChpPTE7IGk8Wk1fTUFYX0FQX1NVUFBPUlQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCgod2QtPmFwLmFwQml0bWFwID4+IGkpICYgMHgxKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHUxNl90IG1hY1szXTsKKyAgICAgICAgICAgICAgICBtYWNbMF0gPSB3ZC0+bWFjQWRkclswXTsKKyAgICAgICAgICAgICAgICBtYWNbMV0gPSB3ZC0+bWFjQWRkclsxXTsKKyNpZmRlZiBaTV9WQVBNT0RFX01VTFRJTEVfU1NJRAorICAgICAgICAgICAgICAgIG1hY1syXSA9IHdkLT5tYWNBZGRyWzJdOyAvL011bHRpcGxlIFNTSUQKKyNlbHNlCisgICAgICAgICAgICAgICAgbWFjWzJdID0gd2QtPm1hY0FkZHJbMl0gKyAoaTw8OCk7IC8vVkFQCisjZW5kaWYKKyAgICAgICAgICAgICAgICB6ZkhwU2V0TWFjQWRkcmVzcyhkZXYsIG1hYywgaSk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGJhc2ljIHJhdGUgc2V0dGluZyAqLworICAgIHpmSHBTZXRCYXNpY1JhdGVTZXQoZGV2LCB3ZC0+YlJhdGVCYXNpYywgd2QtPmdSYXRlQmFzaWMpOworCisgICAgLyogU2V0IFR4UXMgQ1dNSU4sIENXTUFYLCBBSUZTIGFuZCBUWE8gdG8gV01FIEFQIGRlZmF1bHQuICovCisgICAgemZVcGRhdGVEZWZhdWx0UW9zUGFyYW1ldGVyKGRldiwgMSk7CisKKyAgICByZXR1cm47Cit9CisKK3UxNl90IHpmQ2hHZXROZXh0Q2hhbm5lbCh6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcXVlbmN5LCB1OF90KiBwYlBhc3NpdmUpCit7CisgICAgdThfdCAgIGk7CisgICAgdThfdCAgIGJQYXNzaXZlOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogQXZvaWQgTlVMTCB2YWx1ZSAqLworICAgIGlmICggcGJQYXNzaXZlID09IE5VTEwgKQorICAgIHsKKyAgICAgICAgcGJQYXNzaXZlID0gJmJQYXNzaXZlOworICAgIH0KKworICAgIGZvciggaT0wOyBpPHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpKysgKQorICAgIHsKKyAgICAgICAgaWYgKCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsID09IGZyZXF1ZW5jeSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggaSA9PSAod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQtMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsRmxhZ3MKKyAgICAgICAgICAgICAgICAgICAgJiBaTV9SRUdfRkxBR19DSEFOTkVMX1BBU1NJVkUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpwYlBhc3NpdmUgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpwYlBhc3NpdmUgPSBGQUxTRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLmNoYW5uZWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMHhmZmZmOworfQorCit1MTZfdCB6ZkNoR2V0Rmlyc3RDaGFubmVsKHpkZXZfdCogZGV2LCB1OF90KiBwYlBhc3NpdmUpCit7CisgICAgdThfdCAgIGJQYXNzaXZlOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogQXZvaWQgTlVMTCB2YWx1ZSAqLworICAgIGlmICggcGJQYXNzaXZlID09IE5VTEwgKQorICAgIHsKKyAgICAgICAgcGJQYXNzaXZlID0gJmJQYXNzaXZlOworICAgIH0KKworICAgaWYgKCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFswXS5jaGFubmVsRmxhZ3MgJiBaTV9SRUdfRkxBR19DSEFOTkVMX1BBU1NJVkUgKQorICAgIHsKKyAgICAgICAgKnBiUGFzc2l2ZSA9IFRSVUU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpwYlBhc3NpdmUgPSBGQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbMF0uY2hhbm5lbDsKK30KKwordTE2X3QgemZDaEdldEZpcnN0MkdoekNoYW5uZWwoemRldl90KiBkZXYpCit7CisgICAgdThfdCAgICBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZm9yKCBpPTA7IGk8d2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQ7IGkrKyApCisgICAgeworICAgICAgICBpZiAoIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLmNoYW5uZWwgPCAzMDAwICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogZmluZCB0aGUgZmlyc3QgMkdoeiBjaGFubmVsICovCisgICAgICAgICAgICByZXR1cm4gd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIENhbiBub3QgZmluZCBhbnkgMkdoeiBjaGFubmVsICovCisgICAgcmV0dXJuIDA7Cit9CisKK3UxNl90IHpmQ2hHZXRGaXJzdDVHaHpDaGFubmVsKHpkZXZfdCogZGV2KQoreworICAgIHU4X3QgICAgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGZvciggaT0wOyBpPHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpKysgKQorICAgIHsKKyAgICAgICAgaWYgKCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsID4gMzAwMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGZpbmQgdGhlIGZpcnN0IDVHaHogY2hhbm5lbCAqLworICAgICAgICAgICAgcmV0dXJuIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLmNoYW5uZWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDYW4gbm90IGZpbmQgYW55IDVHaHogY2hhbm5lbCAqLworICAgIHJldHVybiAwOworfQorCit1MTZfdCB6ZkNoR2V0TGFzdENoYW5uZWwoemRldl90KiBkZXYsIHU4X3QqIHBiUGFzc2l2ZSkKK3sKKyAgICB1OF90ICAgYlBhc3NpdmU7CisgICAgdThfdCAgIENoYW5uZWxJbmRleDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIENoYW5uZWxJbmRleCA9IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250LTE7CisKKyAgICAvKiBBdm9pZCBOVUxMIHZhbHVlICovCisgICAgaWYgKCBwYlBhc3NpdmUgPT0gTlVMTCApCisgICAgeworICAgICAgICBwYlBhc3NpdmUgPSAmYlBhc3NpdmU7CisgICAgfQorCisgICAgaWYgKCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtDaGFubmVsSW5kZXhdLmNoYW5uZWxGbGFncworICAgICAgICAgICAgJiBaTV9SRUdfRkxBR19DSEFOTkVMX1BBU1NJVkUgKQorICAgIHsKKyAgICAgICAgKnBiUGFzc2l2ZSA9IFRSVUU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpwYlBhc3NpdmUgPSBGQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbQ2hhbm5lbEluZGV4XS5jaGFubmVsOworfQorCit1MTZfdCB6ZkNoR2V0TGFzdDVHaHpDaGFubmVsKHpkZXZfdCogZGV2KQoreworICAgIHU4X3QgICAgaTsKKyAgICB1MTZfdCAgIGxhc3Q1R2h6ZnJlcXVlbmN5OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgbGFzdDVHaHpmcmVxdWVuY3kgPSAwOworICAgIGZvciggaT0wOyBpPHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpKysgKQorICAgIHsKKyAgICAgICAgaWYgKCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsID4gMzAwMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxhc3Q1R2h6ZnJlcXVlbmN5ID0gd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBsYXN0NUdoemZyZXF1ZW5jeTsKK30KKworLyogZnJlcUJhbmQgPSAwID0+IGF1dG8gY2hlY2sgICAqLworLyogICAgICAgICAgPSAxID0+IDIuNCBHSHogYmFuZCAqLworLyogICAgICAgICAgPSAyID0+IDUgR0h6IGJhbmQgICAqLwordTE2X3QgemZDaE51bVRvRnJlcSh6ZGV2X3QqIGRldiwgdThfdCBjaCwgdThfdCBmcmVxQmFuZCkKK3sKKyAgICB1MTZfdCBmcmVxID0gMHhmZmZmOworCisgICAgaWYgKCBmcmVxQmFuZCA9PSAwICkKKyAgICB7CisgICAgICAgIGlmIChjaCA+IDE0KQorICAgICAgICB7ICAgLyogYWRhcHRlciBpcyBhdCA1IEdIeiBiYW5kICovCisgICAgICAgICAgICBmcmVxQmFuZCA9IDI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmcmVxQmFuZCA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIGZyZXFCYW5kID09IDIgKQorICAgIHsgICAvKiB0aGUgY2hhbm5lbCBiZWxvbmdzIHRvIDUgR0h6IGJhbmQgKi8KKyAgICAgICAgaWYgKCAoY2ggPj0gMTg0KSYmKGNoIDw9IDE5NikgKQorICAgICAgICB7CisgICAgICAgICAgICBmcmVxID0gNDAwMCArIGNoKjU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmcmVxID0gNTAwMCArIGNoKjU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsgICAvKiB0aGUgY2hhbm5lbCBiZWxvbmdzIHRvIDIuNCBHSHogYmFuZCAqLworICAgICAgICBpZiAoIGNoID09IDE0ICkKKyAgICAgICAgeworICAgICAgICAgICAgZnJlcSA9IFpNX0NIX0dfMTQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmcmVxID0gWk1fQ0hfR18xICsgKGNoLTEpKjU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZnJlcTsKK30KKwordThfdCB6ZkNoRnJlcVRvTnVtKHUxNl90IGZyZXEsIHU4X3QqIHBiSXM1R0JhbmQpCit7CisgICAgdThfdCAgIGNoOworICAgIHU4X3QgICBJczVHQmFuZDsKKworICAgIC8qIHRvIGF2b2lkIE5VTEwgdmFsdWUgKi8KKyAgICBpZiAoIHBiSXM1R0JhbmQgPT0gTlVMTCApCisgICAgeworICAgICAgICBwYklzNUdCYW5kID0gJklzNUdCYW5kOworICAgIH0KKworICAgICpwYklzNUdCYW5kID0gRkFMU0U7CisKKyAgICBpZiAoIGZyZXEgPT0gWk1fQ0hfR18xNCApCisgICAgeworICAgICAgICBjaCA9IDE0OworICAgIH0KKyAgICBlbHNlIGlmICggZnJlcSA8IDQwMDAgKQorICAgIHsKKyAgICAgICAgY2ggPSAoZnJlcSAtIFpNX0NIX0dfMSkgLyA1ICsgMTsKKyAgICB9CisgICAgZWxzZSBpZiAoIGZyZXEgPCA1MDAwICkKKyAgICB7CisgICAgICAgIGNoID0gKGZyZXEgLSA0MDAwKSAvIDU7CisgICAgICAgICpwYklzNUdCYW5kID0gVFJVRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY2ggPSAoZnJlcSAtIDUwMDApIC8gNTsKKyAgICAgICAgKnBiSXM1R0JhbmQgPSBUUlVFOworICAgIH0KKworICAgIHJldHVybiBjaDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jbW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jbW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzQzNzlkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NtbS5jCkBAIC0wLDAgKzEsMjE0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogbW0uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBjb21tb24gZnVuY3Rpb25zIGZvciBoYW5kbGUgbWFuYWdlbWVudCAgICAgKi8KKy8qICAgICAgZnJhbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJjcHJlY29tcC5oIgorI2luY2x1ZGUgIi4uL2hhbC9ocHJlZy5oIgorCisvKiBUT0RPIDogcHV0IGFsbCBjb25zdGFudCB0YWJsZXMgdG8gYSBmaWxlICovCitjb25zdCB1OF90IHpnMTFiUmF0ZVRibFs0XSA9IHsyLCA0LCAxMSwgMjJ9OworY29uc3QgdThfdCB6ZzExZ1JhdGVUYmxbOF0gPSB7MTIsIDE4LCAyNCwgMzYsIDQ4LCA3MiwgOTYsIDEwOH07CisKKy8qIDB4ZmYgPT4gZWxlbWVudCBkb2VzIG5vdCBleGlzdCAqLworY29uc3QgdThfdCB6Z0VsZW1lbnRPZmZzZXRUYWJsZVtdID0KK3sKKyAgICA0LCAgICAgIC8qICAwIDogYXNvYyByZXEgKi8KKyAgICA2LCAgICAgIC8qICAxIDogYXNvYyByc3AgKi8KKyAgICAxMCwgICAgIC8qICAyIDogcmVhc29jIHJlcSovCisgICAgNiwgICAgICAvKiAgMyA6IHJlYXNvYyByc3AgKi8KKyAgICAwLCAgICAgIC8qICA0IDogcHJvYmUgcmVxICovCisgICAgMTIsICAgICAvKiAgNSA6IHByb2JlIHJzcCAqLworICAgIDB4ZmYsICAgLyogIDYgOiByZXNlcnZlZCAqLworICAgIDB4ZmYsICAgLyogIDcgOiByZXNlcnZlZCAqLworICAgIDEyLCAgICAgLyogIDggOiBiZWFjb24gKi8KKyAgICA0LCAgICAgIC8qICA5IDogQVRJTSAqLworICAgIDB4ZmYsICAgLyogMTAgOiBkaXNhc29jICovCisgICAgNiwgICAgICAvKiAxMSA6IGF1dGggKi8KKyAgICAweGZmLCAgIC8qIDEyIDogZGVhdXRoICovCisgICAgNCwgICAgICAvKiAxMyA6IGFjdGlvbiAqLworICAgIDB4ZmYsICAgLyogMTQgOiByZXNlcnZlZCAqLworICAgIDB4ZmYsICAgLyogMTUgOiByZXNlcnZlZCAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmRmluZEVsZW1lbnQgICAgICAgICAgICAgICAqLworLyogICAgICBGaW5kIGEgc3BlY2lmaWMgZWxlbWVudCBpbiBtYW5hZ2VtZW50IGZyYW1lICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogbWFuYWdlbWVudCBmcmFtZSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGVpZCA6IHRhcmdldCBlbGVtZW50IGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ5dGUgb2Zmc2V0IG9mIHRhcmdldCBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvciAweGZmZmYgaWYgbm90IGZvdW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMCAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZGaW5kRWxlbWVudCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QgZWlkKQoreworICAgIHU4X3Qgc3ViVHlwZTsKKyAgICB1MTZfdCBvZmZzZXQ7CisgICAgdTE2X3QgYnVmTGVuOworICAgIHUxNl90IGVsZW47CisgICAgdThfdCBpZCwgSFRFaWQ9MDsKKyAgICB1OF90IG91aVs0XSA9IHsweDAwLCAweDUwLCAweGYyLCAweDAxfTsKKyAgICB1OF90IG91aTExblszXSA9IHsweDAwLDB4OTAsMHg0Q307CisgICAgdThfdCBIVFR5cGUgPSAwOworCisgICAgLyogR2V0IG9mZnNldCBvZiBmaXJzdCBlbGVtZW50ICovCisgICAgc3ViVHlwZSA9ICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKSA+PiA0KTsKKyAgICBpZiAoKG9mZnNldCA9IHpnRWxlbWVudE9mZnNldFRhYmxlW3N1YlR5cGVdKSA9PSAweGZmKQorICAgIHsKKyAgICAgICAgem1fYXNzZXJ0KDApOworICAgIH0KKworICAgIC8qIFBsdXMgd2xhbiBoZWFkZXIgKi8KKyAgICBvZmZzZXQgKz0gMjQ7CisKKyAgICAvLyBqaGxlZSBIVCAwCisKKyAgICBpZiAoKGVpZCA9PSBaTV9XTEFOX0VJRF9IVF9DQVBBQklMSVRZKSB8fAorICAgICAgICAoZWlkID09IFpNX1dMQU5fRUlEX0VYVEVOREVEX0hUX0NBUEFCSUxJVFkpKQorICAgIHsKKyAgICAgICAgSFRFaWQgPSBlaWQ7CisgICAgICAgIGVpZCA9IFpNX1dMQU5fRUlEX1dQQV9JRTsKKyAgICAgICAgSFRUeXBlID0gMTsKKyAgICB9CisKKworICAgIGJ1ZkxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworICAgIC8qIFNlYXJjaCBsb29wICovCisgICAgd2hpbGUgKChvZmZzZXQrMik8YnVmTGVuKSAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRpbmcgZWxlbWVudCBJRCBhbmQgbGVuZ3RoICgyYnl0ZXMpCisgICAgeworICAgICAgICAvKiBTZWFyY2ggdGFyZ2V0IGVsZW1lbnQgKi8KKyAgICAgICAgaWYgKChpZCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCkpID09IGVpZCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQmluZ28gKi8KKyAgICAgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSk+KGJ1ZkxlbiAtIG9mZnNldCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRWxlbWVudCBsZW5ndGggZXJyb3IgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGVsZW4gPT0gMCAmJiBlaWQgIT0gWk1fV0xBTl9FSURfU1NJRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBFbGVtZW50IGxlbmd0aCBlcnJvciAqLworICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggZWlkID09IFpNX1dMQU5fRUlEX1dQQV9JRSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogYXZvaWQgc3RhIHRvIGJlIHRob3VnaHQgdXNlIDExbiB3aGVuIGZpbmQgYSBXUEFfSUUgKi8KKyAgICAgICAgICAgICAgICBpZiAoIChIVFR5cGUgPT0gMCkgJiYgemZSeEJ1ZmZlckVxdWFsVG9TdHIoZGV2LCBidWYsIG91aSwgb2Zmc2V0KzIsIDQpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gamhsZWUgSFQgMAorICAgICAgICAgICAgICAgIC8vIENXWWFuZygrKQorCisgICAgICAgICAgICAgICAgaWYgKChIVFR5cGUgPT0gMSkgJiYgKCB6ZlJ4QnVmZmVyRXF1YWxUb1N0cihkZXYsIGJ1Ziwgb3VpMTFuLCBvZmZzZXQrMiwgMykgKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzUpID09IEhURWlkICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldCArIDU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIEFkdmFuY2UgdG8gbmV4dCBlbGVtZW50ICovCisgICAgICAgICNpZiAxCisgICAgICAgIGVsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSk7CisgICAgICAgICNlbHNlCisgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgfQorICAgICAgICAjZW5kaWYKKworICAgICAgICBvZmZzZXQgKz0gKGVsZW4rMik7CisgICAgfQorICAgIHJldHVybiAweGZmZmY7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmRmluZFdpZmlFbGVtZW50ICAgICAgICAgICAqLworLyogICAgICBGaW5kIGEgc3BlY2lmaWMgV2lmaSBlbGVtZW50IGluIG1hbmFnZW1lbnQgZnJhbWUgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogbWFuYWdlbWVudCBmcmFtZSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHR5cGUgOiBPVUkgdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBzdWJUeXBlIDogT1VJIHN1YnR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBieXRlIG9mZnNldCBvZiB0YXJnZXQgZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgb3IgMHhmZmZmIGlmIG5vdCBmb3VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDYuMSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmRmluZFdpZmlFbGVtZW50KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCB0eXBlLCB1OF90IHN1YnR5cGUpCit7CisgICAgdThfdCBzdWJUeXBlOworICAgIHUxNl90IG9mZnNldDsKKyAgICB1MTZfdCBidWZMZW47CisgICAgdTE2X3QgZWxlbjsKKyAgICB1OF90IGlkOworICAgIHU4X3QgdG1wOworCisgICAgLyogR2V0IG9mZnNldCBvZiBmaXJzdCBlbGVtZW50ICovCisgICAgc3ViVHlwZSA9ICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKSA+PiA0KTsKKworICAgIGlmICgob2Zmc2V0ID0gemdFbGVtZW50T2Zmc2V0VGFibGVbc3ViVHlwZV0pID09IDB4ZmYpCisgICAgeworICAgICAgICB6bV9hc3NlcnQoMCk7CisgICAgfQorCisgICAgLyogUGx1cyB3bGFuIGhlYWRlciAqLworICAgIG9mZnNldCArPSAyNDsKKworICAgIGJ1ZkxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworICAgIC8qIFNlYXJjaCBsb29wICovCisgICAgd2hpbGUgKChvZmZzZXQrMik8YnVmTGVuKSAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRpbmcgZWxlbWVudCBJRCBhbmQgbGVuZ3RoICgyYnl0ZXMpCisgICAgeworICAgICAgICAvKiBTZWFyY2ggdGFyZ2V0IGVsZW1lbnQgKi8KKyAgICAgICAgaWYgKChpZCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCkpID09IFpNX1dMQU5fRUlEX1dJRklfSUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEJpbmdvICovCisgICAgICAgICAgICBpZiAoKGVsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkpPihidWZMZW4gLSBvZmZzZXQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEVsZW1lbnQgbGVuZ3RoIGVycm9yICovCisgICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBlbGVuID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKSkgPT0gMHgwMCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKCh0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMykpID09IDB4NTApCisgICAgICAgICAgICAgICAgICAgICYmICgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzQpKSA9PSAweEYyKQorICAgICAgICAgICAgICAgICAgICAmJiAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs1KSkgPT0gdHlwZSkpCisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIHN1YnR5cGUgIT0gMHhmZiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoICh0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNikpID09IHN1YnR5cGUgICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBBZHZhbmNlIHRvIG5leHQgZWxlbWVudCAqLworICAgICAgICBpZiAoKGVsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICAgIH0KKyAgICAgICAgb2Zmc2V0ICs9IChlbGVuKzIpOworICAgIH0KKyAgICByZXR1cm4gMHhmZmZmOworfQorCit1MTZfdCB6ZlJlbW92ZUVsZW1lbnQoemRldl90KiBkZXYsIHU4X3QqIGJ1ZiwgdTE2X3Qgc2l6ZSwgdThfdCBlaWQpCit7CisgICAgdTE2X3Qgb2Zmc2V0ID0gMDsKKyAgICB1MTZfdCBlbGVuOworICAgIHU4X3QgIEhURWlkID0gMDsKKyAgICB1OF90ICBvdWlbNF0gPSB7MHgwMCwgMHg1MCwgMHhmMiwgMHgwMX07CisgICAgdThfdCAgb3VpMTFuWzNdID0gezB4MDAsMHg5MCwweDRDfTsKKyAgICB1OF90ICBIVFR5cGUgPSAwOworCisgICAgaWYgKChlaWQgPT0gWk1fV0xBTl9FSURfSFRfQ0FQQUJJTElUWSkgfHwKKyAgICAgICAgKGVpZCA9PSBaTV9XTEFOX0VJRF9FWFRFTkRFRF9IVF9DQVBBQklMSVRZKSkKKyAgICB7CisgICAgICAgIEhURWlkID0gZWlkOworICAgICAgICBlaWQgPSBaTV9XTEFOX0VJRF9XUEFfSUU7CisgICAgICAgIEhUVHlwZSA9IDE7CisgICAgfQorCisgICAgd2hpbGUgKG9mZnNldCA8IHNpemUpCisgICAgeworICAgICAgICBlbGVuID0gKihidWYrb2Zmc2V0KzEpOworCisgICAgICAgIGlmICgqKGJ1ZitvZmZzZXQpID09IGVpZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBlaWQgPT0gWk1fV0xBTl9FSURfV1BBX0lFICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIChIVFR5cGUgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICYmICgqKGJ1ZitvZmZzZXQrMikgPT0gb3VpWzBdKQorICAgICAgICAgICAgICAgICAgICAgJiYgKCooYnVmK29mZnNldCszKSA9PSBvdWlbMV0pCisgICAgICAgICAgICAgICAgICAgICAmJiAoKihidWYrb2Zmc2V0KzQpID09IG91aVsyXSkKKyAgICAgICAgICAgICAgICAgICAgICYmICgqKGJ1ZitvZmZzZXQrNSkgPT0gb3VpWzNdKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6Zk1lbW9yeU1vdmUoYnVmK29mZnNldCwgYnVmK29mZnNldCtlbGVuKzIsIHNpemUtb2Zmc2V0LWVsZW4tMik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoc2l6ZS1lbGVuLTIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICggKEhUVHlwZSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAmJiAoKihidWYrb2Zmc2V0KzIpID09IG91aTExblswXSkKKyAgICAgICAgICAgICAgICAgICAgJiYgKCooYnVmK29mZnNldCszKSA9PSBvdWkxMW5bMV0pCisgICAgICAgICAgICAgICAgICAgICYmICgqKGJ1ZitvZmZzZXQrNCkgPT0gb3VpMTFuWzJdKQorICAgICAgICAgICAgICAgICAgICAmJiAoKihidWYrb2Zmc2V0KzUpID09IEhURWlkKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6Zk1lbW9yeU1vdmUoYnVmK29mZnNldCwgYnVmK29mZnNldCtlbGVuKzIsIHNpemUtb2Zmc2V0LWVsZW4tMik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoc2l6ZS1lbGVuLTIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6Zk1lbW9yeU1vdmUoYnVmK29mZnNldCwgYnVmK29mZnNldCtlbGVuKzIsIHNpemUtb2Zmc2V0LWVsZW4tMik7CisgICAgICAgICAgICAgICAgcmV0dXJuIChzaXplLWVsZW4tMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvZmZzZXQgKz0gKGVsZW4rMik7CisgICAgfQorCisgICAgcmV0dXJuIHNpemU7Cit9CisKK3UxNl90IHpmVXBkYXRlRWxlbWVudCh6ZGV2X3QqIGRldiwgdThfdCogYnVmLCB1MTZfdCBzaXplLCB1OF90KiB1cGRhdGVlaWQpCit7CisgICAgdTE2X3Qgb2Zmc2V0ID0gMDsKKyAgICB1MTZfdCBlbGVuOworCisgICAgd2hpbGUgKG9mZnNldCA8IHNpemUpIHsKKyAgICAgICAgZWxlbiA9ICooYnVmK29mZnNldCsxKTsKKworICAgICAgICBpZiAoKihidWYrb2Zmc2V0KSA9PSB1cGRhdGVlaWRbMF0pIHsKKyAgICAgICAgICAgIGlmICh1cGRhdGVlaWRbMV0gPD0gZWxlbikgeworICAgICAgICAgICAgICAgIHpmTWVtb3J5TW92ZShidWYrb2Zmc2V0LCB1cGRhdGVlaWQsIHVwZGF0ZWVpZFsxXSsyKTsKKyAgICAgICAgICAgICAgICB6Zk1lbW9yeU1vdmUoYnVmK29mZnNldCt1cGRhdGVlaWRbMV0rMiwgYnVmK29mZnNldCtlbGVuKzIsIHNpemUtb2Zmc2V0LWVsZW4tMik7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gc2l6ZS0oZWxlbi11cGRhdGVlaWRbMV0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB6Zk1lbW9yeU1vdmUoYnVmK29mZnNldCt1cGRhdGVlaWRbMV0rMiwgYnVmK29mZnNldCtlbGVuKzIsIHNpemUtb2Zmc2V0LWVsZW4tMik7CisgICAgICAgICAgICAgICAgemZNZW1vcnlNb3ZlKGJ1ZitvZmZzZXQsIHVwZGF0ZWVpZCwgdXBkYXRlZWlkWzFdKzIpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHNpemUrKHVwZGF0ZWVpZFsxXS1lbGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG9mZnNldCArPSAoZWxlbisyKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2l6ZTsKK30KKwordTE2X3QgemZGaW5kU3VwZXJHRWxlbWVudCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QgdHlwZSkKK3sKKyAgICB1OF90IHN1YlR5cGU7CisgICAgdTE2X3Qgb2Zmc2V0OworICAgIHUxNl90IGJ1ZkxlbjsKKyAgICB1MTZfdCBlbGVuOworICAgIHU4X3QgaWQ7CisgICAgdThfdCBzdXBlcl9mZWF0dXJlOworICAgIHU4X3Qgb3VpU3VwZXJHWzZdID0gezB4MDAsMHgwMywweDdmLDB4MDEsIDB4MDEsIDB4MDB9OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogR2V0IG9mZnNldCBvZiBmaXJzdCBlbGVtZW50ICovCisgICAgc3ViVHlwZSA9ICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKSA+PiA0KTsKKyAgICBpZiAoKG9mZnNldCA9IHpnRWxlbWVudE9mZnNldFRhYmxlW3N1YlR5cGVdKSA9PSAweGZmKQorICAgIHsKKyAgICAgICAgem1fYXNzZXJ0KDApOworICAgIH0KKworICAgIC8qIFBsdXMgd2xhbiBoZWFkZXIgKi8KKyAgICBvZmZzZXQgKz0gMjQ7CisKKyAgICBidWZMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKyAgICAvKiBTZWFyY2ggbG9vcCAqLworICAgIHdoaWxlICgob2Zmc2V0KzIpPGJ1ZkxlbikgICAgICAgICAgICAgICAgICAgLy8gaW5jbHVkaW5nIGVsZW1lbnQgSUQgYW5kIGxlbmd0aCAoMmJ5dGVzKQorICAgIHsKKyAgICAgICAgLyogU2VhcmNoIHRhcmdldCBlbGVtZW50ICovCisgICAgICAgIGlmICgoaWQgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpKSA9PSBaTV9XTEFOX0VJRF9WRU5ET1JfUFJJVkFURSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQmluZ28gKi8KKyAgICAgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSk+KGJ1ZkxlbiAtIG9mZnNldCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRWxlbWVudCBsZW5ndGggZXJyb3IgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGVsZW4gPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHpmUnhCdWZmZXJFcXVhbFRvU3RyKGRldiwgYnVmLCBvdWlTdXBlckcsIG9mZnNldCsyLCA2KSAmJiAoIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSA+PSA2KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBzdXBlcl9mZWF0dXJlIDA6dXNlRmFzdEZyYW1lLCAxOnVzZUNvbXByZXNzaW9uLCAyOnVzZVR1cmJvUHJpbWUgKi8KKyAgICAgICAgICAgICAgICBzdXBlcl9mZWF0dXJlPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOCk7CisgICAgICAgICAgICAgICAgaWYgKChzdXBlcl9mZWF0dXJlICYgMHgwMSkgfHwgKHN1cGVyX2ZlYXR1cmUgJiAweDAyKSB8fCAoc3VwZXJfZmVhdHVyZSAmIDB4MDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogQWR2YW5jZSB0byBuZXh0IGVsZW1lbnQgKi8KKyAgICAgICAgI2lmIDEKKyAgICAgICAgZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgaWYgKChlbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICB9CisgICAgICAgICNlbmRpZgorCisgICAgICAgIG9mZnNldCArPSAoZWxlbisyKTsKKyAgICB9CisgICAgcmV0dXJuIDB4ZmZmZjsKK30KKwordTE2X3QgemZGaW5kWFJFbGVtZW50KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCB0eXBlKQoreworICAgIHU4X3Qgc3ViVHlwZTsKKyAgICB1MTZfdCBvZmZzZXQ7CisgICAgdTE2X3QgYnVmTGVuOworICAgIHUxNl90IGVsZW47CisgICAgdThfdCBpZDsKKyAgICB1OF90IG91aXhyWzZdID0gezB4MDAsMHgwMywweDdmLDB4MDMsIDB4MDEsIDB4MDB9OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogR2V0IG9mZnNldCBvZiBmaXJzdCBlbGVtZW50ICovCisgICAgc3ViVHlwZSA9ICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKSA+PiA0KTsKKyAgICBpZiAoKG9mZnNldCA9IHpnRWxlbWVudE9mZnNldFRhYmxlW3N1YlR5cGVdKSA9PSAweGZmKQorICAgIHsKKyAgICAgICAgem1fYXNzZXJ0KDApOworICAgIH0KKworICAgIC8qIFBsdXMgd2xhbiBoZWFkZXIgKi8KKyAgICBvZmZzZXQgKz0gMjQ7CisKKyAgICBidWZMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKyAgICAvKiBTZWFyY2ggbG9vcCAqLworICAgIHdoaWxlICgob2Zmc2V0KzIpPGJ1ZkxlbikgICAgICAgICAgICAgICAgICAgLy8gaW5jbHVkaW5nIGVsZW1lbnQgSUQgYW5kIGxlbmd0aCAoMmJ5dGVzKQorICAgIHsKKyAgICAgICAgLyogU2VhcmNoIHRhcmdldCBlbGVtZW50ICovCisgICAgICAgIGlmICgoaWQgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpKSA9PSBaTV9XTEFOX0VJRF9WRU5ET1JfUFJJVkFURSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQmluZ28gKi8KKyAgICAgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSk+KGJ1ZkxlbiAtIG9mZnNldCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRWxlbWVudCBsZW5ndGggZXJyb3IgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGVsZW4gPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHpmUnhCdWZmZXJFcXVhbFRvU3RyKGRldiwgYnVmLCBvdWl4ciwgb2Zmc2V0KzIsIDYpICYmICggem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpID49IDYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogQWR2YW5jZSB0byBuZXh0IGVsZW1lbnQgKi8KKyAgICAgICAgI2lmIDEKKyAgICAgICAgZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgaWYgKChlbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICB9CisgICAgICAgICNlbmRpZgorCisgICAgICAgIG9mZnNldCArPSAoZWxlbisyKTsKKyAgICB9CisgICAgcmV0dXJuIDB4ZmZmZjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmTW1BZGRJZVN1cHBvcnRSYXRlICAgICAgICAqLworLyogICAgICBBZGQgaW5mb3JtYXRpb24gZWxlbWVudCBTdXBwb3J0IFJhdGUgdG8gYnVmZmVyLiAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHRvIGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLworLyogICAgICBlaWQgOiBlbGVtZW50IElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcmF0ZVNldCA6ICBDQ0sgb3IgT0ZETSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmZmVyIG9mZnNldCBhZnRlciBhZGRpbmcgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmTW1BZGRJZVN1cHBvcnRSYXRlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGVpZCwgdThfdCByYXRlU2V0KQoreworICAgIHU4X3QgbGVuID0gMDsKKyAgICB1MTZfdCBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy9pZiAoIChyYXRlU2V0ID09IFpNX1JBVEVfU0VUX09GRE0pJiYoKHdkLT5nUmF0ZSAmIDB4ZmYpID09IDApICkKKyAgICAvL3sKKyAgICAvLyAgICByZXR1cm4gb2Zmc2V0OworICAgIC8vfQorCisgICAgLyogSW5mb3JtYXRpb24gOiBTdXBwb3J0IFJhdGUgKi8KKyAgICBpZiAoIHJhdGVTZXQgPT0gWk1fUkFURV9TRVRfQ0NLICkKKyAgICB7CisgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCh3ZC0+YlJhdGUgJiAoMHgxPDxpKSkgPT0gKDB4MTw8aSkpCisgICAgICAgICAgICAvL2lmICgoMHhmICYgKDB4MTw8aSkpID09ICgweDE8PGkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrbGVuKzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemcxMWJSYXRlVGJsW2ldKygod2QtPmJSYXRlQmFzaWMgJiAoMHgxPDxpKSk8PCg3LWkpKSk7CisgICAgICAgICAgICAgICAgbGVuKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIHJhdGVTZXQgPT0gWk1fUkFURV9TRVRfT0ZETSApCisgICAgeworICAgICAgICBmb3IgKGk9MDsgaTw4OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgod2QtPmdSYXRlICYgKDB4MTw8aSkpID09ICgweDE8PGkpKQorICAgICAgICAgICAgLy9pZiAoKDB4ZmYgJiAoMHgxPDxpKSkgPT0gKDB4MTw8aSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCtsZW4rMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZzExZ1JhdGVUYmxbaV0rKCh3ZC0+Z1JhdGVCYXNpYyAmICgweDE8PGkpKTw8KDctaSkpKTsKKyAgICAgICAgICAgICAgICBsZW4rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChsZW4gPiAwKQorICAgIHsKKyAgICAgICAgLyogRWxlbWVudCBJRCAqLworICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0LCBlaWQpOworCisgICAgICAgIC8qIEVsZW1lbnQgTGVuZ3RoICovCisgICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrMSwgbGVuKTsKKworICAgICAgICAvKiBSZXR1cm4gdmFsdWUgKi8KKyAgICAgICAgb2Zmc2V0ICs9ICgyK2xlbik7CisgICAgfQorCisgICAgcmV0dXJuIG9mZnNldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmTW1BZGRJZURzICAgICAgICAgICAgICAgICAqLworLyogICAgICBBZGQgaW5mb3JtYXRpb24gZWxlbWVudCBEUyB0byBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHRvIGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZmZlciBvZmZzZXQgYWZ0ZXIgYWRkaW5nIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEwICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6Zk1tQWRkSWVEcyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBFbGVtZW50IElEICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBaTV9XTEFOX0VJRF9EUyk7CisKKyAgICAvKiBFbGVtZW50IExlbmd0aCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMSk7CisKKyAgICAvKiBJbmZvcm1hdGlvbiA6IERTICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLAorICAgICAgICAgICAgICAgICAgICAgICAgIHpmQ2hGcmVxVG9OdW0od2QtPmZyZXF1ZW5jeSwgTlVMTCkpOworCisgICAgcmV0dXJuIG9mZnNldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZNbUFkZEllRXJwICAgICAgICAgICAgICAgICovCisvKiAgICAgIEFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IEVSUCB0byBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWYgOiBidWZmZXIgdG8gYWRkIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgb2Zmc2V0IDogYWRkIGluZm9ybWF0aW9uIGVsZW1lbnQgZnJvbSB0aGlzIG9mZnNldCAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmZmVyIG9mZnNldCBhZnRlciBhZGRpbmcgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmTW1BZGRJZUVycCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBFbGVtZW50IElEICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBaTV9XTEFOX0VJRF9FUlApOworCisgICAgLyogRWxlbWVudCBMZW5ndGggKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDEpOworCisgICAgLyogSW5mb3JtYXRpb24gOiBFUlAgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5lcnBFbGVtZW50KTsKKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmTW1BZGRJZVdwYSAgICAgICAgICAgICAgICAqLworLyogICAgICBBZGQgaW5mb3JtYXRpb24gZWxlbWVudCBXUEEgdG8gYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHRvIGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZmZlciBvZmZzZXQgYWZ0ZXIgYWRkaW5nIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFl1YW4tR3UgV2VpICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA2LjIgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6Zk1tQWRkSWVXcGEoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHUxNl90IGFwSWQpCit7CisgICAgLy9zdHJ1Y3QgenNXbGFuRGV2KiB3ZCA9IChzdHJ1Y3QgenNXbGFuRGV2Kikgem13X3dsYW5fZGV2KGRldik7CisgICAgaW50IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBFbGVtZW50IElEICovCisgICAgLy96bXdfaW50dHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIFpNX1dMQU5fRUlEX1dQQV9JRSk7CisKKyAgICAvKiBFbGVtZW50IExlbmd0aCAqLworICAgIC8vem13X2ludHR4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+YXAud3BhTGVuKTsKKyAgICBmb3IoaSA9IDA7IGkgPCB3ZC0+YXAud3BhTGVuW2FwSWRdOyBpKyspCisgICAgeworICAgICAgICAvKiBJbmZvcm1hdGlvbiA6IFdQQSAqLworICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5hcC53cGFJZVthcElkXVtpXSk7CisgICAgfQorCisgICAgcmV0dXJuIG9mZnNldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmTW1BZGRIVENhcGFiaWxpdHkgICAgICAgICAqLworLyogICAgICBBZGQgSFQgQ2FwYWJpbGl0eSBJbmZvbWF0aW9uIHRvIGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHRvIGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZmZlciBvZmZzZXQgYWZ0ZXIgYWRkaW5nIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIENoYW8tV2VuIFlhbmcgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgICAgMjAwNi4wNiAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6Zk1tQWRkSFRDYXBhYmlsaXR5KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KQoreworICAgIHU4X3QgT1VJWzNdID0gezB4MCwweDkwLDB4NEN9OworICAgIHUxNl90IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBQcm9iIElEICovCisgICAgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBaTV9XTEFOX0VJRF9XUEFfSUUpOworCisgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCApCisgICAgeworICAgICAgICAvKiBFbGVtZW50IExlbmd0aCAqLworICAgICAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5hcC5IVENhcC5EYXRhLkxlbmd0aCArIDQpOworCisgICAgICAgIC8qIE9VSSBEYXRhICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgT1VJW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEVsZW1lbnQgVHlwZSBJRCAqLworICAgICAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5hcC5IVENhcC5EYXRhLkVsZW1lbnRJRCk7CisKKyAgICAgICAgLyogSFQgQ2FwYWJpbGl0eSBEYXRhICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5hcC5IVENhcC5CeXRlW2krMl0pOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIEVsZW1lbnQgTGVuZ3RoICovCisgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPnN0YS5IVENhcC5EYXRhLkxlbmd0aCArIDQpOworCisgICAgICAgIC8qIE9VSSBEYXRhICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgT1VJW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEVsZW1lbnQgVHlwZSBJRCAqLworICAgICAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5zdGEuSFRDYXAuRGF0YS5FbGVtZW50SUQpOworCisgICAgICAgIC8qIEhUIENhcGFiaWxpdHkgRGF0YSAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjY7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+c3RhLkhUQ2FwLkJ5dGVbaSsyXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gb2Zmc2V0OworfQorCisKK3UxNl90IHpmTW1BZGRQcmVOSFRDYXBhYmlsaXR5KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KQoreworICAgIC8vdThfdCBPVUlbM10gPSB7MHgwLDB4OTAsMHg0Q307CisgICAgdTE2X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIFByb2IgSUQgKi8KKyAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIFpNX1dMQU5fUFJFTjJfRUlEX0hUQ0FQQUJJTElUWSk7CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQICkKKyAgICB7CisgICAgICAgIC8qIEVsZW1lbnQgTGVuZ3RoICovCisgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPmFwLkhUQ2FwLkRhdGEuTGVuZ3RoKTsKKworICAgICAgICAvKiBIVCBDYXBhYmlsaXR5IERhdGEgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPmFwLkhUQ2FwLkJ5dGVbaSsyXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogRWxlbWVudCBMZW5ndGggKi8KKyAgICAgICAgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+c3RhLkhUQ2FwLkRhdGEuTGVuZ3RoKTsKKworICAgICAgICAvKiBIVCBDYXBhYmlsaXR5IERhdGEgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPnN0YS5IVENhcC5CeXRlW2krMl0pOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG9mZnNldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICB6Zk1tQWRkRXh0ZW5kZWRIVENhcGFiaWxpdHkgICAqLworLyogICAgICBBZGQgRXh0ZW5kZWQgSFQgQ2FwYWJpbGl0eSBJbmZvbWF0aW9uIHRvIGJ1ZmZlci4gICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHRvIGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZmZlciBvZmZzZXQgYWZ0ZXIgYWRkaW5nIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIENoYW8tV2VuIFlhbmcgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgICAgMjAwNi4wNiAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6Zk1tQWRkRXh0ZW5kZWRIVENhcGFiaWxpdHkoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQpCit7CisgICAgdThfdCBPVUlbM10gPSB7MHgwLDB4OTAsMHg0Q307CisgICAgdTE2X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIFByb2IgSUQgKi8KKyAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIFpNX1dMQU5fRUlEX1dQQV9JRSk7CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQICkKKyAgICB7CisgICAgICAgIC8qIEVsZW1lbnQgTGVuZ3RoICovCisgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPmFwLkV4dEhUQ2FwLkRhdGEuTGVuZ3RoICsgNCk7CisKKyAgICAgICAgLyogT1VJIERhdGEgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBPVUlbaV0pOworICAgICAgICB9CisKKyAgICAgICAgLyogRWxlbWVudCBUeXBlIElEICovCisgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPmFwLkV4dEhUQ2FwLkRhdGEuRWxlbWVudElEKTsKKworICAgICAgICAvKiBIVCBDYXBhYmlsaXR5IERhdGEgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDIyOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPmFwLkV4dEhUQ2FwLkJ5dGVbaSsyXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogRWxlbWVudCBMZW5ndGggKi8KKyAgICAgICAgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+c3RhLkV4dEhUQ2FwLkRhdGEuTGVuZ3RoICsgNCk7CisKKyAgICAgICAgLyogT1VJIERhdGEgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBPVUlbaV0pOworICAgICAgICB9CisKKyAgICAgICAgLyogRWxlbWVudCBUeXBlIElEICovCisgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPnN0YS5FeHRIVENhcC5EYXRhLkVsZW1lbnRJRCk7CisKKyAgICAgICAgLyogSFQgQ2FwYWJpbGl0eSBEYXRhICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyMjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5zdGEuRXh0SFRDYXAuQnl0ZVtpKzJdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZTZW5kTW1GcmFtZSAgICAgICAgICAgICAgICovCisvKiAgICAgIFNlbmQgbWFuYWdlbWVudCBmcmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBmcmFtZVR5cGUgOiBtYW5hZ2VtZW50IGZyYW1lIHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZHN0IDogZGVzdGluYXRpb24gTUFDIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHAxIDogcGFyYW1ldGVyIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBwMiA6IHBhcmFtZXRlciAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcDMgOiBwYXJhbWV0ZXIgMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHByb2JlIHJlcSA6IHAxPT4gYldpdGhTU0lELCBwMj0+UiwgcDM9PlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBwcm9iZSByc3AgOiBwMT0+UiwgcDI9PlIsIHAzPT5WQVAgSUQoQVApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogZGVhdXRoIDogcDE9PlJlYXNvbiBDb2RlLCBwMj0+UiwgcDM9PlZBUCBJRChBUCkgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERpc2Fzb2MgOiBwMT0+UmVhc29uIENvZGUsIHAyPT5SLCBwMz0+VkFQIElEKEFQKSAgICAgICAgICAgICAgICAgICAgICovCisvKiBBVElNIDogcDE9PlIsIHAyPT5SLCBwMz0+UiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogKHJlKWFzb2MgcnNwIDogcDE9PlN0YXR1cyBDb2RlLCBwMj0+QUlELCBwMz0+VkFQIElEKEFQKSAgICAgICAgICAgICAgKi8KKy8qIGFzb2MgcmVxIDogcDE9PlIsIHAyPT5SLCBwMz0+UiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiByZWFzb2MgcmVxIDogcDE9PkFQIE1BQ1swXSwgcDI9PkFQIE1BQ1sxXSwgcDM9PkFQIE1BQ1syXSAgICAgICAgICAgICAqLworLyogYXV0aCA6IHAxPT5sb3c9QWxnb3JpdGhtLCBoaWdoPVRyYW5zYWN0aW9uLCBwMj0+U3RhdHVzLCBwMz0+VkFQIElEICAgKi8KK3ZvaWQgemZTZW5kTW1GcmFtZSh6ZGV2X3QqIGRldiwgdThfdCBmcmFtZVR5cGUsIHUxNl90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgdTMyX3QgcDEsIHUzMl90IHAyLCB1MzJfdCBwMykKK3sKKyAgICB6YnVmX3QqIGJ1ZjsKKyAgICAvL3UxNl90IGFkZHJUYmxTaXplOworICAgIC8vc3RydWN0IHpzQWRkclRibCBhZGRyVGJsOworICAgIHUxNl90IG9mZnNldCA9IDA7CisgICAgdTE2X3QgaGxlbiA9IDMyOworICAgIHUxNl90IGhlYWRlclsoMjQrMjUrMSkvMl07CisgICAgdTE2X3QgdmFwID0gMDsKKyAgICB1MTZfdCBpOworICAgIHU4X3QgZW5jcnlwdCA9IDA7CisgICAgdTE2X3QgYWlkOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bV9tc2cyX21tKFpNX0xWXzIsICJTZW5kIG1tIGZyYW1lLCB0eXBlPSIsIGZyYW1lVHlwZSk7CisgICAgLyogVEJEIDogTWF4aW11bSBzaXplIG9mIG1hbmFnbWVudCBmcmFtZSAqLworICAgIGlmICgoYnVmID0gemZ3QnVmQWxsb2NhdGUoZGV2LCAxMDI0KSkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIkFsbG9jIG1tIGJ1ZiBGYWlsISIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy9SZXNlcnZlIHJvb20gZm9yIHdsYW4gaGVhZGVyCisgICAgb2Zmc2V0ID0gaGxlbjsKKworICAgIHN3aXRjaCAoZnJhbWVUeXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfUFJPQkVSRVEgOgorICAgICAgICAgICAgb2Zmc2V0ID0gemZTZW5kUHJvYmVSZXEoZGV2LCBidWYsIG9mZnNldCwgKHU4X3QpIHAxKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX1BST0JFUlNQIDoKKyAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMywgInByb2JlIHJzcCIpOworICAgICAgICAgICAgLyogMjQtMzEgVGltZSBTdGFtcCA6IGhhcmR3YXJlIFdPTidUIGZpbGwgdGhpcyBmaWVsZCAqLworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgMCk7CisgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0KzIsIDApOworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCs0LCAwKTsKKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQrNiwgMCk7CisgICAgICAgICAgICBvZmZzZXQrPTg7CisKKyAgICAgICAgICAgIC8qIEJlYWNvbiBJbnRlcnZhbCAqLworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPmJlYWNvbkludGVydmFsKTsKKyAgICAgICAgICAgIG9mZnNldCs9MjsKKworICAgICAgICAgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhcCA9ICh1MTZfdCkgcDM7CisgICAgICAgICAgICAgICAgLyogQ2FwYWJpbGl0eSAqLworICAgICAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHdkLT5hcC5jYXBhYlt2YXBdKTsKKyAgICAgICAgICAgICAgICBvZmZzZXQrPTI7CisgICAgICAgICAgICAgICAgLyogU1NJRCAqLworICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmQXBBZGRJZVNzaWQoZGV2LCBidWYsIG9mZnNldCwgdmFwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBDYXBhYmlsaXR5ICovCisgICAgICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0pOworICAgICAgICAgICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPnN0YS5jYXBhYmlsaXR5WzFdKTsKKyAgICAgICAgICAgICAgICAvKiBTU0lEICovCisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZTdGFBZGRJZVNzaWQoZGV2LCBidWYsIG9mZnNldCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFN1cHBvcnQgUmF0ZSAqLworICAgICAgICAgICAgaWYgKCB3ZC0+ZnJlcXVlbmN5IDwgMzAwMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSWVTdXBwb3J0UmF0ZShkZXYsIGJ1Ziwgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9FSURfU1VQUE9SVF9SQVRFLCBaTV9SQVRFX1NFVF9DQ0spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0VJRF9TVVBQT1JUX1JBVEUsIFpNX1JBVEVfU0VUX09GRE0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBEUyBwYXJhbWV0ZXIgc2V0ICovCisgICAgICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSWVEcyhkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgICAgICAgICAgLyogVE9ETyChRyBJQlNTICovCisgICAgICAgICAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmU3RhQWRkSWVJYnNzKGRldiwgYnVmLCBvZmZzZXQpOworCisgICAgICAgICAgICAgICAgaWYgKHdkLT5mcmVxdWVuY3kgPCAzMDAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHdkLT53ZmMuYklic3NHTW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHdkLT5zdXBwb3J0TW9kZSAmIChaTV9XSVJFTEVTU19NT0RFXzI0XzU0fFpNX1dJUkVMRVNTX01PREVfMjRfTikpICkgICAgLy8gT25seSBhY2NvbXBhbnkgd2l0aCBlbmFibGluZyBhIG1vZGUgLgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBFUlAgSW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5lcnBFbGVtZW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZUVycChkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogRW5hYmxlIEcgTW9kZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgLyogRXh0ZW5kZWQgU3VwcG9ydGVkIFJhdGVzICovCisgICAgICAgICAgICAgICAgICAgCSAgICBvZmZzZXQgPSB6Zk1tQWRkSWVTdXBwb3J0UmF0ZShkZXYsIGJ1Ziwgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0VJRF9FWFRFTkRFRF9SQVRFLCBaTV9SQVRFX1NFVF9PRkRNKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAoKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgICAgICAgICAgICAgICAmJiAod2QtPmFwLndsYW5UeXBlW3ZhcF0gIT0gWk1fV0xBTl9UWVBFX1BVUkVfQikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRVJQIEluZm9ybWF0aW9uICovCisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllRXJwKGRldiwgYnVmLCBvZmZzZXQpOworCisgICAgICAgICAgICAgICAgLyogRXh0ZW5kZWQgU3VwcG9ydGVkIFJhdGVzICovCisJCWlmICggd2QtPmZyZXF1ZW5jeSA8IDMwMDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSWVTdXBwb3J0UmF0ZShkZXYsIGJ1Ziwgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0VJRF9FWFRFTkRFRF9SQVRFLCBaTV9SQVRFX1NFVF9PRkRNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogRVJQIEluZm9ybWF0aW9uICovCisgICAgICAgICAgICAvL29mZnNldCA9IHpmTW1BZGRJZUVycChkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgICAgICAgICAgLyogRXh0ZW5kZWQgU3VwcG9ydGVkIFJhdGVzICovCisgICAgICAgICAgICAvL29mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUsIFpNX1JBVEVfU0VUX09GRE0pOworCisgICAgICAgICAgICAvKiBUT0RPIDogUlNOICovCisgICAgICAgICAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVAgJiYgd2QtPmFwLndwYVN1cHBvcnRbdmFwXSA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZVdwYShkZXYsIGJ1Ziwgb2Zmc2V0LCB2YXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MgJiYgd2QtPnN0YS5hdXRoTW9kZSA9PSBaTV9BVVRIX01PREVfV1BBMlBTSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSB6ZndTdGFBZGRJZVdwYVJzbihkZXYsIGJ1Ziwgb2Zmc2V0LCBaTV9XTEFOX0ZSQU1FX1RZUEVfQVVUSCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFdNRSBQYXJhbWV0ZXJzICovCisgICAgICAgICAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHdkLT5hcC5xb3NNb2RlID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSB6ZkFwQWRkSWVXbWVQYXJhKGRldiwgYnVmLCBvZmZzZXQsIHZhcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0lCU1MgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gamhsZWUgSFQgMAorICAgICAgICAgICAgLy9DV1lhbmcoKykKKyAgICAgICAgICAgICAgICAvKiBUT0RPIDogTmVlZCB0byBjaGVjayBpZiBpdCBpcyBvayAqLworICAgICAgICAgICAgLyogSFQgQ2FwYWJpbGl0aWVzIEluZm8gKi8KKyAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRIVENhcGFiaWxpdHkoZGV2LCBidWYsIG9mZnNldCk7CisgICAgICAgICAgICAvL0NXWWFuZygrKQorICAgICAgICAgICAgLyogRXh0ZW5kZWQgSFQgQ2FwYWJpbGl0aWVzIEluZm8gKi8KKyAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRFeHRlbmRlZEhUQ2FwYWJpbGl0eShkZXYsIGJ1Ziwgb2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLmlic3NBZGRpdGlvbmFsSUVTaXplICkKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSB6ZlN0YUFkZElic3NBZGRpdGlvbmFsSUUoZGV2LCBidWYsIG9mZnNldCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9BVVRIIDoKKyAgICAgICAgICAgIGlmIChwMSA9PSAweDMwMDAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhsZW4gKz0gNDsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gNDsgICAgICAgIC8vIGZvciByZXNlcnZpbmcgd2VwIGhlYWRlcgorICAgICAgICAgICAgICAgIGVuY3J5cHQgPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBBbGdvdHJpdGhtIE51bWJlciAqLworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgKHUxNl90KShwMSYweGZmZmYpKTsKKyAgICAgICAgICAgIG9mZnNldCs9MjsKKworICAgICAgICAgICAgLyogVHJhbnNhY3Rpb24gTnVtYmVyICovCisgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCAodTE2X3QpKHAxPj4xNikpOworICAgICAgICAgICAgb2Zmc2V0Kz0yOworCisgICAgICAgICAgICAvKiBTdGF0dXMgQ29kZSAqLworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgKHUxNl90KXAyKTsKKyAgICAgICAgICAgIG9mZnNldCs9MjsKKworICAgICAgICAgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhcCA9ICh1MTZfdCkgcDM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIENoYWxsZW5nZSBUZXh0ID0+IHNoYXJlLTIgb3Igc2hhcmUtMyAqLworICAgICAgICAgICAgaWYgKHAxID09IDB4MjAwMDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHAyID09IDApIC8vU3RhdHVzID09IHN1Y2Nlc3MKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHptd19idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIDB4ODAxMCk7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCs9MjsKKyAgICAgICAgICAgICAgICAgICAgLyogc2hhcmUtMiA6IEFQIGdlbmVyYXRlIGNoYWxsZW5nZSB0ZXh0ICovCisgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPDEyODsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuY2hhbGxlbmdlVGV4dFtpXSA9ICh1OF90KXpmR2V0UmFuZG9tTnVtYmVyKGRldiwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgemZDb3B5VG9JbnRUeEJ1ZmZlcihkZXYsIGJ1Ziwgd2QtPmFwLmNoYWxsZW5nZVRleHQsIG9mZnNldCwgMTI4KTsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDEyODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwMSA9PSAweDMwMDAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHNoYXJlLTMgOiBTVEEgcmV0dXJuIGNoYWxsZW5nZSBUZXh0ICovCisgICAgICAgICAgICAgICAgemZDb3B5VG9JbnRUeEJ1ZmZlcihkZXYsIGJ1Ziwgd2QtPnN0YS5jaGFsbGVuZ2VUZXh0LCBvZmZzZXQsIHdkLT5zdGEuY2hhbGxlbmdlVGV4dFsxXSsyKTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gKHdkLT5zdGEuY2hhbGxlbmdlVGV4dFsxXSsyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVNPQ1JFUSA6CisgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX1JFQVNPQ1JFUSA6CisgICAgICAgICAgICAvKiBDYXBhYmlsaXR5ICovCisgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5zdGEuY2FwYWJpbGl0eVswXSk7CisgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5zdGEuY2FwYWJpbGl0eVsxXSk7CisKKyAgICAgICAgICAgIC8qIExpc3RlbiBJbnRlcnZhbCAqLworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgMHgwMDA1KTsKKyAgICAgICAgICAgIG9mZnNldCs9MjsKKworICAgICAgICAgICAgLyogUmVhc3NvY2FpdGVkIFJlcXVlc3QgOiBDdXJyZW50IEFQIGFkZHJlc3MgKi8KKyAgICAgICAgICAgIGlmIChmcmFtZVR5cGUgPT0gWk1fV0xBTl9GUkFNRV9UWVBFX1JFQVNPQ1JFUSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHdkLT5zdGEuYnNzaWRbMF0pOworICAgICAgICAgICAgICAgIG9mZnNldCs9MjsKKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHdkLT5zdGEuYnNzaWRbMV0pOworICAgICAgICAgICAgICAgIG9mZnNldCs9MjsKKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHdkLT5zdGEuYnNzaWRbMl0pOworICAgICAgICAgICAgICAgIG9mZnNldCs9MjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogU1NJRCAqLworICAgICAgICAgICAgb2Zmc2V0ID0gemZTdGFBZGRJZVNzaWQoZGV2LCBidWYsIG9mZnNldCk7CisKKworICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLmN1cnJlbnRGcmVxdWVuY3kgPCAzMDAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBTdXBwb3J0IFJhdGUgKi8KKyAgICAgICAgICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSWVTdXBwb3J0UmF0ZShkZXYsIGJ1Ziwgb2Zmc2V0LCBaTV9XTEFOX0VJRF9TVVBQT1JUX1JBVEUsIFpNX1JBVEVfU0VUX0NDSyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogU3VwcG9ydCBSYXRlICovCisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllU3VwcG9ydFJhdGUoZGV2LCBidWYsIG9mZnNldCwgWk1fV0xBTl9FSURfU1VQUE9SVF9SQVRFLCBaTV9SQVRFX1NFVF9PRkRNKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCh3ZC0+c3RhLmNhcGFiaWxpdHlbMV0gJiBaTV9CSVRfMCkgPT0gMSkKKyAgICAgICAgICAgIHsgICAvL3NwZWN0cnVtIG1hbmFnbWVudCBmbGFnIGVuYWJsZQorICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmU3RhQWRkSWVQb3dlckNhcChkZXYsIGJ1Ziwgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSB6ZlN0YUFkZEllU3VwcG9ydENoKGRldiwgYnVmLCBvZmZzZXQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAod2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5IDwgMzAwMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBFeHRlbmRlZCBTdXBwb3J0ZWQgUmF0ZXMgKi8KKyAgICAgICAgICAgICAgICBpZiAod2QtPnN1cHBvcnRNb2RlICYgKFpNX1dJUkVMRVNTX01PREVfMjRfNTR8Wk1fV0lSRUxFU1NfTU9ERV8yNF9OKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsIFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUsIFpNX1JBVEVfU0VUX09GRE0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvL29mZnNldCA9IHpmU3RhQWRkSWVXcGFSc24oZGV2LCBidWYsIG9mZnNldCwgZnJhbWVUeXBlKTsKKyAgICAgICAgICAgIC8vTW92ZSB0byB3cmFwcGVyIGZ1bmN0aW9uLCBmb3IgT1MgZGlmZmVyZW5jZS0tQ1dZYW5nKG0pCisgICAgICAgICAgICAvL2ZvciB3aW5kb3dzIHdyYXBwZXIsIHpmd1N0YUFkZEllV3BhUnNuKCkgc2hvdWxkIGJlIGJlbG93OgorICAgICAgICAgICAgLy91MTZfdCB6ZndTdGFBZGRJZVdwYVJzbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgdThfdCBmcmFtZVR5cGUpCisgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgIC8vICAgIHJldHVybiB6ZlN0YUFkZEllV3BhUnNuKGRldiwgYnVmLCBvZmZzZXQsIGZyYW1lVHlwZSk7CisgICAgICAgICAgICAvL30KKyAgICAgICAgICAgIG9mZnNldCA9IHpmd1N0YUFkZEllV3BhUnNuKGRldiwgYnVmLCBvZmZzZXQsIGZyYW1lVHlwZSk7CisKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICAgICAgLyogQ0VOQyAqLworICAgICAgICAgICAgLy9pZiAod2QtPnN0YS5lbmNyeU1vZGUgPT0gWk1fQ0VOQykKKyAgICAgICAgICAgIG9mZnNldCA9IHpmU3RhQWRkSWVDZW5jKGRldiwgYnVmLCBvZmZzZXQpOworI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgIGlmICgoKHdkLT5zdGEud21lRW5hYmxlZCAmIFpNX1NUQV9XTUVfRU5BQkxFX0JJVCkgIT0gMCkgLy9XTUUgZW5hYmxlZAorICAgICAgICAgICAgICAmJiAoKHdkLT5zdGEuYXBXbWVDYXBhYmlsaXR5ICYgMHgxKSAhPSAwKSkgLy9XTUUgQVAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKCh3ZC0+c3RhLmFwV21lQ2FwYWJpbGl0eSAmIDB4ODApICE9IDApIC8vVUFQU0QgQVAKKyAgICAgICAgICAgICAgICAgJiYgKCh3ZC0+c3RhLndtZUVuYWJsZWQgJiBaTV9TVEFfVUFQU0RfRU5BQkxFX0JJVCkgIT0gMCkpIC8vVUFQU0QgZW5hYmxlZAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZTdGFBZGRJZVdtZUluZm8oZGV2LCBidWYsIG9mZnNldCwgd2QtPnN0YS53bWVRb3NJbmZvKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZTdGFBZGRJZVdtZUluZm8oZGV2LCBidWYsIG9mZnNldCwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gamhsZWUgSFQgMAorICAgICAgICAgICAgLy9DV1lhbmcoKykKKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLkVuYWJsZUhUICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgI2lmbmRlZiBaTV9ESVNBQkxFX0FNU0RVOEtfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAvL1N1cHBvcnQgOEsgQS1NU0RVCisgICAgICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLndlcFN0YXR1cyA9PSBaTV9FTkNSWVBUSU9OX1dFUF9ESVNBQkxFRCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5IVENhcC5EYXRhLkh0Q2FwSW5mbyB8PSBIVENBUF9NYXhBTVNEVUxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuSFRDYXAuRGF0YS5IdENhcEluZm8gJj0gKH5IVENBUF9NYXhBTVNEVUxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgICAgICAvL1N1cHBvcnQgNEsgQS1NU0RVCisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuSFRDYXAuRGF0YS5IdENhcEluZm8gJj0gKH5IVENBUF9NYXhBTVNEVUxlbmd0aCk7CisgICAgICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgICAgICAvKiBIVCBDYXBhYmlsaXRpZXMgSW5mbyAqLworICAgICAgICAgICAgICAgIGlmICh3ZC0+QmFuZFdpZHRoNDAgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLkhUQ2FwLkRhdGEuSHRDYXBJbmZvIHw9IEhUQ0FQX1N1cENoYW5uZWxXaWR0aFNldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuSFRDYXAuRGF0YS5IdENhcEluZm8gJj0gfkhUQ0FQX1N1cENoYW5uZWxXaWR0aFNldDsKKyAgICAgICAgICAgICAgICAgICAgLy93ZC0+c3RhLkhUQ2FwLkRhdGEuSHRDYXBJbmZvIHw9IEhUQ0FQX1N1cENoYW5uZWxXaWR0aFNldDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLkhUQ2FwLkRhdGEuQU1QRFVQYXJhbSAmPSB+SFRDQVBfTWF4UnhBTVBEVTM7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5IVENhcC5EYXRhLkFNUERVUGFyYW0gfD0gSFRDQVBfTWF4UnhBTVBEVTM7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5IVENhcC5EYXRhLk1DU1NldFsxXSA9IDB4RkY7IC8vIE1DUyA4IH4gMTUKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSFRDYXBhYmlsaXR5KGRldiwgYnVmLCBvZmZzZXQpOworICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRQcmVOSFRDYXBhYmlsaXR5KGRldiwgYnVmLCBvZmZzZXQpOworICAgICAgICAgICAgICAgIC8vQ1dZYW5nKCspCisgICAgICAgICAgICAgICAgLyogRXh0ZW5kZWQgSFQgQ2FwYWJpbGl0aWVzIEluZm8gKi8KKyAgICAgICAgICAgICAgICAvL29mZnNldCA9IHpmTW1BZGRFeHRlbmRlZEhUQ2FwYWJpbGl0eShkZXYsIGJ1Ziwgb2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvL1N0b3JlIGFzb2MgcmVxdWVzdCBmcmFtZSBib2R5LCBmb3IgVklTVEEgb25seQorICAgICAgICAgICAgd2QtPnN0YS5hc29jUmVxRnJhbWVCb2R5U2l6ZSA9ICgob2Zmc2V0IC0gaGxlbikgPgorICAgICAgICAgICAgICAgICAgICBaTV9DQUNIRURfRlJBTUVCT0RZX1NJWkUpPworICAgICAgICAgICAgICAgICAgICBaTV9DQUNIRURfRlJBTUVCT0RZX1NJWkU6KG9mZnNldCAtIGhsZW4pOworICAgICAgICAgICAgZm9yIChpPTA7IGk8d2QtPnN0YS5hc29jUmVxRnJhbWVCb2R5U2l6ZTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuYXNvY1JlcUZyYW1lQm9keVtpXSA9IHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIGkgKyBobGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0FTT0NSU1AgOgorICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9SRUFTT0NSU1AgOgorICAgICAgICAgICAgdmFwID0gKHUxNl90KSBwMzsKKworICAgICAgICAgICAgLyogQ2FwYWJpbGl0eSAqLworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPmFwLmNhcGFiW3ZhcF0pOworICAgICAgICAgICAgb2Zmc2V0Kz0yOworCisgICAgICAgICAgICAvKiBTdGF0dXMgQ29kZSAqLworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgKHUxNl90KXAxKTsKKyAgICAgICAgICAgIG9mZnNldCs9MjsKKworICAgICAgICAgICAgLyogQUlEICovCisgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCAodTE2X3QpKHAyfDB4YzAwMCkpOworICAgICAgICAgICAgb2Zmc2V0Kz0yOworCisKKyAgICAgICAgICAgIGlmICggd2QtPmZyZXF1ZW5jeSA8IDMwMDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLyogU3VwcG9ydCBSYXRlICovCisgICAgICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSWVTdXBwb3J0UmF0ZShkZXYsIGJ1Ziwgb2Zmc2V0LCBaTV9XTEFOX0VJRF9TVVBQT1JUX1JBVEUsIFpNX1JBVEVfU0VUX0NDSyk7CisKKyAgICAgICAgICAgIC8qIEV4dGVuZGVkIFN1cHBvcnRlZCBSYXRlcyAqLworICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllU3VwcG9ydFJhdGUoZGV2LCBidWYsIG9mZnNldCwgWk1fV0xBTl9FSURfRVhURU5ERURfUkFURSwgWk1fUkFURV9TRVRfT0ZETSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogU3VwcG9ydCBSYXRlICovCisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllU3VwcG9ydFJhdGUoZGV2LCBidWYsIG9mZnNldCwgWk1fV0xBTl9FSURfU1VQUE9SVF9SQVRFLCBaTV9SQVRFX1NFVF9PRkRNKTsKKyAgICAgICAgICAgIH0KKworCisKKyAgICAgICAgICAgIC8qIFdNRSBQYXJhbWV0ZXJzICovCisgICAgICAgICAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogVE9ETyA6IGlmIFdNRSBTVEEgdGhlbiBzZW5kIFdNRSBwYXJhbWV0ZXIgZWxlbWVudCAqLworICAgICAgICAgICAgICAgIGlmICh3ZC0+YXAucW9zTW9kZSA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZBcEFkZEllV21lUGFyYShkZXYsIGJ1Ziwgb2Zmc2V0LCB2YXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGpobGVlIEhUIDAKKyAgICAgICAgICAgIC8vQ1dZYW5nKCspCisgICAgICAgICAgICAvKiBIVCBDYXBhYmlsaXRpZXMgSW5mbyAqLworICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEhUQ2FwYWJpbGl0eShkZXYsIGJ1Ziwgb2Zmc2V0KTsKKyAgICAgICAgICAgIC8vQ1dZYW5nKCspCisgICAgICAgICAgICAvKiBFeHRlbmRlZCBIVCBDYXBhYmlsaXRpZXMgSW5mbyAqLworICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEV4dGVuZGVkSFRDYXBhYmlsaXR5KGRldiwgYnVmLCBvZmZzZXQpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVRJTSA6CisgICAgICAgICAgICAvKiBOVUxMIGZyYW1lICovCisgICAgICAgICAgICAvKiBUT0RPIDogYWRkIHR3byBkdW1iIGJ5dGVzIHRlbXBvcmFyaWx5ICovCisgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX1FPU19OVUxMIDoKKyAgICAgICAgICAgIHptd19idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIDB4MDAxMCk7CisgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fV0xBTl9EQVRBX0ZSQU1FIDoKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0RJU0FTT0MgOgorICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9ERUFVVEggOgorICAgICAgICAgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICB2YXAgPSAodTE2X3QpIHAzOworCisgICAgICAgICAgICAgIGlmICgoYWlkID0gemZBcEZpbmRTdGEoZGV2LCBkc3QpKSAhPSAweGZmZmYpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgICAvKiBDbGVhciBTVEEgdGFibGUgKi8KKyAgICAgICAgICAgICAgICAgIHdkLT5hcC5zdGFUYWJsZVthaWRdLnZhbGlkID0gMDsKKworICAgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgICAgICAgaWYgKHdkLT56ZmNiRGlzQXNvY05vdGlmeSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIHdkLT56ZmNiRGlzQXNvY05vdGlmeShkZXYsICh1OF90Kilkc3QsIHZhcCk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFJlYXNvbiBDb2RlICovCisgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCAodTE2X3QpcDEpOworICAgICAgICAgICAgb2Zmc2V0Kz0yOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgemZ3QnVmU2V0U2l6ZShkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgIHptX21zZzJfbW0oWk1fTFZfMiwgIm1hbmFnZW1lbnQgZnJhbWUgYm9keSBzaXplPSIsIG9mZnNldC1obGVuKTsKKworICAgIC8vQ29weSB3bGFuIGhlYWRlcgorICAgIHpmVHhHZW5NbUhlYWRlcihkZXYsIGZyYW1lVHlwZSwgZHN0LCBoZWFkZXIsIG9mZnNldC1obGVuLCBidWYsIHZhcCwgZW5jcnlwdCk7CisgICAgZm9yIChpPTA7IGk8KGhsZW4+PjEpOyBpKyspCisgICAgeworICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgaSoyLCBoZWFkZXJbaV0pOworICAgIH0KKworICAgIC8qIEdldCBidWZmZXIgRE1BIGFkZHJlc3MgKi8KKyAgICAvL2lmICgoYWRkclRibFNpemUgPSB6ZndCdWZNYXBEbWEoZGV2LCBidWYsICZhZGRyVGJsKSkgPT0gMCkKKyAgICAvL2lmICgoYWRkclRibFNpemUgPSB6ZndNYXBUeERtYShkZXYsIGJ1ZiwgJmFkZHJUYmwpKSA9PSAwKQorICAgIC8veworICAgIC8vICAgIGdvdG8gemxFcnJvcjsKKyAgICAvL30KKworICAgIHptX21zZzJfbW0oWk1fTFZfMiwgIm9mZnNldD0iLCBvZmZzZXQpOworICAgIHptX21zZzJfbW0oWk1fTFZfMiwgImhsZW49IiwgaGxlbik7CisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJhZGRyVGJsU2l6ZT0iLCBhZGRyVGJsU2l6ZSk7CisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJhZGRyVGJsLmxlblswXT0iLCBhZGRyVGJsLmxlblswXSk7CisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJhZGRyVGJsLnBoeXNBZGRybFswXT0iLCBhZGRyVGJsLnBoeXNBZGRybFswXSk7CisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJidWYtPmRhdGE9IiwgYnVmLT5kYXRhKTsKKworICAgICNpZiAwCisgICAgaWYgKChlcnIgPSB6ZkhwU2VuZChkZXYsIE5VTEwsIDAsIE5VTEwsIDAsIE5VTEwsIDAsIGJ1ZiwgMCwKKyAgICAgICAgICAgIFpNX0lOVEVSTkFMX0FMTE9DX0JVRiwgMCwgMHhmZikpICE9IFpNX1NVQ0NFU1MpCisgICAgeworICAgICAgICBnb3RvIHpsRXJyb3I7CisgICAgfQorICAgICNlbHNlCisgICAgemZQdXRWbW1xKGRldiwgYnVmKTsKKyAgICB6ZlB1c2hWdHhxKGRldik7CisgICAgI2VuZGlmCisKKyAgICByZXR1cm47CisjaWYgMAoremxFcnJvcjoKKworICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgIHJldHVybjsKKyNlbmRpZgorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlByb2Nlc3NNYW5hZ2VtZW50ICAgICAgICAgKi8KKy8qICAgICAgUHJvY2VzcyByZWNlaXZlZCBtYW5hZ2VtZW50IGZyYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IHJlY2VpdmVkIG1hbmFnZW1lbnQgZnJhbWUgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMCAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB6ZlByb2Nlc3NNYW5hZ2VtZW50KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBBZGRJbmZvKSAvL0NXWWFuZyhtKQoreworICAgIHU4X3QgZnJhbWVUeXBlOworICAgIHUxNl90IHRhWzNdOworICAgIHUxNl90IHJhWzNdOworICAgIHUxNl90IHZhcCA9IDAsIGluZGV4ID0gMDsKKyAgICAvL3UxNl90IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICByYVswXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDQpOworICAgIHJhWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNik7CisgICAgcmFbMl0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCA4KTsKKworICAgIHRhWzBdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTApOworICAgIHRhWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTIpOworICAgIHRhWzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTQpOworCisgICAgZnJhbWVUeXBlID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCk7CisKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgeworI2lmIDEKKyAgICAgICAgdmFwID0gMDsKKyAgICAgICAgaWYgKChyYVswXSAmIDB4MSkgIT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQVAgOiBGaW5kIHZpcnR1YWwgQVAgKi8KKyAgICAgICAgICAgIGlmICgoaW5kZXggPSB6ZkFwRmluZFN0YShkZXYsIHRhKSkgIT0gMHhmZmZmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhcCA9IHdkLT5hcC5zdGFUYWJsZVtpbmRleF0udmFwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMiwgInZhcD0iLCB2YXApOworI2VuZGlmCisKKyAgICAgICAgLyogRGlzcGF0Y2ggYnkgZnJhbWUgdHlwZSAqLworICAgICAgICBzd2l0Y2ggKGZyYW1lVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEJlYWNvbiAqLworICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQkVBQ09OIDoKKyAgICAgICAgICAgICAgICB6ZkFwUHJvY2Vzc0JlYWNvbihkZXYsIGJ1Zik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogQXV0aGVudGljYXRpb24gKi8KKyAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0FVVEggOgorICAgICAgICAgICAgICAgIHpmQXBQcm9jZXNzQXV0aChkZXYsIGJ1ZiwgdGEsIHZhcCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogQXNzb2NpYXRpb24gcmVxdWVzdCAqLworICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVNPQ1JFUSA6CisgICAgICAgICAgICAgICAgLyogUmVhc3NvY2lhdGlvbiByZXF1ZXN0ICovCisgICAgICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9SRUFTT0NSRVEgOgorICAgICAgICAgICAgICAgIHpmQXBQcm9jZXNzQXNvY1JlcShkZXYsIGJ1ZiwgdGEsIHZhcCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogQXNzb2NpYXRpb24gcmVzcG9uc2UgKi8KKyAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0FTT0NSU1AgOgorICAgICAgICAgICAgICAgIC8vemZBcFByb2Nlc3NBc29jUnNwKGRldiwgYnVmKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAvKiBEZWF1dGhlbnRpY2F0aW9uICovCisgICAgICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9ERUFVVEggOgorICAgICAgICAgICAgICAgIHpmQXBQcm9jZXNzRGVhdXRoKGRldiwgYnVmLCB0YSwgdmFwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAvKiBEaXNhc3NvY2lhdGlvbiAqLworICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfRElTQVNPQyA6CisgICAgICAgICAgICAgICAgemZBcFByb2Nlc3NEaXNhc29jKGRldiwgYnVmLCB0YSwgdmFwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAvKiBQcm9iZSByZXF1ZXN0ICovCisgICAgICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9QUk9CRVJFUSA6CisgICAgICAgICAgICAgICAgemZQcm9jZXNzUHJvYmVSZXEoZGV2LCBidWYsIHRhKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAvKiBQcm9iZSByZXNwb25zZSAqLworICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfUFJPQkVSU1AgOgorICAgICAgICAgICAgICAgIHpmQXBQcm9jZXNzUHJvYmVSc3AoZGV2LCBidWYsIEFkZEluZm8pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIC8qIEFjdGlvbiAqLworICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQUNUSU9OIDoKKyAgICAgICAgICAgICAgICB6ZkFwUHJvY2Vzc0FjdGlvbihkZXYsIGJ1Zik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSAvL2lmICgod2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUpIHx8ICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTKSkKKyAgICB7CisgICAgICAgIC8qIERpc3BhdGNoIGJ5IGZyYW1lIHR5cGUgKi8KKyAgICAgICAgc3dpdGNoIChmcmFtZVR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBCZWFjb24gKi8KKyAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0JFQUNPTiA6CisgICAgICAgICAgICAgICAgLyogaWYgZW5hYmxlIDgwMi4xMWggYW5kIGN1cnJlbnQgY2hhbmVsIGlzIHNpbGVudCBidXQgcmVjZWl2ZSBiZWFjb24gZnJvbSBvdGhlciBBUCAqLworICAgICAgICAgICAgICAgIGlmICgoKHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW3dkLT5yZWd1bGF0aW9uVGFibGUuQ3VyQ2hJbmRleF0uY2hhbm5lbEZsYWdzCisgICAgICAgICAgICAgICAgICAgICAgICAmIFpNX1JFR19GTEFHX0NIQU5ORUxfQ1NBKSAhPSAwKSAmJiB3ZC0+c3RhLkRGU0VuYWJsZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW3dkLT5yZWd1bGF0aW9uVGFibGUuQ3VyQ2hJbmRleF0uY2hhbm5lbEZsYWdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJj0gfihaTV9SRUdfRkxBR19DSEFOTkVMX0NTQSAmIFpNX1JFR19GTEFHX0NIQU5ORUxfUEFTU0lWRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHpmU3RhUHJvY2Vzc0JlYWNvbihkZXYsIGJ1ZiwgQWRkSW5mbyk7IC8vQ1dZYW5nKG0pCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogQXV0aGVudGljYXRpb24gKi8KKyAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0FVVEggOgorICAgICAgICAgICAgICAgIC8qIFRPRE8gOiB2YXAgcGFyYW1ldGVyIGlzIHVzZWxlc3MgaW4gU1RBIG1vZGUsIGdldCByaWQgb2YgaXQgKi8KKyAgICAgICAgICAgICAgICB6ZlN0YVByb2Nlc3NBdXRoKGRldiwgYnVmLCB0YSwgMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogQXNzb2NpYXRpb24gcmVxdWVzdCAqLworICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVNPQ1JFUSA6CisgICAgICAgICAgICAgICAgLyogVE9ETyA6IHZhcCBwYXJhbWV0ZXIgaXMgdXNlbGVzcyBpbiBTVEEgbW9kZSwgZ2V0IHJpZCBvZiBpdCAqLworICAgICAgICAgICAgICAgIHpmU3RhUHJvY2Vzc0Fzb2NSZXEoZGV2LCBidWYsIHRhLCAwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAvKiBBc3NvY2lhdGlvbiByZXNwb25zZSAqLworICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVNPQ1JTUCA6CisgICAgICAgICAgICAgICAgLyogUmVhc3NvY2lhdGlvbiByZXF1ZXN0ICovCisgICAgICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9SRUFTT0NSU1AgOgorICAgICAgICAgICAgICAgIHpmU3RhUHJvY2Vzc0Fzb2NSc3AoZGV2LCBidWYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIC8qIERlYXV0aGVudGljYXRpb24gKi8KKyAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0RFQVVUSCA6CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiRGVhdXRoZW50aWNhdGlvbiByZWNlaXZlZCIpOworICAgICAgICAgICAgICAgIHpmU3RhUHJvY2Vzc0RlYXV0aChkZXYsIGJ1Zik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogRGlzYXNzb2NpYXRpb24gKi8KKyAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0RJU0FTT0MgOgorICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkRpc2Fzc29jaWF0aW9uIHJlY2VpdmVkIik7CisgICAgICAgICAgICAgICAgemZTdGFQcm9jZXNzRGlzYXNvYyhkZXYsIGJ1Zik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogUHJvYmUgcmVxdWVzdCAqLworICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfUFJPQkVSRVEgOgorICAgICAgICAgICAgICAgIHpmUHJvY2Vzc1Byb2JlUmVxKGRldiwgYnVmLCB0YSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogUHJvYmUgcmVzcG9uc2UgKi8KKyAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX1BST0JFUlNQIDoKKyAgICAgICAgICAgICAgICAvKiBpZiBlbmFibGUgODAyLjExaCBhbmQgY3VycmVudCBjaGFuZWwgaXMgc2lsZW50IGJ1dCByZWNlaXZlIHByb2JlIHJlc3BvbnNlIGZyb20gb3RoZXIgQVAgKi8KKyAgICAgICAgICAgICAgICBpZiAoKCh3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFt3ZC0+cmVndWxhdGlvblRhYmxlLkN1ckNoSW5kZXhdLmNoYW5uZWxGbGFncworICAgICAgICAgICAgICAgICAgICAgICAgJiBaTV9SRUdfRkxBR19DSEFOTkVMX0NTQSkgIT0gMCkgJiYgd2QtPnN0YS5ERlNFbmFibGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFt3ZC0+cmVndWxhdGlvblRhYmxlLkN1ckNoSW5kZXhdLmNoYW5uZWxGbGFncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICY9IH4oWk1fUkVHX0ZMQUdfQ0hBTk5FTF9DU0EgJiBaTV9SRUdfRkxBR19DSEFOTkVMX1BBU1NJVkUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB6ZlN0YVByb2Nlc3NQcm9iZVJzcChkZXYsIGJ1ZiwgQWRkSW5mbyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0FUSU06CisgICAgICAgICAgICAgICAgemZTdGFQcm9jZXNzQXRpbShkZXYsIGJ1Zik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogQWN0aW9uICovCisgICAgICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9BQ1RJT04gOgorICAgICAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMiwgIlByb2Nlc3NBY3Rpb25NZ3RGcmFtZSIpOworICAgICAgICAgICAgICAgIHpmU3RhUHJvY2Vzc0FjdGlvbihkZXYsIGJ1Zik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlByb2Nlc3NQcm9iZVJlcSAgICAgICAgICAgKi8KKy8qICAgICAgUHJvY2VzcyBwcm9iZSByZXF1ZXN0IG1hbmFnZW1lbnQgZnJhbWUuICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGF1dGggZnJhbWUgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEwICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmUHJvY2Vzc1Byb2JlUmVxKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIHNyYykKK3sKKyAgICB1MTZfdCBvZmZzZXQ7CisgICAgdThfdCBsZW47CisgICAgdTE2X3QgaSwgajsKKyAgICB1OF90IGNoOworICAgIHUxNl90IHNlbmRGbGFnOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogY2hlY2sgbW9kZSA6IEFQL0lCU1MgKi8KKyAgICBpZiAoKHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0FQKSAmJiAod2QtPndsYW5Nb2RlICE9IFpNX01PREVfSUJTUykpCisgICAgeworICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzMsICJJZ25vcmUgcHJvYmUgcmVxIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoKHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0FQKSAmJiAod2QtPnN0YS5hZGFwdGVyU3RhdGUgPT0gWk1fU1RBX1NUQVRFX0RJU0NPTk5FQ1QpKQorICAgIHsKKyAgICAgICAgem1fbXNnMF9tbShaTV9MVl8zLCAiUGFja2V0cyBkcm9wcGVkIGR1ZSB0byBkaXNjb25uZWN0IHN0YXRlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MgKQorICAgIHsKKyAgICAgICAgemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9QUk9CRVJTUCwgc3JjLCAwLCAwLCAwKTsKKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogY2hlY2sgU1NJRCAqLworICAgIGlmICgob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfU1NJRCkpID09IDB4ZmZmZikKKyAgICB7CisgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMywgInByb2JlIHJlcSBTU0lEIG5vdCBmb3VuZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpOworCisgICAgZm9yIChpPTA7IGk8Wk1fTUFYX0FQX1NVUFBPUlQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmICgod2QtPmFwLmFwQml0bWFwICYgKDE8PGkpKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9tc2cxX21tKFpNX0xWXzMsICJsZW49IiwgbGVuKTsKKyAgICAgICAgICAgIHNlbmRGbGFnID0gMDsKKyAgICAgICAgICAgIC8qIGJvYXJkY2FzdCBTU0lEICovCisgICAgICAgICAgICBpZiAobGVuID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHdkLT5hcC5oaWRlU3NpZFtpXSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2VuZEZsYWcgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIE5vdCBicm9hZGNhc3QgU1NJRCAqLworICAgICAgICAgICAgZWxzZSBpZiAod2QtPmFwLnNzaWRMZW5baV0gPT0gbGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaj0wOyBqPGxlbjsgaisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjaCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyK2opKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IHdkLT5hcC5zc2lkW2ldW2pdKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaiA9PSBsZW4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzZW5kRmxhZyA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNlbmRGbGFnID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogU2VuZCBwcm9iZSByZXNwb25zZSAqLworICAgICAgICAgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfUFJPQkVSU1AsIHNyYywgaSwgMCwgaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlByb2Nlc3NQcm9iZVJzcCAgICAgICAgICAgKi8KKy8qICAgICAgUHJvY2VzcyBwcm9iZSByZXNwb25zZSBtYW5hZ2VtZW50IGZyYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGF1dGggZnJhbWUgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFkZEluZm8gOiBSeCBIZWFkZXIgYW5kIFJ4IE1hYyBTdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBBcmVzcyBZYW5nICAgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNi4xMSAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB6ZlByb2Nlc3NQcm9iZVJzcCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogQWRkSW5mbykKK3sKKyAgICAvKiBHYXRoZXIgc2NhbiByZXN1bHQgKi8KKyAgICAvKiBQYXJzZSBUSU0gYW5kIHNlbmQgUFMtUE9MTCBpbiBwb3dlciBzYXZpbmcgbW9kZSAqLworICAgIHN0cnVjdCB6c1dsYW5Qcm9iZVJzcEZyYW1lSGVhZGVyKiAgcFByb2JlUnNwSGVhZGVyOworICAgIHN0cnVjdCB6c0Jzc0luZm8qIHBCc3NJbmZvOworICAgIHU4X3QgICBwQnVmW3NpemVvZihzdHJ1Y3QgenNXbGFuUHJvYmVSc3BGcmFtZUhlYWRlcildOworICAgIGludCAgICByZXM7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgemZDb3B5RnJvbVJ4QnVmZmVyKGRldiwgYnVmLCBwQnVmLCAwLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHpzV2xhblByb2JlUnNwRnJhbWVIZWFkZXIpKTsKKyAgICBwUHJvYmVSc3BIZWFkZXIgPSAoc3RydWN0IHpzV2xhblByb2JlUnNwRnJhbWVIZWFkZXIqKSBwQnVmOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIC8vem1fZGVidWdfbXNnMSgiYnNzIGNvdW50ID0gIiwgd2QtPnN0YS5ic3NMaXN0LmJzc0NvdW50KTsKKworICAgIHBCc3NJbmZvID0gemZTdGFGaW5kQnNzSW5mbyhkZXYsIGJ1ZiwgcFByb2JlUnNwSGVhZGVyKTsKKworICAgIC8vaWYgKCBpID09IHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudCApCisgICAgaWYgKCBwQnNzSW5mbyA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIC8qIEFsbG9jYXRlIGEgbmV3IGVudHJ5IGlmIEJTUyBub3QgaW4gdGhlIHNjYW4gbGlzdCAqLworICAgICAgICBwQnNzSW5mbyA9IHpmQnNzSW5mb0FsbG9jYXRlKGRldik7CisgICAgICAgIGlmIChwQnNzSW5mbyAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICByZXMgPSB6ZlN0YUluaXRCc3NJbmZvKGRldiwgYnVmLCBwUHJvYmVSc3BIZWFkZXIsIHBCc3NJbmZvLCBBZGRJbmZvLCAwKTsKKyAgICAgICAgICAgIC8vemZEdW1wU1NJRChwQnNzSW5mby0+c3NpZFsxXSwgJihwQnNzSW5mby0+c3NpZFsyXSkpOworICAgICAgICAgICAgaWYgKCByZXMgIT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZCc3NJbmZvRnJlZShkZXYsIHBCc3NJbmZvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZkJzc0luZm9JbnNlcnRUb0xpc3QoZGV2LCBwQnNzSW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmVzID0gemZTdGFJbml0QnNzSW5mbyhkZXYsIGJ1ZiwgcFByb2JlUnNwSGVhZGVyLCBwQnNzSW5mbywgQWRkSW5mbywgMSk7CisgICAgICAgIGlmIChyZXMgPT0gMikKKyAgICAgICAgeworICAgICAgICAgICAgemZCc3NJbmZvUmVtb3ZlRnJvbUxpc3QoZGV2LCBwQnNzSW5mbyk7CisgICAgICAgICAgICB6ZkJzc0luZm9GcmVlKGRldiwgcEJzc0luZm8pOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGlkeDsKKworICAgICAgICAgICAgLy8gSXQgd291bGQgcmVzZXQgdGhlIGFsaXZlIGNvdW50ZXIgaWYgdGhlIHBlZXIgc3RhdGlvbiBpcyBmb3VuZCEKKyAgICAgICAgICAgIHpmU3RhRmluZEZyZWVPcHBvc2l0ZShkZXYsICh1MTZfdCAqKXBCc3NJbmZvLT5tYWNhZGRyLCAmaWR4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlNlbmRQcm9iZVJlcSAgICAgICAgICAgICAgKi8KKy8qICAgICAgU2VuZCBwcm9iZSByZXF1ZXN0IG1hbmFnZW1lbnQgZnJhbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEppLUh1YW5nIExlZSAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjExICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3UxNl90IHpmU2VuZFByb2JlUmVxKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGJXaXRoU1NJRCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworCisgICAgLyogU1NJRCAqLworICAgIGlmIChiV2l0aFNTSUQgPT0gMCkgIC8qIGJyb2FkY2FzdCBzc2lkICovCisgICAgeworICAgICAgICAvL3ptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgWk1fV0xBTl9FSURfU1NJRCk7CisgICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMCk7ICAgLyogbGVuZ3RoID0gMCAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICBpZiAod2QtPndzLnByb2JpbmdTc2lkTGlzdFtiV2l0aFNTSUQtMV0uc3NpZExlbiA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIFpNX1dMQU5fRUlEX1NTSUQpOworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAwKTsgICAvKiBsZW5ndGggPSAwICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIFpNX1dMQU5fRUlEX1NTSUQpOworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLAorICAgICAgICAgICAgICAgICAgICB3ZC0+d3MucHJvYmluZ1NzaWRMaXN0W2JXaXRoU1NJRC0xXS5zc2lkTGVuKTsKKyAgICAgICAgICAgIHpmQ29weVRvSW50VHhCdWZmZXIoZGV2LCBidWYsCisgICAgICAgICAgICAgICAgICAgIHdkLT53cy5wcm9iaW5nU3NpZExpc3RbYldpdGhTU0lELTFdLnNzaWQsCisgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgd2QtPndzLnByb2JpbmdTc2lkTGlzdFtiV2l0aFNTSUQtMV0uc3NpZExlbik7IC8qIHNzaWQgKi8KKyAgICAgICAgICAgIG9mZnNldCArPSB3ZC0+d3MucHJvYmluZ1NzaWRMaXN0W2JXaXRoU1NJRC0xXS5zc2lkTGVuOworICAgICAgICB9CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorCisgICAgLyogU3VwcG9ydGVkIHJhdGVzICovCisgICAgaWYgKCB3ZC0+c3RhLmN1cnJlbnRGcmVxdWVuY3kgPCAzMDAwICkKKyAgICB7ICAgLyogODAyLjExYitnICovCisgICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fRUlEX1NVUFBPUlRfUkFURSwgWk1fUkFURV9TRVRfQ0NLKTsKKworICAgICAgICBpZiAod2QtPnN1cHBvcnRNb2RlICYgKFpNX1dJUkVMRVNTX01PREVfMjRfNTR8Wk1fV0lSRUxFU1NfTU9ERV8yNF9OKSkgeworICAgICAgICAgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MpIHsKKyAgICAgICAgICAgICAgICBpZiAod2QtPndmYy5iSWJzc0dNb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUsIFpNX1JBVEVfU0VUX09GRE0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllU3VwcG9ydFJhdGUoZGV2LCBidWYsIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9FSURfRVhURU5ERURfUkFURSwgWk1fUkFURV9TRVRfT0ZETSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsgIC8qIDgwMi4xMWEgKi8KKyAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllU3VwcG9ydFJhdGUoZGV2LCBidWYsIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9FSURfU1VQUE9SVF9SQVRFLCBaTV9SQVRFX1NFVF9PRkRNKTsKKyAgICB9CisKKyAgICByZXR1cm4gb2Zmc2V0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlVwZGF0ZURlZmF1bHRRb3NQYXJhbWV0ZXIgKi8KKy8qICAgICAgVXBkYXRlIFR4UXMgQ1dNSU4sIENXTUFYLCBBSUZTIGFuZCBUWE8gdG8gV01FIGRlZmF1bHQgdmFsdWUuICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG1vZGUgOiAwPT5TVEEsIDE9PkFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gICAgICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA2LjYgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmVXBkYXRlRGVmYXVsdFFvc1BhcmFtZXRlcih6ZGV2X3QqIGRldiwgdThfdCBtb2RlKQoreworICAgIHUxNl90IGN3bWluWzVdOworICAgIHUxNl90IGN3bWF4WzVdOworICAgIHUxNl90IGFpZnNbNV07CisgICAgdTE2X3QgdHhvcFs1XTsKKworICAgIC8qIFdNTSBwYXJhbWV0ZXIgZm9yIFNUQSAqLworICAgIC8qIEJlc3QgRWZmb3IgKi8KKyAgICBjd21pblswXSA9IDE1OworICAgIGN3bWF4WzBdID0gMTAyMzsKKyAgICBhaWZzWzBdID0gMyAqIDkgKyAxMDsKKyAgICB0eG9wWzBdID0gMDsKKyAgICAvKiBCYWNrIEdyb3VuZCAqLworICAgIGN3bWluWzFdID0gMTU7CisgICAgY3dtYXhbMV0gPSAxMDIzOworICAgIGFpZnNbMV0gPSA3ICogOSArIDEwOworICAgIHR4b3BbMV0gPSAwOworICAgIC8qIFZJREVPICovCisgICAgY3dtaW5bMl0gPSA3OworICAgIGN3bWF4WzJdID0gMTU7CisgICAgYWlmc1syXSA9IDIgKiA5ICsgMTA7CisgICAgdHhvcFsyXSA9IDk0OworICAgIC8qIFZPSUNFICovCisgICAgY3dtaW5bM10gPSAzOworICAgIGN3bWF4WzNdID0gNzsKKyAgICBhaWZzWzNdID0gMiAqIDkgKyAxMDsKKyAgICB0eG9wWzNdID0gNDc7CisgICAgLyogU3BlY2lhbCBUeFEgKi8KKyAgICBjd21pbls0XSA9IDM7CisgICAgY3dtYXhbNF0gPSA3OworICAgIGFpZnNbNF0gPSAyICogOSArIDEwOworICAgIHR4b3BbNF0gPSAwOworCisgICAgLyogV01NIHBhcmFtZXRlciBmb3IgQVAgKi8KKyAgICBpZiAobW9kZSA9PSAxKQorICAgIHsKKyAgICAgICAgY3dtYXhbMF0gPSA2MzsKKyAgICAgICAgYWlmc1szXSA9IDEgKiA5ICsgMTA7CisgICAgICAgIGFpZnNbNF0gPSAxICogOSArIDEwOworICAgIH0KKyAgICB6ZkhwVXBkYXRlUW9zUGFyYW1ldGVyKGRldiwgY3dtaW4sIGN3bWF4LCBhaWZzLCB0eG9wKTsKK30KKwordTE2X3QgemZGaW5kQVRIRXh0Q2FwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCB0eXBlLCB1OF90IHN1YnR5cGUpCit7CisgICAgdThfdCBzdWJUeXBlOworICAgIHUxNl90IG9mZnNldDsKKyAgICB1MTZfdCBidWZMZW47CisgICAgdTE2X3QgZWxlbjsKKyAgICB1OF90IGlkOworICAgIHU4X3QgdG1wOworCisgICAgLyogR2V0IG9mZnNldCBvZiBmaXJzdCBlbGVtZW50ICovCisgICAgc3ViVHlwZSA9ICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKSA+PiA0KTsKKworICAgIGlmICgob2Zmc2V0ID0gemdFbGVtZW50T2Zmc2V0VGFibGVbc3ViVHlwZV0pID09IDB4ZmYpCisgICAgeworICAgICAgICB6bV9hc3NlcnQoMCk7CisgICAgfQorCisgICAgLyogUGx1cyB3bGFuIGhlYWRlciAqLworICAgIG9mZnNldCArPSAyNDsKKworICAgIGJ1ZkxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworCisgICAgLyogU2VhcmNoIGxvb3AgKi8KKyAgICB3aGlsZSAoKG9mZnNldCsyKTxidWZMZW4pICAgICAgICAgICAgICAgICAgIC8vIGluY2x1ZGluZyBlbGVtZW50IElEIGFuZCBsZW5ndGggKDJieXRlcykKKyAgICB7CisgICAgICAgIC8qIFNlYXJjaCB0YXJnZXQgZWxlbWVudCAqLworICAgICAgICBpZiAoKGlkID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KSkgPT0gWk1fV0xBTl9FSURfV0lGSV9JRSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQmluZ28gKi8KKyAgICAgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSk+KGJ1ZkxlbiAtIG9mZnNldCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRWxlbWVudCBsZW5ndGggZXJyb3IgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGVsZW4gPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzIpKSA9PSAweDAwKQorICAgICAgICAgICAgICAgICAgICAmJiAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCszKSkgPT0gMHgwMykKKyAgICAgICAgICAgICAgICAgICAgJiYgKCh0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNCkpID09IDB4N2YpCisgICAgICAgICAgICAgICAgICAgICYmICgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzUpKSA9PSB0eXBlKSkKKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggc3VidHlwZSAhPSAweGZmICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs2KSkgPT0gc3VidHlwZSAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQWR2YW5jZSB0byBuZXh0IGVsZW1lbnQgKi8KKyAgICAgICAgaWYgKChlbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICB9CisgICAgICAgIG9mZnNldCArPSAoZWxlbisyKTsKKyAgICB9CisgICAgcmV0dXJuIDB4ZmZmZjsKK30KKwordTE2X3QgemZGaW5kQnJkY21NcnZsUmxua0V4dENhcCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdThfdCBzdWJUeXBlOworICAgIHUxNl90IG9mZnNldDsKKyAgICB1MTZfdCBidWZMZW47CisgICAgdTE2X3QgZWxlbjsKKyAgICB1OF90IGlkOworICAgIHU4X3QgdG1wOworCisgICAgLyogR2V0IG9mZnNldCBvZiBmaXJzdCBlbGVtZW50ICovCisgICAgc3ViVHlwZSA9ICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKSA+PiA0KTsKKworICAgIGlmICgob2Zmc2V0ID0gemdFbGVtZW50T2Zmc2V0VGFibGVbc3ViVHlwZV0pID09IDB4ZmYpCisgICAgeworICAgICAgICB6bV9hc3NlcnQoMCk7CisgICAgfQorCisgICAgLyogUGx1cyB3bGFuIGhlYWRlciAqLworICAgIG9mZnNldCArPSAyNDsKKworICAgIGJ1ZkxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworCisgICAgLyogU2VhcmNoIGxvb3AgKi8KKyAgICB3aGlsZSAoKG9mZnNldCsyKTxidWZMZW4pICAgICAgICAgICAgICAgICAgIC8vIGluY2x1ZGluZyBlbGVtZW50IElEIGFuZCBsZW5ndGggKDJieXRlcykKKyAgICB7CisgICAgICAgIC8qIFNlYXJjaCB0YXJnZXQgZWxlbWVudCAqLworICAgICAgICBpZiAoKGlkID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KSkgPT0gWk1fV0xBTl9FSURfV0lGSV9JRSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQmluZ28gKi8KKyAgICAgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSk+KGJ1ZkxlbiAtIG9mZnNldCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRWxlbWVudCBsZW5ndGggZXJyb3IgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGVsZW4gPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzIpKSA9PSAweDAwKQorICAgICAgICAgICAgICAgICAgICAmJiAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCszKSkgPT0gMHgxMCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKCh0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNCkpID09IDB4MTgpKQorCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzIpKSA9PSAweDAwKQorICAgICAgICAgICAgICAgICAgICAmJiAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCszKSkgPT0gMHg1MCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKCh0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNCkpID09IDB4NDMpKQorCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoaWQgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpKSA9PSAweDdGKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBCaW5nbyAqLworICAgICAgICAgICAgaWYgKChlbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpKT4oYnVmTGVuIC0gb2Zmc2V0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBFbGVtZW50IGxlbmd0aCBlcnJvciAqLworICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggZWxlbiA9PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKSkgPT0gMHgwMSkKKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBBZHZhbmNlIHRvIG5leHQgZWxlbWVudCAqLworICAgICAgICBpZiAoKGVsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICAgIH0KKyAgICAgICAgb2Zmc2V0ICs9IChlbGVuKzIpOworICAgIH0KKyAgICByZXR1cm4gMHhmZmZmOworfQorCit1MTZfdCB6ZkZpbmRNYXJ2ZWxFeHRDYXAoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHU4X3Qgc3ViVHlwZTsKKyAgICB1MTZfdCBvZmZzZXQ7CisgICAgdTE2X3QgYnVmTGVuOworICAgIHUxNl90IGVsZW47CisgICAgdThfdCBpZDsKKyAgICB1OF90IHRtcDsKKworICAgIC8qIEdldCBvZmZzZXQgb2YgZmlyc3QgZWxlbWVudCAqLworICAgIHN1YlR5cGUgPSAoem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCkgPj4gNCk7CisKKyAgICBpZiAoKG9mZnNldCA9IHpnRWxlbWVudE9mZnNldFRhYmxlW3N1YlR5cGVdKSA9PSAweGZmKQorICAgIHsKKyAgICAgICAgem1fYXNzZXJ0KDApOworICAgIH0KKworICAgIC8qIFBsdXMgd2xhbiBoZWFkZXIgKi8KKyAgICBvZmZzZXQgKz0gMjQ7CisKKyAgICBidWZMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKworICAgIC8qIFNlYXJjaCBsb29wICovCisgICAgd2hpbGUgKChvZmZzZXQrMik8YnVmTGVuKSAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRpbmcgZWxlbWVudCBJRCBhbmQgbGVuZ3RoICgyYnl0ZXMpCisgICAgeworICAgICAgICAvKiBTZWFyY2ggdGFyZ2V0IGVsZW1lbnQgKi8KKyAgICAgICAgaWYgKChpZCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCkpID09IFpNX1dMQU5fRUlEX1dJRklfSUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEJpbmdvICovCisgICAgICAgICAgICBpZiAoKGVsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkpPihidWZMZW4gLSBvZmZzZXQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEVsZW1lbnQgbGVuZ3RoIGVycm9yICovCisgICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBlbGVuID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKSkgPT0gMHgwMCkKKyAgICAgICAgICAgICAgICAgICYmICgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzMpKSA9PSAweDUwKQorICAgICAgICAgICAgICAgICAgJiYgKCh0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNCkpID09IDB4NDMpKQorCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIEFkdmFuY2UgdG8gbmV4dCBlbGVtZW50ICovCisgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgfQorICAgICAgICBvZmZzZXQgKz0gKGVsZW4rMik7CisgICAgfQorICAgIHJldHVybiAweGZmZmY7Cit9CisKK3UxNl90IHpmRmluZEJyb2FkY29tRXh0Q2FwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB1OF90IHN1YlR5cGU7CisgICAgdTE2X3Qgb2Zmc2V0OworICAgIHUxNl90IGJ1ZkxlbjsKKyAgICB1MTZfdCBlbGVuOworICAgIHU4X3QgaWQ7CisgICAgdThfdCB0bXA7CisKKyAgICAvKiBHZXQgb2Zmc2V0IG9mIGZpcnN0IGVsZW1lbnQgKi8KKyAgICBzdWJUeXBlID0gKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDApID4+IDQpOworCisgICAgaWYgKChvZmZzZXQgPSB6Z0VsZW1lbnRPZmZzZXRUYWJsZVtzdWJUeXBlXSkgPT0gMHhmZikKKyAgICB7CisgICAgICAgIHptX2Fzc2VydCgwKTsKKyAgICB9CisKKyAgICAvKiBQbHVzIHdsYW4gaGVhZGVyICovCisgICAgb2Zmc2V0ICs9IDI0OworCisgICAgYnVmTGVuID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CisKKyAgICAvKiBTZWFyY2ggbG9vcCAqLworICAgIHdoaWxlKChvZmZzZXQrMikgPCBidWZMZW4pICAgICAgICAgICAgICAgICAgIC8vIGluY2x1ZGluZyBlbGVtZW50IElEIGFuZCBsZW5ndGggKDJieXRlcykKKyAgICB7CisgICAgICAgIC8qIFNlYXJjaCB0YXJnZXQgZWxlbWVudCAqLworICAgICAgICBpZiAoKGlkID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KSkgPT0gWk1fV0xBTl9FSURfV0lGSV9JRSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQmluZ28gKi8KKyAgICAgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSkgPiAoYnVmTGVuIC0gb2Zmc2V0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBFbGVtZW50IGxlbmd0aCBlcnJvciAqLworICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChlbGVuID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKSkgPT0gMHgwMCkKKyAgICAgICAgICAgICAgICAgJiYgKCh0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMykpID09IDB4MTApCisgICAgICAgICAgICAgICAgICYmICgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzQpKSA9PSAweDE4KSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIEFkdmFuY2UgdG8gbmV4dCBlbGVtZW50ICovCisgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICAgICAgfQorCisgICAgICAgIG9mZnNldCArPSAoZWxlbisyKTsKKyAgICB9CisKKyAgICByZXR1cm4gMHhmZmZmOworfQorCit1MTZfdCB6ZkZpbmRSbG5rRXh0Q2FwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB1OF90IHN1YlR5cGU7CisgICAgdTE2X3Qgb2Zmc2V0OworICAgIHUxNl90IGJ1ZkxlbjsKKyAgICB1MTZfdCBlbGVuOworICAgIHU4X3QgaWQ7CisgICAgdThfdCB0bXA7CisKKyAgICAvKiBHZXQgb2Zmc2V0IG9mIGZpcnN0IGVsZW1lbnQgKi8KKyAgICBzdWJUeXBlID0gKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDApID4+IDQpOworCisgICAgaWYgKChvZmZzZXQgPSB6Z0VsZW1lbnRPZmZzZXRUYWJsZVtzdWJUeXBlXSkgPT0gMHhmZikKKyAgICB7CisgICAgICAgIHptX2Fzc2VydCgwKTsKKyAgICB9CisKKyAgICAvKiBQbHVzIHdsYW4gaGVhZGVyICovCisgICAgb2Zmc2V0ICs9IDI0OworCisgICAgYnVmTGVuID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CisKKyAgICAvKiBTZWFyY2ggbG9vcCAqLworICAgIHdoaWxlKChvZmZzZXQrMikgPCBidWZMZW4pICAgICAgICAgICAgICAgICAgIC8vIGluY2x1ZGluZyBlbGVtZW50IElEIGFuZCBsZW5ndGggKDJieXRlcykKKyAgICB7CisgICAgICAgIC8qIFNlYXJjaCB0YXJnZXQgZWxlbWVudCAqLworICAgICAgICBpZiAoKGlkID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KSkgPT0gMHg3RikKKyAgICAgICAgeworICAgICAgICAgICAgLyogQmluZ28gKi8KKyAgICAgICAgICAgIGlmICgoZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSkgPiAoYnVmTGVuIC0gb2Zmc2V0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBFbGVtZW50IGxlbmd0aCBlcnJvciAqLworICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggZWxlbiA9PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMHhmZmZmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKSkgPT0gMHgwMSkKKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBBZHZhbmNlIHRvIG5leHQgZWxlbWVudCAqLworICAgICAgICBpZiAoKGVsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICAgIH0KKworICAgICAgICBvZmZzZXQgKz0gKGVsZW4rMik7CisgICAgfQorCisgICAgcmV0dXJuIDB4ZmZmZjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jbW1hcC5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NtbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YwOWZkZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jbW1hcC5jCkBAIC0wLDAgKzEsMjQwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogbW0uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBjb21tb24gZnVuY3Rpb25zIGZvciBoYW5kbGUgQVAgICAgICAgICAgICAgKi8KKy8qICAgICAgbWFuYWdlbWVudCBmcmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJjcHJlY29tcC5oIgorI2luY2x1ZGUgInJhdGVjdHJsLmgiCisKK2V4dGVybiBjb25zdCB1OF90IHpjVXBUb0FjW107CisKK3ZvaWQgemZNbUFwVGltZVRpY2soemRldl90KiBkZXYpCit7CisgICAgdTMyX3Qgbm93OworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vem1fZGVidWdfbXNnMSgid2QtPndsYW5Nb2RlIDogIiwgd2QtPndsYW5Nb2RlKTsKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgeworICAgICAgICAvKiA9PiBldmVyeSAxLjI4IHNlY29uZHMgKi8KKyAgICAgICAgLyogQVAgOiBhZ2luZyBTVEEgdGhhdCBkb2VzIG5vdCBhY3RpdmUgZm9yIHdkLT5hcC5zdGFBZ2luZ1RpbWUgICAgKi8KKyAgICAgICAgbm93ID0gd2QtPnRpY2sgJiAweDdmOworICAgICAgICBpZiAobm93ID09IDB4MCkKKyAgICAgICAgeworICAgICAgICAgICAgemZBcEFnaW5nU3RhKGRldik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobm93ID09IDB4MWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmUXVldWVBZ2UoZGV2LCB3ZC0+YXAudWFwc2RRLCB3ZC0+dGljaywgMTAwMDApOworICAgICAgICB9CisgICAgICAgIC8qIEFQIDogY2hlY2sgKHdkLT5hcC5wcm90ZWN0ZWRPYnNzKSBhbmQgKHdkLT5hcC5iU3RhQXNzb2NpYXRlZCkgICovCisgICAgICAgIC8qICAgICAgdG8gZW5hYmxlIE5vbkVycCBhbmQgUHJvdGVjdGlvbiBtb2RlICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIGVsc2UgaWYgKG5vdyA9PSAweDNmKQorICAgICAgICB7CisgICAgICAgICAgICAvL3pmQXBQcm90Y3Rpb25Nb25pdG9yKGRldik7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFwSW5pdFN0YVRibCAgICAgICAgICAgICAgKi8KKy8qICAgICAgSW5pdCBBUCdzIHN0YXRpb24gdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZBcEluaXRTdGFUYmwoemRldl90KiBkZXYpCit7CisgICAgdTE2X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGZvciAoaT0wOyBpPFpNX01BWF9TVEFfU1VQUE9SVDsgaSsrKQorICAgIHsKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2ldLnZhbGlkID0gMDsKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2ldLnN0YXRlID0gMDsKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2ldLmFkZHJbMF0gPSAwOworICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaV0uYWRkclsxXSA9IDA7CisgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpXS5hZGRyWzJdID0gMDsKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2ldLnRpbWUgPSAwOworICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaV0udmFwID0gMDsKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2ldLmVuY3J5TW9kZSA9IFpNX05PX1dFUDsKKyAgICB9CisgICAgcmV0dXJuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFwRmluZFN0YSAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRmluZCBhIFNUQSBpbiBzdGF0aW9uIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGFkZHIgOiBUYXJnZXQgU1RBIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDB4ZmZmZiA6IGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvdGhlciA6IFNUQSB0YWJsZSBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMCAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZBcEZpbmRTdGEoemRldl90KiBkZXYsIHUxNl90KiBhZGRyKQoreworICAgIHUxNl90IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBmb3IgKGk9MDsgaTxaTV9NQVhfU1RBX1NVUFBPUlQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh3ZC0+YXAuc3RhVGFibGVbaV0udmFsaWQgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCh3ZC0+YXAuc3RhVGFibGVbaV0uYWRkclswXSA9PSBhZGRyWzBdKQorICAgICAgICAgICAgICAgICAgICAmJiAod2QtPmFwLnN0YVRhYmxlW2ldLmFkZHJbMV0gPT0gYWRkclsxXSkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHdkLT5hcC5zdGFUYWJsZVtpXS5hZGRyWzJdID09IGFkZHJbMl0pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAweGZmZmY7Cit9CisKK3UxNl90IHpmQXBHZXRTVEFJbmZvKHpkZXZfdCogZGV2LCB1MTZfdCogYWRkciwgdTE2X3QqIHN0YXRlLCB1OF90KiB2YXApCit7CisgICAgdTE2X3QgaWQ7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICgoaWQgPSB6ZkFwRmluZFN0YShkZXYsIGFkZHIpKSAhPSAweGZmZmYpCisgICAgeworICAgICAgICAqdmFwID0gd2QtPmFwLnN0YVRhYmxlW2lkXS52YXA7CisgICAgICAgICpzdGF0ZSA9IHdkLT5hcC5zdGFUYWJsZVtpZCsrXS5zdGF0ZTsKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuIGlkOworfQorCisKK3ZvaWQgemZBcEdldFN0YVFvc1R5cGUoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1OF90KiBxb3NUeXBlKQoreworICAgIHUxNl90IGlkOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBhZGRyKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgKnFvc1R5cGUgPSB3ZC0+YXAuc3RhVGFibGVbaWRdLnFvc1R5cGU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpxb3NUeXBlID0gMDsKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuOworfQorCit2b2lkIHpmQXBHZXRTdGFUeFJhdGVBbmRRb3NUeXBlKHpkZXZfdCogZGV2LCB1MTZfdCogYWRkciwgdTMyX3QqIHBoeUN0cmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4X3QqIHFvc1R5cGUsIHUxNl90KiByY1Byb2JpbmdGbGFnKQoreworICAgIHUxNl90IGlkOworICAgIHU4X3QgcmF0ZTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKChpZCA9IHpmQXBGaW5kU3RhKGRldiwgYWRkcikpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgIHJhdGUgPSAodThfdCl6ZlJhdGVDdHJsR2V0VHhSYXRlKGRldiwgJndkLT5hcC5zdGFUYWJsZVtpZF0ucmNDZWxsLCByY1Byb2JpbmdGbGFnKTsKKyNpZmRlZiBaTV9BUF9ERUJVRworICAgICAgICAvL3JhdGUgPSAxNTsKKyNlbmRpZgorICAgICAgICAqcGh5Q3RybCA9IHpjUmF0ZVRvUGh5Q3RybFtyYXRlXTsKKyAgICAgICAgKnFvc1R5cGUgPSB3ZC0+YXAuc3RhVGFibGVbaWRdLnFvc1R5cGU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICh3ZC0+ZnJlcXVlbmN5IDwgMzAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQ0NLIDFNICovCisgICAgICAgICAgICAvL2hlYWRlclsyXSA9IDB4MGYwMDsgICAgICAgICAgLy9QSFkgY29udHJvbCBMCisgICAgICAgICAgICAvL2hlYWRlclszXSA9IDB4MDAwMDsgICAgICAgICAgLy9QSFkgY29udHJvbCBICisgICAgICAgICAgICAqcGh5Q3RybCA9IDB4MDAwMDBGMDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBDQ0sgNk0gKi8KKyAgICAgICAgICAgIC8vaGVhZGVyWzJdID0gMHgwZjAxOyAgICAgICAgICAvL1BIWSBjb250cm9sIEwKKyAgICAgICAgICAgIC8vaGVhZGVyWzNdID0gMHgwMDBCOyAgICAgICAgICAvL1BIWSBjb250cm9sIEgKKyAgICAgICAgICAgICpwaHlDdHJsID0gMHgwMDBCMEYwMTsKKyAgICAgICAgfQorICAgICAgICAqcW9zVHlwZSA9IDA7CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHptX21zZzJfbW0oWk1fTFZfMywgIlBoeUN0cmw9IiwgKnBoeUN0cmwpOworICAgIHJldHVybjsKK30KKwordm9pZCB6ZkFwR2V0U3RhRW5jcnlUeXBlKHpkZXZfdCogZGV2LCB1MTZfdCogYWRkciwgdThfdCogZW5jcnlUeXBlKQoreworICAgIC8vc3RydWN0IHpzV2xhbkRldiogd2QgPSAoc3RydWN0IHpzV2xhbkRldiopIHptd193bGFuX2RldihkZXYpOworICAgIHUxNl90IGlkOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBhZGRyKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgKmVuY3J5VHlwZSA9IHdkLT5hcC5zdGFUYWJsZVtpZF0uZW5jcnlNb2RlOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAqZW5jcnlUeXBlID0gWk1fTk9fV0VQOworICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICB6bV9tc2cyX21tKFpNX0xWXzMsICJlbmN5clR5cGU9IiwgKmVuY3J5VHlwZSk7CisgICAgcmV0dXJuOworfQorCit2b2lkIHpmQXBHZXRTdGFXcGFJdih6ZGV2X3QqIGRldiwgdTE2X3QqIGFkZHIsIHUxNl90KiBpdjE2LCB1MzJfdCogaXYzMikKK3sKKyAgICAvL3N0cnVjdCB6c1dsYW5EZXYqIHdkID0gKHN0cnVjdCB6c1dsYW5EZXYqKSB6bXdfd2xhbl9kZXYoZGV2KTsKKyAgICB1MTZfdCBpZDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKChpZCA9IHpmQXBGaW5kU3RhKGRldiwgYWRkcikpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgICppdjE2ID0gd2QtPmFwLnN0YVRhYmxlW2lkXS5pdjE2OworICAgICAgICAqaXYzMiA9IHdkLT5hcC5zdGFUYWJsZVtpZF0uaXYzMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKml2MTYgPSAwOworICAgICAgICAqaXYzMiA9IDA7CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHptX21zZzJfbW0oWk1fTFZfMywgIml2MTY9IiwgKml2MTYpOworICAgIHptX21zZzJfbW0oWk1fTFZfMywgIml2MzI9IiwgKml2MzIpOworICAgIHJldHVybjsKK30KKwordm9pZCB6ZkFwU2V0U3RhV3BhSXYoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MTZfdCBpdjE2LCB1MzJfdCBpdjMyKQoreworICAgIC8vc3RydWN0IHpzV2xhbkRldiogd2QgPSAoc3RydWN0IHpzV2xhbkRldiopIHptd193bGFuX2RldihkZXYpOworICAgIHUxNl90IGlkOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBhZGRyKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS5pdjE2ID0gaXYxNjsKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS5pdjMyID0gaXYzMjsKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgem1fbXNnMl9tbShaTV9MVl8zLCAiaXYxNj0iLCBpdjE2KTsKKyAgICB6bV9tc2cyX21tKFpNX0xWXzMsICJpdjMyPSIsIGl2MzIpOworICAgIHJldHVybjsKK30KKwordm9pZCB6ZkFwQ2xlYXJTdGFLZXkoemRldl90KiBkZXYsIHUxNl90KiBhZGRyKQoreworICAgIC8vc3RydWN0IHpzV2xhbkRldiogd2QgPSAoc3RydWN0IHpzV2xhbkRldiopIHptd193bGFuX2RldihkZXYpOworICAgIHUxNl90IGJjQWRkclszXSA9IHsgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiB9OworICAgIHUxNl90IGlkOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKHpmTWVtb3J5SXNFcXVhbCgodThfdCopYmNBZGRyLCAodThfdCopYWRkciwgc2l6ZW9mKGJjQWRkcikpID09IFRSVUUpCisgICAgeworICAgICAgICAvKiBUdXJuIG9mZiBncm91cCBrZXkgaW5mb3JtYXRpb24gKi8KKyAgICAvLyAgICB6ZkNsZWFyS2V5KGRldiwgMCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBhZGRyKSkgIT0gMHhmZmZmKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBUdXJuIG9mZiBTVEEncyBrZXkgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgIHpmSHBSZW1vdmVLZXkoZGV2LCBpZCsxKTsKKworICAgICAgICAgICAgLyogVXBkYXRlIFNUQSdzIEVuY3J5cHRpb24gVHlwZSAqLworICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS5lbmNyeU1vZGUgPSBaTV9OT19XRVA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzMsICJDYW4ndCBmaW5kIFNUQSBhZGRyZXNzXG4iKTsKKyAgICAgICAgfQorICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIH0KK30KKworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCit2b2lkIHpmQXBHZXRTdGFDZW5jSXZBbmRLZXlJZHgoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MzJfdCAqaXYsIHU4X3QgKmtleUlkeCkKK3sKKyAgICAvL3N0cnVjdCB6c1dsYW5EZXYqIHdkID0gKHN0cnVjdCB6c1dsYW5EZXYqKSB6bXdfd2xhbl9kZXYoZGV2KTsKKyAgICB1MTZfdCBpZDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICgoaWQgPSB6ZkFwRmluZFN0YShkZXYsIGFkZHIpKSAhPSAweGZmZmYpCisgICAgeworICAgICAgICAqaXYrKyA9IHdkLT5hcC5zdGFUYWJsZVtpZF0udHhpdlswXTsKKyAgICAgICAgKml2KysgPSB3ZC0+YXAuc3RhVGFibGVbaWRdLnR4aXZbMV07CisgICAgICAgICppdisrID0gd2QtPmFwLnN0YVRhYmxlW2lkXS50eGl2WzJdOworICAgICAgICAqaXYgPSB3ZC0+YXAuc3RhVGFibGVbaWRdLnR4aXZbM107CisgICAgICAgICprZXlJZHggPSB3ZC0+YXAuc3RhVGFibGVbaWRdLmNlbmNLZXlJZHg7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICppdisrID0gMHg1YzM2NWMzNzsKKyAgICAgICAgKml2KysgPSAweDVjMzY1YzM2OworICAgICAgICAqaXYrKyA9IDB4NWMzNjVjMzY7CisgICAgICAgICppdiA9IDB4NWMzNjVjMzY7CisgICAgICAgICprZXlJZHggPSAwOworICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgcmV0dXJuOworfQorCit2b2lkIHpmQXBTZXRTdGFDZW5jSXYoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MzJfdCAqaXYpCit7CisgICAgLy9zdHJ1Y3QgenNXbGFuRGV2KiB3ZCA9IChzdHJ1Y3QgenNXbGFuRGV2Kikgem13X3dsYW5fZGV2KGRldik7CisgICAgdTE2X3QgaWQ7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBhZGRyKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS50eGl2WzBdID0gKml2Kys7CisgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpZF0udHhpdlsxXSA9ICppdisrOworICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLnR4aXZbMl0gPSAqaXYrKzsKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS50eGl2WzNdID0gKml2OworICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXR1cm47Cit9CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFwRmx1c2hCdWZmZXJlZFBzRnJhbWUgICAgKi8KKy8qICAgICAgRnJlZSBidWZmZXJlZCBQUyBmcmFtZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuMSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZBcEZsdXNoQnVmZmVyZWRQc0ZyYW1lKHpkZXZfdCogZGV2KQoreworICAgIHUxNl90IGVtcHR5RmxhZzsKKyAgICB1MTZfdCBmcmVlQ291bnQ7CisgICAgdTE2X3QgdmFwOworICAgIHpidWZfdCogcHNCdWYgPSBOVUxMOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgZnJlZUNvdW50ID0gMDsKKyAgICBlbXB0eUZsYWcgPSAwOworICAgIHdoaWxlICgxKQorICAgIHsKKyAgICAgICAgcHNCdWYgPSBOVUxMOworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICBpZiAod2QtPmFwLnVuaUhlYWQgIT0gd2QtPmFwLnVuaVRhaWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBzQnVmID0gd2QtPmFwLnVuaUFycmF5W3dkLT5hcC51bmlIZWFkXTsKKyAgICAgICAgICAgIHdkLT5hcC51bmlIZWFkID0gKHdkLT5hcC51bmlIZWFkICsgMSkgJiAoWk1fVU5JX0FSUkFZX1NJWkUgLSAxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGVtcHR5RmxhZyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICBpZiAocHNCdWYgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIHBzQnVmLCBaTV9FUlJfRkxVU0hfUFNfUVVFVUUpOworICAgICAgICB9CisgICAgICAgIHptX2Fzc2VydChmcmVlQ291bnQrKyA8IChaTV9VTklfQVJSQVlfU0laRSoyKSk7CisKKyAgICAgICAgaWYgKGVtcHR5RmxhZyAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAodmFwPTA7IHZhcDxaTV9NQVhfQVBfU1VQUE9SVDsgdmFwKyspCisgICAgeworICAgICAgICBmcmVlQ291bnQgPSAwOworICAgICAgICBlbXB0eUZsYWcgPSAwOworICAgICAgICB3aGlsZSAoMSkKKyAgICAgICAgeworICAgICAgICAgICAgcHNCdWYgPSBOVUxMOworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIGlmICh3ZC0+YXAuYmNtY0hlYWRbdmFwXSAhPSB3ZC0+YXAuYmNtY1RhaWxbdmFwXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwc0J1ZiA9IHdkLT5hcC5iY21jQXJyYXlbdmFwXVt3ZC0+YXAuYmNtY0hlYWRbdmFwXV07CisgICAgICAgICAgICAgICAgd2QtPmFwLmJjbWNIZWFkW3ZhcF0gPSAod2QtPmFwLmJjbWNIZWFkW3ZhcF0gKyAxKQorICAgICAgICAgICAgICAgICAgICAgICAgJiAoWk1fQkNNQ19BUlJBWV9TSVpFIC0gMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW1wdHlGbGFnID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgIGlmIChwc0J1ZiAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBwc0J1ZiwgWk1fRVJSX0ZMVVNIX1BTX1FVRVVFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHptX2Fzc2VydChmcmVlQ291bnQrKyA8IChaTV9CQ01DX0FSUkFZX1NJWkUqMikpOworCisgICAgICAgICAgICBpZiAoZW1wdHlGbGFnICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworfQorCisKK3UxNl90IHpmQXBCdWZmZXJQc0ZyYW1lKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCkKK3sKKyAgICB1MTZfdCBpZDsKKyAgICB1MTZfdCBhZGRyWzNdOworICAgIHUxNl90IHZhcCA9IDA7CisgICAgdThfdCB1cDsKKyAgICB1MTZfdCBmcmFnT2ZmOworICAgIHU4X3QgYWM7CisgICAgdTE2X3QgcmV0OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmIChwb3J0IDwgWk1fTUFYX0FQX1NVUFBPUlQpCisgICAgeworICAgICAgICB2YXAgPSBwb3J0OworICAgIH0KKworICAgIGFkZHJbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAwKTsKKyAgICBhZGRyWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMik7CisgICAgYWRkclsyXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDQpOworCisgICAgaWYgKChhZGRyWzBdICYgMHgxKSA9PSAweDEpCisgICAgeworICAgICAgICBpZiAod2QtPmFwLnN0YVBvd2VyU2F2aW5nID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgLyogQnVmZmVyIHRoaXMgQkMgb3IgTUMgZnJhbWUgKi8KKyAgICAgICAgICAgIGlmICgoKHdkLT5hcC5iY21jVGFpbFt2YXBdKzEpJihaTV9CQ01DX0FSUkFZX1NJWkUtMSkpCisgICAgICAgICAgICAgICAgICAgICE9IHdkLT5hcC5iY21jSGVhZFt2YXBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5hcC5iY21jQXJyYXlbdmFwXVt3ZC0+YXAuYmNtY1RhaWxbdmFwXSsrXSA9IGJ1ZjsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuYmNtY1RhaWxbdmFwXSAmPSAoWk1fQkNNQ19BUlJBWV9TSVpFLTEpOworICAgICAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgICAgICB6bV9tc2cwX3R4KFpNX0xWXzAsICJCdWZmZXIgQkNNQyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGJjbWNBcnJheSBmdWxsICovCisgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgICAgIHptX21zZzBfdHgoWk1fTFZfMCwgIkJDTUMgYnVmZmVyIGZ1bGwiKTsKKworICAgICAgICAgICAgICAgIC8qIGZyZWUgYnVmZmVyIGFjY29yZGluZyB0byBidWZmZXIgdHlwZSAqLworICAgICAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIFpNX0VSUl9CQ01DX1BTX0JVRkZFUl9VTkFWQUlMQUJMRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIGlmICgoaWQgPSB6ZkFwRmluZFN0YShkZXYsIGFkZHIpKSAhPSAweGZmZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3ZC0+YXAuc3RhVGFibGVbaWRdLnBzTW9kZSA9PSAxKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgemZUeEdldElwVG9zQW5kRnJhZyhkZXYsIGJ1ZiwgJnVwLCAmZnJhZ09mZik7CisgICAgICAgICAgICAgICAgYWMgPSB6Y1VwVG9BY1t1cCYweDddICYgMHgzOworCisgICAgICAgICAgICAgICAgaWYgKCh3ZC0+YXAuc3RhVGFibGVbaWRdLnFvc1R5cGUgPT0gMSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICgod2QtPmFwLnN0YVRhYmxlW2lkXS5xb3NJbmZvICYgKDB4OD4+YWMpKSAhPSAwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IHpmUXVldWVQdXROY3MoZGV2LCB3ZC0+YXAudWFwc2RRLCBidWYsIHdkLT50aWNrKTsKKyAgICAgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBaTV9TVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCBaTV9FUlJfQVBfVUFQU0RfUVVFVUVfRlVMTCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBCdWZmZXIgdGhpcyB1bmljYXN0IGZyYW1lICovCisgICAgICAgICAgICAgICAgaWYgKCgod2QtPmFwLnVuaVRhaWwrMSkmKFpNX1VOSV9BUlJBWV9TSVpFLTEpKQorICAgICAgICAgICAgICAgICAgICAgICAgIT0gd2QtPmFwLnVuaUhlYWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAudW5pQXJyYXlbd2QtPmFwLnVuaVRhaWwrK10gPSBidWY7CisgICAgICAgICAgICAgICAgICAgIHdkLT5hcC51bmlUYWlsICY9IChaTV9VTklfQVJSQVlfU0laRS0xKTsKKyAgICAgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgem1fbXNnMF90eChaTV9MVl8wLCAiQnVmZmVyIFVOSSIpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIHVuaUFycmF5IGZ1bGwgKi8KKyAgICAgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgem1fbXNnMF90eChaTV9MVl8wLCAiVU5JIGJ1ZmZlciBmdWxsIik7CisgICAgICAgICAgICAgICAgICAgIC8qIGZyZWUgYnVmZmVyIGFjY29yZGluZyB0byBidWZmZXIgdHlwZSAqLworICAgICAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCBaTV9FUlJfVU5JX1BTX0JVRkZFUl9VTkFWQUlMQUJMRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0gLyogaWYgKHdkLT5hcC5zdGFUYWJsZVtpZCsrXS5wc01vZGUgPT0gMSkgKi8KKyAgICAgICAgfSAvKiBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBhZGRyKSkgIT0gMHhmZmZmKSAqLworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCit1MTZfdCB6ZkFwR2V0U1RBSW5mb0FuZFVwZGF0ZVBzKHpkZXZfdCogZGV2LCB1MTZfdCogYWRkciwgdTE2X3QqIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OF90KiB2YXAsIHUxNl90IHBzTW9kZSwgdThfdCogdWFwc2RUcmlnKQoreworICAgIHUxNl90IGlkOworICAgIHU4X3QgdWFwc2RTdGFBd2FrZSA9IDA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworI2lmZGVmIFpNX0FQX0RFQlVHCisgICAgLy9wc01vZGU9MDsKKyNlbmRpZgorCisgICAgaWYgKChpZCA9IHpmQXBGaW5kU3RhKGRldiwgYWRkcikpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgIGlmIChwc01vZGUgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgem1fbXNnMF9tbShaTV9MVl8wLCAicHNNb2RlID0gMSIpOworICAgICAgICAgICAgaWYgKHdkLT5hcC5zdGFUYWJsZVtpZF0ucHNNb2RlID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVBvd2VyU2F2aW5nKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHdkLT5hcC5zdGFUYWJsZVtpZF0ucW9zVHlwZSA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgem1fbXNnMF9tbShaTV9MVl8wLCAiVUFQU0QgdHJpZ2dlciIpOworICAgICAgICAgICAgICAgICAgICAqdWFwc2RUcmlnID0gd2QtPmFwLnN0YVRhYmxlW2lkXS5xb3NJbmZvOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3ZC0+YXAuc3RhVGFibGVbaWRdLnBzTW9kZSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5hcC5zdGFQb3dlclNhdmluZy0tOworICAgICAgICAgICAgICAgIGlmICgod2QtPmFwLnN0YVRhYmxlW2lkXS5xb3NUeXBlID09IDEpICYmICgod2QtPmFwLnN0YVRhYmxlW2lkXS5xb3NJbmZvJjB4ZikhPTApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdWFwc2RTdGFBd2FrZSA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS5wc01vZGUgPSAodThfdCkgcHNNb2RlOworICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLnRpbWUgPSB3ZC0+dGljazsKKyAgICAgICAgKnZhcCA9IHdkLT5hcC5zdGFUYWJsZVtpZF0udmFwOworICAgICAgICAqc3RhdGUgPSB3ZC0+YXAuc3RhVGFibGVbaWQrK10uc3RhdGU7CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICh1YXBzZFN0YUF3YWtlID09IDEpCisgICAgeworICAgICAgICB6YnVmX3QqIHBzQnVmOworICAgICAgICB1OF90IG1iOworCisgICAgICAgIHdoaWxlICgxKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHBzQnVmID0gemZRdWV1ZUdldFdpdGhNYWMoZGV2LCB3ZC0+YXAudWFwc2RRLCAodThfdCopYWRkciwgJm1iKSkgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZlR4U2VuZEV0aChkZXYsIHBzQnVmLCAwLCBaTV9FWFRFUk5BTF9BTExPQ19CVUYsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGlkOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBcEdldE5ld1N0YSAgICAgICAgICAgICAgICovCisvKiAgICAgIEdldCBhIG5ldyBTVEEgZnJvbSBzdGF0aW9uIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDB4ZmZmZiA6IGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvdGhlciA6IFNUQSB0YWJsZSBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMCAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZBcEdldE5ld1N0YSh6ZGV2X3QqIGRldikKK3sKKyAgICB1MTZfdCBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZm9yIChpPTA7IGk8Wk1fTUFYX1NUQV9TVVBQT1JUOyBpKyspCisgICAgeworICAgICAgICBpZiAod2QtPmFwLnN0YVRhYmxlW2ldLnZhbGlkID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMCwgInpmQXBHZXROZXdTdGE9IiwgaSk7CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMHhmZmZmOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFwQWRkU3RhICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgQWRkIGEgU1RBIHRvIHN0YXRpb24gdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGFkZHIgOiBTVEEgTUFDIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBzdGF0ZSA6IFNUQSBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYXBJZCA6IFZpcnR1YWwgQVAgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHR5cGUgOiAwPT4xMWIsIDE9PjExZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDB4ZmZmZiA6IGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBPdGhlciA6IGluZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMCAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZBcEFkZFN0YSh6ZGV2X3QqIGRldiwgdTE2X3QqIGFkZHIsIHUxNl90IHN0YXRlLCB1MTZfdCBhcElkLCB1OF90IHR5cGUsCisgICAgICAgICAgICAgICAgIHU4X3QgcW9zVHlwZSwgdThfdCBxb3NJbmZvKQoreworICAgIHUxNl90IGluZGV4OworICAgIHUxNl90IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem1fbXNnMV9tbShaTV9MVl8wLCAiU1RBIHR5cGU9IiwgdHlwZSk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKChpbmRleCA9IHpmQXBGaW5kU3RhKGRldiwgYWRkcikpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMiwgImZvdW5kIik7CisgICAgICAgIC8qIFVwZGF0ZSBTVEEgc3RhdGUgKi8KKyAgICAgICAgaWYgKChzdGF0ZSA9PSBaTV9TVEFURV9BVVRIKSB8fCAoc3RhdGUgPT0gWk1fU1RBVEVfUFJFQVVUSCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpbmRleF0uc3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpbmRleF0udGltZSA9IHdkLT50aWNrOworICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2luZGV4XS52YXAgPSAodThfdClhcElkOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHN0YXRlID09IFpNX1NUQVRFX0FTT0MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgod2QtPmFwLnN0YVRhYmxlW2luZGV4XS5zdGF0ZSA9PSBaTV9TVEFURV9BVVRIKSkKKyAgICAgICAgICAgICAgICAgICAgLy8mJiAod2QtPmFwLnN0YVRhYmxlW2luZGV4XS52YXAgPT0gYXBJZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2luZGV4XS5zdGF0ZSA9IHN0YXRlOworICAgICAgICAgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpbmRleF0udGltZSA9IHdkLT50aWNrOworICAgICAgICAgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpbmRleF0ucW9zVHlwZSA9IHFvc1R5cGU7CisgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2luZGV4XS52YXAgPSAodThfdClhcElkOworICAgICAgICAgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpbmRleF0uc3RhVHlwZSA9IHR5cGU7CisgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2luZGV4XS5xb3NJbmZvID0gcW9zSW5mbzsKKworICAgICAgICAgICAgICAgIGlmICh3ZC0+ZnJlcXVlbmN5IDwgMzAwMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIEluaXQgMTFiL2cgKi8KKyAgICAgICAgICAgICAgICAgICAgemZSYXRlQ3RybEluaXRDZWxsKGRldiwgJndkLT5hcC5zdGFUYWJsZVtpbmRleF0ucmNDZWxsLCB0eXBlLCAxLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogSW5pdCAxMWEgKi8KKyAgICAgICAgICAgICAgICAgICAgemZSYXRlQ3RybEluaXRDZWxsKGRldiwgJndkLT5hcC5zdGFUYWJsZVtpbmRleF0ucmNDZWxsLCB0eXBlLCAwLCAxKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAod2QtPnpmY2JBcENvbm5lY3ROb3RpZnkgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT56ZmNiQXBDb25uZWN0Tm90aWZ5KGRldiwgKHU4X3QqKWFkZHIsIGFwSWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbmRleCA9IDB4ZmZmZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzIsICJOb3QgZm91bmQiKTsKKyAgICAgICAgaWYgKChzdGF0ZSA9PSBaTV9TVEFURV9BVVRIKSB8fCAoc3RhdGUgPT0gWk1fU1RBVEVfUFJFQVVUSCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEdldCBhIG5ldyBTVEEgYW5kIHVwZGF0ZSBzdGF0ZSAqLworICAgICAgICAgICAgaW5kZXggPSB6ZkFwR2V0TmV3U3RhKGRldik7CisgICAgICAgICAgICB6bV9tc2cyX21tKFpNX0xWXzEsICJuZXcgU1RBIGluZGV4PSIsIGluZGV4KTsKKworICAgICAgICAgICAgaWYgKGluZGV4ICE9IDB4ZmZmZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTwzOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaW5kZXhdLmFkZHJbaV0gPSBhZGRyW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaW5kZXhdLnN0YXRlID0gc3RhdGU7CisgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2luZGV4XS52YWxpZCA9IDE7CisgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2luZGV4XS50aW1lID0gd2QtPnRpY2s7CisgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2luZGV4XS52YXAgPSAodThfdClhcElkOworICAgICAgICAgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpbmRleF0uZW5jcnlNb2RlID0gWk1fTk9fV0VQOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybiBpbmRleDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBcEFnaW5nU3RhICAgICAgICAgICAgICAgICovCisvKiAgICAgIEFnaW5nIFNUQSBpbiBzdGF0aW9uIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG51bWJlciBvZiAxMWIgU1RBIGluIFNUQSB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEwICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmQXBBZ2luZ1N0YSh6ZGV2X3QqIGRldikKK3sKKyAgICB1MTZfdCBpOworICAgIHUzMl90IGRlbHRhTXM7CisgICAgdTE2X3QgYWRkclszXTsKKyAgICB1MTZfdCB0eEZsYWc7CisgICAgdTE2X3QgcHNTdGFDb3VudCA9IDA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgd2QtPmFwLmdTdGFBc3NvY2lhdGVkID0gd2QtPmFwLmJTdGFBc3NvY2lhdGVkID0gMDsKKworICAgIGZvciAoaT0wOyBpPFpNX01BWF9TVEFfU1VQUE9SVDsgaSsrKQorICAgIHsKKyAgICAgICAgdHhGbGFnID0gMDsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgaWYgKHdkLT5hcC5zdGFUYWJsZVtpXS52YWxpZCA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICBhZGRyWzBdID0gd2QtPmFwLnN0YVRhYmxlW2ldLmFkZHJbMF07CisgICAgICAgICAgICBhZGRyWzFdID0gd2QtPmFwLnN0YVRhYmxlW2ldLmFkZHJbMV07CisgICAgICAgICAgICBhZGRyWzJdID0gd2QtPmFwLnN0YVRhYmxlW2ldLmFkZHJbMl07CisgICAgICAgICAgICAvKiBtaWxsaXNlY29uZCAqLworICAgICAgICAgICAgZGVsdGFNcyA9ICh1MzJfdCkoKHUzMl90KXdkLT50aWNrLSh1MzJfdCl3ZC0+YXAuc3RhVGFibGVbaV0udGltZSkKKyAgICAgICAgICAgICAgICAgICAgICAqIFpNX01TX1BFUl9USUNLOworCisgICAgICAgICAgICAvKiBwcmVhdXRoICovCisgICAgICAgICAgICBpZiAoKHdkLT5hcC5zdGFUYWJsZVtpXS5zdGF0ZSA9PSBaTV9TVEFURV9QUkVBVVRIKQorICAgICAgICAgICAgICAgICAgICAmJiAoZGVsdGFNcyA+IFpNX1BSRUFVVEhfVElNRU9VVF9NUykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogQWdpbmcgU1RBICovCisgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2ldLnZhbGlkID0gMDsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuYXV0aFNoYXJpbmcgPSAwOworICAgICAgICAgICAgICAgIHR4RmxhZyA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGF1dGggKi8KKyAgICAgICAgICAgIGlmICgod2QtPmFwLnN0YVRhYmxlW2ldLnN0YXRlID09IFpNX1NUQVRFX0FVVEgpCisgICAgICAgICAgICAgICAgICAgICYmIChkZWx0YU1zID4gWk1fQVVUSF9USU1FT1VUX01TKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBBZ2luZyBTVEEgKi8KKyAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaV0udmFsaWQgPSAwOworICAgICAgICAgICAgICAgIHR4RmxhZyA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGFzb2MgKi8KKyAgICAgICAgICAgIGlmICh3ZC0+YXAuc3RhVGFibGVbaV0uc3RhdGUgPT0gWk1fU1RBVEVfQVNPQykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAod2QtPmFwLnN0YVRhYmxlW2ldLnBzTW9kZSAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHNTdGFDb3VudCsrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChkZWx0YU1zID4gKCh1MzJfdCl3ZC0+YXAuc3RhQWdpbmdUaW1lU2VjPDwxMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBBZ2luZyBTVEEgKi8KKyAgICAgICAgICAgICAgICAgICAgem1fbXNnMV9tbShaTV9MVl8wLCAiQWdlIFNUQSBpbmRleD0iLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2ldLnZhbGlkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgdHhGbGFnID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVsdGFNcyA+ICgodTMyX3Qpd2QtPmFwLnN0YVByb2JpbmdUaW1lU2VjPDwxMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAod2QtPmFwLnN0YVRhYmxlW2ldLnBzTW9kZSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcm9iaW5nIG5vbi1QUyBTVEEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMCwgIlByb2JpbmcgU1RBIGluZGV4PSIsIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2ldLnRpbWUgKz0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdkLT5hcC5zdGFQcm9iaW5nVGltZVNlYyAqIFpNX1RJQ0tfUEVSX1NFQ09ORCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0eEZsYWcgPSAyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIGlmICh0eEZsYWcgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogU2VuZCBkZWF1dGhlbnRpY2F0aW9uIG1hbmFnZW1lbnQgZnJhbWUgKi8KKyAgICAgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfREVBVVRILCBhZGRyLCA0LCAwLCAwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0eEZsYWcgPT0gMikKKyAgICAgICAgeworICAgICAgICAgICAgemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fREFUQV9GUkFNRSwgYWRkciwgMCwgMCwgMCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHdkLT5hcC5zdGFQb3dlclNhdmluZyA9IHBzU3RhQ291bnQ7CisKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgemZBcFByb3RjdGlvbk1vbml0b3IoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogMTFiIFNUQSBhc3NvY2lhdGVkID0+IG5vbkVycCwgUHJvdGVjdCAqLworICAgIGlmICh3ZC0+YXAuYlN0YUFzc29jaWF0ZWQgPiAwKQorICAgIHsKKyAgICAgICAgLyogRW5hYmxlIE5vbkVycCBiaXQgaW4gaW5mb3JtYXRpb24gZWxlbWVudCAqLworICAgICAgICB3ZC0+ZXJwRWxlbWVudCA9IFpNX1dMQU5fTk9OX0VSUF9QUkVTRU5UX0JJVAorICAgICAgICAgICAgICAgICAgICAgICAgIHwgWk1fV0xBTl9VU0VfUFJPVEVDVElPTl9CSVQ7CisKKyAgICAgICAgLyogRW5hYmxlIHByb3RlY3Rpb24gbW9kZSAqLworICAgICAgICB6ZkFwU2V0UHJvdGVjdGlvbk1vZGUoZGV2LCAxKTsKKworICAgIH0KKyAgICAvKiAxMWIgU1RBIG5vdCBhc3NvY2lhdGVkLCBwcm90ZWN0aW9uIE9CU1MgcHJlc2VudCA9PiBQcm90ZWN0ICovCisgICAgZWxzZSBpZiAod2QtPmFwLnByb3RlY3RlZE9ic3MgPiAyKSAvL1RocmVzaG9sZAorICAgIHsKKyAgICAgICAgaWYgKHdkLT5kaXNhYmxlU2VsZkN0cyA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBEaXNhYmxlIE5vbkVycCBiaXQgaW4gaW5mb3JtYXRpb24gZWxlbWVudCAqLworICAgICAgICAgICAgd2QtPmVycEVsZW1lbnQgPSBaTV9XTEFOX1VTRV9QUk9URUNUSU9OX0JJVDsKKworICAgICAgICAgICAgLyogRW5hYmxlIHByb3RlY3Rpb24gbW9kZSAqLworICAgICAgICAgICAgemZBcFNldFByb3RlY3Rpb25Nb2RlKGRldiwgMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSBOb25FcnAgYml0IGluIGluZm9ybWF0aW9uIGVsZW1lbnQgKi8KKyAgICAgICAgd2QtPmVycEVsZW1lbnQgPSAwOworCisgICAgICAgIC8qIERpc2FibGUgcHJvdGVjdGlvbiBtb2RlICovCisgICAgICAgIHpmQXBTZXRQcm90ZWN0aW9uTW9kZShkZXYsIDApOworICAgIH0KKyAgICB3ZC0+YXAucHJvdGVjdGVkT2JzcyA9IDA7Cit9CisKKwordm9pZCB6ZkFwUHJvY2Vzc0JlYWNvbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdTE2X3Qgb2Zmc2V0OworICAgIHU4X3QgY2g7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9tc2cwX21tKFpNX0xWXzMsICJSeCBiZWFjb24iKTsKKworICAgIC8qIHVwZGF0ZSBOb24tRVJQIGZsYWcod2QtPmFwLm5vbkVycE9ic3MpICovCisgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9FUlApKSA9PSAweGZmZmYpCisgICAgeworICAgICAgICAvKiAxMWIgT0JTUyAqLworICAgICAgICB3ZC0+YXAucHJvdGVjdGVkT2JzcysrOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY2ggPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMik7CisgICAgaWYgKChjaCAmIFpNX1dMQU5fVVNFX1BST1RFQ1RJT05fQklUKSA9PSBaTV9XTEFOX1VTRV9QUk9URUNUSU9OX0JJVCkKKyAgICB7CisgICAgICAgIC8qIFByb3RlY3RlZCBPQlNTICovCisgICAgICAgIHdkLT5hcC5wcm90ZWN0ZWRPYnNzID0gMTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmUHJvY2Vzc0F1dGggICAgICAgICAgICAgICAqLworLyogICAgICBQcm9jZXNzIGF1dGhlbnRpY2F0ZSBtYW5hZ2VtZW50IGZyYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYXV0aCBmcmFtZSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE5vdGUgOiBBUCBhbGxvd3Mgb25lIGF1dGhlbnRpY2F0aW5nIFNUQSBhdCBhIHRpbWUsIGRvZXMgbm90ICAgICAgICAgICovCisvKiAgICAgICAgc3VwcG9ydCBtdWx0aXBsZSBhdXRoZW50aWNhdGlvbiBwcm9jZXNzLiBNYWtlIHN1cmUgICAgICAgICAgICAqLworLyogICAgICAgIGF1dGhlbnRpY2F0aW9uIHN0YXRlIG1hY2hpbmUgd2lsbCBub3QgYmUgYmxvY2tlZCBkdWUgICAgICAgICAgKi8KKy8qICAgICAgICB0byBpbmNvbXBsZXRlZCBhdXRoZW50aWNhdGlvbiBoYW5kc2hha2UuICAgICAgICAgICAgICAgICAgICAgICovCit2b2lkIHpmQXBQcm9jZXNzQXV0aCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90KiBzcmMsIHUxNl90IGFwSWQpCit7CisgICAgdTE2X3QgYWxnbywgc2VxLCBzdGF0dXM7CisgICAgdThfdCBhdXRoU2hhcmluZzsKKyAgICB1MTZfdCByZXQ7CisgICAgdTE2X3QgaTsKKyAgICB1OF90IGNoYWxsZW5nZVBhc3NlZCA9IDA7CisgICAgdThfdCBmcmFtZUN0cmw7CisgICAgdTMyX3QgcmV0QWxnb1NlcTsKKyAgICB1MzJfdCByZXRTdGF0dXM7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKworICAgIGZyYW1lQ3RybCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDEpOworICAgIC8qIEFQIDogQXV0aCBzaGFyZSAzICovCisgICAgLyogc2hpZnQgZm9yIFdFUCBJViAqLworICAgIGlmICgoZnJhbWVDdHJsICYgMHg0MCkgIT0gMCkKKyAgICB7CisgICAgICAgIGFsZ28gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAyOCk7CisgICAgICAgIHNlcSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDMwKTsKKyAgICAgICAgc3RhdHVzID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMzIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhbGdvID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMjQpOworICAgICAgICBzZXEgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAyNik7CisgICAgICAgIHN0YXR1cyA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDI4KTsKKyAgICB9CisKKyAgICB6bV9tc2cyX21tKFpNX0xWXzAsICJSeCBBdXRoLCBzZXE9Iiwgc2VxKTsKKworICAgIC8qIFNldCBkZWZhdWx0IHRvIGF1dGhlbnRpY2F0aW9uIGFsZ29yaXRobSBub3Qgc3VwcG9ydCAqLworICAgIHJldEFsZ29TZXEgPSAweDIwMDAwIHwgYWxnbzsKKyAgICByZXRTdGF0dXMgPSAxMzsgLyogYXV0aGVudGljYXRpb24gYWxnb3JpdGhtIG5vdCBzdXBwb3J0ICovCisKKyAgICAvKiBBUCA6IEF1dGggb3BlbiAxICovCisgICAgaWYgKGFsZ28gPT0gMCkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+YXAuYXV0aEFsZ29bYXBJZF0gPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0QWxnb1NlcSA9IDB4MjAwMDA7CisgICAgICAgICAgICBpZiAoc2VxID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogQVAgOiB1cGRhdGUgU1RBIHRvIGF1dGggKi8KKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9IHpmQXBBZGRTdGEoZGV2LCBzcmMsIFpNX1NUQVRFX0FVVEgsIGFwSWQsIDAsIDAsIDApKSAhPSAweGZmZmYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBBUCA6IGNhbGwgemZ3QXV0aE5vdGlmeSgpIGZvciBob3N0IHRvIGp1ZGdlICovCisgICAgICAgICAgICAgICAgICAgIC8vemZ3QXV0aE5vdGlmeShkZXYsIHNyYyk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogQVAgOiByZXNwb25zZSBBdXRoIHNlcT0yLCBzdWNjZXNzICovCisgICAgICAgICAgICAgICAgICAgIHJldFN0YXR1cyA9IDA7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogQVAgOiByZXNwb25zZSBBdXRoIHNlcT0yLCB1bnNwZWNpZmljIGVycm9yICovCisgICAgICAgICAgICAgICAgICAgIHJldFN0YXR1cyA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEFQIDogcmVzcG9uc2UgQXV0aCBzZXE9Miwgc2VxdWVuY2UgbnVtYmVyIG91dCBvZiBleHBlY3RlZCAqLworICAgICAgICAgICAgICAgIHJldFN0YXR1cyA9IDE0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8qIEFQIDogQXV0aCBzaGFyZSAxICovCisgICAgZWxzZSBpZiAoYWxnbyA9PSAxKQorICAgIHsKKyAgICAgICAgaWYgKHdkLT5hcC5hdXRoQWxnb1thcElkXSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc2VxID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0QWxnb1NlcSA9IDB4MjAwMDE7CisKKyAgICAgICAgICAgICAgICAvKiBjcml0aWNhbCBzZWN0aW9uICovCisgICAgICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICBpZiAod2QtPmFwLmF1dGhTaGFyaW5nID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhdXRoU2hhcmluZyA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF1dGhTaGFyaW5nID0gMDsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLmF1dGhTaGFyaW5nID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogZW5kIG9mIGNyaXRpY2FsIHNlY3Rpb24gKi8KKyAgICAgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgICAgICAgICAgaWYgKGF1dGhTaGFyaW5nID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBBUCA6IHJlc3BvbnNlIEF1dGggc2VxPTIsIHN0YXR1cyA9IGZhaWwgKi8KKyAgICAgICAgICAgICAgICAgICAgcmV0U3RhdHVzID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogQVAgOiB1cGRhdGUgU1RBIHRvIHByZWF1dGggKi8KKyAgICAgICAgICAgICAgICAgICAgemZBcEFkZFN0YShkZXYsIHNyYywgWk1fU1RBVEVfUFJFQVVUSCwgYXBJZCwgMCwgMCwgMCk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogQVAgOiBjYWxsIHpmd0F1dGhOb3RpZnkoKSBmb3IgaG9zdCB0byBqdWRnZSAqLworICAgICAgICAgICAgICAgICAgICAvL3pmd0F1dGhOb3RpZnkoZGV2LCBzcmMpOworCisgICAgICAgICAgICAgICAgICAgIC8qIEFQIDogcmVzcG9uc2UgQXV0aCBzZXE9MiAqLworICAgICAgICAgICAgICAgICAgICByZXRTdGF0dXMgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHNlcSA9PSAzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldEFsZ29TZXEgPSAweDQwMDAxOworCisgICAgICAgICAgICAgICAgaWYgKHdkLT5hcC5hdXRoU2hhcmluZyA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgY2hhbGxlbmdlIHRleHQgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHptd19idWZfcmVhZGgoZGV2LCBidWYsIDMwKzQpID09IDB4ODAxMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8MTI4OyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5hcC5jaGFsbGVuZ2VUZXh0W2ldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gem13X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMzIraSs0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09IDEyOCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFsbGVuZ2VQYXNzZWQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoYWxsZW5nZVBhc3NlZCA9PSAxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBBUCA6IHVwZGF0ZSBTVEEgdG8gYXV0aCAqLworICAgICAgICAgICAgICAgICAgICAgICAgemZBcEFkZFN0YShkZXYsIHNyYywgWk1fU1RBVEVfQVVUSCwgYXBJZCwgMCwgMCwgMCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFQIDogcmVzcG9uc2UgQXV0aCBzZXE9MiAqLworICAgICAgICAgICAgICAgICAgICAgICAgcmV0U3RhdHVzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFQIDogcmVzcG9uc2UgQXV0aCBzZXE9MiwgY2hhbGxlbmdlIGZhaWx1cmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldFN0YXR1cyA9IDE1OworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPIDogZGVsZXRlIFNUQSAqLworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLmF1dGhTaGFyaW5nID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0QWxnb1NlcSA9IDB4NDAwMDE7CisgICAgICAgICAgICAgICAgcmV0U3RhdHVzID0gMTQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB6ZlNlbmRNbUZyYW1lKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX0FVVEgsIHNyYywgcmV0QWxnb1NlcSwKKyAgICAgICAgICAgIHJldFN0YXR1cywgYXBJZCk7CisgICAgcmV0dXJuOworfQorCit2b2lkIHpmQXBQcm9jZXNzQXNvY1JlcSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90KiBzcmMsIHUxNl90IGFwSWQpCit7CisgICAgdTE2X3QgYWlkID0gMHhmZmZmOworICAgIHU4X3QgZnJhbWVUeXBlOworICAgIHUxNl90IG9mZnNldDsKKyAgICB1OF90IHN0YVR5cGUgPSAwOworICAgIHU4X3QgcW9zVHlwZSA9IDA7CisgICAgdThfdCBxb3NJbmZvID0gMDsKKyAgICB1OF90IHRtcDsKKyAgICB1MTZfdCBpLCBqLCBrOworICAgIHUxNl90IGVuY01vZGUgPSAwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIC8qIEFQIDogY2hlY2sgU1NJRCAqLworICAgIGlmICgob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfU1NJRCkpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgIGsgPSAwOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2QtPmFwLnZhcE51bWJlcjsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHRtcCA9IHptd19idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICE9IHdkLT5hcC5zc2lkTGVuW2pdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGsrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoayA9PSB3ZC0+YXAudmFwTnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIHpsRGVhdXRoOworICAgICAgICB9CisKKyAgICAgICAgayA9IDA7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCB3ZC0+YXAudmFwTnVtYmVyOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaT0wOyBpPHdkLT5hcC5zc2lkTGVuW2pdOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0bXAgPSB6bXdfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMitpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICE9IHdkLT5hcC5zc2lkW2pdW2ldKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGkgPT0gd2QtPmFwLnNzaWRMZW5bal0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBJZCA9IGo7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChrID09IHdkLT5hcC52YXBOdW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gemxEZWF1dGg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBUT0RPIDogY2hlY2sgY2FwYWJpbGl0eSAqLworCisgICAgLyogQVAgOiBjaGVjayBzdXBwb3J0IHJhdGUgKi8KKyAgICBpZiAoKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUpKSAhPSAweGZmZmYpCisgICAgeworICAgICAgICAvKiAxMWcgU1RBICovCisgICAgICAgIHN0YVR5cGUgPSAxOworICAgIH0KKyAgICAvL0NXWWFuZygrKQorICAgIGlmICgob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfSFRfQ0FQQUJJTElUWSkpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgIC8qIDExbiBTVEEgKi8KKyAgICAgICAgc3RhVHlwZSA9IDI7CisgICAgfQorCisgICAgLyogVE9ETyA6IGRvIG5vdCBhbGxvdyAxMWIgU1RBIHRvIGFzc29jaWF0ZWQgaW4gUHVyZSBHIG1vZGUgKi8KKyAgICBpZiAod2QtPmFwLndsYW5UeXBlW2FwSWRdID09IFpNX1dMQU5fVFlQRV9QVVJFX0cgJiYgc3RhVHlwZSA9PSAwKQorICAgIHsKKyAgICAgICAgemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9ERUFVVEgsIHNyYywgMywgMCwgMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBJbiBwdXJlIEIgbW9kZSwgd2Ugc2V0IEcgU1RBIGludG8gQiBtb2RlICovCisgICAgaWYgKHdkLT5hcC53bGFuVHlwZVthcElkXSA9PSBaTV9XTEFOX1RZUEVfUFVSRV9CICYmIHN0YVR5cGUgPT0gMSkKKyAgICB7CisgICAgICAgIHN0YVR5cGUgPSAwOworICAgIH0KKworICAgIC8qIEFQIDogY2hlY2sgMTFpIGFuZCBXUEEgKi8KKyAgICAvKiBBUCA6IGNoZWNrIDExaCAqLworCisgICAgLyogQVAgOiBjaGVjayBXTUUgKi8KKyAgICBpZiAoKG9mZnNldCA9IHpmRmluZFdpZmlFbGVtZW50KGRldiwgYnVmLCAyLCAwKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgLyogV01FIFNUQSAqLworICAgICAgICBxb3NUeXBlID0gMTsKKyAgICAgICAgem1fbXNnMF9tbShaTV9MVl8wLCAiV01FIFNUQSIpOworCisgICAgICAgIGlmICh3ZC0+YXAudWFwc2RFbmFibGVkICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHFvc0luZm8gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAod2QtPmFwLndwYVN1cHBvcnRbYXBJZF0gPT0gMSkKKyAgICB7CisgICAgICAgIGlmICggKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX1dQQV9JRSkpICE9IDB4ZmZmZiApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGdldCBXUEEgSUUgKi8KKyAgICAgICAgICAgIHU4X3QgbGVuZ3RoID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpOworICAgICAgICAgICAgaWYgKGxlbmd0aCsyIDwgWk1fTUFYX1dQQUlFX1NJWkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZDb3B5RnJvbVJ4QnVmZmVyKGRldiwgYnVmLCB3ZC0+YXAuc3Rhd3BhSWVbYXBJZF0sIG9mZnNldCwgbGVuZ3RoKzIpOworICAgICAgICAgICAgICAgIHdkLT5hcC5zdGF3cGFMZW5bYXBJZF0gPSBsZW5ndGgrMjsKKyAgICAgICAgICAgICAgICBlbmNNb2RlID0gMTsKKworCisgICAgICAgICAgICAgICAgem1fbXNnMV9tbShaTV9MVl8wLCAiV1BBIE1vZGUgemZ3QXNvY05vdGlmeSwgYXBJZD0iLCBhcElkKTsKKworICAgICAgICAgICAgICAgIC8qIEFQIDogQ2FsbCB6ZndBc29jTm90aWZ5KCkgKi8KKyAgICAgICAgICAgICAgICBpZiAod2QtPnpmY2JBc29jTm90aWZ5ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+emZjYkFzb2NOb3RpZnkoZGV2LCBzcmMsIHdkLT5hcC5zdGF3cGFJZVthcElkXSwgd2QtPmFwLnN0YXdwYUxlblthcElkXSwgYXBJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gemxEZWF1dGg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9SU05fSUUpKSAhPSAweGZmZmYgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBnZXQgUlNOIElFICovCisgICAgICAgICAgICB1OF90IGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKyAgICAgICAgICAgIGlmIChsZW5ndGgrMiA8IFpNX01BWF9XUEFJRV9TSVpFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmQ29weUZyb21SeEJ1ZmZlcihkZXYsIGJ1Ziwgd2QtPmFwLnN0YXdwYUllW2FwSWRdLCBvZmZzZXQsIGxlbmd0aCsyKTsKKyAgICAgICAgICAgICAgICB3ZC0+YXAuc3Rhd3BhTGVuW2FwSWRdID0gbGVuZ3RoKzI7CisgICAgICAgICAgICAgICAgZW5jTW9kZSA9IDE7CisKKyAgICAgICAgICAgICAgICB6bV9tc2cxX21tKFpNX0xWXzAsICJSU04gTW9kZSB6ZndBc29jTm90aWZ5LCBhcElkPSIsIGFwSWQpOworCisgICAgICAgICAgICAgICAgLyogQVAgOiBDYWxsIHpmd0Fzb2NOb3RpZnkoKSAqLworICAgICAgICAgICAgICAgIGlmICh3ZC0+emZjYkFzb2NOb3RpZnkgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT56ZmNiQXNvY05vdGlmeShkZXYsIHNyYywgd2QtPmFwLnN0YXdwYUllW2FwSWRdLCB3ZC0+YXAuc3Rhd3BhTGVuW2FwSWRdLCBhcElkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byB6bERlYXV0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgICAgIGVsc2UgaWYgKCAob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfQ0VOQ19JRSkpICE9IDB4ZmZmZiApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGdldCBDRU5DIElFICovCisgICAgICAgICAgICB1OF90IGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKworICAgICAgICAgICAgaWYgKGxlbmd0aCsyIDwgWk1fTUFYX1dQQUlFX1NJWkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZDb3B5RnJvbVJ4QnVmZmVyKGRldiwgYnVmLCB3ZC0+YXAuc3Rhd3BhSWVbYXBJZF0sIG9mZnNldCwgbGVuZ3RoKzIpOworICAgICAgICAgICAgICAgIHdkLT5hcC5zdGF3cGFMZW5bYXBJZF0gPSBsZW5ndGgrMjsKKyAgICAgICAgICAgICAgICBlbmNNb2RlID0gMTsKKworICAgICAgICAgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMCwgIkNFTkMgTW9kZSB6ZndBc29jTm90aWZ5LCBhcElkPSIsIGFwSWQpOworCisgICAgICAgICAgICAgICAgLyogQVAgOiBDYWxsIHpmd0Fzb2NOb3RpZnkoKSAqLworICAgICAgICAgICAgICAgIGlmICh3ZC0+emZjYkNlbmNBc29jTm90aWZ5ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+emZjYkNlbmNBc29jTm90aWZ5KGRldiwgc3JjLCB3ZC0+YXAuc3Rhd3BhSWVbYXBJZF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnN0YXdwYUxlblthcElkXSwgYXBJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gemxEZWF1dGg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgICAgIGVsc2UKKyAgICAgICAgeyAgIC8qIGFwIGlzIGVuY3J5cHRpb24gYnV0IHN0YSBoYXMgbm8gd3BhL3JzbiBpZSAqLworICAgICAgICAgICAgemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9ERUFVVEgsIHNyYywgNiwgMCwgMCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgLyogc3RhIGhhcyB3cGEvcnNuIGllIGJ1dCBhcCBpcyBubyBlbmNyeXB0aW9uICovCisgICAgaWYgKCh3ZC0+YXAud3BhU3VwcG9ydFthcElkXSA9PSAwKSAmJiAoZW5jTW9kZSA9PSAxKSkKKyAgICB7CisgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfREVBVVRILCBzcmMsIDYsIDAsIDApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogQVAgOiB1cGRhdGUgU1RBIHRvIGFzb2MgKi8KKyAgICBhaWQgPSB6ZkFwQWRkU3RhKGRldiwgc3JjLCBaTV9TVEFURV9BU09DLCBhcElkLCBzdGFUeXBlLCBxb3NUeXBlLCBxb3NJbmZvKTsKKworICAgIHpmQXBTdG9yZUFzb2NSZXFJZShkZXYsIGJ1ZiwgYWlkKTsKKworemxEZWF1dGg6CisgICAgLyogQVAgOiBzZW5kIGFzb2MgcnNwMiAqLworICAgIGlmIChhaWQgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgZnJhbWVUeXBlID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCk7CisKKyAgICAgICAgaWYgKGZyYW1lVHlwZSA9PSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVNPQ1JFUSkKKyAgICAgICAgeworICAgICAgICAgICAgemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9BU09DUlNQLCBzcmMsIDAsIGFpZCsxLCBhcElkKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfUkVBU09DUlNQLCBzcmMsIDAsIGFpZCsxLCBhcElkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBUT0RPIDogc2VuZCBkZWF1dGhlbnRpY2F0aW9uICovCisgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfREVBVVRILCBzcmMsIDYsIDAsIDApOworICAgIH0KKworICAgIHJldHVybjsKK30KKwordm9pZCB6ZkFwU3RvcmVBc29jUmVxSWUoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBhaWQpCit7CisgICAgLy9zdHJ1Y3QgenNXbGFuQXNzb0ZyYW1lSGVhZGVyKiBwQXNzb0ZyYW1lOworICAgIC8vdThfdCAgcEJ1ZltzaXplb2Yoc3RydWN0IHpzV2xhbkFzc29GcmFtZUhlYWRlcildOworICAgIHUxNl90IG9mZnNldDsKKyAgICB1MzJfdCBpOworICAgIHUxNl90IGxlbmd0aDsKKyAgICB1OF90ICAqaHRjYXA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBmb3IgKGk9MDsgaTx3ZC0+c3RhLmFzb2NSc3BGcmFtZUJvZHlTaXplOyBpKyspCisgICAgeworICAgICAgICB3ZC0+c3RhLmFzb2NSc3BGcmFtZUJvZHlbaV0gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBpKzI0KTsKKyAgICB9CisgICAgLyogY2FwYWJpbGl0eTogMiBvY3RldHMgKi8KKyAgICBvZmZzZXQgPSAyNDsKKworICAgIC8qIExpc3RlbiBpbnRlcnZhbDogMiBvY3RldHMgKi8KKyAgICBvZmZzZXQgPSAyNjsKKworICAgIC8qIFNTSUQgKi8KKyAgICBvZmZzZXQgPSAyODsKKworICAgIC8qIHN1cHBvcnRlZCByYXRlcyAqLworICAgIGlmICgob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfU1VQUE9SVF9SQVRFKSkgPT0gMHhmZmZmKQorICAgICAgICByZXR1cm47CisgICAgbGVuZ3RoID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0ICsgMSk7CisKKyAgICAvKiBleHRlbmRlZCBzdXBwb3J0ZWQgcmF0ZXMgKi8KKyAgICBpZiAoKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUpKSA9PSAweGZmZmYpCisgICAgICAgIHJldHVybjsKKyAgICBsZW5ndGggPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQgKyAxKTsKKworICAgIC8qIHBvd2VyIGNhcGFiaWxpdHk6NCBvY3RldHMgKi8KKyAgICBvZmZzZXQgPSBvZmZzZXQgKyAyICsgbGVuZ3RoOworCisgICAgLyogc3VwcG9ydGVkIGNoYW5uZWxzOiA0IG9jdGV0cyAqLworICAgIG9mZnNldCA9IG9mZnNldCArIDIgKyA0OworCisgICAgLyogUlNOICovCisKKyAgICAvKiBRb1MgKi8KKworICAgIC8qIEhUIGNhcGFiaWxpdGllczogMjggb2N0ZXRzICovCisgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9IVF9DQVBBQklMSVRZKSkgIT0gMHhmZmZmKSB7CisgICAgICAgIC8qIGF0aGVyb3MgcHJlIG4gKi8KKyAgICAgICAgaHRjYXAgPSAodThfdCAqKSZ3ZC0+YXAuaWVbYWlkXS5IdENhcDsKKyAgICAgICAgaHRjYXBbMF0gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpOworICAgICAgICBodGNhcFsxXSA9IDI2OworICAgICAgICBmb3IgKGk9MTsgaTw9MjY7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaHRjYXBbaSsxXSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCArIGkpOworICAgICAgICAgICAgem1fZGVidWdfbXNnMigiQVNPQzogIEhUIENhcGFiaWxpdGllcywgaHRjYXA9IiwgaHRjYXBbaSsxXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbHNlIGlmICgob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9QUkVOMl9FSURfSFRDQVBBQklMSVRZKSkgIT0gMHhmZmZmKSB7CisgICAgICAgIC8qIHByZSBuIDIuMCBzdGFuZGFyZCAqLworICAgICAgICBodGNhcCA9ICh1OF90ICopJndkLT5hcC5pZVthaWRdLkh0Q2FwOworICAgICAgICBmb3IgKGk9MDsgaTwyODsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBodGNhcFtpXSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCArIGkpOworICAgICAgICAgICAgem1fZGVidWdfbXNnMigiQVNPQzogIEhUIENhcGFiaWxpdGllcywgaHRjYXA9IiwgaHRjYXBbaV0pOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBub3QgMTFuIEFQICovCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKworICAgIC8qIHN1cHBvcnRlZCByZWd1bGF0b3J5IGNsYXNzZXMgKi8KKyAgICBvZmZzZXQgPSBvZmZzZXQgKyBsZW5ndGg7CisgICAgLy9sZW5ndGggPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQgKyAxKTsKKyAgICB7CisgICAgdThfdCAqaHRjYXA7CisgICAgaHRjYXAgPSAodThfdCAqKSZ3ZC0+c3RhLmllLkh0SW5mbzsKKyAgICAvL3ptX2RlYnVnX21zZzIoIkFTT0M6ICBIVCBDYXBhYmlsaXRpZXMgaW5mbz0iLCAoKHUxNl90ICopaHRjYXApWzFdKTsKKyAgICAvL3ptX2RlYnVnX21zZzIoIkFTT0M6ICBBLU1QRFUgcGFyYW1ldGVycz0iLCBodGNhcFs0XSk7CisgICAgLy96bV9kZWJ1Z19tc2cyKCJBU09DOiAgU3VwcG9ydGVkIE1DUyBzZXQ9IiwgKCh1MzJfdCAqKWh0Y2FwKVsxXT4+OCk7CisgICAgfQorCit9CisKK3ZvaWQgemZBcFByb2Nlc3NBc29jUnNwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKworfQorCit2b2lkIHpmQXBQcm9jZXNzRGVhdXRoKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIHNyYywgdTE2X3QgYXBJZCkKK3sKKyAgICB1MTZfdCBhaWQ7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIC8qIEFQIDogaWYgU0E9YXNzb2NpYXRlZCBTVEEgdGhlbiBkZWF1dGhlbnRpY2F0ZSBTVEEgKi8KKyAgICBpZiAoKGFpZCA9IHpmQXBGaW5kU3RhKGRldiwgc3JjKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgLyogQ2xlYXIgU1RBIHRhYmxlICovCisgICAgICAgIHdkLT5hcC5zdGFUYWJsZVthaWRdLnZhbGlkID0gMDsKKyAgICAgICAgaWYgKHdkLT56ZmNiRGlzQXNvY05vdGlmeSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+emZjYkRpc0Fzb2NOb3RpZnkoZGV2LCAodThfdCopc3JjLCBhcElkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCit9CisKK3ZvaWQgemZBcFByb2Nlc3NEaXNhc29jKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIHNyYywgdTE2X3QgYXBJZCkKK3sKKyAgICB1MTZfdCBhaWQ7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIC8qIEFQIDogaWYgU0E9YXNzb2NpYXRlZCBTVEEgdGhlbiBkZWF1dGhlbnRpY2F0ZSBTVEEgKi8KKyAgICBpZiAoKGFpZCA9IHpmQXBGaW5kU3RhKGRldiwgc3JjKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgLyogQ2xlYXIgU1RBIHRhYmxlICovCisgICAgICAgIHdkLT5hcC5zdGFUYWJsZVthaWRdLnZhbGlkID0gMDsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgaWYgKHdkLT56ZmNiRGlzQXNvY05vdGlmeSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+emZjYkRpc0Fzb2NOb3RpZnkoZGV2LCAodThfdCopc3JjLCBhcElkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCit9CisKKwordm9pZCB6ZkFwUHJvY2Vzc1Byb2JlUnNwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBBZGRJbmZvKQoreworI2lmIDAKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJSeCBwcm9iZXJzcCIpOworCisgICAgLyogR2F0aGVyIHNjYW4gcmVzdWx0ICovCisKKyAgICAvL3ptX2RlYnVnX21zZzEoImJzc0xpc3QgQ291bnQgPSAiLCB3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQpOworICAgIC8qIHJldHVybiBpZiBub3QgaW4gc2Nhbm5pbmcgKi8KKyAgICBpZiAoKHdkLT5oZWFydEJlYXROb3RpZmljYXRpb24gJiBaTV9CU1NJRF9MSVNUX1NDQU4pCisgICAgICAgICAgICAhPSBaTV9CU1NJRF9MSVNUX1NDQU4pCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy9pZiAoIHdkLT5zdGEucFVwZGF0ZUJzc0xpc3QtPmJzc0NvdW50ID09IFpNX01BWF9CU1MgKQorICAgIGlmICggd2QtPnN0YS5ic3NMaXN0LmJzc0NvdW50ID09IFpNX01BWF9CU1MgKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHpmUHJvY2Vzc1Byb2JlUnNwKGRldiwgYnVmLCBBZGRJbmZvKTsKKworI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFwQWRkSWVTc2lkICAgICAgICAgICAgICAgKi8KKy8qICAgICAgQWRkIEFQIGluZm9ybWF0aW9uIGVsZW1lbnQgU1NJRCB0byBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGJ1ZmZlciB0byBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvZmZzZXQgOiBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCBmcm9tIHRoaXMgb2Zmc2V0ICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdmFwIDogdmlydHVhbCBBUCBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmZmVyIG9mZnNldCBhZnRlciBhZGRpbmcgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTEgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmQXBBZGRJZVNzaWQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHUxNl90IHZhcCkKK3sKKyAgICB1MTZfdCBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogRWxlbWVudCBJRCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgWk1fV0xBTl9FSURfU1NJRCk7CisKKyAgICAvKiBFbGVtZW50IExlbmd0aCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPmFwLnNzaWRMZW5bdmFwXSk7CisKKyAgICAvKiBJbmZvcm1hdGlvbiA6IFNTSUQgKi8KKyAgICBmb3IgKGk9MDsgaTx3ZC0+YXAuc3NpZExlblt2YXBdOyBpKyspCisgICAgeworICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5hcC5zc2lkW3ZhcF1baV0pOworICAgIH0KKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmQXBBZGRJZVRpbSAgICAgICAgICAgICAgICAqLworLyogICAgICBBZGQgQVAgaW5mb3JtYXRpb24gZWxlbWVudCBUSU0gdG8gYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHRvIGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLworLyogICAgICB2YXAgOiB2aXJ0dWFsIEFQIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWZmZXIgb2Zmc2V0IGFmdGVyIGFkZGluZyBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMSAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZBcEFkZEllVGltKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1MTZfdCB2YXApCit7CisgICAgdThfdCB1bmlCaXRNYXBbOV07CisgICAgdTE2X3QgaGlnaGVzdEJ5dGU7CisgICAgdTE2X3QgaTsKKyAgICB1MTZfdCBsZW5PZmZzZXQ7CisgICAgdTE2X3QgaWQ7CisgICAgdTE2X3QgZHN0WzNdOworICAgIHUxNl90IGFpZDsKKyAgICB1MTZfdCBiaXRQb3NpdGlvbjsKKyAgICB1MTZfdCBieXRlUG9zaXRpb247CisgICAgemJ1Zl90KiBwc0J1ZjsKKyAgICB6YnVmX3QqIHRtcEJ1ZkFycmF5W1pNX1VOSV9BUlJBWV9TSVpFXTsKKyAgICB1MTZfdCB0bXBCdWZBcnJheVNpemUgPSAwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8qIEVsZW1lbnQgSUQgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIFpNX1dMQU5fRUlEX1RJTSk7CisKKyAgICAvKiBvZmZzZXQgb2YgRWxlbWVudCBMZW5ndGggKi8KKyAgICBsZW5PZmZzZXQgPSBvZmZzZXQrKzsKKworICAgIC8qIEluZm9ybWF0aW9uIDogVElNICovCisgICAgLyogRFRJTSBjb3VudCAqLworICAgIC8qIFRPRE8gOiBEb2Vzbid0IHdvcmsgZm9yIFZpcnR1YWwgQVAncyBjYXNlICovCisgICAgd2QtPkN1cnJlbnREdGltQ291bnQrKzsKKyAgICBpZiAod2QtPkN1cnJlbnREdGltQ291bnQgPj0gd2QtPmR0aW0pCisgICAgeworICAgICAgICB3ZC0+Q3VycmVudER0aW1Db3VudCA9IDA7CisgICAgfQorICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPkN1cnJlbnREdGltQ291bnQpOworICAgIC8qIERUSU0gcGVyaW9kICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+ZHRpbSk7CisgICAgLyogYml0bWFwIG9mZnNldCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMCk7CisKKyAgICAvKiBVcGRhdGUgQkNNQyBiaXQgKi8KKyAgICBpZiAod2QtPkN1cnJlbnREdGltQ291bnQgPT0gMCkKKyAgICB7CisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHdkLT5hcC50aW1CY21jQml0W3ZhcF0gPSAod2QtPmFwLmJjbWNUYWlsW3ZhcF0hPXdkLT5hcC5iY21jSGVhZFt2YXBdKT8xOjA7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHdkLT5hcC50aW1CY21jQml0W3ZhcF0gPSAwOworICAgIH0KKworICAgIC8qIFVwZGF0ZSBVbmljYXN0IGJpdG1hcCAqLworICAgIC8qIHJlc2V0IGJpdCBtYXAgKi8KKyAgICBmb3IgKGk9MDsgaTw5OyBpKyspCisgICAgeworICAgICAgICB1bmlCaXRNYXBbaV0gPSAwOworICAgIH0KKyAgICBoaWdoZXN0Qnl0ZSA9IDA7CisjaWYgMQorCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlkID0gd2QtPmFwLnVuaUhlYWQ7CisgICAgd2hpbGUgKGlkICE9IHdkLT5hcC51bmlUYWlsKQorICAgIHsKKyAgICAgICAgcHNCdWYgPSB3ZC0+YXAudW5pQXJyYXlbaWRdOworCisgICAgICAgIC8qIFRPRE8gOiBBZ2luZyBQUyBmcmFtZSBhZnRlciBxdWV1aW5nIGZvciBtb3JlIHRoYW4gMTAgc2Vjb25kcyAqLworCisgICAgICAgIC8qIGdldCBkZXN0aW5hdGlvbiBTVEEncyBhaWQgKi8KKyAgICAgICAgZHN0WzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIHBzQnVmLCAwKTsKKyAgICAgICAgZHN0WzFdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIHBzQnVmLCAyKTsKKyAgICAgICAgZHN0WzJdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIHBzQnVmLCA0KTsKKyAgICAgICAgaWYgKChhaWQgPSB6ZkFwRmluZFN0YShkZXYsIGRzdCkpICE9IDB4ZmZmZikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdkLT5hcC5zdGFUYWJsZVthaWRdLnBzTW9kZSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX21zZzFfbW0oWk1fTFZfMCwgImFpZD0iLGFpZCk7CisgICAgICAgICAgICAgICAgYWlkKys7CisgICAgICAgICAgICAgICAgem1fYXNzZXJ0KGFpZDw9NjQpOworICAgICAgICAgICAgICAgIGJpdFBvc2l0aW9uID0gKDEgPDwgKGFpZCAmIDB4NykpOworICAgICAgICAgICAgICAgIGJ5dGVQb3NpdGlvbiA9IChhaWQgPj4gMyk7CisgICAgICAgICAgICAgICAgdW5pQml0TWFwW2J5dGVQb3NpdGlvbl0gfD0gYml0UG9zaXRpb247CisKKyAgICAgICAgICAgICAgICBpZiAoYnl0ZVBvc2l0aW9uPmhpZ2hlc3RCeXRlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaGlnaGVzdEJ5dGUgPSBieXRlUG9zaXRpb247CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlkID0gKGlkKzEpICYgKFpNX1VOSV9BUlJBWV9TSVpFLTEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIlNlbmQgUFMgZnJhbWUgd2hpY2ggU1RBIG5vIGxvbmdlciBpbiBQUyBtb2RlIik7CisgICAgICAgICAgICAgICAgLyogU2VuZCBQUyBmcmFtZSB3aGljaCBTVEEgbm8gbG9uZ2VyIGluIFBTIG1vZGUgKi8KKyAgICAgICAgICAgICAgICB6ZkFwUmVtb3ZlRnJvbVBzUXVldWUoZGV2LCBpZCwgZHN0KTsKKyAgICAgICAgICAgICAgICB0bXBCdWZBcnJheVt0bXBCdWZBcnJheVNpemUrK10gPSBwc0J1ZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIkZyZWUgZ2FyYmFnZSBQUyBmcmFtZSIpOworICAgICAgICAgICAgLyogRnJlZSBnYXJiYWdlIFBTIGZyYW1lICovCisgICAgICAgICAgICB6ZkFwUmVtb3ZlRnJvbVBzUXVldWUoZGV2LCBpZCwgZHN0KTsKKyAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBwc0J1ZiwgMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworI2VuZGlmCisKKyAgICB6ZlF1ZXVlR2VuZXJhdGVVYXBzZFRpbShkZXYsIHdkLT5hcC51YXBzZFEsIHVuaUJpdE1hcCwgJmhpZ2hlc3RCeXRlKTsKKworICAgIHptX21zZzFfbW0oWk1fTFZfMywgImJtPSIsdW5pQml0TWFwWzBdKTsKKyAgICB6bV9tc2cxX21tKFpNX0xWXzMsICJoaWdoZXN0Qnl0ZT0iLGhpZ2hlc3RCeXRlKTsKKyAgICB6bV9tc2cxX21tKFpNX0xWXzMsICJ0aW1CY21jQml0W109Iix3ZC0+YXAudGltQmNtY0JpdFt2YXBdKTsKKworICAgIC8qIGJpdG1hcCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bmlCaXRNYXBbMF0gfCB3ZC0+YXAudGltQmNtY0JpdFt2YXBdKTsKKyAgICBmb3IgKGk9MDsgaTxoaWdoZXN0Qnl0ZTsgaSsrKQorICAgIHsKKyAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB1bmlCaXRNYXBbaSsxXSk7CisgICAgfQorCisgICAgLyogRWxlbWVudCBMZW5ndGggKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1ZiwgbGVuT2Zmc2V0LCBoaWdoZXN0Qnl0ZSs0KTsKKworICAgIGZvciAoaT0wOyBpPHRtcEJ1ZkFycmF5U2l6ZTsgaSsrKQorICAgIHsKKyAgICAgICAgLyogUHV0IHRvIFZUWFFbYWNdICovCisgICAgICAgIHpmUHV0VnR4cShkZXYsIHRtcEJ1ZkFycmF5W2ldKTsKKyAgICB9CisgICAgLyogUHVzaCBWVFhRW2FjXSAqLworICAgIHpmUHVzaFZ0eHEoZGV2KTsKKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBcFJlbW92ZUZyb21Qc1F1ZXVlICAgICAgICovCisvKiAgICAgIFJlbW92ZSB6YnVmIGZyb20gUFMgcXVldWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBpZCA6IGluZGV4IGluIHBzIHF1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBtb3JlIGRhdGEgYml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNy4xICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordThfdCB6ZkFwUmVtb3ZlRnJvbVBzUXVldWUoemRldl90KiBkZXYsIHUxNl90IGlkLCB1MTZfdCogYWRkcikKK3sKKyAgICB1MTZfdCBkc3RbM107CisgICAgdTE2X3QgbmlkOworICAgIHU4X3QgbW9yZURhdGEgPSAwOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT5hcC51bmlUYWlsID0gKHdkLT5hcC51bmlUYWlsLTEpICYgKFpNX1VOSV9BUlJBWV9TSVpFLTEpOworICAgIHdoaWxlIChpZCAhPSB3ZC0+YXAudW5pVGFpbCkKKyAgICB7CisgICAgICAgIG5pZCA9IChpZCArIDEpICYgKFpNX1VOSV9BUlJBWV9TSVpFIC0gMSk7CisgICAgICAgIHdkLT5hcC51bmlBcnJheVtpZF0gPSB3ZC0+YXAudW5pQXJyYXlbbmlkXTsKKworICAgICAgICAvKiBTZWFyY2ggdW50aWwgdGFpbCB0byBjb25maWcgbW9yZSBkYXRhIGJpdCAqLworICAgICAgICBkc3RbMF0gPSB6bXdfYnVmX3JlYWRoKGRldiwgd2QtPmFwLnVuaUFycmF5W2lkXSwgMCk7CisgICAgICAgIGRzdFsxXSA9IHptd19idWZfcmVhZGgoZGV2LCB3ZC0+YXAudW5pQXJyYXlbaWRdLCAyKTsKKyAgICAgICAgZHN0WzJdID0gem13X2J1Zl9yZWFkaChkZXYsIHdkLT5hcC51bmlBcnJheVtpZF0sIDQpOworICAgICAgICBpZiAoKGFkZHJbMF0gPT0gZHN0WzBdKSAmJiAoYWRkclsxXSA9PSBkc3RbMV0pCisgICAgICAgICAgICAgICAgJiYgKGFkZHJbMl0gPT0gZHN0WzJdKSkKKyAgICAgICAgeworICAgICAgICAgICAgbW9yZURhdGEgPSAweDIwOworICAgICAgICB9CisKKyAgICAgICAgaWQgPSBuaWQ7CisgICAgfQorICAgIHJldHVybiBtb3JlRGF0YTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmQXBBZGRJZVdtZVBhcmEgICAgICAgICAgICAqLworLyogICAgICBBZGQgV01FIFBhcmFtZXRlciBFbGVtZW50IHRvIGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHRvIGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLworLyogICAgICB2YXAgOiB2aXJ0dWFsIEFQIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWZmZXIgb2Zmc2V0IGFmdGVyIGFkZGluZyBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNi4xICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZBcEFkZEllV21lUGFyYSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgdTE2X3QgdmFwKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIEVsZW1lbnQgSUQgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIFpNX1dMQU5fRUlEX1dJRklfSUUpOworCisgICAgLyogRWxlbWVudCBMZW5ndGggKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDI0KTsKKworICAgIC8qIE9VSSAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHgwMCk7CisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweDUwKTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4RjIpOworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHgwMik7CisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweDAxKTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4MDEpOworCisgICAgLyogUW9TIEluZm8gKi8KKyAgICBpZiAod2QtPmFwLnVhcHNkRW5hYmxlZCkKKyAgICB7CisgICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHg4MSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweDAxKTsKKyAgICB9CisKKyAgICAvKiBSZXNlcnZlZCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHgwMCk7CisKKyAgICAvKiBCZXN0IEVmZm9ydCBBQyBwYXJhbWV0ZXJzICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweDAzKTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4QTQpOworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHgwMCk7CisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweDAwKTsKKyAgICAvKiBCYWNrZnJvdW5kIEFDIHBhcmFtZXRlcnMgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4MjcpOworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHhBNCk7CisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweDAwKTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4MDApOworICAgIC8qIFZpZGVvIEFDIHBhcmFtZXRlcnMgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4NDIpOworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHg0Myk7CisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweDVFKTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4MDApOworICAgIC8qIFZvaWNlIEFDIHBhcmFtZXRlcnMgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4NjIpOworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHgzMik7CisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweDJGKTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4MDApOworCisgICAgcmV0dXJuIG9mZnNldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBcFNlbmRCZWFjb24gICAgICAgICAgICAgICovCisvKiAgICAgIFNuZWQgQVAgbW9kZSBiZWFjb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjExICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmQXBTZW5kQmVhY29uKHpkZXZfdCogZGV2KQoreworICAgIHpidWZfdCogYnVmOworICAgIHUxNl90IG9mZnNldDsKKyAgICB1MTZfdCB2YXA7CisgICAgdTE2X3Qgc2VxOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHdkLT5hcC5iZWFjb25Db3VudGVyKys7CisgICAgaWYgKHdkLT5hcC5iZWFjb25Db3VudGVyID49IHdkLT5hcC52YXBOdW1iZXIpCisgICAgeworICAgICAgICB3ZC0+YXAuYmVhY29uQ291bnRlciA9IDA7CisgICAgfQorICAgIHZhcCA9IHdkLT5hcC5iZWFjb25Db3VudGVyOworCisKKyAgICB6bV9tc2cxX21tKFpNX0xWXzIsICJTZW5kIGJlYWNvbiwgdmFwPSIsIHZhcCk7CisKKyAgICAvKiBUQkQgOiBNYXhpbXVtIHNpemUgb2YgYmVhY29uICovCisgICAgaWYgKChidWYgPSB6ZndCdWZBbGxvY2F0ZShkZXYsIDEwMjQpKSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgem1fbXNnMF9tbShaTV9MVl8wLCAiQWxsb2MgYmVhY29uIGJ1ZiBGYWlsISIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgb2Zmc2V0ID0gMDsKKworICAgIC8qIHdsYW4gaGVhZGVyICovCisgICAgLyogRnJhbWUgY29udHJvbCAqLworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIDB4MDA4MCk7CisgICAgb2Zmc2V0Kz0yOworICAgIC8qIER1cmF0aW9uICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgMHgwMDAwKTsKKyAgICBvZmZzZXQrPTI7CisgICAgLyogQWRkcmVzcyAxICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgMHhmZmZmKTsKKyAgICBvZmZzZXQrPTI7CisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgMHhmZmZmKTsKKyAgICBvZmZzZXQrPTI7CisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgMHhmZmZmKTsKKyAgICBvZmZzZXQrPTI7CisgICAgLyogQWRkcmVzcyAyICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPm1hY0FkZHJbMF0pOworICAgIG9mZnNldCs9MjsKKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCB3ZC0+bWFjQWRkclsxXSk7CisgICAgb2Zmc2V0Kz0yOworI2lmZGVmIFpNX1ZBUE1PREVfTVVMVElMRV9TU0lECisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPm1hY0FkZHJbMl0pOyAvL011bHRpcGxlIFNTSUQKKyNlbHNlCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgKHdkLT5tYWNBZGRyWzJdKyh2YXA8PDgpKSk7IC8vVkFQCisjZW5kaWYKKyAgICBvZmZzZXQrPTI7CisgICAgLyogQWRkcmVzcyAzICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPm1hY0FkZHJbMF0pOworICAgIG9mZnNldCs9MjsKKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCB3ZC0+bWFjQWRkclsxXSk7CisgICAgb2Zmc2V0Kz0yOworI2lmZGVmIFpNX1ZBUE1PREVfTVVMVElMRV9TU0lECisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPm1hY0FkZHJbMl0pOyAvL011bHRpcGxlIFNTSUQKKyNlbHNlCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgKHdkLT5tYWNBZGRyWzJdKyh2YXA8PDgpKSk7IC8vVkFQCisjZW5kaWYKKyAgICBvZmZzZXQrPTI7CisKKyAgICAvKiBTZXF1ZW5jZSBudW1iZXIgKi8KKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHNlcSA9ICgod2QtPm1tc2VxKyspPDw0KTsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHNlcSk7CisgICAgb2Zmc2V0Kz0yOworCisgICAgLyogMjQtMzEgVGltZSBTdGFtcCA6IGhhcmR3YXJlIHdpbGwgZmlsbCB0aGlzIGZpZWxkICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgMCk7CisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCsyLCAwKTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0KzQsIDApOworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQrNiwgMCk7CisgICAgb2Zmc2V0Kz04OworCisgICAgLyogQmVhY29uIEludGVydmFsICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPmJlYWNvbkludGVydmFsKTsKKyAgICBvZmZzZXQrPTI7CisKKyAgICAvKiBDYXBhYmlsaXR5ICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPmFwLmNhcGFiW3ZhcF0pOworICAgIG9mZnNldCs9MjsKKworICAgIC8qIFNTSUQgKi8KKyAgICBpZiAod2QtPmFwLmhpZGVTc2lkW3ZhcF0gPT0gMCkKKyAgICB7CisgICAgICAgIG9mZnNldCA9IHpmQXBBZGRJZVNzaWQoZGV2LCBidWYsIG9mZnNldCwgdmFwKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBaTV9XTEFOX0VJRF9TU0lEKTsKKyAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAwKTsKKworICAgIH0KKworICAgIC8qIFN1cHBvcnQgUmF0ZSAqLworICAgIGlmICggd2QtPmZyZXF1ZW5jeSA8IDMwMDAgKQorICAgIHsKKyAgICBvZmZzZXQgPSB6Zk1tQWRkSWVTdXBwb3J0UmF0ZShkZXYsIGJ1Ziwgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fRUlEX1NVUFBPUlRfUkFURSwgWk1fUkFURV9TRVRfQ0NLKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllU3VwcG9ydFJhdGUoZGV2LCBidWYsIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0VJRF9TVVBQT1JUX1JBVEUsIFpNX1JBVEVfU0VUX09GRE0pOworICAgIH0KKworICAgIC8qIERTIHBhcmFtZXRlciBzZXQgKi8KKyAgICBvZmZzZXQgPSB6Zk1tQWRkSWVEcyhkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgIC8qIFRJTSAqLworICAgIG9mZnNldCA9IHpmQXBBZGRJZVRpbShkZXYsIGJ1Ziwgb2Zmc2V0LCB2YXApOworCisgICAgLyogSWYgV0xBTiBUeXBlIGlzIG5vdCBQVVJFIEIgKi8KKyAgICBpZiAod2QtPmFwLndsYW5UeXBlW3ZhcF0gIT0gWk1fV0xBTl9UWVBFX1BVUkVfQikKKyAgICB7CisgICAgICAgIGlmICggd2QtPmZyZXF1ZW5jeSA8IDMwMDAgKQorICAgICAgICB7CisgICAgICAgIC8qIEVSUCBJbmZvcm1hdGlvbiAqLworICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSWVFcnAoZGV2LCBidWYsIG9mZnNldCk7CisKKyAgICAgICAgLyogRXh0ZW5kZWQgU3VwcG9ydGVkIFJhdGVzICovCisgICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUsIFpNX1JBVEVfU0VUX09GRE0pOworICAgIH0KKyAgICB9CisKKyAgICAvKiBUT0RPIDogY291bnRyeSBpbmZvcm1hdGlvbiAqLworICAgIC8qIFRPRE8gOiBSU04gKi8KKyAgICBpZiAod2QtPmFwLndwYVN1cHBvcnRbdmFwXSA9PSAxKQorICAgIHsKKyAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllV3BhKGRldiwgYnVmLCBvZmZzZXQsIHZhcCk7CisgICAgfQorCisgICAgLyogV01FIFBhcmFtZXRlcnMgKi8KKyAgICBpZiAod2QtPmFwLnFvc01vZGUgPT0gMSkKKyAgICB7CisgICAgICAgIG9mZnNldCA9IHpmQXBBZGRJZVdtZVBhcmEoZGV2LCBidWYsIG9mZnNldCwgdmFwKTsKKyAgICB9CisKKyAgICAvKiBIVCBDYXBhYmlsaXRpZXMgSW5mbyAqLworICAgIG9mZnNldCA9IHpmTW1BZGRIVENhcGFiaWxpdHkoZGV2LCBidWYsIG9mZnNldCk7CisKKyAgICAvKiBFeHRlbmRlZCBIVCBDYXBhYmlsaXRpZXMgSW5mbyAqLworICAgIG9mZnNldCA9IHpmTW1BZGRFeHRlbmRlZEhUQ2FwYWJpbGl0eShkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgIC8qIDEyMTIgOiB3cml0ZSB0byBiZWFjb24gZmlmbyAqLworICAgIC8qIDEyMjEgOiB3cml0ZSB0byBzaGFyZSBtZW1vcnkgKi8KKyAgICB6ZkhwU2VuZEJlYWNvbihkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgIC8qIEZyZWUgYmVhY29uIGJ1ZmZlciAqLworICAgIC8qIFRPRE86IEluIG9yZGVyIHRvIGZpdCB0aGUgbWFkd2lmaSBiZWFjb24gYXJjaGl0ZWN0dXJlLCB3ZSBuZWVkIHRvCisgICAgICAgZnJlZSBiZWFjb24gYnVmZmVyIGluIHRoZSBIQUwgbGF5ZXIuCisgICAgICovCisKKyAgICAvL3pmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkludHJhYnNzRm9yd2FyZCAgICAgICAgICAgKi8KKy8qICAgICAgQ2FsbGVkIHRvIHRyYW5zbWl0IGludHJhLUJTUyBmcmFtZSBmcm9tIHVwcGVyIGxheWVyLiAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGJ1ZmZlciBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB2YXAgOiB2aXJ0dWFsIEFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAxIDogdW5pY2FzdCBpbnRyYXMtQlNTIGZyYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMCA6IG90aGVyIGZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiAgICAgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTEgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmSW50cmFic3NGb3J3YXJkKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCBzcmNWYXApCit7CisgICAgdTE2X3QgZXJyOworICAgIHUxNl90IGFzb2NGbGFnID0gMDsKKyAgICB1MTZfdCBkc3RbM107CisgICAgdTE2X3QgYWlkOworICAgIHUxNl90IHN0YVN0YXRlOworICAgIHpidWZfdCogdHhCdWY7CisgICAgdTE2X3QgbGVuOworICAgIHUxNl90IGk7CisgICAgdTE2X3QgdGVtcDsKKyAgICB1MTZfdCByZXQ7CisgICAgdThfdCB2YXAgPSAwOworI2lmZGVmIFpNX0VOQUJMRV9OQVRJVkVfV0lGSQorICAgIGRzdFswXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EzX09GRlNFVCk7CisgICAgZHN0WzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VUKzIpOworICAgIGRzdFsyXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EzX09GRlNFVCs0KTsKKyNlbHNlCisgICAgZHN0WzBdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMCk7CisgICAgZHN0WzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMik7CisgICAgZHN0WzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNCk7CisjZW5kaWYgIC8vIFpNX0VOQUJMRV9OQVRJVkVfV0lGSQorCisgICAgLyogRG8gSW50cmEtQlNTIGZvcndhcmQoZGF0YSBjb3B5KSBpZiBuZWNlc3NhcnkqLworICAgIGlmICgoZHN0WzBdJjB4MSkgIT0gMHgxKQorICAgIHsKKyAgICAgICAgYWlkID0gemZBcEdldFNUQUluZm8oZGV2LCBkc3QsICZzdGFTdGF0ZSwgJnZhcCk7CisgICAgICAgIGlmICgoYWlkICE9IDB4ZmZmZikgJiYgKHN0YVN0YXRlID09IFpNX1NUQVRFX0FTT0MpICYmIChzcmNWYXAgPT0gdmFwKSkKKyAgICAgICAgeworICAgICAgICAgICAgYXNvY0ZsYWcgPSAxOworICAgICAgICAgICAgem1fbXNnMF9yeChaTV9MVl8yLCAiSW50cmEtQlNTIGZvcndhcmQgOiBhc29jIFNUQSIpOworICAgICAgICB9CisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdmFwID0gc3JjVmFwOworICAgICAgICB6bV9tc2cwX3J4KFpNX0xWXzIsICJJbnRyYS1CU1MgZm9yd2FyZCA6IEJDb3JNQyIpOworICAgIH0KKworICAgIC8qIGRlc3RpbmF0aW9uIGFkZHJlc3MgPSBhc3NvY2lhdGVkIFNUQSBvciBCQy9NQyAqLworICAgIGlmICgoYXNvY0ZsYWcgPT0gMSkgfHwgKChkc3RbMF0mMHgxKSA9PSAweDEpKQorICAgIHsKKyAgICAgICAgLyogQWxsb2NhdGUgZnJhbWUgKi8KKyAgICAgICAgaWYgKCh0eEJ1ZiA9IHpmd0J1ZkFsbG9jYXRlKGRldiwgWk1fUlhfRlJBTUVfU0laRSkpCisgICAgICAgICAgICAgICAgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgem1fbXNnMF9yeChaTV9MVl8xLCAiQWxsb2MgaW50cmEtYnNzIGJ1ZiBGYWlsISIpOworICAgICAgICAgICAgZ290byB6bEFsbG9jRXJyb3I7CisgICAgICAgIH0KKworICAgICAgICAvKiBDb3B5IGZyYW1lICovCisgICAgICAgIGxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworICAgICAgICBmb3IgKGk9MDsgaTxsZW47IGkrPTIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXAgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBpKTsKKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgdHhCdWYsIGksIHRlbXApOworICAgICAgICB9CisgICAgICAgIHpmd0J1ZlNldFNpemUoZGV2LCB0eEJ1ZiwgbGVuKTsKKworI2lmZGVmIFpNX0VOQUJMRV9OQVRJVkVfV0lGSQorICAgICAgICAvKiBUeC1BMiA9IFJ4LUExLCBUeC1BMyA9IFJ4LUEyLCBUeC1BMSA9IFJ4LUEzICovCisgICAgICAgIGZvciAoaT0wOyBpPDY7IGkrPTIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXAgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQraSk7CisgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIHR4QnVmLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQraSwgdGVtcCk7CisgICAgICAgICAgICB0ZW1wID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUK2kpOworICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCB0eEJ1ZiwgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VUK2ksIHRlbXApOworICAgICAgICAgICAgdGVtcCA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EzX09GRlNFVCtpKTsKKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgdHhCdWYsIFpNX1dMQU5fSEVBREVSX0ExX09GRlNFVCtpLCB0ZW1wKTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRpZgorCisgICAgICAgIC8qIFRyYW5zbWl0IGZyYW1lICovCisgICAgICAgIC8qIFJldHVybiBlcnJvciBpZiBwb3J0IGlzIGRpc2FibGVkICovCisgICAgICAgIGlmICgoZXJyID0gemZUeFBvcnRDb250cm9sKGRldiwgdHhCdWYsIHZhcCkpID09IFpNX1BPUlRfRElTQUJMRUQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVyciA9IFpNX0VSUl9UWF9QT1JUX0RJU0FCTEVEOworICAgICAgICAgICAgZ290byB6bFR4RXJyb3I7CisgICAgICAgIH0KKworI2lmIDEKKyAgICAgICAgLyogQVAgOiBCdWZmZXIgZnJhbWUgZm9yIHBvd2VyIHNhdmluZyBTVEEgKi8KKyAgICAgICAgaWYgKChyZXQgPSB6ZkFwQnVmZmVyUHNGcmFtZShkZXYsIHR4QnVmLCB2YXApKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBmb3J3YXJkIGZyYW1lIGlmIG5vdCBiZWVuIGJ1ZmZlcmVkICovCisgICAgICAgICAgICAjaWYgMQorICAgICAgICAgICAgLyogUHV0IHRvIFZUWFFbYWNdICovCisgICAgICAgICAgICByZXQgPSB6ZlB1dFZ0eHEoZGV2LCB0eEJ1Zik7CisgICAgICAgICAgICAvKiBQdXNoIFZUWFFbYWNdICovCisgICAgICAgICAgICB6ZlB1c2hWdHhxKGRldik7CisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgemZUeFNlbmRFdGgoZGV2LCB0eEJ1ZiwgdmFwLCBaTV9JTlRFUk5BTF9BTExPQ19CVUYsIDApOworICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorICAgIHJldHVybiBhc29jRmxhZzsKKworemxUeEVycm9yOgorICAgIHpmd0J1ZkZyZWUoZGV2LCB0eEJ1ZiwgMCk7Cit6bEFsbG9jRXJyb3I6CisgICAgcmV0dXJuIGFzb2NGbGFnOworfQorCitzdHJ1Y3QgenNNaWNWYXIqIHpmQXBHZXRSeE1pY0tleSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdThfdCBzYVs2XTsKKyAgICB1MTZfdCBpZCA9IDAsIG1hY0FkZHJbM107CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHNhLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQsIDYpOworCisgICAgbWFjQWRkclswXSA9IHNhWzBdICsgKHNhWzFdIDw8IDgpOworICAgIG1hY0FkZHJbMV0gPSBzYVsyXSArIChzYVszXSA8PCA4KTsKKyAgICBtYWNBZGRyWzJdID0gc2FbNF0gKyAoc2FbNV0gPDwgOCk7CisKKyAgICBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBtYWNBZGRyKSkgIT0gMHhmZmZmKQorICAgICAgICByZXR1cm4gKCZ3ZC0+YXAuc3RhVGFibGVbaWRdLnJ4TWljS2V5KTsKKworICAgIHJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgenNNaWNWYXIqIHpmQXBHZXRUeE1pY0tleSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QqIHFvc1R5cGUpCit7CisgICAgdThfdCBkYVs2XTsKKyAgICB1MTZfdCBpZCA9IDAsIG1hY0FkZHJbM107CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6ZkNvcHlGcm9tSW50VHhCdWZmZXIoZGV2LCBidWYsIGRhLCAwLCA2KTsKKworICAgIG1hY0FkZHJbMF0gPSBkYVswXSArIChkYVsxXSA8PCA4KTsKKyAgICBtYWNBZGRyWzFdID0gZGFbMl0gKyAoZGFbM10gPDwgOCk7CisgICAgbWFjQWRkclsyXSA9IGRhWzRdICsgKGRhWzVdIDw8IDgpOworCisgICAgaWYgKChtYWNBZGRyWzBdICYgMHgxKSkKKyAgICB7CisgICAgICAgIHJldHVybiAoJndkLT5hcC5iY01pY0tleVswXSk7CisgICAgfQorICAgIGVsc2UgaWYgKChpZCA9IHpmQXBGaW5kU3RhKGRldiwgbWFjQWRkcikpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgICpxb3NUeXBlID0gd2QtPmFwLnN0YVRhYmxlW2lkXS5xb3NUeXBlOworICAgICAgICByZXR1cm4gKCZ3ZC0+YXAuc3RhVGFibGVbaWRdLnR4TWljS2V5KTsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKwordTE2X3QgemZBcFVwZGF0ZVBzQml0KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCogdmFwLCB1OF90KiB1YXBzZFRyaWcpCit7CisgICAgdTE2X3Qgc3RhU3RhdGU7CisgICAgdTE2X3QgYWlkOworICAgIHUxNl90IHBzQml0OworICAgIHUxNl90IHNyY1szXTsKKyAgICB1MTZfdCBkc3RbMV07CisgICAgdTE2X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHNyY1swXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDEwKTsKKyAgICBzcmNbMV0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAxMik7CisgICAgc3JjWzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTQpOworCisgICAgaWYgKCh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAxKSAmIDB4MykgIT0gMykKKyAgICB7CisgICAgICAgIC8qIEFQICovCisgICAgICAgIGRzdFswXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDQpOworCisgICAgICAgIHBzQml0ID0gKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDEpICYgMHgxMCkgPj4gNDsKKyAgICAgICAgLyogR2V0IEFJRCBhbmQgdXBkYXRlIFNUQSBQUyBtb2RlICovCisgICAgICAgIGFpZCA9IHpmQXBHZXRTVEFJbmZvQW5kVXBkYXRlUHMoZGV2LCBzcmMsICZzdGFTdGF0ZSwgdmFwLCBwc0JpdCwgdWFwc2RUcmlnKTsKKworICAgICAgICAvKiBpZiBTVEEgbm90IGFzc29jaWF0ZWQsIHNlbmQgZGVhdXRoICovCisgICAgICAgIGlmICgoYWlkID09IDB4ZmZmZikgfHwgKHN0YVN0YXRlICE9IFpNX1NUQVRFX0FTT0MpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKGRzdFswXSYweDEpPT0wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfREVBVVRILCBzcmMsIDB4NywKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gWk1fRVJSX1NUQV9OT1RfQVNTT0NJQVRFRDsKKyAgICAgICAgfQorICAgIH0gLyogaWYgKCh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAxKSAmIDB4MykgIT0gMykgKi8KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBXRFMgKi8KKyAgICAgICAgZm9yIChpPTA7IGk8Wk1fTUFYX1dEU19TVVBQT1JUOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgod2QtPmFwLndkcy53ZHNCaXRtYXAgJiAoMTw8aSkpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChzcmNbMF0gPT0gd2QtPmFwLndkcy5tYWNBZGRyW2ldWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHNyY1sxXSA9PSB3ZC0+YXAud2RzLm1hY0FkZHJbaV1bMV0pCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoc3JjWzJdID09IHdkLT5hcC53ZHMubWFjQWRkcltpXVsyXSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqdmFwID0gMHgyMCArIGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gWk1fU1VDQ0VTUzsKK30KKwordm9pZCB6ZkFwUHJvY2Vzc1BzUG9sbCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdTE2X3Qgc3JjWzNdOworICAgIHUxNl90IGRzdFszXTsKKyAgICB6YnVmX3QqIHBzQnVmID0gTlVMTDsKKyAgICB1MTZfdCBpZDsKKyAgICB1OF90IG1vcmVEYXRhID0gMDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBzcmNbMF0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAxMCk7CisgICAgc3JjWzFdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTIpOworICAgIHNyY1syXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDE0KTsKKworICAgIC8qIEZpbmQgcHMgYnVmZmVyIGZvciBQc1BvbGwgKi8KKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIGlkID0gd2QtPmFwLnVuaUhlYWQ7CisgICAgd2hpbGUgKGlkICE9IHdkLT5hcC51bmlUYWlsKQorICAgIHsKKyAgICAgICAgcHNCdWYgPSB3ZC0+YXAudW5pQXJyYXlbaWRdOworCisgICAgICAgIGRzdFswXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBwc0J1ZiwgMCk7CisgICAgICAgIGRzdFsxXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBwc0J1ZiwgMik7CisgICAgICAgIGRzdFsyXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBwc0J1ZiwgNCk7CisKKyAgICAgICAgaWYgKChzcmNbMF0gPT0gZHN0WzBdKSAmJiAoc3JjWzFdID09IGRzdFsxXSkgJiYgKHNyY1syXSA9PSBkc3RbMl0pKQorICAgICAgICB7CisgICAgICAgICAgICBtb3JlRGF0YSA9IHpmQXBSZW1vdmVGcm9tUHNRdWV1ZShkZXYsIGlkLCBzcmMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwc0J1ZiA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWQgPSAoaWQgKyAxKSAmIChaTV9VTklfQVJSQVlfU0laRSAtIDEpOworICAgIH0KKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgLyogU2VuZCBwcyBidWZmZXIgKi8KKyAgICBpZiAocHNCdWYgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8qIFNlbmQgd2l0aCBtb3JlIGRhdGEgYml0ICovCisgICAgICAgIHpmVHhTZW5kRXRoKGRldiwgcHNCdWYsIDAsIFpNX0VYVEVSTkFMX0FMTE9DX0JVRiwgbW9yZURhdGEpOworICAgIH0KKworICAgIHJldHVybjsKK30KKwordm9pZCB6ZkFwU2V0UHJvdGVjdGlvbk1vZGUoemRldl90KiBkZXYsIHUxNl90IG1vZGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKG1vZGUgPT0gMCkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+YXAucHJvdGVjdGlvbk1vZGUgIT0gbW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogV3JpdGUgTUFDJlBIWSByZWdpc3RlcnMgdG8gZGlzYWJsZSBwcm90ZWN0aW9uICovCisKKyAgICAgICAgICAgIHdkLT5hcC5wcm90ZWN0aW9uTW9kZSA9IG1vZGU7CisgICAgICAgIH0KKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAod2QtPmFwLnByb3RlY3Rpb25Nb2RlICE9IG1vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFdyaXRlIE1BQyZQSFkgcmVnaXN0ZXJzIHRvIGVuYWJsZSBwcm90ZWN0aW9uICovCisKKyAgICAgICAgICAgIHdkLT5hcC5wcm90ZWN0aW9uTW9kZSA9IG1vZGU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFwU2VuZEZhaWx1cmUgICAgICAgICAgICAgKi8KKy8qICAgICAgU2VuZCBmYWlsdXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGFkZHIgOiByZWNlaXZlciBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjEgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmQXBTZW5kRmFpbHVyZSh6ZGV2X3QqIGRldiwgdThfdCogYWRkcikKK3sKKyAgICB1MTZfdCBpZDsKKyAgICB1MTZfdCBzdGFBZGRyWzNdOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgc3RhQWRkclswXSA9IGFkZHJbMF0gKyAoKCh1MTZfdClhZGRyWzFdKTw8OCk7CisgICAgc3RhQWRkclsxXSA9IGFkZHJbMl0gKyAoKCh1MTZfdClhZGRyWzNdKTw8OCk7CisgICAgc3RhQWRkclsyXSA9IGFkZHJbNF0gKyAoKCh1MTZfdClhZGRyWzVdKTw8OCk7CisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBzdGFBZGRyKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgLyogU2VuZCBmYWlsdHVyZSA6IEFkZCAzIG1pbnV0ZXMgdG8gaW5hY3RpdmUgdGltZSB0aGF0IHdpbGwgKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgIHdpbGwgbWFrZSBTVEEgYmVlbiBraWNrZWQgb3V0IHNvb24gKi8KKyAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS50aW1lIC09ICgzKlpNX1RJQ0tfUEVSX01JTlVURSk7CisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7Cit9CisKKwordm9pZCB6ZkFwUHJvY2Vzc0FjdGlvbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdThfdCBjYXRlZ29yeTsKKworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgY2F0ZWdvcnkgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAyNCk7CisKKyAgICBzd2l0Y2ggKGNhdGVnb3J5KQorICAgIHsKKyAgICBjYXNlIFpNX1dMQU5fQkxPQ0tfQUNLX0FDVElPTl9GUkFNRToKKyAgICAgICAgemZBZ2dCbG9ja0Fja0FjdGlvbkZyYW1lKGRldiwgYnVmKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NtbXN0YS5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NtbXN0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NWJhMTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY21tc3RhLmMKQEAgLTAsMCArMSw1NzgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImNwcmVjb21wLmgiCisjaW5jbHVkZSAicmF0ZWN0cmwuaCIKKyNpbmNsdWRlICIuLi9oYWwvaHByZWcuaCIKKworLyogVE9ETyA6IGNoYW5nZSBnbG9iYWwgdmFyaWFibGUgdG8gY29uc3RhbnQgKi8KK3U4X3QgICB6Z1dwYVJhZGl1c091aVtdID0geyAweDAwLCAweDUwLCAweGYyLCAweDAxIH07Cit1OF90ICAgemdXcGFBZXNPdWlbXSA9IHsgMHgwMCwgMHg1MCwgMHhmMiwgMHgwNCB9OwordThfdCAgIHpnV3BhMlJhZGl1c091aVtdID0geyAweDAwLCAweDBmLCAweGFjLCAweDAxIH07Cit1OF90ICAgemdXcGEyQWVzT3VpW10gPSB7IDB4MDAsIDB4MGYsIDB4YWMsIDB4MDQgfTsKKworY29uc3QgdTE2X3QgemNDd1RsYlsxNl0gPSB7ICAgMCwgICAgMSwgICAgMywgICAgNywgICAxNSwgICAzMSwgICA2MywgIDEyNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTUsICA1MTEsIDEwMjMsIDIwNDcsIDQwOTUsIDQwOTUsIDQwOTUsIDQwOTV9OworCit2b2lkIHpmU3RhU3RhcnRDb25uZWN0Q2IoemRldl90KiBkZXYpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZTdGFQdXRBcEludG9CbG9ja2luZ0xpc3QgICovCisvKiAgICAgIFB1dCBBUCBpbnRvIGJsb2NraW5nIEFQIGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBic3NpZCA6IEFQJ3MgQlNTSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgd2VpZ2h0IDogd2VpZ2h0IG9mIEFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDYuMTIgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZTdGFQdXRBcEludG9CbG9ja2luZ0xpc3QoemRldl90KiBkZXYsIHU4X3QqIGJzc2lkLCB1OF90IHdlaWdodCkKK3sKKyAgICB1MTZfdCBpLCBqOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgaWYgKHdlaWdodCA+IDApCisgICAgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAvKkZpbmQgc2FtZSBic3NpZCBlbnRyeSBmaXJzdCovCisgICAgICAgIGZvciAoaT0wOyBpPFpNX01BWF9CTE9DS0lOR19BUF9MSVNUX1NJWkU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChqPTA7IGo8NjsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHdkLT5zdGEuYmxvY2tpbmdBcExpc3RbaV0uYWRkcltqXSE9IGJzc2lkW2pdKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihqPT02KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qVGhpcyBic3NpZCBkb2Vzbid0IGhhdmUgb2xkIHJlY29yZC5GaW5kIGFuIGVtcHR5IGVudHJ5Ki8KKyAgICAgICAgaWYgKGkgPT0gWk1fTUFYX0JMT0NLSU5HX0FQX0xJU1RfU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpPTA7IGk8Wk1fTUFYX0JMT0NLSU5HX0FQX0xJU1RfU0laRTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLmJsb2NraW5nQXBMaXN0W2ldLndlaWdodCA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogSWYgdGhlIGxpc3QgaXMgZnVsbCwgcGljayBvbmUgZW50cnkgZm9yIHJlcGxhY2VtZW50ICovCisgICAgICAgIGlmIChpID09IFpNX01BWF9CTE9DS0lOR19BUF9MSVNUX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGkgPSBic3NpZFs1XSAmIChaTV9NQVhfQkxPQ0tJTkdfQVBfTElTVF9TSVpFLTEpOworICAgICAgICB9CisKKyAgICAgICAgLyogVXBkYXRlIEFQIGFkZHJlc3MgYW5kIHdlaWdodCAqLworICAgICAgICBmb3IgKGo9MDsgajw2OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5zdGEuYmxvY2tpbmdBcExpc3RbaV0uYWRkcltqXSA9IGJzc2lkW2pdOworICAgICAgICB9CisKKyAgICAgICAgd2QtPnN0YS5ibG9ja2luZ0FwTGlzdFtpXS53ZWlnaHQgPSB3ZWlnaHQ7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlN0YUlzQXBJbkJsb2NraW5nTGlzdCAgICAgKi8KKy8qICAgICAgSXMgQVAgaW4gYmxvY2tpbmcgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJzc2lkIDogQVAncyBCU1NJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFRSVUUgOiBBUCBpbiBibG9ja2luZyBsaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBGQUxTRSA6IEFQIG5vdCBpbiBibG9ja2luZyBsaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNi4xMiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZTdGFJc0FwSW5CbG9ja2luZ0xpc3QoemRldl90KiBkZXYsIHU4X3QqIGJzc2lkKQoreworICAgIHUxNl90IGksIGo7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIC8vem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8vem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBmb3IgKGk9MDsgaTxaTV9NQVhfQkxPQ0tJTkdfQVBfTElTVF9TSVpFOyBpKyspCisgICAgeworICAgICAgICBpZiAod2QtPnN0YS5ibG9ja2luZ0FwTGlzdFtpXS53ZWlnaHQgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChqPTA7IGo8NjsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLmJsb2NraW5nQXBMaXN0W2ldLmFkZHJbal0gIT0gYnNzaWRbal0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaiA9PSA2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvL3ptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgcmV0dXJuIEZBTFNFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlN0YVJlZnJlc2hCbG9ja0xpc3QgICAgICAgKi8KKy8qICAgICAgSXMgQVAgaW4gYmxvY2tpbmcgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGZsdXNoRmxhZyA6IGZsdXNoIHdob2xlIGJsb2NraW5nIGxpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA2LjEyICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmU3RhUmVmcmVzaEJsb2NrTGlzdCh6ZGV2X3QqIGRldiwgdTE2X3QgZmx1c2hGbGFnKQoreworICAgIHUxNl90IGk7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIGZvciAoaT0wOyBpPFpNX01BWF9CTE9DS0lOR19BUF9MSVNUX1NJWkU7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh3ZC0+c3RhLmJsb2NraW5nQXBMaXN0W2ldLndlaWdodCAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmx1c2hGbGFnICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5ibG9ja2luZ0FwTGlzdFtpXS53ZWlnaHQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuYmxvY2tpbmdBcExpc3RbaV0ud2VpZ2h0LS07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICByZXR1cm47Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmU3RhQ29ubmVjdEZhaWwgICAgICAgICAgICAqLworLyogICAgICBIYW5kbGUgQ29ubmVjdCBmYWlsdXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnNzaWQgOiBCU1NJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHJlYXNvbiA6IHJlYXNvbiBvZiBmYWlsdXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA2LjEyICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmU3RhQ29ubmVjdEZhaWwoemRldl90KiBkZXYsIHUxNl90IHJlYXNvbiwgdTE2X3QqIGJzc2lkLCB1OF90IHdlaWdodCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBDaGFuZ2UgaW50ZXJuYWwgc3RhdGUgKi8KKyAgICB6ZkNoYW5nZUFkYXB0ZXJTdGF0ZShkZXYsIFpNX1NUQV9TVEFURV9ESVNDT05ORUNUKTsKKworICAgIC8qIEltcHJvdmUgV0VQL1RLSVAgcGVyZm9ybWFjZSB3aXRoIEhUIEFQLCBkZXRhaWwgaW5mb3JtYXRpb24gcGxlYXNlIGxvb2sgYnVnIzMyNDk1ICovCisgICAgLy96ZkhwU2V0VFRTSUZTVGltZShkZXYsIDB4OCk7CisKKyAgICAvKiBOb3RpZnkgd3JhcHBlciBvZiBjb25uZWN0aW9uIHN0YXR1cyBjaGFuZ2VzICovCisgICAgaWYgKHdkLT56ZmNiQ29ubmVjdE5vdGlmeSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgd2QtPnpmY2JDb25uZWN0Tm90aWZ5KGRldiwgcmVhc29uLCBic3NpZCk7CisgICAgfQorCisgICAgLyogUHV0IEFQIGludG8gaW50ZXJuYWwgYmxvY2tpbmcgbGlzdCAqLworICAgIHpmU3RhUHV0QXBJbnRvQmxvY2tpbmdMaXN0KGRldiwgKHU4X3QgKilic3NpZCwgd2VpZ2h0KTsKKworICAgIC8qIElzc3VlIGFub3RoZXIgU0NBTiAqLworICAgIGlmICggd2QtPnN0YS5iQXV0b1JlY29ubmVjdCApCisgICAgeworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJTdGFydCBpbnRlcm5hbCBzY2FuLi4uIik7CisgICAgICAgIHpmU2Nhbk1nclNjYW5TdG9wKGRldiwgWk1fU0NBTl9NR1JfU0NBTl9JTlRFUk5BTCk7CisgICAgICAgIHpmU2Nhbk1nclNjYW5TdGFydChkZXYsIFpNX1NDQU5fTUdSX1NDQU5fSU5URVJOQUwpOworICAgIH0KK30KKwordThfdCB6ZmlXbGFuSUJTU0dldFBlZXJTdGF0aW9uc0NvdW50KHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHJldHVybiB3ZC0+c3RhLm9wcG9zaXRlQ291bnQ7Cit9CisKK3U4X3QgemZpV2xhbklCU1NJdGVyYXRlUGVlclN0YXRpb25zKHpkZXZfdCogZGV2LCB1OF90IG51bVRvSXRlcmF0ZSwgemZwSUJTU0l0ZXJhdGVQZWVyU3RhdGlvbkNiIGNhbGxiYWNrLCB2b2lkICpjdHgpCit7CisgICAgdThfdCBvcHBvc2l0ZUNvdW50OworICAgIHU4X3QgaTsKKyAgICB1OF90IGluZGV4ID0gMDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgb3Bwb3NpdGVDb3VudCA9IHdkLT5zdGEub3Bwb3NpdGVDb3VudDsKKyAgICBpZiAoIG9wcG9zaXRlQ291bnQgPiBudW1Ub0l0ZXJhdGUgKQorICAgIHsKKyAgICAgICAgb3Bwb3NpdGVDb3VudCA9IG51bVRvSXRlcmF0ZTsKKyAgICB9CisKKyAgICBmb3IoaT0wOyBpIDwgWk1fTUFYX09QUE9TSVRFX0NPVU5UOyBpKyspCisgICAgeworICAgICAgICBpZiAoIG9wcG9zaXRlQ291bnQgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS52YWxpZCA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBjYWxsYmFjayhkZXYsICZ3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXSwgY3R4LCBpbmRleCsrKTsKKyAgICAgICAgb3Bwb3NpdGVDb3VudC0tOworCisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybiBpbmRleDsKK30KKworCitzOF90IHpmU3RhRmluZEZyZWVPcHBvc2l0ZSh6ZGV2X3QqIGRldiwgdTE2X3QgKnNhLCBpbnQgKnBGb3VuZElkeCkKK3sKKyAgICBpbnQgb3Bwb3NpdGVDb3VudDsKKyAgICBpbnQgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIG9wcG9zaXRlQ291bnQgPSB3ZC0+c3RhLm9wcG9zaXRlQ291bnQ7CisKKyAgICBmb3IoaT0wOyBpIDwgWk1fTUFYX09QUE9TSVRFX0NPVU5UOyBpKyspCisgICAgeworICAgICAgICBpZiAoIG9wcG9zaXRlQ291bnQgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS52YWxpZCA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBvcHBvc2l0ZUNvdW50LS07CisgICAgICAgIGlmICggemZNZW1vcnlJc0VxdWFsKCh1OF90Kikgc2EsIHdkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLm1hY0FkZHIsIDYpICkKKyAgICAgICAgeworICAgICAgICAgICAgLy93ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5hbGl2ZUNvdW50ZXIrKzsKKyAgICAgICAgICAgIHdkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLmFsaXZlQ291bnRlciA9IFpNX0lCU1NfUEVFUl9BTElWRV9DT1VOVEVSOworCisgICAgICAgICAgICAvKiBpdCBpcyBhbHJlYWR5IHN0b3JlZCAqLworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDaGVjayBpZiB0aGVyZSdzIHN0aWxsIHNwYWNlIGZvciBuZXcgY29tZXIKKyAgICBpZiAoIHdkLT5zdGEub3Bwb3NpdGVDb3VudCA9PSBaTV9NQVhfT1BQT1NJVEVfQ09VTlQgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vIEZpbmQgYW4gdW51c2VkIHNsb3QgZm9yIG5ldyBwZWVyIHN0YXRpb24KKyAgICBmb3IoaT0wOyBpIDwgWk1fTUFYX09QUE9TSVRFX0NPVU5UOyBpKyspCisgICAgeworICAgICAgICBpZiAoIHdkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLnZhbGlkID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgICpwRm91bmRJZHggPSBpOworICAgIHJldHVybiAwOworfQorCitzOF90IHpmU3RhRmluZE9wcG9zaXRlQnlNQUNBZGRyKHpkZXZfdCogZGV2LCB1MTZfdCAqc2EsIHU4X3QgKnBGb3VuZElkeCkKK3sKKyAgICB1MzJfdCBvcHBvc2l0ZUNvdW50OworICAgIHUzMl90IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBvcHBvc2l0ZUNvdW50ID0gd2QtPnN0YS5vcHBvc2l0ZUNvdW50OworCisgICAgZm9yKGk9MDsgaSA8IFpNX01BWF9PUFBPU0lURV9DT1VOVDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKCBvcHBvc2l0ZUNvdW50ID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0udmFsaWQgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgb3Bwb3NpdGVDb3VudC0tOworICAgICAgICBpZiAoIHpmTWVtb3J5SXNFcXVhbCgodThfdCopIHNhLCB3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5tYWNBZGRyLCA2KSApCisgICAgICAgIHsKKyAgICAgICAgICAgICpwRm91bmRJZHggPSAodThfdClpOworCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgICpwRm91bmRJZHggPSAwOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCB6ZlN0YUluaXRDb21tb25PcHBvc2l0ZUluZm8oemRldl90KiBkZXYsIGludCBpKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIHNldCB0aGUgZGVmYXVsdCByYXRlIHRvIHRoZSBoaWdoZXN0IHJhdGUgKi8KKyAgICB3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS52YWxpZCA9IDE7CisgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0uYWxpdmVDb3VudGVyID0gWk1fSUJTU19QRUVSX0FMSVZFX0NPVU5URVI7CisgICAgd2QtPnN0YS5vcHBvc2l0ZUNvdW50Kys7CisKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgLyogU2V0IHBhcmFtZXRlcnMgZm9yIG5ldyBvcHBvc2l0ZSBwZWVyIHN0YXRpb24gISEhICovCisgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0uY2FtSWR4ID0gMHhmZjsgIC8vIE5vdCBzZXQga2V5IGluIHRoaXMgbG9jYXRpb24KKyAgICB3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5wa0luc3RhbGxlZCA9IDA7CisgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ud3BhU3RhdGUgPSBaTV9TVEFfV1BBX1NUQVRFX0lOSVQgOyAgLy8gTm8gZW5jcnlwdGlvbgorI2VuZGlmCit9CisKK2ludCB6ZlN0YVNldE9wcG9zaXRlSW5mb0Zyb21CU1NJbmZvKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNCc3NJbmZvKiBwQnNzSW5mbykKK3sKKyAgICBpbnQgaTsKKyAgICB1OF90KiAgZHN0OworICAgIHUxNl90ICBzYVszXTsKKyAgICBpbnQgcmVzOworICAgIHUzMl90IG9uZVR4U3RyZWFtQ2FwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgemZNZW1vcnlDb3B5KCh1OF90Kikgc2EsIHBCc3NJbmZvLT5tYWNhZGRyLCA2KTsKKworICAgIHJlcyA9IHpmU3RhRmluZEZyZWVPcHBvc2l0ZShkZXYsIHNhLCAmaSk7CisgICAgaWYgKCByZXMgIT0gMCApCisgICAgeworICAgICAgICBnb3RvIHpsUmV0dXJuOworICAgIH0KKworICAgIGRzdCA9IHdkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLm1hY0FkZHI7CisgICAgemZNZW1vcnlDb3B5KGRzdCwgKHU4X3QgKilzYSwgNik7CisKKyAgICBvbmVUeFN0cmVhbUNhcCA9ICh6ZkhwQ2FwYWJpbGl0eShkZXYpICYgWk1fSFBfQ0FQXzExTl9PTkVfVFhfU1RSRUFNKTsKKworICAgIGlmIChwQnNzSW5mby0+ZXh0U3VwcG9ydGVkUmF0ZXNbMV0gIT0gMCkKKyAgICB7CisgICAgICAgIC8qIFRPRE8gOiBIYW5kbGUgMTFuICovCisgICAgICAgIGlmIChwQnNzSW5mby0+ZnJlcXVlbmN5IDwgMzAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogMi40R0h6ICovCisgICAgICAgICAgICBpZiAocEJzc0luZm8tPkVuYWJsZUhUID09IDEpCisgICAgICAgICAgICAgICAgemZSYXRlQ3RybEluaXRDZWxsKGRldiwgJndkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLnJjQ2VsbCwgKG9uZVR4U3RyZWFtQ2FwIT0wKT8zOjIsIDEsIHBCc3NJbmZvLT5TRzQwKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsSW5pdENlbGwoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ucmNDZWxsLCAxLCAxLCBwQnNzSW5mby0+U0c0MCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiA1R0h6ICovCisgICAgICAgICAgICBpZiAocEJzc0luZm8tPkVuYWJsZUhUID09IDEpCisgICAgICAgICAgICAgICAgemZSYXRlQ3RybEluaXRDZWxsKGRldiwgJndkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLnJjQ2VsbCwgKG9uZVR4U3RyZWFtQ2FwIT0wKT8zOjIsIDAsIHBCc3NJbmZvLT5TRzQwKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsSW5pdENlbGwoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ucmNDZWxsLCAxLCAwLCBwQnNzSW5mby0+U0c0MCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogVE9ETyA6IEhhbmRsZSAxMW4gKi8KKyAgICAgICAgaWYgKHBCc3NJbmZvLT5mcmVxdWVuY3kgPCAzMDAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiAyLjRHSHogKi8KKyAgICAgICAgICAgIGlmIChwQnNzSW5mby0+RW5hYmxlSFQgPT0gMSkKKyAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsSW5pdENlbGwoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ucmNDZWxsLCAob25lVHhTdHJlYW1DYXAhPTApPzM6MiwgMSwgcEJzc0luZm8tPlNHNDApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHpmUmF0ZUN0cmxJbml0Q2VsbChkZXYsICZ3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5yY0NlbGwsIDAsIDEsIHBCc3NJbmZvLT5TRzQwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIDVHSHogKi8KKyAgICAgICAgICAgIGlmIChwQnNzSW5mby0+RW5hYmxlSFQgPT0gMSkKKyAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsSW5pdENlbGwoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ucmNDZWxsLCAob25lVHhTdHJlYW1DYXAhPTApPzM6MiwgMCwgcEJzc0luZm8tPlNHNDApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHpmUmF0ZUN0cmxJbml0Q2VsbChkZXYsICZ3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5yY0NlbGwsIDEsIDAsIHBCc3NJbmZvLT5TRzQwKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgemZTdGFJbml0Q29tbW9uT3Bwb3NpdGVJbmZvKGRldiwgaSk7Cit6bFJldHVybjoKKyAgICByZXR1cm4gMDsKK30KKworaW50IHpmU3RhU2V0T3Bwb3NpdGVJbmZvRnJvbVJ4QnVmKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICBpbnQgICBpOworICAgIHU4X3QqICBkc3Q7CisgICAgdTE2X3QgIHNhWzNdOworICAgIGludCByZXMgPSAwOworICAgIHUxNl90ICBvZmZzZXQ7CisgICAgdThfdCAgIGJTdXBwb3J0RXh0UmF0ZTsKKyAgICB1MzJfdCBydHNjdHNSYXRlID0gMHhmZmZmZmZmZjsgLyogQ1RTOk9GRE0gNk0sIFJUUzpPRkRNIDZNICovCisgICAgdTMyX3Qgb25lVHhTdHJlYW1DYXA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHNhWzBdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUKTsKKyAgICBzYVsxXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EyX09GRlNFVCsyKTsKKyAgICBzYVsyXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EyX09GRlNFVCs0KTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXMgPSB6ZlN0YUZpbmRGcmVlT3Bwb3NpdGUoZGV2LCBzYSwgJmkpOworICAgIGlmICggcmVzICE9IDAgKQorICAgIHsKKyAgICAgICAgZ290byB6bFJldHVybjsKKyAgICB9CisKKyAgICBkc3QgPSB3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5tYWNBZGRyOworICAgIHpmQ29weUZyb21SeEJ1ZmZlcihkZXYsIGJ1ZiwgZHN0LCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQsIDYpOworCisgICAgaWYgKCAod2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5IDwgMzAwMCkgJiYgISh3ZC0+c3VwcG9ydE1vZGUgJiAoWk1fV0lSRUxFU1NfTU9ERV8yNF81NHxaTV9XSVJFTEVTU19NT0RFXzI0X04pKSApCisgICAgeworICAgICAgICBiU3VwcG9ydEV4dFJhdGUgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGJTdXBwb3J0RXh0UmF0ZSA9IDE7CisgICAgfQorCisgICAgaWYgKCAoYlN1cHBvcnRFeHRSYXRlID09IDEpCisgICAgICAgICAmJiAod2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5IDwgMzAwMCkKKyAgICAgICAgICYmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTKQorICAgICAgICAgJiYgKHdkLT53ZmMuYklic3NHTW9kZSA9PSAwKSApCisgICAgeworICAgICAgICBiU3VwcG9ydEV4dFJhdGUgPSAwOworICAgIH0KKworICAgIHdkLT5zdGEuY29ubmVjdGlvbl8xMWIgPSAwOworICAgIG9uZVR4U3RyZWFtQ2FwID0gKHpmSHBDYXBhYmlsaXR5KGRldikgJiBaTV9IUF9DQVBfMTFOX09ORV9UWF9TVFJFQU0pOworCisgICAgaWYgKCAoKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUpKSAhPSAweGZmZmYpCisgICAgICAgICAmJiAoYlN1cHBvcnRFeHRSYXRlID09IDEpICkKKyAgICB7CisgICAgICAgIC8qIFRPRE8gOiBIYW5kbGUgMTFuICovCisgICAgICAgIGlmICh3ZC0+c3RhLmN1cnJlbnRGcmVxdWVuY3kgPCAzMDAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiAyLjRHSHogKi8KKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLkVuYWJsZUhUID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8xMW5nCisgICAgICAgICAgICAgICAgemZSYXRlQ3RybEluaXRDZWxsKGRldiwgJndkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLnJjQ2VsbCwgKG9uZVR4U3RyZWFtQ2FwIT0wKT8zOjIsIDEsIHdkLT5zdGEuU0c0MCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8xMWcKKyAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsSW5pdENlbGwoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ucmNDZWxsLCAxLCAxLCB3ZC0+c3RhLlNHNDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcnRzY3RzUmF0ZSA9IDB4MDAwMDFiYjsgLyogQ1RTOkNDSyAxTSwgUlRTOk9GRE0gNk0gKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIDVHSHogKi8KKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLkVuYWJsZUhUID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8xMW5hCisgICAgICAgICAgICAgICAgemZSYXRlQ3RybEluaXRDZWxsKGRldiwgJndkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLnJjQ2VsbCwgKG9uZVR4U3RyZWFtQ2FwIT0wKT8zOjIsIDAsIHdkLT5zdGEuU0c0MCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8xMWEKKyAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsSW5pdENlbGwoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ucmNDZWxsLCAxLCAwLCB3ZC0+c3RhLlNHNDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcnRzY3RzUmF0ZSA9IDB4MTBiMDFiYjsgLyogQ1RTOk9GRE0gNk0sIFJUUzpPRkRNIDZNICovCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogVE9ETyA6IEhhbmRsZSAxMW4gKi8KKyAgICAgICAgaWYgKHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeSA8IDMwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIDIuNEdIeiAqLworICAgICAgICAgICAgaWYgKHdkLT5zdGEuRW5hYmxlSFQgPT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLzExbmcKKyAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsSW5pdENlbGwoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ucmNDZWxsLCAob25lVHhTdHJlYW1DYXAhPTApPzM6MiwgMSwgd2QtPnN0YS5TRzQwKTsKKyAgICAgICAgICAgICAgICBydHNjdHNSYXRlID0gMHgwMDAwMWJiOyAvKiBDVFM6Q0NLIDFNLCBSVFM6T0ZETSA2TSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vMTFiCisgICAgICAgICAgICAgICAgemZSYXRlQ3RybEluaXRDZWxsKGRldiwgJndkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLnJjQ2VsbCwgMCwgMSwgd2QtPnN0YS5TRzQwKTsKKyAgICAgICAgICAgICAgICBydHNjdHNSYXRlID0gMHgwOyAvKiBDVFM6Q0NLIDFNLCBSVFM6Q0NLIDFNICovCisgICAgICAgICAgICAgICAgd2QtPnN0YS5jb25uZWN0aW9uXzExYiA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiA1R0h6ICovCisgICAgICAgICAgICBpZiAod2QtPnN0YS5FbmFibGVIVCA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vMTFuYQorICAgICAgICAgICAgICAgIHpmUmF0ZUN0cmxJbml0Q2VsbChkZXYsICZ3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5yY0NlbGwsIChvbmVUeFN0cmVhbUNhcCE9MCk/MzoyLCAwLCB3ZC0+c3RhLlNHNDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vMTFhCisgICAgICAgICAgICAgICAgemZSYXRlQ3RybEluaXRDZWxsKGRldiwgJndkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLnJjQ2VsbCwgMSwgMCwgd2QtPnN0YS5TRzQwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJ0c2N0c1JhdGUgPSAweDEwYjAxYmI7IC8qIENUUzpPRkRNIDZNLCBSVFM6T0ZETSA2TSAqLworICAgICAgICB9CisgICAgfQorCisgICAgemZTdGFJbml0Q29tbW9uT3Bwb3NpdGVJbmZvKGRldiwgaSk7CisKK3psUmV0dXJuOgorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAocnRzY3RzUmF0ZSAhPSAweGZmZmZmZmZmKQorICAgIHsKKyAgICAgICAgemZIcFNldFJUU0NUU1JhdGUoZGV2LCBydHNjdHNSYXRlKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKwordm9pZCB6ZlN0YVByb3RFcnBNb25pdG9yKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB1MTZfdCAgIG9mZnNldDsKKyAgICB1OF90ICAgIGVycDsKKyAgICB1OF90ICAgIGJzc2lkWzZdOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUpJiYoemZTdGFJc0Nvbm5lY3RlZChkZXYpKSApCisgICAgeworICAgICAgICBaTV9NQUNfV09SRF9UT19CWVRFKHdkLT5zdGEuYnNzaWQsIGJzc2lkKTsKKworICAgICAgICBpZiAoemZSeEJ1ZmZlckVxdWFsVG9TdHIoZGV2LCBidWYsIGJzc2lkLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQsIDYpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIChvZmZzZXQ9emZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfRVJQKSkgIT0gMHhmZmZmICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlcnAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMik7CisKKyAgICAgICAgICAgICAgICBpZiAoIGVycCAmIFpNX0JJVF8xICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMCgicHJvdGVjdGlvbiBtb2RlIG9uIik7CisgICAgICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLmJQcm90ZWN0aW9uTW9kZSA9PSBGQUxTRSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5iUHJvdGVjdGlvbk1vZGUgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgemZIcFNldFNsb3RUaW1lKGRldiwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cwKCJwcm90ZWN0aW9uIG1vZGUgb2ZmIik7CisgICAgICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLmJQcm90ZWN0aW9uTW9kZSA9PSBUUlVFKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLmJQcm90ZWN0aW9uTW9kZSA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgemZIcFNldFNsb3RUaW1lKGRldiwgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwkJLy9DaGVjayB0aGUgZXhpc3RlbmNlIG9mIE5vbi1OIEFQCisJCS8vRm9sbG93IHRoZSBjaGVjayB0aGUgInBCc3NJbmZvLT5FbmFibGVIVCIKKwkJCWlmICgob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfSFRfQ0FQQUJJTElUWSkpICE9IDB4ZmZmZikKKwkJCXt9CisJCQllbHNlIGlmICgob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9QUkVOMl9FSURfSFRDQVBBQklMSVRZKSkgIT0gMHhmZmZmKQorCQkJe30KKwkJCWVsc2UKKwkJCXt3ZC0+c3RhLk5vbk5BUGNvdW50Kys7fQorICAgIH0KK30KKwordm9pZCB6ZlN0YVVwZGF0ZVdtZVBhcmFtZXRlcih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdTE2X3QgICB0bXA7CisgICAgdTE2X3QgICBhaWZzWzVdOworICAgIHUxNl90ICAgY3dtaW5bNV07CisgICAgdTE2X3QgICBjd21heFs1XTsKKyAgICB1MTZfdCAgIHR4b3BbNV07CisgICAgdThfdCAgICBhY207CisgICAgdThfdCAgICBhYzsKKyAgICB1MTZfdCAgIGxlbjsKKyAgICB1MTZfdCAgIGk7CisgICAJdTE2X3QgICBvZmZzZXQ7CisgICAgdThfdCAgICByeFdtZVBhcmFtZXRlclNldENvdW50OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogVXBkYXRlIGlmIFdNRSBwYXJhbWV0ZXIgc2V0IGNvdW50IGlzIGNoYW5nZWQgKi8KKyAgICAvKiBJZiBjb25uZWN0IHRvIFdNRSBBUCAqLworICAgIGlmICh3ZC0+c3RhLndtZUNvbm5lY3RlZCAhPSAwKQorICAgIHsKKyAgICAgICAgLyogRmluZCBXTUUgcGFyYW1ldGVyIGVsZW1lbnQgKi8KKyAgICAgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRXaWZpRWxlbWVudChkZXYsIGJ1ZiwgMiwgMSkpICE9IDB4ZmZmZikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkpID49IDcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcnhXbWVQYXJhbWV0ZXJTZXRDb3VudD16bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOCk7CisgICAgICAgICAgICAgICAgaWYgKHJ4V21lUGFyYW1ldGVyU2V0Q291bnQgIT0gd2QtPnN0YS53bWVQYXJhbWV0ZXJTZXRDb3VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIndtZVBhcmFtZXRlclNldENvdW50IGNoYW5nZWQhIik7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEud21lUGFyYW1ldGVyU2V0Q291bnQgPSByeFdtZVBhcmFtZXRlclNldENvdW50OworICAgICAgICAgICAgICAgICAgICAvKiByZXRyaWV2ZSBXTUUgcGFyYW1ldGVyIGFuZCB1cGRhdGUgVHhRIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgICAgICAgICAgICAgYWNtID0gMHhmOworICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPj0gKDgrKGkqNCkrNCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wPXptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxMCtpKjQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjID0gKHRtcCA+PiA1KSAmIDB4MzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHRtcCAmIDB4MTApID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY20gJj0gKH4oMTw8YWMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlmc1thY10gPSAoKHRtcCAmIDB4ZikgKiA5KSArIDEwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcD16bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTEraSo0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb252ZXJ0IHRvIDJebiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN3bWluW2FjXSA9IHpjQ3dUbGJbKHRtcCAmIDB4ZildOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN3bWF4W2FjXSA9IHpjQ3dUbGJbKHRtcCA+PiA0KV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHhvcFthY109em13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCsxMitpKjQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKChhY20gJiAweDQpICE9IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN3bWluWzJdID0gY3dtaW5bMF07CisgICAgICAgICAgICAgICAgICAgICAgICBjd21heFsyXSA9IGN3bWF4WzBdOworICAgICAgICAgICAgICAgICAgICAgICAgYWlmc1syXSA9IGFpZnNbMF07CisgICAgICAgICAgICAgICAgICAgICAgICB0eG9wWzJdID0gdHhvcFswXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKGFjbSAmIDB4OCkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY3dtaW5bM10gPSBjd21pblsyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN3bWF4WzNdID0gY3dtYXhbMl07CisgICAgICAgICAgICAgICAgICAgICAgICBhaWZzWzNdID0gYWlmc1syXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR4b3BbM10gPSB0eG9wWzJdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGN3bWluWzRdID0gMzsKKyAgICAgICAgICAgICAgICAgICAgY3dtYXhbNF0gPSA3OworICAgICAgICAgICAgICAgICAgICBhaWZzWzRdID0gMjg7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjd21pblsyXSthaWZzWzJdKSA+ICgoY3dtaW5bMF0rYWlmc1swXSkrMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuYWMwUHJpb3JpdHlIaWdoZXJUaGFuQWMyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuYWMwUHJpb3JpdHlIaWdoZXJUaGFuQWMyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB6ZkhwVXBkYXRlUW9zUGFyYW1ldGVyKGRldiwgY3dtaW4sIGN3bWF4LCBhaWZzLCB0eG9wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IC8vaWYgKHdkLT5zdGEud21lQ29ubmVjdGVkICE9IDApCit9CisvKiBwcm9jZXNzIDgwMi4xMWggRHluYW1pYyBGcmVxdWVuY3kgU2VsZWN0aW9uICovCit2b2lkIHpmU3RhVXBkYXRlRG90MTFIREZTKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKgorICAgIENoYW5uZWwgU3dpdGNoIEFubm91bmNlbWVudCBFbGVtZW50IEZvcm1hdAorICAgICstLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfEZvcm1hdHxFbGVtZW50IElEfExlbmd0aHxDaGFubmVsIFN3aXRjaCBNb2RlfE5ldyBDaGFubmVsIE51bWJlcnxDaGFubmVsIFN3aXRjaCBDb3VudHwKKyAgICArLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHxCeXRlcyB8ICAgMSAgICAgIHwgIDEgICB8CSAgICAgMSAgICAgICAgICAgfCAgICAgICAxICAgICAgICAgIHwgICAgICAgICAgMSAgICAgICAgIHwKKyAgICArLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHxWYWx1ZSB8ICAgMzcgICAgIHwgIDMgICB8ICAgICAgIDAgb3IgMSAgICAgIHx1bnNpZ25lZCBpbnRlZ2VyICB8dW5zaWduZWQgaW50ZWdlciAgICB8CisgICAgKy0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAqLworICAgIC8vdThfdCAgICBsZW5ndGgsIGNoYW5uZWwsIGlzNUc7CisgICAgdTE2X3QgICBvZmZzZXQ7CisKKyAgICAvKiBnZXQgRUlEKENoYW5uZWwgU3dpdGNoIEFubm91bmNlbWVudCkgKi8KKyAgICBpZiAoIChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRSkpID09IDB4ZmZmZiApCisgICAgeworICAgICAgICAvL3ptX2RlYnVnX21zZzAoIkVJRChDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQpIG5vdCBmb3VuZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UgaWYgKCB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkgPT0gMHgzICkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIkVJRChDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQpIGZvdW5kIik7CisKKyAgICAgICAgLy9sZW5ndGggPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSk7CisgICAgICAgIC8vemZDb3B5RnJvbVJ4QnVmZmVyKGRldiwgYnVmLCBwQnNzSW5mby0+c3VwcG9ydGVkUmF0ZXMsIG9mZnNldCwgbGVuZ3RoKzIpOworCisgICAgICAgIC8vQ2hhbmVsbCBTd2l0Y2ggTW9kZSBzZXQgdG8gMSwgZHJpdmVyIHNob3VsZCBkaXNhYmxlIHRyYW5zbWl0IGltbWVkaWF0ZQorICAgICAgICAvL3dlIGRvIHRoaXMgYnkgcG9sbCBDQ0EgaGlnaAorICAgICAgICBpZiAoem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzIpID09IDB4MSApCisgICAgICAgIHsKKyAgICAgICAgCS8vdXNlIFpNX09JRF9JTlRFUk5BTF9XUklURSxaTV9DTURfUkVTRVQgdG8gbm90aWNlIGZpcm13YXJlIGZsdXNoIHF1ZW5lIGFuZCBzdG9wIGRtYSwKKyAgICAgICAgCS8vdGhlbiByZXN0YXJ0IHJ4IGRtYSBidXQgbm90IHR4IGRtYQorICAgICAgICAJaWYgKHdkLT5zdGEuREZTRGlzYWJsZVR4ICE9IFRSVUUpCisgICAgICAgIAl7CisgICAgICAgICAgICAgICAgLyogVE9ETyA6IHpmSHBSZXNldFR4Unggd291bGQgY2F1c2UgUnggaGFuZyAqLworICAgICAgICAgICAgICAgIC8vemZIcFJlc2V0VHhSeChkZXYpOworICAgICAgICAgICAgICAgIHdkLT5zdGEuREZTRGlzYWJsZVR4ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAvKiBUcmdnZXIgUnggRE1BICovCisgICAgICAgICAgICAgICAgemZIcFN0YXJ0UmVjdihkZXYpOworICAgICAgICAgICAgfQorICAgICAgICAJLy9BZGFwdGVyLT5aRDgwMjExSFNldHRpbmcuRGlzYWJsZVR4Qnk4MDIxMUg9VFJVRTsKKyAgICAgICAgCS8vQWNxdWlyZUN0ck9mUGh5UmVnKEFkYXB0ZXIpOworICAgICAgICAJLy9aRDEyMDVfV1JJVEVfUkVHSVNURVIoQWRhcHRlcixDUjI0LCAweDApOworICAgICAgICAJLy9SZWxlYXNlRG9Ob3RTbGVlcChBZGFwdGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNCkgPD0gMHgyICkKKyAgICAgICAgeworICAgICAgICAJLy9DaGFubmVsIFN3aXRjaAorICAgICAgICAJLy9pZiBDaGFubmVsIFN3aXRjaCBDb3VudCA9IDAgLCBTVEEgc2hvdWxkIGNoYW5nZSBjaGFubmVsIGltbWVkaWF0ZWx5LgorICAgICAgICAJLy9pZiBDaGFubmVsIFN3aXRjaCBDb3VudCA+IDAgLCBTVEEgc2hvdWxkIGNoYW5nZSBjaGFubmVsIGFmdGVyIFRCVFQqY291bnQKKyAgICAgICAgCS8vQnV0IGl0IHdvbid0IGJlIGFjY3VyYXRlIHRvIGxldCBkcml2ZXIgY2FsY3VsYXRlIFRCVFQqY291bnQsIGFuZCB0aGUgdmFsdWUgb2YKKyAgICAgICAgCS8vQ2hhbm5lbCBTd2l0Y2ggQ291bnQgd2lsbCBkZWNyZWFzZSBieSBvbmUgZWFjaCB3aGVuIGNvbnRpbnVlIHJlY2V2aW5nIGJlYWNvbgorICAgICAgICAJLy9TbyB3ZSBjaGFuZ2UgY2hhbm5lbCBoZXJlIHdoZW4gd2UgcmVjZWl2ZSBjb3VudCA8PTIuCisKKyAgICAgICAgICAgIHpmSHBEZWxldGVBbGxvd0NoYW5uZWwoZGV2LCB3ZC0+c3RhLmN1cnJlbnRGcmVxdWVuY3kpOworICAgICAgICAJd2QtPmZyZXF1ZW5jeSA9IHpmQ2hOdW1Ub0ZyZXEoZGV2LCB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMyksIDApOworICAgICAgICAJLy96ZkhwQWRkQWxsb3dDaGFubmVsKGRldiwgd2QtPmZyZXF1ZW5jeSk7CisgICAgICAgIAl6bV9kZWJ1Z19tc2cxKCJDV1kgLSBqdW1wIHRvIGZyZXF1ZW5jeSA9ICIsIHdkLT5mcmVxdWVuY3kpOworICAgICAgICAJemZDb3JlU2V0RnJlcXVlbmN5KGRldiwgd2QtPmZyZXF1ZW5jeSk7CisgICAgICAgIAl3ZC0+c3RhLkRGU0Rpc2FibGVUeCA9IEZBTFNFOworICAgICAgICAgICAgLyogSW5jcmVhc2UgcnhCZWFjb25Db3VudCB0byBwcmV2ZW50IGJlYWNvbiBsb3N0ICovCisgICAgICAgICAgICBpZiAoemZTdGFJc0Nvbm5lY3RlZChkZXYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEucnhCZWFjb25Db3VudCA9IDEgPDwgNjsgLy8gMiB0aW1lcyBvZiBjaGVjayB3b3VsZCBwYXNzCisgICAgICAgICAgICB9CisgICAgICAgIAkvL3N0YXJ0IHR4IGRtYSB0byB0cmFuc21pdCBwYWNrZXQKKworICAgICAgICAJLy9pZiAoem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzMpICE9IHdkLT5mcmVxdWVuY3kpCisgICAgICAgIAkvL3sKKyAgICAgICAgCS8vCS8vWkREYmdQcmludCgoIlJhZGFyIERldGVjdCBieSBBUFxuIikpOworICAgICAgICAJLy8JemZDb3JlU2V0RnJlcXVlbmN5KCk7CisgICAgICAgIAkvLwlQcm9jZXNzUmFkYXJEZXRlY3RFdmVudChBZGFwdGVyKTsKKyAgICAgICAgCS8vCVNldF9SRl9DaGFubmVsKEFkYXB0ZXIsIFN3UmZkLT5SZmQtPlJ4QnVmZmVyW2luZGV4KzNdLCAoVUNIQVIpQWRhcHRlci0+UkZfTW9kZSwgMSk7CisgICAgICAgIAkvLwlBZGFwdGVyLT5DYXJkU2V0dGluZy5DaGFubmVsID0gU3dSZmQtPlJmZC0+UnhCdWZmZXJbaW5kZXgrM107CisgICAgICAgIAkvLwlBZGFwdGVyLT5TYXZlQ2hhbm5lbCA9IEFkYXB0ZXItPkNhcmRTZXR0aW5nLkNoYW5uZWw7CisgICAgICAgIAkvLwlBZGFwdGVyLT5VdGlsaXR5Q2hhbm5lbCA9IEFkYXB0ZXItPkNhcmRTZXR0aW5nLkNoYW5uZWw7CisgICAgICAgIAkvL30KKyAgICAgICAgfQorICAgIH0KKworfQorLyogVE9ETyA6IHByb2Nlc3MgODAyLjExaCBUcmFuc21pc3Npb24gUG93ZXIgQ29udHJvbCAqLwordm9pZCB6ZlN0YVVwZGF0ZURvdDExSFRQQyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7Cit9CisKKy8qIElCU1MgcG93ZXItc2F2aW5nIG1vZGUgKi8KK3ZvaWQgemZTdGFJYnNzUFNDaGVja1N0YXRlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB1OF90ICAgaSwgZnJhbWVDdHJsOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCAhemZTdGFJc0Nvbm5lY3RlZChkZXYpICkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0lCU1MgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICAvKiBjaGVjayBCU1NJRCAqLworICAgIGlmICggIXpmUnhCdWZmZXJFcXVhbFRvU3RyKGRldiwgYnVmLCAodThfdCopIHdkLT5zdGEuYnNzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VULCA2KSApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZnJhbWVDdHJsID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMSk7CisKKyAgICAvKiBjaGVjayBwb3dlciBtYW5hZ2VtZW50IGJpdCAqLworICAgIGlmICggZnJhbWVDdHJsICYgWk1fQklUXzQgKQorICAgIHsKKyAgICAgICAgZm9yKGk9MTsgaTxaTV9NQVhfUFNfU1RBOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggIXdkLT5zdGEuc3RhUFNMaXN0LmVudGl0eVtpXS5iVXNlZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGNoZWNrIHNvdXJjZSBhZGRyZXNzICovCisgICAgICAgICAgICBpZiAoIHpmUnhCdWZmZXJFcXVhbFRvU3RyKGRldiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnN0YVBTTGlzdC5lbnRpdHlbaV0ubWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VULCA2KSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yKGk9MTsgaTxaTV9NQVhfUFNfU1RBOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggIXdkLT5zdGEuc3RhUFNMaXN0LmVudGl0eVtpXS5iVXNlZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5zdGFQU0xpc3QuZW50aXR5W2ldLmJVc2VkID0gVFJVRTsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLnN0YVBTTGlzdC5lbnRpdHlbaV0uYkRhdGFRdWV1ZWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggaSA9PSBaTV9NQVhfUFNfU1RBICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogU1RBIGxpc3QgaXMgZnVsbCAqLworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgemZDb3B5RnJvbVJ4QnVmZmVyKGRldiwgYnVmLCB3ZC0+c3RhLnN0YVBTTGlzdC5lbnRpdHlbaV0ubWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fSEVBREVSX0EyX09GRlNFVCwgNik7CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLnN0YVBTTGlzdC5jb3VudCA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZW5hYmxlIEFUSU0gd2luZG93CisgICAgICAgICAgICAvL3pmRW5hYmxlQXRpbVdpbmRvdyhkZXYpOworICAgICAgICB9CisKKyAgICAgICAgd2QtPnN0YS5zdGFQU0xpc3QuY291bnQrKzsKKyAgICB9CisgICAgZWxzZSBpZiAoIHdkLT5zdGEuc3RhUFNMaXN0LmNvdW50ICkKKyAgICB7CisgICAgICAgIGZvcihpPTE7IGk8Wk1fTUFYX1BTX1NUQTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHdkLT5zdGEuc3RhUFNMaXN0LmVudGl0eVtpXS5iVXNlZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCB6ZlJ4QnVmZmVyRXF1YWxUb1N0cihkZXYsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuc3RhUFNMaXN0LmVudGl0eVtpXS5tYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VULCA2KSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnN0YVBTTGlzdC5lbnRpdHlbaV0uYlVzZWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5zdGFQU0xpc3QuY291bnQtLTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIHdkLT5zdGEuc3RhUFNMaXN0LmVudGl0eVtpXS5iRGF0YVF1ZXVlZCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlbmQgcXVldWVkIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggd2QtPnN0YS5zdGFQU0xpc3QuY291bnQgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGRpc2FibGUgQVRJTSB3aW5kb3cgKi8KKyAgICAgICAgICAgIC8vemZEaXNhYmxlQXRpbVdpbmRvdyhkZXYpOworICAgICAgICB9CisKKyAgICB9Cit9CisKKy8qIElCU1MgcG93ZXItc2F2aW5nIG1vZGUgKi8KK3U4X3QgemZTdGFJYnNzUFNRdWV1ZURhdGEoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHU4X3QgICBpOworICAgIHUxNl90ICBkYVszXTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmICggIXpmU3RhSXNDb25uZWN0ZWQoZGV2KSApCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0lCU1MgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKCB3ZC0+c3RhLnN0YVBTTGlzdC5jb3VudCA9PSAwICYmIHdkLT5zdGEucG93ZXJTYXZlTW9kZSA8PSBaTV9TVEFfUFNfTk9ORSApCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBEQSAqLworI2lmZGVmIFpNX0VOQUJMRV9OQVRJVkVfV0lGSQorICAgIGRhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTFfT0ZGU0VUKTsKKyAgICBkYVsxXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0ExX09GRlNFVCArIDIpOworICAgIGRhWzJdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTFfT0ZGU0VUICsgNCk7CisjZWxzZQorICAgIGRhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMCk7CisgICAgZGFbMV0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAyKTsKKyAgICBkYVsyXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDQpOworI2VuZGlmCisKKyAgICBpZiAoIFpNX0lTX01VTFRJQ0FTVF9PUl9CUk9BRENBU1QoZGEpICkKKyAgICB7CisgICAgICAgIHdkLT5zdGEuc3RhUFNMaXN0LmVudGl0eVswXS5iRGF0YVF1ZXVlZCA9IFRSVUU7CisgICAgICAgIHdkLT5zdGEuaWJzc1BTRGF0YVF1ZXVlW3dkLT5zdGEuaWJzc1BTRGF0YUNvdW50KytdID0gYnVmOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvLyBVbmljYXN0IHBhY2tldC4uLgorCisgICAgZm9yKGk9MTsgaTxaTV9NQVhfUFNfU1RBOyBpKyspCisgICAgeworICAgICAgICBpZiAoIHpmTWVtb3J5SXNFcXVhbCh3ZC0+c3RhLnN0YVBTTGlzdC5lbnRpdHlbaV0ubWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHU4X3QqKSBkYSwgNikgKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLnN0YVBTTGlzdC5lbnRpdHlbaV0uYkRhdGFRdWV1ZWQgPSBUUlVFOworICAgICAgICAgICAgd2QtPnN0YS5pYnNzUFNEYXRhUXVldWVbd2QtPnN0YS5pYnNzUFNEYXRhQ291bnQrK10gPSBidWY7CisKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisjaWYgMAorICAgIGlmICggd2QtPnN0YS5wb3dlclNhdmVNb2RlID4gWk1fU1RBX1BTX05PTkUgKQorICAgIHsKKyAgICAgICAgd2QtPnN0YS5zdGFQU0RhdGFRdWV1ZVt3ZC0+c3RhLnN0YVBTRGF0YUNvdW50KytdID0gYnVmOworCisgICAgICAgIHJldHVybiAxOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIElCU1MgcG93ZXItc2F2aW5nIG1vZGUgKi8KK3ZvaWQgemZTdGFJYnNzUFNTZW5kKHpkZXZfdCogZGV2KQoreworICAgIHU4X3QgICBpOworICAgIHUxNl90ICBiY2FzdEFkZHJbM10gPSB7MHhmZmZmLCAweGZmZmYsIDB4ZmZmZn07CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoICF6ZlN0YUlzQ29ubmVjdGVkKGRldikgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0lCU1MgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICBmb3IoaT0wOyBpPFpNX01BWF9QU19TVEE7IGkrKykKKyAgICB7CisgICAgICAgIGlmICggd2QtPnN0YS5zdGFQU0xpc3QuZW50aXR5W2ldLmJEYXRhUXVldWVkICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBpID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfQVRJTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjYXN0QWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIHdkLT5zdGEuc3RhUFNMaXN0LmVudGl0eVtpXS5iVXNlZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gU2VuZCBBVElNIHRvIHByZXZlbnQgdGhlIHBlZXIgdG8gZ28gdG8gc2xlZXAKKyAgICAgICAgICAgICAgICB6ZlNlbmRNbUZyYW1lKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX0FUSU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTE2X3QqKSB3ZC0+c3RhLnN0YVBTTGlzdC5lbnRpdHlbaV0ubWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3ZC0+c3RhLnN0YVBTTGlzdC5lbnRpdHlbaV0uYkRhdGFRdWV1ZWQgPSBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvcihpPTA7IGk8d2QtPnN0YS5pYnNzUFNEYXRhQ291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIHpmVHhTZW5kRXRoKGRldiwgd2QtPnN0YS5pYnNzUFNEYXRhUXVldWVbaV0sIDAsCisgICAgICAgICAgICAgICAgICAgIFpNX0VYVEVSTkFMX0FMTE9DX0JVRiwgMCk7CisgICAgfQorCisgICAgd2QtPnN0YS5pYnNzUHJldlBTRGF0YUNvdW50ID0gd2QtPnN0YS5pYnNzUFNEYXRhQ291bnQ7CisgICAgd2QtPnN0YS5pYnNzUFNEYXRhQ291bnQgPSAwOworfQorCisKK3ZvaWQgemZTdGFSZWNvbm5lY3QoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICYmCisgICAgICAgICB3ZC0+d2xhbk1vZGUgIT0gWk1fTU9ERV9JQlNTICkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoICh6ZlN0YUlzQ29ubmVjdGVkKGRldikpfHwoemZTdGFJc0Nvbm5lY3RpbmcoZGV2KSkgKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICggd2QtPnN0YS5iQ2hhbm5lbFNjYW4gKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIFJlY292ZXIgemVybyBTU0lEIGxlbmd0aCAgKi8KKyAgICBpZiAoICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkgJiYgKHdkLT53cy5zc2lkTGVuID09IDApKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiemZTdGFSZWNvbm5lY3Q6IE5PVCBTdXBwb3J0ISEgU2V0IFNTSUQgdG8gYW55IEJTUyIpOworICAgICAgICAvKiBBTlkgQlNTICovCisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHdkLT5zdGEuc3NpZFswXSA9IDA7CisgICAgICAgIHdkLT5zdGEuc3NpZExlbiA9IDA7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorCisgICAgLy8gUkFZOiBUbyBlbnN1cmUgbm8gVFggcGVuZGluZyBiZWZvcmUgcmUtY29ubmVjdGluZworICAgIHpmRmx1c2hWdHhxKGRldik7CisgICAgemZXbGFuRW5hYmxlKGRldik7CisgICAgemZTY2FuTWdyU2NhbkFjayhkZXYpOworfQorCit2b2lkIHpmU3RhVGltZXIxMDBtcyh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoICh3ZC0+dGljayAlIDEwKSA9PSAwICkKKyAgICB7CisgICAgICAgIHpmUHVzaFZ0eHEoZGV2KTsKKy8vICAgICAgICB6ZlBvd2VyU2F2aW5nTWdyTWFpbihkZXYpOworICAgIH0KK30KKworCit2b2lkIHpmU3RhQ2hlY2tSeEJlYWNvbih6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSApICYmICh6ZlN0YUlzQ29ubmVjdGVkKGRldikpKQorICAgIHsKKyAgICAgICAgaWYgKHdkLT5iZWFjb25JbnRlcnZhbCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+YmVhY29uSW50ZXJ2YWwgPSAxMDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAod2QtPnRpY2sgJSAoKHdkLT5iZWFjb25JbnRlcnZhbCAqIDEwKSAvIFpNX01TX1BFUl9USUNLKSkgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENoZWNrIHJ4QmVhY29uQ291bnQgKi8KKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLnJ4QmVhY29uQ291bnQgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5iZWFjb25NaXNzU3RhdGUgPT0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAJLypub3RpZnkgQVAgdGhhdCB3ZSBsZWZ0Ki8KKyAgICAgICAgICAgIAl6ZlNlbmRNbUZyYW1lKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX0RFQVVUSCwgd2QtPnN0YS5ic3NpZCwgMywgMCwgMCk7CisgICAgICAgICAgICAgICAgLyogQmVhY29uIExvc3QgKi8KKyAgICAgICAgICAgICAgICB6ZlN0YUNvbm5lY3RGYWlsKGRldiwgWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfQkVBQ09OX01JU1MsCisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLmJzc2lkLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25NaXNzU3RhdGUgPSAxOworICAgICAgICAgICAgICAgICAgICAvKiBSZXNldCBjaGFubmVsICovCisgICAgICAgICAgICAgICAgICAgIHpmQ29yZVNldEZyZXF1ZW5jeUV4VjIoZGV2LCB3ZC0+ZnJlcXVlbmN5LCB3ZC0+QmFuZFdpZHRoNDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPkV4dE9mZnNldCwgTlVMTCwgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uTWlzc1N0YXRlID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdkLT5zdGEucnhCZWFjb25Db3VudCA9IDA7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworCit2b2lkIHpmU3RhQ2hlY2tDb25uZWN0VGltZW91dCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmICggd2QtPndsYW5Nb2RlICE9IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICggIXpmU3RhSXNDb25uZWN0aW5nKGRldikgKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgaWYgKCAod2QtPnN0YS5jb25uZWN0U3RhdGUgPT0gWk1fU1RBX0NPTk5fU1RBVEVfQVVUSF9PUEVOKXx8CisgICAgICAgICAod2QtPnN0YS5jb25uZWN0U3RhdGUgPT0gWk1fU1RBX0NPTk5fU1RBVEVfQVVUSF9TSEFSRV8xKXx8CisgICAgICAgICAod2QtPnN0YS5jb25uZWN0U3RhdGUgPT0gWk1fU1RBX0NPTk5fU1RBVEVfQVVUSF9TSEFSRV8yKXx8CisgICAgICAgICAod2QtPnN0YS5jb25uZWN0U3RhdGUgPT0gWk1fU1RBX0NPTk5fU1RBVEVfQVNTT0NJQVRFKSApCisgICAgeworICAgICAgICBpZiAoICh3ZC0+dGljayAtIHdkLT5zdGEuY29ubmVjdFRpbWVyKSA+IFpNX0lOVEVSVkFMX0NPTk5FQ1RfVElNRU9VVCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggd2QtPnN0YS5jb25uZWN0QnlSZWFzc28gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuZmFpbENudE9mUmVhc3NvKys7CisgICAgICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLmZhaWxDbnRPZlJlYXNzbyA+IDIgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5jb25uZWN0QnlSZWFzc28gPSBGQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdkLT5zdGEuY29ubmVjdFN0YXRlID0gWk1fU1RBX0NPTk5fU1RBVEVfTk9ORTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoImNvbm5lY3QgdGltZW91dCwgc3RhdGUgPSAiLCB3ZC0+c3RhLmNvbm5lY3RTdGF0ZSk7CisgICAgICAgICAgICAvL3pmaVdsYW5EaXNhYmxlKGRldik7CisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgcmV0dXJuOworCitmYWlsZWQ6CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZih3ZC0+c3RhLmF1dGhNb2RlID09IFpNX0FVVEhfTU9ERV9BVVRPKQorCXsgLy8gRml4IHNvbWUgQVAgbm90IHNlbmQgYXV0aGVudGljYXRpb24gZmFpbGVkIG1lc3NhZ2UgdG8gc3RhIGFuZCBsZWFkIHRvIGNvbm5lY3QgdGltZW91dCAhCisgICAgICAgICAgICB3ZC0+c3RhLmNvbm5lY3RUaW1lb3V0Q291bnQrKzsKKwl9CisgICAgemZTdGFDb25uZWN0RmFpbChkZXYsIFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX1RJTUVPVVQsIHdkLT5zdGEuYnNzaWQsIDIpOworICAgIHJldHVybjsKK30KKwordm9pZCB6Zk1tU3RhVGltZVRpY2soemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogYWlyb3BlZWsgKi8KKyAgICBpZiAod2QtPndsYW5Nb2RlICE9IFpNX01PREVfQVAgJiYgIXdkLT5zd1NuaWZmZXIpCisgICAgeworICAgICAgICBpZiAoIHdkLT50aWNrICYgMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmVGltZXJDaGVja0FuZEhhbmRsZShkZXYpOworICAgICAgICB9CisKKyAgICAgICAgemZTdGFDaGVja1J4QmVhY29uKGRldik7CisgICAgICAgIHpmU3RhVGltZXIxMDBtcyhkZXYpOworICAgICAgICB6ZlN0YUNoZWNrQ29ubmVjdFRpbWVvdXQoZGV2KTsKKyAgICAgICAgemZQb3dlclNhdmluZ01nck1haW4oZGV2KTsKKyAgICB9CisKKyNpZmRlZiBaTV9FTkFCTEVfQUdHUkVHQVRJT04KKyAgICAvKgorICAgICAqIGFkZCBieSBob25kYQorICAgICAqLworICAgIHpmQWdnU2NhbkFuZENsZWFyKGRldiwgd2QtPnRpY2spOworI2VuZGlmCit9CisKK3ZvaWQgemZTdGFTZW5kQmVhY29uKHpkZXZfdCogZGV2KQoreworICAgIHpidWZfdCogYnVmOworICAgIHUxNl90IG9mZnNldCwgc2VxOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8vem1fZGVidWdfbXNnMCgiXG4iKTsKKworICAgIC8qIFRCRCA6IE1heGltdW0gc2l6ZSBvZiBiZWFjb24gKi8KKyAgICBpZiAoKGJ1ZiA9IHpmd0J1ZkFsbG9jYXRlKGRldiwgMTAyNCkpID09IE5VTEwpCisgICAgeworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJBbGxvY2F0ZSBiZWFjb24gYnVmZmVyIGZhaWxlZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgb2Zmc2V0ID0gMDsKKyAgICAvKiB3bGFuIGhlYWRlciAqLworICAgIC8qIEZyYW1lIGNvbnRyb2wgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCAweDAwODApOworICAgIG9mZnNldCs9MjsKKyAgICAvKiBEdXJhdGlvbiAqLworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIDB4MDAwMCk7CisgICAgb2Zmc2V0Kz0yOworICAgIC8qIEFkZHJlc3MgMSAqLworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIDB4ZmZmZik7CisgICAgb2Zmc2V0Kz0yOworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIDB4ZmZmZik7CisgICAgb2Zmc2V0Kz0yOworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIDB4ZmZmZik7CisgICAgb2Zmc2V0Kz0yOworICAgIC8qIEFkZHJlc3MgMiAqLworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHdkLT5tYWNBZGRyWzBdKTsKKyAgICBvZmZzZXQrPTI7CisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPm1hY0FkZHJbMV0pOworICAgIG9mZnNldCs9MjsKKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCB3ZC0+bWFjQWRkclsyXSk7CisgICAgb2Zmc2V0Kz0yOworICAgIC8qIEFkZHJlc3MgMyAqLworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHdkLT5zdGEuYnNzaWRbMF0pOworICAgIG9mZnNldCs9MjsKKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCB3ZC0+c3RhLmJzc2lkWzFdKTsKKyAgICBvZmZzZXQrPTI7CisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPnN0YS5ic3NpZFsyXSk7CisgICAgb2Zmc2V0Kz0yOworCisgICAgLyogU2VxdWVuY2UgbnVtYmVyICovCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBzZXEgPSAoKHdkLT5tbXNlcSsrKTw8NCk7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCBzZXEpOworICAgIG9mZnNldCs9MjsKKworICAgIC8qIDI0LTMxIFRpbWUgU3RhbXAgOiBoYXJkd2FyZSB3aWxsIGZpbGwgdGhpcyBmaWVsZCAqLworICAgIG9mZnNldCs9ODsKKworICAgIC8qIEJlYWNvbiBJbnRlcnZhbCAqLworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHdkLT5iZWFjb25JbnRlcnZhbCk7CisgICAgb2Zmc2V0Kz0yOworCisgICAgLyogQ2FwYWJpbGl0eSAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPnN0YS5jYXBhYmlsaXR5WzBdKTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5zdGEuY2FwYWJpbGl0eVsxXSk7CisKKyAgICAvKiBTU0lEICovCisgICAgb2Zmc2V0ID0gemZTdGFBZGRJZVNzaWQoZGV2LCBidWYsIG9mZnNldCk7CisKKyAgICBpZih3ZC0+ZnJlcXVlbmN5IDw9IFpNX0NIX0dfMTQpICAvLyAyLjQgR0h6ICBiK2cKKyAgICB7CisKKyAgICAJLyogU3VwcG9ydCBSYXRlICovCisgICAgCW9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlaTV9XTEFOX0VJRF9TVVBQT1JUX1JBVEUsIFpNX1JBVEVfU0VUX0NDSyk7CisKKyAgICAJLyogRFMgcGFyYW1ldGVyIHNldCAqLworICAgIAlvZmZzZXQgPSB6Zk1tQWRkSWVEcyhkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgIAlvZmZzZXQgPSB6ZlN0YUFkZEllSWJzcyhkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgICAgICBpZiggd2QtPndmYy5iSWJzc0dNb2RlCisgICAgICAgICAgICAmJiAod2QtPnN1cHBvcnRNb2RlICYgKFpNX1dJUkVMRVNTX01PREVfMjRfNTR8Wk1fV0lSRUxFU1NfTU9ERV8yNF9OKSkgKSAgICAvLyBPbmx5IGFjY29tcGFueSB3aXRoIGVuYWJsaW5nIGEgbW9kZSAuCisgICAgICAgIHsKKyAgICAgIAkgICAgLyogRVJQIEluZm9ybWF0aW9uICovCisgICAgICAgCSAgICB3ZC0+ZXJwRWxlbWVudCA9IDA7CisgICAgICAgCSAgICBvZmZzZXQgPSB6Zk1tQWRkSWVFcnAoZGV2LCBidWYsIG9mZnNldCk7CisgICAgICAgCX0KKworICAgICAgIAkvKiBUT0RPIDogY291bnRyeSBpbmZvcm1hdGlvbiAqLworICAgICAgICAvKiBSU04gKi8KKyAgICAgICAgaWYgKCB3ZC0+c3RhLmF1dGhNb2RlID09IFpNX0FVVEhfTU9ERV9XUEEyUFNLICkKKyAgICAgICAgeworICAgICAgICAgICAgb2Zmc2V0ID0gemZ3U3RhQWRkSWVXcGFSc24oZGV2LCBidWYsIG9mZnNldCwgWk1fV0xBTl9GUkFNRV9UWVBFX0FVVEgpOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHdkLT53ZmMuYklic3NHTW9kZQorICAgICAgICAgICAgJiYgKHdkLT5zdXBwb3J0TW9kZSAmIChaTV9XSVJFTEVTU19NT0RFXzI0XzU0fFpNX1dJUkVMRVNTX01PREVfMjRfTikpICkgICAgLy8gT25seSBhY2NvbXBhbnkgd2l0aCBlbmFibGluZyBhIG1vZGUgLgorICAgICAgICB7CisgICAgICAgICAgICAvKiBFbmFibGUgRyBNb2RlICovCisgICAgICAgICAgICAvKiBFeHRlbmRlZCBTdXBwb3J0ZWQgUmF0ZXMgKi8KKyAgICAgICAJICAgIG9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJICAgIFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUsIFpNX1JBVEVfU0VUX09GRE0pOworCSAgICB9CisgICAgfQorICAgIGVsc2UgICAgLy8gNUdIeiBhCisgICAgeworICAgICAgICAvKiBTdXBwb3J0IFJhdGUgYSBNb2RlICovCisgICAgCW9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9FSURfU1VQUE9SVF9SQVRFLCBaTV9SQVRFX1NFVF9PRkRNKTsKKworICAgICAgICAvKiBEUyBwYXJhbWV0ZXIgc2V0ICovCisgICAgCW9mZnNldCA9IHpmTW1BZGRJZURzKGRldiwgYnVmLCBvZmZzZXQpOworCisgICAgCW9mZnNldCA9IHpmU3RhQWRkSWVJYnNzKGRldiwgYnVmLCBvZmZzZXQpOworCisgICAgICAgIC8qIFRPRE8gOiBjb3VudHJ5IGluZm9ybWF0aW9uICovCisgICAgICAgIC8qIFJTTiAqLworICAgICAgICBpZiAoIHdkLT5zdGEuYXV0aE1vZGUgPT0gWk1fQVVUSF9NT0RFX1dQQTJQU0sgKQorICAgICAgICB7CisgICAgICAgICAgICBvZmZzZXQgPSB6ZndTdGFBZGRJZVdwYVJzbihkZXYsIGJ1Ziwgb2Zmc2V0LCBaTV9XTEFOX0ZSQU1FX1RZUEVfQVVUSCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0lCU1MgKQorICAgIHsKKyAgICAgICAgLyogVE9ETyA6IE5lZWQgdG8gY2hlY2sgaWYgaXQgaXMgb2sgKi8KKyAgICAgICAgLyogSFQgQ2FwYWJpbGl0aWVzIEluZm8gKi8KKyAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEhUQ2FwYWJpbGl0eShkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgICAgICAvKiBFeHRlbmRlZCBIVCBDYXBhYmlsaXRpZXMgSW5mbyAqLworICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkRXh0ZW5kZWRIVENhcGFiaWxpdHkoZGV2LCBidWYsIG9mZnNldCk7CisgICAgfQorCisgICAgaWYgKCB3ZC0+c3RhLmlic3NBZGRpdGlvbmFsSUVTaXplICkKKyAgICAgICAgb2Zmc2V0ID0gemZTdGFBZGRJYnNzQWRkaXRpb25hbElFKGRldiwgYnVmLCBvZmZzZXQpOworCisgICAgLyogMTIxMiA6IHdyaXRlIHRvIGJlYWNvbiBmaWZvICovCisgICAgLyogMTIyMSA6IHdyaXRlIHRvIHNoYXJlIG1lbW9yeSAqLworICAgIHpmSHBTZW5kQmVhY29uKGRldiwgYnVmLCBvZmZzZXQpOworCisgICAgLyogRnJlZSBiZWFjb24gYnVmZmVyICovCisgICAgLy96ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKK30KKwordm9pZCB6ZlN0YVNpZ25hbFN0YXRpc3RpYyh6ZGV2X3QqIGRldiwgdThfdCBTaWduYWxTdHJlbmd0aCwgdThfdCBTaWduYWxRdWFsaXR5KSAvL0NXWWFuZygrKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIEFkZCBZb3VyIENvZGUgdG8gRG8gV29ya3MgTGlrZSBNb3ZpbmcgQXZlcmFnZSBIZXJlICovCisgICAgd2QtPlNpZ25hbFN0cmVuZ3RoID0gKHdkLT5TaWduYWxTdHJlbmd0aCAqIDcgKyBTaWduYWxTdHJlbmd0aCAqIDMpLzEwOworICAgIHdkLT5TaWduYWxRdWFsaXR5ID0gKHdkLT5TaWduYWxRdWFsaXR5ICogNyArIFNpZ25hbFF1YWxpdHkgKiAzKS8xMDsKKworfQorCitzdHJ1Y3QgenNCc3NJbmZvKiB6ZlN0YUZpbmRCc3NJbmZvKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzV2xhblByb2JlUnNwRnJhbWVIZWFkZXIgKnBQcm9iZVJzcEhlYWRlcikKK3sKKyAgICB1OF90ICAgIGk7CisgICAgdThfdCAgICBqOworICAgIHU4X3QgICAgazsKKyAgICB1OF90ICAgIGlzTWF0Y2hlZCwgbGVuZ3RoLCBjaGFubmVsOworICAgIHUxNl90ICAgb2Zmc2V0LCBmcmVxdWVuY3k7CisgICAgc3RydWN0IHpzQnNzSW5mbyogcEJzc0luZm87CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoKHBCc3NJbmZvID0gd2QtPnN0YS5ic3NMaXN0LmhlYWQpID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBmb3IoIGk9MDsgaTx3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQ7IGkrKyApCisgICAgeworICAgICAgICAvL3ptX2RlYnVnX21zZzIoImNoZWNrIHBCc3NJbmZvID0gIiwgcEJzc0luZm8pOworCisgICAgICAgIC8qIENoZWNrIEJTU0lEICovCisgICAgICAgIGZvciggaj0wOyBqPDY7IGorKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggcEJzc0luZm8tPmJzc2lkW2pdICE9IHBQcm9iZVJzcEhlYWRlci0+YnNzaWRbal0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKwkJLyogQ2hlY2sgU1NJRCAqLworICAgICAgICBpZiAoaiA9PSA2KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocFByb2JlUnNwSGVhZGVyLT5zc2lkWzFdIDw9IDMyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGNvbXBhcmUgbGVuZ3RoIGFuZCBzc2lkICovCisgICAgICAgICAgICAgICAgaXNNYXRjaGVkID0gMTsKKwkJCQlpZigocFByb2JlUnNwSGVhZGVyLT5zc2lkWzFdICE9IDApICYmIChwQnNzSW5mby0+c3NpZFsxXSAhPSAwKSkKKwkJCQl7CisgICAgICAgICAgICAgICAgZm9yKCBrPTE7IGs8cFByb2JlUnNwSGVhZGVyLT5zc2lkWzFdICsgMTsgaysrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggcEJzc0luZm8tPnNzaWRba10gIT0gcFByb2JlUnNwSGVhZGVyLT5zc2lkW2tdICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaXNNYXRjaGVkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlzTWF0Y2hlZCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpc01hdGNoZWQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLyogQ2hlY2sgY2hhbm5lbCAqLworICAgICAgICAvKiBBZGQgY2hlY2sgY2hhbm5lbCB0byBzb2x2ZSB0aGUgYnVnICMzMTIyMiAqLworICAgICAgICBpZiAoaXNNYXRjaGVkKSB7CisgICAgICAgICAgICBpZiAoKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0RTKSkgIT0gMHhmZmZmKSB7CisgICAgICAgICAgICAgICAgaWYgKChsZW5ndGggPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHpmSHBJc0FsbG93ZWRDaGFubmVsKGRldiwgemZDaE51bVRvRnJlcShkZXYsIGNoYW5uZWwsIDApKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY3kgPSAwOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmN5ID0gemZDaE51bVRvRnJlcShkZXYsIGNoYW5uZWwsIDApOzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZyZXF1ZW5jeSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmcmVxdWVuY3kgPSB3ZC0+c3RhLmN1cnJlbnRGcmVxdWVuY3k7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmcmVxdWVuY3kgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmICggKChmcmVxdWVuY3kgPiAzMDAwKSAmJiAocEJzc0luZm8tPmZyZXF1ZW5jeSA+IDMwMDApKQorICAgICAgICAgICAgICAgICAgICAgfHwgKChmcmVxdWVuY3kgPCAzMDAwKSAmJiAocEJzc0luZm8tPmZyZXF1ZW5jeSA8IDMwMDApKSApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogcmVkdW5kYW50ICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHBCc3NJbmZvID0gcEJzc0luZm8tPm5leHQ7CisgICAgfQorCisgICAgaWYgKCBpID09IHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudCApCisgICAgeworICAgICAgICBwQnNzSW5mbyA9IE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHBCc3NJbmZvOworfQorCit1OF90IHpmU3RhSW5pdEJzc0luZm8oemRldl90KiBkZXYsIHpidWZfdCogYnVmLAorICAgICAgICBzdHJ1Y3QgenNXbGFuUHJvYmVSc3BGcmFtZUhlYWRlciAqcFByb2JlUnNwSGVhZGVyLAorICAgICAgICBzdHJ1Y3QgenNCc3NJbmZvKiBwQnNzSW5mbywgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBBZGRJbmZvLCB1OF90IHR5cGUpCit7CisgICAgdThfdCAgICBsZW5ndGgsIGNoYW5uZWwsIGlzNUc7CisgICAgdTE2X3QgICBpLCBvZmZzZXQ7CisgICAgdThfdCAgICBhcFFvc0luZm87CisgICAgdTE2X3QgICAgZWFjaElFbGVuZ3RoID0gMDsKKyAgICB1MTZfdCAgIGFjY3VtdWxhdGVMZW4gPSAwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCh0eXBlID09IDEpICYmICgocEJzc0luZm8tPmZsYWcgJiBaTV9CU1NfSU5GT19WQUxJRF9CSVQpICE9IDApKQorICAgIHsKKyAgICAgICAgZ290byB6bFVwZGF0ZVJzc2k7CisgICAgfQorCisgICAgLyogZ2V0IFNTSUQgKi8KKyAgICBpZiAoIChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9TU0lEKSkgPT0gMHhmZmZmICkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIkVJRChTU0lEKSBub3QgZm91bmQiKTsKKyAgICAgICAgZ290byB6bEVycm9yOworICAgIH0KKworICAgIGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKworCXsKKwkJdThfdCBTaG93X0ZsYWcgPSAwOworCQl6ZndHZXRTaG93WmVyb0xlbmd0aFNTSUQoZGV2LCAmU2hvd19GbGFnKTsKKworCQlpZihTaG93X0ZsYWcpCisJCXsKKwkJCWlmIChsZW5ndGggPiBaTV9NQVhfU1NJRF9MRU5HVEggKQorCQkJeworCQkJCXptX2RlYnVnX21zZzAoIkVJRChTU0lEKSBpcyBpbnZhbGlkIik7CisJCQkJZ290byB6bEVycm9yOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworICAgIGlmICggbGVuZ3RoID09IDAgfHwgbGVuZ3RoID4gWk1fTUFYX1NTSURfTEVOR1RIICkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIkVJRChTU0lEKSBpcyBpbnZhbGlkIik7CisgICAgICAgIGdvdG8gemxFcnJvcjsKKyAgICB9CisKKwkJfQorCX0KKyAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHBCc3NJbmZvLT5zc2lkLCBvZmZzZXQsIGxlbmd0aCsyKTsKKworICAgIC8qIGdldCBEUyBwYXJhbWV0ZXIgKi8KKyAgICBpZiAoIChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9EUykpICE9IDB4ZmZmZiApCisgICAgeworICAgICAgICBsZW5ndGggPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSk7CisgICAgICAgIGlmICggbGVuZ3RoICE9IDEgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJBYm5vcm1hbCBEUyBQYXJhbSBTZXQgSUUiKTsKKyAgICAgICAgICAgIGdvdG8gemxFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBjaGFubmVsID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzIpOworCisgICAgICAgIGlmICh6ZkhwSXNBbGxvd2VkQ2hhbm5lbChkZXYsIHpmQ2hOdW1Ub0ZyZXEoZGV2LCBjaGFubmVsLCAwKSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byB6bEVycm9yMjsKKyAgICAgICAgfQorCisgICAgICAgIHBCc3NJbmZvLT5mcmVxdWVuY3kgPSB6ZkNoTnVtVG9GcmVxKGRldiwgY2hhbm5lbCwgMCk7IC8vIGF1dG8gY2hlY2sKKyAgICAgICAgcEJzc0luZm8tPmNoYW5uZWwgPSBjaGFubmVsOworCisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogRFMgcGFyYW1ldGVyIG5vdCBmb3VuZCAqLworICAgICAgICBwQnNzSW5mby0+ZnJlcXVlbmN5ID0gd2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5OworICAgICAgICBwQnNzSW5mby0+Y2hhbm5lbCA9IHpmQ2hGcmVxVG9OdW0od2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5LCAmaXM1Ryk7CisgICAgfQorCisgICAgLyogaW5pdGlhbGl6ZSBzZWN1cml0eSB0eXBlICovCisgICAgcEJzc0luZm8tPnNlY3VyaXR5VHlwZSA9IFpNX1NFQ1VSSVRZX1RZUEVfTk9ORTsKKworICAgIC8qIGdldCBtYWNhZGRyICovCisgICAgZm9yKCBpPTA7IGk8NjsgaSsrICkKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT5tYWNhZGRyW2ldID0gcFByb2JlUnNwSGVhZGVyLT5zYVtpXTsKKyAgICB9CisKKyAgICAvKiBnZXQgYnNzaWQgKi8KKyAgICBmb3IoIGk9MDsgaTw2OyBpKysgKQorICAgIHsKKyAgICAgICAgcEJzc0luZm8tPmJzc2lkW2ldID0gcFByb2JlUnNwSGVhZGVyLT5ic3NpZFtpXTsKKyAgICB9CisKKyAgICAvKiBnZXQgdGltZXN0YW1wICovCisgICAgZm9yKCBpPTA7IGk8ODsgaSsrICkKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT50aW1lU3RhbXBbaV0gPSBwUHJvYmVSc3BIZWFkZXItPnRpbWVTdGFtcFtpXTsKKyAgICB9CisKKyAgICAvKiBnZXQgYmVhY29uIGludGVydmFsICovCisgICAgcEJzc0luZm8tPmJlYWNvbkludGVydmFsWzBdID0gcFByb2JlUnNwSGVhZGVyLT5iZWFjb25JbnRlcnZhbFswXTsKKyAgICBwQnNzSW5mby0+YmVhY29uSW50ZXJ2YWxbMV0gPSBwUHJvYmVSc3BIZWFkZXItPmJlYWNvbkludGVydmFsWzFdOworCisgICAgLyogZ2V0IGNhcGFiaWxpdHkgKi8KKyAgICBwQnNzSW5mby0+Y2FwYWJpbGl0eVswXSA9IHBQcm9iZVJzcEhlYWRlci0+Y2FwYWJpbGl0eVswXTsKKyAgICBwQnNzSW5mby0+Y2FwYWJpbGl0eVsxXSA9IHBQcm9iZVJzcEhlYWRlci0+Y2FwYWJpbGl0eVsxXTsKKworICAgIC8qIENvcHkgZnJhbWUgYm9keSAqLworICAgIG9mZnNldCA9IDM2OyAgICAgICAgICAgIC8vIENvcHkgZnJvbSB0aGUgc3RhcnQgb2YgdmFyaWFibGUgSUUKKyAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpLW9mZnNldDsKKyAgICBpZiAocEJzc0luZm8tPmZyYW1lQm9keXNpemUgPiAoWk1fTUFYX1BST0JFX0ZSQU1FX0JPRFlfU0laRS0xKSkKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplID0gWk1fTUFYX1BST0JFX0ZSQU1FX0JPRFlfU0laRS0xOworICAgIH0KKyAgICBhY2N1bXVsYXRlTGVuID0gMDsKKyAgICBkbworICAgIHsKKyAgICAgICAgZWFjaElFbGVuZ3RoID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0ICsgYWNjdW11bGF0ZUxlbisxKSArIDI7ICAvL0xlbisoRUlEK0RhdGEpCisKKyAgICAgICAgaWYgKCAoZWFjaElFbGVuZ3RoID49IDIpCisgICAgICAgICAgICAgJiYgKChhY2N1bXVsYXRlTGVuICsgZWFjaElFbGVuZ3RoKSA8PSBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSkgKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHBCc3NJbmZvLT5mcmFtZUJvZHkrYWNjdW11bGF0ZUxlbiwgb2Zmc2V0K2FjY3VtdWxhdGVMZW4sIGVhY2hJRWxlbmd0aCk7CisgICAgICAgICAgICBhY2N1bXVsYXRlTGVuKz0odTE2X3QpZWFjaElFbGVuZ3RoOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fbXNnMF9tbShaTV9MVl8xLCAicHJvYmVyc3AgZnJhbWVCb2R5c2l6ZSBhYm5vcm1hbCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgd2hpbGUoYWNjdW11bGF0ZUxlbiA8IHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplKTsKKyAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSA9IGFjY3VtdWxhdGVMZW47CisKKyAgICAvKiBnZXQgc3VwcG9ydGVkIHJhdGVzICovCisgICAgaWYgKCAob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfU1VQUE9SVF9SQVRFKSkgPT0gMHhmZmZmICkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIkVJRChzdXBwb3J0ZWQgcmF0ZXMpIG5vdCBmb3VuZCIpOworICAgICAgICBnb3RvIHpsRXJyb3I7CisgICAgfQorCisgICAgbGVuZ3RoID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpOworICAgIGlmICggbGVuZ3RoID09IDAgfHwgbGVuZ3RoID4gWk1fTUFYX1NVUFBfUkFURVNfSUVfU0laRSkKKyAgICB7CisgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIlN1cHBvcnRlZCByYXRlcyBJRSBsZW5ndGggYWJub3JtYWwiKTsKKyAgICAgICAgZ290byB6bEVycm9yOworICAgIH0KKyAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHBCc3NJbmZvLT5zdXBwb3J0ZWRSYXRlcywgb2Zmc2V0LCBsZW5ndGgrMik7CisKKworCisgICAgLyogZ2V0IENvdW50cnkgaW5mb3JtYXRpb24gKi8KKyAgICBpZiAoIChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9DT1VOVFJZKSkgIT0gMHhmZmZmICkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKyAgICAgICAgaWYgKGxlbmd0aCA+IFpNX01BWF9DT1VOVFJZX0lORk9fU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgbGVuZ3RoID0gWk1fTUFYX0NPVU5UUllfSU5GT19TSVpFOworICAgICAgICB9CisgICAgICAgIHpmQ29weUZyb21SeEJ1ZmZlcihkZXYsIGJ1ZiwgcEJzc0luZm8tPmNvdW50cnlJbmZvLCBvZmZzZXQsIGxlbmd0aCsyKTsKKyAgICAgICAgLyogY2hlY2sgODAyLjExZCBzdXBwb3J0IGRhdGEgKi8KKyAgICAgICAgaWYgKHdkLT5zdGEuYjgwMl8xMUQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmSHBHZXRSZWd1bGF0aW9uVGFibGVmcm9tSVNPKGRldiwgKHU4X3QgKikmcEJzc0luZm8tPmNvdW50cnlJbmZvLCAzKTsKKyAgICAgICAgICAgIC8qIG9ubHkgc2V0IHJlZ3VsYXRvcnkgb25lIHRpbWUgKi8KKyAgICAgICAgICAgIHdkLT5zdGEuYjgwMl8xMUQgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyogZ2V0IEVSUCBpbmZvcm1hdGlvbiAqLworICAgIGlmICggKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0VSUCkpICE9IDB4ZmZmZiApCisgICAgeworICAgICAgICBwQnNzSW5mby0+ZXJwID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzIpOworICAgIH0KKworICAgIC8qIGdldCBleHRlbmRlZCBzdXBwb3J0ZWQgcmF0ZXMgKi8KKyAgICBpZiAoIChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9FWFRFTkRFRF9SQVRFKSkgIT0gMHhmZmZmICkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKyAgICAgICAgaWYgKGxlbmd0aCA+IFpNX01BWF9TVVBQX1JBVEVTX0lFX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIkV4dGVuZGVkIHJhdGVzIElFIGxlbmd0aCBhYm5vcm1hbCIpOworICAgICAgICAgICAgZ290byB6bEVycm9yOworICAgICAgICB9CisgICAgICAgIHpmQ29weUZyb21SeEJ1ZmZlcihkZXYsIGJ1ZiwgcEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzLCBvZmZzZXQsIGxlbmd0aCsyKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzWzBdID0gMDsKKyAgICAgICAgcEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzWzFdID0gMDsKKyAgICB9CisKKyAgICAvKiBnZXQgV1BBIElFICovCisgICAgaWYgKCAob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfV1BBX0lFKSkgIT0gMHhmZmZmICkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKyAgICAgICAgaWYgKGxlbmd0aCA+IFpNX01BWF9JRV9TSVpFKQorICAgICAgICB7CisgICAgICAgICAgICBsZW5ndGggPSBaTV9NQVhfSUVfU0laRTsKKyAgICAgICAgfQorICAgICAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHBCc3NJbmZvLT53cGFJZSwgb2Zmc2V0LCBsZW5ndGgrMik7CisgICAgICAgIHBCc3NJbmZvLT5zZWN1cml0eVR5cGUgPSBaTV9TRUNVUklUWV9UWVBFX1dQQTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcEJzc0luZm8tPndwYUllWzFdID0gMDsKKyAgICB9CisKKyAgICAvKiBnZXQgV1BTIElFICovCisgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRXaWZpRWxlbWVudChkZXYsIGJ1ZiwgNCwgMHhmZikpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKyAgICAgICAgaWYgKGxlbmd0aCA+IFpNX01BWF9XUFNfSUVfU0laRSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxlbmd0aCA9IFpNX01BWF9XUFNfSUVfU0laRTsKKyAgICAgICAgfQorICAgICAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHBCc3NJbmZvLT53c2NJZSwgb2Zmc2V0LCBsZW5ndGgrMik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT53c2NJZVsxXSA9IDA7CisgICAgfQorCisgICAgLyogZ2V0IFN1cGVyRyBJRSAqLworICAgIGlmICgob2Zmc2V0ID0gemZGaW5kU3VwZXJHRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfVkVORE9SX1BSSVZBVEUpKSAhPSAweGZmZmYpCisgICAgeworICAgICAgICBwQnNzSW5mby0+YXBDYXAgfD0gWk1fU3VwZXJHX0FQOworICAgIH0KKworICAgIC8qIGdldCBYUiBJRSAqLworICAgIGlmICgob2Zmc2V0ID0gemZGaW5kWFJFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9WRU5ET1JfUFJJVkFURSkpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT5hcENhcCB8PSBaTV9YUl9BUDsKKyAgICB9CisKKyAgICAvKiBnZXQgUlNOIElFICovCisgICAgaWYgKCAob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfUlNOX0lFKSkgIT0gMHhmZmZmICkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKyAgICAgICAgaWYgKGxlbmd0aCA+IFpNX01BWF9JRV9TSVpFKQorICAgICAgICB7CisgICAgICAgICAgICBsZW5ndGggPSBaTV9NQVhfSUVfU0laRTsKKyAgICAgICAgfQorICAgICAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHBCc3NJbmZvLT5yc25JZSwgb2Zmc2V0LCBsZW5ndGgrMik7CisgICAgICAgIHBCc3NJbmZvLT5zZWN1cml0eVR5cGUgPSBaTV9TRUNVUklUWV9UWVBFX1dQQTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcEJzc0luZm8tPnJzbkllWzFdID0gMDsKKyAgICB9CisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAvKiBnZXQgQ0VOQyBJRSAqLworICAgIGlmICggKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0NFTkNfSUUpKSAhPSAweGZmZmYgKQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpOworICAgICAgICBpZiAobGVuZ3RoID4gWk1fTUFYX0lFX1NJWkUgKQorICAgICAgICB7CisgICAgICAgICAgICBsZW5ndGggPSBaTV9NQVhfSUVfU0laRTsKKyAgICAgICAgfQorICAgICAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHBCc3NJbmZvLT5jZW5jSWUsIG9mZnNldCwgbGVuZ3RoKzIpOworICAgICAgICBwQnNzSW5mby0+c2VjdXJpdHlUeXBlID0gWk1fU0VDVVJJVFlfVFlQRV9DRU5DOworICAgICAgICBwQnNzSW5mby0+Y2FwYWJpbGl0eVswXSAmPSAweGZmZWY7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT5jZW5jSWVbMV0gPSAwOworICAgIH0KKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgLyogZ2V0IFdNRSBQYXJhbWV0ZXIgSUUsIHByb2JlIHJzcCBtYXkgY29udGFpbiBXTUUgcGFyYW1ldGVyIGVsZW1lbnQgKi8KKyAgICAvL2lmICggd2QtPmJRb1NFbmFibGUgKQorICAgIHsKKyAgICAgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRXaWZpRWxlbWVudChkZXYsIGJ1ZiwgMiwgMSkpICE9IDB4ZmZmZikKKyAgICAgICAgeworICAgICAgICAgICAgYXBRb3NJbmZvID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzgpICYgMHg4MDsKKyAgICAgICAgICAgIHBCc3NJbmZvLT53bWVTdXBwb3J0ID0gMSB8IGFwUW9zSW5mbzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgob2Zmc2V0ID0gemZGaW5kV2lmaUVsZW1lbnQoZGV2LCBidWYsIDIsIDApKSAhPSAweGZmZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwUW9zSW5mbyA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs4KSAmIDB4ODA7CisgICAgICAgICAgICBwQnNzSW5mby0+d21lU3VwcG9ydCA9IDEgIHwgYXBRb3NJbmZvOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcEJzc0luZm8tPndtZVN1cHBvcnQgPSAwOworICAgICAgICB9CisgICAgfQorICAgIC8vQ1dZYW5nKCspCisgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9IVF9DQVBBQklMSVRZKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgLyogMTFuIEFQICovCisgICAgICAgIHBCc3NJbmZvLT5FbmFibGVIVCA9IDE7CisgICAgICAgIGlmICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSkgJiAweDAyKQorICAgICAgICB7CisgICAgICAgICAgICBwQnNzSW5mby0+ZW5hYmxlSFQ0MCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwQnNzSW5mby0+ZW5hYmxlSFQ0MCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpICYgMHg0MCkKKyAgICAgICAgeworICAgICAgICAgICAgcEJzc0luZm8tPlNHNDAgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcEJzc0luZm8tPlNHNDAgPSAwOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX1BSRU4yX0VJRF9IVENBUEFCSUxJVFkpKSAhPSAweGZmZmYpCisgICAgeworICAgICAgICAvKiAxMW4gQVAgKi8KKyAgICAgICAgcEJzc0luZm8tPkVuYWJsZUhUID0gMTsKKyAgICAgICAgcEJzc0luZm8tPmFwQ2FwIHw9IFpNX0FsbDExTl9BUDsKKyAgICAgICAgaWYgKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKSAmIDB4MDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBCc3NJbmZvLT5lbmFibGVIVDQwID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBCc3NJbmZvLT5lbmFibGVIVDQwID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMikgJiAweDQwKQorICAgICAgICB7CisgICAgICAgICAgICBwQnNzSW5mby0+U0c0MCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwQnNzSW5mby0+U0c0MCA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcEJzc0luZm8tPkVuYWJsZUhUID0gMDsKKyAgICB9CisgICAgLyogSFQgaW5mb3JtYXRpb24gKi8KKyAgICBpZiAoKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0VYVEVOREVEX0hUX0NBUEFCSUxJVFkpKSAhPSAweGZmZmYpCisgICAgeworICAgICAgICAvKiBhdGhlcm9zIHByZSBuICovCisgICAgICAgIHBCc3NJbmZvLT5leHRDaE9mZnNldCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKSAmIDB4MDM7CisgICAgfQorICAgIGVsc2UgaWYgKChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX1BSRU4yX0VJRF9IVElORk9STUFUSU9OKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgLyogcHJlIG4gMi4wIHN0YW5kYXJkICovCisgICAgICAgIHBCc3NJbmZvLT5leHRDaE9mZnNldCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCszKSAmIDB4MDM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT5leHRDaE9mZnNldCA9IDA7CisgICAgfQorCisgICAgaWYgKCAocEJzc0luZm8tPmVuYWJsZUhUNDAgPT0gMSkKKyAgICAgICAgICYmICgocEJzc0luZm8tPmV4dENoT2Zmc2V0ICE9IDEpICYmIChwQnNzSW5mby0+ZXh0Q2hPZmZzZXQgIT0gMykpICkKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT5lbmFibGVIVDQwID0gMDsKKyAgICB9CisKKyAgICBpZiAocEJzc0luZm8tPmVuYWJsZUhUNDAgPT0gMSkKKyAgICB7CisgICAgICAgIGlmICh6ZkhwSXNBbGxvd2VkQ2hhbm5lbChkZXYsIHBCc3NJbmZvLT5mcmVxdWVuY3krKChwQnNzSW5mby0+ZXh0Q2hPZmZzZXQ9PTEpPzIwOi0yMCkpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGlmIGV4dGVuc2lvbiBjaGFubmVsIGlzIG5vdCBhbiBhbGxvd2VkIGNoYW5uZWwsIHRyZWF0IEFQIGFzIG5vbi1IVCBtb2RlICovCisgICAgICAgICAgICBwQnNzSW5mby0+RW5hYmxlSFQgPSAwOworICAgICAgICAgICAgcEJzc0luZm8tPmVuYWJsZUhUNDAgPSAwOworICAgICAgICAgICAgcEJzc0luZm8tPmV4dENoT2Zmc2V0ID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGdldCBBVEggRXh0ZW5kZWQgQ2FwYWJpbGl0eSAqLworICAgIGlmICggKChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9FWFRFTkRFRF9IVF9DQVBBQklMSVRZKSkgIT0gMHhmZmZmKSYmCisgICAgICAgICgob2Zmc2V0ID0gemZGaW5kQnJkY21NcnZsUmxua0V4dENhcChkZXYsIGJ1ZikpID09IDB4ZmZmZikpCisKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT5hdGhPd2xBcCA9IDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBCc3NJbmZvLT5hdGhPd2xBcCA9IDA7CisgICAgfQorCisgICAgLyogZ2V0IEJyb2FkY29tIEV4dGVuZGVkIENhcGFiaWxpdHkgKi8KKyAgICBpZiAoIChwQnNzSW5mby0+RW5hYmxlSFQgPT0gMSkgLy8oKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0VYVEVOREVEX0hUX0NBUEFCSUxJVFkpKSAhPSAweGZmZmYpCisgICAgICAgICAmJiAoKG9mZnNldCA9IHpmRmluZEJyb2FkY29tRXh0Q2FwKGRldiwgYnVmKSkgIT0gMHhmZmZmKSApCisgICAgeworICAgICAgICBwQnNzSW5mby0+YnJvYWRjb21IVEFwID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcEJzc0luZm8tPmJyb2FkY29tSFRBcCA9IDA7CisgICAgfQorCisgICAgLyogZ2V0IE1hcnZlbCBFeHRlbmRlZCBDYXBhYmlsaXR5ICovCisgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRNYXJ2ZWxFeHRDYXAoZGV2LCBidWYpKSAhPSAweGZmZmYpCisgICAgeworICAgICAgICBwQnNzSW5mby0+bWFydmVsQXAgPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwQnNzSW5mby0+bWFydmVsQXAgPSAwOworICAgIH0KKworICAgIC8qIGdldCBBVElNIHdpbmRvdyAqLworICAgIGlmICggKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0lCU1MpKSAhPSAweGZmZmYgKQorICAgIHsKKyAgICAgICAgcEJzc0luZm8tPmF0aW1XaW5kb3cgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLG9mZnNldCsyKTsKKyAgICB9CisKKyAgICAvKiBGaXQgZm9yIHN1cHBvcnQgbW9kZSAqLworICAgIGlmIChwQnNzSW5mby0+ZnJlcXVlbmN5ID4gMzAwMCkgeworICAgICAgICBpZiAod2QtPnN1cHBvcnRNb2RlICYgWk1fV0lSRUxFU1NfTU9ERV81X04pIHsKKyNpZiAwCisgICAgICAgICAgICBpZiAod2QtPnN1cHBvcnRNb2RlICYgWk1fV0lSRUxFU1NfTU9ERV81XzU0KSB7CisgICAgICAgICAgICAgICAgLyogc3VwcG9ydCBtb2RlOiBhLCBuICovCisgICAgICAgICAgICAgICAgLyogZG8gbm90aGluZyAqLworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBzdXBwb3J0IG1vZGU6IG4gKi8KKyAgICAgICAgICAgICAgICAvKiByZWplY3Qgbm9uLW4gYnNzIGluZm8gKi8KKyAgICAgICAgICAgICAgICBpZiAoIXBCc3NJbmZvLT5FbmFibGVIVCkgeworICAgICAgICAgICAgICAgICAgICBnb3RvIHpsRXJyb3IyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHdkLT5zdXBwb3J0TW9kZSAmIFpNX1dJUkVMRVNTX01PREVfNV81NCkgeworICAgICAgICAgICAgICAgIC8qIHN1cHBvcnQgbW9kZTogYSAqLworICAgICAgICAgICAgICAgIC8qIGRlbGV0ZSBuIG1vZGUgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgICAgICBwQnNzSW5mby0+RW5hYmxlSFQgPSAwOworICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5lbmFibGVIVDQwID0gMDsKKyAgICAgICAgICAgICAgICBwQnNzSW5mby0+YXBDYXAgJj0gKH5aTV9BbGwxMU5fQVApOworICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5leHRDaE9mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUgPSB6ZlJlbW92ZUVsZW1lbnQoZGV2LCBwQnNzSW5mby0+ZnJhbWVCb2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplLCBaTV9XTEFOX0VJRF9IVF9DQVBBQklMSVRZKTsKKyAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSA9IHpmUmVtb3ZlRWxlbWVudChkZXYsIHBCc3NJbmZvLT5mcmFtZUJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUsIFpNX1dMQU5fUFJFTjJfRUlEX0hUQ0FQQUJJTElUWSk7CisgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUgPSB6ZlJlbW92ZUVsZW1lbnQoZGV2LCBwQnNzSW5mby0+ZnJhbWVCb2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplLCBaTV9XTEFOX0VJRF9FWFRFTkRFRF9IVF9DQVBBQklMSVRZKTsKKyAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSA9IHpmUmVtb3ZlRWxlbWVudChkZXYsIHBCc3NJbmZvLT5mcmFtZUJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUsIFpNX1dMQU5fUFJFTjJfRUlEX0hUSU5GT1JNQVRJT04pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBzdXBwb3J0IG1vZGU6IG5vbmUgKi8KKyAgICAgICAgICAgICAgICBnb3RvIHpsRXJyb3IyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHdkLT5zdXBwb3J0TW9kZSAmIFpNX1dJUkVMRVNTX01PREVfMjRfTikgeworI2lmIDAKKyAgICAgICAgICAgIGlmICh3ZC0+c3VwcG9ydE1vZGUgJiBaTV9XSVJFTEVTU19NT0RFXzI0XzU0KSB7CisgICAgICAgICAgICAgICAgaWYgKHdkLT5zdXBwb3J0TW9kZSAmIFpNX1dJUkVMRVNTX01PREVfMjRfMTEpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogc3VwcG9ydCBtb2RlOiBiLCBnLCBuICovCisgICAgICAgICAgICAgICAgICAgIC8qIGRvIG5vdGhpbmcgKi8KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBzdXBwb3J0IG1vZGU6IGcsIG4gKi8KKyAgICAgICAgICAgICAgICAgICAgLyogcmVqZWN0IGItb25seSBic3MgaW5mbyAqLworICAgICAgICAgICAgICAgICAgICBpZiAoICghcEJzc0luZm8tPkVuYWJsZUhUKQorICAgICAgICAgICAgICAgICAgICAgICAgICYmIChwQnNzSW5mby0+ZXh0U3VwcG9ydGVkUmF0ZXNbMV0gPT0gMCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgZ290byB6bEVycm9yMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHdkLT5zdXBwb3J0TW9kZSAmIFpNX1dJUkVMRVNTX01PREVfMjRfMTEpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogc3VwcG9ydCBtb2RlOiBiLCBuICovCisgICAgICAgICAgICAgICAgICAgIC8qIDEuIHJlamVjdCBnLW9ubHkgYnNzIGluZm8KKyAgICAgICAgICAgICAgICAgICAgICogMi4gaWYgbm9uIGctb25seSwgZGVsZXRlIGcgbW9kZSBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCAhcEJzc0luZm8tPkVuYWJsZUhUICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCB6ZklzR09ubHlNb2RlKGRldiwgcEJzc0luZm8tPmZyZXF1ZW5jeSwgcEJzc0luZm8tPnN1cHBvcnRlZFJhdGVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB6ZklzR09ubHlNb2RlKGRldiwgcEJzc0luZm8tPmZyZXF1ZW5jeSwgcEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHpsRXJyb3IyOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZkdhdGhlckJNb2RlKGRldiwgcEJzc0luZm8tPnN1cHBvcnRlZFJhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZXJwID0gMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplID0gemZSZW1vdmVFbGVtZW50KGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keSwgcEJzc0luZm8tPmZyYW1lQm9keXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fRUlEX0VSUCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUgPSB6ZlJlbW92ZUVsZW1lbnQoZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5LCBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9FSURfRVhURU5ERURfUkFURSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSA9IHpmVXBkYXRlRWxlbWVudChkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5mcmFtZUJvZHksIHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+c3VwcG9ydGVkUmF0ZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogc3VwcG9ydCBtb2RlOiBuICovCisgICAgICAgICAgICAgICAgICAgIC8qIHJlamVjdCBub24tbiBic3MgaW5mbyAqLworICAgICAgICAgICAgICAgICAgICBpZiAoIXBCc3NJbmZvLT5FbmFibGVIVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ290byB6bEVycm9yMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogZGVsZXRlIG4gbW9kZSBpbmZvcm1hdGlvbiAqLworICAgICAgICAgICAgcEJzc0luZm8tPkVuYWJsZUhUID0gMDsKKyAgICAgICAgICAgIHBCc3NJbmZvLT5lbmFibGVIVDQwID0gMDsKKyAgICAgICAgICAgIHBCc3NJbmZvLT5hcENhcCAmPSAoflpNX0FsbDExTl9BUCk7CisgICAgICAgICAgICBwQnNzSW5mby0+ZXh0Q2hPZmZzZXQgPSAwOworICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUgPSB6ZlJlbW92ZUVsZW1lbnQoZGV2LCBwQnNzSW5mby0+ZnJhbWVCb2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUsIFpNX1dMQU5fRUlEX0hUX0NBUEFCSUxJVFkpOworICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUgPSB6ZlJlbW92ZUVsZW1lbnQoZGV2LCBwQnNzSW5mby0+ZnJhbWVCb2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUsIFpNX1dMQU5fUFJFTjJfRUlEX0hUQ0FQQUJJTElUWSk7CisgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSA9IHpmUmVtb3ZlRWxlbWVudChkZXYsIHBCc3NJbmZvLT5mcmFtZUJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSwgWk1fV0xBTl9FSURfRVhURU5ERURfSFRfQ0FQQUJJTElUWSk7CisgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSA9IHpmUmVtb3ZlRWxlbWVudChkZXYsIHBCc3NJbmZvLT5mcmFtZUJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSwgWk1fV0xBTl9QUkVOMl9FSURfSFRJTkZPUk1BVElPTik7CisKKyAgICAgICAgICAgIGlmICh3ZC0+c3VwcG9ydE1vZGUgJiBaTV9XSVJFTEVTU19NT0RFXzI0XzU0KSB7CisjaWYgMAorICAgICAgICAgICAgICAgIGlmICh3ZC0+c3VwcG9ydE1vZGUgJiBaTV9XSVJFTEVTU19NT0RFXzI0XzExKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHN1cHBvcnQgbW9kZTogYiwgZyAqLworICAgICAgICAgICAgICAgICAgICAvKiBkZWxldGUgbiBtb2RlIGluZm9ybWF0aW9uICovCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogc3VwcG9ydCBtb2RlOiBnICovCisgICAgICAgICAgICAgICAgICAgIC8qIGRlbGV0ZSBuIG1vZGUgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgLyogcmVqZWN0IGItb25seSBic3MgaW5mbyAqLworICAgICAgICAgICAgICAgICAgICBpZiAocEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzWzFdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHpsRXJyb3IyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICh3ZC0+c3VwcG9ydE1vZGUgJiBaTV9XSVJFTEVTU19NT0RFXzI0XzExKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHN1cHBvcnQgbW9kZTogYiAqLworICAgICAgICAgICAgICAgICAgICAvKiBkZWxldGUgbiBtb2RlIGluZm9ybWF0aW9uICovCisgICAgICAgICAgICAgICAgICAgIGlmICggemZJc0dPbmx5TW9kZShkZXYsIHBCc3NJbmZvLT5mcmVxdWVuY3ksIHBCc3NJbmZvLT5zdXBwb3J0ZWRSYXRlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICB8fCB6ZklzR09ubHlNb2RlKGRldiwgcEJzc0luZm8tPmZyZXF1ZW5jeSwgcEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gemxFcnJvcjI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB6ZkdhdGhlckJNb2RlKGRldiwgcEJzc0luZm8tPnN1cHBvcnRlZFJhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5lcnAgPSAwOworCisgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSA9IHpmUmVtb3ZlRWxlbWVudChkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keSwgcEJzc0luZm8tPmZyYW1lQm9keXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9FSURfRVJQKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplID0gemZSZW1vdmVFbGVtZW50KGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5LCBwQnNzSW5mby0+ZnJhbWVCb2R5c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0VJRF9FWFRFTkRFRF9SQVRFKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPmZyYW1lQm9keXNpemUgPSB6ZlVwZGF0ZUVsZW1lbnQoZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5mcmFtZUJvZHksIHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5zdXBwb3J0ZWRSYXRlcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBzdXBwb3J0IG1vZGU6IG5vbmUgKi8KKyAgICAgICAgICAgICAgICAgICAgZ290byB6bEVycm9yMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwQnNzSW5mby0+ZmxhZyB8PSBaTV9CU1NfSU5GT19WQUxJRF9CSVQ7CisKK3psVXBkYXRlUnNzaToKKyAgICAvKiBVcGRhdGUgVGltZXIgaW5mb3JtYXRpb24gKi8KKyAgICBwQnNzSW5mby0+dGljayA9IHdkLT50aWNrOworCisgICAgLyogVXBkYXRlIEVSUCBpbmZvcm1hdGlvbiAqLworICAgIGlmICggKG9mZnNldCA9IHpmRmluZEVsZW1lbnQoZGV2LCBidWYsIFpNX1dMQU5fRUlEX0VSUCkpICE9IDB4ZmZmZiApCisgICAgeworICAgICAgICBwQnNzSW5mby0+ZXJwID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzIpOworICAgIH0KKworICAgIGlmKCAoczhfdClwQnNzSW5mby0+c2lnbmFsU3RyZW5ndGggPCAoczhfdClBZGRJbmZvLT5UYWlsLkRhdGEuU2lnbmFsU3RyZW5ndGgxICkKKyAgICB7CisgICAgICAgIC8qIFVwZGF0ZSBzaWduYWwgc3RyZW5ndGggKi8KKyAgICAgICAgcEJzc0luZm8tPnNpZ25hbFN0cmVuZ3RoID0gKHU4X3QpQWRkSW5mby0+VGFpbC5EYXRhLlNpZ25hbFN0cmVuZ3RoMTsKKyAgICAgICAgLyogVXBkYXRlIHNpZ25hbCBxdWFsaXR5ICovCisgICAgICAgIHBCc3NJbmZvLT5zaWduYWxRdWFsaXR5ID0gKHU4X3QpKEFkZEluZm8tPlRhaWwuRGF0YS5TaWduYWxTdHJlbmd0aDEgKiAyKTsKKworICAgICAgICAvKiBVcGRhdGUgdGhlIHNvcnRpbmcgdmFsdWUgICovCisgICAgICAgIHBCc3NJbmZvLT5zb3J0VmFsdWUgPSB6ZkNvbXB1dGVCc3NJbmZvV2VpZ2h0VmFsdWUoZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEJzc0luZm8tPnN1cHBvcnRlZFJhdGVzWzZdICsgcEJzc0luZm8tPmV4dFN1cHBvcnRlZFJhdGVzWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPkVuYWJsZUhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+ZW5hYmxlSFQ0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc0luZm8tPnNpZ25hbFN0cmVuZ3RoKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKKworemxFcnJvcjoKKworICAgIHJldHVybiAxOworCit6bEVycm9yMjoKKworICAgIHJldHVybiAyOworfQorCit2b2lkIHpmU3RhUHJvY2Vzc0JlYWNvbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogQWRkSW5mbykgLy9DV1lhbmcobSkKK3sKKyAgICAvKiBQYXJzZSBUSU0gYW5kIHNlbmQgUFMtUE9MTCBpbiBwb3dlciBzYXZpbmcgbW9kZSAqLworICAgIHN0cnVjdCB6c1dsYW5CZWFjb25GcmFtZUhlYWRlciogIHBCZWFjb25IZWFkZXI7CisgICAgc3RydWN0IHpzQnNzSW5mbyogcEJzc0luZm87CisgICAgdThfdCAgIHBCdWZbc2l6ZW9mKHN0cnVjdCB6c1dsYW5CZWFjb25GcmFtZUhlYWRlcildOworICAgIHU4X3QgICBic3NpZFs2XTsKKyAgICBpbnQgICAgcmVzOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8qIHN0YSByb3V0aW5lIGpvYnMgKi8KKyAgICB6ZlN0YVByb3RFcnBNb25pdG9yKGRldiwgYnVmKTsgIC8qIGNoZWNrIHByb3RlY3Rpb24gbW9kZSAqLworCisgICAgaWYgKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSkKKyAgICB7CisgICAgICAgIFpNX01BQ19XT1JEX1RPX0JZVEUod2QtPnN0YS5ic3NpZCwgYnNzaWQpOworCisgICAgICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHpmUnhCdWZmZXJFcXVhbFRvU3RyKGRldiwgYnVmLCBic3NpZCwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VULCA2KSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZQb3dlclNhdmluZ01nclByb2Nlc3NCZWFjb24oZGV2LCBidWYpOworICAgICAgICAgICAgICAgIHpmU3RhVXBkYXRlV21lUGFyYW1ldGVyKGRldiwgYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5ERlNFbmFibGUpCisgICAgICAgICAgICAgICAgICAgIHpmU3RhVXBkYXRlRG90MTFIREZTKGRldiwgYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5UUENFbmFibGUpCisgICAgICAgICAgICAgICAgICAgIHpmU3RhVXBkYXRlRG90MTFIVFBDKGRldiwgYnVmKTsKKyAgICAgICAgICAgICAgICAvKiB1cGRhdGUgc2lnbmFsIHN0cmVuZ3RoIGFuZCBzaWduYWwgcXVhbGl0eSAqLworICAgICAgICAgICAgICAgIHpmU3RhU2lnbmFsU3RhdGlzdGljKGRldiwgQWRkSW5mby0+VGFpbC5EYXRhLlNpZ25hbFN0cmVuZ3RoMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFkZEluZm8tPlRhaWwuRGF0YS5TaWduYWxRdWFsaXR5KTsgLy9DV1lhbmcoKykKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4QmVhY29uQ291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggemZSeEJ1ZmZlckVxdWFsVG9TdHIoZGV2LCBidWYsIGJzc2lkLCBaTV9XTEFOX0hFQURFUl9BM19PRkZTRVQsIDYpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgcmVzOworICAgICAgICAgICAgICAgIHN0cnVjdCB6c1BhcnRuZXJOb3RpZnlFdmVudCBldmVudDsKKworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIjIwMDcwOTE2IFJlY2VpdmUgb3Bwb3NpdGUgQmVhY29uISIpOworICAgICAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5pYnNzUmVjZWl2ZUJlYWNvbkNvdW50Kys7CisgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgICAgIHJlcyA9IHpmU3RhU2V0T3Bwb3NpdGVJbmZvRnJvbVJ4QnVmKGRldiwgYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoIHJlcyA9PSAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIE5ldyBwZWVyIHN0YXRpb24gZm91bmQuIE5vdGlmeSB0aGUgd3JhcHBlciBub3cKKyAgICAgICAgICAgICAgICAgICAgemZJbml0UGFydG5lck5vdGlmeUV2ZW50KGRldiwgYnVmLCAmZXZlbnQpOworICAgICAgICAgICAgICAgICAgICBpZiAod2QtPnpmY2JJYnNzUGFydG5lck5vdGlmeSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+emZjYklic3NQYXJ0bmVyTm90aWZ5KGRldiwgMSwgJmV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiB1cGRhdGUgc2lnbmFsIHN0cmVuZ3RoIGFuZCBzaWduYWwgcXVhbGl0eSAqLworICAgICAgICAgICAgICAgIHpmU3RhU2lnbmFsU3RhdGlzdGljKGRldiwgQWRkSW5mby0+VGFpbC5EYXRhLlNpZ25hbFN0cmVuZ3RoMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFkZEluZm8tPlRhaWwuRGF0YS5TaWduYWxRdWFsaXR5KTsgLy9DV1lhbmcoKykKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vZWxzZSBpZiAoIHdkLT5zdGEuaWJzc1BhcnRuZXJTdGF0dXMgPT0gWk1fSUJTU19QQVJUTkVSX0xPU1QgKQorICAgICAgICAgICAgLy8gV2h5IGRvZXMgdGhpcyBoYXBwZW4gaW4gSUJTUz8/IFRoZSBpbXBhY3Qgb2YgVmlzdGEgc2luY2UKKyAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gdGVsbCBpdCB0aGUgQlNTSUQKKyNpZiAwCisgICAgICAgICAgICBlbHNlIGlmICggd2QtPnN0YS5vcHBvc2l0ZUNvdW50ID09IDAgKQorICAgICAgICAgICAgeyAgIC8qIElCU1MgbWVyZ2UgaWYgU1NJRCBtYXRjaGVkICovCisgICAgICAgICAgICAgICAgaWYgKCAob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfU1NJRCkpICE9IDB4ZmZmZiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoICh3ZC0+c3RhLnNzaWRMZW4gPT0gem13X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpKSYmCisgICAgICAgICAgICAgICAgICAgICAgICAgKHpmUnhCdWZmZXJFcXVhbFRvU3RyKGRldiwgYnVmLCB3ZC0+c3RhLnNzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCsyLCB3ZC0+c3RhLnNzaWRMZW4pKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdHlJbmZvID0gem13X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMzQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGNhcGFiaWxpdHlJbmZvICYgWk1fQklUXzEgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHdkLT5zdGEuY2FwYWJpbGl0eVswXSAmIFpNX0JJVF80KSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhcGFiaWxpdHlJbmZvICYgWk1fQklUXzQpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIklCU1MgbWVyZ2UiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZDb3B5RnJvbVJ4QnVmZmVyKGRldiwgYnVmLCBic3NpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fSEVBREVSX0EzX09GRlNFVCwgNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmVXBkYXRlQnNzaWQoZGV2LCBic3NpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiByZXR1cm4gaWYgbm90IGNoYW5uZWwgc2NhbiAqLworICAgIGlmICggIXdkLT5zdGEuYkNoYW5uZWxTY2FuICkKKyAgICB7CisgICAgICAgIGdvdG8gemxSZXR1cm47CisgICAgfQorCisgICAgemZDb3B5RnJvbVJ4QnVmZmVyKGRldiwgYnVmLCBwQnVmLCAwLCBzaXplb2Yoc3RydWN0IHpzV2xhbkJlYWNvbkZyYW1lSGVhZGVyKSk7CisgICAgcEJlYWNvbkhlYWRlciA9IChzdHJ1Y3QgenNXbGFuQmVhY29uRnJhbWVIZWFkZXIqKSBwQnVmOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIC8vem1fZGVidWdfbXNnMSgiYnNzIGNvdW50ID0gIiwgd2QtPnN0YS5ic3NMaXN0LmJzc0NvdW50KTsKKworICAgIHBCc3NJbmZvID0gemZTdGFGaW5kQnNzSW5mbyhkZXYsIGJ1ZiwgcEJlYWNvbkhlYWRlcik7CisKKyAgICBpZiAoIHBCc3NJbmZvID09IE5VTEwgKQorICAgIHsKKyAgICAgICAgLyogQWxsb2NhdGUgYSBuZXcgZW50cnkgaWYgQlNTIG5vdCBpbiB0aGUgc2NhbiBsaXN0ICovCisgICAgICAgIHBCc3NJbmZvID0gemZCc3NJbmZvQWxsb2NhdGUoZGV2KTsKKyAgICAgICAgaWYgKHBCc3NJbmZvICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlcyA9IHpmU3RhSW5pdEJzc0luZm8oZGV2LCBidWYsIHBCZWFjb25IZWFkZXIsIHBCc3NJbmZvLCBBZGRJbmZvLCAwKTsKKyAgICAgICAgICAgIC8vemZEdW1wU1NJRChwQnNzSW5mby0+c3NpZFsxXSwgJihwQnNzSW5mby0+c3NpZFsyXSkpOworICAgICAgICAgICAgaWYgKCByZXMgIT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZCc3NJbmZvRnJlZShkZXYsIHBCc3NJbmZvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZkJzc0luZm9JbnNlcnRUb0xpc3QoZGV2LCBwQnNzSW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmVzID0gemZTdGFJbml0QnNzSW5mbyhkZXYsIGJ1ZiwgcEJlYWNvbkhlYWRlciwgcEJzc0luZm8sIEFkZEluZm8sIDEpOworICAgICAgICBpZiAocmVzID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmQnNzSW5mb1JlbW92ZUZyb21MaXN0KGRldiwgcEJzc0luZm8pOworICAgICAgICAgICAgemZCc3NJbmZvRnJlZShkZXYsIHBCc3NJbmZvKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpZHg7CisKKyAgICAgICAgICAgIC8vIEl0IHdvdWxkIHJlc2V0IHRoZSBhbGl2ZSBjb3VudGVyIGlmIHRoZSBwZWVyIHN0YXRpb24gaXMgZm91bmQhCisgICAgICAgICAgICB6ZlN0YUZpbmRGcmVlT3Bwb3NpdGUoZGV2LCAodTE2X3QgKilwQnNzSW5mby0+bWFjYWRkciwgJmlkeCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCit6bFJldHVybjoKKworICAgIHJldHVybjsKK30KKworCit2b2lkIHpmQXV0aEZyZXFDb21wbGV0ZUNiKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICh3ZC0+c3RhLmNvbm5lY3RTdGF0ZSA9PSBaTV9TVEFfQ09OTl9TVEFURV9BVVRIX0NPTVBMRVRFRCkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIlpNX1NUQV9DT05OX1NUQVRFX0FTU09DSUFURSIpOworICAgICAgICB3ZC0+c3RhLmNvbm5lY3RUaW1lciA9IHdkLT50aWNrOworICAgICAgICB3ZC0+c3RhLmNvbm5lY3RTdGF0ZSA9IFpNX1NUQV9DT05OX1NUQVRFX0FTU09DSUFURTsKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmUHJvY2Vzc0F1dGggICAgICAgICAgICAgICAqLworLyogICAgICBQcm9jZXNzIGF1dGhlbnRpY2F0ZSBtYW5hZ2VtZW50IGZyYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYXV0aCBmcmFtZSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE5vdGUgOiBBUCBhbGxvd3Mgb25lIGF1dGhlbnRpY2F0aW5nIFNUQSBhdCBhIHRpbWUsIGRvZXMgbm90ICAgICAgICAgICovCisvKiAgICAgICAgc3VwcG9ydCBtdWx0aXBsZSBhdXRoZW50aWNhdGlvbiBwcm9jZXNzLiBNYWtlIHN1cmUgICAgICAgICAgICAqLworLyogICAgICAgIGF1dGhlbnRpY2F0aW9uIHN0YXRlIG1hY2hpbmUgd2lsbCBub3QgYmUgYmxvY2tlZCBkdWUgICAgICAgICAgKi8KKy8qICAgICAgICB0byBpbmNvbXBsZXRlZCBhdXRoZW50aWNhdGlvbiBoYW5kc2hha2UuICAgICAgICAgICAgICAgICAgICAgICovCit2b2lkIHpmU3RhUHJvY2Vzc0F1dGgoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCogc3JjLCB1MTZfdCBhcElkKQoreworICAgIHN0cnVjdCB6c1dsYW5BdXRoRnJhbWVIZWFkZXIqIHBBdXRoRnJhbWU7CisgICAgdThfdCAgcEJ1ZltzaXplb2Yoc3RydWN0IHpzV2xhbkF1dGhGcmFtZUhlYWRlcildOworICAgIHUzMl90IHAxLCBwMjsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgaWYgKCAhemZTdGFJc0Nvbm5lY3RpbmcoZGV2KSApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcEF1dGhGcmFtZSA9IChzdHJ1Y3QgenNXbGFuQXV0aEZyYW1lSGVhZGVyKikgcEJ1ZjsKKyAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHBCdWYsIDAsIHNpemVvZihzdHJ1Y3QgenNXbGFuQXV0aEZyYW1lSGVhZGVyKSk7CisKKyAgICBpZiAoIHdkLT5zdGEuY29ubmVjdFN0YXRlID09IFpNX1NUQV9DT05OX1NUQVRFX0FVVEhfT1BFTiApCisgICAgeworICAgICAgICBpZiAoICh6bXdfbGUxNl90b19jcHUocEF1dGhGcmFtZS0+c2VxKSA9PSAyKSYmCisgICAgICAgICAgICAgKHptd19sZTE2X3RvX2NwdShwQXV0aEZyYW1lLT5hbGdvKSA9PSAwKSYmCisgICAgICAgICAgICAgKHptd19sZTE2X3RvX2NwdShwQXV0aEZyYW1lLT5zdGF0dXMpID09IDApICkKKyAgICAgICAgeworCisgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgd2QtPnN0YS5jb25uZWN0VGltZXIgPSB3ZC0+dGljazsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlpNX1NUQV9DT05OX1NUQVRFX0FVVEhfQ09NUExFVEVEIik7CisgICAgICAgICAgICB3ZC0+c3RhLmNvbm5lY3RTdGF0ZSA9IFpNX1NUQV9DT05OX1NUQVRFX0FVVEhfQ09NUExFVEVEOworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgLy9TZXQgY2hhbm5lbCBhY2NvcmRpbmcgdG8gQVAncyBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAvL01vdmUgdG8gaGVyZSBiZWNhdXNlIG9mIENpc2NvIDExbiBBUCBmZWF0dXJlCisgICAgICAgICAgICB6ZkNvcmVTZXRGcmVxdWVuY3lFeChkZXYsIHdkLT5mcmVxdWVuY3ksIHdkLT5CYW5kV2lkdGg0MCwKKyAgICAgICAgICAgICAgICAgICAgd2QtPkV4dE9mZnNldCwgemZBdXRoRnJlcUNvbXBsZXRlQ2IpOworCisgICAgICAgICAgICAvKiBzZW5kIGFzc29jaWF0aW9uIGZyYW1lICovCisgICAgICAgICAgICBpZiAoIHdkLT5zdGEuY29ubmVjdEJ5UmVhc3NvICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZlNlbmRNbUZyYW1lKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX1JFQVNPQ1JFUSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuYnNzaWQsIDAsIDAsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfQVNPQ1JFUSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuYnNzaWQsIDAsIDAsIDApOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoImF1dGhlbnRpY2F0aW9uIGZhaWxlZCwgc3RhdHVzID0gIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcEF1dGhGcmFtZS0+c3RhdHVzKTsKKworICAgICAgICAgICAgaWYgKHdkLT5zdGEuYXV0aE1vZGUgPT0gWk1fQVVUSF9NT0RFX0FVVE8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5iSXNTaGFyZWRLZXkgPSAxOworICAgICAgICAgICAgICAgIHpmU3RhU3RhcnRDb25uZWN0KGRldiwgd2QtPnN0YS5iSXNTaGFyZWRLZXkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlpNX1NUQV9TVEFURV9ESVNDT05ORUNUIik7CisgICAgICAgICAgICAgICAgemZTdGFDb25uZWN0RmFpbChkZXYsIFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX0FVVEhfRkFJTEVELCB3ZC0+c3RhLmJzc2lkLCAzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICggd2QtPnN0YS5jb25uZWN0U3RhdGUgPT0gWk1fU1RBX0NPTk5fU1RBVEVfQVVUSF9TSEFSRV8xICkKKyAgICB7CisgICAgICAgIGlmICggKHptd19sZTE2X3RvX2NwdShwQXV0aEZyYW1lLT5hbGdvKSA9PSAxKSAmJgorICAgICAgICAgICAgICh6bXdfbGUxNl90b19jcHUocEF1dGhGcmFtZS0+c2VxKSA9PSAyKSAmJgorICAgICAgICAgICAgICh6bXdfbGUxNl90b19jcHUocEF1dGhGcmFtZS0+c3RhdHVzKSA9PSAwKSkKKyAgICAgICAgICAgICAgLy8mJiAocEF1dGhGcmFtZS0+Y2hhbGxlbmdlVGV4dFsxXSA8PSAyNTUpICkKKyAgICAgICAgeworICAgICAgICAgICAgemZNZW1vcnlDb3B5KHdkLT5zdGEuY2hhbGxlbmdlVGV4dCwgcEF1dGhGcmFtZS0+Y2hhbGxlbmdlVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwQXV0aEZyYW1lLT5jaGFsbGVuZ2VUZXh0WzFdKzIpOworCisgICAgICAgICAgICAvKiBzZW5kIHRoZSAzcmQgYXV0aGVudGljYXRpb24gZnJhbWUgKi8KKyAgICAgICAgICAgIHAxID0gMHgzMDAwMTsKKyAgICAgICAgICAgIHAyID0gMDsKKyAgICAgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfQVVUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5ic3NpZCwgcDEsIHAyLCAwKTsKKworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHdkLT5zdGEuY29ubmVjdFRpbWVyID0gd2QtPnRpY2s7CisKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlpNX1NUQV9TVUJfU1RBVEVfQVVUSF9TSEFSRV8yIik7CisgICAgICAgICAgICB3ZC0+c3RhLmNvbm5lY3RTdGF0ZSA9IFpNX1NUQV9DT05OX1NUQVRFX0FVVEhfU0hBUkVfMjsKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJhdXRoZW50aWNhdGlvbiBmYWlsZWQsIHN0YXR1cyA9ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdXRoRnJhbWUtPnN0YXR1cyk7CisKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlpNX1NUQV9TVEFURV9ESVNDT05ORUNUIik7CisgICAgICAgICAgICB6ZlN0YUNvbm5lY3RGYWlsKGRldiwgWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfQVVUSF9GQUlMRUQsIHdkLT5zdGEuYnNzaWQsIDMpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCB3ZC0+c3RhLmNvbm5lY3RTdGF0ZSA9PSBaTV9TVEFfQ09OTl9TVEFURV9BVVRIX1NIQVJFXzIgKQorICAgIHsKKyAgICAgICAgaWYgKCAoem13X2xlMTZfdG9fY3B1KHBBdXRoRnJhbWUtPmFsZ28pID09IDEpJiYKKyAgICAgICAgICAgICAoem13X2xlMTZfdG9fY3B1KHBBdXRoRnJhbWUtPnNlcSkgPT0gNCkmJgorICAgICAgICAgICAgICh6bXdfbGUxNl90b19jcHUocEF1dGhGcmFtZS0+c3RhdHVzKSA9PSAwKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vU2V0IGNoYW5uZWwgYWNjb3JkaW5nIHRvIEFQJ3MgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgLy9Nb3ZlIHRvIGhlcmUgYmVjYXVzZSBvZiBDaXNjbyAxMW4gQVAgZmVhdHVyZQorICAgICAgICAgICAgemZDb3JlU2V0RnJlcXVlbmN5RXgoZGV2LCB3ZC0+ZnJlcXVlbmN5LCB3ZC0+QmFuZFdpZHRoNDAsCisgICAgICAgICAgICAgICAgICAgIHdkLT5FeHRPZmZzZXQsIE5VTEwpOworCisgICAgICAgICAgICAvKiBzZW5kIGFzc29jaWF0aW9uIGZyYW1lICovCisgICAgICAgICAgICB6ZlNlbmRNbUZyYW1lKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX0FTT0NSRVEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuYnNzaWQsIDAsIDAsIDApOworCisgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgd2QtPnN0YS5jb25uZWN0VGltZXIgPSB3ZC0+dGljazsKKworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiWk1fU1RBX1NVQl9TVEFURV9BU1NPQ0lBVEUiKTsKKyAgICAgICAgICAgIHdkLT5zdGEuY29ubmVjdFN0YXRlID0gWk1fU1RBX0NPTk5fU1RBVEVfQVNTT0NJQVRFOworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoImF1dGhlbnRpY2F0aW9uIGZhaWxlZCwgc3RhdHVzID0gIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcEF1dGhGcmFtZS0+c3RhdHVzKTsKKworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiWk1fU1RBX1NUQVRFX0RJU0NPTk5FQ1QiKTsKKyAgICAgICAgICAgIHpmU3RhQ29ubmVjdEZhaWwoZGV2LCBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9BVVRIX0ZBSUxFRCwgd2QtPnN0YS5ic3NpZCwgMyk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgidW5rbm93biBjYXNlIik7CisgICAgfQorfQorCit2b2lkIHpmU3RhUHJvY2Vzc0Fzb2NSZXEoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCogc3JjLCB1MTZfdCBhcElkKQoreworCisgICAgcmV0dXJuOworfQorCit2b2lkIHpmU3RhUHJvY2Vzc0Fzb2NSc3AoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHN0cnVjdCB6c1dsYW5Bc3NvRnJhbWVIZWFkZXIqIHBBc3NvRnJhbWU7CisgICAgdThfdCAgcEJ1ZltzaXplb2Yoc3RydWN0IHpzV2xhbkFzc29GcmFtZUhlYWRlcildOworICAgIHUxNl90IG9mZnNldDsKKyAgICB1MzJfdCBpOworICAgIHUzMl90IG9uZVR4U3RyZWFtQ2FwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCAhemZTdGFJc0Nvbm5lY3RpbmcoZGV2KSApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcEFzc29GcmFtZSA9IChzdHJ1Y3QgenNXbGFuQXNzb0ZyYW1lSGVhZGVyKikgcEJ1ZjsKKyAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIHBCdWYsIDAsIHNpemVvZihzdHJ1Y3QgenNXbGFuQXNzb0ZyYW1lSGVhZGVyKSk7CisKKyAgICBpZiAoIHdkLT5zdGEuY29ubmVjdFN0YXRlID09IFpNX1NUQV9DT05OX1NUQVRFX0FTU09DSUFURSApCisgICAgeworICAgICAgICBpZiAoIHBBc3NvRnJhbWUtPnN0YXR1cyA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiWk1fU1RBX1NUQVRFX0NPTk5FQ1RFRCIpOworCisgICAgICAgICAgICBpZiAod2QtPnN0YS5FbmFibGVIVCA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEud21lQ29ubmVjdGVkID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgod2QtPnN0YS53bWVFbmFibGVkICYgWk1fU1RBX1dNRV9FTkFCTEVfQklUKSAhPSAwKSAvL1dNRSBlbmFibGVkCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogQXNvYyByc3AgbWF5IGNvbnRhaW4gV01FIHBhcmFtZXRlciBlbGVtZW50ICovCisgICAgICAgICAgICAgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRXaWZpRWxlbWVudChkZXYsIGJ1ZiwgMiwgMSkpICE9IDB4ZmZmZikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIldNRSBlbmFibGUiKTsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS53bWVDb25uZWN0ZWQgPSAxOworICAgICAgICAgICAgICAgICAgICBpZiAoKHdkLT5zdGEud21lRW5hYmxlZCAmIFpNX1NUQV9VQVBTRF9FTkFCTEVfQklUKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs4KSAmIDB4ODApICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiVUFQU0QgZW5hYmxlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5xb3NJbmZvID0gd2QtPnN0YS53bWVRb3NJbmZvOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgemZTdGFVcGRhdGVXbWVQYXJhbWV0ZXIoZGV2LCBidWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvL1N0b3JlIGFzb2MgcmVzcG9uc2UgZnJhbWUgYm9keSwgZm9yIFZJU1RBIG9ubHkKKyAgICAgICAgICAgIHdkLT5zdGEuYXNvY1JzcEZyYW1lQm9keVNpemUgPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKS0yNDsKKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLmFzb2NSc3BGcmFtZUJvZHlTaXplID4gWk1fQ0FDSEVEX0ZSQU1FQk9EWV9TSVpFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuYXNvY1JzcEZyYW1lQm9keVNpemUgPSBaTV9DQUNIRURfRlJBTUVCT0RZX1NJWkU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGk9MDsgaTx3ZC0+c3RhLmFzb2NSc3BGcmFtZUJvZHlTaXplOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5hc29jUnNwRnJhbWVCb2R5W2ldID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgaSsyNCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHpmU3RhU3RvcmVBc29jUnNwSWUoZGV2LCBidWYpOworICAgICAgICAgICAgaWYgKHdkLT5zdGEuRW5hYmxlSFQgJiYKKyAgICAgICAgICAgICAgICAoKHdkLT5zdGEuaWUuSHRDYXAuSHRDYXBJbmZvICYgSFRDQVBfU3VwQ2hhbm5lbFdpZHRoU2V0KSAhPSAwKSAmJgorICAgICAgICAgICAgICAgICh3ZC0+RXh0T2Zmc2V0ICE9IDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuaHRDdHJsQmFuZHdpZHRoID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmh0Q3RybEJhbmR3aWR0aCA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vU2V0IGNoYW5uZWwgYWNjb3JkaW5nIHRvIEFQJ3MgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgLy96ZkNvcmVTZXRGcmVxdWVuY3lFeChkZXYsIHdkLT5mcmVxdWVuY3ksIHdkLT5CYW5kV2lkdGg0MCwKKyAgICAgICAgICAgIC8vICAgICAgICB3ZC0+RXh0T2Zmc2V0LCBOVUxMKTsKKworICAgICAgICAgICAgaWYgKHdkLT5zdGEuRW5hYmxlSFQgPT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+YWRkYmFDb21wbGV0ZSA9IDA7CisKKyAgICAgICAgICAgICAgICBpZiAoKHdkLT5zdGEuU1dFbmNyeXB0RW5hYmxlICYgWk1fU1dfVEtJUF9FTkNSWV9FTikgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAod2QtPnN0YS5TV0VuY3J5cHRFbmFibGUgJiBaTV9TV19XRVBfRU5DUllfRU4pID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+YWRkYmFDb3VudCA9IDE7CisgICAgICAgICAgICAgICAgICAgIHpmQWdnU2VuZEFkZGJhUmVxdWVzdChkZXYsIHdkLT5zdGEuYnNzaWQsIDAsIDApOworICAgICAgICAgICAgICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCBaTV9FVkVOVF9USU1FT1VUX0FEREJBLCAxMDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogc2V0IFJJRlMgc3VwcG9ydCAqLworICAgICAgICAgICAgaWYod2QtPnN0YS5pZS5IdEluZm8uQ2hhbm5lbEluZm8gJiBFeHRIdENhcF9SSUZTTW9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLkhUMjA0MCA9IDE7CisvLyAgICAgICAgICAgICAgICB6ZkhwU2V0UmlmcyhkZXYsIHdkLT5zdGEuRW5hYmxlSFQsIDEsICh3ZC0+c3RhLmN1cnJlbnRGcmVxdWVuY3kgPCAzMDAwKT8gMTowKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2QtPnN0YS5haWQgPSBwQXNzb0ZyYW1lLT5haWQgJiAweDNmZmY7CisgICAgICAgICAgICB3ZC0+c3RhLm9wcG9zaXRlQ291bnQgPSAwOyAgICAvKiByZXNldCBvcHBvc2l0ZSBjb3VudCAqLworICAgICAgICAgICAgemZTdGFTZXRPcHBvc2l0ZUluZm9Gcm9tUnhCdWYoZGV2LCBidWYpOworCisgICAgICAgICAgICB3ZC0+c3RhLnJ4QmVhY29uQ291bnQgPSAxNjsKKworICAgICAgICAgICAgemZDaGFuZ2VBZGFwdGVyU3RhdGUoZGV2LCBaTV9TVEFfU1RBVEVfQ09OTkVDVEVEKTsKKyAgICAgICAgICAgIHdkLT5zdGEuY29ublBvd2VySW5IYWxmRGJtID0gemZIcEdldFRyYW5zbWl0UG93ZXIoZGV2KTsKKyAgICAgICAgICAgIGlmICh3ZC0+emZjYkNvbm5lY3ROb3RpZnkgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5FbmFibGVIVCAhPSAwKSAvKiAxMW4gKi8KKyAgICAgICAgICAgIAl7CisgICAgCQkgICAgICAgIG9uZVR4U3RyZWFtQ2FwID0gKHpmSHBDYXBhYmlsaXR5KGRldikgJiBaTV9IUF9DQVBfMTFOX09ORV9UWF9TVFJFQU0pOworICAgIAkJICAgICAgICBpZiAod2QtPnN0YS5odEN0cmxCYW5kd2lkdGggPT0gMSkgLyogSFQ0MCovCisgICAgCQkgICAgICAgIHsKKyAgICAJCQkJCWlmKG9uZVR4U3RyZWFtQ2FwKSAvKiBvbmUgVHggc3RyZWFtICovCisgICAgCQkJCSAgICB7CisgICAgCQkJCSAgICAgICAgaWYgKHdkLT5zdGEuU0c0MCkKKyAgICAJCQkJICAgICAgICB7CisgICAgCQkJCSAgICAgICAgICAgIHdkLT5DdXJyZW50VHhSYXRlS2JwcyA9IDE1MDAwMDsKKyAgICAJCQkJCQkgICAgd2QtPkN1cnJlbnRSeFJhdGVLYnBzID0gMzAwMDAwOworICAgIAkJCQkgICAgICAgIH0KKyAgICAJCQkJICAgICAgICBlbHNlCisgICAgCQkJCSAgICAgICAgeworICAgIAkJCQkgICAgICAgICAgICB3ZC0+Q3VycmVudFR4UmF0ZUticHMgPSAxMzUwMDA7CisgICAgCQkJCQkJICAgIHdkLT5DdXJyZW50UnhSYXRlS2JwcyA9IDI3MDAwMDsKKyAgICAJCQkJICAgICAgICB9CisgICAgCQkJCSAgICB9CisgICAgCQkJCSAgICBlbHNlIC8qIFR3byBUeCBzdHJlYW1zICovCisgICAgCQkJCSAgICB7CisgICAgCQkJCSAgICAgICAgaWYgKHdkLT5zdGEuU0c0MCkKKyAgICAJCQkJICAgICAgICB7CisgICAgCQkJCSAgICAgICAgICAgIHdkLT5DdXJyZW50VHhSYXRlS2JwcyA9IDMwMDAwMDsKKyAgICAJCQkJCQkgICAgd2QtPkN1cnJlbnRSeFJhdGVLYnBzID0gMzAwMDAwOworICAgIAkJCQkgICAgICAgIH0KKyAgICAJCQkJICAgICAgICBlbHNlCisgICAgCQkJCSAgICAgICAgeworICAgIAkJCQkgICAgICAgICAgICB3ZC0+Q3VycmVudFR4UmF0ZUticHMgPSAyNzAwMDA7CisgICAgCQkJCQkJICAgIHdkLT5DdXJyZW50UnhSYXRlS2JwcyA9IDI3MDAwMDsKKyAgICAJCQkJICAgICAgICB9CisgICAgCQkJCSAgICB9CisgICAgCQkgICAgICAgIH0KKyAgICAJCSAgICAgICAgZWxzZSAvKiBIVDIwICovCisgICAgCQkgICAgICAgIHsKKyAgICAJCSAgICAgICAgICAgIGlmKG9uZVR4U3RyZWFtQ2FwKSAvKiBvbmUgVHggc3RyZWFtICovCisgICAgCQkJCSAgICB7CisgICAgCQkJCSAgICAgICAgd2QtPkN1cnJlbnRUeFJhdGVLYnBzID0gNjUwMDAwOworICAgIAkJCQkJCXdkLT5DdXJyZW50UnhSYXRlS2JwcyA9IDEzMDAwMDsKKyAgICAJCQkJICAgIH0KKyAgICAJCQkJICAgIGVsc2UgLyogVHdvIFR4IHN0cmVhbXMgKi8KKyAgICAJCQkJICAgIHsKKyAgICAJCQkJICAgICAgICB3ZC0+Q3VycmVudFR4UmF0ZUticHMgPSAxMzAwMDA7CisgICAgCQkJCQkgICAgd2QtPkN1cnJlbnRSeFJhdGVLYnBzID0gMTMwMDAwOworICAgIAkJCQkgICAgfQorICAgIAkJICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgLyogMTFhYmcgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLmNvbm5lY3Rpb25fMTFiICE9IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5DdXJyZW50VHhSYXRlS2JwcyA9IDExMDAwOworICAgIAkJCSAgICAgICAgd2QtPkN1cnJlbnRSeFJhdGVLYnBzID0gMTEwMDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+Q3VycmVudFR4UmF0ZUticHMgPSA1NDAwMDsKKyAgICAJCQkgICAgICAgIHdkLT5DdXJyZW50UnhSYXRlS2JwcyA9IDU0MDAwOworICAgIAkJCSAgICB9CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICB3ZC0+emZjYkNvbm5lY3ROb3RpZnkoZGV2LCBaTV9TVEFUVVNfTUVESUFfQ09OTkVDVCwgd2QtPnN0YS5ic3NpZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3ZC0+c3RhLmNvbm5lY3RCeVJlYXNzbyA9IFRSVUU7CisgICAgICAgICAgICB3ZC0+c3RhLmZhaWxDbnRPZlJlYXNzbyA9IDA7CisKKyAgICAgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JDb25uZWN0Tm90aWZ5KGRldik7CisKKyAgICAgICAgICAgIC8qIERpc2FibGUgaGVyZSBiZWNhdXNlIGZpeGVkIHJhdGUgaXMgb25seSBmb3IgdGVzdCwgVEJELiAqLworICAgICAgICAgICAgLy9pZiAod2QtPnN0YS5FbmFibGVIVCkKKyAgICAgICAgICAgIC8veworICAgICAgICAgICAgLy8gICAgd2QtPnR4TUNTID0gNzsgLy9SYXRlID0gNjVNYnBzCisgICAgICAgICAgICAvLyAgICB3ZC0+dHhNVCA9IDI7IC8vIEh0IHJhdGUKKyAgICAgICAgICAgIC8vICAgIHdkLT5lbmFibGVBZ2dyZWdhdGlvbiA9IDI7IC8vIEVuYWJsZSBBZ2dyZWdhdGlvbgorICAgICAgICAgICAgLy99CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJhc3NvY2lhdGlvbiBmYWlsZWQsIHN0YXR1cyA9ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBBc3NvRnJhbWUtPnN0YXR1cyk7CisKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlpNX1NUQV9TVEFURV9ESVNDT05ORUNUIik7CisgICAgICAgICAgICB3ZC0+c3RhLmNvbm5lY3RCeVJlYXNzbyA9IEZBTFNFOworICAgICAgICAgICAgemZTdGFDb25uZWN0RmFpbChkZXYsIFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX0FTT0NfRkFJTEVELCB3ZC0+c3RhLmJzc2lkLCAzKTsKKyAgICAgICAgfQorICAgIH0KKworfQorCit2b2lkIHpmU3RhU3RvcmVBc29jUnNwSWUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHUxNl90IG9mZnNldDsKKyAgICB1MzJfdCBpOworICAgIHUxNl90IGxlbmd0aDsKKyAgICB1OF90ICAqaHRjYXA7CisgICAgdThfdCAgYXNvY0J3NDAgPSAwOworICAgIHU4X3QgIGFzb2NFeHRPZmZzZXQgPSAwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZm9yIChpPTA7IGk8d2QtPnN0YS5hc29jUnNwRnJhbWVCb2R5U2l6ZTsgaSsrKQorICAgIHsKKyAgICAgICAgd2QtPnN0YS5hc29jUnNwRnJhbWVCb2R5W2ldID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgaSsyNCk7CisgICAgfQorCisgICAgLyogSFQgY2FwYWJpbGl0aWVzOiAyOCBvY3RldHMgKi8KKyAgICBpZiAoICAgICgod2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5ID4gMzAwMCkgJiYgISh3ZC0+c3VwcG9ydE1vZGUgJiBaTV9XSVJFTEVTU19NT0RFXzVfTikpCisgICAgICAgICB8fCAoKHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeSA8IDMwMDApICYmICEod2QtPnN1cHBvcnRNb2RlICYgWk1fV0lSRUxFU1NfTU9ERV8yNF9OKSkgKQorICAgIHsKKyAgICAgICAgLyogbm90IDExbiBBUCAqLworICAgICAgICBodGNhcCA9ICh1OF90ICopJndkLT5zdGEuaWUuSHRDYXA7CisgICAgICAgIGZvciAoaT0wOyBpPDI4OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGh0Y2FwW2ldID0gMDsKKyAgICAgICAgfQorICAgICAgICB3ZC0+QmFuZFdpZHRoNDAgPSAwOworICAgICAgICB3ZC0+RXh0T2Zmc2V0ID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICgob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfSFRfQ0FQQUJJTElUWSkpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgIC8qIGF0aGVyb3MgcHJlIG4gKi8KKyAgICAgICAgem1fZGVidWdfbXNnMCgiYXRoZXJvcyBwcmUgbiIpOworICAgICAgICBodGNhcCA9ICh1OF90ICopJndkLT5zdGEuaWUuSHRDYXA7CisgICAgICAgIGh0Y2FwWzBdID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KTsKKyAgICAgICAgaHRjYXBbMV0gPSAyNjsKKyAgICAgICAgZm9yIChpPTE7IGk8PTI2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGh0Y2FwW2krMV0gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQgKyBpKTsKKyAgICAgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMSwgIkFTT0M6ICBIVCBDYXBhYmlsaXRpZXMsIGh0Y2FwPSIsIGh0Y2FwW2krMV0pOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX1BSRU4yX0VJRF9IVENBUEFCSUxJVFkpKSAhPSAweGZmZmYpCisgICAgeworICAgICAgICAvKiBwcmUgbiAyLjAgc3RhbmRhcmQgKi8KKyAgICAgICAgem1fZGVidWdfbXNnMCgicHJlIG4gMi4wIHN0YW5kYXJkIik7CisgICAgICAgIGh0Y2FwID0gKHU4X3QgKikmd2QtPnN0YS5pZS5IdENhcDsKKyAgICAgICAgZm9yIChpPTA7IGk8Mjg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaHRjYXBbaV0gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQgKyBpKTsKKyAgICAgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMSwgIkFTT0M6ICBIVCBDYXBhYmlsaXRpZXMsIGh0Y2FwPSIsIGh0Y2FwW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBub3QgMTFuIEFQICovCisgICAgICAgIGh0Y2FwID0gKHU4X3QgKikmd2QtPnN0YS5pZS5IdENhcDsKKyAgICAgICAgZm9yIChpPTA7IGk8Mjg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaHRjYXBbaV0gPSAwOworICAgICAgICB9CisgICAgICAgIHdkLT5CYW5kV2lkdGg0MCA9IDA7CisgICAgICAgIHdkLT5FeHRPZmZzZXQgPSAwOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXNvY0J3NDAgPSAodThfdCkoKHdkLT5zdGEuaWUuSHRDYXAuSHRDYXBJbmZvICYgSFRDQVBfU3VwQ2hhbm5lbFdpZHRoU2V0KSA+PiAxKTsKKworICAgIC8qIEhUIGluZm9ybWF0aW9uICovCisgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9FWFRFTkRFRF9IVF9DQVBBQklMSVRZKSkgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgLyogYXRoZXJvcyBwcmUgbiAqLworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJhdGhlcm9zIHByZSBuIEhUSU5GTyIpOworICAgICAgICBsZW5ndGggPSAyMjsKKyAgICAgICAgaHRjYXAgPSAodThfdCAqKSZ3ZC0+c3RhLmllLkh0SW5mbzsKKyAgICAgICAgaHRjYXBbMF0gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpOworICAgICAgICBodGNhcFsxXSA9IDIyOworICAgICAgICBmb3IgKGk9MTsgaTw9MjI7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaHRjYXBbaSsxXSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCArIGkpOworICAgICAgICAgICAgem1fbXNnMl9tbShaTV9MVl8xLCAiQVNPQzogIEhUIEluZm8sIGh0aW5mbz0iLCBodGNhcFtpKzFdKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICgob2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9QUkVOMl9FSURfSFRJTkZPUk1BVElPTikpICE9IDB4ZmZmZikKKyAgICB7CisgICAgICAgIC8qIHByZSBuIDIuMCBzdGFuZGFyZCAqLworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJwcmUgbiAyLjAgc3RhbmRhcmQgSFRJTkZPIik7CisgICAgICAgIGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCArIDEpOworICAgICAgICBodGNhcCA9ICh1OF90ICopJndkLT5zdGEuaWUuSHRJbmZvOworICAgICAgICBmb3IgKGk9MDsgaTwyNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBodGNhcFtpXSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCArIGkpOworICAgICAgICAgICAgem1fbXNnMl9tbShaTV9MVl8xLCAiQVNPQzogIEhUIEluZm8sIGh0aW5mbz0iLCBodGNhcFtpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgibm8gSFRJTkZPIik7CisgICAgICAgIGh0Y2FwID0gKHU4X3QgKikmd2QtPnN0YS5pZS5IdEluZm87CisgICAgICAgIGZvciAoaT0wOyBpPDI0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGh0Y2FwW2ldID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBhc29jRXh0T2Zmc2V0ID0gd2QtPnN0YS5pZS5IdEluZm8uQ2hhbm5lbEluZm8gJiBFeHRIdENhcF9FeHRDaGFubmVsT2Zmc2V0QmVsb3c7CisKKyAgICBpZiAoKHdkLT5zdGEuRW5hYmxlSFQgPT0gMSkgJiYgKGFzb2NCdzQwID09IDEpICYmICgoYXNvY0V4dE9mZnNldCA9PSAxKSB8fCAoYXNvY0V4dE9mZnNldCA9PSAzKSkpCisgICAgeworICAgICAgICB3ZC0+QmFuZFdpZHRoNDAgPSBhc29jQnc0MDsKKyAgICAgICAgd2QtPkV4dE9mZnNldCA9IGFzb2NFeHRPZmZzZXQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHdkLT5CYW5kV2lkdGg0MCA9IDA7CisgICAgICAgIHdkLT5FeHRPZmZzZXQgPSAwOworICAgIH0KKworICAgIHJldHVybjsKK30KKwordm9pZCB6ZlN0YVByb2Nlc3NEZWF1dGgoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHUxNl90IGFwTWFjQWRkclszXTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgLyogU1RBIDogaWYgU0E9Y29ubmVjdGVkIEFQIHRoZW4gZGlzY29ubmVjdCB3aXRoIEFQICovCisgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSApCisgICAgeworICAgICAgICBhcE1hY0FkZHJbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BM19PRkZTRVQpOworICAgICAgICBhcE1hY0FkZHJbMV0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BM19PRkZTRVQrMik7CisgICAgICAgIGFwTWFjQWRkclsyXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EzX09GRlNFVCs0KTsKKyAgCWlmICgoYXBNYWNBZGRyWzBdID09IHdkLT5zdGEuYnNzaWRbMF0pICYmIChhcE1hY0FkZHJbMV0gPT0gd2QtPnN0YS5ic3NpZFsxXSkgJiYgKGFwTWFjQWRkclsyXSA9PSB3ZC0+c3RhLmJzc2lkWzJdKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHpmd0J1ZkdldFNpemUoZGV2LCBidWYpID49IDI0KzIpIC8vbm90IGEgbWFsZm9ybWVkIGZyYW1lCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCB6ZlN0YUlzQ29ubmVjdGVkKGRldikgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgemZTdGFDb25uZWN0RmFpbChkZXYsIFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX0RFQVVUSCwgd2QtPnN0YS5ic3NpZCwgMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHpmU3RhSXNDb25uZWN0aW5nKGRldikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6ZlN0YUNvbm5lY3RGYWlsKGRldiwgWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfQVVUSF9GQUlMRUQsIHdkLT5zdGEuYnNzaWQsIDMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUyApCisgICAgeworICAgICAgICB1MTZfdCBwZWVyTWFjQWRkclszXTsKKyAgICAgICAgdThfdCAgcGVlcklkeDsKKyAgICAgICAgczhfdCAgcmVzOworCisgICAgICAgIGlmICggemZTdGFJc0Nvbm5lY3RlZChkZXYpICkKKyAgICAgICAgeworICAgICAgICAgICAgcGVlck1hY0FkZHJbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQpOworICAgICAgICAgICAgcGVlck1hY0FkZHJbMV0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQrMik7CisgICAgICAgICAgICBwZWVyTWFjQWRkclsyXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EyX09GRlNFVCs0KTsKKworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHJlcyA9IHpmU3RhRmluZE9wcG9zaXRlQnlNQUNBZGRyKGRldiwgcGVlck1hY0FkZHIsICZwZWVySWR4KTsKKyAgICAgICAgICAgIGlmICggcmVzID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEub3Bwb3NpdGVJbmZvW3BlZXJJZHhdLmFsaXZlQ291bnRlciA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIHpmU3RhUHJvY2Vzc0Rpc2Fzb2MoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHUxNl90IGFwTWFjQWRkclszXTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIFNUQSA6IGlmIFNBPWNvbm5lY3RlZCBBUCB0aGVuIGRpc2Nvbm5lY3Qgd2l0aCBBUCAqLworICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgIHsKKyAgICAgICAgYXBNYWNBZGRyWzBdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VUKTsKKyAgICAgICAgYXBNYWNBZGRyWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VUKzIpOworICAgICAgICBhcE1hY0FkZHJbMl0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BM19PRkZTRVQrNCk7CisKKyAgICAgICAgaWYgKChhcE1hY0FkZHJbMF0gPT0gd2QtPnN0YS5ic3NpZFswXSkgJiYgKGFwTWFjQWRkclsxXSA9PSB3ZC0+c3RhLmJzc2lkWzFdKSAmJiAoYXBNYWNBZGRyWzJdID09IHdkLT5zdGEuYnNzaWRbMl0pKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoemZ3QnVmR2V0U2l6ZShkZXYsIGJ1ZikgPj0gMjQrMikgLy9ub3QgYSBtYWxmb3JtZWQgZnJhbWUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIHpmU3RhSXNDb25uZWN0ZWQoZGV2KSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6ZlN0YUNvbm5lY3RGYWlsKGRldiwgWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfRElTQVNPQywgd2QtPnN0YS5ic3NpZCwgMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHpmU3RhQ29ubmVjdEZhaWwoZGV2LCBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9BU09DX0ZBSUxFRCwgd2QtPnN0YS5ic3NpZCwgMyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmUHJvY2Vzc1Byb2JlUmVxICAgICAgICAgICAqLworLyogICAgICBQcm9jZXNzIHByb2JlIHJlcXVlc3QgbWFuYWdlbWVudCBmcmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYXV0aCBmcmFtZSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZTdGFQcm9jZXNzUHJvYmVSZXEoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCogc3JjKQoreworICAgIHUxNl90IG9mZnNldDsKKyAgICB1OF90IGxlbjsKKyAgICB1MTZfdCBpLCBqOworICAgIHUxNl90IHNlbmRGbGFnOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogY2hlY2sgbW9kZSA6IEFQL0lCU1MgKi8KKyAgICBpZiAoKHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0FQKSB8fCAod2QtPndsYW5Nb2RlICE9IFpNX01PREVfSUJTUykpCisgICAgeworICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzMsICJJZ25vcmUgcHJvYmUgcmVxIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBjaGVjayBTU0lEICovCisgICAgaWYgKChvZmZzZXQgPSB6ZkZpbmRFbGVtZW50KGRldiwgYnVmLCBaTV9XTEFOX0VJRF9TU0lEKSkgPT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgem1fbXNnMF9tbShaTV9MVl8zLCAicHJvYmUgcmVxIFNTSUQgbm90IGZvdW5kIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSk7CisKKyAgICBmb3IgKGk9MDsgaTxaTV9NQVhfQVBfU1VQUE9SVDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKCh3ZC0+YXAuYXBCaXRtYXAgJiAoaTw8aSkpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlbmRGbGFnID0gMDsKKyAgICAgICAgICAgIC8qIGJvYXJkY2FzdCBTU0lEICovCisgICAgICAgICAgICBpZiAoKGxlbiA9PSAwKSAmJiAod2QtPmFwLmhpZGVTc2lkW2ldID09IDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlbmRGbGFnID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIE5vdCBicm9hZGNhc3QgU1NJRCAqLworICAgICAgICAgICAgZWxzZSBpZiAod2QtPmFwLnNzaWRMZW5baV0gPT0gbGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaj0wOyBqPGxlbjsgaisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxK2opCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gd2QtPmFwLnNzaWRbaV1bal0pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChqID09IGxlbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNlbmRGbGFnID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2VuZEZsYWcgPT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBTZW5kIHByb2JlIHJlc3BvbnNlICovCisgICAgICAgICAgICAgICAgemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9QUk9CRVJTUCwgc3JjLCBpLCAwLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCB6ZlN0YVByb2Nlc3NQcm9iZVJzcCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogQWRkSW5mbykKK3sKKyAgICAvKiByZXR1cm4gaWYgbm90IGNoYW5uZWwgc2NhbiAqLworICAgIC8vIFByb2JlIHJlc3BvbnNlIGlzIHNlbnQgd2l0aCB1bmljYXN0LiBJcyB0aGlzIHJlcXVpcmVkPworICAgIC8vIElCU1Mgd291bGQgc2VuZCBwcm9iZSByZXF1ZXN0IGFuZCB0aGUgY29kZSBiZWxvdyB3b3VsZCBwcmV2ZW50CisgICAgLy8gdGhlIHByb2JlIHJlc3BvbnNlIGZyb20gaGFuZGxpbmcuCisgICAgI2lmIDAKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoICF3ZC0+c3RhLmJDaGFubmVsU2NhbiApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgICNlbmRpZgorCisgICAgemZQcm9jZXNzUHJvYmVSc3AoZGV2LCBidWYsIEFkZEluZm8pOworfQorCit2b2lkIHpmSUJTU1NldHVwQnNzRGVzYyh6ZGV2X3QgKmRldikKK3sKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgdThfdCBpOworI2VuZGlmCisgICAgc3RydWN0IHpzQnNzSW5mbyAqcEJzc0luZm87CisgICAgdTE2X3Qgb2Zmc2V0ID0gMDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHBCc3NJbmZvID0gJndkLT5zdGEuaWJzc0Jzc0Rlc2M7CisgICAgemZaZXJvTWVtb3J5KCh1OF90ICopcEJzc0luZm8sIHNpemVvZihzdHJ1Y3QgenNCc3NJbmZvKSk7CisKKyAgICBwQnNzSW5mby0+c2lnbmFsU3RyZW5ndGggPSAxMDA7CisKKyAgICB6Zk1lbW9yeUNvcHkoKHU4X3QgKilwQnNzSW5mby0+bWFjYWRkciwgKHU4X3QgKil3ZC0+bWFjQWRkciw2KTsKKyAgICB6Zk1lbW9yeUNvcHkoKHU4X3QgKilwQnNzSW5mby0+YnNzaWQsICh1OF90ICopd2QtPnN0YS5ic3NpZCwgNik7CisKKyAgICBwQnNzSW5mby0+YmVhY29uSW50ZXJ2YWxbMF0gPSAodThfdCkod2QtPmJlYWNvbkludGVydmFsKSA7CisgICAgcEJzc0luZm8tPmJlYWNvbkludGVydmFsWzFdID0gKHU4X3QpKCh3ZC0+YmVhY29uSW50ZXJ2YWwpID4+IDgpIDsKKworICAgIHBCc3NJbmZvLT5jYXBhYmlsaXR5WzBdID0gd2QtPnN0YS5jYXBhYmlsaXR5WzBdOworICAgIHBCc3NJbmZvLT5jYXBhYmlsaXR5WzFdID0gd2QtPnN0YS5jYXBhYmlsaXR5WzFdOworCisgICAgcEJzc0luZm8tPnNzaWRbMF0gPSBaTV9XTEFOX0VJRF9TU0lEOworICAgIHBCc3NJbmZvLT5zc2lkWzFdID0gd2QtPnN0YS5zc2lkTGVuOworICAgIHpmTWVtb3J5Q29weSgodThfdCAqKSZwQnNzSW5mby0+c3NpZFsyXSwgKHU4X3QgKil3ZC0+c3RhLnNzaWQsIHdkLT5zdGEuc3NpZExlbik7CisgICAgemZNZW1vcnlDb3B5KCh1OF90ICopJnBCc3NJbmZvLT5mcmFtZUJvZHlbb2Zmc2V0XSwgKHU4X3QgKilwQnNzSW5mby0+c3NpZCwKKyAgICAgICAgICAgICAgICAgd2QtPnN0YS5zc2lkTGVuICsgMik7CisgICAgb2Zmc2V0ICs9IHdkLT5zdGEuc3NpZExlbiArIDI7CisKKyAgICAvKiBzdXBwb3J0IHJhdGUgKi8KKworICAgIC8qIERTIHBhcmFtZXRlciBzZXQgKi8KKyAgICBwQnNzSW5mby0+Y2hhbm5lbCA9IHpmQ2hGcmVxVG9OdW0od2QtPmZyZXF1ZW5jeSwgTlVMTCk7CisgICAgcEJzc0luZm8tPmZyZXF1ZW5jeSA9IHdkLT5mcmVxdWVuY3k7CisgICAgcEJzc0luZm8tPmF0aW1XaW5kb3cgPSB3ZC0+c3RhLmF0aW1XaW5kb3c7CisKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgaWYgKCB3ZC0+c3RhLmF1dGhNb2RlID09IFpNX0FVVEhfTU9ERV9XUEEyUFNLICkKKyAgICB7CisgICAgICAgIHU4X3QgcnNuWzY0XT0KKyAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBFbGVtZW50IElEICovCisgICAgICAgICAgICAgICAgICAgIDB4MzAsCisgICAgICAgICAgICAgICAgICAgIC8qIExlbmd0aCAqLworICAgICAgICAgICAgICAgICAgICAweDE0LAorICAgICAgICAgICAgICAgICAgICAvKiBWZXJzaW9uICovCisgICAgICAgICAgICAgICAgICAgIDB4MDEsIDB4MDAsCisgICAgICAgICAgICAgICAgICAgIC8qIEdyb3VwIENpcGhlciBTdWl0ZSwgZGVmYXVsdD1US0lQICovCisgICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4MGYsIDB4YWMsIDB4MDQsCisgICAgICAgICAgICAgICAgICAgIC8qIFBhaXJ3aXNlIENpcGhlciBTdWl0ZSBDb3VudCAqLworICAgICAgICAgICAgICAgICAgICAweDAxLCAweDAwLAorICAgICAgICAgICAgICAgICAgICAvKiBQYWlyd2lzZSBDaXBoZXIgU3VpdGUsIGRlZmF1bHQ9VEtJUCAqLworICAgICAgICAgICAgICAgICAgICAweDAwLCAweDBmLCAweGFjLCAweDAyLAorICAgICAgICAgICAgICAgICAgICAvKiBBdXRoZW50aWNhdGlvbiBhbmQgS2V5IE1hbmFnZW1lbnQgU3VpdGUgQ291bnQgKi8KKyAgICAgICAgICAgICAgICAgICAgMHgwMSwgMHgwMCwKKyAgICAgICAgICAgICAgICAgICAgLyogQXV0aGVudGljYXRpb24gdHlwZSwgZGVmYXVsdD1QU0sgKi8KKyAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwZiwgMHhhYywgMHgwMiwKKyAgICAgICAgICAgICAgICAgICAgLyogUlNOIGNhcGFiaWxpdHkgKi8KKyAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwMAorICAgICAgICB9OworCisgICAgICAgIC8qIE92ZXJ3cml0ZSBHcm91cCBDaXBoZXIgU3VpdGUgYnkgQVAncyBzZXR0aW5nICovCisgICAgICAgIHpmTWVtb3J5Q29weShyc24rNCwgemdXcGEyQWVzT3VpLCA0KTsKKworICAgICAgICBpZiAoIHdkLT5zdGEud2VwU3RhdHVzID09IFpNX0VOQ1JZUFRJT05fQUVTICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogT3ZlcndyaXRlIFBhaXJ3aXNlIENpcGhlciBTdWl0ZSBieSBBRVMgKi8KKyAgICAgICAgICAgIHpmTWVtb3J5Q29weShyc24rMTAsIHpnV3BhMkFlc091aSwgNCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSU04gZWxlbWVudCBpZAorICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5W29mZnNldCsrXSA9IFpNX1dMQU5fRUlEX1JTTl9JRSA7CisKKyAgICAgICAgLy8gUlNOIGxlbmd0aAorICAgICAgICBwQnNzSW5mby0+ZnJhbWVCb2R5W29mZnNldCsrXSA9IHJzblsxXSA7CisKKyAgICAgICAgLy8gUlNOIGluZm9ybWF0aW9uCisgICAgICAgIGZvcihpPTA7IGk8cnNuWzFdOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBCc3NJbmZvLT5mcmFtZUJvZHlbb2Zmc2V0KytdID0gcnNuW2krMl0gOworICAgICAgICB9CisKKyAgICAgICAgemZNZW1vcnlDb3B5KHBCc3NJbmZvLT5yc25JZSwgcnNuLCByc25bMV0rMik7CisgICAgfQorI2VuZGlmCit9CisKK3ZvaWQgemZJYnNzQ29ubmVjdE5ldHdvcmsoemRldl90KiBkZXYpCit7CisgICAgc3RydWN0IHpzQnNzSW5mbyogcEJzc0luZm87CisgICAgc3RydWN0IHpzQnNzSW5mbyB0bXBCc3NJbmZvOworICAgIHU4X3QgICBtYWNBZGRyWzZdLCBic3NpZFs2XSwgYnNzTm90Rm91bmQgPSBUUlVFOworICAgIHUxNl90ICBpLCBqPTEwMDsKKyAgICB1MTZfdCAgazsKKyAgICBzdHJ1Y3QgenNQYXJ0bmVyTm90aWZ5RXZlbnQgZXZlbnQ7CisgICAgdTMyX3QgIGNoYW5uZWxGbGFnczsKKyAgICB1MTZfdCAgb3Bwb3NpdGVXZXBTdGF0dXM7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgLyogY2hhbmdlIHN0YXRlIHRvIENPTk5FQ1RJTkcgYW5kIHN0b3AgdGhlIGNoYW5uZWwgc2Nhbm5pbmcgKi8KKyAgICB6ZkNoYW5nZUFkYXB0ZXJTdGF0ZShkZXYsIFpNX1NUQV9TVEFURV9DT05ORUNUSU5HKTsKKyAgICB6ZlBvd2VyU2F2aW5nTWdyV2FrZXVwKGRldik7CisKKyAgICAvKiBTZXQgVHhRcyBDV01JTiwgQ1dNQVgsIEFJRlMgYW5kIFRYTyB0byBXTUUgU1RBIGRlZmF1bHQuICovCisgICAgemZVcGRhdGVEZWZhdWx0UW9zUGFyYW1ldGVyKGRldiwgMCk7CisKKyAgICB3ZC0+c3RhLmJQcm90ZWN0aW9uTW9kZSA9IEZBTFNFOworICAgIHpmSHBTZXRTbG90VGltZShkZXYsIDEpOworCisgICAgLyogRVNTIGJpdCBvZmYgKi8KKyAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gJj0gflpNX0JJVF8wOworICAgIC8qIElCU1MgYml0IG9uICovCisgICAgd2QtPnN0YS5jYXBhYmlsaXR5WzBdIHw9IFpNX0JJVF8xOworICAgIC8qIG5vdCBub3QgdXNlIHNob3J0IHNsb3QgdGltZSAqLworICAgIHdkLT5zdGEuY2FwYWJpbGl0eVsxXSAmPSB+Wk1fQklUXzI7CisKKyAgICB3ZC0+c3RhLndtZUNvbm5lY3RlZCA9IDA7CisgICAgd2QtPnN0YS5wc01nci50ZW1wV2FrZVVwID0gMDsKKyAgICB3ZC0+c3RhLnFvc0luZm8gPSAwOworICAgIHdkLT5zdGEuRW5hYmxlSFQgPSAwOworICAgIHdkLT5CYW5kV2lkdGg0MCA9IDA7CisgICAgd2QtPkV4dE9mZnNldCA9IDA7CisKKyAgICBpZiAoIHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudCApCisgICAgeworICAgICAgICAvL1Jlb3JkZXIgQnNzTGlzdCBieSBSU1NJLS1DV1lhbmcoKykKKyAgICAgICAgemZCc3NJbmZvUmVvcmRlckxpc3QoZGV2KTsKKworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIHBCc3NJbmZvID0gd2QtPnN0YS5ic3NMaXN0LmhlYWQ7CisKKyAgICAgICAgZm9yKGk9MDsgaTx3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gMjAwNzA4MDYgIzEgUHJpdmFjeSBiaXQKKyAgICAgICAgICAgIGlmICggcEJzc0luZm8tPmNhcGFiaWxpdHlbMF0gJiBaTV9CSVRfNCApCisgICAgICAgICAgICB7IC8vIFByaXZhY3kgSWJzcyBuZXR3b3JrCisvLyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJQcml2YWN5IGJpdCBvbiIpOworICAgICAgICAgICAgICAgIG9wcG9zaXRlV2VwU3RhdHVzID0gWk1fRU5DUllQVElPTl9XRVBfRU5BQkxFRDsKKworICAgICAgICAgICAgICAgIGlmICggcEJzc0luZm8tPnJzbkllWzFdICE9IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAocEJzc0luZm8tPnJzbkllWzddID09IDB4MDEpIHx8IChwQnNzSW5mby0+cnNuSWVbN10gPT0gMHgwNSkgKQorICAgICAgICAgICAgICAgICAgICB7IC8vIFdFUC00MCAmIFdFUC0xMDQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiV0VQNDAgb3IgV0VQMTA0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBvcHBvc2l0ZVdlcFN0YXR1cyA9IFpNX0VOQ1JZUFRJT05fV0VQX0VOQUJMRUQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHBCc3NJbmZvLT5yc25JZVs3XSA9PSAweDAyICkKKyAgICAgICAgICAgICAgICAgICAgeyAvLyBUS0lQCisvLyAgICAgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlRLSVAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wcG9zaXRlV2VwU3RhdHVzID0gWk1fRU5DUllQVElPTl9US0lQOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBwQnNzSW5mby0+cnNuSWVbN10gPT0gMHgwNCApCisgICAgICAgICAgICAgICAgICAgIHsgLy8gQUVTCisvLyAgICAgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkNDTVAtQUVTIik7CisgICAgICAgICAgICAgICAgICAgICAgICBvcHBvc2l0ZVdlcFN0YXR1cyA9IFpNX0VOQ1JZUFRJT05fQUVTOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworLy8gICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiUHJpdmFjeSBiaXQgb2ZmIik7CisgICAgICAgICAgICAgICAgb3Bwb3NpdGVXZXBTdGF0dXMgPSBaTV9FTkNSWVBUSU9OX1dFUF9ESVNBQkxFRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCAoemZNZW1vcnlJc0VxdWFsKCYocEJzc0luZm8tPnNzaWRbMl0pLCB3ZC0+c3RhLnNzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5zc2lkTGVuKSkmJgorICAgICAgICAgICAgICAgICAod2QtPnN0YS5zc2lkTGVuID09IHBCc3NJbmZvLT5zc2lkWzFdKSYmCisgICAgICAgICAgICAgICAgIChvcHBvc2l0ZVdlcFN0YXR1cyA9PSB3ZC0+c3RhLndlcFN0YXR1cykgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIENoZWNrIHN1cHBvcnQgbW9kZSAqLworICAgICAgICAgICAgICAgIGlmIChwQnNzSW5mby0+ZnJlcXVlbmN5ID4gMzAwMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoICAgKHBCc3NJbmZvLT5FbmFibGVIVCA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHBCc3NJbmZvLT5hcENhcCAmIFpNX0FsbDExTl9BUCkgKSAvLzExbiBBUAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsRmxhZ3MgPSBDSEFOTkVMX0FfSFQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEJzc0luZm8tPmVuYWJsZUhUNDAgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxGbGFncyB8PSBDSEFOTkVMX0hUNDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsRmxhZ3MgPSBDSEFOTkVMX0E7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoICAgKHBCc3NJbmZvLT5FbmFibGVIVCA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHBCc3NJbmZvLT5hcENhcCAmIFpNX0FsbDExTl9BUCkgKSAvLzExbiBBUAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsRmxhZ3MgPSBDSEFOTkVMX0dfSFQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihwQnNzSW5mby0+ZW5hYmxlSFQ0MCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEZsYWdzIHw9IENIQU5ORUxfSFQ0MDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQnNzSW5mby0+ZXh0U3VwcG9ydGVkUmF0ZXNbMV0gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxGbGFncyA9IENIQU5ORUxfQjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEZsYWdzID0gQ0hBTk5FTF9HOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCAgICgoY2hhbm5lbEZsYWdzID09IENIQU5ORUxfQikgJiYgKHdkLT5jb25uZWN0TW9kZSAmIFpNX0JJVF8wKSkKKyAgICAgICAgICAgICAgICAgICAgfHwgKChjaGFubmVsRmxhZ3MgPT0gQ0hBTk5FTF9HKSAmJiAod2QtPmNvbm5lY3RNb2RlICYgWk1fQklUXzEpKQorICAgICAgICAgICAgICAgICAgICB8fCAoKGNoYW5uZWxGbGFncyA9PSBDSEFOTkVMX0EpICYmICh3ZC0+Y29ubmVjdE1vZGUgJiBaTV9CSVRfMikpCisgICAgICAgICAgICAgICAgICAgIHx8ICgoY2hhbm5lbEZsYWdzICYgQ0hBTk5FTF9IVDIwKSAmJiAod2QtPmNvbm5lY3RNb2RlICYgWk1fQklUXzMpKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBCeXBhc3MgREZTIGNoYW5uZWwgKi8KKyAgICAgICAgICAgICAgICBpZiAoemZIcElzRGZzQ2hhbm5lbE5DUyhkZXYsIHBCc3NJbmZvLT5mcmVxdWVuY3kpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiQnlwYXNzIERGUyBjaGFubmVsIik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIGNoZWNrIElCU1MgYml0ICovCisgICAgICAgICAgICAgICAgaWYgKCBwQnNzSW5mby0+Y2FwYWJpbGl0eVswXSAmIFpNX0JJVF8xICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIG1heSBjaGVjayB0aW1lc3RhbXAgaGVyZSAqLworICAgICAgICAgICAgICAgICAgICBqID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwQnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKChqIDwgd2QtPnN0YS5ic3NMaXN0LmJzc0NvdW50KSAmJiAocEJzc0luZm8gIT0gTlVMTCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmd01lbW9yeUNvcHkoKHU4X3QqKSZ0bXBCc3NJbmZvLCAodThfdCopKHBCc3NJbmZvKSwgc2l6ZW9mKHN0cnVjdCB6c0Jzc0luZm8pKTsKKyAgICAgICAgICAgIHBCc3NJbmZvID0gJnRtcEJzc0luZm87CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwQnNzSW5mbyA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIC8vaWYgKCBqIDwgd2QtPnN0YS5ic3NMaXN0LmJzc0NvdW50ICkKKyAgICAgICAgaWYgKHBCc3NJbmZvICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCByZXM7CisKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIklCU1MgZm91bmQiKTsKKworICAgICAgICAgICAgLyogRm91bmQgSUJTUywgcmVzZXQgYnNzTm90Rm91bmRDb3VudCAqLworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHdkLT5zdGEuYnNzTm90Rm91bmRDb3VudCA9IDA7CisgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgICAgICBic3NOb3RGb3VuZCA9IEZBTFNFOworICAgICAgICAgICAgd2QtPnN0YS5hdGltV2luZG93ID0gcEJzc0luZm8tPmF0aW1XaW5kb3c7CisgICAgICAgICAgICB3ZC0+ZnJlcXVlbmN5ID0gcEJzc0luZm8tPmZyZXF1ZW5jeTsKKyAgICAgICAgICAgIC8vd2QtPnN0YS5mbGFnRnJlcUNoYW5naW5nID0gMTsKKyAgICAgICAgICAgIHpmQ29yZVNldEZyZXF1ZW5jeShkZXYsIHdkLT5mcmVxdWVuY3kpOworICAgICAgICAgICAgemZVcGRhdGVCc3NpZChkZXYsIHBCc3NJbmZvLT5ic3NpZCk7CisgICAgICAgICAgICB6ZlJlc2V0U3VwcG9ydFJhdGUoZGV2LCBaTV9ERUZBVUxUX1NVUFBPUlRfUkFURV9aRVJPKTsKKyAgICAgICAgICAgIHpmVXBkYXRlU3VwcG9ydFJhdGUoZGV2LCBwQnNzSW5mby0+c3VwcG9ydGVkUmF0ZXMpOworICAgICAgICAgICAgemZVcGRhdGVTdXBwb3J0UmF0ZShkZXYsIHBCc3NJbmZvLT5leHRTdXBwb3J0ZWRSYXRlcyk7CisgICAgICAgICAgICB3ZC0+YmVhY29uSW50ZXJ2YWwgPSBwQnNzSW5mby0+YmVhY29uSW50ZXJ2YWxbMF0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgodTE2X3QpIHBCc3NJbmZvLT5iZWFjb25JbnRlcnZhbFsxXSkgPDwgOCk7CisKKyAgICAgICAgICAgIGlmICh3ZC0+YmVhY29uSW50ZXJ2YWwgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+YmVhY29uSW50ZXJ2YWwgPSAxMDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHJzbiBpbmZvcm1hdGlvbiBlbGVtZW50ICovCisgICAgICAgICAgICBpZiAoIHBCc3NJbmZvLT5yc25JZVsxXSAhPSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS5yc25JZSwgcEJzc0luZm8tPnJzbkllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+cnNuSWVbMV0rMik7CisKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgICAgICAgICAgICAgLyogSWYgbm90IHVzZSBSU05BICwgcnVuIHRyYWRpdGlvbmFsICovCisgICAgICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmlic3NXcGEyUHNrID0gMTsKKyAgICAgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5yc25JZVsxXSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHByaXZhY3kgYml0ICovCisgICAgICAgICAgICBpZiAoIHBCc3NJbmZvLT5jYXBhYmlsaXR5WzBdICYgWk1fQklUXzQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuY2FwYWJpbGl0eVswXSB8PSBaTV9CSVRfNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gJj0gflpNX0JJVF80OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBwcmVhbWJsZSB0eXBlICovCisgICAgICAgICAgICB3ZC0+cHJlYW1ibGVUeXBlSW5Vc2VkID0gd2QtPnByZWFtYmxlVHlwZTsKKyAgICAgICAgICAgIGlmICggd2QtPnByZWFtYmxlVHlwZUluVXNlZCA9PSBaTV9QUkVBTUJMRV9UWVBFX0FVVE8gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwQnNzSW5mby0+Y2FwYWJpbGl0eVswXSAmIFpNX0JJVF81KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnByZWFtYmxlVHlwZUluVXNlZCA9IFpNX1BSRUFNQkxFX1RZUEVfU0hPUlQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT5wcmVhbWJsZVR5cGVJblVzZWQgPSBaTV9QUkVBTUJMRV9UWVBFX0xPTkc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAod2QtPnByZWFtYmxlVHlwZUluVXNlZCA9PSBaTV9QUkVBTUJMRV9UWVBFX0xPTkcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5jYXBhYmlsaXR5WzBdICY9IH5aTV9CSVRfNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gfD0gWk1fQklUXzU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5U2l6ZSA9IHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplICsgMTI7CisKKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVNpemUgPiBaTV9DQUNIRURfRlJBTUVCT0RZX1NJWkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlTaXplID0gWk1fQ0FDSEVEX0ZSQU1FQk9EWV9TSVpFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGs9MDsgazw4OyBrKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlba10gPSBwQnNzSW5mby0+dGltZVN0YW1wW2tdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbOF0gPSBwQnNzSW5mby0+YmVhY29uSW50ZXJ2YWxbMF07CisgICAgICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVs5XSA9IHBCc3NJbmZvLT5iZWFjb25JbnRlcnZhbFsxXTsKKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5WzEwXSA9IHBCc3NJbmZvLT5jYXBhYmlsaXR5WzBdOworICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbMTFdID0gcEJzc0luZm8tPmNhcGFiaWxpdHlbMV07CisgICAgICAgICAgICAvL2ZvciAoaz0xMjsgazx3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVNpemU7IGsrKykKKyAgICAgICAgICAgIGZvciAoaz0wOyBrPHBCc3NJbmZvLT5mcmFtZUJvZHlzaXplOyBrKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbaysxMl0gPSBwQnNzSW5mby0+ZnJhbWVCb2R5W2tdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgcmVzID0gemZTdGFTZXRPcHBvc2l0ZUluZm9Gcm9tQlNTSW5mbyhkZXYsIHBCc3NJbmZvKTsKKyAgICAgICAgICAgIGlmICggcmVzID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmTWVtb3J5Q29weShldmVudC5ic3NpZCwgKHU4X3QgKikocEJzc0luZm8tPmJzc2lkKSwgNik7CisgICAgICAgICAgICAgICAgemZNZW1vcnlDb3B5KGV2ZW50LnBlZXJNYWNBZGRyLCAodThfdCAqKShwQnNzSW5mby0+bWFjYWRkciksIDYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgLy96ZndJYnNzUGFydG5lck5vdGlmeShkZXYsIDEsICZldmVudCk7CisgICAgICAgICAgICBnb3RvIGNvbm5lY3RfZG9uZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIElCU1Mgbm90IGZvdW5kICovCisgICAgaWYgKCBic3NOb3RGb3VuZCApCisgICAgeworI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1dQQTJQU0sKKyAgICAgICAgdTE2X3Qgb2Zmc2V0IDsKKyNlbmRpZgorICAgICAgICBpZiAoIHdkLT5zdGEuaWJzc0pvaW5Pbmx5ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiSUJTUyBqb2luIG9ubHkuLi5yZXRyeS4uLiIpOworICAgICAgICAgICAgZ290byByZXRyeV9pYnNzOworICAgICAgICB9CisKKyAgICAgICAgaWYod2QtPnN0YS5ic3NOb3RGb3VuZENvdW50PDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJJQlNTIG5vdCBmb3VuZCwgZG8gc2l0ZXN1cnZleSEhICBic3NOb3RGb3VuZENvdW50PSIsIHdkLT5zdGEuYnNzTm90Rm91bmRDb3VudCk7CisgICAgICAgICAgICB3ZC0+c3RhLmJzc05vdEZvdW5kQ291bnQrKzsKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICBnb3RvIHJldHJ5X2lic3M7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgLyogRmFpbCBJQlNTIGZvdW5kLCBUT0RPIGNyZWF0ZSBJQlNTICovCisgICAgICAgICAgICB3ZC0+c3RhLmJzc05vdEZvdW5kQ291bnQgPSAwOworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgfQorCisKKyAgICAgICAgaWYgKHpmSHBJc0Rmc0NoYW5uZWwoZGV2LCB3ZC0+ZnJlcXVlbmN5KSkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPmZyZXF1ZW5jeSA9IHpmSHBGaW5kRmlyc3ROb25EZnNDaGFubmVsKGRldiwgd2QtPmZyZXF1ZW5jeSA+IDMwMDApOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHdkLT53cy5hdXRvU2V0RnJlcXVlbmN5ID09IDAgKQorICAgICAgICB7IC8qIEF1dG8gc2V0IGZyZXF1ZW5jeSAqLworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiQ3JlYXRlIEFkIEhvYyBOZXR3b3JrIEJhbmQgIiwgd2QtPndzLmFkaG9jTW9kZSk7CisgICAgICAgICAgICB3ZC0+ZnJlcXVlbmN5ID0gemZGaW5kQ2xlYW5GcmVxdWVuY3koZGV2LCB3ZC0+d3MuYWRob2NNb2RlKTsKKyAgICAgICAgICAgIHdkLT53cy5hdXRvU2V0RnJlcXVlbmN5ID0gMHhmZjsKKyAgICAgICAgfQorICAgICAgICB6bV9kZWJ1Z19tc2cxKCJJQlNTIG5vdCBmb3VuZCwgY3JlYXRlZCBvbmUgaW4gY2hhbm5lbCAiLCB3ZC0+ZnJlcXVlbmN5KTsKKworICAgICAgICB3ZC0+c3RhLmlic3NCc3NJc0NyZWF0b3IgPSAxOworCisgICAgICAgIC8vd2QtPnN0YS5mbGFnRnJlcUNoYW5naW5nID0gMTsKKyAgICAgICAgemZDb3JlU2V0RnJlcXVlbmN5KGRldiwgd2QtPmZyZXF1ZW5jeSk7CisgICAgICAgIGlmICh3ZC0+c3RhLmJEZXNpcmVkQnNzaWQgPT0gVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChrPTA7IGs8NjsgaysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJzc2lkW2tdID0gd2QtPnN0YS5kZXNpcmVkQnNzaWRba107CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAjaWYgMQorICAgICAgICAgICAgbWFjQWRkclswXSA9ICh3ZC0+bWFjQWRkclswXSAmIDB4ZmYpOworICAgICAgICAgICAgbWFjQWRkclsxXSA9ICh3ZC0+bWFjQWRkclswXSA+PiA4KTsKKyAgICAgICAgICAgIG1hY0FkZHJbMl0gPSAod2QtPm1hY0FkZHJbMV0gJiAweGZmKTsKKyAgICAgICAgICAgIG1hY0FkZHJbM10gPSAod2QtPm1hY0FkZHJbMV0gPj4gOCk7CisgICAgICAgICAgICBtYWNBZGRyWzRdID0gKHdkLT5tYWNBZGRyWzJdICYgMHhmZik7CisgICAgICAgICAgICBtYWNBZGRyWzVdID0gKHdkLT5tYWNBZGRyWzJdID4+IDgpOworICAgICAgICAgICAgemZHZW5lcmF0ZVJhbmRvbUJTU0lEKGRldiwgKHU4X3QgKil3ZC0+bWFjQWRkciwgKHU4X3QgKilic3NpZCk7CisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgZm9yIChrPTA7IGs8NjsgaysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJzc2lkW2tdID0gKHU4X3QpIHpmR2V0UmFuZG9tTnVtYmVyKGRldiwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBic3NpZFswXSAmPSB+Wk1fQklUXzA7CisgICAgICAgICAgICBic3NpZFswXSB8PSBaTV9CSVRfMTsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgemZVcGRhdGVCc3NpZChkZXYsIGJzc2lkKTsKKyAgICAgICAgLy93ZC0+c3RhLmF0aW1XaW5kb3cgPSAweDBhOworCisgICAgICAgIC8qIHJhdGUgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgaWYod2QtPmZyZXF1ZW5jeSA8PSBaTV9DSF9HXzE0KSAgLy8gMi40IEdIeiAgYitnCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggd2QtPndmYy5iSWJzc0dNb2RlCisgICAgICAgICAgICAgICAgICYmICh3ZC0+c3VwcG9ydE1vZGUgJiAoWk1fV0lSRUxFU1NfTU9ERV8yNF81NHxaTV9XSVJFTEVTU19NT0RFXzI0X04pKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZSZXNldFN1cHBvcnRSYXRlKGRldiwgWk1fREVGQVVMVF9TVVBQT1JUX1JBVEVfSUJTU19BRyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZSZXNldFN1cHBvcnRSYXRlKGRldiwgWk1fREVGQVVMVF9TVVBQT1JUX1JBVEVfSUJTU19CKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHpmUmVzZXRTdXBwb3J0UmF0ZShkZXYsIFpNX0RFRkFVTFRfU1VQUE9SVF9SQVRFX0lCU1NfQUcpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLndlcFN0YXR1cyA9PSBaTV9FTkNSWVBUSU9OX1dFUF9ESVNBQkxFRCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5zdGEuY2FwYWJpbGl0eVswXSAmPSB+Wk1fQklUXzQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gfD0gWk1fQklUXzQ7CisgICAgICAgIH0KKworICAgICAgICB3ZC0+cHJlYW1ibGVUeXBlSW5Vc2VkID0gd2QtPnByZWFtYmxlVHlwZTsKKyAgICAgICAgaWYgKHdkLT5wcmVhbWJsZVR5cGVJblVzZWQgPT0gWk1fUFJFQU1CTEVfVFlQRV9MT05HKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gJj0gflpNX0JJVF81OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnByZWFtYmxlVHlwZUluVXNlZCA9IFpNX1BSRUFNQkxFX1RZUEVfU0hPUlQ7CisgICAgICAgICAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gfD0gWk1fQklUXzU7CisgICAgICAgIH0KKworICAgICAgICB6ZklCU1NTZXR1cEJzc0Rlc2MoZGV2KTsKKworI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1dQQTJQU0sKKworICAgICAgICAvLyAyMDA3MDQxMSBBZGQgV1BBMlBTSyBpbmZvcm1hdGlvbiB0byBpdHMgSUJTUyBuZXR3b3JrICEhIQorICAgICAgICBvZmZzZXQgPSAwIDsKKworICAgICAgICAvKiB0aW1lc3RhbXAgKi8KKyAgICAgICAgb2Zmc2V0ICs9IDggOworCisgICAgICAgIC8qIGJlYWNvbiBpbnRlcnZhbCAqLworICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSAodThfdCkod2QtPmJlYWNvbkludGVydmFsKSA7CisgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9ICh1OF90KSgod2QtPmJlYWNvbkludGVydmFsKSA+PiA4KSA7CisKKyAgICAgICAgLyogY2FwYWJpbGl0eSBpbmZvcm1hdGlvbiAqLworICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gOworICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSB3ZC0+c3RhLmNhcGFiaWxpdHlbMV0gOworICAgICAgICAjaWYgMAorICAgICAgICAvKiBzc2lkICovCisgICAgICAgIC8vIHNzaWQgZWxlbWVudCBpZAorICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSBaTV9XTEFOX0VJRF9TU0lEIDsKKyAgICAgICAgLy8gc3NpZCBsZW5ndGgKKyAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbb2Zmc2V0KytdID0gd2QtPnN0YS5zc2lkTGVuIDsKKyAgICAgICAgLy8gc3NpZCBpbmZvcm1hdGlvbgorICAgICAgICBmb3IoaT0wOyBpPHdkLT5zdGEuc3NpZExlbjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSB3ZC0+c3RhLnNzaWRbaV0gOworICAgICAgICB9CisKKyAgICAgICAgLyogc3VwcG9ydCByYXRlICovCisgICAgICAgIHJhdGVTZXQgPSBaTV9SQVRFX1NFVF9DQ0sgOworICAgICAgICBpZiAoIChyYXRlU2V0ID09IFpNX1JBVEVfU0VUX09GRE0pJiYoKHdkLT5nUmF0ZSAmIDB4ZmYpID09IDApICkKKyAgICAgICAgeworICAgICAgICAgICAgb2Zmc2V0ICs9IDAgOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gc3VwcG9ydCByYXRlIGVsZW1lbnQgaWQKKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IFpNX1dMQU5fRUlEX1NVUFBPUlRfUkFURSA7CisKKyAgICAgICAgICAgIC8vIHN1cHBvcnQgcmF0ZSBsZW5ndGgKKyAgICAgICAgICAgIGxlbk9mZnNldCA9IG9mZnNldCsrOworCisgICAgICAgICAgICAvLyBzdXBwb3J0IHJhdGUgaW5mb3JtYXRpb24KKyAgICAgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHdkLT5iUmF0ZSAmICgweDE8PGkpKSA9PSAoMHgxPDxpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9CisgICAgICAgICAgICAgICAgCSAgICB6ZzExYlJhdGVUYmxbaV0rKCh3ZC0+YlJhdGVCYXNpYyAmICgweDE8PGkpKTw8KDctaSkpIDsKKyAgICAgICAgICAgICAgICAgICAgbGVuKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzdXBwb3J0IHJhdGUgbGVuZ3RoCisgICAgICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtsZW5PZmZzZXRdID0gbGVuIDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIERTIHBhcmFtZXRlciBzZXQgKi8KKyAgICAgICAgLy8gRFMgcGFyYW1ldGVyIHNldCBlbGVtZXQgaWQKKyAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbb2Zmc2V0KytdID0gWk1fV0xBTl9FSURfRFMgOworCisgICAgICAgIC8vIERTIHBhcmFtZXRlciBzZXQgbGVuZ3RoCisgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IDEgOworCisgICAgICAgIC8vIERTIHBhcmFtZXRlciBzZXQgaW5mb3JtYXRpb24KKyAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbb2Zmc2V0KytdID0KKyAgICAgICAgIAl6ZkNoRnJlcVRvTnVtKHdkLT5mcmVxdWVuY3ksIE5VTEwpIDsKKworICAgICAgICAvKiBJQlNTIHBhcmFtZXRlciBzZXQgKi8KKyAgICAgICAgLy8gSUJTUyBwYXJhbWV0ZXIgc2V0IGVsZW1lbnQgaWQKKyAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbb2Zmc2V0KytdID0gWk1fV0xBTl9FSURfSUJTUyA7CisKKyAgICAgICAgLy8gSUJTUyBwYXJhbWV0ZXIgc2V0IGxlbmd0aAorICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSAyIDsKKworICAgICAgICAvLyBJQlNTIHBhcmFtZXRlciBzZXQgaW5mb3JtYXRpb24KKyAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbb2Zmc2V0XSA9IHdkLT5zdGEuYXRpbVdpbmRvdyA7CisgICAgICAgIG9mZnNldCArPSAyIDsKKworICAgICAgICAvKiBFUlAgSW5mb3JtYXRpb24gYW5kIEV4dGVuZGVkIFN1cHBvcnRlZCBSYXRlcyAqLworICAgICAgICBpZiAoIHdkLT53ZmMuYklic3NHTW9kZQorICAgICAgICAgICAgICYmICh3ZC0+c3VwcG9ydE1vZGUgJiAoWk1fV0lSRUxFU1NfTU9ERV8yNF81NHxaTV9XSVJFTEVTU19NT0RFXzI0X04pKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEVSUCBJbmZvcm1hdGlvbiAqLworICAgICAgICAgICAgd2QtPmVycEVsZW1lbnQgPSAwOworICAgICAgICAgICAgLy8gRVJQIGVsZW1lbnQgaWQKKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IFpNX1dMQU5fRUlEX0VSUCA7CisKKyAgICAgICAgICAgIC8vIEVSUCBsZW5ndGgKKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IDEgOworCisgICAgICAgICAgICAvLyBFUlAgaW5mb3JtYXRpb24KKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IHdkLT5lcnBFbGVtZW50IDsKKworICAgICAgICAgICAgLyogRXh0ZW5kZWQgU3VwcG9ydGVkIFJhdGVzICovCisgICAgICAgICAgICBpZiAoIChyYXRlU2V0ID09IFpNX1JBVEVfU0VUX09GRE0pJiYoKHdkLT5nUmF0ZSAmIDB4ZmYpID09IDApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMCA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGVuID0gMCA7CisKKyAgICAgICAgICAgICAgICAvLyBFeHRlbmRlZCBTdXBwb3J0ZWQgUmF0ZXMgZWxlbWVudCBpZAorICAgICAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUgOworCisgICAgICAgICAgICAgICAgLy8gRXh0ZW5kZWQgU3VwcG9ydGVkIFJhdGVzIGxlbmd0aAorICAgICAgICAgICAgICAgIGxlbk9mZnNldCA9IG9mZnNldCsrIDsKKworICAgICAgICAgICAgICAgIC8vIEV4dGVuZGVkIFN1cHBvcnRlZCBSYXRlcyBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPDg7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgod2QtPmdSYXRlICYgKDB4MTw8aSkpID09ICgweDE8PGkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpnMTFnUmF0ZVRibFtpXSsoKHdkLT5nUmF0ZUJhc2ljICYgKDB4MTw8aSkpPDwoNy1pKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4rKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGV4dGVuZGVkIHN1cHBvcnQgcmF0ZSBsZW5ndGgKKyAgICAgICAgICAgIAkgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W2xlbk9mZnNldF0gPSBsZW4gOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICNlbmRpZgorCisgICAgICAgIC8qIFJTTiA6IGltcG9ydGFudCBpbmZvcm1hdGlvbiBpbmZsdWVuY2UgdGhlIHJlc3VsdCBvZiBjcmVhdGluZyBhbiBJQlNTIG5ldHdvcmsgKi8KKyAgICAgICAgaWYgKCB3ZC0+c3RhLmF1dGhNb2RlID09IFpNX0FVVEhfTU9ERV9XUEEyUFNLICkKKyAgICAgICAgeworICAgICAgICAgICAgdThfdCBmcmFtZVR5cGUgPSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVVUSCA7CisgICAgICAgICAgICB1OF90ICAgIHJzbls2NF09CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbGVtZW50IElEICovCisgICAgICAgICAgICAgICAgICAgICAgICAweDMwLAorICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVuZ3RoICovCisgICAgICAgICAgICAgICAgICAgICAgICAweDE0LAorICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVyc2lvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgMHgwMSwgMHgwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdyb3VwIENpcGhlciBTdWl0ZSwgZGVmYXVsdD1US0lQICovCisgICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAweDBmLCAweGFjLCAweDA0LAorICAgICAgICAgICAgICAgICAgICAgICAgLyogUGFpcndpc2UgQ2lwaGVyIFN1aXRlIENvdW50ICovCisgICAgICAgICAgICAgICAgICAgICAgICAweDAxLCAweDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgLyogUGFpcndpc2UgQ2lwaGVyIFN1aXRlLCBkZWZhdWx0PVRLSVAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4MGYsIDB4YWMsIDB4MDIsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBBdXRoZW50aWNhdGlvbiBhbmQgS2V5IE1hbmFnZW1lbnQgU3VpdGUgQ291bnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEsIDB4MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBBdXRoZW50aWNhdGlvbiB0eXBlLCBkZWZhdWx0PVBTSyAqLworICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwZiwgMHhhYywgMHgwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJTTiBjYXBhYmlsaXR5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAweDAwCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICAvKiBPdmVyd3JpdGUgR3JvdXAgQ2lwaGVyIFN1aXRlIGJ5IEFQJ3Mgc2V0dGluZyAqLworICAgICAgICAgICAgemZNZW1vcnlDb3B5KHJzbis0LCB6Z1dwYTJBZXNPdWksIDQpOworCisgICAgICAgICAgICBpZiAoIHdkLT5zdGEud2VwU3RhdHVzID09IFpNX0VOQ1JZUFRJT05fQUVTICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBPdmVyd3JpdGUgUGFpcndpc2UgQ2lwaGVyIFN1aXRlIGJ5IEFFUyAqLworICAgICAgICAgICAgICAgIHpmTWVtb3J5Q29weShyc24rMTAsIHpnV3BhMkFlc091aSwgNCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFJTTiBlbGVtZW50IGlkCisgICAgICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSBaTV9XTEFOX0VJRF9SU05fSUUgOworCisgICAgICAgICAgICAvLyBSU04gbGVuZ3RoCisgICAgICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSByc25bMV0gOworCisgICAgICAgICAgICAvLyBSU04gaW5mb3JtYXRpb24KKyAgICAgICAgICAgIGZvcihpPTA7IGk8cnNuWzFdOyBpKyspCisgICAgICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbb2Zmc2V0KytdID0gcnNuW2krMl0gOworCisgICAgICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS5yc25JZSwgcnNuLCByc25bMV0rMik7CisKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgICAgICAgICAvKiBJZiBub3QgdXNlIFJTTkEgLCBydW4gdHJhZGl0aW9uYWwgKi8KKyAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICB3ZC0+c3RhLmlic3NXcGEyUHNrID0gMTsKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgICNpZiAwCisgICAgICAgIC8qIEhUIENhcGFiaWxpdGllcyBJbmZvICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHU4X3QgT1VJWzNdID0geyAweDAgLCAweDkwICwgMHg0QyB9IDsKKworICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbb2Zmc2V0KytdID0gWk1fV0xBTl9FSURfV1BBX0lFIDsKKworICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbb2Zmc2V0KytdID0gd2QtPnN0YS5IVENhcC5EYXRhLkxlbmd0aCArIDQgOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IE9VSVtpXSA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IHdkLT5zdGEuSFRDYXAuRGF0YS5FbGVtZW50SUQgOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjY7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSB3ZC0+c3RhLkhUQ2FwLkJ5dGVbaSsyXSA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBFeHRlbmRlZCBIVCBDYXBhYmlsaXRpZXMgSW5mbyAqLworICAgICAgICB7CisgICAgICAgICAgICB1OF90IE9VSVszXSA9IHsgMHgwICwgMHg5MCAsIDB4NEMgfSA7CisKKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IFpNX1dMQU5fRUlEX1dQQV9JRSA7CisKKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W29mZnNldCsrXSA9IHdkLT5zdGEuRXh0SFRDYXAuRGF0YS5MZW5ndGggKyA0IDsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSBPVUlbaV0gOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtvZmZzZXQrK10gPSB3ZC0+c3RhLkV4dEhUQ2FwLkRhdGEuRWxlbWVudElEIDsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDIyOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbb2Zmc2V0KytdID0gd2QtPnN0YS5FeHRIVENhcC5CeXRlW2krMl0gOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICNlbmRpZgorCisgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5U2l6ZSA9IG9mZnNldCA7CisKKyAgICAgICAgaWYgKHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5U2l6ZSA+IFpNX0NBQ0hFRF9GUkFNRUJPRFlfU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlTaXplID0gWk1fQ0FDSEVEX0ZSQU1FQk9EWV9TSVpFOworICAgICAgICB9CisKKyAgICAgICAgLy8gMjAwNzA0MTYgTGV0IENyZWF0ZSBJQlNTIG5ldHdvcmsgY291bGQgZW50ZXIgdGhlIHpmd0lic3NQYXJ0bmVyTm90aWZ5IGZ1bmN0aW9uCisgICAgICAgIC8vIGJzc05vdEZvdW5kID0gRkFMU0UgOworCisgICAgICAgIHByaW50aygiVGhlIGNhcGFiaWxpdHkgaW5mbyAxID0gJTAyeFxuIiwgd2QtPnN0YS5jYXBhYmlsaXR5WzBdKSA7CisgICAgICAgIHByaW50aygiVGhlIGNhcGFiaWxpdHkgaW5mbyAyID0gJTAyeFxuIiwgd2QtPnN0YS5jYXBhYmlsaXR5WzFdKSA7CisgICAgICAgIGZvcihrPTA7IGs8d2QtPnN0YS5iZWFjb25GcmFtZUJvZHlTaXplOyBrKyspCisgICAgICAgIHsKKwkgICAgIHByaW50aygiJTAyeCAiLCB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVtrXSkgOworICAgICAgICB9CisgICAgICAgICNpZiAwCisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHpmTWVtb3J5Q29weShldmVudC5ic3NpZCwgKHU4X3QgKilic3NpZCwgNik7CisgICAgICAgIHpmTWVtb3J5Q29weShldmVudC5wZWVyTWFjQWRkciwgKHU4X3QgKil3ZC0+bWFjQWRkciwgNik7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICNlbmRpZgorI2VuZGlmCisKKyAgICAgICAgLy96bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAvL3dkLT5zdGEuaWJzc1BhcnRuZXJTdGF0dXMgPSBaTV9JQlNTX1BBUlRORVJfTE9TVDsKKyAgICAgICAgLy96bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3ZC0+c3RhLmlic3NCc3NJc0NyZWF0b3IgPSAwOworICAgIH0KKworY29ubmVjdF9kb25lOgorICAgIHpmSHBFbmFibGVCZWFjb24oZGV2LCBaTV9NT0RFX0lCU1MsIHdkLT5iZWFjb25JbnRlcnZhbCwgd2QtPmR0aW0sICh1OF90KXdkLT5zdGEuYXRpbVdpbmRvdyk7CisgICAgemZTdGFTZW5kQmVhY29uKGRldik7IC8vIFJlZnJlc2ggQmVhY29uIGNvbnRlbnQgZm9yIFpEMTIxMUIgSGFsUGx1cworICAgIHpmSHBTZXRBdGltV2luZG93KGRldiwgd2QtPnN0YS5hdGltV2luZG93KTsKKworICAgIC8vIFN0YXJ0IHRoZSBJQlNTIHRpbWVyIHRvIG1vbml0b3IgZm9yIG5ldyBzdGF0aW9ucworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgemZUaW1lclNjaGVkdWxlKGRldiwgWk1fRVZFTlRfSUJTU19NT05JVE9SLCBaTV9USUNLX0lCU1NfTU9OSVRPUik7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworCisgICAgaWYgKHdkLT56ZmNiQ29ubmVjdE5vdGlmeSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgd2QtPnpmY2JDb25uZWN0Tm90aWZ5KGRldiwgWk1fU1RBVFVTX01FRElBX0NPTk5FQ1QsIHdkLT5zdGEuYnNzaWQpOworICAgIH0KKyAgICB6ZkNoYW5nZUFkYXB0ZXJTdGF0ZShkZXYsIFpNX1NUQV9TVEFURV9DT05ORUNURUQpOworICAgIHdkLT5zdGEuY29ublBvd2VySW5IYWxmRGJtID0gemZIcEdldFRyYW5zbWl0UG93ZXIoZGV2KTsKKworI2lmZGVmIFpNX0VOQUJMRV9JQlNTX0RFTEFZRURfSk9JTl9JTkRJQ0FUSU9OCisgICAgaWYgKCAhYnNzTm90Rm91bmQgKQorICAgIHsKKyAgICAgICAgd2QtPnN0YS5pYnNzRGVsYXllZEluZCA9IDE7CisgICAgICAgIHpmTWVtb3J5Q29weSgodThfdCAqKSZ3ZC0+c3RhLmlic3NEZWxheWVkSW5kRXZlbnQsICh1OF90ICopJmV2ZW50LCBzaXplb2Yoc3RydWN0IHpzUGFydG5lck5vdGlmeUV2ZW50KSk7CisgICAgfQorI2Vsc2UKKyAgICBpZiAoICFic3NOb3RGb3VuZCApCisgICAgeworICAgICAgICBpZiAod2QtPnpmY2JJYnNzUGFydG5lck5vdGlmeSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+emZjYklic3NQYXJ0bmVyTm90aWZ5KGRldiwgMSwgJmV2ZW50KTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuOworCityZXRyeV9pYnNzOgorICAgIHpmQ2hhbmdlQWRhcHRlclN0YXRlKGRldiwgWk1fU1RBX1NUQVRFX0NPTk5FQ1RJTkcpOworICAgIHpmU3RhQ29ubmVjdEZhaWwoZGV2LCBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9OT1RfRk9VTkQsIHdkLT5zdGEuYnNzaWQsIDApOworICAgIHJldHVybjsKK30KKwordm9pZCB6ZlN0YVByb2Nlc3NBdGltKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9kZWJ1Z19tc2cwKCJSZWNlaXZpbmcgQXRpbSB3aW5kb3cgbm90aWZpY2F0aW9uIik7CisKKyAgICB3ZC0+c3RhLnJlY3ZBdGltID0gMTsKK30KKworc3RhdGljIHN0cnVjdCB6c0Jzc0luZm8qIHpmSW5mcmFGaW5kQVBUb0Nvbm5lY3QoemRldl90KiBkZXYsCisgICAgICAgIHN0cnVjdCB6c0Jzc0luZm8qIGNhbmRpZGF0ZUJzcykKK3sKKyAgICBzdHJ1Y3QgenNCc3NJbmZvKiBwQnNzSW5mbzsKKyAgICBzdHJ1Y3QgenNCc3NJbmZvKiBwTm93QnNzSW5mbz1OVUxMOworICAgIHUxNl90IGk7CisgICAgdTE2X3QgcmV0LCBhcFdlcFN0YXR1czsKKyAgICB1MzJfdCBrOworICAgIHUzMl90IGNoYW5uZWxGbGFnczsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHBCc3NJbmZvID0gd2QtPnN0YS5ic3NMaXN0LmhlYWQ7CisKKyAgICBmb3IoaT0wOyBpPHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKCBwQnNzSW5mby0+Y2FwYWJpbGl0eVswXSAmIFpNX0JJVF80ICkKKyAgICAgICAgeworICAgICAgICAgICAgYXBXZXBTdGF0dXMgPSBaTV9FTkNSWVBUSU9OX1dFUF9FTkFCTEVEOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBXZXBTdGF0dXMgPSBaTV9FTkNSWVBUSU9OX1dFUF9ESVNBQkxFRDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggKCh6Zk1lbW9yeUlzRXF1YWwoJihwQnNzSW5mby0+c3NpZFsyXSksIHdkLT5zdGEuc3NpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnNzaWRMZW4pKSYmCisgICAgICAgICAgICAgICh3ZC0+c3RhLnNzaWRMZW4gPT0gcEJzc0luZm8tPnNzaWRbMV0pKXx8CisgICAgICAgICAgICAgKCh3ZC0+c3RhLnNzaWRMZW4gPT0gMCkmJgorICAgICAgICAgICAgICAgLyogY29ubmVjdCB0byBhbnkgQlNTOiBBUCdzIGFucyBTVEEncyBXRVAgc3RhdHVzIG11c3QgbWF0Y2ggKi8KKyAgICAgICAgICAgICAgKHdkLT5zdGEud2VwU3RhdHVzID09IGFwV2VwU3RhdHVzICkmJgorICAgICAgICAgICAgICAocEJzc0luZm8tPnNlY3VyaXR5VHlwZSAhPSBaTV9TRUNVUklUWV9UWVBFX1dQQSkgKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLnNzaWRMZW4gPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiQU5ZIEJTUyBmb3VuZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoICgod2QtPnN0YS53ZXBTdGF0dXMgPT0gWk1fRU5DUllQVElPTl9XRVBfRElTQUJMRUQgJiYgYXBXZXBTdGF0dXMgPT0gWk1fRU5DUllQVElPTl9XRVBfRU5BQkxFRCkgfHwKKyAgICAgICAgICAgICAgICAgKHdkLT5zdGEud2VwU3RhdHVzID09IFpNX0VOQ1JZUFRJT05fV0VQX0VOQUJMRUQgJiYKKyAgICAgICAgICAgICAgICAgKGFwV2VwU3RhdHVzID09IFpNX0VOQ1JZUFRJT05fV0VQX0RJU0FCTEVEICYmIHdkLT5zdGEuZHJvcFVuZW5jcnlwdGVkUGt0cyA9PSAxKSkpICYmCisgICAgICAgICAgICAgICAgICh3ZC0+c3RhLmF1dGhNb2RlID49IFpNX0FVVEhfTU9ERV9PUEVOICYmIHdkLT5zdGEuYXV0aE1vZGUgPD0gWk1fQVVUSF9NT0RFX0FVVE8pICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJQcml2YWN5IHBvbGljeSBpcyBpbmNvbnNpc3RlbnQiKTsKKyAgICAgICAgICAgICAgICBwQnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBmb3IgV1BBIG5lZ2F0aXZlIHRlc3QgKi8KKyAgICAgICAgICAgIGlmICggIXpmQ2hlY2tBdXRoZW50aWNhdGlvbihkZXYsIHBCc3NJbmZvKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEJzc0luZm8gPSBwQnNzSW5mby0+bmV4dDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogQ2hlY2sgYnNzaWQgKi8KKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLmJEZXNpcmVkQnNzaWQgPT0gVFJVRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGs9MDsgazw2OyBrKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5kZXNpcmVkQnNzaWRba10gIT0gcEJzc0luZm8tPmJzc2lkW2tdKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzEsICJkZXNpcmVkIGJzc2lkIG5vdCBtYXRjaGVkIDEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGsgIT0gNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMSwgImRlc2lyZWQgYnNzaWQgbm90IG1hdGNoZWQgMiIpOworICAgICAgICAgICAgICAgICAgICBwQnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIENoZWNrIHN1cHBvcnQgbW9kZSAqLworICAgICAgICAgICAgaWYgKHBCc3NJbmZvLT5mcmVxdWVuY3kgPiAzMDAwKSB7CisgICAgICAgICAgICAgICAgaWYgKCAgIChwQnNzSW5mby0+RW5hYmxlSFQgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgfHwgKHBCc3NJbmZvLT5hcENhcCAmIFpNX0FsbDExTl9BUCkgKSAvLzExbiBBUAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEZsYWdzID0gQ0hBTk5FTF9BX0hUOworICAgICAgICAgICAgICAgICAgICBpZiAocEJzc0luZm8tPmVuYWJsZUhUNDAgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEZsYWdzIHw9IENIQU5ORUxfSFQ0MDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxGbGFncyA9IENIQU5ORUxfQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICggICAocEJzc0luZm8tPkVuYWJsZUhUID09IDEpCisgICAgICAgICAgICAgICAgICAgIHx8IChwQnNzSW5mby0+YXBDYXAgJiBaTV9BbGwxMU5fQVApICkgLy8xMW4gQVAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxGbGFncyA9IENIQU5ORUxfR19IVDsKKyAgICAgICAgICAgICAgICAgICAgaWYocEJzc0luZm8tPmVuYWJsZUhUNDAgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEZsYWdzIHw9IENIQU5ORUxfSFQ0MDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwQnNzSW5mby0+ZXh0U3VwcG9ydGVkUmF0ZXNbMV0gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEZsYWdzID0gQ0hBTk5FTF9COworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEZsYWdzID0gQ0hBTk5FTF9HOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoICAgKChjaGFubmVsRmxhZ3MgPT0gQ0hBTk5FTF9CKSAmJiAod2QtPmNvbm5lY3RNb2RlICYgWk1fQklUXzApKQorICAgICAgICAgICAgICAgIHx8ICgoY2hhbm5lbEZsYWdzID09IENIQU5ORUxfRykgJiYgKHdkLT5jb25uZWN0TW9kZSAmIFpNX0JJVF8xKSkKKyAgICAgICAgICAgICAgICB8fCAoKGNoYW5uZWxGbGFncyA9PSBDSEFOTkVMX0EpICYmICh3ZC0+Y29ubmVjdE1vZGUgJiBaTV9CSVRfMikpCisgICAgICAgICAgICAgICAgfHwgKChjaGFubmVsRmxhZ3MgJiBDSEFOTkVMX0hUMjApICYmICh3ZC0+Y29ubmVjdE1vZGUgJiBaTV9CSVRfMykpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBTa2lwIGlmIEFQIGluIGJsb2NraW5nIGxpc3QgKi8KKyAgICAgICAgICAgIGlmICgocmV0ID0gemZTdGFJc0FwSW5CbG9ja2luZ0xpc3QoZGV2LCBwQnNzSW5mby0+YnNzaWQpKSA9PSBUUlVFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIkNhbmRpZGF0ZSBBUCBpbiBibG9ja2luZyBMaXN0LCBza2lwIGlmIHRoZXJlJ3Mgc3RpbGxhIGNob2ljZSEiKTsKKyAgICAgICAgICAgICAgICBwTm93QnNzSW5mbyA9IHBCc3NJbmZvOworICAgICAgICAgICAgICAgIHBCc3NJbmZvID0gcEJzc0luZm8tPm5leHQ7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggcEJzc0luZm8tPmNhcGFiaWxpdHlbMF0gJiBaTV9CSVRfMCApICAvLyBjaGVjayBpZiBpbmZyYS1CU1MKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcE5vd0Jzc0luZm8gPSBwQnNzSW5mbzsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5hcFdtZUNhcGFiaWxpdHkgPSBwQnNzSW5mby0+d21lU3VwcG9ydDsKKworCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHBCc3NJbmZvID0gcEJzc0luZm8tPm5leHQ7CisgICAgfQorCitkb25lOgorICAgIGlmIChwTm93QnNzSW5mbyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgemZ3TWVtb3J5Q29weSgodm9pZCopY2FuZGlkYXRlQnNzLCAodm9pZCopcE5vd0Jzc0luZm8sIHNpemVvZihzdHJ1Y3QgenNCc3NJbmZvKSk7CisgICAgICAgIHBOb3dCc3NJbmZvID0gY2FuZGlkYXRlQnNzOworICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXR1cm4gcE5vd0Jzc0luZm87Cit9CisKKwordm9pZCB6ZkluZnJhQ29ubmVjdE5ldHdvcmsoemRldl90KiBkZXYpCit7CisgICAgc3RydWN0IHpzQnNzSW5mbyogcEJzc0luZm87CisgICAgc3RydWN0IHpzQnNzSW5mbyogcE5vd0Jzc0luZm89TlVMTDsKKyAgICBzdHJ1Y3QgenNCc3NJbmZvIGNhbmRpZGF0ZUJzczsKKyAgICAvL3UxNl90IGksIGo9MTAwLCBxdWFsaXR5PTEwMDAwOworICAgIC8vdThfdCByZXQ9RkFMU0UsIGFwV2VwU3RhdHVzOworICAgIHU4X3QgcmV0PUZBTFNFOworICAgIHUxNl90IGs7CisgICAgdThfdCBkZW5zaXR5ID0gWk1fTVBEVV9ERU5TSVRZX05PTkU7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8qIFJlc2V0IGJzc05vdEZvdW5kQ291bnQgZm9yIEFkLUhvYzpJQlNTICovCisgICAgLyogTmVlZCByZXZpZXcgOiBJYnNzQ29ubiAtPiBJbmZyYUNvbm4gLT4gSWJzc0Nvbm4gZXRjLCBmbGFnL2NvdW50ZXIgcmVzZXQ/ICovCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB3ZC0+c3RhLmJzc05vdEZvdW5kQ291bnQgPSAwOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAvKiBTZXQgVHhRcyBDV01JTiwgQ1dNQVgsIEFJRlMgYW5kIFRYTyB0byBXTUUgU1RBIGRlZmF1bHQuICovCisgICAgemZVcGRhdGVEZWZhdWx0UW9zUGFyYW1ldGVyKGRldiwgMCk7CisKKyAgICB6ZlN0YVJlZnJlc2hCbG9ja0xpc3QoZGV2LCAwKTsKKworICAgIC8qIGNoYW5nZSBzdGF0ZSB0byBDT05ORUNUSU5HIGFuZCBzdG9wIHRoZSBjaGFubmVsIHNjYW5uaW5nICovCisgICAgemZDaGFuZ2VBZGFwdGVyU3RhdGUoZGV2LCBaTV9TVEFfU1RBVEVfQ09OTkVDVElORyk7CisgICAgemZQb3dlclNhdmluZ01ncldha2V1cChkZXYpOworCisgICAgd2QtPnN0YS53bWVDb25uZWN0ZWQgPSAwOworICAgIHdkLT5zdGEucHNNZ3IudGVtcFdha2VVcCA9IDA7CisgICAgd2QtPnN0YS5xb3NJbmZvID0gMDsKKyAgICB6ZlF1ZXVlRmx1c2goZGV2LCB3ZC0+c3RhLnVhcHNkUSk7CisKKyAgICB3ZC0+c3RhLmNvbm5lY3RTdGF0ZSA9IFpNX1NUQV9DT05OX1NUQVRFX05PTkU7CisKKyAgICAvL1Jlb3JkZXIgQnNzTGlzdCBieSBSU1NJLS1DV1lhbmcoKykKKyAgICB6ZkJzc0luZm9SZW9yZGVyTGlzdChkZXYpOworCisgICAgcE5vd0Jzc0luZm8gPSB6ZkluZnJhRmluZEFQVG9Db25uZWN0KGRldiwgJmNhbmRpZGF0ZUJzcyk7CisKKwlpZiAod2QtPnN0YS5TV0VuY3J5cHRFbmFibGUgIT0gMCkKKwl7CisJICAgIGlmICh3ZC0+c3RhLmJTYWZlTW9kZSA9PSAwKQorCSAgICB7CisJCSAgICB6ZlN0YURpc2FibGVTV0VuY3J5cHRpb24oZGV2KTsvL1F1aWNrbHkgcmVib290CisJICAgIH0KKwl9CisgICAgaWYgKCBwTm93QnNzSW5mbyAhPSBOVUxMICkKKyAgICB7CisgICAgICAgIC8vem1fYXNzZXJ0KHBOb3dCc3NJbmZvICE9IE5VTEwpOworCisgICAgICAgIHBCc3NJbmZvID0gcE5vd0Jzc0luZm87CisgICAgICAgIHdkLT5zdGEuc3NpZExlbiA9IHBCc3NJbmZvLT5zc2lkWzFdOworICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS5zc2lkLCAmKHBCc3NJbmZvLT5zc2lkWzJdKSwgcEJzc0luZm8tPnNzaWRbMV0pOworICAgICAgICB3ZC0+ZnJlcXVlbmN5ID0gcEJzc0luZm8tPmZyZXF1ZW5jeTsKKyAgICAgICAgLy93ZC0+c3RhLmZsYWdGcmVxQ2hhbmdpbmcgPSAxOworCisgICAgICAgIC8vemZDb3JlU2V0RnJlcXVlbmN5KGRldiwgd2QtPmZyZXF1ZW5jeSk7CisgICAgICAgIHpmVXBkYXRlQnNzaWQoZGV2LCBwQnNzSW5mby0+YnNzaWQpOworICAgICAgICB6ZlJlc2V0U3VwcG9ydFJhdGUoZGV2LCBaTV9ERUZBVUxUX1NVUFBPUlRfUkFURV9aRVJPKTsKKyAgICAgICAgemZVcGRhdGVTdXBwb3J0UmF0ZShkZXYsIHBCc3NJbmZvLT5zdXBwb3J0ZWRSYXRlcyk7CisgICAgICAgIHpmVXBkYXRlU3VwcG9ydFJhdGUoZGV2LCBwQnNzSW5mby0+ZXh0U3VwcG9ydGVkUmF0ZXMpOworCisgICAgICAgIHdkLT5iZWFjb25JbnRlcnZhbCA9IHBCc3NJbmZvLT5iZWFjb25JbnRlcnZhbFswXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUxNl90KSBwQnNzSW5mby0+YmVhY29uSW50ZXJ2YWxbMV0pIDw8IDgpOworICAgICAgICBpZiAod2QtPmJlYWNvbkludGVydmFsID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5iZWFjb25JbnRlcnZhbCA9IDEwMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEVTUyBiaXQgb24gKi8KKyAgICAgICAgd2QtPnN0YS5jYXBhYmlsaXR5WzBdIHw9IFpNX0JJVF8wOworICAgICAgICAvKiBJQlNTIGJpdCBvZmYgKi8KKyAgICAgICAgd2QtPnN0YS5jYXBhYmlsaXR5WzBdICY9IH5aTV9CSVRfMTsKKworICAgICAgICAvKiAxMW4gQVAgZmxhZyAqLworICAgICAgICB3ZC0+c3RhLkVuYWJsZUhUID0gcEJzc0luZm8tPkVuYWJsZUhUOworICAgICAgICB3ZC0+c3RhLlNHNDAgPSBwQnNzSW5mby0+U0c0MDsKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICBpZiAoIHBCc3NJbmZvLT5zZWN1cml0eVR5cGUgPT0gWk1fU0VDVVJJVFlfVFlQRV9DRU5DICkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnN0YS53bWVFbmFibGVkID0gMDsgLy9EaXNhYmxlIFdNTSBpbiBDRU5DCisgICAgICAgICAgICBjZW5jSW5pdChkZXYpOworICAgICAgICAgICAgY2VuY1NldENFTkNNb2RlKGRldiwgTmRpc0NFTkNfUFNLKTsKKyAgICAgICAgICAgIHdkLT5zdGEud3BhU3RhdGUgPSBaTV9TVEFfV1BBX1NUQVRFX0lOSVQ7CisgICAgICAgICAgICAvKiBDRU5DICovCisgICAgICAgICAgICBpZiAoIHBCc3NJbmZvLT5jZW5jSWVbMV0gIT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy93ZC0+c3RhLndlcFN0YXR1cyA9IFpNX0VOQ1JZUFRJT05fQ0VOQzsKKyAgICAgICAgICAgICAgICAvL3dkLT5zdGEuZW5jcnlNb2RlID0gWk1fQ0VOQzsKKyAgICAgICAgICAgICAgICB6ZndDZW5jSGFuZGxlQmVhY29uUHJvYnJlc3BvbihkZXYsICh1OF90ICopJnBCc3NJbmZvLT5jZW5jSWUsCisgICAgICAgICAgICAgICAgICAgICAgICAodThfdCAqKSZwQnNzSW5mby0+c3NpZCwgKHU4X3QgKikmcEJzc0luZm8tPm1hY2FkZHIpOworICAgICAgICAgICAgICAgIHpmTWVtb3J5Q29weSh3ZC0+c3RhLmNlbmNJZSwgcEJzc0luZm8tPmNlbmNJZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5jZW5jSWVbMV0rMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5jZW5jSWVbMV0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICBpZiAoIHBCc3NJbmZvLT5zZWN1cml0eVR5cGUgPT0gWk1fU0VDVVJJVFlfVFlQRV9XUEEgKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLndwYVN0YXRlID0gWk1fU1RBX1dQQV9TVEFURV9JTklUOworCisgICAgICAgICAgICBpZiAoIHdkLT5zdGEud2VwU3RhdHVzID09IFpNX0VOQ1JZUFRJT05fVEtJUCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5lbmNyeU1vZGUgPSBaTV9US0lQOworCisgICAgICAgICAgICAgICAgLyogVHVybiBvbiBzb2Z0d2FyZSBlbmNyeXB0aW9uL2RlY3J5cHRpb24gZm9yIFRLSVAgKi8KKyAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5FbmFibGVIVCA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgemZTdGFFbmFibGVTV0VuY3J5cHRpb24oZGV2LCAoWk1fU1dfVEtJUF9FTkNSWV9FTnxaTV9TV19US0lQX0RFQ1JZX0VOKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogRG8gbm90IHN1cHBvcnQgVEtJUCBpbiAxMW4gbW9kZSAqLworICAgICAgICAgICAgICAgIC8vd2QtPnN0YS5FbmFibGVIVCA9IDA7CisgICAgICAgICAgICAgICAgLy9wQnNzSW5mby0+ZW5hYmxlSFQ0MCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggd2QtPnN0YS53ZXBTdGF0dXMgPT0gWk1fRU5DUllQVElPTl9BRVMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gWk1fQUVTOworCisgICAgICAgICAgICAgICAgLyogSWYgQVAgc3VwcG9ydHMgSFQgbW9kZSAqLworICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLkVuYWJsZUhUKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogU2V0IE1QRFUgZGVuc2l0eSB0byA4IHVzKi8KKyAgICAgICAgICAgICAgICAgICAgZGVuc2l0eSA9IFpNX01QRFVfREVOU0lUWV84VVM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHBCc3NJbmZvLT53cGFJZVsxXSAhPSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS53cGFJZSwgcEJzc0luZm8tPndwYUllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnNzSW5mby0+d3BhSWVbMV0rMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS53cGFJZVsxXSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggcEJzc0luZm8tPnJzbkllWzFdICE9IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmTWVtb3J5Q29weSh3ZC0+c3RhLnJzbkllLCBwQnNzSW5mby0+cnNuSWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCc3NJbmZvLT5yc25JZVsxXSsyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLnJzbkllWzFdID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKworICAgICAgICAvKiBjaGVjayBwcmVhbWJsZSBiaXQgKi8KKyAgICAgICAgd2QtPnByZWFtYmxlVHlwZUluVXNlZCA9IHdkLT5wcmVhbWJsZVR5cGU7CisgICAgICAgIGlmICggd2QtPnByZWFtYmxlVHlwZUluVXNlZCA9PSBaTV9QUkVBTUJMRV9UWVBFX0FVVE8gKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocEJzc0luZm8tPmNhcGFiaWxpdHlbMF0gJiBaTV9CSVRfNSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+cHJlYW1ibGVUeXBlSW5Vc2VkID0gWk1fUFJFQU1CTEVfVFlQRV9TSE9SVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+cHJlYW1ibGVUeXBlSW5Vc2VkID0gWk1fUFJFQU1CTEVfVFlQRV9MT05HOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHdkLT5wcmVhbWJsZVR5cGVJblVzZWQgPT0gWk1fUFJFQU1CTEVfVFlQRV9MT05HKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gJj0gflpNX0JJVF81OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnN0YS5jYXBhYmlsaXR5WzBdIHw9IFpNX0JJVF81OworICAgICAgICB9CisKKyAgICAgICAgLyogY2hlY2sgODAyLjExbiA0ME1IeiBTZXR0aW5nICovCisgICAgICAgIGlmICgocEJzc0luZm8tPmVuYWJsZUhUNDAgPT0gMSkgJiYKKyAgICAgICAgICAgICgocEJzc0luZm8tPmV4dENoT2Zmc2V0ID09IDEpIHx8IChwQnNzSW5mby0+ZXh0Q2hPZmZzZXQgPT0gMykpKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+QmFuZFdpZHRoNDAgPSBwQnNzSW5mby0+ZW5hYmxlSFQ0MDsKKyAgICAgICAgICAgIHdkLT5FeHRPZmZzZXQgPSBwQnNzSW5mby0+ZXh0Q2hPZmZzZXQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+QmFuZFdpZHRoNDAgPSAwOworICAgICAgICAgICAgd2QtPkV4dE9mZnNldCA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvKiBjaGVjayA4MDIuMTFIIHN1cHBvcnQgYml0ICovCisKKyAgICAgICAgLyogY2hlY2sgT3dsIEFwICovCisgICAgICAgIGlmICggcEJzc0luZm8tPmF0aE93bEFwICYgWk1fQklUXzAgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBJbiB0aGlzIGZ1bmN0aW9uLCBGVyByZXRyeSB3aWxsIGJlIGVuYWJsZSwgWk1fTUFDX1JFR19SRVRSWV9NQVgKKyAgICAgICAgICAgICAgIHdpbGwgYmUgc2V0IHRvIDAuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHpmSHBEaXNhYmxlSHdSZXRyeShkZXYpOworICAgICAgICAgICAgd2QtPnN0YS5hdGhPd2xBcCA9IDE7CisgICAgICAgICAgICAvKiBTZXQgTVBEVSBkZW5zaXR5IHRvIDggdXMqLworICAgICAgICAgICAgZGVuc2l0eSA9IFpNX01QRFVfREVOU0lUWV84VVM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBJbiB0aGlzIGZ1bmN0aW9uLCBGVyByZXRyeSB3aWxsIGJlIGRpc2FibGUsIFpNX01BQ19SRUdfUkVUUllfTUFYCisgICAgICAgICAgICAgICB3aWxsIGJlIHNldCB0byAzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICB6ZkhwRW5hYmxlSHdSZXRyeShkZXYpOworICAgICAgICAgICAgd2QtPnN0YS5hdGhPd2xBcCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgd2QtPnJlb3JkZXIgPSAxOworCisgICAgICAgIC8qIFNldCBNUERVIGRlbnNpdHkgKi8KKyAgICAgICAgemZIcFNldE1QRFVEZW5zaXR5KGRldiwgZGVuc2l0eSk7CisKKyAgICAgICAgLyogY2hlY2sgc2hvcnQgc2xvdCB0aW1lIGJpdCAqLworICAgICAgICBpZiAoIHBCc3NJbmZvLT5jYXBhYmlsaXR5WzFdICYgWk1fQklUXzIgKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMV0gfD0gWk1fQklUXzI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIHBCc3NJbmZvLT5lcnAgJiBaTV9CSVRfMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMCgicHJvdGVjdGlvbiBtb2RlIG9uIik7CisgICAgICAgICAgICB3ZC0+c3RhLmJQcm90ZWN0aW9uTW9kZSA9IFRSVUU7CisgICAgICAgICAgICB6ZkhwU2V0U2xvdFRpbWUoZGV2LCAwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMCgicHJvdGVjdGlvbiBtb2RlIG9mZiIpOworICAgICAgICAgICAgd2QtPnN0YS5iUHJvdGVjdGlvbk1vZGUgPSBGQUxTRTsKKyAgICAgICAgICAgIHpmSHBTZXRTbG90VGltZShkZXYsIDEpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBCc3NJbmZvLT5tYXJ2ZWxBcCA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLmVuYWJsZURydkJBID0gMDsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiA4NzAxIDogTmV0R2VhciAzNTAwIChNQVJWRUxMKQorICAgICAgICAgICAgICogRG93bmxpbmsgaXNzdWUgOiBzZXQgc2xvdHRpbWUgdG8gMjAuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHpmSHBTZXRTbG90VGltZVJlZ2lzdGVyKGRldiwgMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+c3RhLmVuYWJsZURydkJBID0gMTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoaXMgaXMgbm90IGdvb2QgZm9yIGhlcmUgZG8gcmVzZXQgc2xvdCB0aW1lLgorICAgICAgICAgICAgICogSSB0aGluayBpdCBzaG91bGQgcmVzZXQgd2hlbiBsZWF2ZSBNQVJWRUxMIGFwCisgICAgICAgICAgICAgKiBvciBlbnRlciBkaXNjb25uZWN0IHN0YXRlIGV0Yy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgemZIcFNldFNsb3RUaW1lUmVnaXN0ZXIoZGV2LCAxKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vU3RvcmUgcHJvYmUgcmVzcG9uc2UgZnJhbWUgYm9keSwgZm9yIFZJU1RBIG9ubHkKKyAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlTaXplID0gcEJzc0luZm8tPmZyYW1lQm9keXNpemUgKyAxMjsKKyAgICAgICAgaWYgKHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5U2l6ZSA+IFpNX0NBQ0hFRF9GUkFNRUJPRFlfU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlTaXplID0gWk1fQ0FDSEVEX0ZSQU1FQk9EWV9TSVpFOworICAgICAgICB9CisgICAgICAgIGZvciAoaz0wOyBrPDg7IGsrKykKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlba10gPSBwQnNzSW5mby0+dGltZVN0YW1wW2tdOworICAgICAgICB9CisgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5WzhdID0gcEJzc0luZm8tPmJlYWNvbkludGVydmFsWzBdOworICAgICAgICB3ZC0+c3RhLmJlYWNvbkZyYW1lQm9keVs5XSA9IHBCc3NJbmZvLT5iZWFjb25JbnRlcnZhbFsxXTsKKyAgICAgICAgd2QtPnN0YS5iZWFjb25GcmFtZUJvZHlbMTBdID0gcEJzc0luZm8tPmNhcGFiaWxpdHlbMF07CisgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5WzExXSA9IHBCc3NJbmZvLT5jYXBhYmlsaXR5WzFdOworICAgICAgICBmb3IgKGs9MDsgazwod2QtPnN0YS5iZWFjb25GcmFtZUJvZHlTaXplIC0gMTIpOyBrKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5zdGEuYmVhY29uRnJhbWVCb2R5W2srMTJdID0gcEJzc0luZm8tPmZyYW1lQm9keVtrXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggKCBwQnNzSW5mby0+Y2FwYWJpbGl0eVswXSAmIFpNX0JJVF80ICkmJgorICAgICAgICAgICAgICgoIHdkLT5zdGEuYXV0aE1vZGUgPT0gWk1fQVVUSF9NT0RFX09QRU4gKXx8CisgICAgICAgICAgICAgICggd2QtPnN0YS5hdXRoTW9kZSA9PSBaTV9BVVRIX01PREVfU0hBUkVEX0tFWSl8fAorICAgICAgICAgICAgICAod2QtPnN0YS5hdXRoTW9kZSA9PSBaTV9BVVRIX01PREVfQVVUTykpICkKKyAgICAgICAgeyAgIC8qIHByaXZhY3kgZW5hYmxlZCAqLworCisgICAgICAgICAgICBpZiAoIHdkLT5zdGEud2VwU3RhdHVzID09IFpNX0VOQ1JZUFRJT05fV0VQX0RJU0FCTEVEICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJBZGFwdGVyIGlzIG5vIFdFUCwgdHJ5IHRvIGNvbm5lY3QgdG8gV0VQIEFQIik7CisgICAgICAgICAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIERvIG5vdCBzdXBwb3J0IFdFUCBpbiAxMW4gbW9kZSAqLworICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLndlcFN0YXR1cyA9PSBaTV9FTkNSWVBUSU9OX1dFUF9FTkFCTEVEICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBUdXJuIG9uIHNvZnR3YXJlIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBmb3IgV0VQICovCisgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEuRW5hYmxlSFQgPT0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHpmU3RhRW5hYmxlU1dFbmNyeXB0aW9uKGRldiwgKFpNX1NXX1dFUF9FTkNSWV9FTnxaTV9TV19XRVBfREVDUllfRU4pKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvL3dkLT5zdGEuRW5hYmxlSFQgPSAwOworICAgICAgICAgICAgICAgIC8vd2QtPkJhbmRXaWR0aDQwID0gMDsKKyAgICAgICAgICAgICAgICAvL3dkLT5FeHRPZmZzZXQgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0gfD0gWk1fQklUXzQ7CisKKyAgICAgICAgICAgIGlmICggd2QtPnN0YS5hdXRoTW9kZSA9PSBaTV9BVVRIX01PREVfQVVUTyApCisgICAgICAgICAgICB7IC8qIFRyeSB0byB1c2Ugb3BlbiBhbmQgc2hhcmVkLWtleSBhdXRoZWh0aWNhdGlvbiBhbHRlcm5hdGl2ZWx5ICovCisgICAgICAgICAgICAgICAgaWYgKCAod2QtPnN0YS5jb25uZWN0VGltZW91dENvdW50ICUgMikgPT0gMCApCisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuYklzU2hhcmVkS2V5ID0gMDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuYklzU2hhcmVkS2V5ID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCB3ZC0+c3RhLmF1dGhNb2RlICE9IFpNX0FVVEhfTU9ERV9TSEFSRURfS0VZICkKKyAgICAgICAgICAgIHsgICAvKiBvcGVuICBvciBhdXRvICovCisgICAgICAgICAgICAgICAgLy96ZlN0YVN0YXJ0Q29ubmVjdChkZXYsIDApOworICAgICAgICAgICAgICAgIHdkLT5zdGEuYklzU2hhcmVkS2V5ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCB3ZC0+c3RhLmF1dGhNb2RlICE9IFpNX0FVVEhfTU9ERV9PUEVOICkKKyAgICAgICAgICAgIHsgICAvKiBzaGFyZWQga2V5ICovCisgICAgICAgICAgICAgICAgLy96ZlN0YVN0YXJ0Q29ubmVjdChkZXYsIDEpIDsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmJJc1NoYXJlZEtleSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIChwQnNzSW5mby0+c2VjdXJpdHlUeXBlID09IFpNX1NFQ1VSSVRZX1RZUEVfV1BBKXx8CisgICAgICAgICAgICAgICAgIChwQnNzSW5mby0+Y2FwYWJpbGl0eVswXSAmIFpNX0JJVF80KSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5jYXBhYmlsaXR5WzBdIHw9IFpNX0JJVF80OworICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemUgV1BBIHJlbGF0ZWQgcGFyYW1ldGVycyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEuY2FwYWJpbGl0eVswXSAmPSAoflpNX0JJVF80KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogYXV0aGVudGljYXRpb24gd2l0aCBvcGVuIHN5c3RlbSAqLworICAgICAgICAgICAgLy96ZlN0YVN0YXJ0Q29ubmVjdChkZXYsIDApOworICAgICAgICAgICAgd2QtPnN0YS5iSXNTaGFyZWRLZXkgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLyogSW1wcm92ZSBXRVAvVEtJUCBwZXJmb3JtYWNlIHdpdGggSFQgQVAsIGRldGFpbCBpbmZvcm1hdGlvbiBwbGVhc2UgbG9vayBidWcjMzI0OTUgKi8KKyAgICAgICAgLyoKKyAgICAgICAgaWYgKCAocEJzc0luZm8tPmJyb2FkY29tSFRBcCA9PSAxKQorICAgICAgICAgICAgICYmICh3ZC0+c3RhLlNXRW5jcnlwdEVuYWJsZSAhPSAwKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmSHBTZXRUVFNJRlNUaW1lKGRldiwgMHhhKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmSHBTZXRUVFNJRlNUaW1lKGRldiwgMHg4KTsKKyAgICAgICAgfQorICAgICAgICAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJEZXNpcmVkIFNTSUQgbm90IGZvdW5kIik7CisgICAgICAgIGdvdG8gemxDb25uZWN0RmFpbGVkOworICAgIH0KKworCisgICAgemZDb3JlU2V0RnJlcXVlbmN5VjIoZGV2LCB3ZC0+ZnJlcXVlbmN5LCB6ZlN0YVN0YXJ0Q29ubmVjdENiKTsKKyAgICByZXR1cm47CisKK3psQ29ubmVjdEZhaWxlZDoKKyAgICB6ZlN0YUNvbm5lY3RGYWlsKGRldiwgWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfTk9UX0ZPVU5ELCB3ZC0+c3RhLmJzc2lkLCAwKTsKKyAgICByZXR1cm47Cit9CisKK3U4X3QgemZDaGVja1dQQUF1dGgoemRldl90KiBkZXYsIHN0cnVjdCB6c0Jzc0luZm8qIHBCc3NJbmZvKQoreworICAgIHU4X3QgICByZXQ9VFJVRTsKKyAgICB1OF90ICAgcG1rQ291bnQ7CisgICAgdThfdCAgIGk7CisgICAgdTE2X3QgICBlbmNBbGdvVHlwZSA9IDA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoIHdkLT5zdGEud2VwU3RhdHVzID09IFpNX0VOQ1JZUFRJT05fVEtJUCApCisgICAgeworICAgICAgICBlbmNBbGdvVHlwZSA9IFpNX1RLSVA7CisgICAgfQorICAgIGVsc2UgaWYgKCB3ZC0+c3RhLndlcFN0YXR1cyA9PSBaTV9FTkNSWVBUSU9OX0FFUyApCisgICAgeworICAgICAgICBlbmNBbGdvVHlwZSA9IFpNX0FFUzsKKyAgICB9CisKKyAgICBzd2l0Y2god2QtPnN0YS5hdXRoTW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgWk1fQVVUSF9NT0RFX1dQQToKKyAgICAgICAgY2FzZSBaTV9BVVRIX01PREVfV1BBUFNLOgorICAgICAgICAgICAgaWYgKCBwQnNzSW5mby0+d3BhSWVbMV0gPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBta0NvdW50ID0gcEJzc0luZm8tPndwYUllWzEyXTsKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBwbWtDb3VudDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggcEJzc0luZm8tPndwYUllWzE3ICsgNCppXSA9PSBlbmNBbGdvVHlwZSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXQgPSBGQUxTRTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fQVVUSF9NT0RFX1dQQTI6CisgICAgICAgIGNhc2UgWk1fQVVUSF9NT0RFX1dQQTJQU0s6CisgICAgICAgICAgICBpZiAoIHBCc3NJbmZvLT5yc25JZVsxXSA9PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcG1rQ291bnQgPSBwQnNzSW5mby0+cnNuSWVbOF07CisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgcG1rQ291bnQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIHBCc3NJbmZvLT5yc25JZVsxMyArIDQqaV0gPT0gZW5jQWxnb1R5cGUgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKK2RvbmU6CisgICAgcmV0dXJuIHJldDsKK30KKwordThfdCB6ZkNoZWNrQXV0aGVudGljYXRpb24oemRldl90KiBkZXYsIHN0cnVjdCB6c0Jzc0luZm8qIHBCc3NJbmZvKQoreworICAgIHU4X3QgICByZXQ9VFJVRTsKKyAgICB1MTZfdCAgZW5jQWxnb1R5cGU7CisgICAgdTE2X3QgVW5pY2FzdENpcGhlck51bTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIENvbm5lY3RpbmcgdG8gQU5ZIGhhcyBiZWVuIGNoZWNrZWQgKi8KKyAgICBpZiAoIHdkLT5zdGEuc3NpZExlbiA9PSAwICkKKyAgICB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisKKwlzd2l0Y2god2QtPnN0YS5hdXRoTW9kZSkKKwkvL3N3aXRjaCh3ZC0+d3MuYXV0aE1vZGUpLy9RdWlja2x5IHJlYm9vdAorICAgIHsKKyAgICAgICAgY2FzZSBaTV9BVVRIX01PREVfV1BBX0FVVE86CisgICAgICAgIGNhc2UgWk1fQVVUSF9NT0RFX1dQQVBTS19BVVRPOgorICAgICAgICAgICAgZW5jQWxnb1R5cGUgPSAwOworICAgICAgICAgICAgaWYocEJzc0luZm8tPnJzbkllWzFdICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVW5pY2FzdENpcGhlck51bSA9IChwQnNzSW5mby0+cnNuSWVbOF0pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBCc3NJbmZvLT5yc25JZVs5XSA8PCA4KTsKKworICAgICAgICAgICAgICAgIC8qIElmIHRoZXJlIGlzIG9ubHkgb25lIHVuaWNhc3QgY2lwaGVyICovCisgICAgICAgICAgICAgICAgaWYgKFVuaWNhc3RDaXBoZXJOdW0gPT0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVuY0FsZ29UeXBlID0gcEJzc0luZm8tPnJzbkllWzEzXTsKKyAgICAgICAgICAgICAgICAgICAgLy9lbmNBbGdvVHlwZSA9IHBCc3NJbmZvLT5yc25JZVs3XTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdTE2X3QgaWk7CisgICAgICAgICAgICAgICAgICAgIHUxNl90IGRlc2lyZWRDaXBoZXIgPSAwOworICAgICAgICAgICAgICAgICAgICB1MTZfdCBJRU9mZlNldCA9IDEzOworCisgICAgICAgICAgICAgICAgICAgIC8qIEVudW1lcmF0ZSBhbGwgdGhlIHN1cHBvcnRlZCB1bmljYXN0IGNpcGhlciAqLworICAgICAgICAgICAgICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCBVbmljYXN0Q2lwaGVyTnVtOyBpaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEJzc0luZm8tPnJzbkllW0lFT2ZmU2V0K2lpKjRdID4gZGVzaXJlZENpcGhlcikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkQ2lwaGVyID0gcEJzc0luZm8tPnJzbkllW0lFT2ZmU2V0K2lpKjRdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZW5jQWxnb1R5cGUgPSBkZXNpcmVkQ2lwaGVyOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICggZW5jQWxnb1R5cGUgPT0gMHgwMiApCisgICAgICAgICAgICAgICAgeworICAgIAkJCSAgICB3ZC0+c3RhLndlcFN0YXR1cyA9IFpNX0VOQ1JZUFRJT05fVEtJUDsKKworICAgIAkJCSAgICBpZiAoIHdkLT5zdGEuYXV0aE1vZGUgPT0gWk1fQVVUSF9NT0RFX1dQQV9BVVRPICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5jdXJyZW50QXV0aE1vZGUgPSBaTV9BVVRIX01PREVfV1BBMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIC8vWk1fQVVUSF9NT0RFX1dQQVBTS19BVVRPCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuY3VycmVudEF1dGhNb2RlID0gWk1fQVVUSF9NT0RFX1dQQTJQU0s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIGVuY0FsZ29UeXBlID09IDB4MDQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS53ZXBTdGF0dXMgPSBaTV9FTkNSWVBUSU9OX0FFUzsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIHdkLT5zdGEuYXV0aE1vZGUgPT0gWk1fQVVUSF9NT0RFX1dQQV9BVVRPICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5jdXJyZW50QXV0aE1vZGUgPSBaTV9BVVRIX01PREVfV1BBMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIC8vWk1fQVVUSF9NT0RFX1dQQVBTS19BVVRPCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuY3VycmVudEF1dGhNb2RlID0gWk1fQVVUSF9NT0RFX1dQQTJQU0s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihwQnNzSW5mby0+d3BhSWVbMV0gIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBVbmljYXN0Q2lwaGVyTnVtID0gKHBCc3NJbmZvLT53cGFJZVsxMl0pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBCc3NJbmZvLT53cGFJZVsxM10gPDwgOCk7CisKKyAgICAgICAgICAgICAgICAvKiBJZiB0aGVyZSBpcyBvbmx5IG9uZSB1bmljYXN0IGNpcGhlciAqLworICAgICAgICAgICAgICAgIGlmIChVbmljYXN0Q2lwaGVyTnVtID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbmNBbGdvVHlwZSA9IHBCc3NJbmZvLT53cGFJZVsxN107CisgICAgICAgICAgICAgICAgICAgIC8vZW5jQWxnb1R5cGUgPSBwQnNzSW5mby0+d3BhSWVbMTFdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1MTZfdCBpaTsKKyAgICAgICAgICAgICAgICAgICAgdTE2X3QgZGVzaXJlZENpcGhlciA9IDA7CisgICAgICAgICAgICAgICAgICAgIHUxNl90IElFT2ZmU2V0ID0gMTc7CisKKyAgICAgICAgICAgICAgICAgICAgLyogRW51bWVyYXRlIGFsbCB0aGUgc3VwcG9ydGVkIHVuaWNhc3QgY2lwaGVyICovCisgICAgICAgICAgICAgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IFVuaWNhc3RDaXBoZXJOdW07IGlpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQnNzSW5mby0+d3BhSWVbSUVPZmZTZXQraWkqNF0gPiBkZXNpcmVkQ2lwaGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRDaXBoZXIgPSBwQnNzSW5mby0+d3BhSWVbSUVPZmZTZXQraWkqNF07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBlbmNBbGdvVHlwZSA9IGRlc2lyZWRDaXBoZXI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCBlbmNBbGdvVHlwZSA9PSAweDAyICkKKyAgICAgICAgICAgICAgICB7CisgICAgCQkJICAgIHdkLT5zdGEud2VwU3RhdHVzID0gWk1fRU5DUllQVElPTl9US0lQOworCisgICAgCQkJICAgIGlmICggd2QtPnN0YS5hdXRoTW9kZSA9PSBaTV9BVVRIX01PREVfV1BBX0FVVE8gKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLmN1cnJlbnRBdXRoTW9kZSA9IFpNX0FVVEhfTU9ERV9XUEE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSAvL1pNX0FVVEhfTU9ERV9XUEFQU0tfQVVUTworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLmN1cnJlbnRBdXRoTW9kZSA9IFpNX0FVVEhfTU9ERV9XUEFQU0s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIGVuY0FsZ29UeXBlID09IDB4MDQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS53ZXBTdGF0dXMgPSBaTV9FTkNSWVBUSU9OX0FFUzsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIHdkLT5zdGEuYXV0aE1vZGUgPT0gWk1fQVVUSF9NT0RFX1dQQV9BVVRPICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5jdXJyZW50QXV0aE1vZGUgPSBaTV9BVVRIX01PREVfV1BBOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgLy9aTV9BVVRIX01PREVfV1BBUFNLX0FVVE8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5jdXJyZW50QXV0aE1vZGUgPSBaTV9BVVRIX01PREVfV1BBUFNLOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IEZBTFNFOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fQVVUSF9NT0RFX1dQQToKKyAgICAgICAgY2FzZSBaTV9BVVRIX01PREVfV1BBUFNLOgorICAgICAgICBjYXNlIFpNX0FVVEhfTU9ERV9XUEFfTk9ORToKKyAgICAgICAgY2FzZSBaTV9BVVRIX01PREVfV1BBMjoKKyAgICAgICAgY2FzZSBaTV9BVVRIX01PREVfV1BBMlBTSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIHBCc3NJbmZvLT5zZWN1cml0eVR5cGUgIT0gWk1fU0VDVVJJVFlfVFlQRV9XUEEgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0ID0gemZDaGVja1dQQUF1dGgoZGV2LCBwQnNzSW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX0FVVEhfTU9ERV9PUEVOOgorICAgICAgICBjYXNlIFpNX0FVVEhfTU9ERV9TSEFSRURfS0VZOgorICAgICAgICBjYXNlIFpNX0FVVEhfTU9ERV9BVVRPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggcEJzc0luZm8tPndzY0llWzFdICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBBUCBpcyBhIEp1bXBzdGFydCBBUCwgaXQncyBvayEhIFJheQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHBCc3NJbmZvLT5zZWN1cml0eVR5cGUgPT0gWk1fU0VDVVJJVFlfVFlQRV9XUEEgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3U4X3QgemZTdGFJc0Nvbm5lY3RlZCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoIHdkLT5zdGEuYWRhcHRlclN0YXRlID09IFpNX1NUQV9TVEFURV9DT05ORUNURUQgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgcmV0dXJuIEZBTFNFOworfQorCit1OF90IHpmU3RhSXNDb25uZWN0aW5nKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmICggd2QtPnN0YS5hZGFwdGVyU3RhdGUgPT0gWk1fU1RBX1NUQVRFX0NPTk5FQ1RJTkcgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgcmV0dXJuIEZBTFNFOworfQorCit1OF90IHpmU3RhSXNEaXNjb25uZWN0KHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmICggd2QtPnN0YS5hZGFwdGVyU3RhdGUgPT0gWk1fU1RBX1NUQVRFX0RJU0NPTk5FQ1QgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgcmV0dXJuIEZBTFNFOworfQorCit1OF90IHpmQ2hhbmdlQWRhcHRlclN0YXRlKHpkZXZfdCogZGV2LCB1OF90IG5ld1N0YXRlKQoreworICAgIHU4X3QgcmV0ID0gVFJVRTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICAvL2lmICggbmV3U3RhdGUgPT0gd2QtPnN0YS5hZGFwdGVyU3RhdGUgKQorICAgIC8veworICAgIC8vICAgIHJldHVybiBGQUxTRTsKKyAgICAvL30KKworICAgIHN3aXRjaChuZXdTdGF0ZSkKKyAgICB7CisgICAgY2FzZSBaTV9TVEFfU1RBVEVfRElTQ09OTkVDVDoKKyAgICAgICAgemZSZXNldFN1cHBvcnRSYXRlKGRldiwgWk1fREVGQVVMVF9TVVBQT1JUX1JBVEVfRElTQ09OTkVDVCk7CisKKyAgICAgICAgI2lmIDEKKyAgICAgICAgICAgIHpmU2Nhbk1nclNjYW5TdG9wKGRldiwgWk1fU0NBTl9NR1JfU0NBTl9JTlRFUk5BTCk7CisgICAgICAgICNlbHNlCisgICAgICAgICAgICBpZiAoIHdkLT5zdGEuYkNoYW5uZWxTY2FuICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBzdG9wIHRoZSBhY3Rpb24gb2YgY2hhbm5lbCBzY2FubmluZyAqLworICAgICAgICAgICAgICAgIHdkLT5zdGEuYkNoYW5uZWxTY2FuID0gRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0ID0gIFRSVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICNlbmRpZgorCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgWk1fU1RBX1NUQVRFX0NPTk5FQ1RJTkc6CisgICAgICAgICNpZiAxCisgICAgICAgICAgICB6ZlNjYW5NZ3JTY2FuU3RvcChkZXYsIFpNX1NDQU5fTUdSX1NDQU5fSU5URVJOQUwpOworICAgICAgICAjZWxzZQorICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLmJDaGFubmVsU2NhbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogc3RvcCB0aGUgYWN0aW9uIG9mIGNoYW5uZWwgc2Nhbm5pbmcgKi8KKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmJDaGFubmVsU2NhbiA9IEZBTFNFOworICAgICAgICAgICAgICAgIHJldCA9ICBUUlVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAjZW5kaWYKKworICAgICAgICBicmVhazsKKyAgICBjYXNlIFpNX1NUQV9TVEFURV9DT05ORUNURUQ6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vaWYgKCByZXQgKQorICAgIC8veworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB3ZC0+c3RhLmFkYXB0ZXJTdGF0ZSA9IG5ld1N0YXRlOworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIHptX2RlYnVnX21zZzEoImNoYW5nZSBhZGFwdGVyIHN0YXRlID0gIiwgbmV3U3RhdGUpOworICAgIC8vfQorCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmU3RhTW1BZGRJZVNzaWQgICAgICAgICAgICAqLworLyogICAgICBBZGQgaW5mb3JtYXRpb24gZWxlbWVudCBTU0lEIHRvIGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHRvIGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZmZlciBvZmZzZXQgYWZ0ZXIgYWRkaW5nIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEppLUh1YW5nIExlZSAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjExICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZlN0YUFkZEllU3NpZCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCkKK3sKKyAgICB1MTZfdCBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogRWxlbWVudCBJRCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgWk1fV0xBTl9FSURfU1NJRCk7CisKKyAgICAvKiBFbGVtZW50IExlbmd0aCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPnN0YS5zc2lkTGVuKTsKKworICAgIC8qIEluZm9ybWF0aW9uIDogU1NJRCAqLworICAgIGZvciAoaT0wOyBpPHdkLT5zdGEuc3NpZExlbjsgaSsrKQorICAgIHsKKyAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+c3RhLnNzaWRbaV0pOworICAgIH0KKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlN0YU1tQWRkSWVXcGEgICAgICAgICAgICAgKi8KKy8qICAgICAgQWRkIGluZm9ybWF0aW9uIGVsZW1lbnQgU1NJRCB0byBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGJ1ZmZlciB0byBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvZmZzZXQgOiBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCBmcm9tIHRoaXMgb2Zmc2V0ICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWZmZXIgb2Zmc2V0IGFmdGVyIGFkZGluZyBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBKaS1IdWFuZyBMZWUgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNi4wMSAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZTdGFBZGRJZVdwYVJzbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgdThfdCBmcmFtZVR5cGUpCit7CisgICAgdTMyX3QgIGk7CisgICAgdThfdCAgICBzc25bNjRdPXsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVsZW1lbnQgSUQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4ZGQsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZW5ndGggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MTgsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBPVUkgdHlwZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZlcnNpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEsIDB4MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBHcm91cCBDaXBoZXIgU3VpdGUsIGRlZmF1bHQ9VEtJUCAqLworICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBhaXJ3aXNlIENpcGhlciBTdWl0ZSBDb3VudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgMHgwMSwgMHgwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBhaXJ3aXNlIENpcGhlciBTdWl0ZSwgZGVmYXVsdD1US0lQICovCisgICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAweDUwLCAweGYyLCAweDAyLAorICAgICAgICAgICAgICAgICAgICAgICAgLyogQXV0aGVudGljYXRpb24gYW5kIEtleSBNYW5hZ2VtZW50IFN1aXRlIENvdW50ICovCisgICAgICAgICAgICAgICAgICAgICAgICAweDAxLCAweDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgLyogQXV0aGVudGljYXRpb24gdHlwZSwgZGVmYXVsdD1QU0sgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBXUEEgY2FwYWJpbGl0eSAqLworICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwMAorICAgICAgICAgICAgICAgICAgICB9OworCisgICAgdThfdCAgICByc25bNjRdPXsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVsZW1lbnQgSUQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZW5ndGggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZXJzaW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAweDAxLCAweDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgLyogR3JvdXAgQ2lwaGVyIFN1aXRlLCBkZWZhdWx0PVRLSVAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4MGYsIDB4YWMsIDB4MDIsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBQYWlyd2lzZSBDaXBoZXIgU3VpdGUgQ291bnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEsIDB4MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBQYWlyd2lzZSBDaXBoZXIgU3VpdGUsIGRlZmF1bHQ9VEtJUCAqLworICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwZiwgMHhhYywgMHgwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEF1dGhlbnRpY2F0aW9uIGFuZCBLZXkgTWFuYWdlbWVudCBTdWl0ZSBDb3VudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgMHgwMSwgMHgwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEF1dGhlbnRpY2F0aW9uIHR5cGUsIGRlZmF1bHQ9UFNLICovCisgICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAweDBmLCAweGFjLCAweDAyLAorICAgICAgICAgICAgICAgICAgICAgICAgLyogUlNOIGNhcGFiaWxpdHkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4MDAKKyAgICAgICAgICAgICAgICAgICAgfTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmICggd2QtPnN0YS5jdXJyZW50QXV0aE1vZGUgPT0gWk1fQVVUSF9NT0RFX1dQQVBTSyApCisgICAgeworICAgICAgICAvKiBPdmVyd3JpdGUgR3JvdXAgQ2lwaGVyIFN1aXRlIGJ5IEFQJ3Mgc2V0dGluZyAqLworICAgICAgICB6Zk1lbW9yeUNvcHkoc3NuKzgsIHdkLT5zdGEud3BhSWUrOCwgNCk7CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLndlcFN0YXR1cyA9PSBaTV9FTkNSWVBUSU9OX0FFUyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE92ZXJ3cml0ZSBQYWlyd2lzZSBDaXBoZXIgU3VpdGUgYnkgQUVTICovCisgICAgICAgICAgICB6Zk1lbW9yeUNvcHkoc3NuKzE0LCB6Z1dwYUFlc091aSwgNCk7CisgICAgICAgIH0KKworICAgICAgICB6ZkNvcHlUb0ludFR4QnVmZmVyKGRldiwgYnVmLCBzc24sIG9mZnNldCwgc3NuWzFdKzIpOworICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS53cGFJZSwgc3NuLCBzc25bMV0rMik7CisgICAgICAgIG9mZnNldCArPSAoc3NuWzFdKzIpOworICAgIH0KKyAgICBlbHNlIGlmICggd2QtPnN0YS5jdXJyZW50QXV0aE1vZGUgPT0gWk1fQVVUSF9NT0RFX1dQQSApCisgICAgeworICAgICAgICAvKiBPdmVyd3JpdGUgR3JvdXAgQ2lwaGVyIFN1aXRlIGJ5IEFQJ3Mgc2V0dGluZyAqLworICAgICAgICB6Zk1lbW9yeUNvcHkoc3NuKzgsIHdkLT5zdGEud3BhSWUrOCwgNCk7CisgICAgICAgIC8qIE92ZXJ3cml0ZSBLZXkgTWFuYWdlbWVudCBTdWl0ZSBieSBXUEEtUmFkaXVzICovCisgICAgICAgIHpmTWVtb3J5Q29weShzc24rMjAsIHpnV3BhUmFkaXVzT3VpLCA0KTsKKworICAgICAgICBpZiAoIHdkLT5zdGEud2VwU3RhdHVzID09IFpNX0VOQ1JZUFRJT05fQUVTICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogT3ZlcndyaXRlIFBhaXJ3aXNlIENpcGhlciBTdWl0ZSBieSBBRVMgKi8KKyAgICAgICAgICAgIHpmTWVtb3J5Q29weShzc24rMTQsIHpnV3BhQWVzT3VpLCA0KTsKKyAgICAgICAgfQorCisgICAgICAgIHpmQ29weVRvSW50VHhCdWZmZXIoZGV2LCBidWYsIHNzbiwgb2Zmc2V0LCBzc25bMV0rMik7CisgICAgICAgIHpmTWVtb3J5Q29weSh3ZC0+c3RhLndwYUllLCBzc24sIHNzblsxXSsyKTsKKyAgICAgICAgb2Zmc2V0ICs9IChzc25bMV0rMik7CisgICAgfQorICAgIGVsc2UgaWYgKCB3ZC0+c3RhLmN1cnJlbnRBdXRoTW9kZSA9PSBaTV9BVVRIX01PREVfV1BBMlBTSyApCisgICAgeworICAgICAgICAvKiBPdmVyd3JpdGUgR3JvdXAgQ2lwaGVyIFN1aXRlIGJ5IEFQJ3Mgc2V0dGluZyAqLworICAgICAgICB6Zk1lbW9yeUNvcHkocnNuKzQsIHdkLT5zdGEucnNuSWUrNCwgNCk7CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLndlcFN0YXR1cyA9PSBaTV9FTkNSWVBUSU9OX0FFUyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE92ZXJ3cml0ZSBQYWlyd2lzZSBDaXBoZXIgU3VpdGUgYnkgQUVTICovCisgICAgICAgICAgICB6Zk1lbW9yeUNvcHkocnNuKzEwLCB6Z1dwYTJBZXNPdWksIDQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBmcmFtZVR5cGUgPT0gWk1fV0xBTl9GUkFNRV9UWVBFX1JFQVNPQ1JFUSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcihpPTA7IGk8d2QtPnN0YS5wbWtpZEluZm8uYnNzaWRDb3VudDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggemZNZW1vcnlJc0VxdWFsKCh1OF90Kikgd2QtPnN0YS5wbWtpZEluZm8uYnNzaWRJbmZvW2ldLmJzc2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1OF90Kikgd2QtPnN0YS5ic3NpZCwgNikgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogbWF0Y2hlZCAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIGkgPCB3ZC0+c3RhLnBta2lkSW5mby5ic3NpZENvdW50ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZpbGwgUE1LSUQgQ291bnQgaW4gUlNOIGluZm9ybWF0aW9uIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgcnNuWzIyXSA9IDB4MDE7CisgICAgICAgICAgICAgICAgICAgIHJzblsyM10gPSAweDAwOworCisgICAgICAgICAgICAgICAgICAgIC8vIEZpbGwgUE1LSUQgaW4gUlNOIGluZm9ybWF0aW9uIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgemZNZW1vcnlDb3B5KHJzbisyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucG1raWRJbmZvLmJzc2lkSW5mb1tpXS5wbWtpZCwgMTYpOworCQkJICAgICAgICAgICAgICAgICByc25bMV0gKz0gMTg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgemZDb3B5VG9JbnRUeEJ1ZmZlcihkZXYsIGJ1ZiwgcnNuLCBvZmZzZXQsIHJzblsxXSsyKTsKKyAgICAgICAgemZNZW1vcnlDb3B5KHdkLT5zdGEucnNuSWUsIHJzbiwgcnNuWzFdKzIpOworICAgICAgICBvZmZzZXQgKz0gKHJzblsxXSsyKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIHdkLT5zdGEuY3VycmVudEF1dGhNb2RlID09IFpNX0FVVEhfTU9ERV9XUEEyICkKKyAgICB7CisgICAgICAgIC8qIE92ZXJ3cml0ZSBHcm91cCBDaXBoZXIgU3VpdGUgYnkgQVAncyBzZXR0aW5nICovCisgICAgICAgIHpmTWVtb3J5Q29weShyc24rNCwgd2QtPnN0YS5yc25JZSs0LCA0KTsKKyAgICAgICAgLyogT3ZlcndyaXRlIEtleSBNYW5hZ2VtZW50IFN1aXRlIGJ5IFdQQTItUmFkaXVzICovCisgICAgICAgIHpmTWVtb3J5Q29weShyc24rMTYsIHpnV3BhMlJhZGl1c091aSwgNCk7CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLndlcFN0YXR1cyA9PSBaTV9FTkNSWVBUSU9OX0FFUyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE92ZXJ3cml0ZSBQYWlyd2lzZSBDaXBoZXIgU3VpdGUgYnkgQUVTICovCisgICAgICAgICAgICB6Zk1lbW9yeUNvcHkocnNuKzEwLCB6Z1dwYTJBZXNPdWksIDQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCggZnJhbWVUeXBlID09IFpNX1dMQU5fRlJBTUVfVFlQRV9SRUFTT0NSRVEgfHwgKCBmcmFtZVR5cGUgPT0gWk1fV0xBTl9GUkFNRV9UWVBFX0FTT0NSRVEgKSkpCisgICAgICAgIHsKKworICAgICAgICAgICAgaWYgKHdkLT5zdGEucG1raWRJbmZvLmJzc2lkQ291bnQgIT0gMCkgeworICAgICAgICAgICAgICAgIC8vIEZpbGwgUE1LSUQgQ291bnQgaW4gUlNOIGluZm9ybWF0aW9uIGVsZW1lbnQKKyAgICAgICAgICAgICAgICByc25bMjJdID0gMTsKKyAgICAgICAgICAgICAgICByc25bMjNdID0gMDsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqICBUaGUgY2FsbGVyIGlzIHJlc3Buc2libGUgdG8gZ2l2ZSB1cyB0aGUgcmVsZXZhbnQgUE1LSUQuCisgICAgICAgICAgICAgICAgICogIFdlJ2xsIG9ubHkgYWNjZXB0IDEgUE1LSUQgZm9yIG5vdy4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPHdkLT5zdGEucG1raWRJbmZvLmJzc2lkQ291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggemZNZW1vcnlJc0VxdWFsKCh1OF90Kikgd2QtPnN0YS5wbWtpZEluZm8uYnNzaWRJbmZvW2ldLmJzc2lkLCAodThfdCopIHdkLT5zdGEuYnNzaWQsIDYpICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgemZNZW1vcnlDb3B5KHJzbisyNCwgd2QtPnN0YS5wbWtpZEluZm8uYnNzaWRJbmZvW2ldLnBta2lkLCAxNik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByc25bMV0gKz0gMTg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIHpmQ29weVRvSW50VHhCdWZmZXIoZGV2LCBidWYsIHJzbiwgb2Zmc2V0LCByc25bMV0rMik7CisgICAgICAgIHpmTWVtb3J5Q29weSh3ZC0+c3RhLnJzbkllLCByc24sIHJzblsxXSsyKTsKKyAgICAgICAgb2Zmc2V0ICs9IChyc25bMV0rMik7CisgICAgfQorCisgICAgcmV0dXJuIG9mZnNldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmU3RhQWRkSWVJYnNzICAgICAgICAgICAgICAqLworLyogICAgICBBZGQgaW5mb3JtYXRpb24gZWxlbWVudCBJQlNTIHBhcmFtZXRlciB0byBidWZmZXIuICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHRvIGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZmZlciBvZmZzZXQgYWZ0ZXIgYWRkaW5nIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEppLUh1YW5nIExlZSAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEyICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZlN0YUFkZEllSWJzcyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBFbGVtZW50IElEICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBaTV9XTEFOX0VJRF9JQlNTKTsKKworICAgIC8qIEVsZW1lbnQgTGVuZ3RoICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAyKTsKKworICAgIC8qIEFUSU0gd2luZG93ICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPnN0YS5hdGltV2luZG93KTsKKyAgICBvZmZzZXQgKz0gMjsKKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZTdGFBZGRJZVdtZUluZm8gICAgICAgICAgICovCisvKiAgICAgIEFkZCBXTUUgSW5mb3JtYXRpb24gRWxlbWVudCB0byBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWYgOiBidWZmZXIgdG8gYWRkIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgb2Zmc2V0IDogYWRkIGluZm9ybWF0aW9uIGVsZW1lbnQgZnJvbSB0aGlzIG9mZnNldCAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmZmVyIG9mZnNldCBhZnRlciBhZGRpbmcgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDYuNiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmU3RhQWRkSWVXbWVJbmZvKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1OF90IHFvc0luZm8pCit7CisgICAgLyogRWxlbWVudCBJRCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgWk1fV0xBTl9FSURfV0lGSV9JRSk7CisKKyAgICAvKiBFbGVtZW50IExlbmd0aCAqLworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgNyk7CisKKyAgICAvKiBPVUkgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4MDApOworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHg1MCk7CisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweEYyKTsKKyAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDB4MDIpOworICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMHgwMCk7CisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAweDAxKTsKKworICAgIC8qIFFvUyBJbmZvICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBxb3NJbmZvKTsKKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlN0YUFkZEllUG93ZXJDYXAgICAgICAgICAgKi8KKy8qICAgICAgQWRkIGluZm9ybWF0aW9uIGVsZW1lbnQgUG93ZXIgY2FwYWJpbGl0eSB0byBidWZmZXIuICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGJ1ZmZlciB0byBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvZmZzZXQgOiBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCBmcm9tIHRoaXMgb2Zmc2V0ICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWZmZXIgb2Zmc2V0IGFmdGVyIGFkZGluZyBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTaGFyb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDcuMTIgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZTdGFBZGRJZVBvd2VyQ2FwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KQoreworICAgIHU4X3QgTWF4VHhQb3dlcjsKKyAgICB1OF90IE1pblR4UG93ZXI7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBFbGVtZW50IElEICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBaTV9XTEFOX0VJRF9QT1dFUl9DQVBBQklMSVRZKTsKKworICAgIC8qIEVsZW1lbnQgTGVuZ3RoICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCAyKTsKKworICAgIE1pblR4UG93ZXIgPSAodThfdCkoemZIcEdldE1pblR4UG93ZXIoZGV2KS8yKTsKKyAgICBNYXhUeFBvd2VyID0gKHU4X3QpKHpmSHBHZXRNYXhUeFBvd2VyKGRldikvMik7CisKKyAgICAvKiBNaW4gVHJhbnNtaXQgUG93ZXIgQ2FwICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCsrLCBNaW5UeFBvd2VyKTsKKworICAgIC8qIE1heCBUcmFuc21pdCBQb3dlciBDYXAgKi8KKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0KyssIE1heFR4UG93ZXIpOworCisgICAgcmV0dXJuIG9mZnNldDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlN0YUFkZEllU3VwcG9ydENoICAgICAgICAgICAgICAqLworLyogICAgICBBZGQgaW5mb3JtYXRpb24gZWxlbWVudCBzdXBwb3J0ZWQgY2hhbm5lbHMgdG8gYnVmZmVyLiAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGJ1ZmZlciB0byBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvZmZzZXQgOiBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCBmcm9tIHRoaXMgb2Zmc2V0ICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWZmZXIgb2Zmc2V0IGFmdGVyIGFkZGluZyBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTaGFyb24gICAgICAgICAgICAyMDA3LjEyICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZlN0YUFkZEllU3VwcG9ydENoKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KQoreworCisgICAgdThfdCAgIGk7CisgICAgdTE2X3QgIGNvdW50XzI0RyA9IDA7CisgICAgdTE2X3QgIGNvdW50XzVHID0gMDsKKyAgICB1MTZfdCAgY2hhbm5lbE51bTsKKyAgICB1OF90ICAgbGVuZ3RoOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgZm9yIChpID0gMDsgaSA8IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpKyspCisgICAgeworICAgICAgICBpZiAod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbCA8IDMwMDApCisgICAgICAgIHsgLy8gMi40SHoKKyAgICAgICAgICAgIGNvdW50XzI0RysrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAvLyA1R0h6CisgICAgICAgICAgICBjb3VudF81RysrOworICAgICAgICB9CisgICAgfQorCisgICAgbGVuZ3RoID0gKHU4X3QpKGNvdW50XzVHICogMiArIDIpOyAvLzVHIGZpbGwgYnkgcGFpciwgMiw0RyAoY29udGludW91cyBjaGFubmVscykgZmlsbCAyIGJ5dGVzCisKKyAgICAvKiBFbGVtZW50IElEICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBaTV9XTEFOX0VJRF9TVVBQT1JURURfQ0hBTk5FTFMgKTsKKworICAgIC8qIEVsZW1lbnQgTGVuZ3RoICovCisgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBsZW5ndGgpOworCisgICAgLy8gMi40R0h6IChjb250aW51b3VzIGNoYW5uZWxzKQorICAgIC8qIEZpcnN0IGNoYW5uZWwgbnVtYmVyICovCisgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCsrLCAxKTsgLy9TdGFydCBmcm9tIGNoYW5ubGUgMQorICAgIC8qIE51bWJlciBvZiBjaGFubmVscyAqLworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQrKywgY291bnRfMjRHKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbENudCA7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsID4gNDAwMCAmJiB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsIDwgNTAwMCkKKyAgICAgICAgeyAvLyA1R0h6IDQwMDAgLTUwMDBNaHoKKyAgICAgICAgICAgIGNoYW5uZWxOdW0gPSAod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbC00MDAwKS81OworICAgICAgICAgICAgLyogRmlyc3QgY2hhbm5lbCBudW1iZXIgKi8KKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQrKywgY2hhbm5lbE51bSk7CisgICAgICAgICAgICAvKiBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQrKywgMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbCA+PSA1MDAwKQorICAgICAgICB7IC8vIDVHSHogPjUwMDBNaHoKKyAgICAgICAgICAgIGNoYW5uZWxOdW0gPSAod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbC01MDAwKS81OworICAgICAgICAgICAgLyogRmlyc3QgY2hhbm5lbCBudW1iZXIgKi8KKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQrKywgY2hhbm5lbE51bSk7CisgICAgICAgICAgICAvKiBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KKyAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQrKywgMSk7CisgICAgICAgIH0KKyAgICB9CisgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuIG9mZnNldDsKK30KKwordm9pZCB6ZlN0YVN0YXJ0Q29ubmVjdENiKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHpmU3RhU3RhcnRDb25uZWN0KGRldiwgd2QtPnN0YS5iSXNTaGFyZWRLZXkpOworfQorCit2b2lkIHpmU3RhU3RhcnRDb25uZWN0KHpkZXZfdCogZGV2LCB1OF90IGJJc1NoYXJlZEtleSkKK3sKKyAgICB1MzJfdCBwMSwgcDI7CisgICAgdThfdCBuZXdDb25uU3RhdGU7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8qIHAxX2xvdyA9IGFsZ29yaXRobSBudW1iZXIsIHAxX2hpZ2ggPSB0cmFuc2FjdGlvbiBzZXF1ZW5jZSBudW1iZXIgKi8KKyAgICBpZiAoIGJJc1NoYXJlZEtleSApCisgICAgeworICAgICAgICAvL3dkLT5zdGEuY29ubmVjdFN0YXRlID0gWk1fU1RBX0NPTk5fU1RBVEVfQVVUSF9TSEFSRV8xOworICAgICAgICBuZXdDb25uU3RhdGUgPSBaTV9TVEFfQ09OTl9TVEFURV9BVVRIX1NIQVJFXzE7CisgICAgICAgIHptX2RlYnVnX21zZzAoIlpNX1NUQV9DT05OX1NUQVRFX0FVVEhfU0hBUkVfMSIpOworICAgICAgICBwMSA9IFpNX0FVVEhfQUxHT19TSEFSRURfS0VZOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvL3dkLT5zdGEuY29ubmVjdFN0YXRlID0gWk1fU1RBX0NPTk5fU1RBVEVfQVVUSF9PUEVOOworICAgICAgICBuZXdDb25uU3RhdGUgPSBaTV9TVEFfQ09OTl9TVEFURV9BVVRIX09QRU47CisgICAgICAgIHptX2RlYnVnX21zZzAoIlpNX1NUQV9DT05OX1NUQVRFX0FVVEhfT1BFTiIpOworICAgICAgICBpZiggd2QtPnN0YS5sZWFwRW5hYmxlZCApCisgICAgICAgICAgICBwMSA9IFpNX0FVVEhfQUxHT19MRUFQOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwMSA9IFpNX0FVVEhfQUxHT19PUEVOX1NZU1RFTTsKKyAgICB9CisKKyAgICAvKiBzdGF0dXMgY29kZSAqLworICAgIHAyID0gMHgwOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB3ZC0+c3RhLmNvbm5lY3RUaW1lciA9IHdkLT50aWNrOworICAgIHdkLT5zdGEuY29ubmVjdFN0YXRlID0gbmV3Q29ublN0YXRlOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAvKiBzZW5kIHRoZSAxc3QgYXV0aGVudGljYXRpb24gZnJhbWUgKi8KKyAgICB6ZlNlbmRNbUZyYW1lKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX0FVVEgsIHdkLT5zdGEuYnNzaWQsIHAxLCBwMiwgMCk7CisKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgemZTZW5kTnVsbERhdGEoemRldl90KiBkZXYsIHU4X3QgdHlwZSkKK3sKKyAgICB6YnVmX3QqIGJ1ZjsKKyAgICAvL3UxNl90IGFkZHJUYmxTaXplOworICAgIC8vc3RydWN0IHpzQWRkclRibCBhZGRyVGJsOworICAgIHUxNl90IGVycjsKKyAgICB1MTZfdCBobGVuOworICAgIHUxNl90IGhlYWRlclsoMzQrOCsxKS8yXTsKKyAgICB1MTZfdCBiY2FzdEFkZHJbM10gPSB7MHhmZmZmLDB4ZmZmZiwweGZmZmZ9OworICAgIHUxNl90ICpkc3RBZGRyOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKChidWYgPSB6ZndCdWZBbGxvY2F0ZShkZXYsIDEwMjQpKSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgem1fbXNnMF9tbShaTV9MVl8wLCAiQWxsb2MgbW0gYnVmIEZhaWwhIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB6ZndCdWZTZXRTaXplKGRldiwgYnVmLCAwKTsKKworICAgIC8vem1fbXNnMl9tbShaTV9MVl8yLCAiYnVmLT5sZW49IiwgYnVmLT5sZW4pOworCisgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTKQorICAgIHsKKyAgICAgICAgZHN0QWRkciA9IGJjYXN0QWRkcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZHN0QWRkciA9IHdkLT5zdGEuYnNzaWQ7CisgICAgfQorCisgICAgaWYgKHdkLT5zdGEud21lQ29ubmVjdGVkICE9IDApCisgICAgeworICAgICAgICAvKiBJZiBjb25uZWN0IHRvIGEgV01NIEFQLCBTZW5kIFFvUyBOdWxsIGRhdGEgKi8KKyAgICAgICAgaGxlbiA9IHpmVHhHZW5NbUhlYWRlcihkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9RT1NfTlVMTCwgZHN0QWRkciwgaGVhZGVyLCAwLCBidWYsIDAsIDApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBobGVuID0gemZUeEdlbk1tSGVhZGVyKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX05VTEwsIGRzdEFkZHIsIGhlYWRlciwgMCwgYnVmLCAwLCAwKTsKKyAgICB9CisKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUpCisgICAgeworICAgICAgICBoZWFkZXJbNF0gfD0gMHgwMTAwOyAvL1RPRFMgYml0CisgICAgfQorCisgICAgaWYgKCB0eXBlID09IDEgKQorICAgIHsKKyAgICAgICAgaGVhZGVyWzRdIHw9IDB4MTAwMDsKKyAgICB9CisKKyAgICAvKiBHZXQgYnVmZmVyIERNQSBhZGRyZXNzICovCisgICAgLy9pZiAoKGFkZHJUYmxTaXplID0gemZ3QnVmTWFwRG1hKGRldiwgYnVmLCAmYWRkclRibCkpID09IDApCisgICAgLy9pZiAoKGFkZHJUYmxTaXplID0gemZ3TWFwVHhEbWEoZGV2LCBidWYsICZhZGRyVGJsKSkgPT0gMCkKKyAgICAvL3sKKyAgICAvLyAgICBnb3RvIHpsRXJyb3I7CisgICAgLy99CisKKyAgICAvKmluY3JlYXNlIHVuaWNhc3QgZnJhbWUgY291bnRlciovCisgICAgd2QtPmNvbW1UYWxseS50eFVuaWNhc3RGcm0rKzsKKworICAgIGlmICgoZXJyID0gemZIcFNlbmQoZGV2LCBoZWFkZXIsIGhsZW4sIE5VTEwsIDAsIE5VTEwsIDAsIGJ1ZiwgMCwKKyAgICAgICAgICAgIFpNX0lOVEVSTkFMX0FMTE9DX0JVRiwgMCwgMHhmZikpICE9IFpNX1NVQ0NFU1MpCisgICAgeworICAgICAgICBnb3RvIHpsRXJyb3I7CisgICAgfQorCisKKyAgICByZXR1cm47CisKK3psRXJyb3I6CisKKyAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICByZXR1cm47CisKK30KKwordm9pZCB6ZlNlbmRQU1BvbGwoemRldl90KiBkZXYpCit7CisgICAgemJ1Zl90KiBidWY7CisgICAgLy91MTZfdCBhZGRyVGJsU2l6ZTsKKyAgICAvL3N0cnVjdCB6c0FkZHJUYmwgYWRkclRibDsKKyAgICB1MTZfdCBlcnI7CisgICAgdTE2X3QgaGxlbjsKKyAgICB1MTZfdCBoZWFkZXJbKDgrMjQrMSkvMl07CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoKGJ1ZiA9IHpmd0J1ZkFsbG9jYXRlKGRldiwgMTAyNCkpID09IE5VTEwpCisgICAgeworICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJBbGxvYyBtbSBidWYgRmFpbCEiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHpmd0J1ZlNldFNpemUoZGV2LCBidWYsIDApOworCisgICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJidWYtPmxlbj0iLCBidWYtPmxlbik7CisKKyAgICB6ZlR4R2VuTW1IZWFkZXIoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfUFNQT0xMLCB3ZC0+c3RhLmJzc2lkLCBoZWFkZXIsIDAsIGJ1ZiwgMCwgMCk7CisKKyAgICBoZWFkZXJbMF0gPSAyMDsKKyAgICBoZWFkZXJbNF0gfD0gMHgxMDAwOworICAgIGhlYWRlcls1XSA9IHdkLT5zdGEuYWlkIHwgMHhjMDAwOyAvL0JvdGggYml0LTE0IGFuZCBiaXQtMTUgYXJlIDEKKyAgICBobGVuID0gMTYgKyA4OworCisgICAgLyogR2V0IGJ1ZmZlciBETUEgYWRkcmVzcyAqLworICAgIC8vaWYgKChhZGRyVGJsU2l6ZSA9IHpmd0J1Zk1hcERtYShkZXYsIGJ1ZiwgJmFkZHJUYmwpKSA9PSAwKQorICAgIC8vaWYgKChhZGRyVGJsU2l6ZSA9IHpmd01hcFR4RG1hKGRldiwgYnVmLCAmYWRkclRibCkpID09IDApCisgICAgLy97CisgICAgLy8gICAgZ290byB6bEVycm9yOworICAgIC8vfQorCisgICAgaWYgKChlcnIgPSB6ZkhwU2VuZChkZXYsIGhlYWRlciwgaGxlbiwgTlVMTCwgMCwgTlVMTCwgMCwgYnVmLCAwLAorICAgICAgICAgICAgWk1fSU5URVJOQUxfQUxMT0NfQlVGLCAwLCAweGZmKSkgIT0gWk1fU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGdvdG8gemxFcnJvcjsKKyAgICB9CisKKyAgICByZXR1cm47CisKK3psRXJyb3I6CisKKyAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICByZXR1cm47CisKK30KKwordm9pZCB6ZlNlbmRCQSh6ZGV2X3QqIGRldiwgdTE2X3Qgc3RhcnRfc2VxLCB1OF90ICpiaXRtYXApCit7CisgICAgemJ1Zl90KiBidWY7CisgICAgLy91MTZfdCBhZGRyVGJsU2l6ZTsKKyAgICAvL3N0cnVjdCB6c0FkZHJUYmwgYWRkclRibDsKKyAgICB1MTZfdCBlcnI7CisgICAgdTE2X3QgaGxlbjsKKyAgICB1MTZfdCBoZWFkZXJbKDgrMjQrMSkvMl07CisgICAgdTE2X3QgaSwgb2Zmc2V0ID0gMDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmICgoYnVmID0gemZ3QnVmQWxsb2NhdGUoZGV2LCAxMDI0KSkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIkFsbG9jIG1tIGJ1ZiBGYWlsISIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgemZ3QnVmU2V0U2l6ZShkZXYsIGJ1ZiwgMTIpOyAvLyAyOCA9IEZDIDIgKyBEVSAyICsgUkEgNiArIFRBIDYgKyBCQUMgMiArIFNFUSAyICsgQml0TWFwIDgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEyID0gQkFDIDIgKyBTRVEgMiArIEJpdE1hcCA4CisKKyAgICAvL3ptX21zZzJfbW0oWk1fTFZfMiwgImJ1Zi0+bGVuPSIsIGJ1Zi0+bGVuKTsKKworICAgIHpmVHhHZW5NbUhlYWRlcihkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9CQSwgd2QtPnN0YS5ic3NpZCwgaGVhZGVyLCAwLCBidWYsIDAsIDApOworCisgICAgaGVhZGVyWzBdID0gMzI7IC8qIE1BQyBoZWFkZXIgMTYgKyBCQSBjb250cm9sIDIgKyBCQSBpbmZvIDEwICsgRkNTIDQqLworICAgIGhlYWRlclsxXSA9IDB4NDsgIC8qIE5vIEFDSyAqLworCisgICAgLyogc2VuZCBieSBPRkRNIDZNICovCisgICAgaGVhZGVyWzJdID0gKHUxNl90KSh6Y1JhdGVUb1BoeUN0cmxbNF0gJiAweGZmZmYpOworICAgIGhlYWRlclszXSA9ICh1MTZfdCkoemNSYXRlVG9QaHlDdHJsWzRdPj4xNikgJiAweGZmZmY7CisKKyAgICBobGVuID0gMTYgKyA4OyAgLyogTUFDIGhlYWRlciAxNiArIGNvbnRyb2wgOCovCisgICAgb2Zmc2V0ID0gMDsKKyAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCAweDA1KTsgLypjb21wcmVzc2VkIGJpdG1hcCBvbiovCisgICAgb2Zmc2V0Kz0yOworICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHN0YXJ0X3NlcSk7CisgICAgb2Zmc2V0Kz0yOworCisgICAgZm9yIChpPTA7IGk8ODsgaSsrKSB7CisgICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQsIGJpdG1hcFtpXSk7CisgICAgICAgIG9mZnNldCsrOworICAgIH0KKworICAgIGlmICgoZXJyID0gemZIcFNlbmQoZGV2LCBoZWFkZXIsIGhsZW4sIE5VTEwsIDAsIE5VTEwsIDAsIGJ1ZiwgMCwKKyAgICAgICAgICAgIFpNX0lOVEVSTkFMX0FMTE9DX0JVRiwgMCwgMHhmZikpICE9IFpNX1NVQ0NFU1MpCisgICAgeworICAgICAgICBnb3RvIHpsRXJyb3I7CisgICAgfQorCisgICAgcmV0dXJuOworCit6bEVycm9yOgorCisgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgcmV0dXJuOworCit9CisKK3ZvaWQgemZTdGFHZXRUeFJhdGUoemRldl90KiBkZXYsIHUxNl90KiBtYWNBZGRyLCB1MzJfdCogcGh5Q3RybCwKKyAgICAgICAgdTE2X3QqIHJjUHJvYmluZ0ZsYWcpCit7CisgICAgdThfdCAgIGFkZHJbNl0sIGk7CisgICAgdThfdCAgIHJhdGU7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBaTV9NQUNfV09SRF9UT19CWVRFKG1hY0FkZHIsIGFkZHIpOworICAgICpwaHlDdHJsID0gMDsKKworICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgIHsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgcmF0ZSA9ICh1OF90KXpmUmF0ZUN0cmxHZXRUeFJhdGUoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9bMF0ucmNDZWxsLCByY1Byb2JpbmdGbGFnKTsKKy8vI2lmZGVmIFpNX0ZCNTAKKyAgICAgICAgLy9yYXRlID0gMjc7CisvLyNlbmRpZgorICAgICAgICAqcGh5Q3RybCA9IHpjUmF0ZVRvUGh5Q3RybFtyYXRlXTsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgZm9yKGk9MDsgaTx3ZC0+c3RhLm9wcG9zaXRlQ291bnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBhZGRyWzBdICYmIDB4MDEgPT0gMSApIC8vIFRoZSBkZWZhdWx0IGJlYWNvbiB0cmFuc21pdHRlZCByYXRlIGlzIENDSyBhbmQgMSBNYnBzICwgYnV0IHRoZSBhIG1vZGUgc2hvdWxkIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9GRE0gbW9kdWxhdGlvbiBhbmQgNk1icHMgdG8gdHJhbnNtaXQgYmVhY29uLgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vcmF0ZSA9ICh1OF90KXpmUmF0ZUN0cmxHZXRUeFJhdGUoZGV2LCAmd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ucmNDZWxsLCByY1Byb2JpbmdGbGFnKTsKKyAgICAgICAgICAgICAgICByYXRlID0gd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0ucmNDZWxsLm9wZXJhdGlvblJhdGVTZXRbMF07CisgICAgICAgICAgICAgICAgKnBoeUN0cmwgPSB6Y1JhdGVUb1BoeUN0cmxbcmF0ZV07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggemZNZW1vcnlJc0VxdWFsKGFkZHIsIHdkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLm1hY0FkZHIsIDYpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYXRlID0gKHU4X3QpemZSYXRlQ3RybEdldFR4UmF0ZShkZXYsICZ3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5yY0NlbGwsIHJjUHJvYmluZ0ZsYWcpOworICAgICAgICAgICAgICAgICpwaHlDdHJsID0gemNSYXRlVG9QaHlDdHJsW3JhdGVdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCitzdHJ1Y3QgenNNaWNWYXIqIHpmU3RhR2V0UnhNaWNLZXkoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHU4X3Qga2V5SW5kZXg7CisgICAgdThfdCBkYTA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBpZiBuZWVkIG5vdCBjaGVjayBNSUMsIHJldHVybiBOVUxMICovCisgICAgaWYgKCAoKHdkLT5zdGEuZW5jcnlNb2RlICE9IFpNX1RLSVApJiYod2QtPnN0YS5lbmNyeU1vZGUgIT0gWk1fQUVTKSl8fAorICAgICAgICAgKHdkLT5zdGEud3BhU3RhdGUgPCBaTV9TVEFfV1BBX1NUQVRFX1BLX09LKSApCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBkYTAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQpOworCisgICAgaWYgKCh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKSAmIDB4ODApID09IDB4ODApCisgICAgICAgIGtleUluZGV4ID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfSVZfT0ZGU0VUKzUpOyAvKiBRb3MgUGFja2V0Ki8KKyAgICBlbHNlCisgICAgICAgIGtleUluZGV4ID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfSVZfT0ZGU0VUKzMpOyAvKiBub3JtYWwgUGFja2V0Ki8KKyAgICBrZXlJbmRleCA9IChrZXlJbmRleCAmIDB4YzApID4+IDY7CisKKyAgICByZXR1cm4gKCZ3ZC0+c3RhLnJ4TWljS2V5W2tleUluZGV4XSk7Cit9CisKK3N0cnVjdCB6c01pY1ZhciogemZTdGFHZXRUeE1pY0tleSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogaWYgbmVlZCBub3QgY2hlY2sgTUlDLCByZXR1cm4gTlVMTCAqLworICAgIC8vaWYgKCAoKHdkLT5zdGEuZW5jcnlNb2RlICE9IFpNX1RLSVApJiYod2QtPnN0YS5lbmNyeU1vZGUgIT0gWk1fQUVTKSl8fAorICAgIC8vICAgICAod2QtPnN0YS53cGFTdGF0ZSA8IFpNX1NUQV9XUEFfU1RBVEVfUEtfT0spICkKKyAgICBpZiAoICh3ZC0+c3RhLmVuY3J5TW9kZSAhPSBaTV9US0lQKSB8fCAod2QtPnN0YS53cGFTdGF0ZSA8IFpNX1NUQV9XUEFfU1RBVEVfUEtfT0spICkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiAoJndkLT5zdGEudHhNaWNLZXkpOworfQorCit1MTZfdCB6ZlN0YVJ4VmFsaWRhdGVGcmFtZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdThfdCAgIGZyYW1lVHlwZSwgZnJhbWVDdHJsOworICAgIHU4X3QgICBkYTA7CisgICAgLy91MTZfdCAgc2FbM107CisgICAgdTE2X3QgIHJldDsKKyAgICB1MTZfdCAgaTsKKyAgICAvL3U4X3QgICAgc2EwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZnJhbWVUeXBlID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCk7CisgICAgZGEwID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTFfT0ZGU0VUKTsKKyAgICAvL3NhMCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EyX09GRlNFVCk7CisKKyAgICBpZiAoICghemZTdGFJc0Nvbm5lY3RlZChkZXYpKSYmKChmcmFtZVR5cGUgJiAweGYpID09IFpNX1dMQU5fREFUQV9GUkFNRSkgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFpNX0VSUl9EQVRBX0JFRk9SRV9DT05ORUNURUQ7CisgICAgfQorCisKKyAgICBpZiAoICh6ZlN0YUlzQ29ubmVjdGVkKGRldikpJiYoKGZyYW1lVHlwZSAmIDB4ZikgPT0gWk1fV0xBTl9EQVRBX0ZSQU1FKSApCisgICAgeworICAgICAgICAvKiBjaGVjayBCU1NJRCAqLworICAgICAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQmlnIEVuZGlhbiBhbmQgTGl0dGxlIEVuZGlhbiBDb21wYXRpYmlsaXR5ICovCisgICAgICAgICAgICB1MTZfdCBtYWNbM107CisgICAgICAgICAgICBtYWNbMF0gPSB6bXdfY3B1X3RvX2xlMTYod2QtPnN0YS5ic3NpZFswXSk7CisgICAgICAgICAgICBtYWNbMV0gPSB6bXdfY3B1X3RvX2xlMTYod2QtPnN0YS5ic3NpZFsxXSk7CisgICAgICAgICAgICBtYWNbMl0gPSB6bXdfY3B1X3RvX2xlMTYod2QtPnN0YS5ic3NpZFsyXSk7CisgICAgICAgICAgICBpZiAoICF6ZlJ4QnVmZmVyRXF1YWxUb1N0cihkZXYsIGJ1ZiwgKHU4X3QgKiltYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQsIDYpICkKKyAgICAgICAgICAgIHsKKy8qV2Ugd2lsbCBnZXQgbG90cyBvZiBnYXJiYWdlIGRhdGEsIGVzcGVjaWFsbHkgaW4gQUVTIG1vZGUuKi8KKy8qVG8gYXZvaWQgc2VuZGluZyB0b28gbWFueSBkZWF1dGhlbnRpY2F0aW9uIGZyYW1lcyBpbiBTVEEgbW9kZSwgbWFyayBpdC4qLworI2lmIDAKKyAgICAgICAgICAgICAgICAvKiBJZiB1bmljYXN0IGZyYW1lLCBzZW5kIGRlYXV0aCB0byB0aGUgdHJhbnNtaXR0ZXIgKi8KKyAgICAgICAgICAgICAgICBpZiAoKCBkYTAgJiAweDAxICkgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPDM7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2FbaV0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQrKGkqMikpOworICAgICAgICAgICAgICAgICAgICB9CisJCQkJCS8qIElmIG11dGlsY2FzdCBhZGRyZXNzLCBkb24ndCBzZW5kIGRlYXV0aGVudGljYXRpb24qLworCQkJCQlpZiAoKCBzYTAgJiAweDAxICkgPT0gMCkKKwkgICAgICAgICAgICAgICAgICAJemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9ERUFVVEgsIHNhLCA3LCAwLCAwKTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICByZXR1cm4gWk1fRVJSX0RBVEFfQlNTSURfTk9UX01BVENIRUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBCaWcgRW5kaWFuIGFuZCBMaXR0bGUgRW5kaWFuIENvbXBhdGliaWxpdHkgKi8KKyAgICAgICAgICAgIHUxNl90IG1hY1szXTsKKyAgICAgICAgICAgIG1hY1swXSA9IHptd19jcHVfdG9fbGUxNih3ZC0+c3RhLmJzc2lkWzBdKTsKKyAgICAgICAgICAgIG1hY1sxXSA9IHptd19jcHVfdG9fbGUxNih3ZC0+c3RhLmJzc2lkWzFdKTsKKyAgICAgICAgICAgIG1hY1syXSA9IHptd19jcHVfdG9fbGUxNih3ZC0+c3RhLmJzc2lkWzJdKTsKKyAgICAgICAgICAgIGlmICggIXpmUnhCdWZmZXJFcXVhbFRvU3RyKGRldiwgYnVmLCAodThfdCAqKW1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fSEVBREVSX0EzX09GRlNFVCwgNikgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBaTV9FUlJfREFUQV9CU1NJRF9OT1RfTUFUQ0hFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZyYW1lQ3RybCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDEpOworCisgICAgICAgIC8qIGNoZWNrIHNlY3VyaXR5IGJpdCAqLworICAgICAgICBpZiAoIHdkLT5zdGEuZHJvcFVuZW5jcnlwdGVkUGt0cyAmJgorICAgICAgICAgICAgICh3ZC0+c3RhLndlcFN0YXR1cyAhPSBaTV9FTkNSWVBUSU9OX1dFUF9ESVNBQkxFRCApJiYKKyAgICAgICAgICAgICAoICEoZnJhbWVDdHJsICYgWk1fQklUXzYpICkgKQorICAgICAgICB7ICAgLyogc2VjdXJpdHkgb24sIGJ1dCBnb3QgZGF0YSB3aXRob3V0IGVuY3J5cHRpb24gKi8KKworICAgICAgICAgICAgI2lmIDEKKyAgICAgICAgICAgIHJldCA9IFpNX0VSUl9EQVRBX05PVF9FTkNSWVBURUQ7CisgICAgICAgICAgICBpZiAoIHdkLT5zdGEucFN0YVJ4U2VjdXJpdHlDaGVja0NiICE9IE5VTEwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldCA9IHdkLT5zdGEucFN0YVJ4U2VjdXJpdHlDaGVja0NiKGRldiwgYnVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXQgPSBaTV9FUlJfREFUQV9OT1RfRU5DUllQVEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJldCA9PSBaTV9FUlJfREFUQV9OT1RfRU5DUllQVEVEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5jb21tVGFsbHkuc3dSeERyb3BVbmVuY3J5cHRlZENvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgIGlmICggKHdkLT5zdGEud2VwU3RhdHVzICE9IFpNX0VOQ1JZUFRJT05fVEtJUCkmJgorICAgICAgICAgICAgICAgICAod2QtPnN0YS53ZXBTdGF0dXMgIT0gWk1fRU5DUllQVElPTl9BRVMpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gWk1fRVJSX0RBVEFfTk9UX0VOQ1JZUFRFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIFpNX1NVQ0NFU1M7Cit9CisKK3ZvaWQgemZTdGFNaWNGYWlsdXJlSGFuZGxpbmcoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHU4X3QgICBkYTA7CisgICAgdThfdCAgIG1pY05vdGlmeSA9IDE7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgaWYgKCB3ZC0+c3RhLndwYVN0YXRlIDwgIFpNX1NUQV9XUEFfU1RBVEVfUEtfT0sgKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICB3ZC0+c3RhLmNtTWljRmFpbHVyZUNvdW50Kys7CisKKyAgICBpZiAoIHdkLT5zdGEuY21NaWNGYWlsdXJlQ291bnQgPT0gMSApCisgICAgeworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJnZXQgdGhlIGZpcnN0IE1JQyBmYWlsdXJlIik7CisgICAgICAgIC8vemZUaW1lclNjaGVkdWxlKGRldiwgWk1fRVZFTlRfQ01fVElNRVIsIFpNX1RJQ0tfQ01fVElNRU9VVCk7CisKKyAgICAgICAgLyogVGltZXIgUmVzb2x1dGlvbiBvbiBXaW5YUCBpcyAxNS8xNiBtcyAgKi8KKyAgICAgICAgLyogRGVjcmVhc2UgVGltZSBvZmZzZXQgZm9yIDxYUD4gQ291bnRlciBNZWFzdXJlICovCisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIFpNX0VWRU5UX0NNX1RJTUVSLCBaTV9USUNLX0NNX1RJTUVPVVQgLSBaTV9USUNLX0NNX1RJTUVPVVRfT0ZGU0VUKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIHdkLT5zdGEuY21NaWNGYWlsdXJlQ291bnQgPT0gMiApCisgICAgeworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJnZXQgdGhlIHNlY29uZCBNSUMgZmFpbHVyZSIpOworICAgICAgICAvKiByZXNlcnZlIDIgc2Vjb25kIGZvciBPUyB0byBzZW5kIE1JQyBmYWlsdXJlIHJlcG9ydCB0byBBUCAqLworICAgICAgICB3ZC0+c3RhLmNtRGlzYWxsb3dTc2lkTGVuZ3RoID0gd2QtPnN0YS5zc2lkTGVuOworICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS5jbURpc2FsbG93U3NpZCwgd2QtPnN0YS5zc2lkLCB3ZC0+c3RhLnNzaWRMZW4pOworICAgICAgICAvL3dkLT5zdGEuY21NaWNGYWlsdXJlQ291bnQgPSAwOworICAgICAgICB6ZlRpbWVyQ2FuY2VsKGRldiwgWk1fRVZFTlRfQ01fVElNRVIpOworICAgICAgICAvL3pmVGltZXJTY2hlZHVsZShkZXYsIFpNX0VWRU5UX0NNX0RJU0NPTk5FQ1QsIFpNX1RJQ0tfQ01fRElTQ09OTkVDVCk7CisKKyAgICAgICAgLyogVGltZXIgUmVzb2x1dGlvbiBvbiBXaW5YUCBpcyAxNS8xNiBtcyAgKi8KKyAgICAgICAgLyogRGVjcmVhc2UgVGltZSBvZmZzZXQgZm9yIDxYUD4gQ291bnRlciBNZWFzdXJlICovCisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIFpNX0VWRU5UX0NNX0RJU0NPTk5FQ1QsIFpNX1RJQ0tfQ01fRElTQ09OTkVDVCAtIFpNX1RJQ0tfQ01fRElTQ09OTkVDVF9PRkZTRVQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBtaWNOb3RpZnkgPSAwOworICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAobWljTm90aWZ5ID09IDEpCisgICAgeworICAgICAgICBkYTAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQpOworICAgICAgICBpZiAoIGRhMCAmIDB4MDEgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAod2QtPnpmY2JNaWNGYWlsdXJlTm90aWZ5ICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnpmY2JNaWNGYWlsdXJlTm90aWZ5KGRldiwgd2QtPnN0YS5ic3NpZCwgWk1fTUlDX0dST1VQX0VSUk9SKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3ZC0+emZjYk1pY0ZhaWx1cmVOb3RpZnkgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+emZjYk1pY0ZhaWx1cmVOb3RpZnkoZGV2LCB3ZC0+c3RhLmJzc2lkLCBaTV9NSUNfUEFJUldJU0VfRVJST1IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKK3U4X3QgemZTdGFCbG9ja1dsYW5TY2FuKHpkZXZfdCogZGV2KQoreworICAgIHU4X3QgICByZXQ9RkFMU0U7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoIHdkLT5zdGEuYkNoYW5uZWxTY2FuICkKKyAgICB7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgemZTdGFSZXNldFN0YXR1cyh6ZGV2X3QqIGRldiwgdThfdCBiSW5pdCkKK3sKKyAgICB1OF90ICAgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHpmSHBEaXNhYmxlQmVhY29uKGRldik7CisKKyAgICB3ZC0+ZHRpbSA9IDE7CisgICAgd2QtPnN0YS5jYXBhYmlsaXR5WzBdID0gMHgwMTsKKyAgICB3ZC0+c3RhLmNhcGFiaWxpdHlbMV0gPSAweDAwOworICAgIC8qIDgwMi4xMWggKi8KKyAgICBpZiAod2QtPnN0YS5ERlNFbmFibGUgfHwgd2QtPnN0YS5UUENFbmFibGUpCisgICAgICAgIHdkLT5zdGEuY2FwYWJpbGl0eVsxXSB8PSBaTV9CSVRfMDsKKworICAgIC8qIHJlbGVhc2UgcXVldWVkIHBhY2tldHMgKi8KKyAgICBmb3IoaT0wOyBpPHdkLT5zdGEuaWJzc1BTRGF0YUNvdW50OyBpKyspCisgICAgeworICAgICAgICB6ZndCdWZGcmVlKGRldiwgd2QtPnN0YS5pYnNzUFNEYXRhUXVldWVbaV0sIDApOworICAgIH0KKworICAgIGZvcihpPTA7IGk8d2QtPnN0YS5zdGFQU0RhdGFDb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgemZ3QnVmRnJlZShkZXYsIHdkLT5zdGEuc3RhUFNEYXRhUXVldWVbaV0sIDApOworICAgIH0KKworICAgIHdkLT5zdGEuaWJzc1BTRGF0YUNvdW50ID0gMDsKKyAgICB3ZC0+c3RhLnN0YVBTRGF0YUNvdW50ID0gMDsKKyAgICB6Zlplcm9NZW1vcnkoKHU4X3QqKSAmd2QtPnN0YS5zdGFQU0xpc3QsIHNpemVvZihzdHJ1Y3QgenNTdGFQU0xpc3QpKTsKKworICAgIHdkLT5zdGEud21lQ29ubmVjdGVkID0gMDsKKyAgICB3ZC0+c3RhLnBzTWdyLnRlbXBXYWtlVXAgPSAwOworICAgIHdkLT5zdGEucW9zSW5mbyA9IDA7CisgICAgemZRdWV1ZUZsdXNoKGRldiwgd2QtPnN0YS51YXBzZFEpOworCisgICAgcmV0dXJuOworCit9CisKK3ZvaWQgemZTdGFJYnNzTW9uaXRvcmluZyh6ZGV2X3QqIGRldiwgdThfdCByZXNldCkKK3sKKyAgICB1MTZfdCBpOworICAgIHUxNl90IG9wcG9zaXRlQ291bnQ7CisgICAgc3RydWN0IHpzUGFydG5lck5vdGlmeUV2ZW50IGV2ZW50OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8vem1fZGVidWdfbXNnMSgiemZTdGFJYnNzTW9uaXRvcmluZyAlZCIsIHdkLT5zdGEub3Bwb3NpdGVDb3VudCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKCB3ZC0+c3RhLm9wcG9zaXRlQ291bnQgPT0gMCApCisgICAgeworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgaWYgKCB3ZC0+c3RhLmJDaGFubmVsU2NhbiApCisgICAgeworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgb3Bwb3NpdGVDb3VudCA9IHdkLT5zdGEub3Bwb3NpdGVDb3VudDsKKworICAgIGZvcihpPTA7IGkgPCBaTV9NQVhfT1BQT1NJVEVfQ09VTlQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmICggb3Bwb3NpdGVDb3VudCA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIHJlc2V0ICkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0udmFsaWQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS52YWxpZCA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBvcHBvc2l0ZUNvdW50LS07CisKKyAgICAgICAgaWYgKCB3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5hbGl2ZUNvdW50ZXIgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJTZXR0aW5nIGFsaXZlIHRvICIsIHdkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLmFsaXZlQ291bnRlcik7CisKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgIGlmICggd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0uYWxpdmVDb3VudGVyICE9IFpNX0lCU1NfUEVFUl9BTElWRV9DT1VOVEVSICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZlNlbmRNbUZyYW1lKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX1BST0JFUkVRLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUxNl90Kil3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS5tYWNBZGRyLCAxLCAwLCAwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHdkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLmFsaXZlQ291bnRlci0tOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiemZTdGFJYnNzTW9uaXRvcmluZyByZW1vdmUgdGhlIHBlZXIgc3RhdGlvbiIpOworICAgICAgICAgICAgemZNZW1vcnlDb3B5KGV2ZW50LmJzc2lkLCAodThfdCAqKSh3ZC0+c3RhLmJzc2lkKSwgNik7CisgICAgICAgICAgICB6Zk1lbW9yeUNvcHkoZXZlbnQucGVlck1hY0FkZHIsIHdkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLm1hY0FkZHIsIDYpOworCisgICAgICAgICAgICB3ZC0+c3RhLm9wcG9zaXRlSW5mb1tpXS52YWxpZCA9IDA7CisgICAgICAgICAgICB3ZC0+c3RhLm9wcG9zaXRlQ291bnQtLTsKKyAgICAgICAgICAgIGlmICh3ZC0+emZjYklic3NQYXJ0bmVyTm90aWZ5ICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICB3ZC0+emZjYklic3NQYXJ0bmVyTm90aWZ5KGRldiwgMCwgJmV2ZW50KTsKKyAgICAgICAgICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCitkb25lOgorICAgIGlmICggcmVzZXQgPT0gMCApCisgICAgeworICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCBaTV9FVkVOVF9JQlNTX01PTklUT1IsIFpNX1RJQ0tfSUJTU19NT05JVE9SKTsKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCit2b2lkIHpmSW5pdFBhcnRuZXJOb3RpZnlFdmVudCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c1BhcnRuZXJOb3RpZnlFdmVudCAqZXZlbnQpCit7CisgICAgdTE2X3QgICpwZWVyTWFjQWRkcjsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHBlZXJNYWNBZGRyID0gKHUxNl90ICopZXZlbnQtPnBlZXJNYWNBZGRyOworCisgICAgemZNZW1vcnlDb3B5KGV2ZW50LT5ic3NpZCwgKHU4X3QgKikod2QtPnN0YS5ic3NpZCksIDYpOworICAgIHBlZXJNYWNBZGRyWzBdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUKTsKKyAgICBwZWVyTWFjQWRkclsxXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EyX09GRlNFVCArIDIpOworICAgIHBlZXJNYWNBZGRyWzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUICsgNCk7Cit9CisKK3ZvaWQgemZTdGFJbml0T3Bwb3NpdGVJbmZvKHpkZXZfdCogZGV2KQoreworICAgIGludCBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZm9yKGk9MDsgaTxaTV9NQVhfT1BQT1NJVEVfQ09VTlQ7IGkrKykKKyAgICB7CisgICAgICAgIHdkLT5zdGEub3Bwb3NpdGVJbmZvW2ldLnZhbGlkID0gMDsKKyAgICAgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9baV0uYWxpdmVDb3VudGVyID0gWk1fSUJTU19QRUVSX0FMSVZFX0NPVU5URVI7CisgICAgfQorfQorI2lmZGVmIFpNX0VOQUJMRV9DRU5DCit1MTZfdCB6ZlN0YUFkZEllQ2VuYyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAod2QtPnN0YS5jZW5jSWVbMV0gIT0gMCkKKyAgICB7CisgICAgICAgIHpmQ29weVRvSW50VHhCdWZmZXIoZGV2LCBidWYsIHdkLT5zdGEuY2VuY0llLCBvZmZzZXQsIHdkLT5zdGEuY2VuY0llWzFdKzIpOworICAgICAgICBvZmZzZXQgKz0gKHdkLT5zdGEuY2VuY0llWzFdKzIpOworICAgIH0KKyAgICByZXR1cm4gb2Zmc2V0OworfQorI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKK3UxNl90IHpmU3RhUHJvY2Vzc0FjdGlvbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdThfdCBjYXRlZ29yeSwgYWN0aW9uRGV0YWlsczsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBjYXRlZ29yeSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDI0KTsKKyAgICBhY3Rpb25EZXRhaWxzID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMjUpOworICAgIHN3aXRjaCAoY2F0ZWdvcnkpCisgICAgeworICAgICAgICBjYXNlIDA6CQkvL1NwZWN0cnVtIE1hbmFnZW1lbnQKKwkgICAgICAgIHN3aXRjaChhY3Rpb25EZXRhaWxzKQorCSAgICAgICAgeworCSAgICAgICAgCWNhc2UgMDoJCQkvL01lYXN1cmVtZW50IFJlcXVlc3QKKwkgICAgICAgIAkJYnJlYWs7CisJICAgICAgICAJY2FzZSAxOgkJCS8vTWVhc3VyZW1lbnQgUmVwb3J0CisJICAgICAgICAJCS8vUHJvY2Vzc0FjdGlvblNwZWN0cnVtRnJhbWVfTWVhc3VyZW1lbnRSZXBvcnQoQWRhcHRlcixwQWN0aW9uQm9keSszKTsKKwkgICAgICAgIAkJYnJlYWs7CisJICAgICAgICAJY2FzZSAyOgkJCS8vVFBDIHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgLy9pZiAod2QtPnN0YS5UUENFbmFibGUpCisgICAgICAgICAgICAgICAgICAgIC8vICAgIHpmU3RhVXBkYXRlRG90MTFIVFBDKGRldiwgYnVmKTsKKwkgICAgICAgIAkJYnJlYWs7CisJICAgICAgICAJY2FzZSAzOgkJCS8vVFBDIHJlcG9ydAorICAgICAgICAgICAgICAgICAgICAvL2lmICh3ZC0+c3RhLlRQQ0VuYWJsZSkKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgemZTdGFVcGRhdGVEb3QxMUhUUEMoZGV2LCBidWYpOworCSAgICAgICAgCQlicmVhazsKKwkgICAgICAgIAljYXNlIDQ6CQkJLy9DaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEuREZTRW5hYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgemZTdGFVcGRhdGVEb3QxMUhERlMoZGV2LCBidWYpOworCSAgICAgICAgCQlicmVhazsKKwkgICAgICAgIAlkZWZhdWx0OgorCSAgICAgICAgCQl6bV9kZWJ1Z19tc2cxKCJBY3Rpb24gRnJhbWUgY29udGFpbiBub3Qgc3VwcG9ydCBhY3Rpb24gZmllbGQgIiwgYWN0aW9uRGV0YWlscyk7CisJICAgICAgICAJCWJyZWFrOworCSAgICAgICAgfQorICAgICAgICAJYnJlYWs7CisgICAgICAgIGNhc2UgWk1fV0xBTl9CTE9DS19BQ0tfQUNUSU9OX0ZSQU1FOgorICAgICAgICAgICAgemZBZ2dCbG9ja0Fja0FjdGlvbkZyYW1lKGRldiwgYnVmKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE3OgkvL1FvcyBNYW5hZ2VtZW50CisgICAgICAgIAlicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyogRGV0ZXJtaW5lIHRoZSB0aW1lIG5vdCBzZW5kIGJlYWNvbiAsIGlmIG1vcmUgdGhhbiBzb21lIHZhbHVlICwKKyAgIHJlLXdyaXRlIHRoZSBiZWFjb24gc3RhcnQgYWRkcmVzcyAqLwordm9pZCB6ZlJlV3JpdGVCZWFjb25TdGFydEFkZHJlc3MoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgd2QtPnRpY2tJYnNzU2VuZEJlYWNvbisrOyAgICAvLyBJbmNyZWFzZSAxIHBlciAxMG1zIC4KKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKCB3ZC0+dGlja0lic3NTZW5kQmVhY29uID09IDQwICkKKyAgICB7CisvLyAgICAgICAgRGJnUHJpbnQoIjIwMDcwNzI3Iik7CisgICAgICAgIHpmSHBFbmFibGVCZWFjb24oZGV2LCBaTV9NT0RFX0lCU1MsIHdkLT5iZWFjb25JbnRlcnZhbCwgd2QtPmR0aW0sICh1OF90KXdkLT5zdGEuYXRpbVdpbmRvdyk7CisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHdkLT50aWNrSWJzc1NlbmRCZWFjb24gPSAwOworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIH0KK30KKworc3RydWN0IHpzVGtpcFNlZWQqIHpmU3RhR2V0UnhTZWVkKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB1OF90IGtleUluZGV4OworICAgIHU4X3QgZGEwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogaWYgbmVlZCBub3QgY2hlY2sgTUlDLCByZXR1cm4gTlVMTCAqLworICAgIGlmICggKCh3ZC0+c3RhLmVuY3J5TW9kZSAhPSBaTV9US0lQKSYmKHdkLT5zdGEuZW5jcnlNb2RlICE9IFpNX0FFUykpfHwKKyAgICAgICAgICh3ZC0+c3RhLndwYVN0YXRlIDwgWk1fU1RBX1dQQV9TVEFURV9QS19PSykgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZGEwID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTFfT0ZGU0VUKTsKKworICAgIGlmICgoem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCkgJiAweDgwKSA9PSAweDgwKQorICAgICAgICBrZXlJbmRleCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0lWX09GRlNFVCs1KTsgLyogUW9zIFBhY2tldCovCisgICAgZWxzZQorICAgICAgICBrZXlJbmRleCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0lWX09GRlNFVCszKTsgLyogbm9ybWFsIFBhY2tldCovCisgICAga2V5SW5kZXggPSAoa2V5SW5kZXggJiAweGMwKSA+PiA2OworCisgICAgcmV0dXJuICgmd2QtPnN0YS5yeFNlZWRba2V5SW5kZXhdKTsKK30KKwordm9pZCB6ZlN0YUVuYWJsZVNXRW5jcnlwdGlvbih6ZGV2X3QgKmRldiwgdThfdCB2YWx1ZSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+c3RhLlNXRW5jcnlwdEVuYWJsZSA9IHZhbHVlOworICAgIHpmSHBTV0RlY3J5cHQoZGV2LCAxKTsKKyAgICB6ZkhwU1dFbmNyeXB0KGRldiwgMSk7Cit9CisKK3ZvaWQgemZTdGFEaXNhYmxlU1dFbmNyeXB0aW9uKHpkZXZfdCAqZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT5zdGEuU1dFbmNyeXB0RW5hYmxlID0gMDsKKyAgICB6ZkhwU1dEZWNyeXB0KGRldiwgMCk7CisgICAgemZIcFNXRW5jcnlwdChkZXYsIDApOworfQorCit1MTZfdCB6ZkNvbXB1dGVCc3NJbmZvV2VpZ2h0VmFsdWUoemRldl90ICpkZXYsIHU4X3QgaXNCTW9kZSwgdThfdCBpc0hULCB1OF90IGlzSFQ0MCwgdThfdCBzaWduYWxTdHJlbmd0aCkKK3sKKwl1OF90ICB3ZWlnaHRPZkIgICAgICAgICAgID0gMDsKKwl1OF90ICB3ZWlnaHRPZkFHQmVsb3dUaHIgID0gMDsKKwl1OF90ICB3ZWlnaHRPZkFHVXBUaHIgICAgID0gMTU7CisJdThfdCAgd2VpZ2h0T2ZOMjBCZWxvd1RociA9IDE1OworCXU4X3QgIHdlaWdodE9mTjIwVXBUaHIgICAgPSAzMDsKKwl1OF90ICB3ZWlnaHRPZk40MEJlbG93VGhyID0gMTY7CisJdThfdCAgd2VpZ2h0T2ZONDBVcFRociAgICA9IDMyOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYoIGlzQk1vZGUgPT0gMCApCisgICAgICAgIHJldHVybiAoc2lnbmFsU3RyZW5ndGggKyB3ZWlnaHRPZkIpOyAgICAvLyBwdXJlIGIgbW9kZSAsIGRvIG5vdCBhZGQgdGhlIHdlaWdodCB2YWx1ZSBmb3IgdGhpcyBBUCAhCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoIGlzSFQgPT0gMCAmJiBpc0hUNDAgPT0gMCApCisgICAgICAgIHsgLy8gYSAsIGcgLCBiL2cgbW9kZSAhIGFkZCB0aGUgd2VpZ2h0IHZhbHVlIDE1IGZvciB0aGlzIEFQIGlmIGl0J3Mgc2lnbmFsIHN0cmVuZ3RoIGlzIG1vcmUgdGhhbiBzb21lIHZhbHVlICEKKyAgICAgICAgICAgIGlmKCBzaWduYWxTdHJlbmd0aCA8IDE4ICkgLy8gLTc3IGRCbQorCQkJCXJldHVybiBzaWduYWxTdHJlbmd0aCArIHdlaWdodE9mQUdCZWxvd1RocjsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gKHNpZ25hbFN0cmVuZ3RoICsgd2VpZ2h0T2ZBR1VwVGhyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBpc0hUID09IDEgJiYgaXNIVDQwID09IDAgKQorICAgICAgICB7IC8vIDgwMjExbiBtb2RlIHVzZSAyME1IegorICAgICAgICAgICAgaWYoIHNpZ25hbFN0cmVuZ3RoIDwgMjMgKSAvLyAtNzIgZEJtCisgICAgICAgICAgICAgICAgcmV0dXJuIChzaWduYWxTdHJlbmd0aCArIHdlaWdodE9mTjIwQmVsb3dUaHIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAoc2lnbmFsU3RyZW5ndGggKyB3ZWlnaHRPZk4yMFVwVGhyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIC8vIGlzSFQgPT0gMSAmJiBpc0hUNDAgPT0gMQorICAgICAgICB7IC8vIDgwMjExbiBtb2RlIHVzZSA0ME1IegorICAgICAgICAgICAgaWYoIHNpZ25hbFN0cmVuZ3RoIDwgMTYgKSAvLyAtNzkgZEJtCisgICAgICAgICAgICAgICAgcmV0dXJuIChzaWduYWxTdHJlbmd0aCArIHdlaWdodE9mTjQwQmVsb3dUaHIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAoc2lnbmFsU3RyZW5ndGggKyB3ZWlnaHRPZk40MFVwVGhyKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordTE2X3QgemZTdGFBZGRJYnNzQWRkaXRpb25hbElFKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KQoreworCXUxNl90IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBmb3IgKGk9MDsgaTx3ZC0+c3RhLmlic3NBZGRpdGlvbmFsSUVTaXplOyBpKyspCisgICAgeworICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5zdGEuaWJzc0FkZGl0aW9uYWxJRVtpXSk7CisgICAgfQorCisgICAgcmV0dXJuIG9mZnNldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jb2lkLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY29pZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMDdmMzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY29pZC5jCkBAIC0wLDAgKzEsMjY5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogaW9kLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBPSUQgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgImNwcmVjb21wLmgiCisjaW5jbHVkZSAiLi4vaGFsL2hwcmVnLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZmlXbGFuUXVlcnlNYWNBZGRyZXNzICAgICAgKi8KKy8qICAgICAgUXVlcnkgT1dOIE1BQyBhZGRyZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWRkciA6IGZvciByZXR1cm4gTUFDIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZpV2xhblF1ZXJ5TWFjQWRkcmVzcyh6ZGV2X3QqIGRldiwgdThfdCogYWRkcikKK3sKKyAgICB1MTZfdCB2YXBJZCA9IDA7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgdmFwSWQgPSB6ZndHZXRWYXBJZChkZXYpOworCisgICAgYWRkclswXSA9ICh1OF90KSh3ZC0+bWFjQWRkclswXSAmIDB4ZmYpOworICAgIGFkZHJbMV0gPSAodThfdCkod2QtPm1hY0FkZHJbMF0gPj4gOCk7CisgICAgYWRkclsyXSA9ICh1OF90KSh3ZC0+bWFjQWRkclsxXSAmIDB4ZmYpOworICAgIGFkZHJbM10gPSAodThfdCkod2QtPm1hY0FkZHJbMV0gPj4gOCk7CisgICAgYWRkcls0XSA9ICh1OF90KSh3ZC0+bWFjQWRkclsyXSAmIDB4ZmYpOworICAgIGlmICh2YXBJZCA9PSAweGZmZmYpCisgICAgICAgIGFkZHJbNV0gPSAodThfdCkod2QtPm1hY0FkZHJbMl0gPj4gOCk7CisgICAgZWxzZQorICAgIHsKKyNpZmRlZiBaTV9WQVBNT0RFX01VTFRJTEVfU1NJRAorICAgICAgICBhZGRyWzVdID0gKHU4X3QpKHdkLT5tYWNBZGRyWzJdID4+IDgpOyAvLyBNdWx0aXBsZSBTU0lECisjZWxzZQorICAgICAgICBhZGRyWzVdID0gdmFwSWQgKyAxICsgKHU4X3QpKHdkLT5tYWNBZGRyWzJdID4+IDgpOyAvL1ZBUAorI2VuZGlmCisgICAgfQorCisgICAgcmV0dXJuOworfQorCit2b2lkIHpmaVdsYW5RdWVyeUJzc0xpc3QoemRldl90KiBkZXYsIHN0cnVjdCB6c0Jzc0xpc3QqIHBCc3NMaXN0KQoreworICAgIHN0cnVjdCB6c0Jzc0luZm8qICAgcEJzc0luZm87CisgICAgc3RydWN0IHpzQnNzSW5mbyogICBwRHN0QnNzSW5mbzsKKyAgICB1OF90ICAgaTsKKyAgICB1OF90KiAgcE1lbUxpc3Q7CisgICAgdThfdCogIHBNZW1JbmZvOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHBNZW1MaXN0ID0gKHU4X3QqKSBwQnNzTGlzdDsKKyAgICBwTWVtSW5mbyA9IHBNZW1MaXN0ICsgc2l6ZW9mKHN0cnVjdCB6c0Jzc0xpc3QpOworICAgIHBCc3NMaXN0LT5oZWFkID0gKHN0cnVjdCB6c0Jzc0luZm8qKSBwTWVtSW5mbzsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBwQnNzSW5mbyA9IHdkLT5zdGEuYnNzTGlzdC5oZWFkOworICAgIHBEc3RCc3NJbmZvID0gKHN0cnVjdCB6c0Jzc0luZm8qKSBwTWVtSW5mbzsKKyAgICBwQnNzTGlzdC0+YnNzQ291bnQgPSB3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQ7CisKKyAgICBmb3IoIGk9MDsgaTx3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQ7IGkrKyApCisgICAgeworICAgICAgICB6Zk1lbW9yeUNvcHkoKHU4X3QqKXBEc3RCc3NJbmZvLCAodThfdCopcEJzc0luZm8sCisgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCB6c0Jzc0luZm8pKTsKKworICAgICAgICBpZiAoIHBCc3NJbmZvLT5uZXh0ICE9IE5VTEwgKQorICAgICAgICB7CisgICAgICAgICAgICBwQnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICAgICAgcERzdEJzc0luZm8tPm5leHQgPSBwRHN0QnNzSW5mbyArIDE7CisgICAgICAgICAgICBwRHN0QnNzSW5mbysrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fYXNzZXJ0KGk9PSh3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQtMSkpOworICAgICAgICB9CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHpmU2Nhbk1nclNjYW5BY2soZGV2KTsKK30KKwordm9pZCB6ZmlXbGFuUXVlcnlCc3NMaXN0VjEoemRldl90KiBkZXYsIHN0cnVjdCB6c0Jzc0xpc3RWMSogYnNzTGlzdFYxKQoreworICAgIHN0cnVjdCB6c0Jzc0luZm8qICAgcEJzc0luZm87CisgICAgLy9zdHJ1Y3QgenNCc3NJbmZvKiAgIHBEc3RCc3NJbmZvOworICAgIHU4X3QgICBpLCBqLCBiZHJvcCA9IDAsIGsgPSAwLCBTYW1lX0NvdW50ID0gMDsKKyAgICB1OF90ICAgYnNzaWRbNl07CisgICAgLy91OF90KiAgcE1lbUxpc3Q7CisgICAgLy91OF90KiAgcE1lbUluZm87CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgYnNzTGlzdFYxLT5ic3NDb3VudCA9IHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudDsKKworICAgIHBCc3NJbmZvID0gd2QtPnN0YS5ic3NMaXN0LmhlYWQ7CisgICAgWk1fTUFDX1dPUkRfVE9fQllURSh3ZC0+c3RhLmJzc2lkLCBic3NpZCk7CisKKyAgICBmb3IoIGk9MDsgaTx3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQ7IGkrKyApCisgICAgeworICAgICAgICBiZHJvcCA9IDA7CisgICAgICAgIGlmICggemZTdGFJc0Nvbm5lY3RlZChkZXYpCisgICAgICAgICAgICAgJiYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkgKQorICAgICAgICB7CisJCQlmb3IgKGogPSAwOyBqIDwgNjsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggcEJzc0luZm8tPmJzc2lkW2pdICE9IGJzc2lkW2pdICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgICggKGogPT0gNikKKyAgICAgICAgICAgICAgICAgICYmKChwQnNzSW5mby0+c3NpZFsxXSA9PSB3ZC0+c3RhLnNzaWRMZW4pIHx8IChwQnNzSW5mby0+c3NpZFsxXSA9PSAwKSApJiYgKHBCc3NJbmZvLT5mcmVxdWVuY3kgPT0gd2QtPmZyZXF1ZW5jeSkgKQorICAgICAgICAgICAgeworCQkJCWlmKHBCc3NJbmZvLT5zc2lkWzFdID09IDApCisJCQkJCXBCc3NJbmZvLT5zc2lkWzFdID0gd2QtPnN0YS5zc2lkTGVuOworCisJCQkJaWYoU2FtZV9Db3VudCA9PSAwKQorCQkJCXsvL0ZpcnN0IG1lZXQKKwkJCQkJU2FtZV9Db3VudCsrOworCQkJCX0KKwkJCQllbHNlCisJCQkJey8vc2FtZSBvbmUKKwkJCQkJYmRyb3AgPSAxOworCQkJCQlic3NMaXN0VjEtPmJzc0NvdW50LS07CisJCQkJfQorCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoYmRyb3AgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgemZNZW1vcnlDb3B5KCh1OF90KikoJmJzc0xpc3RWMS0+YnNzSW5mb1trXSksICh1OF90KilwQnNzSW5mbywKKyAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHpzQnNzSW5mbykpOworCisJCQlpZihTYW1lX0NvdW50ID09IDEpCisJCQl7CisJCQkJemZNZW1vcnlDb3B5KCYoYnNzTGlzdFYxLT5ic3NJbmZvW2tdLnNzaWRbMl0pLCB3ZC0+c3RhLnNzaWQsIHdkLT5zdGEuc3NpZExlbik7CisJCQkJU2FtZV9Db3VudCsrOworCQkJfQorCisJCQlrKys7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIHBCc3NJbmZvLT5uZXh0ICE9IE5VTEwgKQorICAgICAgICB7CisgICAgICAgICAgICBwQnNzSW5mbyA9IHBCc3NJbmZvLT5uZXh0OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fYXNzZXJ0KGk9PSh3ZC0+c3RhLmJzc0xpc3QuYnNzQ291bnQtMSkpOworICAgICAgICB9CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHpmU2Nhbk1nclNjYW5BY2soZGV2KTsKK30KKwordm9pZCB6ZmlXbGFuUXVlcnlBZEhvY0NyZWF0ZWRCc3NEZXNjKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNCc3NJbmZvICpwQnNzSW5mbykKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6Zk1lbW9yeUNvcHkoKHU4X3QgKilwQnNzSW5mbywgKHU4X3QgKikmd2QtPnN0YS5pYnNzQnNzRGVzYywgc2l6ZW9mKHN0cnVjdCB6c0Jzc0luZm8pKTsKK30KKwordThfdCB6ZmlXbGFuUXVlcnlBZEhvY0lzQ3JlYXRvcih6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICByZXR1cm4gd2QtPnN0YS5pYnNzQnNzSXNDcmVhdG9yOworfQorCit1MzJfdCB6ZmlXbGFuUXVlcnlTdXBwb3J0TW9kZSh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICByZXR1cm4gd2QtPnN1cHBvcnRNb2RlOworfQorCit1MzJfdCB6ZmlXbGFuUXVlcnlUcmFuc21pdFBvd2VyKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHUzMl90IHJldCA9IDA7CisKKyAgICBpZiAoemZTdGFJc0Nvbm5lY3RlZChkZXYpKSB7CisgICAgICAgIHJldCA9IHdkLT5zdGEuY29ublBvd2VySW5IYWxmRGJtOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IHpmSHBHZXRUcmFuc21pdFBvd2VyKGRldik7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmaVdsYW5GbHVzaEJzc0xpc3QgICAgICAgICAqLworLyogICAgICBGbHVzaCBCU1NJRCBMaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNi4xMiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB6ZmlXbGFuRmx1c2hCc3NMaXN0KHpkZXZfdCogZGV2KQoreworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIC8qIENhbGwgemZCc3NJbmZvUmVmcmVzaCgpIHR3aWNlIHRvIHJlbW92ZSBhbGwgZW50cnkgKi8KKyAgICB6ZkJzc0luZm9SZWZyZXNoKGRldiwgMSk7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKK30KKwordm9pZCB6ZmlXbGFuU2V0V2xhbk1vZGUoemRldl90KiBkZXYsIHU4X3Qgd2xhbk1vZGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgd2QtPndzLndsYW5Nb2RlID0gd2xhbk1vZGU7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKK30KKwordm9pZCB6ZmlXbGFuU2V0QXV0aGVudGljYXRpb25Nb2RlKHpkZXZfdCogZGV2LCB1OF90IGF1dGhNb2RlKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHdkLT53cy5hdXRoTW9kZSA9IGF1dGhNb2RlOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7Cit9CisKK3ZvaWQgemZpV2xhblNldFdlcFN0YXR1cyh6ZGV2X3QqIGRldiwgdThfdCB3ZXBTdGF0dXMpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgd2QtPndzLndlcFN0YXR1cyA9IHdlcFN0YXR1czsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCit9CisKK3ZvaWQgemZpV2xhblNldFNTSUQoemRldl90KiBkZXYsIHU4X3QqIHNzaWQsIHU4X3Qgc3NpZExlbmd0aCkKK3sKKyAgICB1MTZfdCBpOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBpZiAoIHNzaWRMZW5ndGggPD0gMzIgKQorICAgIHsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICB3ZC0+d3Muc3NpZExlbiA9IHNzaWRMZW5ndGg7CisgICAgICAgIHpmTWVtb3J5Q29weSh3ZC0+d3Muc3NpZCwgc3NpZCwgc3NpZExlbmd0aCk7CisKKyAgICAgICAgaWYgKCBzc2lkTGVuZ3RoIDwgMzIgKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+d3Muc3NpZFtzc2lkTGVuZ3RoXSA9IDA7CisgICAgICAgIH0KKworICAgICAgICB3ZC0+d3MucHJvYmluZ1NzaWRMaXN0WzBdLnNzaWRMZW4gPSBzc2lkTGVuZ3RoOworICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPndzLnByb2JpbmdTc2lkTGlzdFswXS5zc2lkLCBzc2lkLCBzc2lkTGVuZ3RoKTsKKyAgICAgICAgZm9yIChpPTE7IGk8Wk1fTUFYX1BST0JFX0hJRERFTl9TU0lEX1NJWkU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPndzLnByb2JpbmdTc2lkTGlzdFtpXS5zc2lkTGVuID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorfQorCit2b2lkIHpmaVdsYW5TZXRGcmFnVGhyZXNob2xkKHpkZXZfdCogZGV2LCB1MTZfdCBmcmFnVGhyZXNob2xkKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKGZyYWdUaHJlc2hvbGQgPT0gMCkKKyAgICB7ICAgLyogZnJhZ21lbnRhdGlvbiBpcyBkaXNhYmxlZCAqLworICAgICAgICB3ZC0+ZnJhZ1RocmVzaG9sZCA9IDMyNzY3OworICAgIH0KKyAgICBlbHNlIGlmIChmcmFnVGhyZXNob2xkIDwgMjU2KQorICAgIHsKKyAgICAgICAgLyogTWluaW11bSBmcmFnbWVudCB0aHJlc2hvbGQgKi8KKyAgICAgICAgd2QtPmZyYWdUaHJlc2hvbGQgPSAyNTY7CisgICAgfQorICAgIGVsc2UgaWYgKGZyYWdUaHJlc2hvbGQgPiAyMzQ2KQorICAgIHsKKyAgICAgICAgd2QtPmZyYWdUaHJlc2hvbGQgPSAyMzQ2OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3ZC0+ZnJhZ1RocmVzaG9sZCA9IGZyYWdUaHJlc2hvbGQgJiAweGZmZmU7CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKK30KKwordm9pZCB6ZmlXbGFuU2V0UnRzVGhyZXNob2xkKHpkZXZfdCogZGV2LCB1MTZfdCBydHNUaHJlc2hvbGQpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgd2QtPnJ0c1RocmVzaG9sZCA9IHJ0c1RocmVzaG9sZDsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCit2b2lkIHpmaVdsYW5TZXRGcmVxdWVuY3koemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSwgdThfdCBiSW1tZWRpYXRlKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBpZiAoIGJJbW1lZGlhdGUgKQorICAgIHsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgd2QtPmZyZXF1ZW5jeSA9ICh1MTZfdCkgKGZyZXF1ZW5jeS8xMDAwKTsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgemZDb3JlU2V0RnJlcXVlbmN5KGRldiwgd2QtPmZyZXF1ZW5jeSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIGlmKCBmcmVxdWVuY3kgPT0gMCApCisgICAgICAgIHsgLy8gQXV0byBzZWxlY3QgY2xlYW4gY2hhbm5lbCBkZXBlbmQgb24gd2lyZWxlc3MgZW52aXJvbm1lbnQgIQorICAgICAgICAgICAgd2QtPndzLmF1dG9TZXRGcmVxdWVuY3kgPSAwOworICAgICAgICB9CisgICAgICAgIHdkLT53cy5mcmVxdWVuY3kgPSAodTE2X3QpIChmcmVxdWVuY3kvMTAwMCk7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorfQorCit2b2lkIHpmaVdsYW5TZXRCc3NpZCh6ZGV2X3QqIGRldiwgdThfdCogYnNzaWQpCit7CisgICAgdTE2X3QgaTsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBmb3IgKGk9MDsgaTw2OyBpKyspCisgICAgeworICAgICAgICB3ZC0+d3MuZGVzaXJlZEJzc2lkW2ldID0gYnNzaWRbaV07CisgICAgfQorICAgIHdkLT53cy5iRGVzaXJlZEJzc2lkID0gVFJVRTsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCit9CisKK3ZvaWQgemZpV2xhblNldEJlYWNvbkludGVydmFsKHpkZXZfdCogZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2X3QgIGJlYWNvbkludGVydmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdThfdCAgIGJJbW1lZGlhdGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmICggYkltbWVkaWF0ZSApCisgICAgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB3ZC0+YmVhY29uSW50ZXJ2YWwgPSBiZWFjb25JbnRlcnZhbDsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAvKiB1cGRhdGUgYmVhY29uIGludGVydmFsIGhlcmUgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgd2QtPndzLmJlYWNvbkludGVydmFsID0gYmVhY29uSW50ZXJ2YWw7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorfQorCisKK3ZvaWQgemZpV2xhblNldER0aW1Db3VudCh6ZGV2X3QqIGRldiwgdThfdCAgZHRpbSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZiAoZHRpbSA+IDApCisgICAgeworICAgICAgICB3ZC0+d3MuZHRpbSA9IGR0aW07CisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7Cit9CisKKwordm9pZCB6ZmlXbGFuU2V0QXRpbVdpbmRvdyh6ZGV2X3QqIGRldiwgdTE2X3QgYXRpbVdpbmRvdywgdThfdCBiSW1tZWRpYXRlKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBpZiAoIGJJbW1lZGlhdGUgKQorICAgIHsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgd2QtPnN0YS5hdGltV2luZG93ID0gYXRpbVdpbmRvdzsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAvKiBhdGltIHdpbmRvdyBoZXJlICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHdkLT53cy5hdGltV2luZG93ID0gYXRpbVdpbmRvdzsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB9Cit9CisKKwordm9pZCB6ZmlXbGFuU2V0RW5jcnlNb2RlKHpkZXZfdCogZGV2LCB1OF90IGVuY3J5TW9kZSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgeworICAgICAgICAvKiBIb3N0YXBkIElzc3VlICovCisgICAgICAgIGlmICgod2QtPndzLmVuY3J5TW9kZSAhPSBaTV9BRVMpICYmICh3ZC0+d3MuZW5jcnlNb2RlICE9IFpNX1RLSVApKQorICAgICAgICAgICAgd2QtPndzLmVuY3J5TW9kZSA9IGVuY3J5TW9kZTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICB3ZC0+d3MuZW5jcnlNb2RlID0gZW5jcnlNb2RlOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7Cit9CisKK3ZvaWQgemZpV2xhblNldERlZmF1bHRLZXlJZCh6ZGV2X3QqIGRldiwgdThfdCBrZXlJZCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+c3RhLmtleUlkID0ga2V5SWQ7Cit9CisKK3U4X3QgemZpV2xhblF1ZXJ5SXNQS0luc3RhbGxlZCh6ZGV2X3QgKmRldiwgdThfdCAqc3RhTWFjQWRkcikKK3sKKyAgICB1OF90IGlzSW5zdGFsbGVkID0gMDsKKworI2lmIDEKKy8vI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1dQQTJQU0sKKyAgICB1OF90ICAgcmVzLCBwZWVySWR4OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgcmVzID0gemZTdGFGaW5kT3Bwb3NpdGVCeU1BQ0FkZHIoZGV2LCAodTE2X3QgKilzdGFNYWNBZGRyLCAmcGVlcklkeCk7CisgICAgaWYoIHJlcyA9PSAwICkKKyAgICB7CisgICAgICAgIGlzSW5zdGFsbGVkID0gd2QtPnN0YS5vcHBvc2l0ZUluZm9bcGVlcklkeF0ucGtJbnN0YWxsZWQ7CisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisvLyNlbmRpZgorI2VuZGlmCisKKyAgICByZXR1cm4gaXNJbnN0YWxsZWQ7Cit9CisKK3U4X3QgemZpV2xhblNldEtleSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzS2V5SW5mbyBrZXlJbmZvKQoreworICAgIHUxNl90ICBicm9hZGNhc3RbM10gPSB7MHhmZmZmLCAweGZmZmYsIDB4ZmZmZn07CisgICAgdTMyX3QqIGtleTsKKyAgICB1OF90ICAgZW5jcnlNb2RlID0gWk1fTk9fV0VQOworI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1dQQTJQU0sKKyAgICB1OF90ICAgZW5jcnlUeXBlID0gWk1fTk9fV0VQOworI2VuZGlmCisgICAgdThfdCAgIG1pY0tleVsxNl07CisgICAgdTE2X3QgIGlkID0gMDsKKyAgICB1OF90ICAgdmFwSWQsIGksIGFkZHJbNl07CisgICAgdThfdCAgIHVzZXJJZHg9MDsKKworI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1dQQTJQU0sKKyAgICAvKiBEZXRlcm1pbmUgb3Bwb3NpdGUgZXhpc3Qgb3Igbm90ICovCisgICAgdThfdCAgIHJlcywgcGVlcklkeDsKKy8vICAgIHU4X3QgICB1c2VySWR4PTA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoIHdkLT5zdGEuaWJzc1dwYTJQc2sgPT0gMSApCisgICAgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICByZXMgPSB6ZlN0YUZpbmRPcHBvc2l0ZUJ5TUFDQWRkcihkZXYsICh1MTZfdCopa2V5SW5mby5tYWNBZGRyLCAmcGVlcklkeCk7CisgICAgICAgIGlmKCByZXMgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzZXJJZHggPSBwZWVySWR4OworICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLm9wcG9zaXRlSW5mb1t1c2VySWR4XS5jYW1JZHggPT0gMHhmZiApCisgICAgICAgICAgICAgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9bdXNlcklkeF0uY2FtSWR4ID0gdXNlcklkeDsKKyAgICAgICAgfQorICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIH0KKyNlbHNlCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworI2VuZGlmCisKKyAgICBpZiAoIGtleUluZm8uZmxhZyAmIFpNX0tFWV9GTEFHX0FVVEhFTlRJQ0FUT1IgKQorICAgIHsgICAvKiBzZXQga2V5IGJ5IGF1dGhlbnRpY2F0b3IgKi8KKyAgICAgICAgLyogc2V0IHBhaXJ3aXNlIGtleSAqLworICAgICAgICBpZiAoa2V5SW5mby5mbGFnICYgWk1fS0VZX0ZMQUdfUEspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEZpbmQgU1RBJ3MgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgIGlmICgoaWQgPSB6ZkFwRmluZFN0YShkZXYsIGtleUluZm8ubWFjQWRkcikpID09IDB4ZmZmZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBDYW4ndCBTVEEgaW4gdGhlIHN0YVRhYmxlICovCisgICAgICAgICAgICAgICAgcmV0dXJuIFpNX1NUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLml2MTYgPSAwOworICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS5pdjMyID0gMDsKKworICAgICAgICAgICAgaWYgKGtleUluZm8ua2V5TGVuZ3RoID09IDMyKQorICAgICAgICAgICAgeyAgIC8qIFRLSVAgKi8KKyAgICAgICAgICAgICAgICAvL3U4X3QgS2V5UnNjWzZdID0gezAsIDAsIDAsIDAsIDAsIDB9OworCisgICAgICAgICAgICAgICAgLyogSW4gdGhlIGN1cnJlbnQgQVAgbW9kZSwgd2Ugc2V0IEtleVJzYyB0byB6ZXJvICovCisgICAgICAgICAgICAgICAgLy96ZlRraXBJbml0KGtleUluZm8ua2V5LCAodThfdCopIHdkLT5tYWNBZGRyLAorICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAmKHdkLT5hcC5zdGFUYWJsZVtpZF0udHhTZWVkKSwgS2V5UnNjKTsKKyAgICAgICAgICAgICAgICAvL3pmVGtpcEluaXQoa2V5SW5mby5rZXksICh1OF90Kikga2V5SW5mby5tYWNBZGRyLAorICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAmKHdkLT5hcC5zdGFUYWJsZVtpZF0ucnhTZWVkKSwgS2V5UnNjKTsKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICAgICAgICAgIGlmIChrZXlJbmZvLmZsYWcgJiBaTV9LRVlfRkxBR19DRU5DKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiU2V0IENFTkMgcGFpcndpc2UgS2V5Iik7CisKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS5lbmNyeU1vZGUgPSBaTV9DRU5DOworCisgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IHR4aXYgYW5kIHJ4aXYgKi8KKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS50eGl2WzBdID0gMHg1YzM2NWMzNzsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS50eGl2WzFdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS50eGl2WzJdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS50eGl2WzNdID0gMHg1YzM2NWMzNjsKKworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLnJ4aXZbMF0gPSAweDVjMzY1YzM2OworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLnJ4aXZbMV0gPSAweDVjMzY1YzM2OworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLnJ4aXZbMl0gPSAweDVjMzY1YzM2OworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLnJ4aXZbM10gPSAweDVjMzY1YzM2OworCisgICAgICAgICAgICAgICAgICAgIC8qIFNldCBLZXkgSW5kZXggKi8KKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS5jZW5jS2V5SWR4ID0ga2V5SW5mby5rZXlJbmRleDsKKworICAgICAgICAgICAgICAgICAgICAvL3pmQ29yZVNldEtleShkZXYsIGlkKzEsIDEsIFpNX0NFTkMsICh1MTZfdCAqKWtleUluZm8ubWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgKHUzMl90KikgJmtleUluZm8ua2V5WzE2XSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLmVuY3J5TW9kZSA9IFpNX1RLSVA7CisKKyAgICAgICAgICAgICAgICAgICAgemZNZW1vcnlDb3B5KG1pY0tleSwgJmtleUluZm8ua2V5WzE2XSwgOCk7CisgICAgICAgICAgICAgICAgICAgIHpmTWVtb3J5Q29weSgmbWljS2V5WzhdLCAma2V5SW5mby5rZXlbMjRdLCA4KTsKKworICAgICAgICAgICAgICAgICAgICAvL3pmQ29yZVNldEtleShkZXYsIGlkKzEsIDEsIFpNX1RLSVAsICh1MTZfdCAqKWtleUluZm8ubWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICh1MzJfdCopIG1pY0tleSk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogRm9yIGZyYWdtZW50YXRpb24sIHdlIHVzZSBzb2Z0d2FyZSBNSUMgKi8KKyAgICAgICAgICAgICAgICAgICAgemZNZW1vcnlDb3B5KCh1OF90ICopJih3ZC0+YXAuc3RhVGFibGVbaWRdLnR4TWljS2V5KSwgJihrZXlJbmZvLmtleVsxNl0pLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgemZNZW1vcnlDb3B5KCh1OF90ICopJih3ZC0+YXAuc3RhVGFibGVbaWRdLnJ4TWljS2V5KSwgJihrZXlJbmZvLmtleVsyNF0pLCA4KTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGtleUluZm8ua2V5TGVuZ3RoID09IDE2KQorICAgICAgICAgICAgeyAgIC8qIEFFUyAqLworICAgICAgICAgICAgICAgIHdkLT5hcC5zdGFUYWJsZVtpZF0uZW5jcnlNb2RlID0gWk1fQUVTOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoa2V5SW5mby5rZXlMZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBDbGVhciBLZXkgSW5mbyAqLworICAgICAgICAgICAgICAgIHpmQXBDbGVhclN0YUtleShkZXYsICh1MTZfdCAqKWtleUluZm8ubWFjQWRkcik7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gWk1fU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFpNX1NUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL3pmQ29yZVNldEtleShkZXYsIGlkKzEsIDAsIHdkLT5hcC5zdGFUYWJsZVtpZF0uZW5jcnlNb2RlLAorICAgICAgICAgICAgLy8gICAgICAodTE2X3QgKilrZXlJbmZvLm1hY0FkZHIsICh1MzJfdCopIGtleUluZm8ua2V5KTsKKyAgICAgICAgICAgIHpmSHBTZXRBcFBhaXJ3aXNlS2V5KGRldiwgKHUxNl90ICopa2V5SW5mby5tYWNBZGRyLAorICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbaWRdLmVuY3J5TW9kZSwgKHUzMl90Kikga2V5SW5mby5rZXksCisgICAgICAgICAgICAgICAgICAgICh1MzJfdCopICZrZXlJbmZvLmtleVsxNl0sIGlkKzEpOworICAgICAgICAgICAgd2QtPmFwLnN0YVRhYmxlW2lkXS5rZXlJZHggPSBpZCArIDEgKyA0OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGtleUluZm8uZmxhZyAmIFpNX0tFWV9GTEFHX0dLKQorICAgICAgICB7CisgICAgICAgICAgICB2YXBJZCA9IGtleUluZm8udmFwSWQ7CisKKyAgICAgICAgICAgIHdkLT5hcC5pdjE2W3ZhcElkXSA9IDA7CisgICAgICAgICAgICB3ZC0+YXAuaXYzMlt2YXBJZF0gPSAwOworCisgICAgICAgICAgICBpZiAoa2V5SW5mby5rZXlMZW5ndGggPT0gMzIpCisgICAgICAgICAgICB7ICAgLyogVEtJUCAqLworICAgICAgICAgICAgICAgIC8vdThfdCBLZXlSc2NbNl0gPSB7MCwgMCwgMCwgMCwgMCwgMH07CisKKyAgICAgICAgICAgICAgICAvL3pmVGtpcEluaXQoa2V5SW5mby5rZXksICh1OF90Kikgd2QtPm1hY0FkZHIsCisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICYod2QtPmFwLmJjU2VlZCksIEtleVJzYyk7CisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgICAgICBpZiAoa2V5SW5mby5mbGFnICYgWk1fS0VZX0ZMQUdfQ0VOQykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVuY3J5TW9kZSA9IFpNX0NFTkM7CisgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlNldCBDRU5DIGdyb3VwIEtleSIpOworCisgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IHR4aXYgYW5kIHJ4aXYgKi8KKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnR4aXZbdmFwSWRdWzBdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnR4aXZbdmFwSWRdWzFdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnR4aXZbdmFwSWRdWzJdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgICAgICAgICAgd2QtPmFwLnR4aXZbdmFwSWRdWzNdID0gMHg1YzM2NWMzNjsKKworICAgICAgICAgICAgICAgICAgICAvL3pmQ29yZVNldEtleShkZXYsIDAsIDEsIFpNX0NFTkMsIGtleUluZm8udmFwQWRkciwKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgKHUzMl90KikgJmtleUluZm8ua2V5WzE2XSk7CisgICAgICAgICAgICAgICAgICAgIGtleSA9ICh1MzJfdCopIGtleUluZm8ua2V5OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW5jcnlNb2RlID0gWk1fVEtJUDsKKyAgICAgICAgICAgICAgICAgICAga2V5ID0gKHUzMl90ICopa2V5SW5mby5rZXk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogc2V0IE1JQyBrZXkgdG8gSE1BQyAqLworICAgICAgICAgICAgICAgICAgICAvL3pmQ29yZVNldEtleShkZXYsIDAsIDEsIFpNX1RLSVAsIGJyb2FkY2FzdCwKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAodTMyX3QqKSAoJmtleUluZm8ua2V5WzE2XSkpOworICAgICAgICAgICAgICAgICAgICAvL3pmQ29yZVNldEtleShkZXYsIDAsIDEsIFpNX1RLSVAsIGtleUluZm8udmFwQWRkciwKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICh1MzJfdCopICgma2V5SW5mby5rZXlbMTZdKSk7CisKKyAgICAgICAgICAgICAgICAgICAgemZNaWNTZXRLZXkoJihrZXlJbmZvLmtleVsxNl0pLCAmKHdkLT5hcC5iY01pY0tleVswXSkpOworICAgICAgICAgICAgICAgICAgICBrZXkgPSAodTMyX3QqKSBrZXlJbmZvLmtleTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChrZXlJbmZvLmtleUxlbmd0aCA9PSAxNikKKyAgICAgICAgICAgIHsgICAvKiBBRVMgKi8KKyAgICAgICAgICAgICAgICBlbmNyeU1vZGUgPSBaTV9BRVM7CisgICAgICAgICAgICAgICAga2V5ID0gKHUzMl90ICopa2V5SW5mby5rZXk7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiQ1dZIC0gU2V0IEFFUyBHcm91cCBLZXkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGtleUluZm8ua2V5TGVuZ3RoID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogQ2xlYXIgS2V5IEluZm8gKi8KKyAgICAgICAgICAgICAgICB6ZkFwQ2xlYXJTdGFLZXkoZGV2LCBicm9hZGNhc3QpOworCisgICAgICAgICAgICAgICAgLyogVHVybiBvZmYgV0VQIGJpdCBpbiB0aGUgY2FwYWJpbGl0eSBmaWVsZCAqLworICAgICAgICAgICAgICAgIHdkLT5hcC5jYXBhYlt2YXBJZF0gJj0gMHhmZmVmOworCisgICAgICAgICAgICAgICAgcmV0dXJuIFpNX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyAgIC8qIFdFUCAqLworICAgICAgICAgICAgICAgIGlmIChrZXlJbmZvLmtleUxlbmd0aCA9PSA1KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW5jcnlNb2RlID0gWk1fV0VQNjQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGtleUluZm8ua2V5TGVuZ3RoID09IDEzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW5jcnlNb2RlID0gWk1fV0VQMTI4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXlJbmZvLmtleUxlbmd0aCA9PSAyOSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVuY3J5TW9kZSA9IFpNX1dFUDI1NjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBrZXkgPSAodTMyX3QqKSBrZXlJbmZvLmtleTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTW9kaWZpY2F0aW9uIGZvciBDQU0gbm90IHN1cHBvcnQgVkFQIHNlYXJjaAorICAgICAgICAgICAgLy96ZkNvcmVTZXRLZXkoZGV2LCAwLCAwLCBlbmNyeU1vZGUsIGJyb2FkY2FzdCwga2V5KTsKKyAgICAgICAgICAgIC8vemZDb3JlU2V0S2V5KGRldiwgMCwgMCwgZW5jcnlNb2RlLCB3ZC0+bWFjQWRkciwga2V5KTsKKyAgICAgICAgICAgIC8vemZDb3JlU2V0S2V5KGRldiwgMCwgMCwgZW5jcnlNb2RlLCBrZXlJbmZvLnZhcEFkZHIsIGtleSk7CisgICAgICAgICAgICB6ZkhwU2V0QXBHcm91cEtleShkZXYsIHdkLT5tYWNBZGRyLCBlbmNyeU1vZGUsCisgICAgICAgICAgICAgICAgICAgIGtleSwgKHUzMl90KikgJmtleUluZm8ua2V5WzE2XSwgdmFwSWQpOworCisgICAgICAgICAgICAvL3pmaVdsYW5TZXRFbmNyeU1vZGUoZGV2LCBlbmNyeU1vZGUpOworICAgICAgICAgICAgd2QtPndzLmVuY3J5TW9kZSA9IGVuY3J5TW9kZTsKKworICAgICAgICAgICAgLyogc2V0IHRoZSBtdWx0aWNhc3QgYWRkcmVzcyBlbmNyeXB0aW9uIHR5cGUgKi8KKyAgICAgICAgICAgIHdkLT5hcC5lbmNyeU1vZGVbdmFwSWRdID0gZW5jcnlNb2RlOworCisgICAgICAgICAgICAvKiBzZXQgdGhlIG11bHRpY2FzdCBrZXkgaW5kZXggKi8KKyAgICAgICAgICAgIHdkLT5hcC5iY0tleUluZGV4W3ZhcElkXSA9IGtleUluZm8ua2V5SW5kZXg7CisgICAgICAgICAgICB3ZC0+YXAuYmNIYWxLZXlJZHhbdmFwSWRdID0gdmFwSWQgKyA2MDsKKworICAgICAgICAgICAgLyogVHVybiBvbiBXRVAgYml0IGluIHRoZSBjYXBhYmlsaXR5IGZpZWxkICovCisgICAgICAgICAgICB3ZC0+YXAuY2FwYWJbdmFwSWRdIHw9IDB4MTA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsgICAvKiBzZXQgYnkgc3VwcGxpY2FudCAqLworCisgICAgICAgIGlmICgga2V5SW5mby5mbGFnICYgWk1fS0VZX0ZMQUdfUEsgKQorICAgICAgICB7ICAgLyogc2V0IHBhaXJ3aXNlIGtleSAqLworCisgICAgICAgICAgICAvL3pmVGtpcEluaXQoa2V5SW5mby5rZXksICh1OF90Kikgd2QtPm1hY0FkZHIsCisgICAgICAgICAgICAvLyAgICAgICAgICAgJndkLT5zdGEudHhTZWVkLCBrZXlJbmZvLmluaXRJdik7CisgICAgICAgICAgICAvL3pmVGtpcEluaXQoa2V5SW5mby5rZXksICh1OF90Kikgd2QtPnN0YS5ic3NpZCwKKyAgICAgICAgICAgIC8vICAgICAgICAgICAmd2QtPnN0YS5yeFNlZWRba2V5SW5mby5rZXlJbmRleF0sIGtleUluZm8uaW5pdEl2KTsKKworI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1dQQTJQU0sKKyAgICAgICAgICAgIGlmICggd2QtPnN0YS5pYnNzV3BhMlBzayA9PSAxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiB1bmljYXN0IC0tID4gcGFpcndpc2Uga2V5ICovCisgICAgICAgICAgICAgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9bdXNlcklkeF0uaXYxNiA9IDA7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9bdXNlcklkeF0uaXYzMiA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5pdjE2ID0gMDsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLml2MzIgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3ZC0+c3RhLm9wcG9zaXRlSW5mb1t1c2VySWR4XS5wa0luc3RhbGxlZCA9IDE7CisjZWxzZQorICAgICAgICAgICAgd2QtPnN0YS5pdjE2ID0gMDsKKyAgICAgICAgICAgIHdkLT5zdGEuaXYzMiA9IDA7CisKKyAgICAgICAgICAgIHdkLT5zdGEub3Bwb3NpdGVJbmZvW3VzZXJJZHhdLnBrSW5zdGFsbGVkID0gMTsKKyNlbmRpZgorCisgICAgICAgICAgICBpZiAoIGtleUluZm8ua2V5TGVuZ3RoID09IDMyICkKKyAgICAgICAgICAgIHsgICAvKiBUS0lQICovCisgICAgICAgICAgICAgICAgemZUa2lwSW5pdChrZXlJbmZvLmtleSwgKHU4X3QqKSB3ZC0+bWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ3ZC0+c3RhLnR4U2VlZCwga2V5SW5mby5pbml0SXYpOworICAgICAgICAgICAgICAgIHpmVGtpcEluaXQoa2V5SW5mby5rZXksICh1OF90Kikgd2QtPnN0YS5ic3NpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ3ZC0+c3RhLnJ4U2VlZFtrZXlJbmZvLmtleUluZGV4XSwga2V5SW5mby5pbml0SXYpOworCisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgICAgICBpZiAoa2V5SW5mby5mbGFnICYgWk1fS0VZX0ZMQUdfQ0VOQykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlNldCBDRU5DIHBhaXJ3aXNlIEtleSIpOworCisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gWk1fQ0VOQzsKKworICAgICAgICAgICAgICAgICAgICAvKiBSZXNldCB0eGl2IGFuZCByeGl2ICovCisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEudHhpdlswXSA9IDB4NWMzNjVjMzY7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEudHhpdlsxXSA9IDB4NWMzNjVjMzY7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEudHhpdlsyXSA9IDB4NWMzNjVjMzY7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEudHhpdlszXSA9IDB4NWMzNjVjMzY7CisKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2WzBdID0gMHg1YzM2NWMzNzsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2WzFdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2WzJdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2WzNdID0gMHg1YzM2NWMzNjsKKworICAgICAgICAgICAgICAgICAgICAvKiBTZXQgS2V5IEluZGV4ICovCisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuY2VuY0tleUlkID0ga2V5SW5mby5rZXlJbmRleDsKKworICAgICAgICAgICAgICAgICAgICAvL3pmQ29yZVNldEtleShkZXYsIGlkKzEsIDEsIFpNX0NFTkMsICh1MTZfdCAqKWtleUluZm8ubWFjQWRkciwKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAodTMyX3QqKSAma2V5SW5mby5rZXlbMTZdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gWk1fVEtJUDsKKworICAgICAgICAgICAgICAgICAgICAvL3pmQ29yZVNldEtleShkZXYsIDAsIDEsIFpNX1RLSVAsIHdkLT5zdGEuYnNzaWQsCisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgKHUzMl90KikgJmtleUluZm8ua2V5WzE2XSk7CisKKyAgICAgICAgICAgICAgICAgICAgemZNaWNTZXRLZXkoJmtleUluZm8ua2V5WzE2XSwgJndkLT5zdGEudHhNaWNLZXkpOworICAgICAgICAgICAgICAgICAgICB6Zk1pY1NldEtleSgma2V5SW5mby5rZXlbMjRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2QtPnN0YS5yeE1pY0tleVtrZXlJbmZvLmtleUluZGV4XSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIGtleUluZm8ua2V5TGVuZ3RoID09IDE2ICkKKyAgICAgICAgICAgIHsgICAvKiBBRVMgKi8KKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLmlic3NXcGEyUHNrID09IDEgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9bdXNlcklkeF0uZW5jcnlNb2RlID0gWk1fQUVTOworICAgICAgICAgICAgICAgICAgICBlbmNyeVR5cGUgPSB3ZC0+c3RhLm9wcG9zaXRlSW5mb1t1c2VySWR4XS5lbmNyeU1vZGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gWk1fQUVTOworICAgICAgICAgICAgICAgICAgICBlbmNyeVR5cGUgPSB3ZC0+c3RhLmVuY3J5TW9kZTsKKyAgICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gWk1fQUVTOworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFpNX1NUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiB1c2VyIDAgKi8KKyAgICAgICAgICAgIC8vemZDb3JlU2V0S2V5KGRldiwgMCwgMCwgd2QtPnN0YS5lbmNyeU1vZGUsCisgICAgICAgICAgICAvLyAgICAgICAgIHdkLT5zdGEuYnNzaWQsICh1MzJfdCopIGtleUluZm8ua2V5KTsKKyAgICAgICAgICAgIC8vemZIcFNldFN0YVBhaXJ3aXNlS2V5KGRldiwgd2QtPnN0YS5ic3NpZCwgd2QtPnN0YS5lbmNyeU1vZGUsCisgICAgICAgICAgICAvLyAgICAodTMyX3QqKSBrZXlJbmZvLmtleSwgKHUzMl90KikgJmtleUluZm8ua2V5WzE2XSk7CisKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgICAgICAgICBpZiAoIChrZXlJbmZvLmtleUxlbmd0aD09MTYpICYmICh3ZC0+c3RhLmlic3NXcGEyUHNrPT0xKSApCisgICAgICAgICAgICB7IC8qIElmIG5vdCBBRVMtQ0NNUCBhbmQgaWJzcyBuZXR3b3JrICwgdXNlIHRyYWRpdGlvbmFsICovCisgICAgICAgICAgICAgICAgemZIcFNldFBlclVzZXJLZXkoZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlJbmZvLmtleUluZGV4LCAgLy8ga2V5IGlkID09IDAgKCBQYWlyd2lzZSBrZXkgPSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHU4X3QqKWtleUluZm8ubWFjQWRkciwgICAvLyBSWCBuZWVkIFNvdXJjZSBBZGRyZXNzICggQWRkcmVzcyAyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlUeXBlLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLmVuY3J5TW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMl90Kikga2V5SW5mby5rZXksICh1MzJfdCopICZrZXlJbmZvLmtleVsxNl0pOworCisgICAgICAgICAgICAgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9bdXNlcklkeF0ud3BhU3RhdGUgPSBaTV9TVEFfV1BBX1NUQVRFX1BLX09LIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsvKiBCaWcgRW5kaWFuIGFuZCBMaXR0bGUgRW5kaWFuIENvbXBhdGliaWxpdHkgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkclsyICogaV0gPSB3ZC0+c3RhLmJzc2lkW2ldICYgMHhmZjsKKyAgICAgICAgICAgICAgICAgICAgYWRkclsyICogaSArIDFdID0gd2QtPnN0YS5ic3NpZFtpXSA+PiA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB6ZkhwU2V0UGVyVXNlcktleShkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9VU0VSX0tFWV9QSywgICAvLyB1c2VyIGlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAvLyBrZXkgaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIsLy8odThfdCAqKXdkLT5zdGEuYnNzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLmVuY3J5TW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzJfdCopIGtleUluZm8ua2V5LCAodTMyX3QqKSAma2V5SW5mby5rZXlbMTZdKTsKKworICAgICAgICAgICAgICAgIHdkLT5zdGEua2V5SWQgPSA0OworICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgIC8qIEJpZyBFbmRpYW4gYW5kIExpdHRsZSBFbmRpYW4gQ29tcGF0aWJpbGl0eSAqLworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhZGRyWzIgKiBpXSA9IHdkLT5zdGEuYnNzaWRbaV0gJiAweGZmOworICAgICAgICAgICAgICAgIGFkZHJbMiAqIGkgKyAxXSA9IHdkLT5zdGEuYnNzaWRbaV0gPj4gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHpmSHBTZXRQZXJVc2VyS2V5KGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1VTRVJfS0VZX1BLLCAgIC8vIHVzZXIgaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgIC8vIGtleSBpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkciwvLyh1OF90ICopd2QtPnN0YS5ic3NpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMl90Kikga2V5SW5mby5rZXksICh1MzJfdCopICZrZXlJbmZvLmtleVsxNl0pOworCisgICAgICAgICAgICB3ZC0+c3RhLmtleUlkID0gNDsKKyNlbmRpZgorCisgICAgICAgICAgICB3ZC0+c3RhLndwYVN0YXRlID0gWk1fU1RBX1dQQV9TVEFURV9QS19PSzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgga2V5SW5mby5mbGFnICYgWk1fS0VZX0ZMQUdfR0sgKQorICAgICAgICB7ICAgLyogc2V0IGdyb3VwIGtleSAqLworCisgICAgICAgICAgICB6ZlRraXBJbml0KGtleUluZm8ua2V5LCAodThfdCopIHdkLT5zdGEuYnNzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICZ3ZC0+c3RhLnJ4U2VlZFtrZXlJbmZvLmtleUluZGV4XSwga2V5SW5mby5pbml0SXYpOworCisgICAgICAgICAgICBpZiAoIGtleUluZm8ua2V5TGVuZ3RoID09IDMyICkKKyAgICAgICAgICAgIHsgICAvKiBUS0lQICovCisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgICAgICBpZiAoa2V5SW5mby5mbGFnICYgWk1fS0VZX0ZMQUdfQ0VOQykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVuY3J5TW9kZSA9IFpNX0NFTkM7CisgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlNldCBDRU5DIGdyb3VwIEtleSIpOworCisgICAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IHR4aXYgYW5kIHJ4aXYgKi8KKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2R0tbMF0gPSAweDVjMzY1YzM2OworICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZHS1sxXSA9IDB4NWMzNjVjMzY7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucnhpdkdLWzJdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2R0tbM10gPSAweDVjMzY1YzM2OworCisgICAgICAgICAgICAgICAgICAgIC8vemZDb3JlU2V0S2V5KGRldiwgMCwgMSwgWk1fQ0VOQywga2V5SW5mby52YXBBZGRyLAorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICh1MzJfdCopICZrZXlJbmZvLmtleVsxNl0pOworICAgICAgICAgICAgICAgICAgICBrZXkgPSAodTMyX3QqKSBrZXlJbmZvLmtleTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVuY3J5TW9kZSA9IFpNX1RLSVA7CisgICAgICAgICAgICAgICAgICAgIGtleSA9ICh1MzJfdCopIHdkLT5zdGEucnhTZWVkW2tleUluZm8ua2V5SW5kZXhdLnRrOworCisgICAgICAgICAgICAgICAgICAgIGlmICggIShrZXlJbmZvLmZsYWcgJiBaTV9LRVlfRkxBR19JTklUX0lWKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucnhTZWVkW2tleUluZm8ua2V5SW5kZXhdLml2MTYgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeFNlZWRba2V5SW5mby5rZXlJbmRleF0uaXYzMiA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvKiBzZXQgTUlDIGtleSB0byBITUFDICovCisgICAgICAgICAgICAgICAgICAgIC8vemZDb3JlU2V0S2V5KGRldiwgOCwgMSwgWk1fVEtJUCwgYnJvYWRjYXN0LAorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICh1MzJfdCopICgma2V5SW5mby5rZXlbMTZdKSk7CisKKyAgICAgICAgICAgICAgICAgICAgemZNaWNTZXRLZXkoJmtleUluZm8ua2V5WzI0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndkLT5zdGEucnhNaWNLZXlba2V5SW5mby5rZXlJbmRleF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCBrZXlJbmZvLmtleUxlbmd0aCA9PSAxNiApCisgICAgICAgICAgICB7ICAgLyogQUVTICovCisgICAgICAgICAgICAgICAgZW5jcnlNb2RlID0gWk1fQUVTOworICAgICAgICAgICAgICAgIC8va2V5ID0gKHUzMl90Kikgd2QtPnN0YS5yeFNlZWRba2V5SW5mby5rZXlJbmRleF0udGs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7ICAgLyogV0VQICovCisgICAgICAgICAgICAgICAgaWYgKCBrZXlJbmZvLmtleUxlbmd0aCA9PSA1ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVuY3J5TW9kZSA9IFpNX1dFUDY0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICgga2V5SW5mby5rZXlMZW5ndGggPT0gMTMgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW5jcnlNb2RlID0gWk1fV0VQMTI4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICgga2V5SW5mby5rZXlMZW5ndGggPT0gMjkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW5jcnlNb2RlID0gWk1fV0VQMjU2OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGtleSA9ICh1MzJfdCopIGtleUluZm8ua2V5OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiB1c2VyIDggKi8KKyAgICAgICAgICAgIC8vemZDb3JlU2V0S2V5KGRldiwgOCwgMCwgZW5jcnlNb2RlLCBicm9hZGNhc3QsIGtleSk7CisgICAgICAgICAgICAvL3pmSHBTZXRTdGFHcm91cEtleShkZXYsIGJyb2FkY2FzdCwgZW5jcnlNb2RlLAorICAgICAgICAgICAgLy8gICAgICAgICh1MzJfdCopIGtleUluZm8ua2V5LCAodTMyX3QqKSAoJmtleUluZm8ua2V5WzE2XSkpOworCisjaWZkZWYgWk1fRU5BQkxFX0lCU1NfV1BBMlBTSworICAgICAgICAgICAgaWYgKCAoa2V5SW5mby5rZXlMZW5ndGg9PTE2KSAmJiAod2QtPnN0YS5pYnNzV3BhMlBzaz09MSkgKQorICAgICAgICAgICAgey8qIElmIG5vdCBBRVMtQ0NNUCBhbmQgaWJzcyBuZXR3b3JrICwgdXNlIHRyYWRpdGlvbmFsICovCisgICAgICAgICAgICAgICAgemZIcFNldFBlclVzZXJLZXkoZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleUluZm8ua2V5SW5kZXgsICAgICAgICAgICAgICAgIC8vIGtleSBpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHU4X3QgKilicm9hZGNhc3QsICAgICAgICAgICAgICAgICAgLy8gZm9yIG9ubHkgMiBzdGF0aW9ucyBJQlNTIG5ldHdybCAoIEEyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1OF90KilrZXlJbmZvLm1hY0FkZHIsICAgLy8gZm9yIG11bHRpcGxlICggPiAyICkgc3RhdGlvbnMgSUJTUyBuZXR3b3JrICggQTIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMl90Kikga2V5SW5mby5rZXksICh1MzJfdCopICZrZXlJbmZvLmtleVsxNl0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmSHBTZXRQZXJVc2VyS2V5KGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fVVNFUl9LRVlfR0ssICAgLy8gdXNlciBpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAvLyBrZXkgaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHU4X3QgKilicm9hZGNhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5TW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMl90Kikga2V5SW5mby5rZXksICh1MzJfdCopICZrZXlJbmZvLmtleVsxNl0pOworCisgICAgICAgICAgICAgICAgd2QtPnN0YS53cGFTdGF0ZSA9IFpNX1NUQV9XUEFfU1RBVEVfR0tfT0s7CisgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgemZIcFNldFBlclVzZXJLZXkoZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fVVNFUl9LRVlfR0ssICAgLy8gdXNlciBpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgLy8ga2V5IGlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodThfdCAqKWJyb2FkY2FzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5TW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzJfdCopIGtleUluZm8ua2V5LCAodTMyX3QqKSAma2V5SW5mby5rZXlbMTZdKTsKKworICAgICAgICAgICAgd2QtPnN0YS53cGFTdGF0ZSA9IFpNX1NUQV9XUEFfU1RBVEVfR0tfT0s7CisjZW5kaWYKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsgICAvKiBsZWdhY3kgV0VQICovCisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJsZWdhY3kgV0VQIik7CisKKyAgICAgICAgICAgIGlmICgga2V5SW5mby5rZXlJbmRleCA+PSA0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gWk1fU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgga2V5SW5mby5rZXlMZW5ndGggPT0gNSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiV0VQIDY0Iik7CisKKyAgICAgICAgICAgICAgICBlbmNyeU1vZGUgPSBaTV9XRVA2NDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCBrZXlJbmZvLmtleUxlbmd0aCA9PSAxMyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiV0VQIDEyOCIpOworCisgICAgICAgICAgICAgICAgZW5jcnlNb2RlID0gWk1fV0VQMTI4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIGtleUluZm8ua2V5TGVuZ3RoID09IDMyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBUS0lQICovCisgICAgICAgICAgICAgICAgI2lmIDAKKyAgICAgICAgICAgICAgICAvLyBEb24ndCByZXNldCB0aGUgSVYgc2luY2Ugc29tZSBBUCB3b3VsZCBmYWlsIGluIElWIGNoZWNrIGFuZCBkcm9wIG91ciBjb25uZWN0aW9uCisgICAgICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLndwYVN0YXRlICE9IFpNX1NUQV9XUEFfU1RBVEVfUEtfT0sgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5pdjE2ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5pdjMyID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgICAgICBlbmNyeU1vZGUgPSBaTV9US0lQOworCisgICAgICAgICAgICAgICAgemZUa2lwSW5pdChrZXlJbmZvLmtleSwgKHU4X3QqKSB3ZC0+c3RhLmJzc2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJndkLT5zdGEucnhTZWVkW2tleUluZm8ua2V5SW5kZXhdLCBrZXlJbmZvLmluaXRJdik7CisgICAgICAgICAgICAgICAgemZNaWNTZXRLZXkoJmtleUluZm8ua2V5WzI0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3ZC0+c3RhLnJ4TWljS2V5W2tleUluZm8ua2V5SW5kZXhdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCBrZXlJbmZvLmtleUxlbmd0aCA9PSAxNiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogQUVTICovCisgICAgICAgICAgICAgICAgI2lmIDAKKyAgICAgICAgICAgICAgICAvLyBEb24ndCByZXNldCB0aGUgSVYgc2luY2Ugc29tZSBBUCB3b3VsZCBmYWlsIGluIElWIGNoZWNrIGFuZCBkcm9wIG91ciBjb25uZWN0aW9uCisgICAgICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLndwYVN0YXRlICE9IFpNX1NUQV9XUEFfU1RBVEVfUEtfT0sgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogYnJvYWRjYXN0IC0tID4gZ3JvdXAga2V5ICovCisgICAgICAgICAgICAgICAgICAgIC8qIE9ubHkgaW5pdGlhbGl6ZSB3aGVuIHNldCBvdXIgZGVmYXVsdCBrZXkgISAqLworICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLml2MTYgPSAwOworICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLml2MzIgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgICAgIGVuY3J5TW9kZSA9IFpNX0FFUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCBrZXlJbmZvLmtleUxlbmd0aCA9PSAyOSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiV0VQIDI1NiIpOworCisgICAgICAgICAgICAgICAgZW5jcnlNb2RlID0gWk1fV0VQMjU2OworICAgICAgICAgICAgICAgIC8vemZDb3JlU2V0S2V5KGRldiwgNjQsIDEsIHdkLT5zdGEuZW5jcnlNb2RlLAorICAgICAgICAgICAgICAgIC8vICAgICAgICAgd2QtPnN0YS5ic3NpZCwgKHUzMl90KikgKCZrZXlJbmZvLmtleVsxNl0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gWk1fU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1OF90IGk7CisKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJrZXkgPSAiKTsKKyAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBrZXlJbmZvLmtleUxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMigiIiwga2V5SW5mby5rZXlbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBrZXlJbmZvLmZsYWcgJiBaTV9LRVlfRkxBR19ERUZBVUxUX0tFWSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9mb3IgV0VQIGRlZmF1bHQga2V5IDF+MyBhbmQgQVRPTSBwbGF0Zm9ybS0tQ1dZYW5nKCspCisgICAgICAgICAgICAgICAgdmFwSWQgPSAwOworICAgICAgICAgICAgICAgIHdkLT5hcC5iY0hhbEtleUlkeFt2YXBJZF0gPSBrZXlJbmZvLmtleUluZGV4OworICAgICAgICAgICAgICAgIHdkLT5hcC5iY0tleUluZGV4W3ZhcElkXSA9IGtleUluZm8ua2V5SW5kZXg7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5rZXlJZCA9IGtleUluZm8ua2V5SW5kZXg7CisgICAgICAgICAgICB9CisKKwkJCWlmKGVuY3J5TW9kZSA9PSBaTV9US0lQKQorCQkJeworCQkJCWlmKHdkLT5US0lQX0dyb3VwX0tleUNoYW5naW5nID09IDB4MSkKKwkJCQl7CisJCQkJCXptX2RlYnVnX21zZzAoIkNvdW50ZXJtZWFzdXJlIDogQ2FuY2VsIE9sZCBUaW1lciAiKTsKKwkJCQkJemZUaW1lckNhbmNlbChkZXYsCVpNX0VWRU5UX1NLSVBfQ09VTlRFUk1FQVNVUkUpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQl6bV9kZWJ1Z19tc2cwKCJDb3VudGVybWVhc3VyZSA6IENyZWF0ZSBOZXcgVGltZXIgIik7CisJCQkJfQorCisJCQkJd2QtPlRLSVBfR3JvdXBfS2V5Q2hhbmdpbmcgPSAweDE7CisJCQkJemZUaW1lclNjaGVkdWxlKGRldiwgWk1fRVZFTlRfU0tJUF9DT1VOVEVSTUVBU1VSRSwgMTUwKTsKKwkJCX0KKworCisKKwkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgIC8qIHVzZSBkZWZhdWx0IGtleSAqLworICAgICAgICAgICAgLy96ZkNvcmVTZXRLZXkoZGV2LCBaTV9VU0VSX0tFWV9ERUZBVUxUK2tleUluZm8ua2V5SW5kZXgsIDAsCisgICAgICAgICAgICAvLyAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlLCB3ZC0+c3RhLmJzc2lkLCAodTMyX3QqKSBrZXlJbmZvLmtleSk7CisKKyAgICAgICAgICAgIGlmICggZW5jcnlNb2RlID09IFpNX1RLSVAgfHwKKyAgICAgICAgICAgICAgICAgZW5jcnlNb2RlID09IFpNX0FFUyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZIcFNldERlZmF1bHRLZXkoZGV2LCBrZXlJbmZvLmtleUluZGV4LCBlbmNyeU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTMyX3QqKSBrZXlJbmZvLmtleSwgKHUzMl90KikgJmtleUluZm8ua2V5WzE2XSk7CisKKyNpZmRlZiBaTV9FTkFCTEVfSUJTU19XUEEyUFNLCisgICAgICAgICAgICBpZiAoIChrZXlJbmZvLmtleUxlbmd0aD09MTYpICYmICh3ZC0+c3RhLmlic3NXcGEyUHNrPT0xKSApCisgICAgICAgICAgICB7LyogSWYgbm90IEFFUy1DQ01QIGFuZCBpYnNzIG5ldHdvcmsgLCB1c2UgdHJhZGl0aW9uYWwgKi8KKyAgICAgICAgICAgICAgICB3ZC0+c3RhLndwYVN0YXRlID0gWk1fU1RBX1dQQV9TVEFURV9QS19PSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS53cGFTdGF0ZSA9PSBaTV9TVEFfV1BBX1NUQVRFX1BLX09LKQorICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLndwYVN0YXRlID0gWk1fU1RBX1dQQV9TVEFURV9HS19PSzsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLndwYVN0YXRlID0gWk1fU1RBX1dQQV9TVEFURV9QS19PSzsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5lbmNyeU1vZGUgPSBlbmNyeU1vZGU7CisgICAgICAgICAgICAgICAgICAgIHdkLT53cy5lbmNyeU1vZGUgPSBlbmNyeU1vZGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS53cGFTdGF0ZSA9PSBaTV9TVEFfV1BBX1NUQVRFX1BLX09LKQorICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLndwYVN0YXRlID0gWk1fU1RBX1dQQV9TVEFURV9HS19PSzsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICggd2QtPnN0YS53cGFTdGF0ZSA9PSBaTV9TVEFfV1BBX1NUQVRFX0lOSVQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS53cGFTdGF0ZSA9IFpNX1NUQV9XUEFfU1RBVEVfUEtfT0s7CisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gZW5jcnlNb2RlOworICAgICAgICAgICAgICAgICAgICB3ZC0+d3MuZW5jcnlNb2RlID0gZW5jcnlNb2RlOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmSHBTZXREZWZhdWx0S2V5KGRldiwga2V5SW5mby5rZXlJbmRleCwgZW5jcnlNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzJfdCopIGtleUluZm8ua2V5LCBOVUxMKTsKKworICAgICAgICAgICAgICAgIC8qIFNhdmUga2V5IGZvciBzb2Z0d2FyZSBXRVAgKi8KKyAgICAgICAgICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS53ZXBLZXlba2V5SW5mby5rZXlJbmRleF0sIGtleUluZm8ua2V5LAorICAgICAgICAgICAgICAgICAgICAgICAga2V5SW5mby5rZXlMZW5ndGgpOworCisgICAgICAgICAgICAgICAgLyogVE9ETzogQ2hlY2sgd2hldGhlciB3ZSBuZWVkIHRvIHNhdmUgdGhlIFNXRW5jcnlNb2RlICovCisgICAgICAgICAgICAgICAgd2QtPnN0YS5TV0VuY3J5TW9kZVtrZXlJbmZvLmtleUluZGV4XSA9IGVuY3J5TW9kZTsKKworICAgICAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gZW5jcnlNb2RlOworICAgICAgICAgICAgICAgIHdkLT53cy5lbmNyeU1vZGUgPSBlbmNyeU1vZGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKy8vICAgIHdkLT5zdGEuZmxhZ0tleUNoYW5naW5nID0gMTsKKyAgICByZXR1cm4gWk1fU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qIFBTRVVETyB0ZXN0ICovCit1OF90IHpmaVdsYW5QU0VVRE9TZXRLZXkoemRldl90KiBkZXYsIHN0cnVjdCB6c0tleUluZm8ga2V5SW5mbykKK3sKKyAgICAvL3UxNl90ICBicm9hZGNhc3RbM10gPSB7MHhmZmZmLCAweGZmZmYsIDB4ZmZmZn07CisgICAgLy91MzJfdCoga2V5OworICAgIHU4X3QgICBtaWNLZXlbMTZdOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc3dpdGNoIChrZXlJbmZvLmtleUxlbmd0aCkKKyAgICB7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gWk1fV0VQNjQ7CisgICAgICAgICAgICAvKiB1c2UgZGVmYXVsdCBrZXkgKi8KKyAgICAgICAgICAgIHpmQ29yZVNldEtleShkZXYsIDY0LCAwLCBaTV9XRVA2NCwgKHUxNl90ICopa2V5SW5mby5tYWNBZGRyLCAodTMyX3QqKSBrZXlJbmZvLmtleSk7CisJCSAgICAgICAgICBicmVhazsKKworICAgICAgIAljYXNlIDEzOgorICAgICAgICAgICAgd2QtPnN0YS5lbmNyeU1vZGUgPSBaTV9XRVAxMjg7CisgICAgICAgICAgICAvKiB1c2UgZGVmYXVsdCBrZXkgKi8KKyAgICAgICAgICAgIHpmQ29yZVNldEtleShkZXYsIDY0LCAwLCBaTV9XRVAxMjgsICh1MTZfdCAqKWtleUluZm8ubWFjQWRkciwgKHUzMl90Kikga2V5SW5mby5rZXkpOworICAgICAgICAgIAkJYnJlYWs7CisKKyAgICAgICAJY2FzZSAyOToKKyAgICAgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gWk1fV0VQMjU2OworICAgICAgICAgICAgLyogdXNlIGRlZmF1bHQga2V5ICovCisgICAgICAgICAgICB6ZkNvcmVTZXRLZXkoZGV2LCA2NCwgMSwgWk1fV0VQMjU2LCAgKHUxNl90ICopa2V5SW5mby5tYWNBZGRyLCAodTMyX3QqKSAoJmtleUluZm8ua2V5WzE2XSkpOworICAgICAgICAgICAgemZDb3JlU2V0S2V5KGRldiwgNjQsIDAsIFpNX1dFUDI1NiwgKHUxNl90ICopa2V5SW5mby5tYWNBZGRyLCAodTMyX3QqKSBrZXlJbmZvLmtleSk7CisJCSAgICAgICAgICBicmVhazsKKworICAgICAgIAljYXNlIDE2OgorICAgICAgICAgICAgd2QtPnN0YS5lbmNyeU1vZGUgPSBaTV9BRVM7CisgICAgICAgICAgICAvL3pmQ29yZVNldEtleShkZXYsIDAsIDAsIFpNX0FFUywgKHUxNl90ICopa2V5SW5mby5tYWNBZGRyLCAodTMyX3QqKSBrZXlJbmZvLmtleSk7CisgICAgICAgICAgICB6ZkNvcmVTZXRLZXkoZGV2LCA2NCwgMCwgWk1fQUVTLCAodTE2X3QgKilrZXlJbmZvLm1hY0FkZHIsICh1MzJfdCopIGtleUluZm8ua2V5KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgCWNhc2UgMzI6CisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgIGlmIChrZXlJbmZvLmZsYWcgJiBaTV9LRVlfRkxBR19DRU5DKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHUxNl90IGJvYXJkY2FzdEFkZHJbM10gPSB7MHhmZmZmLCAweGZmZmYsIDB4ZmZmZn07CisgICAgICAgICAgICAgICAgdTE2X3QgQWRkcl9hW10gPSB7IDB4MDAwMCwgMHgwMDgwLCAweDA5MDF9OworICAgICAgICAgICAgICAgIHUxNl90IEFkZHJfYltdID0geyAweDAwMDAsIDB4MDA4MCwgMHgwOTAyfTsKKyAgICAgICAgICAgICAgICAvKiBDRU5DIHRlc3Q6IHVzZXIwLDEgYW5kIHVzZXIyIGZvciBib2FyZGNhc3QgKi8KKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmVuY3J5TW9kZSA9IFpNX0NFTkM7CisgICAgICAgICAgICAgICAgemZDb3JlU2V0S2V5KGRldiwgMCwgMSwgWk1fQ0VOQywgKHUxNl90ICopQWRkcl9hLCAodTMyX3QqKSAoJmtleUluZm8ua2V5WzE2XSkpOworICAgICAgICAgICAgICAgIHpmQ29yZVNldEtleShkZXYsIDAsIDAsIFpNX0NFTkMsICh1MTZfdCAqKUFkZHJfYSwgKHUzMl90Kikga2V5SW5mby5rZXkpOworCisgICAgICAgICAgICAgICAgemZDb3JlU2V0S2V5KGRldiwgMSwgMSwgWk1fQ0VOQywgKHUxNl90ICopQWRkcl9iLCAodTMyX3QqKSAoJmtleUluZm8ua2V5WzE2XSkpOworICAgICAgICAgICAgICAgIHpmQ29yZVNldEtleShkZXYsIDEsIDAsIFpNX0NFTkMsICh1MTZfdCAqKUFkZHJfYiwgKHUzMl90Kikga2V5SW5mby5rZXkpOworCisgICAgICAgICAgICAgICAgemZDb3JlU2V0S2V5KGRldiwgMiwgMSwgWk1fQ0VOQywgKHUxNl90ICopYm9hcmRjYXN0QWRkciwgKHUzMl90KikgKCZrZXlJbmZvLmtleVsxNl0pKTsKKyAgICAgICAgICAgICAgICB6ZkNvcmVTZXRLZXkoZGV2LCAyLCAwLCBaTV9DRU5DLCAodTE2X3QgKilib2FyZGNhc3RBZGRyLCAodTMyX3QqKSBrZXlJbmZvLmtleSk7CisKKyAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIFBOIHNlcXVlbmNlICovCisgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzBdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLnR4aXZbMV0gPSAweDVjMzY1YzM2OworICAgICAgICAgICAgICAgIHdkLT5zdGEudHhpdlsyXSA9IDB4NWMzNjVjMzY7CisgICAgICAgICAgICAgICAgd2QtPnN0YS50eGl2WzNdID0gMHg1YzM2NWMzNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5lbmNyeU1vZGUgPSBaTV9US0lQOworICAgICAgICAgICAgICAgIHpmQ29yZVNldEtleShkZXYsIDY0LCAxLCBaTV9US0lQLCAodTE2X3QgKilrZXlJbmZvLm1hY0FkZHIsICh1MzJfdCopIG1pY0tleSk7CisgICAgICAgICAgICAgICAgemZDb3JlU2V0S2V5KGRldiwgNjQsIDAsIFpNX1RLSVAsICh1MTZfdCAqKWtleUluZm8ubWFjQWRkciwgKHUzMl90Kikga2V5SW5mby5rZXkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB3ZC0+c3RhLmVuY3J5TW9kZSA9IFpNX05PX1dFUDsKKyAgICB9CisKKyAgICByZXR1cm4gWk1fU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3ZvaWQgemZpV2xhblNldFBvd2VyU2F2ZU1vZGUoemRldl90KiBkZXYsIHU4X3QgbW9kZSkKK3sKKyNpZiAwCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnN0YS5wb3dlclNhdmVNb2RlID0gbW9kZTsKKworICAgIC8qIHNlbmQgbnVsbCBkYXRhIHdpdGggUHdyQml0IHRvIGluZm9ybSBBUCAqLworICAgIGlmICggbW9kZSA+IFpNX1NUQV9QU19OT05FICkKKyAgICB7CisgICAgICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgICAgICB7CisgICAgICAgICAgICB6ZlNlbmROdWxsRGF0YShkZXYsIDEpOworICAgICAgICB9CisKKyAgICAgICAgLyogZGV2aWNlIGludG8gUFMgbW9kZSAqLworICAgICAgICB6ZlBTRGV2aWNlU2xlZXAoZGV2KTsKKyAgICB9CisjZW5kaWYKKworICAgIHpmUG93ZXJTYXZpbmdNZ3JTZXRNb2RlKGRldiwgbW9kZSk7Cit9CisKK3ZvaWQgemZpV2xhblNldE1hY0FkZHJlc3MoemRldl90KiBkZXYsIHUxNl90KiBtYWMpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPm1hY0FkZHJbMF0gPSBtYWNbMF07CisgICAgd2QtPm1hY0FkZHJbMV0gPSBtYWNbMV07CisgICAgd2QtPm1hY0FkZHJbMl0gPSBtYWNbMl07CisKKyAgICB6ZkhwU2V0TWFjQWRkcmVzcyhkZXYsIG1hYywgMCk7Cit9CisKK3U4X3QgemZpV2xhblF1ZXJ5V2xhbk1vZGUoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT53bGFuTW9kZTsKK30KKwordThfdCB6ZmlXbGFuUXVlcnlBZGFwdGVyU3RhdGUoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT5zdGF0ZTsKK30KKwordThfdCB6ZmlXbGFuUXVlcnlBdXRoZW50aWNhdGlvbk1vZGUoemRldl90KiBkZXYsIHU4X3QgYldyYXBwZXIpCit7CisgICAgdThfdCAgIGF1dGhNb2RlOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCBiV3JhcHBlciApCisgICAgeworICAgICAgICBhdXRoTW9kZSA9IHdkLT53cy5hdXRoTW9kZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy9hdXRoTW9kZSA9IHdkLT5zdGEuYXV0aE1vZGU7CisgICAgICAgIGF1dGhNb2RlID0gd2QtPnN0YS5jdXJyZW50QXV0aE1vZGU7CisgICAgfQorCisgICAgcmV0dXJuIGF1dGhNb2RlOworfQorCit1OF90IHpmaVdsYW5RdWVyeVdlcFN0YXR1cyh6ZGV2X3QqIGRldiwgdThfdCBiV3JhcHBlcikKK3sKKyAgICB1OF90IHdlcFN0YXR1czsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmICggYldyYXBwZXIgKQorICAgIHsKKyAgICAgICAgd2VwU3RhdHVzID0gd2QtPndzLndlcFN0YXR1czsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgd2VwU3RhdHVzID0gd2QtPnN0YS53ZXBTdGF0dXM7CisgICAgfQorCisgICAgcmV0dXJuIHdlcFN0YXR1czsKK30KKwordm9pZCB6ZmlXbGFuUXVlcnlTU0lEKHpkZXZfdCogZGV2LCB1OF90KiBzc2lkLCB1OF90KiBwU3NpZExlbmd0aCkKK3sKKyAgICB1MTZfdCB2YXBJZCA9IDA7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgIHsKKyAgICAgICAgdmFwSWQgPSB6ZndHZXRWYXBJZChkZXYpOworCisgICAgICAgIGlmICh2YXBJZCA9PSAweGZmZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgICpwU3NpZExlbmd0aCA9IHdkLT5hcC5zc2lkTGVuWzBdOworICAgICAgICAgICAgemZNZW1vcnlDb3B5KHNzaWQsIHdkLT5hcC5zc2lkWzBdLCB3ZC0+YXAuc3NpZExlblswXSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAqcFNzaWRMZW5ndGggPSB3ZC0+YXAuc3NpZExlblt2YXBJZCArIDFdOworICAgICAgICAgICAgemZNZW1vcnlDb3B5KHNzaWQsIHdkLT5hcC5zc2lkW3ZhcElkICsgMV0sIHdkLT5hcC5zc2lkTGVuW3ZhcElkICsgMV0pOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpwU3NpZExlbmd0aCA9IHdkLT5zdGEuc3NpZExlbjsKKyAgICAgICAgemZNZW1vcnlDb3B5KHNzaWQsIHdkLT5zdGEuc3NpZCwgd2QtPnN0YS5zc2lkTGVuKTsKKyAgICB9Cit9CisKK3UxNl90IHpmaVdsYW5RdWVyeUZyYWdUaHJlc2hvbGQoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT5mcmFnVGhyZXNob2xkOworfQorCit1MTZfdCB6ZmlXbGFuUXVlcnlSdHNUaHJlc2hvbGQoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT5ydHNUaHJlc2hvbGQ7Cit9CisKK3UzMl90IHpmaVdsYW5RdWVyeUZyZXF1ZW5jeSh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICByZXR1cm4gKHdkLT5mcmVxdWVuY3kqMTAwMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246IHpmaVdsYW5RdWVyeUN1cnJlbnRGcmVxdWVuY3kKKyAqIFJldHVybiB2YWx1ZToKKyAqICAgLSAgIDAgOiBubyB2YWxpZGF0ZSBjdXJyZW50IGZyZXF1ZW5jeQorICogICAtICg+MCk6IGN1cnJlbnQgZnJlcXVlbmN5IGRlcGVuZCBvbiAicW1vZGUiCisgKiBJbnB1dDoKKyAqICAgLSBxbW9kZToKKyAqICAgICAgMDogcmV0dXJuIHZhbHVlIGRlcGVuZCBvbiB0aGUgc3VwcG9ydCBtb2RlLCB0aGlzCisgICAgICAgICAgIHFtb2RlIGlzIHVzZSB0byBzb2x2ZSB0aGUgYnVnICMzMTIyMworICogICAgICAxOiByZXR1cm4gdGhlIGFjdHVhbGx5IGN1cnJlbnQgZnJlcXVlbmN5CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzJfdCB6ZmlXbGFuUXVlcnlDdXJyZW50RnJlcXVlbmN5KHpkZXZfdCogZGV2LCB1OF90IHFtb2RlKQoreworICAgIHUzMl90IGZyZXF1ZW5jeTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN3aXRjaCAocW1vZGUpCisgICAgeworICAgIGNhc2UgMDoKKyAgICAgICAgaWYgKHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeSA+IDMwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3ZC0+c3VwcG9ydE1vZGUgJiBaTV9XSVJFTEVTU19NT0RFXzUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZnJlcXVlbmN5ID0gd2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAod2QtPnN1cHBvcnRNb2RlICYgWk1fV0lSRUxFU1NfTU9ERV8yNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmcmVxdWVuY3kgPSB6ZkNoR2V0Rmlyc3QyR2h6Q2hhbm5lbChkZXYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZyZXF1ZW5jeSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAod2QtPnN1cHBvcnRNb2RlICYgWk1fV0lSRUxFU1NfTU9ERV8yNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmcmVxdWVuY3kgPSB3ZC0+c3RhLmN1cnJlbnRGcmVxdWVuY3k7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh3ZC0+c3VwcG9ydE1vZGUgJiBaTV9XSVJFTEVTU19NT0RFXzUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZnJlcXVlbmN5ID0gemZDaEdldExhc3Q1R2h6Q2hhbm5lbChkZXYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZyZXF1ZW5jeSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDE6CisgICAgICAgIGZyZXF1ZW5jeSA9IHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBmcmVxdWVuY3kgPSAwOworICAgIH0KKworICAgIHJldHVybiAoZnJlcXVlbmN5KjEwMDApOworfQorCit1MzJfdCB6ZmlXbGFuUXVlcnlGcmVxdWVuY3lBdHRyaWJ1dGUoemRldl90KiBkZXYsIHUzMl90IGZyZXEpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgdThfdCAgaTsKKyAgICB1MTZfdCBmcmVxdWVuY3kgPSAodTE2X3QpIChmcmVxLzEwMDApOworICAgIHUzMl90IHJldCA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmICggd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbCA9PSBmcmVxdWVuY3kgKQorICAgICAgICB7CisgICAgICAgICAgICByZXQgPSB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsRmxhZ3M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBCYW5kV2lkdGggIDA9PjIwICAxPT40MCAqLworLyogRXh0T2Zmc2V0ICAwPT4yMCAgMT0+aGlnaCBjb250cm9sIDQwICAgMz0+bG93IGNvbnRyb2wgNDAgKi8KK3ZvaWQgemZpV2xhblF1ZXJ5RnJlcXVlbmN5SFQoemRldl90KiBkZXYsIHUzMl90ICpiYW5kV2lkdGgsIHUzMl90ICpleHRPZmZzZXQpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgKmJhbmRXaWR0aCA9IHdkLT5CYW5kV2lkdGg0MDsKKyAgICAqZXh0T2Zmc2V0ID0gd2QtPkV4dE9mZnNldDsKK30KKwordThfdCB6ZmlXbGFuUXVlcnlDV01vZGUoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT5jd20uY3dfbW9kZTsKK30KKwordTMyX3QgemZpV2xhblF1ZXJ5Q1dFbmFibGUoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT5jd20uY3dfZW5hYmxlOworfQorCit2b2lkIHpmaVdsYW5RdWVyeUJzc2lkKHpkZXZfdCogZGV2LCB1OF90KiBic3NpZCkKK3sKKyAgICB1OF90ICAgYWRkcls2XTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIFpNX01BQ19XT1JEX1RPX0JZVEUod2QtPnN0YS5ic3NpZCwgYWRkcik7CisgICAgemZNZW1vcnlDb3B5KGJzc2lkLCBhZGRyLCA2KTsKK30KKwordTE2X3QgemZpV2xhblF1ZXJ5QmVhY29uSW50ZXJ2YWwoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT5iZWFjb25JbnRlcnZhbDsKK30KKwordTMyX3QgemZpV2xhblF1ZXJ5UnhCZWFjb25Ub3RhbCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgd2QtPnN0YS5yeEJlYWNvblRvdGFsICs9IHdkLT5zdGEucnhCZWFjb25Db3VudDsKKworICAgIHJldHVybiB3ZC0+c3RhLnJ4QmVhY29uVG90YWw7Cit9CisKK3UxNl90IHpmaVdsYW5RdWVyeUF0aW1XaW5kb3coemRldl90KiBkZXYpCit7CisgICAgdTE2X3QgYXRpbVdpbmRvdzsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGF0aW1XaW5kb3cgPSB3ZC0+c3RhLmF0aW1XaW5kb3c7CisKKyAgICByZXR1cm4gYXRpbVdpbmRvdzsKK30KKwordThfdCB6ZmlXbGFuUXVlcnlFbmNyeU1vZGUoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQorICAgICAgICByZXR1cm4gd2QtPmFwLmVuY3J5TW9kZVswXTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiB3ZC0+c3RhLmVuY3J5TW9kZTsKK30KKwordTE2X3QgemZpV2xhblF1ZXJ5Q2FwYWJpbGl0eSh6ZGV2X3QqIGRldikKK3sKKyAgICB1MTZfdCBjYXBhYmlsaXR5OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgY2FwYWJpbGl0eSA9IHdkLT5zdGEuY2FwYWJpbGl0eVswXSArCisgICAgICAgICAgICAgICAgICgoKHUxNl90KSB3ZC0+c3RhLmNhcGFiaWxpdHlbMV0pIDw8IDgpOworCisgICAgcmV0dXJuIGNhcGFiaWxpdHk7CisKK30KKwordTE2X3QgemZpV2xhblF1ZXJ5QWlkKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHJldHVybiB3ZC0+c3RhLmFpZDsKK30KKwordm9pZCB6ZmlXbGFuUXVlcnlTdXBwb3J0UmF0ZSh6ZGV2X3QqIGRldiwgdThfdCogcmF0ZUFycmF5LCB1OF90KiBwTGVuZ3RoKQoreworICAgIHU4X3QgICBpLCBqPTA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBmb3IoIGk9MDsgaTw0OyBpKysgKQorICAgIHsKKyAgICAgICAgaWYgKCB3ZC0+YlJhdGUgJiAoMHgxIDw8IGkpICkKKyAgICAgICAgeworICAgICAgICAgICAgcmF0ZUFycmF5W2pdID0gemcxMWJSYXRlVGJsW2ldICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgod2QtPmJSYXRlQmFzaWMgJiAoMHgxPDxpKSk8PCg3LWkpKTsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgIH0KKworICAgICpwTGVuZ3RoID0gajsKK30KKwordm9pZCB6ZmlXbGFuUXVlcnlFeHRTdXBwb3J0UmF0ZSh6ZGV2X3QqIGRldiwgdThfdCogcmF0ZUFycmF5LCB1OF90KiBwTGVuZ3RoKQoreworICAgIHU4X3QgICBpLCBqPTA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBmb3IoIGk9MDsgaTw4OyBpKysgKQorICAgIHsKKyAgICAgICAgaWYgKCB3ZC0+Z1JhdGUgJiAoMHgxIDw8IGkpICkKKyAgICAgICAgeworICAgICAgICAgICAgcmF0ZUFycmF5W2pdID0gemcxMWdSYXRlVGJsW2ldICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgod2QtPmdSYXRlQmFzaWMgJiAoMHgxPDxpKSk8PCg3LWkpKTsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgIH0KKworICAgICpwTGVuZ3RoID0gajsKK30KKwordm9pZCB6ZmlXbGFuUXVlcnlSc25JZSh6ZGV2X3QqIGRldiwgdThfdCogaWUsIHU4X3QqIHBMZW5ndGgpCit7CisgICAgdThfdCBsZW47CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBsZW4gPSB3ZC0+c3RhLnJzbkllWzFdICsgMjsKKyAgICB6Zk1lbW9yeUNvcHkoaWUsIHdkLT5zdGEucnNuSWUsIGxlbik7CisgICAgKnBMZW5ndGggPSBsZW47Cit9CisKK3ZvaWQgemZpV2xhblF1ZXJ5V3BhSWUoemRldl90KiBkZXYsIHU4X3QqIGllLCB1OF90KiBwTGVuZ3RoKQoreworICAgIHU4X3QgbGVuOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgbGVuID0gd2QtPnN0YS53cGFJZVsxXSArIDI7CisgICAgemZNZW1vcnlDb3B5KGllLCB3ZC0+c3RhLndwYUllLCBsZW4pOworICAgICpwTGVuZ3RoID0gbGVuOworCit9CisKK3U4X3QgemZpV2xhblF1ZXJ5TXVsdGljYXN0Q2lwaGVyQWxnbyh6ZGV2X3QgKmRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzd2l0Y2goIHdkLT5zdGEuY3VycmVudEF1dGhNb2RlICkKKyAgICB7CisgICAgICAgIGNhc2UgWk1fQVVUSF9NT0RFX1dQQTJQU0s6CisgICAgICAgIGNhc2UgWk1fQVVUSF9NT0RFX1dQQTI6CisgICAgICAgICAgICBpZiAoIHdkLT5zdGEucnNuSWVbN10gPT0gMiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFpNX1RLSVA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFpNX0FFUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fQVVUSF9NT0RFX1dQQVBTSzoKKyAgICAgICAgY2FzZSBaTV9BVVRIX01PREVfV1BBOgorICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLnJzbkllWzExXSA9PSAyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gWk1fVEtJUDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gWk1fQUVTOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiB3ZC0+c3RhLmVuY3J5TW9kZTsKKyAgICB9Cit9CisKK3U4X3QgemZpV2xhblF1ZXJ5SFRNb2RlKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICAvLyAwOkxlZ2FuY3ksIDE6TgorICAgIHJldHVybiB3ZC0+c3RhLkVuYWJsZUhUOworfQorCit1OF90IHpmaVdsYW5RdWVyeUJhbmRXaWR0aDQwKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICAvLyAwOjIwTSwgMTo0ME0KKyAgICByZXR1cm4gd2QtPkJhbmRXaWR0aDQwOworfQorCit1MTZfdCB6ZmlXbGFuUXVlcnlSZWdpb25Db2RlKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHJldHVybiB3ZC0+cmVndWxhdGlvblRhYmxlLnJlZ2lvbkNvZGU7Cit9Cit2b2lkIHpmaVdsYW5TZXRXcGFJZSh6ZGV2X3QqIGRldiwgdThfdCogaWUsIHU4X3QgTGVuZ3RoKQoreworICAgIHUxNl90IHZhcElkID0gMDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApIC8vIEFQIE1vZGUKKyAgICB7CisgICAgICAgIHZhcElkID0gemZ3R2V0VmFwSWQoZGV2KTsKKworICAgICAgICBpZiAodmFwSWQgPT0gMHhmZmZmKQorICAgICAgICAgICAgdmFwSWQgPSAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICB2YXBJZCsrOworCisgICAgICAgIHptX2Fzc2VydChMZW5ndGggPCBaTV9NQVhfV1BBSUVfU0laRSk7CisgICAgICAgIGlmIChMZW5ndGggPCBaTV9NQVhfV1BBSUVfU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPmFwLndwYUxlblt2YXBJZF0gPSBMZW5ndGg7CisgICAgICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPmFwLndwYUllW3ZhcElkXSwgaWUsIHdkLT5hcC53cGFMZW5bdmFwSWRdKTsKKyAgICAgICAgfQorCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHdkLT5zdGEud3BhTGVuID0gTGVuZ3RoOworICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS53cGFJZSwgaWUsIHdkLT5zdGEud3BhTGVuKTsKKyAgICB9CisgICAgLy96ZmlXbGFuU2V0V3BhU3VwcG9ydChkZXYsIDEpOworICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkgLy8gQVAgTW9kZQorICAgIHsKKyAgICAgICAgd2QtPmFwLndwYVN1cHBvcnRbdmFwSWRdID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgd2QtPnN0YS53cGFTdXBwb3J0ID0gMTsKKyAgICB9CisKK30KKwordm9pZCB6ZmlXbGFuU2V0V3BhU3VwcG9ydCh6ZGV2X3QqIGRldiwgdThfdCBXcGFTdXBwb3J0KQoreworICAgIHUxNl90IHZhcElkID0gMDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApIC8vIEFQIE1vZGUKKyAgICB7CisgICAgICAgIHZhcElkID0gemZ3R2V0VmFwSWQoZGV2KTsKKworICAgICAgICBpZiAodmFwSWQgPT0gMHhmZmZmKQorICAgICAgICAgICAgdmFwSWQgPSAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICB2YXBJZCsrOworCisgICAgICAgIHdkLT5hcC53cGFTdXBwb3J0W3ZhcElkXSA9IFdwYVN1cHBvcnQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHdkLT5zdGEud3BhU3VwcG9ydCA9IFdwYVN1cHBvcnQ7CisgICAgfQorCit9CisKK3ZvaWQgemZpV2xhblNldFByb3RlY3Rpb25Nb2RlKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnN0YS5iUHJvdGVjdGlvbk1vZGUgPSBtb2RlOworICAgIGlmICh3ZC0+c3RhLmJQcm90ZWN0aW9uTW9kZSA9PSBUUlVFKQorICAgIHsKKyAgICAgICAgemZIcFNldFNsb3RUaW1lKGRldiwgMCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHpmSHBTZXRTbG90VGltZShkZXYsIDEpOworICAgIH0KKworICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIndkLT5wcm90ZWN0aW9uTW9kZT0iLCB3ZC0+c3RhLmJQcm90ZWN0aW9uTW9kZSk7Cit9CisKK3ZvaWQgemZpV2xhblNldEJhc2ljUmF0ZSh6ZGV2X3QqIGRldiwgdThfdCBiUmF0ZVNldCwgdThfdCBnUmF0ZVNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdCBuUmF0ZVNldCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+d3MuYlJhdGVCYXNpYyA9IGJSYXRlU2V0OworICAgIHdkLT53cy5nUmF0ZUJhc2ljID0gZ1JhdGVTZXQ7CisgICAgd2QtPndzLm5SYXRlQmFzaWMgPSBuUmF0ZVNldDsKK30KKwordm9pZCB6ZmlXbGFuU2V0QkdNb2RlKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPndzLmJnTW9kZSA9IG1vZGU7Cit9CisKK3ZvaWQgemZpV2xhblNldHByZWFtYmxlVHlwZSh6ZGV2X3QqIGRldiwgdThfdCB0eXBlKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT53cy5wcmVhbWJsZVR5cGUgPSB0eXBlOworfQorCit1OF90IHpmaVdsYW5RdWVyeXByZWFtYmxlVHlwZSh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICByZXR1cm4gd2QtPndzLnByZWFtYmxlVHlwZTsKK30KKwordThfdCB6ZmlXbGFuUXVlcnlQb3dlclNhdmVNb2RlKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHJldHVybiB3ZC0+c3RhLnBvd2VyU2F2ZU1vZGU7Cit9CisKK3U4X3QgemZpV2xhblNldFBta2lkSW5mbyh6ZGV2X3QqIGRldiwgdTE2X3QqIGJzc2lkLCB1OF90KiBwbWtpZCkKK3sKKyAgICB1MzJfdCAgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGZvcihpPTA7IGk8d2QtPnN0YS5wbWtpZEluZm8uYnNzaWRDb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKCB6Zk1lbW9yeUlzRXF1YWwoKHU4X3QqKSB3ZC0+c3RhLnBta2lkSW5mby5ic3NpZEluZm9baV0uYnNzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1OF90KikgYnNzaWQsIDYpICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogbWF0Y2hlZCAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIGkgPCB3ZC0+c3RhLnBta2lkSW5mby5ic3NpZENvdW50ICkKKyAgICB7CisgICAgICAgIC8qIG92ZXJ3cml0ZSB0aGUgb3JpZ2luYWwgb25lICovCisgICAgICAgIHpmTWVtb3J5Q29weSh3ZC0+c3RhLnBta2lkSW5mby5ic3NpZEluZm9baV0ucG1raWQsIHBta2lkLCAxNik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICggaSA8IFpNX1BNS0lEX01BWF9CU1NfQ05UICkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnN0YS5wbWtpZEluZm8uYnNzaWRJbmZvW2ldLmJzc2lkWzBdID0gYnNzaWRbMF07CisgICAgICAgICAgICB3ZC0+c3RhLnBta2lkSW5mby5ic3NpZEluZm9baV0uYnNzaWRbMV0gPSBic3NpZFsxXTsKKyAgICAgICAgICAgIHdkLT5zdGEucG1raWRJbmZvLmJzc2lkSW5mb1tpXS5ic3NpZFsyXSA9IGJzc2lkWzJdOworCisgICAgICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS5wbWtpZEluZm8uYnNzaWRJbmZvW2ldLnBta2lkLCBwbWtpZCwgMTYpOworICAgICAgICAgICAgd2QtPnN0YS5wbWtpZEluZm8uYnNzaWRDb3VudCsrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3UzMl90IHpmaVdsYW5RdWVyeVBta2lkSW5mbyh6ZGV2X3QqIGRldiwgdThfdCogYnVmLCB1MzJfdCBsZW4pCit7CisgICAgLy9zdHJ1Y3QgenNQbWtpZEluZm8qIHBQbWtpZEluZm8gPSAoIHN0cnVjdCB6c1Bta2lkSW5mbyogKSBidWY7CisgICAgdTMyX3QgIHNpemU7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzaXplID0gc2l6ZW9mKHUzMl90KSArCisgICAgICAgICAgIHdkLT5zdGEucG1raWRJbmZvLmJzc2lkQ291bnQgKiBzaXplb2Yoc3RydWN0IHpzUG1raWRCc3NpZEluZm8pOworCisgICAgaWYgKCBsZW4gPCBzaXplICkKKyAgICB7CisgICAgICAgIHJldHVybiB3ZC0+c3RhLnBta2lkSW5mby5ic3NpZENvdW50OworICAgIH0KKworICAgIHpmTWVtb3J5Q29weShidWYsICh1OF90KikgJndkLT5zdGEucG1raWRJbmZvLCAodTE2X3QpIHNpemUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgemZpV2xhblNldE11bHRpY2FzdExpc3QoemRldl90KiBkZXYsIHU4X3Qgc2l6ZSwgdThfdCogcExpc3QpCit7CisgICAgc3RydWN0IHpzTXVsdGljYXN0QWRkciogcE1hY0xpc3QgPSAoc3RydWN0IHpzTXVsdGljYXN0QWRkciopIHBMaXN0OworICAgIHU4X3QgICBpOworICAgIHU4X3QgICBiQWxsTXVsdGljYXN0ID0gMDsKKyAgICAvL3UzMl90ICB2YWx1ZTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT5zdGEubXVsdGljYXN0TGlzdC5zaXplID0gc2l6ZTsKKyAgICBmb3IoaT0wOyBpPHNpemU7IGkrKykKKyAgICB7CisgICAgICAgIHpmTWVtb3J5Q29weSh3ZC0+c3RhLm11bHRpY2FzdExpc3QubWFjQWRkcltpXS5hZGRyLAorICAgICAgICAgICAgICAgICAgICAgcE1hY0xpc3RbaV0uYWRkciwgNik7CisgICAgfQorCisgICAgaWYgKCB3ZC0+c3RhLm9zUnhGaWx0ZXIgJiBaTV9QQUNLRVRfVFlQRV9BTExfTVVMVElDQVNUICkKKyAgICAgICAgYkFsbE11bHRpY2FzdCA9IDE7CisgICAgemZIcFNldE11bHRpY2FzdExpc3QoZGV2LCBzaXplLCBwTGlzdCwgYkFsbE11bHRpY2FzdCk7CisKK30KKwordm9pZCB6ZmlXbGFuUmVtb3ZlS2V5KHpkZXZfdCogZGV2LCB1OF90IGtleVR5cGUsIHU4X3Qga2V5SWQpCit7CisgICAgdTE2X3QgIGZha2VNYWNBZGRyWzNdID0gezAsIDAsIDB9OworICAgIHUzMl90ICBmYWtlS2V5WzRdID0gezAsIDAsIDAsIDB9OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCBrZXlUeXBlID09IDAgKQorICAgIHsKKyAgICAgICAgLyogcmVtb3ZlIFdFUCBrZXkgKi8KKyAgICAgICAgem1fZGVidWdfbXNnMCgicmVtb3ZlIFdFUCBrZXkiKTsKKyAgICAgICAgemZDb3JlU2V0S2V5KGRldiwgWk1fVVNFUl9LRVlfREVGQVVMVCtrZXlJZCwgMCwKKyAgICAgICAgICAgICAgICAgWk1fTk9fV0VQLCBmYWtlTWFjQWRkciwgZmFrZUtleSk7CisgICAgICAgIHdkLT5zdGEuZW5jcnlNb2RlID0gWk1fTk9fV0VQOworICAgIH0KKyAgICBlbHNlIGlmICgga2V5VHlwZSA9PSAxICkKKyAgICB7CisgICAgICAgIC8qIHJlbW92ZSBwYWlyd2lzZSBrZXkgKi8KKyAgICAgICAgem1fZGVidWdfbXNnMCgicmVtb3ZlIHBhaXJ3aXNlIGtleSIpOworICAgICAgICB6ZkhwUmVtb3ZlS2V5KGRldiwgWk1fVVNFUl9LRVlfUEspOworICAgICAgICB3ZC0+c3RhLmVuY3J5TW9kZSA9IFpNX05PX1dFUDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogcmVtb3ZlIGdyb3VwIGtleSAqLworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJyZW1vdmUgZ3JvdXAga2V5Iik7CisgICAgICAgIHpmSHBSZW1vdmVLZXkoZGV2LCBaTV9VU0VSX0tFWV9HSyk7CisgICAgfQorfQorCisKK3ZvaWQgemZpV2xhblF1ZXJ5UmVndWxhdGlvblRhYmxlKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNSZWd1bGF0aW9uVGFibGUqIHBFbnRyeSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6Zk1lbW9yeUNvcHkoKHU4X3QqKSBwRW50cnksICh1OF90KikgJndkLT5yZWd1bGF0aW9uVGFibGUsCisgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgenNSZWd1bGF0aW9uVGFibGUpKTsKK30KKworLyogcGFyYW1ldGVyICJ0aW1lIiBpcyBzcGVjaWZpZWQgaW4gbXMgKi8KK3ZvaWQgemZpV2xhblNldFNjYW5UaW1lclBlckNoYW5uZWwoemRldl90KiBkZXYsIHUxNl90IHRpbWUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem1fZGVidWdfbXNnMSgic2NhbiB0aW1lIChtcykgPSAiLCB0aW1lKTsKKworICAgIHdkLT5zdGEuYWN0aXZlc2NhblRpY2tQZXJDaGFubmVsID0gdGltZSAvIFpNX01TX1BFUl9USUNLOworfQorCit2b2lkIHpmaVdsYW5TZXRBdXRvUmVjb25uZWN0KHpkZXZfdCogZGV2LCB1OF90IGVuYWJsZSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+c3RhLmJBdXRvUmVjb25uZWN0ID0gZW5hYmxlOworICAgIC8vd2QtPnN0YS5iQXV0b1JlY29ubmVjdEVuYWJsZWQgPSBlbmFibGU7Cit9CisKK3ZvaWQgemZpV2xhblNldFN0YVdtZSh6ZGV2X3QqIGRldiwgdThfdCBlbmFibGUsIHU4X3QgdWFwc2RJbmZvKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT53cy5zdGFXbWVFbmFibGVkID0gZW5hYmxlICYgMHgzOworICAgIGlmICgoZW5hYmxlICYgMHgyKSAhPSAwKQorICAgIHsKKyAgICAgICAgd2QtPndzLnN0YVdtZVFvc0luZm8gPSB1YXBzZEluZm8gJiAweDZmOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3ZC0+d3Muc3RhV21lUW9zSW5mbyA9IDA7CisgICAgfQorfQorCit2b2lkIHpmaVdsYW5TZXRBcFdtZSh6ZGV2X3QqIGRldiwgdThfdCBlbmFibGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPndzLmFwV21lRW5hYmxlZCA9IGVuYWJsZTsKK30KKwordThfdCB6ZmlXbGFuUXVlcnl3bWVFbmFibGUoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT53cy5zdGFXbWVFbmFibGVkOworfQorCit2b2lkIHpmaVdsYW5TZXRQcm9iaW5nSGlkZGVuU3NpZCh6ZGV2X3QqIGRldiwgdThfdCogc3NpZCwgdThfdCBzc2lkTGVuLAorICAgIHUxNl90IGVudHJ5KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisKKyAgICBpZiAoKHNzaWRMZW4gPD0gMzIpICYmIChlbnRyeSA8IFpNX01BWF9QUk9CRV9ISURERU5fU1NJRF9TSVpFKSkKKyAgICB7CisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHdkLT53cy5wcm9iaW5nU3NpZExpc3RbZW50cnldLnNzaWRMZW4gPSBzc2lkTGVuOworICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPndzLnByb2JpbmdTc2lkTGlzdFtlbnRyeV0uc3NpZCwgc3NpZCwgc3NpZExlbik7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCit2b2lkIHpmaVdsYW5TZXREaXNhYmxlUHJvYmluZ1dpdGhTc2lkKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnN0YS5kaXNhYmxlUHJvYmluZ1dpdGhTc2lkID0gbW9kZTsKKworICAgIHJldHVybjsKK30KKwordm9pZCB6ZmlXbGFuU2V0RHJvcFVuZW5jcnlwdGVkUGFja2V0cyh6ZGV2X3QqIGRldiwgdThfdCBlbmFibGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPndzLmRyb3BVbmVuY3J5cHRlZFBrdHMgPSBlbmFibGU7Cit9CisKK3ZvaWQgemZpV2xhblNldFN0YVJ4U2VjdXJpdHlDaGVja0NiKHpkZXZfdCogZGV2LCB6ZnBTdGFSeFNlY3VyaXR5Q2hlY2tDYiBwU3RhUnhTZWN1cml0eUNoZWNrQ2IpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnN0YS5wU3RhUnhTZWN1cml0eUNoZWNrQ2IgPSBwU3RhUnhTZWN1cml0eUNoZWNrQ2I7Cit9CisKK3ZvaWQgemZpV2xhblNldElCU1NKb2luT25seSh6ZGV2X3QqIGRldiwgdThfdCBqb2luT25seSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+d3MuaWJzc0pvaW5Pbmx5ID0gam9pbk9ubHk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZmlDb25maWdXZHNQb3J0ICAgICAgICAgICAgKi8KKy8qICAgICAgQ29uZmlndXJlIFdEUyBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHdkc1BvcnRJZCA6IFdEUyBwb3J0IElELCBzdGFydCBmcm9tIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBmbGFnIDogMD0+ZGlzYWJsZSBXRFMgcG9ydCwgMT0+ZW5hYmxlIFdEUyBwb3J0ICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgd2RzQWRkciA6IFdEUyBuZWlnaGJvciBNQUMgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGVuY1R5cGUgOiBlbmNyeXB0aW9uIHR5cGUgZm9yIFdEUyBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB3ZHNLZXkgOiBlbmNyeXB0aW9uIGtleSBmb3IgV0RTIHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBFcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNi42ICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZpQ29uZmlnV2RzUG9ydCh6ZGV2X3QqIGRldiwgdThfdCB3ZHNQb3J0SWQsIHUxNl90IGZsYWcsIHUxNl90KiB3ZHNBZGRyLAorICAgICAgICB1MTZfdCBlbmNUeXBlLCB1MzJfdCogd2RzS2V5KQoreworICAgIHUxNl90IGFkZHJbM107CisgICAgdTMyX3Qga2V5WzRdOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKHdkc1BvcnRJZCA+IFpNX01BWF9XRFNfU1VQUE9SVCkKKyAgICB7CisgICAgICAgIHJldHVybiBaTV9FUlJfV0RTX1BPUlRfSUQ7CisgICAgfQorCisgICAgaWYgKGZsYWcgPT0gMSkKKyAgICB7CisgICAgICAgIC8qIEVuYWJsZSBXRFMgcG9ydCAqLworICAgICAgICB3ZC0+YXAud2RzLm1hY0FkZHJbd2RzUG9ydElkXVswXSA9IHdkc0FkZHJbMF07CisgICAgICAgIHdkLT5hcC53ZHMubWFjQWRkclt3ZHNQb3J0SWRdWzFdID0gd2RzQWRkclsxXTsKKyAgICAgICAgd2QtPmFwLndkcy5tYWNBZGRyW3dkc1BvcnRJZF1bMl0gPSB3ZHNBZGRyWzJdOworCisgICAgICAgIHdkLT5hcC53ZHMud2RzQml0bWFwIHw9ICgxIDw8IHdkc1BvcnRJZCk7CisgICAgICAgIHdkLT5hcC53ZHMuZW5jcnlNb2RlW3dkc1BvcnRJZF0gPSAodThfdCkgZW5jVHlwZTsKKworICAgICAgICB6ZkNvcmVTZXRLZXkoZGV2LCAxMCtaTV9NQVhfV0RTX1NVUFBPUlQsIDAsICh1OF90KSBlbmNUeXBlLCB3ZHNBZGRyLCB3ZHNLZXkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBEaXNhYmxlIFdEUyBwb3J0ICovCisgICAgICAgIGFkZHJbMF0gPSBhZGRyWzFdID0gYWRkclsyXSA9IDA7CisgICAgICAgIGtleVswXSA9IGtleVsxXSA9IGtleVsyXSA9IGtleVszXSA9IDA7CisgICAgICAgIHdkLT5hcC53ZHMud2RzQml0bWFwICY9ICh+KDEgPDwgd2RzUG9ydElkKSk7CisgICAgICAgIHpmQ29yZVNldEtleShkZXYsIDEwK1pNX01BWF9XRFNfU1VQUE9SVCwgMCwgWk1fTk9fV0VQLCBhZGRyLCBrZXkpOworICAgIH0KKworICAgIHJldHVybiBaTV9TVUNDRVNTOworfQorI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisvKiBDRU5DICovCit2b2lkIHpmaVdsYW5RdWVyeUdTTih6ZGV2X3QqIGRldiwgdThfdCAqZ3NuLCB1MTZfdCB2YXBJZCkKK3sKKyAgICAvL3N0cnVjdCB6c1dsYW5EZXYqIHdkID0gKHN0cnVjdCB6c1dsYW5EZXYqKSB6bXdfd2xhbl9kZXYoZGV2KTsKKyAgICB1MzJfdCB0eGl2WzRdOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIGNvbnZlcnQgbGl0dGxlIGVuZGlhbiB0byBiaWcgZW5kaWFuIGZvciAzMiBiaXRzICovCisgICAgdHhpdlszXSA9IHdkLT5hcC50eGl2W3ZhcElkXVswXTsKKyAgICB0eGl2WzJdID0gd2QtPmFwLnR4aXZbdmFwSWRdWzFdOworICAgIHR4aXZbMV0gPSB3ZC0+YXAudHhpdlt2YXBJZF1bMl07CisgICAgdHhpdlswXSA9IHdkLT5hcC50eGl2W3ZhcElkXVszXTsKKworICAgIHpmTWVtb3J5Q29weShnc24sICh1OF90Kil0eGl2LCAxNik7Cit9CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworLy9DV1lhbmcoKykKK3ZvaWQgemZpV2xhblF1ZXJ5U2lnbmFsSW5mbyh6ZGV2X3QqIGRldiwgdThfdCAqYnVmZmVyKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qQ2hhbmdlIFNpZ25hbCBTdHJlbmd0aC9RdWFsaXR5IFZhbHVlIHRvIEh1bWFuIFNlbnNlIEhlcmUqLworCisgICAgYnVmZmVyWzBdID0gd2QtPlNpZ25hbFN0cmVuZ3RoOworICAgIGJ1ZmZlclsxXSA9IHdkLT5TaWduYWxRdWFsaXR5OworfQorCisvKiBPUy1YUCAqLwordTE2X3QgemZpU3RhQWRkSWVXcGFSc24oemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHU4X3QgZnJhbWVUeXBlKQoreworICAgIHJldHVybiAgemZTdGFBZGRJZVdwYVJzbihkZXYsIGJ1Ziwgb2Zmc2V0LCBmcmFtZVR5cGUpOworfQorCisvKiB6ZmlEZWJ1Z0NtZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgY21kICAgICAgIHZhbHVlLWRlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAwICAgICAgIHNjaGVkdWxlIHRpbWVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAxICAgICAgIGNhbmNlbCB0aW1lciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgIDIgICAgICAgY2xlYXIgdGltZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgIDMgICAgICAgdGVzdCB0aW1lciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgNiAgICAgICBjaGVja3N1bSB0ZXN0ICAgICAwLzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgNyAgICAgICBlbmFibGVQcm90ZWN0aW9uTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgIDggICAgICAgcnggcGFja2V0IGNvbnRlbnQgZHVtcCAgICAwLzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwordTMyX3QgemZpRGVidWdDbWQoemRldl90KiBkZXYsIHUzMl90IGNtZCwgdTMyX3QgdmFsdWUpCit7CisgICAgdTE2X3QgZXZlbnQ7CisgICAgdTMyX3QgdGljazsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKCBjbWQgPT0gMCApCisgICAgeyAgIC8qIHNjaGVkdWxlIHRpbWVyICovCisgICAgICAgIGV2ZW50ID0gKHUxNl90KSAoKHZhbHVlID4+IDE2KSAmIDB4ZmZmZik7CisgICAgICAgIHRpY2sgPSB2YWx1ZSAmIDB4ZmZmZjsKKyAgICAgICAgemZUaW1lclNjaGVkdWxlKGRldiwgZXZlbnQsIHRpY2spOworICAgIH0KKyAgICBlbHNlIGlmICggY21kID09IDEgKQorICAgIHsgICAvKiBjYW5jZWwgdGltZXIgKi8KKyAgICAgICAgZXZlbnQgPSAodTE2X3QpICh2YWx1ZSAmIDB4ZmZmZik7CisgICAgICAgIHpmVGltZXJDYW5jZWwoZGV2LCBldmVudCk7CisgICAgfQorICAgIGVsc2UgaWYgKCBjbWQgPT0gMiApCisgICAgeyAgIC8qIGNsZWFyIHRpbWVyICovCisgICAgICAgIHpmVGltZXJDbGVhcihkZXYpOworICAgIH0KKyAgICBlbHNlIGlmICggY21kID09IDMgKQorICAgIHsgICAvKiB0ZXN0IHRpbWVyICovCisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIDEsICA1MDApOworICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCAyLCAxMDAwKTsKKyAgICAgICAgemZUaW1lclNjaGVkdWxlKGRldiwgMywgMTAwMCk7CisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIDQsIDEwMDApOworICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCA1LCAxNTAwKTsKKyAgICAgICAgemZUaW1lclNjaGVkdWxlKGRldiwgNiwgMjAwMCk7CisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIDcsIDIyMDApOworICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCA2LCAyNTAwKTsKKyAgICAgICAgemZUaW1lclNjaGVkdWxlKGRldiwgOCwgMjgwMCk7CisgICAgfQorICAgIGVsc2UgaWYgKCBjbWQgPT0gNCkKKyAgICB7CisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIDEsICA1MDApOworICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCAyLCAxMDAwKTsKKyAgICAgICAgemZUaW1lclNjaGVkdWxlKGRldiwgMywgMTAwMCk7CisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIDQsIDEwMDApOworICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCA1LCAxNTAwKTsKKyAgICAgICAgemZUaW1lclNjaGVkdWxlKGRldiwgNiwgMjAwMCk7CisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIDcsIDIyMDApOworICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCA2LCAyNTAwKTsKKyAgICAgICAgemZUaW1lclNjaGVkdWxlKGRldiwgOCwgMjgwMCk7CisgICAgICAgIHpmVGltZXJDYW5jZWwoZGV2LCAxKTsKKyAgICAgICAgemZUaW1lckNhbmNlbChkZXYsIDMpOworICAgICAgICB6ZlRpbWVyQ2FuY2VsKGRldiwgNik7CisgICAgfQorICAgIGVsc2UgaWYgKCBjbWQgPT0gNSApCisgICAgeworICAgICAgICB3ZC0+c3RhLmtleUlkID0gKHU4X3QpIHZhbHVlOworICAgIH0KKwllbHNlIGlmICggY21kID09IDYgKQorCXsKKwkgICAgLyogMDogbm9ybWFsICAgIDE6IGFsd2F5cyBzZXQgVENQL1VEUCBjaGVja3N1bSB6ZXJvICovCisgICAgICAgIHdkLT5jaGVja3N1bVRlc3QgPSB2YWx1ZTsKKwl9CisJZWxzZSBpZiAoIGNtZCA9PSA3ICkKKwl7CisgICAgICAgIHdkLT5lbmFibGVQcm90ZWN0aW9uTW9kZSA9IHZhbHVlOworICAgCSAgICB6bV9tc2cxX21tKFpNX0xWXzEsICJ3ZC0+ZW5hYmxlUHJvdGVjdGlvbk1vZGU9Iiwgd2QtPmVuYWJsZVByb3RlY3Rpb25Nb2RlKTsKKwl9CisJZWxzZSBpZiAoIGNtZCA9PSA4ICkKKwl7CisgICAgICAgIC8qIHJ4IHBhY2tldCBjb250ZW50IGR1bXAgKi8KKyAgICAgICAgaWYgKHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+cnhQYWNrZXREdW1wID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5yeFBhY2tldER1bXAgPSAwOworICAgICAgICB9CisJfQorCisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQwordThfdCB6ZmlXbGFuU2V0Q2VuY1BhaXJ3aXNlS2V5KHpkZXZfdCogZGV2LCB1OF90IGtleWlkLCB1MzJfdCAqdHhpdiwgdTMyX3QgKnJ4aXYsCisgICAgICAgIHU4X3QgKmtleSwgdThfdCAqbWljKQoreworICAgIHN0cnVjdCB6c0tleUluZm8ga2V5SW5mbzsKKyAgICB1OF90IGNlbmNLZXlbMzJdOworICAgIHU4X3QgaTsKKyAgICB1MTZfdCBtYWNBZGRyWzNdOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIGNlbmNLZXlbaV0gPSBrZXlbaV07CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIGNlbmNLZXlbaSArIDE2XSA9IG1pY1tpXTsKKyAgICBrZXlJbmZvLmtleSA9IGNlbmNLZXk7CisgICAga2V5SW5mby5rZXlMZW5ndGggPSAzMjsKKyAgICBrZXlJbmZvLmtleUluZGV4ID0ga2V5aWQ7CisgICAga2V5SW5mby5mbGFnID0gWk1fS0VZX0ZMQUdfQ0VOQyB8IFpNX0tFWV9GTEFHX1BLOworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgIG1hY0FkZHJbaV0gPSB3ZC0+c3RhLmJzc2lkW2ldOworICAgIGtleUluZm8ubWFjQWRkciA9IG1hY0FkZHI7CisKKyAgICB6ZmlXbGFuU2V0S2V5KGRldiwga2V5SW5mbyk7CisKKyAgICAvKiBSZXNldCB0eGl2IGFuZCByeGl2ICovCisgICAgLy93ZC0+c3RhLnR4aXZbMF0gPSB0eGl2WzBdOworICAgIC8vd2QtPnN0YS50eGl2WzFdID0gdHhpdlsxXTsKKyAgICAvL3dkLT5zdGEudHhpdlsyXSA9IHR4aXZbMl07CisgICAgLy93ZC0+c3RhLnR4aXZbM10gPSB0eGl2WzNdOworICAgIC8vCisgICAgLy93ZC0+c3RhLnJ4aXZbMF0gPSByeGl2WzBdOworICAgIC8vd2QtPnN0YS5yeGl2WzFdID0gcnhpdlsxXTsKKyAgICAvL3dkLT5zdGEucnhpdlsyXSA9IHJ4aXZbMl07CisgICAgLy93ZC0+c3RhLnJ4aXZbM10gPSByeGl2WzNdOworCisgICAgcmV0dXJuIDA7Cit9CisKK3U4X3QgemZpV2xhblNldENlbmNHcm91cEtleSh6ZGV2X3QqIGRldiwgdThfdCBrZXlpZCwgdTMyX3QgKnJ4aXYsCisgICAgICAgIHU4X3QgKmtleSwgdThfdCAqbWljKQoreworICAgIHN0cnVjdCB6c0tleUluZm8ga2V5SW5mbzsKKyAgICB1OF90IGNlbmNLZXlbMzJdOworICAgIHU4X3QgaTsKKyAgICB1MTZfdCBtYWNBZGRyWzZdID0gezB4ZmZmZiwgMHhmZmZmLCAweGZmZmZ9OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIGNlbmNLZXlbaV0gPSBrZXlbaV07CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIGNlbmNLZXlbaSArIDE2XSA9IG1pY1tpXTsKKyAgICBrZXlJbmZvLmtleSA9IGNlbmNLZXk7CisgICAga2V5SW5mby5rZXlMZW5ndGggPSAzMjsKKyAgICBrZXlJbmZvLmtleUluZGV4ID0ga2V5aWQ7CisgICAga2V5SW5mby5mbGFnID0gWk1fS0VZX0ZMQUdfQ0VOQyB8IFpNX0tFWV9GTEFHX0dLOworICAgIGtleUluZm8udmFwSWQgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgIGtleUluZm8udmFwQWRkcltpXSA9IHdkLT5tYWNBZGRyW2ldOworICAgIGtleUluZm8ubWFjQWRkciA9IG1hY0FkZHI7CisKKyAgICB6ZmlXbGFuU2V0S2V5KGRldiwga2V5SW5mbyk7CisKKyAgICAvKiBSZXNldCB0eGl2IGFuZCByeGl2ICovCisgICAgd2QtPnN0YS5yeGl2R0tbMF0gPSAoKHJ4aXZbM10gPj4gMjQpICYgMHhGRikKKyAgICAgICAgICAgICAgICAgICAgICArICgoKHJ4aXZbM10gPj4gMTYpICYgMHhGRikgPDwgOCkKKyAgICAgICAgICAgICAgICAgICAgICArICgoKHJ4aXZbM10gPj4gOCkgJiAweEZGKSA8PCAxNikKKyAgICAgICAgICAgICAgICAgICAgICArICgocnhpdlszXSAmIDB4RkYpIDw8IDI0KTsKKyAgICB3ZC0+c3RhLnJ4aXZHS1sxXSA9ICgocnhpdlsyXSA+PiAyNCkgJiAweEZGKQorICAgICAgICAgICAgICAgICAgICAgICsgKCgocnhpdlsyXSA+PiAxNikgJiAweEZGKSA8PCA4KQorICAgICAgICAgICAgICAgICAgICAgICsgKCgocnhpdlsyXSA+PiA4KSAmIDB4RkYpIDw8IDE2KQorICAgICAgICAgICAgICAgICAgICAgICsgKChyeGl2WzJdICYgMHhGRikgPDwgMjQpOworICAgIHdkLT5zdGEucnhpdkdLWzJdID0gKChyeGl2WzFdID4+IDI0KSAmIDB4RkYpCisgICAgICAgICAgICAgICAgICAgICAgKyAoKChyeGl2WzFdID4+IDE2KSAmIDB4RkYpIDw8IDgpCisgICAgICAgICAgICAgICAgICAgICAgKyAoKChyeGl2WzFdID4+IDgpICYgMHhGRikgPDwgMTYpCisgICAgICAgICAgICAgICAgICAgICAgKyAoKHJ4aXZbMV0gJiAweEZGKSA8PCAyNCk7CisgICAgd2QtPnN0YS5yeGl2R0tbM10gPSAoKHJ4aXZbMF0gPj4gMjQpICYgMHhGRikKKyAgICAgICAgICAgICAgICAgICAgICArICgoKHJ4aXZbMF0gPj4gMTYpICYgMHhGRikgPDwgOCkKKyAgICAgICAgICAgICAgICAgICAgICArICgoKHJ4aXZbMF0gPj4gOCkgJiAweEZGKSA8PCAxNikKKyAgICAgICAgICAgICAgICAgICAgICArICgocnhpdlswXSAmIDB4RkYpIDw8IDI0KTsKKworICAgIHdkLT5zdGEuYXV0aE1vZGUgPSBaTV9BVVRIX01PREVfQ0VOQzsKKyAgICB3ZC0+c3RhLmN1cnJlbnRBdXRoTW9kZSA9IFpNX0FVVEhfTU9ERV9DRU5DOworCisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworCit1OF90IHpmaVdsYW5TZXREb3QxMURNb2RlKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpCit7CisgICAgdThfdCBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnN0YS5iODAyXzExRCA9IG1vZGU7CisgICAgaWYgKG1vZGUpIC8vRW5hYmxlIDgwMi4xMWQKKyAgICB7CisgICAgICAgIHdkLT5yZWd1bGF0aW9uVGFibGUucmVnaW9uQ29kZSA9IE5PX0VOVU1SRDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpKyspCisgICAgICAgICAgICB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsRmxhZ3MgfD0gWk1fUkVHX0ZMQUdfQ0hBTk5FTF9QQVNTSVZFOworICAgIH0KKyAgICBlbHNlIC8vRGlzYWJsZQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpKyspCisgICAgICAgICAgICB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsRmxhZ3MgJj0gflpNX1JFR19GTEFHX0NIQU5ORUxfUEFTU0lWRTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwordThfdCB6ZmlXbGFuU2V0RG90MTFIREZTTW9kZSh6ZGV2X3QqIGRldiwgdThfdCBtb2RlKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vem1fZGVidWdfbXNnMCgiQ1dZIC0gRW5hYmxlIDgwMi4xMWggREZTIik7CisKKyAgICAvLyBUT0RPIDogREZTIEVuYWJsZSBpbiA1MjUwIHRvIDUzNTAgTUh6IGFuZCA1NDcwIHRvIDU3MjUgTUh6IC4KKyAgICAvL2lmICggQWRhcHRlci0+WkQ4MDIxMUhTdXBwb3J0ICYmCisgICAgLy8gICBBZGFwdGVyLT5DYXJkU2V0dGluZy5OZXR3b3JrVHlwZUluVXNlID09IE5kaXM4MDJfMTFPRkRNNSAmJgorICAgIC8vICAgKChDaGFubmVsTm8gPj01MiAmJiBDaGFubmVsTm8gPD0gNjQpCXx8CQkJCS8vNTI1MH41MzUwIE1IWgorICAgIC8vICAgIChDaGFubmVsTm8gPj0xMDAgJiYgQ2hhbm5lbE5vIDw9IDE0MCkpKSAJCQkvLzU0NzB+NTcyNSBNSFoKKyAgICAvL3sKKyAgICAvLyAgIEFkYXB0ZXItPlpEODAyMTFIU2V0dGluZy5ERlNFbmFibGU9VFJVRTsKKyAgICAvL30KKyAgICAvL2Vsc2UKKyAgICAvL3sKKyAgICAvLyAgIEFkYXB0ZXItPlpEODAyMTFIU2V0dGluZy5ERlNFbmFibGU9RkFMU0U7CisgICAgLy99CisKKyAgICB3ZC0+c3RhLkRGU0VuYWJsZSA9IG1vZGU7CisgICAgaWYgKG1vZGUpCisgICAgICAgIHdkLT5zdGEuY2FwYWJpbGl0eVsxXSB8PSBaTV9CSVRfMDsKKyAgICBlbHNlCisgICAgICAgIHdkLT5zdGEuY2FwYWJpbGl0eVsxXSAmPSAoflpNX0JJVF8wKTsKKworICAgIHJldHVybiAwOworfQorCit1OF90IHpmaVdsYW5TZXREb3QxMUhUUENNb2RlKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy8gVE9ETyA6IFRQQyBFbmFibGUgaW4gNTE1MH41MzUwIE1IeiBhbmQgNTQ3MH41NzI1TUh6LgorICAgIC8vaWYgKCBBZGFwdGVyLT5aRDgwMjExSFN1cHBvcnQgJiYKKyAgICAvLyAgIEFkYXB0ZXItPkNhcmRTZXR0aW5nLk5ldHdvcmtUeXBlSW5Vc2UgPT0gTmRpczgwMl8xMU9GRE01ICYmCisgICAgLy8gICAoKENoYW5uZWxObyA9PSAzNiB8fCBDaGFubmVsTm8gPT0gNDAgfHwgQ2hhbm5lbE5vID09IDQ0IHx8IENoYW5uZWxObyA9PSA0OCkgfHwJLy81MTUwfjUyNTAgTUhaICwgTm90IEphcGFuCisgICAgLy8gICAgKENoYW5uZWxObyA+PTUyICYmIENoYW5uZWxObyA8PSA2NCkgfHwJCQkJLy81MjUwfjUzNTAgTUhaCisgICAgLy8gICAgKENoYW5uZWxObyA+PTEwMCAmJiBDaGFubmVsTm8gPD0gMTQwKSkpIAkJCS8vNTQ3MH41NzI1IE1IWgorICAgIC8veworICAgIC8vICAgQWRhcHRlci0+WkQ4MDIxMUhTZXR0aW5nLlRQQ0VuYWJsZT1UUlVFOworICAgIC8vfQorICAgIC8vZWxzZQorICAgIC8veworICAgIC8vICAgQWRhcHRlci0+WkQ4MDIxMUhTZXR0aW5nLlRQQ0VuYWJsZT1GQUxTRTsKKyAgICAvL30KKworICAgIHdkLT5zdGEuVFBDRW5hYmxlID0gbW9kZTsKKyAgICBpZiAobW9kZSkKKyAgICAgICAgd2QtPnN0YS5jYXBhYmlsaXR5WzFdIHw9IFpNX0JJVF8wOworICAgIGVsc2UKKyAgICAgICAgd2QtPnN0YS5jYXBhYmlsaXR5WzFdICY9ICh+Wk1fQklUXzApOworCisgICAgcmV0dXJuIDA7Cit9CisKK3U4X3QgemZpV2xhblNldEFuaU1vZGUoemRldl90KiBkZXYsIHU4X3QgbW9kZSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+YW5pRW5hYmxlID0gbW9kZTsKKyAgICBpZiAobW9kZSkKKyAgICAgICAgemZIcEFuaUF0dGFjaChkZXYpOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBaTV9PU19MSU5VWF9GVU5DCit2b2lkIHpmaVdsYW5TaG93VGFsbHkoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem1fbXNnMV9tbShaTV9MVl8wLCAiSHdfVW5kZXJydW5DbnQgICAgPSAiLCB3ZC0+Y29tbVRhbGx5Lkh3X1VuZGVycnVuQ250KTsKKyAgICB6bV9tc2cxX21tKFpNX0xWXzAsICJId19Ub3RhbFJ4RnJtICAgICA9ICIsIHdkLT5jb21tVGFsbHkuSHdfVG90YWxSeEZybSk7CisgICAgem1fbXNnMV9tbShaTV9MVl8wLCAiSHdfQ1JDMzJDbnQgICAgICAgPSAiLCB3ZC0+Y29tbVRhbGx5Lkh3X0NSQzMyQ250KTsKKyAgICB6bV9tc2cxX21tKFpNX0xWXzAsICJId19DUkMxNkNudCAgICAgICA9ICIsIHdkLT5jb21tVGFsbHkuSHdfQ1JDMTZDbnQpOworICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X0RlY3J5cEVycl9VTkkgID0gIiwgd2QtPmNvbW1UYWxseS5Id19EZWNyeXBFcnJfVU5JKTsKKyAgICB6bV9tc2cxX21tKFpNX0xWXzAsICJId19SeEZJRk9PdmVycnVuICA9ICIsIHdkLT5jb21tVGFsbHkuSHdfUnhGSUZPT3ZlcnJ1bik7CisgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfRGVjcnlwRXJyX011bCAgPSAiLCB3ZC0+Y29tbVRhbGx5Lkh3X0RlY3J5cEVycl9NdWwpOworICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X1JldHJ5Q250ICAgICAgID0gIiwgd2QtPmNvbW1UYWxseS5Id19SZXRyeUNudCk7CisgICAgem1fbXNnMV9tbShaTV9MVl8wLCAiSHdfVG90YWxUeEZybSAgICAgPSAiLCB3ZC0+Y29tbVRhbGx5Lkh3X1RvdGFsVHhGcm0pOworICAgIHptX21zZzFfbW0oWk1fTFZfMCwgIkh3X1J4VGltZU91dCAgICAgID0gIiwgd2QtPmNvbW1UYWxseS5Id19SeFRpbWVPdXQpOworICAgIHptX21zZzFfbW0oWk1fTFZfMCwgIlR4X01QRFUgICAgICAgICAgID0gIiwgd2QtPmNvbW1UYWxseS5UeF9NUERVKTsKKyAgICB6bV9tc2cxX21tKFpNX0xWXzAsICJCQV9GYWlsICAgICAgICAgICA9ICIsIHdkLT5jb21tVGFsbHkuQkFfRmFpbCk7CisgICAgem1fbXNnMV9tbShaTV9MVl8wLCAiSHdfVHhfQU1QRFUgICAgICAgPSAiLCB3ZC0+Y29tbVRhbGx5Lkh3X1R4X0FNUERVKTsKKyAgICB6bV9tc2cxX21tKFpNX0xWXzAsICJId19UeF9NUERVICAgICAgICA9ICIsIHdkLT5jb21tVGFsbHkuSHdfVHhfTVBEVSk7CisKKyAgICB6bV9tc2cxX21tKFpNX0xWXzEsICJId19SeE1QRFUgICAgICAgICAgPSAiLCB3ZC0+Y29tbVRhbGx5Lkh3X1J4TVBEVSk7CisgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhEcm9wTVBEVSAgICAgID0gIiwgd2QtPmNvbW1UYWxseS5Id19SeERyb3BNUERVKTsKKyAgICB6bV9tc2cxX21tKFpNX0xWXzEsICJId19SeERlbE1QRFUgICAgICAgPSAiLCB3ZC0+Y29tbVRhbGx5Lkh3X1J4RGVsTVBEVSk7CisgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhQaHlNaXNjRXJyb3IgID0gIiwgd2QtPmNvbW1UYWxseS5Id19SeFBoeU1pc2NFcnJvcik7CisgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhQaHlYUkVycm9yICAgID0gIiwgd2QtPmNvbW1UYWxseS5Id19SeFBoeVhSRXJyb3IpOworICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X1J4UGh5T0ZETUVycm9yICA9ICIsIHdkLT5jb21tVGFsbHkuSHdfUnhQaHlPRkRNRXJyb3IpOworICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X1J4UGh5Q0NLRXJyb3IgICA9ICIsIHdkLT5jb21tVGFsbHkuSHdfUnhQaHlDQ0tFcnJvcik7CisgICAgem1fbXNnMV9tbShaTV9MVl8xLCAiSHdfUnhQaHlIVEVycm9yICAgID0gIiwgd2QtPmNvbW1UYWxseS5Id19SeFBoeUhURXJyb3IpOworICAgIHptX21zZzFfbW0oWk1fTFZfMSwgIkh3X1J4UGh5VG90YWxDb3VudCA9ICIsIHdkLT5jb21tVGFsbHkuSHdfUnhQaHlUb3RhbENvdW50KTsKKworICAgIGlmICghKCh3ZC0+Y29tbVRhbGx5LlR4X01QRFUgPT0gMCkgJiYgKHdkLT5jb21tVGFsbHkuQkFfRmFpbCA9PSAwKSkpCisgICAgeworICAgICAgICB6bV9kZWJ1Z19tc2dfcCgiQkEgRmFpbCBSYXRpbyglKSAgPSAiLCB3ZC0+Y29tbVRhbGx5LkJBX0ZhaWwgKiAxMDAsCisgICAgICAgICAgICAgICAgKHdkLT5jb21tVGFsbHkuQkFfRmFpbCArIHdkLT5jb21tVGFsbHkuVHhfTVBEVSkpOworICAgIH0KKworICAgIGlmICghKCh3ZC0+Y29tbVRhbGx5Lkh3X1R4X01QRFUgPT0gMCkgJiYgKHdkLT5jb21tVGFsbHkuSHdfVHhfQU1QRFUgPT0gMCkpKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnX3AoIkF2ZyBBZ2cgTnVtYmVyICAgID0gIiwKKyAgICAgICAgICAgICAgICB3ZC0+Y29tbVRhbGx5Lkh3X1R4X01QRFUsIHdkLT5jb21tVGFsbHkuSHdfVHhfQU1QRFUpOworICAgIH0KK30KKyNlbmRpZgorCit2b2lkIHpmaVdsYW5TZXRNYXhUeFBvd2VyKHpkZXZfdCogZGV2LCB1OF90IHBvd2VyMiwgdThfdCBwb3dlcjUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgd2QtPm1heFR4UG93ZXIyID0gcG93ZXIyOworICAgIHdkLT5tYXhUeFBvd2VyNSA9IHBvd2VyNTsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCit2b2lkIHpmaVdsYW5RdWVyeU1heFR4UG93ZXIoemRldl90KiBkZXYsIHU4X3QgKnBvd2VyMiwgdThfdCAqcG93ZXI1KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgICpwb3dlcjIgPSB3ZC0+bWF4VHhQb3dlcjI7CisgICAgKnBvd2VyNSA9IHdkLT5tYXhUeFBvd2VyNTsKK30KKwordm9pZCB6ZmlXbGFuU2V0Q29ubmVjdE1vZGUoemRldl90KiBkZXYsIHU4X3QgbW9kZSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB3ZC0+Y29ubmVjdE1vZGUgPSBtb2RlOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7Cit9CisKK3ZvaWQgemZpV2xhblNldFN1cHBvcnRNb2RlKHpkZXZfdCogZGV2LCB1MzJfdCBtb2RlKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHdkLT5zdXBwb3J0TW9kZSA9IG1vZGU7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKK30KKwordm9pZCB6ZmlXbGFuU2V0QWRob2NNb2RlKHpkZXZfdCogZGV2LCB1MzJfdCBtb2RlKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT53cy5hZGhvY01vZGUgPSBtb2RlOworfQorCit1MzJfdCB6ZmlXbGFuUXVlcnlBZGhvY01vZGUoemRldl90KiBkZXYsIHU4X3QgYldyYXBwZXIpCit7CisgICAgdTMyX3QgYWRob2NNb2RlOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCBiV3JhcHBlciApCisgICAgeworICAgICAgICBhZGhvY01vZGUgPSB3ZC0+d3MuYWRob2NNb2RlOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhZGhvY01vZGUgPSB3ZC0+d2ZjLmJJYnNzR01vZGU7CisgICAgfQorCisgICAgcmV0dXJuIGFkaG9jTW9kZTsKK30KKworCit1OF90IHpmaVdsYW5TZXRDb3VudHJ5SXNvTmFtZSh6ZGV2X3QqIGRldiwgdThfdCAqY291bnRyeUlzb05hbWUsIHU4X3QgbGVuZ3RoKQoreworICAgIHU4X3QgYnVmWzVdOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmIChsZW5ndGggPT0gNCkKKyAgICB7CisgICAgICAgIGJ1ZlsyXSA9IHdkLT53cy5jb3VudHJ5SXNvTmFtZVswXSA9IGNvdW50cnlJc29OYW1lWzJdOworICAgICAgICBidWZbM10gPSB3ZC0+d3MuY291bnRyeUlzb05hbWVbMV0gPSBjb3VudHJ5SXNvTmFtZVsxXTsKKyAgICAgICAgYnVmWzRdID0gd2QtPndzLmNvdW50cnlJc29OYW1lWzJdID0gY291bnRyeUlzb05hbWVbMF07CisgICAgfQorICAgIGVsc2UgaWYgKGxlbmd0aCA9PSAzKQorICAgIHsKKyAgICAgICAgYnVmWzJdID0gd2QtPndzLmNvdW50cnlJc29OYW1lWzBdID0gY291bnRyeUlzb05hbWVbMV07CisgICAgICAgIGJ1ZlszXSA9IHdkLT53cy5jb3VudHJ5SXNvTmFtZVsxXSA9IGNvdW50cnlJc29OYW1lWzBdOworICAgICAgICBidWZbNF0gPSB3ZC0+d3MuY291bnRyeUlzb05hbWVbMl0gPSAnXDAnOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gemZIcEdldFJlZ3VsYXRpb25UYWJsZWZyb21JU08oZGV2LCBidWYsIGxlbmd0aCk7Cit9CisKKworY29uc3QgY2hhciogemZpV2xhblF1ZXJ5Q291bnRyeUlzb05hbWUoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT53cy5jb3VudHJ5SXNvTmFtZTsKK30KKworCisKK3ZvaWQgemZpV2xhblNldFJlZ3VsYXRvcnkoemRldl90KiBkZXYsIHU4X3QgQ0NTLCB1MTZfdCBDb2RlLCB1OF90IGJmaXJzdENoYW5uZWwpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmIChDQ1MpCisgICAgeworICAgICAgICAvKiBSZXNldCBSZWd1bGF0aW9uIFRhYmxlIGJ5IENvdW50cnkgQ29kZSAqLworICAgICAgICB6ZkhwR2V0UmVndWxhdGlvblRhYmxlZnJvbUNvdW50cnkoZGV2LCBDb2RlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogUmVzZXQgUmVndWxhdGlvbiBUYWJsZSBieSBSZWdpb24gQ29kZSAqLworICAgICAgICB6ZkhwR2V0UmVndWxhdGlvblRhYmxlZnJvbVJlZ2lvbkNvZGUoZGV2LCBDb2RlKTsKKyAgICB9CisKKyAgICBpZiAoYmZpcnN0Q2hhbm5lbCkgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB3ZC0+ZnJlcXVlbmN5ID0gemZDaEdldEZpcnN0Q2hhbm5lbChkZXYsIE5VTEwpOworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICB6ZkNvcmVTZXRGcmVxdWVuY3koZGV2LCB3ZC0+ZnJlcXVlbmN5KTsKKyAgICB9Cit9CisKKworY29uc3QgY2hhciogemZpSHBHZXRpc29OYW1lZnJvbXJlZ2lvbkNvZGUoemRldl90KiBkZXYsIHUxNl90IHJlZ2lvbkNvZGUpCit7CisgICAgcmV0dXJuIHpmSHBHZXRpc29OYW1lZnJvbXJlZ2lvbkNvZGUoZGV2LCByZWdpb25Db2RlKTsKK30KKwordTE2X3QgemZpV2xhbkNoYW5uZWxUb0ZyZXF1ZW5jeSh6ZGV2X3QqIGRldiwgdThfdCBjaGFubmVsKQoreworICAgIHJldHVybiB6ZkNoTnVtVG9GcmVxKGRldiwgY2hhbm5lbCwgMCk7Cit9CisKK3U4X3QgemZpV2xhbkZyZXF1ZW5jeVRvQ2hhbm5lbCh6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcSkKK3sKKyAgICB1OF90IGlzNUdCYW5kID0gMDsKKworICAgIHJldHVybiB6ZkNoRnJlcVRvTnVtKGZyZXEsICZpczVHQmFuZCk7Cit9CisKK3ZvaWQgemZpV2xhbkRpc2FibGVEZnNDaGFubmVsKHpkZXZfdCogZGV2LCB1OF90IGRpc2FibGVGbGFnKQoreworICAgIHpmSHBEaXNhYmxlRGZzQ2hhbm5lbChkZXYsIGRpc2FibGVGbGFnKTsKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgemZpV2xhblNldExFREN0cmxQYXJhbSh6ZGV2X3QqIGRldiwgdThfdCB0eXBlLCB1OF90IGZsYWcpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgd2QtPmxlZFN0cnVjdC5MRURDdHJsVHlwZSA9IHR5cGU7CisgICAgd2QtPmxlZFN0cnVjdC5MRURDdHJsRmxhZ0Zyb21SZWcgID0gZmxhZzsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCit2b2lkIHpmaVdsYW5FbmFibGVMZWFwQ29uZmlnKHpkZXZfdCogZGV2LCB1OF90IGxlYXBFbmFibGVkKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT5zdGEubGVhcEVuYWJsZWQgPSBsZWFwRW5hYmxlZDsKK30KKwordTMyX3QgemZpV2xhblF1ZXJ5SHdDYXBhYmlsaXR5KHpkZXZfdCogZGV2KQoreworICAgIHJldHVybiB6ZkhwQ2FwYWJpbGl0eShkZXYpOworfQorCit1MzJfdCB6ZmlXbGFuUXVlcnlSZWNlaXZlZFBhY2tldCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICByZXR1cm4gd2QtPnN0YS5SZWNlaXZlZFBrdFJhdGVQZXJTZWNvbmQ7Cit9CisKK3ZvaWQgemZpV2xhbkNoZWNrU1dFbmNyeXB0aW9uKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmICh3ZC0+c3RhLlNXRW5jcnlwdEVuYWJsZSAhPSAwKQorICAgIHsKKyAgICAgICAgemZIcFNXRGVjcnlwdChkZXYsIDEpOworICAgIH0KK30KKwordTE2X3QgemZpV2xhblF1ZXJ5QWxsb3dDaGFubmVscyh6ZGV2X3QqIGRldiwgdTE2X3QgKmNoYW5uZWxzKQoreworICAgIHUxNl90IGlpOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGZvciAoaWkgPSAwOyBpaSA8IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpaSsrKQorICAgIHsKKyAgICAgICAgY2hhbm5lbHNbaWldID0gd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaWldLmNoYW5uZWw7CisgICAgfQorCisgICAgcmV0dXJuIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OworfQorCit2b2lkIHpmaVdsYW5TZXREeW5hbWljU0lGU1BhcmFtKHpkZXZfdCogZGV2LCB1OF90IHZhbCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+ZHluYW1pY1NJRlNFbmFibGUgPSB2YWw7CisKKyAgICB6bV9kZWJ1Z19tc2cxKCJ3ZC0+ZHluYW1pY1NJRlNFbmFibGUgPSAiLCB3ZC0+ZHluYW1pY1NJRlNFbmFibGUpCit9CisKK3UxNl90IHpmaVdsYW5HZXRNdWx0aWNhc3RBZGRyZXNzQ291bnQoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgcmV0dXJuIHdkLT5zdGEubXVsdGljYXN0TGlzdC5zaXplOworfQorCit2b2lkIHpmaVdsYW5HZXRNdWx0aWNhc3RMaXN0KHpkZXZfdCogZGV2LCB1OF90KiBwTUNMaXN0KQoreworICAgIHN0cnVjdCB6c011bHRpY2FzdEFkZHIqIHBNYWNMaXN0ID0gKHN0cnVjdCB6c011bHRpY2FzdEFkZHIqKSBwTUNMaXN0OworICAgIHU4X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGZvciAoIGk9MDsgaTx3ZC0+c3RhLm11bHRpY2FzdExpc3Quc2l6ZTsgaSsrICkKKyAgICB7CisgICAgICAgIHpmTWVtb3J5Q29weShwTWFjTGlzdFtpXS5hZGRyLCB3ZC0+c3RhLm11bHRpY2FzdExpc3QubWFjQWRkcltpXS5hZGRyLCA2KTsKKyAgICB9Cit9CisKK3ZvaWQgemZpV2xhblNldFBhY2tldEZpbHRlcih6ZGV2X3QqIGRldiwgdTMyX3QgUGFja2V0RmlsdGVyKQoreworICAgIHU4X3QgIGJBbGxNdWx0aWNhc3QgPSAwOworICAgIHUzMl90IG9sZEZpbHRlcjsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIG9sZEZpbHRlciA9IHdkLT5zdGEub3NSeEZpbHRlcjsKKworICAgIHdkLT5zdGEub3NSeEZpbHRlciA9IFBhY2tldEZpbHRlcjsKKworICAgIGlmICgob2xkRmlsdGVyICYgWk1fUEFDS0VUX1RZUEVfQUxMX01VTFRJQ0FTVCkgIT0KKyAgICAgICAgKHdkLT5zdGEub3NSeEZpbHRlciAmIFpNX1BBQ0tFVF9UWVBFX0FMTF9NVUxUSUNBU1QpKQorICAgIHsKKyAgICAgICAgaWYgKCB3ZC0+c3RhLm9zUnhGaWx0ZXIgJiBaTV9QQUNLRVRfVFlQRV9BTExfTVVMVElDQVNUICkKKyAgICAgICAgICAgIGJBbGxNdWx0aWNhc3QgPSAxOworICAgICAgICB6ZkhwU2V0TXVsdGljYXN0TGlzdChkZXYsIHdkLT5zdGEubXVsdGljYXN0TGlzdC5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodThfdCopd2QtPnN0YS5tdWx0aWNhc3RMaXN0Lm1hY0FkZHIsIGJBbGxNdWx0aWNhc3QpOworICAgIH0KK30KKwordThfdCB6ZmlDb21wYXJlV2l0aE11bHRpY2FzdExpc3RBZGRyZXNzKHpkZXZfdCogZGV2LCB1MTZfdCogZHN0TWFjQWRkcikKK3sKKyAgICB1OF90IGk7CisgICAgdThfdCBiSXNJbk1DTGlzdEFkZHIgPSAwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZm9yICggaT0wOyBpPHdkLT5zdGEubXVsdGljYXN0TGlzdC5zaXplOyBpKysgKQorICAgIHsKKyAgICAJaWYgKCB6ZndNZW1vcnlJc0VxdWFsKCh1OF90Kilkc3RNYWNBZGRyLCAodThfdCopd2QtPnN0YS5tdWx0aWNhc3RMaXN0Lm1hY0FkZHJbaV0uYWRkciwgNikgKQorICAgIAl7CisgICAgICAgICAgICBiSXNJbk1DTGlzdEFkZHIgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgCX0KKyAgICB9CisKKyAgICByZXR1cm4gYklzSW5NQ0xpc3RBZGRyOworfQorCit2b2lkIHpmaVdsYW5TZXRTYWZlTW9kZUVuYWJsZWQoemRldl90KiBkZXYsIHU4X3Qgc2FmZU1vZGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPnN0YS5iU2FmZU1vZGUgPSBzYWZlTW9kZTsKKworICAgIGlmICggc2FmZU1vZGUgKQorICAgIAl6ZlN0YUVuYWJsZVNXRW5jcnlwdGlvbihkZXYsIDEpOworICAgIGVsc2UKKyAgICAgICAgemZTdGFEaXNhYmxlU1dFbmNyeXB0aW9uKGRldik7Cit9CisKK3ZvaWQgemZpV2xhblNldElCU1NBZGRpdGlvbmFsSUVMZW5ndGgoemRldl90KiBkZXYsIHUzMl90IGlic3NBZGRpdGlvbmFsSUVTaXplLCB1OF90KiBpYnNzQWRkaXRpb25hbElFKQoreworCXptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworCWlmICggaWJzc0FkZGl0aW9uYWxJRVNpemUgKQorICAgIHsKKwkgICAgd2QtPnN0YS5pYnNzQWRkaXRpb25hbElFU2l6ZSA9IGlic3NBZGRpdGlvbmFsSUVTaXplOworICAgICAgICB6Zk1lbW9yeUNvcHkod2QtPnN0YS5pYnNzQWRkaXRpb25hbElFLCBpYnNzQWRkaXRpb25hbElFLCAodTE2X3QpaWJzc0FkZGl0aW9uYWxJRVNpemUpOworICAgIH0KKyAgICBlbHNlCisgICAgCXdkLT5zdGEuaWJzc0FkZGl0aW9uYWxJRVNpemUgPSAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NwcmVjb21wLmggYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY3ByZWNvbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjcwYmZjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NwcmVjb21wLmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX0NQUkVDT01QX0gKKyNkZWZpbmUgX0NQUkVDT01QX0gKKworI2luY2x1ZGUgIi4uL29hbF9kdC5oIgorI2luY2x1ZGUgIi4uL29hbF9tYXJjLmgiCisjaW5jbHVkZSAicHViX3pmaS5oIgorI2luY2x1ZGUgInB1Yl96ZncuaCIKKyNpbmNsdWRlICJwdWJfdXNiLmgiCisjaW5jbHVkZSAid2xhbi5oIgorI2luY2x1ZGUgInN0cnVjdC5oIgorI2luY2x1ZGUgImNmdW5jLmgiCisjaW5jbHVkZSAiY2FnZy5oIgorI2luY2x1ZGUgImN3bS5oIgorI2luY2x1ZGUgInBlcmZvcm1hbmNlLmgiCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2Nwc21nci5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2Nwc21nci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNzNjYWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY3BzbWdyLmMKQEAgLTAsMCArMSw3MzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAgKiAgVGhlIHBvd2VyIHNhdmluZyBtYW5hZ2VyIGlzIHRvIHNhdmUgdGhlIHBvd2VyIGFzIG11Y2ggYXMgcG9zc2libGUuCisgICogIEdlbmVyYWxseSBzcGVha2luZywgaXQgY29udHJvbHM6CisgICoKKyAgKiAgICAgICAgIC0gd2hlbiB0byBzbGVlcAorICAqICAgICAgICAgLQorICAqCisgICovCisjaW5jbHVkZSAiY3ByZWNvbXAuaCIKKwordm9pZCB6ZlBvd2VyU2F2aW5nTWdySW5pdCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB3ZC0+c3RhLnBvd2VyU2F2ZU1vZGUgPSBaTV9TVEFfUFNfTk9ORTsKKyAgICB3ZC0+c3RhLnBzTWdyLnN0YXRlID0gWk1fUFNfTVNHX1NUQVRFX0FDVElWRTsKKyAgICB3ZC0+c3RhLnBzTWdyLmlzU2xlZXBBbGxvd2VkID0gMDsKKyAgICB3ZC0+c3RhLnBzTWdyLm1heFNsZWVwUGVyaW9kcyA9IDE7CisgICAgd2QtPnN0YS5wc01nci50aWNrcyA9IDA7CisgICAgd2QtPnN0YS5wc01nci5zbGVlcEFsbG93ZWR0aWNrID0gMDsKK30KKworc3RhdGljIHUxNl90IHpmUG93ZXJTYXZpbmdNZ3JIYW5kbGVQc05vbmUoemRldl90KiBkZXYsIHU4X3QgKmlzV2FrZVVwUmVxdWlyZWQpCit7CisgICAgdTE2X3QgcmV0ID0gMDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzd2l0Y2god2QtPnN0YS5wc01nci5zdGF0ZSkKKyAgICB7CisgICAgICAgIGNhc2UgWk1fUFNfTVNHX1NUQVRFX0FDVElWRToKKyAgICAgICAgICAgICppc1dha2VVcFJlcXVpcmVkID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fUFNfTVNHX1NUQVRFX1QxOgorICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9UMjoKKyAgICAgICAgY2FzZSBaTV9QU19NU0dfU1RBVEVfU0xFRVA6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAqaXNXYWtlVXBSZXF1aXJlZCA9IDE7Cit6bV9kZWJ1Z19tc2cwKCJ6ZlBvd2VyU2F2aW5nTWdySGFuZGxlUHNOb25lOiBXYWtlIHVwIG5vd1xuIik7CisgICAgICAgICAgICBpZiAoIHpmU3RhSXNDb25uZWN0ZWQoZGV2KSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiemZQb3dlclNhdmluZ01nck9uSGFuZGxlVDEgc2VuZCBOdWxsIGRhdGFcbiIpOworICAgICAgICAgICAgICAgIC8vemZTZW5kTnVsbERhdGEoZGV2LCAwKTsKKyAgICAgICAgICAgICAgICByZXQgPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3ZC0+c3RhLnBzTWdyLnN0YXRlID0gWk1fUFNfTVNHX1NUQVRFX0FDVElWRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB6ZlBvd2VyU2F2aW5nTWdySGFuZGxlUHMoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc3dpdGNoKHdkLT5zdGEucHNNZ3Iuc3RhdGUpCisgICAgeworICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzAoInpmUG93ZXJTYXZpbmdNZ3JIYW5kbGVQczogUHJlcGFyZSB0byBzbGVlcC4uLlxuIik7CisgICAgICAgICAgICAvL3dkLT5zdGEucHNNZ3Iuc3RhdGUgPSBaTV9QU19NU0dfU1RBVEVfVDE7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9UMToKKyAgICAgICAgY2FzZSBaTV9QU19NU0dfU1RBVEVfVDI6CisgICAgICAgIGNhc2UgWk1fUFNfTVNHX1NUQVRFX1NMRUVQOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIHpmUG93ZXJTYXZpbmdNZ3JTZXRNb2RlKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpCit7CisgICAgdTE2X3Qgc2VuZE51bGwgPSAwOworICAgIHU4X3QgaXNXYWtlVXBSZXF1aXJlZCA9IDA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptX2RlYnVnX21zZzEoIm1vZGUgPSAiLCBtb2RlKTsKKworICAgIGlmIChtb2RlID4gWk1fU1RBX1BTX0xJR0hUKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgicmV0dXJuIC0gd3JvbmcgcG93ZXIgc2F2ZSBtb2RlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgI2lmIDEKKyAgICBzd2l0Y2gobW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgWk1fU1RBX1BTX05PTkU6CisgICAgICAgICAgICBzZW5kTnVsbCA9IHpmUG93ZXJTYXZpbmdNZ3JIYW5kbGVQc05vbmUoZGV2LCAmaXNXYWtlVXBSZXF1aXJlZCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX1NUQV9QU19GQVNUOgorICAgICAgICBjYXNlIFpNX1NUQV9QU19MSUdIVDoKKyAgICAgICAgICAgIHdkLT5zdGEucHNNZ3IubWF4U2xlZXBQZXJpb2RzID0gMTsKKyAgICAgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JIYW5kbGVQcyhkZXYpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9TVEFfUFNfTUFYOgorICAgICAgICAgICAgd2QtPnN0YS5wc01nci5tYXhTbGVlcFBlcmlvZHMgPSBaTV9QU19NQVhfU0xFRVBfUEVSSU9EUzsKKyAgICAgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JIYW5kbGVQcyhkZXYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgICNlbHNlCisgICAgc3dpdGNoKHdkLT5zdGEucHNNZ3Iuc3RhdGUpCisgICAgeworICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICBpZiAoIG1vZGUgIT0gWk1fU1RBX1BTX05PTkUgKQorICAgICAgICAgICAgeworem1fZGVidWdfbXNnMCgiemZQb3dlclNhdmluZ01nclNldE1vZGU6IHN3aXRjaCBmcm9tIFpNX1BTX01TR19TVEFURV9BQ1RJVkUgdG8gWk1fUFNfTVNHX1NUQVRFX1QxXG4iKTsKKyAgICAgICAgICAgICAgICAvLyBTdGFsbCB0aGUgVFggJiBzdGFydCB0byB3YWl0IHRoZSBwZW5kaW5nIFRYIHRvIGJlIGNvbXBsZXRlZAorICAgICAgICAgICAgICAgIHdkLT5zdGEucHNNZ3Iuc3RhdGUgPSBaTV9QU19NU0dfU1RBVEVfVDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9TTEVFUDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIHdkLT5zdGEucG93ZXJTYXZlTW9kZSA9IG1vZGU7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICggaXNXYWtlVXBSZXF1aXJlZCApCisgICAgeworICAgICAgICB6ZkhwUG93ZXJTYXZlU2V0U3RhdGUoZGV2LCAwKTsKKyAgICAgICAgd2QtPnN0YS5wc01nci50ZW1wV2FrZVVwID0gMDsKKyAgICB9CisKKyAgICBpZiAoIHpmU3RhSXNDb25uZWN0ZWQoZGV2KQorICAgICAgICAgJiYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFKSApCisgICAgeworICAgICAgICBzd2l0Y2gobW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBaTV9TVEFfUFNfTk9ORToKKyAgICAgICAgICAgICAgICB6ZkhwUG93ZXJTYXZlU2V0TW9kZShkZXYsIDAsIDAsIHdkLT5iZWFjb25JbnRlcnZhbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgWk1fU1RBX1BTX0ZBU1Q6CisgICAgICAgICAgICBjYXNlIFpNX1NUQV9QU19NQVg6CisgICAgICAgICAgICBjYXNlIFpNX1NUQV9QU19MSUdIVDoKKyAgICAgICAgICAgICAgICB6ZkhwUG93ZXJTYXZlU2V0TW9kZShkZXYsIDAsIDEsIHdkLT5iZWFjb25JbnRlcnZhbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgemZIcFBvd2VyU2F2ZVNldE1vZGUoZGV2LCAwLCAwLCB3ZC0+YmVhY29uSW50ZXJ2YWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNlbmROdWxsID09IDEpCisgICAgeworICAgICAgICB6ZlNlbmROdWxsRGF0YShkZXYsIDApOworICAgIH0KKworICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQgemZQb3dlclNhdmluZ01nck5vdGlmeVBTVG9BUCh6ZGV2X3QgKmRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmICggKHdkLT5zdGEucHNNZ3IudGVtcFdha2VVcCAhPSAxKSYmCisgICAgICAgICAod2QtPnN0YS5wc01nci5sYXN0VHhVbmljYXN0RnJtICE9IHdkLT5jb21tVGFsbHkudHhVbmljYXN0RnJtIHx8CisgICAgICAgICAgd2QtPnN0YS5wc01nci5sYXN0VHhCcm9hZGNhc3RGcm0gIT0gd2QtPmNvbW1UYWxseS50eEJyb2FkY2FzdEZybSB8fAorICAgICAgICAgIHdkLT5zdGEucHNNZ3IubGFzdFR4TXVsdGljYXN0RnJtICE9IHdkLT5jb21tVGFsbHkudHhNdWx0aWNhc3RGcm0pICkKKyAgICB7CisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHdkLT5zdGEucHNNZ3IubGFzdFR4VW5pY2FzdEZybSA9IHdkLT5jb21tVGFsbHkudHhVbmljYXN0RnJtOworICAgICAgICB3ZC0+c3RhLnBzTWdyLmxhc3RUeEJyb2FkY2FzdEZybSA9IHdkLT5jb21tVGFsbHkudHhCcm9hZGNhc3RGcm07CisgICAgICAgIHdkLT5zdGEucHNNZ3IubGFzdFR4TXVsdGljYXN0RnJtID0gd2QtPmNvbW1UYWxseS50eE11bHRpY2FzdEZybTsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICB6ZlNlbmROdWxsRGF0YShkZXYsIDEpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgemZQb3dlclNhdmluZ01nck9uSGFuZGxlVDEoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICAvLyBJZiB0aGUgdHggUSBpcyBub3QgZW1wdHkuLi5yZXR1cm4KKyAgICBpZiAoIHpmSXNWdHhxRW1wdHkoZGV2KSA9PSBGQUxTRSApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCit6bV9kZWJ1Z19tc2cwKCJWdHhRIGlzIGVtcHR5IG5vdy4uLkNoZWNrIGlmIEhBTCBUWFEgaXMgZW1wdHlcbiIpOworCisgICAgLy8gVGhlIHRoZSBIQUwgVFggUSBpcyBub3QgZW1wdHkuLi5yZXR1cm4KKyAgICBpZiAoIHpmSHBHZXRGcmVlVHhkQ291bnQoZGV2KSAhPSB6ZkhwR2V0TWF4VHhkQ291bnQoZGV2KSApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCit6bV9kZWJ1Z19tc2cwKCJIQUwgVFhRIGlzIGVtcHR5IG5vdy4uLkNvdWxkIGdvIHRvIHNsZWVwLi4uXG4iKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAod2QtPnN0YS5wb3dlclNhdmVNb2RlID09IFpNX1NUQV9QU19MSUdIVCkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+c3RhLlJlY2VpdmVkUGt0UmF0ZVBlclNlY29uZCA+IDIwMCkKKyAgICAgICAgeworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggemZTdGFJc0Nvbm5lY3RlZChkZXYpCisgICAgICAgICAgICAgJiYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3ZC0+c3RhLnBzTWdyLnNsZWVwQWxsb3dlZHRpY2spIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLnBzTWdyLnNsZWVwQWxsb3dlZHRpY2stLTsKKyAgICAgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHdkLT5zdGEucHNNZ3Iuc3RhdGUgPSBaTV9QU19NU0dfU1RBVEVfVDI7CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgLy8gU2VuZCB0aGUgTnVsbCBwa3QgdG8gQVAgdG8gbm90aWZ5IHRoYXQgSSdtIGdvaW5nIHRvIHNsZWVwCisgICAgaWYgKCB6ZlN0YUlzQ29ubmVjdGVkKGRldikgKQorICAgIHsKK3ptX2RlYnVnX21zZzAoInpmUG93ZXJTYXZpbmdNZ3JPbkhhbmRsZVQxIHNlbmQgTnVsbCBkYXRhXG4iKTsKKyAgICAgICAgemZQb3dlclNhdmluZ01nck5vdGlmeVBTVG9BUChkZXYpOworICAgIH0KKworICAgIC8vIFN0YWxsIHRoZSBUWCBub3cKKyAgICAvLyB6ZlR4RW5naW5lU3RvcChkZXYpOworfQorCitzdGF0aWMgdm9pZCB6ZlBvd2VyU2F2aW5nTWdyT25IYW5kbGVUMih6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8vIFdhaXQgdW50aWwgdGhlIE51bGwgcGt0IGlzIHRyYW5zbWl0dGVkCisgICAgaWYgKCB6ZkhwR2V0RnJlZVR4ZENvdW50KGRldikgIT0gemZIcEdldE1heFR4ZENvdW50KGRldikgKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgd2QtPnN0YS5wc01nci5zdGF0ZSA9IFpNX1BTX01TR19TVEFURV9TTEVFUDsKKyAgICB3ZC0+c3RhLnBzTWdyLmxhc3RUeFVuaWNhc3RGcm0gPSB3ZC0+Y29tbVRhbGx5LnR4VW5pY2FzdEZybTsKKyAgICB3ZC0+c3RhLnBzTWdyLmxhc3RUeEJyb2FkY2FzdEZybSA9IHdkLT5jb21tVGFsbHkudHhCcm9hZGNhc3RGcm07CisgICAgd2QtPnN0YS5wc01nci5sYXN0VHhNdWx0aWNhc3RGcm0gPSB3ZC0+Y29tbVRhbGx5LnR4TXVsdGljYXN0RnJtOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAvLyBMZXQgQ0hJUCBzbGVlcCBub3cKK3ptX2RlYnVnX21zZzAoInpmUG93ZXJTYXZpbmdNZ3JPbkhhbmRsZVQyIHp6enouLi4uXG4iKTsKKyAgICB6ZkhwUG93ZXJTYXZlU2V0U3RhdGUoZGV2LCAxKTsKKyAgICB3ZC0+c3RhLnBzTWdyLnRlbXBXYWtlVXAgPSAwOworfQorCit1OF90IHpmUG93ZXJTYXZpbmdNZ3JJc1NsZWVwaW5nKHpkZXZfdCAqZGV2KQoreworICAgIHU4X3QgaXNTbGVlcGluZyA9IEZBTFNFOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZiAoIHdkLT5zdGEucHNNZ3Iuc3RhdGUgPT0gWk1fUFNfTVNHX1NUQVRFX1NMRUVQIHx8CisgICAgICAgICB3ZC0+c3RhLnBzTWdyLnN0YXRlID09IFpNX1BTX01TR19TVEFURV9UMikKKyAgICB7CisgICAgICAgIGlzU2xlZXBpbmcgPSBUUlVFOworICAgIH0KKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHJldHVybiBpc1NsZWVwaW5nOworfQorCitzdGF0aWMgdThfdCB6ZlBvd2VyU2F2aW5nTWdySXNJZGxlKHpkZXZfdCAqZGV2KQoreworICAgIHU4X3QgaXNJZGxlID0gMDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICggemZTdGFJc0Nvbm5lY3RlZChkZXYpICYmIHdkLT5zdGEucHNNZ3IuaXNTbGVlcEFsbG93ZWQgPT0gMCApCisgICAgeworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgaWYgKCB3ZC0+c3RhLmJDaGFubmVsU2NhbiApCisgICAgeworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgaWYgKCB6ZlN0YUlzQ29ubmVjdGluZyhkZXYpICkKKyAgICB7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICBpZiAod2QtPnN0YS5wb3dlclNhdmVNb2RlID09IFpNX1NUQV9QU19MSUdIVCkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+c3RhLlJlY2VpdmVkUGt0UmF0ZVBlclNlY29uZCA+IDIwMCkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCB6ZlN0YUlzQ29ubmVjdGVkKGRldikKKyAgICAgICAgICAgICAmJiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUpICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdkLT5zdGEucHNNZ3Iuc2xlZXBBbGxvd2VkdGljaykgeworICAgICAgICAgICAgICAgIHdkLT5zdGEucHNNZ3Iuc2xlZXBBbGxvd2VkdGljay0tOworICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlzSWRsZSA9IDE7CisKK2RvbmU6CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICggemZJc1Z0eHFFbXB0eShkZXYpID09IEZBTFNFICkKKyAgICB7CisgICAgICAgIGlzSWRsZSA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIGlzSWRsZTsKK30KKworc3RhdGljIHZvaWQgemZQb3dlclNhdmluZ01nclNsZWVwSWZJZGxlKHpkZXZfdCAqZGV2KQoreworICAgIHU4X3QgaXNJZGxlOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBpc0lkbGUgPSB6ZlBvd2VyU2F2aW5nTWdySXNJZGxlKGRldik7CisKKyAgICBpZiAoIGlzSWRsZSA9PSAwICkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgc3dpdGNoKHdkLT5zdGEucG93ZXJTYXZlTW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgWk1fU1RBX1BTX05PTkU6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX1NUQV9QU19NQVg6CisgICAgICAgIGNhc2UgWk1fU1RBX1BTX0ZBU1Q6CisgICAgICAgIGNhc2UgWk1fU1RBX1BTX0xJR0hUOgorICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiemZQb3dlclNhdmluZ01nclNsZWVwSWZJZGxlOiBJRExFIHNvIHNsZXAgbm93Li4uXG4iKTsKKyAgICAgICAgICAgIHdkLT5zdGEucHNNZ3Iuc3RhdGUgPSBaTV9QU19NU0dfU1RBVEVfVDE7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworfQorCitzdGF0aWMgdm9pZCB6ZlBvd2VyU2F2aW5nTWdyRGlzY29ubmVjdE1haW4oemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisjaWZkZWYgWk1fRU5BQkxFX0RJU0NPTk5FQ1RfUFMKKyAgICBzd2l0Y2god2QtPnN0YS5wc01nci5zdGF0ZSkKKyAgICB7CisgICAgICAgIGNhc2UgWk1fUFNfTVNHX1NUQVRFX0FDVElWRToKKyAgICAgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JTbGVlcElmSWRsZShkZXYpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9QU19NU0dfU1RBVEVfU0xFRVA6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9UMToKKyAgICAgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JPbkhhbmRsZVQxKGRldik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9UMjoKKyAgICAgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JPbkhhbmRsZVQyKGRldik7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisjZWxzZQorICAgIHpmUG93ZXJTYXZpbmdNZ3JXYWtldXAoZGV2KTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCB6ZlBvd2VyU2F2aW5nTWdySW5mcmFNYWluKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN3aXRjaCh3ZC0+c3RhLnBzTWdyLnN0YXRlKQorICAgIHsKKyAgICAgICAgY2FzZSBaTV9QU19NU0dfU1RBVEVfQUNUSVZFOgorICAgICAgICAgICAgemZQb3dlclNhdmluZ01nclNsZWVwSWZJZGxlKGRldik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9TTEVFUDoKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fUFNfTVNHX1NUQVRFX1QxOgorICAgICAgICAgICAgemZQb3dlclNhdmluZ01nck9uSGFuZGxlVDEoZGV2KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fUFNfTVNHX1NUQVRFX1QyOgorICAgICAgICAgICAgemZQb3dlclNhdmluZ01nck9uSGFuZGxlVDIoZGV2KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCB6ZlBvd2VyU2F2aW5nTWdyQXRpbVdpbkV4cGlyZWQoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisvL3ByaW50aygiemZQb3dlclNhdmluZ01nckF0aW1XaW5FeHBpcmVkICMxXG4iKTsKKyAgICBpZiAoIHdkLT5zdGEucG93ZXJTYXZlTW9kZSA9PSBaTV9TVEFfUFNfTk9ORSApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisvL3ByaW50aygiemZQb3dlclNhdmluZ01nckF0aW1XaW5FeHBpcmVkICMyXG4iKTsKKyAgICAvLyBpZiB3ZSByZWNlaXZlZCBhbnkgQVRJTSB3aW5kb3cgZnJvbSB0aGUgb3RoZXJzIHRvIGluZGljYXRlIHdlIGhhdmUgYnVmZmVyZWQgZGF0YQorICAgIC8vIGF0IHRoZSBvdGhlciBzdGF0aW9uLCB3ZSBjYW4ndCBnbyB0byBzbGVlcAorICAgIGlmICggd2QtPnN0YS5yZWN2QXRpbSApCisgICAgeworICAgICAgICB3ZC0+c3RhLnJlY3ZBdGltID0gMDsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiQ2FuJ3Qgc2xlZXAgZHVlIHRvIHJlY2V2aW5nIEFUSU0gd2luZG93ISIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gaWYgd2UgYXJlIHRoZSBvbmUgdG8gdHggYmVhY29uIGR1cmluZyBsYXN0IGJlYWNvbiBpbnRlcnZhbC4gd2UgY2FuJ3QgZ28gdG8gc2xlZXAKKyAgICAvLyBzaW5jZSB3ZSBuZWVkIHRvIGJlIGFsaXZlIHRvIHJlc3BvbmQgdGhlIHByb2JlIHJlcXVlc3QhCisgICAgaWYgKCB3ZC0+c3RhLnR4QmVhY29uSW5kICkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIkNhbid0IHNsZWVwIGR1ZSB0byBqdXN0IHRyYW5zbWl0IGEgYmVhY29uISIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSWYgd2UgYnVmZmVyIGFueSBkYXRhIGZvciB0aGUgb3RoZXIgc3RhdGlvbnMuIHdlIGNvdWxkIG5vdCBnbyB0byBzbGVlcAorICAgIGlmICggd2QtPnN0YS5pYnNzUHJldlBTRGF0YUNvdW50ICE9IDAgKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiQ2FuJ3Qgc2xlZXAgZHVlIHRvIGJ1ZmZlcmluZyBkYXRhIGZvciB0aGUgb3RoZXJzISIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gYmVmb3JlIHNsZWVwaW5nLCB3ZSBzdGlsbCBuZWVkIHRvIG5vdGlmeSB0aGUgb3RoZXJzIGJ5IHRyYW5zbWl0dGluZyBudWxsCisgICAgLy8gcGt0IHdpdGggcG93ZXIgbWdtdCBiaXQgdHVybmVkIG9uLgorICAgIHpmUG93ZXJTYXZpbmdNZ3JPbkhhbmRsZVQxKGRldik7Cit9CisKK3N0YXRpYyB2b2lkIHpmUG93ZXJTYXZpbmdNZ3JJQlNTTWFpbih6ZGV2X3QqIGRldikKK3sKKyAgICAvLyB3YWl0IGZvciB0aGUgZW5kIG9mCisgICAgLy8gaWYgbmVlZCB0byB3YWl0IHRvIGtub3cgaWYgd2UgYXJlIHRoZSBvbmUgdG8gdHJhbnNtaXQgdGhlIGJlYWNvbgorICAgIC8vIGR1cmluZyB0aGUgYmVhY29uIGludGVydmFsLiBJZiBpdCdzIG1lLCB3ZSBjYW4ndCBnbyB0byBzbGVlcC4KKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN3aXRjaCh3ZC0+c3RhLnBzTWdyLnN0YXRlKQorICAgIHsKKyAgICAgICAgY2FzZSBaTV9QU19NU0dfU1RBVEVfQUNUSVZFOgorICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9TTEVFUDoKKyAgICAgICAgY2FzZSBaTV9QU19NU0dfU1RBVEVfVDE6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9UMjoKKyAgICAgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JPbkhhbmRsZVQyKGRldik7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKyNpZiAxCit2b2lkIHpmUG93ZXJTYXZpbmdNZ3JNYWluKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN3aXRjaCAod2QtPnN0YS5hZGFwdGVyU3RhdGUpCisgICAgeworICAgIGNhc2UgWk1fU1RBX1NUQVRFX0RJU0NPTk5FQ1Q6CisgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JEaXNjb25uZWN0TWFpbihkZXYpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFpNX1NUQV9TVEFURV9DT05ORUNURUQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkgeworICAgICAgICAgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JJbmZyYU1haW4oZGV2KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUykgeworICAgICAgICAgICAgICAgIHpmUG93ZXJTYXZpbmdNZ3JJQlNTTWFpbihkZXYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgWk1fU1RBX1NUQVRFX0NPTk5FQ1RJTkc6CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorI2Vsc2UKK3ZvaWQgemZQb3dlclNhdmluZ01nck1haW4oemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKCB3ZC0+d2xhbk1vZGUgIT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3dpdGNoKHdkLT5zdGEucHNNZ3Iuc3RhdGUpCisgICAgeworICAgICAgICBjYXNlIFpNX1BTX01TR19TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICBnb3RvIGNoZWNrX3NsZWVwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9QU19NU0dfU1RBVEVfU0xFRVA6CisgICAgICAgICAgICBnb3RvIHNsZWVwaW5nOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9QU19NU0dfU1RBVEVfVDE6CisgICAgICAgICAgICB6ZlBvd2VyU2F2aW5nTWdyT25IYW5kbGVUMShkZXYpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9QU19NU0dfU1RBVEVfVDI6CisgICAgICAgICAgICB6ZlBvd2VyU2F2aW5nTWdyT25IYW5kbGVUMihkZXYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuOworCitzbGVlcGluZzoKKyAgICByZXR1cm47CisKK2NoZWNrX3NsZWVwOgorICAgIHpmUG93ZXJTYXZpbmdNZ3JTbGVlcElmSWRsZShkZXYpOworICAgIHJldHVybjsKK30KKyNlbmRpZgorCisjaWZkZWYgWk1fRU5BQkxFX1BPV0VSX1NBVkUKK3ZvaWQgemZQb3dlclNhdmluZ01ncldha2V1cCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworLy96bV9kZWJ1Z19tc2cwKCJ6ZlBvd2VyU2F2aW5nTWdyV2FrZXVwIik7CisKKyAgICAvL2lmICggd2QtPnN0YS5wc01nci5zdGF0ZSAhPSBaTV9QU19NU0dfU1RBVEVfQUNUSVZFICYmICggemZQb3dlclNhdmluZ01ncklzSWRsZShkZXYpID09IDAgKSkKKyAgICBpZiAoIHdkLT5zdGEucHNNZ3Iuc3RhdGUgIT0gWk1fUFNfTVNHX1NUQVRFX0FDVElWRSApCisgICAgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIHdkLT5zdGEucHNNZ3IuaXNTbGVlcEFsbG93ZWQgPSAwOworICAgICAgICB3ZC0+c3RhLnBzTWdyLnN0YXRlID0gWk1fUFNfTVNHX1NUQVRFX0FDVElWRTsKKworICAgICAgICBpZiAoIHdkLT5zdGEucG93ZXJTYXZlTW9kZSA+IFpNX1NUQV9QU19OT05FICkKKyAgICAgICAgICAgIHdkLT5zdGEucHNNZ3IudGVtcFdha2VVcCA9IDE7CisKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAvLyBXYWtlIHVwIHRoZSBDSElQIG5vdyEhCisgICAgICAgIHpmSHBQb3dlclNhdmVTZXRTdGF0ZShkZXYsIDApOworICAgIH0KK30KKyNlbHNlCit2b2lkIHpmUG93ZXJTYXZpbmdNZ3JXYWtldXAoemRldl90KiBkZXYpCit7Cit9CisjZW5kaWYKKwordm9pZCB6ZlBvd2VyU2F2aW5nTWdyUHJvY2Vzc0JlYWNvbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdThfdCAgIGxlbmd0aCwgYml0bWFwOworICAgIHUxNl90ICBvZmZzZXQsIG4xLCBuMiwgcSwgcjsKKyAgICB6YnVmX3QqIHBzQnVmOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBpZiAoIHdkLT5zdGEucG93ZXJTYXZlTW9kZSA9PSBaTV9TVEFfUFNfTk9ORSAgKQorICAgIC8vaWYgKCB3ZC0+c3RhLnBzTWdyLnN0YXRlICE9IFpNX1BTX01TR19TVEFURV9TTEVFUCApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgd2QtPnN0YS5wc01nci5pc1NsZWVwQWxsb3dlZCA9IDE7CisKKyAgICBpZiAoIChvZmZzZXQ9emZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfVElNKSkgIT0gMHhmZmZmICkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKworICAgICAgICBpZiAoIGxlbmd0aCA+IDMgKQorICAgICAgICB7CisgICAgICAgICAgICBuMSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs0KSAmICh+Wk1fQklUXzApOworICAgICAgICAgICAgbjIgPSBsZW5ndGggKyBuMSAtIDQ7CisgICAgICAgICAgICBxID0gd2QtPnN0YS5haWQgPj4gMzsKKyAgICAgICAgICAgIHIgPSB3ZC0+c3RhLmFpZCAmIDc7CisKKyAgICAgICAgICAgIGlmICgocSA+PSBuMSkgJiYgKHEgPD0gbjIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJpdG1hcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs1K3EtbjEpOworCisgICAgICAgICAgICAgICAgaWYgKCAoYml0bWFwID4+IHIpICYgIFpNX0JJVF8wICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vaWYgKCB3ZC0+c3RhLnBvd2VyU2F2ZU1vZGUgPT0gWk1fU1RBX1BTX0ZBU1QgKQorICAgICAgICAgICAgICAgICAgICBpZiAoIDAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnBzTWdyLnN0YXRlID0gWk1fUFNfTVNHX1NUQVRFX1MxOworICAgICAgICAgICAgICAgICAgICAgICAgLy96ZlNlbmRQU1BvbGwoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHpmU2VuZE51bGxEYXRhKGRldiwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHdkLT5zdGEucW9zSW5mbyYweGYpICE9IDB4ZikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZW5kIHBzLXBvbGwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50aygiemZTZW5kUFNQb2xsICMxXG4iKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucHNNZ3IuaXNTbGVlcEFsbG93ZWQgPSAwOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh3ZC0+c3RhLnBvd2VyU2F2ZU1vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgWk1fU1RBX1BTX01BWDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFpNX1NUQV9QU19GQVNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzAoIndha2UgdXAgYW5kIHNlbmQgUFMtUG9sbFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmU2VuZFBTUG9sbChkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFpNX1NUQV9QU19MSUdIVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgid2FrZSB1cCBhbmQgc2VuZCBudWxsIGRhdGFcbiIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucHNNZ3Iuc2xlZXBBbGxvd2VkdGljayA9IDQwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZlNlbmROdWxsRGF0YShkZXYsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnBzTWdyLnRlbXBXYWtlVXAgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgd2hpbGUgKChwc0J1ZiA9IHpmUXVldWVHZXQoZGV2LCB3ZC0+c3RhLnVhcHNkUSkpICE9IE5VTEwpCisgICAgeworICAgICAgICB6ZlR4U2VuZEV0aChkZXYsIHBzQnVmLCAwLCBaTV9FWFRFUk5BTF9BTExPQ19CVUYsIDApOworICAgIH0KKworICAgIC8vcHJpbnRrKCJ6ZlBvd2VyU2F2aW5nTWdyUHJvY2Vzc0JlYWNvbiAjMVxuIik7CisgICAgemZQb3dlclNhdmluZ01nck1haW4oZGV2KTsKK30KKwordm9pZCB6ZlBvd2VyU2F2aW5nTWdyQ29ubmVjdE5vdGlmeSh6ZGV2X3QgKmRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICB7CisgICAgICAgIHN3aXRjaCh3ZC0+c3RhLnBvd2VyU2F2ZU1vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgWk1fU1RBX1BTX05PTkU6CisgICAgICAgICAgICAgICAgemZIcFBvd2VyU2F2ZVNldE1vZGUoZGV2LCAwLCAwLCB3ZC0+YmVhY29uSW50ZXJ2YWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFpNX1NUQV9QU19GQVNUOgorICAgICAgICAgICAgY2FzZSBaTV9TVEFfUFNfTUFYOgorICAgICAgICAgICAgY2FzZSBaTV9TVEFfUFNfTElHSFQ6CisgICAgICAgICAgICAgICAgemZIcFBvd2VyU2F2ZVNldE1vZGUoZGV2LCAwLCAxLCB3ZC0+YmVhY29uSW50ZXJ2YWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHpmSHBQb3dlclNhdmVTZXRNb2RlKGRldiwgMCwgMCwgd2QtPmJlYWNvbkludGVydmFsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCB6ZlBvd2VyU2F2aW5nTWdyUHJlVEJUVEludGVycnVwdCh6ZGV2X3QgKmRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8qIGRpc2FibGUgVEJUVCBpbnRlcnJ1cHQgd2hlbiBjaGFuZ2UgZnJvbSBjb25uZWN0aW9uIHRvIGRpc2Nvbm5lY3QgKi8KKyAgICBpZiAoemZTdGFJc0Rpc2Nvbm5lY3QoZGV2KSkgeworICAgICAgICB6ZkhwUG93ZXJTYXZlU2V0TW9kZShkZXYsIDAsIDAsIDApOworICAgICAgICB6ZlBvd2VyU2F2aW5nTWdyV2FrZXVwKGRldik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHdkLT5zdGEucHNNZ3IudGlja3MrKzsKKworICAgIGlmICggd2QtPnN0YS5wc01nci50aWNrcyA8IHdkLT5zdGEucHNNZ3IubWF4U2xlZXBQZXJpb2RzICkKKyAgICB7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgd2QtPnN0YS5wc01nci50aWNrcyA9IDA7CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHpmUG93ZXJTYXZpbmdNZ3JXYWtldXAoZGV2KTsKK30KKworLyogTGVhdmUgYW4gZW1wdHkgbGluZSBiZWxvdyB0byByZW1vdmUgd2FybmluZyBtZXNzYWdlIG9uIHNvbWUgY29tcGlsZXIgKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NzY2FubWdyLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY3NjYW5tZ3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzI4MzVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NzY2FubWdyLmMKQEAgLTAsMCArMSw1MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiY3ByZWNvbXAuaCIKKwordm9pZCB6ZlNjYW5NZ3JJbml0KHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHdkLT5zdGEuc2Nhbk1nci5zY2FuUmVxc1swXSA9IDA7CisgICAgd2QtPnN0YS5zY2FuTWdyLnNjYW5SZXFzWzFdID0gMDsKKworICAgIHdkLT5zdGEuc2Nhbk1nci5jdXJyU2NhblR5cGUgPSBaTV9TQ0FOX01HUl9TQ0FOX05PTkU7CisgICAgd2QtPnN0YS5zY2FuTWdyLnNjYW5TdGFydERlbGF5ID0gMzsKKyAgICAvL3dkLT5zdGEuc2Nhbk1nci5zY2FuU3RhcnREZWxheSA9IDA7Cit9CisKK3U4X3QgemZTY2FuTWdyU2NhblN0YXJ0KHpkZXZfdCogZGV2LCB1OF90IHNjYW5UeXBlKQoreworICAgIHU4X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptX2RlYnVnX21zZzEoInNjYW5UeXBlID0gIiwgc2NhblR5cGUpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmICggc2NhblR5cGUgIT0gWk1fU0NBTl9NR1JfU0NBTl9JTlRFUk5BTCAmJgorICAgICAgICAgc2NhblR5cGUgIT0gWk1fU0NBTl9NR1JfU0NBTl9FWFRFUk5BTCApCisgICAgeworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJ1bmtub3duIHNjYW5UeXBlIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlIGlmICh6ZlN0YUlzQ29ubmVjdGluZyhkZXYpKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgicmVqZWN0IHNjYW4gcmVxdWVzdCBkdWUgdG8gY29ubmVjdGluZyIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpID0gc2NhblR5cGUgLSAxOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICggd2QtPnN0YS5zY2FuTWdyLnNjYW5SZXFzW2ldID09IDEgKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMSgic2NhbiByZXNjaGVkdWxlZCIsIHNjYW5UeXBlKTsKKyAgICAgICAgZ290byBzY2FuX2RvbmU7CisgICAgfQorCisgICAgd2QtPnN0YS5zY2FuTWdyLnNjYW5SZXFzW2ldID0gMTsKKyAgICB6bV9kZWJ1Z19tc2cxKCJzY2FuIHNjaGVkdWxlZDogIiwgc2NhblR5cGUpOworCisgICAgLy8gSWYgdGhlcmUncyBubyBzY2FuIHBlbmRpbmcsIHdlIGRvIHRoZSBzY2FuIHJpZ2h0IGF3YXkuCisgICAgLy8gSWYgdGhlcmUncyBhbiBpbnRlcm5hbCBzY2FuIGFuZCB0aGUgbmV3IHNjYW4gcmVxdWVzdCBpcyBleHRlcm5hbCBvbmUsCisgICAgLy8gd2Ugd2lsbCByZXN0YXJ0IHRoZSBzY2FuLgorICAgIGlmICggd2QtPnN0YS5zY2FuTWdyLmN1cnJTY2FuVHlwZSA9PSBaTV9TQ0FOX01HUl9TQ0FOX05PTkUgKQorICAgIHsKKyAgICAgICAgZ290byBzY2hlZHVsZV9zY2FuOworICAgIH0KKyAgICBlbHNlIGlmICggd2QtPnN0YS5zY2FuTWdyLmN1cnJTY2FuVHlwZSA9PSBaTV9TQ0FOX01HUl9TQ0FOX0lOVEVSTkFMICYmCisgICAgICAgICAgICAgIHNjYW5UeXBlID09IFpNX1NDQU5fTUdSX1NDQU5fRVhURVJOQUwgKQorICAgIHsKKyAgICAgICAgLy8gU3RvcCB0aGUgaW50ZXJuYWwgc2NhbiAmIHNjaGVkdWxlIGV4dGVybmFsIHNjYW4gZmlyc3QKKyAgICAgICAgemZUaW1lckNhbmNlbChkZXYsIFpNX0VWRU5UX1NDQU4pOworCisgICAgICAgIC8qIEZpeCBmb3IgV0hRTCBzZW5kcmVjdiA9PiB3ZSBkbyBub3QgYXBwbHkgZGVsYXkgdGltZSBpbiB3aGljaCB0aGUgZGV2aWNlCisgICAgICAgICAgIHN0b3AgdHJhbnNtaXR0aW5nIHBhY2tldCB3aGVuIHdlIGFscmVhZHkgY29ubmVjdCB0byBzb21lIEFQICAqLworICAgICAgICB3ZC0+c3RhLmJTY2hlZHVsZVNjYW4gPSBGQUxTRTsKKworICAgICAgICB6ZlRpbWVyQ2FuY2VsKGRldiwgWk1fRVZFTlRfVElNRU9VVF9TQ0FOKTsKKyAgICAgICAgemZUaW1lckNhbmNlbChkZXYsIFpNX0VWRU5UX0lOX1NDQU4pOworCisgICAgICAgIHdkLT5zdGEuYkNoYW5uZWxTY2FuID0gRkFMU0U7CisgICAgICAgIGdvdG8gc2NoZWR1bGVfc2NhbjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiU2NhbiBpcyBidXN5Li4ud2FpdGluZyBsYXRlciB0byBzdGFydFxuIik7CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICByZXR1cm4gMDsKKworc2Nhbl9kb25lOgorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgcmV0dXJuIDE7CisKK3NjaGVkdWxlX3NjYW46CisKKyAgICB3ZC0+c3RhLmJTY2hlZHVsZVNjYW4gPSBUUlVFOworCisgICAgemZUaW1lclNjaGVkdWxlKGRldiwgWk1fRVZFTlRfU0NBTiwgd2QtPnN0YS5zY2FuTWdyLnNjYW5TdGFydERlbGF5KTsKKyAgICB3ZC0+c3RhLnNjYW5NZ3Iuc2NhblN0YXJ0RGVsYXkgPSAzOworICAgIC8vd2QtPnN0YS5zY2FuTWdyLnNjYW5TdGFydERlbGF5ID0gMDsKKyAgICB3ZC0+c3RhLnNjYW5NZ3IuY3VyclNjYW5UeXBlID0gc2NhblR5cGU7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICgoemZTdGFJc0Nvbm5lY3RlZChkZXYpKSAmJiAoIXpmUG93ZXJTYXZpbmdNZ3JJc1NsZWVwaW5nKGRldikpKQorICAgIHsKKyAgICAgICAgemZTZW5kTnVsbERhdGEoZGV2LCAxKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgemZTY2FuTWdyU2NhblN0b3AoemRldl90KiBkZXYsIHU4X3Qgc2NhblR5cGUpCit7CisgICAgdThfdCBzY2FuTm90aWZ5UmVxdWlyZWQgPSAwOworICAgIHU4X3QgdGhlT3RoZXJTY2FuID0gWk1fU0NBTl9NR1JfU0NBTl9OT05FOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAoIHdkLT5zdGEuc2Nhbk1nci5jdXJyU2NhblR5cGUgPT0gWk1fU0NBTl9NR1JfU0NBTl9OT05FICkKKyAgICB7CisgICAgICAgIHptX2Fzc2VydCh3ZC0+c3RhLnNjYW5NZ3Iuc2NhblJlcXNbMF0gPT0gMCk7CisgICAgICAgIHptX2Fzc2VydCh3ZC0+c3RhLnNjYW5NZ3Iuc2NhblJlcXNbMV0gPT0gMCk7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICBzd2l0Y2goc2NhblR5cGUpCisgICAgeworICAgICAgICBjYXNlIFpNX1NDQU5fTUdSX1NDQU5fRVhURVJOQUw6CisgICAgICAgICAgICBzY2FuTm90aWZ5UmVxdWlyZWQgPSAxOworICAgICAgICAgICAgdGhlT3RoZXJTY2FuID0gWk1fU0NBTl9NR1JfU0NBTl9JTlRFUk5BTDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fU0NBTl9NR1JfU0NBTl9JTlRFUk5BTDoKKyAgICAgICAgICAgIHRoZU90aGVyU2NhbiA9IFpNX1NDQU5fTUdSX1NDQU5fRVhURVJOQUw7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIGlmICggd2QtPnN0YS5zY2FuTWdyLmN1cnJTY2FuVHlwZSAhPSBzY2FuVHlwZSApCisgICAgeworICAgICAgICBnb3RvIHN0b3BfZG9uZTsKKyAgICB9CisKKyAgICB6ZlRpbWVyQ2FuY2VsKGRldiwgWk1fRVZFTlRfU0NBTik7CisKKyAgICAvKiBGaXggZm9yIFdIUUwgc2VuZHJlY3YgPT4gd2UgZG8gbm90IGFwcGx5IGRlbGF5IHRpbWUgaW4gd2hpY2ggdGhlIGRldmljZQorICAgICAgIHN0b3AgdHJhbnNtaXR0aW5nIHBhY2tldCB3aGVuIHdlIGFscmVhZHkgY29ubmVjdCB0byBzb21lIEFQICAqLworICAgIHdkLT5zdGEuYlNjaGVkdWxlU2NhbiA9IEZBTFNFOworCisgICAgemZUaW1lckNhbmNlbChkZXYsIFpNX0VWRU5UX1RJTUVPVVRfU0NBTik7CisgICAgemZUaW1lckNhbmNlbChkZXYsIFpNX0VWRU5UX0lOX1NDQU4pOworCisgICAgd2QtPnN0YS5iQ2hhbm5lbFNjYW4gPSBGQUxTRTsKKyAgICB3ZC0+c3RhLnNjYW5GcmVxdWVuY3kgPSAwOworCisgICAgaWYgKCB3ZC0+c3RhLnNjYW5NZ3Iuc2NhblJlcXNbdGhlT3RoZXJTY2FuIC0gMV0gKQorICAgIHsKKyAgICAgICAgd2QtPnN0YS5zY2FuTWdyLmN1cnJTY2FuVHlwZSA9IHRoZU90aGVyU2NhbjsKKworICAgICAgICAvLyBTY2hlZHVsZSB0aGUgb3RoZXIgc2NhbiBhZnRlciAxIHNlY29uZCBsYXRlcgorICAgICAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCBaTV9FVkVOVF9TQ0FOLCAxMDApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3ZC0+c3RhLnNjYW5NZ3IuY3VyclNjYW5UeXBlID0gWk1fU0NBTl9NR1JfU0NBTl9OT05FOworICAgIH0KKworc3RvcF9kb25lOgorICAgIHdkLT5zdGEuc2Nhbk1nci5zY2FuUmVxc1tzY2FuVHlwZSAtIDFdID0gMDsKKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAvKiBhdm9pZCBsb3NlIHJlY2VpdmUgcGFja2V0IHdoZW4gc2l0ZSBzdXJ2ZXkgKi8KKyAgICBpZiAoKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSkgJiYgKCF6ZlBvd2VyU2F2aW5nTWdySXNTbGVlcGluZyhkZXYpKSkKKyAgICB7CisgICAgICAgIHpmU2VuZE51bGxEYXRhKGRldiwgMCk7CisgICAgfQorCisgICAgaWYgKCBzY2FuTm90aWZ5UmVxdWlyZWQgKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiU2NhbiBub3RpZnkgYWZ0ZXIgcmVzZXQiKTsKKyAgICAgICAgaWYgKHdkLT56ZmNiU2Nhbk5vdGlmeSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+emZjYlNjYW5Ob3RpZnkoZGV2LCBOVUxMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybjsKKworZG9uZToKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHJldHVybjsKK30KKwordm9pZCB6ZlNjYW5NZ3JTY2FuQWNrKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgd2QtPnN0YS5zY2FuTWdyLnNjYW5TdGFydERlbGF5ID0gMzsKKyAgICAvL3dkLT5zdGEuc2Nhbk1nci5zY2FuU3RhcnREZWxheSA9IDA7CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHJldHVybjsKK30KKworZXh0ZXJuIHZvaWQgemZTdGFSZWNvbm5lY3QoemRldl90KiBkZXYpOworCitzdGF0aWMgdm9pZCB6ZlNjYW5TZW5kUHJvYmVSZXF1ZXN0KHpkZXZfdCogZGV2KQoreworICAgIHU4X3QgazsKKyAgICB1MTZfdCAgZHN0WzNdID0geyAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmIH07CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBJbmNyZWFzZSByeEJlYWNvbkNvdW50IHRvIHByZXZlbnQgYmVhY29uIGxvc3QgKi8KKyAgICBpZiAoemZTdGFJc0Nvbm5lY3RlZChkZXYpKQorICAgIHsKKyAgICAgICAgd2QtPnN0YS5yeEJlYWNvbkNvdW50Kys7CisgICAgfQorCisgICAgaWYgKCB3ZC0+c3RhLmJQYXNzaXZlU2NhbiApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8qIGVuYWJsZSA4MDIubDExaCBhbmQgaW4gREZTIEJhbmQgLCBkaXNhYmxlIHNlbmRpbmcgcHJvYmUgcmVxdWVzdCAqLworICAgIGlmICh3ZC0+c3RhLkRGU0VuYWJsZSkKKyAgICB7CisgICAgICAgIGlmICh6ZkhwSXNEZnNDaGFubmVsKGRldiwgd2QtPnN0YS5zY2FuRnJlcXVlbmN5KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9QUk9CRVJFUSwgZHN0LCAwLCAwLCAwKTsKKworICAgIGlmICggd2QtPnN0YS5kaXNhYmxlUHJvYmluZ1dpdGhTc2lkICkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKGs9MTsgazw9Wk1fTUFYX1BST0JFX0hJRERFTl9TU0lEX1NJWkU7IGsrKykKKyAgICB7CisgICAgICAgIGlmICggd2QtPndzLnByb2JpbmdTc2lkTGlzdFtrLTFdLnNzaWRMZW4gIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmU2VuZE1tRnJhbWUoZGV2LCBaTV9XTEFOX0ZSQU1FX1RZUEVfUFJPQkVSRVEsIGRzdCwgaywgMCwgMCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHpmU2Nhbk1nckV2ZW50U2V0RnJlcUNvbXBsZXRlQ2IoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworLy9wcmludGsoInpmU2Nhbk1nckV2ZW50U2V0RnJlcUNvbXBsZXRlQ2IgIzFcbiIpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB6ZlRpbWVyU2NoZWR1bGUoZGV2LCBaTV9FVkVOVF9JTl9TQ0FOLCBaTV9USUNLX0lOX1NDQU4pOworICAgIGlmICh3ZC0+c3RhLmJQYXNzaXZlU2NhbikKKyAgICB7CisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIFpNX0VWRU5UX1RJTUVPVVRfU0NBTiwgd2QtPnN0YS5wYXNzaXZlU2NhblRpY2tQZXJDaGFubmVsKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgemZUaW1lclNjaGVkdWxlKGRldiwgWk1fRVZFTlRfVElNRU9VVF9TQ0FOLCB3ZC0+c3RhLmFjdGl2ZXNjYW5UaWNrUGVyQ2hhbm5lbCk7CisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICB6ZlNjYW5TZW5kUHJvYmVSZXF1ZXN0KGRldik7Cit9CisKKworc3RhdGljIHZvaWQgemZTY2FuTWdyRXZlbnRTY2FuQ29tcGxldGVDYih6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSkgJiYgKCF6ZlBvd2VyU2F2aW5nTWdySXNTbGVlcGluZyhkZXYpKSkKKyAgICB7CisgICAgICAgIHpmU2VuZE51bGxEYXRhKGRldiwgMCk7CisgICAgfQorICAgIHJldHVybjsKK30KKworCit2b2lkIHpmU2Nhbk1nclNjYW5FdmVudFJldHJ5KHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmICggIXdkLT5zdGEuYkNoYW5uZWxTY2FuICkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoICF3ZC0+c3RhLmJQYXNzaXZlU2NhbiApCisgICAgeworICAgICAgICB6ZlNjYW5TZW5kUHJvYmVSZXF1ZXN0KGRldik7CisgICAgICAgICNpZiAwCisgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHpmVGltZXJTY2hlZHVsZShkZXYsIFpNX0VWRU5UX0lOX1NDQU4sIFpNX1RJQ0tfSU5fU0NBTik7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICNlbmRpZgorICAgIH0KK30KKwordThfdCB6ZlNjYW5NZ3JTY2FuRXZlbnRUaW1lb3V0KHpkZXZfdCogZGV2KQoreworICAgIHUxNl90ICAgbmV4dFNjYW5GcmVxdWVuY3kgPSAwOworICAgIHU4X3QgICAgdGVtcDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIGlmICggd2QtPnN0YS5zY2FuRnJlcXVlbmN5ID09IDAgKQorICAgIHsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIG5leHRTY2FuRnJlcXVlbmN5ID0gemZDaEdldE5leHRDaGFubmVsKGRldiwgd2QtPnN0YS5zY2FuRnJlcXVlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3ZC0+c3RhLmJQYXNzaXZlU2Nhbik7CisKKyAgICBpZiAoIChuZXh0U2NhbkZyZXF1ZW5jeSA9PSAweGZmZmYpCisgICAgICAgICB8fCAod2QtPnN0YS5zY2FuRnJlcXVlbmN5ID09IHpmQ2hHZXRMYXN0Q2hhbm5lbChkZXYsICZ0ZW1wKSkgKQorICAgIHsKKyAgICAgICAgdThfdCBjdXJyU2NhblR5cGU7CisgICAgICAgIHU4X3QgaXNFeHRlcm5hbFNjYW4gPSAwOworICAgICAgICB1OF90IGlzSW50ZXJuYWxTY2FuID0gMDsKKworICAgICAgICAvL3ptX2RlYnVnX21zZzEoImVuZCBzY2FuID0gIiwgS2VRdWVyeUludGVycnVwdFRpbWUoKSk7CisgICAgICAgIHdkLT5zdGEuc2NhbkZyZXF1ZW5jeSA9IDA7CisKKyAgICAgICAgem1fZGVidWdfbXNnMSgic2NhbiAxIHR5cGU6ICIsIHdkLT5zdGEuc2Nhbk1nci5jdXJyU2NhblR5cGUpOworICAgICAgICB6bV9kZWJ1Z19tc2cxKCJzY2FuIGNoYW5uZWwgY291bnQgPSAiLCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbENudCk7CisKKyAgICAgICAgLy96ZkJzc0luZm9SZWZyZXNoKGRldik7CisgICAgICAgIHpmVGltZXJDYW5jZWwoZGV2LCBaTV9FVkVOVF9USU1FT1VUX1NDQU4pOworCisgICAgICAgIGlmICggd2QtPnN0YS5iQ2hhbm5lbFNjYW4gPT0gRkFMU0UgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJXT1chISBzY2FuIGlzIGNhbmNlbGxlZFxuIik7CisgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgZ290byByZXBvcnRfc2Nhbl9yZXN1bHQ7CisgICAgICAgIH0KKworCisgICAgICAgIGN1cnJTY2FuVHlwZSA9IHdkLT5zdGEuc2Nhbk1nci5jdXJyU2NhblR5cGU7CisgICAgICAgIHN3aXRjaChjdXJyU2NhblR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgWk1fU0NBTl9NR1JfU0NBTl9FWFRFUk5BTDoKKyAgICAgICAgICAgICAgICBpc0V4dGVybmFsU2NhbiA9IDE7CisKKyAgICAgICAgICAgICAgICBpZiAoIHdkLT5zdGEuc2Nhbk1nci5zY2FuUmVxc1taTV9TQ0FOX01HUl9TQ0FOX0lOVEVSTkFMIC0gMV0gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5zY2FuTWdyLnNjYW5SZXFzW1pNX1NDQU5fTUdSX1NDQU5fSU5URVJOQUwgLSAxXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlzSW50ZXJuYWxTY2FuID0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBaTV9TQ0FOX01HUl9TQ0FOX0lOVEVSTkFMOgorICAgICAgICAgICAgICAgIGlzSW50ZXJuYWxTY2FuID0gMTsKKworICAgICAgICAgICAgICAgIGlmICggd2QtPnN0YS5zY2FuTWdyLnNjYW5SZXFzW1pNX1NDQU5fTUdSX1NDQU5fRVhURVJOQUwgLSAxXSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBCZWNhdXNlIHRoZSBleHRlcm5hbCBzY2FuIHNob3VsZCBwcmUtZW1wdHMgaW50ZXJuYWwgc2Nhbi4KKyAgICAgICAgICAgICAgICAgICAgLy8gU28gdGhpcyBzaGFsbCBub3QgYmUgaGFwcGVuZWQhIQorICAgICAgICAgICAgICAgICAgICB6bV9hc3NlcnQoMCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgem1fYXNzZXJ0KDApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgd2QtPnN0YS5zY2FuTWdyLnNjYW5SZXFzW2N1cnJTY2FuVHlwZSAtIDFdID0gMDsKKyAgICAgICAgd2QtPnN0YS5zY2FuTWdyLnNjYW5TdGFydERlbGF5ID0gMTAwOworICAgICAgICB3ZC0+c3RhLnNjYW5NZ3IuY3VyclNjYW5UeXBlID0gWk1fU0NBTl9NR1JfU0NBTl9OT05FOworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIC8vU2V0IGNoYW5uZWwgYWNjb3JkaW5nIHRvIEFQJ3MgY29uZmlndXJhdGlvbgorICAgICAgICB6ZkNvcmVTZXRGcmVxdWVuY3lFeChkZXYsIHdkLT5mcmVxdWVuY3ksIHdkLT5CYW5kV2lkdGg0MCwKKyAgICAgICAgICAgICAgICB3ZC0+RXh0T2Zmc2V0LCB6ZlNjYW5NZ3JFdmVudFNjYW5Db21wbGV0ZUNiKTsKKworICAgICAgICB3ZC0+c3RhLmJDaGFubmVsU2NhbiA9IEZBTFNFOworCisgICAgICAgICNpZiAxCisgICAgICAgIGlmICh6ZlN0YUlzQ29ubmVjdGVkKGRldikpCisgICAgICAgIHsgLy8gRmluaXNoIHNpdGUgc3VydmV5LCByZXNldCB0aGUgdmFyaWFibGUgdG8gZGV0ZWN0IHVzaW5nIHdyb25nIGZyZXF1ZW5jeSAhCisgICAgICAgICAgICB6ZkhwRmluaXNoU2l0ZVN1cnZleShkZXYsIDEpOworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHdkLT5zdGEuaWJzc1NpdGVTdXJ2ZXlTdGF0dXMgPSAyOworICAgICAgICAgICAgd2QtPnRpY2tJYnNzUmVjZWl2ZUJlYWNvbiA9IDA7CisgICAgICAgICAgICB3ZC0+c3RhLmlic3NSZWNlaXZlQmVhY29uQ291bnQgPSAwOworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAgICAgLyogIzUgUmUtZW5hYmxlIFJJRlMgZnVuY3Rpb24gYWZ0ZXIgdGhlIHNpdGUgc3VydmV5ICEgKi8KKyAgICAgICAgICAgIC8qIFRoaXMgaXMgYmVjYXVzZSBzd2l0Y2ggYmFuZCB3aWxsIHJlc2V0IHRoZSBCQiByZWdpc3RlciB0byBpbml0aWFsIHZhbHVlICovCisgICAgICAgICAgICBpZiggd2QtPnN0YS5yaWZzU3RhdGUgPT0gWk1fUklGU19TVEFURV9ERVRFQ1RFRCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZIcEVuYWJsZVJpZnMoZGV2LCAoKHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeTwzMDAwKT8xOjApLCB3ZC0+c3RhLkVuYWJsZUhULCB3ZC0+c3RhLkhUMjA0MCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6ZkhwRmluaXNoU2l0ZVN1cnZleShkZXYsIDApOworICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIHdkLT5zdGEuaWJzc1NpdGVTdXJ2ZXlTdGF0dXMgPSAwOworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgfQorICAgICAgICAjZW5kaWYKKworcmVwb3J0X3NjYW5fcmVzdWx0OgorICAgICAgICAvKiBhdm9pZCBsb3NlIHJlY2VpdmUgcGFja2V0IHdoZW4gc2l0ZSBzdXJ2ZXkgKi8KKyAgICAgICAgLy9pZiAoKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSkgJiYgKCF6ZlBvd2VyU2F2aW5nTWdySXNTbGVlcGluZyhkZXYpKSkKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIHpmU2VuZE51bGxEYXRhKGRldiwgMCk7CisgICAgICAgIC8vfQorCisgICAgICAgIGlmICggaXNFeHRlcm5hbFNjYW4gKS8vUXVpY2tseSByZWJvb3QKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdkLT56ZmNiU2Nhbk5vdGlmeSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT56ZmNiU2Nhbk5vdGlmeShkZXYsIE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCBpc0ludGVybmFsU2NhbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vd2QtPnN0YS5JbnRlcm5hbFNjYW5SZXEgPSAwOworICAgICAgICAgICAgemZTdGFSZWNvbm5lY3QoZGV2KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3ZC0+c3RhLnNjYW5GcmVxdWVuY3kgPSBuZXh0U2NhbkZyZXF1ZW5jeTsKKworICAgICAgICAvL3ptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHpmVGltZXJDYW5jZWwoZGV2LCBaTV9FVkVOVF9JTl9TQ0FOKTsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJzY2FuIDIiKTsKKyAgICAgICAgemZDb3JlU2V0RnJlcXVlbmN5VjIoZGV2LCB3ZC0+c3RhLnNjYW5GcmVxdWVuY3ksIHpmU2Nhbk1nckV2ZW50U2V0RnJlcUNvbXBsZXRlQ2IpOworCisgICAgICAgIHJldHVybiAxOworICAgIH0KK30KKwordm9pZCB6ZlNjYW5NZ3JTY2FuRXZlbnRTdGFydCh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgaWYgKCB3ZC0+c3RhLmJDaGFubmVsU2NhbiApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgemZQb3dlclNhdmluZ01ncldha2V1cChkZXYpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICggd2QtPnN0YS5zY2FuTWdyLmN1cnJTY2FuVHlwZSA9PSBaTV9TQ0FOX01HUl9TQ0FOX05PTkUgKQorICAgIHsKKyAgICAgICAgZ290byBub19zY2FuOworICAgIH0KKworICAgIC8vemZCc3NJbmZvUmVmcmVzaChkZXYpOworICAgIHpmQnNzSW5mb1JlZnJlc2goZGV2LCAwKTsKKyAgICB3ZC0+c3RhLmJDaGFubmVsU2NhbiA9IFRSVUU7CisgICAgd2QtPnN0YS5iU2NoZWR1bGVTY2FuID0gRkFMU0U7CisgICAgemZUaW1lckNhbmNlbChkZXYsIFpNX0VWRU5UX0lOX1NDQU4pOworICAgIHpmVGltZXJDYW5jZWwoZGV2LCBaTV9FVkVOVF9USU1FT1VUX1NDQU4pOworCisgICAgLy96bV9kZWJ1Z19tc2cxKCJzdGFydCBzY2FuID0gIiwgS2VRdWVyeUludGVycnVwdFRpbWUoKSk7CisgICAgd2QtPnN0YS5zY2FuRnJlcXVlbmN5ID0gemZDaEdldEZpcnN0Q2hhbm5lbChkZXYsICZ3ZC0+c3RhLmJQYXNzaXZlU2Nhbik7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIC8qIGF2b2lkIGxvc2UgcmVjZWl2ZSBwYWNrZXQgd2hlbiBzaXRlIHN1cnZleSAqLworICAgIC8vaWYgKCh6ZlN0YUlzQ29ubmVjdGVkKGRldikpICYmICghemZQb3dlclNhdmluZ01ncklzU2xlZXBpbmcoZGV2KSkpCisgICAgLy97CisgICAgLy8gICAgemZTZW5kTnVsbERhdGEoZGV2LCAxKTsKKyAgICAvL30KKy8vICAgIHptX2RlYnVnX21zZzAoInNjYW4gMCIpOworLy8gICAgemZDb3JlU2V0RnJlcXVlbmN5VjIoZGV2LCB3ZC0+c3RhLnNjYW5GcmVxdWVuY3ksIHpmU2Nhbk1nckV2ZW50U2V0RnJlcUNvbXBsZXRlQ2IpOworCisgICAgI2lmIDEKKyAgICBpZiAoemZTdGFJc0Nvbm5lY3RlZChkZXYpKQorICAgIHsvLyBJZiBkb2luZyBzaXRlIHN1cnZleSAhCisgICAgICAgIHpmSHBCZWdpblNpdGVTdXJ2ZXkoZGV2LCAxKTsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgd2QtPnN0YS5pYnNzU2l0ZVN1cnZleVN0YXR1cyA9IDE7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHpmSHBCZWdpblNpdGVTdXJ2ZXkoZGV2LCAwKTsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgd2QtPnN0YS5pYnNzU2l0ZVN1cnZleVN0YXR1cyA9IDA7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgfQorICAgICNlbmRpZgorCisgICAgem1fZGVidWdfbXNnMCgic2NhbiAwIik7CisgICAgemZDb3JlU2V0RnJlcXVlbmN5VjIoZGV2LCB3ZC0+c3RhLnNjYW5GcmVxdWVuY3ksIHpmU2Nhbk1nckV2ZW50U2V0RnJlcUNvbXBsZXRlQ2IpOworCisgICAgcmV0dXJuOworCitub19zY2FuOgorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2N0a2lwLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY3RraXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTQyZjdhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2N0a2lwLmMKQEAgLTAsMCArMSw1OTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IGN0a2lwLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgVHggYW5kIFJ4IGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJjcHJlY29tcC5oIgorCit1MTZfdCB6Z1RraXBTYm94TG93ZXJbMjU2XSA9CisgICAgeworICAgICAgICAweEE1LDB4ODQsMHg5OSwweDhELDB4MEQsMHhCRCwweEIxLDB4NTQsCisgICAgICAgIDB4NTAsMHgwMywweEE5LDB4N0QsMHgxOSwweDYyLDB4RTYsMHg5QSwKKyAgICAgICAgMHg0NSwweDlELDB4NDAsMHg4NywweDE1LDB4RUIsMHhDOSwweDBCLAorICAgICAgICAweEVDLDB4NjcsMHhGRCwweEVBLDB4QkYsMHhGNywweDk2LDB4NUIsCisgICAgICAgIDB4QzIsMHgxQywweEFFLDB4NkEsMHg1QSwweDQxLDB4MDIsMHg0RiwKKyAgICAgICAgMHg1QywweEY0LDB4MzQsMHgwOCwweDkzLDB4NzMsMHg1MywweDNGLAorICAgICAgICAweDBDLDB4NTIsMHg2NSwweDVFLDB4MjgsMHhBMSwweDBGLDB4QjUsCisgICAgICAgIDB4MDksMHgzNiwweDlCLDB4M0QsMHgyNiwweDY5LDB4Q0QsMHg5RiwKKyAgICAgICAgMHgxQiwweDlFLDB4NzQsMHgyRSwweDJELDB4QjIsMHhFRSwweEZCLAorICAgICAgICAweEY2LDB4NEQsMHg2MSwweENFLDB4N0IsMHgzRSwweDcxLDB4OTcsCisgICAgICAgIDB4RjUsMHg2OCwweDAwLDB4MkMsMHg2MCwweDFGLDB4QzgsMHhFRCwKKyAgICAgICAgMHhCRSwweDQ2LDB4RDksMHg0QiwweERFLDB4RDQsMHhFOCwweDRBLAorICAgICAgICAweDZCLDB4MkEsMHhFNSwweDE2LDB4QzUsMHhENywweDU1LDB4OTQsCisgICAgICAgIDB4Q0YsMHgxMCwweDA2LDB4ODEsMHhGMCwweDQ0LDB4QkEsMHhFMywKKyAgICAgICAgMHhGMywweEZFLDB4QzAsMHg4QSwweEFELDB4QkMsMHg0OCwweDA0LAorICAgICAgICAweERGLDB4QzEsMHg3NSwweDYzLDB4MzAsMHgxQSwweDBFLDB4NkQsCisgICAgICAgIDB4NEMsMHgxNCwweDM1LDB4MkYsMHhFMSwweEEyLDB4Q0MsMHgzOSwKKyAgICAgICAgMHg1NywweEYyLDB4ODIsMHg0NywweEFDLDB4RTcsMHgyQiwweDk1LAorICAgICAgICAweEEwLDB4OTgsMHhEMSwweDdGLDB4NjYsMHg3RSwweEFCLDB4ODMsCisgICAgICAgIDB4Q0EsMHgyOSwweEQzLDB4M0MsMHg3OSwweEUyLDB4MUQsMHg3NiwKKyAgICAgICAgMHgzQiwweDU2LDB4NEUsMHgxRSwweERCLDB4MEEsMHg2QywweEU0LAorICAgICAgICAweDVELDB4NkUsMHhFRiwweEE2LDB4QTgsMHhBNCwweDM3LDB4OEIsCisgICAgICAgIDB4MzIsMHg0MywweDU5LDB4QjcsMHg4QywweDY0LDB4RDIsMHhFMCwKKyAgICAgICAgMHhCNCwweEZBLDB4MDcsMHgyNSwweEFGLDB4OEUsMHhFOSwweDE4LAorICAgICAgICAweEQ1LDB4ODgsMHg2RiwweDcyLDB4MjQsMHhGMSwweEM3LDB4NTEsCisgICAgICAgIDB4MjMsMHg3QywweDlDLDB4MjEsMHhERCwweERDLDB4ODYsMHg4NSwKKyAgICAgICAgMHg5MCwweDQyLDB4QzQsMHhBQSwweEQ4LDB4MDUsMHgwMSwweDEyLAorICAgICAgICAweEEzLDB4NUYsMHhGOSwweEQwLDB4OTEsMHg1OCwweDI3LDB4QjksCisgICAgICAgIDB4MzgsMHgxMywweEIzLDB4MzMsMHhCQiwweDcwLDB4ODksMHhBNywKKyAgICAgICAgMHhCNiwweDIyLDB4OTIsMHgyMCwweDQ5LDB4RkYsMHg3OCwweDdBLAorICAgICAgICAweDhGLDB4RjgsMHg4MCwweDE3LDB4REEsMHgzMSwweEM2LDB4QjgsCisgICAgICAgIDB4QzMsMHhCMCwweDc3LDB4MTEsMHhDQiwweEZDLDB4RDYsMHgzQQorICAgIH07CisKKwordTE2X3QgemdUa2lwU2JveFVwcGVyWzI1Nl0gPQorICAgIHsKKyAgICAgICAgMHhDNiwweEY4LDB4RUUsMHhGNiwweEZGLDB4RDYsMHhERSwweDkxLAorICAgICAgICAweDYwLDB4MDIsMHhDRSwweDU2LDB4RTcsMHhCNSwweDRELDB4RUMsCisgICAgICAgIDB4OEYsMHgxRiwweDg5LDB4RkEsMHhFRiwweEIyLDB4OEUsMHhGQiwKKyAgICAgICAgMHg0MSwweEIzLDB4NUYsMHg0NSwweDIzLDB4NTMsMHhFNCwweDlCLAorICAgICAgICAweDc1LDB4RTEsMHgzRCwweDRDLDB4NkMsMHg3RSwweEY1LDB4ODMsCisgICAgICAgIDB4NjgsMHg1MSwweEQxLDB4RjksMHhFMiwweEFCLDB4NjIsMHgyQSwKKyAgICAgICAgMHgwOCwweDk1LDB4NDYsMHg5RCwweDMwLDB4MzcsMHgwQSwweDJGLAorICAgICAgICAweDBFLDB4MjQsMHgxQiwweERGLDB4Q0QsMHg0RSwweDdGLDB4RUEsCisgICAgICAgIDB4MTIsMHgxRCwweDU4LDB4MzQsMHgzNiwweERDLDB4QjQsMHg1QiwKKyAgICAgICAgMHhBNCwweDc2LDB4QjcsMHg3RCwweDUyLDB4REQsMHg1RSwweDEzLAorICAgICAgICAweEE2LDB4QjksMHgwMCwweEMxLDB4NDAsMHhFMywweDc5LDB4QjYsCisgICAgICAgIDB4RDQsMHg4RCwweDY3LDB4NzIsMHg5NCwweDk4LDB4QjAsMHg4NSwKKyAgICAgICAgMHhCQiwweEM1LDB4NEYsMHhFRCwweDg2LDB4OUEsMHg2NiwweDExLAorICAgICAgICAweDhBLDB4RTksMHgwNCwweEZFLDB4QTAsMHg3OCwweDI1LDB4NEIsCisgICAgICAgIDB4QTIsMHg1RCwweDgwLDB4MDUsMHgzRiwweDIxLDB4NzAsMHhGMSwKKyAgICAgICAgMHg2MywweDc3LDB4QUYsMHg0MiwweDIwLDB4RTUsMHhGRCwweEJGLAorICAgICAgICAweDgxLDB4MTgsMHgyNiwweEMzLDB4QkUsMHgzNSwweDg4LDB4MkUsCisgICAgICAgIDB4OTMsMHg1NSwweEZDLDB4N0EsMHhDOCwweEJBLDB4MzIsMHhFNiwKKyAgICAgICAgMHhDMCwweDE5LDB4OUUsMHhBMywweDQ0LDB4NTQsMHgzQiwweDBCLAorICAgICAgICAweDhDLDB4QzcsMHg2QiwweDI4LDB4QTcsMHhCQywweDE2LDB4QUQsCisgICAgICAgIDB4REIsMHg2NCwweDc0LDB4MTQsMHg5MiwweDBDLDB4NDgsMHhCOCwKKyAgICAgICAgMHg5RiwweEJELDB4NDMsMHhDNCwweDM5LDB4MzEsMHhEMywweEYyLAorICAgICAgICAweEQ1LDB4OEIsMHg2RSwweERBLDB4MDEsMHhCMSwweDlDLDB4NDksCisgICAgICAgIDB4RDgsMHhBQywweEYzLDB4Q0YsMHhDQSwweEY0LDB4NDcsMHgxMCwKKyAgICAgICAgMHg2RiwweEYwLDB4NEEsMHg1QywweDM4LDB4NTcsMHg3MywweDk3LAorICAgICAgICAweENCLDB4QTEsMHhFOCwweDNFLDB4OTYsMHg2MSwweDBELDB4MEYsCisgICAgICAgIDB4RTAsMHg3QywweDcxLDB4Q0MsMHg5MCwweDA2LDB4RjcsMHgxQywKKyAgICAgICAgMHhDMiwweDZBLDB4QUUsMHg2OSwweDE3LDB4OTksMHgzQSwweDI3LAorICAgICAgICAweEQ5LDB4RUIsMHgyQiwweDIyLDB4RDIsMHhBOSwweDA3LDB4MzMsCisgICAgICAgIDB4MkQsMHgzQywweDE1LDB4QzksMHg4NywweEFBLDB4NTAsMHhBNSwKKyAgICAgICAgMHgwMywweDU5LDB4MDksMHgxQSwweDY1LDB4RDcsMHg4NCwweEQwLAorICAgICAgICAweDgyLDB4MjksMHg1QSwweDFFLDB4N0IsMHhBOCwweDZELDB4MkMKKyAgICB9OworCit1MTZfdCB6ZnJvdHIxKHUxNl90IGEpCisvLyByb3RhdGUgcmlnaHQgYnkgMSBiaXQuCit7CisgICAgdTE2X3QgYjsKKworICAgIGlmIChhICYgMHgwMSkKKyAgICB7CisgICAgICAgIGIgPSAoYSA+PiAxKSB8IDB4ODAwMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYiA9IChhID4+IDEpICYgMHg3ZmZmOworICAgIH0KKyAgICByZXR1cm4gYjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiB6ZlRraXBTYm94KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybnMgYSAxNiBiaXQgdmFsdWUgZnJvbSBhIDY0SyBlbnRyeSB0YWJsZS4gVGhlIFRhYmxlICAqLworLyogaXMgc3ludGhlc2l6ZWQgZnJvbSB0d28gMjU2IGVudHJ5IGJ5dGUgd2lkZSB0YWJsZXMuICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmVGtpcFNib3godTE2X3QgaW5kZXgpCit7CisgICAgdTE2X3QgICBsb3c7CisgICAgdTE2X3QgICBoaWdoOworICAgIHUxNl90ICAgbGVmdCwgcmlnaHQ7CisKKyAgICBsb3cgPSAoaW5kZXggJiAweEZGKTsKKyAgICBoaWdoID0gKChpbmRleCA+PiA4KSAmIDB4RkYpOworCisgICAgbGVmdCA9IHpnVGtpcFNib3hMb3dlcltsb3ddICsgKHpnVGtpcFNib3hVcHBlcltsb3ddIDw8IDggKTsKKyAgICByaWdodCA9IHpnVGtpcFNib3hVcHBlcltoaWdoXSArICh6Z1RraXBTYm94TG93ZXJbaGlnaF0gPDwgOCApOworCisgICAgcmV0dXJuIChsZWZ0IF4gcmlnaHQpOworfQorCit1OF90IHpmVGtpcFBoYXNlMUtleU1peCh1MzJfdCBpdjMyLCBzdHJ1Y3QgenNUa2lwU2VlZCogcFNlZWQpCit7CisgICAgdTE2X3QgICB0c2MwOworICAgIHUxNl90ICAgdHNjMTsKKyAgICB1MTZfdCAgIGksIGo7CisjaWYgMAorICAgIC8qIE5lZWQgbm90IHByb2NlZWQgdGhpcyBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIGl2MzIgKi8KKyAgICBpZiAoIGl2MzIgPT0gcFNlZWQtPml2MzIgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorI2VuZGlmCisgICAgdHNjMCA9ICh1MTZfdCkgKChpdjMyID4+IDE2KSAmIDB4ZmZmZik7IC8qIG1zYiAqLworICAgIHRzYzEgPSAodTE2X3QpIChpdjMyICYgMHhmZmZmKTsKKworICAgIC8qIFBoYXNlIDEsIHN0ZXAgMSAqLworICAgIHBTZWVkLT50dGFrWzBdID0gdHNjMTsKKyAgICBwU2VlZC0+dHRha1sxXSA9IHRzYzA7CisgICAgcFNlZWQtPnR0YWtbMl0gPSAodTE2X3QpIChwU2VlZC0+dGFbMF0gKyAocFNlZWQtPnRhWzFdIDw8OCkpOworICAgIHBTZWVkLT50dGFrWzNdID0gKHUxNl90KSAocFNlZWQtPnRhWzJdICsgKHBTZWVkLT50YVszXSA8PDgpKTsKKyAgICBwU2VlZC0+dHRha1s0XSA9ICh1MTZfdCkgKHBTZWVkLT50YVs0XSArIChwU2VlZC0+dGFbNV0gPDw4KSk7CisKKyAgICAvKiBQaGFzZSAxLCBzdGVwIDIgKi8KKyAgICBmb3IgKGk9MDsgaTw4OyBpKyspCisgICAgeworICAgICAgICBqID0gMiooaSAmIDEpOworICAgICAgICBwU2VlZC0+dHRha1swXSA9KHBTZWVkLT50dGFrWzBdICsgemZUa2lwU2JveChwU2VlZC0+dHRha1s0XQorICAgICAgICAgICAgICAgICAgICAgICAgIF4gWk1fQllURV9UT19XT1JEKHBTZWVkLT50a1sxK2pdLCBwU2VlZC0+dGtbal0pKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYgMHhmZmZmOworICAgICAgICBwU2VlZC0+dHRha1sxXSA9KHBTZWVkLT50dGFrWzFdICsgemZUa2lwU2JveChwU2VlZC0+dHRha1swXQorICAgICAgICAgICAgICAgICAgICAgICAgIF4gWk1fQllURV9UT19XT1JEKHBTZWVkLT50a1s1K2pdLCBwU2VlZC0+dGtbNCtqXSApKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYgMHhmZmZmOworICAgICAgICBwU2VlZC0+dHRha1syXSA9KHBTZWVkLT50dGFrWzJdICsgemZUa2lwU2JveChwU2VlZC0+dHRha1sxXQorICAgICAgICAgICAgICAgICAgICAgICAgIF4gWk1fQllURV9UT19XT1JEKHBTZWVkLT50a1s5K2pdLCBwU2VlZC0+dGtbOCtqXSApKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYgMHhmZmZmOworICAgICAgICBwU2VlZC0+dHRha1szXSA9KHBTZWVkLT50dGFrWzNdICsgemZUa2lwU2JveChwU2VlZC0+dHRha1syXQorICAgICAgICAgICAgICAgICAgICAgICAgIF4gWk1fQllURV9UT19XT1JEKHBTZWVkLT50a1sxMytqXSwgcFNlZWQtPnRrWzEyK2pdKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAmIDB4ZmZmZjsKKyAgICAgICAgcFNlZWQtPnR0YWtbNF0gPShwU2VlZC0+dHRha1s0XSArIHpmVGtpcFNib3gocFNlZWQtPnR0YWtbM10KKyAgICAgICAgICAgICAgICAgICAgICAgICBeIFpNX0JZVEVfVE9fV09SRChwU2VlZC0+dGtbMStqXSwgcFNlZWQtPnRrW2pdICApKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYgMHhmZmZmOworICAgICAgICBwU2VlZC0+dHRha1s0XSA9KHBTZWVkLT50dGFrWzRdICsgaSkgJiAweGZmZmY7CisgICAgfQorCisgICAgaWYgKCBpdjMyID09IChwU2VlZC0+aXYzMisxKSApCisgICAgeworICAgICAgICBwU2VlZC0+aXYzMnRtcCA9IGl2MzI7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCit1OF90IHpmVGtpcFBoYXNlMktleU1peCh1MTZfdCBpdjE2LCBzdHJ1Y3QgenNUa2lwU2VlZCogcFNlZWQpCit7CisgICAgdTE2X3QgdHNjMjsKKworICAgIHRzYzIgPSBpdjE2OworCisgICAgLyogUGhhc2UgMiwgU3RlcCAxICovCisgICAgcFNlZWQtPnBwa1swXSA9IHBTZWVkLT50dGFrWzBdOworICAgIHBTZWVkLT5wcGtbMV0gPSBwU2VlZC0+dHRha1sxXTsKKyAgICBwU2VlZC0+cHBrWzJdID0gcFNlZWQtPnR0YWtbMl07CisgICAgcFNlZWQtPnBwa1szXSA9IHBTZWVkLT50dGFrWzNdOworICAgIHBTZWVkLT5wcGtbNF0gPSBwU2VlZC0+dHRha1s0XTsKKyAgICBwU2VlZC0+cHBrWzVdID0gKHBTZWVkLT50dGFrWzRdICsgdHNjMikgJiAweGZmZmY7CisKKyAgICAvKiBQaGFzZTIsIFN0ZXAgMiAqLworICAgIHBTZWVkLT5wcGtbMF0gPSBwU2VlZC0+cHBrWzBdCisgICAgICAgICAgICAgICAgKyB6ZlRraXBTYm94KHBTZWVkLT5wcGtbNV0gXiBaTV9CWVRFX1RPX1dPUkQocFNlZWQtPnRrWzFdLHBTZWVkLT50a1swXSkpOworICAgIHBTZWVkLT5wcGtbMV0gPSBwU2VlZC0+cHBrWzFdCisgICAgICAgICAgICAgICAgKyB6ZlRraXBTYm94KHBTZWVkLT5wcGtbMF0gXiBaTV9CWVRFX1RPX1dPUkQocFNlZWQtPnRrWzNdLHBTZWVkLT50a1syXSkpOworICAgIHBTZWVkLT5wcGtbMl0gPSBwU2VlZC0+cHBrWzJdCisgICAgICAgICAgICAgICAgKyB6ZlRraXBTYm94KHBTZWVkLT5wcGtbMV0gXiBaTV9CWVRFX1RPX1dPUkQocFNlZWQtPnRrWzVdLHBTZWVkLT50a1s0XSkpOworICAgIHBTZWVkLT5wcGtbM10gPSBwU2VlZC0+cHBrWzNdCisgICAgICAgICAgICAgICAgKyB6ZlRraXBTYm94KHBTZWVkLT5wcGtbMl0gXiBaTV9CWVRFX1RPX1dPUkQocFNlZWQtPnRrWzddLHBTZWVkLT50a1s2XSkpOworICAgIHBTZWVkLT5wcGtbNF0gPSBwU2VlZC0+cHBrWzRdCisgICAgICAgICAgICAgICAgKyB6ZlRraXBTYm94KHBTZWVkLT5wcGtbM10gXiBaTV9CWVRFX1RPX1dPUkQocFNlZWQtPnRrWzldLHBTZWVkLT50a1s4XSkpOworICAgIHBTZWVkLT5wcGtbNV0gPSBwU2VlZC0+cHBrWzVdCisgICAgICAgICAgICAgICAgKyB6ZlRraXBTYm94KHBTZWVkLT5wcGtbNF0gXiBaTV9CWVRFX1RPX1dPUkQocFNlZWQtPnRrWzExXSxwU2VlZC0+dGtbMTBdKSk7CisKKyAgICBwU2VlZC0+cHBrWzBdID0gcFNlZWQtPnBwa1swXQorICAgICAgICAgICAgICAgICsgemZyb3RyMShwU2VlZC0+cHBrWzVdIF4gWk1fQllURV9UT19XT1JEKHBTZWVkLT50a1sxM10scFNlZWQtPnRrWzEyXSkpOworICAgIHBTZWVkLT5wcGtbMV0gPSBwU2VlZC0+cHBrWzFdCisgICAgICAgICAgICAgICAgKyB6ZnJvdHIxKHBTZWVkLT5wcGtbMF0gXiBaTV9CWVRFX1RPX1dPUkQocFNlZWQtPnRrWzE1XSxwU2VlZC0+dGtbMTRdKSk7CisgICAgcFNlZWQtPnBwa1syXSA9IHBTZWVkLT5wcGtbMl0gKyB6ZnJvdHIxKHBTZWVkLT5wcGtbMV0pOworICAgIHBTZWVkLT5wcGtbM10gPSBwU2VlZC0+cHBrWzNdICsgemZyb3RyMShwU2VlZC0+cHBrWzJdKTsKKyAgICBwU2VlZC0+cHBrWzRdID0gcFNlZWQtPnBwa1s0XSArIHpmcm90cjEocFNlZWQtPnBwa1szXSk7CisgICAgcFNlZWQtPnBwa1s1XSA9IHBTZWVkLT5wcGtbNV0gKyB6ZnJvdHIxKHBTZWVkLT5wcGtbNF0pOworCisgICAgaWYgKGl2MTYgPT0gMCkKKyAgICB7CisgICAgICAgIGlmIChwU2VlZC0+aXYxNiA9PSAweGZmZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBTZWVkLT5pdjE2dG1wPTA7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSBpZiAoaXYxNiA9PSAocFNlZWQtPml2MTYrMSkpCisgICAgeworICAgICAgICBwU2VlZC0+aXYxNnRtcCA9IGl2MTY7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCit2b2lkIHpmVGtpcEluaXQodThfdCoga2V5LCB1OF90KiB0YSwgc3RydWN0IHpzVGtpcFNlZWQqIHBTZWVkLCB1OF90KiBpbml0SXYpCit7CisgICAgdTE2X3QgIGl2MTY7CisgICAgdTMyX3QgIGl2MzI7CisgICAgdTE2X3QgIGk7CisKKyAgICAvKiBjbGVhciBtZW1vcnkgKi8KKyAgICB6Zlplcm9NZW1vcnkoKHU4X3QqKSBwU2VlZCwgc2l6ZW9mKHN0cnVjdCB6c1RraXBTZWVkKSk7CisgICAgLyogc2V0IGtleSB0byBzZWVkICovCisgICAgemZNZW1vcnlDb3B5KHBTZWVkLT50YSwgdGEsIDYpOworICAgIHpmTWVtb3J5Q29weShwU2VlZC0+dGssIGtleSwgMTYpOworCisgICAgaXYxNiA9ICppbml0SXYrKzsKKyAgICBpdjE2ICs9ICppbml0SXY8PDg7CisgICAgaW5pdEl2Kys7CisKKyAgICBpdjMyPTA7CisKKyAgICBmb3IoaT0wOyBpPDQ7IGkrKykgICAgICAvLyBpbml0aXYgaXMgbGl0dGxlIGVuZGlhbgorICAgIHsKKyAgICAgICAgaXYzMiArPSAqaW5pdEl2PDwoaSo4KTsKKyAgICAgICAgKmluaXRJdisrOworICAgIH0KKworICAgIHBTZWVkLT5pdjMyID0gaXYzMisxOyAvLyBGb3JjZSBSZWNhbGN1bGF0aW5nIG9uIFRraXAgUGhhc2UxCisgICAgemZUa2lwUGhhc2UxS2V5TWl4KGl2MzIsIHBTZWVkKTsKKworICAgIHBTZWVkLT5pdjE2ID0gaXYxNjsKKyAgICBwU2VlZC0+aXYzMiA9IGl2MzI7Cit9CisKK3UzMl90IHpmR2V0VTMydCh1OF90KiBwKQoreworICAgIHUzMl90IHJlcz0wOworICAgIHUxNl90IGk7CisKKyAgICBmb3IoIGk9MDsgaTw0OyBpKysgKQorICAgIHsKKyAgICAgICAgcmVzIHw9ICgqcCsrKSA8PCAoOCppKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworCit9CisKK3ZvaWQgemZQdXRVMzJ0KHU4X3QqIHAsIHUzMl90IHZhbHVlKQoreworICAgIHUxNl90IGk7CisKKyAgICBmb3IoaT0wOyBpPDQ7IGkrKykKKyAgICB7CisgICAgICAgICpwKysgPSAodThfdCkgKHZhbHVlICYgMHhmZik7CisgICAgICAgIHZhbHVlID4+PSA4OworICAgIH0KK30KKwordm9pZCB6Zk1pY0NsZWFyKHN0cnVjdCB6c01pY1ZhciogcE1pYykKK3sKKyAgICBwTWljLT5sZWZ0ID0gcE1pYy0+azA7CisgICAgcE1pYy0+cmlnaHQgPSBwTWljLT5rMTsKKyAgICBwTWljLT5uQnl0ZXMgPSAwOworICAgIHBNaWMtPm0gPSAwOworfQorCit2b2lkIHpmTWljU2V0S2V5KHU4X3QqIGtleSwgc3RydWN0IHpzTWljVmFyKiBwTWljKQoreworICAgIHBNaWMtPmswID0gemZHZXRVMzJ0KGtleSk7CisgICAgcE1pYy0+azEgPSB6ZkdldFUzMnQoa2V5KzQpOworICAgIHpmTWljQ2xlYXIocE1pYyk7Cit9CisKK3ZvaWQgemZNaWNBcHBlbmRCeXRlKHU4X3QgYiwgc3RydWN0IHpzTWljVmFyKiBwTWljKQoreworICAgIC8vIEFwcGVuZCB0aGUgYnl0ZSB0byBvdXIgd29yZC1zaXplZCBidWZmZXIKKyAgICBwTWljLT5tIHw9IGIgPDwgKDgqIHBNaWMtPm5CeXRlcyk7CisgICAgcE1pYy0+bkJ5dGVzKys7CisKKyAgICAvLyBQcm9jZXNzIHRoZSB3b3JkIGlmIGl0IGlzIGZ1bGwuCisgICAgaWYgKCBwTWljLT5uQnl0ZXMgPj0gNCApCisgICAgeworICAgICAgICBwTWljLT5sZWZ0IF49IHBNaWMtPm07CisgICAgICAgIHBNaWMtPnJpZ2h0IF49IFpNX1JPTDMyKHBNaWMtPmxlZnQsIDE3ICk7CisgICAgICAgIHBNaWMtPmxlZnQgKz0gcE1pYy0+cmlnaHQ7CisgICAgICAgIHBNaWMtPnJpZ2h0IF49ICgocE1pYy0+bGVmdCAmIDB4ZmYwMGZmMDApID4+IDgpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgKChwTWljLT5sZWZ0ICYgMHgwMGZmMDBmZikgPDwgOCk7CisgICAgICAgIHBNaWMtPmxlZnQgKz0gcE1pYy0+cmlnaHQ7CisgICAgICAgIHBNaWMtPnJpZ2h0IF49IFpNX1JPTDMyKCBwTWljLT5sZWZ0LCAzICk7CisgICAgICAgIHBNaWMtPmxlZnQgKz0gcE1pYy0+cmlnaHQ7CisgICAgICAgIHBNaWMtPnJpZ2h0IF49IFpNX1JPUjMyKCBwTWljLT5sZWZ0LCAyICk7CisgICAgICAgIHBNaWMtPmxlZnQgKz0gcE1pYy0+cmlnaHQ7CisgICAgICAgIC8vIENsZWFyIHRoZSBidWZmZXIKKyAgICAgICAgcE1pYy0+bSA9IDA7CisgICAgICAgIHBNaWMtPm5CeXRlcyA9IDA7CisgICAgfQorfQorCit2b2lkIHpmTWljR2V0TWljKHU4X3QqIGRzdCwgc3RydWN0IHpzTWljVmFyKiBwTWljKQoreworICAgIC8vIEFwcGVuZCB0aGUgbWluaW11bSBwYWRkaW5nCisgICAgemZNaWNBcHBlbmRCeXRlKDB4NWEsIHBNaWMpOworICAgIHpmTWljQXBwZW5kQnl0ZSgwLCBwTWljKTsKKyAgICB6Zk1pY0FwcGVuZEJ5dGUoMCwgcE1pYyk7CisgICAgemZNaWNBcHBlbmRCeXRlKDAsIHBNaWMpOworICAgIHpmTWljQXBwZW5kQnl0ZSgwLCBwTWljKTsKKworICAgIC8vIGFuZCB0aGVuIHplcm9lcyB1bnRpbCB0aGUgbGVuZ3RoIGlzIGEgbXVsdGlwbGUgb2YgNAorICAgIHdoaWxlKCBwTWljLT5uQnl0ZXMgIT0gMCApCisgICAgeworICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUoMCwgcE1pYyk7CisgICAgfQorCisgICAgLy8gVGhlIGFwcGVuZEJ5dGUgZnVuY3Rpb24gaGFzIGFscmVhZHkgY29tcHV0ZWQgdGhlIHJlc3VsdC4KKyAgICB6ZlB1dFUzMnQoZHN0LCBwTWljLT5sZWZ0KTsKKyAgICB6ZlB1dFUzMnQoZHN0KzQsIHBNaWMtPnJpZ2h0KTsKKworICAgIC8vIFJlc2V0IHRvIHRoZSBlbXB0eSBtZXNzYWdlLgorICAgIHpmTWljQ2xlYXIocE1pYyk7CisKK30KKwordThfdCB6Zk1pY1J4VmVyaWZ5KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICBzdHJ1Y3QgenNNaWNWYXIqICBwTWljS2V5OworICAgIHN0cnVjdCB6c01pY1ZhciAgICBNeU1pY0tleTsKKyAgICB1OF90ICAgbWljWzhdOworICAgIHU4X3QgICBkYVs2XTsKKyAgICB1OF90ICAgc2FbNl07CisgICAgdThfdCAgIGJWYWx1ZTsKKyAgICB1MTZfdCAgaSwgcGF5bG9hZE9mZnNldCwgdGFpbE9mZnNldDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIG5lZWQgbm90IGNoZWNrIE1JQyBpZiBwTWljS0V5IGlzIGVxdWFsIHRvIE5VTEwgKi8KKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQICkKKyAgICB7CisgICAgICAgIHBNaWNLZXkgPSB6ZkFwR2V0UnhNaWNLZXkoZGV2LCBidWYpOworCisgICAgICAgIGlmICggcE1pY0tleSAhPSBOVUxMICkKKyAgICAgICAgeworICAgICAgICAgICAgemZDb3B5RnJvbVJ4QnVmZmVyKGRldiwgYnVmLCBzYSwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VULCA2KTsKKyAgICAgICAgICAgIHpmQ29weUZyb21SeEJ1ZmZlcihkZXYsIGJ1ZiwgZGEsIFpNX1dMQU5fSEVBREVSX0EzX09GRlNFVCwgNik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gWk1fTUlDX1NVQ0NFU1M7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICB7CisgICAgICAgIHBNaWNLZXkgPSB6ZlN0YUdldFJ4TWljS2V5KGRldiwgYnVmKTsKKworICAgICAgICBpZiAoIHBNaWNLZXkgIT0gTlVMTCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmQ29weUZyb21SeEJ1ZmZlcihkZXYsIGJ1Ziwgc2EsIFpNX1dMQU5fSEVBREVSX0EzX09GRlNFVCwgNik7CisgICAgICAgICAgICB6ZkNvcHlGcm9tUnhCdWZmZXIoZGV2LCBidWYsIGRhLCBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQsIDYpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFpNX01JQ19TVUNDRVNTOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBaTV9NSUNfU1VDQ0VTUzsKKyAgICB9CisKKyAgICBNeU1pY0tleS5rMD1wTWljS2V5LT5rMDsKKyAgICBNeU1pY0tleS5rMT1wTWljS2V5LT5rMTsKKyAgICBwTWljS2V5ID0gJk15TWljS2V5OworCisgICAgemZNaWNDbGVhcihwTWljS2V5KTsKKyAgICB0YWlsT2Zmc2V0ID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CisgICAgdGFpbE9mZnNldCAtPSA4OworCisgICAgLyogYXBwZW5kIERBICovCisgICAgZm9yKGk9MDsgaTw2OyBpKyspCisgICAgeworICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUoZGFbaV0sIHBNaWNLZXkpOworICAgIH0KKyAgICAvKiBhcHBlbmQgU0EgKi8KKyAgICBmb3IoaT0wOyBpPDY7IGkrKykKKyAgICB7CisgICAgICAgIHpmTWljQXBwZW5kQnl0ZShzYVtpXSwgcE1pY0tleSk7CisgICAgfQorCisgICAgLyogYXBwZW5kIGZvciBhbGlnbm1lbnQgKi8KKyAgICBpZiAoKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDApICYgMHg4MCkgIT0gMCkKKyAgICAgICAgemZNaWNBcHBlbmRCeXRlKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsMjQpJjB4NywgcE1pY0tleSk7CisgICAgZWxzZQorICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUoMCwgcE1pY0tleSk7CisgICAgemZNaWNBcHBlbmRCeXRlKDAsIHBNaWNLZXkpOworICAgIHpmTWljQXBwZW5kQnl0ZSgwLCBwTWljS2V5KTsKKyAgICB6Zk1pY0FwcGVuZEJ5dGUoMCwgcE1pY0tleSk7CisKKyAgICAvKiBhcHBlbmQgcGF5bG9hZCAqLworICAgIHBheWxvYWRPZmZzZXQgPSBaTV9TSVpFX09GX1dMQU5fREFUQV9IRUFERVIgKworICAgICAgICAgICAgICAgICAgICBaTV9TSVpFX09GX0lWICsKKyAgICAgICAgICAgICAgICAgICAgWk1fU0laRV9PRl9FWFRfSVY7CisKKyAgICBpZiAoKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDApICYgMHg4MCkgIT0gMCkKKyAgICB7CisgICAgICAgIC8qIFFvcyBQYWNrZXQsIFBsY3BoZWFkZXIgKyAyICovCisgICAgICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogVE9ETyA6IFJ4IFFvcyBlbGVtZW50IG9mZnNldCBpbiBzb2Z0d2FyZSBNSUMgY2hlY2sgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdkLT5zdGEud21lQ29ubmVjdGVkICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGF5bG9hZE9mZnNldCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yKGk9cGF5bG9hZE9mZnNldDsgaTx0YWlsT2Zmc2V0OyBpKyspCisgICAgeworICAgICAgICBiVmFsdWUgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBpKTsKKyAgICAgICAgemZNaWNBcHBlbmRCeXRlKGJWYWx1ZSwgcE1pY0tleSk7CisgICAgfQorCisgICAgemZNaWNHZXRNaWMobWljLCBwTWljS2V5KTsKKworICAgIGlmICggIXpmUnhCdWZmZXJFcXVhbFRvU3RyKGRldiwgYnVmLCBtaWMsIHRhaWxPZmZzZXQsIDgpICkKKyAgICB7CisgICAgICAgIHJldHVybiBaTV9NSUNfRkFJTFVSRTsKKyAgICB9CisKKyAgICByZXR1cm4gWk1fTUlDX1NVQ0NFU1M7Cit9CisKK3ZvaWQgemZUa2lwR2V0c2VlZHModTE2X3QgaXYxNiwgdThfdCAqUkM0S2V5LCBzdHJ1Y3QgenNUa2lwU2VlZCAqU2VlZCkKK3sKKyAgICBSQzRLZXlbMF0gID0gWk1fSEk4KGl2MTYpOworICAgIFJDNEtleVsxXSAgPSAoWk1fSEk4KGl2MTYpIHwgMHgyMCkgJiAweDdmOworICAgIFJDNEtleVsyXSAgPSBaTV9MTzgoaXYxNik7CisgICAgUkM0S2V5WzNdICA9ICgoU2VlZC0+cHBrWzVdIF4gWk1fQllURV9UT19XT1JEKFNlZWQtPnRrWzFdLFNlZWQtPnRrWzBdKSk+PjEpICYgMHhmZjsKKyAgICBSQzRLZXlbNF0gID0gU2VlZC0+cHBrWzBdICYgMHhmZjsKKyAgICBSQzRLZXlbNV0gID0gU2VlZC0+cHBrWzBdID4+IDg7CisgICAgUkM0S2V5WzZdICA9IFNlZWQtPnBwa1sxXSAmIDB4ZmY7CisgICAgUkM0S2V5WzddICA9IFNlZWQtPnBwa1sxXSA+PiA4OworICAgIFJDNEtleVs4XSAgPSBTZWVkLT5wcGtbMl0gJiAweGZmOworICAgIFJDNEtleVs5XSAgPSBTZWVkLT5wcGtbMl0gPj4gODsKKyAgICBSQzRLZXlbMTBdID0gU2VlZC0+cHBrWzNdICYgMHhmZjsKKyAgICBSQzRLZXlbMTFdID0gU2VlZC0+cHBrWzNdID4+IDg7CisgICAgUkM0S2V5WzEyXSA9IFNlZWQtPnBwa1s0XSAmIDB4ZmY7CisgICAgUkM0S2V5WzEzXSA9IFNlZWQtPnBwa1s0XSA+PiA4OworICAgIFJDNEtleVsxNF0gPSBTZWVkLT5wcGtbNV0gJiAweGZmOworICAgIFJDNEtleVsxNV0gPSBTZWVkLT5wcGtbNV0gPj4gODsKK30KKwordm9pZCB6ZkNhbFR4TWljKHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZiwgdThfdCAqc25hcCwgdTE2X3Qgc25hcExlbiwgdTE2X3Qgb2Zmc2V0LCB1MTZfdCAqZGEsIHUxNl90ICpzYSwgdThfdCB1cCwgdThfdCAqbWljKQoreworICAgIHN0cnVjdCB6c01pY1ZhciogIHBNaWNLZXk7CisgICAgdTE2X3QgIGk7CisgICAgdTE2X3QgbGVuOworICAgIHU4X3QgYlZhbHVlOworICAgIHU4X3QgcW9zVHlwZTsKKyAgICB1OF90ICpwRGEgPSAodThfdCAqKWRhOworICAgIHU4X3QgKnBTYSA9ICh1OF90ICopc2E7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBuZWVkIG5vdCBjaGVjayBNSUMgaWYgcE1pY0tFeSBpcyBlcXVhbCB0byBOVUxMICovCisgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCApCisgICAgeworICAgICAgICBwTWljS2V5ID0gemZBcEdldFR4TWljS2V5KGRldiwgYnVmLCAmcW9zVHlwZSk7CisKKyAgICAgICAgaWYgKCBwTWljS2V5ID09IE5VTEwgKQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbHNlIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgIHsKKyAgICAgICAgcE1pY0tleSA9IHpmU3RhR2V0VHhNaWNLZXkoZGV2LCBidWYpOworCisgICAgICAgIGlmICggcE1pY0tleSA9PSBOVUxMICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgicE1pY0tleSBpcyBOVUxMIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHpmTWljQ2xlYXIocE1pY0tleSk7CisgICAgbGVuID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CisKKyAgICAvKiBhcHBlbmQgREEgKi8KKyAgICBmb3IoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgeworICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUocERhW2ldLCBwTWljS2V5KTsKKyAgICB9CisKKyAgICAvKiBhcHBlbmQgU0EgKi8KKyAgICBmb3IoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgeworICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUocFNhW2ldLCBwTWljS2V5KTsKKyAgICB9CisKKyAgICBpZiAodXAgIT0gMCkKKyAgICAgICAgemZNaWNBcHBlbmRCeXRlKCh1cCYweDcpLCBwTWljS2V5KTsKKyAgICBlbHNlCisgICAgICAgIHpmTWljQXBwZW5kQnl0ZSgwLCBwTWljS2V5KTsKKworICAgIHpmTWljQXBwZW5kQnl0ZSgwLCBwTWljS2V5KTsKKyAgICB6Zk1pY0FwcGVuZEJ5dGUoMCwgcE1pY0tleSk7CisgICAgemZNaWNBcHBlbmRCeXRlKDAsIHBNaWNLZXkpOworCisgICAgLyogRm9yIFNuYXAgaGVhZGVyICovCisgICAgZm9yKGkgPSAwOyBpIDwgc25hcExlbjsgaSsrKQorICAgIHsKKyAgICAgICAgemZNaWNBcHBlbmRCeXRlKHNuYXBbaV0sIHBNaWNLZXkpOworICAgIH0KKworICAgIGZvcihpID0gb2Zmc2V0OyBpIDwgbGVuOyBpKyspCisgICAgeworICAgICAgICBiVmFsdWUgPSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBpKTsKKyAgICAgICAgemZNaWNBcHBlbmRCeXRlKGJWYWx1ZSwgcE1pY0tleSk7CisgICAgfQorCisgICAgemZNaWNHZXRNaWMobWljLCBwTWljS2V5KTsKK30KKwordm9pZCB6ZlRLSVBFbmNyeXB0KHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZiwgdThfdCAqc25hcCwgdTE2X3Qgc25hcExlbiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGtleUxlbiwgdThfdCoga2V5LCB1MzJfdCogaWN2KQoreworICAgIHU4X3QgaXZbM107CisKKyAgICBpdlswXSA9IGtleVswXTsKKyAgICBpdlsxXSA9IGtleVsxXTsKKyAgICBpdlsyXSA9IGtleVsyXTsKKworICAgIGtleUxlbiAtPSAzOworCisgICAgemZXRVBFbmNyeXB0KGRldiwgYnVmLCBzbmFwLCBzbmFwTGVuLCBvZmZzZXQsIGtleUxlbiwgJmtleVszXSwgaXYpOworfQorCit1MTZfdCB6ZlRLSVBEZWNyeXB0KHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGtleUxlbiwgdThfdCoga2V5KQoreworICAgIHUxNl90IHJldCA9IFpNX0lDVl9TVUNDRVNTOworICAgIHU4X3QgaXZbM107CisKKyAgICBpdlswXSA9IGtleVswXTsKKyAgICBpdlsxXSA9IGtleVsxXTsKKyAgICBpdlsyXSA9IGtleVsyXTsKKworICAgIGtleUxlbiAtPSAzOworCisgICAgcmV0ID0gemZXRVBEZWNyeXB0KGRldiwgYnVmLCBvZmZzZXQsIGtleUxlbiwgJmtleVszXSwgaXYpOworCisgICAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jdHhyeC5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2N0eHJ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI1OGE3ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jdHhyeC5jCkBAIC0wLDAgKzEsNDA5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogaHRyLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBUeCBhbmQgUnggZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgImNwcmVjb21wLmgiCisKK3UxNl90IHpmV2xhblJ4VmFsaWRhdGUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3UxNl90IHpmV2xhblJ4RmlsdGVyKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7CisKKworCitjb25zdCB1OF90IHpnU25hcEJyaWRnZVR1bm5lbFs2XSA9IHsgMHhBQSwgMHhBQSwgMHgwMywgMHgwMCwgMHgwMCwgMHhGOCB9OworY29uc3QgdThfdCB6Z1NuYXA4MDIxaFs2XSA9IHsgMHhBQSwgMHhBQSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCB9OworLyogVGFibGUgZm9yIGNvbnZlcnRpbmcgSVAgRFNDUCBQMi1QMCBiaXRzIHRvIDgwMi4xMWUgQWNjZXNzIENhdGVnb3J5ICovCitjb25zdCB1OF90IHpjVXBUb0FjWzhdID0gezAsIDEsIDEsIDAsIDIsIDIsIDMsIDN9OyAvL1dNTSBkZWZhdWx0CisvL2NvbnN0IHU4X3QgemNVcFRvQWNbOF0gPSB7MCwgMSwgMSwgMCwgMCwgMCwgMCwgMH07IC8vRm9yIDIgVHhRCisvL2NvbnN0IHU4X3QgemNVcFRvQWNbOF0gPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMH07IC8vRm9yIHNpbmdsZSBUeFEKK2NvbnN0IHU4X3QgemNNYXhzcFRvUGt0TnVtWzRdID0gezgsIDIsIDQsIDZ9OworCit1OF90IHpmR2V0RW5jcnlNb2RlRnJvbVJ4U3RhdHVzKHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogYWRkSW5mbykKK3sKKyAgICB1OF90IHNlY3VyaXR5Qnl0ZTsKKyAgICB1OF90IGVuY3J5TW9kZTsKKworICAgIHNlY3VyaXR5Qnl0ZSA9IChhZGRJbmZvLT5UYWlsLkRhdGEuU0FJbmRleCAmIDB4YzApID4+IDQ7ICAvKiBieXRlNCAqLworICAgIHNlY3VyaXR5Qnl0ZSB8PSAoYWRkSW5mby0+VGFpbC5EYXRhLkRBSW5kZXggJiAweGMwKSA+PiA2OyAvKiBieXRlNSAqLworCisgICAgc3dpdGNoKCBzZWN1cml0eUJ5dGUgKQorICAgIHsKKyAgICAgICAgY2FzZSBaTV9OT19XRVA6CisgICAgICAgIGNhc2UgWk1fV0VQNjQ6CisgICAgICAgIGNhc2UgWk1fV0VQMTI4OgorICAgICAgICBjYXNlIFpNX1dFUDI1NjoKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICBjYXNlIFpNX0NFTkM6CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICBjYXNlIFpNX1RLSVA6CisgICAgICAgIGNhc2UgWk1fQUVTOgorCisgICAgICAgICAgICBlbmNyeU1vZGUgPSBzZWN1cml0eUJ5dGU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorCisgICAgICAgICAgICBpZiAoIChzZWN1cml0eUJ5dGUgJiAweGY4KSA9PSAweDA4ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBkZWNyeXB0ZWQgYnkgc29mdHdhcmUKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZW5jcnlNb2RlID0gWk1fTk9fV0VQOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGVuY3J5TW9kZTsKK30KKwordm9pZCB6ZkdldFJ4SXZJY3ZMZW5ndGgoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90IHZhcCwgdTE2X3QqIHBJdkxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90KiBwSWN2TGVuLCBzdHJ1Y3QgenNBZGRpdGlvbkluZm8qIGFkZEluZm8pCit7CisgICAgdTE2X3Qgd2RzUG9ydDsKKyAgICB1OF90ICBlbmNyeU1vZGU7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAqcEl2TGVuID0gMDsKKyAgICAqcEljdkxlbiA9IDA7CisKKyAgICBlbmNyeU1vZGUgPSB6ZkdldEVuY3J5TW9kZUZyb21SeFN0YXR1cyhhZGRJbmZvKTsKKworICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfQVAgKQorICAgIHsKKyAgICAgICAgaWYgKHZhcCA8IFpNX01BWF9BUF9TVVBQT1JUKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKCB3ZC0+YXAuZW5jcnlNb2RlW3ZhcF0gPT0gWk1fV0VQNjQgKSB8fAorICAgICAgICAgICAgICAgICAgICAoIHdkLT5hcC5lbmNyeU1vZGVbdmFwXSA9PSBaTV9XRVAxMjggKSB8fAorICAgICAgICAgICAgICAgICAgICAoIHdkLT5hcC5lbmNyeU1vZGVbdmFwXSA9PSBaTV9XRVAyNTYgKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcEl2TGVuID0gNDsKKyAgICAgICAgICAgICAgICAqcEljdkxlbiA9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdTE2X3QgaWQ7CisgICAgICAgICAgICAgICAgdTE2X3QgYWRkclszXTsKKworICAgICAgICAgICAgICAgIGFkZHJbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQpOworICAgICAgICAgICAgICAgIGFkZHJbMV0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQrMik7CisgICAgICAgICAgICAgICAgYWRkclsyXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0EyX09GRlNFVCs0KTsKKworICAgICAgICAgICAgICAgIC8qIEZpbmQgU1RBJ3MgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgICAgICBpZiAoKGlkID0gemZBcEZpbmRTdGEoZGV2LCBhZGRyKSkgIT0gMHhmZmZmKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5hcC5zdGFUYWJsZVtpZF0uZW5jcnlNb2RlID09IFpNX1RLSVApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwSXZMZW4gPSA4OworICAgICAgICAgICAgICAgICAgICAgICAgKnBJY3ZMZW4gPSA0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdkLT5hcC5zdGFUYWJsZVtpZF0uZW5jcnlNb2RlID09IFpNX0FFUykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKnBJdkxlbiA9IDg7CisgICAgICAgICAgICAgICAgICAgICAgICAqcEljdkxlbiA9IDg7IC8vIEFFUyBNSUMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vKnBJY3ZMZW4gPSAwOworICAgICAgICAgICAgICAgICAgICB9CisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAod2QtPmFwLnN0YVRhYmxlW2lkXS5lbmNyeU1vZGUgPT0gWk1fQ0VOQykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKnBJdkxlbiA9IDE4OworICAgICAgICAgICAgICAgICAgICAgICAgKnBJY3ZMZW49IDE2OworICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFdEUyBwb3J0IGNoZWNraW5nICovCisgICAgICAgICAgICBpZiAoKHdkc1BvcnQgPSB2YXAgLSAweDIwKSA+PSBaTV9NQVhfV0RTX1NVUFBPUlQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2RzUG9ydCA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAod2QtPmFwLndkcy5lbmNyeU1vZGVbd2RzUG9ydF0pCisJCQl7CisJCQljYXNlIFpNX1dFUDY0OgorCQkJY2FzZSBaTV9XRVAxMjg6CisJCQljYXNlIFpNX1dFUDI1NjoKKyAgICAgICAgICAgICAgICAqcEl2TGVuID0gNDsKKyAgICAgICAgICAgICAgICAqcEljdkxlbiA9IDQ7CisJCQkJYnJlYWs7CisJCQljYXNlIFpNX1RLSVA6CisgICAgICAgICAgICAgICAgKnBJdkxlbiA9IDg7CisgICAgICAgICAgICAgICAgKnBJY3ZMZW4gPSA0OworCQkJCWJyZWFrOworCQkJY2FzZSBaTV9BRVM6CisgICAgICAgICAgICAgICAgKnBJdkxlbiA9IDg7CisgICAgICAgICAgICAgICAgKnBJY3ZMZW4gPSAwOworCQkJCWJyZWFrOworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICBjYXNlIFpNX0NFTkM6CisgICAgICAgICAgICAgICAgKnBJdkxlbiA9IDE4OworICAgICAgICAgICAgICAgICpwSWN2TGVuID0gMTY7CisJCQkJYnJlYWs7CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworCQkJfS8qIGVuZCBvZiBzd2l0Y2ggKi8KKyAgICAgICAgfQorICAgIH0KKwllbHNlIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfUFNFVURPKQorICAgIHsKKyAgICAgICAgLyogdGVzdDogNjUxOCBmb3IgUUEgYXV0byB0ZXN0ICovCisgICAgICAgIHN3aXRjaCAoZW5jcnlNb2RlKQorCQl7CisgICAgICAgIGNhc2UgWk1fV0VQNjQ6CisgICAgICAgIGNhc2UgWk1fV0VQMTI4OgorICAgICAgICBjYXNlIFpNX1dFUDI1NjoKKyAgICAgICAgICAgICpwSXZMZW4gPSA0OworICAgICAgICAgICAgKnBJY3ZMZW4gPSA0OworCQkJYnJlYWs7CisJCWNhc2UgWk1fVEtJUDoKKyAgICAgICAgICAgICpwSXZMZW4gPSA4OworICAgICAgICAgICAgKnBJY3ZMZW4gPSA0OworCQkJYnJlYWs7CisJCWNhc2UgWk1fQUVTOgorICAgICAgICAgICAgKnBJdkxlbiA9IDg7CisgICAgICAgICAgICAqcEljdkxlbiA9IDA7CisJCQlicmVhazsKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICBjYXNlIFpNX0NFTkM6CisgICAgICAgICAgICAqcEl2TGVuID0gMTg7CisgICAgICAgICAgICAqcEljdkxlbiA9IDE2OworI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKwkJfS8qIGVuZCBvZiBzd2l0Y2ggKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKCAoZW5jcnlNb2RlID09IFpNX1dFUDY0KXx8CisgICAgICAgICAgICAgKGVuY3J5TW9kZSA9PSBaTV9XRVAxMjgpfHwKKyAgICAgICAgICAgICAoZW5jcnlNb2RlID09IFpNX1dFUDI1NikgKQorICAgICAgICB7CisgICAgICAgICAgICAqcEl2TGVuID0gNDsKKyAgICAgICAgICAgICpwSWN2TGVuID0gNDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggZW5jcnlNb2RlID09IFpNX1RLSVAgKQorICAgICAgICB7CisgICAgICAgICAgICAqcEl2TGVuID0gODsKKyAgICAgICAgICAgICpwSWN2TGVuID0gNDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggZW5jcnlNb2RlID09IFpNX0FFUyApCisgICAgICAgIHsKKyAgICAgICAgICAgICpwSXZMZW4gPSA4OworICAgICAgICAgICAgKnBJY3ZMZW4gPSA4OyAvLyBBRVMgTUlDCisgICAgICAgIH0KKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICBlbHNlIGlmICggZW5jcnlNb2RlID09IFpNX0NFTkMpCisgICAgICAgIHsKKyAgICAgICAgICAgICpwSXZMZW4gPSAxODsKKyAgICAgICAgICAgICpwSWN2TGVuPSAxNjsKKyAgICAgICAgfQorI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmQWdpbmdEZWZyYWdMaXN0ICAgICAgICAgICAqLworLyogICAgICBGb3JjZSBmbHVzaGluZyB3aG9sZSBkZWZyYWcgbGlzdCBvciBhZ2luZyB0aGUgYnVmZmVyICAgICAgICAgICAgKi8KKy8qICAgICAgaW4gdGhlIGRlZnJhZyBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGZsdXNoRmxhZyA6IDE9PmZsdXNoaW5nLCAwPT5BZ2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjEgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmQWdpbmdEZWZyYWdMaXN0KHpkZXZfdCogZGV2LCB1MTZfdCBmbHVzaEZsYWcpCit7CisgICAgdTE2X3QgaSwgajsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBmb3IoaT0wOyBpPFpNX01BWF9ERUZSQUdfRU5UUklFUzsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHdkLT5kZWZyYWdUYWJsZS5kZWZyYWdFbnRyeVtpXS5mcmFnQ291bnQgIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoKHdkLT50aWNrIC0gd2QtPmRlZnJhZ1RhYmxlLmRlZnJhZ0VudHJ5W2ldLnRpY2spID4KKyAgICAgICAgICAgICAgICAgICAgICAgIChaTV9ERUZSQUdfQUdJTkdfVElNRV9TRUMgKiBaTV9USUNLX1BFUl9TRUNPTkQpKQorICAgICAgICAgICAgICAgfHwgKGZsdXNoRmxhZyAhPSAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9tc2cxX3J4KFpNX0xWXzIsICJBZ2luZyBkZWZyYWcgbGlzdCA6IiwgaSk7CisgICAgICAgICAgICAgICAgLyogRnJlZSB0aGUgYnVmZmVycyBpbiB0aGUgZGVmcmFnIGxpc3QgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGo9MDsgajx3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uZnJhZ0NvdW50OyBqKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgd2QtPmRlZnJhZ1RhYmxlLmRlZnJhZ0VudHJ5W2ldLmZyYWdtZW50W2pdLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgd2QtPmRlZnJhZ1RhYmxlLmRlZnJhZ0VudHJ5W2ldLmZyYWdDb3VudCA9IDA7CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZBZGRGaXJzdEZyYWdUb0RlZnJhZ0xpc3QgICovCisvKiAgICAgIEFkZCBmaXJzdCBmcmFnbWVudCB0byBkZWZyYWdtZW50IGxpc3QsIHRoZSBmaXJzdCBlbXB0eSBlbnRyeSAgICAqLworLyogICAgICB3aWxsIGJlIHNlbGVjdGVkLiBJZiB0aGUgbGlzdCBpcyBmdWxsLCBzZXF1ZW50aWFsbHkgc2VsZWN0ICAgICAgKi8KKy8qICAgICAgb25lIGVudHJ5IGZvciByZXBsYWNlbWVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGZpcnN0IGZyYWdtZW50IGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhZGRyIDogYWRkcmVzcyBvZiBmaXJzdCBmcmFnbWVudCBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgc2VxTnVtIDogc2VxdWVuY2Ugb2YgZmlyc3QgZnJhZ21lbnQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuMSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZBZGRGaXJzdEZyYWdUb0RlZnJhZ0xpc3QoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90KiBhZGRyLCB1MTZfdCBzZXFOdW0pCit7CisgICAgdTE2X3QgaSwgajsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAvKiBGaW5kIGFuIGVtcHR5IG9uZSBpbiBkZWZyYWcgbGlzdCAqLworICAgIGZvcihpPTA7IGk8Wk1fTUFYX0RFRlJBR19FTlRSSUVTOyBpKyspCisgICAgeworICAgICAgICBpZiAoIHdkLT5kZWZyYWdUYWJsZS5kZWZyYWdFbnRyeVtpXS5mcmFnQ291bnQgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLyogSWYgZnVsbCwgc2VxdWVudGlhbGx5IHJlcGxhY2UgZXhpc3Rpbmcgb25lICovCisgICAgaWYgKGkgPT0gWk1fTUFYX0RFRlJBR19FTlRSSUVTKQorICAgIHsKKyAgICAgICAgaSA9IHdkLT5kZWZyYWdUYWJsZS5yZXBsYWNlTnVtKysgJiAoWk1fTUFYX0RFRlJBR19FTlRSSUVTLTEpOworICAgICAgICAvKiBGcmVlIHRoZSBidWZmZXJzIGluIHRoZSBkZWZyYWcgbGlzdCB0byBiZSByZXBsYWNlZCAqLworICAgICAgICBmb3IgKGo9MDsgajx3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uZnJhZ0NvdW50OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCB3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uZnJhZ21lbnRbal0sIDApOworICAgICAgICB9CisgICAgfQorCisgICAgd2QtPmRlZnJhZ1RhYmxlLmRlZnJhZ0VudHJ5W2ldLmZyYWdDb3VudCA9IDE7CisgICAgd2QtPmRlZnJhZ1RhYmxlLmRlZnJhZ0VudHJ5W2ldLmZyYWdtZW50WzBdID0gYnVmOworICAgIHdkLT5kZWZyYWdUYWJsZS5kZWZyYWdFbnRyeVtpXS5zZXFOdW0gPSBzZXFOdW07CisgICAgd2QtPmRlZnJhZ1RhYmxlLmRlZnJhZ0VudHJ5W2ldLnRpY2sgPSB3ZC0+dGljazsKKworICAgIGZvciAoaj0wOyBqPDY7IGorKykKKyAgICB7CisgICAgICAgIHdkLT5kZWZyYWdUYWJsZS5kZWZyYWdFbnRyeVtpXS5hZGRyW2pdID0gYWRkcltqXTsKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkFkZEZyYWdUb0RlZnJhZ0xpc3QgICAgICAgKi8KKy8qICAgICAgQWRkIG1pZGRsZSBvciBsYXN0IGZyYWdtZW50IHRvIGRlZnJhZ21lbnQgbGlzdC4gICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGZpcnN0IGZyYWdtZW50IGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhZGRyIDogYWRkcmVzcyBvZiBmcmFnbWVudCBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgc2VxTnVtIDogc2VxdWVuY2UgZnJhZ21lbnQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGZyYWdOdW0gOiBmcmFnbWVudCBudW1iZXIgb2YgZnJhZ21lbnQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBtb3JlRnJhZyA6IG1vcmUgZnJhZyBiaXQgb2YgZnJhZ21lbnQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWRkSW5mbyA6IGFkZGl0aW9uIGluZm8gb2YgZnJhZ21lbnQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuMSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3pidWZfdCogemZBZGRGcmFnVG9EZWZyYWdMaXN0KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCogYWRkciwKKyAgICAgICAgdTE2X3Qgc2VxTnVtLCB1OF90IGZyYWdOdW0sIHU4X3QgbW9yZUZyYWcsCisgICAgICAgIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogYWRkSW5mbykKK3sKKyAgICB1MTZfdCBpLCBqLCBrOworICAgIHpidWZfdCogcmV0dXJuQnVmID0gTlVMTDsKKyAgICB1MTZfdCBkZWZyYWdEb25lID0gMDsKKyAgICB1MTZfdCBsZW5FcnIgPSAwOworICAgIHUxNl90IHN0YXJ0QWRkciwgZnJhZ0hlYWQsIGZyYW1lTGVuLCBpdkxlbiwgaWN2TGVuOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIC8qIEZpbmQgZnJhZyBpbiB0aGUgZGVmcmFnIGxpc3QgKi8KKyAgICBmb3IoaT0wOyBpPFpNX01BWF9ERUZSQUdfRU5UUklFUzsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKCB3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uZnJhZ0NvdW50ICE9IDAgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBDb21wYXJlIGFkZHJlc3MgKi8KKyAgICAgICAgICAgIGZvciAoaj0wOyBqPDY7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYWRkcltqXSAhPSB3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uYWRkcltqXSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqID09IDYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogQ29tcGFyZSBzZXF1ZW5jZSBhbmQgZnJhZ21lbnQgbnVtYmVyICovCisgICAgICAgICAgICAgICAgaWYgKHNlcU51bSA9PSB3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uc2VxTnVtKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChmcmFnTnVtID09IHdkLT5kZWZyYWdUYWJsZS5kZWZyYWdFbnRyeVtpXS5mcmFnQ291bnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChmcmFnTnVtIDwgOCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkZCBmcmFnIGZyYW1lIHRvIGRlZnJhZyBsaXN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uZnJhZ21lbnRbZnJhZ051bV0gPSBidWY7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uZnJhZ0NvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZyYWdEb25lID0gMTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vcmVGcmFnID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWVyZ2UgYWxsIGZyYWdtZW50IGlmIG1vcmUgZGF0YSBiaXQgaXMgY2xlYXJlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkJ1ZiA9IHdkLT5kZWZyYWdUYWJsZS5kZWZyYWdFbnRyeVtpXS5mcmFnbWVudFswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydEFkZHIgPSB6ZndCdWZHZXRTaXplKGRldiwgcmV0dXJuQnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBza2lwIFdMQU4gaGVhZGVyIDI0KERhdGEpIG9yIDI2KFFvUyBEYXRhKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdIZWFkID0gMjQgKyAoKHptd19yeF9idWZfcmVhZGgoZGV2LCByZXR1cm5CdWYsIDApICYgMHg4MCkgPj4gNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZHZXRSeEl2SWN2TGVuZ3RoKGRldiwgcmV0dXJuQnVmLCAwLCAmaXZMZW4sICZpY3ZMZW4sIGFkZEluZm8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdIZWFkICs9IGl2TGVuOyAvKiBza2lwIElWICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MTsgazx3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uZnJhZ0NvdW50OyBrKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmRlZnJhZ1RhYmxlLmRlZnJhZ0VudHJ5W2ldLmZyYWdtZW50W2tdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzdGFydEFkZHIrZnJhbWVMZW4tZnJhZ0hlYWQpIDwgMTU2MCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZSeEJ1ZmZlckNvcHkoZGV2LCByZXR1cm5CdWYsIHdkLT5kZWZyYWdUYWJsZS5kZWZyYWdFbnRyeVtpXS5mcmFnbWVudFtrXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRBZGRyLCBmcmFnSGVhZCwgZnJhbWVMZW4tZnJhZ0hlYWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRBZGRyICs9IChmcmFtZUxlbi1mcmFnSGVhZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5FcnIgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCB3ZC0+ZGVmcmFnVGFibGUuZGVmcmFnRW50cnlbaV0uZnJhZ21lbnRba10sIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5kZWZyYWdUYWJsZS5kZWZyYWdFbnRyeVtpXS5mcmFnQ291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmd0J1ZlNldFNpemUoZGV2LCByZXR1cm5CdWYsIHN0YXJ0QWRkcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAobGVuRXJyID09IDEpCisgICAgeworICAgICAgICB6ZndCdWZGcmVlKGRldiwgcmV0dXJuQnVmLCAwKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChkZWZyYWdEb25lID09IDApCisgICAgeworICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHJldHVybkJ1ZjsKK30KKworCisvKiByZXR1cm4gdmFsdWUgPSBOVUxMID0+IHNhdmUgb3IgZnJlZSB0aGlzIGZyYW1lICAgICAgICAgKi8KK3pidWZfdCogemZEZWZyYWdtZW50KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdThfdCogcGJJc0RlZnJhZywKKyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogYWRkSW5mbykKK3sKKyAgICB1OF90IGZyYWdOdW07CisgICAgdTE2X3Qgc2VxTnVtOworICAgIHU4X3QgbW9yZUZyYWdCaXQ7CisgICAgdThfdCBhZGRyWzZdOworICAgIHUxNl90IGk7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgWk1fQlVGRkVSX1RSQUNFKGRldiwgYnVmKQorCisgICAgKnBiSXNEZWZyYWcgPSBGQUxTRTsKKyAgICBzZXFOdW0gPSB6bXdfYnVmX3JlYWRoKGRldiwgYnVmLCAyMik7CisgICAgZnJhZ051bSA9ICh1OF90KShzZXFOdW0gJiAweGYpOworICAgIG1vcmVGcmFnQml0ID0gKHptd19idWZfcmVhZGIoZGV2LCBidWYsIDEpICYgWk1fQklUXzIpID4+IDI7CisKKyAgICBpZiAoKGZyYWdOdW0gPT0gMCkgJiYgKG1vcmVGcmFnQml0ID09IDApKQorICAgIHsKKyAgICAgICAgLyogTm90IHBhcnQgb2YgYSBmcmFnbWVudGF0aW9uICovCisKKyAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgd2QtPmNvbW1UYWxseS5zd1J4RnJhZ21lbnRDb3VudCsrOworICAgICAgICBzZXFOdW0gPSBzZXFOdW0gPj4gNDsKKyAgICAgICAgZm9yIChpPTA7IGk8NjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBhZGRyW2ldID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUK2kpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZyYWdOdW0gPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogbW9yZSBmcmFnID0gMSAqLworICAgICAgICAgICAgLyogRmlyc3QgcGFydCBvZiBhIGZyYWdtZW50YXRpb24gKi8KKyAgICAgICAgICAgIHptX21zZzFfcngoWk1fTFZfMiwgIkZpcnN0IEZyYWcsIHNlcT0iLCBzZXFOdW0pOworICAgICAgICAgICAgemZBZGRGaXJzdEZyYWdUb0RlZnJhZ0xpc3QoZGV2LCBidWYsIGFkZHIsIHNlcU51bSk7CisgICAgICAgICAgICBidWYgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogTWlkZGxlIG9yIGxhc3QgcGFydCBvZiBhIGZyYWdtZW50YXRpb24gKi8KKyAgICAgICAgICAgIHptX21zZzFfcngoWk1fTFZfMiwgIkZyYWcgc2VxPSIsIHNlcU51bSk7CisgICAgICAgICAgICB6bV9tc2cxX3J4KFpNX0xWXzIsICJGcmFnIG1vcmVGcmFnQml0PSIsIG1vcmVGcmFnQml0KTsKKyAgICAgICAgICAgIGJ1ZiA9IHpmQWRkRnJhZ1RvRGVmcmFnTGlzdChkZXYsIGJ1ZiwgYWRkciwgc2VxTnVtLCBmcmFnTnVtLCBtb3JlRnJhZ0JpdCwgYWRkSW5mbyk7CisgICAgICAgICAgICBpZiAoYnVmICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKnBiSXNEZWZyYWcgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGJ1ZjsKK30KKworCisjaWYgWk1fUFJPVE9DT0xfUkVTUE9OU0VfU0lNVUxBVElPTgordTE2X3QgemZTd2FwKHUxNl90IG51bSkKK3sKKyAgICByZXR1cm4gKChudW0gPj4gOCkgKyAoKG51bSAmIDB4ZmYpIDw8IDgpKTsKK30KKworCit2b2lkIHpmUHJvdFJzcFNpbSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdTE2X3QgZXRoVHlwZTsKKyAgICB1MTZfdCBhcnBPcDsKKyAgICB1MTZfdCBwcm90OworICAgIHUxNl90IHRlbXA7CisgICAgdTE2X3QgaTsKKyAgICB1MTZfdCBkaXBbMl07CisgICAgdTE2X3QgZHN0UG9ydDsKKyAgICB1MTZfdCBzcmNQb3J0OworCisgICAgZXRoVHlwZSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDEyKTsKKyAgICB6bV9tc2cyX3J4KFpNX0xWXzIsICJldGhUeXBlPSIsIGV0aFR5cGUpOworCisgICAgLyogQVJQICovCisgICAgaWYgKGV0aFR5cGUgPT0gMHgwNjA4KQorICAgIHsKKyAgICAgICAgYXJwT3AgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAyMCk7CisgICAgICAgIGRpcFswXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDM4KTsKKyAgICAgICAgZGlwWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNDApOworICAgICAgICB6bV9tc2cyX3J4KFpNX0xWXzIsICJhcnBPcD0iLCBhcnBPcCk7CisgICAgICAgIHptX21zZzJfcngoWk1fTFZfMiwgImlwMD0iLCBkaXBbMF0pOworICAgICAgICB6bV9tc2cyX3J4KFpNX0xWXzIsICJpcDE9IiwgZGlwWzFdKTsKKworICAgICAgICAvL0FSUCByZXF1ZXN0IHRvIDE5Mi4xNjguMS4xNQorICAgICAgICBpZiAoKGFycE9wID09IDB4MDEwMCkgJiYgKGRpcFswXSA9PSAweGE4YzApICYmIChkaXBbMV0gPT0gMHgwZjAxKSk7CisgICAgICAgIHsKKyAgICAgICAgICAgIHptX21zZzBfcngoWk1fTFZfMiwgIkFSUCIpOworICAgICAgICAgICAgLyogQVJQIHJlc3BvbnNlICovCisgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjAsIDB4MDIwMCk7CisKKyAgICAgICAgICAgIC8qIGRzdCBoYXJkd2FyZSBhZGRyZXNzICovCisKKyAgICAgICAgICAgIC8qIHNyYyBoYXJkd2FyZSBhZGRyZXNzICovCisgICAgICAgICAgICAvL3ptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCA2LCAweGEwMDApOworICAgICAgICAgICAgLy96bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgOCwgMHgwMDAwKTsKKyAgICAgICAgICAgIC8vem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDEwLCAweDAwMDApOworCisgICAgICAgICAgICAvKiBkc3QgaXAgYWRkcmVzcyAqLworICAgICAgICAgICAgZm9yIChpPTA7IGk8NTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXAgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAyMisoaSoyKSk7CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDMyKyhpKjIpLCB0ZW1wKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogc3JjIGhhcmR3YXJlIGFkZHJlc3MgKi8KKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyMiwgMHhhMDAwKTsKKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyNCwgMHgwMDAwKTsKKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyNiwgMHgwMDAwKTsKKworICAgICAgICAgICAgLyogc3JjIGlwIGFkZHJlc3MgKi8KKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyOCwgMHhhOGMwKTsKKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAzMCwgMHgwZjAxKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBJQ01QICovCisgICAgZWxzZSBpZiAoZXRoVHlwZSA9PSAweDAwMDgpCisgICAgeworICAgICAgICB6bV9tc2cwX3J4KFpNX0xWXzIsICJJUCIpOworICAgICAgICBwcm90ID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMjMpOworICAgICAgICBkaXBbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAzMCk7CisgICAgICAgIGRpcFsxXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDMyKTsKKyAgICAgICAgem1fbXNnMl9yeChaTV9MVl8yLCAicHJvdD0iLCBwcm90KTsKKyAgICAgICAgem1fbXNnMl9yeChaTV9MVl8yLCAiaXAwPSIsIGRpcFswXSk7CisgICAgICAgIHptX21zZzJfcngoWk1fTFZfMiwgImlwMT0iLCBkaXBbMV0pOworCisgICAgICAgIC8qIFBJTkcgcmVxdWVzdCB0byAxOTIuMTY4LjEuMTUgKi8KKyAgICAgICAgaWYgKChwcm90ID09IDB4MSkgJiYgKGRpcFswXSA9PSAweGE4YzApICYmIChkaXBbMV0gPT0gMHgwZjAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgem1fbXNnMF9yeChaTV9MVl8yLCAiSUNNUCIpOworICAgICAgICAgICAgLyogY2hhbmdlIGRzdCAqLworICAgICAgICAgICAgZm9yIChpPTA7IGk8MzsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXAgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCA2KyhpKjIpKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgaSoyLCB0ZW1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGNoYW5nZSBzcmMgKi8KKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCA2LCAweGEwMDApOworICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDgsIDB4MDAwMCk7CisgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMTAsIDB4MDAwMCk7CisKKyAgICAgICAgICAgIC8qIGV4Y2hhbmdlIHNyYyBpcCBhbmQgZHN0IGlwICovCisgICAgICAgICAgICBmb3IgKGk9MDsgaTwyOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVtcCA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDI2KyhpKjIpKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMzArKGkqMiksIHRlbXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDI2LCAweGE4YzApOworICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDI4LCAweDBmMDEpOworCisgICAgICAgICAgICAvKiBjaGFuZ2UgaWNtcCB0eXBlIHRvIGVjaG8gcmVwbHkgKi8KKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGViKGRldiwgYnVmLCAzNCwgMHgwKTsKKworICAgICAgICAgICAgLyogdXBkYXRlIGljbXAgY2hlY2tzdW0gKi8KKyAgICAgICAgICAgIHRlbXAgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAzNik7CisgICAgICAgICAgICB0ZW1wICs9IDg7CisgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMzYsIHRlbXApOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHByb3QgPT0gMHg2KQorICAgICAgICB7CisgICAgICAgICAgICB6bV9tc2cwX3J4KFpNX0xWXzIsICJUQ1AiKTsKKyAgICAgICAgICAgIHNyY1BvcnQgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAzNCk7CisgICAgICAgICAgICBkc3RQb3J0ID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMzYpOworICAgICAgICAgICAgem1fbXNnMl9yeChaTV9MVl8yLCAiU3JjIFBvcnQ9Iiwgc3JjUG9ydCk7CisgICAgICAgICAgICB6bV9tc2cyX3J4KFpNX0xWXzIsICJEc3QgUG9ydD0iLCBkc3RQb3J0KTsKKyAgICAgICAgICAgIGlmICgoZHN0UG9ydCA9PSAweDE1MDApIHx8IChzcmNQb3J0ID09IDB4MTUwMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fbXNnMF9yeChaTV9MVl8yLCAiRlRQIik7CisKKyAgICAgICAgICAgICAgICAvKiBjaGFuZ2UgZHN0ICovCisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8MzsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcCA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDYrKGkqMikpOworICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgaSoyLCB0ZW1wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogY2hhbmdlIHNyYyAqLworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCA2LCAweGEwMDApOworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCA4LCAweDAwMDApOworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAxMCwgMHgwMDAwKTsKKworICAgICAgICAgICAgICAgIC8qIGV4Y2hhbmdlIHNyYyBpcCBhbmQgZHN0IGlwICovCisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8MjsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcCA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDI2KyhpKjIpKTsKKyAgICAgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDMwKyhpKjIpLCB0ZW1wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDI2LCAweGE4YzApOworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyOCwgMHgwZjAxKTsKKyNpZiAwCisgICAgICAgICAgICAgICAgLyogUGF0Y2ggc3JjIHBvcnQgKi8KKyAgICAgICAgICAgICAgICB0ZW1wID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMzQpOworICAgICAgICAgICAgICAgIHRlbXAgPSB6ZlN3YXAoemZTd2FwKHRlbXApICsgMSk7CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDM0LCB0ZW1wKTsKKyAgICAgICAgICAgICAgICB0ZW1wID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMzgpOworICAgICAgICAgICAgICAgIHRlbXAgPSB6ZlN3YXAoemZTd2FwKHRlbXApICsgMSk7CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDM4LCB0ZW1wKTsKKworICAgICAgICAgICAgICAgIC8qIFBhdGNoIGNoZWNrc3VtICovCisgICAgICAgICAgICAgICAgdGVtcCA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDUwKTsKKyAgICAgICAgICAgICAgICB0ZW1wID0gemZTd2FwKHRlbXApOworICAgICAgICAgICAgICAgIHRlbXAgPSB+dGVtcDsKKyAgICAgICAgICAgICAgICB0ZW1wICs9IDI7CisgICAgICAgICAgICAgICAgdGVtcCA9IH50ZW1wOworICAgICAgICAgICAgICAgIHRlbXAgPSB6ZlN3YXAodGVtcCk7CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDUwLCB0ZW1wKTsKKyNlbmRpZgorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocHJvdCA9PSAweDExKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBjaGFuZ2UgZHN0ICovCisgICAgICAgICAgICBmb3IgKGk9MDsgaTwzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVtcCA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDYrKGkqMikpOworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCBpKjIsIHRlbXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogY2hhbmdlIHNyYyAqLworICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDYsIDB4YTAwMCk7CisgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgOCwgMHgwMDAwKTsKKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAxMCwgMHgwMDAwKTsKKworICAgICAgICAgICAgem1fbXNnMF9yeChaTV9MVl8yLCAiVURQIik7CisgICAgICAgICAgICBzcmNQb3J0ID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMzQpOworICAgICAgICAgICAgZHN0UG9ydCA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDM2KTsKKyAgICAgICAgICAgIHptX21zZzJfcngoWk1fTFZfMiwgIlNyYyBQb3J0PSIsIHNyY1BvcnQpOworICAgICAgICAgICAgem1fbXNnMl9yeChaTV9MVl8yLCAiRHN0IFBvcnQ9IiwgZHN0UG9ydCk7CisKKyAgICAgICAgICAgIC8qIGV4Y2hhbmdlIHNyYyBpcCBhbmQgZHN0IGlwICovCisgICAgICAgICAgICBmb3IgKGk9MDsgaTwyOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVtcCA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDI2KyhpKjIpKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMzArKGkqMiksIHRlbXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDI2LCAweGE4YzApOworICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDI4LCAweDBmMDEpOworCisgICAgICAgICAgICAvKiBleGNoYW5nZSBwb3J0ICovCisgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMzQsIHNyY1BvcnQrMSk7CisgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMzYsIGRzdFBvcnQpOworCisgICAgICAgICAgICAvKiBjaGVja3N1bSA9IDAgKi8KKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCA0MCwgMCk7CisgICAgICAgIH0KKworICAgIH0KKyAgICBlbHNlIGlmIChldGhUeXBlID09IDB4MDA2MCkgLyogPT4weDAwNjAgaXMgcG9ydCAqLworICAgIHsKKyAgICAgICAgLyogY2hhbmdlIHNyYyBmb3IgRXZsIHRvb2wgbG9vcCBiYWNrIHJlY2VpdmUgKi8KKyAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDYsIDB4YTAwMCk7CisgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCA4LCAweDAwMDApOworICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMTAsIDB4MDAwMCk7CisgICAgfQorCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmaVR4U2VuZEV0aCAgICAgICAgICAgICAgICAqLworLyogICAgICBDYWxsZWQgdG8gbmF0aXZlIDgwMi4xMSBtYW5hZ2VtZW50IGZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogYnVmZmVyIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHBvcnQgOiBXTEFOIHBvcnQsIDA9PnN0YW5kYXJkLCAweDEtMHg3PT5WQVAsIDB4MjAtMHgyNT0+V0RTICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFJheSAgICAgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuNSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmaVR4U2VuZDgwMjExTWdtdCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IHBvcnQpCit7CisgICAgdTE2X3QgZXJyOworICAgIC8vdTE2X3QgYWRkclRibFNpemUgPSAwOworICAgIC8vc3RydWN0IHpzQWRkclRibCBhZGRyVGJsOworICAgIHUxNl90IGhsZW47CisgICAgdTE2X3QgaGVhZGVyWygyNCsyNSsxKS8yXTsKKyAgICBpbnQgaTsKKworICAgIGZvcihpPTA7aTwxMjtpKyspCisgICAgeworICAgICAgICBoZWFkZXJbaV0gPSB6bXdfYnVmX3JlYWRoKGRldiwgYnVmLCBpKTsKKyAgICB9CisgICAgaGxlbiA9IDI0OworCisgICAgemZ3QnVmUmVtb3ZlSGVhZChkZXYsIGJ1ZiwgMjQpOworCisgICAgaWYgKChlcnIgPSB6ZkhwU2VuZChkZXYsIGhlYWRlciwgaGxlbiwgTlVMTCwgMCwgTlVMTCwgMCwgYnVmLCAwLAorICAgICAgICAgICAgWk1fRVhURVJOQUxfQUxMT0NfQlVGLCAwLCAwKSkgIT0gWk1fU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGdvdG8gemxFcnJvcjsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKKworemxFcnJvcjoKKworICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgIHJldHVybiAwOworfQorCit1OF90IHpmaUlzVHhRdWV1ZUZ1bGwoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIGlmICgoKCh3ZC0+dnR4cUhlYWRbMF0gKyAxKSAmIFpNX1ZUWFFfU0laRV9NQVNLKSAhPSB3ZC0+dnR4cVRhaWxbMF0pICkKKyAgICB7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZmlUeFNlbmRFdGggICAgICAgICAgICAgICAgKi8KKy8qICAgICAgQ2FsbGVkIHRvIHRyYW5zbWl0IEV0aGVybmV0IGZyYW1lIGZyb20gdXBwZXIgbGF5ZXIuICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGJ1ZmZlciBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBwb3J0IDogV0xBTiBwb3J0LCAwPT5zdGFuZGFyZCwgMHgxLTB4Nz0+VkFQLCAweDIwLTB4MjU9PldEUyAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBlcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuICAgICAgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS41ICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZpVHhTZW5kRXRoKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCkKK3sKKyAgICB1MTZfdCBlcnIsIHJldDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIFpNX1BFUkZPUk1BTkNFX1RYX01TRFUoZGV2LCB3ZC0+dGljayk7CisgICAgem1fbXNnMV90eChaTV9MVl8yLCAiemZpVHhTZW5kRXRoKCksIHBvcnQ9IiwgcG9ydCk7CisgICAgLyogUmV0dXJuIGVycm9yIGlmIHBvcnQgaXMgZGlzYWJsZWQgKi8KKyAgICBpZiAoKGVyciA9IHpmVHhQb3J0Q29udHJvbChkZXYsIGJ1ZiwgcG9ydCkpID09IFpNX1BPUlRfRElTQUJMRUQpCisgICAgeworICAgICAgICBlcnIgPSBaTV9FUlJfVFhfUE9SVF9ESVNBQkxFRDsKKyAgICAgICAgZ290byB6bEVycm9yOworICAgIH0KKworI2lmIDEKKyAgICBpZiAoKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKSAmJiAocG9ydCA8IDB4MjApKQorICAgIHsKKyAgICAgICAgLyogQVAgOiBCdWZmZXIgZnJhbWUgZm9yIHBvd2VyIHNhdmluZyBTVEEgKi8KKyAgICAgICAgaWYgKChyZXQgPSB6ZkFwQnVmZmVyUHNGcmFtZShkZXYsIGJ1ZiwgcG9ydCkpID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBaTV9TVUNDRVNTOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkKKyAgICB7CisgICAgICAgIGlmICggemZQb3dlclNhdmluZ01ncklzU2xlZXBpbmcoZGV2KSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qY2hlY2sgWk1fRU5BQkxFX1BPV0VSX1NBVkUgZmxhZyovCisgICAgICAgICAgICB6ZlBvd2VyU2F2aW5nTWdyV2FrZXVwKGRldik7CisgICAgICAgIH0KKyAgICB9CisjaWZkZWYgWk1fRU5BQkxFX0lCU1NfUFMKKyAgICAvKiBJQlNTIHBvd2VyLXNhdmluZyBtb2RlICovCisgICAgZWxzZSBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lCU1MgKQorICAgIHsKKyAgICAgICAgaWYgKCB6ZlN0YUlic3NQU1F1ZXVlRGF0YShkZXYsIGJ1ZikgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gWk1fU1VDQ0VTUzsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisjaWYgMQorICAgIC8vaWYgKCB3ZC0+YlFvU0VuYWJsZSApCisgICAgaWYgKDEpCisgICAgeworICAgICAgICAvKiBQdXQgdG8gVlRYUVthY10gKi8KKyAgICAgICAgcmV0ID0gemZQdXRWdHhxKGRldiwgYnVmKTsKKworICAgICAgICAvKiBQdXNoIFZUWFFbYWNdICovCisgICAgICAgIHpmUHVzaFZ0eHEoZGV2KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0ID0gemZUeFNlbmRFdGgoZGV2LCBidWYsIHBvcnQsIFpNX0VYVEVSTkFMX0FMTE9DX0JVRiwgMCk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKKyNlbHNlCisgICAgcmV0dXJuIHpmVHhTZW5kRXRoKGRldiwgYnVmLCBwb3J0LCBaTV9FWFRFUk5BTF9BTExPQ19CVUYsIDApOworI2VuZGlmCisKK3psRXJyb3I6CisgICAgem1fbXNnMl90eChaTV9MVl8xLCAiVHggQ29tcCBlcnI9IiwgZXJyKTsKKworICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIGVycik7CisgICAgcmV0dXJuIGVycjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZUeFNlbmRFdGggICAgICAgICAgICAgICAgICovCisvKiAgICAgIENhbGxlZCB0byB0cmFuc21pdCBFdGhlcm5ldCBmcmFtZSBmcm9tIHVwcGVyIGxheWVyLiAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWYgOiBidWZmZXIgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcG9ydCA6IFdMQU4gcG9ydCwgMD0+c3RhbmRhcmQsIDB4MTAtMHgxNz0+VkFQLCAweDIwLTB4MjU9PldEUyAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiAgICAgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuNSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmVHhTZW5kRXRoKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCwgdTE2X3QgYnVmVHlwZSwgdTE2X3QgZmxhZykKK3sKKyAgICB1MTZfdCBlcnI7CisgICAgLy91MTZfdCBhZGRyVGJsU2l6ZTsKKyAgICAvL3N0cnVjdCB6c0FkZHJUYmwgYWRkclRibDsKKyAgICB1MTZfdCByZW1vdmVMZW47CisgICAgdTE2X3QgaGVhZGVyWyg4KzMwKzIrMTgpLzJdOyAgICAvKiBjdHIrKDQrYTErYTIrYTMrMithNCkrcW9zK2l2ICovCisgICAgdTE2X3QgaGVhZGVyTGVuOworICAgIHUxNl90IG1pY1s4LzJdOworICAgIHUxNl90IG1pY0xlbjsKKyAgICB1MTZfdCBzbmFwWzgvMl07CisgICAgdTE2X3Qgc25hcExlbjsKKyAgICB1MTZfdCBmcmFnTGVuOworICAgIHUxNl90IGZyYW1lTGVuOworICAgIHUxNl90IGZyYWdOdW07CisgICAgc3RydWN0IHpzRnJhZyBmcmFnOworICAgIHUxNl90IGksIGosIGlkOworICAgIHUxNl90IG9mZnNldDsKKyAgICB1MTZfdCBkYVszXTsKKyAgICB1MTZfdCBzYVszXTsKKyAgICB1OF90IHVwOworICAgIHU4X3QgcW9zVHlwZSwga2V5SWR4ID0gMDsKKyAgICB1MTZfdCBmcmFnT2ZmOworICAgIHUxNl90IG5ld0ZsYWc7CisgICAgc3RydWN0IHpzTWljVmFyKiAgcE1pY0tleTsKKyAgICB1OF90IHRraXBGcmFtZU9mZnNldCA9IDA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgbmV3RmxhZyA9IGZsYWcgJiAweGZmMDA7CisgICAgZmxhZyA9IGZsYWcgJiAweGZmOworCisgICAgem1fbXNnMV90eChaTV9MVl8yLCAiemZUeFNlbmRFdGgoKSwgcG9ydD0iLCBwb3J0KTsKKworICAgIC8qIEdldCBJUCBUT1MgZm9yIFFvUyBBQyBhbmQgSVAgZnJhZyBvZmZzZXQgKi8KKyAgICB6ZlR4R2V0SXBUb3NBbmRGcmFnKGRldiwgYnVmLCAmdXAsICZmcmFnT2ZmKTsKKworICAgIC8vRU9TUCBiaXQKKyAgICBpZiAobmV3RmxhZyAmIDB4MTAwKQorICAgIHsKKyAgICAgICAgdXAgfD0gMHgxMDsKKyAgICB9CisKKyNpZmRlZiBaTV9FTkFCTEVfTkFUSVZFX1dJRkkKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICB7CisgICAgICAgIC8qIERBICovCisgICAgICAgIGRhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTYpOworICAgICAgICBkYVsxXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDE4KTsKKyAgICAgICAgZGFbMl0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAyMCk7CisgICAgICAgIC8qIFNBICovCisgICAgICAgIHNhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTApOworICAgICAgICBzYVsxXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDEyKTsKKyAgICAgICAgc2FbMl0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAxNCk7CisgICAgfQorICAgIGVsc2UgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTICkKKyAgICB7CisgICAgICAgIC8qIERBICovCisgICAgICAgIGRhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNCk7CisgICAgICAgIGRhWzFdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNik7CisgICAgICAgIGRhWzJdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgOCk7CisgICAgICAgIC8qIFNBICovCisgICAgICAgIHNhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTApOworICAgICAgICBzYVsxXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDEyKTsKKyAgICAgICAgc2FbMl0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAxNCk7CisgICAgfQorICAgIGVsc2UgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCApCisgICAgeworICAgICAgICAvKiBEQSAqLworICAgICAgICBkYVswXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDQpOworICAgICAgICBkYVsxXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDYpOworICAgICAgICBkYVsyXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDgpOworICAgICAgICAvKiBTQSAqLworICAgICAgICBzYVswXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDE2KTsKKyAgICAgICAgc2FbMV0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCAxOCk7CisgICAgICAgIHNhWzJdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMjApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLworICAgIH0KKyNlbHNlCisgICAgLyogREEgKi8KKyAgICBkYVswXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDApOworICAgIGRhWzFdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMik7CisgICAgZGFbMl0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCA0KTsKKyAgICAvKiBTQSAqLworICAgIHNhWzBdID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNik7CisgICAgc2FbMV0gPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCA4KTsKKyAgICBzYVsyXSA9IHptd190eF9idWZfcmVhZGgoZGV2LCBidWYsIDEwKTsKKyNlbmRpZgorICAgIC8vRGVjaWRlIEtleSBJbmRleCBpbiBBVE9NLCBObyBtZWFuaW5nIGluIE9UVVMtLUNXWWFuZyhtKQorICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICB7CisgICAgICAgIGtleUlkeCA9IHdkLT5hcC5iY0hhbEtleUlkeFtwb3J0XTsKKyAgICAgICAgaWQgPSB6ZkFwRmluZFN0YShkZXYsIGRhKTsKKyAgICAgICAgaWYgKGlkICE9IDB4ZmZmZikKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICh3ZC0+YXAuc3RhVGFibGVbaWRdLmVuY3J5TW9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgWk1fQUVTOgorICAgICAgICAgICAgY2FzZSBaTV9US0lQOgorI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICBjYXNlIFpNX0NFTkM6CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICAgICAgICAgIGtleUlkeCA9IHdkLT5hcC5zdGFUYWJsZVtpZF0ua2V5SWR4OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHN3aXRjaCAod2QtPnN0YS5lbmNyeU1vZGUpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBaTV9XRVA2NDoKKyAgICAgICAgY2FzZSBaTV9XRVAxMjg6CisgICAgICAgIGNhc2UgWk1fV0VQMjU2OgorICAgICAgICAgICAga2V5SWR4ID0gd2QtPnN0YS5rZXlJZDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFpNX0FFUzoKKyAgICAgICAgY2FzZSBaTV9US0lQOgorICAgICAgICAgICAgaWYgKChkYVswXSAmIDB4MSkpCisgICAgICAgICAgICAgICAga2V5SWR4ID0gNTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBrZXlJZHggPSA0OworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgY2FzZSBaTV9DRU5DOgorICAgICAgICAgICAga2V5SWR4ID0gd2QtPnN0YS5jZW5jS2V5SWQ7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDcmVhdGUgU05BUCAqLworICAgIHJlbW92ZUxlbiA9IHpmVHhHZW5XbGFuU25hcChkZXYsIGJ1Ziwgc25hcCwgJnNuYXBMZW4pOworICAgIC8vem1fbXNnMV90eChaTV9MVl8wLCAiZnJhZ09mZj0iLCBmcmFnT2ZmKTsKKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiBBZGQgMjAwNzEwMjUgTXh6ZW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgRXRoZXJuZXQgOiBmcmFtZUxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0rLS02LS0rLS02LS0rLS0yLS0rLS0tLS0yMC0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tIFZhcmlhYmxlIC0tLS0tLS0rLS0tLS0tLS0tICovCisvKiAgICB8ICBEQSB8ICBTQSB8IFR5cGV8ICBJUCBIZWFkZXIgfCBUQ1AoMjApIFVEUCgxMikgSUNNUCg4KSB8IEFwcGxpY2F0aW9uIFBheWxvYWQgTCB8ICAgICAgICAgICovCisvKiAtLS0rLS0tLS0rLS0tLS0rLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tICovCisvKiAgTVNEVSA9IDYgKyA2ICsgMiArICggTmV0d29yayBMYXllciBoZWFkZXIgKSArICggVHJhbnNwb3J0IExheWVyIGhlYWRlciApICsgTCAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTVNEVSAtIERBIC0gU0EgOiBmcmFtZUxlbiAtPSByZW1vdmVMZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0rLS0yLS0rLS0tLS0yMC0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tIFZhcmlhYmxlIC0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICB8IFR5cGV8IElQIEhlYWRlciAgfCBUQ1AoMjApIFVEUCgxMikgSUNNUCg4KSB8IEFwcGxpY2F0aW9uIFBheWxvYWQgTCB8ICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0rLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgkJCQkJCQkJCQkJCSAgKi8KKy8qICBNUERVIDogZnJhbWVMZW4gKyBtcGR1TGVuZ3RoT2Zmc2V0IDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0rLS0tMi0tLSstLS0tMi0tLSstNi0rLTYtKy0tNi0tKy0tLTItLS0tKy0tMS0tKy0tMS0rLS0tMS0tLSstLS0tLS0tMy0tLS0tLSstZnJhbWVMZW4tKy0tLTQtLSstICovCisvKiAgfCBmcmFtZSB8ZHVyYXRpb258IERBfFNBIHxCU1NJRHxzZXF1ZW5jZXxTTkFQIHxTTkFQfENvbnRyb2x8ICAgIFJGQyAxMDQyICB8ICAgICAgICAgIHwgIEZDUyB8ICAqLworLyogIHxDb250cm9sfCAgICAgICAgfCAgIHwgICB8ICAgICB8IG51bWJlciB8RFNBUCB8U1NBUHwgICAgICAgfCBlbmNhcHN1bGF0aW9ufCAgICAgICAgICB8ICAgICAgfCAgKi8KKy8qIC0rLS0tLS0tLSstLS0tLS0tLSstLS0rLS0tKy0tLS0tKy0tLS0tLS0tKy0tLS0tKy0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLSstICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgICAgaWYgKCB3ZC0+c3RhLmVuY3J5TW9kZSA9PSBaTV9US0lQICkKKyAgICAgICAgdGtpcEZyYW1lT2Zmc2V0ID0gODsKKworICAgIGZyYWdMZW4gPSB3ZC0+ZnJhZ1RocmVzaG9sZCArIHRraXBGcmFtZU9mZnNldDsgICAvLyBGcmFnbWVudGF0aW9uIHRocmVzaG9sZCBmb3IgTVBEVSBMZW5ndGhzCisgICAgZnJhbWVMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsgICAgLy8gTVNEVSBMZW5ndGhzCisgICAgZnJhbWVMZW4gLT0gcmVtb3ZlTGVuOyAgICAgICAgICAgICAgICAgLy8gTVNEVSBMZW5ndGhzIC0gREEgLSBTQQorCisgICAgLyogIzFzdCBjcmVhdGUgTUlDIExlbmd0aCBtYW51YWxseSAqLworICAgIG1pY0xlbiA9IDA7CisKKyAgICAvKiBBY2Nlc3MgQ2F0ZWdvcnkgKi8KKyAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgeworICAgICAgICB6ZkFwR2V0U3RhUW9zVHlwZShkZXYsIGRhLCAmcW9zVHlwZSk7CisgICAgICAgIGlmIChxb3NUeXBlID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVwID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+c3RhLndtZUNvbm5lY3RlZCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB1cCA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogVE9ETyA6IFNUQSBRb1MgY29udHJvbCBmaWVsZCAqLworICAgICAgICB1cCA9IDA7CisgICAgfQorCisgICAgLyogIzJuZCBBc3NpZ24gc2VxdWVuY2UgbnVtYmVyICovCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBmcmFnLnNlcVswXSA9ICgod2QtPnNlcVt6Y1VwVG9BY1t1cCYweDddXSsrKSA8PCA0KTsKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgLyogIzNyZCBQYXNzIHRoZSB0b3RhbCBwYXlsb2FkIHRvIGdlbmVyYXRlIE1QRFUgbGVuZ3RoICEgKi8KKyAgICBmcmFnLmJ1ZlswXSA9IGJ1ZjsKKyAgICBmcmFnLmJ1ZlR5cGVbMF0gPSBidWZUeXBlOworICAgIGZyYWcuZmxhZ1swXSA9ICh1OF90KWZsYWc7CisgICAgZnJhZ051bSA9IDE7CisKKyAgICBoZWFkZXJMZW4gPSB6ZlR4R2VuV2xhbkhlYWRlcihkZXYsIGZyYWcuYnVmWzBdLCBoZWFkZXIsIGZyYWcuc2VxWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWcuZmxhZ1swXSwgc25hcExlbittaWNMZW4sIHJlbW92ZUxlbiwgcG9ydCwgZGEsIHNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwLCAmbWljTGVuLCBzbmFwLCBzbmFwTGVuLCBOVUxMKTsKKworICAgIC8vem1fZGVidWdfbXNnMSgiIzEgaGVhZGVyTGVuID0gIiwgaGVhZGVyTGVuKTsKKworICAgIC8qICM0dGggQ2hlY2sgdGhlIEhlYWRlckxlbiBhbmQgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIE1QRFUgTGVuZ3RocyBiaWdnZXIgdGhhbiBGcmFnbWVudGF0aW9uIHRocmVzaG9sZCAgKi8KKyAgICAvKiBJZiBNUERVIExlbmd0aHMgbGFyZ2UgdGhhbiBmcmFnbWVudGF0aW9uIHRocmVzaG9sZCAtLT4gaGVhZGVyTGVuID0gMCAqLworICAgIGlmKCBoZWFkZXJMZW4gIT0gMCApCisgICAgeworICAgICAgICB6ZjgwMjExRnJhbWVTZW5kKGRldiwgZnJhZy5idWZbMF0sIGhlYWRlciwgc25hcExlbiwgZGEsIHNhLCB1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJMZW4sIHNuYXAsIG1pYywgbWljTGVuLCByZW1vdmVMZW4sIGZyYWcuYnVmVHlwZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB6Y1VwVG9BY1t1cCYweDddLCBrZXlJZHgpOworICAgIH0KKyAgICBlbHNlIC8vaWYoIGhlYWRlckxlbiA9PSAwICkgLy8gTmVlZCB0byBiZSBmcmFnbWVudGVkCisgICAgeworICAgICAgICB1MTZfdCBtcGR1TGVuZ3RoT2Zmc2V0OworICAgICAgICB1MTZfdCBwc2V1ZFNuYXBMZW4gPSAwOworCisgICAgICAgIG1wZHVMZW5ndGhPZmZzZXQgPSBoZWFkZXJbMF0gLSBmcmFtZUxlbjsgLy8gRm9yIGZyYWdtZW50YXRpb24gdGhyZXNob2xkICEKKworICAgICAgICBtaWNMZW4gPSB6ZlR4R2VuV2xhblRhaWwoZGV2LCBidWYsIHNuYXAsIHNuYXBMZW4sIG1pYyk7IC8vIEdldCBzbmFwIGFuZCBtaWMgaW5mb3JtYXRpb24KKworICAgICAgICBmcmFnTGVuID0gZnJhZ0xlbiAtIG1wZHVMZW5ndGhPZmZzZXQ7CisKKyAgICAgICAgLy96bV9kZWJ1Z19tc2cxKCIjMiBmcmFtZUxlbiA9ICIsIGZyYW1lTGVuKTsKKyAgICAgICAgLy96bV9kZWJ1Z19tc2cxKCIjMyBmcmFnVGhyZXNob2xkID0gIiwgZnJhZ0xlbik7CisKKyAgICAgICAgLyogZnJhZ21lbnRhdGlvbiAqLworICAgICAgICBpZiAoZnJhbWVMZW4gPj0gZnJhZ0xlbikKKyAgICAgICAgeworICAgICAgICAgICAgLy9jb3B5IGZyYWdMZW4gdG8gZnJhZworICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICB3aGlsZSggZnJhbWVMZW4gPiAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKGZyYWcuYnVmW2ldID0gemZ3QnVmQWxsb2NhdGUoZGV2LCBmcmFnTGVuKzMyKSkgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZyYWcuYnVmVHlwZVtpXSA9IFpNX0lOVEVSTkFMX0FMTE9DX0JVRjsKKyAgICAgICAgICAgICAgICAgICAgZnJhZy5zZXFbaV0gPSBmcmFnLnNlcVswXSArIGk7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHJlbW92ZUxlbiArIGkqZnJhZ0xlbjsKKworICAgICAgICAgICAgICAgICAgICAvKiBDb25zaWRlciB0aGUgb2Zmc2V0IGlmIHdlIGNvbnNpZGVyIHNuYXAgbGVuZ3RoIHRvIHRoZSBvdGhlciBmcmFnbWVudGVkIGZyYW1lICovCisgICAgICAgICAgICAgICAgICAgIGlmICggaSA+PSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG9mZnNldCArIHBzZXVkU25hcExlbiooaS0xKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVMZW4gPiBmcmFnTGVuICsgcHNldWRTbmFwTGVuKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFnLmZsYWdbaV0gPSBmbGFnIHwgMHg0OyAvKiBNb3JlIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpcnN0IGZyYWdtZW50ICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkZCBTTkFQICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7IGo8c25hcExlbjsgais9MikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgZnJhZy5idWZbaV0sIGosIHNuYXBbKGo+PjEpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmVHhCdWZmZXJDb3B5KGRldiwgZnJhZy5idWZbaV0sIGJ1Ziwgc25hcExlbiwgb2Zmc2V0LCBmcmFnTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZndCdWZTZXRTaXplKGRldiwgZnJhZy5idWZbaV0sIHNuYXBMZW4rZnJhZ0xlbik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBZGQgcHNldWQgc25hcCBsZW5ndGggdG8gdGhlIG90aGVyIGZyYWdtZW50ZWQgZnJhbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2V1ZFNuYXBMZW4gPSBzbmFwTGVuOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMZW4gLT0gZnJhZ0xlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEludGVybWVkaWF0ZSBGcmFnbWVudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vemZUeEJ1ZmZlckNvcHkoZGV2LCBmcmFnLmJ1ZltpXSwgYnVmLCAwLCBvZmZzZXQsIGZyYWdMZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vemZ3QnVmU2V0U2l6ZShkZXYsIGZyYWcuYnVmW2ldLCBmcmFnTGVuKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmVHhCdWZmZXJDb3B5KGRldiwgZnJhZy5idWZbaV0sIGJ1ZiwgMCwgb2Zmc2V0LCBmcmFnTGVuK3BzZXVkU25hcExlbiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmd0J1ZlNldFNpemUoZGV2LCBmcmFnLmJ1ZltpXSwgZnJhZ0xlbitwc2V1ZFNuYXBMZW4pOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMZW4gLT0gKGZyYWdMZW4rcHNldWRTbmFwTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vZnJhbWVMZW4gLT0gZnJhZ0xlbjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIExhc3QgZnJhZ21lbnQgICovCisgICAgICAgICAgICAgICAgICAgICAgICB6ZlR4QnVmZmVyQ29weShkZXYsIGZyYWcuYnVmW2ldLCBidWYsIDAsIG9mZnNldCwgZnJhbWVMZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgLyogQWRkIE1JQyBpZiBuZWVkICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIG1pY0xlbiApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZDb3B5VG9SeEJ1ZmZlcihkZXYsIGZyYWcuYnVmW2ldLCAodThfdCopIG1pYywgZnJhbWVMZW4sIG1pY0xlbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB6ZndCdWZTZXRTaXplKGRldiwgZnJhZy5idWZbaV0sIGZyYW1lTGVuK21pY0xlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFnLmZsYWdbaV0gPSAodThfdClmbGFnOyAvKiBObyBtb3JlIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFBsZWFzZSBwYXkgYXR0ZW50aW9uIHRvIHRoZSBpbmRleCBvZiB0aGUgYnVmICEhIQorICAgICAgICAgICAgICAgIC8vIElmIHdyaXRlIHRvIG51bGwgYnVmICwgdGhlIE9TIHdpbGwgY3Jhc2ggISEhCisgICAgICAgICAgICAgICAgemZ3Q29weUJ1ZkNvbnRleHQoZGV2LCBidWYsIGZyYWcuYnVmW2ktMV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJhZ051bSA9IGk7CisgICAgICAgICAgICBzbmFwTGVuID0gbWljTGVuID0gcmVtb3ZlTGVuID0gMDsKKworICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGk9MDsgaTxmcmFnTnVtOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENyZWF0ZSBXTEFOIGhlYWRlcihDb250cm9sIFNldHRpbmcgKyA4MDIuMTEgaGVhZGVyICsgSVYpICovCisgICAgICAgICAgICBoZWFkZXJMZW4gPSB6ZlR4R2VuV2xhbkhlYWRlcihkZXYsIGZyYWcuYnVmW2ldLCBoZWFkZXIsIGZyYWcuc2VxW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZy5mbGFnW2ldLCBzbmFwTGVuK21pY0xlbiwgcmVtb3ZlTGVuLCBwb3J0LCBkYSwgc2EsIHVwLCAmbWljTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hcCwgc25hcExlbiwgTlVMTCk7CisKKyAgICAgICAgICAgIHpmODAyMTFGcmFtZVNlbmQoZGV2LCBmcmFnLmJ1ZltpXSwgaGVhZGVyLCBzbmFwTGVuLCBkYSwgc2EsIHVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJMZW4sIHNuYXAsIG1pYywgbWljTGVuLCByZW1vdmVMZW4sIGZyYWcuYnVmVHlwZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemNVcFRvQWNbdXAmMHg3XSwga2V5SWR4KTsKKworICAgICAgICB9IC8qIGZvciAoaT0wOyBpPGZyYWdOdW07IGkrKykgKi8KKyAgICB9CisKKyAgICByZXR1cm4gWk1fU1VDQ0VTUzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZUeFBvcnRDb250cm9sICAgICAgICAgICAgICovCisvKiAgICAgIENoZWNrIHBvcnQgc3RhdHVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGJ1ZmZlciBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBwb3J0IDogcG9ydCBudW1iZXIsIDA9PnN0YW5kYXJkLCAxMC0xNz0+VmlydHVhbCBBUCwgMjAtMjU9PldEUyAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBaTV9QT1JUX0VOQUJMRUQgb3IgWk1fUE9SVF9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTaWduYXR1cmUgICAgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS40ICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZUeFBvcnRDb250cm9sKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICB7CisgICAgICAgIGlmICggd2QtPnN0YS5hZGFwdGVyU3RhdGUgPT0gWk1fU1RBX1NUQVRFX0RJU0NPTk5FQ1QgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9tc2cwX3R4KFpNX0xWXzMsICJQYWNrZXRzIGRyb3BwZWQgZHVlIHRvIGRpc2Nvbm5lY3Qgc3RhdGUiKTsKKyAgICAgICAgICAgIHJldHVybiBaTV9QT1JUX0RJU0FCTEVEOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIFpNX1BPUlRfRU5BQkxFRDsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZklkbFJlY3YgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRG8gZnJhbWUgdmFsaWRhdGlvbiBhbmQgZmlsdGVyaW5nIHRoZW4gcGFzcyB0byB6ZndSZWN2ODAyMTEoKS4gICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IHJlY2VpdmVkIDgwMi4xMSBmcmFtZSBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gICAgICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEwICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmQ29yZVJlY3YoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBzdHJ1Y3QgenNBZGRpdGlvbkluZm8qIGFkZEluZm8pCit7CisgICAgdTE2X3QgcmV0ID0gMDsKKyAgICB1MTZfdCBic3NpZFszXTsKKyAgICBzdHJ1Y3QgYWdnX3RpZF9yeCAqdGlkX3J4OworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIFpNX0JVRkZFUl9UUkFDRShkZXYsIGJ1ZikKKworICAgIC8qIHRhbGx5ICovCisgICAgd2QtPmNvbW1UYWxseS5Ecml2ZXJSeEZybUNudCsrOworCisgICAgYnNzaWRbMF0gPSB6bXdfYnVmX3JlYWRoKGRldiwgYnVmLCAxNik7CisgICAgYnNzaWRbMV0gPSB6bXdfYnVmX3JlYWRoKGRldiwgYnVmLCAxOCk7CisgICAgYnNzaWRbMl0gPSB6bXdfYnVmX3JlYWRoKGRldiwgYnVmLCAyMCk7CisKKyAgICAvKiBWYWxpZGF0ZSBSeCBmcmFtZSAqLworICAgIGlmICgocmV0ID0gemZXbGFuUnhWYWxpZGF0ZShkZXYsIGJ1ZikpICE9IFpNX1NVQ0NFU1MpCisgICAgeworICAgICAgICB6bV9tc2cxX3J4KFpNX0xWXzEsICJSeCBpbnZhbGlkOiIsIHJldCk7CisgICAgICAgIGdvdG8gemxFcnJvcjsKKyAgICB9CisKKyNpZmRlZiBaTV9FTkFCTEVfQUdHUkVHQVRJT04KKyAgICAvLyNpZm5kZWYgWk1fRU5BQkxFX0ZXX0JBX1JFVFJBTlNNSVNTSU9OCisgICAgLyoKKyAgICAgKiBhZGQgYnkgaG9uZGEKKyAgICAgKi8KKyAgICB0aWRfcnggPSB6ZkFnZ1J4RW5hYmxlZChkZXYsIGJ1Zik7CisgICAgaWYgKHRpZF9yeCAmJiB3ZC0+cmVvcmRlcikKKyAgICB7CisgICAgICAgIHpmQWdnUngoZGV2LCBidWYsIGFkZEluZm8sIHRpZF9yeCk7CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKgorICAgICAqIGVuZCBvZiBhZGQgYnkgaG9uZGEKKyAgICAgKi8KKyAgICAvLyNlbmRpZgorI2VuZGlmCisKKyAgICAvKiBGaWx0ZXIgUnggZnJhbWUgKi8KKyAgICBpZiAoKHJldCA9IHpmV2xhblJ4RmlsdGVyKGRldiwgYnVmKSkgIT0gWk1fU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHptX21zZzFfcngoWk1fTFZfMSwgIlJ4IGR1cGxpY2F0ZWQ6IiwgcmV0KTsKKyAgICAgICAgZ290byB6bEVycm9yOworICAgIH0KKworICAgIC8qIERpc2NhcmQgZXJyb3IgZnJhbWUgZXhjZXB0IG1pYyBmYWlsdXJlICovCisgICAgaWYgKChhZGRJbmZvLT5UYWlsLkRhdGEuRXJyb3JJbmRpY2F0aW9uICYgMHgzZikgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICggd2QtPlhMaW5rTW9kZSAmJiAoKGFkZEluZm8tPlRhaWwuRGF0YS5FcnJvckluZGljYXRpb24gJiAweDNmKT09MHgxMCkgJiYKKyAgICAgICAgICAgICB6ZkNvbXBhcmVXaXRoQnNzaWQoZGV2LCBic3NpZCkgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBCeXBhc3MgZnJhbWVzICEhIQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZ290byB6bEVycm9yOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKiBPVFVTIGNvbW1hbmQtODIxMiBkdW1wIHJ4IHBhY2tldCAqLworICAgIGlmICh3ZC0+cnhQYWNrZXREdW1wKQorICAgIHsKKyAgICAgICAgemZ3RHVtcEJ1ZihkZXYsIGJ1Zik7CisgICAgfQorCisgICAgLyogQ2FsbCB6ZndSZWN2ODAyMTEoKSB3cmFwcGVyIGZ1bmN0aW9uIHRvIGRlbGl2ZXIgUnggcGFja2V0ICovCisgICAgLyogdG8gZHJpdmVyIGZyYW1ld29yay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICBpZiAod2QtPnpmY2JSZWN2ODAyMTEgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHdkLT56ZmNiUmVjdjgwMjExKGRldiwgYnVmLCBhZGRJbmZvKTsgLy9DV1lhbmcobSkKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgemZpUmVjdjgwMjExKGRldiwgYnVmLCBhZGRJbmZvKTsKKyAgICB9CisgICAgcmV0dXJuOworCit6bEVycm9yOgorICAgIHptX21zZzFfcngoWk1fTFZfMSwgIkZyZWUgcGFja2V0LCBlcnJvciBjb2RlOiIsIHJldCk7CisKKyAgICB3ZC0+Y29tbVRhbGx5LkRyaXZlckRpc2NhcmRlZEZybSsrOworCisgICAgLyogRnJlZSBSeCBidWZmZXIgKi8KKyAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKworICAgIHJldHVybjsKK30KKworCit2b2lkIHpmU2hvd1J4RUFQT0woemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQpCit7CisgICAgdThfdCAgIHBhY2tldFR5cGUsIGtleVR5cGUsIGNvZGUsIGlkZW50aWZpZXIsIHR5cGUsIGZsYWdzOworICAgIHUxNl90ICBwYWNrZXRMZW4sIGtleUluZm8sIGtleUxlbiwga2V5RGF0YUxlbiwgbGVuZ3RoLCBPcF9Db2RlOworICAgIHUzMl90ICByZXBsYXlDb3VudGVySCwgcmVwbGF5Q291bnRlckwsIHZlbmRvcklkLCBWZW5kb3JUeXBlOworCisgICAgLyogRUFQT0wgcGFja2V0IHR5cGUgKi8KKyAgICBwYWNrZXRUeXBlID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpOyAvLyAwOiBFQVAtUGFja2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTogRUFQT0wtU3RhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyOiBFQVBPTC1Mb2dvZmYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAzOiBFQVBPTC1LZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0OiBFQVBPTC1FbmNhcHN1bGF0ZWQtQVNGLUFsZXJ0CisKKyAgICAvKiBFQVBPTCBmcmFtZSBmb3JtYXQgKi8KKyAgICAvKiAgMCAgMSAgMiAgMyAgNCAgNSAgNiAgNyAgOCAgOSAxMCAxMSAxMiAxMyAxNCAxNSAgICovCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAqLworICAgIC8qICAgICAgICAgICAgUEFFIEV0aGVybmV0IFR5cGUgKDB4ODg4ZSkgICAgICAgICAgICAgKi8KKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAyICovCisgICAgLyogICAgIFByb3RvY29sIFZlcnNpb24gICAgfCAgICAgICAgIFR5cGUgICAgICAgICAgICAqLworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDQgKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gNiAqLworICAgIC8qICAgICAgICAgICAgICAgICAgICBQYWNrZXQgQm9keSAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBOICovCisKKyAgICAvKiBFQVBPTCBib2R5IGxlbmd0aCAqLworICAgIHBhY2tldExlbiA9ICgoKHUxNl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMikpIDw8IDgpICsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMyk7CisKKyAgICBpZiggcGFja2V0VHlwZSA9PSAwICkKKyAgICB7IC8vIEVBUC1QYWNrZXQKKworICAgICAgICAvKiBFQVAtUGFja2V0IENvZGUgKi8KKyAgICAgICAgY29kZSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs0KTsgLy8gMSA6IFJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMiA6IFJlc3BvbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMgOiBTdWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDQgOiBGYWlsdXJlCisgICAgICAgIC8vIEFuIEVBUCBwYWNrZXQgb2YgdGhlIHR5cGUgb2YgU3VjY2VzcyBhbmQgRmFpbHVyZSBoYXMgbm8gRGF0YSBmaWVsZCwgYW5kIGhhcyBhIGxlbmd0aCBvZiA0LgorCisgICAgICAgIC8qIEVBUCBQYWNrZXQgZm9ybWF0ICovCisgICAgICAgIC8qICAwICAxICAyICAzICA0ICA1ICA2ICA3ICA4ICA5IDEwIDExIDEyIDEzIDE0IDE1ICAgKi8KKyAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAqLworICAgICAgICAvKiAgICAgICAgICAgQ29kZSAgICAgICAgICB8ICAgICAgICBJZGVudGlmaWVyICAgICAgICovCisgICAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDIgKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgIExlbmd0aCAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSA0ICovCisgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTiAqLworCisgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQiKTsKKyAgICAgICAgem1fZGVidWdfbXNnMSgiUGFja2V0IExlbmd0aCA9ICIsIHBhY2tldExlbik7CisgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgQ29kZSA9ICIsIGNvZGUpOworCisgICAgICAgIGlmKCBjb2RlID09IDEgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QiKTsKKworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBJZGVudGlmaWVyICovCisgICAgICAgICAgICBpZGVudGlmaWVyID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzUpOworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBMZW5ndGggKi8KKyAgICAgICAgICAgIGxlbmd0aCA9ICgoKHUxNl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNikpIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNyk7CisgICAgICAgICAgICAvKiBFQVAtUGFja2V0IFR5cGUgKi8KKyAgICAgICAgICAgIHR5cGUgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOCk7IC8vIDEgICA6IElkZW50aXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyICAgOiBOb3RpZmljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMgICA6IE5hayAoUmVzcG9uc2UgT25seSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDQgICA6IE1ENS1DaGFsbGVuZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUgICA6IE9uZSBUaW1lIFBhc3N3b3JkIChPVFApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA2ICAgOiBHZW5lcmljIFRva2VuIENhcmQgKEdUQykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDI1NCA6IChFeHBhbmRlZCBUeXBlcylXaS1GaSBQcm90ZWN0ZWQgU2V0dXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDI1NSA6IEV4cGVyaW1lbnRhbCBVc2UKKworICAgICAgICAgICAgLyogVGhlIGRhdGEgZmllbGQgaW4gYW4gRUFQIHBhY2tldCBvZiB0aGUgdHlwZSBvZiBSZXF1ZXN0IG9yIFJlc3BvbnNlIGlzIGluIHRoZSBmb3JtYXQgc2hvd24gYmVsbG93aW5nICovCisgICAgICAgICAgICAvKiAgMCAgMSAgMiAgMyAgNCAgNSAgNiAgNyAgICAgICAgICAgICBOICAgICAgICAgICAgICovCisgICAgICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICovCisgICAgICAgICAgICAvKiAgICAgICAgICAgVHlwZSAgICAgICAgICB8ICAgICAgICBUeXBlIERhdGEgICAgICAgICovCisgICAgICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICovCisKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgSWRlbnRpZmllciA9ICIsIGlkZW50aWZpZXIpOworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBMZW5ndGggPSAiLCBsZW5ndGgpOworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBUeXBlID0gIiwgdHlwZSk7CisKKyAgICAgICAgICAgIGlmKCB0eXBlID09IDEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVxdWVzdCBJZGVudGl0eSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSAyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QgTm90aWZpY2F0aW9uIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IDQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVxdWVzdCBNRDUtQ2hhbGxlbmdlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IDUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVxdWVzdCBPbmUgVGltZSBQYXNzd29yZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSA2ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QgR2VuZXJpYyBUb2tlbiBDYXJkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IDI1NCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiRUFQLVBhY2tldCBSZXF1ZXN0IFdpLUZpIFByb3RlY3RlZCBTZXR1cCIpOworCisgICAgICAgICAgICAgICAgLyogMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMyAgICovCisgICAgICAgICAgICAgICAgLyogMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxICovCisgICAgICAgICAgICAgICAgLyorLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyovCisgICAgICAgICAgICAgICAgLyp8ICAgICBUeXBlICAgICAgfCAgICAgICAgICAgICAgIFZlbmRvci1JZCAgICAgICAgICAgICAgICAgICAgICAgfCovCisgICAgICAgICAgICAgICAgLyorLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyovCisgICAgICAgICAgICAgICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICBWZW5kb3ItVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCisgICAgICAgICAgICAgICAgLyorLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyovCisgICAgICAgICAgICAgICAgLyp8ICAgICAgICAgICAgICBWZW5kb3IgZGF0YS4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgLyorLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAvKiBFQVAtUGFja2V0IFZlbmRvciBJRCAqLworICAgICAgICAgICAgICAgIHZlbmRvcklkID0gKCgodTMyX3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs5KSkgPDwgMTYpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTApKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTEpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgVmVuZG9yIFR5cGUgKi8KKyAgICAgICAgICAgICAgICBWZW5kb3JUeXBlID0gKCgodTMyX3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxMikpIDw8IDI0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTMpKSA8PCAxNikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh1MzJfdCkgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzE0KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTUpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgT3AgQ29kZSAqLworICAgICAgICAgICAgICAgIE9wX0NvZGUgPSAoKCh1MTZfdCkgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzE2KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTcpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgRmxhZ3MgKi8KKyAgICAgICAgICAgICAgICBmbGFncyA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxOCk7CisKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IFZlbmRvciBJRCA9ICIsIHZlbmRvcklkKTsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IFZlbm9kciBUeXBlID0gIiwgVmVuZG9yVHlwZSk7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBPcCBDb2RlID0gIiwgT3BfQ29kZSk7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBGbGFncyA9ICIsIGZsYWdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBjb2RlID09IDIgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlc3BvbnNlIik7CisKKyAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgSWRlbnRpZmllciAqLworICAgICAgICAgICAgaWRlbnRpZmllciA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs1KTsKKyAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgTGVuZ3RoICovCisgICAgICAgICAgICBsZW5ndGggPSAoKCh1MTZfdCkgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzYpKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzcpOworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBUeXBlICovCisgICAgICAgICAgICB0eXBlID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzgpOworCisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IElkZW50aWZpZXIgPSAiLCBpZGVudGlmaWVyKTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgTGVuZ3RoID0gIiwgbGVuZ3RoKTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgVHlwZSA9ICIsIHR5cGUpOworCisgICAgICAgICAgICBpZiggdHlwZSA9PSAxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlc3BvbnNlIElkZW50aXR5Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IDIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVxdWVzdCBOb3RpZmljYXRpb24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gMyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiRUFQLVBhY2tldCBSZXF1ZXN0IE5hayIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSA0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QgTUQ1LUNoYWxsZW5nZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSA1ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QgT25lIFRpbWUgUGFzc3dvcmQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gNiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiRUFQLVBhY2tldCBSZXF1ZXN0IEdlbmVyaWMgVG9rZW4gQ2FyZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSAyNTQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVzcG9uc2UgV2ktRmkgUHJvdGVjdGVkIFNldHVwIik7CisKKyAgICAgICAgICAgICAgICAvKiBFQVAtUGFja2V0IFZlbmRvciBJRCAqLworICAgICAgICAgICAgICAgIHZlbmRvcklkID0gKCgodTMyX3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs5KSkgPDwgMTYpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTApKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTEpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgVmVuZG9yIFR5cGUgKi8KKyAgICAgICAgICAgICAgICBWZW5kb3JUeXBlID0gKCgodTMyX3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxMikpIDw8IDI0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTMpKSA8PCAxNikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh1MzJfdCkgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzE0KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTUpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgT3AgQ29kZSAqLworICAgICAgICAgICAgICAgIE9wX0NvZGUgPSAoKCh1MTZfdCkgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzE2KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTcpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgRmxhZ3MgKi8KKyAgICAgICAgICAgICAgICBmbGFncyA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxOCk7CisKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IFZlbmRvciBJRCA9ICIsIHZlbmRvcklkKTsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IFZlbm9kciBUeXBlID0gIiwgVmVuZG9yVHlwZSk7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBPcCBDb2RlID0gIiwgT3BfQ29kZSk7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBGbGFncyA9ICIsIGZsYWdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBjb2RlID09IDMgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFN1Y2Nlc3MiKTsKKworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBJZGVudGlmaWVyICovCisgICAgICAgICAgICBpZGVudGlmaWVyID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzUpOworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBMZW5ndGggKi8KKyAgICAgICAgICAgIGxlbmd0aCA9ICgoKHUxNl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNikpIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNyk7CisKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgSWRlbnRpZmllciA9ICIsIGlkZW50aWZpZXIpOworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBMZW5ndGggPSAiLCBsZW5ndGgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIGNvZGUgPT0gNCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgRmFpbHVyZSIpOworCisgICAgICAgICAgICAvKiBFQVAtUGFja2V0IElkZW50aWZpZXIgKi8KKyAgICAgICAgICAgIGlkZW50aWZpZXIgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNSk7CisgICAgICAgICAgICAvKiBFQVAtUGFja2V0IExlbmd0aCAqLworICAgICAgICAgICAgbGVuZ3RoID0gKCgodTE2X3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs2KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs3KTsKKworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBJZGVudGlmaWVyID0gIiwgaWRlbnRpZmllcik7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IExlbmd0aCA9ICIsIGxlbmd0aCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiggcGFja2V0VHlwZSA9PSAxICkKKyAgICB7IC8vIEVBUE9MLVN0YXJ0CisgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUE9MLVN0YXJ0Iik7CisgICAgfQorICAgIGVsc2UgaWYoIHBhY2tldFR5cGUgPT0gMiApCisgICAgeyAvLyBFQVBPTC1Mb2dvZmYKKyAgICAgICAgem1fZGVidWdfbXNnMCgiRUFQT0wtTG9nb2ZmIik7CisgICAgfQorICAgIGVsc2UgaWYoIHBhY2tldFR5cGUgPT0gMyApCisgICAgeyAvLyBFQVBPTC1LZXkKKyAgICAgICAgLyogRUFQT0wtS2V5IHR5cGUgKi8KKyAgICAgICAga2V5VHlwZSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs0KTsKKyAgICAgICAgLyogRUFQT0wtS2V5IGluZm9ybWF0aW9uICovCisgICAgICAgIGtleUluZm8gPSAoKCh1MTZfdCkgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzUpKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNik7CisgICAgICAgIC8qIEVBUE9MLUtleSBsZW5ndGggKi8KKyAgICAgICAga2V5TGVuID0gKCgodTE2X3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs3KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOCk7CisgICAgICAgIC8qIEVBUE9MLUtleSByZXBsYXkgY291bnRlciAoaGlnaCBkb3VibGUgd29yZCkgKi8KKyAgICAgICAgcmVwbGF5Q291bnRlckggPSAoKCh1MzJfdCkgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzkpKSA8PCAyNCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTApKSA8PCAxNikgKworICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTEpKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEyKTsKKyAgICAgICAgLyogRUFQT0wtS2V5IHJlcGxheSBjb3VudGVyIChsb3cgZG91YmxlIHdvcmQpICovCisgICAgICAgIHJlcGxheUNvdW50ZXJMID0gKCgodTMyX3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxMykpIDw8IDI0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgKCgodTMyX3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxNCkpIDw8IDE2KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgKCgodTMyX3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxNSkpIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTYpOworICAgICAgICAvKiBFQVBPTC1LZXkgZGF0YSBsZW5ndGggKi8KKyAgICAgICAga2V5RGF0YUxlbiA9ICgoKHUxNl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOTcpKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOTgpOworCisgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUE9MLUtleSIpOworICAgICAgICB6bV9kZWJ1Z19tc2cxKCJwYWNrZXQgbGVuZ3RoID0gIiwgcGFja2V0TGVuKTsKKworICAgICAgICBpZiAoIGtleVR5cGUgPT0gMjU0ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgia2V5IHR5cGUgPSAyNTQgKFNTTiBrZXkgZGVzY3JpcHRvcikiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzIoImtleSB0eXBlID0gMHgiLCBrZXlUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHptX2RlYnVnX21zZzIoInJlcGxheSBjb3VudGVyKEwpID0gIiwgcmVwbGF5Q291bnRlckwpOworCisgICAgICAgIHptX2RlYnVnX21zZzIoImtleSBpbmZvcm1hdGlvbiA9ICIsIGtleUluZm8pOworCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF8zICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gcGFpcndpc2Uga2V5Iik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCIgICAgLSBncm91cCBrZXkiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF82ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gVHgga2V5IGluc3RhbGxlZCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gVHgga2V5IG5vdCBzZXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF83ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gQWNrIG5lZWRlZCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gQWNrIG5vdCBuZWVkZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF84ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gTUlDIHNldCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gTUlDIG5vdCBzZXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF85ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gcGFja2V0IGVuY3J5cHRlZCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gcGFja2V0IG5vdCBlbmNyeXB0ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHptX2RlYnVnX21zZzEoImtleUxlbiA9ICIsIGtleUxlbik7CisgICAgICAgIHptX2RlYnVnX21zZzEoImtleURhdGFMZW4gPSAiLCBrZXlEYXRhTGVuKTsKKyAgICB9CisgICAgZWxzZSBpZiggcGFja2V0VHlwZSA9PSA0ICkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUE9MLUVuY2Fwc3VsYXRlZC1BU0YtQWxlcnQiKTsKKyAgICB9Cit9CisKK3ZvaWQgemZTaG93VHhFQVBPTCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCkKK3sKKyAgICB1OF90ICAgcGFja2V0VHlwZSwga2V5VHlwZSwgY29kZSwgaWRlbnRpZmllciwgdHlwZSwgZmxhZ3M7CisgICAgdTE2X3QgIHBhY2tldExlbiwga2V5SW5mbywga2V5TGVuLCBrZXlEYXRhTGVuLCBsZW5ndGgsIE9wX0NvZGU7CisgICAgdTMyX3QgIHJlcGxheUNvdW50ZXJILCByZXBsYXlDb3VudGVyTCwgdmVuZG9ySWQsIFZlbmRvclR5cGU7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9kZWJ1Z19tc2cxKCJFQVBPTCBQYWNrZXQgc2l6ZSA9ICIsIHpmd0J1ZkdldFNpemUoZGV2LCBidWYpKTsKKworICAgIC8qIEVBUE9MIHBhY2tldCB0eXBlICovCisgICAgLy8gMDogRUFQLVBhY2tldAorICAgIC8vIDE6IEVBUE9MLVN0YXJ0CisgICAgLy8gMjogRUFQT0wtTG9nb2ZmCisgICAgLy8gMzogRUFQT0wtS2V5CisgICAgLy8gNDogRUFQT0wtRW5jYXBzdWxhdGVkLUFTRi1BbGVydAorCisgICAgLyogRUFQT0wgZnJhbWUgZm9ybWF0ICovCisgICAgLyogIDAgIDEgIDIgIDMgIDQgIDUgIDYgIDcgIDggIDkgMTAgMTEgMTIgMTMgMTQgMTUgICAqLworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgKi8KKyAgICAvKiAgICAgICAgICAgIFBBRSBFdGhlcm5ldCBUeXBlICgweDg4OGUpICAgICAgICAgICAgICovCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gMiAqLworICAgIC8qICAgICBQcm90b2NvbCBWZXJzaW9uICAgIHwgICAgICAgICBUeXBlICAgICAgICAgICAgKi8KKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSA0ICovCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgIExlbmd0aCAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDYgKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgUGFja2V0IEJvZHkgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTiAqLworCisgICAgcGFja2V0VHlwZSA9IHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKKyAgICAvKiBFQVBPTCBib2R5IGxlbmd0aCAqLworICAgIHBhY2tldExlbiA9ICgoKHUxNl90KSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMikpIDw8IDgpICsKKyAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMyk7CisKKyAgICBpZiggcGFja2V0VHlwZSA9PSAwICkKKyAgICB7IC8vIEVBUC1QYWNrZXQKKyAgICAgICAgLyogRUFQLVBhY2tldCBDb2RlICovCisgICAgICAgIGNvZGUgPSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNCk7IC8vIDEgOiBSZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIgOiBSZXNwb25zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAzIDogU3VjY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0IDogRmFpbHVyZQorCisgICAgICAgIC8vIEFuIEVBUCBwYWNrZXQgb2YgdGhlIHR5cGUgb2YgU3VjY2VzcyBhbmQgRmFpbHVyZSBoYXMgbm8gRGF0YSBmaWVsZCwgYW5kIGhhcyBhIGxlbmd0aCBvZiA0LgorCisgICAgICAgIC8qIEVBUCBQYWNrZXQgZm9ybWF0ICovCisgICAgICAgIC8qICAwICAxICAyICAzICA0ICA1ICA2ICA3ICA4ICA5IDEwIDExIDEyIDEzIDE0IDE1ICAgKi8KKyAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAqLworICAgICAgICAvKiAgICAgICAgICAgQ29kZSAgICAgICAgICB8ICAgICAgICBJZGVudGlmaWVyICAgICAgICovCisgICAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDIgKi8KKyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgIExlbmd0aCAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSA0ICovCisgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTiAqLworCisgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQiKTsKKyAgICAgICAgem1fZGVidWdfbXNnMSgiUGFja2V0IExlbmd0aCA9ICIsIHBhY2tldExlbik7CisgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgQ29kZSA9ICIsIGNvZGUpOworCisgICAgICAgIGlmKCBjb2RlID09IDEgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QiKTsKKworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBJZGVudGlmaWVyICovCisgICAgICAgICAgICBpZGVudGlmaWVyID0gem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzUpOworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBMZW5ndGggKi8KKyAgICAgICAgICAgIGxlbmd0aCA9ICgoKHUxNl90KSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNikpIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNyk7CisgICAgICAgICAgICAvKiBFQVAtUGFja2V0IFR5cGUgKi8KKyAgICAgICAgICAgIHR5cGUgPSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOCk7IC8vIDEgICA6IElkZW50aXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyICAgOiBOb3RpZmljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMgICA6IE5hayAoUmVzcG9uc2UgT25seSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDQgICA6IE1ENS1DaGFsbGVuZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUgICA6IE9uZSBUaW1lIFBhc3N3b3JkIChPVFApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA2ICAgOiBHZW5lcmljIFRva2VuIENhcmQgKEdUQykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDI1NCA6IChFeHBhbmRlZCBUeXBlcylXaS1GaSBQcm90ZWN0ZWQgU2V0dXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDI1NSA6IEV4cGVyaW1lbnRhbCBVc2UKKworICAgICAgICAgICAgLyogVGhlIGRhdGEgZmllbGQgaW4gYW4gRUFQIHBhY2tldCBvZiB0aGUgdHlwZSBvZiBSZXF1ZXN0IG9yIFJlc3BvbnNlIGlzIGluIHRoZSBmb3JtYXQgc2hvd24gYmVsbG93aW5nICovCisgICAgICAgICAgICAvKiAgMCAgMSAgMiAgMyAgNCAgNSAgNiAgNyAgICAgICAgICAgICBOICAgICAgICAgICAgICovCisgICAgICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICovCisgICAgICAgICAgICAvKiAgICAgICAgICAgVHlwZSAgICAgICAgICB8ICAgICAgICBUeXBlIERhdGEgICAgICAgICovCisgICAgICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICovCisKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgSWRlbnRpZmllciA9ICIsIGlkZW50aWZpZXIpOworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBMZW5ndGggPSAiLCBsZW5ndGgpOworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBUeXBlID0gIiwgdHlwZSk7CisKKyAgICAgICAgICAgIGlmKCB0eXBlID09IDEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVxdWVzdCBJZGVudGl0eSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSAyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QgTm90aWZpY2F0aW9uIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IDQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVxdWVzdCBNRDUtQ2hhbGxlbmdlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IDUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVxdWVzdCBPbmUgVGltZSBQYXNzd29yZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSA2ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QgR2VuZXJpYyBUb2tlbiBDYXJkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IDI1NCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiRUFQLVBhY2tldCBSZXF1ZXN0IFdpLUZpIFByb3RlY3RlZCBTZXR1cCIpOworCisgICAgICAgICAgICAgICAgLyogMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMyAgICovCisgICAgICAgICAgICAgICAgLyogMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxICovCisgICAgICAgICAgICAgICAgLyorLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyovCisgICAgICAgICAgICAgICAgLyp8ICAgICBUeXBlICAgICAgfCAgICAgICAgICAgICAgIFZlbmRvci1JZCAgICAgICAgICAgICAgICAgICAgICAgfCovCisgICAgICAgICAgICAgICAgLyorLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyovCisgICAgICAgICAgICAgICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICBWZW5kb3ItVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCisgICAgICAgICAgICAgICAgLyorLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyovCisgICAgICAgICAgICAgICAgLyp8ICAgICAgICAgICAgICBWZW5kb3IgZGF0YS4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgLyorLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKyAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAvKiBFQVAtUGFja2V0IFZlbmRvciBJRCAqLworICAgICAgICAgICAgICAgIHZlbmRvcklkID0gKCgodTMyX3QpIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs5KSkgPDwgMTYpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTApKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTEpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgVmVuZG9yIFR5cGUgKi8KKyAgICAgICAgICAgICAgICBWZW5kb3JUeXBlID0gKCgodTMyX3QpIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxMikpIDw8IDI0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTMpKSA8PCAxNikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh1MzJfdCkgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzE0KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTUpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgT3AgQ29kZSAqLworICAgICAgICAgICAgICAgIE9wX0NvZGUgPSAoKCh1MTZfdCkgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzE2KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTcpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgRmxhZ3MgKi8KKyAgICAgICAgICAgICAgICBmbGFncyA9IHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxOCk7CisKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IFZlbmRvciBJRCA9ICIsIHZlbmRvcklkKTsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IFZlbm9kciBUeXBlID0gIiwgVmVuZG9yVHlwZSk7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBPcCBDb2RlID0gIiwgT3BfQ29kZSk7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBGbGFncyA9ICIsIGZsYWdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBjb2RlID09IDIgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlc3BvbnNlIik7CisKKyAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgSWRlbnRpZmllciAqLworICAgICAgICAgICAgaWRlbnRpZmllciA9IHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs1KTsKKyAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgTGVuZ3RoICovCisgICAgICAgICAgICBsZW5ndGggPSAoKCh1MTZfdCkgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzYpKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzcpOworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBUeXBlICovCisgICAgICAgICAgICB0eXBlID0gem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzgpOworCisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IElkZW50aWZpZXIgPSAiLCBpZGVudGlmaWVyKTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgTGVuZ3RoID0gIiwgbGVuZ3RoKTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgVHlwZSA9ICIsIHR5cGUpOworCisgICAgICAgICAgICBpZiggdHlwZSA9PSAxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlc3BvbnNlIElkZW50aXR5Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IDIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVxdWVzdCBOb3RpZmljYXRpb24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gMyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiRUFQLVBhY2tldCBSZXF1ZXN0IE5hayIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSA0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QgTUQ1LUNoYWxsZW5nZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSA1ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFJlcXVlc3QgT25lIFRpbWUgUGFzc3dvcmQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gNiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiRUFQLVBhY2tldCBSZXF1ZXN0IEdlbmVyaWMgVG9rZW4gQ2FyZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSAyNTQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgUmVzcG9uc2UgV2ktRmkgUHJvdGVjdGVkIFNldHVwIik7CisKKyAgICAgICAgICAgICAgICAvKiBFQVAtUGFja2V0IFZlbmRvciBJRCAqLworICAgICAgICAgICAgICAgIHZlbmRvcklkID0gKCgodTMyX3QpIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs5KSkgPDwgMTYpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTApKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTEpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgVmVuZG9yIFR5cGUgKi8KKyAgICAgICAgICAgICAgICBWZW5kb3JUeXBlID0gKCgodTMyX3QpIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxMikpIDw8IDI0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTMpKSA8PCAxNikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh1MzJfdCkgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzE0KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTUpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgT3AgQ29kZSAqLworICAgICAgICAgICAgICAgIE9wX0NvZGUgPSAoKCh1MTZfdCkgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzE2KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTcpOworICAgICAgICAgICAgICAgIC8qIEVBUC1QYWNrZXQgRmxhZ3MgKi8KKyAgICAgICAgICAgICAgICBmbGFncyA9IHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxOCk7CisKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IFZlbmRvciBJRCA9ICIsIHZlbmRvcklkKTsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IFZlbm9kciBUeXBlID0gIiwgVmVuZG9yVHlwZSk7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBPcCBDb2RlID0gIiwgT3BfQ29kZSk7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBGbGFncyA9ICIsIGZsYWdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBjb2RlID09IDMgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJFQVAtUGFja2V0IFN1Y2Nlc3MiKTsKKworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBJZGVudGlmaWVyICovCisgICAgICAgICAgICBpZGVudGlmaWVyID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzUpOworICAgICAgICAgICAgLyogRUFQLVBhY2tldCBMZW5ndGggKi8KKyAgICAgICAgICAgIGxlbmd0aCA9ICgoKHUxNl90KSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNikpIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNyk7CisKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIkVBUC1QYWNrZXQgSWRlbnRpZmllciA9ICIsIGlkZW50aWZpZXIpOworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBMZW5ndGggPSAiLCBsZW5ndGgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIGNvZGUgPT0gNCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUC1QYWNrZXQgRmFpbHVyZSIpOworCisgICAgICAgICAgICAvKiBFQVAtUGFja2V0IElkZW50aWZpZXIgKi8KKyAgICAgICAgICAgIGlkZW50aWZpZXIgPSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNSk7CisgICAgICAgICAgICAvKiBFQVAtUGFja2V0IExlbmd0aCAqLworICAgICAgICAgICAgbGVuZ3RoID0gKCgodTE2X3QpIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs2KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs3KTsKKworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiRUFQLVBhY2tldCBJZGVudGlmaWVyID0gIiwgaWRlbnRpZmllcik7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJFQVAtUGFja2V0IExlbmd0aCA9ICIsIGxlbmd0aCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiggcGFja2V0VHlwZSA9PSAxICkKKyAgICB7IC8vIEVBUE9MLVN0YXJ0CisgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUE9MLVN0YXJ0Iik7CisgICAgfQorICAgIGVsc2UgaWYoIHBhY2tldFR5cGUgPT0gMiApCisgICAgeyAvLyBFQVBPTC1Mb2dvZmYKKyAgICAgICAgem1fZGVidWdfbXNnMCgiRUFQT0wtTG9nb2ZmIik7CisgICAgfQorICAgIGVsc2UgaWYoIHBhY2tldFR5cGUgPT0gMyApCisgICAgeyAvLyBFQVBPTC1LZXkKKyAgICAgICAgLyogRUFQT0wtS2V5IHR5cGUgKi8KKyAgICAgICAga2V5VHlwZSA9IHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs0KTsKKyAgICAgICAgLyogRUFQT0wtS2V5IGluZm9ybWF0aW9uICovCisgICAgICAgIGtleUluZm8gPSAoKCh1MTZfdCkgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzUpKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNik7CisgICAgICAgIC8qIEVBUE9MLUtleSBsZW5ndGggKi8KKyAgICAgICAga2V5TGVuID0gKCgodTE2X3QpIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs3KSkgPDwgOCkgKworICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOCk7CisgICAgICAgIC8qIEVBUE9MLUtleSByZXBsYXkgY291bnRlciAoaGlnaCBkb3VibGUgd29yZCkgKi8KKyAgICAgICAgcmVwbGF5Q291bnRlckggPSAoKCh1MzJfdCkgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzkpKSA8PCAyNCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTApKSA8PCAxNikgKworICAgICAgICAgICAgICAgICAgICAgICAgICgoKHUzMl90KSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTEpKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEyKTsKKyAgICAgICAgLyogRUFQT0wtS2V5IHJlcGxheSBjb3VudGVyIChsb3cgZG91YmxlIHdvcmQpICovCisgICAgICAgIHJlcGxheUNvdW50ZXJMID0gKCgodTMyX3QpIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxMykpIDw8IDI0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgKCgodTMyX3QpIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxNCkpIDw8IDE2KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgKCgodTMyX3QpIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxNSkpIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMTYpOworICAgICAgICAvKiBFQVBPTC1LZXkgZGF0YSBsZW5ndGggKi8KKyAgICAgICAga2V5RGF0YUxlbiA9ICgoKHUxNl90KSB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOTcpKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOTgpOworCisgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUE9MLUtleSIpOworICAgICAgICB6bV9kZWJ1Z19tc2cxKCJwYWNrZXQgbGVuZ3RoID0gIiwgcGFja2V0TGVuKTsKKworICAgICAgICBpZiAoIGtleVR5cGUgPT0gMjU0ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgia2V5IHR5cGUgPSAyNTQgKFNTTiBrZXkgZGVzY3JpcHRvcikiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzIoImtleSB0eXBlID0gMHgiLCBrZXlUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHptX2RlYnVnX21zZzIoInJlcGxheSBjb3VudGVyKEwpID0gIiwgcmVwbGF5Q291bnRlckwpOworCisgICAgICAgIHptX2RlYnVnX21zZzIoImtleSBpbmZvcm1hdGlvbiA9ICIsIGtleUluZm8pOworCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF8zICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gcGFpcndpc2Uga2V5Iik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCIgICAgLSBncm91cCBrZXkiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF82ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gVHgga2V5IGluc3RhbGxlZCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gVHgga2V5IG5vdCBzZXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF83ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gQWNrIG5lZWRlZCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gQWNrIG5vdCBuZWVkZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF84ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gTUlDIHNldCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gTUlDIG5vdCBzZXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgga2V5SW5mbyAmIFpNX0JJVF85ICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gcGFja2V0IGVuY3J5cHRlZCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiICAgIC0gcGFja2V0IG5vdCBlbmNyeXB0ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHptX2RlYnVnX21zZzEoImtleUxlbiA9ICIsIGtleUxlbik7CisgICAgICAgIHptX2RlYnVnX21zZzEoImtleURhdGFMZW4gPSAiLCBrZXlEYXRhTGVuKTsKKyAgICB9CisgICAgZWxzZSBpZiggcGFja2V0VHlwZSA9PSA0ICkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIkVBUE9MLUVuY2Fwc3VsYXRlZC1BU0YtQWxlcnQiKTsKKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmaVJlY3Y4MDIxMSAgICAgICAgICAgICAgICAqLworLyogICAgICBDYWxsZWQgdG8gcmVjZWl2ZSA4MDIuMTEgZnJhbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogcmVjZWl2ZWQgODAyLjExIGZyYW1lIGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiAgICAgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuNSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZpUmVjdjgwMjExKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBhZGRJbmZvKQoreworICAgIHU4X3Qgc25hcENhc2U9MCwgZW5jcnlNb2RlOworICAgIHUxNl90IGZyYW1lVHlwZSwgdHlwZUxlbmd0aEZpZWxkOworICAgIHUxNl90IGZyYW1lQ3RybDsKKyAgICB1MTZfdCBmcmFtZVN1YnR5cGU7CisgICAgdTE2X3QgcmV0OworICAgIHUxNl90IGxlbjsKKyAgICB1OF90IGJJc0RlZnJhZyA9IDA7CisgICAgdTE2X3Qgb2Zmc2V0LCB0YWlsTGVuOworICAgIHU4X3QgdmFwID0gMDsKKyAgICB1MTZfdCBkYVszXSwgc2FbM107CisgICAgdTE2X3QgaWk7CisgICAgdThfdCB1YXBzZFRyaWcgPSAwOworICAgIHpidWZfdCogcHNCdWY7CisjaWZkZWYgWk1fRU5BQkxFX05BVElWRV9XSUZJCisgICAgdThfdCBpOworI2VuZGlmCisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBaTV9CVUZGRVJfVFJBQ0UoZGV2LCBidWYpCisKKyAgICAvL3ptX21zZzJfcngoWk1fTFZfMiwgInpmaVJlY3Y4MDIxMSgpLCBidWY9IiwgYnVmKTsKKworICAgIC8vem1fbXNnMl9yeChaTV9MVl8wLCAiaFswXT0iLCB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAwKSk7CisgICAgLy96bV9tc2cyX3J4KFpNX0xWXzAsICJoWzJdPSIsIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDIpKTsKKyAgICAvL3ptX21zZzJfcngoWk1fTFZfMCwgImhbNF09Iiwgem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNCkpOworCisgICAgZnJhbWVDdHJsID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCk7CisgICAgZnJhbWVUeXBlID0gZnJhbWVDdHJsICYgMHhmOworICAgIGZyYW1lU3VidHlwZSA9IGZyYW1lQ3RybCAmIDB4ZjA7CisKKyNpZiAwICAgLy8gTW92ZSB0byBQcm9jZXNzQmVhY29uIHRvIGp1ZGdlIGlmIHRoZXJlJ3MgYSBuZXcgcGVlciBzdGF0aW9uCisgICAgaWYgKCAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUykmJgorICAgICAgICAgKHdkLT5zdGEuaWJzc1BhcnRuZXJTdGF0dXMgIT0gWk1fSUJTU19QQVJUTkVSX0FMSVZFKSApCisgICAgeworICAgICAgICB6ZlN0YUlic3NNb25pdG9yaW5nKGRldiwgYnVmKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8qIElmIGRhdGEgZnJhbWUgKi8KKyAgICBpZiAoZnJhbWVUeXBlID09IFpNX1dMQU5fREFUQV9GUkFNRSkKKyAgICB7CisgICAgICAgIHdkLT5zdGEuVG90YWxOdW1iZXJPZlJlY2VpdmVQYWNrZXRzKys7CisgICAgICAgIHdkLT5zdGEuVG90YWxOdW1iZXJPZlJlY2VpdmVCeXRlcyArPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKyAgICAgICAgLy96bV9kZWJ1Z19tc2cxKCJSZWNlaXZlIHBhY2tldHMgICAgID0gIiwgd2QtPnN0YS5Ub3RhbE51bWJlck9mUmVjZWl2ZVBhY2tldHMpOworCisgICAgICAgIC8vem1fbXNnMF9yeChaTV9MVl8wLCAiUnggZGF0YSIpOworICAgICAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgocmV0ID0gemZBcFVwZGF0ZVBzQml0KGRldiwgYnVmLCAmdmFwLCAmdWFwc2RUcmlnKSkgIT0gWk1fU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoKHVhcHNkVHJpZyYweGYpICE9IDApICYmICgoZnJhbWVTdWJ0eXBlICYgMHg4MCkgIT0gMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdThfdCBhYyA9IHpjVXBUb0FjW3ptd19idWZfcmVhZGIoZGV2LCBidWYsIDI0KSYweDddOworICAgICAgICAgICAgICAgIHU4X3QgcGt0TnVtOworICAgICAgICAgICAgICAgIHU4X3QgbWI7CisgICAgICAgICAgICAgICAgdTE2X3QgZmxhZzsKKyAgICAgICAgICAgICAgICB1OF90IHNyY1s2XTsKKworICAgICAgICAgICAgICAgIC8vcHJpbnRrKCJRb1MgY3RybD0lZFxuIiwgem13X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMjQpKTsKKyAgICAgICAgICAgICAgICAvL3ByaW50aygiVUFQU0QgdHJpZ2dlciwgYWM9JWRcbiIsIGFjKTsKKworICAgICAgICAgICAgICAgIGlmICgoKDB4OD4+YWMpICYgdWFwc2RUcmlnKSAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGt0TnVtID0gemNNYXhzcFRvUGt0TnVtWyh1YXBzZFRyaWc+PjQpICYgMHgzXTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKGlpPTA7IGlpPDY7IGlpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyY1tpaV0gPSB6bXdfYnVmX3JlYWRiKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQraWkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpaT0wOyBpaTxwa3ROdW07IGlpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKChwc0J1ZiA9IHpmUXVldWVHZXQoZGV2LCB3ZC0+YXAudWFwc2RRKSkgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHNCdWYgPSB6ZlF1ZXVlR2V0V2l0aE1hYyhkZXYsIHdkLT5hcC51YXBzZFEsIHNyYywgJm1iKSkgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGlpKzEpID09IHBrdE51bSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRU9TUCBhbnl3YXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZyA9IDB4MTAwIHwgKG1iPDw1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1iICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbW9yZSBkYXRhLCBub3QgRU9TUAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZyA9IDB4MjA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL25vIG1vcmUgZGF0YSwgRU9TUAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZyA9IDB4MTAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmVHhTZW5kRXRoKGRldiwgcHNCdWYsIDAsIFpNX0VYVEVSTkFMX0FMTE9DX0JVRiwgZmxhZyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHNCdWYgPT0gTlVMTCkgfHwgKG1iID09IDApKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaWkgPT0gMCkgJiYgKHBzQnVmID09IE5VTEwpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZTZW5kTW1GcmFtZShkZXYsIFpNX1dMQU5fRlJBTUVfVFlQRV9RT1NfTlVMTCwgKHUxNl90KilzcmMsIDAsIDAsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHUxNl90IGZyYW1lQ3RybE1TQjsKKyAgICAJCXU4X3QgICBic3NpZFs2XTsKKworICAgICAgICAgICAgLyogQ2hlY2sgSXMgUklGUyBmcmFtZSBhbmQgZGVjaWRlIHRvIGVuYWJsZSBSSUZTIG9yIG5vdCAqLworICAgICAgICAgICAgaWYoIHdkLT5zdGEuRW5hYmxlSFQgKQorICAgICAgICAgICAgICAgIHpmQ2hlY2tJc1JJRlNGcmFtZShkZXYsIGJ1ZiwgZnJhbWVTdWJ0eXBlKTsKKworICAgICAgICAgICAgaWYgKCB6ZlBvd2VyU2F2aW5nTWdySXNTbGVlcGluZyhkZXYpIHx8IHdkLT5zdGEucHNNZ3IudGVtcFdha2VVcCA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZyYW1lQ3RybE1TQiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDEpOworCisgICAgICAgICAgICAgICAgLyogY2hlY2sgbW9yZSBkYXRhICovCisgICAgICAgICAgICAgICAgaWYgKCBmcmFtZUN0cmxNU0IgJiBaTV9CSVRfNSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL2lmIHJ4IGZyYW1lJ3MgQUMgaXMgbm90IGRlbGl2ZXJ5LWVuYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh3ZC0+c3RhLnFvc0luZm8mMHhmKSAhPSAweGYpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHU4X3QgcnhBYyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGZyYW1lU3VidHlwZSAmIDB4ODApICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnhBYyA9IHpjVXBUb0FjW3ptd19idWZfcmVhZGIoZGV2LCBidWYsIDI0KSYweDddOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCgweDg+PnJ4QWMpICYgd2QtPnN0YS5xb3NJbmZvKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmU2VuZFBTUG9sbChkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucHNNZ3IudGVtcFdha2VVcCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisJCQkvKmluY3JlYXNlIGJlYWNvbiBjb3VudCB3aGVuIHJlY2VpdmUgdmFpbGQgZGF0YSBmcmFtZSBmcm9tIEFQKi8KKyAgICAgICAgCVpNX01BQ19XT1JEX1RPX0JZVEUod2QtPnN0YS5ic3NpZCwgYnNzaWQpOworCisJCQlpZiAoemZTdGFJc0Nvbm5lY3RlZChkZXYpJiYKKwkJCQl6ZlJ4QnVmZmVyRXF1YWxUb1N0cihkZXYsIGJ1ZiwgYnNzaWQsIFpNX1dMQU5fSEVBREVSX0EyX09GRlNFVCwgNikpCisJCQl7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5yeEJlYWNvbkNvdW50Kys7CisJCQl9CisgICAgICAgIH0KKworICAgICAgICB6bV9tc2cxX3J4KFpNX0xWXzIsICJSeCBWQVA9IiwgdmFwKTsKKworICAgICAgICAvKiBoYW5kbGUgSVYsIEVYVC1JViwgSUNWLCBhbmQgRVhULUlDViAqLworICAgICAgICB6ZkdldFJ4SXZJY3ZMZW5ndGgoZGV2LCBidWYsIHZhcCwgJm9mZnNldCwgJnRhaWxMZW4sIGFkZEluZm8pOworCisgICAgICAgIHpmU3RhSWJzc1BTQ2hlY2tTdGF0ZShkZXYsIGJ1Zik7CisgICAgICAgIC8vUW9TIGRhdGEgZnJhbWUKKyAgICAgICAgaWYgKChmcmFtZVN1YnR5cGUgJiAweDgwKSA9PSAweDgwKQorICAgICAgICB7CisgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgfQorCisgICAgICAgIGxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworICAgICAgICAvKiByZW1vdmUgSUNWICovCisgICAgICAgIGlmICh0YWlsTGVuID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGxlbiA+IHRhaWxMZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGVuIC09IHRhaWxMZW47CisgICAgICAgICAgICAgICAgemZ3QnVmU2V0U2l6ZShkZXYsIGJ1ZiwgbGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIEZpbHRlciBOVUxMIGRhdGEgKi8KKyAgICAgICAgaWYgKCgoZnJhbWVTdWJ0eXBlJjB4NDApICE9IDApIHx8ICgobGVuID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1ZikpPD0yNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX21zZzFfcngoWk1fTFZfMSwgIkZyZWUgUnggTlVMTCBkYXRhLCBsZW49IiwgbGVuKTsKKyAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLyogY2hlY2sgYW5kIGhhbmRsZSBkZWZyYWdtZW50YXRpb24gKi8KKyAgICAgICAgaWYgKCB3ZC0+c3RhLmJTYWZlTW9kZSAmJiAod2QtPnN0YS53ZXBTdGF0dXMgPT0gWk1fRU5DUllQVElPTl9BRVMpICYmIHdkLT5zdGEuU1dFbmNyeXB0RW5hYmxlICkKKyAgICAgICAgeworICAgICAgICAgICAgem1fbXNnMF9yeChaTV9MVl8xLCAiQnlwYXNzIGRlZnJhZ21lbnRhdGlvbiBwYWNrZXRzIGluIHNhZmUgbW9kZSIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCAoYnVmID0gemZEZWZyYWdtZW50KGRldiwgYnVmLCAmYklzRGVmcmFnLCBhZGRJbmZvKSkgPT0gTlVMTCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogSW4gdGhpcyBjYXNlLCB0aGUgYnVmZmVyIGhhcyBiZWVuIGZyZWVkIGluIHpmRGVmcmFnbWVudCAqLworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IFpNX01JQ19TVUNDRVNTOworCisgICAgICAgIC8qIElmIFNXIFdFUC9US0lQIGFyZSBub3QgdHVybmVkIG9uICovCisgICAgICAgIGlmICgod2QtPnN0YS5TV0VuY3J5cHRFbmFibGUgJiBaTV9TV19US0lQX0RFQ1JZX0VOKSA9PSAwICYmCisgICAgICAgICAgICAod2QtPnN0YS5TV0VuY3J5cHRFbmFibGUgJiBaTV9TV19XRVBfREVDUllfRU4pID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGVuY3J5TW9kZSA9IHpmR2V0RW5jcnlNb2RlRnJvbVJ4U3RhdHVzKGFkZEluZm8pOworCisgICAgICAgICAgICAvKiBjaGVjayBpZiBUS0lQICovCisgICAgICAgICAgICBpZiAoIGVuY3J5TW9kZSA9PSBaTV9US0lQICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIGJJc0RlZnJhZyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXQgPSB6Zk1pY1J4VmVyaWZ5KGRldiwgYnVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgTUlDIGZhaWx1cmUgYml0ICovCisgICAgICAgICAgICAgICAgICAgIGlmICggWk1fUlhfU1RBVFVTX0lTX01JQ19GQUlMKGFkZEluZm8pICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gWk1fTUlDX0ZBSUxVUkU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIHJldCA9PSBaTV9NSUNfRkFJTFVSRSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1OF90IFVuaWNhc3RfUGt0ID0gMHgwOworCisgICAgICAgICAgICAgICAgICAgIGlmICgoem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTFfT0ZGU0VUKSAmIDB4MSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmNvbW1UYWxseS5zd1J4VW5pY2FzdE1pY0ZhaWxDb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgVW5pY2FzdF9Qa3QgPSAweDE7CisgICAgICAgICAgICAgICAgICAgIH0vKgorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQpID09IDB4ZmZmZikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmNvbW1UYWxseS5zd1J4TXVsdGljYXN0TWljRmFpbENvdW50Kys7CisgICAgICAgICAgICAgICAgICAgIH0qLworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5jb21tVGFsbHkuc3dSeE11bHRpY2FzdE1pY0ZhaWxDb3VudCsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfQVAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBpZHg7CisgICAgICAgICAgICAgICAgICAgICAgICB1OF90IGFkZHJbNl07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaWR4PTA7IGlkeDw2OyBpZHgrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyW2lkeF0gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQraWR4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT56ZmNiQXBNaWNGYWlsdXJlTm90aWZ5ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnpmY2JBcE1pY0ZhaWx1cmVOb3RpZnkoZGV2LCBhZGRyLCBidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoVW5pY2FzdF9Qa3QpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiQ291bnRlcm1lYXN1cmUgOiBVbmljYXN0X1BrdCAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJDb3VudGVybWVhc3VyZSA6IE5vbi1VbmljYXN0X1BrdCAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoKHdkLT5US0lQX0dyb3VwX0tleUNoYW5naW5nID09IDB4MCkgfHwgKFVuaWNhc3RfUGt0ID09IDB4MSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiQ291bnRlcm1lYXN1cmUgOiBEbyBNSUMgQ2hlY2sgIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZTdGFNaWNGYWlsdXJlSGFuZGxpbmcoZGV2LCBidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkNvdW50ZXJtZWFzdXJlIDogU0tJUCBNSUMgQ2hlY2sgZHVlIHRvIEdyb3VwIEtleWNoYW5naW5nICIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8qIERpc2NhcmQgTUlDIGZhaWxlZCBmcmFtZSAqLworICAgICAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHU4X3QgSXNFbmNyeUZyYW1lOworCisgICAgICAgICAgICAvKiBUT0RPOiBDaGVjayB3aGV0aGVyIFdFUCBiaXQgaXMgdHVybmVkIG9uIGluIE1BQyBoZWFkZXIgKi8KKyAgICAgICAgICAgIGVuY3J5TW9kZSA9IFpNX05PX1dFUDsKKworICAgICAgICAgICAgSXNFbmNyeUZyYW1lID0gKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDEpICYgMHg0MCk7CisKKyAgICAgICAgICAgIGlmIChJc0VuY3J5RnJhbWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogU29mdHdhcmUgZGVjcnlwdGlvbiBmb3IgVEtJUCAqLworICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLlNXRW5jcnlwdEVuYWJsZSAmIFpNX1NXX1RLSVBfREVDUllfRU4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1MTZfdCBpdjE2OworICAgICAgICAgICAgICAgICAgICB1MTZfdCBpdjMyOworICAgICAgICAgICAgICAgICAgICB1OF90IFJDNEtleVsxNl07CisgICAgICAgICAgICAgICAgICAgIHUxNl90IEl2T2Zmc2V0OworICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgenNUa2lwU2VlZCAqcnhTZWVkOworCisgICAgICAgICAgICAgICAgICAgIEl2T2Zmc2V0ID0gb2Zmc2V0ICsgWk1fU0laRV9PRl9XTEFOX0RBVEFfSEVBREVSOworCisgICAgICAgICAgICAgICAgICAgIHJ4U2VlZCA9IHpmU3RhR2V0UnhTZWVkKGRldiwgYnVmKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocnhTZWVkID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoInJ4U2VlZCBpcyBOVUxMIik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIERpc2NhcmQgdGhpcyBmcmFtZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpdjE2ID0gKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIEl2T2Zmc2V0KSA8PCA4KSArIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIEl2T2Zmc2V0KzIpOworICAgICAgICAgICAgICAgICAgICBpdjMyID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgSXZPZmZzZXQrNCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIEl2T2Zmc2V0KzUpIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBJdk9mZnNldCs2KSA8PCAxNikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIEl2T2Zmc2V0KzcpIDw8IDI0KTsKKworICAgICAgICAgICAgICAgICAgICAvKiBUS0lQIEtleSBNaXhpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgemZUa2lwUGhhc2UxS2V5TWl4KGl2MzIsIHJ4U2VlZCk7CisgICAgICAgICAgICAgICAgICAgIHpmVGtpcFBoYXNlMktleU1peChpdjE2LCByeFNlZWQpOworICAgICAgICAgICAgICAgICAgICB6ZlRraXBHZXRzZWVkcyhpdjE2LCBSQzRLZXksIHJ4U2VlZCk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogRGVjcnlwdCBEYXRhICovCisgICAgICAgICAgICAgICAgICAgIHJldCA9IHpmVEtJUERlY3J5cHQoZGV2LCBidWYsIEl2T2Zmc2V0K1pNX1NJWkVfT0ZfSVYrWk1fU0laRV9PRl9FWFRfSVYsIDE2LCBSQzRLZXkpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gWk1fSUNWX0ZBSUxVUkUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlRLSVAgSUNWIGZhaWwiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogRGlzY2FyZCBJQ1YgZmFpbGVkIGZyYW1lICovCisgICAgICAgICAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8qIFJlbW92ZSBJQ1YgZnJvbSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgemZ3QnVmU2V0U2l6ZShkZXYsIGJ1ZiwgbGVuLTQpOworCisgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIE1JQyAqLworICAgICAgICAgICAgICAgICAgICByZXQgPSB6Zk1pY1J4VmVyaWZ5KGRldiwgYnVmKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID09IFpNX01JQ19GQUlMVVJFKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0ExX09GRlNFVCkgJiAweDEpID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmNvbW1UYWxseS5zd1J4VW5pY2FzdE1pY0ZhaWxDb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTFfT0ZGU0VUKSA9PSAweGZmZmYpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmNvbW1UYWxseS5zd1J4TXVsdGljYXN0TWljRmFpbENvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmNvbW1UYWxseS5zd1J4TXVsdGljYXN0TWljRmFpbENvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBpZHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdThfdCBhZGRyWzZdOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpZHg9MDsgaWR4PDY7IGlkeCsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcltpZHhdID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUK2lkeCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT56ZmNiQXBNaWNGYWlsdXJlTm90aWZ5ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+emZjYkFwTWljRmFpbHVyZU5vdGlmeShkZXYsIGFkZHIsIGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmU3RhTWljRmFpbHVyZUhhbmRsaW5nKGRldiwgYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiTUlDIGZhaWwiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIERpc2NhcmQgTUlDIGZhaWxlZCBmcmFtZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBlbmNyeU1vZGUgPSBaTV9US0lQOworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gWk1fU0laRV9PRl9JViArIFpNX1NJWkVfT0ZfRVhUX0lWOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKHdkLT5zdGEuU1dFbmNyeXB0RW5hYmxlICYgWk1fU1dfV0VQX0RFQ1JZX0VOKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdTE2X3QgSXZPZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIHU4X3Qga2V5TGVuID0gNTsKKyAgICAgICAgICAgICAgICAgICAgdThfdCBpdlszXTsKKyAgICAgICAgICAgICAgICAgICAgdThfdCAqd2VwS2V5OworICAgICAgICAgICAgICAgICAgICB1OF90IGtleUlkeDsKKworICAgICAgICAgICAgICAgICAgICBJdk9mZnNldCA9IG9mZnNldCArIFpNX1NJWkVfT0ZfV0xBTl9EQVRBX0hFQURFUjsKKworICAgICAgICAgICAgICAgICAgICAvKiBSZXRyaWV2ZSBJViAqLworICAgICAgICAgICAgICAgICAgICBpdlswXSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIEl2T2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgaXZbMV0gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBJdk9mZnNldCsxKTsKKyAgICAgICAgICAgICAgICAgICAgaXZbMl0gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBJdk9mZnNldCsyKTsKKworICAgICAgICAgICAgICAgICAgICBrZXlJZHggPSAoKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIEl2T2Zmc2V0KzMpID4+IDYpICYgMHgwMyk7CisKKyAgICAgICAgICAgICAgICAgICAgSXZPZmZzZXQgKz0gWk1fU0laRV9PRl9JVjsKKworICAgICAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5TV0VuY3J5TW9kZVtrZXlJZHhdID09IFpNX1dFUDY0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBrZXlMZW4gPSA1OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdkLT5zdGEuU1dFbmNyeU1vZGVba2V5SWR4XSA9PSBaTV9XRVAxMjgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleUxlbiA9IDEzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdkLT5zdGEuU1dFbmNyeU1vZGVba2V5SWR4XSA9PSBaTV9XRVAyNTYpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleUxlbiA9IDI5OworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgemZXRVBEZWNyeXB0KGRldiwgYnVmLCBJdk9mZnNldCwga2V5TGVuLCB3ZC0+c3RhLndlcEtleVtrZXlJZHhdLCBpdik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBaTV9JQ1ZfRkFJTFVSRSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiV0VQIElDViBmYWlsIik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIERpc2NhcmQgSUNWIGZhaWxlZCBmcmFtZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBlbmNyeU1vZGUgPSB3ZC0+c3RhLlNXRW5jcnlNb2RlW2tleUlkeF07CisKKyAgICAgICAgICAgICAgICAgICAgLyogUmVtb3ZlIElDViBmcm9tIGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICB6ZndCdWZTZXRTaXplKGRldiwgYnVmLCBsZW4tNCk7CisKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IFpNX1NJWkVfT0ZfSVY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICAvL2Vsc2UgaWYgKCBlbmNyeU1vZGUgPT0gWk1fQ0VOQyApIC8qIGNoZWNrIGlmIENFTkMgKi8KKyAgICAgICAgaWYgKCBlbmNyeU1vZGUgPT0gWk1fQ0VOQyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHUzMl90IHJ4SVZbNF07CisKKyAgICAgICAgICAgIHJ4SVZbMF0gPSAoem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMjgpIDw8IDE2KQorICAgICAgICAgICAgICAgICAgICAgKyB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAyNik7CisgICAgICAgICAgICByeElWWzFdID0gKHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDMyKSA8PCAxNikKKyAgICAgICAgICAgICAgICAgICAgICsgem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMzApOworICAgICAgICAgICAgcnhJVlsyXSA9ICh6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAzNikgPDwgMTYpCisgICAgICAgICAgICAgICAgICAgICArIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDM0KTsKKyAgICAgICAgICAgIHJ4SVZbM10gPSAoem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNDApIDw8IDE2KQorICAgICAgICAgICAgICAgICAgICAgKyB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAzOCk7CisKKyAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMigicnhJVlswXSA9IDB4IiwgcnhJVlswXSk7CisgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzIoInJ4SVZbMV0gPSAweCIsIHJ4SVZbMV0pOworICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cyKCJyeElWWzJdID0gMHgiLCByeElWWzJdKTsKKyAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMigicnhJVlszXSA9IDB4IiwgcnhJVlszXSk7CisKKyAgICAgICAgICAgIC8qIGRlc3RpbmF0aW9uIGFkZHJlc3MqLworICAgICAgICAgICAgZGFbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQpOworICAgICAgICAgICAgZGFbMV0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQrMik7CisgICAgICAgICAgICBkYVsyXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0ExX09GRlNFVCs0KTsKKworICAgICAgICAgICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChkYVswXSAmIDB4MSkpCisgICAgICAgICAgICAgICAgeyAvL211bHRpY2FzdCBmcmFtZQorICAgICAgICAgICAgICAgICAgICAvKiBBY2N1bWxhdGUgdGhlIFBOIHNlcXVlbmNlICovCisgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucnhpdkdLWzBdICsrOworCisgICAgICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLnJ4aXZHS1swXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZHS1sxXSsrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEucnhpdkdLWzFdID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucnhpdkdLWzJdKys7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5yeGl2R0tbMl0gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2R0tbM10rKzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLnJ4aXZHS1szXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZHS1swXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZHS1sxXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZHS1syXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzIoIndkLT5zdGEucnhpdkdLWzBdID0gMHgiLCB3ZC0+c3RhLnJ4aXZHS1swXSk7CisgICAgICAgICAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMigid2QtPnN0YS5yeGl2R0tbMV0gPSAweCIsIHdkLT5zdGEucnhpdkdLWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cyKCJ3ZC0+c3RhLnJ4aXZHS1syXSA9IDB4Iiwgd2QtPnN0YS5yeGl2R0tbMl0pOworICAgICAgICAgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzIoIndkLT5zdGEucnhpdkdLWzNdID0gMHgiLCB3ZC0+c3RhLnJ4aXZHS1szXSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAhKCh3ZC0+c3RhLnJ4aXZHS1swXSA9PSByeElWWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHdkLT5zdGEucnhpdkdLWzFdID09IHJ4SVZbMV0pCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAod2QtPnN0YS5yeGl2R0tbMl0gPT0gcnhJVlsyXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICh3ZC0+c3RhLnJ4aXZHS1szXSA9PSByeElWWzNdKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHU4X3QgUGFja2V0RGlzY2FyZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBEaXNjYXJkIFBOIENvZGUgRXJyb3IgZnJhbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyeElWWzBdIDwgd2QtPnN0YS5yeGl2R0tbMF0pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2V0RGlzY2FyZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5yeGl2R0tbMF0gPiAweGZmZmZmZmYwKQorICAgICAgICAgICAgICAgICAgICAgICAgeyAvL2JvdW5kYXJ5IGNhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHJ4SVZbMF0gPCAweGZmZmZmZmYwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKCgweGZmZmZmZmZmIC0gd2QtPnN0YS5yeGl2R0tbMF0pICsgcnhJVlswXSkgPiAxNikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWNrZXREaXNjYXJkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7IC8vbm9ybWFsIGNhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHJ4SVZbMF0gLSB3ZC0+c3RhLnJ4aXZHS1swXSkgPiAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2tldERpc2NhcmQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN5bmMgc3RhIHBuIGNvZGUgd2l0aCBhcCBiZWNhdXNlIG9mIGxvc3Rpbmcgc29tZSBwYWNrZXRzCisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZHS1swXSA9IHJ4SVZbMF07CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZHS1sxXSA9IHJ4SVZbMV07CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZHS1syXSA9IHJ4SVZbMl07CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZHS1szXSA9IHJ4SVZbM107CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUGFja2V0RGlzY2FyZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJEaXNjYXJkIFBOIENvZGUgbG9zdCB0b28gbXVjaCBtdWx0aWNhc3QgZnJhbWUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsgLy91bmljYXN0IGZyYW1lCisgICAgICAgICAgICAgICAgICAgIC8qIEFjY3VtbGF0ZSB0aGUgUE4gc2VxdWVuY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2WzBdICs9IDI7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEucnhpdlswXSA9PSAwIHx8IHdkLT5zdGEucnhpdlswXSA9PSAxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZbMV0rKzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLnJ4aXZbMV0gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2WzJdKys7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAod2QtPnN0YS5yeGl2WzJdID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucnhpdlszXSsrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEucnhpdlszXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZbMF0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2WzFdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucnhpdlsyXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzIoIndkLT5zdGEucnhpdlswXSA9IDB4Iiwgd2QtPnN0YS5yeGl2WzBdKTsKKyAgICAgICAgICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cyKCJ3ZC0+c3RhLnJ4aXZbMV0gPSAweCIsIHdkLT5zdGEucnhpdlsxXSk7CisgICAgICAgICAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMigid2QtPnN0YS5yeGl2WzJdID0gMHgiLCB3ZC0+c3RhLnJ4aXZbMl0pOworICAgICAgICAgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzIoIndkLT5zdGEucnhpdlszXSA9IDB4Iiwgd2QtPnN0YS5yeGl2WzNdKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoICEoKHdkLT5zdGEucnhpdlswXSA9PSByeElWWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHdkLT5zdGEucnhpdlsxXSA9PSByeElWWzFdKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHdkLT5zdGEucnhpdlsyXSA9PSByeElWWzJdKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHdkLT5zdGEucnhpdlszXSA9PSByeElWWzNdKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlBOIENvZGUgbWlzbWF0Y2gsIGxvc3QgdW5pY2FzdCBmcmFtZSwgc3luYyBwbiBjb2RlIHRvIHJlY3YgcGFja2V0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzeW5jIHN0YSBwbiBjb2RlIHdpdGggYXAgYmVjYXVzZSBvZiBsb3N0aW5nIHNvbWUgcGFja2V0cworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2WzBdID0gcnhJVlswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucnhpdlsxXSA9IHJ4SVZbMV07CisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJ4aXZbMl0gPSByeElWWzJdOworICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yeGl2WzNdID0gcnhJVlszXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIERpc2NhcmQgUE4gQ29kZSBFcnJvciBmcmFtZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cwKCJEaXNjYXJkIFBOIENvZGUgbWlzbWF0Y2ggdW5pY2FzdCBmcmFtZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgLy96ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworCisgICAgICAgIC8qIGZvciB0YWxseSAqLworICAgICAgICBpZiAoKHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIFpNX1dMQU5fSEVBREVSX0ExX09GRlNFVCkgJiAweDEpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGZvciBBQ1UgdG8gZGlzcGxheSBSeFJhdGUgKi8KKyAgICAgICAgICAgIHpmV2xhblVwZGF0ZVJ4UmF0ZShkZXYsIGFkZEluZm8pOworCisgICAgICAgICAgICB3ZC0+Y29tbVRhbGx5LnJ4VW5pY2FzdEZybSsrOworICAgICAgICAgICAgd2QtPmNvbW1UYWxseS5yeFVuaWNhc3RPY3RldHMgKz0gKGxlbi0yNCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTFfT0ZGU0VUKSA9PSAweGZmZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5jb21tVGFsbHkucnhCcm9hZGNhc3RGcm0rKzsKKyAgICAgICAgICAgIHdkLT5jb21tVGFsbHkucnhCcm9hZGNhc3RPY3RldHMgKz0gKGxlbi0yNCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+Y29tbVRhbGx5LnJ4TXVsdGljYXN0RnJtKys7CisgICAgICAgICAgICB3ZC0+Y29tbVRhbGx5LnJ4TXVsdGljYXN0T2N0ZXRzICs9IChsZW4tMjQpOworICAgICAgICB9CisgICAgICAgIHdkLT5sZWRTdHJ1Y3QucnhUcmFmZmljKys7CisKKyAgICAgICAgaWYgKChmcmFtZVN1YnR5cGUgJiAweDgwKSA9PSAweDgwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBpZiBRb1MgY29udHJvbCBiaXQtNyBpcyAxID0+IEEtTVNEVSBmcmFtZSAqLworICAgICAgICAgICAgaWYgKCh6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAyNCkgJiAweDgwKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmRGVBbXNkdShkZXYsIGJ1ZiwgdmFwLCBlbmNyeU1vZGUpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlbW92ZSBNSUMgb2YgVEtJUAorICAgICAgICBpZiAoIGVuY3J5TW9kZSA9PSBaTV9US0lQICkKKyAgICAgICAgeworICAgICAgICAgICAgemZ3QnVmU2V0U2l6ZShkZXYsIGJ1ZiwgemZ3QnVmR2V0U2l6ZShkZXYsIGJ1ZikgLSA4KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENvbnZlcnQgODAyLjExIGFuZCBTTkFQIGhlYWRlciB0byBldGhlcm5ldCBoZWFkZXIgKi8KKyAgICAgICAgaWYgKCAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUpfHwKKyAgICAgICAgICAgICAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUykgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBkZXN0aW5hdGlvbiBhZGRyZXNzKi8KKyAgICAgICAgICAgIGRhWzBdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTFfT0ZGU0VUKTsKKyAgICAgICAgICAgIGRhWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTFfT0ZGU0VUKzIpOworICAgICAgICAgICAgZGFbMl0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQrNCk7CisKKyAgICAgICAgICAgIC8qIGNoZWNrIGJyb2FkY2FzdCBmcmFtZSAqLworICAgICAgICAgICAgaWYgKCAoZGFbMF0gPT0gMHhmZmZmKSAmJiAoZGFbMV0gPT0gMHhmZmZmKSAmJiAoZGFbMl0gPT0gMHhmZmZmKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQXAgc2VuZCBicm9hZGNhc3QgZnJhbWUgdG8gdGhlIERVVCAhCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBjaGVjayBtdWx0aWNhc3QgZnJhbWUgKi8KKyAgICAgICAgICAgIC8qIFRPRE8gOiBSZW1vdmUgdGhlc2UgY29kZSwgaGFyZHdhcmUgc2hvdWxkIGJlIGFibGUgdG8gYmxvY2sgKi8KKyAgICAgICAgICAgIC8qICAgICAgICBtdWx0aWNhc3QgZnJhbWUgb24gdGhlIG11bHRpY2FzdCBhZGRyZXNzIGxpc3QgICAgICAgKi8KKyAgICAgICAgICAgIC8qICAgICAgICBvciBieXBhc3MgYWxsIG11bHRpY2FzdCBwYWNrZXQgYnkgZmxhZyBiQWxsTXVsdGljYXN0ICovCisgICAgICAgICAgICBlbHNlIGlmICgoZGFbMF0gJiAweDAxKSAmJiAod2QtPnN0YS5iQWxsTXVsdGljYXN0ID09IDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcihpaT0wOyBpaTx3ZC0+c3RhLm11bHRpY2FzdExpc3Quc2l6ZTsgaWkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggemZNZW1vcnlJc0VxdWFsKHdkLT5zdGEubXVsdGljYXN0TGlzdC5tYWNBZGRyW2lpXS5hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodThfdCopIGRhLCA2KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIGlpID09IHdkLT5zdGEubXVsdGljYXN0TGlzdC5zaXplICkKKyAgICAgICAgICAgICAgICB7ICAgLyogbm90IGZvdW5kICovCisgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoImRpc2NhcmQgdW5rbm93biBtdWx0aWNhc3QgZnJhbWUiKTsKKworICAgICAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworI2lmZGVmIFpNX0VOQUJMRV9OQVRJVkVfV0lGSSAvL05hdGl2ZSBXaWZpIDogMSwgRXRoZXJuZXQgZm9ybWF0IDogMAorICAgICAgICAgICAgLy9UbyByZW1vdmUgSVYKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaT0xMjsgaT4wOyBpLS0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgKChpLTEpKjIpK29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAoaS0xKSoyKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHpmd0J1ZlJlbW92ZUhlYWQoZGV2LCBidWYsIG9mZnNldCk7CisgICAgICAgICAgICB9CisjZWxzZQorCisgICAgICAgICAgICBpZiAoemZSeEJ1ZmZlckVxdWFsVG9TdHIoZGV2LCBidWYsIHpnU25hcEJyaWRnZVR1bm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNCtvZmZzZXQsIDYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNuYXBDYXNlID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCB6ZlJ4QnVmZmVyRXF1YWxUb1N0cihkZXYsIGJ1ZiwgemdTbmFwODAyMWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQrb2Zmc2V0LCA2KSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHlwZUxlbmd0aEZpZWxkID0KKyAgICAgICAgICAgICAgICAgICAgKCgodTE2X3QpIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDMwK29mZnNldCkpIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMzErb2Zmc2V0KTsKKworICAgICAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMigidHB5ZUxlbmd0aEZpZWxkID0gIiwgdHlwZUxlbmd0aEZpZWxkKTsKKworICAgICAgICAgICAgICAgIC8vODEzNyA6IElQWCwgODBGMyA6IEFwcGxldGFsaworICAgICAgICAgICAgICAgIGlmICggKHR5cGVMZW5ndGhGaWVsZCAhPSAweDgxMzcpJiYKKyAgICAgICAgICAgICAgICAgICAgICh0eXBlTGVuZ3RoRmllbGQgIT0gMHg4MEYzKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzbmFwQ2FzZSA9IDI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCB0eXBlTGVuZ3RoRmllbGQgPT0gMHg4ODhFICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHpmU2hvd1J4RUFQT0woZGV2LCBidWYsIDMyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy96ZndEdW1wQnVmKGRldiwgYnVmKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogc291cmNlIGFkZHJlc3MgKi8KKyAgICAgICAgICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFNBID0gQWRkcmVzcyAzICovCisgICAgICAgICAgICAgICAgc2FbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BM19PRkZTRVQpOworICAgICAgICAgICAgICAgIHNhWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VUKzIpOworICAgICAgICAgICAgICAgIHNhWzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VUKzQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFNBID0gQWRkcmVzcyAyICovCisgICAgICAgICAgICAgICAgc2FbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQpOworICAgICAgICAgICAgICAgIHNhWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUKzIpOworICAgICAgICAgICAgICAgIHNhWzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUKzQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHNuYXBDYXNlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBTQSAqLworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyNCtvZmZzZXQsIHNhWzBdKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjYrb2Zmc2V0LCBzYVsxXSk7CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDI4K29mZnNldCwgc2FbMl0pOworCisgICAgICAgICAgICAgICAgLyogREEgPSBBZGRyZXNzIDEgKi8KKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMTgrb2Zmc2V0LCBkYVswXSk7CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDIwK29mZnNldCwgZGFbMV0pOworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyMitvZmZzZXQsIGRhWzJdKTsKKyAgICAgICAgICAgICAgICB6ZndCdWZSZW1vdmVIZWFkKGRldiwgYnVmLCAxOCtvZmZzZXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFNBICovCisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDE2K29mZnNldCwgc2FbMF0pOworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAxOCtvZmZzZXQsIHNhWzFdKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjArb2Zmc2V0LCBzYVsyXSk7CisKKyAgICAgICAgICAgICAgICAvKiBEQSA9IEFkZHJlc3MgMSAqLworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAxMCtvZmZzZXQsIGRhWzBdKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMTIrb2Zmc2V0LCBkYVsxXSk7CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDE0K29mZnNldCwgZGFbMl0pOworICAgICAgICAgICAgICAgIHpmd0J1ZlJlbW92ZUhlYWQoZGV2LCBidWYsIDEwK29mZnNldCk7CisgICAgICAgICAgICAgICAgLyogRXRoZXJuZXQgcGF5bG9hZCBsZW5ndGggKi8KKyAgICAgICAgICAgICAgICB0eXBlTGVuZ3RoRmllbGQgPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKSAtIDE0OworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAxMiwgKHR5cGVMZW5ndGhGaWVsZDw8OCkrKHR5cGVMZW5ndGhGaWVsZD4+OCkpOworICAgICAgICAgICAgfQorI2VuZGlmICAvLyBaTV9FTkFCTEVfTkFUSVZFX1dJRkkKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKKyAgICAgICAgeworICAgICAgICAgICAgLy9pZiAoKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDEpICYgMHgzKSAhPSAzKQorICAgICAgICAgICAgaWYgKHZhcCA8IFpNX01BWF9BUF9TVVBQT1JUKQorICAgICAgICAgICAgLyogQVAgbW9kZSAqLworICAgICAgICAgICAgeworI2lmZGVmIFpNX0VOQUJMRV9OQVRJVkVfV0lGSSAvL05hdGl2ZSBXaWZpIDogMSwgRXRoZXJuZXQgZm9ybWF0IDogMAorICAgICAgICAgICAgICAgIC8vVG8gcmVtb3ZlIElWCisgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MTI7IGk+MDsgaS0tKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgKChpLTEpKjIpK29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgKGktMSkqMikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHpmd0J1ZlJlbW92ZUhlYWQoZGV2LCBidWYsIG9mZnNldCk7CisgICAgICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgICAgICAvKiBTQSA9IEFkZHJlc3MgMiAqLworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyNCtvZmZzZXQsIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQpKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjYrb2Zmc2V0LCB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUKzIpKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjgrb2Zmc2V0LCB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUKzQpKTsKKyAgICAgICAgICAgICAgICAvKiBEQSA9IEFkZHJlc3MgMyAqLworICAgICAgICAgICAgICAgIC8qIFNlcSA6IFJlYWQgMjAgd3JpdGUgMjIsIHJlYWQgMTggd3JpdGUgMjAsIHJlYWQgMTYgd3JpdGUgMTggKi8KKyAgICAgICAgICAgICAgICAvKiBzZXF1ZW5jZSBtdXN0IG5vdCBiZSBpbnZlcnRlZCAqLworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyMitvZmZzZXQsIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0hFQURFUl9BM19PRkZTRVQrNCkpOworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyMCtvZmZzZXQsIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0hFQURFUl9BM19PRkZTRVQrMikpOworICAgICAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAxOCtvZmZzZXQsIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0hFQURFUl9BM19PRkZTRVQpKTsKKyAgICAgICAgICAgICAgICB6ZndCdWZSZW1vdmVIZWFkKGRldiwgYnVmLCAxOCtvZmZzZXQpOworI2VuZGlmICAvLyBaTV9FTkFCTEVfTkFUSVZFX1dJRkkKKyAgICAgICAgICAgICAgICAjaWYgMQorICAgICAgICAgICAgICAgIGlmICgocmV0ID0gemZJbnRyYWJzc0ZvcndhcmQoZGV2LCBidWYsIHZhcCkpID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFJ4IGJ1ZmZlciBpZiBpbnRyYS1CU1MgdW5pY2FzdCBmcmFtZSAqLworICAgICAgICAgICAgICAgICAgICB6bV9tc2cwX3J4KFpNX0xWXzIsICJGcmVlIGludHJhLUJTUyB1bmljYXN0IGZyYW1lIik7CisgICAgICAgICAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgLyogV0RTIG1vZGUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9tc2cwX3J4KFpNX0xWXzIsICJSeCBXRFMgZGF0YSIpOworCisgICAgICAgICAgICAgICAgLyogU0EgPSBBZGRyZXNzIDQgKi8KKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMzArb2Zmc2V0LCB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTRfT0ZGU0VUKSk7CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDMyK29mZnNldCwgem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fSEVBREVSX0E0X09GRlNFVCsyKSk7CisgICAgICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDM0K29mZnNldCwgem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fSEVBREVSX0E0X09GRlNFVCs0KSk7CisgICAgICAgICAgICAgICAgLyogREEgPSBBZGRyZXNzIDMgKi8KKyAgICAgICAgICAgICAgICAvKiBTZXEgOiBSZWFkIDIwIHdyaXRlIDIyLCByZWFkIDE4IHdyaXRlIDIwLCByZWFkIDE2IHdyaXRlIDE4ICovCisgICAgICAgICAgICAgICAgLyogc2VxdWVuY2UgbXVzdCBub3QgYmUgaW52ZXJ0ZWQgKi8KKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjgrb2Zmc2V0LCB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VUKzQpKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjYrb2Zmc2V0LCB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VUKzIpKTsKKyAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjQrb2Zmc2V0LCB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTNfT0ZGU0VUKSk7CisgICAgICAgICAgICAgICAgemZ3QnVmUmVtb3ZlSGVhZChkZXYsIGJ1ZiwgMjQrb2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9QU0VVRE8pCisgICAgICAgIHsKKwkJCS8qIFdEUyB0ZXN0OiByZW1vdmUgYWRkNCAqLworICAgICAgICAgICAgaWYgKHdkLT5lbmFibGVXRFMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFNBID0gQWRkcmVzcyAyICovCisgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjQrb2Zmc2V0LCB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUKSk7CisgICAgICAgICAgICB6bXdfcnhfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgMjYrb2Zmc2V0LCB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9IRUFERVJfQTJfT0ZGU0VUKzIpKTsKKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyOCtvZmZzZXQsIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQrNCkpOworICAgICAgICAgICAgLyogREEgPSBBZGRyZXNzIDEgKi8KKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAxOCtvZmZzZXQsIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQpKTsKKyAgICAgICAgICAgIHptd19yeF9idWZfd3JpdGVoKGRldiwgYnVmLCAyMCtvZmZzZXQsIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0hFQURFUl9BMV9PRkZTRVQrMikpOworICAgICAgICAgICAgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIDIyK29mZnNldCwgem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fSEVBREVSX0ExX09GRlNFVCs0KSk7CisgICAgICAgICAgICB6ZndCdWZSZW1vdmVIZWFkKGRldiwgYnVmLCAxOCtvZmZzZXQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgem1fYXNzZXJ0KDApOworICAgICAgICB9CisKKyAgICAgICAgLyogQ2FsbCB6ZndSZWN2RXRoKCkgdG8gbm90aWZ5IHVwcGVyIGxheWVyICovCisgICAgICAgIC8vem1fbXNnMl9yeChaTV9MVl8yLCAiQ2FsbCB6ZndSZWN2RXRoKCksIGJ1Zj0iLCBidWYpOworICAgICAgICAvL3pmd0R1bXBCdWYoZGV2LCBidWYpOworCisgICAgICAgICNpZiBaTV9QUk9UT0NPTF9SRVNQT05TRV9TSU1VTEFUSU9OID09IDEKKyAgICAgICAgemZQcm90UnNwU2ltKGRldiwgYnVmKTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIC8vemZ3RHVtcEJ1ZihkZXYsIGJ1Zik7CisKKyAgICAgICAgLyogdGFsbHkgKi8KKyAgICAJd2QtPmNvbW1UYWxseS5Ob3RpZnlORElTUnhGcm1DbnQrKzsKKworICAgIAlpZiAod2QtPnpmY2JSZWN2RXRoICE9IE5VTEwpCisgICAgCXsKKyAgICAgICAgICAgIHdkLT56ZmNiUmVjdkV0aChkZXYsIGJ1ZiwgdmFwKTsKKyAgICAgICAgICAgIFpNX1BFUkZPUk1BTkNFX1JYX01TRFUoZGV2LCB3ZC0+dGljaykKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBpZiBtYW5hZ2VtZW50IGZyYW1lICovCisgICAgZWxzZSBpZiAoZnJhbWVUeXBlID09IFpNX1dMQU5fTUFOQUdFTUVOVF9GUkFNRSkKKyAgICB7CisgICAgICAgIHptX21zZzJfcngoWk1fTFZfMiwgIlJ4IG1hbmFnZW1lbnQsRkM9IiwgZnJhbWVDdHJsKTsKKyAgICAgICAgLyogQ2FsbCB6ZlByb2Nlc3NNYW5hZ2VtZW50KCkgdG8gaGFuZGxlIG1hbmFnZW1lbnQgZnJhbWUgKi8KKyAgICAgICAgemZQcm9jZXNzTWFuYWdlbWVudChkZXYsIGJ1ZiwgYWRkSW5mbyk7IC8vQ1dZYW5nKG0pCisgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgIH0KKyAgICAvKiBQc1BvbGwgKi8KKyAgICBlbHNlIGlmICgod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApICYmIChmcmFtZUN0cmwgPT0gMHhhNCkpCisgICAgeworICAgICAgICB6bV9tc2cwX3J4KFpNX0xWXzAsICJSeCBQc1BvbGwiKTsKKyAgICAgICAgemZBcFByb2Nlc3NQc1BvbGwoZGV2LCBidWYpOworICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgem1fbXNnMF9yeChaTV9MVl8xLCAiUnggZGlzY2FyZCEhIik7CisgICAgICAgIHdkLT5jb21tVGFsbHkuRHJpdmVyRGlzY2FyZGVkRnJtKys7CisKKyAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgfQorICAgIHJldHVybjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZXbGFuUnhWYWxpZGF0ZSAgICAgICAgICAgICovCisvKiAgICAgIFZhbGlkYXRlIFJ4IGZyYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWYgOiByZWNlaXZlZCA4MDIuMTEgZnJhbWUgYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBFcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuICAgICAgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMCAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZXbGFuUnhWYWxpZGF0ZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdTE2X3QgZnJhbWVUeXBlOworICAgIHUxNl90IGZyYW1lQ3RybDsKKyAgICB1MTZfdCBmcmFtZUxlbjsKKyAgICB1MTZfdCByZXQ7CisgICAgdThfdCAgZnJhbWVTdWJUeXBlOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZnJhbWVDdHJsID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMCk7CisgICAgZnJhbWVUeXBlID0gZnJhbWVDdHJsICYgMHhDOworICAgIGZyYW1lU3ViVHlwZSA9IChmcmFtZUN0cmwgJiAweEYwKSA+PiA0OworCisgICAgZnJhbWVMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKworICAgIC8qIEFjY2VwdCBEYXRhL01hbmFnZW1lbnQgZnJhbWUgd2l0aCBwcm90b2NvbCB2ZXJzaW9uID0gMCAqLworICAgIGlmICgoZnJhbWVUeXBlID09IDB4OCkgfHwgKGZyYW1lVHlwZSA9PSAweDApKQorICAgIHsKKworICAgICAgICAvKiBUT0RPIDogY2hlY2sgcnggc3RhdHVzID0+IGVycm8gYml0ICovCisKKyAgICAgICAgLyogQ2hlY2sgTWluaW11bSBMZW5ndGggd2l0aCBXZXAgKi8KKyAgICAgICAgaWYgKChmcmFtZUN0cmwgJiAweDQwMDApICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE1pbmltdW0gTGVuZ3RoID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgLyogICAgIFBMQ1AoNSkrSGVhZGVyKDI0KStJVig0KStJQ1YoNCkrQ1JDKDQpK1J4U3RhdHVzKDgpICovCisgICAgICAgICAgICBpZiAoZnJhbWVMZW4gPCAzMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gWk1fRVJSX01JTl9SWF9FTkNSWVBUX0ZSQU1FX0xFTkdUSDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggZnJhbWVTdWJUeXBlID09IDB4NSB8fCBmcmFtZVN1YlR5cGUgPT0gMHg4ICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogTWluaW11bSBMZW5ndGggPSBQTENQKDUpK01BQ0hlYWRlcigyNCkrVGltZXN0YW1wKDgpK0JlYWNvbkludGVydmFsKDIpK0NhcCgyKStDUkMoNCkrUnhTdGF0dXMoOCkgKi8KKyAgICAgICAgICAgIGlmIChmcmFtZUxlbiA8IDM2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBaTV9FUlJfTUlOX1JYX0ZSQU1FX0xFTkdUSDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE1pbmltdW0gTGVuZ3RoID0gUExDUCg1KStNQUNIZWFkZXIoMjQpK0NSQyg0KStSeFN0YXR1cyg4KSAqLworICAgICAgICAgICAgaWYgKGZyYW1lTGVuIDwgMjQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFpNX0VSUl9NSU5fUlhfRlJBTUVfTEVOR1RIOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQ2hlY2sgaWYgZnJhbWUgTGVuZ3RoID4gWk1fV0xBTl9NQVhfUlhfU0laRS4gKi8KKyAgICAgICAgaWYgKGZyYW1lTGVuID4gWk1fV0xBTl9NQVhfUlhfU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFpNX0VSUl9NQVhfUlhfRlJBTUVfTEVOR1RIOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChmcmFtZUN0cmwmMHhmZikgPT0gMHhhNCkKKyAgICB7CisgICAgICAgIC8qIFBzUG9sbCAqLworICAgICAgICAvL3ptX21zZzBfcngoWk1fTFZfMCwgInJ4IHBzcG9sbCIpOworICAgIH0KKyAgICBlbHNlIGlmICgoZnJhbWVDdHJsJjB4ZmYpID09IFpNX1dMQU5fRlJBTUVfVFlQRV9CQVIpCisgICAgeworICAgICAgICBpZiAod2QtPnN0YS5lbmFibGVEcnZCQSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkFnZ1JlY3ZCQVIoZGV2LCBidWYpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIFpNX0VSUl9SWF9CQVJfRlJBTUU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBaTV9FUlJfUlhfRlJBTUVfVFlQRTsKKyAgICB9CisKKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQICkKKyAgICB7CisgICAgfQorICAgIGVsc2UgaWYgKCB3ZC0+d2xhbk1vZGUgIT0gWk1fTU9ERV9QU0VVRE8gKQorICAgIHsKKyAgICAgICAgaWYgKCAocmV0PXpmU3RhUnhWYWxpZGF0ZUZyYW1lKGRldiwgYnVmKSkhPVpNX1NVQ0NFU1MgKQorICAgICAgICB7CisgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzEoImRpc2NhcmQgZnJhbWUsIGNvZGUgPSAiLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBaTV9TVUNDRVNTOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZldsYW5SeEZpbHRlciAgICAgICAgICAgICAgKi8KKy8qICAgICAgRmlsdGVyIGR1cGxpY2F0ZWQgZnJhbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IHJlY2VpdmVkIDgwMi4xMSBmcmFtZSBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gICAgICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEwICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZldsYW5SeEZpbHRlcih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdTE2X3Qgc3JjWzNdOworICAgIHUxNl90IGRzdDA7CisgICAgdTE2X3QgZnJhbWVUeXBlOworICAgIHUxNl90IHNlcTsKKyAgICB1MTZfdCBvZmZzZXQ7CisgICAgdTE2X3QgaW5kZXg7CisgICAgdTE2X3QgY29sOworICAgIHUxNl90IGk7CisgICAgdThfdCB1cCA9IDA7IC8qIFVzZXIgcHJpb3JpdHkgKi8KKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBaTV9CVUZGRVJfVFJBQ0UoZGV2LCBidWYpCisKKyAgICAvKiBSWCBQUkVGSVggKi8KKyAgICBvZmZzZXQgPSAwOworCisgICAgZnJhbWVUeXBlID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KTsKKworICAgIC8vIERvbid0IGRpdmlkZSAyXjQgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRoZSBmcmFnZW1lbnRhdGlvbiBwa3QgdG8gYmUgdHJlYXRlZCBhcworICAgIC8vIGR1cGxpY2F0ZWQgZnJhbWVzCisgICAgc2VxID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KzIyKTsKKyAgICBkc3QwID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KzQpOworICAgIHNyY1swXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCsxMCk7CisgICAgc3JjWzFdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KzEyKTsKKyAgICBzcmNbMl0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBvZmZzZXQrMTQpOworCisgICAgLyogUW9TIGRhdGEgZnJhbWUgKi8KKyAgICBpZiAoKGZyYW1lVHlwZSAmIDB4ODgpID09IDB4ODgpCisgICAgeworICAgICAgICB1cCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyNCk7CisgICAgICAgIHVwICY9IDB4NzsKKyAgICB9CisKKyAgICBpbmRleCA9IChzcmNbMl0rdXApICYgKFpNX0ZJTFRFUl9UQUJMRV9ST1ctMSk7CisKKyAgICAvKiBUQkQgOiBmaWx0ZXIgZnJhbWUgd2l0aCBzb3VyY2UgYWRkcmVzcyA9PSBvd24gTUFDIGFkcmVzcyAqLworICAgIGlmICgod2QtPm1hY0FkZHJbMF0gPT0gc3JjWzBdKSAmJiAod2QtPm1hY0FkZHJbMV0gPT0gc3JjWzFdKQorICAgICAgICAgICAgJiYgKHdkLT5tYWNBZGRyWzJdID09IHNyY1syXSkpCisgICAgeworICAgICAgICAvL3ptX21zZzBfcngoWk1fTFZfMCwgIlJ4IGZpbHRlcj0+c3JjIGlzIG93biBNQUMiKTsKKyAgICAgICAgd2QtPnRyYWZUYWxseS5yeFNyY0lzT3duTWFjKys7CisjaWYgMAorICAgICAgICByZXR1cm4gWk1fRVJSX1JYX1NSQ19BRERSX0lTX09XTl9NQUM7CisjZW5kaWYKKyAgICB9CisKKyAgICB6bV9tc2cyX3J4KFpNX0xWXzIsICJSeCBzZXE9Iiwgc2VxKTsKKworICAgIC8qIEZpbHRlciB1bmljYXN0IGZyYW1lIG9ubHkgKi8KKyAgICBpZiAoKGRzdDAgJiAweDEpID09IDApCisgICAgeworICAgICAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIGZvcihpPTA7IGk8Wk1fRklMVEVSX1RBQkxFX0NPTDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHdkLT5yeEZpbHRlclRibFtpXVtpbmRleF0uYWRkclswXSA9PSBzcmNbMF0pCisgICAgICAgICAgICAgICAgICAgICYmICh3ZC0+cnhGaWx0ZXJUYmxbaV1baW5kZXhdLmFkZHJbMV0gPT0gc3JjWzFdKQorICAgICAgICAgICAgICAgICAgICAmJiAod2QtPnJ4RmlsdGVyVGJsW2ldW2luZGV4XS5hZGRyWzJdID09IHNyY1syXSkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHdkLT5yeEZpbHRlclRibFtpXVtpbmRleF0udXAgPT0gdXApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoKGZyYW1lVHlwZSYweDgwMCk9PTB4ODAwKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYod2QtPnJ4RmlsdGVyVGJsW2ldW2luZGV4XS5zZXE9PXNlcSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgICAgICAgICAvKiBoaXQgOiBkdXBsaWNhdGVkIGZyYW1lICovCisgICAgICAgICAgICAgICAgICAgIHptX21zZzBfcngoWk1fTFZfMSwgIlJ4IGZpbHRlciBoaXQ9PmR1cGxpY2F0ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgd2QtPnRyYWZUYWxseS5yeER1cGxpY2F0ZSsrOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gWk1fRVJSX1JYX0RVUExJQ0FURTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogaGl0IDogbm90IGR1cGxpY2F0ZWQgZnJhbWUsIHVwZGF0ZSBzZXF1ZW5jZSBudW1iZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgd2QtPnJ4RmlsdGVyVGJsW2ldW2luZGV4XS5zZXEgPSBzZXE7CisgICAgICAgICAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgICAgICAgICAgICAgIHptX21zZzBfcngoWk1fTFZfMiwgIlJ4IGZpbHRlciBoaXQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFpNX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IC8qIGZvcihpPTA7IGk8Wk1fRklMVEVSX1RBQkxFX0NPTDsgaSsrKSAqLworCisgICAgICAgIC8qIG1pc3MgOiBhZGQgdG8gdGFibGUgKi8KKyAgICAgICAgem1fbXNnMF9yeChaTV9MVl8xLCAiUnggZmlsdGVyIG1pc3MiKTsKKyAgICAgICAgLyogVE9ETyA6IFJhbmRvbSBzZWxlY3QgYSBjb2x1bW4gKi8KKyAgICAgICAgY29sID0gKHUxNl90KSh3ZC0+dGljayAmIChaTV9GSUxURVJfVEFCTEVfQ09MLTEpKTsKKyAgICAgICAgd2QtPnJ4RmlsdGVyVGJsW2NvbF1baW5kZXhdLmFkZHJbMF0gPSBzcmNbMF07CisgICAgICAgIHdkLT5yeEZpbHRlclRibFtjb2xdW2luZGV4XS5hZGRyWzFdID0gc3JjWzFdOworICAgICAgICB3ZC0+cnhGaWx0ZXJUYmxbY29sXVtpbmRleF0uYWRkclsyXSA9IHNyY1syXTsKKyAgICAgICAgd2QtPnJ4RmlsdGVyVGJsW2NvbF1baW5kZXhdLnNlcSA9IHNlcTsKKyAgICAgICAgd2QtPnJ4RmlsdGVyVGJsW2NvbF1baW5kZXhdLnVwID0gdXA7CisKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICB9IC8qIGlmICgoZHN0MCAmIDB4MSkgPT0gMCkgKi8KKworICAgIHJldHVybiBaTV9TVUNDRVNTOworfQorCisKKwordTE2X3QgemZUeEdlbldsYW5UYWlsKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIHNuYXAsIHUxNl90IHNuYXBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgdTE2X3QqIG1pYykKK3sKKyAgICBzdHJ1Y3QgenNNaWNWYXIqICBwTWljS2V5OworICAgIHUxNl90ICBpLCBsZW5ndGgsIHBheWxvYWRPZmZzZXQ7CisgICAgdThfdCAgIGJWYWx1ZSwgcW9zVHlwZSA9IDA7CisgICAgdThfdCAgIHNuYXBCeXRlWzEyXTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfQVAgKQorICAgIHsKKyAgICAgICAgcE1pY0tleSA9IHpmQXBHZXRUeE1pY0tleShkZXYsIGJ1ZiwgJnFvc1R5cGUpOworCisgICAgICAgIGlmICggcE1pY0tleSA9PSBOVUxMICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICB7CisgICAgICAgIHBNaWNLZXkgPSB6ZlN0YUdldFR4TWljS2V5KGRldiwgYnVmKTsKKworICAgICAgICBpZiAoIHBNaWNLZXkgPT0gTlVMTCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGxlbmd0aCA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworCisgICAgemZNaWNDbGVhcihwTWljS2V5KTsKKworICAgIC8qIGFwcGVuZCBEQSBhbmQgU0EgKi8KKyNpZmRlZiBaTV9FTkFCTEVfTkFUSVZFX1dJRkkKKyAgICBmb3IoaT0xNjsgaTwyMjsgaSsrKQorICAgIHsgLy8gVklTVEEgREEKKyAgICAgICAgYlZhbHVlID0gem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgaSk7CisgICAgICAgIHpmTWljQXBwZW5kQnl0ZShiVmFsdWUsIHBNaWNLZXkpOworICAgIH0KKyAgICBmb3IoaT0xMDsgaTwxNjsgaSsrKQorICAgIHsgLy8gVklTVEEgU0EKKyAgICAgICAgYlZhbHVlID0gem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgaSk7CisgICAgICAgIHpmTWljQXBwZW5kQnl0ZShiVmFsdWUsIHBNaWNLZXkpOworICAgIH0KKyNlbHNlCisgICAgZm9yKGk9MDsgaTwxMjsgaSsrKQorICAgIHsKKyAgICAgICAgYlZhbHVlID0gem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgaSk7CisgICAgICAgIHpmTWljQXBwZW5kQnl0ZShiVmFsdWUsIHBNaWNLZXkpOworICAgIH0KKyNlbmRpZgorCisgICAgLyogYXBwZW5kIGZvciBhbGlnbm1lbnQgKi8KKyAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+c3RhLndtZUNvbm5lY3RlZCAhPSAwKQorICAgICAgICAgICAgemZNaWNBcHBlbmRCeXRlKHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIFpNXzgwMjExX0ZSQU1FX0lQX09GRlNFVCArIDEpID4+IDUsIHBNaWNLZXkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUoMCwgcE1pY0tleSk7CisgICAgfQorICAgIGVsc2UgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCApCisgICAgeworICAgICAgICBpZiAocW9zVHlwZSA9PSAxKQorICAgICAgICAgICAgemZNaWNBcHBlbmRCeXRlKHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIFpNXzgwMjExX0ZSQU1FX0lQX09GRlNFVCArIDEpID4+IDUsIHBNaWNLZXkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUoMCwgcE1pY0tleSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFRPRE8gOiBRb3MgU29mdHdhcmUgTUlDIGluIElCU1MgTW9kZSAqLworICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUoMCwgcE1pY0tleSk7CisgICAgfQorICAgIHpmTWljQXBwZW5kQnl0ZSgwLCBwTWljS2V5KTsKKyAgICB6Zk1pY0FwcGVuZEJ5dGUoMCwgcE1pY0tleSk7CisgICAgemZNaWNBcHBlbmRCeXRlKDAsIHBNaWNLZXkpOworCisgICAgaWYgKCBzbmFwbGVuID09IDAgKQorICAgIHsKKyAgICAgICAgcGF5bG9hZE9mZnNldCA9IFpNXzgwMjExX0ZSQU1FX0lQX09GRlNFVDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcGF5bG9hZE9mZnNldCA9IFpNXzgwMjExX0ZSQU1FX1RZUEVfT0ZGU0VUOworCisgICAgICAgIGZvcihpPTA7IGk8KHNuYXBsZW4+PjEpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHNuYXBCeXRlW2kqMl0gPSAodThfdCkgKHNuYXBbaV0gJiAweGZmKTsKKyAgICAgICAgICAgIHNuYXBCeXRlW2kqMisxXSA9ICh1OF90KSAoKHNuYXBbaV0gPj4gOCkgJiAweGZmKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvcihpPTA7IGk8c25hcGxlbjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUoc25hcEJ5dGVbaV0sIHBNaWNLZXkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yKGk9cGF5bG9hZE9mZnNldDsgaTxsZW5ndGg7IGkrKykKKyAgICB7CisgICAgICAgIGJWYWx1ZSA9IHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIGkpOworICAgICAgICB6Zk1pY0FwcGVuZEJ5dGUoYlZhbHVlLCBwTWljS2V5KTsKKyAgICB9CisKKyAgICB6Zk1pY0dldE1pYyggKHU4X3QqKSBtaWMsIHBNaWNLZXkpOworCisgICAgcmV0dXJuIFpNX1NJWkVfT0ZfTUlDOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlR4R2V0SXBUb3NBbmRGcmFnICAgICAgICAgKi8KKy8qICAgICAgR2V0IElQIFRPUyBhbmQgZnJhZyBvZmZzZXQgZnJvbSBUeCBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IFR4IGJ1ZmZlciBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB1cCA6IHBvaW50ZXIgZm9yIHJldHVybmluZyB1c2VyIHByaW9yaXR5ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZnJhZ09mZiA6IHBvaW50ZXIgZm9yIHJldHVybmluZyBpcCBmcmFnIG9mZnNldCAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDYuNiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZUeEdldElwVG9zQW5kRnJhZyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QqIHVwLCB1MTZfdCogZnJhZ09mZikKK3sKKyAgICB1OF90IGlwdjsKKyAgICB1MTZfdCBsZW47CisJdTE2X3QgZXRoZXJUeXBlOworICAgIHU4X3QgdG9zOworCisgICAgKnVwID0gMDsKKyAgICAqZnJhZ09mZiA9IDA7CisKKyAgICBsZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKworICAgIGlmIChsZW4gPj0gMzQpIC8vTWluaW11bSBJUHY0IHBhY2tldCBzaXplLCAxNChFdGhlciBoZWFkZXIpKzIwKElQdjQgaGVhZGVyKQorICAgIHsKKyAgICAgICAgZXRoZXJUeXBlID0gKCgodTE2X3Qpem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgWk1fODAyMTFfRlJBTUVfVFlQRV9PRkZTRVQpKTw8OCkKKyAgICAgICAgICAgICAgICAgICAgKyB6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCBaTV84MDIxMV9GUkFNRV9UWVBFX09GRlNFVCArIDEpOworCisgICAgICAgIC8qIHByb3RvY29sIHR5cGUgPSBJUCAqLworICAgICAgICBpZiAoZXRoZXJUeXBlID09IDB4MDgwMCkKKyAgICAgICAgeworICAgICAgICAgICAgaXB2ID0gem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgWk1fODAyMTFfRlJBTUVfSVBfT0ZGU0VUKSA+PiA0OworICAgICAgICAgICAgaWYgKGlwdiA9PSAweDQpIC8vSVB2NAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRvcyA9IHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIFpNXzgwMjExX0ZSQU1FX0lQX09GRlNFVCArIDEpOworICAgICAgICAgICAgICAgICp1cCA9ICh0b3MgPj4gNSk7CisgICAgICAgICAgICAgICAgKmZyYWdPZmYgPSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV84MDIxMV9GUkFNRV9JUF9PRkZTRVQgKyA2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFRPRE8gOiBoYW5kbGUgVkxBTiB0YWcgYW5kIElQdjYgcGFja2V0ICovCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworfQorCisjaWZkZWYgWk1fRU5BQkxFX05BVElWRV9XSUZJCit1MTZfdCB6ZlR4R2VuV2xhblNuYXAoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCogc25hcCwgdTE2X3QqIHNuYXBsZW4pCit7CisgICAgc25hcFswXSA9IHptd19idWZfcmVhZGgoZGV2LCBidWYsIFpNXzgwMjExX0ZSQU1FX0hFQURFUl9MRU4gKyAwKTsKKyAgICBzbmFwWzFdID0gem13X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgWk1fODAyMTFfRlJBTUVfSEVBREVSX0xFTiArIDIpOworICAgIHNuYXBbMl0gPSB6bXdfYnVmX3JlYWRoKGRldiwgYnVmLCBaTV84MDIxMV9GUkFNRV9IRUFERVJfTEVOICsgNCk7CisgICAgKnNuYXBsZW4gPSA2OworCisgICAgcmV0dXJuIFpNXzgwMjExX0ZSQU1FX0hFQURFUl9MRU4gKyAqc25hcGxlbjsKK30KKyNlbHNlCit1MTZfdCB6ZlR4R2VuV2xhblNuYXAoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCogc25hcCwgdTE2X3QqIHNuYXBsZW4pCit7CisgICAgdTE2X3QgcmVtb3ZlZDsKKwkgICB1MTZfdCBldGhlclR5cGU7CisgICAJdTE2X3QgbGVuOworCisJICAgbGVuID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CisgICAgaWYgKGxlbiA8IDE0KSAvL01pbmltdW0gRXRoZXJuZXQgcGFja2V0IHNpemUsIDE0KEV0aGVyIGhlYWRlcikKKyAgICB7CisgICAgICAgIC8qIFRPRE8gOiBBc3NlcnQ/ICovCisgICAgICAgICpzbmFwbGVuID0gMDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogR2VuZXJhdGUgUkZDMTA0MiBoZWFkZXIgKi8KKyAgICBldGhlclR5cGUgPSAoKCh1MTZfdCl6bXdfdHhfYnVmX3JlYWRiKGRldiwgYnVmLCAxMikpPDw4KQorICAgICAgICAgICAgICAgICsgem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMTMpOworCisgICAgLy96bV9kZWJ1Z19tc2cyKCJldGhlcm5ldCB0eXBlIG9yIGxlbmd0aCA9ICIsIGV0aGVyVHlwZSk7CisKKyAgICBpZiAoZXRoZXJUeXBlID4gMTUwMCkKKyAgICB7CisgICAgICAgIC8qIEVUSEVSTkVUIGZvcm1hdCAqLworICAgICAgICByZW1vdmVkID0gMTI7CisgICAgICAgIHNuYXBbMF0gPSAweGFhYWE7CisgICAgICAgIHNuYXBbMV0gPSAweDAwMDM7CisgICAgICAgIGlmICgoZXRoZXJUeXBlID09MHg4MTM3KSB8fCAoZXRoZXJUeXBlID09IDB4ODBmMykpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEJyaWRnZSBUdW5uZWwgKi8KKyAgICAgICAgICAgIHNuYXBbMl0gPSAweEY4MDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBSRkMgMTA0MiAqLworICAgICAgICAgICAgc25hcFsyXSA9IDB4MDAwMDsKKyAgICAgICAgfQorICAgICAgICAqc25hcGxlbiA9IDY7CisKKyAgICAgICAgaWYgKCBldGhlclR5cGUgPT0gMHg4ODhFICkKKyAgICAgICAgeworICAgICAgICAgICAgemZTaG93VHhFQVBPTChkZXYsIGJ1ZiwgMTQpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIDgwMi4zIGZvcm1hdCAqLworICAgICAgICByZW1vdmVkID0gMTQ7CisgICAgICAgICpzbmFwbGVuID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVtb3ZlZDsKK30KKyNlbmRpZgorCit1OF90IHpmSXNWdHhxRW1wdHkoemRldl90KiBkZXYpCit7CisgICAgdThfdCBpc0VtcHR5ID0gVFJVRTsKKyAgICB1OF90IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICh3ZC0+dm1tcUhlYWQgIT0gd2QtPnZtbXFUYWlsKQorICAgIHsKKyAgICAgICAgaXNFbXB0eSA9IEZBTFNFOworICAgICAgICBnb3RvIGNoZWNrX2RvbmU7CisgICAgfQorCisgICAgZm9yKGk9MDsgaSA8IDQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh3ZC0+dnR4cUhlYWRbaV0gIT0gd2QtPnZ0eHFUYWlsW2ldKQorICAgICAgICB7CisgICAgICAgICAgICBpc0VtcHR5ID0gRkFMU0U7CisgICAgICAgICAgICBnb3RvIGNoZWNrX2RvbmU7CisgICAgICAgIH0KKyAgICB9CisKK2NoZWNrX2RvbmU6CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICByZXR1cm4gaXNFbXB0eTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmUHV0VnR4cSAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBQdXQgVHggYnVmZmVyIHRvIHZpcnR1YWwgVHhRICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYnVmIDogVHggYnVmZmVyIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgWk1fU1VDQ0VTUyBvciBlcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDYuNiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmUHV0VnR4cSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdThfdCBhYzsKKyAgICB1OF90IHVwOworICAgIHUxNl90IGZyYWdPZmY7CisjaWZkZWYgWk1fQUdHX1RBTExZCisgICAgc3RydWN0IGFnZ1RhbGx5ICphZ2dfdGFsOworI2VuZGlmCisjaWZkZWYgWk1fRU5BQkxFX0FHR1JFR0FUSU9OCisgICAgI2lmbmRlZiBaTV9CWVBBU1NfQUdHUl9TQ0hFRFVMSU5HCisJdTE2X3QgcmV0OworICAgIHUxNl90IHRpZDsKKyAgICAjZW5kaWYKKyNlbmRpZgorCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHpmVHhHZXRJcFRvc0FuZEZyYWcoZGV2LCBidWYsICZ1cCwgJmZyYWdPZmYpOworCisgICAgaWYgKCB3ZC0+emZjYkNsYXNzaWZ5VHhQYWNrZXQgIT0gTlVMTCApCisgICAgeworICAgICAgICBhYyA9IHdkLT56ZmNiQ2xhc3NpZnlUeFBhY2tldChkZXYsIGJ1Zik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFjID0gemNVcFRvQWNbdXAmMHg3XSAmIDB4MzsKKyAgICB9CisKKyAgICAvKgorICAgICAqIGFkZCBieSBob25kYQorICAgICAqIG1haW4gQS1NUERVIGFnZ3JlZ2F0aW9uIGZ1bmN0aW9uCisgICAgICovCisjaWZkZWYgWk1fQUdHX1RBTExZCisgICAgYWdnX3RhbCA9ICZ3ZC0+YWdnX3RhbDsKKyAgICBhZ2dfdGFsLT5nb3RfcGFja2V0c19zdW0rKzsKKworI2VuZGlmCisKKyNpZmRlZiBaTV9FTkFCTEVfQUdHUkVHQVRJT04KKyAgICAjaWZuZGVmIFpNX0JZUEFTU19BR0dSX1NDSEVEVUxJTkcKKyAgICB0aWQgPSB1cCYweDc7CisgICAgaWYod2QtPmVuYWJsZUFnZ3JlZ2F0aW9uPT0wKQorICAgIHsKKyAgICAgICAgaWYoICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkgfHwKKyAgICAgICAgICAgICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSAmJiB3ZC0+c3RhLkVuYWJsZUhUKSB8fAorICAgICAgICAgICAgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX1BTRVVETykgKSB7CisgICAgICAgICAgICAvLyAoaW5mcmFzdHJ1Y3R1cmVfbW9kZSAmJiBjb25uZWN0X3RvXzExbl9hcCkgfHwgKGFwX21vZGUgJiYgaXNfMTFuX2FwKQorICAgICAgICAgICAgLy9yZXQgPSB6ZkFnZ1B1dFZ0eHEoZGV2LCBidWYpOworCisKKyAgICAgICAgICAgIHJldCA9IHpmQWdnVHgoZGV2LCBidWYsIHRpZCk7CisgICAgICAgICAgICBpZiAoWk1fU1VDQ0VTUyA9PSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy96ZndCdWZGcmVlKGRldiwgYnVmLCBaTV9TVUNDRVNTKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBaTV9TVUNDRVNTOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFpNX0VSUl9FWENFRURfUFJJT1JJVFlfVEhSRVNIT0xEID09IHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+Y29tbVRhbGx5LnR4UW9zRHJvcENvdW50W2FjXSsrOworICAgICAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIFpNX1NVQ0NFU1MpOworCisgICAgICAgICAgICAgICAgem1fbXNnMV90eChaTV9MVl8xLCAiUGFja2V0IGRpc2NhcmRlZCwgVlRYUSBmdWxsLCBhYz0iLCBhYyk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gWk1fRVJSX0VYQ0VFRF9QUklPUklUWV9USFJFU0hPTEQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoWk1fRVJSX1RYX0JVRkZFUl9VTkFWQUlMQUJMRSA9PSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAqIGRvIG5vdGhpbmcKKyAgICAgICAgICAgICAgICAqIGNvbnRpbnVlIGZvbGxvd2luZyBwcm9jZXNzaW9uLCBwdXQgaW50byBWVFhRCisgICAgICAgICAgICAgICAgKiByZXR1cm4gWk1fU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgICNlbmRpZgorI2VuZGlmCisgICAgLyoKKyAgICAgKiBlbmQgb2YgYWRkIGJ5IGhvbmRhCisgICAgICovCisKKyAgICAvKiBGaXJzdCBJcCBmcmFnICovCisgICAgaWYgKChmcmFnT2ZmICYgMHhmZjNmKSA9PSAweDAwMjApCisgICAgeworICAgICAgICAvKiBEb24ndCBsZXQgaXAgZnJhZyBpbiBpZiBWVFhRIHVuYWJsZSB0byBob2xkICovCisgICAgICAgIC8qIHdob2xlIGlwIGZyYWcgYnVyc3QoYXNzdW1lIDIwIGZyYWcpICAgICAgICAgKi8KKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgaWYgKCgod2QtPnZ0eHFIZWFkW2FjXSAtIHdkLT52dHhxVGFpbFthY10pJiBaTV9WVFhRX1NJWkVfTUFTSykKKyAgICAgICAgICAgICAgICA+IChaTV9WVFhRX1NJWkUtMjApKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+cW9zRHJvcElwRnJhZ1thY10gPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPnFvc0Ryb3BJcEZyYWdbYWNdID0gMDsKKyAgICAgICAgfQorICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIGlmICh3ZC0+cW9zRHJvcElwRnJhZ1thY10gPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cyKCJ2dFEgZnVsbCwgZHJvcCBidWYgPSAiLCBidWYpOworICAgICAgICAgICAgd2QtPmNvbW1UYWxseS50eFFvc0Ryb3BDb3VudFthY10rKzsKKyAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIFpNX1NVQ0NFU1MpOworICAgICAgICAgICAgem1fbXNnMV90eChaTV9MVl8xLCAiUGFja2V0IGRpc2NhcmRlZCwgZmlyc3QgaXAgZnJhZywgYWM9IiwgYWMpOworICAgICAgICAgICAgLy9WVFhRW10gY2FuIG5vdCBob2xkIHdob2xkIGlwIGZyYWcgYnVyc3QoYXNzdW1lIDIwIGZyYWdzKQorICAgICAgICAgICAgcmV0dXJuIFpNX0VSUl9FWENFRURfUFJJT1JJVFlfVEhSRVNIT0xEOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChmcmFnT2ZmICYgMHhmZjNmKSA9PSAwKQorICAgIHsKKyAgICAgICAgd2QtPnFvc0Ryb3BJcEZyYWdbYWNdID0gMDsKKyAgICB9CisKKyAgICBpZiAoKChmcmFnT2ZmICY9IDB4ZmYxZikgIT0gMCkgJiYgKHdkLT5xb3NEcm9wSXBGcmFnW2FjXSA9PSAxKSkKKyAgICB7CisgICAgICAgIHdkLT5jb21tVGFsbHkudHhRb3NEcm9wQ291bnRbYWNdKys7CisgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIFpNX1NVQ0NFU1MpOworICAgICAgICB6bV9tc2cxX3R4KFpNX0xWXzEsICJQYWNrZXQgZGlzY2FyZGVkLCBpcCBmcmFnLCBhYz0iLCBhYyk7CisgICAgICAgIC8vRGlzY2FyZCBmb2xsb3dpbmcgaXAgZnJhZ3MKKyAgICAgICAgcmV0dXJuIFpNX0VSUl9FWENFRURfUFJJT1JJVFlfVEhSRVNIT0xEOworICAgIH0KKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgaWYgKCgod2QtPnZ0eHFIZWFkW2FjXSArIDEpICYgWk1fVlRYUV9TSVpFX01BU0spICE9IHdkLT52dHhxVGFpbFthY10pCisgICAgeworICAgICAgICB3ZC0+dnR4cVthY11bd2QtPnZ0eHFIZWFkW2FjXV0gPSBidWY7CisgICAgICAgIHdkLT52dHhxSGVhZFthY10gPSAoKHdkLT52dHhxSGVhZFthY10gKyAxKSAmIFpNX1ZUWFFfU0laRV9NQVNLKTsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgcmV0dXJuIFpNX1NVQ0NFU1M7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgd2QtPmNvbW1UYWxseS50eFFvc0Ryb3BDb3VudFthY10rKzsKKyAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgWk1fU1VDQ0VTUyk7CisgICAgICAgIHptX21zZzFfdHgoWk1fTFZfMSwgIlBhY2tldCBkaXNjYXJkZWQsIFZUWFEgZnVsbCwgYWM9IiwgYWMpOworICAgICAgICByZXR1cm4gWk1fRVJSX0VYQ0VFRF9QUklPUklUWV9USFJFU0hPTEQ7IC8vVlRYUVtdIEZ1bGwKKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmR2V0VnR4cSAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBHZXQgVHggYnVmZmVyIGZyb20gdmlydHVhbCBUeFEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBUeCBidWZmZXIgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNi42ICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworemJ1Zl90KiB6ZkdldFZ0eHEoemRldl90KiBkZXYsIHU4X3QgYWMpCit7CisgICAgemJ1Zl90KiBidWY7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgYWMgJj0gMHgzOworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgaWYgKHdkLT52dHhxSGVhZFthY10gIT0gd2QtPnZ0eHFUYWlsW2FjXSkKKyAgICB7CisgICAgICAgIGJ1ZiA9IHdkLT52dHhxW2FjXVt3ZC0+dnR4cVRhaWxbYWNdXTsKKyAgICAgICAgd2QtPnZ0eHFUYWlsW2FjXSA9ICgod2QtPnZ0eHFUYWlsW2FjXSArIDEpICYgWk1fVlRYUV9TSVpFX01BU0spOworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICByZXR1cm4gYnVmOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICByZXR1cm4gMDsgLy9WVFhRW10gZW1wdHkKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlB1dFZtbXEgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgUHV0IFR4IGJ1ZmZlciB0byB2aXJ0dWFsIE1tUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IFR4IGJ1ZmZlciBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFpNX1NVQ0NFU1Mgb3IgZXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA2LjEyICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZlB1dFZtbXEoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZiAoKCh3ZC0+dm1tcUhlYWQgKyAxKSAmIFpNX1ZNTVFfU0laRV9NQVNLKSAhPSB3ZC0+dm1tcVRhaWwpCisgICAgeworICAgICAgICB3ZC0+dm1tcVt3ZC0+dm1tcUhlYWRdID0gYnVmOworICAgICAgICB3ZC0+dm1tcUhlYWQgPSAoKHdkLT52bW1xSGVhZCArIDEpICYgWk1fVk1NUV9TSVpFX01BU0spOworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICByZXR1cm4gWk1fU1VDQ0VTUzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCBaTV9TVUNDRVNTKTsKKyAgICAgICAgem1fbXNnMF9tbShaTV9MVl8wLCAiUGFja2V0IGRpc2NhcmRlZCwgVk1tUSBmdWxsIik7CisgICAgICAgIHJldHVybiBaTV9FUlJfVk1NUV9GVUxMOyAvL1ZUWFFbXSBGdWxsCisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkdldFZtbXEgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgR2V0IFR4IGJ1ZmZlciBmcm9tIHZpcnR1YWwgTW1RICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVHggYnVmZmVyIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDYuMTIgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3pidWZfdCogemZHZXRWbW1xKHpkZXZfdCogZGV2KQoreworICAgIHpidWZfdCogYnVmOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZiAod2QtPnZtbXFIZWFkICE9IHdkLT52bW1xVGFpbCkKKyAgICB7CisgICAgICAgIGJ1ZiA9IHdkLT52bW1xW3dkLT52bW1xVGFpbF07CisgICAgICAgIHdkLT52bW1xVGFpbCA9ICgod2QtPnZtbXFUYWlsICsgMSkgJiBaTV9WTU1RX1NJWkVfTUFTSyk7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHJldHVybiBidWY7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHJldHVybiAwOyAvL1ZUWFFbXSBlbXB0eQorICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmUHVzaFZ0eHEgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTZXJ2aWNlIFZpcnR1YWwgVHhRICh3ZWlnaHRlZCByb3VuZCByb2JpbikgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgR2V0IFR4IGJ1ZmZlciBmb3JtIHZpcnR1YWwgVHhRIGFuZCBwdXQgdG8gaGFyZHdhcmUgVHhEIHF1ZXVlICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDYuNiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZQdXNoVnR4cSh6ZGV2X3QqIGRldikKK3sKKyAgICB6YnVmX3QqIGJ1ZjsKKyAgICB1MTZfdCBpOworICAgIHUxNl90IHR4ZWQ7CisgICAgdTMyX3QgZnJlZVR4ZDsKKyAgICB1MTZfdCBlcnI7CisgICAgdTE2X3Qgc2tpcEZsYWcgPSAwOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisKKworICAgIC8vem1fZGVidWdfbXNnMSgiemZIcEdldEZyZWVUeGRDb3VudCA9ICIsIHpmSHBHZXRGcmVlVHhkQ291bnQoZGV2KSk7CisKKyAgICBpZiAod2QtPmhhbFN0YXRlID09IFpNX0hBTF9TVEFURV9JTklUKQorICAgIHsKKyAgICAgICAgaWYgKCF3ZC0+bW9kZU1ES0VuYWJsZSkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiSEFMIGlzIG5vdCByZWFkeSBmb3IgVHgiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UgaWYgKHdkLT5zdGEuREZTRGlzYWJsZVR4KQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMCgicmV0dXJuIGJlY2F1c2UgODAyLjExaCBERlMgRGlzYWJsZSBUeCIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UgaWYgKHdkLT5zdGEuZmxhZ0ZyZXFDaGFuZ2luZyAhPSAwKQorICAgIHsKKyAgICAgICAgLy9Ib2xkIHVudGlsIFJGIGZyZXF1ZW5jeSBjaGFuZ2VkCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZWxzZSBpZiAoKCB3ZC0+c3RhLmZsYWdLZXlDaGFuZ2luZyApICYmICggd2QtPndsYW5Nb2RlICE9IFpNX01PREVfQVAgKSkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjaWZkZWYgWk1fRU5BQkxFX1BPV0VSX1NBVkUKKyAgICBlbHNlIGlmICggemZQb3dlclNhdmluZ01ncklzU2xlZXBpbmcoZGV2KSApCisgICAgeworICAgICAgICAvL3ptX2RlYnVnX21zZzAoIlBhY2tldHMgcXVldWVkIHNpbmNlIHRoZSBNQUMgaXMgaW4gcG93ZXItc2F2aW5nIG1vZGVcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIGlmICh3ZC0+dnR4cVB1c2hpbmcgIT0gMCkKKyAgICB7CisgICAgICAgIHNraXBGbGFnID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgd2QtPnZ0eHFQdXNoaW5nID0gMTsKKyAgICB9CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmIChza2lwRmxhZyA9PSAxKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdoaWxlICgxKQorICAgIHsKKyAgICAgICAgdHhlZCA9IDA7CisKKyAgICAgICAgLyogMjAwNi4xMi4yMCwgU2VydmUgTWFuYWdlbWVudCBxdWV1ZSAqLworICAgICAgICB3aGlsZSggemZIcEdldEZyZWVUeGRDb3VudChkZXYpID4gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoYnVmID0gemZHZXRWbW1xKGRldikpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHhlZCA9IDE7CisgICAgICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cyKCJzZW5kIGJ1ZiA9ICIsIGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKChlcnIgPSB6ZkhwU2VuZChkZXYsIE5VTEwsIDAsIE5VTEwsIDAsIE5VTEwsIDAsIGJ1ZiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFpNX0lOVEVSTkFMX0FMTE9DX0JVRiwgMCwgMHhmZikpICE9IFpNX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh3ZC0+c3RhLmJTY2hlZHVsZVNjYW4pIHx8ICgod2QtPnN0YS5iQ2hhbm5lbFNjYW4gPT0gVFJVRSkgJiYgKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSkpKQorICAgICAgICB7CisgICAgICAgICAgICAvL0hvbGQgdW50aWwgU2NhbiBTdG9wCisgICAgICAgICAgICB3ZC0+dnR4cVB1c2hpbmcgPSAwOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyNpZmRlZiBaTV9FTkFCTEVfQUdHUkVHQVRJT04KKyAgICAjaWZuZGVmIFpNX0JZUEFTU19BR0dSX1NDSEVEVUxJTkcKKyAgICAgICAgaWYoICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkgfHwKKyAgICAgICAgICAgICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSAmJiB3ZC0+c3RhLkVuYWJsZUhUKSB8fAorICAgICAgICAgICAgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX1BTRVVETykgKSB7CisKKyAgICAgICAgICAgIHpmQWdnVHhTY2hlZHVsZXIoZGV2LCAwKTsKKworICAgICAgICAgICAgaWYgKHR4ZWQgPT0gMCkgeworICAgICAgICAgICAgICAgIHdkLT52dHhxUHVzaGluZyA9IDA7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAjZW5kaWYKKyNlbmRpZgorCisgICAgICAgIC8qIFNlcnZpY2UgVlR4UVszXSAqLworICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoZnJlZVR4ZCA9IHpmSHBHZXRGcmVlVHhkQ291bnQoZGV2KSkgPj0gMykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKGJ1ZiA9IHpmR2V0VnR4cShkZXYsIDMpKSAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHhlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMigic2VuZCBidWYgPSAiLCBidWYpOworICAgICAgICAgICAgICAgICAgICB6ZlR4U2VuZEV0aChkZXYsIGJ1ZiwgMCwgWk1fRVhURVJOQUxfQUxMT0NfQlVGLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgWk1fUEVSRk9STUFOQ0VfVFhfTVBEVShkZXYsIHdkLT50aWNrKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBTZXJ2aWNlIFZUeFFbMl0gKi8KKyAgICAgICAgZm9yIChpPTA7IGk8MzsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKGZyZWVUeGQgPSB6ZkhwR2V0RnJlZVR4ZENvdW50KGRldikpID49ICh6ZkhwR2V0TWF4VHhkQ291bnQoZGV2KSoxLzQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoYnVmID0gemZHZXRWdHhxKGRldiwgMikpICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0eGVkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgemZUeFNlbmRFdGgoZGV2LCBidWYsIDAsIFpNX0VYVEVSTkFMX0FMTE9DX0JVRiwgMCk7CisgICAgICAgICAgICAgICAgICAgIFpNX1BFUkZPUk1BTkNFX1RYX01QRFUoZGV2LCB3ZC0+dGljayk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLmFjMFByaW9yaXR5SGlnaGVyVGhhbkFjMiA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChidWYgPSB6ZkdldFZ0eHEoZGV2LCAwKSkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHhlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB6ZlR4U2VuZEV0aChkZXYsIGJ1ZiwgMCwgWk1fRVhURVJOQUxfQUxMT0NfQlVGLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFpNX1BFUkZPUk1BTkNFX1RYX01QRFUoZGV2LCB3ZC0+dGljayk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBTZXJ2aWNlIFZUeFFbMF0gKi8KKyAgICAgICAgZm9yIChpPTA7IGk8MjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKGZyZWVUeGQgPSB6ZkhwR2V0RnJlZVR4ZENvdW50KGRldikpID49ICh6ZkhwR2V0TWF4VHhkQ291bnQoZGV2KSoyLzQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoYnVmID0gemZHZXRWdHhxKGRldiwgMCkpICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0eGVkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgemZUeFNlbmRFdGgoZGV2LCBidWYsIDAsIFpNX0VYVEVSTkFMX0FMTE9DX0JVRiwgMCk7CisgICAgICAgICAgICAgICAgICAgIFpNX1BFUkZPUk1BTkNFX1RYX01QRFUoZGV2LCB3ZC0+dGljayk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAvKiBTZXJ2aWNlIFZUeFFbMV0gKi8KKyAgICAgICAgaWYgKChmcmVlVHhkID0gemZIcEdldEZyZWVUeGRDb3VudChkZXYpKSA+PSAoemZIcEdldE1heFR4ZENvdW50KGRldikqMy80KSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChidWYgPSB6ZkdldFZ0eHEoZGV2LCAxKSkgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0eGVkID0gMTsKKyAgICAgICAgICAgICAgICB6ZlR4U2VuZEV0aChkZXYsIGJ1ZiwgMCwgWk1fRVhURVJOQUxfQUxMT0NfQlVGLCAwKTsKKyAgICAgICAgICAgICAgICBaTV9QRVJGT1JNQU5DRV9UWF9NUERVKGRldiwgd2QtPnRpY2spOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQWxsIFZUeFFzIGFyZSBlaXRoZXIgZW1wdHkgb3IgZXhjZWVkIHRoZWlyIHRocmVzaG9sZCAqLworICAgICAgICBpZiAodHhlZCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+dnR4cVB1c2hpbmcgPSAwOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSAvL3doaWxlICgxKQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkZsdXNoVnR4cSAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRmx1c2ggVmlydHVhbCBUeFEgYW5kIE1tUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuMSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZGbHVzaFZ0eHEoemRldl90KiBkZXYpCit7CisgICAgemJ1Zl90KiBidWY7CisgICAgdThfdCBpOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIEZsdXNoIE1tUSAqLworICAgIHdoaWxlICgoYnVmID0gemZHZXRWbW1xKGRldikpICE9IDApCisgICAgeworICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgem1fZGVidWdfbXNnMCgiemZGbHVzaFZ0eHE6IFtWbW1xXSIpOworICAgICAgICB3ZC0+cXVldWVGbHVzaGVkICB8PSAweDEwOworICAgIH0KKworICAgIC8qIEZsdXNoIFZUeFEgKi8KKyAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgeworICAgICAgICB3aGlsZSAoKGJ1ZiA9IHpmR2V0VnR4cShkZXYsIGkpKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoInpmRmx1c2hWdHhxOiBbemZHZXRWdHhxXS0gIiwgaSk7CisgICAgICAgICAgICB3ZC0+cXVldWVGbHVzaGVkIHw9ICgxPDxpKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCB6ZjgwMjExRnJhbWVTZW5kKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIGhlYWRlciwgdTE2X3Qgc25hcExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNl90KiBkYSwgdTE2X3QqIHNhLCB1OF90IHVwLCB1MTZfdCBoZWFkZXJMZW4sIHUxNl90KiBzbmFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2X3QqIHRhaWwsIHUxNl90IHRhaWxMZW4sIHUxNl90IG9mZnNldCwgdTE2X3QgYnVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4X3QgYWMsIHU4X3Qga2V5SWR4KQoreworICAgIHUxNl90IGVycjsKKyAgICB1MTZfdCBmcmFnTGVuOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZnJhZ0xlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworICAgIGlmICgoZGFbMF0mMHgxKSA9PSAwKQorICAgIHsKKyAgICAgICAgd2QtPmNvbW1UYWxseS50eFVuaWNhc3RGcm0rKzsKKyAgICAgICAgd2QtPmNvbW1UYWxseS50eFVuaWNhc3RPY3RldHMgKz0gKGZyYWdMZW4rc25hcExlbik7CisgICAgfQorICAgIGVsc2UgaWYgKGRhWzBdID09IDB4ZmZmZikKKyAgICB7CisgICAgICAgIHdkLT5jb21tVGFsbHkudHhCcm9hZGNhc3RGcm0rKzsKKyAgICAgICAgd2QtPmNvbW1UYWxseS50eEJyb2FkY2FzdE9jdGV0cyArPSAoZnJhZ0xlbitzbmFwTGVuKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgd2QtPmNvbW1UYWxseS50eE11bHRpY2FzdEZybSsrOworICAgICAgICB3ZC0+Y29tbVRhbGx5LnR4TXVsdGljYXN0T2N0ZXRzICs9IChmcmFnTGVuK3NuYXBMZW4pOworICAgIH0KKyAgICB3ZC0+bGVkU3RydWN0LnR4VHJhZmZpYysrOworCisgICAgaWYgKChlcnIgPSB6ZkhwU2VuZChkZXYsIGhlYWRlciwgaGVhZGVyTGVuLCBzbmFwLCBzbmFwTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgdGFpbCwgdGFpbExlbiwgYnVmLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBidWZUeXBlLCBhYywga2V5SWR4KSkgIT0gWk1fU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGlmIChidWZUeXBlID09IFpNX0VYVEVSTkFMX0FMTE9DX0JVRikKKyAgICAgICAgeworICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgZXJyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChidWZUeXBlID09IFpNX0lOVEVSTkFMX0FMTE9DX0JVRikKKyAgICAgICAgeworICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6bV9hc3NlcnQoMCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgemZDaGVja0lzUklGU0ZyYW1lKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgZnJhbWVTdWJ0eXBlKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qICMyIFJlY29yZCB0aGUgc2VxdWVuY2UgbnVtYmVyIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSB1bmljYXN0IGZyYW1lIGlzIHNlcGFyYXRlZCBieSBSSUZTIG9yIG5vdCAqLworICAgIGlmIChmcmFtZVN1YnR5cGUgJiAweDgwKQorICAgIHsgICAvL1FvUyBkYXRhIGZyYW1lCisgICAgICAgIHUxNl90IHNlcXVlbmNlTnVtOworICAgICAgICB1MTZfdCBxb3NDb250cm9sRmllbGQ7CisKKyAgICAgICAgc2VxdWVuY2VOdW0gPSAoIHptd19idWZfcmVhZGgoZGV2LCBidWYsIDIyKSA+PiA0ICk7IC8vIERpc2NhcmQgZnJhZ21lbnQgbnVtYmVyICEKKyAgICAgICAgcW9zQ29udHJvbEZpZWxkID0gem13X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMjQpOyAvLyBEb24ndCBjb25zaWRlciBXRFMgKFdpcmVsZXNzIERpc3RyaWJ1dGlvbiBTeXN0ZW0pCisgICAgICAgIC8vRGJnUHJpbnQoIlRoZSBRb1MgQ29udHJvbCBGaWVsZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJWQiLCBxb3NDb250cm9sRmllbGQpOworICAgICAgICAvL0RiZ1ByaW50KCJUaGUgUklGUyBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICVkIiwgd2QtPnN0YS5yaWZzQ291bnQpOworCisgICAgICAgIGlmKCBxb3NDb250cm9sRmllbGQgJiBaTV9CSVRfNSApCisgICAgICAgIHsvLyBBQ0sgcG9saWN5IGlzICJObyBBQ0siCisgICAgICAgICAgICAvKiBSSUZTLUxpa2UgZnJhbWUgKi8KKyAgICAgICAgICAgIHdkLT5zdGEucmlmc0xpa2VGcmFtZVNlcXVlbmNlW3dkLT5zdGEucmlmc0xpa2VGcmFtZUNudF0gICA9IHNlcXVlbmNlTnVtOworCisgICAgICAgICAgICBpZiggd2QtPnN0YS5yaWZzU3RhdGUgPT0gWk1fUklGU19TVEFURV9ERVRFQ1RJTkcgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCB3ZC0+c3RhLnJpZnNMaWtlRnJhbWVTZXF1ZW5jZVsyXSAhPSAwICkKKyAgICAgICAgICAgICAgICB7Ly8gUklGUy1saWtlIFBhdHRlcm4gY29sbGVjdGVkCisgICAgICAgICAgICAgICAgICAgIGlmKCAoIHdkLT5zdGEucmlmc0xpa2VGcmFtZVNlcXVlbmNlWzJdIC0gd2QtPnN0YS5yaWZzTGlrZUZyYW1lU2VxdWVuY2VbMV0gPT0gMiApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoIHdkLT5zdGEucmlmc0xpa2VGcmFtZVNlcXVlbmNlWzFdIC0gd2QtPnN0YS5yaWZzTGlrZUZyYW1lU2VxdWVuY2VbMF0gPT0gMiApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogUklGUyBwYXR0ZXJuIG1hdGNoZWQgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogIzMgRW5hYmxlIFJJRlMgZnVuY3Rpb24gaWYgdGhlIFJJRlMgcGF0dGVybiBtYXRjaGVkICAqLworICAgICAgICAgICAgICAgICAgICAgICAgemZIcEVuYWJsZVJpZnMoZGV2LCAoKHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeTwzMDAwKT8xOjApLCB3ZC0+c3RhLkVuYWJsZUhULCB3ZC0+c3RhLkhUMjA0MCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBSSUZTIHRpbWVyCisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJpZnNUaW1lciA9IHdkLT50aWNrOworCisgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJpZnNDb3VudCsrOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgc3RhdGUgdG8gYmUgRGV0ZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucmlmc1N0YXRlID0gWk1fUklGU19TVEFURV9ERVRFQ1RFRDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsvLyBzdGF0ZSA9IERldGVjdGVkCisgICAgICAgICAgICAgICAgLy8gUmVzZXQgUklGUyB0aW1lcgorICAgICAgICAgICAgICAgIGlmKCAod2QtPnRpY2sgLSB3ZC0+c3RhLnJpZnNUaW1lcikgPCBaTV9SSUZTX1RJTUVSX1RJTUVPVVQgKQorICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLnJpZnNUaW1lciA9IHdkLT50aWNrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL0RiZ1ByaW50KCJTTjEgPSAlZCwgU04yID0gJWQsIFNOMyA9ICVkXG4iLCB3ZC0+c3RhLnJpZnNMaWtlRnJhbWVTZXF1ZW5jZVswXSwKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEucmlmc0xpa2VGcmFtZVNlcXVlbmNlWzFdLAorICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5yaWZzTGlrZUZyYW1lU2VxdWVuY2VbMl0pOworCisgICAgICAgICAgICAvLyBVcGRhdGUgUklGUy1saWtlIHNlcXVlbmNlIG51bWJlcgorICAgICAgICAgICAgaWYoIHdkLT5zdGEucmlmc0xpa2VGcmFtZVNlcXVlbmNlWzJdICE9IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5zdGEucmlmc0xpa2VGcmFtZVNlcXVlbmNlWzBdID0gd2QtPnN0YS5yaWZzTGlrZUZyYW1lU2VxdWVuY2VbMV07CisgICAgICAgICAgICAgICAgd2QtPnN0YS5yaWZzTGlrZUZyYW1lU2VxdWVuY2VbMV0gPSB3ZC0+c3RhLnJpZnNMaWtlRnJhbWVTZXF1ZW5jZVsyXTsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLnJpZnNMaWtlRnJhbWVTZXF1ZW5jZVsyXSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE9ubHkgcmVjb3JkIHRocmVlIGFkamFjZW50IGZyYW1lCisgICAgICAgICAgICBpZiggd2QtPnN0YS5yaWZzTGlrZUZyYW1lQ250IDwgMiApCisgICAgICAgICAgICAgICAgd2QtPnN0YS5yaWZzTGlrZUZyYW1lQ250Kys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiAjNCBEaXNhYmxlIFJJRlMgZnVuY3Rpb24gaWYgdGhlIHRpbWVyIFRJTUVPVVQgICovCisgICAgaWYoIHdkLT5zdGEucmlmc1N0YXRlID09IFpNX1JJRlNfU1RBVEVfREVURUNURUQgKQorICAgIHsKKyAgICAgICAgaWYoICggd2QtPnRpY2sgLSB3ZC0+c3RhLnJpZnNUaW1lciApID4gWk1fUklGU19USU1FUl9USU1FT1VUICkKKyAgICAgICAgey8vIFRJTUVPVVQKKyAgICAgICAgICAgIC8vIERpc2FibGUgUklGUworICAgICAgICAgICAgemZIcERpc2FibGVSaWZzKGRldik7CisKKyAgICAgICAgICAgIC8vIFJlc2V0IFJJRlMtbGlrZSBzZXF1ZW5jZSBudW1iZXIgRklGTworICAgICAgICAgICAgd2QtPnN0YS5yaWZzTGlrZUZyYW1lU2VxdWVuY2VbMF0gPSAwOworICAgICAgICAgICAgd2QtPnN0YS5yaWZzTGlrZUZyYW1lU2VxdWVuY2VbMV0gPSAwOworICAgICAgICAgICAgd2QtPnN0YS5yaWZzTGlrZUZyYW1lU2VxdWVuY2VbMl0gPSAwOworICAgICAgICAgICAgd2QtPnN0YS5yaWZzTGlrZUZyYW1lQ250ID0gMDsKKworICAgICAgICAgICAgLy8gU2V0IHN0YXRlIHRvIGJlIERldGVjdGluZworICAgICAgICAgICAgd2QtPnN0YS5yaWZzU3RhdGUgPSBaTV9SSUZTX1NUQVRFX0RFVEVDVElORzsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jd2VwLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY3dlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMzFiYjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY3dlcC5jCkBAIC0wLDAgKzEsMjk5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kdWxlIE5hbWUgOiBjd2VwLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIFR4IGFuZCBSeCBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiY3ByZWNvbXAuaCIKKwordTMyX3QgY3JjMzJfdGFiW10gPQoreworICAgICAgIDB4MDAwMDAwMDBMLCAweDc3MDczMDk2TCwgMHhlZTBlNjEyY0wsIDB4OTkwOTUxYmFMLCAweDA3NmRjNDE5TCwKKyAgICAgICAweDcwNmFmNDhmTCwgMHhlOTYzYTUzNUwsIDB4OWU2NDk1YTNMLCAweDBlZGI4ODMyTCwgMHg3OWRjYjhhNEwsCisgICAgICAgMHhlMGQ1ZTkxZUwsIDB4OTdkMmQ5ODhMLCAweDA5YjY0YzJiTCwgMHg3ZWIxN2NiZEwsIDB4ZTdiODJkMDdMLAorICAgICAgIDB4OTBiZjFkOTFMLCAweDFkYjcxMDY0TCwgMHg2YWIwMjBmMkwsIDB4ZjNiOTcxNDhMLCAweDg0YmU0MWRlTCwKKyAgICAgICAweDFhZGFkNDdkTCwgMHg2ZGRkZTRlYkwsIDB4ZjRkNGI1NTFMLCAweDgzZDM4NWM3TCwgMHgxMzZjOTg1NkwsCisgICAgICAgMHg2NDZiYThjMEwsIDB4ZmQ2MmY5N2FMLCAweDhhNjVjOWVjTCwgMHgxNDAxNWM0ZkwsIDB4NjMwNjZjZDlMLAorICAgICAgIDB4ZmEwZjNkNjNMLCAweDhkMDgwZGY1TCwgMHgzYjZlMjBjOEwsIDB4NGM2OTEwNWVMLCAweGQ1NjA0MWU0TCwKKyAgICAgICAweGEyNjc3MTcyTCwgMHgzYzAzZTRkMUwsIDB4NGIwNGQ0NDdMLCAweGQyMGQ4NWZkTCwgMHhhNTBhYjU2YkwsCisgICAgICAgMHgzNWI1YThmYUwsIDB4NDJiMjk4NmNMLCAweGRiYmJjOWQ2TCwgMHhhY2JjZjk0MEwsIDB4MzJkODZjZTNMLAorICAgICAgIDB4NDVkZjVjNzVMLCAweGRjZDYwZGNmTCwgMHhhYmQxM2Q1OUwsIDB4MjZkOTMwYWNMLCAweDUxZGUwMDNhTCwKKyAgICAgICAweGM4ZDc1MTgwTCwgMHhiZmQwNjExNkwsIDB4MjFiNGY0YjVMLCAweDU2YjNjNDIzTCwgMHhjZmJhOTU5OUwsCisgICAgICAgMHhiOGJkYTUwZkwsIDB4MjgwMmI4OWVMLCAweDVmMDU4ODA4TCwgMHhjNjBjZDliMkwsIDB4YjEwYmU5MjRMLAorICAgICAgIDB4MmY2ZjdjODdMLCAweDU4Njg0YzExTCwgMHhjMTYxMWRhYkwsIDB4YjY2NjJkM2RMLCAweDc2ZGM0MTkwTCwKKyAgICAgICAweDAxZGI3MTA2TCwgMHg5OGQyMjBiY0wsIDB4ZWZkNTEwMmFMLCAweDcxYjE4NTg5TCwgMHgwNmI2YjUxZkwsCisgICAgICAgMHg5ZmJmZTRhNUwsIDB4ZThiOGQ0MzNMLCAweDc4MDdjOWEyTCwgMHgwZjAwZjkzNEwsIDB4OTYwOWE4OGVMLAorICAgICAgIDB4ZTEwZTk4MThMLCAweDdmNmEwZGJiTCwgMHgwODZkM2QyZEwsIDB4OTE2NDZjOTdMLCAweGU2NjM1YzAxTCwKKyAgICAgICAweDZiNmI1MWY0TCwgMHgxYzZjNjE2MkwsIDB4ODU2NTMwZDhMLCAweGYyNjIwMDRlTCwgMHg2YzA2OTVlZEwsCisgICAgICAgMHgxYjAxYTU3YkwsIDB4ODIwOGY0YzFMLCAweGY1MGZjNDU3TCwgMHg2NWIwZDljNkwsIDB4MTJiN2U5NTBMLAorICAgICAgIDB4OGJiZWI4ZWFMLCAweGZjYjk4ODdjTCwgMHg2MmRkMWRkZkwsIDB4MTVkYTJkNDlMLCAweDhjZDM3Y2YzTCwKKyAgICAgICAweGZiZDQ0YzY1TCwgMHg0ZGIyNjE1OEwsIDB4M2FiNTUxY2VMLCAweGEzYmMwMDc0TCwgMHhkNGJiMzBlMkwsCisgICAgICAgMHg0YWRmYTU0MUwsIDB4M2RkODk1ZDdMLCAweGE0ZDFjNDZkTCwgMHhkM2Q2ZjRmYkwsIDB4NDM2OWU5NmFMLAorICAgICAgIDB4MzQ2ZWQ5ZmNMLCAweGFkNjc4ODQ2TCwgMHhkYTYwYjhkMEwsIDB4NDQwNDJkNzNMLCAweDMzMDMxZGU1TCwKKyAgICAgICAweGFhMGE0YzVmTCwgMHhkZDBkN2NjOUwsIDB4NTAwNTcxM2NMLCAweDI3MDI0MWFhTCwgMHhiZTBiMTAxMEwsCisgICAgICAgMHhjOTBjMjA4NkwsIDB4NTc2OGI1MjVMLCAweDIwNmY4NWIzTCwgMHhiOTY2ZDQwOUwsIDB4Y2U2MWU0OWZMLAorICAgICAgIDB4NWVkZWY5MGVMLCAweDI5ZDljOTk4TCwgMHhiMGQwOTgyMkwsIDB4YzdkN2E4YjRMLCAweDU5YjMzZDE3TCwKKyAgICAgICAweDJlYjQwZDgxTCwgMHhiN2JkNWMzYkwsIDB4YzBiYTZjYWRMLCAweGVkYjg4MzIwTCwgMHg5YWJmYjNiNkwsCisgICAgICAgMHgwM2I2ZTIwY0wsIDB4NzRiMWQyOWFMLCAweGVhZDU0NzM5TCwgMHg5ZGQyNzdhZkwsIDB4MDRkYjI2MTVMLAorICAgICAgIDB4NzNkYzE2ODNMLCAweGUzNjMwYjEyTCwgMHg5NDY0M2I4NEwsIDB4MGQ2ZDZhM2VMLCAweDdhNmE1YWE4TCwKKyAgICAgICAweGU0MGVjZjBiTCwgMHg5MzA5ZmY5ZEwsIDB4MGEwMGFlMjdMLCAweDdkMDc5ZWIxTCwgMHhmMDBmOTM0NEwsCisgICAgICAgMHg4NzA4YTNkMkwsIDB4MWUwMWYyNjhMLCAweDY5MDZjMmZlTCwgMHhmNzYyNTc1ZEwsIDB4ODA2NTY3Y2JMLAorICAgICAgIDB4MTk2YzM2NzFMLCAweDZlNmIwNmU3TCwgMHhmZWQ0MWI3NkwsIDB4ODlkMzJiZTBMLCAweDEwZGE3YTVhTCwKKyAgICAgICAweDY3ZGQ0YWNjTCwgMHhmOWI5ZGY2ZkwsIDB4OGViZWVmZjlMLCAweDE3YjdiZTQzTCwgMHg2MGIwOGVkNUwsCisgICAgICAgMHhkNmQ2YTNlOEwsIDB4YTFkMTkzN2VMLCAweDM4ZDhjMmM0TCwgMHg0ZmRmZjI1MkwsIDB4ZDFiYjY3ZjFMLAorICAgICAgIDB4YTZiYzU3NjdMLCAweDNmYjUwNmRkTCwgMHg0OGIyMzY0YkwsIDB4ZDgwZDJiZGFMLCAweGFmMGExYjRjTCwKKyAgICAgICAweDM2MDM0YWY2TCwgMHg0MTA0N2E2MEwsIDB4ZGY2MGVmYzNMLCAweGE4NjdkZjU1TCwgMHgzMTZlOGVlZkwsCisgICAgICAgMHg0NjY5YmU3OUwsIDB4Y2I2MWIzOGNMLCAweGJjNjY4MzFhTCwgMHgyNTZmZDJhMEwsIDB4NTI2OGUyMzZMLAorICAgICAgIDB4Y2MwYzc3OTVMLCAweGJiMGI0NzAzTCwgMHgyMjAyMTZiOUwsIDB4NTUwNTI2MmZMLCAweGM1YmEzYmJlTCwKKyAgICAgICAweGIyYmQwYjI4TCwgMHgyYmI0NWE5MkwsIDB4NWNiMzZhMDRMLCAweGMyZDdmZmE3TCwgMHhiNWQwY2YzMUwsCisgICAgICAgMHgyY2Q5OWU4YkwsIDB4NWJkZWFlMWRMLCAweDliNjRjMmIwTCwgMHhlYzYzZjIyNkwsIDB4NzU2YWEzOWNMLAorICAgICAgIDB4MDI2ZDkzMGFMLCAweDljMDkwNmE5TCwgMHhlYjBlMzYzZkwsIDB4NzIwNzY3ODVMLCAweDA1MDA1NzEzTCwKKyAgICAgICAweDk1YmY0YTgyTCwgMHhlMmI4N2ExNEwsIDB4N2JiMTJiYWVMLCAweDBjYjYxYjM4TCwgMHg5MmQyOGU5YkwsCisgICAgICAgMHhlNWQ1YmUwZEwsIDB4N2NkY2VmYjdMLCAweDBiZGJkZjIxTCwgMHg4NmQzZDJkNEwsIDB4ZjFkNGUyNDJMLAorICAgICAgIDB4NjhkZGIzZjhMLCAweDFmZGE4MzZlTCwgMHg4MWJlMTZjZEwsIDB4ZjZiOTI2NWJMLCAweDZmYjA3N2UxTCwKKyAgICAgICAweDE4Yjc0Nzc3TCwgMHg4ODA4NWFlNkwsIDB4ZmYwZjZhNzBMLCAweDY2MDYzYmNhTCwgMHgxMTAxMGI1Y0wsCisgICAgICAgMHg4ZjY1OWVmZkwsIDB4Zjg2MmFlNjlMLCAweDYxNmJmZmQzTCwgMHgxNjZjY2Y0NUwsIDB4YTAwYWUyNzhMLAorICAgICAgIDB4ZDcwZGQyZWVMLCAweDRlMDQ4MzU0TCwgMHgzOTAzYjNjMkwsIDB4YTc2NzI2NjFMLCAweGQwNjAxNmY3TCwKKyAgICAgICAweDQ5Njk0NzRkTCwgMHgzZTZlNzdkYkwsIDB4YWVkMTZhNGFMLCAweGQ5ZDY1YWRjTCwgMHg0MGRmMGI2NkwsCisgICAgICAgMHgzN2Q4M2JmMEwsIDB4YTliY2FlNTNMLCAweGRlYmI5ZWM1TCwgMHg0N2IyY2Y3ZkwsIDB4MzBiNWZmZTlMLAorICAgICAgIDB4YmRiZGYyMWNMLCAweGNhYmFjMjhhTCwgMHg1M2IzOTMzMEwsIDB4MjRiNGEzYTZMLCAweGJhZDAzNjA1TCwKKyAgICAgICAweGNkZDcwNjkzTCwgMHg1NGRlNTcyOUwsIDB4MjNkOTY3YmZMLCAweGIzNjY3YTJlTCwgMHhjNDYxNGFiOEwsCisgICAgICAgMHg1ZDY4MWIwMkwsIDB4MmE2ZjJiOTRMLCAweGI0MGJiZTM3TCwgMHhjMzBjOGVhMUwsIDB4NWEwNWRmMWJMLAorICAgICAgIDB4MmQwMmVmOGRMCit9OworCit2b2lkIHpmV0VQRW5jcnlwdCh6ZGV2X3QgKmRldiwgemJ1Zl90ICpidWYsIHU4X3QgKnNuYXAsIHUxNl90IHNuYXBMZW4sIHUxNl90IG9mZnNldCwgdThfdCBrZXlMZW4sIHU4X3QqIFdlcEtleSwgdThfdCAqaXYpCit7CisgICAgdThfdCAgICBTWzI1Nl0sUzJbMjU2XTsKKyAgICB1MTZfdCAgIHVpOworICAgIHUxNl90ICAgaTsKKyAgICB1MTZfdCAgIGo7CisgICAgdThfdCAgICB0ZW1wOworICAgIHU4X3QgICAgSzsKKyAgICB1MzJfdCAgIGx0ZW1wOworICAgIHUxNl90ICAgbGVuOworICAgIHUzMl90ICAgaWN2OworICAgIHU4X3QgICAga2V5WzMyXTsKKworICAgIGtleVswXSA9IGl2WzBdOworICAgIGtleVsxXSA9IGl2WzFdOworICAgIGtleVsyXSA9IGl2WzJdOworCisgICAgLyogQXBwZW5kIFdlcCBLZXkgYWZ0ZXIgSVYgKi8KKyAgICB6Zk1lbW9yeUNvcHkoJmtleVszXSwgV2VwS2V5LCBrZXlMZW4pOworCisgICAga2V5TGVuICs9IDM7CisKKyAgICBmb3IoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICB7CisgICAgICAgIFNbaV0gPSAodThfdClpOworICAgICAgICBTMltpXSA9IGtleVtpJihrZXlMZW4tMSldOworICAgIH0KKworICAgIGogPSAwOworICAgIGZvcihpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgIHsKKyAgICAgICAgaiA9IChqICsgU1tpXSArIFMyW2ldKSA7CisgICAgICAgIGomPTI1NSA7CisKKyAgICAgICAgLy8gU3dhcCBTW2ldIGFuZCBTW2pdCisgICAgICAgIHRlbXAgPSBTW2ldOworICAgICAgICBTW2ldID0gU1tqXTsKKyAgICAgICAgU1tqXSA9IHRlbXA7CisgICAgfQorCisgICAgaSA9IGogPSAwOworICAgIGljdiA9IC0xOworCisgICAgLyogRm9yIFNuYXAgSGVhZGVyICovCisgICAgZm9yICh1aSA9IDA7IHVpIDwgc25hcExlbjsgdWkrKykKKyAgICB7CisgICAgICAgIHU4X3QgSW47CisKKyAgICAgICAgaSsrOworICAgICAgICBpICY9IDI1NTsKKyAgICAgICAgaiArPSBTW2ldOworICAgICAgICBqICY9IDI1NTsKKworICAgICAgICAvLyBTd2FwIFNbaV0gYW5kIFNbal0KKyAgICAgICAgdGVtcCA9IFNbaV07CisgICAgICAgIFNbaV0gPSBTW2pdOworICAgICAgICBTW2pdID0gdGVtcDsKKy8vICAgICAgICAgIHRlbXAgPSAoU1tpXSArIHRlbXApICYgMjU1OworICAgICAgICB0ZW1wICs9IFNbaV07CisgICAgICAgIHRlbXAgJj0yNTU7CisgICAgICAgIEsgPSBTW3RlbXBdOyAgICAgICAgLy8gS2V5IHVzZWQgdG8gWG9yIHdpdGggaW5wdXQgZGF0YQorCisgICAgICAgIEluID0gc25hcFt1aV07CisgICAgICAgIGljdiA9ICAoaWN2Pj44KSBeIGNyYzMyX3RhYlsoaWN2XkluKSYweGZmXTsKKworICAgICAgICBzbmFwW3VpXSA9IEluIF4gSzsKKyAgICAgICAgLy96bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1ZiwgdWksIEluIF4gSyk7CisgICAgfQorCisgICAgbGVuID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CisKKyAgICBmb3IgKHVpID0gb2Zmc2V0OyB1aSA8IGxlbjsgdWkrKykKKyAgICB7CisgICAgICAgIHU4X3QgSW47CisKKyAgICAgICAgaSsrOworICAgICAgICBpICY9IDI1NTsKKyAgICAgICAgaiArPSBTW2ldOworICAgICAgICBqICY9IDI1NTsKKworICAgICAgICAvLyBTd2FwIFNbaV0gYW5kIFNbal0KKyAgICAgICAgdGVtcCA9IFNbaV07CisgICAgICAgIFNbaV0gPSBTW2pdOworICAgICAgICBTW2pdID0gdGVtcDsKKy8vICAgICAgICAgIHRlbXAgPSAoU1tpXSArIHRlbXApICYgMjU1OworICAgICAgICB0ZW1wICs9IFNbaV07CisgICAgICAgIHRlbXAgJj0yNTU7CisgICAgICAgIEsgPSBTW3RlbXBdOyAgICAgICAgLy8gS2V5IHVzZWQgdG8gWG9yIHdpdGggaW5wdXQgZGF0YQorCisgICAgICAgIEluID0gem13X3R4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgdWkpOworICAgICAgICBpY3YgPSAgKGljdj4+OCkgXiBjcmMzMl90YWJbKGljdl5JbikmMHhmZl07CisKKyAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIHVpLCBJbiBeIEspOworICAgIH0gLy9FbmQgb2YgZm9yICh1aSA9IDA7IHVpIDwgTnVtX0J5dGVzOyB1aSsrKQorCisgICAgaWN2ID0gfihpY3YpOworICAgIGx0ZW1wID0gKHUzMl90KSBpY3Y7CisKKyAgICBmb3IgKHVpID0gMDsgdWkgPCA0OyB1aSsrKQorICAgIHsKKyAgICAgICAgaSArKzsKKyAgICAgICAgaSAmPSAyNTU7CisgICAgICAgIGogKz0gU1tpXTsKKyAgICAgICAgaiAmPSAyNTU7CisKKyAgICAgICAgLy8gU3dhcCBTW2ldIGFuZCBTW2pdCisgICAgICAgIHRlbXAgPSBTW2ldOworICAgICAgICBTW2ldID0gU1tqXTsKKyAgICAgICAgU1tqXSA9IHRlbXA7CisgICAgICAgIHRlbXAgKz0gU1tpXTsKKyAgICAgICAgdGVtcCAmPSAyNTU7CisgICAgICAgIEsgPSBTW3RlbXBdOyAgICAgICAgLy8gS2V5IHVzZWQgdG8gWG9yIHdpdGggaW5wdXQgZGF0YQorCisgICAgICAgIC8vKk91dCsrID0gKHU4X3QpKGx0ZW1wIF4gSykmMHhmZjsKKyAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIGxlbit1aSwgKHU4X3QpKGx0ZW1wIF4gSykmMHhmZik7CisgICAgICAgIGx0ZW1wID4+PSA4OworICAgIH0KKworICAgIHpmd0J1ZlNldFNpemUoZGV2LCBidWYsIGxlbis0KTsKK30KKwordTE2X3QgemZXRVBEZWNyeXB0KHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGtleUxlbiwgdThfdCogV2VwS2V5LCB1OF90ICppdikKK3sKKyAgICB1OF90ICAgIFNbMjU2XTsKKyAgICB1OF90ICAgIFMyWzI1Nl07CisgICAgdTE2X3QgICB1aTsKKyAgICB1MTZfdCAgIGk7CisgICAgdTE2X3QgICBqOworICAgIHUzMl90ICAgaWN2X3RtcDsKKyAgICB1MzJfdCAgICppY3Y7CisgICAgdTMyX3QgICByeGJ1Zl9pY3Y7CisgICAgdThfdCAgICB0ZW1wOworICAgIHU4X3QgICAgSzsKKyAgICB1MTZfdCAgIGxlbjsKKyAgICB1OF90ICAgIGtleVszMl07CisKKyAgICAvKiBSZXRyaWV2ZSBJViAqLworICAgIGtleVswXSA9IGl2WzBdOworICAgIGtleVsxXSA9IGl2WzFdOworICAgIGtleVsyXSA9IGl2WzJdOworCisgICAgLyogQXBwZW5kIFdlcCBLZXkgYWZ0ZXIgSVYgKi8KKyAgICB6Zk1lbW9yeUNvcHkoJmtleVszXSwgV2VwS2V5LCBrZXlMZW4pOworCisgICAga2V5TGVuICs9IDM7CisKKyAgICBmb3IoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICB7CisgICAgICAgIFNbaV0gPSAodThfdClpOworICAgICAgICBTMltpXSA9IGtleVtpJihrZXlMZW4tMSldOworICAgIH0KKworICAgIGogPSAwOworICAgIGZvcihpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgIHsKKyAgICAgICAgaiA9IChqICsgU1tpXSArIFMyW2ldKTsKKyAgICAgICAgaiY9MjU1IDsKKworICAgICAgICAvLyBTd2FwIFNbaV0gYW5kIFNbal0KKyAgICAgICAgdGVtcCA9IFNbaV07CisgICAgICAgIFNbaV0gPSBTW2pdOworICAgICAgICBTW2pdID0gdGVtcDsKKyAgICB9CisKKyAgICBpID0gaiA9IDA7CisKKyAgICBsZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKworICAgIGZvciAodWkgPSBvZmZzZXQ7IHVpIDwgbGVuOyB1aSsrKQorICAgIHsKKyAgICAgICAgdThfdCBJbjsKKworICAgICAgICBpKys7CisgICAgICAgIGkgJj0gMjU1OworICAgICAgICBqICs9IFNbaV07CisgICAgICAgIGogJj0gMjU1OworCisgICAgICAgIC8vIFN3YXAgU1tpXSBhbmQgU1tqXQorICAgICAgICB0ZW1wID0gU1tpXTsKKyAgICAgICAgU1tpXSA9IFNbal07CisgICAgICAgIFNbal0gPSB0ZW1wOworLy8gICAgICAgICAgdGVtcCA9IChTW2ldICsgdGVtcCkgJiAyNTU7CisgICAgICAgIHRlbXAgKz0gU1tpXTsKKyAgICAgICAgdGVtcCAmPTI1NTsKKyAgICAgICAgSyA9IFNbdGVtcF07ICAgICAgICAvLyBLZXkgdXNlZCB0byBYb3Igd2l0aCBpbnB1dCBkYXRhCisKKyAgICAgICAgSW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCB1aSk7CisKKyAgICAgICAgem13X3J4X2J1Zl93cml0ZWIoZGV2LCBidWYsIHVpLCBJbiBeIEspOworICAgIH0gLy9FbmQgb2YgZm9yICh1aSA9IDA7IHVpIDwgTnVtX0J5dGVzOyB1aSsrKQorCisgICAgaWN2ID0gJmljdl90bXA7CisgICAgKmljdiA9IC0xOworCisgICAgZm9yICh1aSA9IG9mZnNldDsgdWkgPCBsZW4gLSA0OyB1aSsrKQorICAgIHsKKyAgICAgICAgdThfdCBJbjsKKworICAgICAgICBJbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIHVpKTsKKyAgICAgICAgKmljdiA9ICAoKmljdj4+OCkgXiBjcmMzMl90YWJbKCppY3ZeSW4pJjB4ZmZdOworICAgIH0KKworICAgICppY3YgPSB+KmljdjsKKworICAgIHJ4YnVmX2ljdiA9ICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBsZW4tNCkgfAorICAgICAgICAgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgbGVuLTMpIDw8IDggfAorICAgICAgICAgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgbGVuLTIpIDw8IDE2IHwKKyAgICAgICAgIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIGxlbi0xKSA8PCAyNCk7CisKKyAgICBpZiAoKmljdiAhPSByeGJ1Zl9pY3YpCisgICAgeworICAgICAgICByZXR1cm4gWk1fSUNWX0ZBSUxVUkU7CisgICAgfQorCisgICAgcmV0dXJuIFpNX0lDVl9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2N3bS5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2N3bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZjExNDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY3dtLmMKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IGN3bS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgY2hhbm5lbCB3aWR0aCByZWxhdGVkIGZ1bmN0aW9ucy4gICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImNwcmVjb21wLmgiCisKKworCit2b2lkIHpmQ3dtSW5pdCh6ZGV2X3QqIGRldikgeworICAgIC8vdTE2X3QgaTsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzd2l0Y2ggKHdkLT53bGFuTW9kZSkgeworICAgIGNhc2UgWk1fTU9ERV9BUDoKKyAgICAgICAgd2QtPmN3bS5jd19tb2RlID0gQ1dNX01PREUyMDQwOworICAgICAgICB3ZC0+Y3dtLmN3X3dpZHRoID0gQ1dNX1dJRFRINDA7CisgICAgICAgIHdkLT5jd20uY3dfZW5hYmxlID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFOgorICAgIGNhc2UgWk1fTU9ERV9QU0VVRE86CisgICAgY2FzZSBaTV9NT0RFX0lCU1M6CisgICAgZGVmYXVsdDoKKyAgICAgICAgd2QtPmN3bS5jd19tb2RlID0gQ1dNX01PREUyMDQwOworICAgICAgICB3ZC0+Y3dtLmN3X3dpZHRoID0gQ1dNX1dJRFRIMjA7CisgICAgICAgIHdkLT5jd20uY3dfZW5hYmxlID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisKK3ZvaWQgemZDb3JlQ3dtQnVzeSh6ZGV2X3QqIGRldiwgdTE2X3QgYnVzeSkKK3sKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptX21zZzFfbW0oWk1fTFZfMCwgIkN3bUJ1c3k9IiwgYnVzeSk7CisKKyAgICBpZih3ZC0+Y3dtLmN3X21vZGUgPT0gQ1dNX01PREUyMCkgeworICAgICAgICB3ZC0+Y3dtLmN3X3dpZHRoID0gQ1dNX1dJRFRIMjA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZih3ZC0+Y3dtLmN3X21vZGUgPT0gQ1dNX01PREU0MCkgeworICAgICAgICB3ZC0+Y3dtLmN3X3dpZHRoID0gQ1dNX1dJRFRINDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoYnVzeSkgeworICAgICAgICB3ZC0+Y3dtLmN3X3dpZHRoID0gQ1dNX1dJRFRIMjA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKworICAgIGlmKCh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSB8fCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9QU0VVRE8gfHwKKyAgICAgICAgd2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUykpIHsKKyAgICAgICAgaWYgKHdkLT5zdGEuaWUuSHRDYXAuSHRDYXBJbmZvICYmIEhUQ0FQX1N1cENoYW5uZWxXaWR0aFNldCAhPSAwICYmCisgICAgICAgICAgICB3ZC0+c3RhLmllLkh0SW5mby5DaGFubmVsSW5mbyAmJiBFeHRIdENhcF9SZWNvbVR4V2lkdGhTZXQgIT0gMCAmJgorICAgICAgICAgICAgKHdkLT5zdGEuaWUuSHRJbmZvLkNoYW5uZWxJbmZvICYmIEV4dEh0Q2FwX0V4dENoYW5uZWxPZmZzZXRBYm92ZSkgPT0gMSkgeworCisgICAgICAgICAgICB3ZC0+Y3dtLmN3X3dpZHRoID0gQ1dNX1dJRFRINDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB3ZC0+Y3dtLmN3X3dpZHRoID0gQ1dNX1dJRFRIMjA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApIHsKKyAgICAgICAgd2QtPmN3bS5jd193aWR0aCA9IENXTV9XSURUSDQwOworICAgIH0KKworfQorCisKKworCit1MTZfdCB6ZkN3bUlzRXh0Q2hhbkJ1c3kodTMyX3QgY3RsQnVzeSwgdTMyX3QgZXh0QnVzeSkKK3sKKyAgICB1MzJfdCBidXN5OyAvKiBwZXJjZW50YWdlICovCisgICAgdTMyX3QgY3ljbGVUaW1lLCBjdGxDbGVhcjsKKworICAgIGN5Y2xlVGltZSA9IDEyODAwMDA7IC8vMS4yOCBzZWNvbmRzCisKKyAgICBpZiAoY3ljbGVUaW1lID4gY3RsQnVzeSkgeworICAgICAgICBjdGxDbGVhciA9IGN5Y2xlVGltZSAtIGN0bEJ1c3k7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGN0bENsZWFyID0gMDsKKyAgICB9CisKKyAgICAvKiBDb21wdXRlIHJhdGlvIG9mIGV4dGVuc2lvbiBjaGFubmVsIGJ1c3kgdG8gY29udHJvbCBjaGFubmVsIGNsZWFyCisgICAgICogYXMgYW4gYXBwcm94aW1hdGlvbiB0byBleHRlbnNpb24gY2hhbm5lbCBjbGVhbmxpbmVzcy4KKyAgICAgKgorICAgICAqIEFjY29yZGluZyB0byB0aGUgaGFyZHdhcmUgZm9sa3MsIGV4dCByeGNsZWFyIGlzIHVuZGVmaW5lZAorICAgICAqIGlmIHRoZSBjdHJsIHJ4Y2xlYXIgaXMgZGUtYXNzZXJ0ZWQgKGkuZS4gYnVzeSkKKyAgICAgKi8KKyAgICBpZiAoY3RsQ2xlYXIpIHsKKyAgICAgICAgYnVzeSA9IChleHRCdXN5ICogMTAwKSAvIGN0bENsZWFyOworICAgIH0gZWxzZSB7CisgICAgICAgIGJ1c3kgPSAwOworICAgIH0KKyAgICBpZiAoYnVzeSA+IEFUSF9DV01fRVhUQ0hfQlVTWV9USFJFU0hPTEQpIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgcmV0dXJuIEZBTFNFOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2N3bS5oIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2N3bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYzM5ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY3dtLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IGN3bS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgY2hhbm5lbCB3aWR0aCByZWxhdGl2ZWQgZnVuY3Rpb25zLiAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qUmV2aXNpb24gSGlzdG9yeTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgV2hhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAtLS0tLS0tLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSG9uZGEgICAgICAgMy0xOS0wNyAgICAgY3JlYXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9DV01fSAorI2RlZmluZSBfQ1dNX0gKKworI2RlZmluZSBBVEhfQ1dNX0VYVENIX0JVU1lfVEhSRVNIT0xEICAzMCAgLyogRXh0ZW5zaW9uIENoYW5uZWwgQnVzeSBUaHJlc2hvbGQgKDAtMTAwJSkgKi8KKwordm9pZCB6ZkN3bUluaXQoemRldl90KiBkZXYpOwordm9pZCB6ZkNvcmVDd21CdXN5KHpkZXZfdCogZGV2LCB1MTZfdCBidXN5KTsKK3UxNl90IHpmQ3dtSXNFeHRDaGFuQnVzeSh1MzJfdCBjdGxCdXN5LCB1MzJfdCBleHRCdXN5KTsKKworCisKKyNlbmRpZiAvKiAjaWZuZGVmIF9DV01fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2ZyZXFjdHJsLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvZnJlcWN0cmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWIwZGYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2ZyZXFjdHJsLmMKQEAgLTAsMCArMSwyNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiY3ByZWNvbXAuaCIKKworLyogemZBZGRGcmVxQ2hhbmdlUmVxIHNob3VsZCBiZSBjYWxsZWQgaW5zaWRlIHRoZSBjcml0aWNhbCBzZWN0aW9uICovCitzdGF0aWMgdm9pZCB6ZkFkZEZyZXFDaGFuZ2VSZXEoemRldl90KiBkZXYsIHUxNl90IGZyZXF1ZW5jeSwgdThfdCBidzQwLAorICAgICAgICB1OF90IGV4dE9mZnNldCwgemZwRnJlcUNoYW5nZUNvbXBsZXRlQ2IgY2IpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisvL3ByaW50aygiemZBZGRGcmVxQ2hhbmdlUmVxICBmcmVxUmVxUXVldWVUYWlsJWRcbiIsIHdkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVUYWlsKTsKKyAgICB3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlW3dkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVUYWlsXSA9IGZyZXF1ZW5jeTsKKyAgICB3ZC0+ZnJlcUN0cmwuZnJlcVJlcUJ3NDBbd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZVRhaWxdID0gYnc0MDsKKyAgICB3ZC0+ZnJlcUN0cmwuZnJlcVJlcUV4dE9mZnNldFt3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlVGFpbF0gPSBleHRPZmZzZXQ7CisgICAgd2QtPmZyZXFDdHJsLmZyZXFDaGFuZ2VDb21wQ2Jbd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZVRhaWxdID0gY2I7CisgICAgd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZVRhaWwrKzsKKyAgICBpZiAoIHdkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVUYWlsID49IFpNX01BWF9GUkVRX1JFUV9RVUVVRSApCisgICAgeworICAgICAgICB3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlVGFpbCA9IDA7CisgICAgfQorfQorCit2b2lkIHpmQ29yZVNldEZyZXF1ZW5jeVYyKHpkZXZfdCogZGV2LCB1MTZfdCBmcmVxdWVuY3ksIHpmcEZyZXFDaGFuZ2VDb21wbGV0ZUNiIGNiKQoreworICAgIHpmQ29yZVNldEZyZXF1ZW5jeUV4KGRldiwgZnJlcXVlbmN5LCAwLCAwLCBjYik7Cit9CisKK3ZvaWQgemZDb3JlU2V0RnJlcXVlbmN5RXhWMih6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcXVlbmN5LCB1OF90IGJ3NDAsCisgICAgICAgIHU4X3QgZXh0T2Zmc2V0LCB6ZnBGcmVxQ2hhbmdlQ29tcGxldGVDYiBjYiwgdThfdCBmb3JjZVNldEZyZXEpCit7CisgICAgdThfdCBzZXRGcmVxSW1tZWQgPSAwOworICAgIHU4X3QgaW5pdFJGID0gMDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptX21zZzFfc2NhbihaTV9MVl8xLCAiRnJlcT0iLCBmcmVxdWVuY3kpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBpZiAoKHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeSA9PSBmcmVxdWVuY3kpCisgICAgICAgICYmICh3ZC0+c3RhLmN1cnJlbnRCdzQwID09IGJ3NDApCisgICAgICAgICYmICh3ZC0+c3RhLmN1cnJlbnRFeHRPZmZzZXQgPT0gZXh0T2Zmc2V0KSkKKyAgICB7CisgICAgICAgIGlmICggZm9yY2VTZXRGcmVxID09IDAgJiYgd2QtPnN0YS5mbGFnRnJlcUNoYW5naW5nID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKyAgICB9CisjaWZkZWYgWk1fRkI1MAorICAgIC8qaWYoZnJlcXVlbmN5IT0yNDM3KSB7CisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHJldHVybjsKKyAgICB9Ki8KKyNlbmRpZgorCisgICAgemZBZGRGcmVxQ2hhbmdlUmVxKGRldiwgZnJlcXVlbmN5LCBidzQwLCBleHRPZmZzZXQsIGNiKTsKKworLy8gICAgem1fYXNzZXJ0KCB3ZC0+c3RhLmZsYWdGcmVxQ2hhbmdpbmcgPT0gMCApOworICAgIC8vd2QtPnN0YS5mbGFnRnJlcUNoYW5naW5nID0gMTsKKyAgICBpZiAoIHdkLT5zdGEuZmxhZ0ZyZXFDaGFuZ2luZyA9PSAwICkKKyAgICB7CisgICAgICAgIGlmICgod2QtPnN0YS5jdXJyZW50Qnc0MCAhPSBidzQwKSB8fCAod2QtPnN0YS5jdXJyZW50RXh0T2Zmc2V0ICE9IGV4dE9mZnNldCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGluaXRSRiA9IDE7CisgICAgICAgIH0KKyAgICAgICAgd2QtPnN0YS5jdXJyZW50RnJlcXVlbmN5ID0gZnJlcXVlbmN5OworICAgICAgICB3ZC0+c3RhLmN1cnJlbnRCdzQwID0gYnc0MDsKKyAgICAgICAgd2QtPnN0YS5jdXJyZW50RXh0T2Zmc2V0ID0gZXh0T2Zmc2V0OworICAgICAgICBzZXRGcmVxSW1tZWQgPSAxOworICAgIH0KKyAgICB3ZC0+c3RhLmZsYWdGcmVxQ2hhbmdpbmcrKzsKKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAoIHNldEZyZXFJbW1lZCApCisgICAgeworICAgICAgICAvL3pmSHBTZXRGcmVxdWVuY3koZGV2LCBmcmVxdWVuY3ksIDApOworICAgICAgICBpZiAoIGZvcmNlU2V0RnJlcSApCisgICAgICAgIHsgLy8gQ29sZCByZXNldCB0byByZXNldCB0aGUgZnJlcXVlbmN5IGFmdGVyIHNjYW5uaW5nICEKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIiM2XzEgMjAwNzA5MTciKTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIkl0IGlzIGhhcHBlbiEhISBObyBlcnJvciBtZXNzYWdlIik7CisgICAgICAgICAgICB6ZkhwU2V0RnJlcXVlbmN5RXgoZGV2LCBmcmVxdWVuY3ksIGJ3NDAsIGV4dE9mZnNldCwgMik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgIHpmSHBTZXRGcmVxdWVuY3lFeChkZXYsIGZyZXF1ZW5jeSwgYnc0MCwgZXh0T2Zmc2V0LCBpbml0UkYpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCAgICB6ZlN0YUlzQ29ubmVjdGVkKGRldikKKyAgICAgICAgICAgICAmJiAoZnJlcXVlbmN5ID09IHdkLT5mcmVxdWVuY3kpKSB7CisgICAgICAgICAgICB3ZC0+c3RhLmNvbm5Qb3dlckluSGFsZkRibSA9IHpmSHBHZXRUcmFuc21pdFBvd2VyKGRldik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworCitkb25lOgorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAoIGNiICE9IE5VTEwgKQorICAgIHsKKyAgICAgICAgY2IoZGV2KTsKKyAgICB9CisgICAgemZQdXNoVnR4cShkZXYpOworICAgIHJldHVybjsKK30KKwordm9pZCB6ZkNvcmVTZXRGcmVxdWVuY3lFeCh6ZGV2X3QqIGRldiwgdTE2X3QgZnJlcXVlbmN5LCB1OF90IGJ3NDAsCisgICAgICAgIHU4X3QgZXh0T2Zmc2V0LCB6ZnBGcmVxQ2hhbmdlQ29tcGxldGVDYiBjYikKK3sKKyAgICB6ZkNvcmVTZXRGcmVxdWVuY3lFeFYyKGRldiwgZnJlcXVlbmN5LCBidzQwLCBleHRPZmZzZXQsIGNiLCAwKTsKK30KKwordm9pZCB6ZkNvcmVTZXRGcmVxdWVuY3koemRldl90KiBkZXYsIHUxNl90IGZyZXF1ZW5jeSkKK3sKKyAgICB6ZkNvcmVTZXRGcmVxdWVuY3lWMihkZXYsIGZyZXF1ZW5jeSwgTlVMTCk7Cit9CisKKy8qIHpmUmVtb3ZlRnJlcUNoYW5nZVJlcSBTSE9VTEQgTk9UIGJlIGNhbGxlZCBpbnNpZGUgdGhlIGNyaXRpY2FsIHNlY3Rpb24gKi8KK3N0YXRpYyB2b2lkIHpmUmVtb3ZlRnJlcUNoYW5nZVJlcSh6ZGV2X3QqIGRldikKK3sKKyAgICB6ZnBGcmVxQ2hhbmdlQ29tcGxldGVDYiBjYiA9IE5VTEw7CisgICAgdTE2X3QgZnJlcXVlbmN5OworICAgIHU4X3QgYnc0MDsKKyAgICB1OF90IGV4dE9mZnNldDsKKyAgICB1MTZfdCBjb21wRnJlcSA9IDA7CisgICAgdThfdCBjb21wQnc0MCA9IDA7CisgICAgdThfdCBjb21wRXh0T2Zmc2V0ID0gMDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmICh3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlSGVhZCAhPSB3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlVGFpbCkKKyAgICB7CisgICAgICAgIHptX21zZzFfc2NhbihaTV9MVl8xLCAiRnJlcT0iLAorICAgICAgICAgICAgICAgIHdkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVbd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZUhlYWRdKTsKKyAgICAgICAgY29tcEZyZXEgPSB3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlW3dkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVIZWFkXTsKKyAgICAgICAgY29tcEJ3NDAgPSB3ZC0+ZnJlcUN0cmwuZnJlcVJlcUJ3NDBbd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZUhlYWRdOworICAgICAgICBjb21wRXh0T2Zmc2V0ID0gd2QtPmZyZXFDdHJsLmZyZXFSZXFFeHRPZmZzZXRbd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZUhlYWRdOworCisgICAgICAgIHdkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVbd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZUhlYWRdID0gMDsKKyAgICAgICAgY2IgPSB3ZC0+ZnJlcUN0cmwuZnJlcUNoYW5nZUNvbXBDYlt3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlSGVhZF07CisgICAgICAgIHdkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVIZWFkKys7CisgICAgICAgIGlmICggd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZUhlYWQgPj0gWk1fTUFYX0ZSRVFfUkVRX1FVRVVFICkKKyAgICAgICAgeworICAgICAgICAgICAgd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZUhlYWQgPSAwOworICAgICAgICB9CisgICAgfQorICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAoIGNiICE9IE5VTEwgKQorICAgIHsKKyAgICAgICAgY2IoZGV2KTsKKyAgICB9CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHdoaWxlICh3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlW3dkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVIZWFkXSAhPSAwKQorICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZVt3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlSGVhZF07CisgICAgICAgIGJ3NDAgPSB3ZC0+ZnJlcUN0cmwuZnJlcVJlcUJ3NDBbd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZUhlYWRdOworICAgICAgICBleHRPZmZzZXQ9d2QtPmZyZXFDdHJsLmZyZXFSZXFFeHRPZmZzZXRbd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZUhlYWRdOworICAgICAgICBpZiAoKGNvbXBGcmVxID09IGZyZXF1ZW5jeSkKKyAgICAgICAgICAgICYmIChjb21wQnc0MCA9PSBidzQwKQorICAgICAgICAgICAgJiYgKGNvbXBFeHRPZmZzZXQgPT0gZXh0T2Zmc2V0KSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRHVwbGljYXRlZCBmcmVxdWVuY3kgY29tbWFuZCAqLworICAgICAgICAgICAgem1fbXNnMV9zY2FuKFpNX0xWXzEsICJEdXBsaWNhdGVkIEZyZXE9IiwgZnJlcXVlbmN5KTsKKworICAgICAgICAgICAgY2IgPSB3ZC0+ZnJlcUN0cmwuZnJlcUNoYW5nZUNvbXBDYlt3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlSGVhZF07CisgICAgICAgICAgICB3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlW3dkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVIZWFkXSA9IDA7CisgICAgICAgICAgICB3ZC0+ZnJlcUN0cmwuZnJlcVJlcVF1ZXVlSGVhZCsrOworCisgICAgICAgICAgICBpZiAoIHdkLT5mcmVxQ3RybC5mcmVxUmVxUXVldWVIZWFkID49IFpNX01BWF9GUkVRX1JFUV9RVUVVRSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPmZyZXFDdHJsLmZyZXFSZXFRdWV1ZUhlYWQgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHdkLT5zdGEuZmxhZ0ZyZXFDaGFuZ2luZyAhPSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+c3RhLmZsYWdGcmVxQ2hhbmdpbmctLTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIGlmICggY2IgIT0gTlVMTCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2IoZGV2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB1OF90ICAgIGluaXRSRiA9IDA7CisgICAgICAgICAgICBpZiAoKHdkLT5zdGEuY3VycmVudEJ3NDAgIT0gYnc0MCkgfHwgKHdkLT5zdGEuY3VycmVudEV4dE9mZnNldCAhPSBleHRPZmZzZXQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGluaXRSRiA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3ZC0+c3RhLmN1cnJlbnRGcmVxdWVuY3kgPSBmcmVxdWVuY3k7CisgICAgICAgICAgICB3ZC0+c3RhLmN1cnJlbnRCdzQwID0gYnc0MDsKKyAgICAgICAgICAgIHdkLT5zdGEuY3VycmVudEV4dE9mZnNldCA9IGV4dE9mZnNldDsKKyAgICAgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgICAgIHpmSHBTZXRGcmVxdWVuY3lFeChkZXYsIGZyZXF1ZW5jeSwgYnc0MCwgZXh0T2Zmc2V0LCBpbml0UkYpOworICAgICAgICAgICAgaWYgKCAgICB6ZlN0YUlzQ29ubmVjdGVkKGRldikKKyAgICAgICAgICAgICAgICAmJiAoZnJlcXVlbmN5ID09IHdkLT5mcmVxdWVuY3kpKSB7CisgICAgICAgICAgICAgICAgd2QtPnN0YS5jb25uUG93ZXJJbkhhbGZEYm0gPSB6ZkhwR2V0VHJhbnNtaXRQb3dlcihkZXYpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybjsKK30KKwordm9pZCB6ZkNvcmVTZXRGcmVxdWVuY3lDb21wbGV0ZSh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptX21zZzFfc2NhbihaTV9MVl8xLCAiZmxhZ0ZyZXFDaGFuZ2luZz0iLCB3ZC0+c3RhLmZsYWdGcmVxQ2hhbmdpbmcpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAvL3dkLT5zdGEuZmxhZ0ZyZXFDaGFuZ2luZyA9IDA7CisgICAgaWYgKCB3ZC0+c3RhLmZsYWdGcmVxQ2hhbmdpbmcgIT0gMCApCisgICAgeworICAgICAgICB3ZC0+c3RhLmZsYWdGcmVxQ2hhbmdpbmctLTsKKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgemZSZW1vdmVGcmVxQ2hhbmdlUmVxKGRldik7CisKKyAgICB6ZlB1c2hWdHhxKGRldik7CisgICAgcmV0dXJuOworfQorCit2b2lkIHpmUmVTZXRDdXJyZW50RnJlcXVlbmN5KHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptX2RlYnVnX21zZzAoIkl0IGlzIGhhcHBlbiEhISBObyBlcnJvciBtZXNzYWdlIik7CisKKyAgICB6ZkNvcmVTZXRGcmVxdWVuY3lFeFYyKGRldiwgd2QtPmZyZXF1ZW5jeSwgMCwgMCwgTlVMTCwgMSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvbGVkbWdyLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvbGVkbWdyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUxMDRhOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9sZWRtZ3IuYwpAQCAtMCwwICsxLDU1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJjcHJlY29tcC5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZMZWRDdHJsVHlwZTEgICAgICAgICAgICAgICovCisvKiAgICAgIFRyYWRpdGlvbmFsIHNpbmdsZS1MRUQgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjYgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLyBiaXQgMTUtMTIgOiBUb2ZmIGZvciBTY2FuIHN0YXRlCisvLyAgICAgMTEtOCA6IFRvbiBmb3IgU2NhbiBzdGF0ZQorLy8gICAgIDcgOiBSZXNlcnZlZAorLy8gICAgIDYgOiBtb2RlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgYml0IDYgPSAwCisvLyAgICAgNS00IDogQ29ubmVjdCBzdGF0ZQorLy8gICAgICAgICAgIDAwID0+IGFsd2F5cyBvZmYKKy8vICAgICAgICAgICAwMSA9PiBhbHdheXMgb24KKy8vICAgICAgICAgICAxMCA9PiBJZGxlIG9mZiwgYWNpdHZlIG9uCisvLyAgICAgICAgICAgMTEgPT4gSWRsZSBvbiwgYWN0aXZlIG9mZgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgIGJpdCA2ID0gMQorLy8gICAgIDUtNCA6IGZyZXEKKy8vICAgICAgICAgICAwMCA9PiAxSHoKKy8vICAgICAgICAgICAwMSA9PiAwLjVIegorLy8gICAgICAgICAgIDEwID0+IDAuMjVIegorLy8gICAgICAgICAgIDExID0+IDAuMTI1SHoKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAzIDogUG93ZXIgc2F2ZSBzdGF0ZQorLy8gICAgICAgICAwID0+IGFsd2F5cyBvZmYgaW4gcG93ZXIgc2F2ZSBzdGF0ZQorLy8gICAgICAgICAxID0+IHdvcmtzIGFzIGNvbm5lY3Qgc3RhdGUKKy8vICAgICAyIDogRGlzYWJsZSBzdGF0ZQorLy8gICAgIDEgOiBSZXNlcnZlZAorLy8gICAgIDAgOiBQb3dlci1vbiBzdGF0ZQordm9pZCB6ZkxlZEN0cmxUeXBlMSh6ZGV2X3QqIGRldikKK3sKKyAgICB1MTZfdCBpOworICAgIHUzMl90IHRvbiwgdG9mZiwgdG1wLCBwZXJpb2Q7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgZm9yIChpPTA7IGk8Wk1fTUFYX0xFRF9OVU1CRVI7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh6ZlN0YUlzQ29ubmVjdGVkKGRldikgIT0gVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgLy9TY2FuIHN0YXRlCisgICAgICAgICAgICB0b24gPSAoKHdkLT5sZWRTdHJ1Y3QubGVkTW9kZVtpXSAmIDB4ZjAwKSA+PiA4KSAqIDU7CisgICAgICAgICAgICB0b2ZmID0gKCh3ZC0+bGVkU3RydWN0LmxlZE1vZGVbaV0gJiAweGYwMDApID4+IDEyKSAqIDU7CisKKyAgICAgICAgICAgIGlmICgodG9uICsgdG9mZikgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bXAgPSB3ZC0+bGVkU3RydWN0LmNvdW50ZXIgLyAodG9uK3RvZmYpOworICAgICAgICAgICAgICAgIHRtcCA9IHdkLT5sZWRTdHJ1Y3QuY291bnRlciAtICh0bXAgKiAodG9uK3RvZmYpKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wIDwgdG9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCBpLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCBpLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHpmUG93ZXJTYXZpbmdNZ3JJc1NsZWVwaW5nKGRldikpICYmICgod2QtPmxlZFN0cnVjdC5sZWRNb2RlW2ldICYgMHg4KSA9PSAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIGksIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vQ29ubmVjdCBzdGF0ZQorICAgICAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC5sZWRNb2RlW2ldICYgMHg0MCkgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC5jb3VudGVyICYgMSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCBpLCAod2QtPmxlZFN0cnVjdC5sZWRNb2RlW2ldICYgMHgxMCkgPj4gNCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHdkLT5sZWRTdHJ1Y3QudHhUcmFmZmljID4gMCkgfHwgKHdkLT5sZWRTdHJ1Y3QucnhUcmFmZmljID4gMCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2QtPmxlZFN0cnVjdC50eFRyYWZmaWMgPSB3ZC0+bGVkU3RydWN0LnJ4VHJhZmZpYyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh3ZC0+bGVkU3RydWN0LmxlZE1vZGVbaV0gJiAweDIwKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCBpLCAoKHdkLT5sZWRTdHJ1Y3QubGVkTW9kZVtpXSAmIDB4MTApID4+IDQpXjEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0vLyBpZiAoKHdkLT5sZWRTdHJ1Y3QubGVkTW9kZVtpXSAmIDB4NDApID09IDApCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGVyaW9kID0gNSAqICgxIDw8ICgod2QtPmxlZFN0cnVjdC5sZWRNb2RlW2ldICYgMHgzMCkgPj4gNCkpOworICAgICAgICAgICAgICAgICAgICB0bXAgPSB3ZC0+bGVkU3RydWN0LmNvdW50ZXIgLyAocGVyaW9kKjIpOworICAgICAgICAgICAgICAgICAgICB0bXAgPSB3ZC0+bGVkU3RydWN0LmNvdW50ZXIgLSAodG1wICogKHBlcmlvZCoyKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPCBwZXJpb2QpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC5jb3VudGVyICYgMSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIGksIDApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC50eFRyYWZmaWMgPiAwKSB8fCAod2QtPmxlZFN0cnVjdC5yeFRyYWZmaWMgPiAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5sZWRTdHJ1Y3QudHhUcmFmZmljID0gd2QtPmxlZFN0cnVjdC5yeFRyYWZmaWMgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIGksIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC5jb3VudGVyICYgMSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIGksIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC50eFRyYWZmaWMgPiAwKSB8fCAod2QtPmxlZFN0cnVjdC5yeFRyYWZmaWMgPiAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5sZWRTdHJ1Y3QudHhUcmFmZmljID0gd2QtPmxlZFN0cnVjdC5yeFRyYWZmaWMgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIGksIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gLy9lbHNlLCBpZiAoKHdkLT5sZWRTdHJ1Y3QubGVkTW9kZVtpXSAmIDB4NDApID09IDApCisgICAgICAgICAgICB9IC8vZWxzZSwgaWYgKHpmUG93ZXJTYXZpbmdNZ3JJc1NsZWVwaW5nKGRldikpCisgICAgICAgIH0gLy9lbHNlIDogaWYgKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSAhPSBUUlVFKQorICAgIH0gLy9mb3IgKGk9MDsgaTxaTV9NQVhfTEVEX05VTUJFUjsgaSsrKQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZMZWRDdHJsVHlwZTIgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEN1c3RvbWl6ZSBmb3IgTmV0Z2VhciBEdWFsLUxFRCBzdGF0ZSAoKGJ1ZyMzMTI5MikpICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMS4gU3RhdHVzOiAgV2hlbiBkb25nbGUgZG9lcyBub3QgY29ubmVjdCB0byAyLjRHIG9yIDVHIGJ1dCBpbiBzaXRlICAgICovCisvKiAgICAgICAgICAgICAgICAgIHN1cnZleS9hc3NvY2lhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICBMRUQgc3RhdHVzOiBTbG93IGJsaW5raW5nLCBBbWJlciB0aGVuIEJsdWUgcGVyIDUwMG1zICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMi4gU3RhdHVzOglDb25uZWN0aW9uIGF0IDIuNEcgaW4gc2l0ZSBzdXJ2ZXkvYXNzb2NpYXRpb24gICAgICAgICAgICAgKi8KKy8qICAgICAgICAgTEVEIHN0YXR1czogU2xvdyBibGlua2luZywgQW1iZXIvb2ZmIHBlciA1MDBtcyAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDMuIFN0YXR1czoJQ29ubmVjdGlvbiBhdCA1RyBpbiBzaXRlIHN1cnZleS9hc3NvY2lhdGlvbiAgICAgICAgICAgICAgICovCisvKiAgICAgICAgIExFRCBzdGF0dXM6IFNsb3cgYmxpbmtpbmcsIEJsdWUvb2ZmIHBlciA1MDBtcyAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICA0LiBTdGF0dXM6CVdoZW4gdHJhbnNmZXIgdGhlIHBhY2tldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICBMRUQgc3RhdHVzOiBCbGluayBwZXIgcGFja2V0LCBpbmNsdWRpbmcgVFggYW5kIFJYICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgNS4gU3RhdHVzOglXaGVuIGxpbmtpbmcgaXMgZXN0YWJsaXNoZWQgYnV0IG5vIHRyYWZmaWMgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgTEVEIHN0YXR1czogQWx3YXlzIG9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDYuIFN0YXR1czoJV2hlbiBsaW5raW5nIGlzIGRyb3BwZWQgYnV0IG5vIHJlLWNvbm5lY3Rpb24gICAgICAgICAgICAgICovCisvKiAgICAgICAgIExFRCBzdGF0dXM6IEFsd2F5cyBvZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICA3LiBTdGF0dXM6CUZyb20gb25lIGNvbm5lY3Rpb24oMi40RyBvciA1RykgdG8gY2hhbmdlIHRvIGFub3RoZXIgYmFuZCAqLworLyogICAgICAgICBMRUQgc3RhdHVzOiBBbWJlci9CbHVlID0+U2xvdyBibGlua2luZywgQW1iZXIgdGhlbiBCbHVlIHBlciA1MDBtcyAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTaGFuZy1DaHVuIExpdSAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjExICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB6ZkxlZEN0cmxUeXBlMl9zY2FuKHpkZXZfdCogZGV2KTsKKwordm9pZCB6ZkxlZEN0cmxUeXBlMih6ZGV2X3QqIGRldikKK3sKKyAgICB1MzJfdCB0b24sIHRvZmYsIHRtcCwgcGVyaW9kOworICAgIHUxNl90IE9wZXJhdGVMRUQ7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSAhPSBUUlVFKQorICAgIHsKKyAgICAgICAgLy8gRGlzY29ubmVjdCBzdGF0ZQorICAgICAgICBpZih3ZC0+bGVkU3RydWN0LmNvdW50ZXIgJSA0ICE9IDApCisgICAgCXsKKyAgICAgIAkgICAgLy8gVXBkYXRlIExFRCBlYWNoIDQwMG1zKDQqMTAwKQorICAgICAgCSAgICAvLyBQcmV2ZW50IHRoaXMgc2l0dWF0aW9uCisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgX19fX19fXyAgICAgICAgIF9fXworICAgICAgICAgICAgLy8gTEVEWzBdIE9OICAgfCAgICAgICB8ICAgICAgIHwgeCB8CisgICAgICAgICAgICAvLyAtLS0tLS0gT0ZGLT4rLSstKy0rLSstKy0rLSstKy0rLSstKy0+Pj4uLi4KKyAgICAgICAgICAgIC8vIExFRFsxXSBPTgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoKHdkLT5zdGF0ZSA9PSBaTV9XTEFOX1NUQVRFX0RJU0FCTEVEKSAmJiAod2QtPnN0YS5iQ2hhbm5lbFNjYW4pKQorICAgICAgICAgICAgfHwgKCh3ZC0+c3RhdGUgIT0gWk1fV0xBTl9TVEFURV9ESVNBQkxFRCkgJiYgKHdkLT5zdGEuYkF1dG9SZWNvbm5lY3QpKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gU2Nhbi9BdXRvUmVjb25uZWN0IHN0YXRlCisgICAgICAgICAgICB6ZkxlZEN0cmxUeXBlMl9zY2FuKGRldik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBOZWl0aGVyIENvbm5lY3RlZCBub3IgU2NhbgorICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAwLCAwKTsKKyAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMSwgMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoIHdkLT5zdGEuYkNoYW5uZWxTY2FuICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gU2NhbiBzdGF0ZQorICAgICAgICAgICAgaWYod2QtPmxlZFN0cnVjdC5jb3VudGVyICUgNCAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIHpmTGVkQ3RybFR5cGUyX3NjYW4oZGV2KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHdkLT5mcmVxdWVuY3kgPCAzMDAwKQorICAgICAgICB7CisgICAgICAgICAgICBPcGVyYXRlTEVEID0gMDsgICAgIC8vIExFRFswXTogd29yayBvbiAyLjRHIChiL2cgYmFuZCkKKyAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMSwgMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBPcGVyYXRlTEVEID0gMTsgICAgIC8vIExFRFsxXTogd29yayBvbiA1RyAoYSBiYW5kKQorICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAwLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoemZQb3dlclNhdmluZ01ncklzU2xlZXBpbmcoZGV2KSkgJiYgKCh3ZC0+bGVkU3RydWN0LmxlZE1vZGVbT3BlcmF0ZUxFRF0gJiAweDgpID09IDApKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBJZiBTbGVlcGluZywgdHVybiBPRkYKKyAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgT3BlcmF0ZUxFRCwgMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvL0Nvbm5lY3Qgc3RhdGUKKyAgICAgICAgICAgIGlmICgod2QtPmxlZFN0cnVjdC5jb3VudGVyICYgMSkgPT0gMCkgICAvLyBldmVuCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gTm8gdHJhZmZpYywgYWx3YXlzIE9OCisgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCBPcGVyYXRlTEVELCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgICAgICAgLy8gb2RkCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh3ZC0+bGVkU3RydWN0LnR4VHJhZmZpYyA+IDApIHx8ICh3ZC0+bGVkU3RydWN0LnJ4VHJhZmZpYyA+IDApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgaGF2ZSB0cmFmZmljLCB0dXJuIE9GRgorCQkgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICBfX19fXyAgIF8gICBfICAgXyAgIF9fX19fCisJCSAgICAgICAgICAgIC8vIExFRFtPcGVyYXRlXSBPTiAgICAgICAgfCB8IHwgfCB8IHwgfCB8CisJCSAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLSBPRkYtPi0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLT4+Pi4uLgorCQkgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICB3ZC0+bGVkU3RydWN0LnR4VHJhZmZpYyA9IHdkLT5sZWRTdHJ1Y3QucnhUcmFmZmljID0gMDsKKyAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCBPcGVyYXRlTEVELCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgemZMZWRDdHJsVHlwZTJfc2Nhbih6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvLyBXaGVuIGRvaW5nIHNjYW4sIGJsaW5rKEFtYmVyL0JsdWUpIGFuZCBvZmYgcGVyIDUwMG1zIChhYm91dCA0MDBtcyBpbiBvdXIgZHJpdmVyKQorICAgIC8vICAgICAgICAgICAgICAgX19fX19fXyAgICAgICAgICAgICAgICAgICAgICAgICBfX19fX19fCisgICAgLy8gTEVEWzBdIE9OICAgIHwgICAgICAgfCAgICAgICA4ICAgICAgIDEyICAgICAgfCAgICAgICB8CisgICAgLy8gLS0tLS0tIE9GRi0+LSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLT4+Pi4uLgorICAgIC8vIExFRFsxXSBPTiAgICAwICAgICAgIDQgICAgICAgfF9fX19fX198ICAgICAgIDAgICAgICAgMworICAgIC8vCisKKyAgICBzd2l0Y2god2QtPmxlZFN0cnVjdC5jb3VudGVyICUgMTYpCisgICAgeworICAgICAgICBjYXNlIDA6ICAgLy8gY2FzZSAwfjMsIExFRFswXSBvbgorICAgICAgICAgICAgaWYod2QtPnN1cHBvcnRNb2RlICYgWk1fV0lSRUxFU1NfTU9ERV8yNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDAsIDEpOworICAgICAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMSwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAxLCAxKTsKKyAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDAsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA4OiAgIC8vIGNhc2UgOH4xMSwgTEVEWzFdIG9uCisgICAgICAgICAgICBpZih3ZC0+c3VwcG9ydE1vZGUgJiBaTV9XSVJFTEVTU19NT0RFXzUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAxLCAxKTsKKyAgICAgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDAsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMCwgMSk7CisgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAxLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6ICAvLyBvdGhlcnMsIGFsbCBvZmYKKyAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMCwgMCk7CisgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDEsIDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkxlZEN0cmxUeXBlMyAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEN1c3RvbWl6ZSBmb3IgTmV0Z2VhciBTaW5nbGUtTEVEIHN0YXRlICgoYnVnIzMyMjQzKSkgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIKFFT2ZmOiB3aGVuIHRoZSBhZGFwdGVyIGlzIGRpc2FibGVkIG9yIGhhc24ndCBzdGFydGVkIHRvIGFzc29jaWF0ZSB3aXRoIEFQICAgICovCisvKiAgICAgICAgIHlldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgoUVPbjogT25jZSBhZHBhdGVyIGFzc29jaWF0ZSB3aXRoIEFQIHN1Y2Nlc3NmdWxseSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICChRVNsb3cgYmxpbmtpbmc6IHdoZW5ldmVyIGFkYXB0ZXJzIGRvIHNpdGUtc3VydmV5IG9yIHRyeSB0byBhc3NvY2lhdGUgd2l0aCBBUCAqLworLyogICAgLSBJZiB0aGVyZSBpcyBhIGNvbm5lY3Rpb24gYWxyZWFkeSwgYW5kIGFkYXB0ZXJzIGRvIHNpdGUtc3VydmV5IG9yICAgICAgICAgICovCisvKiAgICAgIHJlLWFzc29jaWF0ZSBhY3Rpb24sIHRoZSBMRUQgc2hvdWxkIGtlZXAgTEVEIGJhY2tncmFvdWQgYXMgT04sIHRodXMgICAgICAgKi8KKy8qICAgICAgdGhlIGJsaW5raW5nIGJlaGF2aW9yIFNIT1VMRCBiZSBPRkYgKDIwMG1zKSAtIE9OICg4MDBtcykgYW5kIGNvbnRpbnVlIHRoaXMqLworLyogICAgICBjeWNsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAtIElmIHRoZXJlIGlzIG5vIGNvbm5lY3Rpb24geWV0LCBhbmQgYWRhcHRlcnMgc3RhcnQgdG8gZG8gc2l0ZS1zdXJ2ZXkgb3IgICAgKi8KKy8qICAgICAgYXNzb2NpYXRlIGFjdGlvbiwgdGhlIExFRCBzaG91bGQga2VlcCBMRUQgYmFja2dyb3VuZCBhcyBPRkYsIHRodXMgdGhlICAgICAqLworLyogICAgICBibGlua2luZyBiZWhhdmlvciBTSE9VTEQgYmUgT04gKDIwMG1zKSAtIE9GRiAoODAwbXMpIGFuZCBjb250aW51ZSB0aGlzICAgICovCisvKiAgICAgIGN5Y2xlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIC0gRm9yIHRoZSBjYXNlIHRoYXQgYXNzb2NpYXRlIGZhaWwsIGFkcGF0ZXIgc2hvdWxkIGtlZXAgYXNzb2NpYXRpbmcsIGFuZCB0aGUqLworLyogICAgICBMRUQgc2hvdWxkIGFsc28ga2VlcCBzbG93IGJsaW5raW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgoUVRdWljayBibGlua2luZzogdG8gYmxpbmsgT0ZGLU9OIGN5Y2xlIGZvciBlYWNoIHRpbWUgdGhhdCB0cmFmZmljIHBhY2tldCBpcyAgKi8KKy8qICAgIHJlY2VpdmVkIG9yIGlzIHRyYW5zbWl0dGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU2hhbmctQ2h1biBMaXUgICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwOC4wMSAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZMZWRDdHJsVHlwZTNfc2Nhbih6ZGV2X3QqIGRldiwgdTE2X3QgaXNDb25uZWN0KTsKKwordm9pZCB6ZkxlZEN0cmxUeXBlMyh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoemZTdGFJc0Nvbm5lY3RlZChkZXYpICE9IFRSVUUpCisgICAgeworICAgICAgICAvLyBEaXNjb25uZWN0IHN0YXRlCisgICAgICAgIGlmKHdkLT5sZWRTdHJ1Y3QuY291bnRlciAlIDIgIT0gMCkKKyAgICAJeworICAgICAgCSAgICAvLyBVcGRhdGUgTEVEIGVhY2ggMjAwbXMoMioxMDApCisgICAgICAJICAgIC8vIFByZXZlbnQgdGhpcyBzaXR1YXRpb24KKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICBfX18gICAgIF8KKyAgICAgICAgICAgIC8vIExFRFswXSBPTiAgIHwgICB8ICAgfHh8CisgICAgICAgICAgICAvLyAtLS0tLS0gT0ZGLT4rLSstKy0rLSstKy0rLT4+Pi4uLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoKHdkLT5zdGF0ZSA9PSBaTV9XTEFOX1NUQVRFX0RJU0FCTEVEKSAmJiAod2QtPnN0YS5iQ2hhbm5lbFNjYW4pKQorICAgICAgICAgICAgfHwgKCh3ZC0+c3RhdGUgIT0gWk1fV0xBTl9TVEFURV9ESVNBQkxFRCkgJiYgKHdkLT5zdGEuYkF1dG9SZWNvbm5lY3QpKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gU2Nhbi9BdXRvUmVjb25uZWN0IHN0YXRlCisgICAgICAgICAgICB6ZkxlZEN0cmxUeXBlM19zY2FuKGRldiwgMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBOZWl0aGVyIENvbm5lY3RlZCBub3IgU2NhbgorICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAwLCAwKTsKKyAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMSwgMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoIHdkLT5zdGEuYkNoYW5uZWxTY2FuICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gU2NhbiBzdGF0ZQorICAgICAgICAgICAgaWYod2QtPmxlZFN0cnVjdC5jb3VudGVyICUgMiAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIHpmTGVkQ3RybFR5cGUzX3NjYW4oZGV2LCAxKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoemZQb3dlclNhdmluZ01ncklzU2xlZXBpbmcoZGV2KSkgJiYgKCh3ZC0+bGVkU3RydWN0LmxlZE1vZGVbMF0gJiAweDgpID09IDApKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBJZiBTbGVlcGluZywgdHVybiBPRkYKKyAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMCwgMCk7CisgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDEsIDApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy9Db25uZWN0IHN0YXRlCisgICAgICAgICAgICBpZiAoKHdkLT5sZWRTdHJ1Y3QuY291bnRlciAmIDEpID09IDApICAgLy8gZXZlbgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIE5vIHRyYWZmaWMsIGFsd2F5cyBPTgorICAgICAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMCwgMSk7CisgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAxLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgICAgICAgLy8gb2RkCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh3ZC0+bGVkU3RydWN0LnR4VHJhZmZpYyA+IDApIHx8ICh3ZC0+bGVkU3RydWN0LnJ4VHJhZmZpYyA+IDApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgaGF2ZSB0cmFmZmljLCB0dXJuIE9GRgorCQkgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICBfX19fXyAgIF8gICBfICAgXyAgIF9fX19fCisJCSAgICAgICAgICAgIC8vIExFRFtPcGVyYXRlXSBPTiAgICAgICAgfCB8IHwgfCB8IHwgfCB8CisJCSAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLSBPRkYtPi0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLT4+Pi4uLgorCQkgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICB3ZC0+bGVkU3RydWN0LnR4VHJhZmZpYyA9IHdkLT5sZWRTdHJ1Y3QucnhUcmFmZmljID0gMDsKKyAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAxLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgemZMZWRDdHJsVHlwZTNfc2Nhbih6ZGV2X3QqIGRldiwgdTE2X3QgaXNDb25uZWN0KQoreworICAgIHUzMl90IHRvbiwgdG9mZiwgdG1wOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8vIERvaW5nIHNjYW4gd2hlbiA6CisgICAgLy8gMS4gRGlzY29ubmVjdGVkOiBPTiAoMjAwbXMpIC0gT0ZGICg4MDBtcykgKDIwMG1zLTYwMG1zIGluIG91ciBkcml2ZXIpCisgICAgLy8gICAgICAgICAgICAgICBfX18gICAgICAgICAgICAgX19fICAgICAgICAgICAgIF9fXworICAgIC8vIExFRFswXSBPTiAgICB8ICAgfCAgICAgICAgICAgfCAgIHwgICAgICAgICAgIHwgICB8CisgICAgLy8gLS0tLS0tIE9GRi0+LSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0+Pj4uLi4KKyAgICAvLyAgICAgICAgICAgICAgMCAgIDIgICA0ICAgNiAgIDggIDEwICAxMiAgMTQgIDE2CisgICAgLy8gMi4gQ29ubmVjdGVkOiAgIE9OICg4MDBtcykgLSBPRkYgKDIwMG1zKSAoNjAwbXMtMjAwbXMgaW4gb3VyIGRyaXZlcikKKyAgICAvLyAgICAgICAgICAgICAgIF9fX19fX19fX19fICAgICBfX19fX19fX19fXyAgICAgX19fX19fCisgICAgLy8gTEVEWzBdIE9OICAgIHwgICAgICAgICAgIHwgICB8ICAgICAgICAgICB8ICAgfAorICAgIC8vIC0tLS0tLSBPRkYtPi0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstPj4+Li4uCisgICAgLy8gICAgICAgICAgICAgIDAgICAyICAgNCAgIDYgICA4ICAxMCAgMTIgIDE0ICAxNgorCisgICAgLy9TY2FuIHN0YXRlCisgICAgaWYoIWlzQ29ubmVjdCkKKyAgICAgICAgdG9uID0gMiwgdG9mZiA9IDY7CisgICAgZWxzZQorICAgICAgICB0b24gPSA2LCB0b2ZmID0gMjsKKworICAgIGlmICgodG9uICsgdG9mZikgIT0gMCkKKyAgICB7CisgICAgICAgIHRtcCA9IHdkLT5sZWRTdHJ1Y3QuY291bnRlciAlICh0b24rdG9mZik7CisgICAgICAgaWYgKHRtcCA8IHRvbikKKyAgICAgICAgeworICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAwLCAxKTsKKyAgICAgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMSwgMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDAsIDApOworICAgICAgICAgICAgemZIcExlZEN0cmwoZGV2LCAxLCAwKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmTGVkQ3RybF9CbGlua1doZW5TY2FuX0FscGhhICAgICAqLworLyogICAgICBDdXN0b21pemUgZm9yIEFscGhhL0RMaW5rIExFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgLSBCbGluayBMRUQgMTIgdGltZXMgd2l0aGluIDMgc2Vjb25kcyB3aGVuIGRvaW5nIEFjdGl2ZSBTY2FuICAgICAgICAgICovCisvKgkgICAgICAgICAgICAgICAgICAgICAgX19fICAgX19fICAgX19fICAgX19fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKgkgICAgICBMRURbMF0gT04gICAgICB8ICAgfCB8ICAgfCB8ICAgfCB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKgkgICAgICAtLS0tLS0tT0ZGLT4tKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0tKy0tPj4+Li4uICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU2hhbmctQ2h1biBMaXUgICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNy4xMSAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZMZWRDdHJsX0JsaW5rV2hlblNjYW5fQWxwaGEoemRldl90KiBkZXYpCit7CisgICAgc3RhdGljIHUzMl90IGNvdW50ZXIgPSAwOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGlmKGNvdW50ZXIgPiAzNCkgICAgICAgIC8vIGNvdW50ZXIgZm9yIDMgc2VjCisgICAgeworICAgICAgICB3ZC0+bGVkU3RydWN0LkxFREN0cmxGbGFnICY9IH4odThfdClaTV9MRURfQ1RSTF9GTEFHX0FMUEhBOworICAgICAgICBjb3VudGVyID0gMDsKKyAgICB9CisKKyAgICBpZiggKGNvdW50ZXIgJSAzKSA8IDIpCisgICAgICAgIHpmSHBMZWRDdHJsKGRldiwgMCwgMSk7CisgICAgZWxzZQorICAgICAgICB6ZkhwTGVkQ3RybChkZXYsIDAsIDApOworCisgICAgY291bnRlcisrOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkxlZDEwMG1zQ3RybCAgICAgICAgICAgICAgKi8KKy8qICAgICAgTEVEIDEwMCBtaWxsaXNlY29uZHMgdGltZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuNiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZMZWQxMDBtc0N0cmwoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgd2QtPmxlZFN0cnVjdC5jb3VudGVyKys7CisKKyAgICBpZih3ZC0+bGVkU3RydWN0LkxFREN0cmxGbGFnKQorICAgIHsKKyAgICAgICAgc3dpdGNoKHdkLT5sZWRTdHJ1Y3QuTEVEQ3RybEZsYWcpIHsKKyAgICAgICAgY2FzZSBaTV9MRURfQ1RSTF9GTEFHX0FMUEhBOgorICAgICAgICAgICAgemZMZWRDdHJsX0JsaW5rV2hlblNjYW5fQWxwaGEoZGV2KTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3dpdGNoKHdkLT5sZWRTdHJ1Y3QuTEVEQ3RybFR5cGUpIHsKKyAgICAgICAgY2FzZSAxOgkJCS8vIFRyYWRpdGlvbmFsIDEgTEVECisgICAgICAgICAgICB6ZkxlZEN0cmxUeXBlMShkZXYpOworICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDI6CQkJLy8gRHVhbC1MRURzIGZvciBOZXRnZWFyCisgICAgICAgICAgICB6ZkxlZEN0cmxUeXBlMihkZXYpOworICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDM6CQkJLy8gU2luZ2xlLUxFRCBmb3IgTmV0Z2VhciAoV04xMTF2MikKKyAgICAgICAgICAgIHpmTGVkQ3RybFR5cGUzKGRldik7CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB6ZkxlZEN0cmxUeXBlMShkZXYpOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3BlcmZvcm1hbmNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvcGVyZm9ybWFuY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWI0MmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3BlcmZvcm1hbmNlLmMKQEAgLTAsMCArMSw0MzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IHBlcmZvcm1hbmNlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVGhpcyBtb2R1bGUgcGVyZm9ybWFuY2UgZXZhbHVhdGlvbiBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJjcHJlY29tcC5oIgorI2lmZGVmIFpNX0VOQUJMRV9QRVJGT1JNQU5DRV9FVkFMVUFUSU9OCisKKyNkZWZpbmUgWk1fVFBfU0laRSA1MAorc3RydWN0IHpzU3VtbWFyeSB6bV9zdW1tYXJ5Oworc3RydWN0IHpzVmFyaWF0aW9uIHptX3ZhcjsKK3N0cnVjdCB6c1Rocm91Z2hwdXQgem1fdHA7CisKK3ZvaWQgemZpUGVyZm9ybWFuY2VJbml0KHpkZXZfdCogZGV2KQoreworICAgIHUxNl90ICAgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptX3N1bW1hcnkudGlja19iYXNlID0gd2QtPnRpY2s7CisgICAgem1fc3VtbWFyeS50eF9tc2R1X2NvdW50ID0gMDsKKyAgICB6bV9zdW1tYXJ5LnR4X21wZHVfY291bnQgPSAwOworICAgIHptX3N1bW1hcnkucnhfbXNkdV9jb3VudCA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9tcGR1X2NvdW50ID0gMDsKKyAgICB6bV9zdW1tYXJ5LnJ4X2Jyb2tlbl9zZXEgPSAwOworICAgIHptX3N1bW1hcnkucnhfYnJva2VuX3N1bSA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9zZXFfYmFzZSA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9icm9rZW5fc2VxX2RpcyA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9kdXBsaWNhdGVfc2VxID0gMDsKKyAgICB6bV9zdW1tYXJ5LnJ4X29sZF9zZXEgPSAwOworICAgIHptX3N1bW1hcnkucmVzZXRfY291bnQgPSAwOworICAgIHptX3N1bW1hcnkucmVzZXRfc3VtID0gMDsKKyAgICB6bV9zdW1tYXJ5LnJ4X2xvc3Rfc3VtID0gMDsKKyAgICB6bV9zdW1tYXJ5LnJ4X2R1cGxpY2F0ZV9lcnJvciA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9mcmVlID0gMDsKKyAgICB6bV9zdW1tYXJ5LnJ4X2Ftc2R1X2xlbiA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9mbHVzaCA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9jbGVhciA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9yZW9yZGVyID0gMDsKKworICAgIGZvciAoaT0wOyBpPDEwMDsgaSsrKQorICAgIHsKKyAgICAgICAgem1fdmFyLnR4X21zZHVfdGlja1tpXSA9IHptX3Zhci50eF9tcGR1X3RpY2tbaV0gPSAwOworICAgICAgICB6bV92YXIucnhfbXNkdV90aWNrW2ldID0gem1fdmFyLnJ4X21wZHVfdGlja1tpXSA9IDA7CisgICAgfQorCisgICAgemZUaW1lclNjaGVkdWxlKGRldiwgWk1fRVZFTlRfVElNRU9VVF9QRVJGT1JNQU5DRSwgMTAwKTsKKworICAgIHptX3RwLnNpemUgPSBaTV9UUF9TSVpFOworICAgIHptX3RwLmhlYWQgPSB6bV90cC5zaXplIC0gMTsKKyAgICB6bV90cC50YWlsID0gMDsKKyAgICBmb3IgKGk9MDsgaTx6bV90cC5zaXplOyBpKyspCisgICAgeworICAgICAgICB6bV90cC50eFtpXT0wOworICAgICAgICB6bV90cC5yeFtpXT0wOworICAgIH0KK30KKwordm9pZCB6ZmlQZXJmb3JtYW5jZUdyYXBoKHpkZXZfdCogZGV2KQoreworICAgIHMxNl90ICAgaSxqOworICAgIHU4X3QgICAgc1taTV9UUF9TSVpFKzVdOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGZvciAoaT0wOyBpPCh6bV90cC5zaXplLTEpOyBpKyspCisgICAgeworICAgICAgICB6bV90cC50eFtpXSA9IHptX3RwLnR4W2krMV07CisgICAgICAgIHptX3RwLnJ4W2ldID0gem1fdHAucnhbaSsxXTsKKyAgICB9CisgICAgem1fdHAudHhbem1fdHAuc2l6ZS0xXSA9IHptX3N1bW1hcnkudHhfbXBkdV9jb3VudCoxNTAwKjgvMTAwMDAwMDsKKyAgICB6bV90cC5yeFt6bV90cC5zaXplLTFdID0gem1fc3VtbWFyeS5yeF9tc2R1X2NvdW50KjE1MDAqOC8xMDAwMDAwOworCisgICAgZm9yIChpPTE1OyBpPjA7IGktLSkKKyAgICB7CisgICAgICAgIHNbMF0gPSAoaS8xMCkgKyAnMCc7CisgICAgICAgIHNbMV0gPSAoaSUxMCkgKyAnMCc7CisgICAgICAgIHNbMl0gPSAnMCc7CisgICAgICAgIHNbM10gPSAnfCc7CisgICAgICAgIGZvciAoaj0wOyBqPHptX3RwLnNpemU7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCh6bV90cC50eFtqXS8xMCA9PSBpKSAmJiAoem1fdHAucnhbal0vMTAgPT0gaSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc1s0K2pdID0gJ1gnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoem1fdHAudHhbal0vMTAgPT0gaSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzWzQral0gPSAnVCc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh6bV90cC5yeFtqXS8xMCA9PSBpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNbNCtqXSA9ICdSJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzWzQral0gPSAnICc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc1t6bV90cC5zaXplKzRdID0gJ1wwJzsKKyAgICAgICAgRGJnUHJpbnQoIiVzIixzKTsKKyAgICB9CisgICAgRGJnUHJpbnQoIjAwMHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyIpOworCit9CisKKwordm9pZCB6ZmlQZXJmb3JtYW5jZVJlZnJlc2goemRldl90KiBkZXYpCit7CisgICAgdTE2X3QgICBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgemZpRGJnUmVhZFJlZyhkZXYsIDB4MTE3NzJjKTsKKworICAgIHptX3Zhci50eF9tc2R1X21lYW4gPSB6bV9zdW1tYXJ5LnR4X21zZHVfY291bnQgLyAxMDA7CisgICAgem1fdmFyLnR4X21wZHVfbWVhbiA9IHptX3N1bW1hcnkudHhfbXBkdV9jb3VudCAvIDEwMDsKKyAgICB6bV92YXIucnhfbXNkdV9tZWFuID0gem1fc3VtbWFyeS5yeF9tc2R1X2NvdW50IC8gMTAwOworICAgIHptX3Zhci5yeF9tcGR1X21lYW4gPSB6bV9zdW1tYXJ5LnJ4X21wZHVfY291bnQgLyAxMDA7CisKKyAgICB6bV92YXIudHhfbXNkdV9zdW0gPSB6bV92YXIudHhfbXBkdV9zdW0gPSAwOworICAgIHptX3Zhci5yeF9tc2R1X3N1bSA9IHptX3Zhci5yeF9tcGR1X3N1bSA9IDA7CisgICAgem1fc3VtbWFyeS50eF9pZGxlX2NvdW50ID0gem1fc3VtbWFyeS5yeF9pZGxlX2NvdW50ID0gMDsKKyAgICBmb3IgKGk9MDsgaTwxMDA7IGkrKykKKyAgICB7CisgICAgICAgIHptX3Zhci50eF9tc2R1X3N1bSArPSAoem1fdmFyLnR4X21zZHVfdGlja1tpXSAqIHptX3Zhci50eF9tc2R1X3RpY2tbaV0pOworICAgICAgICB6bV92YXIudHhfbXBkdV9zdW0gKz0gKHptX3Zhci50eF9tcGR1X3RpY2tbaV0gKiB6bV92YXIudHhfbXBkdV90aWNrW2ldKTsKKyAgICAgICAgem1fdmFyLnJ4X21zZHVfc3VtICs9ICh6bV92YXIucnhfbXNkdV90aWNrW2ldICogem1fdmFyLnJ4X21zZHVfdGlja1tpXSk7CisgICAgICAgIHptX3Zhci5yeF9tcGR1X3N1bSArPSAoem1fdmFyLnJ4X21wZHVfdGlja1tpXSAqIHptX3Zhci5yeF9tcGR1X3RpY2tbaV0pOworCisgICAgICAgIGlmICghem1fdmFyLnR4X21wZHVfdGlja1tpXSkgem1fc3VtbWFyeS50eF9pZGxlX2NvdW50Kys7CisgICAgICAgIGlmICghem1fdmFyLnJ4X21wZHVfdGlja1tpXSkgem1fc3VtbWFyeS5yeF9pZGxlX2NvdW50Kys7CisgICAgfQorICAgIHptX3Zhci50eF9tc2R1X3ZhciA9ICh6bV92YXIudHhfbXNkdV9zdW0gLyAxMDApIC0gKHptX3Zhci50eF9tc2R1X21lYW4gKiB6bV92YXIudHhfbXNkdV9tZWFuKTsKKyAgICB6bV92YXIudHhfbXBkdV92YXIgPSAoem1fdmFyLnR4X21wZHVfc3VtIC8gMTAwKSAtICh6bV92YXIudHhfbXBkdV9tZWFuICogem1fdmFyLnR4X21wZHVfbWVhbik7CisgICAgem1fdmFyLnJ4X21zZHVfdmFyID0gKHptX3Zhci5yeF9tc2R1X3N1bSAvIDEwMCkgLSAoem1fdmFyLnJ4X21zZHVfbWVhbiAqIHptX3Zhci5yeF9tc2R1X21lYW4pOworICAgIHptX3Zhci5yeF9tcGR1X3ZhciA9ICh6bV92YXIucnhfbXBkdV9zdW0gLyAxMDApIC0gKHptX3Zhci5yeF9tcGR1X21lYW4gKiB6bV92YXIucnhfbXBkdV9tZWFuKTsKKworICAgIHptX3N1bW1hcnkudGlja19iYXNlID0gd2QtPnRpY2s7CisgICAgem1fc3VtbWFyeS5yeF9icm9rZW5fc3VtICs9IHptX3N1bW1hcnkucnhfYnJva2VuX3NlcTsKKyAgICB6bV9zdW1tYXJ5LnJ4X2xvc3Rfc3VtICs9ICh6bV9zdW1tYXJ5LnJ4X2Jyb2tlbl9zZXEgLSB6bV9zdW1tYXJ5LnJ4X2R1cGxpY2F0ZV9zZXEgLSB6bV9zdW1tYXJ5LnJ4X29sZF9zZXEpOworCisgICAgemZpUGVyZm9ybWFuY2VHcmFwaChkZXYpOworCisgICAgRGJnUHJpbnQoIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CisgICAgRGJnUHJpbnQoIiogVFg6IE1TRFU9JTVkLCBWQVI9JTVkOyBNUERVPSU1ZCwgVkFSPSU1ZFxuIiwgem1fc3VtbWFyeS50eF9tc2R1X2NvdW50LAorICAgICAgICB6bV92YXIudHhfbXNkdV92YXIsIHptX3N1bW1hcnkudHhfbXBkdV9jb3VudCwgem1fdmFyLnR4X21wZHVfdmFyKTsKKyAgICBEYmdQcmludCgiKiBUWDogaWRsZT0lNWQsVHhSYXRlPSUzZCwgIFBFUj0lNWRcbiIsIHptX3N1bW1hcnkudHhfaWRsZV9jb3VudCwKKyAgICAgICAgd2QtPkN1cnJlbnRUeFJhdGVLYnBzLzEwMDAsCisgICAgICAgICh1MTZfdCl3ZC0+UEVSW3dkLT5zdGEub3Bwb3NpdGVJbmZvWzBdLnJjQ2VsbC5jdXJyZW50UmF0ZV0pOworICAgIERiZ1ByaW50KCIqIFJYOiBNU0RVPSU1ZCwgVkFSPSU1ZDsgTVBEVT0lNWQsIFZBUj0lNWRcbiIsIHptX3N1bW1hcnkucnhfbXNkdV9jb3VudCwKKyAgICAgICAgem1fdmFyLnJ4X21zZHVfdmFyLCB6bV9zdW1tYXJ5LnJ4X21wZHVfY291bnQsIHptX3Zhci5yeF9tcGR1X3Zhcik7CisgICAgRGJnUHJpbnQoIiogUlg6IGlkbGU9JTVkLFJ4UmF0ZT0lM2QsQU1TRFU9JTVkXG4iLCB6bV9zdW1tYXJ5LnJ4X2lkbGVfY291bnQsCisgICAgICAgIHdkLT5DdXJyZW50UnhSYXRlS2Jwcy8xMDAwLCB6bV9zdW1tYXJ5LnJ4X2Ftc2R1X2xlbik7CisgICAgRGJnUHJpbnQoIiogUlggYnJva2VuIHNlcT0lNGQsIGRpc3RhbmNlcz0lNGQsIGR1cGxpY2F0ZXM9JTRkXG4iLCB6bV9zdW1tYXJ5LnJ4X2Jyb2tlbl9zZXEsCisgICAgICAgIHptX3N1bW1hcnkucnhfYnJva2VuX3NlcV9kaXMsIHptX3N1bW1hcnkucnhfZHVwbGljYXRlX3NlcSk7CisgICAgRGJnUHJpbnQoIiogUlggICAgb2xkIHNlcT0lNGQsICAgICAgbG9zdD0lNGQsIGJyb2tlbiBzdW09JTRkXG4iLCB6bV9zdW1tYXJ5LnJ4X29sZF9zZXEsCisgICAgICAgICh6bV9zdW1tYXJ5LnJ4X2Jyb2tlbl9zZXEgLSB6bV9zdW1tYXJ5LnJ4X2R1cGxpY2F0ZV9zZXEgLSB6bV9zdW1tYXJ5LnJ4X29sZF9zZXEpLAorICAgICAgICB6bV9zdW1tYXJ5LnJ4X2Jyb2tlbl9zdW0pOworICAgIERiZ1ByaW50KCIqIFJ4ICAgbG9zdCBzdW09JTRkLGR1cC4gZXJyb3I9JTRkLCBmcmVlIGNvdW50PSU0ZFxuIiwgem1fc3VtbWFyeS5yeF9sb3N0X3N1bSwKKyAgICAgICAgem1fc3VtbWFyeS5yeF9kdXBsaWNhdGVfZXJyb3IsIHptX3N1bW1hcnkucnhfZnJlZSk7CisgICAgRGJnUHJpbnQoIiogUnggIGZsdXNoIHN1bT0lNGQsIGNsZWFyIHN1bT0lNGQsIHJlb3JkZXI9JTdkXG4iLCB6bV9zdW1tYXJ5LnJ4X2ZsdXNoLAorICAgICAgICB6bV9zdW1tYXJ5LnJ4X2NsZWFyLCB6bV9zdW1tYXJ5LnJ4X3Jlb3JkZXIpOworICAgIERiZ1ByaW50KCIqIEZpcm13YXJlIHJlc2V0PSUzZCwgcmVzZXQgc3VtPSU0ZFxuIiwgem1fc3VtbWFyeS5yZXNldF9jb3VudCwKKyAgICAgICAgem1fc3VtbWFyeS5yZXNldF9zdW0pOworICAgIERiZ1ByaW50KCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuIik7CisgICAgLy9yZXNldCBjb3VudCAxMTc3MmMKKyAgICB6bV9zdW1tYXJ5LnR4X21zZHVfY291bnQgPSAwOworICAgIHptX3N1bW1hcnkudHhfbXBkdV9jb3VudCA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9tc2R1X2NvdW50ID0gMDsKKyAgICB6bV9zdW1tYXJ5LnJ4X21wZHVfY291bnQgPSAwOworICAgIHptX3N1bW1hcnkucnhfYnJva2VuX3NlcSA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9icm9rZW5fc2VxX2RpcyA9IDA7CisgICAgem1fc3VtbWFyeS5yeF9kdXBsaWNhdGVfc2VxID0gMDsKKyAgICB6bV9zdW1tYXJ5LnJ4X29sZF9zZXEgPSAwOworICAgIHptX3N1bW1hcnkucmVzZXRfY291bnQgPSAwOworICAgIHptX3N1bW1hcnkucnhfYW1zZHVfbGVuID0gMDsKKworICAgIGZvciAoaT0wOyBpPDEwMDsgaSsrKQorICAgIHsKKyAgICAgICAgem1fdmFyLnR4X21zZHVfdGlja1tpXSA9IHptX3Zhci50eF9tcGR1X3RpY2tbaV0gPSAwOworICAgICAgICB6bV92YXIucnhfbXNkdV90aWNrW2ldID0gem1fdmFyLnJ4X21wZHVfdGlja1tpXSA9IDA7CisgICAgfQorCisgICAgemZUaW1lclNjaGVkdWxlKGRldiwgWk1fRVZFTlRfVElNRU9VVF9QRVJGT1JNQU5DRSwgMTAwKTsKK30KKwordm9pZCB6ZmlUeFBlcmZvcm1hbmNlTVNEVSh6ZGV2X3QqIGRldiwgdTMyX3QgdGljaykKK3sKKyAgICB1MzJfdCAgIGluZGV4OworICAgIHptX3N1bW1hcnkudHhfbXNkdV9jb3VudCsrOworCisgICAgaW5kZXggPSB0aWNrIC0gem1fc3VtbWFyeS50aWNrX2Jhc2U7CisKKyAgICBpZiAoaW5kZXggPCAxMDApCisgICAgeworICAgICAgICB6bV92YXIudHhfbXNkdV90aWNrW2luZGV4XSsrOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvL0RiZ1ByaW50KCJ3ZC0+dGljayBleGNlZWRlZCB0aWNrX2Jhc2UrMTAwIVxuIik7CisgICAgfQorfQorCit2b2lkIHpmaVJ4UGVyZm9ybWFuY2VNU0RVKHpkZXZfdCogZGV2LCB1MzJfdCB0aWNrKQoreworICAgIHUzMl90ICAgaW5kZXg7CisgICAgem1fc3VtbWFyeS5yeF9tc2R1X2NvdW50Kys7CisKKyAgICBpbmRleCA9IHRpY2sgLSB6bV9zdW1tYXJ5LnRpY2tfYmFzZTsKKworICAgIGlmIChpbmRleCA8IDEwMCkKKyAgICB7CisgICAgICAgIHptX3Zhci5yeF9tc2R1X3RpY2tbaW5kZXhdKys7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vRGJnUHJpbnQoIndkLT50aWNrIGV4Y2VlZGVkIHRpY2tfYmFzZSsxMDAhXG4iKTsKKyAgICB9Cit9CisKK3ZvaWQgemZpVHhQZXJmb3JtYW5jZU1QRFUoemRldl90KiBkZXYsIHUzMl90IHRpY2spCit7CisgICAgdTMyX3QgICBpbmRleDsKKyAgICB6bV9zdW1tYXJ5LnR4X21wZHVfY291bnQrKzsKKworICAgIGluZGV4ID0gdGljayAtIHptX3N1bW1hcnkudGlja19iYXNlOworCisgICAgaWYgKGluZGV4IDwgMTAwKQorICAgIHsKKyAgICAgICAgem1fdmFyLnR4X21wZHVfdGlja1tpbmRleF0rKzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy9EYmdQcmludCgid2QtPnRpY2sgZXhjZWVkZWQgdGlja19iYXNlKzEwMCFcbiIpOworICAgIH0KK30KKworI2lmbmRlZiBaTV9JTlRfVVNFX0VQMl9IRUFERVJfU0laRQorI2RlZmluZSBaTV9JTlRfVVNFX0VQMl9IRUFERVJfU0laRSAgIDEyCisjZW5kaWYKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZU1QRFUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHUzMl90ICAgaW5kZXg7CisgICAgdTE2X3QgICBmcmFtZVR5cGU7CisgICAgdTE2X3QgICBmcmFtZUN0cmw7CisgICAgdThfdCAgICBtcGR1SW5kOworICAgIHUxNl90ICAgcGxjcEhkckxlbjsKKyAgICB1MTZfdCAgIGxlbjsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworICAgIG1wZHVJbmQgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBsZW4tMSk7CisgICAgLyogRmlyc3QgTVBEVSBvciBTaW5nbGUgTVBEVSAqLworICAgIGlmKCgobXBkdUluZCAmIDB4MzApID09IDB4MDApIHx8ICgobXBkdUluZCAmIDB4MzApID09IDB4MjApKQorICAgIC8vaWYgKChtcGR1SW5kICYgMHgxMCkgPT0gMHgwMCkKKyAgICB7CisgICAgICAgIHBsY3BIZHJMZW4gPSAxMjsgICAgICAgIC8vIFBMQ1AgaGVhZGVyIGxlbmd0aAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNCkgPT0gd2QtPm1hY0FkZHJbMF0gJiYKKyAgICAgICAgICAgIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDYpID09IHdkLT5tYWNBZGRyWzFdICYmCisgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCA4KSA9PSB3ZC0+bWFjQWRkclsyXSkgeworICAgICAgICAgICAgcGxjcEhkckxlbiA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTYpID09IHdkLT5tYWNBZGRyWzBdICYmCisgICAgICAgICAgICAgICAgIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDE4KSA9PSB3ZC0+bWFjQWRkclsxXSAmJgorICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAyMCkgPT0gd2QtPm1hY0FkZHJbMl0peworICAgICAgICAgICAgcGxjcEhkckxlbiA9IDEyOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcGxjcEhkckxlbiA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmcmFtZUN0cmwgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBwbGNwSGRyTGVuICsgMCk7CisgICAgZnJhbWVUeXBlID0gZnJhbWVDdHJsICYgMHhmOworCisgICAgaWYgKGZyYW1lVHlwZSAhPSBaTV9XTEFOX0RBVEFfRlJBTUUpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgem1fc3VtbWFyeS5yeF9tcGR1X2NvdW50Kys7CisKKyAgICBpbmRleCA9IHdkLT50aWNrIC0gem1fc3VtbWFyeS50aWNrX2Jhc2U7CisKKyAgICBpZiAoaW5kZXggPCAxMDApCisgICAgeworICAgICAgICB6bV92YXIucnhfbXBkdV90aWNrW2luZGV4XSsrOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvL0RiZ1ByaW50KCJ3ZC0+dGljayBleGNlZWRlZCB0aWNrX2Jhc2UrMTAwIVxuIik7CisgICAgfQorfQorCit2b2lkIHpmaVJ4UGVyZm9ybWFuY2VTZXEoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHUxNl90ICAgc2VxX25vOworICAgIHUxNl90ICAgb2Zmc2V0ID0gMDsKKyAgICB1MTZfdCAgIG9sZF9kaXMgPSB6bV9zdW1tYXJ5LnJ4X2Jyb2tlbl9zZXFfZGlzOworICAgIC8vc3lzX3RpbWUgPSBLZVF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZmcmVxKTsKKworICAgIHNlcV9ubyA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCsyMikgPj4gNDsKKworICAgIFpNX1NFUV9ERUJVRygiT3V0ICAgJTVkXG4iLCBzZXFfbm8pOworCisgICAgaWYgKHNlcV9ubyA8IHptX3N1bW1hcnkucnhfc2VxX2Jhc2UpCisgICAgeworICAgICAgICBpZiAoc2VxX25vID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh6bV9zdW1tYXJ5LnJ4X3NlcV9iYXNlICE9IDQwOTUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fc3VtbWFyeS5yeF9icm9rZW5fc2VxKys7CisgICAgICAgICAgICAgICAgWk1fU0VRX0RFQlVHKCJCcm9rZW4gc2VxIik7CisgICAgICAgICAgICAgICAgem1fc3VtbWFyeS5yeF9icm9rZW5fc2VxX2Rpcys9KDQwOTYgLSB6bV9zdW1tYXJ5LnJ4X3NlcV9iYXNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoc2VxX25vIDwgMzAwKSAmJiAoem1fc3VtbWFyeS5yeF9zZXFfYmFzZSA+IDM4MDApKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9zdW1tYXJ5LnJ4X2Jyb2tlbl9zZXErKzsKKyAgICAgICAgICAgIFpNX1NFUV9ERUJVRygiQnJva2VuIHNlcSIpOworICAgICAgICAgICAgem1fc3VtbWFyeS5yeF9icm9rZW5fc2VxX2Rpcys9KDQwOTYgLSB6bV9zdW1tYXJ5LnJ4X3NlcV9iYXNlICsgc2VxX25vKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX3N1bW1hcnkucnhfYnJva2VuX3NlcSsrOworICAgICAgICAgICAgWk1fU0VRX0RFQlVHKCJCcm9rZW4gc2VxIik7CisgICAgICAgICAgICB6bV9zdW1tYXJ5LnJ4X2Jyb2tlbl9zZXFfZGlzKz0oem1fc3VtbWFyeS5yeF9zZXFfYmFzZSAtIHNlcV9ubyk7CisgICAgICAgICAgICB6bV9zdW1tYXJ5LnJ4X29sZF9zZXErKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoc2VxX25vICE9ICh6bV9zdW1tYXJ5LnJ4X3NlcV9iYXNlICsgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoc2VxX25vID4gMzgwMCkgJiYgKHptX3N1bW1hcnkucnhfc2VxX2Jhc2UgPCAzMDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHptX3N1bW1hcnkucnhfYnJva2VuX3NlcSsrOworICAgICAgICAgICAgICAgIFpNX1NFUV9ERUJVRygiQnJva2VuIHNlcSIpOworICAgICAgICAgICAgICAgIHptX3N1bW1hcnkucnhfYnJva2VuX3NlcV9kaXMrPSg0MDk2IC0gc2VxX25vICsgem1fc3VtbWFyeS5yeF9zZXFfYmFzZSk7CisgICAgICAgICAgICAgICAgem1fc3VtbWFyeS5yeF9vbGRfc2VxKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fc3VtbWFyeS5yeF9icm9rZW5fc2VxKys7CisgICAgICAgICAgICAgICAgWk1fU0VRX0RFQlVHKCJCcm9rZW4gc2VxIik7CisgICAgICAgICAgICAgICAgem1fc3VtbWFyeS5yeF9icm9rZW5fc2VxX2Rpcys9KHNlcV9ubyAtIHptX3N1bW1hcnkucnhfc2VxX2Jhc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChzZXFfbm8gPT0gem1fc3VtbWFyeS5yeF9zZXFfYmFzZSkKKyAgICB7CisgICAgICAgIHptX3N1bW1hcnkucnhfZHVwbGljYXRlX3NlcSsrOworICAgIH0KKworICAgIGlmICgoem1fc3VtbWFyeS5yeF9icm9rZW5fc2VxX2RpcyAtIG9sZF9kaXMpID4gMTAwKQorICAgIHsKKyAgICAgICAgRGJnUHJpbnQoIiogc2VxX25vPSU0ZCwgYmFzZV9zZXE9JTRkLCBkaXNfZGlmZj0lNGQiLCBzZXFfbm8sCisgICAgICAgICAgICB6bV9zdW1tYXJ5LnJ4X3NlcV9iYXNlLCB6bV9zdW1tYXJ5LnJ4X2Jyb2tlbl9zZXFfZGlzIC0gb2xkX2Rpcyk7CisgICAgfQorICAgIHptX3N1bW1hcnkucnhfc2VxX2Jhc2UgPSBzZXFfbm87Cit9CisKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZVJlZyh6ZGV2X3QqIGRldiwgdTMyX3QgcmVnLCB1MzJfdCByc3ApCit7CisgICAgem1fc3VtbWFyeS5yZXNldF9jb3VudCA9ICh1MTZfdClyc3AgLSB6bV9zdW1tYXJ5LnJlc2V0X3N1bTsKKyAgICB6bV9zdW1tYXJ5LnJlc2V0X3N1bSA9ICh1MTZfdClyc3A7Cit9CisKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZUR1cCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYxLCB6YnVmX3QqIGJ1ZjIpCit7CisgICAgdTE2X3QgICBzZXFfbm8xLCBzZXFfbm8yOworCisgICAgc2VxX25vMSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYxLCAyMikgPj4gNDsKKyAgICBzZXFfbm8yID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZjIsIDIyKSA+PiA0OworICAgIGlmIChzZXFfbm8xICE9IHNlcV9ubzIpCisgICAgeworICAgICAgICB6bV9zdW1tYXJ5LnJ4X2R1cGxpY2F0ZV9lcnJvcisrOworICAgIH0KK30KKwordm9pZCB6ZmlSeFBlcmZvcm1hbmNlRnJlZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgem1fc3VtbWFyeS5yeF9mcmVlKys7Cit9CisKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZUFNU0RVKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgbGVuKQoreworICAgIGlmICh6bV9zdW1tYXJ5LnJ4X2Ftc2R1X2xlbiA8IGxlbikKKyAgICB7CisgICAgICAgIHptX3N1bW1hcnkucnhfYW1zZHVfbGVuID0gbGVuOworICAgIH0KK30KK3ZvaWQgemZpUnhQZXJmb3JtYW5jZUZsdXNoKHpkZXZfdCogZGV2KQoreworICAgIHptX3N1bW1hcnkucnhfZmx1c2grKzsKK30KKwordm9pZCB6ZmlSeFBlcmZvcm1hbmNlQ2xlYXIoemRldl90KiBkZXYpCit7CisgICAgem1fc3VtbWFyeS5yeF9jbGVhcisrOworICAgIFpNX1NFUV9ERUJVRygiUnhDbGVhciIpOworfQorCit2b2lkIHpmaVJ4UGVyZm9ybWFuY2VSZW9yZGVyKHpkZXZfdCogZGV2KQoreworICAgIHptX3N1bW1hcnkucnhfcmVvcmRlcisrOworfQorI2VuZGlmIC8qIGVuZCBvZiBaTV9FTkFCTEVfUEVSRk9STUFOQ0VfRVZBTFVBVElPTiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3BlcmZvcm1hbmNlLmggYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvcGVyZm9ybWFuY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWY2NThhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3BlcmZvcm1hbmNlLmgKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisjaWZuZGVmIF9QRVJGT1JNQU5DRV9ICisjZGVmaW5lIF9QRVJGT1JNQU5DRV9ICisKKyNpZmRlZiBaTV9FTkFCTEVfUEVSRk9STUFOQ0VfRVZBTFVBVElPTgorCitzdHJ1Y3QgenNTdW1tYXJ5Cit7CisgICAgdTMyX3QgdHhfbXNkdV9jb3VudDsKKyAgICB1MzJfdCB0eF9tcGR1X2NvdW50OworICAgIHUzMl90IHJ4X21zZHVfY291bnQ7CisgICAgdTMyX3QgcnhfbXBkdV9jb3VudDsKKyAgICB1MzJfdCB0aWNrX2Jhc2U7CisgICAgdTE2X3Qgcnhfc2VxX2Jhc2U7CisgICAgdTE2X3QgcnhfYnJva2VuX3NlcTsKKyAgICB1MTZfdCByeF9icm9rZW5fc3VtOworICAgIHUxNl90IHJ4X2Jyb2tlbl9zZXFfZGlzOworICAgIHUxNl90IHJ4X2R1cGxpY2F0ZV9zZXE7CisgICAgdTE2X3QgcnhfZHVwbGljYXRlX2Vycm9yOworICAgIHUxNl90IHJ4X29sZF9zZXE7CisgICAgdTE2X3QgcnhfbG9zdF9zdW07CisgICAgdTE2X3QgdHhfaWRsZV9jb3VudDsKKyAgICB1MTZfdCByeF9pZGxlX2NvdW50OworICAgIHUxNl90IHJlc2V0X2NvdW50OworICAgIHUxNl90IHJlc2V0X3N1bTsKKyAgICB1MTZfdCByeF9mcmVlOworICAgIHUxNl90IHJ4X2Ftc2R1X2xlbjsKKyAgICB1MTZfdCByeF9mbHVzaDsKKyAgICB1MTZfdCByeF9jbGVhcjsKKyAgICB1MzJfdCByeF9yZW9yZGVyOworfTsKKworc3RydWN0IHpzVmFyaWF0aW9uCit7CisgICAgdTMyX3QgdHhfbXNkdV90aWNrWzEwMF07CisgICAgdTMyX3QgdHhfbXBkdV90aWNrWzEwMF07CisgICAgdTMyX3QgcnhfbXNkdV90aWNrWzEwMF07CisgICAgdTMyX3QgcnhfbXBkdV90aWNrWzEwMF07CisKKyAgICB1MzJfdCB0eF9tc2R1X21lYW47CisgICAgdTMyX3QgdHhfbXBkdV9tZWFuOworICAgIHUzMl90IHJ4X21zZHVfbWVhbjsKKyAgICB1MzJfdCByeF9tcGR1X21lYW47CisKKyAgICB1MzJfdCB0eF9tc2R1X3N1bTsKKyAgICB1MzJfdCB0eF9tcGR1X3N1bTsKKyAgICB1MzJfdCByeF9tc2R1X3N1bTsKKyAgICB1MzJfdCByeF9tcGR1X3N1bTsKKworICAgIHUzMl90IHR4X21zZHVfdmFyOworICAgIHUzMl90IHR4X21wZHVfdmFyOworICAgIHUzMl90IHJ4X21zZHVfdmFyOworICAgIHUzMl90IHJ4X21wZHVfdmFyOworfTsKKworc3RydWN0IHpzVGhyb3VnaHB1dAoreworICAgIHUzMl90IHR4WzUwXTsKKyAgICB1MzJfdCByeFs1MF07CisgICAgdTE2X3QgaGVhZDsKKyAgICB1MTZfdCB0YWlsOworICAgIHUxNl90IHNpemU7CisgICAgTEFSR0VfSU5URUdFUiBzeXNfdGltZTsKKyAgICBMQVJHRV9JTlRFR0VSIGZyZXE7Cit9OworCit2b2lkIHpmaVBlcmZvcm1hbmNlSW5pdCh6ZGV2X3QqIGRldik7Cit2b2lkIHpmaVBlcmZvcm1hbmNlUmVmcmVzaCh6ZGV2X3QqIGRldik7CisKK3ZvaWQgemZpVHhQZXJmb3JtYW5jZU1TRFUoemRldl90KiBkZXYsIHUzMl90IHRpY2spOwordm9pZCB6ZmlSeFBlcmZvcm1hbmNlTVNEVSh6ZGV2X3QqIGRldiwgdTMyX3QgdGljayk7Cit2b2lkIHpmaVR4UGVyZm9ybWFuY2VNUERVKHpkZXZfdCogZGV2LCB1MzJfdCB0aWNrKTsKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZU1QRFUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZVNlcSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOwordm9pZCB6ZmlSeFBlcmZvcm1hbmNlUmVnKHpkZXZfdCogZGV2LCB1MzJfdCByZWcsIHUzMl90IHJzcCk7Cit2b2lkIHpmaVJ4UGVyZm9ybWFuY2VEdXAoemRldl90KiBkZXYsIHpidWZfdCogYnVmMSwgemJ1Zl90KiBidWYyKTsKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZUZyZWUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZUFNU0RVKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgbGVuKTsKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZUZsdXNoKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZUNsZWFyKHpkZXZfdCogZGV2KTsKK3ZvaWQgemZpUnhQZXJmb3JtYW5jZVJlb3JkZXIoemRldl90KiBkZXYpOworI2VuZGlmIC8qIGVuZCBvZiBaTV9FTkFCTEVfUEVSRk9STUFOQ0VfRVZBTFVBVElPTiAqLworI2VuZGlmIC8qIGVuZCBvZiBfUEVSRk9STUFOQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3B1Yl91c2IuaCBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9wdWJfdXNiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRiNGJkMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9wdWJfdXNiLmgKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9QVUJfVVNCX0gKKyNkZWZpbmUgX1BVQl9VU0JfSAorCisjaW5jbHVkZSAiLi4vb2FsX2R0LmgiCisKKyNkZWZpbmUgWk1fSEFMXzgwMjExX01PREVfQVAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWk1fSEFMXzgwMjExX01PREVfU1RBICAgICAgICAgICAgIDEKKyNkZWZpbmUgWk1fSEFMXzgwMjExX01PREVfSUJTU19HRU5FUkFMICAgIDIKKyNkZWZpbmUgWk1fSEFMXzgwMjExX01PREVfSUJTU19XUEEyUFNLICAgIDMKKworLyogVVNCIG1vZHVsZSBkZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFF1ZXVlIE1hbmFnZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA4MDIxMWNvcmUgcmVxdWlyZXMgT0FMIHRvIGltcGxlbWVudCBhIHRyYW5zbWlzc2lvbiBxdWV1ZSBpbiBPQUwncyAgICAqLworLyogVVNCIG1vZHVsZS4gQmVjYXVzZSB0aGVyZSBpcyBvbmx5IGxpbWl0ZWQgb24tY2hpcCBtZW1vcnksIHNvIFVTQiAgICAgKi8KKy8qIGRhdGEgdHJhbnNmZXIgbWF5IGJlIHBlbmRpbmcgdW50aWwgb24tY2hpcCBtZW1vcnkgaXMgYXZhaWxhYmxlLiAgICAgICovCisvKiA4MDIxMWNvcmUgYWxzbyByZXF1aXJlcyBPQUwncyBVU0IgbW9kdWxlIHRvIHByb3ZpZGUgdHdvIGZ1bmN0aW9ucyAgICAqLworLyogemZ3VXNiR2V0RnJlZVR4UVNpemUoKSBhbmQgemZ3VXNiR2V0TWF4VHhRU2l6ZSgpIGZvciA4MDIxMWNvcmUgdG8gICAgKi8KKy8qIHF1ZXJ5IHRoZSBzdGF0dXMgb2YgdGhpcyB0cmFuc21pc3Npb24gcXVldWUuIFRoZSBtYWluIHB1cnBvc2Ugb2YgICAgICovCisvKiB0aGlzIHF1ZXVlIGlzIGZvciBRb1MvV01NLiBUaG91Z2ggdGhlcmUgYXJlIGhhcmR3YXJlIHByaW9yaXR5ICAgICAgICAqLworLyogcXVldWVzIG9uIHRoZSBjaGlwLCBhbmQgYWxzbyBzb2Z0d2FyZSBwcmlvcml0eSBxdWV1ZXMgaW4gdGhlICAgICAgICAgKi8KKy8qIDgwMjExY29yZS4gVGhlcmUgaXMgc3RpbGwgb25lIGFuZCBvbmx5IG9uZSBVU0IgY2hhbm5lbC4gU28gICAgICAgICAgICovCisvKiA4MDIxMWNvcmUgd2lsbCB1c2UgdGhlIGluZm9ybWF0aW9uIHRoYXQgemZ3VXNiR2V0RnJlZVR4UVNpemUoKSAgICAgICAqLworLyogcmV0dXJuZWQgdG8gc2NoZWR1bGUgdGhlIHRyYWZmaWMgZnJvbSB0aGUgc29mdHdhcmUgcHJpb3JpdHkgICAgICAgICAgKi8KKy8qIHF1ZXVlcyB0byB0aGUgaGFyZHdhcmUgcHJpb3JpdHkgcXVldWVzLiBGb3IgZXhhbXBsZSwgaWYgODAyMTFjb3JlICAgICovCisvKiBmb3VuZCB0aGF0IFVTQiB0cmFuc21pc3Npb24gcXVldWUgaXMgZ29pbmcgdG8gYmUgZnVsbCwgaXQgd2lsbCAgICAgICAqLworLyogbm90IGFsbG93IHBhY2tldHMgd2l0aCBsb3dlciBwcmlvcml0eSB0byBlbnRlciB0aGUgVVNCIGNoYW5uZWwuICAgICAgKi8KKworCisvKiBTdHJ1Y3R1cmUgZm9yIFVTQiBjYWxsIGJhY2sgZnVuY3Rpb25zICovCitzdHJ1Y3QgemZDYlVzYkZ1bmNUYmwgeworICAgIHZvaWQgKCp6ZmNiVXNiUmVjdikoemRldl90ICpkZXYsIHpidWZfdCAqYnVmKTsKKyAgICB2b2lkICgqemZjYlVzYlJlZ0luKSh6ZGV2X3QqIGRldiwgdTMyX3QqIHJzcCwgdTE2X3QgcnNwTGVuKTsKKyAgICB2b2lkICgqemZjYlVzYk91dENvbXBsZXRlKSh6ZGV2X3QqIGRldiwgemJ1Zl90ICpidWYsIHU4X3Qgc3RhdHVzLCB1OF90ICpoZHIpOworICAgIHZvaWQgKCp6ZmNiVXNiUmVnT3V0Q29tcGxldGUpKHpkZXZfdCogZGV2KTsKK307CisKKy8qIENhbGwgYmFjayBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBCZWxvdyBhcmUgdGhlIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBjYWxsZWQgYnkgdGhlIE9BTCAgICAgICAgICAgICAqLworCisvKiBXaGVuIGRhdGEgaXMgYXZhaWxhYmxlIGluIGVuZHBvaW50IDMsIE9BTCBzaGFsbCBlbWJlZCB0aGUgZGF0YSBpbiAqLworLyogemJ1Zl90IGFuZCBzdXBwbHkgdG8gODAyMTFjb3JlIGJ5IGNhbGxpbmcgdGhpcyBmdW5jdGlvbiAgICAgICAgICAgKi8KKy8qIHZvaWQgKCp6ZmNiVXNiUmVjdikoemRldl90ICpkZXYsIHpidWZfdCAqYnVmKTsgKi8KKworLyogV2hlbiBkYXRhIGlzIGF2YWlsYWJsZSBpbiBlbmRwb2ludCAyLCBPQUwgc2hhbGwgY2FsbCB0aGlzIGZ1bmN0aW9uICovCisvKiB2b2lkICgqemZjYlVzYlJlZ0luKSh6ZGV2X3QqIGRldiwgdTMyX3QqIHJzcCwgdTE2X3QgcnNwTGVuKTsgKi8KKworLyogV2hlbiBVU0IgZGF0YSB0cmFuc2ZlciBjb21wbGV0ZWQgaW4gZW5kcG9pbnQgMSwgT0FMIHNoYWxsIGNhbGwgdGhpcyBmdW5jdGlvbiAqLworLyogdm9pZCAoKnpmY2JVc2JPdXRDb21wbGV0ZSkoemRldl90KiBkZXYsIHpidWZfdCAqYnVmLCB1OF90IHN0YXR1cywgdThfdCAqaGRyKTsgKi8KKworCisvKiBDYWxsIG91dCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQmVsb3cgYXJlIHRoZSBmdW5jdGlvbnMgdGhhdCBzdXBwbHkgYnkgdGhlIE9BTCBmb3IgODAyMTFjb3JlIHRvICAgICAgKi8KKy8qIG1hbmlwdWxhdGUgdGhlIFVTQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIFJldHVybiBPQUwncyBVU0IgVHhRIHNpemUgKi8KK2V4dGVybiB1MzJfdCB6ZndVc2JHZXRNYXhUeFFTaXplKHpkZXZfdCogZGV2KTsKKworLyogUmV0dXJuIE9BTCdzIFR4USBhdmFpbGFibGUgc2l6ZSAqLworZXh0ZXJuIHUzMl90IHpmd1VzYkdldEZyZWVUeFFTaXplKHpkZXZfdCogZGV2KTsKKworLyogUmVnaXN0ZXIgY2FsbCBiYWNrIGZ1bmN0aW9uICovCitleHRlcm4gdm9pZCB6ZndVc2JSZWdpc3RlckNhbGxCYWNrKHpkZXZfdCogZGV2LCBzdHJ1Y3QgemZDYlVzYkZ1bmNUYmwgKnpmVXNiRnVuYyk7CisKKy8qIEVuYWJsZSBVU0IgaW50ZXJydXB0IGVuZHBvaW50ICovCitleHRlcm4gdTMyX3QgemZ3VXNiRW5hYmxlSW50RXB0KHpkZXZfdCAqZGV2LCB1OF90IGVuZHB0KTsKKworLyogRW5hYmxlIFVTQiBSeCBlbmRwb2ludCAqLworZXh0ZXJuIGludCB6ZndVc2JFbmFibGVSeEVwdCh6ZGV2X3QqIGRldiwgdThfdCBlbmRwdCk7CisKKy8qIDgwMjExY29yZSBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gc2VuZCBhIFVTQiByZXF1ZXN0IG92ZXIgZW5kcG9pbnQgMCAqLworZXh0ZXJuIHUzMl90IHpmd1VzYlN1Ym1pdENvbnRyb2woemRldl90KiBkZXYsIHU4X3QgcmVxLCB1MTZfdCB2YWx1ZSwKKyAgICAgICAgdTE2X3QgaW5kZXgsIHZvaWQgKmRhdGEsIHUzMl90IHNpemUpOworZXh0ZXJuIHUzMl90IHpmd1VzYlN1Ym1pdENvbnRyb2xJbyh6ZGV2X3QqIGRldiwgdThfdCByZXEsIHU4X3QgcmVxdHlwZSwKKyAgICAgICAgdTE2X3QgdmFsdWUsIHUxNl90IGluZGV4LCB2b2lkICpkYXRhLCB1MzJfdCBzaXplKTsKKworLyogODAyMTFjb3JlIGNhbGwgdGhpcyBmdW5jdGlvbiB0byB0cmFuc2ZlciBkYXRhIG91dCBvdmVyIGVuZHBvaW50IDEgKi8KK2V4dGVybiB2b2lkIHpmd1VzYkNtZCh6ZGV2X3QqIGRldiwgdThfdCBlbmRwdCwgdTMyX3QqIGNtZCwgdTE2X3QgY21kTGVuKTsKKworLyogODAyMTFjb3JlIGNhbGwgdGhpcyBmdW5jdGlvbiB0byB0cmFuc2ZlciBkYXRhIG91dCBvdmVyIGVuZHBvaW50IDQgKi8KK2V4dGVybiB1MzJfdCB6ZndVc2JTZW5kKHpkZXZfdCogZGV2LCB1OF90IGVuZHB0LCB1OF90ICpoZHIsIHUxNl90IGhkcmxlbiwgdThfdCAqc25hcCwgdTE2X3Qgc25hcExlbiwKKyAgICAgICAgICAgICAgICB1OF90ICp0YWlsLCB1MTZfdCB0YWlsTGVuLCB6YnVmX3QgKmJ1ZiwgdTE2X3Qgb2Zmc2V0KTsKKworLyogODAyMTFjb3JlIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBzZXQgVVNCIGNvbmZpZ3VyYXRpb24gKi8KK2V4dGVybiB1MzJfdCB6ZndVc2JTZXRDb25maWd1cmF0aW9uKHpkZXZfdCAqZGV2LCB1MTZfdCB2YWx1ZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3B1Yl96ZmkuaCBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9wdWJfemZpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM1YmQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9wdWJfemZpLmgKQEAgLTAsMCArMSw4MjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9QVUJfREVGU19ICisjZGVmaW5lIF9QVUJfREVGU19ICisKKyNpbmNsdWRlICIuLi9vYWxfZHQuaCIKKworLyoqKioqIFNlY3Rpb24gMSA6IFR1bmFibGUgUGFyYW1ldGVycyAqKioqKi8KKy8qIFRoZSBkZWZpbnRpb25zIGluIHRoaXMgc2VjdGlvbiBhcmUgdHVuYWJlbCBwYXJhbWV0ZXJzICovCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIEJTUyB0aGF0IGNvdWxkIGJlIHNjYW5lZCAqLworI2RlZmluZSBaTV9NQVhfQlNTICAgICAgICAgICAgICAgICAgICAgICAgICAxMjgKKworLyogTWF4aW11bSBudW1iZXIgb2YgV1BBMiBQTUtJRCB0aGF0IHN1cHBvcnRlZCAqLworI2RlZmluZSBaTV9QTUtJRF9NQVhfQlNTX0NOVCAgICAgICAgICAgICAgIDgKKworLyogRW5hYmxlIGFnZ3JlZ2F0aW9uIGFuZCBkZWFnZ3JlZ2F0aW9uICovCisjZGVmaW5lIFpNX0VOQUJMRV9BR0dSRUdBVElPTgorCisjaWZkZWYgWk1fRU5BQkxFX0FHR1JFR0FUSU9OCisgICAgLyogRW5hYmxlIEJBIGZhaWxlZCByZXRyYW5zbWlzc2lvbiBpbiBmaXJtd2FyZSAqLworICAgICNkZWZpbmUgWk1fRU5BQkxFX0ZXX0JBX1JFVFJBTlNNSVNTSU9OCisgICAgI2RlZmluZSBaTV9CWVBBU1NfQUdHUl9TQ0hFRFVMSU5HCisgICAgLy8jZGVmaW5lIFpNX0FHR1JfQklUX09OCisjZW5kaWYKKworCisjaWZuZGVmIFpNX0ZCNTAKKy8vI2RlZmluZSBaTV9GQjUwCisjZW5kaWYKKworI2lmbmRlZiBaTV9BUF9ERUJVRworLy8jZGVmaW5lIFpNX0FQX0RFQlVHCisjZW5kaWYKKworLy8jZGVmaW5lIFpNX0VOQUJMRV9CQV9SQVRFQ1RSTAorCisvKioqKiogRW5kIG9mIHNlY3Rpb24gMSAqKioqKi8KKworCisvKioqKiogU2VjdGlvbiAyIDogUHVibGljIERlZmluaXRpb25zLCBkYXRhIHN0cnVjdHVyZXMgYW5kIHByb3RvdHlwZXMgKioqKiovCisvKiBmdW5jdGlvbiByZXR1cm4gc3RhdHVzICovCisjZGVmaW5lIFpNX1NUQVRVU19TVUNDRVNTICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWk1fU1RBVFVTX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgMQorCisvLyBtZWRpYSBjb25uZWN0IHN0YXR1cworI2RlZmluZSBaTV9TVEFUVVNfTUVESUFfQ09OTkVDVCAgICAgICAgICAgICAweDAwCisjZGVmaW5lIFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUICAgICAgICAgIDB4MDEKKyNkZWZpbmUgWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfTk9UX0ZPVU5EICAgIDB4MDIKKyNkZWZpbmUgWk1fU1RBVFVTX01FRElBX0RJU0FCTEVEICAgICAgICAgICAgMHgwMworI2RlZmluZSBaTV9TVEFUVVNfTUVESUFfQ09OTkVDVElPTl9ESVNBQkxFRCAweDA0CisjZGVmaW5lIFpNX1NUQVRVU19NRURJQV9DT05ORUNUSU9OX1JFU0VUICAgIDB4MDUKKyNkZWZpbmUgWk1fU1RBVFVTX01FRElBX1JFU0VUICAgICAgICAgICAgICAgMHgwNgorI2RlZmluZSBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9ERUFVVEggICAweDA3CisjZGVmaW5lIFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX0RJU0FTT0MgIDB4MDgKKyNkZWZpbmUgWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfVElNRU9VVCAgMHgwOQorI2RlZmluZSBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9BVVRIX0ZBSUxFRCAgMHgwYQorI2RlZmluZSBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9BU09DX0ZBSUxFRCAgMHgwYgorI2RlZmluZSBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9NSUNfRkFJTCAgIDB4MGMKKyNkZWZpbmUgWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfVU5SRUFDSEFCTEUgMHgwZAorI2RlZmluZSBaTV9TVEFUVVNfTUVESUFfRElTQ09OTkVDVF9CRUFDT05fTUlTUyAgMHgwZQorCisvLyBQYWNrZXQgRmlsdGVyCisjZGVmaW5lIFpNX1BBQ0tFVF9UWVBFX0RJUkVDVEVEICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgWk1fUEFDS0VUX1RZUEVfTVVMVElDQVNUICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBaTV9QQUNLRVRfVFlQRV9BTExfTVVMVElDQVNUICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFpNX1BBQ0tFVF9UWVBFX0JST0FEQ0FTVCAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgWk1fUEFDS0VUX1RZUEVfUFJPTUlTQ1VPVVMgICAgICAgICAgMHgwMDAwMDAyMAorCisvKiBCU1MgbW9kZSBkZWZpbml0aW9uICovCisvKiBUT0RPIDogVGhlIGRlZmluaXRpb25zIGhlcmUgYXJlIGNvdXBsZWQgd2l0aCBYUCdzIE5ESVMgT0lELiAqLworLyogICAgICAgIFdlIGNhbid0IGJlIGNoYW5nZWQgdGhlbSBmcmVlbHksIG5lZWQgdG8gZGlzYXJtIHRoaXMgbWluZSAqLworI2RlZmluZSBaTV9NT0RFX0lCU1MgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWk1fTU9ERV9VTktOT1dOICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFX01BWCAgICAgICAgICAzCisjZGVmaW5lIFpNX01PREVfQVAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgWk1fTU9ERV9QU0VVRE8gICAgICAgICAgICAgICAgICAgICAgNQorCisKKy8qIEF1dGhlbnRpY2F0aW9uIG1vZGUgKi8KKyNkZWZpbmUgWk1fQVVUSF9NT0RFX09QRU4gICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaTV9BVVRIX01PREVfU0hBUkVEX0tFWSAgICAgICAgICAgICAxCisjZGVmaW5lIFpNX0FVVEhfTU9ERV9BVVRPICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgWk1fQVVUSF9NT0RFX1dQQSAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBaTV9BVVRIX01PREVfV1BBUFNLICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFpNX0FVVEhfTU9ERV9XUEFfTk9ORSAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgWk1fQVVUSF9NT0RFX1dQQTIgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBaTV9BVVRIX01PREVfV1BBMlBTSyAgICAgICAgICAgICAgICA3CisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyNkZWZpbmUgWk1fQVVUSF9NT0RFX0NFTkMgICAgICAgICAgICAgICAgICAgOAorI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyNkZWZpbmUgWk1fQVVUSF9NT0RFX1dQQV9BVVRPICAgICAgICAgICAgICAgOQorI2RlZmluZSBaTV9BVVRIX01PREVfV1BBUFNLX0FVVE8gICAgICAgICAgICAxMAorCisvLyBFbmNyeXB0aW9uIG1vZGUKKyNkZWZpbmUgWk1fTk9fV0VQICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lIFpNX0FFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSBaTV9US0lQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgWk1fV0VQNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFpNX1dFUDEyOCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NQorI2RlZmluZSBaTV9XRVAyNTYgICAgICAgICAgICAgICAgICAgICAgICAgICAweDYKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworI2RlZmluZSBaTV9DRU5DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDcKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisKKy8qIEVuY3J5cHRpb24gdHlwZSBmb3Igd2VwIHN0YXR1cyAqLworI2RlZmluZSBaTV9FTkNSWVBUSU9OX1dFUF9ESVNBQkxFRCAgICAgICAgICAwCisjZGVmaW5lIFpNX0VOQ1JZUFRJT05fV0VQX0VOQUJMRUQgICAgICAgICAgIDEKKyNkZWZpbmUgWk1fRU5DUllQVElPTl9XRVBfS0VZX0FCU0VOVCAgICAgICAgMgorI2RlZmluZSBaTV9FTkNSWVBUSU9OX05PVF9TVVBQT1JURUQgICAgICAgICAzCisjZGVmaW5lIFpNX0VOQ1JZUFRJT05fVEtJUCAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgWk1fRU5DUllQVElPTl9US0lQX0tFWV9BQlNFTlQgICAgICAgNQorI2RlZmluZSBaTV9FTkNSWVBUSU9OX0FFUyAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFpNX0VOQ1JZUFRJT05fQUVTX0tFWV9BQlNFTlQgICAgICAgIDcKKworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisjZGVmaW5lIFpNX0VOQ1JZUFRJT05fQ0VOQyAgICAgICAgICAgICAgICAgIDgKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisKKy8qIHNlY3VyaXR5IHR5cGUgKi8KKyNkZWZpbmUgWk1fU0VDVVJJVFlfVFlQRV9OT05FICAgICAgICAgICAgICAgMAorI2RlZmluZSBaTV9TRUNVUklUWV9UWVBFX1dFUCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpNX1NFQ1VSSVRZX1RZUEVfV1BBICAgICAgICAgICAgICAgIDIKKworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisjZGVmaW5lIFpNX1NFQ1VSSVRZX1RZUEVfQ0VOQyAgICAgICAgICAgICAgIDMKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisKKy8qIEVuY3J5cHRpb24gRXhlbXB0aW9uIEFjdGlvbiBUeXBlICAqLworI2RlZmluZSBaTV9FTkNSWVBUSU9OX0VYRU1QVF9OT19FWEVNUFRJT04gICAwCisjZGVmaW5lIFpNX0VOQ1JZUFRJT05fRVhFTVBUX0FMV0FZUyAgICAgICAgIDEKKworLyogTUlDIGZhaWx1cmUgKi8KKyNkZWZpbmUgWk1fTUlDX1BBSVJXSVNFX0VSUk9SICAgICAgICAgICAgICAgMHgwNgorI2RlZmluZSBaTV9NSUNfR1JPVVBfRVJST1IgICAgICAgICAgICAgICAgICAweDBFCisKKworLyogcG93ZXIgc2F2ZSBtb2RlICovCisjZGVmaW5lIFpNX1NUQV9QU19OT05FICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpNX1NUQV9QU19NQVggICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpNX1NUQV9QU19GQVNUICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFpNX1NUQV9QU19MSUdIVCAgICAgICAgICAgICAgICAgICAzCisKKy8qIFdNRSBBQyBUeXBlICovCisjZGVmaW5lIFpNX1dNRV9BQ19CSyAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgLyogQmFja2dyb3VuZCBBQyAqLworI2RlZmluZSBaTV9XTUVfQUNfQkUgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgIC8qIEJlc3QtZWZmb3J0IEFDICovCisjZGVmaW5lIFpNX1dNRV9BQ19WSURFTyAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgLyogVmlkZW8gQUMgKi8KKyNkZWZpbmUgWk1fV01FX0FDX1ZPSUNFICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAvKiBWb2ljZSBBQyAqLworCisvKiBQcmVhbWJsZSB0eXBlICovCisjZGVmaW5lIFpNX1BSRUFNQkxFX1RZUEVfQVVUTyAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWk1fUFJFQU1CTEVfVFlQRV9MT05HICAgICAgICAgICAgICAgMQorI2RlZmluZSBaTV9QUkVBTUJMRV9UWVBFX1NIT1JUICAgICAgICAgICAgICAyCisKKy8qIHdpcmVsZXNzIG1vZGVzIGNvbnN0YW50cyAqLworI2RlZmluZSBaTV9XSVJFTEVTU19NT0RFXzVfNTQgICAgICAgIDB4MDEgICAvLy88IDUgR0h6IDU0IE1icHMKKyNkZWZpbmUgWk1fV0lSRUxFU1NfTU9ERV81XzEwOCAgICAgICAweDAyICAgLy8vPCA1IEdIeiAxMDggTWJwcworI2RlZmluZSBaTV9XSVJFTEVTU19NT0RFXzI0XzExICAgICAgIDB4MDQgICAvLy88IDIuNCBHSHogMTEgTWJwcworI2RlZmluZSBaTV9XSVJFTEVTU19NT0RFXzI0XzU0ICAgICAgIDB4MDggICAvLy88IDIuNCBHSHogNTQgTWJwcworI2RlZmluZSBaTV9XSVJFTEVTU19NT0RFXzI0XzEwOCAgICAgIDB4MTAgICAvLy88IDIuNCBHSHogMTA4IE1icHMKKyNkZWZpbmUgWk1fV0lSRUxFU1NfTU9ERV80OV8xMyAgICAgIDB4MTAwICAgLy8vPCA0LjkgR0h6IDEzLjUgTWJwcywgcXVhcnRlciByYXRlIGNobi1iYW5kd2lkdGggPSA1CisjZGVmaW5lIFpNX1dJUkVMRVNTX01PREVfNDlfMjcgICAgICAweDIwMCAgIC8vLzwgNC45IEdIeiAyNyBNYnBzLCBoYWxmIHJhdGUgY2huLWJhbmR3aWR0aCA9IDEwCisjZGVmaW5lIFpNX1dJUkVMRVNTX01PREVfNDlfNTQgICAgICAweDQwMCAgIC8vLzwgNC45IEdIeiA1NCBNYnBzLCBmdWxsIHJhdGUgY2huLWJhbmR3aWR0aCA9IDIwCisjZGVmaW5lIFpNX1dJUkVMRVNTX01PREVfNV8zMDAgICAgIDB4MTAwMCAgIC8vLzwgNSBHSHogMzAwIE1icHMKKyNkZWZpbmUgWk1fV0lSRUxFU1NfTU9ERV8yNF8zMDAgICAgMHgyMDAwICAgLy8vPCAyLjQgR0h6IDMwMCBNYnBzCisjZGVmaW5lIFpNX1dJUkVMRVNTX01PREVfNV8xMzAgICAgIDB4NDAwMCAgIC8vLzwgNSBHSHogMTMwIE1icHMKKyNkZWZpbmUgWk1fV0lSRUxFU1NfTU9ERV8yNF8xMzAgICAgMHg4MDAwICAgLy8vPCAyLjQgR0h6IDEzMCBNYnBzCisKKyNkZWZpbmUgWk1fV0lSRUxFU1NfTU9ERV8yNF9OICAgICAgKFpNX1dJUkVMRVNTX01PREVfMjRfMTMwfFpNX1dJUkVMRVNTX01PREVfMjRfMzAwKQorI2RlZmluZSBaTV9XSVJFTEVTU19NT0RFXzVfTiAgICAgICAoWk1fV0lSRUxFU1NfTU9ERV81XzEzMHxaTV9XSVJFTEVTU19NT0RFXzVfMzAwKQorI2RlZmluZSBaTV9XSVJFTEVTU19NT0RFXzI0ICAgICAgICAoWk1fV0lSRUxFU1NfTU9ERV8yNF8xMXxaTV9XSVJFTEVTU19NT0RFXzI0XzU0fFpNX1dJUkVMRVNTX01PREVfMjRfTikKKyNkZWZpbmUgWk1fV0lSRUxFU1NfTU9ERV81ICAgICAgICAgKFpNX1dJUkVMRVNTX01PREVfNV81NHxaTV9XSVJFTEVTU19NT0RFXzVfTikKKworLyogQWRIb2MgTW9kZSB3aXRoIGRpZmZlcmVudCBiYW5kICovCisjZGVmaW5lIFpNX0FESE9DQkFORF9BICAgICAgICAgMQorI2RlZmluZSBaTV9BREhPQ0JBTkRfQiAgICAgICAgIDIKKyNkZWZpbmUgWk1fQURIT0NCQU5EX0cgICAgICAgICAzCisjZGVmaW5lIFpNX0FESE9DQkFORF9CRyAgICAgICAgNAorI2RlZmluZSBaTV9BREhPQ0JBTkRfQUJHICAgICAgIDUKKworLyogQXV0aGVudGljYXRpb24gYWxnb3JpdGhtIGluIHRoZSBmaWVsZCBhbGdObyBvZiBhdXRoZW50aWNhdGlvbiBmcmFtZXMgKi8KKyNkZWZpbmUgWk1fQVVUSF9BTEdPX09QRU5fU1lTVEVNICAgICAgMHgxMDAwMCAgICAvKiBPcGVuIHN5c3RlbSAqLworI2RlZmluZSBaTV9BVVRIX0FMR09fU0hBUkVEX0tFWSAgICAgICAweDEwMDAxICAgIC8qIFNoYXJlZCBLZXkgKi8KKyNkZWZpbmUgWk1fQVVUSF9BTEdPX0xFQVAgICAgICAgICAgICAgMHgxMDA4MCAgICAvKiBMZWFwICovCisKK3N0cnVjdCB6c1NjYW5SZXN1bHQKK3sKKyAgICB1MzJfdCByZXNlcnZlZDsKK307CisKKworc3RydWN0IHpzU3Rhc3RpY3MKK3sKKyAgICB1MzJfdCByZXNlcnZlZDsKK307CisKKyNkZWZpbmUgWk1fTUFYX1NVUFBfUkFURVNfSUVfU0laRSAgICAgICAxMgorI2RlZmluZSBaTV9NQVhfSUVfU0laRSAgICAgICAgICAgICAgICAgIDUwIC8vMTAwCisjZGVmaW5lIFpNX01BWF9XUFNfSUVfU0laRSAgICAgICAgICAgICAgMTUwCisjZGVmaW5lIFpNX01BWF9QUk9CRV9GUkFNRV9CT0RZX1NJWkUgICAgNTEyLy8zMDAKKyNkZWZpbmUJWk1fTUFYX0NPVU5UUllfSU5GT19TSVpFCQkyMAorCisjZGVmaW5lIFpNX01BWF9TU0lEX0xFTkdUSCAgICAgICAgICAzMgorc3RydWN0IHpzQnNzSW5mbworeworICAgIHU4X3QgICBtYWNhZGRyWzZdOworICAgIHU4X3QgICBic3NpZFs2XTsKKyAgICB1OF90ICAgYmVhY29uSW50ZXJ2YWxbMl07CisgICAgdThfdCAgIGNhcGFiaWxpdHlbMl07CisgICAgdThfdCAgIHRpbWVTdGFtcFs4XTsKKyAgICB1OF90ICAgc3NpZFtaTV9NQVhfU1NJRF9MRU5HVEggKyAyXTsgICAvLyBFSUQoMSkgKyBMZW5ndGgoMSkgKyBTU0lEKDMyKQorICAgIHU4X3QgICBzdXBwb3J0ZWRSYXRlc1taTV9NQVhfU1VQUF9SQVRFU19JRV9TSVpFICsgMl07IC8vIEVJRCgxKSArIExlbmd0aCgxKSArIHN1cHBvcnRlZCByYXRlcyBbMTJdCisgICAgdThfdCAgIGNoYW5uZWw7CisgICAgdTE2X3QgIGZyZXF1ZW5jeTsKKyAgICB1MTZfdCAgYXRpbVdpbmRvdzsKKyAgICB1OF90ICAgZXJwOworICAgIHU4X3QgICBleHRTdXBwb3J0ZWRSYXRlc1taTV9NQVhfU1VQUF9SQVRFU19JRV9TSVpFICsgMl07IC8vIEVJRCgxKSArIExlbmd0aCgxKSArIGV4dGVuZGVkIHN1cHBvcnRlZCByYXRlcyBbMTJdCisgICAgdThfdCAgIHdwYUllW1pNX01BWF9JRV9TSVpFICsgMl07CisgICAgdThfdCAgIHdzY0llW1pNX01BWF9XUFNfSUVfU0laRSArIDJdOworICAgIHU4X3QgICByc25JZVtaTV9NQVhfSUVfU0laRSArIDJdOworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgdThfdCAgIGNlbmNJZVtaTV9NQVhfSUVfU0laRSArIDJdOyAvKiBDRU5DICovIC8qIGhhbGYgc2l6ZSBiZWNhdXNlIG9mIG1lbW9yeSBleGNlZWQgNjRrIGJvdW5kYXJ5ICovCisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgIHU4X3QgICBzZWN1cml0eVR5cGU7CisgICAgdThfdCAgIHNpZ25hbFN0cmVuZ3RoOworICAgIHU4X3QgICBzaWduYWxRdWFsaXR5OworICAgIHUxNl90ICBzb3J0VmFsdWU7CisgICAgdThfdCAgIHdtZVN1cHBvcnQ7CisgICAgdThfdCAgIGZsYWc7CisgICAgdThfdCAgIEVuYWJsZUhUOworICAgIHU4X3QgICBlbmFibGVIVDQwOworICAgIHU4X3QgICBTRzQwOworICAgIHU4X3QgICBleHRDaE9mZnNldDsKKyAgICB1OF90ICAgYXBDYXA7IC8vIGJpdDA6MTFOIEFQCisgICAgdTE2X3QgIGZyYW1lQm9keXNpemU7CisgICAgdThfdCAgIGZyYW1lQm9keVtaTV9NQVhfUFJPQkVfRlJBTUVfQk9EWV9TSVpFXTsKKyAgICB1OF90ICAgY291bnRyeUluZm9bWk1fTUFYX0NPVU5UUllfSU5GT19TSVpFICsgMl07CisgICAgdTE2X3QgIGF0aE93bEFwOworICAgIHUxNl90ICBtYXJ2ZWxBcDsKKyAgICB1MTZfdCAgYnJvYWRjb21IVEFwOworICAgIHUzMl90ICB0aWNrOworICAgIHN0cnVjdCB6c0Jzc0luZm8qIG5leHQ7Cit9OworCitzdHJ1Y3QgenNCc3NMaXN0Cit7CisgICAgdThfdCBic3NDb3VudDsKKyAgICBzdHJ1Y3QgenNCc3NJbmZvKiBoZWFkOworICAgIHN0cnVjdCB6c0Jzc0luZm8qIHRhaWw7Cit9OworCitzdHJ1Y3QgenNCc3NMaXN0VjEKK3sKKyAgICB1OF90IGJzc0NvdW50OworICAgIHN0cnVjdCB6c0Jzc0luZm8gYnNzSW5mb1taTV9NQVhfQlNTXTsKK307CisKKyNkZWZpbmUgWk1fS0VZX0ZMQUdfR0sgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBaTV9LRVlfRkxBR19QSyAgICAgICAgICAgICAgICAgMFgwMDAyCisjZGVmaW5lIFpNX0tFWV9GTEFHX0FVVEhFTlRJQ0FUT1IgICAgICAweDAwMDQKKyNkZWZpbmUgWk1fS0VZX0ZMQUdfSU5JVF9JViAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBaTV9LRVlfRkxBR19ERUZBVUxUX0tFWSAgICAgICAgMHgwMDEwCisKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworI2RlZmluZSBaTV9LRVlfRkxBR19DRU5DICAgICAgICAgICAgICAgMHgwMDIwCisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworCisvLyBDb21tZW50OiBGb3IgVEtJUCwga2V5WzBdfmtleVsxNV0gID0+IFRLSVAga2V5CisvLyAgICAgICAgICAgICAgICAgICAga2V5WzE2XX5rZXlbMjNdID0+IFR4IE1JQyBrZXkKKy8vICAgICAgICAgICAgICAgICAgICBrZXlbMjRdfmtleVszMV0gPT4gUnggTUlDIGtleQorc3RydWN0IHpzS2V5SW5mbworeworICAgIHU4X3QqICAga2V5OworICAgIHU4X3QgICAga2V5TGVuZ3RoOworICAgIHU4X3QgICAga2V5SW5kZXg7CisgICAgdThfdCogICBpbml0SXY7CisgICAgdTE2X3QgICBmbGFnOworICAgIHU4X3QgICAgdmFwSWQ7CisgICAgdTE2X3QgICAgdmFwQWRkclszXTsKKyAgICB1MTZfdCogICBtYWNBZGRyOworfTsKKworCisKKy8qCisgKiBDaGFubmVscyBhcmUgc3BlY2lmaWVkIGJ5IGZyZXF1ZW5jeS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXUxNl90CWNoYW5uZWw7CS8qIHNldHRpbmcgaW4gTWh6ICovCisJdTMyX3QJY2hhbm5lbEZsYWdzOwkvKiBzZWUgYmVsb3cgKi8KKwl1OF90CXByaXZGbGFnczsKKwlzOF90CW1heFJlZ1R4UG93ZXI7CS8qIG1heCByZWd1bGF0b3J5IHR4IHBvd2VyIGluIGRCbSAqLworCXM4X3QJbWF4VHhQb3dlcjsJLyogbWF4IHRydWUgdHggcG93ZXIgaW4gMC4yNSBkQm0gKi8KKwlzOF90CW1pblR4UG93ZXI7CS8qIG1pbiB0cnVlIHR4IHBvd2VyIGluIDAuMjUgZEJtICovCit9IFpNX0hBTF9DSEFOTkVMOworCitzdHJ1Y3QgenNSZWd1bGF0aW9uVGFibGUKK3sKKyAgICB1MTZfdCAgIHJlZ2lvbkNvZGU7CisgICAgdTE2X3QgICBDdXJDaEluZGV4OworICAgIHUxNl90ICAgYWxsb3dDaGFubmVsQ250OworICAgIFpNX0hBTF9DSEFOTkVMICAgYWxsb3dDaGFubmVsWzYwXTsgICAvKiAyLjRHSHo6IDE0IGNoYW5uZWxzLCA1IEdIejogMzEgY2hhbm5lbHMgKi8KK307CisKK3N0cnVjdCB6c1BhcnRuZXJOb3RpZnlFdmVudAoreworICAgIHU4X3QgYnNzaWRbNl07ICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBCU1NJRCBvZiBJQlNTCisgICAgdThfdCBwZWVyTWFjQWRkcls2XTsgICAgICAgICAgICAgICAgLy8gVGhlIE1BQyBhZGRyZXNzIG9mIHBlZXIgc3RhdGlvbgorfTsKKworI2RlZmluZSBaTV9SQ19UUkFJTkVEX0JJVCAgIDB4MQorc3RydWN0IHpzUmNDZWxsCit7CisgICAgdTMyX3QgdHhDb3VudDsKKyAgICB1MzJfdCBmYWlsQ291bnQ7CisgICAgdThfdCBjdXJyZW50UmF0ZTsKKyAgICB1OF90IGN1cnJlbnRSYXRlSW5kZXg7CisgICAgdTMyX3QgcHJvYmluZ1RpbWU7CisgICAgdThfdCBvcGVyYXRpb25SYXRlU2V0WzI0XTsKKyAgICB1OF90IG9wZXJhdGlvblJhdGVDb3VudDsKKyAgICB1MTZfdCByeFJzc2k7CisgICAgdThfdCBmbGFnOworICAgIHUzMl90ICBsYXN0dHhDb3VudDsKKyAgICB1MzJfdCAgbGFzdFRpbWU7Cit9OworCitzdHJ1Y3QgenNPcHBvc2l0ZUluZm8KK3sKKyAgICB1OF90ICAgICAgICAgICAgbWFjQWRkcls2XTsKKyAgICBzdHJ1Y3QgenNSY0NlbGwgcmNDZWxsOworICAgIHU4X3QgICAgICAgICAgICB2YWxpZDsgICAgICAgICAgICAgIC8vIFRoaXMgaW5kaWNhdGUgaWYgdGhpcyBvcHBvc2l0ZSBpcyBzdGlsbCB2YWxpZAorICAgIHU4X3QgICAgICAgICAgICBhbGl2ZUNvdW50ZXI7CisgICAgdThfdCAgICAgICAgICAgIHBrSW5zdGFsbGVkOworCisjaWZkZWYgWk1fRU5BQkxFX0lCU1NfV1BBMlBTSworICAgIC8qIEZvciBXUEEyUFNLICEgKi8KKyAgICB1OF90IAkJCXdwYVN0YXRlOworICAgIHU4X3QgICAgICAgICAgICBjYW1JZHg7CisgICAgdThfdCAgICAgICAgICAgIGVuY3J5TW9kZTsKKyAgICB1MTZfdCAgICAgICAgICAgaXYxNjsKKyAgICB1MzJfdCAgICAgICAgICAgaXYzMjsKKyNlbmRpZgorfTsKKwordHlwZWRlZiB2b2lkICgqemZwSUJTU0l0ZXJhdGVQZWVyU3RhdGlvbkNiKSgKKyAgICB6ZGV2X3QqIGRldiwgc3RydWN0IHpzT3Bwb3NpdGVJbmZvICpwZWVySW5mbywgdm9pZCAqY3R4LCB1OF90IGluZGV4KTsKKwordHlwZWRlZiB1MTZfdCAoKnpmcFN0YVJ4U2VjdXJpdHlDaGVja0NiKSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworCisKKy8qIENvbW11bmljYXRpb24gVGFsbHkgZGF0YSBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCB6c0NvbW1UYWxseQoreworICAgIHUzMl90IHR4VW5pY2FzdEZybTsJCSAgICAvLyAgMCB0eFVuaWNhc3RGcmFtZXMKKyAgICB1MzJfdCB0eE11bHRpY2FzdEZybTsJCS8vICAxIHR4TXVsdGljYXN0RnJhbWVzCisgICAgdTMyX3QgdHhVbmljYXN0T2N0ZXRzOwkgICAgLy8gIDIgdHhVbmlPY3RldHMgIGJ5dGUgc2l6ZQorICAgIHUzMl90IHR4TXVsdGljYXN0T2N0ZXRzOwkvLyAgMyB0eE11bHRpT2N0ZXRzICBieXRlIHNpemUKKyAgICB1MzJfdCB0eEZybVVwcGVyTkRJUzsgICAgICAgLy8gIDQKKyAgICB1MzJfdCB0eEZybURydk1ndDsgICAgICAgICAgLy8gIDUKKyAgICB1MzJfdCBSZXRyeUZhaWxDbnQ7CQkgICAgLy8gIDYKKyAgICB1MzJfdCBId19Ub3RhbFR4RnJtOwkJLy8gIDcgSGFyZHdhcmUgdG90YWwgVHggRnJhbWUKKyAgICB1MzJfdCBId19SZXRyeUNudDsJCSAgICAvLyAgOCB0eE11bHRpcGxlUmV0cmllc0ZyYW1lcworICAgIHUzMl90IEh3X1VuZGVycnVuQ250OyAgICAgICAvLyAgOQorCisgICAgdTMyX3QgRHJpdmVyUnhGcm1DbnQ7ICAgICAgIC8vIDEwCisgICAgdTMyX3QgcnhVbmljYXN0RnJtOwkJICAgIC8vIDExIHJ4VW5pY2FzdEZyYW1lcworICAgIHUzMl90IHJ4TXVsdGljYXN0RnJtOwkgICAgLy8gMTJyeE11bHRpY2FzdEZyYW1lcworCisgICAgdTMyX3QgTm90aWZ5TkRJU1J4RnJtQ250OyAgIC8vIDE0CisgICAgdTMyX3QgcnhVbmljYXN0T2N0ZXRzOwkvLyAxNSByeFVuaU9jdGV0cyAgYnl0ZSBzaXplCisgICAgdTMyX3QgcnhNdWx0aWNhc3RPY3RldHM7CSAgICAvLyAxNiByeE11bHRpT2N0ZXRzICBieXRlIHNpemUKKyAgICB1MzJfdCBEcml2ZXJEaXNjYXJkZWRGcm07ICAgICAgIC8vIDE3IERpc2NhcmQgYnkgVmFsaWRhdGVGcmFtZQorICAgIHUzMl90IExlc3NUaGFuRGF0YU1pbkxlbjsgICAgICAgLy8gMTgKKyAgICB1MzJfdCBHcmVhdGVyVGhhbk1heExlbjsgICAgICAgIC8vIDE5CisgICAgdTMyX3QgRHJpdmVyRGlzY2FyZGVkRnJtQ2F1c2VCeU11bHRpY2FzdExpc3Q7CisgICAgdTMyX3QgRHJpdmVyRGlzY2FyZGVkRnJtQ2F1c2VCeUZybUN0cmw7CisgICAgdTMyX3QgcnhOZWVkRnJnRnJtOwkJICAgIC8vIDIyIG5lZWQgbW9yZSBmcmcgZnJtCisgICAgdTMyX3QgRHJpdmVyUnhNZ3RGcm1DbnQ7CisgICAgdTMyX3QgcnhCcm9hZGNhc3RGcm07CSAgICAvLyAyNCBSZWNlaXZlIGJyb2FkY2FzdCBmcmFtZSBjb3VudAorICAgIHUzMl90IHJ4QnJvYWRjYXN0T2N0ZXRzOwkvLyAyNSBSZWNlaXZlIGJyb2FkY2FzdCBmcmFtZSBieXRlIHNpemUKKyAgICB1MzJfdCByeDExYkRhdGFGcmFtZTsJCS8vIDI2IE1lYXN1cmVkIHF1YWxpdHkgMTFiIGRhdGEgZnJhbWUgY291bnQKKyAgICB1MzJfdCByeE9GRE1EYXRhRnJhbWU7CSAgICAvLyAyNyBNZWFzdXJlZCBxdWFsaXR5IDExZyBkYXRhIGZyYW1lIGNvdW50CisKKworICAgIHUzMl90IEh3X1RvdGFsUnhGcm07ICAgICAgICAvLyAyOAorICAgIHUzMl90IEh3X0NSQzE2Q250OwkJICAgIC8vIDI5IHJ4UExDUENSQ0VyckNudAorICAgIHUzMl90IEh3X0NSQzMyQ250OwkJICAgIC8vIDMwIHJ4Q1JDMzJFcnJDbnQKKyAgICB1MzJfdCBId19EZWNyeXBFcnJfVU5JOyAgICAgLy8gMzEKKyAgICB1MzJfdCBId19EZWNyeXBFcnJfTXVsOyAgICAgLy8gMzIKKworICAgIHUzMl90IEh3X1J4RklGT092ZXJydW47ICAgICAvLyAzNAorICAgIHUzMl90IEh3X1J4VGltZU91dDsgICAgICAgICAvLyAzNQorICAgIHUzMl90IExvc3NBUDsgICAgICAgICAgICAgICAvLyAzNgorCisgICAgdTMyX3QgVHhfTVBEVTsgICAgICAgICAgICAgIC8vIDM3CisgICAgdTMyX3QgQkFfRmFpbDsgICAgICAgICAgICAgIC8vIDM4CisgICAgdTMyX3QgSHdfVHhfQU1QRFU7ICAgICAgICAgIC8vIDM5CisgICAgdTMyX3QgSHdfVHhfTVBEVTsgICAgICAgICAgIC8vIDQwCisKKyAgICB1MzJfdCBSYXRlQ3RybFR4TVBEVTsKKyAgICB1MzJfdCBSYXRlQ3RybEJBRmFpbDsKKworICAgIHUzMl90IHR4UW9zRHJvcENvdW50WzVdOyAgICAvLzQxIDQyIDQzIDQ0IDQ1CisKKwl1MzJfdCBId19SeE1QRFU7ICAgICAgICAgICAgLy8gNDYKKwl1MzJfdCBId19SeERyb3BNUERVOyAgICAgICAgLy8gNDcKKwl1MzJfdCBId19SeERlbE1QRFU7ICAgICAgICAgLy8gNDgKKworCXUzMl90IEh3X1J4UGh5TWlzY0Vycm9yOyAgICAvLyA0OQorCXUzMl90IEh3X1J4UGh5WFJFcnJvcjsgICAgICAvLyA1MAorICAgIHUzMl90IEh3X1J4UGh5T0ZETUVycm9yOyAgICAvLyA1MQorICAgIHUzMl90IEh3X1J4UGh5Q0NLRXJyb3I7ICAgICAvLyA1MgorICAgIHUzMl90IEh3X1J4UGh5SFRFcnJvcjsgICAgICAvLyA1MworICAgIHUzMl90IEh3X1J4UGh5VG90YWxDb3VudDsgICAvLyA1NAorCisgICAgdTMyX3Qgc3dSeEZyYWdtZW50Q291bnQ7ICAgICAgICAgLy8gNTUKKyAgICB1MzJfdCBzd1J4VW5pY2FzdE1pY0ZhaWxDb3VudDsgICAvLyA1NgorICAgIHUzMl90IHN3UnhNdWx0aWNhc3RNaWNGYWlsQ291bnQ7IC8vIDU3CisgICAgdTMyX3Qgc3dSeERyb3BVbmVuY3J5cHRlZENvdW50OyAgLy8gNTgKKworICAgIHUzMl90IHR4QnJvYWRjYXN0RnJtOworICAgIHUzMl90IHR4QnJvYWRjYXN0T2N0ZXRzOworfTsKKworLyogVHJhZmZpYyBNb25pdG9yIFRhbGx5IGRhdGEgc3RydWN0dXJlICovCitzdHJ1Y3QgenNUcmFmVGFsbHkKK3sKKyAgICB1MzJfdCByeER1cGxpY2F0ZTsKKyAgICB1MzJfdCByeFNyY0lzT3duTWFjOworICAgIC8vdTMyX3QgcnhEYXRhRnJhbWVDb3VudDsKKyAgICAvL3UzMl90IHJ4RGF0YUJ5dGVDb3VudDsKKyAgICAvL3UzMl90IHJ4RGF0YUJ5dGVzSW4xMDAwbXM7CisgICAgLy91MzJfdCByeERhdGFUbXBGb3IxMDAwbXM7CisgICAgLy91MzJfdCByeERhdGFCeXRlc0luMjAwMG1zOworICAgIC8vdTMyX3QgcnhEYXRhVG1wRm9yMjAwMG1zOworCisgICAgLy91MzJfdCB0eERhdGFGcmFtZUNvdW50OworICAgIC8vdTMyX3QgdHhEYXRhQnl0ZUNvdW50OworICAgIC8vdTMyX3QgdHhEYXRhQnl0ZXNJbjEwMDBtczsKKyAgICAvL3UzMl90IHR4RGF0YVRtcEZvcjEwMDBtczsKKyAgICB1MzJfdCB0eERhdGFCeXRlc0luMjAwMG1zOworICAgIHUzMl90IHR4RGF0YVRtcEZvcjIwMDBtczsKK307CisKKy8qIEhhbCByeCBwYWNrZXQgbW9uaXRlciBpbmZvcm1hdGlvbiAqLworc3RydWN0IHpzTW9uSGFsUnhJbmZvCit7CisgICAgdTMyX3QgY3VycmVudFJTU0lbN107CisgICAgdTMyX3QgY3VycmVudFJ4RVZNWzE0XTsKKyAgICB1MzJfdCBjdXJyZW50UnhEYXRhTVQ7CisgICAgdTMyX3QgY3VycmVudFJ4RGF0YU1DUzsKKyAgICB1MzJfdCBjdXJyZW50UnhEYXRhQlc7CisgICAgdTMyX3QgY3VycmVudFJ4RGF0YVNHOworfTsKKworc3RydWN0IHpzVGFpbAoreworICAgIHU4X3QgU2lnbmFsU3RyZW5ndGgxOworICAgIHU4X3QgU2lnbmFsU3RyZW5ndGgyOworICAgIHU4X3QgU2lnbmFsU3RyZW5ndGgzOworICAgIHU4X3QgU2lnbmFsUXVhbGl0eTsKKyAgICB1OF90IFNBSW5kZXg7CisgICAgdThfdCBEQUluZGV4OworICAgIHU4X3QgRXJyb3JJbmRpY2F0aW9uOworICAgIHU4X3QgUnhNYWNTdGF0dXM7Cit9OworCit1bmlvbiB6dVRhaWwKK3sKKyAgICBzdHJ1Y3QgenNUYWlsIERhdGE7CisgICAgdThfdCBCeXRlWzhdOworfTsKKworc3RydWN0IHpzQWRkaXRpb25JbmZvCit7CisgICAgdThfdCBQbGNwSGVhZGVyWzEyXTsKKyAgICB1bmlvbiB6dVRhaWwgICBUYWlsOworfTsKKworCitzdHJ1Y3QgenNQbWtpZEJzc2lkSW5mbworeworICAgIHUxNl90ICAgICAgYnNzaWRbM107CisgICAgdThfdCAgICAgICBwbWtpZFsxNl07Cit9OworCitzdHJ1Y3QgenNQbWtpZEluZm8KK3sKKwkgICB1MzJfdAkJYnNzaWRDb3VudDsKKwkgICBzdHJ1Y3QgenNQbWtpZEJzc2lkSW5mbwlic3NpZEluZm9bWk1fUE1LSURfTUFYX0JTU19DTlRdOworfTsKKworCitzdHJ1Y3QgenNDYkZ1bmNUYmwKK3sKKyAgICB1MTZfdCAoKnpmY2JBdXRoTm90aWZ5KSh6ZGV2X3QqIGRldiwgdTE2X3QqIG1hY0FkZHIpOworICAgIHUxNl90ICgqemZjYkFzb2NOb3RpZnkpKHpkZXZfdCogZGV2LCB1MTZfdCogbWFjQWRkciwgdThfdCogYm9keSwKKyAgICAgICAgICAgIHUxNl90IGJvZHlTaXplLCB1MTZfdCBwb3J0KTsKKyAgICB1MTZfdCAoKnpmY2JEaXNBc29jTm90aWZ5KSh6ZGV2X3QqIGRldiwgdThfdCogbWFjQWRkciwgdTE2X3QgcG9ydCk7CisgICAgdTE2X3QgKCp6ZmNiQXBDb25uZWN0Tm90aWZ5KSh6ZGV2X3QqIGRldiwgdThfdCogbWFjQWRkciwgdTE2X3QgcG9ydCk7CisgICAgdm9pZCAoKnpmY2JDb25uZWN0Tm90aWZ5KSh6ZGV2X3QqIGRldiwgdTE2X3Qgc3RhdHVzLCB1MTZfdCogYnNzaWQpOworICAgIHZvaWQgKCp6ZmNiU2Nhbk5vdGlmeSkoemRldl90KiBkZXYsIHN0cnVjdCB6c1NjYW5SZXN1bHQqIHJlc3VsdCk7CisgICAgdm9pZCAoKnpmY2JNaWNGYWlsdXJlTm90aWZ5KSh6ZGV2X3QqIGRldiwgdTE2X3QqIGFkZHIsIHUxNl90IHN0YXR1cyk7CisgICAgdm9pZCAoKnpmY2JBcE1pY0ZhaWx1cmVOb3RpZnkpKHpkZXZfdCogZGV2LCB1OF90KiBhZGRyLCB6YnVmX3QqIGJ1Zik7CisgICAgdm9pZCAoKnpmY2JJYnNzUGFydG5lck5vdGlmeSkoemRldl90KiBkZXYsIHUxNl90IHN0YXR1cywKKyAgICAgICAgICAgIHN0cnVjdCB6c1BhcnRuZXJOb3RpZnlFdmVudCAqZXZlbnQpOworICAgIHZvaWQgKCp6ZmNiTWFjQWRkcmVzc05vdGlmeSkoemRldl90KiBkZXYsIHU4X3QqIGFkZHIpOworICAgIHZvaWQgKCp6ZmNiU2VuZENvbXBsZXRlSW5kaWNhdGlvbikoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKKyAgICB2b2lkICgqemZjYlJlY3ZFdGgpKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCk7CisgICAgdm9pZCAoKnpmY2JSZWN2ODAyMTEpKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBhZGRJbmZvKTsKKyAgICB2b2lkICgqemZjYlJlc3RvcmVCdWZEYXRhKSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgdTE2X3QgKCp6ZmNiQ2VuY0Fzb2NOb3RpZnkpKHpkZXZfdCogZGV2LCB1MTZfdCogbWFjQWRkciwgdThfdCogYm9keSwKKyAgICAgICAgICAgIHUxNl90IGJvZHlTaXplLCB1MTZfdCBwb3J0KTsKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgdThfdCAoKnpmY2JDbGFzc2lmeVR4UGFja2V0KSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworCisgICAgdm9pZCAoKnpmY2JId1dhdGNoRG9nTm90aWZ5KSh6ZGV2X3QqIGRldik7Cit9OworCitleHRlcm4gdm9pZCB6Zlplcm9NZW1vcnkodThfdCogdmEsIHUxNl90IGxlbmd0aCk7CisjZGVmaW5lIFpNX0lOSVRfQ0JfRlVOQ19UQUJMRShwKSAgICAgICAgemZaZXJvTWVtb3J5KCh1OF90ICopcCwgc2l6ZW9mKHN0cnVjdCB6c0NiRnVuY1RibCkpOworCisvL2V4dGVybiBzdHJ1Y3QgenNXbGFuRGV2IHpnV2xhbkRldjsKKworLyogSW5pdGlhbGl6ZSBXTEFOIGhhcmR3YXJlIGFuZCBzb2Z0d2FyZSwgcmVzb3VyY2Ugd2lsbCBiZSBhbGxvY2F0ZWQgKi8KKy8qIGZvciBXTEFOIG9wZXJhdGlvbiwgbXVzdCBiZSBjYWxsZWQgZmlyc3QgYmVmb3JlIG90aGVyIGZ1bmN0aW9uLiAgICovCitleHRlcm4gdTE2X3QgemZpV2xhbk9wZW4oemRldl90KiBkZXYsIHN0cnVjdCB6c0NiRnVuY1RibCogY2JGdW5jVGJsKTsKKworLyogV0xBTiBoYXJkd2FyZSB3aWxsIGJlIHNodXRkb3duIGFuZCBhbGwgcmVzb3VyY2Ugd2lsbCBiZSByZWxlYXNlICovCitleHRlcm4gdTE2X3QgemZpV2xhbkNsb3NlKHpkZXZfdCogZGV2KTsKKworLyogRW5hYmxlL2Rpc2FibGUgV2xhbiBvcGVyYXRpb24gKi8KK2V4dGVybiB1MTZfdCB6ZmlXbGFuRW5hYmxlKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1MTZfdCB6ZmlXbGFuRGlzYWJsZSh6ZGV2X3QqIGRldiwgdThfdCBSZXNldEtleUNhY2hlKTsKK2V4dGVybiB1MTZfdCB6ZmlXbGFuUmVzdW1lKHpkZXZfdCogZGV2LCB1OF90IGRvUmVjb25uKTsKK2V4dGVybiB1MTZfdCB6ZmlXbGFuU3VzcGVuZCh6ZGV2X3QqIGRldik7CisKKy8qIEVuYWJsZS9kaXNhYmxlIElTUiBpbnRlcnJ1cHQgKi8KK2V4dGVybiB1MTZfdCB6ZmlXbGFuSW50ZXJydXB0RW5hYmxlKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1MTZfdCB6ZmlXbGFuSW50ZXJydXB0RGlzYWJsZSh6ZGV2X3QqIGRldik7CisKKy8qIERvIFdMQU4gc2l0ZSBzdXJ2ZXkgKi8KK2V4dGVybiB1MTZfdCB6ZmlXbGFuU2Nhbih6ZGV2X3QqIGRldik7CisKKy8qIEdldCBXTEFOIHN0YXN0aWNzICovCitleHRlcm4gdTE2X3QgemZpV2xhbkdldFN0YXRpc3RpY3MoemRldl90KiBkZXYpOworCisvKiBSZXNldCBXTEFOICovCitleHRlcm4gdTE2X3QgemZpV2xhblJlc2V0KHpkZXZfdCogZGV2KTsKKworLyogRGVhdXRoZW50aWNhdGUgYSBTVEEgKi8KK2V4dGVybiB1MTZfdCB6ZmlXbGFuRGVhdXRoKHpkZXZfdCogZGV2LCB1MTZfdCogbWFjQWRkciwgdTE2X3QgcmVhc29uKTsKKworZXh0ZXJuIHUxNl90IHpmaVR4U2VuZEV0aCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IHBvcnQpOworZXh0ZXJuIHU4X3QgemZpSXNUeFF1ZXVlRnVsbCh6ZGV2X3QqIGRldik7CitleHRlcm4gdTE2X3QgemZpVHhTZW5kODAyMTFNZ210KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCk7CisKK2V4dGVybiB2b2lkIHpmaUlzclBjaSh6ZGV2X3QqIGRldik7CisKK2V4dGVybiB1OF90IHpmaVdsYW5JQlNTR2V0UGVlclN0YXRpb25zQ291bnQoemRldl90KiBkZXYpOworZXh0ZXJuIHU4X3QgemZpV2xhbklCU1NJdGVyYXRlUGVlclN0YXRpb25zKHpkZXZfdCogZGV2LCB1OF90IG51bVRvSXRlcmF0ZSwgemZwSUJTU0l0ZXJhdGVQZWVyU3RhdGlvbkNiIGNhbGxiYWNrLCB2b2lkICpjdHgpOworZXh0ZXJuIHZvaWQgemZpV2xhbkZsdXNoQWxsUXVldWVkQnVmZmVycyh6ZGV2X3QqIGRldik7CisKKy8qIGNvaWQuYyAqLworZXh0ZXJuIHZvaWQgemZpV2xhblF1ZXJ5TWFjQWRkcmVzcyh6ZGV2X3QqIGRldiwgdThfdCogYWRkcik7CisKK2V4dGVybiB1MTZfdCB6ZmlHbG9iYWxEYXRhU2l6ZSh6ZGV2X3QqIGRldik7CisKK2V4dGVybiB2b2lkIHpmaUhlYXJ0QmVhdCh6ZGV2X3QqIGRldik7CisKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRXbGFuTW9kZSh6ZGV2X3QqIGRldiwgdThfdCB3bGFuTW9kZSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0QXV0aGVudGljYXRpb25Nb2RlKHpkZXZfdCogZGV2LCB1OF90IGF1dGhNb2RlKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRXZXBTdGF0dXMoemRldl90KiBkZXYsIHU4X3Qgd2VwU3RhdHVzKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRTU0lEKHpkZXZfdCogZGV2LCB1OF90KiBzc2lkLCB1OF90IHNzaWRMZW5ndGgpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldEZyYWdUaHJlc2hvbGQoemRldl90KiBkZXYsIHUxNl90IGZyYWdUaHJlc2hvbGQpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldFJ0c1RocmVzaG9sZCh6ZGV2X3QqIGRldiwgdTE2X3QgcnRzVGhyZXNob2xkKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRGcmVxdWVuY3koemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSwgdThfdCBiSW1tZWRpYXRlKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRCc3NpZCh6ZGV2X3QqIGRldiwgdThfdCogYnNzaWQpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldEJlYWNvbkludGVydmFsKHpkZXZfdCogZGV2LCB1MTZfdCBiZWFjb25JbnRlcnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4X3QgYkltbWVkaWF0ZSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0RHRpbUNvdW50KHpkZXZfdCogZGV2LCB1OF90ICBkdGltKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRBdGltV2luZG93KHpkZXZfdCogZGV2LCB1MTZfdCBhdGltV2luZG93LCB1OF90IGJJbW1lZGlhdGUpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldEVuY3J5TW9kZSh6ZGV2X3QqIGRldiwgdThfdCBlbmNyeU1vZGUpOworZXh0ZXJuIHU4X3QgemZpV2xhblNldEtleSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzS2V5SW5mbyBrZXlJbmZvKTsKK2V4dGVybiB1OF90IHpmaVdsYW5QU0VVRE9TZXRLZXkoemRldl90KiBkZXYsIHN0cnVjdCB6c0tleUluZm8ga2V5SW5mbyk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0UG93ZXJTYXZlTW9kZSh6ZGV2X3QqIGRldiwgdThfdCBtb2RlKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5RdWVyeUJzc0xpc3RWMSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzQnNzTGlzdFYxKiBic3NMaXN0VjEpOworZXh0ZXJuIHZvaWQgemZpV2xhblF1ZXJ5QnNzTGlzdCh6ZGV2X3QqIGRldiwgc3RydWN0IHpzQnNzTGlzdCogcEJzc0xpc3QpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldFByb3RlY3Rpb25Nb2RlKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpOworZXh0ZXJuIHZvaWQgemZpV2xhbkZsdXNoQnNzTGlzdCh6ZGV2X3QqIGRldik7CisKK3ZvaWQgemZpV2xhbkRpc2FibGVEZnNDaGFubmVsKHpkZXZfdCogZGV2LCB1OF90IGRpc2FibGVGbGFnKTsKKworZXh0ZXJuIHU4X3QgemZpV2xhblF1ZXJ5V2xhbk1vZGUoemRldl90KiBkZXYpOworZXh0ZXJuIHUxNl90IHpmaVdsYW5DaGFubmVsVG9GcmVxdWVuY3koemRldl90KiBkZXYsIHU4X3QgY2hhbm5lbCk7CitleHRlcm4gdThfdCB6ZmlXbGFuRnJlcXVlbmN5VG9DaGFubmVsKHpkZXZfdCogZGV2LCB1MTZfdCBmcmVxKTsKKworI2RlZmluZSBaTV9XTEFOX1NUQVRFX09QRU5FRCAgICAgICAgMAorI2RlZmluZSBaTV9XTEFOX1NUQVRFX0VOQUJMRUQgICAgICAgMQorI2RlZmluZSBaTV9XTEFOX1NUQVRFX0RJU0FCTEVEICAgICAgMgorI2RlZmluZSBaTV9XTEFOX1NUQVRFX0NMT1NFREVEICAgICAgMworZXh0ZXJuIHU4X3QgemZpV2xhblF1ZXJ5QWRhcHRlclN0YXRlKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1OF90IHpmaVdsYW5RdWVyeUF1dGhlbnRpY2F0aW9uTW9kZSh6ZGV2X3QqIGRldiwgdThfdCBiV3JhcHBlcik7CitleHRlcm4gdThfdCB6ZmlXbGFuUXVlcnlXZXBTdGF0dXMoemRldl90KiBkZXYsIHU4X3QgYldyYXBwZXIpOworZXh0ZXJuIHZvaWQgemZpV2xhblF1ZXJ5U1NJRCh6ZGV2X3QqIGRldiwgdThfdCogc3NpZCwgdThfdCogcFNzaWRMZW5ndGgpOworZXh0ZXJuIHUxNl90IHpmaVdsYW5RdWVyeUZyYWdUaHJlc2hvbGQoemRldl90KiBkZXYpOworZXh0ZXJuIHUxNl90IHpmaVdsYW5RdWVyeVJ0c1RocmVzaG9sZCh6ZGV2X3QqIGRldik7CitleHRlcm4gdTMyX3QgemZpV2xhblF1ZXJ5RnJlcXVlbmN5KHpkZXZfdCogZGV2KTsKK2V4dGVybiB1MzJfdCB6ZmlXbGFuUXVlcnlDdXJyZW50RnJlcXVlbmN5KHpkZXZfdCogZGV2LCB1OF90IHFtb2RlKTsKK2V4dGVybiB1MzJfdCB6ZmlXbGFuUXVlcnlGcmVxdWVuY3lBdHRyaWJ1dGUoemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlGcmVxdWVuY3lIVCh6ZGV2X3QqIGRldiwgdTMyX3QgKmJhbmRXaWR0aCwgdTMyX3QgKmV4dE9mZnNldCk7CitleHRlcm4gdThfdCB6ZmlXbGFuUXVlcnlDV01vZGUoemRldl90KiBkZXYpOworZXh0ZXJuIHUzMl90IHpmaVdsYW5RdWVyeUNXRW5hYmxlKHpkZXZfdCogZGV2KTsKK2V4dGVybiB2b2lkIHpmaVdsYW5RdWVyeUJzc2lkKHpkZXZfdCogZGV2LCB1OF90KiBic3NpZCk7CitleHRlcm4gdTE2X3QgemZpV2xhblF1ZXJ5QmVhY29uSW50ZXJ2YWwoemRldl90KiBkZXYpOworZXh0ZXJuIHUzMl90IHpmaVdsYW5RdWVyeVJ4QmVhY29uVG90YWwoemRldl90KiBkZXYpOworZXh0ZXJuIHUxNl90IHpmaVdsYW5RdWVyeUF0aW1XaW5kb3coemRldl90KiBkZXYpOworZXh0ZXJuIHU4X3QgemZpV2xhblF1ZXJ5RW5jcnlNb2RlKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1MTZfdCB6ZmlXbGFuUXVlcnlDYXBhYmlsaXR5KHpkZXZfdCogZGV2KTsKK2V4dGVybiB1MTZfdCB6ZmlXbGFuUXVlcnlBaWQoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZpV2xhblF1ZXJ5U3VwcG9ydFJhdGUoemRldl90KiBkZXYsIHU4X3QqIHJhdGVBcnJheSwgdThfdCogcExlbmd0aCk7CitleHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlFeHRTdXBwb3J0UmF0ZSh6ZGV2X3QqIGRldiwgdThfdCogcmF0ZUFycmF5LCB1OF90KiBwTGVuZ3RoKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5RdWVyeVJzbkllKHpkZXZfdCogZGV2LCB1OF90KiBpZSwgdThfdCogcExlbmd0aCk7CitleHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlXcGFJZSh6ZGV2X3QqIGRldiwgdThfdCogaWUsIHU4X3QqIHBMZW5ndGgpOworZXh0ZXJuIHU4X3QgemZpV2xhblF1ZXJ5SFRNb2RlKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1OF90IHpmaVdsYW5RdWVyeUJhbmRXaWR0aDQwKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1OF90IHpmaVdsYW5RdWVyeU11bHRpY2FzdENpcGhlckFsZ28oemRldl90ICpkZXYpOworZXh0ZXJuIHUxNl90IHpmaVdsYW5RdWVyeVJlZ2lvbkNvZGUoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldFdwYUllKHpkZXZfdCogZGV2LCB1OF90KiBpZSwgdThfdCBMZW5ndGgpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldFdwYVN1cHBvcnQoemRldl90KiBkZXYsIHU4X3QgV3BhU3VwcG9ydCk7CitleHRlcm4gdm9pZCB6ZmlXbGFuQ2hlY2tTdGFXcGFJZSh6ZGV2X3QqIGRldik7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0QmFzaWNSYXRlKHpkZXZfdCogZGV2LCB1OF90IGJSYXRlU2V0LCB1OF90IGdSYXRlU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90IG5SYXRlU2V0KTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRCR01vZGUoemRldl90KiBkZXYsIHU4X3QgbW9kZSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0cHJlYW1ibGVUeXBlKHpkZXZfdCogZGV2LCB1OF90IHR5cGUpOworZXh0ZXJuIHU4X3QgemZpV2xhblF1ZXJ5cHJlYW1ibGVUeXBlKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1OF90IHpmaVdsYW5RdWVyeVBvd2VyU2F2ZU1vZGUoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldE1hY0FkZHJlc3MoemRldl90KiBkZXYsIHUxNl90KiBtYWMpOworZXh0ZXJuIHUxNl90IHpmaVdsYW5TZXRUeFJhdGUoemRldl90KiBkZXYsIHUxNl90IHJhdGUpOworZXh0ZXJuIHUzMl90IHpmaVdsYW5RdWVyeVR4UmF0ZSh6ZGV2X3QqIGRldik7CitleHRlcm4gdm9pZCB6ZldsYW5VcGRhdGVSeFJhdGUoemRldl90KiBkZXYsIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogYWRkSW5mbyk7CitleHRlcm4gdTMyX3QgemZpV2xhblF1ZXJ5UnhSYXRlKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1OF90IHpmaVdsYW5TZXRQbWtpZEluZm8oemRldl90KiBkZXYsIHUxNl90KiBic3NpZCwgdThfdCogcG1raWQpOworZXh0ZXJuIHUzMl90IHpmaVdsYW5RdWVyeVBta2lkSW5mbyh6ZGV2X3QqIGRldiwgdThfdCogYnVmLCB1MzJfdCBsZW4pOworZXh0ZXJuIHZvaWQgemZpV2xhblNldEFsbE11bHRpY2FzdCh6ZGV2X3QqIGRldiwgdTMyX3Qgc2V0dGluZyk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0SFRDdHJsKHpkZXZfdCogZGV2LCB1MzJfdCAqc2V0dGluZywgdTMyX3QgZm9yY2VUeFRQQyk7CitleHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlIVEN0cmwoemRldl90KiBkZXYsIHUzMl90ICpzZXR0aW5nLCB1MzJfdCAqZm9yY2VUeFRQQyk7CitleHRlcm4gdm9pZCB6ZmlXbGFuRGJnKHpkZXZfdCogZGV2LCB1OF90IHNldHRpbmcpOworCitleHRlcm4gdm9pZCB6ZmlXbGFuUmVzZXRUYWxseSh6ZGV2X3QqIGRldik7CitleHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlUYWxseSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzQ29tbVRhbGx5ICp0YWxseSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlUcmFmVGFsbHkoemRldl90KiBkZXYsIHN0cnVjdCB6c1RyYWZUYWxseSAqdGFsbHkpOworZXh0ZXJuIHZvaWQgemZpV2xhblF1ZXJ5TW9uSGFsUnhJbmZvKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNNb25IYWxSeEluZm8gKmhhbFJ4SW5mbyk7CisKK2V4dGVybiB1MzJfdCB6ZmlGV0NvbmZpZyh6ZGV2X3QqIGRldiwgdTMyX3Qgc2l6ZSk7CisKK2V4dGVybiB2b2lkIHpmaURLRW5hYmxlKHpkZXZfdCogZGV2LCB1MzJfdCBlbmFibGUpOworCitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0TXVsdGljYXN0TGlzdCh6ZGV2X3QqIGRldiwgdThfdCBzaXplLCB1OF90KiBwTGlzdCk7CitleHRlcm4gdm9pZCB6ZmlXbGFuUmVtb3ZlS2V5KHpkZXZfdCogZGV2LCB1OF90IGtleVR5cGUsIHU4X3Qga2V5SWQpOworZXh0ZXJuIHU4X3QgemZpV2xhblF1ZXJ5SXNQS0luc3RhbGxlZCh6ZGV2X3QgKmRldiwgdThfdCAqc3RhTWFjQWRkcik7CitleHRlcm4gdTMyX3QgemZpV2xhblF1ZXJ5UGFja2V0VHlwZVByb21pc2N1b3VzKHpkZXZfdCogZGV2KTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRQYWNrZXRUeXBlUHJvbWlzY3VvdXMoemRldl90KiBkZXYsIHUzMl90IHNldFZhbHVlKTsKK2V4dGVybiB2b2lkIHpmaVNldENoYW5uZWxNYW5hZ2VtZW50KHpkZXZfdCogZGV2LCB1MzJfdCBzZXR0aW5nKTsKK2V4dGVybiB2b2lkIHpmaVNldFJpZnMoemRldl90KiBkZXYsIHUxNl90IHNldHRpbmcpOworZXh0ZXJuIHZvaWQgemZpQ2hlY2tSaWZzKHpkZXZfdCogZGV2KTsKK2V4dGVybiB2b2lkIHpmaVNldFJlb3JkZXIoemRldl90KiBkZXYsIHUxNl90IHZhbHVlKTsKK2V4dGVybiB2b2lkIHpmaVNldFNlcURlYnVnKHpkZXZfdCogZGV2LCB1MTZfdCB2YWx1ZSk7CisKK2V4dGVybiB1MTZfdCB6ZmlDb25maWdXZHNQb3J0KHpkZXZfdCogZGV2LCB1OF90IHdkc1BvcnRJZCwgdTE2X3QgZmxhZywgdTE2X3QqIHdkc0FkZHIsCisgICAgICAgIHUxNl90IGVuY1R5cGUsIHUzMl90KiB3ZHNLZXkpOworZXh0ZXJuIHZvaWQgemZpV2xhblF1ZXJ5UmVndWxhdGlvblRhYmxlKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNSZWd1bGF0aW9uVGFibGUqIHBFbnRyeSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0U2NhblRpbWVyUGVyQ2hhbm5lbCh6ZGV2X3QqIGRldiwgdTE2X3QgdGltZSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0QXV0b1JlY29ubmVjdCh6ZGV2X3QqIGRldiwgdThfdCBlbmFibGUpOworZXh0ZXJuIHUzMl90IHpmaURlYnVnQ21kKHpkZXZfdCogZGV2LCB1MzJfdCBjbWQsIHUzMl90IHZhbHVlKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRQcm9iaW5nSGlkZGVuU3NpZCh6ZGV2X3QqIGRldiwgdThfdCogc3NpZCwgdThfdCBzc2lkTGVuLAorICAgIHUxNl90IGVudHJ5KTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXREcm9wVW5lbmNyeXB0ZWRQYWNrZXRzKHpkZXZfdCogZGV2LCB1OF90IGVuYWJsZSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0SUJTU0pvaW5Pbmx5KHpkZXZfdCogZGV2LCB1OF90IGpvaW5Pbmx5KTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXREZWZhdWx0S2V5SWQoemRldl90KiBkZXYsIHU4X3Qga2V5SWQpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldERpc2FibGVQcm9iaW5nV2l0aFNzaWQoemRldl90KiBkZXYsIHU4X3QgbW9kZSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlHU04oemRldl90KiBkZXYsIHU4X3QgKmdzbiwgdTE2X3QgdmFwSWQpOworZXh0ZXJuIHUxNl90IHpmaVN0YUFkZEllV3BhUnNuKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGZyYW1lVHlwZSk7CitleHRlcm4gdThfdCB6ZmlXbGFuU2V0RG90MTFETW9kZSh6ZGV2X3QqIGRldiwgdThfdCBtb2RlKTsKK2V4dGVybiB1OF90IHpmaVdsYW5TZXREb3QxMUhERlNNb2RlKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpOworZXh0ZXJuIHU4X3QgemZpV2xhblNldERvdDExSFRQQ01vZGUoemRldl90KiBkZXYsIHU4X3QgbW9kZSk7CitleHRlcm4gdThfdCB6ZmlXbGFuU2V0QW5pTW9kZSh6ZGV2X3QqIGRldiwgdThfdCBtb2RlKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRTdGFXbWUoemRldl90KiBkZXYsIHU4X3QgZW5hYmxlLCB1OF90IHVhcHNkSW5mbyk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0QXBXbWUoemRldl90KiBkZXYsIHU4X3QgZW5hYmxlKTsKK2V4dGVybiB1OF90IHpmaVdsYW5RdWVyeXdtZUVuYWJsZSh6ZGV2X3QqIGRldik7CisjaWZkZWYgWk1fT1NfTElOVVhfRlVOQworZXh0ZXJuIHZvaWQgemZpV2xhblNob3dUYWxseSh6ZGV2X3QqIGRldik7CisjZW5kaWYKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworLyogQ0VOQyAqLworZXh0ZXJuIHU4X3QgemZpV2xhblNldENlbmNQYWlyd2lzZUtleSh6ZGV2X3QqIGRldiwgdThfdCBrZXlpZCwgdTMyX3QgKnR4aXYsIHUzMl90ICpyeGl2LAorICAgICAgICB1OF90ICprZXksIHU4X3QgKm1pYyk7CitleHRlcm4gdThfdCB6ZmlXbGFuU2V0Q2VuY0dyb3VwS2V5KHpkZXZfdCogZGV2LCB1OF90IGtleWlkLCB1MzJfdCAqcnhpdiwKKyAgICAgICAgdThfdCAqa2V5LCB1OF90ICptaWMpOworI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKK2V4dGVybiB2b2lkIHpmaVdsYW5RdWVyeVNpZ25hbEluZm8oemRldl90KiBkZXYsIHU4X3QgKmJ1ZmZlcik7CitleHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlBZEhvY0NyZWF0ZWRCc3NEZXNjKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNCc3NJbmZvICpwQnNzSW5mbyk7CitleHRlcm4gdThfdCB6ZmlXbGFuUXVlcnlBZEhvY0lzQ3JlYXRvcih6ZGV2X3QqIGRldik7CitleHRlcm4gdTMyX3QgemZpV2xhblF1ZXJ5U3VwcG9ydE1vZGUoemRldl90KiBkZXYpOworZXh0ZXJuIHUzMl90IHpmaVdsYW5RdWVyeVRyYW5zbWl0UG93ZXIoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZpV2xhbkVuYWJsZUxlYXBDb25maWcoemRldl90KiBkZXYsIHU4X3QgbGVhcEVuYWJsZWQpOworCisvKiByZXR1cm5lZCBidWZmZXIgYWxsb2NhdGVkIGJ5IGRyaXZlciBjb3JlICovCitleHRlcm4gdm9pZCB6ZmlSZWN2RXRoQ29tcGxldGUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKKworZXh0ZXJuIHZvaWQgemZpUmVjdjgwMjExKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBhZGRJbmZvKTsKKworZXh0ZXJuIHZvaWQgemZpV2xhblNldE1heFR4UG93ZXIoemRldl90KiBkZXYsIHU4X3QgcG93ZXIyLCB1OF90IHBvd2VyNSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlNYXhUeFBvd2VyKHpkZXZfdCogZGV2LCB1OF90ICpwb3dlcjIsIHU4X3QgKnBvd2VyNSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0Q29ubmVjdE1vZGUoemRldl90KiBkZXYsIHU4X3QgbW9kZSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0U3VwcG9ydE1vZGUoemRldl90KiBkZXYsIHUzMl90IG1vZGUpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldEFkaG9jTW9kZSh6ZGV2X3QqIGRldiwgdTMyX3QgbW9kZSk7CitleHRlcm4gdTMyX3QgemZpV2xhblF1ZXJ5QWRob2NNb2RlKHpkZXZfdCogZGV2LCB1OF90IGJXcmFwcGVyKTsKK2V4dGVybiB1OF90IHpmaVdsYW5TZXRDb3VudHJ5SXNvTmFtZSh6ZGV2X3QqIGRldiwgdThfdCAqY291bnRyeUlzb05hbWUsIHU4X3QgbGVuZ3RoKTsKK2V4dGVybiBjb25zdCBjaGFyKiB6ZmlXbGFuUXVlcnlDb3VudHJ5SXNvTmFtZSh6ZGV2X3QqIGRldik7CitleHRlcm4gdThfdCB6ZmlXbGFuUXVlcnlyZWd1bGF0b3J5RG9tYWluKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1OF90IHpmaVdsYW5RdWVyeUNDUyh6ZGV2X3QqIGRldik7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0Q0NTKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldFJlZ3VsYXRvcnkoemRldl90KiBkZXYsIHU4X3QgQ0NTLCB1MTZfdCBDb2RlLCB1OF90IGJmaXJzdENoYW5uZWwpOworZXh0ZXJuIGNvbnN0IGNoYXIqIHpmaUhwR2V0aXNvTmFtZWZyb21yZWdpb25Db2RlKHpkZXZfdCogZGV2LCB1MTZfdCByZWdpb25Db2RlKTsKK2V4dGVybiB2b2lkICB6ZmlXbGFuU2V0TEVEQ3RybFBhcmFtKHpkZXZfdCogZGV2LCB1OF90IHR5cGUsIHU4X3QgZmxhZyk7CitleHRlcm4gdTMyX3QgemZpV2xhblF1ZXJ5UmVjZWl2ZWRQYWNrZXQoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZpV2xhbkNoZWNrU1dFbmNyeXB0aW9uKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1MTZfdCB6ZmlXbGFuUXVlcnlBbGxvd0NoYW5uZWxzKHpkZXZfdCAqZGV2LCB1MTZfdCAqY2hhbm5lbHMpOworZXh0ZXJuIHUxNl90IHpmaVdsYW5HZXRNdWx0aWNhc3RBZGRyZXNzQ291bnQoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZpV2xhbkdldE11bHRpY2FzdExpc3QoemRldl90KiBkZXYsIHU4X3QqIHBNQ0xpc3QpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldFBhY2tldEZpbHRlcih6ZGV2X3QqIGRldiwgdTMyX3QgUGFja2V0RmlsdGVyKTsKK2V4dGVybiB1OF90IHpmaUNvbXBhcmVXaXRoTXVsdGljYXN0TGlzdEFkZHJlc3MoemRldl90KiBkZXYsIHUxNl90KiBkc3RNYWNBZGRyKTsKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXRTYWZlTW9kZUVuYWJsZWQoemRldl90KiBkZXYsIHU4X3Qgc2FmZU1vZGUpOworZXh0ZXJuIHZvaWQgemZpV2xhblNldElCU1NBZGRpdGlvbmFsSUVMZW5ndGgoemRldl90KiBkZXYsIHUzMl90IGlic3NBZGRpdGlvbmFsSUVTaXplLCAgdThfdCogaWJzc0FkZGl0aW9uYWxJRSk7CitleHRlcm4gdm9pZCB6ZmlXbGFuU2V0WExpbmtNb2RlKHpkZXZfdCogZGV2LCB1MzJfdCBzZXRWYWx1ZSk7CisKKy8qIGhwcncuYyAqLworZXh0ZXJuIHUzMl90IHpmaURiZ1dyaXRlRmxhc2goemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCk7CitleHRlcm4gdTMyX3QgemZpRGJnV3JpdGVSZWcoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCk7CitleHRlcm4gdTMyX3QgemZpRGJnUmVhZFJlZyh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkcik7CisKK2V4dGVybiB1MzJfdCB6ZmlEYmdXcml0ZUVlcHJvbSh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QgdmFsKTsKK2V4dGVybiB1MzJfdCB6ZmlEYmdCbG9ja1dyaXRlRWVwcm9tKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCogYnVmKTsKK2V4dGVybiB1MzJfdCB6ZmlEYmdCbG9ja1dyaXRlRWVwcm9tX3YyKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCogYnVmLCB1MzJfdCB3cmxlbik7CisKK2V4dGVybiB1MTZfdCB6ZmlEYmdDaGlwRXJhc2VGbGFzaCh6ZGV2X3QgKmRldik7CitleHRlcm4gdTE2X3QgemZpRGJnUHJvZ3JhbUZsYXNoKHpkZXZfdCAqZGV2LCB1MzJfdCBvZmZzZXQsIHUzMl90IGxlbiwgdTMyX3QgKmRhdGEpOworZXh0ZXJuIHUzMl90IHpmaURiZ0dldEZsYXNoQ2hlY2tTdW0oemRldl90ICpkZXYsIHUzMl90IGFkZHIsIHUzMl90IGxlbik7CitleHRlcm4gdTMyX3QgemZpRGJnUmVhZEZsYXNoKHpkZXZfdCAqZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCBsZW4pOworZXh0ZXJuIHUzMl90IHpmaURvd25sb2FkRndTZXQoemRldl90ICpkZXYpOworCitleHRlcm4gdTMyX3QgemZpRGJnRGVsYXlXcml0ZVJlZyh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QgdmFsKTsKK2V4dGVybiB1MzJfdCB6ZmlEYmdGbHVzaERlbGF5V3JpdGUoemRldl90KiBkZXYpOworCitleHRlcm4gdTMyX3QgemZpRGJnU2V0SUZTeW50aGVzaXplcih6ZGV2X3QqIGRldiwgdTMyX3QgdmFsdWUpOworZXh0ZXJuIHUzMl90IHpmaURiZ1JlYWRUYWxseSh6ZGV2X3QqIGRldik7CisKK2V4dGVybiB1MzJfdCB6ZmlEYmdRdWVyeUh3VHhCdXN5KHpkZXZfdCogZGV2KTsKKworZXh0ZXJuIHU4X3QgemZpV2xhbkdldERlc3RBZGRyRnJvbUJ1Zih6ZGV2X3QgKmRldiwgemJ1Zl90ICpidWYsIHUxNl90ICptYWNBZGRyKTsKKworZXh0ZXJuIHUzMl90IHpmaVdsYW5RdWVyeUh3Q2FwYWJpbGl0eSh6ZGV2X3QqIGRldik7CisKK2V4dGVybiB2b2lkIHpmaVdsYW5TZXREeW5hbWljU0lGU1BhcmFtKHpkZXZfdCogZGV2LCB1OF90IHZhbCk7CisKKy8qKioqKiBFbmQgb2Ygc2VjdGlvbiAyICoqKioqLworCisvKioqKiogc2VjdGlvbiAzIHBlcmZvcm1hY2UgZXZhbHVhdGlvbiAqKioqKi8KKyNpZmRlZiBaTV9FTkFCTEVfUEVSRk9STUFOQ0VfRVZBTFVBVElPTgorZXh0ZXJuIHZvaWQgemZpVHhQZXJmb3JtYW5jZU1TRFUoemRldl90KiBkZXYsIHUzMl90IHRpY2spOworZXh0ZXJuIHZvaWQgemZpUnhQZXJmb3JtYW5jZU1QRFUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK2V4dGVybiB2b2lkIHpmaVJ4UGVyZm9ybWFuY2VSZWcoemRldl90KiBkZXYsIHUzMl90IHJlZywgdTMyX3QgcnNwKTsKKyNkZWZpbmUgWk1fUEVSRk9STUFOQ0VfSU5JVChkZXYpICAgICAgICAgICAgICAgIHpmaVBlcmZvcm1hbmNlSW5pdChkZXYpOworI2RlZmluZSBaTV9QRVJGT1JNQU5DRV9UWF9NU0RVKGRldiwgdGljaykgICAgICAgemZpVHhQZXJmb3JtYW5jZU1TRFUoZGV2LCB0aWNrKTsKKyNkZWZpbmUgWk1fUEVSRk9STUFOQ0VfUlhfTVNEVShkZXYsIHRpY2spICAgICAgIHpmaVJ4UGVyZm9ybWFuY2VNU0RVKGRldiwgdGljayk7CisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1RYX01QRFUoZGV2LCB0aWNrKSAgICAgICB6ZmlUeFBlcmZvcm1hbmNlTVBEVShkZXYsIHRpY2spOworI2RlZmluZSBaTV9QRVJGT1JNQU5DRV9SWF9NUERVKGRldiwgYnVmKSAgICAgICAgemZpUnhQZXJmb3JtYW5jZU1QRFUoZGV2LCBidWYpOworI2RlZmluZSBaTV9QRVJGT1JNQU5DRV9SWF9TRVEoZGV2LCBidWYpICAgICAgICAgemZpUnhQZXJmb3JtYW5jZVNlcShkZXYsIGJ1Zik7CisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1JFRyhkZXYsIHJlZywgcnNwKSAgICB7aWYoY21kWzFdID09IHJlZykgemZpUnhQZXJmb3JtYW5jZVJlZyhkZXYsIHJlZywgcnNwKTt9CisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX0RVUChkZXYsIGJ1ZjEsIGJ1ZjIpICAgICB6ZmlSeFBlcmZvcm1hbmNlRHVwKGRldiwgYnVmMSwgYnVmMik7CisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX0ZSRUUoZGV2LCBidWYpICAgICAgICAgICB6ZmlSeFBlcmZvcm1hbmNlRnJlZShkZXYsIGJ1Zik7CisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1JYX0FNU0RVKGRldiwgYnVmLCBsZW4pICB6ZmlSeFBlcmZvcm1hbmNlQU1TRFUoZGV2LCBidWYsIGxlbik7CisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1JYX0ZMVVNIKGRldikgICAgICAgICAgICB6ZmlSeFBlcmZvcm1hbmNlRmx1c2goZGV2KTsKKyNkZWZpbmUgWk1fUEVSRk9STUFOQ0VfUlhfQ0xFQVIoZGV2KSAgICAgICAgICAgIHpmaVJ4UGVyZm9ybWFuY2VDbGVhcihkZXYpOworI2RlZmluZSBaTV9TRVFfREVCVUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdkLT5zZXFfZGVidWcpIERiZ1ByaW50CisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1JYX1JFT1JERVIoZGV2KSAgICAgICAgICB6ZmlSeFBlcmZvcm1hbmNlUmVvcmRlcihkZXYpOworI2Vsc2UKKyNkZWZpbmUgWk1fUEVSRk9STUFOQ0VfSU5JVChkZXYpCisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1RYX01TRFUoZGV2LCB0aWNrKQorI2RlZmluZSBaTV9QRVJGT1JNQU5DRV9SWF9NU0RVKGRldiwgdGljaykKKyNkZWZpbmUgWk1fUEVSRk9STUFOQ0VfVFhfTVBEVShkZXYsIHRpY2spCisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1JYX01QRFUoZGV2LCBidWYpCisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1JYX1NFUShkZXYsIGJ1ZikKKyNkZWZpbmUgWk1fUEVSRk9STUFOQ0VfUkVHKGRldiwgcmVnLCByc3ApCisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX0RVUChkZXYsIGJ1ZjEsIGJ1ZjIpCisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX0ZSRUUoZGV2LCBidWYpCisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1JYX0FNU0RVKGRldiwgYnVmLCBsZW4pCisjZGVmaW5lIFpNX1BFUkZPUk1BTkNFX1JYX0ZMVVNIKGRldikKKyNkZWZpbmUgWk1fUEVSRk9STUFOQ0VfUlhfQ0xFQVIoZGV2KQorI2RlZmluZSBaTV9TRVFfREVCVUcKKyNkZWZpbmUgWk1fUEVSRk9STUFOQ0VfUlhfUkVPUkRFUihkZXYpCisjZW5kaWYKKy8qKioqKiBFbmQgb2Ygc2VjdGlvbiAzICoqKioqLworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvcHViX3pmdy5oIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3B1Yl96ZncuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDc0YmI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3B1Yl96ZncuaApAQCAtMCwwICsxLDkzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfUFVCX1pGV19ICisjZGVmaW5lIF9QVUJfWkZXX0gKKworI2luY2x1ZGUgIi4uL29hbF9kdC5oIgorCisKKy8qIEJ1ZmZlciBtYW5hZ2VtZW50ICovCisjaWZkZWYgWk1fRU5BQkxFX0JVRkZFUl9ERUJVRworZXh0ZXJuIHpidWZfdCogemZ3QnVmQWxsb2NhdGVXaXRoQ29udGV4dCh6ZGV2X3QqIGRldiwgdTE2X3QgbGVuLCB1OF90ICpmdW5jdGlvbk5hbWUsIFVMT05HIGxpbmUpOworI2RlZmluZSB6ZndCdWZBbGxvY2F0ZShkZXYsIGxlbikgIHpmd0J1ZkFsbG9jYXRlV2l0aENvbnRleHQoZGV2LCBsZW4sICh1OF90ICopX19mdW5jX18sIF9fTElORV9fKQorI2Vsc2UKK2V4dGVybiB6YnVmX3QqIHpmd0J1ZkFsbG9jYXRlKHpkZXZfdCogZGV2LCB1MTZfdCBsZW4pOworI2VuZGlmCitleHRlcm4gdm9pZCB6ZndCdWZGcmVlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgZXJyQ29kZSk7CitleHRlcm4gdTE2X3QgemZ3QnVmQ2hhaW4oemRldl90KiBkZXYsIHpidWZfdCoqIGhlYWQsIHpidWZfdCogdGFpbCk7CitleHRlcm4gdTE2X3QgemZ3QnVmQ29weSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBkc3QsIHpidWZfdCogc3JjKTsKK2V4dGVybiB1MTZfdCB6ZndCdWZTZXRTaXplKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgc2l6ZSk7CitleHRlcm4gdTE2X3QgemZ3QnVmUmVtb3ZlSGVhZCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IHNpemUpOworZXh0ZXJuIHUxNl90IHpmd0J1ZkdldFNpemUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKK2V4dGVybiB2b2lkICB6ZndDb3B5QnVmQ29udGV4dCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBzb3VyY2UsIHpidWZfdCogZGVzdCk7CisKKy8qIE1lbW9yeSBtYW5hZ2VtZW50ICovCitleHRlcm4gdm9pZCogemZ3TWVtQWxsb2NhdGUoemRldl90KiBkZXYsIHUzMl90IHNpemUpOworZXh0ZXJuIHZvaWQgemZ3TWVtRnJlZSh6ZGV2X3QqIGRldiwgdm9pZCogbWVtLCB1MzJfdCBzaXplKTsKK2V4dGVybiB2b2lkIHpmd01lbW9yeUNvcHkodThfdCogZHN0LCB1OF90KiBzcmMsIHUxNl90IGxlbmd0aCk7CitleHRlcm4gdm9pZCB6ZndNZW1vcnlNb3ZlKHU4X3QqIGRzdCwgdThfdCogc3JjLCB1MTZfdCBsZW5ndGgpOworZXh0ZXJuIHZvaWQgemZ3WmVyb01lbW9yeSh1OF90KiB2YSwgdTE2X3QgbGVuZ3RoKTsKK2V4dGVybiB1OF90IHpmd01lbW9yeUlzRXF1YWwodThfdCogbTEsIHU4X3QqIG0yLCB1MTZfdCBsZW5ndGgpOworCisvKiBPdGhlcnMgKi8KK2V4dGVybiB2b2lkIHpmd1NsZWVwKHpkZXZfdCogZGV2LCB1MzJfdCBtcyk7CitleHRlcm4gdTE2X3QgemZ3R2V0VmFwSWQoemRldl90KiBkZXYpOworZXh0ZXJuIHUxNl90IHpmd1N0YUFkZEllV3BhUnNuKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGZyYW1lVHlwZSk7CitleHRlcm4gdTMyX3QgemZ3V2FpdEZvckV2ZW50KHpkZXZfdCAqZGV2LCB1MzJfdCBldmVudCwgdTMyX3QgdGltZW91dCk7CitleHRlcm4gdm9pZCB6ZndTZW5kRXZlbnQoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZ3R2V0QWN0aXZlU2NhbkR1cih6ZGV2X3QqIGRldiwgdThfdCogRHVyICk7CitleHRlcm4gdm9pZCB6ZndHZXRTaG93WmVyb0xlbmd0aFNTSUQoemRldl90KiBkZXYsIHU4X3QqIER1ciApOworLyogRm9yIGRlYnVnZ2luZyAqLworZXh0ZXJuIHZvaWQgemZ3RHVtcEJ1Zih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworZXh0ZXJuIHZvaWQgemZ3RGJnUmVhZFJlZ0RvbmUoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCk7CisvKiBGb3IgRXZsICovCitleHRlcm4gdm9pZCB6ZndEYmdEb3dubG9hZEZ3SW5pdERvbmUoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZ3RGJnUmVhZEZsYXNoRG9uZSh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QqIHJzcGRhdGEsIHUzMl90IGRhdGFsZW4pOworZXh0ZXJuIHZvaWQgemZ3RGJnR2V0Rmxhc2hDaGtTdW1Eb25lKHpkZXZfdCogZGV2LCB1MzJfdCogcnNwZGF0YSk7CitleHRlcm4gdm9pZCB6ZndEYmdQcm9ncmFtZUZsYXNoRG9uZSh6ZGV2X3QqIGRldik7CitleHRlcm4gdm9pZCB6ZndEYmdQcm9ncmFtZUZsYXNoQ2hrRG9uZSh6ZGV2X3QqIGRldik7CitleHRlcm4gdm9pZCB6ZndEYmdXcml0ZVJlZ0RvbmUoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCk7CitleHRlcm4gdm9pZCB6ZndEYmdXcml0ZUVlcHJvbURvbmUoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCk7CitleHRlcm4gdm9pZCB6ZndEYmdSZWFkVGFsbHlEb25lKHpkZXZfdCogZGV2KTsKK2V4dGVybiB2b2lkIHpmd1dsYW5SZWFkUmVnRG9uZSh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QgdmFsKTsKK2V4dGVybiB2b2lkIHpmd1dsYW5Xcml0ZVJlZ0RvbmUoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCk7CitleHRlcm4gdm9pZCB6ZndXbGFuUmVhZFRhbGx5RG9uZSh6ZGV2X3QqIGRldik7CitleHRlcm4gdm9pZCB6ZndEYmdRdWVyeUh3VHhCdXN5RG9uZSh6ZGV2X3QqIGRldiwgdTMyX3QgdmFsKTsKK2V4dGVybiB1MzJfdCB6ZndSZWFkUmVnKHpkZXZfdCogZGV2LCB1MzJfdCBvZmZzZXQpOworZXh0ZXJuIHUzMl90IHpmd1JlYWRFZXByb20oemRldl90KiBkZXYsIHUzMl90IGFkZHIpOworCisvKiBSZXNlcnZlZCBmb3IgVmlzdGEsIHBsZWFzZSByZXR1cm4gMCAqLworZXh0ZXJuIHU4X3QgemZ3R2V0UGt0RW5jRXhlbXB0aW9uQWN0aW9uVHlwZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworCisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKy8qIFJlc2VydmVkIGZvciBDRU5DLCBwbGVhc2UgcmV0dXJuIDAgKi8KK2V4dGVybiB1OF90IHpmd0NlbmNIYW5kbGVCZWFjb25Qcm9icmVzcG9uKHpkZXZfdCogZGV2LCB1OF90ICpwV0lFYywKKyAgICAgICAgdThfdCAqcFBlZXJTU0lEYywgdThfdCAqcFBlZXJBZGRyYyk7CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworCisjaWZkZWYgWk1fSEFMUExVU19MT0NLCitleHRlcm4gYXNtbGlua2FnZSBzdHJ1Y3QgenNXbGFuRGV2ICp6ZndHZXRXbGFuRGV2KHpkZXZfdCogZGV2KTsKK2V4dGVybiBhc21saW5rYWdlIHZvaWQgemZ3RW50ZXJDcml0aWNhbFNlY3Rpb24oemRldl90KiBkZXYpOworZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCB6ZndMZWF2ZUNyaXRpY2FsU2VjdGlvbih6ZGV2X3QqIGRldik7CitleHRlcm4gYXNtbGlua2FnZSB1OF90IHpmd0J1ZlJlYWRCeXRlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KTsKK2V4dGVybiBhc21saW5rYWdlIHUxNl90IHpmd0J1ZlJlYWRIYWxmV29yZCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCk7CitleHRlcm4gYXNtbGlua2FnZSB2b2lkIHpmd0J1ZldyaXRlQnl0ZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgdThfdCB2YWx1ZSk7CitleHRlcm4gYXNtbGlua2FnZSB2b2lkIHpmd0J1ZldyaXRlSGFsZldvcmQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHUxNl90IHZhbHVlKTsKK2V4dGVybiBhc21saW5rYWdlIHU4X3QgKnpmd0dldEJ1ZmZlcih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpOworI2VuZGlmCisKKyNlbmRpZiAvL19QVUJfWkZXX0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9xdWV1ZS5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3F1ZXVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI5NDgzMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9xdWV1ZS5jCkBAIC0wLDAgKzEsMzAzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kdWxlIE5hbWUgOiBxdWV1ZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHF1ZXVlIG1hbmFnZW1lbnQgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiY3ByZWNvbXAuaCIKKyNpbmNsdWRlICJxdWV1ZS5oIgorCisKK3N0cnVjdCB6c1F1ZXVlKiB6ZlF1ZXVlQ3JlYXRlKHpkZXZfdCogZGV2LCB1MTZfdCBzaXplKQoreworICAgIHN0cnVjdCB6c1F1ZXVlKiBxOworCisgICAgaWYgKChxID0gKHN0cnVjdCB6c1F1ZXVlKil6ZndNZW1BbGxvY2F0ZShkZXYsIHNpemVvZihzdHJ1Y3QgenNRdWV1ZSkKKyAgICAgICAgICAgICsgKHNpemVvZihzdHJ1Y3QgenNRdWV1ZUNlbGwpKihzaXplLTEpKSkpICE9IE5VTEwpCisgICAgeworICAgICAgICBxLT5zaXplID0gc2l6ZTsKKyAgICAgICAgcS0+c2l6ZU1hc2sgPSBzaXplLTE7CisgICAgICAgIHEtPmhlYWQgPSAwOworICAgICAgICBxLT50YWlsID0gMDsKKyAgICB9CisgICAgcmV0dXJuIHE7Cit9CisKK3ZvaWQgemZRdWV1ZURlc3Ryb3koemRldl90KiBkZXYsIHN0cnVjdCB6c1F1ZXVlKiBxKQoreworICAgIHUxNl90IHNpemUgPSBzaXplb2Yoc3RydWN0IHpzUXVldWUpICsgKHNpemVvZihzdHJ1Y3QgenNRdWV1ZUNlbGwpKihxLT5zaXplLTEpKTsKKworICAgIHpmUXVldWVGbHVzaChkZXYsIHEpOworICAgIHpmd01lbUZyZWUoZGV2LCBxLCBzaXplKTsKKworICAgIHJldHVybjsKK30KKwordTE2X3QgemZRdWV1ZVB1dE5jcyh6ZGV2X3QqIGRldiwgc3RydWN0IHpzUXVldWUqIHEsIHpidWZfdCogYnVmLCB1MzJfdCB0aWNrKQoreworICAgIHUxNl90IHJldCA9IFpNX0VSUl9RVUVVRV9GVUxMOworCisgICAgem1fbXNnMF9tbShaTV9MVl8xLCAiemZRdWV1ZVB1dE5jcygpIik7CisKKyAgICBpZiAoKChxLT50YWlsKzEpJnEtPnNpemVNYXNrKSAhPSBxLT5oZWFkKQorICAgIHsKKyAgICAgICAgcS0+Y2VsbFtxLT50YWlsXS5idWYgPSBidWY7CisgICAgICAgIHEtPmNlbGxbcS0+dGFpbF0udGljayA9IHRpY2s7CisgICAgICAgIHEtPnRhaWwgPSAocS0+dGFpbCsxKSAmIHEtPnNpemVNYXNrOworICAgICAgICByZXQgPSBaTV9TVUNDRVNTOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3UxNl90IHpmUXVldWVQdXQoemRldl90KiBkZXYsIHN0cnVjdCB6c1F1ZXVlKiBxLCB6YnVmX3QqIGJ1ZiwgdTMyX3QgdGljaykKK3sKKyAgICB1MTZfdCByZXQ7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXQgPSB6ZlF1ZXVlUHV0TmNzKGRldiwgcSwgYnVmLCB0aWNrKTsKKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXR1cm4gcmV0OworfQorCit6YnVmX3QqIHpmUXVldWVHZXQoemRldl90KiBkZXYsIHN0cnVjdCB6c1F1ZXVlKiBxKQoreworICAgIHpidWZfdCogYnVmID0gTlVMTDsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmIChxLT5oZWFkICE9IHEtPnRhaWwpCisgICAgeworICAgICAgICBidWYgPSBxLT5jZWxsW3EtPmhlYWRdLmJ1ZjsKKyAgICAgICAgcS0+aGVhZCA9IChxLT5oZWFkKzEpICYgcS0+c2l6ZU1hc2s7CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybiBidWY7Cit9CisKK3UxNl90IHpmQ29tcGFyZURzdHdpdGhCdWYoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90KiBhZGRyKQoreworICAgIHUxNl90IGk7CisgICAgdThfdCBkc3RbNl07CisKKyAgICBmb3IgKGk9MDsgaTw2OyBpKyspCisgICAgeworICAgICAgICBkc3RbaV0gPSB6bXdfYnVmX3JlYWRiKGRldiwgYnVmLCBpKTsKKyAgICAgICAgaWYgKGRzdFtpXSAhPSBhZGRyW2ldKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMStpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKworemJ1Zl90KiB6ZlF1ZXVlR2V0V2l0aE1hYyh6ZGV2X3QqIGRldiwgc3RydWN0IHpzUXVldWUqIHEsIHU4X3QqIGFkZHIsIHU4X3QqIG1iKQoreworICAgIHpidWZfdCogYnVmOworICAgIHpidWZfdCogcmV0QnVmID0gTlVMTDsKKyAgICB1MTZfdCBpbmRleCwgbmV4dDsKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgKm1iID0gMDsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpbmRleCA9IHEtPmhlYWQ7CisKKyAgICB3aGlsZSAoMSkKKyAgICB7CisgICAgICAgIGlmIChpbmRleCAhPSBxLT50YWlsKQorICAgICAgICB7CisgICAgICAgICAgICBidWYgPSBxLT5jZWxsW2luZGV4XS5idWY7CisKKyAgICAgICAgICAgIC8vaWYgYnVmJ3MgZGV0aW5hdGlvbiBhZGRyZXNzID09IGlucHV0IGFkZHIKKyAgICAgICAgICAgIGlmICh6ZkNvbXBhcmVEc3R3aXRoQnVmKGRldiwgYnVmLCBhZGRyKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldEJ1ZiA9IGJ1ZjsKKyAgICAgICAgICAgICAgICAvL0dldCBpdCwgYW5kIHRyYWNlIHRoZSB3aG9sZSBxdWV1ZSB0byBjYWxjdWxhdGUgbW9yZSBiaXQKKyAgICAgICAgICAgICAgICB3aGlsZSAoKG5leHQgPSgoaW5kZXgrMSkmcS0+c2l6ZU1hc2spKSAhPSBxLT50YWlsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcS0+Y2VsbFtpbmRleF0uYnVmID0gcS0+Y2VsbFtuZXh0XS5idWY7CisgICAgICAgICAgICAgICAgICAgIHEtPmNlbGxbaW5kZXhdLnRpY2sgPSBxLT5jZWxsW25leHRdLnRpY2s7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgqbWIgPT0gMCkgJiYgKHpmQ29tcGFyZURzdHdpdGhCdWYoZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEtPmNlbGxbbmV4dF0uYnVmLCBhZGRyKSA9PSAwKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKm1iID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gbmV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcS0+dGFpbCA9IChxLT50YWlsLTEpICYgcS0+c2l6ZU1hc2s7CisKKyAgICAgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgICAgICAgICAgICAgIHJldHVybiByZXRCdWY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbmRleCA9IChpbmRleCArIDEpICYgcS0+c2l6ZU1hc2s7CisgICAgICAgIH0gLy9pZiAoaW5kZXggIT0gcS0+dGFpbCkKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXR1cm4gcmV0QnVmOworCit9CisKK3ZvaWQgemZRdWV1ZUZsdXNoKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNRdWV1ZSogcSkKK3sKKyAgICB6YnVmX3QqIGJ1ZjsKKworICAgIHdoaWxlICgoYnVmID0gemZRdWV1ZUdldChkZXYsIHEpKSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCit2b2lkIHpmUXVldWVBZ2UoemRldl90KiBkZXYsIHN0cnVjdCB6c1F1ZXVlKiBxLCB1MzJfdCB0aWNrLCB1MzJfdCBtc0FnZSkKK3sKKyAgICB6YnVmX3QqIGJ1ZjsKKyAgICB1MzJfdCAgIGJ1ZnRpY2s7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHdoaWxlICgxKQorICAgIHsKKyAgICAgICAgYnVmID0gTlVMTDsKKyAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICBpZiAocS0+aGVhZCAhPSBxLT50YWlsKQorICAgICAgICB7CisgICAgICAgICAgICBidWZ0aWNrID0gcS0+Y2VsbFtxLT5oZWFkXS50aWNrOworICAgICAgICAgICAgaWYgKCgodGljayAtIGJ1ZnRpY2spKlpNX01TX1BFUl9USUNLKSA+IG1zQWdlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ1ZiA9IHEtPmNlbGxbcS0+aGVhZF0uYnVmOworICAgICAgICAgICAgICAgIHEtPmhlYWQgPSAocS0+aGVhZCsxKSAmIHEtPnNpemVNYXNrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICBpZiAoYnVmICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIkFnZSBmcmFtZSBpbiBxdWV1ZSEiKTsKKyAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworfQorCisKK3U4X3QgemZRdWV1ZVJlbW92ZXdpdGhJbmRleCh6ZGV2X3QqIGRldiwgc3RydWN0IHpzUXVldWUqIHEsIHUxNl90IGluZGV4LCB1OF90KiBhZGRyKQoreworICAgIHUxNl90IG5leHQ7CisgICAgdThfdCBtYiA9IDA7CisKKyAgICAvL3RyYWNlIHRoZSB3aG9sZSBxdWV1ZSB0byBjYWxjdWxhdGUgbW9yZSBiaXQKKyAgICB3aGlsZSAoKG5leHQgPSgoaW5kZXgrMSkmcS0+c2l6ZU1hc2spKSAhPSBxLT50YWlsKQorICAgIHsKKyAgICAgICAgcS0+Y2VsbFtpbmRleF0uYnVmID0gcS0+Y2VsbFtuZXh0XS5idWY7CisgICAgICAgIHEtPmNlbGxbaW5kZXhdLnRpY2sgPSBxLT5jZWxsW25leHRdLnRpY2s7CisKKyAgICAgICAgaWYgKChtYiA9PSAwKSAmJiAoemZDb21wYXJlRHN0d2l0aEJ1ZihkZXYsCisgICAgICAgICAgICAgICAgcS0+Y2VsbFtuZXh0XS5idWYsIGFkZHIpID09IDApKQorICAgICAgICB7CisgICAgICAgICAgICBtYiA9IDE7CisgICAgICAgIH0KKworICAgICAgICBpbmRleCA9IG5leHQ7CisgICAgfQorICAgIHEtPnRhaWwgPSAocS0+dGFpbC0xKSAmIHEtPnNpemVNYXNrOworCisgICAgcmV0dXJuIG1iOworCit9CisKK3ZvaWQgemZRdWV1ZUdlbmVyYXRlVWFwc2RUaW0oemRldl90KiBkZXYsIHN0cnVjdCB6c1F1ZXVlKiBxLAorICAgICAgICB1OF90KiB1bmlCaXRNYXAsIHUxNl90KiBoaWdoZXN0Qnl0ZSkKK3sKKyAgICB6YnVmX3QqIHBzQnVmOworICAgIHU4X3QgZHN0WzZdOworICAgIHUxNl90IGlkLCBhaWQsIGluZGV4LCBpOworICAgIHUxNl90IGJpdFBvc2l0aW9uOworICAgIHUxNl90IGJ5dGVQb3NpdGlvbjsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpbmRleCA9IHEtPmhlYWQ7CisKKyAgICB3aGlsZSAoaW5kZXggIT0gcS0+dGFpbCkKKyAgICB7CisgICAgICAgIHBzQnVmID0gcS0+Y2VsbFtpbmRleF0uYnVmOworICAgICAgICBmb3IgKGk9MDsgaTw2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGRzdFtpXSA9IHptd19idWZfcmVhZGIoZGV2LCBwc0J1ZiwgaSk7CisgICAgICAgIH0KKyAgICAgICAgLyogVE9ETyA6IHVzZSB1OF90KiBmb3QgTUFDIGFkZHJlc3MgKi8KKyAgICAgICAgaWYgKCgoaWQgPSB6ZkFwRmluZFN0YShkZXYsICh1MTZfdCopZHN0KSkgIT0gMHhmZmZmKQorICAgICAgICAgICAgICAgICYmICh3ZC0+YXAuc3RhVGFibGVbaWRdLnBzTW9kZSAhPSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQ2FsY3VsYXRlIFBWQiBvbmx5IHdoZW4gYWxsIEFDIGFyZSBkZWxpdmVyeS1lbmFibGVkICovCisgICAgICAgICAgICBpZiAoKHdkLT5hcC5zdGFUYWJsZVtpZF0ucW9zSW5mbyAmIDB4ZikgPT0gMHhmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFpZCA9IGlkICsgMTsKKyAgICAgICAgICAgICAgICBiaXRQb3NpdGlvbiA9ICgxIDw8IChhaWQgJiAweDcpKTsKKyAgICAgICAgICAgICAgICBieXRlUG9zaXRpb24gPSAoYWlkID4+IDMpOworICAgICAgICAgICAgICAgIHVuaUJpdE1hcFtieXRlUG9zaXRpb25dIHw9IGJpdFBvc2l0aW9uOworCisgICAgICAgICAgICAgICAgaWYgKGJ5dGVQb3NpdGlvbj4qaGlnaGVzdEJ5dGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqaGlnaGVzdEJ5dGUgPSBieXRlUG9zaXRpb247CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5kZXggPSAoaW5kZXgrMSkgJiBxLT5zaXplTWFzazsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEZyZWUgZ2FyYmFnZSBVQVBTRCBmcmFtZSAqLworICAgICAgICAgICAgemZRdWV1ZVJlbW92ZXdpdGhJbmRleChkZXYsIHEsIGluZGV4LCBkc3QpOworICAgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIHBzQnVmLCAwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3F1ZXVlLmggYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvcXVldWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTI2Yjg4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3F1ZXVlLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX1FVRVVFX0gKKyNkZWZpbmUgX1FVRVVFX0gKKworI2luY2x1ZGUgIi4uL29hbF9kdC5oIgorCitzdHJ1Y3QgenNRdWV1ZUNlbGwKK3sKKyAgICB1MzJfdCAgIHRpY2s7CisgICAgemJ1Zl90KiBidWY7Cit9OworCitzdHJ1Y3QgenNRdWV1ZQoreworICAgIHUxNl90ICAgc2l6ZTsKKyAgICB1MTZfdCAgIHNpemVNYXNrOworICAgIHUxNl90ICAgaGVhZDsKKyAgICB1MTZfdCAgIHRhaWw7CisgICAgc3RydWN0IHpzUXVldWVDZWxsIGNlbGxbMV07Cit9OworCisjZW5kaWYgLy8jaWZuZGVmIF9RVUVVRV9ICmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvcmF0ZWN0cmwuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9yYXRlY3RybC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MzEwNGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvcmF0ZWN0cmwuYwpAQCAtMCwwICsxLDg3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJjcHJlY29tcC5oIgorI2luY2x1ZGUgInJhdGVjdHJsLmgiCisKK2NvbnN0IHUzMl90IHpjUmF0ZVRvUGh5Q3RybFtdID0KKyAgICB7CisgICAgICAgIC8qIDFNLCAgICAgICAgMk0sICAgICAgICAgNU0sICAgICAgICAxMU0gLCAgMCAgMSAgMiAgMyovCisgICAgICAgIDB4MDAwMDAsICAgIDB4MTAwMDAsICAgIDB4MjAwMDAsICAgIDB4MzAwMDAsCisgICAgICAgIC8qIDZNICAgICAgICAgOU0gICAgICAgICAgMTJNICAgICAgICAxOE0gLCAgNCAgNSAgNiAgNyovCisgICAgICAgIDB4YjAwMDEsICAgIDB4ZjAwMDEsICAgIDB4YTAwMDEsICAgIDB4ZTAwMDEsCisgICAgICAgIC8qIDI0TSAgICAgICAgIDM2TSAgICAgICAgNDhNICAgICAgICA1NE0gLCAgOCAgOSAgMTAgMTEqLworICAgICAgICAweDkwMDAxLCAgICAweGQwMDAxLCAgICAweDgwMDAxLCAgICAweGMwMDAxLAorICAgICAgICAvKiBNQ1MwICAgICAgTUNTMSAgICAgICAgTUNTMiAgICAgICAgTUNTMywgIDEyIDEzIDE0IDE1Ki8KKyAgICAgICAgMHgwMDAwMiwgICAgMHgxMDAwMiwgICAgMHgyMDAwMiwgICAgMHgzMDAwMiwKKyAgICAgICAgLyogTUNTNCAgICAgIE1DUzUgICAgICAgIE1DUzYgICAgICAgIE1DUzcsICAxNiAxNyAxOCAxOSovCisgICAgICAgIDB4NDAwMDIsICAgIDB4NTAwMDIsICAgIDB4NjAwMDIsICAgIDB4NzAwMDIsCisgICAgICAgIC8qIE1DUzggICAgICBNQ1M5ICAgICAgICBNQ1MxMCAgICAgICBNQ1MxMSwgMjAgMjEgMjIgMjMqLworICAgICAgICAweDgwMDAyLCAgICAweDkwMDAyLCAgICAweGEwMDAyLCAgICAweGIwMDAyLAorICAgICAgICAvKiBNQ1MxMiAgICAgTUNTMTMgICAgICAgTUNTMTQgICAgICAgTUNTMTUsIDI0IDI1IDI2IDI3Ki8KKyAgICAgICAgMHhjMDAwMiwgICAgMHhkMDAwMiwgICAgMHhlMDAwMiwgICAgMHhmMDAwMiwKKyAgICAgICAgLyogTUNTMTRTRywgIE1DUzE1U0cgICAgIE1DUzdTRyAgICAgICAgICAgLCAyOCAyOSwgMzAqLworICAgICAgICAweDgwMGUwMDAyLCAweDgwMGYwMDAyLCAweDgwMDcwMDAyCisgICAgfTsKKworCitjb25zdCB1OF90IHpjSHRSYXRlVGFibGVbMTVdWzRdID0KKyAgICB7IC8qWzVHIDIwTUh6XSAgWzVHIDQwTUh6XSBbMi40RyAyME1Iel0gIFsyLjRHIDQwTUh6XSovCisgICAgICAgIHsgIDQsICAgICAgICAgIDQsICAgICAgICAgIDAsICAgICAgICAgIDB9LCAgIC8qT0ZETTZNIE9GRE02TSAgQ0NLMU0gIENDSzFNICAqLworICAgICAgICB7ICA1LCAgICAgICAgICA1LCAgICAgICAgICAxLCAgICAgICAgICAxfSwgICAvKk9GRE05TSBPRkRNOU0gIENDSzJNICBDQ0syTSAgKi8KKyAgICAgICAgeyAgMTMsICAgICAgICAgMTIsICAgICAgICAgMiwgICAgICAgICAgMn0sICAgLypNQ1MxICAgTUNTMCAgICBDQ0s1TSAgQ0NLNU0gICovCisgICAgICAgIHsgIDE0LCAgICAgICAgIDEzLCAgICAgICAgIDMsICAgICAgICAgIDN9LCAgIC8qTUNTMiAgIE1DUzEgICAgQ0NLMTFNIENDSzExTSAqLworICAgICAgICB7ICAxNSwgICAgICAgICAxNCwgICAgICAgICAxMywgICAgICAgICAxMn0sICAvKk1DUzMgICBNQ1MyICAgIE1DUzEgICBNQ1MwICAgKi8KKyAgICAgICAgeyAgMTYsICAgICAgICAgMTUsICAgICAgICAgMTQsICAgICAgICAgMTN9LCAgLypNQ1M0ICAgTUNTMyAgICBNQ1MyICAgTUNTMSAgICovCisgICAgICAgIHsgIDIzLCAgICAgICAgIDE2LCAgICAgICAgIDE1LCAgICAgICAgIDE0fSwgIC8qTUNTMTEgIE1DUzQgICAgTUNTMyAgIE1DUzIgICAqLworICAgICAgICB7ICAyNCwgICAgICAgICAyMywgICAgICAgICAxNiwgICAgICAgICAxNX0sICAvKk1DUzEyICBNQ1MxMSAgIE1DUzQgICBNQ1MzICAgKi8KKyAgICAgICAgeyAgMjUsICAgICAgICAgMjQsICAgICAgICAgMjMsICAgICAgICAgMTZ9LCAgLypNQ1MxMyAgTUNTMTIgICBNQ1MxMSAgTUNTNCAgICovCisgICAgICAgIHsgIDI2LCAgICAgICAgIDI1LCAgICAgICAgIDI0LCAgICAgICAgIDIzfSwgIC8qTUNTMTQgIE1DUzEzICAgTUNTMTIgIE1DUzExICAqLworICAgICAgICB7ICAyNywgICAgICAgICAyNiwgICAgICAgICAyNSwgICAgICAgICAyNH0sICAvKk1DUzE1ICBNQ1MxNCAgIE1DUzEzICBNQ1MxMiAgKi8KKyAgICAgICAgeyAgMCwgICAgICAgICAgMjcsICAgICAgICAgMjYsICAgICAgICAgMjV9LCAgLyowICAgICAgTUNTMTUgICBNQ1MxNCAgTUNTMTMgICovCisgICAgICAgIHsgIDAsICAgICAgICAgIDI5LCAgICAgICAgIDI3LCAgICAgICAgIDI2fSwgIC8qMCAgICAgIE1DUzE1U0cgTUNTMTUgIE1DUzE0ICAqLworICAgICAgICB7ICAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgICAyOH0sICAvKjAgICAgICAwICAgICAgIDAgICAgICBNQ1MxNFNHKi8KKyAgICAgICAgeyAgMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgICAgMjl9ICAgLyowICAgICAgMCAgICAgICAwICAgICAgTUNTMTVTRyovCisgICAgfTsKKworY29uc3QgdThfdCB6Y0h0T25lVHhTdHJlYW1SYXRlVGFibGVbMTVdWzRdID0KKyAgICB7IC8qWzVHIDIwTUh6XSAgWzVHIDQwTUh6XSBbMi40RyAyME1Iel0gIFsyLjRHIDQwTUh6XSovCisgICAgICAgIHsgIDQsICAgICAgICAgIDQsICAgICAgICAgIDAsICAgICAgICAgIDB9LCAgIC8qT0ZETTZNIE9GRE02TSAgQ0NLMU0gIENDSzFNICAqLworICAgICAgICB7ICA1LCAgICAgICAgICA1LCAgICAgICAgICAxLCAgICAgICAgICAxfSwgICAvKk9GRE05TSBPRkRNOU0gIENDSzJNICBDQ0syTSAgKi8KKyAgICAgICAgeyAgMTMsICAgICAgICAgMTIsICAgICAgICAgMiwgICAgICAgICAgMn0sICAgLypNQ1MxICAgTUNTMCAgICBDQ0s1TSAgQ0NLNU0gICovCisgICAgICAgIHsgIDE0LCAgICAgICAgIDEzLCAgICAgICAgIDMsICAgICAgICAgIDN9LCAgIC8qTUNTMiAgIE1DUzEgICAgQ0NLMTFNIENDSzExTSAqLworICAgICAgICB7ICAxNSwgICAgICAgICAxNCwgICAgICAgICAxMywgICAgICAgICAxMn0sICAvKk1DUzMgICBNQ1MyICAgIE1DUzEgICBNQ1MwICAgKi8KKyAgICAgICAgeyAgMTYsICAgICAgICAgMTUsICAgICAgICAgMTQsICAgICAgICAgMTN9LCAgLypNQ1M0ICAgTUNTMyAgICBNQ1MyICAgTUNTMSAgICovCisgICAgICAgIHsgIDE3LCAgICAgICAgIDE2LCAgICAgICAgIDE1LCAgICAgICAgIDE0fSwgIC8qTUNTNSAgIE1DUzQgICAgTUNTMyAgIE1DUzIgICAqLworICAgICAgICB7ICAxOCwgICAgICAgICAxNywgICAgICAgICAxNiwgICAgICAgICAxNX0sICAvKk1DUzYgICBNQ1M1ICAgIE1DUzQgICBNQ1MzICAgKi8KKyAgICAgICAgeyAgMTksICAgICAgICAgMTgsICAgICAgICAgMTcsICAgICAgICAgMTZ9LCAgLypNQ1M3ICAgTUNTNiAgICBNQ1M1ICAgTUNTNCAgICovCisgICAgICAgIHsgIDAsICAgICAgICAgIDE5LCAgICAgICAgIDE4LCAgICAgICAgIDE3fSwgIC8qMCAgICAgIE1DUzcgICAgTUNTNiAgIE1DUzUgICAqLworICAgICAgICB7ICAwLCAgICAgICAgICAzMCwgICAgICAgICAxOSwgICAgICAgICAxOH0sICAvKjAgICAgICBNQ1M3U0cgIE1DUzcgICBNQ1M2ICAgKi8KKyAgICAgICAgeyAgMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgICAgMTl9LCAgLyowICAgICAgMCAgICAgICAwICAgICAgTUNTNyAgICovCisgICAgICAgIHsgIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAgIDMwfSwgIC8qMCAgICAgIDAgICAgICAgMCAgICAgIE1DUzdTRyAqLworICAgICAgICB7ICAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgICAwIH0sICAvKjAgICAgICAwICAgICAgIDAgICAgICAwICAgICAgKi8KKyAgICAgICAgeyAgMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgICAgMCB9ICAgLyowICAgICAgMCAgICAgICAwICAgICAgMCAgICAgICovCisgICAgfTsKKworY29uc3QgdTE2X3QgemNSYXRlW10gPQorICAgIHsKKyAgICAgICAgMSwgMiwgNSwgMTEsICAgICAgICAgICAgICAgICAgLyogMU0sIDJNLCA1TSwgMTFNICAgICAgICAgICwgIDAgIDEgIDIgIDMqLworICAgICAgICA2LCA5LCAxMiwgMTgsICAgICAgICAgICAgICAgICAvKiA2TSAgOU0gIDEyTSAgMThNICAgICAgICAgLCAgNCAgNSAgNiAgNyovCisgICAgICAgIDI0LCAzNiwgNDgsIDU0LCAgICAgICAgICAgICAgIC8qIDI0TSAgMzZNICA0OE0gIDU0TSAgICAgICAsICA4ICA5IDEwIDExKi8KKyAgICAgICAgMTMsIDI3LCA0MCwgNTQsICAgICAgICAgICAgICAgLyogTUNTMCBNQ1MxIE1DUzIgTUNTMyAgICAgICwgMTIgMTMgMTQgMTUqLworICAgICAgICA4MSwgMTA4LCAxMjEsIDEzNSwgICAgICAgICAgICAvKiBNQ1M0IE1DUzUgTUNTNiBNQ1M3ICAgICAgLCAxNiAxNyAxOCAxOSovCisgICAgICAgIDI3LCA1NCwgODEsIDEwOCwgICAgICAgICAgICAgIC8qIE1DUzggTUNTOSBNQ1MxMCBNQ1MxMSAgICAsIDIwIDIxIDIyIDIzKi8KKyAgICAgICAgMTYyLCAyMTYsIDI0MywgMjcwLCAgICAgICAgICAgLyogTUNTMTIgTUNTMTMgTUNTMTQgTUNTMTUgICwgMjQgMjUgMjYgMjcqLworICAgICAgICAyNzAsIDMwMCwgMTUwICAgICAgICAgICAgICAgICAvKiBNQ1MxNFNHLCBNQ1MxNVNHLCBNQ1M3U0cgLCAyOCAyOSAzMCovCisgICAgfTsKKworY29uc3QgdTE2X3QgUEVSVGhyZXNob2xkW10gPQorICAgIHsKKyAgICAgICAgMTAwLCA1MCwgNTAsIDUwLCAgICAvKiAxTSwgMk0sIDVNLCAxMU0gICAgICAgICAgLCAgMCAgMSAgMiAgMyovCisgICAgICAgIDUwLCA1MCwgMzAsIDMwLCAgICAgLyogNk0gIDlNICAxMk0gIDE4TSAgICAgICAgICwgIDQgIDUgIDYgIDcqLworICAgICAgICAyNSwgMjUsIDI1LCAyMCwgICAgIC8qIDI0TSAgMzZNICA0OE0gIDU0TSAgICAgICAsICA4ICA5IDEwIDExKi8KKyAgICAgICAgNTAsIDUwLCA1MCwgNDAsICAgIC8qIE1DUzAgTUNTMSBNQ1MyIE1DUzMgICAgICAsIDEyIDEzIDE0IDE1Ki8KKyAgICAgICAgMzAsIDMwLCAzMCwgMzAsICAgIC8qIE1DUzQgTUNTNSBNQ1M2IE1DUzcgICAgICAsIDE2IDE3IDE4IDE5Ki8KKyAgICAgICAgMzAsIDMwLCAyNSwgMjUsICAgIC8qIE1DUzggTUNTOSBNQ1MxMCBNQ1MxMSAgICAsIDIwIDIxIDIyIDIzKi8KKyAgICAgICAgMjUsIDI1LCAxNSwgMTUsICAgICAvKiBNQ1MxMiBNQ1MxMyBNQ1MxNCBNQ1MxNSAgLCAyNCAyNSAyNiAyNyovCisgICAgICAgIDE1LCAxNSwgMTAgICAgICAgICAgLyogTUNTMTRTRywgTUNTMTVTRyAgICAgICAgICwgMjggMjkqLworICAgIH07CisKK2NvbnN0IHUxNl90IEZhaWxEaWZmW10gPQorICAgIHsKKyAgICAgICAgNDAsIDQ2LCA0MCwgMCwgICAgICAgICAgLyogMU0sIDJNLCA1TSwgMTFNICAgICAgICAgICwgIDAgIDEgIDIgIDMqLworICAgICAgICAyNCwgMTcsIDIyLCAxNiwgICAgICAgICAvKiA2TSAgOU0gIDEyTSAgMThNICAgICAgICAgLCAgNCAgNSAgNiAgNyovCisgICAgICAgIDE5LCAxMywgNSwgMCwgICAgICAgICAgIC8qIDI0TSAgMzZNICA0OE0gIDU0TSAgICAgICAsICA4ICA5IDEwIDExKi8KKyAgICAgICAgMzYsIDIyLCAxNSwgMTksICAgICAgICAgLyogTUNTMCBNQ1MxIE1DUzIgTUNTMyAgICAgICwgMTIgMTMgMTQgMTUqLworICAgICAgICAxMiwgNSwgNCwgNywgICAgICAgICAgICAvKiBNQ1M0IE1DUzUgTUNTNiBNQ1M3ICAgICAgLCAxNiAxNyAxOCAxOSovCisgICAgICAgIDAsIDAsIDAsIDAsICAgICAgICAgICAgIC8qIE1DUzggTUNTOSBNQ1MxMCBNQ1MxMSAgICAsIDIwIDIxIDIyIDIzKi8KKyAgICAgICAgOSwgNCwgMywgMywgICAgICAgICAgICAgLyogTUNTMTIgTUNTMTMgTUNTMTQgTUNTMTUgICwgMjQgMjUgMjYgMjcqLworICAgICAgICAzLCAwLCAwICAgICAgICAgICAgICAgICAvKiBNQ1MxNFNHLCBNQ1MxNVNHICAgICAgICAgLCAyOCAyOSovCisgICAgfTsKKworCisjaWZkZWYgWk1fRU5BQkxFX0JBX1JBVEVDVFJMCit1MzJfdCBUeE1QRFVbMjldOwordTMyX3QgQkFGYWlsWzI5XTsKK3UzMl90IEJBUEVSWzI5XTsKK2NvbnN0IHUxNl90IEJBRGlmZltdID0KKyAgICB7CisgICAgICAgIDAsIDAsIDAsIDAsCisgICAgICAgIDAsIDAsIDAsIDAsCisgICAgICAgIDAsIDAsIDAsIDAsCisgICAgICAgIDM2MSwgMjIwLCAxNTEsIDE4NywKKyAgICAgICAgMTIyLCA0OCwgNDEsIDY1LAorICAgICAgICAwLCAwLCAwLCAwLAorICAgICAgICA4OCwgMzMsIDI3LCAyNSwKKyAgICAgICAgMAorICAgIH07CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmUmF0ZUN0cmxJbml0Q2VsbCAgICAgICAgICAqLworLyogICAgICBJbml0aWFsaXplIHJhdGUgY29udHJvbCBjZWxsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdHlwZSA6IDA9PjExYiwgMT0+MTFhL2csIDI9PjExbiwgMz0+MTFuIG9uZSBUeCBzdHJlYW0gICAgICAgICAgICovCisvKiAgICAgIGdCYW5kIDogMT0+Mi40RywgMD0+NUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjIgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmUmF0ZUN0cmxJbml0Q2VsbCh6ZGV2X3QqIGRldiwgc3RydWN0IHpzUmNDZWxsKiByY0NlbGwsIHU4X3QgdHlwZSwKKyAgICAgICAgdThfdCBnQmFuZCwgdThfdCBTRzQwKQoreworICAgIHU4X3QgaTsKKyAgICB1OF90IG1heHJhdGU7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKFNHNDApIFNHNDAgPSAxOworCisgICAgaWYgKGdCYW5kICE9IDApCisgICAgeworICAgICAgICBpZiAodHlwZSA9PSAxKSAvLzExZworICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspIC8vMU0gMk0gNU0gMTFNCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmNDZWxsLT5vcGVyYXRpb25SYXRlU2V0W2ldID0gKHU4X3QpaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaT00OyBpPDEwOyBpKyspIC8vMTJNIDE4TSAyNE0gMzZNIDQ4TSA1NE0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVTZXRbaV0gPSAyK2k7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVDb3VudCA9IDEwOworICAgICAgICAgICAgcmNDZWxsLT5jdXJyZW50UmF0ZUluZGV4ID0gNTsgLy8xOE0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0eXBlID09IDIpIC8vMTFuZworICAgICAgICB7CisgICAgICAgICAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApIC8vQVAgMTFuZyA0ME0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTwxNTsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmNDZWxsLT5vcGVyYXRpb25SYXRlU2V0W2ldID0gemNIdFJhdGVUYWJsZVtpXVszXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIVNHNDApIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZVNldFsxM10gPSAyNzsKKyAgICAgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVDb3VudCA9IDE0K1NHNDA7CisgICAgICAgICAgICAgICAgcmNDZWxsLT5jdXJyZW50UmF0ZUluZGV4ID0gMTA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIC8vU1RBCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEuaHRDdHJsQmFuZHdpZHRoID09IFpNX0JBTkRXSURUSF80ME1IWikgLy8xMW5nIDQwTQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8MTU7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmNDZWxsLT5vcGVyYXRpb25SYXRlU2V0W2ldID0gemNIdFJhdGVUYWJsZVtpXVszXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZighU0c0MCkgcmNDZWxsLT5vcGVyYXRpb25SYXRlU2V0WzEzXSA9IDI3OworICAgICAgICAgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVDb3VudCA9IDE0K1NHNDA7CisgICAgICAgICAgICAgICAgICAgIHJjQ2VsbC0+Y3VycmVudFJhdGVJbmRleCA9IDEwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlICAgIC8vMTFuZyAyME0KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPDEzOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZVNldFtpXSA9IHpjSHRSYXRlVGFibGVbaV1bMl07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmNDZWxsLT5vcGVyYXRpb25SYXRlQ291bnQgPSAxMzsKKyAgICAgICAgICAgICAgICAgICAgcmNDZWxsLT5jdXJyZW50UmF0ZUluZGV4ID0gOTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodHlwZSA9PSAzKSAvLzExbmcgb25lIFR4IHN0cmVhbQorICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHdkLT5zdGEuaHRDdHJsQmFuZHdpZHRoID09IFpNX0JBTkRXSURUSF80ME1IWikgLy8xMW5nIDQwTSBvbmUgVHggc3RyZWFtCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZihTRzQwICE9IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heHJhdGUgPSAxMzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heHJhdGUgPSAxMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxtYXhyYXRlOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZVNldFtpXSA9IHpjSHRPbmVUeFN0cmVhbVJhdGVUYWJsZVtpXVszXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVDb3VudCA9IGk7CisgICAgICAgICAgICAgICAgICAgIHJjQ2VsbC0+Y3VycmVudFJhdGVJbmRleCA9ICgoaSsxKSozKS80OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlICAgIC8vMTFuZyAyME0KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPDExOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZVNldFtpXSA9IHpjSHRPbmVUeFN0cmVhbVJhdGVUYWJsZVtpXVsyXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVDb3VudCA9IGk7CisgICAgICAgICAgICAgICAgICAgIHJjQ2VsbC0+Y3VycmVudFJhdGVJbmRleCA9ICgoaSsxKSozKS80OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIC8vaWYgKHR5cGUgPT0gMCkgLy8xMWIKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZVNldFtpXSA9ICh1OF90KWk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVDb3VudCA9IDQ7CisgICAgICAgICAgICByY0NlbGwtPmN1cnJlbnRSYXRlSW5kZXggPSByY0NlbGwtPm9wZXJhdGlvblJhdGVDb3VudC0xOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICh0eXBlID09IDIpIC8vMTFuYQorICAgICAgICB7CisgICAgICAgICAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApIC8vQVAgMTFuYSA0ME0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTwoMTIrU0c0MCk7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZVNldFtpXSA9IHpjSHRSYXRlVGFibGVbaV1bMV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZUNvdW50ID0gMTIrU0c0MDsKKyAgICAgICAgICAgICAgICByY0NlbGwtPmN1cnJlbnRSYXRlSW5kZXggPSA4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAvL1NUQQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLmh0Q3RybEJhbmR3aWR0aCA9PSBaTV9CQU5EV0lEVEhfNDBNSFopIC8vMTFuYSA0ME0KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPCgxMitTRzQwKTsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVTZXRbaV0gPSB6Y0h0UmF0ZVRhYmxlW2ldWzFdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZUNvdW50ID0gMTIrU0c0MDsKKyAgICAgICAgICAgICAgICAgICAgcmNDZWxsLT5jdXJyZW50UmF0ZUluZGV4ID0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSAgICAvLzExbmEgMjBNCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTwxMTsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVTZXRbaV0gPSB6Y0h0UmF0ZVRhYmxlW2ldWzBdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZUNvdW50ID0gMTE7CisgICAgICAgICAgICAgICAgICAgIHJjQ2VsbC0+Y3VycmVudFJhdGVJbmRleCA9IDc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gMykgLy8xMW5hIG9uZSBUeCBzdHJlYW0KKyAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLmh0Q3RybEJhbmR3aWR0aCA9PSBaTV9CQU5EV0lEVEhfNDBNSFopIC8vMTFuYSA0ME0gb25lIFR4IHN0cmVhbQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoU0c0MCAhPSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhyYXRlID0gMTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhyYXRlID0gMTA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8bWF4cmF0ZTsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVTZXRbaV0gPSB6Y0h0T25lVHhTdHJlYW1SYXRlVGFibGVbaV1bMV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmNDZWxsLT5vcGVyYXRpb25SYXRlQ291bnQgPSBpOworICAgICAgICAgICAgICAgICAgICByY0NlbGwtPmN1cnJlbnRSYXRlSW5kZXggPSAoKGkrMSkqMykvNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSAgICAvLzExbmcgMjBNCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTw5OyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZVNldFtpXSA9IHpjSHRPbmVUeFN0cmVhbVJhdGVUYWJsZVtpXVswXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByY0NlbGwtPm9wZXJhdGlvblJhdGVDb3VudCA9IGk7CisgICAgICAgICAgICAgICAgICAgIHJjQ2VsbC0+Y3VycmVudFJhdGVJbmRleCA9ICgoaSsxKSozKS80OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIC8vaWYgKHR5cGUgPT0gMSkgLy8xMWEKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpPTA7IGk8ODsgaSsrKSAvLzZNIDlNIDEyTSAxOE0gMjRNIDM2TSA0OE0gNTRNCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmNDZWxsLT5vcGVyYXRpb25SYXRlU2V0W2ldID0gaSs0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmNDZWxsLT5vcGVyYXRpb25SYXRlQ291bnQgPSA4OworICAgICAgICAgICAgcmNDZWxsLT5jdXJyZW50UmF0ZUluZGV4ID0gNDsgIC8vMjRNCisgICAgICAgIH0KKyAgICB9CisKKyAgICByY0NlbGwtPmZsYWcgPSAwOworICAgIHJjQ2VsbC0+dHhDb3VudCA9IDA7CisgICAgcmNDZWxsLT5mYWlsQ291bnQgPSAwOworICAgIHJjQ2VsbC0+Y3VycmVudFJhdGUgPSByY0NlbGwtPm9wZXJhdGlvblJhdGVTZXRbcmNDZWxsLT5jdXJyZW50UmF0ZUluZGV4XTsKKyAgICByY0NlbGwtPmxhc3R0eENvdW50ID0gMDsKKyAgICByY0NlbGwtPmxhc3RUaW1lICAgID0gd2QtPnRpY2s7CisgICAgcmNDZWxsLT5wcm9iaW5nVGltZSA9IHdkLT50aWNrOworICAgIGZvciAoaT0wOyBpPFpNX1JBVEVfVEFCTEVfU0laRTsgaSsrKSB7CisgICAgICAgIHdkLT5QRVJbaV0gPSAwOworICAgICAgICB3ZC0+dHhNUERVW2ldID0gd2QtPnR4RmFpbFtpXSA9IDA7CisgICAgfQorICAgIHdkLT5wcm9iZUNvdW50ID0gMDsKKyAgICB3ZC0+cHJvYmVJbnRlcnZhbCA9IDA7CisjaWZkZWYgWk1fRU5BQkxFX0JBX1JBVEVDVFJMCisgICAgZm9yIChpPTA7IGk8Mjk7IGkrKykgeworICAgICAgICBUeE1QRFVbaV09MDsKKyAgICAgICAgQkFGYWlsW2ldPTA7CisgICAgICAgIEJBUEVSW2ldPTA7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsR2V0SGlnaGVyUmF0ZSAgICAgKi8KKy8qICAgICAgR2V0IGEgaGlnaGVyIHJhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcmNDZWxsIDogcmF0ZSBjb250cm9sIGNlbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuMiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4X3QgemZSYXRlQ3RybEdldEhpZ2hlclJhdGUoc3RydWN0IHpzUmNDZWxsKiByY0NlbGwpCit7CisgICAgdThfdCByYXRlSW5kZXg7CisKKyAgICByYXRlSW5kZXggPSByY0NlbGwtPmN1cnJlbnRSYXRlSW5kZXgKKyAgICAgICAgICAgICsgKCgocmNDZWxsLT5jdXJyZW50UmF0ZUluZGV4KzEpIDwgcmNDZWxsLT5vcGVyYXRpb25SYXRlQ291bnQpPzE6MCk7CisgICAgcmV0dXJuIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZVNldFtyYXRlSW5kZXhdOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsTmV4dExvd2VyUmF0ZSAgICAgKi8KKy8qICAgICAgR2V0IGEgbG93ZXIgcmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcmNDZWxsIDogcmF0ZSBjb250cm9sIGNlbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuMiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4X3QgemZSYXRlQ3RybE5leHRMb3dlclJhdGUoemRldl90KiBkZXYsIHN0cnVjdCB6c1JjQ2VsbCogcmNDZWxsKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBpZiAocmNDZWxsLT5jdXJyZW50UmF0ZUluZGV4ID4gMCkKKyAgICB7CisgICAgICAgIHJjQ2VsbC0+Y3VycmVudFJhdGVJbmRleC0tOworICAgICAgICByY0NlbGwtPmN1cnJlbnRSYXRlID0gcmNDZWxsLT5vcGVyYXRpb25SYXRlU2V0W3JjQ2VsbC0+Y3VycmVudFJhdGVJbmRleF07CisgICAgfQorICAgIHptX21zZzFfdHgoWk1fTFZfMCwgIkxvd2VyIFR4IFJhdGU9IiwgcmNDZWxsLT5jdXJyZW50UmF0ZSk7CisgICAgLy9EYmdQcmludCgiTG93ZXIgVHggUmF0ZT0lZCIsIHJjQ2VsbC0+Y3VycmVudFJhdGUpOworICAgIHJjQ2VsbC0+ZmFpbENvdW50ID0gcmNDZWxsLT50eENvdW50ID0gMDsKKyAgICByY0NlbGwtPmxhc3R0eENvdW50ID0gMDsKKyAgICByY0NlbGwtPmxhc3RUaW1lICA9IHdkLT50aWNrOworICAgIHJldHVybiByY0NlbGwtPmN1cnJlbnRSYXRlOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsUmF0ZURpZmYgICAgICAgICAgKi8KKy8qICAgICAgUmF0ZSBkaWZmZXJlbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcmNDZWxsIDogcmF0ZSBjb250cm9sIGNlbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHJldHJ5UmF0ZSA6IHJldHJ5IHJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHJhdGUgZGlmZmVyZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjIgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OF90IHpmUmF0ZUN0cmxSYXRlRGlmZihzdHJ1Y3QgenNSY0NlbGwqIHJjQ2VsbCwgdThfdCByZXRyeVJhdGUpCit7CisgICAgdTE2X3QgaTsKKworICAgIC8qIEZpbmQgcmV0cnlSYXRlIGluIG9wZXJhdGlvblJhdGVTZXRbXSAqLworICAgIGZvciAoaT0wOyBpPHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZUNvdW50OyBpKyspCisgICAgeworICAgICAgICBpZiAocmV0cnlSYXRlID09IHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZVNldFtpXSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGkgPCByY0NlbGwtPmN1cnJlbnRSYXRlSW5kZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgocmNDZWxsLT5jdXJyZW50UmF0ZUluZGV4IC0gaSkrMSk+PjE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChpID09IHJjQ2VsbC0+Y3VycmVudFJhdGVJbmRleCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8qIFRPRE8gOiByZXRyeSByYXRlIG5vdCBpbiBvcGVyYXRpb24gcmF0ZSBzZXQgKi8KKyAgICB6bV9tc2cxX3R4KFpNX0xWXzAsICJOb3QgaW4gb3BlcmF0aW9uIHJhdGUgc2V0OiIsIHJldHJ5UmF0ZSk7CisgICAgcmV0dXJuIDE7CisKK30KKwordTMyX3QgemZSYXRlQ3RybFVEUFRQKHpkZXZfdCogZGV2LCB1MTZfdCBSYXRlLCB1MzJfdCBQRVIpIHsKKyAgICBpZiAoKFBFUiA8IDEwMCkgJiYgKFJhdGUgPiAwKSAmJiBQRVIpCisgICAgICAgIHJldHVybiAxMTY4MDAwLygoKDEyMzA0L1JhdGUpKzE5NykqKDEwMCsxMDAqUEVSLygxMDAtUEVSKSkpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3U4X3QgemZSYXRlQ3RybEZpbmRNYXhVRFBUUCh6ZGV2X3QqIGRldiwgc3RydWN0IHpzUmNDZWxsKiByY0NlbGwpIHsKKyAgICB1OF90IGksIG1heEluZGV4PTAsIHJhdGVJbmRleDsKKyAgICB1MzJfdCBtYXg9MCwgVURQVGhyb3VnaHB1dDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHJhdGVJbmRleCA9IHptX2FnZ19taW4ocmNDZWxsLT5jdXJyZW50UmF0ZUluZGV4KzMsIHJjQ2VsbC0+b3BlcmF0aW9uUmF0ZUNvdW50LTEpOworICAgIGZvciAoaT1yY0NlbGwtPmN1cnJlbnRSYXRlSW5kZXg7IGkgPCByYXRlSW5kZXg7IGkrKykgeworICAgICAgICBVRFBUaHJvdWdocHV0ID0gemZSYXRlQ3RybFVEUFRQKGRldiwgemNSYXRlW3JjQ2VsbC0+b3BlcmF0aW9uUmF0ZVNldFtpXV0sCisgICAgICAgICAgICB3ZC0+UEVSW3JjQ2VsbC0+b3BlcmF0aW9uUmF0ZVNldFtpXV0pOworICAgICAgICBpZiAobWF4IDwgVURQVGhyb3VnaHB1dCkgeworICAgICAgICAgICAgbWF4ID0gVURQVGhyb3VnaHB1dDsKKyAgICAgICAgICAgIG1heEluZGV4ID0gaTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByY0NlbGwtPm9wZXJhdGlvblJhdGVTZXRbbWF4SW5kZXhdOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmUmF0ZUN0cmxHZXRUeFJhdGUgICAgICAgICAqLworLyogICAgICBHZXQgdHJhbnNtaXNzaW9uIHJhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcmNDZWxsIDogcmF0ZSBjb250cm9sIGNlbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHByb2JpbmcgOiByYXRlIHByb2JpbmcgZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFR4IHJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjIgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZlJhdGVDdHJsR2V0VHhSYXRlKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNSY0NlbGwqIHJjQ2VsbCwgdTE2X3QqIHByb2JpbmcpCit7CisgICAgdThfdCBuZXdSYXRlLCBoaWdoUmF0ZTsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bV9tc2cxX3R4KFpNX0xWXzMsICJ0eENvdW50PSIsIHJjQ2VsbC0+dHhDb3VudCk7CisgICAgem1fbXNnMV90eChaTV9MVl8zLCAicHJvYmluZ1RpbWU9IiwgcmNDZWxsLT5wcm9iaW5nVGltZSk7CisgICAgem1fbXNnMV90eChaTV9MVl8zLCAidGljaz0iLCB3ZC0+dGljayk7CisgICAgKnByb2JpbmcgPSAwOworICAgIG5ld1JhdGUgPSByY0NlbGwtPmN1cnJlbnRSYXRlOworCisgICAgaWYgKHdkLT5wcm9iZUNvdW50ICYmICh3ZC0+cHJvYmVDb3VudCA8IHdkLT5zdWNjZXNzX3Byb2JpbmcpKQorICAgIHsKKyAgICAgICAgaWYgKHdkLT5wcm9iZUludGVydmFsIDwgNTApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdkLT5wcm9iZUludGVydmFsKys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+cHJvYmVJbnRlcnZhbCsrOworICAgICAgICAgICAgaWYgKHdkLT5wcm9iZUludGVydmFsID4gNTIpIC8vcHJvYmUgNTEsIDUyLCA1MyB0aHJlZSBwYWNrZXRzIGV2ZXJ5IDUwIHBhY2tldHMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3ZC0+cHJvYmVJbnRlcnZhbCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXdSYXRlPXpmUmF0ZUN0cmxHZXRIaWdoZXJSYXRlKHJjQ2VsbCk7CisgICAgICAgICAgICAqcHJvYmluZyA9IDE7CisgICAgICAgICAgICB3ZC0+cHJvYmVDb3VudCsrOworICAgICAgICAgICAgcmNDZWxsLT5wcm9iaW5nVGltZSA9IHdkLT50aWNrOworICAgICAgICB9CisgICAgfQorICAgIC8qIEFjY3VtdWxhdGUgYXQgbGVhc3QgMTAwMG1zIGFuZCA4IHBhY2tldHMgb3IgQWNjdW11bGF0ZSBvdmVyIDFLIHBhY2tldHMgKi8KKyAgICBlbHNlIGlmICgoKCh3ZC0+dGljayAtIHJjQ2VsbC0+cHJvYmluZ1RpbWUpID4gKFpNX1JBVEVfQ1RSTF9QUk9CSU5HX0lOVEVSVkFMX01TL1pNX01TX1BFUl9USUNLKSkKKyAgICAgICAgICAgICAgICAmJiAocmNDZWxsLT50eENvdW50ID49IFpNX1JBVEVfQ1RSTF9NSU5fUFJPQklOR19QQUNLRVQpKQorICAgICAgICB8fCAocmNDZWxsLT50eENvdW50ID49IDEwMDApKQorICAgIHsKKyNpZm5kZWYgWk1fRElTQUJMRV9SQVRFX0NUUkwKKyAgICAgICAgLyogUEVSID0gZmFpbC90b3RhbCAqLworICAgICAgICB3ZC0+cHJvYmVDb3VudCA9IDA7CisgICAgICAgIHdkLT5wcm9iZVN1Y2Nlc3NDb3VudCA9IDA7CisgICAgICAgIGlmICh3ZC0+dHhNUERVW3JjQ2VsbC0+Y3VycmVudFJhdGVdICE9IDApIHsKKyAgICAgICAgICAgIHdkLT5QRVJbcmNDZWxsLT5jdXJyZW50UmF0ZV0gPSB6bV9hZ2dfbWluKDEwMCwKKyAgICAgICAgICAgICAgICAod2QtPnR4RmFpbFtyY0NlbGwtPmN1cnJlbnRSYXRlXSoxMDApL3dkLT50eE1QRFVbcmNDZWxsLT5jdXJyZW50UmF0ZV0pOworICAgICAgICAgICAgaWYgKCF3ZC0+UEVSW3JjQ2VsbC0+Y3VycmVudFJhdGVdKSB3ZC0+UEVSW3JjQ2VsbC0+Y3VycmVudFJhdGVdICsrOworICAgICAgICB9CisKKyAgICAgICAgLyogaWYgUEVSIDwgdGhyZXNob2xkLCBkbyByYXRlIHByb2JpbmcsIHJldHVybiBwcm9iaW5nIHJhdGUgKi8KKyAgICAgICAgaWYgKCh3ZC0+UEVSW3JjQ2VsbC0+Y3VycmVudFJhdGVdIDw9IChaTV9SQVRFX1BST0JJTkdfVEhSRVNIT0xEKzE1KSkgfHwKKyAgICAgICAgICAgICgocmNDZWxsLT5jdXJyZW50UmF0ZSA8PSAxNikgJiYKKyAgICAgICAgICAgICgod2QtPlBFUltyY0NlbGwtPmN1cnJlbnRSYXRlXS8yKSA8PSBaTV9SQVRFX1BST0JJTkdfVEhSRVNIT0xEKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgobmV3UmF0ZT16ZlJhdGVDdHJsR2V0SGlnaGVyUmF0ZShyY0NlbGwpKSAhPSByY0NlbGwtPmN1cnJlbnRSYXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpwcm9iaW5nID0gMTsKKyAgICAgICAgICAgICAgICB3ZC0+cHJvYmVDb3VudCsrOworICAgICAgICAgICAgICAgIHdkLT5wcm9iZUludGVydmFsID0gMDsKKyAgICAgICAgICAgICAgICB3ZC0+c3VjY2Vzc19wcm9iaW5nID0KKyAgICAgICAgICAgICAgICAgICAgKHJjQ2VsbC0+Y3VycmVudFJhdGUgPD0gMTYpPyAoWk1fUkFURV9TVUNDRVNTX1BST0JJTkcvMikgOiBaTV9SQVRFX1NVQ0NFU1NfUFJPQklORzsKKyAgICAgICAgICAgICAgICAvL0RiZ1ByaW50KCJTdGFydCBQcm9iaW5nIik7CisgICAgICAgICAgICAgICAgem1fbXNnMV90eChaTV9MVl8wLCAiUHJvYmluZyBSYXRlPSIsIG5ld1JhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYKKworICAgICAgICB6bV9tc2cwX3R4KFpNX0xWXzEsICJEaW1pbmlzaCBjb3VudGVyIik7CisgICAgICAgIHJjQ2VsbC0+ZmFpbENvdW50ID0gcmNDZWxsLT5mYWlsQ291bnQ+PjE7CisgICAgICAgIHJjQ2VsbC0+dHhDb3VudCA9IHJjQ2VsbC0+dHhDb3VudD4+MTsKKyAgICAgICAgd2QtPnR4RmFpbFtyY0NlbGwtPmN1cnJlbnRSYXRlXSA9IHdkLT50eEZhaWxbcmNDZWxsLT5jdXJyZW50UmF0ZV0gPj4gMTsKKyAgICAgICAgd2QtPnR4TVBEVVtyY0NlbGwtPmN1cnJlbnRSYXRlXSA9IHdkLT50eE1QRFVbcmNDZWxsLT5jdXJyZW50UmF0ZV0gPj4gMTsKKworCisgICAgICAgIGlmIChyY0NlbGwtPmN1cnJlbnRSYXRlID4gMTUpIHsKKyAgICAgICAgICAgIGhpZ2hSYXRlID0gemZSYXRlQ3RybEdldEhpZ2hlclJhdGUocmNDZWxsKTsKKyAgICAgICAgICAgIGlmICgoaGlnaFJhdGUgIT0gcmNDZWxsLT5jdXJyZW50UmF0ZSkgJiYgd2QtPlBFUltoaWdoUmF0ZV0gJiYKKyAgICAgICAgICAgICAgICAoKHdkLT5QRVJbcmNDZWxsLT5jdXJyZW50UmF0ZV0gKyBGYWlsRGlmZltyY0NlbGwtPmN1cnJlbnRSYXRlXSkgPgorICAgICAgICAgICAgICAgIHdkLT5QRVJbaGlnaFJhdGVdKSkgeworICAgICAgICAgICAgICAgIC8vRGJnUHJpbnQoIlBFUiBjb21wYXJlIGZvcmNlIHJhaXNlIHJhdGUgdG8gJWQiLCBoaWdoUmF0ZSk7CisgICAgICAgICAgICAgICAgd2QtPnByb2JlU3VjY2Vzc0NvdW50ID0gd2QtPnByb2JlQ291bnQgPSBaTV9SQVRFX1NVQ0NFU1NfUFJPQklORzsKKyAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsVHhTdWNjZXNzRXZlbnQoZGV2LCByY0NlbGwsIGhpZ2hSYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGhpZ2hSYXRlID0gemZSYXRlQ3RybEZpbmRNYXhVRFBUUChkZXYsIHJjQ2VsbCk7CisgICAgICAgICAgICBpZiAocmNDZWxsLT5jdXJyZW50UmF0ZSA8IGhpZ2hSYXRlKSB7CisgICAgICAgICAgICAgICAgLy9EYmdQcmludCgiVURQIFRocm91Z2hwdXQgY29tcGFyZSBmb3JjZSByYWlzZSByYXRlIHRvICVkIiwgaGlnaFJhdGUpOworICAgICAgICAgICAgICAgIHdkLT5wcm9iZVN1Y2Nlc3NDb3VudCA9IHdkLT5wcm9iZUNvdW50ID0gWk1fUkFURV9TVUNDRVNTX1BST0JJTkc7CisgICAgICAgICAgICAgICAgemZSYXRlQ3RybFR4U3VjY2Vzc0V2ZW50KGRldiwgcmNDZWxsLCBoaWdoUmF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmNDZWxsLT5wcm9iaW5nVGltZSA9IHdkLT50aWNrOworICAgIH0KKworICAgIGlmKCAod2QtPnRpY2sgPiAxMDAwKQorICAgICAgICAmJiAoKHdkLT50aWNrIC0gcmNDZWxsLT5sYXN0VGltZSkgPiAzODQwKSApCisgICAgeworICAgICAgICBpZiAocmNDZWxsLT5sYXN0dHhDb3VudCA8IDcwKQorICAgICAgICB7CisgICAgICAgICAgICByY0NlbGwtPmZhaWxDb3VudCA9IHJjQ2VsbC0+ZmFpbENvdW50Pj4xOworICAgICAgICAgICAgcmNDZWxsLT50eENvdW50ID0gcmNDZWxsLT50eENvdW50Pj4xOworICAgICAgICAgICAgd2QtPnR4RmFpbFtyY0NlbGwtPmN1cnJlbnRSYXRlXSA9IHdkLT50eEZhaWxbcmNDZWxsLT5jdXJyZW50UmF0ZV0gPj4gMTsKKyAgICAgICAgICAgIHdkLT50eE1QRFVbcmNDZWxsLT5jdXJyZW50UmF0ZV0gPSB3ZC0+dHhNUERVW3JjQ2VsbC0+Y3VycmVudFJhdGVdID4+IDE7CisKKyAgICAgICAgICAgIHJjQ2VsbC0+ZmFpbENvdW50ID0gKHJjQ2VsbC0+ZmFpbENvdW50IDwgcmNDZWxsLT50eENvdW50KT8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNDZWxsLT5mYWlsQ291bnQgOiByY0NlbGwtPnR4Q291bnQ7CisgICAgICAgICAgICB3ZC0+dHhGYWlsW3JjQ2VsbC0+Y3VycmVudFJhdGVdID0gKHdkLT50eEZhaWxbcmNDZWxsLT5jdXJyZW50UmF0ZV0gPCB3ZC0+dHhNUERVW3JjQ2VsbC0+Y3VycmVudFJhdGVdKT8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZC0+dHhGYWlsW3JjQ2VsbC0+Y3VycmVudFJhdGVdIDogd2QtPnR4TVBEVVtyY0NlbGwtPmN1cnJlbnRSYXRlXTsKKyAgICAgICAgfQorCisgICAgICAgIHJjQ2VsbC0+bGFzdFRpbWUgICAgPSB3ZC0+dGljazsKKyAgICAgICAgcmNDZWxsLT5sYXN0dHhDb3VudCA9IDA7CisgICAgfQorCisgICAgcmNDZWxsLT50eENvdW50Kys7CisgICAgcmNDZWxsLT5sYXN0dHhDb3VudCsrOworICAgIHdkLT50eE1QRFVbcmNDZWxsLT5jdXJyZW50UmF0ZV0rKzsKKyAgICB6bV9tc2cxX3R4KFpNX0xWXzEsICJHZXQgVHggUmF0ZT0iLCBuZXdSYXRlKTsKKyAgICByZXR1cm4gbmV3UmF0ZTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZSYXRlQ3RybFR4RmFpbEV2ZW50ICAgICAgICovCisvKiAgICAgIFR4IGZhaWwgZXZlbnQuIENhbGN1bGF0ZSBQRVIgYW5kIGxvd2VyIFR4IHJhdGUgaWYgdW5kZXIgICAgICAgICAqLworLyogICAgICBQRVIgdW5kZXIgdGhyZXNob2xkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICByY0NlbGwgOiByYXRlIGNvbnRyb2wgY2VsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcmV0cnlSYXRlIDogcmV0cnkgcmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuMiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZSYXRlQ3RybFR4RmFpbEV2ZW50KHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNSY0NlbGwqIHJjQ2VsbCwgdThfdCBhZ2dSYXRlLCB1MzJfdCByZXRyeVJhdGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworI2lmbmRlZiBaTV9ESVNBQkxFX1JBVEVfQ1RSTAorICAgIC8vRGJnUHJpbnQoImFnZ1JhdGU9JWQsIHJldHJ5UmF0ZT0lZCIsIGFnZ1JhdGUsIHJldHJ5UmF0ZSk7CisgICAgaWYgKGFnZ1JhdGUgJiYgKGFnZ1JhdGUgIT0gcmNDZWxsLT5jdXJyZW50UmF0ZSkpIHsKKyAgICAgICAgd2QtPnR4RmFpbFthZ2dSYXRlXSArPSByZXRyeVJhdGU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIWFnZ1JhdGUpIHsKKyAgICAgICAgcmV0cnlSYXRlID0gKHpmUmF0ZUN0cmxSYXRlRGlmZihyY0NlbGwsICh1OF90KXJldHJ5UmF0ZSkrMSk+PjE7CisgICAgICAgIGlmIChyY0NlbGwtPmN1cnJlbnRSYXRlIDwxMikgLy9sZWdhY3kgcmF0ZQorICAgICAgICB7CisgICAgICAgICAgICByZXRyeVJhdGUqPTI7CisgICAgICAgIH0KKyAgICB9CisgICAgcmNDZWxsLT5mYWlsQ291bnQgKz0gcmV0cnlSYXRlOworICAgIHdkLT50eEZhaWxbcmNDZWxsLT5jdXJyZW50UmF0ZV0gKz0gcmV0cnlSYXRlOworCisgICAgLy9EYmdQcmludCgiZmFpbENvdW50PSVkIiwgcmNDZWxsLT5mYWlsQ291bnQpOworICAgIGlmIChyY0NlbGwtPmZhaWxDb3VudCA+IFpNX01JTl9SQVRFX0ZBSUxfQ09VTlQpCisgICAgeworICAgICAgICBpZiAod2QtPnR4TVBEVVtyY0NlbGwtPmN1cnJlbnRSYXRlXSAhPSAwKSB7CisgICAgICAgICAgICB3ZC0+UEVSW3JjQ2VsbC0+Y3VycmVudFJhdGVdID0gem1fYWdnX21pbigxMDAsCisgICAgICAgICAgICAgICAgKHdkLT50eEZhaWxbcmNDZWxsLT5jdXJyZW50UmF0ZV0qMTAwKS93ZC0+dHhNUERVW3JjQ2VsbC0+Y3VycmVudFJhdGVdKTsKKyAgICAgICAgICAgIGlmICghd2QtPlBFUltyY0NlbGwtPmN1cnJlbnRSYXRlXSkgd2QtPlBFUltyY0NlbGwtPmN1cnJlbnRSYXRlXSArKzsKKyAgICAgICAgfQorICAgICAgICAvL3ptX21zZzFfdHgoWk1fTFZfMSwgIlBFUj0iLCBwZXIpOworICAgICAgICAvL0RiZ1ByaW50KCJQRVI9JWQsIHR4RmFpbD0lZCwgdHhNUERVPSVkIiwgd2QtPlBFUltyY0NlbGwtPmN1cnJlbnRSYXRlXSwgd2QtPnR4RmFpbFtyY0NlbGwtPmN1cnJlbnRSYXRlXSwgd2QtPnR4TVBEVVtyY0NlbGwtPmN1cnJlbnRSYXRlXSk7CisgICAgICAgIGlmICh3ZC0+UEVSW3JjQ2VsbC0+Y3VycmVudFJhdGVdID4gUEVSVGhyZXNob2xkW3JjQ2VsbC0+Y3VycmVudFJhdGVdKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBMb3dlciBUeCBSYXRlIGlmIFBFUiA8IFRIUkVTSE9MRCAqLworICAgICAgICAgICAgemZSYXRlQ3RybE5leHRMb3dlclJhdGUoZGV2LCByY0NlbGwpOworICAgICAgICAgICAgcmNDZWxsLT5mbGFnIHw9IFpNX1JDX1RSQUlORURfQklUOworCisgICAgICAgICAgICAvLyBSZXNvbHZlIGNvbXBhdGliaWxpdHkgcHJvYmxlbSB3aXRoIE1hcnZlbGwKKyAgICAgICAgICAgIGlmKHJjQ2VsbC0+Y3VycmVudFJhdGUgPT0gMTUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICB6ZkhwU2V0QWdnUGt0TnVtKGRldiwgOCk7CisgICAgICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2QtPnR4RmFpbFtyY0NlbGwtPmN1cnJlbnRSYXRlXSA9IHdkLT50eEZhaWxbcmNDZWxsLT5jdXJyZW50UmF0ZV0gPj4gMTsKKyAgICAgICAgICAgIHdkLT50eE1QRFVbcmNDZWxsLT5jdXJyZW50UmF0ZV0gPSB3ZC0+dHhNUERVW3JjQ2VsbC0+Y3VycmVudFJhdGVdID4+IDE7CisKKyAgICAgICAgICAgIHdkLT5wcm9iZUNvdW50ID0gd2QtPnByb2JlU3VjY2Vzc0NvdW50ID0gMDsKKyAgICAgICAgfQorICAgIH0KKworI2VuZGlmCisgICAgcmV0dXJuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlJhdGVDdHJsVHhTdWNjZXNzRXZlbnQgICAgKi8KKy8qICAgICAgVHggc3VjY2VzcyBldmVudC4gUmFpc2UgVHggcmF0ZSBiZWNhdXNlIHJhdGUgcHJvYmluZyBzdWNjZXNzLiAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcmNDZWxsIDogcmF0ZSBjb250cm9sIGNlbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHN1Y2Nlc3NSYXRlIDogc3VjY2VzcyByYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjIgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmUmF0ZUN0cmxUeFN1Y2Nlc3NFdmVudCh6ZGV2X3QqIGRldiwgc3RydWN0IHpzUmNDZWxsKiByY0NlbGwsIHU4X3Qgc3VjY2Vzc1JhdGUpCit7CisgICAgLyogUmFpc2UgVHggUmF0ZSAqLworICAgIHUxNl90IGksIFBFUlByb2JlOworICAgIHUxNl90IHBjb3VudDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgLy9EYmdQcmludCgiUHJvYmluZyBzdWNjZXNzUmF0ZT0lZCIsIHN1Y2Nlc3NSYXRlKTsKKyAgICAvKiBGaW5kIHN1Y2Nlc3NSYXRlIGluIG9wZXJhdGlvblJhdGVTZXRbXSAqLworICAgIHdkLT5wcm9iZVN1Y2Nlc3NDb3VudCsrOworICAgIGlmICh3ZC0+cHJvYmVDb3VudCA8IHdkLT5zdWNjZXNzX3Byb2JpbmcpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcGNvdW50ID0gd2QtPnByb2JlQ291bnQ7CisgICAgaWYgKHBjb3VudCAhPSAwKQorICAgIHsKKyAgICAgICAgUEVSUHJvYmUgPSB3ZC0+cHJvYmVTdWNjZXNzQ291bnQgKiAxMDAgLyBwY291bnQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFBFUlByb2JlID0gMTsKKyAgICB9CisKKyAgICBpZiAoUEVSUHJvYmUgPCAoKHJjQ2VsbC0+Y3VycmVudFJhdGUgPCAxNik/IDgwOjEwMCkpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vRGJnUHJpbnQoIndkLT5wcm9iZUNvdW50PSVkLCB3ZC0+cHJvYmVTdWNjZXNzQ291bnQ9JWQiLCB3ZC0+cHJvYmVDb3VudCwgd2QtPnByb2JlU3VjY2Vzc0NvdW50KTsKKyAgICB3ZC0+cHJvYmVDb3VudCA9IHdkLT5wcm9iZVN1Y2Nlc3NDb3VudCA9IDA7CisgICAgZm9yIChpPTA7IGk8cmNDZWxsLT5vcGVyYXRpb25SYXRlQ291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChzdWNjZXNzUmF0ZSA9PSByY0NlbGwtPm9wZXJhdGlvblJhdGVTZXRbaV0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpID4gcmNDZWxsLT5jdXJyZW50UmF0ZUluZGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFJhaXNlIGN1cnJlbnQgVHggcmF0ZSAqLworICAgICAgICAgICAgICAgIHptX21zZzFfdHgoWk1fTFZfMCwgIlJhaXNlIFR4IFJhdGU9Iiwgc3VjY2Vzc1JhdGUpOworICAgICAgICAgICAgICAgIC8vRGJnUHJpbnQoIlJhaXNlIFR4IFJhdGU9JWQiLCBzdWNjZXNzUmF0ZSk7CisKKyAgICAgICAgICAgICAgICAvLyBSZXNvbHZlIGNvbXBhdGliaWxpdHkgcHJvYmxlbSB3aXRoIE1hcnZlbGwKKyAgICAgICAgICAgICAgICBpZigocmNDZWxsLT5jdXJyZW50UmF0ZSA8PSAxNSkgJiYgKHN1Y2Nlc3NSYXRlID4gMTUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgemZIcFNldEFnZ1BrdE51bShkZXYsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByY0NlbGwtPmN1cnJlbnRSYXRlID0gc3VjY2Vzc1JhdGU7CisgICAgICAgICAgICAgICAgcmNDZWxsLT5jdXJyZW50UmF0ZUluZGV4ID0gKHU4X3QpaTsKKyAgICAgICAgICAgICAgICByY0NlbGwtPmZhaWxDb3VudCA9IHJjQ2VsbC0+dHhDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgcmNDZWxsLT5sYXN0dHhDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgcmNDZWxsLT5sYXN0VGltZSAgPSB3ZC0+dGljazsKKyAgICAgICAgICAgICAgICB3ZC0+dHhGYWlsW3JjQ2VsbC0+Y3VycmVudFJhdGVdID0gd2QtPnR4RmFpbFtyY0NlbGwtPmN1cnJlbnRSYXRlXSA+PiAxOworICAgICAgICAgICAgICAgIHdkLT50eE1QRFVbcmNDZWxsLT5jdXJyZW50UmF0ZV0gPSB3ZC0+dHhNUERVW3JjQ2VsbC0+Y3VycmVudFJhdGVdID4+IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmUmF0ZUN0cmxSeFJzc2lFdmVudCAgICAgICAqLworLyogICAgICBSeCBSU1NJIGV2ZW50LiBDYWxjdWxhdGUgUlNTSSBtb3ZpbmcgYXZlcmFnZSwgYWNjZWxhcmF0ZSAgICAgICAgKi8KKy8qICAgICAgcmF0ZSBwcm9iaW5nIGlmIFJTU0kgdmFyaWF0aW9uIG92ZXIgdGhyZXNob2xkLiAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgcmNDZWxsIDogcmF0ZSBjb250cm9sIGNlbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHN1Y2Nlc3NSYXRlIDogc3VjY2VzcyByYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjIgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmUmF0ZUN0cmxSeFJzc2lFdmVudChzdHJ1Y3QgenNSY0NlbGwqIHJjQ2VsbCwgdTE2X3QgcnhSc3NpKQoreworICAgIC8qIGlmIGRlbHRhKHJjQ2VsbC0+cnhSc3NpLCByeFJzc2kpID4gWk1fUkFURV9DVFJMX1JTU0lfVkFSSUFUSU9OICovCisgICAgaWYgKChyY0NlbGwtPnJ4UnNzaSAtIHJ4UnNzaSkgPiBaTV9SQVRFX0NUUkxfUlNTSV9WQVJJQVRJT04pCisgICAgeworICAgICAgICAvKiBBY2NlbGVyYXRlIHJhdGUgcHJvYmluZyB2aWEgZGVjcmVhaW5nIHJjQ2VsbC0+cHJvYmluZ1RpbWUgKi8KKyAgICAgICAgcmNDZWxsLT5wcm9iaW5nVGltZSAtPSBaTV9SQVRFX0NUUkxfUFJPQklOR19JTlRFUlZBTF9NUy9aTV9NU19QRVJfVElDSzsKKyAgICB9CisKKyAgICAvKiBVcGRhdGUgUlNTSSBtb3ZpbmcgYXZlcmFnZSAqLworICAgIHJjQ2VsbC0+cnhSc3NpID0gKCgocmNDZWxsLT5yeFJzc2kqNykgKyByeFJzc2kpKzQpID4+IDM7CisgICAgcmV0dXJuOworfQorCisKKyNpZmRlZiBaTV9FTkFCTEVfQkFfUkFURUNUUkwKK3U4X3QgSGlnaGVyUmF0ZSh1OF90IFJhdGUpIHsKKyAgICBpZiAoUmF0ZSA8IDI4KSBSYXRlKys7IC8vMjg9TUNTMTVTRywgMjc9TUNTMTUsIDI2PU1DUzE0LCAyNT1NQ1MxMworICAgIGlmIChSYXRlID4gMjgpIFJhdGUgPSAyODsKKyAgICB3aGlsZSAoKFJhdGUgPj0gMjApICYmIChSYXRlIDw9IDIzKSkgeworICAgICAgICBSYXRlICsrOworICAgIH0KKyAgICByZXR1cm4gUmF0ZTsKK30KKwordThfdCBMb3dlclJhdGUodThfdCBSYXRlKSB7CisgICAgaWYgKFJhdGUgPiAxKSBSYXRlLS07CisgICAgd2hpbGUgKChSYXRlID49IDIwKSAmJiAoUmF0ZSA8PSAyMykpIHsKKyAgICAgICAgUmF0ZSAtLTsKKyAgICB9CisgICAgcmV0dXJuIFJhdGU7Cit9CisKK3U4X3QgUmF0ZU1hcFRvUmF0ZUluZGV4KHU4X3QgUmF0ZSwgc3RydWN0IHpzUmNDZWxsKiByY0NlbGwpIHsKKyAgICB1OF90IGk7CisgICAgZm9yIChpPTA7IGk8cmNDZWxsLT5vcGVyYXRpb25SYXRlQ291bnQ7IGkrKykgeworICAgICAgICBpZiAoUmF0ZSA9PSByY0NlbGwtPm9wZXJhdGlvblJhdGVTZXRbaV0pIHsKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCit2b2lkIHpmUmF0ZUN0cmxBZ2dyU3RhKHpkZXZfdCogZGV2KSB7CisgICAgdThfdCBSYXRlSW5kZXgsIFJhdGU7CisgICAgdThfdCBIUmF0ZTsKKyAgICB1OF90IExSYXRlOworICAgIHUzMl90IFJhdGVDdHJsVHhNUERVLCBSYXRlQ3RybEJBRmFpbDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBSYXRlSW5kZXggPSB3ZC0+c3RhLm9wcG9zaXRlSW5mb1swXS5yY0NlbGwuY3VycmVudFJhdGVJbmRleDsKKyAgICBSYXRlID0gd2QtPnN0YS5vcHBvc2l0ZUluZm9bMF0ucmNDZWxsLm9wZXJhdGlvblJhdGVTZXRbUmF0ZUluZGV4XTsKKworICAgIFR4TVBEVVtSYXRlXSA9IChUeE1QRFVbUmF0ZV0gLyA1KSArICh3ZC0+Y29tbVRhbGx5LlJhdGVDdHJsVHhNUERVICogNCAvIDUpOworICAgIEJBRmFpbFtSYXRlXSA9IChCQUZhaWxbUmF0ZV0gLyA1KSArICh3ZC0+Y29tbVRhbGx5LlJhdGVDdHJsQkFGYWlsICogNCAvIDUpOworICAgIFJhdGVDdHJsVHhNUERVID0gd2QtPmNvbW1UYWxseS5SYXRlQ3RybFR4TVBEVTsKKyAgICBSYXRlQ3RybEJBRmFpbCA9IHdkLT5jb21tVGFsbHkuUmF0ZUN0cmxCQUZhaWw7CisgICAgd2QtPmNvbW1UYWxseS5SYXRlQ3RybFR4TVBEVSA9IDA7CisgICAgd2QtPmNvbW1UYWxseS5SYXRlQ3RybEJBRmFpbCA9IDA7CisgICAgaWYgKFR4TVBEVVtSYXRlXSA+IDApIHsKKyAgICAgICAgQkFQRVJbUmF0ZV0gPSBCQUZhaWxbUmF0ZV0gKiAxMDAwIC8gVHhNUERVW1JhdGVdOyAvL1BFUioxMDAwCisgICAgICAgIEJBUEVSW1JhdGVdID0gKEJBUEVSW1JhdGVdPjApPyBCQVBFUltSYXRlXToxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEhSYXRlID0gSGlnaGVyUmF0ZShSYXRlKTsKKyAgICBMUmF0ZSA9IExvd2VyUmF0ZShSYXRlKTsKKyAgICBpZiAoQkFQRVJbUmF0ZV0+MjAwKSB7CisgICAgICAgIGlmICgoUmF0ZUN0cmxUeE1QRFUgPiAxMDApICYmIChCQVBFUltSYXRlXTwzMDApICYmIChIUmF0ZSAhPSBSYXRlKSAmJiBCQVBFUltIUmF0ZV0gJiYKKyAgICAgICAgICAgIChCQVBFUltIUmF0ZV0gPCBCQVBFUltSYXRlXSArIEJBRGlmZltSYXRlXSkpIHsKKyAgICAgICAgICAgIFJhdGUgPSBIUmF0ZTsKKyAgICAgICAgICAgIC8vRGJnUHJpbnQoIlJhdGUgaW1wcm92ZWQgdG8gJWQiLCBSYXRlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFJhdGUgPSBMUmF0ZTsKKyAgICAgICAgICAgIC8vRGJnUHJpbnQoIlJhdGUgZGVjcmVhc2VkIHRvICVkIiwgUmF0ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoQkFQRVJbUmF0ZV0gJiYgQkFQRVJbUmF0ZV08MTAwKSB7CisgICAgICAgIGlmIChSYXRlQ3RybFR4TVBEVSA+IDEwMCkgeworICAgICAgICAgICAgUmF0ZSA9IEhSYXRlOworICAgICAgICAgICAgLy9EYmdQcmludCgiUmF0ZSBpbXByb3ZlZCB0byAlZCIsIFJhdGUpOworICAgICAgICB9CisgICAgfQorICAgIHdkLT5zdGEub3Bwb3NpdGVJbmZvWzBdLnJjQ2VsbC5jdXJyZW50UmF0ZSA9IFJhdGU7CisgICAgd2QtPnN0YS5vcHBvc2l0ZUluZm9bMF0ucmNDZWxsLmN1cnJlbnRSYXRlSW5kZXggPSBSYXRlTWFwVG9SYXRlSW5kZXgoUmF0ZSwgJndkLT5zdGEub3Bwb3NpdGVJbmZvWzBdLnJjQ2VsbCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9yYXRlY3RybC5oIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3JhdGVjdHJsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI0MTFkNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9yYXRlY3RybC5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9SQVRFQ1RSTF9ICisjZGVmaW5lIF9SQVRFQ1RSTF9ICisKKyNkZWZpbmUgWk1fUkFURV9DVFJMX1BST0JJTkdfSU5URVJWQUxfTVMgICAgMTAwMCAvLzEwMDBtcworI2RlZmluZSBaTV9SQVRFX0NUUkxfTUlOX1BST0JJTkdfUEFDS0VUICAgICA4CisKKyNkZWZpbmUgWk1fTUlOX1JBVEVfRkFJTF9DT1VOVCAgICAgICAgICAgICAgMjAKKworI2RlZmluZSBaTV9SQVRFX1BST0JJTkdfVEhSRVNIT0xEICAgICAgICAgICAxNSAgLy82JQorI2RlZmluZSBaTV9SQVRFX1NVQ0NFU1NfUFJPQklORyAgICAgICAgICAgICAxMAorCisjZGVmaW5lIFpNX1JBVEVfQ1RSTF9SU1NJX1ZBUklBVElPTiAgICAgICAgIDUgIC8vVEJECisKK2V4dGVybiBjb25zdCB1MzJfdCB6Y1JhdGVUb1BoeUN0cmxbXTsKKworZXh0ZXJuIHZvaWQgemZSYXRlQ3RybEluaXRDZWxsKHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNSY0NlbGwqIHJjQ2VsbCwgdThfdCB0eXBlLCB1OF90IGdCYW5kLCB1OF90IFNHNDApOworZXh0ZXJuIHUxNl90IHpmUmF0ZUN0cmxHZXRUeFJhdGUoemRldl90KiBkZXYsIHN0cnVjdCB6c1JjQ2VsbCogcmNDZWxsLCB1MTZfdCogcHJvYmluZyk7CitleHRlcm4gdm9pZCB6ZlJhdGVDdHJsVHhGYWlsRXZlbnQoemRldl90KiBkZXYsIHN0cnVjdCB6c1JjQ2VsbCogcmNDZWxsLCB1OF90IGFnZ1JhdGUsIHUzMl90IHJldHJ5UmF0ZSk7CitleHRlcm4gdm9pZCB6ZlJhdGVDdHJsVHhTdWNjZXNzRXZlbnQoemRldl90KiBkZXYsIHN0cnVjdCB6c1JjQ2VsbCogcmNDZWxsLCB1OF90IHN1Y2Nlc3NSYXRlKTsKK2V4dGVybiB2b2lkIHpmUmF0ZUN0cmxBZ2dyU3RhKHpkZXZfdCogZGV2KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3N0cnVjdC5oIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3N0cnVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YjVjZTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvc3RydWN0LmgKQEAgLTAsMCArMSwxMzE1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfU1RSVUNUX0gKKyNkZWZpbmUgX1NUUlVDVF9ICisKKyNpbmNsdWRlICIuLi9vYWxfbWFyYy5oIgorCisjZGVmaW5lIFpNX1NXX0xPT1BfQkFDSyAgICAgICAgICAgICAgICAgICAgIDAgLyogMT0+ZW5hYmxlLCAwPT5kaXNhYmxlICovCisjZGVmaW5lIFpNX1BDSV9MT09QX0JBQ0sgICAgICAgICAgICAgICAgICAgIDAgLyogMT0+ZW5hYmxlLCAwPT5kaXNhYmxlICovCisjZGVmaW5lIFpNX1BST1RPQ09MX1JFU1BPTlNFX1NJTVVMQVRJT04gICAgIDAKKworI2RlZmluZSBaTV9SWF9GUkFNRV9TSVpFICAgICAgICAgICAgICAgMTYwMAorCitleHRlcm4gY29uc3QgdThfdCB6ZzExYlJhdGVUYmxbNF07CitleHRlcm4gY29uc3QgdThfdCB6ZzExZ1JhdGVUYmxbOF07CisKKyNkZWZpbmUgWk1fRFJJVkVSX0NPUkVfTUFKT1JfVkVSU0lPTiAgICAgICAgMQorI2RlZmluZSBaTV9EUklWRVJfQ09SRV9NSU5PUl9WRVJTSU9OICAgICAgICAxCisjZGVmaW5lIFpNX0RSSVZFUl9DT1JFX0JSQU5DSF9NQUpPUl9WRVJTSU9OIDMKKyNkZWZpbmUgWk1fRFJJVkVSX0NPUkVfQlJBTkNIX01JTk9SX1ZFUlNJT04gMzkKKworI2lmbmRlZiBaTV9WVFhRX1NJWkUKKyNkZWZpbmUgWk1fVlRYUV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgMTAyNCAvLzJeTgorI2VuZGlmCisKKyNkZWZpbmUgWk1fVlRYUV9TSVpFX01BU0sgICAgICAgICAgICAgICAgICAgKFpNX1ZUWFFfU0laRS0xKQorI2RlZmluZSBaTV9WTU1RX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICA4IC8vMl5OCisjZGVmaW5lIFpNX1ZNTVFfU0laRV9NQVNLICAgICAgICAgICAgICAgICAgIChaTV9WTU1RX1NJWkUtMSkKKworI2luY2x1ZGUgImNhZ2cuaCIKKworI2RlZmluZSBaTV9BR0dfUE9PTF9TSVpFICAgICAgICAgICAgICAgICAgICAyMAorI2RlZmluZSBaTV9SQVRFX1RBQkxFX1NJWkUgICAgICAgICAgICAgICAgICAzMgorCisjZGVmaW5lIFpNX01BWF9CVUZfRElTQ1JFVEVfTlVNQkVSICAgICAgICAgIDUKKworCisKKworCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSUJTUyBtYWNyb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgWk1fSUJTU19QRUVSX0FMSVZFX0NPVU5URVIgICAgIDQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBCSVQgbWFwcGluZyByZWxhdGVkIG1hY3JvcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFpNX0JJVF8wICAgICAgIDB4MQorI2RlZmluZSBaTV9CSVRfMSAgICAgICAweDIKKyNkZWZpbmUgWk1fQklUXzIgICAgICAgMHg0CisjZGVmaW5lIFpNX0JJVF8zICAgICAgIDB4OAorI2RlZmluZSBaTV9CSVRfNCAgICAgICAweDEwCisjZGVmaW5lIFpNX0JJVF81ICAgICAgIDB4MjAKKyNkZWZpbmUgWk1fQklUXzYgICAgICAgMHg0MAorI2RlZmluZSBaTV9CSVRfNyAgICAgICAweDgwCisjZGVmaW5lIFpNX0JJVF84ICAgICAgIDB4MTAwCisjZGVmaW5lIFpNX0JJVF85ICAgICAgIDB4MjAwCisjZGVmaW5lIFpNX0JJVF8xMCAgICAgIDB4NDAwCisjZGVmaW5lIFpNX0JJVF8xMSAgICAgIDB4ODAwCisjZGVmaW5lIFpNX0JJVF8xMiAgICAgIDB4MTAwMAorI2RlZmluZSBaTV9CSVRfMTMgICAgICAweDIwMDAKKyNkZWZpbmUgWk1fQklUXzE0ICAgICAgMHg0MDAwCisjZGVmaW5lIFpNX0JJVF8xNSAgICAgIDB4ODAwMAorI2RlZmluZSBaTV9CSVRfMTYgICAgICAweDEwMDAwCisjZGVmaW5lIFpNX0JJVF8xNyAgICAgIDB4MjAwMDAKKyNkZWZpbmUgWk1fQklUXzE4ICAgICAgMHg0MDAwMAorI2RlZmluZSBaTV9CSVRfMTkgICAgICAweDgwMDAwCisjZGVmaW5lIFpNX0JJVF8yMCAgICAgIDB4MTAwMDAwCisjZGVmaW5lIFpNX0JJVF8yMSAgICAgIDB4MjAwMDAwCisjZGVmaW5lIFpNX0JJVF8yMiAgICAgIDB4NDAwMDAwCisjZGVmaW5lIFpNX0JJVF8yMyAgICAgIDB4ODAwMDAwCisjZGVmaW5lIFpNX0JJVF8yNCAgICAgIDB4MTAwMDAwMAorI2RlZmluZSBaTV9CSVRfMjUgICAgICAweDIwMDAwMDAKKyNkZWZpbmUgWk1fQklUXzI2ICAgICAgMHg0MDAwMDAwCisjZGVmaW5lIFpNX0JJVF8yNyAgICAgIDB4ODAwMDAwMAorI2RlZmluZSBaTV9CSVRfMjggICAgICAweDEwMDAwMDAwCisjZGVmaW5lIFpNX0JJVF8yOSAgICAgIDB4MjAwMDAwMDAgICAvL1dQQSBzdXBwb3J0CisjZGVmaW5lIFpNX0JJVF8zMCAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgWk1fQklUXzMxICAgICAgMHg4MDAwMDAwMAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTUFDIGFkZHJlc3MgcmVsYXRlZCBtYWNyb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgWk1fTUFDX0JZVEVfVE9fV09SRChtYWNiLCBtYWN3KSAgIG1hY3dbMF0gPSBtYWNiWzBdICsgKG1hY2JbMV0gPDwgOCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3dbMV0gPSBtYWNiWzJdICsgKG1hY2JbM10gPDwgOCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3dbMl0gPSBtYWNiWzRdICsgKG1hY2JbNV0gPDwgOCk7CisKKyNkZWZpbmUgWk1fTUFDX1dPUkRfVE9fQllURShtYWN3LCBtYWNiKSAgIG1hY2JbMF0gPSAodThfdCkgKG1hY3dbMF0gJiAweGZmKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjYlsxXSA9ICh1OF90KSAobWFjd1swXSA+PiA4KTsgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNiWzJdID0gKHU4X3QpIChtYWN3WzFdICYgMHhmZik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY2JbM10gPSAodThfdCkgKG1hY3dbMV0gPj4gOCk7ICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjYls0XSA9ICh1OF90KSAobWFjd1syXSAmIDB4ZmYpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNiWzVdID0gKHU4X3QpIChtYWN3WzJdID4+IDgpOworCisjZGVmaW5lIFpNX01BQ18wKG1hY3cpICAgKCh1OF90KShtYWN3WzBdICYgMHhmZikpCisjZGVmaW5lIFpNX01BQ18xKG1hY3cpICAgKCh1OF90KShtYWN3WzBdID4+IDgpKQorI2RlZmluZSBaTV9NQUNfMihtYWN3KSAgICgodThfdCkobWFjd1sxXSAmIDB4ZmYpKQorI2RlZmluZSBaTV9NQUNfMyhtYWN3KSAgICgodThfdCkobWFjd1sxXSA+PiA4KSkKKyNkZWZpbmUgWk1fTUFDXzQobWFjdykgICAoKHU4X3QpKG1hY3dbMl0gJiAweGZmKSkKKyNkZWZpbmUgWk1fTUFDXzUobWFjdykgICAoKHU4X3QpKG1hY3dbMl0gPj4gOCkpCisKKyNkZWZpbmUgWk1fSVNfTVVMVElDQVNUX09SX0JST0FEQ0FTVChtYWMpIChtYWNbMF0gJiAweDAxKQorI2RlZmluZSBaTV9JU19NVUxUSUNBU1QobWFjKSAoKG1hY1swXSAmIDB4MDEpICYmICgoKHU4X3QpbWFjWzBdKSAhPSAweEZGKSkKKworI2RlZmluZSBaTV9NQUNfRVFVQUwobWFjMSwgbWFjMikgICAoKG1hYzFbMF09PW1hYzJbMF0pJiYobWFjMVsxXT09bWFjMlsxXSkmJihtYWMxWzJdPT1tYWMyWzJdKSkKKyNkZWZpbmUgWk1fTUFDX05PVF9FUVVBTChtYWMxLCBtYWMyKSAgICgobWFjMVswXSE9bWFjMlswXSl8fChtYWMxWzFdIT1tYWMyWzFdKXx8KG1hYzFbMl0hPW1hYzJbMl0pKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBNQUMgYWRkcmVzcyByZWxhdGVkIG1hYydyb3MgKGVuZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgWk1fQllURV9UT19XT1JEKEEsIEIpICAgKChBPDw4KStCKQorI2RlZmluZSBaTV9ST0wzMiggQSwgbiApIFwKKyAgICAgICAgKCAoKEEpIDw8IChuKSkgfCAoICgoQSk+PigzMi0obikpKSAgJiAoICgxVUwgPDwgKG4pKSAtIDEgKSApICkKKyNkZWZpbmUgWk1fUk9SMzIoIEEsIG4gKSBaTV9ST0wzMiggKEEpLCAzMi0obikgKQorI2RlZmluZSBaTV9MTzgodjE2KSAgKCh1OF90KSgodjE2KSAmIDB4RkYpKQorI2RlZmluZSBaTV9ISTgodjE2KSAgKCh1OF90KSgoKHYxNik+PjgpJjB4RkYpKQorCisjaWZkZWYgWk1fRU5BQkxFX0JVRkZFUl9UUkFDRQorZXh0ZXJuIHZvaWQgemZ3QnVmVHJhY2UoemRldl90KiBkZXYsIHpidWZfdCAqYnVmLCB1OF90ICpmdW5jdGlvbk5hbWUpOworI2RlZmluZSBaTV9CVUZGRVJfVFJBQ0UoZGV2LCBidWYpICAgICAgIHpmd0J1ZlRyYWNlKGRldiwgYnVmLCBfX2Z1bmNfXyk7CisjZWxzZQorI2RlZmluZSBaTV9CVUZGRVJfVFJBQ0UoZGV2LCBidWYpCisjZW5kaWYKKworLyogbm90aWZpY2F0aW9uIGV2ZW50cyB0byBoZWFydCBiZWF0IGZ1bmN0aW9uICovCisjZGVmaW5lIFpNX0JTU0lEX0xJU1RfU0NBTiAgICAgICAgIDB4MDEKKworLyogQ0FNIG1vZGUgKi8KKyNkZWZpbmUgWk1fQ0FNX0FQICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgWk1fQ0FNX1NUQSAgICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgWk1fQ0FNX0hPU1QgICAgICAgICAgICAgICAgICAgICAweDQKKworLyogZmluaXRlIHN0YXRlIG1hY2hpbmUgZm9yIGFkYXB0ZXIgKi8KKyNkZWZpbmUgWk1fU1RBX1NUQVRFX0RJU0NPTk5FQ1QgICAgICAgICAgIDEKKyNkZWZpbmUgWk1fU1RBX1NUQVRFX0NPTk5FQ1RJTkcgICAgICAgICAgIDIKKyNkZWZpbmUgWk1fU1RBX1NUQVRFX0NPTk5FQ1RFRCAgICAgICAgICAgIDMKKworLyogRXZlbnQgZGVmaW5pdGlvbnMgZm9yICBmaW5pdGUgc3RhdGUgbWFjaGluZSAqLworI2RlZmluZSBaTV9FVkVOVF9USU1FT1VUX1NDQU4gICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIFpNX0VWRU5UX1RJTUVPVVRfQkdfU0NBTiAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgWk5fRVZFTlRfVElNRU9VVF9SRUNPTk5FQ1QgICAgICAgIDB4MDAwMgorI2RlZmluZSBaTV9FVkVOVF9USU1FT1VUX0lOSVRfU0NBTiAgICAgICAgMHgwMDAzCisjZGVmaW5lIFpNX0VWRU5UX1RJTUVPVVRfQVVUSCAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgWk1fRVZFTlRfVElNRU9VVF9BU1NPICAgICAgICAgICAgIDB4MDAwNQorI2RlZmluZSBaTV9FVkVOVF9USU1FT1VUX0FVVE9fU0NBTiAgICAgICAgMHgwMDA2CisjZGVmaW5lIFpNX0VWRU5UX1RJTUVPVVRfTUlDX0ZBSUwgICAgICAgICAweDAwMDcKKyNkZWZpbmUgWk1fRVZFTlRfVElNRU9VVF9DSEVDS19BUCAgICAgICAgIDB4MDAwOAorI2RlZmluZSBaTV9FVkVOVF9DT05ORUNUICAgICAgICAgICAgICAgICAgMHgwMDA5CisjZGVmaW5lIFpNX0VWRU5UX0lOSVRfU0NBTiAgICAgICAgICAgICAgICAweDAwMGEKKyNkZWZpbmUgWk1fRVZFTlRfU0NBTiAgICAgICAgICAgICAgICAgICAgIDB4MDAwYgorI2RlZmluZSBaTV9FVkVOVF9CR19TQ0FOICAgICAgICAgICAgICAgICAgMHgwMDBjCisjZGVmaW5lIFpNX0VWRU5UX0RJU0NPTk5FQ1QgICAgICAgICAgICAgICAweDAwMGQKKyNkZWZpbmUgWk1fRVZFTlRfV1BBX01JQ19GQUlMICAgICAgICAgICAgIDB4MDAwZQorI2RlZmluZSBaTV9FVkVOVF9BUF9BTElWRSAgICAgICAgICAgICAgICAgMHgwMDBmCisjZGVmaW5lIFpNX0VWRU5UX0NIQU5HRV9UT19BUCAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgWk1fRVZFTlRfQ0hBTkdFX1RPX1NUQSAgICAgICAgICAgIDB4MDAxMQorI2RlZmluZSBaTV9FVkVOVF9JRExFICAgICAgICAgICAgICAgICAgICAgMHgwMDEyCisjZGVmaW5lIFpNX0VWRU5UX0FVVEggICAgICAgICAgICAgICAgICAgICAweDAwMTMKKyNkZWZpbmUgWk1fRVZFTlRfQVNTT19SU1AgICAgICAgICAgICAgICAgIDB4MDAxNAorI2RlZmluZSBaTV9FVkVOVF9XUEFfUEtfT0sgICAgICAgICAgICAgICAgMHgwMDE1CisjZGVmaW5lIFpNX0VWRU5UX1dQQV9HS19PSyAgICAgICAgICAgICAgICAweDAwMTYKKyNkZWZpbmUgWk1fRVZFTlRfUkNWX0JFQUNPTiAgICAgICAgICAgICAgIDB4MDAxNworI2RlZmluZSBaTV9FVkVOVF9SQ1ZfUFJPQkVfUlNQICAgICAgICAgICAgMHgwMDE4CisjZGVmaW5lIFpNX0VWRU5UX1NFTkRfREFUQSAgICAgICAgICAgICAgICAweDAwMTkKKyNkZWZpbmUgWk1fRVZFTlRfQVVUT19TQ0FOICAgICAgICAgICAgICAgIDB4MDAxYQorI2RlZmluZSBaTV9FVkVOVF9NSUNfRkFJTDEgICAgICAgICAgICAgICAgMHgwMDFkCisjZGVmaW5lIFpNX0VWRU5UX01JQ19GQUlMMiAgICAgICAgICAgICAgICAweDAwMWUKKyNkZWZpbmUgWk1fRVZFTlRfSUJTU19NT05JVE9SICAgICAgICAgICAgIDB4MDAxZgorI2RlZmluZSBaTV9FVkVOVF9JTl9TQ0FOICAgICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFpNX0VWRU5UX0NNX1RJTUVSICAgICAgICAgICAgICAgICAweDAwMjEKKyNkZWZpbmUgWk1fRVZFTlRfQ01fRElTQ09OTkVDVCAgICAgICAgICAgIDB4MDAyMgorI2RlZmluZSBaTV9FVkVOVF9DTV9CTE9DS19USU1FUiAgICAgICAgICAgMHgwMDIzCisjZGVmaW5lIFpNX0VWRU5UX1RJTUVPVVRfQUREQkEgICAgICAgICAgICAweDAwMjQKKyNkZWZpbmUgWk1fRVZFTlRfVElNRU9VVF9QRVJGT1JNQU5DRSAgICAgIDB4MDAyNQorI2RlZmluZSBaTV9FVkVOVF9TS0lQX0NPVU5URVJNRUFTVVJFCSAgMHgwMDI2CisjZGVmaW5lIFpNX0VWRU5UX05PTkUgICAgICAgICAgICAgICAgICAgICAweGZmZmYKKworLyogQWN0aW9ucyBhZnRlciBjYWxsIGZpbml0ZSBzdGF0ZSBtYWNoaW5lICovCisjZGVmaW5lIFpNX0FDVElPTl9OT05FICAgICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgWk1fQUNUSU9OX1FVRVVFX0RBVEEgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBaTV9BQ1RJT05fRFJPUF9EQVRBICAgICAgICAgICAgICAgMHgwMDAyCisKKy8qIFRpbWVycyBmb3IgZmluaXRlIHN0YXRlIG1hY2hpbmUgKi8KKyNkZWZpbmUgWk1fVElDS19aRVJPICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWk1fVElDS19JTklUX1NDQU5fRU5EICAgICAgICAgICAgIDgKKyNkZWZpbmUgWk1fVElDS19ORVhUX0JHX1NDQU4gICAgICAgICAgICAgIDUwCisjZGVmaW5lIFpNX1RJQ0tfQkdfU0NBTl9FTkQgICAgICAgICAgICAgICA4CisjZGVmaW5lIFpNX1RJQ0tfQVVUSF9USU1FT1VUICAgICAgICAgICAgICA0CisjZGVmaW5lIFpNX1RJQ0tfQVNTT19USU1FT1VUICAgICAgICAgICAgICA0CisjZGVmaW5lIFpNX1RJQ0tfQVVUT19TQ0FOICAgICAgICAgICAgICAgICAzMDAKKyNkZWZpbmUgWk1fVElDS19NSUNfRkFJTF9USU1FT1VUICAgICAgICAgIDYwMDAKKyNkZWZpbmUgWk1fVElDS19DSEVDS19BUDEgICAgICAgICAgICAgICAgIDE1MAorI2RlZmluZSBaTV9USUNLX0NIRUNLX0FQMiAgICAgICAgICAgICAgICAgMzUwCisjZGVmaW5lIFpNX1RJQ0tfQ0hFQ0tfQVAzICAgICAgICAgICAgICAgICAyNTAKKyNkZWZpbmUgWk1fVElDS19JQlNTX01PTklUT1IgICAgICAgICAgICAgIDE2MAorI2RlZmluZSBaTV9USUNLX0lOX1NDQU4gICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBaTV9USUNLX0NNX1RJTUVPVVQgICAgICAgICAgICAgICAgNjAwMAorI2RlZmluZSBaTV9USUNLX0NNX0RJU0NPTk5FQ1QgICAgICAgICAgICAgMjAwCisjZGVmaW5lIFpNX1RJQ0tfQ01fQkxPQ0tfVElNRU9VVCAgICAgICAgICA2MDAwCisKKy8qIEZpeCBidWcjMzMzMzggQ291bnRlciBNZWFzdXJlIElzc3VyICovCisjaWZkZWYgTkRJU19DTV9GT1JfWFAKKyNkZWZpbmUgWk1fVElDS19DTV9USU1FT1VUX09GRlNFVCAgICAgICAgMjE2MAorI2RlZmluZSBaTV9USUNLX0NNX0RJU0NPTk5FQ1RfT0ZGU0VUICAgICA3MgorI2RlZmluZSBaTV9USUNLX0NNX0JMT0NLX1RJTUVPVVRfT0ZGU0VUICAyMTYwCisjZWxzZQorI2RlZmluZSBaTV9USUNLX0NNX1RJTUVPVVRfT0ZGU0VUICAgICAgICAwCisjZGVmaW5lIFpNX1RJQ0tfQ01fRElTQ09OTkVDVF9PRkZTRVQgICAgIDAKKyNkZWZpbmUgWk1fVElDS19DTV9CTE9DS19USU1FT1VUX09GRlNFVCAgMAorI2VuZGlmCisKKyNkZWZpbmUgWk1fVElNRV9BQ1RJVkVfU0NBTiAgICAgICAgICAgICAgIDMwIC8vbXMKKyNkZWZpbmUgWk1fVElNRV9QQVNTSVZFX1NDQU4gICAgICAgICAgICAgIDExMCAvL21zCisKKy8qIGZpbml0ZSBzdGF0ZSBtYWNoaW5lIGZvciBCU1MgY29ubmVjdCAqLworI2RlZmluZSBaTV9TVEFfQ09OTl9TVEFURV9OT05FICAgICAgICAgICAgMAorI2RlZmluZSBaTV9TVEFfQ09OTl9TVEFURV9BVVRIX09QRU4gICAgICAgMQorI2RlZmluZSBaTV9TVEFfQ09OTl9TVEFURV9BVVRIX1NIQVJFXzEgICAgMgorI2RlZmluZSBaTV9TVEFfQ09OTl9TVEFURV9BVVRIX1NIQVJFXzIgICAgMworI2RlZmluZSBaTV9TVEFfQ09OTl9TVEFURV9BU1NPQ0lBVEUgICAgICAgNAorI2RlZmluZSBaTV9TVEFfQ09OTl9TVEFURV9TU0lEX05PVF9GT1VORCAgNQorI2RlZmluZSBaTV9TVEFfQ09OTl9TVEFURV9BVVRIX0NPTVBMRVRFRCAgNgorCisvKiBmaW5pdGUgc3RhdGUgbWFjaGluZSBmb3IgV1BBIGhhbmRzaGFraW5nICovCisjZGVmaW5lIFpNX1NUQV9XUEFfU1RBVEVfSU5JVCAgICAgICAgICAgICAwCisjZGVmaW5lIFpNX1NUQV9XUEFfU1RBVEVfUEtfT0sgICAgICAgICAgICAxCisjZGVmaW5lIFpNX1NUQV9XUEFfU1RBVEVfR0tfT0sgICAgICAgICAgICAyCisKKy8qIHZhcmlvdXMgdGltZXJzICovCisjZGVmaW5lIFpNX0lOVEVSVkFMX0NPTk5FQ1RfVElNRU9VVCAgICAgICAgICAyMCAgIC8qIDIwMCBtaWxpc2Vjb25kICovCisKKy8qIElCU1MgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgWk1fSUJTU19QQVJUTkVSX0xPU1QgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWk1fSUJTU19QQVJUTkVSX0FMSVZFICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWk1fSUJTU19QQVJUTkVSX0NIRUNLICAgICAgICAgICAgICAgIDIKKworI2RlZmluZSBaTV9CQ01DX0FSUkFZX1NJWkUgICAgICAgICAgICAgICAgICAxNiAvKiBNdXN0IGJlIDJeTiAqLworI2RlZmluZSBaTV9VTklfQVJSQVlfU0laRSAgICAgICAgICAgICAgICAgICAxNiAvKiBNdXN0IGJlIDJeTiAqLworCisjZGVmaW5lIFpNX01BWF9ERUZSQUdfRU5UUklFUyAgICAgICAgICAgICAgIDQgIC8qIDJeTiAqLworI2RlZmluZSBaTV9ERUZSQUdfQUdJTkdfVElNRV9TRUMgICAgICAgICAgICA1ICAvKiA1IHNlY29uZHMgKi8KKworI2RlZmluZSBaTV9NQVhfV1BBSUVfU0laRSAgICAgICAgICAgICAgICAgICAxMjgKKy8qIFdFUCByZWxhdGVkIGRlZmluaXRpb25zICovCisjZGVmaW5lIFpNX1VTRVJfS0VZX0RFRkFVTFQgICAgICAgICAgICAgICAgIDY0CisjZGVmaW5lIFpNX1VTRVJfS0VZX1BLICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgLyogUGFpcndpc2UgS2V5ICovCisjZGVmaW5lIFpNX1VTRVJfS0VZX0dLICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgLyogR3JvdXAgS2V5ICovCisvKiBBUCBXTEFOIFR5cGUgKi8KKyNkZWZpbmUgWk1fV0xBTl9UWVBFX1BVUkVfQiAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBaTV9XTEFOX1RZUEVfUFVSRV9HICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpNX1dMQU5fVFlQRV9NSVhFRCAgICAgICAgICAgICAgICAgIDAKKworLyogSEFMIFN0YXRlICovCisjZGVmaW5lIFpNX0hBTF9TVEFURV9JTklUICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWk1fSEFMX1NUQVRFX1JVTk5JTkcgICAgICAgICAgICAgICAgMQorCisvKiBBUCBDYXBhYmlsaXR5ICovCisjZGVmaW5lIFpNX0FsbDExTl9BUCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgWk1fWFJfQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBaTV9TdXBlckdfQVAgICAgICAgICAgICAgICAgICAgICAgICAweDA0CisKKy8qIE1QRFUgRGVuc2l0eSAqLworI2RlZmluZSBaTV9NUERVX0RFTlNJVFlfTk9ORSAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpNX01QRFVfREVOU0lUWV8xXzhVUyAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWk1fTVBEVV9ERU5TSVRZXzFfNFVTICAgICAgICAgICAgICAgMgorI2RlZmluZSBaTV9NUERVX0RFTlNJVFlfMV8yVVMgICAgICAgICAgICAgICAzCisjZGVmaW5lIFpNX01QRFVfREVOU0lUWV8xVVMgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgWk1fTVBEVV9ERU5TSVRZXzJVUyAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBaTV9NUERVX0RFTlNJVFlfNFVTICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFpNX01QRFVfREVOU0lUWV84VVMgICAgICAgICAgICAgICAgIDcKKworLyogU29mdHdhcmUgRW5jcnlwdGlvbiAqLworI2RlZmluZSBaTV9TV19US0lQX0VOQ1JZX0VOICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgWk1fU1dfVEtJUF9ERUNSWV9FTiAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIFpNX1NXX1dFUF9FTkNSWV9FTiAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBaTV9TV19XRVBfREVDUllfRU4gICAgICAgICAgICAgICAgIDB4MDgKKworLyogRGVmYXVsdCBTdXBwb3J0IFJhdGUgKi8KKyNkZWZpbmUgWk1fREVGQVVMVF9TVVBQT1JUX1JBVEVfWkVSTyAgICAgICAweDAKKyNkZWZpbmUgWk1fREVGQVVMVF9TVVBQT1JUX1JBVEVfRElTQ09OTkVDVCAweDEKKyNkZWZpbmUgWk1fREVGQVVMVF9TVVBQT1JUX1JBVEVfSUJTU19CICAgICAweDIKKyNkZWZpbmUgWk1fREVGQVVMVF9TVVBQT1JUX1JBVEVfSUJTU19BRyAgICAweDMKKworLyogc2VjdXJpdHkgcmVsYXRlZCBkZWZpbml0aW9ucyAqLworc3RydWN0IHpzVGtpcFNlZWQKK3sKKyAgICB1OF90ICAgdGtbMzJdOyAgICAgLyoga2V5ICovCisgICAgdThfdCAgIHRhWzZdOworICAgIHUxNl90ICB0dGFrWzVdOworICAgIHUxNl90ICBwcGtbNl07CisgICAgdTE2X3QgIGl2MTYsaXYxNnRtcDsKKyAgICB1MzJfdCAgaXYzMixpdjMydG1wOworfTsKKworc3RydWN0IHpzTWljVmFyCit7CisgICAgdTMyX3QgIGswLCBrMTsgICAgICAgIC8vIEtleQorICAgIHUzMl90ICBsZWZ0LCByaWdodDsgICAvLyBDdXJyZW50IHN0YXRlCisgICAgdTMyX3QgIG07ICAgICAgICAgICAgIC8vIE1lc3NhZ2UgYWNjdW11bGF0b3IgKHNpbmdsZSB3b3JkKQorICAgIHUxNl90ICBuQnl0ZXM7ICAgICAgICAvLyAjIGJ5dGVzIGluIE0KK307CisKK3N0cnVjdCB6c0RlZnJhZ0VudHJ5Cit7CisgICAgdThfdCAgICBmcmFnQ291bnQ7CisgICAgdThfdCAgICBhZGRyWzZdOworICAgIHUxNl90ICAgc2VxTnVtOworICAgIHpidWZfdCogZnJhZ21lbnRbOF07CisgICAgdTMyX3QgICB0aWNrOworfTsKKworc3RydWN0IHpzRGVmcmFnTGlzdAoreworICAgIHN0cnVjdCB6c0RlZnJhZ0VudHJ5ICAgZGVmcmFnRW50cnlbWk1fTUFYX0RFRlJBR19FTlRSSUVTXTsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgIHJlcGxhY2VOdW07Cit9OworCisjZGVmaW5lIFpNX01BWF9PUFBPU0lURV9DT1VOVCAgICAgIDE2CisjZGVmaW5lIFpNX01BWF9UWF9TQU1QTEVTICAgICAgICAgIDE1CisjZGVmaW5lIFpNX1RYX1JBVEVfRE9XTl9DUklURVJJQSAgIDgwCisjZGVmaW5lIFpNX1RYX1JBVEVfVVBfQ1JJVEVSSUEgICAgMjAwCisKKworI2RlZmluZSBaTV9NQVhfUFJPQkVfSElEREVOX1NTSURfU0laRSAyCitzdHJ1Y3QgenNTc2lkTGlzdAoreworICAgIHU4X3QgICAgICAgICAgICBzc2lkWzMyXTsKKyAgICB1OF90ICAgICAgICAgICAgc3NpZExlbjsKK307CisKK3N0cnVjdCB6c1dyYXBwZXJTZXR0aW5nCit7CisgICAgdThfdCAgICAgICAgICAgIGJEZXNpcmVkQnNzaWQ7CisgICAgdThfdCAgICAgICAgICAgIGRlc2lyZWRCc3NpZFs2XTsKKyAgICB1MTZfdCAgICAgICAgICAgYnNzaWRbM107CisgICAgdThfdCAgICAgICAgICAgIHNzaWRbMzJdOworICAgIHU4X3QgICAgICAgICAgICBzc2lkTGVuOworICAgIHU4X3QgICAgICAgICAgICBhdXRoTW9kZTsKKyAgICB1OF90ICAgICAgICAgICAgd2VwU3RhdHVzOworICAgIHU4X3QgICAgICAgICAgICBlbmNyeU1vZGU7CisgICAgdThfdCAgICAgICAgICAgIHdsYW5Nb2RlOworICAgIHUxNl90ICAgICAgICAgICBmcmVxdWVuY3k7CisgICAgdTE2X3QgICAgICAgICAgIGJlYWNvbkludGVydmFsOworICAgIHU4X3QgICAgICAgICAgICBkdGltOworICAgIHU4X3QgICAgICAgICAgICBwcmVhbWJsZVR5cGU7CisgICAgdTE2X3QgICAgICAgICAgIGF0aW1XaW5kb3c7CisKKyAgICBzdHJ1Y3QgenNTc2lkTGlzdCBwcm9iaW5nU3NpZExpc3RbWk1fTUFYX1BST0JFX0hJRERFTl9TU0lEX1NJWkVdOworCisgICAgdThfdCAgICAgICAgICAgIGRyb3BVbmVuY3J5cHRlZFBrdHM7CisgICAgdThfdCAgICAgICAgICAgIGlic3NKb2luT25seTsKKyAgICB1MzJfdCAgICAgICAgICAgYWRob2NNb2RlOworICAgIHU4X3QgICAgICAgICAgICBjb3VudHJ5SXNvTmFtZVs0XTsKKyAgICB1MTZfdCAgICAgICAgICAgYXV0b1NldEZyZXF1ZW5jeTsKKworICAgIC8qIEFQICovCisgICAgdThfdCAgICAgICAgICAgIGJSYXRlQmFzaWM7CisgICAgdThfdCAgICAgICAgICAgIGdSYXRlQmFzaWM7CisgICAgdTMyX3QgICAgICAgICAgIG5SYXRlQmFzaWM7CisgICAgdThfdCAgICAgICAgICAgIGJnTW9kZTsKKworICAgIC8qIENvbW1vbiAqLworICAgIHU4X3QgICAgICAgICAgICBzdGFXbWVFbmFibGVkOworICAgIHU4X3QgICAgICAgICAgICBzdGFXbWVRb3NJbmZvOworICAgIHU4X3QgICAgICAgICAgICBhcFdtZUVuYWJsZWQ7CisKKworICAgIC8qIHJhdGUgaW5mb3JtYXRpb246IGFkZGVkIGluIHRoZSBmdXR1cmUgKi8KK307CisKK3N0cnVjdCB6c1dyYXBwZXJGZWF0dXJlQ3RybAoreworICAgIHU4X3QgICAgICAgICAgIGJJYnNzR01vZGU7Cit9OworCisjZGVmaW5lICBaTV9NQVhfUFNfU1RBICAgICAgICAgICAgMTYKKyNkZWZpbmUgIFpNX1BTX1FVRVVFX1NJWkUgICAgICAgICAzMgorCitzdHJ1Y3QgenNTdGFQU0VudGl0eQoreworICAgIHU4X3QgICAgICAgICAgIGJVc2VkOworICAgIHU4X3QgICAgICAgICAgIG1hY0FkZHJbNl07CisgICAgdThfdCAgICAgICAgICAgYkRhdGFRdWV1ZWQ7Cit9OworCitzdHJ1Y3QgenNTdGFQU0xpc3QKK3sKKyAgICB1OF90ICAgICAgICAgICBjb3VudDsKKyAgICBzdHJ1Y3QgenNTdGFQU0VudGl0eSAgICBlbnRpdHlbWk1fTUFYX1BTX1NUQV07Cit9OworCisjZGVmaW5lIFpNX01BWF9USU1FUl9DT1VOVCAgIDMyCisKKy8qIGRvdWJsZSBsaW5rZWQgbGlzdCAqLworc3RydWN0IHpzVGltZXJFbnRyeQoreworICAgIHUxNl90ICAgZXZlbnQ7CisgICAgdTMyX3QgICB0aW1lcjsKKyAgICBzdHJ1Y3QgenNUaW1lckVudHJ5ICpwcmU7CisgICAgc3RydWN0IHpzVGltZXJFbnRyeSAqbmV4dDsKK307CisKK3N0cnVjdCB6c1RpbWVyTGlzdAoreworICAgIHU4X3QgICBmcmVlQ291bnQ7CisgICAgc3RydWN0IHpzVGltZXJFbnRyeSBsaXN0W1pNX01BWF9USU1FUl9DT1VOVF07CisgICAgc3RydWN0IHpzVGltZXJFbnRyeSAqaGVhZDsKKyAgICBzdHJ1Y3QgenNUaW1lckVudHJ5ICp0YWlsOworfTsKKworLyogTXVsdGljYXN0IGxpc3QgKi8KKyNkZWZpbmUgWk1fTUFYX01VTFRJQ0FTVF9MSVNUX1NJWkUgICAgIDY0CisKK3N0cnVjdCB6c011bHRpY2FzdEFkZHIKK3sKKyAgICB1OF90IGFkZHJbNl07Cit9OworCitzdHJ1Y3QgenNNdWx0aWNhc3RMaXN0Cit7CisgICAgdThfdCAgIHNpemU7CisgICAgc3RydWN0IHpzTXVsdGljYXN0QWRkciBtYWNBZGRyW1pNX01BWF9NVUxUSUNBU1RfTElTVF9TSVpFXTsKK307CisKK2VudW0gaWVlZTgwMjExX2N3bV9tb2RlIHsKKyAgICBDV01fTU9ERTIwLAorICAgIENXTV9NT0RFMjA0MCwKKyAgICBDV01fTU9ERTQwLAorICAgIENXTV9NT0RFTUFYCisKK307CisKK2VudW0gaWVlZTgwMjExX2N3bV9leHRwcm90c3BhY2luZyB7CisgICAgQ1dNX0VYVFBST1RTUEFDSU5HMjAsCisgICAgQ1dNX0VYVFBST1RTUEFDSU5HMjUsCisgICAgQ1dNX0VYVFBST1RTUEFDSU5HTUFYCit9OworCitlbnVtIGllZWU4MDIxMV9jd21fd2lkdGggeworICAgIENXTV9XSURUSDIwLAorICAgIENXTV9XSURUSDQwCit9OworCitlbnVtIGllZWU4MDIxMV9jd21fZXh0cHJvdG1vZGUgeworICAgIENXTV9FWFRQUk9UTk9ORSwgIC8qIG5vIHByb3RlY3Rpb24gKi8KKyAgICBDV01fRVhUUFJPVENUU09OTFksICAgLyogQ1RTIHRvIHNlbGYgKi8KKyAgICBDV01fRVhUUFJPVFJUU0NUUywgICAgLyogUlRTLUNUUyAqLworICAgIENXTV9FWFRQUk9UTUFYCit9OworCitzdHJ1Y3QgaWVlZTgwMjExX2N3bSB7CisKKyAgICAvKiBDb25maWd1cmF0aW9uICovCisgICAgZW51bSBpZWVlODAyMTFfY3dtX21vZGUgICAgICAgICBjd19tb2RlOyAgICAgICAgICAgIC8qIENXTSBtb2RlICovCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBjd19leHRvZmZzZXQ7ICAgICAgIC8qIENXTSBFeHRlbnNpb24gQ2hhbm5lbCBPZmZzZXQgKi8KKyAgICBlbnVtIGllZWU4MDIxMV9jd21fZXh0cHJvdG1vZGUgIGN3X2V4dHByb3Rtb2RlOyAgICAgLyogQ1dNIEV4dGVuc2lvbiBDaGFubmVsIFByb3RlY3Rpb24gTW9kZSAqLworICAgIGVudW0gaWVlZTgwMjExX2N3bV9leHRwcm90c3BhY2luZyBjd19leHRwcm90c3BhY2luZzsvKiBDV00gRXh0ZW5zaW9uIENoYW5uZWwgUHJvdGVjdGlvbiBTcGFjaW5nICovCisgICAgdTMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICBjd19lbmFibGU7ICAgICAgICAgIC8qIENXTSBTdGF0ZSBNYWNoaW5lIEVuYWJsZWQgKi8KKyAgICB1MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIGN3X2V4dGJ1c3l0aHJlc2hvbGQ7LyogQ1dNIEV4dGVuc2lvbiBDaGFubmVsIEJ1c3kgVGhyZXNob2xkICovCisKKyAgICAvKiBTdGF0ZSAqLworICAgIGVudW0gaWVlZTgwMjExX2N3bV93aWR0aCAgICAgICAgY3dfd2lkdGg7ICAgICAgICAgICAvKiBDV00gY2hhbm5lbCB3aWR0aCAqLworfTsKKworCisvKiBBUCA6IFNUQSBkYXRhYmFzZSBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCB6c1N0YVRhYmxlCit7CisgICAgdTMyX3QgdGltZTsgICAgIC8qIHRpY2sgdGltZSAqLworICAgIC8vdTMyX3QgcGh5Q3RybDsgICAvKiBUeCBQSFkgQ1RSTCAqLworICAgIHUxNl90IGFkZHJbM107ICAvKiBTVEEgTUFDIGFkZHJlc3MgKi8KKyAgICB1MTZfdCBzdGF0ZTsgICAgLyogYXV0L2Fzb2MgKi8KKyAgICAvL3UxNl90IHJldHJ5OyAgICAvKiBSZXRyeSBjb3VudCAqLworICAgIHN0cnVjdCB6c1JjQ2VsbCByY0NlbGw7CisKKyAgICB1OF90IHZhbGlkOyAgICAgLyogVmFsaWQgZmxhZyA6IDE9PnZhbGlkICovCisgICAgdThfdCBwc01vZGU7ICAgIC8qIFNUQSBwb3dlciBzYXZpbmcgbW9kZSAqLworICAgIHU4X3Qgc3RhVHlwZTsgICAvKiAwPT4xMWIsIDE9PjExZywgMj0+MTFuICovCisgICAgdThfdCBxb3NUeXBlOyAgIC8qIDA9PkxlZ2FjeSwgMT0+V01FICovCisgICAgdThfdCBxb3NJbmZvOyAgIC8qIFdNRSBRb1MgaW5mbyAqLworICAgIHU4X3QgdmFwOyAgICAgICAvKiBWaXJ0dWFsIEFQIElEICovCisgICAgdThfdCBlbmNyeU1vZGU7IC8qIEVuY3J5cHRpb24gdHlwZSBmb3IgdGhpcyBTVEEgKi8KKyAgICB1OF90IGtleUlkeDsKKyAgICBzdHJ1Y3QgenNNaWNWYXIgICAgIHR4TWljS2V5OworICAgIHN0cnVjdCB6c01pY1ZhciAgICAgcnhNaWNLZXk7CisgICAgdTE2X3QgaXYxNjsKKyAgICB1MzJfdCBpdjMyOworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgLyogQ0VOQyAqLworICAgIHU4X3QgY2VuY0tleUlkeDsKKyAgICB1MzJfdCB0eGl2WzRdOworICAgIHUzMl90IHJ4aXZbNF07CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworfTsKKworc3RydWN0IHpkU3RydWN0V2RzCit7CisgICAgdThfdCAgICB3ZHNCaXRtYXA7ICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBiaXQtTiB0byAxIHRvIGVuYWJsZSBXRFMgKi8KKyAgICB1OF90ICAgIGVuY3J5TW9kZVtaTV9NQVhfV0RTX1NVUFBPUlRdOyAgLyogV0RTIGVuY3J5cHRpb24gbW9kZSAqLworICAgIHUxNl90ICAgbWFjQWRkcltaTV9NQVhfV0RTX1NVUFBPUlRdWzNdOyAvKiBXRFMgbmVpZ2hib3IgTUFDIGFkZHJlc3MgKi8KK307CisKKyAgICAvLyBodGNhcGluZm8gMTZiaXRzCisjZGVmaW5lIEhUQ0FQX0FkdkNvZGluZ0NhcCAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgSFRDQVBfU3VwQ2hhbm5lbFdpZHRoU2V0ICAgIDB4MDAwMgorI2RlZmluZSBIVENBUF9EeW5hbWljU01QUyAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIEhUQ0FQX1NNRW5hYmxlZCAgICAgICAgICAgICAweDAwMEMKKyNkZWZpbmUgSFRDQVBfR3JlZW5GaWVsZCAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBIVENBUF9TaG9ydEdJZm9yMjBNSHogICAgICAgMHgwMDIwCisjZGVmaW5lIEhUQ0FQX1Nob3J0R0lmb3I0ME1IeiAgICAgICAweDAwNDAKKyNkZWZpbmUgSFRDQVBfVHhTVEJDICAgICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBIVENBUF9SeE9uZVN0cmVhbSAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIEhUQ0FQX1J4VHdvU3RyZWFtICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgSFRDQVBfUnhUaHJlZVN0cmVhbSAgICAgICAgIDB4MDMwMAorI2RlZmluZSBIVENBUF9EZWxheWVkQmxvY2tBQ0sgICAgICAgMHgwNDAwCisjZGVmaW5lIEhUQ0FQX01heEFNU0RVTGVuZ3RoICAgICAgICAweDA4MDAKKyNkZWZpbmUgSFRDQVBfRFNTU2FuZENDS2luNDBNSHogICAgIDB4MTAwMAorI2RlZmluZSBIVENBUF9QU01QU3VwICAgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIEhUQ0FQX1NUQkNDb250cm9sRnJhbWVTdXAgICAweDQwMDAKKyNkZWZpbmUgSFRDQVBfTFNJR1RYT1BQcm90ZWN0aW9uU1VQIDB4ODAwMAorICAgIC8vIEFtcGR1IEhUIFBhcmFtZXRlciBJbmZvIDhiaXRzCisjZGVmaW5lIEhUQ0FQX01heFJ4QU1QRFUwICAgICAgICAgICAweDAwCisjZGVmaW5lIEhUQ0FQX01heFJ4QU1QRFUxICAgICAgICAgICAweDAxCisjZGVmaW5lIEhUQ0FQX01heFJ4QU1QRFUyICAgICAgICAgICAweDAyCisjZGVmaW5lIEhUQ0FQX01heFJ4QU1QRFUzICAgICAgICAgICAweDAzCisgICAgLy8gUENPIDhiaXRzCisjZGVmaW5lIEhUQ0FQX1BDTyAgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIEhUQ0FQX1RyYW5zbWlzc2lvblRpbWUxICAgICAweDAyCisjZGVmaW5lIEhUQ0FQX1RyYW5zbWlzc2lvblRpbWUyICAgICAweDA0CisjZGVmaW5lIEhUQ0FQX1RyYW5zbWlzc2lvblRpbWUzICAgICAweDA2CisgICAgLy8gTUNTIEZlZWRCYWNrIDhiaXRzCisjZGVmaW5lIEhUQ0FQX1BsdXNIVENTdXBwb3J0ICAgICAgICAweDA0CisjZGVmaW5lIEhUQ0FQX1JEUmVzcG9uZGVyICAgICAgICAgICAweDA4CisgICAgLy8gVFggQmVhbWZvcm1pbmcgMCA4Yml0cworI2RlZmluZSBIVENBUF9UeEJGQ2FwYWJsZSAgICAgICAgICAgMHgwMQorI2RlZmluZSBIVENBUF9SeFN0YWdnZXJlZFNvdW5kQ2FwICAgMHgwMgorI2RlZmluZSBIVENBUF9UeFN0YWdnZXJlZFNvdW5kQ2FwICAgMHgwNAorI2RlZmluZSBIVENBUF9SeFpMRkNhcGFibGUgICAgICAgICAgMHgwOAorI2RlZmluZSBIVENBUF9UeFpMRkNhcGFibGUgICAgICAgICAgMHgxMAorI2RlZmluZSBIVENBUF9JbXBsaWNpdFR4QkZDYXBhYmxlICAgMHgyMAorICAgIC8vIFR4IEJlYW1mb3JtaW5nIDEgOGJpdHMKKyNkZWZpbmUgSFRDQVBfRXhwbGljaXRDU0lUeEJGQ2FwICAgIDB4MDEKKyNkZWZpbmUgSFRDQVBfRXhwVW5jb21wU3RlZXJNYXRyQ2FwIDB4MDIKKyAgICAvLyBBbnRlbm5hIFNlbGVjdGlvbiBDYXBhYmlsaXRpZXMgOGJpdHMKKyNkZWZpbmUgSFRDQVBfQW50ZW5uYVNlbGVjdGlvbkNhcCAgICAgICAweDAxCisjZGVmaW5lIEhUQ0FQX0V4cGxpY2l0Q1NJVHhBU0NhcCAgICAgICAgMHgwMgorI2RlZmluZSBIVENBUF9BbnRlbm5hSW5kRmVlVHhBU0NhcCAgICAgIDB4MDQKKyNkZWZpbmUgSFRDQVBfRXhwbGljaXRDU0lGZWVkYmFja0NhcCAgICAweDA4CisjZGVmaW5lIEhUQ0FQX0FudGVubmFJbmRGZWVkYmFja0NhcCAgICAgMHgxMAorI2RlZmluZSBIVENBUF9SeEFTQ2FwICAgICAgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgSFRDQVBfVHhTb3VuZFBQRFVzQ2FwICAgICAgICAgICAweDQwCisKKworCitzdHJ1Y3QgenNIVENhcGFiaWxpdHkKK3sKKyAgICB1OF90IEVsZW1lbnRJRDsKKyAgICB1OF90IExlbmd0aDsKKyAgICAvLyBIVCBDYXBhYmlsaXR5IEluZm8KKyAgICB1MTZfdCBIdENhcEluZm87CisgICAgdThfdCBBTVBEVVBhcmFtOworICAgIHU4X3QgTUNTU2V0WzE2XTsgICAgLy8xNiBieXRlcworICAgIC8vIEV4dGVuZGVkIEhUIENhcGFiaWxpdHkgSW5mbworICAgIHU4X3QgUENPOworICAgIHU4X3QgTUNTRmVlZEJhY2s7CisKKyAgICB1OF90IFR4QkZDYXBbNF07CisgICAgdThfdCBBc2VsQ2FwOworfTsKKwordW5pb24genVIVENhcGFiaWxpdHkKK3sKKyAgICBzdHJ1Y3QgenNIVENhcGFiaWxpdHkgRGF0YTsKKyAgICB1OF90IEJ5dGVbMjhdOworfTsKKworICAgIC8vY2hhbm5lbGluZm8gOGJpdHMKKyNkZWZpbmUgRXh0SHRDYXBfRXh0Q2hhbm5lbE9mZnNldEFib3ZlICAweDAxCisjZGVmaW5lIEV4dEh0Q2FwX0V4dENoYW5uZWxPZmZzZXRCZWxvdyAgMHgwMworI2RlZmluZSBFeHRIdENhcF9SZWNvbVR4V2lkdGhTZXQgICAgICAgIDB4MDQKKyNkZWZpbmUgRXh0SHRDYXBfUklGU01vZGUgICAgICAgICAgICAgICAweDA4CisjZGVmaW5lIEV4dEh0Q2FwX0NvbnRyb2xBY2Nlc3NPbmx5ICAgICAgMHgxMAorICAgIC8vb3BlcmF0aW5naW5mbyAxNmJpdHMKKyNkZWZpbmUgRXh0SHRDYXBfTm9uR0ZEZXZpY2VQcmVzZW50ICAgICAweDAwMDQKKyAgICAvL2JlYWNvbmluZm8gMTZiaXRzCisjZGVmaW5lIEV4dEh0Q2FwX0R1YWxCZWFjb24gICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIEV4dEh0Q2FwX0R1YWxTVEJDUHJvdGVjdGlvbiAgICAgMHgwMDgwCisjZGVmaW5lIEV4dEh0Q2FwX1NlY29uZGFyeUJlYWNvbiAgICAgICAgMHgwMTAwCisjZGVmaW5lIEV4dEh0Q2FwX0xTSUdUWE9QUHJvdGVjdEZ1bGxTdXAgMHgwMjAwCisjZGVmaW5lIEV4dEh0Q2FwX1BDT0FjdGl2ZSAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIEV4dEh0Q2FwX1BDT1BoYXNlICAgICAgICAgICAgICAgMHgwODAwCisKKworc3RydWN0IHpzRXh0SFRDYXBhYmlsaXR5Cit7CisgICAgdThfdCAgICBFbGVtZW50SUQ7CisgICAgdThfdCAgICBMZW5ndGg7CisgICAgdThfdCAgICBDb250cm9sQ2hhbm5lbDsKKyAgICB1OF90ICAgIENoYW5uZWxJbmZvOworICAgIHUxNl90ICAgT3BlcmF0aW5nSW5mbzsKKyAgICB1MTZfdCAgIEJlYWNvbkluZm87CisgICAgLy8gU3VwcG9ydGVkIE1DUyBTZXQKKyAgICB1OF90ICAgIE1DU1NldFsxNl07Cit9OworCit1bmlvbiB6dUV4dEhUQ2FwYWJpbGl0eQoreworICAgIHN0cnVjdCB6c0V4dEhUQ2FwYWJpbGl0eSBEYXRhOworICAgIHU4X3QgQnl0ZVsyNF07Cit9OworCitzdHJ1Y3QgSW5mb3JtYXRpb25FbGVtZW50U3RhIHsKKyAgICBzdHJ1Y3QgenNIVENhcGFiaWxpdHkgICAgICAgSHRDYXA7CisgICAgc3RydWN0IHpzRXh0SFRDYXBhYmlsaXR5ICAgIEh0SW5mbzsKK307CisKK3N0cnVjdCBJbmZvcm1hdGlvbkVsZW1lbnRBcCB7CisgICAgc3RydWN0IHpzSFRDYXBhYmlsaXR5ICAgICAgIEh0Q2FwOworfTsKKworI2RlZmluZSBaTV9NQVhfRlJFUV9SRVFfUVVFVUUgIDMyCit0eXBlZGVmIHZvaWQgKCp6ZnBGcmVxQ2hhbmdlQ29tcGxldGVDYikoemRldl90KiBkZXYpOworCitzdHJ1Y3QgenNXbGFuRGV2RnJlcUNvbnRyb2wKK3sKKyAgICB1MTZfdCAgICAgICAgICAgICAgICAgICAgIGZyZXFSZXFRdWV1ZVtaTV9NQVhfRlJFUV9SRVFfUVVFVUVdOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgICBmcmVxUmVxQnc0MFtaTV9NQVhfRlJFUV9SRVFfUVVFVUVdOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgICBmcmVxUmVxRXh0T2Zmc2V0W1pNX01BWF9GUkVRX1JFUV9RVUVVRV07CisgICAgemZwRnJlcUNoYW5nZUNvbXBsZXRlQ2IgICBmcmVxQ2hhbmdlQ29tcENiW1pNX01BWF9GUkVRX1JFUV9RVUVVRV07CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgICBmcmVxUmVxUXVldWVIZWFkOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgICAgZnJlcVJlcVF1ZXVlVGFpbDsKK307CisKK3N0cnVjdCB6c1dsYW5EZXZBcAoreworICAgIHUxNl90ICAgcHJvdGVjdGVkT2JzczsgICAgLyogcHJvdGVjdGVkIG92ZXJsYXAgQlNTICovCisgICAgdTE2X3QgICBzdGFBZ2luZ1RpbWVTZWM7ICAvKiBpbiBzZWNvbmQsIFNUQSB3aWxsIGJlIGRlYXRoZWQgaWYgaXQgZG9lcyBub3QgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFjdGl2ZSBmb3IgdGhpcyBsb25nIHRpbWUgICAgICAgICAgICAgICAgICAgICAqLworICAgIHUxNl90ICAgc3RhUHJvYmluZ1RpbWVTZWM7LyogaW4gc2Vjb25kLCBTVEEgd2lsbCBiZSBwcm9iZWQgaWYgaXQgZG9lcyBub3QgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhY3RpdmUgZm9yIHRoaXMgbG9uZyB0aW1lICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1OF90ICAgIGF1dGhTaGFyaW5nOyAgICAgIC8qIGF1dGhlbnRpY2F0aW9uIG9uIGdvaW5nKi8KKyAgICB1OF90ICAgIGJTdGFBc3NvY2lhdGVkOyAgIC8qIDExYiBTVEEgYXNzb2NpYXRlZCAqLworICAgIHU4X3QgICAgZ1N0YUFzc29jaWF0ZWQ7ICAgLyogMTFnIFNUQSBhc3NvY2lhdGVkICovCisgICAgdThfdCAgICBuU3RhQXNzb2NpYXRlZDsgICAvKiAxMW4gU1RBIGFzc29jaWF0ZWQgKi8KKyAgICB1MTZfdCAgIHByb3RlY3Rpb25Nb2RlOyAgIC8qIEFQIHByb3RlY3Rpb24gbW9kZSBmbGFnICovCisgICAgdTE2X3QgICBzdGFQb3dlclNhdmluZzsgICAvKiBTZXQgYXNzb2NpYXRlZCBwb3dlciBzYXZpbmcgU1RBIGNvdW50ICovCisKKworCisgICAgemJ1Zl90KiAgdW5pQXJyYXlbWk1fVU5JX0FSUkFZX1NJWkVdOyAvKiBhcnJheSB0byBzdG9yZSB1bmljYXN0IGZyYW1lcyAqLworICAgIHUxNl90ICAgdW5pSGVhZDsKKyAgICB1MTZfdCAgIHVuaVRhaWw7CisKKyAgICAvKiBIVCBDYXBhYmlsaXR5IEluZm8gKi8KKyAgICB1bmlvbiB6dUhUQ2FwYWJpbGl0eSBIVENhcDsgLy9DV1lhbmcoKykKKworICAgIC8qIEV4dGVuZGVkIEhUIENhcGFiaWxpdHkgSW5mbyAqLworICAgIHVuaW9uIHp1RXh0SFRDYXBhYmlsaXR5IEV4dEhUQ2FwOyAvL0NXWWFuZygrKQorCisgICAgLyogU1RBIHRhYmxlICovCisgICAgc3RydWN0IHpzU3RhVGFibGUgc3RhVGFibGVbWk1fTUFYX1NUQV9TVVBQT1JUXTsKKworICAgIC8qIFdEUyAqLworICAgIHN0cnVjdCB6ZFN0cnVjdFdkcyB3ZHM7CisgICAgLyogV1BBICovCisgICAgdThfdCB3cGFJZVtaTV9NQVhfQVBfU1VQUE9SVF1bWk1fTUFYX1dQQUlFX1NJWkVdOworICAgIHU4X3Qgd3BhTGVuW1pNX01BWF9BUF9TVVBQT1JUXTsKKyAgICB1OF90IHN0YXdwYUllW1pNX01BWF9BUF9TVVBQT1JUXVtaTV9NQVhfV1BBSUVfU0laRV07CisgICAgdThfdCBzdGF3cGFMZW5bWk1fTUFYX0FQX1NVUFBPUlRdOworICAgIHU4X3Qgd3BhU3VwcG9ydFtaTV9NQVhfQVBfU1VQUE9SVF07CisKKyAgICAvL3N0cnVjdCB6c1RraXBTZWVkICAgYmNTZWVkOworICAgIHU4X3QgYmNLZXlJbmRleFtaTV9NQVhfQVBfU1VQUE9SVF07CisgICAgdThfdCBiY0hhbEtleUlkeFtaTV9NQVhfQVBfU1VQUE9SVF07CisgICAgc3RydWN0IHpzTWljVmFyICAgICBiY01pY0tleVtaTV9NQVhfQVBfU1VQUE9SVF07CisgICAgdTE2X3QgaXYxNltaTV9NQVhfQVBfU1VQUE9SVF07CisgICAgdTMyX3QgaXYzMltaTV9NQVhfQVBfU1VQUE9SVF07CisKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgIC8qIENFTkMgKi8KKyAgICB1MzJfdCB0eGl2W1pNX01BWF9BUF9TVVBQT1JUXVs0XTsKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisKKyAgICAvKiBWaXJ0dWFsIEFQICovCisgICAgdThfdCAgICBiZWFjb25Db3VudGVyOworICAgIHU4X3QgICAgdmFwTnVtYmVyOworICAgIHU4X3QgICAgYXBCaXRtYXA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBiaXQtTiB0byAxIHRvIGVuYWJsZSBWQVAgKi8KKyAgICB1OF90ICAgIGhpZGVTc2lkW1pNX01BWF9BUF9TVVBQT1JUXTsKKyAgICB1OF90ICAgIGF1dGhBbGdvW1pNX01BWF9BUF9TVVBQT1JUXTsKKyAgICB1OF90ICAgIHNzaWRbWk1fTUFYX0FQX1NVUFBPUlRdWzMyXTsgICAgICAvKiBTU0lEICovCisgICAgdThfdCAgICBzc2lkTGVuW1pNX01BWF9BUF9TVVBQT1JUXTsgICAgICAgLyogU1NJRCBsZW5ndGggKi8KKyAgICB1OF90ICAgIGVuY3J5TW9kZVtaTV9NQVhfQVBfU1VQUE9SVF07CisgICAgdThfdCAgICB3ZXBTdGF0dXNbWk1fTUFYX0FQX1NVUFBPUlRdOworICAgIHUxNl90ICAgY2FwYWJbWk1fTUFYX0FQX1NVUFBPUlRdOyAgICAgICAgIC8qIENhcGFiaWxpdHkgKi8KKyAgICB1OF90ICAgIHRpbUJjbWNCaXRbWk1fTUFYX0FQX1NVUFBPUlRdOyAgICAvKiBCTUNNIGJpdCBvZiBUSU0gKi8KKyAgICB1OF90ICAgIHdsYW5UeXBlW1pNX01BWF9BUF9TVVBQT1JUXTsKKworICAgIC8qIEFycmF5IHRvIHN0b3JlIEJDIG9yIE1DIGZyYW1lcyAqLworICAgIHpidWZfdCogIGJjbWNBcnJheVtaTV9NQVhfQVBfU1VQUE9SVF1bWk1fQkNNQ19BUlJBWV9TSVpFXTsKKyAgICB1MTZfdCAgIGJjbWNIZWFkW1pNX01BWF9BUF9TVVBQT1JUXTsKKyAgICB1MTZfdCAgIGJjbWNUYWlsW1pNX01BWF9BUF9TVVBQT1JUXTsKKworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHFvc01vZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxPT5XTUUgKi8KKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICB1YXBzZEVuYWJsZWQ7CisgICAgc3RydWN0IHpzUXVldWUqICAgICAgICAgdWFwc2RROworCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgY2hhbGxlbmdlVGV4dFsxMjhdOworCisgICAgc3RydWN0IEluZm9ybWF0aW9uRWxlbWVudEFwIGllW1pNX01BWF9TVEFfU1VQUE9SVF07CisKKworfTsKKworI2RlZmluZSBaTV9NQVhfQkxPQ0tJTkdfQVBfTElTVF9TSVpFICAgIDQgLyogMl5OICovCitzdHJ1Y3QgenNCbG9ja2luZ0FwCit7CisgICAgdThfdCBhZGRyWzZdOworICAgIHU4X3Qgd2VpZ2h0OworfTsKKworI2RlZmluZSBaTV9TQ0FOX01HUl9TQ0FOX05PTkUgICAgICAgICAgIDAKKyNkZWZpbmUgWk1fU0NBTl9NR1JfU0NBTl9JTlRFUk5BTCAgICAgICAxCisjZGVmaW5lIFpNX1NDQU5fTUdSX1NDQU5fRVhURVJOQUwgICAgICAgMgorCitzdHJ1Y3QgenNXbGFuRGV2U3RhU2Nhbk1ncgoreworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHNjYW5SZXFzWzJdOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGN1cnJTY2FuVHlwZTsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBzY2FuU3RhcnREZWxheTsKK307CisKKyNkZWZpbmUgWk1fUFNfTVNHX1NUQVRFX0FDVElWRSAgICAgICAgICAwCisjZGVmaW5lIFpNX1BTX01TR19TVEFURV9TTEVFUCAgICAgICAgICAgMQorI2RlZmluZSBaTV9QU19NU0dfU1RBVEVfVDEgICAgICAgICAgICAgIDIKKyNkZWZpbmUgWk1fUFNfTVNHX1NUQVRFX1QyICAgICAgICAgICAgICAzCisjZGVmaW5lIFpNX1BTX01TR19TVEFURV9TMSAgICAgICAgICAgICAgNAorCisjZGVmaW5lIFpNX1BTX01BWF9TTEVFUF9QRVJJT0RTICAgICAgICAgMyAgICAgICAvLyBUaGUgbnVtYmVyIG9mIGJlYWNvbiBwZXJpb2RzCisKK3N0cnVjdCB6c1dsYW5EZXZTdGFQU01ncgoreworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHN0YXRlOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGlzU2xlZXBBbGxvd2VkOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIG1heFNsZWVwUGVyaW9kczsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICB0aWNrczsKKyAgICB1MzJfdCAgICAgICAgICAgICAgICAgICBsYXN0VHhVbmljYXN0RnJtOworICAgIHUzMl90ICAgICAgICAgICAgICAgICAgIGxhc3RUeE11bHRpY2FzdEZybTsKKyAgICB1MzJfdCAgICAgICAgICAgICAgICAgICBsYXN0VHhCcm9hZGNhc3RGcm07CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgdGVtcFdha2VVcDsgLyplbmFibGUgd2hlbiB3YWtlIHVwIGJ1dCBzdGlsbCBpbiBwcyBtb2RlICovCisgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgc2xlZXBBbGxvd2VkdGljazsKK307CisKK3N0cnVjdCB6c1dsYW5EZXZTdGEKK3sKKyAgICB1MzJfdCAgICAgICAgICAgICAgICAgICBiZWFjb25UeENudDsgIC8qIFRyYW5zbWl0dGVkIGJlYWNvbiBjb3VudGVyIChpbiBJQlNTKSAqLworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHR4QmVhY29uSW5kOyAgLyogSW4gSUJTUyBtb2RlLCB0cnVlIG1lYW5zIHRoYXQgd2UganVzdCB0cmFuc21pdCBhIGJlYWNvbiBkdXJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgYmVhY29uIHBlcmlvZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIGJlYWNvbkNudDsgICAgLyogcmVjZWl2ZSBiZWFjb24gY291bnQsIHdpbGwgYmUgcGVyb2RpY2FsbHkgcmVzZXQgKi8KKyAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBic3NpZFszXTsgICAgIC8qIEJTU0lEIG9mIGNvbm5lY3RlZCBBUCAqLworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHNzaWRbMzJdOyAgICAgLyogU1NJRCAqLworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHNzaWRMZW47ICAgICAgLyogU1NJRCBsZW5ndGggKi8KKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBtVHhSYXRlOyAgICAgIC8qIFR4IHJhdGUgZm9yIG11bHRpY2FzdCAqLworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHVUeFJhdGU7ICAgICAgLyogVHggcmF0ZSBmb3IgdW5pY2FzdCAqLworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIG1tVHhSYXRlOyAgICAgLyogVHggcmF0ZSBmb3IgbWFuYWdlbWVudCBmcmFtZSAqLworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGJDaGFubmVsU2NhbjsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBiU2NoZWR1bGVTY2FuOworCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgSW50ZXJuYWxTY2FuUmVxOworICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIGFjdGl2ZXNjYW5UaWNrUGVyQ2hhbm5lbDsKKyAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBwYXNzaXZlU2NhblRpY2tQZXJDaGFubmVsOworICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIHNjYW5GcmVxdWVuY3k7CisgICAgdTMyX3QgICAgICAgICAgICAgICAgICAgY29ublBvd2VySW5IYWxmRGJtOworCisgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgY3VycmVudEZyZXF1ZW5jeTsKKyAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBjdXJyZW50Qnc0MDsKKyAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBjdXJyZW50RXh0T2Zmc2V0OworCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgYlBhc3NpdmVTY2FuOworCisgICAgc3RydWN0IHpzQmxvY2tpbmdBcCAgICAgYmxvY2tpbmdBcExpc3RbWk1fTUFYX0JMT0NLSU5HX0FQX0xJU1RfU0laRV07CisKKyAgICAvL3N0cnVjdCB6c0Jzc0luZm8gICAgICAgIGJzc0luZm9Qb29sW1pNX01BWF9CU1NdOworICAgIHN0cnVjdCB6c0Jzc0luZm8qICAgICAgIGJzc0luZm9BcnJheVtaTV9NQVhfQlNTXTsKKyAgICBzdHJ1Y3QgenNCc3NMaXN0ICAgICAgICBic3NMaXN0OworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGJzc0luZm9BcnJheUhlYWQ7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgYnNzSW5mb0FycmF5VGFpbDsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBic3NJbmZvRnJlZUNvdW50OworCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgYXV0aE1vZGU7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgY3VycmVudEF1dGhNb2RlOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHdlcFN0YXR1czsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBlbmNyeU1vZGU7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAga2V5SWQ7CisjaWZkZWYgWk1fRU5BQkxFX0lCU1NfV1BBMlBTSworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGlic3NXcGEyUHNrOworI2VuZGlmCisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBjZW5jS2V5SWQ7IC8vQ0VOQworI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBkcm9wVW5lbmNyeXB0ZWRQa3RzOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGlic3NKb2luT25seTsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBhZGFwdGVyU3RhdGU7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgb2xkQWRhcHRlclN0YXRlOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RTdGF0ZTsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBjb25uZWN0UmV0cnk7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgd3BhU3RhdGU7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgd3BhSWVbWk1fTUFYX0lFX1NJWkUgKyAyXTsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICByc25JZVtaTV9NQVhfSUVfU0laRSArIDJdOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGNoYWxsZW5nZVRleHRbMjU1KzJdOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdHlbMl07CisgICAgLy91OF90ICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW5nSGlkZGVuQVA7CisgICAgLy91OF90ICAgICAgICAgICAgICAgICAgICBzY2FuV2l0aFNTSUQ7CisgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgYWlkOworICAgIHUzMl90ICAgICAgICAgICAgICAgICAgIG1ndEZyYW1lQ291bnQ7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgYlByb3RlY3Rpb25Nb2RlOworCXUzMl90CQkJCQlOb25OQVBjb3VudDsKKwl1OF90CQkJCQlSVFNJbkFHR01vZGU7CisgICAgdTMyX3QgICAgICAgICAgICAgICAgICAgY29ubmVjdFRpbWVyOworICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIGF0aW1XaW5kb3c7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgZGVzaXJlZEJzc2lkWzZdOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGJEZXNpcmVkQnNzaWQ7CisgICAgc3RydWN0IHpzVGtpcFNlZWQgICAgICAgdHhTZWVkOworICAgIHN0cnVjdCB6c1RraXBTZWVkICAgICAgIHJ4U2VlZFs0XTsKKyAgICBzdHJ1Y3QgenNNaWNWYXIgICAgICAgICB0eE1pY0tleTsKKyAgICBzdHJ1Y3QgenNNaWNWYXIgICAgICAgICByeE1pY0tleVs0XTsKKyAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBpdjE2OworICAgIHUzMl90ICAgICAgICAgICAgICAgICAgIGl2MzI7CisgICAgc3RydWN0IHpzT3Bwb3NpdGVJbmZvICAgb3Bwb3NpdGVJbmZvW1pNX01BWF9PUFBPU0lURV9DT1VOVF07CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgb3Bwb3NpdGVDb3VudDsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBic3NOb3RGb3VuZENvdW50OyAgICAgLyogc2l0ZXN1cnZleSBmb3Igc2VhcmNoIGRlc2lyZWQgSVNCQiB0aHJlc2hvbGQgKi8KKyAgICB1MTZfdCAgICAgICAgICAgICAgICAgICByeEJlYWNvbkNvdW50OworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGJlYWNvbk1pc3NTdGF0ZTsKKyAgICB1MzJfdCAgICAgICAgICAgICAgICAgICByeEJlYWNvblRvdGFsOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGJJc1NoYXJlZEtleTsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBjb25uZWN0VGltZW91dENvdW50OworCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgcmVjdkF0aW07CisKKyAgICAvKiBTY2FuTWdyIENvbnRyb2wgYmxvY2sgKi8KKyAgICBzdHJ1Y3QgenNXbGFuRGV2U3RhU2Nhbk1nciBzY2FuTWdyOworICAgIHN0cnVjdCB6c1dsYW5EZXZTdGFQU01nciAgIHBzTWdyOworCisgICAgLy8gVGhlIGNhbGxiYWNrIHdvdWxkIGJlIGNhbGxlZCBpZiByZWNlaXZpbmcgYW4gdW5lbmNyeXB0ZWQgcGFja2V0cyBidXQKKyAgICAvLyB0aGUgc3RhdGlvbiBpcyBpbiBlbmNyeXB0ZWQgbW9kZS4gVGhlIHdyYXBwZXIgY291bGQgZGVjaWRlIHdoZXRoZXIKKyAgICAvLyB0byBkcm9wIHRoZSBwYWNrZXQgYnkgaXRzIE9TIHNldHRpbmcuCisgICAgemZwU3RhUnhTZWN1cml0eUNoZWNrQ2IgcFN0YVJ4U2VjdXJpdHlDaGVja0NiOworCisgICAgLyogV01FICovCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgYXBXbWVDYXBhYmlsaXR5OyAvL2JpdC0wID0+IGEgV01FIEFQCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2JpdC03ID0+IGEgVUFQU0QgQVAKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICB3bWVQYXJhbWV0ZXJTZXRDb3VudDsKKworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHdtZUVuYWJsZWQ7CisgICAgI2RlZmluZSBaTV9TVEFfV01FX0VOQUJMRV9CSVQgICAgICAgMHgxCisgICAgI2RlZmluZSBaTV9TVEFfVUFQU0RfRU5BQkxFX0JJVCAgICAgMHgyCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgd21lUW9zSW5mbzsKKworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIHdtZUNvbm5lY3RlZDsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBxb3NJbmZvOworICAgIHN0cnVjdCB6c1F1ZXVlKiAgICAgICAgIHVhcHNkUTsKKworICAgIC8qIGNvdW50ZXJtZWFzdXJlcyAqLworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGNtTWljRmFpbHVyZUNvdW50OworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGNtRGlzYWxsb3dTc2lkTGVuZ3RoOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGNtRGlzYWxsb3dTc2lkWzMyXTsKKworICAgIC8qIHBvd2VyLXNhdmluZyBtb2RlICovCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgcG93ZXJTYXZlTW9kZTsKKyAgICB6YnVmX3QqICAgICAgICAgICAgICAgICBzdGFQU0RhdGFRdWV1ZVtaTV9QU19RVUVVRV9TSVpFXTsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBzdGFQU0RhdGFDb3VudDsKKworICAgIC8qIElCU1MgcG93ZXItc2F2aW5nIG1vZGUgKi8KKyAgICAvKiByZWNvcmQgdGhlIFNUQSB3aGljaCBoYXMgZW50ZXJlZCB0aGUgUFMgbW9kZSAqLworICAgIHN0cnVjdCB6c1N0YVBTTGlzdCAgICAgIHN0YVBTTGlzdDsKKyAgICAvKiBxdWV1ZSB0aGUgZGF0YSBvZiB0aGUgUFMgU1RBcyAqLworICAgIHpidWZfdCogICAgICAgICAgICAgICAgICBpYnNzUFNEYXRhUXVldWVbWk1fUFNfUVVFVUVfU0laRV07CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgaWJzc1BTRGF0YUNvdW50OworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGlic3NQcmV2UFNEYXRhQ291bnQ7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgYklic3NQU0VuYWJsZTsKKyAgICAvKiBCSVRfMTU6IE9OL09GRiwgQklUXzB+MTQ6IEF0aW0gVGltZXIgKi8KKyAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBpYnNzQXRpbVRpbWVyOworCisgICAgLyogV1BBMiAqLworICAgIHN0cnVjdCB6c1Bta2lkSW5mbyAgICAgIHBta2lkSW5mbzsKKworICAgIC8qIE11bHRpY2FzdCBsaXN0IHJlbGF0ZWQgb2JqZWN0cyAqLworICAgIHN0cnVjdCB6c011bHRpY2FzdExpc3QgIG11bHRpY2FzdExpc3Q7CisKKyAgICAvKiBYUCBwYWNrZXQgZmlsdGVyIGZlYXR1cmUgOiAqLworICAgIC8qIDE9PmVuYWJsZTogQWxsIG11bHRpY2FzdCBhZGRyZXNzIHBhY2tldHMsIG5vdCBqdXN0IHRoZSBvbmVzIGVudW1lcmF0ZWQgaW4gdGhlIG11bHRpY2FzdCBhZGRyZXNzIGxpc3QuICovCisgICAgLyogMD0+ZGlzYWJsZSAqLworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGJBbGxNdWx0aWNhc3Q7CisKKyAgICAvKiByZWFzc29jaWF0aW9uIGZsYWcgKi8KKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBjb25uZWN0QnlSZWFzc287CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgZmFpbENudE9mUmVhc3NvOworCisJLyogZm9yIEhUIGNvbmZpZ3VyZSBjb250cm9sIHNldHRpbmcgKi8KKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBwcmVhbWJsZVR5cGVIVDsgIC8qIEhUOiAwIE1peGVkIG1vZGUgICAgMSBHcmVlbiBmaWVsZCAqLworCXU4X3QgICAgICAgICAgICAgICAgICAgIGh0Q3RybEJhbmR3aWR0aDsKKwl1OF90ICAgICAgICAgICAgICAgICAgICBodEN0cmxTVEJDOworCXU4X3QgICAgICAgICAgICAgICAgICAgIGh0Q3RybFNHOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRUQTsKKworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25fMTFiOworCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgRW5hYmxlSFQ7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgU0c0MDsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBIVDIwNDA7CisgICAgLyogZm9yIFdQQSBzZXR0aW5nICovCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgd3BhU3VwcG9ydDsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICB3cGFMZW47CisKKyAgICAvKiBJQlNTIHJlbGF0ZWQgb2JqZWN0cyAqLworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGlic3NEZWxheWVkSW5kOworICAgIHN0cnVjdCB6c1BhcnRuZXJOb3RpZnlFdmVudCBpYnNzRGVsYXllZEluZEV2ZW50OworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGlic3NQYXJ0bmVyU3RhdHVzOworCisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgYkF1dG9SZWNvbm5lY3Q7CisKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBmbGFnRnJlcUNoYW5naW5nOworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGZsYWdLZXlDaGFuZ2luZzsKKyAgICBzdHJ1Y3QgenNCc3NJbmZvICAgICAgICBpYnNzQnNzRGVzYzsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBpYnNzQnNzSXNDcmVhdG9yOworICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIGlic3NSZWNlaXZlQmVhY29uQ291bnQ7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgaWJzc1NpdGVTdXJ2ZXlTdGF0dXM7CisKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBkaXNhYmxlUHJvYmluZ1dpdGhTc2lkOworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgLyogQ0VOQyAqLworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGNlbmNJZVtaTV9NQVhfSUVfU0laRSArIDJdOworI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyAgICB1MzJfdCB0eGl2WzRdOyAgLy9UeCBQTiBTZXF1ZW5jZQorICAgIHUzMl90IHJ4aXZbNF07ICAvL1J4IFBOIFNlcXVlbmNlCisgICAgdTMyX3QgcnhpdkdLWzRdOy8vQnJvYWRjYXN0IFJ4IFBOIFNlcXVlbmNlCisgICAgdThfdCAgd2VwS2V5WzRdWzMyXTsgICAgLy8gRm9yIFNvZnR3YXJlIFdFUAorCXU4X3QgIFNXRW5jcnlNb2RlWzRdOworCisgICAgLyogODAyLjExZCAqLworICAgIHU4X3QgYjgwMl8xMUQ7CisKKyAgICAvKiA4MDIuMTFoICovCisgICAgdThfdCBUUENFbmFibGU7CisgICAgdThfdCBERlNFbmFibGU7CisgICAgdThfdCBERlNEaXNhYmxlVHg7CisKKyAgICAvKiBPd2wgQVAgKi8KKyAgICB1OF90IGF0aE93bEFwOworCisgICAgLyogRW5hYmxlIEJBIHJlc3BvbnNlIGluIGRyaXZlciAqLworICAgIHU4X3QgZW5hYmxlRHJ2QkE7CisKKyAgICAvKiBIVCBDYXBhYmlsaXR5IEluZm8gKi8KKyAgICB1bmlvbiB6dUhUQ2FwYWJpbGl0eSBIVENhcDsgLy9DV1lhbmcoKykKKworICAgIC8qIEV4dGVuZGVkIEhUIENhcGFiaWxpdHkgSW5mbyAqLworICAgIHVuaW9uIHp1RXh0SFRDYXBhYmlsaXR5IEV4dEhUQ2FwOyAvL0NXWWFuZygrKQorCisgICAgc3RydWN0IEluZm9ybWF0aW9uRWxlbWVudFN0YSAgIGllOworCisjZGVmaW5lIFpNX0NBQ0hFRF9GUkFNRUJPRFlfU0laRSAgIDIwMAorICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGFzb2NSZXFGcmFtZUJvZHlbWk1fQ0FDSEVEX0ZSQU1FQk9EWV9TSVpFXTsKKyAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBhc29jUmVxRnJhbWVCb2R5U2l6ZTsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBhc29jUnNwRnJhbWVCb2R5W1pNX0NBQ0hFRF9GUkFNRUJPRFlfU0laRV07CisgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgYXNvY1JzcEZyYW1lQm9keVNpemU7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgYmVhY29uRnJhbWVCb2R5W1pNX0NBQ0hFRF9GUkFNRUJPRFlfU0laRV07CisgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgYmVhY29uRnJhbWVCb2R5U2l6ZTsKKworICAgIHU4X3QgICAgICAgICAgICAgICAgICAgIGFjMFByaW9yaXR5SGlnaGVyVGhhbkFjMjsKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBTV0VuY3J5cHRFbmFibGU7CisKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICBsZWFwRW5hYmxlZDsKKworICAgIHUzMl90ICAgICAgICAgICAgICAgICAgICBUb3RhbE51bWJlck9mUmVjZWl2ZVBhY2tldHM7CisgICAgdTMyX3QgICAgICAgICAgICAgICAgICAgIFRvdGFsTnVtYmVyT2ZSZWNlaXZlQnl0ZXM7CisgICAgdTMyX3QgICAgICAgICAgICAgICAgICAgIGF2Z1NpemVPZlJlY2VpdmVQYWNrZXRzOworCisgICAgdTMyX3QgICAgICAgICAgICAgICAgICAgIFJlY2VpdmVkUGFja2V0UmF0ZUNvdW50ZXI7CisgICAgdTMyX3QgICAgICAgICAgICAgICAgICAgIFJlY2VpdmVkUGt0UmF0ZVBlclNlY29uZDsKKworICAgIC8qICMyIFJlY29yZCB0aGUgc2VxdWVuY2UgbnVtYmVyIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSB1bmljYXN0IGZyYW1lIGlzIHNlcGFyYXRlZCBieSBSSUZTIG9yIG5vdCAqLworI2RlZmluZSAgICBaTV9SSUZTX1NUQVRFX0RFVEVDVElORyAgICAwCisjZGVmaW5lICAgIFpNX1JJRlNfU1RBVEVfREVURUNURUQgICAgIDEKKyNkZWZpbmUgICAgWk1fUklGU19USU1FUl9USU1FT1VUICAgICAgNDQ4MCAgICAgICAgICAvLyA8RHJpdmVyIHRpbWU+NDQ4MG1zIDxSZWFsIHRpbWU+N3MKKyAgICB1OF90ICAgICAgICAgICAgICAgICAgICByaWZzU3RhdGU7CisgICAgdThfdCAgICAgICAgICAgICAgICAgICAgcmlmc0xpa2VGcmFtZUNudDsKKyAgICB1MTZfdCAgICAgICAgICAgICAgICAgICByaWZzTGlrZUZyYW1lU2VxdWVuY2VbM107CisgICAgdTMyX3QgICAgICAgICAgICAgICAgICAgcmlmc1RpbWVyOworICAgIHUzMl90ICAgICAgICAgICAgICAgICAgIHJpZnNDb3VudDsKKworICAgIC8qIFJYIGZpbHRlciBkZXNpcmVkIGJ5IHVwcGVyIGxheWVycy4gIE5vdGUgdGhpcyBjb250YWlucyBzb21lIGJpdHMgd2hpY2ggbXVzdCBiZSBmaWx0ZXJlZAorICAgICAgIGJ5IHN3IHNpbmNlIHRoZSBodyBzdXBwb3J0cyBvbmx5IGEgc3Vic2V0IG9mIHBvc3NpYmxlIGZpbHRlciBhY3Rpb25zLj0gKi8KKyAgICB1MzJfdCAgb3NSeEZpbHRlcjsKKworICAgIHU4X3QgICBiU2FmZU1vZGU7CisKKyAgICB1MzJfdCAgaWJzc0FkZGl0aW9uYWxJRVNpemU7CisgICAgdThfdCAgIGlic3NBZGRpdGlvbmFsSUVbMjU2XTsKK307IC8vc3RydWN0IHpzV2xhbkRldlN0YQorCisjZGVmaW5lIFpNX0NNRF9RVUVVRV9TSVpFICAgICAgICAgICAgICAgICAgIDI1NiAgLy9Sb2dlciBDaGVjaywgdGVzdCA2NCB3aGVuIHJlYWR5CisKKyNkZWZpbmUgWk1fT0lEX1JFQUQgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaTV9PSURfV1JJVEUgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFpNX09JRF9JTlRFUk5BTF9XUklURSAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgWk1fQ01EX1NFVF9GUkVRVUVOQ1kgICAgICAgICAgICAgICAgNAorI2RlZmluZSBaTV9DTURfU0VUX0tFWSAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFpNX0NXTV9SRUFEICAgICAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgWk1fTUFDX1JFQUQgICAgICAgICAgICAgICAgICAgICAgICAgNworI2RlZmluZSBaTV9BTklfUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIFpNX0VFUFJPTV9SRUFEICAgICAgICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgWk1fRUVQUk9NX1dSSVRFICAgICAgICAgICAgICAgICAgICAgMHgwQQorI2RlZmluZSBaTV9PSURfQ0hBTgkJCQkJCQkweDMwCisjZGVmaW5lIFpNX09JRF9TWU5USAkJCQkJCTB4MzIKKyNkZWZpbmUgWk1fT0lEX1RBTExZCQkJCQkJMHg4MQorI2RlZmluZSBaTV9PSURfVEFMTFlfQVBECQkJCQkweDgyCisKKyNkZWZpbmUgWk1fT0lEX0RLVFhfU1RBVFVTICAgICAgICAgICAgICAgICAgMHg5MgorI2RlZmluZSBaTV9PSURfRkxBU0hfQ0hLU1VNICAgICAgICAgICAgICAgICAweEQwCisjZGVmaW5lIFpNX09JRF9GTEFTSF9SRUFEICAgICAgICAgICAgICAgICAgIDB4RDEKKyNkZWZpbmUgWk1fT0lEX0ZMQVNIX1BST0dSQU0gICAgICAgICAgICAgICAgMHhEMgorI2RlZmluZSBaTV9PSURfRldfRExfSU5JVCAgICAgICAgICAgICAgICAgICAweEQzCisKKy8qIERyaXZlciB0byBGaXJtd2FyZSBPSUQgKi8KKyNkZWZpbmUgWk1fQ01EX0VDSE8gICAgICAgICAweDgwCisjZGVmaW5lIFpNX0NNRF9UQUxMWSAgICAgICAgMHg4MQorI2RlZmluZSBaTV9DTURfVEFMTFlfQVBEICAgIDB4ODIKKyNkZWZpbmUgWk1fQ01EX0NPTkZJRyAgICAgICAweDgzCisjZGVmaW5lIFpNX0NNRF9SUkVHICAgICAgICAgMHgwMAorI2RlZmluZSBaTV9DTURfV1JFRyAgICAgICAgIDB4MDEKKyNkZWZpbmUgWk1fQ01EX1JNRU0gICAgICAgICAweDAyCisjZGVmaW5lIFpNX0NNRF9XTUVNICAgICAgICAgMHgwMworI2RlZmluZSBaTV9DTURfQklUQU5EICAgICAgIDB4MDQKKyNkZWZpbmUgWk1fQ01EX0JJVE9SICAgICAgICAweDA1CisjZGVmaW5lIFpNX0NNRF9FS0VZICAgICAgICAgMHgyOAorI2RlZmluZSBaTV9DTURfREtFWSAgICAgICAgIDB4MjkKKyNkZWZpbmUgWk1fQ01EX0ZSRVFVRU5DWSAgICAweDMwCisjZGVmaW5lIFpNX0NNRF9SRl9JTklUICAgICAgMHgzMQorI2RlZmluZSBaTV9DTURfU1lOVEggICAgICAgIDB4MzIKKyNkZWZpbmUgWk1fQ01EX0ZSRVFfU1RSQVQgICAweDMzCisjZGVmaW5lIFpNX0NNRF9SRVNFVCAgICAgICAgMHg5MAorI2RlZmluZSBaTV9DTURfREtSRVNFVCAgICAgIDB4OTEKKyNkZWZpbmUgWk1fQ01EX0RLVFhfU1RBVFVTICAweDkyCisjZGVmaW5lIFpNX0NNRF9GREMgICAgICAgICAgMHhBMAorI2RlZmluZSBaTV9DTURfV1JFRVBST00gICAgIDB4QjAKKyNkZWZpbmUgWk1fQ01EX1dGTEFTSCAgICAgICAweEIwCisjZGVmaW5lIFpNX0NNRF9GTEFTSF9FUkFTRSAgMHhCMQorI2RlZmluZSBaTV9DTURfRkxBU0hfUFJPRyAgIDB4QjIKKyNkZWZpbmUgWk1fQ01EX0ZMQVNIX0NIS1NVTSAweEIzCisjZGVmaW5lIFpNX0NNRF9GTEFTSF9SRUFEICAgMHhCNAorI2RlZmluZSBaTV9DTURfRldfRExfSU5JVCAgIDB4QjUKKyNkZWZpbmUgWk1fQ01EX01FTV9XUkVFUFJPTSAweEJCCisKKworLyogZHVwbGljYXRlIGZpbHRlciB0YWJsZSBjb2x1bW4gKi8KKyNkZWZpbmUgWk1fRklMVEVSX1RBQkxFX0NPTCAgICAgICAgICAgICAgICAgMiAvKiAyXm4gKi8KKy8qIGR1cGxpY2F0ZSBmaWx0ZXIgdGFibGUgUm93ICovCisjZGVmaW5lIFpNX0ZJTFRFUl9UQUJMRV9ST1cgICAgICAgICAgICAgICAgIDggLyogMl5uICovCisKKy8qIGR1cGxpY2F0ZSBmaWx0ZXIgdGFibGUgc3RydWN0dXJlICovCitzdHJ1Y3QgenNSeEZpbHRlcgoreworICAgIHUxNl90IGFkZHJbM107CisgICAgdTE2X3Qgc2VxOworICAgIHU4X3QgdXA7Cit9OworCitzdHJ1Y3QgenNXbGFuRGV2Cit7CisgICAgLyogQVAgZ2xvYmFsIHZhcmlhYmxlcyAqLworICAgIHN0cnVjdCB6c1dsYW5EZXZBcCBhcDsKKyAgICAvKiBTVEEgZ2xvYmFsIHZhcmlhYmxlcyAqLworICAgIHN0cnVjdCB6c1dsYW5EZXZTdGEgc3RhOworICAgIC8qIHNhdmUgd3JhcHBlciBzZXR0aW5nICovCisgICAgc3RydWN0IHpzV3JhcHBlclNldHRpbmcgd3M7CisgICAgLyogZmVhdHVyZXMgZGV0ZXJtaW5lZCBieSB3cmFwcGVyICh2ZW5kb3IpICovCisgICAgc3RydWN0IHpzV3JhcHBlckZlYXR1cmVDdHJsIHdmYzsKKyAgICAvKiBUcmFmZmljIE1vbml0b3IgdGFsbHkgKi8KKyAgICBzdHJ1Y3QgenNUcmFmVGFsbHkgdHJhZlRhbGx5OworICAgIC8qIENvbW11bmljYXRpb24gdGFsbHkgKi8KKyAgICBzdHJ1Y3QgenNDb21tVGFsbHkgY29tbVRhbGx5OworICAgIC8qIER1cGxpY2F0ZSBmcmFtZSBmaWx0ZXIgdGFibGUgKi8KKyAgICBzdHJ1Y3QgenNSeEZpbHRlciByeEZpbHRlclRibFtaTV9GSUxURVJfVEFCTEVfQ09MXVtaTV9GSUxURVJfVEFCTEVfUk9XXTsKKyAgICAvKiBSZWd1bGF0b3J5IHRhYmxlICovCisgICAgc3RydWN0IHpzUmVndWxhdGlvblRhYmxlICByZWd1bGF0aW9uVGFibGU7CisKKyAgICAvKiAqLworICAgIHN0cnVjdCB6c1dsYW5EZXZGcmVxQ29udHJvbCBmcmVxQ3RybDsKKworICAgIGVudW0gZGV2U3RhdGUgc3RhdGU7CisKKyAgICB1OF90ICBoYWxTdGF0ZTsKKyAgICB1OF90ICB3bGFuTW9kZTsgICAgICAgICAvKiBBUC9JTkZSQVNUUlVDVFVSRS9JQlNTL1BTRVVETyAqLworICAgIHUxNl90IG1hY0FkZHJbM107ICAgICAgIC8qIE1BQyBhZGRyZXNzICovCisgICAgdTE2X3QgYmVhY29uSW50ZXJ2YWw7ICAgLyogYmVhY29uIEludGVydmFsICovCisgICAgdThfdCBkdGltOyAgICAgICAgICAgICAgLyogRFRJTSBwZXJpb2QgKi8KKyAgICB1OF90ICAgICAgICAgICAgQ3VycmVudER0aW1Db3VudDsKKyAgICB1OF90ICBwcmVhbWJsZVR5cGU7CisgICAgdThfdCAgcHJlYW1ibGVUeXBlSW5Vc2VkOworICAgIHU4X3QgIG1heFR4UG93ZXIyOwkgICAgLyogMi40IEdIeiBNYXggVHggcG93ZXIgKFVuaXQ6IDAuNSBkQm0pICovCisgICAgdThfdCAgbWF4VHhQb3dlcjU7CSAgICAvKiA1IEdIeiBNYXggVHggcG93ZXIgKFVuaXQ6IDAuNSBkQm0pICovCisgICAgdThfdCAgY29ubmVjdE1vZGU7CisgICAgdTMyX3Qgc3VwcG9ydE1vZGU7CisKKyAgICB1OF90IGJSYXRlOyAgICAgICAgICAgICAvKiAxMWIgU3VwcG9ydCBSYXRlIGJpdCBtYXAgKi8KKyAgICB1OF90IGJSYXRlQmFzaWM7ICAgICAgICAvKiAxMWIgQmFzaWMgUmF0ZSBiaXQgbWFwICovCisgICAgdThfdCBnUmF0ZTsgICAgICAgICAgICAgLyogMTFnIFN1cHBvcnQgUmF0ZSBiaXQgbWFwICovCisgICAgdThfdCBnUmF0ZUJhc2ljOyAgICAgICAgLyogMTFnIEJhc2ljIFJhdGUgYml0IG1hcCAqLworICAgIC8qIGNoYW5uZWwgaW5kZXggcG9pbnQgdG8gdGhlIGl0ZW0gaW4gcmVndWxhdGlvbiB0YWJsZSAqLworICAgIHU4X3QgY2hhbm5lbEluZGV4OworCisgICAgLyogY2hhbm5lbCBtYW5hZ2VtZW50ICovCisgICAgdThfdCAgICBCYW5kV2lkdGg0MDsKKyAgICB1OF90ICAgIEV4dE9mZnNldDsgICAgICAvLzEgYWJvdmUsIDMgYmVsb3csIDAgbm90IHByZXNlbnQKKyAgICB1MTZfdCAgIGZyZXF1ZW5jeTsgICAgICAvKiBvcGVyYXRpb24gZnJlcXVlbmN5ICovCisKKyAgICB1OF90IGVycEVsZW1lbnQ7ICAgICAgICAvKiBFUlAgaW5mb3JtYXRpb24gZWxlbWVudCBkYXRhICovCisKKyAgICB1OF90IGRpc2FibGVTZWxmQ3RzOyAgICAvKiBzZXQgdG8gMSB0byBkaXNhYmxlIFNlbGYtQ1RTICovCisgICAgdThfdCBiZ01vZGU7CisKKwkvKiBwcml2YXRlIHRlc3QgZmxhZyAqLworICAgIHUzMl90IGVuYWJsZVByb3RlY3Rpb25Nb2RlOyAgIC8qIGZvcmNlIGVuYWJsZS9kaXNhYmxlIHNlbGYgY3RzICovCisJdTMyX3QgY2hlY2tzdW1UZXN0OyAgICAgLyogT1RVUyBjaGVja3N1bSB0ZXN0IDE9Pnplcm8gY2hlY2tzdW0gMD0+bm9ybWFsICovCisJdTMyX3QgcnhQYWNrZXREdW1wOyAgICAgLyogcnggcGFja2V0IGR1bXAgKi8KKworICAgIHU4X3QgZW5hYmxlQWdncmVnYXRpb247IC8qIGZvcmNlIGVuYWJsZS9kaXNhYmxlIEEtTVNQVSAqLworICAgIHU4X3QgZW5hYmxlV0RTOyAgICAgICAgIC8qIGZvcmNlIGVuYWJsZS9kaXNhYmxlIFdEUyB0ZXN0aW5nICovCisJdThfdCBlbmFibGVUeFBhdGhNb2RlOyAgLyogT1RVUyBzcGVjaWFsIHRlc3RpbmcgbW9kZSAxPT5kaWFibGUsIDA9PmVuYWJsZTogWk1fU1lTVEVNX1RFU1RfTU9ERSAqLworICAgIHU4X3QgZW5hYmxlSEFMRGJnSW5mbzsgIC8qICAqLworCisgICAgdTMyX3QgZm9yY2VUeFRQQzsgICAgICAgLyogZm9yY2UgdHggcGFja2V0IHNlbmQgVFBDICovCisKKyAgICB1MTZfdCBzZXFbNF07CisgICAgdTE2X3QgbW1zZXE7CisKKyAgICAvKiBkcml2ZXIgY29yZSB0aW1lIHRpY2sgKi8KKyAgICB1MzJfdCB0aWNrOworICAgIHUxNl90IHRpY2tJYnNzU2VuZEJlYWNvbjsKKyAgICB1MTZfdCB0aWNrSWJzc1JlY2VpdmVCZWFjb247CisKKyAgICAvKiBSVFMgdGhyZXNob2xkICovCisgICAgdTE2X3QgcnRzVGhyZXNob2xkOworCisgICAgLyogZnJhZ21lbnRhdGlvbiB0aHJlc2hvbGQsICAyNTYgPD0gdmFsdWUgPD0gMjM0NiwgMD1kaXNhYmxlZCAqLworICAgIHUxNl90IGZyYWdUaHJlc2hvbGQ7CisKKyAgICAvKiBUeCBSYXRlICovCisgICAgdTE2X3QgdHhNQ1M7CisgICAgdTE2X3QgdHhNVDsKKyAgICB1MzJfdCBDdXJyZW50VHhSYXRlS2JwczsgLy9DV1lhbmcoKykKKyAgICAvKiBSeCBSYXRlICovCisgICAgdTMyX3QgQ3VycmVudFJ4UmF0ZUticHM7IC8vSmFuZXQoKykKKyAgICB1OF90IEN1cnJlbnRSeFJhdGVVcGRhdGVkOworICAgIHU4X3QgbW9kdWxhdGlvblR5cGU7CisgICAgdThfdCByeEluZm87CisgICAgdTE2X3QgcmF0ZUZpZWxkOworCisgICAgLyogdGltZXIgcmVsYXRlZCBvYmplY3RzICovCisgICAgc3RydWN0IHpzVGltZXJMaXN0ICB0aW1lckxpc3Q7CisgICAgdThfdCAgICAgICAgICAgICAgICBiVGltZXJSZWFkeTsKKworICAgIC8qIGZvciBkZWZyYWdtZW50YXRpb24gKi8KKyAgICBzdHJ1Y3QgenNEZWZyYWdMaXN0IGRlZnJhZ1RhYmxlOworCisgICAgLyogRGF0YSBzdHJ1Y3QgZm9yIEludGVyZmFjZSBEZXBlbmRlbnQgTGF5ZXIgKi8KKyAgICAvL3N0cnVjdCB6c0lkbFN0cnVjdCBpZGxTdHJ1Y3Q7CisKKyAgICAvKiBTaWduYWwgU3RyZW5ndGgvUXVhbGl0eSBSZWxhdGVkIFBhcmFtZXRlcnMgKi8KKyAgICB1OF90IFNpZ25hbFN0cmVuZ3RoOyAvL0NXWWFuZygrKQorICAgIHU4X3QgU2lnbmFsUXVhbGl0eTsgIC8vQ1dZYW5nKCspCisKKworCisgICAgLyogUW9TICovCisgICAgemJ1Zl90KiB2dHhxWzRdW1pNX1ZUWFFfU0laRV07CisgICAgdTE2X3QgdnR4cUhlYWRbNF07CisgICAgdTE2X3QgdnR4cVRhaWxbNF07CisgICAgdTE2X3QgcW9zRHJvcElwRnJhZ1s0XTsKKworICAgIC8qIE1hbmFnZW1lbnQgVHggcXVldWUgKi8KKyAgICB6YnVmX3QqIHZtbXFbWk1fVk1NUV9TSVpFXTsKKyAgICB1MTZfdCB2bW1xSGVhZDsKKyAgICB1MTZfdCB2bW1xVGFpbDsKKworICAgIHU4X3QgICAgICAgICAgICAgICAgdnR4cVB1c2hpbmc7CisKKyAgICAvKgorICAgICAqIGFkZCBieSBob25kYQorICAgICAqIDEuIEFnZ3JlZ2F0ZSBxdWV1ZXMKKyAgICAgKiAyLiBTVEEncyBhc3NvY2lhdGVkIGluZm9ybWF0aW9uIGFuZCBxdWV1ZSBudW1iZXIKKyAgICAgKiAzLiByeCBhZ2dyZWdhdGlvbiByZS1vcmRlcmluZyBxdWV1ZQorICAgICAqLworICAgIHN0cnVjdCBhZ2dRdWV1ZSAgICAqYWdnUVBvb2xbWk1fQUdHX1BPT0xfU0laRV07CisgICAgdThfdCAgICAgICAgICAgICAgICBhZ2dJbml0aWF0ZWQ7CisgICAgdThfdCAgICAgICAgICAgICAgICBhZGRiYUNvbXBsZXRlOworICAgIHU4X3QgICAgICAgICAgICAgICAgYWRkYmFDb3VudDsKKyAgICB1OF90ICAgICAgICAgICAgICAgIGFnZ1N0YXRlOworICAgIHU4X3QgICAgICAgICAgICAgICAgZGVzdExvY2s7CisgICAgc3RydWN0IGFnZ1N0YSAgICAgICBhZ2dTdGFbWk1fTUFYX1NUQV9TVVBQT1JUXTsKKyAgICBzdHJ1Y3QgYWdnX3RpZF9yeCAgKnRpZF9yeFtaTV9BR0dfUE9PTF9TSVpFXTsKKyAgICBzdHJ1Y3QgYWdnVGFsbHkgICAgIGFnZ190YWw7CisgICAgc3RydWN0IGRlc3RRICAgICAgICBkZXN0UTsKKyAgICBzdHJ1Y3QgYmF3X2VuYWJsZXIgKmJhd19lbmFibGVyOworICAgIHN0cnVjdCBpZWVlODAyMTFfY3dtICAgIGN3bTsKKyAgICB1MTZfdCAgICAgICAgICAgICAgIHJlb3JkZXI7CisgICAgdTE2X3QgICAgICAgICAgICAgICBzZXFfZGVidWc7CisgICAgLyogcmF0ZSBjb250cm9sICovCisgICAgdTMyX3QgdHhNUERVW1pNX1JBVEVfVEFCTEVfU0laRV07CisgICAgdTMyX3QgdHhGYWlsW1pNX1JBVEVfVEFCTEVfU0laRV07CisgICAgdTMyX3QgUEVSW1pNX1JBVEVfVEFCTEVfU0laRV07CisgICAgdTE2X3QgcHJvYmVDb3VudDsKKyAgICB1MTZfdCBwcm9iZVN1Y2Nlc3NDb3VudDsKKyAgICB1MTZfdCBwcm9iZUludGVydmFsOworICAgIHUxNl90IHN1Y2Nlc3NfcHJvYmluZzsKKyAgICAvKgorICAgICAqIGVuZCBvZiBhZGQgYnkgaG9uZGEKKyAgICAgKi8KKworICAgIC8qIGFpcm9wZWVrIHNuaWZmZXIgbW9kZSBmb3IgdXBwZXIgc3cgKi8KKyAgICB1MzJfdCAgICAgICAgICAgICAgIHN3U25pZmZlcjsgICAvKiB3aW5kb3c6IGFpcm9QZWVrICovCisgICAgdTMyX3QgICAgICAgICAgICAgICBYTGlua01vZGU7CisKKyAgICAvKiBNREsgbW9kZSAqLworICAgIC8qIGluaXQgYnkgMD0+bm9ybWFsIGRyaXZlciAxPT5NREsgZHJpdmVyICovCisgICAgdTMyX3QgICAgICAgICAgICAgICBtb2RlTURLRW5hYmxlOworCisgICAgdTMyX3QgICAgICAgICAgICAgICBoZWFydEJlYXROb3RpZmljYXRpb247CisKKyAgICAvKiBwb2ludGVyIGZvciBIQUwgUGx1cyBwcml2YXRlIG1lbW9yeSAqLworICAgIHZvaWQqIGhwUHJpdmF0ZTsKKworICAgIC8qIGZvciBXUEEgc2V0dGluZyAqLworICAgIC8vdThfdCAgICAgICAgICAgICAgICAgICAgd3BhU3VwcG9ydFtaTV9NQVhfQVBfU1VQUE9SVF07CisgICAgLy91OF90ICAgICAgICAgICAgICAgICAgICB3cGFMZW5bWk1fTUFYX0FQX1NVUFBPUlRdOworICAgIC8vdThfdCAgICAgICAgICAgICAgICAgICAgd3BhSWVbWk1fTUFYX0FQX1NVUFBPUlRdW1pNX01BWF9JRV9TSVpFXTsKKworICAgIHN0cnVjdCB6c0xlZFN0cnVjdCAgICAgIGxlZFN0cnVjdDsKKworICAgIC8qIGFuaSBmbGFnICovCisgICAgdThfdCBhbmlFbmFibGU7CisgICAgdTE2X3QgdHhxX3RocmVzaG9sZDsKKworCS8vU2tpcCBNaWMgRXJyb3IgQ2hlY2sKKwl1OF90CVRLSVBfR3JvdXBfS2V5Q2hhbmdpbmc7CisKKwl1OF90ICAgIGR5bmFtaWNTSUZTRW5hYmxlOworCisJdThfdCAgICBxdWV1ZUZsdXNoZWQ7CisKKyAgICB1MTZfdCAoKnpmY2JBdXRoTm90aWZ5KSh6ZGV2X3QqIGRldiwgdTE2X3QqIG1hY0FkZHIpOworICAgIHUxNl90ICgqemZjYkFzb2NOb3RpZnkpKHpkZXZfdCogZGV2LCB1MTZfdCogbWFjQWRkciwgdThfdCogYm9keSwgdTE2X3QgYm9keVNpemUsIHUxNl90IHBvcnQpOworICAgIHUxNl90ICgqemZjYkRpc0Fzb2NOb3RpZnkpKHpkZXZfdCogZGV2LCB1OF90KiBtYWNBZGRyLCB1MTZfdCBwb3J0KTsKKyAgICB1MTZfdCAoKnpmY2JBcENvbm5lY3ROb3RpZnkpKHpkZXZfdCogZGV2LCB1OF90KiBtYWNBZGRyLCB1MTZfdCBwb3J0KTsKKyAgICB2b2lkICgqemZjYkNvbm5lY3ROb3RpZnkpKHpkZXZfdCogZGV2LCB1MTZfdCBzdGF0dXMsIHUxNl90KiBic3NpZCk7CisgICAgdm9pZCAoKnpmY2JTY2FuTm90aWZ5KSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzU2NhblJlc3VsdCogcmVzdWx0KTsKKyAgICB2b2lkICgqemZjYk1pY0ZhaWx1cmVOb3RpZnkpKHpkZXZfdCogZGV2LCB1MTZfdCogYWRkciwgdTE2X3Qgc3RhdHVzKTsKKyAgICB2b2lkICgqemZjYkFwTWljRmFpbHVyZU5vdGlmeSkoemRldl90KiBkZXYsIHU4X3QqIGFkZHIsIHpidWZfdCogYnVmKTsKKyAgICB2b2lkICgqemZjYklic3NQYXJ0bmVyTm90aWZ5KSh6ZGV2X3QqIGRldiwgdTE2X3Qgc3RhdHVzLCBzdHJ1Y3QgenNQYXJ0bmVyTm90aWZ5RXZlbnQgKmV2ZW50KTsKKyAgICB2b2lkICgqemZjYk1hY0FkZHJlc3NOb3RpZnkpKHpkZXZfdCogZGV2LCB1OF90KiBhZGRyKTsKKyAgICB2b2lkICgqemZjYlNlbmRDb21wbGV0ZUluZGljYXRpb24pKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7CisgICAgdm9pZCAoKnpmY2JSZWN2RXRoKSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IHBvcnQpOworICAgIHZvaWQgKCp6ZmNiUmVjdjgwMjExKSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogYWRkSW5mbyk7CisgICAgdm9pZCAoKnpmY2JSZXN0b3JlQnVmRGF0YSkoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgIHUxNl90ICgqemZjYkNlbmNBc29jTm90aWZ5KSh6ZGV2X3QqIGRldiwgdTE2X3QqIG1hY0FkZHIsIHU4X3QqIGJvZHksCisgICAgICAgICAgICB1MTZfdCBib2R5U2l6ZSwgdTE2X3QgcG9ydCk7CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgIHU4X3QgKCp6ZmNiQ2xhc3NpZnlUeFBhY2tldCkoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKKyAgICB2b2lkICgqemZjYkh3V2F0Y2hEb2dOb3RpZnkpKHpkZXZfdCogZGV2KTsKK307CisKKworc3RydWN0IHpzV2xhbktleQoreworICAgIHU4X3Qga2V5OworfTsKKworCisvKiBUaGVzZSBtYWNyb3MgYXJlIGRlZmluZWQgaGVyZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLworLyogUGxlYXNlIGxlYXZlIHRoZW0gYWxvbmUgKi8KKy8qIEZvciBUeCBwYWNrZXQgYWxsb2NhdGVkIGluIHVwcGVyIGxheWVyIGxheWVyICovCisjZGVmaW5lIHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCkgem13X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KQorI2RlZmluZSB6bXdfdHhfYnVmX3JlYWRoKGRldiwgYnVmLCBvZmZzZXQpIHptd19idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCkKKyNkZWZpbmUgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCwgdmFsdWUpIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQsIHZhbHVlKQorI2RlZmluZSB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCB2YWx1ZSkgem13X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgdmFsdWUpCisKKy8qIEZvciBSeCBwYWNrZXQgYWxsb2NhdGVkIGluIGRyaXZlciAqLworI2RlZmluZSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpIHptd19idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCkKKyNkZWZpbmUgem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1Ziwgb2Zmc2V0KSB6bXdfYnVmX3JlYWRoKGRldiwgYnVmLCBvZmZzZXQpCisjZGVmaW5lIHptd19yeF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQsIHZhbHVlKSB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0LCB2YWx1ZSkKKyNkZWZpbmUgem13X3J4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgdmFsdWUpIHptd19idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHZhbHVlKQorCisjZW5kaWYgLyogI2lmbmRlZiBfU1RSVUNUX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS93bGFuLmggYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvd2xhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YzE4YjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvd2xhbi5oCkBAIC0wLDAgKzEsNTk1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kdWxlIE5hbWUgOiB3bGFuX2RlZnMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIFdMQU4gZGVmaW5pdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1dMQU5fSAorI2RlZmluZSBfV0xBTl9ICisKKworI2RlZmluZSBaTV9FWFRFUk5BTF9BTExPQ19CVUYgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpNX0lOVEVSTkFMX0FMTE9DX0JVRiAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBaTV9TSVpFX09GX0NUUkxfU0VUICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIFpNX1NJWkVfT0ZfSVYgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgWk1fU0laRV9PRl9FWFRfSVYgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBaTV9TSVpFX09GX01JQyAgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIFpNX1NJWkVfT0ZfQ0NYX01JQyAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgWk1fU0laRV9PRl9XTEFOX0RBVEFfSEVBREVSICAgICAgICAgMjQKKyNkZWZpbmUgWk1fU0laRV9PRl9RT1NfQ1RSTCAgICAgICAgICAgICAgICAgMgorCisvKiBIZWFkZXIgZGVmaW5pdGlvbiAqLworI2RlZmluZSBaTV9TSVpFX09GX1dMQU5fV0RTX0hFQURFUiAgICAgICAgICAzMgorI2RlZmluZSBaTV9TSVpFX09GX1NOQVBfSEVBREVSICAgICAgICAgICAgICA4CisKKyNkZWZpbmUgWk1fV0xBTl9IRUFERVJfQTFfT0ZGU0VUICAgICAgICAgICAgNAorI2RlZmluZSBaTV9XTEFOX0hFQURFUl9BMl9PRkZTRVQgICAgICAgICAgICAxMAorI2RlZmluZSBaTV9XTEFOX0hFQURFUl9BM19PRkZTRVQgICAgICAgICAgICAxNgorI2RlZmluZSBaTV9XTEFOX0hFQURFUl9BNF9PRkZTRVQgICAgICAgICAgICAyNAorI2RlZmluZSBaTV9XTEFOX0hFQURFUl9JVl9PRkZTRVQgICAgICAgICAgICAyNAorI2RlZmluZSBaTV9TSVpFX09GX1dMQU5fREFUQV9IRUFERVIgICAgICAgICAyNAorCisvKiBQb3J0IGRlZmluaXRpb24gKi8KKyNkZWZpbmUgWk1fUE9SVF9ESVNBQkxFRCAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaTV9QT1JUX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgICAxCisKKy8qIEZyYW1lIFR5cGUgKi8KKyNkZWZpbmUgWk1fV0xBTl9NQU5BR0VNRU5UX0ZSQU1FICAgICAgICAgICAgMHgwCisjZGVmaW5lIFpNX1dMQU5fQ09OVFJPTF9GUkFNRSAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSBaTV9XTEFOX0RBVEFfRlJBTUUgICAgICAgICAgICAgICAgICAweDgKKworLyogRnJhbWUgU3VidHlwZSAqLworI2RlZmluZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVNPQ1JFUSAgICAgICAgICAweDAwCisjZGVmaW5lIFpNX1dMQU5fRlJBTUVfVFlQRV9BU09DUlNQICAgICAgICAgIDB4MTAKKyNkZWZpbmUgWk1fV0xBTl9GUkFNRV9UWVBFX1JFQVNPQ1JFUSAgICAgICAgMHgyMAorI2RlZmluZSBaTV9XTEFOX0ZSQU1FX1RZUEVfUkVBU09DUlNQICAgICAgICAweDMwCisjZGVmaW5lIFpNX1dMQU5fRlJBTUVfVFlQRV9QUk9CRVJFUSAgICAgICAgIDB4NDAKKyNkZWZpbmUgWk1fV0xBTl9GUkFNRV9UWVBFX1BST0JFUlNQICAgICAgICAgMHg1MAorLyogMHg2MCwgMHg3MCA9PiBSZXNlcnZlZCAqLworI2RlZmluZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQkVBQ09OICAgICAgICAgICAweDgwCisjZGVmaW5lIFpNX1dMQU5fRlJBTUVfVFlQRV9BVElNICAgICAgICAgICAgIDB4OTAKKyNkZWZpbmUgWk1fV0xBTl9GUkFNRV9UWVBFX0RJU0FTT0MgICAgICAgICAgMHhBMAorI2RlZmluZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVVUSCAgICAgICAgICAgICAweEIwCisjZGVmaW5lIFpNX1dMQU5fRlJBTUVfVFlQRV9ERUFVVEggICAgICAgICAgIDB4QzAKKyNkZWZpbmUgWk1fV0xBTl9GUkFNRV9UWVBFX0FDVElPTgkJCTB4RDAKKworLyogRnJhbWUgdHlwZSBhbmQgc3VidHlwZSAqLworI2RlZmluZSBaTV9XTEFOX0ZSQU1FX1RZUEVfTlVMTCAgICAgICAgICAgICAweDQ4CisjZGVmaW5lIFpNX1dMQU5fRlJBTUVfVFlQRV9CQVIgICAgICAgICAgICAgIDB4ODQKKyNkZWZpbmUgWk1fV0xBTl9GUkFNRV9UWVBFX0JBICAgICAgICAgICAgICAgMHg5NAorI2RlZmluZSBaTV9XTEFOX0ZSQU1FX1RZUEVfUFNQT0xMICAgICAgICAgICAweEE0CisjZGVmaW5lIFpNX1dMQU5fRlJBTUVfVFlQRV9SVFMgICAgICAgICAgICAgIDB4QjQKKyNkZWZpbmUgWk1fV0xBTl9GUkFNRV9UWVBFX0NUUyAgICAgICAgICAgICAgMHhDNAorI2RlZmluZSBaTV9XTEFOX0ZSQU1FX1RZUEVfUU9TX05VTEwgICAgICAgICAweEM4CisKKy8qIGFjdGlvbiBmcmFtZSAqLworI2RlZmluZSBaTV9XTEFOX1NQRUNUUlVNX01BTkFHRU1FTlRfQUNUSU9OX0ZSQU1FICAgIDAKKyNkZWZpbmUgWk1fV0xBTl9RT1NfQUNUSU9OX0ZSQU1FICAgICAgICAgICAgMQorI2RlZmluZSBaTV9XTEFOX0RMU19BQ1RJT05fRlJBTUUgICAgICAgICAgICAyCisjZGVmaW5lIFpNX1dMQU5fQkxPQ0tfQUNLX0FDVElPTl9GUkFNRSAgICAgIDMKKy8qIGJsb2NrIGFjayBhY3Rpb24gZnJhbWUqLworI2RlZmluZSBaTV9XTEFOX0FEREJBX1JFUVVFU1RfRlJBTUUgICAgICAgICAwCisjZGVmaW5lIFpNX1dMQU5fQUREQkFfUkVTUE9OU0VfRlJBTUUgICAgICAgIDEKKyNkZWZpbmUgWk1fV0xBTl9ERUxCQV9GUkFNRSAgICAgICAgICAgICAgICAgMgorCisvKiBFbGVtZW50IElEICovCisjZGVmaW5lIFpNX1dMQU5fRUlEX1NTSUQgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWk1fV0xBTl9FSURfU1VQUE9SVF9SQVRFICAgICAgICAgICAgMQorI2RlZmluZSBaTV9XTEFOX0VJRF9GSCAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFpNX1dMQU5fRUlEX0RTICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgWk1fV0xBTl9FSURfQ0ZTICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBaTV9XTEFOX0VJRF9USU0gICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFpNX1dMQU5fRUlEX0lCU1MgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgWk1fV0xBTl9FSURfQ09VTlRSWSAgICAgICAgICAgICAgICAgNworLyogcmVzZXJ2ZWQgOC0xNSAqLworI2RlZmluZSBaTV9XTEFOX0VJRF9DSEFMTEVOR0UgICAgICAgICAgICAgICAxNgorLyogcmVzZXJ2ZWQgMTctMzEgKi8KKyNkZWZpbmUgWk1fV0xBTl9FSURfUE9XRVJfQ09OU1RSQUlOVCAgICAgICAgMzIKKyNkZWZpbmUgWk1fV0xBTl9FSURfUE9XRVJfQ0FQQUJJTElUWSAgICAgICAgMzMKKyNkZWZpbmUgWk1fV0xBTl9FSURfVFBDX1JFUVVFU1QgICAgICAgICAgICAgMzQKKyNkZWZpbmUgWk1fV0xBTl9FSURfVFBDX1JFUE9SVCAgICAgICAgICAgICAgMzUKKyNkZWZpbmUgWk1fV0xBTl9FSURfU1VQUE9SVEVEX0NIQU5ORUxTICAgICAgMzYKKyNkZWZpbmUgWk1fV0xBTl9FSURfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0UgMzcKKyNkZWZpbmUgWk1fV0xBTl9FSURfTUVBU1VSRU1FTlRfUkVRVUVTVCAgICAgMzgKKyNkZWZpbmUgWk1fV0xBTl9FSURfTUVBU1VSRU1FTlRfUkVQT1JUICAgICAgMzkKKyNkZWZpbmUgWk1fV0xBTl9FSURfUVVJRVQgICAgICAgICAgICAgICAgICAgNDAKKyNkZWZpbmUgWk1fV0xBTl9FSURfSUJTU19ERlMgICAgICAgICAgICAgICAgNDEKKyNkZWZpbmUgWk1fV0xBTl9FSURfRVJQICAgICAgICAgICAgICAgICAgICAgNDIKKyNkZWZpbmUgWk1fV0xBTl9QUkVOMl9FSURfSFRDQVBBQklMSVRZICAgICAgNDUKKyNkZWZpbmUgWk1fV0xBTl9FSURfUlNOX0lFICAgICAgICAgICAgICAgICAgNDgKKyNkZWZpbmUgWk1fV0xBTl9FSURfRVhURU5ERURfUkFURSAgICAgICAgICAgNTAKKyNkZWZpbmUgWk1fV0xBTl9FSURfSFRfQ0FQQUJJTElUWSAgICAgICAgICAgNTEKKyNkZWZpbmUgWk1fV0xBTl9FSURfRVhURU5ERURfSFRfQ0FQQUJJTElUWSAgNTIKKyNkZWZpbmUgWk1fV0xBTl9FSURfTkVXX0VYVF9DSEFOTkVMX09GRlNFVCAgNTMKKyNkZWZpbmUgWk1fV0xBTl9QUkVOMl9FSURfSFRJTkZPUk1BVElPTiAgICAgNjEKKyNkZWZpbmUgWk1fV0xBTl9QUkVOMl9FSURfU0VDT05EQ0hPRkZTRVQgICAgNjIKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworI2RlZmluZSBaTV9XTEFOX0VJRF9DRU5DX0lFICAgICAgICAgICAgICAgICA2OAorI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyNkZWZpbmUgWk1fV0xBTl9FSURfVkVORE9SX1BSSVZBVEUgICAgICAgICAgMjIxICAgICAvKiBWZW5kb3IgcHJpdmF0ZSBzcGFjZTsgbXVzdCBkZW11eCBPVUkgKi8KKyNkZWZpbmUgWk1fV0xBTl9FSURfV1BBX0lFICAgICAgICAgICAgICAgICAgMjIxCisjZGVmaW5lIFpNX1dMQU5fRUlEX1dQU19JRSAgICAgICAgICAgICAgICAgIDIyMQorI2RlZmluZSBaTV9XTEFOX0VJRF9XSUZJX0lFICAgICAgICAgICAgICAgICAyMjEKKworLyogRVJQIGluZm9ybWF0aW9uIGVsZW1lbnQgKi8KKyNkZWZpbmUgWk1fV0xBTl9OT05fRVJQX1BSRVNFTlRfQklUICAgICAgICAgMHgxCisjZGVmaW5lIFpNX1dMQU5fVVNFX1BST1RFQ1RJT05fQklUICAgICAgICAgIDB4MgorI2RlZmluZSBaTV9XTEFOX0JBUktFUl9QUkVBTUJMRV9NT0RFX0JJVCAgICAweDQKKworLyogQ2hhbm5lbCBmcmVxdWVuY3ksIGluIE1IeiAqLworI2RlZmluZSBaTV9DSF9HXzEgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MTIKKyNkZWZpbmUgWk1fQ0hfR18yICAgICAgICAgICAgICAgICAgICAgICAgICAyNDE3CisjZGVmaW5lIFpNX0NIX0dfMyAgICAgICAgICAgICAgICAgICAgICAgICAgMjQyMgorI2RlZmluZSBaTV9DSF9HXzQgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MjcKKyNkZWZpbmUgWk1fQ0hfR181ICAgICAgICAgICAgICAgICAgICAgICAgICAyNDMyCisjZGVmaW5lIFpNX0NIX0dfNiAgICAgICAgICAgICAgICAgICAgICAgICAgMjQzNworI2RlZmluZSBaTV9DSF9HXzcgICAgICAgICAgICAgICAgICAgICAgICAgIDI0NDIKKyNkZWZpbmUgWk1fQ0hfR184ICAgICAgICAgICAgICAgICAgICAgICAgICAyNDQ3CisjZGVmaW5lIFpNX0NIX0dfOSAgICAgICAgICAgICAgICAgICAgICAgICAgMjQ1MgorI2RlZmluZSBaTV9DSF9HXzEwICAgICAgICAgICAgICAgICAgICAgICAgIDI0NTcKKyNkZWZpbmUgWk1fQ0hfR18xMSAgICAgICAgICAgICAgICAgICAgICAgICAyNDYyCisjZGVmaW5lIFpNX0NIX0dfMTIgICAgICAgICAgICAgICAgICAgICAgICAgMjQ2NworI2RlZmluZSBaTV9DSF9HXzEzICAgICAgICAgICAgICAgICAgICAgICAgIDI0NzIKKyNkZWZpbmUgWk1fQ0hfR18xNCAgICAgICAgICAgICAgICAgICAgICAgICAyNDg0CisjZGVmaW5lIFpNX0NIX0FfMTg0ICAgICAgICAgICAgICAgICAgICAgICAgNDkyMAorI2RlZmluZSBaTV9DSF9BXzE4OCAgICAgICAgICAgICAgICAgICAgICAgIDQ5NDAKKyNkZWZpbmUgWk1fQ0hfQV8xOTIgICAgICAgICAgICAgICAgICAgICAgICA0OTYwCisjZGVmaW5lIFpNX0NIX0FfMTk2ICAgICAgICAgICAgICAgICAgICAgICAgNDk4MAorI2RlZmluZSBaTV9DSF9BXzggICAgICAgICAgICAgICAgICAgICAgICAgIDUwNDAKKyNkZWZpbmUgWk1fQ0hfQV8xMiAgICAgICAgICAgICAgICAgICAgICAgICA1MDYwCisjZGVmaW5lIFpNX0NIX0FfMTYgICAgICAgICAgICAgICAgICAgICAgICAgNTA4MAorI2RlZmluZSBaTV9DSF9BXzM2ICAgICAgICAgICAgICAgICAgICAgICAgIDUxODAKKyNkZWZpbmUgWk1fQ0hfQV80MCAgICAgICAgICAgICAgICAgICAgICAgICA1MjAwCisjZGVmaW5lIFpNX0NIX0FfNDQgICAgICAgICAgICAgICAgICAgICAgICAgNTIyMAorI2RlZmluZSBaTV9DSF9BXzQ4ICAgICAgICAgICAgICAgICAgICAgICAgIDUyNDAKKyNkZWZpbmUgWk1fQ0hfQV81MiAgICAgICAgICAgICAgICAgICAgICAgICA1MjYwCisjZGVmaW5lIFpNX0NIX0FfNTYgICAgICAgICAgICAgICAgICAgICAgICAgNTI4MAorI2RlZmluZSBaTV9DSF9BXzYwICAgICAgICAgICAgICAgICAgICAgICAgIDUzMDAKKyNkZWZpbmUgWk1fQ0hfQV82NCAgICAgICAgICAgICAgICAgICAgICAgICA1MzIwCisjZGVmaW5lIFpNX0NIX0FfMTAwICAgICAgICAgICAgICAgICAgICAgICAgNTUwMAorI2RlZmluZSBaTV9DSF9BXzEwNCAgICAgICAgICAgICAgICAgICAgICAgIDU1MjAKKyNkZWZpbmUgWk1fQ0hfQV8xMDggICAgICAgICAgICAgICAgICAgICAgICA1NTQwCisjZGVmaW5lIFpNX0NIX0FfMTEyICAgICAgICAgICAgICAgICAgICAgICAgNTU2MAorI2RlZmluZSBaTV9DSF9BXzExNiAgICAgICAgICAgICAgICAgICAgICAgIDU1ODAKKyNkZWZpbmUgWk1fQ0hfQV8xMjAgICAgICAgICAgICAgICAgICAgICAgICA1NjAwCisjZGVmaW5lIFpNX0NIX0FfMTI0ICAgICAgICAgICAgICAgICAgICAgICAgNTYyMAorI2RlZmluZSBaTV9DSF9BXzEyOCAgICAgICAgICAgICAgICAgICAgICAgIDU2NDAKKyNkZWZpbmUgWk1fQ0hfQV8xMzIgICAgICAgICAgICAgICAgICAgICAgICA1NjYwCisjZGVmaW5lIFpNX0NIX0FfMTM2ICAgICAgICAgICAgICAgICAgICAgICAgNTY4MAorI2RlZmluZSBaTV9DSF9BXzE0MCAgICAgICAgICAgICAgICAgICAgICAgIDU3MDAKKyNkZWZpbmUgWk1fQ0hfQV8xNDkgICAgICAgICAgICAgICAgICAgICAgICA1NzQ1CisjZGVmaW5lIFpNX0NIX0FfMTUzICAgICAgICAgICAgICAgICAgICAgICAgNTc2NQorI2RlZmluZSBaTV9DSF9BXzE1NyAgICAgICAgICAgICAgICAgICAgICAgIDU3ODUKKyNkZWZpbmUgWk1fQ0hfQV8xNjEgICAgICAgICAgICAgICAgICAgICAgICA1ODA1CisjZGVmaW5lIFpNX0NIX0FfMTY1ICAgICAgICAgICAgICAgICAgICAgICAgNTgyNQorCisKKy8qIEFQIDogU1RBIHRhYmxlID0+IFNUQSBUeXBlICovCisjZGVmaW5lIFpNXzExQl9TVEEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBaTV8xMUdfU1RBICAgICAgICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgWk1fMTFOX1NUQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0CisKKy8qIEFQIDogdGltZW91dCAqLworI2RlZmluZSBaTV9NU19QRVJfVElDSyAgICAgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBaTV9USUNLX1BFUl9TRUNPTkQgICAgICAgICAgICAgICAgICAoMTAwMC9aTV9NU19QRVJfVElDSykKKyNkZWZpbmUgWk1fVElDS19QRVJfTUlOVVRFICAgICAgICAgICAgICAgICAgKDYwKjEwMDAvWk1fTVNfUEVSX1RJQ0spCisjZGVmaW5lIFpNX1BSRUFVVEhfVElNRU9VVF9NUyAgICAgICAgICAgICAgIDEwMDAgLyogMSBzZWMgKi8KKyNkZWZpbmUgWk1fQVVUSF9USU1FT1VUX01TICAgICAgICAgICAgICAgICAgMTAwMCAvKiAxIHNlYyAqLworCisvKiBFcnJvciBjb2RlICovCisjZGVmaW5lIFpNX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWk1fRVJSX1RYX1BPUlRfRElTQUJMRUQgICAgICAgICAgICAgMQorI2RlZmluZSBaTV9FUlJfQlVGRkVSX0RNQV9BRERSICAgICAgICAgICAgICAyCisjZGVmaW5lIFpNX0VSUl9GUkVFX1RYRF9FWEhBVVNURUQgICAgICAgICAgIDMKKyNkZWZpbmUgWk1fRVJSX1RYX0JVRkZFUl9VTkFWQUlMQUJMRSAgICAgICAgNAorI2RlZmluZSBaTV9FUlJfQkNNQ19QU19CVUZGRVJfVU5BVkFJTEFCTEUgICA1CisjZGVmaW5lIFpNX0VSUl9VTklfUFNfQlVGRkVSX1VOQVZBSUxBQkxFICAgIDYKKyNkZWZpbmUgWk1fRVJSX0VYQ0VFRF9QUklPUklUWV9USFJFU0hPTEQgICAgNworI2RlZmluZSBaTV9FUlJfVk1NUV9GVUxMICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIFpNX0VSUl9GTFVTSF9QU19RVUVVRSAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgWk1fRVJSX0NNRF9JTlRfTUlTU0VEICAgICAgICAgICAgICAgMTUgLyogUG9sbGluZyBjbWQgaW50IHRpbWVvdXQqLworLyogUnggKi8KKyNkZWZpbmUgWk1fRVJSX1JYX0ZSQU1FX1RZUEUgICAgICAgICAgICAgICAgMjAKKyNkZWZpbmUgWk1fRVJSX01JTl9SWF9FTkNSWVBUX0ZSQU1FX0xFTkdUSCAgMjEKKyNkZWZpbmUgWk1fRVJSX01JTl9SWF9GUkFNRV9MRU5HVEggICAgICAgICAgMjIKKyNkZWZpbmUgWk1fRVJSX01BWF9SWF9GUkFNRV9MRU5HVEggICAgICAgICAgMjMKKyNkZWZpbmUgWk1fRVJSX1JYX0RVUExJQ0FURSAgICAgICAgICAgICAgICAgMjQKKyNkZWZpbmUgWk1fRVJSX1JYX1NSQ19BRERSX0lTX09XTl9NQUMgICAgICAgMjUKKyNkZWZpbmUgWk1fRVJSX01JTl9SWF9QUk9UT0NPTF9WRVJTSU9OICAgICAgMjYKKyNkZWZpbmUgWk1fRVJSX1dQQV9HS19OT1RfSU5TVEFMTEVEICAgICAgICAgMjcKKyNkZWZpbmUgWk1fRVJSX1NUQV9OT1RfQVNTT0NJQVRFRCAgICAgICAgICAgMjgKKyNkZWZpbmUgWk1fRVJSX0RBVEFfQkVGT1JFX0NPTk5FQ1RFRCAgICAgICAgMjkKKyNkZWZpbmUgWk1fRVJSX0RBVEFfTk9UX0VOQ1JZUFRFRCAgICAgICAgICAgMzAKKyNkZWZpbmUgWk1fRVJSX0RBVEFfQlNTSURfTk9UX01BVENIRUQgICAgICAgMzEKKyNkZWZpbmUgWk1fRVJSX1JYX0JBUl9GUkFNRSAgICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgWk1fRVJSX09VVF9PRl9PUkRFUl9OVUxMX0RBVEEgICAgICAgMzMKKworLyogWkZJICovCisjZGVmaW5lIFpNX0VSUl9JTlZBTElEX1RYX1JBVEUgICAgICAgICAgICAgIDQwCisjZGVmaW5lIFpNX0VSUl9XRFNfUE9SVF9JRCAgICAgICAgICAgICAgICAgIDQxCisKKy8qIFFVRVVFICovCisjZGVmaW5lIFpNX0VSUl9RVUVVRV9GVUxMICAgICAgICAgICAgICAgICAgIDUwCisjZGVmaW5lIFpNX0VSUl9TVEFfVUFQU0RfUVVFVUVfRlVMTCAgICAgICAgIDUxCisjZGVmaW5lIFpNX0VSUl9BUF9VQVBTRF9RVUVVRV9GVUxMICAgICAgICAgIDUyCisKKy8qIE1heGltdW0gUnggZnJhbWUgbGVuZ3RoICovCisjaWYgWk1fTEFSR0VQQVlMT0FEX1RFU1QgPT0gMQorI2RlZmluZSBaTV9XTEFOX01BWF9SWF9TSVpFICAgICAgICAgICAgICAgICAxNjM4NAorI2Vsc2UKKyNkZWZpbmUgWk1fV0xBTl9NQVhfUlhfU0laRSAgICAgICAgICAgICAgICAgODE5MgorI2VuZGlmCisKKy8qIFBDSSBETUEgdGVzdCBlcnJvciBjb2RlICovCisjZGVmaW5lIFpNX0VSUl9JTlRFUlJVUFRfTUlTU0VEICAgICAgICAgICAgIDEwMAorI2RlZmluZSBaTV9FUlJfT1dOX0JJVF9OT1RfQ0xFQVJFRCAgICAgICAgICAxMDEKKyNkZWZpbmUgWk1fRVJSX1JYX1NFUV9OVU1CRVIgICAgICAgICAgICAgICAgMTAyCisjZGVmaW5lIFpNX0VSUl9SWF9MRU5HVEggICAgICAgICAgICAgICAgICAgIDEwMworI2RlZmluZSBaTV9FUlJfUlhfREFUQSAgICAgICAgICAgICAgICAgICAgICAxMDQKKyNkZWZpbmUgWk1fRVJSX1JYX0RFU0NSSVBUT1JfTlVNICAgICAgICAgICAgMTA1CisvKiBDb21tb24gcmVnaXN0ZXIgdGVzdCBlcnJvciBjb2RlICovCisjZGVmaW5lIFpNX0VSUl9SRUdJU1RFUl9BQ0NFU1MgICAgICAgICAgICAgIDExMCAvKiBSZWdpc3RlciBSL1cgdGVzdCBmYWlsKi8KKyNkZWZpbmUgWk1fRVJSX0NMRUFSX0lOVEVSUlVQVF9GTEFHICAgICAgICAgMTExCisjZGVmaW5lIFpNX0VSUl9DT01NQU5EX1JFU1BPTlNFICAgICAgICAgICAgIDExMgorI2RlZmluZSBaTV9FUlJfSU5URVJSVVBUX0dFTkVSQVRFICAgICAgICAgICAxMTMKKyNkZWZpbmUgWk1fRVJSX0lOVEVSUlVQVF9BQ0sgICAgICAgICAgICAgICAgMTE0CisjZGVmaW5lIFpNX0VSUl9TQ1JBVENIX0FDQ0VTUyAgICAgICAgICAgICAgIDExNQorI2RlZmluZSBaTV9FUlJfSU5URVJSVVBUX01BU0tfQUNDRVNTICAgICAgICAxMTYKKyNkZWZpbmUgWk1fRVJSX1NIQVJFX01FTU9SWV9QQ0lfQUNDRVNTICAgICAgMTE3CisjZGVmaW5lIFpNX0VSUl9TSEFSRV9NRU1PUllfRldfQUNDRVNTICAgICAgIDExOAorI2RlZmluZSBaTV9FUlJfU0hBUkVfTUVNT1JZX0RJU0FCTEUgICAgICAgICAxMTkKKyNkZWZpbmUgWk1fRVJSX1NIQVJFX01FTU9SWV9URVNUX1JFU1BPTlNFICAgMTIwCisKKy8qIEZpcm13YXJlIERvd25sb2FkIGVycm9yIGNvZGUgKi8KKyNkZWZpbmUgWk1fRVJSX0ZJUk1XQVJFX0RPV05MT0FEX1RJTUVPVVQgICAgMTUwCisjZGVmaW5lIFpNX0VSUl9GSVJNV0FSRV9ET1dOTE9BRF9JTlRfRkxBRyAgIDE1MQorI2RlZmluZSBaTV9FUlJfRklSTVdBUkVfUkVBRFlfVElNRU9VVCAgICAgICAxNTIKKyNkZWZpbmUgWk1fRVJSX0ZJUk1XQVJFX1dST05HX1RZUEUgICAgICAgICAgMTUzCisKKy8qIERlYnVnICovCisjZGVmaW5lIFpNX0xWXzAgICAgIDAvL0RlYnVnIGxldmVsIDAsIERpc2FibGUgZGVidWcgbWVzc2FnZQorI2RlZmluZSBaTV9MVl8xICAgICAxLy9EZWJ1ZyBsZXZlbCAxLCBTaG93IG1pbmltdW0gaW5mb3JtYXRpb24KKyNkZWZpbmUgWk1fTFZfMiAgICAgMi8vRGVidWcgbGV2ZWwgMiwgU2hvdyBtZWRpdW0gbWVzc2FnZQorI2RlZmluZSBaTV9MVl8zICAgICAzLy9EZWJ1ZyBsZXZlbCAzLCBTaG93IGFsbAorCisjZGVmaW5lIFpNX1NDQU5NU0dfTEVWICBaTV9MVl8xCisjZGVmaW5lIFpNX1RYTVNHX0xFViAgICBaTV9MVl8wLy9aTV9MVl8wCisjZGVmaW5lIFpNX1JYTVNHX0xFViAgICBaTV9MVl8wCisjZGVmaW5lIFpNX01NTVNHX0xFViAgICBaTV9MVl8wCisjZGVmaW5lIFpNX0RFU01TR19MRVYgICBaTV9MVl8wLy9aTV9MVl8wCisjZGVmaW5lIFpNX0JVRk1TR19MRVYgICBaTV9MVl8wLy9aTV9MVl8xCisjZGVmaW5lIFpNX0lOSVRNU0dfTEVWICBaTV9MVl8wCisKKyNkZWZpbmUgem1fbXNnMF9zY2FuKGx2LCBtc2cpIGlmIChaTV9TQ0FOTVNHX0xFViA+PSBsdikgXAorICAgICAgICB7em1fZGVidWdfbXNnMChtc2cpO30KKyNkZWZpbmUgem1fbXNnMV9zY2FuKGx2LCBtc2csIHZhbCkgaWYgKFpNX1NDQU5NU0dfTEVWID49IGx2KSBcCisgICAgICAgIHt6bV9kZWJ1Z19tc2cxKG1zZywgdmFsKTt9CisjZGVmaW5lIHptX21zZzJfc2NhbihsdiwgbXNnLCB2YWwpIGlmIChaTV9TQ0FOTVNHX0xFViA+PSBsdikgXAorICAgICAgICB7em1fZGVidWdfbXNnMihtc2csIHZhbCk7fQorCisjZGVmaW5lIHptX21zZzBfdHgobHYsIG1zZykgaWYgKFpNX1RYTVNHX0xFViA+PSBsdikgXAorICAgICAgICB7em1fZGVidWdfbXNnMChtc2cpO30KKyNkZWZpbmUgem1fbXNnMV90eChsdiwgbXNnLCB2YWwpIGlmIChaTV9UWE1TR19MRVYgPj0gbHYpIFwKKyAgICAgICAge3ptX2RlYnVnX21zZzEobXNnLCB2YWwpO30KKyNkZWZpbmUgem1fbXNnMl90eChsdiwgbXNnLCB2YWwpIGlmIChaTV9UWE1TR19MRVYgPj0gbHYpIFwKKyAgICAgICAge3ptX2RlYnVnX21zZzIobXNnLCB2YWwpO30KKworI2RlZmluZSB6bV9tc2cwX3J4KGx2LCBtc2cpIGlmIChaTV9SWE1TR19MRVYgPj0gbHYpIFwKKyAgICAgICAge3ptX2RlYnVnX21zZzAobXNnKTt9CisjZGVmaW5lIHptX21zZzFfcngobHYsIG1zZywgdmFsKSBpZiAoWk1fUlhNU0dfTEVWID49IGx2KSBcCisgICAgICAgIHt6bV9kZWJ1Z19tc2cxKG1zZywgdmFsKTt9CisjZGVmaW5lIHptX21zZzJfcngobHYsIG1zZywgdmFsKSBpZiAoWk1fUlhNU0dfTEVWID49IGx2KSBcCisgICAgICAgIHt6bV9kZWJ1Z19tc2cyKG1zZywgdmFsKTt9CisKKyNkZWZpbmUgem1fbXNnMF9tbShsdiwgbXNnKSBpZiAoWk1fTU1NU0dfTEVWID49IGx2KSBcCisgICAgICAgIHt6bV9kZWJ1Z19tc2cwKG1zZyk7fQorI2RlZmluZSB6bV9tc2cxX21tKGx2LCBtc2csIHZhbCkgaWYgKFpNX01NTVNHX0xFViA+PSBsdikgXAorICAgICAgICB7em1fZGVidWdfbXNnMShtc2csIHZhbCk7fQorI2RlZmluZSB6bV9tc2cyX21tKGx2LCBtc2csIHZhbCkgaWYgKFpNX01NTVNHX0xFViA+PSBsdikgXAorICAgICAgICB7em1fZGVidWdfbXNnMihtc2csIHZhbCk7fQorCisjZGVmaW5lIHptX21zZzBfZGVzKGx2LCBtc2cpIGlmIChaTV9ERVNNU0dfTEVWID49IGx2KSBcCisgICAgICAgIHt6bV9kZWJ1Z19tc2cwKG1zZyk7fQorI2RlZmluZSB6bV9tc2cxX2RlcyhsdiwgbXNnLCB2YWwpIGlmIChaTV9ERVNNU0dfTEVWID49IGx2KSBcCisgICAgICAgIHt6bV9kZWJ1Z19tc2cxKG1zZywgdmFsKTt9CisjZGVmaW5lIHptX21zZzJfZGVzKGx2LCBtc2csIHZhbCkgaWYgKFpNX0RFU01TR19MRVYgPj0gbHYpIFwKKyAgICAgICAge3ptX2RlYnVnX21zZzIobXNnLCB2YWwpO30KKworI2RlZmluZSB6bV9tc2cwX2J1ZihsdiwgbXNnKSBpZiAoWk1fQlVGTVNHX0xFViA+PSBsdikgXAorICAgICAgICB7em1fZGVidWdfbXNnMChtc2cpO30KKyNkZWZpbmUgem1fbXNnMV9idWYobHYsIG1zZywgdmFsKSBpZiAoWk1fQlVGTVNHX0xFViA+PSBsdikgXAorICAgICAgICB7em1fZGVidWdfbXNnMShtc2csIHZhbCk7fQorI2RlZmluZSB6bV9tc2cyX2J1ZihsdiwgbXNnLCB2YWwpIGlmIChaTV9CVUZNU0dfTEVWID49IGx2KSBcCisgICAgICAgIHt6bV9kZWJ1Z19tc2cyKG1zZywgdmFsKTt9CisKKyNkZWZpbmUgem1fbXNnMF9pbml0KGx2LCBtc2cpIGlmIChaTV9JTklUTVNHX0xFViA+PSBsdikgXAorICAgICAgICB7em1fZGVidWdfbXNnMChtc2cpO30KKyNkZWZpbmUgem1fbXNnMV9pbml0KGx2LCBtc2csIHZhbCkgaWYgKFpNX0lOSVRNU0dfTEVWID49IGx2KSBcCisgICAgICAgIHt6bV9kZWJ1Z19tc2cxKG1zZywgdmFsKTt9CisjZGVmaW5lIHptX21zZzJfaW5pdChsdiwgbXNnLCB2YWwpIGlmIChaTV9JTklUTVNHX0xFViA+PSBsdikgXAorICAgICAgICB7em1fZGVidWdfbXNnMihtc2csIHZhbCk7fQorCisjZGVmaW5lIFpNX01BWF9BUF9TVVBQT1JUICAgICAgICAgICAgICAgICAgIDIgIC8qIE11c3QgPD0gOCAqLworI2RlZmluZSBaTV9NQVhfV0RTX1NVUFBPUlQgICAgICAgICAgICAgICAgICA2ICAvKiBNdXN0IDw9IDYgKi8KKyNkZWZpbmUgWk1fTUFYX1NUQV9TVVBQT1JUICAgICAgICAgICAgICAgICAgMTYgLyogTXVzdCA8PSA2NCAqLworCisvKiBTVEEgdGFibGUgc3RhdGUgKi8KKyNkZWZpbmUgWk1fU1RBVEVfQVVUSCAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaTV9TVEFURV9QUkVBVVRIICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFpNX1NUQVRFX0FTT0MgICAgICAgICAgICAgICAgICAgICAgIDMKKworLyogUmF0ZSBzZXQgKi8KKyNkZWZpbmUgWk1fUkFURV9TRVRfQ0NLICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaTV9SQVRFX1NFVF9PRkRNICAgICAgICAgICAgICAgICAgICAxCisKKy8qIEhUIFBUICovCisjZGVmaW5lIFpNX1BSRUFNQkxFX1RZUEVfTUlYRURfTU9ERSAgICAgICAgIDAKKyNkZWZpbmUgWk1fUFJFQU1CTEVfVFlQRV9HUkVFTl9GSUVMRCAgICAgICAgMQorCisvKiBIVCBiYW5kd2lkdGggKi8KKyNkZWZpbmUgWk1fQkFORFdJRFRIXzIwTUhaICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaTV9CQU5EV0lEVEhfNDBNSFogICAgICAgICAgICAgICAgICAxCisKKy8qIE1JQyBzdGF0dXMgKi8KKyNkZWZpbmUgWk1fTUlDX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaTV9NSUNfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAxCisKKy8qIElDViBzdGF0dXMgKi8KKyNkZWZpbmUgWk1fSUNWX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaTV9JQ1ZfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAxCisKKy8qIGRlZmluaXRpb24gY2hlY2sgKi8KKyNpZiAoWk1fTUFYX0FQX1NVUFBPUlQgPiA4KQorZGVmaW5pdGlvbiBlcnJvciwgWk1fTUFYX0FQX1NVUFBPUlQgPiA4CisjZW5kaWYKKyNpZiAoWk1fTUFYX0FQX1NVUFBPUlQgPiA2NCkKK2RlZmluaXRpb24gZXJyb3IsIFpNX01BWF9TVEFfU1VQUE9SVCA+IDY0CisjZW5kaWYKKworLyogIFRyYW5zbWlzc2lvbiBSYXRlIGluZm9ybWF0aW9uICovCisKKy8qIFdMQU4gZnJhbWUgZm9ybWF0ICovCisjZGVmaW5lIFpNX1BMQ1BfSEVBREVSX1NJWkUgICAgICAgICAgNQorI2RlZmluZSBaTV9FVEhFUk5FVF9BRERSRVNTX0xFTkdUSCAgIDYKKyNkZWZpbmUgWk1fVElNRVNUQU1QX09GRlNFVCAgICAgICAgICAwCisjZGVmaW5lIFpNX0JFQUNPTl9JTlRFUlZBTF9PRkZTRVQgICAgOAorI2RlZmluZSBaTV9DQVBBQklMSVRZX09GRlNFVCAgICAgICAgMTAKKworLyogUmVhc29uIENvZGUgKi8KKy8qIEFuIHVuc29saWNpdGVkIG5vdGlmaWNhdGlvbiBtYW5hZ2VtZW50IGZyYW1lIG9mICAgICAgICovCisvKiB0eXBlIERpc2Fzc29jYXRpb24gb3IgRGVhdXRoZW50aWNhdGlvbiB3YXMgZ2VuZXJhdGVkLiAqLworI2lmZGVmIFpNX1JFQVNPTl9DT0RFCisjZGVmaW5lIFpNX1dMQU5fUkVBU09OX0NPREVfVU5TUEVDSUZJRUQgICAxCisjZGVmaW5lIFpNX1dMQU5fRlJBTUVfRElTQVNPQ19ERUFVVEhfUkVBU09OX0NPREUgIDI0CisjZW5kaWYKKworc3RydWN0IHpzV2xhbk1hbmFnZW1lbnRGcmFtZUhlYWRlcgoreworICAgIC8vdThfdCAgICAgIHBsY3BIZHJbWk1fUExDUF9IRUFERVJfU0laRV07CisgICAgdThfdCAgICAgICAgZnJhbWVDdHJsWzJdOworICAgIHU4X3QgICAgICAgIGR1cmF0aW9uWzJdOworICAgIHU4X3QgICAgICAgIGRhW1pNX0VUSEVSTkVUX0FERFJFU1NfTEVOR1RIXTsKKyAgICB1OF90ICAgICAgICBzYVtaTV9FVEhFUk5FVF9BRERSRVNTX0xFTkdUSF07CisgICAgdThfdCAgICAgICAgYnNzaWRbWk1fRVRIRVJORVRfQUREUkVTU19MRU5HVEhdOworICAgIHU4X3QgICAgICAgIHNlcUN0cmxbMl07CisgICAgdThfdCAgICAgICAgYm9keVsxXTsKK307CisKK3N0cnVjdCB6c1dsYW5Qcm9iZVJzcEZyYW1lSGVhZGVyCit7CisgICAgLy91OF90ICAgICAgcGxjcEhkcltaTV9QTENQX0hFQURFUl9TSVpFXTsKKyAgICB1OF90ICAgICAgICBmcmFtZUN0cmxbMl07CisgICAgdThfdCAgICAgICAgZHVyYXRpb25bMl07CisgICAgdThfdCAgICAgICAgZGFbWk1fRVRIRVJORVRfQUREUkVTU19MRU5HVEhdOworICAgIHU4X3QgICAgICAgIHNhW1pNX0VUSEVSTkVUX0FERFJFU1NfTEVOR1RIXTsKKyAgICB1OF90ICAgICAgICBic3NpZFtaTV9FVEhFUk5FVF9BRERSRVNTX0xFTkdUSF07CisgICAgdThfdCAgICAgICAgc2VxQ3RybFsyXTsKKyAgICB1OF90ICAgICAgICB0aW1lU3RhbXBbOF07CisgICAgdThfdCAgICAgICAgYmVhY29uSW50ZXJ2YWxbMl07CisgICAgdThfdCAgICAgICAgY2FwYWJpbGl0eVsyXTsKKyAgICB1OF90ICAgICAgICBzc2lkW1pNX01BWF9TU0lEX0xFTkdUSCArIDJdOyAgIC8vIEVJRCgxKSArIExlbmd0aCgxKSArIFNTSUQoMzIpCit9IDsKKworI2RlZmluZSB6c1dsYW5CZWFjb25GcmFtZUhlYWRlciB6c1dsYW5Qcm9iZVJzcEZyYW1lSGVhZGVyCisKK3N0cnVjdCB6c1dsYW5BdXRoRnJhbWVIZWFkZXIKK3sKKyAgICAvL3U4X3QgICAgICBwbGNwSGRyW1pNX1BMQ1BfSEVBREVSX1NJWkVdOworICAgIHU4X3QgICAgICAgIGZyYW1lQ3RybFsyXTsKKyAgICB1OF90ICAgICAgICBkdXJhdGlvblsyXTsKKyAgICB1OF90ICAgICAgICBhZGRyZXNzMVtaTV9FVEhFUk5FVF9BRERSRVNTX0xFTkdUSF07CisgICAgdThfdCAgICAgICAgYWRkcmVzczJbWk1fRVRIRVJORVRfQUREUkVTU19MRU5HVEhdOworICAgIHU4X3QgICAgICAgIGFkZHJlc3MzW1pNX0VUSEVSTkVUX0FERFJFU1NfTEVOR1RIXTsKKyAgICB1OF90ICAgICAgICBzZXFDdHJsWzJdOworICAgIHUxNl90ICAgICAgIGFsZ287CisgICAgdTE2X3QgICAgICAgc2VxOworICAgIHUxNl90ICAgICAgIHN0YXR1czsKKyAgICB1OF90ICAgICAgICBjaGFsbGVuZ2VUZXh0WzI1NV07IC8vIHRoZSBmaXJzdCAyIGJ5dGVzIGFyZSBpbmZvcm1hdGlvbiBJRCwgbGVuZ3RoCit9OworCitzdHJ1Y3QgenNXbGFuQXNzb0ZyYW1lSGVhZGVyCit7CisgICAgLy91OF90ICAgICAgcGxjcEhkcltQTENQX0hFQURFUl9TSVpFXTsKKyAgICB1OF90ICAgICAgICBmcmFtZUN0cmxbMl07CisgICAgdThfdCAgICAgICAgZHVyYXRpb25bMl07CisgICAgdThfdCAgICAgICAgYWRkcmVzczFbWk1fRVRIRVJORVRfQUREUkVTU19MRU5HVEhdOworICAgIHU4X3QgICAgICAgIGFkZHJlc3MyW1pNX0VUSEVSTkVUX0FERFJFU1NfTEVOR1RIXTsKKyAgICB1OF90ICAgICAgICBhZGRyZXNzM1taTV9FVEhFUk5FVF9BRERSRVNTX0xFTkdUSF07CisgICAgdThfdCAgICAgICAgc2VxQ3RybFsyXTsKKyAgICB1OF90ICAgICAgICBjYXBhYmlsaXR5WzJdOworICAgIHUxNl90ICAgICAgIHN0YXR1czsKKyAgICB1MTZfdCAgICAgICBhaWQ7CisgICAgLy91OF90ICAgICAgICBzdXBwb3J0ZWRSYXRlc1sxMF07Cit9OworCitzdHJ1Y3QgenNGcmFnCit7CisgICAgemJ1Zl90KiBidWZbMTZdOworICAgIHUxNl90IGJ1ZlR5cGVbMTZdOworICAgIHUxNl90IHNlcVsxNl07CisgICAgdThfdCBmbGFnWzE2XTsKKworfTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gSGFyZHdhcmUgcmVsYXRlZCBkZWZpbml0aW9ucworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2RlZmluZSBaTV9NQUNfUkVHX0JBU0UgICAgICAgICAgICAgICAgICAgICAgICAgMHgxYzMwMDAKKworI2RlZmluZSBaTV9NQUNfUkVHX0FUSU1fV0lORE9XICAgICAgICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NTFDKQorI2RlZmluZSBaTV9NQUNfUkVHX0JDTl9QRVJJT0QgICAgICAgICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NTIwKQorI2RlZmluZSBaTV9NQUNfUkVHX1BSRVRCVFQgICAgICAgICAgICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NTI0KQorCisjZGVmaW5lIFpNX01BQ19SRUdfTUFDX0FERFJfTCAgICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHg2MTApCisjZGVmaW5lIFpNX01BQ19SRUdfTUFDX0FERFJfSCAgICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHg2MTQpCisKKyNkZWZpbmUgWk1fTUFDX1JFR19HUk9VUF9IQVNIX1RCTF9MICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweDYyNCkKKyNkZWZpbmUgWk1fTUFDX1JFR19HUk9VUF9IQVNIX1RCTF9IICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweDYyOCkKKworI2RlZmluZSBaTV9NQUNfUkVHX0JBU0lDX1JBVEUgICAgICAgICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NjMwKQorI2RlZmluZSBaTV9NQUNfUkVHX01BTkRBVE9SWV9SQVRFICAgICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NjM0KQorI2RlZmluZSBaTV9NQUNfUkVHX1JUU19DVFNfUkFURSAgICAgICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NjM4KQorI2RlZmluZSBaTV9NQUNfUkVHX0JBQ0tPRkZfUFJPVEVDVCAgICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NjNjKQorI2RlZmluZSBaTV9NQUNfUkVHX1JYX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NjQwKQorI2RlZmluZSBaTV9NQUNfUkVHX1JYX1BFX0RFTEFZICAgICAgICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NjRDKQorCisjZGVmaW5lIFpNX01BQ19SRUdfRFlOQU1JQ19TSUZTX0FDSyAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHg2NTgpCisjZGVmaW5lIFpNX01BQ19SRUdfU05JRkZFUiAgICAgICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHg2NzQpCisjZGVmaW5lIFpNX01BQ19SRUdfVFhfVU5ERVJSVU4JCSAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweDY4OCkKKyNkZWZpbmUgWk1fTUFDX1JFR19SWF9UT1RBTAkJCSAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweDZBMCkKKyNkZWZpbmUgWk1fTUFDX1JFR19SWF9DUkMzMgkJCSAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweDZBNCkKKyNkZWZpbmUgWk1fTUFDX1JFR19SWF9DUkMxNgkJCSAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweDZBOCkKKyNkZWZpbmUgWk1fTUFDX1JFR19SWF9FUlJfVU5JCQkgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHg2QUMpCisjZGVmaW5lIFpNX01BQ19SRUdfUlhfT1ZFUlJVTgkJICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NkIwKQorI2RlZmluZSBaTV9NQUNfUkVHX1JYX0VSUl9NVUwJCSAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweDZCQykKKyNkZWZpbmUgWk1fTUFDX1JFR19UWF9SRVRSWQkJCSAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweDZDQykKKyNkZWZpbmUgWk1fTUFDX1JFR19UWF9UT1RBTAkJCSAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweDZGNCkKKworCisjZGVmaW5lIFpNX01BQ19SRUdfQUNLX0VYVEVOU0lPTiAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHg2OTApCisjZGVmaW5lIFpNX01BQ19SRUdfRUlGU19BTkRfU0lGUyAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHg2OTgpCisKKyNkZWZpbmUgWk1fTUFDX1JFR19TTE9UX1RJTUUgICAgICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweDZGMCkKKworI2RlZmluZSBaTV9NQUNfUkVHX1JPTExfQ0FMTF9UQkxfTCAgICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NzA0KQorI2RlZmluZSBaTV9NQUNfUkVHX1JPTExfQ0FMTF9UQkxfSCAgICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4NzA4KQorCisjZGVmaW5lIFpNX01BQ19SRUdfQUMwX0NXICAgICAgICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHhCMDApCisjZGVmaW5lIFpNX01BQ19SRUdfQUMxX0NXICAgICAgICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHhCMDQpCisjZGVmaW5lIFpNX01BQ19SRUdfQUMyX0NXICAgICAgICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHhCMDgpCisjZGVmaW5lIFpNX01BQ19SRUdfQUMzX0NXICAgICAgICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHhCMEMpCisjZGVmaW5lIFpNX01BQ19SRUdfQUM0X0NXICAgICAgICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHhCMTApCisjZGVmaW5lIFpNX01BQ19SRUdfQUMxX0FDMF9BSUZTICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHhCMTQpCisjZGVmaW5lIFpNX01BQ19SRUdfQUMzX0FDMl9BSUZTICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHhCMTgpCisKKyNkZWZpbmUgWk1fTUFDX1JFR19SRVRSWV9NQVggICAgICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweEIyOCkKKworI2RlZmluZSBaTV9NQUNfUkVHX1RYT1BfTk9UX0VOT1VHSF9JTkRJQ0FUSU9OICAgKFpNX01BQ19SRUdfQkFTRSArIDB4QjMwKQorCisjZGVmaW5lIFpNX01BQ19SRUdfQUMxX0FDMF9UWE9QICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHhCNDQpCisjZGVmaW5lIFpNX01BQ19SRUdfQUMzX0FDMl9UWE9QICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHhCNDgpCisKKyNkZWZpbmUgWk1fTUFDX1JFR19BQ0tfVEFCTEUgICAgICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweEMwMCkKKworI2RlZmluZSBaTV9NQUNfUkVHX0JDTl9BRERSICAgICAgICAgICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4RDg0KQorI2RlZmluZSBaTV9NQUNfUkVHX0JDTl9MRU5HVEggICAgICAgICAgICAgICAgICAgKFpNX01BQ19SRUdfQkFTRSArIDB4RDg4KQorCisjZGVmaW5lIFpNX01BQ19SRUdfQkNOX1BMQ1AgICAgICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHhEOTApCisjZGVmaW5lIFpNX01BQ19SRUdfQkNOX0NUUkwgICAgICAgICAgICAgICAgICAgICAoWk1fTUFDX1JFR19CQVNFICsgMHhEOTQpCisKKyNkZWZpbmUgWk1fTUFDX1JFR19CQ05fSFQxICAgICAgICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweERBMCkKKyNkZWZpbmUgWk1fTUFDX1JFR19CQ05fSFQyICAgICAgICAgICAgICAgICAgICAgIChaTV9NQUNfUkVHX0JBU0UgKyAweERBNCkKKworCisjZGVmaW5lIFpNX1JYX1NUQVRVU19JU19NSUNfRkFJTChyeFN0YXR1cykgcnhTdGF0dXMtPlRhaWwuRGF0YS5FcnJvckluZGljYXRpb24gJiBaTV9CSVRfNgorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZmRlZiBaTV9FTkFCTEVfTkFUSVZFX1dJRkkKKyNkZWZpbmUgWk1fODAyMTFfRlJBTUVfSEVBREVSX0xFTiAgICAgICAgICAgMjQKKyNkZWZpbmUgWk1fODAyMTFfRlJBTUVfVFlQRV9PRkZTRVQgICAgICAgICAgMzAgICAgLy8gWk1fODAyMTFfRlJBTUVfSEVBREVSX0xFTiArIFNOQVAKKyNkZWZpbmUgWk1fODAyMTFfRlJBTUVfSVBfT0ZGU0VUICAgICAgICAgICAgMzIgICAgLy8gWk1fODAyMTFfRlJBTUVfSEVBREVSX0xFTiArIFNOQVAgKyBUWVBFCisjZWxzZQorI2RlZmluZSBaTV84MDIxMV9GUkFNRV9IRUFERVJfTEVOICAgICAgICAgICAxNAorI2RlZmluZSBaTV84MDIxMV9GUkFNRV9UWVBFX09GRlNFVCAgICAgICAgICAxMiAgICAvLyBaTV84MDIxMV9GUkFNRV9IRUFERVJfTEVOICsgU05BUAorI2RlZmluZSBaTV84MDIxMV9GUkFNRV9JUF9PRkZTRVQgICAgICAgICAgICAxNCAgICAvLyBaTV84MDIxMV9GUkFNRV9IRUFERVJfTEVOICsgU05BUCArIFRZUEUKKyNlbmRpZgorCisjZGVmaW5lIFpNX0JTU19JTkZPX1ZBTElEX0JJVCAgICAgIDB4MDEKKyNkZWZpbmUgWk1fQlNTX0lORk9fVVBEQVRFRF9CSVQgICAgMHgwMgorCisKKworCisKKyNkZWZpbmUgWk1fRVJST1JfSU5ESUNBVElPTl9SWF9USU1FT1VUICAgICAgMHgwMQorI2RlZmluZSBaTV9FUlJPUl9JTkRJQ0FUSU9OX09WRVJSVU4gICAgICAgICAweDAyCisjZGVmaW5lIFpNX0VSUk9SX0lORElDQVRJT05fREVDUllQVF9FUlJPUiAgIDB4MDQKKyNkZWZpbmUgWk1fRVJST1JfSU5ESUNBVElPTl9DUkMzMl9FUlJPUiAgICAgMHgwOAorI2RlZmluZSBaTV9FUlJPUl9JTkRJQ0FUSU9OX0FERFJfTk9UX01BVENIICAweDEwCisjZGVmaW5lIFpNX0VSUk9SX0lORElDQVRJT05fQ1JDMTZfRVJST1IgICAgIDB4MjAKKyNkZWZpbmUgWk1fRVJST1JfSU5ESUNBVElPTl9NSUNfRVJST1IgICAgICAgMHg0MAorCisjZGVmaW5lIFpNX1JYTUFDX1NUQVRVU19NT0RfVFlQRV9DQ0sgICAgICAgIDB4MDAKKyNkZWZpbmUgWk1fUlhNQUNfU1RBVFVTX01PRF9UWVBFX09GRE0gICAgICAgMHgwMQorI2RlZmluZSBaTV9SWE1BQ19TVEFUVVNfTU9EX1RZUEVfSFRfT0ZETSAgICAweDAyCisjZGVmaW5lIFpNX1JYTUFDX1NUQVRVU19NT0RfVFlQRV9ETF9PRkRNICAgIDB4MDMKKyNkZWZpbmUgWk1fUlhNQUNfU1RBVFVTX1RPVEFMX0VSUk9SICAgICAgICAgMHg4MAorCisKKworCisKKyNkZWZpbmUgWk1fTUFYX0xFRF9OVU1CRVIgICAgICAgMgorCisjZGVmaW5lIFpNX0xFRF9ESVNBQkxFX01PREUgICAgIDB4MAorI2RlZmluZSBaTV9MRURfTElOS19NT0RFICAgICAgICAweDEKKyNkZWZpbmUgWk1fTEVEX0xJTktfVFJfTU9ERSAgICAgMHgyCisjZGVmaW5lIFpNX0xFRF9UUl9PTl9NT0RFICAgICAgIDB4MworI2RlZmluZSBaTV9MRURfVFJfT0ZGX01PREUgICAgICAweDQKKworI2RlZmluZSBaTV9MRURfQ1RSTF9GTEFHX0FMUEhBICAgICAgMHgxCisKK3N0cnVjdCB6c0xlZFN0cnVjdAoreworICAgIHUzMl90ICAgY291bnRlcjsKKyAgICB1MzJfdCAgIGNvdW50ZXIxMDBtczsKKyAgICB1MTZfdCAgIGxlZExpbmtTdGF0ZTsKKyAgICB1MTZfdCAgIGxlZE1vZGVbWk1fTUFYX0xFRF9OVU1CRVJdOworICAgIHUzMl90ICAgdHhUcmFmZmljOworICAgIHUzMl90ICAgcnhUcmFmZmljOworICAgIHU4X3QgICAgTEVEQ3RybFR5cGU7CisgICAgdThfdCAgICBMRURDdHJsRmxhZzsgICAgICAgICAvLyBDb250cm9sIEZsYWcgZm9yIHZlbmRvcnMKKyAgICB1OF90ICAgIExFREN0cmxGbGFnRnJvbVJlZzsgIC8vIENvbnRyb2wgRmxhZyBmb3IgdmVuZG9ycyBpbiByZWdpc3RyeQorfTsKKworCisvL0hBTCsgY2FwYWJpbGl0eSBiaXRzIGRlZmluaXRpb24KKyNkZWZpbmUgWk1fSFBfQ0FQXzExTiAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgWk1fSFBfQ0FQXzExTl9PTkVfVFhfU1RSRUFNICAgICAweDIKKyNkZWZpbmUgWk1fSFBfQ0FQXzJHICAgICAgICAgICAgICAgICAgICAweDQKKyNkZWZpbmUgWk1fSFBfQ0FQXzVHICAgICAgICAgICAgICAgICAgICAweDgKKworI2VuZGlmIC8qICNpZm5kZWYgX1dMQU5fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU0OWQwOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL0tjb25maWcKQEAgLTAsMCArMSwzMiBAQAorY29uZmlnIE9UVVMKKwl0cmlzdGF0ZSAiQXRoZXJvcyBPVFVTIDgwMi4xMW4gVVNCIHdpcmVsZXNzIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBVU0IgJiYgV0xBTl84MDIxMSAmJiBNQUM4MDIxMQorCWRlZmF1bHQgTgorCS0tLWhlbHAtLS0KKwkgIEVuYWJsZSBzdXBwb3J0IGZvciBBdGhlcm9zIDgwMi4xMW4gVVNCIGhhcmR3YXJlOgorCSAgICAqIFVCODEgLSAyeDIgMi40IEdIegorCSAgICAqIFVCODIgLSAyeDIgMi40IEdIeiBhbmQgNSBHSHoKKwkgICAgKiBVQjgzIC0gMXgyIDIuNCBHSHoKKworCSAgVGhpcyBpbmNsdWRlcyB0aGUgZm9sbG93aW5nIGRldmljZXMgY3VycmVudGx5IG9uIHRoZSBtYXJrZXQ6CisJICBEbGluayBEV0EtMTYwQTEsIE5ldGdlYXIgV05EQTMxMDAgYW5kIFdOMTExdjIsIFRQLUxpbmsKKwkgIFRMLVdOODIxTiwgYW5kIEFWTSBGUklUWiFXTEFOIE4gVVNCIFN0aWNrLgorCisJICBUaGlzIGRyaXZlciByZXF1aXJlcyBpdHMgb3duIHN1cHBsaWNhbnQgZHJpdmVyIGZvcgorCSAgd3BhX3N1cHBsaWNhbnQgMC40LjguIEZvciB5b3VyIGNvbnZlbmllbmNlIHlvdSBjYW4gZmluZCB0aGUKKwkgIHRhcmJhbGwgaGVyZToKKworCSAgaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9saW51eC9rZXJuZWwvcGVvcGxlL21jZ3JvZi9vdHVzL3dwYV9zdXBwbGljYW50LTAuNC44X290dXMudGFyLmJ6MgorCisJICBCZWZvcmUgY29tcGlsaW5nIHdwYV9zdXBwbGljYW50LCBlbnN1cmUgeW91ciAuY29uZmlnIGhhcyBhdAorCSAgbGVhc3QgdGhlIGZvbGxvd2luZzoKKwkJQ09ORklHX1dJUkVMRVNTX0VYVEVOU0lPTj15CisJCUNPTkZJR19FQVBfV1NDPXkKKwkJQ09ORklHX1dTQ19JRT15CisJCUNPTkZJR19EUklWRVJfV0VYVD15CisJCUNPTkZJR19EUklWRVJfT1RVUz15CisKKwkgIEFmdGVyIGEgc3VjY2Vzc2Z1bCBjb21waWxlLCB5b3UgY2FuIHVzZSB0aGUgQXRoZXJvcyBkZXZpY2UgYXMKKwkgIHNob3duIGluIHRoZSBleGFtcGxlOgorCSAgJCB3cGFfc3VwcGxpY2FudCAtRG90dXMgLWkgPGF0aGVyb3MgZGV2aWNlIGZyb20gaWZjb25maWc+IC1jIC9wYXRoL3RvL3dwYV9zdXBwbGljYW50LmNvbmYgLWQKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWJjYzVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvTWFrZWZpbGUKQEAgLTAsMCArMSw2NyBAQAorb2JqLSQoQ09ORklHX09UVVMpCSs9IGFydXNiX2xueC5vCisKK0VYVFJBX0NGTEFHUyArPSAtREFNQUMKK0VYVFJBX0NGTEFHUyArPSAtREdDQ0sKK0VYVFJBX0NGTEFHUyArPSAtRE9GRE0KK0VYVFJBX0NGTEFHUyArPSAtRFRYUV9JTl9JU1IKK0VYVFJBX0NGTEFHUyArPSAtRFdMQU5fSE9TVElGPTAgIzA6VVNCLCAxOlBDSQorCisjVGVzdCBNb2RlCitFWFRSQV9DRkxBR1MgKz0gLURaTV9VU0JfU1RSRUFNX01PREU9MQorRVhUUkFfQ0ZMQUdTICs9IC1EWk1fVVNCX1RYX1NUUkVBTV9NT0RFPTAKK0VYVFJBX0NGTEFHUyArPSAtRFpNX1BDSV9ETUFfVEVTVD0wCitFWFRSQV9DRkxBR1MgKz0gLURaTV9MQVJHRVBBWUxPQURfVEVTVD0wCitFWFRSQV9DRkxBR1MgKz0gLURaTV9GV19MT09QX0JBQ0s9MAorRVhUUkFfQ0ZMQUdTICs9IC1EWk1fTElOVVhfVFBDPTEKKyNFWFRSQV9DRkxBR1MgKz0gLURaTV9ET05UX0NPUFlfUlhfQlVGRkVSCisKK0VYVFJBX0NGTEFHUyArPSAtRFpNX0hPU1RBUERfU1VQUE9SVAorI0VYVFJBX0NGTEFHUyArPSAtRGZUWF9HQUlOX09GRE09MAorI0VYVFJBX0NGTEFHUyArPSAtRFpNX0NPTkZJR19CSUdfRU5ESUFOIC1EQklHX0VORElBTgorRVhUUkFfQ0ZMQUdTICs9IC1EWk1fSEFMUExVU19MT0NLCitFWFRSQV9DRkxBR1MgKz0gLURaTV9PVFVTX0xJTlVYX1BIQVNFXzIKKworYXJ1c2JfbG54LW9ianMgOj0gXAorCXVzYmRydi5vIFwKKwl6ZHVzYi5vIFwKKwlpb2N0bC5vIFwKKwl3cmFwX2J1Zi5vIFwKKwl3cmFwX21lbS5vIFwKKwl3cmFwX2V2Lm8gXAorCXdyYXBfdXNiLm8gXAorCXdyYXBfcGt0Lm8gXAorCXdyYXBfZGJnLm8gXAorCXdyYXBfbWlzLm8gXAorCXdyYXBfc2VjLm8gXAorCXd3cmFwLm8gXAorCTgwMjExY29yZS9jY21kLm8gXAorCTgwMjExY29yZS9jaGIubyBcCisJODAyMTFjb3JlL2Npbml0Lm8gXAorCTgwMjExY29yZS9jbW0ubyBcCisJODAyMTFjb3JlL2NtbWFwLm8gXAorCTgwMjExY29yZS9jbW1zdGEubyBcCisJODAyMTFjb3JlL2NmdW5jLm8gXAorCTgwMjExY29yZS9jb2lkLm8gXAorCTgwMjExY29yZS9jdGtpcC5vIFwKKwk4MDIxMWNvcmUvY3R4cngubyBcCisJODAyMTFjb3JlL2NpYy5vIFwKKwk4MDIxMWNvcmUvY3BzbWdyLm8gXAorCTgwMjExY29yZS9jc2Nhbm1nci5vIFwKKwk4MDIxMWNvcmUvcmF0ZWN0cmwubyBcCisJODAyMTFjb3JlL2xlZG1nci5vIFwKKwk4MDIxMWNvcmUvYW1zZHUubyBcCisJODAyMTFjb3JlL2N3bS5vIFwKKwk4MDIxMWNvcmUvY2FnZy5vIFwKKwk4MDIxMWNvcmUvcXVldWUubyBcCisJODAyMTFjb3JlL2ZyZXFjdHJsLm8gXAorCTgwMjExY29yZS9jd2VwLm8gXAorCWhhbC9ocHJ3Lm8gXAorCWhhbC9ocG1haW4ubyBcCisJaGFsL2hwdXNiLm8gXAorCWhhbC9ocHJlZy5vIFwKKwloYWwvaHBmd3Vpbml0Lm8gXAorCWhhbC9ocGZ3YnUubyBcCisJaGFsL2hwZncyLm8gXAorCWhhbC9ocERLZnd1Lm8gXAorCWhhbC9ocGZ3c3BpdS5vIFwKKwloYWwvaHBhbmkubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkxMjI5MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL1RPRE8KQEAgLTAsMCArMSw5IEBACitUT0RPOgorCS0gY2hlY2twYXRjaC5wbCBjbGVhbnVwcworCS0gc3BhcnNlIGNsZWFudXBzCisJLSBwb3J0IHRvIGluLWtlcm5lbCA4MDIxMSBzdGFjaworCS0gcHJvcGVyIG5ldHdvcmsgZGV2ZWxvcGVyIG1haW50YWluZXIKKworUGxlYXNlIHNlbmQgYW55IHBhdGNoZXMgdG8gR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4gYW5kCitMdWlzIFJvZHJpZ3VleiA8THVpcy5Sb2RyaWd1ZXpAQXRoZXJvcy5jb20+IGFuZCB0aGUKK290dXMtZGV2ZWxAbGlzdHMubWFkd2lmaS1wcm9qZWN0Lm9yZyBtYWlsaW5nIGxpc3QuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9hcGRiZy5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvYXBkYmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2UyZjYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvYXBkYmcuYwpAQCAtMCwwICsxLDQ1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogYXBkYmcuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBEZWJ1ZyB0b29scyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKworI2RlZmluZSBaTV9JT0NUTF9SRUdfUkVBRCAgICAgICAgICAgMHgwMQorI2RlZmluZSBaTV9JT0NUTF9SRUdfV1JJVEUgICAgICAgICAgMHgwMgorI2RlZmluZSBaTV9JT0NUTF9NRU1fRFVNUCAgICAgICAgICAgMHgwMworI2RlZmluZSBaTV9JT0NUTF9SRUdfRFVNUCAgICAgICAgICAgMHgwNQorI2RlZmluZSBaTV9JT0NUTF9UWERfRFVNUCAgICAgICAgICAgMHgwNgorI2RlZmluZSBaTV9JT0NUTF9SWERfRFVNUCAgICAgICAgICAgMHgwNworI2RlZmluZSBaTV9JT0NUTF9NRU1fUkVBRCAgICAgICAgICAgMHgwQgorI2RlZmluZSBaTV9JT0NUTF9NRU1fV1JJVEUgICAgICAgICAgMHgwQworI2RlZmluZSBaTV9JT0NUTF9ETUFfVEVTVCAgICAgICAgICAgMHgxMAorI2RlZmluZSBaTV9JT0NUTF9SRUdfVEVTVCAgICAgICAgICAgMHgxMQorI2RlZmluZSBaTV9JT0NUTF9URVNUICAgICAgICAgICAgICAgMHg4MAorI2RlZmluZSBaTV9JT0NUTF9UQUxMWSAgICAgICAgICAgICAgMHg4MSAvL0NXWWFuZygrKQorI2RlZmluZSBaTV9JT0NUTF9SVFMgICAgICAgICAgICAgICAgMHhBMAorI2RlZmluZSBaTV9JT0NUTF9NSVhfTU9ERSAgICAgICAgICAgMHhBMQorI2RlZmluZSBaTV9JT0NUTF9GUkFHICAgICAgICAgICAgICAgMHhBMgorI2RlZmluZSBaTV9JT0NUTF9TQ0FOICAgICAgICAgICAgICAgMHhBMworI2RlZmluZSBaTV9JT0NUTF9LRVkgICAgICAgICAgICAgICAgMHhBNAorI2RlZmluZSBaTV9JT0NUTF9SQVRFICAgICAgICAgICAgICAgMHhBNQorI2RlZmluZSBaTV9JT0NUTF9FTkNSWVBUSU9OX01PREUgICAgMHhBNgorI2RlZmluZSBaTV9JT0NUTF9HRVRfVFhDTlQgICAgICAgICAgMHhBNworI2RlZmluZSBaTV9JT0NUTF9HRVRfREVBR0dfQ05UICAgICAgMHhBOAorI2RlZmluZSBaTV9JT0NUTF9EVVJBVElPTl9NT0RFICAgICAgMHhBOQorI2RlZmluZSBaTV9JT0NUTF9TRVRfQUVTX0tFWSAgICAgICAgMHhBQQorI2RlZmluZSBaTV9JT0NUTF9TRVRfQUVTX01PREUgICAgICAgMHhBQgorI2RlZmluZSBaTV9JT0NUTF9TSUdOQUxfU1RSRU5HVEggICAgMHhBQyAvL0NXWWFuZygrKQorI2RlZmluZSBaTV9JT0NUTF9TSUdOQUxfUVVBTElUWSAgICAgMHhBRCAvL0NXWWFuZygrKQorI2RlZmluZSBaTV9JT0NUTF9TRVRfUElCU1NfTU9ERSAgICAgMHhBRQorI2RlZmluZQlaREFQSU9DVEwgICAgICAgICAgICAgICAgICAgU0lPQ0RFVlBSSVZBVEUKKworc3RydWN0IHpkYXBfaW9jdGwgeworCXVuc2lnbmVkIHNob3J0IGNtZDsgICAgICAgICAgICAgICAgLyogQ29tbWFuZCB0byBydW4gKi8KKwl1bnNpZ25lZCBpbnQgICBhZGRyOyAgICAgICAgICAgICAgICAvKiBMZW5ndGggb2YgdGhlIGRhdGEgYnVmZmVyICovCisJdW5zaWduZWQgaW50ICAgdmFsdWU7ICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgZGF0YSBidWZmZXIgKi8KKwl1bnNpZ25lZCBjaGFyIGRhdGFbMHgxMDBdOworfTsKKworLyogRGVjbGFyYXRpb24gb2YgbWFjcm8gYW5kIGZ1bmN0aW9uIGZvciBoYW5kbGluZyBXRVAgS2V5cyAqLworCisjaWYgMAorCisjZGVmaW5lIFNLSVBfRUxFTSB7IFwKKyAgICB3aGlsZShpc3hkaWdpdCgqcCkpIFwKKyAgICAgICAgcCsrOyBcCit9CisKKyNkZWZpbmUgU0tJUF9ERUxJTUVURVIgeyBcCisgICAgaWYoKnAgPT0gJzonIHx8ICpwID09ICcgJykgXAorICAgICAgICBwKys7IFwKK30KKworI2VuZGlmCisKK2NoYXIgaGV4KGNoYXIpOwordW5zaWduZWQgY2hhciBhc2N0b2hleChjaGFyICpzdHIpOworCitjaGFyICpwcmduYW1lOworCitpbnQgc2V0X2lvY3RsKGludCBzb2NrLCBzdHJ1Y3QgaWZyZXEgKnJlcSkKK3sKKyAgICBpZiAoaW9jdGwoc29jaywgWkRBUElPQ1RMLCByZXEpIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBpb2N0bChTSU9DR0lGTUFQKTogJXNcbiIsCisgICAgICAgICAgICAgICAgcHJnbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKK2ludCByZWFkX3JlZyhpbnQgc29jaywgc3RydWN0IGlmcmVxICpyZXEpCit7CisgICAgc3RydWN0IHpkYXBfaW9jdGwgKnpkcmVxID0gMDsKKworICAgIGlmICghc2V0X2lvY3RsKHNvY2ssIHJlcSkpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8vemRyZXEgPSAoc3RydWN0IHpkYXBfaW9jdGwgKilyZXEtPmlmcl9kYXRhOworICAgIC8vcHJpbnRmKCAicmVnID0gJTR4LCB2YWx1ZSA9ICU0eFxuIiwgemRyZXEtPmFkZHIsIHpkcmVxLT52YWx1ZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworCitpbnQgcmVhZF9tZW0oaW50IHNvY2ssIHN0cnVjdCBpZnJlcSAqcmVxKQoreworICAgIHN0cnVjdCB6ZGFwX2lvY3RsICp6ZHJlcSA9IDA7CisgICAgaW50IGk7CisKKyAgICBpZiAoIXNldF9pb2N0bChzb2NrLCByZXEpKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvKnpkcmVxID0gKHN0cnVjdCB6ZGFwX2lvY3RsICopcmVxLT5pZnJfZGF0YTsKKyAgICBwcmludGYoICJkdW1wIG1lbSBmcm9tICV4LCBsZW5ndGggPSAleFxuIiwgemRyZXEtPmFkZHIsIHpkcmVxLT52YWx1ZSk7CisKKyAgICBmb3IgKGk9MDsgaTx6ZHJlcS0+dmFsdWU7IGkrKykgeworICAgICAgICBwcmludGYoIiUwMngiLCB6ZHJlcS0+ZGF0YVtpXSk7CisgICAgICAgIHByaW50ZigiICIpOworCisgICAgICAgIGlmICgoaT4wKSAmJiAoKGkrMSklMTYgPT0gMCkpCisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgfSovCisKKyAgICByZXR1cm4gMDsKK30KKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgaW50IHNvY2s7CisgICAgaW50IGFkZHIsIHZhbHVlOworICAgIHN0cnVjdCBpZnJlcSByZXE7CisgICAgY2hhciAqYWN0aW9uID0gTlVMTDsKKyAgICBzdHJ1Y3QgemRhcF9pb2N0bCB6ZHJlcTsKKworICAgIHByZ25hbWUgPSBhcmd2WzBdOworCisgICAgaWYgKGFyZ2MgPCAzKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCIlczogdXNhZ2UgaXMgXCIlcyA8aWZuYW1lPiA8b3BlcmF0aW9uPiBbPGFkZHJlc3M+XSBbPHZhbHVlPl1cIlxuIiwKKyAgICAgICAgICAgICAgICBwcmduYW1lLCBwcmduYW1lKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsInZhbGlkIG9wZXJhdGlvbjogcmVhZCwgd3JpdGUsIG1lbSwgcmVnLFxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCIgICAgICAgICAgICAgICA6IHR4ZCwgcnhkLCBybWVtLCB3bWVtXG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICAgICAgICAgICAgIDogZG1hdCwgcmVndCwgdGVzdFxuIik7CisKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICBzY2FuLCBDaGFubmVsIFNjYW5cbiIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiICAgIHJ0cyA8ZGVjaW1hbD4sIFNldCBSVFMgVGhyZXNob2xkXG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICBmcmFnIDxkZWNpbWFsPiwgU2V0IEZyYWdtZW50IFRocmVzaG9sZFxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCIgICAgcmF0ZSA8MC0yOD4sIDA6QVVUTywgMS00OkNDSywgNS0xMjpPRkRNLCAxMy0yODpIVFxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCIgICAgVEJEIG1peCA8MCBvciAxPiwgU2V0IDEgdG8gZW5hYmxlIG1peGVkIG1vZGVcbiIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiICAgIGVuYywgPDAtMz4sIDA9Pk9QRU4sIDE9PldFUDY0LCAyPT5XRVAxMjgsIDM9PldFUDI1NlxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCIgICAgc2tleSA8a2V5PiwgU2V0IFdFUCBrZXlcbiIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiICAgIHR4Y250LCBHZXQgVHhRIENudFxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCIgICAgZGFnY250LCBHZXQgRGVhZ2dyZWdhdGUgQ250XG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICBkdXJtb2RlIDxtb2RlPiwgU2V0IER1cmF0aW9uIE1vZGUgMD0+SFcsIDE9PlNXXG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICBhZXNrZXkgPHVzZXI+IDxrZXk+XG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICBhZXNtb2RlIDxtb2RlPlxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCIgICAgd2xhbm1vZGUgPDAsMT4gMDpTdGF0aW9uIG1vZGUsIDE6UElCU1MgbW9kZVxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCIgICAgdGFsIDwwLDE+LCBHZXQgQ3VycmVudCBUYWxseSBJbmZvLCAwPT5yZWFkLCAxPT5yZWFkIGFuZCByZXNldFxuIik7CisKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICBzdHJjcHkocmVxLmlmcl9uYW1lLCBhcmd2WzFdKTsKKyAgICB6ZHJlcS5hZGRyID0gMDsKKyAgICB6ZHJlcS52YWx1ZSA9IDA7CisKKyAgICAvKiBhIHNpbGx5IHJhdyBzb2NrZXQganVzdCBmb3IgaW9jdGwoKWxpbmcgaXQgKi8KKyAgICBzb2NrID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfUkFXLCBJUFBST1RPX1JBVyk7CisgICAgaWYgKHNvY2sgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHNvY2tldCgpOiAlc1xuIiwgYXJndlswXSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICBpZiAoYXJnYyA+PSA0KQorICAgIHsKKyAgICAgICAgc3NjYW5mKGFyZ3ZbM10sICIleCIsICZhZGRyKTsKKyAgICB9CisKKyAgICBpZiAoYXJnYyA+PSA1KQorICAgIHsKKyAgICAgICAgc3NjYW5mKGFyZ3ZbNF0sICIleCIsICZ2YWx1ZSk7CisgICAgfQorCisgICAgemRyZXEuYWRkciA9IGFkZHI7CisgICAgemRyZXEudmFsdWUgPSB2YWx1ZTsKKworICAgIGlmICghc3RyY21wKGFyZ3ZbMl0sICJyZWFkIikpCisgICAgeworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9SRUdfUkVBRDsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAibWVtIikpCisgICAgeworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9NRU1fRFVNUDsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAid3JpdGUiKSkKKyAgICB7CisgICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1JFR19XUklURTsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAicmVnIikpCisgICAgeworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9SRUdfRFVNUDsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAidHhkIikpCisgICAgeworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9UWERfRFVNUDsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAicnhkIikpCisgICAgeworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9SWERfRFVNUDsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAicm1lbSIpKQorICAgIHsKKyAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfTUVNX1JFQUQ7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgIndtZW0iKSkKKyAgICB7CisgICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX01FTV9XUklURTsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAiZG1hdCIpKQorICAgIHsKKyAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfRE1BX1RFU1Q7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgInJlZ3QiKSkKKyAgICB7CisgICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1JFR19URVNUOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJ0ZXN0IikpCisgICAgeworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9URVNUOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJ0YWwiKSkKKyAgICB7CisgICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7CisgICAgICAgIHpkcmVxLmFkZHIgPSBhZGRyOworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9UQUxMWTsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAicnRzIikpCisgICAgeworICAgICAgICBzc2NhbmYoYXJndlszXSwgIiVkIiwgJmFkZHIpOworICAgICAgICB6ZHJlcS5hZGRyID0gYWRkcjsKKyAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfUlRTOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJtaXgiKSkKKyAgICB7CisgICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX01JWF9NT0RFOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJmcmFnIikpCisgICAgeworICAgICAgICBzc2NhbmYoYXJndlszXSwgIiVkIiwgJmFkZHIpOworICAgICAgICB6ZHJlcS5hZGRyID0gYWRkcjsKKyAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfRlJBRzsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAic2NhbiIpKQorICAgIHsKKyAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfU0NBTjsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAic2tleSIpKQorICAgIHsKKyAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfS0VZOworCisgICAgICAgIGlmIChhcmdjID49IDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgdGVtcFsyOV07CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGludCBrZXlMZW47CisgICAgICAgICAgICBpbnQgZW5jVHlwZTsKKworICAgICAgICAgICAga2V5TGVuID0gc3RybGVuKGFyZ3ZbM10pOworCisgICAgICAgICAgICBpZiAoa2V5TGVuID09IDEwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJTAyeCUwMnglMDJ4JTAyeCUwMngiLCAmdGVtcFswXSwgJnRlbXBbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcFsyXSwgJnRlbXBbM10sICZ0ZW1wWzRdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGtleUxlbiA9PSAyNikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzc2NhbmYoYXJndlszXSwgIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBbMF0sICZ0ZW1wWzFdLCAmdGVtcFsyXSwgJnRlbXBbM10sICZ0ZW1wWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBbNV0sICZ0ZW1wWzZdLCAmdGVtcFs3XSwgJnRlbXBbOF0sICZ0ZW1wWzldLAorICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wWzEwXSwgJnRlbXBbMTFdLCAmdGVtcFsxMl0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoa2V5TGVuID09IDU4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBbMF0sICZ0ZW1wWzFdLCAmdGVtcFsyXSwgJnRlbXBbM10sICZ0ZW1wWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBbNV0sICZ0ZW1wWzZdLCAmdGVtcFs3XSwgJnRlbXBbOF0sICZ0ZW1wWzldLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBbMTBdLCAmdGVtcFsxMV0sICZ0ZW1wWzEyXSwgJnRlbXBbMTNdLCAmdGVtcFsxNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcFsxNV0sICZ0ZW1wWzE2XSwgJnRlbXBbMTddLCAmdGVtcFsxOF0sICZ0ZW1wWzE5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wWzIwXSwgJnRlbXBbMjFdLCAmdGVtcFsyMl0sICZ0ZW1wWzIzXSwgJnRlbXBbMjRdLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBbMjVdLCAmdGVtcFsyNl0sICZ0ZW1wWzI3XSwgJnRlbXBbMjhdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQga2V5IGxlbmd0aFxuIik7CisgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHpkcmVxLmFkZHIgPSBrZXlMZW4vMjsKKworICAgICAgICAgICAgZm9yKGk9MDsgaTx6ZHJlcS5hZGRyOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemRyZXEuZGF0YVtpXSA9IHRlbXBbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGYoIkVycm9yIDogS2V5IHJlcXVpcmVkIVxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAicmF0ZSIpKQorICAgIHsKKyAgICAgICAgc3NjYW5mKGFyZ3ZbM10sICIlZCIsICZhZGRyKTsKKworICAgICAgICBpZiAoYWRkciA+IDI4KQorICAgICAgICB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgcmF0ZSwgcmFuZ2U6MH4yOFxuIik7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgICAgIHpkcmVxLmFkZHIgPSBhZGRyOworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9SQVRFOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJlbmMiKSkKKyAgICB7CisgICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7CisKKyAgICAgICAgaWYgKGFkZHIgPiAzKQorICAgICAgICB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgZW5jcnlwdGlvbiBtb2RlLCByYW5nZTowfjNcbiIpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhZGRyID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFkZHIgPSA1OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGFkZHIgPT0gMykKKyAgICAgICAgeworICAgICAgICAgICAgYWRkciA9IDY7CisgICAgICAgIH0KKworICAgICAgICB6ZHJlcS5hZGRyID0gYWRkcjsKKyAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfRU5DUllQVElPTl9NT0RFOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJ0eGNudCIpKQorICAgIHsKKyAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfR0VUX1RYQ05UOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJkYWdjbnQiKSkKKyAgICB7CisgICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7CisKKyAgICAgICAgaWYgKGFkZHIgIT0gMCAmJiBhZGRyICE9IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVGhlIHZhbHVlIHNob3VsZCBiZSAwIG9yIDFcbiIpOworICAgICAgICAgICAgZXhpdCgwKTsKKyAgICAgICAgfQorCisgICAgICAgIHpkcmVxLmFkZHIgPSBhZGRyOworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9HRVRfREVBR0dfQ05UOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJkdXJtb2RlIikpCisgICAgeworICAgICAgICBzc2NhbmYoYXJndlszXSwgIiVkIiwgJmFkZHIpOworCisgICAgICAgIGlmIChhZGRyICE9IDAgJiYgYWRkciAhPSAxKQorICAgICAgICB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlRoZSBEdXJhdGlvbiBtb2RlIHNob3VsZCBiZSAwIG9yIDFcbiIpOworICAgICAgICAgICAgZXhpdCgwKTsKKyAgICAgICAgfQorCisgICAgICAgIHpkcmVxLmFkZHIgPSBhZGRyOworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9EVVJBVElPTl9NT0RFOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJhZXNrZXkiKSkKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgdGVtcFsxNl07CisgICAgICAgIGludCBpOworCisgICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7CisKKyAgICAgICAgc3NjYW5mKGFyZ3ZbNF0sICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IiwgJnRlbXBbMF0sICZ0ZW1wWzFdLCAmdGVtcFsyXSwgJnRlbXBbM10sICZ0ZW1wWzRdLCAmdGVtcFs1XSwgJnRlbXBbNl0sICZ0ZW1wWzddLCAmdGVtcFs4XSwgJnRlbXBbOV0sICZ0ZW1wWzEwXSwgJnRlbXBbMTFdLCAmdGVtcFsxMl0sICZ0ZW1wWzEzXSwgJnRlbXBbMTRdLCAmdGVtcFsxNV0pOworCisgICAgICAgIGZvcihpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHpkcmVxLmRhdGFbaV0gPSB0ZW1wW2ldOworICAgICAgICB9CisKKyAgICAgICAgemRyZXEuYWRkciA9IGFkZHI7CisgICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1NFVF9BRVNfS0VZOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJhZXNtb2RlIikpCisgICAgeworICAgICAgICBzc2NhbmYoYXJndlszXSwgIiVkIiwgJmFkZHIpOworCisgICAgICAgIHpkcmVxLmFkZHIgPSBhZGRyOworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9TRVRfQUVTX01PREU7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgIndsYW5tb2RlIikpCisgICAgeworICAgICAgICBzc2NhbmYoYXJndlszXSwgIiVkIiwgJmFkZHIpOworCisgICAgICAgIHpkcmVxLmFkZHIgPSBhZGRyOworICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9TRVRfUElCU1NfTU9ERTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwkgICAgZnByaW50ZihzdGRlcnIsICJlcnJvciBhY3Rpb25cbiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIHJlcS5pZnJfZGF0YSA9IChjaGFyICopJnpkcmVxOworICAgIHNldF9pb2N0bChzb2NrLCAmcmVxKTsKKworZmFpbDoKKyAgICBleGl0KDApOworfQorCit1bnNpZ25lZCBjaGFyIGFzY3RvaGV4KGNoYXIgKnN0cikKK3sKKyAgICB1bnNpZ25lZCBjaGFyIHZhbHVlOworCisgICAgdmFsdWUgPSBoZXgoKnN0cikgJiAweDBmOworICAgIHZhbHVlID0gdmFsdWUgPDwgNDsKKyAgICBzdHIrKzsKKyAgICB2YWx1ZSB8PSBoZXgoKnN0cikgJiAweDBmOworCisgICAgcmV0dXJuIHZhbHVlOworfQorCitjaGFyIGhleChjaGFyIHYpCit7CisgICAgaWYoaXNkaWdpdCh2KSkKKyAgICAgICAgcmV0dXJuIHYgLSAnMCc7CisgICAgZWxzZSBpZihpc3hkaWdpdCh2KSkKKyAgICAgICAgcmV0dXJuICh0b2xvd2VyKHYpIC0gJ2EnICsgMTApOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2F0aHJfY29tbW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9hdGhyX2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMGY3OGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9hdGhyX2NvbW1vbi5oCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICBNb2R1bGUgTmFtZSA6IGF0aHJfY29tbW9uLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgV1BBIHJlbGF0ZWQgZnVuY3Rpb24gYW5kIGRhdGEgc3RydWN0dXJlIGRlZmluaXRpb25zLiAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgUGxhdGZvcm0gZGVwZW5kZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfQVRIUl9DT01NT05fSAorI2RlZmluZSBfQVRIUl9DT01NT05fSAorCisjZGVmaW5lIFpEX0lPQ1RMX1dQQQkJCShTSU9DREVWUFJJVkFURSArIDEpCisjZGVmaW5lIFpEX0lPQ1RMX1BBUkFNCQkJKFNJT0NERVZQUklWQVRFICsgMikKKyNkZWZpbmUgWkRfSU9DVExfR0VUV1BBSUUJCShTSU9DREVWUFJJVkFURSArIDMpCisjZGVmaW5lIFpEX1BBUkFNX1JPQU1JTkcJCTB4MDAwMQorI2RlZmluZSBaRF9QQVJBTV9QUklWQUNZCQkweDAwMDIKKyNkZWZpbmUgWkRfUEFSQU1fV1BBCQkJMHgwMDAzCisjZGVmaW5lIFpEX1BBUkFNX0NPVU5URVJNRUFTVVJFUwkweDAwMDQKKyNkZWZpbmUgWkRfUEFSQU1fRFJPUFVORU5DUllQVEVECTB4MDAwNQorI2RlZmluZSBaRF9QQVJBTV9BVVRIX0FMR1MJCTB4MDAwNgorCisjZGVmaW5lIFpEX0NNRF9TRVRfRU5DUllQVF9LRVkJCTB4MDAwMQorI2RlZmluZSBaRF9DTURfU0VUX01MTUUJCQkweDAwMDIKKyNkZWZpbmUgWkRfQ01EX1NDQU5fUkVRCQkJMHgwMDAzCisjZGVmaW5lIFpEX0NNRF9TRVRfR0VORVJJQ19FTEVNRU5UCTB4MDAwNAorI2RlZmluZSBaRF9DTURfR0VUX1RTQwkJCTB4MDAwNQorCisjZGVmaW5lIFpEX0ZMQUdfU0VUX1RYX0tFWSAgICAgICAgICAgICAgMHgwMDAxCisKKyNkZWZpbmUgWkRfR0VORVJJQ19FTEVNRU5UX0hEUl9MRU4gXAorKChpbnQpICgmKChzdHJ1Y3QgYXRocl93bGFuX3BhcmFtICopIDApLT51LmdlbmVyaWNfZWxlbS5kYXRhKSkKKworI2RlZmluZSBaRF9DUllQVF9BTEdfTkFNRV9MRU4JCTE2CisjZGVmaW5lIFpEX01BWF9LRVlfU0laRQkJCTMyCisjZGVmaW5lIFpEX01BWF9HRU5FUklDX1NJWkUJCTY0CisKKyNkZWZpbmUgSUVFRTgwMjExX0FERFJfTEVOCQk2CisjZGVmaW5lIElFRUU4MDIxMV9NQVhfSUVfU0laRQkJMjU2CisKKyNpZmRlZiBaTV9FTkFMQkVfV0FQSQorI2RlZmluZSBaTV9DTURfV0FQSV9TRVRXQVBJICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBaTV9DTURfV0FQSV9HRVRXQVBJICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBaTV9DTURfV0FQSV9TRVRLRVkgICAgICAgICAgICAgIDB4MDAwMworI2RlZmluZSBaTV9DTURfV0FQSV9HRVRLRVkgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBaTV9DTURfV0FQSV9SRUtFWSAgICAgICAgICAgICAgIDB4MDAwNQorCisjZGVmaW5lIFpNX1dBUElfV0FJX1JFUVVFU1QgICAgICAgICAgICAgMHgwMGYxCisjZGVmaW5lIFpNX1dBUElfVU5JQ0FTVF9SRUtFWSAgICAgICAgICAgMHgwMGYyCisjZGVmaW5lIFpNX1dBUElfU1RBX0FHSU5HICAgICAgICAgICAgICAgMHgwMGYzCisjZGVmaW5lIFpNX1dBUElfTVVMVElfUkVLRVkgICAgICAgICAgICAgMHgwMGY0CisKKyNkZWZpbmUgWk1fV0FQSV9LRVlfU0laRSAgICAgICAgICAgICAgICAzMgorI2RlZmluZSBaTV9XQVBJX0lWX0xFTiAgICAgICAgICAgICAgICAgIDE2CisjZW5kaWYgLy9aTV9FTkFMQkVfV0FQSQorLyogc3RydWN0dXJlIGRlZmluaXRpb24gKi8KKworc3RydWN0IGF0aHJfd2xhbl9wYXJhbSB7CisJdTMyIGNtZDsKKwl1OCBzdGFfYWRkcltFVEhfQUxFTl07CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdTggYWxnW1pEX0NSWVBUX0FMR19OQU1FX0xFTl07CisJCQl1MzIgZmxhZ3M7CisJCQl1MzIgZXJyOworCQkJdTggaWR4OworCQkJdTggc2VxWzhdOyAvKiBzZXF1ZW5jZSBjb3VudGVyIChzZXQ6IFJYLCBnZXQ6IFRYKSAqLworCQkJdTE2IGtleV9sZW47CisJCQl1OCBrZXlbWkRfTUFYX0tFWV9TSVpFXTsKKwkJfSBjcnlwdDsKKwkJc3RydWN0IHsKKwkJCXUzMiBmbGFnc19hbmQ7CisJCQl1MzIgZmxhZ3Nfb3I7CisJCX0gc2V0X2ZsYWdzX3N0YTsKKwkJc3RydWN0IHsKKwkJCXU4IGxlbjsKKwkJCXU4IGRhdGFbWkRfTUFYX0dFTkVSSUNfU0laRV07CisJCX0gZ2VuZXJpY19lbGVtOworCQlzdHJ1Y3QgeworI2RlZmluZSBNTE1FX1NUQV9ERUFVVEggMAorI2RlZmluZSBNTE1FX1NUQV9ESVNBU1NPQyAxCisJCQl1MTYgY21kOworCQkJdTE2IHJlYXNvbl9jb2RlOworCQl9IG1sbWU7CisJCXN0cnVjdCB7CisJCQl1OCBzc2lkX2xlbjsKKwkJCXU4IHNzaWRbMzJdOworCQl9IHNjYW5fcmVxOworCX0gdTsKK307CisKK3N0cnVjdCBpZWVlODAyMTFyZXFfd3BhaWUgeworCXU4IHdwYV9tYWNhZGRyW0lFRUU4MDIxMV9BRERSX0xFTl07CisJdTggd3BhX2llW0lFRUU4MDIxMV9NQVhfSUVfU0laRV07Cit9OworCisjaWZkZWYgWk1fRU5BTEJFX1dBUEkKK3N0cnVjdCBhdGhyX3dhcGlfcGFyYW0geworCXUxNiBjbWQ7CisJdTE2IGxlbjsKKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXU4IHN0YV9hZGRyW0VUSF9BTEVOXTsKKwkJCXU4IHJlc2VydmVkOworCQkJdTgga2V5aWQ7CisJCQl1OCBrZXlbWk1fV0FQSV9LRVlfU0laRV07CisJCX0gY3J5cHQ7CisJCXN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICB1OCB3YXBpX3BvbGljeTsKKwkJfSBpbmZvOworCX0gdTsKK307CisKK3N0cnVjdCBhdGhyX3dhcGlfc3RhX2luZm8KK3sKKwl1MTYJbXNnX3R5cGU7CisJdTE2CWRhdGFsZW47CisgICAgCXU4CXN0YV9tYWNbRVRIX0FMRU5dOworCXU4CXJlc2VydmVfZGF0YVsyXTsKKyAgICAJdTgJZ3NuW1pNX1dBUElfSVZfTEVOXTsKKwl1OAl3aWVbMjU2XTsKK307CisjZW5kaWYgLy9aTV9FTkFMQkVfV0FQSQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBES2Z3dS5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwREtmd3UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDRjNjJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwREtmd3UuYwpAQCAtMCwwICsxLDgzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSAiLi4vODAyMTFjb3JlL2NwcmVjb21wLmgiCisKK2NvbnN0IHUzMl90IHpjREtGd0ltYWdlW10gPSB7CisweDAwMDkwMDBCLCAweDRGMjIyRkU2LCAweERFM0U3RkZDLCAweEUxMTRENzNFLAorMHgxRTEzRDQzRSwgMHgxRTRDNDcwQiwgMHgwMDA5QjAxNywgMHg5NTZFRTYwMCwKKzB4Qzg0MDYwRTIsIDB4MkYwMjhGMDMsIDB4OEZGOTM2NTIsIDB4RDQzODc2MDEsCisweDRFMEJERTM4LCAweEQ0MzgwMDA5LCAweDAwMDk0RTBCLCAweDRFMEJENDM3LAorMHg3RjA0MDAwOSwgMHhBMDM2NEYyNiwgMHg0RjIyNkVGNiwgMHg0MTBCRDEzNCwKKzB4RDQzNDAwMDksIDB4MDAwOTQ0MEIsIDB4NDUwQkQ1MzMsIDB4RDczMzAwMDksCisweEQyMzNFMUZGLCAweDI3MTI2MTFELCAweEQ0MzI1MDI5LCAweEUxRkZDQjAxLAorMHgxMjA5RTUwMSwgMHgxMjExMjIxMiwgMHhENTJGMjQ1MiwgMHhEMjJGOTc0MCwKKzB4RTcwMDI1NzIsIDB4RDQyRkQxMkUsIDB4MjI3MEQ2MkYsIDB4MjE3MkUyMDEsCisweDI2MjAyNDIwLCAweEU0RkZENjJELCAweEU2MDAyNjQxLCAweEUxMDRENTJDLAorMHg2MDYzNjY2RCwgMHg2MjZENzYwMSwgMHgzMjEyNDAwMCwgMHgwNTQ1OEZGOCwKKzB4MDAwQjRGMjYsIDB4RUFDODAwMDksIDB4REIyNjZBQUMsIDB4REQyN0RDMjYsCisweEQ4MjhERTI3LCAweDRDMEJFOTAxLCAweDREMEIwMDA5LCAweDRFMEIwMDA5LAorMHg2MEIyMDAwOSwgMHg4OTA3ODgwMSwgMHg2MjQyRDQyMywgMHg4OTAzMzJBNiwKKzB4NjA1MEQ1MjIsIDB4OEJFRTg4MDEsIDB4MkI5MkQ0MUYsIDB4MjY2ODY2NDIsCisweDQ4MEI4OUU5LCAweEQ1MUQwMDA5LCAweEFGRTRFMjAwLCAweDI3MTAyNTIwLAorMHgwMDAwMEZBMCwgMHgwMDFDMDAxQywgMHgwMDIwMEVENCwgMHgwMDAwQjM4RSwKKzB4MDAyMDJGOTAsIDB4MDAyMDEzNTYsIDB4MDAyMDJGOUMsIDB4MDAyMDJGQjQsCisweDAwMjAxMzE0LCAweDAwMjAxNDEyLCAweDAwMjAwRUY4LCAweDAwMUMzNTEwLAorMHgwMDFDMzYyNCwgMHgwMDFFMjEyQywgMHgwMDIwMkYwMCwgMHgwMDIwMkE5QywKKzB4MDAyMDJGMDgsIDB4MDAyMDJGMTQsIDB4MDAyMDJGMjAsIDB4MDAyMDJGMjIsCisweDAwMjAyRjI2LCAweDAwMUMxMDI4LCAweDAwMjAxMjIwLCAweDAwMjAyOTRDLAorMHgwMDIwMUQxMCwgMHgwMDIwMUVDOCwgMHgwMDIwMzIyMCwgMHgwMDIwMkYyNCwKKzB4MkZCNjJGOTYsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4REU5NDdGODAsCisweDYxRTBFMDI0LCAweDBGMTRENDkzLCAweDcxMDE2MUUzLCAweEQ3OTI2MjEwLAorMHg0NzBCRTAyOCwgMHhENTkxMEYyNCwgMHgwMDA5NDUwQiwgMHg2RDAzMjAwOCwKKzB4MUYwQjhGMTEsIDB4RDQ4RkRDOEUsIDB4REQ4RjY3QzAsIDB4NjU3QzREMEIsCisweEREOEZEMThFLCAweDZCOUM2OTEwLCAweDQyMDg2MkIzLCAweDMyQjg0MjA4LAorMHgzRDJDNDIwOCwgMHhFMDI4MUZEQiwgMHhFNTgwMDRGQywgMHg2MDRDNjZFMiwKKzB4MzA1MDY1NUMsIDB4MkQ2MjhGMTMsIDB4MDFGQ0UwMjQsIDB4NjQxQ0U1MDAsCisweDYyNURERTg0LCAweDhCMDEzMjQzLCAweDAwMDlBMzlFLCAweDY3NTM2NTVELAorMHg2MDcwMzdFQywgMHgzOURDNjk1MywgMHhBRkYyNzUwMSwgMHgyMDA4ODA5NCwKKzB4RTAyNDhCMTMsIDB4RTUwMDAxRkMsIDB4QTAwOURFN0EsIDB4NjU1RDY0MUMsCisweDMyRUM2MjUzLCAweDZDNTM2QjIyLCAweDNDREM2N0IyLCAweDc1MDQxQzcxLAorMHgzMjQzNjI1RCwgMHhBMzdGOEJGMywgMHg4ODAxMkQxMCwgMHhFMDI0OEIxNiwKKzB4RTQwMDAxRkMsIDB4NjcxQzJENDAsIDB4NjI0RERFNkUsIDB4OEIwMTMyNzMsCisweDAwMDlBMzcyLCAweDZDRTM2NDRELCAweDdDMDQ2OTQzLCAweDM5RUM2QjQzLAorMHg2NTkyM0JDQywgMHg3NDA4NkRCMiwgMHgyNUQyQUZFRiwgMHg4QjE5ODgwNCwKKzB4MDFGQ0UwMjQsIDB4MkQ3MEU3MDAsIDB4MUZEODZEMUMsIDB4NjI3RERFNjEsCisweDhCMDEzMkQzLCAweDAwMDlBMzU4LCAweDZCNzM2NzdELCAweDNCRUM2MUUzLAorMHg3MTA0NjRCMiwgMHgzQzFDNkM3MywgMHg2OTQyNjVDMiwgMHgyOTU5NzcwOCwKKzB4MjQ5MkFGRUQsIDB4OEIxODg4MDUsIDB4MDFGQ0UwMjQsIDB4MkQ0MEU0MDAsCisweERFNTQ2NzFDLCAweDMyNzM2MjRELCAweEEzM0Q4QjAxLCAweDY0NEQwMDA5LAorMHg2QkUzNkQ0MywgMHg2NUQyM0RFQywgMHg2MTQzN0IwNCwgMHg2QzEyMzFCQywKKzB4NzQwODY5NTIsIDB4QUZFRDI5Q0IsIDB4ODgzMTI1OTIsIDB4REU0QThCMjAsCisweDY1RTZEQjRBLCAweDYxRTZEQzRBLCAweDY3RTJEOTRBLCAweDYyRTI3RTA0LAorMHgxRkVDN0VFOCwgMHg3RTA0NjRFMiwgMHg2RUUyMUZFRCwgMHg1QkZEMkJFMCwKKzB4NjBCMjdCMDQsIDB4QzkwMTFGQkUsIDB4NkJCMjJDMDAsIDB4MjlCMDRCMDksCisweERDNDEyRjI2LCAweDY2MTM0QzBCLCAweEUyMDA3RjA0LCAweDJEMjBBMzBDLAorMHg4QjIxODgzMCwgMHhEOTM5REUzOCwgMHhFMDY0NjVFNiwgMHg3MjA0NjJFMywKKzB4NjcyNjY2RTIsIDB4NkUyM0RDMzYsIDB4NjIyMjdFRTgsIDB4NkJFMjYxRTYsCisweDI5QjAxRkVGLCAweDdFMDQwRjE2LCAweEM5MDE2MEUyLCAweDZFRTIyQzAwLAorMHg0RTA5REMzMCwgMHgyRjI2MkNFMCwgMHhEMTMwRTA2OCwgMHgwNEZFNDEwQiwKKzB4RTIwMDdGMDQsIDB4MkQyMEEyRTgsIDB4OEIwNTg4MzMsIDB4NEUwQkRFMkMsCisweEUxMDAwMDA5LCAweDJEMTBBMkUwLCAweDg5MDE4ODI4LCAweDAwMDlBMTA2LAorMHhFMTQzREUyMCwgMHhFMDQwNjJFMSwgMHgzMjE3NjIyRCwgMHgwRkU2OEYwNCwKKzB4NjAyM0UyNDAsIDB4MjYyMTA2RkUsIDB4OEIwMTMyMTcsIDB4MDAwOUEwRUYsCisweDAyRkVFMDQwLCAweDg1MjFFNDAxLCAweDhCMDEzMDQ2LCAweDAwMDlBMEU3LAorMHhFNTAxRTA0MCwgMHgyRDUwMDdGRSwgMHg2NDcxQjJDNywgMHgwOUZFRTA0MCwKKzB4NjI5MUUxNDMsIDB4NjUyREUwNjgsIDB4OEQ2QjM1MTcsIDB4RTY0MDBGNTYsCisweDhCMjczNTYzLCAweEUwNDhFNjAwLCAweEUxMUEwRjY1LCAweDcyQzBBMDMxLAorMHgwMDExNzgwMCwgMHgwMDIwMkZCOCwgMHgwMDIwMTM1NiwgMHgwMDIwMjQ4MCwKKzB4MDAyMDJGMUEsIDB4MDAyMDJGQkMsIDB4MDAyMDEzQTIsIDB4MDAyMDJGMTksCisweDAwMjAyQjQwLCAweDAwMTE3ODA0LCAweDAwMTE3ODEwLCAweDAwMjAyRjE1LAorMHgwMDIwMkYxNiwgMHgwMDIwMkYxNywgMHgwMDIwMEI4NCwgMHgwMDIwMEJEOCwKKzB4MDAyMDBCRDQsIDB4NDEyMTYxNTMsIDB4NDEyMTQxMjEsIDB4NDEyMTQxMjEsCisweDQ1MjE0NTIxLCAweDYwNTM0NTIxLCAweDY2MDNDOTAzLCAweDBGNjVFMDQ4LAorMHhFMDA3NzExOCwgMHhFMDQ0MjIwOSwgMHg2NDFEMEYyNSwgMHg2NUYzRTA0QywKKzB4MEY0NkIzMTQsIDB4MDRGREUwNDgsIDB4MEJGREUwNDQsIDB4NjFCRDY3NEQsCisweDQxMDg0NzA4LCAweDBGMTZFMDUwLCAweEQyOTM2MDczLCAweDQyMEIwOUZFLAorMHg2QzA3RTAwRiwgMHg2MDczMjlDOSwgMHhFMDQwMEY5NiwgMHg2NUYzMEVGRSwKKzB4NkQwRDg1RTIsIDB4MDFGRUUwNTAsIDB4NjBEMzQyMEIsIDB4NjA3MzI5MEIsCisweEUwNEMwRjk2LCAweDA0RkVCMkQ5LCAweDA2RkVFMDQwLCAweDYyNjFFMDY4LAorMHgwRjU2NjUyRCwgMHgzNTYzRTY0MCwgMHhFMDAwODk0RSwgMHg2MDIzODFGOCwKKzB4NDAwOEM5MDMsIDB4NkIwMzQwMDAsIDB4RTA1NDYxMDMsIDB4RTA1ODBGQjYsCisweEVDRkZERDdELCAweDZDQ0MwRkY2LCAweDBGRDZFMDZDLCAweDREMEI2MEMzLAorMHg0MjIxNjI1MywgMHg0MjIxNDIyMSwgMHg2NDIzNDIyMSwgMHgzMjRDNDIwMCwKKzB4RTA1QzZFMDcsIDB4NDUyMTQyMDAsIDB4RTA0MDBGRTYsIDB4MEJGRTQ1MjEsCisweEM5MDM2MDUzLCAweDMwRkM0MDA4LCAweDZEMDM3QjA2LCAweDg1RjgxRjA1LAorMHg2QzJEMUZCNywgMHgxRkM2NkUwMywgMHgwRkM2RTA2MCwgMHgwNUZFRTA1OCwKKzB4NjRDM0IyQjQsIDB4MzNGQ0UzNTQsIDB4NTYzMjYyRDIsIDB4MjI2OTYxMzIsCisweDY3QjQyRDIyLCAweDQ5MEI1OTM2LCAweDIyMEI2MDdDLCAweDA1RkVFMDU4LAorMHg2NEMzMkQyMiwgMHg3RTAxQjI4OSwgMHhFNzA2NjJFRCwgMHg4RkUzMzI3MywKKzB4RTA0MDdDMDEsIDB4NjI2MTA2RkUsIDB4MDZGRUUwNDAsIDB4ODU2MTQyMDAsCisweDMwMkM3NjBDLCAweDYxMDM3MDFCLCAweDY0RjNFNTAwLCAweDc1MDFFNzA0LAorMHg2QjVENjk2NiwgMHgyNDkyM0I3MywgMHg3NDA0OEZGOSwgMHhCMjZDNjVGMywKKzB4RTA0MDY0MUQsIDB4QjIwNTA2RkUsIDB4QTFERDY0NjEsIDB4RDQ0RjAwMDksCisweEUyMDFENzRGLCAweDJEMjA0NzBCLCAweDAwMDlBMUQ2LCAweDhCMDc4ODI5LAorMHhFQzAwREU0QywgMHg2MUUyMkRDMCwgMHg2NDFEQjFENywgMHgwMDA5QTFDQywKKzB4NjIyQ0UyODEsIDB4OEIwMTMwMjAsIDB4MDAwOUExMTgsIDB4MDZGQ0UwMjgsCisweEU2ODI2MjZDLCAweDMyNjA2NjZDLCAweEEwRUU4QjAxLCAweEU2ODMwMDA5LAorMHgzMjYwNjY2QywgMHhBMERDOEIwMSwgMHhFNjkwMDAwOSwgMHgzMjYwNjY2QywKKzB4QTBEMDhCMDEsIDB4RTY5MTAwMDksIDB4MzI2MDY2NkMsIDB4QTBCOThCMDEsCisweEU2QjAwMDA5LCAweDMyNjA2NjZDLCAweEEwN0Y4QjAxLCAweEU2QkIwMDA5LAorMHgzMjYwNjY2QywgMHhFNjkyODkyMCwgMHgzMjYwNjY2QywgMHhFNDAwOEIxNCwKKzB4RUIwNEQ1MzEsIDB4NTI1MTY2NTIsIDB4OEIwNzM2MjAsIDB4NjI0RDc0MDEsCisweDhGRjczMkI3LCAweEU2MDA3NTA4LCAweDUyRkJBMDAyLCAweEU2MDE1MkZCLAorMHhFNjA0MTI2MSwgMHgyMjYwQTE4OCwgMHhEMjI5RDQyOCwgMHhENDI5NjU0MiwKKzB4MDAwOTQyMEIsIDB4MDAwOUExODAsIDB4RTEwMEU2NzAsIDB4NjAxMzM2RkMsCisweEUwMjQ4MTYyLCAweDBCRkNEMjFGLCAweDZCQkM2NzIyLCAweDI2NzI3QkZDLAorMHhFQjA0MTZCMiwgMHgwNkZFRTA3OCwgMHgzMjYzNjIxRCwgMHhBMTZCOEIwMSwKKzB4REUxRDAwMDksIDB4MzFFQzYxMUQsIDB4RDQxQzZFMTIsIDB4NDEwQkQxMTQsCisweEUwNzAwMDA5LCAweDQ1MEJENTFBLCAweEQ0MUEwNEZFLCAweDQyMEJEMjEwLAorMHhEMjE3MDAwOSwgMHg2NEUzNDIwQiwgMHhENjBERDQxNywgMHgwMDA5NDYwQiwKKzB4MDVGRUUwNzAsIDB4MDFGREUwNzQsIDB4NjExREU2MDAsIDB4NjI1MzM1MUMsCisweDMyNkM2NjZELCAweDIyRTA3NjAxLCAweDMyQjM2MjZELCAweDRFMTk4RkY3LAorMHhFMDc0NzEwNCwgMHgwRjE1QUZDRSwgMHgwMDIwMjlGOCwgMHgwMDIwMkZEQywKKzB4MDAyMDEzNTYsIDB4MDAxMTc4MDQsIDB4MDAyMDJCMTAsIDB4MDAxMTc4MDAsCisweDAwMjAxM0EyLCAweDAwMjAzMDE0LCAweDAwMTE3ODA4LCAweDAwMjAyRkY0LAorMHgwMDIwMTM5QSwgMHgwMDIwMzAwOCwgMHgwMDIwMzAxMCwgMHgwMkZDRTAyNCwKKzB4NjcyQ0UwN0MsIDB4RUMwMDBGNzYsIDB4RTA3Q0VCMDQsIDB4NjJDRDA3RkUsCisweDhCMDEzMjczLCAweDAwMDlBMTE4LCAweDZDQ0REN0I5LCAweDM1N0M2NUMzLAorMHg2MkMzNzcwNCwgMHhENEI3MzI3QywgMHg2RDUyRDdCNywgMHg2RTIyNDcwQiwKKzB4NDcwQkQ3QjYsIDB4RDRCNjY0RDMsIDB4NDIwQkQyQjMsIDB4RDJCMzAwMDksCisweDY0RTM0MjBCLCAweEQ2QjBENEIzLCAweDAwMDk0NjBCLCAweDY3RDNFNjAwLAorMHgzNzZDNjY2RCwgMHg2MjZENzYwMSwgMHgyN0UwMzJCMywgMHg0RTE5OEZGNywKKzB4N0MwOEFGRDMsIDB4NjIxMkQxQTYsIDB4MjIyODYyMkMsIDB4RDJBQThCMDQsCisweDAwMDk0MjBCLCAweDAwMDlBMDAzLCAweDQyMEJEMkE4LCAweDU2RkIwMDA5LAorMHhBMEUxRTIwMCwgMHhCMUE2MjYyMCwgMHg1NkZCMDAwOSwgMHhBMERCRTIwMCwKKzB4NTJGQjI2MjAsIDB4RTUwMEQ2OUEsIDB4NjU2MjIyNTAsIDB4NzYwNEQyQTAsCisweDYyNjIyMjUyLCAweEEwQ0ZENjlGLCAweDU2RkIyNjIwLCAweDI2MTBFMTI0LAorMHg1MjE3RDE5RCwgMHg1MjE4MTYyMSwgMHg1MjE5MTYyMiwgMHg1MjFBMTYyMywKKzB4NTUxQjE2MjQsIDB4MTY1NUUyMDAsIDB4MTY1NjU1MUMsIDB4MTY1NzU1MUQsCisweDE2NTg1NTFFLCAweDE2NTk1NTFGLCAweDExMjgxMTI3LCAweDExMkExMTI5LAorMHgxMTJDMTEyQiwgMHgxMTJFMTEyRCwgMHgxMTJGQTBBRSwgMHhENjhGRDE4RSwKKzB4NjI2MkUwNDAsIDB4NzYwNDY1MTIsIDB4MjE1MjM1MkMsIDB4NTUxMTYyNjYsCisweDExNTEzNTJDLCAweDYyNjI2NTYzLCAweDc1MDg1NjEyLCAweDExNjIzNjJDLAorMHg1NjEzNjI1MiwgMHgzNjJDNzVFQywgMHg2MjUyMTE2MywgMHg3NTEwNTYxNCwKKzB4MTE2NDM2MkMsIDB4NjI1MjY2NTMsIDB4NzYxMDU1MTUsIDB4MTE1NTM1MkMsCisweDU2MTY2MjYyLCAweDM2MkNENTdFLCAweDYyNTYxMTY2LCAweDM2MkM1NjE3LAorMHg2NjUzMTE2NywgMHg1NTE4NjI1MiwgMHgzNTJDNzYwNCwgMHg2MjY2MTE1OCwKKzB4MzUyQzU1MTksIDB4NjU2MzExNTksIDB4NTYxQTYyNjIsIDB4MzYyQzc1MDQsCisweDYyNTIxMTZBLCAweDc1MDQ1NjFCLCAweDExNkIzNjJDLCAweDU2MUM2MjU2LAorMHgxMTZDMzYyQywgMHg1NjFENjI1NiwgMHgxMTZEMzYyQywgMHg2MjUyNjY1MywKKzB4NzYwNDU1MUUsIDB4MTE1RTM1MkMsIDB4NTYxRjYyNjIsIDB4MzYyQ0Q1NjksCisweDYyNTIxMTZGLCAweDc1OTQwNjFFLCAweDAxNjYzNjJDLCAweDY2NTNFMDQ0LAorMHgwNTFFNjI1MiwgMHgzNTJDNzY0NCwgMHhFMDQ4MDE1NiwgMHgwNjFFNjI2MiwKKzB4MDE2NjM2MkMsIDB4RTA1NEQ2NjAsIDB4MDUxRTYyNjIsIDB4MzUyQzQyMjksCisweDc2MDQwMTU2LCAweEUwNTg2MjYyLCAweDQyMjkwNjFFLCAweDAxNjYzNjJDLAorMHhFMjM4NTZGQiwgMHhFMDQ0MjYyMCwgMHhFMDQ4MDIxRSwgMHg2MjEyMTYyMSwKKzB4NTUxMTE2MjIsIDB4MTY1M0UyMDAsIDB4MTY1NDU1MTIsIDB4MTY1NTU1MTUsCisweDE2NTY1NTEzLCAweDE2NTc1NTE2LCAweEUwNDAwNTFFLCAweDA1MUUxNjU4LAorMHgxNjU5RTA1MCwgMHgxNjVBNTUxNCwgMHhFMDRDMDUxRSwgMHgwNTFFMTY1QiwKKzB4MTY1Q0UwNTQsIDB4RTA1ODA1MUUsIDB4MDUxRTE2NUQsIDB4MTY1RUUwNDQsCisweEUwNDgwMTI2LCAweDExMjEyMTIyLCAweDExMjUxMTIyLCAweDExMjYxMTIzLAorMHhFMDQwMDEyNiwgMHhFMDUwMDEyNiwgMHgwMTI2MTEyNCwgMHgwMTI2RTA0QywKKzB4MDEyNkUwNTQsIDB4MDEyNkUwNTgsIDB4M0YzQzkzNTgsIDB4NkVGNjRGMjYsCisweDZDRjY2REY2LCAweDAwMEI2QkY2LCAweDRGMjI2OUY2LCAweEUyNDA2MTRELAorMHg4OTE0MzEyMywgMHgzMTI3RTIxRiwgMHg4QjA5RDczNCwgMHhENDM0NjE0RCwKKzB4RTAwMTcxRTAsIDB4NTY3MTQ0MEIsIDB4MjY1OTY1MDcsIDB4MTc2MUEwMDcsCisweEUwMDFENDJGLCAweDY2NzI0NDBCLCAweDI2NTk2NTA3LCAweDRGMjYyNzYyLAorMHgwMDA5MDAwQiwgMHg2MTRENEYyMiwgMHgzMTIzRTI0MCwgMHhFMjFGODkxMiwKKzB4RDcyNjMxMjcsIDB4NjE0RDhCMDgsIDB4NTY3MUQyMjUsIDB4NDIwQjcxRTAsCisweDI2MEJFMDAxLCAweDE3NjFBMDA2LCAweDY2NzJEMjIxLCAweEUwMDE0MjBCLAorMHgyNzYyMjYwQiwgMHgwMDBCNEYyNiwgMHhFNjQwMDAwOSwgMHg0NjI4NDYxOCwKKzB4NjI1MkQ1MUMsIDB4ODlGQzIyNjgsIDB4MDAwOTAwMEIsIDB4NDYxOEU2ODAsCisweEQ1MTg0NjI4LCAweDIyNjg2MjUyLCAweDAwMEI4OUZDLCAweEEwMDEwMDA5LAorMHg3MjAxRTIwMCwgMHg4QkZDMzI0MiwgMHgwMDA5MDAwQiwgMHgwMDAwMDA4MCwKKzB4MDAxMTc4MDQsIDB4MDAyMDJGRjQsIDB4MDAyMDEzNTYsIDB4MDAyMDEzOUEsCisweDAwMjAzMDA4LCAweDAwMjAzMDEwLCAweDAwMjAwQzM4LCAweDAwMjAwQzEyLAorMHgwMDIwMkYwMCwgMHgwMDIwMkYxNCwgMHgwMDIwMkFBNCwgMHgwMDFDMzZBMCwKKzB4MDAxQzNDQTAsIDB4MDAxQzM2RjQsIDB4MDAxQzNCODgsIDB4MDAxQzM3MDQsCisweDAwMjAyOUY4LCAweDAwMUMzNzNDLCAweDQ2MThFNjgwLCAweEQ1MkY0NjI4LAorMHgyMjY4NjI1MiwgMHgwMDBCOEJGQywgMHgyRkU2MDAwOSwgMHg3RkZDNEYyMiwKKzB4QkZGMTZFNTMsIDB4NjFFMjJGNDIsIDB4RTI4MEQ2MjksIDB4NTRFMTE2MTUsCisweDE2NDY0MjE4LCAweDQyMjg1NUUyLCAweDU3RTMxNjU3LCAweDE2Nzg2RUYyLAorMHgyNkUyMkUyQiwgMHg0RjI2N0YwNCwgMHg2RUY2QUZBOCwgMHgyRkQ2MkZDNiwKKzB4NEYyMjJGRTYsIDB4NkM1M0REMUUsIDB4NkU0M0JGRDYsIDB4MkRFMkJGOTUsCisweDAwMDlCRkQyLCAweDJDMTI1MUQ1LCAweDFDNDE1NEQ2LCAweDFDNTI1NUQ3LAorMHgxQzYzNTZEOCwgMHg2RUY2NEYyNiwgMHgwMDBCNkRGNiwgMHg2MTYzNkNGNiwKKzB4QTAwNEU2MDAsIDB4NjI1NjQxMDksIDB4MjQyMjc2MDEsIDB4MzYxMjc0MDQsCisweDAwMEI4QkY5LCAweDRGMjIwMDA5LCAweEQxMEZENDBFLCAweDAwMDk0MTBCLAorMHhENDBGRDIwRSwgMHhFNTA1NjAyMiwgMHgyMjAyQ0IyMCwgMHhENTBEMjQ1MiwKKzB4NDUwQkU3MDAsIDB4RDcwQzI0NzIsIDB4MDAwOTQ3MEIsIDB4RTYwMUQxMEIsCisweDIxNjJEMjBCLCAweDRGMjY0NjE4LCAweDIyNjIwMDBCLCAweDAwMUMzNzAwLAorMHgwMDFDMzcwQywgMHgwMDIwMzAyOCwgMHgwMDIwMTM1NiwgMHgwMDFDMzUwMCwKKzB4MDAxRDQwMDQsIDB4MDAyMDEzQ0MsIDB4MDAyMDBFRjgsIDB4MDAxRTIxMkMsCisweDAwMUMzRDMwLCAweDAwMDlBMUE5LCAweDJGRTYyRkQ2LCAweEREOEY0RjIyLAorMHhBMDA0OUVBNywgMHhENDhFMDAwOSwgMHg0MjBCRDI4RSwgMHg2MkQyNjVEMiwKKzB4OEJGODIyRTgsIDB4MDAwOUEwMDQsIDB4RDI4QUQ0OEIsIDB4NTVEMTQyMEIsCisweDIyRTg1MkQxLCAweEEwMDQ4QkY4LCAweEQ0ODgwMDA5LCAweDQyMEJEMjg1LAorMHg1MkQyNTVEMiwgMHg4QkY4MjJFOCwgMHgwMDA5QTAwNCwgMHhEMjgxRDQ4NCwKKzB4NTVEMzQyMEIsIDB4MjJFODUyRDMsIDB4QTAwNDhCRjgsIDB4RDQ4MTAwMDksCisweDQyMEJEMjdDLCAweDUyRDQ1NUQ0LCAweDhCRjgyMkU4LCAweDZFRjY0RjI2LAorMHg2REY2MDAwQiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHg2RTYzNkQ3MywKKzB4NkM1M0IwMTgsIDB4NjRDMzU3RjQsIDB4QjA1NDY1RTMsIDB4QjA2QTY2RDMsCisweEIwOUEwMDA5LCAweEIwOUUwMDA5LCAweEIwQTIwMDA5LCAweEIwQkUwMDA5LAorMHhCMEMxMDAwOSwgMHhCMTI0MDAwOSwgMHg0RjI2MDAwOSwgMHg2REY2NkVGNiwKKzB4NkNGNkEwMjMsIDB4MzQxMkQxNkMsIDB4RDY2QzA1MjksIDB4MjY1MEQ3NkMsCisweDI3NDIwMDBCLCAweDAwMDlBMDE0LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LAorMHg2RTYzNkQ3MywgMHg2QzUzQkZFRSwgMHg2NEMzNTdGNCwgMHhCMDJBNjVFMywKKzB4QjEwNjY2RDMsIDB4NEYyNjAwMDksIDB4NkRGNjZFRjYsIDB4NkNGNkEwMDUsCisweEU2MDNEMjYwLCAweDAwMEI0NjE4LCAweEQyNUUyMjYyLCAweDAwMEJFNjAwLAorMHg0RjIyMjI2MiwgMHhFNDBBQkY3RSwgMHgwMDA5QkY3RSwgMHhFMTA0RDI1QSwKKzB4RTUwMDQxMTgsIDB4MjIxMkU0MEEsIDB4MjI1MkJGNzQsIDB4NjA3MkQ3NTcsCisweDRGMjZDQjIwLCAweDI3MDIwMDBCLCAweEQxNTU0RjIyLCAweEU0MDA0MTBCLAorMHg0NTJCRDU1NCwgMHgyRkU2NEYyNiwgMHg2RTYzRDE1MywgMHg0NDE4NjYxMiwKKzB4NDUyODkyMTAsIDB4MjYyOTQ0MDgsIDB4NDQwODQ1MDAsIDB4NDQwMDI2NUIsCisweDQ3MDgyNjRCLCAweDQ3MDgyMTYyLCAweDI3RUJEMTRDLCAweDAwMEIyMTcyLAorMHgwM0YwNkVGNiwgMHgyRkU2MUZGRiwgMHhERTQ5NEYyMiwgMHhFNDBBRTEwMSwKKzB4MkUxMkJGNDgsIDB4NzI2QzYyRTMsIDB4RTQwMUUxMDAsIDB4MjIxMjIyMTIsCisweDIyMTIyMjEyLCAweDIyMTIyMjEyLCAweEU3MzAyMjQyLCAweEU0MEFFNTAzLAorMHgyMjEyMjIxMiwgMHgyMjEyMjIxMiwgMHgyMjEyMjIxMiwgMHgyMjEyMjIxMiwKKzB4MjIxMjIyMTIsIDB4MjIxMjIyMTIsIDB4MjI1MjIyNzIsIDB4MjIxMjIyMTIsCisweDIyMTIyMjEyLCAweDIyMTIyMjEyLCAweDIyMTIyMjEyLCAweDEyMUFCRjIyLAorMHgyRTYyRTYwMCwgMHgwMDBCNEYyNiwgMHhEMjMyNkVGNiwgMHhFNDQxRTEwMSwKKzB4MDAwQjIyMTIsIDB4RDEzMDIyNDIsIDB4RTYwNUQ0MzAsIDB4MDAwQjIxNjIsCisweEQ1MkYyNDYyLCAweDYwNTBEMjJGLCAweDhCMEU4ODAxLCAweDYwNDBENDJFLAorMHg4QjA3ODgwMSwgMHg5NjI2RDUyRCwgMHg4ODAxNjA1MCwgMHg5NjIzOEIwQywKKzB4MDAwOUEwMEEsIDB4QTAwNzk2MjEsIDB4RTYwMDAwMDksIDB4MjI2MkQ0MjYsCisweDg4MDE2MDQwLCAweEU2MDQ4QjAwLCAweEFFRjNFNDBBLCAweEQyMjQyMjYyLAorMHhFNDBBRTYwMSwgMHgyMjYyQUVFRSwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwKKzB4REMyMDRGMjIsIDB4NjBDMkVEMDAsIDB4Q0IwMUVCNjQsIDB4NjBDMjJDMDIsCisweEEwNDFDOTAxLCAweDAzQzQ2RTAzLCAweDAzNDAwM0Q0LCAweDAwMUMzQjg4LAorMHgwMDIwMzAyQywgMHgwMDIwMTNBMiwgMHgwMDIwMzAzNCwgMHgwMDIwMzAzQywKKzB4MDAyMDMwNDQsIDB4MDAyMDMwNEMsIDB4MDAyNUU3MjAsIDB4MDAyMDMyMUMsCisweDAwMjAyRjA0LCAweDAwMUM1OTY4LCAweDAwMUQ0MDA0LCAweDAwMUMzNTAwLAorMHgwMDIwMTE1NCwgMHgwMDIwMTE4MCwgMHgwMDFDNTgxNCwgMHgwMDFDNTlEMCwKKzB4MDAxQzU4MzAsIDB4MDAxQzYyNjgsIDB4MDAxQzU5QTQsIDB4MDAxQzYzOUMsCisweDAwMjAyRjE2LCAweDAwMUM1ODA0LCAweDAwMjAyRjE1LCAweDAwMjAyRjE3LAorMHgwMDFDNTgxQywgMHgwMDFDNTg2MCwgMHg4OTA3M0RCMiwgMHhFNDBBNjBDMiwKKzB4QkU5RkM5MDEsIDB4N0QwMTZFMDMsIDB4OEJGNTJFRTgsIDB4OEIwMzNEQjIsCisweEQyM0VENDNELCAweDAwMDk0MjBCLCAweDRGMjZFNDBBLCAweDZERjY2RUY2LAorMHhBRThGNkNGNiwgMHg0NDExNkJGNiwgMHg2MDRCOEYwMSwgMHgwMDBCNjA0MywKKzB4MkZCNjAwMDksIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4REMzNDdGRkMsCisweDYwQzJFRDAwLCAweENCMDJFQjY0LCAweDYwQzIyQzAyLCAweEM5MDIyRjAyLAorMHg2RTAzQTAwOSwgMHg4OTA4M0RCMywgMHhFNDBBNjBDMiwgMHhDOTAyMkYwMiwKKzB4NkUwM0JFNzAsIDB4MkVFODdEMDEsIDB4M0RCMzhCRjQsIDB4RDQyOThCMDgsCisweDdGMDREMjI2LCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjY0MjJCLAorMHg0RjI2N0YwNCwgMHg2REY2NkVGNiwgMHgwMDBCNkNGNiwgMHhENTIyNkJGNiwKKzB4NjA1MjU2NTEsIDB4MDAwQjQ2MjgsIDB4MkZCNjMwNkMsIDB4MkZENjJGQzYsCisweDRGMjIyRkU2LCAweDRGMDI0RjEyLCAweDZFNDNCRkYxLCAweERDMUI2QjAzLAorMHhCRkVDREQxQiwgMHgzMEI4MDAwOSwgMHgwNjBBM0MwNSwgMHg0NjA5NDYwOSwKKzB4M0Q2NTQ2MDEsIDB4NDIwOTAyMEEsIDB4NDIwOTQyMDksIDB4OEJGMDMyRTIsCisweDRGMTY0RjA2LCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjYwMDBCLAorMHg0RjIyMkZFNiwgMHhFMTAyREUwRiwgMHhFNDAzRTUwMCwgMHhCRkQ0MkUxMiwKKzB4RTYwNjJFNTIsIDB4RTcwMDQ2MTgsIDB4MkU2MkU0MDMsIDB4NEYyNjJFNzIsCisweDZFRjZBRkNCLCAweDAwMDkwMDBCLCAweDAwMjAzMDU0LCAweDAwMjAxMzU2LAorMHgwMDFDNTg2MCwgMHgwMDIwMzA2QywgMHgwMDFDMTA0MCwgMHhDQ0NDQ0NDRCwKKzB4MTA2MjRERDMsIDB4MDAxRDQwMDQsIDB4MkY5NjJGODYsIDB4MkZCNjJGQTYsCisweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweEU1MDA3RkRDLCAweDY0NTNFMTEwLAorMHg2QzUzNDEyOCwgMHhFRDA5NkU1MywgMHg2NjUzNjU1RCwgMHgzNjVDNDYwOCwKKzB4NzUwMTQ2MDgsIDB4NjA0MzM2MUMsIDB4MEY2NjY3NUQsIDB4RUIwMDYwQzMsCisweDI2QzEzN0QzLCAweDgxNjI4MTYxLCAweDE2QjI4MTYzLCAweDE2QjQxNkUzLAorMHg3NDA0OEZFQSwgMHhEOUE2NjhGMiwgMHgxOTgxREFBNiwgMHg1OUYxMjk4MiwKKzB4MUE5MUQxQTUsIDB4NUFGMjJBOTIsIDB4NURGNDVCRjMsIDB4NTRGNjVFRjUsCisweDIxQTIxMUExLCAweDExQjIxMUIzLCAweDExRDQxMUQ1LCAweDExRTYxMUU3LAorMHgxMTQ4MTE0OSwgMHg1NUY3RUUwMCwgMHg1N0Y4REQ5QywgMHg2NEUzRDI5QywKKzB4REI5REQ5OUMsIDB4RTg0NUVBQjgsIDB4MkQ1MjFENTEsIDB4NkFBQzIyNzIsCisweDZFRUQ0ODA4LCAweDREMDg2REUzLCAweDNERUM2NUUzLCAweDREMDg0NTA4LAorMHgzRDlDMzVFQywgMHg0NTA4NjBDMywgMHg4MUQxMkRDMSwgMHg0NTA4RTA1MCwKKzB4NDUwODQwMDgsIDB4NjBDMzgxRDIsIDB4RTYwMDM1QkMsIDB4ODFEMzM0QTIsCisweDFENTMxREQyLCAweDhEMDFENDg5LCAweEQ0ODYxRDY0LCAweEIwNUM2NUQzLAorMHg2NEVEN0UwMSwgMHg4QkRDMzQ4MiwgMHhEQjg4RDE4MiwgMHhEMjgwNjgxMiwKKzB4MUI4MTQ4MjksIDB4MkZEMjY0MTIsIDB4MkI5MjY5NEQsIDB4RDk3RjY3MjIsCisweDFCNzM0NzI5LCAweEQ3N0M2ODIyLCAweDFCQTI2QThELCAweEQyODA2QjcyLAorMHgyMkIyRDU3QiwgMHhFMDAzNUQ3MiwgMHg1RTc0MTJEMiwgMHgxMkU0NDAxOCwKKzB4RDY3QzUxNzYsIDB4NTQ3ODEyMTYsIDB4MTI0OEUxMDMsIDB4RDQ3OTY3OTIsCisweDY4NTIxMjdBLCAweDI4QzFFN0ZGLCAweDgxOTE2OTUyLCAweDZBNTJFMDUwLAorMHg4MUEyNDAwOCwgMHg2MEMzNkI1MiwgMHg2QzUyODFCMywgMHg2RTUyMUNDMiwKKzB4NjI1MjFFNjMsIDB4MTI2NEU2MDAsIDB4NDYwODY1NjMsIDB4NzUwMTM2NEMsCisweDY2NUQyNjcyLCAweDhCRjgzNjEzLCAweDRGMjY3RjI0LCAweDZERjY2RUY2LAorMHg2QkY2NkNGNiwgMHg2OUY2NkFGNiwgMHg2OEY2MDAwQiwgMHg2MDYxNjY0MiwKKzB4OEQwNEM4MDMsIDB4NjA2MUU1MDAsIDB4ODgwMkM5MDMsIDB4NTI2MjhCMDMsCisweDUxMjQ2NTYzLCAweDAwMEIyNDEyLCAweDJGRDY2MDUzLCAweDRGMjIyRkU2LAorMHg2RTUzN0ZFQywgMHhFNTUwNjI1MywgMHhFNDAwNkQ0MywgMHhBMDAxNDUwOCwKKzB4NTIyNEUxMDEsIDB4MjIxMTYwNDMsIDB4ODEyMzgxMjEsIDB4ODEyMjYwNTMsCisweDM2MjA1NkUyLCAweEQyNTQ4QkY1LCAweDY0RjMxNkU0LCAweDQyMEJFNjE0LAorMHg2NUUxNjVFMywgMHgyNTQ5RTRGQywgMHg2MUYxMkU1MSwgMHgyMTQ5NjVGMywKKzB4NTREMTJGMTEsIDB4NDEwQkQxNEMsIDB4NTdEMUU2MTQsIDB4Q0IwMTYwNzEsCisweDFERTEyNzAxLCAweDRGMjY3RjE0LCAweDAwMEI2RUY2LCAweDJGRDY2REY2LAorMHg0RjIyMkZFNiwgMHg2RTUzN0ZFQywgMHhFNUZDNjY1MywgMHg2MDYxNkQ0MywKKzB4Q0IwMTIwNTksIDB4NTJFMjI2MDEsIDB4OEIwNjMyNjAsIDB4NTFFMjEyRTQsCisweDhCMDQzMUUwLCAweEEwMDI1MkQxLCAweEFGRjAxRTIyLCAweEQyM0E1NjY0LAorMHhFNjE0NjRGMywgMHg2NUUzNDIwQiwgMHhFMUZDNjdFMSwgMHgyRTcxMjcxOSwKKzB4NTREMTY3RjEsIDB4RDEzNDI3MTksIDB4RTYxNDY1RjMsIDB4MkY3MTQxMEIsCisweDYwMjE1MkQxLCAweDIyMDFDQjAxLCAweDdGMTQxREUxLCAweDZFRjY0RjI2LAorMHg2REY2MDAwQiwgMHg0RjIyMkZFNiwgMHhERTIzNjI0QywgMHg0MjAwNDIwOCwKKzB4M0UyQ0EwMDUsIDB4RDQxRjUyNTIsIDB4QkY4RTU2MjQsIDB4NjVFMjJFNjIsCisweDM1MjA1MkUxLCAweEQ2MjI4QkY2LCAweDRGMjYyNjIyLCAweDZFRjYwMDBCLAorMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHhEQzE4NEYyMiwgMHg1MkMxREIxRiwKKzB4MzYyMDY2QzIsIDB4NjA2MTg5MUMsIDB4ODgwMUM5MDMsIDB4REUxMzg5MTgsCisweEJGNjNERDFCLCAweDY1MDM2NEUzLCAweDY2QjI4NTAzLCAweDMyNjI2MjBELAorMHhENDBCODkwNywgMHgwMDA5QkY5QiwgMHg0RDBCRDQxNiwgMHhBRkU2MDAwOSwKKzB4QkY2MjAwMDksIDB4RDQxNDY0RTMsIDB4MDAwOTREMEIsIDB4MDAwOUFGREYsCisweDIyNjJEMjEyLCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjYwMDBCLAorMHgwMDIwMkIwMCwgMHgwMDIwMkIwOCwgMHgwMDIwMkIxMCwgMHgwMDIwMkIzOCwKKzB4MDAyMDJGMUMsIDB4MDAxMDAwQjQsIDB4MDAxMDE2ODAsIDB4MDAxRTIxMDgsCisweDAwMUMzRDAwLCAweDAwMTE3ODgwLCAweDAwMjAwQTlFLCAweDAwMjAyRjAwLAorMHgwMDIwMTM1NiwgMHgwMDIwMzA4OCwgMHgwMDIwMzA4QywgMHgwMDFDM0QyOCwKKzB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4N0ZGQzRGMjIsIDB4NjAyMkQyMkIsCisweDhENDFDODAzLCAweERFMkEyRjAxLCAweERCMkJEQzJBLCAweEVEMDFBMDE3LAorMHhDOTAzNjA1MSwgMHg4OTE2ODgwMSwgMHhEMTI4RDQyNiwgMHgwMDA5NDEwQiwKKzB4NjEwMzU1MDMsIDB4QzgyMDg1NTEsIDB4RTA1MDg5MDMsIDB4NzIwMTAyQkUsCisweEQyMjMwQjI2LCAweDQyMEI2NEUzLCAweEQ2MjI2NTEzLCAweDUyQzEyNkQyLAorMHgzNTIwNjVDMiwgMHhERTIwOEJFNCwgMHhEQjIxREQyMCwgMHg1MkQxREMyMSwKKzB4MzUyMDY1RDIsIDB4NjA1MTg5MTgsIDB4ODgwMUM5MDMsIDB4RDQxQjg5MTQsCisweDQ2MEJENjE2LCAweDU3MDMwMDA5LCAweDhGMDQzN0UwLCAweEUyMDE2NTAzLAorMHhBRkVDMkIyMCwgMHhENDE4MkM1MiwgMHg0MjBCRDIxOCwgMHhENjExMDAwOSwKKzB4NDExOEUxMDEsIDB4MjYxMkFGRTMsIDB4QzgwNDYwRjEsIDB4RDIxNDg5MDcsCisweDRGMjY3RjA0LCAweDZERjY2RUY2LCAweDQyMkI2Q0Y2LCAweDdGMDQ2QkY2LAorMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QkY2MDAwQiwgMHgwMDFFMjEwMCwKKzB4MDAyMDJCMTAsIDB4MDAyMDJCMDgsIDB4MDAyMDJBQTQsIDB4MDAyMDEwNkMsCisweDAwMjAxMEVFLCAweDAwMUMzRDMwLCAweDAwMTE3ODgwLCAweDAwMjAyQjAwLAorMHgwMDIwMkYyMCwgMHgwMDIwMkYxQywgMHgwMDIwMkIzOCwgMHgwMDIwMTA4QSwKKzB4MDAyMDAxNzAsIDB4RTYwMUQyMDMsIDB4MTI2NUQ1MDMsIDB4MDAwQjIyNTIsCisweDAwMDAxMjY2LCAweDAwMUMxMDEwLCAweDAwMDBDMzRGLCAweDAwMDkwMDBCLAorMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHg2RDQzNkM1MywgMHhFRTAwQTAwNCwKKzB4N0UwMTY0RDQsIDB4NjQ0Q0JGRjIsIDB4OEJGOTNFQzIsIDB4NkVGNjRGMjYsCisweDAwMEI2REY2LCAweEU1MDA2Q0Y2LCAweDY2NDNBMDAyLCAweDc2MDE3NTAxLAorMHgyMjI4NjI2MCwgMHhBRkUzOEJGQSwgMHgyRkU2MDAwOSwgMHg3NTA3NjI1MywKKzB4RTEwODY3NTMsIDB4NjA0M0VFMEEsIDB4NDQwOUM5MEYsIDB4NjUwMzMwRTIsCisweDhEMDE0NDA5LCAweEU2MzBFNjM3LCAweDQxMTAzNjVDLCAweDhGRjIyNzYwLAorMHhFMDAwNzdGRiwgMHgwMDBCODAyOCwgMHgwMDBCNkVGNiwgMHgwMDBCRTAwMCwKKzB4MkZFNkUwMDAsIDB4N0ZFQzRGMjIsIDB4NkU0MzYyNTMsIDB4QkZEQzY1RjMsCisweEJGRDA2NDIzLCAweEJGQ0U2NEUzLCAweEQ0MDM2NEYzLCAweDAwMDlCRkNCLAorMHg0RjI2N0YxNCwgMHg2RUY2MDAwQiwgMHgwMDIwMzA5MCwgMHhFNEZERDU5QSwKKzB4RDY5QTYxNTIsIDB4MjUxMjIxNDksIDB4NzQwMTYwNTIsIDB4MjUwMkNCMDEsCisweEQxOTc2NzUyLCAweDI1NzIyNzQ5LCAweEM4NDA2MDEwLCAweDYwNjI4OTAyLAorMHgyNjAyQ0IwNCwgMHhFNTAxNjA2MiwgMHgyNjAyQ0IwOCwgMHhFNDAyNjA2MiwKKzB4MjYwMkM5Q0YsIDB4NDUxODYwNjIsIDB4MjYwMkNCMDMsIDB4MDAwQjE2NDIsCisweEQ1OEMxNjUzLCAweEQyOERENzhDLCAweEUxMDBENDhELCAweDI1MTFFNjAwLAorMHgyMjEwMjcxMSwgMHgyNDYxQUZEMiwgMHhEMjhBNjY0QywgMHgzNjJDNDYwMCwKKzB4Q0IxMDYwNjAsIDB4MjYwMDAwMEIsIDB4RDI4NjY1NEMsIDB4MzUyQzQ1MDAsCisweEUxRUY2NjUwLCAweDAwMEIyNjE5LCAweDY2NEMyNTYwLCAweDQ2MDBEMjgyLAorMHg2MDYwMzYyQywgMHgwMDBCQ0IxMCwgMHg2NTRDMjYwMCwgMHg0NTAwRDI3RSwKKzB4NjY1MDM1MkMsIDB4MjYxOUUxRUYsIDB4MjU2MDAwMEIsIDB4RDI3OTY2NEMsCisweDM2MkM0NjAwLCAweENCMDg2MDYwLCAweDI2MDAwMDBCLCAweEQyNzU2NTRDLAorMHgzNTJDNDUwMCwgMHhFMUY3NjY1MCwgMHgwMDBCMjYxOSwgMHg2NjRDMjU2MCwKKzB4NDYwMEQyNzEsIDB4NjA2MDM2MkMsIDB4MDAwQkNCMDgsIDB4NjU0QzI2MDAsCisweDQ1MDBEMjZELCAweDY2NTAzNTJDLCAweDI2MTlFMUY3LCAweDI1NjAwMDBCLAorMHhENjY4NjI0QywgMHgzMjZDNDIwMCwgMHhDOTA4NjAyMCwgMHg0MDIxNDAyMSwKKzB4MDAwQjQwMjEsIDB4NjI0QzYwMEMsIDB4NDIwMEQ2NjMsIDB4NjAyMDMyNkMsCisweDQwMjFDOTA4LCAweDQwMjE0MDIxLCAweDYwMEMwMDBCLCAweDY0NENEMTVGLAorMHg2MjQwMzQxQywgMHg2MDJDMDAwQiwgMHg2NDRDRDE1RCwgMHg2MjQwMzQxQywKKzB4NjAyQzAwMEIsIDB4NEYyMjJGRTYsIDB4NjQ1QzZFNDMsIDB4MzQ2N0U2MEEsCisweEJGRUI4OTE0LCAweDY0MEMwMDA5LCAweDg4MDE2MEVDLCAweEUwMEY4QjAyLAorMHgyNDA5QTAwMiwgMHg0NDA5NDQwOSwgMHhFNjBBNjI0QywgMHg4OTA1MzI2MywKKzB4NjQ0Q0JGRTIsIDB4NjAyMzYyMEMsIDB4OEIwMEM4ODAsIDB4NjAyM0UyMDAsCisweDAwMEI0RjI2LCAweDRGMjI2RUY2LCAweDYwNjJENjRBLCAweDhCMDM4ODAxLAorMHgwMDA5QjI0NiwgMHgwMDA5QTAwMywgMHhFNjQwRDI0NywgMHhENjQ3MjI2MCwKKzB4NEYyNkUyMDAsIDB4MjYyMjAwMEIsIDB4RDY0MjRGMjIsIDB4ODgwMjYwNjIsCisweEIyOEY4QjAxLCAweEQ2NDEwMDA5LCAweDRGMjZFMjAwLCAweDI2MjIwMDBCLAorMHhENDNERDUzQywgMHhFNzAxRTEwMCwgMHgwMDBCMjUxMiwgMHhEMjNBMjQ3MCwKKzB4MDAwQkU2MDQsIDB4NEYyMjIyNjAsIDB4RDEzQUQ0MzksIDB4MDAwOTQxMEIsCisweEUxRkRENTM5LCAweEQyMzk2NjUwLCAweEU3MDAyNjE5LCAweDRGMjYyNTYwLAorMHgyMjcwMDAwQiwgMHhENDM2NEYyMiwgMHg0MTBCRDEzMiwgMHhENTMyMDAwOSwKKzB4NjY1MEU3RkIsIDB4NEYyNjI2NzksIDB4MjU2MDAwMEIsIDB4RDQzMTRGMjIsCisweDQxMEJEMTJDLCAweEQ1MkMwMDA5LCAweDY2NTBFN0Y3LCAweDRGMjYyNjc5LAorMHgyNTYwMDAwQiwgMHg5NDJERDUyOCwgMHgyMjQ5NjI1MCwgMHgyNTIwMDAwQiwKKzB4RTRCRkQ1MjUsIDB4MjI0OTYyNTAsIDB4MjUyMDAwMEIsIDB4RDIyNjRGMjIsCisweDYwMEQ4NTIyLCAweDg5MTEyMDA4LCAweDg5MTM4ODAxLCAweDg5MTU4ODAzLAorMHg4OTQzODgwNSwgMHg4OTQ5ODgwNiwgMHg4OTRGODgwOCwgMHg4OTU1ODgwOSwKKzB4ODk1Qjg4MEEsIDB4ODk2MTg4MEIsIDB4MDAwOUEwNjgsIDB4MDAwOUIwNkEsCisweDYwMENBMDY1LCAweDAwMDlCMDc4LCAweDYwMENBMDYxLCAweDAwMDlCMDgxLAorMHg2MDBDQTA1RCwgMHgwMDAwRkY3RiwgMHgwMDFFMjE0OCwgMHgwMDFFMTEwOCwKKzB4MDAxRTEwMDAsIDB4MDAyMDJGNjAsIDB4MDAyMDJGNjIsIDB4MDAyMDJGODEsCisweDAwMjAyRjQ0LCAweDAwMUUxMDNGLCAweDAwMUUxMDVGLCAweDAwMUUxMDJGLAorMHgwMDFFMTA5MCwgMHgwMDIwMkY2OCwgMHgwMDFFMTAwQiwgMHgwMDIwMkY2NCwKKzB4MDAyMDMwOTQsIDB4MDAyMDEzNTYsIDB4MDAxRTEwMjgsIDB4MDAyMDJGODAsCisweDAwMjAzMEEwLCAweDAwMjAzMEIwLCAweDAwMjAyRjM4LCAweDYyNjBENjg0LAorMHg4QjJCMjIyOCwgMHgwMDA5QjA2MSwgMHg2MDBDQTAyOSwgMHg2MjYwRDY4MCwKKzB4OEIyMzIyMjgsIDB4MDAwOUIwNjksIDB4NjAwQ0EwMjEsIDB4NjI2MEQ2N0MsCisweDhCMUIyMjI4LCAweDAwMDlCMEM3LCAweDYwMENBMDE5LCAweDYyNjBENjc4LAorMHg4QjEzMjIyOCwgMHgwMDA5QjBDRCwgMHg2MDBDQTAxMSwgMHg2MjYwRDY3NCwKKzB4OEIwQjIyMjgsIDB4MDAwOUIxMjUsIDB4NjAwQ0EwMDksIDB4NjI2MEQ2NzAsCisweDhCMDMyMjI4LCAweDAwMDlCMTNELCAweDYwMENBMDAxLCAweDRGMjZFMDAwLAorMHgwMDA5MDAwQiwgMHhEMjZDRDE2QiwgMHhENTZDODQxMiwgMHg0MDAwQzkwRiwKKzB4RDc2QjAxMkQsIDB4RTQwM0Q2NkIsIDB4RTIwRjYxMUMsIDB4MjU0MEUwMDEsCisweDI1MjAyNzEyLCAweDI2MDIwMDBCLCAweEU2MDFEMjYyLCAweDMwNjY4NTIzLAorMHhFMDAwOEQwNSwgMHhENjYzRDI2MCwgMHhFMDAxODEyMiwgMHgwMDBCMjYwMiwKKzB4RDI1QzAwMDksIDB4NjAwRDg1MjMsIDB4ODkwNTIwMDgsIDB4OEIwQTg4MDEsCisweDYwNjBENjVELCAweDI2MDBDQjAxLCAweEQ0NTdENjVBLCAweEUwMDFFMTAxLAorMHgwMDBCMjYxMiwgMHgwMDBCODE0MiwgMHhEMTUyRTAwMCwgMHg4NTEzRTUwMSwKKzB4NjQwRDQ1MTgsIDB4NjYwMzM0NTMsIDB4RTAwMDhEMDUsIDB4RDU1MUQyNTMsCisweDIyNjBFMDAxLCAweDAwMEIyNTAyLCAweDRGMjIwMDA5LCAweDg1MTNEMTQ5LAorMHg2NDUzNjUwRCwgMHg2MjQ5NDQxOSwgMHgyMjdENjcyRSwgMHg4ODAxNjAyQywKKzB4ODgwMjg5MDksIDB4ODgwMzg5MTAsIDB4ODgwNjg5MUEsIDB4ODgwNzg5MzUsCisweEEwNEM4OTNCLCAweEQ1NDYwMDA5LCAweDY2NTJENzQ2LCAweDI3NjJENDQ2LAorMHg2MjJDNjI2MSwgMHgyNDIxQTAzOCwgMHgyMjI4NjI1QywgMHhENDQzOEIzRiwKKzB4NjY0MkQ1NDAsIDB4MjU2MkQ0NDAsIDB4MjQwMTg1NjEsIDB4NjIwM0EwMkMsCisweDIwMDg2MDVDLCAweDg4MTA4OTA3LCAweDg4MjA4OTA4LCAweDg4MzA4OTA5LAorMHhBMDJDODkwQSwgMHhEMjNBMDAwOSwgMHg2MjIyQTAwOCwgMHhBMDA1RDIzOSwKKzB4RDIzOTYyMjIsIDB4NjIyMkEwMDIsIDB4NjI2MkQ2MzgsIDB4RDQzMkQ1MzEsCisweDY2MjEyNTIyLCAweEEwMEY2MjZDLCAweEQ2MzUyNDIxLCAweDYyNjFENTJELAorMHg2MjJDRDQyRCwgMHhBMDA3MjU2MiwgMHhENjMyMjQyMSwgMHg4NTYxRDUyOSwKKzB4MjU2MkQ0MjksIDB4NjIwMzI0MDEsIDB4NjYyRDg1MTUsIDB4MzYxNzYxMEQsCisweDY1MDM4RjAxLCAweEIwQ0IyNDUxLCAweEEwMDEwMDA5LCAweEUwMDBFMDAxLAorMHgwMDBCNEYyNiwgMHhENjE5MDAwOSwgMHhENDI3RTEwMSwgMHg2NTQxMjYxMCwKKzB4RDExOEQ3MTcsIDB4RTIwRjY1NUQsIDB4Mjc1MkUwMDEsIDB4MDAwQjI2MjAsCisweDJGRTYyMTAyLCAweEQyMEY0RjIyLCAweDY0MEM4NTIzLCAweDhCMDgyNDQ4LAorMHhENTExRDYxRCwgMHgyNjIxRTIwMCwgMHg5NDBGODQ1MSwgMHhBMDQ4MjA0OSwKKzB4REUwRDgwNTEsIDB4Qzg0MDYwRTAsIDB4RTIwMThEMzIsIDB4ODk0NDM0MjcsCisweEQyMTZENjE1LCAweDI2NDE0MjBCLCAweDAwMDlBMDMwLCAweDAwMDBGRjdGLAorMHgwMDIwMkY4MSwgMHgwMDIwMkYzOCwgMHgwMDIwMkY0NCwgMHgwMDFFMTEwMCwKKzB4MDAxRTEwMEMsIDB4MDAyMDJGNjQsIDB4MDAxRTEwMDAsIDB4MDAxRTEwMDEsCisweDAwMjAyRjZDLCAweDAwMjAyRjRDLCAweDAwMjAyRjUwLCAweDAwMjAyRjU0LAorMHgwMDIwMkY3MCwgMHgwMDIwMkY3NCwgMHgwMDIwMkY3OCwgMHgwMDIwMkY3QywKKzB4MDAyMDMyODAsIDB4MDAyMDMyOEEsIDB4MDAyMDJGNUUsIDB4MDAyMDIyNUEsCisweDg5MTIzNDI3LCAweEQyOTRENjkzLCAweDI2NDE0MjBCLCAweENCODA4NEUxLAorMHg4MEUxQjBGNSwgMHhENjkxNjBFMCwgMHgyRTAwQ0IwNCwgMHhDOTNGNjA2MCwKKzB4RDY4RjI2MDAsIDB4QTAwMUUwMDEsIDB4RTAwMDI2MDIsIDB4MDAwQjRGMjYsCisweEQ2OEM2RUY2LCAweEM4ODA2MDYwLCAweEQyODY4OTE5LCAweDg4MDE2MDIxLAorMHhEMjg5OEIxNSwgMHg4NTI0RTUwMSwgMHg4OTEwMzA1NiwgMHhFMjAzRDE4NywKKzB4MjEyMEQ0ODcsIDB4RTAwQjY1NDEsIDB4MDY1NjY1NUQsIDB4RTQwRkQ1ODUsCisweDIxNDBFNzAyLCAweEQ3N0UyNTcxLCAweDAwMEJFMDAxLCAweDAwMEIyNzAyLAorMHgyRkU2RTAwMCwgMHhERTgwNEYyMiwgMHhDODgwODRFMSwgMHhENTdBODkyQywKKzB4MjAwODg1NTQsIDB4NjEwMzhGMjgsIDB4ODU1M0Q3N0MsIDB4NjQwMzY2NzIsCisweDg1NjY2NTBDLCAweDM1MjA2MjBDLCAweEQ2Nzk4QjFFLCAweDY1MUNENzc0LAorMHgyNjUxNjQ0QywgMHg2MEUwMjc0MSwgMHg4OTA0Qzg0MCwgMHg0MjBCRDI3NSwKKzB4QTAwMzAwMDksIDB4RDI2ODAwMDksIDB4MDAwOTQyMEIsIDB4MDAwOUIwOUYsCisweEUyMDFEMTY3LCAweDYwRTAyMTIyLCAweENCMDRENDY0LCAweDYwNDAyRTAwLAorMHgyNDAwQzkzRiwgMHg2MDIzQTAwMSwgMHg0RjI2RTAwMCwgMHg2RUY2MDAwQiwKKzB4MkZCNjJGQTYsIDB4MkZENjJGQzYsIDB4REE2MjJGRTYsIDB4NjZBMUUyNDAsCisweDM2MjJEQzVFLCAweDYyNjM4OTAwLCAweDZFRDM2RDJDLCAweDRFMjEzNkQ4LAorMHg0RTIxMkE2MSwgMHhEQjYxRDQ2MCwgMHhFNzAwQTAwRiwgMHg3NzAxNjJCMiwKKzB4NzEwMjYxMjMsIDB4NjYyMTJCMTIsIDB4NzEwMjYyMTMsIDB4NjEyMTJCMTIsCisweDY1MUQ2NjZELCAweDM1NkM0NTI4LCAweDYyN0MyNDUyLCAweDhCRUQzMkUzLAorMHhDOTAzNjBEMywgMHg4QjEwODgwMywgMHg2MTczNjdCMiwgMHgyQjEyNzEwMiwKKzB4NzEwMjZFMTMsIDB4MkIxMjY1NzEsIDB4NjU1RDZERTEsIDB4NDIyODYyREQsCisweDMyNUNFMTA3LCAweEEwMEMyQzEwLCAweDg4MDIyNDIyLCAweEEwMDM4QjAxLAorMHg4ODAxRTIwMywgMHhFMjAxOEIwNSwgMHg2NkIyMkMyMCwgMHg2NTVENjU2MSwKKzB4RTYwRjI0NTIsIDB4NjdBMTJDNjAsIDB4OEIwNTI3NzgsIDB4REQzOERDNDQsCisweEVCMDFFQTAwLCAweDJEQjIyQ0EyLCAweDZERjY2RUY2LCAweDZCRjY2Q0Y2LAorMHg2QUY2MDAwQiwgMHgyRkU2MkZENiwgMHhFMjQwREQzNiwgMHgzNjIyNjZEMSwKKzB4NjI2Mzg5MDAsIDB4MzY3ODY3MkMsIDB4NzcwM0RFMzgsIDB4NDcyMTJENjEsCisweDY0RTJENjM1LCAweEEwMEU0NzIxLCAweDY1NjJFMTAwLCAweDYyNTM3MTAxLAorMHg3NDAxMjQ1MCwgMHgyNDIwNDIxOSwgMHg0NTI5NzQwMSwgMHg3NDAxMjQ1MCwKKzB4MjQ1MDQ1MTksIDB4NjIxQzc0MDEsIDB4OEJFRTMyNzMsIDB4NjZFMjQyMDAsCisweDQyMDA2MUQxLCAweDIxMTgzNjJDLCAweDJFNjI4RjA2LCAweEREMUNENzI4LAorMHhFNTAxRTQwMCwgMHgyRDUyMjc0MiwgMHgwMDBCNkVGNiwgMHgyRkQ2NkRGNiwKKzB4NEYyMjJGRTYsIDB4RUQwQUVFMDEsIDB4NjRFM0JDOTYsIDB4QkM5QjY0RTMsCisweDYyRUM3RTAxLCAweDhCRjczMkQ3LCAweEJDOUVFRTAxLCAweDY0RTM2NEUzLAorMHg3RTAxQkNBMywgMHgzMkQ3NjJFQywgMHg0RjI2OEJGNywgMHgwMDBCNkVGNiwKKzB4RDExODZERjYsIDB4RDQxODkyMEQsIDB4NzIxMjIxMjIsIDB4MjQyMkQ2MTcsCisweEQ3MTc3MjA0LCAweDcyMjAyNjIyLCAweDI3MjJEMTE2LCAweDAwMEI3MjMwLAorMHgxMzdBMjEyMiwgMHgwMDIwMkY1RSwgMHgwMDIwMjM2NiwgMHgwMDFFMTAxNSwKKzB4MDAyMDJGNjQsIDB4MDAxRTEwMDEsIDB4MDAyMDJGMzgsIDB4MDAxRTExMDAsCisweDAwMjAyRjYyLCAweDAwMjAyRjUwLCAweDAwMUUxMDAwLCAweDAwMjAyRjU0LAorMHgwMDIwMkY2MCwgMHgwMDIwMjI1QSwgMHgwMDFFMTAwQywgMHgwMDIwMkY0QywKKzB4MDAyMDJGNjgsIDB4MDAyMDJGNkMsIDB4MDAyMDJGNzAsIDB4MDAyMDJGNzQsCisweDAwMjAyRjc4LCAweDAwMjAyRjdDLCAweDRGMjIyRkU2LCAweEQ2NTA3RkZDLAorMHg4ODAxNjA2MCwgMHhFMjAxODk1MSwgMHgyNjIwQkZCQiwgMHhENTRFRDE0RCwKKzB4REU0RTYwMTAsIDB4NjRFMzY1NTIsIDB4NzQwMkM4NDAsIDB4OEQyMkQxNEMsCisweEQyNEM3NTAyLCAweEU2MDFENzRDLCAweEU3MDQyNzIyLCAweDc2MDE2MjU1LAorMHg2MjZDMjQyMSwgMHg4RkY5MzI3MywgMHhENDQzNzQwMiwgMHg2MjQyRTYwMSwKKzB4NjQwRDg1MjgsIDB4Njc0OTQ0MTksIDB4Mjc1RDY1N0UsIDB4ODFFNDYwN0MsCisweEU0MTdENTQyLCAweDY3NTU3NjAxLCAweDMyNDM2MjZDLCAweDhGRjkyMTcxLAorMHhBMDIwNzEwMiwgMHhEMjNFMDAwOSwgMHhFNjAxRDczQiwgMHhFNzA0MjcyMiwKKzB4NzYwMTYyNTUsIDB4NjI2QzI0MjEsIDB4OEZGOTMyNzMsIDB4RDQzMjc0MDIsCisweDYyNDJFNjAxLCAweDY0MEQ4NTI4LCAweDY3NDk0NDE5LCAweDI3NUQ2NTdFLAorMHg4MUU0NjA3QywgMHhFNDE3RDUzMywgMHg2NzU1NzYwMSwgMHgzMjQzNjI2QywKKzB4OEZGOTIxNzEsIDB4OTI0QTcxMDIsIDB4RDIyNjJFMjEsIDB4NUUyM0Q3MkUsCisweDY0RjIyRkUyLCAweDYwNDM2NUYyLCAweDI3MDBDOTgwLCAweEM5NjA2MDQzLAorMHg4MDcxNjEwMywgMHhDOTAzNjA0MywgMHg4MDcyNDUxOSwgMHg2NUYyNjA1QywKKzB4ODE3MjY2RjIsIDB4NDYxOTQ2MjksIDB4NjA2QzQ1MjksIDB4NDAxODY0NUMsCisweDgxNzMzMDRDLCAweDIxMTg1RTIzLCAweDY0RjIyRkUyLCAweDZFNEM2MkYyLAorMHg2MDJDNDIxOSwgMHg2NkYyNjJGMiwgMHg0NjI5NDAxOCwgMHg0NjE5MzBFQywKKzB4NDIyOTgxNzQsIDB4NjUyQzYwNkMsIDB4MzA1QzQwMTgsIDB4ODE3NThGMDcsCisweDAwMDlCQzlDLCAweDIyMjg2MjBDLCAweEEwMEE4OTA4LCAweDYwMTMwMDA5LAorMHg4QjAzODg0MCwgMHgwMDA5QjAwOSwgMHgwMDA5QTAwMywgMHhFMjAyRDYwRiwKKzB4N0YwNDI2MjIsIDB4MDAwQjRGMjYsIDB4MDAwQjZFRjYsIDB4MDYwQTAwMDksCisweDAwMjAyRjgwLCAweDAwMUUxMDAwLCAweDAwMjAyRjZDLCAweDAwMjAzMjgwLAorMHgwMDIwMzI4QywgMHgwMDIwMzIyNCwgMHgwMDIwMkY1NCwgMHgwMDIwMzI1NCwKKzB4MDAyMDMyNTIsIDB4MDAyMDMyMjYsIDB4MDAyMDJGMzgsIDB4MDAyMDJGNjQsCisweDRGMjIyRkU2LCAweERFOTM3RkZDLCAweDIwMDg4NEU5LCAweDJGMDA4RDA2LAorMHhENjkyRDQ5MSwgMHgwMDA5NDYwQiwgMHg2NEYwQjE5NCwgMHg2NjIwRDI5MCwKKzB4ODkwMjI2NjgsIDB4QzlCRjYwRTAsIDB4N0YwNDJFMDAsIDB4MDAwQjRGMjYsCisweDAwMEI2RUY2LCAweDJGRTYwMDA5LCAweERFOEE0RjIyLCAweDYwRTBENjhBLAorMHhDQkMwRDQ4QSwgMHg2MjYwMkUwMCwgMHhDODAzNjAyQywgMHg0MDIxODkwNCwKKzB4NzAwMTQwMjEsIDB4NjYwM0EwMDIsIDB4NjYwMzQwMDksIDB4RDY4NDYxNkQsCisweEU1MDBBMDA0LCAweDc1MDE2MjYyLCAweDc0MDQyNDIyLCAweDMyMTM2MjVELAorMHhEMjgwOEJGOCwgMHgwMDA5NDIwQiwgMHhDOUJGODRFMiwgMHg0RjI2ODBFMiwKKzB4NkVGNjAwMEIsIDB4MkZFNjJGRDYsIDB4N0ZGQzRGMjIsIDB4NjI2MEQ2N0EsCisweDg5NDQyMjI4LCAweEQ1NkZFMTAwLCAweDYwNTAyNjEwLCAweENCNDBENDc3LAorMHgyNTAwNDQwQiwgMHg4RDA1MjAwOCwgMHg2MkUwNkUwMywgMHg3MTA0NjEyQywKKzB4MkYxMUEwMDYsIDB4RDQ3MkQ2NkEsIDB4REQ3MjY3NjAsIDB4NjU3QzREMEIsCisweEUyM0M2RDFELCAweDhCMDMzRDI3LCAweEQyNjRENDZGLCAweDAwMDk0MjBCLAorMHg0RDIxNEQyMSwgMHhBMDA1RDc2RCwgMHg2NkU2RTQwMCwgMHgzNTdDNDUwOCwKKzB4NzQwMTI1NjIsIDB4MzVEMzY1NEQsIDB4RDc2OThCRjcsIDB4NjE3MkUwMDMsCisweDgxMTE0MDE4LCAweDZFNzI2MEYxLCAweDgxRTI3MDBDLCAweEQ0NjU2MTcyLAorMHhERDY1ODExMywgMHg0RDBCREU2NSwgMHhFMjAxNjU3MiwgMHhENDY0MkUyMiwKKzB4NDIwQkQyNTIsIDB4RDY1MzAwMDksIDB4QzkzRjYwNjAsIDB4N0YwNDI2MDAsCisweDZFRjY0RjI2LCAweDZERjYwMDBCLCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LAorMHhEMjVDNEYyMiwgMHg2QjQzNkU3MywgMHg0MjBCNkM1MywgMHgyMDA4NkQ2MywKKzB4NjEwMzhGMDgsIDB4RDI0NUQ0NTgsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsCisweDZCRjY0MjJCLCAweDIxQjA2MEMzLCAweDYwRDM4MDExLCAweEU1MDA4MTExLAorMHg2NEJDQTAwNywgMHg2MDUzNjU1RCwgMHg2NjUzMDBFQywgMHg3NTAxMzYxQywKKzB4NjI1RDgwNjQsIDB4OEJGNTMyNDMsIDB4NjA2MEQ2MzYsIDB4MjYwMEM5QkYsCisweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjYwMDBCLCAweDdGQzQ0RjIyLAorMHg3MjAyNjJGMywgMHgyMjUxMkY0MSwgMHg0NTI5NzIwMiwgMHg2MDYzMjI1MSwKKzB4RTVDNEU2ODIsIDB4NjdGMzgxMjEsIDB4NjU1QzY2NkMsIDB4RTQwOEJGQkMsCisweDRGMjY3RjNDLCAweDAwMDkwMDBCLCAweDJGOTYyRjg2LCAweDJGQjYyRkE2LAorMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHhFMTAwN0ZDNCwgMHg2NTEzRUNGRiwKKzB4NkIxMzZDQ0QsIDB4REUzNkQ3MzUsIDB4RURGRjY0RjMsIDB4RDgzNUVBMDQsCisweDYwNTM2NTVDLCAweDAyN0Q0MDAwLCAweDMyQzA2MjJELCAweDY2MDM4RDBELAorMHgwOUVENjA2MywgMHgyNDkxMDI3RCwgMHgyNDIxNzQwMiwgMHg2OTgyMDJFRCwKKzB4MzkyODYyMkQsIDB4NzQwMjI4OTIsIDB4NzUwMTcxMDQsIDB4NjA2MzYyNUMsCisweDA3RDUzMkEyLCAweDBFQjU4RkU0LCAweDI0NDg2NDFDLCAweEU2ODA4OTA1LAorMHg2N0YzRTVDNSwgMHhCRjdGNjY2QywgMHg3RjNDNjU1QywgMHg2RUY2NEYyNiwKKzB4NkNGNjZERjYsIDB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsIDB4RDExRTY4RjYsCisweDYwMTJEMjFFLCAweENCMjBFNDA1LCAweDIxMDJFNTAwLCAweDAwMEIyMjQyLAorMHgwMDAwMjI1MiwgMHgwMDFFMTAxNywgMHgwMDIwMzBCQywgMHgwMDIwMTM1NiwKKzB4MDAyMDJGMUEsIDB4MDAxRTEwMTUsIDB4MDAxRTEwQkYsIDB4MDAxMTc4MDAsCisweDAwMUUxMEZDLCAweDAwMjAwMTcwLCAweDAwMjAyRjIwLCAweDAwMjAyNEJFLAorMHgwMDIwMzBDMCwgMHgwMDIwMTNBMiwgMHgwMDIwMzBEQywgMHgwMDExNzg4QywKKzB4MDAyMDJGMUMsIDB4MDAyMDJCMDAsIDB4MDAyMDEwRUUsIDB4MDAxRTIxMzAsCisweDAwMjAzMEU0LCAweDAwMjAyNDgwLCAweDAwMjAzMEU4LCAweDAwMjAyRjI2LAorMHgwMDIwMkYyRSwgMHgwMDIwMzIyMCwgMHgwMDFDMzUwMCwgMHgwMDFENDAwNCwKKzB4RDU2NUQxNjQsIDB4RTQwMEQ3NjUsIDB4MjE0MkUyMEYsIDB4MTc0MTExNTQsCisweEQ1NjMyNzIyLCAweDk2NjlENzYzLCAweDE1NDEyNTcyLCAweDk2NjYxNTYyLAorMHhFNjAxMTU2NSwgMHhENTYwMTE2NSwgMHg2NjZDRTZGOCwgMHgyNTQyMjU0MiwKKzB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsIDB4MjU2MjI1NDIsIDB4NzYwMUU3MjcsCisweDY3NjMyNTcyLCAweDI1NjI3Nzk3LCAweEU3MDQyNTcyLCAweDI1NzJFMjQ4LAorMHhFMjE5MjUyMiwgMHhFMjcwMjUyMiwgMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwKKzB4MjUyMjI1NDIsIDB4MjUyMkUyMEMsIDB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsCisweDI1NDIyNTQyLCAweDI1NDIyNTQyLCAweDAwMEIxNTRBLCAweEUyMDgxMTQ1LAorMHgwMDA5NDIyQiwgMHgyRkU2MkZENiwgMHg3RkZDNEYyMiwgMHhDODIwNjA0MywKKzB4NkU0MzhEMDIsIDB4MDAwOUJFNkQsIDB4QzgxMDYwRTMsIDB4QkU2QTg5MDEsCisweDYwRTMwMDA5LCAweDg5MDFDODQwLCAweDAwMDlCRThDLCAweEM4MDE2MEUzLAorMHhERDNFODkzOCwgMHhDODAyNjBEMCwgMHgyRjAwOEQwMywgMHg0NjBCRDYzQywKKzB4NjBGMDAwMDksIDB4ODkwMkM4MDQsIDB4NDYwQkQ2M0EsIDB4NjJGMDAwMDksCisweEM4ODA2MDIzLCAweDYwRDA4OTAyLCAweDJEMDBDOTdGLCAweEM4MDE2MDIzLAorMHhENjM1ODkwNiwgMHgwMDA5NDYwQiwgMHgwMDA5QTAwNywgMHg1MTYzMDYwMSwKKzB4ODkwMkM4MDgsIDB4NDYwQkQ2MzEsIDB4NjBGMDAwMDksIDB4ODkwMkM4MTAsCisweDQyMEJEMjJGLCAweEQ1MkYwMDA5LCAweDg4MDI2MDUyLCAweEQyMkU4QjAzLAorMHhBMDA1RTYwNCwgMHg4ODAxMjI2MCwgMHhEMjJCOEIwMiwgMHgyMjYwRTYwMSwKKzB4MjUyMkUyMDAsIDB4Qzg4MDYwRTMsIDB4RDYyODg5MkUsIDB4NjBFMzZFNjAsCisweDg5MDJDODgwLCAweDQyMEJEMjI2LCAweDYwRTMwMDA5LCAweDg5MDJDODQwLAorMHg0MjBCRDIyNCwgMHg2MEUzMDAwOSwgMHg4OTAyQzgwMiwgMHg0MjBCRDIyMiwKKzB4NjBFMzAwMDksIDB4ODkwRUM4MDQsIDB4NDEwQkQxMjAsIDB4QkYwRTAwMDksCisweEJGNEQwMDA5LCAweEQ1MUUwMDA5LCAweDYwNTBENDFFLCAweEM5MDhENzFFLAorMHhCRjg0MjUwMCwgMHg2MEUzMjQ3MiwgMHg4OTA1QzgwOCwgMHg3RjA0RDIxQiwKKzB4NkVGNjRGMjYsIDB4NkRGNjQyMkIsIDB4NEYyNjdGMDQsIDB4MDAwQjZFRjYsCisweDAwMDA2REY2LCAweDAwMUM1ODFDLCAweEEwMDBBMDAwLCAweDAwMUQwMTAwLAorMHgwMDFENDAwMCwgMHgwMDA0MDAyMSwgMHgwMDFDNTg5QywgMHgwMDFFMTAyMSwKKzB4MDAyMDE1MzYsIDB4MDAyMDE1NTgsIDB4MDAyMDFCOTgsIDB4MDAyMDE1NzAsCisweDAwMjAxNTdFLCAweDAwMjAyRjY0LCAweDAwMUUxMDBCLCAweDAwMUUxMDI4LAorMHgwMDIwMTVENCwgMHgwMDIwMTVFMCwgMHgwMDIwMTU4NiwgMHgwMDIwMTVBNCwKKzB4MDAxRTEwMDAsIDB4MDAxMEYxMDAsIDB4MTIzNDU2NzgsIDB4MDAyMDE1QkMsCisweDY0NENENkE3LCAweDAwMEIzNDZDLCAweEQ2QTYyNDUwLCAweDM0NkM2NDRDLAorMHgyNDUwMDAwQiwgMHg2NDRDRDZBNCwgMHgwMDBCMzQ2QywgMHg2MjVDMjQ1MCwKKzB4NDIwODYxNkQsIDB4NDIwODQxMTksIDB4NDIwMDYwMTksIDB4NjcwRTYxNEMsCisweEQ0OUUzMjFDLCAweDQyMDAyMDdELCAweDMyNENDOTBGLCAweDIyMDAwMDBCLAorMHg0MjA4NjI1QywgMHg0MjAwNDIwOCwgMHgzMjRDNjQ0QywgMHg0MjAwRDQ5OCwKKzB4MDAwQjMyNEMsIDB4MkZFNjIyNjAsIDB4NjE0QzRGMTIsIDB4NDEwMEQ0OTMsCisweDY3MTAzMTRDLCAweEUyOUY2NjZELCAweDI3Mjk0NjE5LCAweDZFNTM2MjY5LAorMHg2NzJFNjU3MywgMHg0MjIxMjI3RCwgMHg0MjIxNDIyMSwgMHg3NjAxNjYyQywKKzB4RTQwMTQ2MDgsIDB4MzRFODQ2MDgsIDB4NjQ0QzQ2MDAsIDB4MDcxQTA0NjcsCisweDIxNTAyNTdCLCAweDAwMEI0RjE2LCAweDRGMjI2RUY2LCAweEQyODU3RkU4LAorMHg4ODAxNjAyMSwgMHhEMjg0OEI3QiwgMHgyNjY4NjYyMSwgMHhEMjgzOEI3NywKKzB4MjY2ODY2MjEsIDB4RTUwRjhCNzMsIDB4RTQwMUJGQTIsIDB4QkZBNEU1MDEsCisweEU1ODZFNDAwLCAweEU0MDA2NTVDLCAweDJGNTBCRkE0LCAweEJGQTFFNDAxLAorMHhFNjAyRTUwNiwgMHg2MDYzNDYxOCwgMHg4MUYyRTQwMSwgMHg2NTQzQkY5RiwKKzB4RTQwMTg1RjIsIDB4QkZBQjY1NDMsIDB4ODVGMjY2MDMsIDB4NjU0M0U0MDEsCisweDY2MDNCRkIxLCAweEU0MDI2NUYwLCAweDYwNTM3NTZDLCAweDgwRjhCRjgwLAorMHhCRjgyRTQwMiwgMHg4NEY4RTUxMiwgMHg3MDkwRTQwMiwgMHg2NTAzQkY4MiwKKzB4NDYxOEU2MDIsIDB4ODFGNjYwNjMsIDB4QkY4MEU0MDIsIDB4ODVGNkU1MDAsCisweDY2MDNFNDAyLCAweEU1MDBCRjhDLCAweEU0MDI4NUY2LCAweEJGOTI2NjAzLAorMHhFNUZFRTUwMCwgMHhFMDEwNjU1QywgMHhCRjYxRTQwMywgMHhFNTEzMEY1NCwKKzB4RTQwRUJGNjMsIDB4MDVGQ0UwMTAsIDB4QkY2M0U0MEUsIDB4RTUwMDc1ODUsCisweEJGNjRFNDAzLCAweEU1MDBFNjQwLCAweEJGNzFFNDAzLCAweEU1MDBFNjQwLAorMHhCRjc4RTQwMywgMHhFNUZGRTY0MCwgMHhFMDE0NjU1QywgMHhCRjQ3RTQwNCwKKzB4RTQwRjBGNTQsIDB4RTUwNEJGNDksIDB4MDVGQ0UwMTQsIDB4QkY0OUU0MEYsCisweEU1MDE3NTg0LCAweEJGNEFFNjQwLCAweEU1MDFFNDA0LCAweEJGNTdFNjQwLAorMHhFNTAxRTQwNCwgMHhFNDA0RTY0MCwgMHhBRjVDN0YxOCwgMHg3RjE4NEYyNiwKKzB4MDAwQjRGMjYsIDB4NEYyMjAwMDksIDB4RDI0MjdGRjAsIDB4ODgwMTYwMjEsCisweEQyNDE4QjcxLCAweDI2Njg2NjIxLCAweEQyNDA4QjZELCAweDI2Njg2NjIxLAorMHhFNTBGOEI2OSwgMHhFNDAxQkYxQywgMHhCRjFFRTUwMSwgMHhFNTg2RTQwMCwKKzB4RTQwMDY1NUMsIDB4MkY1MEJGMUUsIDB4QkYxQkU0MDEsIDB4RTQwMUU1MDYsCisweEJGMUM2NTQzLCAweEU0MDFFNjQwLCAweEJGMjk2NTQzLCAweEU0MDFFNjQwLAorMHhCRjMwNjU0MywgMHg2NUYwRTY0MCwgMHg3NTZDRTQwMiwgMHhCRUZGNjA1MywKKzB4RTQwMjgwRjQsIDB4RTUxMkJGMDEsIDB4RTQwMjg0RjQsIDB4QkYwMTcwOTAsCisweEU2NDA2NTAzLCAweEJGMDJFNDAyLCAweEU2NDBFNTAwLCAweEJGMEZFNDAyLAorMHhFNjQwRTUwMCwgMHhCRjE2RTQwMiwgMHhFNUZFRTUwMCwgMHg2MDUzNjU1QywKKzB4QkVFNUU0MDMsIDB4RTUxMzgwRjgsIDB4RTQwRUJFRTcsIDB4RTQwRTg0RjgsCisweEJFRTc3MDg1LCAweEU1MDA2NTAzLCAweEJFRThFNjQwLCAweEU1MDBFNDAzLAorMHhCRUY1RTY0MCwgMHhFNTAwRTQwMywgMHhCRUZDRTY0MCwgMHhFNUZGRTQwMywKKzB4NjA1MzY1NUMsIDB4QkVDQkU0MDQsIDB4RTQwRjgwRkMsIDB4RTUwNEJFQ0QsCisweEU0MEY4NEZDLCAweEJFQ0Q3MDgzLCAweEU1MDE2NTAzLCAweEJFQ0VFNjQwLAorMHhFNTAxRTQwNCwgMHhCRURCRTY0MCwgMHhFNTAxRTQwNCwgMHhFNDA0RTY0MCwKKzB4QUVFMDdGMTAsIDB4N0YxMDRGMjYsIDB4MDAwQjRGMjYsIDB4MDAwMDAwMDksCisweDAwMUUxMDJGLCAweDAwMUUxMDgwLCAweDAwMUUxMDkwLCAweDAwMUUxMDNGLAorMHgwMDFFMTAzRSwgMHgwMDIwMkY1RSwgMHgwMDIwMkY2MCwgMHgwMDIwMkY2MiwKKzB4RDIxREQxMUMsIDB4NjYyMDYwMTAsIDB4Njc2QzcwMDEsIDB4MzcwMEM5MEYsCisweEU1MDA4RDEzLCAweDY3MTA2MjEwLCAweDc3MDE2MjJDLCAweDY0MjMyMTcwLAorMHhENjE2NjAxMCwgMHg0NDA4NDQwOCwgMHgzNDI4QzkwRiwgMHg2MjYwMjEwMCwKKzB4NzIwMUQ1MTMsIDB4NDQwODI2MjAsIDB4MDAwQjM1NEMsIDB4RDEwRjYwNTMsCisweDI1NTg2NTEwLCAweEU2MDA4RDEzLCAweEQ2MERENDBCLCAweDY1NUM2NTQwLAorMHg0NzA4Njc1MywgMHgzNzU4NDcwOCwgMHg0NzA4NjU0MCwgMHgyNDUwNzUwMSwKKzB4MzY3QzYwNDAsIDB4MjQwMEM5MEYsIDB4NzJGRjYyMTAsIDB4MDAwQjIxMjAsCisweDAwMDA2MDYzLCAweDAwMjAyRjE5LCAweDAwMjAyRjE4LCAweDAwMjAyRjFBLAorMHgwMDIwMkI0MCwgMHg3RkZDNEYyMiwgMHhFNjgwRDFBOCwgMHg2NjZDNjIxMiwKKzB4RDJBNzJGMjIsIDB4NjdGMzY1NjMsIDB4NDIwQjc1NDIsIDB4N0YwNEU0MDQsCisweDAwMEI0RjI2LCAweEU2ODAwMDA5LCAweEQyQTE2NjZDLCAweEU3MDA2NTYzLAorMHg0MjJCNzU0MCwgMHhFNjgwNjQ3MywgMHhEMjlENjY2QywgMHhFNzAwNjU2MywKKzB4NDIyQjc1NDMsIDB4MkZCNjY0NzMsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweDREMThFRDAxLCAweERCOThEQzk3LCAweDY1QzI1MkMxLCAweDg5MjAzNTIwLAorMHhDOTAzNjA1MSwgMHg4OTFDODgwMSwgMHhEMTk0REU5MiwgMHg2NEUzNDEwQiwKKzB4ODUwMzY1MDMsIDB4NjcwRDY2QjIsIDB4ODkwNzM3NjIsIDB4RDI5MUQ0OTAsCisweDAwMDk0MjBCLCAweEU3MDFEMTkwLCAweDIxNzJBRkU2LCAweERFOEY2NEUzLAorMHgwMDA5NEUwQiwgMHhENDhGRDY4RSwgMHg0MTBCRDE4RiwgMHhBRkRCMjZEMiwKKzB4NEYyNjAwMDksIDB4NkRGNjZFRjYsIDB4MDAwQjZDRjYsIDB4NEYyMjZCRjYsCisweDg1NDY3RkY0LCAweDJGMDFFNjgxLCAweDY2NkM4NTQ3LCAweDg1NDg4MUYxLAorMHg4MUYyRDI3QiwgMHg2N0YzODU0MiwgMHg4NTQzODFGMywgMHg4MUY0RTQwQywKKzB4NjU2MzYwNTMsIDB4NDIwQjgxRjUsIDB4N0YwQzc1NDAsIDB4MDAwQjRGMjYsCisweDJGODYwMDA5LCAweDJGQTYyRjk2LCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LAorMHg3RkVDNEYyMiwgMHhFMDAwRDE3NiwgMHhENDc4MkYxMiwgMHg4MUYyNjEwMywKKzB4REM3NzFGNDIsIDB4RDY3NzZCMTMsIDB4RTAwMTRCMDgsIDB4NDYwQkRFNzYsCisweDNCRUM0QjAwLCAweDY2QzIxRjAzLCAweDM2MjA1MkMxLCAweEExODE4QjAxLAorMHg2MDYxMDAwOSwgMHg4ODAxQzkwMywgMHhBMTdCOEIwMSwgMHg4NTYxMDAwOSwKKzB4OEIwMUM4MDEsIDB4MDAwOUEwODAsIDB4ODVEMjVENjMsIDB4QzkwMzY2MDMsCisweDg1RDM2NDAzLCAweDYwNTM2NTBELCAweDQwMjE0MDIxLCAweDQ1MDBDOTNGLAorMHgzMjJBNjEwMywgMHg2MDUzMjUyRCwgMHhDOTAxRTUxMCwgMHhEOTVFMzE1MywKKzB4NkUwMzhEMjEsIDB4NDQwOEQ3NjEsIDB4NDQwODY4NzAsIDB4NDQwMDYyMTMsCisweDI4ODg0MjAwLCAweDM0MkM4RjBFLCAweDYwNDNEMjVELCAweDYwRTMwNzJELAorMHg0QTE5NkE3RCwgMHg2NThFNjhBOSwgMHgyODVEODgwMSwgMHg2QTdDOEYwQiwKKzB4NkExM0EwMDksIDB4NjA0M0QyNTcsIDB4NjFFRDBFMkQsIDB4NjgxOTQxMTksCisweDI4N0Q2NzhFLCAweEQxNTQ2QUVDLCAweDIyMjg2MjEwLCAweEVBRkY4OTAxLAorMHhFRUZGNkFBQywgMHg2RUVDNjVBRCwgMHg4QjBGMzVFMCwgMHg0RDBCREQzRiwKKzB4NTQwMzY0QzMsIDB4QkY3MkU1MDIsIDB4RDQ0QzZEMDMsIDB4NDEwQkQxM0YsCisweEQ3NEI2NUQzLCAweEQ0NEJFRTAxLCAweDI3RTJBMDI1LCAweDI2NzlFN0ZDLAorMHg4MUQyNjA2MywgMHg5NDYwODVEMywgMHg2MTAzMjA0OSwgMHg0NTA4MjY4QiwKKzB4MjUxQjYwNjMsIDB4NjA1MzgxRDIsIDB4ODVENDgxRDMsIDB4NDExOEUxMDgsCisweDgxRDQyMDFCLCAweEVFMDI2MkMyLCAweDIwNzk4NTIxLCAweDY0QzI4MTIxLAorMHg2MDQxNjc4RCwgMHhDQjAxMzdFMywgMHgyNDAxOEQwNCwgMHhFRUU3ODVEMiwKKzB4ODFEMjIwRTksIDB4NDkwQkQ0MzgsIDB4NjBDMjAwMDksIDB4NTJGMzY2RjIsCisweDJCMDJDQjAxLCAweDI2MjJBRjZGLCAweEQyMjA4NTYxLCAweDhGMDJDODAyLAorMHhBMEQyNjRDMywgMHg0MjBCMDAwOSwgMHhEOTMwMDAwOSwgMHg1RTAzNjUwMywKKzB4MDc5RUUwNEMsIDB4NzcwMUREMkUsIDB4NjlEMjA5NzYsIDB4NzkwMUQ2MjYsCisweDZENjAyRDkyLCAweDg5MDYyREQ4LCAweEQyMThENDI0LCAweEVEMDE0MjBCLAorMHhBMEIzRDcyMywgMHg2MjUxMjdEMiwgMHg0MTE4RTEwRiwgMHgyMjE5RTQwMiwKKzB4MzI0MDQ0MTgsIDB4ODU1MThCNDYsIDB4MjBEOUVERkMsIDB4NjA1MTgxNTEsCisweENCMDE3REUzLCAweDg1RTEyNTAxLCAweDIwRDlENjBBLCAweDQ2MEI4MUUxLAorMHg2OUYyNjRDMywgMHhBMDk5NTdGMywgMHg3RTAzMjk3MiwgMHgwMDFDM0Q5QywKKzB4MDAyMDFFMzgsIDB4MDAyMDJCMzgsIDB4MDAyMDJGMDAsIDB4MDAyMDEwNkMsCisweDAwMjAyQjAwLCAweDAwMjAxMEVFLCAweDAwMUUyMTMwLCAweDAwMjAxMDhBLAorMHgwMDFDM0QzMCwgMHgwMDIwMzIwMCwgMHgwMDIwMTM1NiwgMHgwMDIwMzIwQywKKzB4MDAyMDJCMTAsIDB4MDAyMDI5RjgsIDB4MDAxQzNEMDAsIDB4MDAyMDMyMUMsCisweDAwMjAzMTAwLCAweDAwMjAzMTgwLCAweDAwMjAyRjE0LCAweDAwMjAyQjA4LAorMHgwMDFFMjEyQywgMHgwMDIwMzIwNCwgMHgwMDIwMzIwOCwgMHgwMDIwMkFBNCwKKzB4MDAyMDMyMjAsIDB4NkRERDZENTEsIDB4NkREOTREMTksIDB4MkQ2RDY2REUsCisweDYwREM3RDAxLCAweDQxMTg2MTAzLCAweDhGNDU4ODAxLCAweEQ2NUIyNTExLAorMHg3NDAxNjQ2MiwgMHg4NUUzMjY0MiwgMHg2MDYzNjYwRCwgMHg0MDIxNDAyMSwKKzB4NDYwMEM5M0YsIDB4MzIyQTZEMDMsIDB4NjA2MzI2MkQsIDB4RDE1NEM4MDEsCisweDg5MDFEOTU0LCAweDJENkI5NkExLCAweEUwMTBFNjAwLCAweDY0REQwRjY0LAorMHgwN0ZDRTAxMCwgMHg0MDAwNjA3QywgMHg2MjJEMDIxRCwgMHg4RDEyMzI0MCwKKzB4NjA2MzY2MDMsIDB4RTdGRjAyMUQsIDB4OEIwMTMyNzAsIDB4MDFENUEwMEIsCisweDAyRkNFMDEwLCAweDcyMDFFNjA0LCAweDYyMkMwRjI0LCAweDhCRTczMjYyLAorMHg2NjZDMDZGQywgMHg2MDYzNDYwMCwgMHg3MTAxMDE5RCwgMHhEMTQyMDkxNSwKKzB4Njk3RDY3MTEsIDB4ODkwNzM5NDAsIDB4NjAyRDYyMTEsIDB4ODkwMzg4RkYsCisweEREM0UyMUQxLCAweDJEMjBFMjAxLCAweEVERkM4NTUxLCAweDgxNTEyMEQ5LAorMHhEMjNCNjA1MSwgMHg2NEMzQ0IwMSwgMHgyNTAxNDIwQiwgMHgwMkZDRTAxMCwKKzB4NjEyQ0Q0MzgsIDB4NDQwQkUwMDEsIDB4MjcwMjY3RjIsIDB4RDIzNjg1RUYsCisweDQyMEI1NEYyLCAweEFFOTY2NTBELCAweDQyMEIwMDA5LCAweDU0MDMwMDA5LAorMHg4NTQ0NkUwMywgMHg0RDE4RUQwOCwgMHgzMEQwMjBEOSwgMHhCRTU2OEIwMywKKzB4QTAwN0U1MDEsIDB4ODU0MTAwMDksIDB4NjIwREREMkMsIDB4ODkwMTIyRDgsCisweEU1MDBCRTRELCAweEQyMkJENDJBLCAweDY1RTM0MjBCLCAweEVEMDFENzJBLAorMHgyN0QyQUU3OSwgMHhFRTA0ODVGMiwgMHg2MTBENzAwMSwgMHg4MUYyMzFFNywKKzB4N0MwODhEMDIsIDB4MDAwOUFFNjYsIDB4NEYyNjdGMTQsIDB4NkRGNjZFRjYsCisweDZCRjY2Q0Y2LCAweDY5RjY2QUY2LCAweDY4RjYwMDBCLCAweDRGMjIyRkU2LAorMHg2RTIyRDIxRSwgMHhDODQwNjBFMywgMHgyMkUyOEQwMiwgMHgwMDA5QkREMiwKKzB4NDIxOEUyNDAsIDB4ODkwMTJFMjgsIDB4MDAwOUJEREQsIDB4QzgxMDYwRTMsCisweEQ0MTc4OTA1LCAweDQyMEJEMjE3LCAweEJEREMwMDA5LCAweDYwRTMwMDA5LAorMHg4OTAxQzgwNSwgMHgwMDA5QkUyRCwgMHhDODAyNjBFMywgMHg0RjI2ODkwMiwKKzB4NkVGNkFERDksIDB4MDAwQjRGMjYsIDB4ODAwMDZFRjYsIDB4MDAyMDMyMjAsCisweDAwMjAyRjI2LCAweDAwMjAyRjJFLCAweDAwMjAyRjIyLCAweDAwMjAyRjI0LAorMHgwMDIwMTBFRSwgMHgwMDIwMjlGOCwgMHgwMDIwMTNBMiwgMHgwMDAwODAwMCwKKzB4MDAyMDJCMDgsIDB4MDAyMDEwOEEsIDB4MDAxRTIxMkMsIDB4MDAxQzM1MTAsCisweDAwMjAzMjE0LCAweDAwMjAxMzU2LCAweDA4MEEwQzBFLCAweDAwMDIwNDA2LAorMHgxQTFDMUUyMCwgMHgxMjE0MTYxOCwgMHgyRTMwMzIzNCwgMHgyNjI4MkEyQywKKzB4M0EzQzNFNDAsIDB4NkM2MjU2NDgsIDB4NDExMTJGMjYsIDB4RTIyMDhGMTgsCisweDg5MEIzMTIzLCAweDMyMUNEMjA0LCAweEQxMDI2MjIwLCAweDQxMkIzMTJDLAorMHgwMDA5MDAwOSwgMHgwMDIwMkEyMiwgMHgwMDIwMjlEOCwgMHgwMDBCRTAwMCwKKzB4NDAwMDYyRjYsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsCisweDYyRjYwMDBCLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLAorMHg0MDE4NDAwMCwgMHg2MkY2MDAwQiwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwKKzB4NDAwMDQwMDAsIDB4NDAyODQwMDAsIDB4NjJGNjAwMEIsIDB4NDAwMDQwMDAsCisweDQwMTg0MDAwLCAweDAwMEI0MDI4LCAweEM5MEY2MkY2LCAweDQwMDU0MDA1LAorMHg0MDA1NDAwNSwgMHg2MkY2MDAwQiwgMHg0MDA1QzkwNywgMHg0MDA1NDAwNSwKKzB4NjJGNjAwMEIsIDB4NDAwNUM5MDMsIDB4MDAwQjQwMDUsIDB4QzkwMTYyRjYsCisweDAwMEI0MDA1LCAweDAwMDA2MkY2LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4NTQ0RjBEMEEsIDB4NDYyMDUzNTUsIDB4MDAwMDNBNTcsIDB4MjA2MzY1NDQsCisweDMyMjAzMjMxLCAweDIwMzczMDMwLCAweDMzM0EzMTMyLCAweDM0MzIzQTM2LAorMHgwMDAwMDAwMCwgMHgwMDAwMEQwQSwgMHgwMDAwMDA0MywgMHg0MjcwNzM3MiwKKzB4M0QyMDY2NzUsIDB4NTU0RTIwM0QsIDB4MjAyQzRDNEMsIDB4NkU0OTY3N0EsCisweDRFNDk3Mjc0LCAweDZENzU0RTUxLCAweDAwMDAwMDNELCAweDYxNzY2RTQ5LAorMHgyMDY0Njk2QywgMHg3MjY1NzM3NSwgMHgyMDcyNkYyMCwgMHgyMDc5NjU2QiwKKzB4MDAyMTQ0NDksIDB4NTI1MDQ1NDUsIDB4NTcyMDRENEYsIDB4NjU3NDY5NzIsCisweDY0NjEyMDJDLCAweDAwM0Q3MjY0LCAweDZDNjE3NjIwLCAweDAwMDAwMDNELAorMHgwMDAwMEEwRCwgMHg2RTZCNkU1NSwgMHgyMDZFNzc2RiwgMHg2RDZENkY2MywKKzB4M0Q2NDZFNjEsIDB4MDAwMDAwMDAsIDB4MDAwQTBENTIsIDB4MjAzQTMwNTEsCisweDAwMDAwMDIwLCAweDIwM0EzMTUxLCAweDAwMDAwMDIwLCAweDIwM0EzMjUxLAorMHgwMDAwMDAyMCwgMHgyMDNBMzM1MSwgMHgwMDAwMDAyMCwgMHgyMDNBMzQ1MSwKKzB4MDAwMDAwMjAsIDB4NjE0Mzc3NDgsIDB4NzI2MjY5NkMsIDB4NkY2OTc0NjEsCisweDY2MjAyMDZFLCAweDBBNkM2OTYxLCAweDAwMDAwMDBELCAweDczNjk2RjRFLAorMHg2MTQzMjA2NSwgMHg3MjYyNjk2QywgMHg2RjY5NzQ2MSwgMHg2MTY2MjA2RSwKKzB4MjEyMTZDNjksIDB4MDAwMDBEMEEsIDB4MDAwMDAwNzIsIDB4MDAyMDUyMjAsCisweDAwMDAwRDBBLCAweDYyNzM1NTc2LCAweDc0NzM3MjVGLCAweDAwMDAwQTBELAorMHg2MjczNTU3NiwgMHg3Mzc1NzM1RiwgMHg2NDZFNjU3MCwgMHgwMDAwMEEwRCwKKzB4NjI3MzU1NzYsIDB4NzM2NTcyNUYsIDB4MDAwQTBENkQsIDB4MDAwMDAwNDIsCisweDcyNzQ2RTQ5LCAweDZENjUyMDUxLCAweDJDNzk3NDcwLCAweDQ5Njc3QTIwLAorMHg0OTcyNzQ2RSwgMHg3NTRFNTE0RSwgMHgwMDAwM0Q2RCwgMHg2NTRDNzI0NSwKKzB4MDAwMDAwNkUsIDB4MDAwMDAwNDksIDB4MjA3NDZGNEUsIDB4NzU2RjZFNjUsCisweDQ5MjA2ODY3LCAweDQyMjA1MTRFLCAweDBBMEQ2Njc1LCAweDAwMDAwMDAwLAorMHgwMDAwMDBGRiwgMHgwMDAyMDAwMSwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMTBFMDEwRCwgMHgwMDAyMDAwMywgMHgwMTA5MDEwOCwgMHgwMDAyMDEwQSwKKzB4MDIwMDAwMDMsIDB4MDIwMjAyMDEsIDB4MDIwNDAyMDMsIDB4MDIwNjAyMDUsCisweDAyMDIwMjAwLCAweDAyMDQwMjAzLCAweDAyMEMwMjA3LCAweDAyMEUwMjBELAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAxMEUwMTBELCAweDAwRkYwMTBGLCAweDAxMDkwMTA4LCAweDAxMEIwMTBBLAorMHgwMjAwMDBGRiwgMHgwMjAyMDIwMSwgMHgwMjA0MDIwMywgMHgwMjA2MDIwNSwKKzB4MDIwMjAyMDAsIDB4MDIwNDAyMDMsIDB4MDIwQzAyMEIsIDB4MDIwRTAyMEQsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDAyMDUyMjAsIDB4MDAwMDAwNDYsIDB4MDAwMDAwNTksIDB4NzMyMDQxNDIsCisweDAwM0Q3MTY1LCAweDQ5NTQ0MTIwLCAweDAwMDAyMDRELCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDJFMDIwOSwgMHg4MDAwMDEwMSwgMHgwMDA0MDlGQSwKKzB4MDBGRjA0MDAsIDB4MDUwNzAwMDAsIDB4MDIwMDAyMDEsIDB4ODIwNTA3MDAsCisweDAwMDIwMDAyLCAweDAzODMwNTA3LCAweDA3MDEwMDQwLCAweDQwMDIwNDA1LAorMHgwMjA5MDAwMCwgMHgwMTAxMDAyRSwgMHgwOUZBODAwMCwgMHgwNDAwMDAwNCwKKzB4MDAwMDAwRkYsIDB4MDIwMTA1MDcsIDB4MDcwMDAwNDAsIDB4NDAwMjgyMDUsCisweDA1MDcwMDAwLCAweDAwNDAwMzgzLCAweDA0MDUwNzAxLCAweDAwMDA0MDAyLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwNzA5MDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgfTsKKworY29uc3QgdTMyX3QgemNES0Z3SW1hZ2VTaXplPTEyOTg4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwYW5pLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBhbmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTk1YjVkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwYW5pLmMKQEAgLTAsMCArMSw3MzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgIi4uLzgwMjExY29yZS9jcHJlY29tcC5oIgorI2luY2x1ZGUgImhwYW5pLmgiCisjaW5jbHVkZSAiaHB1c2IuaCIKKworCitleHRlcm4gdTE2X3QgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCk7CitleHRlcm4gdTE2X3QgemZGbHVzaERlbGF5V3JpdGUoemRldl90KiBkZXYpOworCisvKgorICogQW50aSBub2lzZSBpbW11bml0eSBzdXBwb3J0LiAgV2UgdHJhY2sgcGh5IGVycm9ycyBhbmQgcmVhY3QKKyAqIHRvIGV4Y2Vzc2l2ZSBlcnJvcnMgYnkgYWRqdXN0aW5nIHRoZSBub2lzZSBpbW11bml0eSBwYXJhbWV0ZXJzLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOZXcgQW5pIEFsZ29yaXRobSBmb3IgU3RhdGlvbiBzaWRlIG9ubHkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgWk1fSEFMX05PSVNFX0lNTVVORV9NQVggICAgIDQgICAvKiBNYXggbm9pc2UgaW1tdW5pdHkgbGV2ZWwgKi8KKyNkZWZpbmUgWk1fSEFMX1NQVVJfSU1NVU5FX01BWCAgICAgIDcgICAvKiBNYXggc3B1ciBpbW11bml0eSBsZXZlbCAqLworI2RlZmluZSBaTV9IQUxfRklSU1RfU1RFUF9NQVggICAgICAgMiAgIC8qIE1heCBmaXJzdCBzdGVwIGxldmVsICovCisKKyNkZWZpbmUgWk1fSEFMX0FOSV9PRkRNX1RSSUdfSElHSCAgICAgICA1MDAKKyNkZWZpbmUgWk1fSEFMX0FOSV9PRkRNX1RSSUdfTE9XICAgICAgICAyMDAKKyNkZWZpbmUgWk1fSEFMX0FOSV9DQ0tfVFJJR19ISUdIICAgICAgICAyMDAKKyNkZWZpbmUgWk1fSEFMX0FOSV9DQ0tfVFJJR19MT1cgICAgICAgICAxMDAKKyNkZWZpbmUgWk1fSEFMX0FOSV9OT0lTRV9JTU1VTkVfTFZMICAgICA0CisjZGVmaW5lIFpNX0hBTF9BTklfVVNFX09GRE1fV0VBS19TSUcgICAgVFJVRQorI2RlZmluZSBaTV9IQUxfQU5JX0NDS19XRUFLX1NJR19USFIgICAgIEZBTFNFCisjZGVmaW5lIFpNX0hBTF9BTklfU1BVUl9JTU1VTkVfTFZMICAgICAgNworI2RlZmluZSBaTV9IQUxfQU5JX0ZJUlNURVBfTFZMICAgICAgICAgIDAKKyNkZWZpbmUgWk1fSEFMX0FOSV9SU1NJX1RIUl9ISUdIICAgICAgICA0MAorI2RlZmluZSBaTV9IQUxfQU5JX1JTU0lfVEhSX0xPVyAgICAgICAgIDcKKyNkZWZpbmUgWk1fSEFMX0FOSV9QRVJJT0QgICAgICAgICAgICAgICAxMDAKKworI2RlZmluZSBaTV9IQUxfRVBfUk5EKHgsIG11bCkgXAorICAgICgoKCh4KSUobXVsKSkgPj0gKChtdWwpLzIpKSA/ICgoeCkgKyAoKG11bCkgLSAxKSkgLyAobXVsKSA6ICh4KS8obXVsKSkKKworczMyX3QgQkVBQ09OX1JTU0koemRldl90KiBkZXYpCit7CisgICAgczMyX3QgcnNzaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN0cnVjdCB6c0hwUHJpdiAqSHBQcml2ID0gKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZTsKKworICAgIHJzc2kgPSBaTV9IQUxfRVBfUk5EKEhwUHJpdi0+c3RhdHMuYXN0X25vZGVzdGF0cy5uc19hdmdicnNzaSwgWk1fSEFMX1JTU0lfRVBfTVVMVElQTElFUik7CisKKyAgICByZXR1cm4gcnNzaTsKK30KKworLyoKKyAqIFNldHVwIEFOSSBoYW5kbGluZy4gIFNldHMgYWxsIHRocmVzaG9sZHMgYW5kIGxldmVscyB0byBkZWZhdWx0IGxldmVsIEFORAorICogcmVzZXRzIHRoZSBjaGFubmVsIHN0YXRpc3RpY3MKKyAqLworCit2b2lkIHpmSHBBbmlBdHRhY2goemRldl90KiBkZXYpCit7CisjZGVmaW5lIE4oYSkgICAgIChzaXplb2YoYSkgLyBzaXplb2YoYVswXSkpCisgICAgdTMyX3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN0cnVjdCB6c0hwUHJpdiAqSHBQcml2ID0gKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZTsKKworICAgIGNvbnN0IGludCB0b3RhbFNpemVEZXNpcmVkW10gPSB7IC01NSwgLTU1LCAtNTUsIC01NSwgLTYyIH07CisgICAgY29uc3QgaW50IGNvYXJzZUhpZ2hbXSAgICAgICA9IHsgLTE0LCAtMTQsIC0xNCwgLTE0LCAtMTIgfTsKKyAgICBjb25zdCBpbnQgY29hcnNlTG93W10gICAgICAgID0geyAtNjQsIC02NCwgLTY0LCAtNjQsIC03MCB9OworICAgIGNvbnN0IGludCBmaXJwd3JbXSAgICAgICAgICAgPSB7IC03OCwgLTc4LCAtNzgsIC03OCwgLTgwIH07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorICAgIHsKKyAgICAgICAgSHBQcml2LT50b3RhbFNpemVEZXNpcmVkW2ldID0gdG90YWxTaXplRGVzaXJlZFtpXTsKKyAgICAgICAgSHBQcml2LT5jb2Fyc2VIaWdoW2ldID0gY29hcnNlSGlnaFtpXTsKKyAgICAgICAgSHBQcml2LT5jb2Fyc2VMb3dbaV0gPSBjb2Fyc2VMb3dbaV07CisgICAgICAgIEhwUHJpdi0+ZmlycHdyW2ldID0gZmlycHdyW2ldOworICAgIH0KKworICAgIC8qIG93bCBoYXMgcGh5IGNvdW50ZXJzICovCisgICAgSHBQcml2LT5oYXNId1BoeUNvdW50ZXJzID0gMTsKKworICAgIG1lbXNldCgoY2hhciAqKSZIcFByaXYtPmFuaSwgMCwgc2l6ZW9mKEhwUHJpdi0+YW5pKSk7CisgICAgZm9yIChpID0gMDsgaSA8IE4od2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWwpOyBpKyspCisgICAgeworICAgICAgICAvKiBOZXcgQU5JIHN0dWZmICovCisgICAgICAgIEhwUHJpdi0+YW5pW2ldLm9mZG1UcmlnSGlnaCA9IFpNX0hBTF9BTklfT0ZETV9UUklHX0hJR0g7CisgICAgICAgIEhwUHJpdi0+YW5pW2ldLm9mZG1UcmlnTG93ID0gWk1fSEFMX0FOSV9PRkRNX1RSSUdfTE9XOworICAgICAgICBIcFByaXYtPmFuaVtpXS5jY2tUcmlnSGlnaCA9IFpNX0hBTF9BTklfQ0NLX1RSSUdfSElHSDsKKyAgICAgICAgSHBQcml2LT5hbmlbaV0uY2NrVHJpZ0xvdyA9IFpNX0hBTF9BTklfQ0NLX1RSSUdfTE9XOworICAgICAgICBIcFByaXYtPmFuaVtpXS5yc3NpVGhySGlnaCA9IFpNX0hBTF9BTklfUlNTSV9USFJfSElHSDsKKyAgICAgICAgSHBQcml2LT5hbmlbaV0ucnNzaVRockxvdyA9IFpNX0hBTF9BTklfUlNTSV9USFJfTE9XOworICAgICAgICBIcFByaXYtPmFuaVtpXS5vZmRtV2Vha1NpZ0RldGVjdE9mZiA9ICFaTV9IQUxfQU5JX1VTRV9PRkRNX1dFQUtfU0lHOworICAgICAgICBIcFByaXYtPmFuaVtpXS5jY2tXZWFrU2lnVGhyZXNob2xkID0gWk1fSEFMX0FOSV9DQ0tfV0VBS19TSUdfVEhSOworICAgICAgICBIcFByaXYtPmFuaVtpXS5zcHVySW1tdW5pdHlMZXZlbCA9IFpNX0hBTF9BTklfU1BVUl9JTU1VTkVfTFZMOworICAgICAgICBIcFByaXYtPmFuaVtpXS5maXJzdGVwTGV2ZWwgPSBaTV9IQUxfQU5JX0ZJUlNURVBfTFZMOworICAgICAgICBpZiAoSHBQcml2LT5oYXNId1BoeUNvdW50ZXJzKQorICAgICAgICB7CisgICAgICAgICAgICBIcFByaXYtPmFuaVtpXS5vZmRtUGh5RXJyQmFzZSA9IDA7Ly9BUl9QSFlfQ09VTlRNQVggLSBaTV9IQUxfQU5JX09GRE1fVFJJR19ISUdIOworICAgICAgICAgICAgSHBQcml2LT5hbmlbaV0uY2NrUGh5RXJyQmFzZSA9IDA7Ly9BUl9QSFlfQ09VTlRNQVggLSBaTV9IQUxfQU5JX0NDS19UUklHX0hJR0g7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKEhwUHJpdi0+aGFzSHdQaHlDb3VudGVycykKKyAgICB7CisgICAgICAgIC8vem1fZGVidWdfbXNnMigiU2V0dGluZyBPZmRtRXJyQmFzZSA9IDB4IiwgSHBQcml2LT5hbmlbMF0ub2ZkbVBoeUVyckJhc2UpOworICAgICAgICAvL3ptX2RlYnVnX21zZzIoIlNldHRpbmcgY2NrRXJyQmFzZSA9IDB4IiwgSHBQcml2LT5hbmlbMF0uY2NrUGh5RXJyQmFzZSk7CisgICAgICAgIC8vT1NfUkVHX1dSSVRFKGFoLCBBUl9QSFlfRVJSXzEsIEhwUHJpdi0+YW5pWzBdLm9mZG1QaHlFcnJCYXNlKTsKKyAgICAgICAgLy9PU19SRUdfV1JJVEUoYWgsIEFSX1BIWV9FUlJfMiwgSHBQcml2LT5hbmlbMF0uY2NrUGh5RXJyQmFzZSk7CisgICAgfQorICAgIEhwUHJpdi0+YW5pUGVyaW9kID0gWk1fSEFMX0FOSV9QRVJJT0Q7CisgICAgLy9pZiAoYXRoX2hhbF9lbmFibGVBTkkpCisgICAgSHBQcml2LT5wcm9jUGh5RXJyIHw9IFpNX0hBTF9QUk9DRVNTX0FOSTsKKworICAgIEhwUHJpdi0+c3RhdHMuYXN0X25vZGVzdGF0cy5uc19hdmdicnNzaSA9IFpNX1JTU0lfRFVNTVlfTUFSS0VSOworICAgIEhwUHJpdi0+c3RhdHMuYXN0X25vZGVzdGF0cy5uc19hdmdyc3NpID0gWk1fUlNTSV9EVU1NWV9NQVJLRVI7CisgICAgSHBQcml2LT5zdGF0cy5hc3Rfbm9kZXN0YXRzLm5zX2F2Z3R4cnNzaSA9IFpNX1JTU0lfRFVNTVlfTUFSS0VSOworI3VuZGVmIE4KK30KKworLyoKKyAqIENvbnRyb2wgQWRhcHRpdmUgTm9pc2UgSW1tdW5pdHkgUGFyYW1ldGVycworICovCit1OF90IHpmSHBBbmlDb250cm9sKHpkZXZfdCogZGV2LCBaTV9IQUxfQU5JX0NNRCBjbWQsIGludCBwYXJhbSkKK3sKKyNkZWZpbmUgTihhKSAoc2l6ZW9mKGEpL3NpemVvZihhWzBdKSkKKyAgICB0eXBlZGVmIHMzMl90IFRBQkxFW107CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzdHJ1Y3QgenNIcFByaXYgKkhwUHJpdiA9IChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGU7CisKKyAgICBzdHJ1Y3QgenNBbmlTdGF0ZSAqYW5pU3RhdGUgPSBIcFByaXYtPmN1cmFuaTsKKworICAgIHN3aXRjaCAoY21kKQorICAgIHsKKyAgICBjYXNlIFpNX0hBTF9BTklfTk9JU0VfSU1NVU5JVFlfTEVWRUw6CisgICAgeworICAgICAgICB1MzJfdCBsZXZlbCA9IHBhcmFtOworCisgICAgICAgIGlmIChsZXZlbCA+PSBOKEhwUHJpdi0+dG90YWxTaXplRGVzaXJlZCkpCisgICAgICAgIHsKKyAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJsZXZlbCBvdXQgb2YgcmFuZ2UsIGRlc2lyZWQgbGV2ZWwgOiAiLCBsZXZlbCk7CisgICAgICAgICAgem1fZGVidWdfbXNnMSgibWF4IGxldmVsIDogIiwgTihIcFByaXYtPnRvdGFsU2l6ZURlc2lyZWQpKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIEFSX1BIWV9ERVNJUkVEX1NaLAorICAgICAgICAgICAgICAgIChIcFByaXYtPnJlZ1BIWURlc2lyZWRTWiAmIH5BUl9QSFlfREVTSVJFRF9TWl9UT1RfREVTKQorICAgICAgICAgICAgICAgIHwgKChIcFByaXYtPnRvdGFsU2l6ZURlc2lyZWRbbGV2ZWxdIDw8IEFSX1BIWV9ERVNJUkVEX1NaX1RPVF9ERVNfUykKKyAgICAgICAgICAgICAgICAmIEFSX1BIWV9ERVNJUkVEX1NaX1RPVF9ERVMpKTsKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBBUl9QSFlfQUdDX0NUTDEsCisgICAgICAgICAgICAgICAgKEhwUHJpdi0+cmVnUEhZQWdjQ3RsMSAmIH5BUl9QSFlfQUdDX0NUTDFfQ09BUlNFX0xPVykKKyAgICAgICAgICAgICAgICB8ICgoSHBQcml2LT5jb2Fyc2VMb3dbbGV2ZWxdIDw8IEFSX1BIWV9BR0NfQ1RMMV9DT0FSU0VfTE9XX1MpCisgICAgICAgICAgICAgICAgJiBBUl9QSFlfQUdDX0NUTDFfQ09BUlNFX0xPVykpOworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIEFSX1BIWV9BR0NfQ1RMMSwKKyAgICAgICAgICAgICAgICAoSHBQcml2LT5yZWdQSFlBZ2NDdGwxICYgfkFSX1BIWV9BR0NfQ1RMMV9DT0FSU0VfSElHSCkKKyAgICAgICAgICAgICAgICB8ICgoSHBQcml2LT5jb2Fyc2VIaWdoW2xldmVsXSA8PCBBUl9QSFlfQUdDX0NUTDFfQ09BUlNFX0hJR0hfUykKKyAgICAgICAgICAgICAgICAmIEFSX1BIWV9BR0NfQ1RMMV9DT0FSU0VfSElHSCkpOworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIEFSX1BIWV9GSU5EX1NJRywKKyAgICAgICAgICAgICAgICAoSHBQcml2LT5yZWdQSFlGaW5kU2lnICYgfkFSX1BIWV9GSU5EX1NJR19GSVJQV1IpCisgICAgICAgICAgICAgICAgfCAoKEhwUHJpdi0+ZmlycHdyW2xldmVsXSA8PCBBUl9QSFlfRklORF9TSUdfRklSUFdSX1MpCisgICAgICAgICAgICAgICAgJiBBUl9QSFlfRklORF9TSUdfRklSUFdSKSk7CisgICAgICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisKKyAgICAgICAgaWYgKGxldmVsID4gYW5pU3RhdGUtPm5vaXNlSW1tdW5pdHlMZXZlbCkKKyAgICAgICAgICAgIEhwUHJpdi0+c3RhdHMuYXN0X2FuaV9uaXVwKys7CisgICAgICAgIGVsc2UgaWYgKGxldmVsIDwgYW5pU3RhdGUtPm5vaXNlSW1tdW5pdHlMZXZlbCkKKyAgICAgICAgICAgIEhwUHJpdi0+c3RhdHMuYXN0X2FuaV9uaWRvd24rKzsKKyAgICAgICAgYW5pU3RhdGUtPm5vaXNlSW1tdW5pdHlMZXZlbCA9ICh1OF90KWxldmVsOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBaTV9IQUxfQU5JX09GRE1fV0VBS19TSUdOQUxfREVURUNUSU9OOgorICAgIHsKKyAgICAgICAgY29uc3QgVEFCTEUgbTFUaHJlc2hMb3cgICA9IHsgMTI3LCAgIDUwIH07CisgICAgICAgIGNvbnN0IFRBQkxFIG0yVGhyZXNoTG93ICAgPSB7IDEyNywgICA0MCB9OworICAgICAgICBjb25zdCBUQUJMRSBtMVRocmVzaCAgICAgID0geyAxMjcsIDB4NGQgfTsKKyAgICAgICAgY29uc3QgVEFCTEUgbTJUaHJlc2ggICAgICA9IHsgMTI3LCAweDQwIH07CisgICAgICAgIGNvbnN0IFRBQkxFIG0yQ291bnRUaHIgICAgPSB7ICAzMSwgICAxNiB9OworICAgICAgICBjb25zdCBUQUJMRSBtMkNvdW50VGhyTG93ID0geyAgNjMsICAgNDggfTsKKyAgICAgICAgdTMyX3Qgb24gPSBwYXJhbSA/IDEgOiAwOworCisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgQVJfUEhZX1NGQ09SUl9MT1csCisgICAgICAgICAgICAgICAgKEhwUHJpdi0+cmVnUEhZU2Zjb3JyTG93ICYgfkFSX1BIWV9TRkNPUlJfTE9XX00xX1RIUkVTSF9MT1cpCisgICAgICAgICAgICAgICAgfCAoKG0xVGhyZXNoTG93W29uXSA8PCBBUl9QSFlfU0ZDT1JSX0xPV19NMV9USFJFU0hfTE9XX1MpCisgICAgICAgICAgICAgICAgJiBBUl9QSFlfU0ZDT1JSX0xPV19NMV9USFJFU0hfTE9XKSk7CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgQVJfUEhZX1NGQ09SUl9MT1csCisgICAgICAgICAgICAgICAgKEhwUHJpdi0+cmVnUEhZU2Zjb3JyTG93ICYgfkFSX1BIWV9TRkNPUlJfTE9XX00yX1RIUkVTSF9MT1cpCisgICAgICAgICAgICAgICAgfCAoKG0yVGhyZXNoTG93W29uXSA8PCBBUl9QSFlfU0ZDT1JSX0xPV19NMl9USFJFU0hfTE9XX1MpCisgICAgICAgICAgICAgICAgJiBBUl9QSFlfU0ZDT1JSX0xPV19NMl9USFJFU0hfTE9XKSk7CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgQVJfUEhZX1NGQ09SUiwKKyAgICAgICAgICAgICAgICAoSHBQcml2LT5yZWdQSFlTZmNvcnIgJiB+QVJfUEhZX1NGQ09SUl9NMV9USFJFU0gpCisgICAgICAgICAgICAgICAgfCAoKG0xVGhyZXNoW29uXSA8PCBBUl9QSFlfU0ZDT1JSX00xX1RIUkVTSF9TKQorICAgICAgICAgICAgICAgICYgQVJfUEhZX1NGQ09SUl9NMV9USFJFU0gpKTsKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBBUl9QSFlfU0ZDT1JSLAorICAgICAgICAgICAgICAgIChIcFByaXYtPnJlZ1BIWVNmY29yciAmIH5BUl9QSFlfU0ZDT1JSX00yX1RIUkVTSCkKKyAgICAgICAgICAgICAgICB8ICgobTJUaHJlc2hbb25dIDw8IEFSX1BIWV9TRkNPUlJfTTJfVEhSRVNIX1MpCisgICAgICAgICAgICAgICAgJiBBUl9QSFlfU0ZDT1JSX00yX1RIUkVTSCkpOworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIEFSX1BIWV9TRkNPUlIsCisgICAgICAgICAgICAgICAgKEhwUHJpdi0+cmVnUEhZU2Zjb3JyICYgfkFSX1BIWV9TRkNPUlJfTTJDT1VOVF9USFIpCisgICAgICAgICAgICAgICAgfCAoKG0yQ291bnRUaHJbb25dIDw8IEFSX1BIWV9TRkNPUlJfTTJDT1VOVF9USFJfUykKKyAgICAgICAgICAgICAgICAmIEFSX1BIWV9TRkNPUlJfTTJDT1VOVF9USFIpKTsKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBBUl9QSFlfU0ZDT1JSX0xPVywKKyAgICAgICAgICAgICAgICAoSHBQcml2LT5yZWdQSFlTZmNvcnJMb3cgJiB+QVJfUEhZX1NGQ09SUl9MT1dfTTJDT1VOVF9USFJfTE9XKQorICAgICAgICAgICAgICAgIHwgKChtMkNvdW50VGhyTG93W29uXSA8PCBBUl9QSFlfU0ZDT1JSX0xPV19NMkNPVU5UX1RIUl9MT1dfUykKKyAgICAgICAgICAgICAgICAmIEFSX1BIWV9TRkNPUlJfTE9XX00yQ09VTlRfVEhSX0xPVykpOworCisgICAgICAgIGlmIChvbikKKyAgICAgICAgeworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBBUl9QSFlfU0ZDT1JSX0xPVywKKyAgICAgICAgICAgICAgICAgICAgSHBQcml2LT5yZWdQSFlTZmNvcnJMb3cgfCBBUl9QSFlfU0ZDT1JSX0xPV19VU0VfU0VMRl9DT1JSX0xPVyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIEFSX1BIWV9TRkNPUlJfTE9XLAorICAgICAgICAgICAgICAgICAgICBIcFByaXYtPnJlZ1BIWVNmY29yckxvdyAmIH5BUl9QSFlfU0ZDT1JSX0xPV19VU0VfU0VMRl9DT1JSX0xPVyk7CisgICAgICAgIH0KKyAgICAgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKyAgICAgICAgaWYgKCFvbiAhPSBhbmlTdGF0ZS0+b2ZkbVdlYWtTaWdEZXRlY3RPZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChvbikKKyAgICAgICAgICAgICAgICBIcFByaXYtPnN0YXRzLmFzdF9hbmlfb2ZkbW9uKys7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgSHBQcml2LT5zdGF0cy5hc3RfYW5pX29mZG1vZmYrKzsKKyAgICAgICAgICAgIGFuaVN0YXRlLT5vZmRtV2Vha1NpZ0RldGVjdE9mZiA9ICFvbjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBaTV9IQUxfQU5JX0NDS19XRUFLX1NJR05BTF9USFI6CisgICAgeworICAgICAgICBjb25zdCBUQUJMRSB3ZWFrU2lnVGhyQ2NrID0geyA4LCA2IH07CisgICAgICAgIHUzMl90IGhpZ2ggPSBwYXJhbSA/IDEgOiAwOworCisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgQVJfUEhZX0NDS19ERVRFQ1QsCisgICAgICAgICAgICAgICAgKEhwUHJpdi0+cmVnUEhZQ2NrRGV0ZWN0ICYgfkFSX1BIWV9DQ0tfREVURUNUX1dFQUtfU0lHX1RIUl9DQ0spCisgICAgICAgICAgICAgICAgfCAoKHdlYWtTaWdUaHJDY2tbaGlnaF0gPDwgQVJfUEhZX0NDS19ERVRFQ1RfV0VBS19TSUdfVEhSX0NDS19TKQorICAgICAgICAgICAgICAgICYgQVJfUEhZX0NDS19ERVRFQ1RfV0VBS19TSUdfVEhSX0NDSykpOworICAgICAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworICAgICAgICBpZiAoaGlnaCAhPSBhbmlTdGF0ZS0+Y2NrV2Vha1NpZ1RocmVzaG9sZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGhpZ2gpCisgICAgICAgICAgICAgICAgSHBQcml2LT5zdGF0cy5hc3RfYW5pX2Nja2hpZ2grKzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBIcFByaXYtPnN0YXRzLmFzdF9hbmlfY2NrbG93Kys7CisgICAgICAgICAgICBhbmlTdGF0ZS0+Y2NrV2Vha1NpZ1RocmVzaG9sZCA9ICh1OF90KWhpZ2g7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgWk1fSEFMX0FOSV9GSVJTVEVQX0xFVkVMOgorICAgIHsKKyAgICAgICAgY29uc3QgVEFCTEUgZmlyc3RlcCA9IHsgMCwgNCwgOCB9OworICAgICAgICB1MzJfdCBsZXZlbCA9IHBhcmFtOworCisgICAgICAgIGlmIChsZXZlbCA+PSBOKGZpcnN0ZXApKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJsZXZlbCBvdXQgb2YgcmFuZ2UsIGRlc2lyZWQgbGV2ZWwgOiAiLCBsZXZlbCk7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJtYXggbGV2ZWwgOiAiLCBOKGZpcnN0ZXApKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIEFSX1BIWV9GSU5EX1NJRywKKyAgICAgICAgICAgICAgICAoSHBQcml2LT5yZWdQSFlGaW5kU2lnICYgfkFSX1BIWV9GSU5EX1NJR19GSVJTVEVQKQorICAgICAgICAgICAgICAgIHwgKChmaXJzdGVwW2xldmVsXSA8PCBBUl9QSFlfRklORF9TSUdfRklSU1RFUF9TKQorICAgICAgICAgICAgICAgICYgQVJfUEhZX0ZJTkRfU0lHX0ZJUlNURVApKTsKKyAgICAgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKyAgICAgICAgaWYgKGxldmVsID4gYW5pU3RhdGUtPmZpcnN0ZXBMZXZlbCkKKyAgICAgICAgICAgIEhwUHJpdi0+c3RhdHMuYXN0X2FuaV9zdGVwdXArKzsKKyAgICAgICAgZWxzZSBpZiAobGV2ZWwgPCBhbmlTdGF0ZS0+Zmlyc3RlcExldmVsKQorICAgICAgICAgICAgSHBQcml2LT5zdGF0cy5hc3RfYW5pX3N0ZXBkb3duKys7CisgICAgICAgIGFuaVN0YXRlLT5maXJzdGVwTGV2ZWwgPSAodThfdClsZXZlbDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgWk1fSEFMX0FOSV9TUFVSX0lNTVVOSVRZX0xFVkVMOgorICAgIHsKKyAgICAgICAgY29uc3QgVEFCTEUgY3ljcHdyVGhyMSA9IHsgMiwgNCwgNiwgOCwgMTAsIDEyLCAxNCwgMTYgfTsKKyAgICAgICAgdTMyX3QgbGV2ZWwgPSBwYXJhbTsKKworICAgICAgICBpZiAobGV2ZWwgPj0gTihjeWNwd3JUaHIxKSkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgibGV2ZWwgb3V0IG9mIHJhbmdlLCBkZXNpcmVkIGxldmVsIDogIiwgbGV2ZWwpOworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgibWF4IGxldmVsIDogIiwgTihjeWNwd3JUaHIxKSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBBUl9QSFlfVElNSU5HNSwKKyAgICAgICAgICAgICAgICAoSHBQcml2LT5yZWdQSFlUaW1pbmc1ICYgfkFSX1BIWV9USU1JTkc1X0NZQ1BXUl9USFIxKQorICAgICAgICAgICAgICAgIHwgKChjeWNwd3JUaHIxW2xldmVsXSA8PCBBUl9QSFlfVElNSU5HNV9DWUNQV1JfVEhSMV9TKQorICAgICAgICAgICAgICAgICYgQVJfUEhZX1RJTUlORzVfQ1lDUFdSX1RIUjEpKTsKKyAgICAgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKyAgICAgICAgaWYgKGxldmVsID4gYW5pU3RhdGUtPnNwdXJJbW11bml0eUxldmVsKQorICAgICAgICAgICAgSHBQcml2LT5zdGF0cy5hc3RfYW5pX3NwdXJ1cCsrOworICAgICAgICBlbHNlIGlmIChsZXZlbCA8IGFuaVN0YXRlLT5zcHVySW1tdW5pdHlMZXZlbCkKKyAgICAgICAgICAgIEhwUHJpdi0+c3RhdHMuYXN0X2FuaV9zcHVyZG93bisrOworICAgICAgICBhbmlTdGF0ZS0+c3B1ckltbXVuaXR5TGV2ZWwgPSAodThfdClsZXZlbDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgWk1fSEFMX0FOSV9QUkVTRU5UOgorICAgICAgICBicmVhazsKKyNpZmRlZiBBSF9QUklWQVRFX0RJQUcKKyAgICBjYXNlIFpNX0hBTF9BTklfTU9ERToKKyAgICAgICAgaWYgKHBhcmFtID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIEhwUHJpdi0+cHJvY1BoeUVyciAmPSB+Wk1fSEFMX1BST0NFU1NfQU5JOworICAgICAgICAgICAgLyogVHVybiBvZmYgSFcgY291bnRlcnMgaWYgd2UgaGF2ZSB0aGVtICovCisgICAgICAgICAgICB6ZkhwQW5pRGV0YWNoKGRldik7CisgICAgICAgICAgICAvL3pmSHBTZXRSeEZpbHRlcihkZXYsIHpmSHBHZXRSeEZpbHRlcihkZXYpICZ+IEhBTF9SWF9GSUxURVJfUEhZRVJSKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsgICAgICAgICAgIC8qIG5vcm1hbC9hdXRvIG1vZGUgKi8KKyAgICAgICAgICAgIEhwUHJpdi0+cHJvY1BoeUVyciB8PSBaTV9IQUxfUFJPQ0VTU19BTkk7CisgICAgICAgICAgICBpZiAoSHBQcml2LT5oYXNId1BoeUNvdW50ZXJzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vemZIcFNldFJ4RmlsdGVyKGRldiwgemZIcEdldFJ4RmlsdGVyKGRldikgJn4gSEFMX1JYX0ZJTFRFUl9QSFlFUlIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vemZIcFNldFJ4RmlsdGVyKGRldiwgemZIcEdldFJ4RmlsdGVyKGRldikgfCBIQUxfUlhfRklMVEVSX1BIWUVSUik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBaTV9IQUxfQU5JX1BIWUVSUl9SRVNFVDoKKyAgICAgICAgSHBQcml2LT5zdGF0cy5hc3RfYW5pX29mZG1lcnJzID0gMDsKKyAgICAgICAgSHBQcml2LT5zdGF0cy5hc3RfYW5pX2Nja2VycnMgPSAwOworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBBSF9QUklWQVRFX0RJQUcgKi8KKyAgICBkZWZhdWx0OgorICAgICAgICB6bV9kZWJ1Z19tc2cxKCJpbnZhbGlkIGNtZCAiLCBjbWQpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHJldHVybiBUUlVFOworI3VuZGVmICBOCit9CisKK3ZvaWQgemZIcEFuaVJlc3RhcnQoemRldl90KiBkZXYpCit7CisgICAgc3RydWN0IHpzQW5pU3RhdGUgKmFuaVN0YXRlOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc3RydWN0IHpzSHBQcml2ICpIcFByaXYgPSAoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlOworCisgICAgYW5pU3RhdGUgPSBIcFByaXYtPmN1cmFuaTsKKworICAgIGFuaVN0YXRlLT5saXN0ZW5UaW1lID0gMDsKKyAgICBpZiAoSHBQcml2LT5oYXNId1BoeUNvdW50ZXJzKQorICAgIHsKKyAgICAgICAgLy9pZiAoYW5pU3RhdGUtPm9mZG1UcmlnSGlnaCA+IEFSX1BIWV9DT1VOVE1BWCkKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIGFuaVN0YXRlLT5vZmRtUGh5RXJyQmFzZSA9IDA7CisgICAgICAgIC8vICAgIHptX2RlYnVnX21zZzAoIk9GRE0gVHJpZ2dlciBpcyB0b28gaGlnaCBmb3IgaHcgY291bnRlcnMiKTsKKyAgICAgICAgLy99CisgICAgICAgIC8vZWxzZQorICAgICAgICAvLyAgICBhbmlTdGF0ZS0+b2ZkbVBoeUVyckJhc2UgPSBBUl9QSFlfQ09VTlRNQVggLSBhbmlTdGF0ZS0+b2ZkbVRyaWdIaWdoOworICAgICAgICAvL2lmIChhbmlTdGF0ZS0+Y2NrVHJpZ0hpZ2ggPiBBUl9QSFlfQ09VTlRNQVgpCisgICAgICAgIC8veworICAgICAgICAvLyAgICBhbmlTdGF0ZS0+Y2NrUGh5RXJyQmFzZSA9IDA7CisgICAgICAgIC8vICAgIHptX2RlYnVnX21zZzAoIkNDSyBUcmlnZ2VyIGlzIHRvbyBoaWdoIGZvciBodyBjb3VudGVycyIpOworICAgICAgICAvL30KKyAgICAgICAgLy9lbHNlCisgICAgICAgIC8vICAgIGFuaVN0YXRlLT5jY2tQaHlFcnJCYXNlID0gQVJfUEhZX0NPVU5UTUFYIC0gYW5pU3RhdGUtPmNja1RyaWdIaWdoOworICAgICAgICAvL3ptX2RlYnVnX21zZzIoIldyaXRpbmcgb2ZkbWJhc2UgPSAweCIsIGFuaVN0YXRlLT5vZmRtUGh5RXJyQmFzZSk7CisgICAgICAgIC8vem1fZGVidWdfbXNnMigiV3JpdGluZyBjY2tiYXNlID0gMHgiLCBhbmlTdGF0ZS0+Y2NrUGh5RXJyQmFzZSk7CisgICAgICAgIC8vT1NfUkVHX1dSSVRFKGFoLCBBUl9QSFlfRVJSXzEsIGFuaVN0YXRlLT5vZmRtUGh5RXJyQmFzZSk7CisgICAgICAgIC8vT1NfUkVHX1dSSVRFKGFoLCBBUl9QSFlfRVJSXzIsIGFuaVN0YXRlLT5jY2tQaHlFcnJCYXNlKTsKKyAgICAgICAgLy9PU19SRUdfV1JJVEUoYWgsIEFSX1BIWV9FUlJfTUFTS18xLCBBUl9QSFlfRVJSX09GRE1fVElNSU5HKTsKKyAgICAgICAgLy9PU19SRUdfV1JJVEUoYWgsIEFSX1BIWV9FUlJfTUFTS18yLCBBUl9QSFlfRVJSX0NDS19USU1JTkcpOworICAgICAgICBhbmlTdGF0ZS0+b2ZkbVBoeUVyckJhc2UgPSAwOworICAgICAgICBhbmlTdGF0ZS0+Y2NrUGh5RXJyQmFzZSA9IDA7CisgICAgfQorICAgIGFuaVN0YXRlLT5vZmRtUGh5RXJyQ291bnQgPSAwOworICAgIGFuaVN0YXRlLT5jY2tQaHlFcnJDb3VudCA9IDA7Cit9CisKK3ZvaWQgemZIcEFuaU9mZG1FcnJUcmlnZ2VyKHpkZXZfdCogZGV2KQoreworICAgIHN0cnVjdCB6c0FuaVN0YXRlICphbmlTdGF0ZTsKKyAgICBzMzJfdCByc3NpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc3RydWN0IHpzSHBQcml2ICpIcFByaXYgPSAoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlOworCisgICAgLy9IQUxBU1NFUlQoY2hhbiAhPSBOVUxMKTsKKworICAgIGlmICgoSHBQcml2LT5wcm9jUGh5RXJyICYgWk1fSEFMX1BST0NFU1NfQU5JKSA9PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICBhbmlTdGF0ZSA9IEhwUHJpdi0+Y3VyYW5pOworICAgIC8qIEZpcnN0LCByYWlzZSBub2lzZSBpbW11bml0eSBsZXZlbCwgdXAgdG8gbWF4ICovCisgICAgaWYgKGFuaVN0YXRlLT5ub2lzZUltbXVuaXR5TGV2ZWwgPCBaTV9IQUxfTk9JU0VfSU1NVU5FX01BWCkKKyAgICB7CisgICAgICAgIHpmSHBBbmlDb250cm9sKGRldiwgWk1fSEFMX0FOSV9OT0lTRV9JTU1VTklUWV9MRVZFTCwgYW5pU3RhdGUtPm5vaXNlSW1tdW5pdHlMZXZlbCArIDEpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8qIHRoZW4sIHJhaXNlIHNwdXIgaW1tdW5pdHkgbGV2ZWwsIHVwIHRvIG1heCAqLworICAgIGlmIChhbmlTdGF0ZS0+c3B1ckltbXVuaXR5TGV2ZWwgPCBaTV9IQUxfU1BVUl9JTU1VTkVfTUFYKQorICAgIHsKKyAgICAgICAgemZIcEFuaUNvbnRyb2woZGV2LCBaTV9IQUxfQU5JX1NQVVJfSU1NVU5JVFlfTEVWRUwsIGFuaVN0YXRlLT5zcHVySW1tdW5pdHlMZXZlbCArIDEpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHJzc2kgPSBCRUFDT05fUlNTSShkZXYpOworICAgIGlmIChyc3NpID4gYW5pU3RhdGUtPnJzc2lUaHJIaWdoKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQmVhY29uIHJzc2kgaXMgaGlnaCwgY2FuIHR1cm4gb2ZmIG9mZG0gd2VhayBzaWcgZGV0ZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCFhbmlTdGF0ZS0+b2ZkbVdlYWtTaWdEZXRlY3RPZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmSHBBbmlDb250cm9sKGRldiwgWk1fSEFMX0FOSV9PRkRNX1dFQUtfU0lHTkFMX0RFVEVDVElPTiwgRkFMU0UpOworICAgICAgICAgICAgemZIcEFuaUNvbnRyb2woZGV2LCBaTV9IQUxfQU5JX1NQVVJfSU1NVU5JVFlfTEVWRUwsIDApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8qCisgICAgICAgICAqIElmIHdlYWsgc2lnIGRldGVjdCBpcyBhbHJlYWR5IG9mZiwgYXMgbGFzdCByZXNvcnQsIHJhaXNlCisgICAgICAgICAqIGZpcnN0IHN0ZXAgbGV2ZWwKKyAgICAgICAgICovCisgICAgICAgIGlmIChhbmlTdGF0ZS0+Zmlyc3RlcExldmVsIDwgWk1fSEFMX0ZJUlNUX1NURVBfTUFYKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkhwQW5pQ29udHJvbChkZXYsIFpNX0hBTF9BTklfRklSU1RFUF9MRVZFTCwgYW5pU3RhdGUtPmZpcnN0ZXBMZXZlbCArIDEpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHJzc2kgPiBhbmlTdGF0ZS0+cnNzaVRockxvdykKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIEJlYWNvbiByc3NpIGluIG1pZCByYW5nZSwgbmVlZCBvZmRtIHdlYWsgc2lnbmFsIGRldGVjdCwKKyAgICAgICAgICogYnV0IHdlIGNhbiByYWlzZSBmaXJzdHN0ZXBMZXZlbAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGFuaVN0YXRlLT5vZmRtV2Vha1NpZ0RldGVjdE9mZikKKyAgICAgICAgICAgIHpmSHBBbmlDb250cm9sKGRldiwgWk1fSEFMX0FOSV9PRkRNX1dFQUtfU0lHTkFMX0RFVEVDVElPTiwgVFJVRSk7CisgICAgICAgIGlmIChhbmlTdGF0ZS0+Zmlyc3RlcExldmVsIDwgWk1fSEFMX0ZJUlNUX1NURVBfTUFYKQorICAgICAgICAgICAgemZIcEFuaUNvbnRyb2woZGV2LCBaTV9IQUxfQU5JX0ZJUlNURVBfTEVWRUwsIGFuaVN0YXRlLT5maXJzdGVwTGV2ZWwgKyAxKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBCZWFjb24gcnNzaSBpcyBsb3csIGlmIGluIDExYi9nIG1vZGUsIHR1cm4gb2ZmIG9mZG0KKyAgICAgICAgICogd2VhayBzaWduIGRldGN0aW9uIGFuZCB6ZXJvIGZpcnN0ZXBMZXZlbCB0byBtYXhpbWl6ZQorICAgICAgICAgKiBDQ0sgc2Vuc2l0aXZpdHkKKyAgICAgICAgICovCisgICAgICAgIGlmICh3ZC0+ZnJlcXVlbmN5IDwgMzAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFhbmlTdGF0ZS0+b2ZkbVdlYWtTaWdEZXRlY3RPZmYpCisgICAgICAgICAgICAgICAgemZIcEFuaUNvbnRyb2woZGV2LCBaTV9IQUxfQU5JX09GRE1fV0VBS19TSUdOQUxfREVURUNUSU9OLCBGQUxTRSk7CisgICAgICAgICAgICBpZiAoYW5pU3RhdGUtPmZpcnN0ZXBMZXZlbCA+IDApCisgICAgICAgICAgICAgICAgemZIcEFuaUNvbnRyb2woZGV2LCBaTV9IQUxfQU5JX0ZJUlNURVBfTEVWRUwsIDApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIHpmSHBBbmlDY2tFcnJUcmlnZ2VyKHpkZXZfdCogZGV2KQoreworICAgIHN0cnVjdCB6c0FuaVN0YXRlICphbmlTdGF0ZTsKKyAgICBzMzJfdCByc3NpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc3RydWN0IHpzSHBQcml2ICpIcFByaXYgPSAoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlOworCisgICAgLy9IQUxBU1NFUlQoY2hhbiAhPSBOVUxMKTsKKworICAgIGlmICgoSHBQcml2LT5wcm9jUGh5RXJyICYgWk1fSEFMX1BST0NFU1NfQU5JKSA9PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICAvKiBmaXJzdCwgcmFpc2Ugbm9pc2UgaW1tdW5pdHkgbGV2ZWwsIHVwIHRvIG1heCAqLworICAgIGFuaVN0YXRlID0gSHBQcml2LT5jdXJhbmk7CisgICAgaWYgKGFuaVN0YXRlLT5ub2lzZUltbXVuaXR5TGV2ZWwgPCBaTV9IQUxfTk9JU0VfSU1NVU5FX01BWCkKKyAgICB7CisgICAgICAgIHpmSHBBbmlDb250cm9sKGRldiwgWk1fSEFMX0FOSV9OT0lTRV9JTU1VTklUWV9MRVZFTCwKKyAgICAgICAgICAgICAgICAgYW5pU3RhdGUtPm5vaXNlSW1tdW5pdHlMZXZlbCArIDEpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHJzc2kgPSBCRUFDT05fUlNTSShkZXYpOworICAgIGlmIChyc3NpID4gIGFuaVN0YXRlLT5yc3NpVGhyTG93KQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQmVhY29uIHNpZ25hbCBpbiBtaWQgYW5kIGhpZ2ggcmFuZ2UsIHJhaXNlIGZpcnN0ZXBsZXZlbC4KKyAgICAgICAgICovCisgICAgICAgIGlmIChhbmlTdGF0ZS0+Zmlyc3RlcExldmVsIDwgWk1fSEFMX0ZJUlNUX1NURVBfTUFYKQorICAgICAgICAgICAgemZIcEFuaUNvbnRyb2woZGV2LCBaTV9IQUxfQU5JX0ZJUlNURVBfTEVWRUwsIGFuaVN0YXRlLT5maXJzdGVwTGV2ZWwgKyAxKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQmVhY29uIHJzc2kgaXMgbG93LCB6ZXJvIGZpcnN0ZXBMZXZlbCB0byBtYXhpbWl6ZQorICAgICAgICAgKiBDQ0sgc2Vuc2l0aXZpdHkuCisgICAgICAgICAqLworICAgICAgICBpZiAod2QtPmZyZXF1ZW5jeSA8IDMwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChhbmlTdGF0ZS0+Zmlyc3RlcExldmVsID4gMCkKKyAgICAgICAgICAgICAgICB6ZkhwQW5pQ29udHJvbChkZXYsIFpNX0hBTF9BTklfRklSU1RFUF9MRVZFTCwgMCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgemZIcEFuaUxvd2VySW1tdW5pdHkoemRldl90KiBkZXYpCit7CisgICAgc3RydWN0IHpzQW5pU3RhdGUgKmFuaVN0YXRlOworICAgIHMzMl90IHJzc2k7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzdHJ1Y3QgenNIcFByaXYgKkhwUHJpdiA9IChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGU7CisKKyAgICBhbmlTdGF0ZSA9IEhwUHJpdi0+Y3VyYW5pOworCisgICAgcnNzaSA9IEJFQUNPTl9SU1NJKGRldik7CisgICAgaWYgKHJzc2kgPiBhbmlTdGF0ZS0+cnNzaVRockhpZ2gpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBCZWFjb24gc2lnbmFsIGlzIGhpZ2gsIGxlYXZlIG9mZG0gd2VhayBzaWduYWwgZGV0ZWN0aW9uIG9mZgorICAgICAgICAgKiBvciBpdCBtYXkgb3NjaWxsYXRlLiBMZXQgaXQgZmFsbCB0aHJvdWdoLgorICAgICAgICAgKi8KKyAgICB9CisgICAgZWxzZSBpZiAocnNzaSA+IGFuaVN0YXRlLT5yc3NpVGhyTG93KQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQmVhY29uIHJzc2kgaW4gbWlkIHJhbmdlLCB0dXJuIG9uIG9mZG0gd2VhayBzaWduYWwKKyAgICAgICAgICogZGV0ZWN0aW9uIG9yIGxvd2VyIGZpcnN0IHN0ZXAgbGV2ZWwuCisgICAgICAgICAqLworICAgICAgICBpZiAoYW5pU3RhdGUtPm9mZG1XZWFrU2lnRGV0ZWN0T2ZmKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkhwQW5pQ29udHJvbChkZXYsIFpNX0hBTF9BTklfT0ZETV9XRUFLX1NJR05BTF9ERVRFQ1RJT04sIFRSVUUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChhbmlTdGF0ZS0+Zmlyc3RlcExldmVsID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgemZIcEFuaUNvbnRyb2woZGV2LCBaTV9IQUxfQU5JX0ZJUlNURVBfTEVWRUwsIGFuaVN0YXRlLT5maXJzdGVwTGV2ZWwgLSAxKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBCZWFjb24gcnNzaSBpcyBsb3csIHJlZHVjZSBmaXJzdCBzdGVwIGxldmVsLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGFuaVN0YXRlLT5maXJzdGVwTGV2ZWwgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkhwQW5pQ29udHJvbChkZXYsIFpNX0hBTF9BTklfRklSU1RFUF9MRVZFTCwgYW5pU3RhdGUtPmZpcnN0ZXBMZXZlbCAtIDEpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIC8qIHRoZW4gbG93ZXIgc3B1ciBpbW11bml0eSBsZXZlbCwgZG93biB0byB6ZXJvICovCisgICAgaWYgKGFuaVN0YXRlLT5zcHVySW1tdW5pdHlMZXZlbCA+IDApCisgICAgeworICAgICAgICB6ZkhwQW5pQ29udHJvbChkZXYsIFpNX0hBTF9BTklfU1BVUl9JTU1VTklUWV9MRVZFTCwgYW5pU3RhdGUtPnNwdXJJbW11bml0eUxldmVsIC0gMSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLyoKKyAgICAgKiBpZiBhbGwgZWxzZSBmYWlscywgbG93ZXIgbm9pc2UgaW1tdW5pdHkgbGV2ZWwgZG93biB0byBhIG1pbiB2YWx1ZQorICAgICAqIHplcm8gZm9yIG5vdworICAgICAqLworICAgIGlmIChhbmlTdGF0ZS0+bm9pc2VJbW11bml0eUxldmVsID4gMCkKKyAgICB7CisgICAgICAgIHpmSHBBbmlDb250cm9sKGRldiwgWk1fSEFMX0FOSV9OT0lTRV9JTU1VTklUWV9MRVZFTCwgYW5pU3RhdGUtPm5vaXNlSW1tdW5pdHlMZXZlbCAtIDEpOworICAgICAgICByZXR1cm47CisgICAgfQorfQorCisjZGVmaW5lIENMT0NLX1JBVEUgNDQwMDAgICAgLyogWFhYIHVzZSBtYWNfdXNlYyBvciBzaW1pbGFyICovCisvKiBjb252ZXJ0IEhXIGNvdW50ZXIgdmFsdWVzIHRvIG1zIHVzaW5nIDExZyBjbG9jayByYXRlLCBnb285ZCBlbm91Z2gKKyAgIGZvciAxMWEgYW5kIFR1cmJvICovCisKKy8qCisgKiBSZXR1cm4gYW4gYXBwcm94aW1hdGlvbiBvZiB0aGUgdGltZSBzcGVudCBgYGxpc3RlbmluZycnIGJ5CisgKiBkZWR1Y3RpbmcgdGhlIGN5Y2xlcyBzcGVudCB0eCdpbmcgYW5kIHJ4J2luZyBmcm9tIHRoZSB0b3RhbAorICogY3ljbGUgY291bnQgc2luY2Ugb3VyIGxhc3QgY2FsbC4gIEEgcmV0dXJuIHZhbHVlIDwwIGluZGljYXRlcworICogYW4gaW52YWxpZC9pbmNvbnNpc3RlbnQgdGltZS4KKyAqLworczMyX3QgemZIcEFuaUdldExpc3RlblRpbWUoemRldl90KiBkZXYpCit7CisgICAgc3RydWN0IHpzQW5pU3RhdGUgKmFuaVN0YXRlOworICAgIHUzMl90IHR4RnJhbWVDb3VudCwgcnhGcmFtZUNvdW50LCBjeWNsZUNvdW50OworICAgIHMzMl90IGxpc3RlblRpbWU7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzdHJ1Y3QgenNIcFByaXYgKkhwUHJpdiA9IChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGU7CisKKyAgICB0eEZyYW1lQ291bnQgPSAwOy8vT1NfUkVHX1JFQUQoYWgsIEFSX1RGQ05UKTsKKyAgICByeEZyYW1lQ291bnQgPSAwOy8vT1NfUkVHX1JFQUQoYWgsIEFSX1JGQ05UKTsKKyAgICBjeWNsZUNvdW50ID0gMDsvL09TX1JFR19SRUFEKGFoLCBBUl9DQ0NOVCk7CisKKyAgICBhbmlTdGF0ZSA9IEhwUHJpdi0+Y3VyYW5pOworICAgIGlmIChhbmlTdGF0ZS0+Y3ljbGVDb3VudCA9PSAwIHx8IGFuaVN0YXRlLT5jeWNsZUNvdW50ID4gY3ljbGVDb3VudCkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIEN5Y2xlIGNvdW50ZXIgd3JhcCAob3IgaW5pdGlhbCBjYWxsKTsgaXQncyBub3QgcG9zc2libGUKKyAgICAgICAgICogdG8gYWNjdXJhdGVseSBjYWxjdWxhdGUgYSB2YWx1ZSBiZWNhdXNlIHRoZSByZWdpc3RlcnMKKyAgICAgICAgICogcmlnaHQgc2hpZnQgcmF0aGVyIHRoYW4gd3JhcC0tc28gcHVudCBhbmQgcmV0dXJuIDAuCisgICAgICAgICAqLworICAgICAgICBsaXN0ZW5UaW1lID0gMDsKKyAgICAgICAgSHBQcml2LT5zdGF0cy5hc3RfYW5pX2x6ZXJvKys7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHMzMl90IGNjZGVsdGEgPSBjeWNsZUNvdW50IC0gYW5pU3RhdGUtPmN5Y2xlQ291bnQ7CisgICAgICAgIHMzMl90IHJmZGVsdGEgPSByeEZyYW1lQ291bnQgLSBhbmlTdGF0ZS0+cnhGcmFtZUNvdW50OworICAgICAgICBzMzJfdCB0ZmRlbHRhID0gdHhGcmFtZUNvdW50IC0gYW5pU3RhdGUtPnR4RnJhbWVDb3VudDsKKyAgICAgICAgbGlzdGVuVGltZSA9IChjY2RlbHRhIC0gcmZkZWx0YSAtIHRmZGVsdGEpIC8gQ0xPQ0tfUkFURTsKKyAgICB9CisgICAgYW5pU3RhdGUtPmN5Y2xlQ291bnQgPSBjeWNsZUNvdW50OworICAgIGFuaVN0YXRlLT50eEZyYW1lQ291bnQgPSB0eEZyYW1lQ291bnQ7CisgICAgYW5pU3RhdGUtPnJ4RnJhbWVDb3VudCA9IHJ4RnJhbWVDb3VudDsKKyAgICByZXR1cm4gbGlzdGVuVGltZTsKK30KKworLyoKKyAqIERvIHBlcmlvZGljIHByb2Nlc3NpbmcuICBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZyb20gdGhlCisgKiBkcml2ZXIncyByeCBpbnRlcnJ1cHQgaGFuZGxlciBhZnRlciBwcm9jZXNzaW5nIGZyYW1lcy4KKyAqLwordm9pZCB6ZkhwQW5pQXJQb2xsKHpkZXZfdCogZGV2LCB1MzJfdCBsaXN0ZW5UaW1lLCB1MzJfdCBwaHlDbnQxLCB1MzJfdCBwaHlDbnQyKQoreworICAgIHN0cnVjdCB6c0FuaVN0YXRlICphbmlTdGF0ZTsKKyAgICAvL3MzMl90IGxpc3RlblRpbWU7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzdHJ1Y3QgenNIcFByaXYgKkhwUHJpdiA9IChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGU7CisKKyAgICAvKgorICAgICAqIFNpbmNlIHdlJ3JlIGNhbGxlZCBmcm9tIGVuZCBvZiByeCB0YXNrbGV0LCB3ZSBhbHNvIGNoZWNrIGZvcgorICAgICAqIEFSIHByb2Nlc3Npbmcgbm93CisgICAgICovCisKKyAgICBhbmlTdGF0ZSA9IEhwUHJpdi0+Y3VyYW5pOworICAgIC8vSHBQcml2LT5zdGF0cy5hc3Rfbm9kZXN0YXRzID0gKnN0YXRzOyAgICAgICAvKiBYWFggb3B0aW1pemU/ICovCisKKyAgICAvL2xpc3RlblRpbWUgPSB6ZkhwQW5pR2V0TGlzdGVuVGltZShkZXYpOworICAgIC8vaWYgKGxpc3RlblRpbWUgPCAwKQorICAgIC8veworICAgIC8vICAgIEhwUHJpdi0+c3RhdHMuYXN0X2FuaV9sbmVnKys7CisgICAgLy8gICAgLyogcmVzdGFydCBBTkkgcGVyaW9kIGlmIGxpc3RlblRpbWUgaXMgaW52YWxpZCAqLworICAgIC8vICAgIHpmSHBBbmlSZXN0YXJ0KGRldik7CisgICAgLy8gICAgcmV0dXJuOworICAgIC8vfQorICAgIC8qIFhYWCBiZXdhcmUgb2Ygb3ZlcmZsb3c/ICovCisgICAgYW5pU3RhdGUtPmxpc3RlblRpbWUgKz0gbGlzdGVuVGltZTsKKworICAgIGlmIChIcFByaXYtPmhhc0h3UGh5Q291bnRlcnMpCisgICAgeworICAgICAgICAvL3UzMl90IHBoeUNudDEsIHBoeUNudDI7CisgICAgICAgIHUzMl90IG9mZG1QaHlFcnJDbnQsIGNja1BoeUVyckNudDsKKworICAgICAgICAvKiBOQjogdGhlc2UgYXJlIG5vdCByZXNldC1vbi1yZWFkICovCisgICAgICAgIC8vcGh5Q250MSA9IDA7Ly9PU19SRUdfUkVBRChhaCwgQVJfUEhZX0VSUl8xKTsKKyAgICAgICAgLy9waHlDbnQyID0gMDsvL09TX1JFR19SRUFEKGFoLCBBUl9QSFlfRVJSXzIpOworICAgICAgICAvKiBYWFggc29tZXRpbWVzIHplcm8sIHdoeT8gKi8KKyAgICAgICAgLy9pZiAocGh5Q250MSA8IGFuaVN0YXRlLT5vZmRtUGh5RXJyQmFzZSB8fAorICAgICAgICAvLyAgICBwaHlDbnQyIDwgYW5pU3RhdGUtPmNja1BoeUVyckJhc2UpCisgICAgICAgIC8veworICAgICAgICAvLyAgICBpZiAocGh5Q250MSA8IGFuaVN0YXRlLT5vZmRtUGh5RXJyQmFzZSkKKyAgICAgICAgLy8gICAgeworICAgICAgICAvLyAgICAgICAgem1fZGVidWdfbXNnMigicGh5Q250MSA9IDB4IiwgcGh5Q250MSk7CisgICAgICAgIC8vICAgICAgICB6bV9kZWJ1Z19tc2cyKCJyZXNldHRpbmcgY291bnRlciB2YWx1ZSB0byAweCIsIGFuaVN0YXRlLT5vZmRtUGh5RXJyQmFzZSk7CisgICAgICAgIC8vICAgICAgICAvL09TX1JFR19XUklURShhaCwgQVJfUEhZX0VSUl8xLCBhbmlTdGF0ZS0+b2ZkbVBoeUVyckJhc2UpOworICAgICAgICAvLyAgICAgICAgLy9PU19SRUdfV1JJVEUoYWgsIEFSX1BIWV9FUlJfTUFTS18xLCBBUl9QSFlfRVJSX09GRE1fVElNSU5HKTsKKyAgICAgICAgLy8gICAgfQorICAgICAgICAvLyAgICBpZiAocGh5Q250MiA8IGFuaVN0YXRlLT5jY2tQaHlFcnJCYXNlKQorICAgICAgICAvLyAgICB7CisgICAgICAgIC8vICAgICAgICB6bV9kZWJ1Z19tc2cyKCJwaHlDbnQyID0gMHgiLCBwaHlDbnQyKTsKKyAgICAgICAgLy8gICAgICAgIHptX2RlYnVnX21zZzIoInJlc2V0dGluZyBjb3VudGVyIHZhbHVlIHRvIDB4IiwgYW5pU3RhdGUtPmNja1BoeUVyckJhc2UpOworICAgICAgICAvLyAgICAgICAgLy9PU19SRUdfV1JJVEUoYWgsIEFSX1BIWV9FUlJfMiwgYW5pU3RhdGUtPmNja1BoeUVyckJhc2UpOworICAgICAgICAvLyAgICAgICAgLy9PU19SRUdfV1JJVEUoYWgsIEFSX1BIWV9FUlJfTUFTS18yLCBBUl9QSFlfRVJSX0NDS19USU1JTkcpOworICAgICAgICAvLyAgICB9CisgICAgICAgIC8vICAgIHJldHVybjsgICAgIC8qIFhYWCAqLworICAgICAgICAvL30KKyAgICAgICAgLyogTkI6IG9ubHkgdXNlIGFzdF9hbmlfKmVycnMgd2l0aCBBSF9QUklWQVRFX0RJQUcgKi8KKyAgICAgICAgLy9vZmRtUGh5RXJyQ250ID0gcGh5Q250MSAtIGFuaVN0YXRlLT5vZmRtUGh5RXJyQmFzZTsKKyAgICAgICAgLy9IcFByaXYtPnN0YXRzLmFzdF9hbmlfb2ZkbWVycnMgKz0gb2ZkbVBoeUVyckNudCAtIGFuaVN0YXRlLT5vZmRtUGh5RXJyQ291bnQ7CisgICAgICAgIC8vYW5pU3RhdGUtPm9mZG1QaHlFcnJDb3VudCA9IG9mZG1QaHlFcnJDbnQ7CisgICAgICAgIG9mZG1QaHlFcnJDbnQgPSBwaHlDbnQxOworICAgICAgICBIcFByaXYtPnN0YXRzLmFzdF9hbmlfb2ZkbWVycnMgKz0gb2ZkbVBoeUVyckNudDsKKyAgICAgICAgYW5pU3RhdGUtPm9mZG1QaHlFcnJDb3VudCArPSBvZmRtUGh5RXJyQ250OworCisgICAgICAgIC8vY2NrUGh5RXJyQ250ID0gcGh5Q250MiAtIGFuaVN0YXRlLT5jY2tQaHlFcnJCYXNlOworICAgICAgICAvL0hwUHJpdi0+c3RhdHMuYXN0X2FuaV9jY2tlcnJzICs9IGNja1BoeUVyckNudCAtIGFuaVN0YXRlLT5jY2tQaHlFcnJDb3VudDsKKyAgICAgICAgLy9hbmlTdGF0ZS0+Y2NrUGh5RXJyQ291bnQgPSBjY2tQaHlFcnJDbnQ7CisgICAgICAgIGNja1BoeUVyckNudCA9IHBoeUNudDI7CisgICAgICAgIEhwUHJpdi0+c3RhdHMuYXN0X2FuaV9jY2tlcnJzICs9IGNja1BoeUVyckNudDsKKyAgICAgICAgYW5pU3RhdGUtPmNja1BoeUVyckNvdW50ICs9IGNja1BoeUVyckNudDsKKyAgICB9CisgICAgLyoKKyAgICAgKiBJZiBhbmkgaXMgbm90IGVuYWJsZWQsIHJldHVybiBhZnRlciB3ZSd2ZSBjb2xsZWN0ZWQKKyAgICAgKiBzdGF0aXN0aWNzCisgICAgICovCisgICAgaWYgKChIcFByaXYtPnByb2NQaHlFcnIgJiBaTV9IQUxfUFJPQ0VTU19BTkkpID09IDApCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoYW5pU3RhdGUtPmxpc3RlblRpbWUgPiA1ICogSHBQcml2LT5hbmlQZXJpb2QpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBDaGVjayB0byBzZWUgaWYgbmVlZCB0byBsb3dlciBpbW11bml0eSBpZgorICAgICAgICAgKiA1IGFuaVBlcmlvZHMgaGF2ZSBwYXNzZWQKKyAgICAgICAgICovCisgICAgICAgIGlmIChhbmlTdGF0ZS0+b2ZkbVBoeUVyckNvdW50IDw9IGFuaVN0YXRlLT5saXN0ZW5UaW1lICoKKyAgICAgICAgICAgICBhbmlTdGF0ZS0+b2ZkbVRyaWdMb3cvMTAwMCAmJgorICAgICAgICAgICAgYW5pU3RhdGUtPmNja1BoeUVyckNvdW50IDw9IGFuaVN0YXRlLT5saXN0ZW5UaW1lICoKKyAgICAgICAgICAgICBhbmlTdGF0ZS0+Y2NrVHJpZ0xvdy8xMDAwKQorICAgICAgICAgICAgemZIcEFuaUxvd2VySW1tdW5pdHkoZGV2KTsKKyAgICAgICAgemZIcEFuaVJlc3RhcnQoZGV2KTsKKyAgICB9CisgICAgZWxzZSBpZiAoYW5pU3RhdGUtPmxpc3RlblRpbWUgPiBIcFByaXYtPmFuaVBlcmlvZCkKKyAgICB7CisgICAgICAgIC8qIGNoZWNrIHRvIHNlZSBpZiBuZWVkIHRvIHJhaXNlIGltbXVuaXR5ICovCisgICAgICAgIGlmIChhbmlTdGF0ZS0+b2ZkbVBoeUVyckNvdW50ID4gYW5pU3RhdGUtPmxpc3RlblRpbWUgKgorICAgICAgICAgICAgYW5pU3RhdGUtPm9mZG1UcmlnSGlnaCAvIDEwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmSHBBbmlPZmRtRXJyVHJpZ2dlcihkZXYpOworICAgICAgICAgICAgemZIcEFuaVJlc3RhcnQoZGV2KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChhbmlTdGF0ZS0+Y2NrUGh5RXJyQ291bnQgPiBhbmlTdGF0ZS0+bGlzdGVuVGltZSAqCisgICAgICAgICAgICAgICBhbmlTdGF0ZS0+Y2NrVHJpZ0hpZ2ggLyAxMDAwKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkhwQW5pQ2NrRXJyVHJpZ2dlcihkZXYpOworICAgICAgICAgICAgemZIcEFuaVJlc3RhcnQoZGV2KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGFuaS5oIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwYW5pLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZlNjlhZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGFuaS5oCkBAIC0wLDAgKzEsNDIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICIuLi84MDIxMWNvcmUvY3ByZWNvbXAuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworCXUzMl90CWFja3Jjdl9iYWQ7CisJdTMyX3QJcnRzX2JhZDsKKwl1MzJfdAlydHNfZ29vZDsKKwl1MzJfdAlmY3NfYmFkOworCXUzMl90CWJlYWNvbnM7Cit9IFpNX0hBTF9NSUJfU1RBVFM7CisKKy8qCisgKiBQZXItbm9kZSBzdGF0aXN0aWNzIG1haW50YWluZWQgYnkgdGhlIGRyaXZlciBmb3IgdXNlIGluCisgKiBvcHRpbWl6aW5nIHNpZ25hbCBxdWFsaXR5IGFuZCBvdGhlciBvcGVyYXRpb25hbCBhc3BlY3RzLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdTMyX3QJbnNfYXZnYnJzc2k7CS8qIGF2ZXJhZ2UgYmVhY29uIHJzc2kgKi8KKwl1MzJfdAluc19hdmdyc3NpOwkgICAgLyogYXZlcmFnZSBkYXRhIHJzc2kgKi8KKwl1MzJfdAluc19hdmd0eHJzc2k7CS8qIGF2ZXJhZ2UgdHggcnNzaSAqLworfSBaTV9IQUxfTk9ERV9TVEFUUzsKKworI2RlZmluZQlaTV9IQUxfUlNTSV9FUF9NVUxUSVBMSUVSCSgxPDw3KQkvKiBwb3cyIHRvIG9wdGltaXplIG91dCAqIGFuZCAvICovCisKK3N0cnVjdCB6c0FuaVN0YXRzIHsKKyAgICB1MzJfdCAgIGFzdF9hbmlfbml1cDsgICAvKiBBTkkgaW5jcmVhc2VkIG5vaXNlIGltbXVuaXR5ICovCisgICAgdTMyX3QgICBhc3RfYW5pX25pZG93bjsgLyogQU5JIGRlY3JlYXNlZCBub2lzZSBpbW11bml0eSAqLworICAgIHUzMl90ICAgYXN0X2FuaV9zcHVydXA7IC8qIEFOSSBpbmNyZWFzZWQgc3B1ciBpbW11bml0eSAqLworICAgIHUzMl90ICAgYXN0X2FuaV9zcHVyZG93bjsvKiBBTkkgZGVzY3JlYXNlZCBzcHVyIGltbXVuaXR5ICovCisgICAgdTMyX3QgICBhc3RfYW5pX29mZG1vbjsgLyogQU5JIE9GRE0gd2VhayBzaWduYWwgZGV0ZWN0IG9uICovCisgICAgdTMyX3QgICBhc3RfYW5pX29mZG1vZmY7LyogQU5JIE9GRE0gd2VhayBzaWduYWwgZGV0ZWN0IG9mZiAqLworICAgIHUzMl90ICAgYXN0X2FuaV9jY2toaWdoOy8qIEFOSSBDQ0sgd2VhayBzaWduYWwgdGhyZXNob2xkIGhpZ2ggKi8KKyAgICB1MzJfdCAgIGFzdF9hbmlfY2NrbG93OyAvKiBBTkkgQ0NLIHdlYWsgc2lnbmFsIHRocmVzaG9sZCBsb3cgKi8KKyAgICB1MzJfdCAgIGFzdF9hbmlfc3RlcHVwOyAvKiBBTkkgaW5jcmVhc2VkIGZpcnN0IHN0ZXAgbGV2ZWwgKi8KKyAgICB1MzJfdCAgIGFzdF9hbmlfc3RlcGRvd247LyogQU5JIGRlY3JlYXNlZCBmaXJzdCBzdGVwIGxldmVsICovCisgICAgdTMyX3QgICBhc3RfYW5pX29mZG1lcnJzOy8qIEFOSSBjdW11bGF0aXZlIG9mZG0gcGh5IGVyciBjb3VudCAqLworICAgIHUzMl90ICAgYXN0X2FuaV9jY2tlcnJzOy8qIEFOSSBjdW11bGF0aXZlIGNjayBwaHkgZXJyIGNvdW50ICovCisgICAgdTMyX3QgICBhc3RfYW5pX3Jlc2V0OyAgLyogQU5JIHBhcmFtZXRlcnMgemVybydkIGZvciBub24tU1RBICovCisgICAgdTMyX3QgICBhc3RfYW5pX2x6ZXJvOyAgLyogQU5JIGxpc3RlbiB0aW1lIGZvcmNlZCB0byB6ZXJvICovCisgICAgdTMyX3QgICBhc3RfYW5pX2xuZWc7ICAgLyogQU5JIGxpc3RlbiB0aW1lIGNhbGN1bGF0ZWQgPCAwICovCisgICAgWk1fSEFMX01JQl9TVEFUUyAgIGFzdF9taWJzdGF0czsgICAvKiBNSUIgY291bnRlciBzdGF0cyAqLworICAgIFpNX0hBTF9OT0RFX1NUQVRTICBhc3Rfbm9kZXN0YXRzOyAgLyogTGF0ZXN0IHJzc2kgc3RhdHMgZnJvbSBkcml2ZXIgKi8KK307CisKKy8qCisgKiBQZXItY2hhbm5lbCBBTkkgc3RhdGUgcHJpdmF0ZSB0byB0aGUgZHJpdmVyLgorICovCitzdHJ1Y3QgenNBbmlTdGF0ZSB7CisgICAgWk1fSEFMX0NIQU5ORUwgYzsKKyAgICB1OF90ICAgIG5vaXNlSW1tdW5pdHlMZXZlbDsKKyAgICB1OF90ICAgIHNwdXJJbW11bml0eUxldmVsOworICAgIHU4X3QgICAgZmlyc3RlcExldmVsOworICAgIHU4X3QgICAgb2ZkbVdlYWtTaWdEZXRlY3RPZmY7CisgICAgdThfdCAgICBjY2tXZWFrU2lnVGhyZXNob2xkOworCisgICAgLyogVGhyZXNob2xkcyAqLworICAgIHUzMl90ICAgbGlzdGVuVGltZTsKKyAgICB1MzJfdCAgIG9mZG1UcmlnSGlnaDsKKyAgICB1MzJfdCAgIG9mZG1UcmlnTG93OworICAgIHMzMl90ICAgY2NrVHJpZ0hpZ2g7CisgICAgczMyX3QgICBjY2tUcmlnTG93OworICAgIHMzMl90ICAgcnNzaVRockxvdzsKKyAgICBzMzJfdCAgIHJzc2lUaHJIaWdoOworCisgICAgdTMyX3QgICBub2lzZUZsb29yOyAvKiBUaGUgY3VycmVudCBub2lzZSBmbG9vciAqLworICAgIHUzMl90ICAgdHhGcmFtZUNvdW50OyAgIC8qIExhc3QgdHhGcmFtZUNvdW50ICovCisgICAgdTMyX3QgICByeEZyYW1lQ291bnQ7ICAgLyogTGFzdCByeCBGcmFtZSBjb3VudCAqLworICAgIHUzMl90ICAgY3ljbGVDb3VudDsgLyogTGFzdCBjeWNsZUNvdW50IChjYW4gZGV0ZWN0IHdyYXAtYXJvdW5kKSAqLworICAgIHUzMl90ICAgb2ZkbVBoeUVyckNvdW50Oy8qIE9GRE0gZXJyIGNvdW50IHNpbmNlIGxhc3QgcmVzZXQgKi8KKyAgICB1MzJfdCAgIGNja1BoeUVyckNvdW50OyAvKiBDQ0sgZXJyIGNvdW50IHNpbmNlIGxhc3QgcmVzZXQgKi8KKyAgICB1MzJfdCAgIG9mZG1QaHlFcnJCYXNlOyAvKiBCYXNlIHZhbHVlIGZvciBvZmRtIGVyciBjb3VudGVyICovCisgICAgdTMyX3QgICBjY2tQaHlFcnJCYXNlOyAgLyogQmFzZSB2YWx1ZSBmb3IgY2NrIGVyciBjb3VudGVycyAqLworICAgIHMxNl90ICAgcGt0UnNzaVsyXTsgLyogQXZlcmFnZSByc3NpIG9mIHBrdHMgZm9yIDIgYW50ZW5uYXMgKi8KKyAgICBzMTZfdCAgIG9mZG1FcnJSc3NpWzJdOyAvKiBBdmVyYWdlIHJzc2kgb2Ygb2ZkbSBwaHkgZXJycyBmb3IgMiBhbnQgKi8KKyAgICBzMTZfdCAgIGNja0VyclJzc2lbMl07ICAvKiBBdmVyYWdlIHJzc2kgb2YgY2NrIHBoeSBlcnJzIGZvciAyIGFudCAqLworfTsKKwordHlwZWRlZiBlbnVtIHsKKwlaTV9IQUxfQU5JX1BSRVNFTlQsCQkJLyogaXMgQU5JIHN1cHBvcnQgcHJlc2VudCAqLworCVpNX0hBTF9BTklfTk9JU0VfSU1NVU5JVFlfTEVWRUwsCQkvKiBzZXQgbGV2ZWwgKi8KKwlaTV9IQUxfQU5JX09GRE1fV0VBS19TSUdOQUxfREVURUNUSU9OLAkvKiBlbmFibGUvZGlzYWJsZSAqLworCVpNX0hBTF9BTklfQ0NLX1dFQUtfU0lHTkFMX1RIUiwJCS8qIGVuYWJsZS9kaXNhYmxlICovCisJWk1fSEFMX0FOSV9GSVJTVEVQX0xFVkVMLAkJCS8qIHNldCBsZXZlbCAqLworCVpNX0hBTF9BTklfU1BVUl9JTU1VTklUWV9MRVZFTCwJCS8qIHNldCBsZXZlbCAqLworCVpNX0hBTF9BTklfTU9ERSwJCQkJLyogMCA9PiBtYW51YWwsIDEgPT4gYXV0byAqLworCVpNX0hBTF9BTklfUEhZRVJSX1JFU0VULAkJCS8qIHJlc2V0IHBoeSBlcnJvciBzdGF0cyAqLworfSBaTV9IQUxfQU5JX0NNRDsKKworI2RlZmluZSBBUl9QSFlfQ09VTlRNQVggICAgICAgICgzIDw8IDIyKSAgICAgICAgIC8vIE1heCBjb3VudGVkIGJlZm9yZSBpbnRyCisjZGVmaW5lIFpNX0hBTF9QUk9DRVNTX0FOSSAgICAgMHgwMDAwMDAwMSAgLyogQU5JIHN0YXRlIHNldHVwICovCisjZGVmaW5lIFpNX1JTU0lfRFVNTVlfTUFSS0VSCTB4MTI3CisKKy8qIFBIWSByZWdpc3RlcnMgaW4gYXI1NDE2LCByZWxhdGVkIGJhc2UgYW5kIHJlZ2lzdGVyIG9mZnNldHMKKyAgIG1heSBuZWVkIHRvIGJlIGNoYW5nZWQgaW4gb3R1cyBCQiAqLworI2RlZmluZSBBUl9QSFlfQkFTRSAgICAgMHgxQzU4MDAgICAgICAvKiBiYXNlIGFkZHJlc3Mgb2YgcGh5IHJlZ3MgKi8KKyNkZWZpbmUgQVJfUEhZKF9uKSAgICAgIChBUl9QSFlfQkFTRSArICgoX24pPDwyKSkKKworI2RlZmluZSBBUl9QSFlfVEVTVCAgICAgICAgICAgICAweDFDNTgwMCAgICAgICAgICAvKiBQSFkgdGVzdCBjb250cm9sICovCisjZGVmaW5lIFBIWV9BR0NfQ0xSICAgICAgICAgICAgIDB4MTAwMDAwMDAgICAgICAvKiBkaXNhYmxlIEFHQyB0byBBMiAqLworI2RlZmluZSBSRlNJTEVOVF9CQiAgICAgICAgICAgICAweDAwMDAyMDAwICAgICAgLyogc2h1c2ggYmIgKi8KKworI2RlZmluZSBBUl9QSFlfVFVSQk8gICAgICAgIDB4MUM1ODA0ICAgICAgLyogZnJhbWUgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBBUl9QSFlfRkNfVFVSQk9fTU9ERSAgICAgICAgMHgwMDAwMDAwMSAgLyogU2V0IHR1cmJvIG1vZGUgYml0cyAqLworI2RlZmluZSBBUl9QSFlfRkNfVFVSQk9fU0hPUlQgICAgICAgMHgwMDAwMDAwMiAgLyogU2V0IHNob3J0IHN5bWJvbHMgdG8gdHVyYm8gbW9kZSBzZXR0aW5nICovCisjZGVmaW5lIEFSX1BIWV9GQ19EWU4yMDQwX0VOICAgICAgICAweDAwMDAwMDA0ICAgICAgLyogRW5hYmxlIGR5biAyMC80MCBtb2RlICovCisjZGVmaW5lIEFSX1BIWV9GQ19EWU4yMDQwX1BSSV9PTkxZICAgICAgMHgwMDAwMDAwOCAgICAgIC8qIGR5biAyMC80MCAtIHByaW1hcnkgb25seSAqLworI2RlZmluZSBBUl9QSFlfRkNfRFlOMjA0MF9QUklfQ0ggICAgMHgwMDAwMDAxMCAgICAgIC8qIGR5biAyMC80MCAtIHByaW1hcnkgY2ggb2Zmc2V0ICgwPSsxME1IeiwgMT0tMTBNSHopKi8KKyNkZWZpbmUgQVJfUEhZX0ZDX0RZTjIwNDBfRVhUX0NIICAgICAgICAweDAwMDAwMDIwICAgICAgLyogZHluIDIwLzQwIC0gZXh0IGNoIHNwYWNpbmcgKDA9MjBNSHovIDE9MjVNSHopICovCisjZGVmaW5lIEFSX1BIWV9GQ19IVF9FTiAgICAgICAgICAgICAweDAwMDAwMDQwICAgICAgLyogaHQgZW5hYmxlICovCisjZGVmaW5lIEFSX1BIWV9GQ19TSE9SVF9HSV80MCAgICAgICAweDAwMDAwMDgwICAgICAgLyogYWxsb3cgc2hvcnQgR0kgZm9yIEhUIDQwICovCisjZGVmaW5lIEFSX1BIWV9GQ19XQUxTSCAgICAgICAgICAgICAweDAwMDAwMTAwICAgICAgLyogd2Fsc2ggc3BhdGlhbCBzcHJlYWRpbmcgZm9yIDIgY2hhaW5zLDIgc3RyZWFtcyBUWCAqLworI2RlZmluZSBBUl9QSFlfRkNfU0lOR0xFX0hUX0xURjEgICAgICAgIDB4MDAwMDAyMDAgICAgICAvKiBzaW5nbGUgbGVuZ3RoICg0dXMpIDFzdCBIVCBsb25nIHRyYWluaW5nIHN5bWJvbCAqLworCisjZGVmaW5lIEFSX1BIWV9USU1JTkcyICAgICAgMHgxQzU4MTAgICAgICAvKiBUaW1pbmcgQ29udHJvbCAyICovCisjZGVmaW5lIEFSX1BIWV9USU1JTkcyX1VTRV9GT1JDRSAgICAweDAwMDAxMDAwCisjZGVmaW5lIEFSX1BIWV9USU1JTkcyX0ZPUkNFX1ZBTCAgICAweDAwMDAwZmZmCisKKyNkZWZpbmUgQVJfUEhZX1RJTUlORzMgICAgICAweDFDNTgxNCAgICAgIC8qIFRpbWluZyBjb250cm9sIDMgKi8KKyNkZWZpbmUgQVJfUEhZX1RJTUlORzNfRFNDX01BTiAgMHhGRkZFMDAwMAorI2RlZmluZSBBUl9QSFlfVElNSU5HM19EU0NfTUFOX1MgICAgMTcKKyNkZWZpbmUgQVJfUEhZX1RJTUlORzNfRFNDX0VYUCAgMHgwMDAxRTAwMAorI2RlZmluZSBBUl9QSFlfVElNSU5HM19EU0NfRVhQX1MgICAgMTMKKworI2RlZmluZSBBUl9QSFlfQ0hJUF9JRCAgICAgICAgICAweDFDNTgxOCAgICAgIC8qIFBIWSBjaGlwIHJldmlzaW9uIElEICovCisjZGVmaW5lIEFSX1BIWV9DSElQX0lEX1JFVl8wICAgIDB4ODAgICAgICAgIC8qIDU0MTYgUmV2IDAgKG93bCAxLjApIEJCICovCisjZGVmaW5lIEFSX1BIWV9DSElQX0lEX1JFVl8xICAgIDB4ODEgICAgICAgIC8qIDU0MTYgUmV2IDEgKG93bCAyLjApIEJCICovCisKKyNkZWZpbmUgQVJfUEhZX0FDVElWRSAgICAgICAweDFDNTgxQyAgICAgIC8qIGFjdGl2YXRpb24gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVJfUEhZX0FDVElWRV9FTiAgICAweDAwMDAwMDAxICAvKiBBY3RpdmF0ZSBQSFkgY2hpcHMgKi8KKyNkZWZpbmUgQVJfUEhZX0FDVElWRV9ESVMgICAweDAwMDAwMDAwICAvKiBEZWFjdGl2YXRlIFBIWSBjaGlwcyAqLworCisjZGVmaW5lIEFSX1BIWV9SRl9DVEwyICAgICAgICAgICAgICAgICAgICAgIDB4MUM1ODI0CisjZGVmaW5lIEFSX1BIWV9UWF9FTkRfREFUQV9TVEFSVCAgMHgwMDAwMDBGRgorI2RlZmluZSBBUl9QSFlfVFhfRU5EX0RBVEFfU1RBUlRfUyAgMAorI2RlZmluZSBBUl9QSFlfVFhfRU5EX1BBX09OICAgICAgIDB4MDAwMEZGMDAKKyNkZWZpbmUgQVJfUEhZX1RYX0VORF9QQV9PTl9TICAgICAgIDgKKworCisjZGVmaW5lIEFSX1BIWV9SRl9DVEwzICAgICAgICAgICAgICAgICAgMHgxQzU4MjgKKyNkZWZpbmUgQVJfUEhZX1RYX0VORF9UT19BMl9SWF9PTiAgICAgICAweDAwRkYwMDAwCisjZGVmaW5lIEFSX1BIWV9UWF9FTkRfVE9fQTJfUlhfT05fUyAgICAgMTYKKworI2RlZmluZSBBUl9QSFlfQURDX0NUTCAgICAgIDB4MUM1ODJDCisjZGVmaW5lIEFSX1BIWV9BRENfQ1RMX09GRl9JTkJVRkdBSU4gICAgMHgwMDAwMDAwMworI2RlZmluZSBBUl9QSFlfQURDX0NUTF9PRkZfSU5CVUZHQUlOX1MgIDAKKyNkZWZpbmUgQVJfUEhZX0FEQ19DVExfT0ZGX1BXRERBQyAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgQVJfUEhZX0FEQ19DVExfT0ZGX1BXREJBTkRHQVAgICAweDAwMDA0MDAwIC8qIEJCIFJldiA0LjIrIG9ubHkgKi8KKyNkZWZpbmUgQVJfUEhZX0FEQ19DVExfT0ZGX1BXREFEQyAgIDB4MDAwMDgwMDAgLyogQkIgUmV2IDQuMisgb25seSAqLworI2RlZmluZSBBUl9QSFlfQURDX0NUTF9PTl9JTkJVRkdBSU4gMHgwMDAzMDAwMAorI2RlZmluZSBBUl9QSFlfQURDX0NUTF9PTl9JTkJVRkdBSU5fUyAgIDE2CisKKyNkZWZpbmUgQVJfUEhZX0FEQ19TRVJJQUxfQ1RMICAgICAgIDB4MUM1ODMwCisjZGVmaW5lIEFSX1BIWV9TRUxfSU5URVJOQUxfQUREQUMgICAweDAwMDAwMDAwCisjZGVmaW5lIEFSX1BIWV9TRUxfRVhURVJOQUxfUkFESU8gICAweDAwMDAwMDAxCisKKyNkZWZpbmUgQVJfUEhZX1JGX0NUTDQgICAgICAgICAgICAgICAgICAgIDB4MUM1ODM0CisjZGVmaW5lIEFSX1BIWV9SRl9DVEw0X1RYX0VORF9YUEFCX09GRiAgICAweEZGMDAwMDAwCisjZGVmaW5lIEFSX1BIWV9SRl9DVEw0X1RYX0VORF9YUEFCX09GRl9TICAyNAorI2RlZmluZSBBUl9QSFlfUkZfQ1RMNF9UWF9FTkRfWFBBQV9PRkYgICAgMHgwMEZGMDAwMAorI2RlZmluZSBBUl9QSFlfUkZfQ1RMNF9UWF9FTkRfWFBBQV9PRkZfUyAgMTYKKyNkZWZpbmUgQVJfUEhZX1JGX0NUTDRfRlJBTUVfWFBBQl9PTiAgICAgIDB4MDAwMEZGMDAKKyNkZWZpbmUgQVJfUEhZX1JGX0NUTDRfRlJBTUVfWFBBQl9PTl9TICAgIDgKKyNkZWZpbmUgQVJfUEhZX1JGX0NUTDRfRlJBTUVfWFBBQV9PTiAgICAgIDB4MDAwMDAwRkYKKyNkZWZpbmUgQVJfUEhZX1JGX0NUTDRfRlJBTUVfWFBBQV9PTl9TICAgIDAKKworI2RlZmluZSBBUl9QSFlfU0VUVExJTkcgICAgIDB4MUM1ODQ0CisjZGVmaW5lIEFSX1BIWV9TRVRUTElOR19TV0lUQ0ggIDB4MDAwMDNGODAKKyNkZWZpbmUgQVJfUEhZX1NFVFRMSU5HX1NXSVRDSF9TICAgIDcKKworI2RlZmluZSBBUl9QSFlfUlhHQUlOICAgICAgIDB4MUM1ODQ4CisjZGVmaW5lIEFSX1BIWV9SWEdBSU5fVFhSWF9BVFRFTiAgICAweDAwMDNGMDAwCisjZGVmaW5lIEFSX1BIWV9SWEdBSU5fVFhSWF9BVFRFTl9TICAxMgorI2RlZmluZSBBUl9QSFlfUlhHQUlOX1RYUlhfUkZfTUFYICAgMHgwMDdDMDAwMAorI2RlZmluZSBBUl9QSFlfUlhHQUlOX1RYUlhfUkZfTUFYX1MgMTgKKworI2RlZmluZSBBUl9QSFlfREVTSVJFRF9TWiAgIDB4MUM1ODUwCisjZGVmaW5lIEFSX1BIWV9ERVNJUkVEX1NaX0FEQyAgICAgICAweDAwMDAwMEZGCisjZGVmaW5lIEFSX1BIWV9ERVNJUkVEX1NaX0FEQ19TICAgICAwCisjZGVmaW5lIEFSX1BIWV9ERVNJUkVEX1NaX1BHQSAgICAgICAweDAwMDBGRjAwCisjZGVmaW5lIEFSX1BIWV9ERVNJUkVEX1NaX1BHQV9TICAgICA4CisjZGVmaW5lIEFSX1BIWV9ERVNJUkVEX1NaX1RPVF9ERVMgICAweDBGRjAwMDAwCisjZGVmaW5lIEFSX1BIWV9ERVNJUkVEX1NaX1RPVF9ERVNfUyAyMAorCisjZGVmaW5lIEFSX1BIWV9GSU5EX1NJRyAgICAgIDB4MUM1ODU4CisjZGVmaW5lIEFSX1BIWV9GSU5EX1NJR19GSVJTVEVQICAweDAwMDNGMDAwCisjZGVmaW5lIEFSX1BIWV9GSU5EX1NJR19GSVJTVEVQX1MgICAgICAgIDEyCisjZGVmaW5lIEFSX1BIWV9GSU5EX1NJR19GSVJQV1IgICAweDAzRkMwMDAwCisjZGVmaW5lIEFSX1BIWV9GSU5EX1NJR19GSVJQV1JfUyAgICAgICAgIDE4CisKKyNkZWZpbmUgQVJfUEhZX0FHQ19DVEwxICAgICAgMHgxQzU4NUMKKyNkZWZpbmUgQVJfUEhZX0FHQ19DVEwxX0NPQVJTRV9MT1cgICAgICAgMHgwMDAwN0Y4MAorI2RlZmluZSBBUl9QSFlfQUdDX0NUTDFfQ09BUlNFX0xPV19TICAgICAgICAgNworI2RlZmluZSBBUl9QSFlfQUdDX0NUTDFfQ09BUlNFX0hJR0ggICAgICAweDAwM0Y4MDAwCisjZGVmaW5lIEFSX1BIWV9BR0NfQ1RMMV9DT0FSU0VfSElHSF9TICAgICAgICAxNQorCisjZGVmaW5lIEFSX1BIWV9BR0NfQ09OVFJPTCAgMHgxQzU4NjAgICAgICAvKiBjaGlwIGNhbGlicmF0aW9uIGFuZCBub2lzZSBmbG9vciBzZXR0aW5nICovCisjZGVmaW5lIEFSX1BIWV9BR0NfQ09OVFJPTF9DQUwgIDB4MDAwMDAwMDEgIC8qIGRvIGludGVybmFsIGNhbGlicmF0aW9uICovCisjZGVmaW5lIEFSX1BIWV9BR0NfQ09OVFJPTF9ORiAgIDB4MDAwMDAwMDIgIC8qIGRvIG5vaXNlLWZsb29yIGNhbGN1bGF0aW9uICovCisKKyNkZWZpbmUgQVJfUEhZX0NDQSAgICAgICAgICAgICAgMHgxQzU4NjQKKyNkZWZpbmUgQVJfUEhZX01JTkNDQV9QV1IgICAgICAgMHgxRkYwMDAwMAorI2RlZmluZSBBUl9QSFlfTUlOQ0NBX1BXUl9TICAgICAxOQorI2RlZmluZSBBUl9QSFlfQ0NBX1RIUkVTSDYyICAgICAweDAwMDdGMDAwCisjZGVmaW5lIEFSX1BIWV9DQ0FfVEhSRVNINjJfUyAgIDEyCisKKyNkZWZpbmUgQVJfUEhZX1NGQ09SUl9MT1cgICAgMHgxQzU4NkMKKyNkZWZpbmUgQVJfUEhZX1NGQ09SUl9MT1dfVVNFX1NFTEZfQ09SUl9MT1cgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQVJfUEhZX1NGQ09SUl9MT1dfTTJDT1VOVF9USFJfTE9XICAgIDB4MDAwMDNGMDAKKyNkZWZpbmUgQVJfUEhZX1NGQ09SUl9MT1dfTTJDT1VOVF9USFJfTE9XX1MgIDgKKyNkZWZpbmUgQVJfUEhZX1NGQ09SUl9MT1dfTTFfVEhSRVNIX0xPVyAgMHgwMDFGQzAwMAorI2RlZmluZSBBUl9QSFlfU0ZDT1JSX0xPV19NMV9USFJFU0hfTE9XX1MgICAgMTQKKyNkZWZpbmUgQVJfUEhZX1NGQ09SUl9MT1dfTTJfVEhSRVNIX0xPVyAgMHgwRkUwMDAwMAorI2RlZmluZSBBUl9QSFlfU0ZDT1JSX0xPV19NMl9USFJFU0hfTE9XX1MgICAgMjEKKworI2RlZmluZSBBUl9QSFlfU0ZDT1JSICAgICAgIDB4MUM1ODY4CisjZGVmaW5lIEFSX1BIWV9TRkNPUlJfTTJDT1VOVF9USFIgICAgMHgwMDAwMDAxRgorI2RlZmluZSBBUl9QSFlfU0ZDT1JSX00yQ09VTlRfVEhSX1MgIDAKKyNkZWZpbmUgQVJfUEhZX1NGQ09SUl9NMV9USFJFU0ggIDB4MDBGRTAwMDAKKyNkZWZpbmUgQVJfUEhZX1NGQ09SUl9NMV9USFJFU0hfUyAgICAxNworI2RlZmluZSBBUl9QSFlfU0ZDT1JSX00yX1RIUkVTSCAgMHg3RjAwMDAwMAorI2RlZmluZSBBUl9QSFlfU0ZDT1JSX00yX1RIUkVTSF9TICAgIDI0CisKKyNkZWZpbmUgQVJfUEhZX1NMRUVQX0NUUl9DT05UUk9MICAgIDB4MUM1ODcwCisjZGVmaW5lIEFSX1BIWV9TTEVFUF9DVFJfTElNSVQgICAgICAweDFDNTg3NAorI2RlZmluZSBBUl9QSFlfU0xFRVBfU0NBTCAgICAgICAweDFDNTg3OAorCisjZGVmaW5lIEFSX1BIWV9QTExfQ1RMICAgICAgICAgIDB4MUM1ODdjICAgICAgLyogUExMIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVJfUEhZX1BMTF9DVExfNDAgICAgICAgMHhhYSAgICAgICAgLyogNDAgTUh6ICovCisjZGVmaW5lIEFSX1BIWV9QTExfQ1RMXzQwXzU0MTMgIDB4MDQKKyNkZWZpbmUgQVJfUEhZX1BMTF9DVExfNDQgICAgICAgMHhhYiAgICAgICAgLyogNDQgTUh6IGZvciAxMWIsIDExZyAqLworI2RlZmluZSBBUl9QSFlfUExMX0NUTF80NF8yMTMzICAweGViICAgICAgICAvKiA0NCBNSHogZm9yIDExYiwgMTFnICovCisjZGVmaW5lIEFSX1BIWV9QTExfQ1RMXzQwXzIxMzMgIDB4ZWEgICAgICAgIC8qIDQwIE1IeiBmb3IgMTFhLCB0dXJib3MgKi8KKworI2RlZmluZSBBUl9QSFlfUlhfREVMQVkgICAgIDB4MUM1OTE0ICAgICAgLyogYW5hbG9nIHBvdy1vbiB0aW1lICgxMDBucykgKi8KKyNkZWZpbmUgQVJfUEhZX1JYX0RFTEFZX0RFTEFZICAgMHgwMDAwM0ZGRiAgLyogZGVsYXkgZnJvbSB3YWtldXAgdG8gcnggZW5hICovCisKKyNkZWZpbmUgQVJfUEhZX1RJTUlOR19DVFJMNCAgICAgMHgxQzU5MjAgICAgICAvKiB0aW1pbmcgY29udHJvbCAqLworI2RlZmluZSBBUl9QSFlfVElNSU5HX0NUUkw0X0lRQ09SUl9RX1FfQ09GRiAweDAxRiAgIC8qIE1hc2sgZm9yIGtjb3NfdGhldGEtMSBmb3IgcSBjb3JyZWN0aW9uICovCisjZGVmaW5lIEFSX1BIWV9USU1JTkdfQ1RSTDRfSVFDT1JSX1FfUV9DT0ZGX1MgICAwICAgLyogc2hpZnQgZm9yIFFfQ09GRiAqLworI2RlZmluZSBBUl9QSFlfVElNSU5HX0NUUkw0X0lRQ09SUl9RX0lfQ09GRiAweDdFMCAgIC8qIE1hc2sgZm9yIHNpbl90aGV0YSBmb3IgaSBjb3JyZWN0aW9uICovCisjZGVmaW5lIEFSX1BIWV9USU1JTkdfQ1RSTDRfSVFDT1JSX1FfSV9DT0ZGX1MgICA1ICAgLyogU2hpZnQgZm9yIHNpbl90aGV0YSBmb3IgaSBjb3JyZWN0aW9uICovCisjZGVmaW5lIEFSX1BIWV9USU1JTkdfQ1RSTDRfSVFDT1JSX0VOQUJMRSAgIDB4ODAwICAgLyogZW5hYmxlIElRIGNvcnJlY3Rpb24gKi8KKyNkZWZpbmUgQVJfUEhZX1RJTUlOR19DVFJMNF9JUUNBTF9MT0dfQ09VTlRfTUFYIDB4RjAwMCAgLyogTWFzayBmb3IgbWF4IG51bWJlciBvZiBzYW1wbGVzIChsb2dhcml0aG1pYykgKi8KKyNkZWZpbmUgQVJfUEhZX1RJTUlOR19DVFJMNF9JUUNBTF9MT0dfQ09VTlRfTUFYX1MgICAxMiAgLyogU2hpZnQgZm9yIG1heCBudW1iZXIgb2Ygc2FtcGxlcyAqLworI2RlZmluZSBBUl9QSFlfVElNSU5HX0NUUkw0X0RPX0lRQ0FMICAgIDB4MTAwMDAgICAgIC8qIHBlcmZvcm0gSVEgY2FsaWJyYXRpb24gKi8KKworI2RlZmluZSBBUl9QSFlfVElNSU5HNSAgICAgIDB4MUM1OTI0CisjZGVmaW5lIEFSX1BIWV9USU1JTkc1X0NZQ1BXUl9USFIxICAweDAwMDAwMEZFCisjZGVmaW5lIEFSX1BIWV9USU1JTkc1X0NZQ1BXUl9USFIxX1MgICAgMQorCisjZGVmaW5lIEFSX1BIWV9QT1dFUl9UWF9SQVRFMSAgIDB4MUM1OTM0CisjZGVmaW5lIEFSX1BIWV9QT1dFUl9UWF9SQVRFMiAgIDB4MUM1OTM4CisjZGVmaW5lIEFSX1BIWV9QT1dFUl9UWF9SQVRFX01BWCAgICAweDFDNTkzYworI2RlZmluZSBBUl9QSFlfUE9XRVJfVFhfUkFURV9NQVhfVFBDX0VOQUJMRSAweDAwMDAwMDQwCisKKyNkZWZpbmUgQVJfUEhZX0ZSQU1FX0NUTCAgICAweDFDNTk0NAorI2RlZmluZSBBUl9QSFlfRlJBTUVfQ1RMX1RYX0NMSVAgICAgMHgwMDAwMDAzOAorI2RlZmluZSBBUl9QSFlfRlJBTUVfQ1RMX1RYX0NMSVBfUyAgMworCisjZGVmaW5lIEFSX1BIWV9UWFBXUkFESiAgICAgMHgxQzU5NEMgICAgICAvKiBCQiBSZXYgNC4yKyBvbmx5ICovCisjZGVmaW5lIEFSX1BIWV9UWFBXUkFESl9DQ0tfR0FJTl9ERUxUQSAgMHgwMDAwMEZDMAorI2RlZmluZSBBUl9QSFlfVFhQV1JBREpfQ0NLX0dBSU5fREVMVEFfUyAgICA2CisjZGVmaW5lIEFSX1BIWV9UWFBXUkFESl9DQ0tfUENEQUNfSU5ERVggMHgwMEZDMDAwMAorI2RlZmluZSBBUl9QSFlfVFhQV1JBREpfQ0NLX1BDREFDX0lOREVYX1MgICAxOAorCisjZGVmaW5lIEFSX1BIWV9SQURBUl8wICAgICAgMHgxQzU5NTQgICAgICAvKiByYWRhciBkZXRlY3Rpb24gc2V0dGluZ3MgKi8KKyNkZWZpbmUgQVJfUEhZX1JBREFSXzBfRU5BICAweDAwMDAwMDAxICAvKiBFbmFibGUgcmFkYXIgZGV0ZWN0aW9uICovCisjZGVmaW5lIEFSX1BIWV9SQURBUl8wX0lOQkFORCAgIDB4MDAwMDAwM2UgIC8qIEluYmFuZCBwdWxzZSB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgQVJfUEhZX1JBREFSXzBfSU5CQU5EX1MgMQorI2RlZmluZSBBUl9QSFlfUkFEQVJfMF9QUlNTSSAgICAweDAwMDAwRkMwICAvKiBQdWxzZSByc3NpIHRocmVzaG9sZCAqLworI2RlZmluZSBBUl9QSFlfUkFEQVJfMF9QUlNTSV9TICA2CisjZGVmaW5lIEFSX1BIWV9SQURBUl8wX0hFSUdIVCAgIDB4MDAwM0YwMDAgIC8qIFB1bHNlIGhlaWdodCB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgQVJfUEhZX1JBREFSXzBfSEVJR0hUX1MgMTIKKyNkZWZpbmUgQVJfUEhZX1JBREFSXzBfUlJTU0kgICAgMHgwMEZDMDAwMCAgLyogUmFkYXIgcnNzaSB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgQVJfUEhZX1JBREFSXzBfUlJTU0lfUyAgMTgKKyNkZWZpbmUgQVJfUEhZX1JBREFSXzBfRklSUFdSICAgMHg3RjAwMDAwMCAgLyogUmFkYXIgZmlycHdyIHRocmVzaG9sZCAqLworI2RlZmluZSBBUl9QSFlfUkFEQVJfMF9GSVJQV1JfUyAyNAorCisjZGVmaW5lIEFSX1BIWV9TV0lUQ0hfQ0hBSU5fMCAgICAgMHgxQzU5NjAKKyNkZWZpbmUgQVJfUEhZX1NXSVRDSF9DT00gICAgICAgICAweDFDNTk2NAorCisjZGVmaW5lIEFSX1BIWV9TSUdNQV9ERUxUQSAgMHgxQzU5NkMgICAgICAvKiBBUjUzMTIgb25seSAqLworI2RlZmluZSBBUl9QSFlfU0lHTUFfREVMVEFfQURDX1NFTCAgMHgwMDAwMDAwMworI2RlZmluZSBBUl9QSFlfU0lHTUFfREVMVEFfQURDX1NFTF9TICAgIDAKKyNkZWZpbmUgQVJfUEhZX1NJR01BX0RFTFRBX0ZJTFQyICAgIDB4MDAwMDAwRjgKKyNkZWZpbmUgQVJfUEhZX1NJR01BX0RFTFRBX0ZJTFQyX1MgIDMKKyNkZWZpbmUgQVJfUEhZX1NJR01BX0RFTFRBX0ZJTFQxICAgIDB4MDAwMDFGMDAKKyNkZWZpbmUgQVJfUEhZX1NJR01BX0RFTFRBX0ZJTFQxX1MgIDgKKyNkZWZpbmUgQVJfUEhZX1NJR01BX0RFTFRBX0FEQ19DTElQIDB4MDFGRkUwMDAKKyNkZWZpbmUgQVJfUEhZX1NJR01BX0RFTFRBX0FEQ19DTElQX1MgICAxMworCisjZGVmaW5lIEFSX1BIWV9SRVNUQVJUICAgICAgMHgxQzU5NzAgICAgICAvKiByZXN0YXJ0ICovCisjZGVmaW5lIEFSX1BIWV9SRVNUQVJUX0RJVl9HQyAgIDB4MDAxQzAwMDAgIC8qIGJiX2FudF9mYXN0X2Rpdl9nY19saW1pdCAqLworI2RlZmluZSBBUl9QSFlfUkVTVEFSVF9ESVZfR0NfUyAxOAorCisjZGVmaW5lIEFSX1BIWV9SRkJVU19SRVEgICAgICAgIDB4MUM1OTdDCisjZGVmaW5lIEFSX1BIWV9SRkJVU19SRVFfRU4gICAgIDB4MDAwMDAwMDEKKworI2RlZmluZSBBUl9QSFlfUlhfQ0hBSU5NQVNLICAgICAweDFDNTlhNAorCisjZGVmaW5lIEFSX1BIWV9FWFRfQ0NBICAgICAgICAgIDB4MUM1OWJjCisjZGVmaW5lIEFSX1BIWV9FWFRfTUlOQ0NBX1BXUiAgIDB4RkY4MDAwMDAKKyNkZWZpbmUgQVJfUEhZX0VYVF9NSU5DQ0FfUFdSX1MgMjMKKworI2RlZmluZSBBUl9QSFlfSEFMRkdJICAgICAgICAgICAweDFDNTlEMCAgICAgIC8qIFRpbWluZyBjb250cm9sIDMgKi8KKyNkZWZpbmUgQVJfUEhZX0hBTEZHSV9EU0NfTUFOICAgMHgwMDA3RkZGMAorI2RlZmluZSBBUl9QSFlfSEFMRkdJX0RTQ19NQU5fUyA0CisjZGVmaW5lIEFSX1BIWV9IQUxGR0lfRFNDX0VYUCAgIDB4MDAwMDAwMEYKKyNkZWZpbmUgQVJfUEhZX0hBTEZHSV9EU0NfRVhQX1MgMAorCisjZGVmaW5lIEFSX1BIWV9IRUFWWV9DTElQX0VOQUJMRSAgICAweDFDNTlFMAorCisjZGVmaW5lIEFSX1BIWV9NX1NMRUVQICAgICAgMHgxQzU5ZjAgICAgICAvKiBzbGVlcCBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBBUl9QSFlfUkVGQ0xLRExZICAgIDB4MUM1OWY0CisjZGVmaW5lIEFSX1BIWV9SRUZDTEtQRCAgICAgMHgxQzU5ZjgKKworLyogUEhZIElRIGNhbGlicmF0aW9uIHJlc3VsdHMgKi8KKyNkZWZpbmUgQVJfUEhZX0lRQ0FMX1JFU19QV1JfTUVBU19JIDB4MUM1QzEwICAvKiBwb3dlciBtZWFzdXJlbWVudCBmb3IgSSAqLworI2RlZmluZSBBUl9QSFlfSVFDQUxfUkVTX1BXUl9NRUFTX1EgMHgxQzVDMTQgIC8qIHBvd2VyIG1lYXN1cmVtZW50IGZvciBRICovCisjZGVmaW5lIEFSX1BIWV9JUUNBTF9SRVNfSVFfQ09SUl9NRUFTICAgMHgxQzVDMTggIC8qIElRIGNvcnJlbGF0aW9uIG1lYXN1cmVtZW50ICovCisKKyNkZWZpbmUgQVJfUEhZX0NVUlJFTlRfUlNTSSAweDFDNUMxYyAgICAgIC8qIHJzc2kgb2YgY3VycmVudCBmcmFtZSByeCdkICovCisKKyNkZWZpbmUgQVJfUEhZX1JGQlVTX0dSQU5UICAgICAgIDB4MUM1QzIwCisjZGVmaW5lIEFSX1BIWV9SRkJVU19HUkFOVF9FTiAgICAweDAwMDAwMDAxCisKKyNkZWZpbmUgQVJfUEhZX01PREUgICAgIDB4MUM2MjAwICAvKiBNb2RlIHJlZ2lzdGVyICovCisjZGVmaW5lIEFSX1BIWV9NT0RFX0FSMjEzMyAgMHgwOCAgICAvKiBBUjIxMzMgKi8KKyNkZWZpbmUgQVJfUEhZX01PREVfQVI1MTExICAweDAwICAgIC8qIEFSNTExMS9BUjIxMTEgKi8KKyNkZWZpbmUgQVJfUEhZX01PREVfQVI1MTEyICAweDA4ICAgIC8qIEFSNTExMiovCisjZGVmaW5lIEFSX1BIWV9NT0RFX0RZTkFNSUMgMHgwNCAgICAvKiBkeW5hbWljIENDSy9PRkRNIG1vZGUgKi8KKyNkZWZpbmUgQVJfUEhZX01PREVfUkYyR0haICAweDAyICAgIC8qIDIuNCBHSHogKi8KKyNkZWZpbmUgQVJfUEhZX01PREVfUkY1R0haICAweDAwICAgIC8qIDUgR0h6ICovCisjZGVmaW5lIEFSX1BIWV9NT0RFX0NDSyAgICAgMHgwMSAgICAvKiBDQ0sgKi8KKyNkZWZpbmUgQVJfUEhZX01PREVfT0ZETSAgICAweDAwICAgIC8qIE9GRE0gKi8KKworI2RlZmluZSBBUl9QSFlfQ0NLX1RYX0NUUkwgIDB4MUM2MjA0CisjZGVmaW5lIEFSX1BIWV9DQ0tfVFhfQ1RSTF9KQVBBTiAgICAweDAwMDAwMDEwCisKKyNkZWZpbmUgQVJfUEhZX0NDS19ERVRFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDNjIwOAorI2RlZmluZSBBUl9QSFlfQ0NLX0RFVEVDVF9XRUFLX1NJR19USFJfQ0NLICAgICAgICAgIDB4MDAwMDAwM0YKKyNkZWZpbmUgQVJfUEhZX0NDS19ERVRFQ1RfV0VBS19TSUdfVEhSX0NDS19TICAgICAgICAwCisjZGVmaW5lIEFSX1BIWV9DQ0tfREVURUNUX0FOVF9TV0lUQ0hfVElNRSAgICAgICAgICAgMHgwMDAwMUZDMCAvLyBbMTI6Nl0gc2V0dGxpbmcgdGltZSBmb3IgYW50ZW5uYSBzd2l0Y2gKKyNkZWZpbmUgQVJfUEhZX0NDS19ERVRFQ1RfQU5UX1NXSVRDSF9USU1FX1MgICAgICAgICA2CisjZGVmaW5lIEFSX1BIWV9DQ0tfREVURUNUX0JCX0VOQUJMRV9BTlRfRkFTVF9ESVYgICAgMHgyMDAwCisKKyNkZWZpbmUgQVJfUEhZX0dBSU5fMkdIWiAgICAweDFDNjIwQworI2RlZmluZSBBUl9QSFlfR0FJTl8yR0haX1JYVFhfTUFSR0lOICAgIDB4MDBGQzAwMDAKKyNkZWZpbmUgQVJfUEhZX0dBSU5fMkdIWl9SWFRYX01BUkdJTl9TICAxOAorI2RlZmluZSBBUl9QSFlfR0FJTl8yR0haX0JTV19NQVJHSU4gICAgIDB4MDAwMDNDMDAKKyNkZWZpbmUgQVJfUEhZX0dBSU5fMkdIWl9CU1dfTUFSR0lOX1MgICAxMAorI2RlZmluZSBBUl9QSFlfR0FJTl8yR0haX0JTV19BVFRFTiAgICAgIDB4MDAwMDAwMUYKKyNkZWZpbmUgQVJfUEhZX0dBSU5fMkdIWl9CU1dfQVRURU5fUyAgICAwCisKKyNkZWZpbmUgQVJfUEhZX0NDS19SWENUUkw0ICAweDFDNjIxQworI2RlZmluZSBBUl9QSFlfQ0NLX1JYQ1RSTDRfRlJFUV9FU1RfU0hPUlQgICAweDAxRjgwMDAwCisjZGVmaW5lIEFSX1BIWV9DQ0tfUlhDVFJMNF9GUkVRX0VTVF9TSE9SVF9TIDE5CisKKyNkZWZpbmUgQVJfUEhZX0RBR19DVFJMQ0NLICAweDFDNjIyOAorI2RlZmluZSBBUl9QSFlfREFHX0NUUkxDQ0tfRU5fUlNTSV9USFIgIDB4MDAwMDAyMDAgLyogQkIgUmV2IDQuMisgb25seSAqLworI2RlZmluZSBBUl9QSFlfREFHX0NUUkxDQ0tfUlNTSV9USFIgMHgwMDAxRkMwMCAvKiBCQiBSZXYgNC4yKyBvbmx5ICovCisjZGVmaW5lIEFSX1BIWV9EQUdfQ1RSTENDS19SU1NJX1RIUl9TICAgMTAgICAgIC8qIEJCIFJldiA0LjIrIG9ubHkgKi8KKworI2RlZmluZSBBUl9QSFlfUE9XRVJfVFhfUkFURTMgICAweDFDNjIzNAorI2RlZmluZSBBUl9QSFlfUE9XRVJfVFhfUkFURTQgICAweDFDNjIzOAorCisjZGVmaW5lIEFSX1BIWV9TQ1JNX1NFUV9YUiAgMHgxQzYyM0MKKyNkZWZpbmUgQVJfUEhZX0hFQURFUl9ERVRFQ1RfWFIgMHgxQzYyNDAKKyNkZWZpbmUgQVJfUEhZX0NISVJQX0RFVEVDVEVEX1hSICAgIDB4MUM2MjQ0CisjZGVmaW5lIEFSX1BIWV9CTFVFVE9PVEggICAgMHgxQzYyNTQKKworI2RlZmluZSBBUl9QSFlfVFBDUkcxICAgMHgxQzYyNTggIC8qIGFyMjQxMyBwb3dlciBjb250cm9sICovCisjZGVmaW5lIEFSX1BIWV9UUENSRzFfTlVNX1BEX0dBSU4gICAweDAwMDBjMDAwCisjZGVmaW5lIEFSX1BIWV9UUENSRzFfTlVNX1BEX0dBSU5fUyAxNAorCisjZGVmaW5lIEFSX1BIWV9UUENSRzFfUERfR0FJTl8xICAgIDB4MDAwMzAwMDAKKyNkZWZpbmUgQVJfUEhZX1RQQ1JHMV9QRF9HQUlOXzFfUyAgMTYKKyNkZWZpbmUgQVJfUEhZX1RQQ1JHMV9QRF9HQUlOXzIgICAgMHgwMDBDMDAwMAorI2RlZmluZSBBUl9QSFlfVFBDUkcxX1BEX0dBSU5fMl9TICAxOAorI2RlZmluZSBBUl9QSFlfVFBDUkcxX1BEX0dBSU5fMyAgICAweDAwMzAwMDAwCisjZGVmaW5lIEFSX1BIWV9UUENSRzFfUERfR0FJTl8zX1MgIDIwCisvLworCisjZGVmaW5lIEFSX1BIWV9BTkFMT0dfU1dBUCAgICAgIDB4YTI2OAorI2RlZmluZSBBUl9QSFlfU1dBUF9BTFRfQ0hBSU4gICAweDAwMDAwMDQwCisKKyNkZWZpbmUgQVJfUEhZX1RQQ1JHNSAgIDB4MUM2MjZDIC8qIGFyMjQxMyBwb3dlciBjb250cm9sICovCisjZGVmaW5lIEFSX1BIWV9UUENSRzVfUERfR0FJTl9PVkVSTEFQICAgMHgwMDAwMDAwRgorI2RlZmluZSBBUl9QSFlfVFBDUkc1X1BEX0dBSU5fT1ZFUkxBUF9TICAgICAwCisjZGVmaW5lIEFSX1BIWV9UUENSRzVfUERfR0FJTl9CT1VOREFSWV8xICAgIDB4MDAwMDAzRjAKKyNkZWZpbmUgQVJfUEhZX1RQQ1JHNV9QRF9HQUlOX0JPVU5EQVJZXzFfUyAgNAorI2RlZmluZSBBUl9QSFlfVFBDUkc1X1BEX0dBSU5fQk9VTkRBUllfMiAgICAweDAwMDBGQzAwCisjZGVmaW5lIEFSX1BIWV9UUENSRzVfUERfR0FJTl9CT1VOREFSWV8yX1MgIDEwCisjZGVmaW5lIEFSX1BIWV9UUENSRzVfUERfR0FJTl9CT1VOREFSWV8zICAgIDB4MDAzRjAwMDAKKyNkZWZpbmUgQVJfUEhZX1RQQ1JHNV9QRF9HQUlOX0JPVU5EQVJZXzNfUyAgMTYKKyNkZWZpbmUgQVJfUEhZX1RQQ1JHNV9QRF9HQUlOX0JPVU5EQVJZXzQgICAgMHgwRkMwMDAwMAorI2RlZmluZSBBUl9QSFlfVFBDUkc1X1BEX0dBSU5fQk9VTkRBUllfNF9TICAyMgorCisjZGVmaW5lIEFSX1BIWV9QT1dFUl9UWF9SQVRFNSAgIDB4MUM2MzhDCisjZGVmaW5lIEFSX1BIWV9QT1dFUl9UWF9SQVRFNiAgIDB4MUM2MzkwCisKKyNkZWZpbmUgQVJfUEhZX0NBTF9DSEFJTk1BU0sgICAgMHgxQzYzOUMKKworI2RlZmluZSBBUl9QSFlfUE9XRVJfVFhfU1VCICAgICAweDFDNjNDOAorI2RlZmluZSBBUl9QSFlfUE9XRVJfVFhfUkFURTcgICAweDFDNjNDQworI2RlZmluZSBBUl9QSFlfUE9XRVJfVFhfUkFURTggICAweDFDNjNEMAorI2RlZmluZSBBUl9QSFlfUE9XRVJfVFhfUkFURTkgICAweDFDNjNENApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZncyLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmdzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWNlYjAyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZncyLmMKQEAgLTAsMCArMSwxMDE4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICIuLi84MDIxMWNvcmUvY3ByZWNvbXAuaCIKKworY29uc3QgdTMyX3QgemNQMkZ3SW1hZ2VbXSA9IHsKKzB4MDAwOTAwMEIsIDB4NEYyMjJGRTYsIDB4REU5NDdGRkMsIDB4RTExNEQ1OTQsCisweDFFMTNENDk0LCAweDY3NTIxRTRDLCAweEQ0OTRENjkzLCAweDM3NDAyNzY5LAorMHg2MjUyOEYwNiwgMHg3MjAxRDY5MiwgMHg2MDYwMjUyMiwgMHgyNjAwQzkzRiwKKzB4RDc5MDYxNTIsIDB4MjUxMjYxMUQsIDB4MjY0QjY2NTIsIDB4MjU2MjQ3MEIsCisweDAwMDlCMDBELCAweEU2MDA5NUFDLCAweEM4NDA2MEUyLCAweDJGMDI4RjAzLAorMHg4RkY5MzY1MiwgMHg3RjA0NzYwMSwgMHhBMDVBNEYyNiwgMHg0RjIyNkVGNiwKKzB4NDEwQkQxODUsIDB4RDQ4NTAwMDksIDB4MDAwOTQ0MEIsIDB4NDUwQkQ1ODQsCisweEQ3ODQwMDA5LCAweEQyODRFMUZGLCAweDI3MTI2MTFELCAweEQ0ODM1MDI5LAorMHhFMUZGQ0IwMSwgMHgxMjA5RTUwMSwgMHgxMjExMjIxMiwgMHhFNzIwMjQ1MiwKKzB4NDcxOEQ1N0YsIDB4MjU3MkQyN0YsIDB4RDE3RkU3MDAsIDB4RDY4MEQ0N0YsCisweEUyMDEyMjcwLCAweDI0NzAyMTcyLCAweEQ2N0UyNjIwLCAweDI2NDFFNEZGLAorMHhENTdERTYwMCwgMHg2NjZERTEwNCwgMHg3NjAxNjA2MywgMHg0MDAwNjI2RCwKKzB4OEZGODMyMTIsIDB4RDU3OTA1NDUsIDB4MjUyMEUyMDEsIDB4RDI3OUQ3NzgsCisweDI3MTBFMTAwLCAweEU1ODAyMjEyLCAweDY1NUM2NjEzLCAweDY2NkRENDc2LAorMHg3NjA0Njc2MywgMHgzNzRDNjI2RCwgMHg4RkY4MzI1MywgMHhENDczMjcxMiwKKzB4RDU3M0UxMDEsIDB4RDY3MzI0MTAsIDB4MjU0MkU0MDAsIDB4RTAzQUU1MDEsCisweEQyNzJENzcxLCAweEUwMzkwNjU0LCAweDI3MTEwNjU0LCAweDAwMEI0RjI2LAorMHg3RkM4MjIxMSwgMHhENzZGRDE2RSwgMHhEQzcwREI2RiwgMHhEMjcxREU3MCwKKzB4RDU3MkQ0NzEsIDB4MUYxMkQ2NzIsIDB4MUY3NjcxMEMsIDB4MUZCODc3RkMsCisweDFGRUExRkM5LCAweDcyMDQxRjJCLCAweERFNkZEQzZFLCAweDFGMTNFQjEwLAorMHgxRjUxMUY0NCwgMHgxRjc3MUY2NSwgMHhEODZDMUYyQywgMHhERDZERDk2QywKKzB4RDI2REVBMDAsIDB4ODkwMDNBMjIsIDB4RDE1ODdBMDEsIDB4ODgwMTYwMTAsCisweDU2Rjk4QjAzLCAweDQyMThFMjAxLCAweEQxNjgyNjIyLCAweDAwMDk0MTBCLAorMHg0NDBCRDQ2NywgMHhENTY3MDAwOSwgMHgwMDA5NDUwQiwgMHg2MDEwRDE0QywKKzB4OEIxMDg4MDEsIDB4RTY1MEQxNEIsIDB4NDYxODYyMTIsIDB4OEIwODMyNjYsCisweDU2RkFEMTQ3LCAweDIxMjBFMjAwLCAweENCMDE2MDYyLCAweDI2MDJBMDAzLAorMHg3MjAxMjcxMCwgMHg2MDgyMjEyMiwgMHg4OTA5ODgwMSwgMHhFMkM4RDE1QSwKKzB4NjIyQzY2MTIsIDB4ODkwMzM2MjYsIDB4NjAxMEQxNTgsIDB4OEJDODg4MDEsCisweDUxRjc2NzkyLCAweDIxNzI1MkY2LCAweEQ2NTU1MTkxLCAweDU1RkIyMjEyLAorMHg1MkZDNjQ2MiwgMHg1NTYxMjU0MiwgMHgyMjUyRTQwMCwgMHg2MTQzNjY0MywKKzB4MDVERTYwMTMsIDB4MzZDQzQ2MDgsIDB4MDJERTI2NTIsIDB4QzkwMzYwMjEsCisweDhCMDI4ODAxLCAweDcyMDE2MkUyLCAweDc0MDEyRTIyLCAweDM2QjM2NjRDLAorMHg3MTA0OEZFRSwgMHg2NkMyRDE0NywgMHg0NTI4NjUxMiwgMHgyNjVCNDUxOCwKKzB4NjA4MjJDNjIsIDB4ODkwMTg4MDEsIDB4MDAwOUExNjgsIDB4NjI3MkQ3NDIsCisweDhCMTMyMjI4LCAweEQ3MjZENTQxLCAweDY1NTJENDQxLCAweDUxNDM2NjcyLAorMHgzMTZDMzY1QywgMHgyNzYyMjY2OCwgMHgxNDEzOEQwNSwgMHg2MjYyRDYzRCwKKzB4QjFBNTcyMDEsIDB4RDYxRTI2MjIsIDB4MjYyMkUyMDAsIDB4NTI5MTY2OTIsCisweDhCMDEzNjIwLCAweDAwMDlBMTQ0LCAweDYwNjFBMDZFLCAweDAwMUMwMDFDLAorMHgwMDFENDAyMCwgMHgwMDAwQjM4RSwgMHhGRkZGMDAwMCwgMHgxMjM0MDAwMCwKKzB4MDAxRTEwMTUsIDB4MDAyMDEyNzgsIDB4MDAyMDE4QTAsIDB4MDAyMDE5MjIsCisweDAwMjAxMjhDLCAweDAwMUMzNTEwLCAweDAwMUMzNjI0LCAweDAwMUUyMTJDLAorMHgwMDIwMzk3QywgMHgwMDIwMzUxNCwgMHgwMDIwMzk4NCwgMHgwMDIwMzk5MCwKKzB4MDAyMDM5OUMsIDB4MDAyMDM5RjgsIDB4MDAyMDM5RkMsIDB4MDAyMDM5QTQsCisweDAwMjAzOUE1LCAweDAwMjAzOUE4LCAweDAwMTE3NzAwLCAweDAwMjAzQTEyLAorMHgwMDIwMzU3OCwgMHgwMDExNDJEOCwgMHgwMDIwM0ExNCwgMHgwMDIwM0ExNiwKKzB4MDAxQzNEMzAsIDB4MDAxMTc3MTgsIDB4MDAxQzNEMDAsIDB4MDAxQzEwMDAsCisweDAwMUMzNkY4LCAweDAwMTE3NzM0LCAweDAwMUMzNjg0LCAweDAwMTE3NzEwLAorMHgwMDFDMzUyMCwgMHgwMDExNzYwMCwgMHgwMDExNzc0MCwgMHgwMDFDMTAyOCwKKzB4MDAyMDM1OEMsIDB4MDAyMDM5QUMsIDB4N0ZGRkZGRkYsIDB4MDAyMDE3MzQsCisweDAwMjAzMkJFLCAweDAwMjAyMkU4LCAweDAwMjAzREMwLCAweDAwMjAzOUZBLAorMHgwMDIwMzU4NCwgMHgwMDIwMzlFQywgMHgwMDFDM0QyQywgMHgwMDFDMzZCMCwKKzB4MDAyMDM1MUMsIDB4MDAxMTc3NUMsIDB4ODgwMUM5MEYsIDB4QTBDRjg5MDEsCisweEQxN0MwMDA5LCAweDM2MjA2MjEyLCAweEQ0N0I4OTA0LCAweDI0MjFFMjAwLAorMHgyMTYyQTBDQywgMHg2MjExRDE3OSwgMHg4OTAxMjIyOCwgMHgwMDA5QTBDMywKKzB4RTIwMkQ3NzUsIDB4NzUwMTY1NzEsIDB4MzEyMzYxNUQsIDB4Mjc1MThEMDIsCisweDAwMDlBMEJDLCAweEQyNzI1NUYyLCAweDYyMjI2MDUyLCAweDQwMDk0MDE5LAorMHhDOTBGNDAwOSwgMHg4RjE5ODgwQSwgMHg1MkYzMUYyRCwgMHg0MDE5NjAyMiwKKzB4NDAwOTQwMDksIDB4ODgwOEM5MEYsIDB4QTBBNzg5MDEsIDB4NjA2MzAwMDksCisweDUxRjI1NUY4LCAweEU3MDFDQjAxLCAweDI1MDJEMjYzLCAweEUxMDAyMTcyLAorMHgyMjExRDU2NCwgMHg3NDAxNjQ1MiwgMHgyNTQyQTA5OCwgMHg4QjNGODgwNSwKKzB4NjAyMjUyRjMsIDB4NDAwOTQwMTksIDB4QzkwRjQwMDksIDB4OEIxNjg4MDIsCisweEU1RkZENDVELCAweDY1NUQ2NzQyLCAweDhCMTAyNzU4LCAweDYyNzJENzVCLAorMHg4QjBDMzI2MCwgMHg1NUYyNTdGOCwgMHgyNzYyRTEwMSwgMHhENTUyMjUxMiwKKzB4RDc1N0U0MDAsIDB4NjI3MjI1NDEsIDB4QTA3NzcyMDEsIDB4NTJGMzI3MjIsCisweDQwMTk2MDIyLCAweDQwMDk0MDA5LCAweDg4MDVDOTBGLCAweDMxQjM4QjZFLAorMHhENTUwOEI2QywgMHg2MTUyNTdGNCwgMHg3MTAxRTI0MCwgMHg2NDcyMjUxMiwKKzB4MUY0REQxNEQsIDB4NDIxODI0MTksIDB4OEIwMzM0MjAsIDB4NjI2MkQ2NEIsCisweDI2MjI3MjAxLCAweEUyMDBENjQwLCAweDI2MjFCMEFBLCAweDAwMDlBMDU2LAorMHgzMTIzRTIyMCwgMHg4ODAzOEI1MiwgMHg1MkYzOEIxRSwgMHg0MDE5NjAyMiwKKzB4NDAwOTQwMDksIDB4ODgwM0M5MEYsIDB4RDc0MThCMTYsIDB4NjQ3MjUxRjQsCisweDc0MDFEMjNELCAweDY1MTIyNzQyLCAweDFGNURFNjQwLCAweDQ2MTgyNTI5LAorMHg4QjAzMzU2MCwgMHg2MjYyRDYzQiwgMHgyNjIyNzIwMSwgMHhFMjAwRDYyRSwKKzB4MjYyMUIwODYsIDB4MDAwOUEwMTAsIDB4RDczOEQxMzcsIDB4RDIyQTY0MTIsCisweEU1MDA3NDAxLCAweDIxNDIzQTc2LCAweDIyNTE4RjA2LCAweEVBMDBENjM0LAorMHg3MjAxNjI2MiwgMHgyNjIyQjA3NCwgMHgyRkIyRDUzMiwgMHg5NTQwNjY1MiwKKzB4RDQzMDVCRjEsIDB4MzYyMDUyNDEsIDB4NjA2MTg5MTAsIDB4OEIwMUM4MDMsCisweDJCMjJFMjAxLCAweDhGRjU0NTEwLCAweDU3RjE1NjY0LCAweDYyNzJFMUYwLAorMHg0MTI4NDExOCwgMHgyNzIyMjIxQiwgMHg2QkYyQTAwOCwgMHg2QkYyQTAwNiwKKzB4RTIwMEQ2MTUsIDB4RDExNTI2MjEsIDB4MjEyMUUyMDAsIDB4RTIwMjU2RjUsCisweDQyMTg2NjYyLCAweDI2Mjg0MjI4LCAweDFGNkQ4RDBDLCAweEQ2MUZEMTFFLAorMHg0NjBCNjUxMSwgMHgyMDA4NjQ1RCwgMHg1N0Y1ODkwNCwgMHg2MjcyRDExQywKKzB4MjcyMjIyMTksIDB4RDExQkUyMDEsIDB4NjYxMjI4MjIsIDB4OEIwMTI2NjgsCisweDAwMDlBRTE3LCAweDQ1MEJENTE4LCAweEQxMTgwMDA5LCAweEFFMTBFNjAwLAorMHgwN0QxMjE2MCwgMHgwMDIwM0EwQywgMHgwMDIwM0ExMCwgMHgwMDIwM0ExOCwKKzB4MDAxQzNEQzAsIDB4MDAxMTc3MkMsIDB4MDAxQzNCODgsIDB4MDAyMDM5RjQsCisweDAwMTE3NzNDLCAweDAwMTE3NzQ0LCAweDAwMDBGMDAwLCAweDAwMTE3NzY0LAorMHgwMDExNzc0OCwgMHgwMDExNzc2OCwgMHgwMDExNzc2QywgMHgwMUZGRkZGRiwKKzB4MDAxMTc3NEMsIDB4MDAyMDM1ODQsIDB4MDAxMTQyRDgsIDB4MDAxMTQ3NzQsCisweEZERkZGRkZGLCAweDAwMjAzREMwLCAweDAwMjAyNDZDLCAweDAwMjAzOUZBLAorMHgyRjk2MkY4NiwgMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwKKzB4RDExRjdGRjQsIDB4NjIxMkRFMUYsIDB4NjdFMjU0MTEsIDB4RDQxRTFGNDEsCisweDFGNzIyRjIyLCAweDY3NDNENTFELCAweDc3OTREMjFELCAweDVBNDI1ODQxLAorMHg2QzcyNjk0MiwgMHg2RDIyNUIxNiwgMHhFNjAwNjA1MiwgMHgyNTAyQ0IyMCwKKzB4NzYwMUU1NDAsIDB4MzI1MzYyNkQsIDB4NjJGMjhCRkIsIDB4MjEyMjU1RjEsCisweDU1RjIxMTUxLCAweDJFNTJENjEzLCAweDE0QTIxNDgxLCAweEQ0MTIyNDkyLAorMHgxMUI2MjdDMiwgMHg2NzQyMjZEMiwgMHhEOTExREExMCwgMHgyQTcyRTgwMSwKKzB4MUE4QzQ5MEIsIDB4NDIxOEUyMDEsIDB4N0YwQzFBMkMsIDB4NkVGNjRGMjYsCisweDZDRjY2REY2LCAweDZBRjY2QkY2LCAweDAwMEI2OUY2LCAweDAwMDA2OEY2LAorMHgwMDFDM0I5QywgMHgwMDFDM0Q5OCwgMHgwMDFDMzcwMCwgMHgwMDFDMzUwMCwKKzB4MDAxQzU5NjAsIDB4MDAxQzg5NjAsIDB4MDAyMDM1OEMsIDB4MDAxQzNEMDAsCisweDAwMjAxNjEwLCAweDJGOTYyRjg2LCAweDJGQzYyRkE2LCAweDJGRTYyRkQ2LAorMHg0RjEyNEYyMiwgMHg3Rjg4NEYwMiwgMHhFMDE4REVCMiwgMHhENEIyNjFFMCwKKzB4NjFFMzBGMTQsIDB4NjIxMDcxMDEsIDB4NDQwQkUwMUMsIDB4MjAwODBGMjQsCisweDhGMTI2RDAzLCAweEQ0QUQxRjA4LCAweDY3NDBEREFELCAweDY1N0NENEFELAorMHg0NzBCRDdBRCwgMHhEMkFEMDAwOSwgMHg2MjFDNjEyMCwgMHg0NjA4NjYyMywKKzB4MzYyODQ2MDgsIDB4M0Q2QzQ2MDgsIDB4RTAxQzFGRDgsIDB4RTU4MDA0RkMsCisweDYwNEM2NkUyLCAweDMwNTA2NTVDLCAweDJENjI4RjE3LCAweDAxRkNFMDE4LAorMHhERUEzRTUwMCwgMHg2NDFDQTAwOCwgMHg2NzUzNjU1RCwgMHg2MDcwMzdFQywKKzB4MzFEQzYxNTMsIDB4ODAxNDc1MDEsIDB4MzI0MzYyNUQsIDB4RDQ5RDhCRjQsCisweEUyMDBENTlELCAweEEyN0YyNDIxLCAweDIwMDgyNTIxLCAweEUwMTg4QjEzLAorMHhFNTAwMDFGQywgMHhBMDA5REU5NiwgMHg2NTVENjQxQywgMHgzMkVDNjI1MywKKzB4NjI1MzY3MjIsIDB4MzJEQzY2NzIsIDB4NzUwNDEyNjEsIDB4MzI0MzYyNUQsCisweEEyNjk4QkYzLCAweDg4MDEyRDEwLCAweEUwMTg4QjE2LCAweEU0MDAwMUZDLAorMHg2NzFDMkQ0MCwgMHg2MjREREU4QSwgMHg4QjAxMzI3MywgMHgwMDA5QTI1QywKKzB4NkRFMzY0NEQsIDB4N0QwNDYyNDMsIDB4MzJFQzY2NDMsIDB4NjUyMjM2REMsCisweDc0MDg2MTYyLCAweDI1MTJBRkVGLCAweDhCMTk4ODA0LCAweDAxRkNFMDE4LAorMHgyRDcwRTcwMCwgMHgxRkQ1NkQxQywgMHg2MjdEREU3RCwgMHg4QjAxMzJEMywKKzB4MDAwOUEyNDIsIDB4NjE3MzY3N0QsIDB4MzFFQzY1RTMsIDB4NzUwNDY0MTIsCisweDM2NUM2NjczLCAweDYxNDI2MjYyLCAweDIxMjk3NzA4LCAweDI0MTJBRkVELAorMHg4QjE5ODgwNSwgMHgwMUZDRTAxOCwgMHgyRDcwRTcwMCwgMHgxRkQ0NkQxQywKKzB4NjI3RERFNkYsIDB4OEIwMTMyRDMsIDB4MDAwOUEyMjYsIDB4NjE3MzY3N0QsCisweDMxRUM2NUUzLCAweDc1MDQ2NDEyLCAweDM2NUM2NjczLCAweDYxNDI2MjYyLAorMHgyMTJCNzcwOCwgMHgyNDEyQUZFRCwgMHg4QjU5ODgzMSwgMHg2MUU2REU2NywKKzB4NjFFMzFGMTksIDB4NjRFMjcxMDQsIDB4MUY0QTYyMTYsIDB4MUYyQjY0MTYsCisweDc1RTQ2NTEzLCAweDY2NTM2NzEyLCAweDFGNEM3NjA0LCAweDY0NTIxRjdELAorMHhENzVGNkU2NiwgMHgyN0UwRDI1RiwgMHhERTVGNjA2MiwgMHhDOTAxMzI0NSwKKzB4NjU2MjJFMDAsIDB4NDYwOTA2MEEsIDB4NDYwOUQxNUMsIDB4NDYwOTQ1MDksCisweDIxNTAxRjRFLCAweEIyQjA2NDZELCAweDYyMEQxRjZGLCAweDhCMDEyMjI4LAorMHgwMDA5QTFFQSwgMHhENzU2REU1NSwgMHg2NjFDNjFFMCwgMHg2NDEwRDE1MCwKKzB4NDcwQjY1NEMsIDB4N0ZGQzU0RkYsIDB4MkZFMjVFRkUsIDB4NTFGRTdGRkMsCisweDJGMTJFMDQwLCAweDU1RkJEMTRGLCAweDU3RkQ1NkZDLCAweDA0RkU0MTBCLAorMHhEMjREN0YwOCwgMHhFMTFDNjQwRCwgMHgxRDQxMkQxMCwgMHhENDRCNjUyMiwKKzB4Njc0MjFENTIsIDB4MUQ3M0RFNEEsIDB4RDI0QTY1RTIsIDB4NjcyMjFENTQsCisweDFENzVEMjQ5LCAweEQyNDk2RTIyLCAweDY2MjIxREU2LCAweDFENjdBMUJDLAorMHg4OTAxODgzMCwgMHgwMDA5QTA4RSwgMHhFMzQwRDUzOCwgMHgzM0ZDNjE1NiwKKzB4MjMxMjY0NTYsIDB4NzEwNDYxNTMsIDB4Njc1MjEzNDEsIDB4MTM3MjY0MTYsCisweDdFRTQ2RTEzLCAweDY1RTY2MjEyLCAweDY2RTNENzMxLCAweDEzMjQ2RUUyLAorMHg3NjA0MjdFMCwgMHg2MDYyRDIyRiwgMHgzMjU1REUyRiwgMHgyRTAwQzkwMSwKKzB4MDYwQTZFNjIsIDB4RDEyRDQ2MDksIDB4NEUwOTQ2MDksIDB4MTM0MzQ2MDksCisweDY0NkQyMUUwLCAweEIyNTAxRjVFLCAweDYyMEQxRjZGLCAweDhCMDEyMjI4LAorMHgwMDA5QTE4QSwgMHhERTI1RDUyMiwgMHg2MUUwNjQ1MCwgMHhENzI0NjU0QywKKzB4NDcwQjU0RkYsIDB4N0ZGQzY2MUMsIDB4MDZGRUUwNTQsIDB4N0ZGQzJGNjIsCisweEVFNDAwMUZFLCAweDJGMTIzRUZDLCAweDU1RTJEMTI1LCAweDU3RTQ1NkUzLAorMHg2NEUyNDEwQiwgMHhEMjFDN0YwOCwgMHhFMTFDNjQwRCwgMHgxRDQxMkQxMCwKKzB4RDYxQTY1MjIsIDB4Njc2MjFENTIsIDB4MUQ3M0RFMTksIDB4RDIxOTZFRTIsCisweDYyMjIxREU0LCAweEQyMTgxRDI1LCAweDFEMjY2MjIyLCAweDYyMjJEMjE3LAorMHgxRDI3QTE1QSwgMHgwMDExNzgwMCwgMHgwMDIwMkExOCwgMHgwMDIwMzk5NiwKKzB4MDAyMDM1QkMsIDB4MDAyMDNBN0MsIDB4MDAyMDE4RDAsIDB4MDAyMDM5OTUsCisweDAwMTE3ODA0LCAweDAwMjAzQTE0LCAweDAwMjAzQTE2LCAweDAwMTE3ODEwLAorMHgwMDIwMzk5MSwgMHgxMDYyNEREMywgMHgwMDIwMzk5MiwgMHgwMDIwMzk5MywKKzB4MDAxMTRBQTQsIDB4MDAyMDBGNjgsIDB4MDAxQzU4NjQsIDB4MDAxQzY4NjQsCisweDAwMUM3ODY0LCAweDAwMUM1OUJDLCAweDAwMUM2OUJDLCAweDAwMUM3OUJDLAorMHgwMDIwMEZDMCwgMHg4QjA0ODgzMywgMHg0NzBCRDdBMiwgMHhBMTIzRUUwMCwKKzB4ODgyODJERTAsIDB4QTBEMzg5MDEsIDB4REU5RjAwMDksIDB4NjJFMUUxNDMsCisweDMyMTZFMDU0LCAweDBGRTY4RjAyLCAweDJFMjFFMjQwLCAweDYyMkQ2MkUxLAorMHg4QjAxMzIxNywgMHgwMDA5QTBCQywgMHhFNTAxODVFMSwgMHg4QjAxMzA1NiwKKzB4MDAwOUEwQjYsIDB4MkQxMEUxMDEsIDB4NjRFMUIxMTEsIDB4MDZGRUUwNTQsCisweDYyNjFFMTQzLCAweDM1MTc2NTJELCAweEU2NDA4OTQ1LCAweDhCMEMzNTYzLAorMHhFMDU4RTQxQSwgMHhFNTAwMEY0NSwgMHg3MkMwRTA1QywgMHg2MDIzMEY1NSwKKzB4NjcwM0M5MDcsIDB4QTAxNEUwNjAsIDB4NjY1MzBGNzUsIDB4NDYyMTQ2MjEsCisweDQ2MjE0NjIxLCAweDQ1MjE0NjIxLCAweEUwNTg3NjE4LCAweDBGNjU0NTIxLAorMHhFMDAzNDUyMSwgMHhFMDVDMjUwOSwgMHhFMDA3MEY1NSwgMHhFMDYwMjIwOSwKKzB4RTg1NDBGMjUsIDB4ODU4MjM4RkMsIDB4NjQwRDY1RjMsIDB4MTg0NEIxNzAsCisweEREN0E4NTg0LCAweDg1ODY2QzBELCAweDYxMEQ0QzA4LCAweDQxMDg2MEMzLAorMHhFMDBGMEVGRSwgMHgxODE1NEQwQiwgMHgyRTI5NjIwNywgMHg2NjgyNjBDMywKKzB4ODU2MjBGRTYsIDB4NEQwQjUxODUsIDB4MkUwQjYwMEQsIDB4NTQ4NDYwQzMsCisweEIxM0MwRkU2LCAweEUwNTQ2NUYzLCAweEU1NDAwRUZFLCAweEUwNkM2MkUxLAorMHgzNjUzNjYyRCwgMHgwRjY2OEQ0MSwgMHhDOTAzNjAyMywgMHg0MDAwNDAwOCwKKzB4NjEwMzY0MDMsIDB4RDk2NUUwNzAsIDB4MEY0NkU1RkYsIDB4RTA3NDY1NUMsCisweDYwNTMwRjk2LCAweDYyNjM0OTBCLCAweDQyMjE0MjIxLCAweDQyMjE0MjIxLAorMHg0MjAwNjcyMywgMHg0MjAwMzI3QywgMHg2QzA3NDYyMSwgMHg0NjIxRTA1NCwKKzB4NjA2MzA5RkUsIDB4NDAwOEM5MDMsIDB4NzkwNjMwRkMsIDB4NkEwMzZEMkQsCisweDY1RjNFODAwLCAweDY0RDNCMTI0LCAweEUwNzA2RUEyLCAweDJBRTIyRUM5LAorMHgwMUZFNjY5NCwgMHg2NjZDRTA3NCwgMHg0NzBCMDdGRSwgMHgyRTBCNjA2MywKKzB4NjVGMzJBRTIsIDB4QjBGQTY0RDMsIDB4NjI4RDc4MDEsIDB4MzJFM0VFMDYsCisweDdEMDE4RkU3LCAweDBFRkVFMDU0LCAweEUwNTQ2MkUxLCAweDQyMDAwNkZFLAorMHg3NjBDODU2MSwgMHg3MDFCMzAyQywgMHhFNDAwNjEwMywgMHhFNzA0NjVGMywKKzB4Njg2Njc0MDEsIDB4Mzk3MzY5NEQsIDB4OEZGOTI1ODIsIDB4NjVGMzc1MDQsCisweDY0MURCMERELCAweDBFRkVFMDU0LCAweDY0RTFCMDlDLCAweDAwMDlBMDU0LAorMHhENDNCNTZGOCwgMHhFQTAxRDIzQiwgMHgyNkEwNDIwQiwgMHgwMDA5QTA0QywKKzB4MDZGQ0UwMUMsIDB4ODgyOTYwNkMsIDB4NUNGODhCMDgsIDB4RTIwMEQ2MzYsCisweDUyNjEyQzIwLCAweDY0MkRCMDRCLCAweDAwMDlBMDNFLCAweDY2NkNFNjgxLAorMHg4QjA0MzA2MCwgMHg0MjBCRDIzMSwgMHhBMDM1NTRGOCwgMHhFNjgyMDAwOSwKKzB4MzA2MDY2NkMsIDB4RDIyRThCMDQsIDB4NTRGODQyMEIsIDB4MDAwOUEwMkMsCisweDY2NkNFNjgzLCAweDhCMEEzMDYwLCAweERBMjc1NUY4LCAweDI1OTBFOTAwLAorMHhEODI4NTVBMSwgMHgyODUyRDYyOCwgMHhBMDFENTJBMiwgMHhFNjkyMjYyMCwKKzB4MzA2MDY2NkMsIDB4RDIyMDhCMDgsIDB4NUMyMUQ4MjQsIDB4NkNDQzUyRjgsCisweDI4QzFFNjAwLCAweDIyNjBBMDEwLCAweDY2NkNFNjkzLCAweDhCMDYzMDYwLAorMHhENjFGNTlGOCwgMHhFMjAxRUEwMCwgMHhBMDA1MjlBMCwgMHhENjE2MjYyMSwKKzB4RDIxREQ0MUMsIDB4NjU2MjQyMEIsIDB4NEYwNjdGNzgsIDB4NEYyNjRGMTYsCisweDZERjY2RUY2LCAweDZBRjY2Q0Y2LCAweDAwMEI2OUY2LCAweDRGMjI2OEY2LAorMHhFMjQwNjE0RCwgMHg4OTMyMzEyMywgMHgzMTI3RTIxRiwgMHg4QjI3RDcxMywKKzB4RDQwNjYxNEQsIDB4RTAwMTcxRTAsIDB4NTY3MTQ0MEIsIDB4MjY1OTY1MDcsCisweDE3NjFBMDI1LCAweDAwMjAwRkJDLCAweDAwMTE3ODA0LCAweDAwMjAzNDcwLAorMHgwMDIwM0E5QywgMHgwMDIwMThDMCwgMHgwMDExNzgwMCwgMHgwMDExNUYwMCwKKzB4MDAxMTYwNTgsIDB4MDAyMDM5N0MsIDB4MDAyMDM5OTAsIDB4MDAyMDNBMUEsCisweDAwMjAzQTE2LCAweDAwMjAzQUI0LCAweDAwMjAxOEQwLCAweDAwMUMzNzA0LAorMHhFMDAxRDQ5MCwgMHg2NjcyNDQwQiwgMHgyNjU5NjUwNywgMHg0RjI2Mjc2MiwKKzB4MDAwOTAwMEIsIDB4NjE0RDRGMjIsIDB4MzEyM0UyNDAsIDB4RTIxRjg5MTIsCisweEQ3ODkzMTI3LCAweDYxNEQ4QjA4LCAweDU2NzFEMjg2LCAweDQyMEI3MUUwLAorMHgyNjBCRTAwMSwgMHgxNzYxQTAwNiwgMHg2NjcyRDI4MiwgMHhFMDAxNDIwQiwKKzB4Mjc2MjI2MEIsIDB4MDAwQjRGMjYsIDB4RTY0MDAwMDksIDB4NDYyODQ2MTgsCisweDYyNTJENTdFLCAweDg5RkMyMjY4LCAweDAwMDkwMDBCLCAweDQ2MThFNjgwLAorMHhENTdBNDYyOCwgMHgyMjY4NjI1MiwgMHgwMDBCODlGQywgMHhBMDAxMDAwOSwKKzB4NzIwMUUyMDAsIDB4OEJGQzMyNDIsIDB4MDAwOTAwMEIsIDB4NDYxOEU2ODAsCisweEQ1NzM0NjI4LCAweDIyNjg2MjUyLCAweDAwMEI4QkZDLCAweDJGRTYwMDA5LAorMHg3RkZDNEYyMiwgMHhCRkYxNkU1MywgMHg2MUUyMkY0MiwgMHhFMjgwRDY2RCwKKzB4NTRFMTE2MTUsIDB4MTY0NjQyMTgsIDB4NDIyODU1RTIsIDB4NTdFMzE2NTcsCisweDE2Nzg2RUYyLCAweDI2RTIyRTJCLCAweDRGMjY3RjA0LCAweDZFRjZBRkNFLAorMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHg2QzUzREQ2MiwgMHg2RTQzQkZENiwKKzB4MkRFMkJGQkIsIDB4MDAwOUJGRDIsIDB4MkMxMjUxRDUsIDB4MUM0MTU0RDYsCisweDFDNTI1NUQ3LCAweDFDNjM1NkQ4LCAweDZFRjY0RjI2LCAweDAwMEI2REY2LAorMHg2MTYzNkNGNiwgMHhBMDA0RTYwMCwgMHg2MjU2NDEwOSwgMHgyNDIyNzYwMSwKKzB4MzYxMjc0MDQsIDB4MDAwQjhCRjksIDB4RDY1MzAwMDksIDB4ODU2MkU1MDAsCisweEEwMEI2NzRELCAweDY1NUQ2MTBELCAweDQwMDA2MDUzLCAweDMwNUNENDRGLAorMHgwMjRENDAwOCwgMHgzMjcwNjIyRCwgMHg3NTAxODkwNSwgMHgzMjEzNjI1RCwKKzB4MDAwQjhCRjEsIDB4MDAwQkUwMDAsIDB4MkZFNkUwMDEsIDB4NTQ0MTY3NDMsCisweDRFMDhFRTdGLCAweDRFMjhEMjQ2LCAweDI1RTk2NTQzLCAweDYwNDM2RTIxLAorMHg5RTc1NjJFRCwgMHg0NTI5QzkwMywgMHhFNjAwMzJFMywgMHg4RDQ1NjEwMywKKzB4MjExODQ1MDksIDB4RDIzRjhCMDUsIDB4MDAyQzYwNTMsIDB4QTA4QUM5M0YsCisweDYwMTM2NjAzLCAweDhCMjY4ODAxLCAweDg4MEM2MDUzLCAweEQ1M0E4QjA0LAorMHhDOTNGODQ1MywgMHg2NjAzQTA3RiwgMHg4QjA0ODgwOCwgMHg4NEUyREUzNiwKKzB4QTA3OEM5M0YsIDB4ODgwRDY2MDMsIDB4OEIwM0Q2MzMsIDB4QzkzRjg0NjEsCisweDY2MDNBMDcxLCAweDg4MDk2MjYwLCAweDYyMkM4RjA5LCAweEUwMTRERTJDLAorMHg2NTVDMDVFQywgMHg2MDIzMzI1OCwgMHhBMDY0QzkzRiwgMHg2MDIzNjYwMywKKzB4QTA2MEM5M0YsIDB4ODgwMjY2MDMsIDB4RTAwNzhCNUQsIDB4NjA0MzI1MDksCisweDg5MDVDODEwLCAweDYwNTNEMjI1LCAweEM5M0YwMDJDLCAweDY2MDNBMDUzLAorMHg2MDUzREUyMywgMHhDOTNGMDBFQywgMHg2NjAzQTA0RCwgMHg4ODAxNjAxMywKKzB4NjA1MzhCMTksIDB4OEIwNDg4MEMsIDB4ODQyM0QyMUUsIDB4QTA0MkM5M0YsCisweDg4MDg2NjAzLCAweEQ1MUI4QjA0LCAweEM5M0Y4NDUyLCAweDY2MDNBMDNCLAorMHhENjE4ODgwRCwgMHg4NDYxOEIwMywgMHhBMDM0QzkzRiwgMHg2MDYwNjYwMywKKzB4QTAzMEM5M0YsIDB4ODgwMjY2MDMsIDB4RTAwNzhCMkQsIDB4NjA0MzI1MDksCisweDg5MjNDODEwLCAweDYwNTNERTEwLCAweEM5M0YwMEVDLCAweDY2MDNBMDIzLAorMHgwMDAwMEJCOCwgMHgwMDIwMzQ3MCwgMHgwMDFDMzcwNCwgMHgwMDFDMzczQywKKzB4MDAxQzM3MDAsIDB4MDAxQzM3MEMsIDB4MDAxMTQwMDAsIDB4MDAxMTQwMDgsCisweDAwMTE0MkQ4LCAweDAwMTE0MkU0LCAweDAwMTE0MkU4LCAweDAwMTE0MkY1LAorMHgwMDExNDJFRCwgMHgwMDExNDJGRCwgMHgwMDExNDMwOSwgMHg2MDUzRDIwOSwKKzB4QzkzRjAwMkMsIDB4NjAxMzY2MDMsIDB4OEIwMzg4MDIsIDB4QzgxMDYwNDMsCisweDc2MDI4OTAwLCAweEM5M0Y2MDYzLCAweDQwMDA0MDE4LCAweDE3NDEyNDBCLAorMHg2RUY2MDAwQiwgMHgwMDExNDMwMSwgMHgwMDA5QTE2RSwgMHgyRkU2MkZENiwKKzB4REQ5NDRGMjIsIDB4QTAwNDlFQjIsIDB4RDQ5MzAwMDksIDB4NDIwQkQyOTMsCisweDYyRDI2NUQyLCAweDhCRjgyMkU4LCAweDAwMDlBMDA0LCAweEQyOEZENDkwLAorMHg1NUQxNDIwQiwgMHgyMkU4NTJEMSwgMHhBMDA0OEJGOCwgMHhENDhEMDAwOSwKKzB4NDIwQkQyOEEsIDB4NTJEMjU1RDIsIDB4OEJGODIyRTgsIDB4MDAwOUEwMDQsCisweEQyODZENDg5LCAweDU1RDM0MjBCLCAweDIyRTg1MkQzLCAweEEwMDQ4QkY4LAorMHhENDg2MDAwOSwgMHg0MjBCRDI4MSwgMHg1MkQ0NTVENCwgMHg4QkY4MjJFOCwKKzB4NkVGNjRGMjYsIDB4NkRGNjAwMEIsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweDZFNjM2QzczLCAweDZENTNCMDFBLCAweDY0RDM1N0Y0LCAweEIwNUY2NUUzLAorMHhCMDc1NjZDMywgMHhCMEE0MDAwOSwgMHhCMEE4MDAwOSwgMHhCMEFDMDAwOSwKKzB4QjBBQzAwMDksIDB4QjBBRjAwMDksIDB4QjAzMTU0RjUsIDB4NkNDRDZDMDMsCisweDRGMjY2MEMzLCAweDZERjY2RUY2LCAweDZDRjYwMDBCLCAweDM0MTJEMTcwLAorMHhENjcwMDUyOSwgMHgyNjUwRDc3MCwgMHgyNzQyMDAwQiwgMHgwMDA5QTAxOCwKKzB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4NkU2MzZDNzMsIDB4NkQ1M0JGRUUsCisweDY0RDM1N0Y0LCAweEIwMzM2NUUzLCAweEIwOEQ2NkMzLCAweEIwMEY1NEY1LAorMHg2Q0NENkMwMywgMHg0RjI2NjBDMywgMHg2REY2NkVGNiwgMHg2Q0Y2MDAwQiwKKzB4RTUwM0QxNjIsIDB4RDc2M0Q0NjIsIDB4MjE1MjQ1MTgsIDB4MjQ3MjAwMEIsCisweEQ0NUZEMTVFLCAweDIxNjJFNjAwLCAweDI0NjIwMDBCLCAweEJGNzM0RjIyLAorMHhCRjczRTQwQSwgMHhEMjVDMDAwOSwgMHg0MTE4RTEwNCwgMHhFNDBBRTUwMCwKKzB4QkY2OTIyMTIsIDB4RDc1OTIyNTIsIDB4Q0IyMDYwNzIsIDB4MDAwQjRGMjYsCisweDRGMjIyNzAyLCAweDQxMEJEMTU2LCAweEQ1NTZFNDAwLCAweDRGMjY0NTJCLAorMHhEMTU1MkZFNiwgMHg2NjEyNkU2MywgMHg5MjEwNDQxOCwgMHg0NDA4NDUyOCwKKzB4NDUwMDI2MjksIDB4MjY1QjQ0MDgsIDB4MjY0QjQ0MDAsIDB4MjE2MjQ3MDgsCisweEQxNEU0NzA4LCAweDIxNzIyN0VCLCAweDZFRjYwMDBCLCAweDFGRkYwM0YwLAorMHg0RjIyMkZFNiwgMHhFMTAxREU0QSwgMHhCRjNERTQwQSwgMHg2N0UzMkUxMiwKKzB4RTUwMDc3NkMsIDB4RTIwNEUxMzAsIDB4Mjc1MkU0MEEsIDB4Mjc1MjI3NTIsCisweDI3NTIyNzUyLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLAorMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwKKzB4MjcyMjI3MTIsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsCisweDI3NTIyNzUyLCAweDE3NUFCRjE4LCAweDJFNjJFNjAwLCAweDAwMEI0RjI2LAorMHhEMjM0NkVGNiwgMHhFNDQxRTEwMSwgMHgwMDBCMjIxMiwgMHhEMTMyMjI0MiwKKzB4RTYwNUQ0MzIsIDB4MDAwQjIxNjIsIDB4MDAwQjI0NjIsIDB4RDIzMDAwMDksCisweEU0MEFFNjAxLCAweDIyNjJBRjAwLCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LAorMHg3RkZDNEYyMiwgMHg2QzQzREIyQiwgMHhFRDAwNjBCMiwgMHgyQjAyQ0IwMywKKzB4QzkwMzYwQjIsIDB4NkUwM0EwMDgsIDB4ODkwNzNEQzIsIDB4RTQ2NDYwQjIsCisweEIwN0NDOTAzLCAweDdEMDE2RTAzLCAweDhCRjUyRUU4LCAweDhGMDQzREMyLAorMHhENDIxMkZFMSwgMHg0NjBCRDYyMSwgMHg2MkYxMDAwOSwgMHg2MDIzNjIyRCwKKzB4ODlGRkM4MDEsIDB4N0YwNDYwMjMsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsCisweDZCRjYwMDBCLCAweDAwMUMzQjg4LCAweDAwMjAzQUM4LCAweDAwMjAxOEQwLAorMHgwMDIwM0FEMCwgMHgwMDIwM0FEOCwgMHgwMDIwM0FFMCwgMHgwMDIwM0FFOCwKKzB4MDAyNUU3MjAsIDB4MDAyMDNEQkMsIDB4MDAyMDM5ODAsIDB4MDAxQzU5NjgsCisweDAwMUMzQjQwLCAweDAwMEY4MDAwLCAweDAwMUQ0MDA0LCAweDAwMUMzNTAwLAorMHgwMDIwMTVFNCwgMHgwMDIwMTYxMCwgMHgwMDFDNTgxNCwgMHgwMDFDNTlEMCwKKzB4MDAxQzU4MzAsIDB4MDAxQzYyNjgsIDB4MDAxQzU5QTQsIDB4MDAxQzYzOUMsCisweDAwMUM1ODFDLCAweDAwMUM1ODYwLCAweDAwMjAzQUYwLCAweDAwMjAxOEMwLAorMHg4RjAxNDQxMSwgMHg2MDQzNjA0QiwgMHgwMDA5MDAwQiwgMHg1NjUxRDUyQiwKKzB4NDYyODYwNTIsIDB4MzA2QzAwMEIsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsCisweDRGMTI0RjIyLCAweEJGRjE0RjAyLCAweDZCMDM2RTQzLCAweEREMjVEQzI0LAorMHgwMDA5QkZFQywgMHgzQzA1MzBCOCwgMHg0NjA5MDYwQSwgMHg0NjAxNDYwOSwKKzB4MDIwQTNENjUsIDB4NDIwOTQyMDksIDB4MzJFMjQyMDksIDB4NEYwNjhCRjAsCisweDRGMjY0RjE2LCAweDZERjY2RUY2LCAweDAwMEI2Q0Y2LCAweDJGQzY2QkY2LAorMHgyRkU2MkZENiwgMHg0RjEyNEYyMiwgMHhCRkNGNEYwMiwgMHg2QzAzNkU0MywKKzB4QkZDQkREMTMsIDB4MzBDODAwMDksIDB4MDYwQTNEMDUsIDB4NDYwOTQ2MDksCisweDM2RTI0NjAxLCAweDRGMDY4QkY1LCAweDRGMjY0RjE2LCAweDZERjY2RUY2LAorMHg2Q0Y2MDAwQiwgMHg0RjIyMkZFNiwgMHhFMTAyREUwQiwgMHhFNDAzRTUwMCwKKzB4QkZCOTJFMTIsIDB4RTYwNjJFNTIsIDB4RTcwMDQ2MTgsIDB4MkU2MkU0MDMsCisweDRGMjYyRTcyLCAweDZFRjZBRkIwLCAweDAwMDkwMDBCLCAweDAwMUMxMDQwLAorMHhDQ0NDQ0NDRCwgMHgxMDYyNEREMywgMHgwMDFENDAwNCwgMHgyRjk2MkY4NiwKKzB4MkZCNjJGQTYsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4RTUwMDdGOTgsCisweDY0NTNFNzEwLCAweDZCNTM0NzI4LCAweEVFMUFEQ0JDLCAweDYxNTM2NTVELAorMHgzMTVDNDEwOCwgMHg3NTAxNDEwOCwgMHg2MDQzMzE3QywgMHgwRjE2NjY1RCwKKzB4RUQwMDYwQjMsIDB4MjFCMTM2RTMsIDB4ODExMjgxMTEsIDB4MTFEMjgxMTMsCisweDExRDQxMUQzLCAweDc0MDQ4RkVBLCAweEQ4QjE2N0YyLCAweDE4NzFEOUIxLAorMHg1OEYxMjg3MiwgMHgxOTgxRDFCMCwgMHg1OUYyMjk4MiwgMHg1REY0NUFGMywKKzB4NTRGNjVFRjUsIDB4MjE5MjExOTEsIDB4MTFBMjExQTMsIDB4MTFENDExRDUsCisweDExRTYxMUU3LCAweDExNDgxMTQ5LCAweERBQTg1NUY3LCAweDU3RjhFRTAwLAorMHg1MkY5RERBNywgMHg2NEUzRDZBNywgMHgyQTUyMUE1MSwgMHhEOEE3RDlBNiwKKzB4MkQ3MkVBRUYsIDB4NkFBQzI2MjIsIDB4NkRFMzZFRUQsIDB4NjFFMzREMDgsCisweDQxMDgzREVDLCAweDMxRUM0RDA4LCAweDYwQjMzRDlDLCAweDJEQjE0MTA4LAorMHhFMDUwODFEMSwgMHhFNzlGNDEwOCwgMHg0MTA4NDAwOCwgMHg4MUQyNjc3QywKKzB4MzE4QzYwQjMsIDB4MzQ3MkUyMDAsIDB4MUREMjgxRDMsIDB4RDQ5MzFEMTMsCisweDFEMjQ4RDAxLCAweDY1RDNENDhGLCAweDdFMDFCMEIyLCAweDM0QTI2NEVELAorMHhEQThDOEJEQSwgMHg2OEEyMkZEMiwgMHg0ODI5REQ5MSwgMHg2NEEyMkQ4MiwKKzB4Njk0RDdERkMsIDB4MkQ5MkQyODYsIDB4NEUyOTZFMjIsIDB4MkRFMjdEMEMsCisweDZBRDM2ODIyLCAweEQ3ODQ2MThELCAweDZENzIyQTE2LCAweEQ1ODNENDg5LAorMHg1RTcyMjREMiwgMHgxNEUyRDY4OCwgMHhFRTAwNTE3NCwgMHg1ODc2MTQxNCwKKzB4MTQ4NkQxODYsIDB4RTcxMDU5NzgsIDB4NjI1MjE0OTgsIDB4MTQyQTY1RTMsCisweDY0RTMyNkUyLCAweDY0NERFNjAwLCAweDQ4MDg2ODQzLCAweDQ4MDgzODRDLAorMHg2MDUzMzgxQywgMHgyOEIxMEM4NiwgMHg2MEIzMDlDRSwgMHg2MDUzODE5MSwKKzB4NjA0MzBBQ0UsIDB4NjA1MzgxQTIsIDB4NjBCMzBEQ0UsIDB4NjA1MzgxRDMsCisweDc0MDEwOENFLCAweDA5Q0UxODgyLCAweDE5RTM2MjRELCAweDMyNzMwQUNFLAorMHg4RkUwMUE2NCwgMHhEOTZBNzUwNCwgMHg2QzkyRTAwMywgMHgyQ0IxNDAxOCwKKzB4REE2RjZEOTIsIDB4RTA1MDgxRDEsIDB4NDAwODZFOTIsIDB4NjE5MjgxRTIsCisweDgxMTM2MEIzLCAweEU2MDA2NDkyLCAweDY3OTIxNDQyLCAweDE3QTNENDY4LAorMHhFMUZGNjg5MiwgMHhFNzAzMTg2NCwgMHg0NjA4NjU2MywgMHg3NTAxMzY0QywKKzB4NjY1RDI2MTIsIDB4OEJGODM2NzMsIDB4RTAwM0RDNUEsIDB4NDAxODZEQzIsCisweDZFQzIyREIxLCAweDgxRTFEMjVGLCAweEVFMDA2MUMyLCAweDY0QzIxMTEyLAorMHgxNDIzRTAyNCwgMHhENDVCNjVDMiwgMHg2N0MyMTVFNCwgMHg4MTcyRTU4MCwKKzB4NjZFMzY4QzIsIDB4NjU1QzgxODMsIDB4Njk2MzY2NkQsIDB4NkE2RDc2MDQsCisweDNBNTMzOTRDLCAweDI5RTI4RkY4LCAweERDNTREQjUzLCAweDc0MDQyNEIyLAorMHg3RjY4MjRDMiwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwKKzB4MDAwQjY5RjYsIDB4NjE0MjY4RjYsIDB4QzgwMzYwMTEsIDB4RTUwMDhGMDMsCisweDM0MjBEMjNDLCAweDYwMTE4QjA2LCAweDg4MDJDOTAzLCAweEQyMzk4QjA2LAorMHg4QjAzMzQyMCwgMHg2NTEzNTYxMiwgMHgyNDIyNTI2NCwgMHg2MDUzMDAwQiwKKzB4MkZFNjJGRDYsIDB4N0ZFQzRGMjIsIDB4NjI1MzZFNTMsIDB4NkQ0M0U1NTAsCisweDQ1MDhFNDAwLCAweEUxMDFBMDAxLCAweDYwNDM1MjI0LCAweDgxMjEyMjExLAorMHg2MDUzODEyMywgMHg1NkUyODEyMiwgMHg4QkY1MzYyMCwgMHgxNkU0RDIzOCwKKzB4RTYxNDY0RjMsIDB4NjVFMzQyMEIsIDB4RTRGQzY1RTEsIDB4MkU1MTI1NDksCisweDY1RjM2MUYxLCAweDJGMTEyMTQ5LCAweEQxMzE1NEQxLCAweEU2MTQ0MTBCLAorMHg2MDcxNTdEMSwgMHgyNzAxQ0IwMSwgMHg3RjE0MURFMSwgMHg2RUY2NEYyNiwKKzB4NkRGNjAwMEIsIDB4MkZFNjJGRDYsIDB4N0ZFQzRGMjIsIDB4NjY1MzZFNTMsCisweDZENDNFNUZDLCAweDIwNTk2MDYxLCAweDI2MDFDQjAxLCAweDMyNjA1MkUyLAorMHgxMkU0OEIwNiwgMHgzMUUwNTFFMiwgMHg1MkQxOEIwNCwgMHgxRTIyQTAwMiwKKzB4NTY2NEFGRjAsIDB4NjRGM0QyMUUsIDB4NDIwQkU2MTQsIDB4NjdFMTY1RTMsCisweDI3MTlFMUZDLCAweDY3RjEyRTcxLCAweDI3MTk1NEQxLCAweDY1RjNEMTE4LAorMHg0MTBCRTYxNCwgMHg1MkQxMkY3MSwgMHhDQjAxNjAyMSwgMHgxREUxMjIwMSwKKzB4NEYyNjdGMTQsIDB4MDAwQjZFRjYsIDB4MDAwMDZERjYsIDB4MDAyMDM5QUMsCisweDAwMjAzNTdDLCAweDAwMjAzNTg0LCAweDAwMjAzNThDLCAweDAwMjAzNUI0LAorMHgwMDIwMzk5OCwgMHgwMDIwMzlBMCwgMHgwMDEwMDIwOCwgMHgwMDEwMTRDMCwKKzB4MDAxRTIxMEMsIDB4MDAxQzNEMDAsIDB4MDAyMDM5RUMsIDB4MDAxMDAwQzgsCisweDAwMTE3ODgwLCAweDAwMTE3NzgwLCAweDAwMDQwMDIwLCAweDAwMjZDNDAxLAorMHgwMDIwMEQ0MiwgMHg0RjIyMkZFNiwgMHhERTQyNjI0QywgMHg0MjAwNDIwOCwKKzB4M0UyQ0EwMDUsIDB4RDQ0MDUyNTIsIDB4QkY2OTU2MjQsIDB4NjVFMjJFNjIsCisweDM1MjA1MkUxLCAweEQ2M0Q4QkY2LCAweDRGMjYyNjIyLCAweDZFRjYwMDBCLAorMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHhEQzM5NEYyMiwgMHg1MkMxREIzOSwKKzB4MzYyMDY2QzIsIDB4NjA2MTg5MUMsIDB4ODgwMUM5MDMsIDB4REUzNDg5MTgsCisweEJGMzhERDM1LCAweDY1MDM2NEUzLCAweDY2QjI4NTAzLCAweDMyNjI2MjBELAorMHhENDMyODkwNywgMHgwMDA5QkY3NiwgMHg0RDBCRDQzMSwgMHhBRkU2MDAwOSwKKzB4QkYzRDAwMDksIDB4RDQyRjY0RTMsIDB4MDAwOTREMEIsIDB4MDAwOUFGREYsCisweDIyNjJEMjJELCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjYwMDBCLAorMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHhERDI5REMyOCwgMHg2RTQzNjBDMiwKKzB4MDRERTQwMDgsIDB4RTYxNEQxMjcsIDB4NjVFMzQxMEIsIDB4RDEyN0Q3MjYsCisweDU1RTIyN0UyLCAweDM1RTA1MjU0LCAweDIxMjI4RjA0LCAweDQwMDg2MEMyLAorMHgxMjIyMDJERSwgMHg2MDUzNjVDMiwgMHg3NTAxNDAwOCwgMHgwREU2MDZERSwKKzB4QzkwRjYwNTMsIDB4NjA2MzJDMDIsIDB4NkVGNjRGMjYsIDB4MDAwQjZERjYsCisweDg1NDM2Q0Y2LCAweDY1MEQ1NjQzLCAweDYyMkQ2MjYyLCAweDM1Mjc3MjA0LAorMHhFMTAwOEYwQywgMHgyMjY4OTYwQywgMHhENjE1OEIwMywgMHg3MjAxNTI2MSwKKzB4RDYxMzE2MjEsIDB4NjI2MkUxMDEsIDB4MjYyMjcyMDEsIDB4NjAxMzAwMEIsCisweDAwMDAwMUZGLCAweDAwMjAzNThDLCAweDAwMjAzNTg0LCAweDAwMUMzRDAwLAorMHgwMDIwMzVCNCwgMHgwMDIwMzk3QywgMHgwMDIwMThDMCwgMHgwMDIwMzU3QywKKzB4MDAyMDNCMTgsIDB4MDAyMDNCMUMsIDB4MDAxQzNEMjgsIDB4MDAyMDM5RUMsCisweDAwMjAzOUFDLCAweDAwMjAwRDQyLCAweDAwMjAzOUYwLCAweDAwMjAzOUY0LAorMHgwMDExNzc1NCwgMHgyRkE2MkY5NiwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwKKzB4N0ZGODRGMjIsIDB4NkMyMkQyNDEsIDB4QzgwMzYwQzMsIDB4REU0MDg5NkUsCisweERBNDFEQjQwLCAweDUyQjFEOTQxLCAweDM2MjA2NkIyLCAweDYwNjE4OTQ1LAorMHg4ODAxQzkwMywgMHhERDNCODk0MSwgMHg0MjBCRDIzRCwgMHg2NTAzNjREMywKKzB4NjBBMTJGMDIsIDB4ODkzMjg4MDEsIDB4ODUxNDUxNTMsIDB4ODg0MDYwMEMsCisweDFGMTE4RjBDLCAweEQ1Mzc2MTkxLCAweDY0MUQ0NTBCLCAweDhCMjYyMDA4LAorMHhENzM1NjY5MSwgMHg2NDZENDcwQiwgMHg4QjIwMjAwOCwgMHg0MjBCRDIzMywKKzB4NTFGMTU0RjEsIDB4QzgyMDg1MTEsIDB4RDEzMTg5MDQsIDB4MDIxRUUwNTAsCisweDAxMjY3MjAxLCAweDQyMEJEMjJGLCAweDIwMDg2NEYyLCAweDY0RDM4OTA3LAorMHg0RDBCREQyRCwgMHhEMTJENjVGMiwgMHhBRkM0RTYwMSwgMHhEMjJDMjE2MiwKKzB4NDIwQjY1RjIsIDB4RDcyQjY0RTMsIDB4QUZCQ0U2MDEsIDB4RDIyNjI3NjIsCisweDQyMEI2NUYyLCAweEFGQjY2NEQzLCAweERFMjcwMDA5LCAweERBMjhERDI3LAorMHg1MkQxREIyOCwgMHgzNjIwNjZEMiwgMHg2MDYxODkxOCwgMHg4ODAxQzkwMywKKzB4RDQyMjg5MTQsIDB4NDUwQkQ1MTYsIDB4NTYwMzAwMDksIDB4OEYwNDM2RTAsCisweEUyMDE2NTAzLCAweEFGRUMyQTIwLCAweEQ0MUYyQjUyLCAweDQyMEJEMjE2LAorMHhENzE4MDAwOSwgMHg0MTE4RTEwMSwgMHgyNzEyQUZFMywgMHhDODA0NjBDMywKKzB4RDIxQTg5MDIsIDB4MDAwOTQyMEIsIDB4NEYyNjdGMDgsIDB4NkRGNjZFRjYsCisweDZCRjY2Q0Y2LCAweDAwMEI2QUY2LCAweDAwMDA2OUY2LCAweDAwMUUyMTAwLAorMHgwMDIwMzU4QywgMHgwMDIwMzU4NCwgMHgwMDIwM0ExNCwgMHgwMDExNDJEOCwKKzB4MDAyMDE0QTYsIDB4MDAxMTVFQTIsIDB4MDAxMTQ3NzQsIDB4MDAyMDBEOEEsCisweDAwMjAzNTFDLCAweDAwMjAxNkMyLCAweDAwMjAxNEQwLCAweDAwMUUyMTJDLAorMHgwMDIwMTUzNCwgMHgwMDFDM0QzMCwgMHgwMDExNzg4MCwgMHgwMDIwMzU3QywKKzB4MDAyMDM5OUMsIDB4MDAyMDM5OTgsIDB4MDAyMDM1QjQsIDB4MDAyMDA2NDQsCisweEU2MDFEMjAzLCAweDEyNjVENTAzLCAweDAwMEIyMjUyLCAweDAwMDAxMjY2LAorMHgwMDFDMTAxMCwgMHgwMDAwQzM0RiwgMHgwMDA5MDAwQiwgMHgwMDA5MDAwQiwKKzB4MDAwOTAwMEIsIDB4MDAwOTAwMEIsIDB4RTAwMDAwMEIsIDB4RTAwMDAwMEIsCisweDAwMDkwMDBCLCAweEU0RkRENTlELCAweEQ2OUQ2MTUyLCAweDI1MTIyMTQ5LAorMHg3NDAxNjA1MiwgMHgyNTAyQ0IwMSwgMHhEMTlBNjc1MiwgMHgyNTcyMjc0OSwKKzB4Qzg0MDYwMTAsIDB4NjA2Mjg5MDIsIDB4MjYwMkNCMDQsIDB4RTFGNzY0NjIsCisweDI2NDIyNDE5LCAweEU3MDE2MDYyLCAweDI2MDJDOUNGLCAweEU1MDI2MDYyLAorMHgyNjAyQ0IxMCwgMHg0NzE4NjA2MiwgMHgyNjAyQ0IwMywgMHgwMDBCMTY1MiwKKzB4RDU4RDE2NzMsIDB4RDI4RUQ3OEQsIDB4RTEwMEQ0OEUsIDB4MjUxMUU2MDAsCisweDIyMTAyNzExLCAweDI0NjFBRkNFLCAweEQyOEI2NjRDLCAweDM2MkM0NjAwLAorMHhDQjEwNjA2MCwgMHgyNjAwMDAwQiwgMHhEMjg3NjU0QywgMHgzNTJDNDUwMCwKKzB4RTFFRjY2NTAsIDB4MDAwQjI2MTksIDB4NjY0QzI1NjAsIDB4NDYwMEQyODMsCisweDYwNjAzNjJDLCAweDAwMEJDQjEwLCAweDY1NEMyNjAwLCAweDQ1MDBEMjdGLAorMHg2NjUwMzUyQywgMHgyNjE5RTFFRiwgMHgyNTYwMDAwQiwgMHhEMjdBNjY0QywKKzB4MzYyQzQ2MDAsIDB4Q0IwODYwNjAsIDB4MjYwMDAwMEIsIDB4RDI3NjY1NEMsCisweDM1MkM0NTAwLCAweEUxRjc2NjUwLCAweDAwMEIyNjE5LCAweDY2NEMyNTYwLAorMHg0NjAwRDI3MiwgMHg2MDYwMzYyQywgMHgwMDBCQ0IwOCwgMHg2NTRDMjYwMCwKKzB4NDUwMEQyNkUsIDB4NjY1MDM1MkMsIDB4MjYxOUUxRjcsIDB4MjU2MDAwMEIsCisweEQ2Njk2MjRDLCAweDMyNkM0MjAwLCAweEM5MDg2MDIwLCAweDQwMjE0MDIxLAorMHgwMDBCNDAyMSwgMHg2MjRDNjAwQywgMHg0MjAwRDY2NCwgMHg2MDIwMzI2QywKKzB4NDAyMUM5MDgsIDB4NDAyMTQwMjEsIDB4NjAwQzAwMEIsIDB4NjQ0Q0QxNjAsCisweDYyNDAzNDFDLCAweDYwMkMwMDBCLCAweDY0NENEMTVFLCAweDYyNDAzNDFDLAorMHg2MDJDMDAwQiwgMHg0RjIyMkZFNiwgMHg2NDVDNkU0MywgMHgzNDY3RTYwQSwKKzB4QkZFQjg5MTQsIDB4NjQwQzAwMDksIDB4ODgwMTYwRUMsIDB4RTAwRjhCMDIsCisweDI0MDlBMDAyLCAweDQ0MDk0NDA5LCAweEU2MEE2MjRDLCAweDg5MDUzMjYzLAorMHg2NDRDQkZFMiwgMHg2MDIzNjIwQywgMHg4QjAwQzg4MCwgMHg2MDIzRTIwMCwKKzB4MDAwQjRGMjYsIDB4NEYyMjZFRjYsIDB4NjA2MkQ2NEIsIDB4OEIwMzg4MDEsCisweDAwMDlCMjU2LCAweDAwMDlBMDAzLCAweEU2NDBEMjQ4LCAweEQ2NDgyMjYwLAorMHg0RjI2RTIwMCwgMHgyNjIyMDAwQiwgMHhENjQzNEYyMiwgMHg4ODAyNjA2MiwKKzB4QjI5RjhCMDEsIDB4RDY0MjAwMDksIDB4NEYyNkUyMDAsIDB4MjYyMjAwMEIsCisweEQ0M0VENTNELCAweEU3MDFFMTAwLCAweDAwMEIyNTEyLCAweEQyM0IyNDcwLAorMHgwMDBCRTYwNCwgMHg0RjIyMjI2MCwgMHhEMTNCRDQzQSwgMHgwMDA5NDEwQiwKKzB4RTFGREQ1M0EsIDB4RDIzQTY2NTAsIDB4RTcwMDI2MTksIDB4NEYyNjI1NjAsCisweDIyNzAwMDBCLCAweEQ1Mzc0RjIyLCAweDYxNTJEMjM3LCAweDYxMURENzM3LAorMHg2NDUyMjUxMiwgMHgyNDJCRTZGRiwgMHhENDM1MjU0MiwgMHg2NjZERDIyRSwKKzB4Mjc2MjQyMEIsIDB4RTFGQkQ1MkQsIDB4MjcxOTY3NTAsIDB4MDAwQjRGMjYsCisweDRGMjIyNTcwLCAweEQxMjhENDJGLCAweDAwMDk0MTBCLCAweEU3RjdENTI3LAorMHgyNjc5NjY1MCwgMHgwMDBCNEYyNiwgMHhENTI0MjU2MCwgMHg2MjUwOTQyNSwKKzB4MDAwQjIyNDksIDB4RDUyMTI1MjAsIDB4NjI1MEU0QkYsIDB4MDAwQjIyNDksCisweDRGMjIyNTIwLCAweDg1MjJEMjI0LCAweDIwMDg2MDBELCAweDg4MDE4OTExLAorMHg4ODAzODk0NCwgMHg4ODA1ODk0NiwgMHg4ODA2ODk0OCwgMHg4ODA4ODk0RSwKKzB4ODgwOTg5NTQsIDB4ODgwQTg5NUEsIDB4ODgwQjg5NjAsIDB4QTA2RDg5NjYsCisweEIwNkYwMDA5LCAweEEwNkEwMDA5LCAweEZGN0Y2MDBDLCAweDAwMUUyMTQ4LAorMHgwMDFFMTEwOCwgMHgwMDFFMTAwMCwgMHgwMDIwM0E0QywgMHgwMDIwM0E0RSwKKzB4MDAyMDNBNkQsIDB4MDAyMDNBMzAsIDB4MDAxRTEwM0YsIDB4MDAxRTEwNUYsCisweDAwMUUxMDJGLCAweDAwMUUxMDkwLCAweDAwMjAzQTU0LCAweDAwMUUxMDBCLAorMHgwMDIwM0E1MCwgMHgwMDIwM0IyMCwgMHgwMDIwMThDMCwgMHgwMDFFMTAyOCwKKzB4MDAyMDNBNkMsIDB4MDAxRDQwMjAsIDB4OTg3NjAwMDAsIDB4MDAxQzEwMDAsCisweDAwMjAzQjJDLCAweDAwMjAzQjNDLCAweDAwMjAzQTI0LCAweDAwMDlCMDRDLAorMHg2MDBDQTAzNSwgMHgwMDA5QjA1NSwgMHg2MDBDQTAzMSwgMHg2MjYwRDY4NCwKKzB4OEIyQjIyMjgsIDB4MDAwOUIwNjEsIDB4NjAwQ0EwMjksIDB4NjI2MEQ2ODAsCisweDhCMjMyMjI4LCAweDAwMDlCMDY5LCAweDYwMENBMDIxLCAweDYyNjBENjdDLAorMHg4QjFCMjIyOCwgMHgwMDA5QjBDNywgMHg2MDBDQTAxOSwgMHg2MjYwRDY3OCwKKzB4OEIxMzIyMjgsIDB4MDAwOUIwQ0QsIDB4NjAwQ0EwMTEsIDB4NjI2MEQ2NzQsCisweDhCMEIyMjI4LCAweDAwMDlCMTI1LCAweDYwMENBMDA5LCAweDYyNjBENjcwLAorMHg4QjAzMjIyOCwgMHgwMDA5QjEzRCwgMHg2MDBDQTAwMSwgMHg0RjI2RTAwMCwKKzB4MDAwOTAwMEIsIDB4RDI2Q0QxNkIsIDB4RDU2Qzg0MTIsIDB4NDAwMEM5MEYsCisweEQ3NkIwMTJELCAweEU0MDNENjZCLCAweEUyMEY2MTFDLCAweDI1NDBFMDAxLAorMHgyNTIwMjcxMiwgMHgyNjAyMDAwQiwgMHhFNjAxRDI2MiwgMHgzMDY2ODUyMywKKzB4RTAwMDhEMDUsIDB4RDY2M0QyNjAsIDB4RTAwMTgxMjIsIDB4MDAwQjI2MDIsCisweEQyNUMwMDA5LCAweDYwMEQ4NTIzLCAweDg5MDUyMDA4LCAweDhCMEE4ODAxLAorMHg2MDYwRDY1RCwgMHgyNjAwQ0IwMSwgMHhENDU3RDY1QSwgMHhFMDAxRTEwMSwKKzB4MDAwQjI2MTIsIDB4MDAwQjgxNDIsIDB4RDE1MkUwMDAsIDB4ODUxM0U1MDEsCisweDY0MEQ0NTE4LCAweDY2MDMzNDUzLCAweEUwMDA4RDA1LCAweEQ1NTFEMjUzLAorMHgyMjYwRTAwMSwgMHgwMDBCMjUwMiwgMHg0RjIyMDAwOSwgMHg4NTEzRDE0OSwKKzB4NjQ1MzY1MEQsIDB4NjI0OTQ0MTksIDB4MjI3RDY3MkUsIDB4ODgwMTYwMkMsCisweDg4MDI4OTA5LCAweDg4MDM4OTEwLCAweDg4MDY4OTFBLCAweDg4MDc4OTM1LAorMHhBMDRDODkzQiwgMHhENTQ2MDAwOSwgMHg2NjUyRDc0NiwgMHgyNzYyRDQ0NiwKKzB4NjIyQzYyNjEsIDB4MjQyMUEwMzgsIDB4MjIyODYyNUMsIDB4RDQ0MzhCM0YsCisweDY2NDJENTQwLCAweDI1NjJENDQwLCAweDI0MDE4NTYxLCAweDYyMDNBMDJDLAorMHgyMDA4NjA1QywgMHg4ODEwODkwNywgMHg4ODIwODkwOCwgMHg4ODMwODkwOSwKKzB4QTAyQzg5MEEsIDB4RDIzQTAwMDksIDB4NjIyMkEwMDgsIDB4QTAwNUQyMzksCisweEQyMzk2MjIyLCAweDYyMjJBMDAyLCAweDYyNjJENjM4LCAweEQ0MzJENTMxLAorMHg2NjIxMjUyMiwgMHhBMDBGNjI2QywgMHhENjM1MjQyMSwgMHg2MjYxRDUyRCwKKzB4NjIyQ0Q0MkQsIDB4QTAwNzI1NjIsIDB4RDYzMjI0MjEsIDB4ODU2MUQ1MjksCisweDI1NjJENDI5LCAweDYyMDMyNDAxLCAweDY2MkQ4NTE1LCAweDM2MTc2MTBELAorMHg2NTAzOEYwMSwgMHhCMENCMjQ1MSwgMHhBMDAxMDAwOSwgMHhFMDAwRTAwMSwKKzB4MDAwQjRGMjYsIDB4RDYxOTAwMDksIDB4RDQyN0UxMDEsIDB4NjU0MTI2MTAsCisweEQxMThENzE3LCAweEUyMEY2NTVELCAweDI3NTJFMDAxLCAweDAwMEIyNjIwLAorMHgyRkU2MjEwMiwgMHhEMjBGNEYyMiwgMHg2NDBDODUyMywgMHg4QjA4MjQ0OCwKKzB4RDUxMUQ2MUQsIDB4MjYyMUUyMDAsIDB4OTQwRjg0NTEsIDB4QTA0ODIwNDksCisweERFMEQ4MDUxLCAweEM4NDA2MEUwLCAweEUyMDE4RDMyLCAweDg5NDQzNDI3LAorMHhEMjE2RDYxNSwgMHgyNjQxNDIwQiwgMHgwMDA5QTAzMCwgMHgwMDAwRkY3RiwKKzB4MDAyMDNBNkQsIDB4MDAyMDNBMjQsIDB4MDAyMDNBMzAsIDB4MDAxRTExMDAsCisweDAwMUUxMDBDLCAweDAwMjAzQTUwLCAweDAwMUUxMDAwLCAweDAwMUUxMDAxLAorMHgwMDIwM0E1OCwgMHgwMDIwM0EzOCwgMHgwMDIwM0EzQywgMHgwMDIwM0E0MCwKKzB4MDAyMDNBNUMsIDB4MDAyMDNBNjAsIDB4MDAyMDNBNjQsIDB4MDAyMDNBNjgsCisweDAwMjAzRTIwLCAweDAwMjAzRTJBLCAweDAwMjAzQTRBLCAweDAwMjAyN0YyLAorMHg4OTEyMzQyNywgMHhEMjk0RDY5MywgMHgyNjQxNDIwQiwgMHhDQjgwODRFMSwKKzB4ODBFMUIwRjUsIDB4RDY5MTYwRTAsIDB4MkUwMENCMDQsIDB4QzkzRjYwNjAsCisweEQ2OEYyNjAwLCAweEEwMDFFMDAxLCAweEUwMDAyNjAyLCAweDAwMEI0RjI2LAorMHhENjhDNkVGNiwgMHhDODgwNjA2MCwgMHhEMjg2ODkxOSwgMHg4ODAxNjAyMSwKKzB4RDI4OThCMTUsIDB4ODUyNEU1MDEsIDB4ODkxMDMwNTYsIDB4RTIwM0QxODcsCisweDIxMjBENDg3LCAweEUwMEI2NTQxLCAweDA2NTY2NTVELCAweEU0MEZENTg1LAorMHgyMTQwRTcwMiwgMHhENzdFMjU3MSwgMHgwMDBCRTAwMSwgMHgwMDBCMjcwMiwKKzB4MkZFNkUwMDAsIDB4REU4MDRGMjIsIDB4Qzg4MDg0RTEsIDB4RDU3QTg5MkMsCisweDIwMDg4NTU0LCAweDYxMDM4RjI4LCAweDg1NTNENzdDLCAweDY0MDM2NjcyLAorMHg4NTY2NjUwQywgMHgzNTIwNjIwQywgMHhENjc5OEIxRSwgMHg2NTFDRDc3NCwKKzB4MjY1MTY0NEMsIDB4NjBFMDI3NDEsIDB4ODkwNEM4NDAsIDB4NDIwQkQyNzUsCisweEEwMDMwMDA5LCAweEQyNjgwMDA5LCAweDAwMDk0MjBCLCAweDAwMDlCMDlGLAorMHhFMjAxRDE2NywgMHg2MEUwMjEyMiwgMHhDQjA0RDQ2NCwgMHg2MDQwMkUwMCwKKzB4MjQwMEM5M0YsIDB4NjAyM0EwMDEsIDB4NEYyNkUwMDAsIDB4NkVGNjAwMEIsCisweDJGQjYyRkE2LCAweDJGRDYyRkM2LCAweERBNjIyRkU2LCAweDY2QTFFMjQwLAorMHgzNjIyREM1RSwgMHg2MjYzODkwMCwgMHg2RUQzNkQyQywgMHg0RTIxMzZEOCwKKzB4NEUyMTJBNjEsIDB4REI2MUQ0NjAsIDB4RTcwMEEwMEYsIDB4NzcwMTYyQjIsCisweDcxMDI2MTIzLCAweDY2MjEyQjEyLCAweDcxMDI2MjEzLCAweDYxMjEyQjEyLAorMHg2NTFENjY2RCwgMHgzNTZDNDUyOCwgMHg2MjdDMjQ1MiwgMHg4QkVEMzJFMywKKzB4QzkwMzYwRDMsIDB4OEIxMDg4MDMsIDB4NjE3MzY3QjIsIDB4MkIxMjcxMDIsCisweDcxMDI2RTEzLCAweDJCMTI2NTcxLCAweDY1NUQ2REUxLCAweDQyMjg2MkRELAorMHgzMjVDRTEwNywgMHhBMDBDMkMxMCwgMHg4ODAyMjQyMiwgMHhBMDAzOEIwMSwKKzB4ODgwMUUyMDMsIDB4RTIwMThCMDUsIDB4NjZCMjJDMjAsIDB4NjU1RDY1NjEsCisweEU2MEYyNDUyLCAweDY3QTEyQzYwLCAweDhCMDUyNzc4LCAweEREMzhEQzQ0LAorMHhFQjAxRUEwMCwgMHgyREIyMkNBMiwgMHg2REY2NkVGNiwgMHg2QkY2NkNGNiwKKzB4NkFGNjAwMEIsIDB4MkZFNjJGRDYsIDB4RTI0MEREMzYsIDB4MzYyMjY2RDEsCisweDYyNjM4OTAwLCAweDM2Nzg2NzJDLCAweDc3MDNERTM4LCAweDQ3MjEyRDYxLAorMHg2NEUyRDYzNSwgMHhBMDBFNDcyMSwgMHg2NTYyRTEwMCwgMHg2MjUzNzEwMSwKKzB4NzQwMTI0NTAsIDB4MjQyMDQyMTksIDB4NDUyOTc0MDEsIDB4NzQwMTI0NTAsCisweDI0NTA0NTE5LCAweDYyMUM3NDAxLCAweDhCRUUzMjczLCAweDY2RTI0MjAwLAorMHg0MjAwNjFEMSwgMHgyMTE4MzYyQywgMHgyRTYyOEYwNiwgMHhERDFDRDcyOCwKKzB4RTUwMUU0MDAsIDB4MkQ1MjI3NDIsIDB4MDAwQjZFRjYsIDB4MkZENjZERjYsCisweDRGMjIyRkU2LCAweEVEMEFFRTAxLCAweDY0RTNCQzg2LCAweEJDOEI2NEUzLAorMHg2MkVDN0UwMSwgMHg4QkY3MzJENywgMHhCQzhFRUUwMSwgMHg2NEUzNjRFMywKKzB4N0UwMUJDOTMsIDB4MzJENzYyRUMsIDB4NEYyNjhCRjcsIDB4MDAwQjZFRjYsCisweEQxMTg2REY2LCAweEQ0MTg5MjBELCAweDcyMTIyMTIyLCAweDI0MjJENjE3LAorMHhENzE3NzIwNCwgMHg3MjIwMjYyMiwgMHgyNzIyRDExNiwgMHgwMDBCNzIzMCwKKzB4MTM3QTIxMjIsIDB4MDAyMDNBNEEsIDB4MDAyMDI4RkUsIDB4MDAxRTEwMTUsCisweDAwMjAzQTUwLCAweDAwMUUxMDAxLCAweDAwMjAzQTI0LCAweDAwMUUxMTAwLAorMHgwMDIwM0E0RSwgMHgwMDIwM0EzQywgMHgwMDFFMTAwMCwgMHgwMDIwM0E0MCwKKzB4MDAyMDNBNEMsIDB4MDAyMDI3RjIsIDB4MDAxRTEwMEMsIDB4MDAyMDNBMzgsCisweDAwMjAzQTU0LCAweDAwMjAzQTU4LCAweDAwMjAzQTVDLCAweDAwMjAzQTYwLAorMHgwMDIwM0E2NCwgMHgwMDIwM0E2OCwgMHg0RjIyMkZFNiwgMHhENjcwN0ZGQywKKzB4ODgwMTYwNjAsIDB4RTIwMTg5NTEsIDB4MjYyMEJGQkIsIDB4RDU2RUQxNkQsCisweERFNkU2MDEwLCAweDY0RTM2NTUyLCAweDc0MDJDODQwLCAweDhEMjJEMTZDLAorMHhEMjZDNzUwMiwgMHhFNjAxRDc2QywgMHhFNzA0MjcyMiwgMHg3NjAxNjI1NSwKKzB4NjI2QzI0MjEsIDB4OEZGOTMyNzMsIDB4RDQ2Mzc0MDIsIDB4NjI0MkU2MDEsCisweDY0MEQ4NTI4LCAweDY3NDk0NDE5LCAweDI3NUQ2NTdFLCAweDgxRTQ2MDdDLAorMHhFNDE3RDU2MiwgMHg2NzU1NzYwMSwgMHgzMjQzNjI2QywgMHg4RkY5MjE3MSwKKzB4QTAyMDcxMDIsIDB4RDI1RTAwMDksIDB4RTYwMUQ3NUIsIDB4RTcwNDI3MjIsCisweDc2MDE2MjU1LCAweDYyNkMyNDIxLCAweDhGRjkzMjczLCAweEQ0NTI3NDAyLAorMHg2MjQyRTYwMSwgMHg2NDBEODUyOCwgMHg2NzQ5NDQxOSwgMHgyNzVENjU3RSwKKzB4ODFFNDYwN0MsIDB4RTQxN0Q1NTMsIDB4Njc1NTc2MDEsIDB4MzI0MzYyNkMsCisweDhGRjkyMTcxLCAweDkyODk3MTAyLCAweEQyNDYyRTIxLCAweDVFMjNENzRFLAorMHg2NEYyMkZFMiwgMHg2MDQzNjVGMiwgMHgyNzAwQzk4MCwgMHhDOTYwNjA0MywKKzB4ODA3MTYxMDMsIDB4QzkwMzYwNDMsIDB4ODA3MjQ1MTksIDB4NjVGMjYwNUMsCisweDgxNzI2NkYyLCAweDQ2MTk0NjI5LCAweDYwNkM0NTI5LCAweDQwMTg2NDVDLAorMHg4MTczMzA0QywgMHgyMTE4NUUyMywgMHg2NEYyMkZFMiwgMHg2RTRDNjJGMiwKKzB4NjAyQzQyMTksIDB4NjZGMjYyRjIsIDB4NDYyOTQwMTgsIDB4NDYxOTMwRUMsCisweDQyMjk4MTc0LCAweDY1MkM2MDZDLCAweDMwNUM0MDE4LCAweDgxNzU4RjA3LAorMHgwMDA5QkM5NywgMHgyMjI4NjIwQywgMHhBMDBBODkwOCwgMHg2MDEzMDAwOSwKKzB4OEIwMzg4NDAsIDB4MDAwOUIwMDksIDB4MDAwOUEwMDMsIDB4RTIwMkQ2MkYsCisweDdGMDQyNjIyLCAweDAwMEI0RjI2LCAweDRGMjI2RUY2LCAweDg1NTJENTJBLAorMHg4ODMwNjAwRCwgMHg4ODMxODkwMywgMHhBMDM0ODkyMywgMHg4NTU1MDAwOSwKKzB4RDQyOEQ3MjcsIDB4ODU1MzI3MDEsIDB4NjEwREQ2MjcsIDB4MjQxMjQxMTgsCisweDQ2MEJENDI2LCAweEQ3MjMwMDA5LCAweEQyMjZENDI1LCAweDY1NzI0MjBCLAorMHhFMjMwRDEyMCwgMHg0MjI4NjcxMiwgMHgyNzI5RTYyMCwgMHgzNzYwNDYyOCwKKzB4RDYyMThCMDMsIDB4QTAxNkUyMDAsIDB4RDYxRjI2MjIsIDB4QTAxMkUyMDIsCisweEQxMTgyNjIyLCAweDYyMTJFNTMwLCAweEU2MjA0NTI4LCAweDQ2MjgyMjU5LAorMHg4OTA4MzI2MCwgMHhENDFBRDExOSwgMHhFNjAxRDUxMywgMHgyMTYwNDUwQiwKKzB4NDcyQkQ3MTgsIDB4NEYyNjRGMjYsIDB4MDAwOTAwMEIsIDB4MDAwMDA2MEEsCisweDAwMjAzQTZDLCAweDAwMUUxMDAwLCAweDAwMjAzQTU4LCAweDAwMjAzRTIwLAorMHgwMDIwM0UyQywgMHgwMDIwM0RDNCwgMHgwMDIwM0E0MCwgMHgwMDIwM0RGNCwKKzB4MDAyMDNERjIsIDB4MDAyMDNEQzYsIDB4MDAyMDNBMjQsIDB4MDAyMDNBNTAsCisweDAwMjAzQTNDLCAweDAwMjAzQTM4LCAweDAwMjAxOEMwLCAweDAwMjAzQjQ4LAorMHgwMDIwM0I0QywgMHgwMDIwMThEMCwgMHgwMDIwM0E1NCwgMHgwMDFFMTAwQiwKKzB4MDAyMDNCNjAsIDB4MDAxMTQwMDQsIDB4NEYyMjJGRTYsIDB4ODRFOURFODYsCisweDI0NDg2NDBDLCAweEIxN0I4OTAxLCAweEQyODQwMDA5LCAweDI2Njg2NjIwLAorMHg2MEUwODkwMiwgMHgyRTAwQzlCRiwgMHgwMDBCNEYyNiwgMHgwMDBCNkVGNiwKKzB4MkZFNjAwMDksIDB4REU3RTRGMjIsIDB4NjBFMEQ2N0UsIDB4Q0JDMEQ0N0UsCisweDYyNjAyRTAwLCAweEM4MDM2MDJDLCAweDQwMjE4OTA0LCAweDcwMDE0MDIxLAorMHg2NjAzQTAwMiwgMHg2NjAzNDAwOSwgMHhENjc4NjE2RCwgMHhFNTAwQTAwNCwKKzB4NzUwMTYyNjIsIDB4NzQwNDI0MjIsIDB4MzIxMzYyNUQsIDB4RDI3NDhCRjgsCisweDAwMDk0MjBCLCAweEM5QkY4NEUyLCAweDRGMjY4MEUyLCAweDZFRjYwMDBCLAorMHgyRkU2MkZENiwgMHg3RkZDNEYyMiwgMHg2MjYwRDY2RSwgMHg4OTQwMjIyOCwKKzB4RDU2NUUxMDAsIDB4NjA1MDI2MTAsIDB4Q0I0MEQ0NkIsIDB4MjUwMDQ0MEIsCisweDhEMDUyMDA4LCAweDYyRTA2RTAzLCAweDcxMDQ2MTJDLCAweDJGMTFBMDA2LAorMHhENDY2RDY1RSwgMHhERDY2Njc2MCwgMHg2NTdDNEQwQiwgMHhFMjNDNkQxRCwKKzB4OEIwMzNEMjcsIDB4RDI2NEQ0NjMsIDB4MDAwOTQyMEIsIDB4NEQyMTREMjEsCisweEEwMDVENzYyLCAweDY2RTZFNDAwLCAweDM1N0M0NTA4LCAweDc0MDEyNTYyLAorMHgzNUQzNjU0RCwgMHhENzVFOEJGNywgMHg2RTcyRTAwMywgMHg4MUUxNDAxOCwKKzB4NkU3MjYwRjEsIDB4ODFFMjcwMEMsIDB4RDQ1QTYxNzIsIDB4REQ1QTgxMTMsCisweDY1NzI0RDBCLCAweEQ2NEFEMjU5LCAweDIyMTJFMTAxLCAweEM5M0Y2MDYwLAorMHg3RjA0MjYwMCwgMHg2RUY2NEYyNiwgMHg2REY2MDAwQiwgMHgyRkM2MkZCNiwKKzB4MkZFNjJGRDYsIDB4RDI1MjRGMjIsIDB4NkI0MzZFNzMsIDB4NDIwQjZDNTMsCisweDIwMDg2RDYzLCAweDY0MDM4RDFDLCAweEU1MEVEMTNDLCAweDMyNTI2MjEwLAorMHg2MEMzODkxNiwgMHg4MDQxMjRCMCwgMHg4MTQxNjBEMywgMHhBMDA3RTUwMCwKKzB4NjU1RDYxQkMsIDB4MDBFQzYwNTMsIDB4MzY0QzY2NTMsIDB4ODA2NDc1MDEsCisweDMyMTM2MjVELCAweEQ2MzA4QkY1LCAweEM5QkY2MDYwLCAweDI2MDBBMDA4LAorMHhEMjM5RDQ0MCwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QkY2NDIyQiwKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjAwMEIsIDB4MkY5NjJGODYsCisweDJGQjYyRkE2LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweEUxMDA3RkM0LAorMHg2NTEzRUNGRiwgMHg2QjEzNkNDRCwgMHhERTM0RDczMywgMHhFREZGNjRGMywKKzB4RDgzM0VBMDQsIDB4NjA1MzY1NUMsIDB4MDI3RDQwMDAsIDB4MzJDMDYyMkQsCisweDY2MDM4RDBELCAweDA5RUQ2MDYzLCAweDI0OTEwMjdELCAweDI0MjE3NDAyLAorMHg2OTgyMDJFRCwgMHgzOTI4NjIyRCwgMHg3NDAyMjg5MiwgMHg3NTAxNzEwNCwKKzB4NjA2MzYyNUMsIDB4MDdENTMyQTIsIDB4MEVCNThGRTQsIDB4MjQ0ODY0MUMsCisweEU2ODA4OTA1LCAweDY3RjNFNUM1LCAweEJGOEY2NjZDLCAweDdGM0M2NTVDLAorMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwgMHgwMDBCNjlGNiwKKzB4RDExQzY4RjYsIDB4NjAxMkQyMUMsIDB4Q0IyMEU0MDUsIDB4MjEwMkU1MDAsCisweDAwMEIyMjQyLCAweDAwMDAyMjUyLCAweDAwMUUxMDE3LCAweDAwMjAzOTk2LAorMHgwMDFFMTAxNSwgMHgwMDFFMTBCRiwgMHgwMDExNzgwMCwgMHgwMDFFMTBGQywKKzB4MDAyMDA2NDQsIDB4MDAyMDM5OUMsIDB4MDAyMDJBNTYsIDB4MDAyMDNCNjQsCisweDAwMjAxOEQwLCAweDAwMjAzQjgwLCAweDAwMjAxOEMwLCAweDAwMTE3ODhDLAorMHgwMDIwMzk5OCwgMHgwMDIwMzU3QywgMHgwMDIwMTUzNCwgMHgwMDFFMjEzMCwKKzB4MDAyMDJBMTgsIDB4MDAyMDNCODgsIDB4MDAyMDM5RkMsIDB4MDAyMDNBMDQsCisweDAwMjAzREMwLCAweDAwMUMzNTAwLCAweDAwMUQ0MDA0LCAweEQ1NjREMTYzLAorMHhFNDAwRDc2NCwgMHgyMTQyRTIwRiwgMHgxNzQxMTE1NCwgMHhENTYyMjcyMiwKKzB4OTY2OUQ3NjIsIDB4MTU0MTI1NzIsIDB4OTY2NjE1NjIsIDB4RTYwMTE1NjUsCisweEQ1NUYxMTY1LCAweDY2NkNFNkY4LCAweDI1NDIyNTQyLCAweDI1NDIyNTQyLAorMHgyNTQyMjU0MiwgMHgyNTYyMjU0MiwgMHg3NjAxRTcyNywgMHg2NzYzMjU3MiwKKzB4MjU2Mjc3OTcsIDB4RTcwNDI1NzIsIDB4MjU3MkUyNDgsIDB4RTIxOTI1MjIsCisweEUyNzAyNTIyLCAweDI1NDIyNTQyLCAweDI1NDIyNTQyLCAweDI1MjIyNTQyLAorMHgyNTIyRTIwQywgMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwKKzB4MjU0MjI1NDIsIDB4MDAwQjE1NEEsIDB4RTIwODExNDUsIDB4MDAwOTQyMkIsCisweDJGRTYyRkQ2LCAweDdGRkM0RjIyLCAweEM4MjA2MDQzLCAweDZFNDM4RDAyLAorMHgwMDA5QkU4NSwgMHhDODEwNjBFMywgMHhCRTgyODkwMSwgMHg2MEUzMDAwOSwKKzB4ODkwMUM4NDAsIDB4MDAwOUJFQTQsIDB4QzgwMTYwRTMsIDB4REQzRDg5MzgsCisweEM4MDI2MEQwLCAweDJGMDA4RDAzLCAweDQ2MEJENjNCLCAweDYwRjAwMDA5LAorMHg4OTAyQzgwNCwgMHg0NjBCRDYzOSwgMHg2MkYwMDAwOSwgMHhDODgwNjAyMywKKzB4NjBEMDg5MDIsIDB4MkQwMEM5N0YsIDB4QzgwMTYwMjMsIDB4RDYzNDg5MDYsCisweDAwMDk0NjBCLCAweDAwMDlBMDA3LCAweDUxNjMwNjAxLCAweDg5MDJDODA4LAorMHg0NjBCRDYzMCwgMHg2MEYwMDAwOSwgMHg4OTAyQzgxMCwgMHg0MjBCRDIyRSwKKzB4RDUyRTAwMDksIDB4ODgwMjYwNTIsIDB4RDIyRDhCMDMsIDB4QTAwNUU2MDQsCisweDg4MDEyMjYwLCAweEQyMkE4QjAyLCAweDIyNjBFNjAxLCAweDI1MjJFMjAwLAorMHhDODgwNjBFMywgMHhEMjI3ODkyRCwgMHg2MEUzNkUyMCwgMHg4OTAyQzg4MCwKKzB4NDIwQkQyMjUsIDB4NjBFMzAwMDksIDB4ODkwMkM4NDAsIDB4NDIwQkQyMjMsCisweDYwRTMwMDA5LCAweDg5MDJDODAyLCAweDQyMEJEMjIxLCAweDYwRTMwMDA5LAorMHg4OTBEQzgwNCwgMHhERDIwRDExRiwgMHgwMDA5NDEwQiwgMHgwMDA5QkYxMSwKKzB4MDAwOUJGNEMsIDB4RDUxRUQ0MUQsIDB4MjQ3MEU3MDgsIDB4MjVEMkJGODUsCisweEM4MDg2MEUzLCAweEQyMUI4OTA1LCAweDRGMjY3RjA0LCAweDQyMkI2RUY2LAorMHg3RjA0NkRGNiwgMHg2RUY2NEYyNiwgMHg2REY2MDAwQiwgMHgwMDFDNTgxQywKKzB4QTAwMEEwMDAsIDB4MDAxRDAxMDAsIDB4MDAxRDQwMDAsIDB4MDAwNDAwMjEsCisweDAwMUM1ODlDLCAweDAwMUUxMDIxLCAweDAwMjAxQTQ2LCAweDAwMjAxQTY4LAorMHgwMDIwMjBDOCwgMHgwMDIwMUE4MCwgMHgwMDIwMUE4RSwgMHgwMDIwM0E1MCwKKzB4MDAxRTEwMEIsIDB4MDAxRTEwMjgsIDB4MDAyMDFBRkEsIDB4MDAyMDFCMDYsCisweDAwMjAxQTk2LCAweDAwMjAxQUI0LCAweDEyMzQ1Njc4LCAweDAwMUUxMDAwLAorMHgwMDEwRjEwMCwgMHgwMDIwMUFFMiwgMHg2NDRDRDZBNywgMHgwMDBCMzQ2QywKKzB4RDZBNjI0NTAsIDB4MzQ2QzY0NEMsIDB4MjQ1MDAwMEIsIDB4NjQ0Q0Q2QTQsCisweDAwMEIzNDZDLCAweDYyNUMyNDUwLCAweDQyMDg2MTZELCAweDQyMDg0MTE5LAorMHg0MjAwNjAxOSwgMHg2NzBFNjE0QywgMHhENDlFMzIxQywgMHg0MjAwMjA3RCwKKzB4MzI0Q0M5MEYsIDB4MjIwMDAwMEIsIDB4NDIwODYyNUMsIDB4NDIwMDQyMDgsCisweDMyNEM2NDRDLCAweDQyMDBENDk4LCAweDAwMEIzMjRDLCAweDJGRTYyMjYwLAorMHg2MTRDNEYxMiwgMHg0MTAwRDQ5MywgMHg2NzEwMzE0QywgMHhFMjlGNjY2RCwKKzB4MjcyOTQ2MTksIDB4NkU1MzYyNjksIDB4NjcyRTY1NzMsIDB4NDIyMTIyN0QsCisweDQyMjE0MjIxLCAweDc2MDE2NjJDLCAweEU0MDE0NjA4LCAweDM0RTg0NjA4LAorMHg2NDRDNDYwMCwgMHgwNzFBMDQ2NywgMHgyMTUwMjU3QiwgMHgwMDBCNEYxNiwKKzB4NEYyMjZFRjYsIDB4RDI4NTdGRTgsIDB4ODgwMTYwMjEsIDB4RDI4NDhCN0IsCisweDI2Njg2NjIxLCAweEQyODM4Qjc3LCAweDI2Njg2NjIxLCAweEU1MEY4QjczLAorMHhFNDAxQkZBMiwgMHhCRkE0RTUwMSwgMHhFNTg2RTQwMCwgMHhFNDAwNjU1QywKKzB4MkY1MEJGQTQsIDB4QkZBMUU0MDEsIDB4RTYwMkU1MDYsIDB4NjA2MzQ2MTgsCisweDgxRjJFNDAxLCAweDY1NDNCRjlGLCAweEU0MDE4NUYyLCAweEJGQUI2NTQzLAorMHg4NUYyNjYwMywgMHg2NTQzRTQwMSwgMHg2NjAzQkZCMSwgMHhFNDAyNjVGMCwKKzB4NjA1Mzc1NkMsIDB4ODBGOEJGODAsIDB4QkY4MkU0MDIsIDB4ODRGOEU1MTIsCisweDcwOTBFNDAyLCAweDY1MDNCRjgyLCAweDQ2MThFNjAyLCAweDgxRjY2MDYzLAorMHhCRjgwRTQwMiwgMHg4NUY2RTUwMCwgMHg2NjAzRTQwMiwgMHhFNTAwQkY4QywKKzB4RTQwMjg1RjYsIDB4QkY5MjY2MDMsIDB4RTVGRUU1MDAsIDB4RTAxMDY1NUMsCisweEJGNjFFNDAzLCAweEU1MTMwRjU0LCAweEU0MEVCRjYzLCAweDA1RkNFMDEwLAorMHhCRjYzRTQwRSwgMHhFNTAwNzU4NSwgMHhCRjY0RTQwMywgMHhFNTAwRTY0MCwKKzB4QkY3MUU0MDMsIDB4RTUwMEU2NDAsIDB4QkY3OEU0MDMsIDB4RTVGRkU2NDAsCisweEUwMTQ2NTVDLCAweEJGNDdFNDA0LCAweEU0MEYwRjU0LCAweEU1MDRCRjQ5LAorMHgwNUZDRTAxNCwgMHhCRjQ5RTQwRiwgMHhFNTAxNzU4NCwgMHhCRjRBRTY0MCwKKzB4RTUwMUU0MDQsIDB4QkY1N0U2NDAsIDB4RTUwMUU0MDQsIDB4RTQwNEU2NDAsCisweEFGNUM3RjE4LCAweDdGMTg0RjI2LCAweDAwMEI0RjI2LCAweDRGMjIwMDA5LAorMHhEMjQyN0ZGMCwgMHg4ODAxNjAyMSwgMHhEMjQxOEI3MSwgMHgyNjY4NjYyMSwKKzB4RDI0MDhCNkQsIDB4MjY2ODY2MjEsIDB4RTUwRjhCNjksIDB4RTQwMUJGMUMsCisweEJGMUVFNTAxLCAweEU1ODZFNDAwLCAweEU0MDA2NTVDLCAweDJGNTBCRjFFLAorMHhCRjFCRTQwMSwgMHhFNDAxRTUwNiwgMHhCRjFDNjU0MywgMHhFNDAxRTY0MCwKKzB4QkYyOTY1NDMsIDB4RTQwMUU2NDAsIDB4QkYzMDY1NDMsIDB4NjVGMEU2NDAsCisweDc1NkNFNDAyLCAweEJFRkY2MDUzLCAweEU0MDI4MEY0LCAweEU1MTJCRjAxLAorMHhFNDAyODRGNCwgMHhCRjAxNzA5MCwgMHhFNjQwNjUwMywgMHhCRjAyRTQwMiwKKzB4RTY0MEU1MDAsIDB4QkYwRkU0MDIsIDB4RTY0MEU1MDAsIDB4QkYxNkU0MDIsCisweEU1RkVFNTAwLCAweDYwNTM2NTVDLCAweEJFRTVFNDAzLCAweEU1MTM4MEY4LAorMHhFNDBFQkVFNywgMHhFNDBFODRGOCwgMHhCRUU3NzA4NSwgMHhFNTAwNjUwMywKKzB4QkVFOEU2NDAsIDB4RTUwMEU0MDMsIDB4QkVGNUU2NDAsIDB4RTUwMEU0MDMsCisweEJFRkNFNjQwLCAweEU1RkZFNDAzLCAweDYwNTM2NTVDLCAweEJFQ0JFNDA0LAorMHhFNDBGODBGQywgMHhFNTA0QkVDRCwgMHhFNDBGODRGQywgMHhCRUNENzA4MywKKzB4RTUwMTY1MDMsIDB4QkVDRUU2NDAsIDB4RTUwMUU0MDQsIDB4QkVEQkU2NDAsCisweEU1MDFFNDA0LCAweEU0MDRFNjQwLCAweEFFRTA3RjEwLCAweDdGMTA0RjI2LAorMHgwMDBCNEYyNiwgMHgwMDAwMDAwOSwgMHgwMDFFMTAyRiwgMHgwMDFFMTA4MCwKKzB4MDAxRTEwOTAsIDB4MDAxRTEwM0YsIDB4MDAxRTEwM0UsIDB4MDAyMDNBNEEsCisweDAwMjAzQTRDLCAweDAwMjAzQTRFLCAweEQyMUREMTFDLCAweDY2MjA2MDEwLAorMHg2NzZDNzAwMSwgMHgzNzAwQzkwRiwgMHhFNTAwOEQxMywgMHg2NzEwNjIxMCwKKzB4NzcwMTYyMkMsIDB4NjQyMzIxNzAsIDB4RDYxNjYwMTAsIDB4NDQwODQ0MDgsCisweDM0MjhDOTBGLCAweDYyNjAyMTAwLCAweDcyMDFENTEzLCAweDQ0MDgyNjIwLAorMHgwMDBCMzU0QywgMHhEMTBGNjA1MywgMHgyNTU4NjUxMCwgMHhFNjAwOEQxMywKKzB4RDYwREQ0MEIsIDB4NjU1QzY1NDAsIDB4NDcwODY3NTMsIDB4Mzc1ODQ3MDgsCisweDQ3MDg2NTQwLCAweDI0NTA3NTAxLCAweDM2N0M2MDQwLCAweDI0MDBDOTBGLAorMHg3MkZGNjIxMCwgMHgwMDBCMjEyMCwgMHgwMDAwNjA2MywgMHgwMDIwMzk5NSwKKzB4MDAyMDM5OTQsIDB4MDAyMDM5OTYsIDB4MDAyMDM1QkMsIDB4N0ZGQzRGMjIsCisweEU2ODBEMUE4LCAweDY2NkM2MjEyLCAweEQyQTcyRjIyLCAweDY3RjM2NTYzLAorMHg0MjBCNzU0MiwgMHg3RjA0RTQwNCwgMHgwMDBCNEYyNiwgMHhFNjgwMDAwOSwKKzB4RDJBMTY2NkMsIDB4RTcwMDY1NjMsIDB4NDIyQjc1NDAsIDB4RTY4MDY0NzMsCisweEQyOUQ2NjZDLCAweEU3MDA2NTYzLCAweDQyMkI3NTQzLCAweDJGODY2NDczLAorMHgyRkE2MkY5NiwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHg3RkMwNEYyMiwKKzB4REI5N0QyOTYsIDB4NzIwMTJGMjIsIDB4RDE5NjFGMjEsIDB4NjYxMjUyMTEsCisweDhCMDEzNjIwLCAweDAwMDlBMEY5LCAweEM5MDM2MDYxLCAweDhCMDE4ODAxLAorMHgwMDA5QTBGMywgMHhEMjkwREM4RiwgMHg2NEMzNDIwQiwgMHg2NTAzRDE4RiwKKzB4NjAxMTFGMDIsIDB4OEIwNDg4MDEsIDB4NDIwQkQyOEQsIDB4QUZFNDY0QzMsCisweDU0NTMwMDA5LCAweDg0NENFRTg0LCAweDg5MDEzMEUwLCAweDAwMDlBMEMzLAorMHg2NjEwRDE4OCwgMHg2MDIzNjI2QywgMHg4QjcxODgwMSwgMHg2MjEwRDE4NiwKKzB4ODk2NjIyMjgsIDB4REE4NkQyODUsIDB4RTAwMzYxMjIsIDB4NjQyMjExMTIsCisweDQwMThEODgxLCAweEREODNFNTAwLCAweDgxNDE2N0EzLCAweDc3MDQyODUwLAorMHg2NDcyNjZBMiwgMHg2RUQzRDU4MCwgMHgxRjQ1N0UwNCwgMHg2NTUyMUY1NiwKKzB4NjRFMzY4RDIsIDB4MUY4ODc0RjgsIDB4Njg0MzY5RTIsIDB4MUY2Mzc4OTQsCisweDFGOTkxRjc0LCAweDYyODI2MTQyLCAweEQ3NzlEOTc4LCAweDFGMkJENjc5LAorMHg2NzcyNjI5MiwgMHgxRjFBNjA2MiwgMHgyNjAyQ0IyMCwgMHhEMTc2RTYwMCwKKzB4RTU0MDFGNTcsIDB4MUY3RDFGMkMsIDB4NzYwMTFGMUUsIDB4MzI1MzYyNkQsCisweDUxRjM4QkZCLCAweDUyRjU1NUY0LCAweDI1MjIyQTEyLCAweDU1Rjc1N0Y2LAorMHgyNzUyNUFGOCwgMHg1REY5MkRBMiwgMHgyRUQyNTFGQiwgMHhENTZCNUVGQSwKKzB4NTRGQzI0RTIsIDB4MjgxMjU3RkQsIDB4RDE2MEQ4NjksIDB4MjU3MjI5NDIsCisweDY5MTI2NzgyLCAweDE5NzREODY2LCAweERENjY2QTEyLCAweDU2RkU2MEExLAorMHgyQTAxQ0IwMSwgMHhEQTY0NjQxMiwgMHhFOTAxMjg0MiwgMHg0QTBCMkQ0MiwKKzB4NTJGRTI2OTIsIDB4RDY2MUVFMDEsIDB4MjJFMjRFMTgsIDB4NzIwMTYyNjIsCisweDYwQjIyNjIyLCAweENCMDFEMTRGLCAweDJCMDJFMjAyLCAweDIxMjBBMDNGLAorMHg4QjNDMjIyOCwgMHhFNjAxRDU1QSwgMHgyMTYwRTcwMCwgMHhFMDFDMjU3MiwKKzB4QzgwMTAwNEMsIDB4RDg1NzhCMEMsIDB4MUY4RkQyNTcsIDB4RTYwMDI4MjIsCisweDc2MDFFNTdELCAweDMyNTM2MjZDLCAweDU2RkY4QkZCLCAweDI2MjJEMjUzLAorMHhFMkZFNjlCMiwgMHgyQjkyMjkyOSwgMHgwQTRDRTAxRSwgMHhFMDFGNjVGMiwKKzB4MDE0QzI1QTAsIDB4NzQxMDU3RjEsIDB4RUEwNjI3MTAsIDB4REQ0Q0U2MDAsCisweDg0NDZERTRDLCAweDJEMDA3NjAxLCAweDY5NkM2ODQ0LCAweDJFODAzOUEzLAorMHg4RkY2N0UwMSwgMHhERTQ4N0QwMSwgMHgyRUEwRUE5NCwgMHhFMTAwN0UwMSwKKzB4N0UwRjJFMTAsIDB4RDEyRkUyMDUsIDB4NjQxMDJFMjAsIDB4NjAyMzYyNEMsCisweDg5MDg4ODAxLCAweDU1RjJEMjJBLCAweDY0QzM0MjBCLCAweEVFMDFEMTMyLAorMHhBRjFBNEUxOCwgMHg1NUYyMjFFMiwgMHg4NTUzRDEzQywgMHg2MjBENjYxMiwKKzB4ODkwNjMyNjIsIDB4RDYzQkQ0M0EsIDB4RTgwMTQ2MEIsIDB4QUYwQ0Q3M0EsCisweEQ5MUYyNzgyLCAweDY0QzM0OTBCLCAweEVFMDFEMTI3LCAweERBMzhENDM3LAorMHg0QTBCNEUxOCwgMHhBRjAwMjFFMiwgMHg3RjQwMDAwOSwgMHg2RUY2NEYyNiwKKzB4NkNGNjZERjYsIDB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsIDB4NEYyMjY4RjYsCisweDg1NDY3RkY0LCAweDJGMDFFNjgxLCAweDY2NkM4NTQ3LCAweDg1NDg4MUYxLAorMHg4MUYyRDIwOSwgMHg2N0YzODU0MiwgMHg4NTQzODFGMywgMHg4MUY0RTQwQywKKzB4NjU2MzYwNTMsIDB4NDIwQjgxRjUsIDB4N0YwQzc1NDAsIDB4MDAwQjRGMjYsCisweDAwMDAwMDA5LCAweDAwMUMzRDlDLCAweDAwMjAyM0ZDLCAweDAwMTE3NzlBLAorMHgwMDFDMzZGOCwgMHgwMDIwMzVCNCwgMHgwMDIwMTRBNiwgMHgwMDIwM0ExNiwKKzB4MDAyMDE0RDAsIDB4MDAyMDM5QTUsIDB4MDAyMDM5QTQsIDB4MDAyMDM5QTAsCisweDAwMUMzQjlDLCAweDAwMUMzNzA0LCAweDAwMUMzRDk4LCAweDAwMUMzQkI0LAorMHgwMDFDNTk2MCwgMHgwMDFDMzUwMCwgMHgwMDFDM0QzMCwgMHgwMDFDODk2MCwKKzB4MDAyMDM1OEMsIDB4MDAxQzNEMDAsIDB4MDAyMDE2MTAsIDB4MDAxMTc3MzAsCisweDAwMjAzOUE4LCAweDAwMUM1ODJDLCAweDIwMDBBMDAwLCAweDAwMDBBMDAwLAorMHgwMDExNzc4QywgMHgwMDExNzc5MiwgMHgwMDExNzc4OCwgMHgwMDIwMzk3QywKKzB4MDAyMDM1N0MsIDB4MDAyMDE1MzQsIDB4MDAxRTIxMzAsIDB4MDAyMDNEQTAsCisweDAwMjAxOEMwLCAweDJGOTYyRjg2LCAweDJGQjYyRkE2LCAweDJGRDYyRkM2LAorMHg0RjIyMkZFNiwgMHhEMTlCN0ZFQywgMHgyRjEyRTAwMCwgMHg2MTAzRDQ5QSwKKzB4MUY0MjgxRjIsIDB4REQ5QURBOTksIDB4RDY5QTY4MTMsIDB4RTAwMTQ4MDgsCisweDQ2MEJERTk5LCAweDM4RUM0ODAwLCAweDY1QTIxRjAzLCAweDM1MjA1MkExLAorMHhBMjNFOEIwMSwgMHg2MDUxMDAwOSwgMHg4ODAxQzkwMywgMHhBMjM4OEIwMSwKKzB4NTI1MzAwMDksIDB4MzJFMERFOTEsIDB4RDk5MThCMTAsIDB4NjRBMzQ5MEIsCisweDRCMEJEQjkwLCAweERFOTA2NDAzLCAweEQ3OTFENjkwLCAweEVDMDFENTkxLAorMHgyRTAyRTEwMCwgMHgyNzEwMjZDMCwgMHgyNTAyQUZERiwgMHhDODAxODU1MSwKKzB4QTE1NzhCMDEsIDB4NjI1MTAwMDksIDB4NDIwMDYyMkQsIDB4NUU1MzM2NkEsCisweDg1RTIyMjZELCAweEM5MDM2NDJDLCAweDg1RTM2NjAzLCAweDYwNTM2NTBELAorMHg0MDIxNDAyMSwgMHg0NTAwQzkzRiwgMHgzMjJBNjcwMywgMHg2MDUzMjUyRCwKKzB4QzkwMUQxN0YsIDB4NjAxMDZDMDMsIDB4ODgwMUQ5N0YsIDB4REI3RjhCMDUsCisweDIxMjBFMjAwLCAweENCMDE2MEIyLCAweEQxN0QyQjAyLCAweDg4MDE2MDExLAorMHg2NUEyOEIwQSwgMHg4RDA0MjQ0OCwgMHg5QjlFNjI1MSwgMHhBMDAzMjJCOSwKKzB4OTE5QjI1MjEsIDB4MjUyMTIyMUIsIDB4MzdCM0VCMTAsIDB4MjQ0ODg5NUUsCisweEQ0NzM4QjA3LCAweDIyMjg2MjQxLCAweDYwNjM4OTAzLCAweEEwNTc4MUY4LAorMHhENTcwNjQ3MywgMHg0NjA4NDYwOCwgMHg4NUUyNjI3MywgMHg0NjAwNkI1MCwKKzB4MzYyQzQyMDAsIDB4MkJCOEM5MTAsIDB4OEYxRjY0NjMsIDB4MjY2ODY2MDMsCisweEQyNjk4OTExLCAweDA2MkQ2MDQzLCAweDQxMTk2MTZELCAweDZCMEU2MDE5LAorMHg4MUY4MjBCRCwgMHg4ODAxNjBDMywgMHg2NDZDOEYyQywgMHg4ODBGNjA3MywKKzB4QTAyNzhCMUIsIDB4RDI2MTAwMDksIDB4MDUyRDYwNDMsIDB4NDExOTYxNUQsCisweDY3MEU2MDE5LCAweDY0NUMyMDdELCAweDgxRjhBMDFDLCAweDg5MEYyNjY4LAorMHg2MDQzRDI1QiwgMHg2QjVEMDUyRCwgMHg2MEI5NEIxOSwgMHgyMDFENjEwRSwKKzB4NjBDMzgxRjgsIDB4OEYwRDg4MDEsIDB4NjQ3MzY0NUMsIDB4RUMwMEEwMEEsCisweDYwNDNEMjU0LCAweDYyNUQwNTJELCAweDYwMjk0MjE5LCAweDIwN0Q2NzBFLAorMHg4MUY4NjQ1QywgMHg4ODAyODVGOCwgMHg4NUUxODkwQSwgMHg4RDA3QzgyMCwKKzB4RTZEQzYyMDMsIDB4NjAyMzIyNjksIDB4ODFFMUEwMDIsIDB4NjQ0Q0U0RkYsCisweDYyMTBEMTQ5LCAweDg5MDEyMjI4LCAweDY0NENFNEZGLCAweDY1NERFQkZGLAorMHgzNUIwNkJCQywgMHhEQjM2OEIyQiwgMHg2NEEzNEIwQiwgMHg0MTBCRDEzNSwKKzB4NTQwMzY0MDMsIDB4ODU0NDZFMDMsIDB4Qzk0OERCNDAsIDB4REM0MDg4MDgsCisweEJFQUM4QjAxLCAweDY0QjNFNTAyLCAweDY1RTM0QzBCLCAweERCM0RFQzAxLAorMHhEMTNEMkRDMiwgMHg2MjEyNjBCMiwgMHg3MjAxNzAwMSwgMHgyMTIyODgwNSwKKzB4MkIwMjhGMDgsIDB4NjY2Q0U2ODAsIDB4NjU2M0QyMzgsIDB4NzU0OUU3MDAsCisweDY0NzM0MjBCLCAweEEwMzBENDM2LCAweDdGRkYwMDA5LCAweDg1RTI4MDAwLAorMHgyMEI5RUJGQywgMHg2MTAzODFFMiwgMHg5NDJBODVFMywgMHg2MjAzMjA0OSwKKzB4NDUwODg1RjgsIDB4ODFFMjIwMUIsIDB4QzkwMTYwQzMsIDB4NDAwODQwMTgsCisweDQwMDg0MDA4LCAweDQwMDAyMjVCLCAweDYwMjMyMjBCLCAweDg1RTQ4MUUzLAorMHg0MTE4RTEwOCwgMHg4MUU0MjAxQiwgMHhFNDAyNjJBMiwgMHgyMEI5ODUyMSwKKzB4NjdBMjgxMjEsIDB4Q0IwMTYwNzEsIDB4ODVGODI3MDEsIDB4ODkwMzMwNDIsCisweEVDRTc4NUUyLCAweDgxRTIyMEM5LCAweDQ5MEJENDFFLCAweEEwM0IwMDA5LAorMHg3RTAzMDAwOSwgMHgwMDFDM0QzMCwgMHgwMDIwM0RBQywgMHgwMDIwMzU4QywKKzB4MDAxRTIxMkMsIDB4MDAyMDM0NzAsIDB4MDAxQzNEMDAsIDB4MDAxMTc3ODAsCisweDAwMjAxNEE2LCAweDAwMjAxNjcwLCAweDAwMTE3NzBDLCAweDAwMjAzOUE0LAorMHgwMDIwMzlBNSwgMHgwMDIwMzlBMCwgMHgwMDIwMThDMCwgMHgwMDFDMzZGOCwKKzB4MDAyMDNBMUEsIDB4MDAyMDNEQkMsIDB4MDAyMDNCQTAsIDB4MDAyMDNDMjAsCisweDAwMjAzQ0EwLCAweDAwMjAzRDIwLCAweDAwMjAzOTkwLCAweDAwMjAzNTg0LAorMHgwMDIwMTREMCwgMHgwMDIwM0ExQywgMHgwMDIwM0EyMCwgMHgwMDIwMjNGQywKKzB4MDAyMDNEQTQsIDB4MDAyMDNEQTgsIDB4NjAyMjYyRjIsIDB4NDAwOTQwMTksCisweEM5MEY0MDA5LCAweDhCMEI4ODBBLCAweDYwRTJERThDLCAweDQwMDk0MDE5LAorMHhDOTBGNDAwOSwgMHg4QjAzODgwOCwgMHhDQjAxNjBBMiwgMHgyODAyQTAwNiwKKzB4NjVFMkRFODcsIDB4MkU1Mjc1MDEsIDB4Mjg2MjY2QTIsIDB4NTJGMzY2RjIsCisweDI2MjJBRTgzLCAweEQyODM4NTUxLCAweERFODNDODAyLCAweEEwOTU4QjAxLAorMHg0MjBCMDAwOSwgMHg0RTBCNjRBMywgMHg1RTAzNjQwMywgMHg4NUU0NjUwMywKKzB4NDkxOEU5MDgsIDB4RDc3RDIwOUIsIDB4RTA0QzgxRTQsIDB4REM3QzBCN0UsCisweDdCMDFEOTdDLCAweDYxQzIwN0I2LCAweDcxMDE2NjkwLCAweDhEMDYyNjY4LAorMHhENDc5MkMxMiwgMHg0MjBCRDI3OSwgMHhBMDcwRUIwMSwgMHg2MjUxMkRCMiwKKzB4NEIxOEVCMEYsIDB4MjJCOUUxMDIsIDB4MzIxMDQxMTgsIDB4ODU1MThCMEYsCisweDIwMjlFMkZDLCAweDYwNTE4MTUxLCAweENCMDE3MkUwLCAweDg1RTEyNTAxLAorMHgyMDI5OTRBMywgMHg4NUU0ODFFMSwgMHhBMDUyMjA0OSwgMHg2NzUxODFFNCwKKzB4NDcxOTY3N0QsIDB4NjY3RTY3NzksIDB4NzcwMTI3NkQsIDB4NjkwMzYwN0MsCisweDg4MDE0OTE4LCAweDI1OTE4RjNFLCAweDZCMTJEMTYxLCAweDIxQjI3QjAxLAorMHg2NjBEODVFMywgMHg0MDIxNjA2MywgMHhDOTNGNDAyMSwgMHg2QzAzNDYwMCwKKzB4MjYyRDMyMkEsIDB4QzgwMTYwNjMsIDB4REI1RUQxNUQsIDB4OTY3RDg5MDEsCisweEU2MDAyQzZCLCAweDY2NkM2N0NELCAweDQwMDA2MDYzLCAweDYyMkQwMjFELAorMHg4RDBFMzI3MCwgMHg2MDQzNjQwMywgMHhFOUZGMDIxRCwgMHg4QjAxMzI5MCwKKzB4MDFDNUEwMDcsIDB4NjI2Qzc2MDEsIDB4MzI5MkU5MDQsIDB4NjQ2QzhCRUIsCisweDYwNDM0NDAwLCAweEQxNTAwNEJELCAweDBCNDU3NDAxLCAweDY2OUQ2OTExLAorMHg4OTA3MzY3MCwgMHg2MDJENjIxMSwgMHg4OTAzODhGRiwgMHhFMjAxREI0QiwKKzB4MkIyMDIxQzEsIDB4RUNGQzg1NTEsIDB4ODE1MTIwQzksIDB4Q0IwMTYwNTEsCisweERDNDcyNTAxLCAweDY0QTM0QzBCLCAweDUxRjM2NkYyLCAweDg1RUYyNjEyLAorMHg1NEYyRDI0NCwgMHg2NTBENDIwQiwgMHgwMDA5QURFNywgMHhFNTAwREM0MiwKKzB4NDIwQjJDNTIsIDB4NEUwQjY0QTMsIDB4NTQwMzY0MDMsIDB4ODU0NDZFMDMsCisweDY3MDNFOTA4LCAweDY1MDM0OTE4LCAweDI3OTk4NTQxLCAweERCMzIzNzkwLAorMHg4RjBCRDkzMiwgMHg2MDEzNjEwRCwgMHg4QjA3QzgyMCwgMHhDOTQ4NjA1MywKKzB4OEIwMzg4MDgsIDB4RTUwMUJENEIsIDB4MDAwOUEwMDUsIDB4MjEyOEQyMzMsCisweEJENDQ4OTAxLCAweDY0QjNFNTAwLCAweDQ5MEI2NUUzLCAweEFEQkNFQzAxLAorMHg4NUYyMkRDMiwgMHg3MDAxRUUwNCwgMHgzMUU3NjEwRCwgMHg4RDAyODFGMiwKKzB4QURBOTdBMDgsIDB4N0YxNDAwMDksIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsCisweDZBRjY2QkY2LCAweDAwMEI2OUY2LCAweEY3RkY2OEY2LCAweDJGRTY4MDAwLAorMHhEMjIzNEYyMiwgMHg2MEUzNkUyMiwgMHg4RDAyQzg0MCwgMHhCQkU1MjJFMiwKKzB4RTI0MDAwMDksIDB4MkUyODQyMTgsIDB4QkJGMDg5MDEsIDB4NjBFMzAwMDksCisweDg5MDVDODEwLCAweEQyMUNENDFCLCAweDAwMDk0MjBCLCAweDAwMDlCQkVGLAorMHhDODA1NjBFMywgMHhCRDZEODkwMSwgMHg2MEUzMDAwOSwgMHg4OTAyQzgwMiwKKzB4QUJFQzRGMjYsIDB4NEYyNjZFRjYsIDB4NkVGNjAwMEIsIDB4MDAxQzNEM0MsCisweDAwMTE3NzYwLCAweDAwMjAxNEE2LCAweDAwMjAxNjcwLCAweDAwMjAzNTFDLAorMHgwMDIwM0RDMCwgMHgwMDIwMzk5MCwgMHgwMDIwMzU4NCwgMHgwMDIwMTREMCwKKzB4MDAyMDM5RkMsIDB4MDAyMDNBMDQsIDB4MDAyMDM5RjgsIDB4MDAyMDM5RkEsCisweDAwMjAxNTM0LCAweDAwMjAxOEQwLCAweDAwMjAzQTFDLCAweDAwMDA4MDAwLAorMHgwMDFDMzUxMCwgMHgwMDIwM0RCNCwgMHgwMDIwMThDMCwgMHg4OTAxNEYyMiwKKzB4NjExQjYwMEIsIDB4NjExQkIwMEEsIDB4MDAwQjRGMjYsIDB4NjAwQjYwMEIsCisweDYxMUJBMDA0LCAweDhERjEyMTA3LCAweDhCRjg0MDExLCAweDYyMEQyRjI2LAorMHg4RjNFMzAyMCwgMHg0MDE4MDAxOSwgMHg4QjBCMzAxNiwgMHgzMTA0MzEwNCwKKzB4MzEwNDMxMDQsIDB4MzEwNDMxMDQsIDB4MzEwNDMxMDQsIDB4NDEyNDYyRjYsCisweDYwMUMwMDBCLCAweDQxMjk2MjE5LCAweDIwMDg0MDE4LCAweDMxMDQ4OTI2LAorMHgzMTA0MzEwNCwgMHgzMTA0MzEwNCwgMHgzMTA0MzEwNCwgMHgzMTA0MzEwNCwKKzB4MzEwNDMxMDQsIDB4MzEwNDMxMDQsIDB4MzEwNDMxMDQsIDB4NjExOTMxMDQsCisweDMyMDQyMjFELCAweDMyMDQzMjA0LCAweDMyMDQzMjA0LCAweDMyMDQzMjA0LAorMHgzMjA0MzIwNCwgMHgzMjA0MzIwNCwgMHgzMjA0MzIwNCwgMHgzMjA0MzIwNCwKKzB4MjEyRDMyMDQsIDB4NjAxOTYyRjYsIDB4NDAyNDAwMEIsIDB4MDAwQkUwMDAsCisweDYyMTM2MkY2LCAweDQxMjk0MjI4LCAweDMxMDQ0MjI0LCAweDMxMDQ0MjI0LAorMHgzMTA0NDIyNCwgMHgzMTA0NDIyNCwgMHgzMTA0NDIyNCwgMHgzMTA0NDIyNCwKKzB4MzEwNDQyMjQsIDB4MzEwNDQyMjQsIDB4MzEwNDQyMjQsIDB4MzEwNDQyMjQsCisweDMxMDQ0MjI0LCAweDMxMDQ0MjI0LCAweDMxMDQ0MjI0LCAweDMxMDQ0MjI0LAorMHgzMTA0NDIyNCwgMHgzMTA0NDIyNCwgMHg2MDJENDIyNCwgMHg2MkY2MDAwQiwKKzB4MDgwQTBDMEUsIDB4MDAwMjA0MDYsIDB4MUExQzFFMjAsIDB4MTIxNDE2MTgsCisweDJFMzAzMjM0LCAweDI2MjgyQTJDLCAweDNBM0MzRTQwLCAweDZDNjI1NjQ4LAorMHg0MTExMkYyNiwgMHhFMjIwOEYxOCwgMHg4OTBCMzEyMywgMHgzMjFDRDIwNCwKKzB4RDEwMjYyMjAsIDB4NDEyQjMxMkMsIDB4MDAwOTAwMDksIDB4MDAyMDM0OUEsCisweDAwMjAzNDUwLCAweDAwMEJFMDAwLCAweDQwMDA2MkY2LCAweDQwMDA0MDAwLAorMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg2MkY2MDAwQiwgMHg0MDAwNDAwMCwKKzB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAxODQwMDAsIDB4NjJGNjAwMEIsCisweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMjg0MDAwLAorMHg2MkY2MDAwQiwgMHg0MDAwNDAwMCwgMHg0MDE4NDAwMCwgMHgwMDBCNDAyOCwKKzB4QzkwRjYyRjYsIDB4NDAwNTQwMDUsIDB4NDAwNTQwMDUsIDB4NjJGNjAwMEIsCisweDQwMDVDOTA3LCAweDQwMDU0MDA1LCAweDYyRjYwMDBCLCAweDQwMDVDOTAzLAorMHgwMDBCNDAwNSwgMHhDOTAxNjJGNiwgMHgwMDBCNDAwNSwgMHgwMDAwNjJGNiwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0MjcwNzM3MiwKKzB4M0QyMDY2NzUsIDB4NTU0RTIwM0QsIDB4MjAyQzRDNEMsIDB4NkU0OTY3N0EsCisweDRFNDk3Mjc0LCAweDZENzU0RTUxLCAweDAwMDAwMDNELCAweDYxNzY2RTQ5LAorMHgyMDY0Njk2QywgMHg3MjY1NzM3NSwgMHgyMDcyNkYyMCwgMHgyMDc5NjU2QiwKKzB4MDAyMTQ0NDksIDB4NkU2QjZFNTUsIDB4MjA2RTc3NkYsIDB4NkQ2RDZGNjMsCisweDNENjQ2RTYxLCAweDAwMDAwMDAwLCAweDIwM0EzMDUxLCAweDAwMDAwMDIwLAorMHgyMDNBMzE1MSwgMHgwMDAwMDAyMCwgMHgyMDNBMzI1MSwgMHgwMDAwMDAyMCwKKzB4MjAzQTMzNTEsIDB4MDAwMDAwMjAsIDB4MjAzQTM0NTEsIDB4MDAwMDAwMjAsCisweDJCNDM0NzQxLCAweDczNjk2RjRFLCAweDYxNDMyMDY1LCAweDcyNjI2OTZDLAorMHg2RjY5NzQ2MSwgMHg2MTY2MjA2RSwgMHg2RjIwNkM2OSwgMHg2OTc0MjA2RSwKKzB4MEQwQTY1NkQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwNzIsIDB4MDAyMDUyMjAsCisweDYyNzM1NTc2LCAweDc0NzM3MjVGLCAweDAwMDAwQTBELCAweDYyNzM1NTc2LAorMHg3Mzc1NzM1RiwgMHg2NDZFNjU3MCwgMHgwMDAwMEEwRCwgMHg2MjczNTU3NiwKKzB4NzM2NTcyNUYsIDB4MDAwQTBENkQsIDB4MDAwMDAwNDQsIDB4NDQzODc1NzAsCisweDcyNjM3MzY1LCAweDZGNzQ3MDY5LCAweDNENTg0NTcyLCAweDAwMDAwMDAwLAorMHgwMDAwMDA0NywgMHg3Mjc0NkU0OSwgMHg2RDY1MjA1MSwgMHgyQzc5NzQ3MCwKKzB4NDk2NzdBMjAsIDB4NDk3Mjc0NkUsIDB4NzU0RTUxNEUsIDB4MDAwMDNENkQsCisweDY1NEM3MjQ1LCAweDAwMDAwMDZFLCAweDIwNzQ2RjRFLCAweDc1NkY2RTY1LAorMHg0OTIwNjg2NywgMHg0MjIwNTE0RSwgMHgwQTBENjY3NSwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwRkYsIDB4MDAwMjAwMDEsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDEwRTAxMEQsIDB4MDAwMjAwMDMsIDB4MDEwOTAxMDgsIDB4MDAwMjAxMEEsCisweDAyMDAwMDAzLCAweDAyMDIwMjAxLCAweDAyMDQwMjAzLCAweDAyMDYwMjA1LAorMHgwMjAyMDIwMCwgMHgwMjA0MDIwMywgMHgwMjBDMDIwQiwgMHgwMjBFMDIwRCwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMDAwMDBGRiwgMHgwMDAyMDAwMSwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMTBFMDEwRCwgMHgwMDAyMDAwMywgMHgwMTA5MDEwOCwgMHgwMDAyMDEwQSwKKzB4MDAwMzAwMDMsIDB4MDIwMjAyMDEsIDB4MDIwNDAyMDMsIDB4MDIwNjAyMDUsCisweDAyMDIwMjAwLCAweDAyMDQwMjAzLCAweDAyMEMwMjBCLCAweDAyMEUwMjBELAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAxMEUwMTBELCAweDAwRkYwMTBGLCAweDAxMDkwMTA4LCAweDAxMEIwMTBBLAorMHgwMjAwMDEwRiwgMHgwMjAyMDIwMSwgMHgwMjA0MDIwMywgMHgwMjA2MDIwNSwKKzB4MDIwMjAyMDAsIDB4MDIwNDAyMDMsIDB4MDIwQzAyMEIsIDB4MDIwRTAyMEQsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDEwRTAxMEQsIDB4MDBGRjAxMEYsIDB4MDEwOTAxMDgsIDB4MDEwQjAxMEEsCisweDAxMEYwMTBGLCAweDAyMDIwMjAxLCAweDAyMDQwMjAzLCAweDAyMDYwMjA1LAorMHgwMjAyMDIwMCwgMHgwMjA0MDIwMywgMHgwMjBDMDIwQiwgMHgwMjBFMDIwRCwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMDIwNTIyMCwgMHgwMDAwMDA0NiwgMHgwMDAwMDA1OSwgMHg3MzIwNDE0MiwKKzB4MDAzRDcxNjUsIDB4NDk1NDQxMjAsIDB4MDAwMDIwNEQsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMkUwMjA5LCAweDgwMDAwMTAxLCAweDAwMDQwOUZBLAorMHgwMEZGMDQwMCwgMHgwNTA3MDAwMCwgMHgwMjAwMDIwMSwgMHg4MjA1MDcwMCwKKzB4MDAwMjAwMDIsIDB4MDM4MzA1MDcsIDB4MDcwMTAwNDAsIDB4NDAwMzA0MDUsCisweDAyMDkwMTAwLCAweDAxMDEwMDJFLCAweDA5RkE4MDAwLCAweDA0MDAwMDA0LAorMHgwMDAwMDBGRiwgMHgwMjAxMDUwNywgMHgwNzAwMDA0MCwgMHg0MDAyODIwNSwKKzB4MDUwNzAwMDAsIDB4MDA0MDAzODMsIDB4MDQwNTA3MDEsIDB4MDAwMDQwMDIsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDA3MDkwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCB9OworCitjb25zdCB1MzJfdCB6Y1AyRndJbWFnZVNpemU9MTU5NjQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd2J1LmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd2J1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYwZjU3ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3YnUuYwpAQCAtMCwwICsxLDUyNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgIi4uLzgwMjExY29yZS9jcHJlY29tcC5oIgorCitjb25zdCB1MzJfdCB6Y0Z3QnVmSW1hZ2VbXSA9IHsKKzB4M0E0QkNGMTgsIDB4RjQ0QzA3NkUsIDB4RjU5NDUyRUEsIDB4NDUxQkE3NTUsCisweDE0MEFDODdBLCAweEMwN0VFOTQyLCAweDNFRjk3OEFCLCAweEY1QjAzREM2LAorMHhCNzAwODBGMCwgMHhBODkwNjRFQSwgMHg1NEUyQzFENiwgMHhFQjA0N0RGNCwKKzB4MTc5ODM5MEMsIDB4MDAzNTA2MjQsIDB4MzVCM0VDRjAsIDB4NTlGMkZBQkYsCisweEFGOUQyNDhFLCAweEY5QkRCOUYwLCAweEQwNUM4QjQ3LCAweEMwOEI1QTE2LAorMHg5OTAwOTNDNywgMHhEMzM1QTE2MCwgMHgxQzA0OTQyQywgMHhCRjZFN0E4OCwKKzB4RkQyMzJCMEYsIDB4NUMyMjQzODcsIDB4QkYxRTE1NkMsIDB4RjI0RjJBMjcsCisweEZGNTY0MjFELCAweEIyMTMwMzdDLCAweDJCQTY3QkEwLCAweDQ5NTBDRjhBLAorMHgwNUYwMEYyNSwgMHhBNUU4MjA4NSwgMHg3NDE2OEEwQywgMHgyRjJBQjMwQiwKKzB4QzgwQzU3RUUsIDB4QjZCREY1NzAsIDB4ODlCQzVBOTksIDB4N0YzQjVBNjcsCisweEY2Qzk0M0I4LCAweDBDOUM5MjAxLCAweEU4MzgzNzQ3LCAweDBDOUE3MkQ2LAorMHhFMDUyMDcwNCwgMHhBNjZEN0YzMCwgMHhFNDQ0QTQzNCwgMHhFMEM5NEFCNywKKzB4OERENzc1MUMsIDB4MUE2NTk0NjQsIDB4NkM5QUJBNEYsIDB4NzkyRjJEMkQsCisweDU5MzZGNjZCLCAweDA2MUU1ODBFLCAweDU5OTAzRjZDLCAweDFGQkZCOEEwLAorMHhDQzgyMkVGRSwgMHg0QjAzMENBRiwgMHhCNjI0NTdDOSwgMHgyN0U5QkYxNSwKKzB4QjExM0E0ODcsIDB4RkEwRkM5MTUsIDB4NDQ3QjE4NEEsIDB4NTMzMENENTEsCisweDAwQkNDNjIyLCAweEYzMERFMTQ5LCAweEZGNzE4RTFDLCAweDdCNUQyODYxLAorMHhEQkNBNTczRSwgMHhGQjBEN0JGOSwgMHhFMUNGQkFBQywgMHhGOTlENDU4MywKKzB4NEJBNzQ5OEEsIDB4N0NBRUE3RUIsIDB4QkE5NThFMzIsIDB4MzZDNTMwRkYsCisweDhGODhDQTk5LCAweEY5M0NBQkMyLCAweDhFNDdFRjExLCAweEZCMEVFRDZGLAorMHg1QjM2NjhBMSwgMHg5RDYzQURERSwgMHhBMEVFQUI4QywgMHgwODQ5MTVGMSwKKzB4RkFDQUFBMjcsIDB4MjA5NjM4RkUsIDB4MUNFRDlFRkYsIDB4RUVCRDIzMzUsCisweDM4QzZGNDI0LCAweDJEMUYzRDdFLCAweDk3NkU4MTA2LCAweEJFMDg3QUQyLAorMHgzMjE5NDg0NSwgMHg3NTYwNjZEQiwgMHhDNzBFMzE2NSwgMHhDNTY4RENCMSwKKzB4MzIxMkU0RTEsIDB4QjVEOTkxQUQsIDB4MDdDM0NFRjgsIDB4REI0QUJCMzgsCisweDE1NzRDMjMyLCAweEY4Qzc5MkJDLCAweDE0RTYyREJFLCAweDVBNDhFN0RDLAorMHhFRkRDNTQwNywgMHhDNDVCNDAxNywgMHgzQjgxNEU4OSwgMHhGMDkzNjQ2NiwKKzB4ODk0OTFCMkIsIDB4OUEzNTlBNDEsIDB4ODIyODc2NzUsIDB4QTBGMzM4RDMsCisweDUyM0ZERDNDLCAweDRFNDBCNzk1LCAweDQ1OEFEQUE0LCAweEVEODEyOTU3LAorMHg3QURDNzNCQywgMHg2RkQ3REI3OCwgMHgyNzQwRkMwNCwgMHg2MzkyQUVBMywKKzB4MTg1QUJDRUEsIDB4NkI1MEFCQzMsIDB4MzY4MUYwN0YsIDB4Qzg0MEY4Q0UsCisweDU3MzNFN0VDLCAweDA4MDVGQTcxLCAweDBCMzQ1MzBBLCAweDhDQjNEMDMzLAorMHg4MTQ1MTU1MSwgMHg1M0IwQjRFQywgMHg5MDg2NDZEMCwgMHgxMEEzRTY0MiwKKzB4RjM1OERDMzQsIDB4QzFGQTU3MEMsIDB4MkIxMjg0QjAsIDB4NTkyMzIyQkIsCisweDlENTg3NzgzLCAweEU3RDc3OTg4LCAweEUxQkU1RDdCLCAweDQ0QjkzRTIzLAorMHhGOEJFOTRBMiwgMHg1MDZEQzcyMywgMHg2RTBBN0QwOSwgMHgzRkIxMDQ2RiwKKzB4REIzQTE2NkYsIDB4OUNCN0Q2QTAsIDB4RTI3OERFNkQsIDB4ODg0NTkzMzQsCisweEI1MkJBM0M5LCAweDI4NDc0MEEyLCAweDA0RDMwNzkyLCAweDk0NEQ3OUNBLAorMHgxRDA1MEVBOSwgMHhBNDA0REIxQiwgMHg5OTUyNjAyMywgMHhCQUNFMjRFNywKKzB4QjlGMjA3MDQsIDB4Mjg0RTY0MzIsIDB4NDdBNTkzRDEsIDB4OTVGOERGQ0IsCisweDIyMEM5MTY3LCAweDhGQUFCQkJDLCAweDkzRDM0RThDLCAweENFMDc3MTM4LAorMHg0RkMxODA4MSwgMHhFNzZERDdFNSwgMHg2NzQ2NUY2QywgMHg3QTQ3OUQ3NywKKzB4NzRENjFGODIsIDB4MDA1NTkyMTQsIDB4MkY2NkU0MkUsIDB4ODc0MkE5NkIsCisweDYyMDYzOTUwLCAweEEyREJGQUU1LCAweDM2OEI5NjZGLCAweEFCNUZDQ0UxLAorMHhDQjQwMjNCMSwgMHgxRTdBRjU0MiwgMHgwNTk1M0UzMCwgMHg4Q0E1MUNGQywKKzB4MjIxNjU0N0QsIDB4MjlENTYyRDQsIDB4RTlDOUY4RUUsIDB4QTkwNTA1QzksCisweDA4OEQwRUVCLCAweEQ3QTI5MEZBLCAweDk1RTVCNTY3LCAweDUzRkFEM0MwLAorMHhCODlGQzYyNSwgMHg2OUE3NTE5QiwgMHgzNjg3QzdFRiwgMHg3MTg4Q0I1NSwKKzB4Q0U1REI5N0UsIDB4QTI2MDU3NEEsIDB4RDQ1M0QxNzMsIDB4MTQ1RDk3MEIsCisweDEyMTEyQ0M2LCAweDM5OTgzOUUwLCAweDI5QzU1QkVCLCAweEU0NjdDNzFGLAorMHgxMEIzQzlENCwgMHg4RjFDOTY2MiwgMHhGMjA3QTgyNiwgMHhFMDI0NTYwMCwKKzB4Njg4QjE4MTIsIDB4NUE0ODMwMzEsIDB4NzA0ODM4MEEsIDB4NzhFM0Q1QkIsCisweDE5NTE1MzNELCAweDhGQTVEOEUzLCAweEM1QkU1MDBELCAweDcxREI1QjJCLAorMHhBMTdBQTAwMCwgMHg0MDhDOUJFOCwgMHgxNjFFMTJGNSwgMHhCMUMzOEM0NSwKKzB4MjJBODhGMDUsIDB4REUzRjQ0MDUsIDB4NTA3OEFEQkIsIDB4Q0UxQkYxQTYsCisweEI3QTc1QjA0LCAweDZCODM2NEU4LCAweDBDRTMyRTNFLCAweDlCRjY1NTA0LAorMHgyOEMxODE1NywgMHg3ODM1OUFDNiwgMHg2MTdCRjIwMiwgMHgxRTc2RkEwOSwKKzB4MEY4RTYxQTgsIDB4NkQwMkYwRDUsIDB4ODAzNTY0NTksIDB4NzlDRUZBRTcsCisweDdEMDBGMTU1LCAweDVDMUMwMTI4LCAweEM3NUNBMDczLCAweDMyODE2MDkwLAorMHg5RkY3OERGQywgMHg4NDhEMjY5QywgMHhGODExQjMxNCwgMHhBODY5MjBGQywKKzB4NkY4ODVEMDEsIDB4QUNGRTY1MjUsIDB4QzcyNjA3NEQsIDB4RkVENjg1OTksCisweEYxRDVDNzZBLCAweDg3OTlFNUY1LCAweEY4NUY1MTcxLCAweEQ4REUyRDNCLAorMHhFN0REOEU3NSwgMHg0M0Y4NjE0QSwgMHgwNjg0RkM4RCwgMHg5NjgzQjhDOCwKKzB4NzRCRTc4NkIsIDB4MjUxNDc2MkQsIDB4N0Q4NjY2ODIsIDB4RTcxMUZFMUYsCisweDBERTlFMjczLCAweDEyRjUzMTY3LCAweDRGQTNBN0ZFLCAweDJBMDBFQjYxLAorMHhCMzk4NEEyOCwgMHg0MzE5RjJCMCwgMHg0MkJBMENBMiwgMHg4NDg3NzFCNiwKKzB4OTk1RTk0NUUsIDB4RDQxMTE1RjUsIDB4NDNEOTgzNEIsIDB4NTRFRURDMzYsCisweDVDM0M1NDA3LCAweDY3MUI1NDBFLCAweERDRjE4OTQ4LCAweDE1MEVEOTczLAorMHgyRDQ5MjJERSwgMHhGOTNDQTE3RCwgMHhCMjRBNzZFNSwgMHhEMUMwMUMyMiwKKzB4RjI5NjNERDYsIDB4M0I4NjAwNjYsIDB4MDhFRjBFQTQsIDB4NjA5QjYwQ0MsCisweEUyRTkwMUZBLCAweDI1QkU5QjkzLCAweERGOTZEOUJDLCAweDg2RDQxNURGLAorMHg3NUNDRjZCQiwgMHg4ODJENTRCMiwgMHg3OTc2RTlBRiwgMHg4OEEwQjE3OCwKKzB4NUFERTVBNTUsIDB4OEE4QzAxMTIsIDB4RDg5Njc1NUEsIDB4Q0I2Nzg5QjMsCisweDhCNjNBRTJGLCAweDI1NDUwMzZDLCAweEU0NjU1Qjk0LCAweDIwOTU5OTc3LAorMHgyOURGQjREMSwgMHhDREFBRUJGNCwgMHgxQzA3RUMwNSwgMHg1QTZGNjA3RCwKKzB4ODhBOUIzMUQsIDB4MTE4Qzc0RDIsIDB4MDAwQkIwNjUsIDB4NzVDNDY3MTIsCisweEVGMUE1OEJELCAweDUwRUNBMjYyLCAweENDRTM5M0I5LCAweDZFREI5MkU4LAorMHg3MDBFRjUxNywgMHhCRjZDRjRBRCwgMHg1NzQ1NkRDMCwgMHhGNjI5NTE3QywKKzB4NDAzMzFGOEIsIDB4QzEwQTQ1NEQsIDB4NkNDQjAyQ0YsIDB4OUJGMTFCMUMsCisweEUwODcxNDM3LCAweDIzNjIzNTg1LCAweEY1MTlGMDlDLCAweDREQjJBRkM4LAorMHg4OEZDQkQ3QiwgMHhCNTEyRkU4RCwgMHhERTQ0NTg5NCwgMHgwNzhBRDAzQywKKzB4NDQzNzVGQjAsIDB4MEJBQkVEQjEsIDB4NDBENUU4RTEsIDB4MTNGMjBBODYsCisweEYxNDA2MzAzLCAweDcyMDVDMzIyLCAweDNGQzQzNzc5LCAweDdBNjBENTEwLAorMHgxNDQ2OUUwNCwgMHhGNEU3Nzg3MywgMHgyRUFEN0VDRSwgMHhBMTM1RDZFQSwKKzB4M0Y0QzRCMzAsIDB4MjE0ODgwNzcsIDB4NjlGNjRGMUMsIDB4RUVGNDg3NkUsCisweDYzNjEwQzBCLCAweEI3QjI0QzVDLCAweDMyNEE3NkZFLCAweDBDRjY1MUQzLAorMHg5NDYwRjBCMSwgMHg4MUE4MzIzMCwgMHgwODM5Q0ZGOSwgMHg3MDcyMkYwNCwKKzB4QzI3OEZCM0IsIDB4NUREMUJEQTQsIDB4MUU0QjNEQkEsIDB4QUUxNjFBOTMsCisweDlFMTAzM0MzLCAweEQ5MzhGQ0VDLCAweERBMkIyRjkzLCAweDI4Q0Q4MkVBLAorMHgxNEFEMUZBRiwgMHhFNEVDOUNCOCwgMHhFNzcwQUZERiwgMHhFRkIxMjg5OCwKKzB4NTAwQkUxODEsIDB4NjAyNjI1QzUsIDB4RjE2MDYzMUIsIDB4NzhEMzY0M0YsCisweDRFMTNFRDM3LCAweDY0N0JCMjIzLCAweENGMThENzVDLCAweEY0NzdGOTRDLAorMHg3ODZFQ0I4OSwgMHhCM0VEMjFGOCwgMHgxQkVGMzkxNiwgMHgyNDBGQjM1QSwKKzB4NUM2OUI3RDksIDB4OEU5NjI5MEEsIDB4RDQwREM5OEMsIDB4RDEzNzAyOTEsCisweDU4NzAwMjFFLCAweDNGN0NGMjNGLCAweEZENEE2QURBLCAweDM2NDgyNDU3LAorMHg5MjY2MDBBRiwgMHhEQzg2MThCQywgMHg2N0QzNzc5RiwgMHgzNDIyODMwQywKKzB4ODdBNDFGQkEsIDB4Q0EwQUZGNTMsIDB4NjNCQzQ1RjMsIDB4NTIwQkJCQUUsCisweEVERTJFMDMxLCAweEI2RkE5NDUwLCAweDI1OENBNzEyLCAweEQ3MDlDNEU0LAorMHg2MTc3MDlCMiwgMHhBQUNFMEI0MSwgMHgzNjNEQkY1NSwgMHg3MDFENjU4MywKKzB4MzlGM0M4ODUsIDB4N0NENjI5N0IsIDB4MDc4RkUxM0IsIDB4QTM5OERBQkYsCisweERCOTdDNTE0LCAweDAzOTEwMkUzLCAweDVDQTU0NUFGLCAweDkyOThCQTE4LAorMHhEMThEQUY4NiwgMHgzRDcwRUVBMiwgMHg1MjY2QUQ2OCwgMHhCMDQ5NDVCNSwKKzB4NDAyRERBNUIsIDB4MDFEQzZDRDEsIDB4OTNBQzUwNTMsIDB4MDhERjlFQTksCisweDQ4NUVCRTk3LCAweEE1RDA1ODUzLCAweDZDQkVFOTEwLCAweEQ0ODVGNEUyLAorMHg4RjIwMUQwNywgMHhFRkMzODRBMywgMHg3MjcyQUZCRSwgMHhDMEI0MUZENywKKzB4OEU1NEE5NzEsIDB4QTdGOUUwRjcsIDB4QzIxNzAwQjQsIDB4QzI0QTRFRDAsCisweDU0MTlFQUNGLCAweEJDMkQ4RkIxLCAweDJDNUI1QUZGLCAweDAzNDUyNzRDLAorMHhDNDFERjQ3QSwgMHgzNzY1OEFGRiwgMHgyNENGM0JFNywgMHhBMzA4NjI0OCwKKzB4RjgyQjU5MjgsIDB4QjQ5QTlCMDQsIDB4RDQxMDVBRUYsIDB4NDQ0RUJFOEQsCisweDM0ODM2OERGLCAweERDNzdBN0EwLCAweDY4RDM3RTBELCAweEQyRUI1NEVFLAorMHhEREFDOEMzMywgMHhFNUM5M0M3OSwgMHhFNDcwNkFCRiwgMHgxNzUzNkVGRCwKKzB4NkMyQjJCMTYsIDB4MDM4QUE4MDYsIDB4REFENDI0NTgsIDB4QUUxRDc2QTEsCisweENDOERFOTVDLCAweDFCQTIwNjQ3LCAweDA1MjEwNjhDLCAweDMwNkZCRTQ0LAorMHg0RTI5RDg4MSwgMHhEMkExNEQ1MywgMHhBMTU1ODUzRSwgMHg0NDUwMENDNCwKKzB4RkM0NDY2QjcsIDB4NUFBQ0Q1MUQsIDB4NTA2RDNBNzMsIDB4M0Y2MUUwRkUsCisweDU4RjExRjlELCAweEM5MkEyQ0FELCAweEQ5QTRGODZCLCAweDFGQTc0N0IxLAorMHg3N0RFQzVEMiwgMHhERkFCMzY5QSwgMHhENDcxRUEwMSwgMHg3MjQ1MDJEQSwKKzB4NjE4Q0UyMUEsIDB4NTIzODhCRUIsIDB4MkU4QTRDQzUsIDB4NTgzMzIyMTEsCisweDNGQ0M0NkUxLCAweDUwMTIxMEUyLCAweEU5RDUxRDFBLCAweDM3MjM3QjU1LAorMHg4Q0UzRTJGMSwgMHg2QjJFOThDQywgMHhCNTZBMTFFNSwgMHg4ODE5MDM2QiwKKzB4QTZBQTJGMjcsIDB4QjAxMjRBMEUsIDB4OTJGMTczNjQsIDB4RDRBODkyMzgsCisweDA1MDdFMzM3LCAweDhFRDk1REVDLCAweDlDMDE0QkE4LCAweEJBNUIxMUM2LAorMHg5QzE1RDM4QywgMHg1MjU5NkM5OCwgMHg5MzMwREQzRCwgMHhENjE0NzU3MCwKKzB4MjE3MDFGMUIsIDB4NUEyMzg1RjEsIDB4RTJGMzhDNkMsIDB4QjNFOTQ2OTgsCisweDJGOUM2M0ZBLCAweDdFMDIzNEQ4LCAweDRDREQzMjg4LCAweEUxOTY5QjVGLAorMHg4NTNCM0MxRCwgMHhGNjE0NjVBNywgMHhGMjgxQzQxOSwgMHg0NkM1RjA3MiwKKzB4OUYxNzIyREQsIDB4NjRGMkE5OTQsIDB4ODZBRUU4QTgsIDB4NTU4OTVFMTcsCisweDYwNDdEMUFDLCAweDMzNzVBOTM0LCAweDMzNkJFQUNBLCAweDkwNzkxMTc0LAorMHg0REFDQzREMiwgMHgyNDI1Mzg2MCwgMHgyQTc4NzZGQiwgMHg5REJERjk4RCwKKzB4RDVCQ0UxODIsIDB4NjdFQjVGNzAsIDB4Q0MwNkJBMzgsIDB4RThGNzg3MTUsCisweEZFQjBFQjQ0LCAweEU5Nzc2RTAzLCAweDg5MkEwODk4LCAweDdBMDcwNjUwLAorMHg2RDA0RERDNCwgMHg5OUE1QjdFQSwgMHgzQjQxNkJCNiwgMHhEQURDRTgzNCwKKzB4QjNCMDMyNzgsIDB4REI3M0I3MEUsIDB4QjBGMDIyNEUsIDB4NTM4QTRBRjksCisweEQyNUQ2QTM3LCAweDhGNjI3RkIwLCAweDExRUQ5Mzg3LCAweEI4Qzg4NDU3LAorMHgwQ0YzMjBDQSwgMHhBMjBFNjJBMiwgMHgxREFDREQ0QSwgMHhBQjg0NTc1RCwKKzB4NzQwREFGNzUsIDB4QUI5REI5NTUsIDB4RkY3ODczMTQsIDB4QTY4MEI4RTMsCisweEM5NzZEMzhFLCAweDFGRDM4RjRELCAweDBBRUI2NjMzLCAweEI2OUEwM0RGLAorMHhCNkNBODYxMCwgMHgxMDYzNTRDMiwgMHhDMzdENDhDOCwgMHgzRTVFRUQ1NCwKKzB4NTM0Q0M5QkEsIDB4RTM3REZGQUQsIDB4OUY2OUVCMDUsIDB4RjY3MjE3RUUsCisweDUwMTgwQjNELCAweENDNjFDMTI3LCAweEMzNTk4RDczLCAweEU1QzAwRjAxLAorMHhGRkU5QjExMSwgMHg1RTIzRUEyRiwgMHhGNkM0NURDRSwgMHg0NDU4NUUzOSwKKzB4QjAyQzYwMDQsIDB4MzcyMzM5MDIsIDB4NEYzNzRDMEQsIDB4MzQyODg4OTgsCisweEUyNzQ5MzdELCAweEM4MUQ0NzJDLCAweDE3QTQzMTUxLCAweDI2MzhGN0QzLAorMHg1MzA0RTVCNSwgMHhENUNFNUVERSwgMHgzNTdGQTdCMywgMHhGQkUyNzk4NiwKKzB4NjRFNjVEMUYsIDB4QzI4RDEyMzcsIDB4QTczRDlBQjMsIDB4MTI0Q0E2QzgsCisweDc3MEQ3NDE1LCAweDU3ODhDMzJDLCAweDE4REVGQzAwLCAweEIzQjJCMDZBLAorMHg1NUNDODZBMCwgMHg4RDkyOTMwOSwgMHg4NEFCMzgxQSwgMHg5REVGRThERCwKKzB4MjZDNzQyQzgsIDB4OTUyQkFDMzQsIDB4MEEzQjE0MEYsIDB4ODJBOTMwNEIsCisweDUyQ0VDOUY0LCAweDQ3REY0RDA4LCAweDE1QTExNkQ4LCAweDdCODkwQjE4LAorMHhDODdCRUYxQSwgMHhCNTk2MDFCNiwgMHhEMzdCRkIyOCwgMHg1RDlGNTY0RCwKKzB4RkIwMDJGOEQsIDB4RTc2MDJFNTcsIDB4RTQyOUM4NTIsIDB4OUMwQThDNzUsCisweEUwMjYxMURDLCAweDhBMUM5ODYxLCAweDc0OTVENkRFLCAweENBMDU5NzEwLAorMHhBRTU5NjlCOCwgMHhFNUIyQ0JEQywgMHhBNDlGNkVDMSwgMHg4NUQyQTU1MywKKzB4RTQ3MTlCMEYsIDB4NDBGNjhCQkMsIDB4MDkyRTI0QjUsIDB4N0IxMzI2NzgsCisweEQ3MEMxN0UxLCAweDMwOUU2QUExLCAweEUwMDk2NTdGLCAweEE3MjM4QzdBLAorMHhFMDU3NUQ3OCwgMHgxRDY5ODBFNywgMHhFRkNERDM2OCwgMHgxOUYwOEQ5MywKKzB4RkFDMDNCODUsIDB4NTFCQURBOEYsIDB4MDM3REY4MzksIDB4OEY0RDI5RjQsCisweDFEQzhBOTEzLCAweDUwQzU1NDAyLCAweERFRTU3OEYwLCAweDJCQTFDMDkxLAorMHg5QUNBNTY3RSwgMHhBOEZGRUNGQSwgMHhBM0MwNUQxMiwgMHhGMThDNjI4MywKKzB4RUFBRTY2NjIsIDB4QjREQzZBNzksIDB4Q0VDNUU3ODIsIDB4OTNBMkUzODQsCisweDhGOEE1RTZGLCAweENBODM3OUQ1LCAweDgxQkNENDlFLCAweDVGQ0UxNzRCLAorMHhEMTU0M0E1QiwgMHg4NDVENjM1RiwgMHhENTMxMjVCOSwgMHgzQjIxMjFBRSwKKzB4RjhFQ0REMDEsIDB4Rjg0RDJEMTEsIDB4NjU3OUJDMjEsIDB4NUMyREMyMjAsCisweDlFQzFBNjg4LCAweDExNDhEODMxLCAweDZDMDg3Nzk5LCAweDU4OTQ0MzU3LAorMHg1NkY3OUZDNiwgMHg2QjY4OUI1NSwgMHg3NDBCNUZEMSwgMHg5RjdCRkI1RiwKKzB4NkIyRjNFMkQsIDB4MTBFMDkyNzMsIDB4MkU5RTMyMTMsIDB4RjM0MzZBQTAsCisweDE0QTlGNjgxLCAweDkwODdEM0NFLCAweDY4RDA0MzBCLCAweDlGQUZFM0VGLAorMHhENDVCOEM2MSwgMHhCOTgyNzI0QSwgMHgwNDQ0OEQ3RiwgMHg4NzEyRTQ3QSwKKzB4MkMxODhEMTUsIDB4OUMzRjA2Q0MsIDB4NjM0M0IxMzAsIDB4NTZDNjc2NUMsCisweEY2NTdCQzlBLCAweDE1RjFFOTczLCAweDQ3RTcxMTgxLCAweDg2MzlGNUQ3LAorMHhDMUYzRkRENSwgMHhEQzUyMjQ0MSwgMHg1NkJCMjkwOCwgMHhBQTQ4QUVDNiwKKzB4RUMwNDA4N0EsIDB4OEQzNzU4NzUsIDB4RTI5NDFGODgsIDB4RUQzMUNDNzIsCisweDA5QkQ4Nzk0LCAweDRDODFENUMxLCAweDFDQzk2RDlDLCAweDk4QTg5MDIyLAorMHhBQTM2MkM1NywgMHg5MjRENTgzRCwgMHgyNzA0MzBFNiwgMHgwRkQ0MDQwQSwKKzB4QUY1NjExNTUsIDB4MzhEQ0QxQ0YsIDB4RTg2MUQyQUMsIDB4MjRBMkVGM0MsCisweDJCN0UzODY4LCAweDEzREE2QzEyLCAweDY5MjAyRUI2LCAweDRBNUZFQzY2LAorMHgxODU0MTdBOSwgMHgzQzkyRUZGNCwgMHg5NDk4NDJFNiwgMHgwMjExNUQ5MywKKzB4QUQxNzI2RkYsIDB4NEUwOTNEN0QsIDB4QzNFNDFCOUMsIDB4MjdCQkMxQzEsCisweDRGRkE0OUM3LCAweDZDNjNEMjRDLCAweDg0MjU1NDQ0LCAweDI4MkMzQkEyLAorMHgzRDY3OUQ4NiwgMHgwM0I0MTBCMSwgMHg2NERCNDU0QywgMHg1MzU0OTlENCwKKzB4MjVCNDIxQTEsIDB4N0U2OEM4RkUsIDB4MDQ3N0UzQjksIDB4Q0VGQjA4N0QsCisweDlFNTlCODlDLCAweEJCNzg3NTU5LCAweDFBNTUwRUU0LCAweDA3OEI0OEFCLAorMHg3M0E4NjVGRSwgMHhENzIyNzQ3MSwgMHgzQTg2NDA0OSwgMHhFNUVFM0ExRCwKKzB4MjAxQkMxOUQsIDB4RUI4REFFMkMsIDB4MEUyQUIzMUQsIDB4Q0RBQzJENzksCisweERBQUIwOEIxLCAweDYzRUNENEYyLCAweEMwMEY5NzE2LCAweEQ0MTVDNkJCLAorMHg4QzIwQzM5RiwgMHhERUQ4RjVBMiwgMHgxRDZBNDE5MCwgMHgzRDMxOTE2NywKKzB4NTZCM0EyNkIsIDB4MDU0N0JGNTIsIDB4QTA1NjkyNEYsIDB4NERBQTUzOUEsCisweDU1NzI0MUQxLCAweDQyQzkxMjRFLCAweDE4NzIzMzIzLCAweDZBRDZFN0VDLAorMHg4RTAzOTMzNywgMHhGNkZEREQ2NSwgMHg1RjM1MjVGOSwgMHhDMEFEOTcwNCwKKzB4ODEwRUYwNDksIDB4Q0UwMjJFRTAsIDB4NDFDRTdFNTIsIDB4OEUxNzJBNDQsCisweDY0ODgwOEUyLCAweEM3RkY2ODk2LCAweDJBRDA5ODVDLCAweDMwNEI5NjMxLAorMHhEMjFFQTM5QiwgMHgyNzlGNTA4OSwgMHhDREI1QzM5MCwgMHgyMTcxNkE0MCwKKzB4NUUzNEIyNzgsIDB4Mzk0NzVENzIsIDB4QkE0RjREQjEsIDB4OEIyNTgxOEYsCisweEU2RTQ2NkY0LCAweEM0QTA5REY4LCAweDU5RjE4QUM3LCAweDg4N0FCNUZFLAorMHhFRUE0QkE0MiwgMHgxNzM3MURBOCwgMHhBODIxOTNEMSwgMHg2REMzMEVGNywKKzB4REVCOUQzNDksIDB4MkIzMjcxRDQsIDB4MUZFODM4MzYsIDB4RUM3NTVBMjksCisweDA1RjA3RkNELCAweEMzMzFEM0FFLCAweEM2MjA4Qjc2LCAweDQ5N0ZGMjgwLAorMHg0QzU3OUM1QSwgMHgyMkI3MUY5NCwgMHgzMEZENjIwQiwgMHgzMUI3MUFFMywKKzB4REY3RDFBNDEsIDB4RjA0MUFDQTUsIDB4OTUzMzI2MUIsIDB4MzI2MkQyOTEsCisweDA2MEU5NjcyLCAweDdEMTkxQTU1LCAweDZEMEYwOTQ1LCAweEY4Qzc3NzdDLAorMHgxQzE3MzgwOCwgMHg3ODMwOEU3NywgMHhDMUVFQUQzQiwgMHgwNTlDQ0Q5RCwKKzB4QThGREJFMTksIDB4RTQ3NjMwRkEsIDB4ODhBNDlERTUsIDB4MDMzNDdEQUIsCisweDRGMzFGOTY5LCAweEY5QzYyQjEyLCAweDkzQUIxMjZGLCAweDhBN0EzQkZCLAorMHg4MjU5MTU0NSwgMHgyQTFBMjEzMSwgMHgxREVCQjEzNCwgMHg0NDlFMjhERCwKKzB4RkE3RTAyNDgsIDB4QzFFM0E1QkMsIDB4MTc0N0UwOTcsIDB4NEM2OUFBNUMsCisweDFGRDcxQjRCLCAweEFDNjRDQTZDLCAweDU1NDVGOUY5LCAweDVFNTg4NkYyLAorMHgyNDNEQkE2QywgMHg0OTVCRTE2MywgMHg0RUNGNUE2QywgMHg0MzBDOTAxOSwKKzB4ODlBOTgwRkEsIDB4NTI4OTQ1QUUsIDB4MDBDRTY5MzYsIDB4OUY5QTczQjIsCisweDlFNTlEQzZCLCAweEQ1Nzc0MENELCAweDBFMENCNzM1LCAweEIxMjAyQkUzLAorMHhBQTI2QzJBOSwgMHgyNjdBNzdBNiwgMHgzRkExMkNGMCwgMHg0NTg3QzBBRiwKKzB4MzU0RUQ4MzEsIDB4RkZEOEJEOEUsIDB4NTZDQzBGMjYsIDB4NzU3MTdBRTMsCisweDUxQjEwNjc0LCAweDNFMzNFQzI2LCAweDI2Q0U4MERCLCAweDVDNEE5MTQwLAorMHgwMTdGNkMyRiwgMHhGOTAzOEQ5QSwgMHgwQTIyQzI5RiwgMHhCQTFGN0M4RCwKKzB4MTI1Q0M5MzQsIDB4NkNGNjZCRkYsIDB4NDhDMTNEQ0QsIDB4NjNGQzNEODEsCisweDI1OEMxODFELCAweDFBNEMzRERELCAweDJFMjRCRUNDLCAweDdDODZBOUVELAorMHg1QkQxOTg5QywgMHg1N0NFNTk1QywgMHhERjI5MUFGRSwgMHhFQUYwMDg4NywKKzB4RDhERDQyNTksIDB4REY2NzMzMUUsIDB4NTBEMENFODgsIDB4MUZEMDkwQUUsCisweDYzMkRBNUYwLCAweDk1MjcyQTVCLCAweDMxMTcyRjI1LCAweDU0N0ZEN0RGLAorMHhBRkJFMTFEOSwgMHg5NzE4OURGQywgMHhDNDg4MTE5MSwgMHgxQzkyMzY1RCwKKzB4ODQzREVGREUsIDB4Q0YwQTM5OUIsIDB4Q0YzMjdDQUYsIDB4RERBRjBCQ0UsCisweDAzQUE3QTJFLCAweDQxMUE4NjY0LCAweDZDQ0Y3Q0Q5LCAweDYxMDk3RUY1LAorMHgwN0YzOTQxRSwgMHg1QkMzRUI3NSwgMHgyNzkxOTQ1RiwgMHhCRUJCNTI2RSwKKzB4MTg2MzFBMzQsIDB4MjVGRUJGMTAsIDB4NDE5ODM0Q0YsIDB4RjY0MkQxNzYsCisweDM3MkZGRjEwLCAweDJBMUJFQTFCLCAweDQwMEZGMzQ1LCAweDI1N0EyMzRBLAorMHg5RjE1RTk5RCwgMHhFMDZBQTFEQiwgMHgzQTBEQjMxNSwgMHgyQkEzMEQ5OSwKKzB4MEU5RTgzMUUsIDB4MUIyNUVFNDEsIDB4OERCMzBFNzAsIDB4OUZCQTZENjQsCisweEFCOEFBNUUzLCAweDVBOTYxNzdBLCAweDZCRTAzNTM1LCAweDk3RTM3RENFLAorMHhBQ0EyNEYyNiwgMHg1RjAwOTZGNywgMHg1RDAyNzIyRiwgMHhBRjhGM0VDNywKKzB4QTY4MjQxNTEsIDB4NzBGQUQ0MDYsIDB4REVCQTg1MTMsIDB4OTlDNjNFMzQsCisweDFDQzRBM0RGLCAweDdGNzU2NTA4LCAweEI3Mzg2NTI3LCAweDY0N0M3RkI4LAorMHg0M0YxRjRERiwgMHhDN0U0RUMxOCwgMHgzMDJCQTEwOSwgMHhENUU5MTc1QiwKKzB4ODI4NTZGNzcsIDB4MEY2RDQ1RDksIDB4OTVBRTI4QjksIDB4RTYzMzg1QzMsCisweDhGQjI2NjE5LCAweEJEOTlGMjk4LCAweEM4ODRCOTQ4LCAweDBCNTk2RkYxLAorMHhFMDYxQzNGOSwgMHhCQzJGOUE4MSwgMHhDNDg4Q0Q5MSwgMHgzNzJFRjU5MCwKKzB4M0RBMUJGRTUsIDB4MTBERTAzN0IsIDB4NzIxMEI0REMsIDB4NzRFNEVGRjgsCisweDYzNjVBRkQyLCAweDhDRUFCQzg1LCAweDFEOEZGRDQzLCAweDRERTI0M0Y4LAorMHhFQzk3NkZEOSwgMHhBRDgyNzc2NSwgMHhDNjc5RjE1RCwgMHhDMTI1RUMzMSwKKzB4OTVEMzQ4MUMsIDB4QzRFQTZFQUMsIDB4QzhGQzAxNEYsIDB4MTM1MkVCNjYsCisweDlDNDAwRUI1LCAweDIyN0JGQUI5LCAweEIxMkJGOTU4LCAweDg1QjZENzgyLAorMHg3OEI2RTQ0RCwgMHhFMjIzMkVFRSwgMHg0RjEwMTcxMSwgMHg5QUJFQkY2OSwKKzB4NjZBQ0M2ODIsIDB4MDRBRDVGNTUsIDB4RTRGQzYyMzgsIDB4QkEzRDIyNjYsCisweEEyQkEzMTcwLCAweDA4M0YzOUFCLCAweEZGMjA3NUM0LCAweDk0NUM0QjA1LAorMHg0MUU4QzExMywgMHhFQzdDQUQ2NywgMHgzNjUzNzMzRSwgMHgwMzUxMEMzQiwKKzB4MUU5NzMxNTgsIDB4RkJFNTA3RjMsIDB4MkNDRDhEOUEsIDB4NkVBOTQ0MkYsCisweDBENDhERTk1LCAweEM1MTdCRkFFLCAweDA0RUJCNUM5LCAweEVGQUIxODIzLAorMHhENUZCRkMwQSwgMHg2ODkwRjIxMiwgMHhBMUMwMENDRCwgMHg2REQ1NjFFNiwKKzB4MjBEMzlCMUMsIDB4NTYxMTNGQkEsIDB4Q0YzQTdGRDcsIDB4M0FCNUEwREIsCisweDM2NTY1NzJFLCAweDdCQzQ4Q0QzLCAweDg5MDJBRTM2LCAweEQzRTk0QUZGLAorMHhDMDZFQjQ0NywgMHhDQzUxM0MwQywgMHgyNTQ0QjdERCwgMHg2RjE2ODg3NywKKzB4NTMxNjI2MDcsIDB4NDYxRENFRjAsIDB4RjQ3QUYyQkIsIDB4OEFGOUYzQ0MsCisweDFFRUZGOUU2LCAweDU3Q0ZCNkI2LCAweDdGNzEyNDM5LCAweEFCMjBDOTNELAorMHgwNDNGOTAwMywgMHg2MEM4MDhCQywgMHg4NkMyMTM3QywgMHg0NkFEQjQ3NCwKKzB4ODQ4QjY1RjIsIDB4NTU0NDc4OUIsIDB4MThFOUFFQzcsIDB4Qzg4OTkxM0UsCisweEZFQjc5QjJGLCAweEEzRkJFNTE4LCAweDY3OTIyNDYzLCAweDkzNzQ2Mzk4LAorMHg5NjhFMTYwRiwgMHg4Q0E4NTZBNCwgMHhBMDQwMjAyRSwgMHg2NjBDMDBDNiwKKzB4OEYwQThFNjIsIDB4RTJCQTU0REUsIDB4NEJEMEMxMTcsIDB4MUExQTMwOTIsCisweDA4NkNBQTNBLCAweDJCQkE1Njc2LCAweDg5NjEwMTc2LCAweDAwRUQyRjk3LAorMHhDNzIxMzBDNywgMHg1QTA1Mzg4MCwgMHg3Mjk4RTU1MywgMHhENjc5NzFFQSwKKzB4MEQ0MUU0NzcsIDB4MkZBODI4NUYsIDB4Qjg1NkExOTAsIDB4MTMyREI5MTYsCisweENERkZERDExLCAweEI1NTE5QTgxLCAweDFCQzcwMDFCLCAweDk3QzgyNERDLAorMHhCQjRDNzA3RiwgMHg5MDE2NkRDMiwgMHg0MkRGQUI3QSwgMHg5MEUzMzE4NCwKKzB4NkM2Qjk0MEMsIDB4REM1NTM4MTQsIDB4QzRGNUU3QUEsIDB4OTk0MzRBRTksCisweDgyQkIwOUQ0LCAweENCMEE3REEzLCAweDNBODAzM0FFLCAweDA1NEQzNDgxLAorMHhFMjBBRjc2MSwgMHgyNUY1RjI1NCwgMHg3QUQzQUYzQSwgMHgyM0EzNEMyOSwKKzB4QTE5QzU3QkMsIDB4MzlCNTdBRDksIDB4NTVFMUVDNTksIDB4NUVDQTQxOTgsCisweERCOTA4QkNELCAweDQ4NzFDM0Y0LCAweEU3MDkxMzI4LCAweDY0QTlCNkVDLAorMHgxQ0NBQjJGMywgMHhFREIyMjQyMywgMHhGRkI2QTcxNywgMHg2RkExMzU0OCwKKzB4MzYxRkY3MTEsIDB4MjQ2NjQwMTcsIDB4Q0JCRjk5NzAsIDB4ODNBN0I3REUsCisweDlCNzA0NjkwLCAweDAxQTBCODc3LCAweDk1MDQxQjYwLCAweEMwNDhGM0UxLAorMHhBMzE2MjVGMiwgMHhFM0RGQkUyNywgMHhGNjU3Mjk1QiwgMHgxRjVDM0FGNSwKKzB4NjBFRTE2MzcsIDB4NTc1RURGQUMsIDB4NzI1ODQ0RkIsIDB4MjQyNzIzRDAsCisweDA0RkE0NkZDLCAweDFBOEMzRjQ0LCAweDBFMDNBNUZFLCAweDg3NzgwNzlGLAorMHg2MDZFNEUxQSwgMHg3QzBBRjNENSwgMHg5NTc4QjI2NiwgMHg2M0JDRTc2NSwKKzB4QThFRDY2RDksIDB4OTI0MjM3N0EsIDB4ODE3QTVENUUsIDB4RDA5ODFBOTgsCisweEMwN0YyRTdGLCAweDBFNjZGODRBLCAweDM2MzVGODU0LCAweEQ3QUQ4MzU5LAorMHhEQ0YyMzIzMCwgMHhDMUI5MDg0QywgMHhBNzk4N0ZFNSwgMHhDM0IyN0VCNCwKKzB4MUY3NDcwNjEsIDB4RkQyNzg2MDEsIDB4QjZFRDNCNUEsIDB4OUNFRjhBQTAsCisweEE1MDIzQzQ2LCAweEI0OTgzMkFGLCAweEIxMjA1NUZELCAweEQ4NTMxMEUxLAorMHgyQzE5QURFNiwgMHhFRkJCMTdBOCwgMHhDMjQ2QTRDNywgMHhCRTRCMjY2NiwKKzB4MTNDMkQ3RjksIDB4NTAwNjNCQTEsIDB4OUIwMEUwMkQsIDB4MzM1QjlERjgsCisweEQ0MjRBRjI1LCAweEJBRTQwQzkyLCAweEU4N0JENkI3LCAweDM4NEQxRUIxLAorMHg4QjkxRThGNCwgMHg5RTNGQzZENSwgMHg2QkIxQTUxRSwgMHgyMUFFNTUzMywKKzB4RkNCOEU3MTMsIDB4MTg4QjY2QjEsIDB4NjU3MkU5RUQsIDB4OTg4MjkxNzgsCisweDdCQUU4Q0JGLCAweEUwMEMzMkI0LCAweERBRkMxNEQ1LCAweEVBOEZDNzQ2LAorMHgyQzhENzEyRSwgMHg4OUEwNUZDOSwgMHg5QTI3NDY0MSwgMHhBQzI0NTBBRCwKKzB4MjQzNzc4NEYsIDB4M0IxQjgwRjAsIDB4MEI0QTMxRkQsIDB4Mjc3QzAyMzIsCisweEZEREM2ODI5LCAweDNGM0M2MDZDLCAweDBFRjYyMzUyLCAweDNEMDdEMDRBLAorMHg0RTA5MzlFOCwgMHhENTlCRjExNSwgMHhBMDI3NTJFNywgMHg0MkJGNzEzMywKKzB4OUZBMDkzOUUsIDB4NjQ3NjQxMDksIDB4RDVEMDNFQkEsIDB4M0Q0NDMzQTMsCisweDE3NDlCNDM3LCAweDEzNzI5OEIxLCAweDY3N0JFMzQ0LCAweEE4M0NFRjdFLAorMHgxNzgxM0EzOSwgMHhCQzcxODIzRiwgMHgyMDcwRTlBNywgMHgzODczQUVGOCwKKzB4NUFGMUUyMUIsIDB4MUYwQ0M2OTIsIDB4QjhFRkIwNEQsIDB4MUExQ0M1MTQsCisweEFERUQ2QzNELCAweERGMzVBOEQ3LCAweDZEOTMyNzVFLCAweDlDMzYyNTQ1LAorMHg2MkJGNzU4MywgMHhGQzU2RDk5MCwgMHgwQ0Q2QTMyNCwgMHhGMTJBNzkzOSwKKzB4NTI1ODcwMjksIDB4RDAwRDVGMTYsIDB4NTE2MjI1NTUsIDB4MTE3OEU4ODcsCisweDgxRTdCQ0M4LCAweDkyQkIxQzExLCAweDA5NzMzMEU0LCAweENGOEM1Q0FGLAorMHhEMDc2RDZCQywgMHhCQTI5MjkxOCwgMHhGODM1QTgyOSwgMHg0MjgwQTUxRSwKKzB4MDlDRDc4MjcsIDB4MTE1ODM0ODcsIDB4QjhCQTJDRUYsIDB4RDU5OEFFOTMsCisweDk5RjRGRDc3LCAweEVCMTUxMTEwLCAweDE1NzFCMDc2LCAweDYzRjIxMDNBLAorMHg1NkM2QkY0NCwgMHg5RTYzQjU1NiwgMHhGQjk4MTIzOCwgMHg1RDhDOTc4QiwKKzB4OTUwMUQ5MzYsIDB4ODJBMUU5NzEsIDB4RTVBNEY3RTIsIDB4QzZFMzcyN0EsCisweDAzMzI5RjA3LCAweDI0OEFDREQ2LCAweDQzN0U5MTdCLCAweDIzQjAyQjIwLAorMHg3M0Y3NkFBMCwgMHg3NUVBMDZDNSwgMHhEN0M2NjJCMywgMHgyNjc3NzdGOCwKKzB4REM5NkJGMDYsIDB4NTQwMjAzNDYsIDB4Q0JERjA2OUIsIDB4MDMwMTMzRUMsCisweEE3RUYxQzJFLCAweDU2ODk1OUFCLCAweDRGQzMxREUwLCAweDNBMjI4OTBFLAorMHgyODBGODY1MiwgMHgxQkQ4Q0IyNCwgMHg5QThEOTJDOSwgMHg1MjcxOERFMSwKKzB4MTIwMzNGQzcsIDB4RDQ4NDkwQ0MsIDB4NjgxQURFRTIsIDB4RjkxQkY3QjgsCisweEI4NjA5QjM4LCAweDM0Q0Y0QkNBLCAweDhGMTIzMjkwLCAweDBEMEY0RkNELAorMHhDNEY0MzMyMywgMHgyRkMwNEYxQywgMHg0NjY5Qjg5MCwgMHgxRThEMkE3RiwKKzB4MDY1OENBRTYsIDB4NTQ4OUYzQTMsIDB4OUNEMzYyRkUsIDB4QkE1MTkwQjEsCisweDA2QTU4ODIwLCAweDdBOUFGNzU5LCAweERDOTRFNjcyLCAweEVCMjg0Qjg1LAorMHhGOEVGQTAyMiwgMHgzODM3QzM3OSwgMHg3QzlFOUEyQSwgMHhEMkVEOTZCQywKKzB4NUQxRTRDN0UsIDB4OTdGMjE2OUYsIDB4RkMzQzM3QzIsIDB4RTAzOUVERjEsCisweERCRTkzOTA5LCAweDgxRkVBQzZCLCAweEZDRDM4M0ZDLCAweDE3MEI5MUZCLAorMHgwNUJBMzI0MywgMHg4RkIyQURFMSwgMHg1MkFGQjk4NCwgMHhFODI2MkU5QSwKKzB4MUU3MDQ2MzgsIDB4ODlCOERGRDgsIDB4MThDMEM2NDEsIDB4Mjc2MEM3RTYsCisweEQzQUZGM0M5LCAweEM0RTM1NDNCLCAweDBDMEI3OTEwLCAweDFERUY3NzkyLAorMHg0ODNENzE5NCwgMHg5QUFGNTg2NCwgMHgwODYwNzk0NywgMHg2MjZGMENGMywKKzB4QzBGNkE0ODYsIDB4RUI0NTI1Q0UsIDB4QThCQkE4RjgsIDB4RTQ1MERBMTQsCisweDJEQzREMTE0LCAweEJDQTUyN0M5LCAweDY2ODJBQTRELCAweENCQjQ4QTVGLAorMHgxQjQ3NEM5OSwgMHg3RjVCNTI2QywgMHhFQzQzNUMwQywgMHg5RThEM0UxQSwKKzB4NjdEMkVBMjksIDB4QTNCN0FEQ0QsIDB4ODMyODU5MEUsIDB4NzM0NTYwN0IsCisweEI2MDU3NTg4LCAweDFBOEIwMzRDLCAweDVDOENBNTM0LCAweDgxMTVEQzVGLAorMHgxODlDMkFCRSwgMHhGMUI5MjkyNywgMHg3OEEzQjYyRiwgMHg0QjYyMUQ0OSwKKzB4REMxNzZBNjgsIDB4Q0JEM0MxREMsIDB4RDgyMzQ4QkIsIDB4RUVGMDVGQTcsCisweEMwREQzRDgzLCAweEMxRjJBN0JGLCAweEIyMDc5RDAwLCAweDE0QjU3MzBFLAorMHg3MzIwM0NENywgMHhBODY3MjQzMywgMHhBMTcxRkZFRCwgMHg5RjE4MTIwMCwKKzB4NEUxNkE1QzgsIDB4NTZEOEFDMzEsIDB4NzM4MDNEODYsIDB4RDQ2ODVDQTQsCisweEU4REU5RkUyLCAweEEzNUQyQ0U4LCAweDgwOENGM0UyLCAweDE5ODcwMEFFLAorMHgwMDM0MTYzRiwgMHg1N0JDNzZGRSwgMHgyNzFBQ0Y5MywgMHhBQTNBRjZEMCwKKzB4MzcwMDNBN0UsIDB4NDUwQjc0RjQsIDB4MTU3NDAxQ0IsIDB4Qjc5REREQTgsCisweEQ2MEFCN0E0LCAweDNBNEM4Nzc5LCAweEI2OTkwRkM4LCAweEExNjY4RDVBLAorMHgwNUI3OTY1RiwgMHg3ODE0Mzc2RCwgMHhGQTBEMkQ4QSwgMHhEOTdBMTE0MiwKKzB4RTgwNERFM0QsIDB4NDkzOTA4OUUsIDB4NzhENDBDQUMsIDB4MDFERUY1RUEsCisweDNERDFDQURBLCAweDk2NDY1OTU2LCAweDYzNThDRkI2LCAweEFDRTAyREU1LAorMHhCNEM5RjZDRSwgMHhFOUM5NUFGRiwgMHg3MEVBRDI4RSwgMHg1ODgwMzY5MywKKzB4ODlFRjk5NzIsIDB4NThGMDI3M0YsIDB4REIxN0EyNzcsIDB4MEIwODJCOTgsCisweEFBQjEzQUJELCAweEU4NjM4MUVDLCAweEMxODkyNEQ0LCAweEUyOEQ0MzQ4LAorMHhDMjE4OTVBQiwgMHhFMTcwNzNBRCwgMHg5NDE3NTM5QiwgMHhBMDQzRTVGNSwKKzB4ODhGRkQwMjYsIDB4RDk3MkYwMTcsIDB4RDBDOEI4RDMsIDB4QjM0RjNENjcsCisweEM1MjVFNEI1LCAweDAxODlBNUExLCAweDU5MjI0QTM1LCAweEFBMThGMkQ1LAorMHhGQzlFMTcwQywgMHgxNkQzNzk1QSwgMHgzNURCMDlGQSwgMHgxNjI0REIxRCwKKzB4NEE2RTA1OUYsIDB4QzVDODhBOTMsIDB4OTA1MUQzNzMsIDB4NEIxMkIwOUMsCisweDQwODhBRjM5LCAweDcwNTM5NEY2LCAweDM2MEYyQkFDLCAweDhBMUYyNDIwLAorMHg2NDFENEZBNSwgMHhBNzhCNzhGOSwgMHhBNUE1MzAyRSwgMHg2OTFEMjEwOCwKKzB4N0NGQjU3RkQsIDB4MTgxMkZFNjgsIDB4OEEyQkI1RTAsIDB4RjE4MUNBMTQsCisweDE4NDY4NDhFLCAweERDMDQ0RjY3LCAweDE3RkNDQTI4LCAweDIxRDdDNUFDLAorMHg0QzQzNDMyRiwgMHhDNDU3RTI2RSwgMHhCMEM5QUREMiwgMHg3OTFFRTJCNCwKKzB4NjIwRjI3QkUsIDB4MjI5RTBCMUUsIDB4NzQ2QjRGRkMsIDB4MDIwMzg3MzgsCisweDFDN0I5NzFCLCAweDA1MTkzNDMwLCAweDg2NDVEQkQ3LCAweDU4Njc4Rjk4LAorMHgxNDFFOTEyRCwgMHhEODlDNTg3RSwgMHg5RkQ3QjQzRiwgMHgyMTg1MUQ1NiwKKzB4NzI1MzExQTcsIDB4MDYwNUIxQjIsIDB4QzE4QkYyQjcsIDB4QzZGNzlFQTksCisweEJEODRBMDFCLCAweEM5QjdGMkRBLCAweDA0RTQ3RUU4LCAweDFDMUExNEY1LAorMHhCRDVCNEZGMSwgMHhFMTVGQkMyRSwgMHhDNEQ0M0YwMSwgMHg1RDM5QUQ0QSwKKzB4QkQzQkQ5ODMsIDB4QjIzMTRBNEIsIDB4OERBQkE2N0UsIDB4QjUyNjNCNUEsCisweDk5MTJGMjYyLCAweDgyNjU5QzgwLCAweEMzNjEwMTgxLCAweDNGMjI5MDE0LAorMHgyNjg1NTMyRiwgMHhDRTRFQzIxMCwgMHhGNDZBQjA5QSwgMHhGQUZBNjlDOCwKKzB4RDEyOTI5NDQsIDB4MkVGODgwRDksIDB4RDAzQUFFQUIsIDB4MEU4M0M0MzUsCisweDg0MkM0ODJDLCAweEE3MDk1MUExLCAweDBFNEVBMDdELCAweEUwMzMyRDBDLAorMHgzRUEyN0U1NSwgMHgwNDcyMTQyNSwgMHg3QzhCNTZEQywgMHg5NjM5MTMxMiwKKzB4RjYwMEQ3OEMsIDB4Qzg1MDUxN0MsIDB4QjNGOUYyQUUsIDB4NTlBOTkzNTEsCisweDhENkFBODM4LCAweEY1ODY2NzJFLCAweEQ4MUZFNTI1LCAweDNDRUYzMURGLAorMHhBQkRDNzA3OSwgMHg2RTFCQjhGNiwgMHg2QjQ1Qjg3QiwgMHg5RkQyQ0FDNCwKKzB4NjQ4RTM1N0EsIDB4NkM1N0QzMEIsIDB4MjM3NjZCNjQsIDB4OEM4QkQ5QzEsCisweDlBMjkwMDFBLCAweDIwNkY0N0UzLCAweDVGNDIzRDc1LCAweDI5M0EzMkM0LAorMHhEQ0M2NDMyQiwgMHhBNDI4MDk1NCwgMHg0NTc3OTBCOCwgMHgxMUU4NENFRiwKKzB4QUIxMUQwQkYsIDB4RDA0MjU4RTMsIDB4RkI0NEMwQ0UsIDB4RUQ4MjMxQjIsCisweDAyNzdBNkIyLCAweEQ4RTVDNTE3LCAweENFREY0QzhCLCAweDE5RDkwMTcwLAorMHgyMDU1NTUzMiwgMHhGQ0I2MTBCOSwgMHg4OEQ1RjVBOSwgMHhEMzVEQzc3RSwKKzB4RUY1RUE2ODYsIDB4RDg2Njk1OUMsIDB4RjA4ODZCNTYsIDB4MDA1Q0ZCOTAsCisweDU4MkFEMjU1LCAweDczODEyODlGLCAweEMxOENFRDRELCAweDQ0NEYwQTZCLAorMHg5OTE3QUU1NiwgMHg1MDVBN0JDRCwgMHhDQkRDOTAzQiwgMHg1MUVGMEYzQywKKzB4QzRFNkFGNUEsIDB4QjE0OEFEMkYsIDB4NjA5QTEyNEEsIDB4QjVEQTg5RTQsCisweDNBNjhDN0Q0LCAweDk4Njk0RjAyLCAweEU4NUIxNzY2LCAweDc1NEJBNUZGLAorMHgxMjk2QTU4RSwgMHgyNzczNjg0MywgMHg5QjYyODBCRCwgMHgyNjg2MDMyRCwKKzB4QjQyOEFDMDQsIDB4QjA2REJBNUMsIDB4NjI1RkUwMzQsIDB4RDRCQ0IyNUUsCisweEM5MUM1QjNDLCAweDczQkI3MEU1LCAweEEyNkE0NzlBLCAweDczMTczMjI5LAorMHgzQUExMjM1QywgMHhFMTYxNzFEMSwgMHg0MkQwRDQyRiwgMHhGQzYyNDc1MiwKKzB4RjFGNURDQzIsIDB4MUI2RjIwQTksIDB4RkY5RDYyNkQsIDB4REJGMDUyQzAsCisweDkwRTM4RDIzLCAweEZCNzJDQzVFLCAweDkxODY1MTlDLCAweEYyMzMwMDkzLAorMHhFNTI1MTM4NSwgMHhBMDA5NDk3NywgMHhFODNGQTA2NiwgMHgyRTM4OUNFMiwKKzB4RDNBNjJFNzIsIDB4QTk0MjJBOEIsIDB4QzYxQ0ZENUIsIDB4MUIzQTUxNkEsCisweDU4MDg3ODAwLCAweDNBNDc0NjJDLCAweDU1N0RERDhCLCAweDk0RkQyMUQ0LAorMHhFMUFFQTk0MiwgMHg0QjJDQzUzMiwgMHhCMjE4NUIzNiwgMHhEQ0ExNTI1OSwKKzB4MUQwNDREN0QsIDB4NzgxMzE3QjgsIDB4NDlDQjEzRTcsIDB4REFBRkZCQzYsCisweDMwQTA1NjQ0LCAweDc3QjA1RjM3LCAweDA2NUE1NjdDLCAweDk0NzIxQzc5LAorMHg0NzMxNkM2MCwgMHg1OEFBQzdDOSwgMHg0MTAwODFBQiwgMHg3RDRBMzZGQSwKKzB4Q0RGMjM0NTUsIDB4MTg3M0VGODcsIDB4MTg2OTgyQjUsIDB4N0M3OEQ5REEsCisweDM1NjdEOTY2LCAweDEwRkY1RThFLCAweERCODhFNUIzLCAweEZGMUQzOUExLAorMHhCOEEzNDVBMywgMHg3QTcyNThGMywgMHg5NzA2QjNDRSwgMHhCNUFEQ0MyNiwKKzB4NDU2MUVGNUIsIDB4QjAwMkZCRjYsIDB4RjNGNEM2RkEsIDB4NTdFQzc1QUQsCisweEJDRjM3OTI0LCAweEJDMDVCMEFELCAweDJBQjE5REFBLCAweDBFQkQyNUVBLAorMHhGMzM1RDA4QywgMHhERkY3OUUxOSwgMHhERDg2RDQxOCwgMHhFQ0UxMTk1MSwKKzB4QzA2RjRENTAsIDB4RkQ2OThERjgsIDB4QkE2MTkyRUYsIDB4MzY1QTI4Q0UsCisweDc0REVDMEI3LCAweEU5NzFGNjdCLCAweEJGODlERDQyLCAweDFFNjgzMzk5LAorMHgxNjRBNzE1OCwgMHhBMUU0ODQ3NSwgMHhCRTEzOUU4RSwgMHhCREVCQTdGRSwKKzB4NzRFMDNBRUMsIDB4ODhFQTk2MTgsIDB4OUIwMDQ4QzIsIDB4NjhDMUREMjAsCisweDhEQzlGQzg1LCAweDI0QjU1RTNCLCAweDUxQzM4QkRBLCAweDJFQ0Q3QjEzLAorMHg1NEQ2NkM4OSwgMHg2OUEzRUJDMSwgMHg0QjRFNEYxMywgMHhBRDM3QjdERiwKKzB4MDMwQTFEOEIsIDB4ODVBMTE0RDksIDB4NDAzQkU0OTUsIDB4QjVFNDAzMzEsCisweDMxNkU3MzEwLCAweEIzNkFBNDk0LCAweERCRkZDQjlBLCAweDVDMEU1REE1LAorMHgwOTlCQTlFOCwgMHg2NjgyNkU5RCwgMHgwQkM1ODQ5QiwgMHgxQTIwQ0JBQiwKKzB4MDc0NEZCRTYsIDB4MkNCNTIwNDAsIDB4OEI4ODUzM0YsIDB4QThBNDRCRjEsCisweDYyRkVCNEE4LCAweERCMkFCQzRELCAweDQ2RjBCNjc2LCAweENCRDA2NDcwLAorMHhEQjZENzFFRiwgMHg1REMzNTUxQSwgMHg3MUIzMUE1QiwgMHgwNDZENEM3RiwKKzB4QzA1MUE5OTgsIDB4MUVDMTlGRjksIDB4QTlFMjFGOUYsIDB4Nzk1MUUwODEsCisweDc4QkNCQTYyLCAweDkxQjYyM0YyLCAweDhFRjZBODFELCAweDEwMjM3NTVFLAorMHhDRTQ3RjVBQSwgMHgwRUYyNzUyNywgMHhFOUU0ODhENSwgMHhENTNFNEEyOSwKKzB4NzhBMjc2RTEsIDB4QjIxMDA1ODUsIDB4MDEyMDhFM0MsIDB4QTM4QkNBRkYsCisweDM2MjIxRkI3LCAweEIzQzkxOTRFLCAweDUxQkQ3NUQ0LCAweDlDOEM3M0FDLAorMHg3QUNBOTk2NCwgMHgxNzg5MEM5NCwgMHg5RkRBNTFGNCwgMHhDNEZERjY4OCwKKzB4MkM4MjQ0QjIsIDB4MEQ4MzRDNzQsIDB4MjkwOTczRDMsIDB4N0YxMzQ1NTMsCisweDI5NkQyRkMyLCAweDRFMDhFRDI3LCAweDFDNTFFNTNELCAweDNEODkyRjQ5LAorMHg5NDVGNzZDQywgMHgyRTUzMUU2MywgMHg3MUVFMzdFMCwgMHg5QzQ3RjM0NiwKKzB4MkQ4RDkyMEMsIDB4QzNFNDY1QkEsIDB4M0E3MkQxNDIsIDB4NUI2QUI4MEQsCisweDM2NEMyQUU3LCAweDNCMTgzODlCLCAweEI5NDQyNDg0LCAweDVENjg3QkI1LAorMHg5N0M2NUE0RiwgMHhDN0RCRThCRSwgMHgwRjg0MDA2MSwgMHg1QTczRUE4OSwKKzB4Q0JCREQ5NTQsIDB4QUZFOUNBQkQsIDB4MDZBQkRGOTUsIDB4RjEzOTMwMkQsCisweDM4MDRGRUE4LCAweDdDRTY1NDJGLCAweERFNDdCOEVELCAweEQzNEJFNTA5LAorMHg1RUI5QzlFMSwgMHhEQzU4MjUzNCwgMHhFNzdEN0ZDOCwgMHgyQkVGRUQ3RSwKKzB4NEVBMjZERkQsIDB4NTQ2NzBCODEsIDB4NjY1QzQ1MzEsIDB4NUI3QTcwMjMsCisweEEwNUQ5QTJFLCAweDcxQkREQjJFLCAweDlENTFEOEMyLCAweEQ4QTY2NUNDLAorMHhBOUI4N0EyMiwgMHg1ODFEMjhCRiwgMHhGOUQ0MDM3MywgMHhFMDREOEY2MywKKzB4MTE3Qjk4NDIsIDB4ODg2OEI5QkUsIDB4ODM5N0ZBQjksIDB4RUY1Q0VENzUsCisweEY3MEY5MEQ4LCAweEQzREZEM0E2LCAweDE3NzlGNTc2LCAweDMwNTk1MjBELAorMHhDMzhGNEFBOSwgMHg2QjdBNkQwQSwgMHg0RTczMTEyQSwgMHg0RkY5RENFRCwKKzB4QUVBMTM4M0EsIDB4QkFCMEFBOTMsIDB4NDFEQkNCRUQsIDB4MjY2Nzc1QTYsCisweDhFRTBENUQ1LCAweEI1MjJDQjlFLCAweEM2RTVEMEQzLCAweDg2RTRDOEZELAorMHhBODk0NjQyRiwgMHhGNjk4MjFBOSwgMHg4OEI0MTc5OCwgMHg0NTg1QTE4OCwKKzB4OUQyMTMwRkMsIDB4QzVCMThFMEQsIDB4NkI5MkM5RUUsIDB4M0M5Mjg5RkIsCisweDFGMDJDQkI2LCAweDMxRkE4NkRFLCAweDFCMjI5NUNELCAweDVCNERBMTlDLAorMHgzMTM0RDhGQywgMHhFNUVBQkM0NCwgMHhERjhDNTA5NSwgMHhGNjU3MTg4MSwKKzB4MUYyRkJENjIsIDB4RTU4NUZFNjEsIDB4MDIwQ0VERjYsIDB4RDcwQUJDODMsCisweDVGMzc3NDZBLCAweDZGREEzQkY3LCAweDU0MzRFNTAzLCAweDQ0Q0Y2OTE1LAorMHg1NjFCMjM5MywgMHhFQTRBMjI1MSwgMHhBOTg4QzA4MCwgMHhFNDdCMTc5MSwKKzB4RDMzNUNGQkUsIDB4RURBOURFRTIsIDB4NEY3MEZCMjIsIDB4ODNBMkMyOUYsCisweEY0NEZBMDAyLCAweDA2OUQyNUVDLCAweDRENTA0M0Y1LCAweDg4NzQ2NENBLAorMHg2NjFEMUU5RiwgMHg5OEI4NTZBRCwgMHg4MUEyM0ZCMCwgMHgzNjkzQkQ0MiwKKzB4Q0UwQUVCMEIsIDB4MUY2RTgzMjIsIDB4Q0JERjU3MUIsIDB4OTM2ODg5MDksCisweEZBMTZBNzc0LCAweDI1ODM0NDM3LCAweEVFNzdGQTk4LCAweDhEQzY4QzYwLAorMHgxNTVBODc2MCwgMHgyMkI4RkNBMywgMHgxQjFCQjA1NCwgMHhDQTNBRkZDQSwKKzB4QzhFQUNFQTQsIDB4Qzg2QkFERDksIDB4NDczNzcwQUIsIDB4NDFENkUzOTgsCisweDU2OEIzOTdELCAweDA2NUMwQkU1LCAweDUxRDM4QTBELCAweDNCQjNBMEUxLAorMHhCQzM4NkRDQiwgMHg3RENCQTZCMCwgMHgxOTAwNzI1NCwgMHgzRjRGQzcyNiwKKzB4RjI3REFFODUsIDB4RjdGREE3MkEsIDB4NkQwQjVDMDcsIDB4NjRBMEVEMTIsCisweEUyNkQ4ODc4LCAweDIxMEU0RjZCLCAweDY1RjkyQzBELCAweDRFNEUyQ0E2LAorMHg1RTQ3OUQ0OSwgMHg3QjI4NzA1MCwgMHhFOUE0ODM2QywgMHhDM0ExMTFBMiwKKzB4OUI5MEQ2RkQsIDB4QTVGMzYyRTAsIDB4QURDOTUyNkIsIDB4NzlCNzM2RTksCisweDcyQTlBNTdCLCAweDE4MUI0RTcwLCAweDUyMzZGMzJBLCAweDU1NjdFM0M5LAorMHgyM0VGRDA2MywgMHg4NzExMzE2MywgMHhDREY2RDRGNCwgMHhGNTNBODcyMiwKKzB4QjcwQ0Y5NDEsIDB4NzU3RjQwQzgsIDB4NkE2NTJCRTcsIDB4RDcxREE1QUEsCisweEY4N0Q1MUMyLCAweEI0QTY4RTE2LCAweDc2M0Q4RkVCLCAweEI2REU1NDM2LAorMHgxMjE4NERDRCwgMHgzOEQxREU5MCwgMHhCMzlFNTIwOSwgMHgxNjAwNDkyQSwKKzB4MDczQUU4RjUsIDB4MDM2NkFDMEUsIDB4MUFENTAxNEYsIDB4Mzk4RTA4NzMsCisweEQ2NTM5MjhFLCAweDMwQjVCNERFLCAweEFDNjhBMDZFLCAweDhEQUVGNEQzLAorMHg3NkE4ODBEOCwgMHhGM0IzQkNDNSwgMHgyQjYzMUY1OCwgMHgzNDA5MTREQiwKKzB4QjQ3NzFEQ0MsIDB4N0M5RDRBNDMsIDB4QUZEQjExMzgsIDB4MDE0QjVBODMsCisweDBENDQxODVELCAweDIwQzg5NTc2LCAweDk5NEI0MzY3LCAweEE4NEJENzkyLAorMHhCMkUxN0NCMSwgMHgwMENFNTIxNCwgMHhGQjkzRTU0RiwgMHgwM0NDQTdGMSwKKzB4OTU2QTgyRTYsIDB4MjIzMjlBNzEsIDB4MkE2MzQzNzQsIDB4RjE4QjdBRDksCisweDFGMTY4QkM0LCAweEMyQ0IxRURDLCAweDhFMEFGNkNELCAweDIxMUFGMjJBLAorMHhBQjVEQTM3NCwgMHg2M0YxRjI1RSwgMHhFQzU4RDRDQywgMHg0OEM2NUM0NiwKKzB4NUE3Rjc1NzQsIDB4N0JBNjAwNDcsIDB4Mjc5RUYyOTksIDB4RTBCNzdGNDgsCisweDY0N0EwM0MzLCAweEFFN0M0RDhGLCAweEY2NTE0OUQwLCAweEFDOUVGMjI4LAorMHhDRDkwQjFDRCwgMHhDRUVEQTU0QywgMHhEOEZEMEE2QSwgMHg4RDdDMjI5MSwKKzB4QjM4RUY2QzEsIDB4N0YzOEU2NzYsIDB4REFERDBBOEYsIDB4MTEyNTcxM0MsCisweEFBNzhBMjk5LCAweDU0MDMzRjIwLCAweDE5OUM3NkM1LCAweENBRjgyQTE3LAorMHgxNkYyRUU4QiwgMHgyMDA3MUQwRiwgMHgyQ0EwMDBGOCwgMHgwMTc4QTI0QiwKKzB4MDAyOUVFNDYsIDB4QTlEOEM3MzgsIDB4MTIzRDJCQkQsIDB4RUY3Q0FDNTIsCisweEJEMjQxODY5LCAweDQzNUY4RkY3LCAweEI1NzNBMTkwLCAweDQwMkJGQjJGLAorMHhGREEzMDk3QywgMHhGMzc2NTg4OSwgMHg2OEUyQzdENSwgMHg0QzI2Rjg1OCwKKzB4RDY4MTREMUYsIDB4NkIwNDNDN0IsIDB4MTczREIwOTEsIDB4OTUxMjZDN0MsCisweDBGRThFMUJFLCAweEZERUIyMzNDLCAweEI5NzlCMENCLCAweDAwRTAwNjU5LAorMHgxOTk1MkU1MiwgMHhBMDk3NkY3RSwgMHgwMkZCNDYyQywgMHg3OTg4MTVDOCwKKzB4QTI1MDRFRkUsIDB4MEY0ODExQUQsIDB4QkE4RjEyMkUsIDB4NUVFNTg2NEYsCisweEQzOUI2Nzk5LCAweDUzMTlGNkEzLCAweEY2QTY2Njg1LCAweDk4OEQxMDZGLAorMHg3QUJBNTIyMCwgMHgwMzIwMzg0QiwgMHg0REU0OEM3OSwgMHhGNUNCMzZFNiwKKzB4MkIzMzI3MEYsIDB4RkY0RTY5NjUsIDB4RDREODQzRDUsIDB4N0VFRTg2MUMsCisweEE5NkFFNUVFLCAweDMxMEU1MjE1LCAweDZEMjAwNjhFLCAweEIxNDlBRThCLAorMHgwOTk3RDlFRiwgMHg1MDQzRkZGQSwgMHgwNTE2RTJCNiwgMHgzRkNDREEzMiwKKzB4OEU2MDRBMDQsIDB4MjMwMTI3NzgsIDB4OTQ0NEE0NzQsIDB4QjdGNURDMjQsCisweDNBNThFNkZCLCAweDE3Qjc1OUZCLCAweEYyOUMxRUU3LCAweDg4OTNEMkQxLAorMHhDNkNEMjM1QiwgMHhBQUIwQ0JDRSwgMHgyRDg0NDc0QywgMHg4QTBCRTAyNywKKzB4RkRCODdGQjUsIDB4RTZCNTA3QkQsIDB4MTlCNDE5MjcsIDB4NzgzRkY0REEsCisweDQ4NUExRDVELCAweDhFRDI4NUMyLCAweDI1QUZDNEM1LCAweEJGMEQ2NjJCLAorMHhDNDIzODUzMiwgMHg0MzM5RkNDRiwgMHgxNEE3ODRCNiwgMHg3MTY2NTgxOSwKKzB4RUQ3NkU0NzMsIDB4NUYxQkFFOUUsIDB4RDBBRUMxN0IsIDB4NENFNzg4MTQsCisweEQzNjA5RjYxLCAweEQ0RTQ5RUIwLCAweEU0RTNFRkRBLCAweDlCN0NBRDFELAorMHhFRjAxQUJCNywgMHhEMTM3QkVFOSwgMHhFRTg3QTgxRCwgMHhENEIyMDRGRiwKKzB4MDBCMjU3MzcsIDB4Mjc3MEZCRDEsIDB4MTc0QUZGN0YsIDB4MEE3N0EyMUMsCisweEYxQjM3MEU3LCAweDlDMDkzQ0IwLCAweDA4MEMxRkZBLCAweDgzQ0U5MkQ5LAorMHgxNzA3NDcwQywgMHgzMzAzNDc5RiwgMHgyNUYxQjZBRiwgMHhGNDBFRUI3RiwKKzB4Qjk4QTE2NzcsIDB4QTU0QTFCQTIsIDB4NDNCNDE0NEEsIDB4MkYwOTJBMzUsCisweDMzMjg2QTc3LCAweEEwQUI5QzkzLCAweDRGOEQ3MERDLCAweDNBNDdCRjZGLAorMHhCNjIwOUFCNSwgMHhBNEM5NDU1NywgMHg1RTc1NzA1NSwgMHg3MDZFQUQ5RiwKKzB4NDY3QkMwMkEsIDB4NjQ3MkE4NTcsIDB4NDIwNTVDNTcsIDB4NjZGMkJBNjAsCisweDMzQzA1MzZGLCAweDMyNDBCRkJELCAweDNERDc0RTZCLCAweDFGNThBNTUyLAorMHg4MjJFOTU3NywgMHhGNDlCRkU3NywgMHg1NDkwREM2RCwgMHgxRDMyQkJBMCwKKzB4MUMzMEIwNzIsIDB4NzhBNEE1QzAsIDB4MUVFODhBNTcsIDB4OTdDQUMzQzgsCisweDk5MTI4NjFGLCAweEM5MTZCQkFGLCAweEZDM0E3RjBFLCAweENBNUUxRjNBLAorMHg2MzBGMDlDRCwgMHhGNkM4QzIxMCwgMHhGMEExMkE3MiwgMHhGMzE0ODYxOSwKKzB4REYxNjcyRTEsIDB4RkNFNUMzOTAsIDB4MjlDQUU1NTQsIDB4RTk4NEE0NUMsCisweDhBMUYwQTNBLCAweDZBMDJDNzA3LCAweDhDRkIzRUQ2LCAweEMwQTc0MUJELAorMHg3QTg3MUZFNSwgMHg5MTAyMUE2OSwgMHg1MDVGQjA1QSwgMHg4Rjg1MjI3QiwKKzB4QzMwMEFDRjEsIDB4MEExQjIwMUIsIDB4MjI0NjE0QjIsIDB4NTRBMjM1NzYsCisweDUzNjBBNUJBLCAweERDRDIzQTMxLCAweEY5OERGNjM4LCAweDc5RkY3OUQ3LAorMHhFQUM4RUFDMywgMHg0RDIyQzY1RCwgMHhERkZCRjFEOSwgMHg1NUZEODg0OCwKKzB4NEJGRDIzNDcsIDB4RTJBMDgyODcsIDB4RTZBNDg4MjQsIDB4ODA2MjVFQTksCisweDcxQUIzRjdFLCAweDk5Qjg0REU1LCAweDY1MTJBREJFLCAweEZCRjI0QzQ3LAorMHgzRUVGMjU2NCwgMHgyM0RGOUYxQiwgMHgyNEJFNTE5OSwgMHhERURENzJENSwKKzB4QTJGRTA2M0IsIDB4NEZFNTIwQjEsIDB4OUU0RTdCQkUsIDB4RDYxNUJEQkUsCisweEMxNEU4MTg0LCAweDQwRjg2RkIxLCAweEQ0MDNBNjVBLCAweEM1QUY2Mzg2LAorMHg0MTJGODQzNCwgMHg2RDYwMTJCMCwgMHg0RUM1NzEwNywgMHgzRjc2QUYxOSwKKzB4NTRBMzA1QkQsIDB4RUE5QzRFQjIsIDB4NTg0RTAxNzYsIDB4MjA3NTk4MDUsCisweDFBMTZDODRBLCAweDUwQkIxMERCLCAweEU2MTBBRjQ1LCAweDk4Q0YxRUEwLAorMHgzRjhDNzc1NiwgMHhGOTA1NkJFMCwgMHhCQUE2NkI3RCwgMHhGNzA3NkRDRiwKKzB4NjdGMTk5NEQsIDB4OTJCRkVCNjIsIDB4ODZGQkRFMTcsIDB4Mzg5REIzMTEsCisweDJBMTcxRjVBLCAweEUxNDg5OEIxLCAweDREMTE3MjNGLCAweDI5ODg5MDYyLAorMHhDQkYzREQ3OSwgMHgyQjc0NjhGQywgMHg0RkI5Mzc3MCwgMHhDNUZDRUZFOCwKKzB4OEZFRTY2NzgsIDB4OUY0QUJBOUMsIDB4NkE2QjIzRTEsIDB4RkVBNzA3N0YsCisweEM4MzVGNzM0LCAweENBNjc4MDdDLCAweDFCRkJFQjQ5LCAweEI4QjFFODQyLAorMHg2QTg1MDYyMywgMHgwMDFDMUU4RCwgMHg3ODJBQzAxRSwgMHhBMjhBNzJEOCwKKzB4NkNENjZGQzEsIDB4NzdFRjZGMTMsIDB4RkY0MEQ3Q0YsIDB4NEExNjNERkIsCisweERCMjFBQTg5LCAweDI5RDAzQTlFLCAweDNBNEQxRDU3LCAweDdBODlDREM5LAorMHhDNTYyM0UxMCwgMHg4QTQ0NDc5OSwgMHgxRjYyMERGNCwgMHhGRjg3Njc1OCwKKzB4QzlERUVGMkUsIDB4N0Y4NjkxMUUsIDB4RTMxOTYwOTMsIDB4QTAwRUI0MjIsCisweENEQjE3NDNGLCAweDRBQUQxOTg4LCAweDcwMTY3NzAwLCAweDcwNTk1QzVGLAorMHg4RTY0ODAxMywgMHg0MDFEODc3MCwgMHhDNzYyRjBFNywgMHhEQjc3NjkyNiwKKzB4MkJEQzU1QjMsIDB4OEY0QUQyQzEsIDB4MUEyRUVCNTAsIDB4QkQ0QkYyQTQsCisweEE0M0ZGRTkwLCAweDc1MjkzNUU3LCAweEIwMkM3ODAxLCAweERENENEM0RCLAorMHgzODE1QzM5NCwgMHhBRjQyNzY5NSwgMHg3NDU1QThGOSwgMHhDNDQ0QzdFQywKKzB4OUJDOUIyQzUsIDB4MDg0MjNCQTcsIDB4NUQ5MUFERDgsIDB4NTlEODY2REIsCisweDBBRDMyMjU4LCAweDdCQzM5N0Y2LCAweDBFRjdEQjU5LCAweEMxMDM0MzIwLAorMHg3OTA3MzQwNiwgMHg5OTFBMTJCOSwgMHg5RDY3NzZBMCwgMHg2MzQ4QTVFQiwKKzB4QkQ5OENEQzQsIDB4ODFBNkM1QzUsIDB4NzZBM0FCQTYsIDB4RkE5Q0RGNzcsCisweDk3NzcyQjU5LCAweEQ5ODdFNDJCLCAweEE0Qjg5M0Q0LCAweDYxRjc4RTM4LAorMHg4MjU2NzY5MSwgMHhDQjkxQ0Q1OCwgMHhFRUZBNjlBRSwgMHhGN0Q1MTE3OCwKKzB4QTQzNkM1NzgsIDB4OTlFODZFMDgsIDB4QThDM0IxNkIsIDB4RDYwOTA1NEYsCisweDFFMEFEQ0U4LCAweDVERjZFRjIwLCAweEVCM0NDNDVCLCAweDlGQUVBMjRGLAorMHg5N0Y1N0YxOSwgMHg2NkUyNzEzRiwgMHg0MkE0MjNDMywgMHgyQTIxQjE3QywKKzB4NkE0QzZCNDAsIDB4RkEwRjRGMkIsIDB4RDFGM0Y2NEEsIDB4RDBBQUZBNTAsCisweDc2N0QzQUMyLCAweDgzN0U2MjZELCAweDNCMjEyNzlDLCAweENBRTE4ODU1LAorMHhGQThDQTM4NSwgMHhBOTFCREU0NSwgMHgxQTk1MzMyNywgMHg3MzM5NDhDQywKKzB4MTU4QjhDRDIsIDB4OTA0QUM0M0QsIDB4QTZCQzhGODIsIDB4NTVGMDI3REEsCisweDk1QjZCQjMyLCAweDkyNjVGRjgwLCAweDhFRUYwRDI0LCAweDI4RjY3OTZFLAorMHgxRDczNjcwMCwgMHhCNjIxRDRENiwgMHhBQjJGMUE0QSwgMHhFQ0Q3REI4MywKKzB4MzVDQUQ0MTksIDB4NjA2MDQ5MTcsIDB4NURFNTEzMzUsIDB4QTNEN0UxMjIsCisweDY4NUQwNEQ0LCAweDQ5NDczOUQ0LCAweDAwNjA3MjJDLCAweDU5MTQ5NzE4LAorMHgwM0M5RjE0NCwgMHg0MzMyODgxOCwgMHhCQjFBRTE4OSwgMHhDQTdCOTI1MCwKKzB4QzgzNTY2NkQsIDB4ODM5NTAyMjAsIDB4RDc3NDQwNUYsIDB4RjZGNEZDQ0UsCisweDBFMzg3OTRELCAweEFGMTg0QTdFLCAweEVGNjZFMTVCLCAweEEwQzJBNzRGLAorMHg4NzYxMTJENSwgMHg3RDY4QzlDRiwgMHg4OTAyMDExQywgMHg2QUIwRTEyOCwKKzB4MkE1MTU1MjAsIDB4QTk5RDFEQTAsIDB4OUVBQ0VCNEQsIDB4QjY2OUFBOEYsCisweDZGOTZEQ0UyLCAweENGRUI1Q0RGLCAweDQ2RUIzNkJELCAweEVEREY4MzE3LAorMHg0RkEzMEMzRSwgMHg5NTQxQThBMSwgMHhBNUY3NTUzMywgMHhFRkUxRkVGNiwKKzB4N0YyMUI0ODEsIDB4REExMUQ1RUEsIDB4NjQ2NDIwNjksIDB4MDgzRDIxMzcsCisweERGNTA4NzI2LCAweDhGNkNDQzRCLCAweEM1NDEyRDBBLCAweDZBOUY2QkVBLAorMHgzRTNDQzU0RiwgMHgwNzhCQkIxRSwgMHhBNjA0NzQ2OCwgMHhGMUZBMzlDMiwKKzB4MjYxNDM0MzUsIDB4OTAxMzJFQjMsIDB4NDIxNjU4MEMsIDB4RjY3NzNCOEMsCisweEE2QjE4OEJGLCAweEUzQjQ5NTIzLCAweDg5RTQ1NjNGLCAweEQwQjE2NTM4LAorMHgyRDkwNzlGRCwgMHg2OUFCREUzNiwgMHg2NjlBQzVFQiwgMHhEMDYxOEREOSwKKzB4NTA4MEJGRUYsIDB4QURDMDU2RDYsIDB4NzI0MDJDOUMsIDB4MEFFNzlFMDcsCisweDhENkRGNDhFLCAweDA1MDI4MzdFLCAweDc5QkExN0FELCAweEU0ODcxQzg5LAorMHhDNDU1NENENSwgMHgyM0ZDQjJBNCwgMHg2NDZGQTk5OSwgMHgyMTJBOURCOCwKKzB4QkQyM0RGMEEsIDB4ODkwQjVGRTYsIDB4QjVEMDMyOTIsIDB4OUZBM0ZENTksCisweEQ2MTJGOEIxLCAweDYxMTM2NUZCLCAweDdFN0M5RkFCLCAweDAyNDE5NEQyLAorMHg0NkMyQzYxNywgMHhBRUIwRkFEOSwgMHhBRTVEM0E3RSwgMHhFQThCMEFCQiwKKzB4NzYwNzMwQTQsIDB4NTA0NDNFNzYsIDB4RUNBNjQzNDEsIDB4NTM4RTUyNTYsCisweDhBODUwNUY1LCAweEUwRTREQzI5LCAweDEwNURDNTY0LCAweEM3M0Q5M0Q5LAorMHhFM0YyN0M5MCwgMHg4Q0MwMUZDOCwgMHg0MDBEMEY3NiwgMHhEQ0QwMTEzMCwKKzB4MUUzNDE2RDQsIDB4NEM2MTJFMDMsIDB4MEJGRTdBNUMsIDB4RkRCMTUzMzQsCisweDUzMjZBNzdGLCAweDk5NTQ5QkRBLCAweERERTkwQkFCLCAweDkyMEJEODcyLAorMHhDNEI0RjVERiwgMHg3QjM5QkFDMiwgMHg3NzdDNjY5NCwgMHhCNDk3MTEwMywKKzB4OUU3ODA2QTEsIDB4RDMxNDFGMkQsIDB4MkI0MEJBRDAsIDB4NzRBRjI0OEYsCisweEQxQUVFRDQzLCAweDJGNDUzNzM2LCAweDE4ODAxMDRFLCAweEY5Q0Q1MDJGLAorMHg3NjkxRkU1OSwgMHgzOUMzRkVDNywgMHg3MkVBN0JGMiwgMHgwQzk0QkFCNSwKKzB4MzVENkY1MDksIDB4QUU4NkFDOTYsIDB4MDYyNEMxODEsIDB4QTY5REY2OTksCisweDU5OTFGQ0UzLCAweEFCMjBENEYxLCAweEYzMEYxQkM5LCAweEIwOTRDRjYyLAorMHhBM0I1QTczMiwgMHgzQkM4QzMyRiwgMHhFNzcxMDM3MCwgMHg0MjlBOEQ5NiwKKzB4RDg5MTNBNDIsIDB4Q0ZCRDBFNEYsIDB4NzEwQjcwNzgsIDB4QzY1MDFFOTMsCisweDI0MTIyNEFGLCAweDk3OEQyMzIwLCAweDhFRjEwNjRCLCAweDI3M0ZBRTA3LAorMHgzMTZFQzAyQywgMHhCM0MxNkMwQiwgMHg4MjQ5QzI0NSwgMHgyMUFEMTFDQiwKKzB4NjI2NUZFNTcsIDB4QTlGMUQ1RkMsIDB4MEI1MkYxQ0QsIDB4MDM4MUQ5ODMsCisweDI5MzFENkIxLCAweEQxMjZDRDk0LCAweDY5RDk1MTk3LCAweDdDRkI2QUQwLAorMHg0NkU2RDUwRCwgMHhFNjBCQ0JEMiwgMHg3MkZCQjQzNiwgMHhDOTcxQTRDQSwKKzB4QTU4MEI5QjksIDB4QkM4MjM1MTQsIDB4NUQxNUE4NDAsIDB4ODdBOTE2MjIsCisweDYzNDkwRDEzLCAweDI3NzE4OUE4LCAweDIyQ0EyRURDLCAweDFDNTY0NTZELAorMHgxQjVFQjgzNiwgMHhEOEJCRjJFQiwgMHgyMEY1NkRGQiwgMHg5OTMyMUU0QiwKKzB4OTIzOEI3ODMsIDB4RTVFNUQwODUsIDB4QzgxREFBMTEsIDB4RUY4REQwMzIsCisweENFQzI4NjQ1LCAweEZDNDBBQUE1LCAweEJGQTVGQzY4LCAweDFDMkNGN0M3LAorMHhDMERGRDE5NCwgMHg1QUI3MzBEQSwgMHhFM0ZCNTZBOSwgMHhBMEFEMDBFOSwKKzB4QjdCQTJFMkUsIDB4NTc5Qzg3MjIsIDB4MDRBQTA3RkQsIDB4RjU1QzZDNUMsCisweEU1NkNENkRELCAweEE3REE1MTAwLCAweDJBNkJBMUU1LCAweDlCN0U1MTA0LAorMHg4MTQxMDQyMCwgMHhEQzYxMzBBOCwgMHgzRUM4OTM1QiwgMHhDQzJFQzc4MiwKKzB4MTQyMzQ0RUYsIDB4RjAxNkUwQ0EsIDB4QTNBQ0ZBOEUsIDB4MDE5QTcwMDksCisweEEwREFFQzVELCAweEZBNTAzNTY1LCAweEM5MDc3OTRFLCAweDc3QUE0RTY5LAorMHhCNDVCN0U1NCwgMHg5MjlBMDU2QSwgMHg0NkFBNEFFMSwgMHg1NUU1NkVERiwKKzB4RkREOUQ3MjYsIDB4MzU3NDRENUMsIDB4RDY4NTQ3MDAsIDB4OUE2RTFFRUUsCisweDBCMDBGNkZCLCAweDZCRTY1QkZCLCAweDlDRjk4REUwLCAweEQ4MEFDRTY2LAorMHgxRTUzMDBFNCwgMHg3NDUzMzhERCwgMHg0Q0I5MjVERSwgMHhCMzY5QjBENCwKKzB4N0E1M0E2MDYsIDB4RDJCOTZFNTQsIDB4ODhGOTZCMzAsIDB4QjcyQzNFMTksCisweEMyQTQxMTc3LCAweDYyMDZGODc5LCAweEMxRjZDRDc4LCAweDg3OURBNzRGLAorMHg3NjNGOTQxNywgMHhEMTA5Qjc3OSwgMHg2QTU4QjM0QywgMHhEQ0Q3QzIxQSwKKzB4MUIwQTAxNTQsIDB4NDVFRTNBOUMsIDB4NjJDNjAxNjEsIDB4NzlFNDcwMjAsCisweDQyMjUwQTM5LCAweDlFMkMyQzU5LCAweENFNEY2MjA2LCAweEMyOTcwMzg2LAorMHg5ODNDQzJDMywgMHgwREFGMEE4NSwgMHgzODg2MjZEQSwgMHgwNkE1NkQyNywKKzB4OTIyMzIwM0EsIDB4OTZFMDE0OEMsIDB4MjJGMEQwNTIsIDB4RDVGMUFBODgsCisweDM5NEJDOEI5LCAweDAzQ0Y1OEZBLCAweEMwQjEwNzNDLCAweEMxNkIzNUM3LAorMHg3QjdDRjlGOCwgMHgyRTNBMjRBNSwgMHhBMTkwODlDOSwgMHg0MjIzRkFFOSwKKzB4Nzc1MUQ5NzcsIDB4ODAyRTcwNjIsIDB4NkQzNjUxRUYsIDB4MzlFOUI1MkUsCisweDk0NkQwN0Y4LCAweDhFMkVBRUI3LCAweEY5Mjc5QTY1LCAweDE0REVFOTExLAorMHg4QjkyQTE0OSwgMHg5NjExNzU2RSwgMHgwNjdERDIyRCwgMHg1OTkwNzk2NywKKzB4QjM0MTdFM0MsIDB4M0I3MkFCN0EsIDB4ODI1RDg3QzcsIDB4Q0U1RkE4NTIsCisweDVEODhDNUY4LCAweEU3OTJCRjY2LCAweDI4REIzQTRBLCAweDExOENBM0EyLAorMHhDQzg2Mjg0RSwgMHhBMEFDNEFFOCwgMHgzMzM5NEI3MCwgMHg5NzRGOTZDMiwKKzB4ODZBREQzQjUsIDB4Qzg3Mjk1QjksIDB4MTQ0N0QyNkYsIDB4QzlFQ0FFODAsCisweDEwQ0EwMUQ3LCAweEUwNEVDQzY4LCAweEFFNTY1OTdFLCAweEFBQTEyNDhDLAorMHg4MUMzNTQ2MCwgMHgwMDg3Q0E5MywgMHg5NDNBQUJBMiwgMHgwQUZDQkZBQSwKKzB4RUE3N0Q1QUIsIDB4MDIwRDM2RDYsIDB4RjFDQ0JCQjYsIDB4OERGMTQyNkYsCisweEFFNzI2RDk2LCAweEE2RTRDOTE1LCAweDU4RjE1RjkxLCAweDVCNjk2RDZGLAorMHgwMDA0MkIzMCwgMHhDNkFDOTBDMywgMHhCRDhFMDE4NywgMHhFNzNFRDJFMiwKKzB4Q0VFNjRDRjYsIDB4NDhCNTY0MzYsIDB4QTMzOTk0Q0EsIDB4QjNFM0I3QUIsCisweDA2MEQ1RTE0LCAweEMxQjE3NkM2LCAweDRBNzZDMzkxLCAweEQ3QzhEQjFELAorMHgzMzNFNDk5OCwgMHhDMjBCQUM0RiwgMHg1MjNCRTNFMCwgMHgyMzdFODdCQywKKzB4RTZDREJFQzAsIDB4QzUwNkYxOUMsIDB4MjYyQzAwMzksIDB4N0Y4NUE0QUMsCisweDQ2MTYwNjkzLCAweDJFQTFCQzM2LCAweDRDQUMwREYyLCAweDAwNjZCODNGLAorMHhCQ0JDNzc4RCwgMHg3RjRBQjUwNywgMHg5OUNBREIyRiwgMHhDOTU1MjBEMCwKKzB4QzVDQkYwNjcsIDB4OTAzRUNENjgsIDB4RjVEN0IwRkMsIDB4MDgxOThDOEYsCisweEExNzg3OUVDLCAweDE4QzI3MjNELCAweDVBNEQ2RDM3LCAweDA4MDE5OEI2LAorMHgzNTI1MTg2QywgMHhFRjhCRTE0NCwgMHg0NEIwNTg1MSwgMHgyOEI1MDI1QSwKKzB4MEZERjA4NUQsIDB4REVCMUYyNDksIDB4QTdDMDBGNDIsIDB4NzYxNEE3MzUsCisweDNCRUJGNDY3LCAweDc4NzFEMzA1LCAweEQ0RjYzODA5LCAweDlEMDQ0MDc5LAorMHhFNTg1RDNENiwgMHhBODk5NTJGMywgMHhGNDJDMkI4RSwgMHgwNDE3OURBNCwKKzB4MDBBNkNFODcsIDB4OTZDQTkyQjgsIDB4OURGMkIxNTYsIDB4M0VDRjE4QkMsCisweERFMjUwOUNGLCAweDVDRDg1RkNBLCAweEY4QTdDRUVGLCAweENCN0RDMjVFLAorMHhGMjg0NzQ3NCwgMHgzNUI1MDFEMSwgMHgxMzdCQkIzRSwgMHg0NTFFMUJCOSwKKzB4RDM2MEQ4MTEsIDB4NzkyQjM0NjQsIDB4NEJGODlBODEsIDB4QTdFOUM0NTAsCisweDYyOEJDQjBDLCAweDJBRjcwMzdELCAweEE0NUY2MjhFLCAweEYwRUM4NzVELAorMHg5Q0UzNjc3RCwgMHgyQ0QwRUE1OSwgMHhBNTBBMDIxNywgMHg4QkE0NURENywKKzB4MTczNUFDRjEsIDB4NTgwNEM0RDksIDB4RTYxOUIzNTIsIDB4OTQ4RjQ0QTgsCisweEE5QkY1QzdGLCAweDYxNEQ0RjZDLCAweDZEOUZDQTc5LCAweDI5NzE3QjBDLAorMHg1MEJGMkQ1QywgMHhENTg0N0I1MiwgMHgwRDRGQUFBNSwgMHgxQUFCQ0E1RCwKKzB4Nzc5Mzk5RTAsIDB4NThBOTBDRDYsIDB4MzdFQzI2MTUsIDB4NjFCNjhDMDcsCisweEM0OUY0QUVFLCAweEZBQzREODk3LCAweDlDNjhDQzZELCAweEJCMzM1MkY2LAorMHhGOTMzNDM2RCwgMHhEMzEwMDc4RSwgMHgyRkJGQTE3QSwgMHgzRDgzOUM0QywKKzB4MTg2RTY5RUYsIDB4Q0JFN0NDNkEsIDB4NzQzNDIzMUEsIDB4ODBGODEzMEIsCisweDU4Q0Q3RUEyLCAweDJFNDZENzE0LCAweDM2NzI4NkUyLCAweEE2RTIwNDRELAorMHhDMkFCQzUwQSwgMHg2RkVEQzlDNCwgMHhFMkYyNkYwMywgMHgzQjAzMEQ1MiwKKzB4MzY3NEQ4RTcsIDB4OTA5NkRGNzgsIDB4OTA5MDI4OTIsIDB4NDRBMzIxOTAsCisweEQwOEQyNjQ5LCAweEVGRTBFRDBBLCAweENFMUJGNEU5LCAweDYyQzE5NzUzLAorMHhGQkYzRDFBOCwgMHhENEFBNTM5MCwgMHg0QjMyRTc3RiwgMHg5ODk0RjA1RSwKKzB4NDFCOURCQkUsIDB4RTlCMDk1NjEsIDB4NDZDODgzQTAsIDB4QURENUQ2MEYsCisweDY5Q0U1QkJFLCAweEZEMjlDQ0YxLCAweDJGMjA5MzcxLCAweDRDNjcxNkU5LAorMHgzMUU5QTA5RiwgMHgwNDA4OTc5NSwgMHhCOUVGOTAyNSwgMHg5N0M2MjY3RCwKKzB4NjM4MjMxNTAsIDB4M0FCMzQ2QkEsIDB4RUQzRTA1NzksIDB4ODVGQzcwNjIsCisweDM3QjM1NzYxLCAweDRBMzJCNkNELCAweEMzOEVCNDc5LCAweDIwMzY0MkNDLAorMHg1NjhGQ0FENywgMHg2N0Q5MkI1RCwgMHhFNTFCOEMzRSwgMHgwMjEwNDA3OCwKKzB4MDI2QkM2MDcsIDB4NUEwNkNEQTcsIDB4RTI3NDM1RDAsIDB4QzdDMjBDRTcsCisweEZFQTc0MDIyLCAweDc3MzEwMDc2LCAweDM1QzZGOTUzLCAweEUxQjE5OUM1LAorMHgyNjJGMTM5QiwgMHhGRDJGRTJDNywgMHgzRUVFMDJFQiwgMHg5MTVBODczRiwKKzB4MkRFNEFCOEUsIDB4MjQyMURDMTUsIDB4RDFERDBEOUUsIDB4REUwMkI1QUQsCisweDE1MUM3NkNGLCAweDc5OEI5MEI3LCAweDgyRURERjRDLCAweDc5NUUxOENGLAorMHhGMDlDRUM1QSwgMHgwNzBBREY4RiwgMHhDRENGNTIzMiwgMHhENDk4RDQzQywKKzB4QjRGQzI2NjIsIDB4MjU2NzhFNTQsIDB4NUQyMDA0ODIsIDB4QzMxRjIxQzksCisweDM1RTVBRjI5LCAweDhDQzBFNjAzLCAweDk5NTM1MUFELCAweEQ4RUI1NEY2LAorMHg1NjRFMzVEOSwgMHgwQzEzRTMyMSwgMHgzNENGQTMzRCwgMHgzM0QxRTVGOSwKKzB4MkVBQzk3NDgsIDB4RkZCOTUwRDYsIDB4MjAzMjIwNkYsIDB4NEY4NzFBRTMsCisweEJENDY0QzYxLCAweDA2MzU2RUEwLCAweEExNUEyOTBELCAweEE3ODQ1NkQwLAorMHhEMkY0RUU4OCwgMHg0RDgzNTkwOCwgMHgxNURDODdCMywgMHg3OUVEQjZDMywKKzB4QUVBRjBGOUUsIDB4NUMzRTdFRjksIDB4NjM5QTA5OUUsIDB4RDM3NUQ4REEsCisweEI3MTg1MTBCLCAweDA5MERGOTY1LCAweDlDOEEzNjJFLCAweDI1QUQxMEJCLAorMHhGOUE0MkJFOSwgMHg4QURFM0RGMCwgMHg1NTI3NDI0RSwgMHgzMDFGMEQwRiwKKzB4MkY2OTFDOUEsIDB4NTM0RkUxRkMsIDB4N0Q0MDYwMTYsIDB4Rjk4ODIwQTIsCisweDREMjA0ODcxLCAweEVEMTQ1MTczLCAweEQ2N0VDRTlBLCAweDM1RjlGOTkwLAorMHg4RUQ0RDc4NywgMHgxRjNGNDZFMSwgMHg1QTY4RjE3MSwgMHg5QTlEMjhCMCwKKzB4RTcyNkJENUMsIDB4ODExOTIyOEQsIDB4MEFEQkE0RDIsIDB4RUEyNDMyMDQsCisweEU1MjNDMEQ2LCAweDI2MUUzNjY0LCAweEIyRDEyMTFDLCAweEI0RDkyOTNBLAorMHg5Qzg5RDkyNCwgMHgxNUE2QTNBOSwgMHgwRDhDNkM2NiwgMHhFQzA0QUQzNiwKKzB4MENERjBGOTgsIDB4OTI2MkM3REYsIDB4OEVFMEUwOUIsIDB4NkI5MjlFRTksCisweERDQzcxM0JDLCAweDc1RkQzNEZGLCAweDI3ODRFNjk0LCAweDIzQzIzMDQ0LAorMHhCN0IwNEYwOSwgMHhGMTBCNzUzRSwgMHgyRUM3NzREQSwgMHg0NzBCRTcyRSwKKzB4MDU0NTEwRTksIDB4OUM3RERGMTAsIDB4MTQ2NkMyNzcsIDB4OUY1MkY0OTMsCisweDdGMjk4NjA4LCAweEYxQkExMEQzLCAweDg4NDdBMzE5LCAweEVFOEE2M0NBLAorMHg4RTY0QjM0RSwgMHhFQkI2NjkzMywgMHg1NzVBREIyNCwgMHgwNDFCRkQ3NiwKKzB4NzI3RUQzNjQsIDB4MDBGNEEwMDgsIDB4OEY1RURBOTIsIDB4MjE0Nzc2MzcsCisweDBCMzYwNjE3LCAweDU2REM4OTc4LCAweDI3Rjg4OTQ0LCAweDY5Qjc5OUVGLAorMHhFQTFFOTQzQiwgMHg2RkRENjBCMCwgMHhDRTJBRDg5RiwgMHhCOThDQ0Y0MywKKzB4MkEzNzk2QkYsIDB4NEREMDI1MzUsIDB4QzZCNTI0RUEsIDB4NkIxNzMzNDEsCisweERDRTBBNDU3LCAweDkxNzcwNjQ2LCAweDU3QThEMTM4LCAweEZDMjE4MzMxLAorMHhEQzZCNzEyRCwgMHgxNEMwQjNCOSwgMHgzMENBMDlBRCwgMHg3NTlFQjk0MiwKKzB4QkM5NjM0QUIsIDB4OEY5MkE3RTUsIDB4RjdGODVCNTMsIDB4NkM4MzFCM0IsCisweDU2QTc1QjE4LCAweDQzREI5RjFDLCAweEY4MUZDMjEyLCAweEI4RUI5MDI2LAorMHg3OEE3NEI1MSwgMHg4NzA2NTVFMywgMHhBMTdCNTM2RCwgMHhCREU4NjZDRiwKKzB4RkM2MDlGMTEsIDB4RjM0QTcwMTYsIDB4N0M0RkQ0REQsIDB4MjM2MzEyRjYsCisweEI1MDUyMEE4LCAweDRCRUVBMkMzLCAweDJCNjkwQkEzLCAweDE4NzAxNjY3LAorMHhCRDc5MUZBOSwgMHgyMzZEMzZDRiwgMHg0OUU1NzZDQywgMHgzMTZBNzdFMSwKKzB4OTNFOUIwQkYsIDB4NTI3MTU2MDMsIDB4ODNCOUFBRjIsIDB4MEY4RjJBODAsCisweEE4N0Y3NjRBLCAweEQyMDc5QkVCLCAweDQ4QTI0QUI2LCAweEFDMzcwOTUwLAorMHgzMDc3RkIyRiwgMHg0QkFGRjNGNSwgMHgxQTc5OTI2RCwgMHg4QjM2OTk1NiwKKzB4QUQ3OEY3MzksIDB4RUQ4OENFNDIsIDB4Qjk2QTdDMTUsIDB4QTdCQkEyRUUsCisweDQ3Q0MzMjMzLCAweDgwNERFOTYyLCAweEUwQjQzMUEzLCAweDRBODI1N0I4LAorMHhBNEIwRThFMiwgMHgyRkZDNDlCOCwgMHhGMENERjVFNSwgMHhGMDg5QzMyQSwKKzB4NDYzMjgyODgsIDB4RUFDQkMwNTQsIDB4QTQ4Q0I1Q0MsIDB4Nzc5OTY1MzAsCisweDgzQTRFMTg0LCAweDNDMkY0N0Q5LCAweDUxMDYxNzdDLCAweDMzRjFBNzg3LAorMHhBMjI2NkU3QSwgMHhFQkM0MjZDOCwgMHhEN0U4QUREMywgMHgyREY0MDQ3NywKKzB4RjlFOEQ3QkQsIDB4ODBCRDhFQUIsIDB4RTYxQ0U1NUYsIDB4RjZBN0VGNkYsCisweDVDNjdFMUMwLCAweEZCRDAwODhBLCAweDdFRDM3QjI0LCAweEY1QkZENThFLAorMHhDMjlDRkIwRiwgMHg2MUVDRTA4QiwgMHhBNzc2Q0ZEOCwgMHg5RTBGM0EwNSwKKzB4OEZDOEIwMkYsIDB4RkRGODI3MDIsIDB4MDI4QzJGMkMsIDB4MTY5RDMwOTQsCisweEU0QUEzMjI4LCAweEYyQ0QxNDJELCAweDlDNzA1NzRFLCAweDA1N0JGRTc4LAorMHg3ODJCOTAzOSwgMHgwRDAxMzExRiwgMHg5NzU1MjA1MCwgMHg2QTA5N0YyRiwKKzB4MUIzMjQyQjgsIDB4RjQzRjMyRkIsIDB4OTYwMDQyODcsIDB4QzNEQzA5MzksCisweDQyMTVBMEUxLCAweEFDRDFBMjhBLCAweDE4OTkzMkVDLCAweDlCQkEwNDc1LAorMHhGQTE1NEU1QiwgMHg0QjRFOEQwMSwgMHg0RDZCMThCMSwgMHgzMTU0NUIzQywKKzB4Qzg0OUM1MkQsIDB4NjA5NThCOUIsIDB4RTkyQ0YwOTAsIDB4QUMzRTFCNTgsCisweDI1MUQwMkEzLCAweEZBRUU0RjhCLCAweEIxQ0Y2Q0NDLCAweEMyQTBEOEIwLAorMHgwNTAxREY0NiwgMHhEMDM2OUQ5NCwgMHhGM0UxMTQ3OSwgMHgzOTc1OTlGOCwKKzB4QjkwMDY0RDIsIDB4MzQxRjZENTcsIDB4MzFGMDE0MUEsIDB4MkY4OTkwMjksCisweEJDOUVGNkU4LCAweDEzQjQ3MzQ3LCAweEI5M0Q1OUJCLCAweDU1NkU5OTBGLAorMHg1NzI3QkRGQywgMHhCQTlGNTEyMSwgMHhENjdCRTdDQSwgMHhCMTY3RTg0RCwKKzB4MkMwRUQwRkYsIDB4MjUxRkZENEEsIDB4Qzk4NzE5RjIsIDB4RDM3OUQ5NzYsCisweDhCM0EwQTlCLCAweDQwQkE1RjY2LCAweEU0MEE5M0U4LCAweDJGODlGQzA0LAorMHhGQ0JBRkRENCwgMHhGMjQyNDI3MCwgMHgxQkRCREQxNSwgMHg3RjE0NTlCMCwKKzB4NUFDQjZDNkEsIDB4RkEyMDcxOUYsIDB4MkYxNkZGQjQsIDB4ODIwRERFNTAsCisweDQ2OEFBQzE1LCAweDc4MTYxMzRDLCAweDk3OEQ5NTcwLCAweDY3NDVDRDZELAorMHhDMUU3NjhDMSwgMHgxNUUyNDNCNSwgMHhCQTMwQUQ2MSwgMHg0ODNGQjZGRSwKKzB4Q0FBMTdEMEYsIDB4MkY4RjA5NzQsIDB4MzRBQjY4QjQsIDB4QjNFODY0QjAsCisweEMxREEzODI4LCAweDVEQUQ0M0IwLCAweDcyRDEzQjgxLCAweDAxRjI3NEFCLAorMHg5QzA2NTFBRCwgMHgwRkMzMEMxMCwgMHgwRTdBQTNDQiwgMHhEQkU2QjlEOSwKKzB4RjQyM0I5QTcsIDB4NDU3QjRFMzIsIDB4NDBFOEUyNjksIDB4OTFEQTA0MkEsCisweDlEQkY0MUU5LCAweDMwOEMwRjJFLCAweENBQkZBQzBELCAweDBFMkM4NkIyLAorMHgxMTdCQzNDNiwgMHhFRUE1MzhGOCwgMHhGMzE1ODVERiwgMHgwREY1MDI4MSwKKzB4RUFBOTYwMUUsIDB4OEY0MDhBRkEsIDB4RjExNDRGOUEsIDB4QTJBQjJFQ0QsCisweEFDQjg4Njg1LCAweDZGNEVGRkJELCAweDgxRUVGODg2LCAweDQ2QjAyMjQwLAorMHgzQzA5RDkxNiwgMHg0RjBEQUY2OCwgMHg4MzM3QjNFMywgMHg5QTAxMUJBNiwKKzB4NEM2M0FDNjYsIDB4MkZDQzY2OUUsIDB4MEM3RDE1QkIsIDB4NTEyNzlEOUYsCisweEMxMzU0Nzc5LCAweEVGRjk0MEFGLCAweEE5NTZDQjM3LCAweDBEQjc5N0UyLAorMHhFNjY1RUU1NSwgMHg3OUFGODc5RCwgMHgyMUJCQzkwMiwgMHgzMEIyNjRCRiwKKzB4NDExQ0RDOTgsIDB4RTQ1MzM4OUYsIDB4NDdDMkMxOTcsIDB4M0U2MDE1RjgsCisweEY5RTdBQTJCLCAweEE5MzAyNDc0LCAweDA0QzY4ODhGLCAweDREMTE4QkY5LAorMHgwREI3QUFDMCwgMHg1MkEzOEVEQiwgMHg0REFCMjJGMiwgMHg3REJCNkVBQiwKKzB4RDREMTc4NTEsIDB4RkQ5NDQzMTQsIDB4NDBDNTgzOEMsIDB4QkE2RUIwRUYsCisweDlBQTI4N0E1LCAweEY2RDIzNkYwLCAweDQxRDlFMkJBLCAweDY5NjhENzc2LAorMHgzMUIxRDEyOSwgMHg0MkMzRjk2MywgMHgyN0NDQUQzMCwgMHhDRDYxQkY0RSwKKzB4MkM3REFCQUIsIDB4QTc4QTlDQzMsIDB4N0Y4NTZCNkYsIDB4QjZENDQ0QTUsCisweDkwQ0JCMzEyLCAweDk1NjExNzgxLCAweDQ5MTZENTMxLCAweEM0OTZDMzBFLAorMHg3MDZEMENCNywgMHgzNUQwMDY0QiwgMHhGRTI2QzM2QSwgMHg2MjExRjE0QiwKKzB4MkMyMzQwQkEsIDB4NTg2MzM1NjcsIDB4MDZCNkJBOEUsIDB4QTdFQzNEOEQsCisweDEwNzFCMENELCAweDM4OEVFRkE4LCAweDYwRDhGQjFDLCAweDVGOTlEMTQ3LAorMHg1MkNBNkVCRiwgMHhGQTczNjAyRSwgMHgwMzc2QzE1QywgMHgzQzkxQjU3RCwKKzB4OTM4NkFGMTcsIDB4MTRBMzVBMUEsIDB4QkRCNDJBMzksIDB4MEU4M0MyNTcsCisweEQ0QzVDNzc1LCAweEE2MDdGQTQ2LCAweDkxQjlBRDQwLCAweDc2MjNDNUQ2LAorMHhFM0Q1M0U2QSwgMHhBM0M2NjNFNywgMHg1QUQzOUJDRSwgMHgwM0I1ODM5NCwKKzB4Mzg4NjJDN0EsIDB4MDFENTBCOUYsIDB4RUFBQjM4RUMsIDB4QUIzREZCOEIsCisweDA2Nzk1Mzg1LCAweEIxN0Y0ODVFLCAweEUyRjU3OTE0LCAweEI3OUEzQkFBLAorMHgxM0RBNzg4NiwgMHg3MTM2QzdFQiwgMHg1RTc0OEFGNywgMHhEMzRGMTZGQywKKzB4OTY4RjY3MDEsIDB4OTlDNUQ3QkUsIDB4NTMwRjdGQUMsIDB4Q0RGNUQ1NjcsCisweEUzMURFMEQzLCAweENGOTNCQzY4LCAweDM0QzU3OEFBLCAweEEyMDFGNzYxLAorMHg1Q0I4REMwMCwgMHhDQTI0REI5OCwgMHhGOEFEN0U0RiwgMHg4MDhFQzQ3NiwKKzB4NjAzQkE3NTEsIDB4NDg5NTU1QzYsIDB4RjJBMDNGRjAsIDB4RDI0NjFFOUEsCisweDEwMkMzM0JFLCAweDc2NzM5MzNDLCAweEMxMUEyNDI0LCAweDZBMjNDOEM2LAorMHg2OTQ5OTgxMiwgMHgxOUFBODUxMCwgMHhDOENEQTc1RiwgMHgzNEI1MjE2QSwKKzB4RDg3Rjc0MjAsIDB4QzhDRURCNTMsIDB4OERGMTFCQTIsIDB4QjEwOTExQzYsCisweDNGMUU1OTU1LCAweEYwNzVGNEVCLCAweDE3ODc0RkM1LCAweDBENTU2ODVCLAorMHg1RUU1MjFFNSwgMHg0NkM3MjkyNCwgMHhGODU0MDIxMCwgMHg1RDVFNEM1QywKKzB4RTg3QTEzM0MsIDB4OTE2MzNEQzksIDB4MzZCNTRENUQsIDB4QThCNUQ0NDAsCisweDdEQjdENkM0LCAweDVGQTgyQzE3LCAweEFENjc5MDM5LCAweDg2QjNCODM5LAorMHhERjUxMjFCNywgMHhDMDhCNzY4QSwgMHgzMzhBNTEyRiwgMHhDRjlBNEY5QSwKKzB4NURFRkJCNUIsIDB4NEM5MzAxQjIsIDB4MDgwMjM3MDIsIDB4NUIxRDdFMjgsCisweEVDODAwNTA1LCAweDNBODY5RTgwLCAweDRDNTBDOEFFLCAweEIxQUU5MDY0LAorMHhBRkZBMzRFQiwgMHhGMkYwMDZCOSwgMHhEOEE5QTNEMSwgMHgyQzZDMjEzNCwKKzB4Njc3RUU2NDgsIDB4QkI2QjZENUMsIDB4QTI4NTEzNkMsIDB4NkM0N0JGNEMsCisweEFGMTU4REMxLCAweDBFRjc1RTJCLCAweDVCOUM3NEQ1LCAweDlCOEQ0QkUzLAorMHhFNDk1QkUxOSwgMHg1OTQwQjIyOCwgMHg1NUU2MjY1NiwgMHgzMjQ3RTA2MCwKKzB4QkY3MDk0Q0QsIDB4MUMxQUIzODAsIDB4RUNFQTIyNzUsIDB4QjZERDgyNTEsCisweENDQTM5REQyLCAweEFCODVEOTkyLCAweDI3ODE5N0QyLCAweEZCNkM5RkQwLAorMHhCRDUzQjQ1OCwgMHg4OUVGRTBFQywgMHg1MkEzREZGRCwgMHhBNkI3RkY3QiwKKzB4RkIwNDM2NDksIDB4OTNDOTNGNzksIDB4QUVCNENENkQsIDB4NzFEQjVDOTAsCisweDlFOERGRTkyLCAweDBGMUE1QjkxLCAweDU1QzVDRjVELCAweDFBMTg0N0FDLAorMHg4RDI1Q0Y2QywgMHg5MTRGRDMxNiwgMHgzOUZDRkUyMCwgMHhEOEY2NkEwNywKKzB4MkNERDNEQzYsIDB4RTQxNUFDNzIsIDB4M0QxQkQwOUIsIDB4QTgzMjJDNTksCisweEJEM0E4MjZBLCAweDJBOTg4QTQwLCAweEVCRDhCMURELCAweDlGNTNFRUVGLAorMHhERjU3MTgxNiwgMHhENEZDQ0RBRSwgMHhCODVBMUU1MCwgMHhCRTFBNTcxRiwKKzB4MEVEMDc1MzQsIDB4NEMxRTQ3MUEsIDB4OEI0RDM2RjYsIDB4MEUzODhGQzYsCisweDlFRDJCQzRELCAweDNFMkQ3RjcyLCAweDc1MkFDQTE1LCAweDg5NjBCNDhFLAorMHg1ODkyQjNENywgMHg3MEY2RjNDRCwgMHgyNkM0ODVFRiwgMHhDODM4MzlCOSwKKzB4RkU2QzIyNEIsIDB4MzU0NzIwM0YsIDB4RjczQUNBODQsIDB4MDY1RENEQkMsCisweDg5ODZFQkRDLCAweENENTlFQTE0LCAweEMwRUY1OEE4LCAweEM1NTg3MjI5LAorMHg0ODRGQkNFRiwgMHg5QjhCRjI0RCwgMHgzNTFDRjk0NiwgMHhFMTBBQTk3MywKKzB4MTc5MTk2NDAsIDB4OTVGRjdCMUMsIDB4ODJBQjY1RTUsIDB4MDcwQkNDOTgsCisweDBFN0NEQjhELCAweDM4REIyN0RFLCAweENBNTQzQzJCLCAweDAxMzFFQjQxLAorMHg4MzAwOTk2QiwgMHg4OEI2M0Q2NiwgMHgwM0FEQUMxRCwgMHhCMjA1QTg3QiwKKzB4RDhCREMwQzYsIDB4NDQzRjYwNzEsIDB4MkNFNjlEMkEsIDB4NkUxRTVBNTMsCisweDRFRkY5M0FDLCAweDcwMzIyNjU3LCAweDVDQ0REMTQ2LCAweDA0QzQzNUI2LAorMHg1QkYzQ0Q2OSwgMHg1MUUwOTExNSwgMHgyNTQ1REZCMiwgMHhBNTJFRjQ0OCwKKzB4OEQzODcwNDYsIDB4N0M0RjFGMjUsIDB4MkVGRkQ4QUEsIDB4RkQ2NDIyQjAsCisweEI4MkUyNkE3LCAweENGMDFDQzQ1LCAweDg4ODk5RUJFLCAweERCNjIxOTY2LAorMHhCQkExODIyRiwgMHhCMjY0QUFFQiwgMHgxMDc2RUFBNSwgMHhDMjRCMENENSwKKzB4NTRENTU0QjAsIDB4NEVDQTdDMDUsIDB4QzhDOUIwNTMsIDB4NzBBODZEOTcsCisweDRFMzI2NUNBLCAweEVBMjRGODEwLCAweDg3M0IxNzJELCAweDc5QTc0RDE4LAorMHhFQzNGNDlENSwgMHhEMTc5OTYwMiwgMHhBMjFBMjhCNiwgMHgzRkI5OUFEMSwKKzB4QzJEQjM1QjMsIDB4NjNFQzJFNTEsIDB4MTdFNDQ4OUYsIDB4RThFMTkxNjQsCisweDc5QUREODE5LCAweDEwRDY2MTU3LCAweDVGNjIxQTczLCAweDFDRDA2M0JBLAorMHg2NjY1ODE1RiwgMHhGQTBCNzA4MSwgMHg2RTBGQTQ3MywgMHgwQ0UzNTcxRSwKKzB4QjVFQUVGNDYsIDB4QUEwNENGNTQsIDB4MzM2NjgwQ0EsIDB4REFCQkZGMTEsCisweDIyNTlFNzk3LCAweEI1N0I0NDcwLCAweDExMUVCNEJGLCAweEMxNzFENDJCLAorMHg1ODg5QTdBNCwgMHg0MTlDQ0IzRSwgMHhCRUExRjM2NiwgMHg0MUZFNDE0QiwKKzB4QTY1Q0I4OTgsIDB4NkMyODM2M0EsIDB4OEY4MkZDODQsIDB4REJFRDVBOUMsCisweDREQkYzNTI2LCAweEYyRjM0RTY2LCAweDlEMkM5QjExLCAweDBDMEQ0REZCLAorMHg0REJGNzlENCwgMHhBMjU2RTg2RCwgMHg2NDA3Mzc2QywgMHgzRjNFOEFGRiwKKzB4NDc0QjM1OTMsIDB4RTU1OTY1QzgsIDB4Q0IyMEQzNTgsIDB4MEM2NzFBOUIsCisweDE2OUY4MzQyLCAweEQyRTFDOUU3LCAweEJEREJBQUVCLCAweDkzREYwQzc1LAorMHhGMjc3MDdGNywgMHg1MTA4MzA1QiwgMHg0RkYyQzA2MCwgMHhFQjlDMDhERSwKKzB4REYxMTAyMEUsIDB4RDIyNzEwNDYsIDB4NkQxQkZEMjcsIDB4RUQwMjBDREMsCisweDJDMjI2NTlCLCAweDY5MjA1MEQ5LCAweEQxNEJFMjkxLCAweDNFQkY4RTg2LAorMHg4MzQ0QjYyNSwgMHg3ODQwQjkxQywgMHhCNzAyQkQ1RiwgMHg0OTM1RDMxOCwKKzB4MDFBMjIwMTMsIDB4RjJBMjBCMDgsIDB4NjUxQTFDMzgsIDB4MDA0RkU2MzMsCisweEU1MURDQzA2LCAweEY1Qjg2MTM4LCAweDlGQkZGMTE4LCAweDZGN0IzQ0Q0LAorMHgwMjg5MzhCNCwgMHgwNzFFOTZBRSwgMHhERjMzREM5RSwgMHg3OTAwMUFDNywKKzB4N0I1RDIwRkMsIDB4M0YxMzc3OTQsIDB4ODExNjVCMDQsIDB4OTczRjhGRDQsCisweDBBRTRDQkY1LCAweDdDNDgxODBCLCAweDRBOTZCQzg5LCAweDU4MDY2RTc0LAorMHg4NjY2OURDNiwgMHhEQzU1QTIxOCwgMHg4NThDMzEzMCwgMHg5OUFFQUM5MSwKKzB4MjY5ODNGQzQsIDB4RUU0RDRGMDYsIDB4RDhENkQ2NTcsIDB4MThFRjI2MkIsCisweDM3NEE2MjBGLCAweDg1OTk1RjlDLCAweENDODE0QUMxLCAweDM5RjQ4N0UwLAorMHhDNjI4MTc3QiwgMHgyRkFFMkMzOSwgMHg2NDI1MjVBMiwgMHhDMTQ3NEYyRCwKKzB4QkM3Q0Q0OUUsIDB4RTgxRTEzRjcsIDB4ODNGNDJCREIsIDB4OEFCN0Q5OUEsCisweEE4MDQwQjExLCAweEQ4QUE2OEVDLCAweDk4M0IzNzM5LCAweEVFNDJFQ0RCLAorMHhDOTUxMzQ5OCwgMHhDQUEwNkExNCwgMHhFNDc4NDA5NCwgMHhFNkJFQkI5RSwKKzB4MTNCRTgwMTgsIDB4NTlFM0Q1RDQsIDB4MENGMTcyOEYsIDB4OTYzNDEzQkUsCisweDMxOTUzM0I3LCAweDE0NjYyQUJFLCAweDMzNjNCNDVELCAweDU5QTk5Njg3LAorMHhCQkIwRkRBNCwgMHhDREJCOEIyMSwgMHgwMjQwRjNCMSwgMHgyMjZEQUMzQiwKKzB4MzBFMUM0OUUsIDB4NzZFMDc2RDcsIDB4NEI5MUM1OTgsIDB4QjNDNDZFMkYsCisweDRBNjU3Q0M3LCAweDY2QzM4NzVBLCAweENCQzZGQzU0LCAweEY4MzJFQkU4LAorMHhERDFFQUQzRCwgMHhGRUZEQUY4NSwgMHg4REU1MUI4OCwgMHhBRUFGRDVEMywKKzB4M0U0Q0VBODIsIDB4NTVGNDc5MzQsIDB4OUY4MzE0Q0EsIDB4RDAyMjBCQzAsCisweDVBQ0VGODFGLCAweDcxRkREOEU5LCAweDEzQTE0RUQ4LCAweDZGMUZDMUU0LAorMHg3NTA0NkEwNCwgMHhDNkM0RkRBRiwgMHg0RkZGRjcyNCwgMHhGNDRGRURENiwKKzB4N0UxQzVDQkMsIDB4Nzg0QzZCNEMsIDB4OEQ4NUYyMjAsIDB4MzhCNjVDM0UsCisweDhDOTkyMDUwLCAweDJERTM0QzEzLCAweDlGMkE0NTQ3LCAweDQ4RTU4RjY1LAorMHhBMjgwQjY4OSwgMHg2RjU0MEQ4QSwgMHgxMEI2MUIzOSwgMHgxQzhBMjg0OSwKKzB4QTczMTYzNTgsIDB4REJGQjc4NjIsIDB4MTgyQzU1M0QsIDB4OTJGMDQzODksCisweDFGRTdCQURELCAweDZBNzI0Q0JBLCAweDk3MEJFMDIwLCAweDkzNzYwMDU4LAorMHgyREY5RTBBRCwgMHhDRkYxRjhCMSwgMHgxNzBEODEwQSwgMHg0NUY0RTZBMiwKKzB4MzdBMEU4RkQsIDB4ODZEMTFDNkQsIDB4NEYzQzZBM0EsIDB4NEIxNDQ0NTIsCisweENFOUI4N0ExLCAweDdDMDhDMzBELCAweDlDQjlCMEFCLCAweEQ1NUYyQ0M1LAorMHhGRjk1MTgwRiwgMHhGMzU1MDVCRCwgMHhFRDVCREI5NiwgMHg4NUNBMkU0MSwKKzB4ODcwOEIyNjQsIDB4RDYwNzk3MzQsIDB4Q0E3NkFCM0QsIDB4RkQ2Q0RGNEYsCisweDlBQUI4NDBCLCAweDkyRDNBNUY3LCAweDkzQTkyQzM4LCAweDA0MTlBQTdBLAorMHgxRDUwMDA2RSwgMHgxMjZGNDhGRiwgMHhBQ0RBNDEyQywgMHgwMTEzOTQ1NCwKKzB4OEUyM0M0ODYsIDB4MDFENDRGNTEsIDB4N0E1RjZGMTAsIDB4Mzc3RDRENUUsCisweEI3ODRFNzJGLCAweEE5QUM5MjVGLCAweEI5QzY2Qzc5LCAweDA1NzMzMUU2LAorMHhDRkYwNDBFNCwgMHg3N0U4QTk2MCwgMHgzNUUzMUVFQywgMHhFQjgwN0E0NCwKKzB4ODU5NEZGRkMsIDB4RDI3NjI5QjcsIDB4NURERjUyNkUsIDB4QkNGMkY0ODQsCisweDg4ODA1MDEzLCAweDQxMDQ3ODUwLCAweEI4NTc0RUNELCAweDNFMTUwODJGLAorMHgzMDlDMTZEQywgMHgyOTdCNjkwNCwgMHgzMEMzOUVDQiwgMHhEMjBCNjFBRiwKKzB4NTFBNTc4QUYsIDB4NEUwRDI0QTksIDB4QzYxRkJFNUYsIDB4N0E4OUY0QzYsCisweDk0MzIyOTlELCAweEZFMjYxQjk1LCAweEREMUZDNENBLCAweDA0NEJGQjkyLAorMHg0MUJFNTZDQSwgMHgwQTJCNjgzMSwgMHhFMTM1RDc1RCwgMHhBQjJEMDBBMCwKKzB4QjQzNzQwODAsIDB4RkFBNkRCRDAsIDB4QTcwNEM0QTksIDB4RDgxMzg1QTQsCisweDUxNTMzMzEyLCAweEVENUVEQUY3LCAweEU0RURGQUVCLCAweDc0QjdEQUZFLAorMHg5RDgxMEFBNywgMHg0MEI5MTgyNywgMHg2NTIxOUJDQiwgMHg3NTQzMUMxNiwKKzB4OTREOTIzRDMsIDB4MDBCN0FBNEUsIDB4QjhBODhGREEsIDB4OTI3Mjc4RDcsCisweDdBMjM3Njk3LCAweDQ1QjE0MDk3LCAweDJFM0E1NjJGLCAweDkzMDAzMzIyLAorMHgwQjg4QTVGRiwgMHhEMTNENEFERCwgMHg2RDdCNzU3OSwgMHg3MkQ4MzRDNCwKKzB4MEJDQUEzNjEsIDB4QzAyRTAwQjgsIDB4MTUwMjM1NTEsIDB4NDgxQzVFOTMsCisweDAyRTgxQTE2LCAweDhBODQ2QTMzLCAweDEyMzlBOTcxLCAweDk5NDgxOEI0LAorMHhGQzNEQkI2RCwgMHg0M0M4RDJGMiwgMHhFM0FFNTQ4QywgMHg0MDgwMzJGMSwKKzB4MDJCMDU2MzYsIDB4RTM2MUE2MEMsIDB4RkUyQ0EyOTIsIDB4MDYxRDIzNzQsCisweERCMjg1NTU2LCAweDcwNjI3RUE0LCAweDdGQzY0QUYwLCAweEZFMTAwQjZELAorMHg3MUFFQjNGMiwgMHhBNTY1QTQxMiwgMHhBNjk4NzMxRiwgMHg0OUREOTc2NywKKzB4QzM2MjdFQkMsIDB4NzVGQjJEQkYsIDB4RkRDMEU5NzEsIDB4RjZFRDEyQTYsCisweEEyM0RDMDBGLCAweDg5N0U5MTdCLCAweDdGMjAzMUUwLCAweDE3RENFNTY4LAorMHhERjY5Q0FEMywgMHhDNkZCNUI2RCwgMHgwOTcyNjhCMCwgMHhFMTEwMjQ0NCwKKzB4ODZERjkzODMsIDB4QkQ3QjlDQzIsIDB4QkFBRjdEQ0YsIDB4OTg1QjQ1RDEsCisweDQyMThFOTVBLCAweEIyNDU1RUY0LCAweERCMDE1RjlCLCAweDU0Q0NDRTc2LAorMHg1NkVERjU2MSwgMHg2RjY2Rjk1RSwgMHhGOEIxRUJEMCwgMHhGN0EzOUFFMCwKKzB4RjY2RDgzNDYsIDB4QTQ2NzcwMDcsIDB4MDJDNEIzRUIsIDB4ODI5OTg3QjAsCisweDdDMEUxOTE5LCAweDUxRjcwNjBCLCAweDRCMzBGMUQ2LCAweDg1QTRFMENBLAorMHhFQzA0OUZBMCwgMHgxN0NCRjFFNCwgMHg3QTFBQUQ5NSwgMHhFQkE0QzUxMywKKzB4RTg0NjJFNzgsIDB4NTRDRERBMEMsIDB4RUU3QjgzNzgsIDB4OTg1OEM4QzEsCisweEJBMzM1ODdDLCAweDRENkYxQjE0LCAweDdBMkMwNTI1LCAweDdFNkVFNEQyLAorMHhBQ0ExODY5MiwgMHhERDE4NjgyMCwgMHg0MTE5OEIwMywgMHg4QUM4NUFCNywKKzB4QkQ4NjkwMEIsIDB4MzZFMkMzNTQsIDB4RTY1RjkxMTUsIDB4QjEwNjQ1REEsCisweDc5NzFEMjMwLCAweEM4M0QzNTgzLCAweDhDNjBDODFELCAweDk0REI1NzQxLAorMHg0RkNCODkzNCwgMHg5QTUyMEZFMiwgMHhDRTQ5NDQ2RCwgMHg4ODY0RTY0MSwKKzB4RjVFRjI1QTUsIDB4QzFERUVEMEEsIDB4QzgwNTdGMzcsIDB4RkIzMDVDNzMsCisweDM5MkU2NzBELCAweEE0RDAwRDJBLCAweDM1NkE0NkYwLCAweDJGNjc1NTY3LAorMHhCNzk5N0NGMCwgMHg4OEFGM0E0RSwgMHg1NkM5RDUxRSwgMHhERDc0NkVDRCwKKzB4NDBDRkE0NTMsIDB4NUVBNzQwQ0QsIDB4RTRERDZCQjEsIDB4Q0NCMzE0MjksCisweEEyMjI3RjNGLCAweDE4QTFFQUYwLCAweEMxNTU0MTdCLCAweDQxRkU3MzVGLAorMHgxNkQ0MEIwMCwgMHhDOUY3MkFGQywgMHg4NkIxRDYyRCwgMHg2QTk5QTgyQSwKKzB4MDlEMzMyNDgsIDB4RUM0NDYzOUMsIDB4OUIwQUIyQjIsIDB4Njk2OTE2NEMsCisweEVGNjAyQkIxLCAweDAyMDhGQzZGLCAweEMxMTA5NTc4LCAweDI5OTdBQjg3LAorMHhFNTYyNkIxNCwgMHhDREFGNDhFMSwgMHgyMDc4MTYzMywgMHgyRUJFMEE0MSwKKzB4NzM3OTI2MUUsIDB4RjIxNkY3QTEsIDB4NzE0RDgyNTgsIDB4OTM2RkU2OEYsCisweDE2MDg1NkY5LCAweDJBNEQxNDE2LCAweEI1NThFNDEyLCAweDdEQjE5NkRGLAorMHhEQzg4Q0NCMiwgMHhGMzdBQjYxMiwgMHg3NDIzRjIxNCwgMHhEM0IwNkE0MywKKzB4MjVBODAxMkQsIDB4QzFDNjlGRkEsIDB4OTM2RjJDMTgsIDB4NTZENzdDMTksCisweDc3NEJGQzY5LCAweEY1RTg1RTI0LCAweEQ3OTE1OEM5LCAweEE2N0MzRTE1LAorMHhCOTU4ODE5RSwgMHg2OUY4MTI3OCwgMHhGMkIzNTEwNywgMHhCRjJGNDA4NSwKKzB4MUM5OTdBMDYsIDB4NkMyMzhDM0IsIDB4Qzc1NkQ1NkUsIDB4RDE1QzExNDksCisweDM1MUU2RUM0LCAweDIzMTEzMDNGLCAweDA2MjE2MDJDLCAweEIxMUI2REQxLAorMHhCRThFNTBCNSwgMHgzNEE1RjU4OSwgMHhFNEQzMDhBRSwgMHg0MzQ0QjI5NywKKzB4QTMzQUU5OEQsIDB4MEEzMDNDREIsIDB4Mzg4RUExN0IsIDB4MDEwN0I1QTUsCisweDM4QjM5MDQyLCAweEZFNjc4OTk1LCAweEI0MjZGRTY5LCAweDIyMUZDRjA2LAorMHhDNDU5MjZBQiwgMHgyMUE0MzBGOSwgMHg2RDE5MkQyRSwgMHg0MTY4QzEwQiwKKzB4NUJBNkIxMzIsIDB4MDUxOUVDQTcsIDB4MjExMjc1ODIsIDB4RjZDNDQ3RTAsCisweDBDNzJGQzMxLCAweDA5NDFCM0YwLCAweDc2RjIzODc3LCAweDg2Q0YwNjc3LAorMHhFNzc4NTEwNSwgMHhBNDYzNzg2NCwgMHg5NEM4MkI0NSwgMHhGNjBGRDZBMCwKKzB4NDY5NDFDMjcsIDB4N0EzM0E2OTgsIDB4RTFERjhCRkIsIDB4NTI0OTk3MEIsCisweERGRTY1RTFDLCAweEY0QTRGQjIyLCAweDU5OTYzOUY0LCAweEZFMEU5NzIyLAorMHg3QkI0OEY1OCwgMHg1MzM0NjVFMywgMHg5RTg4NEIzNSwgMHgyNjIwNDI5QywKKzB4Mjg3NUZGQzEsIDB4RjExRUMwQ0EsIDB4NjYzQUY1RjAsIDB4QjJDNTlDMzgsCisweDAzNTU2RUQ5LCAweDI3MUU5RTM5LCAweDg1NTZFMDYyLCAweDA4MjA3NjgyLAorMHhFNTc5N0YwMCwgMHg2NkEzNjJCNSwgMHg3RUQ4Mzk0RCwgMHgyOTIyQzM3NCwKKzB4MjcxNjU3QkUsIDB4QUMxNTA3MUIsIDB4RTI5NjY5MUUsIDB4MEZFMkM3NDAsCisweDE5MTIwRkI1LCAweDlBQkQ4ODhBLCAweEEyMDA3NjJDLCAweDc4MzdGNDFDLAorMHhDNkY0RUExOSwgMHhGMjg2QUJGNCwgMHhGQ0E4OTk4RiwgMHg5N0IwRTdENSwKKzB4MTMzOUM3OUYsIDB4RkVEMDVENDMsIDB4QjMzOTJFNzEsIDB4RkMyQTAxRUIsCisweEI3MjBDQkVELCAweDRGQTcxMzU4LCAweDA0QTU3RjYyLCAweDNENTU4QjBBLAorMHgxREVCNEQ0MCwgMHhDOUM4MjNGMSwgMHg0NzBGNjMwQSwgMHgwOEYyMjk3NSwKKzB4MkJEODUxMDcsIDB4MzI4OEE2MjgsIDB4QjBDODk2NzUsIDB4MzJEOTU3QzEsCisweDgwQjc4NDI2LCAweDk4QTQ2OTUzLCAweEE0OTNBRjYwLCAweEMyQjg0QUM0LAorMHg0ODZENjU4RiwgMHhGRTExOUZGOSwgMHhCMkZFNTY1RiwgMHhFQURCNThDRCwKKzB4MUY0NUY5QjQsIDB4Q0VBRTYyQjYsIDB4NjhFQzcwMkQsIDB4RjUyQURERjcsCisweDBGRkMwNzE1LCAweDQxMjlFNDJDLCAweDk1NkFDNEQ5LCAweDAwMzVDRDlDLAorMHhGOEZFQkFBMSwgMHgyOUM1ODM5NywgMHg3QzJFMkU0MSwgMHg3QkU3NERBRiwKKzB4Mjc5MUQzNEQsIDB4QjZENjdCMEQsIDB4OEY1NTc1MjgsIDB4OURERUVENUIsCisweEIzQUE0QkI3LCAweDA1RTIyRTQzLCAweDRDREE2MDBELCAweDQzMkUyRDMyLAorMHg0MDVEQTVCRCwgMHhBRjIzODE4QywgMHgyRjczRkUwOSwgMHhENDYyNDYyNiwKKzB4NjUzRUZDQjMsIDB4NzdENjVEM0YsIDB4NTFBM0RDQjMsIDB4NzY3RjQwN0MsCisweEM2NjQ1MkUzLCAweDEwQjY4NDJFLCAweDkzQTA4NDBFLCAweEU0NTNBRDEwLAorMHhERTU4RkMzRCwgMHg2QzIyNzIxNSwgMHgxRUUxMzBFQSwgMHhCMEJGNjRCRSwKKzB4QTExRTVEMzgsIDB4MDEzMUI3NTUsIDB4MTkxRjcwRDAsIDB4REI0ODM5NTksCisweEFBOEQyRjlFLCAweDVBMDAyQUEwLCAweEY1QTI5OTZELCAweEZEMEY5NUY5LAorMHhENkExMjg2NCwgMHgzQUE0OEI3NCwgMHg1MEY2Njc5RiwgMHgwQURGNUM0OSwKKzB4RTJGOENFNjgsIDB4QkYyMTNFNjcsIDB4NUU5QUNFRUEsIDB4Q0FDRDBFQkUsCisweDZERjc2NkE1LCAweDMzQzBBMTU2LCAweDcyMDg2OEVBLCAweDMxMTJBMERDLAorMHhCMzgyMzUwQSwgMHgzNjlEOUM1MCwgMHhFOEY4OTBEMCwgMHgwQTEyMTM5OSwKKzB4MkFCNDU4RUEsIDB4NTFDODIzM0QsIDB4QkY0NjQwM0MsIDB4MDcyOENENTUsCisweDIzRjY3NzRCLCAweDJGQjU5REIwLCAweEZBMkNGNzI0LCAweEI0OUZBODQ4LAorMHg1RkZGQTEyNSwgMHhERTJDMEQxNSwgMHg3NkI3OEM0MSwgMHgxOTJCQTYyQywKKzB4NEM5NTYzRTIsIDB4OEY3NDI1MDcsIDB4ODgyMTA0RTAsIDB4MzU3QUQwNzgsCisweDc5OUUyNUEyLCAweEVGM0VEMDIxLCAweDY5RDU0QjQ2LCAweDVFQzU3ODcwLAorMHgwRkY0MThFMCwgMHgwN0M1QUM3RiwgMHhDMUFDQkY5QSwgMHg4MEE4MzBEOSwKKzB4ODM3QzdDNUEsIDB4MDRDMTFEODYsIDB4QzE0QzhCQzcsIDB4OTJCQTY1MEIsCisweDk0RDM0RkE4LCAweERCREQ1RURDLCAweDlFRDJBMDhGLCAweEExRkFFNDg1LAorMHg1RkQ2NkMzRCwgMHg0Q0NCNkY5RiwgMHhCN0FBNTZCMCwgMHgwRkIzQzczQSwKKzB4MDNBRjk2RTYsIDB4REIyRDM4RjksIDB4N0FGMjBENjAsIDB4QjU3Q0JFOTAsCisweDIwRUIyRDZFLCAweENGOTM0NDUyLCAweDgyRUMyNkY2LCAweDg0QjM3MzdBLAorMHgwOTcyRjFCNywgMHgzOUI2REI0RCwgMHgxM0U1M0NDMCwgMHg2N0M0MUQ3MiwKKzB4OTRCQUFDNzgsIDB4NjYzQTlDNkMsIDB4MzY5Mjc0NDgsIDB4Q0ZCQzI2MTAsCisweDk4MEY1M0JBLCAweDdFNTZDOTZBLCAweDA0QzYyREZCLCAweEE0NzFENTc5LAorMHhERjlCMkVFMSwgMHhFMTJERUJCNywgMHgyREI5QjA0MiwgMHhGMEM3NEI5NiwKKzB4NkEzNzYyRTksIDB4RjREQzM5RDksIDB4NzYxQTU4ODQsIDB4RkEzNjNEM0IsCisweDkyNzY2NzU5LCAweEYzRUFENDQxLCAweDg3ODI2OUVELCAweDFBRkZBRkU1LAorMHhDQjQzMjc2NCwgMHhGRTE5NDc1QywgMHhDRjg3NzZEQSwgMHgxRjBBRDkwNiwKKzB4N0Q5OUFDMjAsIDB4QzI3MzE3RkIsIDB4NDM5OTQ0QTQsIDB4NjVEMTRDMkQsCisweDQzRTQ1MjYyLCAweENERTZCM0JELCAweEUyNUM2N0NELCAweDMyMUFBMkU2LAorMHgzNTJBMjc2NCwgMHg1NTY5RUY0MiwgMHgwMDVDMzcwRCwgMHgyOTA4MDFFMCwKKzB4NjE4ODMwMzUsIDB4MkEyREJDNDgsIDB4RTJENTU5RkYsIDB4MDFGNURGMTMsCisweDY5QjYxNTU4LCAweEU5NEJGMzY0LCAweDNDQTc2RkNBLCAweDJFMDE2NDgzLAorMHhEQjY3NUY5QywgMHg0RkE1QjZEQywgMHg1OUE2QzNFQywgMHg1NkM2RTZDRiwKKzB4MjRDRDU5RjUsIDB4NDY5MTE4MzQsIDB4NjgzQjlFMzksIDB4QjVBRjYxNzQsCisweDVDMzFFMjY5LCAweDY3OUM5QTEyLCAweDM3ODdEM0U2LCAweEYxNzI3RUU2LAorMHhCMDcwODgyRiwgMHhGQzM3RUFDQSwgMHhCRUUwNzgzRiwgMHhGNjIxODM2OSwKKzB4MTkzNzI5NDAsIDB4M0ZGN0Q4OTAsIDB4Njk3MzY5MTksIDB4REQ5NjFDQjksCisweDg4MzAxMEYxLCAweDZFNDcyRDVCLCAweDI0NDdFMDBELCAweEYzOUUxRjBFLAorMHgxREJENDQyRiwgMHhCRTE5NzdFMCwgMHhDODY1NUY0MiwgMHgzN0M4NDI1MywKKzB4MzQ4MERBQzQsIDB4NENGRTFEQzgsIDB4RjE1MjFBRDUsIDB4QTQ1QzRGOEMsCisweDg3RkJBRUUwLCAweDNFNDFFOUUyLCAweEY0Nzc3MUU1LCAweDE2Qzc0Q0RGLAorMHhBMzNENDAzNSwgMHgzODUxM0ExMCwgMHhBQkYzMjY0RCwgMHhCOEQ4MERGNiwKKzB4RDlBRDcyNTYsIDB4Rjc4Mzc1QjgsIDB4RDc2NjFDRjcsIDB4MUMzNjNBRjksCisweEQ0MjVGQTMyLCAweDAwMUQ3Qjk4LCAweERCOTZBMUNDLCAweEEwOTJFNjgzLAorMHg2NUNGNTMxNiwgMHg1RjI4MjY4OSwgMHg5RjUyRjkxMiwgMHg4OTU4QTFCNywKKzB4NjQ1N0EzRjcsIDB4QUI0M0ZBREQsIDB4MDYxMzI4QzcsIDB4OUQzMUI1RTMsCisweDc1QTc3RjZELCAweDRBNzY0RDRBLCAweDQ4OENFODNFLCAweDI5ODg3MjE4LAorMHg5QTA0QkREMCwgMHhFRjMzMTA3MCwgMHhCQ0QyRjg4NCwgMHg2QkY2NkE2RiwKKzB4Qjg1MTQzQ0IsIDB4RkE1MjkyNzgsIDB4OUVBM0EzNTQsIDB4NEE3M0JEQUYsCisweDBDQkI3NTYzLCAweEQwMUFFMzVGLCAweEQyQUMzREFBLCAweEZDODI0M0I3LAorMHhEODA1RDk3QiwgMHhDMTYyQTc1RiwgMHgxRDQ5QUM2NywgMHg5RTFCQzM4QywKKzB4MUQwNkFBRTgsIDB4RUFGODBDRDgsIDB4Q0U4MjVERDQsIDB4QUNBM0YwNkEsCisweDgzRDA5MkVFLCAweDNGMkJBQUJDLCAweDI0ODJEMTIwLCAweEYzMDE2ODBDLAorMHg3REFDMzczRiwgMHhGNUQ2MTc4RCwgMHhCN0U5MjE3RiwgMHhDQ0ZFOEMxMywKKzB4OTc2MDI0RTAsIDB4QTJGMzlGOEMsIDB4QjZDNjU3MzQsIDB4MTBBRTUxNEEsCisweDY5NjU4NENGLCAweDI1NDIxMTNDLCAweDQ3OUNCMjBGLCAweDhEM0EyMkUzLAorMHhGN0M0Qjg4QywgMHhGNEY3RkJFMiwgMHgyRjU1MzMwOCwgMHg5RUE3MUUzQSwKKzB4N0I5NThGNDgsIDB4MDkyN0RBQUIsIDB4RjA4OTQ5QjcsIDB4N0NENDZDMEUsCisweDdBODkyQkJDLCAweDg4MkYzMkNFLCAweDM0QzQ5MEM4LCAweDg0ODNFRDA0LAorMHgwN0VCNEVGQywgMHg0QkVCQ0Q4MiwgMHg4M0IxNUVFOCwgMHg4RjNCNzhBQywKKzB4Rjk1RUZEQTksIDB4ODE2QkVCRjksIDB4MjY5QkRBNTgsIDB4RUUzNzMzNDIsCisweEUwOUZEQTlGLCAweEM3NjUxQUFCLCAweEI4RDM5OEIyLCAweEM3RjQ0OUIyLAorMHgwMzEzMTBGNSwgMHhDODY5NzA2RiwgMHhEQTIyRjEyNywgMHg4QzY4REY5MSwKKzB4RTY3NjA2OEEsIDB4Qjg1QUFBQzcsIDB4RDMyRjM1QkMsIDB4RTIyREYwMzEsCisweEZFMTQyQkQ5LCAweEQ0RkIyNzAwLCAweDJEMTk3NzA3LCAweEEzQTQzQTY0LAorMHgwQzAyQjA1MCwgMHhFOTQ1QUQ1NiwgMHg3REVFMEE1RCwgMHgxMDc1REUzRSwKKzB4RDk5QUQ5MUMsIDB4NkE3QkI3MUQsIDB4MTc3NEIzQjgsIDB4MjIyOEIxMTIsCisweDBERUVFODQ0LCAweDM4MDc0RUJFLCAweDZEQUNGNTdCLCAweDdFMDA5NEI3LAorMHhDRTQ2RjhFQywgMHg0REFGMzRGNCwgMHg1Qjk2MTkwNywgMHhDODIzNkZGNywKKzB4RkQzODBBQTcsIDB4NjFFQkE4NEEsIDB4QUU0ODkyRUIsIDB4MEYxQjYzNjUsCisweEIwQzRDOUEwLCAweDA0RTYwMTJELCAweEE1RjkwRDAxLCAweEQ2Qzg4ODJFLAorMHhCQ0I5QzFFQiwgMHgwRTVFMEZFQywgMHg1M0E0Njg4OSwgMHhBMkMwRkE1MSwKKzB4NTIwREE0NTksIDB4M0ZEOTVGQTIsIDB4NkUxRDZGRTgsIDB4QkMwOTMyMjAsCisweEFCMTYzOTBBLCAweDE2M0UzRDZELCAweDBBNjM1MTdDLCAweDNCRjM4RjNELAorMHg4OEExRjY2RCwgMHg5NjI2MzUzNiwgMHg0MTJERjAwOCwgMHgxMkZCMTI2RCwKKzB4NDQ0NDFEN0EsIDB4MzFDOUY3MjYsIDB4RjY2RjYwQ0YsIDB4QUUxNDUzRDQsCisweERBRUFENzFCLCAweDU0RUFFRTBGLCAweDk0OEI3M0JCLCAweDMxRUEzRTc0LAorMHgzNTVENEZEQywgMHgyQTFGM0E5RSwgMHg1ODZEMDhERiwgMHgxMjNBQzJFOCwKKzB4RjVBQzAwNjUsIDB4ODg3NEFDQUIsIDB4MDVCMDNENjMsIDB4MDFCRDZBNEMsCisweDdBNkE5ODgwLCAweDJCQzE2RjkzLCAweEM0MTEyRjBDLCAweDgyODdCNDBELAorMHg0OEVBQkYwOCwgMHgyOUU1Njg2MCwgMHgwRjUwNUM4NCwgMHg0NDdEQzA4QiwKKzB4MTY2NTExOUMsIDB4MDAzNDdFMzcsIDB4NDgyRUYwM0UsIDB4MDFCMTVENDQsCisweEU2QzFCOUZGLCAweEIxNjVFNDM2LCAweDBDRjY5MEY3LCAweDdGQzVCRDAxLAorMHhCNzg0QzdGNCwgMHg5QkUwNEVCQiwgMHg5RjYxNDQzMSwgMHg2QzM3QTVBOSwKKzB4MkQwREI4N0QsIDB4RjY1MTEzNjksIDB4RTExNTA3M0EsIDB4Rjk2QzZBQjYsCisweDA0QTEzQzNDLCAweEJGMzBCMkRBLCAweDkzRDE4RkM2LCAweEY2N0QyRTQ3LAorMHhDQTA4OTE1MSwgMHg1MUE2QkMzOSwgMHg4QzFGQ0E5MywgMHhGQkYyRjJCQiwKKzB4QUQwQTNGMzMsIDB4ODJBQTI3NjcsIDB4ODFCRjIzMTMsIDB4NzU4QTgyQjgsCisweEUxMDM3ODhFLCAweEMwMEM0QjVDLCAweDVGNTJGRjU4LCAweEFCQUQzOEY3LAorMHhEQTY4RUU5QSwgMHg5QjZENDA1RCwgMHg4MDM0NDlEOSwgMHg2MTc4QjM0NSwKKzB4M0M3ODVGQjQsIDB4RkVCQUJFNTUsIDB4MEUyNDU4QUIsIDB4MDIxRjBENzEsCisweDM5MjAxRUQxLCAweDc0MUIxQTdELCAweEUwQjBBRkY0LCAweDQ1NjUyQ0ZGLAorMHg5MDdEQTY3OCwgMHgzMTNBOTNCNCwgMHgwQjBENkIwRCwgMHg0MkM5NkU0MywKKzB4RUVFM0U3RTEsIDB4RTgzQzgzRTksIDB4OTA1MkI4NjcsIDB4Rjk1MTQyNDMsCisweDYxRjIwQ0IyLCAweDU3RTFBQzY0LCAweEMyNDQzMTIzLCAweDQzMkM5NkQ0LAorMHg2MTZBODI0RiwgMHgzQzhEMUUwNiwgMHg4RTY0MjIyQSwgMHg2NUMxQTIxRCwKKzB4ODY4NjMwOEEsIDB4MkE1NzZBMkYsIDB4MUNBMEZGMjAsIDB4MkM4RjlEM0EsCisweEM5OEM5QzY5LCAweDM1MzIyQTI5LCAweERGRDMzQzkzLCAweDk2MzRGNDExLAorMHgwQjRGOEZGQywgMHgzQUVENEIwMSwgMHhFQkJDNzAxMiwgMHhFRDIzODdFQSwKKzB4NDhCRjQyQUYsIDB4RDYwMzk5RDYsIDB4N0E5QjhDQTksIDB4NTM4ODYzMzcsCisweDJEQkI5NDI5LCAweDBBNkFGNzY0LCAweERFNEQ4Rjc4LCAweDFFREVDRUU0LAorMHg0RjhFRTk5RSwgMHhBRjIzRUFGRCwgMHg5Mjk1NTBCMSwgMHgyQ0JEODYyMSwKKzB4MjJBOEZBQTIsIDB4QkUyQTBBOEQsIDB4MDZGN0U3OTQsIDB4MTZFMUYzRUMsCisweDA5M0FBRUFBLCAweDkyRDQyOUY4LCAweEJCNzlBN0U3LCAweDQzRUY4OUJCLAorMHgwRTA5NzUxMSwgMHg3NDhFNjhCMCwgMHgzMjJDMDBBQywgMHhBNjJFRjQyQSwKKzB4RDAzQkI4QkMsIDB4OUZGNjc4MTAsIDB4REUyNEJGMDMsIDB4MTQwQ0E2RkQsCisweDY4RjE2QjQxLCAweDFCN0M2OEM3LCAweDMyNjQ2MzQyLCAweEM1RTcxNEY4LAorMHhFRkZGRDJCOCwgMHgyNzg0MzYyOCwgMHhGODQ0NUY1MSwgMHhCOUU4NTE5QiwKKzB4OEVCMDFEMDQsIDB4MzU2RkJGMkYsIDB4MzJFOTZCQUQsIDB4NkE2MjlCREUsCisweDUyMDYzMzEzLCAweDIwMDA2OUIwLCAweEUxNjFDRjcxLCAweDg0RkI3QTEyLAorMHgxODA1QURDMCwgMHg4MEY3NTAxMiwgMHhGRTlFNjI5RSwgMHg5MzM5NUMzMywKKzB4RkYwNzVBOTEsIDB4QjYxRTQ2QjgsIDB4Q0E5RkU3QzgsIDB4OTdEQ0NCQ0EsCisweENFRkZCNkY4LCAweDMwRUU3OTg1LCAweDFGQUJDODI5LCAweDIwQjNGNTdCLAorMHgyNzA0MkIwNywgMHhFMTJDNTE1MSwgMHgyMzQ4MkI4QSwgMHg3QjlCOEVCMiwKKzB4Qzk5N0ZFQjMsIDB4NzZBQjI0OTcsIDB4RDVDREE1OTAsIDB4OUVCRTkwRkQsCisweEUzNzMyQjE4LCAweEZGMjhDRUM5LCAweEM2NTgyMzIwLCAweDZFRjEwNkZBLAorMHg4RUQ3NDAyMywgMHgxQTBCNjlFNSwgMHg0QTk1REQ5MSwgMHhCNDFBRjgyQywKKzB4ODNERjY5RDMsIDB4QzU0ODg2MUMsIDB4MkY2MEJBOTMsIDB4RkM4MTU5ODQsCisweDFBODQ4QjY3LCAweDFFQUU4N0M0LCAweEY3NDc5MTAzLCAweDhFMTZEQjUxLAorMHgwNDBCOTVCOSwgMHgyQTlEQjgxMiwgMHg5ODdBRkNEMSwgMHg4NjZERjQxMywKKzB4QkY5NTU4RUQsIDB4QUNGMUFGMkYsIDB4QTY1MzA1Q0MsIDB4MTY4MzM2RjMsCisweDFFNTlCOTdGLCAweDNGOUY0NDdDLCAweDNENTRCMzBELCAweEU5MzlENTk4LAorMHgzNkE0MDg4NSwgMHgwMjM5Njc5NCwgMHhFQjBGMEE2NywgMHhDRUFFQTEyRiwKKzB4QzU4QjRBQzgsIDB4RTZENDk3NjAsIDB4MEY4RjI3NzYsIDB4NjZBOEY0MzYsCisweDMxQkFDRDdELCAweDM3Njk5M0RFLCAweDMyQkQwNDMxLCAweDY4QkRDNzI4LAorMHg2M0VBNjc0OCwgMHhFNkIwMEUyOSwgMHg3NDQ4Q0FCQywgMHg0MkE2NTE3RCwKKzB4QkIxMzEzQzQsIDB4QTA0REM4RkYsIDB4M0Q0MDIyMzcsIDB4QTM4MjY0NUYsCisweDUyRUQ1NUQ2LCAweDkyRDdEN0I3LCAweDU0MTIzMEZGLCAweDdBRkMwNDIwLAorMHgzREM0NjI0RiwgMHhEOUIyMTkzRCwgMHhBNzNCOTcwNCwgMHhCQkRFMEZGMSwKKzB4OUVCNTY2MTUsIDB4OEFCMDgwQjYsIDB4M0M0RDhFMTQsIDB4NTAwMUI0M0QsCisweDFFQkZBQTIzLCAweEQ0QUFDRDI3LCAweENGQUFCNEJCLCAweDZGRkVFNjFGLAorMHhBRTVBNzQyNiwgMHhEQjk0Mjk0OSwgMHg0NTJDMEIxNiwgMHg3MzhFMDYzNywKKzB4MzZBNTEyMkQsIDB4RkYxRjdBNEUsIDB4NzQzRDM1Q0YsIDB4ODQ3RDU0QTksCisweDQyQzNFQUJBLCAweEQ0NjcyOEM1LCAweDMwQjI3MDhELCAweDRGNkJFMEJDLAorMHgzQzI2NzkwRCwgMHhCMEI2N0M4QSwgMHhFRTA3RUZEQywgMHg5RTM4MDYxMSwKKzB4RUFENjgwNEMsIDB4NEVGNjYwMjQsIDB4ODQ1OUFFMzgsIDB4MURFQUFGRkIsCisweEY3NjU3M0FFLCAweDZDQjFDOEYwLCAweEZGQ0MyNjdFLCAweDI2QTIxNUY3LAorMHgwQjFBMDU3QywgMHg3REFCOUNCNywgMHhENDBCQ0JBOSwgMHhFNTYxRjlGRSwKKzB4QTQ0MDEzQTYsIDB4N0IyMkMwQjksIDB4OTk4QTkyMUYsIDB4QkQyNTI0NEIsCisweDE1RTA3RkVELCAweEYxNUIyRTMxLCAweDU0RTgwMDE2LCAweEExMkJDRTdGLAorMHg2NThBMjA5MywgMHhCNjQyQzQ3QiwgMHhENzMxRkMwMCwgMHhDMDBFMzAyRCwKKzB4NTVCMjUxREMsIDB4MzQyOTM5RUIsIDB4NkVBREIyRjcsIDB4MENGOTMzMTgsCisweDYxRUJEODVBLCAweDk5QjcxNUVGLCAweDY3OUM4RDNBLCAweDlDQzFCODAzLAorMHhBQkVGOTU1RSwgMHhCOENGRjlENCwgMHg3MDdBODM5RiwgMHhGNUQwMkE3RSwKKzB4NTlFMEQ5MDMsIDB4NUE0MjVFM0IsIDB4QkI2MTE2M0MsIDB4OTZFQ0U5QUEsCisweDc5N0I4MkFBLCAweEE5RkE2QkI2LCAweDc5N0MwMERDLCAweEMxQzFGQzRDLAorMHg4RjdGREE2NiwgMHg3NzkwMjUxNCwgMHg2RDFCODQzRCwgMHg0Rjg4MUZBNCwKKzB4QzI0QUQ2MjUsIDB4QkMyMzdBNDUsIDB4OUEyRTBGNDQsIDB4ODJGQUEzRjMsCisweEQ3MEUzNDg5LCAweDRGMkIzNDE3LCAweDY1Q0Y2NUU0LCAweEVBQUU2QTkzLAorMHg0QkVBRUMyQywgMHg0OTE4NzIzRCwgMHg3RDhGMzBCNCwgMHg3NzA2RjU5QSwKKzB4Q0IyQTc0NTIsIDB4NTA4M0QyRDYsIDB4NDcyNEI0MjYsIDB4ODRFQjE1REMsCisweEJBQTJDNkNGLCAweDcxRkE5ODRBLCAweERERjdBM0RGLCAweEIxMTVCRjFBLAorMHgyNThBRjBFMywgMHhBMTYzN0Q4NywgMHgwMzU4NURGOCwgMHg1RUE0QjgwRCwKKzB4ODY0MUYzMTgsIDB4NjZFRTJGMjQsIDB4QzgxRTUwNUUsIDB4NUU2NDA2MzksCisweERCNzczOUI4LCAweDFBM0I4NjFGLCAweDBGNUVDQzUxLCAweEIyMUMwMERELAorMHg2ODBGRjMwQiwgMHhERTY5NzQ2OCwgMHg1N0E0M0IzMywgMHhEN0VGNkIzQiwKKzB4NEJGQzdEMjUsIDB4NzEwRjA3NTIsIDB4QUJBQTk3NTIsIDB4Q0ZDRkQ4NEQsCisweDNCQ0MxQ0RDLCAweDIzODFDNTI0LCAweEI2MENBRDkyLCAweEUwNUJDMUFBLAorMHgyQjg4N0Q4OCwgMHhDRDQ1NjZDNSwgMHgwRDI5NzZFNywgMHhDQjAwMEEyQywKKzB4NjY3QkVDRjYsIDB4RUZDN0YyMjEsIDB4N0E3NTg0RDEsIDB4QzQxRDhCMkUsCisweEQ5QkI3RDNGLCAweDdDRUI1NjI2LCAweDdEODE2NUEwLCAweEVFMTc4Rjk5LAorMHgzRThBOENCNywgMHg2OTNENDUwMSwgMHhCMEUyMjhBNSwgMHhENTVCNzNDMSwKKzB4QUY5MDQzQkYsIDB4NkM2MjdBMkMsIDB4N0I5RjQ5MEMsIDB4N0VBNjE4OTksCisweDkyQjk4MEFGLCAweDZEMTNDNzU4LCAweDJDMDA3QzczLCAweDc0MzM2RTBELAorMHhBMzlGMTNBQywgMHg1MzNGMDVENywgMHg3NTUzNkNGQiwgMHg5NzA4REUyNywKKzB4RTJBMTRFODcsIDB4MzY2NzNGRUYsIDB4NzFCQTY1NEYsIDB4Qjk4Q0QyRkMsCisweDI3RjI5QTZFLCAweDgyNDc4MTcxLCAweDFDMjgxNUYwLCAweDhBOEY0NTQ5LAorMHgwNDhBOEQ5QiwgMHg3Q0VFNTFGMiwgMHhBMTY0OEFDMywgMHgwMDRGOEI4RiwKKzB4QjZGRThFRjAsIDB4NkQxMEEwQTEsIDB4QUQ3QTI0RDgsIDB4NzUwMzk3MTcsCisweDk3ODQ3Nzg2LCAweDI3OTFDQzA1LCAweDY5MzdGRDZGLCAweDYwRjk4MTE1LAorMHg1RkFCNkQzNSwgMHhDMDU1MEE3MCwgMHhDMEY0RDgxNywgMHg3QjVCRkREQiwKKzB4RUY2M0I0RDIsIDB4NkM4N0M2QzUsIDB4OTU2RDZCODcsIDB4NjkxNzkyNTcsCisweDEwOTczQzkwLCAweDhDREJFODYwLCAweEM3Qzc2MUVFLCAweEY4MjNFMzRFLAorMHg2RkEyQ0YzQiwgMHhBOTAzQUJDQiwgMHhDODJDOUIwMSwgMHg2MEZFOTZFNiwKKzB4RTVFQzMzQzAsIDB4NzNBMzAxMUMsIDB4MkExQjkwNTQsIDB4Q0YxNkY5MkQsCisweDRGQUY2Q0M4LCAweEQ5REQ3NEZFLCAweEIzQzYzOUVELCAweDNGNDdBRjYzLAorMHhDOEU5OUQxMiwgMHg5MkQ5NTk4NiwgMHg4MzVBQ0E2RiwgMHhENTI5MzBBMiwKKzB4QzdERDU0QTUsIDB4NjE3RkREMTUsIDB4RTlBNkQyOTUsIDB4RjU2QzYwODcsCisweDc4MTNCNjYyLCAweDFGOEVBMjQ0LCAweDFDREUzQkFELCAweDU4RkMwRjdCLAorMHgwMkUzMUE1QSwgMHhBNzhFQUM3NCwgMHgxMEMwNjEwNywgMHgyMkJBM0M2MywKKzB4Rjg0QUQyMjQsIDB4NkE4QkY2NkMsIDB4MkE1Q0FBQzUsIDB4OEFEQzNGQjUsCisweDk2ODM0NTFBLCAweDFCNTJGQ0I0LCAweDk1NDkxQkE1LCAweEZFNkMzNzEzLAorMHhFOTA5OENFRiwgMHg3M0MwMUVGOSwgMHg2RTg1RUYxQSwgMHhFRTE4OTc0MywKKzB4MkU5RTUyODYsIDB4QzFGQUE2NjUsIDB4RDg2MUUzODQsIDB4NzAxQzgzNEQsCisweERDNUNBNUNDLCAweDUyQTNBNkM0LCAweEYyQUYyQzQzLCAweEMzN0M2NDY1LAorMHg2RTk0QUQ2OSwgMHg5ODgwOEFGNCwgMHhFRDhBOTlGMiwgMHgzNzcyNTdEMywKKzB4RTYwRjIwOTYsIDB4NjE1RUZDQjgsIDB4NjdBMkJCM0EsIDB4QjREREQ0MEYsCisweDFENDdGOTE4LCAweDg2Rjc3RDZFLCAweEZEMDVEMkI4LCAweEUxOEMzMzBDLAorMHhBNDgyNjBBNCwgMHg1NjE1QjgzQiwgMHhCQ0Q3RDg1NSwgMHhGODA3MzIxOSwKKzB4ODYyMkJCODksIDB4RDM1Q0UwNUIsIDB4MTcxNjI0ODMsIDB4MTM3QkRCNjksCisweEVDRDBGMjI2LCAweDYxRjg5ODJBLCAweDNDMTBBQkQ0LCAweDJGMzNBQkY0LAorMHg5MzU4QjU0NywgMHg1OEIyNzdBNywgMHg5MjQ1NkE3QywgMHg0Mzg0QjQ5QSwKKzB4NUYxRkYwRUMsIDB4QTE1M0VBNEQsIDB4QThFNDkxMDAsIDB4RDNBNzU3MjMsCisweEQxQURDNjA2LCAweDc2QzMxNEI3LCAweEJDNkFCMjI3LCAweDI1NzMxMkFGLAorMHg4QjZBQTFFMywgMHhEODdGRjVFOCwgMHgyQkFFRDM3MywgMHhDODQ4QUI2MywKKzB4QjcyQjFFNUUsIDB4NzMwQTczRDgsIDB4NDkxNUU1QjYsIDB4REY3RDc3QUQsCisweEVBRTI0N0Q3LCAweDk1NTZEREE4LCAweERFMEM5QzQ3LCAweEE0RTMyOTZFLAorMHgzMUY1QkM5NCwgMHgwNTI1OEIyNCwgMHgyODM3Mzc0RiwgMHhDN0U0QzgxQiwKKzB4NUExQUM4MTksIDB4MDY4MDc0QUUsIDB4REY4NzY3MzIsIDB4QzAxOTJFRjksCisweDdGRkQ4NEQ4LCAweEZGMUNFMTQ4LCAweDgyMUI0QUEzLCAweDU2Njc0ODM4LAorMHhGOUExNDdGNCwgMHgxODJFRjU4QiwgMHgxNkUxNzE3NCwgMHhERTI3MDI5RSwKKzB4OEJFQzU1QUQsIDB4NDA2NDZGODksIDB4REJGRjkyRkMsIDB4OUYyNEMwMTcsCisweDcxMUVBRDE4LCAweEE2NjNFMUVGLCAweEVGOTJGNjg0LCAweDRCRDA1RTY3LAorMHg3RTA4OUIxMywgMHhDQkY2MTlCRSwgMHhDRUJFRjIzMSwgMHhDOTQ3NTg2QywKKzB4MEY1MjZDNDcsIDB4NjY3MjYwMEYsIDB4REFBQjYzREQsIDB4OTUwRDRGRDAsCisweDE5OUMzRUMyLCAweDBGMjAxQzlELCAweDA2QkNDOEQzLCAweEE3NjcyQzZELAorMHhCMzlDN0QwQywgMHhDNzRCMDgwNSwgMHhDOUJCRDI0OSwgMHhBQ0RENTM5NiwKKzB4QUI3QkRGOEUsIDB4MTIwMTJCOEUsIDB4NjcyMzYwNDcsIDB4MEFFMDc0MUIsCisweDFENzQ3RTU2LCAweDdFQzZDMDBDLCAweEQwOEU4MzQxLCAweEIwQUJEQUQ2LAorMHg0RkE0QkRGNiwgMHg5MENFOEQwRSwgMHg2RTczNDExNywgMHgzRUY5MTkyRSwKKzB4QUNBMzJEQTIsIDB4RkRCOUM1OEUsIDB4MjU2NjI2QjUsIDB4NUVBOTYxQjMsCisweEZCQzE1Nzc2LCAweDM2NjAyQjVGLCAweEY4RDA4NjQ0LCAweDVCNjkzQzIzLAorMHhDNjJFQTNCMSwgMHhDNjY0QzdDMywgMHg3M0JFODg1OSwgMHgxN0Y0NEU4RiwKKzB4RjlCOEQ5MjMsIDB4RDE2OEEzQTUsIDB4NkNDRDExMEMsIDB4RDM1MzE4MUYsCisweEMwRTc3NEVDLCAweDVGOUUxMjdDLCAweDZDODI0NTExLCAweEZEQTEzNDk0LAorMHhDQjU4OEJBNiwgMHg0NzE0ODY5NCwgMHhBQjg3N0U4NywgMHhFOTdGNzU3QiwKKzB4RjU0RDBBMkEsIDB4MEZFMTE4OTEsIDB4NUQ4NzQ3RkIsIDB4RTc4MDBDN0UsCisweEVGOTYyOThGLCAweDQwMEY0NThBLCAweEUyRDA0NTE4LCAweDRCNEU2RUZDLAorMHg5QjE1MDAyQywgMHgzQ0UxQjUzNywgMHhGNUFDQjlCOCwgMHg2NzAzMDY0NywKKzB4NDc1RkQxNDgsIDB4MUUwM0E0MEEsIDB4ODk2QzdDMDUsIDB4ODVGNzBCNjgsCisweEM1OTBDQTg0LCAweDUzQjU0NDBFLCAweDE0MDBGNzhGLCAweDNBQkU3RjhBLAorMHgxOUNBNjdGRiwgMHg2OEI1NEEzNCwgMHg1NTU5ODhBQywgMHg0QUIxNkI0QSwKKzB4NzUxMUZBNjMsIDB4MjQ4RUM5RUMsIDB4QzI1QUZFNEYsIDB4MTlGNTc4RTEsCisweEU5MkFGMDNELCAweEFGOURFMThGLCAweDI3OThDN0E3LCAweDZCNDY5OTBGLAorMHg0MUQ0NTg5NCwgMHg3NDY5NkEwQSwgMHhDNkFBRjVGOCwgMHg3MkNDMTBFMCwKKzB4REI5Q0EyODMsIDB4RDZCQkQwRjMsIDB4NThFQTRDMDYsIDB4REVBNUU4QjksCisweDE5MDhFQkRCLCAweDk1RDMzREQ1LCAweDIwRDcwMTNDLCAweEU3MjVDMjgyLAorMHhGRDQ4QzkyRiwgMHhEQkJBN0QxOSwgMHhDN0JFQkVBOSwgMHhCMTg2Qjc5OSwKKzB4REQwREQxN0IsIDB4RDgwOTBBNDEsIDB4Rjk4QkMyMEIsIDB4REQ3RTRCOUQsCisweEVCQUU0MjQ3LCAweDQzNzZGREM0LCAweDdGM0VGQUM2LCAweEE5QjlBOTUxLAorMHg0QUUzOTBDNCwgMHg2NTE4NjNBRiwgMHgyQ0Q0MkRCQywgMHhDMkExMzk2MiwKKzB4RUYwRkM0NDMsIDB4QUVFNjMyNDYsIDB4MDlCODNFMTksIDB4QzNDOTQwQUIsCisweDAwQjEyODI2LCAweEMwQTMwNDEyLCAweEZDRjZBQkNDLCAweDNDRkU3MjFBLAorMHg2MkMxRjRDNiwgMHhFOTYzQTM1OSwgMHhBRTExRjNENiwgMHhFNDkwRDEyQSwKKzB4QzQ1QzkyOEIsIDB4MDVDQ0E3OEEsIDB4MTk4MkU5M0YsIDB4NTc3RjgxQ0EsCisweDY2RDUwRDZFLCAweEI0QzcwMzBGLCAweDkzMDkyQzNFLCAweDExOEIwOEZGLAorMHgxNzg1NDVCNywgMHhFRUQ3NDgzOCwgMHhGN0QyQ0U0OCwgMHgyMzg5NjlCQywKKzB4QjhFRkFFQUUsIDB4NzU3MjZBM0IsIDB4QjFFMDIyMEYsIDB4QzRENjBFQjYsCisweDBFQkMwMjQzLCAweDVGRTBENkNBLCAweDM1NDU2QjQ1LCAweDFGNjRBQzJBLAorMHg1ODQ4NEExRiwgMHgyQTExNDU1RCwgMHgzM0JDNDQwMywgMHg1NkU0RTYyRCwKKzB4NjBCNDFFMkIsIDB4REI2NUQzRjgsIDB4N0VDMThEMzQsIDB4RjU3NURDODUsCisweDZFMEI5OTk1LCAweDFDMTRDOTFFLCAweEIyQTk0NzE4LCAweEFFQzRBODIzLAorMHg5OTNEMzc0RSwgMHhGMUU0MjEwQiwgMHg4Q0ZDQzAzQSwgMHg5OUJEMUMyOCwKKzB4QTkyOEUzRjksIDB4QkI5NTdEMEUsIDB4NzdDODY1RUYsIDB4N0ZGNTBBNDUsCisweDQyNzlBNjM4LCAweEU2MjhGRkExLCAweEJDQ0ExNzFFLCAweDI4NEM5Q0VDLAorMHhBNDc2RTM0NiwgMHg3RTJGOUMwOCwgMHhCRjY1MDQ0RiwgMHg1QjdDM0Q1QiwKKzB4NkU2MEVFNUQsIDB4RjVDOTk1MDksIDB4RkEzNTJCN0UsIDB4NkZERThFOEEsCisweEYyMzQwRkUxLCAweERGNTQyQjZDLCAweDUxMENCMzBCLCAweDM2N0U3MDE2LAorMHgxOThBMEE5NSwgMHhBNERGNTA4RSwgMHg1OTNDMjMzOCwgMHhCMTJCQ0RFMSwKKzB4NTU0QUQzQzAsIDB4NEREQUIxQzEsIDB4RDJCRDE4NTAsIDB4RjZFMTI2Q0EsCisweEY4NzI4OUM3LCAweDg2RUM5MkE1LCAweDRFMDMzOTA2LCAweDUyREM1RjNGLAorMHhDQzZFMkU1OSwgMHhGRjc1MTc1MywgMHhERjhCOEJBMiwgMHhEQkY1OTU0QSwKKzB4QkQzNjc0ODgsIDB4NkEwQ0RGMUYsIDB4NDEwMzEzOUMsIDB4REU0OURCQjAsCisweDVBODQyOEY0LCAweEEyNjg3MkIxLCAweDk2QkY3MjAzLCAweDk5RDVFNzhFLAorMHgyNDM4NTBBNiwgMHgzODlEQUQ4MCwgMHg2MzM1RDMzRiwgMHhFQzY3QjBBNSwKKzB4MDI5QzBDQTksIDB4RjVGNkY2QzksIDB4REY1NzRDMTUsIDB4RTZEM0VDMjksCisweDFBQTM0OUJBLCAweDQ1M0U3MjU4LCAweDdEQjc5QkUzLCAweDUxRkNBN0Y2LAorMHgyQjQyRkNBNSwgMHhCRjBFNDg3MSwgMHg1ODA2M0M0MCwgMHgxOTM1ODBFMiwKKzB4MjU2MDUzMjIsIDB4QkM0OUM0NzksIDB4MEVENzBGQzQsIDB4QTc4QjU5QTAsCisweEU2Q0UzRThDLCAweDkyRUU2NTdBLCAweDYzRDEyNTI5LCAweEY5NURBRjQ1LAorMHhGOTJDM0JGMywgMHg3RDUxNDIwMCwgMHg2OTRERjg0QSwgMHhFRjE3N0UyRCwKKzB4NEUxMTlDQ0YsIDB4QTAyNUM1NUQsIDB4Rjk2OTc0RDYsIDB4MjZEMTNFN0YsCisweDc5OUFEQzI3LCAweEQ3OTI1RUMxLCAweDhBRTYwQkY3LCAweEY5RUYxQTJFLAorMHg4OUVBREQzQSwgMHg5QzI4Q0FDRiwgMHg2MzM3N0VCNywgMHg2RDFFRjdFNSwKKzB4NjU4NUIxNkMsIDB4OTk3MkQxMTUsIDB4NjVGOEY1RTYsIDB4RjkzREVDQjQsCisweDZENzE2MDVELCAweEM2RkRCQ0I4LCAweEQ5MzdCQTMxLCAweENFRDcyN0VFLAorMHhDMzRDNTYwNSwgMHgyNUZBNzBCNiwgMHg1QzBCN0ZCMCwgMHg4RjkzNDBGNSwKKzB4QTMzNzY2OTMsIDB4NDQ5OEI2NkEsIDB4MkQyMUYzNzcsIDB4QzBBNEM2RUEsCisweDA3ODA3MzZCLCAweEY0MkQ3RjA3LCAweEU1NkQ0N0U1LCAweEI0OEMyNUQ2LAorMHhBNDhEQTBEQSwgMHhGRTY5NjkzRiwgMHhGMDFFMTlDQSwgMHg4QTBDNUM4RiwKKzB4REY3MDJDMjMsIDB4RTE4QTkzRjAsIDB4RDRENUM5MUUsIDB4RDJBNzA2RjcsCisweDY3NEY5RTI4LCAweEFGMEY4MEM3LCAweDY0OEQ0OUU4LCAweDZCRTg2NDBGLAorMHhGNUZDRkZENSwgMHg4RURDMzkxRSwgMHhFNTgzRDhCQywgMHg4NDI2QzA5MCwKKzB4RjQ1NkEyN0QsIDB4MDcyNDlCRjQsIDB4MDU0QTJGNDUsIDB4QUM0NkI3M0IsCisweEI4OUVFREZCLCAweDQ4RUFGODY3LCAweDY5QjJEN0NDLCAweENBMENBMEYxLAorMHgzOENEMDQyOCwgMHgwMjk4MDhDRiwgMHg4NkVFNzVEQywgMHhGNEZFRTlGMCwKKzB4Njk4N0Q1RTksIDB4NTZBQjU1MzcsIDB4M0RERDA5NDAsIDB4NDc0MkZGODksCisweDJDM0IxNzlFLCAweEQwNUI1Q0IxLCAweDNDNEU5MDMzLCAweDZCQ0YwMTQxLAorMHhGMkY2RDNFMiwgMHhBRDI5N0IxRiwgMHhCMUNDMjNENCwgMHg1NDUyMDM4QiwKKzB4MTc1MUZDQkUsIDB4MjRBQTQ2NUYsIDB4OTRDNjJEMTgsIDB4RjQ5QjJFQzgsCisweDk3QUM0N0RGLCAweEQ2NkMxOUI1LCAweDA5QUFCMjk3LCAweDg5OTM2MTQ0LAorMHhEMTVDMDI2QiwgMHg0Q0VDODc3OCwgMHg5NDA1MEQ2MSwgMHhEODEyRTk2RiwKKzB4QjZCRDdCMTIsIDB4QTVGOUJFNzcsIDB4NTMxQTVDN0EsIDB4MzYwNUJBNzEsCisweEQ1MDBDRTU0LCAweEUzMjU5NjRDLCAweDMyMzQzMkZFLCAweDU4MEE5REM4LAorMHhEMjVBMzEzNSwgMHgwODlENkM5QywgMHg1ODg1NkY3MywgMHg3REZDRUUzMCwKKzB4N0RFMjU4MEYsIDB4RjRFNDQ4OEIsIDB4NzE4MjFEREYsIDB4RDE5NEY1REMsCisweDdEMDcwMzk0LCAweEJBMjhCRjc2LCAweEFBRjBBMzhFLCAweEQ0RjYyNzVFLAorMHgxQjc0MkU2NiwgMHhEOUU2OEVBOSwgMHg2OEIwRjkzOSwgMHg1MkFGOUQ3QiwKKzB4NTRBMzk3MDUsIDB4MjBGODQ0QzEsIDB4RTY5ODFEREMsIDB4ODAzMjJFNjIsCisweDUzNjIzNUI5LCAweDdBNTdGNEZDLCAweDE0RUJGMzc2LCAweDY0QkUyRTVBLAorMHg3MEExODkxMCwgMHgwRkUwOTU4NywgMHgxMEU5Q0E3OCwgMHg4RjkwRDNEMiwKKzB4QUU3NDcxN0QsIDB4QTU0NEVBRUQsIDB4Njc0NkFGM0UsIDB4NDMwQ0IzRkMsCisweEJDMTg1NTc2LCAweEVBQTM1REMzLCAweERBNjMwOUQyLCAweDQwNjQzRjg3LAorMHg2ODg1OTExNywgMHhBMTdBQzg0RCwgMHhENzkyMkNBOCwgMHhFRjdDMEJFRiwKKzB4ODMzMzczNDgsIDB4OUI0QjE3OTAsIDB4ODg3NkE3N0UsIDB4RjI5M0M5QzcsCisweDIwRDM5OUNELCAweEE3ODIyNEJBLCAweEZEMTI3OUM4LCAweDhCNzgzN0MxLAorMHgwRjFERDQxNSwgMHhBRTNGQkQyRSwgMHhDNEY3N0I1MiwgMHg1MUU3OUZCMywKKzB4N0E4NTZEOUQsIDB4MTRCRkRBRDcsIDB4OTkzRkI2MjUsIDB4NjY3QzY1RUYsCisweDMyRjgzMzM4LCAweEFBMDZFRENFLCAweEFDRTdBMDk5LCAweEQyNkRBRTg5LAorMHhEQzY4OTFDRSwgMHhDRDJGNkYwNCwgMHgyNzQyNUZCOCwgMHg3QzMwMUQ4RCwKKzB4MUVERUJFMUEsIDB4QkU1NDBBRjgsIDB4MUQzNTZDNkEsIDB4OTYzRTg2MzksCisweDk5MjBDQTU1LCAweERFRkU1RjQ0LCAweDEwN0Q1NTQ1LCAweDNEMDc5QkU0LAorMHhFRjY3M0Y2NiwgMHhEQjNDMjk1NCwgMHhERDc2RDY2NiwgMHgxREZCRUY1OSwKKzB4OEYzODRCMzQsIDB4QkU2Rjc3M0MsIDB4MDc5REQxODcsIDB4MjMxNEFDOEIsCisweDVGRUIwMTE0LCAweDU5RTg1Q0YzLCAweDlCRkU5MTkwLCAweEIzNjBBMzFCLAorMHg0RjdFRjk2NywgMHhGRUIwRDU2MSwgMHhCRkU3NzlGMiwgMHhGMzM3MDJCMywKKzB4QkIyNjM0MTcsIDB4MDk2MDdDNjUsIDB4QTg3N0YxMDksIDB4QkI0M0NGRjEsCisweDRBMTkwREIyLCAweDlCN0JEMzhGLCAweEFFQjdDNDQ5LCAweDNEQjNBNDYwLAorMHg3RDkyODUyMiwgMHhEMThBQzk2NiwgMHgxODdGRTc2NiwgMHg5NzYyOTc5MiwKKzB4RjU5RDUwNkUsIDB4NkZCQTIwMkMsIDB4NzcwMzVGRjMsIDB4REEwNjhDREUsCisweEUxOTU3NzlBLCAweEFFQjkyMjk4LCAweEQyQTQ0RURELCAweDEyNTc3RDg1LAorMHhBM0I0N0I5RSwgMHg1QkQwN0NCNywgMHg0QjZBRTNGQywgMHhCRTM1QjZFMiwKKzB4OUQ3RjdBRjIsIDB4OUEzOEVBNzUsIDB4RDg3RkIwNTUsIDB4MzMzOUYyQTMsCisweEQ3Q0I4MkI0LCAweDM1NzcyMUU0LCAweEJFRjQ2NTUzLCAweDlERTI4Q0EzLAorMHgxQjFFQzJERiwgMHhFMjlCOUNDMCwgMHhFRkFFMzQ3RSwgMHhFNTg2NDkxNywKKzB4QTA5N0I3MTIsIDB4NkI2NzA0MUUsIDB4NUIyOTU0MkYsIDB4MDFEOTZFRUQsCisweEY5QTZEQzA3LCAweEMwQjVFM0YwLCAweDIxRTE4OTlDLCAweEU5MzczQTg2LAorMHhGMzE3NjUwOSwgMHg5NTA4NDRBMiwgMHg3RDI0RkZFQiwgMHg1REMwQkNBMCwKKzB4QzQ0MkI3QzEsIDB4MzdEQzZFQzEsIDB4QzY1QzhCQTUsIDB4MThGMEZBODUsCisweDJBRDgwRDJELCAweEM2OENEQ0JCLCAweDZBRTVFQzkzLCAweEUzOTU1REJELAorMHgzRTgwQzRCMywgMHg1MEZFRDEyNywgMHg3NDNDQUJDMCwgMHhEMEU5MTcwNywKKzB4OUJGN0VCNEIsIDB4N0E2MzI3NTUsIDB4OUExOTI0ODIsIDB4OEY5MjNFOUUsCisweEUyRTcwRkU1LCAweDVGNTBBQTE2LCAweDBFQzQ5NkQxLCAweEM2RUM0ODYyLAorMHgwNDBBMDI3NCwgMHgyRkM5NTFDMiwgMHhGNjVEM0E4MCwgMHg4RDU4NTE2MywKKzB4QzZCNTI5RDEsIDB4RDJDQUVFNkUsIDB4RTNFMTEyQjcsIDB4MzI0NDMxMkYsCisweDFCMzkzRTU4LCAweDI0NDRENTM4LCAweEJFNjlBQzIxLCAweEM5MkEwNTA2LAorMHhEMUE3NDQzNCwgMHg0OUMzRUEwNSwgMHgwRTUzQjMxOSwgMHgzODQzQ0UwMywKKzB4OERCODQxNUUsIDB4NzY2QjZGQzcsIDB4NTE1QjlFN0EsIDB4M0JBMDVCMzIsCisweEJGQUZDNDQ5LCAweDMxMzAyQTU3LCAweDE5NjBBMjExLCAweDY2QTA5N0UwLAorMHhCQzY1QTlCNCwgMHg4OUU4MzA2NSwgMHgzNkZEQkYyQywgMHhEQ0Q0NjY0QSwKKzB4MEVENkNGQkYsIDB4REQ0REM2REMsIDB4RDc2RDJGMDAsIDB4QjZEQTY1NDAsCisweDlBMzk2NDQ0LCAweDI4RjE4NURFLCAweEEwRkVGQTFELCAweEY0NzZFMEVELAorMHhFRjE1NTA1QSwgMHgxODMzNjVCRiwgMHg0ODFGRkQ5MCwgMHgyOUFCRUU3NSwKKzB4MUVDOTBCMDcsIDB4QzEwQjI2NTcsIDB4MERCRjZEREIsIDB4NTJBRDAyQjcsCisweEU4N0REQjU0LCAweEQzNzA0MTA2LCAweEQ0RTJDNTkyLCAweDBDQjJERDA1LAorMHg0QkFBMkZGQiwgMHgwMjYxMTM2OCwgMHhENTBGOEYxQywgMHg0MTZGRjI1QywKKzB4OUE2OTc4MkQsIDB4MjY4QzY0NzQsIDB4MkVDRDRENjQsIDB4MTk2REUyRjUsCisweDQ3QTg1NjFDLCAweDhDN0NFNkM5LCAweEQyQjFFMkQyLCAweEEwMzhDMTY1LAorMHgzQUI4ODQ0QiwgMHg0QTY5OTgzMCwgMHgwRkZDMEIxNywgMHg4OUI2ODVBQSwKKzB4REEyNzZEODUsIDB4RTkzNEM0Q0QsIDB4RjUxMTIyNkYsIDB4OUNERDJCMUYsCisweDk0Rjc1NDkyLCAweDU1RUNFQjQyLCAweDQyRjBBM0QzLCAweEQ3RUI0ODJDLAorMHhBNzhEMDM3MywgMHg2MkYwODhBNiwgMHg3RUNGNDYwMiwgMHg3QTM0MDRCNiwKKzB4NDBCMzY0OTUsIDB4NjA0NDFERjQsIDB4NjcyMkY1MzksIDB4Q0ZFNzZDNDgsCisweEI2Qjk0QzlGLCAweDlBREI0QjZBLCAweDFFQkJBNjVGLCAweDVCNTA4MUFGLAorMHhCNzY0NDIzQywgMHhCNkY5MTBFMywgMHgxNEFDNEI2RiwgMHg1QzgxMUU4MiwKKzB4QUEzNkU1RjEsIDB4MjRFQzgyQUYsIDB4QTJGMUMwNTAsIDB4MDUwNDMyNEMsCisweDMwNENFRDBGLCAweDAxRTMxREQ5LCAweEM4MkVDN0U2LCAweEQ1NUFGRkY5LAorMHhGRkIzMDQ3QiwgMHgzMDA2RjJFOSwgMHhDNzI1QkNEMSwgMHg3RENDMTA4MiwKKzB4QTlBMjJDRjgsIDB4NjRENUFGOUQsIDB4Mzg5QzM0QUQsIDB4N0RGRjM3QzYsCisweDQxRjE1MDlELCAweDE4NDVCM0ZFLCAweDA1NUMyM0YwLCAweEM2MjkxRjVGLAorMHhDREQzQzdERCwgMHg1RjAzNTZCNCwgMHg3RkQyQzM4NywgMHg0OTRBMDkxRSwKKzB4NTBDNjlEM0UsIDB4RkU3NjlBNUEsIDB4NjM5MDQ3MDEsIDB4ODk2MEFCRjIsCisweEU2OEVERjNBLCAweDBBQjU3QzhFLCAweDBCOUQwQTZDLCAweDUxODg4MTQ4LAorMHg1MEM1RDUzMywgMHhDNjkwMzhGQSwgMHgzQUNCRTY2MSwgMHgwQ0FFQjYwMSwKKzB4OEMxNEFCNkMsIDB4QkE4NkQ5NEYsIDB4MDcyNDA1NkIsIDB4MEZFRkZDQkEsCisweDEyNDQ5RERCLCAweEFCRkZFQ0NFLCAweEIxMkEyQkQ3LCAweDcyNjBBMEU4LAorMHhCRTE4NEE0OCwgMHhDRkQzQ0EzRiwgMHhERjA4ODY2MCwgMHg3OEVFOUI2NywKKzB4QTlFREIxMTMsIDB4NEZENUQzNTMsIDB4OEUzNDhDQzYsIDB4RDU3OEMzMzcsCisweEYwNDkzQkU5LCAweENDRkI1NEVDLCAweDlDRUVGODVDLCAweDBDQUFFMTVFLAorMHgzNzFBRDEyRiwgMHg5QzVCOTI3MCwgMHgyNDk1RjBERSwgMHgwNkRFMkRCQiwKKzB4OTExQUU3RUMsIDB4RUVERTMzNjMsIDB4NkREMzhENkMsIDB4MkFGN0YzRDksCisweDUxQzhEMTE4LCAweEYyMzgxOEE3LCAweDk1NDM4QUVBLCAweDNBOEE3OThGLAorMHgyMzBEMkJFRiwgMHgzRDE2MjczQywgMHg5QzM2RkY4MywgMHg3ODVDOTUzNywKKzB4M0U0MkFGMkYsIDB4MTJBMTY3NDEsIDB4RTU4RDBEQzQsIDB4MzNFQkVGRjksCisweDZGMTk3MkRBLCAweDEyOEM5QkFBLCAweDg1OEQ2MDMyLCAweERBRjE4NUUxLAorMHhBRTM1NTA2NSwgMHhERTAwODZGMywgMHgwRjY2MUE2NSwgMHhGNDMzNDE2OSwKKzB4QjE1NTlCQTYsIDB4Mzg5MjEwOUEsIDB4RTkwM0JBMDAsIDB4QUUwQ0JENTgsCisweDA3M0MyMUEwLCAweEZDQURCMjk5LCAweEI0RTM5QUYxLCAweDc4NDc1NDU5LAorMHhCNDZEQzg0NywgMHhEQkE5NzY2MSwgMHgxNUQxMThGNSwgMHgwMUVENDhEMCwKKzB4OTlGNjU4QkMsIDB4Mzk5RkRDOEUsIDB4NDRENEE5MTksIDB4N0MyQ0U0QjksCisweENBMDM2N0NDLCAweENDMkI5ODI4LCAweDE2QUFDQUE2LCAweDdBQTVCNkJBLAorMHhGRUM3N0M2NiwgMHgyMzFCMjJGOSwgMHhDOEJFMEQwNCwgMHg2RkYyNzg4QywKKzB4NUY5Q0VCQjUsIDB4OTAxRUFBNUQsIDB4REU2ODJCQkYsIDB4OTk4RTcwRDQsCisweEJEOUNDQ0RBLCAweDY5OTU0NDFFLCAweDU3MDJGMzYwLCAweEJDMDM1RUVELAorMHgyMEY2MEI1MSwgMHhENTczNjFEOCwgMHhDMDcxMTEzQiwgMHg3M0NFNkNFNCwKKzB4QzY1NjlEQzksIDB4RDI0Qjg5RUQsIDB4QTYwNTIyNzYsIDB4OENFRTIwMjYsCisweEZCRjVCNThFLCAweEY2OTJERjgxLCAweDZCN0NERDdDLCAweEY1QjZDMDRDLAorMHhFQzFCQkEyOSwgMHhENkFDOENERCwgMHgzMjA0OTFGOCwgMHgxRDgxMkFDNywKKzB4NjMxQjAwNTEsIDB4RDA4QTREMkEsIDB4NTY5NzQ2REQsIDB4QUE2NTNGQ0YsCisweEE5MkU4RTcwLCAweEM1OUE2NzA1LCAweDI3OEVBMUZGLCAweDYzRTVGQTE3LAorMHgxQzIwRTgyRCwgMHg1NTBGN0NFMywgMHg1NUNFRDQxNSwgMHg1RjlDNEM0QSwKKzB4N0Q3NDYzMTEsIDB4NUIwNzk3NkEsIDB4MTI0NzdFMzEsIDB4QUI4MTEzQUEsCisweDc5NkVEQ0VBLCAweDRBOTBFNEI0LCAweEIzNkU2MTg4LCAweEVFN0Q1RTBGLAorMHgxNUNFQTA2MCwgMHhCODFBQjJDQSwgMHgyOTZEMjJCMCwgMHhGQTA3NTNFMiwKKzB4MEQwRDE1QkIsIDB4RDRBRjhCRDcsIDB4OTUxRkE1NzUsIDB4Q0JFQkQ1OEEsCisweDBBRjVDMzYyLCAweDlFRjQzRkIwLCAweEQ5N0U1MTg0LCAweEExNDQ2OUJDLAorMHhDQUU1RDU1RSwgMHg5M0Q0Q0RGOSwgMHg5NUIwMTNBOCwgMHg2OTk4RjM1QywKKzB4RjFEREMwQjEsIDB4NDc2RjlGQzcsIDB4QjY0NzJCNzAsIDB4MUQ1NUFDNUMsCisweEYwRTBDMEM4LCAweDk1MzcyQkY1LCAweDc1Q0NDREJFLCAweDlGOUQyMDAzLAorMHhDQUFEMEQ1MSwgMHhFRTU0Q0MyRSwgMHhFNUVCREJGMCwgMHg5QjI0OEJCMywKKzB4NEJGMDdEMTksIDB4NTQyOTk3RTksIDB4MTc0NDdDNEIsIDB4Q0YyQjI3NjgsCisweDg2MTE4QTVCLCAweDU3NTc5RjEyLCAweEM1Q0Q5RTc0LCAweDk3RUQ1NzI0LAorMHgwMUJEMkVFNCwgMHgyQTA0MDNBNiwgMHgwMTgzMzc0MSwgMHhBMUU4RDM2NCwKKzB4NEQxQTJFRUEsIDB4NjI3NjAzNzcsIDB4QTEwRDY4NjEsIDB4MDlDNjhFMkYsCisweEFCNDgyODUwLCAweEFDRDI0Qjc0LCAweDUwMzhDOENBLCAweDcxREUzQTkzLAorMHg2NzFEMjVFNCwgMHg5RUE3QUMxQSwgMHgzRTcyODdGNSwgMHg5RkM5NjNDRiwKKzB4NzNGOTBBQjYsIDB4Qzc3NUQ4NDAsIDB4MDBCODY4RDksIDB4RjZBOUJFM0QsCisweDE3RkZCNDcyLCAweDVEMjM4OUUzLCAweDBENDJBMTQ5LCAweDJGQUIxMjM1LAorMHg5MEE3OTk4RSwgMHhEODk1RjZFRSwgMHgxOTkyMTAxMywgMHhFRTQyRUE0OCwKKzB4QzVEMTlBMTcsIDB4NTUwNzg5MEEsIDB4OUY4OTNCMjksIDB4NEZGMzlGMTksCisweEQ2RUY4NUFELCAweDNGRkIxNTk5LCAweEYxNzYxMDE3LCAweEZDNTFCOTBELAorMHg4RjZDNTY2QiwgMHg0NEJBQzdBNCwgMHgyQjJFMzc1NSwgMHhBQkVDQjhEQiwKKzB4NUM0QTE2MjksIDB4ODM3Q0M0RjcsIDB4M0U3MzJCMEEsIDB4ODAzQ0UzMDMsCisweDcxODY1RDhELCAweDM0NjY2NUFCLCAweDU4QkY4MDlCLCAweDEwMDYyNkFBLAorMHg5NDQ2QUIxMywgMHhENTNBRENEQSwgMHg3NUMwQkZDRCwgMHg5NTg1MzMwNCwKKzB4RjQ3NThFODcsIDB4RDZCNjQ1MTcsIDB4MTMyOTNEMEQsIDB4RUM5MzY4RkIsCisweEQ0NDlBMkNDLCAweEFBMTdCMEJFLCAweDlEMEI4NUMwLCAweDc3QkVFRDE2LAorMHg3Njk5Q0FFNywgMHhDNzc2RDEwRCwgMHg5NjJENDhDRSwgMHg4MzhEMDBCRSwKKzB4Mjc5QUVCRjksIDB4MjJFRjgzN0IsIDB4NThFNDZEQUQsIDB4QjU2QjYzMDUsCisweDMyMzJENThCLCAweDE2Nzk2OURCLCAweDVCNjNGNUI1LCAweDdFODJCMTc1LAorMHgwNUREQjQwMiwgMHg1QUIyOUJCQSwgMHhGM0I2MjdENSwgMHg5NzE2OEM4NSwKKzB4QUQ5RUUwMjIsIDB4NDhGMENFRUEsIDB4ODQxMDRDMjIsIDB4NjkwRkNDMTksCisweENBMkYyNDc0LCAweDc2Rjk1NTM5LCAweDlGRDJCOTg3LCAweDc5RUZDNTU3LAorMHhDRUU1REE0RCwgMHgyN0VCOThGNiwgMHhBMDYyODkxNiwgMHg4RTA1NjE0RiwKKzB4OEFDODkwMjYsIDB4NzcwNTEzNUUsIDB4M0Y3RTQyQjgsIDB4N0JDRDc3M0IsCisweEY5OEI5NzQxLCAweENCOEE1MTRFLCAweDkyOTgyMjBELCAweDU2NjVGQTNBLAorMHhFNjZBMUZGNywgMHhBQzRFQ0I3MSwgMHhBN0U1NkZFRiwgMHg5RDFFRjdGOCwKKzB4MjM1NjZCNjQsIDB4QjRGRTgyMkUsIDB4MUFBNTMyMDgsIDB4RjQ1NDVFNUQsCisweEVBODZDODc5LCAweDE4RjZCN0MyLCAweEUxMEExN0FDLCAweEJEMzcwMTFGLAorMHhGQkRGODFCOCwgMHhBOTc4QTRFQiwgMHhENDI0MzdBNywgMHg0NzRFNkE0MSwKKzB4Rjg4ODUyNDgsIDB4Rjc1MEJBQTksIDB4RDIzOEVBNjIsIDB4RDY5QkE3NEQsCisweDI2NkVDNkJGLCAweEU3RURFMDc3LCAweEU4RjBBMzAzLCAweDhCNTZBOTZELAorMHg0MTM4MDk4MCwgMHhEREYwQjE2QywgMHgwMEU4MzU5NCwgMHhBNTAzRUJGNSwKKzB4OTYwQTI1OEUsIDB4NDk5ODI3QkQsIDB4NkM4RTZGN0IsIDB4MTY2Qzg0NUQsCisweEM4NDJDOTM0LCAweEJBRUZDNjk5LCAweEQ5ODQ2MjEzLCAweDgzMkVDMTlCLAorMHgxRUFENzU5OSwgMHgyMjFFN0VFOSwgMHg4MTc2QTMxMywgMHhCMjhEOEUzOSwKKzB4QkFDMjlBOTYsIDB4Qjk2NEY5MUYsIDB4M0YyNjgxNTAsIDB4RDRCQjcwMTEsCisweDM0N0VDNDQ1LCAweDdGREM5RTgyLCAweEVCNzBGNEM5LCAweEE2RjM4RUJGLAorMHgzOThDRjEzNywgMHhEN0Y4OENGNSwgMHhDQkREQ0IzRiwgMHhBMERBRkE3NCwKKzB4RDI5RDMwQUQsIDB4ODIyQjY5MTksIDB4Q0UwNTk5NDksIDB4M0E5NDYxODMsCisweERFNEM1NzJELCAweEQxRTZEODQ0LCAweEM0M0M3REFDLCAweERCQkVFREQwLAorMHhBNjU2REY2RCwgMHg0NTRDMjJBOSwgMHg5RkE0ODc5MCwgMHg2OUIwNDUzMSwKKzB4OTlCQjMwNUYsIDB4ODA1MDBGNzEsIDB4RkUyMzYzQzIsIDB4QjY3RjUzOEYsCisweDMwMkVDMEMzLCAweDRBNkUzNDU4LCAweDU3RTRDRkQ0LCAweEU2NUNEQUVCLAorMHhGMzFBQkIzMSwgMHg2MkRGOThBQywgMHg4OTRBRTc4MSwgMHhCMTU4OEFCMSwKKzB4NDVENUNDM0UsIDB4MzUyMEY1QjAsIDB4QzcyRDBDQjcsIDB4QTFENkNCRjksCisweDc0MkZGQTYzLCAweEEwQTUyMjRGLCAweDVFQTFDODVBLCAweEI4MUU5Rjc3LAorMHgzMUQ3NkM0RiwgMHg1MjUyNTdGNSwgMHhCRkY4NTAwOSwgMHgyMTI1QjI3MCwKKzB4MTZFNDdFNkUsIDB4OTEyOEI5ODEsIDB4MEQ1RkJFMzksIDB4RjY3QTQxOEMsCisweENGM0M3MUNCLCAweEFDMDRBQkUxLCAweDlCNTUwQUFGLCAweEI1MDc3RjE4LAorMHhGQjdDNUVDMCwgMHg2NDc4NERCNCwgMHgxRTY2OEI0OCwgMHg4NDY1OTgzNiwKKzB4NjA0NDU3QkYsIDB4RjZGNjlDOEQsIDB4Mzk0MzAxREMsIDB4RUQwMjExQkQsCisweDhCQUMxQTNBLCAweEJCNzUyRkQyLCAweDc4QjhDMDM2LCAweEJDQjk4RThBLAorMHgzM0M1OTVERSwgMHhCM0YzQzVGOCwgMHg2OTg2NjZBQywgMHhBMUY0MkQ3QSwKKzB4NTc1MUFDQzgsIDB4QzA2OTU3NUIsIDB4MzVENTBGOTksIDB4QjI5NEJGMzgsCisweDgyQTRBMzMxLCAweDA1MTQ3NzUxLCAweENBRTE4QzEyLCAweDlFODlBQUYxLAorMHgzNTMxQzM3MiwgMHhCMjExNEE4OCwgMHg0MTc5NzIwMSwgMHhERERERUMxMCwKKzB4MDExODVGMkEsIDB4REVENTBDREMsIDB4NzIxNTZCQUQsIDB4ODhGM0RCOTQsCisweDUwNDUwRERGLCAweDZCMUU3QUJGLCAweDNEMzE3NzA4LCAweEZERkY1QTE1LAorMHhEQzhCMTY5NywgMHhDQzIyNDhGRCwgMHhEOTE5NjI3MiwgMHg0NDQ1MTk1RCwKKzB4NTREOTAyODEsIDB4N0E4OTFDOUQsIDB4NjlGRjk4RDUsIDB4QURFNkQ3NEIsCisweDI2RDI3OTczLCAweDBGMTQ3MzRGLCAweDNGOTU3RkM4LCAweDgxMkFDODc0LAorMHhFREMwRjlCNCwgMHhEMzFENkQ3NSwgMHg3QTI2MDhDMywgMHhEODk5ODRCMSwKKzB4RjU4MTA4MUEsIDB4RURCOURGNkYsIDB4MTZFQ0MxOTEsIDB4NkI5NDU3MjQsCisweDFCQ0U4MjY5LCAweDAyRTZEQjY4LCAweDU2MzYyNTQxLCAweDlEMjQ3Q0Y0LAorMHhBNTI2NUU3MiwgMHgyQzhCOTQxMywgMHgxMTU3REI0QiwgMHgzMTQ1Q0ZCMiwKKzB4RkJERUJDRjUsIDB4MTA0MkIxMTcsIDB4Mjg0REFFMTgsIDB4MTA1NzVDMjEsCisweDFEREU1NzhFLCAweDgwRjU5RURFLCAweENBQjUxQzA0LCAweEI1OTRCREE4LAorMHgwOEFDRUY4NSwgMHgwOEM4RDRDNywgMHg3MzA0RDQzMywgMHhFODdEM0E4OCwKKzB4MzFDQ0ZFRDgsIDB4MUQ4RTcxRTUsIDB4QzVBMkYwMkMsIDB4QUNCRjNCNUUsCisweEFBMTYxQkNBLCAweEExMEJFNTc3LCAweEY5Q0U0MUQyLCAweDJCODZGMDMxLAorMHgzRDRBOEQyMywgMHhFRDkyNkRFNCwgMHgzODQ0RTIxRiwgMHhGRTU3QkNEMCwKKzB4MzZEQzMwOUQsIDB4MTcxMzc0MDksIDB4OUY2QTg1MDcsIDB4MTRDRjEyRUIsCisweEE3NzBBRkI1LCAweDdDNkRBMkU0LCAweDg1NkI0OEI4LCAweDJFQTIzNURGLAorMHg1NUJEMTE2NCwgMHg1QkQ5RkYwQywgMHg1MjI4QzU1MiwgMHg5RTcxOUFGQSwKKzB4M0VDMzcwM0IsIDB4RTA2QTk0RjMsIDB4Mjk2RkYwRDksIDB4RTQ2OEQ5QzksCisweEQyQTE1Q0RDLCAweDZDNEVBQUEyLCAweDJBRjNCOEJGLCAweDZCNkVEQzc4LAorMHg0MkI3ODk3MiwgMHg0Qzk3QTY2QywgMHgxNjFDMzBCRiwgMHhDRDI4MTZEQywKKzB4NDMxQkRBMTcsIDB4RDk2NTMwMjIsIDB4NjdEOTVFMzksIDB4QkNCMTgzNDIsCisweDIyNzk4MkU3LCAweDIzQzVCMTFCLCAweDUxNDQyMEFCLCAweDA4OUYzQTVDLAorMHgyQjJGODI0NCwgMHgyRjJBODBDOCwgMHhCMEE5MDU1OCwgMHg3NUJBQTI0MywKKzB4RTJGQzRGNjIsIDB4RUIwQTYxMDQsIDB4QjdGMjIxQjIsIDB4NEVDRDc5REYsCisweEIzRTA4QjhCLCAweEJBMjVFMUNCLCAweEQzOUYzNDMxLCAweEI1MDIwMkZFLAorMHg3OEYxNUVDRSwgMHhFRkY2MUVDRiwgMHhCM0NEREQ1MCwgMHgzRkQwNjRBOCwKKzB4OTZCMDI4QkMsIDB4QjI5REQ0RTEsIDB4N0U5RUM2MjksIDB4QzQwN0Y0RDEsCisweDhDMjE3ODVCLCAweEUxMTc2N0JBLCAweENGRTZERTI2LCAweDBEQTk4RTIyLAorMHgzM0FDNTY3MCwgMHgwRkRCQzE3NSwgMHhGMTFGOEVGNSwgMHg2MDYzODg0MywKKzB4OEI2N0U1NUEsIDB4M0YyN0Y3NUIsIDB4NjY5MUZCOTgsIDB4NjM1QTM1QTksCisweEIzMTc0NTlDLCAweEU3NDE5QzAxLCAweDhCQUIyOEQ3LCAweEUzNDdENzkxLAorMHhFRkMwMTlBMCwgMHg0NTAwOTA0MSwgMHhBNkRFQjNFOCwgMHg2RjczNzlGRiwKKzB4MEZGNTAzOTAsIDB4ODEwQkVFNzgsIDB4QUQxMzcxNkIsIDB4QTdEQkQ3QUIsCisweEVGNDM5RDRCLCAweEREQTc0NEE1LCAweDMxRURERThELCAweEE4NUI3MUYyLAorMHhERjQzOUM3MCwgMHhBN0UzREE5NCwgMHg1MjVFRDQ1MywgMHgzRDkxM0MzMiwKKzB4RDEwNENFNjEsIDB4NDJGNUZGRUQsIDB4MTRDNzYyNUEsIDB4NEU1QjMxNEIsCisweEE3RUFEMUVELCAweEZBMDFENTk1LCAweEU2N0JDRjA2LCAweEU2MzY4NUUyLAorMHgzQTMyRTlEMywgMHgzNzRDMjVGMCwgMHhBOEU4QTQxRCwgMHhBNDAzQUVGNSwKKzB4OTAxQTE5NEMsIDB4MTc2MDVCQzksIDB4ODUyMkREMTIsIDB4MjcwOTZCQUEsCisweDAxNzQzNEI3LCAweDk5QzhEMkRBLCAweDdGOTZCMDY4LCAweDg1MjFDRDA5LAorMHg1MjlCNDZENiwgMHg0Nzg1MjgxMCwgMHgwMjFCQzhCRiwgMHg5M0M5ODMyOSwKKzB4NkZFNzNBNzgsIDB4NDREQjY5QTksIDB4QzgzOUQ0OTAsIDB4Q0FDNDJBRkUsCisweENGMUVDQ0Y0LCAweDZGMkU1RjQ0LCAweDc5NUM4MjE5LCAweEEwNkM2NjdCLAorMHg4MDQxMUYzMSwgMHhCMDk5MjZFMSwgMHhDNjJCNkMxOCwgMHg3N0M2RTZERCwKKzB4NzYyMkZDMDcsIDB4MDIxNjJEQjIsIDB4M0VBMzEzMzQsIDB4NkNDMDJCNEEsCisweEFBNkI4MUMzLCAweDQ0MjRBOUE1LCAweDI2QkQyRUYzLCAweDMzNDg5NkQ2LAorMHhBREREMjcxMSwgMHg3NjAzNTc1NywgMHg4MEFBMzI4RSwgMHgyRjM5QzA2RSwKKzB4MzU3NTIwQ0IsIDB4RjYyQkRGNDYsIDB4QzU5MzQzQzQsIDB4N0NBNENBRTIsCisweDg5QjAzRUYzLCAweDI1MUE3ODVCLCAweEE0NzU1QkI5LCAweDI2MkQ0NzhELAorMHg0NjJFNjI1MiwgMHg2QjVGNkJFRCwgMHhDQTQ2RTc3QiwgMHhBMkNGMDhBRCwKKzB4NTYxRTE5RUEsIDB4QkYzMUFBMTUsIDB4RDM3NkY0NEMsIDB4Q0MzMzIxNTAsCisweDhDMEFFRTQyLCAweEMwNkQ1RjkxLCAweERBREY4NjEzLCAweEJFMEZBMjJDLAorMHhGNTBBRTQ4MiwgMHhFMzYxNTUwMSwgMHhFQ0M4RDVBQSwgMHg1OEE3RkQzRSwKKzB4RDU5QjhDQzksIDB4MDlEQjA5ODcsIDB4RjFEOTc1M0QsIDB4OUM3OUUyMEUsCisweDlBMjIyQUVBLCAweEM0RTU4OTE0LCAweDY3MTJFMEEyLCAweDhDRDVDODBFLAorMHhFQUI4QUE1NiwgMHhEQkZBOEQ5QywgMHgzNTE1QkQyMSwgMHhCNjVCOUUwQywKKzB4RjBEMjdGRUUsIDB4RTMzODcxQzEsIDB4RUU4RkU1MkYsIDB4MDJBQ0NCM0YsCisweEU5MTk3Mjc3LCAweEI3QjcwNzcwLCAweEEyNkUzNTgxLCAweDgyNDgxRTdGLAorMHgwMDVBRjk5RiwgMHg4Qjk3MEI0QiwgMHhFQzc0QjY2MiwgMHgyRjIxQzVBMywKKzB4MDQ5REJBODMsIDB4NDk1QjNFMUIsIDB4MTEyMjM0QjgsIDB4OTVCNDJBNUYsCisweDJDOEZBODMzLCAweDZENzA2RTMwLCAweDJBQUFFQzA5LCAweERFN0MzMzc3LAorMHgwNkNFOUQ0NiwgMHg3NTc0RUFBQiwgMHhGQ0IxQTA4RCwgMHg0NjJBRkI2QywKKzB4MTkyODQ3QjIsIDB4Q0MxNDlBQzMsIDB4NDI3ODM0Q0UsIDB4RTkwMTgwQTAsCisweDk0NkU1MjZFLCAweDYwMThCRTRFLCAweDIwNDQyRjUyLCAweDFEMzlGQTA1LAorMHgzNUY2OTBBRCwgMHgyOURCM0E1MywgMHg2MzYwMTU4QywgMHgzRUM4MTVGOCwKKzB4REVENjUwQUYsIDB4RkExNjhCMzcsIDB4MjMzRjhBM0QsIDB4MjQ1MDA5Q0YsCisweDcxQkIyMjM3LCAweDQ5ODlBMDFDLCAweEQ1OEFFNEYxLCAweDYyQzk5RUEwLAorMHg0OEU5MDU2RSwgMHg3RTFBNzg2RCwgMHhCRjZDQkFBQiwgMHgyMjY2OUE2QiwKKzB4NTc4NTc1OTAsIDB4RTQ1NThDRTMsIDB4QkM2QzYzRUMsIDB4NkFFMDJBNjEsCisweEEyQUJGQkJCLCAweEQyQjJGRTkwLCAweERGOEJEQjQzLCAweEVDMkQ1OUFDLAorMHg3QjZBRkRDMywgMHg2QjAwMUQ1RiwgMHgzREZFRTA4RiwgMHhCOUE1OTdENiwKKzB4MDlERUFDNjgsIDB4RTQyRDlFNzMsIDB4MkUzMzUwN0MsIDB4NjUyNUYwNTEsCisweDBENzE0M0M2LCAweDAxREQxMTVCLCAweDk0MTgwMjc5LCAweDI4RkM2MEQ3LAorMHhDMDkwMDYwMywgMHhFRDRGQkU1MywgMHhGQzA2NzdCRCwgMHg3REEyQTg3OCwKKzB4QThEMEVDNzMsIDB4RjZBMDlCMkEsIDB4MjRBMTI5RUUsIDB4MTY5QkNBMkYsCisweEUwQkFFNTI2LCAweDVDOEUyRkNCLCAweEEyMThFRkZBLCAweDg0MkI2MUZCLAorMHg4N0I4NjBDRCwgMHgxMDZFOUI4NiwgMHg5MzA2ODVGMCwgMHhDNUE3MjEwOSwKKzB4RkI5NzdCRDUsIDB4OUQzQjRBQzYsIDB4REEzNzhGRTAsIDB4MEFBRjc0N0IsCisweDA0MDhENTBELCAweDQ4ODc4NUI5LCAweDgxQUU5NzFELCAweDEyQURGRUYzLAorMHhGMEI2NDEyOCwgMHgzRDRDOTBCQiwgMHhDOTk0QUFBMSwgMHhCODU0NDAwRSwKKzB4OTAxQUUzREQsIDB4N0E0QTBERTcsIDB4MThFMDc0NTYsIDB4MjBDMzhCQ0QsCisweDk0NDQxOTc2LCAweEUyRTQxOUMyLCAweERCRDNDOTJGLCAweDRERDYzODQxLAorMHhFMjk5NDk1OSwgMHhGNDFGMTk2RCwgMHgwODM1NDMxQSwgMHg5M0EyRTlDRiwKKzB4QjAxRkFCRUQsIDB4RDAxMzU1MzUsIDB4RUJDRUExOEQsIDB4QzRGODNBMUIsCisweDVENzI4NDVDLCAweDA0MzM1RTNBLCAweDY4QzRDOTg3LCAweDc3MTc4NzEwLAorMHhDNTI5M0E5QSwgMHg0NEU0MEFFMSwgMHhDRTQ1NEZERSwgMHg3MURFODlCNywKKzB4QTM3M0Q5RDMsIDB4NkQxOUU0ODMsIDB4ODEyODk2RDYsIDB4QzMyMzFDMTQsCisweEU5NjBBQkE0LCAweEI3RkI2RjgzLCAweDFGN0M0RUI4LCAweEQxMERCRTY5LAorMHg4NTc1Q0Y2RSwgMHhDMDNCMTVENSwgMHg0RDdGNEVGMywgMHhGMDYxNUYzMSwKKzB4MzRFMjE3NjIsIDB4MjJENUE3QTEsIDB4NzI5RkEzRjgsIDB4MkUxMDUwRkIsCisweDhBOUY0NkRDLCAweDUzNUVCNUE3LCAweEQxNDM1NjBFLCAweEY4RUMzQTRCLAorMHgyMjQ5RkQwNiwgMHhFOEUyQUIwOCwgMHgxRTczNDEyNywgMHhCQTVCNjM1QSwKKzB4RDhGNDE5REIsIDB4MEI1MjAwRDAsIDB4ODExMDMwNEYsIDB4MzQ5N0RBODAsCisweDM1Q0E3MUNELCAweDBGRDgyMjdFLCAweDA4NkM3NEUyLCAweEFCNjhBMUFGLAorMHhFM0JENTdFQywgMHg4M0I0MkQyOSwgMHgzQzJENjcyRCwgMHgwNUQ4NUNFRCwKKzB4NjRGMDQ5MjYsIDB4OTEzNjRBMTIsIDB4N0ZDNzMzNDksIDB4RUJBMUZDNzcsCisweEVDRTBEMjBELCAweEIxREREQjlCLCAweEVCNkI0OTJCLCAweDBGQzAyQkI2LAorMHg1NjIwMUQ3NiwgMHhFRDIwRjc5RSwgMHhGQzYwMzRGQiwgMHg2QTUzOUYxRCwKKzB4NTIwRkVDQkYsIDB4NEUzQUVDRjYsIDB4NzZCMDFDNzQsIDB4RUZDNDIxRDQsCisweDgyQUM5ODlBLCAweDQwN0E3N0NELCAweDZEMjg3QkZFLCAweDI2NjE3NDI1LAorMHhFQTIzMTZDMywgMHg4NjE2NTU0RSwgMHg5RjRDNDUzNSwgMHg4OEMwQzZDMSwKKzB4RUFDNEYwRjcsIDB4MzJDN0REOTMsIDB4NDFEOUMzN0UsIDB4MkE5Q0JCMkUsCisweDA1OTFCQUVGLCAweDJCRTQzRjIxLCAweDVFMDZFRTRELCAweEREREY1NTI1LAorMHhFQzEzN0RCRSwgMHhGMEFBMjk1QywgMHhGMkM5RkRFMiwgMHg1REY5RDY5MywKKzB4MTBBNkNBQzAsIDB4QzY4NDZEMDksIDB4RjFEREFCRjMsIDB4RDU2RjhCQkMsCisweEFBNURDRTlELCAweDZGNTkwMDRGLCAweEI4QTAzNUJDLCAweDYxRjQ3MjgyLAorMHhDODlEQUM5RSwgMHhGQzdFNUIzRCwgMHg0QzU0MDZERCwgMHg1NENGRDE0NywKKzB4QkI0NEFCMkEsIDB4NzkxMjY5QzAsIDB4OENGNjZCNEQsIDB4RDAxQTMxOTAsCisweDYzNkY0NUNBLCAweEIzMkZDMjA5LCAweENCOEI5RjQ5LCAweEY0NkQ3NEI5LAorMHg1QUZDOUJEMCwgMHhDNEM3MTZDMSwgMHhGOThDNTRGMywgMHgzNkFGRjAxMywKKzB4QjRENkQ5MEIsIDB4NUYxMjk5QjYsIDB4QTNCRkNGQTQsIDB4RUEzMzZBQUQsCisweENDRDQ0M0RBLCAweDc0Q0E0MEI0LCAweDMxRUYxNjE0LCAweDM2RDNGRkVFLAorMHg4NzZBRTI1MiwgMHhDOEQ2MkU5RiwgMHg2NDI0RjM5NywgMHgxRjczMEYyRCwKKzB4QjIwRkRBNTMsIDB4RkNGRUU2MEYsIDB4Njc2QTYxQzMsIDB4MjZDNUUxNDMsCisweEMyMDE1NzNFLCAweDRBOEM0NkJFLCAweEVGODdEMEE5LCAweEUwN0U4MEI0LAorMHgzNEYyMDEwOSwgMHg4QjkzNkE3MCwgMHg5RjhFMDMwNSwgMHhGMzI5N0NBMCwKKzB4NEU3QkYwRTksIDB4MEYzNzRCQjksIDB4Q0U3OEEwMUUsIDB4NUZFMjZERDgsCisweEEzODI2QUNGLCAweDMyMUY2OUFCLCAweDQ0MUFGMTRFLCAweDhBQzE5Q0Y3LAorMHg0QkZEMUFENiwgMHg1OTUxQUJEMSwgMHgwOThDMTdGMCwgMHhBOUI3NUY3NiwKKzB4QTQ2MjU1MUIsIDB4NkI3MDNBMTIsIDB4RURDQjU3QjIsIDB4OENENEM5MzMsCisweEQzMzhEM0Q4LCAweEUzNDNGQzI0LCAweDlDREQ1MkVCLCAweDE3QTQxOTQyLAorMHg2M0E4RUY1MCwgMHgyMTVCQjExQSwgMHhFMUUyNUNCNiwgMHhCNjJDMEE4OCwKKzB4RTU4Q0RFQzMsIDB4QzBFNjM4OUEsIDB4MkI3QkVFNTUsIDB4QTNGQ0JEMDcsCisweDdDRDQ1MUZFLCAweEIwNkY2NzI0LCAweDU2NzVBN0VBLCAweDE0MUQ1MkZDLAorMHgwNUU4NkU5QiwgMHg1M0Q3NUMzQSwgMHhFNzk5QUEyQSwgMHhFNDc0Mzg0QywKKzB4OEM4NUU2RTYsIDB4QTQ3N0E4RDcsIDB4QTFFNkFCMEMsIDB4OTAzM0U3Q0QsCisweDJGNTVENTA0LCAweDREQUU4MUZCLCAweEJEMjI5QTY0LCAweDg2Mjc2NUM5LAorMHg1QjZBODVGMCwgMHg5NUEzOTMyOCwgMHgzODgyNkNGQiwgMHhCRjdERUJBNCwKKzB4NDJFRkFCNjIsIDB4MkQwQkJBNjAsIDB4QjA2NzMxQUYsIDB4MTZENEM0QjAsCisweENBNEI5MjY0LCAweDNERjI0QUUyLCAweEZFRDkzODQ4LCAweDdDQjMzQjA4LAorMHhBQzlDQUU5RiwgMHhBMEY4MEI2MSwgMHhBNjZDRjcxMywgMHg5MzY0ODY1RiwKKzB4REZBMUUwQjMsIDB4RkU2REYzM0YsIDB4ODAzOUE2MTIsIDB4MTE5RjYwQkYsCisweENFRURFMzA5LCAweEQyODMxNkE4LCAweENENjFEMkY1LCAweDNDQkVCMDE1LAorMHg4NUMwQkY1MSwgMHg2RURCQkMxNSwgMHg3OUYzRDIwNywgMHg0ODVFRTRGQSwKKzB4Q0VDMzAyRUEsIDB4NTlEOEI5MkQsIDB4NTFDMUZCMzYsIDB4RjRGRThCNzEsCisweDJEQkQ1NzE4LCAweDg0MDI0MDQwLCAweEZERDY1OTBGLCAweEExQ0U5Q0M5LAorMHhDNEFFQUI3MiwgMHgwQTJGRThCRiwgMHgyOEMzMzYxOCwgMHhCQTRFMTVGQiwKKzB4QTlDNzI4MTksIDB4QTNFRTQ1RDcsIDB4RDJEQzUyRjEsIDB4M0ZDODRBMkUsCisweDFDOURGNzNFLCAweDYzMkY5QkRFLCAweDdFOUZCRDIwLCAweDBENjg5Qjc5LAorMHg5MUU4RDVDMCwgMHg2RUU3OTUyQywgMHg5MDVGMTkyRSwgMHgyRDc5RTcxMiwKKzB4ODY3MEE3QTIsIDB4MURCRkM0RDksIDB4NjQ2MzQ0MjksIDB4RTYzNjA0M0IsCisweDY0M0M2QjBGLCAweDUwQUYzMjdCLCAweDBFNzM0RDYxLCAweDJEN0Q2RTQ2LAorMHhCODc3RENENiwgMHg3Q0NGNEYxQSwgMHhERjREOENGOCwgMHgwRTdGQTc4RSwKKzB4MENCQzRFQzIsIDB4QUU5QjRBMjIsIDB4NEYwMkQ0OUMsIDB4NDhGMDlDNDMsCisweDUwMzFCMUEwLCAweERDQjhBMUZDLCAweDkxQzczNTk5LCAweENGMDBBNjRELAorMHhERkNFNTYxRSwgMHg4QjE4MTU3RCwgMHhFMUVENkE4MSwgMHhDRjk0RUYzNiwKKzB4QjQxMkNFMUEsIDB4NjAyRTIwNzYsIDB4NzE2QjBGM0YsIDB4QURFQjMyQzAsCisweEQ0RTE2MDk0LCAweEVDOTVENDFGLCAweDc1ODU4NzY3LCAweDQzOEFEMUExLAorMHhFNjFDNTUyNywgMHgwRDcxRkJCMiwgMHgyQTk5RDA3MCwgMHg1QzAxODgyNiwKKzB4Q0NDQzI3RkQsIDB4MDUzODgzRDksIDB4RjFEMzBFRjUsIDB4Njc2QUQzOEEsCisweERGODFBQjI4LCAweDIyNTdGQjlELCAweDM3MzMxM0FFLCAweDY3RTFGRThBLAorMHhGNEY2NkIwMiwgMHhBRkY4QzdGQSwgMHgzQjYwRDk0RCwgMHhENDREMEZFMiwKKzB4NUZDREZFNEIsIDB4QzYzMDEwQjYsIDB4MDZDRkNDRjQsIDB4MDlEOEREODUsCisweEFCNzlGMkJFLCAweEQ1QzBDNDk4LCAweDczNjRFNEZELCAweEIyOTVDRURGLAorMHhEQjg5QTA2OCwgMHg1OUE2QTBDNywgMHgwQzgyMzIwNywgMHg3MzgwRkNGRSwKKzB4NkUzM0M0QjksIDB4MDc0NEU0RjIsIDB4RjY2M0JCMzMsIDB4OUVFNTEyQ0UsCisweDg3MEVEMzVCLCAweEI0NTAyNjU0LCAweDM2N0NENEZELCAweDVENDIzOEQ5LAorMHhFQUIyQjg2RSwgMHg2RThBRERBQSwgMHhGMDgwRURENiwgMHgxREM5MEY0NiwKKzB4QjFGQzkxMjcsIDB4NjM3NzEzOTIsIDB4OTY3MjlCRjYsIDB4RDE4RTE0MTMsCisweDVEODU5MzhELCAweEI4Q0VEMzQ5LCAweEY5Qjg4NkMxLCAweENBNDg2NTYyLAorMHhCQUE5RUQ3QSwgMHgwNDk3MThEOCwgMHg3Q0Y4RTY3QSwgMHgxNzAyODQzQywKKzB4NkRDREMzNEUsIDB4OTNDNTFGODMsIDB4MjQxNUE0RjMsIDB4QThENzdCM0EsCisweDBGQjgyM0U4LCAweDQyNEYwM0MzLCAweDlDQUE1MDNDLCAweDdBQTU0MzNGLAorMHgzQkRENzRGRSwgMHg5OUQzMzMyRSwgMHgxRTYyMjMxQiwgMHg5MEE0RTU5NSwKKzB4N0VEQTk3NEQsIDB4NDNFMkNEMTQsIDB4MjdEQjlEOUYsIDB4NTYxRjVDQzYsCisweEE3N0VBQkE2LCAweDk3ODY3QjQ4LCAweEFENjUzM0NFLCAweEVCNzI2Q0Y0LAorMHg1ODU3QjIxNywgMHgyRDdEQTEwQiwgMHhEOTM5QzIwRSwgMHg4MUYxRjA3MywKKzB4RjQyREVBRjIsIDB4M0FENzc4MEUsIDB4ODhDNzc2NjEsIDB4RDJFODE5QjIsCisweEY4NzJGNTgxLCAweDk5OUYwQzVBLCAweDM4ODdBQkE0LCAweDI3Rjk1QjZELAorMHg5OTFEOTQ1OCwgMHg5RDFCQjEzMSwgMHg2RUNDNTI5OCwgMHg5RTlBN0IyNiwKKzB4NkU2NUYyNzEsIDB4RTkwRkEwNEMsIDB4N0I2OTJBQTAsIDB4ODc4OTQzRDUsCisweDkyNDg5NUU1LCAweDA0MUJDNzNBLCAweDQ0OEUyOEIyLCAweDYxRDIyRDFGLAorMHhFNzk2OTc3MywgMHhCQzhFNTk4MCwgMHg5QTE5ODg1MiwgMHhCOTQ0MTVDOSwKKzB4QTAyMzc0QkEsIDB4MzQwQkQ1RjMsIDB4MjdGMkEwRkYsIDB4MzlCREIzM0YsCisweENDMDQyQkNGLCAweDgzRDZDMTM1LCAweDlDN0E4RDhFLCAweDA1ODIzQzIzLAorMHgyRDdBM0Y5MSwgMHhFNzkyQkNDQSwgMHhBMkQ4MjE3NywgMHg3M0M4MkU3RSwKKzB4QkVCQzk2MTMsIDB4OUY1OTZDQjAsIDB4NkU3ODRBQTcsIDB4MUI3QkRBOUYsCisweDg0NjM5MUY3LCAweDg1MkFEMDcwLCAweEY4MzFFOENBLCAweDE2QTc4MjIzLAorMHhGNjhGNTI1MCwgMHhFMjU1NDQ5MywgMHhEMzhGMkFGQiwgMHg3NjRCQTdBOCwKKzB4M0NBRUZDNTUsIDB4NkU5QjkwMzcsIDB4RDg3RDQ4NkUsIDB4NzM1MkFFQTksCisweDExOTg3RUUwLCAweERGN0U4NERBLCAweDI4MzhFNzM2LCAweEE4QzdCQUMyLAorMHhGNDlFMjFFRSwgMHhGQUQxMDZFOSwgMHg3MzYzQUM2RiwgMHg1RTk5NzRDQiwKKzB4QkEwMDhCQjAsIDB4QUY1REIzRkMsIDB4N0FDM0NGRDcsIDB4MkQ1NUVEQzYsCisweDJDMUM5QUQ3LCAweDZBM0FBNDk0LCAweDVGMEUwQTNBLCAweDM3NDIyQkZBLAorMHg4M0I0RDU5NCwgMHhCN0VDQ0Y2NiwgMHg4MkZDQ0REMCwgMHg4RUNCRkQ3OSwKKzB4NjY0QjkzNDEsIDB4MDJGMTc4QTIsIDB4MjA5NUM4RTAsIDB4RkM1RjE3QjcsCisweDE4MTBCQTlCLCAweDk2NEU0Q0QxLCAweEZCQUVEODA4LCAweERFRTg3Nzk2LAorMHg2M0RFNEY2OSwgMHhDOTkyNzVERCwgMHg2NTI0MjMwNCwgMHg3QUI1QzI4QiwKKzB4MDFCQjdBM0IsIDB4Qzg1RDc3MTYsIDB4MzJBRkI5QTMsIDB4MkVEMkNCQjEsCisweEIxOTQyMThGLCAweDIxRkU1NjBELCAweENCNDUwM0E1LCAweDVDRTA0NjRELAorMHhDNEFFOUEzQywgMHgwNjE1MzBDQiwgMHhFREEzOEU2QiwgMHg0MDI5RDNFNiwKKzB4QjBDMjAzMzYsIDB4QTM3ODI1QzAsIDB4QzY4RjhCMzcsIDB4OTQwNUFEM0IsCisweDhCMUE4Rjk5LCAweEE3NjFERThCLCAweDY4M0IzMjU5LCAweEExNTRDNTU0LAorMHg2QkQ4MzVDOSwgMHg2REVBRTM1QSwgMHhCRUFFNkQ0OSwgMHgyMUQ4QjA3NCwKKzB4NDZDMDFCMzEsIDB4QkU5QjNBMTYsIDB4MUQ2MTFFQUEsIDB4NDIzQUI3NEMsCisweDkzMUY1QUY1LCAweEJCOUUyODlBLCAweEE0MTAxMTMyLCAweDRBOEJFMEQ3LAorMHgzMzA3RTRCMiwgMHhERTc4REI1RSwgMHgzNDdFQjVDRSwgMHgxM0VFRTk5OSwKKzB4MkMyRDc5NTUsIDB4QkE4OTNFQkEsIDB4NURGQzJFQzEsIDB4RTdERDdBNUYsCisweDVFMUM2NEQ4LCAweDQ1NTJFNDQ3LCAweDE4MzdEOEU0LCAweDk3MTE4MzZCLAorMHgzMjE5Rjg5MywgMHgwNDM5MkM4NCwgMHgzRTk0ODQ4QywgMHgxNUU1RjQ4MSwKKzB4MEVDNTg4MTksIDB4NzM0MUQ0NTgsIDB4NEFFNjM3MTEsIDB4ODVDMUZEMUYsCisweDk3QjU4QkQ3LCAweEIwNTUwRUJFLCAweEI5MTA4NzQzLCAweDZGNTNCMzg2LAorMHg3QTczRjMxQiwgMHhFMDdDRjhCOSwgMHg2MUZGMjdDOCwgMHgwNkE5QThCNCwKKzB4RUIwRjJCQjksIDB4NDZEMjc1RkIsIDB4Q0YzOUI0NzQsIDB4QzM0RjNCNkQsCisweDUyRjJGMTE5LCAweEQ4Nzk2M0JGLCAweEM2MEJGMTZDLCAweDc3OTdEMEFELAorMHg3RUE0REJGMCwgMHhEMjE0MDlDNywgMHhGNjc4QTkyNywgMHg2MzhFNjdDRCwKKzB4OTMyNjFBRUQsIDB4RUE5QjI1RkUsIDB4MUVCQ0FGREMsIDB4NTgwQ0M4MjksCisweDU4RDFEQTFBLCAweDY1ODg4MUY4LCAweEM0OERCNjgyLCAweEQ0MkU4Q0I0LAorMHgxREYzM0Q3NCwgMHgzMUMwNEY2OCwgMHg3RDg3MUUyOSwgMHhBRTExRkQ3MiwKKzB4RDdFOEY4RjYsIDB4NTMwRDlEOUMsIDB4NTgwQTA3MTUsIDB4MEYxN0IxQTMsCisweEI4NjNGNDJGLCAweEE2QTREQzA4LCAweDgyNzczRTc2LCAweDkzNTRCMzA5LAorMHhFMTdEMDc3MCwgMHgwNEU0REU1QiwgMHg3MTJFQTM5NiwgMHg0OUQzN0I1NSwKKzB4QUU0MTA5QkEsIDB4MDM4NjJEQzksIDB4N0JDRjYxRDIsIDB4NDNDQTIwMTcsCisweDIzQkRENTBGLCAweDc0NTc3NDU5LCAweDRFOEY0RTIzLCAweEJGOTI0QzFBLAorMHhFNEVDNzBDRSwgMHgzN0ZCRUM2NiwgMHhBNkRBODkzNSwgMHhFMTFGNDA5MCwKKzB4NUM4RjlFRTMsIDB4MTlEMTY3RUMsIDB4OUVFNEYyQzUsIDB4NjRBODFFNkMsCisweEIzNTY0MkJCLCAweDgyMDgzQTAxLCAweDAwMUNBMUY2LCAweEFBNjlDN0U4LAorMHg2ODVGMjREOSwgMHhFNjg2OEUzMSwgMHgzOEFERDhGMCwgMHhBMkZERDQ0RSwKKzB4RUUwQzQ5MUQsIDB4QzYwQjFFOUEsIDB4RjdBODkyNjgsIDB4RkQ3ODRGMzUsCisweEM2QjczMzVDLCAweDc1RUZDRUMxLCAweEUyRDlGN0NGLCAweEUxQzM2NEY4LAorMHg3Q0M2M0IyQywgMHhDMTc5RTJBRCwgMHg1NkMxOTNBNSwgMHg1MTM0RkI2OSwKKzB4MzUwNThCQjUsIDB4MzZGNEJDRDUsIDB4REY0QTA4QzIsIDB4MTRBQTIzMzAsCisweDc2MEM4Q0Q4LCAweDJDNTYyMzk0LCAweDBCRUI2NjlCLCAweDIzMDE5NzNBLAorMHhBRjVDNEZGMiwgMHgxQzc3MEFBQiwgMHgyNUREMjA4NywgMHg3MzJBQURDNCwKKzB4NTkwNTQ5NTgsIDB4NTlERENCRTQsIDB4NzRDRkM4QTgsIDB4N0MwMTUwMTYsCisweDMyQTAyNzZFLCAweDhGMUMyRTkzLCAweDBDRTkxRjcxLCAweDA1NUMzMDdBLAorMHg0MzVEOTY3RSwgMHhGNEMzMzcwNCwgMHg1QkRGMkFENywgMHg4ODU1MDk5QywKKzB4MzA3QjI3MzYsIDB4QkI2QjE5Q0IsIDB4NjI2MzQ5RDMsIDB4OEY1MkFCRkEsCisweDI1MUExRUQ2LCAweEUwNTg3QkMwLCAweDEyODMxNDA4LCAweERBODNDQUJGLAorMHhBQjJDN0RGRCwgMHg2QkNGMDI3MSwgMHg3MjA1OERGMCwgMHgxN0FGQzFERCwKKzB4RkZDNTJDMzAsIDB4NTUxNDAxRTAsIDB4OUVFRDU0REYsIDB4MTRFOTUxRTQsCisweDE0NjI0QjNGLCAweDRDMjQ2NTBCLCAweDVBNjVGODZCLCAweEU5NEY2MTQzLAorMHhEQzdDRTlDRiwgMHg5NEQ1RDhGMywgMHgwOTNCMEEwNCwgMHgyMjA5OEQwMSwKKzB4RURGMDlFN0MsIDB4MTY1RURCMEYsIDB4RDA5Q0E3NzQsIDB4Qjk2QUExNDEsCisweEI1NzQ1OTc4LCAweDlEODIwNDM0LCAweDQyQjBFMDI2LCAweDk2OTM4QTI1LAorMHg3MkU4NjM0QiwgMHhCRTM2RUMwMiwgMHg0MkYzRjc0QiwgMHgzNThGQTYyMSwKKzB4QkQ0NTE0ODQsIDB4QjQzQTc1RDEsIDB4QjBBNTdGOTEsIDB4NzAxQTdDODIsCisweDQ4NEIzRjQ2LCAweDA0N0Y3OEFELCAweDY1RjczNzFDLCAweEVBQzhBOTU0LAorMHhFNTlGNjM1NCwgMHgzRUVFRkI0RSwgMHhGMTMxOTU0QiwgMHgxQzAwQkFDMiwKKzB4RTM4OTc2MzcsIDB4NUZFQzgzQUIsIDB4NThDRkEyQzQsIDB4MUY0QzBBNkEsCisweDk3OTU2QkM2LCAweDYzRDExRDdELCAweEI0NjE3OUQwLCAweDExMDM5QTc1LAorMHgxQjUwRTA4OCwgMHg2OEU5NDc2QiwgMHhBQTY4REI1NSwgMHg4QTRBMDUxRSwKKzB4RUZBMERERjUsIDB4MDVBMkE2NzQsIDB4RkZFMDNFNzIsIDB4QzVBMDI5NUMsCisweDZGRDREODM0LCAweDhFNDJCQjk0LCAweEYzREZEODhFLCAweEJBNjkxQUQyLAorMHgzNDU4NDczRSwgMHg2MjY5QTM0OCwgMHg3Mjk2MkZCNiwgMHg4NkQ1MDY0QiwKKzB4OEExNTM3NDAsIDB4NTRBQzk3RDgsIDB4RUQyQ0UwNTcsIDB4NjgyMDA0NzQsCisweEJCQThFMTlELCAweEJGREQwOEYzLCAweEIwREY3NkQxLCAweDYyRjI5NjQ5LAorMHg1QUI3NzAzMCwgMHgxRUU5QTAwRSwgMHg3REFCMUM5MCwgMHhBQjYwOEZGRCwKKzB4ODUwNkE4NTMsIDB4NzVCOTMzOUIsIDB4MUFFMENDQkEsIDB4RkI2MEJCNzksCisweDg2NTBGOTJGLCAweDQ4MTlFMUY3LCAweDBBNzA0NUE4LCAweEI1QkNFNUYxLAorMHg3N0E5OEIyNywgMHgwM0RFMjFFNCwgMHgzRkUzRjEzMiwgMHgxMDY4MjdFQywKKzB4RDREQzE0NjksIDB4QUFDODJGOUIsIDB4MUQ1OTUzQTEsIDB4ODAzNEIzNjksCisweEQ0NDEyQjZGLCAweDkwRkI5RjI1LCAweDE0Mjc5MDcwLCAweDZEOThBRjFDLAorMHgzRDI4NkYzNywgMHg4MzI0QTczMiwgMHg1ODEyM0U0RSwgMHhFQjA1MTAzMiwKKzB4QzE1Q0Q1NTcsIDB4RUI4MkRFOTksIDB4NjIxMzQzNEUsIDB4MzlGMEZDOUMsCisweDVFQkZFMUM1LCAweDhDRUJGNDcwLCAweEZGN0Q4RDhBLCAweDc0MEE2QTNFLAorMHg3MjBEMDgwQywgMHhCNzNCNzRGQSwgMHg1MTczRjk2RSwgMHg5RkMwMTc5NCwKKzB4REFCRjFDODEsIDB4Q0E4MTMyOTUsIDB4QkVBMkRCOEQsIDB4NEM3RTBDRTQsCisweDgwNTFCQTY3LCAweEU2MzM5OUUyLCAweDgzQTE1RUU0LCAweDQ3RjRBNzE4LAorMHhEODI0NkU2QSwgMHgwQjRGODdCRSwgMHgwMzE2NDhCOCwgMHg5OUUzRTNFNiwKKzB4NEFCQ0M2NEYsIDB4NTI3NjgxODEsIDB4RTcwODM3MkIsIDB4MkQwQjFEMkMsCisweDRERjUyNDAyLCAweDM4OUJFOUY2LCAweERFMkYzMjMyLCAweDVENDNENzRFLAorMHhEMzdCQjg5OCwgMHhFNzI3MjY0NSwgMHg5QjU0MzJEQSwgMHg5RDdBOTQ3MywKKzB4QTY5NjI4QTUsIDB4NTgzNTU1QTcsIDB4MjU1QjA4QkQsIDB4QUQ2OEVBRTMsCisweDFBNzk5ODJELCAweEFDRTA5NzI2LCAweDE1RTU3NkFELCAweDI2MEVCNDA2LAorMHhBNzQ0MEI0NiwgMHg2NkI2RDMxNywgMHhCRTZFQ0EzQiwgMHgzQURFQTFDMSwKKzB4RDgwMzk5QzMsIDB4MEVGMTk4RDAsIDB4RkFFRTIwMTAsIDB4RUYyRThFNTYsCisweDVCNkNDNDAyLCAweDNGRDI3QkUyLCAweDk3MEFBQjVGLCAweDYxOEMxN0M2LAorMHg3RjUwMjJGQiwgMHg1NTJGQzFGQSwgMHg1REQ4Mjk4NCwgMHgwOTc2OTUzOSwKKzB4OTg4MTJEMUYsIDB4QkQ4QjI1MzksIDB4RDc4QUQ5QTYsIDB4MUNFNDFEMDcsCisweDI3MkEwQUI3LCAweDVDQjdFMTAxLCAweDZGNDJENTZBLCAweDAwMUQ5MzBFLAorMHgzQzE3QzMwNSwgMHgzMEFBRTM1NCwgMHgyQTRBQUJFMCwgMHg5MjJCQ0I5NCwKKzB4NzNGMzRDMUMsIDB4RTA3RTE1MDEsIDB4Q0I1NUEzRTEsIDB4MENEQzM2NjksCisweEQ5QzA3REU3LCAweDJEQUI4MkJGLCAweDk2M0VBQ0FBLCAweDlCMDVFMEYxLAorMHhFMkRBMEVGQSwgMHgwNjEzQkZFNSwgMHhERkI2MDVFOSwgMHg1RENDQThGRCwKKzB4NkQ0MzM4NzMsIDB4ODFBOUI0QzUsIDB4RDFEMUNCMTQsIDB4OUI2QTk5MDYsCisweEMxMDQ3NjdDLCAweDMwMTAxRDM3LCAweDE4NkZCQjc5LCAweDhGOTVENDg4LAorMHhBMzA5NEY0MywgMHg3RjE3Qzk4MSwgMHhGRDkyQjNGRSwgMHhBREFCM0FCNSwKKzB4MjBEMTQwNkMsIDB4OTQ2MkM4RTcsIDB4NUQ2NDgxOUQsIDB4QjNFODUxOTYsCisweDY3Qjg1NEZFLCAweDdEMDM5RkM2LCAweEFEOThBODVFLCAweEY2NzJFMDQxLAorMHgzMEZBMTlBOSwgMHg0QTI3NkVCOCwgMHhCNzA0MUQyRSwgMHg1N0JCMjFFMiwKKzB4NEUyNTE2NjcsIDB4MTVDNTQwMUUsIDB4REFCNTk0MzEsIDB4RDZDNkZEMUYsCisweDE3MjZFQjcwLCAweDkwMEY0RTg0LCAweEQzMjdERTMzLCAweDdBMEFFMDRCLAorMHg3NkIxMTc0RSwgMHhGRDU0N0I5NCwgMHgzNzA4MzJEQywgMHhEREU2NUNERCwKKzB4NzQ2NzJDMDIsIDB4MTY0NzAzRkUsIDB4MzRDQUQzMUYsIDB4M0U2OTJERUQsCisweDRCQzM4RkE1LCAweDE0M0Y5OUU1LCAweDYxQkI2NDBFLCAweEI5NTdCQzhELAorMHhDOUREOUUzNSwgMHgyQjVDQjMxMCwgMHhBREQ2RUFEMCwgMHg5MTk4MUQ0NiwKKzB4RUQ4MDNENTcsIDB4NjFENzczN0MsIDB4OTJEM0FDM0UsIDB4MzZBMDM0Q0IsCisweEUxMzk1REM1LCAweDVGMjA3MEY4LCAweEM1RUU5RjhBLCAweDcwNTQ2Qjg4LAorMHhDOUVBMjMwQywgMHg1OERDMzA3MywgMHg1N0NCQkVCNywgMHhBMEI3OENGRSwKKzB4MEIzRkU3NUIsIDB4MDdBREFDQ0QsIDB4QzI5MkMzMzgsIDB4RDcwQ0Q3RTUsCisweDcyOUQ4RjRFLCAweDIxOEZBMDQxLCAweDEwRUMxMTk5LCAweEFDMUVDNTFELAorMHg1REVDQzhEMSwgMHhCQTM2MjMwQSwgMHhCQzQxRjVBNSwgMHg3NTg2NDg5NiwKKzB4QjQ0MDNENEEsIDB4RkVFRThGNDQsIDB4OEQ5NEEyNTYsIDB4NjJCQTAxMTUsCisweDNBNTcwQzYxLCAweDkyMjFDNTgzLCAweEQyOTgxQTZCLCAweEZEOEFBRjVBLAorMHgyQTEwMkQ1OSwgMHg2NDA4M0JERCwgMHhCRDFBQURFNiwgMHg3RTZEMUU5OSwKKzB4MjA1NjhBNkQsIDB4OERGQTcwNEIsIDB4ODdEMjcxMjIsIDB4MkVGREFCN0QsCisweEYzQUY5RDM5LCAweEQ4REVEMEIyLCAweDJENEIzNEI5LCAweDEyRjNFMzJDLAorMHhBNkJDQkU2NSwgMHg2ODAwMjlBMSwgMHgwOTRCMDdCMywgMHhEQTU5MThFRCwKKzB4RjdEMEE4NkQsIDB4MUE3RTE4QzgsIDB4OTI4NUE5N0YsIDB4MjA0MDI4MkMsCisweDVCMTMzNTMxLCAweEE0ODIzN0FDLCAweDM1NTdCQzFCLCAweDdFNkVENzdCLAorMHg0MzYyMzRDNywgMHg5QjIwOTRERSwgMHg1RDk2NzU5MywgMHg4ODY3RDFDNCwKKzB4ODhFQzM5NDgsIDB4RTdGODRBRDQsIDB4MTg3MUIzRTYsIDB4RThFOTkyQzYsCisweEExNkRDMkY4LCAweDBERkRGNTkwLCAweDlCNTYyMzhELCAweDMyOTAxN0Y1LAorMHhCRjlCRDQwOSwgMHg2OEJEOUIxQywgMHg0MDM2QzRGRiwgMHgzQkY2RDkzQywKKzB4QUUxMDA2MDIsIDB4OTBCNDM1MDgsIDB4QTg1QjQwMTMsIDB4MkM2NkVBNTQsCisweDIyN0QzMkQ3LCAweDBCQTUyNkQxLCAweDA3NTIxM0I4LCAweDFBM0RFRDA3LAorMHhENDU4REZGRCwgMHhEQzhBQ0Q0MywgMHhBQzc4MDlBQiwgMHgyRDI1NDA4QSwKKzB4RDhGMEM4ODcsIDB4QUQ4Q0QzMEQsIDB4NDA1NEY2MUUsIDB4QTlGMENDQTMsCisweEJGRUJEMzFELCAweDZEMkJBQjFFLCAweEY4RTQyRDhCLCAweDZDOTRBNEU0LAorMHgxMTU4RDJBMywgMHg5M0Y0NEVGRSwgMHg4QUQwNUEyNSwgMHg4QzIyOUQzMiwKKzB4QjIxM0Q3NkUsIDB4REZFNjM4MjIsIDB4NTYxOTg2RUMsIDB4ODA2Q0EwODIsCisweDZEQjNCRjhELCAweDFFODUwRDMwLCAweDhGN0E0NEMwLCAweDc1QkIzMzI4LAorMHg4NkM3QkUxMiwgMHhERTVDNDRCRCwgMHhERjREMDQ4RSwgMHg5Njg3MTJDMywKKzB4QjFCNDFDRjgsIDB4Q0MxOTRGRTksIDB4REEyRTFBOEQsIDB4NzJBMDg2NjIsCisweDVBQkEyNTM2LCAweDIyM0UyMDEzLCAweEE1QTkyM0E1LCAweDc1NjVCNURELAorMHhCQ0EwQTJCMCwgMHgwQzI5ODY0QiwgMHhBQUQ4Q0I4NywgMHhFNEM3RTU1OSwKKzB4NzdFMTlFNTEsIDB4MTk0RTU0RUQsIDB4NTRERDFCNTQsIDB4MEZBRDM3QTcsCisweDBFRjZCMEUzLCAweDBFM0EyRkM4LCAweEEwMDYzOTk1LCAweEUxN0FFMjBFLAorMHhEQzExQjdGOCwgMHg4NUYxQTc2RCwgMHhEOTc4NThENCwgMHhCNzYzRTQ5QywKKzB4QjVCRTdFQzQsIDB4M0NFOTI0QzQsIDB4NDI0NjAxOUQsIDB4RDMzREJCMjcsCisweDczNzg2M0E3LCAweDMyQzI2QkRELCAweDcxNDg5N0EzLCAweDM2MDkxMDE4LAorMHhGMjZCQzk5MCwgMHhEREI2NDBCMCwgMHg0NDhGNUIxMiwgMHhEN0E1RUI0QiwKKzB4NTYxNEVFQTQsIDB4Q0E0OTEyRkIsIDB4MDExRjlENkMsIDB4QTRGQzkwQUIsCisweDlGQjQ5ODJELCAweDIwQUQxNDZGLCAweDRCN0FCNzRFLCAweDEwN0E5NDExLAorMHg3MURCQTkwQSwgMHhENTEwRTNEMiwgMHgyNDhEMEQzNSwgMHhCNjY2MjI5RSwKKzB4NjFFRTFFRUEsIDB4NzAyMDMxQjUsIDB4MzY5OTJBN0IsIDB4QzkwQzA4Q0IsCisweDY0Nzg5OTVBLCAweEU2QzJCQTdBLCAweDhBOTE3OUFDLCAweEM4RUUyOTU2LAorMHgyN0IwNDJDOCwgMHg0OERCODFEOSwgMHhBQTM5RjJDQiwgMHg1RTRENUYzQywKKzB4MjRGRkQ2QjksIDB4NUI1NjJDMkYsIDB4MDBGRDMzQjYsIDB4NDM1RjVGNTIsCisweEYzOTJGRkMxLCAweDBFOTI3QzQwLCAweDU1MDhDQkFCLCAweDk3NkFBNTY3LAorMHhBMTNFN0M1MiwgMHg1MzIxMDlFOSwgMHgxNkI5MDIxRiwgMHg2MEM2MTVBMSwKKzB4MUQyM0MyNTgsIDB4RkQ3ODMxNDcsIDB4NjM2MDBGQjEsIDB4QUFBMjQ1RjAsCisweDlCM0RDMUUxLCAweDdCMjcwRDBELCAweDVCMTYzMkNFLCAweDhCODcxRjdGLAorMHhDNTM1RUZGOCwgMHg3MzEwOUM2QSwgMHhFQjgzRDAyRCwgMHhGN0FFNzZGQiwKKzB4MkUzOUU1MDIsIDB4QTQxMjgyMTYsIDB4RjkwRDU3RTUsIDB4RkYwQzQ2NUUsCisweDAyMDA4MDI5LCAweEU1Q0JCQTFGLCAweDQyODBGQTNDLCAweENEQkQ3NUM4LAorMHhDQjRBRjM0MiwgMHgxNzY5NUE0RSwgMHhBQTYxNjJCNSwgMHg4NjYwQTY3OSwKKzB4RDFBODcwMUMsIDB4NDc2OTRDQTcsIDB4REE4RDQzRkQsIDB4NDRBNEJDMUIsCisweEFCMzRCOUFBLCAweEU1NTU2M0RELCAweDA4RDQxNDJCLCAweDgxMTk3QUM4LAorMHg5OTdCMURDMiwgMHgyRTdDQzUwQSwgMHg3QTMyNkEyMSwgMHhBNzY0MTlEQiwKKzB4RUE4QjU0MjgsIDB4NjU3MjkxNDAsIDB4MDUxREFGNjYsIDB4ODg3MUJDQTksCisweEExNzVFNUJGLCAweDYwMzEwQzk4LCAweEI3REU4OTI5LCAweDM1RTI0NTlFLAorMHgwOEVCNDU0NywgMHg5MDREN0IyQiwgMHgyOTM4MkNDNCwgMHhDRUM4NjY0RSwKKzB4MUU4QzlDMkMsIDB4M0I5NDIxMzQsIDB4OUNFQzVENTUsIDB4REE1NDgzNzYsCisweDJFNEVGRDYxLCAweDI2RjY1RjA5LCAweDVBM0REN0NBLCAweDJGRDRFNThELAorMHg2QjcxQjhDMiwgMHgxMzE4OTExNSwgMHgyQjU1NDJCQSwgMHgxQ0U4NUMyQywKKzB4NUI5RkUwOUQsIDB4Njg3MDRCRkUsIDB4QjE1MzEzQjksIDB4M0VGMjcyOUUsCisweDU4M0VDQzMxLCAweEEzREVEOENBLCAweEZDRDI3QzNELCAweDkwNERBQjM5LAorMHhGRTEwNjlBNCwgMHhFOTlBNTdCQSwgMHgxMTJFQjgwQywgMHhFMTQ4M0M3NCwKKzB4OEEyN0IwRDcsIDB4QTU4RjczMjUsIDB4N0NEMDUwQTEsIDB4NjI2RDRGM0UsCisweDUxNjQzNjU3LCAweEE5NjdGQzU5LCAweDVCQUNCQzBCLCAweDJDRjNFNDU5LAorMHg3RDg5ODhEOSwgMHg1MzkxM0RGOCwgMHgyMzgxQTZGQywgMHg2NEQ2RDQ0MSwKKzB4NDhBRTkxMDEsIDB4MTg1RDk1MzksIDB4MUIwNDRBRUMsIDB4QjVBQkNFREQsCisweEZBOEVDQTUyLCAweDhDQ0REMTQyLCAweDk2RkQ0NDQyLCAweEQ4NjVGRURGLAorMHhDRTRFRTJGQSwgMHhBNTE2MEFFOSwgMHhDOTFCMkIzQSwgMHhGOTkzRjQ1RiwKKzB4MTUwOTEzMkMsIDB4OTIwRUNDNUYsIDB4RDgxM0REQzEsIDB4ODM0QjY4RTQsCisweEQ1RTg3NkEwLCAweDYxREUwRTQxLCAweDRDMTQzOTEzLCAweEM3MjkzOTg1LAorMHgxN0UyMjZFNywgMHgzODgzMDkyNywgMHhEQzYwNERGMiwgMHg3OTlEMTQzMCwKKzB4ODQ2NTg1QUIsIDB4RTVEMjFFMzgsIDB4NjM4MUQxMzYsIDB4MUI2MDYzM0IsCisweDIzQjdBRTE0LCAweDU1NEU1M0NDLCAweDU4MDdBMjEwLCAweDMwNTYwODY2LAorMHgxMkY3OUU2MiwgMHhFMjdCNUQ0NSwgMHgzODg5QzFFNSwgMHg0N0Y4NDVGRiwKKzB4RkZEOURFOTgsIDB4QjEwRTA5RDIsIDB4NEExODRBNzIsIDB4MDgzRDI5NzEsCisweDhBQjc0NzhELCAweDkyMzgwMzc3LCAweDU3QTcyNEVDLCAweEJCQkQ1Q0E2LAorMHhFMkZCOUQzMiwgMHhBQjZBREZDNiwgMHgzOTE2REVENCwgMHg0RTE5NDM4RiwKKzB4RTIxRTE1Q0YsIDB4NkFGNEJDQzksIDB4OEQwODkyNEEsIDB4MTY2MkJBQTksCisweDMwNjRBRDI3LCAweEI4NkQ3RUU0LCAweDg4NjI0QzYyLCAweDFBMEJGM0U3LAorMHhGM0U0QTI4NywgMHg2Nzg3RjAwNiwgMHgwMTM3NUQ0QiwgMHg5OThCQjM4RiwKKzB4NkQ2NjlBMjksIDB4RDc2MEIwOTMsIDB4QzQ3Njg4NTMsIDB4RjA0MTEwMEYsCisweDM1REUxMERELCAweEUwNkM4QkI4LCAweDJDNzlBOTAyLCAweDYwNjAwREFELAorMHg2RTExQ0Y1QywgMHgxODc3ODc3NywgMHg3Q0NFNDA2QywgMHhFNTRBRjJFQSwKKzB4NzQ3MkM0NzUsIDB4NzNEQkVFN0UsIDB4RTUzM0RDNDAsIDB4QjA3NDA3REQsCisweEY2QUNBOEQzLCAweEU3MUJEN0QxLCAweDRCRDM1MTRELCAweEM1QzM2MkNBLAorMHgwNjkwRTVBMSwgMHgwRkZEQzhEOCwgMHg1ODE4ODY0NSwgMHg4NjM2NDEzQywKKzB4MzQxMkEwMzMsIDB4QUY0RkMzNDAsIDB4QTVERkVBQjgsIDB4Qjg3MjcyRTMsCisweEE0QTkyMTlGLCAweDI5Njk2RTkwLCAweDM1RDJGNjI3LCAweDg3OTREQkQ3LAorMHg1RDJEODdGOCwgMHhGQTczNTU5RCwgMHg3RDIyRjQ0MCwgMHhGNTAxOTdFOSwKKzB4RUI3NEI4MjksIDB4OEY5NjQ5Q0YsIDB4MTZGNDdEMzAsIDB4NUM3RDk4NzAsCisweDM2RkY2QzBCLCAweDMxM0E5MkVELCAweDMwM0IzNjU0LCAweEUzRTMzQ0NBLAorMHgwMkMyNkVDQywgMHgyNjk0OTkyMCwgMHg0NDQ1REYyMCwgMHgwMUZEQkM5OCwKKzB4NDkxMzhDNkYsIDB4MUI1NTU1RTIsIDB4MTIyQjQ1RDIsIDB4NEIyRTAyMDIsCisweDdCNjAxNEQ0LCAweEZBRTBDRDA5LCAweDc3RTE2NUEwLCAweEZCRTc2OTgwLAorMHhGNTgwOEJEMywgMHhGRDExMEU1RSwgMHg5NzQ1MEUxMSwgMHgyOTdGOUIxRiwKKzB4NjA3QTJDNDEsIDB4RTM4NERGQzksIDB4MjVEOUE4REMsIDB4RjkxOUQ5NTUsCisweDVFMDI1OTkzLCAweENDMzE4ODQ3LCAweDk3MTdEMkQ1LCAweDQ4RjBERDFGLAorMHg2Q0M0QThFQiwgMHg5QkQwRjRFMSwgMHg1MDZGMkE5MywgMHgxOEI4NzQ4RSwKKzB4MTZGRkJBNDgsIDB4NTUyRTQ5NTUsIDB4Qjk2M0Y2NEYsIDB4QTFBMzRBQzgsCisweDYyRTk1Q0M3LCAweDREODdFQTg5LCAweDIxRThDMDMxLCAweEMxRjBFRDA3LAorMHgyOEI3QkIyMiwgMHgwQjgzOEQwNCwgMHg2MzYxQjQ0MCwgMHhBNjUzNTIxQywKKzB4OTJEQTNGNzgsIDB4NDI0MUNGRUQsIDB4RkFGQ0JENDEsIDB4M0VGQUI2QkMsCisweDI1RjMwNjA3LCAweDQxQkI3MERBLCAweDlGRjM0NDBBLCAweDI1MDIwMzlFLAorMHgzODEzRUM4MiwgMHhDNkE0RkQ2QiwgMHhGODUzN0M4QywgMHgwOThFRDQ5RiwKKzB4RTBBMEJENkUsIDB4NkJBMkYyQjMsIDB4QzM1QzlEOUQsIDB4MTI1NkU2NkEsCisweDc5MEIyNDkwLCAweEQ1QzY5ODg5LCAweDM5RTcxMkZFLCAweENGNzNERTBCLAorMHg0MUIzQjYxNCwgMHg3NDVBQkQ3MywgMHg2NTRDNzlEOCwgMHg1QjE1OTIzRCwKKzB4OEMxNUYyMTgsIDB4NTg1Q0NDRjAsIDB4NjI0RjdCNDQsIDB4NzZCRERGREIsCisweDk2RjI2QjUyLCAweEUxMzA1OEExLCAweDA4NkM5NTBFLCAweDI5NTE5REVBLAorMHhBNDJDRkUwNCwgMHgwRDdBMTkwQiwgMHhEMDY3OEM2QSwgMHhBQkI3ODY3OSwKKzB4QkE0OEEyRTQsIDB4NUYzREExMEEsIDB4MTFGMDQxODMsIDB4QUM3MjBBM0YsCisweDZBODA3NzgxLCAweDZGMTQ2QkZCLCAweEU4QTY3OTM0LCAweDU0NTc4ODM0LAorMHhBQTYwQzhGMCwgMHgyMDYxQTFFNiwgMHg5RTg3Nzk5QiwgMHg2OEQ5MUY4NiwKKzB4ODk3NEY1NDAsIDB4QjFDM0YxMDEsIDB4OTlDMjFFNTYsIDB4QjU3QkE3M0YsCisweDhCMkRBQTNFLCAweEYxRTJEMjRFLCAweDQ4RjdENEVFLCAweDcwMzlGREIzLAorMHhDNjY2RUVEQywgMHgyNTFGOTcyRSwgMHg0RDUzRjZCRiwgMHg2Q0M3M0VFNywKKzB4Q0IwN0Y3QjksIDB4NjlFQ0I4Q0EsIDB4MzYzRkQ4MEMsIDB4M0I1ODdBQjMsCisweDczOEMxRTVDLCAweDVDOUMxRDkyLCAweEU3QjUyMzk2LCAweEVERTYzMjRCLAorMHhGRTVCNTA0NSwgMHhDOTBEOEIzRSwgMHgzNzFBMDEyOCwgMHhGMkM4RENGOCwKKzB4NUI2NDhDQjUsIDB4MTJGOEU4RkYsIDB4NUZFNEJBNzEsIDB4QjkyNUNGQkUsCisweDc0MTZFMTRGLCAweDc2NDg5RkZFLCAweDFGNERFMzY3LCAweEE0MDBGMDM5LAorMHg2NjM5MEU4MywgMHgxQUU3OUNFQywgMHhEQjU3M0U5OCwgMHhCNjAyMUYyOSwKKzB4RDAxNjE1RTUsIDB4MDJBMjI4MUYsIDB4RTg1MDE5QzEsIDB4MDI3QkI0MUYsCisweDhEOTE3N0MzLCAweDc5MDI2RTc4LCAweEYxNThCNjIzLCAweEJFRkY1ODU4LAorMHg3QjYzNTE4RSwgMHg4RjQyQzA4QywgMHhCMzg4MjI3RCwgMHg5NDBENjA3QSwKKzB4QTRDNzk1NDEsIDB4OTgwMENDOTEsIDB4QTM1NkI1MzUsIDB4Mjg1QkFCQjksCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHhFNDExRTUyMCwgMHhBMDAyNDUyOCwgMHg0NDJCNDQyOCwgMHg5NjA3MDAwOSwKKzB4NDYxMDYyNDYsIDB4OEZGQjI1MjIsIDB4RDQwMjc1MDQsIDB4MDAwOUFGRjUsCisweDAwMDAwRkIzLCAweDAwMjAwMDA0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxNkQ0OTM1NywKKzB4MDAwOTAwMEIsIDB4NEYyMjJGRTYsIDB4REU5NDdGRkMsIDB4RTExNEQ1OTQsCisweDFFMTNENDk0LCAweDY3NTIxRTRDLCAweEQ0OTRENjkzLCAweDM3NDAyNzY5LAorMHg2MjUyOEYwNiwgMHg3MjAxRDY5MiwgMHg2MDYwMjUyMiwgMHgyNjAwQzkzRiwKKzB4RDc5MDYxNTIsIDB4MjUxMjYxMUQsIDB4MjY0QjY2NTIsIDB4MjU2MjQ3MEIsCisweDAwMDlCMDBELCAweEU2MDA5NUFDLCAweEM4NDA2MEUyLCAweDJGMDI4RjAzLAorMHg4RkY5MzY1MiwgMHg3RjA0NzYwMSwgMHhBMDVBNEYyNiwgMHg0RjIyNkVGNiwKKzB4NDEwQkQxODUsIDB4RDQ4NTAwMDksIDB4MDAwOTQ0MEIsIDB4NDUwQkQ1ODQsCisweEQ3ODQwMDA5LCAweEQyODRFMUZGLCAweDI3MTI2MTFELCAweEQ0ODM1MDI5LAorMHhFMUZGQ0IwMSwgMHgxMjA5RTUwMSwgMHgxMjExMjIxMiwgMHhFNzIwMjQ1MiwKKzB4NDcxOEQ1N0YsIDB4MjU3MkQyN0YsIDB4RDE3RkU3MDAsIDB4RDY4MEQ0N0YsCisweEUyMDEyMjcwLCAweDI0NzAyMTcyLCAweEQ2N0UyNjIwLCAweDI2NDFFNEZGLAorMHhENTdERTYwMCwgMHg2NjZERTEwNCwgMHg3NjAxNjA2MywgMHg0MDAwNjI2RCwKKzB4OEZGODMyMTIsIDB4RDU3OTA1NDUsIDB4MjUyMEUyMDEsIDB4RDI3OUQ3NzgsCisweDI3MTBFMTAwLCAweEU1ODAyMjEyLCAweDY1NUM2NjEzLCAweDY2NkRENDc2LAorMHg3NjA0Njc2MywgMHgzNzRDNjI2RCwgMHg4RkY4MzI1MywgMHhENDczMjcxMiwKKzB4RDU3M0UxMDEsIDB4RDY3MzI0MTAsIDB4MjU0MkU0MDAsIDB4RTAzQUU1MDEsCisweEQyNzJENzcxLCAweEUwMzkwNjU0LCAweDI3MTEwNjU0LCAweDAwMEI0RjI2LAorMHg3RkM4MjIxMSwgMHhENzZGRDE2RSwgMHhEQzcwREI2RiwgMHhEMjcxREU3MCwKKzB4RDU3MkQ0NzEsIDB4MUYxMkQ2NzIsIDB4MUY3NjcxMEMsIDB4MUZCODc3RkMsCisweDFGRUExRkM5LCAweDcyMDQxRjJCLCAweERFNkZEQzZFLCAweDFGMTNFQjEwLAorMHgxRjUxMUY0NCwgMHgxRjc3MUY2NSwgMHhEODZDMUYyQywgMHhERDZERDk2QywKKzB4RDI2REVBMDAsIDB4ODkwMDNBMjIsIDB4RDE1ODdBMDEsIDB4ODgwMTYwMTAsCisweDU2Rjk4QjAzLCAweDQyMThFMjAxLCAweEQxNjgyNjIyLCAweDAwMDk0MTBCLAorMHg0NDBCRDQ2NywgMHhENTY3MDAwOSwgMHgwMDA5NDUwQiwgMHg2MDEwRDE0QywKKzB4OEIxMDg4MDEsIDB4RTY1MEQxNEIsIDB4NDYxODYyMTIsIDB4OEIwODMyNjYsCisweDU2RkFEMTQ3LCAweDIxMjBFMjAwLCAweENCMDE2MDYyLCAweDI2MDJBMDAzLAorMHg3MjAxMjcxMCwgMHg2MDgyMjEyMiwgMHg4OTA5ODgwMSwgMHhFMkM4RDE1QSwKKzB4NjIyQzY2MTIsIDB4ODkwMzM2MjYsIDB4NjAxMEQxNTgsIDB4OEJDODg4MDEsCisweDUxRjc2NzkyLCAweDIxNzI1MkY2LCAweEQ2NTU1MTkxLCAweDU1RkIyMjEyLAorMHg1MkZDNjQ2MiwgMHg1NTYxMjU0MiwgMHgyMjUyRTQwMCwgMHg2MTQzNjY0MywKKzB4MDVERTYwMTMsIDB4MzZDQzQ2MDgsIDB4MDJERTI2NTIsIDB4QzkwMzYwMjEsCisweDhCMDI4ODAxLCAweDcyMDE2MkUyLCAweDc0MDEyRTIyLCAweDM2QjM2NjRDLAorMHg3MTA0OEZFRSwgMHg2NkMyRDE0NywgMHg0NTI4NjUxMiwgMHgyNjVCNDUxOCwKKzB4NjA4MjJDNjIsIDB4ODkwMTg4MDEsIDB4MDAwOUExNjgsIDB4NjI3MkQ3NDIsCisweDhCMTMyMjI4LCAweEQ3MjZENTQxLCAweDY1NTJENDQxLCAweDUxNDM2NjcyLAorMHgzMTZDMzY1QywgMHgyNzYyMjY2OCwgMHgxNDEzOEQwNSwgMHg2MjYyRDYzRCwKKzB4QjFBNTcyMDEsIDB4RDYxRTI2MjIsIDB4MjYyMkUyMDAsIDB4NTI5MTY2OTIsCisweDhCMDEzNjIwLCAweDAwMDlBMTQ0LCAweDYwNjFBMDZFLCAweDAwMUMwMDFDLAorMHgwMDFENDAyMCwgMHgwMDAwQjM4RSwgMHhGRkZGMDAwMCwgMHgxMjM0MDAwMCwKKzB4MDAxRTEwMTUsIDB4MDAyMDEyNzgsIDB4MDAyMDE4QTAsIDB4MDAyMDE5MjIsCisweDAwMjAxMjhDLCAweDAwMUMzNTEwLCAweDAwMUMzNjI0LCAweDAwMUUyMTJDLAorMHgwMDIwMzk3QywgMHgwMDIwMzUxNCwgMHgwMDIwMzk4NCwgMHgwMDIwMzk5MCwKKzB4MDAyMDM5OUMsIDB4MDAyMDM5RjgsIDB4MDAyMDM5RkMsIDB4MDAyMDM5QTQsCisweDAwMjAzOUE1LCAweDAwMjAzOUE4LCAweDAwMTE3NzAwLCAweDAwMjAzQTEyLAorMHgwMDIwMzU3OCwgMHgwMDExNDJEOCwgMHgwMDIwM0ExNCwgMHgwMDIwM0ExNiwKKzB4MDAxQzNEMzAsIDB4MDAxMTc3MTgsIDB4MDAxQzNEMDAsIDB4MDAxQzEwMDAsCisweDAwMUMzNkY4LCAweDAwMTE3NzM0LCAweDAwMUMzNjg0LCAweDAwMTE3NzEwLAorMHgwMDFDMzUyMCwgMHgwMDExNzYwMCwgMHgwMDExNzc0MCwgMHgwMDFDMTAyOCwKKzB4MDAyMDM1OEMsIDB4MDAyMDM5QUMsIDB4N0ZGRkZGRkYsIDB4MDAyMDE3MzQsCisweDAwMjAzMkJFLCAweDAwMjAyMkU4LCAweDAwMjAzREMwLCAweDAwMjAzOUZBLAorMHgwMDIwMzU4NCwgMHgwMDIwMzlFQywgMHgwMDFDM0QyQywgMHgwMDFDMzZCMCwKKzB4MDAyMDM1MUMsIDB4MDAxMTc3NUMsIDB4ODgwMUM5MEYsIDB4QTBDRjg5MDEsCisweEQxN0MwMDA5LCAweDM2MjA2MjEyLCAweEQ0N0I4OTA0LCAweDI0MjFFMjAwLAorMHgyMTYyQTBDQywgMHg2MjExRDE3OSwgMHg4OTAxMjIyOCwgMHgwMDA5QTBDMywKKzB4RTIwMkQ3NzUsIDB4NzUwMTY1NzEsIDB4MzEyMzYxNUQsIDB4Mjc1MThEMDIsCisweDAwMDlBMEJDLCAweEQyNzI1NUYyLCAweDYyMjI2MDUyLCAweDQwMDk0MDE5LAorMHhDOTBGNDAwOSwgMHg4RjE5ODgwQSwgMHg1MkYzMUYyRCwgMHg0MDE5NjAyMiwKKzB4NDAwOTQwMDksIDB4ODgwOEM5MEYsIDB4QTBBNzg5MDEsIDB4NjA2MzAwMDksCisweDUxRjI1NUY4LCAweEU3MDFDQjAxLCAweDI1MDJEMjYzLCAweEUxMDAyMTcyLAorMHgyMjExRDU2NCwgMHg3NDAxNjQ1MiwgMHgyNTQyQTA5OCwgMHg4QjNGODgwNSwKKzB4NjAyMjUyRjMsIDB4NDAwOTQwMTksIDB4QzkwRjQwMDksIDB4OEIxNjg4MDIsCisweEU1RkZENDVELCAweDY1NUQ2NzQyLCAweDhCMTAyNzU4LCAweDYyNzJENzVCLAorMHg4QjBDMzI2MCwgMHg1NUYyNTdGOCwgMHgyNzYyRTEwMSwgMHhENTUyMjUxMiwKKzB4RDc1N0U0MDAsIDB4NjI3MjI1NDEsIDB4QTA3NzcyMDEsIDB4NTJGMzI3MjIsCisweDQwMTk2MDIyLCAweDQwMDk0MDA5LCAweDg4MDVDOTBGLCAweDMxQjM4QjZFLAorMHhENTUwOEI2QywgMHg2MTUyNTdGNCwgMHg3MTAxRTI0MCwgMHg2NDcyMjUxMiwKKzB4MUY0REQxNEQsIDB4NDIxODI0MTksIDB4OEIwMzM0MjAsIDB4NjI2MkQ2NEIsCisweDI2MjI3MjAxLCAweEUyMDBENjQwLCAweDI2MjFCMEFBLCAweDAwMDlBMDU2LAorMHgzMTIzRTIyMCwgMHg4ODAzOEI1MiwgMHg1MkYzOEIxRSwgMHg0MDE5NjAyMiwKKzB4NDAwOTQwMDksIDB4ODgwM0M5MEYsIDB4RDc0MThCMTYsIDB4NjQ3MjUxRjQsCisweDc0MDFEMjNELCAweDY1MTIyNzQyLCAweDFGNURFNjQwLCAweDQ2MTgyNTI5LAorMHg4QjAzMzU2MCwgMHg2MjYyRDYzQiwgMHgyNjIyNzIwMSwgMHhFMjAwRDYyRSwKKzB4MjYyMUIwODYsIDB4MDAwOUEwMTAsIDB4RDczOEQxMzcsIDB4RDIyQTY0MTIsCisweEU1MDA3NDAxLCAweDIxNDIzQTc2LCAweDIyNTE4RjA2LCAweEVBMDBENjM0LAorMHg3MjAxNjI2MiwgMHgyNjIyQjA3NCwgMHgyRkIyRDUzMiwgMHg5NTQwNjY1MiwKKzB4RDQzMDVCRjEsIDB4MzYyMDUyNDEsIDB4NjA2MTg5MTAsIDB4OEIwMUM4MDMsCisweDJCMjJFMjAxLCAweDhGRjU0NTEwLCAweDU3RjE1NjY0LCAweDYyNzJFMUYwLAorMHg0MTI4NDExOCwgMHgyNzIyMjIxQiwgMHg2QkYyQTAwOCwgMHg2QkYyQTAwNiwKKzB4RTIwMEQ2MTUsIDB4RDExNTI2MjEsIDB4MjEyMUUyMDAsIDB4RTIwMjU2RjUsCisweDQyMTg2NjYyLCAweDI2Mjg0MjI4LCAweDFGNkQ4RDBDLCAweEQ2MUZEMTFFLAorMHg0NjBCNjUxMSwgMHgyMDA4NjQ1RCwgMHg1N0Y1ODkwNCwgMHg2MjcyRDExQywKKzB4MjcyMjIyMTksIDB4RDExQkUyMDEsIDB4NjYxMjI4MjIsIDB4OEIwMTI2NjgsCisweDAwMDlBRTE3LCAweDQ1MEJENTE4LCAweEQxMTgwMDA5LCAweEFFMTBFNjAwLAorMHgwN0QxMjE2MCwgMHgwMDIwM0EwQywgMHgwMDIwM0ExMCwgMHgwMDIwM0ExOCwKKzB4MDAxQzNEQzAsIDB4MDAxMTc3MkMsIDB4MDAxQzNCODgsIDB4MDAyMDM5RjQsCisweDAwMTE3NzNDLCAweDAwMTE3NzQ0LCAweDAwMDBGMDAwLCAweDAwMTE3NzY0LAorMHgwMDExNzc0OCwgMHgwMDExNzc2OCwgMHgwMDExNzc2QywgMHgwMUZGRkZGRiwKKzB4MDAxMTc3NEMsIDB4MDAyMDM1ODQsIDB4MDAxMTQyRDgsIDB4MDAxMTQ3NzQsCisweEZERkZGRkZGLCAweDAwMjAzREMwLCAweDAwMjAyNDZDLCAweDAwMjAzOUZBLAorMHgyRjk2MkY4NiwgMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwKKzB4RDExRjdGRjQsIDB4NjIxMkRFMUYsIDB4NjdFMjU0MTEsIDB4RDQxRTFGNDEsCisweDFGNzIyRjIyLCAweDY3NDNENTFELCAweDc3OTREMjFELCAweDVBNDI1ODQxLAorMHg2QzcyNjk0MiwgMHg2RDIyNUIxNiwgMHhFNjAwNjA1MiwgMHgyNTAyQ0IyMCwKKzB4NzYwMUU1NDAsIDB4MzI1MzYyNkQsIDB4NjJGMjhCRkIsIDB4MjEyMjU1RjEsCisweDU1RjIxMTUxLCAweDJFNTJENjEzLCAweDE0QTIxNDgxLCAweEQ0MTIyNDkyLAorMHgxMUI2MjdDMiwgMHg2NzQyMjZEMiwgMHhEOTExREExMCwgMHgyQTcyRTgwMSwKKzB4MUE4QzQ5MEIsIDB4NDIxOEUyMDEsIDB4N0YwQzFBMkMsIDB4NkVGNjRGMjYsCisweDZDRjY2REY2LCAweDZBRjY2QkY2LCAweDAwMEI2OUY2LCAweDAwMDA2OEY2LAorMHgwMDFDM0I5QywgMHgwMDFDM0Q5OCwgMHgwMDFDMzcwMCwgMHgwMDFDMzUwMCwKKzB4MDAxQzU5NjAsIDB4MDAxQzg5NjAsIDB4MDAyMDM1OEMsIDB4MDAxQzNEMDAsCisweDAwMjAxNjEwLCAweDJGOTYyRjg2LCAweDJGQzYyRkE2LCAweDJGRTYyRkQ2LAorMHg0RjEyNEYyMiwgMHg3Rjg4NEYwMiwgMHhFMDE4REVCMiwgMHhENEIyNjFFMCwKKzB4NjFFMzBGMTQsIDB4NjIxMDcxMDEsIDB4NDQwQkUwMUMsIDB4MjAwODBGMjQsCisweDhGMTI2RDAzLCAweEQ0QUQxRjA4LCAweDY3NDBEREFELCAweDY1N0NENEFELAorMHg0NzBCRDdBRCwgMHhEMkFEMDAwOSwgMHg2MjFDNjEyMCwgMHg0NjA4NjYyMywKKzB4MzYyODQ2MDgsIDB4M0Q2QzQ2MDgsIDB4RTAxQzFGRDgsIDB4RTU4MDA0RkMsCisweDYwNEM2NkUyLCAweDMwNTA2NTVDLCAweDJENjI4RjE3LCAweDAxRkNFMDE4LAorMHhERUEzRTUwMCwgMHg2NDFDQTAwOCwgMHg2NzUzNjU1RCwgMHg2MDcwMzdFQywKKzB4MzFEQzYxNTMsIDB4ODAxNDc1MDEsIDB4MzI0MzYyNUQsIDB4RDQ5RDhCRjQsCisweEUyMDBENTlELCAweEEyN0YyNDIxLCAweDIwMDgyNTIxLCAweEUwMTg4QjEzLAorMHhFNTAwMDFGQywgMHhBMDA5REU5NiwgMHg2NTVENjQxQywgMHgzMkVDNjI1MywKKzB4NjI1MzY3MjIsIDB4MzJEQzY2NzIsIDB4NzUwNDEyNjEsIDB4MzI0MzYyNUQsCisweEEyNjk4QkYzLCAweDg4MDEyRDEwLCAweEUwMTg4QjE2LCAweEU0MDAwMUZDLAorMHg2NzFDMkQ0MCwgMHg2MjREREU4QSwgMHg4QjAxMzI3MywgMHgwMDA5QTI1QywKKzB4NkRFMzY0NEQsIDB4N0QwNDYyNDMsIDB4MzJFQzY2NDMsIDB4NjUyMjM2REMsCisweDc0MDg2MTYyLCAweDI1MTJBRkVGLCAweDhCMTk4ODA0LCAweDAxRkNFMDE4LAorMHgyRDcwRTcwMCwgMHgxRkQ1NkQxQywgMHg2MjdEREU3RCwgMHg4QjAxMzJEMywKKzB4MDAwOUEyNDIsIDB4NjE3MzY3N0QsIDB4MzFFQzY1RTMsIDB4NzUwNDY0MTIsCisweDM2NUM2NjczLCAweDYxNDI2MjYyLCAweDIxMjk3NzA4LCAweDI0MTJBRkVELAorMHg4QjE5ODgwNSwgMHgwMUZDRTAxOCwgMHgyRDcwRTcwMCwgMHgxRkQ0NkQxQywKKzB4NjI3RERFNkYsIDB4OEIwMTMyRDMsIDB4MDAwOUEyMjYsIDB4NjE3MzY3N0QsCisweDMxRUM2NUUzLCAweDc1MDQ2NDEyLCAweDM2NUM2NjczLCAweDYxNDI2MjYyLAorMHgyMTJCNzcwOCwgMHgyNDEyQUZFRCwgMHg4QjU5ODgzMSwgMHg2MUU2REU2NywKKzB4NjFFMzFGMTksIDB4NjRFMjcxMDQsIDB4MUY0QTYyMTYsIDB4MUYyQjY0MTYsCisweDc1RTQ2NTEzLCAweDY2NTM2NzEyLCAweDFGNEM3NjA0LCAweDY0NTIxRjdELAorMHhENzVGNkU2NiwgMHgyN0UwRDI1RiwgMHhERTVGNjA2MiwgMHhDOTAxMzI0NSwKKzB4NjU2MjJFMDAsIDB4NDYwOTA2MEEsIDB4NDYwOUQxNUMsIDB4NDYwOTQ1MDksCisweDIxNTAxRjRFLCAweEIyQjA2NDZELCAweDYyMEQxRjZGLCAweDhCMDEyMjI4LAorMHgwMDA5QTFFQSwgMHhENzU2REU1NSwgMHg2NjFDNjFFMCwgMHg2NDEwRDE1MCwKKzB4NDcwQjY1NEMsIDB4N0ZGQzU0RkYsIDB4MkZFMjVFRkUsIDB4NTFGRTdGRkMsCisweDJGMTJFMDQwLCAweDU1RkJEMTRGLCAweDU3RkQ1NkZDLCAweDA0RkU0MTBCLAorMHhEMjREN0YwOCwgMHhFMTFDNjQwRCwgMHgxRDQxMkQxMCwgMHhENDRCNjUyMiwKKzB4Njc0MjFENTIsIDB4MUQ3M0RFNEEsIDB4RDI0QTY1RTIsIDB4NjcyMjFENTQsCisweDFENzVEMjQ5LCAweEQyNDk2RTIyLCAweDY2MjIxREU2LCAweDFENjdBMUJDLAorMHg4OTAxODgzMCwgMHgwMDA5QTA4RSwgMHhFMzQwRDUzOCwgMHgzM0ZDNjE1NiwKKzB4MjMxMjY0NTYsIDB4NzEwNDYxNTMsIDB4Njc1MjEzNDEsIDB4MTM3MjY0MTYsCisweDdFRTQ2RTEzLCAweDY1RTY2MjEyLCAweDY2RTNENzMxLCAweDEzMjQ2RUUyLAorMHg3NjA0MjdFMCwgMHg2MDYyRDIyRiwgMHgzMjU1REUyRiwgMHgyRTAwQzkwMSwKKzB4MDYwQTZFNjIsIDB4RDEyRDQ2MDksIDB4NEUwOTQ2MDksIDB4MTM0MzQ2MDksCisweDY0NkQyMUUwLCAweEIyNTAxRjVFLCAweDYyMEQxRjZGLCAweDhCMDEyMjI4LAorMHgwMDA5QTE4QSwgMHhERTI1RDUyMiwgMHg2MUUwNjQ1MCwgMHhENzI0NjU0QywKKzB4NDcwQjU0RkYsIDB4N0ZGQzY2MUMsIDB4MDZGRUUwNTQsIDB4N0ZGQzJGNjIsCisweEVFNDAwMUZFLCAweDJGMTIzRUZDLCAweDU1RTJEMTI1LCAweDU3RTQ1NkUzLAorMHg2NEUyNDEwQiwgMHhEMjFDN0YwOCwgMHhFMTFDNjQwRCwgMHgxRDQxMkQxMCwKKzB4RDYxQTY1MjIsIDB4Njc2MjFENTIsIDB4MUQ3M0RFMTksIDB4RDIxOTZFRTIsCisweDYyMjIxREU0LCAweEQyMTgxRDI1LCAweDFEMjY2MjIyLCAweDYyMjJEMjE3LAorMHgxRDI3QTE1QSwgMHgwMDExNzgwMCwgMHgwMDIwMkExOCwgMHgwMDIwMzk5NiwKKzB4MDAyMDM1QkMsIDB4MDAyMDNBN0MsIDB4MDAyMDE4RDAsIDB4MDAyMDM5OTUsCisweDAwMTE3ODA0LCAweDAwMjAzQTE0LCAweDAwMjAzQTE2LCAweDAwMTE3ODEwLAorMHgwMDIwMzk5MSwgMHgxMDYyNEREMywgMHgwMDIwMzk5MiwgMHgwMDIwMzk5MywKKzB4MDAxMTRBQTQsIDB4MDAyMDBGNjgsIDB4MDAxQzU4NjQsIDB4MDAxQzY4NjQsCisweDAwMUM3ODY0LCAweDAwMUM1OUJDLCAweDAwMUM2OUJDLCAweDAwMUM3OUJDLAorMHgwMDIwMEZDMCwgMHg4QjA0ODgzMywgMHg0NzBCRDdBMiwgMHhBMTIzRUUwMCwKKzB4ODgyODJERTAsIDB4QTBEMzg5MDEsIDB4REU5RjAwMDksIDB4NjJFMUUxNDMsCisweDMyMTZFMDU0LCAweDBGRTY4RjAyLCAweDJFMjFFMjQwLCAweDYyMkQ2MkUxLAorMHg4QjAxMzIxNywgMHgwMDA5QTBCQywgMHhFNTAxODVFMSwgMHg4QjAxMzA1NiwKKzB4MDAwOUEwQjYsIDB4MkQxMEUxMDEsIDB4NjRFMUIxMTEsIDB4MDZGRUUwNTQsCisweDYyNjFFMTQzLCAweDM1MTc2NTJELCAweEU2NDA4OTQ1LCAweDhCMEMzNTYzLAorMHhFMDU4RTQxQSwgMHhFNTAwMEY0NSwgMHg3MkMwRTA1QywgMHg2MDIzMEY1NSwKKzB4NjcwM0M5MDcsIDB4QTAxNEUwNjAsIDB4NjY1MzBGNzUsIDB4NDYyMTQ2MjEsCisweDQ2MjE0NjIxLCAweDQ1MjE0NjIxLCAweEUwNTg3NjE4LCAweDBGNjU0NTIxLAorMHhFMDAzNDUyMSwgMHhFMDVDMjUwOSwgMHhFMDA3MEY1NSwgMHhFMDYwMjIwOSwKKzB4RTg1NDBGMjUsIDB4ODU4MjM4RkMsIDB4NjQwRDY1RjMsIDB4MTg0NEIxNzAsCisweEREN0E4NTg0LCAweDg1ODY2QzBELCAweDYxMEQ0QzA4LCAweDQxMDg2MEMzLAorMHhFMDBGMEVGRSwgMHgxODE1NEQwQiwgMHgyRTI5NjIwNywgMHg2NjgyNjBDMywKKzB4ODU2MjBGRTYsIDB4NEQwQjUxODUsIDB4MkUwQjYwMEQsIDB4NTQ4NDYwQzMsCisweEIxM0MwRkU2LCAweEUwNTQ2NUYzLCAweEU1NDAwRUZFLCAweEUwNkM2MkUxLAorMHgzNjUzNjYyRCwgMHgwRjY2OEQ0MSwgMHhDOTAzNjAyMywgMHg0MDAwNDAwOCwKKzB4NjEwMzY0MDMsIDB4RDk2NUUwNzAsIDB4MEY0NkU1RkYsIDB4RTA3NDY1NUMsCisweDYwNTMwRjk2LCAweDYyNjM0OTBCLCAweDQyMjE0MjIxLCAweDQyMjE0MjIxLAorMHg0MjAwNjcyMywgMHg0MjAwMzI3QywgMHg2QzA3NDYyMSwgMHg0NjIxRTA1NCwKKzB4NjA2MzA5RkUsIDB4NDAwOEM5MDMsIDB4NzkwNjMwRkMsIDB4NkEwMzZEMkQsCisweDY1RjNFODAwLCAweDY0RDNCMTI0LCAweEUwNzA2RUEyLCAweDJBRTIyRUM5LAorMHgwMUZFNjY5NCwgMHg2NjZDRTA3NCwgMHg0NzBCMDdGRSwgMHgyRTBCNjA2MywKKzB4NjVGMzJBRTIsIDB4QjBGQTY0RDMsIDB4NjI4RDc4MDEsIDB4MzJFM0VFMDYsCisweDdEMDE4RkU3LCAweDBFRkVFMDU0LCAweEUwNTQ2MkUxLCAweDQyMDAwNkZFLAorMHg3NjBDODU2MSwgMHg3MDFCMzAyQywgMHhFNDAwNjEwMywgMHhFNzA0NjVGMywKKzB4Njg2Njc0MDEsIDB4Mzk3MzY5NEQsIDB4OEZGOTI1ODIsIDB4NjVGMzc1MDQsCisweDY0MURCMERELCAweDBFRkVFMDU0LCAweDY0RTFCMDlDLCAweDAwMDlBMDU0LAorMHhENDNCNTZGOCwgMHhFQTAxRDIzQiwgMHgyNkEwNDIwQiwgMHgwMDA5QTA0QywKKzB4MDZGQ0UwMUMsIDB4ODgyOTYwNkMsIDB4NUNGODhCMDgsIDB4RTIwMEQ2MzYsCisweDUyNjEyQzIwLCAweDY0MkRCMDRCLCAweDAwMDlBMDNFLCAweDY2NkNFNjgxLAorMHg4QjA0MzA2MCwgMHg0MjBCRDIzMSwgMHhBMDM1NTRGOCwgMHhFNjgyMDAwOSwKKzB4MzA2MDY2NkMsIDB4RDIyRThCMDQsIDB4NTRGODQyMEIsIDB4MDAwOUEwMkMsCisweDY2NkNFNjgzLCAweDhCMEEzMDYwLCAweERBMjc1NUY4LCAweDI1OTBFOTAwLAorMHhEODI4NTVBMSwgMHgyODUyRDYyOCwgMHhBMDFENTJBMiwgMHhFNjkyMjYyMCwKKzB4MzA2MDY2NkMsIDB4RDIyMDhCMDgsIDB4NUMyMUQ4MjQsIDB4NkNDQzUyRjgsCisweDI4QzFFNjAwLCAweDIyNjBBMDEwLCAweDY2NkNFNjkzLCAweDhCMDYzMDYwLAorMHhENjFGNTlGOCwgMHhFMjAxRUEwMCwgMHhBMDA1MjlBMCwgMHhENjE2MjYyMSwKKzB4RDIxREQ0MUMsIDB4NjU2MjQyMEIsIDB4NEYwNjdGNzgsIDB4NEYyNjRGMTYsCisweDZERjY2RUY2LCAweDZBRjY2Q0Y2LCAweDAwMEI2OUY2LCAweDRGMjI2OEY2LAorMHhFMjQwNjE0RCwgMHg4OTMyMzEyMywgMHgzMTI3RTIxRiwgMHg4QjI3RDcxMywKKzB4RDQwNjYxNEQsIDB4RTAwMTcxRTAsIDB4NTY3MTQ0MEIsIDB4MjY1OTY1MDcsCisweDE3NjFBMDI1LCAweDAwMjAwRkJDLCAweDAwMTE3ODA0LCAweDAwMjAzNDcwLAorMHgwMDIwM0E5QywgMHgwMDIwMThDMCwgMHgwMDExNzgwMCwgMHgwMDExNUYwMCwKKzB4MDAxMTYwNTgsIDB4MDAyMDM5N0MsIDB4MDAyMDM5OTAsIDB4MDAyMDNBMUEsCisweDAwMjAzQTE2LCAweDAwMjAzQUI0LCAweDAwMjAxOEQwLCAweDAwMUMzNzA0LAorMHhFMDAxRDQ5MCwgMHg2NjcyNDQwQiwgMHgyNjU5NjUwNywgMHg0RjI2Mjc2MiwKKzB4MDAwOTAwMEIsIDB4NjE0RDRGMjIsIDB4MzEyM0UyNDAsIDB4RTIxRjg5MTIsCisweEQ3ODkzMTI3LCAweDYxNEQ4QjA4LCAweDU2NzFEMjg2LCAweDQyMEI3MUUwLAorMHgyNjBCRTAwMSwgMHgxNzYxQTAwNiwgMHg2NjcyRDI4MiwgMHhFMDAxNDIwQiwKKzB4Mjc2MjI2MEIsIDB4MDAwQjRGMjYsIDB4RTY0MDAwMDksIDB4NDYyODQ2MTgsCisweDYyNTJENTdFLCAweDg5RkMyMjY4LCAweDAwMDkwMDBCLCAweDQ2MThFNjgwLAorMHhENTdBNDYyOCwgMHgyMjY4NjI1MiwgMHgwMDBCODlGQywgMHhBMDAxMDAwOSwKKzB4NzIwMUUyMDAsIDB4OEJGQzMyNDIsIDB4MDAwOTAwMEIsIDB4NDYxOEU2ODAsCisweEQ1NzM0NjI4LCAweDIyNjg2MjUyLCAweDAwMEI4QkZDLCAweDJGRTYwMDA5LAorMHg3RkZDNEYyMiwgMHhCRkYxNkU1MywgMHg2MUUyMkY0MiwgMHhFMjgwRDY2RCwKKzB4NTRFMTE2MTUsIDB4MTY0NjQyMTgsIDB4NDIyODU1RTIsIDB4NTdFMzE2NTcsCisweDE2Nzg2RUYyLCAweDI2RTIyRTJCLCAweDRGMjY3RjA0LCAweDZFRjZBRkNFLAorMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHg2QzUzREQ2MiwgMHg2RTQzQkZENiwKKzB4MkRFMkJGQkIsIDB4MDAwOUJGRDIsIDB4MkMxMjUxRDUsIDB4MUM0MTU0RDYsCisweDFDNTI1NUQ3LCAweDFDNjM1NkQ4LCAweDZFRjY0RjI2LCAweDAwMEI2REY2LAorMHg2MTYzNkNGNiwgMHhBMDA0RTYwMCwgMHg2MjU2NDEwOSwgMHgyNDIyNzYwMSwKKzB4MzYxMjc0MDQsIDB4MDAwQjhCRjksIDB4RDY1MzAwMDksIDB4ODU2MkU1MDAsCisweEEwMEI2NzRELCAweDY1NUQ2MTBELCAweDQwMDA2MDUzLCAweDMwNUNENDRGLAorMHgwMjRENDAwOCwgMHgzMjcwNjIyRCwgMHg3NTAxODkwNSwgMHgzMjEzNjI1RCwKKzB4MDAwQjhCRjEsIDB4MDAwQkUwMDAsIDB4MkZFNkUwMDEsIDB4NTQ0MTY3NDMsCisweDRFMDhFRTdGLCAweDRFMjhEMjQ2LCAweDI1RTk2NTQzLCAweDYwNDM2RTIxLAorMHg5RTc1NjJFRCwgMHg0NTI5QzkwMywgMHhFNjAwMzJFMywgMHg4RDQ1NjEwMywKKzB4MjExODQ1MDksIDB4RDIzRjhCMDUsIDB4MDAyQzYwNTMsIDB4QTA4QUM5M0YsCisweDYwMTM2NjAzLCAweDhCMjY4ODAxLCAweDg4MEM2MDUzLCAweEQ1M0E4QjA0LAorMHhDOTNGODQ1MywgMHg2NjAzQTA3RiwgMHg4QjA0ODgwOCwgMHg4NEUyREUzNiwKKzB4QTA3OEM5M0YsIDB4ODgwRDY2MDMsIDB4OEIwM0Q2MzMsIDB4QzkzRjg0NjEsCisweDY2MDNBMDcxLCAweDg4MDk2MjYwLCAweDYyMkM4RjA5LCAweEUwMTRERTJDLAorMHg2NTVDMDVFQywgMHg2MDIzMzI1OCwgMHhBMDY0QzkzRiwgMHg2MDIzNjYwMywKKzB4QTA2MEM5M0YsIDB4ODgwMjY2MDMsIDB4RTAwNzhCNUQsIDB4NjA0MzI1MDksCisweDg5MDVDODEwLCAweDYwNTNEMjI1LCAweEM5M0YwMDJDLCAweDY2MDNBMDUzLAorMHg2MDUzREUyMywgMHhDOTNGMDBFQywgMHg2NjAzQTA0RCwgMHg4ODAxNjAxMywKKzB4NjA1MzhCMTksIDB4OEIwNDg4MEMsIDB4ODQyM0QyMUUsIDB4QTA0MkM5M0YsCisweDg4MDg2NjAzLCAweEQ1MUI4QjA0LCAweEM5M0Y4NDUyLCAweDY2MDNBMDNCLAorMHhENjE4ODgwRCwgMHg4NDYxOEIwMywgMHhBMDM0QzkzRiwgMHg2MDYwNjYwMywKKzB4QTAzMEM5M0YsIDB4ODgwMjY2MDMsIDB4RTAwNzhCMkQsIDB4NjA0MzI1MDksCisweDg5MjNDODEwLCAweDYwNTNERTEwLCAweEM5M0YwMEVDLCAweDY2MDNBMDIzLAorMHgwMDAwMEJCOCwgMHgwMDIwMzQ3MCwgMHgwMDFDMzcwNCwgMHgwMDFDMzczQywKKzB4MDAxQzM3MDAsIDB4MDAxQzM3MEMsIDB4MDAxMTQwMDAsIDB4MDAxMTQwMDgsCisweDAwMTE0MkQ4LCAweDAwMTE0MkU0LCAweDAwMTE0MkU4LCAweDAwMTE0MkY1LAorMHgwMDExNDJFRCwgMHgwMDExNDJGRCwgMHgwMDExNDMwOSwgMHg2MDUzRDIwOSwKKzB4QzkzRjAwMkMsIDB4NjAxMzY2MDMsIDB4OEIwMzg4MDIsIDB4QzgxMDYwNDMsCisweDc2MDI4OTAwLCAweEM5M0Y2MDYzLCAweDQwMDA0MDE4LCAweDE3NDEyNDBCLAorMHg2RUY2MDAwQiwgMHgwMDExNDMwMSwgMHgwMDA5QTE2RSwgMHgyRkU2MkZENiwKKzB4REQ5NDRGMjIsIDB4QTAwNDlFQjIsIDB4RDQ5MzAwMDksIDB4NDIwQkQyOTMsCisweDYyRDI2NUQyLCAweDhCRjgyMkU4LCAweDAwMDlBMDA0LCAweEQyOEZENDkwLAorMHg1NUQxNDIwQiwgMHgyMkU4NTJEMSwgMHhBMDA0OEJGOCwgMHhENDhEMDAwOSwKKzB4NDIwQkQyOEEsIDB4NTJEMjU1RDIsIDB4OEJGODIyRTgsIDB4MDAwOUEwMDQsCisweEQyODZENDg5LCAweDU1RDM0MjBCLCAweDIyRTg1MkQzLCAweEEwMDQ4QkY4LAorMHhENDg2MDAwOSwgMHg0MjBCRDI4MSwgMHg1MkQ0NTVENCwgMHg4QkY4MjJFOCwKKzB4NkVGNjRGMjYsIDB4NkRGNjAwMEIsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweDZFNjM2QzczLCAweDZENTNCMDFBLCAweDY0RDM1N0Y0LCAweEIwNUY2NUUzLAorMHhCMDc1NjZDMywgMHhCMEE0MDAwOSwgMHhCMEE4MDAwOSwgMHhCMEFDMDAwOSwKKzB4QjBBQzAwMDksIDB4QjBBRjAwMDksIDB4QjAzMTU0RjUsIDB4NkNDRDZDMDMsCisweDRGMjY2MEMzLCAweDZERjY2RUY2LCAweDZDRjYwMDBCLCAweDM0MTJEMTcwLAorMHhENjcwMDUyOSwgMHgyNjUwRDc3MCwgMHgyNzQyMDAwQiwgMHgwMDA5QTAxOCwKKzB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4NkU2MzZDNzMsIDB4NkQ1M0JGRUUsCisweDY0RDM1N0Y0LCAweEIwMzM2NUUzLCAweEIwOEQ2NkMzLCAweEIwMEY1NEY1LAorMHg2Q0NENkMwMywgMHg0RjI2NjBDMywgMHg2REY2NkVGNiwgMHg2Q0Y2MDAwQiwKKzB4RTUwM0QxNjIsIDB4RDc2M0Q0NjIsIDB4MjE1MjQ1MTgsIDB4MjQ3MjAwMEIsCisweEQ0NUZEMTVFLCAweDIxNjJFNjAwLCAweDI0NjIwMDBCLCAweEJGNzM0RjIyLAorMHhCRjczRTQwQSwgMHhEMjVDMDAwOSwgMHg0MTE4RTEwNCwgMHhFNDBBRTUwMCwKKzB4QkY2OTIyMTIsIDB4RDc1OTIyNTIsIDB4Q0IyMDYwNzIsIDB4MDAwQjRGMjYsCisweDRGMjIyNzAyLCAweDQxMEJEMTU2LCAweEQ1NTZFNDAwLCAweDRGMjY0NTJCLAorMHhEMTU1MkZFNiwgMHg2NjEyNkU2MywgMHg5MjEwNDQxOCwgMHg0NDA4NDUyOCwKKzB4NDUwMDI2MjksIDB4MjY1QjQ0MDgsIDB4MjY0QjQ0MDAsIDB4MjE2MjQ3MDgsCisweEQxNEU0NzA4LCAweDIxNzIyN0VCLCAweDZFRjYwMDBCLCAweDFGRkYwM0YwLAorMHg0RjIyMkZFNiwgMHhFMTAxREU0QSwgMHhCRjNERTQwQSwgMHg2N0UzMkUxMiwKKzB4RTUwMDc3NkMsIDB4RTIwNEUxMzAsIDB4Mjc1MkU0MEEsIDB4Mjc1MjI3NTIsCisweDI3NTIyNzUyLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLAorMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwKKzB4MjcyMjI3MTIsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsCisweDI3NTIyNzUyLCAweDE3NUFCRjE4LCAweDJFNjJFNjAwLCAweDAwMEI0RjI2LAorMHhEMjM0NkVGNiwgMHhFNDQxRTEwMSwgMHgwMDBCMjIxMiwgMHhEMTMyMjI0MiwKKzB4RTYwNUQ0MzIsIDB4MDAwQjIxNjIsIDB4MDAwQjI0NjIsIDB4RDIzMDAwMDksCisweEU0MEFFNjAxLCAweDIyNjJBRjAwLCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LAorMHg3RkZDNEYyMiwgMHg2QzQzREIyQiwgMHhFRDAwNjBCMiwgMHgyQjAyQ0IwMywKKzB4QzkwMzYwQjIsIDB4NkUwM0EwMDgsIDB4ODkwNzNEQzIsIDB4RTQ2NDYwQjIsCisweEIwN0NDOTAzLCAweDdEMDE2RTAzLCAweDhCRjUyRUU4LCAweDhGMDQzREMyLAorMHhENDIxMkZFMSwgMHg0NjBCRDYyMSwgMHg2MkYxMDAwOSwgMHg2MDIzNjIyRCwKKzB4ODlGRkM4MDEsIDB4N0YwNDYwMjMsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsCisweDZCRjYwMDBCLCAweDAwMUMzQjg4LCAweDAwMjAzQUM4LCAweDAwMjAxOEQwLAorMHgwMDIwM0FEMCwgMHgwMDIwM0FEOCwgMHgwMDIwM0FFMCwgMHgwMDIwM0FFOCwKKzB4MDAyNUU3MjAsIDB4MDAyMDNEQkMsIDB4MDAyMDM5ODAsIDB4MDAxQzU5NjgsCisweDAwMUMzQjQwLCAweDAwMEY4MDAwLCAweDAwMUQ0MDA0LCAweDAwMUMzNTAwLAorMHgwMDIwMTVFNCwgMHgwMDIwMTYxMCwgMHgwMDFDNTgxNCwgMHgwMDFDNTlEMCwKKzB4MDAxQzU4MzAsIDB4MDAxQzYyNjgsIDB4MDAxQzU5QTQsIDB4MDAxQzYzOUMsCisweDAwMUM1ODFDLCAweDAwMUM1ODYwLCAweDAwMjAzQUYwLCAweDAwMjAxOEMwLAorMHg4RjAxNDQxMSwgMHg2MDQzNjA0QiwgMHgwMDA5MDAwQiwgMHg1NjUxRDUyQiwKKzB4NDYyODYwNTIsIDB4MzA2QzAwMEIsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsCisweDRGMTI0RjIyLCAweEJGRjE0RjAyLCAweDZCMDM2RTQzLCAweEREMjVEQzI0LAorMHgwMDA5QkZFQywgMHgzQzA1MzBCOCwgMHg0NjA5MDYwQSwgMHg0NjAxNDYwOSwKKzB4MDIwQTNENjUsIDB4NDIwOTQyMDksIDB4MzJFMjQyMDksIDB4NEYwNjhCRjAsCisweDRGMjY0RjE2LCAweDZERjY2RUY2LCAweDAwMEI2Q0Y2LCAweDJGQzY2QkY2LAorMHgyRkU2MkZENiwgMHg0RjEyNEYyMiwgMHhCRkNGNEYwMiwgMHg2QzAzNkU0MywKKzB4QkZDQkREMTMsIDB4MzBDODAwMDksIDB4MDYwQTNEMDUsIDB4NDYwOTQ2MDksCisweDM2RTI0NjAxLCAweDRGMDY4QkY1LCAweDRGMjY0RjE2LCAweDZERjY2RUY2LAorMHg2Q0Y2MDAwQiwgMHg0RjIyMkZFNiwgMHhFMTAyREUwQiwgMHhFNDAzRTUwMCwKKzB4QkZCOTJFMTIsIDB4RTYwNjJFNTIsIDB4RTcwMDQ2MTgsIDB4MkU2MkU0MDMsCisweDRGMjYyRTcyLCAweDZFRjZBRkIwLCAweDAwMDkwMDBCLCAweDAwMUMxMDQwLAorMHhDQ0NDQ0NDRCwgMHgxMDYyNEREMywgMHgwMDFENDAwNCwgMHgyRjk2MkY4NiwKKzB4MkZCNjJGQTYsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4RTUwMDdGOTgsCisweDY0NTNFNzEwLCAweDZCNTM0NzI4LCAweEVFMUFEQ0JDLCAweDYxNTM2NTVELAorMHgzMTVDNDEwOCwgMHg3NTAxNDEwOCwgMHg2MDQzMzE3QywgMHgwRjE2NjY1RCwKKzB4RUQwMDYwQjMsIDB4MjFCMTM2RTMsIDB4ODExMjgxMTEsIDB4MTFEMjgxMTMsCisweDExRDQxMUQzLCAweDc0MDQ4RkVBLCAweEQ4QjE2N0YyLCAweDE4NzFEOUIxLAorMHg1OEYxMjg3MiwgMHgxOTgxRDFCMCwgMHg1OUYyMjk4MiwgMHg1REY0NUFGMywKKzB4NTRGNjVFRjUsIDB4MjE5MjExOTEsIDB4MTFBMjExQTMsIDB4MTFENDExRDUsCisweDExRTYxMUU3LCAweDExNDgxMTQ5LCAweERBQTg1NUY3LCAweDU3RjhFRTAwLAorMHg1MkY5RERBNywgMHg2NEUzRDZBNywgMHgyQTUyMUE1MSwgMHhEOEE3RDlBNiwKKzB4MkQ3MkVBRUYsIDB4NkFBQzI2MjIsIDB4NkRFMzZFRUQsIDB4NjFFMzREMDgsCisweDQxMDgzREVDLCAweDMxRUM0RDA4LCAweDYwQjMzRDlDLCAweDJEQjE0MTA4LAorMHhFMDUwODFEMSwgMHhFNzlGNDEwOCwgMHg0MTA4NDAwOCwgMHg4MUQyNjc3QywKKzB4MzE4QzYwQjMsIDB4MzQ3MkUyMDAsIDB4MUREMjgxRDMsIDB4RDQ5MzFEMTMsCisweDFEMjQ4RDAxLCAweDY1RDNENDhGLCAweDdFMDFCMEIyLCAweDM0QTI2NEVELAorMHhEQThDOEJEQSwgMHg2OEEyMkZEMiwgMHg0ODI5REQ5MSwgMHg2NEEyMkQ4MiwKKzB4Njk0RDdERkMsIDB4MkQ5MkQyODYsIDB4NEUyOTZFMjIsIDB4MkRFMjdEMEMsCisweDZBRDM2ODIyLCAweEQ3ODQ2MThELCAweDZENzIyQTE2LCAweEQ1ODNENDg5LAorMHg1RTcyMjREMiwgMHgxNEUyRDY4OCwgMHhFRTAwNTE3NCwgMHg1ODc2MTQxNCwKKzB4MTQ4NkQxODYsIDB4RTcxMDU5NzgsIDB4NjI1MjE0OTgsIDB4MTQyQTY1RTMsCisweDY0RTMyNkUyLCAweDY0NERFNjAwLCAweDQ4MDg2ODQzLCAweDQ4MDgzODRDLAorMHg2MDUzMzgxQywgMHgyOEIxMEM4NiwgMHg2MEIzMDlDRSwgMHg2MDUzODE5MSwKKzB4NjA0MzBBQ0UsIDB4NjA1MzgxQTIsIDB4NjBCMzBEQ0UsIDB4NjA1MzgxRDMsCisweDc0MDEwOENFLCAweDA5Q0UxODgyLCAweDE5RTM2MjRELCAweDMyNzMwQUNFLAorMHg4RkUwMUE2NCwgMHhEOTZBNzUwNCwgMHg2QzkyRTAwMywgMHgyQ0IxNDAxOCwKKzB4REE2RjZEOTIsIDB4RTA1MDgxRDEsIDB4NDAwODZFOTIsIDB4NjE5MjgxRTIsCisweDgxMTM2MEIzLCAweEU2MDA2NDkyLCAweDY3OTIxNDQyLCAweDE3QTNENDY4LAorMHhFMUZGNjg5MiwgMHhFNzAzMTg2NCwgMHg0NjA4NjU2MywgMHg3NTAxMzY0QywKKzB4NjY1RDI2MTIsIDB4OEJGODM2NzMsIDB4RTAwM0RDNUEsIDB4NDAxODZEQzIsCisweDZFQzIyREIxLCAweDgxRTFEMjVGLCAweEVFMDA2MUMyLCAweDY0QzIxMTEyLAorMHgxNDIzRTAyNCwgMHhENDVCNjVDMiwgMHg2N0MyMTVFNCwgMHg4MTcyRTU4MCwKKzB4NjZFMzY4QzIsIDB4NjU1QzgxODMsIDB4Njk2MzY2NkQsIDB4NkE2RDc2MDQsCisweDNBNTMzOTRDLCAweDI5RTI4RkY4LCAweERDNTREQjUzLCAweDc0MDQyNEIyLAorMHg3RjY4MjRDMiwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwKKzB4MDAwQjY5RjYsIDB4NjE0MjY4RjYsIDB4QzgwMzYwMTEsIDB4RTUwMDhGMDMsCisweDM0MjBEMjNDLCAweDYwMTE4QjA2LCAweDg4MDJDOTAzLCAweEQyMzk4QjA2LAorMHg4QjAzMzQyMCwgMHg2NTEzNTYxMiwgMHgyNDIyNTI2NCwgMHg2MDUzMDAwQiwKKzB4MkZFNjJGRDYsIDB4N0ZFQzRGMjIsIDB4NjI1MzZFNTMsIDB4NkQ0M0U1NTAsCisweDQ1MDhFNDAwLCAweEUxMDFBMDAxLCAweDYwNDM1MjI0LCAweDgxMjEyMjExLAorMHg2MDUzODEyMywgMHg1NkUyODEyMiwgMHg4QkY1MzYyMCwgMHgxNkU0RDIzOCwKKzB4RTYxNDY0RjMsIDB4NjVFMzQyMEIsIDB4RTRGQzY1RTEsIDB4MkU1MTI1NDksCisweDY1RjM2MUYxLCAweDJGMTEyMTQ5LCAweEQxMzE1NEQxLCAweEU2MTQ0MTBCLAorMHg2MDcxNTdEMSwgMHgyNzAxQ0IwMSwgMHg3RjE0MURFMSwgMHg2RUY2NEYyNiwKKzB4NkRGNjAwMEIsIDB4MkZFNjJGRDYsIDB4N0ZFQzRGMjIsIDB4NjY1MzZFNTMsCisweDZENDNFNUZDLCAweDIwNTk2MDYxLCAweDI2MDFDQjAxLCAweDMyNjA1MkUyLAorMHgxMkU0OEIwNiwgMHgzMUUwNTFFMiwgMHg1MkQxOEIwNCwgMHgxRTIyQTAwMiwKKzB4NTY2NEFGRjAsIDB4NjRGM0QyMUUsIDB4NDIwQkU2MTQsIDB4NjdFMTY1RTMsCisweDI3MTlFMUZDLCAweDY3RjEyRTcxLCAweDI3MTk1NEQxLCAweDY1RjNEMTE4LAorMHg0MTBCRTYxNCwgMHg1MkQxMkY3MSwgMHhDQjAxNjAyMSwgMHgxREUxMjIwMSwKKzB4NEYyNjdGMTQsIDB4MDAwQjZFRjYsIDB4MDAwMDZERjYsIDB4MDAyMDM5QUMsCisweDAwMjAzNTdDLCAweDAwMjAzNTg0LCAweDAwMjAzNThDLCAweDAwMjAzNUI0LAorMHgwMDIwMzk5OCwgMHgwMDIwMzlBMCwgMHgwMDEwMDIwOCwgMHgwMDEwMTRDMCwKKzB4MDAxRTIxMEMsIDB4MDAxQzNEMDAsIDB4MDAyMDM5RUMsIDB4MDAxMDAwQzgsCisweDAwMTE3ODgwLCAweDAwMTE3NzgwLCAweDAwMDQwMDIwLCAweDAwMjZDNDAxLAorMHgwMDIwMEQ0MiwgMHg0RjIyMkZFNiwgMHhERTQyNjI0QywgMHg0MjAwNDIwOCwKKzB4M0UyQ0EwMDUsIDB4RDQ0MDUyNTIsIDB4QkY2OTU2MjQsIDB4NjVFMjJFNjIsCisweDM1MjA1MkUxLCAweEQ2M0Q4QkY2LCAweDRGMjYyNjIyLCAweDZFRjYwMDBCLAorMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHhEQzM5NEYyMiwgMHg1MkMxREIzOSwKKzB4MzYyMDY2QzIsIDB4NjA2MTg5MUMsIDB4ODgwMUM5MDMsIDB4REUzNDg5MTgsCisweEJGMzhERDM1LCAweDY1MDM2NEUzLCAweDY2QjI4NTAzLCAweDMyNjI2MjBELAorMHhENDMyODkwNywgMHgwMDA5QkY3NiwgMHg0RDBCRDQzMSwgMHhBRkU2MDAwOSwKKzB4QkYzRDAwMDksIDB4RDQyRjY0RTMsIDB4MDAwOTREMEIsIDB4MDAwOUFGREYsCisweDIyNjJEMjJELCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjYwMDBCLAorMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHhERDI5REMyOCwgMHg2RTQzNjBDMiwKKzB4MDRERTQwMDgsIDB4RTYxNEQxMjcsIDB4NjVFMzQxMEIsIDB4RDEyN0Q3MjYsCisweDU1RTIyN0UyLCAweDM1RTA1MjU0LCAweDIxMjI4RjA0LCAweDQwMDg2MEMyLAorMHgxMjIyMDJERSwgMHg2MDUzNjVDMiwgMHg3NTAxNDAwOCwgMHgwREU2MDZERSwKKzB4QzkwRjYwNTMsIDB4NjA2MzJDMDIsIDB4NkVGNjRGMjYsIDB4MDAwQjZERjYsCisweDg1NDM2Q0Y2LCAweDY1MEQ1NjQzLCAweDYyMkQ2MjYyLCAweDM1Mjc3MjA0LAorMHhFMTAwOEYwQywgMHgyMjY4OTYwQywgMHhENjE1OEIwMywgMHg3MjAxNTI2MSwKKzB4RDYxMzE2MjEsIDB4NjI2MkUxMDEsIDB4MjYyMjcyMDEsIDB4NjAxMzAwMEIsCisweDAwMDAwMUZGLCAweDAwMjAzNThDLCAweDAwMjAzNTg0LCAweDAwMUMzRDAwLAorMHgwMDIwMzVCNCwgMHgwMDIwMzk3QywgMHgwMDIwMThDMCwgMHgwMDIwMzU3QywKKzB4MDAyMDNCMTgsIDB4MDAyMDNCMUMsIDB4MDAxQzNEMjgsIDB4MDAyMDM5RUMsCisweDAwMjAzOUFDLCAweDAwMjAwRDQyLCAweDAwMjAzOUYwLCAweDAwMjAzOUY0LAorMHgwMDExNzc1NCwgMHgyRkE2MkY5NiwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwKKzB4N0ZGODRGMjIsIDB4NkMyMkQyNDEsIDB4QzgwMzYwQzMsIDB4REU0MDg5NkUsCisweERBNDFEQjQwLCAweDUyQjFEOTQxLCAweDM2MjA2NkIyLCAweDYwNjE4OTQ1LAorMHg4ODAxQzkwMywgMHhERDNCODk0MSwgMHg0MjBCRDIzRCwgMHg2NTAzNjREMywKKzB4NjBBMTJGMDIsIDB4ODkzMjg4MDEsIDB4ODUxNDUxNTMsIDB4ODg0MDYwMEMsCisweDFGMTE4RjBDLCAweEQ1Mzc2MTkxLCAweDY0MUQ0NTBCLCAweDhCMjYyMDA4LAorMHhENzM1NjY5MSwgMHg2NDZENDcwQiwgMHg4QjIwMjAwOCwgMHg0MjBCRDIzMywKKzB4NTFGMTU0RjEsIDB4QzgyMDg1MTEsIDB4RDEzMTg5MDQsIDB4MDIxRUUwNTAsCisweDAxMjY3MjAxLCAweDQyMEJEMjJGLCAweDIwMDg2NEYyLCAweDY0RDM4OTA3LAorMHg0RDBCREQyRCwgMHhEMTJENjVGMiwgMHhBRkM0RTYwMSwgMHhEMjJDMjE2MiwKKzB4NDIwQjY1RjIsIDB4RDcyQjY0RTMsIDB4QUZCQ0U2MDEsIDB4RDIyNjI3NjIsCisweDQyMEI2NUYyLCAweEFGQjY2NEQzLCAweERFMjcwMDA5LCAweERBMjhERDI3LAorMHg1MkQxREIyOCwgMHgzNjIwNjZEMiwgMHg2MDYxODkxOCwgMHg4ODAxQzkwMywKKzB4RDQyMjg5MTQsIDB4NDUwQkQ1MTYsIDB4NTYwMzAwMDksIDB4OEYwNDM2RTAsCisweEUyMDE2NTAzLCAweEFGRUMyQTIwLCAweEQ0MUYyQjUyLCAweDQyMEJEMjE2LAorMHhENzE4MDAwOSwgMHg0MTE4RTEwMSwgMHgyNzEyQUZFMywgMHhDODA0NjBDMywKKzB4RDIxQTg5MDIsIDB4MDAwOTQyMEIsIDB4NEYyNjdGMDgsIDB4NkRGNjZFRjYsCisweDZCRjY2Q0Y2LCAweDAwMEI2QUY2LCAweDAwMDA2OUY2LCAweDAwMUUyMTAwLAorMHgwMDIwMzU4QywgMHgwMDIwMzU4NCwgMHgwMDIwM0ExNCwgMHgwMDExNDJEOCwKKzB4MDAyMDE0QTYsIDB4MDAxMTVFQTIsIDB4MDAxMTQ3NzQsIDB4MDAyMDBEOEEsCisweDAwMjAzNTFDLCAweDAwMjAxNkMyLCAweDAwMjAxNEQwLCAweDAwMUUyMTJDLAorMHgwMDIwMTUzNCwgMHgwMDFDM0QzMCwgMHgwMDExNzg4MCwgMHgwMDIwMzU3QywKKzB4MDAyMDM5OUMsIDB4MDAyMDM5OTgsIDB4MDAyMDM1QjQsIDB4MDAyMDA2NDQsCisweEU2MDFEMjAzLCAweDEyNjVENTAzLCAweDAwMEIyMjUyLCAweDAwMDAxMjY2LAorMHgwMDFDMTAxMCwgMHgwMDAwQzM0RiwgMHgwMDA5MDAwQiwgMHgwMDA5MDAwQiwKKzB4MDAwOTAwMEIsIDB4MDAwOTAwMEIsIDB4RTAwMDAwMEIsIDB4RTAwMDAwMEIsCisweDAwMDkwMDBCLCAweEU0RkRENTlELCAweEQ2OUQ2MTUyLCAweDI1MTIyMTQ5LAorMHg3NDAxNjA1MiwgMHgyNTAyQ0IwMSwgMHhEMTlBNjc1MiwgMHgyNTcyMjc0OSwKKzB4Qzg0MDYwMTAsIDB4NjA2Mjg5MDIsIDB4MjYwMkNCMDQsIDB4RTFGNzY0NjIsCisweDI2NDIyNDE5LCAweEU3MDE2MDYyLCAweDI2MDJDOUNGLCAweEU1MDI2MDYyLAorMHgyNjAyQ0IxMCwgMHg0NzE4NjA2MiwgMHgyNjAyQ0IwMywgMHgwMDBCMTY1MiwKKzB4RDU4RDE2NzMsIDB4RDI4RUQ3OEQsIDB4RTEwMEQ0OEUsIDB4MjUxMUU2MDAsCisweDIyMTAyNzExLCAweDI0NjFBRkNFLCAweEQyOEI2NjRDLCAweDM2MkM0NjAwLAorMHhDQjEwNjA2MCwgMHgyNjAwMDAwQiwgMHhEMjg3NjU0QywgMHgzNTJDNDUwMCwKKzB4RTFFRjY2NTAsIDB4MDAwQjI2MTksIDB4NjY0QzI1NjAsIDB4NDYwMEQyODMsCisweDYwNjAzNjJDLCAweDAwMEJDQjEwLCAweDY1NEMyNjAwLCAweDQ1MDBEMjdGLAorMHg2NjUwMzUyQywgMHgyNjE5RTFFRiwgMHgyNTYwMDAwQiwgMHhEMjdBNjY0QywKKzB4MzYyQzQ2MDAsIDB4Q0IwODYwNjAsIDB4MjYwMDAwMEIsIDB4RDI3NjY1NEMsCisweDM1MkM0NTAwLCAweEUxRjc2NjUwLCAweDAwMEIyNjE5LCAweDY2NEMyNTYwLAorMHg0NjAwRDI3MiwgMHg2MDYwMzYyQywgMHgwMDBCQ0IwOCwgMHg2NTRDMjYwMCwKKzB4NDUwMEQyNkUsIDB4NjY1MDM1MkMsIDB4MjYxOUUxRjcsIDB4MjU2MDAwMEIsCisweEQ2Njk2MjRDLCAweDMyNkM0MjAwLCAweEM5MDg2MDIwLCAweDQwMjE0MDIxLAorMHgwMDBCNDAyMSwgMHg2MjRDNjAwQywgMHg0MjAwRDY2NCwgMHg2MDIwMzI2QywKKzB4NDAyMUM5MDgsIDB4NDAyMTQwMjEsIDB4NjAwQzAwMEIsIDB4NjQ0Q0QxNjAsCisweDYyNDAzNDFDLCAweDYwMkMwMDBCLCAweDY0NENEMTVFLCAweDYyNDAzNDFDLAorMHg2MDJDMDAwQiwgMHg0RjIyMkZFNiwgMHg2NDVDNkU0MywgMHgzNDY3RTYwQSwKKzB4QkZFQjg5MTQsIDB4NjQwQzAwMDksIDB4ODgwMTYwRUMsIDB4RTAwRjhCMDIsCisweDI0MDlBMDAyLCAweDQ0MDk0NDA5LCAweEU2MEE2MjRDLCAweDg5MDUzMjYzLAorMHg2NDRDQkZFMiwgMHg2MDIzNjIwQywgMHg4QjAwQzg4MCwgMHg2MDIzRTIwMCwKKzB4MDAwQjRGMjYsIDB4NEYyMjZFRjYsIDB4NjA2MkQ2NEIsIDB4OEIwMzg4MDEsCisweDAwMDlCMjU2LCAweDAwMDlBMDAzLCAweEU2NDBEMjQ4LCAweEQ2NDgyMjYwLAorMHg0RjI2RTIwMCwgMHgyNjIyMDAwQiwgMHhENjQzNEYyMiwgMHg4ODAyNjA2MiwKKzB4QjI5RjhCMDEsIDB4RDY0MjAwMDksIDB4NEYyNkUyMDAsIDB4MjYyMjAwMEIsCisweEQ0M0VENTNELCAweEU3MDFFMTAwLCAweDAwMEIyNTEyLCAweEQyM0IyNDcwLAorMHgwMDBCRTYwNCwgMHg0RjIyMjI2MCwgMHhEMTNCRDQzQSwgMHgwMDA5NDEwQiwKKzB4RTFGREQ1M0EsIDB4RDIzQTY2NTAsIDB4RTcwMDI2MTksIDB4NEYyNjI1NjAsCisweDIyNzAwMDBCLCAweEQ1Mzc0RjIyLCAweDYxNTJEMjM3LCAweDYxMURENzM3LAorMHg2NDUyMjUxMiwgMHgyNDJCRTZGRiwgMHhENDM1MjU0MiwgMHg2NjZERDIyRSwKKzB4Mjc2MjQyMEIsIDB4RTFGQkQ1MkQsIDB4MjcxOTY3NTAsIDB4MDAwQjRGMjYsCisweDRGMjIyNTcwLCAweEQxMjhENDJGLCAweDAwMDk0MTBCLCAweEU3RjdENTI3LAorMHgyNjc5NjY1MCwgMHgwMDBCNEYyNiwgMHhENTI0MjU2MCwgMHg2MjUwOTQyNSwKKzB4MDAwQjIyNDksIDB4RDUyMTI1MjAsIDB4NjI1MEU0QkYsIDB4MDAwQjIyNDksCisweDRGMjIyNTIwLCAweDg1MjJEMjI0LCAweDIwMDg2MDBELCAweDg4MDE4OTExLAorMHg4ODAzODk0NCwgMHg4ODA1ODk0NiwgMHg4ODA2ODk0OCwgMHg4ODA4ODk0RSwKKzB4ODgwOTg5NTQsIDB4ODgwQTg5NUEsIDB4ODgwQjg5NjAsIDB4QTA2RDg5NjYsCisweEIwNkYwMDA5LCAweEEwNkEwMDA5LCAweEZGN0Y2MDBDLCAweDAwMUUyMTQ4LAorMHgwMDFFMTEwOCwgMHgwMDFFMTAwMCwgMHgwMDIwM0E0QywgMHgwMDIwM0E0RSwKKzB4MDAyMDNBNkQsIDB4MDAyMDNBMzAsIDB4MDAxRTEwM0YsIDB4MDAxRTEwNUYsCisweDAwMUUxMDJGLCAweDAwMUUxMDkwLCAweDAwMjAzQTU0LCAweDAwMUUxMDBCLAorMHgwMDIwM0E1MCwgMHgwMDIwM0IyMCwgMHgwMDIwMThDMCwgMHgwMDFFMTAyOCwKKzB4MDAyMDNBNkMsIDB4MDAxRDQwMjAsIDB4OTg3NjAwMDAsIDB4MDAxQzEwMDAsCisweDAwMjAzQjJDLCAweDAwMjAzQjNDLCAweDAwMjAzQTI0LCAweDAwMDlCMDRDLAorMHg2MDBDQTAzNSwgMHgwMDA5QjA1NSwgMHg2MDBDQTAzMSwgMHg2MjYwRDY4NCwKKzB4OEIyQjIyMjgsIDB4MDAwOUIwNjEsIDB4NjAwQ0EwMjksIDB4NjI2MEQ2ODAsCisweDhCMjMyMjI4LCAweDAwMDlCMDY5LCAweDYwMENBMDIxLCAweDYyNjBENjdDLAorMHg4QjFCMjIyOCwgMHgwMDA5QjBDNywgMHg2MDBDQTAxOSwgMHg2MjYwRDY3OCwKKzB4OEIxMzIyMjgsIDB4MDAwOUIwQ0QsIDB4NjAwQ0EwMTEsIDB4NjI2MEQ2NzQsCisweDhCMEIyMjI4LCAweDAwMDlCMTI1LCAweDYwMENBMDA5LCAweDYyNjBENjcwLAorMHg4QjAzMjIyOCwgMHgwMDA5QjEzRCwgMHg2MDBDQTAwMSwgMHg0RjI2RTAwMCwKKzB4MDAwOTAwMEIsIDB4RDI2Q0QxNkIsIDB4RDU2Qzg0MTIsIDB4NDAwMEM5MEYsCisweEQ3NkIwMTJELCAweEU0MDNENjZCLCAweEUyMEY2MTFDLCAweDI1NDBFMDAxLAorMHgyNTIwMjcxMiwgMHgyNjAyMDAwQiwgMHhFNjAxRDI2MiwgMHgzMDY2ODUyMywKKzB4RTAwMDhEMDUsIDB4RDY2M0QyNjAsIDB4RTAwMTgxMjIsIDB4MDAwQjI2MDIsCisweEQyNUMwMDA5LCAweDYwMEQ4NTIzLCAweDg5MDUyMDA4LCAweDhCMEE4ODAxLAorMHg2MDYwRDY1RCwgMHgyNjAwQ0IwMSwgMHhENDU3RDY1QSwgMHhFMDAxRTEwMSwKKzB4MDAwQjI2MTIsIDB4MDAwQjgxNDIsIDB4RDE1MkUwMDAsIDB4ODUxM0U1MDEsCisweDY0MEQ0NTE4LCAweDY2MDMzNDUzLCAweEUwMDA4RDA1LCAweEQ1NTFEMjUzLAorMHgyMjYwRTAwMSwgMHgwMDBCMjUwMiwgMHg0RjIyMDAwOSwgMHg4NTEzRDE0OSwKKzB4NjQ1MzY1MEQsIDB4NjI0OTQ0MTksIDB4MjI3RDY3MkUsIDB4ODgwMTYwMkMsCisweDg4MDI4OTA5LCAweDg4MDM4OTEwLCAweDg4MDY4OTFBLCAweDg4MDc4OTM1LAorMHhBMDRDODkzQiwgMHhENTQ2MDAwOSwgMHg2NjUyRDc0NiwgMHgyNzYyRDQ0NiwKKzB4NjIyQzYyNjEsIDB4MjQyMUEwMzgsIDB4MjIyODYyNUMsIDB4RDQ0MzhCM0YsCisweDY2NDJENTQwLCAweDI1NjJENDQwLCAweDI0MDE4NTYxLCAweDYyMDNBMDJDLAorMHgyMDA4NjA1QywgMHg4ODEwODkwNywgMHg4ODIwODkwOCwgMHg4ODMwODkwOSwKKzB4QTAyQzg5MEEsIDB4RDIzQTAwMDksIDB4NjIyMkEwMDgsIDB4QTAwNUQyMzksCisweEQyMzk2MjIyLCAweDYyMjJBMDAyLCAweDYyNjJENjM4LCAweEQ0MzJENTMxLAorMHg2NjIxMjUyMiwgMHhBMDBGNjI2QywgMHhENjM1MjQyMSwgMHg2MjYxRDUyRCwKKzB4NjIyQ0Q0MkQsIDB4QTAwNzI1NjIsIDB4RDYzMjI0MjEsIDB4ODU2MUQ1MjksCisweDI1NjJENDI5LCAweDYyMDMyNDAxLCAweDY2MkQ4NTE1LCAweDM2MTc2MTBELAorMHg2NTAzOEYwMSwgMHhCMENCMjQ1MSwgMHhBMDAxMDAwOSwgMHhFMDAwRTAwMSwKKzB4MDAwQjRGMjYsIDB4RDYxOTAwMDksIDB4RDQyN0UxMDEsIDB4NjU0MTI2MTAsCisweEQxMThENzE3LCAweEUyMEY2NTVELCAweDI3NTJFMDAxLCAweDAwMEIyNjIwLAorMHgyRkU2MjEwMiwgMHhEMjBGNEYyMiwgMHg2NDBDODUyMywgMHg4QjA4MjQ0OCwKKzB4RDUxMUQ2MUQsIDB4MjYyMUUyMDAsIDB4OTQwRjg0NTEsIDB4QTA0ODIwNDksCisweERFMEQ4MDUxLCAweEM4NDA2MEUwLCAweEUyMDE4RDMyLCAweDg5NDQzNDI3LAorMHhEMjE2RDYxNSwgMHgyNjQxNDIwQiwgMHgwMDA5QTAzMCwgMHgwMDAwRkY3RiwKKzB4MDAyMDNBNkQsIDB4MDAyMDNBMjQsIDB4MDAyMDNBMzAsIDB4MDAxRTExMDAsCisweDAwMUUxMDBDLCAweDAwMjAzQTUwLCAweDAwMUUxMDAwLCAweDAwMUUxMDAxLAorMHgwMDIwM0E1OCwgMHgwMDIwM0EzOCwgMHgwMDIwM0EzQywgMHgwMDIwM0E0MCwKKzB4MDAyMDNBNUMsIDB4MDAyMDNBNjAsIDB4MDAyMDNBNjQsIDB4MDAyMDNBNjgsCisweDAwMjAzRTIwLCAweDAwMjAzRTJBLCAweDAwMjAzQTRBLCAweDAwMjAyN0YyLAorMHg4OTEyMzQyNywgMHhEMjk0RDY5MywgMHgyNjQxNDIwQiwgMHhDQjgwODRFMSwKKzB4ODBFMUIwRjUsIDB4RDY5MTYwRTAsIDB4MkUwMENCMDQsIDB4QzkzRjYwNjAsCisweEQ2OEYyNjAwLCAweEEwMDFFMDAxLCAweEUwMDAyNjAyLCAweDAwMEI0RjI2LAorMHhENjhDNkVGNiwgMHhDODgwNjA2MCwgMHhEMjg2ODkxOSwgMHg4ODAxNjAyMSwKKzB4RDI4OThCMTUsIDB4ODUyNEU1MDEsIDB4ODkxMDMwNTYsIDB4RTIwM0QxODcsCisweDIxMjBENDg3LCAweEUwMEI2NTQxLCAweDA2NTY2NTVELCAweEU0MEZENTg1LAorMHgyMTQwRTcwMiwgMHhENzdFMjU3MSwgMHgwMDBCRTAwMSwgMHgwMDBCMjcwMiwKKzB4MkZFNkUwMDAsIDB4REU4MDRGMjIsIDB4Qzg4MDg0RTEsIDB4RDU3QTg5MkMsCisweDIwMDg4NTU0LCAweDYxMDM4RjI4LCAweDg1NTNENzdDLCAweDY0MDM2NjcyLAorMHg4NTY2NjUwQywgMHgzNTIwNjIwQywgMHhENjc5OEIxRSwgMHg2NTFDRDc3NCwKKzB4MjY1MTY0NEMsIDB4NjBFMDI3NDEsIDB4ODkwNEM4NDAsIDB4NDIwQkQyNzUsCisweEEwMDMwMDA5LCAweEQyNjgwMDA5LCAweDAwMDk0MjBCLCAweDAwMDlCMDlGLAorMHhFMjAxRDE2NywgMHg2MEUwMjEyMiwgMHhDQjA0RDQ2NCwgMHg2MDQwMkUwMCwKKzB4MjQwMEM5M0YsIDB4NjAyM0EwMDEsIDB4NEYyNkUwMDAsIDB4NkVGNjAwMEIsCisweDJGQjYyRkE2LCAweDJGRDYyRkM2LCAweERBNjIyRkU2LCAweDY2QTFFMjQwLAorMHgzNjIyREM1RSwgMHg2MjYzODkwMCwgMHg2RUQzNkQyQywgMHg0RTIxMzZEOCwKKzB4NEUyMTJBNjEsIDB4REI2MUQ0NjAsIDB4RTcwMEEwMEYsIDB4NzcwMTYyQjIsCisweDcxMDI2MTIzLCAweDY2MjEyQjEyLCAweDcxMDI2MjEzLCAweDYxMjEyQjEyLAorMHg2NTFENjY2RCwgMHgzNTZDNDUyOCwgMHg2MjdDMjQ1MiwgMHg4QkVEMzJFMywKKzB4QzkwMzYwRDMsIDB4OEIxMDg4MDMsIDB4NjE3MzY3QjIsIDB4MkIxMjcxMDIsCisweDcxMDI2RTEzLCAweDJCMTI2NTcxLCAweDY1NUQ2REUxLCAweDQyMjg2MkRELAorMHgzMjVDRTEwNywgMHhBMDBDMkMxMCwgMHg4ODAyMjQyMiwgMHhBMDAzOEIwMSwKKzB4ODgwMUUyMDMsIDB4RTIwMThCMDUsIDB4NjZCMjJDMjAsIDB4NjU1RDY1NjEsCisweEU2MEYyNDUyLCAweDY3QTEyQzYwLCAweDhCMDUyNzc4LCAweEREMzhEQzQ0LAorMHhFQjAxRUEwMCwgMHgyREIyMkNBMiwgMHg2REY2NkVGNiwgMHg2QkY2NkNGNiwKKzB4NkFGNjAwMEIsIDB4MkZFNjJGRDYsIDB4RTI0MEREMzYsIDB4MzYyMjY2RDEsCisweDYyNjM4OTAwLCAweDM2Nzg2NzJDLCAweDc3MDNERTM4LCAweDQ3MjEyRDYxLAorMHg2NEUyRDYzNSwgMHhBMDBFNDcyMSwgMHg2NTYyRTEwMCwgMHg2MjUzNzEwMSwKKzB4NzQwMTI0NTAsIDB4MjQyMDQyMTksIDB4NDUyOTc0MDEsIDB4NzQwMTI0NTAsCisweDI0NTA0NTE5LCAweDYyMUM3NDAxLCAweDhCRUUzMjczLCAweDY2RTI0MjAwLAorMHg0MjAwNjFEMSwgMHgyMTE4MzYyQywgMHgyRTYyOEYwNiwgMHhERDFDRDcyOCwKKzB4RTUwMUU0MDAsIDB4MkQ1MjI3NDIsIDB4MDAwQjZFRjYsIDB4MkZENjZERjYsCisweDRGMjIyRkU2LCAweEVEMEFFRTAxLCAweDY0RTNCQzg2LCAweEJDOEI2NEUzLAorMHg2MkVDN0UwMSwgMHg4QkY3MzJENywgMHhCQzhFRUUwMSwgMHg2NEUzNjRFMywKKzB4N0UwMUJDOTMsIDB4MzJENzYyRUMsIDB4NEYyNjhCRjcsIDB4MDAwQjZFRjYsCisweEQxMTg2REY2LCAweEQ0MTg5MjBELCAweDcyMTIyMTIyLCAweDI0MjJENjE3LAorMHhENzE3NzIwNCwgMHg3MjIwMjYyMiwgMHgyNzIyRDExNiwgMHgwMDBCNzIzMCwKKzB4MTM3QTIxMjIsIDB4MDAyMDNBNEEsIDB4MDAyMDI4RkUsIDB4MDAxRTEwMTUsCisweDAwMjAzQTUwLCAweDAwMUUxMDAxLCAweDAwMjAzQTI0LCAweDAwMUUxMTAwLAorMHgwMDIwM0E0RSwgMHgwMDIwM0EzQywgMHgwMDFFMTAwMCwgMHgwMDIwM0E0MCwKKzB4MDAyMDNBNEMsIDB4MDAyMDI3RjIsIDB4MDAxRTEwMEMsIDB4MDAyMDNBMzgsCisweDAwMjAzQTU0LCAweDAwMjAzQTU4LCAweDAwMjAzQTVDLCAweDAwMjAzQTYwLAorMHgwMDIwM0E2NCwgMHgwMDIwM0E2OCwgMHg0RjIyMkZFNiwgMHhENjcwN0ZGQywKKzB4ODgwMTYwNjAsIDB4RTIwMTg5NTEsIDB4MjYyMEJGQkIsIDB4RDU2RUQxNkQsCisweERFNkU2MDEwLCAweDY0RTM2NTUyLCAweDc0MDJDODQwLCAweDhEMjJEMTZDLAorMHhEMjZDNzUwMiwgMHhFNjAxRDc2QywgMHhFNzA0MjcyMiwgMHg3NjAxNjI1NSwKKzB4NjI2QzI0MjEsIDB4OEZGOTMyNzMsIDB4RDQ2Mzc0MDIsIDB4NjI0MkU2MDEsCisweDY0MEQ4NTI4LCAweDY3NDk0NDE5LCAweDI3NUQ2NTdFLCAweDgxRTQ2MDdDLAorMHhFNDE3RDU2MiwgMHg2NzU1NzYwMSwgMHgzMjQzNjI2QywgMHg4RkY5MjE3MSwKKzB4QTAyMDcxMDIsIDB4RDI1RTAwMDksIDB4RTYwMUQ3NUIsIDB4RTcwNDI3MjIsCisweDc2MDE2MjU1LCAweDYyNkMyNDIxLCAweDhGRjkzMjczLCAweEQ0NTI3NDAyLAorMHg2MjQyRTYwMSwgMHg2NDBEODUyOCwgMHg2NzQ5NDQxOSwgMHgyNzVENjU3RSwKKzB4ODFFNDYwN0MsIDB4RTQxN0Q1NTMsIDB4Njc1NTc2MDEsIDB4MzI0MzYyNkMsCisweDhGRjkyMTcxLCAweDkyODk3MTAyLCAweEQyNDYyRTIxLCAweDVFMjNENzRFLAorMHg2NEYyMkZFMiwgMHg2MDQzNjVGMiwgMHgyNzAwQzk4MCwgMHhDOTYwNjA0MywKKzB4ODA3MTYxMDMsIDB4QzkwMzYwNDMsIDB4ODA3MjQ1MTksIDB4NjVGMjYwNUMsCisweDgxNzI2NkYyLCAweDQ2MTk0NjI5LCAweDYwNkM0NTI5LCAweDQwMTg2NDVDLAorMHg4MTczMzA0QywgMHgyMTE4NUUyMywgMHg2NEYyMkZFMiwgMHg2RTRDNjJGMiwKKzB4NjAyQzQyMTksIDB4NjZGMjYyRjIsIDB4NDYyOTQwMTgsIDB4NDYxOTMwRUMsCisweDQyMjk4MTc0LCAweDY1MkM2MDZDLCAweDMwNUM0MDE4LCAweDgxNzU4RjA3LAorMHgwMDA5QkM5NywgMHgyMjI4NjIwQywgMHhBMDBBODkwOCwgMHg2MDEzMDAwOSwKKzB4OEIwMzg4NDAsIDB4MDAwOUIwMDksIDB4MDAwOUEwMDMsIDB4RTIwMkQ2MkYsCisweDdGMDQyNjIyLCAweDAwMEI0RjI2LCAweDRGMjI2RUY2LCAweDg1NTJENTJBLAorMHg4ODMwNjAwRCwgMHg4ODMxODkwMywgMHhBMDM0ODkyMywgMHg4NTU1MDAwOSwKKzB4RDQyOEQ3MjcsIDB4ODU1MzI3MDEsIDB4NjEwREQ2MjcsIDB4MjQxMjQxMTgsCisweDQ2MEJENDI2LCAweEQ3MjMwMDA5LCAweEQyMjZENDI1LCAweDY1NzI0MjBCLAorMHhFMjMwRDEyMCwgMHg0MjI4NjcxMiwgMHgyNzI5RTYyMCwgMHgzNzYwNDYyOCwKKzB4RDYyMThCMDMsIDB4QTAxNkUyMDAsIDB4RDYxRjI2MjIsIDB4QTAxMkUyMDIsCisweEQxMTgyNjIyLCAweDYyMTJFNTMwLCAweEU2MjA0NTI4LCAweDQ2MjgyMjU5LAorMHg4OTA4MzI2MCwgMHhENDFBRDExOSwgMHhFNjAxRDUxMywgMHgyMTYwNDUwQiwKKzB4NDcyQkQ3MTgsIDB4NEYyNjRGMjYsIDB4MDAwOTAwMEIsIDB4MDAwMDA2MEEsCisweDAwMjAzQTZDLCAweDAwMUUxMDAwLCAweDAwMjAzQTU4LCAweDAwMjAzRTIwLAorMHgwMDIwM0UyQywgMHgwMDIwM0RDNCwgMHgwMDIwM0E0MCwgMHgwMDIwM0RGNCwKKzB4MDAyMDNERjIsIDB4MDAyMDNEQzYsIDB4MDAyMDNBMjQsIDB4MDAyMDNBNTAsCisweDAwMjAzQTNDLCAweDAwMjAzQTM4LCAweDAwMjAxOEMwLCAweDAwMjAzQjQ4LAorMHgwMDIwM0I0QywgMHgwMDIwMThEMCwgMHgwMDIwM0E1NCwgMHgwMDFFMTAwQiwKKzB4MDAyMDNCNjAsIDB4MDAxMTQwMDQsIDB4NEYyMjJGRTYsIDB4ODRFOURFODYsCisweDI0NDg2NDBDLCAweEIxN0I4OTAxLCAweEQyODQwMDA5LCAweDI2Njg2NjIwLAorMHg2MEUwODkwMiwgMHgyRTAwQzlCRiwgMHgwMDBCNEYyNiwgMHgwMDBCNkVGNiwKKzB4MkZFNjAwMDksIDB4REU3RTRGMjIsIDB4NjBFMEQ2N0UsIDB4Q0JDMEQ0N0UsCisweDYyNjAyRTAwLCAweEM4MDM2MDJDLCAweDQwMjE4OTA0LCAweDcwMDE0MDIxLAorMHg2NjAzQTAwMiwgMHg2NjAzNDAwOSwgMHhENjc4NjE2RCwgMHhFNTAwQTAwNCwKKzB4NzUwMTYyNjIsIDB4NzQwNDI0MjIsIDB4MzIxMzYyNUQsIDB4RDI3NDhCRjgsCisweDAwMDk0MjBCLCAweEM5QkY4NEUyLCAweDRGMjY4MEUyLCAweDZFRjYwMDBCLAorMHgyRkU2MkZENiwgMHg3RkZDNEYyMiwgMHg2MjYwRDY2RSwgMHg4OTQwMjIyOCwKKzB4RDU2NUUxMDAsIDB4NjA1MDI2MTAsIDB4Q0I0MEQ0NkIsIDB4MjUwMDQ0MEIsCisweDhEMDUyMDA4LCAweDYyRTA2RTAzLCAweDcxMDQ2MTJDLCAweDJGMTFBMDA2LAorMHhENDY2RDY1RSwgMHhERDY2Njc2MCwgMHg2NTdDNEQwQiwgMHhFMjNDNkQxRCwKKzB4OEIwMzNEMjcsIDB4RDI2NEQ0NjMsIDB4MDAwOTQyMEIsIDB4NEQyMTREMjEsCisweEEwMDVENzYyLCAweDY2RTZFNDAwLCAweDM1N0M0NTA4LCAweDc0MDEyNTYyLAorMHgzNUQzNjU0RCwgMHhENzVFOEJGNywgMHg2RTcyRTAwMywgMHg4MUUxNDAxOCwKKzB4NkU3MjYwRjEsIDB4ODFFMjcwMEMsIDB4RDQ1QTYxNzIsIDB4REQ1QTgxMTMsCisweDY1NzI0RDBCLCAweEQ2NEFEMjU5LCAweDIyMTJFMTAxLCAweEM5M0Y2MDYwLAorMHg3RjA0MjYwMCwgMHg2RUY2NEYyNiwgMHg2REY2MDAwQiwgMHgyRkM2MkZCNiwKKzB4MkZFNjJGRDYsIDB4RDI1MjRGMjIsIDB4NkI0MzZFNzMsIDB4NDIwQjZDNTMsCisweDIwMDg2RDYzLCAweDY0MDM4RDFDLCAweEU1MEVEMTNDLCAweDMyNTI2MjEwLAorMHg2MEMzODkxNiwgMHg4MDQxMjRCMCwgMHg4MTQxNjBEMywgMHhBMDA3RTUwMCwKKzB4NjU1RDYxQkMsIDB4MDBFQzYwNTMsIDB4MzY0QzY2NTMsIDB4ODA2NDc1MDEsCisweDMyMTM2MjVELCAweEQ2MzA4QkY1LCAweEM5QkY2MDYwLCAweDI2MDBBMDA4LAorMHhEMjM5RDQ0MCwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QkY2NDIyQiwKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjAwMEIsIDB4MkY5NjJGODYsCisweDJGQjYyRkE2LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweEUxMDA3RkM0LAorMHg2NTEzRUNGRiwgMHg2QjEzNkNDRCwgMHhERTM0RDczMywgMHhFREZGNjRGMywKKzB4RDgzM0VBMDQsIDB4NjA1MzY1NUMsIDB4MDI3RDQwMDAsIDB4MzJDMDYyMkQsCisweDY2MDM4RDBELCAweDA5RUQ2MDYzLCAweDI0OTEwMjdELCAweDI0MjE3NDAyLAorMHg2OTgyMDJFRCwgMHgzOTI4NjIyRCwgMHg3NDAyMjg5MiwgMHg3NTAxNzEwNCwKKzB4NjA2MzYyNUMsIDB4MDdENTMyQTIsIDB4MEVCNThGRTQsIDB4MjQ0ODY0MUMsCisweEU2ODA4OTA1LCAweDY3RjNFNUM1LCAweEJGOEY2NjZDLCAweDdGM0M2NTVDLAorMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwgMHgwMDBCNjlGNiwKKzB4RDExQzY4RjYsIDB4NjAxMkQyMUMsIDB4Q0IyMEU0MDUsIDB4MjEwMkU1MDAsCisweDAwMEIyMjQyLCAweDAwMDAyMjUyLCAweDAwMUUxMDE3LCAweDAwMjAzOTk2LAorMHgwMDFFMTAxNSwgMHgwMDFFMTBCRiwgMHgwMDExNzgwMCwgMHgwMDFFMTBGQywKKzB4MDAyMDA2NDQsIDB4MDAyMDM5OUMsIDB4MDAyMDJBNTYsIDB4MDAyMDNCNjQsCisweDAwMjAxOEQwLCAweDAwMjAzQjgwLCAweDAwMjAxOEMwLCAweDAwMTE3ODhDLAorMHgwMDIwMzk5OCwgMHgwMDIwMzU3QywgMHgwMDIwMTUzNCwgMHgwMDFFMjEzMCwKKzB4MDAyMDJBMTgsIDB4MDAyMDNCODgsIDB4MDAyMDM5RkMsIDB4MDAyMDNBMDQsCisweDAwMjAzREMwLCAweDAwMUMzNTAwLCAweDAwMUQ0MDA0LCAweEQ1NjREMTYzLAorMHhFNDAwRDc2NCwgMHgyMTQyRTIwRiwgMHgxNzQxMTE1NCwgMHhENTYyMjcyMiwKKzB4OTY2OUQ3NjIsIDB4MTU0MTI1NzIsIDB4OTY2NjE1NjIsIDB4RTYwMTE1NjUsCisweEQ1NUYxMTY1LCAweDY2NkNFNkY4LCAweDI1NDIyNTQyLCAweDI1NDIyNTQyLAorMHgyNTQyMjU0MiwgMHgyNTYyMjU0MiwgMHg3NjAxRTcyNywgMHg2NzYzMjU3MiwKKzB4MjU2Mjc3OTcsIDB4RTcwNDI1NzIsIDB4MjU3MkUyNDgsIDB4RTIxOTI1MjIsCisweEUyNzAyNTIyLCAweDI1NDIyNTQyLCAweDI1NDIyNTQyLCAweDI1MjIyNTQyLAorMHgyNTIyRTIwQywgMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwKKzB4MjU0MjI1NDIsIDB4MDAwQjE1NEEsIDB4RTIwODExNDUsIDB4MDAwOTQyMkIsCisweDJGRTYyRkQ2LCAweDdGRkM0RjIyLCAweEM4MjA2MDQzLCAweDZFNDM4RDAyLAorMHgwMDA5QkU4NSwgMHhDODEwNjBFMywgMHhCRTgyODkwMSwgMHg2MEUzMDAwOSwKKzB4ODkwMUM4NDAsIDB4MDAwOUJFQTQsIDB4QzgwMTYwRTMsIDB4REQzRDg5MzgsCisweEM4MDI2MEQwLCAweDJGMDA4RDAzLCAweDQ2MEJENjNCLCAweDYwRjAwMDA5LAorMHg4OTAyQzgwNCwgMHg0NjBCRDYzOSwgMHg2MkYwMDAwOSwgMHhDODgwNjAyMywKKzB4NjBEMDg5MDIsIDB4MkQwMEM5N0YsIDB4QzgwMTYwMjMsIDB4RDYzNDg5MDYsCisweDAwMDk0NjBCLCAweDAwMDlBMDA3LCAweDUxNjMwNjAxLCAweDg5MDJDODA4LAorMHg0NjBCRDYzMCwgMHg2MEYwMDAwOSwgMHg4OTAyQzgxMCwgMHg0MjBCRDIyRSwKKzB4RDUyRTAwMDksIDB4ODgwMjYwNTIsIDB4RDIyRDhCMDMsIDB4QTAwNUU2MDQsCisweDg4MDEyMjYwLCAweEQyMkE4QjAyLCAweDIyNjBFNjAxLCAweDI1MjJFMjAwLAorMHhDODgwNjBFMywgMHhEMjI3ODkyRCwgMHg2MEUzNkUyMCwgMHg4OTAyQzg4MCwKKzB4NDIwQkQyMjUsIDB4NjBFMzAwMDksIDB4ODkwMkM4NDAsIDB4NDIwQkQyMjMsCisweDYwRTMwMDA5LCAweDg5MDJDODAyLCAweDQyMEJEMjIxLCAweDYwRTMwMDA5LAorMHg4OTBEQzgwNCwgMHhERDIwRDExRiwgMHgwMDA5NDEwQiwgMHgwMDA5QkYxMSwKKzB4MDAwOUJGNEMsIDB4RDUxRUQ0MUQsIDB4MjQ3MEU3MDgsIDB4MjVEMkJGODUsCisweEM4MDg2MEUzLCAweEQyMUI4OTA1LCAweDRGMjY3RjA0LCAweDQyMkI2RUY2LAorMHg3RjA0NkRGNiwgMHg2RUY2NEYyNiwgMHg2REY2MDAwQiwgMHgwMDFDNTgxQywKKzB4QTAwMEEwMDAsIDB4MDAxRDAxMDAsIDB4MDAxRDQwMDAsIDB4MDAwNDAwMjEsCisweDAwMUM1ODlDLCAweDAwMUUxMDIxLCAweDAwMjAxQTQ2LCAweDAwMjAxQTY4LAorMHgwMDIwMjBDOCwgMHgwMDIwMUE4MCwgMHgwMDIwMUE4RSwgMHgwMDIwM0E1MCwKKzB4MDAxRTEwMEIsIDB4MDAxRTEwMjgsIDB4MDAyMDFBRkEsIDB4MDAyMDFCMDYsCisweDAwMjAxQTk2LCAweDAwMjAxQUI0LCAweDEyMzQ1Njc4LCAweDAwMUUxMDAwLAorMHgwMDEwRjEwMCwgMHgwMDIwMUFFMiwgMHg2NDRDRDZBNywgMHgwMDBCMzQ2QywKKzB4RDZBNjI0NTAsIDB4MzQ2QzY0NEMsIDB4MjQ1MDAwMEIsIDB4NjQ0Q0Q2QTQsCisweDAwMEIzNDZDLCAweDYyNUMyNDUwLCAweDQyMDg2MTZELCAweDQyMDg0MTE5LAorMHg0MjAwNjAxOSwgMHg2NzBFNjE0QywgMHhENDlFMzIxQywgMHg0MjAwMjA3RCwKKzB4MzI0Q0M5MEYsIDB4MjIwMDAwMEIsIDB4NDIwODYyNUMsIDB4NDIwMDQyMDgsCisweDMyNEM2NDRDLCAweDQyMDBENDk4LCAweDAwMEIzMjRDLCAweDJGRTYyMjYwLAorMHg2MTRDNEYxMiwgMHg0MTAwRDQ5MywgMHg2NzEwMzE0QywgMHhFMjlGNjY2RCwKKzB4MjcyOTQ2MTksIDB4NkU1MzYyNjksIDB4NjcyRTY1NzMsIDB4NDIyMTIyN0QsCisweDQyMjE0MjIxLCAweDc2MDE2NjJDLCAweEU0MDE0NjA4LCAweDM0RTg0NjA4LAorMHg2NDRDNDYwMCwgMHgwNzFBMDQ2NywgMHgyMTUwMjU3QiwgMHgwMDBCNEYxNiwKKzB4NEYyMjZFRjYsIDB4RDI4NTdGRTgsIDB4ODgwMTYwMjEsIDB4RDI4NDhCN0IsCisweDI2Njg2NjIxLCAweEQyODM4Qjc3LCAweDI2Njg2NjIxLCAweEU1MEY4QjczLAorMHhFNDAxQkZBMiwgMHhCRkE0RTUwMSwgMHhFNTg2RTQwMCwgMHhFNDAwNjU1QywKKzB4MkY1MEJGQTQsIDB4QkZBMUU0MDEsIDB4RTYwMkU1MDYsIDB4NjA2MzQ2MTgsCisweDgxRjJFNDAxLCAweDY1NDNCRjlGLCAweEU0MDE4NUYyLCAweEJGQUI2NTQzLAorMHg4NUYyNjYwMywgMHg2NTQzRTQwMSwgMHg2NjAzQkZCMSwgMHhFNDAyNjVGMCwKKzB4NjA1Mzc1NkMsIDB4ODBGOEJGODAsIDB4QkY4MkU0MDIsIDB4ODRGOEU1MTIsCisweDcwOTBFNDAyLCAweDY1MDNCRjgyLCAweDQ2MThFNjAyLCAweDgxRjY2MDYzLAorMHhCRjgwRTQwMiwgMHg4NUY2RTUwMCwgMHg2NjAzRTQwMiwgMHhFNTAwQkY4QywKKzB4RTQwMjg1RjYsIDB4QkY5MjY2MDMsIDB4RTVGRUU1MDAsIDB4RTAxMDY1NUMsCisweEJGNjFFNDAzLCAweEU1MTMwRjU0LCAweEU0MEVCRjYzLCAweDA1RkNFMDEwLAorMHhCRjYzRTQwRSwgMHhFNTAwNzU4NSwgMHhCRjY0RTQwMywgMHhFNTAwRTY0MCwKKzB4QkY3MUU0MDMsIDB4RTUwMEU2NDAsIDB4QkY3OEU0MDMsIDB4RTVGRkU2NDAsCisweEUwMTQ2NTVDLCAweEJGNDdFNDA0LCAweEU0MEYwRjU0LCAweEU1MDRCRjQ5LAorMHgwNUZDRTAxNCwgMHhCRjQ5RTQwRiwgMHhFNTAxNzU4NCwgMHhCRjRBRTY0MCwKKzB4RTUwMUU0MDQsIDB4QkY1N0U2NDAsIDB4RTUwMUU0MDQsIDB4RTQwNEU2NDAsCisweEFGNUM3RjE4LCAweDdGMTg0RjI2LCAweDAwMEI0RjI2LCAweDRGMjIwMDA5LAorMHhEMjQyN0ZGMCwgMHg4ODAxNjAyMSwgMHhEMjQxOEI3MSwgMHgyNjY4NjYyMSwKKzB4RDI0MDhCNkQsIDB4MjY2ODY2MjEsIDB4RTUwRjhCNjksIDB4RTQwMUJGMUMsCisweEJGMUVFNTAxLCAweEU1ODZFNDAwLCAweEU0MDA2NTVDLCAweDJGNTBCRjFFLAorMHhCRjFCRTQwMSwgMHhFNDAxRTUwNiwgMHhCRjFDNjU0MywgMHhFNDAxRTY0MCwKKzB4QkYyOTY1NDMsIDB4RTQwMUU2NDAsIDB4QkYzMDY1NDMsIDB4NjVGMEU2NDAsCisweDc1NkNFNDAyLCAweEJFRkY2MDUzLCAweEU0MDI4MEY0LCAweEU1MTJCRjAxLAorMHhFNDAyODRGNCwgMHhCRjAxNzA5MCwgMHhFNjQwNjUwMywgMHhCRjAyRTQwMiwKKzB4RTY0MEU1MDAsIDB4QkYwRkU0MDIsIDB4RTY0MEU1MDAsIDB4QkYxNkU0MDIsCisweEU1RkVFNTAwLCAweDYwNTM2NTVDLCAweEJFRTVFNDAzLCAweEU1MTM4MEY4LAorMHhFNDBFQkVFNywgMHhFNDBFODRGOCwgMHhCRUU3NzA4NSwgMHhFNTAwNjUwMywKKzB4QkVFOEU2NDAsIDB4RTUwMEU0MDMsIDB4QkVGNUU2NDAsIDB4RTUwMEU0MDMsCisweEJFRkNFNjQwLCAweEU1RkZFNDAzLCAweDYwNTM2NTVDLCAweEJFQ0JFNDA0LAorMHhFNDBGODBGQywgMHhFNTA0QkVDRCwgMHhFNDBGODRGQywgMHhCRUNENzA4MywKKzB4RTUwMTY1MDMsIDB4QkVDRUU2NDAsIDB4RTUwMUU0MDQsIDB4QkVEQkU2NDAsCisweEU1MDFFNDA0LCAweEU0MDRFNjQwLCAweEFFRTA3RjEwLCAweDdGMTA0RjI2LAorMHgwMDBCNEYyNiwgMHgwMDAwMDAwOSwgMHgwMDFFMTAyRiwgMHgwMDFFMTA4MCwKKzB4MDAxRTEwOTAsIDB4MDAxRTEwM0YsIDB4MDAxRTEwM0UsIDB4MDAyMDNBNEEsCisweDAwMjAzQTRDLCAweDAwMjAzQTRFLCAweEQyMUREMTFDLCAweDY2MjA2MDEwLAorMHg2NzZDNzAwMSwgMHgzNzAwQzkwRiwgMHhFNTAwOEQxMywgMHg2NzEwNjIxMCwKKzB4NzcwMTYyMkMsIDB4NjQyMzIxNzAsIDB4RDYxNjYwMTAsIDB4NDQwODQ0MDgsCisweDM0MjhDOTBGLCAweDYyNjAyMTAwLCAweDcyMDFENTEzLCAweDQ0MDgyNjIwLAorMHgwMDBCMzU0QywgMHhEMTBGNjA1MywgMHgyNTU4NjUxMCwgMHhFNjAwOEQxMywKKzB4RDYwREQ0MEIsIDB4NjU1QzY1NDAsIDB4NDcwODY3NTMsIDB4Mzc1ODQ3MDgsCisweDQ3MDg2NTQwLCAweDI0NTA3NTAxLCAweDM2N0M2MDQwLCAweDI0MDBDOTBGLAorMHg3MkZGNjIxMCwgMHgwMDBCMjEyMCwgMHgwMDAwNjA2MywgMHgwMDIwMzk5NSwKKzB4MDAyMDM5OTQsIDB4MDAyMDM5OTYsIDB4MDAyMDM1QkMsIDB4N0ZGQzRGMjIsCisweEU2ODBEMUE4LCAweDY2NkM2MjEyLCAweEQyQTcyRjIyLCAweDY3RjM2NTYzLAorMHg0MjBCNzU0MiwgMHg3RjA0RTQwNCwgMHgwMDBCNEYyNiwgMHhFNjgwMDAwOSwKKzB4RDJBMTY2NkMsIDB4RTcwMDY1NjMsIDB4NDIyQjc1NDAsIDB4RTY4MDY0NzMsCisweEQyOUQ2NjZDLCAweEU3MDA2NTYzLCAweDQyMkI3NTQzLCAweDJGODY2NDczLAorMHgyRkE2MkY5NiwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHg3RkMwNEYyMiwKKzB4REI5N0QyOTYsIDB4NzIwMTJGMjIsIDB4RDE5NjFGMjEsIDB4NjYxMjUyMTEsCisweDhCMDEzNjIwLCAweDAwMDlBMEY5LCAweEM5MDM2MDYxLCAweDhCMDE4ODAxLAorMHgwMDA5QTBGMywgMHhEMjkwREM4RiwgMHg2NEMzNDIwQiwgMHg2NTAzRDE4RiwKKzB4NjAxMTFGMDIsIDB4OEIwNDg4MDEsIDB4NDIwQkQyOEQsIDB4QUZFNDY0QzMsCisweDU0NTMwMDA5LCAweDg0NENFRTg0LCAweDg5MDEzMEUwLCAweDAwMDlBMEMzLAorMHg2NjEwRDE4OCwgMHg2MDIzNjI2QywgMHg4QjcxODgwMSwgMHg2MjEwRDE4NiwKKzB4ODk2NjIyMjgsIDB4REE4NkQyODUsIDB4RTAwMzYxMjIsIDB4NjQyMjExMTIsCisweDQwMThEODgxLCAweEREODNFNTAwLCAweDgxNDE2N0EzLCAweDc3MDQyODUwLAorMHg2NDcyNjZBMiwgMHg2RUQzRDU4MCwgMHgxRjQ1N0UwNCwgMHg2NTUyMUY1NiwKKzB4NjRFMzY4RDIsIDB4MUY4ODc0RjgsIDB4Njg0MzY5RTIsIDB4MUY2Mzc4OTQsCisweDFGOTkxRjc0LCAweDYyODI2MTQyLCAweEQ3NzlEOTc4LCAweDFGMkJENjc5LAorMHg2NzcyNjI5MiwgMHgxRjFBNjA2MiwgMHgyNjAyQ0IyMCwgMHhEMTc2RTYwMCwKKzB4RTU0MDFGNTcsIDB4MUY3RDFGMkMsIDB4NzYwMTFGMUUsIDB4MzI1MzYyNkQsCisweDUxRjM4QkZCLCAweDUyRjU1NUY0LCAweDI1MjIyQTEyLCAweDU1Rjc1N0Y2LAorMHgyNzUyNUFGOCwgMHg1REY5MkRBMiwgMHgyRUQyNTFGQiwgMHhENTZCNUVGQSwKKzB4NTRGQzI0RTIsIDB4MjgxMjU3RkQsIDB4RDE2MEQ4NjksIDB4MjU3MjI5NDIsCisweDY5MTI2NzgyLCAweDE5NzREODY2LCAweERENjY2QTEyLCAweDU2RkU2MEExLAorMHgyQTAxQ0IwMSwgMHhEQTY0NjQxMiwgMHhFOTAxMjg0MiwgMHg0QTBCMkQ0MiwKKzB4NTJGRTI2OTIsIDB4RDY2MUVFMDEsIDB4MjJFMjRFMTgsIDB4NzIwMTYyNjIsCisweDYwQjIyNjIyLCAweENCMDFEMTRGLCAweDJCMDJFMjAyLCAweDIxMjBBMDNGLAorMHg4QjNDMjIyOCwgMHhFNjAxRDU1QSwgMHgyMTYwRTcwMCwgMHhFMDFDMjU3MiwKKzB4QzgwMTAwNEMsIDB4RDg1NzhCMEMsIDB4MUY4RkQyNTcsIDB4RTYwMDI4MjIsCisweDc2MDFFNTdELCAweDMyNTM2MjZDLCAweDU2RkY4QkZCLCAweDI2MjJEMjUzLAorMHhFMkZFNjlCMiwgMHgyQjkyMjkyOSwgMHgwQTRDRTAxRSwgMHhFMDFGNjVGMiwKKzB4MDE0QzI1QTAsIDB4NzQxMDU3RjEsIDB4RUEwNjI3MTAsIDB4REQ0Q0U2MDAsCisweDg0NDZERTRDLCAweDJEMDA3NjAxLCAweDY5NkM2ODQ0LCAweDJFODAzOUEzLAorMHg4RkY2N0UwMSwgMHhERTQ4N0QwMSwgMHgyRUEwRUE5NCwgMHhFMTAwN0UwMSwKKzB4N0UwRjJFMTAsIDB4RDEyRkUyMDUsIDB4NjQxMDJFMjAsIDB4NjAyMzYyNEMsCisweDg5MDg4ODAxLCAweDU1RjJEMjJBLCAweDY0QzM0MjBCLCAweEVFMDFEMTMyLAorMHhBRjFBNEUxOCwgMHg1NUYyMjFFMiwgMHg4NTUzRDEzQywgMHg2MjBENjYxMiwKKzB4ODkwNjMyNjIsIDB4RDYzQkQ0M0EsIDB4RTgwMTQ2MEIsIDB4QUYwQ0Q3M0EsCisweEQ5MUYyNzgyLCAweDY0QzM0OTBCLCAweEVFMDFEMTI3LCAweERBMzhENDM3LAorMHg0QTBCNEUxOCwgMHhBRjAwMjFFMiwgMHg3RjQwMDAwOSwgMHg2RUY2NEYyNiwKKzB4NkNGNjZERjYsIDB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsIDB4NEYyMjY4RjYsCisweDg1NDY3RkY0LCAweDJGMDFFNjgxLCAweDY2NkM4NTQ3LCAweDg1NDg4MUYxLAorMHg4MUYyRDIwOSwgMHg2N0YzODU0MiwgMHg4NTQzODFGMywgMHg4MUY0RTQwQywKKzB4NjU2MzYwNTMsIDB4NDIwQjgxRjUsIDB4N0YwQzc1NDAsIDB4MDAwQjRGMjYsCisweDAwMDAwMDA5LCAweDAwMUMzRDlDLCAweDAwMjAyM0ZDLCAweDAwMTE3NzlBLAorMHgwMDFDMzZGOCwgMHgwMDIwMzVCNCwgMHgwMDIwMTRBNiwgMHgwMDIwM0ExNiwKKzB4MDAyMDE0RDAsIDB4MDAyMDM5QTUsIDB4MDAyMDM5QTQsIDB4MDAyMDM5QTAsCisweDAwMUMzQjlDLCAweDAwMUMzNzA0LCAweDAwMUMzRDk4LCAweDAwMUMzQkI0LAorMHgwMDFDNTk2MCwgMHgwMDFDMzUwMCwgMHgwMDFDM0QzMCwgMHgwMDFDODk2MCwKKzB4MDAyMDM1OEMsIDB4MDAxQzNEMDAsIDB4MDAyMDE2MTAsIDB4MDAxMTc3MzAsCisweDAwMjAzOUE4LCAweDAwMUM1ODJDLCAweDIwMDBBMDAwLCAweDAwMDBBMDAwLAorMHgwMDExNzc4QywgMHgwMDExNzc5MiwgMHgwMDExNzc4OCwgMHgwMDIwMzk3QywKKzB4MDAyMDM1N0MsIDB4MDAyMDE1MzQsIDB4MDAxRTIxMzAsIDB4MDAyMDNEQTAsCisweDAwMjAxOEMwLCAweDJGOTYyRjg2LCAweDJGQjYyRkE2LCAweDJGRDYyRkM2LAorMHg0RjIyMkZFNiwgMHhEMTlCN0ZFQywgMHgyRjEyRTAwMCwgMHg2MTAzRDQ5QSwKKzB4MUY0MjgxRjIsIDB4REQ5QURBOTksIDB4RDY5QTY4MTMsIDB4RTAwMTQ4MDgsCisweDQ2MEJERTk5LCAweDM4RUM0ODAwLCAweDY1QTIxRjAzLCAweDM1MjA1MkExLAorMHhBMjNFOEIwMSwgMHg2MDUxMDAwOSwgMHg4ODAxQzkwMywgMHhBMjM4OEIwMSwKKzB4NTI1MzAwMDksIDB4MzJFMERFOTEsIDB4RDk5MThCMTAsIDB4NjRBMzQ5MEIsCisweDRCMEJEQjkwLCAweERFOTA2NDAzLCAweEQ3OTFENjkwLCAweEVDMDFENTkxLAorMHgyRTAyRTEwMCwgMHgyNzEwMjZDMCwgMHgyNTAyQUZERiwgMHhDODAxODU1MSwKKzB4QTE1NzhCMDEsIDB4NjI1MTAwMDksIDB4NDIwMDYyMkQsIDB4NUU1MzM2NkEsCisweDg1RTIyMjZELCAweEM5MDM2NDJDLCAweDg1RTM2NjAzLCAweDYwNTM2NTBELAorMHg0MDIxNDAyMSwgMHg0NTAwQzkzRiwgMHgzMjJBNjcwMywgMHg2MDUzMjUyRCwKKzB4QzkwMUQxN0YsIDB4NjAxMDZDMDMsIDB4ODgwMUQ5N0YsIDB4REI3RjhCMDUsCisweDIxMjBFMjAwLCAweENCMDE2MEIyLCAweEQxN0QyQjAyLCAweDg4MDE2MDExLAorMHg2NUEyOEIwQSwgMHg4RDA0MjQ0OCwgMHg5QjlFNjI1MSwgMHhBMDAzMjJCOSwKKzB4OTE5QjI1MjEsIDB4MjUyMTIyMUIsIDB4MzdCM0VCMTAsIDB4MjQ0ODg5NUUsCisweEQ0NzM4QjA3LCAweDIyMjg2MjQxLCAweDYwNjM4OTAzLCAweEEwNTc4MUY4LAorMHhENTcwNjQ3MywgMHg0NjA4NDYwOCwgMHg4NUUyNjI3MywgMHg0NjAwNkI1MCwKKzB4MzYyQzQyMDAsIDB4MkJCOEM5MTAsIDB4OEYxRjY0NjMsIDB4MjY2ODY2MDMsCisweEQyNjk4OTExLCAweDA2MkQ2MDQzLCAweDQxMTk2MTZELCAweDZCMEU2MDE5LAorMHg4MUY4MjBCRCwgMHg4ODAxNjBDMywgMHg2NDZDOEYyQywgMHg4ODBGNjA3MywKKzB4QTAyNzhCMUIsIDB4RDI2MTAwMDksIDB4MDUyRDYwNDMsIDB4NDExOTYxNUQsCisweDY3MEU2MDE5LCAweDY0NUMyMDdELCAweDgxRjhBMDFDLCAweDg5MEYyNjY4LAorMHg2MDQzRDI1QiwgMHg2QjVEMDUyRCwgMHg2MEI5NEIxOSwgMHgyMDFENjEwRSwKKzB4NjBDMzgxRjgsIDB4OEYwRDg4MDEsIDB4NjQ3MzY0NUMsIDB4RUMwMEEwMEEsCisweDYwNDNEMjU0LCAweDYyNUQwNTJELCAweDYwMjk0MjE5LCAweDIwN0Q2NzBFLAorMHg4MUY4NjQ1QywgMHg4ODAyODVGOCwgMHg4NUUxODkwQSwgMHg4RDA3QzgyMCwKKzB4RTZEQzYyMDMsIDB4NjAyMzIyNjksIDB4ODFFMUEwMDIsIDB4NjQ0Q0U0RkYsCisweDYyMTBEMTQ5LCAweDg5MDEyMjI4LCAweDY0NENFNEZGLCAweDY1NERFQkZGLAorMHgzNUIwNkJCQywgMHhEQjM2OEIyQiwgMHg2NEEzNEIwQiwgMHg0MTBCRDEzNSwKKzB4NTQwMzY0MDMsIDB4ODU0NDZFMDMsIDB4Qzk0OERCNDAsIDB4REM0MDg4MDgsCisweEJFQUM4QjAxLCAweDY0QjNFNTAyLCAweDY1RTM0QzBCLCAweERCM0RFQzAxLAorMHhEMTNEMkRDMiwgMHg2MjEyNjBCMiwgMHg3MjAxNzAwMSwgMHgyMTIyODgwNSwKKzB4MkIwMjhGMDgsIDB4NjY2Q0U2ODAsIDB4NjU2M0QyMzgsIDB4NzU0OUU3MDAsCisweDY0NzM0MjBCLCAweEEwMzBENDM2LCAweDdGRkYwMDA5LCAweDg1RTI4MDAwLAorMHgyMEI5RUJGQywgMHg2MTAzODFFMiwgMHg5NDJBODVFMywgMHg2MjAzMjA0OSwKKzB4NDUwODg1RjgsIDB4ODFFMjIwMUIsIDB4QzkwMTYwQzMsIDB4NDAwODQwMTgsCisweDQwMDg0MDA4LCAweDQwMDAyMjVCLCAweDYwMjMyMjBCLCAweDg1RTQ4MUUzLAorMHg0MTE4RTEwOCwgMHg4MUU0MjAxQiwgMHhFNDAyNjJBMiwgMHgyMEI5ODUyMSwKKzB4NjdBMjgxMjEsIDB4Q0IwMTYwNzEsIDB4ODVGODI3MDEsIDB4ODkwMzMwNDIsCisweEVDRTc4NUUyLCAweDgxRTIyMEM5LCAweDQ5MEJENDFFLCAweEEwM0IwMDA5LAorMHg3RTAzMDAwOSwgMHgwMDFDM0QzMCwgMHgwMDIwM0RBQywgMHgwMDIwMzU4QywKKzB4MDAxRTIxMkMsIDB4MDAyMDM0NzAsIDB4MDAxQzNEMDAsIDB4MDAxMTc3ODAsCisweDAwMjAxNEE2LCAweDAwMjAxNjcwLCAweDAwMTE3NzBDLCAweDAwMjAzOUE0LAorMHgwMDIwMzlBNSwgMHgwMDIwMzlBMCwgMHgwMDIwMThDMCwgMHgwMDFDMzZGOCwKKzB4MDAyMDNBMUEsIDB4MDAyMDNEQkMsIDB4MDAyMDNCQTAsIDB4MDAyMDNDMjAsCisweDAwMjAzQ0EwLCAweDAwMjAzRDIwLCAweDAwMjAzOTkwLCAweDAwMjAzNTg0LAorMHgwMDIwMTREMCwgMHgwMDIwM0ExQywgMHgwMDIwM0EyMCwgMHgwMDIwMjNGQywKKzB4MDAyMDNEQTQsIDB4MDAyMDNEQTgsIDB4NjAyMjYyRjIsIDB4NDAwOTQwMTksCisweEM5MEY0MDA5LCAweDhCMEI4ODBBLCAweDYwRTJERThDLCAweDQwMDk0MDE5LAorMHhDOTBGNDAwOSwgMHg4QjAzODgwOCwgMHhDQjAxNjBBMiwgMHgyODAyQTAwNiwKKzB4NjVFMkRFODcsIDB4MkU1Mjc1MDEsIDB4Mjg2MjY2QTIsIDB4NTJGMzY2RjIsCisweDI2MjJBRTgzLCAweEQyODM4NTUxLCAweERFODNDODAyLCAweEEwOTU4QjAxLAorMHg0MjBCMDAwOSwgMHg0RTBCNjRBMywgMHg1RTAzNjQwMywgMHg4NUU0NjUwMywKKzB4NDkxOEU5MDgsIDB4RDc3RDIwOUIsIDB4RTA0QzgxRTQsIDB4REM3QzBCN0UsCisweDdCMDFEOTdDLCAweDYxQzIwN0I2LCAweDcxMDE2NjkwLCAweDhEMDYyNjY4LAorMHhENDc5MkMxMiwgMHg0MjBCRDI3OSwgMHhBMDcwRUIwMSwgMHg2MjUxMkRCMiwKKzB4NEIxOEVCMEYsIDB4MjJCOUUxMDIsIDB4MzIxMDQxMTgsIDB4ODU1MThCMEYsCisweDIwMjlFMkZDLCAweDYwNTE4MTUxLCAweENCMDE3MkUwLCAweDg1RTEyNTAxLAorMHgyMDI5OTRBMywgMHg4NUU0ODFFMSwgMHhBMDUyMjA0OSwgMHg2NzUxODFFNCwKKzB4NDcxOTY3N0QsIDB4NjY3RTY3NzksIDB4NzcwMTI3NkQsIDB4NjkwMzYwN0MsCisweDg4MDE0OTE4LCAweDI1OTE4RjNFLCAweDZCMTJEMTYxLCAweDIxQjI3QjAxLAorMHg2NjBEODVFMywgMHg0MDIxNjA2MywgMHhDOTNGNDAyMSwgMHg2QzAzNDYwMCwKKzB4MjYyRDMyMkEsIDB4QzgwMTYwNjMsIDB4REI1RUQxNUQsIDB4OTY3RDg5MDEsCisweEU2MDAyQzZCLCAweDY2NkM2N0NELCAweDQwMDA2MDYzLCAweDYyMkQwMjFELAorMHg4RDBFMzI3MCwgMHg2MDQzNjQwMywgMHhFOUZGMDIxRCwgMHg4QjAxMzI5MCwKKzB4MDFDNUEwMDcsIDB4NjI2Qzc2MDEsIDB4MzI5MkU5MDQsIDB4NjQ2QzhCRUIsCisweDYwNDM0NDAwLCAweEQxNTAwNEJELCAweDBCNDU3NDAxLCAweDY2OUQ2OTExLAorMHg4OTA3MzY3MCwgMHg2MDJENjIxMSwgMHg4OTAzODhGRiwgMHhFMjAxREI0QiwKKzB4MkIyMDIxQzEsIDB4RUNGQzg1NTEsIDB4ODE1MTIwQzksIDB4Q0IwMTYwNTEsCisweERDNDcyNTAxLCAweDY0QTM0QzBCLCAweDUxRjM2NkYyLCAweDg1RUYyNjEyLAorMHg1NEYyRDI0NCwgMHg2NTBENDIwQiwgMHgwMDA5QURFNywgMHhFNTAwREM0MiwKKzB4NDIwQjJDNTIsIDB4NEUwQjY0QTMsIDB4NTQwMzY0MDMsIDB4ODU0NDZFMDMsCisweDY3MDNFOTA4LCAweDY1MDM0OTE4LCAweDI3OTk4NTQxLCAweERCMzIzNzkwLAorMHg4RjBCRDkzMiwgMHg2MDEzNjEwRCwgMHg4QjA3QzgyMCwgMHhDOTQ4NjA1MywKKzB4OEIwMzg4MDgsIDB4RTUwMUJENEIsIDB4MDAwOUEwMDUsIDB4MjEyOEQyMzMsCisweEJENDQ4OTAxLCAweDY0QjNFNTAwLCAweDQ5MEI2NUUzLCAweEFEQkNFQzAxLAorMHg4NUYyMkRDMiwgMHg3MDAxRUUwNCwgMHgzMUU3NjEwRCwgMHg4RDAyODFGMiwKKzB4QURBOTdBMDgsIDB4N0YxNDAwMDksIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsCisweDZBRjY2QkY2LCAweDAwMEI2OUY2LCAweEY3RkY2OEY2LCAweDJGRTY4MDAwLAorMHhEMjIzNEYyMiwgMHg2MEUzNkUyMiwgMHg4RDAyQzg0MCwgMHhCQkU1MjJFMiwKKzB4RTI0MDAwMDksIDB4MkUyODQyMTgsIDB4QkJGMDg5MDEsIDB4NjBFMzAwMDksCisweDg5MDVDODEwLCAweEQyMUNENDFCLCAweDAwMDk0MjBCLCAweDAwMDlCQkVGLAorMHhDODA1NjBFMywgMHhCRDZEODkwMSwgMHg2MEUzMDAwOSwgMHg4OTAyQzgwMiwKKzB4QUJFQzRGMjYsIDB4NEYyNjZFRjYsIDB4NkVGNjAwMEIsIDB4MDAxQzNEM0MsCisweDAwMTE3NzYwLCAweDAwMjAxNEE2LCAweDAwMjAxNjcwLCAweDAwMjAzNTFDLAorMHgwMDIwM0RDMCwgMHgwMDIwMzk5MCwgMHgwMDIwMzU4NCwgMHgwMDIwMTREMCwKKzB4MDAyMDM5RkMsIDB4MDAyMDNBMDQsIDB4MDAyMDM5RjgsIDB4MDAyMDM5RkEsCisweDAwMjAxNTM0LCAweDAwMjAxOEQwLCAweDAwMjAzQTFDLCAweDAwMDA4MDAwLAorMHgwMDFDMzUxMCwgMHgwMDIwM0RCNCwgMHgwMDIwMThDMCwgMHg4OTAxNEYyMiwKKzB4NjExQjYwMEIsIDB4NjExQkIwMEEsIDB4MDAwQjRGMjYsIDB4NjAwQjYwMEIsCisweDYxMUJBMDA0LCAweDhERjEyMTA3LCAweDhCRjg0MDExLCAweDYyMEQyRjI2LAorMHg4RjNFMzAyMCwgMHg0MDE4MDAxOSwgMHg4QjBCMzAxNiwgMHgzMTA0MzEwNCwKKzB4MzEwNDMxMDQsIDB4MzEwNDMxMDQsIDB4MzEwNDMxMDQsIDB4NDEyNDYyRjYsCisweDYwMUMwMDBCLCAweDQxMjk2MjE5LCAweDIwMDg0MDE4LCAweDMxMDQ4OTI2LAorMHgzMTA0MzEwNCwgMHgzMTA0MzEwNCwgMHgzMTA0MzEwNCwgMHgzMTA0MzEwNCwKKzB4MzEwNDMxMDQsIDB4MzEwNDMxMDQsIDB4MzEwNDMxMDQsIDB4NjExOTMxMDQsCisweDMyMDQyMjFELCAweDMyMDQzMjA0LCAweDMyMDQzMjA0LCAweDMyMDQzMjA0LAorMHgzMjA0MzIwNCwgMHgzMjA0MzIwNCwgMHgzMjA0MzIwNCwgMHgzMjA0MzIwNCwKKzB4MjEyRDMyMDQsIDB4NjAxOTYyRjYsIDB4NDAyNDAwMEIsIDB4MDAwQkUwMDAsCisweDYyMTM2MkY2LCAweDQxMjk0MjI4LCAweDMxMDQ0MjI0LCAweDMxMDQ0MjI0LAorMHgzMTA0NDIyNCwgMHgzMTA0NDIyNCwgMHgzMTA0NDIyNCwgMHgzMTA0NDIyNCwKKzB4MzEwNDQyMjQsIDB4MzEwNDQyMjQsIDB4MzEwNDQyMjQsIDB4MzEwNDQyMjQsCisweDMxMDQ0MjI0LCAweDMxMDQ0MjI0LCAweDMxMDQ0MjI0LCAweDMxMDQ0MjI0LAorMHgzMTA0NDIyNCwgMHgzMTA0NDIyNCwgMHg2MDJENDIyNCwgMHg2MkY2MDAwQiwKKzB4MDgwQTBDMEUsIDB4MDAwMjA0MDYsIDB4MUExQzFFMjAsIDB4MTIxNDE2MTgsCisweDJFMzAzMjM0LCAweDI2MjgyQTJDLCAweDNBM0MzRTQwLCAweDZDNjI1NjQ4LAorMHg0MTExMkYyNiwgMHhFMjIwOEYxOCwgMHg4OTBCMzEyMywgMHgzMjFDRDIwNCwKKzB4RDEwMjYyMjAsIDB4NDEyQjMxMkMsIDB4MDAwOTAwMDksIDB4MDAyMDM0OUEsCisweDAwMjAzNDUwLCAweDAwMEJFMDAwLCAweDQwMDA2MkY2LCAweDQwMDA0MDAwLAorMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg2MkY2MDAwQiwgMHg0MDAwNDAwMCwKKzB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAxODQwMDAsIDB4NjJGNjAwMEIsCisweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMjg0MDAwLAorMHg2MkY2MDAwQiwgMHg0MDAwNDAwMCwgMHg0MDE4NDAwMCwgMHgwMDBCNDAyOCwKKzB4QzkwRjYyRjYsIDB4NDAwNTQwMDUsIDB4NDAwNTQwMDUsIDB4NjJGNjAwMEIsCisweDQwMDVDOTA3LCAweDQwMDU0MDA1LCAweDYyRjYwMDBCLCAweDQwMDVDOTAzLAorMHgwMDBCNDAwNSwgMHhDOTAxNjJGNiwgMHgwMDBCNDAwNSwgMHgwMDAwNjJGNiwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0MjcwNzM3MiwKKzB4M0QyMDY2NzUsIDB4NTU0RTIwM0QsIDB4MjAyQzRDNEMsIDB4NkU0OTY3N0EsCisweDRFNDk3Mjc0LCAweDZENzU0RTUxLCAweDAwMDAwMDNELCAweDYxNzY2RTQ5LAorMHgyMDY0Njk2QywgMHg3MjY1NzM3NSwgMHgyMDcyNkYyMCwgMHgyMDc5NjU2QiwKKzB4MDAyMTQ0NDksIDB4NkU2QjZFNTUsIDB4MjA2RTc3NkYsIDB4NkQ2RDZGNjMsCisweDNENjQ2RTYxLCAweDAwMDAwMDAwLCAweDIwM0EzMDUxLCAweDAwMDAwMDIwLAorMHgyMDNBMzE1MSwgMHgwMDAwMDAyMCwgMHgyMDNBMzI1MSwgMHgwMDAwMDAyMCwKKzB4MjAzQTMzNTEsIDB4MDAwMDAwMjAsIDB4MjAzQTM0NTEsIDB4MDAwMDAwMjAsCisweDJCNDM0NzQxLCAweDczNjk2RjRFLCAweDYxNDMyMDY1LCAweDcyNjI2OTZDLAorMHg2RjY5NzQ2MSwgMHg2MTY2MjA2RSwgMHg2RjIwNkM2OSwgMHg2OTc0MjA2RSwKKzB4MEQwQTY1NkQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwNzIsIDB4MDAyMDUyMjAsCisweDYyNzM1NTc2LCAweDc0NzM3MjVGLCAweDAwMDAwQTBELCAweDYyNzM1NTc2LAorMHg3Mzc1NzM1RiwgMHg2NDZFNjU3MCwgMHgwMDAwMEEwRCwgMHg2MjczNTU3NiwKKzB4NzM2NTcyNUYsIDB4MDAwQTBENkQsIDB4MDAwMDAwNDQsIDB4NDQzODc1NzAsCisweDcyNjM3MzY1LCAweDZGNzQ3MDY5LCAweDNENTg0NTcyLCAweDAwMDAwMDAwLAorMHgwMDAwMDA0NywgMHg3Mjc0NkU0OSwgMHg2RDY1MjA1MSwgMHgyQzc5NzQ3MCwKKzB4NDk2NzdBMjAsIDB4NDk3Mjc0NkUsIDB4NzU0RTUxNEUsIDB4MDAwMDNENkQsCisweDY1NEM3MjQ1LCAweDAwMDAwMDZFLCAweDIwNzQ2RjRFLCAweDc1NkY2RTY1LAorMHg0OTIwNjg2NywgMHg0MjIwNTE0RSwgMHgwQTBENjY3NSwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwRkYsIDB4MDAwMjAwMDEsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDEwRTAxMEQsIDB4MDAwMjAwMDMsIDB4MDEwOTAxMDgsIDB4MDAwMjAxMEEsCisweDAyMDAwMDAzLCAweDAyMDIwMjAxLCAweDAyMDQwMjAzLCAweDAyMDYwMjA1LAorMHgwMjAyMDIwMCwgMHgwMjA0MDIwMywgMHgwMjBDMDIwQiwgMHgwMjBFMDIwRCwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMDAwMDBGRiwgMHgwMDAyMDAwMSwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMTBFMDEwRCwgMHgwMDAyMDAwMywgMHgwMTA5MDEwOCwgMHgwMDAyMDEwQSwKKzB4MDAwMzAwMDMsIDB4MDIwMjAyMDEsIDB4MDIwNDAyMDMsIDB4MDIwNjAyMDUsCisweDAyMDIwMjAwLCAweDAyMDQwMjAzLCAweDAyMEMwMjBCLCAweDAyMEUwMjBELAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAxMEUwMTBELCAweDAwRkYwMTBGLCAweDAxMDkwMTA4LCAweDAxMEIwMTBBLAorMHgwMjAwMDEwRiwgMHgwMjAyMDIwMSwgMHgwMjA0MDIwMywgMHgwMjA2MDIwNSwKKzB4MDIwMjAyMDAsIDB4MDIwNDAyMDMsIDB4MDIwQzAyMEIsIDB4MDIwRTAyMEQsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDEwRTAxMEQsIDB4MDBGRjAxMEYsIDB4MDEwOTAxMDgsIDB4MDEwQjAxMEEsCisweDAxMEYwMTBGLCAweDAyMDIwMjAxLCAweDAyMDQwMjAzLCAweDAyMDYwMjA1LAorMHgwMjAyMDIwMCwgMHgwMjA0MDIwMywgMHgwMjBDMDIwQiwgMHgwMjBFMDIwRCwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMDIwNTIyMCwgMHgwMDAwMDA0NiwgMHgwMDAwMDA1OSwgMHg3MzIwNDE0MiwKKzB4MDAzRDcxNjUsIDB4NDk1NDQxMjAsIDB4MDAwMDIwNEQsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMkUwMjA5LCAweDgwMDAwMTAxLCAweDAwMDQwOUZBLAorMHgwMEZGMDQwMCwgMHgwNTA3MDAwMCwgMHgwMjAwMDIwMSwgMHg4MjA1MDcwMCwKKzB4MDAwMjAwMDIsIDB4MDM4MzA1MDcsIDB4MDcwMTAwNDAsIDB4NDAwMzA0MDUsCisweDAyMDkwMTAwLCAweDAxMDEwMDJFLCAweDA5RkE4MDAwLCAweDA0MDAwMDA0LAorMHgwMDAwMDBGRiwgMHgwMjAxMDUwNywgMHgwNzAwMDA0MCwgMHg0MDAyODIwNSwKKzB4MDUwNzAwMDAsIDB4MDA0MDAzODMsIDB4MDQwNTA3MDEsIDB4MDAwMDQwMDIsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDA3MDkwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHg2NjIxRDJBOCwgMHgyMDA4NjA2RCwgMHhBMUIxOEIwMSwgMHg4ODEwMDAwOSwKKzB4ODgxMTg5MjIsIDB4ODgxMjg5MjAsIDB4ODgxMzg5MUUsIDB4ODgyMTg5MUMsCisweDg4MjI4OTFBLCAweDg4M0E4OTE4LCAweDg4M0I4OTE2LCAweEU2NDQ4OTE0LAorMHgzMDYwNDYwOCwgMHhFNjQ4ODkxMCwgMHgzMDYwNDYwOCwgMHhFNjU4ODkwQywKKzB4MzA2MDQ2MDgsIDB4OTYzRDg5MDgsIDB4ODkwNTMwNjAsIDB4MzA2MDk2M0IsCisweDk2Mzk4OTAyLCAweDhCMDEzMDYwLCAweEUwMTAwMDBCLCAweDhCMDE4ODIwLAorMHhFMDIwMDAwQiwgMHg4OTJCODgzNywgMHg4OTI5ODgzMiwgMHg4OTI3ODgzNSwKKzB4ODkyNTg4MzYsIDB4ODkyMzg4MzAsIDB4ODkyMTg4MzgsIDB4ODkxRjg4MzksCisweDg5MUQ4ODM0LCAweDg5MUI4ODMzLCAweDQ2MDhFNjRDLCAweDg5MTczMDYwLAorMHgzMDYwOTYxQiwgMHg5NjE5ODkxNCwgMHg4OTExMzA2MCwgMHgzMDYwOTYxNywKKzB4OTYxNTg5MEUsIDB4ODkwQjMwNjAsIDB4MzA2MDk2MTMsIDB4OTYxMTg5MDgsCisweDg5MDUzMDYwLCAweDMwNjA5NjBGLCAweDk2MEQ4OTAyLCAweDhCMEMzMDYwLAorMHhFMDMwMDAwQiwgMHgwNTEwMDE2NSwgMHgwMjMwMEExMCwgMHgwNDMwMDMzMCwKKzB4MDYzMDA1MzAsIDB4MEIzMDBBMzAsIDB4ODg0MDBDMzAsIDB4QTE0MjhCMDEsCisweDg4NDEwMDA5LCAweEExM0U4QjAxLCAweDg4NDMwMDA5LCAweEExM0E4QjAxLAorMHg4ODQ4MDAwOSwgMHhBMTM2OEIwMSwgMHg4ODRBMDAwOSwgMHhBMTMyOEIwMSwKKzB4ODg0QjAwMDksIDB4QTEyRThCMDEsIDB4ODg0QzAwMDksIDB4QTEyQThCMDEsCisweEU2ODAwMDA5LCAweDMwNjA2NjZDLCAweEExMjQ4QjAxLCAweEU2ODEwMDA5LAorMHgzMDYwNjY2QywgMHhBMTFFOEIwMSwgMHhFNjgyMDAwOSwgMHgzMDYwNjY2QywKKzB4QTExODhCMDEsIDB4RTY4MzAwMDksIDB4MzA2MDY2NkMsIDB4QTExMjhCMDEsCisweEU2ODQwMDA5LCAweDMwNjA2NjZDLCAweEExMEM4QjAxLCAweEU2ODUwMDA5LAorMHgzMDYwNjY2QywgMHhBMTA2OEIwMSwgMHhFNjg2MDAwOSwgMHgzMDYwNjY2QywKKzB4QTEwMDhCMDEsIDB4RTY4NzAwMDksIDB4MzA2MDY2NkMsIDB4QTBGQThCMDEsCisweEU2ODgwMDA5LCAweDMwNjA2NjZDLCAweEEwRjQ4QjAxLCAweEU2ODkwMDA5LAorMHgzMDYwNjY2QywgMHhBMEVFOEIwMSwgMHhFNjhBMDAwOSwgMHgzMDYwNjY2QywKKzB4QTBFODhCMDEsIDB4RTY4QjAwMDksIDB4MzA2MDY2NkMsIDB4QTBFMjhCMDEsCisweEU2OEMwMDA5LCAweDMwNjA2NjZDLCAweEEwREM4QjAxLCAweEU2OEQwMDA5LAorMHgzMDYwNjY2QywgMHhBMEQ2OEIwMSwgMHhFNjhFMDAwOSwgMHgzMDYwNjY2QywKKzB4QTBEMDhCMDEsIDB4RTY4RjAwMDksIDB4MzA2MDY2NkMsIDB4QTBDQThCMDEsCisweEU2OTAwMDA5LCAweDMwNjA2NjZDLCAweEEwQzQ4QjAxLCAweEU2OTEwMDA5LAorMHgzMDYwNjY2QywgMHhBMEJFOEIwMSwgMHhFNkY4MDAwOSwgMHgzMDYwNjY2QywKKzB4QTBCODhCMDEsIDB4RTZGOTAwMDksIDB4MzA2MDY2NkMsIDB4QTBCMjhCMDEsCisweEU2RkEwMDA5LCAweDMwNjA2NjZDLCAweEEwQUM4QjAxLCAweEU2RkIwMDA5LAorMHgzMDYwNjY2QywgMHhBMEE2OEIwMSwgMHhFNkZDMDAwOSwgMHgzMDYwNjY2QywKKzB4QTBBMDhCMDEsIDB4RTZGRDAwMDksIDB4MzA2MDY2NkMsIDB4QTA5QThCMDEsCisweEU2RkUwMDA5LCAweDMwNjA2NjZDLCAweEEwOTQ4QjAxLCAweEU2RkYwMDA5LAorMHgzMDYwNjY2QywgMHhBMDhFOEIwMSwgMHhFNkQwMDAwOSwgMHgzMDYwNjY2QywKKzB4QTA4ODhCMDEsIDB4RTZEMTAwMDksIDB4MzA2MDY2NkMsIDB4QTA4MjhCMDEsCisweEU2RDIwMDA5LCAweDMwNjA2NjZDLCAweEEwN0M4QjAxLCAweEU2RDMwMDA5LAorMHgzMDYwNjY2QywgMHhFNkQ0ODk3NywgMHgzMDYwNjY2QywgMHhFNkQ1ODk3MywKKzB4MzA2MDY2NkMsIDB4RTZENjg5NkYsIDB4MzA2MDY2NkMsIDB4RTZENzg5NkIsCisweDMwNjA2NjZDLCAweEU2RDg4OTY3LCAweDMwNjA2NjZDLCAweEEwMDM4OTYzLAorMHgwMDAwMDAwOSwgMHgwMDExNDAwMCwgMHg2NjZDRTZEOSwgMHg4OTVBMzA2MCwKKzB4NjY2Q0U2REEsIDB4ODk1NjMwNjAsIDB4NjY2Q0U2REIsIDB4ODk1MjMwNjAsCisweDY2NkNFNkRDLCAweDg5NEUzMDYwLCAweDY2NkNFNkRELCAweDg5NEEzMDYwLAorMHg2NjZDRTZGMCwgMHg4OTQ2MzA2MCwgMHg2NjZDRTZGMSwgMHg4OTQyMzA2MCwKKzB4NjY2Q0U2RjIsIDB4ODkzRTMwNjAsIDB4NjY2Q0U2RjMsIDB4ODkzQTMwNjAsCisweDY2NkNFNkY0LCAweDg5MzYzMDYwLCAweDY2NkNFNkY1LCAweDg5MzIzMDYwLAorMHg2NjZDRTZGNiwgMHg4OTJFMzA2MCwgMHg2NjZDRTZGNywgMHg4OTJBMzA2MCwKKzB4NDYwOEU2NTAsIDB4ODkyNjMwNjAsIDB4MzA2MDk2OUEsIDB4OTY5ODg5MjMsCisweDg5MjAzMDYwLCAweDMwNjA5Njk2LCAweDk2OTQ4OTFELCAweDg5MUEzMDYwLAorMHgzMDYwOTY5MiwgMHg5NjkwODkxNywgMHg4OTE0MzA2MCwgMHgzMDYwOTY4RSwKKzB4OTY4Qzg5MTEsIDB4ODkwRTMwNjAsIDB4MzA2MDk2OEEsIDB4OTY4ODg5MEIsCisweDg5MDgzMDYwLCAweDMwNjA5Njg2LCAweDk2ODQ4OTA1LCAweDg5MDIzMDYwLAorMHgzMDYwOTY4MiwgMHgwMDBCOEIwMSwgMHhFMEZGRTA0MCwgMHg2MDBDMDAwQiwKKzB4RTAwMDAwMEIsIDB4NjI0M0QxNTcsIDB4RTQwMjg1MTIsIDB4NjYyRDY3MEQsCisweEU1MDBBMDBFLCAweDYwNTM2NTVELCAweDMwNUM0MDAwLCAweDQwMDhEMTUyLAorMHg2MjJEMDIxRCwgMHg4QjAyMzI2MCwgMHhBMDA0NzEwOCwgMHg3NTAxMDQxQywKKzB4MzI3MzYyNUQsIDB4NjA0MzhCRUUsIDB4QzkwQTAwMEIsIDB4Njc0Qzc2RkUsCisweDAyNUM2MDZDLCAweDM3MjM2MjJDLCAweDIwMDg4OTA2LCAweDcwRkY4OTAyLAorMHg2NjAzQUZGNiwgMHhFMDAwMDAwQiwgMHgwMDA5MDAwQiwgMHg0RjEyNEYyMiwKKzB4MzI2MDUyRjIsIDB4MzQ1MDg5MTAsIDB4MzQ3MDg5MEUsIDB4Mzc1MDg5MEQsCisweDMyNjg4OTBBLCAweDA0MjczNDU4LCAweDYwNzMzNzU4LCAweDQ0MEJENDNCLAorMHgzMDZDMDExQSwgMHg2MjAzQTAwMSwgMHg0RjE2NjI2MywgMHgwMDBCNEYyNiwKKzB4MkZFNjYwMjMsIDB4NEYxMjRGMjIsIDB4NkU0MzRGMDIsIDB4NjE0QzU0RjQsCisweDJGMTY0MTE4LCAweDY2NkM2NzdDLCAweDY0RUM2NTVDLCAweDQ2MTg0NzE4LAorMHhCRkQzNDUxOCwgMHg2NTAzNDQxOCwgMHg2MDUzN0YwNCwgMHhDOTgwRTcwMiwKKzB4NkUwMzQ3MTgsIDB4MzdFRDQ3MjgsIDB4NjI1OTQ1MTksIDB4MDEwQTY1MkUsCisweDMxMkMyMjVELCAweDRGMDY2MDFDLCAweDRGMjY0RjE2LCAweDZFRjYwMDBCLAorMHgwMzQwMDI0MCwgMHgwNTQwMDQ0MCwgMHgwNzQwMDY0MCwgMHgwOTQwMDg0MCwKKzB4MTE0MDBCNDAsIDB4MEE0MDEyNDAsIDB4NEYyMjBBNTAsIDB4NjE0Qzg0NTEsCisweDMxMjc2MjBDLCAweEEwMEM4OTAxLCAweDg0NTJFNDAwLCAweDMxMjc2MjBDLAorMHhBMDA2ODkwMSwgMHg4NDUzRTQwMSwgMHgzMTI3NjIwQywgMHhFNDAzOEQwMSwKKzB4NjI2M0U0MDIsIDB4NjA0MzcyMDEsIDB4Njc3QzA3MkMsIDB4NjI1MzJGNzYsCisweDA3MkM3MjAxLCAweDA1NUMwNjZDLCAweDY2NkM2NzdDLCAweEJGQTg2NTVDLAorMHg3RjA0NjQxMywgMHgwMDBCNEYyNiwgMHg2MDVDNjAwQywgMHg4RjA2ODgwMSwKKzB4NjA2QzYyNDMsIDB4OEIwMTg4MDEsIDB4NzIwQUEwMDEsIDB4MDAwQjcyRjYsCisweDAwMDA2MDIzLCAweDAwMTE0MDAwLCAweDAwMTE0MDA4LCAweDAwMjAzMzc0LAorMHhFMDQwRDY5MCwgMHgwNTZFNjE0QywgMHg5Mjc0RDc4RiwgMHgzNTJDMzU3QywKKzB4RTQwMEU3MTgsIDB4NjI2QzY2NTAsIDB4ODkwNDMxMjAsIDB4NjI0Qzc0MDEsCisweDhGRjczMjczLCAweDAwMEI3NTAxLCAweEUyRkY2MDQzLCAweDYyMkM2NDRDLAorMHg4OTBEMzQyMCwgMHg4ODAxNjA1QywgMHg5NjVEOEIwMywgMHhBMDA1MzQ2QywKKzB4NjI0MzYyNDMsIDB4MzI0QzQyMDgsIDB4MzI2Qzk2NTcsIDB4NjAyMzAwMEIsCisweDYwNDMwMDBCLCAweDJGOTYyRjg2LCAweDJGQjYyRkE2LCAweDJGRDYyRkM2LAorMHg0RjIyMkZFNiwgMHg5MjQ5N0ZGNCwgMHg2QjUzMzUyNiwgMHgwMDI5Njk0MywKKzB4RTEzRkNBMDEsIDB4NkUwM0VBRkYsIDB4NkFBQzJGMTAsIDB4NkQ0M0VDMDAsCisweDYyRDBFODA4LCAweDM0QTA2NDJDLCAweEJGQ0U4OTM5LCAweDNCMDA2NUUzLAorMHg2Q0NDOEYwQSwgMHg0MjAwNjJDMywgMHgzNjJDNjY5MywgMHgxRkMxODQ2MSwKKzB4NDEwOTYxMEMsIDB4MkYxMEEwMkQsIDB4ODkxQzJDQzgsIDB4NjVFMzY0RDAsCisweDY0NENCRkJCLCAweDg5MTYzQjAyLCAweDcwRkY2MEMzLCAweDA0OUM0MDAwLAorMHg2NDRDNjVFMywgMHgxRjAyQkZCMSwgMHg4RDFBMzBCMiwgMHg1NkYyMUZDMSwKKzB4MzU2QzY1OTMsIDB4QzkwMzg0NTEsIDB4ODkxMjIwMDgsIDB4NjYwQzg0NTEsCisweEEwMEU0NjA5LCAweDdDMDEyRjYwLCAweDMyODM2MkNDLCAweDhGQzg3RDAyLAorMHhBMDA2MUYyMSwgMHgwNjI1MDAwOSwgMHgxMkMwMDhGQywgMHg2MkNDMDlCNCwKKzB4NTBGMTFGMjEsIDB4OEIxMjg4MDgsIDB4N0NGRjZDQ0MsIDB4NjBDMzRDMDAsCisweDY1RTMwNDlDLCAweDY0NENCRjg5LCAweDhCMDgzQjA2LCAweDg0OTEzOUNDLAorMHgyMDA4QzkwMywgMHg4NDkxODkwMywgMHg0MjA5NjIwQywgMHg2MEYwMkYyMCwKKzB4NEYyNjdGMEMsIDB4NkRGNjZFRjYsIDB4NkJGNjZDRjYsIDB4NjlGNjZBRjYsCisweDY4RjYwMDBCLCAweDJGOTYyRjg2LCAweDJGQjYyRkE2LCAweDJGRDYyRkM2LAorMHg0RjIyMkZFNiwgMHg5MjcyN0ZGQywgMHgzNDI2RTEwMCwgMHg2QjQzNjk1MywKKzB4MkYxMjY2NkMsIDB4Q0EwMTAwMjksIDB4OEQwMzI2NjgsIDB4RTJGMDZFMDMsCisweDJGMjI2MjJDLCAweDZBQUNFQUZGLCAweDZDOTNFRDAwLCAweDY2QzBFODA4LAorMHgzNEEwNjQ2QywgMHhCRjUwODkxMywgMHgzQjAwNjVFMywgMHg2RERDOEIwQSwKKzB4MzlEQzREMDAsIDB4QzkwMzg0OTEsIDB4OEIwODIwMDgsIDB4Q0IwRjYwRjIsCisweDJGMDJBMDA1LCAweDYyREM3RDAxLCAweDhGRTgzMjgzLCAweDYwRjI3QzAyLAorMHg0RjI2N0YwNCwgMHg2REY2NkVGNiwgMHg2QkY2NkNGNiwgMHg2OUY2NkFGNiwKKzB4NjhGNjAwMEIsIDB4MkY5NjJGODYsIDB4MkZCNjJGQTYsIDB4MkZENjJGQzYsCisweDRGMjIyRkU2LCAweDRGMDI0RjEyLCAweDNGM0M5MzMyLCAweDQzMDhFMzVCLAorMHg2MDUzMzNGQywgMHg4MDM0MTM1MSwgMHhFNzYwNjA2MywgMHg4MDM4MTM2MiwKKzB4NDcwOEUwMTIsIDB4RTAzRjgxMzYsIDB4RDExMjM3RkMsIDB4MjcwMDgxMzgsCisweDgwNzg4MDc0LCAweEU5MTY2MDUzLCAweDYwNjM4MDEyLCAweDIxNDE0OTE4LAorMHg2QjkzODAxMywgMHhFREZGNkFCNCwgMHg2QUFDNjFCMCwgMHg2QzFDNEExOCwKKzB4NjhDODJDQUIsIDB4NkRERDY4OEQsIDB4MjM0MjM4RDAsIDB4OEIxMzEzOTgsCisweEQyMDdENDA2LCAweDAwMDk0MjBCLCAweDQzMkJEMzA2LCAweDA5QjQwMDA5LAorMHgwMDAwRkUxMCwgMHgwMDExNDJEOCwgMHgwMDBEREQwMCwgMHgwMDExNjBCMCwKKzB4MDAyMDE4QzAsIDB4MDAxMTVFODgsIDB4MzQyMjkyRTMsIDB4OEYwMkUxMDAsCisweEExNjE2NTkzLCAweDkyREQwMDA5LCAweDM1MkNFN0ZGLCAweEVFMDQ2NzdDLAorMHg2MjJDNjI1MCwgMHg4OTA0MzI3MCwgMHg2MjFDNzEwMSwgMHg4RkY3MzJFMywKKzB4RThGQzc1MDEsIDB4MzQ4ODY4OEMsIDB4OUFDQkUwNjQsIDB4NDAwODY4OTMsCisweDBGNDQzOEFDLCAweDY2MUM2NTgzLCAweDY0NENCRTE4LCAweDY0RTM2RTBDLAorMHg2NUUzNzQwMSwgMHg0NTA4NjY0MywgMHgzNUVDNDYwOCwgMHg0NTA4MzY0QywKKzB4NDUwMDQ2MDgsIDB4MzY5QzQ2MDAsIDB4NjFBMzlBQjUsIDB4RTA2NTY3NjMsCisweDQwMDgzN0FDLCAweDYyNjM3MTE0LCAweDMyMUMwRjc2LCAweDk0QUI3MDA0LAorMHg2MTQzMEYyNiwgMHgzNTlDNjI2MywgMHg3MDA0MzI0QywgMHgwRjI2NzExNCwKKzB4NzAwNDM2MUMsIDB4MEY2NjY3NTMsIDB4NzAwNDM3QUMsIDB4N0ExNDBGNzYsCisweDM3QUM2NzUzLCAweDY2NTM3MDA0LCAweDM2NEMwRjc2LCAweDc0MTQ3MDA0LAorMHgzNTRDMEY2NiwgMHgwRjU2NzAwNCwgMHgzOTVDOTU4RiwgMHhFRDAwNkE5MywKKzB4NkJEM0U5NTYsIDB4RUMwNTQ5MDgsIDB4NDAwOEUwNjUsIDB4NjBCMzAyRkUsCisweDY0NEMwNDJDLCAweDYwRTMyRjQ2LCAweEUwNkEwN0FDLCAweDAxRkU0MDA4LAorMHgwNjFDNjBCMywgMHgwNThDNjBFMywgMHg0MDA4RTA2NSwgMHg2NzdDMDFGQywKKzB4NjU1QzY2NkMsIDB4NjQxQ0JERUQsIDB4N0YwNDY0MDMsIDB4NjBEMzZEREMsCisweEUwNjYwRjQ0LCAweDA0RkU0MDA4LCAweDA1NEM2MEIzLCAweDJGNTY2NTVDLAorMHgwN0FDNjBFMywgMHg0MDA4RTA2QiwgMHg2MEIzMDFGRSwgMHg2MEUzMDYxQywKKzB4RTA2NTA1OEMsIDB4MDFGQzQwMDgsIDB4NjY2QzY3N0MsIDB4QkREMDY1NUMsCisweDY0MDM2NDFDLCAweDY1RjM3RjA0LCAweDYwRDM3NTEwLCAweEUwNjUwNTQ0LAorMHgwN0ZFNDAwOCwgMHgwNTdDNjBDMywgMHgyRjU2NjU1QywgMHgwN0FDNjBFMywKKzB4NDAwOEUwNkEsIDB4NjBDMzAxRkUsIDB4NjBFMzA2MUMsIDB4RTA2NTA1OEMsCisweDAxRkM0MDA4LCAweDY2NkM2NzdDLCAweEJEQjI2NTVDLCAweDY0MDM2NDFDLAorMHg2MUYzN0YwNCwgMHg2MEQzNzEyMCwgMHhFMDY2MDE0NCwgMHgwMkZFNDAwOCwKKzB4MDUyQzYwQzMsIDB4MkY1NjY1NUMsIDB4MDdBQzYwRTMsIDB4NDAwOEUwNkIsCisweDYwQzMwMUZFLCAweDYwRTMwNjFDLCAweEUwNjUwNThDLCAweDAxRkM0MDA4LAorMHg2NjZDNjc3QywgMHhCRDk0NjU1QywgMHg2NTAzNjQxQywgMHg2NEYzN0YwNCwKKzB4NjBEMzM0OUMsIDB4RTA2NzA0NTQsIDB4MDdGRTQwMDgsIDB4MDU3QzYwQjMsCisweDJGNTY2NTVDLCAweDA3QUM2MEUzLCAweDQwMDhFMDZDLCAweEEwMDUwMUZFLAorMHgwQkI4NjBCMywgMHgwM0MyMDEzRSwgMHgwMTNGMDQ2MiwgMHg2MEUzMDYxQywKKzB4RTA2NTA1OEMsIDB4MDFGQzQwMDgsIDB4NjY2QzY3N0MsIDB4QkQ3MDY1NUMsCisweDYyMDM2NDFDLCAweEUxQjg3RjA0LCAweDY0RjM2MTFDLCAweDYwRDMzNDFDLAorMHhFMDY4MDQyNCwgMHgwNUZFNDAwOCwgMHgwNzVDNjBCMywgMHgyRjc2Njc3QywKKzB4MDdBQzYwRTMsIDB4NDAwOEUwNkQsIDB4NjBCMzAxRkUsIDB4NjBFMzA2MUMsCisweEUwNjUwNThDLCAweDAyRkM0MDA4LCAweDY2NkM2NzdDLCAweEJENTA2NTVDLAorMHg2NzAzNjQyQywgMHhFMkMwN0YwNCwgMHg2NkYzNjIyQywgMHg2MEQzMzYyQywKKzB4RTA2NzA2NzQsIDB4MDdGRTQwMDgsIDB4MDI3QzYwQzMsIDB4MkYyNjYyMkMsCisweDA3QUM2MEUzLCAweDQwMDhFMDZDLCAweDYwQzMwMkZFLCAweDYwRTMwNjJDLAorMHhFMDY1MDU4QywgMHgwMkZDNDAwOCwgMHg2NjZDNjc3QywgMHhCRDMwNjU1QywKKzB4NjIwMzY0MkMsIDB4RTdDODdGMDQsIDB4NjZGMzY3N0MsIDB4NjBEMzM2N0MsCisweEUwNjgwNjI0LCAweDA2RkU0MDA4LCAweDAyNkM2MEMzLCAweDJGMjY2MjJDLAorMHgwN0FDNjBFMywgMHg0MDA4RTA2RCwgMHg2MEMzMDJGRSwgMHg2MEUzMDYyQywKKzB4RTA2NTA1OEMsIDB4MDJGQzQwMDgsIDB4NjY2QzY3N0MsIDB4QkQxMDY1NUMsCisweDYxMDM2NDJDLCAweDY2OTM3RjA0LCAweDYyRjM3NjA4LCAweDYwRDMzMjZDLAorMHgwMjE0N0QwMSwgMHhFNjA1NjJEQywgMHg3QzAxMzI2MywgMHg3QjAxOEQwMiwKKzB4MDAwOUFFRkEsIDB4MDAwOUExN0IsIDB4RTdGRjlCRDUsIDB4Njc3QzM1QkMsCisweDYyNTBFRTA4LCAweDMyNzA2MjJDLCAweDcxMDE4OTA0LCAweDMyRTM2MjFDLAorMHg3NTAxOEZGNywgMHhEREQ4OUNDOCwgMHgzRDQ1MzRDOCwgMHg0MDA4RTA2NCwKKzB4NEUwOTBFMEEsIDB4MEZFNDY1OTMsIDB4NzAyNDM1QkMsIDB4NjRFQzY2MUMsCisweDBGNTZCQ0I0LCAweDY0RTM2RTBDLCAweDY1RTM3NDAxLCAweDQ1MDg2MjQzLAorMHgzNUVDNDIwOCwgMHg0NTA4MzI0QywgMHg0NTAwNDIwOCwgMHgzMjlDNDIwMCwKKzB4NjFCMzdCMEMsIDB4MzhCQzY4MjMsIDB4NzExNEUwNkUsIDB4NDAwODZCMjMsCisweDkxQTIzQjFDLCAweDcwMDQwRjg2LCAweDY4MjM2NDEzLCAweDBGQjYzNTlDLAorMHg3MDA0MzgxQywgMHgwRjg2NzQxNCwgMHg3MDA0MzQyQywgMHg2NzUzOTg5NiwKKzB4MEY0NjYyNTMsIDB4NzAwNDM3OEMsIDB4NkI1Mzc4MTQsIDB4NzExNDMyMUMsCisweDNCOEMwRjc2LCAweDM1MUM3MDA0LCAweDBGQjY5Nzg5LCAweDM5N0M3MDA0LAorMHg3MDA0MEYyNiwgMHhFRDAwNjg5MywgMHgwRjU2RUMwNSwgMHg2QUQzRTk1NiwKKzB4RTA2RTQ5MDgsIDB4MDJGRTQwMDgsIDB4MDEyQzYwQTMsIDB4MkYxNjYxMUMsCisweDA3OEM2MEUzLCAweDQwMDhFMDczLCAweDYwQTMwNEZFLCAweEUwNkUwNjRDLAorMHgwQkZFNDAwOCwgMHgwNUJDNjBFMywgMHg0MDA4RTA2NSwgMHg2NzdDMDFGQywKKzB4NjU1QzY2NkMsIDB4NjQxQ0JDODUsIDB4N0YwNDY0MDMsIDB4NjBEMzZEREMsCisweEUwNkYwRjQ0LCAweDA0RkU0MDA4LCAweDA1NEM2MEEzLCAweDJGNTY2NTVDLAorMHgwNzhDNjBFMywgMHg0MDA4RTA3NCwgMHg2MEEzMEJGRSwgMHhFMDZFMDZCQywKKzB4MEJGRTQwMDgsIDB4MDVCQzYwRTMsIDB4NDAwOEUwNjUsIDB4Njc3QzAxRkMsCisweDY1NUM2NjZDLCAweDY0MUNCQzY1LCAweDdGMDQ2NDAzLCAweDc1MTA2NUYzLAorMHgwNTQ0NjBEMywgMHg0MDA4RTA2RSwgMHg2MEMzMDdGRSwgMHg2NTVDMDU3QywKKzB4NjBFMzJGNTYsIDB4RTA3MzA3OEMsIDB4MEJGRTQwMDgsIDB4MDZCQzYwQzMsCisweDQwMDhFMDZFLCAweDYwRTMwMUZFLCAweEUwNjUwNTFDLCAweDBCRkM0MDA4LAorMHg2NjZDNjc3QywgMHhCQzQ0NjU1QywgMHg2MTAzNjRCQywgMHg2QkYzN0YwNCwKKzB4NjBEMzdCMjAsIDB4RTA2RjBCMTQsIDB4MDFGRTQwMDgsIDB4MDQxQzYwQzMsCisweDJGNDY2NDRDLCAweDA3OEM2MEUzLCAweDQwMDhFMDc0LCAweDYwQzMwMUZFLAorMHhFMDZFMDYxQywgMHgwQkZFNDAwOCwgMHgwNUJDNjBFMywgMHg0MDA4RTA2NSwKKzB4QTAwNTAxRkMsIDB4MDEzNjY3N0MsIDB4MDI4MjEyQzAsIDB4MDEzNzAxNDIsCisweDY1NUM2NjZDLCAweDY0MUNCQzFELCAweDdGMDQ2MjAzLCAweDM0OUM2NEYzLAorMHgwNDI0NjBEMywgMHg0MDA4RTA3MCwgMHg2MEEzMDRGRSwgMHg2NTVDMDU0QywKKzB4NjBFMzJGNTYsIDB4RTA3NTA3OEMsIDB4MEJGRTQwMDgsIDB4MDZCQzYwQTMsCisweDQwMDhFMDZFLCAweDYwRTMwMUZFLCAweEUwNjUwNTFDLCAweDBCRkM0MDA4LAorMHg2NjZDNjc3QywgMHhCQkZDNjU1QywgMHg2MTAzNjRCQywgMHhFQkI4N0YwNCwKKzB4NjVGMzZCQkMsIDB4NjBEMzM1QkMsIDB4RTA3MTA1MTQsIDB4MDdGRTQwMDgsCisweDA0N0M2MEEzLCAweDJGNDY2NDRDLCAweDA3OEM2MEUzLCAweDQwMDhFMDc2LAorMHg2MEEzMEJGRSwgMHhFMDZFMDZCQywgMHgwMUZFNDAwOCwgMHgwNTFDNjBFMywKKzB4NDAwOEUwNjUsIDB4Njc3QzBCRkMsIDB4NjU1QzY2NkMsIDB4NjRCQ0JCRDksCisweDdGMDQ2MTAzLCAweDYyMkNFMkMwLCAweDNCMkM2QkYzLCAweDBCMTQ2MEQzLAorMHg0MDA4RTA3MCwgMHg2MEMzMDJGRSwgMHg2NzdDMDcyQywgMHg2MEUzMkY3NiwKKzB4RTA3NTA3OEMsIDB4MDJGRTQwMDgsIDB4MDYyQzYwQzMsIDB4NDAwOEUwNkUsCisweDYwRTMwMkZFLCAweEUwNjUwNTJDLCAweDAyRkM0MDA4LCAweDY2NkM2NzdDLAorMHhCQkI2NjU1QywgMHg2NzAzNjQyQywgMHhFQkM4N0YwNCwgMHg2NkYzNkJCQywKKzB4NjBEMzM2QkMsIDB4RTA3MTA2NzQsIDB4MDZGRTQwMDgsIDB4MDI2QzYwQzMsCisweDJGMjY2MjJDLCAweDA3OEM2MEUzLCAweDQwMDhFMDc2LCAweDYwQzMwMkZFLAorMHhFMDZFMDYyQywgMHgwMkZFNDAwOCwgMHgwNTJDNjBFMywgMHg0MDA4RTA2NSwKKzB4Njc3QzAyRkMsIDB4NjU1QzY2NkMsIDB4NjQyQ0JCOTMsIDB4N0YwNDYxMDMsCisweDcyMDg2MjkzLCAweDM2MkM2NkYzLCAweDdEMDE2MEQzLCAweDYyREMwNjE0LAorMHgzMjYzRTYwNSwgMHg4RDAyN0MwMSwgMHhBRUUyN0EwMSwgMHg2RUYzMDAwOSwKKzB4RTJCMDY4RjMsIDB4NkFGM0UwNUEsIDB4Mzg5QzdFMTgsIDB4NjlGMzYyMkMsCisweDdBMDg0MDA4LCAweDY3RjM2REYzLCAweDM5MkM2MUYzLCAweDZDQTMwRkU2LAorMHg3NzIwN0QxMCwgMHhFNDAwNzEyOCwgMHhFQjA1NjVGMywgMHg2MDRDNjY1NCwKKzB4NjZENDYyNkMsIDB4MkU2MDQyMjEsIDB4MDQ4QzY2NzQsIDB4NjI2QzJDMjAsCisweDA5NDQ0MjIxLCAweDIxMjA3MDAxLCAweDMyQjM2MjBDLCAweDcxMDE2NDAzLAorMHg4RkVCN0UwMSwgMHhFMDVBN0MwMSwgMHg2RUYzNDAwOCwgMHg3RTMwMEJGRSwKKzB4RUMxOUVEMDAsIDB4NjZCMzY1QTMsIDB4QkI3RTY0REMsIDB4NjJEQzdEMDEsCisweDJFMDAzMkMzLCAweDdFMDE4RkY2LCAweDY2NkNFNkIwLCAweDZCRjM2RUYzLAorMHg3QjI4M0U2QywgMHhFQzRDQTAxMCwgMHhDQ0NDQ0NDRCwgMHg2NEQzNkREQywKKzB4NjQ0Qzc0RjQsIDB4QkI2ODY1QjMsIDB4NjdGMzY2RTMsIDB4NzczMDY1MDMsCisweDA3NTQ2MEQzLCAweDYyREM3RDAxLCAweDhCRUYzMkMzLCAweDdCMzA2QkYzLAorMHg2MUIzNjdCMywgMHhFRDgwNjRCMywgMHg3MTAyNzcwMSwgMHg2RERDNzQwMywKKzB4REMzN0U1MDAsIDB4NjA1Q0RFMzcsIDB4MDkxQzA4NEMsIDB4MEE3QzY2OEMsCisweDY5OUM0NjI4LCAweDQ5Mjg0NjE4LCAweDA1QkM2QUFDLCAweDRBMTgyNjlCLAorMHg3MDA0NjgwMywgMHg2NTVDMjZBQiwgMHg2MjBDMzhDQywgMHgzOEVDMjY1QiwKKzB4Mjg2MjMyRDMsIDB4NjUwMzhGRTcsIDB4NjQ0Q0U0QjgsIDB4M0M0QzZDRjMsCisweDZFRjM3NDA4LCAweEUyQjBFNjU4LCAweDNFNEM2QUYzLCAweDc0MDg2QkYzLAorMHg0NjA4NjFGMywgMHg2MjJDNjhGMywgMHg3QTA4NjlGMywgMHgzMTRDN0IxOCwKKzB4Mzg2QzY0RjMsIDB4NkRBMzM5MkMsIDB4NzQyODY3QjMsIDB4NjZDNEU1MDAsCisweDYyNkM2MDVDLCAweDQyMjE2NkU0LCAweDY2MTQyNzYwLCAweDJEMjAwNThDLAorMHg0MjIxNjI2QywgMHg3MDAxMDk1NCwgMHg2MjBDMjQyMCwgMHgzMjYzRTYwNSwKKzB4NzQwMTY1MDMsIDB4OEZFQTc3MDEsIDB4RTA1RTdEMDEsIDB4MDJGRDQwMDgsCisweDZEMkRFOUQwLCAweDY5OUM3RDA3LCAweEVFMDBBMDBCLCAweDY2QjM2NUEzLAorMHg2NEVDQkFGQiwgMHg2MjAzNjdGMywgMHg2MEVDMzc5QywgMHg3MDAxMDcyNCwKKzB4NjJFQzZFMDMsIDB4OEJGMTMyRDMsIDB4NDAwOEUwNUYsIDB4RUFCMDA4RkQsCisweDZERjM2QUFDLCAweDZCRjM2QzhELCAweDdDMEQzREFDLCAweDdCMjhBMDEyLAorMHgwMDAwQTI4MCwgMHgwMDFCQzAwMCwgMHg2NEUzNkVFQywgMHg2NDRDNzRGNCwKKzB4QkFEQTY1QjMsIDB4NjJGMzY2RDMsIDB4MzI5QzYxMDMsIDB4N0UwMTYwRTMsCisweDYyRUMwMjE0LCAweDhCRUYzMkMzLCAweDNEOUM2REYzLCAweDY3RDM2RUQzLAorMHhFQzgwNjFEMywgMHg3NzAyN0UwMSwgMHg2Q0NDNzEwMywgMHhEQkI5RTQwMCwKKzB4NjA0Q0RBQjksIDB4MDY3QzA0MUMsIDB4MDhFQzY1NEMsIDB4NjY2QzQ1MjgsCisweDQ2Mjg0NTE4LCAweDA5REM2ODhDLCAweDQ4MTgyNTZCLCAweDcwMDQ2NjAzLAorMHg2OTlDMjU4QiwgMHg2MjBDMzZCQywgMHgzNkFDMjU5QiwgMHgyNjUyMzJDMywKKzB4NjQwMzhGRTcsIDB4NDAwOEUwNjQsIDB4NzBFMDA3RkMsIDB4NzA2QzBDRkMsCisweDBGODY2OENDLCAweDBERkM3MDk4LCAweDZBREM3MDZDLCAweDcwOEMwRkE2LAorMHg5QkJGMEVGRSwgMHhFMjU0M0VCMiwgMHg2OTdDRTEwMCwgMHg0MjA4OEYwMiwKKzB4MDAwOUExNjMsIDB4NDAwOEUwNjMsIDB4NkVGMzA1RkUsIDB4M0UyQzk2QjMsCisweDY0RTMzNTZDLCAweEVERkZFNzAzLCAweDMyRDA2MjUwLCAweDYyMkM4RDA3LAorMHg2ODFDNzEwMSwgMHgyNDIwMzg3MywgMHg4RkY1NzUwNSwgMHhFMDY0NzQwMSwKKzB4MEFGQzQwMDgsIDB4NjRBQzY1RTMsIDB4NjYxQ0JBMTgsIDB4RTA2MzY3MEMsCisweDYyNzM0MDA4LCAweDQyMDgwQkZFLCAweDc3MDEzMjdDLCAweDNBMkM2QUIzLAorMHg0ODA4Njg3MywgMHg5NDhGNkVBMywgMHgzRTRDMzg3QywgMHgzQjhDNzRGRiwKKzB4MzgyODNBNEMsIDB4RUMwMDNCNEMsIDB4NjA4M0REODgsIDB4NjU1QzA1RUMsCisweEUwNjUyRjU2LCAweDY3QjA0MDA4LCAweDY1QTA2NkU0LCAweDY3N0MwMUZDLAorMHg2NTVDNjY2QywgMHg2NDFDQkExRCwgMHg3QzAxN0YwNCwgMHhFNDA0NjJDQywKKzB4MkQwMDMyNDMsIDB4N0QwMThGRTksIDB4RTA2M0U1NTQsIDB4NjdGMzQ1MDgsCisweDM3NUM0MDA4LCAweDk2NjgwNUZFLCAweDM1NkNFREZGLCAweDZEREM2NDczLAorMHhFRTA0RTEwMCwgMHg2NjZDNjY1MCwgMHg4OTA2MzZEMCwgMHg2MjFDNzEwMSwKKzB4MjQ2MDMyRTMsIDB4OEZGNTc1MDUsIDB4RTA2NDc0MDEsIDB4MDJGQzQwMDgsCisweDY0MkM2NTczLCAweDY2MUNCOUNBLCAweDZFMjM2MjBDLCAweEUwNjM0RTA4LAorMHg3MjAxM0UyQywgMHgwQkZFNDAwOCwgMHg0NzA4NjcyMywgMHg2QUIzMzcyQywKKzB4Njg3MzNBRUMsIDB4NkVBMzM4RTgsIDB4M0UxQzkxNDAsIDB4M0I3QzcxRkYsCisweDNCMUMzQTFDLCAweDBGOTY3MDRDLCAweEVDMDBFOTA0LCAweDYwODNERDYwLAorMHg2NDRDMDRFQywgMHhFMDY1MkY0NiwgMHg2N0IwNDAwOCwgMHg2NUEwNjZFNCwKKzB4Njc3QzAxRkMsIDB4NjU1QzY2NkMsIDB4NjQxQ0I5Q0IsIDB4N0MwMTdGMDQsCisweDMyOTM2MkNDLCAweDhGRUEyRDAwLCAweEUwNzY3RDAxLCAweDA5RkU0MDA4LAorMHg3MEI0RTQ1NCwgMHg2N0YzNDQwOCwgMHgzNzRDMDVGRSwgMHhFREZGOTYxNywKKzB4MzU2QzY0NzMsIDB4RTEwMDZEREMsIDB4NjY1MEVFMDQsIDB4MzZEMDY2NkMsCisweDcxMDE4OTA2LCAweDMyRTM2MjFDLCAweDc1MDkyNDYwLCAweDc0MDE4RkY1LAorMHhFMDY0QTAwNiwgMHgwNUJBMEJCOCwgMHgwNUM5MDVCQiwgMHgwNUREMDVDQSwKKzB4NjU3MzQwMDgsIDB4NjYxQzA3RkMsIDB4NjQ3Q0I5NzAsIDB4NjYyMzYyMEMsCisweDQ2MDhFMDYzLCAweDQ2MDA0MDA4LCAweDM2MkMwQkZFLCAweDY4MjM3MjAxLAorMHgzQTZDNkFCMywgMHg0ODAwNDgwOCwgMHg5MTY3NkVBMywgMHgzRTFDMzgyQywKKzB4M0I4QzcxRkYsIDB4Mzg2ODNBMUMsIDB4RUMwMDNCMUMsIDB4NjA4M0REMzUsCisweDY0NEMwNEVDLCAweEUwNjUyRjQ2LCAweDY3QjA0MDA4LCAweDY1QTA2NkU0LAorMHg2NzdDMDFGQywgMHg2NTVDNjY2QywgMHg2NDFDQjk3MywgMHg3QzAxN0YwNCwKKzB4RTUwODYyQ0MsIDB4MkQwMDMyNTMsIDB4N0QwMThGRTksIDB4NDAwOEUwNjMsCisweDA1RkVFNjU0LCAweDY0RjM0NjA4LCAweEVDRkY5NzQxLCAweDM1N0MzNDZDLAorMHhFRTAwNkNDQywgMHg2MjUwRUQwNCwgMHgzMkMwNjIyQywgMHg3RTAxODkwNiwKKzB4MzhEMzY4RUMsIDB4NzUwOTI0MjAsIDB4NzQwMThGRjUsIDB4NDAwOEUwNzcsCisweDcwMDQwNUZFLCAweDY0OTMwNkZFLCAweEVBNTRCOUE3LCAweDY1RjM0QTA4LAorMHg2NDBDMzVBQywgMHg2NkVDQjkxQSwgMHg2NjEzNjEwQywgMHg0NjA4RTA2MywKKzB4NDYwMDQwMDgsIDB4MzYxQzBCRkUsIDB4NjgxMzcxMDEsIDB4M0E2QzZBQjMsCisweDQ4MDA0ODA4LCAweDkyMTM2RUEzLCAweDNFMkMzODFDLCAweDNCOEM3MkZGLAorMHgzODY4M0EyQywgMHhFQzAwM0IyQywgMHhFMDc3REQwQiwgMHgwNUZFNDAwOCwKKzB4MDZGRTcwMDQsIDB4NjQ5M0I5ODEsIDB4MDAwOUEwMTAsIDB4MDYwMTA1REUsCisweDAwMDAwNjAyLCAweDAwMDBCMjgwLCAweDAwMUJDMDAwLCAweDAwMTE0MkU0LAorMHgwMDExNDJFOCwgMHgwMDExNDJFRCwgMHgwMDExNDJGNSwgMHg2MDgzNjQwMywKKzB4Njc3QzA3RUMsIDB4NjdCMDJGNzYsIDB4NjVBMDY2RTQsIDB4NjY2QzY3N0MsCisweEI5MDY2NTVDLCAweDdGMDQ2NDRDLCAweDYxQ0M3QzAxLCAweDMxMjNFMjA4LAorMHg4RkQyMkQwMCwgMHhBMEZDN0QwMSwgMHhFMDYzMDAwOSwgMHgwNUZFNDAwOCwKKzB4OTZEMDY3RjMsIDB4MzU2QzM3MkMsIDB4RUVGRjY0NzMsIDB4MzJFMDYyNTAsCisweDYyMkM4RDA4LCAweDY4MUM3MTAxLCAweDM4NjNFNjA4LCAweDc1MDUyNDIwLAorMHg3NDAxOEZGNCwgMHg0MDA4RTA2NCwgMHg2NTczMDJGQywgMHhCOEI1NjQyQywKKzB4NjUwQzY2MUMsIDB4NDAwOEUwNjMsIDB4MEJGRTYyNTMsIDB4MzI1QzQyMDgsCisweDZBQjM3NTAxLCAweDY4NTMzQTJDLCAweDZFQTM0ODA4LCAweDM4NUM5NEFDLAorMHg3NEZGM0U0QywgMHgzQTRDM0I4QywgMHgzQjRDMzgyOCwgMHhERDk2RUMwMCwKKzB4MDZFQzYwODMsIDB4MkY2NjY2NkMsIDB4NDAwOEUwNjUsIDB4NjZFNDY3QjAsCisweDAxRkM2NUEwLCAweDY2NkM2NzdDLCAweEI4QkE2NTVDLCAweDdGMDQ2NDFDLAorMHg2MkNDN0MwMSwgMHgzMjQzRTQwNCwgMHg4RkU5MkQwMCwgMHhFNTU0N0QwMSwKKzB4NDUwOEUwNjMsIDB4NDAwODY3RjMsIDB4MDVGRTM3NUMsIDB4RUVGRjk2ODUsCisweDY0NzMzNTZDLCAweEUxMDA2RUVDLCAweDY2NkM2NjUwLCAweDg5MDczNkUwLAorMHg2MjFDNzEwMSwgMHgzMjgzRTgwOCwgMHg3NTA5MjQ2MCwgMHg3NDAxOEZGNCwKKzB4NDAwOEUwNjQsIDB4NjU3MzBBRkMsIDB4Qjg2NzY0QUMsIDB4NjIwQzY2MUMsCisweEUwNjM2NjIzLCAweDQwMDg0NjA4LCAweDBCRkU0NjAwLCAweDcyMDEzNjJDLAorMHg2QUIzNjgyMywgMHg0ODA4M0E2QywgMHg2RUEzNDgwMCwgMHgzODJDOTE1RSwKKzB4NzFGRjNFMUMsIDB4M0ExQzNCOEMsIDB4M0IxQzM4NjgsIDB4REQ2RkVDMDAsCisweDA0RUM2MDgzLCAweDJGNDY2NDRDLCAweDQwMDhFMDY1LCAweDY2RTQ2N0IwLAorMHgwMUZDNjVBMCwgMHg2NjZDNjc3QywgMHhCODZBNjU1QywgMHg3RjA0NjQxQywKKzB4NjJDQzdDMDEsIDB4MzI1M0U1MDgsIDB4OEZFOTJEMDAsIDB4RTA2MzdEMDEsCisweEU2NTQ0MDA4LCAweDQ2MDgwNUZFLCAweDk3Mzg2NEYzLCAweDM0NkNFQ0ZGLAorMHg2Q0NDMzU3QywgMHhFRDA4RUUwMCwgMHg2NjZDNjY1MCwgMHg4OTA2MzZDMCwKKzB4NjJFQzdFMDEsIDB4MjQ2MDMyRDMsIDB4OEZGNTc1MDksIDB4RTA3Nzc0MDEsCisweDA1RkU0MDA4LCAweDA2RkU3MDA0LCAweEI4OUU2NDkzLCAweDQ4MDhFODU0LAorMHgzNThDNjVGMywgMHhCODExNjQwQywgMHg2MTBDNjZFQywgMHhFMDYzNjYxMywKKzB4NDAwODQ2MDgsIDB4MEJGRTQ2MDAsIDB4NzEwMTM2MUMsIDB4NkFCMzY4MTMsCisweDQ4MDgzQTZDLCAweDZFQTM0ODAwLCAweDM4MUM5MjBBLCAweDcyRkYzRTJDLAorMHhBMDA2M0I4QywgMHgwNTAyM0EyQywgMHgwNTJBMDUwMywgMHgwNTcyMDUyQiwKKzB4Mzg2ODA1NzMsIDB4RUMwMDNCMkMsIDB4RTA3N0RENDEsIDB4MDVGRTQwMDgsCisweDA2RkU3MDA0LCAweDY0OTNCODcxLCAweDYwODM2NDAzLCAweDY3N0MwN0VDLAorMHg2N0IwMkY3NiwgMHg2NUEwNjZFNCwgMHg2NjZDNjc3QywgMHhCODA4NjU1QywKKzB4N0YwNDY0NEMsIDB4NjFDQzdDMDEsIDB4MzEyM0UyMDgsIDB4OEZFNDJEMDAsCisweEQzMzQ3RDAxLCAweDAwMDk0MzBCLCAweEUwNzk2MjBDLCAweDBGMjQ0MDA4LAorMHg4ODMwNjAyMywgMHhBMjREOEIwMSwgMHg4ODQwMDAwOSwgMHhBMjQ5OEIwMSwKKzB4MjIyODAwMDksIDB4QTI0NThCMDEsIDB4RTVGRjAwMDksIDB4NjU1Q0Q0MkEsCisweEUwM0FFNjAxLCAweDhGMDQzMjUwLCAweEUwNzkwNDY0LCAweDQwMDhFMjEwLAorMHhFMDVCMEYyNCwgMHgwNUZFNDAwOCwgMHgzNTY2OTYzQiwgMHhBMTQ5OEIwMSwKKzB4NjAyMzAwMDksIDB4NjQwQ0NCMDEsIDB4NkUyM0I4NDIsIDB4RTExODY2MEMsCisweDg5MEYzNjEzLCAweDQwMDhFMDYzLCAweDA0RkU0NjA4LCAweDk3Mjk0NjA4LAorMHg0NjAwNzBFMCwgMHgwNUZFMzQ3QywgMHgzNDZDQjg1QywgMHhFMDYwNjIwMywKKzB4MEYyNDQwMDgsIDB4Q0IwMjYwRTMsIDB4NjQwQ0I4MkEsIDB4RTExODY2MEMsCisweDg5MEYzNjEzLCAweDQwMDhFMDYzLCAweDA0RkU0NjA4LCAweDkxMTE0NjA4LAorMHg0NjAwNzBFMCwgMHgwNUZFMzQxQywgMHgzNDZDQjg0NCwgMHhFMDYxNjIwMywKKzB4MEYyNDQwMDgsIDB4Q0IwNTYwRTMsIDB4NjQwQ0I4MTIsIDB4QTAwRDY2MEMsCisweDA5QjRFMDdBLCAweDAwMDAwNjRELCAweDAwMTE0MkZELCAweDAwMTE0MzAxLAorMHgwMDExNDMwOSwgMHgwMDExNDQwMCwgMHgwMDExNDJEOCwgMHg0MDA4RTExOCwKKzB4OEYwNDM2MTMsIDB4RTA2MTBGNjQsIDB4QTAxMDQwMDgsIDB4RTA3QTBERkMsCisweDA2RkM0MDA4LCAweDYyNkM3MEE0LCAweDA0RkU0MjA4LCAweDk3QjQ0MjA4LAorMHg0MjAwNzBFMCwgMHgwNUZFMzQ3QywgMHgzNDJDQjgxNCwgMHhFMDc5NkQwMywKKzB4MDBGQzQwMDgsIDB4Q0IwN0RCOEUsIDB4NDMwQkQzOEUsIDB4NjEwQzY0MEMsCisweDQwMDhFMDdBLCAweDcwOUMwRjE0LCAweEU2MTgwMkZDLCAweDhEMUMzMTYzLAorMHhFMDVENjgyQywgMHgwMUZDNDAwOCwgMHgwOUZDNzBGQywgMHgwNEZFNzBGQywKKzB4RDM4NTY2MUMsIDB4NjU5QzQzMEIsIDB4RTA3QTY1MDMsIDB4MDFGQzQwMDgsCisweDYxMUM3MEE0LCAweDA0RkU0MTA4LCAweDk3ODY0MTA4LCAweDM0N0M0MTAwLAorMHg0MzBCRDM3RSwgMHhBMDAzMzQxQywgMHhFMDYxNkMwMywgMHgwQ0ZDNDAwOCwKKzB4RTUwMEQ2N0IsIDB4NjQwRDg1NjIsIDB4NDAwOEUwNUIsIDB4MEFGRUEwMzYsCisweDYwNTM2NTVDLCAweDMwNUM0MDAwLCAweDQwMDhENjc2LCAweDYyMkQwMjZELAorMHg4RjJBMzJBMCwgMHhEMzc0NkUwMywgMHg2NEFENDMwQiwgMHgyMjI4NjIwRCwKKzB4RDY3Mjg5MjcsIDB4MDY2QzYwRTMsIDB4NDAwOEUwNjAsIDB4NDYwMDAyRkMsCisweDNFNjc2RTJDLCAweDYyNjM4QjAwLCAweDQwMDhFMDYwLCAweDBGMjQzODY3LAorMHg2MjYzOEQwMywgMHg0MDA4RTA2MSwgMHhFMDYxMDJGQywgMHg0MDA4NjFEQywKKzB4MEYyNDMxNjcsIDB4OEYwMTY4MkMsIDB4NjI2MzYyRDMsIDB4MzQ2NzY0Q0MsCisweDZEMjM4RDAxLCAweEEwMDQ2NkMzLCAweDc1MDE2QzYzLCAweDMyNDM2MjVDLAorMHhFMDYwOEJDNiwgMHgwN0ZDNDAwOCwgMHg2MTdDRTQwMCwgMHhFOTA0RDU1QywKKzB4NjY2QzY2NTAsIDB4OEIwMTM2MTcsIDB4NjY3MzY3N0MsIDB4NjI0Qzc0MDEsCisweDI1NjAzMjkzLCAweDc1MDE4RkY0LCAweEUwM0FENjU2LCAweEU0MDAwNTZDLAorMHg4RDAxMjU1OCwgMHhFMjAyNjI0MywgMHg0MDA4RTA2MSwgMHg2NzgzMEVGQywKKzB4M0UyODM4MjgsIDB4OTExOUU1MDAsIDB4NjA1MzY1NUMsIDB4M0ExMDAyQkMsCisweDYyMkM4RDBCLCAweDNBNjA5NjEzLCAweDMyNzc4OTA3LCAweEUwNjE4QjAyLAorMHgwMkZDNDAwOCwgMHhBMDFENjA1MywgMHgyNTU4MEIyNCwgMHgzMjg3ODkwOCwKKzB4NjI4MzhCMDAsIDB4QTAxNTYwNTMsIDB4MDY0RDBCMjQsIDB4MDk5RTA5NkMsCisweDhGMDgzMjc3LCAweEUwN0I2NjIzLCAweDBGMTY0MDA4LCAweDAyRkM3MDk4LAorMHgwMUZFNzA2OCwgMHg2MjZDNjYyQywgMHgzMjg3NjA1MywgMHgwQjY0OEYwMiwKKzB4NjQ2MzM2RTgsIDB4NjI1Qzc1MDEsIDB4OEJDRDMyOTMsIDB4RTAxNEQ2MzUsCisweEU0MDAwNjQ0LCAweEQ1MzQ2MURDLCAweDYyNTBFNzA4LCAweDMyMTc2MjJDLAorMHg2RERDOEIwMSwgMHg3NDAxNjJEMywgMHgzNjczNjY0QywgMHg4RkY0MjUyMCwKKzB4RTQwMDc1MDEsIDB4RDUyRDYxQ0MsIDB4NjIyQzYyNTAsIDB4OEIwMTMyMTcsCisweDYyQzM2Q0NDLCAweDY2NEM3NDAxLCAweDI1MjAzNjczLCAweDc1MDE4RkY0LAorMHgwMDA5QTBFQywgMHg0MDA4RTA3OSwgMHg2NDJDMDJGQywgMHg0MzBCRDMxOSwKKzB4NjYwQzZFNDMsIDB4MzY1M0U1MTgsIDB4RTA2Mzg5MTAsIDB4NDYwODQwMDgsCisweDQ2MDgwNEZFLCAweDcwRTA5NzIyLCAweDM0N0M0NjAwLCAweEQzMTMwNUZFLAorMHgzNDZDNDMwQiwgMHhFMDYyNjIwMywgMHgwRjI0NDAwOCwgMHhDQjA2NjBFMywKKzB4NDMwQkQzMEMsIDB4NjYwQzY0MDMsIDB4MzY1M0U1MTgsIDB4RTA2Mzg5MjgsCisweDQ2MDg0MDA4LCAweDQ2MDgwNEZFLCAweDcwRTA5NzA4LCAweDM0N0M0NjAwLAorMHhEMzA2MDVGRSwgMHgzNDZDNDMwQiwgMHg2QzAzQTAxRCwgMHgwMDAwMDY0RCwKKzB4MDAxMTQyRTgsIDB4MDAxMTQ4RTAsIDB4MDAxMTQ4QkEsIDB4MDAxMTQ5MzQsCisweDAwMTE0MDAwLCAweDAwMTE0MDA4LCAweDAwMTE0Nzc0LCAweDAwMTE0MDExLAorMHgwMDExNDJFNCwgMHgwMDExNDJEOCwgMHgwMDExNDJFRCwgMHgwMDExNDJGNSwKKzB4NDAwOEUwNjIsIDB4NjBFMzBDRkMsIDB4RDM5Q0NCMDgsIDB4NjQwMzQzMEIsCisweEUwN0E2MTBDLCAweDQwMDhFNjE4LCAweDhEMUMzMTYzLCAweEUwNUQwRjE0LAorMHgwN0ZDNDAwOCwgMHgwOUZDNzBGQywgMHgwNEZFNzBGQywgMHhEMzk0NjY3QywKKzB4NjU5QzQzMEIsIDB4RTA3QTY1MDMsIDB4MDFGQzQwMDgsIDB4NjExQzcwQTQsCisweDA0RkU0MTA4LCAweDlENzQ0MTA4LCAweDM0REM0MTAwLCAweDQzMEJEMzhELAorMHhBMDAzMzQxQywgMHhFMDYyNkQwMywgMHgwREZDNDAwOCwgMHhFNTAwRDY4QSwKKzB4NjQwRDg1NjIsIDB4NDAwOEUwNUIsIDB4MDFGRUEwMkMsIDB4NjA1MzY1NUMsCisweDMwNUM0MDAwLCAweDQwMDhENjg1LCAweDYyMkQwMjZELCAweDhGMjAzMjEwLAorMHhEMzgzNkUwMywgMHg2NDFENDMwQiwgMHgyMjI4NjIwRCwgMHhENjgxODkxRCwKKzB4MDY2QzYwRTMsIDB4NDAwOEUwNjIsIDB4NDYwMDAyRkMsIDB4MzE2NzYxMkMsCisweDYyNjM4QjAwLCAweDY0Q0NFMDYyLCAweDM0Njc0MDA4LCAweDhGMDEwRjI0LAorMHg2MjYzNjJDMywgMHgzNTY3NjVEQywgMHg2QzIzOEQwMSwgMHhBMDA0NjZEMywKKzB4NzUwMTZENjMsIDB4MzI0MzYyNUMsIDB4RTA2MjhCRDAsIDB4MDdGQzQwMDgsCisweDYxN0NFNDAwLCAweEU5MDRENTcwLCAweDYyMkM2MjUwLCAweDhCMDEzMjE3LAorMHg2MjczNjc3QywgMHg2NjRDNzQwMSwgMHgyNTIwMzY5MywgMHg3NTAxOEZGNCwKKzB4NjFDQ0U0MDAsIDB4RTcwOEQ1NjksIDB4NjY2QzY2NTAsIDB4OEIwMTM2MTcsCisweDY2QzM2Q0NDLCAweDYyNEM3NDAxLCAweDI1NjAzMjczLCAweDc1MDE4RkY0LAorMHg2MURDRTQwMCwgMHg2NjUwRDU2MiwgMHgzNjE3NjY2QywgMHg2RERDOEIwMSwKKzB4NzQwMTY2RDMsIDB4MzI3MzYyNEMsIDB4OEZGNDI1NjAsIDB4QTAwNTc1MDEsCisweDA2NEQwMDA5LCAweEUyMDBENjVCLCAweDA2MjRFMDNBLCAweEUwM0FENjU5LAorMHgyMjI4MDI2QywgMHhFMDM5ODk0QiwgMHgyMjI4MDI2QywgMHhFMDVCODk0NywKKzB4MEVGRTQwMDgsIDB4M0U2Njk2OTAsIDB4RTA3OTg5NDEsIDB4MDBGQzQwMDgsCisweDhEMDIzRTY2LCAweENCMDI2NDBDLCAweEQzNDQ2NDBDLCAweDAwMDk0MzBCLAorMHhFMDVDNjYwQywgMHgwN0ZDNDAwOCwgMHg0NjA4NzAxQywgMHg2MTdDMDVGRSwKKzB4OTc3QTQ2MDgsIDB4MzU3QzQ2MDAsIDB4NjYxMzM1NkMsIDB4NDMwQkQzNDYsCisweEQ1NDQ2NEUzLCAweDYyMDMyMDA4LCAweDAwMjkxNTBGLCAweDY2MDNDQTAxLAorMHgyNjY4RTAzQiwgMHgwNTY0OEQyMCwgMHhDOEYwNjAyMywgMHhENTNGODkwOSwKKzB4NzZGRjY2NTAsIDB4ODQ1MTI1NjAsIDB4ODA1MTcwRkYsIDB4NzBGRjg0NTIsCisweDYwMjM4MDUyLCAweDg5MEZDODBGLCAweDYyNjBENjM5LCAweDI2MjA3MjAxLAorMHg3MDAxODQ2MSwgMHg4NDYyODA2MSwgMHhBMDA1NzAwMSwgMHhENjMxODA2MiwKKzB4RTAzQkUyMDAsIDB4MTYyRjA2MjQsIDB4NDAwOEUwNUIsIDB4OTY0MzAyRkUsCisweDhCNjUzMjY2LCAweEQ3MkJENDI4LCAweEQ1MkU2MDQwLCAweDQwMjhDOTNGLAorMHg0MDA4NDAwOCwgMHg1MDcyNjIwMywgMHhDODAyRDEyQiwgMHhFNjA0ODkxQSwKKzB4NDYyODQ2MTgsIDB4MjUyMjIyNkIsIDB4RTIwODYwNDAsIDB4NjUwM0M5M0YsCisweDY2MDM0NTA4LCAweDQ1MDA0NTA4LCAweDQ2Mjg0MjE4LCAweDYyNjMyNTJCLAorMHg0MjA4NDIwOCwgMHgyNTJCNDIwMCwgMHg0MjE4RTIwOCwgMHgyNTJCNDIyOCwKKzB4MjE1MkEwNjIsIDB4NDYxOEU2MTQsIDB4MjI2QjQ2MjgsIDB4NjA0MDI1MjIsCisweEM5M0ZFNDI4LCAweDQ1MDg2NTAzLCAweDQ1MDg0MDI4LCAweDQ1MDA0MDA4LAorMHg0MDA4NDQxOCwgMHgyNTRCRTcyOCwgMHg0NzE4NDAwMCwgMHg0NzI4MjUwQiwKKzB4RDQxMjI1N0IsIDB4MjE1MkEwNDQsIDB4MDY0RDA5QjQsIDB4MDAxMTQ4RTAsCisweDAwMTE0OEJBLCAweDAwMTE0OTM0LCAweDAwMTE0MDAwLCAweDAwMTE0MDA4LAorMHgwMDExNDc3NCwgMHgwMDExNDAxMSwgMHgwMDExNDJGRCwgMHgwMDExNDMwMSwKKzB4MDAxMTQzMDksIDB4MDAxMTQyRDgsIDB4MDAxMTRBMjQsIDB4MDAxMTQyRjUsCisweDAwMTE0MkVELCAweDAwMUMzNjk0LCAweDAwMUMzQkI0LCAweDAwMTE0MkU4LAorMHhFMjE0RDQyOSwgMHg0MjE4NjA0MCwgMHg0MDI4QzkzRiwgMHg0MDA4NDAwOCwKKzB4RDYyNjQyMjgsIDB4MjYwMjIwMkIsIDB4RTcyODYwNDAsIDB4NjUwM0M5M0YsCisweDQ1MDg0NTA4LCAweDQ1MDA0MDI4LCAweDQwMDg0NzE4LCAweDQwMDgyNTdCLAorMHg0MDAwRTcyOCwgMHgyNTBCNDcxOCwgMHhEMjFENDcyOCwgMHgyMjUyMjU3QiwKKzB4RDcxQzYyNDAsIDB4MDcyNEUwNDQsIDB4M0YzQzkzMkMsIDB4NEYxNjRGMDYsCisweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZBRjY2QkY2LCAweDAwMEI2OUY2LAorMHgyRkU2NjhGNiwgMHg2MjQzRDExNCwgMHhFNDAyODUxMiwgMHg2RTJENjcwRCwKKzB4RTUwMEEwMEYsIDB4NjA1MzY1NUQsIDB4MzA1QzQwMDAsIDB4NDAwOEQxMEYsCisweDYyMkQwMjFELCAweDhCMDMzMkUwLCAweDA0MUM3MTA4LCAweDY0NENBMDA0LAorMHg2MjVENzUwMSwgMHg4QkVEMzI3MywgMHg0NjE4RTYwMiwgMHg2MDREMjQ2OSwKKzB4NkVGNjAwMEIsIDB4MDAwMDAxRjAsIDB4MDAxMTQyRTgsIDB4MDAxQzM2OTQsCisweDAwMUMzQkI0LCAweDAwMTE0MkQ4LCAweDAwMTE0MDAwLCAweDAwMTE0MDA4LAorMHhENzY2RDU2NSwgMHg2MjcyNTE1MSwgMHgzMjFDRTM0MCwgMHg1MTUyMjcyMiwKKzB4MzM3QzUyNzEsIDB4MTcyMTMyMUMsIDB4NTI3MjUxNTMsIDB4MzIxQzY0NEMsCisweDE3MjJEMTVGLCAweDY2MTI1MjU1LCAweDIxNjIzNjJDLCAweDMxNkM1MTczLAorMHg2MTUyMTcxMywgMHhENjVCNTI3NCwgMHgxNzI0MzIxQywgMHg1Mjc1NTE1NCwKKzB4MTcyNTMyMUMsIDB4NTI3NjUxNTgsIDB4MTcyNjMyMUMsIDB4NTE3NzYyNjIsCisweDE3MTczMTJDLCAweDUxNzg1MjYxLCAweDE3MTgzMTJDLCAweDUxNzk1MjYyLAorMHgxNzE5MzEyQywgMHg1MTdBNTI2MywgMHgxNzFBMzEyQywgMHg1MTdCNTI2NCwKKzB4MTcxQjMxMkMsIDB4NTE3QzUyNjUsIDB4MTcxQzMxMkMsIDB4NTE3RDUyNjYsCisweDE3MUQzMTJDLCAweDUxN0U1MjY3LCAweDE3MUUzMTJDLCAweDUyN0Y1MTY4LAorMHgzMjFDRDY0NSwgMHg2MjYyMTcyRiwgMHg3Njk0NjEzMiwgMHgyMzEyMzEyQywKKzB4NTIzMTYxNjIsIDB4MzIxQ0Q2NDEsIDB4NTE1QzEzMjEsIDB4MzUxQzU1MzIsCisweDYxNjIxMzUyLCAweDQxMjk1MjM1LCAweDEzMjUzMjFDLCAweDU2MzY1NTYxLAorMHgzNjVDNDUyOSwgMHgxMzY2RTUzOCwgMHg1NTMxMjQ1MCwgMHg3MTA0NjE0MywKKzB4NjY3MjIxNTIsIDB4NzUwODY1NDMsIDB4NTY3MTI1NjIsIDB4NzUwQzY1NDMsCisweDU2NzIyNTYyLCAweDc1MTA2NTQzLCAweDU2NzUyNTYyLCAweDc1MTQ2NTQzLAorMHg1NjczMjU2MiwgMHg3NTE4NjU0MywgMHg1Njc2MjU2MiwgMHg3NTFDNjU0MywKKzB4NTYzMjI1NjIsIDB4NzUyMDY1NDMsIDB4NjYzMjI1NjIsIDB4NzUyNDY1NDMsCisweDU2NzQyNTYyLCAweDc1Mjg2NTQzLCAweDU2MzQyNTYyLCAweDc1MkM2NTQzLAorMHg1NTMzMjU2MiwgMHg3MjMwNjI0MywgMHg1NTM1MjI1MiwgMHg3MjM0NjI0MywKKzB4NTYzNjIyNTIsIDB4MjQ2Mjc0MzgsIDB4MTM0MUU0MDAsIDB4MTc0MTI3NDIsCisweDE3NDUxNzQyLCAweDE3NDYxNzQzLCAweDIzNDIxMzQyLCAweDEzNDQxNzQ0LAorMHgxMzQ1MTM0MywgMHgxMzQ2MDAwQiwgMHhENTEwRTEyNCwgMHg1MTU3MjQxMCwKKzB4NTI1ODE0MTEsIDB4NTc1OTE0MjIsIDB4NTE1QTE0NzMsIDB4NTI1QjE0MTQsCisweDU3NUMxNDI1LCAweDUyNUQxNDc2LCAweDE0MjdFNzAwLCAweDE0Njg1NjVFLAorMHgxNDY5NTY1RiwgMHgxNTc4MTU3NywgMHgxNTdBMTU3OSwgMHgxNTdDMTU3QiwKKzB4MTU3RTE1N0QsIDB4MTU3RjAwMEIsIDB4MDAxQzM2OUMsIDB4MDAyMDM1MUMsCisweDAwMjAzNTc4LCAweDAwMUMzQ0EwLCAweDAwMUMzNkY0LCAweDAwMUMzQjg4LAorMHg2RTcyNjE1NywgMHgyMTY3NkU2OSwgMHg2OTY4NTQyMCwgMHg2RjY0MjA3MywKKzB4NjU2QzY3NkUsIDB4NzQ2RjZFMjAsIDB4NjU2NTYyMjAsIDB4NjE2MzIwNkUsCisweDcyNjI2OTZDLCAweDY0NjU3NDYxLCAweDAwMDAwMDBBLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCit9OworCitjb25zdCB1MzJfdCB6Y0Z3QnVmSW1hZ2VTaXplPTgzOTY4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZndzcGl1LmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd3NwaXUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGE3ZmY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZndzcGl1LmMKQEAgLTAsMCArMSw2NTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgIi4uLzgwMjExY29yZS9jcHJlY29tcC5oIgorCitjb25zdCB1MzJfdCB6Y0Z3SW1hZ2VTUElbXT17CisweDAwMDkwMDBCLCAweDRGMjIyRkU2LCAweEIwMTg3RkZDLCAweEU2MDAwMDA5LAorMHg5NDNERDUyMCwgMHhDODQwNjA1MiwgMHgyRjAyOEYwMywgMHg4RkY5MzY0MiwKKzB4RDQxRDc2MDEsIDB4NEUwQkRFMUQsIDB4RDQxRDAwMDksIDB4MDAwOTRFMEIsCisweDRFMEJENDFDLCAweDdGMDQwMDA5LCAweEEwMjE0RjI2LCAweDRGMjI2RUY2LAorMHhFMjA1RDExOSwgMHgyMTIyRTQwMCwgMHg5MjIyMjE0MiwgMHg4QkZENDIxMCwKKzB4NDUwQkQ1MTYsIDB4RDYxNjAwMDksIDB4MDAwOTQ2MEIsIDB4RTVGRkQ3MTUsCisweDI3NTI2NTVELCAweEUxRkZENzE0LCAweEQ0MTQ1MDc5LCAweDE3MDlDQjAxLAorMHgxNzExMjcxMiwgMHgyNDEyRTEwMSwgMHg0RjI2RDQxMSwgMHgyNDEwMDAwQiwKKzB4REUxMUREMTAsIDB4MDAwOTREMEIsIDB4MDAwOTRFMEIsIDB4MDAwOUFGRkEsCisweDAzRTgyNzEwLCAweDAwMUMwMDFDLCAweDAwMTE2NTk0LCAweDAwMTE0RUJFLAorMHgwMDExNjVBNCwgMHgwMDExNjVCQywgMHgwMDFENDAwNCwgMHgwMDExNEZBMCwKKzB4MDAxMTQzNzgsIDB4MDAxQzM1MTAsIDB4MDAxQzM2MjQsIDB4MDAxRTIxMkMsCisweDAwMTE2NEZDLCAweDAwMTE0NzAwLCAweDAwMTE1ODlDLCAweDJGQTYyRjk2LAorMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHg3RkM4NEYyMiwgMHhEMjhEREQ4QywKKzB4NjFEMzYwRDAsIDB4ODBGNDcxMDEsIDB4NDIwQjYwMTAsIDB4MjAwODgwRjgsCisweDZFMDM4RjEwLCAweERCODlENDg4LCAweEQ0ODk2QTQwLCAweDRCMEJEQzg5LAorMHg2N0MwNjVBQywgMHg2OTdDREU4OCwgMHg0MTA4NjE5MywgMHgzMTk4NDEwOCwKKzB4M0UxQzQxMDgsIDB4NjZEMjg0RjgsIDB4MjAwODYwMEMsIDB4MkU2MjhGMTMsCisweEU0MDA4NEY0LCAweERBODE2NzBDLCAweDMyNzM2MjRELCAweEEwRDM4QjAxLAorMHg2NDREMDAwOSwgMHgzNUFDNjU0MywgMHg2OTQzNjY1MiwgMHgzOUVDNkI2MiwKKzB4QUZGMTE5QjEsIDB4ODgwMTc0MDQsIDB4ODRGNDhCMTUsIDB4MkU3MEU3MDAsCisweERBNzY2RTBDLCAweDMyRTM2MjdELCAweEEwQzQ4QjAxLCAweDY3N0QwMDA5LAorMHg2QzczNjZBMywgMHg2NTczNzYwNCwgMHgzNTZDM0NBQywgMHg2RDUyNjRDMiwKKzB4QUZFRjc3MDgsIDB4RTJCMDI0RDIsIDB4MzAyMDYyMkMsIDB4ODRGNDhCMzAsCisweDY1MENFQzAwLCAweERBNjkxRjUzLCAweDU1RjNFOTA0LCAweDMyNTM2MkNELAorMHhBMEE4OEIwMSwgMHg2Q0NEMDAwOSwgMHg2N0MzNkVBMywgMHg2QkMzN0UwNCwKKzB4M0JFQzM3QUMsIDB4NkVCMjZENzIsIDB4REI2MkQ0NjEsIDB4MDAwOTRCMEIsCisweDQxMEJEMTYxLCAweEQ0NjE2NEQzLCAweDAwMDk0QjBCLCAweDQ1MEJENTVFLAorMHhENDVGNjRFMywgMHgwMDA5NEIwQiwgMHg2MUQzRTYwMCwgMHgzMTZDNjY2RCwKKzB4NjQ2RDc2MDEsIDB4MjFFMDM0OTMsIDB4NEUxOThGRjcsIDB4N0MwOEFGRDUsCisweDYyMkNFMkIxLCAweDhCMTEzMDIwLCAweEQ1NTJENDU2LCAweERBNTZEQzRGLAorMHgwMDA5NDUwQiwgMHg0QTBCRTQwMCwgMHhENzU0NjdDMiwgMHg0NzBCREI1MiwKKzB4NEIwQjAwMDksIDB4RTkwMEU0MDMsIDB4MkU5MEEwNkQsIDB4NjIyQ0UyQjIsCisweDg5NjgzMDIwLCAweDYyMkNFMkIzLCAweDhCMUQzMDIwLCAweERBNDVENDRDLAorMHg0QTBCRDk0MiwgMHg2NTk2MDAwOSwgMHg2NzkyRDQ0QSwgMHgxRjc0REQzQiwKKzB4MUY1RDREMEIsIDB4RDYzOUQ0NDgsIDB4NDYwQkRCNDgsIDB4NTVGNDU1RjQsCisweDRCMEJEOTM2LCAweEQ0NDY1NEZELCAweDQ5MEI2NTAzLCAweDVERjUxRjA1LAorMHgxRUQxRUMwNCwgMHgyRUMwQTA0NywgMHg2MjJDRTJCNCwgMHg4QjNFMzAyMCwKKzB4REEzNEQ0NDAsIDB4NEEwQkREMzEsIDB4ODRGNDAwMDksIDB4NjAwQzZDRDIsCisweDFGMDcyRjAyLCAweDFGQzZDOTAzLCAweEU2MDAxRjA4LCAweEQ3M0FFMDMwLAorMHg2Q0YyREIzQSwgMHgxRjc5MEY2NSwgMHhBMDIxMUZCQSwgMHg1MUY2RTkwNCwKKzB4NkQ2MzY2NkQsIDB4NEMxNTM2RUMsIDB4RDIzNTNEMUMsIDB4MUY2QjhGMDUsCisweDg5MDIzQzkzLCAweEEwMDI2NEQzLCAweEU1MDQ1NUY4LCAweDQyMEI2NEQzLAorMHg1QkZCMDAwOSwgMHhENjE5NTRGQSwgMHg0NjBCNjVEMywgMHg1NEY5MUIwMSwKKzB4REExNjU1QjEsIDB4N0NGQzRBMEIsIDB4MDZGREUwMzAsIDB4MEY2NTc2MDQsCisweDYyNkQ1NUY3LCAweDhCREEzMjUzLCAweEEwMDQ4NEY0LCAweEQ0MjUyRTAwLAorMHg0MjBCRDIwRSwgMHg3RjM4NjVEMiwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwKKzB4NkFGNjZCRjYsIDB4NjlGNjAwMEIsIDB4RTYwMDYxNjMsIDB4NDEwOUEwMDQsCisweDc2MDE2MjU2LCAweDc0MDQyNDIyLCAweDhCRjkzNjEyLCAweDAwMDkwMDBCLAorMHgwMDExNzgwMCwgMHgwMDExNUZGMCwgMHgwMDExNjRGNiwgMHgwMDExNEYyQywKKzB4MDAxMTY1QzAsIDB4MDAxMTY0RjUsIDB4MDAxMTYxMUMsIDB4MDAxMTc4MDQsCisweDAwMTE2NUUwLCAweDAwMTE0RUJFLCAweDAwMTE0RjAyLCAweDAwMTE2NUY0LAorMHgwMDExNjVGQywgMHgwMDExNjYwMCwgMHgwMDExNEJGMCwgMHgwMDExNDhGQywKKzB4MDAxMTY2MTgsIDB4MDAxMTY2MzQsIDB4MDAxMTY2NDAsIDB4MDAxMTRFNTYsCisweDAwMTE2NjRDLCAweDAwMTE2NjU4LCAweDAwMTE2NjdDLCAweDAwMTE2NjcwLAorMHgwMDExNEJDNCwgMHgwMDExNjY4OCwgMHgyRjk2MkY4NiwgMHgyRkI2MkZBNiwKKzB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4RTUwMDdGRDgsIDB4NjQ1M0UxMTAsCisweDZDNTM0MTI4LCAweDY1NURFRTBBLCAweDQ2MDg2NjUzLCAweDQ2MDgzNjVDLAorMHgzNjFDNzUwMSwgMHg2NzVENjA0MywgMHg2MEMzMEY2NiwgMHgzN0UzRUQwMCwKKzB4ODE2MTI2QzEsIDB4ODE2MzgxNjIsIDB4MTZEMzE2RDIsIDB4OEZFQTE2RDQsCisweDY4RjI3NDA0LCAweERBQjNEOUIyLCAweDI5ODIxOTgxLCAweEQxQjI1OUYxLAorMHgyQTkyMUE5MSwgMHg1QkYzNUFGMiwgMHg1RUY1NURGNCwgMHgxMUExNTRGNiwKKzB4MTFCMzIxQTIsIDB4MTFENTExQjIsIDB4MTFFNzExRDQsIDB4MTE0OTExRTYsCisweDU1RjcxMTQ4LCAweEVFMDBEQkE5LCAweEREQTk1N0Y4LCAweEQ2QTk1MkY5LAorMHgxQjUxNjRFMywgMHhEQkE4MkI1MiwgMHhFQUI4RDhBOCwgMHgyRDcyRTk0NSwKKzB4NkFBQzI2MjIsIDB4NkVFRDQ5MDgsIDB4NEQwODZERTMsIDB4M0RFQzYxRTMsCisweDREMDg0MTA4LCAweDNEQkMzMUVDLCAweDQxMDg2MEMzLCAweDgxRDEyREMxLAorMHg0MTA4RTA1MCwgMHg0MTA4NDAwOCwgMHg2MEMzODFEMiwgMHhFNTAwMzE4QywKKzB4ODFEMzM0QTIsIDB4MUQxMzFERDIsIDB4OEQwMUQ0OTQsIDB4RDQ5MTFENTQsCisweEIwODE2NUQzLCAweDY0RUQ3RTAxLCAweDhCREMzNDkyLCAweERCOTREMThELAorMHhEMjhCNjgxMiwgMHgxQjgxNDgyOSwgMHgyRkQyNjQxMiwgMHgyQjkyNjk0RCwKKzB4RDk4QTY3MjIsIDB4MUI3MzQ3MjksIDB4RDc4NzY4MjIsIDB4MUJBMjZBOEQsCisweEQyOEM2QjcyLCAweDIyQjJENTg2LCAweEUwMDM1RDcyLCAweDVFNzQxMkQyLAorMHgxMkU0NDAxOCwgMHhENjg4NTE3NiwgMHg1NDc4MTIxNiwgMHgxMjQ4RTFGRiwKKzB4RDQ4NTY3OTIsIDB4Njg1MjEyN0EsIDB4MjhDMUU3MDMsIDB4ODE5MTY5NTIsCisweDZBNTJFMDUwLCAweDgxQTI0MDA4LCAweDYwQzM2QjUyLCAweDZENTI4MUIzLAorMHg2RTUyMUREMiwgMHg2MjUyMUU2MywgMHgxMjY0RTYwMCwgMHg0NjA4NjU2MywKKzB4NzUwMTM2NEMsIDB4NjY1RDI2MTIsIDB4OEJGODM2NzMsIDB4RTAwM0Q0NzEsCisweDQwMTg2NTQyLCAweDY3NDIyNUMxLCAweDgxNzFEMjc0LCAweEVFMDA2ODQyLAorMHg2OTQyMTg4MiwgMHgxOTIzRTAyNCwgMHhFNTgwNkE0MiwgMHg2QjQyMUFFNCwKKzB4ODFCMjY2RTMsIDB4RDQ2RDZDNDIsIDB4NjU1QzgxQzMsIDB4NkQ2MzY2NkQsCisweDYxNkQ3NjA0LCAweDMxNTMzRDRDLCAweDJERTI4RkY4LCAweEQ1NjlEMjY4LAorMHg3NDA0MjQyMiwgMHg3RjI4MjQ1MiwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwKKzB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsIDB4NjY0MjY4RjYsIDB4QzgwMzYwNjEsCisweEU1MDA4RDA0LCAweEM5MDM2MDYxLCAweDhCMDM4ODAyLCAweDY1NjM1MjYyLAorMHgyNDEyNTEyNCwgMHg2MDUzMDAwQiwgMHgyRkU2MkZENiwgMHg3RkVDNEYyMiwKKzB4NjI1MzZFNTMsIDB4NkQ0M0U1NTAsIDB4NDUwOEU0MDAsIDB4RTEwMUEwMDEsCisweDYwNDM1MjI0LCAweDgxMjEyMjExLCAweDYwNTM4MTIzLCAweDU2RTI4MTIyLAorMHg4QkY1MzYyMCwgMHgxNkU0RDI1MCwgMHhFNjE0NjRGMywgMHg2NUUzNDIwQiwKKzB4RTRGQzY1RTEsIDB4MkU1MTI1NDksIDB4NjVGMzYxRjEsIDB4MkYxMTIxNDksCisweEQxNDk1NEQxLCAweEU2MTQ0MTBCLCAweDYwNzE1N0QxLCAweDI3MDFDQjAxLAorMHg3RjE0MURFMSwgMHg2RUY2NEYyNiwgMHg2REY2MDAwQiwgMHgyRkU2MkZENiwKKzB4N0ZFQzRGMjIsIDB4NjY1MzZFNTMsIDB4NkQ0M0U1RkMsIDB4MjA1OTYwNjEsCisweDI2MDFDQjAxLCAweDMyNjA1MkUyLCAweDEyRTQ4QjA2LCAweDMxRTA1MUUyLAorMHg1MkQxOEIwNCwgMHgxRTIyQTAwMiwgMHg1NjY0QUZGMCwgMHg2NEYzRDIzNiwKKzB4NDIwQkU2MTQsIDB4NjdFMTY1RTMsIDB4MjcxOUUxRkMsIDB4NjdGMTJFNzEsCisweDI3MTk1NEQxLCAweDY1RjNEMTMwLCAweDQxMEJFNjE0LCAweDUyRDEyRjcxLAorMHhDQjAxNjAyMSwgMHgxREUxMjIwMSwgMHg0RjI2N0YxNCwgMHgwMDBCNkVGNiwKKzB4MkZFNjZERjYsIDB4NjI0QzRGMjIsIDB4NDIwOERFMUIsIDB4QTAwNTQyMDAsCisweDUyNTIzRTJDLCAweDU2MjRENDE3LCAweDJFNjJCRjhFLCAweDUyRTE2NUUyLAorMHg4QkY2MzUyMCwgMHgyNjIyRDYxQiwgMHgwMDBCNEYyNiwgMHgyRkI2NkVGNiwKKzB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4REIxQ0RDMTAsIDB4NjZDMjUyQzEsCisweDg5NDAzNjIwLCAweEM5MDM2MDYxLCAweDg5M0M4ODAxLCAweEREMThERTBCLAorMHg2NEUzQkY2MywgMHg4NTAzNjUwMywgMHg2MjBENjZCMiwgMHg4OTJCMzI2MiwKKzB4QkY5QkQ0MDMsIDB4RDQxMzAwMDksIDB4MDAwOTREMEIsIDB4MDAwOUFGRTYsCisweDAwMTE2MERDLCAweDAwMTE2MEU0LCAweDAwMTE2MEVDLCAweDAwMTE2MTE0LAorMHgwMDExNjRGOCwgMHgwMDExNjUwMCwgMHgwMDEwMDBDOCwgMHgwMDEwMTY4MCwKKzB4MDAxRTIxMDgsIDB4MDAxQzNEMDAsIDB4MDAxMTc4ODAsIDB4MDAxMTc3ODAsCisweDAwMDQwMDIwLCAweDAwMjZDNDAxLCAweDAwMTE0MkY4LCAweDAwMTE2NERDLAorMHgwMDExNEVCRSwgMHgwMDExNjY5QywgMHg2NEUzQkYzRSwgMHg0RDBCRDQwNiwKKzB4QUZCQjAwMDksIDB4RDIwNTAwMDksIDB4NEYyNjIyNjIsIDB4NkRGNjZFRjYsCisweDAwMEI2Q0Y2LCAweDAwMDA2QkY2LCAweDAwMTE2NkEwLCAweDAwMUMzRDI4LAorMHgyRjk2MkY4NiwgMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwKKzB4RDIzQzdGRkMsIDB4QzgwMzYwMjIsIDB4MkYwMThGM0QsIDB4MDAwOUEwNjEsCisweEM5MDM2MDYxLCAweDg5M0I4ODAxLCAweEQyMzhEODM3LCAweDQyMEJEOTM4LAorMHhFNDAwNjQ4MywgMHg2QTAzNkQwMywgMHg1QzAyNDkwQiwgMHhEMjM2REIzNSwKKzB4NTZEMzg1RDIsIDB4NjUwRDY0MjIsIDB4NEIwQkU3NDAsIDB4RDEzMjZFMDMsCisweDY0MTI2RUVELCAweDIxNDIzNEVDLCAweDNEQzA1REQ0LCAweDg1RDI4QkVGLAorMHg3MEZGNTZEMywgMHhFNzQwNjUwRCwgMHg2QzAzNEIwQiwgMHg0OTBCREIyQSwKKzB4NjZCMkU0MDMsIDB4MzZDQzZDQ0QsIDB4RTcwMEQ5MjgsIDB4MkI2MkU1QzgsCisweDY0NzNFNjUwLCAweDQ5MEJEQzI2LCAweDY0ODM2NTVDLCAweDY1QTM0QzBCLAorMHhFRTAxRDEyNCwgMHhEMTFDMjFFMiwgMHg2NjEyNTIxMSwgMHg4QkJGMzYyMCwKKzB4REQyMkRFMjEsIDB4REMyM0RCMjIsIDB4NjVEMjUyRDEsIDB4ODkxODM1MjAsCisweEM5MDM2MDUxLCAweDg5MTQ4ODAxLCAweEQxMTRENDFDLCAweDAwMDk0MTBCLAorMHgzNkUwNTYwMywgMHg2NTAzOEYwNCwgMHgyQjIwRTIwMSwgMHgyQzUyQUZFQywKKzB4RDIxM0Q0MTksIDB4MDAwOTQyMEIsIDB4RTEwMUQ2MTgsIDB4QUZFMzQxMTgsCisweDYwRjEyNjEyLCAweDg5MDJDODA0LCAweDQyMEJEMjE1LCAweDdGMDQwMDA5LAorMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwgMHgwMDBCNjlGNiwKKzB4MDAwMDY4RjYsIDB4MDAxRTIxMDAsIDB4MDAxMTYwRTQsIDB4MDAxMTQ1M0EsCisweDAwMTE0QkYwLCAweDAwMTE0RTBDLCAweDAwMTE2NzE0LCAweDAwMTE1OUIwLAorMHgwMDExNDU1OCwgMHgwMDFFMjEyQywgMHgwMDExNzg4MCwgMHgwMDExNjBEQywKKzB4MDAxMTY0RkMsIDB4MDAxMTY0RjgsIDB4MDAxMTYxMTQsIDB4MDAxQzNEMzAsCisweDAwMTE0MENDLCAweEQ2QzJENUMxLCAweDI2MjI2MjUyLCAweEM4MDE2MDYwLAorMHgwMDBCOEJGQSwgMHgyRkU2MDAwOSwgMHhCRkYzNEYyMiwgMHhEMkJEMDAwOSwKKzB4RTQwNUUxMDAsIDB4MjI0MDIyMTIsIDB4NjQyMkRFQjgsIDB4RTcwMEQ1QjgsCisweDI1NzIxRTQyLCAweEM5OEY4NDUxLCAweEM5RjBDQjEwLCAweDgwNTFDQjAyLAorMHhDQjAyNjA1MCwgMHg2MjUyMjUwMCwgMHgyRTIyQkZEQywgMHhENkIyNTBFNCwKKzB4NEYyNjI2MDIsIDB4NkVGNjAwMEIsIDB4NEYyMjJGRDYsIDB4MDAwOUJGREIsCisweDYyMENEREFFLCAweDYwRDAyRDIyLCAweDg5MDZDODAxLCAweDAwMDlCRkQzLAorMHgyRDIyNjIwQywgMHhDODAxNjBEMCwgMHg0RjI2OEJGOCwgMHg2REY2MDAwQiwKKzB4NEYyMjJGRTYsIDB4NkU0M0JGRTgsIDB4RTEwMEQyQTIsIDB4MjJFMDIyMTIsCisweDY0MjJENTlFLCAweEU2MDBERTlFLCAweDJFNjIxNTQyLCAweEM5RjA4NEUxLAorMHg4MEUxQ0IwMSwgMHhDQjAyNjBFMCwgMHg2N0UyMkUwMCwgMHg0RjI2MjU3MiwKKzB4NkVGNkFGQTgsIDB4RTQwNkFGRTQsIDB4RTQwNEFGRTIsIDB4QkZGOTRGMjIsCisweEU0QzcwMDA5LCAweDY0NENCRkRDLCAweDRGMjZBRkY2LCAweEU0MDZBRkQ4LAorMHhFNDA0QUZENiwgMHg0RjIyMkZFNiwgMHg2RTQzQkZGOCwgMHhENThERDI4RCwKKzB4RTQwMUUxMDAsIDB4MjIxMjYwRTMsIDB4ODA1MTIyNDAsIDB4NjYyMkQxODcsCisweEU3MDBERTg3LCAweDJFNzIxMTYyLCAweEM5RjA4NEUxLCAweDgwRTFDQjAyLAorMHhDQjAyNjBFMCwgMHg2MkUyMkUwMCwgMHgyMTIyQkY3QywgMHhBRkRGNEYyNiwKKzB4MkZENjZFRjYsIDB4NEYyMjJGRTYsIDB4QkZDQjZENTMsIDB4QkY5QjZFNDMsCisweEQyN0MwMDA5LCAweDIyRTA2MUQzLCAweDYwMjJERTdELCAweDQxMTgyMUU5LAorMHgyMDFCQzlGRiwgMHgyMjAyRDU3NywgMHhENjc2ODQ1MywgMHg2MEQzODA1MSwKKzB4RDQ3MjgwNTMsIDB4RDE3MjY3NjIsIDB4MTQ3MkVEMDAsIDB4ODQxMTIxRDIsCisweENCMDRDOUYwLCAweDYwMTA4MDExLCAweDIxMDBDQjAyLCAweEJGNTE2MjEyLAorMHg0RjI2MjQyMiwgMHhBRkE3NkVGNiwgMHg2NTQzNkRGNiwgMHhBRkQwRTREOCwKKzB4NjU0MzY0NEMsIDB4QUZDQ0U0RDgsIDB4MkZDNjY0NEMsIDB4MkZFNjJGRDYsCisweDZFNTM0RjIyLCAweEJGNjc2RDQzLCAweEQ3NjI2QzYzLCAweDI3RDBEMjY0LAorMHg2MUUzNjA3MiwgMHg0MTE4MjEyOSwgMHgyMDFCQzlGRiwgMHgyNzAyRDQ1RCwKKzB4RDE1Qjg0NDMsIDB4NjBFMzgwNDEsIDB4REU1ODgwNDMsIDB4RTYwMDY0NzIsCisweDIxNjIxRTQyLCAweDY1REM4NDExLCAweDYwQzM2MjAzLCAweDQwMDhDOTA3LAorMHg2NzAzNDAwOCwgMHhFMjlGNjAyMywgMHg2MjJDQzk4RiwgMHgzNTIwMjA3QiwKKzB4ODAxMThEMTgsIDB4N0MwNDg0MTEsIDB4NjBDMzY2MDMsIDB4NjIwM0M5MEYsCisweEM5RjA2MDYzLCAweDgwMTEyMDJCLCAweDg4MEI2MDUzLCAweDg0MTE4QjE0LAorMHhDOTBGNjYwMywgMHhDOTBGNzAwMSwgMHg2MDYzNjIwMywgMHgyMDJCQzlGMCwKKzB4ODAxMUEwMEEsIDB4N0MwMTg0MTEsIDB4NjBDMzY2MDMsIDB4NjIwM0M5MEYsCisweEM5RjA2MDYzLCAweDgwMTEyMDJCLCAweENCMDI2MDEwLCAweDYyMTIyMTAwLAorMHgyRTIyQkVGMCwgMHhENjNDNTBFNCwgMHg0RjI2MjYwMiwgMHg2REY2NkVGNiwKKzB4NkNGNjAwMEIsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4NkM2MzRGMjIsCisweDZFNDM2RDUzLCAweDZCNzNCRjM2LCAweDAwMDlCRjA2LCAweDYxRDNEMjMxLAorMHhERTMzMjJFMCwgMHgyMUU5NjAyMiwgMHhDOUZGNDExOCwgMHhENDJEMjAxQiwKKzB4ODQ0MzIyMDIsIDB4ODA0MUQ3MkYsIDB4ODA0MzYwRDMsIDB4NjYyMkQ0MjcsCisweDE0NjJEMTI3LCAweDE0QzMyN0MyLCAweDIxQzJFQzAwLCAweDdCMDQ4NDExLAorMHg2MEIzNkQwMywgMHg2NTAzQzkwRiwgMHhDOUYwNjBEMywgMHg4MDExMjA1QiwKKzB4Q0IwMjYwMTAsIDB4NjIxMjIxMDAsIDB4NEYyNjI0MjIsIDB4NkRGNjZFRjYsCisweEFFQUY2Q0Y2LCAweDJGQjY2QkY2LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LAorMHg2QzUzNkQ2MywgMHhCRUZENkU0MywgMHhCRUNENkI3MywgMHhEMjE1MDAwOSwKKzB4MjJFMDYxQzMsIDB4NjAyMkRFMTYsIDB4NDExODIxRTksIDB4MjAxQkM5RkYsCisweDIyMDJEMTEwLCAweEQ2MEY4NDEzLCAweDYwQzM4MDExLCAweERFMEI4MDEzLAorMHhENDBCNjc2MiwgMHhFQzAwNkJCRCwgMHgxRUI1MUU3MiwgMHg4NDQxMjRDMiwKKzB4QzlGMDRCMjEsIDB4ODA0MUNCMDQsIDB4RTE0MDYwNDAsIDB4MjQwMENCMDYsCisweEU1MDA2MjQyLCAweDRCMjEyRTIyLCAweDQxMjhBMDE0LCAweDAwMUQxMjAwLAorMHgwMDExNjUyOCwgMHgwMDExNjUzMCwgMHgwMDExNjUzOCwgMHgwMDExNjU0NCwKKzB4MDBGRkZGRkYsIDB4MDAxMTY1MzQsIDB4NjA1MzY1NUQsIDB4MDZERTQwMDgsCisweDIxNjI3NTAxLCAweDMyQjM2MjVELCAweDRGMjY4QkY2LCAweDZERjY2RUY2LAorMHhBRTVGNkNGNiwgMHg0RjIyNkJGNiwgMHhCRjczNjc3QywgMHhBRUIzNjQ0QywKKzB4NEYyMjRGMjYsIDB4QkZBNjY3N0QsIDB4QUVBRDY0NEMsIDB4NEYyMjRGMjYsCisweEU1MDBFNDlGLCAweEJGMDhFNjAzLCAweDRGMjY2NDRDLCAweDYwMEMwMDBCLAorMHhFNDlGNEYyMiwgMHhFNjAzRTUwMCwgMHg2NDRDQkVGRiwgMHg0RjI2NDAxOSwKKzB4NjAwRDAwMEIsIDB4NjU0MzY2NUMsIDB4RTQwM0FFRjcsIDB4NjU0MzY2NUMsCisweEU0MEJBRUYzLCAweEQxNzVENjc0LCAweDYwNDM2MjYyLCAweEM4MDEyMTIyLAorMHg4RjAxNjAxMCwgMHhDOUVGQ0IxMCwgMHg2MjEyMjEwMCwgMHgyNjIyMDAwQiwKKzB4NEYyMjJGRTYsIDB4RTAwMDRGMTMsIDB4QkUyQzQwMUUsIDB4RDU2QzZFNDMsCisweDI1MjI2MjBDLCAweEU0MDFCRkU2LCAweDYwNjNENjY5LCAweDYwRUNDRjgwLAorMHg4OTA3MjAwOCwgMHg4OTA5ODgwMSwgMHg4OTBEODgwMiwgMHg4OTExODgwMywKKzB4MDAwOUEwMTMsIDB4QzlFMzYwNjAsIDB4MjYwMEEwMEYsIDB4Q0IxMDYwNjAsCisweENCMDRDOUY3LCAweDI2MDBBMDA5LCAweENCMTA2MDYwLCAweENCMDhDOUZCLAorMHgyNjAwQTAwMywgMHhDQjFDNjA2MCwgMHhENTU5MjYwMCwgMHhCRTYxNjI1MiwKKzB4RTQwMDY0MkMsIDB4NEYyNjRGMTcsIDB4NkVGNkFGQkMsIDB4MkY5NjJGODYsCisweDJGQjYyRkE2LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweDYwQzM2QzdDLAorMHg2QTYzODgwMiwgMHg2OTUzOEYwOSwgMHg2NTQzNjI5MCwgMHg2NjJDRTRBRiwKKzB4QkVGN0U3MDEsIDB4QTAwQTY0NEMsIDB4MkNDODAwMDksIDB4ODgwMTg5MDEsCisweDY1NDM4QjA1LCAweEU2MDBFNEFGLCAweEJFRUJFNzAxLCAweEJERDE2NDRDLAorMHhFRDAxMDAwOSwgMHhERTQzRUJBRiwgMHhFODAwQTAyQywgMHgwMDA5QkRGNCwKKzB4NjBDM0QxNDEsIDB4ODgwMkUyMDAsIDB4RDU0MDIxMjIsIDB4MjFCMDhEMDYsCisweDg5MDgyQ0M4LCAweDg5MEE4ODAxLCAweDAwMDlBMDBDLCAweDAwOUM2MEQzLAorMHhBMDA3RDYzOSwgMHhEMjM4ODA2MSwgMHhBMDAzNjA4MywgMHhEMjM2ODAyMSwKKzB4ODAyMTYwRDMsIDB4RDEzNTY0MTIsIDB4MUU0MkU2MDAsIDB4ODQ1MTIxNjIsCisweEM5RjA3RDAxLCAweDgwNTFDQjAyLCAweENCMDI2MDUwLCAweDY3MTIyNTAwLAorMHgyRTcyQkRBMCwgMHg4QkQxM0RBMiwgMHgwMDA5QkRGNiwgMHgwMDA5QkRBMywKKzB4NjIwQ0Q2MjcsIDB4NEYyNjI2MjIsIDB4NkRGNjZFRjYsIDB4NkJGNjZDRjYsCisweDY5RjY2QUY2LCAweDY4RjYwMDBCLCAweEU3MDJBRjk4LCAweDJGOTYyRjg2LAorMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHgzRjNDOTMzMSwKKzB4MEY1NjkwMzAsIDB4RThGRjcwRkMsIDB4Njg4QzBGNDYsIDB4RTkwMEEwNDksCisweDQwMThFMDEwLCAweEU1MDQwNEZFLCAweEJGMzMzNDlDLCAweDg4RkY2QTQzLAorMHg5MDFGODkzRSwgMHhFMTEwMENGRSwgMHg0MTE4M0M5OCwgMHg4QjAzM0MxNiwKKzB4NjRBM0JFMUIsIDB4MDAwOUEwMzEsIDB4NDAxOEUwMTAsIDB4RUQwMDBCRkUsCisweEEwMDczQkNDLCAweDY0RDM2RUYzLCAweEJGMUYzNEJDLCAweDJFMDBFNTAxLAorMHg3RTAxN0QwMSwgMHg4QkY2M0RDMiwgMHg2NEEzQkUwNywgMHhBMDFBRUQwMCwKKzB4RUZGODZFRjMsIDB4MDAwMDEwMDQsIDB4MDAxRDEyMDQsIDB4MDAxMTY1MkMsCisweDAwMTE2NTQ0LCAweDAwMUQxMjAwLCAweDAwMTE2NTMwLCAweDAwMTE2NTI4LAorMHg2NjZDNjZFMCwgMHg4OTA0MzY4MCwgMHgzNUJDNjVEMywgMHhCRTUxRTcwMSwKKzB4N0QwMUU0MDIsIDB4M0RDMjdFMDEsIDB4RTExMDhCRjIsIDB4MzkxQzQxMTgsCisweDkwNTQ3OTA0LCAweDM5MTIwMUZFLCAweDkzNTE4QkIyLCAweDRGMjYzRjNDLAorMHg2REY2NkVGNiwgMHg2QkY2NkNGNiwgMHg2OUY2NkFGNiwgMHg2OEY2MDAwQiwKKzB4Njc2RDYyNTMsIDB4NjYyMzY1NDMsIDB4RTQwMkFFQzMsIDB4MkZBNjJGOTYsCisweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweDY5N0Q0RjIyLCAweDRBMjE2QTkzLAorMHg0QTA4NEEyMSwgMHg2QzQzNkQ2MywgMHhBMDA4NkI3MywgMHg2NEMzNkU1MywKKzB4NjY5MzY1RDMsIDB4NkJCREJGRTQsIDB4M0RBQzNDQkMsIDB4NkVFRjNFQjgsCisweDhCRjQyRUU4LCAweDRGMjZFMDAwLCAweDZERjY2RUY2LCAweDZCRjY2Q0Y2LAorMHgwMDBCNkFGNiwgMHgyRkE2NjlGNiwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwKKzB4RUMwMDRGMjIsIDB4NkI1MzZFQzMsIDB4QTAwNjZENDMsIDB4NjREM0VBMDEsCisweDY1QTNCRUE4LCAweDdEMDEzQzBDLCAweDNFQjI3RTAxLCAweDYwQzM4QkY3LAorMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHgwMDBCNkJGNiwgMHgxMDA0NkFGNiwKKzB4MDAwMDEwMDgsIDB4MDAwOTAwMEIsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweDZENDM2QzUzLCAweEVFMDBBMDA0LCAweDdFMDE2NEQ0LCAweDY0NENCRkYyLAorMHg4QkY5M0VDMiwgMHg2RUY2NEYyNiwgMHgwMDBCNkRGNiwgMHhFNTAwNkNGNiwKKzB4NjY0M0EwMDIsIDB4NzYwMTc1MDEsIDB4MjIyODYyNjAsIDB4QUZFMzhCRkEsCisweDJGRTYwMDA5LCAweDc1MDc2MjUzLCAweEUxMDg2NzUzLCAweDYwNDNFRTBBLAorMHg0NDA5QzkwRiwgMHg2NTAzMzBFMiwgMHg4RDAxNDQwOSwgMHhFNjMwRTYzNywKKzB4NDExMDM2NUMsIDB4OEZGMjI3NjAsIDB4RTAwMDc3RkYsIDB4MDAwQjgwMjgsCisweDRGMjI2RUY2LCAweEJGRTQ3RkVDLCAweEJGRDg2NUYzLCAweDdGMTQ2NEYzLAorMHgwMDBCNEYyNiwgMHg0RjIyRTAwMCwgMHhCRkRBN0ZFQywgMHg2NEYzNjVGMywKKzB4NzQwNkJGQ0QsIDB4NEYyNjdGMTQsIDB4RTAwMDAwMEIsIDB4NEYyMjJGRTYsCisweDYyNTM3RkVDLCAweDY1RjM2RTQzLCAweDY0MjNCRkNCLCAweDY0RTNCRkJGLAorMHg2NEYzQkZCRCwgMHhCRkJBRDQwMywgMHg3RjE0MDAwOSwgMHgwMDBCNEYyNiwKKzB4MDAwMDZFRjYsIDB4MDAxMTY2QTQsIDB4RTRGREQyOUEsIDB4RDc5QTYxMjIsCisweDIyMTIyMTQ5LCAweDc0MDE2MDIyLCAweDIyMDJDQjAxLCAweEQ1OTc2NjIyLAorMHgyMjYyMjY0OSwgMHhDODQwNjA3MCwgMHg2MDUyODkwMiwgMHgyNTAyQ0IwNCwKKzB4RTFGNzY0NTIsIDB4MjU0MjI0MTksIDB4RTcwMTYwNTIsIDB4MjUwMkM5Q0YsCisweEU2MDI2MDUyLCAweDI1MDJDQjAzLCAweDE1NjI0NzE4LCAweDE1NzMwMDBCLAorMHhENzhDRDU4QiwgMHhENDhERDI4QywgMHhFNjAwRTEwMCwgMHgyNzExMjUxMSwKKzB4QUZEMTIyMTAsIDB4NjY0QzI0NjEsIDB4NDYwMEQyODksIDB4NjA2MDM2MkMsCisweDAwMEJDQjEwLCAweDY1NEMyNjAwLCAweDQ1MDBEMjg1LCAweDY2NTAzNTJDLAorMHgyNjE5RTFFRiwgMHgyNTYwMDAwQiwgMHhEMjgyNjY0QywgMHgzNjJDNDYwMCwKKzB4Q0IxMDYwNjAsIDB4MjYwMDAwMEIsIDB4RDI3RTY1NEMsIDB4MzUyQzQ1MDAsCisweEUxRUY2NjUwLCAweDAwMEIyNjE5LCAweDY2NEMyNTYwLCAweDQ2MDBEMjc4LAorMHg2MDYwMzYyQywgMHgwMDBCQ0IwOCwgMHg2NTRDMjYwMCwgMHg0NTAwRDI3NCwKKzB4NjY1MDM1MkMsIDB4MjYxOUUxRjcsIDB4MjU2MDAwMEIsIDB4RDI3MTY2NEMsCisweDM2MkM0NjAwLCAweENCMDg2MDYwLCAweDI2MDAwMDBCLCAweEQyNkQ2NTRDLAorMHgzNTJDNDUwMCwgMHhFMUY3NjY1MCwgMHgwMDBCMjYxOSwgMHg2MjRDMjU2MCwKKzB4NDIwMEQ2NjcsIDB4NjAyMDMyNkMsIDB4NDAyMUM5MDgsIDB4NDAyMTQwMjEsCisweDYwMEMwMDBCLCAweEQ2NjM2MjRDLCAweDMyNkM0MjAwLCAweEM5MDg2MDIwLAorMHg0MDIxNDAyMSwgMHgwMDBCNDAyMSwgMHhEMTVGNjAwQywgMHgzNDFDNjQ0QywKKzB4MDAwQjYyNDAsIDB4RDE1RDYwMkMsIDB4MzQxQzY0NEMsIDB4MDAwQjYyNDAsCisweDJGRTY2MDJDLCAweDZFNDM0RjIyLCAweEU2MEE2NDVDLCAweDg5MTQzNDY3LAorMHgwMDA5QkZFQiwgMHg2MEVDNjQwQywgMHg4QjAyODgwMSwgMHhBMDAyRTAwRiwKKzB4NDQwOTI0MDksIDB4NjI0QzQ0MDksIDB4MzI2M0U2MEEsIDB4QkZFMjg5MDUsCisweDYyMEM2NDRDLCAweEM4ODA2MDIzLCAweEUyMDA4QjAwLCAweDRGMjY2MDIzLAorMHg2RUY2MDAwQiwgMHhENjRBNEYyMiwgMHg4ODAxNjA2MiwgMHhCMjQ1OEIwMywKKzB4QTAwMzAwMDksIDB4RDI0NzAwMDksIDB4MjI2MEU2NDAsIDB4RTIwMEQ2NDYsCisweDAwMEI0RjI2LCAweDRGMjIyNjIyLCAweDYwNjJENjQxLCAweDhCMDE4ODAyLAorMHgwMDA5QjI4RSwgMHhFMjAwRDY0MCwgMHgwMDBCNEYyNiwgMHhENTNDMjYyMiwKKzB4RTEwMEQ0M0MsIDB4MjUxMkU3MDEsIDB4MjQ3MDAwMEIsIDB4RTYwNEQyMzksCisweDIyNjAwMDBCLCAweEQ0Mzk0RjIyLCAweDQxMEJEMTM5LCAweEQ1MzkwMDA5LAorMHg2NjUwRTFGRCwgMHgyNjE5RDIzOCwgMHgyNTYwRTcwMCwgMHgwMDBCNEYyNiwKKzB4NEYyMjIyNzAsIDB4RDEzMkQ0MzUsIDB4MDAwOTQxMEIsIDB4RTdGQkQ1MzEsCisweDI2Nzk2NjUwLCAweDAwMEI0RjI2LCAweDRGMjIyNTYwLCAweEQxMkNENDMwLAorMHgwMDA5NDEwQiwgMHhFN0Y3RDUyQiwgMHgyNjc5NjY1MCwgMHgwMDBCNEYyNiwKKzB4RDUyODI1NjAsIDB4NjI1MDk0MkQsIDB4MDAwQjIyNDksIDB4RDUyNTI1MjAsCisweDYyNTBFNEJGLCAweDAwMEIyMjQ5LCAweDRGMjIyNTIwLCAweDg1MjJEMjI1LAorMHgyMDA4NjAwRCwgMHg4ODAxODkxMSwgMHg4ODAzODkxMywgMHg4ODA1ODkxNSwKKzB4ODgwNjg5NDIsIDB4ODgwODg5NDgsIDB4ODgwOTg5NEUsIDB4ODgwQTg5NTQsCisweDg4MEI4OTVBLCAweEEwNjc4OTYwLCAweEIwNjkwMDA5LCAweEEwNjQwMDA5LAorMHhCMDc3NjAwQywgMHhBMDYwMDAwOSwgMHhCMDgwNjAwQywgMHhBMDVDMDAwOSwKKzB4RkY3RjYwMEMsIDB4MDAxRTIxNDgsIDB4MDAxRTEwMDAsIDB4MDAxRTExMDgsCisweDAwMTE2NTcwLCAweDAwMTE2NTcyLCAweDAwMTE2NTkxLCAweDAwMTE2NTU0LAorMHgwMDFFMTAzRiwgMHgwMDFFMTA1RiwgMHgwMDFFMTAyRiwgMHgwMDFFMTA5MCwKKzB4MDAxMTY1NzgsIDB4MDAxRTEwMEIsIDB4MDAxMTY1NzQsIDB4MDAxMTY2QTgsCisweDAwMTE0RUJFLCAweDAwMUUxMDI4LCAweDAwMTE2NTkwLCAweDAwMTE2NkI0LAorMHgwMDExNjZDNCwgMHgwMDExNjU0OCwgMHg2MjYwRDY4NCwgMHg4QjJCMjIyOCwKKzB4MDAwOUIwNjEsIDB4NjAwQ0EwMjksIDB4NjI2MEQ2ODAsIDB4OEIyMzIyMjgsCisweDAwMDlCMDY5LCAweDYwMENBMDIxLCAweDYyNjBENjdDLCAweDhCMUIyMjI4LAorMHgwMDA5QjBDNywgMHg2MDBDQTAxOSwgMHg2MjYwRDY3OCwgMHg4QjEzMjIyOCwKKzB4MDAwOUIwQ0QsIDB4NjAwQ0EwMTEsIDB4NjI2MEQ2NzQsIDB4OEIwQjIyMjgsCisweDAwMDlCMTI1LCAweDYwMENBMDA5LCAweDYyNjBENjcwLCAweDhCMDMyMjI4LAorMHgwMDA5QjEzRCwgMHg2MDBDQTAwMSwgMHg0RjI2RTAwMCwgMHgwMDA5MDAwQiwKKzB4RDI2Q0QxNkIsIDB4RDU2Qzg0MTIsIDB4NDAwMEM5MEYsIDB4RDc2QjAxMkQsCisweEU0MDNENjZCLCAweEUyMEY2MTFDLCAweDI1NDBFMDAxLCAweDI1MjAyNzEyLAorMHgyNjAyMDAwQiwgMHhFNjAxRDI2MiwgMHgzMDY2ODUyMywgMHhFMDAwOEQwNSwKKzB4RDY2M0QyNjAsIDB4RTAwMTgxMjIsIDB4MDAwQjI2MDIsIDB4RDI1QzAwMDksCisweDYwMEQ4NTIzLCAweDg5MDUyMDA4LCAweDhCMEE4ODAxLCAweDYwNjBENjVELAorMHgyNjAwQ0IwMSwgMHhENDU3RDY1QSwgMHhFMDAxRTEwMSwgMHgwMDBCMjYxMiwKKzB4MDAwQjgxNDIsIDB4RDE1MkUwMDAsIDB4ODUxM0U1MDEsIDB4NjQwRDQ1MTgsCisweDY2MDMzNDUzLCAweEUwMDA4RDA1LCAweEQ1NTFEMjUzLCAweDIyNjBFMDAxLAorMHgwMDBCMjUwMiwgMHg0RjIyMDAwOSwgMHg4NTEzRDE0OSwgMHg2NDUzNjUwRCwKKzB4NjI0OTQ0MTksIDB4MjI3RDY3MkUsIDB4ODgwMTYwMkMsIDB4ODgwMjg5MDksCisweDg4MDM4OTEwLCAweDg4MDY4OTFBLCAweDg4MDc4OTM1LCAweEEwNEM4OTNCLAorMHhENTQ2MDAwOSwgMHg2NjUyRDc0NiwgMHgyNzYyRDQ0NiwgMHg2MjJDNjI2MSwKKzB4MjQyMUEwMzgsIDB4MjIyODYyNUMsIDB4RDQ0MzhCM0YsIDB4NjY0MkQ1NDAsCisweDI1NjJENDQwLCAweDI0MDE4NTYxLCAweDYyMDNBMDJDLCAweDIwMDg2MDVDLAorMHg4ODEwODkwNywgMHg4ODIwODkwOCwgMHg4ODMwODkwOSwgMHhBMDJDODkwQSwKKzB4RDIzQTAwMDksIDB4NjIyMkEwMDgsIDB4QTAwNUQyMzksIDB4RDIzOTYyMjIsCisweDYyMjJBMDAyLCAweDYyNjJENjM4LCAweEQ0MzJENTMxLCAweDY2MjEyNTIyLAorMHhBMDBGNjI2QywgMHhENjM1MjQyMSwgMHg2MjYxRDUyRCwgMHg2MjJDRDQyRCwKKzB4QTAwNzI1NjIsIDB4RDYzMjI0MjEsIDB4ODU2MUQ1MjksIDB4MjU2MkQ0MjksCisweDYyMDMyNDAxLCAweDY2MkQ4NTE1LCAweDM2MTc2MTBELCAweDY1MDM4RjAxLAorMHhCMENCMjQ1MSwgMHhBMDAxMDAwOSwgMHhFMDAwRTAwMSwgMHgwMDBCNEYyNiwKKzB4RDYxOTAwMDksIDB4RDQyN0UxMDEsIDB4NjU0MTI2MTAsIDB4RDExOEQ3MTcsCisweEUyMEY2NTVELCAweDI3NTJFMDAxLCAweDAwMEIyNjIwLCAweDJGRTYyMTAyLAorMHhEMjBGNEYyMiwgMHg2NDBDODUyMywgMHg4QjA4MjQ0OCwgMHhENTExRDYxRCwKKzB4MjYyMUUyMDAsIDB4OTQwRjg0NTEsIDB4QTA0ODIwNDksIDB4REUwRDgwNTEsCisweEM4NDA2MEUwLCAweEUyMDE4RDMyLCAweDg5NDQzNDI3LCAweEQyMTZENjE1LAorMHgyNjQxNDIwQiwgMHgwMDA5QTAzMCwgMHgwMDAwRkY3RiwgMHgwMDExNjU5MSwKKzB4MDAxMTY1NDgsIDB4MDAxMTY1NTQsIDB4MDAxRTExMDAsIDB4MDAxRTEwMEMsCisweDAwMTE2NTc0LCAweDAwMUUxMDAwLCAweDAwMUUxMDAxLCAweDAwMTE2NTdDLAorMHgwMDExNjU1QywgMHgwMDExNjU2MCwgMHgwMDExNjU2NCwgMHgwMDExNjU4MCwKKzB4MDAxMTY1ODQsIDB4MDAxMTY1ODgsIDB4MDAxMTY1OEMsIDB4MDAxMTY3NzQsCisweDAwMTE2NzdFLCAweDAwMTE2NTZFLCAweDAwMTE1RENBLCAweDg5MTIzNDI3LAorMHhEMjk0RDY5MywgMHgyNjQxNDIwQiwgMHhDQjgwODRFMSwgMHg4MEUxQjBGNSwKKzB4RDY5MTYwRTAsIDB4MkUwMENCMDQsIDB4QzkzRjYwNjAsIDB4RDY4RjI2MDAsCisweEEwMDFFMDAxLCAweEUwMDAyNjAyLCAweDAwMEI0RjI2LCAweEQ2OEM2RUY2LAorMHhDODgwNjA2MCwgMHhEMjg2ODkxOSwgMHg4ODAxNjAyMSwgMHhEMjg5OEIxNSwKKzB4ODUyNEU1MDEsIDB4ODkxMDMwNTYsIDB4RTIwM0QxODcsIDB4MjEyMEQ0ODcsCisweEUwMEI2NTQxLCAweDA2NTY2NTVELCAweEU0MEZENTg1LCAweDIxNDBFNzAyLAorMHhENzdFMjU3MSwgMHgwMDBCRTAwMSwgMHgwMDBCMjcwMiwgMHgyRkU2RTAwMCwKKzB4REU4MDRGMjIsIDB4Qzg4MDg0RTEsIDB4RDU3QTg5MkMsIDB4MjAwODg1NTQsCisweDYxMDM4RjI4LCAweDg1NTNENzdDLCAweDY0MDM2NjcyLCAweDg1NjY2NTBDLAorMHgzNTIwNjIwQywgMHhENjc5OEIxRSwgMHg2NTFDRDc3NCwgMHgyNjUxNjQ0QywKKzB4NjBFMDI3NDEsIDB4ODkwNEM4NDAsIDB4NDIwQkQyNzUsIDB4QTAwMzAwMDksCisweEQyNjgwMDA5LCAweDAwMDk0MjBCLCAweDAwMDlCMDlGLCAweEUyMDFEMTY3LAorMHg2MEUwMjEyMiwgMHhDQjA0RDQ2NCwgMHg2MDQwMkUwMCwgMHgyNDAwQzkzRiwKKzB4NjAyM0EwMDEsIDB4NEYyNkUwMDAsIDB4NkVGNjAwMEIsIDB4MkZCNjJGQTYsCisweDJGRDYyRkM2LCAweERBNjIyRkU2LCAweDY2QTFFMjQwLCAweDM2MjJEQzVFLAorMHg2MjYzODkwMCwgMHg2RUQzNkQyQywgMHg0RTIxMzZEOCwgMHg0RTIxMkE2MSwKKzB4REI2MUQ0NjAsIDB4RTcwMEEwMEYsIDB4NzcwMTYyQjIsIDB4NzEwMjYxMjMsCisweDY2MjEyQjEyLCAweDcxMDI2MjEzLCAweDYxMjEyQjEyLCAweDY1MUQ2NjZELAorMHgzNTZDNDUyOCwgMHg2MjdDMjQ1MiwgMHg4QkVEMzJFMywgMHhDOTAzNjBEMywKKzB4OEIxMDg4MDMsIDB4NjE3MzY3QjIsIDB4MkIxMjcxMDIsIDB4NzEwMjZFMTMsCisweDJCMTI2NTcxLCAweDY1NUQ2REUxLCAweDQyMjg2MkRELCAweDMyNUNFMTA3LAorMHhBMDBDMkMxMCwgMHg4ODAyMjQyMiwgMHhBMDAzOEIwMSwgMHg4ODAxRTIwMywKKzB4RTIwMThCMDUsIDB4NjZCMjJDMjAsIDB4NjU1RDY1NjEsIDB4RTYwRjI0NTIsCisweDY3QTEyQzYwLCAweDhCMDUyNzc4LCAweEREMzhEQzQ0LCAweEVCMDFFQTAwLAorMHgyREIyMkNBMiwgMHg2REY2NkVGNiwgMHg2QkY2NkNGNiwgMHg2QUY2MDAwQiwKKzB4MkZFNjJGRDYsIDB4RTI0MEREMzYsIDB4MzYyMjY2RDEsIDB4NjI2Mzg5MDAsCisweDM2Nzg2NzJDLCAweDc3MDNERTM4LCAweDQ3MjEyRDYxLCAweDY0RTJENjM1LAorMHhBMDBFNDcyMSwgMHg2NTYyRTEwMCwgMHg2MjUzNzEwMSwgMHg3NDAxMjQ1MCwKKzB4MjQyMDQyMTksIDB4NDUyOTc0MDEsIDB4NzQwMTI0NTAsIDB4MjQ1MDQ1MTksCisweDYyMUM3NDAxLCAweDhCRUUzMjczLCAweDY2RTI0MjAwLCAweDQyMDA2MUQxLAorMHgyMTE4MzYyQywgMHgyRTYyOEYwNiwgMHhERDFDRDcyOCwgMHhFNTAxRTQwMCwKKzB4MkQ1MjI3NDIsIDB4MDAwQjZFRjYsIDB4MkZENjZERjYsIDB4NEYyMjJGRTYsCisweEVEMEFFRTAxLCAweDY0RTNCQzk3LCAweEJDOUM2NEUzLCAweDYyRUM3RTAxLAorMHg4QkY3MzJENywgMHhCQzlGRUUwMSwgMHg2NEUzNjRFMywgMHg3RTAxQkNBNCwKKzB4MzJENzYyRUMsIDB4NEYyNjhCRjcsIDB4MDAwQjZFRjYsIDB4RDExODZERjYsCisweEQ0MTg5MjBELCAweDcyMTIyMTIyLCAweDI0MjJENjE3LCAweEQ3MTc3MjA0LAorMHg3MjIwMjYyMiwgMHgyNzIyRDExNiwgMHgwMDBCNzIzMCwgMHgxMzdBMjEyMiwKKzB4MDAxMTY1NkUsIDB4MDAxMTVFRDYsIDB4MDAxRTEwMTUsIDB4MDAxMTY1NzQsCisweDAwMUUxMDAxLCAweDAwMTE2NTQ4LCAweDAwMUUxMTAwLCAweDAwMTE2NTcyLAorMHgwMDExNjU2MCwgMHgwMDFFMTAwMCwgMHgwMDExNjU2NCwgMHgwMDExNjU3MCwKKzB4MDAxMTVEQ0EsIDB4MDAxRTEwMEMsIDB4MDAxMTY1NUMsIDB4MDAxMTY1NzgsCisweDAwMTE2NTdDLCAweDAwMTE2NTgwLCAweDAwMTE2NTg0LCAweDAwMTE2NTg4LAorMHgwMDExNjU4QywgMHg0RjIyMkZFNiwgMHhENjUwN0ZGQywgMHg4ODAxNjA2MCwKKzB4RTIwMTg5NTEsIDB4MjYyMEJGQkIsIDB4RDU0RUQxNEQsIDB4REU0RTYwMTAsCisweDY0RTM2NTUyLCAweDc0MDJDODQwLCAweDhEMjJEMTRDLCAweEQyNEM3NTAyLAorMHhFNjAxRDc0QywgMHhFNzA0MjcyMiwgMHg3NjAxNjI1NSwgMHg2MjZDMjQyMSwKKzB4OEZGOTMyNzMsIDB4RDQ0Mzc0MDIsIDB4NjI0MkU2MDEsIDB4NjQwRDg1MjgsCisweDY3NDk0NDE5LCAweDI3NUQ2NTdFLCAweDgxRTQ2MDdDLCAweEU0MTdENTQyLAorMHg2NzU1NzYwMSwgMHgzMjQzNjI2QywgMHg4RkY5MjE3MSwgMHhBMDIwNzEwMiwKKzB4RDIzRTAwMDksIDB4RTYwMUQ3M0IsIDB4RTcwNDI3MjIsIDB4NzYwMTYyNTUsCisweDYyNkMyNDIxLCAweDhGRjkzMjczLCAweEQ0MzI3NDAyLCAweDYyNDJFNjAxLAorMHg2NDBEODUyOCwgMHg2NzQ5NDQxOSwgMHgyNzVENjU3RSwgMHg4MUU0NjA3QywKKzB4RTQxN0Q1MzMsIDB4Njc1NTc2MDEsIDB4MzI0MzYyNkMsIDB4OEZGOTIxNzEsCisweDkyNEE3MTAyLCAweEQyMjYyRTIxLCAweDVFMjNENzJFLCAweDY0RjIyRkUyLAorMHg2MDQzNjVGMiwgMHgyNzAwQzk4MCwgMHhDOTYwNjA0MywgMHg4MDcxNjEwMywKKzB4QzkwMzYwNDMsIDB4ODA3MjQ1MTksIDB4NjVGMjYwNUMsIDB4ODE3MjY2RjIsCisweDQ2MTk0NjI5LCAweDYwNkM0NTI5LCAweDQwMTg2NDVDLCAweDgxNzMzMDRDLAorMHgyMTE4NUUyMywgMHg2NEYyMkZFMiwgMHg2RTRDNjJGMiwgMHg2MDJDNDIxOSwKKzB4NjZGMjYyRjIsIDB4NDYyOTQwMTgsIDB4NDYxOTMwRUMsIDB4NDIyOTgxNzQsCisweDY1MkM2MDZDLCAweDMwNUM0MDE4LCAweDgxNzU4RjA3LCAweDAwMDlCQzlELAorMHgyMjI4NjIwQywgMHhBMDBBODkwOCwgMHg2MDEzMDAwOSwgMHg4QjAzODg0MCwKKzB4MDAwOUIwMDksIDB4MDAwOUEwMDMsIDB4RTIwMkQ2MEYsIDB4N0YwNDI2MjIsCisweDAwMEI0RjI2LCAweDAwMEI2RUY2LCAweDA2MEEwMDA5LCAweDAwMTE2NTkwLAorMHgwMDFFMTAwMCwgMHgwMDExNjU3QywgMHgwMDExNjc3NCwgMHgwMDExNjc4MCwKKzB4MDAxMTY3MTgsIDB4MDAxMTY1NjQsIDB4MDAxMTY3NDgsIDB4MDAxMTY3NDYsCisweDAwMTE2NzFBLCAweDAwMTE2NTQ4LCAweDAwMTE2NTc0LCAweDRGMjIyRkU2LAorMHg4NEU5REU4RSwgMHgyNDQ4NjQwQywgMHhCMThCODkwMSwgMHhEMjhDMDAwOSwKKzB4MjY2ODY2MjAsIDB4NjBFMDg5MDIsIDB4MkUwMEM5QkYsIDB4MDAwQjRGMjYsCisweDAwMEI2RUY2LCAweDJGRTYwMDA5LCAweERFODY0RjIyLCAweDYwRTBENjg2LAorMHhDQkMwRDQ4NiwgMHg2MjYwMkUwMCwgMHhDODAzNjAyQywgMHg0MDIxODkwNCwKKzB4NzAwMTQwMjEsIDB4NjYwM0EwMDIsIDB4NjYwMzQwMDksIDB4RDY4MDYxNkQsCisweEU1MDBBMDA0LCAweDc1MDE2MjYyLCAweDc0MDQyNDIyLCAweDMyMTM2MjVELAorMHhEMjdDOEJGOCwgMHgwMDA5NDIwQiwgMHhDOUJGODRFMiwgMHg0RjI2ODBFMiwKKzB4NkVGNjAwMEIsIDB4MkZFNjJGRDYsIDB4N0ZGQzRGMjIsIDB4NjI2MEQ2NzYsCisweDg5NDAyMjI4LCAweEQ1NkRFMTAwLCAweDYwNTAyNjEwLCAweENCNDBENDczLAorMHgyNTAwNDQwQiwgMHg4RDA1MjAwOCwgMHg2MkUwNkUwMywgMHg3MTA0NjEyQywKKzB4MkYxMUEwMDYsIDB4RDQ2RUQ2NjYsIDB4REQ2RTY3NjAsIDB4NjU3QzREMEIsCisweEUyM0M2RDFELCAweDhCMDMzRDI3LCAweEQyNkNENDZCLCAweDAwMDk0MjBCLAorMHg0RDIxNEQyMSwgMHhBMDA1RDc2QSwgMHg2NkU2RTQwMCwgMHgzNTdDNDUwOCwKKzB4NzQwMTI1NjIsIDB4MzVEMzY1NEQsIDB4RDc2NjhCRjcsIDB4NkU3MkUwMDMsCisweDgxRTE0MDE4LCAweDZFNzI2MEYxLCAweDgxRTI3MDBDLCAweEQ0NjI2MTcyLAorMHhERDYyODExMywgMHg2NTcyNEQwQiwgMHhENjUyRDI2MSwgMHgyMjEyRTEwMSwKKzB4QzkzRjYwNjAsIDB4N0YwNDI2MDAsIDB4NkVGNjRGMjYsIDB4NkRGNjAwMEIsCisweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweEQyNUE0RjIyLCAweDZCNDM2RTczLAorMHg0MjBCNkM1MywgMHgyMDA4NkQ2MywgMHg2MTAzOEYwOCwgMHhEMjRGRDQ1NiwKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjQyMkIsIDB4MjFCMDYwQzMsCisweDYwRDM4MDExLCAweEU1MDA4MTExLCAweDY0QkNBMDA3LCAweDYwNTM2NTVELAorMHg2NjUzMDBFQywgMHg3NTAxMzYxQywgMHg2MjVEODA2NCwgMHg4QkY1MzI0MywKKzB4NjA2MEQ2MzYsIDB4MjYwMEM5QkYsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsCisweDZCRjYwMDBCLCAweDdGQzQ0RjIyLCAweDcyMDI2MkYzLCAweDIyNTEyRjQxLAorMHg0NTI5NzIwMiwgMHg2MDYzMjI1MSwgMHhFNUM0RTY4MiwgMHg2N0YzODEyMSwKKzB4NjU1QzY2NkMsIDB4RTQwOEJGQkMsIDB4NEYyNjdGM0MsIDB4MDAwOTAwMEIsCisweDJGOTYyRjg2LCAweDJGQjYyRkE2LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LAorMHhFMTAwN0ZDNCwgMHg2NTEzRUNGRiwgMHg2QjEzNkNDRCwgMHhERTM0RDczMywKKzB4RURGRjY0RjMsIDB4RDgzM0VBMDQsIDB4NjA1MzY1NUMsIDB4MDI3RDQwMDAsCisweDMyQzA2MjJELCAweDY2MDM4RDBELCAweDA5RUQ2MDYzLCAweDI0OTEwMjdELAorMHgyNDIxNzQwMiwgMHg2OTgyMDJFRCwgMHgzOTI4NjIyRCwgMHg3NDAyMjg5MiwKKzB4NzUwMTcxMDQsIDB4NjA2MzYyNUMsIDB4MDdENTMyQTIsIDB4MEVCNThGRTQsCisweDI0NDg2NDFDLCAweEU2ODA4OTA1LCAweDY3RjNFNUM1LCAweEJGN0Y2NjZDLAorMHg3RjNDNjU1QywgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwKKzB4MDAwQjY5RjYsIDB4RDExQzY4RjYsIDB4NjAxMkQyMUMsIDB4Q0IyMEU0MDUsCisweDIxMDJFNTAwLCAweDAwMEIyMjQyLCAweDAwMDAyMjUyLCAweDAwMUUxMDE3LAorMHgwMDExNjRGNiwgMHgwMDFFMTAxNSwgMHgwMDFFMTBCRiwgMHgwMDExNzgwMCwKKzB4MDAxRTEwRkMsIDB4MDAxMTQwQ0MsIDB4MDAxMTY0RkMsIDB4MDAxMTYwMkUsCisweDAwMTE2NkQwLCAweDAwMTE0RjJDLCAweDAwMTE2NkVDLCAweDAwMTE0RUJFLAorMHgwMDExNzg4QywgMHgwMDExNjRGOCwgMHgwMDExNjBEQywgMHgwMDExNDVCQywKKzB4MDAxRTIxMzAsIDB4MDAxMTVGRjAsIDB4MDAxMTY2RjQsIDB4MDAxMTY1MTAsCisweDAwMTE2NTE4LCAweDAwMTE2NzEwLCAweDAwMUMzNTAwLCAweDAwMUQ0MDA0LAorMHhENTY1RDE2NCwgMHhFNDAwRDc2NSwgMHgyMTQyRTIwRiwgMHgxNzQxMTE1NCwKKzB4RDU2MzI3MjIsIDB4OTY2OUQ3NjMsIDB4MTU0MTI1NzIsIDB4OTY2NjE1NjIsCisweEU2MDExNTY1LCAweEQ1NjAxMTY1LCAweDY2NkNFNkY4LCAweDI1NDIyNTQyLAorMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwgMHgyNTYyMjU0MiwgMHg3NjAxRTcyNywKKzB4Njc2MzI1NzIsIDB4MjU2Mjc3OTcsIDB4RTcwNDI1NzIsIDB4MjU3MkUyNDgsCisweEUyMTkyNTIyLCAweEUyNzAyNTIyLCAweDI1NDIyNTQyLCAweDI1NDIyNTQyLAorMHgyNTIyMjU0MiwgMHgyNTIyRTIwQywgMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwKKzB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsIDB4MDAwQjE1NEEsIDB4RTIwODExNDUsCisweDAwMDk0MjJCLCAweDJGRTYyRkQ2LCAweDdGRkM0RjIyLCAweEM4MjA2MDQzLAorMHg2RTQzOEQwMiwgMHgwMDA5QkU3NSwgMHhDODEwNjBFMywgMHhCRTcyODkwMSwKKzB4NjBFMzAwMDksIDB4ODkwMUM4NDAsIDB4MDAwOUJFOTQsIDB4QzgwMTYwRTMsCisweEREM0U4OTM4LCAweEM4MDI2MEQwLCAweDJGMDA4RDAzLCAweDQ2MEJENjNDLAorMHg2MEYwMDAwOSwgMHg4OTAyQzgwNCwgMHg0NjBCRDYzQSwgMHg2MkYwMDAwOSwKKzB4Qzg4MDYwMjMsIDB4NjBEMDg5MDIsIDB4MkQwMEM5N0YsIDB4QzgwMTYwMjMsCisweEQ2MzU4OTA2LCAweDAwMDk0NjBCLCAweDAwMDlBMDA3LCAweDUxNjMwNjAxLAorMHg4OTAyQzgwOCwgMHg0NjBCRDYzMSwgMHg2MEYwMDAwOSwgMHg4OTAyQzgxMCwKKzB4NDIwQkQyMkYsIDB4RDUyRjAwMDksIDB4ODgwMjYwNTIsIDB4RDIyRThCMDMsCisweEEwMDVFNjA0LCAweDg4MDEyMjYwLCAweEQyMkI4QjAyLCAweDIyNjBFNjAxLAorMHgyNTIyRTIwMCwgMHhDODgwNjBFMywgMHhENjI4ODkyRSwgMHg2MEUzNkU2MCwKKzB4ODkwMkM4ODAsIDB4NDIwQkQyMjYsIDB4NjBFMzAwMDksIDB4ODkwMkM4NDAsCisweDQyMEJEMjI0LCAweDYwRTMwMDA5LCAweDg5MDJDODAyLCAweDQyMEJEMjIyLAorMHg2MEUzMDAwOSwgMHg4OTBFQzgwNCwgMHg0MTBCRDEyMCwgMHhCRjEyMDAwOSwKKzB4QkY0RDAwMDksIDB4RDUxRTAwMDksIDB4NjA1MEQ0MUUsIDB4QzkwOEQ3MUUsCisweEJGODQyNTAwLCAweDYwRTMyNDcyLCAweDg5MDVDODA4LCAweDdGMDREMjFCLAorMHg2RUY2NEYyNiwgMHg2REY2NDIyQiwgMHg0RjI2N0YwNCwgMHgwMDBCNkVGNiwKKzB4MDAwMDZERjYsIDB4MDAxQzU4MUMsIDB4QTAwMEEwMDAsIDB4MDAxRDAxMDAsCisweDAwMUQ0MDAwLCAweDAwMDQwMDIxLCAweDAwMUM1ODlDLCAweDAwMUUxMDIxLAorMHgwMDExNTBDNCwgMHgwMDExNTBFNiwgMHgwMDExNTcyNCwgMHgwMDExNTBGRSwKKzB4MDAxMTUxMEMsIDB4MDAxMTY1NzQsIDB4MDAxRTEwMEIsIDB4MDAxRTEwMjgsCisweDAwMTE1MTYyLCAweDAwMTE1MTZFLCAweDAwMTE1MTE0LCAweDAwMTE1MTMyLAorMHgwMDFFMTAwMCwgMHgwMDEwRjEwMCwgMHgxMjM0NTY3OCwgMHgwMDExNTE0QSwKKzB4NjQ0Q0Q2QTcsIDB4MDAwQjM0NkMsIDB4RDZBNjI0NTAsIDB4MzQ2QzY0NEMsCisweDI0NTAwMDBCLCAweDY0NENENkE0LCAweDAwMEIzNDZDLCAweDYyNUMyNDUwLAorMHg0MjA4NjE2RCwgMHg0MjA4NDExOSwgMHg0MjAwNjAxOSwgMHg2NzBFNjE0QywKKzB4RDQ5RTMyMUMsIDB4NDIwMDIwN0QsIDB4MzI0Q0M5MEYsIDB4MjIwMDAwMEIsCisweDQyMDg2MjVDLCAweDQyMDA0MjA4LCAweDMyNEM2NDRDLCAweDQyMDBENDk4LAorMHgwMDBCMzI0QywgMHgyRkU2MjI2MCwgMHg2MTRDNEYxMiwgMHg0MTAwRDQ5MywKKzB4NjcxMDMxNEMsIDB4RTI5RjY2NkQsIDB4MjcyOTQ2MTksIDB4NkU1MzYyNjksCisweDY3MkU2NTczLCAweDQyMjEyMjdELCAweDQyMjE0MjIxLCAweDc2MDE2NjJDLAorMHhFNDAxNDYwOCwgMHgzNEU4NDYwOCwgMHg2NDRDNDYwMCwgMHgwNzFBMDQ2NywKKzB4MjE1MDI1N0IsIDB4MDAwQjRGMTYsIDB4NEYyMjZFRjYsIDB4RDI4NTdGRTgsCisweDg4MDE2MDIxLCAweEQyODQ4QjdCLCAweDI2Njg2NjIxLCAweEQyODM4Qjc3LAorMHgyNjY4NjYyMSwgMHhFNTBGOEI3MywgMHhFNDAxQkZBMiwgMHhCRkE0RTUwMSwKKzB4RTU4NkU0MDAsIDB4RTQwMDY1NUMsIDB4MkY1MEJGQTQsIDB4QkZBMUU0MDEsCisweEU2MDJFNTA2LCAweDYwNjM0NjE4LCAweDgxRjJFNDAxLCAweDY1NDNCRjlGLAorMHhFNDAxODVGMiwgMHhCRkFCNjU0MywgMHg4NUYyNjYwMywgMHg2NTQzRTQwMSwKKzB4NjYwM0JGQjEsIDB4RTQwMjY1RjAsIDB4NjA1Mzc1NkMsIDB4ODBGOEJGODAsCisweEJGODJFNDAyLCAweDg0RjhFNTEyLCAweDcwOTBFNDAyLCAweDY1MDNCRjgyLAorMHg0NjE4RTYwMiwgMHg4MUY2NjA2MywgMHhCRjgwRTQwMiwgMHg4NUY2RTUwMCwKKzB4NjYwM0U0MDIsIDB4RTUwMEJGOEMsIDB4RTQwMjg1RjYsIDB4QkY5MjY2MDMsCisweEU1RkVFNTAwLCAweEUwMTA2NTVDLCAweEJGNjFFNDAzLCAweEU1MTMwRjU0LAorMHhFNDBFQkY2MywgMHgwNUZDRTAxMCwgMHhCRjYzRTQwRSwgMHhFNTAwNzU4NSwKKzB4QkY2NEU0MDMsIDB4RTUwMEU2NDAsIDB4QkY3MUU0MDMsIDB4RTUwMEU2NDAsCisweEJGNzhFNDAzLCAweEU1RkZFNjQwLCAweEUwMTQ2NTVDLCAweEJGNDdFNDA0LAorMHhFNDBGMEY1NCwgMHhFNTA0QkY0OSwgMHgwNUZDRTAxNCwgMHhCRjQ5RTQwRiwKKzB4RTUwMTc1ODQsIDB4QkY0QUU2NDAsIDB4RTUwMUU0MDQsIDB4QkY1N0U2NDAsCisweEU1MDFFNDA0LCAweEU0MDRFNjQwLCAweEFGNUM3RjE4LCAweDdGMTg0RjI2LAorMHgwMDBCNEYyNiwgMHg0RjIyMDAwOSwgMHhEMjQyN0ZGMCwgMHg4ODAxNjAyMSwKKzB4RDI0MThCNzEsIDB4MjY2ODY2MjEsIDB4RDI0MDhCNkQsIDB4MjY2ODY2MjEsCisweEU1MEY4QjY5LCAweEU0MDFCRjFDLCAweEJGMUVFNTAxLCAweEU1ODZFNDAwLAorMHhFNDAwNjU1QywgMHgyRjUwQkYxRSwgMHhCRjFCRTQwMSwgMHhFNDAxRTUwNiwKKzB4QkYxQzY1NDMsIDB4RTQwMUU2NDAsIDB4QkYyOTY1NDMsIDB4RTQwMUU2NDAsCisweEJGMzA2NTQzLCAweDY1RjBFNjQwLCAweDc1NkNFNDAyLCAweEJFRkY2MDUzLAorMHhFNDAyODBGNCwgMHhFNTEyQkYwMSwgMHhFNDAyODRGNCwgMHhCRjAxNzA5MCwKKzB4RTY0MDY1MDMsIDB4QkYwMkU0MDIsIDB4RTY0MEU1MDAsIDB4QkYwRkU0MDIsCisweEU2NDBFNTAwLCAweEJGMTZFNDAyLCAweEU1RkVFNTAwLCAweDYwNTM2NTVDLAorMHhCRUU1RTQwMywgMHhFNTEzODBGOCwgMHhFNDBFQkVFNywgMHhFNDBFODRGOCwKKzB4QkVFNzcwODUsIDB4RTUwMDY1MDMsIDB4QkVFOEU2NDAsIDB4RTUwMEU0MDMsCisweEJFRjVFNjQwLCAweEU1MDBFNDAzLCAweEJFRkNFNjQwLCAweEU1RkZFNDAzLAorMHg2MDUzNjU1QywgMHhCRUNCRTQwNCwgMHhFNDBGODBGQywgMHhFNTA0QkVDRCwKKzB4RTQwRjg0RkMsIDB4QkVDRDcwODMsIDB4RTUwMTY1MDMsIDB4QkVDRUU2NDAsCisweEU1MDFFNDA0LCAweEJFREJFNjQwLCAweEU1MDFFNDA0LCAweEU0MDRFNjQwLAorMHhBRUUwN0YxMCwgMHg3RjEwNEYyNiwgMHgwMDBCNEYyNiwgMHgwMDAwMDAwOSwKKzB4MDAxRTEwMkYsIDB4MDAxRTEwODAsIDB4MDAxRTEwOTAsIDB4MDAxRTEwM0YsCisweDAwMUUxMDNFLCAweDAwMTE2NTZFLCAweDAwMTE2NTcwLCAweDAwMTE2NTcyLAorMHhEMjFERDExQywgMHg2NjIwNjAxMCwgMHg2NzZDNzAwMSwgMHgzNzAwQzkwRiwKKzB4RTUwMDhEMTMsIDB4NjcxMDYyMTAsIDB4NzcwMTYyMkMsIDB4NjQyMzIxNzAsCisweEQ2MTY2MDEwLCAweDQ0MDg0NDA4LCAweDM0MjhDOTBGLCAweDYyNjAyMTAwLAorMHg3MjAxRDUxMywgMHg0NDA4MjYyMCwgMHgwMDBCMzU0QywgMHhEMTBGNjA1MywKKzB4MjU1ODY1MTAsIDB4RTYwMDhEMTMsIDB4RDYwREQ0MEIsIDB4NjU1QzY1NDAsCisweDQ3MDg2NzUzLCAweDM3NTg0NzA4LCAweDQ3MDg2NTQwLCAweDI0NTA3NTAxLAorMHgzNjdDNjA0MCwgMHgyNDAwQzkwRiwgMHg3MkZGNjIxMCwgMHgwMDBCMjEyMCwKKzB4MDAwMDYwNjMsIDB4MDAxMTY0RjUsIDB4MDAxMTY0RjQsIDB4MDAxMTY0RjYsCisweDAwMTE2MTFDLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHg1NDRGMEQwQSwgMHg1MzIwNTM1NSwgMHg0NjIwNDk1MCwKKzB4MDAwMDNBNTcsIDB4MjA3NDYzNEYsIDB4MzIyMDMyMjAsIDB4MjAzNzMwMzAsCisweDMzM0EzODMxLCAweDM2MzQzQTMyLCAweDAwMDAwMDAwLCAweDAwMDAwRDBBLAorMHg0MjcwNzM3MiwgMHgzRDIwNjY3NSwgMHg1NTRFMjAzRCwgMHgyMDJDNEM0QywKKzB4NkU0OTY3N0EsIDB4NEU0OTcyNzQsIDB4NkQ3NTRFNTEsIDB4MDAwMDAwM0QsCisweDUyNTA0NTQ1LCAweDU3MjA0RDRGLCAweDY1NzQ2OTcyLCAweDY0NjEyMDJDLAorMHgwMDNENzI2NCwgMHg2QzYxNzYyMCwgMHgwMDAwMDAzRCwgMHgwMDAwMEEwRCwKKzB4NUEyMDU3NDYsIDB4NEQ0MzVGNEQsIDB4NEM0NjVGNDQsIDB4NUY0ODUzNDEsCisweDUzNDE1MjQ1LCAweDAwMEEwRDQ1LCAweDVBMjA1NzQ2LCAweDRENDM1RjRELAorMHg0QzQ2NUY0NCwgMHg1RjQ4NTM0MSwgMHg1MzRCNDg0MywgMHgwQTBENEQ1NSwKKzB4MDAwMDAwMDAsIDB4MkQ0OTUwNTMsIDB4NzI2NDY0NjEsIDB4MDAwMDAwM0QsCisweDJENDk1MDUzLCAweDY3NkU2NTZDLCAweDAwM0Q2ODc0LCAweDJENDk1MDUzLAorMHg3MzZCNjg2MywgMHgwMDNENkQ3NSwgMHg1QTIwNTc0NiwgMHg0RDQzNUY0RCwKKzB4NEM0NjVGNDQsIDB4NUY0ODUzNDEsIDB4NDQ0MTQ1NTIsIDB4MDAwMDBBMEQsCisweDYxMjAyMDcyLCAweDNENzI2NDY0LCAweDAwMDAwMDAwLCAweDcyMjAyMDIwLAorMHg3NTQyNzA3MywgMHgwMDAwM0Q2NiwgMHg2RTZCNkU1NSwgMHgyMDZFNzc2RiwKKzB4NkQ2RDZGNjMsIDB4M0Q2NDZFNjEsIDB4MDAwMDAwMDAsIDB4MDAwMDAwNzIsCisweDAwMjA1MjIwLCAweDAwMDAwRDBBLCAweDYyNzM1NTc2LCAweDc0NzM3MjVGLAorMHgwMDAwMEEwRCwgMHg2MjczNTU3NiwgMHg3Mzc1NzM1RiwgMHg2NDZFNjU3MCwKKzB4MDAwMDBBMEQsIDB4NjI3MzU1NzYsIDB4NzM2NTcyNUYsIDB4MDAwQTBENkQsCisweDcyNzQ2RTQ5LCAweDZENjUyMDUxLCAweDJDNzk3NDcwLCAweDQ5Njc3QTIwLAorMHg0OTcyNzQ2RSwgMHg3NTRFNTE0RSwgMHgwMDAwM0Q2RCwgMHg2NTRDNzI0NSwKKzB4MDAwMDAwNkUsIDB4MjA3NDZGNEUsIDB4NzU2RjZFNjUsIDB4NDkyMDY4NjcsCisweDQyMjA1MTRFLCAweDBBMEQ2Njc1LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDJFMDIwOSwgMHg4MDAwMDEwMSwKKzB4MDAwNDA5RkEsIDB4MDBGRjA0MDAsIDB4MDUwNzAwMDAsIDB4MDIwMDAyMDEsCisweDgyMDUwNzAwLCAweDAwMDIwMDAyLCAweDAzODMwNTA3LCAweDA3MDEwMDQwLAorMHg0MDAyMDQwNSwgMHgwMjA5MDAwMCwgMHgwMTAxMDAyRSwgMHgwOUZBODAwMCwKKzB4MDQwMDAwMDQsIDB4MDAwMDAwRkYsIDB4MDIwMTA1MDcsIDB4MDcwMDAwNDAsCisweDQwMDI4MjA1LCAweDA1MDcwMDAwLCAweDAwNDAwMzgzLCAweDA0MDUwNzAxLAorMHgwMDAwNDAwMiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwNzA5MDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgfTsKKworY29uc3QgdTMyX3QgemNGd0ltYWdlU1BJU2l6ZT0xMDE1NjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3dS5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZnd1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI3N2NiYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3dS5jCkBAIC0wLDAgKzEsMTAxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSAiY3ByZWNvbXAuaCIKKworY29uc3QgdTMyX3QgemNGd0ltYWdlW10gPSB7CisweDAwMDkwMDBCLCAweDRGMjIyRkU2LCAweERFOTQ3RkZDLCAweEUxMTRENTk0LAorMHgxRTEzRDQ5NCwgMHg2NzUyMUU0QywgMHhENDk0RDY5MywgMHgzNzQwMjc2OSwKKzB4NjI1MjhGMDYsIDB4NzIwMUQ2OTIsIDB4NjA2MDI1MjIsIDB4MjYwMEM5M0YsCisweEQ3OTA2MTUyLCAweDI1MTI2MTFELCAweDI2NEI2NjUyLCAweDI1NjI0NzBCLAorMHgwMDA5QjAxNywgMHhFNjAwOTVBQywgMHhDODQwNjBFMiwgMHgyRjAyOEYwMywKKzB4OEZGOTM2NTIsIDB4RDQ4ODc2MDEsIDB4NEUwQkRFODgsIDB4RDQ4ODAwMDksCisweDAwMDk0RTBCLCAweDRFMEJENDg3LCAweDdGMDQwMDA5LCAweEEwNTI0RjI2LAorMHg0RjIyNkVGNiwgMHg0MTBCRDE4NCwgMHhENDg0MDAwOSwgMHgwMDA5NDQwQiwKKzB4NDUwQkQ1ODMsIDB4RDc4MzAwMDksIDB4RDI4M0UxRkYsIDB4MjcxMjYxMUQsCisweEQ0ODI1MDI5LCAweEUxRkZDQjAxLCAweDEyMDlFNTAxLCAweDEyMTEyMjEyLAorMHhFNzIwMjQ1MiwgMHg0NzE4RDU3RSwgMHgyNTcyRDI3RSwgMHhEMTdFRTcwMCwKKzB4RDY3RkQ0N0UsIDB4RTIwMTIyNzAsIDB4MjQ3MDIxNzIsIDB4RDY3RDI2MjAsCisweDI2NDFFNEZGLCAweEQ1N0NFNjAwLCAweDY2NkRFMTA0LCAweDc2MDE2MDYzLAorMHg0MDAwNjI2RCwgMHg4RkY4MzIxMiwgMHhENTc4MDU0NSwgMHgyNTIwRTIwMSwKKzB4RDI3OEQ3NzcsIDB4RTQ4MEUxMDAsIDB4MjIxMjI3MTAsIDB4NjYxM0Q1NzYsCisweDY2NkQ2NDRDLCAweDc2MDQ2NzYzLCAweDM3NUM2MjZELCAweDhGRjgzMjQzLAorMHhENTcyMjcxMiwgMHhEMjczRDc3MiwgMHhFNDAwRTEwMSwgMHgyNzEwMjUxMSwKKzB4MDAwQjRGMjYsIDB4N0ZDQzIyNDIsIDB4RDE3MEQ1NkYsIDB4RDI3MURCNzAsCisweDFGNTFENDcxLCAweEQ2NzE3NTA4LCAweDFGMTJENzcxLCAweDFGNTU3MTBDLAorMHgxRkI5NzVGQywgMHg3MjA0MUYyQSwgMHgxRjEzRUIxMCwgMHgxRjU2MUY0NCwKKzB4MUY3ODFGNjcsIDB4RDg2QjFGMkIsIDB4REQ2Q0Q5NkIsIDB4REM2Q0VBMDAsCisweEQyNkRERTZDLCAweDg5MDAzQTIyLCAweEQxNUQ3QTAxLCAweDg4MDE2MDEwLAorMHg1NkY4OEIwMywgMHg0MjE4RTIwMSwgMHhEMTY4MjYyMiwgMHgwMDA5NDEwQiwKKzB4NDQwQkQ0NjcsIDB4RDU2NzAwMDksIDB4MDAwOTQ1MEIsIDB4NjAxMEQxNTAsCisweDhCMTA4ODAxLCAweEU2NTBEMTRGLCAweDQ2MTg2MjEyLCAweDhCMDgzMjY2LAorMHg1NkY5RDE0QiwgMHgyMTIwRTIwMCwgMHhDQjAxNjA2MiwgMHgyNjAyQTAwMywKKzB4NzIwMTI3MTAsIDB4NjA4MjIxMjIsIDB4ODkwOTg4MDEsIDB4RTJDOEQxNUEsCisweDYyMkM2NjEyLCAweDg5MDMzNjI2LCAweDYwMTBEMTU4LCAweDhCQzg4ODAxLAorMHg1MUY2Njc5MiwgMHgyMTcyNTJGNSwgMHhENjU1NTE5MSwgMHg1NUZBMjIxMiwKKzB4NTJGQjY0NjIsIDB4NTU2MTI1NDIsIDB4MjI1MkU0MDAsIDB4NjE0MzY2NDMsCisweDA1REU2MDEzLCAweDM2Q0M0NjA4LCAweDA3REUyNjUyLCAweEM5MDM2MDcxLAorMHg4QjAyODgwMSwgMHg3MjAxNjJFMiwgMHg3NDAxMkUyMiwgMHgzNkIzNjY0QywKKzB4NzEwNDhGRUUsIDB4NjZDMkQxNDcsIDB4NDUyODY1MTIsIDB4MjY1QjQ1MTgsCisweDYwODIyQzYyLCAweDg5MDE4ODAxLCAweDAwMDlBMTY4LCAweDYyNzJENzQyLAorMHg4QjEzMjIyOCwgMHhENDJCRDc0MSwgMHg2NzcyRDU0MSwgMHg1MTUzNjI0MiwKKzB4MzEyQzMyN0MsIDB4MjQyMjIyMjgsIDB4MTUxMzhEMDUsIDB4NjI2MkQ2M0QsCisweEIxNjI3MjAxLCAweEQ2MjMyNjIyLCAweDI2MjJFMjAwLCAweDUyOTE2NjkyLAorMHg4QjAxMzYyMCwgMHgwMDA5QTE0NCwgMHg2MDYxQTA2RSwgMHgwMDFDMDAxQywKKzB4MDAxRDQwMjAsIDB4MDAwMEIzOEUsIDB4RkZGRjAwMDAsIDB4MTIzNDAwMDAsCisweDAwMUUxMDE1LCAweDAwMjAxMjc0LCAweDAwMjAzOUY0LCAweDAwMjAxOEEyLAorMHgwMDIwM0EwMCwgMHgwMDIwM0ExOCwgMHgwMDIwMTg2MCwgMHgwMDIwMTk2QywKKzB4MDAyMDEyODgsIDB4MDAxQzM1MTAsIDB4MDAxQzM2MjQsIDB4MDAxRTIxMkMsCisweDAwMjAzOEY0LCAweDAwMjAzNDhDLCAweDAwMjAzOEZDLCAweDAwMjAzOTA4LAorMHgwMDIwMzkxNCwgMHgwMDIwMzk3MCwgMHgwMDIwMzk3NCwgMHgwMDIwMzkxQywKKzB4MDAyMDM5MUQsIDB4MDAyMDM5MjAsIDB4MDAxMTc3MDAsIDB4MDAyMDM5OEMsCisweDAwMjAzOThBLCAweDAwMjAzNEYwLCAweDAwMTE3NzEwLCAweDAwMUMzRDMwLAorMHgwMDFDMzZGOCwgMHgwMDExNzczNCwgMHgwMDFDMzY4NCwgMHgwMDFDM0QwMCwKKzB4MDAxQzEwMDAsIDB4MDAxQzEwMjgsIDB4MDAyMDM1MDQsIDB4MDAyMDM5MjQsCisweDAwMTE3NjAwLCAweDAwMTE3NzQwLCAweDdGRkZGRkZGLCAweDAwMjAxNzMwLAorMHgwMDIwMzMyQSwgMHgwMDIwMjMzNCwgMHgwMDIwM0RBNCwgMHgwMDIwMzk3MiwKKzB4MDAyMDM0RkMsIDB4MDAyMDM5NjQsIDB4MDAxQzNEMkMsIDB4MDAxQzM2QjAsCisweDAwMjAzNDk0LCAweDAwMTE3NzVDLCAweDg4MDFDOTBGLCAweEEwQ0Y4OTAxLAorMHhEMTk2MDAwOSwgMHgzNjIwNjIxMiwgMHhENDk1ODkwNCwgMHgyNDIxRTIwMCwKKzB4MjE2MkEwQ0MsIDB4NjIxMUQxOTMsIDB4ODkwMTIyMjgsIDB4MDAwOUEwQzMsCisweEUyMDJENzhGLCAweDc1MDE2NTcxLCAweDMxMjM2MTVELCAweDI3NTE4RDAyLAorMHgwMDA5QTBCQywgMHhEMjhDNTdGMiwgMHg2MjIyNjA3MiwgMHg0MDA5NDAxOSwKKzB4QzkwRjQwMDksIDB4OEYxOTg4MEEsIDB4NTJGMzFGMkMsIDB4NDAxOTYwMjIsCisweDQwMDk0MDA5LCAweDg4MDhDOTBGLCAweEEwQTc4OTAxLCAweDYwNjMwMDA5LAorMHhDQjAxNTRGNywgMHhEMjdFNTVGMiwgMHhFNzAxMjQwMiwgMHhENDdGRTEwMCwKKzB4MjIxMTI1NzIsIDB4NzIwMTYyNDIsIDB4MjQyMkEwOTgsIDB4OEIzRjg4MDUsCisweDYwMjI1MkYzLCAweDQwMDk0MDE5LCAweEM5MEY0MDA5LCAweDhCMTY4ODAyLAorMHhFNEZGRDU3NywgMHg2NDRENjc1MiwgMHg4QjEwMjc0OCwgMHg2MjcyRDc3NSwKKzB4OEIwQzMyNjAsIDB4NTFGMjU1RjcsIDB4RDI2REU3MDEsIDB4MjE3MjI1NjIsCisweEQ1NzFFMTAwLCAweDY0NTIyMjExLCAweEEwNzc3NDAxLCAweDUyRjMyNTQyLAorMHg0MDE5NjAyMiwgMHg0MDA5NDAwOSwgMHg4ODA1QzkwRiwgMHgzMUIzOEI2RSwKKzB4RDI2QThCNkMsIDB4NjcyMjU0RjQsIDB4NzcwMUQ1NjksIDB4NjE0MjIyNzIsCisweDFGMUNFNjQwLCAweDQ2MTgyMTU5LCAweDhCMDMzMTYwLCAweDYyNjJENjY1LAorMHgyNjIyNzIwMSwgMHhFMjAwRDY1QSwgMHgyNjIxQjA2NywgMHgwMDA5QTA1NiwKKzB4MzEyM0UyMjAsIDB4ODgwMzhCNTIsIDB4NTJGMzhCMUUsIDB4NDAxOTYwMjIsCisweDQwMDk0MDA5LCAweDg4MDNDOTBGLCAweEQyNUI4QjE2LCAweDY3MjI1NEY0LAorMHg3NzAxRDU1NywgMHg2MTQyMjI3MiwgMHgxRjFDRTY0MCwgMHg0NjE4MjE1OSwKKzB4OEIwMzMxNjAsIDB4NjI2MkQ2NTUsIDB4MjYyMjcyMDEsIDB4RTIwMEQ2NDgsCisweDI2MjFCMDQzLCAweDAwMDlBMDEwLCAweEQ0NTJENTUxLCAweEQyNDQ2NzUyLAorMHhFMTAwNzcwMSwgMHgyNTcyM0E0NiwgMHgyMjExOEYwNiwgMHhFQTAwRDY0RSwKKzB4NzIwMTYyNjIsIDB4MjYyMkIwMzEsIDB4MkZCMkQ1NEMsIDB4OTU3MzY2NTIsCisweEQ0NEE1QkYxLCAweDM2MjA1MjQxLCAweDYwNjE4OTEwLCAweDhCMDFDODAzLAorMHgyQjIyRTIwMSwgMHg4RkY1NDUxMCwgMHg1N0YxNTY2NCwgMHg2MjcyRTFGMCwKKzB4NDEyODQxMTgsIDB4MjcyMjIyMUIsIDB4NkJGMkEwMDgsIDB4NkJGMkEwMDYsCisweEUyMDBENjJGLCAweEQxMkYyNjIxLCAweDIxMjFFMjAwLCAweEQxM0NFMjAxLAorMHg2NjEyMjgyMiwgMHg4QjAxMjY2OCwgMHgwMDA5QUUyQiwgMHg0NTBCRDUzOSwKKzB4RDEzOTAwMDksIDB4QUUyNEU2MDAsIDB4MkY4NjIxNjAsIDB4MkZBNjJGOTYsCisweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweDdGRjQ0RjIyLCAweERFMzREMTMzLAorMHg1NDExNjIxMiwgMHgxRjQxNjdFMiwgMHgyRjIyRDQzMiwgMHhENTMyMUY3MiwKKzB4RDIzMjY3NDMsIDB4NTg0MTc3OTQsIDB4Njk0MjVBNDIsIDB4NUIxNjZDNzIsCisweDYwNTI2RDIyLCAweENCMjBFNjAwLCAweEU1NDAyNTAyLCAweDYyNkQ3NjAxLAorMHg4QkZCMzI1MywgMHg1NUYxNjJGMiwgMHgxMTUxMjEyMiwgMHhENjI4NTVGMiwKKzB4MTQ4MTJFNTIsIDB4MjQ5MjE0QTIsIDB4MjdDMkQ0MjYsIDB4MjZEMjExQjYsCisweERBMjU2NzQyLCAweEU4MDFEOTI1LCAweDQ5MEIyQTcyLCAweEUyMDExQThDLAorMHgxQTJDNDIxOCwgMHg0RjI2N0YwQywgMHg2REY2NkVGNiwgMHg2QkY2NkNGNiwKKzB4NjlGNjZBRjYsIDB4NjhGNjAwMEIsIDB4MDAwMDA3RDEsIDB4MDAyMDM5ODQsCisweDAwMjAzOTg4LCAweDAwMjAzOThFLCAweDAwMUMzREMwLCAweDAwMTE3NzJDLAorMHgwMDFDM0I4OCwgMHgwMDIwMzk2QywgMHgwMDExNzczQywgMHgwMDExNzc0NCwKKzB4MDAwMEYwMDAsIDB4MDAxMTc3NjQsIDB4MDAxMTc3NDgsIDB4MDAxMTc3NjgsCisweDAwMTE3NzZDLCAweDAxRkZGRkZGLCAweDAwMTE3NzRDLCAweDAwMjAzNEZDLAorMHgwMDIwM0RBNCwgMHgwMDIwMjRGOCwgMHgwMDIwMzk3MiwgMHgwMDFDM0I5QywKKzB4MDAxQzNEOTgsIDB4MDAxQzM3MDAsIDB4MDAxQzM1MDAsIDB4MDAxQzU5NjAsCisweDAwMUM4OTYwLCAweDAwMjAzNTA0LCAweDAwMUMzRDAwLCAweDAwMjAxNjBDLAorMHgyRjk2MkY4NiwgMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwKKzB4REU5NTdGQUMsIDB4NjFFMEUwMTQsIDB4MEYxNEQ0OTQsIDB4NzEwMTYxRTMsCisweEUwMTg2MjEwLCAweEQyOTIwRjI0LCAweDAwMDk0MjBCLCAweDQ1MEJENTkxLAorMHgyMDA4MDAwOSwgMHg4RjEyNkQwMywgMHhEMjhGMUYwNywgMHg2NzIwRDQ4RiwKKzB4NjU3Q0REOEYsIDB4NDcwQkQ3OEYsIDB4RDE4RjAwMDksIDB4NjE5QzY5MTAsCisweDQ2MDg2NjEzLCAweDM2MTg0NjA4LCAweDNENkM0NjA4LCAweEUwMTgxRkQ3LAorMHhFNTgwMDRGQywgMHg2MDRDNjZFMiwgMHgzMDUwNjU1QywgMHgyRDYyOEYxNSwKKzB4MDFGQ0UwMTQsIDB4REU4NUU1MDAsIDB4NjQxQ0EwMDgsIDB4Njc1MzY1NUQsCisweDYwNzAzN0VDLCAweDM5REM2OTUzLCAweDgwOTQ3NTAxLCAweDMyNDM2MjVELAorMHhENjdGOEJGNCwgMHhBMzRFRTIwMCwgMHgyMDA4MjYyMSwgMHhFMDE0OEIxMywKKzB4RTQwMDAxRkMsIDB4QTAwOURFNzksIDB4NjQ0RDY3MUMsIDB4MzVFQzY1NDMsCisweDY5NDM2NjUyLCAweDM5REM2MjYyLCAweDc0MDQxOTIxLCAweDMyNzM2MjRELAorMHhBMzM4OEJGMywgMHg4ODAxMkQxMCwgMHhFMDE0OEIxNywgMHhFNzAwMDFGQywKKzB4NkQxQzJENzAsIDB4REU2RDFGRDQsIDB4MzJEMzYyN0QsIDB4QTMyQThCMDEsCisweDY3N0QwMDA5LCAweDY2NzM2NUUzLCAweDYxNzM3NTA0LCAweDMxNUMzNkVDLAorMHg2OTEyNjQ2MiwgMHhBRkVGNzcwOCwgMHg4ODA0MjQ5MiwgMHhFMDE0OEIxOCwKKzB4RTQwMDAxRkMsIDB4NjcxQzJENDAsIDB4NjI0RERFNjAsIDB4OEIwMTMyNzMsCisweDAwMDlBMzExLCAweDY5NDM2NDRELCAweDM5RUM2MkUzLCAweDcyMDQ2NTkyLAorMHgzRDJDNkQ0MywgMHg2MTUyNjZEMiwgMHgyMTY5NzQwOCwgMHgyNTEyQUZFRCwKKzB4OEIxODg4MDUsIDB4MDFGQ0UwMTQsIDB4MkQ0MEU0MDAsIDB4REU1MzY3MUMsCisweDMyNzM2MjRELCAweEEyRjY4QjAxLCAweDY0NEQwMDA5LCAweDYyRTM2OTQzLAorMHg2NTkyMzlFQywgMHg2RDQzNzIwNCwgMHg2NkQyM0QyQywgMHg3NDA4NjE1MiwKKzB4QUZFRDIxNkIsIDB4ODgzMTI1MTIsIDB4RDQ0QThCM0EsIDB4NjE0NkQ5NEEsCisweDc1MDQ2NTQzLCAweDY3NTY2NDQyLCAweDZFNTMxRjQ4LCAweDY1NTI3RTA0LAorMHg3RUU0NjJFMiwgMHg3RTA0NjRFMiwgMHg2RUUyMUZFOSwgMHg1RUY5MjlFMCwKKzB4N0UwNEQ5NDIsIDB4MUZFQTYwRTIsIDB4MjkwMEM5MDEsIDB4RDk0MDZFRTIsCisweDI5RTA0RTA5LCAweDJGNTYyRjI2LCAweDU2RkFEOTNFLCAweDY1MTM0OTBCLAorMHhEMTNEN0YwOCwgMHhFNzFDNkUwRCwgMHgxREUxMkQ3MCwgMHhERTNCNjkxMiwKKzB4NjRFMjFEOTIsIDB4MUQ0M0QxM0EsIDB4RDIzQTY1MTIsIDB4NjcyMjFENTQsCisweDFENzVEMjM5LCAweDFENjY2NjIyLCAweDYyNjJENjM4LCAweDFEMjdBMkFCLAorMHg4QjM5ODgzMCwgMHg2NTk2RDkyQiwgMHg2NzkyNjY5NiwgMHg2MTk2NzkwNCwKKzB4NzRFNDY0OTMsIDB4NkU0MzY5OTIsIDB4MUY5QjdFMDQsIDB4MUZFQzY0NDIsCisweEQ5MjU2RUUyLCAweDVFRkMyOUUwLCAweDdFMDREOTI0LCAweDFGRUQ2MEUyLAorMHgyOTAwQzkwMSwgMHhEOTIyNkVFMiwgMHgyOUUwNEUwOSwgMHg1OUZDN0ZGQywKKzB4REUyNzJGOTIsIDB4MkYxNjRFMEIsIDB4RDQxRjdGMDgsIDB4RTIxQzYxMEQsCisweDFEMTEyRDIwLCAweEQyMjA2NDQyLCAweEQ0MUMxRDQyLCAweDFENTM2NTQyLAorMHg2NzUyRDUxQiwgMHhENzFCMUQ3NCwgMHgxRDE1NjE3MiwgMHgxRDY2NjYyMiwKKzB4NjI2MkQ2MUEsIDB4MUQyN0EyNkYsIDB4OEIzNTg4MzMsIDB4NDkwQkQ5MTksCisweEEyNjhFRTAwLCAweDAwMDAyREUwLCAweDAwMTE3ODAwLCAweDAwMjAzQTFDLAorMHgwMDIwMThBMiwgMHgwMDIwMkFBQywgMHgwMDIwMzkwRSwgMHgwMDIwM0EyMCwKKzB4MDAyMDM1MzQsIDB4MDAyMDE4RUUsIDB4MDAyMDM5MEQsIDB4MDAxMTc4MDQsCisweDAwMjAzOThDLCAweDAwMTE3ODEwLCAweDAwMjAzOTA5LCAweDAwMjAzOTBBLAorMHgwMDIwMzkwQiwgMHgwMDIwMEY2NCwgMHgwMDFDNTg2NCwgMHgwMDFDNjg2NCwKKzB4MDAxQzc4NjQsIDB4MDAxQzU5QkMsIDB4MDAxQzY5QkMsIDB4MDAxQzc5QkMsCisweDAwMjAwRkJDLCAweDAwMjAwRkI4LCAweDg5MDE4ODI4LCAweDAwMDlBMEMwLAorMHhFNjQzREVCNSwgMHgzMjY2NjJFMSwgMHgxRkVFOEYwMiwgMHgyRTIxRTI0MCwKKzB4NjIyRDYyRTEsIDB4OEIwMTMyNjcsIDB4MDAwOUEwQUEsIDB4RTUwMTg1RTEsCisweDhCMDEzMDU2LCAweDAwMDlBMEE0LCAweDJEMTBFMTAxLCAweDY0RTFCMjI1LAorMHhFNjQzNTdGRSwgMHg2NTJENjI3MSwgMHg4OTQ0MzU2NywgMHgzNTYzRTY0MCwKKzB4RTYwMDhCMDUsIDB4MEY2NUUwNDAsIDB4QTAwRkUxMUEsIDB4NjE1MzcyQzAsCisweDQxMjE0MTIxLCAweDQxMjE0MTIxLCAweDQ1MjE0MTIxLCAweDQ1MjE0NTIxLAorMHhDOTAzNjA1MywgMHhFMDQwNjYwMywgMHg3MTE4MEY2NSwgMHgyMjA5RTAwNywKKzB4MEYyNUUwM0MsIDB4RTA0NDY0MUQsIDB4QjJBMzY1RjMsIDB4RTMzQzBGNDYsCisweDg1MzIzM0ZDLCAweDYyMERERTk1LCAweDQyMDg2MDMxLCAweDYwMjM2MTBELAorMHgxMzIzRTk0NCwgMHgwNkZFNDEwOCwgMHhFMDBGMzlGQywgMHgxMzE0NEUwQiwKKzB4NjcwNzVEOTEsIDB4NjBEMzI2NzksIDB4MEY2NjU0RkUsIDB4NTE5Mjg1NDIsCisweDYwMEQ0RTBCLCAweDYwRDMyNjBCLCAweDBGNjY2NDkyLCAweDY1RjNCMjM3LAorMHg2OTYxNTZGRSwgMHhFNjQwNjU5RCwgMHg4OTM4MzU2MywgMHhENzgzNTlGRSwKKzB4NzkwNjY1OTEsIDB4QzkwMzYwNTMsIDB4NDAwMDQwMDgsIDB4NjEwMzYyMDMsCisweDBGMjZFMDUwLCAweDQ3MEJFMEZGLCAweDZDMDc2MDBDLCAweDY2MDM2MDVELAorMHg0NjIxNDYyMSwgMHg0NjIxNDYyMSwgMHg0MjAwNjI2MywgMHg0MjAwMzI2QywKKzB4NDAyMTQwMjEsIDB4NDAwOEM5MDMsIDB4NkQyRDMwRkMsIDB4RTgwMDZBMDMsCisweEIyNTc2NUYzLCAweDZFQTI2NEQzLCAweDJFQzlFMDUwLCAweDY2OTQyQUUyLAorMHhENzZFMDFGRSwgMHg2MDZDNDcwQiwgMHgyQUUyMkUwQiwgMHg2NEQzNjVGMywKKzB4NzgwMUIxRkQsIDB4RUUwNjYyOEQsIDB4OEZFOTMyRTMsIDB4NUVGRTdEMDEsCisweDYxRTFFNDAwLCAweDQxMDA4NUUxLCAweDY2RTMzMTBDLCAweDc2MEM3MTFCLAorMHhFNzA0NjVGMywgMHg2ODY2NzQwMSwgMHgzQTczNkE0RCwgMHg4RkY5MjU4MiwKKzB4NjVGMzc1MDQsIDB4NjQxREIxRTMsIDB4NjRFMUIxQTQsIDB4MDAwOUExN0IsCisweEQ0NUI1NkY3LCAweEVDMDFEMjVCLCAweDI2QzA0MjBCLCAweDAwMDlBMTczLAorMHgwNkZDRTAxOCwgMHg4ODI5NjA2QywgMHg1OEY3OEIwOCwgMHhFNDAwRDI1MiwKKzB4NjYyMjI4NDAsIDB4NjQ2REIxNzEsIDB4MDAwOUExNjUsIDB4NjY2Q0U2ODEsCisweDg5MDEzMDYwLCAweDAwMDlBMEFDLCAweEQ1NTBEMTRGLCAweDYyMTI2QTU2LAorMHgyMTIyMzJBQywgMHg1NDExNkM1NiwgMHgzNENDNjI1MywgMHg2NDUyMTE0MSwKKzB4NzIwODU4MTIsIDB4RDQ0QTM4NEMsIDB4NjgyMjExODIsIDB4NUExMzZDNDIsCisweDNBQ0MzQzhDLCAweDExQTMyNEMyLCAweDZDMjI3MkVDLCAweDcyMTA1ODE0LAorMHgxMTg0MzhDQywgMHg1QTE1NjgyMiwgMHgxMUE1M0E4QywgMHg2QTIyNzIxMCwKKzB4RDY0MDU4MTYsIDB4MTE4NjM4QUMsIDB4NTIxNzZDNjIsIDB4MTEyNzMyQ0MsCisweDVBMTg1ODYxLCAweDExQTgzQThDLCAweDVDMTk1QTYyLCAweDExQzkzQ0FDLAorMHg1MjFBNUM2MywgMHgxMTJBMzJDQywgMHg1QTFCNTg2NCwgMHgxMUFCM0E4QywKKzB4NUMxQzVBNjUsIDB4MTFDQzNDQUMsIDB4NTIxRDVDNjYsIDB4MTEyRDMyQ0MsCisweDVBMUU1ODY3LCAweDExQUUzQThDLCAweDU2MUY1QTY4LCAweDM2QUNFODQwLAorMHgxMTZGREEyRCwgMHg2Q0EyMzgxQywgMHg3QTk0NjY4MiwgMHgyODYyMzZDQywKKzB4NUM4MTYyQTIsIDB4MThDMTNDMkMsIDB4NjJBMjdBNDQsIDB4MzYyQzU2ODIsCisweEQ2MjYxODYyLCAweDVBODU2MjYyLCAweDNBMkM0MjI5LCAweDc2MDQxOEE1LAorMHg1Njg2NjI2MiwgMHgzNjJDNDIyOSwgMHg1NkY3MTg2NiwgMHgyNjIwRTIzOCwKKzB4MTZDMTVDODEsIDB4MTYyMjYyMTIsIDB4RTIwMDVDMTEsIDB4NTUxMjE2QzMsCisweDU1MTUxNjU0LCAweDU1MTMxNjU1LCAweDU1MTYxNjU2LCAweDU1ODIxNjU3LAorMHg2NTgyMTY1OCwgMHg1NTE0MTY1OSwgMHg1NTg0MTY1QSwgMHg1NTgzMTY1QiwKKzB4NTU4NTE2NUMsIDB4NTU4NjE2NUQsIDB4MTgyMTE2NUUsIDB4MTEyMTIxMjIsCisweDExMjUxMTIyLCAweDExMjYxMTIzLCAweDI4MjIxODIyLCAweDE4MjQxMTI0LAorMHgxODI1MTgyMywgMHgxODI2QTBDNywgMHgwMDExNzgwNCwgMHgwMDIwMzNFOCwKKzB4MDAyMDNBNDAsIDB4MDAyMDE4QTIsIDB4MDAyMDM0OTQsIDB4MDAxQzM2QTAsCisweDAwMjAzNEYwLCAweDAwMUMzQ0EwLCAweDAwMUMzNkY0LCAweDAwMUMzQjg4LAorMHg2NjZDRTY4MiwgMHg4QjIwMzA2MCwgMHhFQTI0NTZGNywgMHgyNkEwRDE5NCwKKzB4MTZDMTVDMTcsIDB4MTYyMjUyMTgsIDB4MTY4MzU4MTksIDB4MTZBNDVBMUEsCisweDE2QzU1QzFCLCAweDE2MjY1MjFDLCAweEUyMDA1ODFELCAweDU1MUUxNjg3LAorMHg1NTFGMTY1OCwgMHgxMTI3MTY1OSwgMHgxMTI5MTEyOCwgMHgxMTJCMTEyQSwKKzB4MTEyRDExMkMsIDB4QTA4RTExMkUsIDB4RTY4MzExMkYsIDB4MzA2MDY2NkMsCisweDUyRjc4QjBCLCAweEVBMDBEODgzLCAweDY1ODIyMkEwLCAweDc4MDREQzgyLAorMHg2MjgyMkM1MiwgMHhBMDdFRDY4MSwgMHhFNjkwMjYyMCwgMHgzMDYwNjY2QywKKzB4REE3RjhCMDYsIDB4MDAwOTRBMEIsIDB4RTIwMDU2RjcsIDB4MjYyMEEwNzMsCisweDY2NkNFNjkxLCAweDhCMTAzMDYwLCAweDYyMjJEMjc2LCAweDIyMjg2MjJDLAorMHhEMjc4ODkwNCwgMHgwMDA5NDIwQiwgMHgwMDA5QTAwMywgMHg0MjBCRDI3NiwKKzB4NTZGNzAwMDksIDB4QTA1RUUyMDAsIDB4RTY5MjI2MjAsIDB4MzA2MDY2NkMsCisweEUwMTg4OTUxLCAweEU2QjAwQkZDLCAweDY2NkM2MkJDLCAweDhCMkEzMjYwLAorMHgwMkZDRTAxNCwgMHg2ODJDRUEwMCwgMHg2MkFERTkwNCwgMHg4OTRBMzI4MywKKzB4NkFBRERENjQsIDB4M0NEQzZDQTMsIDB4N0QwNDZFQzIsIDB4REI2OEQ0NjcsCisweDMyREM2MkEzLCAweDRCMEJEQzY3LCAweDRDMEI2RDIyLCAweEQ0NjY2NEUzLAorMHgwMDA5NEIwQiwgMHg2NEQzNEMwQiwgMHg0QjBCRDQ2NCwgMHhFNjAwMDAwOSwKKzB4NjY2RDZCRTMsIDB4NzYwMTNCNkMsIDB4MzI5MzYyNkQsIDB4OEZGNzJCRDAsCisweEFGREE0RDE5LCAweEU2QjU3QTA4LCAweDMyNjA2NjZDLCAweEQ0NUM4QjEzLAorMHg0QjBCREI1NywgMHhEMjVCMDAwOSwgMHg2MDIyREI1QiwgMHhDQjIwRTZGRiwKKzB4MjIwMjY2NkQsIDB4REI1OTJCNjIsIDB4RTAxNEUyMDAsIDB4NTZGNzJCMjAsCisweEEwMTAwMkZDLCAweEQ0NTYyNjIwLCAweDY1NDJEMjU2LCAweDQyMEJENDU2LAorMHhBMDA4MDAwOSwgMHhEQjUyMDAwOSwgMHg1MkIxRTYwMCwgMHg2MjJDREI1MywKKzB4NTJGNzJCMjEsIDB4N0Y1NDIyNjAsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsCisweDZBRjY2QkY2LCAweDAwMEI2OUY2LCAweDRGMjI2OEY2LCAweEUyNDA2MTRELAorMHg4OTE0MzEyMywgMHgzMTI3RTIxRiwgMHg4QjA5RDc0OSwgMHhENDQ5NjE0RCwKKzB4RTAwMTcxRTAsIDB4NTY3MTQ0MEIsIDB4MjY1OTY1MDcsIDB4MTc2MUEwMDcsCisweEUwMDFENDQ0LCAweDY2NzI0NDBCLCAweDI2NTk2NTA3LCAweDRGMjYyNzYyLAorMHgwMDA5MDAwQiwgMHg2MTRENEYyMiwgMHgzMTIzRTI0MCwgMHhFMjFGODkxMiwKKzB4RDczQjMxMjcsIDB4NjE0RDhCMDgsIDB4NTY3MUQyM0EsIDB4NDIwQjcxRTAsCisweDI2MEJFMDAxLCAweDE3NjFBMDA2LCAweDY2NzJEMjM2LCAweEUwMDE0MjBCLAorMHgyNzYyMjYwQiwgMHgwMDBCNEYyNiwgMHhFNjQwMDAwOSwgMHg0NjI4NDYxOCwKKzB4NjI1MkQ1MzEsIDB4ODlGQzIyNjgsIDB4MDAwOTAwMEIsIDB4NDYxOEU2ODAsCisweEQ1MkQ0NjI4LCAweDIyNjg2MjUyLCAweDAwMEI4OUZDLCAweEEwMDEwMDA5LAorMHg3MjAxRTIwMCwgMHg4QkZDMzI0MiwgMHgwMDA5MDAwQiwgMHg0NjE4RTY4MCwKKzB4RDUyNjQ2MjgsIDB4MjI2ODYyNTIsIDB4MDAwQjhCRkMsIDB4MkZFNjAwMDksCisweDdGRkM0RjIyLCAweEJGRjE2RTUzLCAweDYxRTIyRjQyLCAweEUyODBENjIwLAorMHg1NEUxMTYxNSwgMHgxNjQ2NDIxOCwgMHg0MjI4NTVFMiwgMHg1N0UzMTY1NywKKzB4MTY3ODZFRjIsIDB4MjZFMjJFMkIsIDB4NEYyNjdGMDQsIDB4NkVGNkFGQ0UsCisweDAwMjAzNDk0LCAweDAwMTE3ODA0LCAweDAwMjAzOEY0LCAweDAwMjAzOTA4LAorMHgwMDIwMDUwQSwgMHgwMDIwMTAwOCwgMHgwMDIwMTAyRSwgMHgwMDIwM0E1OCwKKzB4MDAyMDE4QTIsIDB4MDAyMDE4RTYsIDB4MDAyMDNBNkMsIDB4MDAyMDNBNzQsCisweDAwMjAzQTc4LCAweDAwMUMzNTAwLCAweDAwMUMxMDAwLCAweDAwMjAzOThBLAorMHgwMDExNzgwMCwgMHgwMDIwMThFRSwgMHgwMDIwM0E4QywgMHgwMDIwMzk5MCwKKzB4MDAxQzM3MDQsIDB4MDAyMDMzRTgsIDB4MDAxQzM3M0MsIDB4MDAxQzM3MDAsCisweDAwMUMzNzBDLCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweDZDNTNERDEwLAorMHg2RTQzQkZBNCwgMHgyREUyQkY4OSwgMHgwMDA5QkZBMCwgMHgyQzEyNTFENSwKKzB4MUM0MTU0RDYsIDB4MUM1MjU1RDcsIDB4MUM2MzU2RDgsIDB4NkVGNjRGMjYsCisweDAwMEI2REY2LCAweDYxNjM2Q0Y2LCAweEEwMDRFNjAwLCAweDYyNTY0MTA5LAorMHgyNDIyNzYwMSwgMHgzNjEyNzQwNCwgMHgwMDBCOEJGOSwgMHgwMDAwMDAwOSwKKzB4MDAxQzM3MEMsIDB4MDAwOUExNkUsIDB4MkZFNjJGRDYsIDB4REQ5NDRGMjIsCisweEEwMDQ5RUIyLCAweEQ0OTMwMDA5LCAweDQyMEJEMjkzLCAweDYyRDI2NUQyLAorMHg4QkY4MjJFOCwgMHgwMDA5QTAwNCwgMHhEMjhGRDQ5MCwgMHg1NUQxNDIwQiwKKzB4MjJFODUyRDEsIDB4QTAwNDhCRjgsIDB4RDQ4RDAwMDksIDB4NDIwQkQyOEEsCisweDUyRDI1NUQyLCAweDhCRjgyMkU4LCAweDAwMDlBMDA0LCAweEQyODZENDg5LAorMHg1NUQzNDIwQiwgMHgyMkU4NTJEMywgMHhBMDA0OEJGOCwgMHhENDg2MDAwOSwKKzB4NDIwQkQyODEsIDB4NTJENDU1RDQsIDB4OEJGODIyRTgsIDB4NkVGNjRGMjYsCisweDZERjYwMDBCLCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweDZFNjM2QzczLAorMHg2RDUzQjAxQSwgMHg2NEQzNTdGNCwgMHhCMDVGNjVFMywgMHhCMDc1NjZDMywKKzB4QjBBNDAwMDksIDB4QjBBODAwMDksIDB4QjBBQzAwMDksIDB4QjBBQzAwMDksCisweEIwQUYwMDA5LCAweEIwMzE1NEY1LCAweDZDQ0Q2QzAzLCAweDRGMjY2MEMzLAorMHg2REY2NkVGNiwgMHg2Q0Y2MDAwQiwgMHgzNDEyRDE3MCwgMHhENjcwMDUyOSwKKzB4MjY1MEQ3NzAsIDB4Mjc0MjAwMEIsIDB4MDAwOUEwMTgsIDB4MkZENjJGQzYsCisweDRGMjIyRkU2LCAweDZFNjM2QzczLCAweDZENTNCRkVFLCAweDY0RDM1N0Y0LAorMHhCMDMzNjVFMywgMHhCMDhENjZDMywgMHhCMDBGNTRGNSwgMHg2Q0NENkMwMywKKzB4NEYyNjYwQzMsIDB4NkRGNjZFRjYsIDB4NkNGNjAwMEIsIDB4RTUwM0QxNjIsCisweEQ3NjNENDYyLCAweDIxNTI0NTE4LCAweDI0NzIwMDBCLCAweEQ0NUZEMTVFLAorMHgyMTYyRTYwMCwgMHgyNDYyMDAwQiwgMHhCRjczNEYyMiwgMHhCRjczRTQwQSwKKzB4RDI1QzAwMDksIDB4NDExOEUxMDQsIDB4RTQwQUU1MDAsIDB4QkY2OTIyMTIsCisweEQ3NTkyMjUyLCAweENCMjA2MDcyLCAweDAwMEI0RjI2LCAweDRGMjIyNzAyLAorMHg0MTBCRDE1NiwgMHhENTU2RTQwMCwgMHg0RjI2NDUyQiwgMHhEMTU1MkZFNiwKKzB4NjYxMjZFNjMsIDB4OTIxMDQ0MTgsIDB4NDQwODQ1MjgsIDB4NDUwMDI2MjksCisweDI2NUI0NDA4LCAweDI2NEI0NDAwLCAweDIxNjI0NzA4LCAweEQxNEU0NzA4LAorMHgyMTcyMjdFQiwgMHg2RUY2MDAwQiwgMHgxRkZGMDNGMCwgMHg0RjIyMkZFNiwKKzB4RTEwMURFNEEsIDB4QkYzREU0MEEsIDB4NjdFMzJFMTIsIDB4RTUwMDc3NkMsCisweEUyMDRFMTMwLCAweDI3NTJFNDBBLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLAorMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwKKzB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsIDB4MjcyMjI3MTIsCisweDI3NTIyNzUyLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLAorMHgxNzVBQkYxOCwgMHgyRTYyRTYwMCwgMHgwMDBCNEYyNiwgMHhEMjM0NkVGNiwKKzB4RTQ0MUUxMDEsIDB4MDAwQjIyMTIsIDB4RDEzMjIyNDIsIDB4RTYwNUQ0MzIsCisweDAwMEIyMTYyLCAweDAwMEIyNDYyLCAweEQyMzAwMDA5LCAweEU0MEFFNjAxLAorMHgyMjYyQUYwMCwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHg3RkZDNEYyMiwKKzB4NkM0M0RCMkIsIDB4RUQwMDYwQjIsIDB4MkIwMkNCMDMsIDB4QzkwMzYwQjIsCisweDZFMDNBMDA4LCAweDg5MDczREMyLCAweEU0NjQ2MEIyLCAweEIwN0NDOTAzLAorMHg3RDAxNkUwMywgMHg4QkY1MkVFOCwgMHg4RjA0M0RDMiwgMHhENDIxMkZFMSwKKzB4NDYwQkQ2MjEsIDB4NjJGMTAwMDksIDB4NjAyMzYyMkQsIDB4ODlGRkM4MDEsCisweDdGMDQ2MDIzLCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjYwMDBCLAorMHgwMDFDM0I4OCwgMHgwMDIwM0FBMCwgMHgwMDIwMThFRSwgMHgwMDIwM0FBOCwKKzB4MDAyMDNBQjAsIDB4MDAyMDNBQjgsIDB4MDAyMDNBQzAsIDB4MDAyNUU3MjAsCisweDAwMjAzREEwLCAweDAwMjAzOEY4LCAweDAwMUM1OTY4LCAweDAwMUMzQjQwLAorMHgwMDBGODAwMCwgMHgwMDFENDAwNCwgMHgwMDFDMzUwMCwgMHgwMDIwMTVFMCwKKzB4MDAyMDE2MEMsIDB4MDAxQzU4MTQsIDB4MDAxQzU5RDAsIDB4MDAxQzU4MzAsCisweDAwMUM2MjY4LCAweDAwMUM1OUE0LCAweDAwMUM2MzlDLCAweDAwMUM1ODFDLAorMHgwMDFDNTg2MCwgMHgwMDIwM0FDOCwgMHgwMDIwMThBMiwgMHg4RjAxNDQxMSwKKzB4NjA0MzYwNEIsIDB4MDAwOTAwMEIsIDB4NTY1MUQ1MkIsIDB4NDYyODYwNTIsCisweDMwNkMwMDBCLCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweDRGMTI0RjIyLAorMHhCRkYxNEYwMiwgMHg2QjAzNkU0MywgMHhERDI1REMyNCwgMHgwMDA5QkZFQywKKzB4M0MwNTMwQjgsIDB4NDYwOTA2MEEsIDB4NDYwMTQ2MDksIDB4MDIwQTNENjUsCisweDQyMDk0MjA5LCAweDMyRTI0MjA5LCAweDRGMDY4QkYwLCAweDRGMjY0RjE2LAorMHg2REY2NkVGNiwgMHgwMDBCNkNGNiwgMHgyRkM2NkJGNiwgMHgyRkU2MkZENiwKKzB4NEYxMjRGMjIsIDB4QkZDRjRGMDIsIDB4NkMwMzZFNDMsIDB4QkZDQkREMTMsCisweDMwQzgwMDA5LCAweDA2MEEzRDA1LCAweDQ2MDk0NjA5LCAweDM2RTI0NjAxLAorMHg0RjA2OEJGNSwgMHg0RjI2NEYxNiwgMHg2REY2NkVGNiwgMHg2Q0Y2MDAwQiwKKzB4NEYyMjJGRTYsIDB4RTEwMkRFMEIsIDB4RTQwM0U1MDAsIDB4QkZCOTJFMTIsCisweEU2MDYyRTUyLCAweEU3MDA0NjE4LCAweDJFNjJFNDAzLCAweDRGMjYyRTcyLAorMHg2RUY2QUZCMCwgMHgwMDA5MDAwQiwgMHgwMDFDMTA0MCwgMHhDQ0NDQ0NDRCwKKzB4MTA2MjRERDMsIDB4MDAxRDQwMDQsIDB4MkY5NjJGODYsIDB4MkZCNjJGQTYsCisweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweEU1MDA3Rjk4LCAweDY0NTNFNzEwLAorMHg2QjUzNDcyOCwgMHhFRTFBRENCQywgMHg2MTUzNjU1RCwgMHgzMTVDNDEwOCwKKzB4NzUwMTQxMDgsIDB4NjA0MzMxN0MsIDB4MEYxNjY2NUQsIDB4RUQwMDYwQjMsCisweDIxQjEzNkUzLCAweDgxMTI4MTExLCAweDExRDI4MTEzLCAweDExRDQxMUQzLAorMHg3NDA0OEZFQSwgMHhEOEIxNjdGMiwgMHgxODcxRDlCMSwgMHg1OEYxMjg3MiwKKzB4MTk4MUQxQjAsIDB4NTlGMjI5ODIsIDB4NURGNDVBRjMsIDB4NTRGNjVFRjUsCisweDIxOTIxMTkxLCAweDExQTIxMUEzLCAweDExRDQxMUQ1LCAweDExRTYxMUU3LAorMHgxMTQ4MTE0OSwgMHhEQUE4NTVGNywgMHg1N0Y4RUUwMCwgMHg1MkY5RERBNywKKzB4NjRFM0Q2QTcsIDB4MkE1MjFBNTEsIDB4RDhBN0Q5QTYsIDB4MkQ3MjlBRDUsCisweDZFRUQyNjIyLCAweDREMDg2REUzLCAweDNERUM2MUUzLCAweDREMDg0MTA4LAorMHgzRDlDMzFFQywgMHg0MTA4NjBCMywgMHg4MUQxMkRCMSwgMHg0MTA4RTA1MCwKKzB4NDAwOEU3QjcsIDB4Njc3QzQxMDgsIDB4NjBCMzgxRDIsIDB4RTIwMDMxOEMsCisweDgxRDMzNDcyLCAweDFEMTMxREQyLCAweDhEMDFENDkzLCAweEQ0OTAxRDI0LAorMHhCMEIzNjVEMywgMHg2NEVEN0UwMSwgMHg4QkRBMzRBMiwgMHgyRkQyREE4QywKKzB4REQ5MjY4QTIsIDB4MkQ4MjQ4MjksIDB4N0RGQzY0QTIsIDB4RDI4NzY5NEQsCisweDZFMjIyRDkyLCAweDdEMEM0RTI5LCAweDY4MjIyREUyLCAweDYxOEQ2QUQzLAorMHgyQTE2RDc4NCwgMHhENDhBNkQ3MiwgMHgyNEQyRDU4MywgMHhENjg5NUU3MiwKKzB4NTE3NDE0RTIsIDB4MTQxNEVFMDAsIDB4RDE4NzU4NzYsIDB4NTk3ODE0ODYsCisweDE0OThFNzEwLCAweDY1RTM2MjUyLCAweDI2RTIxNDJBLCAweEU2MDA2NEUzLAorMHg2ODQzNjQ0RCwgMHgzODRDNDgwOCwgMHgzODFDNDgwOCwgMHgwQzg2NjA1MywKKzB4MDlDRTI4QjEsIDB4ODE5MTYwQjMsIDB4MEFDRTYwNTMsIDB4ODFBMjYwNDMsCisweDBEQ0U2MDUzLCAweDgxRDM2MEIzLCAweDA4Q0U2MDUzLCAweDE4ODI3NDAxLAorMHg2MjREMDlDRSwgMHgwQUNFMTlFMywgMHgxQTY0MzI3MywgMHg3NTA0OEZFMCwKKzB4RTAwM0Q5NkEsIDB4NDAxODZDOTIsIDB4NkQ5MjJDQjEsIDB4ODFEMURBNkYsCisweDZFOTJFMDUwLCAweDgxRTI0MDA4LCAweDYwQjM2MTkyLCAweDY0OTI4MTEzLAorMHgxNDQyRTYwMCwgMHhENDY5Njc5MiwgMHg2ODkyMTdBMywgMHgxODY0RTFGRiwKKzB4NjU2M0U3MDMsIDB4MzY0QzQ2MDgsIDB4MjYxMjc1MDEsIDB4MzY3MzY2NUQsCisweERDNUI4QkY4LCAweDZEQzJFMDAzLCAweDJEQjE0MDE4LCAweEQyNjA2RUMyLAorMHg2MUMyODFFMSwgMHgxMTEyRUUwMCwgMHhFMDI0NjRDMiwgMHg2NUMyMTQyMywKKzB4MTVFNEQ0NUIsIDB4RTU4MDY3QzIsIDB4NjhDMjgxNzIsIDB4ODE4MzY2RTMsCisweDY2NkQ2NTVDLCAweDc2MDQ2OTYzLCAweDM5NEM2QTZELCAweDhGRjgzQTUzLAorMHhEQjU0MjlFMiwgMHgyNEIyREM1NCwgMHgyNEMyNzQwNCwgMHg0RjI2N0Y2OCwKKzB4NkRGNjZFRjYsIDB4NkJGNjZDRjYsIDB4NjlGNjZBRjYsIDB4NjhGNjAwMEIsCisweDYwMTE2MTQyLCAweDhGMDNDODAzLCAweEQyM0RFNTAwLCAweDhCMDYzNDIwLAorMHhDOTAzNjAxMSwgMHg4QjA2ODgwMiwgMHgzNDIwRDIzOSwgMHg1NjEyOEIwMywKKzB4NTI2NDY1MTMsIDB4MDAwQjI0MjIsIDB4MDExMzYwNTMsIDB4MkZFNjJGRDYsCisweDdGRUM0RjIyLCAweDYyNTM2RTUzLCAweDZENDNFNTUwLCAweDQ1MDhFNDAwLAorMHhFMTAxQTAwMSwgMHg2MDQzNTIyNCwgMHg4MTIxMjIxMSwgMHg2MDUzODEyMywKKzB4NTZFMjgxMjIsIDB4OEJGNTM2MjAsIDB4MTZFNEQyMzgsIDB4RTYxNDY0RjMsCisweDY1RTM0MjBCLCAweEU0RkM2NUUxLCAweDJFNTEyNTQ5LCAweDY1RjM2MUYxLAorMHgyRjExMjE0OSwgMHhEMTMxNTREMSwgMHhFNjE0NDEwQiwgMHg2MDcxNTdEMSwKKzB4MjcwMUNCMDEsIDB4N0YxNDFERTEsIDB4NkVGNjRGMjYsIDB4NkRGNjAwMEIsCisweDJGRTYyRkQ2LCAweDdGRUM0RjIyLCAweDY2NTM2RTUzLCAweDZENDNFNUZDLAorMHgyMDU5NjA2MSwgMHgyNjAxQ0IwMSwgMHgzMjYwNTJFMiwgMHgxMkU0OEIwNiwKKzB4MzFFMDUxRTIsIDB4NTJEMThCMDQsIDB4MUUyMkEwMDIsIDB4NTY2NEFGRjAsCisweDY0RjNEMjFFLCAweDQyMEJFNjE0LCAweDY3RTE2NUUzLCAweDI3MTlFMUZDLAorMHg2N0YxMkU3MSwgMHgyNzE5NTREMSwgMHg2NUYzRDExOCwgMHg0MTBCRTYxNCwKKzB4NTJEMTJGNzEsIDB4Q0IwMTYwMjEsIDB4MURFMTIyMDEsIDB4NEYyNjdGMTQsCisweDAwMEI2RUY2LCAweDAwMDA2REY2LCAweDAwMjAzOTI0LCAweDAwMjAzNEY0LAorMHgwMDIwMzRGQywgMHgwMDIwMzUwNCwgMHgwMDIwMzUyQywgMHgwMDIwMzkxMCwKKzB4MDAyMDM5MTgsIDB4MDAxMDAyMDgsIDB4MDAxMDE3QzAsIDB4MDAxRTIxMEMsCisweDAwMUMzRDAwLCAweDAwMjAzOTY0LCAweDAwMTAwMEM4LCAweDAwMTE3ODgwLAorMHgwMDExNzc4MCwgMHgwMDA0MDAyMCwgMHgwMDI2QzQwMSwgMHgwMDIwMEVENiwKKzB4NEYyMjJGRTYsIDB4REU0MjYyNEMsIDB4NDIwMDQyMDgsIDB4M0UyQ0EwMDUsCisweEQ0NDA1MjUyLCAweEJGNjk1NjI0LCAweDY1RTIyRTYyLCAweDM1MjA1MkUxLAorMHhENjNEOEJGNiwgMHg0RjI2MjYyMiwgMHg2RUY2MDAwQiwgMHgyRkM2MkZCNiwKKzB4MkZFNjJGRDYsIDB4REMzOTRGMjIsIDB4NTJDMURCMzksIDB4MzYyMDY2QzIsCisweDYwNjE4OTFDLCAweDg4MDFDOTAzLCAweERFMzQ4OTE4LCAweEJGMzdERDM1LAorMHg2NTAzNjRFMywgMHg2NkIyODUwMywgMHgzMjYyNjIwRCwgMHhENDMyODkwNywKKzB4MDAwOUJGNzYsIDB4NEQwQkQ0MzEsIDB4QUZFNjAwMDksIDB4QkYzRDAwMDksCisweEQ0MkY2NEUzLCAweDAwMDk0RDBCLCAweDAwMDlBRkRGLCAweDIyNjJEMjJELAorMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QkY2MDAwQiwgMHgyRkQ2MkZDNiwKKzB4NEYyMjJGRTYsIDB4REQyOURDMjgsIDB4NkU0MzYwQzIsIDB4MDRERTQwMDgsCisweEU2MTREMTI3LCAweDY1RTM0MTBCLCAweEQxMjdENzI2LCAweDU1RTIyN0UyLAorMHgzNUUwNTI1NCwgMHgyMTIyOEYwNCwgMHg0MDA4NjBDMiwgMHgxMjIyMDJERSwKKzB4NjA1MzY1QzIsIDB4NzUwMTQwMDgsIDB4MERFNjA2REUsIDB4QzkwRjYwNTMsCisweDYwNjMyQzAyLCAweDZFRjY0RjI2LCAweDAwMEI2REY2LCAweDg1NDM2Q0Y2LAorMHg2NTBENTY0MywgMHg2MjJENjI2MiwgMHgzNTI3NzIwNCwgMHhFMTAwOEYwQywKKzB4MjI2ODk2MEMsIDB4RDYxNThCMDMsIDB4NzIwMTUyNjEsIDB4RDYxMzE2MjEsCisweDYyNjJFMTAxLCAweDI2MjI3MjAxLCAweDYwMTMwMDBCLCAweDAwMDAwMUZGLAorMHgwMDIwMzUwNCwgMHgwMDIwMzRGQywgMHgwMDFDM0QwMCwgMHgwMDIwMzUyQywKKzB4MDAyMDM4RjQsIDB4MDAyMDE4QTIsIDB4MDAyMDM0RjQsIDB4MDAyMDNBRjAsCisweDAwMjAzQUY0LCAweDAwMUMzRDI4LCAweDAwMjAzOTY0LCAweDAwMjAzOTI0LAorMHgwMDIwMEVENiwgMHgwMDIwMzk2OCwgMHgwMDIwMzk2QywgMHgwMDExNzc1NCwKKzB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4N0ZGODRGMjIsIDB4NjAyMkQyMzcsCisweDhENThDODAzLCAweERFMzYyRjAxLCAweERCMzdEQzM2LCAweDY2QzI1MkMxLAorMHg4OTJGMzYyMCwgMHhDOTAzNjA2MSwgMHg4OTJCODgwMSwgMHhEMjMzREQzMSwKKzB4NjREMzQyMEIsIDB4MUYwMTY1MDMsIDB4ODgwMTYwQjEsIDB4RDIzMDhCMDQsCisweDY0RDM0MjBCLCAweDAwMDlBRkVBLCAweDg1NjE1NjUzLCAweDg5MDRDODIwLAorMHhFMDUwRDcyQywgMHg3MjAxMDI3RSwgMHhEMjJCMDcyNiwgMHg2NDUzNDIwQiwKKzB4ODkwNzIwMDgsIDB4NTVGMUQxMjYsIDB4NjREMzQxMEIsIDB4RTYwMUQ3MjcsCisweDI3NjJBRkQ0LCAweDU1RjFEMjI2LCAweDY0RTM0MjBCLCAweEU2MDFEMTI1LAorMHgyMTYyQUZDQywgMHhERDI1REUyNCwgMHhEQzI2REIyNSwgMHg2NkQyNTJEMSwKKzB4ODkxODM2MjAsIDB4QzkwMzYwNjEsIDB4ODkxNDg4MDEsIDB4RDExN0Q0MUYsCisweDAwMDk0MTBCLCAweDM2RTA1NjAzLCAweDY1MDM4RjA0LCAweDJCMjBFMjAxLAorMHgyQzUyQUZFQywgMHhENzEyRDQxQywgMHgwMDA5NDcwQiwgMHhFNjAxRDExNSwKKzB4QUZFMzQ2MTgsIDB4NjBGMTIxNjIsIDB4ODkwN0M4MDQsIDB4N0YwOEQyMTcsCisweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjY0MjJCLCAweDRGMjY3RjA4LAorMHg2REY2NkVGNiwgMHgwMDBCNkNGNiwgMHgwMDAwNkJGNiwgMHgwMDFFMjEwMCwKKzB4MDAyMDM1MDQsIDB4MDAyMDM0RkMsIDB4MDAyMDM5OEMsIDB4MDAyMDE0QTAsCisweDAwMjAxNENDLCAweDAwMjAzNDk0LCAweDAwMjAxNkJFLCAweDAwMUUyMTJDLAorMHgwMDIwMTUzMCwgMHgwMDFDM0QzMCwgMHgwMDExNzg4MCwgMHgwMDIwMzRGNCwKKzB4MDAyMDM5MTQsIDB4MDAyMDM5MTAsIDB4MDAyMDM1MkMsIDB4MDAyMDA2MTAsCisweEU2MDFEMjAzLCAweDEyNjVENTAzLCAweDAwMEIyMjUyLCAweDAwMDAxMjY2LAorMHgwMDFDMTAxMCwgMHgwMDAwQzM0RiwgMHgwMDA5MDAwQiwgMHgyRkQ2MkZDNiwKKzB4NEYyMjJGRTYsIDB4NkQ0MzZDNTMsIDB4RUUwMEEwMDQsIDB4N0UwMTY0RDQsCisweDY0NENCRkYyLCAweDhCRjkzRUMyLCAweDZFRjY0RjI2LCAweDAwMEI2REY2LAorMHhFNTAwNkNGNiwgMHg2NjQzQTAwMiwgMHg3NjAxNzUwMSwgMHgyMjI4NjI2MCwKKzB4QUZFMzhCRkEsIDB4MkZFNjAwMDksIDB4NzUwNzYyNTMsIDB4RTEwODY3NTMsCisweDYwNDNFRTBBLCAweDQ0MDlDOTBGLCAweDY1MDMzMEUyLCAweDhEMDE0NDA5LAorMHhFNjMwRTYzNywgMHg0MTEwMzY1QywgMHg4RkYyMjc2MCwgMHhFMDAwNzdGRiwKKzB4MDAwQjgwMjgsIDB4MDAwQjZFRjYsIDB4MDAwQkUwMDAsIDB4MkZFNkUwMDAsCisweDdGRUM0RjIyLCAweDZFNDM2MjUzLCAweEJGREM2NUYzLCAweEJGRDA2NDIzLAorMHhCRkNFNjRFMywgMHhENDAzNjRGMywgMHgwMDA5QkZDQiwgMHg0RjI2N0YxNCwKKzB4NkVGNjAwMEIsIDB4MDAyMDNBRjgsIDB4RTRGREQyOUYsIDB4RDc5RjYxMjIsCisweDIyMTIyMTQ5LCAweDc0MDE2MDIyLCAweDIyMDJDQjAxLCAweEQ1OUM2NjIyLAorMHgyMjYyMjY0OSwgMHhDODQwNjA3MCwgMHg2MDUyODkwMiwgMHgyNTAyQ0IwNCwKKzB4RTFGNzY0NTIsIDB4MjU0MjI0MTksIDB4RTcwMTYwNTIsIDB4MjUwMkNCNDAsCisweEU2MDI2MDUyLCAweDI1MDJDOUNGLCAweDQ3MTg2MDUyLCAweDI1MDJDQjEwLAorMHhDQjAzNjA1MiwgMHgxNTYyMjUwMiwgMHgxNTczMDAwQiwgMHhENzhFRDU4RCwKKzB4RDQ4RkQyOEUsIDB4RTYwMEUxMDAsIDB4MjcxMTI1MTEsIDB4QUZDQjIyMTAsCisweDY2NEMyNDYxLCAweDQ2MDBEMjhCLCAweDYwNjAzNjJDLCAweDAwMEJDQjEwLAorMHg2NTRDMjYwMCwgMHg0NTAwRDI4NywgMHg2NjUwMzUyQywgMHgyNjE5RTFFRiwKKzB4MjU2MDAwMEIsIDB4RDI4NDY2NEMsIDB4MzYyQzQ2MDAsIDB4Q0IxMDYwNjAsCisweDI2MDAwMDBCLCAweEQyODA2NTRDLCAweDM1MkM0NTAwLCAweEUxRUY2NjUwLAorMHgwMDBCMjYxOSwgMHg2NjRDMjU2MCwgMHg0NjAwRDI3QSwgMHg2MDYwMzYyQywKKzB4MDAwQkNCMDgsIDB4NjU0QzI2MDAsIDB4NDUwMEQyNzYsIDB4NjY1MDM1MkMsCisweDI2MTlFMUY3LCAweDI1NjAwMDBCLCAweEQyNzM2NjRDLCAweDM2MkM0NjAwLAorMHhDQjA4NjA2MCwgMHgyNjAwMDAwQiwgMHhEMjZGNjU0QywgMHgzNTJDNDUwMCwKKzB4RTFGNzY2NTAsIDB4MDAwQjI2MTksIDB4NjI0QzI1NjAsIDB4NDIwMEQ2NjksCisweDYwMjAzMjZDLCAweDQwMjFDOTA4LCAweDQwMjE0MDIxLCAweDYwMEMwMDBCLAorMHhENjY1NjI0QywgMHgzMjZDNDIwMCwgMHhDOTA4NjAyMCwgMHg0MDIxNDAyMSwKKzB4MDAwQjQwMjEsIDB4RDE2MTYwMEMsIDB4MzQxQzY0NEMsIDB4MDAwQjYyNDAsCisweEQxNUY2MDJDLCAweDM0MUM2NDRDLCAweDAwMEI2MjQwLCAweDJGRTY2MDJDLAorMHg2RTQzNEYyMiwgMHhFNjBBNjQ1QywgMHg4OTE0MzQ2NywgMHgwMDA5QkZFQiwKKzB4NjBFQzY0MEMsIDB4OEIwMjg4MDEsIDB4QTAwMkUwMEYsIDB4NDQwOTI0MDksCisweDYyNEM0NDA5LCAweDMyNjNFNjBBLCAweEJGRTI4OTA1LCAweDYyMEM2NDRDLAorMHhDODgwNjAyMywgMHhFMjAwOEIwMCwgMHg0RjI2NjAyMywgMHg2RUY2MDAwQiwKKzB4RDY0QzRGMjIsIDB4ODgwMTYwNjIsIDB4QjI1NzhCMDMsIDB4QTAwMzAwMDksCisweEQyNDkwMDA5LCAweDIyNjBFNjQwLCAweEUyMDBENjQ4LCAweDAwMEI0RjI2LAorMHg0RjIyMjYyMiwgMHg2MDYyRDY0MywgMHg4QjAxODgwMiwgMHgwMDA5QjJBMCwKKzB4RTIwMEQ2NDIsIDB4MDAwQjRGMjYsIDB4RDUzRTI2MjIsIDB4RTEwMEQ0M0UsCisweDI1MTJFNzAxLCAweDI0NzAwMDBCLCAweEU2MDREMjNCLCAweDIyNjAwMDBCLAorMHhENDNCNEYyMiwgMHg0MTBCRDEzQiwgMHhENTNCMDAwOSwgMHg2NjUwRTFGRCwKKzB4MjYxOUQyM0EsIDB4MjU2MEU3MDAsIDB4MDAwQjRGMjYsIDB4NEYyMjIyNzAsCisweEQyMzhENTM3LCAweEQ3Mzg2MTUyLCAweDI1MTI2MTFELCAweEU2RkY2NDUyLAorMHgyNTQyMjQyQiwgMHhEMjJGRDQzNSwgMHg0MjBCNjY2RCwgMHhENTJFMjc2MiwKKzB4Njc1MEUxRkIsIDB4NEYyNjI3MTksIDB4MjU3MDAwMEIsIDB4RDQzMDRGMjIsCisweDQxMEJEMTI4LCAweEQ1MjgwMDA5LCAweDY2NTBFN0Y3LCAweDRGMjYyNjc5LAorMHgyNTYwMDAwQiwgMHg5NDI1RDUyNCwgMHgyMjQ5NjI1MCwgMHgyNTIwMDAwQiwKKzB4RTRCRkQ1MjEsIDB4MjI0OTYyNTAsIDB4MjUyMDAwMEIsIDB4RDIyNTRGMjIsCisweDYwMEQ4NTIyLCAweDg5MTEyMDA4LCAweDg5NDU4ODAxLCAweDg5NDc4ODAzLAorMHg4OTQ5ODgwNSwgMHg4OTRGODgwNiwgMHg4OTU1ODgwOCwgMHg4OTVCODgwOSwKKzB4ODk2MTg4MEEsIDB4ODk2Nzg4MEIsIDB4MDAwOUEwNkUsIDB4MDAwOUIwNzAsCisweDYwMENBMDZCLCAweDAwMDBGRjdGLCAweDAwMUUyMTQ4LCAweDAwMUUxMDAwLAorMHgwMDFFMTEwOCwgMHgwMDIwMzlDNCwgMHgwMDIwMzlDNiwgMHgwMDIwMzlFNSwKKzB4MDAyMDM5QTgsIDB4MDAxRTEwM0YsIDB4MDAxRTEwNUYsIDB4MDAxRTEwMkYsCisweDAwMUUxMDkwLCAweDAwMjAzOUNDLCAweDAwMUUxMDBCLCAweDAwMjAzOUM4LAorMHgwMDIwM0FGQywgMHgwMDIwMThBMiwgMHgwMDFFMTAyOCwgMHgwMDIwMzlFNCwKKzB4MDAxRDQwMjAsIDB4OTg3NjAwMDAsIDB4MDAxQzEwMDAsIDB4MDAyMDNCMDgsCisweDAwMjAzQjE4LCAweDAwMjAzOTlDLCAweDAwMDlCMDRDLCAweDYwMENBMDM1LAorMHgwMDA5QjA1NSwgMHg2MDBDQTAzMSwgMHg2MjYwRDY4NCwgMHg4QjJCMjIyOCwKKzB4MDAwOUIwNjEsIDB4NjAwQ0EwMjksIDB4NjI2MEQ2ODAsIDB4OEIyMzIyMjgsCisweDAwMDlCMDY5LCAweDYwMENBMDIxLCAweDYyNjBENjdDLCAweDhCMUIyMjI4LAorMHgwMDA5QjBDNywgMHg2MDBDQTAxOSwgMHg2MjYwRDY3OCwgMHg4QjEzMjIyOCwKKzB4MDAwOUIwQ0QsIDB4NjAwQ0EwMTEsIDB4NjI2MEQ2NzQsIDB4OEIwQjIyMjgsCisweDAwMDlCMTI1LCAweDYwMENBMDA5LCAweDYyNjBENjcwLCAweDhCMDMyMjI4LAorMHgwMDA5QjEzRCwgMHg2MDBDQTAwMSwgMHg0RjI2RTAwMCwgMHgwMDA5MDAwQiwKKzB4RDI2Q0QxNkIsIDB4RDU2Qzg0MTIsIDB4NDAwMEM5MEYsIDB4RDc2QjAxMkQsCisweEU0MDNENjZCLCAweEUyMEY2MTFDLCAweDI1NDBFMDAxLCAweDI1MjAyNzEyLAorMHgyNjAyMDAwQiwgMHhFNjAxRDI2MiwgMHgzMDY2ODUyMywgMHhFMDAwOEQwNSwKKzB4RDY2M0QyNjAsIDB4RTAwMTgxMjIsIDB4MDAwQjI2MDIsIDB4RDI1QzAwMDksCisweDYwMEQ4NTIzLCAweDg5MDUyMDA4LCAweDhCMEE4ODAxLCAweDYwNjBENjVELAorMHgyNjAwQ0IwMSwgMHhENDU3RDY1QSwgMHhFMDAxRTEwMSwgMHgwMDBCMjYxMiwKKzB4MDAwQjgxNDIsIDB4RDE1MkUwMDAsIDB4ODUxM0U1MDEsIDB4NjQwRDQ1MTgsCisweDY2MDMzNDUzLCAweEUwMDA4RDA1LCAweEQ1NTFEMjUzLCAweDIyNjBFMDAxLAorMHgwMDBCMjUwMiwgMHg0RjIyMDAwOSwgMHg4NTEzRDE0OSwgMHg2NDUzNjUwRCwKKzB4NjI0OTQ0MTksIDB4MjI3RDY3MkUsIDB4ODgwMTYwMkMsIDB4ODgwMjg5MDksCisweDg4MDM4OTEwLCAweDg4MDY4OTFBLCAweDg4MDc4OTM1LCAweEEwNEM4OTNCLAorMHhENTQ2MDAwOSwgMHg2NjUyRDc0NiwgMHgyNzYyRDQ0NiwgMHg2MjJDNjI2MSwKKzB4MjQyMUEwMzgsIDB4MjIyODYyNUMsIDB4RDQ0MzhCM0YsIDB4NjY0MkQ1NDAsCisweDI1NjJENDQwLCAweDI0MDE4NTYxLCAweDYyMDNBMDJDLCAweDIwMDg2MDVDLAorMHg4ODEwODkwNywgMHg4ODIwODkwOCwgMHg4ODMwODkwOSwgMHhBMDJDODkwQSwKKzB4RDIzQTAwMDksIDB4NjIyMkEwMDgsIDB4QTAwNUQyMzksIDB4RDIzOTYyMjIsCisweDYyMjJBMDAyLCAweDYyNjJENjM4LCAweEQ0MzJENTMxLCAweDY2MjEyNTIyLAorMHhBMDBGNjI2QywgMHhENjM1MjQyMSwgMHg2MjYxRDUyRCwgMHg2MjJDRDQyRCwKKzB4QTAwNzI1NjIsIDB4RDYzMjI0MjEsIDB4ODU2MUQ1MjksIDB4MjU2MkQ0MjksCisweDYyMDMyNDAxLCAweDY2MkQ4NTE1LCAweDM2MTc2MTBELCAweDY1MDM4RjAxLAorMHhCMENCMjQ1MSwgMHhBMDAxMDAwOSwgMHhFMDAwRTAwMSwgMHgwMDBCNEYyNiwKKzB4RDYxOTAwMDksIDB4RDQyN0UxMDEsIDB4NjU0MTI2MTAsIDB4RDExOEQ3MTcsCisweEUyMEY2NTVELCAweDI3NTJFMDAxLCAweDAwMEIyNjIwLCAweDJGRTYyMTAyLAorMHhEMjBGNEYyMiwgMHg2NDBDODUyMywgMHg4QjA4MjQ0OCwgMHhENTExRDYxRCwKKzB4MjYyMUUyMDAsIDB4OTQwRjg0NTEsIDB4QTA0ODIwNDksIDB4REUwRDgwNTEsCisweEM4NDA2MEUwLCAweEUyMDE4RDMyLCAweDg5NDQzNDI3LCAweEQyMTZENjE1LAorMHgyNjQxNDIwQiwgMHgwMDA5QTAzMCwgMHgwMDAwRkY3RiwgMHgwMDIwMzlFNSwKKzB4MDAyMDM5OUMsIDB4MDAyMDM5QTgsIDB4MDAxRTExMDAsIDB4MDAxRTEwMEMsCisweDAwMjAzOUM4LCAweDAwMUUxMDAwLCAweDAwMUUxMDAxLCAweDAwMjAzOUQwLAorMHgwMDIwMzlCMCwgMHgwMDIwMzlCNCwgMHgwMDIwMzlCOCwgMHgwMDIwMzlENCwKKzB4MDAyMDM5RDgsIDB4MDAyMDM5REMsIDB4MDAyMDM5RTAsIDB4MDAyMDNFMDQsCisweDAwMjAzRTBFLCAweDAwMjAzOUMyLCAweDAwMjAyODg2LCAweDg5MTIzNDI3LAorMHhEMjk0RDY5MywgMHgyNjQxNDIwQiwgMHhDQjgwODRFMSwgMHg4MEUxQjBGNSwKKzB4RDY5MTYwRTAsIDB4MkUwMENCMDQsIDB4QzkzRjYwNjAsIDB4RDY4RjI2MDAsCisweEEwMDFFMDAxLCAweEUwMDAyNjAyLCAweDAwMEI0RjI2LCAweEQ2OEM2RUY2LAorMHhDODgwNjA2MCwgMHhEMjg2ODkxOSwgMHg4ODAxNjAyMSwgMHhEMjg5OEIxNSwKKzB4ODUyNEU1MDEsIDB4ODkxMDMwNTYsIDB4RTIwM0QxODcsIDB4MjEyMEQ0ODcsCisweEUwMEI2NTQxLCAweDA2NTY2NTVELCAweEU0MEZENTg1LCAweDIxNDBFNzAyLAorMHhENzdFMjU3MSwgMHgwMDBCRTAwMSwgMHgwMDBCMjcwMiwgMHgyRkU2RTAwMCwKKzB4REU4MDRGMjIsIDB4Qzg4MDg0RTEsIDB4RDU3QTg5MkMsIDB4MjAwODg1NTQsCisweDYxMDM4RjI4LCAweDg1NTNENzdDLCAweDY0MDM2NjcyLCAweDg1NjY2NTBDLAorMHgzNTIwNjIwQywgMHhENjc5OEIxRSwgMHg2NTFDRDc3NCwgMHgyNjUxNjQ0QywKKzB4NjBFMDI3NDEsIDB4ODkwNEM4NDAsIDB4NDIwQkQyNzUsIDB4QTAwMzAwMDksCisweEQyNjgwMDA5LCAweDAwMDk0MjBCLCAweDAwMDlCMDlGLCAweEUyMDFEMTY3LAorMHg2MEUwMjEyMiwgMHhDQjA0RDQ2NCwgMHg2MDQwMkUwMCwgMHgyNDAwQzkzRiwKKzB4NjAyM0EwMDEsIDB4NEYyNkUwMDAsIDB4NkVGNjAwMEIsIDB4MkZCNjJGQTYsCisweDJGRDYyRkM2LCAweERBNjIyRkU2LCAweDY2QTFFMjQwLCAweDM2MjJEQzVFLAorMHg2MjYzODkwMCwgMHg2RUQzNkQyQywgMHg0RTIxMzZEOCwgMHg0RTIxMkE2MSwKKzB4REI2MUQ0NjAsIDB4RTcwMEEwMEYsIDB4NzcwMTYyQjIsIDB4NzEwMjYxMjMsCisweDY2MjEyQjEyLCAweDcxMDI2MjEzLCAweDYxMjEyQjEyLCAweDY1MUQ2NjZELAorMHgzNTZDNDUyOCwgMHg2MjdDMjQ1MiwgMHg4QkVEMzJFMywgMHhDOTAzNjBEMywKKzB4OEIxMDg4MDMsIDB4NjE3MzY3QjIsIDB4MkIxMjcxMDIsIDB4NzEwMjZFMTMsCisweDJCMTI2NTcxLCAweDY1NUQ2REUxLCAweDQyMjg2MkRELCAweDMyNUNFMTA3LAorMHhBMDBDMkMxMCwgMHg4ODAyMjQyMiwgMHhBMDAzOEIwMSwgMHg4ODAxRTIwMywKKzB4RTIwMThCMDUsIDB4NjZCMjJDMjAsIDB4NjU1RDY1NjEsIDB4RTYwRjI0NTIsCisweDY3QTEyQzYwLCAweDhCMDUyNzc4LCAweEREMzhEQzQ0LCAweEVCMDFFQTAwLAorMHgyREIyMkNBMiwgMHg2REY2NkVGNiwgMHg2QkY2NkNGNiwgMHg2QUY2MDAwQiwKKzB4MkZFNjJGRDYsIDB4RTI0MEREMzYsIDB4MzYyMjY2RDEsIDB4NjI2Mzg5MDAsCisweDM2Nzg2NzJDLCAweDc3MDNERTM4LCAweDQ3MjEyRDYxLCAweDY0RTJENjM1LAorMHhBMDBFNDcyMSwgMHg2NTYyRTEwMCwgMHg2MjUzNzEwMSwgMHg3NDAxMjQ1MCwKKzB4MjQyMDQyMTksIDB4NDUyOTc0MDEsIDB4NzQwMTI0NTAsIDB4MjQ1MDQ1MTksCisweDYyMUM3NDAxLCAweDhCRUUzMjczLCAweDY2RTI0MjAwLCAweDQyMDA2MUQxLAorMHgyMTE4MzYyQywgMHgyRTYyOEYwNiwgMHhERDFDRDcyOCwgMHhFNTAxRTQwMCwKKzB4MkQ1MjI3NDIsIDB4MDAwQjZFRjYsIDB4MkZENjZERjYsIDB4NEYyMjJGRTYsCisweEVEMEFFRTAxLCAweDY0RTNCQzg1LCAweEJDOEE2NEUzLCAweDYyRUM3RTAxLAorMHg4QkY3MzJENywgMHhCQzhERUUwMSwgMHg2NEUzNjRFMywgMHg3RTAxQkM5MiwKKzB4MzJENzYyRUMsIDB4NEYyNjhCRjcsIDB4MDAwQjZFRjYsIDB4RDExODZERjYsCisweEQ0MTg5MjBELCAweDcyMTIyMTIyLCAweDI0MjJENjE3LCAweEQ3MTc3MjA0LAorMHg3MjIwMjYyMiwgMHgyNzIyRDExNiwgMHgwMDBCNzIzMCwgMHgxMzdBMjEyMiwKKzB4MDAyMDM5QzIsIDB4MDAyMDI5OTIsIDB4MDAxRTEwMTUsIDB4MDAyMDM5QzgsCisweDAwMUUxMDAxLCAweDAwMjAzOTlDLCAweDAwMUUxMTAwLCAweDAwMjAzOUM2LAorMHgwMDIwMzlCNCwgMHgwMDFFMTAwMCwgMHgwMDIwMzlCOCwgMHgwMDIwMzlDNCwKKzB4MDAyMDI4ODYsIDB4MDAxRTEwMEMsIDB4MDAyMDM5QjAsIDB4MDAyMDM5Q0MsCisweDAwMjAzOUQwLCAweDAwMjAzOUQ0LCAweDAwMjAzOUQ4LCAweDAwMjAzOURDLAorMHgwMDIwMzlFMCwgMHg0RjIyMkZFNiwgMHhENjcwN0ZGQywgMHg4ODAxNjA2MCwKKzB4RTIwMTg5NTEsIDB4MjYyMEJGQkIsIDB4RDU2RUQxNkQsIDB4REU2RTYwMTAsCisweDY0RTM2NTUyLCAweDc0MDJDODQwLCAweDhEMjJEMTZDLCAweEQyNkM3NTAyLAorMHhFNjAxRDc2QywgMHhFNzA0MjcyMiwgMHg3NjAxNjI1NSwgMHg2MjZDMjQyMSwKKzB4OEZGOTMyNzMsIDB4RDQ2Mzc0MDIsIDB4NjI0MkU2MDEsIDB4NjQwRDg1MjgsCisweDY3NDk0NDE5LCAweDI3NUQ2NTdFLCAweDgxRTQ2MDdDLCAweEU0MTdENTYyLAorMHg2NzU1NzYwMSwgMHgzMjQzNjI2QywgMHg4RkY5MjE3MSwgMHhBMDIwNzEwMiwKKzB4RDI1RTAwMDksIDB4RTYwMUQ3NUIsIDB4RTcwNDI3MjIsIDB4NzYwMTYyNTUsCisweDYyNkMyNDIxLCAweDhGRjkzMjczLCAweEQ0NTI3NDAyLCAweDYyNDJFNjAxLAorMHg2NDBEODUyOCwgMHg2NzQ5NDQxOSwgMHgyNzVENjU3RSwgMHg4MUU0NjA3QywKKzB4RTQxN0Q1NTMsIDB4Njc1NTc2MDEsIDB4MzI0MzYyNkMsIDB4OEZGOTIxNzEsCisweDkyODk3MTAyLCAweEQyNDYyRTIxLCAweDVFMjNENzRFLCAweDY0RjIyRkUyLAorMHg2MDQzNjVGMiwgMHgyNzAwQzk4MCwgMHhDOTYwNjA0MywgMHg4MDcxNjEwMywKKzB4QzkwMzYwNDMsIDB4ODA3MjQ1MTksIDB4NjVGMjYwNUMsIDB4ODE3MjY2RjIsCisweDQ2MTk0NjI5LCAweDYwNkM0NTI5LCAweDQwMTg2NDVDLCAweDgxNzMzMDRDLAorMHgyMTE4NUUyMywgMHg2NEYyMkZFMiwgMHg2RTRDNjJGMiwgMHg2MDJDNDIxOSwKKzB4NjZGMjYyRjIsIDB4NDYyOTQwMTgsIDB4NDYxOTMwRUMsIDB4NDIyOTgxNzQsCisweDY1MkM2MDZDLCAweDMwNUM0MDE4LCAweDgxNzU4RjA3LCAweDAwMDlCQzk2LAorMHgyMjI4NjIwQywgMHhBMDBBODkwOCwgMHg2MDEzMDAwOSwgMHg4QjAzODg0MCwKKzB4MDAwOUIwMDksIDB4MDAwOUEwMDMsIDB4RTIwMkQ2MkYsIDB4N0YwNDI2MjIsCisweDAwMEI0RjI2LCAweDRGMjI2RUY2LCAweDg1NTJENTJBLCAweDg4MzA2MDBELAorMHg4ODMxODkwMywgMHhBMDM0ODkyMywgMHg4NTU1MDAwOSwgMHhENDI4RDcyNywKKzB4ODU1MzI3MDEsIDB4NjEwREQ2MjcsIDB4MjQxMjQxMTgsIDB4NDYwQkQ0MjYsCisweEQ3MjMwMDA5LCAweEQyMjZENDI1LCAweDY1NzI0MjBCLCAweEUyMzBEMTIwLAorMHg0MjI4NjcxMiwgMHgyNzI5RTYyMCwgMHgzNzYwNDYyOCwgMHhENjIxOEIwMywKKzB4QTAxNkUyMDAsIDB4RDYxRjI2MjIsIDB4QTAxMkUyMDIsIDB4RDExODI2MjIsCisweDYyMTJFNTMwLCAweEU2MjA0NTI4LCAweDQ2MjgyMjU5LCAweDg5MDgzMjYwLAorMHhENDFBRDExOSwgMHhFNjAxRDUxMywgMHgyMTYwNDUwQiwgMHg0NzJCRDcxOCwKKzB4NEYyNjRGMjYsIDB4MDAwOTAwMEIsIDB4MDAwMDA2MEEsIDB4MDAyMDM5RTQsCisweDAwMUUxMDAwLCAweDAwMjAzOUQwLCAweDAwMjAzRTA0LCAweDAwMjAzRTEwLAorMHgwMDIwM0RBOCwgMHgwMDIwMzlCOCwgMHgwMDIwM0REOCwgMHgwMDIwM0RENiwKKzB4MDAyMDNEQUEsIDB4MDAyMDM5OUMsIDB4MDAyMDM5QzgsIDB4MDAyMDM5QjQsCisweDAwMjAzOUIwLCAweDAwMjAxOEEyLCAweDAwMjAzQjI0LCAweDAwMjAzQjI4LAorMHgwMDIwMThFRSwgMHgwMDIwMzlDQywgMHgwMDFFMTAwQiwgMHgwMDIwM0IzQywKKzB4MDAxMTQwMDQsIDB4NEYyMjJGRTYsIDB4REU5NjdGRkMsIDB4MjAwODg0RTksCisweDJGMDA4RDA2LCAweEQ2OTVENDk0LCAweDAwMDk0NjBCLCAweDY0RjBCMTlBLAorMHg2NjIwRDI5MywgMHg4OTAyMjY2OCwgMHhDOUJGNjBFMCwgMHg3RjA0MkUwMCwKKzB4MDAwQjRGMjYsIDB4MDAwQjZFRjYsIDB4MkZFNjAwMDksIDB4REU4RDRGMjIsCisweDYwRTBENjhELCAweENCQzBENDhELCAweDYyNjAyRTAwLCAweEM4MDM2MDJDLAorMHg0MDIxODkwNCwgMHg3MDAxNDAyMSwgMHg2NjAzQTAwMiwgMHg2NjAzNDAwOSwKKzB4RDY4NzYxNkQsIDB4RTUwMEEwMDQsIDB4NzUwMTYyNjIsIDB4NzQwNDI0MjIsCisweDMyMTM2MjVELCAweEQyODM4QkY4LCAweDAwMDk0MjBCLCAweEM5QkY4NEUyLAorMHg0RjI2ODBFMiwgMHg2RUY2MDAwQiwgMHgyRkU2MkZENiwgMHg3RkZDNEYyMiwKKzB4NjI2MEQ2N0QsIDB4ODk0NDIyMjgsIDB4RDU3MkUxMDAsIDB4NjA1MDI2MTAsCisweENCNDBENDdBLCAweDI1MDA0NDBCLCAweDhEMDUyMDA4LCAweDYyRTA2RTAzLAorMHg3MTA0NjEyQywgMHgyRjExQTAwNiwgMHhENDc1RDY2RCwgMHhERDc1Njc2MCwKKzB4NjU3QzREMEIsIDB4RTIzQzZEMUQsIDB4OEIwMzNEMjcsIDB4RDI2N0Q0NzIsCisweDAwMDk0MjBCLCAweDREMjE0RDIxLCAweEEwMDVENzcwLCAweDY2RTZFNDAwLAorMHgzNTdDNDUwOCwgMHg3NDAxMjU2MiwgMHgzNUQzNjU0RCwgMHhENzZDOEJGNywKKzB4NjE3MkUwMDMsIDB4ODExMTQwMTgsIDB4NkU3MjYwRjEsIDB4ODFFMjcwMEMsCisweEQ0Njg2MTcyLCAweERENjg4MTEzLCAweDREMEJERTY4LCAweEUyMDE2NTcyLAorMHhENDY3MkUyMiwgMHg0MjBCRDI1NSwgMHhENjU2MDAwOSwgMHhDOTNGNjA2MCwKKzB4N0YwNDI2MDAsIDB4NkVGNjRGMjYsIDB4NkRGNjAwMEIsIDB4MkZDNjJGQjYsCisweDJGRTYyRkQ2LCAweEQyNUY0RjIyLCAweDZCNDM2RTczLCAweDQyMEI2QzUzLAorMHgyMDA4NkQ2MywgMHg2NDAzOEQxQywgMHhFNTBFRDE0OSwgMHgzMjUyNjIxMCwKKzB4NjBDMzg5MTYsIDB4ODA0MTI0QjAsIDB4ODE0MTYwRDMsIDB4QTAwN0U1MDAsCisweDY1NUQ2MUJDLCAweDAwRUM2MDUzLCAweDM2NEM2NjUzLCAweDgwNjQ3NTAxLAorMHgzMjEzNjI1RCwgMHhENjNCOEJGNSwgMHhDOUJGNjA2MCwgMHgyNjAwQTAwOCwKKzB4RDIzQUQ0NEQsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjQyMkIsCisweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjYwMDBCLCAweDdGQzQ0RjIyLAorMHg3MjAyNjJGMywgMHgyMjUxMkY0MSwgMHg0NTI5NzIwMiwgMHg2MDYzMjI1MSwKKzB4RTVDNEU2ODIsIDB4NjdGMzgxMjEsIDB4NjU1QzY2NkMsIDB4RTQwOEJGQjYsCisweDRGMjY3RjNDLCAweDAwMDkwMDBCLCAweDJGOTYyRjg2LCAweDJGQjYyRkE2LAorMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHhFMTAwN0ZDNCwgMHg2NTEzRUNGRiwKKzB4NkIxMzZDQ0QsIDB4REUzNkQ3MzUsIDB4RURGRjY0RjMsIDB4RDgzNUVBMDQsCisweDYwNTM2NTVDLCAweDAyN0Q0MDAwLCAweDMyQzA2MjJELCAweDY2MDM4RDBELAorMHgwOUVENjA2MywgMHgyNDkxMDI3RCwgMHgyNDIxNzQwMiwgMHg2OTgyMDJFRCwKKzB4MzkyODYyMkQsIDB4NzQwMjI4OTIsIDB4NzUwMTcxMDQsIDB4NjA2MzYyNUMsCisweDA3RDUzMkEyLCAweDBFQjU4RkU0LCAweDI0NDg2NDFDLCAweEU2ODA4OTA1LAorMHg2N0YzRTVDNSwgMHhCRjc5NjY2QywgMHg3RjNDNjU1QywgMHg2RUY2NEYyNiwKKzB4NkNGNjZERjYsIDB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsIDB4RDExRTY4RjYsCisweDYwMTJEMjFFLCAweENCMjBFNDA1LCAweDIxMDJFNTAwLCAweDAwMEIyMjQyLAorMHgwMDAwMjI1MiwgMHgwMDFFMTAxNywgMHgwMDIwM0I0MCwgMHgwMDIwMThBMiwKKzB4MDAyMDM5MEUsIDB4MDAxRTEwMTUsIDB4MDAxRTEwQkYsIDB4MDAxMTc4MDAsCisweDAwMUUxMEZDLCAweDAwMjAwNjEwLCAweDAwMjAzOTE0LCAweDAwMjAyQUVBLAorMHgwMDIwM0I0NCwgMHgwMDIwMThFRSwgMHgwMDIwM0I2MCwgMHgwMDExNzg4QywKKzB4MDAyMDM5MTAsIDB4MDAyMDM0RjQsIDB4MDAyMDE1MzAsIDB4MDAxRTIxMzAsCisweDAwMjAzQjY4LCAweDAwMjAyQUFDLCAweDAwMjAzQjZDLCAweDAwMjAzOTc0LAorMHgwMDIwMzk3QywgMHgwMDIwM0RBNCwgMHgwMDFDMzUwMCwgMHgwMDFENDAwNCwKKzB4RDU2NEQxNjMsIDB4RTQwMEQ3NjQsIDB4MjE0MkUyMEYsIDB4MTc0MTExNTQsCisweEQ1NjIyNzIyLCAweDk2NjlENzYyLCAweDE1NDEyNTcyLCAweDk2NjYxNTYyLAorMHhFNjAxMTU2NSwgMHhENTVGMTE2NSwgMHg2NjZDRTZGOCwgMHgyNTQyMjU0MiwKKzB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsIDB4MjU2MjI1NDIsIDB4NzYwMUU3MjcsCisweDY3NjMyNTcyLCAweDI1NjI3Nzk3LCAweEU3MDQyNTcyLCAweDI1NzJFMjQ4LAorMHhFMjE5MjUyMiwgMHhFMjcwMjUyMiwgMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwKKzB4MjUyMjI1NDIsIDB4MjUyMkUyMEMsIDB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsCisweDI1NDIyNTQyLCAweDI1NDIyNTQyLCAweDAwMEIxNTRBLCAweEUyMDgxMTQ1LAorMHgwMDA5NDIyQiwgMHgyRkU2MkZENiwgMHg3RkZDNEYyMiwgMHhDODIwNjA0MywKKzB4NkU0MzhEMDIsIDB4MDAwOUJFNjcsIDB4QzgxMDYwRTMsIDB4QkU2NDg5MDEsCisweDYwRTMwMDA5LCAweDg5MDFDODQwLCAweDAwMDlCRTg2LCAweEM4MDE2MEUzLAorMHhERDNEODkzOCwgMHhDODAyNjBEMCwgMHgyRjAwOEQwMywgMHg0NjBCRDYzQiwKKzB4NjBGMDAwMDksIDB4ODkwMkM4MDQsIDB4NDYwQkQ2MzksIDB4NjJGMDAwMDksCisweEM4ODA2MDIzLCAweDYwRDA4OTAyLCAweDJEMDBDOTdGLCAweEM4MDE2MDIzLAorMHhENjM0ODkwNiwgMHgwMDA5NDYwQiwgMHgwMDA5QTAwNywgMHg1MTYzMDYwMSwKKzB4ODkwMkM4MDgsIDB4NDYwQkQ2MzAsIDB4NjBGMDAwMDksIDB4ODkwMkM4MTAsCisweDQyMEJEMjJFLCAweEQ1MkUwMDA5LCAweDg4MDI2MDUyLCAweEQyMkQ4QjAzLAorMHhBMDA1RTYwNCwgMHg4ODAxMjI2MCwgMHhEMjJBOEIwMiwgMHgyMjYwRTYwMSwKKzB4MjUyMkUyMDAsIDB4Qzg4MDYwRTMsIDB4RDIyNzg5MkQsIDB4NjBFMzZFMjAsCisweDg5MDJDODgwLCAweDQyMEJEMjI1LCAweDYwRTMwMDA5LCAweDg5MDJDODQwLAorMHg0MjBCRDIyMywgMHg2MEUzMDAwOSwgMHg4OTAyQzgwMiwgMHg0MjBCRDIyMSwKKzB4NjBFMzAwMDksIDB4ODkwREM4MDQsIDB4REQyMEQxMUYsIDB4MDAwOTQxMEIsCisweDAwMDlCRjBELCAweDAwMDlCRjRDLCAweEQ1MUVENDFELCAweDI0NzBFNzA4LAorMHgyNUQyQkY4NSwgMHhDODA4NjBFMywgMHhEMjFCODkwNSwgMHg0RjI2N0YwNCwKKzB4NDIyQjZFRjYsIDB4N0YwNDZERjYsIDB4NkVGNjRGMjYsIDB4NkRGNjAwMEIsCisweDAwMUM1ODFDLCAweEEwMDBBMDAwLCAweDAwMUQwMTAwLCAweDAwMUQ0MDAwLAorMHgwMDA0MDAyMSwgMHgwMDFDNTg5QywgMHgwMDFFMTAyMSwgMHgwMDIwMUE5MCwKKzB4MDAyMDFBQjIsIDB4MDAyMDIxMTQsIDB4MDAyMDFBQ0EsIDB4MDAyMDFBRDgsCisweDAwMjAzOUM4LCAweDAwMUUxMDBCLCAweDAwMUUxMDI4LCAweDAwMjAxQjQ0LAorMHgwMDIwMUI1MCwgMHgwMDIwMUFFMCwgMHgwMDIwMUFGRSwgMHgxMjM0NTY3OCwKKzB4MDAxRTEwMDAsIDB4MDAxMEYxMDAsIDB4MDAyMDFCMkMsIDB4NjQ0Q0Q2QTcsCisweDAwMEIzNDZDLCAweEQ2QTYyNDUwLCAweDM0NkM2NDRDLCAweDI0NTAwMDBCLAorMHg2NDRDRDZBNCwgMHgwMDBCMzQ2QywgMHg2MjVDMjQ1MCwgMHg0MjA4NjE2RCwKKzB4NDIwODQxMTksIDB4NDIwMDYwMTksIDB4NjcwRTYxNEMsIDB4RDQ5RTMyMUMsCisweDQyMDAyMDdELCAweDMyNENDOTBGLCAweDIyMDAwMDBCLCAweDQyMDg2MjVDLAorMHg0MjAwNDIwOCwgMHgzMjRDNjQ0QywgMHg0MjAwRDQ5OCwgMHgwMDBCMzI0QywKKzB4MkZFNjIyNjAsIDB4NjE0QzRGMTIsIDB4NDEwMEQ0OTMsIDB4NjcxMDMxNEMsCisweEUyOUY2NjZELCAweDI3Mjk0NjE5LCAweDZFNTM2MjY5LCAweDY3MkU2NTczLAorMHg0MjIxMjI3RCwgMHg0MjIxNDIyMSwgMHg3NjAxNjYyQywgMHhFNDAxNDYwOCwKKzB4MzRFODQ2MDgsIDB4NjQ0QzQ2MDAsIDB4MDcxQTA0NjcsIDB4MjE1MDI1N0IsCisweDAwMEI0RjE2LCAweDRGMjI2RUY2LCAweEQyODU3RkU4LCAweDg4MDE2MDIxLAorMHhEMjg0OEI3QiwgMHgyNjY4NjYyMSwgMHhEMjgzOEI3NywgMHgyNjY4NjYyMSwKKzB4RTUwRjhCNzMsIDB4RTQwMUJGQTIsIDB4QkZBNEU1MDEsIDB4RTU4NkU0MDAsCisweEU0MDA2NTVDLCAweDJGNTBCRkE0LCAweEJGQTFFNDAxLCAweEU2MDJFNTA2LAorMHg2MDYzNDYxOCwgMHg4MUYyRTQwMSwgMHg2NTQzQkY5RiwgMHhFNDAxODVGMiwKKzB4QkZBQjY1NDMsIDB4ODVGMjY2MDMsIDB4NjU0M0U0MDEsIDB4NjYwM0JGQjEsCisweEU0MDI2NUYwLCAweDYwNTM3NTZDLCAweDgwRjhCRjgwLCAweEJGODJFNDAyLAorMHg4NEY4RTUxMiwgMHg3MDkwRTQwMiwgMHg2NTAzQkY4MiwgMHg0NjE4RTYwMiwKKzB4ODFGNjYwNjMsIDB4QkY4MEU0MDIsIDB4ODVGNkU1MDAsIDB4NjYwM0U0MDIsCisweEU1MDBCRjhDLCAweEU0MDI4NUY2LCAweEJGOTI2NjAzLCAweEU1RkVFNTAwLAorMHhFMDEwNjU1QywgMHhCRjYxRTQwMywgMHhFNTEzMEY1NCwgMHhFNDBFQkY2MywKKzB4MDVGQ0UwMTAsIDB4QkY2M0U0MEUsIDB4RTUwMDc1ODUsIDB4QkY2NEU0MDMsCisweEU1MDBFNjQwLCAweEJGNzFFNDAzLCAweEU1MDBFNjQwLCAweEJGNzhFNDAzLAorMHhFNUZGRTY0MCwgMHhFMDE0NjU1QywgMHhCRjQ3RTQwNCwgMHhFNDBGMEY1NCwKKzB4RTUwNEJGNDksIDB4MDVGQ0UwMTQsIDB4QkY0OUU0MEYsIDB4RTUwMTc1ODQsCisweEJGNEFFNjQwLCAweEU1MDFFNDA0LCAweEJGNTdFNjQwLCAweEU1MDFFNDA0LAorMHhFNDA0RTY0MCwgMHhBRjVDN0YxOCwgMHg3RjE4NEYyNiwgMHgwMDBCNEYyNiwKKzB4NEYyMjAwMDksIDB4RDI0MjdGRjAsIDB4ODgwMTYwMjEsIDB4RDI0MThCNzEsCisweDI2Njg2NjIxLCAweEQyNDA4QjZELCAweDI2Njg2NjIxLCAweEU1MEY4QjY5LAorMHhFNDAxQkYxQywgMHhCRjFFRTUwMSwgMHhFNTg2RTQwMCwgMHhFNDAwNjU1QywKKzB4MkY1MEJGMUUsIDB4QkYxQkU0MDEsIDB4RTQwMUU1MDYsIDB4QkYxQzY1NDMsCisweEU0MDFFNjQwLCAweEJGMjk2NTQzLCAweEU0MDFFNjQwLCAweEJGMzA2NTQzLAorMHg2NUYwRTY0MCwgMHg3NTZDRTQwMiwgMHhCRUZGNjA1MywgMHhFNDAyODBGNCwKKzB4RTUxMkJGMDEsIDB4RTQwMjg0RjQsIDB4QkYwMTcwOTAsIDB4RTY0MDY1MDMsCisweEJGMDJFNDAyLCAweEU2NDBFNTAwLCAweEJGMEZFNDAyLCAweEU2NDBFNTAwLAorMHhCRjE2RTQwMiwgMHhFNUZFRTUwMCwgMHg2MDUzNjU1QywgMHhCRUU1RTQwMywKKzB4RTUxMzgwRjgsIDB4RTQwRUJFRTcsIDB4RTQwRTg0RjgsIDB4QkVFNzcwODUsCisweEU1MDA2NTAzLCAweEJFRThFNjQwLCAweEU1MDBFNDAzLCAweEJFRjVFNjQwLAorMHhFNTAwRTQwMywgMHhCRUZDRTY0MCwgMHhFNUZGRTQwMywgMHg2MDUzNjU1QywKKzB4QkVDQkU0MDQsIDB4RTQwRjgwRkMsIDB4RTUwNEJFQ0QsIDB4RTQwRjg0RkMsCisweEJFQ0Q3MDgzLCAweEU1MDE2NTAzLCAweEJFQ0VFNjQwLCAweEU1MDFFNDA0LAorMHhCRURCRTY0MCwgMHhFNTAxRTQwNCwgMHhFNDA0RTY0MCwgMHhBRUUwN0YxMCwKKzB4N0YxMDRGMjYsIDB4MDAwQjRGMjYsIDB4MDAwMDAwMDksIDB4MDAxRTEwMkYsCisweDAwMUUxMDgwLCAweDAwMUUxMDkwLCAweDAwMUUxMDNGLCAweDAwMUUxMDNFLAorMHgwMDIwMzlDMiwgMHgwMDIwMzlDNCwgMHgwMDIwMzlDNiwgMHhEMjFERDExQywKKzB4NjYyMDYwMTAsIDB4Njc2QzcwMDEsIDB4MzcwMEM5MEYsIDB4RTUwMDhEMTMsCisweDY3MTA2MjEwLCAweDc3MDE2MjJDLCAweDY0MjMyMTcwLCAweEQ2MTY2MDEwLAorMHg0NDA4NDQwOCwgMHgzNDI4QzkwRiwgMHg2MjYwMjEwMCwgMHg3MjAxRDUxMywKKzB4NDQwODI2MjAsIDB4MDAwQjM1NEMsIDB4RDEwRjYwNTMsIDB4MjU1ODY1MTAsCisweEU2MDA4RDEzLCAweEQ2MERENDBCLCAweDY1NUM2NTQwLCAweDQ3MDg2NzUzLAorMHgzNzU4NDcwOCwgMHg0NzA4NjU0MCwgMHgyNDUwNzUwMSwgMHgzNjdDNjA0MCwKKzB4MjQwMEM5MEYsIDB4NzJGRjYyMTAsIDB4MDAwQjIxMjAsIDB4MDAwMDYwNjMsCisweDAwMjAzOTBELCAweDAwMjAzOTBDLCAweDAwMjAzOTBFLCAweDAwMjAzNTM0LAorMHg3RkZDNEYyMiwgMHhFNjgwRDE5RiwgMHg2NjZDNjIxMiwgMHhEMjlFMkYyMiwKKzB4NjdGMzY1NjMsIDB4NDIwQjc1NDIsIDB4N0YwNEU0MDQsIDB4MDAwQjRGMjYsCisweEU2ODAwMDA5LCAweEQyOTg2NjZDLCAweEU3MDA2NTYzLCAweDQyMkI3NTQwLAorMHhFNjgwNjQ3MywgMHhEMjk0NjY2QywgMHhFNzAwNjU2MywgMHg0MjJCNzU0MywKKzB4MkY4NjY0NzMsIDB4MkZBNjJGOTYsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsCisweDdGQ0M0RjIyLCAweERDOEVEMjhELCAweDcyMDExRjIxLCAweERCOEQxRjIyLAorMHhEMThFREU4RCwgMHg2NjEyNTIxMSwgMHg4QjAxMzYyMCwgMHgwMDA5QTBFNSwKKzB4QzkwMzYwNjEsIDB4OEIwMTg4MDEsIDB4MDAwOUEwREYsIDB4RDI4OEQ0ODcsCisweEVEODQ0MjBCLCAweDJGMDI1NTAzLCAweDMwRDA4NDVDLCAweEEwQjg4OTAxLAorMHhEMTg0MDAwOSwgMHg2MjZDNjYxMCwgMHg4ODAxNjAyMywgMHhEMTgyOEI2OCwKKzB4NjIxMDFGQzMsIDB4ODk1QjIyMjgsIDB4RTAwM0Q0ODAsIDB4NDAxODY3NDIsCisweDY4NDIxNzcyLCAweEQ1N0VFOTAwLCAweDgxODE2REIzLCAweDdEMDQyMTkwLAorMHg2N0QyNkFCMiwgMHg2NEUyNjg1MiwgMHgxRjQ5MUY1NywgMHg3NDA0NjRFMywKKzB4MUZBNDY1NDIsIDB4NjU0MzFGNUEsIDB4NjI1Mjc1RjgsIDB4MUY3NjFGRDUsCisweDZENTMxRjJCLCAweERBNzRENzczLCAweDdEOTREMjc0LCAweDY4RDIxRjg4LAorMHg2QUEyNjk3MiwgMHhEMTcyNjAyMiwgMHgyMjAyQ0IyMCwgMHhFMTQwMUYxQywKKzB4NzYwMUU2MDAsIDB4MzIxMzYyNkQsIDB4NTZGNDhCRkIsIDB4NTJGNjUxRjUsCisweDIxMjIyQjYyLCAweDUyRjg1MUY3LCAweDIxMjI1NkY5LCAweDJFNjI1MUZBLAorMHg1MUZCMjQxMiwgMHgyRDgyMjUxMiwgMHhEOTY2Mjc5MiwgMHgyOUEyREQ1RiwKKzB4NkFEMkQ5NjUsIDB4RDk2NDY4OTIsIDB4NjhEMjFBODQsIDB4NjA4MURBNjMsCisweDI4MDFDQjAxLCAweEQ4NjI2NkQyLCAweDJBNjIyOTYyLCAweEVEMDE1QUZDLAorMHgyQUQyNDgwQiwgMHgyQUQyNEQxOCwgMHg2MkQyREQ1RSwgMHgyRDIyNzIwMSwKKzB4RDE1MDU2RjMsIDB4RTIwMjYwNjIsIDB4MjYwMkNCMDEsIDB4MjEyMEEwM0QsCisweDhCM0EyMjI4LCAweEU0MDFERDU4LCAweDIxNDBFNjAwLCAweEUwMUMyRDYyLAorMHhDODAxMDA1QywgMHhENDU1OEIwQSwgMHhFNjAwRDc1NSwgMHhFRDdEMjQ3MiwKKzB4NjI2Qzc2MDEsIDB4OEJGQjMyRDMsIDB4MjREMkRENTIsIDB4RTJGRTY4QzIsCisweDJDODIyODI5LCAweDA5NUNFMDFFLCAweEUwMUY1REYxLCAweDBBNUMyRDkwLAorMHg3NTEwNTFGMiwgMHhFRDA2MjFBMCwgMHhENzRCRTYwMCwgMHg4NDU2RDQ0QiwKKzB4MjcwMDc2MDEsIDB4Njk2QzY4NTQsIDB4MjQ4MDM5RDMsIDB4OEZGNjc0MDEsCisweERBNDc3NzAxLCAweDJBMTBFMTk0LCAweEUyMDA3QTAxLCAweDdBMEYyQTIwLAorMHhEMTMwRTgwNSwgMHg2NjEwMkE4MCwgMHg2MDIzNjI2QywgMHg4OTA4ODgwMSwKKzB4RDI0MEQ0MkEsIDB4NDIwQjY1RjIsIDB4RDEzMUVEMDEsIDB4QUYzMDREMTgsCisweDY1RjIyMUQyLCAweDg1NTNENDNDLCAweDYyMEQ2NjQyLCAweDg5MDczMjYyLAorMHhEMTNCRDQzQSwgMHgwMDA5NDEwQiwgMHhFNjAxRDczQSwgMHgyNzYyQUYxQSwKKzB4RDEzNEQ0MUUsIDB4NDEwQjY1RjIsIDB4RDEyNUVEMDEsIDB4RDYzN0Q0MzYsCisweDQ2MEI0RDE4LCAweEFGMEQyMUQyLCAweDdGMzQwMDA5LCAweDZFRjY0RjI2LAorMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwgMHgwMDBCNjlGNiwgMHg0RjIyNjhGNiwKKzB4ODU0NjdGRjQsIDB4MkYwMUU2ODEsIDB4NjY2Qzg1NDcsIDB4ODU0ODgxRjEsCisweDgxRjJEMjA5LCAweDY3RjM4NTQyLCAweDg1NDM4MUYzLCAweDgxRjRFNDBDLAorMHg2NTYzNjA1MywgMHg0MjBCODFGNSwgMHg3RjBDNzU0MCwgMHgwMDBCNEYyNiwKKzB4MDAwMDAwMDksIDB4MDAxQzNEOUMsIDB4MDAyMDI0NUMsIDB4MDAxMTc3OUEsCisweDAwMUMzNkY4LCAweDAwMUMzQjlDLCAweDAwMUMzNzA0LCAweDAwMjAzNTJDLAorMHgwMDIwMTRBMCwgMHgwMDIwMzkxRCwgMHgwMDIwMzkxQywgMHgwMDIwMzkxOCwKKzB4MDAxQzNEOTgsIDB4MDAxQzNCQjQsIDB4MDAxQzU5NjAsIDB4MDAxQzM1MDAsCisweDAwMUMzRDMwLCAweDAwMUM4OTYwLCAweDAwMjAzNTA0LCAweDAwMUMzRDAwLAorMHgwMDIwMTYwQywgMHgwMDExNzczMCwgMHgwMDIwMzkyMCwgMHgwMDFDNTgyQywKKzB4MjAwMEEwMDAsIDB4MDAwMEEwMDAsIDB4MDAxMTc3OEMsIDB4MDAxMTc3OTIsCisweDAwMTE3Nzg4LCAweDAwMjAxNENDLCAweDAwMjAzOEY0LCAweDAwMjAzNEY0LAorMHgwMDIwMTUzMCwgMHgwMDFFMjEzMCwgMHgwMDIwM0Q4NCwgMHgwMDIwMThBMiwKKzB4MkY5NjJGODYsIDB4MkZCNjJGQTYsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweEQxOUI3RkVDLCAweDJGMTJFMDAwLCAweDYxMDNENDlBLCAweDFGNDI4MUYyLAorMHhERDlBREE5OSwgMHhENjlBNjgxMywgMHhFMDAxNDgwOCwgMHg0NjBCREU5OSwKKzB4MzhFQzQ4MDAsIDB4NjVBMjFGMDMsIDB4MzUyMDUyQTEsIDB4QTIzRThCMDEsCisweDYwNTEwMDA5LCAweDg4MDFDOTAzLCAweEEyMzg4QjAxLCAweDUyNTMwMDA5LAorMHgzMkUwREU5MSwgMHhEOTkxOEIxMCwgMHg2NEEzNDkwQiwgMHg0QjBCREI5MCwKKzB4REU5MDY0MDMsIDB4RDc5MUQ2OTAsIDB4RUMwMUQ1OTEsIDB4MkUwMkUxMDAsCisweDI3MTAyNkMwLCAweDI1MDJBRkRGLCAweEM4MDE4NTUxLCAweEExNTc4QjAxLAorMHg2MjUxMDAwOSwgMHg0MjAwNjIyRCwgMHg1RTUzMzY2QSwgMHg4NUUyMjI2RCwKKzB4QzkwMzY0MkMsIDB4ODVFMzY2MDMsIDB4NjA1MzY1MEQsIDB4NDAyMTQwMjEsCisweDQ1MDBDOTNGLCAweDMyMkE2NzAzLCAweDYwNTMyNTJELCAweEM5MDFEMTdGLAorMHg2MDEwNkMwMywgMHg4ODAxRDk3RiwgMHhEQjdGOEIwNSwgMHgyMTIwRTIwMCwKKzB4Q0IwMTYwQjIsIDB4RDE3RDJCMDIsIDB4ODgwMTYwMTEsIDB4NjVBMjhCMEEsCisweDhEMDQyNDQ4LCAweDlCOUU2MjUxLCAweEEwMDMyMkI5LCAweDkxOUIyNTIxLAorMHgyNTIxMjIxQiwgMHgzN0IzRUIxMCwgMHgyNDQ4ODk1RSwgMHhENDczOEIwNywKKzB4MjIyODYyNDEsIDB4NjA2Mzg5MDMsIDB4QTA1NzgxRjgsIDB4RDU3MDY0NzMsCisweDQ2MDg0NjA4LCAweDg1RTI2MjczLCAweDQ2MDA2QjUwLCAweDM2MkM0MjAwLAorMHgyQkI4QzkxMCwgMHg4RjFGNjQ2MywgMHgyNjY4NjYwMywgMHhEMjY5ODkxMSwKKzB4MDYyRDYwNDMsIDB4NDExOTYxNkQsIDB4NkIwRTYwMTksIDB4ODFGODIwQkQsCisweDg4MDE2MEMzLCAweDY0NkM4RjJDLCAweDg4MEY2MDczLCAweEEwMjc4QjFCLAorMHhEMjYxMDAwOSwgMHgwNTJENjA0MywgMHg0MTE5NjE1RCwgMHg2NzBFNjAxOSwKKzB4NjQ1QzIwN0QsIDB4ODFGOEEwMUMsIDB4ODkwRjI2NjgsIDB4NjA0M0QyNUIsCisweDZCNUQwNTJELCAweDYwQjk0QjE5LCAweDIwMUQ2MTBFLCAweDYwQzM4MUY4LAorMHg4RjBEODgwMSwgMHg2NDczNjQ1QywgMHhFQzAwQTAwQSwgMHg2MDQzRDI1NCwKKzB4NjI1RDA1MkQsIDB4NjAyOTQyMTksIDB4MjA3RDY3MEUsIDB4ODFGODY0NUMsCisweDg4MDI4NUY4LCAweDg1RTE4OTBBLCAweDhEMDdDODIwLCAweEU2REM2MjAzLAorMHg2MDIzMjI2OSwgMHg4MUUxQTAwMiwgMHg2NDRDRTRGRiwgMHg2MjEwRDE0OSwKKzB4ODkwMTIyMjgsIDB4NjQ0Q0U0RkYsIDB4NjU0REVCRkYsIDB4MzVCMDZCQkMsCisweERCMzY4QjJCLCAweDY0QTM0QjBCLCAweDQxMEJEMTM1LCAweDU0MDM2NDAzLAorMHg4NTQ0NkUwMywgMHhDOTQ4REI0MCwgMHhEQzQwODgwOCwgMHhCRUFFOEIwMSwKKzB4NjRCM0U1MDIsIDB4NjVFMzRDMEIsIDB4REIzREVDMDEsIDB4RDEzRDJEQzIsCisweDYyMTI2MEIyLCAweDcyMDE3MDAxLCAweDIxMjI4ODA1LCAweDJCMDI4RjA4LAorMHg2NjZDRTY4MCwgMHg2NTYzRDIzOCwgMHg3NTQ5RTcwMCwgMHg2NDczNDIwQiwKKzB4QTAzMEQ0MzYsIDB4N0ZGRjAwMDksIDB4ODVFMjgwMDAsIDB4MjBCOUVCRkMsCisweDYxMDM4MUUyLCAweDk0MkE4NUUzLCAweDYyMDMyMDQ5LCAweDQ1MDg4NUY4LAorMHg4MUUyMjAxQiwgMHhDOTAxNjBDMywgMHg0MDA4NDAxOCwgMHg0MDA4NDAwOCwKKzB4NDAwMDIyNUIsIDB4NjAyMzIyMEIsIDB4ODVFNDgxRTMsIDB4NDExOEUxMDgsCisweDgxRTQyMDFCLCAweEU0MDI2MkEyLCAweDIwQjk4NTIxLCAweDY3QTI4MTIxLAorMHhDQjAxNjA3MSwgMHg4NUY4MjcwMSwgMHg4OTAzMzA0MiwgMHhFQ0U3ODVFMiwKKzB4ODFFMjIwQzksIDB4NDkwQkQ0MUUsIDB4QTAzQjAwMDksIDB4N0UwMzAwMDksCisweDAwMUMzRDMwLCAweDAwMjAzRDkwLCAweDAwMjAzNTA0LCAweDAwMUUyMTJDLAorMHgwMDIwMzNFOCwgMHgwMDFDM0QwMCwgMHgwMDExNzc4MCwgMHgwMDIwMTRBMCwKKzB4MDAyMDE2NkMsIDB4MDAxMTc3MEMsIDB4MDAyMDM5MUMsIDB4MDAyMDM5MUQsCisweDAwMjAzOTE4LCAweDAwMjAxOEEyLCAweDAwMUMzNkY4LCAweDAwMjAzOTkwLAorMHgwMDIwM0RBMCwgMHgwMDIwM0I4NCwgMHgwMDIwM0MwNCwgMHgwMDIwM0M4NCwKKzB4MDAyMDNEMDQsIDB4MDAyMDM5MDgsIDB4MDAyMDM0RkMsIDB4MDAyMDE0Q0MsCisweDAwMjAzOTk0LCAweDAwMjAzOTk4LCAweDAwMjAyNDVDLCAweDAwMjAzRDg4LAorMHgwMDIwM0Q4QywgMHg2MDIyNjJGMiwgMHg0MDA5NDAxOSwgMHhDOTBGNDAwOSwKKzB4OEIwQjg4MEEsIDB4NjBFMkRFOEMsIDB4NDAwOTQwMTksIDB4QzkwRjQwMDksCisweDhCMDM4ODA4LCAweENCMDE2MEEyLCAweDI4MDJBMDA2LCAweDY1RTJERTg3LAorMHgyRTUyNzUwMSwgMHgyODYyNjZBMiwgMHg1MkYzNjZGMiwgMHgyNjIyQUU4MywKKzB4RDI4Mzg1NTEsIDB4REU4M0M4MDIsIDB4QTA5NThCMDEsIDB4NDIwQjAwMDksCisweDRFMEI2NEEzLCAweDVFMDM2NDAzLCAweDg1RTQ2NTAzLCAweDQ5MThFOTA4LAorMHhENzdEMjA5QiwgMHhFMDRDODFFNCwgMHhEQzdDMEI3RSwgMHg3QjAxRDk3QywKKzB4NjFDMjA3QjYsIDB4NzEwMTY2OTAsIDB4OEQwNjI2NjgsIDB4RDQ3OTJDMTIsCisweDQyMEJEMjc5LCAweEEwNzBFQjAxLCAweDYyNTEyREIyLCAweDRCMThFQjBGLAorMHgyMkI5RTEwMiwgMHgzMjEwNDExOCwgMHg4NTUxOEIwRiwgMHgyMDI5RTJGQywKKzB4NjA1MTgxNTEsIDB4Q0IwMTcyRTAsIDB4ODVFMTI1MDEsIDB4MjAyOTk0QTMsCisweDg1RTQ4MUUxLCAweEEwNTIyMDQ5LCAweDY3NTE4MUU0LCAweDQ3MTk2NzdELAorMHg2NjdFNjc3OSwgMHg3NzAxMjc2RCwgMHg2OTAzNjA3QywgMHg4ODAxNDkxOCwKKzB4MjU5MThGM0UsIDB4NkIxMkQxNjEsIDB4MjFCMjdCMDEsIDB4NjYwRDg1RTMsCisweDQwMjE2MDYzLCAweEM5M0Y0MDIxLCAweDZDMDM0NjAwLCAweDI2MkQzMjJBLAorMHhDODAxNjA2MywgMHhEQjVFRDE1RCwgMHg5NjdEODkwMSwgMHhFNjAwMkM2QiwKKzB4NjY2QzY3Q0QsIDB4NDAwMDYwNjMsIDB4NjIyRDAyMUQsIDB4OEQwRTMyNzAsCisweDYwNDM2NDAzLCAweEU5RkYwMjFELCAweDhCMDEzMjkwLCAweDAxQzVBMDA3LAorMHg2MjZDNzYwMSwgMHgzMjkyRTkwNCwgMHg2NDZDOEJFQiwgMHg2MDQzNDQwMCwKKzB4RDE1MDA0QkQsIDB4MEI0NTc0MDEsIDB4NjY5RDY5MTEsIDB4ODkwNzM2NzAsCisweDYwMkQ2MjExLCAweDg5MDM4OEZGLCAweEUyMDFEQjRCLCAweDJCMjAyMUMxLAorMHhFQ0ZDODU1MSwgMHg4MTUxMjBDOSwgMHhDQjAxNjA1MSwgMHhEQzQ3MjUwMSwKKzB4NjRBMzRDMEIsIDB4NTFGMzY2RjIsIDB4ODVFRjI2MTIsIDB4NTRGMkQyNDQsCisweDY1MEQ0MjBCLCAweDAwMDlBREU3LCAweEU1MDBEQzQyLCAweDQyMEIyQzUyLAorMHg0RTBCNjRBMywgMHg1NDAzNjQwMywgMHg4NTQ0NkUwMywgMHg2NzAzRTkwOCwKKzB4NjUwMzQ5MTgsIDB4Mjc5OTg1NDEsIDB4REIzMjM3OTAsIDB4OEYwQkQ5MzIsCisweDYwMTM2MTBELCAweDhCMDdDODIwLCAweEM5NDg2MDUzLCAweDhCMDM4ODA4LAorMHhFNTAxQkQ0RCwgMHgwMDA5QTAwNSwgMHgyMTI4RDIzMywgMHhCRDQ2ODkwMSwKKzB4NjRCM0U1MDAsIDB4NDkwQjY1RTMsIDB4QURCQ0VDMDEsIDB4ODVGMjJEQzIsCisweDcwMDFFRTA0LCAweDMxRTc2MTBELCAweDhEMDI4MUYyLCAweEFEQTk3QTA4LAorMHg3RjE0MDAwOSwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwKKzB4MDAwQjY5RjYsIDB4RjdGRjY4RjYsIDB4MkZFNjgwMDAsIDB4RDIyMzRGMjIsCisweDYwRTM2RTIyLCAweDhEMDJDODQwLCAweEJCRjkyMkUyLCAweEUyNDAwMDA5LAorMHgyRTI4NDIxOCwgMHhCQzA0ODkwMSwgMHg2MEUzMDAwOSwgMHg4OTA1QzgxMCwKKzB4RDIxQ0Q0MUIsIDB4MDAwOTQyMEIsIDB4MDAwOUJDMDMsIDB4QzgwNTYwRTMsCisweEJENkQ4OTAxLCAweDYwRTMwMDA5LCAweDg5MDJDODAyLCAweEFDMDA0RjI2LAorMHg0RjI2NkVGNiwgMHg2RUY2MDAwQiwgMHgwMDFDM0QzQywgMHgwMDExNzc2MCwKKzB4MDAyMDE0QTAsIDB4MDAyMDE2NkMsIDB4MDAyMDM0OTQsIDB4MDAyMDNEQTQsCisweDAwMjAzOTA4LCAweDAwMjAzNEZDLCAweDAwMjAxNENDLCAweDAwMjAzOTc0LAorMHgwMDIwMzk3QywgMHgwMDIwMzk3MCwgMHgwMDIwMzk3MiwgMHgwMDIwMTUzMCwKKzB4MDAyMDE4RUUsIDB4MDAyMDM5OTQsIDB4MDAwMDgwMDAsIDB4MDAxQzM1MTAsCisweDAwMjAzRDk4LCAweDAwMjAxOEEyLCAweDA4MEEwQzBFLCAweDAwMDIwNDA2LAorMHgxQTFDMUUyMCwgMHgxMjE0MTYxOCwgMHgyRTMwMzIzNCwgMHgyNjI4MkEyQywKKzB4M0EzQzNFNDAsIDB4NkM2MjU2NDgsIDB4NDExMTJGMjYsIDB4RTIyMDhGMTgsCisweDg5MEIzMTIzLCAweDMyMUNEMjA0LCAweEQxMDI2MjIwLCAweDQxMkIzMTJDLAorMHgwMDA5MDAwOSwgMHgwMDIwMzQxMiwgMHgwMDIwMzNDOCwgMHgwMDBCRTAwMCwKKzB4NDAwMDYyRjYsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsCisweDYyRjYwMDBCLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLAorMHg0MDE4NDAwMCwgMHg2MkY2MDAwQiwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwKKzB4NDAwMDQwMDAsIDB4NDAyODQwMDAsIDB4NjJGNjAwMEIsIDB4NDAwMDQwMDAsCisweDQwMTg0MDAwLCAweDAwMEI0MDI4LCAweEM5MEY2MkY2LCAweDQwMDU0MDA1LAorMHg0MDA1NDAwNSwgMHg2MkY2MDAwQiwgMHg0MDA1QzkwNywgMHg0MDA1NDAwNSwKKzB4NjJGNjAwMEIsIDB4NDAwNUM5MDMsIDB4MDAwQjQwMDUsIDB4QzkwMTYyRjYsCisweDAwMEI0MDA1LCAweDAwMDA2MkY2LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDU0NEYwRDBBLCAweDQ2MjA1MzU1LCAweDAwMDAzQTU3LAorMHgyMDZDNzU0QSwgMHgzMjIwMzEyMCwgMHgyMDM4MzAzMCwgMHgzMjNBMzEzMiwKKzB4MzQzMzNBMzgsIDB4MDAwMDAwMDAsIDB4MDAwMDBEMEEsIDB4MDAwMDAwNDMsCisweDQyNzA3MzcyLCAweDNEMjA2Njc1LCAweDU1NEUyMDNELCAweDIwMkM0QzRDLAorMHg2RTQ5Njc3QSwgMHg0RTQ5NzI3NCwgMHg2RDc1NEU1MSwgMHgwMDAwMDAzRCwKKzB4NjE3NjZFNDksIDB4MjA2NDY5NkMsIDB4NzI2NTczNzUsIDB4MjA3MjZGMjAsCisweDIwNzk2NTZCLCAweDAwMjE0NDQ5LCAweDUyNTA0NTQ1LCAweDU3MjA0RDRGLAorMHg2NTc0Njk3MiwgMHg2NDYxMjAyQywgMHgwMDNENzI2NCwgMHg2QzYxNzYyMCwKKzB4MDAwMDAwM0QsIDB4MDAwMDBBMEQsIDB4NDM1RjRENUEsIDB4NDY1RjQ0NEQsCisweDRDNDQ1RjU3LCAweDQ5NEU0OTVGLCAweDAwMDAwMDU0LCAweDZFNkI2RTU1LAorMHgyMDZFNzc2RiwgMHg2RDZENkY2MywgMHgzRDY0NkU2MSwgMHgwMDAwMDAwMCwKKzB4MjAzQTMwNTEsIDB4MDAwMDAwMjAsIDB4MjAzQTMxNTEsIDB4MDAwMDAwMjAsCisweDIwM0EzMjUxLCAweDAwMDAwMDIwLCAweDIwM0EzMzUxLCAweDAwMDAwMDIwLAorMHgyMDNBMzQ1MSwgMHgwMDAwMDAyMCwgMHgyQjQzNDc0MSwgMHg3MzY5NkY0RSwKKzB4NjE0MzIwNjUsIDB4NzI2MjY5NkMsIDB4NkY2OTc0NjEsIDB4NjE2NjIwNkUsCisweDZGMjA2QzY5LCAweDY5NzQyMDZFLCAweDBEMEE2NTZELCAweDAwMDAwMDAwLAorMHgwMDAwMDA3MiwgMHgwMDIwNTIyMCwgMHgwMDAwMEQwQSwgMHg2MjczNTU3NiwKKzB4NzQ3MzcyNUYsIDB4MDAwMDBBMEQsIDB4NjI3MzU1NzYsIDB4NzM3NTczNUYsCisweDY0NkU2NTcwLCAweDAwMDAwQTBELCAweDYyNzM1NTc2LCAweDczNjU3MjVGLAorMHgwMDBBMEQ2RCwgMHgwMDAwMDA0NCwgMHg0NDM4NzU3MCwgMHg3MjYzNzM2NSwKKzB4NkY3NDcwNjksIDB4M0Q1ODQ1NzIsIDB4MDAwMDAwMDAsIDB4MDAwMDAwNDcsCisweDAwMDAwMDQyLCAweDcyNzQ2RTQ5LCAweDZENjUyMDUxLCAweDJDNzk3NDcwLAorMHg0OTY3N0EyMCwgMHg0OTcyNzQ2RSwgMHg3NTRFNTE0RSwgMHgwMDAwM0Q2RCwKKzB4NjU0QzcyNDUsIDB4MDAwMDAwNkUsIDB4MDAwMDAwNDksIDB4MjA3NDZGNEUsCisweDc1NkY2RTY1LCAweDQ5MjA2ODY3LCAweDQyMjA1MTRFLCAweDBBMEQ2Njc1LAorMHgwMDAwMDAwMCwgMHgwMDAwMDBGRiwgMHgwMDAyMDAwMSwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMTBFMDEwRCwgMHgwMDAyMDAwMywgMHgwMTA5MDEwOCwKKzB4MDAwMjAxMEEsIDB4MDIwMDAwMDMsIDB4MDIwMjAyMDEsIDB4MDIwNDAyMDMsCisweDAyMDYwMjA1LCAweDAyMDIwMjAwLCAweDAyMDQwMjAzLCAweDAyMEMwMjBCLAorMHgwMjBFMDIwRCwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwMDAwMEZGLCAweDAwMDIwMDAxLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAxMEUwMTBELCAweDAwMDIwMDAzLCAweDAxMDkwMTA4LAorMHgwMDAyMDEwQSwgMHgwMDAzMDAwMywgMHgwMjAyMDIwMSwgMHgwMjA0MDIwMywKKzB4MDIwNjAyMDUsIDB4MDIwMjAyMDAsIDB4MDIwNDAyMDMsIDB4MDIwQzAyMEIsCisweDAyMEUwMjBELCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDEwRTAxMEQsIDB4MDBGRjAxMEYsIDB4MDEwOTAxMDgsCisweDAxMEIwMTBBLCAweDAyMDAwMTBGLCAweDAyMDIwMjAxLCAweDAyMDQwMjAzLAorMHgwMjA2MDIwNSwgMHgwMjAyMDIwMCwgMHgwMjA0MDIwMywgMHgwMjBDMDIwQiwKKzB4MDIwRTAyMEQsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMTBFMDEwRCwgMHgwMEZGMDEwRiwgMHgwMTA5MDEwOCwKKzB4MDEwQjAxMEEsIDB4MDEwRjAxMEYsIDB4MDIwMjAyMDEsIDB4MDIwNDAyMDMsCisweDAyMDYwMjA1LCAweDAyMDIwMjAwLCAweDAyMDQwMjAzLCAweDAyMEMwMjBCLAorMHgwMjBFMDIwRCwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwMjA1MjIwLCAweDAwMDAwMDQ2LCAweDAwMDAwMDU5LAorMHg3MzIwNDE0MiwgMHgwMDNENzE2NSwgMHg0OTU0NDEyMCwgMHgwMDAwMjA0RCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAyRTAyMDksIDB4ODAwMDAxMDEsCisweDAwMDQwOUZBLCAweDAwRkYwNDAwLCAweDA1MDcwMDAwLCAweDAyMDAwMjAxLAorMHg4MjA1MDcwMCwgMHgwMDAyMDAwMiwgMHgwMzgzMDUwNywgMHgwNzAxMDA0MCwKKzB4NDAwMzA0MDUsIDB4MDIwOTAxMDAsIDB4MDEwMTAwMkUsIDB4MDlGQTgwMDAsCisweDA0MDAwMDA0LCAweDAwMDAwMEZGLCAweDAyMDEwNTA3LCAweDA3MDAwMDQwLAorMHg0MDAyODIwNSwgMHgwNTA3MDAwMCwgMHgwMDQwMDM4MywgMHgwNDA1MDcwMSwKKzB4MDAwMDQwMDIsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDcwOTAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCit9OworCitjb25zdCB1MzJfdCB6Y0Z3SW1hZ2VTaXplPTE1OTM2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZnd1LmMuZHJ2X2JhX3Jlc2VuZCBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3dS5jLmRydl9iYV9yZXNlbmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y1YmNmZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3dS5jLmRydl9iYV9yZXNlbmQKQEAgLTAsMCArMSw3NDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgImNwcmVjb21wLmgiCisKK2NvbnN0IHUzMl90IHpjRndJbWFnZVtdID0geworMHgwMDA5MDAwQiwgMHg0RjIyMkZFNiwgMHhERTI5N0ZGQywgMHhFMTE0RDcyOSwKKzB4MUUxM0Q0MjksIDB4MUU0QzQ3MEIsIDB4MDAwOUIwMTgsIDB4QTAwMzk1NDUsCisweDM2NTJFNjAwLCAweDc2MDE4RDA0LCAweEM4NDA2MEUyLCAweDJGMDI4REY5LAorMHhERTIzRDQyMiwgMHgwMDA5NEUwQiwgMHg0RTBCRDQyMiwgMHhENDIyMDAwOSwKKzB4MDAwOTRFMEIsIDB4NEYyNjdGMDQsIDB4NkVGNkEwMjQsIDB4RDExRjRGMjIsCisweDAwMDk0MTBCLCAweDQ0MEJENDFFLCAweEQ1MUUwMDA5LCAweDAwMDk0NTBCLAorMHhFMUZGRDcxRCwgMHhEMjFENjExRCwgMHg1MDI5MjcxMiwgMHhDQjAxRDQxQywKKzB4RTUwMUUxRkYsIDB4MjIxMjEyMDksIDB4MjQ1MjEyMTEsIDB4RDYxQUQ1MTksCisweEUyMDA5NzE0LCAweEQ0MTkyNTcyLCAweEQ2MTkyNjIwLCAweDRGMjYyNDIyLAorMHgyNjIyMDAwQiwgMHhERDE4REMxNywgMHg0QzBCREUxOCwgMHg0RDBCMDAwOSwKKzB4NEUwQjAwMDksIDB4QUZGODAwMDksIDB4MjcxMDAwMDksIDB4MDAwMDA2NDAsCisweDAwMUMwMDFDLCAweDAwMjAwQkM0LCAweDAwMDBCMzhFLCAweDAwMjAyOUY4LAorMHgwMDIwMEY3MiwgMHgwMDIwMkEwNCwgMHgwMDIwMkExQywgMHgwMDIwMEYyMCwKKzB4MDAyMDEwNTYsIDB4MDAyMDBDMUMsIDB4MDAxQzM1MTAsIDB4MDAxQzM2MjQsCisweDAwMUUyMTJDLCAweDAwMjAyOTk0LCAweDAwMjAyNTMwLCAweDAwMjAyOTlDLAorMHgwMDIwMjlBOCwgMHgwMDIwMEU1MCwgMHgwMDIwMjNFNiwgMHgwMDIwMTkyMCwKKzB4MkZDNjJGOTYsIDB4MkZFNjJGRDYsIDB4N0Y5MDRGMjIsIDB4RTAyMERFOEQsCisweEQ0OEQ2MUUwLCAweDYxRTMwRjE0LCAweDYyMTA3MTAxLCAweEUwMjRENzhCLAorMHgwRjI0NDcwQiwgMHg0NTBCRDU4QSwgMHgyMDA4MDAwOSwgMHg4RjExNkQwMywKKzB4REQ4ODFGMEEsIDB4NjdEMEQ0ODgsIDB4NDEwQkQxODgsIDB4RDI4ODY1N0MsCisweDY5MjBERDg4LCAweDY2QzM2QzlDLCAweDQ2MDg0NjA4LCAweDQ2MDgzNkM4LAorMHgxRkRBM0Q2QywgMHgwNEZDRTAyNCwgMHg2NkUyRTU4MCwgMHg2NTVDNjA0QywKKzB4OEYxNjMwNTAsIDB4RTAyMDJENjIsIDB4RTUwMDAxRkMsIDB4REU3RTY0MUMsCisweDMyNDM2MjVELCAweEEzMkM4QjAxLCAweDY1NUQwMDA5LCAweDM2RUM2NjUzLAorMHhFMDJDNjc2MCwgMHg2OTUzMEY3NCwgMHgzOURDNjA3RSwgMHhBRkVGODA5NCwKKzB4MjAwODc1MDEsIDB4RTAyMDhCMTQsIDB4RTUwMDAxRkMsIDB4QTAwQURFNzIsCisweDY1NUQ2NDFDLCAweDM5RUM2OTUzLCAweDY3NTM2QzkyLCAweDM3REM2MkMyLAorMHg3NTA0MTcyMSwgMHg2MjVEMUYyQywgMHg4QkYyMzI0MywgMHgyRDEwQTMwOSwKKzB4OEIxNzg4MDEsIDB4MDFGQ0UwMjAsIDB4MkQ3MEU3MDAsIDB4MUZENzZEMUMsCisweDYyN0RERTY1LCAweDhCMDEzMkQzLCAweDAwMDlBMkZCLCAweDY1RTM2NzdELAorMHg3NTA0NjY3MywgMHgzNkVDNkM3MywgMHg2NDYyM0M1QywgMHg3NzA4NjlDMiwKKzB4MjQ5MkFGRUYsIDB4OEIxODg4MDQsIDB4MDFGQ0UwMjAsIDB4MkQ0MEU0MDAsCisweERFNTk2NzFDLCAweDMyNzM2MjRELCAweEEyRTI4QjAxLCAweDY0NEQwMDA5LAorMHg2Q0UzNkQ0MywgMHg2NUQyM0RFQywgMHg2MTQzN0MwNCwgMHg2MjEyMzFDQywKKzB4NzQwODY5NTIsIDB4QUZFRDI5MjksIDB4ODgwNTI1OTIsIDB4RTAyMDhCMTgsCisweEU0MDAwMUZDLCAweDY3MUMyRDQwLCAweDYyNERERTRCLCAweDhCMDEzMjczLAorMHgwMDA5QTJDNywgMHg2OTQzNjQ0RCwgMHgzOUVDNjFFMywgMHg3MTA0NjU5MiwKKzB4M0MxQzZDNDMsIDB4NkQ1MjYyQzIsIDB4MkQyQjc0MDgsIDB4MjVEMkFGRUQsCisweDhCMUI4ODMxLCAweEQ5NDJEMjQxLCAweDcyMDQ2NDIyLCAweDcyMDQ2NjIyLAorMHg3MjA0NjcyMiwgMHg3MkU4NkMyMiwgMHgxRjJFMUY0RCwgMHg3MjA0NjQyMiwKKzB4NzIwNDZFMjIsIDB4NjUyMjI5RTAsIDB4Mjk1MEQ5M0EsIDB4REUzQTJGQzYsCisweDU1RkU0RTBCLCAweEUyMDA3RjA0LCAweDJEMjBBMjlCLCAweDhCMUQ4ODMwLAorMHhERTMzRDIzMiwgMHg3MjA0NjUyMiwgMHg3MjA0NjEyMiwgMHg3MjA0NjcyMiwKKzB4NzJFODY5MjIsIDB4NzIwNDY0MjIsIDB4NzIwNDZDMjIsIDB4NkUyMjJFQzAsCisweDFGOUZENjJDLCAweDdGRkMyNkUwLCAweDA5RkVFMDQwLCAweDJGOTJEQzJCLAorMHg2NjEzNEMwQiwgMHhFMjAwN0YwNCwgMHgyRDIwQTI3QiwgMHg4OTAxODgyOCwKKzB4MDAwOUExMDksIDB4RTE0M0RFMjAsIDB4RTA0MDYyRTEsIDB4MzYxNzY2MkQsCisweDBGRTY4RjAzLCAweDY2MDMwMkZFLCAweDM2MTcyMjAxLCAweEEwRjM4QjAxLAorMHhFMDQwMDAwOSwgMHhFNTAxMDRGRSwgMHgzMDU2ODU0MSwgMHhBMEVCOEIwMSwKKzB4RTA0MDAwMDksIDB4MDlGRUU3MDEsIDB4QjI2MTJENzAsIDB4RTA0MDY0OTEsCisweEUxNDMwQ0ZFLCAweEUwNjg2MkMxLCAweDM1MTc2NTJELCAweDBGNTY4RDY4LAorMHgzNTYzRTY0MCwgMHhFNjAwOEIyNCwgMHgwRjY1RTA0OCwgMHhBMDJFRTExQSwKKzB4MDAwMDcyQzAsIDB4MDAxMTc4MDAsIDB4MDAyMDJBMjAsIDB4MDAyMDBGNzIsCisweDAwMjAxRkRDLCAweDAwMjAyOUIwLCAweDAwMjAyQTI0LCAweDAwMjAwRkJDLAorMHgwMDIwMjlBRiwgMHgwMDIwMjVENCwgMHgwMDExNzgwNCwgMHgwMDExNzgxMCwKKzB4MDAyMDI5QUMsIDB4MDAyMDI5QUQsIDB4MDAyMDA5NDgsIDB4MDAyMDA5OTQsCisweDQxMjE2MTUzLCAweDQxMjE0MTIxLCAweDQxMjE0MTIxLCAweDQ1MjE0NTIxLAorMHg2MDUzNDUyMSwgMHg2NjAzQzkwMywgMHgwRjY1RTA0OCwgMHhFMDA3NzExOCwKKzB4RTA0NDIyMDksIDB4NjQxRDBGMjUsIDB4NjVGM0UwNEMsIDB4MEY0NkIyOTEsCisweDBFRkRFMDQ4LCAweDBERkRFMDQ0LCAweDYxREQ2N0VELCAweDQxMDg0NzA4LAorMHgwRjE2RTA1MCwgMHhERDk0NjA3MywgMHg0RDBCMDZGRSwgMHg2RTA3RTAwRiwKKzB4NjA3MzI2RTksIDB4RTA0MDBGNjYsIDB4NjVGMzBDRkUsIDB4NjkwRDg1QzIsCisweDAxRkVFMDUwLCAweDYwOTM0RDBCLCAweDYwNzMyNjBCLCAweEUwNEMwRjY2LAorMHgwNEZFQjI1NiwgMHgwN0ZFRTA0MCwgMHg2MjcxRTA2OCwgMHgwRjU2NjUyRCwKKzB4MzU2M0U2NDAsIDB4RUQwMDg5NTQsIDB4MEZENUUwNjQsIDB4QzkwMzYwMjMsCisweDQwMDA0MDA4LCAweDYxMDM2OTAzLCAweDBGOTZFMDU0LCAweERFN0VFMDU4LAorMHgwRkY2RUNGRiwgMHhFMDZDNkNDQywgMHg2MEMzMEZFNiwgMHg2MjUzNEUwQiwKKzB4NDIyMTQyMjEsIDB4NDIyMTQyMjEsIDB4NDIwMDY3MjMsIDB4NjEwNzMyN0MsCisweDQyMDBFMDVDLCAweDBGMTY0NTIxLCAweDQ1MjFFMDQwLCAweDYwNTMwQ0ZFLAorMHg0MDA4QzkwMywgMHg3QzA2MzBGQywgMHg2RTAzMUZDNiwgMHgxRkQ1NkQyRCwKKzB4MUYwNEEwMUUsIDB4MEZENkUwNjAsIDB4MDVGRUUwNTgsIDB4NjREM0IyMzEsCisweDYyRTJFMDVDLCAweEUwNTQwOUZFLCAweDJFMjIyMjk5LCAweDY0RDM2MUM0LAorMHgwMUZFNjYxQywgMHgwN0ZFRTA2QywgMHg2MDYzNDcwQiwgMHhFMDU4MjIwQiwKKzB4QjIwNTA1RkUsIDB4RTA2NDJFMjIsIDB4N0QwMTAyRkQsIDB4MEYyNTcyMDEsCisweDAyRkRFMDY0LCAweDMyNjJFNjA2LCAweEUwNDA4QkRDLCAweDYyNjEwNkZFLAorMHgwNUZFRTA0MCwgMHg4NTUxNDIwMCwgMHgzMDJDNzUwQywgMHg2MTAzNzAxQiwKKzB4NjRGM0U2MDAsIDB4RTcwNEEwMDQsIDB4NzYwMTYyNTYsIDB4NzQwNDI0MjIsCisweDMyNzM2MjZELCAweDY1RjM4QkY4LCAweDY0MURCMUUyLCAweDA2RkVFMDQwLAorMHg2NDYxQjE5RSwgMHgwMDA5QTE3NSwgMHhENzRERDQ0QywgMHg0NzBCRTIwMSwKKzB4QTE2RTJEMjAsIDB4ODgyOTAwMDksIDB4REU0QThCMDcsIDB4MkQyMEUyMDAsCisweEIxNkQ2NkUyLCAweEExNjQ2NDZELCAweEUyODEwMDA5LCAweDMwMjA2MjJDLAorMHhBMEE3OEIwMSwgMHhFMDI0MDAwOSwgMHg2MjZDMDZGQywgMHg2NjZDRTY4MiwKKzB4OEIyMTMyNjAsIDB4RTQyNDUyRkEsIDB4RDQzRjIyNDAsIDB4MTI2MTU2NDcsCisweDEyNjI1NjQ4LCAweDEyNjM1NjQ5LCAweDEyNjQ1NjRBLCAweDEyNjU1NjRCLAorMHgxMjY2NTY0QywgMHgxMjY3NTY0RCwgMHgxMjY4NTY0RSwgMHgxMjY5NTY0RiwKKzB4MTQyN0UyMDAsIDB4MTQyOTE0MjgsIDB4MTQyQjE0MkEsIDB4MTQyRDE0MkMsCisweDE0MkYxNDJFLCAweDFGNkNBMTM1LCAweDY2NkNFNjgzLCAweDhCMDczMjYwLAorMHhFNjAwNTJGQSwgMHhEMjJCMjI2MCwgMHg2MjIyRDYyQywgMHgyNjIyQTEyOSwKKzB4NjY2Q0U2OTAsIDB4OEIxODMyNjAsIDB4RTYwMDUyRkEsIDB4RDIyODIyNjAsCisweDYwMjJFNjA1LCAweDIyMDJDQjIwLCAweDIyNjJEMjI2LCAweDIyNjJFNjAwLAorMHg0NjBCRDYyNSwgMHhEMjI1MDAwOSwgMHgwMDA5NDIwQiwgMHhFNjAxRDIyNCwKKzB4RDIyNDIyNjIsIDB4QTEwQzQ2MTgsIDB4RTZCMDIyNjIsIDB4MzI2MDY2NkMsCisweEQ1MTg4QjIyLCAweEQyMTZENDIwLCAweDc1MDQ2RDUyLCAweDZFNTI0MjBCLAorMHg0MjBCRDIxRSwgMHhENDFFNjREMywgMHg0NTBCRDUxMSwgMHhEMjFCMDAwOSwKKzB4NjRFMzQyMEIsIDB4RDYwRUQ0MUIsIDB4MDAwOTQ2MEIsIDB4RTYwMEU1MDQsCisweDMyNTM2MjZELCAweEEwRUM4QjAxLCAweDY2NkQwMDA5LCAweDMyNkM2MkQzLAorMHgyMkUwNzYwMSwgMHg0RTE5QUZGNCwgMHhEMjE0RDQxMywgMHhENDE0NjU0MiwKKzB4MDAwOTQyMEIsIDB4MDAwOUEwREQsIDB4MDAyMDI0OEMsIDB4MDAyMDJBNDQsCisweDAwMjAwRjcyLCAweDAwMTE3ODA0LCAweDAwMjAyNTM4LCAweDAwMjAyOTk0LAorMHgwMDFDMzUwMCwgMHgwMDFENDAwNCwgMHgwMDIwMTA1NiwgMHgwMDIwMEMxQywKKzB4MDAxRTIxMkMsIDB4MDAxQzNEMzAsIDB4MDAyMDJBNUMsIDB4MDAyMDBGQjQsCisweDAwMjAyQTcwLCAweDAwMjAyQTc4LCAweDAwMTE3ODAwLCAweDAwMjAwRkJDLAorMHgwMDIwMkE3QywgMHhENkFFRDRBRCwgMHg2MjYyRTA0MCwgMHg3NjA0NjU0MiwKKzB4MjQ1MjM1MkMsIDB4NjI2MjY1NjMsIDB4NzUwNDU2NDEsIDB4MTQ2MTM2MkMsCisweDYyNTI2NjUzLCAweDc2MDg1NTQyLCAweDE0NTIzNTJDLCAweDU1NDM2MjYyLAorMHgzNTJDNzZFQywgMHg2NTYzMTQ1MywgMHg1NjQ0NjI2MiwgMHgzNjJDNzUxMCwKKzB4NjY1MzE0NjQsIDB4NTU0NTYyNTIsIDB4MzUyQzc2MTAsIDB4NjU2MjE0NTUsCisweEQ2OUM1MjQ2LCAweDE0MjYzMjVDLCAweDU1NDc2MjYyLCAweDM1MkM3NjA0LAorMHg2MjYyMTQ1NywgMHg3NjA0NTU0OCwgMHgxNDU4MzUyQywgMHg2MjYyNjU2MywKKzB4NzUwNDU2NDksIDB4MTQ2OTM2MkMsIDB4NTY0QTYyNTIsIDB4MzYyQzc1MDQsCisweDY2NTMxNDZBLCAweDU1NEI2MjUyLCAweDM1MkM3NjA0LCAweDYyNjIxNDVCLAorMHg3NjA0NTU0QywgMHgxNDVDMzUyQywgMHg2MjYyNjU2MywgMHg3NTA0NTY0RCwKKzB4MTQ2RDM2MkMsIDB4NjI1MjY2NTMsIDB4NzYwNDU1NEUsIDB4MTQ1RTM1MkMsCisweDUyNEY2NTYyLCAweDMyNUNENjg0LCAweDYyNjIxNDJGLCAweDc2OTQwNTRFLAorMHgwNDU2MzUyQywgMHg2MjYzRTA0NCwgMHgwNTRFNjY2MiwgMHgzNTZDNzI0NCwKKzB4RTA0ODA0NTYsIDB4MDU0RTY2MjIsIDB4RDY3QzM1NkMsIDB4NjI2MjA0NTYsCisweDA1NEVFMDU0LCAweDM1MkM0MjI5LCAweDc2MDQwNDU2LCAweEUwNTg2MjYyLAorMHg0MjI5MDY0RSwgMHg1MkZBMzYyQywgMHhFNjM4MDQ2NiwgMHhFMDQ0MjI2MCwKKzB4RTA0ODA2NEUsIDB4NjY0MjEyNjEsIDB4NTY0MTEyNjIsIDB4NTY0MjEyNjMsCisweDU2NDUxMjY0LCAweDU2NDMxMjY1LCAweDU2NDYxMjY2LCAweDA2NEUxMjY3LAorMHgxMjY4RTA0MCwgMHhFMDUwMDY0RSwgMHg1NjQ0MTI2OSwgMHgwNjRFMTI2QSwKKzB4MTI2QkUwNEMsIDB4RTA1NDA2NEUsIDB4MDY0RTEyNkMsIDB4MTI2REUwNTgsCisweEUwNDQwNjRFLCAweEUyMDAxMjZFLCAweEUwNDgwNDI2LCAweDE0MjEyNDIyLAorMHgxNDI1MTQyMiwgMHgxNDI2MTQyMywgMHhFMDQwMDQyNiwgMHhFMDUwMDQyNiwKKzB4MDQyNjE0MjQsIDB4MDQyNkUwNEMsIDB4MDQyNkUwNTQsIDB4MDQyNkUwNTgsCisweDdGNzAxRjZDLCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDY5RjYwMDBCLAorMHg2MTRENEYyMiwgMHgzMTIzRTI0MCwgMHhFMjFGODkxNywgMHg4OTA4MzEyNywKKzB4RDU1MEQ0NEYsIDB4NDUwQkUwMDEsIDB4NjcwNzY2NDIsIDB4QTAwQzI2NzksCisweEUyM0YyNDYyLCAweDg5MDgzMTI3LCAweEQ2NEFENzQ5LCAweEUwMDE3MUUwLAorMHg1NTcxNDYwQiwgMHgyNTI5NjIwNywgMHg0RjI2MTc1MSwgMHgwMDA5MDAwQiwKKzB4NjE0RDRGMjIsIDB4MzEyM0UyNDAsIDB4RTIxRjg5MTUsIDB4ODkwNzMxMjcsCisweEQyNDBENDNGLCAweDQyMEI2NjQyLCAweDI2MEJFMDAxLCAweDI0NjJBMDBCLAorMHgzMTI3RTIzRiwgMHhENzNBODkwNywgMHg1NTcxRDYzQSwgMHg0NjBCNzFFMCwKKzB4MjUwQkUwMDEsIDB4NEYyNjE3NTEsIDB4MDAwOTAwMEIsIDB4NDYxOEU2NDAsCisweEQ1MzU0NjI4LCAweDIyNjg2MjUyLCAweDAwMEI4OUZDLCAweEU2ODAwMDA5LAorMHg0NjI4NDYxOCwgMHg2MjUyRDUzMCwgMHg4OUZDMjI2OCwgMHgwMDA5MDAwQiwKKzB4RTIwMEEwMDEsIDB4MzI0MjcyMDEsIDB4MDAwQjhCRkMsIDB4RTY4MDAwMDksCisweDQ2Mjg0NjE4LCAweDYyNTJENTI5LCAweDhCRkMyMjY4LCAweDAwMDkwMDBCLAorMHg0RjIyMkZFNiwgMHg2RTUzN0ZGQywgMHgyRjQyQkZGMSwgMHhENjI0NjFFMiwKKzB4MTYxNUUyODAsIDB4NDIxODU0RTEsIDB4NTVFMjE2NDYsIDB4MTY1NzQyMjgsCisweDZFRjI1N0UzLCAweDJFMkIxNjc4LCAweDdGMDQyNkUyLCAweEFGQ0U0RjI2LAorMHgyRkM2NkVGNiwgMHgyRkU2MkZENiwgMHhERDE5NEYyMiwgMHhCRkQ2NkM1MywKKzB4QkZCQjZFNDMsIDB4QkZEMjJERTIsIDB4NTFENTAwMDksIDB4NTRENjJDMTIsCisweDU1RDcxQzQxLCAweDU2RDgxQzUyLCAweDRGMjYxQzYzLCAweDZERjY2RUY2LAorMHg2Q0Y2MDAwQiwgMHhFNjAwNjE2MywgMHg0MTA5QTAwNCwgMHg3NjAxNjI1NiwKKzB4NzQwNDI0MjIsIDB4OEJGOTM2MTIsIDB4MDAwOTAwMEIsIDB4MDAyMDI1MzgsCisweDAwMUMzNkEwLCAweDAwMUMzQ0EwLCAweDAwMUMzNkY0LCAweDAwMUMzQjg4LAorMHgwMDFDMzcwNCwgMHgwMDIwMjQ4QywgMHgwMDFDMzczQywgMHgwMDFDMzcwMCwKKzB4MDAxQzM3MEMsIDB4MDAwOUExMDksIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweDZFNjM2RDczLCAweDZDNTNCMDE2LCAweDY0QzM1N0Y0LCAweEIwMjk2NUUzLAorMHhCMDNENjZEMywgMHhCMDZEMDAwOSwgMHhCMDcxMDAwOSwgMHhCMDc1MDAwOSwKKzB4QjA4QTAwMDksIDB4QjA4RDAwMDksIDB4NEYyNjAwMDksIDB4NkRGNjZFRjYsCisweDZDRjZBMEI0LCAweDM0MTJEMTkwLCAweEQ2OTAwNTI5LCAweDI2NTBENzkwLAorMHgyNzQyMDAwQiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHg2RTYzNkQ3MywKKzB4NkM1M0JGRjAsIDB4NjRDMzU3RjQsIDB4NjZEMzY1RTMsIDB4NkVGNjRGMjYsCisweDZDRjY2REY2LCAweEQxODcyRkU2LCAweDY2MTI2RTYzLCAweDkyQkM0NDE4LAorMHg0NDA4NDUyOCwgMHg0NTAwMjYyOSwgMHgyNjVCNDQwOCwgMHgyNjRCNDQwMCwKKzB4MjE2MjQ3MDgsIDB4RDE4MDQ3MDgsIDB4MjE3MjI3RUIsIDB4NkVGNjAwMEIsCisweDRGMjIyRkU2LCAweEUxMDFERTdELCAweEJGQUJFNDBBLCAweDYyRTMyRTEyLAorMHhFMTAwNzI2QywgMHgyMjEyRTQwMSwgMHgyMjEyMjIxMiwgMHgyMjEyMjIxMiwKKzB4MjI0MjIyMTIsIDB4RTUwM0U3MzAsIDB4MjIxMkU0MEEsIDB4MjIxMjIyMTIsCisweDIyMTIyMjEyLCAweDIyMTIyMjEyLCAweDIyMTIyMjEyLCAweDIyMTIyMjEyLAorMHgyMjcyMjIxMiwgMHgyMjEyMjI1MiwgMHgyMjEyMjIxMiwgMHgyMjEyMjIxMiwKKzB4MjIxMjIyMTIsIDB4QkY4NTIyMTIsIDB4RTYwMDEyMUEsIDB4NEYyNjJFNjIsCisweDZFRjYwMDBCLCAweEUxMDFEMjY2LCAweDIyMTJFNDQxLCAweDIyNDIwMDBCLAorMHhENDY1RDE2NCwgMHgyMTYyRTYwNSwgMHgyNDYyMDAwQiwgMHhEMjY0RDU2MywKKzB4ODgwMTYwNTAsIDB4RDQ2MzhCMDcsIDB4NjA0MDk2NjgsIDB4OEIwOTg4MDEsCisweEEwMDc5NjY1LCAweEU2MDAwMDA5LCAweDIyNjJENDVFLCAweDg4MDE2MDQwLAorMHhFNjA0OEIwMCwgMHhBRjVERTQwQSwgMHhEMjVCMjI2MiwgMHhFNDBBRTYwMSwKKzB4MjI2MkFGNTgsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4REM1NzRGMjIsCisweDYwQzJFRDAwLCAweENCMDFFQjY0LCAweDYwQzIyQzAyLCAweEEwMDhDOTAxLAorMHgzREIyNkUwMywgMHg2MEMyODkwNywgMHhDOTAxRTQwQSwgMHg2RTAzQkY0MiwKKzB4MkVFODdEMDEsIDB4M0RCMjhCRjUsIDB4RDQ0RDhCMDMsIDB4NDIwQkQyNEQsCisweEU0MEEwMDA5LCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjZBRjMyLAorMHg4RjAxNDQxMSwgMHg2MDQzNjA0QiwgMHgwMDA5MDAwQiwgMHgyRkM2MkZCNiwKKzB4MkZFNjJGRDYsIDB4N0ZGQzRGMjIsIDB4RUQwMERDNDAsIDB4RUI2NDYwQzIsCisweDJDMDJDQjAyLCAweDJGMDI2MEMyLCAweEEwMDlDOTAyLCAweDNEQjM2RTAzLAorMHg2MEMyODkwOCwgMHgyRjAyRTQwQSwgMHhCRjEzQzkwMiwgMHg3RDAxNkUwMywKKzB4OEJGNDJFRTgsIDB4OEIwQjNEQjMsIDB4RDIzNkQ0MzcsIDB4NEYyNjdGMDQsCisweDZERjY2RUY2LCAweDQyMkI2Q0Y2LCAweDFGRkY2QkY2LCAweDAzQzQwMzQwLAorMHg0RjI2N0YwNCwgMHg2REY2NkVGNiwgMHgwMDBCNkNGNiwgMHhENTJGNkJGNiwKKzB4NjA1MjU2NTEsIDB4MDAwQjQ2MjgsIDB4MkZCNjMwNkMsIDB4MkZENjJGQzYsCisweDRGMjIyRkU2LCAweDRGMDI0RjEyLCAweDZFNDNCRkYxLCAweERDMjg2QjAzLAorMHhCRkVDREQyOCwgMHgzMEI4MDAwOSwgMHgwNjBBM0MwNSwgMHg0NjA5NDYwOSwKKzB4M0Q2NTQ2MDEsIDB4NDIwOTAyMEEsIDB4NDIwOTQyMDksIDB4OEJGMDMyRTIsCisweDRGMTY0RjA2LCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjYwMDBCLAorMHg0RjIyMkZFNiwgMHhFMTAyREUxQywgMHhFNDAzRTUwMCwgMHhCRkQ0MkUxMiwKKzB4RTYwNjJFNTIsIDB4RTcwMDQ2MTgsIDB4MkU2MkU0MDMsIDB4NEYyNjJFNzIsCisweDZFRjZBRkNCLCAweDAwMDkwMDBCLCAweDAwMjVFNzIwLCAweDAwMjAyQzNDLAorMHgwMDIwMjk5OCwgMHgwMDFDNTgxNCwgMHgwMDFDNTlEMCwgMHgwMDFDNTgzMCwKKzB4MDAxQzYyNjgsIDB4MDAxQzU5QTQsIDB4MDAxQzYzOUMsIDB4MDAyMDI5QUQsCisweDAwMUM1ODA0LCAweDAwMjAyOUFDLCAweDAwMUM1ODFDLCAweDAwMUM1ODYwLAorMHgwMDIwMkE5MCwgMHgwMDIwMEY3MiwgMHgwMDIwMkFBOCwgMHgwMDFDMTA0MCwKKzB4Q0NDQ0NDQ0QsIDB4MTA2MjRERDMsIDB4MDAxRDQwMDQsIDB4MkY5NjJGODYsCisweDJGQjYyRkE2LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweEU0MDA3RkUwLAorMHg0NTI4RTUxMCwgMHg2NzQzNkM0MywgMHhFMTA4QTAwRiwgMHg2MDQzNjQ0RCwKKzB4MEY1NjQwMDgsIDB4RUUwMDYwQzMsIDB4ODE1MTI1QzEsIDB4ODE1MzgxNTIsCisweDE1NzMxNUUyLCAweDc1MTQxNUU0LCAweDYyNEQ3NDAxLCAweDhCRUQzMjEzLAorMHhEQTcyNTFGMSwgMHgxQTExNTRGMiwgMHhEMTcxMkExMiwgMHg1NkY0NTVGMywKKzB4NThGNjU3RjUsIDB4MjE0MjExNDEsIDB4MTE1MjExNTMsIDB4MTE2NDExNjUsCisweDExNzYxMTc3LCAweDExODgxMTg5LCAweEQ5NkE2REYyLCAweERCNkE1MkY3LAorMHgyOUQyMTlEMSwgMHgyQjIyMUIyMSwgMHhEODY4RUI0NSwgMHhFOUI4RUE1MCwKKzB4NEEwODRCMDgsIDB4QTAyMDY5OUMsIDB4NkVFREVFMDAsIDB4NjFFMzZERTMsCisweDQxMDg0RDA4LCAweDMxRUMzREVDLCAweDQxMDg0RDA4LCAweDYwQzMzRDhDLAorMHhENzVGNDEwOCwgMHg4MUQxMkRDMSwgMHg0MTA4NjBBMywgMHg2MEMzODFEMiwKKzB4RTIwMDMxN0MsIDB4ODFEMzM0OTIsIDB4MUQxMzFERDIsIDB4OEQwMUQ0NTYsCisweEQ0NTIxRDI0LCAweDY1RDNCMDNDLCAweDY0RUQ3RTAxLCAweDhCREMzNEIyLAorMHhEQjU0RDE0RSwgMHhEMjRGNjUxMiwgMHgxQjUxNDUyOSwgMHhEMTRDNjQxMiwKKzB4MkI3MjY3NEQsIDB4RDY1MDY3MjIsIDB4MUI3MzQ3MjksIDB4MkZEMjY5MjIsCisweDFCODI2ODlELCAweDI2OTI2OTEyLCAweDE2QTI1QTEyLCAweERBNDY1QjE0LAorMHg1QzE2MTZCNCwgMHg1RDE4MTZDNiwgMHg2RUEyMTZEOCwgMHg3RjIwMTZFQSwKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsCisweDY2NDI2OEY2LCAweEM4MDM2MDYxLCAweEU1MDA4RDA0LCAweEM5MDM2MDYxLAorMHg4QjAzODgwMiwgMHg2NTYzNTI2MiwgMHgyNDEyNTEyNCwgMHg2MDUzMDAwQiwKKzB4MkZFNjJGRDYsIDB4N0ZFQzRGMjIsIDB4NjI1MzZFNTMsIDB4NkQ0M0U1NTAsCisweDQ1MDhFNDAwLCAweEUxMDFBMDAxLCAweDYwNDM1MjI0LCAweDgxMjEyMjExLAorMHg2MDUzODEyMywgMHg1NkUyODEyMiwgMHg4QkY1MzYyMCwgMHgxNkU0RDIyRiwKKzB4RTYxNDY0RjMsIDB4NjVFMzQyMEIsIDB4RTRGQzY1RTEsIDB4MkU1MTI1NDksCisweDY1RjM2MUYxLCAweDJGMTEyMTQ5LCAweEQxMjg1NEQxLCAweEU2MTQ0MTBCLAorMHg2MDcxNTdEMSwgMHgyNzAxQ0IwMSwgMHg3RjE0MURFMSwgMHg2RUY2NEYyNiwKKzB4NkRGNjAwMEIsIDB4MkZFNjJGRDYsIDB4N0ZFQzRGMjIsIDB4NjY1MzZFNTMsCisweDZENDNFNUZDLCAweDIwNTk2MDYxLCAweDI2MDFDQjAxLCAweDMyNjA1MkUyLAorMHgxMkU0OEIwNiwgMHgzMUUwNTFFMiwgMHg1MkQxOEIwNCwgMHgxRTIyQTAwMiwKKzB4NTY2NEFGRjAsIDB4NjRGM0QyMTUsIDB4NDIwQkU2MTQsIDB4NjdFMTY1RTMsCisweDI3MTlFMUZDLCAweDY3RjEyRTcxLCAweDI3MTk1NEQxLCAweDY1RjNEMTBGLAorMHg0MTBCRTYxNCwgMHg1MkQxMkY3MSwgMHhDQjAxNjAyMSwgMHgxREUxMjIwMSwKKzB4NEYyNjdGMTQsIDB4MDAwQjZFRjYsIDB4MDAwMDZERjYsIDB4MDAyMDI1OUMsCisweDAwMjAyNUE0LCAweDAwMjAyNTk0LCAweDAwMjAyNUNDLCAweDAwMTAwMEEwLAorMHgwMDEwMTY0MCwgMHgwMDFFMjEwOCwgMHgwMDFDM0QwMCwgMHgwMDIwMDkwNCwKKzB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4N0ZGQzRGMjIsIDB4NjAyMkQyMjUsCisweDhEMzVDODAzLCAweERFMjQyRjAxLCAweERCMjVEQzI0LCAweEVEMDFBMDE2LAorMHhDOTAzNjA2MSwgMHg4OTE1ODgwMSwgMHhEMTIyRDQyMCwgMHgwMDA5NDEwQiwKKzB4NjUwMzU2MDMsIDB4QzgyMDg1NjEsIDB4RTA1MDg5MDMsIDB4NzIwMTAyQkUsCisweEQyMUQwQjI2LCAweDY0RTM0MjBCLCAweDIxRDJEMTFDLCAweDY2QzI1MkMxLAorMHg4QkU1MzYyMCwgMHhERDFBRUUwMSwgMHg0RTE4QTAwRSwgMHhDOTAzNjA2MSwKKzB4ODkwRDg4MDEsIDB4RDcxM0Q0MTYsIDB4NDcwQkRCMTYsIDB4RDQxNjAwMDksCisweDY1MDM0QjBCLCAweDIxRTJEMTExLCAweDY2RDI1MkQxLCAweDhCRUQzNjIwLAorMHhDODA0NjBGMSwgMHhEMjExODkwNywgMHg0RjI2N0YwNCwgMHg2REY2NkVGNiwKKzB4NDIyQjZDRjYsIDB4N0YwNDZCRjYsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsCisweDZCRjYwMDBCLCAweDAwMUUyMTAwLCAweDAwMjAyNUE0LCAweDAwMjAyNTlDLAorMHgwMDIwMjUzOCwgMHgwMDIwMEQ0MiwgMHgwMDIwMERDNCwgMHgwMDFDM0QzMCwKKzB4MDAyMDI1OTQsIDB4MDAyMDBENjAsIDB4MDAyMDI1Q0MsIDB4MDAyMDAxMDAsCisweEU2MDFEMjAzLCAweDEyNjVENTAzLCAweDAwMEIyMjUyLCAweDAwMDAxMjY2LAorMHgwMDFDMTAxMCwgMHgwMDAwQzM0RiwgMHhENjJBN0ZGQywgMHgyNjQyNjQ0QywKKzB4QzgyMDUwNjYsIDB4MkYwMjhERkMsIDB4N0YwNDAwMEIsIDB4MkZENjJGQzYsCisweDRGMjIyRkU2LCAweDZENDM2QzUzLCAweEVFMDBBMDA0LCAweDdFMDE2NEQ0LAorMHg2NDRDQkZFQSwgMHg4QkY5M0VDMiwgMHg2RUY2NEYyNiwgMHgwMDBCNkRGNiwKKzB4QTAwMTZDRjYsIDB4NzYwMTY2NDMsIDB4MjIyODYyNjAsIDB4MzY0ODhCRkIsCisweDY1NjNBRkU0LCAweDYyNTMyRkU2LCAweDY3NTM3NTA3LCAweEVFMEFFMTA4LAorMHhDOTBGNjA0MywgMHgzMEUyNDQwOSwgMHg0NDA5NjUwMywgMHhFNjM3OEQwMSwKKzB4MzY1Q0U2MzAsIDB4Mjc2MDQxMTAsIDB4NzdGRjhGRjIsIDB4ODAyOEUwMDAsCisweDZFRjYwMDBCLCAweEUwMDAwMDBCLCAweEUwMDAwMDBCLCAweDRGMjIyRkU2LAorMHg2MjUzN0ZFQywgMHg2NUYzNkU0MywgMHg2NDIzQkZEQywgMHg2NEUzQkZEMSwKKzB4NjRGM0JGQ0YsIDB4QkZDQ0Q0MDQsIDB4N0YxNDAwMDksIDB4MDAwQjRGMjYsCisweDAwMDA2RUY2LCAweDAwMUMwMDA0LCAweDAwMjAyQUM0LCAweEUxMTBENUExLAorMHhFNjQwNjA1MCwgMHgyNTAwQzlGRCwgMHhFMEZGNzVFOSwgMHg4MDUxNjQ1MywKKzB4ODA1MzgwNTIsIDB4ODA1NjgwNTUsIDB4MjUxMDc1RUYsIDB4RTFFRjYyNTAsCisweDIyMTlFMDAxLCAweEU3MjAyNTIwLCAweDI0NjA4MDUyLCAweDI1NzAwMDBCLAorMHhFNEZERDU5NSwgMHhFNzAyNjE1MiwgMHgyNTEyMjE0OSwgMHg3NDAxNjA1MiwKKzB4MjUwMkNCMDEsIDB4RDE5MTY2NTIsIDB4MjU2MjI2NDksIDB4OTJDNDYwMTIsCisweDIxMDJDQjA4LCAweEM5Q0Y2MDEyLCAweDYwMTIyMTAyLCAweDIxMDJDQjAzLAorMHgwMDBCMTE3MiwgMHg0RjIyMTEyMywgMHhENzhBRDU4OSwgMHhENDhCRDI4QSwKKzB4RTYwMEUxMDAsIDB4MjcxMTI1MTEsIDB4QkZCRjIyMTAsIDB4QUZENzI0NjEsCisweDY2NEM0RjI2LCAweDQ2MDBEMjg2LCAweDYwNjAzNjJDLCAweDAwMEJDQjEwLAorMHg2NTRDMjYwMCwgMHg0NTAwRDI4MiwgMHg2NjUwMzUyQywgMHgyNjE5RTFFRiwKKzB4MjU2MDAwMEIsIDB4RDI3RjY2NEMsIDB4MzYyQzQ2MDAsIDB4Q0IxMDYwNjAsCisweDI2MDAwMDBCLCAweEQyN0I2NTRDLCAweDM1MkM0NTAwLCAweEUxRUY2NjUwLAorMHgwMDBCMjYxOSwgMHg2NjRDMjU2MCwgMHg0NjAwRDI3NSwgMHg2MDYwMzYyQywKKzB4MDAwQkNCMDgsIDB4NjU0QzI2MDAsIDB4NDUwMEQyNzEsIDB4NjY1MDM1MkMsCisweDI2MTlFMUY3LCAweDI1NjAwMDBCLCAweEQyNkU2NjRDLCAweDM2MkM0NjAwLAorMHhDQjA4NjA2MCwgMHgyNjAwMDAwQiwgMHhEMjZBNjU0QywgMHgzNTJDNDUwMCwKKzB4RTFGNzY2NTAsIDB4MDAwQjI2MTksIDB4NjI0QzI1NjAsIDB4NDIwMEQ2NjQsCisweDYwMjAzMjZDLCAweDQwMjFDOTA4LCAweDQwMjE0MDIxLCAweDYwMEMwMDBCLAorMHhENjYwNjI0QywgMHgzMjZDNDIwMCwgMHhDOTA4NjAyMCwgMHg0MDIxNDAyMSwKKzB4MDAwQjQwMjEsIDB4NjQ0QzYwMEMsIDB4NzRGRkQxNUIsIDB4NjI0MDM0MUMsCisweDYwMkMwMDBCLCAweDY0NENEMTU5LCAweDYyNDAzNDFDLCAweDYwMkMwMDBCLAorMHg0RjIyMkZFNiwgMHhFNjBBNjU1QywgMHg4RDE1MzU2NywgMHhCRkVBNkU0MywKKzB4NjQwQzY0NTMsIDB4ODgwMTYwRUMsIDB4RTAwRjhCMDIsIDB4MjQwOUEwMDIsCisweDQ0MDk0NDA5LCAweEU2MEE2MjRDLCAweDg5MDUzMjYzLCAweDY0NENCRkUyLAorMHg2MDIzNjIwQywgMHg4QjAwQzg4MCwgMHg2MDIzRTIwMCwgMHgwMDBCNEYyNiwKKzB4NEYyMjZFRjYsIDB4NjA2MkQ2NDYsIDB4OEIwMzg4MDEsIDB4MDAwOUIyNDEsCisweDAwMDlBMDAzLCAweEU2NDBEMjQzLCAweEQ2NDMyMjYwLCAweDRGMjZFMjAwLAorMHgyNjIyMDAwQiwgMHhENjNFNEYyMiwgMHg4ODAyNjA2MiwgMHhCMjhCOEIwMSwKKzB4RDYzRDAwMDksIDB4NEYyNkUyMDAsIDB4MjYyMjAwMEIsIDB4RDQzOUQ1MzgsCisweEU3MDFFMTAwLCAweDAwMEIyNTEyLCAweDBGRkYyNDcwLCAweEU2MDREMjM1LAorMHgyMjYwMDAwQiwgMHhENDM1NEYyMiwgMHg0MTBCRDEzNSwgMHhENTI1MDAwOSwKKzB4NjY1MEUxRkQsIDB4MjYxOUQyMzMsIDB4MjU2MEU3MDAsIDB4MDAwQjRGMjYsCisweDRGMjIyMjcwLCAweEQxMkVENDMwLCAweDAwMDk0MTBCLCAweEU3RkJENTFELAorMHgyNjc5NjY1MCwgMHgwMDBCNEYyNiwgMHg0RjIyMjU2MCwgMHhEMTI4RDQyQiwKKzB4MDAwOTQxMEIsIDB4RTdGN0Q1MTcsIDB4MjY3OTY2NTAsIDB4MDAwQjRGMjYsCisweEQ1MTQyNTYwLCAweDYyNTA5NDI1LCAweDAwMEIyMjQ5LCAweEQ1MTEyNTIwLAorMHg2MjUwRTRCRiwgMHgwMDBCMjI0OSwgMHg0RjIyMjUyMCwgMHg4NTIyRDIyMCwKKzB4MjAwODYwMEQsIDB4ODgwMTg5MTEsIDB4ODgwMzg5M0MsIDB4ODgwNTg5M0UsCisweDg4MDY4OTQwLCAweDg4MDg4OTQ2LCAweDg4MDk4OTRDLCAweDg4MEE4OTUyLAorMHg4ODBCODk1OCwgMHhBMDY1ODk1RSwgMHhCMDY3MDAwOSwgMHhBMDYyMDAwOSwKKzB4RkY3RjYwMEMsIDB4MDAxRTEwMjgsIDB4MDAxRTIxNDgsIDB4MDAxRTExMDgsCisweDAwMjAyOURDLCAweDAwMjAyOURFLCAweDAwMjAyOUU5LCAweDAwMjAyOUMwLAorMHgwMDFFMTAzRiwgMHgwMDFFMTA1RiwgMHgwMDFFMTAzMCwgMHgwMDFFMTA5MCwKKzB4MDAyMDI5RTQsIDB4MDAxRTEwMEIsIDB4MDAyMDI5RTAsIDB4MDAyMDJBQzgsCisweDAwMjAwRjcyLCAweDAwMjAyOUU4LCAweDAwMjAyQUQ0LCAweDAwMjAyQUU0LAorMHgwMDIwMjlCNCwgMHgwMDA5QjA0QywgMHg2MDBDQTAzNSwgMHgwMDA5QjA1NiwKKzB4NjAwQ0EwMzEsIDB4NjI2MEQ2N0MsIDB4OEIyQjIyMjgsIDB4MDAwOUIwNjIsCisweDYwMENBMDI5LCAweDYyNjBENjc4LCAweDhCMjMyMjI4LCAweDAwMDlCMDZBLAorMHg2MDBDQTAyMSwgMHg2MjYwRDY3NCwgMHg4QjFCMjIyOCwgMHgwMDA5QjBCNCwKKzB4NjAwQ0EwMTksIDB4NjI2MEQ2NzAsIDB4OEIxMzIyMjgsIDB4MDAwOUIwQkEsCisweDYwMENBMDExLCAweDYyNjBENjZDLCAweDhCMEIyMjI4LCAweDAwMDlCMTFBLAorMHg2MDBDQTAwOSwgMHg2MjYwRDY2OCwgMHg4QjAzMjIyOCwgMHgwMDA5QjEzMiwKKzB4NjAwQ0EwMDEsIDB4NEYyNkUwMDAsIDB4MDAwOTAwMEIsIDB4RDI2NEQxNjMsCisweEQ1NjQ4NDEyLCAweDQwMDBDOTBGLCAweEQ3NjMwMTJELCAweDYxMUNFNDAzLAorMHhENjYyRTIwRiwgMHgyNzEyMjU0MCwgMHhFMDAxMjUyMCwgMHgyNjAyMDAwQiwKKzB4RTYwMUQyNUEsIDB4MzA2Njg1MjMsIDB4RTAwMDhEMDYsIDB4RTAwMEQyNTgsCisweDgxMjJENjVBLCAweDI2MDJFMDAxLCAweDAwMDkwMDBCLCAweDg1MjNEMjUzLAorMHgyMDA4NjAwRCwgMHg4ODAxODkwNSwgMHhENjU1OEIwQSwgMHhDQjAxNjA2MCwKKzB4RDY1MjI2MDAsIDB4RTEwMUQ0NEUsIDB4MjYxMkUwMDEsIDB4ODE0MjAwMEIsCisweEUwMDAwMDBCLCAweEU1MDFEMTQ5LCAweDQ1MTg4NTEzLCAweDM0NTM2NDBELAorMHg4RDA1NjYwMywgMHhEMjRCRTAwMCwgMHhFMDAxRDU0OCwgMHgyNTAyMjI2MCwKKzB4MDAwOTAwMEIsIDB4RDE0MTRGMjIsIDB4NjUwRDg1MTMsIDB4NDQxOTY0NTMsCisweDY3MkU2MjQ5LCAweDYwMkMyMjdELCAweDg5MDk4ODAxLCAweDg5MEM4ODAyLAorMHg4OTEwODgwMywgMHg4OTI2ODgwNiwgMHg4OTI5ODgwNywgMHgwMDA5QTAzOCwKKzB4RDYzRUQ1M0QsIDB4QTAyN0UyMTIsIDB4NjI1QzI2NTIsIDB4OEIyRjIyMjgsCisweEEwMUVENjNCLCAweDYwNUM2MjYyLCAweDg5MDUyMDA4LCAweDg5MDg4ODEwLAorMHg4OTBCODgyMCwgMHgwMDA5QTAyNCwgMHhENjM0RDQzNiwgMHhBMDEzRTIwNCwKKzB4RDczNTI2NDIsIDB4RTIwQ0Q2MzEsIDB4MjY3MkEwMEUsIDB4RDYyRkQ1MzMsCisweEEwMDlFMjE4LCAweEQ0MzIyNjUyLCAweEUyMEFENjJDLCAweDI2NDJBMDA0LAorMHhENjJBRDIzMCwgMHhFMjJFMjYyMiwgMHhENDJGODUxNSwgMHgzMjc3NjcwRCwKKzB4OEYwMTI0MjEsIDB4MjQ1MTY1MDMsIDB4MDAwOUIwREIsIDB4RTAwMUEwMDEsCisweDRGMjZFMDAwLCAweDAwMDkwMDBCLCAweEUxMDFENjFBLCAweDI2MTBENDI3LAorMHhENzE5NjU0MSwgMHg2NTVERDExOSwgMHhFMDAxRTIwRiwgMHgyNjIwMjc1MiwKKzB4MjEwMjAwMEIsIDB4NEYyMjJGRTYsIDB4ODUyM0QyMTAsIDB4MjQ0ODY0MEMsCisweEQ2MUU4QjA4LCAweEUyMDBENTEyLCAweDg0NTEyNjIxLCAweDIwNDk5NDEyLAorMHg4MDUxQTA1MCwgMHg2MEUwREUwRSwgMHg4RDM1Qzg0MCwgMHgzNDI3RTIwMSwKKzB4RDExNjg5NEMsIDB4NDIwQkQyMTYsIDB4RDUxNjIxNDEsIDB4Q0IwNDYwNTIsCisweDI1MDJBMDM1LCAweDAwMDBGRjdGLCAweDAwMjAyOUU5LCAweDAwMjAyOUI0LAorMHgwMDIwMjlDMCwgMHgwMDFFMTEwMCwgMHgwMDFFMTAwQywgMHgwMDIwMjlFMCwKKzB4MDAxRTEwMDAsIDB4MDAxRTEwMDEsIDB4MDAyMDJDNDAsIDB4MDAyMDI5QzgsCisweDAwMjAyOUQwLCAweDAwMjAyQ0FFLCAweDAwMjAyQ0IyLCAweDAwMjAyQ0JFLAorMHgwMDIwMkNENiwgMHgwMDIwMkNFMCwgMHgwMDIwMjlDQywgMHgwMDIwMjlEQSwKKzB4MDAyMDFEQjYsIDB4MDAxRTExMDgsIDB4ODkxNzM0MjcsIDB4RDc5NEQyOTMsCisweDIyNDE0NzBCLCAweEU1RkJENjkzLCAweDIxNTk2MTYyLCAweDg0RTEyNjEyLAorMHhCMEZGQ0I4MCwgMHg2MEUwODBFMSwgMHhDQjA0RDY4RiwgMHg2MDYwMkUwMCwKKzB4MjYwMEM5M0YsIDB4RTAwMUQ2OEQsIDB4MjYwMkEwMDEsIDB4NEYyNkUwMDAsCisweDZFRjYwMDBCLCAweDYwNjBENjhBLCAweDg5MTlDODgwLCAweDYwMjFEMjgzLAorMHg4QjE1ODgwMSwgMHhFNTAxRDI4NywgMHgzMDU2ODUyNCwgMHhEMTg2ODkxMCwKKzB4RDQ4NkUyMDMsIDB4NjU0MTIxMjAsIDB4NjU1REUwMEIsIDB4RDU4NDA2NTYsCisweEU3MDJFNDBGLCAweDI1NzEyMTQwLCAweEUwMDFENzdDLCAweDI3MDIwMDBCLAorMHhFMDAwMDAwQiwgMHg0RjIyMkZFNiwgMHg4NEUxREU3RSwgMHg4OTM0Qzg4MCwKKzB4ODU1NEQ1NzgsIDB4OEYzMDIwMDgsIDB4RDc3QjYxMDMsIDB4NjY3Mjg1NTMsCisweDY1MEM2NDAzLCAweDYyMEM4NTY2LCAweDhCMjYzNTIwLCAweEQ3NzNENjc3LAorMHg2NDRDNjUxQywgMHgyNzQxMjY1MSwgMHhDODQwNjBFMCwgMHhEMjc0ODkwNywKKzB4MDAwOTQyMEIsIDB4NjA2MkQ2NjcsIDB4QTAwOENCMDQsIDB4RDE2NDI2MDIsCisweDAwMDk0MTBCLCAweEU1RkJENjYzLCAweDI0NTk2NDYyLCAweEIwQTEyNjQyLAorMHhENTYyMDAwOSwgMHgyNTIyRTIwMSwgMHhENzVGNjBFMCwgMHgyRTAwQ0IwNCwKKzB4QzkzRjYwNzAsIDB4QTAwMTI3MDAsIDB4RTAwMDYwMjMsIDB4MDAwQjRGMjYsCisweDJGQTY2RUY2LCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweEUyNDBEQTVDLAorMHhEQzU5NjZBMSwgMHgzMTIzNjE2RCwgMHg2MjYzODkwMCwgMHg2RUQzNkQyQywKKzB4NEUyMTM2RDgsIDB4NEUyMTJBNjEsIDB4REI1QkQ0NUEsIDB4RTcwMEEwMEYsCisweDc3MDE2NkIyLCAweDcxMDI2MTYzLCAweDY1NjEyQjEyLCAweDcxMDI2NjEzLAorMHg2MjYxMkIxMiwgMHg2MjJENjU1RCwgMHgzMjVDNDIyOCwgMHg2MjdDMjQyMiwKKzB4OEJFRDMyRTMsIDB4QzkwMzYwRDMsIDB4OEIxMDg4MDMsIDB4RUQwNzZFQjIsCisweDcxMDI2MUUzLCAweDY3MTMyQjEyLCAweDYyRTE3MTAyLCAweDY1NzEyQjEyLAorMHg2NTVENjIyRCwgMHgzNTJDNDUyOCwgMHhBMDBDMkNEMCwgMHg4ODAyMjQ1MiwKKzB4QTAwMzhCMDEsIDB4ODgwMUUyMDMsIDB4RTIwMThCMDUsIDB4NjZCMjJDMjAsCisweDY3N0Q2NzYxLCAweEVCMEYyNDcyLCAweDZEQTEyQ0IwLCAweDhCMDUyREQ4LAorMHhENDMyRDIzRSwgMHhFMTAxRUUwMCwgMHgyNDEyMjJFMiwgMHg2REY2NkVGNiwKKzB4NkJGNjZDRjYsIDB4NkFGNjAwMEIsIDB4MkZFNjJGRDYsIDB4RTI0MEREMzAsCisweDYxNkQ2NkQxLCAweDg5MDAzMTIzLCAweDY3MkM2MjYzLCAweERFMzIzNjc4LAorMHgyRDYxNzcwMywgMHhENjJGNDcyMSwgMHg0NzIxNjRFMiwgMHhFMTAwQTAwRSwKKzB4NzEwMTY1NjIsIDB4MjQ1MDYyNTMsIDB4NDIxOTc0MDEsIDB4NzQwMTI0MjAsCisweDI0NTA0NTI5LCAweDQ1MTk3NDAxLCAweDc0MDEyNDUwLCAweDMyNzM2MjFDLAorMHg0MjAwOEJFRSwgMHg2NEQxNjZFMiwgMHgzNjJDNDIwMCwgMHg4RjA2MjQ0OCwKKzB4REQyMjJFNjIsIDB4RTUwMERFMTUsIDB4MkQ1MkU3MDEsIDB4NkVGNjJFNzIsCisweDZERjYwMDBCLCAweDJGRTYyRkQ2LCAweEVFMDE0RjIyLCAweEVEMEFBMDA1LAorMHg2NEUzQkM5NywgMHg2NEUzQkM5RCwgMHg2MkVDN0UwMSwgMHg4QkY3MzJENywKKzB4RUUwMUEwMDUsIDB4NjRFM0JDOUUsIDB4NjRFM0JDQTQsIDB4NjJFQzdFMDEsCisweDhCRjczMkQ3LCAweDZFRjY0RjI2LCAweDZERjYwMDBCLCAweDAwMjAyOURBLAorMHgwMDIwMUVDMiwgMHgwMDFFMTEwOCwgMHgwMDFFMTAxNSwgMHgwMDIwMjlFMCwKKzB4MDAxRTEwMDEsIDB4MDAyMDI5QjQsIDB4MDAxRTExMDAsIDB4MDAyMDI5REUsCisweDAwMjAyOUNDLCAweDAwMUUxMDAwLCAweDAwMjAyOUQwLCAweDAwMjAyOURDLAorMHgwMDIwMURCNiwgMHgwMDFFMTAwQywgMHgwMDIwMjlDOCwgMHgwMDIwMjlFNCwKKzB4MkZFNjJGRDYsIDB4N0ZGQzRGMjIsIDB4NjA2MEQ2NEMsIDB4ODk0ODg4MDEsCisweEUxMDFENDRCLCAweEQ3NEI4NTQ4LCAweDY1MEQyNjEwLCAweDQ1MTk2MDcwLAorMHg2NjU5REQ0OSwgMHg2MUQzNjI2RSwgMHhDODQwMjYyRCwgMHg3NDAyNzEwMiwKKzB4OEQxQUQ3NDYsIDB4RDI0NjY2NkMsIDB4RTUwMURFNDYsIDB4QTAwNDJFMjIsCisweDYyNDVFRTA0LCAweDIxMjE3NTAxLCAweDYyNUM3MTAyLCAweDhCRjgzMkUzLAorMHg4MUQ0NjA2MywgMHhENTQwRTYwMSwgMHg2MjZDRTQxNywgMHg4OTFFMzI0MywKKzB4NzYwMTYyNTUsIDB4QUZGODI3MjEsIDB4RDIzQzc3MDIsIDB4RTUwMURFMzksCisweEEwMDQyRTIyLCAweDYyNDVFRTA0LCAweDIxMjE3NTAxLCAweDYyNUM3MTAyLAorMHg4QkY4MzJFMywgMHg4MUQ0NjA2MywgMHhENTM1RTYwMSwgMHhFNDE3QTAwNCwKKzB4NzYwMTYyNTUsIDB4NzcwMjI3MjEsIDB4MzI0MzYyNkMsIDB4OTI0QjhCRjgsCisweEQ0MzAyRDIxLCAweDYxNDJENzMwLCAweDY1RjIyRjEyLCAweDYwNTM2REYyLAorMHgyNzAwQzk4MCwgMHhDOTYwNjA1MywgMHg4MDcxNjEwMywgMHg2RUYyNjA1MywKKzB4QzkwMzY1RjIsIDB4NDUyOTREMTksIDB4NjBEQzgwNzIsIDB4ODE3MjQ1MTksCisweDYwNUM0RTI5LCAweDQwMTg2MkVDLCAweDgxNzMzMDJDLCAweDIxMTg2RDQyLAorMHg2RUYyMkZEMiwgMHg2NkYyNjJGMiwgMHg0NjI5NDIxOSwgMHg2NkYyNjU2QywKKzB4NjRFQzYwMkMsIDB4NDYyOTQwMTgsIDB4NDYxOTMwNEMsIDB4NjA2QzgxNzQsCisweDMwNUM0MDE4LCAweDgxNzU4RjA3LCAweDAwMDlCQ0JGLCAweDIyMjg2MjBDLAorMHhBMDBBODkwOCwgMHg2MDEzMDAwOSwgMHg4QjAzODg0MCwgMHgwMDA5QjAwQSwKKzB4MDAwOUEwMDMsIDB4RTIwMkQ2MTEsIDB4N0YwNDI2MjIsIDB4NkVGNjRGMjYsCisweDZERjYwMDBCLCAweDAwMDkwMDBCLCAweDAwMDAwNjBBLCAweDAwMjAyOUU4LAorMHgwMDIwMkM0MCwgMHgwMDFFMTAwMCwgMHgwMDIwMkNENiwgMHgwMDIwMkNFMiwKKzB4MDAyMDJDNTIsIDB4MDAyMDI5RDAsIDB4MDAyMDJDODIsIDB4MDAyMDJDODAsCisweDAwMjAyQzU0LCAweDAwMUUxMDBDLCAweDAwMjAyOUI0LCAweDAwMjAyOUUwLAorMHg0RjIyMkZFNiwgMHhERTkwN0ZGQywgMHgyMDA4ODRFOSwgMHgyRjAwOEQwNiwKKzB4RDY4RkQ0OEUsIDB4MDAwOTQ2MEIsIDB4NjRGMEIxNDYsIDB4NjYyMEQyOEQsCisweDg5MDIyNjY4LCAweEM5QkY2MEUwLCAweDdGMDQyRTAwLCAweDAwMEI0RjI2LAorMHgwMDBCNkVGNiwgMHgyRkU2MDAwOSwgMHhERTg3NEYyMiwgMHg2MEUwRDY4NywKKzB4Q0JDMEQ0ODcsIDB4NjI2MDJFMDAsIDB4QzgwMzYwMkMsIDB4NDAyMTg5MDQsCisweDcwMDE0MDIxLCAweDY2MDNBMDAyLCAweDY2MDM0MDA5LCAweEQ2ODE2MTZELAorMHhFNTAwQTAwNCwgMHg3NTAxNjI2MiwgMHg3NDA0MjQyMiwgMHgzMjEzNjI1RCwKKzB4RDI3RDhCRjgsIDB4MDAwOTQyMEIsIDB4QzlCRjg0RTIsIDB4NEYyNjgwRTIsCisweDZFRjYwMDBCLCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweERDNzI3RkZDLAorMHg4NEMyRDI3NiwgMHhDQjQwREQ3NiwgMHg4MEMyNDIwQiwgMHg4RDA0MjAwOCwKKzB4NjJFMDZFMDMsIDB4QTAwNjY0MkMsIDB4RDY2QTc0MDQsIDB4NjE2MEQ0NzEsCisweDQ3MEJENzcxLCAweDY0NEQ2NTFDLCAweDQ1MjE2NTQzLCAweEEwMDQ0NTIxLAorMHg2MkU2RTYwMCwgMHgyRjIyNzYwMSwgMHg2MjZEMkQyMiwgMHg4QkY4MzI1MywKKzB4QzkwMzYwNDMsIDB4ODkxMjIwMDgsIDB4ODkwNTg4MDMsIDB4ODkwNjg4MDIsCisweDg5MDc4ODAxLCAweDAwMDlBMDA4LCAweEEwMDVFMDA3LCAweEUwMDM4MEQ4LAorMHg4MEQ4QTAwMiwgMHg4MEQ4RTAwMSwgMHgyRjIyNjJFMiwgMHhFMDBGMkQyMiwKKzB4ODBEOEQ2NUUsIDB4Q0IwODYwNjAsIDB4NjBDMDI2MDAsIDB4MkMwMEM5M0YsCisweDRGMjY3RjA0LCAweDZERjY2RUY2LCAweDZDRjYwMDBCLCAweDJGQzYyRkI2LAorMHgyRkU2MkZENiwgMHhEMjU2NEYyMiwgMHg2RTQzNkQ3MywgMHg0MjBCNkI1MywKKzB4MjAwODZDNjMsIDB4NjQwMzhGMDgsIDB4RDI0NUQ0NTIsIDB4NkVGNjRGMjYsCisweDZDRjY2REY2LCAweDZCRjY0MjJCLCAweDI0RTA2MEIzLCAweDYwQzM4MDQxLAorMHhBMDA3ODE0MSwgMHg2NTVERTUwMCwgMHgwMERDNjA1MywgMHgzMjRDNjI1MywKKzB4ODAyNDc1MDEsIDB4NkVFQzYyNUQsIDB4OEJGNDMyRTMsIDB4NjA2MEQ2MzYsCisweDI2MDBDOUJGLCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjYwMDBCLAorMHg3RkM0NEYyMiwgMHg3MjAyNjJGMywgMHgyMjUxMkY0MSwgMHg0NTI5NzIwMiwKKzB4NjA2MzIyNTEsIDB4RTVDNEU2ODIsIDB4NjdGMzgxMjEsIDB4NjU1QzY2NkMsCisweEU0MDhCRkJDLCAweDRGMjY3RjNDLCAweDAwMDkwMDBCLCAweEQyMzdEMTM2LAorMHhFNDA1NjAxMiwgMHhFNTAwQ0IyMCwgMHgyMjQyMjEwMiwgMHgyMjUyMDAwQiwKKzB4RDUzNEQxMzMsIDB4RTQwMEQ3MzQsIDB4MjE0MkUyMEYsIDB4MTc0MTExNTQsCisweEQ1MzIyNzIyLCAweDk2MzVENzMyLCAweDE1NDEyNTcyLCAweDk2MzIxNTYyLAorMHhFNjAxMTU2NSwgMHhENTJGMTE2NSwgMHg2NjZDRTZGOCwgMHgyNTQyMjU0MiwKKzB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsIDB4MjU2MjI1NDIsIDB4NzYwMUU3MjcsCisweDY3NjMyNTcyLCAweDI1NjI3Nzk3LCAweEU3MDQyNTcyLCAweDI1NzJFMjQ4LAorMHhFMjE5MjUyMiwgMHhFMjcwMjUyMiwgMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwKKzB4MjUyMjI1NDIsIDB4MjUyMkUyMEMsIDB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsCisweDI1NDIyNTQyLCAweDI1NDIyNTQyLCAweDAwMEIxNTRBLCAweEUyMDgxMTQ1LAorMHgwMDA5NDIyQiwgMHg1MTYzMDYwMSwgMHgwMDFFMTAxNywgMHgwMDIwMkFGMCwKKzB4MDAyMDBGNzIsIDB4MDAyMDI5QjAsIDB4MDAxRTEwMTUsIDB4MDAxRTEwQkYsCisweDAwMTE3ODAwLCAweDAwMUUxMEZDLCAweDAwMjAwMTAwLCAweDAwMjAyMDFBLAorMHgwMDFFMTBGOCwgMHgwMDIwMkFGNCwgMHgwMDIwMEZCQywgMHgwMDFFMTBBRSwKKzB4MDAyMDFGREMsIDB4MDAyMDJCMTAsIDB4MDAxQzM1MDAsIDB4MDAxRDQwMDQsCisweDAwMUM1ODFDLCAweEEwMDBBMDAwLCAweDAwMUQwMTAwLCAweDAwMUQ0MDAwLAorMHgwMDA0MDAyMSwgMHgwMDFDNTg5QywgMHgyRkU2MkZENiwgMHg3RkZDNEYyMiwKKzB4QzgyMDYwNDMsIDB4NkU0MzhEMDIsIDB4MDAwOUJFQkIsIDB4QzgxMDYwRTMsCisweEJFQjg4OTAxLCAweDYwRTMwMDA5LCAweDg5MDFDODQwLCAweDAwMDlCRURBLAorMHhDODAxNjBFMywgMHhERDM3ODkzNiwgMHhDODAyNjBEMCwgMHgyRjAwOEQwMywKKzB4NDYwQkQ2MzUsIDB4NjBGMDAwMDksIDB4ODkwMkM4MDQsIDB4NDYwQkQ2MzMsCisweDYyRjAwMDA5LCAweEM4ODA2MDIzLCAweDYwRDA4OTAyLCAweDJEMDBDOTdGLAorMHhDODAxNjAyMywgMHhENjJFODkwNCwgMHgwMDA5NDYwQiwgMHgwMDA5QTAwNSwKKzB4ODkwMkM4MDgsIDB4NDYwQkQ2MkIsIDB4NjBGMDAwMDksIDB4ODkwMkM4MTAsCisweDQyMEJEMjI5LCAweEQ1MjkwMDA5LCAweDg4MDI2MDUyLCAweEQyMjg4QjAzLAorMHhBMDA1RTYwNCwgMHg4ODAxMjI2MCwgMHhEMjI1OEIwMiwgMHgyMjYwRTYwMSwKKzB4MjUyMkUyMDAsIDB4Qzg4MDYwRTMsIDB4RDYyMjg5MkUsIDB4NjBFMzZFNjAsCisweDg5MDJDODgwLCAweDQyMEJEMjIwLCAweDYwRTMwMDA5LCAweDg5MDJDODQwLAorMHg0MjBCRDIxRSwgMHg2MEUzMDAwOSwgMHg4OTAyQzgwMiwgMHg0MjBCRDIxQywKKzB4NjBFMzAwMDksIDB4ODkwRUM4MDQsIDB4NDEwQkQxMUEsIDB4QkYxNTAwMDksCisweEJGMUQwMDA5LCAweEQ1MTgwMDA5LCAweDYwNTBENDE4LCAweEM5MDhENzE4LAorMHhCRjU0MjUwMCwgMHg2MEUzMjQ3MiwgMHg4OTA1QzgwOCwgMHg3RjA0RDIxNSwKKzB4NkVGNjRGMjYsIDB4NkRGNjQyMkIsIDB4NEYyNjdGMDQsIDB4MDAwQjZFRjYsCisweDAwMDA2REY2LCAweDAwMUUxMDIxLCAweDAwMjAxMTgyLCAweDAwMjAxMUE0LAorMHgwMDIwMTdCMCwgMHgwMDIwMTFCQywgMHgwMDIwMTFDQywgMHgwMDIwMjlFMCwKKzB4MDAxRTEwMEIsIDB4MDAxRTEwMjgsIDB4MDAyMDEyMjIsIDB4MDAyMDEyMkUsCisweDAwMjAxMUQ0LCAweDAwMjAxMUYyLCAweDAwMUUxMDAwLCAweDAwMTBGMTAwLAorMHgxMjM0NTY3OCwgMHgwMDIwMTIwQSwgMHhENkE4NjQ0QywgMHgzNDZDNzRGRiwKKzB4MjQ1MDAwMEIsIDB4NjQ0Q0Q2QTYsIDB4MDAwQjM0NkMsIDB4RDZBNTI0NTAsCisweDM0NkM2NDRDLCAweDI0NTAwMDBCLCAweDYxNkQ2MjVDLCAweDQxMTk0MjA4LAorMHg2MDE5NDIwOCwgMHg2NDRDNDIwMCwgMHgzMjRDNjcwRSwgMHgyMDdERDE5RSwKKzB4QzkwRjQyMDAsIDB4MDAwQjMyMUMsIDB4Njc2MzIyMDAsIDB4NDIwODYyNUMsCisweDQyMDA0MjA4LCAweDMyNEM2NDRDLCAweDQyMDBEMTk4LCAweDAwMEIzMjFDLAorMHgyRkU2MjI3MCwgMHg2MTRDNEYxMiwgMHg0MTAwRDQ5MywgMHg2NzEwMzE0QywKKzB4MjcyOUUyOUYsIDB4NjU3MzZFNTMsIDB4NDcxOTY3NkQsIDB4NjcyRTYyNzksCisweDQyMjEyMjdELCAweDQyMjE0MjIxLCAweDc2MDE2NjJDLCAweEU0MDE0NjA4LAorMHgzNEU4NDYwOCwgMHg2NDRDNDYwMCwgMHgwRTFBMDQ2NywgMHgyMTUwMjVFQiwKKzB4MDAwQjRGMTYsIDB4NEYyMjZFRjYsIDB4RDI4NTdGRTgsIDB4ODgwMTYwMjEsCisweEQyODQ4QjdCLCAweDI2Njg2NjIxLCAweEQyODM4Qjc3LCAweDI2Njg2NjIxLAorMHhFNTBGOEI3MywgMHhFNDAxQkZBMCwgMHhCRkEzRTUwMSwgMHhFNTg2RTQwMCwKKzB4RTQwMDY1NUMsIDB4MkY1MEJGQTMsIDB4QkZBMEU0MDEsIDB4RTYwMkU1MDYsCisweDYwNjM0NjE4LCAweDgxRjJFNDAxLCAweDY1NDNCRjlFLCAweEU0MDE4NUYyLAorMHhCRkFBNjU0MywgMHg4NUYyNjYwMywgMHg2NTQzRTQwMSwgMHg2NjAzQkZCMSwKKzB4RTQwMjY1RjAsIDB4NjA1Mzc1NkMsIDB4ODBGOEJGN0UsIDB4QkY4MUU0MDIsCisweDg0RjhFNTEyLCAweDcwOTBFNDAyLCAweDY1MDNCRjgxLCAweDQ2MThFNjAyLAorMHg4MUY2NjA2MywgMHhCRjdGRTQwMiwgMHg4NUY2RTUwMCwgMHg2NjAzRTQwMiwKKzB4RTUwMEJGOEIsIDB4RTQwMjg1RjYsIDB4QkY5MjY2MDMsIDB4RTVGRUU1MDAsCisweEUwMTA2NTVDLCAweEJGNUZFNDAzLCAweEU1MTMwRjU0LCAweEU0MEVCRjYyLAorMHgwNUZDRTAxMCwgMHhCRjYyRTQwRSwgMHhFNTAwNzU4NSwgMHhCRjYzRTQwMywKKzB4RTUwMEU2NDAsIDB4QkY3MEU0MDMsIDB4RTUwMEU2NDAsIDB4QkY3OEU0MDMsCisweEU1RkZFNjQwLCAweEUwMTQ2NTVDLCAweEJGNDVFNDA0LCAweEU0MEYwRjU0LAorMHhFNTA0QkY0OCwgMHgwNUZDRTAxNCwgMHhCRjQ4RTQwRiwgMHhFNTAxNzU4NCwKKzB4QkY0OUU2NDAsIDB4RTUwMUU0MDQsIDB4QkY1NkU2NDAsIDB4RTUwMUU0MDQsCisweEU0MDRFNjQwLCAweEFGNUM3RjE4LCAweDdGMTg0RjI2LCAweDAwMEI0RjI2LAorMHg0RjIyMDAwOSwgMHhEMjQyN0ZGMCwgMHg4ODAxNjAyMSwgMHhEMjQxOEI3MSwKKzB4MjY2ODY2MjEsIDB4RDI0MDhCNkQsIDB4MjY2ODY2MjEsIDB4RTUwRjhCNjksCisweEU0MDFCRjFBLCAweEJGMURFNTAxLCAweEU1ODZFNDAwLCAweEU0MDA2NTVDLAorMHgyRjUwQkYxRCwgMHhCRjFBRTQwMSwgMHhFNDAxRTUwNiwgMHhCRjFCNjU0MywKKzB4RTQwMUU2NDAsIDB4QkYyODY1NDMsIDB4RTQwMUU2NDAsIDB4QkYzMDY1NDMsCisweDY1RjBFNjQwLCAweDc1NkNFNDAyLCAweEJFRkQ2MDUzLCAweEU0MDI4MEY0LAorMHhFNTEyQkYwMCwgMHhFNDAyODRGNCwgMHhCRjAwNzA5MCwgMHhFNjQwNjUwMywKKzB4QkYwMUU0MDIsIDB4RTY0MEU1MDAsIDB4QkYwRUU0MDIsIDB4RTY0MEU1MDAsCisweEJGMTZFNDAyLCAweEU1RkVFNTAwLCAweDYwNTM2NTVDLCAweEJFRTNFNDAzLAorMHhFNTEzODBGOCwgMHhFNDBFQkVFNiwgMHhFNDBFODRGOCwgMHhCRUU2NzA4NSwKKzB4RTUwMDY1MDMsIDB4QkVFN0U2NDAsIDB4RTUwMEU0MDMsIDB4QkVGNEU2NDAsCisweEU1MDBFNDAzLCAweEJFRkNFNjQwLCAweEU1RkZFNDAzLCAweDYwNTM2NTVDLAorMHhCRUM5RTQwNCwgMHhFNDBGODBGQywgMHhFNTA0QkVDQywgMHhFNDBGODRGQywKKzB4QkVDQzcwODMsIDB4RTUwMTY1MDMsIDB4QkVDREU2NDAsIDB4RTUwMUU0MDQsCisweEJFREFFNjQwLCAweEU1MDFFNDA0LCAweEU0MDRFNjQwLCAweEFFRTA3RjEwLAorMHg3RjEwNEYyNiwgMHgwMDBCNEYyNiwgMHgwMDAwMDAwOSwgMHgwMDFFMTAzMCwKKzB4MDAxRTEwODAsIDB4MDAxRTEwOTAsIDB4MDAxRTEwM0YsIDB4MDAxRTEwM0UsCisweDAwMjAyOURBLCAweDAwMjAyOURDLCAweDAwMjAyOURFLCAweEQyMUREMTFDLAorMHg2NjIwNjAxMCwgMHg2NzZDNzAwMSwgMHgzNzAwQzkwRiwgMHhFNTAwOEQxMywKKzB4NjcxMDYyMTAsIDB4NzcwMTYyMkMsIDB4NjQyMzIxNzAsIDB4RDYxNjYwMTAsCisweDQ0MDg0NDA4LCAweDM0MjhDOTBGLCAweDYyNjAyMTAwLCAweDcyMDFENTEzLAorMHg0NDA4MjYyMCwgMHgwMDBCMzU0QywgMHhEMTBGNjA1MywgMHgyNTU4NjUxMCwKKzB4RTYwMDhEMTMsIDB4RDYwREQ0MEIsIDB4NjU1QzY1NDAsIDB4NDcwODY3NTMsCisweDM3NTg0NzA4LCAweDQ3MDg2NTQwLCAweDI0NTA3NTAxLCAweDM2N0M2MDQwLAorMHgyNDAwQzkwRiwgMHg3MkZGNjIxMCwgMHgwMDBCMjEyMCwgMHgwMDAwNjA2MywKKzB4MDAyMDI5QUYsIDB4MDAyMDI5QUUsIDB4MDAyMDI5QjAsIDB4MDAyMDI1RDQsCisweDdGRkM0RjIyLCAweEU2ODBEMTlELCAweDY2NkM2MjEyLCAweEQyOUMyRjIyLAorMHg2N0YzNjU2MywgMHg0MjBCNzU0MiwgMHg3RjA0RTQwNCwgMHgwMDBCNEYyNiwKKzB4RTY4MDAwMDksIDB4RDI5NjY2NkMsIDB4RTcwMDY1NjMsIDB4NDIyQjc1NDAsCisweEU2ODA2NDczLCAweEQyOTI2NjZDLCAweEU3MDA2NTYzLCAweDQyMkI3NTQzLAorMHgyRkI2NjQ3MywgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHg0RDE4RUQwMSwKKzB4REI4RERDOEMsIDB4NjVDMjUyQzEsIDB4ODkyMDM1MjAsIDB4QzkwMzYwNTEsCisweDg5MUM4ODAxLCAweEQxODlERTg3LCAweDY0RTM0MTBCLCAweDg1MDM2NTAzLAorMHg2NzBENjZCMiwgMHg4OTA3Mzc2MiwgMHhEMjg2RDQ4NSwgMHgwMDA5NDIwQiwKKzB4RTcwMUQxODUsIDB4MjE3MkFGRTYsIDB4REU4NDY0RTMsIDB4MDAwOTRFMEIsCisweEQ0ODRENjgzLCAweDQxMEJEMTg0LCAweEFGREIyNkQyLCAweDRGMjYwMDA5LAorMHg2REY2NkVGNiwgMHgwMDBCNkNGNiwgMHg0RjIyNkJGNiwgMHg4NTQ2N0ZGNCwKKzB4MkYwMUU2ODEsIDB4NjY2Qzg1NDcsIDB4ODU0ODgxRjEsIDB4ODFGMkQyNzAsCisweDY3RjM4NTQyLCAweDg1NDM4MUYzLCAweDgxRjRFNDBDLCAweDY1NjM2MDUzLAorMHg0MjBCODFGNSwgMHg3RjBDNzU0MCwgMHgwMDBCNEYyNiwgMHgyRjg2MDAwOSwKKzB4MkZBNjJGOTYsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4N0ZGNDRGMjIsCisweERDNkVFMjAwLCAweDJGMjFBMTM2LCAweERENkQ2QTEzLCAweEUwMDE0QTA4LAorMHg0RDBCRDk2QywgMHgzQTlDNEEwMCwgMHgxRjkxNzkzMCwgMHg2NkMyMUYwMiwKKzB4MzYyMDUyQzEsIDB4QTEyMThCMDEsIDB4NjA2MTAwMDksIDB4ODgwMUM5MDMsCisweEExMUI4QjAxLCAweDg1NjEwMDA5LCAweDg5NzdDODAxLCAweDg1RDI1RDYzLAorMHhDOTAzNjYwMywgMHg4NUQzNjQwMywgMHg2MDUzNjUwRCwgMHg0MDIxNDAyMSwKKzB4NDUwMEM5M0YsIDB4MzIyQTYxMDMsIDB4NjA1MzI1MkQsIDB4QzkwMUUyMTAsCisweEQ5NTUzMTIzLCAweDZFMDM4RDIxLCAweDQ0MDhENzU3LCAweDQ0MDg2NTcwLAorMHg0NDAwNjIxMywgMHgyNTU4NDIwMCwgMHgzNDJDOEYwRSwgMHg2MDQzRDI1MywKKzB4NjBFMzA3MkQsIDB4NEIxOTZCN0QsIDB4NjU4RTY4QjksIDB4Mjg1RDg4MDEsCisweDZCN0M4RjBCLCAweDZCMTNBMDA5LCAweDYwNDNEMjRELCAweDYxRUQwRTJELAorMHg2ODE5NDExOSwgMHgyODdENjc4RSwgMHhEMTRBNkJFQywgMHgyMjI4NjIxMiwKKzB4RUJGRjg5MDEsIDB4RUVGRjZCQkMsIDB4NkVFQzY1QkQsIDB4OEIwRjM1RTAsCisweDREMEJERDM2LCAweDU0MDM2NEMzLCAweEJGNzZFNTAyLCAweEQ0NDI2RDAzLAorMHg0MTBCRDEzNiwgMHhENzQxNjVEMywgMHhENDQxRUUwMSwgMHgyN0UyQTAxRCwKKzB4MjZFOUVFRkMsIDB4ODFEMjYwNjMsIDB4OTE0RTg1RDMsIDB4ODFEMzIwMTksCisweDQ1MDg4NUQyLCAweDgxRDIyMDhCLCAweEUyMDg4NUQzLCAweDgxRDMyMDVCLAorMHg0MjE4ODVENCwgMHg4MUQ0MjAyQiwgMHg4NTQxNjRDMiwgMHg4MTQxMjBFOSwKKzB4RDQzNDY1QzIsIDB4Q0IwMTYwNTEsIDB4NDkwQjI1MDEsIDB4NjBDMjAwMDksCisweDUyRjI1NkYxLCAweDJBMDJDQjAxLCAweDI2MjJBRjc5LCAweDQyMEJEMjFCLAorMHg1RTAzNjRDMywgMHg4NUUxNkQwMywgMHg2MDUzNjUwRCwgMHg4OTdCQzgyMCwKKzB4NjIxMEQxMjksIDB4OEIxMTIyMjgsIDB4RDcyNzg1RUYsIDB4NDIyMTYyMEQsCisweDQyMjE0MjIxLCAweEU1MDFENjI1LCAweDI3NTA0MjIxLCAweEQ3MjVEOTI0LAorMHgyNjIxRDQyNSwgMHgyOTYwRTYwMCwgMHgyNDYxMjc2MiwgMHg4NTIxNjJDMiwKKzB4OEI0M0M4MDIsIDB4RDkxMkQ3MUUsIDB4RTAwMTYyNzAsIDB4NjEyQzQ5MEIsCisweDY2OTJEOTFDLCAweEEwM0UyNjBCLCAweDdFMDMyOTYyLCAweDAwMUMzRDlDLAorMHgwMDIwMUEzQywgMHgwMDIwMjVDQywgMHgwMDIwMjk5NCwgMHgwMDIwMEQ0MiwKKzB4MDAyMDI1OTQsIDB4MDAyMDBEQzQsIDB4MDAxRTIxMzAsIDB4MDAyMDBENjAsCisweDAwMUMzRDMwLCAweDAwMjAyQzI4LCAweDAwMjAwRjcyLCAweDAwMjAyNUE0LAorMHgwMDIwMjQ4QywgMHgwMDFDM0QwMCwgMHgwMDIwMkMzQywgMHgwMDIwMkIyOCwKKzB4MDAyMDJCQTgsIDB4MDAyMDI5QTgsIDB4MDAyMDI1OUMsIDB4MDAxRTIxMkMsCisweDAwMjAyQzJDLCAweDAwMjAyQzMwLCAweDAwMjAyRDEwLCAweDAwMjAyOUVFLAorMHgwMDIwMjlFQywgMHgwMDIwMjlGMCwgMHgwMDIwMjlGNCwgMHhFMDRDRDEzOSwKKzB4NzIwMTAyMUUsIDB4RDkzODAxMjYsIDB4NjI5MEQ0MzgsIDB4NzIwMTY1NDEsCisweDI5MjA3NTAxLCAweDg1RTEyNDUxLCAweDQ2MThFNjQwLCAweDg5MUQyMDY4LAorMHhEOTM0RDczMywgMHg2NjVENjE3MSwgMHg2NTkyRDczMywgMHg2NDFENDcwQiwKKzB4RTIwMERFMzIsIDB4MkUyMEEwMTIsIDB4RTkwODg1RTQsIDB4NDkxODYyMDMsCisweDMyOTAyMjk5LCAweEU1MDE4QjA0LCAweDY0RTNCRUI3LCAweDAwMDlBMDA2LAorMHgyNTk4RDkyQiwgMHhFNTAwODkwMiwgMHg2NEUzQkVBRiwgMHhEMjJBRDQyOSwKKzB4NjVEMzQyMEIsIDB4RUUwMUQ3MjksIDB4MjdFMkFFRDksIDB4N0MwODYyRjEsCisweDJGMjE3MjAxLCAweEVFMDQ2MkYxLCAweDMxRTc2MTJELCAweEFFQzM4OTAxLAorMHg3RjBDMDAwOSwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwKKzB4MDAwQjY5RjYsIDB4MkZFNjY4RjYsIDB4RDIxRDRGMjIsIDB4NjBFMzZFMjIsCisweDhEMDJDODQwLCAweEJFMzMyMkUyLCAweEUyNDAwMDA5LCAweDJFMjg0MjE4LAorMHhCRTNFODkwMSwgMHg2MEUzMDAwOSwgMHg4OTA1QzgxMCwgMHhEMjE2RDQxNSwKKzB4MDAwOTQyMEIsIDB4MDAwOUJFM0QsIDB4QzgwNTYwRTMsIDB4QkU4RTg5MDEsCisweDYwRTMwMDA5LCAweDg5MDJDODAyLCAweEFFM0E0RjI2LCAweDRGMjY2RUY2LAorMHg2RUY2MDAwQiwgMHgwMDIwMjUzOCwgMHgwMDIwMjlFQywgMHgwMDIwMjlGNCwKKzB4MDAyMDI5RUUsIDB4MDAyMDI5RjAsIDB4MDAyMDFBQTAsIDB4MDAyMDJEMTAsCisweDAwMDA4MDAwLCAweDAwMjAyNTlDLCAweDAwMjAwRDYwLCAweDAwMUUyMTJDLAorMHgwMDFDMzUxMCwgMHgwMDIwMkMzNCwgMHgwMDIwMEY3MiwgMHgwODBBMEMwRSwKKzB4MDAwMjA0MDYsIDB4MUExQzFFMjAsIDB4MTIxNDE2MTgsIDB4MkUzMDMyMzQsCisweDI2MjgyQTJDLCAweDNBM0MzRTQwLCAweDZDNjI1NjQ4LCAweDQxMTEyRjI2LAorMHhFMjIwOEYxOCwgMHg4OTBCMzEyMywgMHgzMjFDRDIwNCwgMHhEMTAyNjIyMCwKKzB4NDEyQjMxMkMsIDB4MDAwOTAwMDksIDB4MDAyMDI0QjYsIDB4MDAyMDI0NkMsCisweDAwMEJFMDAwLCAweDQwMDA2MkY2LCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLAorMHg0MDAwNDAwMCwgMHg2MkY2MDAwQiwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwKKzB4NDAwMDQwMDAsIDB4NDAxODQwMDAsIDB4NjJGNjAwMEIsIDB4NDAwMDQwMDAsCisweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMjg0MDAwLCAweDYyRjYwMDBCLAorMHg0MDAwNDAwMCwgMHg0MDE4NDAwMCwgMHgwMDBCNDAyOCwgMHhDOTBGNjJGNiwKKzB4NDAwNTQwMDUsIDB4NDAwNTQwMDUsIDB4NjJGNjAwMEIsIDB4NDAwNUM5MDcsCisweDQwMDU0MDA1LCAweDYyRjYwMDBCLCAweDQwMDVDOTAzLCAweDAwMEI0MDA1LAorMHhDOTAxNjJGNiwgMHgwMDBCNDAwNSwgMHgwMDAwNjJGNiwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDU0NEYwRDBBLCAweDQ2MjA1MzU1LAorMHgwMDAwM0E1NywgMHgyMDc5NjE0RCwgMHgzMjIwMzAzMywgMHgyMDM3MzAzMCwKKzB4MzMzQTMyMzEsIDB4MzgzMTNBMzcsIDB4MDAwMDAwMDAsIDB4MDAwMDBEMEEsCisweDAwMDAwMDQzLCAweDQyNzA3MzcyLCAweDNEMjA2Njc1LCAweDU1NEUyMDNELAorMHgyMDJDNEM0QywgMHg2RTQ5Njc3QSwgMHg0RTQ5NzI3NCwgMHg2RDc1NEU1MSwKKzB4MDAwMDAwM0QsIDB4NjE3NjZFNDksIDB4MjA2NDY5NkMsIDB4NzI2NTczNzUsCisweDIwNzI2RjIwLCAweDIwNzk2NTZCLCAweDAwMjE0NDQ5LCAweDUyNTA0NTQ1LAorMHg1NzIwNEQ0RiwgMHg2NTc0Njk3MiwgMHg2NDYxMjAyQywgMHgwMDNENzI2NCwKKzB4NkM2MTc2MjAsIDB4MDAwMDAwM0QsIDB4MDAwMDBBMEQsIDB4NkU2QjZFNTUsCisweDIwNkU3NzZGLCAweDZENkQ2RjYzLCAweDNENjQ2RTYxLCAweDAwMDAwMDAwLAorMHg2MTQzNzc0OCwgMHg3MjYyNjk2QywgMHg2RjY5NzQ2MSwgMHg2NjIwMjA2RSwKKzB4MEE2QzY5NjEsIDB4MDAwMDAwMEQsIDB4NzM2OTZGNEUsIDB4NjE0MzIwNjUsCisweDcyNjI2OTZDLCAweDZGNjk3NDYxLCAweDYxNjYyMDZFLCAweDIxMjE2QzY5LAorMHgwMDAwMEQwQSwgMHgwMDAwMEQwQSwgMHg2MjczNTU3NiwgMHg3NDczNzI1RiwKKzB4MDAwMDBBMEQsIDB4NjI3MzU1NzYsIDB4NzM3NTczNUYsIDB4NjQ2RTY1NzAsCisweDAwMDAwQTBELCAweDYyNzM1NTc2LCAweDczNjU3MjVGLCAweDAwMEEwRDZELAorMHgwMDAwMDA0MiwgMHg3Mjc0NkU0OSwgMHg2RDY1MjA1MSwgMHgyQzc5NzQ3MCwKKzB4NDk2NzdBMjAsIDB4NDk3Mjc0NkUsIDB4NzU0RTUxNEUsIDB4MDAwMDNENkQsCisweDIwNzQ2RjRFLCAweDc1NkY2RTY1LCAweDQ5MjA2ODY3LCAweDQyMjA1MTRFLAorMHgwQTBENjY3NSwgMHgwMDAwMDAwMCwgMHgwMDAwMDBGRiwgMHgwMDAyMDAwMSwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMTBFMDEwRCwgMHgwMDAyMDAwMywKKzB4MDEwOTAxMDgsIDB4MDAwMjAxMEEsIDB4MDAwMzAwMDIsIDB4MDIwMjAyMDEsCisweDAyMDQwMjAzLCAweDAyMDYwMjA1LCAweDAyMDgwMjA3LCAweDAyMEEwMjA5LAorMHgwMjBDMDIwQiwgMHgwMjBFMDIwRCwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAxMEUwMTBELCAweDAwRkYwMTBGLAorMHgwMTA5MDEwOCwgMHgwMTBCMDEwQSwgMHgwMDAzMDAwMiwgMHgwMjAyMDIwMSwKKzB4MDIwNDAyMDMsIDB4MDIwNjAyMDUsIDB4MDIwODAyMDcsIDB4MDIwQTAyMDksCisweDAyMEMwMjBCLCAweDAyMEUwMjBELCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDAyMDUyMjAsIDB4MDAwMDAwNDYsCisweDAwMDAwMDU5LCAweDQ5NTQ0MTIwLCAweDAwMDAyMDRELCAweDAwMDAwMDAwLAorMHgwMjAwMDExMiwgMHg0MEZGRkZGRiwgMHg5MTcwMENGMywgMHgyMDEwNDg5MCwKKzB4MDIwOTAxMDAsIDB4MDEwMTAwMkUsIDB4MDlGQTgwMDAsIDB4MDQwMDAwMDQsCisweDAwMDAwMEZGLCAweDAyMDEwNTA3LCAweDA3MDAwMjAwLCAweDAwMDI4MjA1LAorMHgwNTA3MDAwMiwgMHgwMDQwMDM4MywgMHgwNDA1MDcwMSwgMHgwMTAwNDAwMywKKzB4MDAyRTAyMDksIDB4ODAwMDAxMDEsIDB4MDAwNDA5RkEsIDB4MDBGRjA0MDAsCisweDA1MDcwMDAwLCAweDAwNDAwMjAxLCAweDgyMDUwNzAwLCAweDAwMDA0MDAyLAorMHgwMzgzMDUwNywgMHgwNzAxMDA0MCwgMHg0MDAzMDQwNSwgMHgwMzA0MDEwMCwKKzB4MDMwQzA0MDksIDB4MDA3OTAwNUEsIDB4MDA0MTAwNDQsIDB4MDMxODAwNTMsCisweDAwNTMwMDU1LCAweDAwMzIwMDQyLCAweDAwMzAwMDJFLCAweDAwNTcwMDIwLAorMHgwMDQxMDA0QywgMHgwMDAwMDA0RSwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDA3MDksIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIH07CisKK2NvbnN0IHUzMl90IHpjRndJbWFnZVNpemU9MTE1NDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd3VfMmsuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3dV8yay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZTJjYWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd3VfMmsuYwpAQCAtMCwwICsxLDEwMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgImNwcmVjb21wLmgiCisKK2NvbnN0IHUzMl90IHpjRndJbWFnZVtdID0geworMHgwMDA5MDAwQiwgMHg0RjIyMkZFNiwgMHhERTk0N0ZGQywgMHhFMTE0RDU5NCwKKzB4MUUxM0Q0OTQsIDB4Njc1MjFFNEMsIDB4RDQ5NEQ2OTMsIDB4Mzc0MDI3NjksCisweDYyNTI4RjA2LCAweDcyMDFENjkyLCAweDYwNjAyNTIyLCAweDI2MDBDOTNGLAorMHhENzkwNjE1MiwgMHgyNTEyNjExRCwgMHgyNjRCNjY1MiwgMHgyNTYyNDcwQiwKKzB4MDAwOUIwMTcsIDB4RTYwMDk1QUMsIDB4Qzg0MDYwRTIsIDB4MkYwMjhGMDMsCisweDhGRjkzNjUyLCAweEQ0ODg3NjAxLCAweDRFMEJERTg4LCAweEQ0ODgwMDA5LAorMHgwMDA5NEUwQiwgMHg0RTBCRDQ4NywgMHg3RjA0MDAwOSwgMHhBMDUyNEYyNiwKKzB4NEYyMjZFRjYsIDB4NDEwQkQxODQsIDB4RDQ4NDAwMDksIDB4MDAwOTQ0MEIsCisweDQ1MEJENTgzLCAweEQ3ODMwMDA5LCAweEQyODNFMUZGLCAweDI3MTI2MTFELAorMHhENDgyNTAyOSwgMHhFMUZGQ0IwMSwgMHgxMjA5RTUwMSwgMHgxMjExMjIxMiwKKzB4RTcyMDI0NTIsIDB4NDcxOEQ1N0UsIDB4MjU3MkQyN0UsIDB4RDE3RUU3MDAsCisweEQ2N0ZENDdFLCAweEUyMDEyMjcwLCAweDI0NzAyMTcyLCAweEQ2N0QyNjIwLAorMHgyNjQxRTRGRiwgMHhENTdDRTYwMCwgMHg2NjZERTEwNCwgMHg3NjAxNjA2MywKKzB4NDAwMDYyNkQsIDB4OEZGODMyMTIsIDB4RDU3ODA1NDUsIDB4MjUyMEUyMDEsCisweEQyNzhENzc3LCAweEU0ODBFMTAwLCAweDIyMTIyNzEwLCAweDY2MTNENTc2LAorMHg2NjZENjQ0QywgMHg3NjA0Njc2MywgMHgzNzVDNjI2RCwgMHg4RkY4MzI0MywKKzB4RDU3MjI3MTIsIDB4RDI3M0Q3NzIsIDB4RTQwMEUxMDEsIDB4MjcxMDI1MTEsCisweDAwMEI0RjI2LCAweDdGQ0MyMjQyLCAweEQxNzBENTZGLCAweEQyNzFEQjcwLAorMHgxRjUxRDQ3MSwgMHhENjcxNzUwOCwgMHgxRjEyRDc3MSwgMHgxRjU1NzEwQywKKzB4MUZCOTc1RkMsIDB4NzIwNDFGMkEsIDB4MUYxM0VCMTAsIDB4MUY1NjFGNDQsCisweDFGNzgxRjY3LCAweEQ4NkIxRjJCLCAweERENkNEOTZCLCAweERDNkNFQTAwLAorMHhEMjZEREU2QywgMHg4OTAwM0EyMiwgMHhEMTVEN0EwMSwgMHg4ODAxNjAxMCwKKzB4NTZGODhCMDMsIDB4NDIxOEUyMDEsIDB4RDE2ODI2MjIsIDB4MDAwOTQxMEIsCisweDQ0MEJENDY3LCAweEQ1NjcwMDA5LCAweDAwMDk0NTBCLCAweDYwMTBEMTUwLAorMHg4QjEwODgwMSwgMHhFNjUwRDE0RiwgMHg0NjE4NjIxMiwgMHg4QjA4MzI2NiwKKzB4NTZGOUQxNEIsIDB4MjEyMEUyMDAsIDB4Q0IwMTYwNjIsIDB4MjYwMkEwMDMsCisweDcyMDEyNzEwLCAweDYwODIyMTIyLCAweDg5MDk4ODAxLCAweEUyQzhEMTVBLAorMHg2MjJDNjYxMiwgMHg4OTAzMzYyNiwgMHg2MDEwRDE1OCwgMHg4QkM4ODgwMSwKKzB4NTFGNjY3OTIsIDB4MjE3MjUyRjUsIDB4RDY1NTUxOTEsIDB4NTVGQTIyMTIsCisweDUyRkI2NDYyLCAweDU1NjEyNTQyLCAweDIyNTJFNDAwLCAweDYxNDM2NjQzLAorMHgwNURFNjAxMywgMHgzNkNDNDYwOCwgMHgwN0RFMjY1MiwgMHhDOTAzNjA3MSwKKzB4OEIwMjg4MDEsIDB4NzIwMTYyRTIsIDB4NzQwMTJFMjIsIDB4MzZCMzY2NEMsCisweDcxMDQ4RkVFLCAweDY2QzJEMTQ3LCAweDQ1Mjg2NTEyLCAweDI2NUI0NTE4LAorMHg2MDgyMkM2MiwgMHg4OTAxODgwMSwgMHgwMDA5QTE2OCwgMHg2MjcyRDc0MiwKKzB4OEIxMzIyMjgsIDB4RDQyQkQ3NDEsIDB4Njc3MkQ1NDEsIDB4NTE1MzYyNDIsCisweDMxMkMzMjdDLCAweDI0MjIyMjI4LCAweDE1MTM4RDA1LCAweDYyNjJENjNELAorMHhCMTYyNzIwMSwgMHhENjIzMjYyMiwgMHgyNjIyRTIwMCwgMHg1MjkxNjY5MiwKKzB4OEIwMTM2MjAsIDB4MDAwOUExNDQsIDB4NjA2MUEwNkUsIDB4MDAxQzAwMUMsCisweDAwMUQ0MDIwLCAweDAwMDBCMzhFLCAweEZGRkYwMDAwLCAweDEyMzQwMDAwLAorMHgwMDFFMTAxNSwgMHgwMDIwMTI3NCwgMHgwMDIwMzlFQywgMHgwMDIwMThBMiwKKzB4MDAyMDM5RjgsIDB4MDAyMDNBMTAsIDB4MDAyMDE4NjAsIDB4MDAyMDE5NjQsCisweDAwMjAxMjg4LCAweDAwMUMzNTEwLCAweDAwMUMzNjI0LCAweDAwMUUyMTJDLAorMHgwMDIwMzhFQywgMHgwMDIwMzQ4NCwgMHgwMDIwMzhGNCwgMHgwMDIwMzkwMCwKKzB4MDAyMDM5MEMsIDB4MDAyMDM5NjgsIDB4MDAyMDM5NkMsIDB4MDAyMDM5MTQsCisweDAwMjAzOTE1LCAweDAwMjAzOTE4LCAweDAwMTE3NzAwLCAweDAwMjAzOTg0LAorMHgwMDIwMzk4MiwgMHgwMDIwMzRFOCwgMHgwMDExNzcxMCwgMHgwMDFDM0QzMCwKKzB4MDAxQzM2RjgsIDB4MDAxMTc3MzQsIDB4MDAxQzM2ODQsIDB4MDAxQzNEMDAsCisweDAwMUMxMDAwLCAweDAwMUMxMDI4LCAweDAwMjAzNEZDLCAweDAwMjAzOTFDLAorMHgwMDExNzYwMCwgMHgwMDExNzc0MCwgMHg3RkZGRkZGRiwgMHgwMDIwMTczMCwKKzB4MDAyMDMzMjIsIDB4MDAyMDIzMkMsIDB4MDAyMDNEOUMsIDB4MDAyMDM5NkEsCisweDAwMjAzNEY0LCAweDAwMjAzOTVDLCAweDAwMUMzRDJDLCAweDAwMUMzNkIwLAorMHgwMDIwMzQ4QywgMHgwMDExNzc1QywgMHg4ODAxQzkwRiwgMHhBMENGODkwMSwKKzB4RDE5NjAwMDksIDB4MzYyMDYyMTIsIDB4RDQ5NTg5MDQsIDB4MjQyMUUyMDAsCisweDIxNjJBMENDLCAweDYyMTFEMTkzLCAweDg5MDEyMjI4LCAweDAwMDlBMEMzLAorMHhFMjAyRDc4RiwgMHg3NTAxNjU3MSwgMHgzMTIzNjE1RCwgMHgyNzUxOEQwMiwKKzB4MDAwOUEwQkMsIDB4RDI4QzU3RjIsIDB4NjIyMjYwNzIsIDB4NDAwOTQwMTksCisweEM5MEY0MDA5LCAweDhGMTk4ODBBLCAweDUyRjMxRjJDLCAweDQwMTk2MDIyLAorMHg0MDA5NDAwOSwgMHg4ODA4QzkwRiwgMHhBMEE3ODkwMSwgMHg2MDYzMDAwOSwKKzB4Q0IwMTU0RjcsIDB4RDI3RTU1RjIsIDB4RTcwMTI0MDIsIDB4RDQ3RkUxMDAsCisweDIyMTEyNTcyLCAweDcyMDE2MjQyLCAweDI0MjJBMDk4LCAweDhCM0Y4ODA1LAorMHg2MDIyNTJGMywgMHg0MDA5NDAxOSwgMHhDOTBGNDAwOSwgMHg4QjE2ODgwMiwKKzB4RTRGRkQ1NzcsIDB4NjQ0RDY3NTIsIDB4OEIxMDI3NDgsIDB4NjI3MkQ3NzUsCisweDhCMEMzMjYwLCAweDUxRjI1NUY3LCAweEQyNkRFNzAxLCAweDIxNzIyNTYyLAorMHhENTcxRTEwMCwgMHg2NDUyMjIxMSwgMHhBMDc3NzQwMSwgMHg1MkYzMjU0MiwKKzB4NDAxOTYwMjIsIDB4NDAwOTQwMDksIDB4ODgwNUM5MEYsIDB4MzFCMzhCNkUsCisweEQyNkE4QjZDLCAweDY3MjI1NEY0LCAweDc3MDFENTY5LCAweDYxNDIyMjcyLAorMHgxRjFDRTY0MCwgMHg0NjE4MjE1OSwgMHg4QjAzMzE2MCwgMHg2MjYyRDY2NSwKKzB4MjYyMjcyMDEsIDB4RTIwMEQ2NUEsIDB4MjYyMUIwNjcsIDB4MDAwOUEwNTYsCisweDMxMjNFMjIwLCAweDg4MDM4QjUyLCAweDUyRjM4QjFFLCAweDQwMTk2MDIyLAorMHg0MDA5NDAwOSwgMHg4ODAzQzkwRiwgMHhEMjVCOEIxNiwgMHg2NzIyNTRGNCwKKzB4NzcwMUQ1NTcsIDB4NjE0MjIyNzIsIDB4MUYxQ0U2NDAsIDB4NDYxODIxNTksCisweDhCMDMzMTYwLCAweDYyNjJENjU1LCAweDI2MjI3MjAxLCAweEUyMDBENjQ4LAorMHgyNjIxQjA0MywgMHgwMDA5QTAxMCwgMHhENDUyRDU1MSwgMHhEMjQ0Njc1MiwKKzB4RTEwMDc3MDEsIDB4MjU3MjNBNDYsIDB4MjIxMThGMDYsIDB4RUEwMEQ2NEUsCisweDcyMDE2MjYyLCAweDI2MjJCMDMxLCAweDJGQjJENTRDLCAweDk1NzM2NjUyLAorMHhENDRBNUJGMSwgMHgzNjIwNTI0MSwgMHg2MDYxODkxMCwgMHg4QjAxQzgwMywKKzB4MkIyMkUyMDEsIDB4OEZGNTQ1MTAsIDB4NTdGMTU2NjQsIDB4NjI3MkUxRjAsCisweDQxMjg0MTE4LCAweDI3MjIyMjFCLCAweDZCRjJBMDA4LCAweDZCRjJBMDA2LAorMHhFMjAwRDYyRiwgMHhEMTJGMjYyMSwgMHgyMTIxRTIwMCwgMHhEMTNDRTIwMSwKKzB4NjYxMjI4MjIsIDB4OEIwMTI2NjgsIDB4MDAwOUFFMkIsIDB4NDUwQkQ1MzksCisweEQxMzkwMDA5LCAweEFFMjRFNjAwLCAweDJGODYyMTYwLCAweDJGQTYyRjk2LAorMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHg3RkY0NEYyMiwgMHhERTM0RDEzMywKKzB4NTQxMTYyMTIsIDB4MUY0MTY3RTIsIDB4MkYyMkQ0MzIsIDB4RDUzMjFGNzIsCisweEQyMzI2NzQzLCAweDU4NDE3Nzk0LCAweDY5NDI1QTQyLCAweDVCMTY2QzcyLAorMHg2MDUyNkQyMiwgMHhDQjIwRTYwMCwgMHhFNTQwMjUwMiwgMHg2MjZENzYwMSwKKzB4OEJGQjMyNTMsIDB4NTVGMTYyRjIsIDB4MTE1MTIxMjIsIDB4RDYyODU1RjIsCisweDE0ODEyRTUyLCAweDI0OTIxNEEyLCAweDI3QzJENDI2LCAweDI2RDIxMUI2LAorMHhEQTI1Njc0MiwgMHhFODAxRDkyNSwgMHg0OTBCMkE3MiwgMHhFMjAxMUE4QywKKzB4MUEyQzQyMTgsIDB4NEYyNjdGMEMsIDB4NkRGNjZFRjYsIDB4NkJGNjZDRjYsCisweDY5RjY2QUY2LCAweDY4RjYwMDBCLCAweDAwMDAwN0QxLCAweDAwMjAzOTdDLAorMHgwMDIwMzk4MCwgMHgwMDIwMzk4NiwgMHgwMDFDM0RDMCwgMHgwMDExNzcyQywKKzB4MDAxQzNCODgsIDB4MDAyMDM5NjQsIDB4MDAxMTc3M0MsIDB4MDAxMTc3NDQsCisweDAwMDBGMDAwLCAweDAwMTE3NzY0LCAweDAwMTE3NzQ4LCAweDAwMTE3NzY4LAorMHgwMDExNzc2QywgMHgwMUZGRkZGRiwgMHgwMDExNzc0QywgMHgwMDIwMzRGNCwKKzB4MDAyMDNEOUMsIDB4MDAyMDI0RjAsIDB4MDAyMDM5NkEsIDB4MDAxQzNCOUMsCisweDAwMUMzRDk4LCAweDAwMUMzNzAwLCAweDAwMUMzNTAwLCAweDAwMUM1OTYwLAorMHgwMDFDODk2MCwgMHgwMDIwMzRGQywgMHgwMDFDM0QwMCwgMHgwMDIwMTYwQywKKzB4MkY5NjJGODYsIDB4MkZCNjJGQTYsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweERFOTU3RkFDLCAweDYxRTBFMDE0LCAweDBGMTRENDk0LCAweDcxMDE2MUUzLAorMHhFMDE4NjIxMCwgMHhEMjkyMEYyNCwgMHgwMDA5NDIwQiwgMHg0NTBCRDU5MSwKKzB4MjAwODAwMDksIDB4OEYxMjZEMDMsIDB4RDI4RjFGMDcsIDB4NjcyMEQ0OEYsCisweDY1N0NERDhGLCAweDQ3MEJENzhGLCAweEQxOEYwMDA5LCAweDYxOUM2OTEwLAorMHg0NjA4NjYxMywgMHgzNjE4NDYwOCwgMHgzRDZDNDYwOCwgMHhFMDE4MUZENywKKzB4RTU4MDA0RkMsIDB4NjA0QzY2RTIsIDB4MzA1MDY1NUMsIDB4MkQ2MjhGMTUsCisweDAxRkNFMDE0LCAweERFODVFNTAwLCAweDY0MUNBMDA4LCAweDY3NTM2NTVELAorMHg2MDcwMzdFQywgMHgzOURDNjk1MywgMHg4MDk0NzUwMSwgMHgzMjQzNjI1RCwKKzB4RDY3RjhCRjQsIDB4QTM0RUUyMDAsIDB4MjAwODI2MjEsIDB4RTAxNDhCMTMsCisweEU0MDAwMUZDLCAweEEwMDlERTc5LCAweDY0NEQ2NzFDLCAweDM1RUM2NTQzLAorMHg2OTQzNjY1MiwgMHgzOURDNjI2MiwgMHg3NDA0MTkyMSwgMHgzMjczNjI0RCwKKzB4QTMzODhCRjMsIDB4ODgwMTJEMTAsIDB4RTAxNDhCMTcsIDB4RTcwMDAxRkMsCisweDZEMUMyRDcwLCAweERFNkQxRkQ0LCAweDMyRDM2MjdELCAweEEzMkE4QjAxLAorMHg2NzdEMDAwOSwgMHg2NjczNjVFMywgMHg2MTczNzUwNCwgMHgzMTVDMzZFQywKKzB4NjkxMjY0NjIsIDB4QUZFRjc3MDgsIDB4ODgwNDI0OTIsIDB4RTAxNDhCMTgsCisweEU0MDAwMUZDLCAweDY3MUMyRDQwLCAweDYyNERERTYwLCAweDhCMDEzMjczLAorMHgwMDA5QTMxMSwgMHg2OTQzNjQ0RCwgMHgzOUVDNjJFMywgMHg3MjA0NjU5MiwKKzB4M0QyQzZENDMsIDB4NjE1MjY2RDIsIDB4MjE2OTc0MDgsIDB4MjUxMkFGRUQsCisweDhCMTg4ODA1LCAweDAxRkNFMDE0LCAweDJENDBFNDAwLCAweERFNTM2NzFDLAorMHgzMjczNjI0RCwgMHhBMkY2OEIwMSwgMHg2NDREMDAwOSwgMHg2MkUzNjk0MywKKzB4NjU5MjM5RUMsIDB4NkQ0MzcyMDQsIDB4NjZEMjNEMkMsIDB4NzQwODYxNTIsCisweEFGRUQyMTZCLCAweDg4MzEyNTEyLCAweEQ0NEE4QjNBLCAweDYxNDZEOTRBLAorMHg3NTA0NjU0MywgMHg2NzU2NjQ0MiwgMHg2RTUzMUY0OCwgMHg2NTUyN0UwNCwKKzB4N0VFNDYyRTIsIDB4N0UwNDY0RTIsIDB4NkVFMjFGRTksIDB4NUVGOTI5RTAsCisweDdFMDREOTQyLCAweDFGRUE2MEUyLCAweDI5MDBDOTAxLCAweEQ5NDA2RUUyLAorMHgyOUUwNEUwOSwgMHgyRjU2MkYyNiwgMHg1NkZBRDkzRSwgMHg2NTEzNDkwQiwKKzB4RDEzRDdGMDgsIDB4RTcxQzZFMEQsIDB4MURFMTJENzAsIDB4REUzQjY5MTIsCisweDY0RTIxRDkyLCAweDFENDNEMTNBLCAweEQyM0E2NTEyLCAweDY3MjIxRDU0LAorMHgxRDc1RDIzOSwgMHgxRDY2NjYyMiwgMHg2MjYyRDYzOCwgMHgxRDI3QTJBQiwKKzB4OEIzOTg4MzAsIDB4NjU5NkQ5MkIsIDB4Njc5MjY2OTYsIDB4NjE5Njc5MDQsCisweDc0RTQ2NDkzLCAweDZFNDM2OTkyLCAweDFGOUI3RTA0LCAweDFGRUM2NDQyLAorMHhEOTI1NkVFMiwgMHg1RUZDMjlFMCwgMHg3RTA0RDkyNCwgMHgxRkVENjBFMiwKKzB4MjkwMEM5MDEsIDB4RDkyMjZFRTIsIDB4MjlFMDRFMDksIDB4NTlGQzdGRkMsCisweERFMjcyRjkyLCAweDJGMTY0RTBCLCAweEQ0MUY3RjA4LCAweEUyMUM2MTBELAorMHgxRDExMkQyMCwgMHhEMjIwNjQ0MiwgMHhENDFDMUQ0MiwgMHgxRDUzNjU0MiwKKzB4Njc1MkQ1MUIsIDB4RDcxQjFENzQsIDB4MUQxNTYxNzIsIDB4MUQ2NjY2MjIsCisweDYyNjJENjFBLCAweDFEMjdBMjZGLCAweDhCMzU4ODMzLCAweDQ5MEJEOTE5LAorMHhBMjY4RUUwMCwgMHgwMDAwMkRFMCwgMHgwMDExNzgwMCwgMHgwMDIwM0ExNCwKKzB4MDAyMDE4QTIsIDB4MDAyMDJBQTQsIDB4MDAyMDM5MDYsIDB4MDAyMDNBMTgsCisweDAwMjAzNTJDLCAweDAwMjAxOEVFLCAweDAwMjAzOTA1LCAweDAwMTE3ODA0LAorMHgwMDIwMzk4NCwgMHgwMDExNzgxMCwgMHgwMDIwMzkwMSwgMHgwMDIwMzkwMiwKKzB4MDAyMDM5MDMsIDB4MDAyMDBGNjQsIDB4MDAxQzU4NjQsIDB4MDAxQzY4NjQsCisweDAwMUM3ODY0LCAweDAwMUM1OUJDLCAweDAwMUM2OUJDLCAweDAwMUM3OUJDLAorMHgwMDIwMEZCQywgMHgwMDIwMEZCOCwgMHg4OTAxODgyOCwgMHgwMDA5QTBDMCwKKzB4RTY0M0RFQjUsIDB4MzI2NjYyRTEsIDB4MUZFRThGMDIsIDB4MkUyMUUyNDAsCisweDYyMkQ2MkUxLCAweDhCMDEzMjY3LCAweDAwMDlBMEFBLCAweEU1MDE4NUUxLAorMHg4QjAxMzA1NiwgMHgwMDA5QTBBNCwgMHgyRDEwRTEwMSwgMHg2NEUxQjIyNSwKKzB4RTY0MzU3RkUsIDB4NjUyRDYyNzEsIDB4ODk0NDM1NjcsIDB4MzU2M0U2NDAsCisweEU2MDA4QjA1LCAweDBGNjVFMDQwLCAweEEwMEZFMTFBLCAweDYxNTM3MkMwLAorMHg0MTIxNDEyMSwgMHg0MTIxNDEyMSwgMHg0NTIxNDEyMSwgMHg0NTIxNDUyMSwKKzB4QzkwMzYwNTMsIDB4RTA0MDY2MDMsIDB4NzExODBGNjUsIDB4MjIwOUUwMDcsCisweDBGMjVFMDNDLCAweEUwNDQ2NDFELCAweEIyQTM2NUYzLCAweEUzM0MwRjQ2LAorMHg4NTMyMzNGQywgMHg2MjBEREU5NSwgMHg0MjA4NjAzMSwgMHg2MDIzNjEwRCwKKzB4MTMyM0U5NDQsIDB4MDZGRTQxMDgsIDB4RTAwRjM5RkMsIDB4MTMxNDRFMEIsCisweDY3MDc1RDkxLCAweDYwRDMyNjc5LCAweDBGNjY1NEZFLCAweDUxOTI4NTQyLAorMHg2MDBENEUwQiwgMHg2MEQzMjYwQiwgMHgwRjY2NjQ5MiwgMHg2NUYzQjIzNywKKzB4Njk2MTU2RkUsIDB4RTY0MDY1OUQsIDB4ODkzODM1NjMsIDB4RDc4MzU5RkUsCisweDc5MDY2NTkxLCAweEM5MDM2MDUzLCAweDQwMDA0MDA4LCAweDYxMDM2MjAzLAorMHgwRjI2RTA1MCwgMHg0NzBCRTBGRiwgMHg2QzA3NjAwQywgMHg2NjAzNjA1RCwKKzB4NDYyMTQ2MjEsIDB4NDYyMTQ2MjEsIDB4NDIwMDYyNjMsIDB4NDIwMDMyNkMsCisweDQwMjE0MDIxLCAweDQwMDhDOTAzLCAweDZEMkQzMEZDLCAweEU4MDA2QTAzLAorMHhCMjU3NjVGMywgMHg2RUEyNjREMywgMHgyRUM5RTA1MCwgMHg2Njk0MkFFMiwKKzB4RDc2RTAxRkUsIDB4NjA2QzQ3MEIsIDB4MkFFMjJFMEIsIDB4NjREMzY1RjMsCisweDc4MDFCMUZELCAweEVFMDY2MjhELCAweDhGRTkzMkUzLCAweDVFRkU3RDAxLAorMHg2MUUxRTQwMCwgMHg0MTAwODVFMSwgMHg2NkUzMzEwQywgMHg3NjBDNzExQiwKKzB4RTcwNDY1RjMsIDB4Njg2Njc0MDEsIDB4M0E3MzZBNEQsIDB4OEZGOTI1ODIsCisweDY1RjM3NTA0LCAweDY0MURCMUUzLCAweDY0RTFCMUE0LCAweDAwMDlBMTdCLAorMHhENDVCNTZGNywgMHhFQzAxRDI1QiwgMHgyNkMwNDIwQiwgMHgwMDA5QTE3MywKKzB4MDZGQ0UwMTgsIDB4ODgyOTYwNkMsIDB4NThGNzhCMDgsIDB4RTQwMEQyNTIsCisweDY2MjIyODQwLCAweDY0NkRCMTcxLCAweDAwMDlBMTY1LCAweDY2NkNFNjgxLAorMHg4OTAxMzA2MCwgMHgwMDA5QTBBQywgMHhENTUwRDE0RiwgMHg2MjEyNkE1NiwKKzB4MjEyMjMyQUMsIDB4NTQxMTZDNTYsIDB4MzRDQzYyNTMsIDB4NjQ1MjExNDEsCisweDcyMDg1ODEyLCAweEQ0NEEzODRDLCAweDY4MjIxMTgyLCAweDVBMTM2QzQyLAorMHgzQUNDM0M4QywgMHgxMUEzMjRDMiwgMHg2QzIyNzJFQywgMHg3MjEwNTgxNCwKKzB4MTE4NDM4Q0MsIDB4NUExNTY4MjIsIDB4MTFBNTNBOEMsIDB4NkEyMjcyMTAsCisweEQ2NDA1ODE2LCAweDExODYzOEFDLCAweDUyMTc2QzYyLCAweDExMjczMkNDLAorMHg1QTE4NTg2MSwgMHgxMUE4M0E4QywgMHg1QzE5NUE2MiwgMHgxMUM5M0NBQywKKzB4NTIxQTVDNjMsIDB4MTEyQTMyQ0MsIDB4NUExQjU4NjQsIDB4MTFBQjNBOEMsCisweDVDMUM1QTY1LCAweDExQ0MzQ0FDLCAweDUyMUQ1QzY2LCAweDExMkQzMkNDLAorMHg1QTFFNTg2NywgMHgxMUFFM0E4QywgMHg1NjFGNUE2OCwgMHgzNkFDRTg0MCwKKzB4MTE2RkRBMkQsIDB4NkNBMjM4MUMsIDB4N0E5NDY2ODIsIDB4Mjg2MjM2Q0MsCisweDVDODE2MkEyLCAweDE4QzEzQzJDLCAweDYyQTI3QTQ0LCAweDM2MkM1NjgyLAorMHhENjI2MTg2MiwgMHg1QTg1NjI2MiwgMHgzQTJDNDIyOSwgMHg3NjA0MThBNSwKKzB4NTY4NjYyNjIsIDB4MzYyQzQyMjksIDB4NTZGNzE4NjYsIDB4MjYyMEUyMzgsCisweDE2QzE1QzgxLCAweDE2MjI2MjEyLCAweEUyMDA1QzExLCAweDU1MTIxNkMzLAorMHg1NTE1MTY1NCwgMHg1NTEzMTY1NSwgMHg1NTE2MTY1NiwgMHg1NTgyMTY1NywKKzB4NjU4MjE2NTgsIDB4NTUxNDE2NTksIDB4NTU4NDE2NUEsIDB4NTU4MzE2NUIsCisweDU1ODUxNjVDLCAweDU1ODYxNjVELCAweDE4MjExNjVFLCAweDExMjEyMTIyLAorMHgxMTI1MTEyMiwgMHgxMTI2MTEyMywgMHgyODIyMTgyMiwgMHgxODI0MTEyNCwKKzB4MTgyNTE4MjMsIDB4MTgyNkEwQzcsIDB4MDAxMTc4MDQsIDB4MDAyMDMzRTAsCisweDAwMjAzQTM4LCAweDAwMjAxOEEyLCAweDAwMjAzNDhDLCAweDAwMUMzNkEwLAorMHgwMDIwMzRFOCwgMHgwMDFDM0NBMCwgMHgwMDFDMzZGNCwgMHgwMDFDM0I4OCwKKzB4NjY2Q0U2ODIsIDB4OEIyMDMwNjAsIDB4RUEyNDU2RjcsIDB4MjZBMEQxOTQsCisweDE2QzE1QzE3LCAweDE2MjI1MjE4LCAweDE2ODM1ODE5LCAweDE2QTQ1QTFBLAorMHgxNkM1NUMxQiwgMHgxNjI2NTIxQywgMHhFMjAwNTgxRCwgMHg1NTFFMTY4NywKKzB4NTUxRjE2NTgsIDB4MTEyNzE2NTksIDB4MTEyOTExMjgsIDB4MTEyQjExMkEsCisweDExMkQxMTJDLCAweEEwOEUxMTJFLCAweEU2ODMxMTJGLCAweDMwNjA2NjZDLAorMHg1MkY3OEIwQiwgMHhFQTAwRDg4MywgMHg2NTgyMjJBMCwgMHg3ODA0REM4MiwKKzB4NjI4MjJDNTIsIDB4QTA3RUQ2ODEsIDB4RTY5MDI2MjAsIDB4MzA2MDY2NkMsCisweERBN0Y4QjA2LCAweDAwMDk0QTBCLCAweEUyMDA1NkY3LCAweDI2MjBBMDczLAorMHg2NjZDRTY5MSwgMHg4QjEwMzA2MCwgMHg2MjIyRDI3NiwgMHgyMjI4NjIyQywKKzB4RDI3ODg5MDQsIDB4MDAwOTQyMEIsIDB4MDAwOUEwMDMsIDB4NDIwQkQyNzYsCisweDU2RjcwMDA5LCAweEEwNUVFMjAwLCAweEU2OTIyNjIwLCAweDMwNjA2NjZDLAorMHhFMDE4ODk1MSwgMHhFNkIwMEJGQywgMHg2NjZDNjJCQywgMHg4QjJBMzI2MCwKKzB4MDJGQ0UwMTQsIDB4NjgyQ0VBMDAsIDB4NjJBREU5MDQsIDB4ODk0QTMyODMsCisweDZBQURERDY0LCAweDNDREM2Q0EzLCAweDdEMDQ2RUMyLCAweERCNjhENDY3LAorMHgzMkRDNjJBMywgMHg0QjBCREM2NywgMHg0QzBCNkQyMiwgMHhENDY2NjRFMywKKzB4MDAwOTRCMEIsIDB4NjREMzRDMEIsIDB4NEIwQkQ0NjQsIDB4RTYwMDAwMDksCisweDY2NkQ2QkUzLCAweDc2MDEzQjZDLCAweDMyOTM2MjZELCAweDhGRjcyQkQwLAorMHhBRkRBNEQxOSwgMHhFNkI1N0EwOCwgMHgzMjYwNjY2QywgMHhENDVDOEIxMywKKzB4NEIwQkRCNTcsIDB4RDI1QjAwMDksIDB4NjAyMkRCNUIsIDB4Q0IyMEU2RkYsCisweDIyMDI2NjZELCAweERCNTkyQjYyLCAweEUwMTRFMjAwLCAweDU2RjcyQjIwLAorMHhBMDEwMDJGQywgMHhENDU2MjYyMCwgMHg2NTQyRDI1NiwgMHg0MjBCRDQ1NiwKKzB4QTAwODAwMDksIDB4REI1MjAwMDksIDB4NTJCMUU2MDAsIDB4NjIyQ0RCNTMsCisweDUyRjcyQjIxLCAweDdGNTQyMjYwLCAweDZFRjY0RjI2LCAweDZDRjY2REY2LAorMHg2QUY2NkJGNiwgMHgwMDBCNjlGNiwgMHg0RjIyNjhGNiwgMHhFMjQwNjE0RCwKKzB4ODkxNDMxMjMsIDB4MzEyN0UyMUYsIDB4OEIwOUQ3NDksIDB4RDQ0OTYxNEQsCisweEUwMDE3MUUwLCAweDU2NzE0NDBCLCAweDI2NTk2NTA3LCAweDE3NjFBMDA3LAorMHhFMDAxRDQ0NCwgMHg2NjcyNDQwQiwgMHgyNjU5NjUwNywgMHg0RjI2Mjc2MiwKKzB4MDAwOTAwMEIsIDB4NjE0RDRGMjIsIDB4MzEyM0UyNDAsIDB4RTIxRjg5MTIsCisweEQ3M0IzMTI3LCAweDYxNEQ4QjA4LCAweDU2NzFEMjNBLCAweDQyMEI3MUUwLAorMHgyNjBCRTAwMSwgMHgxNzYxQTAwNiwgMHg2NjcyRDIzNiwgMHhFMDAxNDIwQiwKKzB4Mjc2MjI2MEIsIDB4MDAwQjRGMjYsIDB4RTY0MDAwMDksIDB4NDYyODQ2MTgsCisweDYyNTJENTMxLCAweDg5RkMyMjY4LCAweDAwMDkwMDBCLCAweDQ2MThFNjgwLAorMHhENTJENDYyOCwgMHgyMjY4NjI1MiwgMHgwMDBCODlGQywgMHhBMDAxMDAwOSwKKzB4NzIwMUUyMDAsIDB4OEJGQzMyNDIsIDB4MDAwOTAwMEIsIDB4NDYxOEU2ODAsCisweEQ1MjY0NjI4LCAweDIyNjg2MjUyLCAweDAwMEI4QkZDLCAweDJGRTYwMDA5LAorMHg3RkZDNEYyMiwgMHhCRkYxNkU1MywgMHg2MUUyMkY0MiwgMHhFMjgwRDYyMCwKKzB4NTRFMTE2MTUsIDB4MTY0NjQyMTgsIDB4NDIyODU1RTIsIDB4NTdFMzE2NTcsCisweDE2Nzg2RUYyLCAweDI2RTIyRTJCLCAweDRGMjY3RjA0LCAweDZFRjZBRkNFLAorMHgwMDIwMzQ4QywgMHgwMDExNzgwNCwgMHgwMDIwMzhFQywgMHgwMDIwMzkwMCwKKzB4MDAyMDA1MEEsIDB4MDAyMDEwMDgsIDB4MDAyMDEwMkUsIDB4MDAyMDNBNTAsCisweDAwMjAxOEEyLCAweDAwMjAxOEU2LCAweDAwMjAzQTY0LCAweDAwMjAzQTZDLAorMHgwMDIwM0E3MCwgMHgwMDFDMzUwMCwgMHgwMDFDMTAwMCwgMHgwMDIwMzk4MiwKKzB4MDAxMTc4MDAsIDB4MDAyMDE4RUUsIDB4MDAyMDNBODQsIDB4MDAyMDM5ODgsCisweDAwMUMzNzA0LCAweDAwMjAzM0UwLCAweDAwMUMzNzNDLCAweDAwMUMzNzAwLAorMHgwMDFDMzcwQywgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHg2QzUzREQxMCwKKzB4NkU0M0JGQTQsIDB4MkRFMkJGODksIDB4MDAwOUJGQTAsIDB4MkMxMjUxRDUsCisweDFDNDE1NEQ2LCAweDFDNTI1NUQ3LCAweDFDNjM1NkQ4LCAweDZFRjY0RjI2LAorMHgwMDBCNkRGNiwgMHg2MTYzNkNGNiwgMHhBMDA0RTYwMCwgMHg2MjU2NDEwOSwKKzB4MjQyMjc2MDEsIDB4MzYxMjc0MDQsIDB4MDAwQjhCRjksIDB4MDAwMDAwMDksCisweDAwMUMzNzBDLCAweDAwMDlBMTZFLCAweDJGRTYyRkQ2LCAweEREOTQ0RjIyLAorMHhBMDA0OUVCMiwgMHhENDkzMDAwOSwgMHg0MjBCRDI5MywgMHg2MkQyNjVEMiwKKzB4OEJGODIyRTgsIDB4MDAwOUEwMDQsIDB4RDI4RkQ0OTAsIDB4NTVEMTQyMEIsCisweDIyRTg1MkQxLCAweEEwMDQ4QkY4LCAweEQ0OEQwMDA5LCAweDQyMEJEMjhBLAorMHg1MkQyNTVEMiwgMHg4QkY4MjJFOCwgMHgwMDA5QTAwNCwgMHhEMjg2RDQ4OSwKKzB4NTVEMzQyMEIsIDB4MjJFODUyRDMsIDB4QTAwNDhCRjgsIDB4RDQ4NjAwMDksCisweDQyMEJEMjgxLCAweDUyRDQ1NUQ0LCAweDhCRjgyMkU4LCAweDZFRjY0RjI2LAorMHg2REY2MDAwQiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHg2RTYzNkM3MywKKzB4NkQ1M0IwMUEsIDB4NjREMzU3RjQsIDB4QjA1RjY1RTMsIDB4QjA3NTY2QzMsCisweEIwQTQwMDA5LCAweEIwQTgwMDA5LCAweEIwQUMwMDA5LCAweEIwQUMwMDA5LAorMHhCMEFGMDAwOSwgMHhCMDMxNTRGNSwgMHg2Q0NENkMwMywgMHg0RjI2NjBDMywKKzB4NkRGNjZFRjYsIDB4NkNGNjAwMEIsIDB4MzQxMkQxNzAsIDB4RDY3MDA1MjksCisweDI2NTBENzcwLCAweDI3NDIwMDBCLCAweDAwMDlBMDE4LCAweDJGRDYyRkM2LAorMHg0RjIyMkZFNiwgMHg2RTYzNkM3MywgMHg2RDUzQkZFRSwgMHg2NEQzNTdGNCwKKzB4QjAzMzY1RTMsIDB4QjA4RDY2QzMsIDB4QjAwRjU0RjUsIDB4NkNDRDZDMDMsCisweDRGMjY2MEMzLCAweDZERjY2RUY2LCAweDZDRjYwMDBCLCAweEU1MDNEMTYyLAorMHhENzYzRDQ2MiwgMHgyMTUyNDUxOCwgMHgyNDcyMDAwQiwgMHhENDVGRDE1RSwKKzB4MjE2MkU2MDAsIDB4MjQ2MjAwMEIsIDB4QkY3MzRGMjIsIDB4QkY3M0U0MEEsCisweEQyNUMwMDA5LCAweDQxMThFMTA0LCAweEU0MEFFNTAwLCAweEJGNjkyMjEyLAorMHhENzU5MjI1MiwgMHhDQjIwNjA3MiwgMHgwMDBCNEYyNiwgMHg0RjIyMjcwMiwKKzB4NDEwQkQxNTYsIDB4RDU1NkU0MDAsIDB4NEYyNjQ1MkIsIDB4RDE1NTJGRTYsCisweDY2MTI2RTYzLCAweDkyMTA0NDE4LCAweDQ0MDg0NTI4LCAweDQ1MDAyNjI5LAorMHgyNjVCNDQwOCwgMHgyNjRCNDQwMCwgMHgyMTYyNDcwOCwgMHhEMTRFNDcwOCwKKzB4MjE3MjI3RUIsIDB4NkVGNjAwMEIsIDB4MUZGRjAzRjAsIDB4NEYyMjJGRTYsCisweEUxMDFERTRBLCAweEJGM0RFNDBBLCAweDY3RTMyRTEyLCAweEU1MDA3NzZDLAorMHhFMjA0RTEzMCwgMHgyNzUyRTQwQSwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwKKzB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsCisweDI3NTIyNzUyLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLCAweDI3MjIyNzEyLAorMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwKKzB4MTc1QUJGMTgsIDB4MkU2MkU2MDAsIDB4MDAwQjRGMjYsIDB4RDIzNDZFRjYsCisweEU0NDFFMTAxLCAweDAwMEIyMjEyLCAweEQxMzIyMjQyLCAweEU2MDVENDMyLAorMHgwMDBCMjE2MiwgMHgwMDBCMjQ2MiwgMHhEMjMwMDAwOSwgMHhFNDBBRTYwMSwKKzB4MjI2MkFGMDAsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4N0ZGQzRGMjIsCisweDZDNDNEQjJCLCAweEVEMDA2MEIyLCAweDJCMDJDQjAzLCAweEM5MDM2MEIyLAorMHg2RTAzQTAwOCwgMHg4OTA3M0RDMiwgMHhFNDY0NjBCMiwgMHhCMDdDQzkwMywKKzB4N0QwMTZFMDMsIDB4OEJGNTJFRTgsIDB4OEYwNDNEQzIsIDB4RDQyMTJGRTEsCisweDQ2MEJENjIxLCAweDYyRjEwMDA5LCAweDYwMjM2MjJELCAweDg5RkZDODAxLAorMHg3RjA0NjAyMywgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QkY2MDAwQiwKKzB4MDAxQzNCODgsIDB4MDAyMDNBOTgsIDB4MDAyMDE4RUUsIDB4MDAyMDNBQTAsCisweDAwMjAzQUE4LCAweDAwMjAzQUIwLCAweDAwMjAzQUI4LCAweDAwMjVFNzIwLAorMHgwMDIwM0Q5OCwgMHgwMDIwMzhGMCwgMHgwMDFDNTk2OCwgMHgwMDFDM0I0MCwKKzB4MDAwRjgwMDAsIDB4MDAxRDQwMDQsIDB4MDAxQzM1MDAsIDB4MDAyMDE1RTAsCisweDAwMjAxNjBDLCAweDAwMUM1ODE0LCAweDAwMUM1OUQwLCAweDAwMUM1ODMwLAorMHgwMDFDNjI2OCwgMHgwMDFDNTlBNCwgMHgwMDFDNjM5QywgMHgwMDFDNTgxQywKKzB4MDAxQzU4NjAsIDB4MDAyMDNBQzAsIDB4MDAyMDE4QTIsIDB4OEYwMTQ0MTEsCisweDYwNDM2MDRCLCAweDAwMDkwMDBCLCAweDU2NTFENTJCLCAweDQ2Mjg2MDUyLAorMHgzMDZDMDAwQiwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHg0RjEyNEYyMiwKKzB4QkZGMTRGMDIsIDB4NkIwMzZFNDMsIDB4REQyNURDMjQsIDB4MDAwOUJGRUMsCisweDNDMDUzMEI4LCAweDQ2MDkwNjBBLCAweDQ2MDE0NjA5LCAweDAyMEEzRDY1LAorMHg0MjA5NDIwOSwgMHgzMkUyNDIwOSwgMHg0RjA2OEJGMCwgMHg0RjI2NEYxNiwKKzB4NkRGNjZFRjYsIDB4MDAwQjZDRjYsIDB4MkZDNjZCRjYsIDB4MkZFNjJGRDYsCisweDRGMTI0RjIyLCAweEJGQ0Y0RjAyLCAweDZDMDM2RTQzLCAweEJGQ0JERDEzLAorMHgzMEM4MDAwOSwgMHgwNjBBM0QwNSwgMHg0NjA5NDYwOSwgMHgzNkUyNDYwMSwKKzB4NEYwNjhCRjUsIDB4NEYyNjRGMTYsIDB4NkRGNjZFRjYsIDB4NkNGNjAwMEIsCisweDRGMjIyRkU2LCAweEUxMDJERTBCLCAweEU0MDNFNTAwLCAweEJGQjkyRTEyLAorMHhFNjA2MkU1MiwgMHhFNzAwNDYxOCwgMHgyRTYyRTQwMywgMHg0RjI2MkU3MiwKKzB4NkVGNkFGQjAsIDB4MDAwOTAwMEIsIDB4MDAxQzEwNDAsIDB4Q0NDQ0NDQ0QsCisweDEwNjI0REQzLCAweDAwMUQ0MDA0LCAweDJGOTYyRjg2LCAweDJGQjYyRkE2LAorMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHhFNTAwN0Y5OCwgMHg2NDUzRTcxMCwKKzB4NkI1MzQ3MjgsIDB4RUUxQURDQkMsIDB4NjE1MzY1NUQsIDB4MzE1QzQxMDgsCisweDc1MDE0MTA4LCAweDYwNDMzMTdDLCAweDBGMTY2NjVELCAweEVEMDA2MEIzLAorMHgyMUIxMzZFMywgMHg4MTEyODExMSwgMHgxMUQyODExMywgMHgxMUQ0MTFEMywKKzB4NzQwNDhGRUEsIDB4RDhCMTY3RjIsIDB4MTg3MUQ5QjEsIDB4NThGMTI4NzIsCisweDE5ODFEMUIwLCAweDU5RjIyOTgyLCAweDVERjQ1QUYzLCAweDU0RjY1RUY1LAorMHgyMTkyMTE5MSwgMHgxMUEyMTFBMywgMHgxMUQ0MTFENSwgMHgxMUU2MTFFNywKKzB4MTE0ODExNDksIDB4REFBODU1RjcsIDB4NTdGOEVFMDAsIDB4NTJGOUREQTcsCisweDY0RTNENkE3LCAweDJBNTIxQTUxLCAweEQ4QTdEOUE2LCAweDJENzI5QUQ1LAorMHg2RUVEMjYyMiwgMHg0RDA4NkRFMywgMHgzREVDNjFFMywgMHg0RDA4NDEwOCwKKzB4M0Q5QzMxRUMsIDB4NDEwODYwQjMsIDB4ODFEMTJEQjEsIDB4NDEwOEUwNTAsCisweDQwMDhFN0I3LCAweDY3N0M0MTA4LCAweDYwQjM4MUQyLCAweEUyMDAzMThDLAorMHg4MUQzMzQ3MiwgMHgxRDEzMUREMiwgMHg4RDAxRDQ5MywgMHhENDkwMUQyNCwKKzB4QjBCMzY1RDMsIDB4NjRFRDdFMDEsIDB4OEJEQTM0QTIsIDB4MkZEMkRBOEMsCisweEREOTI2OEEyLCAweDJEODI0ODI5LCAweDdERkM2NEEyLCAweEQyODc2OTRELAorMHg2RTIyMkQ5MiwgMHg3RDBDNEUyOSwgMHg2ODIyMkRFMiwgMHg2MThENkFEMywKKzB4MkExNkQ3ODQsIDB4RDQ4QTZENzIsIDB4MjREMkQ1ODMsIDB4RDY4OTVFNzIsCisweDUxNzQxNEUyLCAweDE0MTRFRTAwLCAweEQxODc1ODc2LCAweDU5NzgxNDg2LAorMHgxNDk4RTcxMCwgMHg2NUUzNjI1MiwgMHgyNkUyMTQyQSwgMHhFNjAwNjRFMywKKzB4Njg0MzY0NEQsIDB4Mzg0QzQ4MDgsIDB4MzgxQzQ4MDgsIDB4MEM4NjYwNTMsCisweDA5Q0UyOEIxLCAweDgxOTE2MEIzLCAweDBBQ0U2MDUzLCAweDgxQTI2MDQzLAorMHgwRENFNjA1MywgMHg4MUQzNjBCMywgMHgwOENFNjA1MywgMHgxODgyNzQwMSwKKzB4NjI0RDA5Q0UsIDB4MEFDRTE5RTMsIDB4MUE2NDMyNzMsIDB4NzUwNDhGRTAsCisweEUwMDNEOTZBLCAweDQwMTg2QzkyLCAweDZEOTIyQ0IxLCAweDgxRDFEQTZGLAorMHg2RTkyRTA1MCwgMHg4MUUyNDAwOCwgMHg2MEIzNjE5MiwgMHg2NDkyODExMywKKzB4MTQ0MkU2MDAsIDB4RDQ2OTY3OTIsIDB4Njg5MjE3QTMsIDB4MTg2NEUxRkYsCisweDY1NjNFNzAzLCAweDM2NEM0NjA4LCAweDI2MTI3NTAxLCAweDM2NzM2NjVELAorMHhEQzVCOEJGOCwgMHg2REMyRTAwMywgMHgyREIxNDAxOCwgMHhEMjYwNkVDMiwKKzB4NjFDMjgxRTEsIDB4MTExMkVFMDAsIDB4RTAyNDY0QzIsIDB4NjVDMjE0MjMsCisweDE1RTRENDVCLCAweEU1ODA2N0MyLCAweDY4QzI4MTcyLCAweDgxODM2NkUzLAorMHg2NjZENjU1QywgMHg3NjA0Njk2MywgMHgzOTRDNkE2RCwgMHg4RkY4M0E1MywKKzB4REI1NDI5RTIsIDB4MjRCMkRDNTQsIDB4MjRDMjc0MDQsIDB4NEYyNjdGNjgsCisweDZERjY2RUY2LCAweDZCRjY2Q0Y2LCAweDY5RjY2QUY2LCAweDY4RjYwMDBCLAorMHg2MDExNjE0MiwgMHg4RjAzQzgwMywgMHhEMjNERTUwMCwgMHg4QjA2MzQyMCwKKzB4QzkwMzYwMTEsIDB4OEIwNjg4MDIsIDB4MzQyMEQyMzksIDB4NTYxMjhCMDMsCisweDUyNjQ2NTEzLCAweDAwMEIyNDIyLCAweDAxMTM2MDUzLCAweDJGRTYyRkQ2LAorMHg3RkVDNEYyMiwgMHg2MjUzNkU1MywgMHg2RDQzRTU1MCwgMHg0NTA4RTQwMCwKKzB4RTEwMUEwMDEsIDB4NjA0MzUyMjQsIDB4ODEyMTIyMTEsIDB4NjA1MzgxMjMsCisweDU2RTI4MTIyLCAweDhCRjUzNjIwLCAweDE2RTREMjM4LCAweEU2MTQ2NEYzLAorMHg2NUUzNDIwQiwgMHhFNEZDNjVFMSwgMHgyRTUxMjU0OSwgMHg2NUYzNjFGMSwKKzB4MkYxMTIxNDksIDB4RDEzMTU0RDEsIDB4RTYxNDQxMEIsIDB4NjA3MTU3RDEsCisweDI3MDFDQjAxLCAweDdGMTQxREUxLCAweDZFRjY0RjI2LCAweDZERjYwMDBCLAorMHgyRkU2MkZENiwgMHg3RkVDNEYyMiwgMHg2NjUzNkU1MywgMHg2RDQzRTVGQywKKzB4MjA1OTYwNjEsIDB4MjYwMUNCMDEsIDB4MzI2MDUyRTIsIDB4MTJFNDhCMDYsCisweDMxRTA1MUUyLCAweDUyRDE4QjA0LCAweDFFMjJBMDAyLCAweDU2NjRBRkYwLAorMHg2NEYzRDIxRSwgMHg0MjBCRTYxNCwgMHg2N0UxNjVFMywgMHgyNzE5RTFGQywKKzB4NjdGMTJFNzEsIDB4MjcxOTU0RDEsIDB4NjVGM0QxMTgsIDB4NDEwQkU2MTQsCisweDUyRDEyRjcxLCAweENCMDE2MDIxLCAweDFERTEyMjAxLCAweDRGMjY3RjE0LAorMHgwMDBCNkVGNiwgMHgwMDAwNkRGNiwgMHgwMDIwMzkxQywgMHgwMDIwMzRFQywKKzB4MDAyMDM0RjQsIDB4MDAyMDM0RkMsIDB4MDAyMDM1MjQsIDB4MDAyMDM5MDgsCisweDAwMjAzOTEwLCAweDAwMTAwMjA4LCAweDAwMTAxN0MwLCAweDAwMUUyMTBDLAorMHgwMDFDM0QwMCwgMHgwMDIwMzk1QywgMHgwMDEwMDBDOCwgMHgwMDExNzg4MCwKKzB4MDAxMTc3ODAsIDB4MDAwNDAwMjAsIDB4MDAyNkM0MDEsIDB4MDAyMDBFRDYsCisweDRGMjIyRkU2LCAweERFNDI2MjRDLCAweDQyMDA0MjA4LCAweDNFMkNBMDA1LAorMHhENDQwNTI1MiwgMHhCRjY5NTYyNCwgMHg2NUUyMkU2MiwgMHgzNTIwNTJFMSwKKzB4RDYzRDhCRjYsIDB4NEYyNjI2MjIsIDB4NkVGNjAwMEIsIDB4MkZDNjJGQjYsCisweDJGRTYyRkQ2LCAweERDMzk0RjIyLCAweDUyQzFEQjM5LCAweDM2MjA2NkMyLAorMHg2MDYxODkxQywgMHg4ODAxQzkwMywgMHhERTM0ODkxOCwgMHhCRjM3REQzNSwKKzB4NjUwMzY0RTMsIDB4NjZCMjg1MDMsIDB4MzI2MjYyMEQsIDB4RDQzMjg5MDcsCisweDAwMDlCRjc2LCAweDREMEJENDMxLCAweEFGRTYwMDA5LCAweEJGM0QwMDA5LAorMHhENDJGNjRFMywgMHgwMDA5NEQwQiwgMHgwMDA5QUZERiwgMHgyMjYyRDIyRCwKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjAwMEIsIDB4MkZENjJGQzYsCisweDRGMjIyRkU2LCAweEREMjlEQzI4LCAweDZFNDM2MEMyLCAweDA0REU0MDA4LAorMHhFNjE0RDEyNywgMHg2NUUzNDEwQiwgMHhEMTI3RDcyNiwgMHg1NUUyMjdFMiwKKzB4MzVFMDUyNTQsIDB4MjEyMjhGMDQsIDB4NDAwODYwQzIsIDB4MTIyMjAyREUsCisweDYwNTM2NUMyLCAweDc1MDE0MDA4LCAweDBERTYwNkRFLCAweEM5MEY2MDUzLAorMHg2MDYzMkMwMiwgMHg2RUY2NEYyNiwgMHgwMDBCNkRGNiwgMHg4NTQzNkNGNiwKKzB4NjUwRDU2NDMsIDB4NjIyRDYyNjIsIDB4MzUyNzcyMDQsIDB4RTEwMDhGMEMsCisweDIyNjg5NjBDLCAweEQ2MTU4QjAzLCAweDcyMDE1MjYxLCAweEQ2MTMxNjIxLAorMHg2MjYyRTEwMSwgMHgyNjIyNzIwMSwgMHg2MDEzMDAwQiwgMHgwMDAwMDFGRiwKKzB4MDAyMDM0RkMsIDB4MDAyMDM0RjQsIDB4MDAxQzNEMDAsIDB4MDAyMDM1MjQsCisweDAwMjAzOEVDLCAweDAwMjAxOEEyLCAweDAwMjAzNEVDLCAweDAwMjAzQUU4LAorMHgwMDIwM0FFQywgMHgwMDFDM0QyOCwgMHgwMDIwMzk1QywgMHgwMDIwMzkxQywKKzB4MDAyMDBFRDYsIDB4MDAyMDM5NjAsIDB4MDAyMDM5NjQsIDB4MDAxMTc3NTQsCisweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweDdGRjg0RjIyLCAweDYwMjJEMjM3LAorMHg4RDU4QzgwMywgMHhERTM2MkYwMSwgMHhEQjM3REMzNiwgMHg2NkMyNTJDMSwKKzB4ODkyRjM2MjAsIDB4QzkwMzYwNjEsIDB4ODkyQjg4MDEsIDB4RDIzM0REMzEsCisweDY0RDM0MjBCLCAweDFGMDE2NTAzLCAweDg4MDE2MEIxLCAweEQyMzA4QjA0LAorMHg2NEQzNDIwQiwgMHgwMDA5QUZFQSwgMHg4NTYxNTY1MywgMHg4OTA0QzgyMCwKKzB4RTA1MEQ3MkMsIDB4NzIwMTAyN0UsIDB4RDIyQjA3MjYsIDB4NjQ1MzQyMEIsCisweDg5MDcyMDA4LCAweDU1RjFEMTI2LCAweDY0RDM0MTBCLCAweEU2MDFENzI3LAorMHgyNzYyQUZENCwgMHg1NUYxRDIyNiwgMHg2NEUzNDIwQiwgMHhFNjAxRDEyNSwKKzB4MjE2MkFGQ0MsIDB4REQyNURFMjQsIDB4REMyNkRCMjUsIDB4NjZEMjUyRDEsCisweDg5MTgzNjIwLCAweEM5MDM2MDYxLCAweDg5MTQ4ODAxLCAweEQxMTdENDFGLAorMHgwMDA5NDEwQiwgMHgzNkUwNTYwMywgMHg2NTAzOEYwNCwgMHgyQjIwRTIwMSwKKzB4MkM1MkFGRUMsIDB4RDcxMkQ0MUMsIDB4MDAwOTQ3MEIsIDB4RTYwMUQxMTUsCisweEFGRTM0NjE4LCAweDYwRjEyMTYyLCAweDg5MDdDODA0LCAweDdGMDhEMjE3LAorMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QkY2NDIyQiwgMHg0RjI2N0YwOCwKKzB4NkRGNjZFRjYsIDB4MDAwQjZDRjYsIDB4MDAwMDZCRjYsIDB4MDAxRTIxMDAsCisweDAwMjAzNEZDLCAweDAwMjAzNEY0LCAweDAwMjAzOTg0LCAweDAwMjAxNEEwLAorMHgwMDIwMTRDQywgMHgwMDIwMzQ4QywgMHgwMDIwMTZCRSwgMHgwMDFFMjEyQywKKzB4MDAyMDE1MzAsIDB4MDAxQzNEMzAsIDB4MDAxMTc4ODAsIDB4MDAyMDM0RUMsCisweDAwMjAzOTBDLCAweDAwMjAzOTA4LCAweDAwMjAzNTI0LCAweDAwMjAwNjEwLAorMHhFNjAxRDIwMywgMHgxMjY1RDUwMywgMHgwMDBCMjI1MiwgMHgwMDAwMTI2NiwKKzB4MDAxQzEwMTAsIDB4MDAwMEMzNEYsIDB4MDAwOTAwMEIsIDB4MkZENjJGQzYsCisweDRGMjIyRkU2LCAweDZENDM2QzUzLCAweEVFMDBBMDA0LCAweDdFMDE2NEQ0LAorMHg2NDRDQkZGMiwgMHg4QkY5M0VDMiwgMHg2RUY2NEYyNiwgMHgwMDBCNkRGNiwKKzB4RTUwMDZDRjYsIDB4NjY0M0EwMDIsIDB4NzYwMTc1MDEsIDB4MjIyODYyNjAsCisweEFGRTM4QkZBLCAweDJGRTYwMDA5LCAweDc1MDc2MjUzLCAweEUxMDg2NzUzLAorMHg2MDQzRUUwQSwgMHg0NDA5QzkwRiwgMHg2NTAzMzBFMiwgMHg4RDAxNDQwOSwKKzB4RTYzMEU2MzcsIDB4NDExMDM2NUMsIDB4OEZGMjI3NjAsIDB4RTAwMDc3RkYsCisweDAwMEI4MDI4LCAweDAwMEI2RUY2LCAweDAwMEJFMDAwLCAweDJGRTZFMDAwLAorMHg3RkVDNEYyMiwgMHg2RTQzNjI1MywgMHhCRkRDNjVGMywgMHhCRkQwNjQyMywKKzB4QkZDRTY0RTMsIDB4RDQwMzY0RjMsIDB4MDAwOUJGQ0IsIDB4NEYyNjdGMTQsCisweDZFRjYwMDBCLCAweDAwMjAzQUYwLCAweEU0RkREMjlELCAweEQ3OUQ2MTIyLAorMHgyMjEyMjE0OSwgMHg3NDAxNjAyMiwgMHgyMjAyQ0IwMSwgMHhENTlBNjYyMiwKKzB4MjI2MjI2NDksIDB4Qzg0MDYwNzAsIDB4NjA1Mjg5MDIsIDB4MjUwMkNCMDQsCisweEU2MDE2MDUyLCAweDI1MDJDQjA4LCAweEU0MDI2MDUyLCAweDI1MDJDOUNGLAorMHg0NjE4NjA1MiwgMHgyNTAyQ0IxMCwgMHhDQjAzNjA1MiwgMHgxNTQyMjUwMiwKKzB4MTU2MzAwMEIsIDB4RDc4RUQ1OEQsIDB4RDQ4RkQyOEUsIDB4RTYwMEUxMDAsCisweDI3MTEyNTExLCAweEFGQ0YyMjEwLCAweDY2NEMyNDYxLCAweDQ2MDBEMjhCLAorMHg2MDYwMzYyQywgMHgwMDBCQ0IxMCwgMHg2NTRDMjYwMCwgMHg0NTAwRDI4NywKKzB4NjY1MDM1MkMsIDB4MjYxOUUxRUYsIDB4MjU2MDAwMEIsIDB4RDI4NDY2NEMsCisweDM2MkM0NjAwLCAweENCMTA2MDYwLCAweDI2MDAwMDBCLCAweEQyODA2NTRDLAorMHgzNTJDNDUwMCwgMHhFMUVGNjY1MCwgMHgwMDBCMjYxOSwgMHg2NjRDMjU2MCwKKzB4NDYwMEQyN0EsIDB4NjA2MDM2MkMsIDB4MDAwQkNCMDgsIDB4NjU0QzI2MDAsCisweDQ1MDBEMjc2LCAweDY2NTAzNTJDLCAweDI2MTlFMUY3LCAweDI1NjAwMDBCLAorMHhEMjczNjY0QywgMHgzNjJDNDYwMCwgMHhDQjA4NjA2MCwgMHgyNjAwMDAwQiwKKzB4RDI2RjY1NEMsIDB4MzUyQzQ1MDAsIDB4RTFGNzY2NTAsIDB4MDAwQjI2MTksCisweDYyNEMyNTYwLCAweDQyMDBENjY5LCAweDYwMjAzMjZDLCAweDQwMjFDOTA4LAorMHg0MDIxNDAyMSwgMHg2MDBDMDAwQiwgMHhENjY1NjI0QywgMHgzMjZDNDIwMCwKKzB4QzkwODYwMjAsIDB4NDAyMTQwMjEsIDB4MDAwQjQwMjEsIDB4RDE2MTYwMEMsCisweDM0MUM2NDRDLCAweDAwMEI2MjQwLCAweEQxNUY2MDJDLCAweDM0MUM2NDRDLAorMHgwMDBCNjI0MCwgMHgyRkU2NjAyQywgMHg2RTQzNEYyMiwgMHhFNjBBNjQ1QywKKzB4ODkxNDM0NjcsIDB4MDAwOUJGRUIsIDB4NjBFQzY0MEMsIDB4OEIwMjg4MDEsCisweEEwMDJFMDBGLCAweDQ0MDkyNDA5LCAweDYyNEM0NDA5LCAweDMyNjNFNjBBLAorMHhCRkUyODkwNSwgMHg2MjBDNjQ0QywgMHhDODgwNjAyMywgMHhFMjAwOEIwMCwKKzB4NEYyNjYwMjMsIDB4NkVGNjAwMEIsIDB4RDY0QzRGMjIsIDB4ODgwMTYwNjIsCisweEIyNTc4QjAzLCAweEEwMDMwMDA5LCAweEQyNDkwMDA5LCAweDIyNjBFNjQwLAorMHhFMjAwRDY0OCwgMHgwMDBCNEYyNiwgMHg0RjIyMjYyMiwgMHg2MDYyRDY0MywKKzB4OEIwMTg4MDIsIDB4MDAwOUIyQTAsIDB4RTIwMEQ2NDIsIDB4MDAwQjRGMjYsCisweEQ1M0UyNjIyLCAweEUxMDBENDNFLCAweDI1MTJFNzAxLCAweDI0NzAwMDBCLAorMHhFNjA0RDIzQiwgMHgyMjYwMDAwQiwgMHhENDNCNEYyMiwgMHg0MTBCRDEzQiwKKzB4RDUzQjAwMDksIDB4NjY1MEUxRkQsIDB4MjYxOUQyM0EsIDB4MjU2MEU3MDAsCisweDAwMEI0RjI2LCAweDRGMjIyMjcwLCAweEQyMzhENTM3LCAweEQ3Mzg2MTUyLAorMHgyNTEyNjExRCwgMHhFNkZGNjQ1MiwgMHgyNTQyMjQyQiwgMHhEMjJGRDQzNSwKKzB4NDIwQjY2NkQsIDB4RDUyRTI3NjIsIDB4Njc1MEUxRkIsIDB4NEYyNjI3MTksCisweDI1NzAwMDBCLCAweEQ0MzA0RjIyLCAweDQxMEJEMTI4LCAweEQ1MjgwMDA5LAorMHg2NjUwRTdGNywgMHg0RjI2MjY3OSwgMHgyNTYwMDAwQiwgMHg5NDI1RDUyNCwKKzB4MjI0OTYyNTAsIDB4MjUyMDAwMEIsIDB4RTRCRkQ1MjEsIDB4MjI0OTYyNTAsCisweDI1MjAwMDBCLCAweEQyMjU0RjIyLCAweDYwMEQ4NTIyLCAweDg5MTEyMDA4LAorMHg4OTQ1ODgwMSwgMHg4OTQ3ODgwMywgMHg4OTQ5ODgwNSwgMHg4OTRGODgwNiwKKzB4ODk1NTg4MDgsIDB4ODk1Qjg4MDksIDB4ODk2MTg4MEEsIDB4ODk2Nzg4MEIsCisweDAwMDlBMDZFLCAweDAwMDlCMDcwLCAweDYwMENBMDZCLCAweDAwMDBGRjdGLAorMHgwMDFFMjE0OCwgMHgwMDFFMTAwMCwgMHgwMDFFMTEwOCwgMHgwMDIwMzlCQywKKzB4MDAyMDM5QkUsIDB4MDAyMDM5REQsIDB4MDAyMDM5QTAsIDB4MDAxRTEwM0YsCisweDAwMUUxMDVGLCAweDAwMUUxMDJGLCAweDAwMUUxMDkwLCAweDAwMjAzOUM0LAorMHgwMDFFMTAwQiwgMHgwMDIwMzlDMCwgMHgwMDIwM0FGNCwgMHgwMDIwMThBMiwKKzB4MDAxRTEwMjgsIDB4MDAyMDM5REMsIDB4MDAxRDQwMjAsIDB4OTg3NjAwMDAsCisweDAwMUMxMDAwLCAweDAwMjAzQjAwLCAweDAwMjAzQjEwLCAweDAwMjAzOTk0LAorMHgwMDA5QjA0QywgMHg2MDBDQTAzNSwgMHgwMDA5QjA1NSwgMHg2MDBDQTAzMSwKKzB4NjI2MEQ2ODQsIDB4OEIyQjIyMjgsIDB4MDAwOUIwNjEsIDB4NjAwQ0EwMjksCisweDYyNjBENjgwLCAweDhCMjMyMjI4LCAweDAwMDlCMDY5LCAweDYwMENBMDIxLAorMHg2MjYwRDY3QywgMHg4QjFCMjIyOCwgMHgwMDA5QjBDNywgMHg2MDBDQTAxOSwKKzB4NjI2MEQ2NzgsIDB4OEIxMzIyMjgsIDB4MDAwOUIwQ0QsIDB4NjAwQ0EwMTEsCisweDYyNjBENjc0LCAweDhCMEIyMjI4LCAweDAwMDlCMTI1LCAweDYwMENBMDA5LAorMHg2MjYwRDY3MCwgMHg4QjAzMjIyOCwgMHgwMDA5QjEzRCwgMHg2MDBDQTAwMSwKKzB4NEYyNkUwMDAsIDB4MDAwOTAwMEIsIDB4RDI2Q0QxNkIsIDB4RDU2Qzg0MTIsCisweDQwMDBDOTBGLCAweEQ3NkIwMTJELCAweEU0MDNENjZCLCAweEUyMEY2MTFDLAorMHgyNTQwRTAwMSwgMHgyNTIwMjcxMiwgMHgyNjAyMDAwQiwgMHhFNjAxRDI2MiwKKzB4MzA2Njg1MjMsIDB4RTAwMDhEMDUsIDB4RDY2M0QyNjAsIDB4RTAwMTgxMjIsCisweDAwMEIyNjAyLCAweEQyNUMwMDA5LCAweDYwMEQ4NTIzLCAweDg5MDUyMDA4LAorMHg4QjBBODgwMSwgMHg2MDYwRDY1RCwgMHgyNjAwQ0IwMSwgMHhENDU3RDY1QSwKKzB4RTAwMUUxMDEsIDB4MDAwQjI2MTIsIDB4MDAwQjgxNDIsIDB4RDE1MkUwMDAsCisweDg1MTNFNTAxLCAweDY0MEQ0NTE4LCAweDY2MDMzNDUzLCAweEUwMDA4RDA1LAorMHhENTUxRDI1MywgMHgyMjYwRTAwMSwgMHgwMDBCMjUwMiwgMHg0RjIyMDAwOSwKKzB4ODUxM0QxNDksIDB4NjQ1MzY1MEQsIDB4NjI0OTQ0MTksIDB4MjI3RDY3MkUsCisweDg4MDE2MDJDLCAweDg4MDI4OTA5LCAweDg4MDM4OTEwLCAweDg4MDY4OTFBLAorMHg4ODA3ODkzNSwgMHhBMDRDODkzQiwgMHhENTQ2MDAwOSwgMHg2NjUyRDc0NiwKKzB4Mjc2MkQ0NDYsIDB4NjIyQzYyNjEsIDB4MjQyMUEwMzgsIDB4MjIyODYyNUMsCisweEQ0NDM4QjNGLCAweDY2NDJENTQwLCAweDI1NjJENDQwLCAweDI0MDE4NTYxLAorMHg2MjAzQTAyQywgMHgyMDA4NjA1QywgMHg4ODEwODkwNywgMHg4ODIwODkwOCwKKzB4ODgzMDg5MDksIDB4QTAyQzg5MEEsIDB4RDIzQTAwMDksIDB4NjIyMkEwMDgsCisweEEwMDVEMjM5LCAweEQyMzk2MjIyLCAweDYyMjJBMDAyLCAweDYyNjJENjM4LAorMHhENDMyRDUzMSwgMHg2NjIxMjUyMiwgMHhBMDBGNjI2QywgMHhENjM1MjQyMSwKKzB4NjI2MUQ1MkQsIDB4NjIyQ0Q0MkQsIDB4QTAwNzI1NjIsIDB4RDYzMjI0MjEsCisweDg1NjFENTI5LCAweDI1NjJENDI5LCAweDYyMDMyNDAxLCAweDY2MkQ4NTE1LAorMHgzNjE3NjEwRCwgMHg2NTAzOEYwMSwgMHhCMENCMjQ1MSwgMHhBMDAxMDAwOSwKKzB4RTAwMEUwMDEsIDB4MDAwQjRGMjYsIDB4RDYxOTAwMDksIDB4RDQyN0UxMDEsCisweDY1NDEyNjEwLCAweEQxMThENzE3LCAweEUyMEY2NTVELCAweDI3NTJFMDAxLAorMHgwMDBCMjYyMCwgMHgyRkU2MjEwMiwgMHhEMjBGNEYyMiwgMHg2NDBDODUyMywKKzB4OEIwODI0NDgsIDB4RDUxMUQ2MUQsIDB4MjYyMUUyMDAsIDB4OTQwRjg0NTEsCisweEEwNDgyMDQ5LCAweERFMEQ4MDUxLCAweEM4NDA2MEUwLCAweEUyMDE4RDMyLAorMHg4OTQ0MzQyNywgMHhEMjE2RDYxNSwgMHgyNjQxNDIwQiwgMHgwMDA5QTAzMCwKKzB4MDAwMEZGN0YsIDB4MDAyMDM5REQsIDB4MDAyMDM5OTQsIDB4MDAyMDM5QTAsCisweDAwMUUxMTAwLCAweDAwMUUxMDBDLCAweDAwMjAzOUMwLCAweDAwMUUxMDAwLAorMHgwMDFFMTAwMSwgMHgwMDIwMzlDOCwgMHgwMDIwMzlBOCwgMHgwMDIwMzlBQywKKzB4MDAyMDM5QjAsIDB4MDAyMDM5Q0MsIDB4MDAyMDM5RDAsIDB4MDAyMDM5RDQsCisweDAwMjAzOUQ4LCAweDAwMjAzREZDLCAweDAwMjAzRTA2LCAweDAwMjAzOUJBLAorMHgwMDIwMjg3RSwgMHg4OTEyMzQyNywgMHhEMjk0RDY5MywgMHgyNjQxNDIwQiwKKzB4Q0I4MDg0RTEsIDB4ODBFMUIwRjUsIDB4RDY5MTYwRTAsIDB4MkUwMENCMDQsCisweEM5M0Y2MDYwLCAweEQ2OEYyNjAwLCAweEEwMDFFMDAxLCAweEUwMDAyNjAyLAorMHgwMDBCNEYyNiwgMHhENjhDNkVGNiwgMHhDODgwNjA2MCwgMHhEMjg2ODkxOSwKKzB4ODgwMTYwMjEsIDB4RDI4OThCMTUsIDB4ODUyNEU1MDEsIDB4ODkxMDMwNTYsCisweEUyMDNEMTg3LCAweDIxMjBENDg3LCAweEUwMEI2NTQxLCAweDA2NTY2NTVELAorMHhFNDBGRDU4NSwgMHgyMTQwRTcwMiwgMHhENzdFMjU3MSwgMHgwMDBCRTAwMSwKKzB4MDAwQjI3MDIsIDB4MkZFNkUwMDAsIDB4REU4MDRGMjIsIDB4Qzg4MDg0RTEsCisweEQ1N0E4OTJDLCAweDIwMDg4NTU0LCAweDYxMDM4RjI4LCAweDg1NTNENzdDLAorMHg2NDAzNjY3MiwgMHg4NTY2NjUwQywgMHgzNTIwNjIwQywgMHhENjc5OEIxRSwKKzB4NjUxQ0Q3NzQsIDB4MjY1MTY0NEMsIDB4NjBFMDI3NDEsIDB4ODkwNEM4NDAsCisweDQyMEJEMjc1LCAweEEwMDMwMDA5LCAweEQyNjgwMDA5LCAweDAwMDk0MjBCLAorMHgwMDA5QjA5RiwgMHhFMjAxRDE2NywgMHg2MEUwMjEyMiwgMHhDQjA0RDQ2NCwKKzB4NjA0MDJFMDAsIDB4MjQwMEM5M0YsIDB4NjAyM0EwMDEsIDB4NEYyNkUwMDAsCisweDZFRjYwMDBCLCAweDJGQjYyRkE2LCAweDJGRDYyRkM2LCAweERBNjIyRkU2LAorMHg2NkExRTI0MCwgMHgzNjIyREM1RSwgMHg2MjYzODkwMCwgMHg2RUQzNkQyQywKKzB4NEUyMTM2RDgsIDB4NEUyMTJBNjEsIDB4REI2MUQ0NjAsIDB4RTcwMEEwMEYsCisweDc3MDE2MkIyLCAweDcxMDI2MTIzLCAweDY2MjEyQjEyLCAweDcxMDI2MjEzLAorMHg2MTIxMkIxMiwgMHg2NTFENjY2RCwgMHgzNTZDNDUyOCwgMHg2MjdDMjQ1MiwKKzB4OEJFRDMyRTMsIDB4QzkwMzYwRDMsIDB4OEIxMDg4MDMsIDB4NjE3MzY3QjIsCisweDJCMTI3MTAyLCAweDcxMDI2RTEzLCAweDJCMTI2NTcxLCAweDY1NUQ2REUxLAorMHg0MjI4NjJERCwgMHgzMjVDRTEwNywgMHhBMDBDMkMxMCwgMHg4ODAyMjQyMiwKKzB4QTAwMzhCMDEsIDB4ODgwMUUyMDMsIDB4RTIwMThCMDUsIDB4NjZCMjJDMjAsCisweDY1NUQ2NTYxLCAweEU2MEYyNDUyLCAweDY3QTEyQzYwLCAweDhCMDUyNzc4LAorMHhERDM4REM0NCwgMHhFQjAxRUEwMCwgMHgyREIyMkNBMiwgMHg2REY2NkVGNiwKKzB4NkJGNjZDRjYsIDB4NkFGNjAwMEIsIDB4MkZFNjJGRDYsIDB4RTI0MEREMzYsCisweDM2MjI2NkQxLCAweDYyNjM4OTAwLCAweDM2Nzg2NzJDLCAweDc3MDNERTM4LAorMHg0NzIxMkQ2MSwgMHg2NEUyRDYzNSwgMHhBMDBFNDcyMSwgMHg2NTYyRTEwMCwKKzB4NjI1MzcxMDEsIDB4NzQwMTI0NTAsIDB4MjQyMDQyMTksIDB4NDUyOTc0MDEsCisweDc0MDEyNDUwLCAweDI0NTA0NTE5LCAweDYyMUM3NDAxLCAweDhCRUUzMjczLAorMHg2NkUyNDIwMCwgMHg0MjAwNjFEMSwgMHgyMTE4MzYyQywgMHgyRTYyOEYwNiwKKzB4REQxQ0Q3MjgsIDB4RTUwMUU0MDAsIDB4MkQ1MjI3NDIsIDB4MDAwQjZFRjYsCisweDJGRDY2REY2LCAweDRGMjIyRkU2LCAweEVEMEFFRTAxLCAweDY0RTNCQzg1LAorMHhCQzhBNjRFMywgMHg2MkVDN0UwMSwgMHg4QkY3MzJENywgMHhCQzhERUUwMSwKKzB4NjRFMzY0RTMsIDB4N0UwMUJDOTIsIDB4MzJENzYyRUMsIDB4NEYyNjhCRjcsCisweDAwMEI2RUY2LCAweEQxMTg2REY2LCAweEQ0MTg5MjBELCAweDcyMTIyMTIyLAorMHgyNDIyRDYxNywgMHhENzE3NzIwNCwgMHg3MjIwMjYyMiwgMHgyNzIyRDExNiwKKzB4MDAwQjcyMzAsIDB4MTM3QTIxMjIsIDB4MDAyMDM5QkEsIDB4MDAyMDI5OEEsCisweDAwMUUxMDE1LCAweDAwMjAzOUMwLCAweDAwMUUxMDAxLCAweDAwMjAzOTk0LAorMHgwMDFFMTEwMCwgMHgwMDIwMzlCRSwgMHgwMDIwMzlBQywgMHgwMDFFMTAwMCwKKzB4MDAyMDM5QjAsIDB4MDAyMDM5QkMsIDB4MDAyMDI4N0UsIDB4MDAxRTEwMEMsCisweDAwMjAzOUE4LCAweDAwMjAzOUM0LCAweDAwMjAzOUM4LCAweDAwMjAzOUNDLAorMHgwMDIwMzlEMCwgMHgwMDIwMzlENCwgMHgwMDIwMzlEOCwgMHg0RjIyMkZFNiwKKzB4RDY3MDdGRkMsIDB4ODgwMTYwNjAsIDB4RTIwMTg5NTEsIDB4MjYyMEJGQkIsCisweEQ1NkVEMTZELCAweERFNkU2MDEwLCAweDY0RTM2NTUyLCAweDc0MDJDODQwLAorMHg4RDIyRDE2QywgMHhEMjZDNzUwMiwgMHhFNjAxRDc2QywgMHhFNzA0MjcyMiwKKzB4NzYwMTYyNTUsIDB4NjI2QzI0MjEsIDB4OEZGOTMyNzMsIDB4RDQ2Mzc0MDIsCisweDYyNDJFNjAxLCAweDY0MEQ4NTI4LCAweDY3NDk0NDE5LCAweDI3NUQ2NTdFLAorMHg4MUU0NjA3QywgMHhFNDE3RDU2MiwgMHg2NzU1NzYwMSwgMHgzMjQzNjI2QywKKzB4OEZGOTIxNzEsIDB4QTAyMDcxMDIsIDB4RDI1RTAwMDksIDB4RTYwMUQ3NUIsCisweEU3MDQyNzIyLCAweDc2MDE2MjU1LCAweDYyNkMyNDIxLCAweDhGRjkzMjczLAorMHhENDUyNzQwMiwgMHg2MjQyRTYwMSwgMHg2NDBEODUyOCwgMHg2NzQ5NDQxOSwKKzB4Mjc1RDY1N0UsIDB4ODFFNDYwN0MsIDB4RTQxN0Q1NTMsIDB4Njc1NTc2MDEsCisweDMyNDM2MjZDLCAweDhGRjkyMTcxLCAweDkyODk3MTAyLCAweEQyNDYyRTIxLAorMHg1RTIzRDc0RSwgMHg2NEYyMkZFMiwgMHg2MDQzNjVGMiwgMHgyNzAwQzk4MCwKKzB4Qzk2MDYwNDMsIDB4ODA3MTYxMDMsIDB4QzkwMzYwNDMsIDB4ODA3MjQ1MTksCisweDY1RjI2MDVDLCAweDgxNzI2NkYyLCAweDQ2MTk0NjI5LCAweDYwNkM0NTI5LAorMHg0MDE4NjQ1QywgMHg4MTczMzA0QywgMHgyMTE4NUUyMywgMHg2NEYyMkZFMiwKKzB4NkU0QzYyRjIsIDB4NjAyQzQyMTksIDB4NjZGMjYyRjIsIDB4NDYyOTQwMTgsCisweDQ2MTkzMEVDLCAweDQyMjk4MTc0LCAweDY1MkM2MDZDLCAweDMwNUM0MDE4LAorMHg4MTc1OEYwNywgMHgwMDA5QkM5NiwgMHgyMjI4NjIwQywgMHhBMDBBODkwOCwKKzB4NjAxMzAwMDksIDB4OEIwMzg4NDAsIDB4MDAwOUIwMDksIDB4MDAwOUEwMDMsCisweEUyMDJENjJGLCAweDdGMDQyNjIyLCAweDAwMEI0RjI2LCAweDRGMjI2RUY2LAorMHg4NTUyRDUyQSwgMHg4ODMwNjAwRCwgMHg4ODMxODkwMywgMHhBMDM0ODkyMywKKzB4ODU1NTAwMDksIDB4RDQyOEQ3MjcsIDB4ODU1MzI3MDEsIDB4NjEwREQ2MjcsCisweDI0MTI0MTE4LCAweDQ2MEJENDI2LCAweEQ3MjMwMDA5LCAweEQyMjZENDI1LAorMHg2NTcyNDIwQiwgMHhFMjMwRDEyMCwgMHg0MjI4NjcxMiwgMHgyNzI5RTYyMCwKKzB4Mzc2MDQ2MjgsIDB4RDYyMThCMDMsIDB4QTAxNkUyMDAsIDB4RDYxRjI2MjIsCisweEEwMTJFMjAyLCAweEQxMTgyNjIyLCAweDYyMTJFNTMwLCAweEU2MjA0NTI4LAorMHg0NjI4MjI1OSwgMHg4OTA4MzI2MCwgMHhENDFBRDExOSwgMHhFNjAxRDUxMywKKzB4MjE2MDQ1MEIsIDB4NDcyQkQ3MTgsIDB4NEYyNjRGMjYsIDB4MDAwOTAwMEIsCisweDAwMDAwNjBBLCAweDAwMjAzOURDLCAweDAwMUUxMDAwLCAweDAwMjAzOUM4LAorMHgwMDIwM0RGQywgMHgwMDIwM0UwOCwgMHgwMDIwM0RBMCwgMHgwMDIwMzlCMCwKKzB4MDAyMDNERDAsIDB4MDAyMDNEQ0UsIDB4MDAyMDNEQTIsIDB4MDAyMDM5OTQsCisweDAwMjAzOUMwLCAweDAwMjAzOUFDLCAweDAwMjAzOUE4LCAweDAwMjAxOEEyLAorMHgwMDIwM0IxQywgMHgwMDIwM0IyMCwgMHgwMDIwMThFRSwgMHgwMDIwMzlDNCwKKzB4MDAxRTEwMEIsIDB4MDAyMDNCMzQsIDB4MDAxMTQwMDQsIDB4NEYyMjJGRTYsCisweERFOTY3RkZDLCAweDIwMDg4NEU5LCAweDJGMDA4RDA2LCAweEQ2OTVENDk0LAorMHgwMDA5NDYwQiwgMHg2NEYwQjE5QSwgMHg2NjIwRDI5MywgMHg4OTAyMjY2OCwKKzB4QzlCRjYwRTAsIDB4N0YwNDJFMDAsIDB4MDAwQjRGMjYsIDB4MDAwQjZFRjYsCisweDJGRTYwMDA5LCAweERFOEQ0RjIyLCAweDYwRTBENjhELCAweENCQzBENDhELAorMHg2MjYwMkUwMCwgMHhDODAzNjAyQywgMHg0MDIxODkwNCwgMHg3MDAxNDAyMSwKKzB4NjYwM0EwMDIsIDB4NjYwMzQwMDksIDB4RDY4NzYxNkQsIDB4RTUwMEEwMDQsCisweDc1MDE2MjYyLCAweDc0MDQyNDIyLCAweDMyMTM2MjVELCAweEQyODM4QkY4LAorMHgwMDA5NDIwQiwgMHhDOUJGODRFMiwgMHg0RjI2ODBFMiwgMHg2RUY2MDAwQiwKKzB4MkZFNjJGRDYsIDB4N0ZGQzRGMjIsIDB4NjI2MEQ2N0QsIDB4ODk0NDIyMjgsCisweEQ1NzJFMTAwLCAweDYwNTAyNjEwLCAweENCNDBENDdBLCAweDI1MDA0NDBCLAorMHg4RDA1MjAwOCwgMHg2MkUwNkUwMywgMHg3MTA0NjEyQywgMHgyRjExQTAwNiwKKzB4RDQ3NUQ2NkQsIDB4REQ3NTY3NjAsIDB4NjU3QzREMEIsIDB4RTIzQzZEMUQsCisweDhCMDMzRDI3LCAweEQyNjdENDcyLCAweDAwMDk0MjBCLCAweDREMjE0RDIxLAorMHhBMDA1RDc3MCwgMHg2NkU2RTQwMCwgMHgzNTdDNDUwOCwgMHg3NDAxMjU2MiwKKzB4MzVEMzY1NEQsIDB4RDc2QzhCRjcsIDB4NjE3MkUwMDMsIDB4ODExMTQwMTgsCisweDZFNzI2MEYxLCAweDgxRTI3MDBDLCAweEQ0Njg2MTcyLCAweERENjg4MTEzLAorMHg0RDBCREU2OCwgMHhFMjAxNjU3MiwgMHhENDY3MkUyMiwgMHg0MjBCRDI1NSwKKzB4RDY1NjAwMDksIDB4QzkzRjYwNjAsIDB4N0YwNDI2MDAsIDB4NkVGNjRGMjYsCisweDZERjYwMDBCLCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweEQyNUY0RjIyLAorMHg2QjQzNkU3MywgMHg0MjBCNkM1MywgMHgyMDA4NkQ2MywgMHg2NDAzOEQxQywKKzB4RTUwRUQxNDksIDB4MzI1MjYyMTAsIDB4NjBDMzg5MTYsIDB4ODA0MTI0QjAsCisweDgxNDE2MEQzLCAweEEwMDdFNTAwLCAweDY1NUQ2MUJDLCAweDAwRUM2MDUzLAorMHgzNjRDNjY1MywgMHg4MDY0NzUwMSwgMHgzMjEzNjI1RCwgMHhENjNCOEJGNSwKKzB4QzlCRjYwNjAsIDB4MjYwMEEwMDgsIDB4RDIzQUQ0NEQsIDB4NkVGNjRGMjYsCisweDZDRjY2REY2LCAweDZCRjY0MjJCLCAweDZFRjY0RjI2LCAweDZDRjY2REY2LAorMHg2QkY2MDAwQiwgMHg3RkM0NEYyMiwgMHg3MjAyNjJGMywgMHgyMjUxMkY0MSwKKzB4NDUyOTcyMDIsIDB4NjA2MzIyNTEsIDB4RTVDNEU2ODIsIDB4NjdGMzgxMjEsCisweDY1NUM2NjZDLCAweEU0MDhCRkI2LCAweDRGMjY3RjNDLCAweDAwMDkwMDBCLAorMHgyRjk2MkY4NiwgMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwKKzB4RTEwMDdGQzQsIDB4NjUxM0VDRkYsIDB4NkIxMzZDQ0QsIDB4REUzNkQ3MzUsCisweEVERkY2NEYzLCAweEQ4MzVFQTA0LCAweDYwNTM2NTVDLCAweDAyN0Q0MDAwLAorMHgzMkMwNjIyRCwgMHg2NjAzOEQwRCwgMHgwOUVENjA2MywgMHgyNDkxMDI3RCwKKzB4MjQyMTc0MDIsIDB4Njk4MjAyRUQsIDB4MzkyODYyMkQsIDB4NzQwMjI4OTIsCisweDc1MDE3MTA0LCAweDYwNjM2MjVDLCAweDA3RDUzMkEyLCAweDBFQjU4RkU0LAorMHgyNDQ4NjQxQywgMHhFNjgwODkwNSwgMHg2N0YzRTVDNSwgMHhCRjc5NjY2QywKKzB4N0YzQzY1NUMsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkFGNjZCRjYsCisweDAwMEI2OUY2LCAweEQxMUU2OEY2LCAweDYwMTJEMjFFLCAweENCMjBFNDA1LAorMHgyMTAyRTUwMCwgMHgwMDBCMjI0MiwgMHgwMDAwMjI1MiwgMHgwMDFFMTAxNywKKzB4MDAyMDNCMzgsIDB4MDAyMDE4QTIsIDB4MDAyMDM5MDYsIDB4MDAxRTEwMTUsCisweDAwMUUxMEJGLCAweDAwMTE3ODAwLCAweDAwMUUxMEZDLCAweDAwMjAwNjEwLAorMHgwMDIwMzkwQywgMHgwMDIwMkFFMiwgMHgwMDIwM0IzQywgMHgwMDIwMThFRSwKKzB4MDAyMDNCNTgsIDB4MDAxMTc4OEMsIDB4MDAyMDM5MDgsIDB4MDAyMDM0RUMsCisweDAwMjAxNTMwLCAweDAwMUUyMTMwLCAweDAwMjAzQjYwLCAweDAwMjAyQUE0LAorMHgwMDIwM0I2NCwgMHgwMDIwMzk2QywgMHgwMDIwMzk3NCwgMHgwMDIwM0Q5QywKKzB4MDAxQzM1MDAsIDB4MDAxRDQwMDQsIDB4RDU2NEQxNjMsIDB4RTQwMEQ3NjQsCisweDIxNDJFMjBGLCAweDE3NDExMTU0LCAweEQ1NjIyNzIyLCAweDk2NjlENzYyLAorMHgxNTQxMjU3MiwgMHg5NjY2MTU2MiwgMHhFNjAxMTU2NSwgMHhENTVGMTE2NSwKKzB4NjY2Q0U2RjgsIDB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsCisweDI1NjIyNTQyLCAweDc2MDFFNzI3LCAweDY3NjMyNTcyLCAweDI1NjI3Nzk3LAorMHhFNzA0MjU3MiwgMHgyNTcyRTI0OCwgMHhFMjE5MjUyMiwgMHhFMjcwMjUyMiwKKzB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsIDB4MjUyMjI1NDIsIDB4MjUyMkUyMEMsCisweDI1NDIyNTQyLCAweDI1NDIyNTQyLCAweDI1NDIyNTQyLCAweDI1NDIyNTQyLAorMHgwMDBCMTU0QSwgMHhFMjA4MTE0NSwgMHgwMDA5NDIyQiwgMHgyRkU2MkZENiwKKzB4N0ZGQzRGMjIsIDB4QzgyMDYwNDMsIDB4NkU0MzhEMDIsIDB4MDAwOUJFNjcsCisweEM4MTA2MEUzLCAweEJFNjQ4OTAxLCAweDYwRTMwMDA5LCAweDg5MDFDODQwLAorMHgwMDA5QkU4NiwgMHhDODAxNjBFMywgMHhERDNEODkzOCwgMHhDODAyNjBEMCwKKzB4MkYwMDhEMDMsIDB4NDYwQkQ2M0IsIDB4NjBGMDAwMDksIDB4ODkwMkM4MDQsCisweDQ2MEJENjM5LCAweDYyRjAwMDA5LCAweEM4ODA2MDIzLCAweDYwRDA4OTAyLAorMHgyRDAwQzk3RiwgMHhDODAxNjAyMywgMHhENjM0ODkwNiwgMHgwMDA5NDYwQiwKKzB4MDAwOUEwMDcsIDB4NTE2MzA2MDEsIDB4ODkwMkM4MDgsIDB4NDYwQkQ2MzAsCisweDYwRjAwMDA5LCAweDg5MDJDODEwLCAweDQyMEJEMjJFLCAweEQ1MkUwMDA5LAorMHg4ODAyNjA1MiwgMHhEMjJEOEIwMywgMHhBMDA1RTYwNCwgMHg4ODAxMjI2MCwKKzB4RDIyQThCMDIsIDB4MjI2MEU2MDEsIDB4MjUyMkUyMDAsIDB4Qzg4MDYwRTMsCisweEQyMjc4OTJELCAweDYwRTM2RTIwLCAweDg5MDJDODgwLCAweDQyMEJEMjI1LAorMHg2MEUzMDAwOSwgMHg4OTAyQzg0MCwgMHg0MjBCRDIyMywgMHg2MEUzMDAwOSwKKzB4ODkwMkM4MDIsIDB4NDIwQkQyMjEsIDB4NjBFMzAwMDksIDB4ODkwREM4MDQsCisweEREMjBEMTFGLCAweDAwMDk0MTBCLCAweDAwMDlCRjBELCAweDAwMDlCRjRDLAorMHhENTFFRDQxRCwgMHgyNDcwRTcwOCwgMHgyNUQyQkY4NSwgMHhDODA4NjBFMywKKzB4RDIxQjg5MDUsIDB4NEYyNjdGMDQsIDB4NDIyQjZFRjYsIDB4N0YwNDZERjYsCisweDZFRjY0RjI2LCAweDZERjYwMDBCLCAweDAwMUM1ODFDLCAweEEwMDBBMDAwLAorMHgwMDFEMDEwMCwgMHgwMDFENDAwMCwgMHgwMDA0MDAyMSwgMHgwMDFDNTg5QywKKzB4MDAxRTEwMjEsIDB4MDAyMDFBODgsIDB4MDAyMDFBQUEsIDB4MDAyMDIxMEMsCisweDAwMjAxQUMyLCAweDAwMjAxQUQwLCAweDAwMjAzOUMwLCAweDAwMUUxMDBCLAorMHgwMDFFMTAyOCwgMHgwMDIwMUIzQywgMHgwMDIwMUI0OCwgMHgwMDIwMUFEOCwKKzB4MDAyMDFBRjYsIDB4MTIzNDU2NzgsIDB4MDAxRTEwMDAsIDB4MDAxMEYxMDAsCisweDAwMjAxQjI0LCAweDY0NENENkE3LCAweDAwMEIzNDZDLCAweEQ2QTYyNDUwLAorMHgzNDZDNjQ0QywgMHgyNDUwMDAwQiwgMHg2NDRDRDZBNCwgMHgwMDBCMzQ2QywKKzB4NjI1QzI0NTAsIDB4NDIwODYxNkQsIDB4NDIwODQxMTksIDB4NDIwMDYwMTksCisweDY3MEU2MTRDLCAweEQ0OUUzMjFDLCAweDQyMDAyMDdELCAweDMyNENDOTBGLAorMHgyMjAwMDAwQiwgMHg0MjA4NjI1QywgMHg0MjAwNDIwOCwgMHgzMjRDNjQ0QywKKzB4NDIwMEQ0OTgsIDB4MDAwQjMyNEMsIDB4MkZFNjIyNjAsIDB4NjE0QzRGMTIsCisweDQxMDBENDkzLCAweDY3MTAzMTRDLCAweEUyOUY2NjZELCAweDI3Mjk0NjE5LAorMHg2RTUzNjI2OSwgMHg2NzJFNjU3MywgMHg0MjIxMjI3RCwgMHg0MjIxNDIyMSwKKzB4NzYwMTY2MkMsIDB4RTQwMTQ2MDgsIDB4MzRFODQ2MDgsIDB4NjQ0QzQ2MDAsCisweDA3MUEwNDY3LCAweDIxNTAyNTdCLCAweDAwMEI0RjE2LCAweDRGMjI2RUY2LAorMHhEMjg1N0ZFOCwgMHg4ODAxNjAyMSwgMHhEMjg0OEI3QiwgMHgyNjY4NjYyMSwKKzB4RDI4MzhCNzcsIDB4MjY2ODY2MjEsIDB4RTUwRjhCNzMsIDB4RTQwMUJGQTIsCisweEJGQTRFNTAxLCAweEU1ODZFNDAwLCAweEU0MDA2NTVDLCAweDJGNTBCRkE0LAorMHhCRkExRTQwMSwgMHhFNjAyRTUwNiwgMHg2MDYzNDYxOCwgMHg4MUYyRTQwMSwKKzB4NjU0M0JGOUYsIDB4RTQwMTg1RjIsIDB4QkZBQjY1NDMsIDB4ODVGMjY2MDMsCisweDY1NDNFNDAxLCAweDY2MDNCRkIxLCAweEU0MDI2NUYwLCAweDYwNTM3NTZDLAorMHg4MEY4QkY4MCwgMHhCRjgyRTQwMiwgMHg4NEY4RTUxMiwgMHg3MDkwRTQwMiwKKzB4NjUwM0JGODIsIDB4NDYxOEU2MDIsIDB4ODFGNjYwNjMsIDB4QkY4MEU0MDIsCisweDg1RjZFNTAwLCAweDY2MDNFNDAyLCAweEU1MDBCRjhDLCAweEU0MDI4NUY2LAorMHhCRjkyNjYwMywgMHhFNUZFRTUwMCwgMHhFMDEwNjU1QywgMHhCRjYxRTQwMywKKzB4RTUxMzBGNTQsIDB4RTQwRUJGNjMsIDB4MDVGQ0UwMTAsIDB4QkY2M0U0MEUsCisweEU1MDA3NTg1LCAweEJGNjRFNDAzLCAweEU1MDBFNjQwLCAweEJGNzFFNDAzLAorMHhFNTAwRTY0MCwgMHhCRjc4RTQwMywgMHhFNUZGRTY0MCwgMHhFMDE0NjU1QywKKzB4QkY0N0U0MDQsIDB4RTQwRjBGNTQsIDB4RTUwNEJGNDksIDB4MDVGQ0UwMTQsCisweEJGNDlFNDBGLCAweEU1MDE3NTg0LCAweEJGNEFFNjQwLCAweEU1MDFFNDA0LAorMHhCRjU3RTY0MCwgMHhFNTAxRTQwNCwgMHhFNDA0RTY0MCwgMHhBRjVDN0YxOCwKKzB4N0YxODRGMjYsIDB4MDAwQjRGMjYsIDB4NEYyMjAwMDksIDB4RDI0MjdGRjAsCisweDg4MDE2MDIxLCAweEQyNDE4QjcxLCAweDI2Njg2NjIxLCAweEQyNDA4QjZELAorMHgyNjY4NjYyMSwgMHhFNTBGOEI2OSwgMHhFNDAxQkYxQywgMHhCRjFFRTUwMSwKKzB4RTU4NkU0MDAsIDB4RTQwMDY1NUMsIDB4MkY1MEJGMUUsIDB4QkYxQkU0MDEsCisweEU0MDFFNTA2LCAweEJGMUM2NTQzLCAweEU0MDFFNjQwLCAweEJGMjk2NTQzLAorMHhFNDAxRTY0MCwgMHhCRjMwNjU0MywgMHg2NUYwRTY0MCwgMHg3NTZDRTQwMiwKKzB4QkVGRjYwNTMsIDB4RTQwMjgwRjQsIDB4RTUxMkJGMDEsIDB4RTQwMjg0RjQsCisweEJGMDE3MDkwLCAweEU2NDA2NTAzLCAweEJGMDJFNDAyLCAweEU2NDBFNTAwLAorMHhCRjBGRTQwMiwgMHhFNjQwRTUwMCwgMHhCRjE2RTQwMiwgMHhFNUZFRTUwMCwKKzB4NjA1MzY1NUMsIDB4QkVFNUU0MDMsIDB4RTUxMzgwRjgsIDB4RTQwRUJFRTcsCisweEU0MEU4NEY4LCAweEJFRTc3MDg1LCAweEU1MDA2NTAzLCAweEJFRThFNjQwLAorMHhFNTAwRTQwMywgMHhCRUY1RTY0MCwgMHhFNTAwRTQwMywgMHhCRUZDRTY0MCwKKzB4RTVGRkU0MDMsIDB4NjA1MzY1NUMsIDB4QkVDQkU0MDQsIDB4RTQwRjgwRkMsCisweEU1MDRCRUNELCAweEU0MEY4NEZDLCAweEJFQ0Q3MDgzLCAweEU1MDE2NTAzLAorMHhCRUNFRTY0MCwgMHhFNTAxRTQwNCwgMHhCRURCRTY0MCwgMHhFNTAxRTQwNCwKKzB4RTQwNEU2NDAsIDB4QUVFMDdGMTAsIDB4N0YxMDRGMjYsIDB4MDAwQjRGMjYsCisweDAwMDAwMDA5LCAweDAwMUUxMDJGLCAweDAwMUUxMDgwLCAweDAwMUUxMDkwLAorMHgwMDFFMTAzRiwgMHgwMDFFMTAzRSwgMHgwMDIwMzlCQSwgMHgwMDIwMzlCQywKKzB4MDAyMDM5QkUsIDB4RDIxREQxMUMsIDB4NjYyMDYwMTAsIDB4Njc2QzcwMDEsCisweDM3MDBDOTBGLCAweEU1MDA4RDEzLCAweDY3MTA2MjEwLCAweDc3MDE2MjJDLAorMHg2NDIzMjE3MCwgMHhENjE2NjAxMCwgMHg0NDA4NDQwOCwgMHgzNDI4QzkwRiwKKzB4NjI2MDIxMDAsIDB4NzIwMUQ1MTMsIDB4NDQwODI2MjAsIDB4MDAwQjM1NEMsCisweEQxMEY2MDUzLCAweDI1NTg2NTEwLCAweEU2MDA4RDEzLCAweEQ2MERENDBCLAorMHg2NTVDNjU0MCwgMHg0NzA4Njc1MywgMHgzNzU4NDcwOCwgMHg0NzA4NjU0MCwKKzB4MjQ1MDc1MDEsIDB4MzY3QzYwNDAsIDB4MjQwMEM5MEYsIDB4NzJGRjYyMTAsCisweDAwMEIyMTIwLCAweDAwMDA2MDYzLCAweDAwMjAzOTA1LCAweDAwMjAzOTA0LAorMHgwMDIwMzkwNiwgMHgwMDIwMzUyQywgMHg3RkZDNEYyMiwgMHhFNjgwRDE5RiwKKzB4NjY2QzYyMTIsIDB4RDI5RTJGMjIsIDB4NjdGMzY1NjMsIDB4NDIwQjc1NDIsCisweDdGMDRFNDA0LCAweDAwMEI0RjI2LCAweEU2ODAwMDA5LCAweEQyOTg2NjZDLAorMHhFNzAwNjU2MywgMHg0MjJCNzU0MCwgMHhFNjgwNjQ3MywgMHhEMjk0NjY2QywKKzB4RTcwMDY1NjMsIDB4NDIyQjc1NDMsIDB4MkY4NjY0NzMsIDB4MkZBNjJGOTYsCisweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweDdGQ0M0RjIyLCAweERDOEVEMjhELAorMHg3MjAxMUYyMSwgMHhEQjhEMUYyMiwgMHhEMThFREU4RCwgMHg2NjEyNTIxMSwKKzB4OEIwMTM2MjAsIDB4MDAwOUEwRTUsIDB4QzkwMzYwNjEsIDB4OEIwMTg4MDEsCisweDAwMDlBMERGLCAweEQyODhENDg3LCAweEVEODQ0MjBCLCAweDJGMDI1NTAzLAorMHgzMEQwODQ1QywgMHhBMEI4ODkwMSwgMHhEMTg0MDAwOSwgMHg2MjZDNjYxMCwKKzB4ODgwMTYwMjMsIDB4RDE4MjhCNjgsIDB4NjIxMDFGQzMsIDB4ODk1QjIyMjgsCisweEUwMDNENDgwLCAweDQwMTg2NzQyLCAweDY4NDIxNzcyLCAweEQ1N0VFOTAwLAorMHg4MTgxNkRCMywgMHg3RDA0MjE5MCwgMHg2N0QyNkFCMiwgMHg2NEUyNjg1MiwKKzB4MUY0OTFGNTcsIDB4NzQwNDY0RTMsIDB4MUZBNDY1NDIsIDB4NjU0MzFGNUEsCisweDYyNTI3NUY4LCAweDFGNzYxRkQ1LCAweDZENTMxRjJCLCAweERBNzRENzczLAorMHg3RDk0RDI3NCwgMHg2OEQyMUY4OCwgMHg2QUEyNjk3MiwgMHhEMTcyNjAyMiwKKzB4MjIwMkNCMjAsIDB4RTE0MDFGMUMsIDB4NzYwMUU2MDAsIDB4MzIxMzYyNkQsCisweDU2RjQ4QkZCLCAweDUyRjY1MUY1LCAweDIxMjIyQjYyLCAweDUyRjg1MUY3LAorMHgyMTIyNTZGOSwgMHgyRTYyNTFGQSwgMHg1MUZCMjQxMiwgMHgyRDgyMjUxMiwKKzB4RDk2NjI3OTIsIDB4MjlBMkRENUYsIDB4NkFEMkQ5NjUsIDB4RDk2NDY4OTIsCisweDY4RDIxQTg0LCAweDYwODFEQTYzLCAweDI4MDFDQjAxLCAweEQ4NjI2NkQyLAorMHgyQTYyMjk2MiwgMHhFRDAxNUFGQywgMHgyQUQyNDgwQiwgMHgyQUQyNEQxOCwKKzB4NjJEMkRENUUsIDB4MkQyMjcyMDEsIDB4RDE1MDU2RjMsIDB4RTIwMjYwNjIsCisweDI2MDJDQjAxLCAweDIxMjBBMDNELCAweDhCM0EyMjI4LCAweEU0MDFERDU4LAorMHgyMTQwRTYwMCwgMHhFMDFDMkQ2MiwgMHhDODAxMDA1QywgMHhENDU1OEIwQSwKKzB4RTYwMEQ3NTUsIDB4RUQ3RDI0NzIsIDB4NjI2Qzc2MDEsIDB4OEJGQjMyRDMsCisweDI0RDJERDUyLCAweEUyRkU2OEMyLCAweDJDODIyODI5LCAweDA5NUNFMDFFLAorMHhFMDFGNURGMSwgMHgwQTVDMkQ5MCwgMHg3NTEwNTFGMiwgMHhFRDA2MjFBMCwKKzB4RDc0QkU2MDAsIDB4ODQ1NkQ0NEIsIDB4MjcwMDc2MDEsIDB4Njk2QzY4NTQsCisweDI0ODAzOUQzLCAweDhGRjY3NDAxLCAweERBNDc3NzAxLCAweDJBMTBFMTk0LAorMHhFMjAwN0EwMSwgMHg3QTBGMkEyMCwgMHhEMTMwRTgwNSwgMHg2NjEwMkE4MCwKKzB4NjAyMzYyNkMsIDB4ODkwODg4MDEsIDB4RDI0MEQ0MkEsIDB4NDIwQjY1RjIsCisweEQxMzFFRDAxLCAweEFGMzA0RDE4LCAweDY1RjIyMUQyLCAweDg1NTNENDNDLAorMHg2MjBENjY0MiwgMHg4OTA3MzI2MiwgMHhEMTNCRDQzQSwgMHgwMDA5NDEwQiwKKzB4RTYwMUQ3M0EsIDB4Mjc2MkFGMUEsIDB4RDEzNEQ0MUUsIDB4NDEwQjY1RjIsCisweEQxMjVFRDAxLCAweEQ2MzdENDM2LCAweDQ2MEI0RDE4LCAweEFGMEQyMUQyLAorMHg3RjM0MDAwOSwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwKKzB4MDAwQjY5RjYsIDB4NEYyMjY4RjYsIDB4ODU0NjdGRjQsIDB4MkYwMUU2ODEsCisweDY2NkM4NTQ3LCAweDg1NDg4MUYxLCAweDgxRjJEMjA5LCAweDY3RjM4NTQyLAorMHg4NTQzODFGMywgMHg4MUY0RTQwQywgMHg2NTYzNjA1MywgMHg0MjBCODFGNSwKKzB4N0YwQzc1NDAsIDB4MDAwQjRGMjYsIDB4MDAwMDAwMDksIDB4MDAxQzNEOUMsCisweDAwMjAyNDU0LCAweDAwMTE3NzlBLCAweDAwMUMzNkY4LCAweDAwMUMzQjlDLAorMHgwMDFDMzcwNCwgMHgwMDIwMzUyNCwgMHgwMDIwMTRBMCwgMHgwMDIwMzkxNSwKKzB4MDAyMDM5MTQsIDB4MDAyMDM5MTAsIDB4MDAxQzNEOTgsIDB4MDAxQzNCQjQsCisweDAwMUM1OTYwLCAweDAwMUMzNTAwLCAweDAwMUMzRDMwLCAweDAwMUM4OTYwLAorMHgwMDIwMzRGQywgMHgwMDFDM0QwMCwgMHgwMDIwMTYwQywgMHgwMDExNzczMCwKKzB4MDAyMDM5MTgsIDB4MDAxQzU4MkMsIDB4MjAwMEEwMDAsIDB4MDAwMEEwMDAsCisweDAwMTE3NzhDLCAweDAwMTE3NzkyLCAweDAwMTE3Nzg4LCAweDAwMjAxNENDLAorMHgwMDIwMzhFQywgMHgwMDIwMzRFQywgMHgwMDIwMTUzMCwgMHgwMDFFMjEzMCwKKzB4MDAyMDNEN0MsIDB4MDAyMDE4QTIsIDB4MkY5NjJGODYsIDB4MkZCNjJGQTYsCisweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweEQxOUI3RkVDLCAweDJGMTJFMDAwLAorMHg2MTAzRDQ5QSwgMHgxRjQyODFGMiwgMHhERDlBREE5OSwgMHhENjlBNjgxMywKKzB4RTAwMTQ4MDgsIDB4NDYwQkRFOTksIDB4MzhFQzQ4MDAsIDB4NjVBMjFGMDMsCisweDM1MjA1MkExLCAweEEyM0U4QjAxLCAweDYwNTEwMDA5LCAweDg4MDFDOTAzLAorMHhBMjM4OEIwMSwgMHg1MjUzMDAwOSwgMHgzMkUwREU5MSwgMHhEOTkxOEIxMCwKKzB4NjRBMzQ5MEIsIDB4NEIwQkRCOTAsIDB4REU5MDY0MDMsIDB4RDc5MUQ2OTAsCisweEVDMDFENTkxLCAweDJFMDJFMTAwLCAweDI3MTAyNkMwLCAweDI1MDJBRkRGLAorMHhDODAxODU1MSwgMHhBMTU3OEIwMSwgMHg2MjUxMDAwOSwgMHg0MjAwNjIyRCwKKzB4NUU1MzM2NkEsIDB4ODVFMjIyNkQsIDB4QzkwMzY0MkMsIDB4ODVFMzY2MDMsCisweDYwNTM2NTBELCAweDQwMjE0MDIxLCAweDQ1MDBDOTNGLCAweDMyMkE2NzAzLAorMHg2MDUzMjUyRCwgMHhDOTAxRDE3RiwgMHg2MDEwNkMwMywgMHg4ODAxRDk3RiwKKzB4REI3RjhCMDUsIDB4MjEyMEUyMDAsIDB4Q0IwMTYwQjIsIDB4RDE3RDJCMDIsCisweDg4MDE2MDExLCAweDY1QTI4QjBBLCAweDhEMDQyNDQ4LCAweDlCOUU2MjUxLAorMHhBMDAzMjJCOSwgMHg5MTlCMjUyMSwgMHgyNTIxMjIxQiwgMHgzN0IzRUIxMCwKKzB4MjQ0ODg5NUUsIDB4RDQ3MzhCMDcsIDB4MjIyODYyNDEsIDB4NjA2Mzg5MDMsCisweEEwNTc4MUY4LCAweEQ1NzA2NDczLCAweDQ2MDg0NjA4LCAweDg1RTI2MjczLAorMHg0NjAwNkI1MCwgMHgzNjJDNDIwMCwgMHgyQkI4QzkxMCwgMHg4RjFGNjQ2MywKKzB4MjY2ODY2MDMsIDB4RDI2OTg5MTEsIDB4MDYyRDYwNDMsIDB4NDExOTYxNkQsCisweDZCMEU2MDE5LCAweDgxRjgyMEJELCAweDg4MDE2MEMzLCAweDY0NkM4RjJDLAorMHg4ODBGNjA3MywgMHhBMDI3OEIxQiwgMHhEMjYxMDAwOSwgMHgwNTJENjA0MywKKzB4NDExOTYxNUQsIDB4NjcwRTYwMTksIDB4NjQ1QzIwN0QsIDB4ODFGOEEwMUMsCisweDg5MEYyNjY4LCAweDYwNDNEMjVCLCAweDZCNUQwNTJELCAweDYwQjk0QjE5LAorMHgyMDFENjEwRSwgMHg2MEMzODFGOCwgMHg4RjBEODgwMSwgMHg2NDczNjQ1QywKKzB4RUMwMEEwMEEsIDB4NjA0M0QyNTQsIDB4NjI1RDA1MkQsIDB4NjAyOTQyMTksCisweDIwN0Q2NzBFLCAweDgxRjg2NDVDLCAweDg4MDI4NUY4LCAweDg1RTE4OTBBLAorMHg4RDA3QzgyMCwgMHhFNkRDNjIwMywgMHg2MDIzMjI2OSwgMHg4MUUxQTAwMiwKKzB4NjQ0Q0U0RkYsIDB4NjIxMEQxNDksIDB4ODkwMTIyMjgsIDB4NjQ0Q0U0RkYsCisweDY1NERFQkZGLCAweDM1QjA2QkJDLCAweERCMzY4QjJCLCAweDY0QTM0QjBCLAorMHg0MTBCRDEzNSwgMHg1NDAzNjQwMywgMHg4NTQ0NkUwMywgMHhDOTQ4REI0MCwKKzB4REM0MDg4MDgsIDB4QkVBRThCMDEsIDB4NjRCM0U1MDIsIDB4NjVFMzRDMEIsCisweERCM0RFQzAxLCAweEQxM0QyREMyLCAweDYyMTI2MEIyLCAweDcyMDE3MDAxLAorMHgyMTIyODgwNSwgMHgyQjAyOEYwOCwgMHg2NjZDRTY4MCwgMHg2NTYzRDIzOCwKKzB4NzU0OUU3MDAsIDB4NjQ3MzQyMEIsIDB4QTAzMEQ0MzYsIDB4N0ZGRjAwMDksCisweDg1RTI4MDAwLCAweDIwQjlFQkZDLCAweDYxMDM4MUUyLCAweDk0MkE4NUUzLAorMHg2MjAzMjA0OSwgMHg0NTA4ODVGOCwgMHg4MUUyMjAxQiwgMHhDOTAxNjBDMywKKzB4NDAwODQwMTgsIDB4NDAwODQwMDgsIDB4NDAwMDIyNUIsIDB4NjAyMzIyMEIsCisweDg1RTQ4MUUzLCAweDQxMThFMTA4LCAweDgxRTQyMDFCLCAweEU0MDI2MkEyLAorMHgyMEI5ODUyMSwgMHg2N0EyODEyMSwgMHhDQjAxNjA3MSwgMHg4NUY4MjcwMSwKKzB4ODkwMzMwNDIsIDB4RUNFNzg1RTIsIDB4ODFFMjIwQzksIDB4NDkwQkQ0MUUsCisweEEwM0IwMDA5LCAweDdFMDMwMDA5LCAweDAwMUMzRDMwLCAweDAwMjAzRDg4LAorMHgwMDIwMzRGQywgMHgwMDFFMjEyQywgMHgwMDIwMzNFMCwgMHgwMDFDM0QwMCwKKzB4MDAxMTc3ODAsIDB4MDAyMDE0QTAsIDB4MDAyMDE2NkMsIDB4MDAxMTc3MEMsCisweDAwMjAzOTE0LCAweDAwMjAzOTE1LCAweDAwMjAzOTEwLCAweDAwMjAxOEEyLAorMHgwMDFDMzZGOCwgMHgwMDIwMzk4OCwgMHgwMDIwM0Q5OCwgMHgwMDIwM0I3QywKKzB4MDAyMDNCRkMsIDB4MDAyMDNDN0MsIDB4MDAyMDNDRkMsIDB4MDAyMDM5MDAsCisweDAwMjAzNEY0LCAweDAwMjAxNENDLCAweDAwMjAzOThDLCAweDAwMjAzOTkwLAorMHgwMDIwMjQ1NCwgMHgwMDIwM0Q4MCwgMHgwMDIwM0Q4NCwgMHg2MDIyNjJGMiwKKzB4NDAwOTQwMTksIDB4QzkwRjQwMDksIDB4OEIwQjg4MEEsIDB4NjBFMkRFOEMsCisweDQwMDk0MDE5LCAweEM5MEY0MDA5LCAweDhCMDM4ODA4LCAweENCMDE2MEEyLAorMHgyODAyQTAwNiwgMHg2NUUyREU4NywgMHgyRTUyNzUwMSwgMHgyODYyNjZBMiwKKzB4NTJGMzY2RjIsIDB4MjYyMkFFODMsIDB4RDI4Mzg1NTEsIDB4REU4M0M4MDIsCisweEEwOTU4QjAxLCAweDQyMEIwMDA5LCAweDRFMEI2NEEzLCAweDVFMDM2NDAzLAorMHg4NUU0NjUwMywgMHg0OTE4RTkwOCwgMHhENzdEMjA5QiwgMHhFMDRDODFFNCwKKzB4REM3QzBCN0UsIDB4N0IwMUQ5N0MsIDB4NjFDMjA3QjYsIDB4NzEwMTY2OTAsCisweDhEMDYyNjY4LCAweEQ0NzkyQzEyLCAweDQyMEJEMjc5LCAweEEwNzBFQjAxLAorMHg2MjUxMkRCMiwgMHg0QjE4RUIwRiwgMHgyMkI5RTEwMiwgMHgzMjEwNDExOCwKKzB4ODU1MThCMEYsIDB4MjAyOUUyRkMsIDB4NjA1MTgxNTEsIDB4Q0IwMTcyRTAsCisweDg1RTEyNTAxLCAweDIwMjk5NEEzLCAweDg1RTQ4MUUxLCAweEEwNTIyMDQ5LAorMHg2NzUxODFFNCwgMHg0NzE5Njc3RCwgMHg2NjdFNjc3OSwgMHg3NzAxMjc2RCwKKzB4NjkwMzYwN0MsIDB4ODgwMTQ5MTgsIDB4MjU5MThGM0UsIDB4NkIxMkQxNjEsCisweDIxQjI3QjAxLCAweDY2MEQ4NUUzLCAweDQwMjE2MDYzLCAweEM5M0Y0MDIxLAorMHg2QzAzNDYwMCwgMHgyNjJEMzIyQSwgMHhDODAxNjA2MywgMHhEQjVFRDE1RCwKKzB4OTY3RDg5MDEsIDB4RTYwMDJDNkIsIDB4NjY2QzY3Q0QsIDB4NDAwMDYwNjMsCisweDYyMkQwMjFELCAweDhEMEUzMjcwLCAweDYwNDM2NDAzLCAweEU5RkYwMjFELAorMHg4QjAxMzI5MCwgMHgwMUM1QTAwNywgMHg2MjZDNzYwMSwgMHgzMjkyRTkwNCwKKzB4NjQ2QzhCRUIsIDB4NjA0MzQ0MDAsIDB4RDE1MDA0QkQsIDB4MEI0NTc0MDEsCisweDY2OUQ2OTExLCAweDg5MDczNjcwLCAweDYwMkQ2MjExLCAweDg5MDM4OEZGLAorMHhFMjAxREI0QiwgMHgyQjIwMjFDMSwgMHhFQ0ZDODU1MSwgMHg4MTUxMjBDOSwKKzB4Q0IwMTYwNTEsIDB4REM0NzI1MDEsIDB4NjRBMzRDMEIsIDB4NTFGMzY2RjIsCisweDg1RUYyNjEyLCAweDU0RjJEMjQ0LCAweDY1MEQ0MjBCLCAweDAwMDlBREU3LAorMHhFNTAwREM0MiwgMHg0MjBCMkM1MiwgMHg0RTBCNjRBMywgMHg1NDAzNjQwMywKKzB4ODU0NDZFMDMsIDB4NjcwM0U5MDgsIDB4NjUwMzQ5MTgsIDB4Mjc5OTg1NDEsCisweERCMzIzNzkwLCAweDhGMEJEOTMyLCAweDYwMTM2MTBELCAweDhCMDdDODIwLAorMHhDOTQ4NjA1MywgMHg4QjAzODgwOCwgMHhFNTAxQkQ0RCwgMHgwMDA5QTAwNSwKKzB4MjEyOEQyMzMsIDB4QkQ0Njg5MDEsIDB4NjRCM0U1MDAsIDB4NDkwQjY1RTMsCisweEFEQkNFQzAxLCAweDg1RjIyREMyLCAweDcwMDFFRTA0LCAweDMxRTc2MTBELAorMHg4RDAyODFGMiwgMHhBREE5N0EwOCwgMHg3RjE0MDAwOSwgMHg2RUY2NEYyNiwKKzB4NkNGNjZERjYsIDB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsIDB4RjdGRjY4RjYsCisweDJGRTY4MDAwLCAweEQyMjM0RjIyLCAweDYwRTM2RTIyLCAweDhEMDJDODQwLAorMHhCQkY5MjJFMiwgMHhFMjQwMDAwOSwgMHgyRTI4NDIxOCwgMHhCQzA0ODkwMSwKKzB4NjBFMzAwMDksIDB4ODkwNUM4MTAsIDB4RDIxQ0Q0MUIsIDB4MDAwOTQyMEIsCisweDAwMDlCQzAzLCAweEM4MDU2MEUzLCAweEJENkQ4OTAxLCAweDYwRTMwMDA5LAorMHg4OTAyQzgwMiwgMHhBQzAwNEYyNiwgMHg0RjI2NkVGNiwgMHg2RUY2MDAwQiwKKzB4MDAxQzNEM0MsIDB4MDAxMTc3NjAsIDB4MDAyMDE0QTAsIDB4MDAyMDE2NkMsCisweDAwMjAzNDhDLCAweDAwMjAzRDlDLCAweDAwMjAzOTAwLCAweDAwMjAzNEY0LAorMHgwMDIwMTRDQywgMHgwMDIwMzk2QywgMHgwMDIwMzk3NCwgMHgwMDIwMzk2OCwKKzB4MDAyMDM5NkEsIDB4MDAyMDE1MzAsIDB4MDAyMDE4RUUsIDB4MDAyMDM5OEMsCisweDAwMDA4MDAwLCAweDAwMUMzNTEwLCAweDAwMjAzRDkwLCAweDAwMjAxOEEyLAorMHgwODBBMEMwRSwgMHgwMDAyMDQwNiwgMHgxQTFDMUUyMCwgMHgxMjE0MTYxOCwKKzB4MkUzMDMyMzQsIDB4MjYyODJBMkMsIDB4M0EzQzNFNDAsIDB4NkM2MjU2NDgsCisweDQxMTEyRjI2LCAweEUyMjA4RjE4LCAweDg5MEIzMTIzLCAweDMyMUNEMjA0LAorMHhEMTAyNjIyMCwgMHg0MTJCMzEyQywgMHgwMDA5MDAwOSwgMHgwMDIwMzQwQSwKKzB4MDAyMDMzQzAsIDB4MDAwQkUwMDAsIDB4NDAwMDYyRjYsIDB4NDAwMDQwMDAsCisweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDYyRjYwMDBCLCAweDQwMDA0MDAwLAorMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg0MDE4NDAwMCwgMHg2MkY2MDAwQiwKKzB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAyODQwMDAsCisweDYyRjYwMDBCLCAweDQwMDA0MDAwLCAweDQwMTg0MDAwLCAweDAwMEI0MDI4LAorMHhDOTBGNjJGNiwgMHg0MDA1NDAwNSwgMHg0MDA1NDAwNSwgMHg2MkY2MDAwQiwKKzB4NDAwNUM5MDcsIDB4NDAwNTQwMDUsIDB4NjJGNjAwMEIsIDB4NDAwNUM5MDMsCisweDAwMEI0MDA1LCAweEM5MDE2MkY2LCAweDAwMEI0MDA1LCAweDAwMDA2MkY2LAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDU0NEYwRDBBLAorMHg0NjIwNTM1NSwgMHgwMDAwM0E1NywgMHgyMDZDNzU0QSwgMHgzMjIwMzEyMCwKKzB4MjAzODMwMzAsIDB4MzIzQTMxMzIsIDB4MzIzMTNBMzcsIDB4MDAwMDAwMDAsCisweDAwMDAwRDBBLCAweDAwMDAwMDQzLCAweDQyNzA3MzcyLCAweDNEMjA2Njc1LAorMHg1NTRFMjAzRCwgMHgyMDJDNEM0QywgMHg2RTQ5Njc3QSwgMHg0RTQ5NzI3NCwKKzB4NkQ3NTRFNTEsIDB4MDAwMDAwM0QsIDB4NjE3NjZFNDksIDB4MjA2NDY5NkMsCisweDcyNjU3Mzc1LCAweDIwNzI2RjIwLCAweDIwNzk2NTZCLCAweDAwMjE0NDQ5LAorMHg1MjUwNDU0NSwgMHg1NzIwNEQ0RiwgMHg2NTc0Njk3MiwgMHg2NDYxMjAyQywKKzB4MDAzRDcyNjQsIDB4NkM2MTc2MjAsIDB4MDAwMDAwM0QsIDB4MDAwMDBBMEQsCisweDQzNUY0RDVBLCAweDQ2NUY0NDRELCAweDRDNDQ1RjU3LCAweDQ5NEU0OTVGLAorMHgwMDAwMDA1NCwgMHg2RTZCNkU1NSwgMHgyMDZFNzc2RiwgMHg2RDZENkY2MywKKzB4M0Q2NDZFNjEsIDB4MDAwMDAwMDAsIDB4MjAzQTMwNTEsIDB4MDAwMDAwMjAsCisweDIwM0EzMTUxLCAweDAwMDAwMDIwLCAweDIwM0EzMjUxLCAweDAwMDAwMDIwLAorMHgyMDNBMzM1MSwgMHgwMDAwMDAyMCwgMHgyMDNBMzQ1MSwgMHgwMDAwMDAyMCwKKzB4MkI0MzQ3NDEsIDB4NzM2OTZGNEUsIDB4NjE0MzIwNjUsIDB4NzI2MjY5NkMsCisweDZGNjk3NDYxLCAweDYxNjYyMDZFLCAweDZGMjA2QzY5LCAweDY5NzQyMDZFLAorMHgwRDBBNjU2RCwgMHgwMDAwMDAwMCwgMHgwMDAwMDA3MiwgMHgwMDIwNTIyMCwKKzB4MDAwMDBEMEEsIDB4NjI3MzU1NzYsIDB4NzQ3MzcyNUYsIDB4MDAwMDBBMEQsCisweDYyNzM1NTc2LCAweDczNzU3MzVGLCAweDY0NkU2NTcwLCAweDAwMDAwQTBELAorMHg2MjczNTU3NiwgMHg3MzY1NzI1RiwgMHgwMDBBMEQ2RCwgMHgwMDAwMDA0NCwKKzB4NDQzODc1NzAsIDB4NzI2MzczNjUsIDB4NkY3NDcwNjksIDB4M0Q1ODQ1NzIsCisweDAwMDAwMDAwLCAweDAwMDAwMDQ3LCAweDAwMDAwMDQyLCAweDcyNzQ2RTQ5LAorMHg2RDY1MjA1MSwgMHgyQzc5NzQ3MCwgMHg0OTY3N0EyMCwgMHg0OTcyNzQ2RSwKKzB4NzU0RTUxNEUsIDB4MDAwMDNENkQsIDB4NjU0QzcyNDUsIDB4MDAwMDAwNkUsCisweDAwMDAwMDQ5LCAweDIwNzQ2RjRFLCAweDc1NkY2RTY1LCAweDQ5MjA2ODY3LAorMHg0MjIwNTE0RSwgMHgwQTBENjY3NSwgMHgwMDAwMDAwMCwgMHgwMDAwMDBGRiwKKzB4MDAwMjAwMDEsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMTBFMDEwRCwKKzB4MDAwMjAwMDMsIDB4MDEwOTAxMDgsIDB4MDAwMjAxMEEsIDB4MDIwMDAwMDMsCisweDAyMDIwMjAxLCAweDAyMDQwMjAzLCAweDAyMDYwMjA1LCAweDAyMDIwMjAwLAorMHgwMjA0MDIwMywgMHgwMjBDMDIwQiwgMHgwMjBFMDIwRCwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwMDAwMEZGLAorMHgwMDAyMDAwMSwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAxMEUwMTBELAorMHgwMDAyMDAwMywgMHgwMTA5MDEwOCwgMHgwMDAyMDEwQSwgMHgwMDAzMDAwMywKKzB4MDIwMjAyMDEsIDB4MDIwNDAyMDMsIDB4MDIwNjAyMDUsIDB4MDIwMjAyMDAsCisweDAyMDQwMjAzLCAweDAyMEMwMjBCLCAweDAyMEUwMjBELCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDEwRTAxMEQsCisweDAwRkYwMTBGLCAweDAxMDkwMTA4LCAweDAxMEIwMTBBLCAweDAyMDAwMTBGLAorMHgwMjAyMDIwMSwgMHgwMjA0MDIwMywgMHgwMjA2MDIwNSwgMHgwMjAyMDIwMCwKKzB4MDIwNDAyMDMsIDB4MDIwQzAyMEIsIDB4MDIwRTAyMEQsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMTBFMDEwRCwKKzB4MDBGRjAxMEYsIDB4MDEwOTAxMDgsIDB4MDEwQjAxMEEsIDB4MDEwRjAxMEYsCisweDAyMDIwMjAxLCAweDAyMDQwMjAzLCAweDAyMDYwMjA1LCAweDAyMDIwMjAwLAorMHgwMjA0MDIwMywgMHgwMjBDMDIwQiwgMHgwMjBFMDIwRCwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwMjA1MjIwLAorMHgwMDAwMDA0NiwgMHgwMDAwMDA1OSwgMHg3MzIwNDE0MiwgMHgwMDNENzE2NSwKKzB4NDk1NDQxMjAsIDB4MDAwMDIwNEQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMkUwMjA5LCAweDgwMDAwMTAxLCAweDAwMDQwOUZBLCAweDAwRkYwNDAwLAorMHgwNTA3MDAwMCwgMHgwMjAwMDIwMSwgMHg4MjA1MDcwMCwgMHgwMDAyMDAwMiwKKzB4MDM4MzA1MDcsIDB4MDcwMTAwNDAsIDB4NDAwMzA0MDUsIDB4MDIwOTAxMDAsCisweDAxMDEwMDJFLCAweDA5RkE4MDAwLCAweDA0MDAwMDA0LCAweDAwMDAwMEZGLAorMHgwMjAxMDUwNywgMHgwNzAwMDA0MCwgMHg0MDAyODIwNSwgMHgwNTA3MDAwMCwKKzB4MDA0MDAzODMsIDB4MDQwNTA3MDEsIDB4MDAwMDQwMDIsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDA3MDkwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCB9OworCitjb25zdCB1MzJfdCB6Y0Z3SW1hZ2VTaXplPTE1OTI4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZnd1X0JBLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd3VfQkEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzc0MTU3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZnd1X0JBLmMKQEAgLTAsMCArMSw4NzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgImNwcmVjb21wLmgiCisKK2NvbnN0IHUzMl90IHpjRndJbWFnZVtdID0geworMHgwMDA5MDAwQiwgMHg0RjIyMkZFNiwgMHhERTkxN0ZGQywgMHhFMTE0RDc5MSwKKzB4MUUxM0Q0OTEsIDB4MUU0QzQ3MEIsIDB4MDAwOUIwMTcsIDB4OTVDMkU2MDAsCisweEM4NDA2MEUyLCAweDJGMDI4RjAzLCAweDhGRjkzNjUyLCAweEQ0OEI3NjAxLAorMHg0RTBCREU4QiwgMHhENDhCMDAwOSwgMHgwMDA5NEUwQiwgMHg0RTBCRDQ4QSwKKzB4N0YwNDAwMDksIDB4QTA0NzRGMjYsIDB4NEYyMjZFRjYsIDB4NDEwQkQxODcsCisweEQ0ODcwMDA5LCAweDAwMDk0NDBCLCAweDQ1MEJENTg2LCAweEQ3ODYwMDA5LAorMHg2MTFERTFGRiwgMHhEMTg1MjcxMiwgMHg2MDEyRTJGRiwgMHhDQjAxRDQ4NCwKKzB4NzFEQzIxMDIsIDB4NzEwNDIxMjIsIDB4MjEyMkU1MDEsIDB4RDU4MTI0NTIsCisweEQyODE5NzkyLCAweEU3MDAyNTcyLCAweEQ0ODFEMTgwLCAweDIyNzBENjgxLAorMHgyMTcyRTIwMSwgMHgyNjIwMjQ3MCwgMHhFNEZGRDY3RiwgMHhFNjAwMjY0MSwKKzB4RTEwNEQ1N0UsIDB4NjA2MzY2NkQsIDB4NjI2RDc2MDEsIDB4MzIxMjQwMDAsCisweDA1NDU4RkY4LCAweEU1MDFEMjdBLCAweEQxN0EyMjUwLCAweEQ1N0JENDdBLAorMHhFNzAwRTYwMCwgMHgyNTcyMjQ3MCwgMHgxMTYyMjE2MiwgMHgxMTY5MTE2NiwKKzB4NEYyNjExNkEsIDB4MTE2RTAwMEIsIDB4RDE3NTdGQzQsIDB4MkYxMkQ4NzUsCisweEQ0NzZEMTc1LCAweEQ1NzdENjc2LCAweDFGODdENzc3LCAweEQ5Nzc3OEZDLAorMHgxRjFCRDI3NywgMHgxRjQxNzEwNCwgMHgxRjY0NzQwNCwgMHgxRjg4NzYwNCwKKzB4NzFGNDFGMUMsIDB4MUY0MkU4QzgsIDB4MUY2NTFGNTMsIDB4MUY5OTFGNzYsCisweDFGMUQxRjJBLCAweERENkY2ODhDLCAweERBNzBERTZGLCAweERDNzFEQjcwLAorMHgwMDA5NEEwQiwgMHgwMDA5NEIwQiwgMHgwMDA5NEMwQiwgMHg2MDEwRDE1RSwKKzB4OEIwRjg4MDEsIDB4RTk1MEQxNUQsIDB4NDkxODYyMTIsIDB4OEIwNzMyOTYsCisweDU2RkFEMTU5LCAweDIxMjBFMjAwLCAweENCMDE2MDYyLCAweDI2MDJBMDAyLAorMHgyMTIyNzIwMSwgMHg4ODAxNjBEMiwgMHhEMTYzODkwNywgMHgzMjg2NjIxMiwKKzB4RDE2Mjg5MDMsIDB4ODgwMTYwMTAsIDB4NjRFMjhCREEsIDB4NTJGNzUxRjgsCisweDU1RTEyMTQyLCAweDIyNTJEMTVFLCAweDY2MTI1NEZCLCAweDI0NjI1OUZDLAorMHgyOTcyNTcxMSwgMHg4ODAxNjBEMiwgMHg2NkUyOEI1MywgMHgzNjIwNTJFMSwKKzB4NjA2MTg5NEMsIDB4ODgwMUM5MEYsIDB4RDE1NjhCNDgsIDB4MzYyMDYyMTIsCisweEEwNDM4OTAzLCAweDI3MTAyMTYyLCAweEQ1NTMwRkEwLCAweDY2NTFFNzEwLAorMHg2MjZENzYwMSwgMHg4RjNDMzI3MywgMHg2NUYyMjU2MSwgMHg2OTUyNTFGMiwKKzB4NTRGMzU5RjEsIDB4Njc5MjUyRjQsIDB4NjE0MjY1MTIsIDB4NTZGNjY5MjIsCisweDY0MjI1MkY1LCAweENCMjA2MDYyLCAweEU2MDAyNjAyLCAweDc2MDExRjFFLAorMHg2MjZERTExMCwgMHgzMjEzNDExOCwgMHg1MUZFOEZGOCwgMHgyNjcyNTZGMSwKKzB4NTZGNDU3RjIsIDB4NTVGMzI3NTIsIDB4MjUxMjU3RjUsIDB4Mjc0MjI2OTIsCisweDUxRjk2OUUyLCAweDIxOTJENDNELCAweEU5MDE2MUYyLCAweDIxOTI0NDBCLAorMHg0OTE4NjVGMiwgMHhEOTM4MjU5MiwgMHhFMjAwRDUzOSwgMHg2MjUxMjkyMSwKKzB4NzIwMTU0RkQsIDB4NjIyRDI1MjEsIDB4MjQyMkEwMDMsIDB4RTIwMEQ5MzIsCisweEU5MDEyOTIxLCAweDJEOTJEMTJDLCAweDI2Njg2NjEyLCAweEFGNkY4QjAxLAorMHhENjMwMDAwOSwgMHgwMDA5NDYwQiwgMHhFNzAwRDEyOCwgMHgyMTcwQUY2OCwKKzB4MDAxQzAwMUMsIDB4MDAyMDBGN0MsIDB4MDAwMEIzOEUsIDB4MDAyMDMyMkMsCisweDAwMjAxNDVFLCAweDAwMjAzMjM4LCAweDAwMjAzMjUwLCAweDAwMjAxNDFDLAorMHgwMDIwMTUxQywgMHgwMDIwMEZBMCwgMHgwMDFDMzUxMCwgMHgwMDFDMzY0OCwKKzB4MDAxRTIxMkMsIDB4MDAyMDMxODgsIDB4MDAyMDJEMjQsIDB4MDAyMDMxOTAsCisweDAwMjAzMTlDLCAweDAwMjAzMUE4LCAweDAwMjAzMUI4LCAweDAwMjAzMUJDLAorMHgwMDIwMzFCMCwgMHgwMDExNzcwOCwgMHgwMDIwMzFCMSwgMHgwMDIwMzFCNCwKKzB4MDAxQzNEMzAsIDB4MDAxMTc3MTgsIDB4MDAxMTc3MzQsIDB4MDAxQzNCOUMsCisweDAwMUMzNzA0LCAweDAwMUMzRDk4LCAweDAwMUMzNTAwLCAweDAwMUMzRDAwLAorMHgwMDFDMzZGOCwgMHgwMDFDMTAyOCwgMHgwMDIwMkQ5OCwgMHgwMDIwMTMyOCwKKzB4MDAyMDJDMDQsIDB4MDAyMDFFMTgsIDB4MDAyMDM0QkMsIDB4MDAyMDMxQkEsCisweDAwMjAyRDkwLCAweDAwMjAzMUNDLCAweDAwMjAzMUQwLCAweDAwMjAxMjc2LAorMHgwMDIwMzFEMiwgMHgwMDIwMUZEMCwgMHgyRkI2MkY5NiwgMHgyRkQ2MkZDNiwKKzB4NEYyMjJGRTYsIDB4REU5NDdGOEMsIDB4NjFFMEUwMjQsIDB4MEYxNEQ0OTMsCisweDcxMDE2MUUzLCAweEQ3OTI2MjEwLCAweDQ3MEJFMDI4LCAweEQ1OTEwRjI0LAorMHgwMDA5NDUwQiwgMHg2RDAzMjAwOCwgMHgxRjBCOEYxMSwgMHhENDhGREM4RSwKKzB4REQ4RjY3QzAsIDB4NjU3QzREMEIsIDB4REQ4RkQxOEUsIDB4NkI5QzY5MTAsCisweDQyMDg2MkIzLCAweDMyQjg0MjA4LCAweDNEMkM0MjA4LCAweEUwMjgxRkRCLAorMHhFNTgwMDRGQywgMHg2MDRDNjZFMiwgMHgzMDUwNjU1QywgMHgyRDYyOEYxMywKKzB4MDFGQ0UwMjQsIDB4NjQxQ0U1MDAsIDB4NjI1RERFODQsIDB4OEIwMTMyNDMsCisweDAwMDlBMzNELCAweDY3NTM2NTVELCAweDYwNzAzN0VDLCAweDM5REM2OTUzLAorMHhBRkYyNzUwMSwgMHgyMDA4ODA5NCwgMHhFMDI0OEIxMywgMHhFNTAwMDFGQywKKzB4QTAwOURFN0EsIDB4NjU1RDY0MUMsIDB4MzJFQzYyNTMsIDB4NkM1MzZCMjIsCisweDNDREM2N0IyLCAweDc1MDQxQzcxLCAweDMyNDM2MjVELCAweEEzMUU4QkYzLAorMHg4ODAxMkQxMCwgMHhFMDI0OEIxNiwgMHhFNDAwMDFGQywgMHg2NzFDMkQ0MCwKKzB4NjI0RERFNkUsIDB4OEIwMTMyNzMsIDB4MDAwOUEzMTEsIDB4NkNFMzY0NEQsCisweDdDMDQ2OTQzLCAweDM5RUM2QjQzLCAweDY1OTIzQkNDLCAweDc0MDg2REIyLAorMHgyNUQyQUZFRiwgMHg4QjE5ODgwNCwgMHgwMUZDRTAyNCwgMHgyRDcwRTcwMCwKKzB4MUZEODZEMUMsIDB4NjI3RERFNjEsIDB4OEIwMTMyRDMsIDB4MDAwOUEyRjcsCisweDZCNzM2NzdELCAweDNCRUM2MUUzLCAweDcxMDQ2NEIyLCAweDNDMUM2QzczLAorMHg2OTQyNjVDMiwgMHgyOTU5NzcwOCwgMHgyNDkyQUZFRCwgMHg4QjE4ODgwNSwKKzB4MDFGQ0UwMjQsIDB4MkQ0MEU0MDAsIDB4REU1NDY3MUMsIDB4MzI3MzYyNEQsCisweEEyREM4QjAxLCAweDY0NEQwMDA5LCAweDZCRTM2RDQzLCAweDY1RDIzREVDLAorMHg2MTQzN0IwNCwgMHg2QzEyMzFCQywgMHg3NDA4Njk1MiwgMHhBRkVEMjlDQiwKKzB4ODgzMTI1OTIsIDB4REU0QThCMjAsIDB4NjVFNkRCNEEsIDB4NjFFNkRDNEEsCisweDY3RTJEOTRBLCAweDYyRTI3RTA0LCAweDFGRUM3RUU4LCAweDdFMDQ2NEUyLAorMHg2RUUyMUZFRCwgMHg1QkZEMkJFMCwgMHg2MEIyN0IwNCwgMHhDOTAxMUZCRSwKKzB4NkJCMjJDMDAsIDB4MjlCMDRCMDksIDB4REM0MTJGMjYsIDB4NjYxMzRDMEIsCisweEUyMDA3RjA0LCAweDJEMjBBMkFCLCAweDhCMjE4ODMwLCAweEQ5MzlERTM4LAorMHhFMDY0NjVFNiwgMHg3MjA0NjJFMywgMHg2NzI2NjZFMiwgMHg2RTIzREMzNiwKKzB4NjIyMjdFRTgsIDB4NkJFMjYxRTYsIDB4MjlCMDFGRUYsIDB4N0UwNDBGMTYsCisweEM5MDE2MEUyLCAweDZFRTIyQzAwLCAweDRFMDlEQzMwLCAweDJGMjYyQ0UwLAorMHhEMTMwRTA2OCwgMHgwNEZFNDEwQiwgMHhFMjAwN0YwNCwgMHgyRDIwQTI4NywKKzB4OEIwNTg4MzMsIDB4NEUwQkRFMkMsIDB4RTEwMDAwMDksIDB4MkQxMEEyN0YsCisweDg5MDE4ODI4LCAweDAwMDlBMTA2LCAweEUxNDNERTIwLCAweEUwNDA2MkUxLAorMHgzMjE3NjIyRCwgMHgwRkU2OEYwNCwgMHg2MDIzRTI0MCwgMHgyNjIxMDZGRSwKKzB4OEIwMTMyMTcsIDB4MDAwOUEwRUYsIDB4MDJGRUUwNDAsIDB4ODUyMUU0MDEsCisweDhCMDEzMDQ2LCAweDAwMDlBMEU3LCAweEU1MDFFMDQwLCAweDJENTAwN0ZFLAorMHg2NDcxQjI2NSwgMHgwOUZFRTA0MCwgMHg2MjkxRTE0MywgMHg2NTJERTA2OCwKKzB4OEQ2QjM1MTcsIDB4RTY0MDBGNTYsIDB4OEIyNzM1NjMsIDB4RTA0OEU2MDAsCisweEUxMUEwRjY1LCAweDcyQzBBMDMxLCAweDAwMTE3ODAwLCAweDAwMjAzMjU0LAorMHgwMDIwMTQ1RSwgMHgwMDIwMjU4OCwgMHgwMDIwMzFBMiwgMHgwMDIwMzI1OCwKKzB4MDAyMDE0QUEsIDB4MDAyMDMxQTEsIDB4MDAyMDJEQzgsIDB4MDAxMTc4MDQsCisweDAwMTE3ODEwLCAweDAwMjAzMTlELCAweDAwMjAzMTlFLCAweDAwMjAzMTlGLAorMHgwMDIwMEMyQywgMHgwMDIwMEM4MCwgMHgwMDIwMEM3QywgMHg0MTIxNjE1MywKKzB4NDEyMTQxMjEsIDB4NDEyMTQxMjEsIDB4NDUyMTQ1MjEsIDB4NjA1MzQ1MjEsCisweDY2MDNDOTAzLCAweDBGNjVFMDQ4LCAweEUwMDc3MTE4LCAweEUwNDQyMjA5LAorMHg2NDFEMEYyNSwgMHg2NUYzRTA0QywgMHgwRjQ2QjI4QywgMHgwNEZERTA0OCwKKzB4MEJGREUwNDQsIDB4NjFCRDY3NEQsIDB4NDEwODQ3MDgsIDB4MEYxNkUwNTAsCisweEQyOUI2MDczLCAweDQyMEIwOUZFLCAweDZDMDdFMDBGLCAweDYwNzMyOUM5LAorMHhFMDQwMEY5NiwgMHg2NUYzMEVGRSwgMHg2RDBEODVFMiwgMHgwMUZFRTA1MCwKKzB4NjBEMzQyMEIsIDB4NjA3MzI5MEIsIDB4RTA0QzBGOTYsIDB4MDRGRUIyNTEsCisweDA2RkVFMDQwLCAweDYyNjFFMDY4LCAweDBGNTY2NTJELCAweDM1NjNFNjQwLAorMHhFMDAwODk0RSwgMHg2MDIzODFGOCwgMHg0MDA4QzkwMywgMHg2QjAzNDAwMCwKKzB4RTA1NDYxMDMsIDB4RTA1ODBGQjYsIDB4RUNGRkREODUsIDB4NkNDQzBGRjYsCisweDBGRDZFMDZDLCAweDREMEI2MEMzLCAweDQyMjE2MjUzLCAweDQyMjE0MjIxLAorMHg2NDIzNDIyMSwgMHgzMjRDNDIwMCwgMHhFMDVDNkUwNywgMHg0NTIxNDIwMCwKKzB4RTA0MDBGRTYsIDB4MEJGRTQ1MjEsIDB4QzkwMzYwNTMsIDB4MzBGQzQwMDgsCisweDZEMDM3QjA2LCAweDg1RjgxRjA1LCAweDZDMkQxRkI3LCAweDFGQzY2RTAzLAorMHgwRkM2RTA2MCwgMHgwNUZFRTA1OCwgMHg2NEMzQjIyQywgMHgzM0ZDRTM1NCwKKzB4NTYzMjYyRDIsIDB4MjI2OTYxMzIsIDB4NjdCNDJEMjIsIDB4NDkwQjU5MzYsCisweDIyMEI2MDdDLCAweDA1RkVFMDU4LCAweDY0QzMyRDIyLCAweDdFMDFCMjAxLAorMHhFNzA2NjJFRCwgMHg4RkUzMzI3MywgMHhFMDQwN0MwMSwgMHg2MjYxMDZGRSwKKzB4MDZGRUUwNDAsIDB4ODU2MTQyMDAsIDB4MzAyQzc2MEMsIDB4NjEwMzcwMUIsCisweDY0RjNFNTAwLCAweDc1MDFFNzA0LCAweDZCNUQ2OTY2LCAweDI0OTIzQjczLAorMHg3NDA0OEZGOSwgMHhCMUU0NjVGMywgMHhFMDQwNjQxRCwgMHhCMUEzMDZGRSwKKzB4QTE3QzY0NjEsIDB4RDQ1NzAwMDksIDB4RTIwMUQ3NTcsIDB4MkQyMDQ3MEIsCisweDAwMDlBMTc1LCAweDhCMDc4ODI5LCAweEVDMDBERTU0LCAweDYxRTIyREMwLAorMHg2NDFEQjE3NSwgMHgwMDA5QTE2QiwgMHg2MjJDRTI4MSwgMHg4QjAxMzAyMCwKKzB4MDAwOUEwQjYsIDB4MDZGQ0UwMjgsIDB4RTY4MjYyNkMsIDB4MzI2MDY2NkMsCisweDU2RkI4QjIwLCAweDI2MTBFMTI0LCAweDUyMTdEMTQ5LCAweDUyMTgxNjIxLAorMHg1MjE5MTYyMiwgMHg1MjFBMTYyMywgMHg1NTFCMTYyNCwgMHgxNjU1RTIwMCwKKzB4MTY1NjU1MUMsIDB4MTY1NzU1MUQsIDB4MTY1ODU1MUUsIDB4MTY1OTU1MUYsCisweDExMjgxMTI3LCAweDExMkExMTI5LCAweDExMkMxMTJCLCAweDExMkUxMTJELAorMHgxMTJGQTEzRCwgMHg2NjZDRTY4MywgMHg4QjBCMzI2MCwgMHhENjM3NTJGQiwKKzB4MjI1MEU1MDAsIDB4RDIzNzY1NjIsIDB4MjI1Mjc2MDQsIDB4RDYzNjYyNjIsCisweDI2MjBBMTJELCAweDY2NkNFNjkwLCAweDhCMDMzMjYwLCAweDAwMDlCMUM3LAorMHgwMDA5QTAxMSwgMHg2NjZDRTY5MSwgMHg4QjEwMzI2MCwgMHg2MjUyRDUyQiwKKzB4MjIyODYyMkMsIDB4RDIyRDg5MDQsIDB4MDAwOTQyMEIsIDB4MDAwOUEwMDMsCisweDQyMEJEMjJCLCAweDU2RkIwMDA5LCAweEExMTBFMjAwLCAweEU2QjAyNjIwLAorMHgzMjYwNjY2QywgMHhFMDI0OEIzNCwgMHhFMDcwMDJGQywgMHgwRjE2NjEyQywKKzB4RUIwNEVDMDAsIDB4MDFGRUUwNzAsIDB4MzIxMzYyQ0QsIDB4QTBGRThCMDEsCisweEQyMUEwMDA5LCAweDZEQzM2Q0NELCAweDcyMDQzRDJDLCAweDMxMkM2MUMzLAorMHg2RDEyNkVEMiwgMHhEMTE0RDQxQiwgMHgwMDA5NDEwQiwgMHg0MTBCRDExQSwKKzB4RDQxQTY0RTMsIDB4NDIwQkQyMTAsIDB4RDIxNzAwMDksIDB4NjREMzQyMEIsCisweEQ2MERENDE3LCAweDAwMDk0NjBCLCAweDYxRTNFNjAwLCAweDMxNkM2NjZELAorMHg2MjZENzYwMSwgMHgyMUQwMzJCMywgMHg0RDE5OEZGNywgMHg3QzA4QUZEMiwKKzB4RDIxMUQ0MTAsIDB4RDQxMTY1NDIsIDB4MDAwOTQyMEIsIDB4MDAwOUEwQ0YsCisweDAwMjAyQzgwLCAweDAwMjAzMjc4LCAweDAwMjAxNDVFLCAweDAwMTE3ODA0LAorMHgwMDIwMkQyQywgMHgwMDIwMzE4OCwgMHgwMDIwMzE5QywgMHgwMDIwMENCQSwKKzB4MDAyMDBDRTAsIDB4MDAyMDMyOTAsIDB4MDAyMDE0QTIsIDB4MDAyMDMyQTQsCisweDAwMjAzMkFDLCAweDAwMTE3ODAwLCAweDAwMjAxNEFBLCAweDAwMjAzMkIwLAorMHhENUI1RDFCNCwgMHg2MjUyRTA0MCwgMHg3NTA0NjYxMiwgMHgyMTYyMzYyQywKKzB4NTYxMTYyNTYsIDB4MTE2MTM2MkMsIDB4NjI1MjY2NTMsIDB4NzYwODU1MTIsCisweDExNTIzNTJDLCAweDU1MTM2MjYyLCAweDM1MkM3NkVDLCAweDY1NjMxMTUzLAorMHg1NjE0NjI2MiwgMHgzNjJDNzUxMCwgMHg2NjUzMTE2NCwgMHg1NTE1NjI1MiwKKzB4MzUyQzc2MTAsIDB4NjI2MjExNTUsIDB4MzYyQzU2MTYsIDB4RDZBMzExNjYsCisweDU1MTc2MjYyLCAweDM1MkM3NjA0LCAweDYyNjYxMTU3LCAweDM1MkM1NTE4LAorMHg2NTYzMTE1OCwgMHg1NjE5NjI2MiwgMHgzNjJDNzUwNCwgMHg2MjU2MTE2OSwKKzB4MzYyQzU2MUEsIDB4NjI1NjExNkEsIDB4MzYyQzU2MUIsIDB4NjY1MzExNkIsCisweDU1MUM2MjUyLCAweDM1MkM3NjA0LCAweDYyNjYxMTVDLCAweDM1MkM1NTFELAorMHg2MjYzMTE1RCwgMHg1NTFFNjY2MiwgMHgzNTZDNzIwNCwgMHg2NjIyMTE1RSwKKzB4RDU4RjUyMUYsIDB4MTEyRjMyNkMsIDB4MDYxRTYyNTIsIDB4MzYyQzc1OTQsCisweEUwNDQwMTY2LCAweDYyNTI2NjUzLCAweDc2NDQwNTFFLCAweDAxNTYzNTJDLAorMHg2MjYyRTA0OCwgMHgzNjJDMDYxRSwgMHhENjg2MDE2NiwgMHg2MjYyRTA1NCwKKzB4NDIyOTA1MUUsIDB4MDE1NjM1MkMsIDB4NjI2Mjc2MDQsIDB4MDYxRUUwNTgsCisweDM2MkM0MjI5LCAweDU2RkIwMTY2LCAweDI2MjBFMjM4LCAweDAyMUVFMDQ0LAorMHgxNjIxRTA0OCwgMHgxNjIyNjIxMiwgMHgxNjIzNTIxMSwgMHhFMjAwNTUxMiwKKzB4NTUxNTE2NTQsIDB4NTUxMzE2NTUsIDB4NTUxNjE2NTYsIDB4MDUxRTE2NTcsCisweDE2NThFMDQwLCAweEUwNTAwNTFFLCAweDU1MTQxNjU5LCAweDA1MUUxNjVBLAorMHgxNjVCRTA0QywgMHhFMDU0MDUxRSwgMHgwNTFFMTY1QywgMHgxNjVERTA1OCwKKzB4RTA0NDA1MUUsIDB4MDEyNjE2NUUsIDB4MjEyMkUwNDgsIDB4MTEyMjExMjEsCisweDExMjMxMTI1LCAweDAxMjYxMTI2LCAweDAxMjZFMDQwLCAweDExMjRFMDUwLAorMHhFMDRDMDEyNiwgMHhFMDU0MDEyNiwgMHhFMDU4MDEyNiwgMHg3Rjc0MDEyNiwKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4MDAwQjZCRjYsIDB4NEYyMjY5RjYsCisweEUyNDA2MTRELCAweDg5MTQzMTIzLCAweDMxMjdFMjFGLCAweDhCMDlENzVBLAorMHhENDVBNjE0RCwgMHhFMDAxNzFFMCwgMHg1NjcxNDQwQiwgMHgyNjU5NjUwNywKKzB4MTc2MUEwMDcsIDB4RTAwMUQ0NTUsIDB4NjY3MjQ0MEIsIDB4MjY1OTY1MDcsCisweDRGMjYyNzYyLCAweDAwMDkwMDBCLCAweDYxNEQ0RjIyLCAweDMxMjNFMjQwLAorMHhFMjFGODkxMiwgMHhENzRDMzEyNywgMHg2MTREOEIwOCwgMHg1NjcxRDI0QiwKKzB4NDIwQjcxRTAsIDB4MjYwQkUwMDEsIDB4MTc2MUEwMDYsIDB4NjY3MkQyNDcsCisweEUwMDE0MjBCLCAweDI3NjIyNjBCLCAweDAwMEI0RjI2LCAweEU2NDAwMDA5LAorMHg0NjI4NDYxOCwgMHg2MjUyRDU0MiwgMHg4OUZDMjI2OCwgMHgwMDA5MDAwQiwKKzB4NDYxOEU2ODAsIDB4RDUzRTQ2MjgsIDB4MjI2ODYyNTIsIDB4MDAwQjg5RkMsCisweEEwMDEwMDA5LCAweDcyMDFFMjAwLCAweDhCRkMzMjQyLCAweDAwMDkwMDBCLAorMHg0NjE4RTY4MCwgMHhENTM3NDYyOCwgMHgyMjY4NjI1MiwgMHgwMDBCOEJGQywKKzB4MkZFNjAwMDksIDB4N0ZGQzRGMjIsIDB4QkZGMTZFNTMsIDB4NjFFMjJGNDIsCisweEUyODBENjMxLCAweDU0RTExNjE1LCAweDE2NDY0MjE4LCAweDQyMjg1NUUyLAorMHg1N0UzMTY1NywgMHgxNjc4NkVGMiwgMHgyNkUyMkUyQiwgMHg0RjI2N0YwNCwKKzB4NkVGNkFGQ0UsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4NkM1M0REMjYsCisweDZFNDNCRkQ2LCAweDJERTJCRkJCLCAweDAwMDlCRkQyLCAweDJDMTI1MUQ1LAorMHgxQzQxNTRENiwgMHgxQzUyNTVENywgMHgxQzYzNTZEOCwgMHg2RUY2NEYyNiwKKzB4MDAwQjZERjYsIDB4NjE2MzZDRjYsIDB4QTAwNEU2MDAsIDB4NjI1NjQxMDksCisweDI0MjI3NjAxLCAweDM2MTI3NDA0LCAweDAwMEI4QkY5LCAweDRGMjIwMDA5LAorMHhEMTE3RDQxNiwgMHgwMDA5NDEwQiwgMHhENDE3RDIxNiwgMHhFNTA1NjAyMiwKKzB4MjIwMkNCMjAsIDB4RDUxNTI0NTIsIDB4NDUwQkU3MDAsIDB4RDcxNDI0NzIsCisweDAwMDk0NzBCLCAweEU2MDFEMTEzLCAweDIxNjJEMjEzLCAweDRGMjY0NjE4LAorMHgyMjYyMDAwQiwgMHgwMDIwMkQyQywgMHgwMDFDMzZBMCwgMHgwMDFDM0NBMCwKKzB4MDAxQzM2RjQsIDB4MDAxQzNCODgsIDB4MDAxQzM3MDQsIDB4MDAyMDJDODAsCisweDAwMUMzNzNDLCAweDAwMUMzNzAwLCAweDAwMUMzNzBDLCAweDAwMjAzMkM0LAorMHgwMDIwMTQ1RSwgMHgwMDFDMzUwMCwgMHgwMDFENDAwNCwgMHgwMDIwMTRENCwKKzB4MDAyMDBGQTAsIDB4MDAxRTIxMkMsIDB4MDAxQzNEMzAsIDB4MDAwOUExQTksCisweDJGRTYyRkQ2LCAweEREOEY0RjIyLCAweEEwMDQ5RUE3LCAweEQ0OEUwMDA5LAorMHg0MjBCRDI4RSwgMHg2MkQyNjVEMiwgMHg4QkY4MjJFOCwgMHgwMDA5QTAwNCwKKzB4RDI4QUQ0OEIsIDB4NTVEMTQyMEIsIDB4MjJFODUyRDEsIDB4QTAwNDhCRjgsCisweEQ0ODgwMDA5LCAweDQyMEJEMjg1LCAweDUyRDI1NUQyLCAweDhCRjgyMkU4LAorMHgwMDA5QTAwNCwgMHhEMjgxRDQ4NCwgMHg1NUQzNDIwQiwgMHgyMkU4NTJEMywKKzB4QTAwNDhCRjgsIDB4RDQ4MTAwMDksIDB4NDIwQkQyN0MsIDB4NTJENDU1RDQsCisweDhCRjgyMkU4LCAweDZFRjY0RjI2LCAweDZERjYwMDBCLCAweDJGRDYyRkM2LAorMHg0RjIyMkZFNiwgMHg2RTYzNkQ3MywgMHg2QzUzQjAxOCwgMHg2NEMzNTdGNCwKKzB4QjA1NDY1RTMsIDB4QjA2QTY2RDMsIDB4QjA5QTAwMDksIDB4QjA5RTAwMDksCisweEIwQTIwMDA5LCAweEIwQkUwMDA5LCAweEIwQzEwMDA5LCAweEIxMjQwMDA5LAorMHg0RjI2MDAwOSwgMHg2REY2NkVGNiwgMHg2Q0Y2QTAyMywgMHgzNDEyRDE2QywKKzB4RDY2QzA1MjksIDB4MjY1MEQ3NkMsIDB4Mjc0MjAwMEIsIDB4MDAwOUEwMTQsCisweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweDZFNjM2RDczLCAweDZDNTNCRkVFLAorMHg2NEMzNTdGNCwgMHhCMDJBNjVFMywgMHhCMTA2NjZEMywgMHg0RjI2MDAwOSwKKzB4NkRGNjZFRjYsIDB4NkNGNkEwMDUsIDB4RTYwM0QyNjAsIDB4MDAwQjQ2MTgsCisweEQyNUUyMjYyLCAweDAwMEJFNjAwLCAweDRGMjIyMjYyLCAweEU0MEFCRjdFLAorMHgwMDA5QkY3RSwgMHhFMTA0RDI1QSwgMHhFNTAwNDExOCwgMHgyMjEyRTQwQSwKKzB4MjI1MkJGNzQsIDB4NjA3MkQ3NTcsIDB4NEYyNkNCMjAsIDB4MjcwMjAwMEIsCisweEQxNTU0RjIyLCAweEU0MDA0MTBCLCAweDQ1MkJENTU0LCAweDJGRTY0RjI2LAorMHg2RTYzRDE1MywgMHg0NDE4NjYxMiwgMHg0NTI4OTIxMCwgMHgyNjI5NDQwOCwKKzB4NDQwODQ1MDAsIDB4NDQwMDI2NUIsIDB4NDcwODI2NEIsIDB4NDcwODIxNjIsCisweDI3RUJEMTRDLCAweDAwMEIyMTcyLCAweDAzRjA2RUY2LCAweDJGRTYxRkZGLAorMHhERTQ5NEYyMiwgMHhFNDBBRTEwMSwgMHgyRTEyQkY0OCwgMHg3MjZDNjJFMywKKzB4RTQwMUUxMDAsIDB4MjIxMjIyMTIsIDB4MjIxMjIyMTIsIDB4MjIxMjIyMTIsCisweEU3MzAyMjQyLCAweEU0MEFFNTAzLCAweDIyMTIyMjEyLCAweDIyMTIyMjEyLAorMHgyMjEyMjIxMiwgMHgyMjEyMjIxMiwgMHgyMjEyMjIxMiwgMHgyMjEyMjIxMiwKKzB4MjI1MjIyNzIsIDB4MjIxMjIyMTIsIDB4MjIxMjIyMTIsIDB4MjIxMjIyMTIsCisweDIyMTIyMjEyLCAweDEyMUFCRjIyLCAweDJFNjJFNjAwLCAweDAwMEI0RjI2LAorMHhEMjMyNkVGNiwgMHhFNDQxRTEwMSwgMHgwMDBCMjIxMiwgMHhEMTMwMjI0MiwKKzB4RTYwNUQ0MzAsIDB4MDAwQjIxNjIsIDB4RDUyRjI0NjIsIDB4NjA1MEQyMkYsCisweDhCMEU4ODAxLCAweDYwNDBENDJFLCAweDhCMDc4ODAxLCAweDk2MjZENTJELAorMHg4ODAxNjA1MCwgMHg5NjIzOEIwQywgMHgwMDA5QTAwQSwgMHhBMDA3OTYyMSwKKzB4RTYwMDAwMDksIDB4MjI2MkQ0MjYsIDB4ODgwMTYwNDAsIDB4RTYwNDhCMDAsCisweEFFRjNFNDBBLCAweEQyMjQyMjYyLCAweEU0MEFFNjAxLCAweDIyNjJBRUVFLAorMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHhEQzIwNEYyMiwgMHg2MEMyRUQwMCwKKzB4Q0IwMUVCNjQsIDB4NjBDMjJDMDIsIDB4QTA0MUM5MDEsIDB4MDNDNDZFMDMsCisweDAzNDAwM0Q0LCAweDAwMUMzQjg4LCAweDAwMjAzMkM4LCAweDAwMjAxNEFBLAorMHgwMDIwMzJEMCwgMHgwMDIwMzJEOCwgMHgwMDIwMzJFMCwgMHgwMDIwMzJFOCwKKzB4MDAyNUU3MjAsIDB4MDAyMDM0QjgsIDB4MDAyMDMxOEMsIDB4MDAxQzU5NjgsCisweDAwMUQ0MDA0LCAweDAwMUMzNTAwLCAweDAwMjAxMjRBLCAweDAwMjAxMjc2LAorMHgwMDFDNTgxNCwgMHgwMDFDNTlEMCwgMHgwMDFDNTgzMCwgMHgwMDFDNjI2OCwKKzB4MDAxQzU5QTQsIDB4MDAxQzYzOUMsIDB4MDAyMDMxOUUsIDB4MDAxQzU4MDQsCisweDAwMjAzMTlELCAweDAwMjAzMTlGLCAweDAwMUM1ODFDLCAweDAwMUM1ODYwLAorMHg4OTA3M0RCMiwgMHhFNDBBNjBDMiwgMHhCRTlGQzkwMSwgMHg3RDAxNkUwMywKKzB4OEJGNTJFRTgsIDB4OEIwMzNEQjIsIDB4RDIzRUQ0M0QsIDB4MDAwOTQyMEIsCisweDRGMjZFNDBBLCAweDZERjY2RUY2LCAweEFFOEY2Q0Y2LCAweDQ0MTE2QkY2LAorMHg2MDRCOEYwMSwgMHgwMDBCNjA0MywgMHgyRkI2MDAwOSwgMHgyRkQ2MkZDNiwKKzB4NEYyMjJGRTYsIDB4REMzNDdGRkMsIDB4NjBDMkVEMDAsIDB4Q0IwMkVCNjQsCisweDYwQzIyQzAyLCAweEM5MDIyRjAyLCAweDZFMDNBMDA5LCAweDg5MDgzREIzLAorMHhFNDBBNjBDMiwgMHhDOTAyMkYwMiwgMHg2RTAzQkU3MCwgMHgyRUU4N0QwMSwKKzB4M0RCMzhCRjQsIDB4RDQyOThCMDgsIDB4N0YwNEQyMjYsIDB4NkVGNjRGMjYsCisweDZDRjY2REY2LCAweDZCRjY0MjJCLCAweDRGMjY3RjA0LCAweDZERjY2RUY2LAorMHgwMDBCNkNGNiwgMHhENTIyNkJGNiwgMHg2MDUyNTY1MSwgMHgwMDBCNDYyOCwKKzB4MkZCNjMwNkMsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4NEYwMjRGMTIsCisweDZFNDNCRkYxLCAweERDMUI2QjAzLCAweEJGRUNERDFCLCAweDMwQjgwMDA5LAorMHgwNjBBM0MwNSwgMHg0NjA5NDYwOSwgMHgzRDY1NDYwMSwgMHg0MjA5MDIwQSwKKzB4NDIwOTQyMDksIDB4OEJGMDMyRTIsIDB4NEYxNjRGMDYsIDB4NkVGNjRGMjYsCisweDZDRjY2REY2LCAweDZCRjYwMDBCLCAweDRGMjIyRkU2LCAweEUxMDJERTBGLAorMHhFNDAzRTUwMCwgMHhCRkQ0MkUxMiwgMHhFNjA2MkU1MiwgMHhFNzAwNDYxOCwKKzB4MkU2MkU0MDMsIDB4NEYyNjJFNzIsIDB4NkVGNkFGQ0IsIDB4MDAwOTAwMEIsCisweDAwMjAzMkYwLCAweDAwMjAxNDVFLCAweDAwMUM1ODYwLCAweDAwMjAzMzA4LAorMHgwMDFDMTA0MCwgMHhDQ0NDQ0NDRCwgMHgxMDYyNEREMywgMHgwMDFENDAwNCwKKzB4MkY5NjJGODYsIDB4MkZCNjJGQTYsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweEU1MDA3RkQ4LCAweDY0NTNFMTEwLCAweDZDNTM0MTI4LCAweDY1NURFRTBBLAorMHg0NjA4NjY1MywgMHg0NjA4MzY1QywgMHgzNjFDNzUwMSwgMHg2NzVENjA0MywKKzB4NjBDMzBGNjYsIDB4MzdFM0VEMDAsIDB4ODE2MTI2QzEsIDB4ODE2MzgxNjIsCisweDE2RDMxNkQyLCAweDhGRUExNkQ0LCAweDY4RjI3NDA0LCAweERBQjNEOUIyLAorMHgyOTgyMTk4MSwgMHhEMUIyNTlGMSwgMHgyQTkyMUE5MSwgMHg1QkYzNUFGMiwKKzB4NUVGNTVERjQsIDB4MTFBMTU0RjYsIDB4MTFCMzIxQTIsIDB4MTFENTExQjIsCisweDExRTcxMUQ0LCAweDExNDkxMUU2LCAweDU1RjcxMTQ4LCAweEVFMDBEQkE5LAorMHhEREE5NTdGOCwgMHhENkE5NTJGOSwgMHgxQjUxNjRFMywgMHhEQkE4MkI1MiwKKzB4RUFCOEQ4QTgsIDB4MkQ3MkU5NDUsIDB4NkFBQzI2MjIsIDB4NkVFRDQ5MDgsCisweDREMDg2REUzLCAweDNERUM2MUUzLCAweDREMDg0MTA4LCAweDNEQkMzMUVDLAorMHg0MTA4NjBDMywgMHg4MUQxMkRDMSwgMHg0MTA4RTA1MCwgMHg0MTA4NDAwOCwKKzB4NjBDMzgxRDIsIDB4RTUwMDMxOEMsIDB4ODFEMzM0QTIsIDB4MUQxMzFERDIsCisweDhEMDFENDk0LCAweEQ0OTExRDU0LCAweEIwODE2NUQzLCAweDY0RUQ3RTAxLAorMHg4QkRDMzQ5MiwgMHhEQjk0RDE4RCwgMHhEMjhCNjgxMiwgMHgxQjgxNDgyOSwKKzB4MkZEMjY0MTIsIDB4MkI5MjY5NEQsIDB4RDk4QTY3MjIsIDB4MUI3MzQ3MjksCisweEQ3ODc2ODIyLCAweDFCQTI2QThELCAweEQyOEM2QjcyLCAweDIyQjJENTg2LAorMHhFMDAzNUQ3MiwgMHg1RTc0MTJEMiwgMHgxMkU0NDAxOCwgMHhENjg4NTE3NiwKKzB4NTQ3ODEyMTYsIDB4MTI0OEUxRkYsIDB4RDQ4NTY3OTIsIDB4Njg1MjEyN0EsCisweDI4QzFFNzAzLCAweDgxOTE2OTUyLCAweDZBNTJFMDUwLCAweDgxQTI0MDA4LAorMHg2MEMzNkI1MiwgMHg2RDUyODFCMywgMHg2RTUyMUREMiwgMHg2MjUyMUU2MywKKzB4MTI2NEU2MDAsIDB4NDYwODY1NjMsIDB4NzUwMTM2NEMsIDB4NjY1RDI2MTIsCisweDhCRjgzNjczLCAweEUwMDNENDcxLCAweDQwMTg2NTQyLCAweDY3NDIyNUMxLAorMHg4MTcxRDI3NCwgMHhFRTAwNjg0MiwgMHg2OTQyMTg4MiwgMHgxOTIzRTAyNCwKKzB4RTU4MDZBNDIsIDB4NkI0MjFBRTQsIDB4ODFCMjY2RTMsIDB4RDQ2RDZDNDIsCisweDY1NUM4MUMzLCAweDZENjM2NjZELCAweDYxNkQ3NjA0LCAweDMxNTMzRDRDLAorMHgyREUyOEZGOCwgMHhENTY5RDI2OCwgMHg3NDA0MjQyMiwgMHg3RjI4MjQ1MiwKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsCisweDY2NDI2OEY2LCAweEM4MDM2MDYxLCAweEU1MDA4RDA0LCAweEM5MDM2MDYxLAorMHg4QjAzODgwMiwgMHg2NTYzNTI2MiwgMHgyNDEyNTEyNCwgMHg2MDUzMDAwQiwKKzB4MkZFNjJGRDYsIDB4N0ZFQzRGMjIsIDB4NjI1MzZFNTMsIDB4NkQ0M0U1NTAsCisweDQ1MDhFNDAwLCAweEUxMDFBMDAxLCAweDYwNDM1MjI0LCAweDgxMjEyMjExLAorMHg2MDUzODEyMywgMHg1NkUyODEyMiwgMHg4QkY1MzYyMCwgMHgxNkU0RDI1MCwKKzB4RTYxNDY0RjMsIDB4NjVFMzQyMEIsIDB4RTRGQzY1RTEsIDB4MkU1MTI1NDksCisweDY1RjM2MUYxLCAweDJGMTEyMTQ5LCAweEQxNDk1NEQxLCAweEU2MTQ0MTBCLAorMHg2MDcxNTdEMSwgMHgyNzAxQ0IwMSwgMHg3RjE0MURFMSwgMHg2RUY2NEYyNiwKKzB4NkRGNjAwMEIsIDB4MkZFNjJGRDYsIDB4N0ZFQzRGMjIsIDB4NjY1MzZFNTMsCisweDZENDNFNUZDLCAweDIwNTk2MDYxLCAweDI2MDFDQjAxLCAweDMyNjA1MkUyLAorMHgxMkU0OEIwNiwgMHgzMUUwNTFFMiwgMHg1MkQxOEIwNCwgMHgxRTIyQTAwMiwKKzB4NTY2NEFGRjAsIDB4NjRGM0QyMzYsIDB4NDIwQkU2MTQsIDB4NjdFMTY1RTMsCisweDI3MTlFMUZDLCAweDY3RjEyRTcxLCAweDI3MTk1NEQxLCAweDY1RjNEMTMwLAorMHg0MTBCRTYxNCwgMHg1MkQxMkY3MSwgMHhDQjAxNjAyMSwgMHgxREUxMjIwMSwKKzB4NEYyNjdGMTQsIDB4MDAwQjZFRjYsIDB4MkZFNjZERjYsIDB4NjI0QzRGMjIsCisweDQyMDhERTFCLCAweEEwMDU0MjAwLCAweDUyNTIzRTJDLCAweDU2MjRENDE3LAorMHgyRTYyQkY4RSwgMHg1MkUxNjVFMiwgMHg4QkY2MzUyMCwgMHgyNjIyRDYxQiwKKzB4MDAwQjRGMjYsIDB4MkZCNjZFRjYsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweERCMUNEQzEwLCAweDY2QzI1MkMxLCAweDg5NDAzNjIwLCAweEM5MDM2MDYxLAorMHg4OTNDODgwMSwgMHhERDE4REUwQiwgMHg2NEUzQkY2MywgMHg4NTAzNjUwMywKKzB4NjIwRDY2QjIsIDB4ODkyQjMyNjIsIDB4QkY5QkQ0MDMsIDB4RDQxMzAwMDksCisweDAwMDk0RDBCLCAweDAwMDlBRkU2LCAweDAwMjAyRDg4LCAweDAwMjAyRDkwLAorMHgwMDIwMkQ5OCwgMHgwMDIwMkRDMCwgMHgwMDIwMzFBNCwgMHgwMDIwMzFBQywKKzB4MDAxMDAwQzgsIDB4MDAxMDE2ODAsIDB4MDAxRTIxMDgsIDB4MDAxQzNEMDAsCisweDAwMTE3ODgwLCAweDAwMTE3NzgwLCAweDAwMDQwMDIwLCAweDAwMjZDNDAxLAorMHgwMDIwMEIyNiwgMHgwMDIwMzE4OCwgMHgwMDIwMTQ1RSwgMHgwMDIwMzMyNCwKKzB4NjRFM0JGM0UsIDB4NEQwQkQ0MDYsIDB4QUZCQjAwMDksIDB4RDIwNTAwMDksCisweDRGMjYyMjYyLCAweDZERjY2RUY2LCAweDAwMEI2Q0Y2LCAweDAwMDA2QkY2LAorMHgwMDIwMzMyOCwgMHgwMDFDM0QyOCwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwKKzB4N0ZGQzRGMjIsIDB4NjAyMkQyMkIsIDB4OEQ0MUM4MDMsIDB4REUyQTJGMDEsCisweERCMkJEQzJBLCAweEVEMDFBMDE3LCAweEM5MDM2MDUxLCAweDg5MTY4ODAxLAorMHhEMTI4RDQyNiwgMHgwMDA5NDEwQiwgMHg2MTAzNTUwMywgMHhDODIwODU1MSwKKzB4RTA1MDg5MDMsIDB4NzIwMTAyQkUsIDB4RDIyMzBCMjYsIDB4NDIwQjY0RTMsCisweEQ2MjI2NTEzLCAweDUyQzEyNkQyLCAweDM1MjA2NUMyLCAweERFMjA4QkU0LAorMHhEQjIxREQyMCwgMHg1MkQxREMyMSwgMHgzNTIwNjVEMiwgMHg2MDUxODkxOCwKKzB4ODgwMUM5MDMsIDB4RDQxQjg5MTQsIDB4NDYwQkQ2MTYsIDB4NTcwMzAwMDksCisweDhGMDQzN0UwLCAweEUyMDE2NTAzLCAweEFGRUMyQjIwLCAweEQ0MTgyQzUyLAorMHg0MjBCRDIxOCwgMHhENjExMDAwOSwgMHg0MTE4RTEwMSwgMHgyNjEyQUZFMywKKzB4QzgwNDYwRjEsIDB4RDIxNDg5MDcsIDB4NEYyNjdGMDQsIDB4NkRGNjZFRjYsCisweDQyMkI2Q0Y2LCAweDdGMDQ2QkY2LCAweDZFRjY0RjI2LCAweDZDRjY2REY2LAorMHg2QkY2MDAwQiwgMHgwMDFFMjEwMCwgMHgwMDIwMkQ5OCwgMHgwMDIwMkQ5MCwKKzB4MDAyMDJEMkMsIDB4MDAyMDExNjIsIDB4MDAyMDExRTQsIDB4MDAxQzNEMzAsCisweDAwMTE3ODgwLCAweDAwMjAyRDg4LCAweDAwMjAzMUE4LCAweDAwMjAzMUE0LAorMHgwMDIwMkRDMCwgMHgwMDIwMTE4MCwgMHgwMDIwMDMwOCwgMHhFNjAxRDIwMywKKzB4MTI2NUQ1MDMsIDB4MDAwQjIyNTIsIDB4MDAwMDEyNjYsIDB4MDAxQzEwMTAsCisweDAwMDBDMzRGLCAweDAwMDkwMDBCLCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LAorMHg2RDQzNkM1MywgMHhFRTAwQTAwNCwgMHg3RTAxNjRENCwgMHg2NDRDQkZGMiwKKzB4OEJGOTNFQzIsIDB4NkVGNjRGMjYsIDB4MDAwQjZERjYsIDB4RTUwMDZDRjYsCisweDY2NDNBMDAyLCAweDc2MDE3NTAxLCAweDIyMjg2MjYwLCAweEFGRTM4QkZBLAorMHgyRkU2MDAwOSwgMHg3NTA3NjI1MywgMHhFMTA4Njc1MywgMHg2MDQzRUUwQSwKKzB4NDQwOUM5MEYsIDB4NjUwMzMwRTIsIDB4OEQwMTQ0MDksIDB4RTYzMEU2MzcsCisweDQxMTAzNjVDLCAweDhGRjIyNzYwLCAweEUwMDA3N0ZGLCAweDAwMEI4MDI4LAorMHgwMDBCNkVGNiwgMHgwMDBCRTAwMCwgMHgyRkU2RTAwMCwgMHg3RkVDNEYyMiwKKzB4NkU0MzYyNTMsIDB4QkZEQzY1RjMsIDB4QkZEMDY0MjMsIDB4QkZDRTY0RTMsCisweEQ0MDM2NEYzLCAweDAwMDlCRkNCLCAweDRGMjY3RjE0LCAweDZFRjYwMDBCLAorMHgwMDIwMzMyQywgMHhFNEZERDI5QSwgMHhENzlBNjEyMiwgMHgyMjEyMjE0OSwKKzB4NzQwMTYwMjIsIDB4MjIwMkNCMDEsIDB4RDU5NzY2MjIsIDB4MjI2MjI2NDksCisweEM4NDA2MDcwLCAweDYwNTI4OTAyLCAweDI1MDJDQjA0LCAweEUxRjc2NDUyLAorMHgyNTQyMjQxOSwgMHhFNzAxNjA1MiwgMHgyNTAyQzlDRiwgMHhFNjAyNjA1MiwKKzB4MjUwMkNCMDMsIDB4MTU2MjQ3MTgsIDB4MTU3MzAwMEIsIDB4RDc4Q0Q1OEIsCisweEQ0OEREMjhDLCAweEU2MDBFMTAwLCAweDI3MTEyNTExLCAweEFGRDEyMjEwLAorMHg2NjRDMjQ2MSwgMHg0NjAwRDI4OSwgMHg2MDYwMzYyQywgMHgwMDBCQ0IxMCwKKzB4NjU0QzI2MDAsIDB4NDUwMEQyODUsIDB4NjY1MDM1MkMsIDB4MjYxOUUxRUYsCisweDI1NjAwMDBCLCAweEQyODI2NjRDLCAweDM2MkM0NjAwLCAweENCMTA2MDYwLAorMHgyNjAwMDAwQiwgMHhEMjdFNjU0QywgMHgzNTJDNDUwMCwgMHhFMUVGNjY1MCwKKzB4MDAwQjI2MTksIDB4NjY0QzI1NjAsIDB4NDYwMEQyNzgsIDB4NjA2MDM2MkMsCisweDAwMEJDQjA4LCAweDY1NEMyNjAwLCAweDQ1MDBEMjc0LCAweDY2NTAzNTJDLAorMHgyNjE5RTFGNywgMHgyNTYwMDAwQiwgMHhEMjcxNjY0QywgMHgzNjJDNDYwMCwKKzB4Q0IwODYwNjAsIDB4MjYwMDAwMEIsIDB4RDI2RDY1NEMsIDB4MzUyQzQ1MDAsCisweEUxRjc2NjUwLCAweDAwMEIyNjE5LCAweDYyNEMyNTYwLCAweDQyMDBENjY3LAorMHg2MDIwMzI2QywgMHg0MDIxQzkwOCwgMHg0MDIxNDAyMSwgMHg2MDBDMDAwQiwKKzB4RDY2MzYyNEMsIDB4MzI2QzQyMDAsIDB4QzkwODYwMjAsIDB4NDAyMTQwMjEsCisweDAwMEI0MDIxLCAweEQxNUY2MDBDLCAweDM0MUM2NDRDLCAweDAwMEI2MjQwLAorMHhEMTVENjAyQywgMHgzNDFDNjQ0QywgMHgwMDBCNjI0MCwgMHgyRkU2NjAyQywKKzB4NkU0MzRGMjIsIDB4RTYwQTY0NUMsIDB4ODkxNDM0NjcsIDB4MDAwOUJGRUIsCisweDYwRUM2NDBDLCAweDhCMDI4ODAxLCAweEEwMDJFMDBGLCAweDQ0MDkyNDA5LAorMHg2MjRDNDQwOSwgMHgzMjYzRTYwQSwgMHhCRkUyODkwNSwgMHg2MjBDNjQ0QywKKzB4Qzg4MDYwMjMsIDB4RTIwMDhCMDAsIDB4NEYyNjYwMjMsIDB4NkVGNjAwMEIsCisweEQ2NEE0RjIyLCAweDg4MDE2MDYyLCAweEIyNDU4QjAzLCAweEEwMDMwMDA5LAorMHhEMjQ3MDAwOSwgMHgyMjYwRTY0MCwgMHhFMjAwRDY0NiwgMHgwMDBCNEYyNiwKKzB4NEYyMjI2MjIsIDB4NjA2MkQ2NDEsIDB4OEIwMTg4MDIsIDB4MDAwOUIyOEUsCisweEUyMDBENjQwLCAweDAwMEI0RjI2LCAweEQ1M0MyNjIyLCAweEUxMDBENDNDLAorMHgyNTEyRTcwMSwgMHgyNDcwMDAwQiwgMHhFNjA0RDIzOSwgMHgyMjYwMDAwQiwKKzB4RDQzOTRGMjIsIDB4NDEwQkQxMzksIDB4RDUzOTAwMDksIDB4NjY1MEUxRkQsCisweDI2MTlEMjM4LCAweDI1NjBFNzAwLCAweDAwMEI0RjI2LCAweDRGMjIyMjcwLAorMHhEMTMyRDQzNSwgMHgwMDA5NDEwQiwgMHhFN0ZCRDUzMSwgMHgyNjc5NjY1MCwKKzB4MDAwQjRGMjYsIDB4NEYyMjI1NjAsIDB4RDEyQ0Q0MzAsIDB4MDAwOTQxMEIsCisweEU3RjdENTJCLCAweDI2Nzk2NjUwLCAweDAwMEI0RjI2LCAweEQ1MjgyNTYwLAorMHg2MjUwOTQyRCwgMHgwMDBCMjI0OSwgMHhENTI1MjUyMCwgMHg2MjUwRTRCRiwKKzB4MDAwQjIyNDksIDB4NEYyMjI1MjAsIDB4ODUyMkQyMjUsIDB4MjAwODYwMEQsCisweDg4MDE4OTExLCAweDg4MDM4OTEzLCAweDg4MDU4OTE1LCAweDg4MDY4OTQyLAorMHg4ODA4ODk0OCwgMHg4ODA5ODk0RSwgMHg4ODBBODk1NCwgMHg4ODBCODk1QSwKKzB4QTA2Nzg5NjAsIDB4QjA2OTAwMDksIDB4QTA2NDAwMDksIDB4QjA3NzYwMEMsCisweEEwNjAwMDA5LCAweEIwODA2MDBDLCAweEEwNUMwMDA5LCAweEZGN0Y2MDBDLAorMHgwMDFFMjE0OCwgMHgwMDFFMTAwMCwgMHgwMDFFMTEwOCwgMHgwMDIwMzFGQywKKzB4MDAyMDMxRkUsIDB4MDAyMDMyMUQsIDB4MDAyMDMxRTAsIDB4MDAxRTEwM0YsCisweDAwMUUxMDVGLCAweDAwMUUxMDJGLCAweDAwMUUxMDkwLCAweDAwMjAzMjA0LAorMHgwMDFFMTAwQiwgMHgwMDIwMzIwMCwgMHgwMDIwMzMzMCwgMHgwMDIwMTQ1RSwKKzB4MDAxRTEwMjgsIDB4MDAyMDMyMUMsIDB4MDAyMDMzM0MsIDB4MDAyMDMzNEMsCisweDAwMjAzMUQ0LCAweDYyNjBENjg0LCAweDhCMkIyMjI4LCAweDAwMDlCMDYxLAorMHg2MDBDQTAyOSwgMHg2MjYwRDY4MCwgMHg4QjIzMjIyOCwgMHgwMDA5QjA2OSwKKzB4NjAwQ0EwMjEsIDB4NjI2MEQ2N0MsIDB4OEIxQjIyMjgsIDB4MDAwOUIwQzcsCisweDYwMENBMDE5LCAweDYyNjBENjc4LCAweDhCMTMyMjI4LCAweDAwMDlCMENELAorMHg2MDBDQTAxMSwgMHg2MjYwRDY3NCwgMHg4QjBCMjIyOCwgMHgwMDA5QjEyNSwKKzB4NjAwQ0EwMDksIDB4NjI2MEQ2NzAsIDB4OEIwMzIyMjgsIDB4MDAwOUIxM0QsCisweDYwMENBMDAxLCAweDRGMjZFMDAwLCAweDAwMDkwMDBCLCAweEQyNkNEMTZCLAorMHhENTZDODQxMiwgMHg0MDAwQzkwRiwgMHhENzZCMDEyRCwgMHhFNDAzRDY2QiwKKzB4RTIwRjYxMUMsIDB4MjU0MEUwMDEsIDB4MjUyMDI3MTIsIDB4MjYwMjAwMEIsCisweEU2MDFEMjYyLCAweDMwNjY4NTIzLCAweEUwMDA4RDA1LCAweEQ2NjNEMjYwLAorMHhFMDAxODEyMiwgMHgwMDBCMjYwMiwgMHhEMjVDMDAwOSwgMHg2MDBEODUyMywKKzB4ODkwNTIwMDgsIDB4OEIwQTg4MDEsIDB4NjA2MEQ2NUQsIDB4MjYwMENCMDEsCisweEQ0NTdENjVBLCAweEUwMDFFMTAxLCAweDAwMEIyNjEyLCAweDAwMEI4MTQyLAorMHhEMTUyRTAwMCwgMHg4NTEzRTUwMSwgMHg2NDBENDUxOCwgMHg2NjAzMzQ1MywKKzB4RTAwMDhEMDUsIDB4RDU1MUQyNTMsIDB4MjI2MEUwMDEsIDB4MDAwQjI1MDIsCisweDRGMjIwMDA5LCAweDg1MTNEMTQ5LCAweDY0NTM2NTBELCAweDYyNDk0NDE5LAorMHgyMjdENjcyRSwgMHg4ODAxNjAyQywgMHg4ODAyODkwOSwgMHg4ODAzODkxMCwKKzB4ODgwNjg5MUEsIDB4ODgwNzg5MzUsIDB4QTA0Qzg5M0IsIDB4RDU0NjAwMDksCisweDY2NTJENzQ2LCAweDI3NjJENDQ2LCAweDYyMkM2MjYxLCAweDI0MjFBMDM4LAorMHgyMjI4NjI1QywgMHhENDQzOEIzRiwgMHg2NjQyRDU0MCwgMHgyNTYyRDQ0MCwKKzB4MjQwMTg1NjEsIDB4NjIwM0EwMkMsIDB4MjAwODYwNUMsIDB4ODgxMDg5MDcsCisweDg4MjA4OTA4LCAweDg4MzA4OTA5LCAweEEwMkM4OTBBLCAweEQyM0EwMDA5LAorMHg2MjIyQTAwOCwgMHhBMDA1RDIzOSwgMHhEMjM5NjIyMiwgMHg2MjIyQTAwMiwKKzB4NjI2MkQ2MzgsIDB4RDQzMkQ1MzEsIDB4NjYyMTI1MjIsIDB4QTAwRjYyNkMsCisweEQ2MzUyNDIxLCAweDYyNjFENTJELCAweDYyMkNENDJELCAweEEwMDcyNTYyLAorMHhENjMyMjQyMSwgMHg4NTYxRDUyOSwgMHgyNTYyRDQyOSwgMHg2MjAzMjQwMSwKKzB4NjYyRDg1MTUsIDB4MzYxNzYxMEQsIDB4NjUwMzhGMDEsIDB4QjBDQjI0NTEsCisweEEwMDEwMDA5LCAweEUwMDBFMDAxLCAweDAwMEI0RjI2LCAweEQ2MTkwMDA5LAorMHhENDI3RTEwMSwgMHg2NTQxMjYxMCwgMHhEMTE4RDcxNywgMHhFMjBGNjU1RCwKKzB4Mjc1MkUwMDEsIDB4MDAwQjI2MjAsIDB4MkZFNjIxMDIsIDB4RDIwRjRGMjIsCisweDY0MEM4NTIzLCAweDhCMDgyNDQ4LCAweEQ1MTFENjFELCAweDI2MjFFMjAwLAorMHg5NDBGODQ1MSwgMHhBMDQ4MjA0OSwgMHhERTBEODA1MSwgMHhDODQwNjBFMCwKKzB4RTIwMThEMzIsIDB4ODk0NDM0MjcsIDB4RDIxNkQ2MTUsIDB4MjY0MTQyMEIsCisweDAwMDlBMDMwLCAweDAwMDBGRjdGLCAweDAwMjAzMjFELCAweDAwMjAzMUQ0LAorMHgwMDIwMzFFMCwgMHgwMDFFMTEwMCwgMHgwMDFFMTAwQywgMHgwMDIwMzIwMCwKKzB4MDAxRTEwMDAsIDB4MDAxRTEwMDEsIDB4MDAyMDMyMDgsIDB4MDAyMDMxRTgsCisweDAwMjAzMUVDLCAweDAwMjAzMUYwLCAweDAwMjAzMjBDLCAweDAwMjAzMjEwLAorMHgwMDIwMzIxNCwgMHgwMDIwMzIxOCwgMHgwMDIwMzUxQywgMHgwMDIwMzUyNiwKKzB4MDAyMDMxRkEsIDB4MDAyMDIzNjIsIDB4ODkxMjM0MjcsIDB4RDI5NEQ2OTMsCisweDI2NDE0MjBCLCAweENCODA4NEUxLCAweDgwRTFCMEY1LCAweEQ2OTE2MEUwLAorMHgyRTAwQ0IwNCwgMHhDOTNGNjA2MCwgMHhENjhGMjYwMCwgMHhBMDAxRTAwMSwKKzB4RTAwMDI2MDIsIDB4MDAwQjRGMjYsIDB4RDY4QzZFRjYsIDB4Qzg4MDYwNjAsCisweEQyODY4OTE5LCAweDg4MDE2MDIxLCAweEQyODk4QjE1LCAweDg1MjRFNTAxLAorMHg4OTEwMzA1NiwgMHhFMjAzRDE4NywgMHgyMTIwRDQ4NywgMHhFMDBCNjU0MSwKKzB4MDY1NjY1NUQsIDB4RTQwRkQ1ODUsIDB4MjE0MEU3MDIsIDB4RDc3RTI1NzEsCisweDAwMEJFMDAxLCAweDAwMEIyNzAyLCAweDJGRTZFMDAwLCAweERFODA0RjIyLAorMHhDODgwODRFMSwgMHhENTdBODkyQywgMHgyMDA4ODU1NCwgMHg2MTAzOEYyOCwKKzB4ODU1M0Q3N0MsIDB4NjQwMzY2NzIsIDB4ODU2NjY1MEMsIDB4MzUyMDYyMEMsCisweEQ2Nzk4QjFFLCAweDY1MUNENzc0LCAweDI2NTE2NDRDLCAweDYwRTAyNzQxLAorMHg4OTA0Qzg0MCwgMHg0MjBCRDI3NSwgMHhBMDAzMDAwOSwgMHhEMjY4MDAwOSwKKzB4MDAwOTQyMEIsIDB4MDAwOUIwOUYsIDB4RTIwMUQxNjcsIDB4NjBFMDIxMjIsCisweENCMDRENDY0LCAweDYwNDAyRTAwLCAweDI0MDBDOTNGLCAweDYwMjNBMDAxLAorMHg0RjI2RTAwMCwgMHg2RUY2MDAwQiwgMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwKKzB4REE2MjJGRTYsIDB4NjZBMUUyNDAsIDB4MzYyMkRDNUUsIDB4NjI2Mzg5MDAsCisweDZFRDM2RDJDLCAweDRFMjEzNkQ4LCAweDRFMjEyQTYxLCAweERCNjFENDYwLAorMHhFNzAwQTAwRiwgMHg3NzAxNjJCMiwgMHg3MTAyNjEyMywgMHg2NjIxMkIxMiwKKzB4NzEwMjYyMTMsIDB4NjEyMTJCMTIsIDB4NjUxRDY2NkQsIDB4MzU2QzQ1MjgsCisweDYyN0MyNDUyLCAweDhCRUQzMkUzLCAweEM5MDM2MEQzLCAweDhCMTA4ODAzLAorMHg2MTczNjdCMiwgMHgyQjEyNzEwMiwgMHg3MTAyNkUxMywgMHgyQjEyNjU3MSwKKzB4NjU1RDZERTEsIDB4NDIyODYyREQsIDB4MzI1Q0UxMDcsIDB4QTAwQzJDMTAsCisweDg4MDIyNDIyLCAweEEwMDM4QjAxLCAweDg4MDFFMjAzLCAweEUyMDE4QjA1LAorMHg2NkIyMkMyMCwgMHg2NTVENjU2MSwgMHhFNjBGMjQ1MiwgMHg2N0ExMkM2MCwKKzB4OEIwNTI3NzgsIDB4REQzOERDNDQsIDB4RUIwMUVBMDAsIDB4MkRCMjJDQTIsCisweDZERjY2RUY2LCAweDZCRjY2Q0Y2LCAweDZBRjYwMDBCLCAweDJGRTYyRkQ2LAorMHhFMjQwREQzNiwgMHgzNjIyNjZEMSwgMHg2MjYzODkwMCwgMHgzNjc4NjcyQywKKzB4NzcwM0RFMzgsIDB4NDcyMTJENjEsIDB4NjRFMkQ2MzUsIDB4QTAwRTQ3MjEsCisweDY1NjJFMTAwLCAweDYyNTM3MTAxLCAweDc0MDEyNDUwLCAweDI0MjA0MjE5LAorMHg0NTI5NzQwMSwgMHg3NDAxMjQ1MCwgMHgyNDUwNDUxOSwgMHg2MjFDNzQwMSwKKzB4OEJFRTMyNzMsIDB4NjZFMjQyMDAsIDB4NDIwMDYxRDEsIDB4MjExODM2MkMsCisweDJFNjI4RjA2LCAweEREMUNENzI4LCAweEU1MDFFNDAwLCAweDJENTIyNzQyLAorMHgwMDBCNkVGNiwgMHgyRkQ2NkRGNiwgMHg0RjIyMkZFNiwgMHhFRDBBRUUwMSwKKzB4NjRFM0JDOTcsIDB4QkM5QzY0RTMsIDB4NjJFQzdFMDEsIDB4OEJGNzMyRDcsCisweEJDOUZFRTAxLCAweDY0RTM2NEUzLCAweDdFMDFCQ0E0LCAweDMyRDc2MkVDLAorMHg0RjI2OEJGNywgMHgwMDBCNkVGNiwgMHhEMTE4NkRGNiwgMHhENDE4OTIwRCwKKzB4NzIxMjIxMjIsIDB4MjQyMkQ2MTcsIDB4RDcxNzcyMDQsIDB4NzIyMDI2MjIsCisweDI3MjJEMTE2LCAweDAwMEI3MjMwLCAweDEzN0EyMTIyLCAweDAwMjAzMUZBLAorMHgwMDIwMjQ2RSwgMHgwMDFFMTAxNSwgMHgwMDIwMzIwMCwgMHgwMDFFMTAwMSwKKzB4MDAyMDMxRDQsIDB4MDAxRTExMDAsIDB4MDAyMDMxRkUsIDB4MDAyMDMxRUMsCisweDAwMUUxMDAwLCAweDAwMjAzMUYwLCAweDAwMjAzMUZDLCAweDAwMjAyMzYyLAorMHgwMDFFMTAwQywgMHgwMDIwMzFFOCwgMHgwMDIwMzIwNCwgMHgwMDIwMzIwOCwKKzB4MDAyMDMyMEMsIDB4MDAyMDMyMTAsIDB4MDAyMDMyMTQsIDB4MDAyMDMyMTgsCisweDRGMjIyRkU2LCAweEQ2NTA3RkZDLCAweDg4MDE2MDYwLCAweEUyMDE4OTUxLAorMHgyNjIwQkZCQiwgMHhENTRFRDE0RCwgMHhERTRFNjAxMCwgMHg2NEUzNjU1MiwKKzB4NzQwMkM4NDAsIDB4OEQyMkQxNEMsIDB4RDI0Qzc1MDIsIDB4RTYwMUQ3NEMsCisweEU3MDQyNzIyLCAweDc2MDE2MjU1LCAweDYyNkMyNDIxLCAweDhGRjkzMjczLAorMHhENDQzNzQwMiwgMHg2MjQyRTYwMSwgMHg2NDBEODUyOCwgMHg2NzQ5NDQxOSwKKzB4Mjc1RDY1N0UsIDB4ODFFNDYwN0MsIDB4RTQxN0Q1NDIsIDB4Njc1NTc2MDEsCisweDMyNDM2MjZDLCAweDhGRjkyMTcxLCAweEEwMjA3MTAyLCAweEQyM0UwMDA5LAorMHhFNjAxRDczQiwgMHhFNzA0MjcyMiwgMHg3NjAxNjI1NSwgMHg2MjZDMjQyMSwKKzB4OEZGOTMyNzMsIDB4RDQzMjc0MDIsIDB4NjI0MkU2MDEsIDB4NjQwRDg1MjgsCisweDY3NDk0NDE5LCAweDI3NUQ2NTdFLCAweDgxRTQ2MDdDLCAweEU0MTdENTMzLAorMHg2NzU1NzYwMSwgMHgzMjQzNjI2QywgMHg4RkY5MjE3MSwgMHg5MjRBNzEwMiwKKzB4RDIyNjJFMjEsIDB4NUUyM0Q3MkUsIDB4NjRGMjJGRTIsIDB4NjA0MzY1RjIsCisweDI3MDBDOTgwLCAweEM5NjA2MDQzLCAweDgwNzE2MTAzLCAweEM5MDM2MDQzLAorMHg4MDcyNDUxOSwgMHg2NUYyNjA1QywgMHg4MTcyNjZGMiwgMHg0NjE5NDYyOSwKKzB4NjA2QzQ1MjksIDB4NDAxODY0NUMsIDB4ODE3MzMwNEMsIDB4MjExODVFMjMsCisweDY0RjIyRkUyLCAweDZFNEM2MkYyLCAweDYwMkM0MjE5LCAweDY2RjI2MkYyLAorMHg0NjI5NDAxOCwgMHg0NjE5MzBFQywgMHg0MjI5ODE3NCwgMHg2NTJDNjA2QywKKzB4MzA1QzQwMTgsIDB4ODE3NThGMDcsIDB4MDAwOUJDOUQsIDB4MjIyODYyMEMsCisweEEwMEE4OTA4LCAweDYwMTMwMDA5LCAweDhCMDM4ODQwLCAweDAwMDlCMDA5LAorMHgwMDA5QTAwMywgMHhFMjAyRDYwRiwgMHg3RjA0MjYyMiwgMHgwMDBCNEYyNiwKKzB4MDAwQjZFRjYsIDB4MDYwQTAwMDksIDB4MDAyMDMyMUMsIDB4MDAxRTEwMDAsCisweDAwMjAzMjA4LCAweDAwMjAzNTFDLCAweDAwMjAzNTI4LCAweDAwMjAzNEMwLAorMHgwMDIwMzFGMCwgMHgwMDIwMzRGMCwgMHgwMDIwMzRFRSwgMHgwMDIwMzRDMiwKKzB4MDAyMDMxRDQsIDB4MDAyMDMyMDAsIDB4NEYyMjJGRTYsIDB4REU5MzdGRkMsCisweDIwMDg4NEU5LCAweDJGMDA4RDA2LCAweEQ2OTJENDkxLCAweDAwMDk0NjBCLAorMHg2NEYwQjE5NCwgMHg2NjIwRDI5MCwgMHg4OTAyMjY2OCwgMHhDOUJGNjBFMCwKKzB4N0YwNDJFMDAsIDB4MDAwQjRGMjYsIDB4MDAwQjZFRjYsIDB4MkZFNjAwMDksCisweERFOEE0RjIyLCAweDYwRTBENjhBLCAweENCQzBENDhBLCAweDYyNjAyRTAwLAorMHhDODAzNjAyQywgMHg0MDIxODkwNCwgMHg3MDAxNDAyMSwgMHg2NjAzQTAwMiwKKzB4NjYwMzQwMDksIDB4RDY4NDYxNkQsIDB4RTUwMEEwMDQsIDB4NzUwMTYyNjIsCisweDc0MDQyNDIyLCAweDMyMTM2MjVELCAweEQyODA4QkY4LCAweDAwMDk0MjBCLAorMHhDOUJGODRFMiwgMHg0RjI2ODBFMiwgMHg2RUY2MDAwQiwgMHgyRkU2MkZENiwKKzB4N0ZGQzRGMjIsIDB4NjI2MEQ2N0EsIDB4ODk0NDIyMjgsIDB4RDU2RkUxMDAsCisweDYwNTAyNjEwLCAweENCNDBENDc3LCAweDI1MDA0NDBCLCAweDhEMDUyMDA4LAorMHg2MkUwNkUwMywgMHg3MTA0NjEyQywgMHgyRjExQTAwNiwgMHhENDcyRDY2QSwKKzB4REQ3MjY3NjAsIDB4NjU3QzREMEIsIDB4RTIzQzZEMUQsIDB4OEIwMzNEMjcsCisweEQyNjRENDZGLCAweDAwMDk0MjBCLCAweDREMjE0RDIxLCAweEEwMDVENzZELAorMHg2NkU2RTQwMCwgMHgzNTdDNDUwOCwgMHg3NDAxMjU2MiwgMHgzNUQzNjU0RCwKKzB4RDc2OThCRjcsIDB4NjE3MkUwMDMsIDB4ODExMTQwMTgsIDB4NkU3MjYwRjEsCisweDgxRTI3MDBDLCAweEQ0NjU2MTcyLCAweERENjU4MTEzLCAweDREMEJERTY1LAorMHhFMjAxNjU3MiwgMHhENDY0MkUyMiwgMHg0MjBCRDI1MiwgMHhENjUzMDAwOSwKKzB4QzkzRjYwNjAsIDB4N0YwNDI2MDAsIDB4NkVGNjRGMjYsIDB4NkRGNjAwMEIsCisweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweEQyNUM0RjIyLCAweDZCNDM2RTczLAorMHg0MjBCNkM1MywgMHgyMDA4NkQ2MywgMHg2MTAzOEYwOCwgMHhEMjQ1RDQ1OCwKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjQyMkIsIDB4MjFCMDYwQzMsCisweDYwRDM4MDExLCAweEU1MDA4MTExLCAweDY0QkNBMDA3LCAweDYwNTM2NTVELAorMHg2NjUzMDBFQywgMHg3NTAxMzYxQywgMHg2MjVEODA2NCwgMHg4QkY1MzI0MywKKzB4NjA2MEQ2MzYsIDB4MjYwMEM5QkYsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsCisweDZCRjYwMDBCLCAweDdGQzQ0RjIyLCAweDcyMDI2MkYzLCAweDIyNTEyRjQxLAorMHg0NTI5NzIwMiwgMHg2MDYzMjI1MSwgMHhFNUM0RTY4MiwgMHg2N0YzODEyMSwKKzB4NjU1QzY2NkMsIDB4RTQwOEJGQkMsIDB4NEYyNjdGM0MsIDB4MDAwOTAwMEIsCisweDJGOTYyRjg2LCAweDJGQjYyRkE2LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LAorMHhFMTAwN0ZDNCwgMHg2NTEzRUNGRiwgMHg2QjEzNkNDRCwgMHhERTM2RDczNSwKKzB4RURGRjY0RjMsIDB4RDgzNUVBMDQsIDB4NjA1MzY1NUMsIDB4MDI3RDQwMDAsCisweDMyQzA2MjJELCAweDY2MDM4RDBELCAweDA5RUQ2MDYzLCAweDI0OTEwMjdELAorMHgyNDIxNzQwMiwgMHg2OTgyMDJFRCwgMHgzOTI4NjIyRCwgMHg3NDAyMjg5MiwKKzB4NzUwMTcxMDQsIDB4NjA2MzYyNUMsIDB4MDdENTMyQTIsIDB4MEVCNThGRTQsCisweDI0NDg2NDFDLCAweEU2ODA4OTA1LCAweDY3RjNFNUM1LCAweEJGN0Y2NjZDLAorMHg3RjNDNjU1QywgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwKKzB4MDAwQjY5RjYsIDB4RDExRTY4RjYsIDB4NjAxMkQyMUUsIDB4Q0IyMEU0MDUsCisweDIxMDJFNTAwLCAweDAwMEIyMjQyLCAweDAwMDAyMjUyLCAweDAwMUUxMDE3LAorMHgwMDIwMzM1OCwgMHgwMDIwMTQ1RSwgMHgwMDIwMzFBMiwgMHgwMDFFMTAxNSwKKzB4MDAxRTEwQkYsIDB4MDAxMTc4MDAsIDB4MDAxRTEwRkMsIDB4MDAyMDAzMDgsCisweDAwMjAzMUE4LCAweDAwMjAyNUM2LCAweDAwMjAzMzVDLCAweDAwMjAxNEFBLAorMHgwMDIwMzM3OCwgMHgwMDExNzg4QywgMHgwMDIwMzFBNCwgMHgwMDIwMkQ4OCwKKzB4MDAyMDExRTQsIDB4MDAxRTIxMzAsIDB4MDAyMDMzODAsIDB4MDAyMDI1ODgsCisweDAwMjAzMzg0LCAweDAwMjAzMUJDLCAweDAwMjAzMUM0LCAweDAwMjAzNEJDLAorMHgwMDFDMzUwMCwgMHgwMDFENDAwNCwgMHhENTY1RDE2NCwgMHhFNDAwRDc2NSwKKzB4MjE0MkUyMEYsIDB4MTc0MTExNTQsIDB4RDU2MzI3MjIsIDB4OTY2OUQ3NjMsCisweDE1NDEyNTcyLCAweDk2NjYxNTYyLCAweEU2MDExNTY1LCAweEQ1NjAxMTY1LAorMHg2NjZDRTZGOCwgMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwKKzB4MjU2MjI1NDIsIDB4NzYwMUU3MjcsIDB4Njc2MzI1NzIsIDB4MjU2Mjc3OTcsCisweEU3MDQyNTcyLCAweDI1NzJFMjQ4LCAweEUyMTkyNTIyLCAweEUyNzAyNTIyLAorMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwgMHgyNTIyMjU0MiwgMHgyNTIyRTIwQywKKzB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsCisweDAwMEIxNTRBLCAweEUyMDgxMTQ1LCAweDAwMDk0MjJCLCAweDJGRTYyRkQ2LAorMHg3RkZDNEYyMiwgMHhDODIwNjA0MywgMHg2RTQzOEQwMiwgMHgwMDA5QkU2RCwKKzB4QzgxMDYwRTMsIDB4QkU2QTg5MDEsIDB4NjBFMzAwMDksIDB4ODkwMUM4NDAsCisweDAwMDlCRThDLCAweEM4MDE2MEUzLCAweEREM0U4OTM4LCAweEM4MDI2MEQwLAorMHgyRjAwOEQwMywgMHg0NjBCRDYzQywgMHg2MEYwMDAwOSwgMHg4OTAyQzgwNCwKKzB4NDYwQkQ2M0EsIDB4NjJGMDAwMDksIDB4Qzg4MDYwMjMsIDB4NjBEMDg5MDIsCisweDJEMDBDOTdGLCAweEM4MDE2MDIzLCAweEQ2MzU4OTA2LCAweDAwMDk0NjBCLAorMHgwMDA5QTAwNywgMHg1MTYzMDYwMSwgMHg4OTAyQzgwOCwgMHg0NjBCRDYzMSwKKzB4NjBGMDAwMDksIDB4ODkwMkM4MTAsIDB4NDIwQkQyMkYsIDB4RDUyRjAwMDksCisweDg4MDI2MDUyLCAweEQyMkU4QjAzLCAweEEwMDVFNjA0LCAweDg4MDEyMjYwLAorMHhEMjJCOEIwMiwgMHgyMjYwRTYwMSwgMHgyNTIyRTIwMCwgMHhDODgwNjBFMywKKzB4RDYyODg5MkUsIDB4NjBFMzZFNjAsIDB4ODkwMkM4ODAsIDB4NDIwQkQyMjYsCisweDYwRTMwMDA5LCAweDg5MDJDODQwLCAweDQyMEJEMjI0LCAweDYwRTMwMDA5LAorMHg4OTAyQzgwMiwgMHg0MjBCRDIyMiwgMHg2MEUzMDAwOSwgMHg4OTBFQzgwNCwKKzB4NDEwQkQxMjAsIDB4QkYwRTAwMDksIDB4QkY0RDAwMDksIDB4RDUxRTAwMDksCisweDYwNTBENDFFLCAweEM5MDhENzFFLCAweEJGODQyNTAwLCAweDYwRTMyNDcyLAorMHg4OTA1QzgwOCwgMHg3RjA0RDIxQiwgMHg2RUY2NEYyNiwgMHg2REY2NDIyQiwKKzB4NEYyNjdGMDQsIDB4MDAwQjZFRjYsIDB4MDAwMDZERjYsIDB4MDAxQzU4MUMsCisweEEwMDBBMDAwLCAweDAwMUQwMTAwLCAweDAwMUQ0MDAwLCAweDAwMDQwMDIxLAorMHgwMDFDNTg5QywgMHgwMDFFMTAyMSwgMHgwMDIwMTY0MCwgMHgwMDIwMTY2MiwKKzB4MDAyMDFDQTAsIDB4MDAyMDE2N0EsIDB4MDAyMDE2ODgsIDB4MDAyMDMyMDAsCisweDAwMUUxMDBCLCAweDAwMUUxMDI4LCAweDAwMjAxNkRFLCAweDAwMjAxNkVBLAorMHgwMDIwMTY5MCwgMHgwMDIwMTZBRSwgMHgwMDFFMTAwMCwgMHgwMDEwRjEwMCwKKzB4MTIzNDU2NzgsIDB4MDAyMDE2QzYsIDB4NjQ0Q0Q2QTcsIDB4MDAwQjM0NkMsCisweEQ2QTYyNDUwLCAweDM0NkM2NDRDLCAweDI0NTAwMDBCLCAweDY0NENENkE0LAorMHgwMDBCMzQ2QywgMHg2MjVDMjQ1MCwgMHg0MjA4NjE2RCwgMHg0MjA4NDExOSwKKzB4NDIwMDYwMTksIDB4NjcwRTYxNEMsIDB4RDQ5RTMyMUMsIDB4NDIwMDIwN0QsCisweDMyNENDOTBGLCAweDIyMDAwMDBCLCAweDQyMDg2MjVDLCAweDQyMDA0MjA4LAorMHgzMjRDNjQ0QywgMHg0MjAwRDQ5OCwgMHgwMDBCMzI0QywgMHgyRkU2MjI2MCwKKzB4NjE0QzRGMTIsIDB4NDEwMEQ0OTMsIDB4NjcxMDMxNEMsIDB4RTI5RjY2NkQsCisweDI3Mjk0NjE5LCAweDZFNTM2MjY5LCAweDY3MkU2NTczLCAweDQyMjEyMjdELAorMHg0MjIxNDIyMSwgMHg3NjAxNjYyQywgMHhFNDAxNDYwOCwgMHgzNEU4NDYwOCwKKzB4NjQ0QzQ2MDAsIDB4MDcxQTA0NjcsIDB4MjE1MDI1N0IsIDB4MDAwQjRGMTYsCisweDRGMjI2RUY2LCAweEQyODU3RkU4LCAweDg4MDE2MDIxLCAweEQyODQ4QjdCLAorMHgyNjY4NjYyMSwgMHhEMjgzOEI3NywgMHgyNjY4NjYyMSwgMHhFNTBGOEI3MywKKzB4RTQwMUJGQTIsIDB4QkZBNEU1MDEsIDB4RTU4NkU0MDAsIDB4RTQwMDY1NUMsCisweDJGNTBCRkE0LCAweEJGQTFFNDAxLCAweEU2MDJFNTA2LCAweDYwNjM0NjE4LAorMHg4MUYyRTQwMSwgMHg2NTQzQkY5RiwgMHhFNDAxODVGMiwgMHhCRkFCNjU0MywKKzB4ODVGMjY2MDMsIDB4NjU0M0U0MDEsIDB4NjYwM0JGQjEsIDB4RTQwMjY1RjAsCisweDYwNTM3NTZDLCAweDgwRjhCRjgwLCAweEJGODJFNDAyLCAweDg0RjhFNTEyLAorMHg3MDkwRTQwMiwgMHg2NTAzQkY4MiwgMHg0NjE4RTYwMiwgMHg4MUY2NjA2MywKKzB4QkY4MEU0MDIsIDB4ODVGNkU1MDAsIDB4NjYwM0U0MDIsIDB4RTUwMEJGOEMsCisweEU0MDI4NUY2LCAweEJGOTI2NjAzLCAweEU1RkVFNTAwLCAweEUwMTA2NTVDLAorMHhCRjYxRTQwMywgMHhFNTEzMEY1NCwgMHhFNDBFQkY2MywgMHgwNUZDRTAxMCwKKzB4QkY2M0U0MEUsIDB4RTUwMDc1ODUsIDB4QkY2NEU0MDMsIDB4RTUwMEU2NDAsCisweEJGNzFFNDAzLCAweEU1MDBFNjQwLCAweEJGNzhFNDAzLCAweEU1RkZFNjQwLAorMHhFMDE0NjU1QywgMHhCRjQ3RTQwNCwgMHhFNDBGMEY1NCwgMHhFNTA0QkY0OSwKKzB4MDVGQ0UwMTQsIDB4QkY0OUU0MEYsIDB4RTUwMTc1ODQsIDB4QkY0QUU2NDAsCisweEU1MDFFNDA0LCAweEJGNTdFNjQwLCAweEU1MDFFNDA0LCAweEU0MDRFNjQwLAorMHhBRjVDN0YxOCwgMHg3RjE4NEYyNiwgMHgwMDBCNEYyNiwgMHg0RjIyMDAwOSwKKzB4RDI0MjdGRjAsIDB4ODgwMTYwMjEsIDB4RDI0MThCNzEsIDB4MjY2ODY2MjEsCisweEQyNDA4QjZELCAweDI2Njg2NjIxLCAweEU1MEY4QjY5LCAweEU0MDFCRjFDLAorMHhCRjFFRTUwMSwgMHhFNTg2RTQwMCwgMHhFNDAwNjU1QywgMHgyRjUwQkYxRSwKKzB4QkYxQkU0MDEsIDB4RTQwMUU1MDYsIDB4QkYxQzY1NDMsIDB4RTQwMUU2NDAsCisweEJGMjk2NTQzLCAweEU0MDFFNjQwLCAweEJGMzA2NTQzLCAweDY1RjBFNjQwLAorMHg3NTZDRTQwMiwgMHhCRUZGNjA1MywgMHhFNDAyODBGNCwgMHhFNTEyQkYwMSwKKzB4RTQwMjg0RjQsIDB4QkYwMTcwOTAsIDB4RTY0MDY1MDMsIDB4QkYwMkU0MDIsCisweEU2NDBFNTAwLCAweEJGMEZFNDAyLCAweEU2NDBFNTAwLCAweEJGMTZFNDAyLAorMHhFNUZFRTUwMCwgMHg2MDUzNjU1QywgMHhCRUU1RTQwMywgMHhFNTEzODBGOCwKKzB4RTQwRUJFRTcsIDB4RTQwRTg0RjgsIDB4QkVFNzcwODUsIDB4RTUwMDY1MDMsCisweEJFRThFNjQwLCAweEU1MDBFNDAzLCAweEJFRjVFNjQwLCAweEU1MDBFNDAzLAorMHhCRUZDRTY0MCwgMHhFNUZGRTQwMywgMHg2MDUzNjU1QywgMHhCRUNCRTQwNCwKKzB4RTQwRjgwRkMsIDB4RTUwNEJFQ0QsIDB4RTQwRjg0RkMsIDB4QkVDRDcwODMsCisweEU1MDE2NTAzLCAweEJFQ0VFNjQwLCAweEU1MDFFNDA0LCAweEJFREJFNjQwLAorMHhFNTAxRTQwNCwgMHhFNDA0RTY0MCwgMHhBRUUwN0YxMCwgMHg3RjEwNEYyNiwKKzB4MDAwQjRGMjYsIDB4MDAwMDAwMDksIDB4MDAxRTEwMkYsIDB4MDAxRTEwODAsCisweDAwMUUxMDkwLCAweDAwMUUxMDNGLCAweDAwMUUxMDNFLCAweDAwMjAzMUZBLAorMHgwMDIwMzFGQywgMHgwMDIwMzFGRSwgMHhEMjFERDExQywgMHg2NjIwNjAxMCwKKzB4Njc2QzcwMDEsIDB4MzcwMEM5MEYsIDB4RTUwMDhEMTMsIDB4NjcxMDYyMTAsCisweDc3MDE2MjJDLCAweDY0MjMyMTcwLCAweEQ2MTY2MDEwLCAweDQ0MDg0NDA4LAorMHgzNDI4QzkwRiwgMHg2MjYwMjEwMCwgMHg3MjAxRDUxMywgMHg0NDA4MjYyMCwKKzB4MDAwQjM1NEMsIDB4RDEwRjYwNTMsIDB4MjU1ODY1MTAsIDB4RTYwMDhEMTMsCisweEQ2MERENDBCLCAweDY1NUM2NTQwLCAweDQ3MDg2NzUzLCAweDM3NTg0NzA4LAorMHg0NzA4NjU0MCwgMHgyNDUwNzUwMSwgMHgzNjdDNjA0MCwgMHgyNDAwQzkwRiwKKzB4NzJGRjYyMTAsIDB4MDAwQjIxMjAsIDB4MDAwMDYwNjMsIDB4MDAyMDMxQTEsCisweDAwMjAzMUEwLCAweDAwMjAzMUEyLCAweDAwMjAyREM4LCAweDdGRkM0RjIyLAorMHhFNjgwRDE5RCwgMHg2NjZDNjIxMiwgMHhEMjlDMkYyMiwgMHg2N0YzNjU2MywKKzB4NDIwQjc1NDIsIDB4N0YwNEU0MDQsIDB4MDAwQjRGMjYsIDB4RTY4MDAwMDksCisweEQyOTY2NjZDLCAweEU3MDA2NTYzLCAweDQyMkI3NTQwLCAweEU2ODA2NDczLAorMHhEMjkyNjY2QywgMHhFNzAwNjU2MywgMHg0MjJCNzU0MywgMHgyRjg2NjQ3MywKKzB4MkZBNjJGOTYsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4N0ZGNDRGMjIsCisweEREOENEMjhCLCAweDcyMDExRjIxLCAweERCOEIxRjIyLCAweDZBRjJFODQwLAorMHg1MjExRDE4QSwgMHgzNjIwNjYxMiwgMHhBMEE3OEIwMSwgMHg2MDYxMDAwOSwKKzB4ODgwMUM5MDMsIDB4QTBBMThCMDEsIDB4RDk4NDAwMDksIDB4NDIwQkQyODQsCisweDU1MDM2NDkzLCAweDg0NUM2QTAzLCAweDMwRTBFRTg0LCAweEQxODE4Qjc5LAorMHg2MDZDNjYxMCwgMHg4QjNEODgwMSwgMHg2MjEwRDE3RiwgMHg4OTJGMjIyOCwKKzB4RDU3RUU3MDEsIDB4NjQ1MjJCNzIsIDB4MTQ0MkUwMDMsIDB4RDU3QzYyNTIsCisweEU2MDA0MDE4LCAweDIxNjA4MTIxLCAweEQxN0E2NDUzLCAweDZFNTI3NDA0LAorMHg2MDEyNjc0MiwgMHhDQjIwREM3OCwgMHg3NjAxMjEwMiwgMHgzMjgzNjI2RCwKKzB4MjVFMjhCRkIsIDB4MjQ3MkRFNzEsIDB4NjJFMjY3QzIsIDB4MTI3NEQxNzMsCisweDYwNDE2NEUyLCAweDI0MDFDQjAxLCAweEVFMDA2NkUyLCAweERDNzAyQzYyLAorMHhFQzAxMkM2MiwgMHgyREMyNDEwQiwgMHg0QzE4RUMwMSwgMHgyQkUyMkRDMiwKKzB4RDc2NERFNkMsIDB4RDE2QzYwRTIsIDB4Q0IwMUUyMDIsIDB4MjcyMDJFMDIsCisweDIxMjJBMDJGLCAweDhCMkMyMDA4LCAweEU3MDFERTY4LCAweEQ0NjZFQzAwLAorMHgyMTcwRDI2NCwgMHhFRTAxMkVDMiwgMHg2MTIyMjRFMiwgMHgyMTY5RTZGRSwKKzB4RTAxRTIyMTIsIDB4NTRGMTBDNUMsIDB4MjRDMEUwMUYsIDB4NTZGMjAyNUMsCisweDI2MjA3NTEwLCAweEQ3NUVFNjAwLCAweEVFMDZENDVFLCAweDc2MDE4NDU2LAorMHg2QzU0MjcwMCwgMHgzMUUzNjE2QywgMHg3NDAxMjRDMCwgMHg3NzAxOEZGNiwKKzB4RTQ5NEQyNTksIDB4NzIwMTIyNDAsIDB4MjI1MEU1MDAsIDB4RTYwNTcyMEYsCisweEQyNTYyMjYwLCAweDY1QTM2NDkzLCAweEVFMDE0MjBCLCAweEFGNkY0RTE4LAorMHgyRkEyMkRFMiwgMHhENDUyNjVGMiwgMHg2NjQyODU1MywgMHgzMjYyNjIwRCwKKzB4RDQ1MDg5MDcsIDB4NDEwQkQxNTAsIDB4RDc1MDAwMDksIDB4QUY1N0U2MDEsCisweEQ0M0EyNzYyLCAweEREMzdEMTQ5LCAweDY1RjI0MTBCLCAweEQ0NENFRTAxLAorMHg0RTE4RDY0QywgMHgyREUyNDYwQiwgMHgwMDA5QUY0QSwgMHg3RjBDMkZBMiwKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsCisweDRGMjI2OEY2LCAweDg1NDY3RkY0LCAweDJGMDFFNjgxLCAweDY2NkM4NTQ3LAorMHg4NTQ4ODFGMSwgMHg4MUYyRDIyNSwgMHg2N0YzODU0MiwgMHg4NTQzODFGMywKKzB4ODFGNEU0MEMsIDB4NjU2MzYwNTMsIDB4NDIwQjgxRjUsIDB4N0YwQzc1NDAsCisweDAwMEI0RjI2LCAweDJGODYwMDA5LCAweDJGQTYyRjk2LCAweDJGQzYyRkI2LAorMHgyRkU2MkZENiwgMHg3RkVDNEYyMiwgMHhFODAwRDExQSwgMHhENDMyMkYxMiwKKzB4MUY0MTYxODMsIDB4NkExM0RCMjAsIDB4NEEwOEQ2MzAsIDB4REUyMEUwMDEsCisweDRBMDA0NjBCLCAweDFGMDIzQUVDLCAweDUyQjE2NkIyLCAweDhCMDEzNjIwLAorMHgwMDA5QTE5QiwgMHhDOTAzNjA2MSwgMHg4QjAxODgwMSwgMHgwMDA5QTE5NSwKKzB4REUyNzUyNjMsIDB4OEI0RjMyRTAsIDB4NDIwQkQyMEQsIDB4REUyNTY0QjMsCisweEQ3MERENTBFLCAweEVEMDFEQzBCLCAweDJFMDJFMTAwLCAweDI3RDAyNTAyLAorMHhBRkUxMkMxMCwgMHgwMDAwMkUxNiwgMHgwMDFDM0Q5QywgMHgwMDIwMUY0MCwKKzB4MDAxMTc3OUEsIDB4MDAxQzNEMzAsIDB4MDAxRDAxMDQsIDB4MDAyMDJEQzAsCisweDAwMjAxMTYyLCAweDAwMjAzMUIxLCAweDAwMjAzMUIwLCAweDAwMjAzMUFDLAorMHgwMDFDM0I5QywgMHgwMDFDMzUwMCwgMHgwMDIwMkQ5OCwgMHgwMDIwMTI3NiwKKzB4MDAxQzNEMDAsIDB4MDAxQzM2RjgsIDB4MDAxMTc3MDgsIDB4MDAyMDMxQjQsCisweDAwMTE3NzhDLCAweDAwMTE3NzkyLCAweDAwMTE3Nzg4LCAweDAwMjAxMTgwLAorMHgwMDIwMzE4OCwgMHgwMDIwMkQ4OCwgMHgwMDIwMTFFNCwgMHgwMDFFMjEzMCwKKzB4MDAyMDM0OUMsIDB4MDAyMDE0NUUsIDB4MDAyMDM0QTgsIDB4MDAyMDJDODAsCisweDAwMTE3NzgwLCAweDAwMTE3NzBDLCAweEM4MDE4NTYxLCAweDVDNjM4OTdBLAorMHg2NjAzODVDMiwgMHg2NDAzQzkwMywgMHg2NTBEODVDMywgMHg0MDIxNjA1MywKKzB4QzkzRjQwMjEsIDB4NkUwMzQ1MDAsIDB4MjUyRDMyMkEsIDB4RTIxMDYwNTMsCisweDNFMjNDOTAxLCAweDZEMDM4RDIzLCAweDQ0MDhENzlELCAweDQ0MDg2NTcwLAorMHg0NDAwNjJFMywgMHgyNTU4NDIwMCwgMHgzNDJDOEYwRiwgMHg2MDQzRDI5OSwKKzB4Njk3RDA3MkQsIDB4NjA5OTQ5MTksIDB4MjAxRDYxMEUsIDB4NjBEMzgxRjYsCisweDhGMEM4ODAxLCAweEEwMEE2OTdDLCAweEQyOTM2OUUzLCAweDA1MkQ2MDQzLAorMHg0MjE5NjI1RCwgMHg2NzBFNjAyOSwgMHg4MUY2MjA3RCwgMHhEMThGNjk1QywKKzB4MjIyODYyMTAsIDB4RTlGRjg5MDEsIDB4RUVGRjY5OUMsIDB4NkVFQzY1OUQsCisweDhCMEYzNUUwLCAweDRDMEJEQzhBLCAweDU0MDM2NEIzLCAweEJGMjBFNTAyLAorMHhENDg4NkUwMywgMHg0MTBCRDE4OCwgMHhENzg4NjVFMywgMHhENDg4RUQwMSwKKzB4MjdEMkEwMUUsIDB4MjZFOUVFRkMsIDB4ODFDMjYwNjMsIDB4OTdDNTg1QzMsCisweDYyMDMyMDc5LCAweDQ1MDg4NUY2LCAweDYwNjMyNjBCLCAweDgxQzIyNTJCLAorMHg4MUMzNjA1MywgMHhFMTA4ODVDNCwgMHgyMDFCNDExOCwgMHg2MkIyODFDNCwKKzB4MjBFOTg1MjEsIDB4NjRCMjgxMjEsIDB4Q0IwMTYwNDEsIDB4RDQ3OTI0MDEsCisweDQ1MEJENTc5LCAweDYwQjIwMDA5LCAweDU3RjI2NkYyLCAweDJBMDJDQjAxLAorMHgyNjcyQUYyMiwgMHhEMjZFODU2MSwgMHg4RjAyQzgwMiwgMHhBMDlGNjRCMywKKzB4NDIwQjAwMDksIDB4REM3MTAwMDksIDB4NUUwMzY1MDMsIDB4MDdDRUUwNEMsCisweDc3MDFERDZGLCAweDZDRDIwQzc2LCAweDdDMDFENjY0LCAweDZENjAyREMyLAorMHg4OTA2MkREOCwgMHhEMjY0RDQ2MywgMHhFRDAxNDIwQiwgMHhBMDdFRDc2MywKKzB4NjI1MTI3RDIsIDB4NDExOEUxMEYsIDB4MjIxOUU0MDIsIDB4MzI0MDQ0MTgsCisweDg1NTE4QjExLCAweDIwRDlFREZDLCAweDYwNTE4MTUxLCAweENCMDE3REUzLAorMHg4NUUxMjUwMSwgMHgyMEQ5RDY1RiwgMHg0NjBCODFFMSwgMHg2Q0YyNjRCMywKKzB4QTA2NDU3RjIsIDB4NkQ1MTJDNzIsIDB4NEQxOTZEREQsIDB4NjZERTZERDksCisweDdEMDEyRDZELCAweDYxMDM2MERDLCAweDg4MDE0MTE4LCAweDI1MTE4RjQ1LAorMHg2NDYyRDY1MywgMHgyNjQyNzQwMSwgMHg2NjBEODVFMywgMHg0MDIxNjA2MywKKzB4QzkzRjQwMjEsIDB4NkQwMzQ2MDAsIDB4MjYyRDMyMkEsIDB4QzgwMTYwNjMsCisweERDNEVEMTRELCAweDk2NEE4OTAxLCAweEU2MDAyRDZCLCAweDBGNjRFMDEwLAorMHhFMDEwNjRERCwgMHg2MDdDMDdGQywgMHgwMjFENDAwMCwgMHgzMjQwNjIyRCwKKzB4NjYwMzhEMTIsIDB4MDIxRDYwNjMsIDB4MzI3MEU3RkYsIDB4QTAwQjhCMDEsCisweEUwMTAwMUQ1LCAweEU2MDQwMkZDLCAweDBGMjQ3MjAxLCAweDMyNjI2MjJDLAorMHgwNkZDOEJFNywgMHg0NjAwNjY2QywgMHgwMUNENjA2MywgMHgwQzE1NzEwMSwKKzB4NjcxMUQxM0IsIDB4M0M0MDZDN0QsIDB4NjIxMTg5MDcsIDB4ODhGRjYwMkQsCisweDIxRDE4OTAzLCAweEUyMDFERDM3LCAweDg1NTEyRDIwLCAweDIwRDlFREZDLAorMHg2MDUxODE1MSwgMHhDQjAxRDIyRiwgMHg0MjBCNjRCMywgMHhFMDEwMjUwMSwKKzB4RDQzMTAyRkMsIDB4RTAwMTYxMkMsIDB4NjdGMjQ0MEIsIDB4ODVFRjI3MDIsCisweDU0RjFEMjJFLCAweDY1MEQ0MjBCLCAweDAwMDlBRTdFLCAweDgwMDA3RTAzLAorMHgwMDA5NDIwQiwgMHg2RTAzNTQwMywgMHhFRDA4ODU0NCwgMHgyMEQ5NEQxOCwKKzB4OEIwMzMwRDAsIDB4RTUwMUJFM0QsIDB4MDAwOUEwMDcsIDB4REQyNDg1NDEsCisweDIyRDg2MjBELCAweEJFMzQ4OTAxLCAweEQ0MTJFNTAwLCAweDQyMEJEMjEyLAorMHhENzEyNjVFMywgMHhBRTVGRUQwMSwgMHg3ODAxMjdEMiwgMHhFRTA0NjE4RCwKKzB4OEQwMjMxRTcsIDB4QUU0RTdCMDgsIDB4N0YxNDAwMDksIDB4NkVGNjRGMjYsCisweDZDRjY2REY2LCAweDZBRjY2QkY2LCAweDAwMEI2OUY2LCAweDAwMDA2OEY2LAorMHgwMDIwMzRCOCwgMHgwMDIwMzM5QywgMHgwMDIwMzQxQywgMHgwMDIwMzE5QywKKzB4MDAyMDExNjIsIDB4MDAyMDJEOTAsIDB4MDAyMDExODAsIDB4MDAxRTIxMkMsCisweDAwMjAzNEEwLCAweDAwMjAzNEE0LCAweDAwMjAxNDVFLCAweDAwMjAyRDJDLAorMHgwMDIwMzRCQywgMHgwMDIwMTFFNCwgMHgwMDIwMzFCQywgMHgwMDIwMzFDNCwKKzB4MDAyMDMxQjgsIDB4MDAyMDMxQkEsIDB4MDAyMDJDODAsIDB4MDAyMDE0QUEsCisweDAwMDA4MDAwLCAweDRGMjIyRkU2LCAweDZFMjJEMjEyLCAweEM4NDA2MEUzLAorMHgyMkUyOEQwMiwgMHgwMDA5QkNGQSwgMHg0MjE4RTI0MCwgMHg4OTAxMkUyOCwKKzB4MDAwOUJEMDUsIDB4QzgxMDYwRTMsIDB4RDQwQjg5MDUsIDB4NDIwQkQyMEIsCisweEJEMDQwMDA5LCAweDYwRTMwMDA5LCAweDg5MDFDODA1LCAweDAwMDlCREVCLAorMHhDODAyNjBFMywgMHg0RjI2ODkwMiwgMHg2RUY2QUQwMSwgMHgwMDBCNEYyNiwKKzB4MDAwMDZFRjYsIDB4MDAxQzM1MTAsIDB4MDAyMDM0QjAsIDB4MDAyMDE0NUUsCisweDA4MEEwQzBFLCAweDAwMDIwNDA2LCAweDFBMUMxRTIwLCAweDEyMTQxNjE4LAorMHgyRTMwMzIzNCwgMHgyNjI4MkEyQywgMHgzQTNDM0U0MCwgMHg2QzYyNTY0OCwKKzB4NDExMTJGMjYsIDB4RTIyMDhGMTgsIDB4ODkwQjMxMjMsIDB4MzIxQ0QyMDQsCisweEQxMDI2MjIwLCAweDQxMkIzMTJDLCAweDAwMDkwMDA5LCAweDAwMjAyQ0FBLAorMHgwMDIwMkM2MCwgMHgwMDBCRTAwMCwgMHg0MDAwNjJGNiwgMHg0MDAwNDAwMCwKKzB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NjJGNjAwMEIsIDB4NDAwMDQwMDAsCisweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMTg0MDAwLCAweDYyRjYwMDBCLAorMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg0MDI4NDAwMCwKKzB4NjJGNjAwMEIsIDB4NDAwMDQwMDAsIDB4NDAxODQwMDAsIDB4MDAwQjQwMjgsCisweEM5MEY2MkY2LCAweDQwMDU0MDA1LCAweDQwMDU0MDA1LCAweDYyRjYwMDBCLAorMHg0MDA1QzkwNywgMHg0MDA1NDAwNSwgMHg2MkY2MDAwQiwgMHg0MDA1QzkwMywKKzB4MDAwQjQwMDUsIDB4QzkwMTYyRjYsIDB4MDAwQjQwMDUsIDB4MDAwMDYyRjYsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NTQ0RjBEMEEsCisweDQ2MjA1MzU1LCAweDAwMDAzQTU3LCAweDIwNkM3NTRBLCAweDMyMjAzNTMyLAorMHgyMDM3MzAzMCwgMHgzMTNBMzEzMiwgMHgzNzMyM0EzMiwgMHgwMDAwMDAwMCwKKzB4MDAwMDBEMEEsIDB4MDAwMDAwNDMsIDB4NDI3MDczNzIsIDB4M0QyMDY2NzUsCisweDU1NEUyMDNELCAweDIwMkM0QzRDLCAweDZFNDk2NzdBLCAweDRFNDk3Mjc0LAorMHg2RDc1NEU1MSwgMHgwMDAwMDAzRCwgMHg2MTc2NkU0OSwgMHgyMDY0Njk2QywKKzB4NzI2NTczNzUsIDB4MjA3MjZGMjAsIDB4MjA3OTY1NkIsIDB4MDAyMTQ0NDksCisweDUyNTA0NTQ1LCAweDU3MjA0RDRGLCAweDY1NzQ2OTcyLCAweDY0NjEyMDJDLAorMHgwMDNENzI2NCwgMHg2QzYxNzYyMCwgMHgwMDAwMDAzRCwgMHgwMDAwMEEwRCwKKzB4NkU2QjZFNTUsIDB4MjA2RTc3NkYsIDB4NkQ2RDZGNjMsIDB4M0Q2NDZFNjEsCisweDAwMDAwMDAwLCAweDAwMEEwRDUyLCAweDIwM0EzMDUxLCAweDAwMDAwMDIwLAorMHgyMDNBMzE1MSwgMHgwMDAwMDAyMCwgMHgyMDNBMzI1MSwgMHgwMDAwMDAyMCwKKzB4MjAzQTMzNTEsIDB4MDAwMDAwMjAsIDB4MjAzQTM0NTEsIDB4MDAwMDAwMjAsCisweDYxNDM3NzQ4LCAweDcyNjI2OTZDLCAweDZGNjk3NDYxLCAweDY2MjAyMDZFLAorMHgwQTZDNjk2MSwgMHgwMDAwMDAwRCwgMHg3MzY5NkY0RSwgMHg2MTQzMjA2NSwKKzB4NzI2MjY5NkMsIDB4NkY2OTc0NjEsIDB4NjE2NjIwNkUsIDB4MjEyMTZDNjksCisweDAwMDAwRDBBLCAweDAwMDAwMDcyLCAweDAwMjA1MjIwLCAweDAwMDAwRDBBLAorMHg2MjczNTU3NiwgMHg3NDczNzI1RiwgMHgwMDAwMEEwRCwgMHg2MjczNTU3NiwKKzB4NzM3NTczNUYsIDB4NjQ2RTY1NzAsIDB4MDAwMDBBMEQsIDB4NjI3MzU1NzYsCisweDczNjU3MjVGLCAweDAwMEEwRDZELCAweDAwMDAwMDQyLCAweDcyNzQ2RTQ5LAorMHg2RDY1MjA1MSwgMHgyQzc5NzQ3MCwgMHg0OTY3N0EyMCwgMHg0OTcyNzQ2RSwKKzB4NzU0RTUxNEUsIDB4MDAwMDNENkQsIDB4NjU0QzcyNDUsIDB4MDAwMDAwNkUsCisweDAwMDAwMDQ5LCAweDIwNzQ2RjRFLCAweDc1NkY2RTY1LCAweDQ5MjA2ODY3LAorMHg0MjIwNTE0RSwgMHgwQTBENjY3NSwgMHgwMDAwMDAwMCwgMHgwMDAwMDBGRiwKKzB4MDAwMjAwMDEsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMTBFMDEwRCwKKzB4MDAwMjAwMDMsIDB4MDEwOTAxMDgsIDB4MDAwMjAxMEEsIDB4MDIwMDAwMDMsCisweDAyMDIwMjAxLCAweDAyMDQwMjAzLCAweDAyMDYwMjA1LCAweDAyMDIwMjAwLAorMHgwMjA0MDIwMywgMHgwMjBDMDIwNywgMHgwMjBFMDIwRCwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAxMEUwMTBELAorMHgwMEZGMDEwRiwgMHgwMTA5MDEwOCwgMHgwMTBCMDEwQSwgMHgwMjAwMDBGRiwKKzB4MDIwMjAyMDEsIDB4MDIwNDAyMDMsIDB4MDIwNjAyMDUsIDB4MDIwMjAyMDAsCisweDAyMDQwMjAzLCAweDAyMEMwMjBCLCAweDAyMEUwMjBELCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDAyMDUyMjAsCisweDAwMDAwMDQ2LCAweDAwMDAwMDU5LCAweDczMjA0MTQyLCAweDAwM0Q3MTY1LAorMHg0OTU0NDEyMCwgMHgwMDAwMjA0RCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAyRTAyMDksIDB4ODAwMDAxMDEsIDB4MDAwNDA5RkEsIDB4MDBGRjA0MDAsCisweDA1MDcwMDAwLCAweDAyMDAwMjAxLCAweDgyMDUwNzAwLCAweDAwMDIwMDAyLAorMHgwMzgzMDUwNywgMHgwNzAxMDA0MCwgMHg0MDAyMDQwNSwgMHgwMjA5MDAwMCwKKzB4MDEwMTAwMkUsIDB4MDlGQTgwMDAsIDB4MDQwMDAwMDQsIDB4MDAwMDAwRkYsCisweDAyMDEwNTA3LCAweDA3MDAwMDQwLCAweDQwMDI4MjA1LCAweDA1MDcwMDAwLAorMHgwMDQwMDM4MywgMHgwNDA1MDcwMSwgMHgwMDAwNDAwMiwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDcwOTAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIH07CisKK2NvbnN0IHUzMl90IHpjRndJbWFnZVNpemU9MTM2NTY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd3VfRkI1MF9tZGsuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3dV9GQjUwX21kay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMTczNmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd3VfRkI1MF9tZGsuYwpAQCAtMCwwICsxLDcyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSAiY3ByZWNvbXAuaCIKKworY29uc3QgdTMyX3QgemNGd0ltYWdlW10gPSB7CisweDAwMDkwMDBCLCAweDRGMjIyRkU2LCAweEQyMjg3RkZDLCAweDAwMDk0MjBCLAorMHgwMDA5QjAxOSwgMHg5NDQ2RDUyNiwgMHhFNjAwQTAwMywgMHg4RDA0MzY0MiwKKzB4NjA1Mjc2MDEsIDB4OERGOUM4NDAsIDB4RDQyMjJGMDIsIDB4NEUwQkRFMjIsCisweEQ0MjIwMDA5LCAweDAwMDk0RTBCLCAweDRFMEJENDIxLCAweDdGMDQwMDA5LAorMHhBMDI1NEYyNiwgMHg0RjIyNkVGNiwgMHg0MTBCRDExRSwgMHhENDFFMDAwOSwKKzB4MDAwOTQ0MEIsIDB4NDUwQkQ1MUQsIDB4RDcxRDAwMDksIDB4NjExREUxRkYsCisweDI3MTJEMjFDLCAweEQ0MUM1MDI5LCAweEUxRkZDQjAxLCAweDEyMDlFNTAxLAorMHgxMjExMjIxMiwgMHhENTE5MjQ1MiwgMHhENjE5OTcxNiwgMHhFNzAwMjU3MiwKKzB4MjY3MEQyMTgsIDB4MjI3MkQ2MTgsIDB4NEYyNkUyMDEsIDB4MjYyMjAwMEIsCisweEREMTdEQzE2LCAweDRDMEJERTE3LCAweDREMEIwMDA5LCAweDRFMEIwMDA5LAorMHhBRkY4MDAwOSwgMHgyNzEwMDAwOSwgMHgwMDAwMDY0MCwgMHgwMDIwMDk1QSwKKzB4MDAxQzAwMUMsIDB4MDAyMDI5NDAsIDB4MDAyMDBFMkEsIDB4MDAyMDI5NEMsCisweDAwMjAyOTY0LCAweDAwMjAwQ0YwLCAweDAwMjAwRjI2LCAweDAwMjAwOUM0LAorMHgwMDFDMzUxMCwgMHgwMDFDMzYyNCwgMHgwMDFFMjEyQywgMHgwMDIwMjhFQywKKzB4MDAyMDI4NTAsIDB4MDAyMDI4RjQsIDB4MDAyMDI5MDAsIDB4MDAyMDBCRUMsCisweDAwMjAxRkQ0LCAweDAwMjAxN0I4LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LAorMHhERUExN0ZBNCwgMHg2MUUwRTAxQywgMHg3RDAxNkRFMywgMHg2MUQwMEYxNCwKKzB4RDU5RkQ0OUUsIDB4NDUwQkUwMjAsIDB4RTAyMDBGMTQsIDB4RTc4MDA0RkMsCisweDYwNEM2NkUyLCAweDdEN0Y2NzdDLCAweDFGNjkzMDcwLCAweDJENjI4RjE3LAorMHgwMUZDRTAxQywgMHg2NDFDRTUwMCwgMHhENzk3REU5NiwgMHgzMjQzNjI1RCwKKzB4QTIxQThCMDEsIDB4NjU1RDAwMDksIDB4MzFFQzYxNTMsIDB4RTAyODZDMTAsCisweDZENTMwRkM0LCAweDNEN0M2MkNFLCAweEFGRUYyRDIwLCAweDIwMDg3NTAxLAorMHhFMDFDOEIxNSwgMHhFNTAwMDFGQywgMHhENzhCREU4QSwgMHg2NDFDQTAwQSwKKzB4NkM1MzY1NUQsIDB4NjZDMjNDRUMsIDB4NjY2MjYyNTMsIDB4MjI2MjMyN0MsCisweDFGNjk3NTA0LCAweDMyNDM2MjVELCAweEExRjY4QkYyLCAweDg4MDEyRDEwLAorMHhFMDFDOEIxNiwgMHhFNDAwMDFGQywgMHg2NzFDMkQ0MCwgMHg2MjREREU3RCwKKzB4OEIwMTMyNzMsIDB4MDAwOUExRTksIDB4NjJFMzY0NEQsIDB4NzIwNDZENDMsCisweDNERUM2MTQzLCAweDY1RDIzMTJDLCAweDc0MDg2QzEyLCAweDI1QzJBRkVGLAorMHg4QjE4ODgwNCwgMHgwMUZDRTAxQywgMHgyRDQwRTQwMCwgMHhERTcxNjcxQywKKzB4MzI3MzYyNEQsIDB4QTFEMDhCMDEsIDB4NjQ0RDAwMDksIDB4NjJFMzZENDMsCisweDY1RDIzREVDLCAweDYxNDM3MjA0LCAweDY2MTIzMTJDLCAweDc0MDg2QzUyLAorMHhBRkVEMkM2OSwgMHg4ODA1MjVDMiwgMHhFMDFDOEIxOCwgMHhFNDAwMDFGQywKKzB4NjcxQzJENDAsIDB4NjI0RERFNjMsIDB4OEIwMTMyNzMsIDB4MDAwOUExQjUsCisweDZDNDM2NDRELCAweDNDRUM2MkUzLCAweDcyMDQ2NUMyLCAweDNEMkM2RDQzLAorMHg2MTUyNjZEMiwgMHgyMTZCNzQwOCwgMHgyNTEyQUZFRCwgMHg4QjEzODgzMCwKKzB4RTIwMERFNTgsIDB4NjRFMjJEMjAsIDB4OEIwNDI0NDgsIDB4NDIwQkQyNTcsCisweEExOUEwMDA5LCAweDU1RTEwMDA5LCAweDU3RTM1NkUyLCAweERENTQ1Q0U0LAorMHgyRkM2NEQwQiwgMHg3RjA0QTE5MSwgMHg4OTAxODgyOCwgMHgwMDA5QTBFQSwKKzB4RTE0M0RFNEMsIDB4NjIyRDYyRTEsIDB4OEYwMzMyMTcsIDB4NTZGQjFGRUIsCisweDI2MjFFMjQwLCAweDhCMDEzMjE3LCAweDAwMDlBMEQ1LCAweEUxMDE1RUZCLAorMHgzMDE2ODVFMSwgMHhBMENFOEIwMSwgMHhFNDAxMDAwOSwgMHgyRDQwNTVGQiwKKzB4NjQ1MUIxNzksIDB4RTE0MzU3RkIsIDB4RTA1NDYyNzEsIDB4MzUxNzY1MkQsCisweDBGNTY4RDQxLCAweDM1NjNFNjQwLCAweEU2MDA4QjA1LCAweDBGNjVFMDM0LAorMHhBMDBGRTExQSwgMHg2MTUzNzJDMCwgMHg0MTIxNDEyMSwgMHg0MTIxNDEyMSwKKzB4NDUyMTQxMjEsIDB4NDUyMTQ1MjEsIDB4QzkwMzYwNTMsIDB4RTAzNDY2MDMsCisweDcxMTgwRjY1LCAweDIyMDlFMDA3LCAweDY0MURFMDMwLCAweDBGMjU2NUYzLAorMHgxRjRFQjFGMSwgMHgwNEZERTAzNCwgMHg2NzRERTAzMCwgMHg0NzA4MENGRCwKKzB4NjA3MzYxQ0QsIDB4NDEwOEQyMkIsIDB4RTAwRjBDRkUsIDB4MUYxRjQyMEIsCisweDJDRDk2RDA3LCAweDVFRkI2MDczLCAweDg1RTIwRkM2LCAweDQyMEI1MUZGLAorMHgyQzBCNjAwRCwgMHg1NEZFNjA3MywgMHhCMUJCMEZDNiwgMHhFMDU0NjVGMywKKzB4NjUyRDYyRTEsIDB4RTY0MDBGNTYsIDB4ODk2MjM1NjMsIDB4RTA1MEUxMDAsCisweDYwMjMwRjE1LCAweDQwMDhDOTAzLCAweDZEMDM0MDAwLCAweEUwNDA2MTAzLAorMHhFMDQ0MEZENiwgMHhEMjE3RUVGRiwgMHg2RUVDMEZGNiwgMHgwRjI2RTA1OCwKKzB4NjBFMzQyMEIsIDB4NDIyMTYyNTMsIDB4NDIyMTQyMjEsIDB4NjYyMzQyMjEsCisweDMyNkM0MjAwLCAweDQ1MjE0MjAwLCAweEUwNDg2NzA3LCAweDBGNzY0NTIxLAorMHhDOTAzNjA1MywgMHg0MDA4NUNGQiwgMHg3QzA2MzBGQywgMHg2RTAzNkQyRCwKKzB4MUZENTFGQzYsIDB4MUYwNEEwMkUsIDB4MDAxMTdEMDAsIDB4MDAyMDI5NjgsCisweDAwMjAwRTJBLCAweDAwMTE3RDA0LCAweDAwMTE3RDg0LCAweDAwMjAwNzAwLAorMHgwMDIwMDc0QywgMHgwMDIwMjAzNCwgMHgwRkQ2RTA0QywgMHgwNUZFRTA0NCwKKzB4NjREM0IxODksIDB4NjRFMkUwNDgsIDB4RTA0MDA2RkUsIDB4MkU0MjI0NjksCisweDAxRkU2N0M0LCAweDY2N0NFMDU4LCAweDQyMEIwMkZFLCAweDI0MEI2MDYzLAorMHgwNUZFRTA0NCwgMHhCMTVEMkU0MiwgMHhFMDUwNjREMywgMHg3RDAxMDFGRCwKKzB4MEYxNTcxMDEsIDB4MDJGREUwNTAsIDB4MzI2MkU2MDYsIDB4NTZGQjhCREMsCisweDU1RkI2MjYxLCAweDg1NTE0MjAwLCAweDMwMkM3NTBDLCAweDYxMDM3MDFCLAorMHg2NEYzRTYwMCwgMHhFNzA0QTAwNCwgMHg3NjAxNjI1NiwgMHg3NDA0MjQyMiwKKzB4MzI3MzYyNkQsIDB4NjVGMzhCRjgsIDB4NjQxREIxM0MsIDB4QjBEMjU2RkIsCisweEEwQUE2NDYxLCAweEQ0ODgwMDA5LCAweEUyMDFENTg4LCAweDJEMjA0NTBCLAorMHgwMDA5QTBBMywgMHg4QjA3ODgyOSwgMHhFMjAwREU4NSwgMHg2NkUyMkQyMCwKKzB4NjQ2REIwQTEsIDB4MDAwOUEwOTksIDB4NjIyQ0UyODEsIDB4OEIzRDMwMjAsCisweEQ2ODBFNzM4LCAweEUwNDQyRDcwLCAweEUwNDgwQzZFLCAweDZFNjIxREMxLAorMHg1MTYxMURFMiwgMHg1NDYyMUQxMywgMHg1NTY1MUQ0NCwgMHg1NzYzMUQ1NSwKKzB4NUM2NjFENzYsIDB4MEU2RTFEQzcsIDB4MURFOEUwNDAsIDB4RTA1MDAxNkUsCisweDU0NjQxRDE5LCAweDA1NkUxRDRBLCAweDFENUJFMDRDLCAweEUwNTQwNzZFLAorMHgwQzZFMUQ3QywgMHgxRENERTA1OCwgMHhFMDQ0MDI2RSwgMHhFRDAwMUQyRSwKKzB4RTA0ODA2RDYsIDB4MTZEMTI2RDIsIDB4MTZENTE2RDIsIDB4MTZENjE2RDMsCisweEUwNDAwNkQ2LCAweEUwNTAwNkQ2LCAweDA2RDYxNkQ0LCAweDA2RDZFMDRDLAorMHgwNkQ2RTA1NCwgMHgwNkQ2RTA1OCwgMHgxRjI5QTA1NywgMHg2MjJDRTI4MiwKKzB4ODkzMTMwMjAsIDB4MDVGQ0UwMjAsIDB4NjI1Q0U2ODMsIDB4MzI2MDY2NkMsCisweEQ2NUQ4QjA3LCAweDI2NTBFNTAwLCAweDUyNjE3NjgwLCAweEEwNDRENjVCLAorMHhFNjkwMjYyMiwgMHgzMjYwNjY2QywgMHhEMjU3OEIxNiwgMHhFNTAwRDY1OCwKKzB4NjA2MjIyNTAsIDB4Q0IyMEQyNTcsIDB4RTYwNTI2MDIsIDB4RDY1NjIyNjIsCisweDIyNTI0NjBCLCAweDQyMEJEMjU1LCAweEQyNTUwMDA5LCAweDIyNjJFNjAxLAorMHg0NjE4RDI1NCwgMHgyMjYyQTAyOSwgMHhEMjU0RDQ1MywgMHhENDU0NjU0MiwKKzB4MDAwOTQyMEIsIDB4MDAwOUEwMjEsIDB4RTUyNEQ2NDcsIDB4RDU0NTI2NTAsCisweDE2MjE1MjU3LCAweDE2MjI1MjU4LCAweDE2MjM1MjU5LCAweDE2MjQ1MjVBLAorMHgxNjI1NTI1QiwgMHgxNjI2NTI1QywgMHgxNjI3NTI1RCwgMHgxNjI4NTI1RSwKKzB4MUYyOTUyNUYsIDB4RTIwMDE2MjksIDB4MTUyODE1MjcsIDB4MTUyQTE1MjksCisweDE1MkMxNTJCLCAweDE1MkUxNTJELCAweDdGNUMxNTJGLCAweDZFRjY0RjI2LAorMHgwMDBCNkRGNiwgMHg0RjIyNkNGNiwgMHhFMjQwNjE0RCwgMHg4OTE3MzEyMywKKzB4MzEyN0UyMUYsIDB4RDQzQjg5MDgsIDB4RTAwMUQ1M0IsIDB4NjY0MjQ1MEIsCisweDI2Nzk2NzA3LCAweDI0NjJBMDBDLCAweDMxMjdFMjNGLCAweEQ3MzU4OTA4LAorMHg3MUUwRDYzNSwgMHg0NjBCRTAwMSwgMHg2MjA3NTU3MSwgMHgxNzUxMjUyOSwKKzB4MDAwQjRGMjYsIDB4NEYyMjAwMDksIDB4RTI0MDYxNEQsIDB4ODkxNTMxMjMsCisweDMxMjdFMjFGLCAweEQ0MkI4OTA3LCAweDY2NDJEMjJCLCAweEUwMDE0MjBCLAorMHhBMDBCMjYwQiwgMHhFMjNGMjQ2MiwgMHg4OTA3MzEyNywgMHhENjI2RDcyNSwKKzB4NzFFMDU1NzEsIDB4RTAwMTQ2MEIsIDB4MTc1MTI1MEIsIDB4MDAwQjRGMjYsCisweEU2NDAwMDA5LCAweDQ2Mjg0NjE4LCAweDYyNTJENTIwLCAweDg5RkMyMjY4LAorMHgwMDA5MDAwQiwgMHg0NjE4RTY4MCwgMHhENTFDNDYyOCwgMHgyMjY4NjI1MiwKKzB4MDAwQjg5RkMsIDB4QTAwMTAwMDksIDB4NzIwMUUyMDAsIDB4OEJGQzMyNDIsCisweDAwMDkwMDBCLCAweDQ2MThFNjgwLCAweEQ1MTU0NjI4LCAweDIyNjg2MjUyLAorMHgwMDBCOEJGQywgMHgwMDAwMDAwOSwgMHgwMDIwMjk2QywgMHgwMDIwMEUyQSwKKzB4MDAxMTdEMDQsIDB4MDAyMDI4NTgsIDB4MDAxMTdEODAsIDB4MDAyMDI4RUMsCisweDAwMUMzNTAwLCAweDAwMUQ0MDA0LCAweDAwMjAwRjI2LCAweDAwMjAwOUM0LAorMHgwMDFFMjEyQywgMHgwMDFDM0QyOCwgMHgwMDExN0QwMCwgMHgwMDIwMEU4QSwKKzB4MDAyMDI5ODQsIDB4MDAxQzM3MDQsIDB4MDAyMDIwMzQsIDB4MDAxQzM3M0MsCisweDAwMUMzNzAwLCAweDRGMjIyRkU2LCAweDZFNTM3RkZDLCAweDJGNDJCRkNBLAorMHhENjE1NjFFMiwgMHgxNjE1RTI4MCwgMHg0MjE4NTRFMSwgMHg1NUUyMTY0NiwKKzB4MTY1NzQyMjgsIDB4NkVGMjU3RTMsIDB4MkUyQjE2NzgsIDB4N0YwNDI2RTIsCisweEFGQTc0RjI2LCAweDJGQzY2RUY2LCAweDJGRTYyRkQ2LCAweEREMEE0RjIyLAorMHhCRkFGNkM1MywgMHhCRjk0NkU0MywgMHhCRkFCMkRFMiwgMHg1MUQ1MDAwOSwKKzB4NTRENjJDMTIsIDB4NTVENzFDNDEsIDB4NTZEODFDNTIsIDB4NEYyNjFDNjMsCisweDZERjY2RUY2LCAweDZDRjYwMDBCLCAweDAwMUMzNzBDLCAweDAwMDlBMEY4LAorMHhEMTlCNEYyMiwgMHhENDlCOTI5OSwgMHgyMTIyQjAwRCwgMHg5Nzk1RTYwNSwKKzB4QjAyMjk1OTUsIDB4QjAzNjY0NjMsIDB4QjAzQTAwMDksIDB4QjAzRDAwMDksCisweEEwNkMwMDA5LCAweDRGMTI0RjI2LCAweEQxOTM0RjAyLCAweDk0ODczMTQ1LAorMHg0NjA5MDYwQSwgMHg0NjA5NDYwOSwgMHgwMDI5MzY0NiwgMHhENzhDRDU4RiwKKzB4MjUwMENBMDEsIDB4NEYwNjI3NjIsIDB4NEYxNjAwMEIsIDB4QkZFQTRGMjIsCisweEIwMjMwMDA5LCAweEEwNTIwMDA5LCAweDJGRTY0RjI2LCAweDZFNjNEMTg4LAorMHg0NDE4NjYxMiwgMHg0NTI4OTI2RCwgMHgyNjI5NDQwOCwgMHg0NDA4NDUwMCwKKzB4NDQwMDI2NUIsIDB4NDcwODI2NEIsIDB4NDcwODIxNjIsIDB4MjdFQkQxODEsCisweDAwMEIyMTcyLCAweEQxODA2RUY2LCAweEU2MDNENDgwLCAweDAwMEIyMTYyLAorMHhEMjdGMjQ2MiwgMHhFNDBBOTY1NiwgMHgyMjYyQUZCMCwgMHgyRkM2MkZCNiwKKzB4MkZFNjJGRDYsIDB4REM3QjRGMjIsIDB4MkMyMkUyMDEsIDB4QkZBNUU0MEEsCisweDYwQzI3QzQ0LCAweENCMDFFRDAwLCAweDYwQzIyQzAyLCAweEM5MDFFQjY0LAorMHg2RTAzQTAwOCwgMHg4OTA3M0RCMiwgMHhFNDAxNjBDMiwgMHhCRjk1QzkwMSwKKzB4N0QwMTZFMDMsIDB4OEJGNTJFRTgsIDB4OEIwMzNEQjIsIDB4RDI2RkQ0NkUsCisweDAwMDk0MjBCLCAweDRGMjZFNDBBLCAweDZERjY2RUY2LCAweEFGODU2Q0Y2LAorMHg0NDExNkJGNiwgMHg2MDRCOEYwMSwgMHgwMDBCNjA0MywgMHgyRjg2MDAwOSwKKzB4MkZBNjJGOTYsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4N0ZGQzRGMjIsCisweDZEQTNFQTAwLCAweERDNjI2QkEzLCAweDk5MTRFODY0LCAweDhCNEUyQkI4LAorMHgzQUUzRUUwQSwgMHg2MEMyODk0QiwgMHhDQjAyRUQwMCwgMHg2MkMyMkMwMiwKKzB4MkYwMjYwQzIsIDB4QTAxMEM5MDIsIDB4MDk2QzZFMDMsIDB4NUJCNDUyODgsCisweDFGRkYwOUI0LCAweDAxRkYwM0M0LCAweDg5MDgzRDgzLCAweEU0NjQ2MEMyLAorMHhDOTAyMkYwMiwgMHg2RTAzQkY1MiwgMHgyRUU4N0QwMSwgMHhEMTUxOEJGNCwKKzB4NTRDMUQ1NTEsIDB4NjY1MjY0MTIsIDB4NjI2OUVFMDEsIDB4NDIyMDYyMkYsCisweDYyMkY0MjE5LCAweDRFMTgyMjk5LCAweDhEMDMyMkU4LCAweEU0RkY2NDIzLAorMHgzNDI4MjI5QSwgMHg2NTcyRDc0OSwgMHg2MjJGNjI1OSwgMHg0MjE5NDIyMCwKKzB4MjI5OTYyMkYsIDB4OEQwMzIyRTgsIDB4RTZGRjY2MjMsIDB4MzYyODIyOUEsCisweDM0NjhCRkE3LCAweDMwRTJFRTAyLCAweEFGQjc4OTAxLCAweEQyNDBFQjAxLAorMHg2RUVDRUVFNiwgMHhCRjIxRTQwQSwgMHhBRkFGMjJFMiwgMHhFRTBBN0EwMSwKKzB4ODkwMTNBRTMsIDB4OEIwMzNEODMsIDB4RDIzNEQ0M0EsIDB4MDAwOTQyMEIsCisweDRGMjY3RjA0LCAweDZERjY2RUY2LCAweDZCRjY2Q0Y2LCAweDY5RjY2QUY2LAorMHg2OEY2MDAwQiwgMHg1NjUxRDUzNCwgMHg0NjI4NjA1MiwgMHgzMDZDMDAwQiwKKzB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4NEYxMjRGMjIsIDB4QkZGMTRGMDIsCisweDZCMDM2RTQzLCAweEREMUNEQzJELCAweDAwMDlCRkVDLCAweDNDMDUzMEI4LAorMHg0NjA5MDYwQSwgMHg0NjAxNDYwOSwgMHgwMjBBM0Q2NSwgMHg0MjA5NDIwOSwKKzB4MzJFMjQyMDksIDB4NEYwNjhCRjAsIDB4NEYyNjRGMTYsIDB4NkRGNjZFRjYsCisweDAwMEI2Q0Y2LCAweDJGRTY2QkY2LCAweERFMjE0RjIyLCAweEU1MDBFMTAyLAorMHgyRTEyRTQwMywgMHgyRTUyQkZENCwgMHg0NjE4RTYwNiwgMHhFNDAzRTcwMCwKKzB4MkU3MjJFNjIsIDB4QUZDQjRGMjYsIDB4NEYyMjZFRjYsIDB4MDAwOUJGRUIsCisweEU2RTZEMjEzLCAweEU0MEE2NjZDLCAweDIyNjJCRkMyLCAweDRGMjZBRkUzLAorMHgwMDIwMjhGMCwgMHgwMDI0Q0RFMCwgMHgxMDYyNEREMywgMHgwMDIwMkFGMCwKKzB4MDAxQzU4MTQsIDB4MDAxQzU5RDAsIDB4MDAxQzU5QTQsIDB4MDAxQzYzOUMsCisweDAwMUM1ODA0LCAweDAwMUM1ODFDLCAweDAwMjAyOTk4LCAweDAwMjAwRTJBLAorMHgwMDFDNTg2MCwgMHgwMDFDNjg2NCwgMHgwMDFDNTlCQywgMHgwMDFDNjlCQywKKzB4MDAxQzk0N0MsIDB4MDAyMDI5QjAsIDB4MDAxQzEwNDAsIDB4Q0NDQ0NDQ0QsCisweDAwMUQ0MDA0LCAweDJGOTYyRjg2LCAweDJGQjYyRkE2LCAweDJGRDYyRkM2LAorMHg0RjIyMkZFNiwgMHhFNDAwN0ZFNCwgMHg0NTI4RTUxMCwgMHg2NzQzNkM0MywKKzB4RTEwN0EwMEYsIDB4NjA0MzY0NEQsIDB4MEY1NjQwMDgsIDB4RUUwMDYwQzMsCisweDgxNTEyNUMxLCAweDgxNTM4MTUyLCAweDE1NzMxNUUyLCAweDc1MTQxNUU0LAorMHg2MjRENzQwMSwgMHg4QkVEMzIxMywgMHhEQTZGNTFGMSwgMHgxQTExNTRGMiwKKzB4RDE2RTJBMTIsIDB4NTdGNDU1RjMsIDB4NkRGMjU4RjUsIDB4MTE0MUQ5NkMsCisweDExNTMyMTQyLCAweDExNzUxMTUyLCAweDExODcxMTc0LCAweDUyRjYxMTg2LAorMHgxOUQxRDY2OCwgMHhEODY4MjlEMiwgMHhEQTY4RTk1MCwgMHgxNjIxRUJCNCwKKzB4NkJCQzI2MjIsIDB4QTAyMTQ5MDgsIDB4NkVFREVFMDAsIDB4NjFFMzZERTMsCisweDQxMDg0RDA4LCAweDMxRUMzREVDLCAweDQxMDg0RDA4LCAweDYwQzMzRDhDLAorMHhFNzkwNDEwOCwgMHg4MUQxMkRDMSwgMHg0MTA4NjA5MywgMHg4MUQyNjc3QywKKzB4MzFBQzYwQzMsIDB4MzQ3MkUyMDAsIDB4MUREMjgxRDMsIDB4RDQ1NTFEMTMsCisweDFEMjQ4RDAxLCAweEIwM0FENDUwLCAweDdFMDE2NUQzLCAweDM0QjI2NEVELAorMHhEMTREOEJEQiwgMHg2NTEyREI1MiwgMHg0NTI5RDI0RCwgMHg2NDEyMUI1MSwKKzB4Njc0REQxNEEsIDB4NjcyMjJCNzIsIDB4NDcyOUQ2NEUsIDB4NjkyMjFCNzMsCisweDY4OUQyRkQyLCAweDY5MTIxQjgyLCAweDVBMTIyNjkyLCAweDVCMTQxNkEyLAorMHgxNkI0REE0NCwgMHgxNkM2NUMxNiwgMHgxNkVBNkVBMiwgMHg0RjI2N0YxQywKKzB4NkRGNjZFRjYsIDB4NkJGNjZDRjYsIDB4NjlGNjZBRjYsIDB4NjhGNjAwMEIsCisweDYwNjE2NjQyLCAweDhEMDRDODAzLCAweDYwNjFFNTAwLCAweDg4MDJDOTAzLAorMHg1MjYyOEIwMywgMHg1MTI0NjU2MywgMHgwMDBCMjQxMiwgMHgyRkQ2NjA1MywKKzB4NEYyMjJGRTYsIDB4NkU1MzdGRUMsIDB4RTU1MDYyNTMsIDB4RTQwMDZENDMsCisweEEwMDE0NTA4LCAweDUyMjRFMTAxLCAweDIyMTE2MDQzLCAweDgxMjM4MTIxLAorMHg4MTIyNjA1MywgMHgzNjIwNTZFMiwgMHhEMjJGOEJGNSwgMHg2NEYzMTZFNCwKKzB4NDIwQkU2MTQsIDB4NjVFMTY1RTMsIDB4MjU0OUU0RkMsIDB4NjFGMTJFNTEsCisweDIxNDk2NUYzLCAweDU0RDEyRjExLCAweDQxMEJEMTI3LCAweDU3RDFFNjE0LAorMHhDQjAxNjA3MSwgMHgxREUxMjcwMSwgMHg0RjI2N0YxNCwgMHgwMDBCNkVGNiwKKzB4MkZENjZERjYsIDB4NEYyMjJGRTYsIDB4NkU1MzdGRUMsIDB4RTVGQzY2NTMsCisweDYwNjE2RDQzLCAweENCMDEyMDU5LCAweDUyRTIyNjAxLCAweDhCMDYzMjYwLAorMHg1MUUyMTJFNCwgMHg4QjA0MzFFMCwgMHhBMDAyNTJEMSwgMHhBRkYwMUUyMiwKKzB4RDIxNTU2NjQsIDB4RTYxNDY0RjMsIDB4NjVFMzQyMEIsIDB4RTFGQzY3RTEsCisweDJFNzEyNzE5LCAweDU0RDE2N0YxLCAweEQxMEYyNzE5LCAweEU2MTQ2NUYzLAorMHgyRjcxNDEwQiwgMHg2MDIxNTJEMSwgMHgyMjAxQ0IwMSwgMHg3RjE0MURFMSwKKzB4NkVGNjRGMjYsIDB4NkRGNjAwMEIsIDB4MDAyMDI4QkMsIDB4MDAyMDI4QzQsCisweDAwMjAyOEI0LCAweDAwMjAyOEU0LCAweDAwMTAwMDhDLCAweDAwMTAwRUMwLAorMHgwMDFFMjEwOCwgMHgwMDFDM0QwMCwgMHgwMDIwMjE5NCwgMHgyRkM2MkZCNiwKKzB4MkZFNjJGRDYsIDB4RDYzMTRGMjIsIDB4NjBEMzZENjIsIDB4ODk0REM4MDMsCisweERCMzBEQzJGLCAweDAwMDlBMDJDLCAweEM5MDM2MDYxLCAweDg5MkI4ODAxLAorMHhEMjJERDQyQiwgMHgwMDA5NDIwQiwgMHg2NTAzNTYwMywgMHhDODIwODU2MSwKKzB4RTA1MDg5MDMsIDB4NzIwMTAyQkUsIDB4ODU2MjBCMjYsIDB4NDAwMDYwMEQsCisweDQwMDAzNjZBLCAweDQwMDA0NjI0LCAweDIwNkQ0NjI0LCAweEQ0MjNDOTAzLAorMHg0MDA4NkUwMywgMHhEMTIyNDAwMCwgMHgzNDBDNDEwQiwgMHg2MUUzRDUyMSwKKzB4RDcyMUUwMDEsIDB4NDUwQkQyMjEsIDB4NjRFMzdFMzAsIDB4MjcwMjQyMEIsCisweDY2QzI1MkMxLCAweDhCQ0YzNjIwLCAweDRFMThFRTAxLCAweEEwMTFEQjFDLAorMHg2MDYxRUM3NSwgMHg4ODAxQzkwMywgMHhENDE5ODkxMCwgMHg0NjBCRDYxMiwKKzB4RDQxODAwMDksIDB4NDcwQkQ3MTgsIDB4RDIxMzY1MDMsIDB4NjRDM0QxMTMsCisweDIyRTI0MTBCLCAweDY2QjI1MkIxLCAweDhCRUEzNjIwLCAweEM4MDQ2MEQzLAorMHhEMjEyODkwNiwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QkY2NDIyQiwKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjAwMEIsIDB4MDAxRTIxMDAsCisweDAwMjAyOEJDLCAweDAwMjAyODU4LCAweDAwMjAwQUUwLCAweDAwMjAyOEM0LAorMHgwMDIwMEI2MiwgMHgwMDIwMjAzNCwgMHgwMDFDM0QzMCwgMHgwMDIwMERGMCwKKzB4MDAyMDI4QjQsIDB4MDAyMDI4RTQsIDB4MDAyMDBBRkUsIDB4MDAyMDAwRjgsCisweEU2MDFEMjM3LCAweDEyNjVENTM3LCAweDAwMEIyMjUyLCAweEQ2MzYxMjY2LAorMHg4ODAxNjA2MiwgMHhFMTAxOEI2MiwgMHhENTM0MjYxMiwgMHg1NDUxRDEzNCwKKzB4RTA0MDYyMTIsIDB4MjEyMjMyNEMsIDB4NTQxMTU3NTIsIDB4MTE0MTM0N0MsCisweDU3MTI1NDUzLCAweDExNzIzNzRDLCAweDUyMTM1NzU1LCAweDExMjMzMjdDLAorMHg1NjE0NjQ1MiwgMHgxMTY0MzY0QywgMHg1NDE1NTc1NCwgMHgxMTQ1MzQ3QywKKzB4NTYxNjU0NTgsIDB4MTE2NjM2NEMsIDB4Njc2MkQ2MjYsIDB4MzI3QzUyMTcsCisweDU3NjExMTI3LCAweDMyN0M1MjE4LCAweDU3NjIxMTI4LCAweDMyN0M1MjE5LAorMHg1NzYzMTEyOSwgMHgzNDdDNTQxQSwgMHg1NzY0MTE0QSwgMHgzNDdDNTQxQiwKKzB4NTc2NTExNEIsIDB4MzQ3QzU0MUMsIDB4NTI2NjExNEMsIDB4MzcyQzU3MUQsCisweDUyNjcxMTdELCAweDM0MkM1NDFFLCAweDUyNjgxMTRFLCAweDM2MkM1NjFGLAorMHhENjE1MTE2RiwgMHgwNDFFNjI2MiwgMHgzNDJDNzY5NCwgMHhFMDQ0MDE0NiwKKzB4MDYxRTYyNjIsIDB4MDE2NjM2MkMsIDB4NTI1Q0UwNDgsIDB4RDYwRjA1MUUsCisweDAxNTYzNTJDLCAweEUwNTQ2MjYyLCAweDQyMjkwNTFFLCAweDAxNTYzNTJDLAorMHhFMDU4NTU2MSwgMHg0NTI5MDYxRSwgMHgwMTY2MzY1QywgMHgwMDA5MDAwQiwKKzB4MDAxQzEwMTAsIDB4MDAwMEMzNEYsIDB4MDAxQzEwMjgsIDB4MDAxQzM2OUMsCisweDAwMjAyODU4LCAweDAwMUMzQ0EwLCAweDAwMUMzNkY0LCAweDAwMUMzQjg4LAorMHhENjJGN0ZGQywgMHgyNjQyNjQ0QywgMHhDODIwNTA2NiwgMHgyRjAyOERGQywKKzB4N0YwNDAwMEIsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4NkQ0MzZDNTMsCisweEVFMDBBMDA0LCAweDdFMDE2NEQ0LCAweDY0NENCRkVBLCAweDhCRjkzRUMyLAorMHg2RUY2NEYyNiwgMHgwMDBCNkRGNiwgMHhBMDAxNkNGNiwgMHg3NjAxNjY0MywKKzB4MjIyODYyNjAsIDB4MzY0ODhCRkIsIDB4NjU2M0FGRTQsIDB4MkZCNjJGOTYsCisweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweEVDMUNFRDA4LCAweERCMTk2RTUzLAorMHg2MUMzRTkwQSwgMHg2MDQzNEIwQiwgMHgzMDkyQzkwRiwgMHg2NjAzOEQwMiwKKzB4NzYzMEEwMDEsIDB4NEQxMDc2MzcsIDB4N0UwMTJFNjAsIDB4N0NGQzhGRjEsCisweDgwNThFMDAwLCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDAwMEI2QkY2LAorMHgwMDBCNjlGNiwgMHgwMDBCRTAwMCwgMHgyRkU2RTAwMCwgMHg3RkVDNEYyMiwKKzB4NkU0MzYyNTMsIDB4QkZEMTY1RjMsIDB4QkZDNjY0MjMsIDB4QkZDNDY0RTMsCisweEQ0MDU2NEYzLCAweDAwMDlCRkMxLCAweDRGMjY3RjE0LCAweDZFRjYwMDBCLAorMHgwMDFDMDAwNCwgMHgwMDIwMjBGNCwgMHgwMDIwMjlDQywgMHhFMTEwRDU5QywKKzB4RTY0MDYwNTAsIDB4MjUwMEM5RkQsIDB4RTBGRjc1RTksIDB4ODA1MTY0NTMsCisweDgwNTM4MDUyLCAweDgwNTY4MDU1LCAweDI1MTA3NUVGLCAweEUxRUY2MjUwLAorMHgyMjE5RTAwMSwgMHhFNzIwMjUyMCwgMHgyNDYwODA1MiwgMHgyNTcwMDAwQiwKKzB4RTRGREQ1OTAsIDB4RTcwMjYxNTIsIDB4MjUxMjIxNDksIDB4NzQwMTYwNTIsCisweDI1MDJDQjAxLCAweEQxOEM2NjUyLCAweDI1NjIyNjQ5LCAweDkyQzI2MDEyLAorMHgyMTAyQ0IwOCwgMHhDOUNGNjAxMiwgMHg2MDEyMjEwMiwgMHgyMTAyQ0IwMywKKzB4MDAwQjExNzIsIDB4NEYyMjExMjMsIDB4RTEwMEQ0ODQsIDB4RDI4NUQ3ODQsCisweEQ1ODUyNDEwLCAweDI3MTFENDg1LCAweDIyMTFFNzAwLCAweEJGQkQyNTExLAorMHhENTgzMjQ3MSwgMHgyNTYwRTYwMCwgMHg0RjI2QUZEMiwgMHhEMjgxNjY0QywKKzB4MzYyQzQ2MDAsIDB4Q0IxMDYwNjAsIDB4MjYwMDAwMEIsIDB4RDI3RDY1NEMsCisweDM1MkM0NTAwLCAweEUxRUY2NjUwLCAweDAwMEIyNjE5LCAweDY2NEMyNTYwLAorMHg0NjAwRDI3OSwgMHg2MDYwMzYyQywgMHgwMDBCQ0IxMCwgMHg2NTRDMjYwMCwKKzB4NDUwMEQyNzUsIDB4NjY1MDM1MkMsIDB4MjYxOUUxRUYsIDB4MjU2MDAwMEIsCisweEQyNzA2NjRDLCAweDM2MkM0NjAwLCAweENCMDg2MDYwLCAweDI2MDAwMDBCLAorMHhEMjZDNjU0QywgMHgzNTJDNDUwMCwgMHhFMUY3NjY1MCwgMHgwMDBCMjYxOSwKKzB4NjY0QzI1NjAsIDB4NDYwMEQyNjgsIDB4NjA2MDM2MkMsIDB4MDAwQkNCMDgsCisweDY1NEMyNjAwLCAweDQ1MDBEMjY0LCAweDY2NTAzNTJDLCAweDI2MTlFMUY3LAorMHgyNTYwMDAwQiwgMHhENjVGNjI0QywgMHgzMjZDNDIwMCwgMHhDOTA4NjAyMCwKKzB4NDAyMTQwMjEsIDB4MDAwQjQwMjEsIDB4NjI0QzYwMEMsIDB4NDIwMEQ2NUEsCisweDYwMjAzMjZDLCAweDQwMjFDOTA4LCAweDQwMjE0MDIxLCAweDYwMEMwMDBCLAorMHhEMTU2NjQ0QywgMHgzNDFDNzRGRiwgMHgwMDBCNjI0MCwgMHhEMTU0NjAyQywKKzB4MzQxQzY0NEMsIDB4MDAwQjYyNDAsIDB4MkZFNjYwMkMsIDB4NjU1QzRGMjIsCisweDM1NjdFNjBBLCAweDZFNDM4RDE1LCAweDY0NTNCRkVBLCAweDYwRUM2NDBDLAorMHg4QjAyODgwMSwgMHhBMDAyRTAwRiwgMHg0NDA5MjQwOSwgMHg2MjRDNDQwOSwKKzB4MzI2M0U2MEEsIDB4QkZFMjg5MDUsIDB4NjIwQzY0NEMsIDB4Qzg4MDYwMjMsCisweEUyMDA4QjAwLCAweDRGMjY2MDIzLCAweDZFRjYwMDBCLCAweEQ2NDE0RjIyLAorMHg4ODAxNjA2MiwgMHhCMjIyOEIwMywgMHhBMDAzMDAwOSwgMHhEMjNFMDAwOSwKKzB4MjI2MEU2NDAsIDB4RTIwMEQ2M0QsIDB4MDAwQjRGMjYsIDB4NEYyMjI2MjIsCisweDYwNjJENjM4LCAweDhCMDE4ODAyLCAweDAwMDlCMjZDLCAweEUyMDBENjM3LAorMHgwMDBCNEYyNiwgMHgwRkZGMjYyMiwgMHhENDMzRDUzMiwgMHhFNzAxRTEwMCwKKzB4MDAwQjI1MTIsIDB4RDIzMDI0NzAsIDB4MDAwQkU2MDQsIDB4RDUyMDIyNjAsCisweDYxNTBFNEZELCAweDIxNDlENjJFLCAweDI1MTBFNzAwLCAweDI2NzAwMDBCLAorMHhFNEZCRDUxQiwgMHgyMjQ5NjI1MCwgMHgyNTIwMDAwQiwgMHhFNEY3RDUxOCwKKzB4MjI0OTYyNTAsIDB4MjUyMDAwMEIsIDB4RDIyNjRGMjIsIDB4NjAwRDg1MjIsCisweDg5MTEyMDA4LCAweDg5MTM4ODAxLCAweDg5MTU4ODAzLCAweDg5MTc4ODA1LAorMHg4OTQxODgwNiwgMHg4OTQ3ODgwOCwgMHg4OTREODgwOSwgMHg4OTUzODgwQSwKKzB4ODk1OTg4MEIsIDB4MDAwOUEwNjAsIDB4MDAwOUIwNjIsIDB4NjAwQ0EwNUQsCisweDAwMDlCMDcwLCAweDYwMENBMDU5LCAweDAwMDlCMDdBLCAweDYwMENBMDU1LAorMHg2MjYwRDYwNiwgMHg4QjRGMjIyOCwgMHgwMDA5QjA4NiwgMHg2MDBDQTA0RCwKKzB4MDAxRTEwMjgsIDB4MDAxRTIxNDgsIDB4MDAxRTExMDgsIDB4MDAyMDI5M0QsCisweDAwMjAyOTJDLCAweDAwMjAyOTJFLCAweDAwMjAyOTMwLCAweDAwMjAyOTEwLAorMHgwMDFFMTAwOCwgMHgwMDFFMTAzRiwgMHgwMDFFMTA1RiwgMHgwMDFFMTAzMCwKKzB4MDAxRTEwOTAsIDB4MDAyMDI5MzgsIDB4MDAxRTEwMEIsIDB4MDAyMDI5MzQsCisweDAwMjAyOTNDLCAweDAwMjAyOTA0LCAweDYyNjBENjg3LCAweDhCMjMyMjI4LAorMHgwMDA5QjA2QSwgMHg2MDBDQTAyMSwgMHg2MjYwRDY4MywgMHg4QjFCMjIyOCwKKzB4MDAwOUIwQjQsIDB4NjAwQ0EwMTksIDB4NjI2MEQ2N0YsIDB4OEIxMzIyMjgsCisweDAwMDlCMEJBLCAweDYwMENBMDExLCAweDYyNjBENjdCLCAweDhCMEIyMjI4LAorMHgwMDA5QjExRSwgMHg2MDBDQTAwOSwgMHg2MjYwRDY3NywgMHg4QjAzMjIyOCwKKzB4MDAwOUIxMzYsIDB4NjAwQ0EwMDEsIDB4NEYyNkUwMDAsIDB4MDAwOTAwMEIsCisweEQyNzNEMTcyLCAweEQ1NzM4NDEyLCAweDQwMDBDOTBGLCAweEQ3NzIwMTJELAorMHg2MTFDRTQwMywgMHhENjcxRTIwRiwgMHgyNzEyMjU0MCwgMHhFMDAxMjUyMCwKKzB4MjYwMjAwMEIsIDB4RTYwMUQyNjksIDB4MzA2Njg1MjMsIDB4RTAwMDhEMDYsCisweEUwMDBEMjY3LCAweDgxMjJENjY5LCAweDI2MDJFMDAxLCAweDAwMDkwMDBCLAorMHg4NTIzRDI2MiwgMHgyMDA4NjAwRCwgMHg4ODAxODkwNSwgMHhENjY0OEIwQSwKKzB4Q0IwMTYwNjAsIDB4RDY2MTI2MDAsIDB4RTEwMUQ0NUQsIDB4MjYxMkUwMDEsCisweDgxNDIwMDBCLCAweEUwMDAwMDBCLCAweEU1MDFEMTU4LCAweDQ1MTg4NTEzLAorMHgzNDUzNjQwRCwgMHg4RDA1NjYwMywgMHhEMjVBRTAwMCwgMHhFMDAxRDU1NywKKzB4MjUwMjIyNjAsIDB4MDAwOTAwMEIsIDB4RDE1MDRGMjIsIDB4NjUwRDg1MTMsCisweDQ0MTk2NDUzLCAweDY3MkU2MjQ5LCAweDYwMkMyMjdELCAweDg5MDk4ODAxLAorMHg4OTBDODgwMiwgMHg4OTEwODgwMywgMHg4OTI2ODgwNiwgMHg4OTI5ODgwNywKKzB4MDAwOUEwMzgsIDB4RDY0REQ1NEMsIDB4QTAyN0UyMTIsIDB4NjI1QzI2NTIsCisweDhCMkYyMjI4LCAweEEwMUVENjRBLCAweDYwNUM2MjYyLCAweDg5MDUyMDA4LAorMHg4OTA4ODgxMCwgMHg4OTBCODgyMCwgMHgwMDA5QTAyNCwgMHhENjQzRDQ0NSwKKzB4QTAxM0UyMDQsIDB4RDc0NDI2NDIsIDB4RTIwQ0Q2NDAsIDB4MjY3MkEwMEUsCisweEQ2M0VENTQyLCAweEEwMDlFMjE4LCAweEQ0NDEyNjUyLCAweEUyMEFENjNCLAorMHgyNjQyQTAwNCwgMHhENjM5RDIzRiwgMHhFMjJFMjYyMiwgMHhENDNFODUxNSwKKzB4MzI3NzY3MEQsIDB4OEYwMTI0MjEsIDB4MjQ1MTY1MDMsIDB4MDAwOUIwREYsCisweEUwMDFBMDAxLCAweDRGMjZFMDAwLCAweDAwMDkwMDBCLCAweEUxMDFENjI5LAorMHgyNjEwRDQzNiwgMHhENzI4NjU0MSwgMHg2NTVERDEyOCwgMHhFMDAxRTIwRiwKKzB4MjYyMDI3NTIsIDB4MjEwMjAwMEIsIDB4NEYyMjJGRTYsIDB4ODUyM0QyMUYsCisweDI0NDg2NDBDLCAweEQ2MkQ4QjA4LCAweEUyMDBENTIxLCAweDg0NTEyNjIxLAorMHgyMDQ5OTQzMCwgMHg4MDUxQTAyNiwgMHg2MEUwREUxRCwgMHg4RDBCQzg0MCwKKzB4MzQyN0UyMDEsIDB4RDEyNTg5MjIsIDB4NDIwQkQyMjUsIDB4RDUyNTIxNDEsCisweENCMDQ2MDUyLCAweDI1MDJBMDBCLCAweDg5MTczNDI3LCAweEQ3MjJEMjFGLAorMHgyMjQxNDcwQiwgMHhFNUZCRDYxRiwgMHgyMTU5NjE2MiwgMHg4NEUxMjYxMiwKKzB4QjEyRENCODAsIDB4NjBFMDgwRTEsIDB4Q0IwNEQ2MUMsIDB4NjA2MDJFMDAsCisweDI2MDBDOTNGLCAweEUwMDFENjA5LCAweDI2MDJBMDAxLCAweDRGMjZFMDAwLAorMHg2RUY2MDAwQiwgMHgwMDAwRkY3RiwgMHgwMDIwMjkzRCwgMHgwMDIwMjkwNCwKKzB4MDAyMDI5MTAsIDB4MDAxRTExMDAsIDB4MDAxRTEwMEMsIDB4MDAyMDI5MzQsCisweDAwMUUxMDAwLCAweDAwMUUxMDAxLCAweDAwMjAyQUY0LCAweDAwMjAyOTE4LAorMHgwMDIwMjkyMCwgMHgwMDIwMkI2MiwgMHgwMDIwMkI2NiwgMHgwMDIwMkI3MiwKKzB4MDAyMDJCOEEsIDB4MDAyMDJCOTQsIDB4MDAyMDI5MUMsIDB4MDAyMDI5MkEsCisweDAwMjAxQUI2LCAweDAwMUUxMTA4LCAweDAwMjAxQkMyLCAweDAwMUUxMDE1LAorMHg2MDYwRDY5NiwgMHg4OTE5Qzg4MCwgMHg2MDIxRDI5NSwgMHg4QjE1ODgwMSwKKzB4RTUwMUQyOTQsIDB4MzA1Njg1MjQsIDB4RDE5Mzg5MTAsIDB4RDQ5M0UyMDMsCisweDY1NDEyMTIwLCAweDY1NURFMDBCLCAweEQ1OTEwNjU2LCAweEU3MDJFNDBGLAorMHgyNTcxMjE0MCwgMHhFMDAxRDc4RiwgMHgyNzAyMDAwQiwgMHhFMDAwMDAwQiwKKzB4NEYyMjJGRTYsIDB4ODRFMURFOEMsIDB4ODkzNEM4ODAsIDB4ODU1NEQ1ODUsCisweDhGMzAyMDA4LCAweEQ3ODk2MTAzLCAweDY2NzI4NTUzLCAweDY1MEM2NDAzLAorMHg2MjBDODU2NiwgMHg4QjI2MzUyMCwgMHhENzgwRDY4NSwgMHg2NDRDNjUxQywKKzB4Mjc0MTI2NTEsIDB4Qzg0MDYwRTAsIDB4RDI4Mjg5MDcsIDB4MDAwOTQyMEIsCisweDYwNjJENjgxLCAweEEwMDhDQjA0LCAweEQxODAyNjAyLCAweDAwMDk0MTBCLAorMHhFNUZCRDY3RCwgMHgyNDU5NjQ2MiwgMHhCMEExMjY0MiwgMHhENTc1MDAwOSwKKzB4MjUyMkUyMDEsIDB4RDc3QTYwRTAsIDB4MkUwMENCMDQsIDB4QzkzRjYwNzAsCisweEEwMDEyNzAwLCAweEUwMDA2MDIzLCAweDAwMEI0RjI2LCAweDJGQTY2RUY2LAorMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHhFMjQwREE2OSwgMHhEQzY2NjZBMSwKKzB4MzEyMzYxNkQsIDB4NjI2Mzg5MDAsIDB4NkVEMzZEMkMsIDB4NEUyMTM2RDgsCisweDRFMjEyQTYxLCAweERCNkNENDZCLCAweEU3MDBBMDBGLCAweDc3MDE2NkIyLAorMHg3MTAyNjE2MywgMHg2NTYxMkIxMiwgMHg3MTAyNjYxMywgMHg2MjYxMkIxMiwKKzB4NjIyRDY1NUQsIDB4MzI1QzQyMjgsIDB4NjI3QzI0MjIsIDB4OEJFRDMyRTMsCisweEM5MDM2MEQzLCAweDhCMTA4ODAzLCAweEVEMDc2RUIyLCAweDcxMDI2MUUzLAorMHg2NzEzMkIxMiwgMHg2MkUxNzEwMiwgMHg2NTcxMkIxMiwgMHg2NTVENjIyRCwKKzB4MzUyQzQ1MjgsIDB4QTAwQzJDRDAsIDB4ODgwMjI0NTIsIDB4QTAwMzhCMDEsCisweDg4MDFFMjAzLCAweEUyMDE4QjA1LCAweDY2QjIyQzIwLCAweDY3N0Q2NzYxLAorMHhFQjBGMjQ3MiwgMHg2REExMkNCMCwgMHg4QjA1MkREOCwgMHhENDQ1RDI0RiwKKzB4RTEwMUVFMDAsIDB4MjQxMjIyRTIsIDB4NkRGNjZFRjYsIDB4NkJGNjZDRjYsCisweDZBRjYwMDBCLCAweDJGRTYyRkQ2LCAweEUyNDBERDNELCAweDYxNkQ2NkQxLAorMHg4OTAwMzEyMywgMHg2NzJDNjI2MywgMHhERTQzMzY3OCwgMHgyRDYxNzcwMywKKzB4RDY0MDQ3MjEsIDB4NDcyMTY0RTIsIDB4RTEwMEEwMEUsIDB4NzEwMTY1NjIsCisweDI0NTA2MjUzLCAweDQyMTk3NDAxLCAweDc0MDEyNDIwLCAweDI0NTA0NTI5LAorMHg0NTE5NzQwMSwgMHg3NDAxMjQ1MCwgMHgzMjczNjIxQywgMHg0MjAwOEJFRSwKKzB4NjREMTY2RTIsIDB4MzYyQzQyMDAsIDB4OEYwNjI0NDgsIDB4REQzMzJFNjIsCisweEU1MDBERTI4LCAweDJENTJFNzAxLCAweDZFRjYyRTcyLCAweDZERjYwMDBCLAorMHgyRkU2MkZENiwgMHhFRTAxNEYyMiwgMHhFRDBBQTAwNSwgMHg2NEUzQkNCNiwKKzB4NjRFM0JDQkMsIDB4NjJFQzdFMDEsIDB4OEJGNzMyRDcsIDB4RUUwMUEwMDUsCisweDY0RTNCQ0JELCAweDY0RTNCQ0MzLCAweDYyRUM3RTAxLCAweDhCRjczMkQ3LAorMHg2RUY2NEYyNiwgMHg2REY2MDAwQiwgMHgyRkU2MkZENiwgMHg3RkZDNEYyMiwKKzB4NjA2MEQ2MUYsIDB4ODk3NTg4MDEsIDB4RTEwMUQ0MUUsIDB4RDcxMjg1NDgsCisweDY1MEQyNjEwLCAweDQ1MTk2MDcwLCAweDY2NTlERDFCLCAweDYxRDM2MjZFLAorMHhDODQwMjYyRCwgMHg3NDAyNzEwMiwgMHg4RDQ3RDcxOCwgMHhEMjE4NjY2QywKKzB4RTUwMURFMEEsIDB4QTAzMTJFMjIsIDB4MDAwMEVFMDQsIDB4MDAxRTEwMDEsCisweDAwMjAyOTJBLCAweDAwMjAyOTA0LCAweDAwMUUxMTAwLCAweDAwMjAyOTJFLAorMHgwMDIwMjkxQywgMHgwMDIwMjkzNCwgMHgwMDFFMTAwMCwgMHgwMDIwMjkyMCwKKzB4MDAyMDI5MkMsIDB4MDAyMDFBQjYsIDB4MDAxRTExMDgsIDB4MDAyMDFCQzIsCisweDAwMUUxMDE1LCAweDAwMUUxMDBDLCAweDAwMjAyOTE4LCAweDAwMjAyOTM4LAorMHgwMDIwMjkzQywgMHgwMDIwMkFGNCwgMHgwMDIwMkI4QSwgMHgwMDIwMkI5NiwKKzB4MDAyMDJCMDYsIDB4NzUwMTYyNDUsIDB4NzEwMjIxMjEsIDB4MzJFMzYyNUMsCisweDYwNjM4QkY4LCAweEU2MDE4MUQ0LCAweEU0MTdENTM4LCAweDMyNDM2MjZDLAorMHg2MjU1ODkxRSwgMHgyNzIxNzYwMSwgMHg3NzAyQUZGOCwgMHhERTM1RDIzNCwKKzB4MkUyMkU1MDEsIDB4RUUwNEEwMDQsIDB4NzUwMTYyNDUsIDB4NzEwMjIxMjEsCisweDMyRTM2MjVDLCAweDYwNjM4QkY4LCAweEU2MDE4MUQ0LCAweEEwMDRENTJFLAorMHg2MjU1RTQxNywgMHgyNzIxNzYwMSwgMHg2MjZDNzcwMiwgMHg4QkY4MzI0MywKKzB4MkQyMTkyNEIsIDB4RDcyQUQ0MjksIDB4MkYxMjYxNDIsIDB4NkRGMjY1RjIsCisweEM5ODA2MDUzLCAweDYwNTMyNzAwLCAweDYxMDNDOTYwLCAweDYwNTM4MDcxLAorMHg2NUYyNkVGMiwgMHg0RDE5QzkwMywgMHg4MDcyNDUyOSwgMHg0NTE5NjBEQywKKzB4NEUyOTgxNzIsIDB4NjJFQzYwNUMsIDB4MzAyQzQwMTgsIDB4NkQ0MjgxNzMsCisweDJGRDIyMTE4LCAweDYyRjI2RUYyLCAweDQyMTk2NkYyLCAweDY1NkM0NjI5LAorMHg2MDJDNjZGMiwgMHg0MDE4NjRFQywgMHgzMDRDNDYyOSwgMHg4MTc0NDYxOSwKKzB4NDAxODYwNkMsIDB4OEYwNzMwNUMsIDB4QkNCNTgxNzUsIDB4NjIwQzAwMDksCisweDg5MDgyMjI4LCAweDAwMDlBMDBBLCAweDg4NDA2MDEzLCAweEIwMEE4QjAzLAorMHhBMDAzMDAwOSwgMHhENjBCMDAwOSwgMHgyNjIyRTIwMiwgMHg0RjI2N0YwNCwKKzB4MDAwQjZFRjYsIDB4MDAwQjZERjYsIDB4MDYwQTAwMDksIDB4MDAyMDJCMzYsCisweDAwMjAyQjM0LCAweDAwMjAyOTIwLCAweDAwMjAyQjA4LCAweDAwMUUxMDBDLAorMHgwMDIwMjkwNCwgMHgwMDIwMjkzNCwgMHg3RkZDNEYyMiwgMHg2NjIwRDI3RSwKKzB4OEQwODI2NjgsIDB4RDQ3RDJGNjAsIDB4NDIwQkQyN0QsIDB4NjRGMDAwMDksCisweEEwOTA3RjA0LCAweDdGMDQ0RjI2LCAweDAwMEI0RjI2LCAweDAwMEIwMDA5LAorMHgyRkU2MDAwOSwgMHhERTc3NEYyMiwgMHg2MEUwRDY3NywgMHhDQkMwRDQ3NywKKzB4NjI2MDJFMDAsIDB4QzgwMzYwMkMsIDB4NDAyMTg5MDQsIDB4NzAwMTQwMjEsCisweDY2MDNBMDAyLCAweDY2MDM0MDA5LCAweEQ2NzE2MTZELCAweEU1MDBBMDA0LAorMHg3NTAxNjI2MiwgMHg3NDA0MjQyMiwgMHgzMjEzNjI1RCwgMHhEMTZEOEJGOCwKKzB4MDAwOTQxMEIsIDB4RTQwMUQ2NkMsIDB4ODRFMjI2NDEsIDB4ODBFMkM5QkYsCisweDAwMEI0RjI2LCAweDJGRTY2RUY2LCAweEQ1Njg3RkZDLCAweDYyNTBERTYxLAorMHg2NDJDODRFMiwgMHhDQjQwNzQwNCwgMHg4MEUyNjE0RCwgMHg0NDIxNjQxMywKKzB4RDc2MzQ0MjEsIDB4RTYwMEEwMDQsIDB4NzYwMTYyNTYsIDB4MjcyMjJGMjIsCisweDMyNDM2MjZELCAweDYwMTM4QkY4LCAweDIwMDhDOTAzLCAweDg4MDM4OTEyLAorMHg4ODAyODkwNSwgMHg4ODAxODkwNiwgMHhBMDA4ODkwNywgMHhFMDA3MDAwOSwKKzB4ODA3OEEwMDUsIDB4QTAwMkUwMDMsIDB4RTAwMTgwNzgsIDB4NjI1MjgwNzgsCisweDI3MjIyRjIyLCAweEQ2NTBFMDBGLCAweDYwNjE4MDc4LCAweDhCMDE4ODAxLAorMHgyNjIxRTIwMCwgMHg2MDYwRDY0RiwgMHgyNjAwQ0IwOCwgMHhDOTNGNjBFMCwKKzB4N0YwNDJFMDAsIDB4NkVGNjAwMEIsIDB4NjAyMUQyNDcsIDB4OEQxODg4MDEsCisweEQyNDY2MTQzLCAweDIyMTA2MDUzLCAweDYwNjM4MDIxLCAweEQ0NDY4MTIxLAorMHhFNTAwQTAwNywgMHgwMjdDNjA1RCwgMHgzNjRDNjYwMywgMHgyNjIwNzAwMSwKKzB4NjI1RDY1MDMsIDB4MzIxMzYxMUMsIDB4RDY0MDhCRjQsIDB4QzlCRjYwNjAsCisweDAwMEIyNjAwLCAweDJGRDYwMDA5LCAweDRGMjIyRkU2LCAweDYwNDM3RkZDLAorMHg4RDAyQzgyMCwgMHhCRjZBNkU0MywgMHg2MEUzMDAwOSwgMHg4OTAxQzgxMCwKKzB4MDAwOUJGNjcsIDB4Qzg0MDYwRTMsIDB4QkY4Qzg5MDEsIDB4NjBFMzAwMDksCisweDg5MjlDODAxLCAweDYwRDBERDMyLCAweDhEMDNDODAyLCAweEQ2MzEyRjAwLAorMHgwMDA5NDYwQiwgMHhDODA0NjBGMCwgMHhENjJGODkwMiwgMHgwMDA5NDYwQiwKKzB4NjAyMzYyRjAsIDB4ODkwMkM4ODAsIDB4Qzk3RjYwRDAsIDB4NjAyMzJEMDAsCisweDg5MDJDODAxLCAweDQyMEJEMjI5LCAweEQ1MjkwMDA5LCAweDg4MDI2MDUyLAorMHhEMjI4OEIwMywgMHhBMDA1RTYwNCwgMHg4ODAxMjI2MCwgMHhEMjI1OEIwMiwKKzB4MjI2MEU2MDEsIDB4MjUyMkUyMDAsIDB4Qzg4MDYwRTMsIDB4RDIyMjg5MTYsCisweDYwRTM2RTIwLCAweDg5MDJDODAyLCAweDQyMEJEMjIwLCAweDYwRTMwMDA5LAorMHg4OTAyQzgwNCwgMHg0MjBCRDIxRSwgMHg2MEUzMDAwOSwgMHg4OTA1QzgwOCwKKzB4N0YwNEQyMUMsIDB4NkVGNjRGMjYsIDB4NkRGNjQyMkIsIDB4NEYyNjdGMDQsCisweDAwMEI2RUY2LCAweDAwMDA2REY2LCAweDAwMUUxMDIwLCAweDAwMjAyOUQwLAorMHgwMDIwMEUyQSwgMHgwMDFFMTAxNSwgMHgwMDFFMTBCRiwgMHgwMDExN0QwMCwKKzB4MDAxRTEwRkMsIDB4MDAyMDAwRjgsIDB4MDAyMDI5MzAsIDB4MDAxMTdEODAsCisweDAwMUUxMEY4LCAweDAwMUUxMEFFLCAweDAwMTE3RDg0LCAweDAwMUUxMDE3LAorMHgwMDFFMTAyMSwgMHgwMDIwMTA1QywgMHgwMDIwMTA3RSwgMHgwMDIwMTYwOCwKKzB4MDAyMDI5MzQsIDB4MDAxRTEwMEIsIDB4MDAxRTEwMjgsIDB4MDAyMDEwQUUsCisweDAwMjAxMEMwLCAweDAwMjAxMENDLCAweEQ2QTg2NDRDLCAweDM0NkM3NEZGLAorMHgyNDUwMDAwQiwgMHg2NDRDRDZBNiwgMHgwMDBCMzQ2QywgMHhENkE1MjQ1MCwKKzB4MzQ2QzY0NEMsIDB4MjQ1MDAwMEIsIDB4NjE2RDYyNUMsIDB4NDExOTQyMDgsCisweDYwMTk0MjA4LCAweDY0NEM0MjAwLCAweDMyNEM2NzBFLCAweDIwN0REMTlFLAorMHhDOTBGNDIwMCwgMHgwMDBCMzIxQywgMHg2NzYzMjIwMCwgMHg0MjA4NjI1QywKKzB4NDIwMDQyMDgsIDB4MzI0QzY0NEMsIDB4NDIwMEQxOTgsIDB4MDAwQjMyMUMsCisweDJGRTYyMjcwLCAweDYxNEM0RjEyLCAweDQxMDBENDkzLCAweDY3MTAzMTRDLAorMHgyNzI5RTI5RiwgMHg2NTczNkU1MywgMHg0NzE5Njc2RCwgMHg2NzJFNjI3OSwKKzB4NDIyMTIyN0QsIDB4NDIyMTQyMjEsIDB4NzYwMTY2MkMsIDB4RTQwMTQ2MDgsCisweDM0RTg0NjA4LCAweDY0NEM0NjAwLCAweDBFMUEwNDY3LCAweDIxNTAyNUVCLAorMHgwMDBCNEYxNiwgMHg0RjIyNkVGNiwgMHhEMjg1N0ZFOCwgMHg4ODAxNjAyMSwKKzB4RDI4NDhCN0IsIDB4MjY2ODY2MjEsIDB4RDI4MzhCNzcsIDB4MjY2ODY2MjEsCisweEU1MEY4QjczLCAweEU0MDFCRkEwLCAweEJGQTNFNTAxLCAweEU1ODZFNDAwLAorMHhFNDAwNjU1QywgMHgyRjUwQkZBMywgMHhCRkEwRTQwMSwgMHhFNjAyRTUwNiwKKzB4NjA2MzQ2MTgsIDB4ODFGMkU0MDEsIDB4NjU0M0JGOUUsIDB4RTQwMTg1RjIsCisweEJGQUE2NTQzLCAweDg1RjI2NjAzLCAweDY1NDNFNDAxLCAweDY2MDNCRkIxLAorMHhFNDAyNjVGMCwgMHg2MDUzNzU2QywgMHg4MEY4QkY3RSwgMHhCRjgxRTQwMiwKKzB4ODRGOEU1MTIsIDB4NzA5MEU0MDIsIDB4NjUwM0JGODEsIDB4NDYxOEU2MDIsCisweDgxRjY2MDYzLCAweEJGN0ZFNDAyLCAweDg1RjZFNTAwLCAweDY2MDNFNDAyLAorMHhFNTAwQkY4QiwgMHhFNDAyODVGNiwgMHhCRjkyNjYwMywgMHhFNUZFRTUwMCwKKzB4RTAxMDY1NUMsIDB4QkY1RkU0MDMsIDB4RTUxMzBGNTQsIDB4RTQwRUJGNjIsCisweDA1RkNFMDEwLCAweEJGNjJFNDBFLCAweEU1MDA3NTg1LCAweEJGNjNFNDAzLAorMHhFNTAwRTY0MCwgMHhCRjcwRTQwMywgMHhFNTAwRTY0MCwgMHhCRjc4RTQwMywKKzB4RTVGRkU2NDAsIDB4RTAxNDY1NUMsIDB4QkY0NUU0MDQsIDB4RTQwRjBGNTQsCisweEU1MDRCRjQ4LCAweDA1RkNFMDE0LCAweEJGNDhFNDBGLCAweEU1MDE3NTg0LAorMHhCRjQ5RTY0MCwgMHhFNTAxRTQwNCwgMHhCRjU2RTY0MCwgMHhFNTAxRTQwNCwKKzB4RTQwNEU2NDAsIDB4QUY1QzdGMTgsIDB4N0YxODRGMjYsIDB4MDAwQjRGMjYsCisweDRGMjIwMDA5LCAweEQyNDI3RkYwLCAweDg4MDE2MDIxLCAweEQyNDE4QjcxLAorMHgyNjY4NjYyMSwgMHhEMjQwOEI2RCwgMHgyNjY4NjYyMSwgMHhFNTBGOEI2OSwKKzB4RTQwMUJGMUEsIDB4QkYxREU1MDEsIDB4RTU4NkU0MDAsIDB4RTQwMDY1NUMsCisweDJGNTBCRjFELCAweEJGMUFFNDAxLCAweEU0MDFFNTA2LCAweEJGMUI2NTQzLAorMHhFNDAxRTY0MCwgMHhCRjI4NjU0MywgMHhFNDAxRTY0MCwgMHhCRjMwNjU0MywKKzB4NjVGMEU2NDAsIDB4NzU2Q0U0MDIsIDB4QkVGRDYwNTMsIDB4RTQwMjgwRjQsCisweEU1MTJCRjAwLCAweEU0MDI4NEY0LCAweEJGMDA3MDkwLCAweEU2NDA2NTAzLAorMHhCRjAxRTQwMiwgMHhFNjQwRTUwMCwgMHhCRjBFRTQwMiwgMHhFNjQwRTUwMCwKKzB4QkYxNkU0MDIsIDB4RTVGRUU1MDAsIDB4NjA1MzY1NUMsIDB4QkVFM0U0MDMsCisweEU1MTM4MEY4LCAweEU0MEVCRUU2LCAweEU0MEU4NEY4LCAweEJFRTY3MDg1LAorMHhFNTAwNjUwMywgMHhCRUU3RTY0MCwgMHhFNTAwRTQwMywgMHhCRUY0RTY0MCwKKzB4RTUwMEU0MDMsIDB4QkVGQ0U2NDAsIDB4RTVGRkU0MDMsIDB4NjA1MzY1NUMsCisweEJFQzlFNDA0LCAweEU0MEY4MEZDLCAweEU1MDRCRUNDLCAweEU0MEY4NEZDLAorMHhCRUNDNzA4MywgMHhFNTAxNjUwMywgMHhCRUNERTY0MCwgMHhFNTAxRTQwNCwKKzB4QkVEQUU2NDAsIDB4RTUwMUU0MDQsIDB4RTQwNEU2NDAsIDB4QUVFMDdGMTAsCisweDdGMTA0RjI2LCAweDAwMEI0RjI2LCAweDAwMDAwMDA5LCAweDAwMUUxMDMwLAorMHgwMDFFMTA4MCwgMHgwMDFFMTA5MCwgMHgwMDFFMTAzRiwgMHgwMDFFMTAzRSwKKzB4MDAyMDI5MkEsIDB4MDAyMDI5MkMsIDB4MDAyMDI5MkUsIDB4MDAwOTAwMEIsCisweDY2NkNFNjgwLCAweDY1NjNEMkEwLCAweDc1NDBFNzAwLCAweDY0NzM0MjJCLAorMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHg0QzE4RUMwMSwKKzB4REE5QkRCOUEsIDB4NjVCMjUyQjEsIDB4ODkyMjM1MjAsIDB4QzkwMzYwNTEsCisweDg5MUU4ODAxLCAweEQxOTdERTk1LCAweDY0RTM0MTBCLCAweDg1MDM2NTAzLAorMHg2NzBENjZBMiwgMHhERDk0Mzc2MiwgMHhENDk0ODkwQSwgMHg0MjBCRDI5NCwKKzB4RDE5NDAwMDksIDB4RTcwMUQ0OTQsIDB4MjE3MjREMEIsIDB4MDAwOUFGRTIsCisweDQyMEJEMjkyLCAweEQ2OTI2NEUzLCAweDREMEJENDkyLCAweEFGRDkyNkMyLAorMHg0RjI2MDAwOSwgMHg2REY2NkVGNiwgMHg2QkY2NkNGNiwgMHg2QUY2MDAwQiwKKzB4N0ZGNDRGMjIsIDB4RTY4MTg1NDYsIDB4ODU0NzJGMDEsIDB4ODFGMTY2NkMsCisweEQyN0Q4NTQ4LCAweDg1NDI4MUYyLCAweDgxRjM2N0YzLCAweEU0MEM4NTQzLAorMHg2MDUzODFGNCwgMHg4MUY1NjU2MywgMHg3NTQwNDIwQiwgMHg0RjI2N0YwQywKKzB4MDAwOTAwMEIsIDB4MkY5NjJGODYsIDB4MkZCNjJGQTYsIDB4MkZENjJGQzYsCisweDRGMjIyRkU2LCAweEUyMDA3RkVDLCAweEEwQ0JEQjdCLCAweDZBMTMyRjIxLAorMHg0QTA4RDI3QSwgMHhERTdBRTAwMSwgMHg0QTAwNDIwQiwgMHg3RTMwM0FFQywKKzB4MUYwMjFGRTEsIDB4NjZCMkRENzcsIDB4MzYyMDUyQjEsIDB4QTBCNThCMDEsCisweDYwNjEwMDA5LCAweDg4MDFDOTAzLCAweEEwQUY4QjAxLCAweDg1NjEwMDA5LAorMHg4OTc0QzgwMSwgMHhFRTEwNTE2MywgMHhEQzYzODUxMiwgMHhDOTAzNjYwMywKKzB4ODUxMzY0MDMsIDB4NDAyMTYwMEQsIDB4QzkzRjQwMjEsIDB4OEQyMDMwRTMsCisweEQ3Njk2NTAzLCAweDYyNzA0NDA4LCAweDQ0MDA0NDA4LCAweDIyMjg0NTAwLAorMHgzNDVDOEYwQywgMHg2MDQzRDI2NSwgMHg2MjVEMDUyRCwgMHg2MDI5NDIxOSwKKzB4MjA3RDY3MEUsIDB4NjA1QzgxRjYsIDB4ODFGOEEwMEIsIDB4NjA0M0QyNjAsCisweDY4NUQwNTJELCAweDYwODk0ODE5LCAweDIwOUQ2OTBFLCAweDYwNUM4MUY2LAorMHhENzVDODFGOCwgMHgyMjI4NjI3MiwgMHhFMEZGODkwMiwgMHg4MUY4NjAwQywKKzB4RUVGRjg1RjgsIDB4NkVFQzY1MEQsIDB4OEIwRjM1RTAsIDB4NEUwQkRFNDUsCisweDU0MDM2NEIzLCAweEJGN0JFNTAyLCAweEQ0NTM2ODAzLCAweDQxMEJEMTQ3LAorMHhENzUyNjU4MywgMHhENDUyRTkwMSwgMHgyNzkyQTAyMCwgMHgyNkU5RUVGQywKKzB4ODExMjYwNjMsIDB4OTQ2RTg1MTMsIDB4ODExMzIwNDksIDB4NDUwODg1MTIsCisweDYyMDM2OTUzLCAweEU1MDg4NUY2LCAweDgxMTIyMDJCLCAweDQ1MTg4NTEzLAorMHg4MTEzMjA5QiwgMHhENDQ3ODUxNCwgMHg4MTE0MjA1QiwgMHg4NTExNjFCMiwKKzB4ODExMTIwRTksIDB4NjAyMTYyQjIsIDB4MjIwMUNCMDEsIDB4MDAwOTRDMEIsCisweDU2RjE2MEIyLCAweENCMDE1MkYyLCAweEFGN0MyQTAyLCAweDg1NjEyNjIyLAorMHhDODAyREMzQSwgMHhEOTM4RDIyNywgMHg4RDBGRDgyQywgMHg0MjBCNjRCMywKKzB4NjUwMzAwMDksIDB4NDgwQjY0OTMsIDB4RTgwMTVFMDMsIDB4ODVFRjJDODIsCisweDY1MERENjM1LCAweDY0RDM0NjBCLCAweDAwMDlBRjY1LCAweDAwMDk0MjBCLAorMHg2RTAzNTQwMywgMHhFNTA4ODU0NCwgMHg0NTE4NjEwMywgMHgzMTUwMjE1OSwKKzB4QkYyNThCMDMsIDB4QTAwN0U1MDEsIDB4ODU0MTAwMDksIDB4NjIwREQ1MkIsCisweDg5MDEyMjU4LCAweEU1MDBCRjFDLCAweDQ4MEI2NDkzLCAweEQ0Mjg2NUUzLAorMHhFODAxRDYxMSwgMHgyQzgyNDYwQiwgMHgwMDA5QUY0NSwgMHg3QjA4NjJGMSwKKzB4MkYyMTcyMDEsIDB4RUUwMzYyRjEsIDB4MzFFNzYxMkQsIDB4QUYyRTg5MDEsCisweDdGMTQwMDA5LCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZBRjY2QkY2LAorMHgwMDBCNjlGNiwgMHhGRTAzNjhGNiwgMHgwMDIwMThCOCwgMHgwMDIwMjhFNCwKKzB4MDAyMDI4RUMsIDB4MDAyMDBBRTAsIDB4MDAyMDBFMkEsIDB4MDAyMDI4QjQsCisweDAwMjAwQjYyLCAweDAwMUUyMTMwLCAweDAwMjAyQUQ0LCAweDAwMjAwQUZFLAorMHgwMDFDM0QzMCwgMHgwMDIwMkFEOCwgMHgwMDIwMjhDNCwgMHgwMDIwMjAzNCwKKzB4MDAxQzNEMDAsIDB4MDAyMDJBRTQsIDB4MDAyMDJBRjAsIDB4MDAyMDI5RDQsCisweDAwMjAyQTU0LCAweDAwMjAyOTAwLCAweDAwMjAyOEJDLCAweDAwMUUyMTJDLAorMHgwMDIwMkFEQywgMHgwMDIwMkFFMCwgMHgwMDIwMEU4QSwgMHgwMDAwODAwMCwKKzB4MDAyMDJBRUMsIDB4NEYyMjJGRTYsIDB4NkUyMkQyMEQsIDB4Qzg0MDYwRTMsCisweDIyRTI4RDAyLCAweDAwMDlCRTdBLCAweDQyMThFMjQwLCAweDg5MDEyRTI4LAorMHgwMDA5QkU3NiwgMHhDODA1NjBFMywgMHhCRUNCODkwMSwgMHg2MEUzMDAwOSwKKzB4ODkwMkM4MDIsIDB4QUU3MzRGMjYsIDB4NEYyNjZFRjYsIDB4NkVGNjAwMEIsCisweDAwMUMzNTEwLCAweDA4MEEwQzBFLCAweDAwMDIwNDA2LCAweDFBMUMxRTIwLAorMHgxMjE0MTYxOCwgMHgyRTMwMzIzNCwgMHgyNjI4MkEyQywgMHgzQTNDM0U0MCwKKzB4NkM2MjU2NDgsIDB4NDExMTJGMjYsIDB4RTIyMDhGMTgsIDB4ODkwQjMxMjMsCisweDMyMUNEMjA0LCAweEQxMDI2MjIwLCAweDQxMkIzMTJDLCAweDAwMDkwMDA5LAorMHgwMDIwMjA1RSwgMHgwMDIwMjAxNCwgMHgwMDBCRTAwMCwgMHg0MDAwNjJGNiwKKzB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NjJGNjAwMEIsCisweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMTg0MDAwLAorMHg2MkY2MDAwQiwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwKKzB4NDAyODQwMDAsIDB4NjJGNjAwMEIsIDB4NDAwMDQwMDAsIDB4NDAxODQwMDAsCisweDAwMEI0MDI4LCAweEM5MEY2MkY2LCAweDQwMDU0MDA1LCAweDQwMDU0MDA1LAorMHg2MkY2MDAwQiwgMHg0MDA1QzkwNywgMHg0MDA1NDAwNSwgMHg2MkY2MDAwQiwKKzB4NDAwNUM5MDMsIDB4MDAwQjQwMDUsIDB4QzkwMTYyRjYsIDB4MDAwQjQwMDUsCisweDAwMDA2MkY2LCAweDA4MEEwQzBFLCAweDAwMDIwNDA2LCAweDFBMUMxRTIwLAorMHgxMjE0MTYxOCwgMHgyRTMwMzIzNCwgMHgyNjI4MkEyQywgMHgzQTNDM0U0MCwKKzB4NkM2MjU2NDgsIDB4NDExMTJGMjYsIDB4RTIyMDhGMTgsIDB4ODkwQjMxMjMsCisweDMyMUNEMjA0LCAweEQxMDI2MjIwLCAweDQxMkIzMTJDLCAweDAwMDkwMDA5LAorMHgwMDIwMjExRSwgMHgwMDIwMjBENCwgMHgwMDBCRTAwMCwgMHg0MDAxNjJGNiwKKzB4NDAwMTQwMDEsIDB4NDAwMTQwMDEsIDB4NDAwMTQwMDEsIDB4NjJGNjAwMEIsCisweDQwMDE0MDAxLCAweDQwMDE0MDAxLCAweDQwMDE0MDAxLCAweDQwMTk0MDAxLAorMHg2MkY2MDAwQiwgMHg0MDAxNDAwMSwgMHg0MDAxNDAwMSwgMHg0MDAxNDAwMSwKKzB4NDAyOTQwMDEsIDB4NjJGNjAwMEIsIDB4NDAwMTQwMDEsIDB4NDAxOTQwMDEsCisweDAwMEI0MDI5LCAweDQwMDQ2MkY2LCAweDQwMDQ0MDA0LCAweEM5MEY0MDA0LAorMHg2MkY2MDAwQiwgMHg0MDA0NDAwNCwgMHhDOTA3NDAwNCwgMHg2MkY2MDAwQiwKKzB4NDAwNDQwMDQsIDB4MDAwQkM5MDMsIDB4NDAwNDYyRjYsIDB4MDAwQkM5MDEsCisweDAwMDA2MkY2LCAweDM2MjJFMjE4LCAweDY3NDM4RjEyLCAweDAwMDlBMDA0LAorMHg3NkZGNjI1NCwgMHg3NDAxMjQyMCwgMHhDODAzNjA1MywgMHg2MDQzOEJGOCwKKzB4ODkwMkM4MDMsIDB4NDIyQkQyMkIsIDB4RDIyQjAwMDksIDB4MDAwOTQyMkIsCisweDJGRTY2NDczLCAweDhENEEzNDUwLCAweDI3Nzg2NzYzLCAweDYyNDM4OTQ3LAorMHgyMjdCMjI1QiwgMHhDOTAxNjAyMywgMHg4RDIwMzQ1MiwgMHgyRUU4NkUwMywKKzB4NjAyMzhCMTUsIDB4OEIwOEM4MDMsIDB4NDcwOTY2NDMsIDB4NDcxMDYyNTYsCisweDhGRkIyNjIyLCAweEEwMzI3NjA0LCAweDQ3MDEwMDA5LCAweDYxNDM2NjczLAorMHg0NjEwNjI1NSwgMHg4RkZCMjEyMSwgMHhBMDI4NzEwMiwgMHg2NjQzMDAwOSwKKzB4NDcxMDYyNTQsIDB4OEZGQjI2MjAsIDB4QTAyMDc2MDEsIDB4NjE0MzAwMDksCisweDJFRTgzNTdDLCAweDhGMTUzMTdDLCAweDYwMjM2NjUzLCAweDhCMDdDODAzLAorMHg3NkZDNDcwOSwgMHg0NzEwNjI2MiwgMHgyMTI2OEZGQiwgMHgwMDA5QTAwRiwKKzB4NjU2MzQ3MDEsIDB4NzVGRTY2NzMsIDB4NDYxMDYyNTEsIDB4MjEyNThGRkIsCisweDAwMDlBMDA1LCAweDYyNjA3NkZGLCAweDhGRkI0NzEwLCAweDYwNDMyMTI0LAorMHg2RUY2MDAwQiwgMHgwMDIwMjMwNiwgMHgwMDIwMjdCMiwgMHhFMjFFMkZFNiwKKzB4Njc2MzM2MjYsIDB4OEQxQjYxNTMsIDB4M0UxMDZFNDMsIDB4M0UxMjg5MTYsCisweDY1RTM4OTA4LCAweDM2NzJFNjAwLCAweDYyMTQ4OTEwLCAweDI1MjA3NjAxLAorMHg3NTAxQUZGOSwgMHgzMTdDNjRFMywgMHg2NTEzMzQ3QywgMHhFNjAwQTAwNCwKKzB4NjI1MDc1RkYsIDB4MjQyNDc2MDEsIDB4OEJGOTM2NzIsIDB4NjBFM0EwMTEsCisweDg5MDgzMUUyLCAweDMyN0M2MjEzLCAweDhCMDQzMkU2LCAweDY1MTM2NEUzLAorMHhBMDA4NjY3MywgMHhEMjhGNkVGNiwgMHg2NTEzNjRFMywgMHg0MjJCNjY3MywKKzB4MDAwQjZFRjYsIDB4RTIwNDZFRjYsIDB4Njc0MzM2MjIsIDB4OEYxMDM1NkMsCisweEEwMDQzNDZDLCAweDc1RkYwMDA5LCAweDc2RkY2MjUwLCAweDYwNTMyNDI0LAorMHg4QkY4QzgwMywgMHhDODAzNjA0MywgMHhBMTA1ODkwMSwgMHhBMjc3MDAwOSwKKzB4QTI5OTAwMDksIDB4MkZCNjAwMDksIDB4MkZENjJGQzYsIDB4N0ZFNDJGRTYsCisweDZDNjM2MDQzLCAweDY2NTIxRjYyLCAweEM5MDM3NTA0LCAweDFGNTE2RTUzLAorMHg0NTA4NjUwMywgMHhFMUZDNkQ0MywgMHgyRDE5NDUwMCwgMHgxRjczMjU1OCwKKzB4MUY2NTFGNDQsIDB4MkZEMjhEMEIsIDB4ODgwODYwNTMsIDB4ODgxMDg5MjMsCisweDg4MTg4OTVCLCAweEEwODk4QjAxLCAweEEwQkQwMDA5LCAweDYyNjMwMDA5LAorMHgyRDIyRTYwMCwgMHg3Q0ZDN0QwNCwgMHhFQjEwQTAwRCwgMHhFNjAwNjRFNiwKKzB4N0NGMDY1RTYsIDB4NjJFMjYxRTYsIDB4MUQ1MTJENDIsIDB4MUQyMzFEMTIsCisweDdFMDQ3RDEwLCAweDNDQjIxRkUxLCAweDFGNjU4OUYwLCAweDJGRDIxRkMyLAorMHhBMEExMUZFNiwgMHg2NEQyMUZENCwgMHg0NDI4NjI2MywgMHg0NDI5NDQxOCwKKzB4NDIxODQ0MTksIDB4NDYyOTI0MkIsIDB4MkQ0MjQ2MTksIDB4NjU2MzdEMDQsCisweEEwMjE3Q0ZELCAweDY3RTZFQjEwLCAweDYyRTY3Q0YwLCAweDY0RTY2NjczLAorMHgyNTZCNDYxOCwgMHgyRDUyNjFFMiwgMHg2NTIzNDcyOSwgMHg0NTE4NDcxOSwKKzB4NDIyOTI3NUIsIDB4NDIxOTFENzEsIDB4NDcxODY3NDMsIDB4NDQyOTIyN0IsCisweDQ0MTk2NzEzLCAweDI0N0I0NzE4LCAweDFENDMxRDIyLCAweDQxMTk0MTI5LAorMHg2NTEzN0QxMCwgMHgxRkUxN0UwNCwgMHg4OURDM0NCMiwgMHgxRkU2N0VGRiwKKzB4MUZDMjFGNTUsIDB4QTA2NzJGRDIsIDB4NkNGMjFGRDQsIDB4NjZDMjU3RjUsCisweDQ2Mjg2MjczLCAweDQyMjg0NjI5LCAweDJDNjIyNjJCLCAweDdDMDQ1REYyLAorMHg3REZFNDcyOSwgMHhBMDFDRUIxMCwgMHg2NUU2NUVGMSwgMHg2NkU2NjI3MywKKzB4NDcyODY3NTMsIDB4Njc2MzIyN0IsIDB4NDUyOTYxRTYsIDB4MjU3QjQ3MjgsCisweDJDMjI2NEU2LCAweDY1MTMxQzUxLCAweDQ1Mjg0NjI5LCAweDFDNjIyNjVCLAorMHg0MTI5NjY0MywgMHgyMTZCNDYyOCwgMHg0NDI5MUMxMywgMHg2NzQzN0MxMCwKKzB4M0RCMjdERjAsIDB4MUZEMjg5RTEsIDB4N0VGRUEwMzQsIDB4NTFGNTZDRjIsCisweDYyMTM2NkMyLCAweDQyMjg0NjE4LCAweDQyMTg0NjE5LCAweDJDNjIyNjJCLAorMHg3QzA0NURGMiwgMHg3REZGNDExOSwgMHhBMDFGRUIxMCwgMHg2NUU2NUVGMSwKKzB4NjRFNjdERjAsIDB4NDIyODYyNTMsIDB4NDIxODY3RTYsIDB4NjZFNjIxMkIsCisweDYxNDMyQzEyLCAweDQ1MTk0MTI4LCAweDI1MUI0MTE4LCAweDY1NzMxQzUxLAorMHg0NDE5NDUyOCwgMHgyNDVCNDUxOCwgMHg2NDYzMUM0MiwgMHg0NzE5NDQyOCwKKzB4Mjc0QjQ0MTgsIDB4NDYxOTFDNzMsIDB4NjE2MzdDMTAsIDB4ODlERTNEQjIsCisweDdFRkQxRkQyLCAweDFGQzQxRkU2LCAweDVERjJFNzA0LCAweEEwMEQ1RUY2LAorMHg2MkU0NTFGNCwgMHg2NkU0N0RGQywgMHg2NUU0NjRFNCwgMHg3MTAxMjEyMCwKKzB4NzEwMTIxNjAsIDB4NzEwMTIxNDAsIDB4NzEwMTIxNTAsIDB4ODlGMDNENzIsCisweDY2RDM1N0YzLCAweDY0MTM2NUUzLCAweDZFRjY3RjFDLCAweDZDRjY2REY2LAorMHg2QkY2QTE5MCwgMHgwMDIwMjE5NCwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwKKzB4NjA0MzdGRTQsIDB4NkM2M0M5MDMsIDB4NjYwMzFGNjIsIDB4NDYwODc1RkMsCisweDYxNTI2RTQzLCAweDQ2MDBFMkZDLCAweDI2NjgyRTI5LCAweDFGNDQxRjczLAorMHgxRjUxNkQ1MywgMHg4RDBCMUYxNSwgMHg2MDYzMkZFMiwgMHg4OTFGODgwOCwKKzB4ODk1Mzg4MTAsIDB4OEIwMTg4MTgsIDB4MDAwOUEwODEsIDB4MDAwOUEwQjksCisweEVCMTBBMDBELCAweDUyRDM3REYwLCAweDU0RDE1NkQyLCAweDJFMTY2NUQyLAorMHgyRTY2MkUyNiwgMHgyRTQyN0VGQywgMHgxRkQxNjE1MywgMHgzQ0IyN0NGMCwKKzB4N0QwNDg5RjAsIDB4MUYxNTFGRDYsIDB4MkZFMjFGQzIsIDB4MUZFNEEwQTEsCisweDYyMTM2NkUyLCAweDQyMjk0NjE5LCAweDQyMTk0NjE4LCAweDJFNjIyNjJCLAorMHg3Q0ZGNDExOCwgMHhFQjEwQTAyMSwgMHg1NEQzN0RGMCwgMHg2MjQzNTdEMiwKKzB4NDIxOTQyMjksIDB4NTVEMTIxMkIsIDB4MkUxNjY2RDIsIDB4NDEyOTYxNzMsCisweDQxMTk0NDE4LCAweDJFNDYyNDFCLCAweDQ0Mjk2NDUzLCAweDQ0MTk0NzE4LAorMHgyRTc2Mjc0QiwgMHg0NzI5Njc2MywgMHg0NzE5NDUxOCwgMHgyNTdCN0VGQywKKzB4NDYxODJFNTIsIDB4MUZEMTYxNjMsIDB4M0NCMjdDRjAsIDB4N0QwMzg5REMsCisweDFGMTUxRkQ2LCAweDJGRTIxRkMyLCAweDFGRTRBMDZCLCAweDU3RjU2RUYyLAorMHg2MjczNjZFMiwgMHg0NjI4NDYyOSwgMHgyNjJCNDIyOSwgMHgyRTYyNUNGMiwKKzB4N0NGRTQ3MjgsIDB4QTAxQkVCMTAsIDB4N0RGMDVERjEsIDB4NTVEMjUxRDMsCisweDQ2Mjk2NjEzLCAweDU0RDEyNzZCLCAweDJFNzY2MkQyLCAweDQxMjg2NzUzLAorMHgyMTdCNDcyOSwgMHg2MTQzMkUxNiwgMHg0MTI5NDUyOCwgMHgyRTU2MjUxQiwKKzB4NDQyODY1MjMsIDB4MjQ1QjQ1MjksIDB4NDIyODJFNDYsIDB4N0NGMDY3MjMsCisweDg5RTIzQ0IyLCAweDFGRDY3RDAyLCAweEEwM0ExRkMyLCAweDY3RjIxRkU0LAorMHg2NTcyNTFGNSwgMHg0NTI5NjIxMywgMHg0NTI4NDUxOSwgMHg0MjE5NDUxOCwKKzB4NUNGMjI1MkIsIDB4NDEyODI3NTIsIDB4N0NGRDQxMTgsIDB4QTAyMkVCMTAsCisweDdERjA1REYxLCAweDU0RDI1NkQzLCAweDQ1MTk2NTYzLCAweDUyRDE0NjI4LAorMHg0NjE4MjE1QiwgMHg2RUQyNjU0MywgMHg0NTE5MjcxNiwgMHgyNjVCNDQyOCwKKzB4NjU0MzYxNjMsIDB4NDUxODY0MjMsIDB4NDIyODQ0MTksIDB4NDIxODI1NEIsCisweDI3MTY2NEUzLCAweDQ0MTk2NjIzLCAweDI2NEIyNzU2LCAweDRFMjgyNzY2LAorMHg2MUUzNEUxOCwgMHgzQ0IyN0NGMCwgMHg3RDAxODlEQiwgMHgxRkMyMUZENiwKKzB4RTcwNDFGNzQsIDB4NTFGNDVERjIsIDB4NUVGNkEwMEQsIDB4ODRFMjdFRkMsCisweDYyMDM2NEUwLCAweDdERkM4NEUxLCAweDg0RTM2NTAzLCAweDIxNjQ2NjAzLAorMHgyMTU0MjEyNCwgMHgzRDcyMjE0NCwgMHg1N0YzODlGMCwgMHg2NDEzNjZEMywKKzB4N0YxQzY1RTMsIDB4NkRGNjZFRjYsIDB4QTA5RDZDRjYsIDB4MkY4NjZCRjYsCisweDJGQTYyRjk2LCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweDYxNDM3NEUwLAorMHg2QTYzNjg3MywgMHg2QjU2RTkyMCwgMHg2QzU2N0FFMCwgMHg2RDU2NzEyMCwKKzB4NkU1NjNBOTIsIDB4NjQ1NjY3NTYsIDB4NjI1NjY2NTYsIDB4MTFDMTIxQjIsCisweDExRTMxMUQyLCAweDExNDUxMTc0LCAweDhERUMxMTY2LCAweDcxMjAxMTI3LAorMHg2NjEzQTAwNCwgMHg3QUZGNjI1NCwgMHg3NjAxMjYyMCwgMHg4QkY5MkFBOCwKKzB4NkVGNjYwODMsIDB4NkNGNjZERjYsIDB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsCisweDJGODY2OEY2LCAweDJGQTYyRjk2LCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LAorMHg2QTYzNjg3MywgMHg3NUUwRTkyMCwgMHg1NjU2NTI1NywgMHg1NzU0NTE1NSwKKzB4NUQ1MjVFNTMsIDB4NkI1MjVDNTEsIDB4MjQ2NjI0MjYsIDB4MjQ3NjI0MTYsCisweDdBRTAyNEU2LCAweDI0QzYyNEQ2LCAweDhERUMzQTkyLCAweDY2QTMyNEI2LAorMHg2RUY2Njc4MywgMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwgMHhBMDQzNjlGNiwKKzB4MkZFNjY4RjYsIDB4QzgwNDYwNjMsIDB4OEQwNDZFNjMsIDB4NjIxNjYxNTMsCisweDI0MjI3RUZDLCAweDYwRTM3NDA0LCAweDg5MDhDODE4LCAweDcxMDQ2NTEzLAorMHg2MjUyNjYxNiwgMHgyNDIyN0VGOCwgMHhBRkY0MTQ2MSwgMHhFMjA0NzQwOCwKKzB4NjUxMzNFMjIsIDB4NjZFMzhEMDIsIDB4NkVGNkEwMUMsIDB4NkVGNkFGODcsCisweEM4MDQ2MDYzLCAweDYxNjM4RDA0LCAweDYyNTI3NUZDLCAweDI0MjY3MUZDLAorMHhDODE4NjAxMywgMHg3NUY4ODkwNiwgMHg2NjUyNTI1MSwgMHgyNDY2MjQyNiwKKzB4NzFGOEFGRjYsIDB4MzEyMkUyMDQsIDB4NjYxMzhGMDIsIDB4MDAwOUFGQTEsCisweDAwMDlBMDBBLCAweDAwMDlBMDA0LCAweDc2RkY2MjU0LCAweDc0MDEyNDIwLAorMHg4QkY5MjY2OCwgMHg2MDczMDAwQiwgMHgwMDA5QTAwNCwgMHg2MjUwNzVGRiwKKzB4MjQyNDc2RkYsIDB4OEJGOTI2NjgsIDB4NjA3MzAwMEIsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDU0NEYwRDBBLCAweDQ2MjA1MzU1LCAweDAwMDAzQTU3LCAweDIwNzI2MTRELAorMHgzMjIwMzIzMiwgMHgyMDM3MzAzMCwgMHgzNTNBMzczMSwgMHgzNzMzM0EzMiwKKzB4MDAwMDAwMDAsIDB4MDAwMDBEMEEsIDB4MDAwMDAwNDMsIDB4NjE3NjZFNDksCisweDIwNjQ2OTZDLCAweDcyNjU3Mzc1LCAweDIwNzI2RjIwLCAweDIwNzk2NTZCLAorMHgwMDIxNDQ0OSwgMHg2RTZCNkU1NSwgMHgyMDZFNzc2RiwgMHg2RDZENkY2MywKKzB4M0Q2NDZFNjEsIDB4MDAwMDAwMDAsIDB4NjE0Mzc3NDgsIDB4NzI2MjY5NkMsCisweDZGNjk3NDYxLCAweDY2MjAyMDZFLCAweDBBNkM2OTYxLCAweDAwMDAwMDBELAorMHg3MzY5NkY0RSwgMHg2MTQzMjA2NSwgMHg3MjYyNjk2QywgMHg2RjY5NzQ2MSwKKzB4NjE2NjIwNkUsIDB4MjEyMTZDNjksIDB4MDAwMDBEMEEsIDB4MDAwMDBEMEEsCisweDAwMDAwMDQyLCAweDAwMDAwMEZGLCAweDAwMDIwMDAxLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAxMEUwMTBELCAweDAwMDIwMDAzLCAweDAxMDkwMTA4LAorMHgwMDAyMDEwQSwgMHgwMDAzMDAwMiwgMHgwMjAyMDIwMSwgMHgwMjA0MDIwMywKKzB4MDIwNjAyMDUsIDB4MDIwODAyMDcsIDB4MDIwQTAyMDksIDB4MDIwQzAyMEIsCisweDAyMEUwMjBELCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDEwRTAxMEQsIDB4MDBGRjAxMEYsIDB4MDEwOTAxMDgsCisweDAxMEIwMTBBLCAweDAwMDMwMDAyLCAweDAyMDIwMjAxLCAweDAyMDQwMjAzLAorMHgwMjA2MDIwNSwgMHgwMjA4MDIwNywgMHgwMjBBMDIwOSwgMHgwMjBDMDIwQiwKKzB4MDIwRTAyMEQsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMDAwMDA3MiwgMHgwMDIwNTIyMCwgMHgwMDAwMDA0NiwKKzB4MDAwMDAwNTksIDB4NzMyMDQxNDIsIDB4MDAzRDcxNjUsIDB4MDAwMDAwNzQsCisweDAwMDAwMDAwLCAweDAyMDAwMTEyLCAweDQwRkZGRkZGLCAweDEyMjEwQUNFLAorMHgyMDEwNDg5MCwgMHgwMjA5MDEwMCwgMHgwMTAxMDAyRSwgMHgwOUZBODAwMCwKKzB4MDQwMDAwMDQsIDB4MDAwMDAwRkYsIDB4MDIwMTA1MDcsIDB4MDcwMDAyMDAsCisweDAwMDI4MjA1LCAweDA1MDcwMDAyLCAweDAwNDAwMzgzLCAweDA0MDUwNzAxLAorMHgwMTAwNDAwMywgMHgwMDJFMDIwOSwgMHg4MDAwMDEwMSwgMHgwMDA0MDlGQSwKKzB4MDBGRjA0MDAsIDB4MDUwNzAwMDAsIDB4MDA0MDAyMDEsIDB4ODIwNTA3MDAsCisweDAwMDA0MDAyLCAweDAzODMwNTA3LCAweDA3MDEwMDQwLCAweDQwMDMwNDA1LAorMHgwMzA0MDEwMCwgMHgwMzBDMDQwOSwgMHgwMDc5MDA1QSwgMHgwMDQxMDA0NCwKKzB4MDMxODAwNTMsIDB4MDA1MzAwNTUsIDB4MDAzMjAwNDIsIDB4MDAzMDAwMkUsCisweDAwNTcwMDIwLCAweDAwNDEwMDRDLCAweDAwMDAwMDRFLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDcwOSwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgfTsKKworY29uc3QgdTMyX3QgemNGd0ltYWdlU2l6ZT0xMTIwNDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3dV9PVFVTX1JDLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd3VfT1RVU19SQy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4OWQzZTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd3VfT1RVU19SQy5jCkBAIC0wLDAgKzEsNzE1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICJjcHJlY29tcC5oIgorCitjb25zdCB1MzJfdCB6Y0Z3SW1hZ2VbXSA9IHsKKzB4MDAwOTAwMEIsIDB4NEYyMjJGRTYsIDB4REUyODdGRkMsIDB4RTExNEQ3MjgsCisweDFFMTNENDI4LCAweDFFNEM0NzBCLCAweDAwMDlCMDE4LCAweEEwMDM5NTQzLAorMHgzNjUyRTYwMCwgMHg3NjAxOEQwNCwgMHhDODQwNjBFMiwgMHgyRjAyOERGOSwKKzB4REUyMkQ0MjEsIDB4MDAwOTRFMEIsIDB4NEUwQkQ0MjEsIDB4RDQyMTAwMDksCisweDAwMDk0RTBCLCAweDRGMjY3RjA0LCAweDZFRjZBMDIyLCAweEQxMUU0RjIyLAorMHgwMDA5NDEwQiwgMHg0NDBCRDQxRCwgMHhENTFEMDAwOSwgMHgwMDA5NDUwQiwKKzB4RTFGRkQ3MUMsIDB4RDIxQzYxMUQsIDB4NTAyOTI3MTIsIDB4Q0IwMUUxRkYsCisweEQ2MUJENDFBLCAweDIyMTIxMjA5LCAweEU1MDExMjExLCAweDI0NTJFMjAwLAorMHhENTE4MjYyMiwgMHg5NzBGRDYxOCwgMHg0RjI2MjU3MiwgMHgyNjIwMDAwQiwKKzB4REQxN0RDMTYsIDB4NEMwQkRFMTcsIDB4NEQwQjAwMDksIDB4NEUwQjAwMDksCisweEFGRjgwMDA5LCAweDI3MTAwMDA5LCAweDAwMDAwNjQwLCAweDAwMUMwMDFDLAorMHgwMDIwMDhFQSwgMHgwMDAwQjM4RSwgMHgwMDIwMjhEQywgMHgwMDIwMERBNiwKKzB4MDAyMDI4RTgsIDB4MDAyMDI5MDAsIDB4MDAyMDBDNkMsIDB4MDAyMDBFQTIsCisweDAwMjAwOTQwLCAweDAwMUMzNTEwLCAweDAwMUMzNjI0LCAweDAwMUUyMTJDLAorMHgwMDIwMjg5NCwgMHgwMDIwMjg4QywgMHgwMDIwMjdGMCwgMHgwMDIwMEI2OCwKKzB4MDAyMDFGNzQsIDB4MDAyMDE3MzQsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweERFQTE3RkE0LCAweDYxRTBFMDFDLCAweDdEMDE2REUzLCAweDYxRDAwRjE0LAorMHhENTlGRDQ5RSwgMHg0NTBCRTAyMCwgMHhFMDIwMEYxNCwgMHhFNzgwMDRGQywKKzB4NjA0QzY2RTIsIDB4N0Q3RjY3N0MsIDB4MUY2OTMwNzAsIDB4MkQ2MjhGMTcsCisweDAxRkNFMDFDLCAweDY0MUNFNTAwLCAweEQ3OTdERTk2LCAweDMyNDM2MjVELAorMHhBMjFBOEIwMSwgMHg2NTVEMDAwOSwgMHgzMUVDNjE1MywgMHhFMDI4NkMxMCwKKzB4NkQ1MzBGQzQsIDB4M0Q3QzYyQ0UsIDB4QUZFRjJEMjAsIDB4MjAwODc1MDEsCisweEUwMUM4QjE1LCAweEU1MDAwMUZDLCAweEQ3OEJERThBLCAweDY0MUNBMDBBLAorMHg2QzUzNjU1RCwgMHg2NkMyM0NFQywgMHg2NjYyNjI1MywgMHgyMjYyMzI3QywKKzB4MUY2OTc1MDQsIDB4MzI0MzYyNUQsIDB4QTFGNjhCRjIsIDB4ODgwMTJEMTAsCisweEUwMUM4QjE2LCAweEU0MDAwMUZDLCAweDY3MUMyRDQwLCAweDYyNERERTdELAorMHg4QjAxMzI3MywgMHgwMDA5QTFFOSwgMHg2MkUzNjQ0RCwgMHg3MjA0NkQ0MywKKzB4M0RFQzYxNDMsIDB4NjVEMjMxMkMsIDB4NzQwODZDMTIsIDB4MjVDMkFGRUYsCisweDhCMTg4ODA0LCAweDAxRkNFMDFDLCAweDJENDBFNDAwLCAweERFNzE2NzFDLAorMHgzMjczNjI0RCwgMHhBMUQwOEIwMSwgMHg2NDREMDAwOSwgMHg2MkUzNkQ0MywKKzB4NjVEMjNERUMsIDB4NjE0MzcyMDQsIDB4NjYxMjMxMkMsIDB4NzQwODZDNTIsCisweEFGRUQyQzY5LCAweDg4MDUyNUMyLCAweEUwMUM4QjE4LCAweEU0MDAwMUZDLAorMHg2NzFDMkQ0MCwgMHg2MjREREU2MywgMHg4QjAxMzI3MywgMHgwMDA5QTFCNSwKKzB4NkM0MzY0NEQsIDB4M0NFQzYyRTMsIDB4NzIwNDY1QzIsIDB4M0QyQzZENDMsCisweDYxNTI2NkQyLCAweDIxNkI3NDA4LCAweDI1MTJBRkVELCAweDhCMTM4ODMwLAorMHhFMjAwREU1OCwgMHg2NEUyMkQyMCwgMHg4QjA0MjQ0OCwgMHg0MjBCRDI1NywKKzB4QTE5QTAwMDksIDB4NTVFMTAwMDksIDB4NTdFMzU2RTIsIDB4REQ1NDVDRTQsCisweDJGQzY0RDBCLCAweDdGMDRBMTkxLCAweDg5MDE4ODI4LCAweDAwMDlBMEVBLAorMHhFMTQzREU0QywgMHg2MjJENjJFMSwgMHg4RjAzMzIxNywgMHg1NkZCMUZFQiwKKzB4MjYyMUUyNDAsIDB4OEIwMTMyMTcsIDB4MDAwOUEwRDUsIDB4RTEwMTVFRkIsCisweDMwMTY4NUUxLCAweEEwQ0U4QjAxLCAweEU0MDEwMDA5LCAweDJENDA1NUZCLAorMHg2NDUxQjE3OSwgMHhFMTQzNTdGQiwgMHhFMDU0NjI3MSwgMHgzNTE3NjUyRCwKKzB4MEY1NjhENDEsIDB4MzU2M0U2NDAsIDB4RTYwMDhCMDUsIDB4MEY2NUUwMzQsCisweEEwMEZFMTFBLCAweDYxNTM3MkMwLCAweDQxMjE0MTIxLCAweDQxMjE0MTIxLAorMHg0NTIxNDEyMSwgMHg0NTIxNDUyMSwgMHhDOTAzNjA1MywgMHhFMDM0NjYwMywKKzB4NzExODBGNjUsIDB4MjIwOUUwMDcsIDB4NjQxREUwMzAsIDB4MEYyNTY1RjMsCisweDFGNEVCMUYxLCAweDA0RkRFMDM0LCAweDY3NERFMDMwLCAweDQ3MDgwQ0ZELAorMHg2MDczNjFDRCwgMHg0MTA4RDIyQiwgMHhFMDBGMENGRSwgMHgxRjFGNDIwQiwKKzB4MkNEOTZEMDcsIDB4NUVGQjYwNzMsIDB4ODVFMjBGQzYsIDB4NDIwQjUxRkYsCisweDJDMEI2MDBELCAweDU0RkU2MDczLCAweEIxQkIwRkM2LCAweEUwNTQ2NUYzLAorMHg2NTJENjJFMSwgMHhFNjQwMEY1NiwgMHg4OTYyMzU2MywgMHhFMDUwRTEwMCwKKzB4NjAyMzBGMTUsIDB4NDAwOEM5MDMsIDB4NkQwMzQwMDAsIDB4RTA0MDYxMDMsCisweEUwNDQwRkQ2LCAweEQyMTdFRUZGLCAweDZFRUMwRkY2LCAweDBGMjZFMDU4LAorMHg2MEUzNDIwQiwgMHg0MjIxNjI1MywgMHg0MjIxNDIyMSwgMHg2NjIzNDIyMSwKKzB4MzI2QzQyMDAsIDB4NDUyMTQyMDAsIDB4RTA0ODY3MDcsIDB4MEY3NjQ1MjEsCisweEM5MDM2MDUzLCAweDQwMDg1Q0ZCLCAweDdDMDYzMEZDLCAweDZFMDM2RDJELAorMHgxRkQ1MUZDNiwgMHgxRjA0QTAyRSwgMHgwMDExN0QwMCwgMHgwMDIwMjkwNCwKKzB4MDAyMDBEQTYsIDB4MDAxMTdEMDQsIDB4MDAxMTdEODQsIDB4MDAyMDA3MDAsCisweDAwMjAwNzRDLCAweDAwMjAxRkQ0LCAweDBGRDZFMDRDLCAweDA1RkVFMDQ0LAorMHg2NEQzQjE4OSwgMHg2NEUyRTA0OCwgMHhFMDQwMDZGRSwgMHgyRTQyMjQ2OSwKKzB4MDFGRTY3QzQsIDB4NjY3Q0UwNTgsIDB4NDIwQjAyRkUsIDB4MjQwQjYwNjMsCisweDA1RkVFMDQ0LCAweEIxNUQyRTQyLCAweEUwNTA2NEQzLCAweDdEMDEwMUZELAorMHgwRjE1NzEwMSwgMHgwMkZERTA1MCwgMHgzMjYyRTYwNiwgMHg1NkZCOEJEQywKKzB4NTVGQjYyNjEsIDB4ODU1MTQyMDAsIDB4MzAyQzc1MEMsIDB4NjEwMzcwMUIsCisweDY0RjNFNjAwLCAweEU3MDRBMDA0LCAweDc2MDE2MjU2LCAweDc0MDQyNDIyLAorMHgzMjczNjI2RCwgMHg2NUYzOEJGOCwgMHg2NDFEQjEzQywgMHhCMEQyNTZGQiwKKzB4QTBBQTY0NjEsIDB4RDQ4ODAwMDksIDB4RTIwMUQ1ODgsIDB4MkQyMDQ1MEIsCisweDAwMDlBMEEzLCAweDhCMDc4ODI5LCAweEUyMDBERTg1LCAweDY2RTIyRDIwLAorMHg2NDZEQjBBMSwgMHgwMDA5QTA5OSwgMHg2MjJDRTI4MSwgMHg4QjNEMzAyMCwKKzB4RDY4MEU3MzgsIDB4RTA0NDJENzAsIDB4RTA0ODBDNkUsIDB4NkU2MjFEQzEsCisweDUxNjExREUyLCAweDU0NjIxRDEzLCAweDU1NjUxRDQ0LCAweDU3NjMxRDU1LAorMHg1QzY2MUQ3NiwgMHgwRTZFMURDNywgMHgxREU4RTA0MCwgMHhFMDUwMDE2RSwKKzB4NTQ2NDFEMTksIDB4MDU2RTFENEEsIDB4MUQ1QkUwNEMsIDB4RTA1NDA3NkUsCisweDBDNkUxRDdDLCAweDFEQ0RFMDU4LCAweEUwNDQwMjZFLCAweEVEMDAxRDJFLAorMHhFMDQ4MDZENiwgMHgxNkQxMjZEMiwgMHgxNkQ1MTZEMiwgMHgxNkQ2MTZEMywKKzB4RTA0MDA2RDYsIDB4RTA1MDA2RDYsIDB4MDZENjE2RDQsIDB4MDZENkUwNEMsCisweDA2RDZFMDU0LCAweDA2RDZFMDU4LCAweDFGMjlBMDU3LCAweDYyMkNFMjgyLAorMHg4OTMxMzAyMCwgMHgwNUZDRTAyMCwgMHg2MjVDRTY4MywgMHgzMjYwNjY2QywKKzB4RDY1RDhCMDcsIDB4MjY1MEU1MDAsIDB4NTI2MTc2ODAsIDB4QTA0NEQ2NUIsCisweEU2OTAyNjIyLCAweDMyNjA2NjZDLCAweEQyNTc4QjE2LCAweEU1MDBENjU4LAorMHg2MDYyMjI1MCwgMHhDQjIwRDI1NywgMHhFNjA1MjYwMiwgMHhENjU2MjI2MiwKKzB4MjI1MjQ2MEIsIDB4NDIwQkQyNTUsIDB4RDI1NTAwMDksIDB4MjI2MkU2MDEsCisweDQ2MThEMjU0LCAweDIyNjJBMDI5LCAweEQyNTRENDUzLCAweEQ0NTQ2NTQyLAorMHgwMDA5NDIwQiwgMHgwMDA5QTAyMSwgMHhFNTI0RDY0NywgMHhENTQ1MjY1MCwKKzB4MTYyMTUyNTcsIDB4MTYyMjUyNTgsIDB4MTYyMzUyNTksIDB4MTYyNDUyNUEsCisweDE2MjU1MjVCLCAweDE2MjY1MjVDLCAweDE2Mjc1MjVELCAweDE2Mjg1MjVFLAorMHgxRjI5NTI1RiwgMHhFMjAwMTYyOSwgMHgxNTI4MTUyNywgMHgxNTJBMTUyOSwKKzB4MTUyQzE1MkIsIDB4MTUyRTE1MkQsIDB4N0Y1QzE1MkYsIDB4NkVGNjRGMjYsCisweDAwMEI2REY2LCAweDRGMjI2Q0Y2LCAweEUyNDA2MTRELCAweDg5MTczMTIzLAorMHgzMTI3RTIxRiwgMHhENDNCODkwOCwgMHhFMDAxRDUzQiwgMHg2NjQyNDUwQiwKKzB4MjY3OTY3MDcsIDB4MjQ2MkEwMEMsIDB4MzEyN0UyM0YsIDB4RDczNTg5MDgsCisweDcxRTBENjM1LCAweDQ2MEJFMDAxLCAweDYyMDc1NTcxLCAweDE3NTEyNTI5LAorMHgwMDBCNEYyNiwgMHg0RjIyMDAwOSwgMHhFMjQwNjE0RCwgMHg4OTE1MzEyMywKKzB4MzEyN0UyMUYsIDB4RDQyQjg5MDcsIDB4NjY0MkQyMkIsIDB4RTAwMTQyMEIsCisweEEwMEIyNjBCLCAweEUyM0YyNDYyLCAweDg5MDczMTI3LCAweEQ2MjZENzI1LAorMHg3MUUwNTU3MSwgMHhFMDAxNDYwQiwgMHgxNzUxMjUwQiwgMHgwMDBCNEYyNiwKKzB4RTY0MDAwMDksIDB4NDYyODQ2MTgsIDB4NjI1MkQ1MjAsIDB4ODlGQzIyNjgsCisweDAwMDkwMDBCLCAweDQ2MThFNjgwLCAweEQ1MUM0NjI4LCAweDIyNjg2MjUyLAorMHgwMDBCODlGQywgMHhBMDAxMDAwOSwgMHg3MjAxRTIwMCwgMHg4QkZDMzI0MiwKKzB4MDAwOTAwMEIsIDB4NDYxOEU2ODAsIDB4RDUxNTQ2MjgsIDB4MjI2ODYyNTIsCisweDAwMEI4QkZDLCAweDAwMDAwMDA5LCAweDAwMjAyOTA4LCAweDAwMjAwREE2LAorMHgwMDExN0QwNCwgMHgwMDIwMjdGOCwgMHgwMDExN0Q4MCwgMHgwMDIwMjg4QywKKzB4MDAxQzM1MDAsIDB4MDAxRDQwMDQsIDB4MDAyMDBFQTIsIDB4MDAyMDA5NDAsCisweDAwMUUyMTJDLCAweDAwMUMzRDI4LCAweDAwMTE3RDAwLCAweDAwMjAwRTA2LAorMHgwMDIwMjkyMCwgMHgwMDFDMzcwNCwgMHgwMDIwMUZENCwgMHgwMDFDMzczQywKKzB4MDAxQzM3MDAsIDB4NEYyMjJGRTYsIDB4NkU1MzdGRkMsIDB4MkY0MkJGQ0EsCisweEQ2MTU2MUUyLCAweDE2MTVFMjgwLCAweDQyMTg1NEUxLCAweDU1RTIxNjQ2LAorMHgxNjU3NDIyOCwgMHg2RUYyNTdFMywgMHgyRTJCMTY3OCwgMHg3RjA0MjZFMiwKKzB4QUZBNzRGMjYsIDB4MkZDNjZFRjYsIDB4MkZFNjJGRDYsIDB4REQwQTRGMjIsCisweEJGQUY2QzUzLCAweEJGOTQ2RTQzLCAweEJGQUIyREUyLCAweDUxRDUwMDA5LAorMHg1NEQ2MkMxMiwgMHg1NUQ3MUM0MSwgMHg1NkQ4MUM1MiwgMHg0RjI2MUM2MywKKzB4NkRGNjZFRjYsIDB4NkNGNjAwMEIsIDB4MDAxQzM3MEMsIDB4MDAwOUEwQzAsCisweEQxN0I0RjIyLCAweEQ0N0I5MkI2LCAweDIxMjJCMDBELCAweDk3QjJFNjA1LAorMHhCMDIyOTVCMiwgMHhCMDM2NjQ2MywgMHhCMDM2MDAwOSwgMHhCMDM5MDAwOSwKKzB4QTA2ODAwMDksIDB4NEYxMjRGMjYsIDB4RDE3MzRGMDIsIDB4OTRBNDMxNDUsCisweDQ2MDkwNjBBLCAweDQ2MDk0NjA5LCAweDAwMjkzNjQ2LCAweEQ3NkNENTZGLAorMHgyNTAwQ0EwMSwgMHg0RjA2Mjc2MiwgMHg0RjE2MDAwQiwgMHhCRkVBNEYyMiwKKzB4QjAxRjAwMDksIDB4QTA0RTAwMDksIDB4MkZFNjRGMjYsIDB4NkU2M0QxNjgsCisweDQ0MTg2NjEyLCAweDQ1Mjg5MjhBLCAweDI2Mjk0NDA4LCAweDQ0MDg0NTAwLAorMHg0NDAwMjY1QiwgMHg0NzA4MjY0QiwgMHg0NzA4MjE2MiwgMHgyN0VCRDE2MSwKKzB4MDAwQjIxNzIsIDB4MDAwQjZFRjYsIDB4RDI1RjAwMDksIDB4RTQwQTk2NzcsCisweDIyNjJBRkI0LCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweERDNUI0RjIyLAorMHgyQzIyRTIwMSwgMHhCRkE5RTQwQSwgMHg2MEMyN0M0NCwgMHhDQjAxRUQwMCwKKzB4NjBDMjJDMDIsIDB4QzkwMUVCNjQsIDB4NkUwM0EwMDgsIDB4ODkwNzNEQjIsCisweEU0MDE2MEMyLCAweEJGOTlDOTAxLCAweDdEMDE2RTAzLCAweDhCRjUyRUU4LAorMHg4QjAzM0RCMiwgMHhEMjRGRDQ0RSwgMHgwMDA5NDIwQiwgMHg0RjI2RTQwQSwKKzB4NkRGNjZFRjYsIDB4QUY4OTZDRjYsIDB4NDQxMTZCRjYsIDB4NjA0QjhGMDEsCisweDAwMEI2MDQzLCAweDJGQjYwMDA5LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LAorMHhEQzQ1N0ZGQywgMHg2MEMyRUQwMCwgMHhDQjAyRUI2NCwgMHg2MEMyMkMwMiwKKzB4QzkwMjJGMDIsIDB4NkUwM0EwMDksIDB4ODkwODNEQjMsIDB4RTQ2NDYwQzIsCisweEM5MDIyRjAyLCAweDZFMDNCRjZBLCAweDJFRTg3RDAxLCAweEQ3M0I4QkY0LAorMHg2MTcyNTFDMSwgMHhERTNCREMzQSwgMHhEMjNDRDEzQiwgMHg2NEMyM0RCMywKKzB4NjUxMjY0RTIsIDB4NjUyMjhGMDksIDB4RDIzMkQ0MzksIDB4NEYyNjdGMDQsCisweDZERjY2RUY2LCAweDQyMkI2Q0Y2LCAweDdGMDQ2QkY2LCAweDZFRjY0RjI2LAorMHg2Q0Y2NkRGNiwgMHg2QkY2MDAwQiwgMHg1NjUxRDUzMiwgMHg0NjI4NjA1MiwKKzB4MzA2QzAwMEIsIDB4NTI4ODA5NkMsIDB4MDlCNDVCQjQsIDB4MDNDNDFGRkYsCisweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweDRGMTI0RjIyLCAweEJGRUI0RjAyLAorMHg2QjAzNkU0MywgMHhERDE4REMyOCwgMHgwMDA5QkZFNiwgMHgzQzA1MzBCOCwKKzB4NDYwOTA2MEEsIDB4NDYwMTQ2MDksIDB4MDIwQTNENjUsIDB4NDIwOTQyMDksCisweDMyRTI0MjA5LCAweDRGMDY4QkYwLCAweDRGMjY0RjE2LCAweDZERjY2RUY2LAorMHgwMDBCNkNGNiwgMHgyRkU2NkJGNiwgMHhERTFDNEYyMiwgMHhFNTAwRTEwMiwKKzB4MkUxMkU0MDMsIDB4MkU1MkJGRDQsIDB4NDYxOEU2MDYsIDB4RTQwM0U3MDAsCisweDJFNzIyRTYyLCAweEFGQ0I0RjI2LCAweDAwMEI2RUY2LCAweDAwMDAwMDA5LAorMHgwMDIwMjg5MCwgMHgwMDI0Q0RFMCwgMHgxMDYyNEREMywgMHgwMDIwMkE4QywKKzB4MDAxQzU4MTQsIDB4MDAxQzU5RDAsIDB4MDAxQzU4MDQsIDB4MDAxQzU4MUMsCisweDAwMjAyOTM0LCAweDAwMjAwREE2LCAweDAwMUM1ODYwLCAweDAwMUM2ODY0LAorMHgwMDFDNzg2NCwgMHgwMDFDNTlCQywgMHgwMDFDNjlCQywgMHgwMDFDNzlCQywKKzB4MDAyMDI5NEMsIDB4MDAxQzEwNDAsIDB4Q0NDQ0NDQ0QsIDB4MDAxRDQwMDQsCisweDJGOTYyRjg2LCAweDJGQjYyRkE2LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LAorMHhFNDAwN0ZFNCwgMHg0NTI4RTUxMCwgMHg2NzQzNkM0MywgMHhFMTA3QTAwRiwKKzB4NjA0MzY0NEQsIDB4MEY1NjQwMDgsIDB4RUUwMDYwQzMsIDB4ODE1MTI1QzEsCisweDgxNTM4MTUyLCAweDE1NzMxNUUyLCAweDc1MTQxNUU0LCAweDYyNEQ3NDAxLAorMHg4QkVEMzIxMywgMHhEQTZGNTFGMSwgMHgxQTExNTRGMiwgMHhEMTZFMkExMiwKKzB4NTdGNDU1RjMsIDB4NkRGMjU4RjUsIDB4MTE0MUQ5NkMsIDB4MTE1MzIxNDIsCisweDExNzUxMTUyLCAweDExODcxMTc0LCAweDUyRjYxMTg2LCAweDE5RDFENjY4LAorMHhEODY4MjlEMiwgMHhEQTY4RTk1MCwgMHgxNjIxRUJCNCwgMHg2QkJDMjYyMiwKKzB4QTAyMTQ5MDgsIDB4NkVFREVFMDAsIDB4NjFFMzZERTMsIDB4NDEwODREMDgsCisweDMxRUMzREVDLCAweDQxMDg0RDA4LCAweDYwQzMzRDhDLCAweEU3OTA0MTA4LAorMHg4MUQxMkRDMSwgMHg0MTA4NjA5MywgMHg4MUQyNjc3QywgMHgzMUFDNjBDMywKKzB4MzQ3MkUyMDAsIDB4MUREMjgxRDMsIDB4RDQ1NTFEMTMsIDB4MUQyNDhEMDEsCisweEIwM0FENDUwLCAweDdFMDE2NUQzLCAweDM0QjI2NEVELCAweEQxNEQ4QkRCLAorMHg2NTEyREI1MiwgMHg0NTI5RDI0RCwgMHg2NDEyMUI1MSwgMHg2NzRERDE0QSwKKzB4NjcyMjJCNzIsIDB4NDcyOUQ2NEUsIDB4NjkyMjFCNzMsIDB4Njg5RDJGRDIsCisweDY5MTIxQjgyLCAweDVBMTIyNjkyLCAweDVCMTQxNkEyLCAweDE2QjREQTQ0LAorMHgxNkM2NUMxNiwgMHgxNkVBNkVBMiwgMHg0RjI2N0YxQywgMHg2REY2NkVGNiwKKzB4NkJGNjZDRjYsIDB4NjlGNjZBRjYsIDB4NjhGNjAwMEIsIDB4NjA2MTY2NDIsCisweDhEMDRDODAzLCAweDYwNjFFNTAwLCAweDg4MDJDOTAzLCAweDUyNjI4QjAzLAorMHg1MTI0NjU2MywgMHgwMDBCMjQxMiwgMHgyRkQ2NjA1MywgMHg0RjIyMkZFNiwKKzB4NkU1MzdGRUMsIDB4RTU1MDYyNTMsIDB4RTQwMDZENDMsIDB4QTAwMTQ1MDgsCisweDUyMjRFMTAxLCAweDIyMTE2MDQzLCAweDgxMjM4MTIxLCAweDgxMjI2MDUzLAorMHgzNjIwNTZFMiwgMHhEMjJGOEJGNSwgMHg2NEYzMTZFNCwgMHg0MjBCRTYxNCwKKzB4NjVFMTY1RTMsIDB4MjU0OUU0RkMsIDB4NjFGMTJFNTEsIDB4MjE0OTY1RjMsCisweDU0RDEyRjExLCAweDQxMEJEMTI3LCAweDU3RDFFNjE0LCAweENCMDE2MDcxLAorMHgxREUxMjcwMSwgMHg0RjI2N0YxNCwgMHgwMDBCNkVGNiwgMHgyRkQ2NkRGNiwKKzB4NEYyMjJGRTYsIDB4NkU1MzdGRUMsIDB4RTVGQzY2NTMsIDB4NjA2MTZENDMsCisweENCMDEyMDU5LCAweDUyRTIyNjAxLCAweDhCMDYzMjYwLCAweDUxRTIxMkU0LAorMHg4QjA0MzFFMCwgMHhBMDAyNTJEMSwgMHhBRkYwMUUyMiwgMHhEMjE1NTY2NCwKKzB4RTYxNDY0RjMsIDB4NjVFMzQyMEIsIDB4RTFGQzY3RTEsIDB4MkU3MTI3MTksCisweDU0RDE2N0YxLCAweEQxMEYyNzE5LCAweEU2MTQ2NUYzLCAweDJGNzE0MTBCLAorMHg2MDIxNTJEMSwgMHgyMjAxQ0IwMSwgMHg3RjE0MURFMSwgMHg2RUY2NEYyNiwKKzB4NkRGNjAwMEIsIDB4MDAyMDI4NUMsIDB4MDAyMDI4NjQsIDB4MDAyMDI4NTQsCisweDAwMjAyODg0LCAweDAwMTAwMDhDLCAweDAwMTAwRUMwLCAweDAwMUUyMTA4LAorMHgwMDFDM0QwMCwgMHgwMDIwMjEzNCwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwKKzB4RDYzMTRGMjIsIDB4NjBEMzZENjIsIDB4ODk0REM4MDMsIDB4REIzMERDMkYsCisweDAwMDlBMDJDLCAweEM5MDM2MDYxLCAweDg5MkI4ODAxLCAweEQyMkRENDJCLAorMHgwMDA5NDIwQiwgMHg2NTAzNTYwMywgMHhDODIwODU2MSwgMHhFMDUwODkwMywKKzB4NzIwMTAyQkUsIDB4ODU2MjBCMjYsIDB4NDAwMDYwMEQsIDB4NDAwMDM2NkEsCisweDQwMDA0NjI0LCAweDIwNkQ0NjI0LCAweEQ0MjNDOTAzLCAweDQwMDg2RTAzLAorMHhEMTIyNDAwMCwgMHgzNDBDNDEwQiwgMHg2MUUzRDUyMSwgMHhENzIxRTAwMSwKKzB4NDUwQkQyMjEsIDB4NjRFMzdFMzAsIDB4MjcwMjQyMEIsIDB4NjZDMjUyQzEsCisweDhCQ0YzNjIwLCAweDRFMThFRTAxLCAweEEwMTFEQjFDLCAweDYwNjFFQzc1LAorMHg4ODAxQzkwMywgMHhENDE5ODkxMCwgMHg0NjBCRDYxMiwgMHhENDE4MDAwOSwKKzB4NDcwQkQ3MTgsIDB4RDIxMzY1MDMsIDB4NjRDM0QxMTMsIDB4MjJFMjQxMEIsCisweDY2QjI1MkIxLCAweDhCRUEzNjIwLCAweEM4MDQ2MEQzLCAweEQyMTI4OTA2LAorMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QkY2NDIyQiwgMHg2RUY2NEYyNiwKKzB4NkNGNjZERjYsIDB4NkJGNjAwMEIsIDB4MDAxRTIxMDAsIDB4MDAyMDI4NUMsCisweDAwMjAyN0Y4LCAweDAwMjAwQTVDLCAweDAwMjAyODY0LCAweDAwMjAwQURFLAorMHgwMDIwMUZENCwgMHgwMDFDM0QzMCwgMHgwMDIwMEQ2QywgMHgwMDIwMjg1NCwKKzB4MDAyMDI4ODQsIDB4MDAyMDBBN0EsIDB4MDAyMDAwRjgsIDB4RTYwMUQyMzcsCisweDEyNjVENTM3LCAweDAwMEIyMjUyLCAweEQ2MzYxMjY2LCAweDg4MDE2MDYyLAorMHhFMTAxOEI2MiwgMHhENTM0MjYxMiwgMHg1NDUxRDEzNCwgMHhFMDQwNjIxMiwKKzB4MjEyMjMyNEMsIDB4NTQxMTU3NTIsIDB4MTE0MTM0N0MsIDB4NTcxMjU0NTMsCisweDExNzIzNzRDLCAweDUyMTM1NzU1LCAweDExMjMzMjdDLCAweDU2MTQ2NDUyLAorMHgxMTY0MzY0QywgMHg1NDE1NTc1NCwgMHgxMTQ1MzQ3QywgMHg1NjE2NTQ1OCwKKzB4MTE2NjM2NEMsIDB4Njc2MkQ2MjYsIDB4MzI3QzUyMTcsIDB4NTc2MTExMjcsCisweDMyN0M1MjE4LCAweDU3NjIxMTI4LCAweDMyN0M1MjE5LCAweDU3NjMxMTI5LAorMHgzNDdDNTQxQSwgMHg1NzY0MTE0QSwgMHgzNDdDNTQxQiwgMHg1NzY1MTE0QiwKKzB4MzQ3QzU0MUMsIDB4NTI2NjExNEMsIDB4MzcyQzU3MUQsIDB4NTI2NzExN0QsCisweDM0MkM1NDFFLCAweDUyNjgxMTRFLCAweDM2MkM1NjFGLCAweEQ2MTUxMTZGLAorMHgwNDFFNjI2MiwgMHgzNDJDNzY5NCwgMHhFMDQ0MDE0NiwgMHgwNjFFNjI2MiwKKzB4MDE2NjM2MkMsIDB4NTI1Q0UwNDgsIDB4RDYwRjA1MUUsIDB4MDE1NjM1MkMsCisweEUwNTQ2MjYyLCAweDQyMjkwNTFFLCAweDAxNTYzNTJDLCAweEUwNTg1NTYxLAorMHg0NTI5MDYxRSwgMHgwMTY2MzY1QywgMHgwMDA5MDAwQiwgMHgwMDFDMTAxMCwKKzB4MDAwMEMzNEYsIDB4MDAxQzEwMjgsIDB4MDAxQzM2OUMsIDB4MDAyMDI3RjgsCisweDAwMUMzQ0EwLCAweDAwMUMzNkY0LCAweDAwMUMzQjg4LCAweEQ2MkY3RkZDLAorMHgyNjQyNjQ0QywgMHhDODIwNTA2NiwgMHgyRjAyOERGQywgMHg3RjA0MDAwQiwKKzB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4NkQ0MzZDNTMsIDB4RUUwMEEwMDQsCisweDdFMDE2NEQ0LCAweDY0NENCRkVBLCAweDhCRjkzRUMyLCAweDZFRjY0RjI2LAorMHgwMDBCNkRGNiwgMHhBMDAxNkNGNiwgMHg3NjAxNjY0MywgMHgyMjI4NjI2MCwKKzB4MzY0ODhCRkIsIDB4NjU2M0FGRTQsIDB4MkZCNjJGOTYsIDB4MkZENjJGQzYsCisweDRGMjIyRkU2LCAweEVDMUNFRDA4LCAweERCMTk2RTUzLCAweDYxQzNFOTBBLAorMHg2MDQzNEIwQiwgMHgzMDkyQzkwRiwgMHg2NjAzOEQwMiwgMHg3NjMwQTAwMSwKKzB4NEQxMDc2MzcsIDB4N0UwMTJFNjAsIDB4N0NGQzhGRjEsIDB4ODA1OEUwMDAsCisweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDAwMEI2QkY2LCAweDAwMEI2OUY2LAorMHgwMDBCRTAwMCwgMHgyRkU2RTAwMCwgMHg3RkVDNEYyMiwgMHg2RTQzNjI1MywKKzB4QkZEMTY1RjMsIDB4QkZDNjY0MjMsIDB4QkZDNDY0RTMsIDB4RDQwNTY0RjMsCisweDAwMDlCRkMxLCAweDRGMjY3RjE0LCAweDZFRjYwMDBCLCAweDAwMUMwMDA0LAorMHgwMDIwMjA5NCwgMHgwMDIwMjk2OCwgMHhFMTEwRDU5QywgMHhFNjQwNjA1MCwKKzB4MjUwMEM5RkQsIDB4RTBGRjc1RTksIDB4ODA1MTY0NTMsIDB4ODA1MzgwNTIsCisweDgwNTY4MDU1LCAweDI1MTA3NUVGLCAweEUxRUY2MjUwLCAweDIyMTlFMDAxLAorMHhFNzIwMjUyMCwgMHgyNDYwODA1MiwgMHgyNTcwMDAwQiwgMHhFNEZERDU5MCwKKzB4RTcwMjYxNTIsIDB4MjUxMjIxNDksIDB4NzQwMTYwNTIsIDB4MjUwMkNCMDEsCisweEQxOEM2NjUyLCAweDI1NjIyNjQ5LCAweDkyQzI2MDEyLCAweDIxMDJDQjA4LAorMHhDOUNGNjAxMiwgMHg2MDEyMjEwMiwgMHgyMTAyQ0IwMywgMHgwMDBCMTE3MiwKKzB4NEYyMjExMjMsIDB4RTEwMEQ0ODQsIDB4RDI4NUQ3ODQsIDB4RDU4NTI0MTAsCisweDI3MTFENDg1LCAweDIyMTFFNzAwLCAweEJGQkQyNTExLCAweEQ1ODMyNDcxLAorMHgyNTYwRTYwMCwgMHg0RjI2QUZEMiwgMHhEMjgxNjY0QywgMHgzNjJDNDYwMCwKKzB4Q0IxMDYwNjAsIDB4MjYwMDAwMEIsIDB4RDI3RDY1NEMsIDB4MzUyQzQ1MDAsCisweEUxRUY2NjUwLCAweDAwMEIyNjE5LCAweDY2NEMyNTYwLCAweDQ2MDBEMjc5LAorMHg2MDYwMzYyQywgMHgwMDBCQ0IxMCwgMHg2NTRDMjYwMCwgMHg0NTAwRDI3NSwKKzB4NjY1MDM1MkMsIDB4MjYxOUUxRUYsIDB4MjU2MDAwMEIsIDB4RDI3MDY2NEMsCisweDM2MkM0NjAwLCAweENCMDg2MDYwLCAweDI2MDAwMDBCLCAweEQyNkM2NTRDLAorMHgzNTJDNDUwMCwgMHhFMUY3NjY1MCwgMHgwMDBCMjYxOSwgMHg2NjRDMjU2MCwKKzB4NDYwMEQyNjgsIDB4NjA2MDM2MkMsIDB4MDAwQkNCMDgsIDB4NjU0QzI2MDAsCisweDQ1MDBEMjY0LCAweDY2NTAzNTJDLCAweDI2MTlFMUY3LCAweDI1NjAwMDBCLAorMHhENjVGNjI0QywgMHgzMjZDNDIwMCwgMHhDOTA4NjAyMCwgMHg0MDIxNDAyMSwKKzB4MDAwQjQwMjEsIDB4NjI0QzYwMEMsIDB4NDIwMEQ2NUEsIDB4NjAyMDMyNkMsCisweDQwMjFDOTA4LCAweDQwMjE0MDIxLCAweDYwMEMwMDBCLCAweEQxNTY2NDRDLAorMHgzNDFDNzRGRiwgMHgwMDBCNjI0MCwgMHhEMTU0NjAyQywgMHgzNDFDNjQ0QywKKzB4MDAwQjYyNDAsIDB4MkZFNjYwMkMsIDB4NjU1QzRGMjIsIDB4MzU2N0U2MEEsCisweDZFNDM4RDE1LCAweDY0NTNCRkVBLCAweDYwRUM2NDBDLCAweDhCMDI4ODAxLAorMHhBMDAyRTAwRiwgMHg0NDA5MjQwOSwgMHg2MjRDNDQwOSwgMHgzMjYzRTYwQSwKKzB4QkZFMjg5MDUsIDB4NjIwQzY0NEMsIDB4Qzg4MDYwMjMsIDB4RTIwMDhCMDAsCisweDRGMjY2MDIzLCAweDZFRjYwMDBCLCAweEQ2NDE0RjIyLCAweDg4MDE2MDYyLAorMHhCMjIyOEIwMywgMHhBMDAzMDAwOSwgMHhEMjNFMDAwOSwgMHgyMjYwRTY0MCwKKzB4RTIwMEQ2M0QsIDB4MDAwQjRGMjYsIDB4NEYyMjI2MjIsIDB4NjA2MkQ2MzgsCisweDhCMDE4ODAyLCAweDAwMDlCMjZDLCAweEUyMDBENjM3LCAweDAwMEI0RjI2LAorMHgwRkZGMjYyMiwgMHhENDMzRDUzMiwgMHhFNzAxRTEwMCwgMHgwMDBCMjUxMiwKKzB4RDIzMDI0NzAsIDB4MDAwQkU2MDQsIDB4RDUyMDIyNjAsIDB4NjE1MEU0RkQsCisweDIxNDlENjJFLCAweDI1MTBFNzAwLCAweDI2NzAwMDBCLCAweEU0RkJENTFCLAorMHgyMjQ5NjI1MCwgMHgyNTIwMDAwQiwgMHhFNEY3RDUxOCwgMHgyMjQ5NjI1MCwKKzB4MjUyMDAwMEIsIDB4RDIyNjRGMjIsIDB4NjAwRDg1MjIsIDB4ODkxMTIwMDgsCisweDg5MTM4ODAxLCAweDg5MTU4ODAzLCAweDg5MTc4ODA1LCAweDg5NDE4ODA2LAorMHg4OTQ3ODgwOCwgMHg4OTREODgwOSwgMHg4OTUzODgwQSwgMHg4OTU5ODgwQiwKKzB4MDAwOUEwNjAsIDB4MDAwOUIwNjIsIDB4NjAwQ0EwNUQsIDB4MDAwOUIwNzAsCisweDYwMENBMDU5LCAweDAwMDlCMDdBLCAweDYwMENBMDU1LCAweDYyNjBENjA2LAorMHg4QjRGMjIyOCwgMHgwMDA5QjA4NiwgMHg2MDBDQTA0RCwgMHgwMDFFMTAyOCwKKzB4MDAxRTIxNDgsIDB4MDAxRTExMDgsIDB4MDAyMDI4RDksIDB4MDAyMDI4QzgsCisweDAwMjAyOENBLCAweDAwMjAyOENDLCAweDAwMjAyOEFDLCAweDAwMUUxMDA4LAorMHgwMDFFMTAzRiwgMHgwMDFFMTA1RiwgMHgwMDFFMTAzMCwgMHgwMDFFMTA5MCwKKzB4MDAyMDI4RDQsIDB4MDAxRTEwMEIsIDB4MDAyMDI4RDAsIDB4MDAyMDI4RDgsCisweDAwMjAyOEEwLCAweDYyNjBENjg3LCAweDhCMjMyMjI4LCAweDAwMDlCMDZBLAorMHg2MDBDQTAyMSwgMHg2MjYwRDY4MywgMHg4QjFCMjIyOCwgMHgwMDA5QjBCNCwKKzB4NjAwQ0EwMTksIDB4NjI2MEQ2N0YsIDB4OEIxMzIyMjgsIDB4MDAwOUIwQkEsCisweDYwMENBMDExLCAweDYyNjBENjdCLCAweDhCMEIyMjI4LCAweDAwMDlCMTFFLAorMHg2MDBDQTAwOSwgMHg2MjYwRDY3NywgMHg4QjAzMjIyOCwgMHgwMDA5QjEzNiwKKzB4NjAwQ0EwMDEsIDB4NEYyNkUwMDAsIDB4MDAwOTAwMEIsIDB4RDI3M0QxNzIsCisweEQ1NzM4NDEyLCAweDQwMDBDOTBGLCAweEQ3NzIwMTJELCAweDYxMUNFNDAzLAorMHhENjcxRTIwRiwgMHgyNzEyMjU0MCwgMHhFMDAxMjUyMCwgMHgyNjAyMDAwQiwKKzB4RTYwMUQyNjksIDB4MzA2Njg1MjMsIDB4RTAwMDhEMDYsIDB4RTAwMEQyNjcsCisweDgxMjJENjY5LCAweDI2MDJFMDAxLCAweDAwMDkwMDBCLCAweDg1MjNEMjYyLAorMHgyMDA4NjAwRCwgMHg4ODAxODkwNSwgMHhENjY0OEIwQSwgMHhDQjAxNjA2MCwKKzB4RDY2MTI2MDAsIDB4RTEwMUQ0NUQsIDB4MjYxMkUwMDEsIDB4ODE0MjAwMEIsCisweEUwMDAwMDBCLCAweEU1MDFEMTU4LCAweDQ1MTg4NTEzLCAweDM0NTM2NDBELAorMHg4RDA1NjYwMywgMHhEMjVBRTAwMCwgMHhFMDAxRDU1NywgMHgyNTAyMjI2MCwKKzB4MDAwOTAwMEIsIDB4RDE1MDRGMjIsIDB4NjUwRDg1MTMsIDB4NDQxOTY0NTMsCisweDY3MkU2MjQ5LCAweDYwMkMyMjdELCAweDg5MDk4ODAxLCAweDg5MEM4ODAyLAorMHg4OTEwODgwMywgMHg4OTI2ODgwNiwgMHg4OTI5ODgwNywgMHgwMDA5QTAzOCwKKzB4RDY0REQ1NEMsIDB4QTAyN0UyMTIsIDB4NjI1QzI2NTIsIDB4OEIyRjIyMjgsCisweEEwMUVENjRBLCAweDYwNUM2MjYyLCAweDg5MDUyMDA4LCAweDg5MDg4ODEwLAorMHg4OTBCODgyMCwgMHgwMDA5QTAyNCwgMHhENjQzRDQ0NSwgMHhBMDEzRTIwNCwKKzB4RDc0NDI2NDIsIDB4RTIwQ0Q2NDAsIDB4MjY3MkEwMEUsIDB4RDYzRUQ1NDIsCisweEEwMDlFMjE4LCAweEQ0NDEyNjUyLCAweEUyMEFENjNCLCAweDI2NDJBMDA0LAorMHhENjM5RDIzRiwgMHhFMjJFMjYyMiwgMHhENDNFODUxNSwgMHgzMjc3NjcwRCwKKzB4OEYwMTI0MjEsIDB4MjQ1MTY1MDMsIDB4MDAwOUIwREYsIDB4RTAwMUEwMDEsCisweDRGMjZFMDAwLCAweDAwMDkwMDBCLCAweEUxMDFENjI5LCAweDI2MTBENDM2LAorMHhENzI4NjU0MSwgMHg2NTVERDEyOCwgMHhFMDAxRTIwRiwgMHgyNjIwMjc1MiwKKzB4MjEwMjAwMEIsIDB4NEYyMjJGRTYsIDB4ODUyM0QyMUYsIDB4MjQ0ODY0MEMsCisweEQ2MkQ4QjA4LCAweEUyMDBENTIxLCAweDg0NTEyNjIxLCAweDIwNDk5NDMwLAorMHg4MDUxQTAyNiwgMHg2MEUwREUxRCwgMHg4RDBCQzg0MCwgMHgzNDI3RTIwMSwKKzB4RDEyNTg5MjIsIDB4NDIwQkQyMjUsIDB4RDUyNTIxNDEsIDB4Q0IwNDYwNTIsCisweDI1MDJBMDBCLCAweDg5MTczNDI3LCAweEQ3MjJEMjFGLCAweDIyNDE0NzBCLAorMHhFNUZCRDYxRiwgMHgyMTU5NjE2MiwgMHg4NEUxMjYxMiwgMHhCMTJEQ0I4MCwKKzB4NjBFMDgwRTEsIDB4Q0IwNEQ2MUMsIDB4NjA2MDJFMDAsIDB4MjYwMEM5M0YsCisweEUwMDFENjA5LCAweDI2MDJBMDAxLCAweDRGMjZFMDAwLCAweDZFRjYwMDBCLAorMHgwMDAwRkY3RiwgMHgwMDIwMjhEOSwgMHgwMDIwMjhBMCwgMHgwMDIwMjhBQywKKzB4MDAxRTExMDAsIDB4MDAxRTEwMEMsIDB4MDAyMDI4RDAsIDB4MDAxRTEwMDAsCisweDAwMUUxMDAxLCAweDAwMjAyQTkwLCAweDAwMjAyOEI0LCAweDAwMjAyOEJDLAorMHgwMDIwMkFGRSwgMHgwMDIwMkIwMiwgMHgwMDIwMkIwRSwgMHgwMDIwMkIyNiwKKzB4MDAyMDJCMzAsIDB4MDAyMDI4QjgsIDB4MDAyMDI4QzYsIDB4MDAyMDFBMzIsCisweDAwMUUxMTA4LCAweDAwMjAxQjNFLCAweDAwMUUxMDE1LCAweDYwNjBENjk2LAorMHg4OTE5Qzg4MCwgMHg2MDIxRDI5NSwgMHg4QjE1ODgwMSwgMHhFNTAxRDI5NCwKKzB4MzA1Njg1MjQsIDB4RDE5Mzg5MTAsIDB4RDQ5M0UyMDMsIDB4NjU0MTIxMjAsCisweDY1NURFMDBCLCAweEQ1OTEwNjU2LCAweEU3MDJFNDBGLCAweDI1NzEyMTQwLAorMHhFMDAxRDc4RiwgMHgyNzAyMDAwQiwgMHhFMDAwMDAwQiwgMHg0RjIyMkZFNiwKKzB4ODRFMURFOEMsIDB4ODkzNEM4ODAsIDB4ODU1NEQ1ODUsIDB4OEYzMDIwMDgsCisweEQ3ODk2MTAzLCAweDY2NzI4NTUzLCAweDY1MEM2NDAzLCAweDYyMEM4NTY2LAorMHg4QjI2MzUyMCwgMHhENzgwRDY4NSwgMHg2NDRDNjUxQywgMHgyNzQxMjY1MSwKKzB4Qzg0MDYwRTAsIDB4RDI4Mjg5MDcsIDB4MDAwOTQyMEIsIDB4NjA2MkQ2ODEsCisweEEwMDhDQjA0LCAweEQxODAyNjAyLCAweDAwMDk0MTBCLCAweEU1RkJENjdELAorMHgyNDU5NjQ2MiwgMHhCMEExMjY0MiwgMHhENTc1MDAwOSwgMHgyNTIyRTIwMSwKKzB4RDc3QTYwRTAsIDB4MkUwMENCMDQsIDB4QzkzRjYwNzAsIDB4QTAwMTI3MDAsCisweEUwMDA2MDIzLCAweDAwMEI0RjI2LCAweDJGQTY2RUY2LCAweDJGQzYyRkI2LAorMHgyRkU2MkZENiwgMHhFMjQwREE2OSwgMHhEQzY2NjZBMSwgMHgzMTIzNjE2RCwKKzB4NjI2Mzg5MDAsIDB4NkVEMzZEMkMsIDB4NEUyMTM2RDgsIDB4NEUyMTJBNjEsCisweERCNkNENDZCLCAweEU3MDBBMDBGLCAweDc3MDE2NkIyLCAweDcxMDI2MTYzLAorMHg2NTYxMkIxMiwgMHg3MTAyNjYxMywgMHg2MjYxMkIxMiwgMHg2MjJENjU1RCwKKzB4MzI1QzQyMjgsIDB4NjI3QzI0MjIsIDB4OEJFRDMyRTMsIDB4QzkwMzYwRDMsCisweDhCMTA4ODAzLCAweEVEMDc2RUIyLCAweDcxMDI2MUUzLCAweDY3MTMyQjEyLAorMHg2MkUxNzEwMiwgMHg2NTcxMkIxMiwgMHg2NTVENjIyRCwgMHgzNTJDNDUyOCwKKzB4QTAwQzJDRDAsIDB4ODgwMjI0NTIsIDB4QTAwMzhCMDEsIDB4ODgwMUUyMDMsCisweEUyMDE4QjA1LCAweDY2QjIyQzIwLCAweDY3N0Q2NzYxLCAweEVCMEYyNDcyLAorMHg2REExMkNCMCwgMHg4QjA1MkREOCwgMHhENDQ1RDI0RiwgMHhFMTAxRUUwMCwKKzB4MjQxMjIyRTIsIDB4NkRGNjZFRjYsIDB4NkJGNjZDRjYsIDB4NkFGNjAwMEIsCisweDJGRTYyRkQ2LCAweEUyNDBERDNELCAweDYxNkQ2NkQxLCAweDg5MDAzMTIzLAorMHg2NzJDNjI2MywgMHhERTQzMzY3OCwgMHgyRDYxNzcwMywgMHhENjQwNDcyMSwKKzB4NDcyMTY0RTIsIDB4RTEwMEEwMEUsIDB4NzEwMTY1NjIsIDB4MjQ1MDYyNTMsCisweDQyMTk3NDAxLCAweDc0MDEyNDIwLCAweDI0NTA0NTI5LCAweDQ1MTk3NDAxLAorMHg3NDAxMjQ1MCwgMHgzMjczNjIxQywgMHg0MjAwOEJFRSwgMHg2NEQxNjZFMiwKKzB4MzYyQzQyMDAsIDB4OEYwNjI0NDgsIDB4REQzMzJFNjIsIDB4RTUwMERFMjgsCisweDJENTJFNzAxLCAweDZFRjYyRTcyLCAweDZERjYwMDBCLCAweDJGRTYyRkQ2LAorMHhFRTAxNEYyMiwgMHhFRDBBQTAwNSwgMHg2NEUzQkNCNiwgMHg2NEUzQkNCQywKKzB4NjJFQzdFMDEsIDB4OEJGNzMyRDcsIDB4RUUwMUEwMDUsIDB4NjRFM0JDQkQsCisweDY0RTNCQ0MzLCAweDYyRUM3RTAxLCAweDhCRjczMkQ3LCAweDZFRjY0RjI2LAorMHg2REY2MDAwQiwgMHgyRkU2MkZENiwgMHg3RkZDNEYyMiwgMHg2MDYwRDYxRiwKKzB4ODk3NTg4MDEsIDB4RTEwMUQ0MUUsIDB4RDcxMjg1NDgsIDB4NjUwRDI2MTAsCisweDQ1MTk2MDcwLCAweDY2NTlERDFCLCAweDYxRDM2MjZFLCAweEM4NDAyNjJELAorMHg3NDAyNzEwMiwgMHg4RDQ3RDcxOCwgMHhEMjE4NjY2QywgMHhFNTAxREUwQSwKKzB4QTAzMTJFMjIsIDB4MDAwMEVFMDQsIDB4MDAxRTEwMDEsIDB4MDAyMDI4QzYsCisweDAwMjAyOEEwLCAweDAwMUUxMTAwLCAweDAwMjAyOENBLCAweDAwMjAyOEI4LAorMHgwMDIwMjhEMCwgMHgwMDFFMTAwMCwgMHgwMDIwMjhCQywgMHgwMDIwMjhDOCwKKzB4MDAyMDFBMzIsIDB4MDAxRTExMDgsIDB4MDAyMDFCM0UsIDB4MDAxRTEwMTUsCisweDAwMUUxMDBDLCAweDAwMjAyOEI0LCAweDAwMjAyOEQ0LCAweDAwMjAyOEQ4LAorMHgwMDIwMkE5MCwgMHgwMDIwMkIyNiwgMHgwMDIwMkIzMiwgMHgwMDIwMkFBMiwKKzB4NzUwMTYyNDUsIDB4NzEwMjIxMjEsIDB4MzJFMzYyNUMsIDB4NjA2MzhCRjgsCisweEU2MDE4MUQ0LCAweEU0MTdENTM4LCAweDMyNDM2MjZDLCAweDYyNTU4OTFFLAorMHgyNzIxNzYwMSwgMHg3NzAyQUZGOCwgMHhERTM1RDIzNCwgMHgyRTIyRTUwMSwKKzB4RUUwNEEwMDQsIDB4NzUwMTYyNDUsIDB4NzEwMjIxMjEsIDB4MzJFMzYyNUMsCisweDYwNjM4QkY4LCAweEU2MDE4MUQ0LCAweEEwMDRENTJFLCAweDYyNTVFNDE3LAorMHgyNzIxNzYwMSwgMHg2MjZDNzcwMiwgMHg4QkY4MzI0MywgMHgyRDIxOTI0QiwKKzB4RDcyQUQ0MjksIDB4MkYxMjYxNDIsIDB4NkRGMjY1RjIsIDB4Qzk4MDYwNTMsCisweDYwNTMyNzAwLCAweDYxMDNDOTYwLCAweDYwNTM4MDcxLCAweDY1RjI2RUYyLAorMHg0RDE5QzkwMywgMHg4MDcyNDUyOSwgMHg0NTE5NjBEQywgMHg0RTI5ODE3MiwKKzB4NjJFQzYwNUMsIDB4MzAyQzQwMTgsIDB4NkQ0MjgxNzMsIDB4MkZEMjIxMTgsCisweDYyRjI2RUYyLCAweDQyMTk2NkYyLCAweDY1NkM0NjI5LCAweDYwMkM2NkYyLAorMHg0MDE4NjRFQywgMHgzMDRDNDYyOSwgMHg4MTc0NDYxOSwgMHg0MDE4NjA2QywKKzB4OEYwNzMwNUMsIDB4QkNCNTgxNzUsIDB4NjIwQzAwMDksIDB4ODkwODIyMjgsCisweDAwMDlBMDBBLCAweDg4NDA2MDEzLCAweEIwMEE4QjAzLCAweEEwMDMwMDA5LAorMHhENjBCMDAwOSwgMHgyNjIyRTIwMiwgMHg0RjI2N0YwNCwgMHgwMDBCNkVGNiwKKzB4MDAwQjZERjYsIDB4MDYwQTAwMDksIDB4MDAyMDJBRDIsIDB4MDAyMDJBRDAsCisweDAwMjAyOEJDLCAweDAwMjAyQUE0LCAweDAwMUUxMDBDLCAweDAwMjAyOEEwLAorMHgwMDIwMjhEMCwgMHg3RkZDNEYyMiwgMHg2NjIwRDI3RSwgMHg4RDA4MjY2OCwKKzB4RDQ3RDJGNjAsIDB4NDIwQkQyN0QsIDB4NjRGMDAwMDksIDB4QTA5MDdGMDQsCisweDdGMDQ0RjI2LCAweDAwMEI0RjI2LCAweDAwMEIwMDA5LCAweDJGRTYwMDA5LAorMHhERTc3NEYyMiwgMHg2MEUwRDY3NywgMHhDQkMwRDQ3NywgMHg2MjYwMkUwMCwKKzB4QzgwMzYwMkMsIDB4NDAyMTg5MDQsIDB4NzAwMTQwMjEsIDB4NjYwM0EwMDIsCisweDY2MDM0MDA5LCAweEQ2NzE2MTZELCAweEU1MDBBMDA0LCAweDc1MDE2MjYyLAorMHg3NDA0MjQyMiwgMHgzMjEzNjI1RCwgMHhEMTZEOEJGOCwgMHgwMDA5NDEwQiwKKzB4RTQwMUQ2NkMsIDB4ODRFMjI2NDEsIDB4ODBFMkM5QkYsIDB4MDAwQjRGMjYsCisweDJGRTY2RUY2LCAweEQ1Njg3RkZDLCAweDYyNTBERTYxLCAweDY0MkM4NEUyLAorMHhDQjQwNzQwNCwgMHg4MEUyNjE0RCwgMHg0NDIxNjQxMywgMHhENzYzNDQyMSwKKzB4RTYwMEEwMDQsIDB4NzYwMTYyNTYsIDB4MjcyMjJGMjIsIDB4MzI0MzYyNkQsCisweDYwMTM4QkY4LCAweDIwMDhDOTAzLCAweDg4MDM4OTEyLCAweDg4MDI4OTA1LAorMHg4ODAxODkwNiwgMHhBMDA4ODkwNywgMHhFMDA3MDAwOSwgMHg4MDc4QTAwNSwKKzB4QTAwMkUwMDMsIDB4RTAwMTgwNzgsIDB4NjI1MjgwNzgsIDB4MjcyMjJGMjIsCisweEQ2NTBFMDBGLCAweDYwNjE4MDc4LCAweDhCMDE4ODAxLCAweDI2MjFFMjAwLAorMHg2MDYwRDY0RiwgMHgyNjAwQ0IwOCwgMHhDOTNGNjBFMCwgMHg3RjA0MkUwMCwKKzB4NkVGNjAwMEIsIDB4NjAyMUQyNDcsIDB4OEQxODg4MDEsIDB4RDI0NjYxNDMsCisweDIyMTA2MDUzLCAweDYwNjM4MDIxLCAweEQ0NDY4MTIxLCAweEU1MDBBMDA3LAorMHgwMjdDNjA1RCwgMHgzNjRDNjYwMywgMHgyNjIwNzAwMSwgMHg2MjVENjUwMywKKzB4MzIxMzYxMUMsIDB4RDY0MDhCRjQsIDB4QzlCRjYwNjAsIDB4MDAwQjI2MDAsCisweDJGRDYwMDA5LCAweDRGMjIyRkU2LCAweDYwNDM3RkZDLCAweDhEMDJDODIwLAorMHhCRjZBNkU0MywgMHg2MEUzMDAwOSwgMHg4OTAxQzgxMCwgMHgwMDA5QkY2NywKKzB4Qzg0MDYwRTMsIDB4QkY4Qzg5MDEsIDB4NjBFMzAwMDksIDB4ODkyOUM4MDEsCisweDYwRDBERDMyLCAweDhEMDNDODAyLCAweEQ2MzEyRjAwLCAweDAwMDk0NjBCLAorMHhDODA0NjBGMCwgMHhENjJGODkwMiwgMHgwMDA5NDYwQiwgMHg2MDIzNjJGMCwKKzB4ODkwMkM4ODAsIDB4Qzk3RjYwRDAsIDB4NjAyMzJEMDAsIDB4ODkwMkM4MDEsCisweDQyMEJEMjI5LCAweEQ1MjkwMDA5LCAweDg4MDI2MDUyLCAweEQyMjg4QjAzLAorMHhBMDA1RTYwNCwgMHg4ODAxMjI2MCwgMHhEMjI1OEIwMiwgMHgyMjYwRTYwMSwKKzB4MjUyMkUyMDAsIDB4Qzg4MDYwRTMsIDB4RDIyMjg5MTYsIDB4NjBFMzZFMjAsCisweDg5MDJDODAyLCAweDQyMEJEMjIwLCAweDYwRTMwMDA5LCAweDg5MDJDODA0LAorMHg0MjBCRDIxRSwgMHg2MEUzMDAwOSwgMHg4OTA1QzgwOCwgMHg3RjA0RDIxQywKKzB4NkVGNjRGMjYsIDB4NkRGNjQyMkIsIDB4NEYyNjdGMDQsIDB4MDAwQjZFRjYsCisweDAwMDA2REY2LCAweDAwMUUxMDIwLCAweDAwMjAyOTZDLCAweDAwMjAwREE2LAorMHgwMDFFMTAxNSwgMHgwMDFFMTBCRiwgMHgwMDExN0QwMCwgMHgwMDFFMTBGQywKKzB4MDAyMDAwRjgsIDB4MDAyMDI4Q0MsIDB4MDAxMTdEODAsIDB4MDAxRTEwRjgsCisweDAwMUUxMEFFLCAweDAwMTE3RDg0LCAweDAwMUUxMDE3LCAweDAwMUUxMDIxLAorMHgwMDIwMEZEOCwgMHgwMDIwMEZGQSwgMHgwMDIwMTU4NCwgMHgwMDIwMjhEMCwKKzB4MDAxRTEwMEIsIDB4MDAxRTEwMjgsIDB4MDAyMDEwMkEsIDB4MDAyMDEwM0MsCisweDAwMjAxMDQ4LCAweEQ2QTg2NDRDLCAweDM0NkM3NEZGLCAweDI0NTAwMDBCLAorMHg2NDRDRDZBNiwgMHgwMDBCMzQ2QywgMHhENkE1MjQ1MCwgMHgzNDZDNjQ0QywKKzB4MjQ1MDAwMEIsIDB4NjE2RDYyNUMsIDB4NDExOTQyMDgsIDB4NjAxOTQyMDgsCisweDY0NEM0MjAwLCAweDMyNEM2NzBFLCAweDIwN0REMTlFLCAweEM5MEY0MjAwLAorMHgwMDBCMzIxQywgMHg2NzYzMjIwMCwgMHg0MjA4NjI1QywgMHg0MjAwNDIwOCwKKzB4MzI0QzY0NEMsIDB4NDIwMEQxOTgsIDB4MDAwQjMyMUMsIDB4MkZFNjIyNzAsCisweDYxNEM0RjEyLCAweDQxMDBENDkzLCAweDY3MTAzMTRDLCAweDI3MjlFMjlGLAorMHg2NTczNkU1MywgMHg0NzE5Njc2RCwgMHg2NzJFNjI3OSwgMHg0MjIxMjI3RCwKKzB4NDIyMTQyMjEsIDB4NzYwMTY2MkMsIDB4RTQwMTQ2MDgsIDB4MzRFODQ2MDgsCisweDY0NEM0NjAwLCAweDBFMUEwNDY3LCAweDIxNTAyNUVCLCAweDAwMEI0RjE2LAorMHg0RjIyNkVGNiwgMHhEMjg1N0ZFOCwgMHg4ODAxNjAyMSwgMHhEMjg0OEI3QiwKKzB4MjY2ODY2MjEsIDB4RDI4MzhCNzcsIDB4MjY2ODY2MjEsIDB4RTUwRjhCNzMsCisweEU0MDFCRkEwLCAweEJGQTNFNTAxLCAweEU1ODZFNDAwLCAweEU0MDA2NTVDLAorMHgyRjUwQkZBMywgMHhCRkEwRTQwMSwgMHhFNjAyRTUwNiwgMHg2MDYzNDYxOCwKKzB4ODFGMkU0MDEsIDB4NjU0M0JGOUUsIDB4RTQwMTg1RjIsIDB4QkZBQTY1NDMsCisweDg1RjI2NjAzLCAweDY1NDNFNDAxLCAweDY2MDNCRkIxLCAweEU0MDI2NUYwLAorMHg2MDUzNzU2QywgMHg4MEY4QkY3RSwgMHhCRjgxRTQwMiwgMHg4NEY4RTUxMiwKKzB4NzA5MEU0MDIsIDB4NjUwM0JGODEsIDB4NDYxOEU2MDIsIDB4ODFGNjYwNjMsCisweEJGN0ZFNDAyLCAweDg1RjZFNTAwLCAweDY2MDNFNDAyLCAweEU1MDBCRjhCLAorMHhFNDAyODVGNiwgMHhCRjkyNjYwMywgMHhFNUZFRTUwMCwgMHhFMDEwNjU1QywKKzB4QkY1RkU0MDMsIDB4RTUxMzBGNTQsIDB4RTQwRUJGNjIsIDB4MDVGQ0UwMTAsCisweEJGNjJFNDBFLCAweEU1MDA3NTg1LCAweEJGNjNFNDAzLCAweEU1MDBFNjQwLAorMHhCRjcwRTQwMywgMHhFNTAwRTY0MCwgMHhCRjc4RTQwMywgMHhFNUZGRTY0MCwKKzB4RTAxNDY1NUMsIDB4QkY0NUU0MDQsIDB4RTQwRjBGNTQsIDB4RTUwNEJGNDgsCisweDA1RkNFMDE0LCAweEJGNDhFNDBGLCAweEU1MDE3NTg0LCAweEJGNDlFNjQwLAorMHhFNTAxRTQwNCwgMHhCRjU2RTY0MCwgMHhFNTAxRTQwNCwgMHhFNDA0RTY0MCwKKzB4QUY1QzdGMTgsIDB4N0YxODRGMjYsIDB4MDAwQjRGMjYsIDB4NEYyMjAwMDksCisweEQyNDI3RkYwLCAweDg4MDE2MDIxLCAweEQyNDE4QjcxLCAweDI2Njg2NjIxLAorMHhEMjQwOEI2RCwgMHgyNjY4NjYyMSwgMHhFNTBGOEI2OSwgMHhFNDAxQkYxQSwKKzB4QkYxREU1MDEsIDB4RTU4NkU0MDAsIDB4RTQwMDY1NUMsIDB4MkY1MEJGMUQsCisweEJGMUFFNDAxLCAweEU0MDFFNTA2LCAweEJGMUI2NTQzLCAweEU0MDFFNjQwLAorMHhCRjI4NjU0MywgMHhFNDAxRTY0MCwgMHhCRjMwNjU0MywgMHg2NUYwRTY0MCwKKzB4NzU2Q0U0MDIsIDB4QkVGRDYwNTMsIDB4RTQwMjgwRjQsIDB4RTUxMkJGMDAsCisweEU0MDI4NEY0LCAweEJGMDA3MDkwLCAweEU2NDA2NTAzLCAweEJGMDFFNDAyLAorMHhFNjQwRTUwMCwgMHhCRjBFRTQwMiwgMHhFNjQwRTUwMCwgMHhCRjE2RTQwMiwKKzB4RTVGRUU1MDAsIDB4NjA1MzY1NUMsIDB4QkVFM0U0MDMsIDB4RTUxMzgwRjgsCisweEU0MEVCRUU2LCAweEU0MEU4NEY4LCAweEJFRTY3MDg1LCAweEU1MDA2NTAzLAorMHhCRUU3RTY0MCwgMHhFNTAwRTQwMywgMHhCRUY0RTY0MCwgMHhFNTAwRTQwMywKKzB4QkVGQ0U2NDAsIDB4RTVGRkU0MDMsIDB4NjA1MzY1NUMsIDB4QkVDOUU0MDQsCisweEU0MEY4MEZDLCAweEU1MDRCRUNDLCAweEU0MEY4NEZDLCAweEJFQ0M3MDgzLAorMHhFNTAxNjUwMywgMHhCRUNERTY0MCwgMHhFNTAxRTQwNCwgMHhCRURBRTY0MCwKKzB4RTUwMUU0MDQsIDB4RTQwNEU2NDAsIDB4QUVFMDdGMTAsIDB4N0YxMDRGMjYsCisweDAwMEI0RjI2LCAweDAwMDAwMDA5LCAweDAwMUUxMDMwLCAweDAwMUUxMDgwLAorMHgwMDFFMTA5MCwgMHgwMDFFMTAzRiwgMHgwMDFFMTAzRSwgMHgwMDIwMjhDNiwKKzB4MDAyMDI4QzgsIDB4MDAyMDI4Q0EsIDB4MDAwOTAwMEIsIDB4NjY2Q0U2ODAsCisweDY1NjNEMkE4LCAweDc1NDBFNzAwLCAweDY0NzM0MjJCLCAweDJGQjYyRkE2LAorMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHg0QzE4RUMwMSwgMHhEQUEzREJBMiwKKzB4NjVCMjUyQjEsIDB4ODkyMjM1MjAsIDB4QzkwMzYwNTEsIDB4ODkxRTg4MDEsCisweEQxOUZERTlELCAweDY0RTM0MTBCLCAweDg1MDM2NTAzLCAweDY3MEQ2NkEyLAorMHhERDlDMzc2MiwgMHhENDlDODkwQSwgMHg0MjBCRDI5QywgMHhEMTlDMDAwOSwKKzB4RTcwMUQ0OUMsIDB4MjE3MjREMEIsIDB4MDAwOUFGRTIsIDB4NDIwQkQyOUEsCisweEQ2OUE2NEUzLCAweDREMEJENDlBLCAweEFGRDkyNkMyLCAweDRGMjYwMDA5LAorMHg2REY2NkVGNiwgMHg2QkY2NkNGNiwgMHg2QUY2MDAwQiwgMHg3RkY0NEYyMiwKKzB4RTY4MTg1NDYsIDB4ODU0NzJGMDEsIDB4ODFGMTY2NkMsIDB4RDI4NTg1NDgsCisweDg1NDI4MUYyLCAweDgxRjM2N0YzLCAweEU0MEM4NTQzLCAweDYwNTM4MUY0LAorMHg4MUY1NjU2MywgMHg3NTQwNDIwQiwgMHg0RjI2N0YwQywgMHgwMDA5MDAwQiwKKzB4MkY5NjJGODYsIDB4MkZCNjJGQTYsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsCisweERDODQ3RkYwLCAweEU4MDBBMERELCAweEQyODM2QjEzLCAweEUwMDE0QjA4LAorMHg0QjAwNDIwQiwgMHgxRjAzREU4MSwgMHgzQkVDODVGMiwgMHgyRjgyN0UzMCwKKzB4MUZFMjY4MDMsIDB4NjZDMkREN0UsIDB4MzYyMDUyQzEsIDB4QTBDMzhCMDEsCisweDYwNjEwMDA5LCAweDg4MDFDOTAzLCAweEEwQkQ4QjAxLCAweDg1NjEwMDA5LAorMHg4OTY1QzgwMSwgMHhFRTEwNTE2MywgMHhEQTZBODUxMiwgMHhDOTAzNjYwMywKKzB4ODUxMzY0MDMsIDB4NDAyMTYwMEQsIDB4QzkzRjQwMjEsIDB4OEQxQzMwRTMsCisweEQ3NzA2NTAzLCAweDYyNzA0NDA4LCAweDQ0MDA0NDA4LCAweDIyMjg0NTAwLAorMHgzNDVDOEYwQSwgMHg2MDQzRDI2QywgMHg2OTdEMDcyRCwgMHg2ODk5NDkxOSwKKzB4Njk3QzZFOEUsIDB4MjhFREEwMDksIDB4NjA0M0QyNjgsIDB4Njk3RDA3MkQsCisweDY4OTk0OTE5LCAweDY5N0M2RThFLCAweEVFRkYyOEVELCAweDZFRUM2MjlELAorMHg4QjBGMzJFMCwgMHg0MTBCRDE1MiwgMHg1NDAzNjRDMywgMHhCRjg1RTUwMiwKKzB4RDQ1RjZFMDMsIDB4NDYwQkQ2NTQsIDB4RDc1RTY1RTMsIDB4RDQ1RUVFMDEsCisweDI3RTJBMDFELCAweDI2RTlFRUZDLCAweDgxMTI2MDYzLCAweDk3ODg4NTEzLAorMHgyMDc5NDIwOCwgMHg4NTEyODExMywgMHg4MTEyMjA4QiwgMHgyMDJCODUxMywKKzB4ODUxNDgxMTMsIDB4NDIxOEUyMDgsIDB4ODExNDIwMkIsIDB4ODU0MTY0QzIsCisweDgxNDEyMEU5LCAweEQ0NTE2NUMyLCAweENCMDE2MDUxLCAweDRBMEIyNTAxLAorMHg2MEMyMDAwOSwgMHg1MkYzNTZGMiwgMHgyQjAyQ0IwMSwgMHgyNjIyQUY4QiwKKzB4RDIzNzg1NjEsIDB4OEQyRUM4MDIsIDB4NDIwQjY0QzMsIDB4RDY0ODAwMDksCisweDVFMDM2NTAzLCAweDA3NkVFMDRDLCAweDc3MDFEMTQ2LCAweDYwMTIwNjc2LAorMHg4QjA1ODgwMSwgMHhFQTBDODVFMSwgMHgyMEFCNEExOCwgMHg4MUUxQTAwNywKKzB4ODgwMjYwMTIsIDB4ODVFMThCMDMsIDB4MjBBOUVBREYsIDB4ODU1MTgxRTEsCisweDIwQTlFQUZDLCAweDYwNTE4MTUxLCAweENCMDFEQTI4LCAweDRBMEI2NEMzLAorMHg1NkYyMjUwMSwgMHhENzM4NTFGMywgMHg4NUVGMjYxMiwgMHg0NzBCNjREMywKKzB4QUY1ODY1MEQsIDB4NDIwQjAwMDksIDB4NTQwMzAwMDksIDB4ODU0NDZFMDMsCisweDRBMThFQTA4LCAweDMwQTAyMEE5LCAweDhCMDNEQTFBLCAweEU1MDFCRjE2LAorMHgwMDA5QTAwNywgMHhENjJEODU0MSwgMHgyMjY4NjIwRCwgMHhCRjBEODkwMSwKKzB4RDQyM0U1MDAsIDB4NDIwQkQyMTgsIDB4RDcyMjY1RTMsIDB4RUUwMUQ0MjgsCisweDI3RTI0QTBCLCAweDAwMDlBRjM3LCAweDY4RjI2MDgzLCAweDc4MDE4MUYyLAorMHg2MThEN0MwOCwgMHgzMUU3RUUwMywgMHhBRjFEODkwMSwgMHg3RjEwMDAwOSwKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsCisweEZFMDM2OEY2LCAweDAwMjAxODM0LCAweDAwMjAyODg0LCAweDAwMjAyODhDLAorMHgwMDIwMEE1QywgMHgwMDIwMERBNiwgMHgwMDIwMjg1NCwgMHgwMDIwMEFERSwKKzB4MDAxRTIxMzAsIDB4MDAyMDJBNzAsIDB4MDAyMDBBN0EsIDB4MDAxQzNEMzAsCisweDAwMjAyQTc0LCAweDAwMjAyODY0LCAweDAwMjAxRkQ0LCAweDAwMUMzRDAwLAorMHgwMDIwMkE4MCwgMHgwMDIwMkE4QywgMHgwMDIwMjk3MCwgMHgwMDIwMjlGMCwKKzB4MDAyMDI4NUMsIDB4MDAxRTIxMkMsIDB4MDAyMDJBNzgsIDB4MDAyMDJBN0MsCisweDAwMjAyN0Y4LCAweDAwMjAyN0Y0LCAweDAwMjAwRTA2LCAweDAwMDA4MDAwLAorMHgwMDIwMkE4OCwgMHg0RjIyMkZFNiwgMHg2RTIyRDIwRCwgMHhDODQwNjBFMywKKzB4MjJFMjhEMDIsIDB4MDAwOUJFNjgsIDB4NDIxOEUyNDAsIDB4ODkwMTJFMjgsCisweDAwMDlCRTY0LCAweEM4MDU2MEUzLCAweEJFQjk4OTAxLCAweDYwRTMwMDA5LAorMHg4OTAyQzgwMiwgMHhBRTYxNEYyNiwgMHg0RjI2NkVGNiwgMHg2RUY2MDAwQiwKKzB4MDAxQzM1MTAsIDB4MDgwQTBDMEUsIDB4MDAwMjA0MDYsIDB4MUExQzFFMjAsCisweDEyMTQxNjE4LCAweDJFMzAzMjM0LCAweDI2MjgyQTJDLCAweDNBM0MzRTQwLAorMHg2QzYyNTY0OCwgMHg0MTExMkYyNiwgMHhFMjIwOEYxOCwgMHg4OTBCMzEyMywKKzB4MzIxQ0QyMDQsIDB4RDEwMjYyMjAsIDB4NDEyQjMxMkMsIDB4MDAwOTAwMDksCisweDAwMjAxRkZFLCAweDAwMjAxRkI0LCAweDAwMEJFMDAwLCAweDQwMDA2MkY2LAorMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg2MkY2MDAwQiwKKzB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAxODQwMDAsCisweDYyRjYwMDBCLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLAorMHg0MDI4NDAwMCwgMHg2MkY2MDAwQiwgMHg0MDAwNDAwMCwgMHg0MDE4NDAwMCwKKzB4MDAwQjQwMjgsIDB4QzkwRjYyRjYsIDB4NDAwNTQwMDUsIDB4NDAwNTQwMDUsCisweDYyRjYwMDBCLCAweDQwMDVDOTA3LCAweDQwMDU0MDA1LCAweDYyRjYwMDBCLAorMHg0MDA1QzkwMywgMHgwMDBCNDAwNSwgMHhDOTAxNjJGNiwgMHgwMDBCNDAwNSwKKzB4MDAwMDYyRjYsIDB4MDgwQTBDMEUsIDB4MDAwMjA0MDYsIDB4MUExQzFFMjAsCisweDEyMTQxNjE4LCAweDJFMzAzMjM0LCAweDI2MjgyQTJDLCAweDNBM0MzRTQwLAorMHg2QzYyNTY0OCwgMHg0MTExMkYyNiwgMHhFMjIwOEYxOCwgMHg4OTBCMzEyMywKKzB4MzIxQ0QyMDQsIDB4RDEwMjYyMjAsIDB4NDEyQjMxMkMsIDB4MDAwOTAwMDksCisweDAwMjAyMEJFLCAweDAwMjAyMDc0LCAweDAwMEJFMDAwLCAweDQwMDE2MkY2LAorMHg0MDAxNDAwMSwgMHg0MDAxNDAwMSwgMHg0MDAxNDAwMSwgMHg2MkY2MDAwQiwKKzB4NDAwMTQwMDEsIDB4NDAwMTQwMDEsIDB4NDAwMTQwMDEsIDB4NDAxOTQwMDEsCisweDYyRjYwMDBCLCAweDQwMDE0MDAxLCAweDQwMDE0MDAxLCAweDQwMDE0MDAxLAorMHg0MDI5NDAwMSwgMHg2MkY2MDAwQiwgMHg0MDAxNDAwMSwgMHg0MDE5NDAwMSwKKzB4MDAwQjQwMjksIDB4NDAwNDYyRjYsIDB4NDAwNDQwMDQsIDB4QzkwRjQwMDQsCisweDYyRjYwMDBCLCAweDQwMDQ0MDA0LCAweEM5MDc0MDA0LCAweDYyRjYwMDBCLAorMHg0MDA0NDAwNCwgMHgwMDBCQzkwMywgMHg0MDA0NjJGNiwgMHgwMDBCQzkwMSwKKzB4MDAwMDYyRjYsIDB4MzYyMkUyMTgsIDB4Njc0MzhGMTIsIDB4MDAwOUEwMDQsCisweDc2RkY2MjU0LCAweDc0MDEyNDIwLCAweEM4MDM2MDUzLCAweDYwNDM4QkY4LAorMHg4OTAyQzgwMywgMHg0MjJCRDIyQiwgMHhEMjJCMDAwOSwgMHgwMDA5NDIyQiwKKzB4MkZFNjY0NzMsIDB4OEQ0QTM0NTAsIDB4Mjc3ODY3NjMsIDB4NjI0Mzg5NDcsCisweDIyN0IyMjVCLCAweEM5MDE2MDIzLCAweDhEMjAzNDUyLCAweDJFRTg2RTAzLAorMHg2MDIzOEIxNSwgMHg4QjA4QzgwMywgMHg0NzA5NjY0MywgMHg0NzEwNjI1NiwKKzB4OEZGQjI2MjIsIDB4QTAzMjc2MDQsIDB4NDcwMTAwMDksIDB4NjE0MzY2NzMsCisweDQ2MTA2MjU1LCAweDhGRkIyMTIxLCAweEEwMjg3MTAyLCAweDY2NDMwMDA5LAorMHg0NzEwNjI1NCwgMHg4RkZCMjYyMCwgMHhBMDIwNzYwMSwgMHg2MTQzMDAwOSwKKzB4MkVFODM1N0MsIDB4OEYxNTMxN0MsIDB4NjAyMzY2NTMsIDB4OEIwN0M4MDMsCisweDc2RkM0NzA5LCAweDQ3MTA2MjYyLCAweDIxMjY4RkZCLCAweDAwMDlBMDBGLAorMHg2NTYzNDcwMSwgMHg3NUZFNjY3MywgMHg0NjEwNjI1MSwgMHgyMTI1OEZGQiwKKzB4MDAwOUEwMDUsIDB4NjI2MDc2RkYsIDB4OEZGQjQ3MTAsIDB4NjA0MzIxMjQsCisweDZFRjYwMDBCLCAweDAwMjAyMkE2LCAweDAwMjAyNzUyLCAweEUyMUUyRkU2LAorMHg2NzYzMzYyNiwgMHg4RDFCNjE1MywgMHgzRTEwNkU0MywgMHgzRTEyODkxNiwKKzB4NjVFMzg5MDgsIDB4MzY3MkU2MDAsIDB4NjIxNDg5MTAsIDB4MjUyMDc2MDEsCisweDc1MDFBRkY5LCAweDMxN0M2NEUzLCAweDY1MTMzNDdDLCAweEU2MDBBMDA0LAorMHg2MjUwNzVGRiwgMHgyNDI0NzYwMSwgMHg4QkY5MzY3MiwgMHg2MEUzQTAxMSwKKzB4ODkwODMxRTIsIDB4MzI3QzYyMTMsIDB4OEIwNDMyRTYsIDB4NjUxMzY0RTMsCisweEEwMDg2NjczLCAweEQyOEY2RUY2LCAweDY1MTM2NEUzLCAweDQyMkI2NjczLAorMHgwMDBCNkVGNiwgMHhFMjA0NkVGNiwgMHg2NzQzMzYyMiwgMHg4RjEwMzU2QywKKzB4QTAwNDM0NkMsIDB4NzVGRjAwMDksIDB4NzZGRjYyNTAsIDB4NjA1MzI0MjQsCisweDhCRjhDODAzLCAweEM4MDM2MDQzLCAweEExMDU4OTAxLCAweEEyNzcwMDA5LAorMHhBMjk5MDAwOSwgMHgyRkI2MDAwOSwgMHgyRkQ2MkZDNiwgMHg3RkU0MkZFNiwKKzB4NkM2MzYwNDMsIDB4NjY1MjFGNjIsIDB4QzkwMzc1MDQsIDB4MUY1MTZFNTMsCisweDQ1MDg2NTAzLCAweEUxRkM2RDQzLCAweDJEMTk0NTAwLCAweDFGNzMyNTU4LAorMHgxRjY1MUY0NCwgMHgyRkQyOEQwQiwgMHg4ODA4NjA1MywgMHg4ODEwODkyMywKKzB4ODgxODg5NUIsIDB4QTA4OThCMDEsIDB4QTBCRDAwMDksIDB4NjI2MzAwMDksCisweDJEMjJFNjAwLCAweDdDRkM3RDA0LCAweEVCMTBBMDBELCAweEU2MDA2NEU2LAorMHg3Q0YwNjVFNiwgMHg2MkUyNjFFNiwgMHgxRDUxMkQ0MiwgMHgxRDIzMUQxMiwKKzB4N0UwNDdEMTAsIDB4M0NCMjFGRTEsIDB4MUY2NTg5RjAsIDB4MkZEMjFGQzIsCisweEEwQTExRkU2LCAweDY0RDIxRkQ0LCAweDQ0Mjg2MjYzLCAweDQ0Mjk0NDE4LAorMHg0MjE4NDQxOSwgMHg0NjI5MjQyQiwgMHgyRDQyNDYxOSwgMHg2NTYzN0QwNCwKKzB4QTAyMTdDRkQsIDB4NjdFNkVCMTAsIDB4NjJFNjdDRjAsIDB4NjRFNjY2NzMsCisweDI1NkI0NjE4LCAweDJENTI2MUUyLCAweDY1MjM0NzI5LCAweDQ1MTg0NzE5LAorMHg0MjI5Mjc1QiwgMHg0MjE5MUQ3MSwgMHg0NzE4Njc0MywgMHg0NDI5MjI3QiwKKzB4NDQxOTY3MTMsIDB4MjQ3QjQ3MTgsIDB4MUQ0MzFEMjIsIDB4NDExOTQxMjksCisweDY1MTM3RDEwLCAweDFGRTE3RTA0LCAweDg5REMzQ0IyLCAweDFGRTY3RUZGLAorMHgxRkMyMUY1NSwgMHhBMDY3MkZEMiwgMHg2Q0YyMUZENCwgMHg2NkMyNTdGNSwKKzB4NDYyODYyNzMsIDB4NDIyODQ2MjksIDB4MkM2MjI2MkIsIDB4N0MwNDVERjIsCisweDdERkU0NzI5LCAweEEwMUNFQjEwLCAweDY1RTY1RUYxLCAweDY2RTY2MjczLAorMHg0NzI4Njc1MywgMHg2NzYzMjI3QiwgMHg0NTI5NjFFNiwgMHgyNTdCNDcyOCwKKzB4MkMyMjY0RTYsIDB4NjUxMzFDNTEsIDB4NDUyODQ2MjksIDB4MUM2MjI2NUIsCisweDQxMjk2NjQzLCAweDIxNkI0NjI4LCAweDQ0MjkxQzEzLCAweDY3NDM3QzEwLAorMHgzREIyN0RGMCwgMHgxRkQyODlFMSwgMHg3RUZFQTAzNCwgMHg1MUY1NkNGMiwKKzB4NjIxMzY2QzIsIDB4NDIyODQ2MTgsIDB4NDIxODQ2MTksIDB4MkM2MjI2MkIsCisweDdDMDQ1REYyLCAweDdERkY0MTE5LCAweEEwMUZFQjEwLCAweDY1RTY1RUYxLAorMHg2NEU2N0RGMCwgMHg0MjI4NjI1MywgMHg0MjE4NjdFNiwgMHg2NkU2MjEyQiwKKzB4NjE0MzJDMTIsIDB4NDUxOTQxMjgsIDB4MjUxQjQxMTgsIDB4NjU3MzFDNTEsCisweDQ0MTk0NTI4LCAweDI0NUI0NTE4LCAweDY0NjMxQzQyLCAweDQ3MTk0NDI4LAorMHgyNzRCNDQxOCwgMHg0NjE5MUM3MywgMHg2MTYzN0MxMCwgMHg4OURFM0RCMiwKKzB4N0VGRDFGRDIsIDB4MUZDNDFGRTYsIDB4NURGMkU3MDQsIDB4QTAwRDVFRjYsCisweDYyRTQ1MUY0LCAweDY2RTQ3REZDLCAweDY1RTQ2NEU0LCAweDcxMDEyMTIwLAorMHg3MTAxMjE2MCwgMHg3MTAxMjE0MCwgMHg3MTAxMjE1MCwgMHg4OUYwM0Q3MiwKKzB4NjZEMzU3RjMsIDB4NjQxMzY1RTMsIDB4NkVGNjdGMUMsIDB4NkNGNjZERjYsCisweDZCRjZBMTkwLCAweDAwMjAyMTM0LCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LAorMHg2MDQzN0ZFNCwgMHg2QzYzQzkwMywgMHg2NjAzMUY2MiwgMHg0NjA4NzVGQywKKzB4NjE1MjZFNDMsIDB4NDYwMEUyRkMsIDB4MjY2ODJFMjksIDB4MUY0NDFGNzMsCisweDFGNTE2RDUzLCAweDhEMEIxRjE1LCAweDYwNjMyRkUyLCAweDg5MUY4ODA4LAorMHg4OTUzODgxMCwgMHg4QjAxODgxOCwgMHgwMDA5QTA4MSwgMHgwMDA5QTBCOSwKKzB4RUIxMEEwMEQsIDB4NTJEMzdERjAsIDB4NTREMTU2RDIsIDB4MkUxNjY1RDIsCisweDJFNjYyRTI2LCAweDJFNDI3RUZDLCAweDFGRDE2MTUzLCAweDNDQjI3Q0YwLAorMHg3RDA0ODlGMCwgMHgxRjE1MUZENiwgMHgyRkUyMUZDMiwgMHgxRkU0QTBBMSwKKzB4NjIxMzY2RTIsIDB4NDIyOTQ2MTksIDB4NDIxOTQ2MTgsIDB4MkU2MjI2MkIsCisweDdDRkY0MTE4LCAweEVCMTBBMDIxLCAweDU0RDM3REYwLCAweDYyNDM1N0QyLAorMHg0MjE5NDIyOSwgMHg1NUQxMjEyQiwgMHgyRTE2NjZEMiwgMHg0MTI5NjE3MywKKzB4NDExOTQ0MTgsIDB4MkU0NjI0MUIsIDB4NDQyOTY0NTMsIDB4NDQxOTQ3MTgsCisweDJFNzYyNzRCLCAweDQ3Mjk2NzYzLCAweDQ3MTk0NTE4LCAweDI1N0I3RUZDLAorMHg0NjE4MkU1MiwgMHgxRkQxNjE2MywgMHgzQ0IyN0NGMCwgMHg3RDAzODlEQywKKzB4MUYxNTFGRDYsIDB4MkZFMjFGQzIsIDB4MUZFNEEwNkIsIDB4NTdGNTZFRjIsCisweDYyNzM2NkUyLCAweDQ2Mjg0NjI5LCAweDI2MkI0MjI5LCAweDJFNjI1Q0YyLAorMHg3Q0ZFNDcyOCwgMHhBMDFCRUIxMCwgMHg3REYwNURGMSwgMHg1NUQyNTFEMywKKzB4NDYyOTY2MTMsIDB4NTREMTI3NkIsIDB4MkU3NjYyRDIsIDB4NDEyODY3NTMsCisweDIxN0I0NzI5LCAweDYxNDMyRTE2LCAweDQxMjk0NTI4LCAweDJFNTYyNTFCLAorMHg0NDI4NjUyMywgMHgyNDVCNDUyOSwgMHg0MjI4MkU0NiwgMHg3Q0YwNjcyMywKKzB4ODlFMjNDQjIsIDB4MUZENjdEMDIsIDB4QTAzQTFGQzIsIDB4NjdGMjFGRTQsCisweDY1NzI1MUY1LCAweDQ1Mjk2MjEzLCAweDQ1Mjg0NTE5LCAweDQyMTk0NTE4LAorMHg1Q0YyMjUyQiwgMHg0MTI4Mjc1MiwgMHg3Q0ZENDExOCwgMHhBMDIyRUIxMCwKKzB4N0RGMDVERjEsIDB4NTREMjU2RDMsIDB4NDUxOTY1NjMsIDB4NTJEMTQ2MjgsCisweDQ2MTgyMTVCLCAweDZFRDI2NTQzLCAweDQ1MTkyNzE2LCAweDI2NUI0NDI4LAorMHg2NTQzNjE2MywgMHg0NTE4NjQyMywgMHg0MjI4NDQxOSwgMHg0MjE4MjU0QiwKKzB4MjcxNjY0RTMsIDB4NDQxOTY2MjMsIDB4MjY0QjI3NTYsIDB4NEUyODI3NjYsCisweDYxRTM0RTE4LCAweDNDQjI3Q0YwLCAweDdEMDE4OURCLCAweDFGQzIxRkQ2LAorMHhFNzA0MUY3NCwgMHg1MUY0NURGMiwgMHg1RUY2QTAwRCwgMHg4NEUyN0VGQywKKzB4NjIwMzY0RTAsIDB4N0RGQzg0RTEsIDB4ODRFMzY1MDMsIDB4MjE2NDY2MDMsCisweDIxNTQyMTI0LCAweDNENzIyMTQ0LCAweDU3RjM4OUYwLCAweDY0MTM2NkQzLAorMHg3RjFDNjVFMywgMHg2REY2NkVGNiwgMHhBMDlENkNGNiwgMHgyRjg2NkJGNiwKKzB4MkZBNjJGOTYsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4NjE0Mzc0RTAsCisweDZBNjM2ODczLCAweDZCNTZFOTIwLCAweDZDNTY3QUUwLCAweDZENTY3MTIwLAorMHg2RTU2M0E5MiwgMHg2NDU2Njc1NiwgMHg2MjU2NjY1NiwgMHgxMUMxMjFCMiwKKzB4MTFFMzExRDIsIDB4MTE0NTExNzQsIDB4OERFQzExNjYsIDB4NzEyMDExMjcsCisweDY2MTNBMDA0LCAweDdBRkY2MjU0LCAweDc2MDEyNjIwLCAweDhCRjkyQUE4LAorMHg2RUY2NjA4MywgMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwgMHgwMDBCNjlGNiwKKzB4MkY4NjY4RjYsIDB4MkZBNjJGOTYsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsCisweDZBNjM2ODczLCAweDc1RTBFOTIwLCAweDU2NTY1MjU3LCAweDU3NTQ1MTU1LAorMHg1RDUyNUU1MywgMHg2QjUyNUM1MSwgMHgyNDY2MjQyNiwgMHgyNDc2MjQxNiwKKzB4N0FFMDI0RTYsIDB4MjRDNjI0RDYsIDB4OERFQzNBOTIsIDB4NjZBMzI0QjYsCisweDZFRjY2NzgzLCAweDZDRjY2REY2LCAweDZBRjY2QkY2LCAweEEwNDM2OUY2LAorMHgyRkU2NjhGNiwgMHhDODA0NjA2MywgMHg4RDA0NkU2MywgMHg2MjE2NjE1MywKKzB4MjQyMjdFRkMsIDB4NjBFMzc0MDQsIDB4ODkwOEM4MTgsIDB4NzEwNDY1MTMsCisweDYyNTI2NjE2LCAweDI0MjI3RUY4LCAweEFGRjQxNDYxLCAweEUyMDQ3NDA4LAorMHg2NTEzM0UyMiwgMHg2NkUzOEQwMiwgMHg2RUY2QTAxQywgMHg2RUY2QUY4NywKKzB4QzgwNDYwNjMsIDB4NjE2MzhEMDQsIDB4NjI1Mjc1RkMsIDB4MjQyNjcxRkMsCisweEM4MTg2MDEzLCAweDc1Rjg4OTA2LCAweDY2NTI1MjUxLCAweDI0NjYyNDI2LAorMHg3MUY4QUZGNiwgMHgzMTIyRTIwNCwgMHg2NjEzOEYwMiwgMHgwMDA5QUZBMSwKKzB4MDAwOUEwMEEsIDB4MDAwOUEwMDQsIDB4NzZGRjYyNTQsIDB4NzQwMTI0MjAsCisweDhCRjkyNjY4LCAweDYwNzMwMDBCLCAweDAwMDlBMDA0LCAweDYyNTA3NUZGLAorMHgyNDI0NzZGRiwgMHg4QkY5MjY2OCwgMHg2MDczMDAwQiwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg1NDRGMEQwQSwKKzB4NDYyMDUzNTUsIDB4MDAwMDNBNTcsIDB4MjA3MjYxNEQsIDB4MzIyMDMyMzIsCisweDIwMzczMDMwLCAweDM1M0EzNDMxLCAweDMzMzUzQTM0LCAweDAwMDAwMDAwLAorMHgwMDAwMEQwQSwgMHgwMDAwMDA0MywgMHg2MTc2NkU0OSwgMHgyMDY0Njk2QywKKzB4NzI2NTczNzUsIDB4MjA3MjZGMjAsIDB4MjA3OTY1NkIsIDB4MDAyMTQ0NDksCisweDZFNkI2RTU1LCAweDIwNkU3NzZGLCAweDZENkQ2RjYzLCAweDNENjQ2RTYxLAorMHgwMDAwMDAwMCwgMHg2MTQzNzc0OCwgMHg3MjYyNjk2QywgMHg2RjY5NzQ2MSwKKzB4NjYyMDIwNkUsIDB4MEE2QzY5NjEsIDB4MDAwMDAwMEQsIDB4NzM2OTZGNEUsCisweDYxNDMyMDY1LCAweDcyNjI2OTZDLCAweDZGNjk3NDYxLCAweDYxNjYyMDZFLAorMHgyMTIxNkM2OSwgMHgwMDAwMEQwQSwgMHgwMDAwMEQwQSwgMHgwMDAwMDA0MiwKKzB4MDAwMDAwRkYsIDB4MDAwMjAwMDEsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDEwRTAxMEQsIDB4MDAwMjAwMDMsIDB4MDEwOTAxMDgsIDB4MDAwMjAxMEEsCisweDAwMDMwMDAyLCAweDAyMDIwMjAxLCAweDAyMDQwMjAzLCAweDAyMDYwMjA1LAorMHgwMjA4MDIwNywgMHgwMjBBMDIwOSwgMHgwMjBDMDIwQiwgMHgwMjBFMDIwRCwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMTBFMDEwRCwgMHgwMEZGMDEwRiwgMHgwMTA5MDEwOCwgMHgwMTBCMDEwQSwKKzB4MDAwMzAwMDIsIDB4MDIwMjAyMDEsIDB4MDIwNDAyMDMsIDB4MDIwNjAyMDUsCisweDAyMDgwMjA3LCAweDAyMEEwMjA5LCAweDAyMEMwMjBCLCAweDAyMEUwMjBELAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwMDAwMDcyLCAweDAwMjA1MjIwLCAweDAwMDAwMDQ2LCAweDAwMDAwMDU5LAorMHg3MzIwNDE0MiwgMHgwMDNENzE2NSwgMHgwMDAwMDA3NCwgMHgwMDAwMDAwMCwKKzB4MDIwMDAxMTIsIDB4NDBGRkZGRkYsIDB4MTIyMTBBQ0UsIDB4MjAxMDQ4OTAsCisweDAyMDkwMTAwLCAweDAxMDEwMDJFLCAweDA5RkE4MDAwLCAweDA0MDAwMDA0LAorMHgwMDAwMDBGRiwgMHgwMjAxMDUwNywgMHgwNzAwMDIwMCwgMHgwMDAyODIwNSwKKzB4MDUwNzAwMDIsIDB4MDA0MDAzODMsIDB4MDQwNTA3MDEsIDB4MDEwMDQwMDMsCisweDAwMkUwMjA5LCAweDgwMDAwMTAxLCAweDAwMDQwOUZBLCAweDAwRkYwNDAwLAorMHgwNTA3MDAwMCwgMHgwMDQwMDIwMSwgMHg4MjA1MDcwMCwgMHgwMDAwNDAwMiwKKzB4MDM4MzA1MDcsIDB4MDcwMTAwNDAsIDB4NDAwMzA0MDUsIDB4MDMwNDAxMDAsCisweDAzMEMwNDA5LCAweDAwNzkwMDVBLCAweDAwNDEwMDQ0LCAweDAzMTgwMDUzLAorMHgwMDUzMDA1NSwgMHgwMDMyMDA0MiwgMHgwMDMwMDAyRSwgMHgwMDU3MDAyMCwKKzB4MDA0MTAwNEMsIDB4MDAwMDAwNEUsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwNzA5LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCit9OworCitjb25zdCB1MzJfdCB6Y0Z3SW1hZ2VTaXplPTExMTA0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZnd1X3R4c3RyZWFtLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd3VfdHhzdHJlYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjc3Y2JhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwZnd1X3R4c3RyZWFtLmMKQEAgLTAsMCArMSwxMDE3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICJjcHJlY29tcC5oIgorCitjb25zdCB1MzJfdCB6Y0Z3SW1hZ2VbXSA9IHsKKzB4MDAwOTAwMEIsIDB4NEYyMjJGRTYsIDB4REU5NDdGRkMsIDB4RTExNEQ1OTQsCisweDFFMTNENDk0LCAweDY3NTIxRTRDLCAweEQ0OTRENjkzLCAweDM3NDAyNzY5LAorMHg2MjUyOEYwNiwgMHg3MjAxRDY5MiwgMHg2MDYwMjUyMiwgMHgyNjAwQzkzRiwKKzB4RDc5MDYxNTIsIDB4MjUxMjYxMUQsIDB4MjY0QjY2NTIsIDB4MjU2MjQ3MEIsCisweDAwMDlCMDE3LCAweEU2MDA5NUFDLCAweEM4NDA2MEUyLCAweDJGMDI4RjAzLAorMHg4RkY5MzY1MiwgMHhENDg4NzYwMSwgMHg0RTBCREU4OCwgMHhENDg4MDAwOSwKKzB4MDAwOTRFMEIsIDB4NEUwQkQ0ODcsIDB4N0YwNDAwMDksIDB4QTA1MjRGMjYsCisweDRGMjI2RUY2LCAweDQxMEJEMTg0LCAweEQ0ODQwMDA5LCAweDAwMDk0NDBCLAorMHg0NTBCRDU4MywgMHhENzgzMDAwOSwgMHhEMjgzRTFGRiwgMHgyNzEyNjExRCwKKzB4RDQ4MjUwMjksIDB4RTFGRkNCMDEsIDB4MTIwOUU1MDEsIDB4MTIxMTIyMTIsCisweEU3MjAyNDUyLCAweDQ3MThENTdFLCAweDI1NzJEMjdFLCAweEQxN0VFNzAwLAorMHhENjdGRDQ3RSwgMHhFMjAxMjI3MCwgMHgyNDcwMjE3MiwgMHhENjdEMjYyMCwKKzB4MjY0MUU0RkYsIDB4RDU3Q0U2MDAsIDB4NjY2REUxMDQsIDB4NzYwMTYwNjMsCisweDQwMDA2MjZELCAweDhGRjgzMjEyLCAweEQ1NzgwNTQ1LCAweDI1MjBFMjAxLAorMHhEMjc4RDc3NywgMHhFNDgwRTEwMCwgMHgyMjEyMjcxMCwgMHg2NjEzRDU3NiwKKzB4NjY2RDY0NEMsIDB4NzYwNDY3NjMsIDB4Mzc1QzYyNkQsIDB4OEZGODMyNDMsCisweEQ1NzIyNzEyLCAweEQyNzNENzcyLCAweEU0MDBFMTAxLCAweDI3MTAyNTExLAorMHgwMDBCNEYyNiwgMHg3RkNDMjI0MiwgMHhEMTcwRDU2RiwgMHhEMjcxREI3MCwKKzB4MUY1MUQ0NzEsIDB4RDY3MTc1MDgsIDB4MUYxMkQ3NzEsIDB4MUY1NTcxMEMsCisweDFGQjk3NUZDLCAweDcyMDQxRjJBLCAweDFGMTNFQjEwLCAweDFGNTYxRjQ0LAorMHgxRjc4MUY2NywgMHhEODZCMUYyQiwgMHhERDZDRDk2QiwgMHhEQzZDRUEwMCwKKzB4RDI2RERFNkMsIDB4ODkwMDNBMjIsIDB4RDE1RDdBMDEsIDB4ODgwMTYwMTAsCisweDU2Rjg4QjAzLCAweDQyMThFMjAxLCAweEQxNjgyNjIyLCAweDAwMDk0MTBCLAorMHg0NDBCRDQ2NywgMHhENTY3MDAwOSwgMHgwMDA5NDUwQiwgMHg2MDEwRDE1MCwKKzB4OEIxMDg4MDEsIDB4RTY1MEQxNEYsIDB4NDYxODYyMTIsIDB4OEIwODMyNjYsCisweDU2RjlEMTRCLCAweDIxMjBFMjAwLCAweENCMDE2MDYyLCAweDI2MDJBMDAzLAorMHg3MjAxMjcxMCwgMHg2MDgyMjEyMiwgMHg4OTA5ODgwMSwgMHhFMkM4RDE1QSwKKzB4NjIyQzY2MTIsIDB4ODkwMzM2MjYsIDB4NjAxMEQxNTgsIDB4OEJDODg4MDEsCisweDUxRjY2NzkyLCAweDIxNzI1MkY1LCAweEQ2NTU1MTkxLCAweDU1RkEyMjEyLAorMHg1MkZCNjQ2MiwgMHg1NTYxMjU0MiwgMHgyMjUyRTQwMCwgMHg2MTQzNjY0MywKKzB4MDVERTYwMTMsIDB4MzZDQzQ2MDgsIDB4MDdERTI2NTIsIDB4QzkwMzYwNzEsCisweDhCMDI4ODAxLCAweDcyMDE2MkUyLCAweDc0MDEyRTIyLCAweDM2QjM2NjRDLAorMHg3MTA0OEZFRSwgMHg2NkMyRDE0NywgMHg0NTI4NjUxMiwgMHgyNjVCNDUxOCwKKzB4NjA4MjJDNjIsIDB4ODkwMTg4MDEsIDB4MDAwOUExNjgsIDB4NjI3MkQ3NDIsCisweDhCMTMyMjI4LCAweEQ0MkJENzQxLCAweDY3NzJENTQxLCAweDUxNTM2MjQyLAorMHgzMTJDMzI3QywgMHgyNDIyMjIyOCwgMHgxNTEzOEQwNSwgMHg2MjYyRDYzRCwKKzB4QjE2MjcyMDEsIDB4RDYyMzI2MjIsIDB4MjYyMkUyMDAsIDB4NTI5MTY2OTIsCisweDhCMDEzNjIwLCAweDAwMDlBMTQ0LCAweDYwNjFBMDZFLCAweDAwMUMwMDFDLAorMHgwMDFENDAyMCwgMHgwMDAwQjM4RSwgMHhGRkZGMDAwMCwgMHgxMjM0MDAwMCwKKzB4MDAxRTEwMTUsIDB4MDAyMDEyNzQsIDB4MDAyMDM5RjQsIDB4MDAyMDE4QTIsCisweDAwMjAzQTAwLCAweDAwMjAzQTE4LCAweDAwMjAxODYwLCAweDAwMjAxOTZDLAorMHgwMDIwMTI4OCwgMHgwMDFDMzUxMCwgMHgwMDFDMzYyNCwgMHgwMDFFMjEyQywKKzB4MDAyMDM4RjQsIDB4MDAyMDM0OEMsIDB4MDAyMDM4RkMsIDB4MDAyMDM5MDgsCisweDAwMjAzOTE0LCAweDAwMjAzOTcwLCAweDAwMjAzOTc0LCAweDAwMjAzOTFDLAorMHgwMDIwMzkxRCwgMHgwMDIwMzkyMCwgMHgwMDExNzcwMCwgMHgwMDIwMzk4QywKKzB4MDAyMDM5OEEsIDB4MDAyMDM0RjAsIDB4MDAxMTc3MTAsIDB4MDAxQzNEMzAsCisweDAwMUMzNkY4LCAweDAwMTE3NzM0LCAweDAwMUMzNjg0LCAweDAwMUMzRDAwLAorMHgwMDFDMTAwMCwgMHgwMDFDMTAyOCwgMHgwMDIwMzUwNCwgMHgwMDIwMzkyNCwKKzB4MDAxMTc2MDAsIDB4MDAxMTc3NDAsIDB4N0ZGRkZGRkYsIDB4MDAyMDE3MzAsCisweDAwMjAzMzJBLCAweDAwMjAyMzM0LCAweDAwMjAzREE0LCAweDAwMjAzOTcyLAorMHgwMDIwMzRGQywgMHgwMDIwMzk2NCwgMHgwMDFDM0QyQywgMHgwMDFDMzZCMCwKKzB4MDAyMDM0OTQsIDB4MDAxMTc3NUMsIDB4ODgwMUM5MEYsIDB4QTBDRjg5MDEsCisweEQxOTYwMDA5LCAweDM2MjA2MjEyLCAweEQ0OTU4OTA0LCAweDI0MjFFMjAwLAorMHgyMTYyQTBDQywgMHg2MjExRDE5MywgMHg4OTAxMjIyOCwgMHgwMDA5QTBDMywKKzB4RTIwMkQ3OEYsIDB4NzUwMTY1NzEsIDB4MzEyMzYxNUQsIDB4Mjc1MThEMDIsCisweDAwMDlBMEJDLCAweEQyOEM1N0YyLCAweDYyMjI2MDcyLCAweDQwMDk0MDE5LAorMHhDOTBGNDAwOSwgMHg4RjE5ODgwQSwgMHg1MkYzMUYyQywgMHg0MDE5NjAyMiwKKzB4NDAwOTQwMDksIDB4ODgwOEM5MEYsIDB4QTBBNzg5MDEsIDB4NjA2MzAwMDksCisweENCMDE1NEY3LCAweEQyN0U1NUYyLCAweEU3MDEyNDAyLCAweEQ0N0ZFMTAwLAorMHgyMjExMjU3MiwgMHg3MjAxNjI0MiwgMHgyNDIyQTA5OCwgMHg4QjNGODgwNSwKKzB4NjAyMjUyRjMsIDB4NDAwOTQwMTksIDB4QzkwRjQwMDksIDB4OEIxNjg4MDIsCisweEU0RkZENTc3LCAweDY0NEQ2NzUyLCAweDhCMTAyNzQ4LCAweDYyNzJENzc1LAorMHg4QjBDMzI2MCwgMHg1MUYyNTVGNywgMHhEMjZERTcwMSwgMHgyMTcyMjU2MiwKKzB4RDU3MUUxMDAsIDB4NjQ1MjIyMTEsIDB4QTA3Nzc0MDEsIDB4NTJGMzI1NDIsCisweDQwMTk2MDIyLCAweDQwMDk0MDA5LCAweDg4MDVDOTBGLCAweDMxQjM4QjZFLAorMHhEMjZBOEI2QywgMHg2NzIyNTRGNCwgMHg3NzAxRDU2OSwgMHg2MTQyMjI3MiwKKzB4MUYxQ0U2NDAsIDB4NDYxODIxNTksIDB4OEIwMzMxNjAsIDB4NjI2MkQ2NjUsCisweDI2MjI3MjAxLCAweEUyMDBENjVBLCAweDI2MjFCMDY3LCAweDAwMDlBMDU2LAorMHgzMTIzRTIyMCwgMHg4ODAzOEI1MiwgMHg1MkYzOEIxRSwgMHg0MDE5NjAyMiwKKzB4NDAwOTQwMDksIDB4ODgwM0M5MEYsIDB4RDI1QjhCMTYsIDB4NjcyMjU0RjQsCisweDc3MDFENTU3LCAweDYxNDIyMjcyLCAweDFGMUNFNjQwLCAweDQ2MTgyMTU5LAorMHg4QjAzMzE2MCwgMHg2MjYyRDY1NSwgMHgyNjIyNzIwMSwgMHhFMjAwRDY0OCwKKzB4MjYyMUIwNDMsIDB4MDAwOUEwMTAsIDB4RDQ1MkQ1NTEsIDB4RDI0NDY3NTIsCisweEUxMDA3NzAxLCAweDI1NzIzQTQ2LCAweDIyMTE4RjA2LCAweEVBMDBENjRFLAorMHg3MjAxNjI2MiwgMHgyNjIyQjAzMSwgMHgyRkIyRDU0QywgMHg5NTczNjY1MiwKKzB4RDQ0QTVCRjEsIDB4MzYyMDUyNDEsIDB4NjA2MTg5MTAsIDB4OEIwMUM4MDMsCisweDJCMjJFMjAxLCAweDhGRjU0NTEwLCAweDU3RjE1NjY0LCAweDYyNzJFMUYwLAorMHg0MTI4NDExOCwgMHgyNzIyMjIxQiwgMHg2QkYyQTAwOCwgMHg2QkYyQTAwNiwKKzB4RTIwMEQ2MkYsIDB4RDEyRjI2MjEsIDB4MjEyMUUyMDAsIDB4RDEzQ0UyMDEsCisweDY2MTIyODIyLCAweDhCMDEyNjY4LCAweDAwMDlBRTJCLCAweDQ1MEJENTM5LAorMHhEMTM5MDAwOSwgMHhBRTI0RTYwMCwgMHgyRjg2MjE2MCwgMHgyRkE2MkY5NiwKKzB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4N0ZGNDRGMjIsIDB4REUzNEQxMzMsCisweDU0MTE2MjEyLCAweDFGNDE2N0UyLCAweDJGMjJENDMyLCAweEQ1MzIxRjcyLAorMHhEMjMyNjc0MywgMHg1ODQxNzc5NCwgMHg2OTQyNUE0MiwgMHg1QjE2NkM3MiwKKzB4NjA1MjZEMjIsIDB4Q0IyMEU2MDAsIDB4RTU0MDI1MDIsIDB4NjI2RDc2MDEsCisweDhCRkIzMjUzLCAweDU1RjE2MkYyLCAweDExNTEyMTIyLCAweEQ2Mjg1NUYyLAorMHgxNDgxMkU1MiwgMHgyNDkyMTRBMiwgMHgyN0MyRDQyNiwgMHgyNkQyMTFCNiwKKzB4REEyNTY3NDIsIDB4RTgwMUQ5MjUsIDB4NDkwQjJBNzIsIDB4RTIwMTFBOEMsCisweDFBMkM0MjE4LCAweDRGMjY3RjBDLCAweDZERjY2RUY2LCAweDZCRjY2Q0Y2LAorMHg2OUY2NkFGNiwgMHg2OEY2MDAwQiwgMHgwMDAwMDdEMSwgMHgwMDIwMzk4NCwKKzB4MDAyMDM5ODgsIDB4MDAyMDM5OEUsIDB4MDAxQzNEQzAsIDB4MDAxMTc3MkMsCisweDAwMUMzQjg4LCAweDAwMjAzOTZDLCAweDAwMTE3NzNDLCAweDAwMTE3NzQ0LAorMHgwMDAwRjAwMCwgMHgwMDExNzc2NCwgMHgwMDExNzc0OCwgMHgwMDExNzc2OCwKKzB4MDAxMTc3NkMsIDB4MDFGRkZGRkYsIDB4MDAxMTc3NEMsIDB4MDAyMDM0RkMsCisweDAwMjAzREE0LCAweDAwMjAyNEY4LCAweDAwMjAzOTcyLCAweDAwMUMzQjlDLAorMHgwMDFDM0Q5OCwgMHgwMDFDMzcwMCwgMHgwMDFDMzUwMCwgMHgwMDFDNTk2MCwKKzB4MDAxQzg5NjAsIDB4MDAyMDM1MDQsIDB4MDAxQzNEMDAsIDB4MDAyMDE2MEMsCisweDJGOTYyRjg2LCAweDJGQjYyRkE2LCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LAorMHhERTk1N0ZBQywgMHg2MUUwRTAxNCwgMHgwRjE0RDQ5NCwgMHg3MTAxNjFFMywKKzB4RTAxODYyMTAsIDB4RDI5MjBGMjQsIDB4MDAwOTQyMEIsIDB4NDUwQkQ1OTEsCisweDIwMDgwMDA5LCAweDhGMTI2RDAzLCAweEQyOEYxRjA3LCAweDY3MjBENDhGLAorMHg2NTdDREQ4RiwgMHg0NzBCRDc4RiwgMHhEMThGMDAwOSwgMHg2MTlDNjkxMCwKKzB4NDYwODY2MTMsIDB4MzYxODQ2MDgsIDB4M0Q2QzQ2MDgsIDB4RTAxODFGRDcsCisweEU1ODAwNEZDLCAweDYwNEM2NkUyLCAweDMwNTA2NTVDLCAweDJENjI4RjE1LAorMHgwMUZDRTAxNCwgMHhERTg1RTUwMCwgMHg2NDFDQTAwOCwgMHg2NzUzNjU1RCwKKzB4NjA3MDM3RUMsIDB4MzlEQzY5NTMsIDB4ODA5NDc1MDEsIDB4MzI0MzYyNUQsCisweEQ2N0Y4QkY0LCAweEEzNEVFMjAwLCAweDIwMDgyNjIxLCAweEUwMTQ4QjEzLAorMHhFNDAwMDFGQywgMHhBMDA5REU3OSwgMHg2NDRENjcxQywgMHgzNUVDNjU0MywKKzB4Njk0MzY2NTIsIDB4MzlEQzYyNjIsIDB4NzQwNDE5MjEsIDB4MzI3MzYyNEQsCisweEEzMzg4QkYzLCAweDg4MDEyRDEwLCAweEUwMTQ4QjE3LCAweEU3MDAwMUZDLAorMHg2RDFDMkQ3MCwgMHhERTZEMUZENCwgMHgzMkQzNjI3RCwgMHhBMzJBOEIwMSwKKzB4Njc3RDAwMDksIDB4NjY3MzY1RTMsIDB4NjE3Mzc1MDQsIDB4MzE1QzM2RUMsCisweDY5MTI2NDYyLCAweEFGRUY3NzA4LCAweDg4MDQyNDkyLCAweEUwMTQ4QjE4LAorMHhFNDAwMDFGQywgMHg2NzFDMkQ0MCwgMHg2MjREREU2MCwgMHg4QjAxMzI3MywKKzB4MDAwOUEzMTEsIDB4Njk0MzY0NEQsIDB4MzlFQzYyRTMsIDB4NzIwNDY1OTIsCisweDNEMkM2RDQzLCAweDYxNTI2NkQyLCAweDIxNjk3NDA4LCAweDI1MTJBRkVELAorMHg4QjE4ODgwNSwgMHgwMUZDRTAxNCwgMHgyRDQwRTQwMCwgMHhERTUzNjcxQywKKzB4MzI3MzYyNEQsIDB4QTJGNjhCMDEsIDB4NjQ0RDAwMDksIDB4NjJFMzY5NDMsCisweDY1OTIzOUVDLCAweDZENDM3MjA0LCAweDY2RDIzRDJDLCAweDc0MDg2MTUyLAorMHhBRkVEMjE2QiwgMHg4ODMxMjUxMiwgMHhENDRBOEIzQSwgMHg2MTQ2RDk0QSwKKzB4NzUwNDY1NDMsIDB4Njc1NjY0NDIsIDB4NkU1MzFGNDgsIDB4NjU1MjdFMDQsCisweDdFRTQ2MkUyLCAweDdFMDQ2NEUyLCAweDZFRTIxRkU5LCAweDVFRjkyOUUwLAorMHg3RTA0RDk0MiwgMHgxRkVBNjBFMiwgMHgyOTAwQzkwMSwgMHhEOTQwNkVFMiwKKzB4MjlFMDRFMDksIDB4MkY1NjJGMjYsIDB4NTZGQUQ5M0UsIDB4NjUxMzQ5MEIsCisweEQxM0Q3RjA4LCAweEU3MUM2RTBELCAweDFERTEyRDcwLCAweERFM0I2OTEyLAorMHg2NEUyMUQ5MiwgMHgxRDQzRDEzQSwgMHhEMjNBNjUxMiwgMHg2NzIyMUQ1NCwKKzB4MUQ3NUQyMzksIDB4MUQ2NjY2MjIsIDB4NjI2MkQ2MzgsIDB4MUQyN0EyQUIsCisweDhCMzk4ODMwLCAweDY1OTZEOTJCLCAweDY3OTI2Njk2LCAweDYxOTY3OTA0LAorMHg3NEU0NjQ5MywgMHg2RTQzNjk5MiwgMHgxRjlCN0UwNCwgMHgxRkVDNjQ0MiwKKzB4RDkyNTZFRTIsIDB4NUVGQzI5RTAsIDB4N0UwNEQ5MjQsIDB4MUZFRDYwRTIsCisweDI5MDBDOTAxLCAweEQ5MjI2RUUyLCAweDI5RTA0RTA5LCAweDU5RkM3RkZDLAorMHhERTI3MkY5MiwgMHgyRjE2NEUwQiwgMHhENDFGN0YwOCwgMHhFMjFDNjEwRCwKKzB4MUQxMTJEMjAsIDB4RDIyMDY0NDIsIDB4RDQxQzFENDIsIDB4MUQ1MzY1NDIsCisweDY3NTJENTFCLCAweEQ3MUIxRDc0LCAweDFEMTU2MTcyLCAweDFENjY2NjIyLAorMHg2MjYyRDYxQSwgMHgxRDI3QTI2RiwgMHg4QjM1ODgzMywgMHg0OTBCRDkxOSwKKzB4QTI2OEVFMDAsIDB4MDAwMDJERTAsIDB4MDAxMTc4MDAsIDB4MDAyMDNBMUMsCisweDAwMjAxOEEyLCAweDAwMjAyQUFDLCAweDAwMjAzOTBFLCAweDAwMjAzQTIwLAorMHgwMDIwMzUzNCwgMHgwMDIwMThFRSwgMHgwMDIwMzkwRCwgMHgwMDExNzgwNCwKKzB4MDAyMDM5OEMsIDB4MDAxMTc4MTAsIDB4MDAyMDM5MDksIDB4MDAyMDM5MEEsCisweDAwMjAzOTBCLCAweDAwMjAwRjY0LCAweDAwMUM1ODY0LCAweDAwMUM2ODY0LAorMHgwMDFDNzg2NCwgMHgwMDFDNTlCQywgMHgwMDFDNjlCQywgMHgwMDFDNzlCQywKKzB4MDAyMDBGQkMsIDB4MDAyMDBGQjgsIDB4ODkwMTg4MjgsIDB4MDAwOUEwQzAsCisweEU2NDNERUI1LCAweDMyNjY2MkUxLCAweDFGRUU4RjAyLCAweDJFMjFFMjQwLAorMHg2MjJENjJFMSwgMHg4QjAxMzI2NywgMHgwMDA5QTBBQSwgMHhFNTAxODVFMSwKKzB4OEIwMTMwNTYsIDB4MDAwOUEwQTQsIDB4MkQxMEUxMDEsIDB4NjRFMUIyMjUsCisweEU2NDM1N0ZFLCAweDY1MkQ2MjcxLCAweDg5NDQzNTY3LCAweDM1NjNFNjQwLAorMHhFNjAwOEIwNSwgMHgwRjY1RTA0MCwgMHhBMDBGRTExQSwgMHg2MTUzNzJDMCwKKzB4NDEyMTQxMjEsIDB4NDEyMTQxMjEsIDB4NDUyMTQxMjEsIDB4NDUyMTQ1MjEsCisweEM5MDM2MDUzLCAweEUwNDA2NjAzLCAweDcxMTgwRjY1LCAweDIyMDlFMDA3LAorMHgwRjI1RTAzQywgMHhFMDQ0NjQxRCwgMHhCMkEzNjVGMywgMHhFMzNDMEY0NiwKKzB4ODUzMjMzRkMsIDB4NjIwRERFOTUsIDB4NDIwODYwMzEsIDB4NjAyMzYxMEQsCisweDEzMjNFOTQ0LCAweDA2RkU0MTA4LCAweEUwMEYzOUZDLCAweDEzMTQ0RTBCLAorMHg2NzA3NUQ5MSwgMHg2MEQzMjY3OSwgMHgwRjY2NTRGRSwgMHg1MTkyODU0MiwKKzB4NjAwRDRFMEIsIDB4NjBEMzI2MEIsIDB4MEY2NjY0OTIsIDB4NjVGM0IyMzcsCisweDY5NjE1NkZFLCAweEU2NDA2NTlELCAweDg5MzgzNTYzLCAweEQ3ODM1OUZFLAorMHg3OTA2NjU5MSwgMHhDOTAzNjA1MywgMHg0MDAwNDAwOCwgMHg2MTAzNjIwMywKKzB4MEYyNkUwNTAsIDB4NDcwQkUwRkYsIDB4NkMwNzYwMEMsIDB4NjYwMzYwNUQsCisweDQ2MjE0NjIxLCAweDQ2MjE0NjIxLCAweDQyMDA2MjYzLCAweDQyMDAzMjZDLAorMHg0MDIxNDAyMSwgMHg0MDA4QzkwMywgMHg2RDJEMzBGQywgMHhFODAwNkEwMywKKzB4QjI1NzY1RjMsIDB4NkVBMjY0RDMsIDB4MkVDOUUwNTAsIDB4NjY5NDJBRTIsCisweEQ3NkUwMUZFLCAweDYwNkM0NzBCLCAweDJBRTIyRTBCLCAweDY0RDM2NUYzLAorMHg3ODAxQjFGRCwgMHhFRTA2NjI4RCwgMHg4RkU5MzJFMywgMHg1RUZFN0QwMSwKKzB4NjFFMUU0MDAsIDB4NDEwMDg1RTEsIDB4NjZFMzMxMEMsIDB4NzYwQzcxMUIsCisweEU3MDQ2NUYzLCAweDY4NjY3NDAxLCAweDNBNzM2QTRELCAweDhGRjkyNTgyLAorMHg2NUYzNzUwNCwgMHg2NDFEQjFFMywgMHg2NEUxQjFBNCwgMHgwMDA5QTE3QiwKKzB4RDQ1QjU2RjcsIDB4RUMwMUQyNUIsIDB4MjZDMDQyMEIsIDB4MDAwOUExNzMsCisweDA2RkNFMDE4LCAweDg4Mjk2MDZDLCAweDU4Rjc4QjA4LCAweEU0MDBEMjUyLAorMHg2NjIyMjg0MCwgMHg2NDZEQjE3MSwgMHgwMDA5QTE2NSwgMHg2NjZDRTY4MSwKKzB4ODkwMTMwNjAsIDB4MDAwOUEwQUMsIDB4RDU1MEQxNEYsIDB4NjIxMjZBNTYsCisweDIxMjIzMkFDLCAweDU0MTE2QzU2LCAweDM0Q0M2MjUzLCAweDY0NTIxMTQxLAorMHg3MjA4NTgxMiwgMHhENDRBMzg0QywgMHg2ODIyMTE4MiwgMHg1QTEzNkM0MiwKKzB4M0FDQzNDOEMsIDB4MTFBMzI0QzIsIDB4NkMyMjcyRUMsIDB4NzIxMDU4MTQsCisweDExODQzOENDLCAweDVBMTU2ODIyLCAweDExQTUzQThDLCAweDZBMjI3MjEwLAorMHhENjQwNTgxNiwgMHgxMTg2MzhBQywgMHg1MjE3NkM2MiwgMHgxMTI3MzJDQywKKzB4NUExODU4NjEsIDB4MTFBODNBOEMsIDB4NUMxOTVBNjIsIDB4MTFDOTNDQUMsCisweDUyMUE1QzYzLCAweDExMkEzMkNDLCAweDVBMUI1ODY0LCAweDExQUIzQThDLAorMHg1QzFDNUE2NSwgMHgxMUNDM0NBQywgMHg1MjFENUM2NiwgMHgxMTJEMzJDQywKKzB4NUExRTU4NjcsIDB4MTFBRTNBOEMsIDB4NTYxRjVBNjgsIDB4MzZBQ0U4NDAsCisweDExNkZEQTJELCAweDZDQTIzODFDLCAweDdBOTQ2NjgyLCAweDI4NjIzNkNDLAorMHg1QzgxNjJBMiwgMHgxOEMxM0MyQywgMHg2MkEyN0E0NCwgMHgzNjJDNTY4MiwKKzB4RDYyNjE4NjIsIDB4NUE4NTYyNjIsIDB4M0EyQzQyMjksIDB4NzYwNDE4QTUsCisweDU2ODY2MjYyLCAweDM2MkM0MjI5LCAweDU2RjcxODY2LCAweDI2MjBFMjM4LAorMHgxNkMxNUM4MSwgMHgxNjIyNjIxMiwgMHhFMjAwNUMxMSwgMHg1NTEyMTZDMywKKzB4NTUxNTE2NTQsIDB4NTUxMzE2NTUsIDB4NTUxNjE2NTYsIDB4NTU4MjE2NTcsCisweDY1ODIxNjU4LCAweDU1MTQxNjU5LCAweDU1ODQxNjVBLCAweDU1ODMxNjVCLAorMHg1NTg1MTY1QywgMHg1NTg2MTY1RCwgMHgxODIxMTY1RSwgMHgxMTIxMjEyMiwKKzB4MTEyNTExMjIsIDB4MTEyNjExMjMsIDB4MjgyMjE4MjIsIDB4MTgyNDExMjQsCisweDE4MjUxODIzLCAweDE4MjZBMEM3LCAweDAwMTE3ODA0LCAweDAwMjAzM0U4LAorMHgwMDIwM0E0MCwgMHgwMDIwMThBMiwgMHgwMDIwMzQ5NCwgMHgwMDFDMzZBMCwKKzB4MDAyMDM0RjAsIDB4MDAxQzNDQTAsIDB4MDAxQzM2RjQsIDB4MDAxQzNCODgsCisweDY2NkNFNjgyLCAweDhCMjAzMDYwLCAweEVBMjQ1NkY3LCAweDI2QTBEMTk0LAorMHgxNkMxNUMxNywgMHgxNjIyNTIxOCwgMHgxNjgzNTgxOSwgMHgxNkE0NUExQSwKKzB4MTZDNTVDMUIsIDB4MTYyNjUyMUMsIDB4RTIwMDU4MUQsIDB4NTUxRTE2ODcsCisweDU1MUYxNjU4LCAweDExMjcxNjU5LCAweDExMjkxMTI4LCAweDExMkIxMTJBLAorMHgxMTJEMTEyQywgMHhBMDhFMTEyRSwgMHhFNjgzMTEyRiwgMHgzMDYwNjY2QywKKzB4NTJGNzhCMEIsIDB4RUEwMEQ4ODMsIDB4NjU4MjIyQTAsIDB4NzgwNERDODIsCisweDYyODIyQzUyLCAweEEwN0VENjgxLCAweEU2OTAyNjIwLCAweDMwNjA2NjZDLAorMHhEQTdGOEIwNiwgMHgwMDA5NEEwQiwgMHhFMjAwNTZGNywgMHgyNjIwQTA3MywKKzB4NjY2Q0U2OTEsIDB4OEIxMDMwNjAsIDB4NjIyMkQyNzYsIDB4MjIyODYyMkMsCisweEQyNzg4OTA0LCAweDAwMDk0MjBCLCAweDAwMDlBMDAzLCAweDQyMEJEMjc2LAorMHg1NkY3MDAwOSwgMHhBMDVFRTIwMCwgMHhFNjkyMjYyMCwgMHgzMDYwNjY2QywKKzB4RTAxODg5NTEsIDB4RTZCMDBCRkMsIDB4NjY2QzYyQkMsIDB4OEIyQTMyNjAsCisweDAyRkNFMDE0LCAweDY4MkNFQTAwLCAweDYyQURFOTA0LCAweDg5NEEzMjgzLAorMHg2QUFEREQ2NCwgMHgzQ0RDNkNBMywgMHg3RDA0NkVDMiwgMHhEQjY4RDQ2NywKKzB4MzJEQzYyQTMsIDB4NEIwQkRDNjcsIDB4NEMwQjZEMjIsIDB4RDQ2NjY0RTMsCisweDAwMDk0QjBCLCAweDY0RDM0QzBCLCAweDRCMEJENDY0LCAweEU2MDAwMDA5LAorMHg2NjZENkJFMywgMHg3NjAxM0I2QywgMHgzMjkzNjI2RCwgMHg4RkY3MkJEMCwKKzB4QUZEQTREMTksIDB4RTZCNTdBMDgsIDB4MzI2MDY2NkMsIDB4RDQ1QzhCMTMsCisweDRCMEJEQjU3LCAweEQyNUIwMDA5LCAweDYwMjJEQjVCLCAweENCMjBFNkZGLAorMHgyMjAyNjY2RCwgMHhEQjU5MkI2MiwgMHhFMDE0RTIwMCwgMHg1NkY3MkIyMCwKKzB4QTAxMDAyRkMsIDB4RDQ1NjI2MjAsIDB4NjU0MkQyNTYsIDB4NDIwQkQ0NTYsCisweEEwMDgwMDA5LCAweERCNTIwMDA5LCAweDUyQjFFNjAwLCAweDYyMkNEQjUzLAorMHg1MkY3MkIyMSwgMHg3RjU0MjI2MCwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwKKzB4NkFGNjZCRjYsIDB4MDAwQjY5RjYsIDB4NEYyMjY4RjYsIDB4RTI0MDYxNEQsCisweDg5MTQzMTIzLCAweDMxMjdFMjFGLCAweDhCMDlENzQ5LCAweEQ0NDk2MTRELAorMHhFMDAxNzFFMCwgMHg1NjcxNDQwQiwgMHgyNjU5NjUwNywgMHgxNzYxQTAwNywKKzB4RTAwMUQ0NDQsIDB4NjY3MjQ0MEIsIDB4MjY1OTY1MDcsIDB4NEYyNjI3NjIsCisweDAwMDkwMDBCLCAweDYxNEQ0RjIyLCAweDMxMjNFMjQwLCAweEUyMUY4OTEyLAorMHhENzNCMzEyNywgMHg2MTREOEIwOCwgMHg1NjcxRDIzQSwgMHg0MjBCNzFFMCwKKzB4MjYwQkUwMDEsIDB4MTc2MUEwMDYsIDB4NjY3MkQyMzYsIDB4RTAwMTQyMEIsCisweDI3NjIyNjBCLCAweDAwMEI0RjI2LCAweEU2NDAwMDA5LCAweDQ2Mjg0NjE4LAorMHg2MjUyRDUzMSwgMHg4OUZDMjI2OCwgMHgwMDA5MDAwQiwgMHg0NjE4RTY4MCwKKzB4RDUyRDQ2MjgsIDB4MjI2ODYyNTIsIDB4MDAwQjg5RkMsIDB4QTAwMTAwMDksCisweDcyMDFFMjAwLCAweDhCRkMzMjQyLCAweDAwMDkwMDBCLCAweDQ2MThFNjgwLAorMHhENTI2NDYyOCwgMHgyMjY4NjI1MiwgMHgwMDBCOEJGQywgMHgyRkU2MDAwOSwKKzB4N0ZGQzRGMjIsIDB4QkZGMTZFNTMsIDB4NjFFMjJGNDIsIDB4RTI4MEQ2MjAsCisweDU0RTExNjE1LCAweDE2NDY0MjE4LCAweDQyMjg1NUUyLCAweDU3RTMxNjU3LAorMHgxNjc4NkVGMiwgMHgyNkUyMkUyQiwgMHg0RjI2N0YwNCwgMHg2RUY2QUZDRSwKKzB4MDAyMDM0OTQsIDB4MDAxMTc4MDQsIDB4MDAyMDM4RjQsIDB4MDAyMDM5MDgsCisweDAwMjAwNTBBLCAweDAwMjAxMDA4LCAweDAwMjAxMDJFLCAweDAwMjAzQTU4LAorMHgwMDIwMThBMiwgMHgwMDIwMThFNiwgMHgwMDIwM0E2QywgMHgwMDIwM0E3NCwKKzB4MDAyMDNBNzgsIDB4MDAxQzM1MDAsIDB4MDAxQzEwMDAsIDB4MDAyMDM5OEEsCisweDAwMTE3ODAwLCAweDAwMjAxOEVFLCAweDAwMjAzQThDLCAweDAwMjAzOTkwLAorMHgwMDFDMzcwNCwgMHgwMDIwMzNFOCwgMHgwMDFDMzczQywgMHgwMDFDMzcwMCwKKzB4MDAxQzM3MEMsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4NkM1M0REMTAsCisweDZFNDNCRkE0LCAweDJERTJCRjg5LCAweDAwMDlCRkEwLCAweDJDMTI1MUQ1LAorMHgxQzQxNTRENiwgMHgxQzUyNTVENywgMHgxQzYzNTZEOCwgMHg2RUY2NEYyNiwKKzB4MDAwQjZERjYsIDB4NjE2MzZDRjYsIDB4QTAwNEU2MDAsIDB4NjI1NjQxMDksCisweDI0MjI3NjAxLCAweDM2MTI3NDA0LCAweDAwMEI4QkY5LCAweDAwMDAwMDA5LAorMHgwMDFDMzcwQywgMHgwMDA5QTE2RSwgMHgyRkU2MkZENiwgMHhERDk0NEYyMiwKKzB4QTAwNDlFQjIsIDB4RDQ5MzAwMDksIDB4NDIwQkQyOTMsIDB4NjJEMjY1RDIsCisweDhCRjgyMkU4LCAweDAwMDlBMDA0LCAweEQyOEZENDkwLCAweDU1RDE0MjBCLAorMHgyMkU4NTJEMSwgMHhBMDA0OEJGOCwgMHhENDhEMDAwOSwgMHg0MjBCRDI4QSwKKzB4NTJEMjU1RDIsIDB4OEJGODIyRTgsIDB4MDAwOUEwMDQsIDB4RDI4NkQ0ODksCisweDU1RDM0MjBCLCAweDIyRTg1MkQzLCAweEEwMDQ4QkY4LCAweEQ0ODYwMDA5LAorMHg0MjBCRDI4MSwgMHg1MkQ0NTVENCwgMHg4QkY4MjJFOCwgMHg2RUY2NEYyNiwKKzB4NkRGNjAwMEIsIDB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4NkU2MzZDNzMsCisweDZENTNCMDFBLCAweDY0RDM1N0Y0LCAweEIwNUY2NUUzLCAweEIwNzU2NkMzLAorMHhCMEE0MDAwOSwgMHhCMEE4MDAwOSwgMHhCMEFDMDAwOSwgMHhCMEFDMDAwOSwKKzB4QjBBRjAwMDksIDB4QjAzMTU0RjUsIDB4NkNDRDZDMDMsIDB4NEYyNjYwQzMsCisweDZERjY2RUY2LCAweDZDRjYwMDBCLCAweDM0MTJEMTcwLCAweEQ2NzAwNTI5LAorMHgyNjUwRDc3MCwgMHgyNzQyMDAwQiwgMHgwMDA5QTAxOCwgMHgyRkQ2MkZDNiwKKzB4NEYyMjJGRTYsIDB4NkU2MzZDNzMsIDB4NkQ1M0JGRUUsIDB4NjREMzU3RjQsCisweEIwMzM2NUUzLCAweEIwOEQ2NkMzLCAweEIwMEY1NEY1LCAweDZDQ0Q2QzAzLAorMHg0RjI2NjBDMywgMHg2REY2NkVGNiwgMHg2Q0Y2MDAwQiwgMHhFNTAzRDE2MiwKKzB4RDc2M0Q0NjIsIDB4MjE1MjQ1MTgsIDB4MjQ3MjAwMEIsIDB4RDQ1RkQxNUUsCisweDIxNjJFNjAwLCAweDI0NjIwMDBCLCAweEJGNzM0RjIyLCAweEJGNzNFNDBBLAorMHhEMjVDMDAwOSwgMHg0MTE4RTEwNCwgMHhFNDBBRTUwMCwgMHhCRjY5MjIxMiwKKzB4RDc1OTIyNTIsIDB4Q0IyMDYwNzIsIDB4MDAwQjRGMjYsIDB4NEYyMjI3MDIsCisweDQxMEJEMTU2LCAweEQ1NTZFNDAwLCAweDRGMjY0NTJCLCAweEQxNTUyRkU2LAorMHg2NjEyNkU2MywgMHg5MjEwNDQxOCwgMHg0NDA4NDUyOCwgMHg0NTAwMjYyOSwKKzB4MjY1QjQ0MDgsIDB4MjY0QjQ0MDAsIDB4MjE2MjQ3MDgsIDB4RDE0RTQ3MDgsCisweDIxNzIyN0VCLCAweDZFRjYwMDBCLCAweDFGRkYwM0YwLCAweDRGMjIyRkU2LAorMHhFMTAxREU0QSwgMHhCRjNERTQwQSwgMHg2N0UzMkUxMiwgMHhFNTAwNzc2QywKKzB4RTIwNEUxMzAsIDB4Mjc1MkU0MEEsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsCisweDI3NTIyNzUyLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLCAweDI3NTIyNzUyLAorMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwgMHgyNzUyMjc1MiwgMHgyNzIyMjcxMiwKKzB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsIDB4Mjc1MjI3NTIsCisweDE3NUFCRjE4LCAweDJFNjJFNjAwLCAweDAwMEI0RjI2LCAweEQyMzQ2RUY2LAorMHhFNDQxRTEwMSwgMHgwMDBCMjIxMiwgMHhEMTMyMjI0MiwgMHhFNjA1RDQzMiwKKzB4MDAwQjIxNjIsIDB4MDAwQjI0NjIsIDB4RDIzMDAwMDksIDB4RTQwQUU2MDEsCisweDIyNjJBRjAwLCAweDJGQzYyRkI2LCAweDJGRTYyRkQ2LCAweDdGRkM0RjIyLAorMHg2QzQzREIyQiwgMHhFRDAwNjBCMiwgMHgyQjAyQ0IwMywgMHhDOTAzNjBCMiwKKzB4NkUwM0EwMDgsIDB4ODkwNzNEQzIsIDB4RTQ2NDYwQjIsIDB4QjA3Q0M5MDMsCisweDdEMDE2RTAzLCAweDhCRjUyRUU4LCAweDhGMDQzREMyLCAweEQ0MjEyRkUxLAorMHg0NjBCRDYyMSwgMHg2MkYxMDAwOSwgMHg2MDIzNjIyRCwgMHg4OUZGQzgwMSwKKzB4N0YwNDYwMjMsIDB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjAwMEIsCisweDAwMUMzQjg4LCAweDAwMjAzQUEwLCAweDAwMjAxOEVFLCAweDAwMjAzQUE4LAorMHgwMDIwM0FCMCwgMHgwMDIwM0FCOCwgMHgwMDIwM0FDMCwgMHgwMDI1RTcyMCwKKzB4MDAyMDNEQTAsIDB4MDAyMDM4RjgsIDB4MDAxQzU5NjgsIDB4MDAxQzNCNDAsCisweDAwMEY4MDAwLCAweDAwMUQ0MDA0LCAweDAwMUMzNTAwLCAweDAwMjAxNUUwLAorMHgwMDIwMTYwQywgMHgwMDFDNTgxNCwgMHgwMDFDNTlEMCwgMHgwMDFDNTgzMCwKKzB4MDAxQzYyNjgsIDB4MDAxQzU5QTQsIDB4MDAxQzYzOUMsIDB4MDAxQzU4MUMsCisweDAwMUM1ODYwLCAweDAwMjAzQUM4LCAweDAwMjAxOEEyLCAweDhGMDE0NDExLAorMHg2MDQzNjA0QiwgMHgwMDA5MDAwQiwgMHg1NjUxRDUyQiwgMHg0NjI4NjA1MiwKKzB4MzA2QzAwMEIsIDB4MkZDNjJGQjYsIDB4MkZFNjJGRDYsIDB4NEYxMjRGMjIsCisweEJGRjE0RjAyLCAweDZCMDM2RTQzLCAweEREMjVEQzI0LCAweDAwMDlCRkVDLAorMHgzQzA1MzBCOCwgMHg0NjA5MDYwQSwgMHg0NjAxNDYwOSwgMHgwMjBBM0Q2NSwKKzB4NDIwOTQyMDksIDB4MzJFMjQyMDksIDB4NEYwNjhCRjAsIDB4NEYyNjRGMTYsCisweDZERjY2RUY2LCAweDAwMEI2Q0Y2LCAweDJGQzY2QkY2LCAweDJGRTYyRkQ2LAorMHg0RjEyNEYyMiwgMHhCRkNGNEYwMiwgMHg2QzAzNkU0MywgMHhCRkNCREQxMywKKzB4MzBDODAwMDksIDB4MDYwQTNEMDUsIDB4NDYwOTQ2MDksIDB4MzZFMjQ2MDEsCisweDRGMDY4QkY1LCAweDRGMjY0RjE2LCAweDZERjY2RUY2LCAweDZDRjYwMDBCLAorMHg0RjIyMkZFNiwgMHhFMTAyREUwQiwgMHhFNDAzRTUwMCwgMHhCRkI5MkUxMiwKKzB4RTYwNjJFNTIsIDB4RTcwMDQ2MTgsIDB4MkU2MkU0MDMsIDB4NEYyNjJFNzIsCisweDZFRjZBRkIwLCAweDAwMDkwMDBCLCAweDAwMUMxMDQwLCAweENDQ0NDQ0NELAorMHgxMDYyNEREMywgMHgwMDFENDAwNCwgMHgyRjk2MkY4NiwgMHgyRkI2MkZBNiwKKzB4MkZENjJGQzYsIDB4NEYyMjJGRTYsIDB4RTUwMDdGOTgsIDB4NjQ1M0U3MTAsCisweDZCNTM0NzI4LCAweEVFMUFEQ0JDLCAweDYxNTM2NTVELCAweDMxNUM0MTA4LAorMHg3NTAxNDEwOCwgMHg2MDQzMzE3QywgMHgwRjE2NjY1RCwgMHhFRDAwNjBCMywKKzB4MjFCMTM2RTMsIDB4ODExMjgxMTEsIDB4MTFEMjgxMTMsIDB4MTFENDExRDMsCisweDc0MDQ4RkVBLCAweEQ4QjE2N0YyLCAweDE4NzFEOUIxLCAweDU4RjEyODcyLAorMHgxOTgxRDFCMCwgMHg1OUYyMjk4MiwgMHg1REY0NUFGMywgMHg1NEY2NUVGNSwKKzB4MjE5MjExOTEsIDB4MTFBMjExQTMsIDB4MTFENDExRDUsIDB4MTFFNjExRTcsCisweDExNDgxMTQ5LCAweERBQTg1NUY3LCAweDU3RjhFRTAwLCAweDUyRjlEREE3LAorMHg2NEUzRDZBNywgMHgyQTUyMUE1MSwgMHhEOEE3RDlBNiwgMHgyRDcyOUFENSwKKzB4NkVFRDI2MjIsIDB4NEQwODZERTMsIDB4M0RFQzYxRTMsIDB4NEQwODQxMDgsCisweDNEOUMzMUVDLCAweDQxMDg2MEIzLCAweDgxRDEyREIxLCAweDQxMDhFMDUwLAorMHg0MDA4RTdCNywgMHg2NzdDNDEwOCwgMHg2MEIzODFEMiwgMHhFMjAwMzE4QywKKzB4ODFEMzM0NzIsIDB4MUQxMzFERDIsIDB4OEQwMUQ0OTMsIDB4RDQ5MDFEMjQsCisweEIwQjM2NUQzLCAweDY0RUQ3RTAxLCAweDhCREEzNEEyLCAweDJGRDJEQThDLAorMHhERDkyNjhBMiwgMHgyRDgyNDgyOSwgMHg3REZDNjRBMiwgMHhEMjg3Njk0RCwKKzB4NkUyMjJEOTIsIDB4N0QwQzRFMjksIDB4NjgyMjJERTIsIDB4NjE4RDZBRDMsCisweDJBMTZENzg0LCAweEQ0OEE2RDcyLCAweDI0RDJENTgzLCAweEQ2ODk1RTcyLAorMHg1MTc0MTRFMiwgMHgxNDE0RUUwMCwgMHhEMTg3NTg3NiwgMHg1OTc4MTQ4NiwKKzB4MTQ5OEU3MTAsIDB4NjVFMzYyNTIsIDB4MjZFMjE0MkEsIDB4RTYwMDY0RTMsCisweDY4NDM2NDRELCAweDM4NEM0ODA4LCAweDM4MUM0ODA4LCAweDBDODY2MDUzLAorMHgwOUNFMjhCMSwgMHg4MTkxNjBCMywgMHgwQUNFNjA1MywgMHg4MUEyNjA0MywKKzB4MERDRTYwNTMsIDB4ODFEMzYwQjMsIDB4MDhDRTYwNTMsIDB4MTg4Mjc0MDEsCisweDYyNEQwOUNFLCAweDBBQ0UxOUUzLCAweDFBNjQzMjczLCAweDc1MDQ4RkUwLAorMHhFMDAzRDk2QSwgMHg0MDE4NkM5MiwgMHg2RDkyMkNCMSwgMHg4MUQxREE2RiwKKzB4NkU5MkUwNTAsIDB4ODFFMjQwMDgsIDB4NjBCMzYxOTIsIDB4NjQ5MjgxMTMsCisweDE0NDJFNjAwLCAweEQ0Njk2NzkyLCAweDY4OTIxN0EzLCAweDE4NjRFMUZGLAorMHg2NTYzRTcwMywgMHgzNjRDNDYwOCwgMHgyNjEyNzUwMSwgMHgzNjczNjY1RCwKKzB4REM1QjhCRjgsIDB4NkRDMkUwMDMsIDB4MkRCMTQwMTgsIDB4RDI2MDZFQzIsCisweDYxQzI4MUUxLCAweDExMTJFRTAwLCAweEUwMjQ2NEMyLCAweDY1QzIxNDIzLAorMHgxNUU0RDQ1QiwgMHhFNTgwNjdDMiwgMHg2OEMyODE3MiwgMHg4MTgzNjZFMywKKzB4NjY2RDY1NUMsIDB4NzYwNDY5NjMsIDB4Mzk0QzZBNkQsIDB4OEZGODNBNTMsCisweERCNTQyOUUyLCAweDI0QjJEQzU0LCAweDI0QzI3NDA0LCAweDRGMjY3RjY4LAorMHg2REY2NkVGNiwgMHg2QkY2NkNGNiwgMHg2OUY2NkFGNiwgMHg2OEY2MDAwQiwKKzB4NjAxMTYxNDIsIDB4OEYwM0M4MDMsIDB4RDIzREU1MDAsIDB4OEIwNjM0MjAsCisweEM5MDM2MDExLCAweDhCMDY4ODAyLCAweDM0MjBEMjM5LCAweDU2MTI4QjAzLAorMHg1MjY0NjUxMywgMHgwMDBCMjQyMiwgMHgwMTEzNjA1MywgMHgyRkU2MkZENiwKKzB4N0ZFQzRGMjIsIDB4NjI1MzZFNTMsIDB4NkQ0M0U1NTAsIDB4NDUwOEU0MDAsCisweEUxMDFBMDAxLCAweDYwNDM1MjI0LCAweDgxMjEyMjExLCAweDYwNTM4MTIzLAorMHg1NkUyODEyMiwgMHg4QkY1MzYyMCwgMHgxNkU0RDIzOCwgMHhFNjE0NjRGMywKKzB4NjVFMzQyMEIsIDB4RTRGQzY1RTEsIDB4MkU1MTI1NDksIDB4NjVGMzYxRjEsCisweDJGMTEyMTQ5LCAweEQxMzE1NEQxLCAweEU2MTQ0MTBCLCAweDYwNzE1N0QxLAorMHgyNzAxQ0IwMSwgMHg3RjE0MURFMSwgMHg2RUY2NEYyNiwgMHg2REY2MDAwQiwKKzB4MkZFNjJGRDYsIDB4N0ZFQzRGMjIsIDB4NjY1MzZFNTMsIDB4NkQ0M0U1RkMsCisweDIwNTk2MDYxLCAweDI2MDFDQjAxLCAweDMyNjA1MkUyLCAweDEyRTQ4QjA2LAorMHgzMUUwNTFFMiwgMHg1MkQxOEIwNCwgMHgxRTIyQTAwMiwgMHg1NjY0QUZGMCwKKzB4NjRGM0QyMUUsIDB4NDIwQkU2MTQsIDB4NjdFMTY1RTMsIDB4MjcxOUUxRkMsCisweDY3RjEyRTcxLCAweDI3MTk1NEQxLCAweDY1RjNEMTE4LCAweDQxMEJFNjE0LAorMHg1MkQxMkY3MSwgMHhDQjAxNjAyMSwgMHgxREUxMjIwMSwgMHg0RjI2N0YxNCwKKzB4MDAwQjZFRjYsIDB4MDAwMDZERjYsIDB4MDAyMDM5MjQsIDB4MDAyMDM0RjQsCisweDAwMjAzNEZDLCAweDAwMjAzNTA0LCAweDAwMjAzNTJDLCAweDAwMjAzOTEwLAorMHgwMDIwMzkxOCwgMHgwMDEwMDIwOCwgMHgwMDEwMTdDMCwgMHgwMDFFMjEwQywKKzB4MDAxQzNEMDAsIDB4MDAyMDM5NjQsIDB4MDAxMDAwQzgsIDB4MDAxMTc4ODAsCisweDAwMTE3NzgwLCAweDAwMDQwMDIwLCAweDAwMjZDNDAxLCAweDAwMjAwRUQ2LAorMHg0RjIyMkZFNiwgMHhERTQyNjI0QywgMHg0MjAwNDIwOCwgMHgzRTJDQTAwNSwKKzB4RDQ0MDUyNTIsIDB4QkY2OTU2MjQsIDB4NjVFMjJFNjIsIDB4MzUyMDUyRTEsCisweEQ2M0Q4QkY2LCAweDRGMjYyNjIyLCAweDZFRjYwMDBCLCAweDJGQzYyRkI2LAorMHgyRkU2MkZENiwgMHhEQzM5NEYyMiwgMHg1MkMxREIzOSwgMHgzNjIwNjZDMiwKKzB4NjA2MTg5MUMsIDB4ODgwMUM5MDMsIDB4REUzNDg5MTgsIDB4QkYzN0REMzUsCisweDY1MDM2NEUzLCAweDY2QjI4NTAzLCAweDMyNjI2MjBELCAweEQ0MzI4OTA3LAorMHgwMDA5QkY3NiwgMHg0RDBCRDQzMSwgMHhBRkU2MDAwOSwgMHhCRjNEMDAwOSwKKzB4RDQyRjY0RTMsIDB4MDAwOTREMEIsIDB4MDAwOUFGREYsIDB4MjI2MkQyMkQsCisweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZCRjYwMDBCLCAweDJGRDYyRkM2LAorMHg0RjIyMkZFNiwgMHhERDI5REMyOCwgMHg2RTQzNjBDMiwgMHgwNERFNDAwOCwKKzB4RTYxNEQxMjcsIDB4NjVFMzQxMEIsIDB4RDEyN0Q3MjYsIDB4NTVFMjI3RTIsCisweDM1RTA1MjU0LCAweDIxMjI4RjA0LCAweDQwMDg2MEMyLCAweDEyMjIwMkRFLAorMHg2MDUzNjVDMiwgMHg3NTAxNDAwOCwgMHgwREU2MDZERSwgMHhDOTBGNjA1MywKKzB4NjA2MzJDMDIsIDB4NkVGNjRGMjYsIDB4MDAwQjZERjYsIDB4ODU0MzZDRjYsCisweDY1MEQ1NjQzLCAweDYyMkQ2MjYyLCAweDM1Mjc3MjA0LCAweEUxMDA4RjBDLAorMHgyMjY4OTYwQywgMHhENjE1OEIwMywgMHg3MjAxNTI2MSwgMHhENjEzMTYyMSwKKzB4NjI2MkUxMDEsIDB4MjYyMjcyMDEsIDB4NjAxMzAwMEIsIDB4MDAwMDAxRkYsCisweDAwMjAzNTA0LCAweDAwMjAzNEZDLCAweDAwMUMzRDAwLCAweDAwMjAzNTJDLAorMHgwMDIwMzhGNCwgMHgwMDIwMThBMiwgMHgwMDIwMzRGNCwgMHgwMDIwM0FGMCwKKzB4MDAyMDNBRjQsIDB4MDAxQzNEMjgsIDB4MDAyMDM5NjQsIDB4MDAyMDM5MjQsCisweDAwMjAwRUQ2LCAweDAwMjAzOTY4LCAweDAwMjAzOTZDLCAweDAwMTE3NzU0LAorMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwgMHg3RkY4NEYyMiwgMHg2MDIyRDIzNywKKzB4OEQ1OEM4MDMsIDB4REUzNjJGMDEsIDB4REIzN0RDMzYsIDB4NjZDMjUyQzEsCisweDg5MkYzNjIwLCAweEM5MDM2MDYxLCAweDg5MkI4ODAxLCAweEQyMzNERDMxLAorMHg2NEQzNDIwQiwgMHgxRjAxNjUwMywgMHg4ODAxNjBCMSwgMHhEMjMwOEIwNCwKKzB4NjREMzQyMEIsIDB4MDAwOUFGRUEsIDB4ODU2MTU2NTMsIDB4ODkwNEM4MjAsCisweEUwNTBENzJDLCAweDcyMDEwMjdFLCAweEQyMkIwNzI2LCAweDY0NTM0MjBCLAorMHg4OTA3MjAwOCwgMHg1NUYxRDEyNiwgMHg2NEQzNDEwQiwgMHhFNjAxRDcyNywKKzB4Mjc2MkFGRDQsIDB4NTVGMUQyMjYsIDB4NjRFMzQyMEIsIDB4RTYwMUQxMjUsCisweDIxNjJBRkNDLCAweEREMjVERTI0LCAweERDMjZEQjI1LCAweDY2RDI1MkQxLAorMHg4OTE4MzYyMCwgMHhDOTAzNjA2MSwgMHg4OTE0ODgwMSwgMHhEMTE3RDQxRiwKKzB4MDAwOTQxMEIsIDB4MzZFMDU2MDMsIDB4NjUwMzhGMDQsIDB4MkIyMEUyMDEsCisweDJDNTJBRkVDLCAweEQ3MTJENDFDLCAweDAwMDk0NzBCLCAweEU2MDFEMTE1LAorMHhBRkUzNDYxOCwgMHg2MEYxMjE2MiwgMHg4OTA3QzgwNCwgMHg3RjA4RDIxNywKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjQyMkIsIDB4NEYyNjdGMDgsCisweDZERjY2RUY2LCAweDAwMEI2Q0Y2LCAweDAwMDA2QkY2LCAweDAwMUUyMTAwLAorMHgwMDIwMzUwNCwgMHgwMDIwMzRGQywgMHgwMDIwMzk4QywgMHgwMDIwMTRBMCwKKzB4MDAyMDE0Q0MsIDB4MDAyMDM0OTQsIDB4MDAyMDE2QkUsIDB4MDAxRTIxMkMsCisweDAwMjAxNTMwLCAweDAwMUMzRDMwLCAweDAwMTE3ODgwLCAweDAwMjAzNEY0LAorMHgwMDIwMzkxNCwgMHgwMDIwMzkxMCwgMHgwMDIwMzUyQywgMHgwMDIwMDYxMCwKKzB4RTYwMUQyMDMsIDB4MTI2NUQ1MDMsIDB4MDAwQjIyNTIsIDB4MDAwMDEyNjYsCisweDAwMUMxMDEwLCAweDAwMDBDMzRGLCAweDAwMDkwMDBCLCAweDJGRDYyRkM2LAorMHg0RjIyMkZFNiwgMHg2RDQzNkM1MywgMHhFRTAwQTAwNCwgMHg3RTAxNjRENCwKKzB4NjQ0Q0JGRjIsIDB4OEJGOTNFQzIsIDB4NkVGNjRGMjYsIDB4MDAwQjZERjYsCisweEU1MDA2Q0Y2LCAweDY2NDNBMDAyLCAweDc2MDE3NTAxLCAweDIyMjg2MjYwLAorMHhBRkUzOEJGQSwgMHgyRkU2MDAwOSwgMHg3NTA3NjI1MywgMHhFMTA4Njc1MywKKzB4NjA0M0VFMEEsIDB4NDQwOUM5MEYsIDB4NjUwMzMwRTIsIDB4OEQwMTQ0MDksCisweEU2MzBFNjM3LCAweDQxMTAzNjVDLCAweDhGRjIyNzYwLCAweEUwMDA3N0ZGLAorMHgwMDBCODAyOCwgMHgwMDBCNkVGNiwgMHgwMDBCRTAwMCwgMHgyRkU2RTAwMCwKKzB4N0ZFQzRGMjIsIDB4NkU0MzYyNTMsIDB4QkZEQzY1RjMsIDB4QkZEMDY0MjMsCisweEJGQ0U2NEUzLCAweEQ0MDM2NEYzLCAweDAwMDlCRkNCLCAweDRGMjY3RjE0LAorMHg2RUY2MDAwQiwgMHgwMDIwM0FGOCwgMHhFNEZERDI5RiwgMHhENzlGNjEyMiwKKzB4MjIxMjIxNDksIDB4NzQwMTYwMjIsIDB4MjIwMkNCMDEsIDB4RDU5QzY2MjIsCisweDIyNjIyNjQ5LCAweEM4NDA2MDcwLCAweDYwNTI4OTAyLCAweDI1MDJDQjA0LAorMHhFMUY3NjQ1MiwgMHgyNTQyMjQxOSwgMHhFNzAxNjA1MiwgMHgyNTAyQ0I0MCwKKzB4RTYwMjYwNTIsIDB4MjUwMkM5Q0YsIDB4NDcxODYwNTIsIDB4MjUwMkNCMTAsCisweENCMDM2MDUyLCAweDE1NjIyNTAyLCAweDE1NzMwMDBCLCAweEQ3OEVENThELAorMHhENDhGRDI4RSwgMHhFNjAwRTEwMCwgMHgyNzExMjUxMSwgMHhBRkNCMjIxMCwKKzB4NjY0QzI0NjEsIDB4NDYwMEQyOEIsIDB4NjA2MDM2MkMsIDB4MDAwQkNCMTAsCisweDY1NEMyNjAwLCAweDQ1MDBEMjg3LCAweDY2NTAzNTJDLCAweDI2MTlFMUVGLAorMHgyNTYwMDAwQiwgMHhEMjg0NjY0QywgMHgzNjJDNDYwMCwgMHhDQjEwNjA2MCwKKzB4MjYwMDAwMEIsIDB4RDI4MDY1NEMsIDB4MzUyQzQ1MDAsIDB4RTFFRjY2NTAsCisweDAwMEIyNjE5LCAweDY2NEMyNTYwLCAweDQ2MDBEMjdBLCAweDYwNjAzNjJDLAorMHgwMDBCQ0IwOCwgMHg2NTRDMjYwMCwgMHg0NTAwRDI3NiwgMHg2NjUwMzUyQywKKzB4MjYxOUUxRjcsIDB4MjU2MDAwMEIsIDB4RDI3MzY2NEMsIDB4MzYyQzQ2MDAsCisweENCMDg2MDYwLCAweDI2MDAwMDBCLCAweEQyNkY2NTRDLCAweDM1MkM0NTAwLAorMHhFMUY3NjY1MCwgMHgwMDBCMjYxOSwgMHg2MjRDMjU2MCwgMHg0MjAwRDY2OSwKKzB4NjAyMDMyNkMsIDB4NDAyMUM5MDgsIDB4NDAyMTQwMjEsIDB4NjAwQzAwMEIsCisweEQ2NjU2MjRDLCAweDMyNkM0MjAwLCAweEM5MDg2MDIwLCAweDQwMjE0MDIxLAorMHgwMDBCNDAyMSwgMHhEMTYxNjAwQywgMHgzNDFDNjQ0QywgMHgwMDBCNjI0MCwKKzB4RDE1RjYwMkMsIDB4MzQxQzY0NEMsIDB4MDAwQjYyNDAsIDB4MkZFNjYwMkMsCisweDZFNDM0RjIyLCAweEU2MEE2NDVDLCAweDg5MTQzNDY3LCAweDAwMDlCRkVCLAorMHg2MEVDNjQwQywgMHg4QjAyODgwMSwgMHhBMDAyRTAwRiwgMHg0NDA5MjQwOSwKKzB4NjI0QzQ0MDksIDB4MzI2M0U2MEEsIDB4QkZFMjg5MDUsIDB4NjIwQzY0NEMsCisweEM4ODA2MDIzLCAweEUyMDA4QjAwLCAweDRGMjY2MDIzLCAweDZFRjYwMDBCLAorMHhENjRDNEYyMiwgMHg4ODAxNjA2MiwgMHhCMjU3OEIwMywgMHhBMDAzMDAwOSwKKzB4RDI0OTAwMDksIDB4MjI2MEU2NDAsIDB4RTIwMEQ2NDgsIDB4MDAwQjRGMjYsCisweDRGMjIyNjIyLCAweDYwNjJENjQzLCAweDhCMDE4ODAyLCAweDAwMDlCMkEwLAorMHhFMjAwRDY0MiwgMHgwMDBCNEYyNiwgMHhENTNFMjYyMiwgMHhFMTAwRDQzRSwKKzB4MjUxMkU3MDEsIDB4MjQ3MDAwMEIsIDB4RTYwNEQyM0IsIDB4MjI2MDAwMEIsCisweEQ0M0I0RjIyLCAweDQxMEJEMTNCLCAweEQ1M0IwMDA5LCAweDY2NTBFMUZELAorMHgyNjE5RDIzQSwgMHgyNTYwRTcwMCwgMHgwMDBCNEYyNiwgMHg0RjIyMjI3MCwKKzB4RDIzOEQ1MzcsIDB4RDczODYxNTIsIDB4MjUxMjYxMUQsIDB4RTZGRjY0NTIsCisweDI1NDIyNDJCLCAweEQyMkZENDM1LCAweDQyMEI2NjZELCAweEQ1MkUyNzYyLAorMHg2NzUwRTFGQiwgMHg0RjI2MjcxOSwgMHgyNTcwMDAwQiwgMHhENDMwNEYyMiwKKzB4NDEwQkQxMjgsIDB4RDUyODAwMDksIDB4NjY1MEU3RjcsIDB4NEYyNjI2NzksCisweDI1NjAwMDBCLCAweDk0MjVENTI0LCAweDIyNDk2MjUwLCAweDI1MjAwMDBCLAorMHhFNEJGRDUyMSwgMHgyMjQ5NjI1MCwgMHgyNTIwMDAwQiwgMHhEMjI1NEYyMiwKKzB4NjAwRDg1MjIsIDB4ODkxMTIwMDgsIDB4ODk0NTg4MDEsIDB4ODk0Nzg4MDMsCisweDg5NDk4ODA1LCAweDg5NEY4ODA2LCAweDg5NTU4ODA4LCAweDg5NUI4ODA5LAorMHg4OTYxODgwQSwgMHg4OTY3ODgwQiwgMHgwMDA5QTA2RSwgMHgwMDA5QjA3MCwKKzB4NjAwQ0EwNkIsIDB4MDAwMEZGN0YsIDB4MDAxRTIxNDgsIDB4MDAxRTEwMDAsCisweDAwMUUxMTA4LCAweDAwMjAzOUM0LCAweDAwMjAzOUM2LCAweDAwMjAzOUU1LAorMHgwMDIwMzlBOCwgMHgwMDFFMTAzRiwgMHgwMDFFMTA1RiwgMHgwMDFFMTAyRiwKKzB4MDAxRTEwOTAsIDB4MDAyMDM5Q0MsIDB4MDAxRTEwMEIsIDB4MDAyMDM5QzgsCisweDAwMjAzQUZDLCAweDAwMjAxOEEyLCAweDAwMUUxMDI4LCAweDAwMjAzOUU0LAorMHgwMDFENDAyMCwgMHg5ODc2MDAwMCwgMHgwMDFDMTAwMCwgMHgwMDIwM0IwOCwKKzB4MDAyMDNCMTgsIDB4MDAyMDM5OUMsIDB4MDAwOUIwNEMsIDB4NjAwQ0EwMzUsCisweDAwMDlCMDU1LCAweDYwMENBMDMxLCAweDYyNjBENjg0LCAweDhCMkIyMjI4LAorMHgwMDA5QjA2MSwgMHg2MDBDQTAyOSwgMHg2MjYwRDY4MCwgMHg4QjIzMjIyOCwKKzB4MDAwOUIwNjksIDB4NjAwQ0EwMjEsIDB4NjI2MEQ2N0MsIDB4OEIxQjIyMjgsCisweDAwMDlCMEM3LCAweDYwMENBMDE5LCAweDYyNjBENjc4LCAweDhCMTMyMjI4LAorMHgwMDA5QjBDRCwgMHg2MDBDQTAxMSwgMHg2MjYwRDY3NCwgMHg4QjBCMjIyOCwKKzB4MDAwOUIxMjUsIDB4NjAwQ0EwMDksIDB4NjI2MEQ2NzAsIDB4OEIwMzIyMjgsCisweDAwMDlCMTNELCAweDYwMENBMDAxLCAweDRGMjZFMDAwLCAweDAwMDkwMDBCLAorMHhEMjZDRDE2QiwgMHhENTZDODQxMiwgMHg0MDAwQzkwRiwgMHhENzZCMDEyRCwKKzB4RTQwM0Q2NkIsIDB4RTIwRjYxMUMsIDB4MjU0MEUwMDEsIDB4MjUyMDI3MTIsCisweDI2MDIwMDBCLCAweEU2MDFEMjYyLCAweDMwNjY4NTIzLCAweEUwMDA4RDA1LAorMHhENjYzRDI2MCwgMHhFMDAxODEyMiwgMHgwMDBCMjYwMiwgMHhEMjVDMDAwOSwKKzB4NjAwRDg1MjMsIDB4ODkwNTIwMDgsIDB4OEIwQTg4MDEsIDB4NjA2MEQ2NUQsCisweDI2MDBDQjAxLCAweEQ0NTdENjVBLCAweEUwMDFFMTAxLCAweDAwMEIyNjEyLAorMHgwMDBCODE0MiwgMHhEMTUyRTAwMCwgMHg4NTEzRTUwMSwgMHg2NDBENDUxOCwKKzB4NjYwMzM0NTMsIDB4RTAwMDhEMDUsIDB4RDU1MUQyNTMsIDB4MjI2MEUwMDEsCisweDAwMEIyNTAyLCAweDRGMjIwMDA5LCAweDg1MTNEMTQ5LCAweDY0NTM2NTBELAorMHg2MjQ5NDQxOSwgMHgyMjdENjcyRSwgMHg4ODAxNjAyQywgMHg4ODAyODkwOSwKKzB4ODgwMzg5MTAsIDB4ODgwNjg5MUEsIDB4ODgwNzg5MzUsIDB4QTA0Qzg5M0IsCisweEQ1NDYwMDA5LCAweDY2NTJENzQ2LCAweDI3NjJENDQ2LCAweDYyMkM2MjYxLAorMHgyNDIxQTAzOCwgMHgyMjI4NjI1QywgMHhENDQzOEIzRiwgMHg2NjQyRDU0MCwKKzB4MjU2MkQ0NDAsIDB4MjQwMTg1NjEsIDB4NjIwM0EwMkMsIDB4MjAwODYwNUMsCisweDg4MTA4OTA3LCAweDg4MjA4OTA4LCAweDg4MzA4OTA5LCAweEEwMkM4OTBBLAorMHhEMjNBMDAwOSwgMHg2MjIyQTAwOCwgMHhBMDA1RDIzOSwgMHhEMjM5NjIyMiwKKzB4NjIyMkEwMDIsIDB4NjI2MkQ2MzgsIDB4RDQzMkQ1MzEsIDB4NjYyMTI1MjIsCisweEEwMEY2MjZDLCAweEQ2MzUyNDIxLCAweDYyNjFENTJELCAweDYyMkNENDJELAorMHhBMDA3MjU2MiwgMHhENjMyMjQyMSwgMHg4NTYxRDUyOSwgMHgyNTYyRDQyOSwKKzB4NjIwMzI0MDEsIDB4NjYyRDg1MTUsIDB4MzYxNzYxMEQsIDB4NjUwMzhGMDEsCisweEIwQ0IyNDUxLCAweEEwMDEwMDA5LCAweEUwMDBFMDAxLCAweDAwMEI0RjI2LAorMHhENjE5MDAwOSwgMHhENDI3RTEwMSwgMHg2NTQxMjYxMCwgMHhEMTE4RDcxNywKKzB4RTIwRjY1NUQsIDB4Mjc1MkUwMDEsIDB4MDAwQjI2MjAsIDB4MkZFNjIxMDIsCisweEQyMEY0RjIyLCAweDY0MEM4NTIzLCAweDhCMDgyNDQ4LCAweEQ1MTFENjFELAorMHgyNjIxRTIwMCwgMHg5NDBGODQ1MSwgMHhBMDQ4MjA0OSwgMHhERTBEODA1MSwKKzB4Qzg0MDYwRTAsIDB4RTIwMThEMzIsIDB4ODk0NDM0MjcsIDB4RDIxNkQ2MTUsCisweDI2NDE0MjBCLCAweDAwMDlBMDMwLCAweDAwMDBGRjdGLCAweDAwMjAzOUU1LAorMHgwMDIwMzk5QywgMHgwMDIwMzlBOCwgMHgwMDFFMTEwMCwgMHgwMDFFMTAwQywKKzB4MDAyMDM5QzgsIDB4MDAxRTEwMDAsIDB4MDAxRTEwMDEsIDB4MDAyMDM5RDAsCisweDAwMjAzOUIwLCAweDAwMjAzOUI0LCAweDAwMjAzOUI4LCAweDAwMjAzOUQ0LAorMHgwMDIwMzlEOCwgMHgwMDIwMzlEQywgMHgwMDIwMzlFMCwgMHgwMDIwM0UwNCwKKzB4MDAyMDNFMEUsIDB4MDAyMDM5QzIsIDB4MDAyMDI4ODYsIDB4ODkxMjM0MjcsCisweEQyOTRENjkzLCAweDI2NDE0MjBCLCAweENCODA4NEUxLCAweDgwRTFCMEY1LAorMHhENjkxNjBFMCwgMHgyRTAwQ0IwNCwgMHhDOTNGNjA2MCwgMHhENjhGMjYwMCwKKzB4QTAwMUUwMDEsIDB4RTAwMDI2MDIsIDB4MDAwQjRGMjYsIDB4RDY4QzZFRjYsCisweEM4ODA2MDYwLCAweEQyODY4OTE5LCAweDg4MDE2MDIxLCAweEQyODk4QjE1LAorMHg4NTI0RTUwMSwgMHg4OTEwMzA1NiwgMHhFMjAzRDE4NywgMHgyMTIwRDQ4NywKKzB4RTAwQjY1NDEsIDB4MDY1NjY1NUQsIDB4RTQwRkQ1ODUsIDB4MjE0MEU3MDIsCisweEQ3N0UyNTcxLCAweDAwMEJFMDAxLCAweDAwMEIyNzAyLCAweDJGRTZFMDAwLAorMHhERTgwNEYyMiwgMHhDODgwODRFMSwgMHhENTdBODkyQywgMHgyMDA4ODU1NCwKKzB4NjEwMzhGMjgsIDB4ODU1M0Q3N0MsIDB4NjQwMzY2NzIsIDB4ODU2NjY1MEMsCisweDM1MjA2MjBDLCAweEQ2Nzk4QjFFLCAweDY1MUNENzc0LCAweDI2NTE2NDRDLAorMHg2MEUwMjc0MSwgMHg4OTA0Qzg0MCwgMHg0MjBCRDI3NSwgMHhBMDAzMDAwOSwKKzB4RDI2ODAwMDksIDB4MDAwOTQyMEIsIDB4MDAwOUIwOUYsIDB4RTIwMUQxNjcsCisweDYwRTAyMTIyLCAweENCMDRENDY0LCAweDYwNDAyRTAwLCAweDI0MDBDOTNGLAorMHg2MDIzQTAwMSwgMHg0RjI2RTAwMCwgMHg2RUY2MDAwQiwgMHgyRkI2MkZBNiwKKzB4MkZENjJGQzYsIDB4REE2MjJGRTYsIDB4NjZBMUUyNDAsIDB4MzYyMkRDNUUsCisweDYyNjM4OTAwLCAweDZFRDM2RDJDLCAweDRFMjEzNkQ4LCAweDRFMjEyQTYxLAorMHhEQjYxRDQ2MCwgMHhFNzAwQTAwRiwgMHg3NzAxNjJCMiwgMHg3MTAyNjEyMywKKzB4NjYyMTJCMTIsIDB4NzEwMjYyMTMsIDB4NjEyMTJCMTIsIDB4NjUxRDY2NkQsCisweDM1NkM0NTI4LCAweDYyN0MyNDUyLCAweDhCRUQzMkUzLCAweEM5MDM2MEQzLAorMHg4QjEwODgwMywgMHg2MTczNjdCMiwgMHgyQjEyNzEwMiwgMHg3MTAyNkUxMywKKzB4MkIxMjY1NzEsIDB4NjU1RDZERTEsIDB4NDIyODYyREQsIDB4MzI1Q0UxMDcsCisweEEwMEMyQzEwLCAweDg4MDIyNDIyLCAweEEwMDM4QjAxLCAweDg4MDFFMjAzLAorMHhFMjAxOEIwNSwgMHg2NkIyMkMyMCwgMHg2NTVENjU2MSwgMHhFNjBGMjQ1MiwKKzB4NjdBMTJDNjAsIDB4OEIwNTI3NzgsIDB4REQzOERDNDQsIDB4RUIwMUVBMDAsCisweDJEQjIyQ0EyLCAweDZERjY2RUY2LCAweDZCRjY2Q0Y2LCAweDZBRjYwMDBCLAorMHgyRkU2MkZENiwgMHhFMjQwREQzNiwgMHgzNjIyNjZEMSwgMHg2MjYzODkwMCwKKzB4MzY3ODY3MkMsIDB4NzcwM0RFMzgsIDB4NDcyMTJENjEsIDB4NjRFMkQ2MzUsCisweEEwMEU0NzIxLCAweDY1NjJFMTAwLCAweDYyNTM3MTAxLCAweDc0MDEyNDUwLAorMHgyNDIwNDIxOSwgMHg0NTI5NzQwMSwgMHg3NDAxMjQ1MCwgMHgyNDUwNDUxOSwKKzB4NjIxQzc0MDEsIDB4OEJFRTMyNzMsIDB4NjZFMjQyMDAsIDB4NDIwMDYxRDEsCisweDIxMTgzNjJDLCAweDJFNjI4RjA2LCAweEREMUNENzI4LCAweEU1MDFFNDAwLAorMHgyRDUyMjc0MiwgMHgwMDBCNkVGNiwgMHgyRkQ2NkRGNiwgMHg0RjIyMkZFNiwKKzB4RUQwQUVFMDEsIDB4NjRFM0JDODUsIDB4QkM4QTY0RTMsIDB4NjJFQzdFMDEsCisweDhCRjczMkQ3LCAweEJDOERFRTAxLCAweDY0RTM2NEUzLCAweDdFMDFCQzkyLAorMHgzMkQ3NjJFQywgMHg0RjI2OEJGNywgMHgwMDBCNkVGNiwgMHhEMTE4NkRGNiwKKzB4RDQxODkyMEQsIDB4NzIxMjIxMjIsIDB4MjQyMkQ2MTcsIDB4RDcxNzcyMDQsCisweDcyMjAyNjIyLCAweDI3MjJEMTE2LCAweDAwMEI3MjMwLCAweDEzN0EyMTIyLAorMHgwMDIwMzlDMiwgMHgwMDIwMjk5MiwgMHgwMDFFMTAxNSwgMHgwMDIwMzlDOCwKKzB4MDAxRTEwMDEsIDB4MDAyMDM5OUMsIDB4MDAxRTExMDAsIDB4MDAyMDM5QzYsCisweDAwMjAzOUI0LCAweDAwMUUxMDAwLCAweDAwMjAzOUI4LCAweDAwMjAzOUM0LAorMHgwMDIwMjg4NiwgMHgwMDFFMTAwQywgMHgwMDIwMzlCMCwgMHgwMDIwMzlDQywKKzB4MDAyMDM5RDAsIDB4MDAyMDM5RDQsIDB4MDAyMDM5RDgsIDB4MDAyMDM5REMsCisweDAwMjAzOUUwLCAweDRGMjIyRkU2LCAweEQ2NzA3RkZDLCAweDg4MDE2MDYwLAorMHhFMjAxODk1MSwgMHgyNjIwQkZCQiwgMHhENTZFRDE2RCwgMHhERTZFNjAxMCwKKzB4NjRFMzY1NTIsIDB4NzQwMkM4NDAsIDB4OEQyMkQxNkMsIDB4RDI2Qzc1MDIsCisweEU2MDFENzZDLCAweEU3MDQyNzIyLCAweDc2MDE2MjU1LCAweDYyNkMyNDIxLAorMHg4RkY5MzI3MywgMHhENDYzNzQwMiwgMHg2MjQyRTYwMSwgMHg2NDBEODUyOCwKKzB4Njc0OTQ0MTksIDB4Mjc1RDY1N0UsIDB4ODFFNDYwN0MsIDB4RTQxN0Q1NjIsCisweDY3NTU3NjAxLCAweDMyNDM2MjZDLCAweDhGRjkyMTcxLCAweEEwMjA3MTAyLAorMHhEMjVFMDAwOSwgMHhFNjAxRDc1QiwgMHhFNzA0MjcyMiwgMHg3NjAxNjI1NSwKKzB4NjI2QzI0MjEsIDB4OEZGOTMyNzMsIDB4RDQ1Mjc0MDIsIDB4NjI0MkU2MDEsCisweDY0MEQ4NTI4LCAweDY3NDk0NDE5LCAweDI3NUQ2NTdFLCAweDgxRTQ2MDdDLAorMHhFNDE3RDU1MywgMHg2NzU1NzYwMSwgMHgzMjQzNjI2QywgMHg4RkY5MjE3MSwKKzB4OTI4OTcxMDIsIDB4RDI0NjJFMjEsIDB4NUUyM0Q3NEUsIDB4NjRGMjJGRTIsCisweDYwNDM2NUYyLCAweDI3MDBDOTgwLCAweEM5NjA2MDQzLCAweDgwNzE2MTAzLAorMHhDOTAzNjA0MywgMHg4MDcyNDUxOSwgMHg2NUYyNjA1QywgMHg4MTcyNjZGMiwKKzB4NDYxOTQ2MjksIDB4NjA2QzQ1MjksIDB4NDAxODY0NUMsIDB4ODE3MzMwNEMsCisweDIxMTg1RTIzLCAweDY0RjIyRkUyLCAweDZFNEM2MkYyLCAweDYwMkM0MjE5LAorMHg2NkYyNjJGMiwgMHg0NjI5NDAxOCwgMHg0NjE5MzBFQywgMHg0MjI5ODE3NCwKKzB4NjUyQzYwNkMsIDB4MzA1QzQwMTgsIDB4ODE3NThGMDcsIDB4MDAwOUJDOTYsCisweDIyMjg2MjBDLCAweEEwMEE4OTA4LCAweDYwMTMwMDA5LCAweDhCMDM4ODQwLAorMHgwMDA5QjAwOSwgMHgwMDA5QTAwMywgMHhFMjAyRDYyRiwgMHg3RjA0MjYyMiwKKzB4MDAwQjRGMjYsIDB4NEYyMjZFRjYsIDB4ODU1MkQ1MkEsIDB4ODgzMDYwMEQsCisweDg4MzE4OTAzLCAweEEwMzQ4OTIzLCAweDg1NTUwMDA5LCAweEQ0MjhENzI3LAorMHg4NTUzMjcwMSwgMHg2MTBERDYyNywgMHgyNDEyNDExOCwgMHg0NjBCRDQyNiwKKzB4RDcyMzAwMDksIDB4RDIyNkQ0MjUsIDB4NjU3MjQyMEIsIDB4RTIzMEQxMjAsCisweDQyMjg2NzEyLCAweDI3MjlFNjIwLCAweDM3NjA0NjI4LCAweEQ2MjE4QjAzLAorMHhBMDE2RTIwMCwgMHhENjFGMjYyMiwgMHhBMDEyRTIwMiwgMHhEMTE4MjYyMiwKKzB4NjIxMkU1MzAsIDB4RTYyMDQ1MjgsIDB4NDYyODIyNTksIDB4ODkwODMyNjAsCisweEQ0MUFEMTE5LCAweEU2MDFENTEzLCAweDIxNjA0NTBCLCAweDQ3MkJENzE4LAorMHg0RjI2NEYyNiwgMHgwMDA5MDAwQiwgMHgwMDAwMDYwQSwgMHgwMDIwMzlFNCwKKzB4MDAxRTEwMDAsIDB4MDAyMDM5RDAsIDB4MDAyMDNFMDQsIDB4MDAyMDNFMTAsCisweDAwMjAzREE4LCAweDAwMjAzOUI4LCAweDAwMjAzREQ4LCAweDAwMjAzREQ2LAorMHgwMDIwM0RBQSwgMHgwMDIwMzk5QywgMHgwMDIwMzlDOCwgMHgwMDIwMzlCNCwKKzB4MDAyMDM5QjAsIDB4MDAyMDE4QTIsIDB4MDAyMDNCMjQsIDB4MDAyMDNCMjgsCisweDAwMjAxOEVFLCAweDAwMjAzOUNDLCAweDAwMUUxMDBCLCAweDAwMjAzQjNDLAorMHgwMDExNDAwNCwgMHg0RjIyMkZFNiwgMHhERTk2N0ZGQywgMHgyMDA4ODRFOSwKKzB4MkYwMDhEMDYsIDB4RDY5NUQ0OTQsIDB4MDAwOTQ2MEIsIDB4NjRGMEIxOUEsCisweDY2MjBEMjkzLCAweDg5MDIyNjY4LCAweEM5QkY2MEUwLCAweDdGMDQyRTAwLAorMHgwMDBCNEYyNiwgMHgwMDBCNkVGNiwgMHgyRkU2MDAwOSwgMHhERThENEYyMiwKKzB4NjBFMEQ2OEQsIDB4Q0JDMEQ0OEQsIDB4NjI2MDJFMDAsIDB4QzgwMzYwMkMsCisweDQwMjE4OTA0LCAweDcwMDE0MDIxLCAweDY2MDNBMDAyLCAweDY2MDM0MDA5LAorMHhENjg3NjE2RCwgMHhFNTAwQTAwNCwgMHg3NTAxNjI2MiwgMHg3NDA0MjQyMiwKKzB4MzIxMzYyNUQsIDB4RDI4MzhCRjgsIDB4MDAwOTQyMEIsIDB4QzlCRjg0RTIsCisweDRGMjY4MEUyLCAweDZFRjYwMDBCLCAweDJGRTYyRkQ2LCAweDdGRkM0RjIyLAorMHg2MjYwRDY3RCwgMHg4OTQ0MjIyOCwgMHhENTcyRTEwMCwgMHg2MDUwMjYxMCwKKzB4Q0I0MEQ0N0EsIDB4MjUwMDQ0MEIsIDB4OEQwNTIwMDgsIDB4NjJFMDZFMDMsCisweDcxMDQ2MTJDLCAweDJGMTFBMDA2LCAweEQ0NzVENjZELCAweERENzU2NzYwLAorMHg2NTdDNEQwQiwgMHhFMjNDNkQxRCwgMHg4QjAzM0QyNywgMHhEMjY3RDQ3MiwKKzB4MDAwOTQyMEIsIDB4NEQyMTREMjEsIDB4QTAwNUQ3NzAsIDB4NjZFNkU0MDAsCisweDM1N0M0NTA4LCAweDc0MDEyNTYyLCAweDM1RDM2NTRELCAweEQ3NkM4QkY3LAorMHg2MTcyRTAwMywgMHg4MTExNDAxOCwgMHg2RTcyNjBGMSwgMHg4MUUyNzAwQywKKzB4RDQ2ODYxNzIsIDB4REQ2ODgxMTMsIDB4NEQwQkRFNjgsIDB4RTIwMTY1NzIsCisweEQ0NjcyRTIyLCAweDQyMEJEMjU1LCAweEQ2NTYwMDA5LCAweEM5M0Y2MDYwLAorMHg3RjA0MjYwMCwgMHg2RUY2NEYyNiwgMHg2REY2MDAwQiwgMHgyRkM2MkZCNiwKKzB4MkZFNjJGRDYsIDB4RDI1RjRGMjIsIDB4NkI0MzZFNzMsIDB4NDIwQjZDNTMsCisweDIwMDg2RDYzLCAweDY0MDM4RDFDLCAweEU1MEVEMTQ5LCAweDMyNTI2MjEwLAorMHg2MEMzODkxNiwgMHg4MDQxMjRCMCwgMHg4MTQxNjBEMywgMHhBMDA3RTUwMCwKKzB4NjU1RDYxQkMsIDB4MDBFQzYwNTMsIDB4MzY0QzY2NTMsIDB4ODA2NDc1MDEsCisweDMyMTM2MjVELCAweEQ2M0I4QkY1LCAweEM5QkY2MDYwLCAweDI2MDBBMDA4LAorMHhEMjNBRDQ0RCwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwgMHg2QkY2NDIyQiwKKzB4NkVGNjRGMjYsIDB4NkNGNjZERjYsIDB4NkJGNjAwMEIsIDB4N0ZDNDRGMjIsCisweDcyMDI2MkYzLCAweDIyNTEyRjQxLCAweDQ1Mjk3MjAyLCAweDYwNjMyMjUxLAorMHhFNUM0RTY4MiwgMHg2N0YzODEyMSwgMHg2NTVDNjY2QywgMHhFNDA4QkZCNiwKKzB4NEYyNjdGM0MsIDB4MDAwOTAwMEIsIDB4MkY5NjJGODYsIDB4MkZCNjJGQTYsCisweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweEUxMDA3RkM0LCAweDY1MTNFQ0ZGLAorMHg2QjEzNkNDRCwgMHhERTM2RDczNSwgMHhFREZGNjRGMywgMHhEODM1RUEwNCwKKzB4NjA1MzY1NUMsIDB4MDI3RDQwMDAsIDB4MzJDMDYyMkQsIDB4NjYwMzhEMEQsCisweDA5RUQ2MDYzLCAweDI0OTEwMjdELCAweDI0MjE3NDAyLCAweDY5ODIwMkVELAorMHgzOTI4NjIyRCwgMHg3NDAyMjg5MiwgMHg3NTAxNzEwNCwgMHg2MDYzNjI1QywKKzB4MDdENTMyQTIsIDB4MEVCNThGRTQsIDB4MjQ0ODY0MUMsIDB4RTY4MDg5MDUsCisweDY3RjNFNUM1LCAweEJGNzk2NjZDLCAweDdGM0M2NTVDLCAweDZFRjY0RjI2LAorMHg2Q0Y2NkRGNiwgMHg2QUY2NkJGNiwgMHgwMDBCNjlGNiwgMHhEMTFFNjhGNiwKKzB4NjAxMkQyMUUsIDB4Q0IyMEU0MDUsIDB4MjEwMkU1MDAsIDB4MDAwQjIyNDIsCisweDAwMDAyMjUyLCAweDAwMUUxMDE3LCAweDAwMjAzQjQwLCAweDAwMjAxOEEyLAorMHgwMDIwMzkwRSwgMHgwMDFFMTAxNSwgMHgwMDFFMTBCRiwgMHgwMDExNzgwMCwKKzB4MDAxRTEwRkMsIDB4MDAyMDA2MTAsIDB4MDAyMDM5MTQsIDB4MDAyMDJBRUEsCisweDAwMjAzQjQ0LCAweDAwMjAxOEVFLCAweDAwMjAzQjYwLCAweDAwMTE3ODhDLAorMHgwMDIwMzkxMCwgMHgwMDIwMzRGNCwgMHgwMDIwMTUzMCwgMHgwMDFFMjEzMCwKKzB4MDAyMDNCNjgsIDB4MDAyMDJBQUMsIDB4MDAyMDNCNkMsIDB4MDAyMDM5NzQsCisweDAwMjAzOTdDLCAweDAwMjAzREE0LCAweDAwMUMzNTAwLCAweDAwMUQ0MDA0LAorMHhENTY0RDE2MywgMHhFNDAwRDc2NCwgMHgyMTQyRTIwRiwgMHgxNzQxMTE1NCwKKzB4RDU2MjI3MjIsIDB4OTY2OUQ3NjIsIDB4MTU0MTI1NzIsIDB4OTY2NjE1NjIsCisweEU2MDExNTY1LCAweEQ1NUYxMTY1LCAweDY2NkNFNkY4LCAweDI1NDIyNTQyLAorMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwgMHgyNTYyMjU0MiwgMHg3NjAxRTcyNywKKzB4Njc2MzI1NzIsIDB4MjU2Mjc3OTcsIDB4RTcwNDI1NzIsIDB4MjU3MkUyNDgsCisweEUyMTkyNTIyLCAweEUyNzAyNTIyLCAweDI1NDIyNTQyLCAweDI1NDIyNTQyLAorMHgyNTIyMjU0MiwgMHgyNTIyRTIwQywgMHgyNTQyMjU0MiwgMHgyNTQyMjU0MiwKKzB4MjU0MjI1NDIsIDB4MjU0MjI1NDIsIDB4MDAwQjE1NEEsIDB4RTIwODExNDUsCisweDAwMDk0MjJCLCAweDJGRTYyRkQ2LCAweDdGRkM0RjIyLCAweEM4MjA2MDQzLAorMHg2RTQzOEQwMiwgMHgwMDA5QkU2NywgMHhDODEwNjBFMywgMHhCRTY0ODkwMSwKKzB4NjBFMzAwMDksIDB4ODkwMUM4NDAsIDB4MDAwOUJFODYsIDB4QzgwMTYwRTMsCisweEREM0Q4OTM4LCAweEM4MDI2MEQwLCAweDJGMDA4RDAzLCAweDQ2MEJENjNCLAorMHg2MEYwMDAwOSwgMHg4OTAyQzgwNCwgMHg0NjBCRDYzOSwgMHg2MkYwMDAwOSwKKzB4Qzg4MDYwMjMsIDB4NjBEMDg5MDIsIDB4MkQwMEM5N0YsIDB4QzgwMTYwMjMsCisweEQ2MzQ4OTA2LCAweDAwMDk0NjBCLCAweDAwMDlBMDA3LCAweDUxNjMwNjAxLAorMHg4OTAyQzgwOCwgMHg0NjBCRDYzMCwgMHg2MEYwMDAwOSwgMHg4OTAyQzgxMCwKKzB4NDIwQkQyMkUsIDB4RDUyRTAwMDksIDB4ODgwMjYwNTIsIDB4RDIyRDhCMDMsCisweEEwMDVFNjA0LCAweDg4MDEyMjYwLCAweEQyMkE4QjAyLCAweDIyNjBFNjAxLAorMHgyNTIyRTIwMCwgMHhDODgwNjBFMywgMHhEMjI3ODkyRCwgMHg2MEUzNkUyMCwKKzB4ODkwMkM4ODAsIDB4NDIwQkQyMjUsIDB4NjBFMzAwMDksIDB4ODkwMkM4NDAsCisweDQyMEJEMjIzLCAweDYwRTMwMDA5LCAweDg5MDJDODAyLCAweDQyMEJEMjIxLAorMHg2MEUzMDAwOSwgMHg4OTBEQzgwNCwgMHhERDIwRDExRiwgMHgwMDA5NDEwQiwKKzB4MDAwOUJGMEQsIDB4MDAwOUJGNEMsIDB4RDUxRUQ0MUQsIDB4MjQ3MEU3MDgsCisweDI1RDJCRjg1LCAweEM4MDg2MEUzLCAweEQyMUI4OTA1LCAweDRGMjY3RjA0LAorMHg0MjJCNkVGNiwgMHg3RjA0NkRGNiwgMHg2RUY2NEYyNiwgMHg2REY2MDAwQiwKKzB4MDAxQzU4MUMsIDB4QTAwMEEwMDAsIDB4MDAxRDAxMDAsIDB4MDAxRDQwMDAsCisweDAwMDQwMDIxLCAweDAwMUM1ODlDLCAweDAwMUUxMDIxLCAweDAwMjAxQTkwLAorMHgwMDIwMUFCMiwgMHgwMDIwMjExNCwgMHgwMDIwMUFDQSwgMHgwMDIwMUFEOCwKKzB4MDAyMDM5QzgsIDB4MDAxRTEwMEIsIDB4MDAxRTEwMjgsIDB4MDAyMDFCNDQsCisweDAwMjAxQjUwLCAweDAwMjAxQUUwLCAweDAwMjAxQUZFLCAweDEyMzQ1Njc4LAorMHgwMDFFMTAwMCwgMHgwMDEwRjEwMCwgMHgwMDIwMUIyQywgMHg2NDRDRDZBNywKKzB4MDAwQjM0NkMsIDB4RDZBNjI0NTAsIDB4MzQ2QzY0NEMsIDB4MjQ1MDAwMEIsCisweDY0NENENkE0LCAweDAwMEIzNDZDLCAweDYyNUMyNDUwLCAweDQyMDg2MTZELAorMHg0MjA4NDExOSwgMHg0MjAwNjAxOSwgMHg2NzBFNjE0QywgMHhENDlFMzIxQywKKzB4NDIwMDIwN0QsIDB4MzI0Q0M5MEYsIDB4MjIwMDAwMEIsIDB4NDIwODYyNUMsCisweDQyMDA0MjA4LCAweDMyNEM2NDRDLCAweDQyMDBENDk4LCAweDAwMEIzMjRDLAorMHgyRkU2MjI2MCwgMHg2MTRDNEYxMiwgMHg0MTAwRDQ5MywgMHg2NzEwMzE0QywKKzB4RTI5RjY2NkQsIDB4MjcyOTQ2MTksIDB4NkU1MzYyNjksIDB4NjcyRTY1NzMsCisweDQyMjEyMjdELCAweDQyMjE0MjIxLCAweDc2MDE2NjJDLCAweEU0MDE0NjA4LAorMHgzNEU4NDYwOCwgMHg2NDRDNDYwMCwgMHgwNzFBMDQ2NywgMHgyMTUwMjU3QiwKKzB4MDAwQjRGMTYsIDB4NEYyMjZFRjYsIDB4RDI4NTdGRTgsIDB4ODgwMTYwMjEsCisweEQyODQ4QjdCLCAweDI2Njg2NjIxLCAweEQyODM4Qjc3LCAweDI2Njg2NjIxLAorMHhFNTBGOEI3MywgMHhFNDAxQkZBMiwgMHhCRkE0RTUwMSwgMHhFNTg2RTQwMCwKKzB4RTQwMDY1NUMsIDB4MkY1MEJGQTQsIDB4QkZBMUU0MDEsIDB4RTYwMkU1MDYsCisweDYwNjM0NjE4LCAweDgxRjJFNDAxLCAweDY1NDNCRjlGLCAweEU0MDE4NUYyLAorMHhCRkFCNjU0MywgMHg4NUYyNjYwMywgMHg2NTQzRTQwMSwgMHg2NjAzQkZCMSwKKzB4RTQwMjY1RjAsIDB4NjA1Mzc1NkMsIDB4ODBGOEJGODAsIDB4QkY4MkU0MDIsCisweDg0RjhFNTEyLCAweDcwOTBFNDAyLCAweDY1MDNCRjgyLCAweDQ2MThFNjAyLAorMHg4MUY2NjA2MywgMHhCRjgwRTQwMiwgMHg4NUY2RTUwMCwgMHg2NjAzRTQwMiwKKzB4RTUwMEJGOEMsIDB4RTQwMjg1RjYsIDB4QkY5MjY2MDMsIDB4RTVGRUU1MDAsCisweEUwMTA2NTVDLCAweEJGNjFFNDAzLCAweEU1MTMwRjU0LCAweEU0MEVCRjYzLAorMHgwNUZDRTAxMCwgMHhCRjYzRTQwRSwgMHhFNTAwNzU4NSwgMHhCRjY0RTQwMywKKzB4RTUwMEU2NDAsIDB4QkY3MUU0MDMsIDB4RTUwMEU2NDAsIDB4QkY3OEU0MDMsCisweEU1RkZFNjQwLCAweEUwMTQ2NTVDLCAweEJGNDdFNDA0LCAweEU0MEYwRjU0LAorMHhFNTA0QkY0OSwgMHgwNUZDRTAxNCwgMHhCRjQ5RTQwRiwgMHhFNTAxNzU4NCwKKzB4QkY0QUU2NDAsIDB4RTUwMUU0MDQsIDB4QkY1N0U2NDAsIDB4RTUwMUU0MDQsCisweEU0MDRFNjQwLCAweEFGNUM3RjE4LCAweDdGMTg0RjI2LCAweDAwMEI0RjI2LAorMHg0RjIyMDAwOSwgMHhEMjQyN0ZGMCwgMHg4ODAxNjAyMSwgMHhEMjQxOEI3MSwKKzB4MjY2ODY2MjEsIDB4RDI0MDhCNkQsIDB4MjY2ODY2MjEsIDB4RTUwRjhCNjksCisweEU0MDFCRjFDLCAweEJGMUVFNTAxLCAweEU1ODZFNDAwLCAweEU0MDA2NTVDLAorMHgyRjUwQkYxRSwgMHhCRjFCRTQwMSwgMHhFNDAxRTUwNiwgMHhCRjFDNjU0MywKKzB4RTQwMUU2NDAsIDB4QkYyOTY1NDMsIDB4RTQwMUU2NDAsIDB4QkYzMDY1NDMsCisweDY1RjBFNjQwLCAweDc1NkNFNDAyLCAweEJFRkY2MDUzLCAweEU0MDI4MEY0LAorMHhFNTEyQkYwMSwgMHhFNDAyODRGNCwgMHhCRjAxNzA5MCwgMHhFNjQwNjUwMywKKzB4QkYwMkU0MDIsIDB4RTY0MEU1MDAsIDB4QkYwRkU0MDIsIDB4RTY0MEU1MDAsCisweEJGMTZFNDAyLCAweEU1RkVFNTAwLCAweDYwNTM2NTVDLCAweEJFRTVFNDAzLAorMHhFNTEzODBGOCwgMHhFNDBFQkVFNywgMHhFNDBFODRGOCwgMHhCRUU3NzA4NSwKKzB4RTUwMDY1MDMsIDB4QkVFOEU2NDAsIDB4RTUwMEU0MDMsIDB4QkVGNUU2NDAsCisweEU1MDBFNDAzLCAweEJFRkNFNjQwLCAweEU1RkZFNDAzLCAweDYwNTM2NTVDLAorMHhCRUNCRTQwNCwgMHhFNDBGODBGQywgMHhFNTA0QkVDRCwgMHhFNDBGODRGQywKKzB4QkVDRDcwODMsIDB4RTUwMTY1MDMsIDB4QkVDRUU2NDAsIDB4RTUwMUU0MDQsCisweEJFREJFNjQwLCAweEU1MDFFNDA0LCAweEU0MDRFNjQwLCAweEFFRTA3RjEwLAorMHg3RjEwNEYyNiwgMHgwMDBCNEYyNiwgMHgwMDAwMDAwOSwgMHgwMDFFMTAyRiwKKzB4MDAxRTEwODAsIDB4MDAxRTEwOTAsIDB4MDAxRTEwM0YsIDB4MDAxRTEwM0UsCisweDAwMjAzOUMyLCAweDAwMjAzOUM0LCAweDAwMjAzOUM2LCAweEQyMUREMTFDLAorMHg2NjIwNjAxMCwgMHg2NzZDNzAwMSwgMHgzNzAwQzkwRiwgMHhFNTAwOEQxMywKKzB4NjcxMDYyMTAsIDB4NzcwMTYyMkMsIDB4NjQyMzIxNzAsIDB4RDYxNjYwMTAsCisweDQ0MDg0NDA4LCAweDM0MjhDOTBGLCAweDYyNjAyMTAwLCAweDcyMDFENTEzLAorMHg0NDA4MjYyMCwgMHgwMDBCMzU0QywgMHhEMTBGNjA1MywgMHgyNTU4NjUxMCwKKzB4RTYwMDhEMTMsIDB4RDYwREQ0MEIsIDB4NjU1QzY1NDAsIDB4NDcwODY3NTMsCisweDM3NTg0NzA4LCAweDQ3MDg2NTQwLCAweDI0NTA3NTAxLCAweDM2N0M2MDQwLAorMHgyNDAwQzkwRiwgMHg3MkZGNjIxMCwgMHgwMDBCMjEyMCwgMHgwMDAwNjA2MywKKzB4MDAyMDM5MEQsIDB4MDAyMDM5MEMsIDB4MDAyMDM5MEUsIDB4MDAyMDM1MzQsCisweDdGRkM0RjIyLCAweEU2ODBEMTlGLCAweDY2NkM2MjEyLCAweEQyOUUyRjIyLAorMHg2N0YzNjU2MywgMHg0MjBCNzU0MiwgMHg3RjA0RTQwNCwgMHgwMDBCNEYyNiwKKzB4RTY4MDAwMDksIDB4RDI5ODY2NkMsIDB4RTcwMDY1NjMsIDB4NDIyQjc1NDAsCisweEU2ODA2NDczLCAweEQyOTQ2NjZDLCAweEU3MDA2NTYzLCAweDQyMkI3NTQzLAorMHgyRjg2NjQ3MywgMHgyRkE2MkY5NiwgMHgyRkM2MkZCNiwgMHgyRkU2MkZENiwKKzB4N0ZDQzRGMjIsIDB4REM4RUQyOEQsIDB4NzIwMTFGMjEsIDB4REI4RDFGMjIsCisweEQxOEVERThELCAweDY2MTI1MjExLCAweDhCMDEzNjIwLCAweDAwMDlBMEU1LAorMHhDOTAzNjA2MSwgMHg4QjAxODgwMSwgMHgwMDA5QTBERiwgMHhEMjg4RDQ4NywKKzB4RUQ4NDQyMEIsIDB4MkYwMjU1MDMsIDB4MzBEMDg0NUMsIDB4QTBCODg5MDEsCisweEQxODQwMDA5LCAweDYyNkM2NjEwLCAweDg4MDE2MDIzLCAweEQxODI4QjY4LAorMHg2MjEwMUZDMywgMHg4OTVCMjIyOCwgMHhFMDAzRDQ4MCwgMHg0MDE4Njc0MiwKKzB4Njg0MjE3NzIsIDB4RDU3RUU5MDAsIDB4ODE4MTZEQjMsIDB4N0QwNDIxOTAsCisweDY3RDI2QUIyLCAweDY0RTI2ODUyLCAweDFGNDkxRjU3LCAweDc0MDQ2NEUzLAorMHgxRkE0NjU0MiwgMHg2NTQzMUY1QSwgMHg2MjUyNzVGOCwgMHgxRjc2MUZENSwKKzB4NkQ1MzFGMkIsIDB4REE3NEQ3NzMsIDB4N0Q5NEQyNzQsIDB4NjhEMjFGODgsCisweDZBQTI2OTcyLCAweEQxNzI2MDIyLCAweDIyMDJDQjIwLCAweEUxNDAxRjFDLAorMHg3NjAxRTYwMCwgMHgzMjEzNjI2RCwgMHg1NkY0OEJGQiwgMHg1MkY2NTFGNSwKKzB4MjEyMjJCNjIsIDB4NTJGODUxRjcsIDB4MjEyMjU2RjksIDB4MkU2MjUxRkEsCisweDUxRkIyNDEyLCAweDJEODIyNTEyLCAweEQ5NjYyNzkyLCAweDI5QTJERDVGLAorMHg2QUQyRDk2NSwgMHhEOTY0Njg5MiwgMHg2OEQyMUE4NCwgMHg2MDgxREE2MywKKzB4MjgwMUNCMDEsIDB4RDg2MjY2RDIsIDB4MkE2MjI5NjIsIDB4RUQwMTVBRkMsCisweDJBRDI0ODBCLCAweDJBRDI0RDE4LCAweDYyRDJERDVFLCAweDJEMjI3MjAxLAorMHhEMTUwNTZGMywgMHhFMjAyNjA2MiwgMHgyNjAyQ0IwMSwgMHgyMTIwQTAzRCwKKzB4OEIzQTIyMjgsIDB4RTQwMURENTgsIDB4MjE0MEU2MDAsIDB4RTAxQzJENjIsCisweEM4MDEwMDVDLCAweEQ0NTU4QjBBLCAweEU2MDBENzU1LCAweEVEN0QyNDcyLAorMHg2MjZDNzYwMSwgMHg4QkZCMzJEMywgMHgyNEQyREQ1MiwgMHhFMkZFNjhDMiwKKzB4MkM4MjI4MjksIDB4MDk1Q0UwMUUsIDB4RTAxRjVERjEsIDB4MEE1QzJEOTAsCisweDc1MTA1MUYyLCAweEVEMDYyMUEwLCAweEQ3NEJFNjAwLCAweDg0NTZENDRCLAorMHgyNzAwNzYwMSwgMHg2OTZDNjg1NCwgMHgyNDgwMzlEMywgMHg4RkY2NzQwMSwKKzB4REE0Nzc3MDEsIDB4MkExMEUxOTQsIDB4RTIwMDdBMDEsIDB4N0EwRjJBMjAsCisweEQxMzBFODA1LCAweDY2MTAyQTgwLCAweDYwMjM2MjZDLCAweDg5MDg4ODAxLAorMHhEMjQwRDQyQSwgMHg0MjBCNjVGMiwgMHhEMTMxRUQwMSwgMHhBRjMwNEQxOCwKKzB4NjVGMjIxRDIsIDB4ODU1M0Q0M0MsIDB4NjIwRDY2NDIsIDB4ODkwNzMyNjIsCisweEQxM0JENDNBLCAweDAwMDk0MTBCLCAweEU2MDFENzNBLCAweDI3NjJBRjFBLAorMHhEMTM0RDQxRSwgMHg0MTBCNjVGMiwgMHhEMTI1RUQwMSwgMHhENjM3RDQzNiwKKzB4NDYwQjREMTgsIDB4QUYwRDIxRDIsIDB4N0YzNDAwMDksIDB4NkVGNjRGMjYsCisweDZDRjY2REY2LCAweDZBRjY2QkY2LCAweDAwMEI2OUY2LCAweDRGMjI2OEY2LAorMHg4NTQ2N0ZGNCwgMHgyRjAxRTY4MSwgMHg2NjZDODU0NywgMHg4NTQ4ODFGMSwKKzB4ODFGMkQyMDksIDB4NjdGMzg1NDIsIDB4ODU0MzgxRjMsIDB4ODFGNEU0MEMsCisweDY1NjM2MDUzLCAweDQyMEI4MUY1LCAweDdGMEM3NTQwLCAweDAwMEI0RjI2LAorMHgwMDAwMDAwOSwgMHgwMDFDM0Q5QywgMHgwMDIwMjQ1QywgMHgwMDExNzc5QSwKKzB4MDAxQzM2RjgsIDB4MDAxQzNCOUMsIDB4MDAxQzM3MDQsIDB4MDAyMDM1MkMsCisweDAwMjAxNEEwLCAweDAwMjAzOTFELCAweDAwMjAzOTFDLCAweDAwMjAzOTE4LAorMHgwMDFDM0Q5OCwgMHgwMDFDM0JCNCwgMHgwMDFDNTk2MCwgMHgwMDFDMzUwMCwKKzB4MDAxQzNEMzAsIDB4MDAxQzg5NjAsIDB4MDAyMDM1MDQsIDB4MDAxQzNEMDAsCisweDAwMjAxNjBDLCAweDAwMTE3NzMwLCAweDAwMjAzOTIwLCAweDAwMUM1ODJDLAorMHgyMDAwQTAwMCwgMHgwMDAwQTAwMCwgMHgwMDExNzc4QywgMHgwMDExNzc5MiwKKzB4MDAxMTc3ODgsIDB4MDAyMDE0Q0MsIDB4MDAyMDM4RjQsIDB4MDAyMDM0RjQsCisweDAwMjAxNTMwLCAweDAwMUUyMTMwLCAweDAwMjAzRDg0LCAweDAwMjAxOEEyLAorMHgyRjk2MkY4NiwgMHgyRkI2MkZBNiwgMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwKKzB4RDE5QjdGRUMsIDB4MkYxMkUwMDAsIDB4NjEwM0Q0OUEsIDB4MUY0MjgxRjIsCisweEREOUFEQTk5LCAweEQ2OUE2ODEzLCAweEUwMDE0ODA4LCAweDQ2MEJERTk5LAorMHgzOEVDNDgwMCwgMHg2NUEyMUYwMywgMHgzNTIwNTJBMSwgMHhBMjNFOEIwMSwKKzB4NjA1MTAwMDksIDB4ODgwMUM5MDMsIDB4QTIzODhCMDEsIDB4NTI1MzAwMDksCisweDMyRTBERTkxLCAweEQ5OTE4QjEwLCAweDY0QTM0OTBCLCAweDRCMEJEQjkwLAorMHhERTkwNjQwMywgMHhENzkxRDY5MCwgMHhFQzAxRDU5MSwgMHgyRTAyRTEwMCwKKzB4MjcxMDI2QzAsIDB4MjUwMkFGREYsIDB4QzgwMTg1NTEsIDB4QTE1NzhCMDEsCisweDYyNTEwMDA5LCAweDQyMDA2MjJELCAweDVFNTMzNjZBLCAweDg1RTIyMjZELAorMHhDOTAzNjQyQywgMHg4NUUzNjYwMywgMHg2MDUzNjUwRCwgMHg0MDIxNDAyMSwKKzB4NDUwMEM5M0YsIDB4MzIyQTY3MDMsIDB4NjA1MzI1MkQsIDB4QzkwMUQxN0YsCisweDYwMTA2QzAzLCAweDg4MDFEOTdGLCAweERCN0Y4QjA1LCAweDIxMjBFMjAwLAorMHhDQjAxNjBCMiwgMHhEMTdEMkIwMiwgMHg4ODAxNjAxMSwgMHg2NUEyOEIwQSwKKzB4OEQwNDI0NDgsIDB4OUI5RTYyNTEsIDB4QTAwMzIyQjksIDB4OTE5QjI1MjEsCisweDI1MjEyMjFCLCAweDM3QjNFQjEwLCAweDI0NDg4OTVFLCAweEQ0NzM4QjA3LAorMHgyMjI4NjI0MSwgMHg2MDYzODkwMywgMHhBMDU3ODFGOCwgMHhENTcwNjQ3MywKKzB4NDYwODQ2MDgsIDB4ODVFMjYyNzMsIDB4NDYwMDZCNTAsIDB4MzYyQzQyMDAsCisweDJCQjhDOTEwLCAweDhGMUY2NDYzLCAweDI2Njg2NjAzLCAweEQyNjk4OTExLAorMHgwNjJENjA0MywgMHg0MTE5NjE2RCwgMHg2QjBFNjAxOSwgMHg4MUY4MjBCRCwKKzB4ODgwMTYwQzMsIDB4NjQ2QzhGMkMsIDB4ODgwRjYwNzMsIDB4QTAyNzhCMUIsCisweEQyNjEwMDA5LCAweDA1MkQ2MDQzLCAweDQxMTk2MTVELCAweDY3MEU2MDE5LAorMHg2NDVDMjA3RCwgMHg4MUY4QTAxQywgMHg4OTBGMjY2OCwgMHg2MDQzRDI1QiwKKzB4NkI1RDA1MkQsIDB4NjBCOTRCMTksIDB4MjAxRDYxMEUsIDB4NjBDMzgxRjgsCisweDhGMEQ4ODAxLCAweDY0NzM2NDVDLCAweEVDMDBBMDBBLCAweDYwNDNEMjU0LAorMHg2MjVEMDUyRCwgMHg2MDI5NDIxOSwgMHgyMDdENjcwRSwgMHg4MUY4NjQ1QywKKzB4ODgwMjg1RjgsIDB4ODVFMTg5MEEsIDB4OEQwN0M4MjAsIDB4RTZEQzYyMDMsCisweDYwMjMyMjY5LCAweDgxRTFBMDAyLCAweDY0NENFNEZGLCAweDYyMTBEMTQ5LAorMHg4OTAxMjIyOCwgMHg2NDRDRTRGRiwgMHg2NTRERUJGRiwgMHgzNUIwNkJCQywKKzB4REIzNjhCMkIsIDB4NjRBMzRCMEIsIDB4NDEwQkQxMzUsIDB4NTQwMzY0MDMsCisweDg1NDQ2RTAzLCAweEM5NDhEQjQwLCAweERDNDA4ODA4LCAweEJFQUU4QjAxLAorMHg2NEIzRTUwMiwgMHg2NUUzNEMwQiwgMHhEQjNERUMwMSwgMHhEMTNEMkRDMiwKKzB4NjIxMjYwQjIsIDB4NzIwMTcwMDEsIDB4MjEyMjg4MDUsIDB4MkIwMjhGMDgsCisweDY2NkNFNjgwLCAweDY1NjNEMjM4LCAweDc1NDlFNzAwLCAweDY0NzM0MjBCLAorMHhBMDMwRDQzNiwgMHg3RkZGMDAwOSwgMHg4NUUyODAwMCwgMHgyMEI5RUJGQywKKzB4NjEwMzgxRTIsIDB4OTQyQTg1RTMsIDB4NjIwMzIwNDksIDB4NDUwODg1RjgsCisweDgxRTIyMDFCLCAweEM5MDE2MEMzLCAweDQwMDg0MDE4LCAweDQwMDg0MDA4LAorMHg0MDAwMjI1QiwgMHg2MDIzMjIwQiwgMHg4NUU0ODFFMywgMHg0MTE4RTEwOCwKKzB4ODFFNDIwMUIsIDB4RTQwMjYyQTIsIDB4MjBCOTg1MjEsIDB4NjdBMjgxMjEsCisweENCMDE2MDcxLCAweDg1RjgyNzAxLCAweDg5MDMzMDQyLCAweEVDRTc4NUUyLAorMHg4MUUyMjBDOSwgMHg0OTBCRDQxRSwgMHhBMDNCMDAwOSwgMHg3RTAzMDAwOSwKKzB4MDAxQzNEMzAsIDB4MDAyMDNEOTAsIDB4MDAyMDM1MDQsIDB4MDAxRTIxMkMsCisweDAwMjAzM0U4LCAweDAwMUMzRDAwLCAweDAwMTE3NzgwLCAweDAwMjAxNEEwLAorMHgwMDIwMTY2QywgMHgwMDExNzcwQywgMHgwMDIwMzkxQywgMHgwMDIwMzkxRCwKKzB4MDAyMDM5MTgsIDB4MDAyMDE4QTIsIDB4MDAxQzM2RjgsIDB4MDAyMDM5OTAsCisweDAwMjAzREEwLCAweDAwMjAzQjg0LCAweDAwMjAzQzA0LCAweDAwMjAzQzg0LAorMHgwMDIwM0QwNCwgMHgwMDIwMzkwOCwgMHgwMDIwMzRGQywgMHgwMDIwMTRDQywKKzB4MDAyMDM5OTQsIDB4MDAyMDM5OTgsIDB4MDAyMDI0NUMsIDB4MDAyMDNEODgsCisweDAwMjAzRDhDLCAweDYwMjI2MkYyLCAweDQwMDk0MDE5LCAweEM5MEY0MDA5LAorMHg4QjBCODgwQSwgMHg2MEUyREU4QywgMHg0MDA5NDAxOSwgMHhDOTBGNDAwOSwKKzB4OEIwMzg4MDgsIDB4Q0IwMTYwQTIsIDB4MjgwMkEwMDYsIDB4NjVFMkRFODcsCisweDJFNTI3NTAxLCAweDI4NjI2NkEyLCAweDUyRjM2NkYyLCAweDI2MjJBRTgzLAorMHhEMjgzODU1MSwgMHhERTgzQzgwMiwgMHhBMDk1OEIwMSwgMHg0MjBCMDAwOSwKKzB4NEUwQjY0QTMsIDB4NUUwMzY0MDMsIDB4ODVFNDY1MDMsIDB4NDkxOEU5MDgsCisweEQ3N0QyMDlCLCAweEUwNEM4MUU0LCAweERDN0MwQjdFLCAweDdCMDFEOTdDLAorMHg2MUMyMDdCNiwgMHg3MTAxNjY5MCwgMHg4RDA2MjY2OCwgMHhENDc5MkMxMiwKKzB4NDIwQkQyNzksIDB4QTA3MEVCMDEsIDB4NjI1MTJEQjIsIDB4NEIxOEVCMEYsCisweDIyQjlFMTAyLCAweDMyMTA0MTE4LCAweDg1NTE4QjBGLCAweDIwMjlFMkZDLAorMHg2MDUxODE1MSwgMHhDQjAxNzJFMCwgMHg4NUUxMjUwMSwgMHgyMDI5OTRBMywKKzB4ODVFNDgxRTEsIDB4QTA1MjIwNDksIDB4Njc1MTgxRTQsIDB4NDcxOTY3N0QsCisweDY2N0U2Nzc5LCAweDc3MDEyNzZELCAweDY5MDM2MDdDLCAweDg4MDE0OTE4LAorMHgyNTkxOEYzRSwgMHg2QjEyRDE2MSwgMHgyMUIyN0IwMSwgMHg2NjBEODVFMywKKzB4NDAyMTYwNjMsIDB4QzkzRjQwMjEsIDB4NkMwMzQ2MDAsIDB4MjYyRDMyMkEsCisweEM4MDE2MDYzLCAweERCNUVEMTVELCAweDk2N0Q4OTAxLCAweEU2MDAyQzZCLAorMHg2NjZDNjdDRCwgMHg0MDAwNjA2MywgMHg2MjJEMDIxRCwgMHg4RDBFMzI3MCwKKzB4NjA0MzY0MDMsIDB4RTlGRjAyMUQsIDB4OEIwMTMyOTAsIDB4MDFDNUEwMDcsCisweDYyNkM3NjAxLCAweDMyOTJFOTA0LCAweDY0NkM4QkVCLCAweDYwNDM0NDAwLAorMHhEMTUwMDRCRCwgMHgwQjQ1NzQwMSwgMHg2NjlENjkxMSwgMHg4OTA3MzY3MCwKKzB4NjAyRDYyMTEsIDB4ODkwMzg4RkYsIDB4RTIwMURCNEIsIDB4MkIyMDIxQzEsCisweEVDRkM4NTUxLCAweDgxNTEyMEM5LCAweENCMDE2MDUxLCAweERDNDcyNTAxLAorMHg2NEEzNEMwQiwgMHg1MUYzNjZGMiwgMHg4NUVGMjYxMiwgMHg1NEYyRDI0NCwKKzB4NjUwRDQyMEIsIDB4MDAwOUFERTcsIDB4RTUwMERDNDIsIDB4NDIwQjJDNTIsCisweDRFMEI2NEEzLCAweDU0MDM2NDAzLCAweDg1NDQ2RTAzLCAweDY3MDNFOTA4LAorMHg2NTAzNDkxOCwgMHgyNzk5ODU0MSwgMHhEQjMyMzc5MCwgMHg4RjBCRDkzMiwKKzB4NjAxMzYxMEQsIDB4OEIwN0M4MjAsIDB4Qzk0ODYwNTMsIDB4OEIwMzg4MDgsCisweEU1MDFCRDRELCAweDAwMDlBMDA1LCAweDIxMjhEMjMzLCAweEJENDY4OTAxLAorMHg2NEIzRTUwMCwgMHg0OTBCNjVFMywgMHhBREJDRUMwMSwgMHg4NUYyMkRDMiwKKzB4NzAwMUVFMDQsIDB4MzFFNzYxMEQsIDB4OEQwMjgxRjIsIDB4QURBOTdBMDgsCisweDdGMTQwMDA5LCAweDZFRjY0RjI2LCAweDZDRjY2REY2LCAweDZBRjY2QkY2LAorMHgwMDBCNjlGNiwgMHhGN0ZGNjhGNiwgMHgyRkU2ODAwMCwgMHhEMjIzNEYyMiwKKzB4NjBFMzZFMjIsIDB4OEQwMkM4NDAsIDB4QkJGOTIyRTIsIDB4RTI0MDAwMDksCisweDJFMjg0MjE4LCAweEJDMDQ4OTAxLCAweDYwRTMwMDA5LCAweDg5MDVDODEwLAorMHhEMjFDRDQxQiwgMHgwMDA5NDIwQiwgMHgwMDA5QkMwMywgMHhDODA1NjBFMywKKzB4QkQ2RDg5MDEsIDB4NjBFMzAwMDksIDB4ODkwMkM4MDIsIDB4QUMwMDRGMjYsCisweDRGMjY2RUY2LCAweDZFRjYwMDBCLCAweDAwMUMzRDNDLCAweDAwMTE3NzYwLAorMHgwMDIwMTRBMCwgMHgwMDIwMTY2QywgMHgwMDIwMzQ5NCwgMHgwMDIwM0RBNCwKKzB4MDAyMDM5MDgsIDB4MDAyMDM0RkMsIDB4MDAyMDE0Q0MsIDB4MDAyMDM5NzQsCisweDAwMjAzOTdDLCAweDAwMjAzOTcwLCAweDAwMjAzOTcyLCAweDAwMjAxNTMwLAorMHgwMDIwMThFRSwgMHgwMDIwMzk5NCwgMHgwMDAwODAwMCwgMHgwMDFDMzUxMCwKKzB4MDAyMDNEOTgsIDB4MDAyMDE4QTIsIDB4MDgwQTBDMEUsIDB4MDAwMjA0MDYsCisweDFBMUMxRTIwLCAweDEyMTQxNjE4LCAweDJFMzAzMjM0LCAweDI2MjgyQTJDLAorMHgzQTNDM0U0MCwgMHg2QzYyNTY0OCwgMHg0MTExMkYyNiwgMHhFMjIwOEYxOCwKKzB4ODkwQjMxMjMsIDB4MzIxQ0QyMDQsIDB4RDEwMjYyMjAsIDB4NDEyQjMxMkMsCisweDAwMDkwMDA5LCAweDAwMjAzNDEyLCAweDAwMjAzM0M4LCAweDAwMEJFMDAwLAorMHg0MDAwNjJGNiwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwKKzB4NjJGNjAwMEIsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsCisweDQwMTg0MDAwLCAweDYyRjYwMDBCLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLAorMHg0MDAwNDAwMCwgMHg0MDI4NDAwMCwgMHg2MkY2MDAwQiwgMHg0MDAwNDAwMCwKKzB4NDAxODQwMDAsIDB4MDAwQjQwMjgsIDB4QzkwRjYyRjYsIDB4NDAwNTQwMDUsCisweDQwMDU0MDA1LCAweDYyRjYwMDBCLCAweDQwMDVDOTA3LCAweDQwMDU0MDA1LAorMHg2MkY2MDAwQiwgMHg0MDA1QzkwMywgMHgwMDBCNDAwNSwgMHhDOTAxNjJGNiwKKzB4MDAwQjQwMDUsIDB4MDAwMDYyRjYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsIDB4NTQ0RjBEMEEsIDB4NDYyMDUzNTUsIDB4MDAwMDNBNTcsCisweDIwNkM3NTRBLCAweDMyMjAzMTIwLCAweDIwMzgzMDMwLCAweDMyM0EzMTMyLAorMHgzNDMzM0EzOCwgMHgwMDAwMDAwMCwgMHgwMDAwMEQwQSwgMHgwMDAwMDA0MywKKzB4NDI3MDczNzIsIDB4M0QyMDY2NzUsIDB4NTU0RTIwM0QsIDB4MjAyQzRDNEMsCisweDZFNDk2NzdBLCAweDRFNDk3Mjc0LCAweDZENzU0RTUxLCAweDAwMDAwMDNELAorMHg2MTc2NkU0OSwgMHgyMDY0Njk2QywgMHg3MjY1NzM3NSwgMHgyMDcyNkYyMCwKKzB4MjA3OTY1NkIsIDB4MDAyMTQ0NDksIDB4NTI1MDQ1NDUsIDB4NTcyMDRENEYsCisweDY1NzQ2OTcyLCAweDY0NjEyMDJDLCAweDAwM0Q3MjY0LCAweDZDNjE3NjIwLAorMHgwMDAwMDAzRCwgMHgwMDAwMEEwRCwgMHg0MzVGNEQ1QSwgMHg0NjVGNDQ0RCwKKzB4NEM0NDVGNTcsIDB4NDk0RTQ5NUYsIDB4MDAwMDAwNTQsIDB4NkU2QjZFNTUsCisweDIwNkU3NzZGLCAweDZENkQ2RjYzLCAweDNENjQ2RTYxLCAweDAwMDAwMDAwLAorMHgyMDNBMzA1MSwgMHgwMDAwMDAyMCwgMHgyMDNBMzE1MSwgMHgwMDAwMDAyMCwKKzB4MjAzQTMyNTEsIDB4MDAwMDAwMjAsIDB4MjAzQTMzNTEsIDB4MDAwMDAwMjAsCisweDIwM0EzNDUxLCAweDAwMDAwMDIwLCAweDJCNDM0NzQxLCAweDczNjk2RjRFLAorMHg2MTQzMjA2NSwgMHg3MjYyNjk2QywgMHg2RjY5NzQ2MSwgMHg2MTY2MjA2RSwKKzB4NkYyMDZDNjksIDB4Njk3NDIwNkUsIDB4MEQwQTY1NkQsIDB4MDAwMDAwMDAsCisweDAwMDAwMDcyLCAweDAwMjA1MjIwLCAweDAwMDAwRDBBLCAweDYyNzM1NTc2LAorMHg3NDczNzI1RiwgMHgwMDAwMEEwRCwgMHg2MjczNTU3NiwgMHg3Mzc1NzM1RiwKKzB4NjQ2RTY1NzAsIDB4MDAwMDBBMEQsIDB4NjI3MzU1NzYsIDB4NzM2NTcyNUYsCisweDAwMEEwRDZELCAweDAwMDAwMDQ0LCAweDQ0Mzg3NTcwLCAweDcyNjM3MzY1LAorMHg2Rjc0NzA2OSwgMHgzRDU4NDU3MiwgMHgwMDAwMDAwMCwgMHgwMDAwMDA0NywKKzB4MDAwMDAwNDIsIDB4NzI3NDZFNDksIDB4NkQ2NTIwNTEsIDB4MkM3OTc0NzAsCisweDQ5Njc3QTIwLCAweDQ5NzI3NDZFLCAweDc1NEU1MTRFLCAweDAwMDAzRDZELAorMHg2NTRDNzI0NSwgMHgwMDAwMDA2RSwgMHgwMDAwMDA0OSwgMHgyMDc0NkY0RSwKKzB4NzU2RjZFNjUsIDB4NDkyMDY4NjcsIDB4NDIyMDUxNEUsIDB4MEEwRDY2NzUsCisweDAwMDAwMDAwLCAweDAwMDAwMEZGLCAweDAwMDIwMDAxLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAxMEUwMTBELCAweDAwMDIwMDAzLCAweDAxMDkwMTA4LAorMHgwMDAyMDEwQSwgMHgwMjAwMDAwMywgMHgwMjAyMDIwMSwgMHgwMjA0MDIwMywKKzB4MDIwNjAyMDUsIDB4MDIwMjAyMDAsIDB4MDIwNDAyMDMsIDB4MDIwQzAyMEIsCisweDAyMEUwMjBELCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDAwMDAwRkYsIDB4MDAwMjAwMDEsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDEwRTAxMEQsIDB4MDAwMjAwMDMsIDB4MDEwOTAxMDgsCisweDAwMDIwMTBBLCAweDAwMDMwMDAzLCAweDAyMDIwMjAxLCAweDAyMDQwMjAzLAorMHgwMjA2MDIwNSwgMHgwMjAyMDIwMCwgMHgwMjA0MDIwMywgMHgwMjBDMDIwQiwKKzB4MDIwRTAyMEQsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMTBFMDEwRCwgMHgwMEZGMDEwRiwgMHgwMTA5MDEwOCwKKzB4MDEwQjAxMEEsIDB4MDIwMDAxMEYsIDB4MDIwMjAyMDEsIDB4MDIwNDAyMDMsCisweDAyMDYwMjA1LCAweDAyMDIwMjAwLCAweDAyMDQwMjAzLCAweDAyMEMwMjBCLAorMHgwMjBFMDIwRCwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsIDB4MDBGRjAwRkYsCisweDAwRkYwMEZGLCAweDAxMEUwMTBELCAweDAwRkYwMTBGLCAweDAxMDkwMTA4LAorMHgwMTBCMDEwQSwgMHgwMTBGMDEwRiwgMHgwMjAyMDIwMSwgMHgwMjA0MDIwMywKKzB4MDIwNjAyMDUsIDB4MDIwMjAyMDAsIDB4MDIwNDAyMDMsIDB4MDIwQzAyMEIsCisweDAyMEUwMjBELCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLCAweDAwRkYwMEZGLAorMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwgMHgwMEZGMDBGRiwKKzB4MDBGRjAwRkYsIDB4MDAyMDUyMjAsIDB4MDAwMDAwNDYsIDB4MDAwMDAwNTksCisweDczMjA0MTQyLCAweDAwM0Q3MTY1LCAweDQ5NTQ0MTIwLCAweDAwMDAyMDRELAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDJFMDIwOSwgMHg4MDAwMDEwMSwKKzB4MDAwNDA5RkEsIDB4MDBGRjA0MDAsIDB4MDUwNzAwMDAsIDB4MDIwMDAyMDEsCisweDgyMDUwNzAwLCAweDAwMDIwMDAyLCAweDAzODMwNTA3LCAweDA3MDEwMDQwLAorMHg0MDAzMDQwNSwgMHgwMjA5MDEwMCwgMHgwMTAxMDAyRSwgMHgwOUZBODAwMCwKKzB4MDQwMDAwMDQsIDB4MDAwMDAwRkYsIDB4MDIwMTA1MDcsIDB4MDcwMDAwNDAsCisweDQwMDI4MjA1LCAweDA1MDcwMDAwLCAweDAwNDAwMzgzLCAweDA0MDUwNzAxLAorMHgwMDAwNDAwMiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwNzA5MDAwMCwKKzB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKK307CisKK2NvbnN0IHUzMl90IHpjRndJbWFnZVNpemU9MTU5MzY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd3Vpbml0LmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBmd3Vpbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ4MGZmYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocGZ3dWluaXQuYwpAQCAtMCwwICsxLDI0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSAiLi4vODAyMTFjb3JlL2NwcmVjb21wLmgiCisKK2NvbnN0IHUzMl90IHpjRndJbWFnZVtdID0geworMHgwMDA5MDAwQiwgMHg3RkZDNEYyMiwgMHhENjk1RDQ5NCwgMHgwMDA5NDYwQiwKKzB4RDQ5NEU1NzAsIDB4NDUxOEIwMUUsIDB4ODkwNDIwMDgsIDB4RDY5MEQ0OTIsCisweDQ2MkI3RjA0LCAweEIwMTI0RjI2LCAweEQyOTAwMDA5LCAweDQyMEJENDkwLAorMHhFNjAwMDAwOSwgMHg5NDlBRDU4RiwgMHhDODQwNjA1MiwgMHgyRjAyOEYwMywKKzB4OEZGOTM2NDIsIDB4N0YwNDc2MDEsIDB4MDAwQjRGMjYsIDB4RDI4QTAwMDksCisweDAwMDk0MjJCLCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LCAweEQ2ODc3RkVDLAorMHg2MjYwNjFGMywgMHgyRjIwODQ2MSwgMHg4NDYyODBGMSwgMHg4MEYyNzExMCwKKzB4NkQ0Mzg0NjMsIDB4ODQ2NDgwRjMsIDB4ODBGNDY0MTMsIDB4NkM1Mzg0NjUsCisweDg0NjY4MEY1LCAweDgwRjZFNTAwLCAweEQ3N0Q4NDY3LCAweDg0Njg4MEY3LAorMHg4MEY4RUUwNCwgMHg4MEY5ODQ2OSwgMHg4MEZBODQ2QSwgMHg4MEZCODQ2QiwKKzB4ODBGQzg0NkMsIDB4ODBGRDg0NkQsIDB4ODBGRTg0NkUsIDB4ODBGRjg0NkYsCisweDY2NTM2NTVDLCAweDc1MDEzNjdDLCAweDY2NUM2MjYwLCAweDI0MjAzNkUzLAorMHg3NDAxOEZGNiwgMHg2NkYzMkYxNiwgMHhFNzEwNzYwNCwgMHhCMDBENjVDMywKKzB4NkUwMzY0RDMsIDB4RDQ2QjdGMDQsIDB4NDIwQkQyNkIsIDB4NjBFMzY1MDMsCisweDRGMjY3RjE0LCAweDZERjY2RUY2LCAweDZDRjYwMDBCLCAweDJGQjYyRkE2LAorMHgyRkQ2MkZDNiwgMHg0RjIyMkZFNiwgMHgzRjNDOTMzQSwgMHg0MTA4RTE0MSwKKzB4MzFGQ0UyMDAsIDB4MTE3MzM1MjYsIDB4MjE1MjExNjIsIDB4MTE0MThEMDIsCisweEUwRkZBMDk4LCAweDRBMThFQTAxLCAweDI2MjA2NkYzLCAweDMyQTI3MjAxLAorMHg3NjAxOEZGQiwgMHg2QkUzRUUwMCwgMHhFMDQ0NkNGMywgMHgwMEZFNDAwOCwKKzB4NDUwQkQ1NTYsIDB4NjYwMzYxQjMsIDB4NDAwOEUwNDMsIDB4NkRDMDA0RkUsCisweDAxNEM2MDYzLCAweDMxRUMzRURDLCAweDYwRTM2RTFDLCAweDdCMDEwN0ZDLAorMHgyQzcwM0JBMiwgMHg4RkU4MEZENCwgMHhFMDQyN0MwMSwgMHhFQjAwNDAwOCwKKzB4NzBGQzA3RkUsIDB4NkVCMzZDQjMsIDB4QTAyMDBBRkUsIDB4MjcxMEVERkYsCisweDdDMDFGRUUwLCAweDYwQzM2Q0NDLCAweDY1NzAwMkZDLCAweDZCQkMzQjJDLAorMHgwMUZDNjBCMywgMHgwRjE0NjBDMywgMHgwRjI0NjBCMywgMHgwNEZDNjBDMywKKzB4MzQyQzdFMDEsIDB4MDFGQzYwNEMsIDB4MjUxQTYyRDMsIDB4RDQzQzIyNUEsCisweDI3NTA2MDJDLCAweDA2NEU0MDA4LCAweDJENkE0RDE5LCAweDNFQTI3NzAxLAorMHg2NkQ3OEJERiwgMHg0MDE4RTAwMSwgMHgwRjY0NjU2MywgMHg3MDAxNDUxOSwKKzB4MEY1NDQ2MjksIDB4MEY2NDcwMDEsIDB4NzAwMTQ2MTksIDB4OTA0MjBGNjQsCisweEUwNDUwRUZFLCAweEVBMDE0MDA4LCAweEUwNDYwRkY2LCAweDRBMTg0MDA4LAorMHhFRDAwNjdGMywgMHgwRkY2MzdBQywgMHgwRkY2NzAwNCwgMHhFMzQ1RTEwNCwKKzB4N0MwMTQzMDgsIDB4NkNDQzMzRkMsIDB4NjBDMzY0MzIsIDB4NTUzMTAyNEMsCisweDZCQkMzQjJDLCAweDA0NUM2MEIzLCAweDYwQzM1QTMyLCAweDYwQjMwQTQ0LAorMHg2MEMzMEYyNCwgMHg2QTcwMDZGQywgMHg2MDZDMzYyQywgMHg2NkUwMDVGQywKKzB4NkE1QzY0QUMsIDB4NjI2QzI0QUEsIDB4ODkwNTM0MjAsIDB4NEQwODREMDgsCisweENCMDQ2MEQzLCAweDYwMEJBMDA2LCAweDdEMDE0MTEwLCAweDhGRDY3NzAxLAorMHhFMDAwN0UwMSwgMHgzRjNDOTMwOCwgMHg2RUY2NEYyNiwgMHg2Q0Y2NkRGNiwKKzB4MDAwQjZCRjYsIDB4MDEzODZBRjYsIDB4MDAwMDAxMjAsIDB4MDAyMDBENTQsCisweDAwMjAwMkJFLCAweDAwMTAyODAwLCAweDAwMjAwRDY0LCAweDAwMTBGMDBBLAorMHgwMDEwRjAwMCwgMHgwMDFDMDAxQywgMHgwMDEwMzI1MiwgMHgwMDIwMERBMCwKKzB4MDAxMEZGRkMsIDB4MDAyMDBEN0MsIDB4MDAyMDAzMkMsIDB4MDAyMDAzNzAsCisweDAwMjAwOTU0LCAweDAwMDkwMDBCLCAweDJGRDYyRkM2LCAweDRGMjIyRkU2LAorMHg2RDQzNkM1MywgMHhFRTAwQTAwNCwgMHg3RTAxNjRENCwgMHg2NDRDQkZGMiwKKzB4OEJGOTNFQzIsIDB4NkVGNjRGMjYsIDB4MDAwQjZERjYsIDB4RTUwMDZDRjYsCisweDY2NDNBMDAyLCAweDc2MDE3NTAxLCAweDIyMjg2MjYwLCAweEFGRTM4QkZBLAorMHgyRkU2MDAwOSwgMHg3NTA3NjI1MywgMHhFMTA4Njc1MywgMHg2MDQzRUUwQSwKKzB4NDQwOUM5MEYsIDB4NjUwMzMwRTIsIDB4OEQwMTQ0MDksIDB4RTYzMEU2MzcsCisweDQxMTAzNjVDLCAweDhGRjIyNzYwLCAweEUwMDA3N0ZGLCAweDAwMEI4MDI4LAorMHg0RjIyNkVGNiwgMHhCRkU0N0ZFQywgMHhCRkQ4NjVGMywgMHg3RjE0NjRGMywKKzB4MDAwQjRGMjYsIDB4NEYyMkUwMDAsIDB4QkZEQTdGRUMsIDB4NjRGMzY1RjMsCisweDc0MDZCRkNELCAweDRGMjY3RjE0LCAweEUwMDAwMDBCLCAweDRGMjIyRkU2LAorMHg2MjUzN0ZFQywgMHg2NUYzNkU0MywgMHg2NDIzQkZDQiwgMHg2NEUzQkZCRiwKKzB4NjRGM0JGQkQsIDB4QkZCQUQ0MDMsIDB4N0YxNDAwMDksIDB4MDAwQjRGMjYsCisweDAwMDA2RUY2LCAweDAwMjAwREIwLCAweDg5MDA0MDExLCAweDQxMTE2MDBCLAorMHg0RjIyODkwNiwgMHg2MTFCQjAwNCwgMHgwMDBCNEYyNiwgMHgwMDA5NjAwQiwKKzB4NjIwRDJGMjYsIDB4OEY0MTMwMjAsIDB4NDAxODAwMTksIDB4OEIwRDMwMTYsCisweDMxMDQzMTA0LCAweDMxMDQzMTA0LCAweDMxMDQzMTA0LCAweDMxMDQzMTA0LAorMHg4OTAwNjJGNiwgMHg0MTE5MzEwQywgMHg2MDEzMDAwQiwgMHg0MTI5NjIxOSwKKzB4MjAwODQwMTgsIDB4MzEwNDg5MjcsIDB4MzEwNDMxMDQsIDB4MzEwNDMxMDQsCisweDMxMDQzMTA0LCAweDMxMDQzMTA0LCAweDMxMDQzMTA0LCAweDMxMDQzMTA0LAorMHgzMTA0MzEwNCwgMHg2MTE5MzEwNCwgMHgzMjA0MjIxRCwgMHgzMjA0MzIwNCwKKzB4MzIwNDMyMDQsIDB4MzIwNDMyMDQsIDB4MzIwNDMyMDQsIDB4MzIwNDMyMDQsCisweDMyMDQzMjA0LCAweDMyMDQzMjA0LCAweDg5MDAzMjA0LCAweDQyMjkzMjBDLAorMHgwMDBCNjAyMywgMHhFMDAwNjJGNiwgMHg2MkY2MDAwQiwgMHg0MjI4NjIxMywKKzB4NDIyNDQxMjksIDB4NDIyNDMxMDQsIDB4NDIyNDMxMDQsIDB4NDIyNDMxMDQsCisweDQyMjQzMTA0LCAweDQyMjQzMTA0LCAweDQyMjQzMTA0LCAweDQyMjQzMTA0LAorMHg0MjI0MzEwNCwgMHg0MjI0MzEwNCwgMHg0MjI0MzEwNCwgMHg0MjI0MzEwNCwKKzB4NDIyNDMxMDQsIDB4NDIyNDMxMDQsIDB4NDIyNDMxMDQsIDB4NDIyNDMxMDQsCisweDg5MDAzMTA0LCAweDYwMTMzMTBDLCAweDYyRjYwMDBCLCAweDJGMjYyRjE2LAorMHg1MUY1NTJGMywgMHg1MkYyMjEyOSwgMHg1MkY0MTIxMCwgMHgyMTI5NTFGNiwKKzB4MTIxMTUyRjIsIDB4MDAwQjYyRjYsIDB4MDAwMDYxRjYsIDB4NTFGMzJGMTYsCisweDMxMDA1MEYxLCAweDUxRjQ4QjAyLCAweDMxMDA1MEYyLCAweDAwMEIwMDI5LAorMHgwMDAwNjFGNiwgMHg1MUYzMkYxNiwgMHgzMTAwNTBGMSwgMHg1MUY0OEIwNiwKKzB4MzEwMDUwRjIsIDB4Q0EwMTAwMjksIDB4NjFGNjAwMEIsIDB4MDAwQkUwMDEsCisweDAwMDA2MUY2LCAweDUwRjAwMDBCLCAweDJGMjYyRjE2LCAweEUxMDA1MkYyLAorMHgxMjAwMTIxMSwgMHgwMDBCNjJGNiwgMHgwMDAwNjFGNiwgMHgyRjE2MkYwNiwKKzB4OEIyNjQxMTUsIDB4MzEwM0UwNDAsIDB4MkYyNjg5MkIsIDB4NTJGNjJGMzYsCisweEUwMjA1M0Y1LCAweDhCMDUzMTAzLCAweEUzMDA2MjMzLCAweDg5MDkzMTAwLAorMHgzMTA4QTAwMiwgMHg4QjBGMjMzOCwgMHhEMDA2NEYyMiwgMHg2MDIzNDAwQiwKKzB4NEYyNjYyMDMsIDB4MTEyMTUxRjQsIDB4NjNGNjExMzAsIDB4NjFGNjYyRjYsCisweDYwRjYwMDBCLCAweDAwMjAwN0Y0LCAweDQxMDBDNzA5LCAweDAxMjMwMTFELAorMHg1MUYyMDAwOSwgMHgxMTAxNTBGNCwgMHgxMTAwNTBGMywgMHgwMDBCNjFGNiwKKzB4NTFGMjYwRjYsIDB4MTEwMUUwMDAsIDB4NjFGNjExMDAsIDB4NjBGNjAwMEIsCisweDAxMzAwMDAwLCAweDAxMjgwMTJDLCAweDAxMjAwMTI0LCAweDAxMTgwMTFDLAorMHgwMTA2MDEwQSwgMHgwMEZFMDEwMiwgMHgwMEUyMDBFNiwgMHgwMERBMDBERSwKKzB4MDBDQzAwRDAsIDB4MDBDNDAwQzgsIDB4MDBBODAwQUMsIDB4MDBBMDAwQTQsCisweDAwOEMwMDkwLCAweDAwODQwMDg4LCAweDAwNjYwMDZBLCAweDAwNUUwMDYyLAorMHg0MjI0NDMwMCwgMHg0MjI0NDMwMCwgMHg0MjI0NDMwMCwgMHg0MzI4NjEzMywKKzB4NDMwODQzMTgsIDB4NDIyODQzMDgsIDB4NDIwODQyMTgsIDB4NDEwOTQyMDgsCisweEFGQUY0MTA5LCAweDQzMDAyMjFCLCAweDQzMDA0MjI0LCAweDQzMDA0MjI0LAorMHg2MTMzNDIyNCwgMHg0MzE4NDMyOCwgMHg0MjE4NDIyOCwgMHhBRkExNDExOSwKKzB4NDMwMDIyMUIsIDB4NDMwMDQyMjQsIDB4NDMwMDQyMjQsIDB4NjEzMzQyMjQsCisweDQzMDg0MzI4LCAweDQyMjg0MzA4LCAweDQyMDg0MjA4LCAweDQxMDk0MTE5LAorMHhBRjhGNDEwOSwgMHg0MzAwMjIxQiwgMHg0MzAwNDIyNCwgMHg0MzAwNDIyNCwKKzB4NjEzMzQyMjQsIDB4MjEyRDQzMjgsIDB4NjIxM0FGODQsIDB4NDIyNDQzMDAsCisweDQyMjQ0MzAwLCAweDQyMjQ0MzAwLCAweDQzMTg2MTMzLCAweDQzMDg0MzA4LAorMHg0MjA4NDIxOCwgMHg0MTI5NDIwOCwgMHg0MTA5NDEwOSwgMHgyMjFCQUY3MiwKKzB4NDIyNDQzMDAsIDB4NDIyNDQzMDAsIDB4NDIyNDQzMDAsIDB4NDMxODYxMzMsCisweDQxMjk0MjE4LCAweEFGNjU0MTE5LCAweDQzMDAyMjFCLCAweDQzMDA0MjI0LAorMHg0MzAwNDIyNCwgMHg0MzAwNDIyNCwgMHg0MzAwNDIyNCwgMHg0MzAwNDIyNCwKKzB4NDMwMDQyMjQsIDB4NDIyNEFGNTYsIDB4MkYxNjJGMDYsIDB4OEIyNjQxMTUsCisweDMxMDNFMDQwLCAweDJGMjY4OTJCLCAweDUyRjYyRjM2LCAweEUwMjA1M0Y1LAorMHg4QjA1MzEwMywgMHhFMjAwNjMyMywgMHg4OTA5MzEwMCwgMHgzMTA4QTAwMiwKKzB4OEIwRjIyMjgsIDB4RDAwNjRGMjIsIDB4NjAzMzQwMEIsIDB4NEYyNjYzMDMsCisweDExMjE1MUY0LCAweDYzRjYxMTMwLCAweDYxRjY2MkY2LCAweDYwRjYwMDBCLAorMHgwMDIwMDhCNCwgMHg0MTAwQzcwOSwgMHgwMTIzMDExRCwgMHg1MUYyMDAwOSwKKzB4MTEwMTUwRjQsIDB4MTEwMDUwRjMsIDB4MDAwQjYxRjYsIDB4NTFGMjYwRjYsCisweDExMDFFMDAwLCAweDYxRjYxMTAwLCAweDYwRjYwMDBCLCAweDAxMkUwMDAwLAorMHgwMTI2MDEyQSwgMHgwMTFFMDEyMiwgMHgwMTE2MDExQSwgMHgwMTA0MDEwOCwKKzB4MDBGQzAxMDAsIDB4MDBFMDAwRTQsIDB4MDBEODAwREMsIDB4MDBDQzAwRDAsCisweDAwQzQwMEM4LCAweDAwQTgwMEFDLCAweDAwQTAwMEE0LCAweDAwOEMwMDkwLAorMHgwMDg0MDA4OCwgMHgwMDY2MDA2QSwgMHgwMDVFMDA2MiwgMHg0MzI1NDIwMSwKKzB4NDMyNTQyMDEsIDB4NDMyNTQyMDEsIDB4NDIyOTYxMjMsIDB4NDIwOTQyMTksCisweDQzMjk0MjA5LCAweDQzMDk0MzE5LCAweDQxMDg0MzA5LCAweEFGQUY0MTA4LAorMHg0MjAxMjMxQiwgMHg0MjAxNDMyNSwgMHg0MjAxNDMyNSwgMHg2MTIzNDMyNSwKKzB4NDIxOTQyMjksIDB4NDMxOTQzMjksIDB4QUZBMTQxMTgsIDB4NDIwMTIzMUIsCisweDQyMDE0MzI1LCAweDQyMDE0MzI1LCAweDYxMjM0MzI1LCAweDQyMDk0MjI5LAorMHg0MzI5NDIwOSwgMHg0MzA5NDMwOSwgMHg0MTA4NDExOCwgMHhBRjhGNDEwOCwKKzB4NDIwMTIzMUIsIDB4NDIwMTQzMjUsIDB4NDIwMTQzMjUsIDB4NjEyMzQzMjUsCisweEFGODU0MjI5LCAweDQyMDEyMzFELCAweDQyMDE0MzI1LCAweDQyMDE0MzI1LAorMHg2MTIzNDMyNSwgMHg0MjA5NDIxOSwgMHg0MzE5NDIwOSwgMHg0MzA5NDMwOSwKKzB4NDEwODQxMjgsIDB4QUY3MzQxMDgsIDB4NDIwMTIzMUIsIDB4NDIwMTQzMjUsCisweDQyMDE0MzI1LCAweDYxMjM0MzI1LCAweDQzMTk0MjE5LCAweDQxMTg0MTI4LAorMHgyMzFCQUY2NiwgMHg0MzI1NDIwMSwgMHg0MzI1NDIwMSwgMHg0MzI1NDIwMSwKKzB4NDMyNTQyMDEsIDB4NDMyNTQyMDEsIDB4NDMyNTQyMDEsIDB4QUY1NzQyMDEsCisweDAwMDA0MzI1LCAweDA4MEEwQzBFLCAweDAwMDIwNDA2LCAweDFBMUMxRTIwLAorMHgxMjE0MTYxOCwgMHgyRTMwMzIzNCwgMHgyNjI4MkEyQywgMHgzQTNDM0U0MCwKKzB4NkM2MjU2NDgsIDB4NDExMTJGMjYsIDB4RTIyMDhGMTgsIDB4ODkwQjMxMjMsCisweDMyMUNEMjA0LCAweEQxMDI2MjIwLCAweDQxMkIzMTJDLCAweDAwMDkwMDA5LAorMHgwMDIwMDgxRSwgMHgwMDIwMDdENCwgMHgwMDBCRTAwMCwgMHg0MDAwNjJGNiwKKzB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NDAwMDQwMDAsIDB4NjJGNjAwMEIsCisweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMDA0MDAwLCAweDQwMTg0MDAwLAorMHg2MkY2MDAwQiwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwgMHg0MDAwNDAwMCwKKzB4NDAyODQwMDAsIDB4NjJGNjAwMEIsIDB4NDAwMDQwMDAsIDB4NDAxODQwMDAsCisweDAwMEI0MDI4LCAweEM5MEY2MkY2LCAweDQwMDU0MDA1LCAweDQwMDU0MDA1LAorMHg2MkY2MDAwQiwgMHg0MDA1QzkwNywgMHg0MDA1NDAwNSwgMHg2MkY2MDAwQiwKKzB4NDAwNUM5MDMsIDB4MDAwQjQwMDUsIDB4QzkwMTYyRjYsIDB4MDAwQjQwMDUsCisweDAwMDA2MkY2LCAweDA4MEEwQzBFLCAweDAwMDIwNDA2LCAweDFBMUMxRTIwLAorMHgxMjE0MTYxOCwgMHgyRTMwMzIzNCwgMHgyNjI4MkEyQywgMHgzQTNDM0U0MCwKKzB4NkM2MjU2NDgsIDB4NDExMTJGMjYsIDB4RTIyMDhGMTgsIDB4ODkwQjMxMjMsCisweDMyMUNEMjA0LCAweEQxMDI2MjIwLCAweDQxMkIzMTJDLCAweDAwMDkwMDA5LAorMHgwMDIwMDhERSwgMHgwMDIwMDg5NCwgMHgwMDBCRTAwMCwgMHg0MDAxNjJGNiwKKzB4NDAwMTQwMDEsIDB4NDAwMTQwMDEsIDB4NDAwMTQwMDEsIDB4NjJGNjAwMEIsCisweDQwMDE0MDAxLCAweDQwMDE0MDAxLCAweDQwMDE0MDAxLCAweDQwMTk0MDAxLAorMHg2MkY2MDAwQiwgMHg0MDAxNDAwMSwgMHg0MDAxNDAwMSwgMHg0MDAxNDAwMSwKKzB4NDAyOTQwMDEsIDB4NjJGNjAwMEIsIDB4NDAwMTQwMDEsIDB4NDAxOTQwMDEsCisweDAwMEI0MDI5LCAweDQwMDQ2MkY2LCAweDQwMDQ0MDA0LCAweEM5MEY0MDA0LAorMHg2MkY2MDAwQiwgMHg0MDA0NDAwNCwgMHhDOTA3NDAwNCwgMHg2MkY2MDAwQiwKKzB4NDAwNDQwMDQsIDB4MDAwQkM5MDMsIDB4NDAwNDYyRjYsIDB4MDAwQkM5MDEsCisweDAwMDA2MkY2LCAweDAwMDAwMDAwLCAweDc3MDczMDk2LCAweEVFMEU2MTJDLAorMHg5OTA5NTFCQSwgMHgwNzZEQzQxOSwgMHg3MDZBRjQ4RiwgMHhFOTYzQTUzNSwKKzB4OUU2NDk1QTMsIDB4MEVEQjg4MzIsIDB4NzlEQ0I4QTQsIDB4RTBENUU5MUUsCisweDk3RDJEOTg4LCAweDA5QjY0QzJCLCAweDdFQjE3Q0JELCAweEU3QjgyRDA3LAorMHg5MEJGMUQ5MSwgMHgxREI3MTA2NCwgMHg2QUIwMjBGMiwgMHhGM0I5NzE0OCwKKzB4ODRCRTQxREUsIDB4MUFEQUQ0N0QsIDB4NkREREU0RUIsIDB4RjRENEI1NTEsCisweDgzRDM4NUM3LCAweDEzNkM5ODU2LCAweDY0NkJBOEMwLCAweEZENjJGOTdBLAorMHg4QTY1QzlFQywgMHgxNDAxNUM0RiwgMHg2MzA2NkNEOSwgMHhGQTBGM0Q2MywKKzB4OEQwODBERjUsIDB4M0I2RTIwQzgsIDB4NEM2OTEwNUUsIDB4RDU2MDQxRTQsCisweEEyNjc3MTcyLCAweDNDMDNFNEQxLCAweDRCMDRENDQ3LCAweEQyMEQ4NUZELAorMHhBNTBBQjU2QiwgMHgzNUI1QThGQSwgMHg0MkIyOTg2QywgMHhEQkJCQzlENiwKKzB4QUNCQ0Y5NDAsIDB4MzJEODZDRTMsIDB4NDVERjVDNzUsIDB4RENENjBEQ0YsCisweEFCRDEzRDU5LCAweDI2RDkzMEFDLCAweDUxREUwMDNBLCAweEM4RDc1MTgwLAorMHhCRkQwNjExNiwgMHgyMUI0RjRCNSwgMHg1NkIzQzQyMywgMHhDRkJBOTU5OSwKKzB4QjhCREE1MEYsIDB4MjgwMkI4OUUsIDB4NUYwNTg4MDgsIDB4QzYwQ0Q5QjIsCisweEIxMEJFOTI0LCAweDJGNkY3Qzg3LCAweDU4Njg0QzExLCAweEMxNjExREFCLAorMHhCNjY2MkQzRCwgMHg3NkRDNDE5MCwgMHgwMURCNzEwNiwgMHg5OEQyMjBCQywKKzB4RUZENTEwMkEsIDB4NzFCMTg1ODksIDB4MDZCNkI1MUYsIDB4OUZCRkU0QTUsCisweEU4QjhENDMzLCAweDc4MDdDOUEyLCAweDBGMDBGOTM0LCAweDk2MDlBODhFLAorMHhFMTBFOTgxOCwgMHg3RjZBMERCQiwgMHgwODZEM0QyRCwgMHg5MTY0NkM5NywKKzB4RTY2MzVDMDEsIDB4NkI2QjUxRjQsIDB4MUM2QzYxNjIsIDB4ODU2NTMwRDgsCisweEYyNjIwMDRFLCAweDZDMDY5NUVELCAweDFCMDFBNTdCLCAweDgyMDhGNEMxLAorMHhGNTBGQzQ1NywgMHg2NUIwRDlDNiwgMHgxMkI3RTk1MCwgMHg4QkJFQjhFQSwKKzB4RkNCOTg4N0MsIDB4NjJERDFEREYsIDB4MTVEQTJENDksIDB4OENEMzdDRjMsCisweEZCRDQ0QzY1LCAweDREQjI2MTU4LCAweDNBQjU1MUNFLCAweEEzQkMwMDc0LAorMHhENEJCMzBFMiwgMHg0QURGQTU0MSwgMHgzREQ4OTVENywgMHhBNEQxQzQ2RCwKKzB4RDNENkY0RkIsIDB4NDM2OUU5NkEsIDB4MzQ2RUQ5RkMsIDB4QUQ2Nzg4NDYsCisweERBNjBCOEQwLCAweDQ0MDQyRDczLCAweDMzMDMxREU1LCAweEFBMEE0QzVGLAorMHhERDBEN0NDOSwgMHg1MDA1NzEzQywgMHgyNzAyNDFBQSwgMHhCRTBCMTAxMCwKKzB4QzkwQzIwODYsIDB4NTc2OEI1MjUsIDB4MjA2Rjg1QjMsIDB4Qjk2NkQ0MDksCisweENFNjFFNDlGLCAweDVFREVGOTBFLCAweDI5RDlDOTk4LCAweEIwRDA5ODIyLAorMHhDN0Q3QThCNCwgMHg1OUIzM0QxNywgMHgyRUI0MEQ4MSwgMHhCN0JENUMzQiwKKzB4QzBCQTZDQUQsIDB4RURCODgzMjAsIDB4OUFCRkIzQjYsIDB4MDNCNkUyMEMsCisweDc0QjFEMjlBLCAweEVBRDU0NzM5LCAweDlERDI3N0FGLCAweDA0REIyNjE1LAorMHg3M0RDMTY4MywgMHhFMzYzMEIxMiwgMHg5NDY0M0I4NCwgMHgwRDZENkEzRSwKKzB4N0E2QTVBQTgsIDB4RTQwRUNGMEIsIDB4OTMwOUZGOUQsIDB4MEEwMEFFMjcsCisweDdEMDc5RUIxLCAweEYwMEY5MzQ0LCAweDg3MDhBM0QyLCAweDFFMDFGMjY4LAorMHg2OTA2QzJGRSwgMHhGNzYyNTc1RCwgMHg4MDY1NjdDQiwgMHgxOTZDMzY3MSwKKzB4NkU2QjA2RTcsIDB4RkVENDFCNzYsIDB4ODlEMzJCRTAsIDB4MTBEQTdBNUEsCisweDY3REQ0QUNDLCAweEY5QjlERjZGLCAweDhFQkVFRkY5LCAweDE3QjdCRTQzLAorMHg2MEIwOEVENSwgMHhENkQ2QTNFOCwgMHhBMUQxOTM3RSwgMHgzOEQ4QzJDNCwKKzB4NEZERkYyNTIsIDB4RDFCQjY3RjEsIDB4QTZCQzU3NjcsIDB4M0ZCNTA2REQsCisweDQ4QjIzNjRCLCAweEQ4MEQyQkRBLCAweEFGMEExQjRDLCAweDM2MDM0QUY2LAorMHg0MTA0N0E2MCwgMHhERjYwRUZDMywgMHhBODY3REY1NSwgMHgzMTZFOEVFRiwKKzB4NDY2OUJFNzksIDB4Q0I2MUIzOEMsIDB4QkM2NjgzMUEsIDB4MjU2RkQyQTAsCisweDUyNjhFMjM2LCAweENDMEM3Nzk1LCAweEJCMEI0NzAzLCAweDIyMDIxNkI5LAorMHg1NTA1MjYyRiwgMHhDNUJBM0JCRSwgMHhCMkJEMEIyOCwgMHgyQkI0NUE5MiwKKzB4NUNCMzZBMDQsIDB4QzJEN0ZGQTcsIDB4QjVEMENGMzEsIDB4MkNEOTlFOEIsCisweDVCREVBRTFELCAweDlCNjRDMkIwLCAweEVDNjNGMjI2LCAweDc1NkFBMzlDLAorMHgwMjZEOTMwQSwgMHg5QzA5MDZBOSwgMHhFQjBFMzYzRiwgMHg3MjA3Njc4NSwKKzB4MDUwMDU3MTMsIDB4OTVCRjRBODIsIDB4RTJCODdBMTQsIDB4N0JCMTJCQUUsCisweDBDQjYxQjM4LCAweDkyRDI4RTlCLCAweEU1RDVCRTBELCAweDdDRENFRkI3LAorMHgwQkRCREYyMSwgMHg4NkQzRDJENCwgMHhGMUQ0RTI0MiwgMHg2OEREQjNGOCwKKzB4MUZEQTgzNkUsIDB4ODFCRTE2Q0QsIDB4RjZCOTI2NUIsIDB4NkZCMDc3RTEsCisweDE4Qjc0Nzc3LCAweDg4MDg1QUU2LCAweEZGMEY2QTcwLCAweDY2MDYzQkNBLAorMHgxMTAxMEI1QywgMHg4RjY1OUVGRiwgMHhGODYyQUU2OSwgMHg2MTZCRkZEMywKKzB4MTY2Q0NGNDUsIDB4QTAwQUUyNzgsIDB4RDcwREQyRUUsIDB4NEUwNDgzNTQsCisweDM5MDNCM0MyLCAweEE3NjcyNjYxLCAweEQwNjAxNkY3LCAweDQ5Njk0NzRELAorMHgzRTZFNzdEQiwgMHhBRUQxNkE0QSwgMHhEOUQ2NUFEQywgMHg0MERGMEI2NiwKKzB4MzdEODNCRjAsIDB4QTlCQ0FFNTMsIDB4REVCQjlFQzUsIDB4NDdCMkNGN0YsCisweDMwQjVGRkU5LCAweEJEQkRGMjFDLCAweENBQkFDMjhBLCAweDUzQjM5MzMwLAorMHgyNEI0QTNBNiwgMHhCQUQwMzYwNSwgMHhDREQ3MDY5MywgMHg1NERFNTcyOSwKKzB4MjNEOTY3QkYsIDB4QjM2NjdBMkUsIDB4QzQ2MTRBQjgsIDB4NUQ2ODFCMDIsCisweDJBNkYyQjk0LCAweEI0MEJCRTM3LCAweEMzMEM4RUExLCAweDVBMDVERjFCLAorMHgyRDAyRUY4RCwgMHg1NDRGMEQwQSwgMHg1MDIwNTM1NSwgMHgyMDMxMkQ0OCwKKzB4MDAzQTU3NDYsIDB4NzI2MzY1NjQsIDB4Njk3NDcwNzksIDB4NjUyMDZFNkYsCisweDcyNkY3MjcyLCAweDBBMEQyMTIxLCAweDAwMDAwMDAwLCAweDY1NjQ2NjdBLAorMHg3MDc5NzI2MywgMHg2NTcyNUY3NCwgMHg2MTZDNzU2NywgMHg3OTcyNkY3NCwKKzB4NjI2MTc0NUYsIDB4NzIyMDY1NkMsIDB4MjAzRDc0NjUsIDB4MDAwMDAwMDAsCisweDQ1NDg1NDQxLCAweDM4NzMxNjUyLCAweDg5QUNGRjkxLCAweEVFNTVEMTc4LAorMHhFRTAwMEQwQSwgfTsKKworY29uc3QgdTMyX3QgemNGd0ltYWdlU2l6ZT0zNTA4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwbWFpbi5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNjVjNDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBtYWluLmMKQEAgLTAsMCArMSw0NjQzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICIuLi84MDIxMWNvcmUvY3ByZWNvbXAuaCIKKyNpbmNsdWRlICJocGFuaS5oIgorI2luY2x1ZGUgImhwdXNiLmgiCisjaW5jbHVkZSAib3R1cy5pbmkiCisKK2V4dGVybiBjb25zdCB1MzJfdCB6Y0Z3SW1hZ2VbXTsKK2V4dGVybiBjb25zdCB1MzJfdCB6Y0Z3SW1hZ2VTaXplOworZXh0ZXJuIGNvbnN0IHUzMl90IHpjREtGd0ltYWdlW107CitleHRlcm4gY29uc3QgdTMyX3QgemNES0Z3SW1hZ2VTaXplOworZXh0ZXJuIGNvbnN0IHUzMl90IHpjRndJbWFnZVNQSVtdOworZXh0ZXJuIGNvbnN0IHUzMl90IHpjRndJbWFnZVNQSVNpemU7CisKKyNpZmRlZiBaTV9PVFVTX0xJTlVYX1BIQVNFXzIKK2V4dGVybiBjb25zdCB1MzJfdCB6Y0Z3QnVmSW1hZ2VbXTsKK2V4dGVybiBjb25zdCB1MzJfdCB6Y0Z3QnVmSW1hZ2VTaXplOworZXh0ZXJuIGNvbnN0IHUzMl90IHpjUDJGd0ltYWdlW107CitleHRlcm4gY29uc3QgdTMyX3QgemNQMkZ3SW1hZ2VTaXplOworI2VuZGlmCitleHRlcm4gdm9pZCB6ZkluaXRDbWRRdWV1ZSh6ZGV2X3QqIGRldik7CitleHRlcm4gdTE2X3QgemZJc3N1ZUNtZCh6ZGV2X3QqIGRldiwgdTMyX3QqIGNtZCwgdTE2X3QgY21kTGVuLAorICAgICAgICB1MTZfdCBzcmMsIHU4X3QqIGJ1Zik7CitleHRlcm4gdm9pZCB6ZklkbFJzcCh6ZGV2X3QqIGRldiwgdTMyX3QqIHJzcCwgdTE2X3QgcnNwTGVuKTsKK2V4dGVybiB1MTZfdCB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QgdmFsKTsKK2V4dGVybiB1MTZfdCB6ZkZsdXNoRGVsYXlXcml0ZSh6ZGV2X3QqIGRldik7CitleHRlcm4gdm9pZCB6ZlVzYkluaXQoemRldl90KiBkZXYpOworZXh0ZXJuIHUxNl90IHpmRmlybXdhcmVEb3dubG9hZCh6ZGV2X3QqIGRldiwgdTMyX3QqIGZ3LCB1MzJfdCBsZW4sIHUzMl90IG9mZnNldCk7CitleHRlcm4gdTE2X3QgemZGaXJtd2FyZURvd25sb2FkTm90SnVtcCh6ZGV2X3QqIGRldiwgdTMyX3QqIGZ3LCB1MzJfdCBsZW4sIHUzMl90IG9mZnNldCk7CitleHRlcm4gdm9pZCB6ZlVzYkZyZWUoemRldl90KiBkZXYpOworZXh0ZXJuIHUxNl90IHpmQ3dtSXNFeHRDaGFuQnVzeSh1MzJfdCBjdGxCdXN5LCB1MzJfdCBleHRCdXN5KTsKK2V4dGVybiB2b2lkIHpmQ29yZUN3bUJ1c3koemRldl90KiBkZXYsIHUxNl90IGJ1c3kpOworCisvKiBQcm90b3R5cGVzICovCit2b2lkIHpmSW5pdFJmKHpkZXZfdCogZGV2LCB1MzJfdCBmcmVxdWVuY3kpOwordm9pZCB6ZkluaXRQaHkoemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSwgdThfdCBidzQwKTsKK3ZvaWQgemZJbml0TWFjKHpkZXZfdCogZGV2KTsKKwordm9pZCB6ZlNldFBvd2VyQ2FsVGFibGUoemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSwgdThfdCBidzQwLCB1OF90IGV4dE9mZnNldCk7Cit2b2lkIHpmSW5pdFBvd2VyQ2FsKHpkZXZfdCogZGV2KTsKKworI2lmZGVmIFpNX0RSVl9JTklUX1VTQl9NT0RFCit2b2lkIHpmSW5pdFVzYk1vZGUoemRldl90KiBkZXYpOwordTE2X3QgemZIcFVzYlJlc2V0KHpkZXZfdCogZGV2KTsKKyNlbmRpZgorCisvKiBCYW5rIDAgMSAyIDMgNSA2IDcgKi8KK3ZvaWQgemZTZXRSZlJlZ3MoemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSk7CisvKiBCYW5rIDQgKi8KK3ZvaWQgemZTZXRCYW5rNEFuZFBvd2VyVGFibGUoemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSwgdThfdCBidzQwLAorICAgICAgICB1OF90IGV4dE9mZnNldCk7CisvKiBHZXQgcGFyYW0gZm9yIHR1cm5vZmZkeW4gKi8KK3ZvaWQgemZHZXRId1R1cm5PZmZkeW5QYXJhbSh6ZGV2X3QqIGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdCBmcmVxdWVuY3ksIHU4X3QgYnc0MCwgdThfdCBleHRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBkZWx0YV9zbG9wZV9jb2VmZl9leHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBkZWx0YV9zbG9wZV9jb2VmZl9tYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBkZWx0YV9zbG9wZV9jb2VmZl9leHBfc2hnaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGRlbHRhX3Nsb3BlX2NvZWZmX21hbl9zaGdpKTsKKwordm9pZCB6ZlNlbEFkY0Nsayh6ZGV2X3QqIGRldiwgdThfdCBidzQwLCB1MzJfdCBmcmVxdWVuY3kpOwordTMyX3QgemZIcEVjaG9Db21tYW5kKHpkZXZfdCogZGV2LCB1MzJfdCB2YWx1ZSk7CisKKworCisjZGVmaW5lIHptX2hwX3ByaXYoeCkgKCgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+eCkKK3N0cnVjdCB6c0hwUHJpdiB6Z0hwUHJpdjsKKworI2RlZmluZSBaTV9GSVJNV0FSRV9XTEFOX0FERFIgICAgICAgICAgIDB4MjAwMDAwCisjZGVmaW5lIFpNX0ZJUk1XQVJFX1NQSV9BRERSICAgICAgMHgxMTQwMDAKKy8qIDA6IHJlYWwgY2hpcCAgICAgMTogRlBHQSB0ZXN0ICovCisjZGVmaW5lIFpNX0ZQR0FfUEhZICAwCisKKyNkZWZpbmUgcmVnX3dyaXRlKGFkZHIsIHZhbCkgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBhZGRyKzB4MWJjMDAwLCB2YWwpCisjZGVmaW5lIHptX21pbihBLCBCKSAoKEE+Qik/IEI6QSkKKworCisvKioqKioqKioqKioqKioqKioqKiogSW50aWFsaXphdGlvbiAqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmSHBJbml0KHpkZXZfdCogZGV2LCB1MzJfdCBmcmVxdWVuY3kpCit7CisgICAgdTE2X3QgcmV0OworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIEluaXRpYWxpemEgSEFMIFBsdXMgcHJpdmF0ZSB2YXJpYWJsZXMgKi8KKyAgICB3ZC0+aHBQcml2YXRlID0gJnpnSHBQcml2OworCisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxDYXBhYmlsaXR5ID0gWk1fSFBfQ0FQXzExTjsKKworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aHdGcmVxdWVuY3kgPSAwOworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aHdCdzQwID0gMDsKKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmh3RXh0T2Zmc2V0ID0gMDsKKworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+ZGlzYWJsZURmc0NoID0gMDsKKworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+bGVkTW9kZVswXSA9IDE7CisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5sZWRNb2RlWzFdID0gMTsKKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPnN0cm9uZ1JTU0kgPSAwOworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+cnhTdHJvbmdSU1NJID0gMDsKKworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+c2xvdFR5cGUgPSAxOworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+YWdnUGt0TnVtID0gMHgxMDAwMGE7CisKKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmVlcHJvbUltYWdlSW5kZXggPSAwOworCisKKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmVlcHJvbUltYWdlUmRSZXEgICAgID0gMDsKKyNpZmRlZiBaTV9PVFVTX1JYX1NUUkVBTV9NT0RFCisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5yZW1haW5CdWYgPSBOVUxMOworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+dXNiUnhSZW1haW5MZW4gPSAwOworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+dXNiUnhQa3RMZW4gPSAwOworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+dXNiUnhQYWRMZW4gPSAwOworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+dXNiUnhUcmFuc2ZlckxlbiA9IDA7CisjZW5kaWYKKworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+ZW5hYmxlQkJIZWF2eUNsaXAgPSAxOworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aHdCQkhlYXZ5Q2xpcCAgICAgPSAxOyAvLyBmb3JjZSBlbmFibGUgODEwNworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+ZG9CQkhlYXZ5Q2xpcCAgICAgPSAwOworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+c2V0VmFsdWVIZWF2eUNsaXAgPSAwOworCisKKyAgICAvKiBJbml0aWFsaXplIGRyaXZlciBjb3JlICovCisgICAgemZJbml0Q21kUXVldWUoZGV2KTsKKworICAgIC8qIEluaXRpYWxpemUgVVNCICovCisgICAgemZVc2JJbml0KGRldik7CisKKyNpZiBaTV9TV19MT09QX0JBQ0sgIT0gMQorCisgICAgLyogVE9ETyA6IFtEb3dubG9hZCBGV10gKi8KKyAgICBpZiAod2QtPm1vZGVNREtFbmFibGUpCisgICAgeworICAgICAgICAvKiBkb3dubG9hZCB0aGUgTURLIGZpcm13YXJlICovCisgICAgICAgIGlmICgocmV0ID0gemZGaXJtd2FyZURvd25sb2FkKGRldiwgKHUzMl90Kil6Y0RLRndJbWFnZSwKKyAgICAgICAgICAgICAgICAodTMyX3QpemNES0Z3SW1hZ2VTaXplLCBaTV9GSVJNV0FSRV9XTEFOX0FERFIpKSAhPSBaTV9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBUT0RPIDogZXhjZXB0aW9uIGhhbmRsaW5nICovCisgICAgICAgICAgICAvL3JldHVybiAxOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgI2lmbmRlZiBaTV9PVFVTX0xJTlVYX1BIQVNFXzIKKyAgICAgICAgLyogZG9ud2xvYWQgdGhlIG5vcm1hbCBmcmltd2FyZSAqLworICAgICAgICBpZiAoKHJldCA9IHpmRmlybXdhcmVEb3dubG9hZChkZXYsICh1MzJfdCopemNGd0ltYWdlLAorICAgICAgICAgICAgICAgICh1MzJfdCl6Y0Z3SW1hZ2VTaXplLCBaTV9GSVJNV0FSRV9XTEFOX0FERFIpKSAhPSBaTV9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBUT0RPIDogZXhjZXB0aW9uIGhhbmRsaW5nICovCisgICAgICAgICAgICAvL3JldHVybiAxOworICAgICAgICB9CisgICAgI2Vsc2UKKworICAgICAgICAvLyAxLVBIIGZ3OiBSZWFkTWFjKCkgc3RvcmUgc29tZSBnbG9iYWwgdmFyaWFibGUKKyAgICAgICAgaWYgKChyZXQgPSB6ZkZpcm13YXJlRG93bmxvYWROb3RKdW1wKGRldiwgKHUzMl90Kil6Y0Z3QnVmSW1hZ2UsCisgICAgICAgICAgICAgICAgKHUzMl90KXpjRndCdWZJbWFnZVNpemUsIDB4MTAyODAwKSkgIT0gWk1fU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgRGJnUHJpbnQoIkRsIHpjRndCdWZJbWFnZSBmYWlsZWQhIik7CisgICAgICAgIH0KKworICAgICAgICB6ZndTbGVlcChkZXYsIDEwMDApOworCisgICAgICAgIGlmICgocmV0ID0gemZGaXJtd2FyZURvd25sb2FkKGRldiwgKHUzMl90Kil6Y0Z3SW1hZ2UsCisgICAgICAgICAgICAgICAgKHUzMl90KXpjRndJbWFnZVNpemUsIFpNX0ZJUk1XQVJFX1dMQU5fQUREUikpICE9IFpNX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIERiZ1ByaW50KCJEbCB6Y0Z3QnVmSW1hZ2UgZmFpbGVkISIpOworICAgICAgICB9CisgICAgI2VuZGlmCisgICAgfQorI2VuZGlmCisKKyNpZmRlZiBaTV9EUlZfSU5JVF9VU0JfTU9ERQorICAgIC8qIEluaXQgVVNCIE1vZGUgKi8KKyAgICB6ZkluaXRVc2JNb2RlKGRldik7CisKKyAgICAvKiBEbyB0aGUgVVNCIFJlc2V0ICovCisgICAgemZIcFVzYlJlc2V0KGRldik7CisjZW5kaWYKKworLyogUmVnaXN0ZXIgc2V0dGluZyAqLworLyogWk1fRFJJVkVSX01PREVMX1RZUEVfTURLCisgKiAgMT0+Zm9yIE1ESywgZGlzYWJsZSBpbml0IFJGLCBQSFksIGFuZCBNQUMsCisgKiAgMD0+bm9ybWFsIGluaXQKKyAqLworLy8jaWYgKChaTV9TV19MT09QX0JBQ0sgIT0gMSkgJiYgKFpNX0RSSVZFUl9NT0RFTF9UWVBFX01ESyAhPTEpKQorI2lmIFpNX1NXX0xPT1BfQkFDSyAhPSAxCisgICAgaWYoIXdkLT5tb2RlTURLRW5hYmxlKQorICAgIHsKKyAgICAgICAgLyogSW5pdCBNQUMgKi8KKyAgICAgICAgemZJbml0TWFjKGRldik7CisKKyAgICAjaWYgWk1fRldfTE9PUF9CQUNLICE9IDEKKyAgICAgICAgLyogSW5pdCBQSFkgKi8KKyAgICAgICAgemZJbml0UGh5KGRldiwgZnJlcXVlbmN5LCAwKTsKKworICAgICAgICAvKiBJbml0IFJGICovCisgICAgICAgIHpmSW5pdFJmKGRldiwgZnJlcXVlbmN5KTsKKworICAgICAgICAjaWYgWk1fRlBHQV9QSFkgPT0gMAorICAgICAgICAvKiBCcmluZ1VwIGlzc3VlICovCisgICAgICAgIC8vemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDk4MDArMHgxYmMwMDAsIDB4MTAwMDAwMDcpOworICAgICAgICAvL3pmRmx1c2hEZWxheVdyaXRlKGRldik7CisgICAgICAgICNlbmRpZgorCisgICAgI2VuZGlmIC8qIGVuZCBvZiBaTV9GV19MT09QX0JBQ0sgIT0gMSAqLworICAgIH0KKyNlbmRpZiAvKiBlbmQgb2YgKChaTV9TV19MT09QX0JBQ0sgIT0gMSkgJiYgKFpNX0RSSVZFUl9NT0RFTF9UWVBFX01ESyAhPTEpKSAqLworCisgICAgemZIcEVjaG9Db21tYW5kKGRldiwgMHhBQUJCQ0NERCk7CisKKyAgICByZXR1cm4gMDsKK30KKworCit1MTZfdCB6ZkhwUmVpbml0KHpkZXZfdCogZGV2LCB1MzJfdCBmcmVxdWVuY3kpCit7CisgICAgdTE2X3QgcmV0OworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUmVJbml0ID0gMTsKKworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+c3Ryb25nUlNTSSA9IDA7CisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5yeFN0cm9uZ1JTU0kgPSAwOworCisjaWZkZWYgWk1fT1RVU19SWF9TVFJFQU1fTU9ERQorICAgIGlmICgoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPnJlbWFpbkJ1ZiAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgemZ3QnVmRnJlZShkZXYsICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+cmVtYWluQnVmLCAwKTsKKyAgICB9CisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5yZW1haW5CdWYgPSBOVUxMOworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+dXNiUnhSZW1haW5MZW4gPSAwOworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+dXNiUnhQa3RMZW4gPSAwOworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+dXNiUnhQYWRMZW4gPSAwOworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+dXNiUnhUcmFuc2ZlckxlbiA9IDA7CisjZW5kaWYKKworICAgIHpmSW5pdENtZFF1ZXVlKGRldik7CisgICAgemZDb3JlUmVpbml0KGRldik7CisKKyAgICAjaWZuZGVmIFpNX09UVVNfTElOVVhfUEhBU0VfMgorICAgIC8qIERvd25sb2FkIGZpcm13YXJlICovCisgICAgaWYgKChyZXQgPSB6ZkZpcm13YXJlRG93bmxvYWQoZGV2LCAodTMyX3QqKXpjRndJbWFnZSwKKyAgICAgICAgICAgICh1MzJfdCl6Y0Z3SW1hZ2VTaXplLCBaTV9GSVJNV0FSRV9XTEFOX0FERFIpKSAhPSBaTV9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgLyogVE9ETyA6IGV4Y2VwdGlvbiBoYW5kbGluZyAqLworICAgICAgICAvL3JldHVybiAxOworICAgIH0KKyAgICAjZWxzZQorICAgIGlmICgocmV0ID0gemZGaXJtd2FyZURvd25sb2FkKGRldiwgKHUzMl90Kil6Y1AyRndJbWFnZSwKKyAgICAgICAgICAgICh1MzJfdCl6Y1AyRndJbWFnZVNpemUsIFpNX0ZJUk1XQVJFX1dMQU5fQUREUikpICE9IFpNX1NVQ0NFU1MpCisgICAgeworICAgICAgICAvKiBUT0RPIDogZXhjZXB0aW9uIGhhbmRsaW5nICovCisgICAgICAgIC8vcmV0dXJuIDE7CisgICAgfQorICAgICNlbmRpZgorCisjaWZkZWYgWk1fRFJWX0lOSVRfVVNCX01PREUKKyAgICAvKiBJbml0IFVTQiBNb2RlICovCisgICAgemZJbml0VXNiTW9kZShkZXYpOworCisgICAgLyogRG8gdGhlIFVTQiBSZXNldCAqLworICAgIHpmSHBVc2JSZXNldChkZXYpOworI2VuZGlmCisKKyAgICAvKiBJbml0IE1BQyAqLworICAgIHpmSW5pdE1hYyhkZXYpOworCisgICAgLyogSW5pdCBQSFkgKi8KKyAgICB6ZkluaXRQaHkoZGV2LCBmcmVxdWVuY3ksIDApOworICAgIC8qIEluaXQgUkYgKi8KKyAgICB6ZkluaXRSZihkZXYsIGZyZXF1ZW5jeSk7CisKKyAgICAjaWYgWk1fRlBHQV9QSFkgPT0gMAorICAgIC8qIEJyaW5nVXAgaXNzdWUgKi8KKyAgICAvL3pmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHg5ODAwKzB4MWJjMDAwLCAweDEwMDAwMDA3KTsKKyAgICAvL3pmRmx1c2hEZWxheVdyaXRlKGRldik7CisgICAgI2VuZGlmCisKKyAgICB6ZkhwRWNob0NvbW1hbmQoZGV2LCAweEFBQkJDQ0REKTsKKworICAgIHJldHVybiAwOworfQorCisKK3UxNl90IHpmSHBSZWxlYXNlKHpkZXZfdCogZGV2KQoreworICAgIC8qIEZyZWUgVVNCIHJlc291cmNlICovCisgICAgemZVc2JGcmVlKGRldik7CisKKyAgICByZXR1cm4gMDsKK30KKworLyogTURLIG1vZGUgc2V0dGluZyBmb3IgZG9udFJldHJhbnNtaXQgKi8KK3ZvaWQgemZIcENvbmZpZ0ZNKHpkZXZfdCogZGV2LCB1MzJfdCBSeE1heFNpemUsIHUzMl90IERvbnRSZXRyYW5zbWl0KQoreworICAgIHUzMl90IGNtZFszXTsKKyAgICB1MTZfdCByZXQ7CisKKyAgICBjbWRbMF0gPSA4IHwgKFpNX0NNRF9DT05GSUcgPDwgOCk7CisgICAgY21kWzFdID0gUnhNYXhTaXplOyAgICAgICAgICAvKiB6Z1J4TWF4U2l6ZSAqLworICAgIGNtZFsyXSA9IERvbnRSZXRyYW5zbWl0OyAgICAgLyogemdEb250UmV0cmFuc21pdCAqLworCisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgMTIsIFpNX09JRF9JTlRFUk5BTF9XUklURSwgMCk7Cit9CisKK2NvbnN0IHU4X3QgemNYcGRUb1BkWzE2XSA9Cit7CisgLyogMHgwLCAweDEsIDB4MiwgMHgzLCAweDQsIDB4NSwgMHg2LCAweDcsIDB4OCwgMHg5LCAweEEsIDB4QiwgMHhDLCAweEQsIDB4RSwgMHhGICovCisgICAgMHgyLCAweDIsIDB4MiwgMHgxLCAweDIsIDB4MiwgMHg2LCAweDIsIDB4MiwgMHgzLCAweDcsIDB4MiwgMHhCLCAweDIsIDB4MiwgMHgyCit9OworCisvKioqKioqKioqKioqKioqKioqKiogUkYgYW5kIFBIWSAqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCB6ZkluaXRQaHkoemRldl90KiBkZXYsICB1MzJfdCBmcmVxdWVuY3ksIHU4X3QgYnc0MCkKK3sKKyAgICB1MTZfdCBpLCBqLCBrOworICAgIHUxNl90IGVudHJpZXM7CisgICAgdTE2X3QgbW9kZXNJbmRleCA9IDA7CisgICAgdTE2X3QgZnJlcUluZGV4ID0gMDsKKyAgICB1MzJfdCB0bXAsIHRtcDE7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2PXdkLT5ocFByaXZhdGU7CisgICAgdTMyX3QgZWVwcm9tQm9hcmREYXRhWzE1XVs2XSA9IHsKKyAgICAvKiBSZWdpc3RlciAgIEEtMjAgICAgICAgIEEtMjAvNDAgICAgIEctMjAvNDAgICAgIEctMjAgICAgICAgIEctVHVyYm8gICAgKi8KKyAgICAgICAgezB4OTk2NCwgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwfSwKKyAgICAgICAgezB4OTk2MCwgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwfSwKKyAgICAgICAgezB4Yjk2MCwgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwfSwKKyAgICAgICAgezB4OTg0NCwgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwfSwKKyAgICAgICAgezB4OTg1MCwgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwfSwKKyAgICAgICAgezB4OTgzNCwgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwfSwKKyAgICAgICAgezB4OTgyOCwgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwfSwKKyAgICAgICAgezB4Yzg2NCwgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwfSwKKyAgICAgICAgezB4OTg0OCwgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwfSwKKyAgICAgICAgezB4Yjg0OCwgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwfSwKKyAgICAgICAgezB4YTIwYywgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwfSwKKyAgICAgICAgezB4YzIwYywgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwfSwKKyAgICAgICAgezB4OTkyMCwgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwfSwKKyAgICAgICAgezB4YjkyMCwgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwfSwKKyAgICAgICAgezB4YTI1OCwgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwfSwKKyAgICB9OworCisgICAgLyogIzEgU2F2ZSB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgcmVsYXRlZCBSSUZTIHJlZ2lzdGVyIHNldHRpbmdzICovCisgICAgLy8oKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmlzSW5pdGlhbFBoeSsrOworCisgICAgLyoKKyAgICAgKiBTZXR1cCB0aGUgaW5kaWNlcyBmb3IgdGhlIG5leHQgc2V0IG9mIHJlZ2lzdGVyIGFycmF5IHdyaXRlcworICAgICAqIFBIWSBtb2RlIGlzIHN0YXRpYzIwIC8gMjA0MAorICAgICAqIEZyZXF1ZW5jeSBpcyAyLjRHSHogKEIpIC8gNUdIeiAoQSkKKyAgICAgKi8KKyAgICBpZiAoIGZyZXF1ZW5jeSA+IFpNX0NIX0dfMTQgKQorICAgIHsKKyAgICAgICAgLyogNUdIeiAqLworICAgICAgICBmcmVxSW5kZXggID0gMTsKKyAgICAgICAgaWYgKGJ3NDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1vZGVzSW5kZXggPSAyOworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiaW5pdCBhcjU0MTZNb2RlcyBpbiAyOiBBLTIwLzQwIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBtb2Rlc0luZGV4ID0gMTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoImluaXQgYXI1NDE2TW9kZXMgaW4gMTogQS0yMCIpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIDIuNEdIeiAqLworICAgICAgICBmcmVxSW5kZXggID0gMjsKKyAgICAgICAgaWYgKGJ3NDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1vZGVzSW5kZXggPSAzOworICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiaW5pdCBhcjU0MTZNb2RlcyBpbiAzOiBHLTIwLzQwIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBtb2Rlc0luZGV4ID0gNDsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoImluaXQgYXI1NDE2TW9kZXMgaW4gNDogRy0yMCIpOworICAgICAgICB9CisgICAgfQorCisKKyNpZiBaTV9GUEdBX1BIWSA9PSAxCisgICAgLyogU3RhcnRpbmcgRXh0ZXJuYWwgSGFpbmFuIFJlZ2lzdGVyIEluaXRpYWxpemF0aW9uICovCisgICAgLyogVE9ETzogKi8KKworICAgIHpmd1NsZWVwKGRldiwgMTApOworI2VuZGlmCisKKyAgICAvKgorICAgICAqU2V0IGNvcnJlY3QgQmFzZWJhbmQgdG8gYW5hbG9nIHNoaWZ0IHNldHRpbmcgdG8gYWNjZXNzIGFuYWxvZyBjaGlwcy4KKyAgICAgKi8KKyAgICAvL3JlZ193cml0ZShQSFlfQkFTRSwgMHgwMDAwMDAwNyk7CisvLyAgICByZWdfd3JpdGUoMHg5ODAwLCAweDAwMDAwMDA3KTsKKworICAgIC8qCisgICAgICogV3JpdGUgYWRkYWMgc2hpZnRzCisgICAgICovCisgICAgIC8vIGRvIHRoaXMgaW4gZmlybXdhcmUKKworCisKKyAgICAvKiBaZXJvaXplIGJvYXJkIGRhdGEgKi8KKyAgICBmb3IgKGo9MDsgajwxNTsgaisrKQorICAgIHsKKyAgICAgICAgZm9yIChrPTE7IGs8PTQ7IGsrKykKKyAgICAgICAgeworICAgICAgICAgICAgZWVwcm9tQm9hcmREYXRhW2pdW2tdID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICAgLyoKKyAgICAgKiBSZWdpc3RlciBzZXR0aW5nIGJ5IG1vZGUKKyAgICAgKi8KKworICAgIGVudHJpZXMgPSBzaXplb2YoYXI1NDE2TW9kZXMpIC8gc2l6ZW9mKCphcjU0MTZNb2Rlcyk7CisgICAgem1fbXNnMV9zY2FuKFpNX0xWXzIsICJNb2RlcyByZWdpc3RlciBzZXR0aW5nIGVudHJpZXM9IiwgZW50cmllcyk7CisgICAgZm9yIChpPTA7IGk8ZW50cmllczsgaSsrKQorICAgIHsKKyNpZiAwCisgICAgICAgIGlmICggKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5od05vdEZpcnN0SW5pdCAmJiAoYXI1NDE2TW9kZXNbaV1bMF0gPT0gMHhhMjdjKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEZvcmNlIGRpc2FibGUgQ1I2NzEgYml0MjAgLyA3ODIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgLyogVGhlIGJ1ZyBoYXMgdG8gZG8gd2l0aCB0aGUgcG9sYXJpdHkgb2YgdGhlIHBkYWRjIG9mZnNldCBjYWxpYnJhdGlvbi4gIFRoZXJlICovCisgICAgICAgICAgICAvKiBpcyBhbiBpbml0aWFsIGNhbGlicmF0aW9uIHRoYXQgaXMgT0ssIGFuZCB0aGVyZSBpcyBhIGNvbnRpbnVvdXMgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIC8qIGNhbGlicmF0aW9uIHRoYXQgdXBkYXRlcyB0aGUgcGRkYWMgd2l0aCB0aGUgd3JvbmcgcG9sYXJpdHkuICBGb3J0dW5hdGVseSAgICAqLworICAgICAgICAgICAgLyogdGhlIHNlY29uZCBsb29wIGNhbiBiZSBkaXNhYmxlZCB3aXRoIGEgYml0IGNhbGxlZCBlbl9wZF9kY19vZmZzZXRfdGhyLiAgICAgICovCisKKyAgICAgICAgICAgIHJlZ193cml0ZShhcjU0MTZNb2Rlc1tpXVswXSwgKGFyNTQxNk1vZGVzW2ldW21vZGVzSW5kZXhdJiAweGZmZWZmZmZmKSApOworICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5od05vdEZpcnN0SW5pdCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisjZW5kaWYKKyAgICAgICAgICAgIC8qIEZpcnN0VGltZSBJbml0IG9yIG5vdCAweGEyN2MoQ1I2NzEpICovCisgICAgICAgICAgICByZWdfd3JpdGUoYXI1NDE2TW9kZXNbaV1bMF0sIGFyNTQxNk1vZGVzW2ldW21vZGVzSW5kZXhdKTsKKy8vICAgICAgICB9CisgICAgICAgIC8qIEluaXRpYWxpemUgYm9hcmQgZGF0YSAqLworICAgICAgICBmb3IgKGo9MDsgajwxNTsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYXI1NDE2TW9kZXNbaV1bMF0gPT0gZWVwcm9tQm9hcmREYXRhW2pdWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaz0xOyBrPD00OyBrKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlZXByb21Cb2FyZERhdGFbal1ba10gPSBhcjU0MTZNb2Rlc1tpXVtrXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogIzEgU2F2ZSB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgcmVsYXRlZCBSSUZTIHJlZ2lzdGVyIHNldHRpbmdzICovCisgICAgICAgIC8vaWYoICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aXNJbml0aWFsUGh5ID09IDEgKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2goYXI1NDE2TW9kZXNbaV1bMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAweDk4NTAgOgorICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmluaXREZXNpcmVkU2lnU2l6ZSAgICAgICAgICAgPSBhcjU0MTZNb2Rlc1tpXVttb2Rlc0luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDk4NWMgOgorICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmluaXRBR0MgICAgICAgICAgICAgICAgICAgICAgPSBhcjU0MTZNb2Rlc1tpXVttb2Rlc0luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDk4NjAgOgorICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmluaXRBZ2NDb250cm9sICAgICAgICAgICAgICAgPSBhcjU0MTZNb2Rlc1tpXVttb2Rlc0luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDk5MTggOgorICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmluaXRTZWFyY2hTdGFydERlbGF5ICAgICAgICAgPSBhcjU0MTZNb2Rlc1tpXVttb2Rlc0luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDk5ZWMgOgorICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmluaXRSSUZTU2VhcmNoUGFyYW1zICAgICAgICAgPSBhcjU0MTZNb2Rlc1tpXVttb2Rlc0luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweGEzODggOgorICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmluaXRGYXN0Q2hhbm5lbENoYW5nZUNvbnRyb2wgPSBhcjU0MTZNb2Rlc1tpXVttb2Rlc0luZGV4XTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjaWYgMAorICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisKKyAgICAvKgorICAgICAqIENvbW1vbiBSZWdpc3RlciBzZXR0aW5nCisgICAgICovCisgICAgZW50cmllcyA9IHNpemVvZihhcjU0MTZDb21tb24pIC8gc2l6ZW9mKCphcjU0MTZDb21tb24pOworICAgIGZvciAoaT0wOyBpPGVudHJpZXM7IGkrKykKKyAgICB7CisgICAgICAgIHJlZ193cml0ZShhcjU0MTZDb21tb25baV1bMF0sIGFyNTQxNkNvbW1vbltpXVsxXSk7CisgICAgfQorICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisKKyAgICAvKgorICAgICAqIFJGIEdhaW4gc2V0dGluZyBieSBmcmVxSW5kZXgKKyAgICAgKi8KKyAgICBlbnRyaWVzID0gc2l6ZW9mKGFyNTQxNkJCX1JmR2FpbikgLyBzaXplb2YoKmFyNTQxNkJCX1JmR2Fpbik7CisgICAgZm9yIChpPTA7IGk8ZW50cmllczsgaSsrKQorICAgIHsKKyAgICAgICAgcmVnX3dyaXRlKGFyNTQxNkJCX1JmR2FpbltpXVswXSwgYXI1NDE2QkJfUmZHYWluW2ldW2ZyZXFJbmRleF0pOworICAgIH0KKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworCisgICAgLyoKKyAgICAgKiBNb3ZlZCBhcjU0MTZJbml0Q2hhaW5NYXNrKCkgaGVyZSB0byBlbnN1cmUgdGhlIHN3YXAgYml0IGlzIHNldCBiZWZvcmUKKyAgICAgKiB0aGUgcGRhZGMgdGFibGUgaXMgd3JpdHRlbi4gIFN3YXAgbXVzdCBvY2N1ciBiZWZvcmUgYW55IHJhZGlvIGRlcGVuZGVudAorICAgICAqIHJlcGxpY2F0ZWQgcmVnaXN0ZXIgYWNjZXNzLiAgVGhlIHBkYWRjIGN1cnZlIGFkZHJlc3NpbmcgaW4gcGFydGljdWxhcgorICAgICAqIGRlcGVuZHMgb24gdGhlIGNvbnNpc3RlbnQgc2V0dGluZyBvZiB0aGUgc3dhcCBiaXQuCisgICAgICovCisgICAgLy9hcjU0MTZJbml0Q2hhaW5NYXNrKHBEZXYpOworCisgICAgLyogU2V0dXAgdGhlIHRyYW5zbWl0IHBvd2VyIHZhbHVlcy4gKi8KKyAgICAvLyBUT0RPCisjZW5kaWYKKworICAgIC8qIFVwZGF0ZSA1RyBib2FyZCBkYXRhICovCisgICAgLy9BbnQgY29udHJvbCBjb21tb24KKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTQ0KjIvNF07CisgICAgZWVwcm9tQm9hcmREYXRhWzBdWzFdID0gdG1wOworICAgIGVlcHJvbUJvYXJkRGF0YVswXVsyXSA9IHRtcDsKKyAgICAvL0FudCBjb250cm9sIGNoYWluIDAKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTQwKjIvNF07CisgICAgZWVwcm9tQm9hcmREYXRhWzFdWzFdID0gdG1wOworICAgIGVlcHJvbUJvYXJkRGF0YVsxXVsyXSA9IHRtcDsKKyAgICAvL0FudCBjb250cm9sIGNoYWluIDIKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTQyKjIvNF07CisgICAgZWVwcm9tQm9hcmREYXRhWzJdWzFdID0gdG1wOworICAgIGVlcHJvbUJvYXJkRGF0YVsyXVsyXSA9IHRtcDsKKyAgICAvL1N3U2V0dGxlCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE0NioyLzRdOworICAgIHRtcCA9ICh0bXAgPj4gMTYpICYgMHg3ZjsKKyAgICBlZXByb21Cb2FyZERhdGFbM11bMV0gJj0gKH4oKHUzMl90KTB4M2Y4MCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVszXVsxXSB8PSAodG1wIDw8IDcpOworI2lmIDAKKyAgICAvL3N3U2V0dGxlSHQ0MAorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNTgqMi80XTsKKyAgICB0bXAgPSAodG1wKSAmIDB4N2Y7CisgICAgZWVwcm9tQm9hcmREYXRhWzNdWzJdICY9ICh+KCh1MzJfdCkweDNmODApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbM11bMl0gfD0gKHRtcCA8PCA3KTsKKyNlbmRpZgorICAgIC8vYWRjRGVzaXJlZCwgcGRhRGVzaXJlZAorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNDgqMi80XTsKKyAgICB0bXAgPSAodG1wID4+IDI0KTsKKyAgICB0bXAxID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE0YSoyLzRdOworICAgIHRtcDEgPSB0bXAxICYgMHhmZjsKKyAgICB0bXAgPSB0bXAgKyAodG1wMTw8OCk7CisgICAgZWVwcm9tQm9hcmREYXRhWzRdWzFdICY9ICh+KCh1MzJfdCkweGZmZmYpKTsKKyAgICBlZXByb21Cb2FyZERhdGFbNF1bMV0gfD0gdG1wOworICAgIGVlcHJvbUJvYXJkRGF0YVs0XVsyXSAmPSAofigodTMyX3QpMHhmZmZmKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzRdWzJdIHw9IHRtcDsKKyAgICAvL1R4RW5kVG9YcGFPZmYsIFR4RnJhbWVUb1hwYU9uCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE0YSoyLzRdOworICAgIHRtcCA9ICh0bXAgPj4gMjQpICYgMHhmZjsKKyAgICB0bXAxID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE0YyoyLzRdOworICAgIHRtcDEgPSAodG1wMSA+PiA4KSAmIDB4ZmY7CisgICAgdG1wID0gKHRtcDw8MjQpICsgKHRtcDw8MTYpICsgKHRtcDE8PDgpICsgdG1wMTsKKyAgICBlZXByb21Cb2FyZERhdGFbNV1bMV0gPSB0bXA7CisgICAgZWVwcm9tQm9hcmREYXRhWzVdWzJdID0gdG1wOworICAgIC8vVHhFbmFUb1J4T20KKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTRjKjIvNF0gJiAweGZmOworICAgIGVlcHJvbUJvYXJkRGF0YVs2XVsxXSAmPSAofigodTMyX3QpMHhmZjAwMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbNl1bMV0gfD0gKHRtcDw8MTYpOworICAgIGVlcHJvbUJvYXJkRGF0YVs2XVsyXSAmPSAofigodTMyX3QpMHhmZjAwMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbNl1bMl0gfD0gKHRtcDw8MTYpOworICAgIC8vVGhyZXNoNjIKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTRjKjIvNF07CisgICAgdG1wID0gKHRtcCA+PiAxNikgJiAweDdmOworICAgIGVlcHJvbUJvYXJkRGF0YVs3XVsxXSAmPSAofigodTMyX3QpMHg3ZjAwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVs3XVsxXSB8PSAodG1wPDwxMik7CisgICAgZWVwcm9tQm9hcmREYXRhWzddWzJdICY9ICh+KCh1MzJfdCkweDdmMDAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzddWzJdIHw9ICh0bXA8PDEyKTsKKyAgICAvL1R4UnhBdHRlbiBjaGFpbl8wCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE0NioyLzRdOworICAgIHRtcCA9ICh0bXAgPj4gMjQpICYgMHgzZjsKKyAgICBlZXByb21Cb2FyZERhdGFbOF1bMV0gJj0gKH4oKHUzMl90KTB4M2YwMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbOF1bMV0gfD0gKHRtcDw8MTIpOworICAgIGVlcHJvbUJvYXJkRGF0YVs4XVsyXSAmPSAofigodTMyX3QpMHgzZjAwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVs4XVsyXSB8PSAodG1wPDwxMik7CisgICAgLy9UeFJ4QXR0ZW4gY2hhaW5fMgorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNDgqMi80XSAmIDB4M2Y7CisgICAgZWVwcm9tQm9hcmREYXRhWzldWzFdICY9ICh+KCh1MzJfdCkweDNmMDAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzldWzFdIHw9ICh0bXA8PDEyKTsKKyAgICBlZXByb21Cb2FyZERhdGFbOV1bMl0gJj0gKH4oKHUzMl90KTB4M2YwMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbOV1bMl0gfD0gKHRtcDw8MTIpOworICAgIC8vVHhSeE1hcmdpbiBjaGFpbl8wCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE0OCoyLzRdOworICAgIHRtcCA9ICh0bXAgPj4gOCkgJiAweDNmOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMF1bMV0gJj0gKH4oKHUzMl90KTB4ZmMwMDAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEwXVsxXSB8PSAodG1wPDwxOCk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEwXVsyXSAmPSAofigodTMyX3QpMHhmYzAwMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTBdWzJdIHw9ICh0bXA8PDE4KTsKKyAgICAvL1R4UnhNYXJnaW4gY2hhaW5fMgorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNDgqMi80XTsKKyAgICB0bXAgPSAodG1wID4+IDE2KSAmIDB4M2Y7CisgICAgZWVwcm9tQm9hcmREYXRhWzExXVsxXSAmPSAofigodTMyX3QpMHhmYzAwMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTFdWzFdIHw9ICh0bXA8PDE4KTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTFdWzJdICY9ICh+KCh1MzJfdCkweGZjMDAwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMV1bMl0gfD0gKHRtcDw8MTgpOworICAgIC8vaXFDYWxsIGNoYWluXzAsIGlxQ2FsbFEgY2hhaW5fMAorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNGUqMi80XTsKKyAgICB0bXAgPSAodG1wID4+IDI0KSAmIDB4M2Y7CisgICAgdG1wMSA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNTAqMi80XTsKKyAgICB0bXAxID0gKHRtcDEgPj4gOCkgJiAweDFmOworICAgIHRtcCAgPSAodG1wPDw1KSArIHRtcDE7CisgICAgZWVwcm9tQm9hcmREYXRhWzEyXVsxXSAmPSAofigodTMyX3QpMHg3ZmYpKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTJdWzFdIHw9ICh0bXApOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMl1bMl0gJj0gKH4oKHUzMl90KTB4N2ZmKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEyXVsyXSB8PSAodG1wKTsKKyAgICAvL2lxQ2FsbCBjaGFpbl8yLCBpcUNhbGxRIGNoYWluXzIKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTUwKjIvNF07CisgICAgdG1wID0gdG1wICYgMHgzZjsKKyAgICB0bXAxID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE1MCoyLzRdOworICAgIHRtcDEgPSAodG1wMSA+PiAxNikgJiAweDFmOworICAgIHRtcCAgPSAodG1wPDw1KSArIHRtcDE7CisgICAgZWVwcm9tQm9hcmREYXRhWzEzXVsxXSAmPSAofigodTMyX3QpMHg3ZmYpKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTNdWzFdIHw9ICh0bXApOworICAgIGVlcHJvbUJvYXJkRGF0YVsxM11bMl0gJj0gKH4oKHUzMl90KTB4N2ZmKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEzXVsyXSB8PSAodG1wKTsKKyAgICAvL2Jzd19NYXJnaW4gY2hhaW5fMAorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNTYqMi80XTsKKyAgICB0bXAgPSAodG1wID4+IDE2KSAmIDB4ZjsKKyAgICBlZXByb21Cb2FyZERhdGFbMTBdWzFdICY9ICh+KCh1MzJfdCkweDNjMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTBdWzFdIHw9ICh0bXAgPDwgMTApOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMF1bMl0gJj0gKH4oKHUzMl90KTB4M2MwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMF1bMl0gfD0gKHRtcCA8PCAxMCk7CisgICAgLy94cGQgZ2FpbiBtYXNrCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE0ZSoyLzRdOworICAgIHRtcCA9ICh0bXAgPj4gOCkgJiAweGY7CisgICAgZWVwcm9tQm9hcmREYXRhWzE0XVsxXSAmPSAofigodTMyX3QpMHhmMDAwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxNF1bMV0gfD0gKHpjWHBkVG9QZFt0bXBdIDw8IDE2KTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTRdWzJdICY9ICh+KCh1MzJfdCkweGYwMDAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzE0XVsyXSB8PSAoemNYcGRUb1BkW3RtcF0gPDwgMTYpOworI2lmIDAKKyAgICAvL2Jzd19BdHRlbiBjaGFpbl8wCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE1NioyLzRdOworICAgIHRtcCA9ICh0bXApICYgMHgxZjsKKyAgICBlZXByb21Cb2FyZERhdGFbMTBdWzFdICY9ICh+KCh1MzJfdCkweDFmKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEwXVsxXSB8PSAodG1wKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTBdWzJdICY9ICh+KCh1MzJfdCkweDFmKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEwXVsyXSB8PSAodG1wKTsKKyAgICAvL2Jzd19NYXJnaW4gY2hhaW5fMgorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNTYqMi80XTsKKyAgICB0bXAgPSAodG1wID4+IDI0KSAmIDB4ZjsKKyAgICBlZXByb21Cb2FyZERhdGFbMTFdWzFdICY9ICh+KCh1MzJfdCkweDNjMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTFdWzFdIHw9ICh0bXAgPDwgMTApOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMV1bMl0gJj0gKH4oKHUzMl90KTB4M2MwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMV1bMl0gfD0gKHRtcCA8PCAxMCk7CisgICAgLy9ic3dfQXR0ZW4gY2hhaW5fMgorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNTYqMi80XTsKKyAgICB0bXAgPSAodG1wID4+IDgpICYgMHgxZjsKKyAgICBlZXByb21Cb2FyZERhdGFbMTFdWzFdICY9ICh+KCh1MzJfdCkweDFmKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzExXVsxXSB8PSAodG1wKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTFdWzJdICY9ICh+KCh1MzJfdCkweDFmKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzExXVsyXSB8PSAodG1wKTsKKyNlbmRpZgorCisgICAgLyogVXBkYXRlIDIuNEcgYm9hcmQgZGF0YSAqLworICAgIC8vQW50IGNvbnRyb2wgY29tbW9uCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE3MCoyLzRdOworICAgIHRtcCA9IHRtcCA+PiAyNDsKKyAgICB0bXAxID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE3MioyLzRdOworICAgIHRtcCA9IHRtcCArICh0bXAxIDw8IDgpOworICAgIGVlcHJvbUJvYXJkRGF0YVswXVszXSA9IHRtcDsKKyAgICBlZXByb21Cb2FyZERhdGFbMF1bNF0gPSB0bXA7CisgICAgLy9BbnQgY29udHJvbCBjaGFpbiAwCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE2YyoyLzRdOworICAgIHRtcCA9IHRtcCA+PiAyNDsKKyAgICB0bXAxID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE2ZSoyLzRdOworICAgIHRtcCA9IHRtcCArICh0bXAxIDw8IDgpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxXVszXSA9IHRtcDsKKyAgICBlZXByb21Cb2FyZERhdGFbMV1bNF0gPSB0bXA7CisgICAgLy9BbnQgY29udHJvbCBjaGFpbiAyCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE2ZSoyLzRdOworICAgIHRtcCA9IHRtcCA+PiAyNDsKKyAgICB0bXAxID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE3MCoyLzRdOworICAgIHRtcCA9IHRtcCArICh0bXAxIDw8IDgpOworICAgIGVlcHJvbUJvYXJkRGF0YVsyXVszXSA9IHRtcDsKKyAgICBlZXByb21Cb2FyZERhdGFbMl1bNF0gPSB0bXA7CisgICAgLy9Td1NldHRsZQorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNzQqMi80XTsKKyAgICB0bXAgPSAodG1wID4+IDgpICYgMHg3ZjsKKyAgICBlZXByb21Cb2FyZERhdGFbM11bNF0gJj0gKH4oKHUzMl90KTB4M2Y4MCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVszXVs0XSB8PSAodG1wIDw8IDcpOworI2lmIDAKKyAgICAvL3N3U2V0dGxlSHQ0MAorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxODQqMi80XTsKKyAgICB0bXAgPSAodG1wID4+IDI0KSAmIDB4N2Y7CisgICAgZWVwcm9tQm9hcmREYXRhWzNdWzNdICY9ICh+KCh1MzJfdCkweDNmODApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbM11bM10gfD0gKHRtcCA8PCA3KTsKKyNlbmRpZgorICAgIC8vYWRjRGVzaXJlZCwgcGRhRGVzaXJlZAorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNzYqMi80XTsKKyAgICB0bXAgPSAodG1wID4+IDE2KSAmIDB4ZmY7CisgICAgdG1wMSA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNzYqMi80XTsKKyAgICB0bXAxID0gdG1wMSA+PiAyNDsKKyAgICB0bXAgPSB0bXAgKyAodG1wMTw8OCk7CisgICAgZWVwcm9tQm9hcmREYXRhWzRdWzNdICY9ICh+KCh1MzJfdCkweGZmZmYpKTsKKyAgICBlZXByb21Cb2FyZERhdGFbNF1bM10gfD0gdG1wOworICAgIGVlcHJvbUJvYXJkRGF0YVs0XVs0XSAmPSAofigodTMyX3QpMHhmZmZmKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzRdWzRdIHw9IHRtcDsKKyAgICAvL1R4RW5kVG9YcGFPZmYsIFR4RnJhbWVUb1hwYU9uCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE3OCoyLzRdOworICAgIHRtcCA9ICh0bXAgPj4gMTYpICYgMHhmZjsKKyAgICB0bXAxID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE3YSoyLzRdOworICAgIHRtcDEgPSB0bXAxICYgMHhmZjsKKyAgICB0bXAgPSAodG1wIDw8IDI0KSArICh0bXAgPDwgMTYpICsgKHRtcDEgPDwgOCkgKyB0bXAxOworICAgIGVlcHJvbUJvYXJkRGF0YVs1XVszXSA9IHRtcDsKKyAgICBlZXByb21Cb2FyZERhdGFbNV1bNF0gPSB0bXA7CisgICAgLy9UeEVuYVRvUnhPbQorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNzgqMi80XTsKKyAgICB0bXAgPSAodG1wID4+IDI0KTsKKyAgICBlZXByb21Cb2FyZERhdGFbNl1bM10gJj0gKH4oKHUzMl90KTB4ZmYwMDAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzZdWzNdIHw9ICh0bXA8PDE2KTsKKyAgICBlZXByb21Cb2FyZERhdGFbNl1bNF0gJj0gKH4oKHUzMl90KTB4ZmYwMDAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzZdWzRdIHw9ICh0bXA8PDE2KTsKKyAgICAvL1RocmVzaDYyCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE3YSoyLzRdOworICAgIHRtcCA9ICh0bXAgPj4gOCkgJiAweDdmOworICAgIGVlcHJvbUJvYXJkRGF0YVs3XVszXSAmPSAofigodTMyX3QpMHg3ZjAwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVs3XVszXSB8PSAodG1wPDwxMik7CisgICAgZWVwcm9tQm9hcmREYXRhWzddWzRdICY9ICh+KCh1MzJfdCkweDdmMDAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzddWzRdIHw9ICh0bXA8PDEyKTsKKyAgICAvL1R4UnhBdHRlbiBjaGFpbl8wCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE3NCoyLzRdOworICAgIHRtcCA9ICh0bXAgPj4gMTYpICYgMHgzZjsKKyAgICBlZXByb21Cb2FyZERhdGFbOF1bM10gJj0gKH4oKHUzMl90KTB4M2YwMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbOF1bM10gfD0gKHRtcDw8MTIpOworICAgIGVlcHJvbUJvYXJkRGF0YVs4XVs0XSAmPSAofigodTMyX3QpMHgzZjAwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVs4XVs0XSB8PSAodG1wPDwxMik7CisgICAgLy9UeFJ4QXR0ZW4gY2hhaW5fMgorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxNzQqMi80XTsKKyAgICB0bXAgPSAodG1wID4+IDI0KSAmIDB4M2Y7CisgICAgZWVwcm9tQm9hcmREYXRhWzldWzNdICY9ICh+KCh1MzJfdCkweDNmMDAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzldWzNdIHw9ICh0bXA8PDEyKTsKKyAgICBlZXByb21Cb2FyZERhdGFbOV1bNF0gJj0gKH4oKHUzMl90KTB4M2YwMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbOV1bNF0gfD0gKHRtcDw8MTIpOworICAgIC8vVHhSeE1hcmdpbiBjaGFpbl8wCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE3NioyLzRdOworICAgIHRtcCA9ICh0bXApICYgMHgzZjsKKyAgICBlZXByb21Cb2FyZERhdGFbMTBdWzNdICY9ICh+KCh1MzJfdCkweGZjMDAwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMF1bM10gfD0gKHRtcDw8MTgpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMF1bNF0gJj0gKH4oKHUzMl90KTB4ZmMwMDAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEwXVs0XSB8PSAodG1wPDwxOCk7CisgICAgLy9UeFJ4TWFyZ2luIGNoYWluXzIKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTc2KjIvNF07CisgICAgdG1wID0gKHRtcCA+PiA4KSAmIDB4M2Y7CisgICAgZWVwcm9tQm9hcmREYXRhWzExXVszXSAmPSAofigodTMyX3QpMHhmYzAwMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTFdWzNdIHw9ICh0bXA8PDE4KTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTFdWzRdICY9ICh+KCh1MzJfdCkweGZjMDAwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMV1bNF0gfD0gKHRtcDw8MTgpOworICAgIC8vaXFDYWxsIGNoYWluXzAsIGlxQ2FsbFEgY2hhaW5fMAorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxN2MqMi80XTsKKyAgICB0bXAgPSAodG1wID4+IDE2KSAmIDB4M2Y7CisgICAgdG1wMSA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxN2UqMi80XTsKKyAgICB0bXAxID0gKHRtcDEpICYgMHgxZjsKKyAgICB0bXAgID0gKHRtcDw8NSkgKyB0bXAxOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMl1bM10gJj0gKH4oKHUzMl90KTB4N2ZmKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEyXVszXSB8PSAodG1wKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTJdWzRdICY9ICh+KCh1MzJfdCkweDdmZikpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMl1bNF0gfD0gKHRtcCk7CisgICAgLy9pcUNhbGwgY2hhaW5fMiwgaXFDYWxsUSBjaGFpbl8yCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE3YyoyLzRdOworICAgIHRtcCA9ICh0bXA+PjI0KSAmIDB4M2Y7CisgICAgdG1wMSA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxN2UqMi80XTsKKyAgICB0bXAxID0gKHRtcDEgPj4gOCkgJiAweDFmOworICAgIHRtcCAgPSAodG1wPDw1KSArIHRtcDE7CisgICAgZWVwcm9tQm9hcmREYXRhWzEzXVszXSAmPSAofigodTMyX3QpMHg3ZmYpKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTNdWzNdIHw9ICh0bXApOworICAgIGVlcHJvbUJvYXJkRGF0YVsxM11bNF0gJj0gKH4oKHUzMl90KTB4N2ZmKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEzXVs0XSB8PSAodG1wKTsKKyAgICAvL3hwZCBnYWluIG1hc2sKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTdjKjIvNF07CisgICAgdG1wID0gdG1wICYgMHhmOworICAgIERiZ1ByaW50KCJ4cGQ9MHgleCwgcGQ9MHgleFxuIiwgdG1wLCB6Y1hwZFRvUGRbdG1wXSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzE0XVszXSAmPSAofigodTMyX3QpMHhmMDAwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxNF1bM10gfD0gKHpjWHBkVG9QZFt0bXBdIDw8IDE2KTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTRdWzRdICY9ICh+KCh1MzJfdCkweGYwMDAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzE0XVs0XSB8PSAoemNYcGRUb1BkW3RtcF0gPDwgMTYpOworI2lmIDAKKyAgICAvL2Jzd19NYXJnaW4gY2hhaW5fMAorICAgIHRtcCA9IGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxODQqMi80XTsKKyAgICB0bXAgPSAodG1wID4+IDgpICYgMHhmOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMF1bM10gJj0gKH4oKHUzMl90KTB4M2MwMCkpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMF1bM10gfD0gKHRtcCA8PCAxMCk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEwXVs0XSAmPSAofigodTMyX3QpMHgzYzAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEwXVs0XSB8PSAodG1wIDw8IDEwKTsKKyAgICAvL2Jzd19BdHRlbiBjaGFpbl8wCisgICAgdG1wID0gaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDE4MioyLzRdOworICAgIHRtcCA9ICh0bXA+PjI0KSAmIDB4MWY7CisgICAgZWVwcm9tQm9hcmREYXRhWzEwXVszXSAmPSAofigodTMyX3QpMHgxZikpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMF1bM10gfD0gKHRtcCk7CisgICAgZWVwcm9tQm9hcmREYXRhWzEwXVs0XSAmPSAofigodTMyX3QpMHgxZikpOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMF1bNF0gfD0gKHRtcCk7CisgICAgLy9ic3dfTWFyZ2luIGNoYWluXzIKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTg0KjIvNF07CisgICAgdG1wID0gKHRtcCA+PiAxNikgJiAweGY7CisgICAgZWVwcm9tQm9hcmREYXRhWzExXVszXSAmPSAofigodTMyX3QpMHgzYzAwKSk7CisgICAgZWVwcm9tQm9hcmREYXRhWzExXVszXSB8PSAodG1wIDw8IDEwKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTFdWzRdICY9ICh+KCh1MzJfdCkweDNjMDApKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTFdWzRdIHw9ICh0bXAgPDwgMTApOworICAgIC8vYnN3X0F0dGVuIGNoYWluXzIKKyAgICB0bXAgPSBocFByaXYtPmVlcHJvbUltYWdlWzB4MTAwKzB4MTg0KjIvNF07CisgICAgdG1wID0gKHRtcCkgJiAweDFmOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMV1bM10gJj0gKH4oKHUzMl90KTB4MWYpKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTFdWzNdIHw9ICh0bXApOworICAgIGVlcHJvbUJvYXJkRGF0YVsxMV1bNF0gJj0gKH4oKHUzMl90KTB4MWYpKTsKKyAgICBlZXByb21Cb2FyZERhdGFbMTFdWzRdIHw9ICh0bXApOworI2VuZGlmCisKKyNpZiAwCisgICAgZm9yIChqPTA7IGo8MTQ7IGorKykKKyAgICB7CisgICAgICAgIERiZ1ByaW50KCIlMDR4LCAlMDh4LCAlMDh4LCAlMDh4LCAlMDh4XG4iLCBlZXByb21Cb2FyZERhdGFbal1bMF0sIGVlcHJvbUJvYXJkRGF0YVtqXVsxXSwgZWVwcm9tQm9hcmREYXRhW2pdWzJdLCBlZXByb21Cb2FyZERhdGFbal1bM10sIGVlcHJvbUJvYXJkRGF0YVtqXVs0XSk7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoKGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxMTAqMi80XSYweGZmKSA9PSAweDgwKSAvL0ZFTSBUWVBFCisgICAgeworICAgICAgICAvKiBVcGRhdGUgYm9hcmQgZGF0YSB0byByZWdpc3RlcnMgKi8KKyAgICAgICAgZm9yIChqPTA7IGo8MTU7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgcmVnX3dyaXRlKGVlcHJvbUJvYXJkRGF0YVtqXVswXSwgZWVwcm9tQm9hcmREYXRhW2pdW21vZGVzSW5kZXhdKTsKKworICAgICAgICAgICAgLyogIzEgU2F2ZSB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgcmVsYXRlZCBSSUZTIHJlZ2lzdGVyIHNldHRpbmdzICovCisgICAgICAgICAgICAvL2lmKCAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmlzSW5pdGlhbFBoeSA9PSAxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2goZWVwcm9tQm9hcmREYXRhW2pdWzBdKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDk4NTAgOgorICAgICAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5pbml0RGVzaXJlZFNpZ1NpemUgICAgICAgICAgID0gZWVwcm9tQm9hcmREYXRhW2pdW21vZGVzSW5kZXhdOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHg5ODVjIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aW5pdEFHQyAgICAgICAgICAgICAgICAgICAgICA9IGVlcHJvbUJvYXJkRGF0YVtqXVttb2Rlc0luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4OTg2MCA6CisgICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmluaXRBZ2NDb250cm9sICAgICAgICAgICAgICAgPSBlZXByb21Cb2FyZERhdGFbal1bbW9kZXNJbmRleF07CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDk5MTggOgorICAgICAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5pbml0U2VhcmNoU3RhcnREZWxheSAgICAgICAgID0gZWVwcm9tQm9hcmREYXRhW2pdW21vZGVzSW5kZXhdOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHg5OWVjIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aW5pdFJJRlNTZWFyY2hQYXJhbXMgICAgICAgICA9IGVlcHJvbUJvYXJkRGF0YVtqXVttb2Rlc0luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4YTM4OCA6CisgICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmluaXRGYXN0Q2hhbm5lbENoYW5nZUNvbnRyb2wgPSBlZXByb21Cb2FyZERhdGFbal1bbW9kZXNJbmRleF07CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSAvKiBpZiAoKGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxMTAqMi80XSYweGZmKSA9PSAweDgwKSAvL0ZFTSBUWVBFICovCisKKworICAgIC8qIEJyaW5ndXAgaXNzdWUgOiBmb3JjZSB0eCBnYWluICovCisgICAgLy9yZWdfd3JpdGUoMHhhMjU4LCAweDBjYzY1MzgxKTsKKyAgICAvL3JlZ193cml0ZSgweGEyNzQsIDB4MGExYTdjMTUpOworICAgIHpmSW5pdFBvd2VyQ2FsKGRldik7CisKKyAgICBpZihmcmVxdWVuY3kgPiBaTV9DSF9HXzE0KQorICAgIHsKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFkNDAxNCwgMHg1MTQzKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFkNDAxNCwgMHg1MTYzKTsKKyAgICB9CisKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworfQorCisKK3ZvaWQgemZJbml0UmYoemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSkKK3sKKyAgICB1MzJfdCBjbWRbOF07CisgICAgdTE2X3QgcmV0OworICAgIGludCBkZWx0YV9zbG9wZV9jb2VmZl9leHA7CisgICAgaW50IGRlbHRhX3Nsb3BlX2NvZWZmX21hbjsKKyAgICBpbnQgZGVsdGFfc2xvcGVfY29lZmZfZXhwX3NoZ2k7CisgICAgaW50IGRlbHRhX3Nsb3BlX2NvZWZmX21hbl9zaGdpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem1fZGVidWdfbXNnMSgiIGluaXRSZiBmcmVxdWVuY3kgPSAiLCBmcmVxdWVuY3kpOworCisgICAgaWYgKGZyZXF1ZW5jeSA9PSAwKQorICAgIHsKKyAgICAgICAgZnJlcXVlbmN5ID0gMjQxMjsKKyAgICB9CisKKyAgICAvKiBCYW5rIDAgMSAyIDMgNSA2IDcgKi8KKyAgICB6ZlNldFJmUmVncyhkZXYsIGZyZXF1ZW5jeSk7CisgICAgLyogQmFuayA0ICovCisgICAgemZTZXRCYW5rNEFuZFBvd2VyVGFibGUoZGV2LCBmcmVxdWVuY3ksIDAsIDApOworCisgICAgLyogc3Ryb2UgZnJlcXVlbmN5ICovCisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5od0ZyZXF1ZW5jeSA9ICh1MTZfdClmcmVxdWVuY3k7CisKKyAgICB6ZkdldEh3VHVybk9mZmR5blBhcmFtKGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXF1ZW5jeSwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWx0YV9zbG9wZV9jb2VmZl9leHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVsdGFfc2xvcGVfY29lZmZfbWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlbHRhX3Nsb3BlX2NvZWZmX2V4cF9zaGdpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlbHRhX3Nsb3BlX2NvZWZmX21hbl9zaGdpKTsKKworICAgIC8qIHJlbGF0ZWQgZnVuY3Rpb25zICovCisgICAgZnJlcXVlbmN5ID0gZnJlcXVlbmN5KjEwMDA7CisgICAgY21kWzBdID0gMjggfCAoWk1fQ01EX1JGX0lOSVQgPDwgOCk7CisgICAgY21kWzFdID0gZnJlcXVlbmN5OworICAgIGNtZFsyXSA9IDA7Ly8oKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmh3X0RZTkFNSUNfSFQyMDQwX0VOOworICAgIGNtZFszXSA9IDE7Ly8oKHdkLT5FeHRPZmZzZXQgPDwgMikgfCAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmh3X0hUX0VOQUJMRSk7CisgICAgY21kWzRdID0gZGVsdGFfc2xvcGVfY29lZmZfZXhwOworICAgIGNtZFs1XSA9IGRlbHRhX3Nsb3BlX2NvZWZmX21hbjsKKyAgICBjbWRbNl0gPSBkZWx0YV9zbG9wZV9jb2VmZl9leHBfc2hnaTsKKyAgICBjbWRbN10gPSBkZWx0YV9zbG9wZV9jb2VmZl9tYW5fc2hnaTsKKworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDMyLCBaTV9PSURfSU5URVJOQUxfV1JJVEUsIDApOworCisgICAgLy8gZGVsYXkgdGVtcG9yYXJpbHksIHdhaXQgZm9yIG5ldyBQSFkgYW5kIFJGCisgICAgemZ3U2xlZXAoZGV2LCAxMDAwKTsKK30KKworaW50IHRuKGludCBleHApCit7CisgICAgaW50IGk7CisJaW50IHRtcCA9IDE7CisgICAgZm9yKGk9MDsgaTxleHA7IGkrKykKKyAgICAgICAgdG1wID0gdG1wKjI7CisKKyAgICByZXR1cm4gdG1wOworfQorCisvKmludCB6ZkZsb29yKGRvdWJsZSBpbmRhdGEpCit7CisgICBpZihpbmRhdGE8MCkKKwkgICByZXR1cm4gKGludClpbmRhdGEtMTsKKyAgIGVsc2UKKwkgICByZXR1cm4gKGludClpbmRhdGE7Cit9CisqLwordTMyX3QgcmV2ZXJzZV9iaXRzKHUzMl90IGNoYW5fc2VsKQoreworCS8qIHJldmVyc2VfYml0cyAqLworICAgIHUzMl90IGNoYW5zZWwgPSAwOworCXU4X3QgaTsKKworCWZvciAoaT0wOyBpPDg7IGkrKykKKyAgICAgICAgY2hhbnNlbCB8PSAoKGNoYW5fc2VsPj4oNy1pKSAmIDB4MSkgPDwgaSk7CisJcmV0dXJuIGNoYW5zZWw7Cit9CisKKy8qIEJhbmsgMCAxIDIgMyA1IDYgNyAqLwordm9pZCB6ZlNldFJmUmVncyh6ZGV2X3QqIGRldiwgdTMyX3QgZnJlcXVlbmN5KQoreworICAgIHUxNl90IGVudHJpZXM7CisgICAgdTE2X3QgZnJlcUluZGV4ID0gMDsKKyAgICB1MTZfdCBpOworCisgICAgLy96bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBpZiAoIGZyZXF1ZW5jeSA+IFpNX0NIX0dfMTQgKQorICAgIHsKKyAgICAgICAgLyogNUcgKi8KKyAgICAgICAgZnJlcUluZGV4ID0gMTsKKyAgICAgICAgem1fbXNnMF9zY2FuKFpNX0xWXzIsICJTZXQgdG8gNUdIeiIpOworCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIDIuNEcgKi8KKyAgICAgICAgZnJlcUluZGV4ID0gMjsKKyAgICAgICAgem1fbXNnMF9zY2FuKFpNX0xWXzIsICJTZXQgdG8gMi40R0h6Iik7CisgICAgfQorCisjaWYgMQorICAgIGVudHJpZXMgPSBzaXplb2Yob3R1c0JhbmspIC8gc2l6ZW9mKCpvdHVzQmFuayk7CisgICAgZm9yIChpPTA7IGk8ZW50cmllczsgaSsrKQorICAgIHsKKyAgICAgICAgcmVnX3dyaXRlKG90dXNCYW5rW2ldWzBdLCBvdHVzQmFua1tpXVtmcmVxSW5kZXhdKTsKKyAgICB9CisjZWxzZQorICAgIC8qIEJhbmswICovCisgICAgZW50cmllcyA9IHNpemVvZihhcjU0MTZCYW5rMCkgLyBzaXplb2YoKmFyNTQxNkJhbmswKTsKKyAgICBmb3IgKGk9MDsgaTxlbnRyaWVzOyBpKyspCisgICAgeworICAgICAgICByZWdfd3JpdGUoYXI1NDE2QmFuazBbaV1bMF0sIGFyNTQxNkJhbmswW2ldWzFdKTsKKyAgICB9CisgICAgLyogQmFuazEgKi8KKyAgICBlbnRyaWVzID0gc2l6ZW9mKGFyNTQxNkJhbmsxKSAvIHNpemVvZigqYXI1NDE2QmFuazEpOworICAgIGZvciAoaT0wOyBpPGVudHJpZXM7IGkrKykKKyAgICB7CisgICAgICAgIHJlZ193cml0ZShhcjU0MTZCYW5rMVtpXVswXSwgYXI1NDE2QmFuazFbaV1bMV0pOworICAgIH0KKyAgICAvKiBCYW5rMiAqLworICAgIGVudHJpZXMgPSBzaXplb2YoYXI1NDE2QmFuazIpIC8gc2l6ZW9mKCphcjU0MTZCYW5rMik7CisgICAgZm9yIChpPTA7IGk8ZW50cmllczsgaSsrKQorICAgIHsKKyAgICAgICAgcmVnX3dyaXRlKGFyNTQxNkJhbmsyW2ldWzBdLCBhcjU0MTZCYW5rMltpXVsxXSk7CisgICAgfQorICAgIC8qIEJhbmszICovCisgICAgZW50cmllcyA9IHNpemVvZihhcjU0MTZCYW5rMykgLyBzaXplb2YoKmFyNTQxNkJhbmszKTsKKyAgICBmb3IgKGk9MDsgaTxlbnRyaWVzOyBpKyspCisgICAgeworICAgICAgICByZWdfd3JpdGUoYXI1NDE2QmFuazNbaV1bMF0sIGFyNTQxNkJhbmszW2ldW2ZyZXFJbmRleF0pOworICAgIH0KKyAgICAvKiBCYW5rNSAqLworICAgIHJlZ193cml0ZSAoMHg5OGIwLCAgMHgwMDAwMDAxMyk7CisgICAgcmVnX3dyaXRlICgweDk4ZTQsICAweDAwMDAwMDAyKTsKKyAgICAvKiBCYW5rNiAqLworICAgIGVudHJpZXMgPSBzaXplb2YoYXI1NDE2QmFuazYpIC8gc2l6ZW9mKCphcjU0MTZCYW5rNik7CisgICAgZm9yIChpPTA7IGk8ZW50cmllczsgaSsrKQorICAgIHsKKyAgICAgICAgcmVnX3dyaXRlKGFyNTQxNkJhbms2W2ldWzBdLCBhcjU0MTZCYW5rNltpXVtmcmVxSW5kZXhdKTsKKyAgICB9CisgICAgLyogQmFuazcgKi8KKyAgICBlbnRyaWVzID0gc2l6ZW9mKGFyNTQxNkJhbms3KSAvIHNpemVvZigqYXI1NDE2QmFuazcpOworICAgIGZvciAoaT0wOyBpPGVudHJpZXM7IGkrKykKKyAgICB7CisgICAgICAgIHJlZ193cml0ZShhcjU0MTZCYW5rN1tpXVswXSwgYXI1NDE2QmFuazdbaV1bMV0pOworICAgIH0KKyNlbmRpZgorCisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKK30KKworLyogQmFuayA0ICovCit2b2lkIHpmU2V0QmFuazRBbmRQb3dlclRhYmxlKHpkZXZfdCogZGV2LCB1MzJfdCBmcmVxdWVuY3ksIHU4X3QgYnc0MCwKKyAgICAgICAgdThfdCBleHRPZmZzZXQpCit7CisgICAgdTMyX3QgY2h1cCA9IDE7CisJdTMyX3QgYm1vZGVfTEZfc3ludGhfZnJlcSA9IDA7CisJdTMyX3QgYW1vZGVfcmVmc2VsXzEgPSAwOworCXUzMl90IGFtb2RlX3JlZnNlbF8wID0gMTsKKwl1MzJfdCBhZGRyMiA9IDE7CisJdTMyX3QgYWRkcjEgPSAwOworCXUzMl90IGFkZHIwID0gMDsKKworCXUzMl90IGQxOworCXUzMl90IGQwOworCXUzMl90IHRtcF8wOworCXUzMl90IHRtcF8xOworCXUzMl90IGRhdGEwOworCXUzMl90IGRhdGExOworCisJdThfdCBjaGFuc2VsOworCXU4X3QgY2hhbl9zZWw7CisJdTMyX3QgdGVtcF9jaGFuX3NlbDsKKworICAgIHUxNl90IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKworICAgIC8qIGlmIGVuYWJsZSA4MDIuMTFoLCBuZWVkIHRvIHJlY29yZCBjdXJlbnQgY2hhbm5lbCBpbmRleCBpbiBjaGFubmVsIGFycmF5ICovCisgICAgaWYgKHdkLT5zdGEuREZTRW5hYmxlKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsID09IGZyZXF1ZW5jeSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB3ZC0+cmVndWxhdGlvblRhYmxlLkN1ckNoSW5kZXggPSBpOworICAgIH0KKworCWlmIChidzQwID09IDEpCisJeworICAgICAgICBpZiAoZXh0T2Zmc2V0ID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZyZXF1ZW5jeSArPSAxMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZyZXF1ZW5jeSAtPSAxMDsKKyAgICAgICAgfQorCisJfQorCisKKwlpZiAoIGZyZXF1ZW5jeSA+IDMwMDAgKQorCXsKKwkgICAgaWYgKCBmcmVxdWVuY3kgJSAxMCApCisJICAgIHsKKwkgICAgICAgIC8qIDVNICovCisgICAgICAgICAgICBjaGFuX3NlbCA9ICh1OF90KSgoZnJlcXVlbmN5IC0gNDgwMCkvNSk7CisgICAgICAgICAgICBjaGFuX3NlbCA9ICh1OF90KShjaGFuX3NlbCAmIDB4ZmYpOworICAgICAgICAgICAgY2hhbnNlbCAgPSAodThfdClyZXZlcnNlX2JpdHMoY2hhbl9zZWwpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogMTBNIDogaW1wcm92ZSBUeCBFVk0gKi8KKyAgICAgICAgICAgIGNoYW5fc2VsID0gKHU4X3QpKChmcmVxdWVuY3kgLSA0ODAwKS8xMCk7CisgICAgICAgICAgICBjaGFuX3NlbCA9ICh1OF90KShjaGFuX3NlbCAmIDB4ZmYpPDwxOworICAgICAgICAgICAgY2hhbnNlbCAgPSAodThfdClyZXZlcnNlX2JpdHMoY2hhbl9zZWwpOworCisJICAgICAgICBhbW9kZV9yZWZzZWxfMSA9IDE7CisJICAgICAgICBhbW9kZV9yZWZzZWxfMCA9IDA7CisgICAgICAgIH0KKwl9CisJZWxzZQorCXsKKyAgICAgICAgLy90ZW1wX2NoYW5fc2VsID0gKCgoZnJlcXVlbmN5IC0gNjcyKSoyKSAtIDMwNDApLzEwOworICAgICAgICBpZiAoZnJlcXVlbmN5ID09IDI0ODQpCisgICAgICAgIHsKKyAgIAkgICAgICAgIHRlbXBfY2hhbl9zZWwgPSAxMCArIChmcmVxdWVuY3kgLSAyMjc0KS81IDsKKyAgIAkgICAgICAgIGJtb2RlX0xGX3N5bnRoX2ZyZXEgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGVtcF9jaGFuX3NlbCA9IDE2ICsgKGZyZXF1ZW5jeSAtIDIyNzIpLzUgOworICAgICAgICAgICAgYm1vZGVfTEZfc3ludGhfZnJlcSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgY2hhbl9zZWwgPSAodThfdCkodGVtcF9jaGFuX3NlbCA8PCAyKSAmIDB4ZmY7CisgICAgICAgIGNoYW5zZWwgID0gKHU4X3QpcmV2ZXJzZV9iaXRzKGNoYW5fc2VsKTsKKwl9CisKKwlkMSAgID0gY2hhbnNlbDsgICAvLyMgOCBiaXRzIG9mIGNoYW4KKwlkMCAgID0gYWRkcjA8PDcgfCBhZGRyMTw8NiB8IGFkZHIyPDw1CisJCQl8IGFtb2RlX3JlZnNlbF8wPDwzIHwgYW1vZGVfcmVmc2VsXzE8PDIKKwkJCXwgYm1vZGVfTEZfc3ludGhfZnJlcTw8MSB8IGNodXA7CisKKyAgICB0bXBfMCA9IGQwICYgMHgxZjsgIC8vIyA1LTEKKyAgICB0bXBfMSA9IGQxICYgMHgxZjsgIC8vIyA1LTEKKyAgICBkYXRhMCA9IHRtcF8xPDw1IHwgdG1wXzA7CisKKyAgICB0bXBfMCA9IGQwPj41ICYgMHg3OyAgLy8jIDgtNgorICAgIHRtcF8xID0gZDE+PjUgJiAweDc7ICAvLyMgOC02CisgICAgZGF0YTEgPSB0bXBfMTw8NSB8IHRtcF8wOworCisgICAgLyogQmFuazQgKi8KKwlyZWdfd3JpdGUgKDB4OTgwMCsoMHgyYzw8MiksIGRhdGEwKTsKKwlyZWdfd3JpdGUgKDB4OTgwMCsoMHgzYTw8MiksIGRhdGExKTsKKwkvL3ptX2RlYnVnX21zZzEoIjB4OTgwMCsoMHgyYzw8MiA9ICAiLCBkYXRhMCk7CisJLy96bV9kZWJ1Z19tc2cxKCIweDk4MDArKDB4M2E8PDIgPSAgIiwgZGF0YTEpOworCisKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworCisgICAgemZ3U2xlZXAoZGV2LCAxMCk7CisKKyAgICByZXR1cm47Cit9CisKKworc3RydWN0IHpzUGh5RnJlcVBhcmEKK3sKKyAgICB1MzJfdCBjb2VmZl9leHA7CisgICAgdTMyX3QgY29lZmZfbWFuOworICAgIHUzMl90IGNvZWZmX2V4cF9zaGdpOworICAgIHUzMl90IGNvZWZmX21hbl9zaGdpOworfTsKKworc3RydWN0IHpzUGh5RnJlcVRhYmxlCit7CisgICAgdTMyX3QgZnJlcXVlbmN5OworICAgIHN0cnVjdCB6c1BoeUZyZXFQYXJhIEZwZ2FEeW5hbWljSFQ7CisgICAgc3RydWN0IHpzUGh5RnJlcVBhcmEgRnBnYVN0YXRpY0hUOworICAgIHN0cnVjdCB6c1BoeUZyZXFQYXJhIENoaXBTVDIwTWh6OworICAgIHN0cnVjdCB6c1BoeUZyZXFQYXJhIENoaXAyMDQwTWh6OworICAgIHN0cnVjdCB6c1BoeUZyZXFQYXJhIENoaXAyMDQwRXh0QWJvdmU7Cit9OworCitjb25zdCBzdHJ1Y3QgenNQaHlGcmVxVGFibGUgemdQaHlGcmVxQ29lZmZbXSA9Cit7CisvKkluZGV4ICAgZnJlcSAgRlBHQSBEWU5BTUlDX0hUMjA0MF9FTiAgRlBHQSBTVEFUSUNfSFQyMCAgICBSZWFsIENoaXAgc3RhdGljMjBNSHogICAgIFJlYWwgQ2hpcCAyMDQwTUh6ICAgUmVhbCBDaGlwIDIwNDBNaHogICovCisgICAgICAgLyogZmNsayA9ICAgICAgICAgMTAuOCAgICAgICAgICAgICAgICAyMS42ICAgICAgICAgICAgICAgICAgNDAgICAgICAgICAgICAgICAgICBleHQgYmVsb3cgNDAgICAgICAgZXh0IGFib3ZlIDQwICAgICAgICovCisvKiAgMCAqLyB7MjQxMiwgezUsIDIzNDc2LCA1LCAyMTEyOH0sIHs0LCAyMzQ3NiwgNCwgMjExMjh9LCB7MywgMjE3MzcsIDMsIDE5NTYzfSwgezMsIDIxODI3LCAzLCAxOTY0NH0sIHszLCAyMTY0NywgMywgMTk0ODJ9fSwKKy8qICAxICovIHsyNDE3LCB7NSwgMjM0MjcsIDUsIDIxMDg0fSwgezQsIDIzNDI3LCA0LCAyMTA4NH0sIHszLCAyMTY5MiwgMywgMTk1MjN9LCB7MywgMjE3ODIsIDMsIDE5NjA0fSwgezMsIDIxNjAyLCAzLCAxOTQ0Mn19LAorLyogIDIgKi8gezI0MjIsIHs1LCAyMzM3OSwgNSwgMjEwNDF9LCB7NCwgMjMzNzksIDQsIDIxMDQxfSwgezMsIDIxNjQ3LCAzLCAxOTQ4Mn0sIHszLCAyMTczNywgMywgMTk1NjN9LCB7MywgMjE1NTgsIDMsIDE5NDAyfX0sCisvKiAgMyAqLyB7MjQyNywgezUsIDIzMzMwLCA1LCAyMDk5N30sIHs0LCAyMzMzMCwgNCwgMjA5OTd9LCB7MywgMjE2MDIsIDMsIDE5NDQyfSwgezMsIDIxNjkyLCAzLCAxOTUyM30sIHszLCAyMTUxNCwgMywgMTkzNjJ9fSwKKy8qICA0ICovIHsyNDMyLCB7NSwgMjMyODMsIDUsIDIwOTU0fSwgezQsIDIzMjgzLCA0LCAyMDk1NH0sIHszLCAyMTU1OCwgMywgMTk0MDJ9LCB7MywgMjE2NDcsIDMsIDE5NDgyfSwgezMsIDIxNDcwLCAzLCAxOTMyM319LAorLyogIDUgKi8gezI0MzcsIHs1LCAyMzIzNSwgNSwgMjA5MTF9LCB7NCwgMjMyMzUsIDQsIDIwOTExfSwgezMsIDIxNTE0LCAzLCAxOTM2Mn0sIHszLCAyMTYwMiwgMywgMTk0NDJ9LCB7MywgMjE0MjYsIDMsIDE5MjgzfX0sCisvKiAgNiAqLyB7MjQ0MiwgezUsIDIzMTg3LCA1LCAyMDg2OH0sIHs0LCAyMzE4NywgNCwgMjA4Njh9LCB7MywgMjE0NzAsIDMsIDE5MzIzfSwgezMsIDIxNTU4LCAzLCAxOTQwMn0sIHszLCAyMTM4MiwgMywgMTkyNDR9fSwKKy8qICA3ICovIHsyNDQ3LCB7NSwgMjMxNDAsIDUsIDIwODI2fSwgezQsIDIzMTQwLCA0LCAyMDgyNn0sIHszLCAyMTQyNiwgMywgMTkyODN9LCB7MywgMjE1MTQsIDMsIDE5MzYyfSwgezMsIDIxMzM5LCAzLCAxOTIwNX19LAorLyogIDggKi8gezI0NTIsIHs1LCAyMzA5MywgNSwgMjA3ODN9LCB7NCwgMjMwOTMsIDQsIDIwNzgzfSwgezMsIDIxMzgyLCAzLCAxOTI0NH0sIHszLCAyMTQ3MCwgMywgMTkzMjN9LCB7MywgMjEyOTUsIDMsIDE5MTY2fX0sCisvKiAgOSAqLyB7MjQ1NywgezUsIDIzMDQ2LCA1LCAyMDc0MX0sIHs0LCAyMzA0NiwgNCwgMjA3NDF9LCB7MywgMjEzMzksIDMsIDE5MjA1fSwgezMsIDIxNDI2LCAzLCAxOTI4M30sIHszLCAyMTI1MiwgMywgMTkxMjd9fSwKKy8qIDEwICovIHsyNDYyLCB7NSwgMjI5OTksIDUsIDIwNjk5fSwgezQsIDIyOTk5LCA0LCAyMDY5OX0sIHszLCAyMTI5NSwgMywgMTkxNjZ9LCB7MywgMjEzODIsIDMsIDE5MjQ0fSwgezMsIDIxMjA5LCAzLCAxOTA4OH19LAorLyogMTEgKi8gezI0NjcsIHs1LCAyMjk1MiwgNSwgMjA2NTd9LCB7NCwgMjI5NTIsIDQsIDIwNjU3fSwgezMsIDIxMjUyLCAzLCAxOTEyN30sIHszLCAyMTMzOSwgMywgMTkyMDV9LCB7MywgMjExNjYsIDMsIDE5MDUwfX0sCisvKiAxMiAqLyB7MjQ3MiwgezUsIDIyOTA2LCA1LCAyMDYxNX0sIHs0LCAyMjkwNiwgNCwgMjA2MTV9LCB7MywgMjEyMDksIDMsIDE5MDg4fSwgezMsIDIxMjk1LCAzLCAxOTE2Nn0sIHszLCAyMTEyNCwgMywgMTkwMTF9fSwKKy8qIDEzICovIHsyNDg0LCB7NSwgMjI3OTUsIDUsIDIwNTE2fSwgezQsIDIyNzk1LCA0LCAyMDUxNn0sIHszLCAyMTEwNywgMywgMTg5OTZ9LCB7MywgMjExOTIsIDMsIDE5MDczfSwgezMsIDIxMDIyLCAzLCAxODkyMH19LAorLyogMTQgKi8gezQ5MjAsIHs2LCAyMzAxOCwgNiwgMjA3MTZ9LCB7NSwgMjMwMTgsIDUsIDIwNzE2fSwgezQsIDIxMzEzLCA0LCAxOTE4MX0sIHs0LCAyMTM1NiwgNCwgMTkyMjB9LCB7NCwgMjEyNjksIDQsIDE5MTQyfX0sCisvKiAxNSAqLyB7NDk0MCwgezYsIDIyOTI0LCA2LCAyMDYzMn0sIHs1LCAyMjkyNCwgNSwgMjA2MzJ9LCB7NCwgMjEyMjYsIDQsIDE5MTA0fSwgezQsIDIxMjY5LCA0LCAxOTE0Mn0sIHs0LCAyMTE4MywgNCwgMTkwNjV9fSwKKy8qIDE2ICovIHs0OTYwLCB7NiwgMjI4MzIsIDYsIDIwNTQ5fSwgezUsIDIyODMyLCA1LCAyMDU0OX0sIHs0LCAyMTE0MSwgNCwgMTkwMjd9LCB7NCwgMjExODMsIDQsIDE5MDY1fSwgezQsIDIxMDk4LCA0LCAxODk4OH19LAorLyogMTcgKi8gezQ5ODAsIHs2LCAyMjc0MCwgNiwgMjA0NjZ9LCB7NSwgMjI3NDAsIDUsIDIwNDY2fSwgezQsIDIxMDU2LCA0LCAxODk1MH0sIHs0LCAyMTA5OCwgNCwgMTg5ODh9LCB7NCwgMjEwMTQsIDQsIDE4OTEyfX0sCisvKiAxOCAqLyB7NTA0MCwgezYsIDIyNDY5LCA2LCAyMDIyM30sIHs1LCAyMjQ2OSwgNSwgMjAyMjN9LCB7NCwgMjA4MDUsIDQsIDE4NzI1fSwgezQsIDIwODQ2LCA0LCAxODc2Mn0sIHs0LCAyMDc2NCwgNCwgMTg2ODd9fSwKKy8qIDE5ICovIHs1MDYwLCB7NiwgMjIzODEsIDYsIDIwMTQzfSwgezUsIDIyMzgxLCA1LCAyMDE0M30sIHs0LCAyMDcyMywgNCwgMTg2NTF9LCB7NCwgMjA3NjQsIDQsIDE4Njg3fSwgezQsIDIwNjgyLCA0LCAxODYxNH19LAorLyogMjAgKi8gezUwODAsIHs2LCAyMjI5MywgNiwgMjAwNjN9LCB7NSwgMjIyOTMsIDUsIDIwMDYzfSwgezQsIDIwNjQxLCA0LCAxODU3N30sIHs0LCAyMDY4MiwgNCwgMTg2MTR9LCB7NCwgMjA2MDEsIDQsIDE4NTQxfX0sCisvKiAyMSAqLyB7NTE4MCwgezYsIDIxODYyLCA2LCAxOTY3Nn0sIHs1LCAyMTg2MiwgNSwgMTk2NzZ9LCB7NCwgMjAyNDMsIDQsIDE4MjE5fSwgezQsIDIwMjgyLCA0LCAxODI1NH0sIHs0LCAyMDIwNCwgNCwgMTgxODN9fSwKKy8qIDIyICovIHs1MjAwLCB7NiwgMjE3NzgsIDYsIDE5NjAwfSwgezUsIDIxNzc4LCA1LCAxOTYwMH0sIHs0LCAyMDE2NSwgNCwgMTgxNDh9LCB7NCwgMjAyMDQsIDQsIDE4MTgzfSwgezQsIDIwMTI2LCA0LCAxODExNH19LAorLyogMjMgKi8gezUyMjAsIHs2LCAyMTY5NSwgNiwgMTk1MjV9LCB7NSwgMjE2OTUsIDUsIDE5NTI1fSwgezQsIDIwMDg4LCA0LCAxODA3OX0sIHs0LCAyMDEyNiwgNCwgMTgxMTR9LCB7NCwgMjAwNDksIDQsIDE4MDQ0fX0sCisvKiAyNCAqLyB7NTI0MCwgezYsIDIxNjEyLCA2LCAxOTQ1MX0sIHs1LCAyMTYxMiwgNSwgMTk0NTF9LCB7NCwgMjAwMTEsIDQsIDE4MDEwfSwgezQsIDIwMDQ5LCA0LCAxODA0NH0sIHs0LCAxOTk3MywgNCwgMTc5NzZ9fSwKKy8qIDI1ICovIHs1MjYwLCB7NiwgMjE1MzAsIDYsIDE5Mzc3fSwgezUsIDIxNTMwLCA1LCAxOTM3N30sIHs0LCAxOTkzNSwgNCwgMTc5NDF9LCB7NCwgMTk5NzMsIDQsIDE3OTc2fSwgezQsIDE5ODk3LCA0LCAxNzkwN319LAorLyogMjYgKi8gezUyODAsIHs2LCAyMTQ0OCwgNiwgMTkzMDN9LCB7NSwgMjE0NDgsIDUsIDE5MzAzfSwgezQsIDE5ODU5LCA0LCAxNzg3M30sIHs0LCAxOTg5NywgNCwgMTc5MDd9LCB7NCwgMTk4MjIsIDQsIDE3ODQwfX0sCisvKiAyNyAqLyB7NTMwMCwgezYsIDIxMzY3LCA2LCAxOTIzMH0sIHs1LCAyMTM2NywgNSwgMTkyMzB9LCB7NCwgMTk3ODQsIDQsIDE3ODA2fSwgezQsIDE5ODIyLCA0LCAxNzg0MH0sIHs0LCAxOTc0NywgNCwgMTc3NzJ9fSwKKy8qIDI4ICovIHs1MzIwLCB7NiwgMjEyODcsIDYsIDE5MTU4fSwgezUsIDIxMjg3LCA1LCAxOTE1OH0sIHs0LCAxOTcxMCwgNCwgMTc3Mzl9LCB7NCwgMTk3NDcsIDQsIDE3NzcyfSwgezQsIDE5NjczLCA0LCAxNzcwNn19LAorLyogMjkgKi8gezU1MDAsIHs2LCAyMDU5MCwgNiwgMTg1MzF9LCB7NSwgMjA1OTAsIDUsIDE4NTMxfSwgezQsIDE5MDY1LCA0LCAxNzE1OX0sIHs0LCAxOTEwMCwgNCwgMTcxOTB9LCB7NCwgMTkwMzAsIDQsIDE3MTI3fX0sCisvKiAzMCAqLyB7NTUyMCwgezYsIDIwNTE2LCA2LCAxODQ2NH0sIHs1LCAyMDUxNiwgNSwgMTg0NjR9LCB7NCwgMTg5OTYsIDQsIDE3MDk2fSwgezQsIDE5MDMwLCA0LCAxNzEyN30sIHs0LCAxODk2MiwgNCwgMTcwNjV9fSwKKy8qIDMxICovIHs1NTQwLCB7NiwgMjA0NDIsIDYsIDE4Mzk3fSwgezUsIDIwNDQyLCA1LCAxODM5N30sIHs0LCAxODkyNywgNCwgMTcwMzV9LCB7NCwgMTg5NjIsIDQsIDE3MDY1fSwgezQsIDE4ODkzLCA0LCAxNzAwNH19LAorLyogMzIgKi8gezU1NjAsIHs2LCAyMDM2OCwgNiwgMTgzMzF9LCB7NSwgMjAzNjgsIDUsIDE4MzMxfSwgezQsIDE4ODU5LCA0LCAxNjk3M30sIHs0LCAxODg5MywgNCwgMTcwMDR9LCB7NCwgMTg4MjUsIDQsIDE2OTQzfX0sCisvKiAzMyAqLyB7NTU4MCwgezYsIDIwMjk1LCA2LCAxODI2Nn0sIHs1LCAyMDI5NSwgNSwgMTgyNjZ9LCB7NCwgMTg3OTIsIDQsIDE2OTEzfSwgezQsIDE4ODI1LCA0LCAxNjk0M30sIHs0LCAxODc1OCwgNCwgMTY4ODJ9fSwKKy8qIDM0ICovIHs1NjAwLCB7NiwgMjAyMjMsIDYsIDE4MjAwfSwgezUsIDIwMjIzLCA1LCAxODIwMH0sIHs0LCAxODcyNSwgNCwgMTY4NTJ9LCB7NCwgMTg3NTgsIDQsIDE2ODgyfSwgezQsIDE4NjkxLCA0LCAxNjgyMn19LAorLyogMzUgKi8gezU2MjAsIHs2LCAyMDE1MSwgNiwgMTgxMzZ9LCB7NSwgMjAxNTEsIDUsIDE4MTM2fSwgezQsIDE4NjU4LCA0LCAxNjc5Mn0sIHs0LCAxODY5MSwgNCwgMTY4MjJ9LCB7NCwgMTg2MjUsIDQsIDE2NzYyfX0sCisvKiAzNiAqLyB7NTY0MCwgezYsIDIwMDc5LCA2LCAxODA3MX0sIHs1LCAyMDA3OSwgNSwgMTgwNzF9LCB7NCwgMTg1OTIsIDQsIDE2NzMzfSwgezQsIDE4NjI1LCA0LCAxNjc2Mn0sIHs0LCAxODU1OSwgNCwgMTY3MDN9fSwKKy8qIDM3ICovIHs1NjYwLCB7NiwgMjAwMDgsIDYsIDE4MDA3fSwgezUsIDIwMDA4LCA1LCAxODAwN30sIHs0LCAxODUyNiwgNCwgMTY2NzN9LCB7NCwgMTg1NTksIDQsIDE2NzAzfSwgezQsIDE4NDkzLCA0LCAxNjY0NH19LAorLyogMzggKi8gezU2ODAsIHs2LCAxOTkzOCwgNiwgMTc5NDR9LCB7NSwgMTk5MzgsIDUsIDE3OTQ0fSwgezQsIDE4NDYxLCA0LCAxNjYxNX0sIHs0LCAxODQ5MywgNCwgMTY2NDR9LCB7NCwgMTg0MjgsIDQsIDE2NTg2fX0sCisvKiAzOSAqLyB7NTcwMCwgezYsIDE5ODY4LCA2LCAxNzg4MX0sIHs1LCAxOTg2OCwgNSwgMTc4ODF9LCB7NCwgMTgzOTYsIDQsIDE2NTU2fSwgezQsIDE4NDI4LCA0LCAxNjU4Nn0sIHs0LCAxODM2NCwgNCwgMTY1Mjd9fSwKKy8qIDQwICovIHs1NzQ1LCB7NiwgMTk3MTIsIDYsIDE3NzQxfSwgezUsIDE5NzEyLCA1LCAxNzc0MX0sIHs0LCAxODI1MiwgNCwgMTY0Mjd9LCB7NCwgMTgyODQsIDQsIDE2NDU1fSwgezQsIDE4MjIwLCA0LCAxNjM5OH19LAorLyogNDEgKi8gezU3NjUsIHs2LCAxOTY0NCwgNiwgMTc2Nzl9LCB7NSwgMTk2NDQsIDUsIDE3Njc5fSwgezQsIDE4MTg5LCA1LCAzMjc0MH0sIHs0LCAxODIyMCwgNCwgMTYzOTh9LCB7NCwgMTgxNTcsIDUsIDMyNjgzfX0sCisvKiA0MiAqLyB7NTc4NSwgezYsIDE5NTc2LCA2LCAxNzYxOH0sIHs1LCAxOTU3NiwgNSwgMTc2MTh9LCB7NCwgMTgxMjYsIDUsIDMyNjI2fSwgezQsIDE4MTU3LCA1LCAzMjY4M30sIHs0LCAxODA5NCwgNSwgMzI1NzB9fSwKKy8qIDQzICovIHs1ODA1LCB7NiwgMTk1MDgsIDYsIDE3NTU4fSwgezUsIDE5NTA4LCA1LCAxNzU1OH0sIHs0LCAxODA2MywgNSwgMzI1MTR9LCB7NCwgMTgwOTQsIDUsIDMyNTcwfSwgezQsIDE4MDMyLCA1LCAzMjQ1OH19LAorLyogNDQgKi8gezU4MjUsIHs2LCAxOTQ0MSwgNiwgMTc0OTd9LCB7NSwgMTk0NDEsIDUsIDE3NDk3fSwgezQsIDE4MDAxLCA1LCAzMjQwMn0sIHs0LCAxODAzMiwgNSwgMzI0NTh9LCB7NCwgMTc5NzAsIDUsIDMyMzQ3fX0sCisvKiA0NSAqLyB7NTE3MCwgezYsIDIxOTA0LCA2LCAxOTcxNH0sIHs1LCAyMTkwNCwgNSwgMTk3MTR9LCB7NCwgMjAyODIsIDQsIDE4MjU0fSwgezQsIDIwMzIxLCA0LCAxODI4OX0sIHs0LCAyMDI0MywgNCwgMTgyMTl9fSwKKy8qIDQ2ICovIHs1MTkwLCB7NiwgMjE4MjAsIDYsIDE5NjM4fSwgezUsIDIxODIwLCA1LCAxOTYzOH0sIHs0LCAyMDIwNCwgNCwgMTgxODN9LCB7NCwgMjAyNDMsIDQsIDE4MjE5fSwgezQsIDIwMTY1LCA0LCAxODE0OH19LAorLyogNDcgKi8gezUyMTAsIHs2LCAyMTczNiwgNiwgMTk1NjN9LCB7NSwgMjE3MzYsIDUsIDE5NTYzfSwgezQsIDIwMTI2LCA0LCAxODExNH0sIHs0LCAyMDE2NSwgNCwgMTgxNDh9LCB7NCwgMjAwODgsIDQsIDE4MDc5fX0sCisvKiA0OCAqLyB7NTIzMCwgezYsIDIxNjUzLCA2LCAxOTQ4OH0sIHs1LCAyMTY1MywgNSwgMTk0ODh9LCB7NCwgMjAwNDksIDQsIDE4MDQ0fSwgezQsIDIwMDg4LCA0LCAxODA3OX0sIHs0LCAyMDAxMSwgNCwgMTgwMTB9fQorfTsKKy8qIHRvIHJlZHVjZSBzZWFyY2ggdGltZSwgcGxlYXNlIG1vZGlmeSB0aGlzIGRlZmluZSBpZiB5b3UgYWRkIG9yIGRlbGV0ZSBjaGFubmVsIGluIHRhYmxlICovCisjZGVmaW5lIEZpcnN0NUdDaGFubmVsSW5kZXggMTQKKwordm9pZCB6ZkdldEh3VHVybk9mZmR5blBhcmFtKHpkZXZfdCogZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90IGZyZXF1ZW5jeSwgdThfdCBidzQwLCB1OF90IGV4dE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGRlbHRhX3Nsb3BlX2NvZWZmX2V4cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGRlbHRhX3Nsb3BlX2NvZWZmX21hbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGRlbHRhX3Nsb3BlX2NvZWZmX2V4cF9zaGdpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZGVsdGFfc2xvcGVfY29lZmZfbWFuX3NoZ2kpCit7CisgICAgLyogR2V0IHBhcmFtIGZvciB0dXJub2ZmZHluICovCisgICAgdTE2X3QgaSwgYXJyYXlTaXplOworCisgICAgLy96bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBhcnJheVNpemUgPSBzaXplb2YoemdQaHlGcmVxQ29lZmYpL3NpemVvZihzdHJ1Y3QgenNQaHlGcmVxVGFibGUpOworICAgIGlmIChmcmVxdWVuY3kgPCAzMDAwKQorICAgIHsKKyAgICAgICAgLyogMi40R0h6IENoYW5uZWwgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEZpcnN0NUdDaGFubmVsSW5kZXg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZyZXF1ZW5jeSA9PSB6Z1BoeUZyZXFDb2VmZltpXS5mcmVxdWVuY3kpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaSA8IEZpcnN0NUdDaGFubmVsSW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX21zZzFfc2NhbihaTV9MVl8wLCAiVW5zdXBwb3J0ZWQgMi40RyBmcmVxdWVuY3kgPSAiLCBmcmVxdWVuY3kpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIDVHSHogQ2hhbm5lbCAqLworICAgICAgICBmb3IgKGkgPSBGaXJzdDVHQ2hhbm5lbEluZGV4OyBpIDwgYXJyYXlTaXplOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmcmVxdWVuY3kgPT0gemdQaHlGcmVxQ29lZmZbaV0uZnJlcXVlbmN5KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGkgPCBhcnJheVNpemUpCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX21zZzFfc2NhbihaTV9MVl8wLCAiVW5zdXBwb3J0ZWQgNUcgZnJlcXVlbmN5ID0gIiwgZnJlcXVlbmN5KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEZQR0EgRFlOQU1JQ19IVDIwNDBfRU4gICAgICAgIGZjbGsgPSAxMC44ICAqLworICAgIC8qIEZQR0EgU1RBVElDX0hUMjBfICAgICAgICAgICAgIGZjbGsgPSAyMS42ICAqLworICAgIC8qIFJlYWwgQ2hpcCAgICAgICAgICAgICAgICAgICAgIGZjbGsgPSA0MCAgICAqLworICAgICNpZiBaTV9GUEdBX1BIWSA9PSAxCisgICAgLy9mY2xrID0gMTAuODsKKyAgICAqZGVsdGFfc2xvcGVfY29lZmZfZXhwID0gemdQaHlGcmVxQ29lZmZbaV0uRnBnYUR5bmFtaWNIVC5jb2VmZl9leHA7CisgICAgKmRlbHRhX3Nsb3BlX2NvZWZmX21hbiA9IHpnUGh5RnJlcUNvZWZmW2ldLkZwZ2FEeW5hbWljSFQuY29lZmZfbWFuOworICAgICpkZWx0YV9zbG9wZV9jb2VmZl9leHBfc2hnaSA9IHpnUGh5RnJlcUNvZWZmW2ldLkZwZ2FEeW5hbWljSFQuY29lZmZfZXhwX3NoZ2k7CisgICAgKmRlbHRhX3Nsb3BlX2NvZWZmX21hbl9zaGdpID0gemdQaHlGcmVxQ29lZmZbaV0uRnBnYUR5bmFtaWNIVC5jb2VmZl9tYW5fc2hnaTsKKyAgICAjZWxzZQorICAgIC8vZmNsayA9IDQwOworICAgIGlmIChidzQwKQorICAgIHsKKyAgICAgICAgLyogaHQyMDQwICovCisgICAgICAgIGlmIChleHRPZmZzZXQgPT0gMSkgeworICAgICAgICAgICAgKmRlbHRhX3Nsb3BlX2NvZWZmX2V4cCA9IHpnUGh5RnJlcUNvZWZmW2ldLkNoaXAyMDQwRXh0QWJvdmUuY29lZmZfZXhwOworICAgICAgICAgICAgKmRlbHRhX3Nsb3BlX2NvZWZmX21hbiA9IHpnUGh5RnJlcUNvZWZmW2ldLkNoaXAyMDQwRXh0QWJvdmUuY29lZmZfbWFuOworICAgICAgICAgICAgKmRlbHRhX3Nsb3BlX2NvZWZmX2V4cF9zaGdpID0gemdQaHlGcmVxQ29lZmZbaV0uQ2hpcDIwNDBFeHRBYm92ZS5jb2VmZl9leHBfc2hnaTsKKyAgICAgICAgICAgICpkZWx0YV9zbG9wZV9jb2VmZl9tYW5fc2hnaSA9IHpnUGh5RnJlcUNvZWZmW2ldLkNoaXAyMDQwRXh0QWJvdmUuY29lZmZfbWFuX3NoZ2k7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAqZGVsdGFfc2xvcGVfY29lZmZfZXhwID0gemdQaHlGcmVxQ29lZmZbaV0uQ2hpcDIwNDBNaHouY29lZmZfZXhwOworICAgICAgICAgICAgKmRlbHRhX3Nsb3BlX2NvZWZmX21hbiA9IHpnUGh5RnJlcUNvZWZmW2ldLkNoaXAyMDQwTWh6LmNvZWZmX21hbjsKKyAgICAgICAgICAgICpkZWx0YV9zbG9wZV9jb2VmZl9leHBfc2hnaSA9IHpnUGh5RnJlcUNvZWZmW2ldLkNoaXAyMDQwTWh6LmNvZWZmX2V4cF9zaGdpOworICAgICAgICAgICAgKmRlbHRhX3Nsb3BlX2NvZWZmX21hbl9zaGdpID0gemdQaHlGcmVxQ29lZmZbaV0uQ2hpcDIwNDBNaHouY29lZmZfbWFuX3NoZ2k7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogc3RhdGljIDIwICovCisgICAgICAgICpkZWx0YV9zbG9wZV9jb2VmZl9leHAgPSB6Z1BoeUZyZXFDb2VmZltpXS5DaGlwU1QyME1oei5jb2VmZl9leHA7CisgICAgICAgICpkZWx0YV9zbG9wZV9jb2VmZl9tYW4gPSB6Z1BoeUZyZXFDb2VmZltpXS5DaGlwU1QyME1oei5jb2VmZl9tYW47CisgICAgICAgICpkZWx0YV9zbG9wZV9jb2VmZl9leHBfc2hnaSA9IHpnUGh5RnJlcUNvZWZmW2ldLkNoaXBTVDIwTWh6LmNvZWZmX2V4cF9zaGdpOworICAgICAgICAqZGVsdGFfc2xvcGVfY29lZmZfbWFuX3NoZ2kgPSB6Z1BoeUZyZXFDb2VmZltpXS5DaGlwU1QyME1oei5jb2VmZl9tYW5fc2hnaTsKKyAgICB9CisgICAgI2VuZGlmCit9CisKKy8qIE1haW4gcm91dGluIGZyZXF1ZW5jeSBzZXR0aW5nIGZ1bmN0aW9uICovCisvKiBJZiAyLjRHLzVHIHN3aXRjaCwgUEhZIG5lZWQgcmVzZXR0aW5nIEJCIGFuZCBSRiBmb3IgYmFuZCBzd2l0Y2ggKi8KKy8qIERvIHRoZSBzZXR0aW5nIHN3aXRjaCBpbiB6ZlNlbmRGcmVxdWVuY3lDbWQoKSAqLwordm9pZCB6ZkhwU2V0RnJlcXVlbmN5RXgoemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSwgdThfdCBidzQwLAorICAgICAgICB1OF90IGV4dE9mZnNldCwgdThfdCBpbml0UkYpCit7CisgICAgdTMyX3QgY21kWzldOworICAgIHUzMl90IGNtZEJbM107CisgICAgdTE2X3QgcmV0OworICAgIHU4X3Qgb2xkX2JhbmQ7CisgICAgdThfdCBuZXdfYmFuZDsKKyAgICB1MzJfdCBjaGVja0xvb3BDb3VudDsKKyAgICB1MzJfdCB0bXBWYWx1ZTsKKworICAgIGludCBkZWx0YV9zbG9wZV9jb2VmZl9leHA7CisgICAgaW50IGRlbHRhX3Nsb3BlX2NvZWZmX21hbjsKKyAgICBpbnQgZGVsdGFfc2xvcGVfY29lZmZfZXhwX3NoZ2k7CisgICAgaW50IGRlbHRhX3Nsb3BlX2NvZWZmX21hbl9zaGdpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2ID0gd2QtPmhwUHJpdmF0ZTsKKworICAgIHptX21zZzFfc2NhbihaTV9MVl8xLCAiRnJlcXVlbmN5ID0gIiwgZnJlcXVlbmN5KTsKKyAgICB6bV9tc2cxX3NjYW4oWk1fTFZfMSwgImJ3NDAgPSAiLCBidzQwKTsKKyAgICB6bV9tc2cxX3NjYW4oWk1fTFZfMSwgImV4dE9mZnNldCA9ICIsIGV4dE9mZnNldCk7CisKKyAgICBpZiAoIGhwUHJpdi0+Y29sZFJlc2V0TmVlZEZyZXEgKQorICAgIHsKKyAgICAgICAgaHBQcml2LT5jb2xkUmVzZXROZWVkRnJlcSA9IDA7CisgICAgICAgIGluaXRSRiA9IDI7CisgICAgICAgIHptX2RlYnVnX21zZzAoInpmSHBTZXRGcmVxdWVuY3lFeDogRG8gQ29sZFJlc2V0ICIpOworICAgIH0KKyAgICBpZiAoIGhwUHJpdi0+aXNTaXRlU3VydmV5ID09IDIgKQorICAgIHsKKyAgICAgICAgLyogd2FpdCB0aW1lIGZvciBBR0MgYW5kIG5vaXNlIGNhbGlicmF0aW9uIDogbm90IGluIHNpdGVzdXJ2ZXkgYW5kIGNvbm5lY3RlZCAqLworICAgICAgICBjaGVja0xvb3BDb3VudCA9IDIwMDA7IC8qIDIwMDAqMTAwID0gMjAwbXMgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogd2FpdCB0aW1lIGZvciBBR0MgYW5kIG5vaXNlIGNhbGlicmF0aW9uIDogaW4gc2l0ZXN1cnZleSAqLworICAgICAgICBjaGVja0xvb3BDb3VudCA9IDEwMDA7IC8qIDEwMDAqMTAwID0gMTAwbXMgKi8KKyAgICB9CisKKyAgICBocFByaXYtPmxhdGVzdEZyZXF1ZW5jeSA9IGZyZXF1ZW5jeTsKKyAgICBocFByaXYtPmxhdGVzdEJ3NDAgPSBidzQwOworICAgIGhwUHJpdi0+bGF0ZXN0RXh0T2Zmc2V0ID0gZXh0T2Zmc2V0OworCisgICAgaWYgKChocFByaXYtPmRvdDExTW9kZSA9PSBaTV9IQUxfODAyMTFfTU9ERV9JQlNTX0dFTkVSQUwpIHx8CisgICAgICAgIChocFByaXYtPmRvdDExTW9kZSA9PSBaTV9IQUxfODAyMTFfTU9ERV9JQlNTX1dQQTJQU0spKQorICAgIHsKKyAgICAgICAgaWYgKCBmcmVxdWVuY3kgPD0gWk1fQ0hfR18xNCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHdvcmthcm91bmQgZm9yIDExZyBBZCBIb2MgYmVhY29uIGRpc3RyaWJ1dGlvbiAqLworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0FDMF9DVywgMHg3ZjAwMDcpOworICAgICAgICAgICAgLy96ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQUMxX0FDMF9BSUZTLCAweDFjMDQ5MDFjKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEFIQiwgREFDLCBBREMgY2xvY2sgc2VsZWN0aW9uIGJ5IHN0YXRpYzIwL2h0MjA0MCAqLworICAgIHpmU2VsQWRjQ2xrKGRldiwgYnc0MCwgZnJlcXVlbmN5KTsKKworICAgIC8qIGNsZWFyIGJiX2hlYXZ5X2NsaXBfZW5hYmxlICovCisgICAgcmVnX3dyaXRlKDB4OTllMCwgMHgyMDApOworICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisKKyAgICAvKiBTZXQgQ1RTL1JUUyByYXRlICovCisgICAgaWYgKCBmcmVxdWVuY3kgPiBaTV9DSF9HXzE0ICkKKyAgICB7CisgICAgICAgIC8vemZIcFNldFJUU0NUU1JhdGUoZGV2LCAweDEwYjAxMGIpOyAgLyogT0ZETSA2TSAqLworCSAgICBuZXdfYmFuZCA9IDE7CisJfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vemZIcFNldFJUU0NUU1JhdGUoZGV2LCAweDMwMDAzKTsgIC8qIENDSyAxMU0gKi8KKyAgICAgICAgbmV3X2JhbmQgPSAwOworICAgIH0KKworICAgIGlmICgoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmh3RnJlcXVlbmN5ID4gWk1fQ0hfR18xNCkKKyAgICAgICAgb2xkX2JhbmQgPSAxOworICAgIGVsc2UKKyAgICAgICAgb2xkX2JhbmQgPSAwOworCisgICAgLy9Xb3JrYXJvdW5kIGZvciAyLjRHSHogb25seSBkZXZpY2UKKyAgICBpZiAoKGhwUHJpdi0+T3BGbGFncyAmIDB4MSkgPT0gMCkKKyAgICB7CisgICAgICAgIGlmICgoKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5od0ZyZXF1ZW5jeSA9PSBaTV9DSF9HXzEpICYmIChmcmVxdWVuY3kgPT0gWk1fQ0hfR18yKSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRm9yY2UgdG8gZG8gYmFuZCBzd2l0Y2hpbmcgKi8KKyAgICAgICAgICAgIG9sZF9iYW5kID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIE5vdGlmeSBjaGFubmVsIHN3aXRjaCB0byBmaXJtd2FyZSAqLworICAgIC8qIFRYL1JYIG11c3QgYmUgc3RvcHBlZCBieSBub3cgKi8KKyAgICBjbWRbMF0gPSAwIHwgKFpNX0NNRF9GUkVRX1NUUkFUIDw8IDgpOworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDgsIFpNX09JRF9JTlRFUk5BTF9XUklURSwgMCk7CisKKyAgICBpZiAoKGluaXRSRiAhPSAwKSB8fCAobmV3X2JhbmQgIT0gb2xkX2JhbmQpCisgICAgICAgICAgICB8fCAoKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5od0J3NDAgIT0gYnc0MCkpCisgICAgeworICAgICAgICAvKiBiYW5kIHN3aXRjaCAqLworICAgICAgICB6bV9tc2cwX3NjYW4oWk1fTFZfMSwgIj09PT09YmFuZCBzd2l0Y2g9PT09PSIpOworCisgICAgICAgIGlmIChpbml0UkYgPT0gMiApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vQ29sZCByZXNldCBCQi9BRERBCisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWQ0MDA0LCAweDgwMCk7CisgICAgICAgICAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworICAgICAgICAgICAgem1fbXNnMF9zY2FuKFpNX0xWXzEsICJEbyBjb2xkIHJlc2V0IEJCL0FEREEiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vV2FybSByZXNldCBCQi9BRERBCisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWQ0MDA0LCAweDQwMCk7CisgICAgICAgICAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworICAgICAgICB9CisKKyAgICAgICAgLyogcmVzZXQgd29ya2Fyb3VuZCBzdGF0ZSB0byBkZWZhdWx0ICovCisgICAgICAgIGhwUHJpdi0+cnhTdHJvbmdSU1NJID0gMDsKKyAgICAgICAgaHBQcml2LT5zdHJvbmdSU1NJID0gMDsKKworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWQ0MDA0LCAweDApOworICAgICAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworCisgICAgICAgIHpmSW5pdFBoeShkZXYsIGZyZXF1ZW5jeSwgYnc0MCk7CisKKy8vICAgICAgICB6ZmlDaGVja1JpZnMoZGV2KTsKKworICAgICAgICAvKiBCYW5rIDAgMSAyIDMgNSA2IDcgKi8KKyAgICAgICAgemZTZXRSZlJlZ3MoZGV2LCBmcmVxdWVuY3kpOworICAgICAgICAvKiBCYW5rIDQgKi8KKyAgICAgICAgemZTZXRCYW5rNEFuZFBvd2VyVGFibGUoZGV2LCBmcmVxdWVuY3ksIGJ3NDAsIGV4dE9mZnNldCk7CisKKyAgICAgICAgY21kWzBdID0gMzIgfCAoWk1fQ01EX1JGX0lOSVQgPDwgOCk7CisgICAgfQorICAgIGVsc2UgLy8oKG5ld19iYW5kID09IG9sZF9iYW5kKSAmJiAhaW5pdFJGKQorICAgIHsKKyAgICAgICAvKiBzYW1lIGJhbmQgKi8KKworICAgICAgIC8qIEZvcmNlIGRpc2FibGUgQ1I2NzEgYml0MjAgLyA3ODIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgIC8qIFRoZSBidWcgaGFzIHRvIGRvIHdpdGggdGhlIHBvbGFyaXR5IG9mIHRoZSBwZGFkYyBvZmZzZXQgY2FsaWJyYXRpb24uICBUaGVyZSAqLworICAgICAgIC8qIGlzIGFuIGluaXRpYWwgY2FsaWJyYXRpb24gdGhhdCBpcyBPSywgYW5kIHRoZXJlIGlzIGEgY29udGludW91cyAgICAgICAgICAgICAqLworICAgICAgIC8qIGNhbGlicmF0aW9uIHRoYXQgdXBkYXRlcyB0aGUgcGRkYWMgd2l0aCB0aGUgd3JvbmcgcG9sYXJpdHkuICBGb3J0dW5hdGVseSAgICAqLworICAgICAgIC8qIHRoZSBzZWNvbmQgbG9vcCBjYW4gYmUgZGlzYWJsZWQgd2l0aCBhIGJpdCBjYWxsZWQgZW5fcGRfZGNfb2Zmc2V0X3Roci4gICAgICAqLworI2lmIDAKKyAgICAgICAgY21kQlswXSA9IDggfCAoWk1fQ01EX0JJVEFORCA8PCA4KTs7CisgICAgICAgIGNtZEJbMV0gPSAoMHhhMjdjICsgMHgxYmMwMDApOworICAgICAgICBjbWRCWzJdID0gMHhmZmVmZmZmZjsKKyAgICAgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZEIsIDEyLCBaTV9PSURfSU5URVJOQUxfV1JJVEUsIDApOworI2VuZGlmCisKKyAgICAgICAvKiBCYW5rIDQgKi8KKyAgICAgICB6ZlNldEJhbms0QW5kUG93ZXJUYWJsZShkZXYsIGZyZXF1ZW5jeSwgYnc0MCwgZXh0T2Zmc2V0KTsKKworCisgICAgICAgIGNtZFswXSA9IDMyIHwgKFpNX0NNRF9GUkVRVUVOQ1kgPDwgOCk7CisgICAgfQorCisgICAgLyogQ29tcGF0aWJpbGl0eSBmb3IgbmV3IGxheW91dCBVQjgzICovCisgICAgLyogU2V0dGluZyBjb2RlIGF0IENSMSBoZXJlIG1vdmUgZnJvbSB0aGUgZnVuYzp6Zkh3SFRFbmFibGUoKSBpbiBmaXJtd2FyZSAqLworICAgIGlmICgoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbENhcGFiaWxpdHkgJiBaTV9IUF9DQVBfMTFOX09ORV9UWF9TVFJFQU0pCisgICAgeworICAgICAgICAvKiBVQjgzIDogb25lIHN0cmVhbSAqLworICAgICAgICB0bXBWYWx1ZSA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFVCODEsIFVCODIgOiB0d28gc3RyZWFtICovCisgICAgICAgIHRtcFZhbHVlID0gMHgxMDA7CisgICAgfQorCisgICAgaWYgKDEpIC8vaWYgKCgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aHdfSFRfRU5BQkxFID09IDEpCisJeworICAgICAgICBpZiAoYnc0MCA9PSAxKQorCQl7CisJCQlpZiAoZXh0T2Zmc2V0ID09IDEpIHsKKyAgICAgICAgICAgIAlyZWdfd3JpdGUoMHg5ODA0LCB0bXBWYWx1ZSB8IDB4MmQ0KTsgLy8zZDQgZm9yIHJlYWwKKwkJCX0KKwkJCWVsc2UgeworCQkJCXJlZ193cml0ZSgweDk4MDQsIHRtcFZhbHVlIHwgMHgyYzQpOyAgIC8vM2M0IGZvciByZWFsCisJCQl9CisJCQkvLyMgRHluIEhUMjA0MC5SZWZlciB0byBSZWcgMS4KKyAgICAgICAgICAgIC8vI1szXTpzaW5nbGUgbGVuZ3RoICg0dXMpIDFzdCBIVCBsb25nIHRyYWluaW5nIHN5bWJvbDsgdXNlIFdhbHNoIHNwYXRpYWwgc3ByZWFkaW5nIGZvciAyIGNoYWlucyAyIHN0cmVhbXMgVFgKKyAgICAgICAgICAgIC8vI1tjXTphbGxvdyBzaG9ydCBHSSBmb3IgSFQ0MCBwYWNrZXRzOyBlbmFibGUgSFQgZGV0ZWN0aW9uLgorICAgICAgICAgICAgLy8jWzRdOmVuYWJsZSAyMC80MCBNSHogY2hhbm5lbCBkZXRlY3Rpb24uCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorCSAgICB7CisgICAgICAgICAgICByZWdfd3JpdGUoMHg5ODA0LCB0bXBWYWx1ZSB8IDB4MjQwKTsKKwkJICAgIC8vIyBTdGF0aWMgSFQyMAorICAgICAgICAgICAgLy8jWzNdOnNpbmdsZSBsZW5ndGggKDR1cykgMXN0IEhUIGxvbmcgdHJhaW5pbmcgc3ltYm9sOyB1c2UgV2Fsc2ggc3BhdGlhbCBzcHJlYWRpbmcgZm9yIDIgY2hhaW5zIDIgc3RyZWFtcyBUWAorICAgICAgICAgICAgLy8jWzRdOk90dXMgZG9uJ3QgYWxsb3cgc2hvcnQgR0kgZm9yIEhUMjAgcGFja2V0cyB5ZXQ7IGVuYWJsZSBIVCBkZXRlY3Rpb24uCisgICAgICAgICAgICAvLyNbMF06ZGlzYWJsZSAyMC80MCBNSHogY2hhbm5lbCBkZXRlY3Rpb24uCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorCXsKKyAgICAgICAgcmVnX3dyaXRlKDB4OTgwNCwgMHgwKTsKKwkJLy8jIExlZ2FjeTsjIERpcmVjdCBNYXBwaW5nIGZvciBlYWNoIGNoYWluLgorICAgICAgICAvLyNCZSBtb2RpZmllZCBieSBPbGlnbyB0byBhZGQgZHluYW5pYyBmb3IgbGVnYWN5LgorICAgICAgICBpZiAoYnc0MCA9PSAxKQorCQl7CisgICAgICAgICAgICByZWdfd3JpdGUoMHg5ODA0LCAweDQpOyAgICAgLy8jIER5biBMZWdhY3kgLlJlZmVyIHRvIHJlZyAxLgorICAgICAgICB9CisgICAgICAgIGVsc2UKKwkJeworICAgICAgICAgICAgcmVnX3dyaXRlKDB4OTgwNCwgMHgwKTsgICAgLy8jIFN0YXRpYyBMZWdhY3kKKyAgICAgICAgfQorCX0KKwl6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworCS8qIGVuZCBvZiB1YjgzIGNvbXBhdGliaWxpdHkgKi8KKworICAgIC8qIFNldCBQb3dlciwgVFBDLCBHYWluIHRhYmxlLi4uICovCisJemZTZXRQb3dlckNhbFRhYmxlKGRldiwgZnJlcXVlbmN5LCBidzQwLCBleHRPZmZzZXQpOworCisKKyAgICAvKiBzdG9yZSBmcmVxdWVuY3kgKi8KKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmh3RnJlcXVlbmN5ID0gKHUxNl90KWZyZXF1ZW5jeTsKKyAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmh3Qnc0MCA9IGJ3NDA7CisgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5od0V4dE9mZnNldCA9IGV4dE9mZnNldDsKKworICAgIHpmR2V0SHdUdXJuT2ZmZHluUGFyYW0oZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmN5LCBidzQwLCBleHRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVsdGFfc2xvcGVfY29lZmZfZXhwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlbHRhX3Nsb3BlX2NvZWZmX21hbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWx0YV9zbG9wZV9jb2VmZl9leHBfc2hnaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWx0YV9zbG9wZV9jb2VmZl9tYW5fc2hnaSk7CisKKyAgICAvKiByZWxhdGVkIGZ1bmN0aW9ucyAqLworICAgIGZyZXF1ZW5jeSA9IGZyZXF1ZW5jeSoxMDAwOworICAgIC8qIGxlblszNl0gOiB0eXBlWzB4MzBdIDogc2VxWz9dICovCisvLyAgICBjbWRbMF0gPSAyOCB8IChaTV9DTURfRlJFUVVFTkNZIDw8IDgpOworICAgIGNtZFsxXSA9IGZyZXF1ZW5jeTsKKyAgICBjbWRbMl0gPSBidzQwOy8vKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5od19EWU5BTUlDX0hUMjA0MF9FTjsKKyAgICBjbWRbM10gPSAoZXh0T2Zmc2V0PDwyKXwweDE7Ly8oKHdkLT5FeHRPZmZzZXQgPDwgMikgfCAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmh3X0hUX0VOQUJMRSk7CisgICAgY21kWzRdID0gZGVsdGFfc2xvcGVfY29lZmZfZXhwOworICAgIGNtZFs1XSA9IGRlbHRhX3Nsb3BlX2NvZWZmX21hbjsKKyAgICBjbWRbNl0gPSBkZWx0YV9zbG9wZV9jb2VmZl9leHBfc2hnaTsKKyAgICBjbWRbN10gPSBkZWx0YV9zbG9wZV9jb2VmZl9tYW5fc2hnaTsKKyAgICBjbWRbOF0gPSBjaGVja0xvb3BDb3VudDsKKworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDM2LCBaTV9DTURfU0VUX0ZSRVFVRU5DWSwgMCk7CisKKyAgICAvLyBkZWxheSB0ZW1wb3JhcmlseSwgd2FpdCBmb3IgbmV3IFBIWSBhbmQgUkYKKyAgICAvL3pmd1NsZWVwKGRldiwgMTAwMCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqIEtleSAqKioqKioqKioqKioqKioqKioqKi8KKwordTE2X3QgemZIcFJlc2V0S2V5Q2FjaGUoemRldl90KiBkZXYpCit7CisgICAgdThfdCBpOworICAgIHUzMl90IGtleVs0XSA9IHswLCAwLCAwLCAwfTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdj13ZC0+aHBQcml2YXRlOworCisgICAgZm9yKGk9MDtpPDQ7aSsrKQorICAgIHsKKyAgICAgICAgemZIcFNldERlZmF1bHRLZXkoZGV2LCBpLCBaTV9XRVA2NCwga2V5LCBOVUxMKTsKKyAgICB9CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX1JPTExfQ0FMTF9UQkxfTCwgMHgwMCk7CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX1JPTExfQ0FMTF9UQkxfSCwgMHgwMCk7CisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKworICAgIGhwUHJpdi0+Y2FtUm9sbENhbGxUYWJsZSA9ICh1NjRfdCkgMDsKKworICAgIHJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlNldEtleSAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU2V0IGtleS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMCA6IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG90aGVyIDogZmFpbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA2LjEgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAhIHBsZWFzZSB1c2UgemZDb3JlU2V0S2V5KCkgaW4gODAyMTFDb3JlIGZvciBTZXRLZXkgKi8KK3UzMl90IHpmSHBTZXRLZXkoemRldl90KiBkZXYsIHU4X3QgdXNlciwgdThfdCBrZXlJZCwgdThfdCB0eXBlLAorICAgICAgICB1MTZfdCogbWFjLCB1MzJfdCoga2V5KQoreworICAgIHUzMl90IGNtZFsoWk1fTUFYX0NNRF9TSVpFLzQpXTsKKyAgICB1MTZfdCByZXQ7CisgICAgdTE2X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdj13ZC0+aHBQcml2YXRlOworCisjaWYgMCAgIC8qIHJlbW92ZSB0byB6ZkNvcmVTZXRLZXkoKSAqLworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHdkLT5zdGEuZmxhZ0tleUNoYW5naW5nKys7CisgICAgem1fZGVidWdfbXNnMSgiICAgemZIcFNldEtleSsrKysgIiwgd2QtPnN0YS5mbGFnS2V5Q2hhbmdpbmcpOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisjZW5kaWYKKworICAgIGNtZFswXSA9IDB4MDAwMDI4MUM7CisgICAgY21kWzFdID0gKCh1MzJfdClrZXlJZDw8MTYpICsgKHUzMl90KXVzZXI7CisgICAgY21kWzJdID0gKCh1MzJfdCltYWNbMF08PDE2KSArICh1MzJfdCl0eXBlOworICAgIGNtZFszXSA9ICgodTMyX3QpbWFjWzJdPDwxNikgKyAoKHUzMl90KW1hY1sxXSk7CisKKyAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgeworICAgICAgICBjbWRbNCtpXSA9IGtleVtpXTsKKyAgICB9CisKKyAgICBpZiAodXNlciA8IDY0KQorICAgIHsKKyAgICAgICAgaHBQcml2LT5jYW1Sb2xsQ2FsbFRhYmxlIHw9ICgodTY0X3QpIDEpIDw8IHVzZXI7CisgICAgfQorCisgICAgLy9yZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCAzMiwgWk1fT0lEX0lOVEVSTkFMX1dSSVRFLCBOVUxMKTsKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCAzMiwgWk1fQ01EX1NFVF9LRVksIE5VTEwpOworICAgIHJldHVybiByZXQ7Cit9CisKKwordTMyX3QgemZIcFNldEFwUGFpcndpc2VLZXkoemRldl90KiBkZXYsIHUxNl90KiBzdGFNYWNBZGRyLCB1OF90IHR5cGUsCisgICAgICAgIHUzMl90KiBrZXksIHUzMl90KiBtaWNLZXksIHUxNl90IHN0YUFpZCkKK3sKKyAgICBpZiAoKHN0YUFpZCE9MCkgJiYgKHN0YUFpZDw2NCkpCisgICAgeworICAgICAgICB6ZkhwU2V0S2V5KGRldiwgKHN0YUFpZC0xKSwgMCwgdHlwZSwgc3RhTWFjQWRkciwga2V5KTsKKyAgICAgICAgICAgICAgICBpZiAoKHR5cGUgPT0gWk1fVEtJUCkKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICAgfHwgKHR5cGUgPT0gWk1fQ0VOQykKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICkKKyAgICAgICAgICAgIHpmSHBTZXRLZXkoZGV2LCAoc3RhQWlkLTEpLCAxLCB0eXBlLCBzdGFNYWNBZGRyLCBtaWNLZXkpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKK3UzMl90IHpmSHBTZXRBcEdyb3VwS2V5KHpkZXZfdCogZGV2LCB1MTZfdCogYXBNYWNBZGRyLCB1OF90IHR5cGUsCisgICAgICAgIHUzMl90KiBrZXksIHUzMl90KiBtaWNLZXksIHUxNl90IHZhcElkKQoreworICAgIHpmSHBTZXRLZXkoZGV2LCBaTV9VU0VSX0tFWV9ERUZBVUxUIC0gMSAtIHZhcElkLCAwLCB0eXBlLCBhcE1hY0FkZHIsIGtleSk7CS8vIDZEMTggbW9kaWZ5IGZyb20gMCB0byAxID8/CisgICAgICAgICAgICBpZiAoKHR5cGUgPT0gWk1fVEtJUCkKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgICAgICAgfHwgKHR5cGUgPT0gWk1fQ0VOQykKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisgICAgICAgICAgICkKKyAgICAgICAgemZIcFNldEtleShkZXYsIFpNX1VTRVJfS0VZX0RFRkFVTFQgLSAxIC0gdmFwSWQsIDEsIHR5cGUsIGFwTWFjQWRkciwgbWljS2V5KTsKKyAgICByZXR1cm4gMDsKK30KKwordTMyX3QgemZIcFNldERlZmF1bHRLZXkoemRldl90KiBkZXYsIHU4X3Qga2V5SWQsIHU4X3QgdHlwZSwgdTMyX3QqIGtleSwgdTMyX3QqIG1pY0tleSkKK3sKKyAgICB1MTZfdCBtYWNBZGRyWzNdID0gezAsIDAsIDB9OworCisgICAgI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1dQQTJQU0sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXYgPSB3ZC0+aHBQcml2YXRlOworCisgICAgaWYgKCBocFByaXYtPmRvdDExTW9kZSA9PSBaTV9IQUxfODAyMTFfTU9ERV9JQlNTX1dQQTJQU0sgKQorICAgIHsgLyogSWYgbm90IHdwYTJwc2sgLCB1c2UgdHJhZGl0aW9uYWwgKi8KKyAgICAgIC8qIEJlY2F1c2UgdGhlIGJ1ZyBvZiBjaGlwICwgZGVmYXVsdGtleSBzaG91bGQgZm9sbG93IHRoZSBrZXkgbWFwIHJ1bGUgaW4gcmVnaXN0ZXIgNzAwICovCisgICAgICAgIGlmICgga2V5SWQgPT0gMCApCisgICAgICAgICAgICB6ZkhwU2V0S2V5KGRldiwgWk1fVVNFUl9LRVlfREVGQVVMVCtrZXlJZCwgMCwgdHlwZSwgbWFjQWRkciwga2V5KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgemZIcFNldEtleShkZXYsIFpNX1VTRVJfS0VZX0RFRkFVTFQra2V5SWQsIDEsIHR5cGUsIG1hY0FkZHIsIGtleSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgemZIcFNldEtleShkZXYsIFpNX1VTRVJfS0VZX0RFRkFVTFQra2V5SWQsIDAsIHR5cGUsIG1hY0FkZHIsIGtleSk7CisgICAgI2Vsc2UKKyAgICAgICAgemZIcFNldEtleShkZXYsIFpNX1VTRVJfS0VZX0RFRkFVTFQra2V5SWQsIDAsIHR5cGUsIG1hY0FkZHIsIGtleSk7CisgICAgI2VuZGlmCisgICAgICAgICAgICBpZiAoKHR5cGUgPT0gWk1fVEtJUCkKKworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgICAgICB8fCAodHlwZSA9PSBaTV9DRU5DKQorI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgICAgKQorICAgIHsKKyAgICAgICAgemZIcFNldEtleShkZXYsIFpNX1VTRVJfS0VZX0RFRkFVTFQra2V5SWQsIDEsIHR5cGUsIG1hY0FkZHIsIG1pY0tleSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3UzMl90IHpmSHBTZXRQZXJVc2VyS2V5KHpkZXZfdCogZGV2LCB1OF90IHVzZXIsIHU4X3Qga2V5SWQsIHU4X3QqIG1hYywgdThfdCB0eXBlLCB1MzJfdCoga2V5LCB1MzJfdCogbWljS2V5KQoreworI2lmZGVmIFpNX0VOQUJMRV9JQlNTX1dQQTJQU0sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXYgPSB3ZC0+aHBQcml2YXRlOworCisgICAgaWYgKCBocFByaXYtPmRvdDExTW9kZSA9PSBaTV9IQUxfODAyMTFfTU9ERV9JQlNTX1dQQTJQU0sgKQorICAgIHsgLyogSWYgbm90IHdwYTJwc2sgLCB1c2UgdHJhZGl0aW9uYWwgKi8KKyAgICAgICAgaWYoa2V5SWQpCisgICAgICAgIHsgIC8qIFNldCBHcm91cCBLZXkgKi8KKyAgICAgICAgICAgIHpmSHBTZXRLZXkoZGV2LCB1c2VyLCAxLCB0eXBlLCAodTE2X3QgKiltYWMsIGtleSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZihrZXlJZCA9PSAwKQorICAgICAgICB7ICAvKiBTZXQgUGFpcndpc2UgS2V5ICovCisgICAgICAgICAgICB6ZkhwU2V0S2V5KGRldiwgdXNlciwgMCwgdHlwZSwgKHUxNl90ICopbWFjLCBrZXkpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHpmSHBTZXRLZXkoZGV2LCB1c2VyLCBrZXlJZCwgdHlwZSwgKHUxNl90ICopbWFjLCBrZXkpOworICAgIH0KKyNlbHNlCisgICAgemZIcFNldEtleShkZXYsIHVzZXIsIGtleUlkLCB0eXBlLCAodTE2X3QgKiltYWMsIGtleSk7CisjZW5kaWYKKworICAgICAgICAgICAgaWYgKCh0eXBlID09IFpNX1RLSVApCisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgIHx8ICh0eXBlID09IFpNX0NFTkMpCisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICAgICApCisgICAgeworICAgICAgICB6ZkhwU2V0S2V5KGRldiwgdXNlciwga2V5SWQgKyAxLCB0eXBlLCAodTE2X3QgKiltYWMsIG1pY0tleSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZIcFJlbW92ZUtleSAgICAgICAgICAgICAgICovCisvKiAgICAgIFJlbW92ZSBrZXkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDAgOiBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvdGhlciA6IGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBZdWFuLUd1IFdlaSAgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNi42ICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZIcFJlbW92ZUtleSh6ZGV2X3QqIGRldiwgdTE2X3QgdXNlcikKK3sKKyAgICB1MzJfdCBjbWRbKFpNX01BWF9DTURfU0laRS80KV07CisgICAgdTE2X3QgcmV0ID0gMDsKKworICAgIGNtZFswXSA9IDB4MDAwMDI5MDQ7CisgICAgY21kWzFdID0gKHUzMl90KXVzZXI7CisKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCA4LCBaTV9PSURfSU5URVJOQUxfV1JJVEUsIE5VTEwpOworICAgIHJldHVybiByZXQ7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKiogRE1BICoqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZIcFN0YXJ0UmVjdih6ZGV2X3QqIGRldikKK3sKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzZDMwLCAweDEwMCk7CisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKworICAgIHJldHVybiAwOworfQorCit1MTZfdCB6ZkhwU3RvcFJlY3YoemRldl90KiBkZXYpCit7CisgICAgcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqIE1BQyAqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZJbml0TWFjKHpkZXZfdCogZGV2KQoreworICAgIC8qIEFDSyBleHRlbnNpb24gcmVnaXN0ZXIgKi8KKyAgICAvLyBqaGxlZSB0ZW1wIDogY2hhbmdlIHZhbHVlIDB4MmMgLT4gMHg0MAorICAgIC8vIGhvbmRhIHJlc29sdmUgc2hvcnQgcHJlYW1ibGUgcHJvYmxlbSA6IDB4NDAgLT4gMHg3NQorICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19BQ0tfRVhURU5TSU9OLCAweDQwKTsgLy8gMHgyOCAtPiAweDJjIDY1MjI6eWZsZWUKKworICAgIC8qIFR4UTAvMS8yLzMgUmV0cnkgTUFYPTIgPT4gdHJhbnNtaXQgMyB0aW1lcyBhbmQgZGVncmFkZSByYXRlIGZvciByZXRyeSAqLworICAgIC8qIFBCNDIgQVAgY3Jhc2ggaXNzdWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIFdvcmthcm91bmQgdGhlIGNyYXNoIGlzc3VlIGJ5IENUUy9SVFMsIHNldCByZXRyeSBtYXggdG8gemVybyBmb3IgICAgICAqLworICAgIC8qICAgd29ya2Fyb3VuZCB0eCB1bmRlcnJ1biB3aGljaCBlbmFibGUgQ1RTL1JUUyAqLworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19SRVRSWV9NQVgsIDApOyAvLyAweDExMTExID0+IDAKKworICAgIC8qIHVzZSBoYXJkd2FyZSBNSUMgY2hlY2sgKi8KKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfU05JRkZFUiwgMHgyMDAwMDAwKTsKKworICAgIC8qIFNldCBSeCB0aHJlc2hvbGQgdG8gMTYwMCAqLworI2lmIFpNX0xBUkdFUEFZTE9BRF9URVNUID09IDEKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfUlhfVEhSRVNIT0xELCAweGM0MDAwKTsKKyNlbHNlCisgICAgI2lmbmRlZiBaTV9ESVNBQkxFX0FNU0RVOEtfU1VQUE9SVAorICAgIC8qIFRoZSBtYXhpbXVtIEEtTVNEVSBsZW5ndGggaXMgMzgzOS83OTM1ICovCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX1JYX1RIUkVTSE9MRCwgMHhjMWY4MCk7CisgICAgI2Vsc2UKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfUlhfVEhSRVNIT0xELCAweGMwZjgwKTsKKyAgICAjZW5kaWYKKyNlbmRpZgorCisgICAgLy96ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfRFlOQU1JQ19TSUZTX0FDSywgMHgxMEEpOworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19SWF9QRV9ERUxBWSwgMHg3MCk7CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0VJRlNfQU5EX1NJRlMsIDB4YTE0NDAwMCk7CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX1NMT1RfVElNRSwgOTw8MTApOworCisgICAgLyogQ0YtRU5EIG1vZGUgKi8KKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzYjJjLCAweDE5MDAwMDAwKTsKKworICAgIC8vTkFWIHByb3RlY3RzIEFDSyBvbmx5IChpbiBUWE9QKQorICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzNiMzgsIDB4MjAxKTsKKworCisgICAgLyogU2V0IEJlYWNvbiBQSFkgQ1RSTCdzIFRQQyB0byAweDcsIFRBMT0xICovCisgICAgLyogT1RVUyBzZXQgQU0gdG8gMHgxICovCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0JDTl9IVDEsIDB4ODAwMDE3MCk7CisKKyAgICAvKiBUT0RPIDogd2VwIGJhY2tvZmYgcHJvdGVjdGlvbiAweDYzYyAqLworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19CQUNLT0ZGX1BST1RFQ1QsIDB4MTA1KTsKKworICAgIC8qIEFHRyB0ZXN0IGNvZGUqLworICAgIC8qIEFnZ3JlZ2F0aW9uIE1BWCBudW1iZXIgYW5kIHRpbWVvdXQgKi8KKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzYjljLCAweDEwMDAwYSk7CisgICAgLyogRmlsdGVyIGFueSBjb250cm9sIGZyYW1lcywgQkFSIGlzIGJpdCAyNCAqLworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzM2OGMsIDB4MDUwMGZmZmYpOworICAgIC8qIEVuYWJsZSBkZWFnZ3JlZ2F0b3IgKi8KKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzYzQwLCAweDEpOworCisgICAgLyogQmFzaWMgcmF0ZSAqLworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19CQVNJQ19SQVRFLCAweDE1MGYpOworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19NQU5EQVRPUllfUkFURSwgMHgxNTBmKTsKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfUlRTX0NUU19SQVRFLCAweDEwYjAxYmIpOworCisgICAgLyogTUlNTyByZXNwb3NuZSBjb250cm9sICovCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjMzY5NCwgMHg0MDAzQzFFKTsvKiBiaXQgMjZ+MjggIG90dXMtQU0gKi8KKworICAgIC8qIEVuYWJsZSBMRUQwIGFuZCBMRUQxICovCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFkMDEwMCwgMHgzKTsKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWQwMTA0LCAweDMpOworCisgICAgLyogc3dpdGNoIE1BQyB0byBPVFVTIGludGVyZmFjZSAqLworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzM2MDAsIDB4Myk7CisKKyAgICAvKiBSWE1BQyBBLU1QRFUgbGVuZ3RoIHRocmVzaG9sZCAqLworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzNjNTAsIDB4ZmZmZik7CisKKwkvKiBQaHkgcmVnaXN0ZXIgcmVhZCB0aW1lb3V0ICovCisJemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjMzY4MCwgMHhmMDAwMDgpOworCisJLyogRGlzYWJsZSBSeCBUaW1lT3V0IDogd29ya2Fyb3VuZCBmb3IgQkIuCisJICogIE9UVVMgd291bGQgaW50ZXJydXB0IHRoZSByeCBmcmFtZSB0aGF0IHNlbnQgYnkgT1dMIFR4VW5kZXJSdW4KKwkgKiAgYmVjYXVzZSBPVFVTIHJ4IHRpbWVvdXQgYmVoYXZpb3IsIHRoZW4gT1RVUyB3b3VsZCBub3QgYWNrIHRoZSBCQSBmb3IKKwkgKiAgdGhpcyBBTVBEVSBmcm9tIE9XTC4KKwkgKiAgRml4IGJ5IFBlcnJ5IEh3YW5nLiAgMjAwNy8wNS8xMC4KKwkgKiAgMHgxYzM2MmMgOiBSeCB0aW1lb3V0IHZhbHVlIDogYml0IDI3fjE2CisJICovCisJemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjMzYyYywgMHgwKTsKKworICAgIC8vU2V0IFVTQiBSeCBzdHJlYW0gbW9kZSBNQVggcGFja2V0IG51bWJlciB0byAyCisgICAgLy8gICAgTWF4IHBhY2tldCBudW1iZXIgPSAqMHgxZTExMTAgKyAxCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFlMTExMCwgMHg0KTsKKyAgICAvL1NldCBVU0IgUnggc3RyZWFtIG1vZGUgdGltZW91dCB0byAxMHVzCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFlMTExNCwgMHg4MCk7CisKKyAgICAvL1NldCBDUFUgY2xvY2sgZnJlcXVlbmN5IHRvIDg4LzgwTUh6CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFENDAwOCwgMHg3Myk7CisKKyAgICAvL1NldCBXTEFOIERNQSBpbnRlcnJ1cHQgbW9kZSA6IGdlbmVyYXRlIGludCBwZXIgcGFja2V0CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjM2Q3YywgMHgxMTAwMTEpOworCisgICAgLyogNzgwNyAqLworICAgIC8qIGVuYWJsZSBmdW5jIDogUmVzZXQgRklGTzEgYW5kIEZJRk8yIHdoZW4gcXVldWUtZ250IGlzIGxvdyAqLworICAgIC8qIDB4MWMzYmIwIEJpdDIgKi8KKyAgICAvKiBEaXNhYmxlIFN3UmVzZXQgaW4gZmlybXdhcmUgZm9yIFR4SGFuZywgZW5hYmxlIHJlc2V0IEZJRk8gZnVuYy4gKi8KKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzYmIwLCAweDQpOworCisgICAgLyogRGlzYWJsZXMgdGhlIENGX0VORCBmcmFtZSAqLworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19UWE9QX05PVF9FTk9VR0hfSU5ESUNBVElPTiwgMHgxNDFFMEY0OCk7CisKKwkvKiBEaXNhYmxlIHRoZSBTVyBEZWNyeXB0Ki8KKwl6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzNjc4LCAweDcwKTsKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKiBTZXQgVHhRcyBDV01JTiwgQ1dNQVgsIEFJRlMgYW5kIFRYTyB0byBXTUUgU1RBIGRlZmF1bHQuICovCisgICAgemZVcGRhdGVEZWZhdWx0UW9zUGFyYW1ldGVyKGRldiwgMCk7CisKKyAgICAvL3pmU2VsQWRjQ2xrKGRldiwgMCk7CisKKyAgICByZXR1cm47Cit9CisKKwordTE2X3QgemZIcFNldFNuaWZmZXJNb2RlKHpkZXZfdCogZGV2LCB1MTZfdCBvbikKK3sKKyAgICBpZiAob24gIT0gMCkKKyAgICB7CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19TTklGRkVSLCAweDIwMDAwMDEpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfU05JRkZFUiwgMHgyMDAwMDAwKTsKKyAgICB9CisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKyAgICByZXR1cm4gMDsKK30KKworCit1MTZfdCB6ZkhwU2V0QXBTdGFNb2RlKHpkZXZfdCogZGV2LCB1OF90IG1vZGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXYgPSB3ZC0+aHBQcml2YXRlOworICAgIGhwUHJpdi0+ZG90MTFNb2RlID0gbW9kZTsKKworICAgIHN3aXRjaChtb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBaTV9IQUxfODAyMTFfTU9ERV9BUDoKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzM3MDAsIDB4MGYwMDAwYTEpOworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjM2M0MCwgMHgxKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fSEFMXzgwMjExX01PREVfU1RBOgorICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjMzcwMCwgMHgwZjAwMDAwMik7CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzYzQwLCAweDEpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9IQUxfODAyMTFfTU9ERV9JQlNTX0dFTkVSQUw6CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzNzAwLCAweDBmMDAwMDAwKTsKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzNjNDAsIDB4MSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX0hBTF84MDIxMV9NT0RFX0lCU1NfV1BBMlBTSzoKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzM3MDAsIDB4MGYwMDAwZTApOworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjM2M0MCwgMHg0MSk7ICAgICAgIC8vIGZvciBtdWx0aXBsZSAoID4gMiApIHN0YXRpb25zIElCU1MgbmV0d29yaworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gc2tpcDsKKyAgICB9CisKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworCitza2lwOgorICAgIHJldHVybiAwOworfQorCisKK3UxNl90IHpmSHBTZXRCc3NpZCh6ZGV2X3QqIGRldiwgdThfdCogYnNzaWRTcmMpCit7CisgICAgdTMyX3QgIGFkZHJlc3M7CisgICAgdTE2X3QgKmJzc2lkID0gKHUxNl90ICopYnNzaWRTcmM7CisKKyAgICBhZGRyZXNzID0gYnNzaWRbMF0gKyAoKCh1MzJfdClic3NpZFsxXSkgPDwgMTYpOworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzM2MTgsIGFkZHJlc3MpOworCisgICAgYWRkcmVzcyA9ICh1MzJfdClic3NpZFsyXTsKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzNjFDLCBhZGRyZXNzKTsKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworICAgIHJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkhwVXBkYXRlUW9zUGFyYW1ldGVyICAgICAgKi8KKy8qICAgICAgVXBkYXRlIFR4UXMgQ1dNSU4sIENXTUFYLCBBSUZTIGFuZCBUWE9QLiAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGN3bWluVGJsIDogQ1dNSU4gcGFyYW1ldGVyIGZvciBUeFFzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBjd21heFRibCA6IENXTUFYIHBhcmFtZXRlciBmb3IgVHhRcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWlmc1RibDogQUlGUyBwYXJhbWV0ZXIgZm9yIFR4UXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHR4b3BUYmwgOiBUWE9QIHBhcmFtZXRlciBmb3IgVHhRcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gICAgICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA2LjYgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OF90IHpmSHBVcGRhdGVRb3NQYXJhbWV0ZXIoemRldl90KiBkZXYsIHUxNl90KiBjd21pblRibCwgdTE2X3QqIGN3bWF4VGJsLAorICAgICAgICB1MTZfdCogYWlmc1RibCwgdTE2X3QqIHR4b3BUYmwpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2ID0gd2QtPmhwUHJpdmF0ZTsKKworICAgIHptX21zZzBfbW0oWk1fTFZfMCwgInpmSGFsVXBkYXRlUW9zUGFyYW1ldGVyKCkiKTsKKworICAgIC8qIE5vdGUgOiBEbyBub3QgY2hhbmdlIGN3bWluIGZvciBRMCBpbiBBZCBIb2MgbW9kZSAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICAgb3RoZXJ3aXNlIGRyaXZlciB3aWxsIGZhaWwgaW4gV2lmaSBiZWFjb24gZGlzdHJpYnV0aW9uICovCisgICAgaWYgKGhwUHJpdi0+ZG90MTFNb2RlID09IFpNX0hBTF84MDIxMV9NT0RFX1NUQSkKKyAgICB7CisjaWYgMCAvL1Jlc3RvcmUgQ1dtaW4gdG8gaW1wcm92ZSBkb3duIGxpbmsgdGhyb3VnaHB1dAorICAgICAgICAvL2NoZWF0aW5nIGluIEJFIHRyYWZmaWMKKyAgICAgICAgaWYgKHdkLT5zdGEuRW5hYmxlSFQgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgLy9jaGVhdGluZyBpbiBCRSB0cmFmZmljCisgICAgICAgICAgICBjd21pblRibFswXSA9IDc7Ly8xNTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGN3bWF4VGJsWzBdID0gMTI3Oy8vMTAyMzsKKyAgICAgICAgYWlmc1RibFswXSA9IDIqOSsxMDsvLzMgKiA5ICsgMTA7CisgICAgfQorCisgICAgLyogQ1dNSU4gYW5kIENXTUFYICovCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0FDMF9DVywgY3dtaW5UYmxbMF0KKyAgICAgICAgICAgICsgKCh1MzJfdCljd21heFRibFswXTw8MTYpKTsKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQUMxX0NXLCBjd21pblRibFsxXQorICAgICAgICAgICAgKyAoKHUzMl90KWN3bWF4VGJsWzFdPDwxNikpOworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19BQzJfQ1csIGN3bWluVGJsWzJdCisgICAgICAgICAgICArICgodTMyX3QpY3dtYXhUYmxbMl08PDE2KSk7CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0FDM19DVywgY3dtaW5UYmxbM10KKyAgICAgICAgICAgICsgKCh1MzJfdCljd21heFRibFszXTw8MTYpKTsKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQUM0X0NXLCBjd21pblRibFs0XQorICAgICAgICAgICAgKyAoKHUzMl90KWN3bWF4VGJsWzRdPDwxNikpOworCisgICAgLyogQUlGUyAqLworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19BQzFfQUMwX0FJRlMsIGFpZnNUYmxbMF0KKyAgICAgICAgICAgICsoKHUzMl90KWFpZnNUYmxbMF08PDEyKSsoKHUzMl90KWFpZnNUYmxbMF08PDI0KSk7CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0FDM19BQzJfQUlGUywgKGFpZnNUYmxbMF0+PjgpCisgICAgICAgICAgICArKCh1MzJfdClhaWZzVGJsWzBdPDw0KSsoKHUzMl90KWFpZnNUYmxbMF08PDE2KSk7CisKKyAgICAvKiBUWE9QICovCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0FDMV9BQzBfVFhPUCwgdHhvcFRibFswXQorICAgICAgICAgICAgKyAoKHUzMl90KXR4b3BUYmxbMV08PDE2KSk7CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0FDM19BQzJfVFhPUCwgdHhvcFRibFsyXQorICAgICAgICAgICAgKyAoKHUzMl90KXR4b3BUYmxbM108PDE2KSk7CisKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworCisgICAgaHBQcml2LT50eG9wWzBdID0gdHhvcFRibFswXTsKKyAgICBocFByaXYtPnR4b3BbMV0gPSB0eG9wVGJsWzFdOworICAgIGhwUHJpdi0+dHhvcFsyXSA9IHR4b3BUYmxbMl07CisgICAgaHBQcml2LT50eG9wWzNdID0gdHhvcFRibFszXTsKKyAgICBocFByaXYtPmN3bWluWzBdID0gY3dtaW5UYmxbMF07CisgICAgaHBQcml2LT5jd21heFswXSA9IGN3bWF4VGJsWzBdOworICAgIGhwUHJpdi0+Y3dtaW5bMV0gPSBjd21pblRibFsxXTsKKyAgICBocFByaXYtPmN3bWF4WzFdID0gY3dtYXhUYmxbMV07CisKKyAgICByZXR1cm4gMDsKK30KKworCit2b2lkIHpmSHBTZXRBdGltV2luZG93KHpkZXZfdCogZGV2LCB1MTZfdCBhdGltV2luKQoreworICAgIHptX21zZzFfbW0oWk1fTFZfMCwgIlNldCBBVElNIHdpbmRvdyB0byAiLCBhdGltV2luKTsKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQVRJTV9XSU5ET1csIGF0aW1XaW4pOworICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7Cit9CisKKwordm9pZCB6ZkhwU2V0QmFzaWNSYXRlU2V0KHpkZXZfdCogZGV2LCB1MTZfdCBiUmF0ZUJhc2ljLCB1MTZfdCBnUmF0ZUJhc2ljKQoreworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19CQVNJQ19SQVRFLCBiUmF0ZUJhc2ljCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKHUxNl90KWdSYXRlQmFzaWM8PDgpKTsKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworfQorCisKKy8qIEhUNDAgc2VuZCBieSBPRkRNIDZNICAgICovCisvKiBvdGhlcndpc2UgdXNlIHJlZyAweDYzOCAqLwordm9pZCB6ZkhwU2V0UlRTQ1RTUmF0ZSh6ZGV2X3QqIGRldiwgdTMyX3QgcmF0ZSkKK3sKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfUlRTX0NUU19SQVRFLCByYXRlKTsKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworfQorCit2b2lkIHpmSHBTZXRNYWNBZGRyZXNzKHpkZXZfdCogZGV2LCB1MTZfdCogbWFjQWRkciwgdTE2X3QgbWFjQWRkcklkKQoreworICAgIGlmIChtYWNBZGRySWQgPT0gMCkKKyAgICB7CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19NQUNfQUREUl9MLAorICAgICAgICAgICAgICAgICgoKHUzMl90KW1hY0FkZHJbMV0pPDwxNikgfCBtYWNBZGRyWzBdKTsKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX01BQ19BRERSX0gsIG1hY0FkZHJbMl0pOworICAgIH0KKyAgICBlbHNlIGlmIChtYWNBZGRySWQgPD0gNykKKyAgICB7CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19BQ0tfVEFCTEUrKChtYWNBZGRySWQtMSkqOCksCisgICAgICAgICAgICAgICAgbWFjQWRkclswXSArICgodTMyX3QpbWFjQWRkclsxXTw8MTYpKTsKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0FDS19UQUJMRSsoKG1hY0FkZHJJZC0xKSo4KSs0LAorICAgICAgICAgICAgICAgIG1hY0FkZHJbMl0pOworICAgIH0KKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworfQorCit2b2lkIHpmSHBTZXRNdWx0aWNhc3RMaXN0KHpkZXZfdCogZGV2LCB1OF90IHNpemUsIHU4X3QqIHBMaXN0LCB1OF90IGJBbGxNdWx0aWNhc3QpCit7CisgICAgc3RydWN0IHpzTXVsdGljYXN0QWRkciogcE1hY0xpc3QgPSAoc3RydWN0IHpzTXVsdGljYXN0QWRkciopIHBMaXN0OworICAgIHU4X3QgICBpOworICAgIHUzMl90ICB2YWx1ZTsKKyAgICB1MzJfdCAgc3dSZWdNdWxIYXNoVmFsdWVILCBzd1JlZ011bEhhc2hWYWx1ZUw7CisKKyAgICBzd1JlZ011bEhhc2hWYWx1ZUggPSAweDgwMDAwMDAwOworICAgIHN3UmVnTXVsSGFzaFZhbHVlTCA9IDA7CisKKyAgICBpZiAoIGJBbGxNdWx0aWNhc3QgKQorICAgIHsKKyAgICAgICAgc3dSZWdNdWxIYXNoVmFsdWVIID0gc3dSZWdNdWxIYXNoVmFsdWVMID0gfjA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvcihpPTA7IGk8c2l6ZTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB2YWx1ZSA9IHBNYWNMaXN0W2ldLmFkZHJbNV0gPj4gMjsKKworICAgICAgICAgICAgaWYgKCB2YWx1ZSA8IDMyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd1JlZ011bEhhc2hWYWx1ZUwgfD0gKDEgPDwgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3UmVnTXVsSGFzaFZhbHVlSCB8PSAoMSA8PCAodmFsdWUtMzIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19HUk9VUF9IQVNIX1RCTF9MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3UmVnTXVsSGFzaFZhbHVlTCk7CisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0dST1VQX0hBU0hfVEJMX0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dSZWdNdWxIYXNoVmFsdWVIKTsKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqIEJlYWNvbiAqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgemZIcEVuYWJsZUJlYWNvbih6ZGV2X3QqIGRldiwgdTE2X3QgbW9kZSwgdTE2X3QgYmNuSW50ZXJ2YWwsIHUxNl90IGR0aW0sIHU4X3QgZW5hYmxlQXRpbSkKK3sKKyAgICB1MzJfdCAgdmFsdWU7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBCZWFjb24gUmVhZHkgKi8KKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQkNOX0NUUkwsIDApOworICAgIC8qIEJlYWNvbiBETUEgYnVmZmVyIGFkZHJlc3MgKi8KKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQkNOX0FERFIsIFpNX0JFQUNPTl9CVUZGRVJfQUREUkVTUyk7CisKKyAgICB2YWx1ZSA9IGJjbkludGVydmFsOworCisgICAgdmFsdWUgfD0gKCgodTMyX3QpIGR0aW0pIDw8IDE2KTsKKworICAgIGlmIChtb2RlID09IFpNX01PREVfQVApCisgICAgeworCisgICAgICAgIHZhbHVlIHw9IDB4MTAwMDAwMDsKKyAgICB9CisgICAgZWxzZSBpZiAobW9kZSA9PSBaTV9NT0RFX0lCU1MpCisgICAgeworICAgICAgICB2YWx1ZSB8PSAweDIwMDAwMDA7CisKKwkJaWYgKCBlbmFibGVBdGltICkKKwkJeworCQkJdmFsdWUgfD0gMHg0MDAwMDAwOworCQl9CisJCSgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aWJzc0JjbkVuYWJsZWQgPSAxOworICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmlic3NCY25JbnRlcnZhbCA9IHZhbHVlOworICAgIH0KKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfUFJFVEJUVCwgKGJjbkludGVydmFsLTYpPDwxNik7CisKKyAgICAvKiBCZWFjb24gcGVyaW9kIGFuZCBiZWFjb24gZW5hYmxlICovCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0JDTl9QRVJJT0QsIHZhbHVlKTsKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworfQorCit2b2lkIHpmSHBEaXNhYmxlQmVhY29uKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aWJzc0JjbkVuYWJsZWQgPSAwOworCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0JDTl9QRVJJT0QsIDApOworICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7Cit9CisKK3ZvaWQgemZIcExlZEN0cmwoemRldl90KiBkZXYsIHUxNl90IGxlZElkLCB1OF90IG1vZGUpCit7CisgICAgdTE2X3Qgc3RhdGU7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLy96bV9kZWJ1Z19tc2cxKCJMRUQgSUQ9IiwgbGVkSWQpOworICAgIC8vem1fZGVidWdfbXNnMSgiTEVEIG1vZGU9IiwgbW9kZSk7CisgICAgaWYgKGxlZElkIDwgMikKKyAgICB7CisgICAgICAgIGlmICgoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmxlZE1vZGVbbGVkSWRdICE9IG1vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+bGVkTW9kZVtsZWRJZF0gPSBtb2RlOworCisgICAgICAgICAgICBzdGF0ZSA9ICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+bGVkTW9kZVswXQorICAgICAgICAgICAgICAgICAgICB8ICgoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmxlZE1vZGVbMV08PDEpOworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFkMDEwNCwgc3RhdGUpOworICAgICAgICAgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKyAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMCgiVXBkYXRlIExFRCIpOworICAgICAgICB9CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZIcFJlc2V0VHhSeCAgICAgICAgICAgICAgICovCisvKiAgICAgIFJlc2V0IFR4IGFuZCBSeCBEZXNjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDAgOiBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvdGhlciA6IGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBDaGFvLVdlbiBZYW5nICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA3LjMgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2X3QgemZIcFVzYlJlc2V0KHpkZXZfdCogZGV2KQoreworICAgIHUzMl90IGNtZFsoWk1fTUFYX0NNRF9TSVpFLzQpXTsKKyAgICB1MTZfdCByZXQgPSAwOworCisgICAgLy96bV9kZWJ1Z19tc2cwKCJDV1kgLSBSZXNldCBUeCBhbmQgUngiKTsKKworICAgIGNtZFswXSA9ICAwIHwgKFpNX0NNRF9SRVNFVCA8PCA4KTsKKworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDQsIFpNX09JRF9JTlRFUk5BTF9XUklURSwgTlVMTCk7CisgICAgcmV0dXJuIHJldDsKK30KKwordTE2X3QgemZIcERLUmVzZXQoemRldl90KiBkZXYsIHU4X3QgZmxhZykKK3sKKyAgICB1MzJfdCBjbWRbKFpNX01BWF9DTURfU0laRS80KV07CisgICAgdTE2X3QgcmV0ID0gMDsKKworICAgIC8vem1fZGVidWdfbXNnMCgiQ1dZIC0gUmVzZXQgVHggYW5kIFJ4Iik7CisKKyAgICBjbWRbMF0gPSAgNCB8IChaTV9DTURfREtSRVNFVCA8PCA4KTsKKyAgICBjbWRbMV0gPSBmbGFnOworCisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgOCwgWk1fT0lEX0lOVEVSTkFMX1dSSVRFLCBOVUxMKTsKKyAgICByZXR1cm4gcmV0OworfQorCit1MzJfdCB6ZkhwQ3dtVXBkYXRlKHpkZXZfdCogZGV2KQoreworICAgIC8vdTMyX3QgY21kWzNdOworICAgIC8vdTE2X3QgcmV0OworICAgIC8vCisgICAgLy9jbWRbMF0gPSAweDAwMDAwMDA4OworICAgIC8vY21kWzFdID0gMHgxYzM2ZTg7CisgICAgLy9jbWRbMl0gPSAweDFjMzZlYzsKKyAgICAvLworICAgIC8vcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgMTIsIFpNX0NXTV9SRUFELCAwKTsKKyAgICAvL3JldHVybiByZXQ7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXY9d2QtPmhwUHJpdmF0ZTsKKworICAgIHpmQ29yZUN3bUJ1c3koZGV2LCB6ZkN3bUlzRXh0Q2hhbkJ1c3koaHBQcml2LT5jdGxCdXN5LCBocFByaXYtPmV4dEJ1c3kpKTsKKworICAgIGhwUHJpdi0+Y3RsQnVzeSA9IDA7CisgICAgaHBQcml2LT5leHRCdXN5ID0gMDsKKworICAgIHJldHVybiAwOworfQorCit1MzJfdCB6ZkhwQW5pVXBkYXRlKHpkZXZfdCogZGV2KQoreworICAgIHUzMl90IGNtZFs1XTsKKyAgICB1MTZfdCByZXQ7CisKKyAgICBjbWRbMF0gPSAweDAwMDAwMDEwOworICAgIGNtZFsxXSA9IDB4MWMzNmU4OworICAgIGNtZFsyXSA9IDB4MWMzNmVjOworICAgIGNtZFszXSA9IDB4MWMzY2I0OworICAgIGNtZFs0XSA9IDB4MWMzY2I4OworCisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgMjAsIFpNX0FOSV9SRUFELCAwKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKgorICogVXBkYXRlIEJlYWNvbiBSU1NJIGluIEFOSQorICovCit1MzJfdCB6ZkhwQW5pVXBkYXRlUnNzaSh6ZGV2X3QqIGRldiwgdThfdCByc3NpKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2PXdkLT5ocFByaXZhdGU7CisKKyAgICBocFByaXYtPnN0YXRzLmFzdF9ub2Rlc3RhdHMubnNfYXZnYnJzc2kgPSByc3NpOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgWk1fU0VFUFJPTV9NQUNfQUREUkVTU19PRkZTRVQgICAoMHgxNDAwICsgKDB4MTA2PDwxKSkKKyNkZWZpbmUgWk1fU0VFUFJPTV9SRUdET01BSU5fT0ZGU0VUICAgKDB4MTQwMCArICgweDEwNDw8MSkpCisjZGVmaW5lIFpNX1NFRVBST01fVkVSSVNPTl9PRkZTRVQgICAoMHgxNDAwICsgKDB4MTAyPDwxKSkKKyNkZWZpbmUgWk1fU0VFUFJPTV9IQVJEV0FSRV9UWVBFX09GRlNFVCAgICgweDEzNzQpCisjZGVmaW5lIFpNX1NFRVBST01fSFdfSEVBVllfQ0xJUCAgICAgICAgICAoMHgxNjFjKQorCit1MzJfdCB6ZkhwR2V0TWFjQWRkcmVzcyh6ZGV2X3QqIGRldikKK3sKKyAgICB1MzJfdCBjbWRbN107CisgICAgdTE2X3QgcmV0OworCisgICAgY21kWzBdID0gMHgwMDAwMDAwMCB8IDI0OworICAgIGNtZFsxXSA9IFpNX1NFRVBST01fTUFDX0FERFJFU1NfT0ZGU0VUOworICAgIGNtZFsyXSA9IFpNX1NFRVBST01fTUFDX0FERFJFU1NfT0ZGU0VUKzQ7CisgICAgY21kWzNdID0gWk1fU0VFUFJPTV9SRUdET01BSU5fT0ZGU0VUOworICAgIGNtZFs0XSA9IFpNX1NFRVBST01fVkVSSVNPTl9PRkZTRVQ7CisgICAgY21kWzVdID0gWk1fU0VFUFJPTV9IQVJEV0FSRV9UWVBFX09GRlNFVDsKKyAgICBjbWRbNl0gPSBaTV9TRUVQUk9NX0hXX0hFQVZZX0NMSVA7CisKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCAyOCwgWk1fTUFDX1JFQUQsIDApOworICAgIHJldHVybiByZXQ7Cit9CisKK3UzMl90IHpmSHBHZXRUcmFuc21pdFBvd2VyKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN0cnVjdCB6c0hwUHJpdiogICAgaHBQcml2ICA9IHdkLT5ocFByaXZhdGU7CisgICAgdTE2X3QgICAgICAgICAgICAgICB0cGMgICAgID0gMDsKKworICAgIGlmIChocFByaXYtPmh3RnJlcXVlbmN5IDwgMzAwMCkgeworICAgICAgICB0cGMgPSBocFByaXYtPnRQb3cyeDJnWzBdICYgMHgzZjsKKyAgICAgICAgd2QtPm1heFR4UG93ZXIyICY9IDB4M2Y7CisgICAgICAgIHRwYyA9ICh0cGMgPiB3ZC0+bWF4VHhQb3dlcjIpPyB3ZC0+bWF4VHhQb3dlcjIgOiB0cGM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdHBjID0gaHBQcml2LT50UG93Mng1Z1swXSAmIDB4M2Y7CisgICAgICAgIHdkLT5tYXhUeFBvd2VyNSAmPSAweDNmOworICAgICAgICB0cGMgPSAodHBjID4gd2QtPm1heFR4UG93ZXI1KT8gd2QtPm1heFR4UG93ZXI1IDogdHBjOworICAgIH0KKworICAgIHJldHVybiB0cGM7Cit9CisKK3U4X3QgemZIcEdldE1pblR4UG93ZXIoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc3RydWN0IHpzSHBQcml2KiAgICBocFByaXYgID0gd2QtPmhwUHJpdmF0ZTsKKyAgICB1OF90ICAgICAgICAgICAgICAgdHBjICAgICA9IDA7CisKKyAgICBpZiAoaHBQcml2LT5od0ZyZXF1ZW5jeSA8IDMwMDApCisgICAgeworICAgICAgICBpZih3ZC0+QmFuZFdpZHRoNDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vNDBNCisgICAgICAgICAgICB0cGMgPSAoaHBQcml2LT50UG93MngyZ0h0NDBbN10mMHgzZik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLzIwTQorICAgICAgICAgICAgdHBjID0gKGhwUHJpdi0+dFBvdzJ4MmdIdDIwWzddJjB4M2YpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKHdkLT5CYW5kV2lkdGg0MCkKKyAgICAgICAgeworICAgICAgICAgICAgLy80ME0KKyAgICAgICAgICAgIHRwYyA9IChocFByaXYtPnRQb3cyeDVnSHQ0MFs3XSYweDNmKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vMjBNCisgICAgICAgICAgICB0cGMgPSAoaHBQcml2LT50UG93Mng1Z0h0MjBbN10mMHgzZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHBjOworfQorCit1OF90IHpmSHBHZXRNYXhUeFBvd2VyKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHN0cnVjdCB6c0hwUHJpdiogICAgaHBQcml2ICA9IHdkLT5ocFByaXZhdGU7CisgICAgdThfdCAgICAgICAgICAgICAgIHRwYyAgICAgPSAwOworCisgICAgaWYgKGhwUHJpdi0+aHdGcmVxdWVuY3kgPCAzMDAwKQorICAgIHsKKyAgICAgICAgdHBjID0gKGhwUHJpdi0+dFBvdzJ4Q2NrWzBdJjB4M2YpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB0cGMgPShocFByaXYtPnRQb3cyeDVnWzBdJjB4M2YpOworICAgIH0KKworICAgIHJldHVybiB0cGM7Cit9CisKK3UzMl90IHpmSHBMb2FkRUVQUk9NRnJvbUZXKHpkZXZfdCogZGV2KQoreworICAgIHUzMl90IGNtZFsxNl07CisgICAgdTMyX3QgcmV0PTAsIGksIGo7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaSA9ICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+ZWVwcm9tSW1hZ2VSZFJlcTsKKworICAgIGNtZFswXSA9IFpNX0hBTF9NQVhfRUVQUk9NX1BSUSo0OworCisgICAgZm9yIChqPTA7IGo8Wk1fSEFMX01BWF9FRVBST01fUFJROyBqKyspCisgICAgeworICAgICAgICBjbWRbaisxXSA9IDB4MTAwMCArICgoKGkqWk1fSEFMX01BWF9FRVBST01fUFJRKSArIGopKjQpOworICAgIH0KKworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIChaTV9IQUxfTUFYX0VFUFJPTV9QUlErMSkqNCwgWk1fRUVQUk9NX1JFQUQsIDApOworCisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCB6ZkhwSGVhcnRCZWF0KHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdj13ZC0+aHBQcml2YXRlOworICAgIHU4X3QgcG9sbHV0ZWQgPSAwOworICAgIHU4X3QgYWNrVHBjOworCisgICAgLyogV29ya2Fyb3VuZCA6IE1ha2UgT1RVUyBmaXJlIG1vcmUgYmVhY29uIGluIGFkIGhvYyBtb2RlIGluIDIuNEdIeiAqLworICAgIGlmIChocFByaXYtPmlic3NCY25FbmFibGVkICE9IDApCisgICAgeworICAgICAgICBpZiAoaHBQcml2LT5od0ZyZXF1ZW5jeSA8PSBaTV9DSF9HXzE0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHdkLT50aWNrICUgMTApID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh3ZC0+dGljayAlIDQwKSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0JDTl9QRVJJT0QsIGhwUHJpdi0+aWJzc0JjbkludGVydmFsLTEpOworICAgICAgICAgICAgICAgICAgICBwb2xsdXRlZCA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19CQ05fUEVSSU9ELCBocFByaXYtPmlic3NCY25JbnRlcnZhbCk7CisgICAgICAgICAgICAgICAgICAgIHBvbGx1dGVkID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKHdkLT50aWNrICYgMHgzZikgPT0gMHgyNSkKKyAgICB7CisgICAgICAgIC8qIFdvcmthcm91bmQgZm9yIGJlYWNvbiBzdHVjayBhZnRlciBTVyByZXNldCAqLworICAgICAgICBpZiAoaHBQcml2LT5pYnNzQmNuRW5hYmxlZCAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQkNOX0FERFIsIFpNX0JFQUNPTl9CVUZGRVJfQUREUkVTUyk7CisgICAgICAgICAgICBwb2xsdXRlZCA9IDE7CisgICAgICAgIH0KKworICAgICAgICAvL0RiZ1ByaW50KCJocFByaXYtPmFnZ01heER1cmF0aW9uQkU9JWQiLCBocFByaXYtPmFnZ01heER1cmF0aW9uQkUpOworICAgICAgICAvL0RiZ1ByaW50KCJ3ZC0+c3RhLmF2Z1NpemVPZlJlY2VpdmVQYWNrZXRzPSVkIiwgd2QtPnN0YS5hdmdTaXplT2ZSZWNlaXZlUGFja2V0cyk7CisgICAgICAgIGlmICgoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICAgICAgICAgICYmICh6ZlN0YUlzQ29ubmVjdGVkKGRldikpCisgICAgICAgICAgICAmJiAod2QtPnN0YS5FbmFibGVIVCA9PSAxKSAvLzExbiBtb2RlCisgICAgICAgICAgICAmJiAod2QtPkJhbmRXaWR0aDQwID09IDEpIC8vNDBNSHogbW9kZQorICAgICAgICAgICAgJiYgKHdkLT5zdGEuZW5hYmxlRHJ2QkEgPT0wKSAvL01hcnZlbCBBUAorICAgICAgICAgICAgJiYgKGhwUHJpdi0+YWdnTWF4RHVyYXRpb25CRSA+IDIwMDApIC8vQkUgVFhPUCA+IDJtcworICAgICAgICAgICAgJiYgKHdkLT5zdGEuYXZnU2l6ZU9mUmVjZWl2ZVBhY2tldHMgPiAxNDIwKSkKKyAgICAgICAgeworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjM2I5YywgMHg4MDAwYSk7CisgICAgICAgICAgICBwb2xsdXRlZCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzYjljLCBocFByaXYtPmFnZ1BrdE51bSk7CisgICAgICAgICAgICBwb2xsdXRlZCA9IDE7CisgICAgICAgIH0KKworICAgICAgICBpZiAod2QtPmR5bmFtaWNTSUZTRW5hYmxlID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICAgICAgICAgICAgICAmJiAoemZTdGFJc0Nvbm5lY3RlZChkZXYpKQorICAgICAgICAgICAgICAgICYmICh3ZC0+c3RhLkVuYWJsZUhUID09IDEpIC8vMTFuIG1vZGUKKyAgICAgICAgICAgICAgICAmJiAod2QtPkJhbmRXaWR0aDQwID09IDApIC8vMjBNSHogbW9kZQorICAgICAgICAgICAgICAgICYmICh3ZC0+c3RhLmVuYWJsZURydkJBID09MCkpIC8vTWFydmVsIEFQCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjMzY5OCwgMHg1MTQ0MDAwKTsKKyAgICAgICAgICAgICAgICBwb2xsdXRlZCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjMzY5OCwgMHhBMTQ0MDAwKTsKKyAgICAgICAgICAgICAgICBwb2xsdXRlZCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSApCisgICAgICAgICAgICAgICAgJiYgKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSkKKyAgICAgICAgICAgICAgICAmJiAod2QtPnN0YS5FbmFibGVIVCA9PSAxKSAvLzExbiBtb2RlCisgICAgICAgICAgICAgICAgJiYgKHdkLT5zdGEuYXRoT3dsQXAgPT0gMSkpIC8vQXRoZXJvcyBBUAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChocFByaXYtPnJldHJhbnNtaXNzaW9uRXZlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2goaHBQcml2LT5sYXRlc3RTSUZTKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+bGF0ZXN0U0lGUyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfRUlGU19BTkRfU0lGUywgMHg4MTQ0MDAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBocFByaXYtPmxhdGVzdFNJRlMgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0VJRlNfQU5EX1NJRlMsIDB4YTE0NDAwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgaHBQcml2LT5sYXRlc3RTSUZTID0gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19FSUZTX0FORF9TSUZTLCAweGMxNDQwMDApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+bGF0ZXN0U0lGUyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfRUlGU19BTkRfU0lGUywgMHhhMTQ0MDAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgaHBQcml2LT5sYXRlc3RTSUZTID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19FSUZTX0FORF9TSUZTLCAweGExNDQwMDApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcG9sbHV0ZWQgPSAxOworICAgICAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCIjIyMjIyBDb3JyZWN0IFR4IHJldHJhbnNtaXNzaW9uIGlzc3VlICMjIyMjLCAiLCBocFByaXYtPmxhdGVzdFNJRlMpOworICAgICAgICAgICAgICAgICAgICBocFByaXYtPnJldHJhbnNtaXNzaW9uRXZlbnQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBocFByaXYtPmxhdGVzdFNJRlMgPSAwOworICAgICAgICAgICAgICAgIGhwUHJpdi0+cmV0cmFuc21pc3Npb25FdmVudCA9IDA7CisgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjMzY5OCwgMHhBMTQ0MDAwKTsKKyAgICAgICAgICAgICAgICBwb2xsdXRlZCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHdkLT5zdGEuYlNjaGVkdWxlU2NhbiA9PSBGQUxTRSkgJiYgKHdkLT5zdGEuYkNoYW5uZWxTY2FuID09IEZBTFNFKSkKKyAgICAgICAgeworI2RlZmluZSBaTV9TSUdOQUxfVEhSRVNIT0xEICA2NgorICAgICAgICBpZiAoKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSApCisgICAgICAgICAgICAmJiAoemZTdGFJc0Nvbm5lY3RlZChkZXYpKQorICAgICAgICAgICAgJiYgKHdkLT5TaWduYWxTdHJlbmd0aCA+IFpNX1NJR05BTF9USFJFU0hPTEQpKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogcmVtb3ZlIHN0YXRlIGhhbmRsZSwgYWx3YXlzIHJld3JpdGUgcmVnaXN0ZXIgc2V0dGluZyAqLworICAgICAgICAgICAgICAgIC8vaWYgKGhwUHJpdi0+c3Ryb25nUlNTSSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhwUHJpdi0+c3Ryb25nUlNTSSA9IDE7CisgICAgICAgICAgICAgICAgLyogU3Ryb25nIFJTU0ksIHNldCBBQ0sgdG8gb25lIFR4IHN0cmVhbSBhbmQgbG93ZXIgVHggcG93ZXIgN2RibSAqLworICAgICAgICAgICAgICAgIGlmIChocFByaXYtPmN1cnJlbnRBY2tSdHNUcGMgPiAoMTQrMTApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWNrVHBjID0gaHBQcml2LT5jdXJyZW50QWNrUnRzVHBjIC0gMTQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFja1RwYyA9IDEwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzNjk0LCAoKGFja1RwYykgPDwgMjApIHwgKDB4MTw8MjYpKTsKKyAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzYmI0LCAoKGFja1RwYykgPDwgNSApIHwgKDB4MTw8MTEpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGFja1RwYykgPDwgMjEpIHwgKDB4MTw8MjcpICApOworICAgICAgICAgICAgICAgIHBvbGx1dGVkID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiByZW1vdmUgc3RhdGUgaGFuZGxlLCBhbHdheXMgcmV3cml0ZSByZWdpc3RlciBzZXR0aW5nICovCisgICAgICAgICAgICAgICAgLy9pZiAoaHBQcml2LT5zdHJvbmdSU1NJID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaHBQcml2LT5zdHJvbmdSU1NJID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoaHBQcml2LT5oYWxDYXBhYmlsaXR5ICYgWk1fSFBfQ0FQXzExTl9PTkVfVFhfU1RSRUFNKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjMzY5NCwgKChocFByaXYtPmN1cnJlbnRBY2tSdHNUcGMmMHgzZikgPDwgMjApIHwgKDB4MTw8MjYpKTsKKyAgICAgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjM2JiNCwgKChocFByaXYtPmN1cnJlbnRBY2tSdHNUcGMmMHgzZikgPDwgNSApIHwgKDB4MTw8MTEpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGhwUHJpdi0+Y3VycmVudEFja1J0c1RwYyYweDNmKSA8PCAyMSkgfCAoMHgxPDwyNykgICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzM2OTQsICgoaHBQcml2LT5jdXJyZW50QWNrUnRzVHBjJjB4M2YpIDw8IDIwKSB8ICgweDU8PDI2KSk7CisgICAgICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzNiYjQsICgoaHBQcml2LT5jdXJyZW50QWNrUnRzVHBjJjB4M2YpIDw8IDUgKSB8ICgweDU8PDExKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChocFByaXYtPmN1cnJlbnRBY2tSdHNUcGMmMHgzZikgPDwgMjEpIHwgKDB4NTw8MjcpICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwb2xsdXRlZCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyN1bmRlZiBaTV9TSUdOQUxfVEhSRVNIT0xECisgICAgICAgIH0KKworICAgICAgICBpZiAoKGhwUHJpdi0+aGFsQ2FwYWJpbGl0eSAmIFpNX0hQX0NBUF8xMU5fT05FX1RYX1NUUkVBTSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCh3ZC0+c3RhLmJTY2hlZHVsZVNjYW4gPT0gRkFMU0UpICYmICh3ZC0+c3RhLmJDaGFubmVsU2NhbiA9PSBGQUxTRSkpCisgICAgICAgICAgICB7CisgICAgI2RlZmluZSBaTV9SWF9TSUdOQUxfVEhSRVNIT0xEX0ggIDcxCisgICAgI2RlZmluZSBaTV9SWF9TSUdOQUxfVEhSRVNIT0xEX0wgIDY2CisgICAgICAgICAgICAgICAgdThfdCByeFNpZ25hbFRocmVzaG9sZEggPSBaTV9SWF9TSUdOQUxfVEhSRVNIT0xEX0g7CisgICAgICAgICAgICAgICAgdThfdCByeFNpZ25hbFRocmVzaG9sZEwgPSBaTV9SWF9TSUdOQUxfVEhSRVNIT0xEX0w7CisgICAgI3VuZGVmIFpNX1JYX1NJR05BTF9USFJFU0hPTERfSAorICAgICN1bmRlZiBaTV9SWF9TSUdOQUxfVEhSRVNIT0xEX0wKKworICAgICAgICAgICAgICAgIGlmICgoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHdkLT5TaWduYWxTdHJlbmd0aCA+IHJ4U2lnbmFsVGhyZXNob2xkSCkKKyAgICAgICAgICAgICAgICAgICAgKS8vJiYgKGhwUHJpdi0+cnhTdHJvbmdSU1NJID09IDApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaHBQcml2LT5yeFN0cm9uZ1JTU0kgPSAxOworICAgICAgICAgICAgICAgICAgICAvL3pmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzU5NjQsIDB4MTIyMCk7CisgICAgICAgICAgICAgICAgICAgIC8vemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjNTk2MCwgMHg5MDApOworICAgICAgICAgICAgICAgICAgICAvL3pmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzY5NjAsIDB4OTAwKTsKKyAgICAgICAgICAgICAgICAgICAgLy96ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWM3OTYwLCAweDkwMCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgoaHBQcml2LT5lZXByb21JbWFnZVsweDEwMCsweDExMCoyLzRdJjB4ZmYpID09IDB4ODApIC8vRkVNIFRZUEUKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhwUHJpdi0+aHdGcmVxdWVuY3kgPD0gWk1fQ0hfR18xNCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWM4OTYwLCAweDkwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjODk2MCwgMHg5YjQ5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzg5NjAsIDB4MDkwMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcG9sbHV0ZWQgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICgoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFICkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHpmU3RhSXNDb25uZWN0ZWQoZGV2KSkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHdkLT5TaWduYWxTdHJlbmd0aCA+IHJ4U2lnbmFsVGhyZXNob2xkTCkKKyAgICAgICAgICAgICAgICAgICAgKS8vJiYgKGhwUHJpdi0+cnhTdHJvbmdSU1NJID09IDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9EbyBub3RoaW5nIHRvIHByZXZlbnQgZnJlcXVlbnRseSBSeCBzd2l0Y2hpbmcKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogcmVtb3ZlIHN0YXRlIGhhbmRsZSwgYWx3YXlzIHJld3JpdGUgcmVnaXN0ZXIgc2V0dGluZyAqLworICAgICAgICAgICAgICAgICAgICAvL2lmIChocFByaXYtPnJ4U3Ryb25nUlNTSSA9PSAxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBocFByaXYtPnJ4U3Ryb25nUlNTSSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3pmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzU5NjQsIDB4MTEyMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3pmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzU5NjAsIDB4OWI0MCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3pmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzY5NjAsIDB4OWI0MCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3pmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzc5NjAsIDB4OWI0MCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxMTAqMi80XSYweGZmKSA9PSAweDgwKSAvL0ZFTSBUWVBFCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhwUHJpdi0+aHdGcmVxdWVuY3kgPD0gWk1fQ0hfR18xNCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzg5NjAsIDB4OWI0OSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzg5NjAsIDB4MDkwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzg5NjAsIDB4OWI0MCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwb2xsdXRlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChocFByaXYtPnVzYkFjU2VuZEJ5dGVzWzNdID4gKGhwUHJpdi0+dXNiQWNTZW5kQnl0ZXNbMF0qMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19BQzFfQUMwX1RYT1AsIGhwUHJpdi0+dHhvcFszXSk7CisgICAgICAgICAgICBwb2xsdXRlZCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaHBQcml2LT51c2JBY1NlbmRCeXRlc1syXSA+IChocFByaXYtPnVzYkFjU2VuZEJ5dGVzWzBdKjIpKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQUMxX0FDMF9UWE9QLCBocFByaXYtPnR4b3BbMl0pOworICAgICAgICAgICAgcG9sbHV0ZWQgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGhwUHJpdi0+dXNiQWNTZW5kQnl0ZXNbMV0gPiAoaHBQcml2LT51c2JBY1NlbmRCeXRlc1swXSoyKSkKKyAgICAgICAgeworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0FDMF9DVywgaHBQcml2LT5jd21pblsxXSsoKHUzMl90KWhwUHJpdi0+Y3dtYXhbMV08PDE2KSk7CisgICAgICAgICAgICBwb2xsdXRlZCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaHBQcml2LT5zbG90VHlwZSA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgod2QtPnN0YS5lbmFibGVEcnZCQSA9PTApIC8vTWFydmVsIEFQCisgICAgICAgICAgICAgICAgICAgJiYgKGhwUHJpdi0+YWdnTWF4RHVyYXRpb25CRSA+IDIwMDApKSAvL0JFIFRYT1AgPiAybXMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19BQzBfQ1csIChocFByaXYtPmN3bWluWzBdLzIpKygodTMyX3QpaHBQcml2LT5jd21heFswXTw8MTYpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0FDMF9DVywgaHBQcml2LT5jd21pblswXSsoKHUzMl90KWhwUHJpdi0+Y3dtYXhbMF08PDE2KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBvbGx1dGVkID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBDb21wZW5zYXRpb24gZm9yIDIwdXMgc2xvdCB0aW1lICovCisgICAgICAgICAgICAgICAgLy96ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQUMwX0NXLCA1OCsoKHUzMl90KWhwUHJpdi0+Y3dtYXhbMF08PDE2KSk7CisgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0FDMF9DVywgaHBQcml2LT5jd21pblswXSsoKHUzMl90KWhwUHJpdi0+Y3dtYXhbMF08PDE2KSk7CisgICAgICAgICAgICAgICAgcG9sbHV0ZWQgPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKHdkLT5zdGEuU1dFbmNyeXB0RW5hYmxlICYgKFpNX1NXX1RLSVBfRU5DUllfRU58Wk1fU1dfV0VQX0VOQ1JZX0VOKSkgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQUMxX0FDMF9UWE9QLCBocFByaXYtPnR4b3BbMF0pOworICAgICAgICAgICAgICAgIHBvbGx1dGVkID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQUMxX0FDMF9UWE9QLCAweDMwKTsKKyAgICAgICAgICAgICAgICBwb2xsdXRlZCA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBocFByaXYtPnVzYkFjU2VuZEJ5dGVzWzNdID0gMDsKKyAgICAgICAgaHBQcml2LT51c2JBY1NlbmRCeXRlc1syXSA9IDA7CisgICAgICAgIGhwUHJpdi0+dXNiQWNTZW5kQnl0ZXNbMV0gPSAwOworICAgICAgICBocFByaXYtPnVzYkFjU2VuZEJ5dGVzWzBdID0gMDsKKyAgICB9CisKKyAgICBpZiAocG9sbHV0ZWQgPT0gMSkKKyAgICB7CisgICAgICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCisvKgorICogIDB4MWQ0MDA4IDogQUhCLCBEQUMsIEFEQyBjbG9jayBzZWxlY3Rpb24KKyAqICAgICAgICAgICAgIGJpdDF+MCAgQUhCX0NMSyA6IEFIQiBjbG9jayBzZWxlY3Rpb24sCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMCA6IE9TQyA0ME1IejsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAxIDogMjBNSHogaW4gQSBtb2RlLCAyMk1IeiBpbiBHIG1vZGU7CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCA6IDQwTUh6IGluIEEgbW9kZSwgNDRNSHogaW4gRyBtb2RlOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEgOiA4ME1IeiBpbiBBIG1vZGUsIDg4TUh6IGluIEcgbW9kZS4KKyAqICAgICAgICAgICAgIGJpdDN+MiAgQ0xLX1NFTCA6IFNlbGVjdCB0aGUgY2xvY2sgc291cmNlIG9mIGNsazE2MCBpbiBBRERBQy4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAwIDogUExMIGRpdmlkZXIncyBvdXRwdXQ7CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMSA6IFBMTCBkaXZpZGVyJ3Mgb3V0cHV0IGRpdmlkZWQgYnkgMjsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwIDogUExMIGRpdmlkZXIncyBvdXRwdXQgZGl2aWRlZCBieSA0OworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEgOiBSRUZDTEsgZnJvbSBYVEFMT1NDUEFELgorICovCit2b2lkIHpmU2VsQWRjQ2xrKHpkZXZfdCogZGV2LCB1OF90IGJ3NDAsIHUzMl90IGZyZXF1ZW5jeSkKK3sKKyAgICBpZihidzQwID09IDEpCisgICAgeworICAgICAgICAvL3pmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxRDQwMDgsIDB4NzMpOworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfRFlOQU1JQ19TSUZTX0FDSywgMHgxMEEpOworICAgICAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvL3pmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxRDQwMDgsIDB4NzApOworICAgICAgICBpZiAoIGZyZXF1ZW5jeSA8PSBaTV9DSF9HXzE0ICkKKyAgICAgICAgeworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0RZTkFNSUNfU0lGU19BQ0ssIDB4MTA1KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19EWU5BTUlDX1NJRlNfQUNLLCAweDEwNCk7CisgICAgICAgIH0KKyAgICAgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKyAgICB9Cit9CisKK3UzMl90IHpmSHBFY2hvQ29tbWFuZCh6ZGV2X3QqIGRldiwgdTMyX3QgdmFsdWUpCit7CisgICAgdTMyX3QgY21kWzJdOworICAgIHUxNl90IHJldDsKKworICAgIGNtZFswXSA9IDB4MDAwMDgwMDQ7CisgICAgY21kWzFdID0gdmFsdWU7CisKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCA4LCBaTV9DTURfRUNITywgTlVMTCk7CisgICAgcmV0dXJuIHJldDsKK30KKworI2lmZGVmIFpNX0RSVl9JTklUX1VTQl9NT0RFCisKKyNkZWZpbmUgWk1fVVNCX1VTX1NUUkVBTV9NT0RFICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBaTV9VU0JfVVNfUEFDS0VUX01PREUgICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIFpNX1VTQl9EU19FTkFCTEUgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgWk1fVVNCX1VTX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorCisjZGVmaW5lIFpNX1VTQl9SWF9TVFJFQU1fNEsgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgWk1fVVNCX1JYX1NUUkVBTV84SyAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBaTV9VU0JfUlhfU1RSRUFNXzE2SyAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIFpNX1VTQl9SWF9TVFJFQU1fMzJLICAgICAgICAgICAgICAgIDB4MDAwMDAwMzAKKworI2RlZmluZSBaTV9VU0JfVFhfU1RSRUFNX01PREUgICAgICAgICAgICAgICAweDAwMDAwMDQwCisKKyNkZWZpbmUgWk1fVVNCX01PREVfQ1RSTF9SRUcgICAgICAgICAgICAgICAgMHgwMDFFMTEwOAorCit2b2lkIHpmSW5pdFVzYk1vZGUoemRldl90KiBkZXYpCit7CisgICAgdTMyX3QgbW9kZTsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICAvKiBUT0RPOiBTZXQgVVNCIG1vZGUgYnkgcmVhZGluZyByZWdpc3RlcnkgKi8KKyAgICBtb2RlID0gWk1fVVNCX0RTX0VOQUJMRSB8IFpNX1VTQl9VU19FTkFCTEUgfCBaTV9VU0JfVVNfUEFDS0VUX01PREU7CisKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX1VTQl9NT0RFX0NUUkxfUkVHLCBtb2RlKTsKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworfQorI2VuZGlmCisKK3ZvaWQgemZEdW1wRWVwQmFuZEVkZ2VzKHN0cnVjdCBhcjU0MTZFZXByb20qIGVlcHJvbUltYWdlKTsKK3ZvaWQgemZQcmludFRhcmdldFBvd2VyMkcodThfdCogdFBvdzJ4Q2NrLCB1OF90KiB0UG93MngyZywgdThfdCogdFBvdzJ4MmdIdDIwLCB1OF90KiB0UG93MngyZ0h0NDApOwordm9pZCB6ZlByaW50VGFyZ2V0UG93ZXI1Ryh1OF90KiB0UG93Mng1ZywgdThfdCogdFBvdzJ4NWdIdDIwLCB1OF90KiB0UG93Mng1Z0h0NDApOworCisKK3MzMl90IHpmSW50ZXJwb2xhdGVGdW5jKHMzMl90IHgsIHMzMl90IHgxLCBzMzJfdCB5MSwgczMyX3QgeDIsIHMzMl90IHkyKQoreworICAgIHMzMl90IHk7CisKKyAgICBpZiAoeTIgPT0geTEpCisgICAgeworICAgICAgICB5ID0geTE7CisgICAgfQorICAgIGVsc2UgaWYgKHggPT0geDEpCisgICAgeworICAgICAgICB5ID0geTE7CisgICAgfQorICAgIGVsc2UgaWYgKHggPT0geDIpCisgICAgeworICAgICAgICB5ID0geTI7CisgICAgfQorICAgIGVsc2UgaWYgKHgyICE9IHgxKQorICAgIHsKKyAgICAgICAgeSA9IHkxICsgKCgoeTIteTEpICogKHgteDEpKS8oeDIteDEpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgeSA9IHkxOworICAgIH0KKworICAgIHJldHVybiB5OworfQorCisvLyNkZWZpbmUgWk1fRU5BQkxFX1RQQ19XSU5ET1dTX0RFQlVHCisvLyNkZWZpbmUgWk1fRU5BQkxFX0JBTkRFREdFU19XSU5ET1dTX0RFQlVHCisKKy8qIHRoZSB0eCBwb3dlciBvZmZzZXQgd29ya2Fyb3VuZCBmb3IgQVJUIHZzIE5ESVMvTURLICovCisjZGVmaW5lIEhBTFRYX1BPV0VSX09GRlNFVCAgICAgIDAKKwordThfdCB6ZkludGVycG9sYXRlRnVuY1godThfdCB4LCB1OF90IHgxLCB1OF90IHkxLCB1OF90IHgyLCB1OF90IHkyKQoreworICAgIHMzMl90IHk7CisgICAgczMyX3QgaW5jOworCisgICAgI2RlZmluZSBaTV9NVUxUSVBMSUVSICAgOAorICAgIHkgPSB6ZkludGVycG9sYXRlRnVuYygoczMyX3QpeDw8Wk1fTVVMVElQTElFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHMzMl90KXgxPDxaTV9NVUxUSVBMSUVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoczMyX3QpeTE8PFpNX01VTFRJUExJRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChzMzJfdCl4Mjw8Wk1fTVVMVElQTElFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHMzMl90KXkyPDxaTV9NVUxUSVBMSUVSKTsKKworICAgIGluYyA9ICh5ICYgKDE8PChaTV9NVUxUSVBMSUVSLTEpKSkgPj4gKFpNX01VTFRJUExJRVItMSk7CisgICAgeSA9ICh5ID4+IFpNX01VTFRJUExJRVIpICsgaW5jOworICAgICN1bmRlZiBaTV9NVUxUSVBMSUVSCisKKyAgICByZXR1cm4gKHU4X3QpeTsKK30KKwordThfdCB6ZkdldEludGVycG9sYXRlZFZhbHVlKHU4X3QgeCwgdThfdCogeF9hcnJheSwgdThfdCogeV9hcnJheSkKK3sKKyAgICBzMzJfdCB5OworICAgIHUxNl90IHhJbmRleDsKKworICAgIGlmICh4IDw9IHhfYXJyYXlbMV0pCisgICAgeworICAgICAgICB4SW5kZXggPSAwOworICAgIH0KKyAgICBlbHNlIGlmICh4IDw9IHhfYXJyYXlbMl0pCisgICAgeworICAgICAgICB4SW5kZXggPSAxOworICAgIH0KKyAgICBlbHNlIGlmICh4IDw9IHhfYXJyYXlbM10pCisgICAgeworICAgICAgICB4SW5kZXggPSAyOworICAgIH0KKyAgICBlbHNlIC8vKHggPiB4X2FycmF5WzNdKQorICAgIHsKKyAgICAgICAgeEluZGV4ID0gMzsKKyAgICB9CisKKyAgICB5ID0gemZJbnRlcnBvbGF0ZUZ1bmNYKHgsCisgICAgICAgICAgICB4X2FycmF5W3hJbmRleF0sCisgICAgICAgICAgICB5X2FycmF5W3hJbmRleF0sCisgICAgICAgICAgICB4X2FycmF5W3hJbmRleCsxXSwKKyAgICAgICAgICAgIHlfYXJyYXlbeEluZGV4KzFdKTsKKworICAgIHJldHVybiAodThfdCl5OworfQorCit1OF90IHpmRmluZEZyZXFJbmRleCh1OF90IGYsIHU4X3QqIGZBcnJheSwgdThfdCBmQXJyYXlTaXplKQoreworICAgIHU4X3QgaTsKKyNpZmRlZiBaTV9FTkFCTEVfVFBDX1dJTkRPV1NfREVCVUcKKyAgICBEYmdQcmludCgiZj0lZCAiLCBmKTsKKyAgICBmb3IgKGk9MDsgaTxmQXJyYXlTaXplOyBpKyspCisgICAgeworICAgICAgICBEYmdQcmludCgiJWQgIiwgZkFycmF5W2ldKTsKKyAgICB9CisgICAgRGJnUHJpbnQoIlxuIik7CisjZW5kaWYKKyAgICBpPWZBcnJheVNpemUtMjsKKyAgICB3aGlsZSgxKQorICAgIHsKKyAgICAgICAgaWYgKGYgPj0gZkFycmF5W2ldKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaSE9MCkKKyAgICAgICAgeworICAgICAgICAgICAgaS0tOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworCisKK3ZvaWQgemZJbml0UG93ZXJDYWwoemRldl90KiBkZXYpCit7CisgICAgLy9Qcm9ncmFtIFBIWSBUeCBwb3dlciByZWxhdGl2ZXMgcmVnaXN0ZXJzCisjZGVmaW5lIHptX3dyaXRlX3BoeV9yZWcoY3IsIHZhbCkgcmVnX3dyaXRlKChjcio0KSsweDk4MDAsIHZhbCkKKworICAgIHptX3dyaXRlX3BoeV9yZWcoNzksIDB4N2YpOworICAgIHptX3dyaXRlX3BoeV9yZWcoNzcsIDB4M2YzZjNmM2YpOworICAgIHptX3dyaXRlX3BoeV9yZWcoNzgsIDB4M2YzZjNmM2YpOworICAgIHptX3dyaXRlX3BoeV9yZWcoNjUzLCAweDNmM2YzZjNmKTsKKyAgICB6bV93cml0ZV9waHlfcmVnKDY1NCwgMHgzZjNmM2YzZik7CisgICAgem1fd3JpdGVfcGh5X3JlZyg3MzksIDB4M2YzZjNmM2YpOworICAgIHptX3dyaXRlX3BoeV9yZWcoNzQwLCAweDNmM2YzZjNmKTsKKyAgICB6bV93cml0ZV9waHlfcmVnKDc1NSwgMHgzZjNmM2YzZik7CisgICAgem1fd3JpdGVfcGh5X3JlZyg3NTYsIDB4M2YzZjNmM2YpOworICAgIHptX3dyaXRlX3BoeV9yZWcoNzU3LCAweDNmM2YzZjNmKTsKKworI3VuZGVmIHptX3dyaXRlX3BoeV9yZWcKK30KKworCisKK3ZvaWQgemZQcmludFRwKHU4X3QqIHB3cjAsIHU4X3QqIHZwZDAsIHU4X3QqIHB3cjEsIHU4X3QqIHZwZDEpCit7CisgICAgI2lmZGVmIFpNX0VOQUJMRV9UUENfV0lORE9XU19ERUJVRworICAgIERiZ1ByaW50KCJwd3IwIDogJWQsICVkLCAlZCwgJWQgLCVkXG4iLCBwd3IwWzBdLCBwd3IwWzFdLCBwd3IwWzJdLCBwd3IwWzNdLCBwd3IwWzRdKTsKKyAgICBEYmdQcmludCgidnBkMCA6ICVkLCAlZCwgJWQsICVkICwlZFxuIiwgdnBkMFswXSwgdnBkMFsxXSwgdnBkMFsyXSwgdnBkMFszXSwgdnBkMFs0XSk7CisgICAgRGJnUHJpbnQoInB3cjEgOiAlZCwgJWQsICVkLCAlZCAsJWRcbiIsIHB3cjFbMF0sIHB3cjFbMV0sIHB3cjFbMl0sIHB3cjFbM10sIHB3cjFbNF0pOworICAgIERiZ1ByaW50KCJ2cGQxIDogJWQsICVkLCAlZCwgJWQgLCVkXG4iLCB2cGQxWzBdLCB2cGQxWzFdLCB2cGQxWzJdLCB2cGQxWzNdLCB2cGQxWzRdKTsKKyAgICAjZW5kaWYKK30KKworCisvKgorICogVG8gZmluZCBDVEwgaW5kZXgoMH4yMykKKyAqIHJldHVybiAyNChBUjU0MTZfTlVNX0NUTFMpPT5ubyBkZXNpcmVkIGluZGV4IGZvdW5kCisgKi8KK3U4X3QgemZGaW5kQ3RsRWRnZXNJbmRleCh6ZGV2X3QqIGRldiwgdThfdCBkZXNpcmVkX0N0bEluZGV4KQoreworICAgIHU4X3QgaTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdjsKKyAgICBzdHJ1Y3QgYXI1NDE2RWVwcm9tKiBlZXByb21JbWFnZTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGhwUHJpdiA9IHdkLT5ocFByaXZhdGU7CisKKyAgICBlZXByb21JbWFnZSA9IChzdHJ1Y3QgYXI1NDE2RWVwcm9tKikmKGhwUHJpdi0+ZWVwcm9tSW1hZ2VbKDEwMjQrNTEyKS80XSk7CisKKyAgICAvL2ZvciAoaSA9IDA7IChpIDwgQVI1NDE2X05VTV9DVExTKSAmJiBlZXByb21JbWFnZS0+Y3RsSW5kZXhbaV07IGkrKykKKyAgICBmb3IgKGkgPSAwOyBpIDwgQVI1NDE2X05VTV9DVExTOyBpKyspCisgICAgeworICAgICAgICBpZihkZXNpcmVkX0N0bEluZGV4ID09IGVlcHJvbUltYWdlLT5jdGxJbmRleFtpXSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gaTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBmYmluMmZyZXEKKyAqCisgKiBHZXQgY2hhbm5lbCB2YWx1ZSBmcm9tIGJpbmFyeSByZXByZXNlbnRhdGlvbiBoZWxkIGluIGVlcHJvbQorICogUkVUVVJOUzogdGhlIGZyZXF1ZW5jeSBpbiBNSHoKKyAqLwordTMyX3QKK2ZiaW4yZnJlcSh1OF90IGZiaW4sIHU4X3QgaXMyR0h6KQoreworICAgIC8qCisgICAgICogUmVzZXJ2ZWQgdmFsdWUgMHhGRiBwcm92aWRlcyBhbiBlbXB0eSBkZWZpbml0aW9uIGJvdGggYXMKKyAgICAgKiBhbiBmYmluIGFuZCBhcyBhIGZyZXF1ZW5jeSAtIGRvIG5vdCBjb252ZXJ0CisgICAgICovCisgICAgaWYgKGZiaW4gPT0gQVI1NDE2X0JDSEFOX1VOVVNFRCkgeworICAgICAgICByZXR1cm4gZmJpbjsKKyAgICB9CisKKyAgICByZXR1cm4gKHUzMl90KSgoaXMyR0h6PT0xKSA/ICgyMzAwICsgZmJpbikgOiAoNDgwMCArIDUgKiBmYmluKSk7Cit9CisKKwordThfdCB6ZkdldE1heEVkZ2VQb3dlcih6ZGV2X3QqIGRldiwgQ0FMX0NUTF9FREdFUyAqcEN0bEVkZ2VzLCB1MzJfdCBmcmVxKQoreworICAgIHU4X3QgaTsKKyAgICB1OF90IG1heEVkZ2VQb3dlcjsKKyAgICB1OF90IGlzMkdIejsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdjsKKyAgICBzdHJ1Y3QgYXI1NDE2RWVwcm9tKiBlZXByb21JbWFnZTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGhwUHJpdiA9IHdkLT5ocFByaXZhdGU7CisKKyAgICBlZXByb21JbWFnZSA9IChzdHJ1Y3QgYXI1NDE2RWVwcm9tKikmKGhwUHJpdi0+ZWVwcm9tSW1hZ2VbKDEwMjQrNTEyKS80XSk7CisKKyAgICBpZihmcmVxID4gWk1fQ0hfR18xNCkKKyAgICAgICAgaXMyR0h6ID0gMDsKKyAgICBlbHNlCisgICAgICAgIGlzMkdIeiA9IDE7CisKKyAgICBtYXhFZGdlUG93ZXIgPSBBUjU0MTZfTUFYX1JBVEVfUE9XRVI7CisKKyAgICAvKiBHZXQgdGhlIGVkZ2UgcG93ZXIgKi8KKyAgICBmb3IgKGkgPSAwOyAoaSA8IEFSNTQxNl9OVU1fQkFORF9FREdFUykgJiYgKHBDdGxFZGdlc1tpXS5iQ2hhbm5lbCAhPSBBUjU0MTZfQkNIQU5fVU5VU0VEKSA7IGkrKykKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIElmIHRoZXJlJ3MgYW4gZXhhY3QgY2hhbm5lbCBtYXRjaCBvciBhbiBpbmJhbmQgZmxhZyBzZXQKKyAgICAgICAgICogb24gdGhlIGxvd2VyIGNoYW5uZWwgdXNlIHRoZSBnaXZlbiByZEVkZ2VQb3dlcgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGZyZXEgPT0gZmJpbjJmcmVxKHBDdGxFZGdlc1tpXS5iQ2hhbm5lbCwgaXMyR0h6KSkKKyAgICAgICAgeworICAgICAgICAgICAgbWF4RWRnZVBvd2VyID0gcEN0bEVkZ2VzW2ldLnRQb3dlcjsKKyAgICAgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfQkFOREVER0VTX1dJTkRPV1NfREVCVUcKKyAgICAgICAgICAgIHptX2RiZygoInpmR2V0TWF4RWRnZVBvd2VyIGluZGV4IGkgPSAlZCBcbiIsIGkpKTsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKGkgPiAwKSAmJiAoZnJlcSA8IGZiaW4yZnJlcShwQ3RsRWRnZXNbaV0uYkNoYW5uZWwsIGlzMkdIeikpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmJpbjJmcmVxKHBDdGxFZGdlc1tpIC0gMV0uYkNoYW5uZWwsIGlzMkdIeikgPCBmcmVxICYmIHBDdGxFZGdlc1tpIC0gMV0uZmxhZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtYXhFZGdlUG93ZXIgPSBwQ3RsRWRnZXNbaSAtIDFdLnRQb3dlcjsKKyAgICAgICAgICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX0JBTkRFREdFU19XSU5ET1dTX0RFQlVHCisgICAgICAgICAgICAgICAgem1fZGJnKCgiemZHZXRNYXhFZGdlUG93ZXIgaW5kZXggaS0xID0gJWQgXG4iLCBpLTEpKTsKKyAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIExlYXZlIGxvb3AgLSBubyBtb3JlIGFmZmVjdGluZyBlZGdlcyBwb3NzaWJsZSBpbiB0aGlzIG1vbm90b25pYyBpbmNyZWFzaW5nIGxpc3QgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBpZiggaSA9PSBBUjU0MTZfTlVNX0JBTkRfRURHRVMgKQorICAgIHsKKyAgICAgICAgaWYgKGZyZXEgPiBmYmluMmZyZXEocEN0bEVkZ2VzW2kgLSAxXS5iQ2hhbm5lbCwgaXMyR0h6KSAmJiBwQ3RsRWRnZXNbaSAtIDFdLmZsYWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1heEVkZ2VQb3dlciA9IHBDdGxFZGdlc1tpIC0gMV0udFBvd2VyOworICAgICAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9CQU5ERURHRVNfV0lORE9XU19ERUJVRworICAgICAgICAgICAgem1fZGJnKCgiemZHZXRNYXhFZGdlUG93ZXIgaW5kZXg9PmktMSA9ICVkIFxuIiwgaS0xKSk7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgfQorICAgIH0KKworICAgIHptX2Fzc2VydChtYXhFZGdlUG93ZXIgPiAwKTsKKworICAjaWZkZWYgWk1fRU5BQkxFX0JBTkRFREdFU19XSU5ET1dTX0RFQlVHCisgICAgaWYgKCBtYXhFZGdlUG93ZXIgPT0gQVI1NDE2X01BWF9SQVRFX1BPV0VSICkKKyAgICB7CisgICAgICAgIHptX2RiZygoInpmR2V0TWF4RWRnZVBvd2VyID0gJWQgISEhXG4iLCBBUjU0MTZfTUFYX1JBVEVfUE9XRVIpKTsKKyAgICB9CisgICNlbmRpZgorICAgIHJldHVybiBtYXhFZGdlUG93ZXI7Cit9CisKK3UzMl90IHpmQWRqdXN0SFQ0MEZyZXFPZmZzZXQoemRldl90KiBkZXYsIHUzMl90IGZyZXF1ZW5jeSwgdThfdCBidzQwLCB1OF90IGV4dE9mZnNldCkKK3sKKyAgICB1MzJfdCBuZXdGcmVxID0gZnJlcXVlbmN5OworCisJaWYgKGJ3NDAgPT0gMSkKKwl7CisgICAgICAgIGlmIChleHRPZmZzZXQgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgbmV3RnJlcSArPSAxMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG5ld0ZyZXEgLT0gMTA7CisgICAgICAgIH0KKwl9CisJcmV0dXJuIG5ld0ZyZXE7Cit9CisKK3UzMl90IHpmSHBDaGVja0RvSGVhdnlDbGlwKHpkZXZfdCogZGV2LCB1MzJfdCBmcmVxLCBDQUxfQ1RMX0VER0VTICpwQ3RsRWRnZXMsIHU4X3QgYnc0MCkKK3sKKyAgICB1MzJfdCByZXQgPSAwOworICAgIHU4X3QgaTsKKyAgICB1OF90IGlzMkdIejsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdjsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIGhwUHJpdiA9IHdkLT5ocFByaXZhdGU7CisKKyAgICBpZihmcmVxID4gWk1fQ0hfR18xNCkKKyAgICAgICAgaXMyR0h6ID0gMDsKKyAgICBlbHNlCisgICAgICAgIGlzMkdIeiA9IDE7CisKKyAgICAvKiBIVDQwIGZvcmNlIGVuYWJsZSBoZWF2eSBjbGlwICovCisgICAgaWYgKGJ3NDApCisgICAgeworICAgICAgICByZXQgfD0gMHhmMDsKKyAgICB9CisjaWYgMQorICAgIC8qIEhUMjAgOiBmcmVxdWVuY3kgYmFuZGVkZ2UgKi8KKyAgICBmb3IgKGkgPSAwOyAoaSA8IEFSNTQxNl9OVU1fQkFORF9FREdFUykgJiYgKHBDdGxFZGdlc1tpXS5iQ2hhbm5lbCAhPSBBUjU0MTZfQkNIQU5fVU5VU0VEKSA7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChmcmVxID09IGZiaW4yZnJlcShwQ3RsRWRnZXNbaV0uYkNoYW5uZWwsIGlzMkdIeikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwQ3RsRWRnZXNbaV0uZmxhZyA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldCB8PSAweGY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIHJldDsKK30KKworCit2b2lkIHpmU2V0UG93ZXJDYWxUYWJsZSh6ZGV2X3QqIGRldiwgdTMyX3QgZnJlcXVlbmN5LCB1OF90IGJ3NDAsIHU4X3QgZXh0T2Zmc2V0KQoreworICAgIHN0cnVjdCBhcjU0MTZFZXByb20qIGVlcHJvbUltYWdlOworICAgIHU4X3QgcHdyMFs1XTsKKyAgICB1OF90IHB3cjFbNV07CisgICAgdThfdCB2cGQwWzVdOworICAgIHU4X3QgdnBkMVs1XTsKKyAgICB1OF90IHZwZF9jaGFpbjFbMTI4XTsKKyAgICB1OF90IHZwZF9jaGFpbjNbMTI4XTsKKyAgICB1MTZfdCBib3VuZGFyeTEgPSAxODsgLy9DUiA2NjcKKyAgICB1MTZfdCBwb3dlclR4TWF4ID0gNjM7IC8vQ1IgNzkKKyAgICB1OF90IGk7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXY7CisgICAgdThfdCBmYmluOworICAgIHU4X3QgaW5kZXgsIG1heDJnSW5kZXgsIG1heDVnSW5kZXg7CisgICAgdThfdCBjaGFpbjBwd3JQZGcwWzVdOworICAgIHU4X3QgY2hhaW4wdnBkUGRnMFs1XTsKKyAgICB1OF90IGNoYWluMHB3clBkZzFbNV07CisgICAgdThfdCBjaGFpbjB2cGRQZGcxWzVdOworICAgIHU4X3QgY2hhaW4ycHdyUGRnMFs1XTsKKyAgICB1OF90IGNoYWluMnZwZFBkZzBbNV07CisgICAgdThfdCBjaGFpbjJwd3JQZGcxWzVdOworICAgIHU4X3QgY2hhaW4ydnBkUGRnMVs1XTsKKyAgICB1OF90IGZiaW5BcnJheVs4XTsKKworICAgIC8qIDQgQ1RMICovCisgICAgdThfdCBjdGxfaTsKKyAgICB1OF90IGRlc2lyZWRfQ3RsSW5kZXg7CisKKyAgICB1OF90IGN0bEVkZ2VzTWF4UG93ZXJDQ0sgPSBBUjU0MTZfTUFYX1JBVEVfUE9XRVI7CisgICAgdThfdCBjdGxFZGdlc01heFBvd2VyMkcgPSBBUjU0MTZfTUFYX1JBVEVfUE9XRVI7CisgICAgdThfdCBjdGxFZGdlc01heFBvd2VyMkdIVDIwID0gQVI1NDE2X01BWF9SQVRFX1BPV0VSOworICAgIHU4X3QgY3RsRWRnZXNNYXhQb3dlcjJHSFQ0MCA9IEFSNTQxNl9NQVhfUkFURV9QT1dFUjsKKyAgICB1OF90IGN0bEVkZ2VzTWF4UG93ZXI1RyA9IEFSNTQxNl9NQVhfUkFURV9QT1dFUjsKKyAgICB1OF90IGN0bEVkZ2VzTWF4UG93ZXI1R0hUMjAgPSBBUjU0MTZfTUFYX1JBVEVfUE9XRVI7CisgICAgdThfdCBjdGxFZGdlc01heFBvd2VyNUdIVDQwID0gQVI1NDE2X01BWF9SQVRFX1BPV0VSOworCisgICAgdThfdCBjdGxPZmZzZXQ7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBocFByaXYgPSB3ZC0+aHBQcml2YXRlOworCisgICAgZWVwcm9tSW1hZ2UgPSAoc3RydWN0IGFyNTQxNkVlcHJvbSopJihocFByaXYtPmVlcHJvbUltYWdlWygxMDI0KzUxMikvNF0pOworCisgICAgLy8gQ2hlY2sgdGhlIHRvdGFsIGJ5dGVzIG9mIHRoZSBFRVBST00gc3RydWN0dXJlIHRvIHNlZSB0aGUgZG9uZ2xlIGhhdmUgYmVlbiBjYWxpYnJhdGVkIG9yIG5vdC4KKyAgICBpZiAoZWVwcm9tSW1hZ2UtPmJhc2VFZXBIZWFkZXIubGVuZ3RoID09IDB4ZmZmZikKKyAgICB7CisgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfQkFOREVER0VTX1dJTkRPV1NfREVCVUcKKyAgICAgICAgem1fZGJnKCgiV2FybmluZyEgVGhpcyBkb25nbGUgbm90IGJlZW4gY2FsaWJyYXRlZFxuIikpOworICAgICAgICAjZW5kaWYKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgICNpZmRlZiBaTV9FTkFCTEVfVFBDX1dJTkRPV1NfREVCVUcKKyAgICBEYmdQcmludCgiLS0tLS16ZlNldFBvd2VyQ2FsVGFibGUgOiBmcmVxdWVuY3k9JWQtLS0tLVxuIiwgZnJlcXVlbmN5KTsKKyAgICAjZW5kaWYKKyAgICAvKiBUT0RPIDogMS4gYm91bmRhcnkxIGFuZCBwb3dlclR4TWF4IHNob3VsZCBiZSByZWZlcmVkIHRvIENSNjY3IGFuZCBDUjc5ICovCisgICAgLyogICAgICAgICAgIGluIG90dXMuaW5pIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgI2lmZGVmIFpNX0VOQUJMRV9UUENfV0lORE9XU19ERUJVRworICAgIC8qIDIuIEludGVycG9sYXRlIHB3ciBhbmQgdnBkIHRlc3QgcG9pbnRzIGZyb20gZnJlcXVlbmN5ICovCisgICAgRGJnUHJpbnQoImNhbEZyZXFQaWVyNUcgOiAlZCwgJWQsICVkLCAlZCAsJWQsICVkLCAlZCwgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjVHWzBdKjUrNDgwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyNUdbMV0qNSs0ODAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXI1R1syXSo1KzQ4MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjVHWzNdKjUrNDgwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyNUdbNF0qNSs0ODAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXI1R1s1XSo1KzQ4MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjVHWzZdKjUrNDgwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyNUdbN10qNSs0ODAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgRGJnUHJpbnQoImNhbEZyZXFQaWVyMkcgOiAlZCwgJWQsICVkLCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyMkdbMF0rMjMwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyMkdbMV0rMjMwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyMkdbMl0rMjMwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyMkdbM10rMjMwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICNlbmRpZgorICAgIGlmIChmcmVxdWVuY3kgPCAzMDAwKQorICAgIHsKKyAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyMkdbaV0gPT0gMHhmZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtYXgyZ0luZGV4ID0gaTsKKyAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9UUENfV0lORE9XU19ERUJVRworICAgICAgICBEYmdQcmludCgibWF4MmdJbmRleCA6ICVkXG4iLCBtYXgyZ0luZGV4KTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIGZiaW4gPSAodThfdCkoZnJlcXVlbmN5IC0gMjMwMCk7CisgICAgICAgIGluZGV4ID0gemZGaW5kRnJlcUluZGV4KGZiaW4sIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjJHLCBtYXgyZ0luZGV4KTsKKyAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9UUENfV0lORE9XU19ERUJVRworICAgICAgICBEYmdQcmludCgiMkcgaW5kZXggOiAlZFxuIiwgaW5kZXgpOworICAgICAgICBEYmdQcmludCgiY2hhaW4gMCBpbmRleFxuIik7CisgICAgICAgICNlbmRpZgorICAgICAgICB6ZlByaW50VHAoJmVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTJHWzBdW2luZGV4XS5wd3JQZGdbMF1bMF0sCisgICAgICAgICAgICAgICAgICAmZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhMkdbMF1baW5kZXhdLnZwZFBkZ1swXVswXSwKKyAgICAgICAgICAgICAgICAgICZlZXByb21JbWFnZS0+Y2FsUGllckRhdGEyR1swXVtpbmRleF0ucHdyUGRnWzFdWzBdLAorICAgICAgICAgICAgICAgICAgJmVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTJHWzBdW2luZGV4XS52cGRQZGdbMV1bMF0KKyAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfVFBDX1dJTkRPV1NfREVCVUcKKyAgICAgICAgRGJnUHJpbnQoImNoYWluIDAgaW5kZXgrMVxuIik7CisgICAgICAgICNlbmRpZgorICAgICAgICB6ZlByaW50VHAoJmVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTJHWzBdW2luZGV4KzFdLnB3clBkZ1swXVswXSwKKyAgICAgICAgICAgICAgICAgICZlZXByb21JbWFnZS0+Y2FsUGllckRhdGEyR1swXVtpbmRleCsxXS52cGRQZGdbMF1bMF0sCisgICAgICAgICAgICAgICAgICAmZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhMkdbMF1baW5kZXgrMV0ucHdyUGRnWzFdWzBdLAorICAgICAgICAgICAgICAgICAgJmVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTJHWzBdW2luZGV4KzFdLnZwZFBkZ1sxXVswXQorICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICBmb3IgKGk9MDsgaTw1OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYWluMHB3clBkZzBbaV0gPSB6ZkludGVycG9sYXRlRnVuY1goZmJpbiwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyMkdbaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGEyR1swXVtpbmRleF0ucHdyUGRnWzBdW2ldLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXIyR1tpbmRleCsxXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhMkdbMF1baW5kZXgrMV0ucHdyUGRnWzBdW2ldCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBjaGFpbjB2cGRQZGcwW2ldID0gemZJbnRlcnBvbGF0ZUZ1bmNYKGZiaW4sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjJHW2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhMkdbMF1baW5kZXhdLnZwZFBkZ1swXVtpXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyMkdbaW5kZXgrMV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTJHWzBdW2luZGV4KzFdLnZwZFBkZ1swXVtpXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgY2hhaW4wcHdyUGRnMVtpXSA9IHpmSW50ZXJwb2xhdGVGdW5jWChmYmluLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXIyR1tpbmRleF0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTJHWzBdW2luZGV4XS5wd3JQZGdbMV1baV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjJHW2luZGV4KzFdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGEyR1swXVtpbmRleCsxXS5wd3JQZGdbMV1baV0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGNoYWluMHZwZFBkZzFbaV0gPSB6ZkludGVycG9sYXRlRnVuY1goZmJpbiwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyMkdbaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGEyR1swXVtpbmRleF0udnBkUGRnWzFdW2ldLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXIyR1tpbmRleCsxXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhMkdbMF1baW5kZXgrMV0udnBkUGRnWzFdW2ldCisgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIGNoYWluMnB3clBkZzBbaV0gPSB6ZkludGVycG9sYXRlRnVuY1goZmJpbiwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyMkdbaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGEyR1sxXVtpbmRleF0ucHdyUGRnWzBdW2ldLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXIyR1tpbmRleCsxXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhMkdbMV1baW5kZXgrMV0ucHdyUGRnWzBdW2ldCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBjaGFpbjJ2cGRQZGcwW2ldID0gemZJbnRlcnBvbGF0ZUZ1bmNYKGZiaW4sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjJHW2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhMkdbMV1baW5kZXhdLnZwZFBkZ1swXVtpXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyMkdbaW5kZXgrMV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTJHWzFdW2luZGV4KzFdLnZwZFBkZ1swXVtpXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgY2hhaW4ycHdyUGRnMVtpXSA9IHpmSW50ZXJwb2xhdGVGdW5jWChmYmluLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXIyR1tpbmRleF0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTJHWzFdW2luZGV4XS5wd3JQZGdbMV1baV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjJHW2luZGV4KzFdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGEyR1sxXVtpbmRleCsxXS5wd3JQZGdbMV1baV0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGNoYWluMnZwZFBkZzFbaV0gPSB6ZkludGVycG9sYXRlRnVuY1goZmJpbiwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyMkdbaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGEyR1sxXVtpbmRleF0udnBkUGRnWzFdW2ldLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXIyR1tpbmRleCsxXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhMkdbMV1baW5kZXgrMV0udnBkUGRnWzFdW2ldCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChpPTA7IGk8ODsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyNUdbaV0gPT0gMHhmZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtYXg1Z0luZGV4ID0gaTsKKyAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9UUENfV0lORE9XU19ERUJVRworICAgICAgICBEYmdQcmludCgibWF4NWdJbmRleCA6ICVkXG4iLCBtYXg1Z0luZGV4KTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIGZiaW4gPSAodThfdCkoKGZyZXF1ZW5jeSAtIDQ4MDApLzUpOworICAgICAgICBpbmRleCA9IHpmRmluZEZyZXFJbmRleChmYmluLCBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXI1RywgbWF4NWdJbmRleCk7CisgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfVFBDX1dJTkRPV1NfREVCVUcKKyAgICAgICAgRGJnUHJpbnQoIjVHIGluZGV4IDogJWRcbiIsIGluZGV4KTsKKyAgICAgICAgI2VuZGlmCisKKyAgICAgICAgZm9yIChpPTA7IGk8NTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBjaGFpbjBwd3JQZGcwW2ldID0gemZJbnRlcnBvbGF0ZUZ1bmNYKGZiaW4sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjVHW2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhNUdbMF1baW5kZXhdLnB3clBkZ1swXVtpXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyNUdbaW5kZXgrMV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTVHWzBdW2luZGV4KzFdLnB3clBkZ1swXVtpXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgY2hhaW4wdnBkUGRnMFtpXSA9IHpmSW50ZXJwb2xhdGVGdW5jWChmYmluLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXI1R1tpbmRleF0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTVHWzBdW2luZGV4XS52cGRQZGdbMF1baV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjVHW2luZGV4KzFdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGE1R1swXVtpbmRleCsxXS52cGRQZGdbMF1baV0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGNoYWluMHB3clBkZzFbaV0gPSB6ZkludGVycG9sYXRlRnVuY1goZmJpbiwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyNUdbaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGE1R1swXVtpbmRleF0ucHdyUGRnWzFdW2ldLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXI1R1tpbmRleCsxXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhNUdbMF1baW5kZXgrMV0ucHdyUGRnWzFdW2ldCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBjaGFpbjB2cGRQZGcxW2ldID0gemZJbnRlcnBvbGF0ZUZ1bmNYKGZiaW4sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjVHW2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhNUdbMF1baW5kZXhdLnZwZFBkZ1sxXVtpXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyNUdbaW5kZXgrMV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTVHWzBdW2luZGV4KzFdLnZwZFBkZ1sxXVtpXQorICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICBjaGFpbjJwd3JQZGcwW2ldID0gemZJbnRlcnBvbGF0ZUZ1bmNYKGZiaW4sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjVHW2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhNUdbMV1baW5kZXhdLnB3clBkZ1swXVtpXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyNUdbaW5kZXgrMV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTVHWzFdW2luZGV4KzFdLnB3clBkZ1swXVtpXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgY2hhaW4ydnBkUGRnMFtpXSA9IHpmSW50ZXJwb2xhdGVGdW5jWChmYmluLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXI1R1tpbmRleF0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTVHWzFdW2luZGV4XS52cGRQZGdbMF1baV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjVHW2luZGV4KzFdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGE1R1sxXVtpbmRleCsxXS52cGRQZGdbMF1baV0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGNoYWluMnB3clBkZzFbaV0gPSB6ZkludGVycG9sYXRlRnVuY1goZmJpbiwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyNUdbaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsUGllckRhdGE1R1sxXVtpbmRleF0ucHdyUGRnWzFdW2ldLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsRnJlcVBpZXI1R1tpbmRleCsxXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhNUdbMV1baW5kZXgrMV0ucHdyUGRnWzFdW2ldCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBjaGFpbjJ2cGRQZGcxW2ldID0gemZJbnRlcnBvbGF0ZUZ1bmNYKGZiaW4sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxGcmVxUGllcjVHW2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFBpZXJEYXRhNUdbMV1baW5kZXhdLnZwZFBkZ1sxXVtpXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbEZyZXFQaWVyNUdbaW5kZXgrMV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxQaWVyRGF0YTVHWzFdW2luZGV4KzFdLnZwZFBkZ1sxXVtpXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qIENoYWluIDEgKi8KKyAgICAvKiBHZXQgcHdyIGFuZCB2cGQgdGVzdCBwb2ludHMgZnJvbSBmcmVxdWVuY3kgKi8KKyAgICBmb3IgKGk9MDsgaTw1OyBpKyspCisgICAgeworICAgICAgICBwd3IwW2ldID0gY2hhaW4wcHdyUGRnMFtpXT4+MTsKKyAgICAgICAgdnBkMFtpXSA9IGNoYWluMHZwZFBkZzBbaV07CisgICAgICAgIHB3cjFbaV0gPSBjaGFpbjBwd3JQZGcxW2ldPj4xOworICAgICAgICB2cGQxW2ldID0gY2hhaW4wdnBkUGRnMVtpXTsKKyAgICB9CisgICAgI2lmZGVmIFpNX0VOQUJMRV9UUENfV0lORE9XU19ERUJVRworICAgIERiZ1ByaW50KCJUZXN0IFBvaW50c1xuIik7CisgICAgRGJnUHJpbnQoInB3cjAgOiAlZCwgJWQsICVkLCAlZCAsJWRcbiIsIHB3cjBbMF0sIHB3cjBbMV0sIHB3cjBbMl0sIHB3cjBbM10sIHB3cjBbNF0pOworICAgIERiZ1ByaW50KCJ2cGQwIDogJWQsICVkLCAlZCwgJWQgLCVkXG4iLCB2cGQwWzBdLCB2cGQwWzFdLCB2cGQwWzJdLCB2cGQwWzNdLCB2cGQwWzRdKTsKKyAgICBEYmdQcmludCgicHdyMSA6ICVkLCAlZCwgJWQsICVkICwlZFxuIiwgcHdyMVswXSwgcHdyMVsxXSwgcHdyMVsyXSwgcHdyMVszXSwgcHdyMVs0XSk7CisgICAgRGJnUHJpbnQoInZwZDEgOiAlZCwgJWQsICVkLCAlZCAsJWRcbiIsIHZwZDFbMF0sIHZwZDFbMV0sIHZwZDFbMl0sIHZwZDFbM10sIHZwZDFbNF0pOworICAgICNlbmRpZgorICAgIC8qIEdlbmVyYXRlIHRoZSB2cGQgYXJyYXlzICovCisgICAgZm9yIChpPTA7IGk8Ym91bmRhcnkxKzErNjsgaSsrKQorICAgIHsKKyAgICAgICAgdnBkX2NoYWluMVtpXSA9IHpmR2V0SW50ZXJwb2xhdGVkVmFsdWUoaSwgJnB3cjBbMF0sICZ2cGQwWzBdKTsKKyAgICB9CisgICAgZm9yICg7IGk8cG93ZXJUeE1heCsxKzYrNjsgaSsrKQorICAgIHsKKyAgICAgICAgdnBkX2NoYWluMVtpXSA9IHpmR2V0SW50ZXJwb2xhdGVkVmFsdWUoaS02LTYsICZwd3IxWzBdLCAmdnBkMVswXSk7CisgICAgfQorICAgICNpZmRlZiBaTV9FTkFCTEVfVFBDX1dJTkRPV1NfREVCVUcKKyAgICBEYmdQcmludCgidnBkX2NoYWluMVxuIik7CisgICAgZm9yIChpPTA7IGk8cG93ZXJUeE1heCsxKzYrNjsgaSs9MTApCisgICAgeworICAgICAgICBEYmdQcmludCgiJWQsICVkLCAlZCwgJWQgLCVkLCAlZCwgJWQsICVkLCAlZCwgJWRcbiIsCisgICAgICAgICAgICAgICAgdnBkX2NoYWluMVtpKzBdLCB2cGRfY2hhaW4xW2krMV0sIHZwZF9jaGFpbjFbaSsyXSwgdnBkX2NoYWluMVtpKzNdLCB2cGRfY2hhaW4xW2krNF0sCisgICAgICAgICAgICAgICAgdnBkX2NoYWluMVtpKzVdLCB2cGRfY2hhaW4xW2krNl0sIHZwZF9jaGFpbjFbaSs3XSwgdnBkX2NoYWluMVtpKzhdLCB2cGRfY2hhaW4xW2krOV0pOworICAgIH0KKyAgICAjZW5kaWYKKyAgICAvKiBXcml0ZSBQSFkgcmVncyA2NzItNzAzICovCisgICAgZm9yIChpPTA7IGk8MTI4OyBpKz00KQorICAgIHsKKyAgICAgICAgdTMyX3QgcmVnQWRkciA9IDB4OTgwMCArICg2NzIgKiA0KTsKKyAgICAgICAgdTMyX3QgdmFsOworCisgICAgICAgIHZhbCA9ICgodTMyX3QpdnBkX2NoYWluMVtpKzNdPDwyNCkgfAorICAgICAgICAgICAgICAgICgodTMyX3QpdnBkX2NoYWluMVtpKzJdPDwxNikgfAorICAgICAgICAgICAgICAgICgodTMyX3QpdnBkX2NoYWluMVtpKzFdPDw4KSB8CisgICAgICAgICAgICAgICAgKCh1MzJfdCl2cGRfY2hhaW4xW2ldKTsKKworICAgICAgICAjaWZuZGVmIFpNX09UVVNfTElOVVhfUEhBU0VfMgorICAgICAgICByZWdfd3JpdGUocmVnQWRkciArIGksIHZhbCk7ICAvKiBDUjY3MiAqLworICAgICAgICAjZW5kaWYKKyAgICB9CisKKyAgICAvKiBDaGFpbiAyICovCisgICAgLyogR2V0IHB3ciBhbmQgdnBkIHRlc3QgcG9pbnRzIGZyb20gZnJlcXVlbmN5ICovCisgICAgZm9yIChpPTA7IGk8NTsgaSsrKQorICAgIHsKKyAgICAgICAgcHdyMFtpXSA9IGNoYWluMnB3clBkZzBbaV0+PjE7CisgICAgICAgIHZwZDBbaV0gPSBjaGFpbjJ2cGRQZGcwW2ldOworICAgICAgICBwd3IxW2ldID0gY2hhaW4ycHdyUGRnMVtpXT4+MTsKKyAgICAgICAgdnBkMVtpXSA9IGNoYWluMnZwZFBkZzFbaV07CisgICAgfQorICAgICNpZmRlZiBaTV9FTkFCTEVfVFBDX1dJTkRPV1NfREVCVUcKKyAgICBEYmdQcmludCgiVGVzdCBQb2ludHNcbiIpOworICAgIERiZ1ByaW50KCJwd3IwIDogJWQsICVkLCAlZCwgJWQgLCVkXG4iLCBwd3IwWzBdLCBwd3IwWzFdLCBwd3IwWzJdLCBwd3IwWzNdLCBwd3IwWzRdKTsKKyAgICBEYmdQcmludCgidnBkMCA6ICVkLCAlZCwgJWQsICVkICwlZFxuIiwgdnBkMFswXSwgdnBkMFsxXSwgdnBkMFsyXSwgdnBkMFszXSwgdnBkMFs0XSk7CisgICAgRGJnUHJpbnQoInB3cjEgOiAlZCwgJWQsICVkLCAlZCAsJWRcbiIsIHB3cjFbMF0sIHB3cjFbMV0sIHB3cjFbMl0sIHB3cjFbM10sIHB3cjFbNF0pOworICAgIERiZ1ByaW50KCJ2cGQxIDogJWQsICVkLCAlZCwgJWQgLCVkXG4iLCB2cGQxWzBdLCB2cGQxWzFdLCB2cGQxWzJdLCB2cGQxWzNdLCB2cGQxWzRdKTsKKyAgICAjZW5kaWYKKyAgICAvKiBHZW5lcmF0ZSB0aGUgdnBkIGFycmF5cyAqLworICAgIGZvciAoaT0wOyBpPGJvdW5kYXJ5MSsxKzY7IGkrKykKKyAgICB7CisgICAgICAgIHZwZF9jaGFpbjNbaV0gPSB6ZkdldEludGVycG9sYXRlZFZhbHVlKGksICZwd3IwWzBdLCAmdnBkMFswXSk7CisgICAgfQorICAgIGZvciAoOyBpPHBvd2VyVHhNYXgrMSs2KzY7IGkrKykKKyAgICB7CisgICAgICAgIHZwZF9jaGFpbjNbaV0gPSB6ZkdldEludGVycG9sYXRlZFZhbHVlKGktNi02LCAmcHdyMVswXSwgJnZwZDFbMF0pOworICAgIH0KKyAgICAjaWZkZWYgWk1fRU5BQkxFX1RQQ19XSU5ET1dTX0RFQlVHCisgICAgRGJnUHJpbnQoInZwZF9jaGFpbjNcbiIpOworICAgIGZvciAoaT0wOyBpPHBvd2VyVHhNYXgrMSs2KzY7IGkrPTEwKQorICAgIHsKKyAgICAgICAgRGJnUHJpbnQoIiVkLCAlZCwgJWQsICVkICwlZCwgJWQsICVkLCAlZCwgJWQsICVkXG4iLAorICAgICAgICAgICAgICAgIHZwZF9jaGFpbjNbaSswXSwgdnBkX2NoYWluM1tpKzFdLCB2cGRfY2hhaW4zW2krMl0sIHZwZF9jaGFpbjNbaSszXSwgdnBkX2NoYWluM1tpKzRdLAorICAgICAgICAgICAgICAgIHZwZF9jaGFpbjNbaSs1XSwgdnBkX2NoYWluM1tpKzZdLCB2cGRfY2hhaW4zW2krN10sIHZwZF9jaGFpbjNbaSs4XSwgdnBkX2NoYWluM1tpKzldKTsKKyAgICB9CisgICAgI2VuZGlmCisKKyAgICAvKiBXcml0ZSBQSFkgcmVncyA2NzItNzAzICsgMHgxMDAwICovCisgICAgZm9yIChpPTA7IGk8MTI4OyBpKz00KQorICAgIHsKKyAgICAgICAgdTMyX3QgcmVnQWRkciA9IDB4OTgwMCArICg2NzIgKiA0KSArIDB4MTAwMDsKKyAgICAgICAgdTMyX3QgdmFsOworCisgICAgICAgIHZhbCA9ICgodTMyX3QpdnBkX2NoYWluM1tpKzNdPDwyNCkgfAorICAgICAgICAgICAgICAgICgodTMyX3QpdnBkX2NoYWluM1tpKzJdPDwxNikgfAorICAgICAgICAgICAgICAgICgodTMyX3QpdnBkX2NoYWluM1tpKzFdPDw4KSB8CisgICAgICAgICAgICAgICAgKCh1MzJfdCl2cGRfY2hhaW4zW2ldKTsKKworICAgICAgICAjaWZuZGVmIFpNX09UVVNfTElOVVhfUEhBU0VfMgorICAgICAgICByZWdfd3JpdGUocmVnQWRkciArIGksIHZhbCk7ICAvKiBDUjY3MiAqLworICAgICAgICAjZW5kaWYKKyAgICB9CisKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworCisgICAgLyogMy4gR2VuZXJhdGUgdGFyZ2V0IHBvd2VyIHRhYmxlICovCisgICAgaWYgKGZyZXF1ZW5jeSA8IDMwMDApCisgICAgeworICAgICAgICBmb3IgKGk9MDsgaTwzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXJDY2tbaV0uYkNoYW5uZWwgIT0gMHhmZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmYmluQXJyYXlbaV0gPSBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXJDY2tbaV0uYkNoYW5uZWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBpbmRleCA9IHpmRmluZEZyZXFJbmRleChmYmluLCBmYmluQXJyYXksIGkpOworICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX1RQQ19XSU5ET1dTX0RFQlVHCisgICAgICAgIERiZ1ByaW50KCJDQ0sgaW5kZXg9JWRcbiIsIGluZGV4KTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaHBQcml2LT50UG93MnhDY2tbaV0gPSB6ZkludGVycG9sYXRlRnVuY1goZmJpbiwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyQ2NrW2luZGV4XS5iQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyQ2NrW2luZGV4XS50UG93MnhbaV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlckNja1tpbmRleCsxXS5iQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyQ2NrW2luZGV4KzFdLnRQb3cyeFtpXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyMkdbaV0uYkNoYW5uZWwgIT0gMHhmZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmYmluQXJyYXlbaV0gPSBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXIyR1tpXS5iQ2hhbm5lbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGluZGV4ID0gemZGaW5kRnJlcUluZGV4KGZiaW4sIGZiaW5BcnJheSwgaSk7CisgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfVFBDX1dJTkRPV1NfREVCVUcKKyAgICAgICAgRGJnUHJpbnQoIjJHIGluZGV4PSVkXG4iLCBpbmRleCk7CisgICAgICAgICNlbmRpZgorICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4MmdbaV0gPSB6ZkludGVycG9sYXRlRnVuY1goZmJpbiwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyMkdbaW5kZXhdLmJDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXIyR1tpbmRleF0udFBvdzJ4W2ldLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXIyR1tpbmRleCsxXS5iQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyMkdbaW5kZXgrMV0udFBvdzJ4W2ldCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXIyR0hUMjBbaV0uYkNoYW5uZWwgIT0gMHhmZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmYmluQXJyYXlbaV0gPSBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXIyR0hUMjBbaV0uYkNoYW5uZWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBpbmRleCA9IHpmRmluZEZyZXFJbmRleChmYmluLCBmYmluQXJyYXksIGkpOworICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX1RQQ19XSU5ET1dTX0RFQlVHCisgICAgICAgIERiZ1ByaW50KCIyRyBIVDIwIGluZGV4PSVkXG4iLCBpbmRleCk7CisgICAgICAgICNlbmRpZgorICAgICAgICBmb3IgKGk9MDsgaTw4OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4MmdIdDIwW2ldID0gemZJbnRlcnBvbGF0ZUZ1bmNYKGZiaW4sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjJHSFQyMFtpbmRleF0uYkNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjJHSFQyMFtpbmRleF0udFBvdzJ4W2ldLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXIyR0hUMjBbaW5kZXgrMV0uYkNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjJHSFQyMFtpbmRleCsxXS50UG93MnhbaV0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjJHSFQ0MFtpXS5iQ2hhbm5lbCAhPSAweGZmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZiaW5BcnJheVtpXSA9IGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjJHSFQ0MFtpXS5iQ2hhbm5lbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGluZGV4ID0gemZGaW5kRnJlcUluZGV4KCAodThfdCl6ZkFkanVzdEhUNDBGcmVxT2Zmc2V0KGRldiwgZmJpbiwgYnc0MCwgZXh0T2Zmc2V0KSwgZmJpbkFycmF5LCBpKTsKKyAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9UUENfV0lORE9XU19ERUJVRworICAgICAgICBEYmdQcmludCgiMkcgSFQ0MCBpbmRleD0lZFxuIiwgaW5kZXgpOworICAgICAgICAjZW5kaWYKKyAgICAgICAgZm9yIChpPTA7IGk8ODsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBocFByaXYtPnRQb3cyeDJnSHQ0MFtpXSA9IHpmSW50ZXJwb2xhdGVGdW5jWCgKKyAgICAgICAgICAgICAgICAgICAgKHU4X3QpemZBZGp1c3RIVDQwRnJlcU9mZnNldChkZXYsIGZiaW4sIGJ3NDAsIGV4dE9mZnNldCksCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjJHSFQ0MFtpbmRleF0uYkNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjJHSFQ0MFtpbmRleF0udFBvdzJ4W2ldLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXIyR0hUNDBbaW5kZXgrMV0uYkNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjJHSFQ0MFtpbmRleCsxXS50UG93MnhbaV0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorCisgICAgICAgIHpmUHJpbnRUYXJnZXRQb3dlcjJHKGhwUHJpdi0+dFBvdzJ4Q2NrLAorICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4MmcsCisgICAgICAgICAgICAgICAgaHBQcml2LT50UG93MngyZ0h0MjAsCisgICAgICAgICAgICAgICAgaHBQcml2LT50UG93MngyZ0h0NDApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiA1RyAqLworICAgICAgICBmb3IgKGk9MDsgaTw4OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXI1R1tpXS5iQ2hhbm5lbCAhPSAweGZmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZiaW5BcnJheVtpXSA9IGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjVHW2ldLmJDaGFubmVsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgaW5kZXggPSB6ZkZpbmRGcmVxSW5kZXgoZmJpbiwgZmJpbkFycmF5LCBpKTsKKyAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9UUENfV0lORE9XU19ERUJVRworICAgICAgICBEYmdQcmludCgiNUcgaW5kZXg9JWRcbiIsIGluZGV4KTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaHBQcml2LT50UG93Mng1Z1tpXSA9IHpmSW50ZXJwb2xhdGVGdW5jWChmYmluLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXI1R1tpbmRleF0uYkNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjVHW2luZGV4XS50UG93MnhbaV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjVHW2luZGV4KzFdLmJDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXI1R1tpbmRleCsxXS50UG93MnhbaV0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaT0wOyBpPDg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjVHSFQyMFtpXS5iQ2hhbm5lbCAhPSAweGZmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZiaW5BcnJheVtpXSA9IGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjVHSFQyMFtpXS5iQ2hhbm5lbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGluZGV4ID0gemZGaW5kRnJlcUluZGV4KGZiaW4sIGZiaW5BcnJheSwgaSk7CisgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfVFBDX1dJTkRPV1NfREVCVUcKKyAgICAgICAgRGJnUHJpbnQoIjVHIEhUMjAgaW5kZXg9JWRcbiIsIGluZGV4KTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIGZvciAoaT0wOyBpPDg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaHBQcml2LT50UG93Mng1Z0h0MjBbaV0gPSB6ZkludGVycG9sYXRlRnVuY1goZmJpbiwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyNUdIVDIwW2luZGV4XS5iQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyNUdIVDIwW2luZGV4XS50UG93MnhbaV0sCisgICAgICAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jYWxUYXJnZXRQb3dlcjVHSFQyMFtpbmRleCsxXS5iQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyNUdIVDIwW2luZGV4KzFdLnRQb3cyeFtpXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpPTA7IGk8ODsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyNUdIVDQwW2ldLmJDaGFubmVsICE9IDB4ZmYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmJpbkFycmF5W2ldID0gZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyNUdIVDQwW2ldLmJDaGFubmVsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgaW5kZXggPSB6ZkZpbmRGcmVxSW5kZXgoKHU4X3QpemZBZGp1c3RIVDQwRnJlcU9mZnNldChkZXYsIGZiaW4sIGJ3NDAsIGV4dE9mZnNldCksIGZiaW5BcnJheSwgaSk7CisgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfVFBDX1dJTkRPV1NfREVCVUcKKyAgICAgICAgRGJnUHJpbnQoIjVHIEhUNDAgaW5kZXg9JWRcbiIsIGluZGV4KTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIGZvciAoaT0wOyBpPDg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaHBQcml2LT50UG93Mng1Z0h0NDBbaV0gPSB6ZkludGVycG9sYXRlRnVuY1goCisgICAgICAgICAgICAgICAgICAgICh1OF90KXpmQWRqdXN0SFQ0MEZyZXFPZmZzZXQoZGV2LCBmYmluLCBidzQwLCBleHRPZmZzZXQpLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXI1R0hUNDBbaW5kZXhdLmJDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXI1R0hUNDBbaW5kZXhdLnRQb3cyeFtpXSwKKyAgICAgICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmNhbFRhcmdldFBvd2VyNUdIVDQwW2luZGV4KzFdLmJDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICBlZXByb21JbWFnZS0+Y2FsVGFyZ2V0UG93ZXI1R0hUNDBbaW5kZXgrMV0udFBvdzJ4W2ldCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIH0KKworICAgICAgICB6ZlByaW50VGFyZ2V0UG93ZXI1RygKKyAgICAgICAgICAgICAgICBocFByaXYtPnRQb3cyeDVnLAorICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4NWdIdDIwLAorICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4NWdIdDQwKTsKKyAgICB9CisKKworCisgICAgLyogNC4gQ1RMICovCisgICAgLyoKKyAgICAgKiA0LjEgR2V0IHRoZSBiYW5kZWRnZXMgdHggcG93ZXIgYnkgZnJlcXVlbmN5CisgICAgICogICAgICAyLjRHIHdlIGdldCBjdGxFZGdlc01heFBvd2VyQ0NLCisgICAgICogICAgICAgICAgICAgICAgICBjdGxFZGdlc01heFBvd2VyMkcKKyAgICAgKiAgICAgICAgICAgICAgICAgIGN0bEVkZ2VzTWF4UG93ZXIyR0hUMjAKKyAgICAgKiAgICAgICAgICAgICAgICAgIGN0bEVkZ2VzTWF4UG93ZXIyR0hUNDAKKyAgICAgKiAgICAgIDVHIHdlIGdldCAgIGN0bEVkZ2VzTWF4UG93ZXI1RworICAgICAqICAgICAgICAgICAgICAgICAgY3RsRWRnZXNNYXhQb3dlcjVHSFQyMAorICAgICAqICAgICAgICAgICAgICAgICAgY3RsRWRnZXNNYXhQb3dlcjVHSFQ0MAorICAgICAqIDQuMiBVcGRhdGUgKDMuKSB0YXJnZXQgcG93ZXIgdGFibGUgYnkgNC4xCisgICAgICogNC4zIFR4IHBvd2VyIG9mZnNldCBmb3IgQVJUIC0gTkRJUy9NREsKKyAgICAgKiA0LjQgV3JpdGUgTUFDIHJlZyAweDY5NCBmb3IgQUNLJ3MgVFBDCisgICAgICoKKyAgICAgKi8KKworICAgIC8vemZEdW1wRWVwQmFuZEVkZ2VzKGVlcHJvbUltYWdlKTsKKworICAgIC8qIGdldCB0aGUgY2ZnIGZyb20gRWVwcm9tOiByZWdpb25Db2RlID0+IFJlZ3VsYXRvcnlEb21haW4gOiAweDEwLUZGQyAgMHgzMC1ldSAweDQwLWphcCAqLworICAgIGRlc2lyZWRfQ3RsSW5kZXggPSB6ZkhwR2V0UmVndWxhdG9yeURvbWFpbihkZXYpOworICAgIGlmICgoZGVzaXJlZF9DdGxJbmRleCA9PSAweDMwKSB8fCAoZGVzaXJlZF9DdGxJbmRleCA9PSAweDQwKSB8fCAoZGVzaXJlZF9DdGxJbmRleCA9PSAweDApKQorICAgIHsKKyAgICAgICAgLyogc2tpcCBDVEwgYW5kIGhlYXZ5IGNsaXAgKi8KKyAgICAgICAgaHBQcml2LT5lbmFibGVCQkhlYXZ5Q2xpcCA9IDA7CisgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfQkFOREVER0VTX1dJTkRPV1NfREVCVUcKKyAgICAgICAgem1fZGJnKCgiUmVndWxhdG9yeURvbWFpbiA9IDAsIHNraXAgQ1RMIGFuZCBoZWF2eSBjbGlwXG4iKSk7CisgICAgICAgICNlbmRpZgorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBocFByaXYtPmVuYWJsZUJCSGVhdnlDbGlwID0gMTsKKworICAgICAgICBpZiAoZGVzaXJlZF9DdGxJbmRleCA9PSAweGZmKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBkZXNpcmVkIGluZGV4IG5vdCBmb3VuZCAqLworICAgICAgICAgICAgZGVzaXJlZF9DdGxJbmRleCA9IDB4MTA7CisgICAgICAgIH0KKworICAgICAgICAvKiBmaXJzdCBwYXJ0IDogMi40RyAqLworICAgICAgICBpZiAoZnJlcXVlbmN5IDw9IFpNX0NIX0dfMTQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIDIuNEcgLSBDVExfMTFCICovCisgICAgICAgICAgICBjdGxfaSA9IHpmRmluZEN0bEVkZ2VzSW5kZXgoZGV2LCBkZXNpcmVkX0N0bEluZGV4fENUTF8xMUIpOworICAgICAgICAgICAgaWYoY3RsX2k8QVI1NDE2X05VTV9DVExTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN0bEVkZ2VzTWF4UG93ZXJDQ0sgPSB6ZkdldE1heEVkZ2VQb3dlcihkZXYsIGVlcHJvbUltYWdlLT5jdGxEYXRhW2N0bF9pXS5jdGxFZGdlc1sxXSwgZnJlcXVlbmN5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfQkFOREVER0VTX1dJTkRPV1NfREVCVUcKKyAgICAgICAgICAgIHptX2RiZygoIkNUTF8xMUIgY3RsX2kgPSAlZFxuIiwgY3RsX2kpKTsKKyAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICAvKiAyLjRHIC0gQ1RMXzExRyAqLworICAgICAgICAgICAgY3RsX2kgPSB6ZkZpbmRDdGxFZGdlc0luZGV4KGRldiwgZGVzaXJlZF9DdGxJbmRleHxDVExfMTFHKTsKKyAgICAgICAgICAgIGlmKGN0bF9pPEFSNTQxNl9OVU1fQ1RMUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdGxFZGdlc01heFBvd2VyMkcgPSB6ZkdldE1heEVkZ2VQb3dlcihkZXYsIGVlcHJvbUltYWdlLT5jdGxEYXRhW2N0bF9pXS5jdGxFZGdlc1sxXSwgZnJlcXVlbmN5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfQkFOREVER0VTX1dJTkRPV1NfREVCVUcKKyAgICAgICAgICAgIHptX2RiZygoIkNUTF8xMUcgY3RsX2kgPSAlZFxuIiwgY3RsX2kpKTsKKyAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICAvKiAyLjRHIC0gQ1RMXzJHSFQyMCAqLworICAgICAgICAgICAgY3RsX2kgPSB6ZkZpbmRDdGxFZGdlc0luZGV4KGRldiwgZGVzaXJlZF9DdGxJbmRleHxDVExfMkdIVDIwKTsKKyAgICAgICAgICAgIGlmKGN0bF9pPEFSNTQxNl9OVU1fQ1RMUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdGxFZGdlc01heFBvd2VyMkdIVDIwID0gemZHZXRNYXhFZGdlUG93ZXIoZGV2LCBlZXByb21JbWFnZS0+Y3RsRGF0YVtjdGxfaV0uY3RsRWRnZXNbMV0sIGZyZXF1ZW5jeSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogd29ya2Fyb3VuZCBmb3Igbm8gZGF0YSBpbiBFZXByb20sIHJlcGxhY2UgYnkgbm9ybWFsIDJHICovCisgICAgICAgICAgICAgICAgY3RsRWRnZXNNYXhQb3dlcjJHSFQyMCA9IGN0bEVkZ2VzTWF4UG93ZXIyRzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfQkFOREVER0VTX1dJTkRPV1NfREVCVUcKKyAgICAgICAgICAgIHptX2RiZygoIkNUTF8yR0hUMjAgY3RsX2kgPSAlZFxuIiwgY3RsX2kpKTsKKyAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICAvKiAyLjRHIC0gQ1RMXzJHSFQ0MCAqLworICAgICAgICAgICAgY3RsX2kgPSB6ZkZpbmRDdGxFZGdlc0luZGV4KGRldiwgZGVzaXJlZF9DdGxJbmRleHxDVExfMkdIVDQwKTsKKyAgICAgICAgICAgIGlmKGN0bF9pPEFSNTQxNl9OVU1fQ1RMUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdGxFZGdlc01heFBvd2VyMkdIVDQwID0gemZHZXRNYXhFZGdlUG93ZXIoZGV2LCBlZXByb21JbWFnZS0+Y3RsRGF0YVtjdGxfaV0uY3RsRWRnZXNbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZBZGp1c3RIVDQwRnJlcU9mZnNldChkZXYsIGZyZXF1ZW5jeSwgYnc0MCwgZXh0T2Zmc2V0KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogd29ya2Fyb3VuZCBmb3Igbm8gZGF0YSBpbiBFZXByb20sIHJlcGxhY2UgYnkgbm9ybWFsIDJHICovCisgICAgICAgICAgICAgICAgY3RsRWRnZXNNYXhQb3dlcjJHSFQ0MCA9IGN0bEVkZ2VzTWF4UG93ZXIyRzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfQkFOREVER0VTX1dJTkRPV1NfREVCVUcKKyAgICAgICAgICAgIHptX2RiZygoIkNUTF8yR0hUNDAgY3RsX2kgPSAlZFxuIiwgY3RsX2kpKTsKKyAgICAgICAgICAgICNlbmRpZgorCisKKyAgICAgICAgICAgIC8qIDdhMTcgOiAgKi8KKyAgICAgICAgICAgIC8qIE1heCBwb3dlciAoZEJtKSBmb3IgY2hhbm5lbCByYW5nZSB3aGVuIHVzaW5nIERGUyBkZWZpbmUgYnkgbWFkd2lmaSovCisgICAgICAgICAgICBmb3IgKGk9MDsgaTx3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbENudDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsID09IGZyZXF1ZW5jeSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh6ZkhwSXNEZnNDaGFubmVsKGRldiwgKHUxNl90KWZyZXF1ZW5jeSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzEoImZyZXF1ZW5jeSB1c2UgREZTICAtLSAiLCBmcmVxdWVuY3kpOworICAgICAgICAgICAgICAgICAgICAgICAgY3RsRWRnZXNNYXhQb3dlckNDSyAgICAgPSB6bV9taW4oY3RsRWRnZXNNYXhQb3dlckNDSywgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0ubWF4UmVnVHhQb3dlcioyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN0bEVkZ2VzTWF4UG93ZXIyRyAgICAgID0gem1fbWluKGN0bEVkZ2VzTWF4UG93ZXIyRywgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0ubWF4UmVnVHhQb3dlcioyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN0bEVkZ2VzTWF4UG93ZXIyR0hUMjAgID0gem1fbWluKGN0bEVkZ2VzTWF4UG93ZXIyR0hUMjAsIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLm1heFJlZ1R4UG93ZXIqMik7CisgICAgICAgICAgICAgICAgICAgICAgICBjdGxFZGdlc01heFBvd2VyMkdIVDQwICA9IHptX21pbihjdGxFZGdlc01heFBvd2VyMkdIVDQwLCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5tYXhSZWdUeFBvd2VyKjIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogQXBwbHkgY3RsIG1vZGUgdG8gY29ycmVjdCB0YXJnZXQgcG93ZXIgc2V0ICovCisgICAgICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX0JBTkRFREdFU19XSU5ET1dTX0RFQlVHCisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJjdGxFZGdlc01heFBvd2VyQ0NLICAgID0gIiwgY3RsRWRnZXNNYXhQb3dlckNDSyk7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJjdGxFZGdlc01heFBvd2VyMkcgICAgID0gIiwgY3RsRWRnZXNNYXhQb3dlcjJHKTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoImN0bEVkZ2VzTWF4UG93ZXIyR0hUMjAgPSAiLCBjdGxFZGdlc01heFBvd2VyMkdIVDIwKTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoImN0bEVkZ2VzTWF4UG93ZXIyR0hUNDAgPSAiLCBjdGxFZGdlc01heFBvd2VyMkdIVDQwKTsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4Q2NrW2ldID0gem1fbWluKGhwUHJpdi0+dFBvdzJ4Q2NrW2ldLCBjdGxFZGdlc01heFBvd2VyQ0NLKSArIEhBTFRYX1BPV0VSX09GRlNFVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4MmcyNEhlYXZ5Q2xpcE9mZnNldCA9IDA7CisgICAgICAgICAgICBpZiAoaHBQcml2LT5lbmFibGVCQkhlYXZ5Q2xpcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdGxPZmZzZXQgPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN0bE9mZnNldCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCgoZnJlcXVlbmN5ID09IDI0MTIpIHx8IChmcmVxdWVuY3kgPT0gMjQ2MikpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaHBQcml2LT50UG93MngyZ1tpXSA9IHptX21pbihocFByaXYtPnRQb3cyeDJnW2ldLCBjdGxFZGdlc01heFBvd2VyMkctY3RsT2Zmc2V0KSArIEhBTFRYX1BPV0VSX09GRlNFVDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4MmdbaV0gPSB6bV9taW4oaHBQcml2LT50UG93MngyZ1tpXSwgY3RsRWRnZXNNYXhQb3dlcjJHKSArIEhBTFRYX1BPV0VSX09GRlNFVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChocFByaXYtPnRQb3cyeDJnW2ldID4gKGN0bEVkZ2VzTWF4UG93ZXIyRy1jdGxPZmZzZXQpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4MmcyNEhlYXZ5Q2xpcE9mZnNldCA9IGhwUHJpdi0+dFBvdzJ4MmdbaV0gLSAoY3RsRWRnZXNNYXhQb3dlcjJHLWN0bE9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaHBQcml2LT50UG93MngyZ1tpXSA9IHptX21pbihocFByaXYtPnRQb3cyeDJnW2ldLCBjdGxFZGdlc01heFBvd2VyMkcpICsgSEFMVFhfUE9XRVJfT0ZGU0VUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaT0wOyBpPDg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKChmcmVxdWVuY3kgPT0gMjQxMikgfHwgKGZyZXF1ZW5jeSA9PSAyNDYyKSkgJiYgKGk+PTMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaHBQcml2LT50UG93MngyZ0h0MjBbaV0gPSB6bV9taW4oaHBQcml2LT50UG93MngyZ0h0MjBbaV0sIGN0bEVkZ2VzTWF4UG93ZXIyR0hUMjAtY3RsT2Zmc2V0KSArIEhBTFRYX1BPV0VSX09GRlNFVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaHBQcml2LT50UG93MngyZ0h0MjBbaV0gPSB6bV9taW4oaHBQcml2LT50UG93MngyZ0h0MjBbaV0sIGN0bEVkZ2VzTWF4UG93ZXIyR0hUMjApICsgSEFMVFhfUE9XRVJfT0ZGU0VUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaT0wOyBpPDg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKGZyZXF1ZW5jeSA9PSAyNDEyKSAmJiAoaT49MykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBocFByaXYtPnRQb3cyeDJnSHQ0MFtpXSA9IHptX21pbihocFByaXYtPnRQb3cyeDJnSHQ0MFtpXSwgY3RsRWRnZXNNYXhQb3dlcjJHSFQ0MC1jdGxPZmZzZXQpICsgSEFMVFhfUE9XRVJfT0ZGU0VUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICgoZnJlcXVlbmN5ID09IDI0NjIpICYmIChpPj0zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4MmdIdDQwW2ldID0gem1fbWluKGhwUHJpdi0+dFBvdzJ4MmdIdDQwW2ldLCBjdGxFZGdlc01heFBvd2VyMkdIVDQwLShjdGxPZmZzZXQqMikpICsgSEFMVFhfUE9XRVJfT0ZGU0VUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBocFByaXYtPnRQb3cyeDJnSHQ0MFtpXSA9IHptX21pbihocFByaXYtPnRQb3cyeDJnSHQ0MFtpXSwgY3RsRWRnZXNNYXhQb3dlcjJHSFQ0MCkgKyBIQUxUWF9QT1dFUl9PRkZTRVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogNUcgLSBDVExfMTFBICovCisgICAgICAgICAgICBjdGxfaSA9IHpmRmluZEN0bEVkZ2VzSW5kZXgoZGV2LCBkZXNpcmVkX0N0bEluZGV4fENUTF8xMUEpOworICAgICAgICAgICAgaWYoY3RsX2k8QVI1NDE2X05VTV9DVExTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN0bEVkZ2VzTWF4UG93ZXI1RyA9IHpmR2V0TWF4RWRnZVBvd2VyKGRldiwgZWVwcm9tSW1hZ2UtPmN0bERhdGFbY3RsX2ldLmN0bEVkZ2VzWzFdLCBmcmVxdWVuY3kpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2lmZGVmIFpNX0VOQUJMRV9CQU5ERURHRVNfV0lORE9XU19ERUJVRworICAgICAgICAgICAgem1fZGJnKCgiQ1RMXzExQSBjdGxfaSA9ICVkXG4iLCBjdGxfaSkpOworICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgIC8qIDVHIC0gQ1RMXzVHSFQyMCAqLworICAgICAgICAgICAgY3RsX2kgPSB6ZkZpbmRDdGxFZGdlc0luZGV4KGRldiwgZGVzaXJlZF9DdGxJbmRleHxDVExfNUdIVDIwKTsKKyAgICAgICAgICAgIGlmKGN0bF9pPEFSNTQxNl9OVU1fQ1RMUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdGxFZGdlc01heFBvd2VyNUdIVDIwID0gemZHZXRNYXhFZGdlUG93ZXIoZGV2LCBlZXByb21JbWFnZS0+Y3RsRGF0YVtjdGxfaV0uY3RsRWRnZXNbMV0sIGZyZXF1ZW5jeSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogd29ya2Fyb3VuZCBmb3Igbm8gZGF0YSBpbiBFZXByb20sIHJlcGxhY2UgYnkgbm9ybWFsIDVHICovCisgICAgICAgICAgICAgICAgY3RsRWRnZXNNYXhQb3dlcjVHSFQyMCA9IGN0bEVkZ2VzTWF4UG93ZXI1RzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfQkFOREVER0VTX1dJTkRPV1NfREVCVUcKKyAgICAgICAgICAgIHptX2RiZygoIkNUTF81R0hUMjAgY3RsX2kgPSAlZFxuIiwgY3RsX2kpKTsKKyAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICAvKiA1RyAtIENUTF81R0hUNDAgKi8KKyAgICAgICAgICAgIGN0bF9pID0gemZGaW5kQ3RsRWRnZXNJbmRleChkZXYsIGRlc2lyZWRfQ3RsSW5kZXh8Q1RMXzVHSFQ0MCk7CisgICAgICAgICAgICBpZihjdGxfaTxBUjU0MTZfTlVNX0NUTFMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3RsRWRnZXNNYXhQb3dlcjVHSFQ0MCA9IHpmR2V0TWF4RWRnZVBvd2VyKGRldiwgZWVwcm9tSW1hZ2UtPmN0bERhdGFbY3RsX2ldLmN0bEVkZ2VzWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmQWRqdXN0SFQ0MEZyZXFPZmZzZXQoZGV2LCBmcmVxdWVuY3ksIGJ3NDAsIGV4dE9mZnNldCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHdvcmthcm91bmQgZm9yIG5vIGRhdGEgaW4gRWVwcm9tLCByZXBsYWNlIGJ5IG5vcm1hbCA1RyAqLworICAgICAgICAgICAgICAgIGN0bEVkZ2VzTWF4UG93ZXI1R0hUNDAgPSBjdGxFZGdlc01heFBvd2VyNUc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX0JBTkRFREdFU19XSU5ET1dTX0RFQlVHCisgICAgICAgICAgICB6bV9kYmcoKCJDVExfNUdIVDQwIGN0bF9pID0gJWRcbiIsIGN0bF9pKSk7CisgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgLyogN2ExNyA6ICAqLworICAgICAgICAgICAgLyogTWF4IHBvd2VyIChkQm0pIGZvciBjaGFubmVsIHJhbmdlIHdoZW4gdXNpbmcgREZTIGRlZmluZSBieSBtYWR3aWZpKi8KKyAgICAgICAgICAgIGZvciAoaT0wOyBpPHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLmNoYW5uZWwgPT0gZnJlcXVlbmN5KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHpmSHBJc0Rmc0NoYW5uZWwoZGV2LCAodTE2X3QpZnJlcXVlbmN5KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiZnJlcXVlbmN5IHVzZSBERlMgIC0tICIsIGZyZXF1ZW5jeSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjdGxFZGdlc01heFBvd2VyNUcgICAgICA9IHptX21pbihjdGxFZGdlc01heFBvd2VyNUcsIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLm1heFJlZ1R4UG93ZXIqMik7CisgICAgICAgICAgICAgICAgICAgICAgICBjdGxFZGdlc01heFBvd2VyNUdIVDIwICA9IHptX21pbihjdGxFZGdlc01heFBvd2VyNUdIVDIwLCB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5tYXhSZWdUeFBvd2VyKjIpOworICAgICAgICAgICAgICAgICAgICAgICAgY3RsRWRnZXNNYXhQb3dlcjVHSFQ0MCAgPSB6bV9taW4oY3RsRWRnZXNNYXhQb3dlcjVHSFQ0MCwgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0ubWF4UmVnVHhQb3dlcioyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLyogQXBwbHkgY3RsIG1vZGUgdG8gY29ycmVjdCB0YXJnZXQgcG93ZXIgc2V0ICovCisgICAgICAgICAgICAjaWZkZWYgWk1fRU5BQkxFX0JBTkRFREdFU19XSU5ET1dTX0RFQlVHCisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJjdGxFZGdlc01heFBvd2VyNUcgICAgID0gIiwgY3RsRWRnZXNNYXhQb3dlcjVHKTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoImN0bEVkZ2VzTWF4UG93ZXI1R0hUMjAgPSAiLCBjdGxFZGdlc01heFBvd2VyNUdIVDIwKTsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzEoImN0bEVkZ2VzTWF4UG93ZXI1R0hUNDAgPSAiLCBjdGxFZGdlc01heFBvd2VyNUdIVDQwKTsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4NWdbaV0gPSB6bV9taW4oaHBQcml2LT50UG93Mng1Z1tpXSwgY3RsRWRnZXNNYXhQb3dlcjVHKSArIEhBTFRYX1BPV0VSX09GRlNFVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaT0wOyBpPDg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBocFByaXYtPnRQb3cyeDVnSHQyMFtpXSA9IHptX21pbihocFByaXYtPnRQb3cyeDVnSHQyMFtpXSwgY3RsRWRnZXNNYXhQb3dlcjVHSFQyMCkgKyBIQUxUWF9QT1dFUl9PRkZTRVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGk9MDsgaTw4OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaHBQcml2LT50UG93Mng1Z0h0NDBbaV0gPSB6bV9taW4oaHBQcml2LT50UG93Mng1Z0h0NDBbaV0sIGN0bEVkZ2VzTWF4UG93ZXI1R0hUNDApICsgSEFMVFhfUE9XRVJfT0ZGU0VUOworICAgICAgICAgICAgfQorCisgICAgICAgIH0vKiBlbmQgb2YgYmFuZGVkZ2VzIG9mIDVHICovCisgICAgfS8qIGVuZCBvZiAgaWYgKChkZXNpcmVkX0N0bEluZGV4ID0gemZIcEdldFJlZ3VsYXRvcnlEb21haW4oZGV2KSkgPT0gMCkgKi8KKworICAgIC8qIHdvcmthcm91bmQgKi8KKyAgICAvKiA1LiBCQiBoZWF2eSBjbGlwICovCisgICAgLyogICAgb25seSAyLjRHIGRvIGhlYXZ5IGNsaXAgKi8KKyAgICBpZiAoaHBQcml2LT5lbmFibGVCQkhlYXZ5Q2xpcCAmJiBocFByaXYtPmh3QkJIZWF2eUNsaXAgJiYgKGZyZXF1ZW5jeSA8PSBaTV9DSF9HXzE0KSkKKyAgICB7CisgICAgICAgIGlmIChmcmVxdWVuY3kgPD0gWk1fQ0hfR18xNCkKKyAgICAgICAgeworICAgICAgICAgICAgY3RsX2kgPSB6ZkZpbmRDdGxFZGdlc0luZGV4KGRldiwgZGVzaXJlZF9DdGxJbmRleHxDVExfMTFHKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGN0bF9pID0gemZGaW5kQ3RsRWRnZXNJbmRleChkZXYsIGRlc2lyZWRfQ3RsSW5kZXh8Q1RMXzExQSk7CisgICAgICAgIH0KKworICAgICAgICBocFByaXYtPnNldFZhbHVlSGVhdnlDbGlwID0gemZIcENoZWNrRG9IZWF2eUNsaXAoZGV2LCBmcmVxdWVuY3ksIGVlcHJvbUltYWdlLT5jdGxEYXRhW2N0bF9pXS5jdGxFZGdlc1sxXSwgYnc0MCk7CisKKyAgICAgICAgaWYgKGhwUHJpdi0+c2V0VmFsdWVIZWF2eUNsaXApCisgICAgICAgIHsKKyAgICAgICAgICAgIGhwUHJpdi0+ZG9CQkhlYXZ5Q2xpcCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBocFByaXYtPmRvQkJIZWF2eUNsaXAgPSAwOworICAgICAgICB9CisgICAgICAgICNpZmRlZiBaTV9FTkFCTEVfQkFOREVER0VTX1dJTkRPV1NfREVCVUcKKyAgICAgICAgem1fZGJnKCgiemZIcENoZWNrRG9IZWF2eUNsaXAgcmV0ID0gJTAyeCwgZG9CQkhlYXZ5Q2xpcCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICBocFByaXYtPnNldFZhbHVlSGVhdnlDbGlwLCBocFByaXYtPmRvQkJIZWF2eUNsaXApKTsKKyAgICAgICAgI2VuZGlmCisKKyAgICAgICAgaWYgKGhwUHJpdi0+ZG9CQkhlYXZ5Q2xpcCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGhwUHJpdi0+c2V0VmFsdWVIZWF2eUNsaXAgJiAweGYwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4MmdIdDQwWzBdIC09IDE7CisgICAgICAgICAgICAgICAgaHBQcml2LT50UG93MngyZ0h0NDBbMV0gLT0gMTsKKyAgICAgICAgICAgICAgICBocFByaXYtPnRQb3cyeDJnSHQ0MFsyXSAtPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaHBQcml2LT5zZXRWYWx1ZUhlYXZ5Q2xpcCAmIDB4ZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBocFByaXYtPnRQb3cyeDJnSHQyMFswXSArPSAxOworICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4MmdIdDIwWzFdICs9IDE7CisgICAgICAgICAgICAgICAgaHBQcml2LT50UG93MngyZ0h0MjBbMl0gKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBocFByaXYtPmRvQkJIZWF2eUNsaXAgPSAwOworICAgICAgICBocFByaXYtPnNldFZhbHVlSGVhdnlDbGlwID0gMDsKKyAgICB9CisKKyAgICAvKiBGaW5hbCA6IHdyaXRlIE1BQyByZWdpc3RlciBmb3Igc29tZSBjdHJsIGZyYW1lIFR4IHBvd2VyICovCisgICAgLyogZmlyc3QgcGFydCA6IDIuNEcgKi8KKyAgICBpZiAoZnJlcXVlbmN5IDw9IFpNX0NIX0dfMTQpCisgICAgeworICAgICAgICAvKiBXcml0ZSBNQUMgcmVnIDB4Njk0IGZvciBBQ0sncyBUUEMgKi8KKyAgICAgICAgLyogV3JpdGUgTUFDIHJlZyAweGJiNCBSVFMgYW5kIFNGLUNUUyBmcmFtZSBwb3dlciBjb250cm9sICovCisgICAgICAgIC8qIEFsd2F5cyB1c2UgdHdvIHN0cmVhbSBmb3IgbG93IGxlZ2FjeSByYXRlICovCisgICAgICAgICNpZiAwCisgICAgICAgIC8vaWYgKGhwUHJpdi0+aGFsQ2FwYWJpbGl0eSAmIFpNX0hQX0NBUF8xMU5fT05FX1RYX1NUUkVBTSkKKyAgICAgICAgLy97CisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzNjk0LCAoKGhwUHJpdi0+dFBvdzJ4MmdbMF0mMHgzZikgPDwgMjApIHwgKDB4MTw8MjYpKTsKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzNiYjQsICgoaHBQcml2LT50UG93MngyZ1swXSYweDNmKSA8PCA1ICkgfCAoMHgxPDwxMSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChocFByaXYtPnRQb3cyeDJnWzBdJjB4M2YpIDw8IDIxKSB8ICgweDE8PDI3KSAgKTsKKyAgICAgICAgLy99CisgICAgICAgICNlbmRpZgorICAgICAgICAjaWYgMQorICAgICAgICAvL2Vsc2UKKyAgICAgICAgeworICAgICAgICAgICAgI2lmbmRlZiBaTV9PVFVTX0xJTlVYX1BIQVNFXzIKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzM2OTQsICgoaHBQcml2LT50UG93MngyZ1swXSYweDNmKSA8PCAyMCkgfCAoMHg1PDwyNikpOworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjM2JiNCwgKChocFByaXYtPnRQb3cyeDJnWzBdJjB4M2YpIDw8IDUgKSB8ICgweDU8PDExKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGhwUHJpdi0+dFBvdzJ4MmdbMF0mMHgzZikgPDwgMjEpIHwgKDB4NTw8MjcpICApOworICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICBocFByaXYtPmN1cnJlbnRBY2tSdHNUcGMgPSBocFByaXYtPnRQb3cyeDJnWzBdOworICAgIAl9CisgICAgICAgICNlbmRpZgorICAgICAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworCisgICAgICAgIHpmUHJpbnRUYXJnZXRQb3dlcjJHKGhwUHJpdi0+dFBvdzJ4Q2NrLAorICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4MmcsCisgICAgICAgICAgICAgICAgaHBQcml2LT50UG93MngyZ0h0MjAsCisgICAgICAgICAgICAgICAgaHBQcml2LT50UG93MngyZ0h0NDApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBXcml0ZSBNQUMgcmVnIDB4Njk0IGZvciBBQ0sncyBUUEMgKi8KKyAgICAgICAgLyogV3JpdGUgTUFDIHJlZyAweGJiNCBSVFMgYW5kIFNGLUNUUyBmcmFtZSBwb3dlciBjb250cm9sICovCisgICAgICAgIC8qIEFsd2F5cyB1c2UgdHdvIHN0cmVhbSBmb3IgbG93IGxlZ2FjeSByYXRlICovCisgICAgICAgIGlmIChocFByaXYtPmhhbENhcGFiaWxpdHkgJiBaTV9IUF9DQVBfMTFOX09ORV9UWF9TVFJFQU0pCisgICAgICAgIHsKKyAgICAgICAgICAgICNpZm5kZWYgWk1fT1RVU19MSU5VWF9QSEFTRV8yCisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWMzNjk0LCAoKGhwUHJpdi0+dFBvdzJ4NWdbMF0mMHgzZikgPDwgMjApIHwgKDB4MTw8MjYpKTsKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzNiYjQsICgoaHBQcml2LT50UG93Mng1Z1swXSYweDNmKSA8PCA1ICkgfCAoMHgxPDwxMSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChocFByaXYtPnRQb3cyeDVnWzBdJjB4M2YpIDw8IDIxKSB8ICgweDE8PDI3KSAgKTsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgI2lmbmRlZiBaTV9PVFVTX0xJTlVYX1BIQVNFXzIKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzM2OTQsICgoaHBQcml2LT50UG93Mng1Z1swXSYweDNmKSA8PCAyMCkgfCAoMHg1PDwyNikpOworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjM2JiNCwgKChocFByaXYtPnRQb3cyeDVnWzBdJjB4M2YpIDw8IDUgKSB8ICgweDU8PDExKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGhwUHJpdi0+dFBvdzJ4NWdbMF0mMHgzZikgPDwgMjEpIHwgKDB4NTw8MjcpICApOworICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICBocFByaXYtPmN1cnJlbnRBY2tSdHNUcGMgPSBocFByaXYtPnRQb3cyeDJnWzBdOworICAgICAgICB9CisKKworICAgICAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworCisgICAgICAgIHpmUHJpbnRUYXJnZXRQb3dlcjVHKAorICAgICAgICAgICAgICAgIGhwUHJpdi0+dFBvdzJ4NWcsCisgICAgICAgICAgICAgICAgaHBQcml2LT50UG93Mng1Z0h0MjAsCisgICAgICAgICAgICAgICAgaHBQcml2LT50UG93Mng1Z0h0NDApOworICAgIH0vKiBlbmQgb2YgYmFuZGVkZ2VzIG9mIDVHICovCisKK30KKwordm9pZCB6ZkR1bXBFZXBCYW5kRWRnZXMoc3RydWN0IGFyNTQxNkVlcHJvbSogZWVwcm9tSW1hZ2UpCit7CisgICAgI2lmZGVmIFpNX0VOQUJMRV9CQU5ERURHRVNfV0lORE9XU19ERUJVRworICAgIHU4X3QgaSwgaiwgazsKKworI2lmIDAKKyAgICB6bV9kYmcoKCJcbiA9PT0gQmFuZEVkZ2VzIGluZGV4IGR1bXAgPT09PSBcbiIpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBBUjU0MTZfTlVNX0NUTFM7IGkrKykKKyAgICB7CisgICAgICAgIHptX2RiZygoIiUwMnggIiwgZWVwcm9tSW1hZ2UtPmN0bEluZGV4W2ldKSk7CisgICAgfQorCisgICAgem1fZGJnKCgiXG4gPT09IEJhbmRFZGdlcyBkYXRhIGR1bXAgPT09PSBcbiIpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBBUjU0MTZfTlVNX0NUTFM7IGkrKykKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcihrID0gMDsgayA8IEFSNTQxNl9OVU1fQkFORF9FREdFUzsgaysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHU4X3QgKnBkYXRhID0gKHU4X3QqKSYoZWVwcm9tSW1hZ2UtPmN0bERhdGFbaV0uY3RsRWRnZXNbal1ba10pOworICAgICAgICAgICAgICAgIHptX2RiZygoIiglMDJ4ICUwMngpIiwgcGRhdGFbMF0sIHBkYXRhWzFdKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB6bV9kYmcoKCJcbiIpKTsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlCisgICAgem1fZGJnKCgiXG4gPT09IEJhbmRFZGdlcyBpbmRleCBkdW1wID09PT0gXG4iKSk7CisgICAgZm9yIChpID0gMDsgaSA8IDI0OyBpKz04KQorICAgIHsKKyAgICAgICAgem1fZGJnKCgiJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4IiwKKyAgICAgICAgICAgICAgIGVlcHJvbUltYWdlLT5jdGxJbmRleFtpKzBdLCBlZXByb21JbWFnZS0+Y3RsSW5kZXhbaSsxXSwgZWVwcm9tSW1hZ2UtPmN0bEluZGV4W2krMl0sIGVlcHJvbUltYWdlLT5jdGxJbmRleFtpKzNdLAorICAgICAgICAgICAgICAgZWVwcm9tSW1hZ2UtPmN0bEluZGV4W2krNF0sIGVlcHJvbUltYWdlLT5jdGxJbmRleFtpKzVdLCBlZXByb21JbWFnZS0+Y3RsSW5kZXhbaSs2XSwgZWVwcm9tSW1hZ2UtPmN0bEluZGV4W2krN10KKyAgICAgICAgICAgICAgICkpOworICAgIH0KKworICAgIHptX2RiZygoIlxuID09PSBCYW5kRWRnZXMgZGF0YSBkdW1wID09PT0gXG4iKSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQVI1NDE2X05VTV9DVExTOyBpKyspCisgICAgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICB1OF90ICpwZGF0YSA9ICh1OF90KikmKGVlcHJvbUltYWdlLT5jdGxEYXRhW2ldLmN0bEVkZ2VzW2pdKTsKKyAgICAgICAgICAgIHptX2RiZygoIiglMDNkICUwMngpICglMDNkICUwMngpICglMDNkICUwMngpICglMDNkICUwMngpIFxuIiwKKyAgICAgICAgICAgICAgICAgICBwZGF0YVswXSwgcGRhdGFbMV0sIHBkYXRhWzJdLCBwZGF0YVszXSwKKyAgICAgICAgICAgICAgICAgICBwZGF0YVs0XSwgcGRhdGFbNV0sIHBkYXRhWzZdLCBwZGF0YVs3XQorICAgICAgICAgICAgICAgICAgICkpOworICAgICAgICAgICAgem1fZGJnKCgiKCUwM2QgJTAyeCkgKCUwM2QgJTAyeCkgKCUwM2QgJTAyeCkgKCUwM2QgJTAyeCkgXG4iLAorICAgICAgICAgICAgICAgICAgIHBkYXRhWzhdLCBwZGF0YVs5XSwgcGRhdGFbMTBdLCBwZGF0YVsxMV0sCisgICAgICAgICAgICAgICAgICAgcGRhdGFbMTJdLCBwZGF0YVsxM10sIHBkYXRhWzE0XSwgcGRhdGFbMTVdCisgICAgICAgICAgICAgICAgICAgKSk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICAjZW5kaWYKK30KKwordm9pZCB6ZlByaW50VGFyZ2V0UG93ZXIyRyh1OF90KiB0UG93MnhDY2ssIHU4X3QqIHRQb3cyeDJnLCB1OF90KiB0UG93MngyZ0h0MjAsIHU4X3QqIHRQb3cyeDJnSHQ0MCkKK3sKKyAgICAvLyNpZmRlZiBaTV9FTkFCTEVfVFBDX1dJTkRPV1NfREVCVUcKKyAgICAjaWZkZWYgWk1fRU5BQkxFX0JBTkRFREdFU19XSU5ET1dTX0RFQlVHCisgICAgRGJnUHJpbnQoInRhcmdldFB3ciBDQ0sgOiAlZCwgJWQsICVkLCAlZFxuIiwKKyAgICAgICAgICAgIHRQb3cyeENja1swXSwKKyAgICAgICAgICAgIHRQb3cyeENja1sxXSwKKyAgICAgICAgICAgIHRQb3cyeENja1syXSwKKyAgICAgICAgICAgIHRQb3cyeENja1szXQorICAgICAgICAgICAgKTsKKyAgICBEYmdQcmludCgidGFyZ2V0UHdyIDJHIDogJWQsICVkLCAlZCwgJWRcbiIsCisgICAgICAgICAgICB0UG93MngyZ1swXSwKKyAgICAgICAgICAgIHRQb3cyeDJnWzFdLAorICAgICAgICAgICAgdFBvdzJ4MmdbMl0sCisgICAgICAgICAgICB0UG93MngyZ1szXQorICAgICAgICAgICAgKTsKKyAgICBEYmdQcmludCgidGFyZ2V0UHdyIDJHSFQyMCA6ICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZFxuIiwKKyAgICAgICAgICAgIHRQb3cyeDJnSHQyMFswXSwKKyAgICAgICAgICAgIHRQb3cyeDJnSHQyMFsxXSwKKyAgICAgICAgICAgIHRQb3cyeDJnSHQyMFsyXSwKKyAgICAgICAgICAgIHRQb3cyeDJnSHQyMFszXSwKKyAgICAgICAgICAgIHRQb3cyeDJnSHQyMFs0XSwKKyAgICAgICAgICAgIHRQb3cyeDJnSHQyMFs1XSwKKyAgICAgICAgICAgIHRQb3cyeDJnSHQyMFs2XSwKKyAgICAgICAgICAgIHRQb3cyeDJnSHQyMFs3XQorICAgICAgICAgICAgKTsKKyAgICBEYmdQcmludCgidGFyZ2V0UHdyIDJHSFQ0MCA6ICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZFxuIiwKKyAgICAgICAgICAgIHRQb3cyeDJnSHQ0MFswXSwKKyAgICAgICAgICAgIHRQb3cyeDJnSHQ0MFsxXSwKKyAgICAgICAgICAgIHRQb3cyeDJnSHQ0MFsyXSwKKyAgICAgICAgICAgIHRQb3cyeDJnSHQ0MFszXSwKKyAgICAgICAgICAgIHRQb3cyeDJnSHQ0MFs0XSwKKyAgICAgICAgICAgIHRQb3cyeDJnSHQ0MFs1XSwKKyAgICAgICAgICAgIHRQb3cyeDJnSHQ0MFs2XSwKKyAgICAgICAgICAgIHRQb3cyeDJnSHQ0MFs3XQorICAgICAgICAgICAgKTsKKyAgICAjZW5kaWYKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgemZQcmludFRhcmdldFBvd2VyNUcodThfdCogdFBvdzJ4NWcsIHU4X3QqIHRQb3cyeDVnSHQyMCwgdThfdCogdFBvdzJ4NWdIdDQwKQoreworICAgIC8vI2lmZGVmIFpNX0VOQUJMRV9UUENfV0lORE9XU19ERUJVRworICAgICNpZmRlZiBaTV9FTkFCTEVfQkFOREVER0VTX1dJTkRPV1NfREVCVUcKKyAgICBEYmdQcmludCgidGFyZ2V0UHdyIDVHIDogJWQsICVkLCAlZCwgJWRcbiIsCisgICAgICAgICAgICB0UG93Mng1Z1swXSwKKyAgICAgICAgICAgIHRQb3cyeDVnWzFdLAorICAgICAgICAgICAgdFBvdzJ4NWdbMl0sCisgICAgICAgICAgICB0UG93Mng1Z1szXQorICAgICAgICAgICAgKTsKKyAgICBEYmdQcmludCgidGFyZ2V0UHdyIDVHSFQyMCA6ICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZFxuIiwKKyAgICAgICAgICAgIHRQb3cyeDVnSHQyMFswXSwKKyAgICAgICAgICAgIHRQb3cyeDVnSHQyMFsxXSwKKyAgICAgICAgICAgIHRQb3cyeDVnSHQyMFsyXSwKKyAgICAgICAgICAgIHRQb3cyeDVnSHQyMFszXSwKKyAgICAgICAgICAgIHRQb3cyeDVnSHQyMFs0XSwKKyAgICAgICAgICAgIHRQb3cyeDVnSHQyMFs1XSwKKyAgICAgICAgICAgIHRQb3cyeDVnSHQyMFs2XSwKKyAgICAgICAgICAgIHRQb3cyeDVnSHQyMFs3XQorICAgICAgICAgICAgKTsKKyAgICBEYmdQcmludCgidGFyZ2V0UHdyIDVHSFQ0MCA6ICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZFxuIiwKKyAgICAgICAgICAgIHRQb3cyeDVnSHQ0MFswXSwKKyAgICAgICAgICAgIHRQb3cyeDVnSHQ0MFsxXSwKKyAgICAgICAgICAgIHRQb3cyeDVnSHQ0MFsyXSwKKyAgICAgICAgICAgIHRQb3cyeDVnSHQ0MFszXSwKKyAgICAgICAgICAgIHRQb3cyeDVnSHQ0MFs0XSwKKyAgICAgICAgICAgIHRQb3cyeDVnSHQ0MFs1XSwKKyAgICAgICAgICAgIHRQb3cyeDVnSHQ0MFs2XSwKKyAgICAgICAgICAgIHRQb3cyeDVnSHQ0MFs3XQorICAgICAgICAgICAgKTsKKyAgICAjZW5kaWYKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgemZIcFBvd2VyU2F2ZVNldE1vZGUoemRldl90KiBkZXYsIHU4X3Qgc3RhTW9kZSwgdThfdCBwc01vZGUsIHUxNl90IGJjbkludGVydmFsKQoreworICAgIGlmICggc3RhTW9kZSA9PSAwICkKKyAgICB7CisgICAgICAgIGlmICggcHNNb2RlID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUdXJuIG9mZiBwcmUtVEJUVCBpbnRlcnJ1cHQKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19QUkVUQlRULCAwKTsKKyAgICAgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19CQ05fUEVSSU9ELCAwKTsKKyAgICAgICAgICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUdXJuIG9uIHByZS1UQlRUIGludGVycnVwdAorICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX1BSRVRCVFQsIChiY25JbnRlcnZhbC02KTw8MTYpOworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0JDTl9QRVJJT0QsIGJjbkludGVydmFsKTsKKyAgICAgICAgICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgemZIcFBvd2VyU2F2ZVNldFN0YXRlKHpkZXZfdCogZGV2LCB1OF90IHBzU3RhdGUpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2ID0gd2QtPmhwUHJpdmF0ZTsKKworCS8vRGJnUHJpbnQoIklOVE8gemZIcFBvd2VyU2F2ZVNldFN0YXRlIik7CisKKyAgICBpZiAoIHBzU3RhdGUgPT0gMCApIC8vcG93ZXIgdXAKKyAgICB7CisgICAgICAgIC8vRGJnUHJpbnQoInpmSHBQb3dlclNhdmVTZXRTdGF0ZSBXYWtlIHVwIGZyb20gUFNcbiIpOworICAgICAgICByZWdfd3JpdGUoMHg5ODJDLCAweDAwMDBhMDAwKTsgLy93YWtlIHVwIEFEREFDCisgICAgICAgIHJlZ193cml0ZSgweDk4MDgsIDB4MCk7ICAgICAgICAvL2VuYWJsZSBhbGwgYWdjIGdhaW4gYW5kIG9mZnNldCB1cGRhdGVzIHRvIGEyCisgICAgICAgIC8vIyBiYW5rIDMKKyAgICAgICAgaWYgKCgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aHdGcmVxdWVuY3kgPD0gWk1fQ0hfR18xNCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogMTFnICovCisgICAgICAgICAgICAvL3JlZ193cml0ZSAoMHg5OGYwLCAgMHgwMWMwMDAxOCk7CisgICAgICAgICAgICByZWdfd3JpdGUgKDB4OThmMCwgIDB4MDFjMjAwOTgpOy8vc3luX29uK1JYX09OCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiAxMWEgKi8KKyAgICAgICAgICAgIC8vcmVnX3dyaXRlICgweDk4ZjAsICAweDAxNDAwMDE4KTsKKyAgICAgICAgICAgIHJlZ193cml0ZSAoMHg5OGYwLCAgMHgwMTQyMDA5OCk7Ly9zeW5fb24rUlhfT04KKyAgICAgICAgfQorCisgICAgICAgIC8vLy8jYmFuayA1CisgICAgICAgIC8vcmVnX3dyaXRlKDB4OThiMCwgIDB4MDAwMDAwMTMpOworICAgICAgICAvL3JlZ193cml0ZSgweDk4ZTQsICAweDAwMDAwMDAyKTsKKworCisgICAgICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisgICAgfQorICAgIGVsc2UgLy9wb3dlciBkb3duCisgICAgeworICAgICAgICAvL0RiZ1ByaW50KCJ6ZkhwUG93ZXJTYXZlU2V0U3RhdGUgR28gdG8gUFNcbiIpOworICAgICAgICAvL3JlZ193cml0ZSgweDk4MkMsIDB4YTAwMGEwMDApOworICAgICAgICByZWdfd3JpdGUoMHg5ODA4LCAweDgwMDAwMDApOyAgICAvL2Rpc2FibGUgYWxsIGFnYyBnYWluIGFuZCBvZmZzZXQgdXBkYXRlcyB0byBhMgorICAgICAgICByZWdfd3JpdGUoMHg5ODJDLCAweGEwMDBhMDAwKTsgICAvL3Bvd2VyIGRvd24gQUREQUMKKyAgICAgICAgLy8jIGJhbmsgMworICAgICAgICBpZiAoKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5od0ZyZXF1ZW5jeSA8PSBaTV9DSF9HXzE0KQorICAgICAgICB7CisgICAgICAgICAgICAvKiAxMWcgKi8KKyAgICAgICAgICAgIHJlZ193cml0ZSAoMHg5OGYwLCAgMHgwMGMwMDAxOCk7Ly9zeW5fb2ZmK1JYX29mZgorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogMTFhICovCisgICAgICAgICAgICByZWdfd3JpdGUgKDB4OThmMCwgIDB4MDA0MDAwMTgpOy8vc3luX29mZitSWF9vZmYKKyAgICAgICAgfQorCisgICAgICAgIC8vLy8jYmFuayA1CisgICAgICAgIC8vcmVnX3dyaXRlKDB4OThiMCwgIDB4MDAwZTAwMTMpOworICAgICAgICAvL3JlZ193cml0ZSgweDk4ZTQsICAweDAwMDE4MDAyKTsKKworCisgICAgICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisgICAgfQorfQorCit2b2lkIHpmSHBTZXRBZ2dQa3ROdW0oemRldl90KiBkZXYsIHUzMl90IG51bSkKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXYgPSB3ZC0+aHBQcml2YXRlOworCisgICAgbnVtID0gKG51bSA8PCAxNikgfCAoMHhhKTsKKworICAgIGhwUHJpdi0+YWdnUGt0TnVtID0gbnVtOworCisgICAgLy9hZ2dyZWdhdGlvbiBudW1iZXIgd2lsbCBiZSB1cGRhdGUgaW4gSEFMIGhlYXJ0IGJlYXQKKyAgICAvL3pmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzNiOWMsIG51bSk7CisgICAgLy96ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworfQorCit2b2lkIHpmSHBTZXRNUERVRGVuc2l0eSh6ZGV2X3QqIGRldiwgdThfdCBkZW5zaXR5KQoreworICAgIHUzMl90IHZhbHVlOworCisgICAgaWYgKGRlbnNpdHkgPiBaTV9NUERVX0RFTlNJVFlfOFVTKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIERlZmF1bHQgdmFsdWUgaW4gdGhpcyByZWdpc3RlciAqLworICAgIHZhbHVlID0gMHgxNDBBMDAgfCBkZW5zaXR5OworCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjM2JhMCwgdmFsdWUpOworICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisgICAgcmV0dXJuOworfQorCit2b2lkIHpmSHBTZXRTbG90VGltZSh6ZGV2X3QqIGRldiwgdThfdCB0eXBlKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdiA9IHdkLT5ocFByaXZhdGU7CisKKyAgICBpZiAodHlwZSA9PSAwKQorICAgIHsKKyAgICAgICAgLy9ub3JtYWwgc2xvdCA9IDIwdXMKKyAgICAgICAgaHBQcml2LT5zbG90VHlwZSA9IDA7CisgICAgfQorICAgIGVsc2UgLy9pZiAodHlwZSA9PSAxKQorICAgIHsKKyAgICAgICAgLy9zaG9ydCBzbG90ID0gOXVzCisgICAgICAgIGhwUHJpdi0+c2xvdFR5cGUgPSAxOworICAgIH0KKworICAgIHJldHVybjsKK30KKwordm9pZCB6ZkhwU2V0U2xvdFRpbWVSZWdpc3Rlcih6ZGV2X3QqIGRldiwgdThfdCB0eXBlKQoreworICAgIGlmKHR5cGUgPT0gMCkKKyAgICB7CisgICAgICAgIC8vbm9ybWFsIHNsb3QgPSAyMHVzCisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19TTE9UX1RJTUUsIDIwPDwxMCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vc2hvcnQgc2xvdCA9IDl1cworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfU0xPVF9USU1FLCA5PDwxMCk7CisgICAgfQorfQorCit2b2lkIHpmSHBTZXRSaWZzKHpkZXZfdCogZGV2LCB1OF90IGh0X2VuYWJsZSwgdThfdCBodDIwNDAsIHU4X3QgZ19tb2RlKQoreworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzYzODgsIDB4MGMwMDAwMDApOworCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjNTllYywgMHgwY2M4MGNhYSk7CisKKyAgICBpZiAoaHRfZW5hYmxlKQorICAgIHsKKyAgICAgICAgaWYgKGh0MjA0MCkKKyAgICAgICAgeworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjNTkxOCwgNDApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjNTkxOCwgMjApOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGdfbW9kZSkKKyAgICB7CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzU4NTAsIDB4ZWMwOGI0ZTIpOworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWM1ODVjLCAweDMxM2E1ZDVlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjNTg1MCwgMHhlZGU4YjRlMCk7CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzU4NWMsIDB4MzEzOTYwNWUpOworICAgIH0KKworICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisgICAgcmV0dXJuOworfQorCit2b2lkIHpmSHBCZWdpblNpdGVTdXJ2ZXkoemRldl90KiBkZXYsIHU4X3Qgc3RhdHVzKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdj13ZC0+aHBQcml2YXRlOworCisgICAgaWYgKCBzdGF0dXMgPT0gMSApCisgICAgeyAvLyBDb25uZWN0ZWQKKyAgICAgICAgaHBQcml2LT5pc1NpdGVTdXJ2ZXkgPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeyAvLyBOb3QgY29ubmVjdGVkCisgICAgICAgIGhwUHJpdi0+aXNTaXRlU3VydmV5ID0gMDsKKyAgICB9CisKKyAgICAvKiByZXNldCB3b3JrYXJvdW5kIHN0YXRlIHRvIGRlZmF1bHQgKi8KKy8vICAgIGlmIChocFByaXYtPnJ4U3Ryb25nUlNTSSA9PSAxKQorICAgIHsKKyAgICAgICAgaHBQcml2LT5yeFN0cm9uZ1JTU0kgPSAwOworICAgICAgICBpZiAoKGhwUHJpdi0+ZWVwcm9tSW1hZ2VbMHgxMDArMHgxMTAqMi80XSYweGZmKSA9PSAweDgwKSAvL0ZFTSBUWVBFCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChocFByaXYtPmh3RnJlcXVlbmN5IDw9IFpNX0NIX0dfMTQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjODk2MCwgMHg5YjQ5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MWM4OTYwLCAweDA5MDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjODk2MCwgMHg5YjQwKTsKKyAgICAgICAgfQorICAgICAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworICAgIH0KKy8vICAgIGlmIChocFByaXYtPnN0cm9uZ1JTU0kgPT0gMSkKKyAgICB7CisgICAgICAgIGhwUHJpdi0+c3Ryb25nUlNTSSA9IDA7CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzM2OTQsICgoaHBQcml2LT5jdXJyZW50QWNrUnRzVHBjJjB4M2YpIDw8IDIwKSB8ICgweDU8PDI2KSk7CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzNiYjQsICgoaHBQcml2LT5jdXJyZW50QWNrUnRzVHBjJjB4M2YpIDw8IDUgKSB8ICgweDU8PDExKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaHBQcml2LT5jdXJyZW50QWNrUnRzVHBjJjB4M2YpIDw8IDIxKSB8ICgweDU8PDI3KSAgKTsKKyAgICAgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKyAgICB9Cit9CisKK3ZvaWQgemZIcEZpbmlzaFNpdGVTdXJ2ZXkoemRldl90KiBkZXYsIHU4X3Qgc3RhdHVzKQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdj13ZC0+aHBQcml2YXRlOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgaWYgKCBzdGF0dXMgPT0gMSApCisgICAgeworICAgICAgICBocFByaXYtPmlzU2l0ZVN1cnZleSA9IDI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGhwUHJpdi0+aXNTaXRlU3VydmV5ID0gMDsKKyAgICB9CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKK30KKwordTE2X3QgemZGd1JldHJ5KHpkZXZfdCogZGV2LCB1OF90IGVuYWJsZSkKK3sKKyAgICB1MzJfdCBjbWRbKFpNX01BWF9DTURfU0laRS80KV07CisgICAgdTE2X3QgcmV0ID0gMDsKKworICAgIGNtZFswXSA9IDQgfCAoMHg5MiA8PCA4KTsKKyAgICBjbWRbMV0gPSAoZW5hYmxlID09IDEpID8gMHgwMSA6IDB4MDA7CisKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCA4LCBaTV9PSURfSU5URVJOQUxfV1JJVEUsIE5VTEwpOworICAgIHJldHVybiByZXQ7Cit9CisKK3UxNl90IHpmSHBFbmFibGVId1JldHJ5KHpkZXZfdCogZGV2KQoreworICAgIHUxNl90IHJldDsKKworICAgIHJldCA9IHpmRndSZXRyeShkZXYsIDApOworCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjM2IyOCwgMHgzMzMzMyk7CisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3UxNl90IHpmSHBEaXNhYmxlSHdSZXRyeSh6ZGV2X3QqIGRldikKK3sKKyAgICB1MTZfdCByZXQ7CisKKyAgICByZXQgPSB6ZkZ3UmV0cnkoZGV2LCAxKTsKKworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxYzNiMjgsIDB4MDAwMDApOworICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBEb3dubG9hZCBTUEkgRncgKi8KKyNkZWZpbmUgWk1fRklSTVdBUkVfV0xBTiAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpNX0ZJUk1XQVJFX1NQSV9GTEFTSCAgICAgICAgICAgMQorCisKK3UxNl90IHpmSHBGaXJtd2FyZURvd25sb2FkKHpkZXZfdCogZGV2LCB1OF90IGZ3VHlwZSkKK3sKKyAgICB1MTZfdCByZXQgPSBaTV9TVUNDRVNTOworCisgICAgaWYgKGZ3VHlwZSA9PSBaTV9GSVJNV0FSRV9XTEFOKQorICAgIHsKKyAgICAgICAgcmV0ID0gemZGaXJtd2FyZURvd25sb2FkKGRldiwgKHUzMl90Kil6Y0Z3SW1hZ2UsCisgICAgICAgICAgICAgICAgKHUzMl90KXpjRndJbWFnZVNpemUsIFpNX0ZJUk1XQVJFX1dMQU5fQUREUik7CisgICAgfQorICAgIGVsc2UgaWYgKGZ3VHlwZSA9PSBaTV9GSVJNV0FSRV9TUElfRkxBU0gpCisgICAgeworICAgICAgICByZXQgPSB6ZkZpcm13YXJlRG93bmxvYWQoZGV2LCAodTMyX3QqKXpjRndJbWFnZVNQSSwKKyAgICAgICAgICAgICAgICAodTMyX3QpemNGd0ltYWdlU1BJU2l6ZSwgWk1fRklSTVdBUkVfU1BJX0FERFIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB6bV9kZWJ1Z19tc2cxKCJVbmtub3duIGZpcm13YXJlIHR5cGUgPSAiLCBmd1R5cGUpOworICAgICAgICByZXQgPSBaTV9FUlJfRklSTVdBUkVfV1JPTkdfVFlQRTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBFbmFibGUgc29mdHdhcmUgZGVjcnlwdGlvbiAqLwordm9pZCB6ZkhwU1dEZWNyeXB0KHpkZXZfdCogZGV2LCB1OF90IGVuYWJsZSkKK3sKKyAgICB1MzJfdCB2YWx1ZSA9IDB4NzA7CisKKyAgICAvKiBCaXQgNCBmb3IgZW5hYmxlIHNvZnR3YXJlIGRlY3J5cHRpb24gKi8KKyAgICBpZiAoZW5hYmxlID09IDEpCisgICAgeworICAgICAgICB2YWx1ZSA9IDB4Nzg7CisgICAgfQorCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFjMzY3OCwgdmFsdWUpOworICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7Cit9CisKKy8qIEVuYWJsZSBzb2Z0d2FyZSBlbmNyeXB0aW9uICovCit2b2lkIHpmSHBTV0VuY3J5cHQoemRldl90KiBkZXYsIHU4X3QgZW5hYmxlKQoreworICAgIC8qIEJlY2F1c2UgZW5jcnlwdGlvbiBieSBzb2Z0d2FyZSBvciBoYXJkd2FyZSBpcyBqdWRnZWQgYnkgZHJpdmVyIGluIE90dXMsCisgICAgICAgd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBpbiB0aGUgSEFMIGxheWVyLgorICAgICAqLworfQorCit1MzJfdCB6ZkhwQ2FwYWJpbGl0eSh6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXY9d2QtPmhwUHJpdmF0ZTsKKworICAgIHJldHVybiBocFByaXYtPmhhbENhcGFiaWxpdHk7Cit9CisKK3ZvaWQgemZIcFNldFJvbGxDYWxsVGFibGUoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2PXdkLT5ocFByaXZhdGU7CisKKyAgICBpZiAoaHBQcml2LT5jYW1Sb2xsQ2FsbFRhYmxlICE9ICh1NjRfdCkgMCkKKyAgICB7CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19ST0xMX0NBTExfVEJMX0wsICh1MzJfdCkoaHBQcml2LT5jYW1Sb2xsQ2FsbFRhYmxlICYgMHhmZmZmZmZmZikpOworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfUk9MTF9DQUxMX1RCTF9ILCAodTMyX3QpKChocFByaXYtPmNhbVJvbGxDYWxsVGFibGUgPj4gMzIpICYgMHhmZmZmZmZmZikpOworICAgICAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworICAgIH0KK30KKwordm9pZCB6ZkhwU2V0VFRTSUZTVGltZSh6ZGV2X3QqIGRldiwgdThfdCBzaWZzX3RpbWUpCit7CisgICAgdTMyX3QgcmVnX3ZhbHVlID0gMDsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzaWZzX3RpbWUgJj0gMHgzZjsKKyAgICByZWdfdmFsdWUgPSAweDE0NDAwYiB8ICgoKHUzMl90KXNpZnNfdGltZSk8PDI0KTsKKworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19FSUZTX0FORF9TSUZTLCByZWdfdmFsdWUpOworICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7Cit9CisKKy8qICMzIEVuYWJsZSBSSUZTIGZ1bmN0aW9uIGlmIHRoZSBSSUZTIHBhdHRlcm4gbWF0Y2hlZCAhICovCit2b2lkIHpmSHBFbmFibGVSaWZzKHpkZXZfdCogZGV2LCB1OF90IG1vZGUyNGcsIHU4X3QgbW9kZUh0LCB1OF90IG1vZGVIdDIwNDApCit7CisKKyAgICAvKiAjIEVuYWJsZSBSZXNldCBURE9NQUlOCisgICAgICogJHJkZGF0YSA9ICYkcGh5cmVnX3JlYWQoMHg5ODAwKyg3Mzg8PDIpKTsKKyAgICAgKiAkd3JkYXRhID0gJHJkZGF0YSB8ICgweDEgPDwgMjYpIHwgKDB4MSA8PCAyNyk7CisgICAgICogJiRwaHlyZWdfd3JpdGUoMHg5ODAwKyg3Mzg8PDIpLCAkd3JkYXRhKTsKKyAgICAgKi8KKyAgICByZWdfd3JpdGUgKDB4OTgwMCsoNzM4PDwyKSwgMHgwODAwMDAwMCB8ICgweDEgPDwgMjYpIHwgKDB4MSA8PCAyNykpOworICAgIC8vcmVnX3dyaXRlICgweDk4MDArKDczODw8MiksIDB4MDgwMDAwMDAgfCAoMHgxIDw8IDI2KSk7CisKKyAgICAvKiAjIHJlZyAxMjM6IGhlYXZ5IGNsaXAgZmFjdG9yLCB4ciAvIFJJRlMgc2VhcmNoIHBhcmFtZXRlcnMgKi8KKyAgICByZWdfd3JpdGUgKDB4OTllYywgMHgwY2M4MGNhYSk7CisKKyAgICAvKiAjIFJlZHVjZSBTZWFyY2ggU3RhcnQgRGVsYXkgZm9yIFJJRlMgICAgKi8KKyAgICBpZiAobW9kZUh0ID09IDEpIC8qICgkSFRfRU5BQkxFID09IDEpICovCisgICAgeworICAgICAgICBpZiAobW9kZUh0MjA0MCA9PSAweDEpIC8qICgkRFlOQU1JQ19IVDIwNDBfRU4gPT0gMHgxKSAqLworICAgICAgICB7CisgICAgICAgICAgICByZWdfd3JpdGUoMHg5ODAwKyg3MDw8MiksIDQwKTsvKjQwKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlZ193cml0ZSgweDk4MDArKDcwPDwyKSwgMjApOworICAgICAgICAgICAgaWYobW9kZTI0ZyA9PSAweDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogJHJkZGF0YSA9ICYkcGh5cmVnX3JlYWQoMHg5ODAwKygyNDw8MikpOyMweDk4NjA7MHgxYzU4NjAKKyAgICAgICAgICAgICAgICAgKiR3cmRhdGEgPSAoJHJkZGF0YSAmIDB4ZmZmZmZmYzcpIHwgKDB4NCA8PCAzKTsKKyAgICAgICAgICAgICAgICAgKiAmJHBoeXJlZ193cml0ZSgweDk4MDArKDI0PDwyKSwgJHdyZGF0YSk7CisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgcmVnX3dyaXRlKDB4OTgwMCsoMjQ8PDIpLCAoMHgwMDA0ZGQxMCAmIDB4ZmZmZmZmYzcpIHwgKDB4NCA8PCAzKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobW9kZTI0ZyA9PSAweDEpCisgICAgeworICAgICAgICByZWdfd3JpdGUoMHg5ODUwLCAweGVjZThiNGU0KTsvKm9yZyovCisgICAgICAgIC8vcmVnX3dyaXRlKDB4OTg1MCwgMHhlY2U4YjRlMik7CisgICAgICAgIHJlZ193cml0ZSgweDk4NWMsIDB4MzEzYTVkNWUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZWdfd3JpdGUoMHg5ODUwLCAweGVkZThiNGU0KTsKKyAgICAgICAgcmVnX3dyaXRlKDB4OTg1YywgMHgzMTM5NjA1ZSk7CisgICAgfQorCisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKKworICAgIHJldHVybjsKK30KKworLyogIzQgRGlzYWJsZSBSSUZTIGZ1bmN0aW9uIGlmIHRoZSBSSUZTIHRpbWVyIGlzIHRpbWVvdXQgISAqLwordm9pZCB6ZkhwRGlzYWJsZVJpZnMoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgLyogRGlzYWJsZSBSSUZTIGZ1bmN0aW9uIGlzIHRvIHN0b3JlIHRoZXNlIEhXIHJlZ2lzdGVyIGluaXRpYWwgdmFsdWUgd2hpbGUgdGhlIGRldmljZSBwbHVnLWluIGFuZAorICAgICAgIHJlLXdyaXRlIHRvIHRoZXNlIHJlZ2lzdGVyIGlmIHRoZSBSSUZTIGZ1bmN0aW9uIGlzIGRpc2FibGVkICAqLworCisgICAgLy8gcmVnIDogOTg1MAorICAgIHJlZ193cml0ZSgweDk4NTAsICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aW5pdERlc2lyZWRTaWdTaXplKTsKKworICAgIC8vIHJlZyA6IDk4NWMKKyAgICByZWdfd3JpdGUoMHg5ODVjLCAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmluaXRBR0MpOworCisgICAgLy8gcmVnIDogOTg2MAorICAgIHJlZ193cml0ZSgweDk4MDArKDI0PDwyKSwgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5pbml0QWdjQ29udHJvbCk7CisKKyAgICAvLyByZWcgOiA5OTE4CisgICAgcmVnX3dyaXRlKDB4OTgwMCsoNzA8PDIpLCAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmluaXRTZWFyY2hTdGFydERlbGF5KTsKKworICAgIC8vIHJlZyA6IDk5MWMKKyAgICByZWdfd3JpdGUgKDB4OTllYywgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5pbml0UklGU1NlYXJjaFBhcmFtcyk7CisKKyAgICAvLyByZWcgOiBhMzg4CisgICAgcmVnX3dyaXRlICgweDk4MDArKDczODw8MiksICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aW5pdEZhc3RDaGFubmVsQ2hhbmdlQ29udHJvbCk7CisKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworCisgICAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwcmVnLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHByZWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2ZlYmE4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwcmVnLmMKQEAgLTAsMCArMSwyNDgxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kdWxlIE5hbWUgOiBocHJlZy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIFJlZ3VsYXRvcnkgVGFibGUgYW5kIHJlbGF0ZWQgZnVuY3Rpb24uICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiLi4vODAyMTFjb3JlL2NwcmVjb21wLmgiCisjaW5jbHVkZSAiaHBhbmkuaCIKKyNpbmNsdWRlICJocHJlZy5oIgorI2luY2x1ZGUgImhwdXNiLmgiCisKKy8qIHVzZWQgdGhyb3VnaG91dCB0aGlzIGZpbGUuLi4gKi8KKyNkZWZpbmUJTihhKQkoc2l6ZW9mIChhKSAvIHNpemVvZiAoYVswXSkpCisKKyNkZWZpbmUgSEFMX01PREVfMTFBX1RVUkJPCUhBTF9NT0RFXzEwOEEKKyNkZWZpbmUgSEFMX01PREVfMTFHX1RVUkJPCUhBTF9NT0RFXzEwOEcKKworI2lmIDAKK2VudW0geworICAgIC8qIHRlc3QgZ3JvdXBzICovCisJRkNDCSAgICAgICA9IDB4MTAsCisJTUtLCSAgICAgICA9IDB4NDAsCisJRVRTSQkgICA9IDB4MzAsCisgICAgU0RfTk9fQ1RMICA9IDB4ZTAsCisJTk9fQ1RMCSAgID0gMHhmZiwKKyAgICAvKiB0ZXN0IG1vZGVzICovCisgICAgQ1RMX01PREVfTSA9IDB4MGYsCisgICAgQ1RMXzExQSAgICA9IDAsCisJQ1RMXzExQgkgICA9IDEsCisJQ1RMXzExRwkgICA9IDIsCisJQ1RMX1RVUkJPICA9IDMsCisJQ1RMXzEwOEcgICA9IDQsCisgICAgQ1RMXzJHSFQyMCA9IDUsCisgICAgQ1RMXzVHSFQyMCA9IDYsCisgICAgQ1RMXzJHSFQ0MCA9IDcsCisgICAgQ1RMXzVHSFQ0MCA9IDgKK307CisjZW5kaWYKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgYXJlIGZsYWdzIGZvciBkaWZmZXJlbnQgcmVxdWlyZW1lbnRzIHBlciByZWcgZG9tYWluLgorICogVGhlc2UgcmVxdWlyZW1lbnRzIGFyZSBlaXRoZXIgaW5oZXJldGVkIGZyb20gdGhlIHJlZyBkb21haW4gcGFpciBvcgorICogZnJvbSB0aGUgdW5pdGFyeSByZWcgZG9tYWluIGlmIHRoZSByZWcgZG9tYWluIHBhaXIgZmxhZ3MgdmFsdWUgaXMKKyAqIDAKKyAqLworCitlbnVtIHsKKwlOT19SRVEJCQk9IDB4MDAwMDAwMDAsCisJRElTQUxMT1dfQURIT0NfMTFBCT0gMHgwMDAwMDAwMSwKKwlESVNBTExPV19BREhPQ18xMUFfVFVSQgk9IDB4MDAwMDAwMDIsCisJTkVFRF9ORkMJCT0gMHgwMDAwMDAwNCwKKworCUFESE9DX1BFUl8xMUQJCT0gMHgwMDAwMDAwOCwgIC8qIFN0YXJ0IEFkLUhvYyBtb2RlICovCisJQURIT0NfTk9fMTFBCQk9IDB4MDAwMDAwMTAsCisKKwlQVUJMSUNfU0FGRVRZX0RPTUFJTgk9IDB4MDAwMDAwMjAsIAkvKiBwdWJsaWMgc2FmZXR5IGRvbWFpbiAqLworCUxJTUlUX0ZSQU1FXzRNUyAJPSAweDAwMDAwMDQwLCAJLyogNG1zZWMgbGltaXQgb24gdGhlIGZyYW1lIGxlbmd0aCAqLworfTsKKworI2RlZmluZSBNS0s1R0haX0ZMQUcxIChESVNBTExPV19BREhPQ18xMUFfVFVSQiB8IE5FRURfTkZDIHwgTElNSVRfRlJBTUVfNE1TKQorI2RlZmluZSBNS0s1R0haX0ZMQUcyIChESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiB8IE5FRURfTkZDfCBMSU1JVF9GUkFNRV80TVMpCisKK3R5cGVkZWYgZW51bSB7CisJREZTX1VOSU5JVF9ET01BSU4JPSAwLAkvKiBVbmluaXRpYWxpemVkIGRmcyBkb21haW4gKi8KKwlERlNfRkNDX0RPTUFJTgkJPSAxLAkvKiBGQ0MzIGRmcyBkb21haW4gKi8KKwlERlNfRVRTSV9ET01BSU4JCT0gMiwJLyogRVRTSSBkZnMgZG9tYWluICovCit9IEhBTF9ERlNfRE9NQUlOOworCisvKgorICogVXNlZCB0byBzZXQgdGhlIFJlZ0RvbWFpbiBiaXRtYXNrIHdoaWNoIGNob29zZXMgd2hpY2ggZnJlcXVlbmN5CisgKiBiYW5kIHNwZWNzIGFyZSB1c2VkLgorICovCisKKyNkZWZpbmUgQk1MRU4gMgkJLyogVXNlIDIgNjQgYml0IHVpbnQgZm9yIGNoYW5uZWwgYml0bWFzaworCQkJICAgTkI6IE11c3QgYWdyZWUgd2l0aCBtYWNybyBiZWxvdyAoQk0pICovCisjZGVmaW5lIEJNWkVSTyB7KHU2NF90KSAwLCAodTY0X3QpIDB9CS8qIEJNTEVOIHplcm9zICovCisKKyNpZiAwCisKKyNkZWZpbmUgQk0oX2ZhLCBfZmIsIF9mYywgX2ZkLCBfZmUsIF9mZiwgX2ZnLCBfZmgsIF9maSwgX2ZqLCBfZmssIF9mbCkgXAorICAgICAgeygoKChfZmEgPj0gMCkgJiYgKF9mYSA8IDY0KSkgPyAoKCh1NjRfdCkgMSkgPDwgX2ZhKSA6ICh1NjRfdCkgMCkgfCBcCisJKCgoX2ZiID49IDApICYmIChfZmIgPCA2NCkpID8gKCgodTY0X3QpIDEpIDw8IF9mYikgOiAodTY0X3QpIDApIHwgXAorCSgoKF9mYyA+PSAwKSAmJiAoX2ZjIDwgNjQpKSA/ICgoKHU2NF90KSAxKSA8PCBfZmMpIDogKHU2NF90KSAwKSB8IFwKKwkoKChfZmQgPj0gMCkgJiYgKF9mZCA8IDY0KSkgPyAoKCh1NjRfdCkgMSkgPDwgX2ZkKSA6ICh1NjRfdCkgMCkgfCBcCisJKCgoX2ZlID49IDApICYmIChfZmUgPCA2NCkpID8gKCgodTY0X3QpIDEpIDw8IF9mZSkgOiAodTY0X3QpIDApIHwgXAorCSgoKF9mZiA+PSAwKSAmJiAoX2ZmIDwgNjQpKSA/ICgoKHU2NF90KSAxKSA8PCBfZmYpIDogKHU2NF90KSAwKSB8IFwKKwkoKChfZmcgPj0gMCkgJiYgKF9mZyA8IDY0KSkgPyAoKCh1NjRfdCkgMSkgPDwgX2ZnKSA6ICh1NjRfdCkgMCkgfCBcCisJKCgoX2ZoID49IDApICYmIChfZmggPCA2NCkpID8gKCgodTY0X3QpIDEpIDw8IF9maCkgOiAodTY0X3QpIDApIHwgXAorCSgoKF9maSA+PSAwKSAmJiAoX2ZpIDwgNjQpKSA/ICgoKHU2NF90KSAxKSA8PCBfZmkpIDogKHU2NF90KSAwKSB8IFwKKwkoKChfZmogPj0gMCkgJiYgKF9maiA8IDY0KSkgPyAoKCh1NjRfdCkgMSkgPDwgX2ZqKSA6ICh1NjRfdCkgMCkgfCBcCisJKCgoX2ZrID49IDApICYmIChfZmsgPCA2NCkpID8gKCgodTY0X3QpIDEpIDw8IF9maykgOiAodTY0X3QpIDApIHwgXAorCSgoKF9mbCA+PSAwKSAmJiAoX2ZsIDwgNjQpKSA/ICgoKHU2NF90KSAxKSA8PCBfZmwpIDogKHU2NF90KSAwKSB8IFwKKwkgICAgICAgKCgoKF9mYSA+IDYzKSAmJiAoX2ZhIDwgMTI4KSkgPyAoKCh1NjRfdCkgMSkgPDwgKF9mYSAtIDY0KSkgOiAodTY0X3QpIDApIHwgXAorCQkoKChfZmIgPiA2MykgJiYgKF9mYiA8IDEyOCkpID8gKCgodTY0X3QpIDEpIDw8IChfZmIgLSA2NCkpIDogKHU2NF90KSAwKSB8IFwKKwkJKCgoX2ZjID4gNjMpICYmIChfZmMgPCAxMjgpKSA/ICgoKHU2NF90KSAxKSA8PCAoX2ZjIC0gNjQpKSA6ICh1NjRfdCkgMCkgfCBcCisJCSgoKF9mZCA+IDYzKSAmJiAoX2ZkIDwgMTI4KSkgPyAoKCh1NjRfdCkgMSkgPDwgKF9mZCAtIDY0KSkgOiAodTY0X3QpIDApIHwgXAorCQkoKChfZmUgPiA2MykgJiYgKF9mZSA8IDEyOCkpID8gKCgodTY0X3QpIDEpIDw8IChfZmUgLSA2NCkpIDogKHU2NF90KSAwKSB8IFwKKwkJKCgoX2ZmID4gNjMpICYmIChfZmYgPCAxMjgpKSA/ICgoKHU2NF90KSAxKSA8PCAoX2ZmIC0gNjQpKSA6ICh1NjRfdCkgMCkgfCBcCisJCSgoKF9mZyA+IDYzKSAmJiAoX2ZnIDwgMTI4KSkgPyAoKCh1NjRfdCkgMSkgPDwgKF9mZyAtIDY0KSkgOiAodTY0X3QpIDApIHwgXAorCQkoKChfZmggPiA2MykgJiYgKF9maCA8IDEyOCkpID8gKCgodTY0X3QpIDEpIDw8IChfZmggLSA2NCkpIDogKHU2NF90KSAwKSB8IFwKKwkJKCgoX2ZpID4gNjMpICYmIChfZmkgPCAxMjgpKSA/ICgoKHU2NF90KSAxKSA8PCAoX2ZpIC0gNjQpKSA6ICh1NjRfdCkgMCkgfCBcCisJCSgoKF9maiA+IDYzKSAmJiAoX2ZqIDwgMTI4KSkgPyAoKCh1NjRfdCkgMSkgPDwgKF9maiAtIDY0KSkgOiAodTY0X3QpIDApIHwgXAorCQkoKChfZmsgPiA2MykgJiYgKF9mayA8IDEyOCkpID8gKCgodTY0X3QpIDEpIDw8IChfZmsgLSA2NCkpIDogKHU2NF90KSAwKSB8IFwKKwkJKCgoX2ZsID4gNjMpICYmIChfZmwgPCAxMjgpKSA/ICgoKHU2NF90KSAxKSA8PCAoX2ZsIC0gNjQpKSA6ICh1NjRfdCkgMCkpKX0KKworI2Vsc2UKKworI2RlZmluZSBCTShfZmEsIF9mYiwgX2ZjLCBfZmQsIF9mZSwgX2ZmLCBfZmcsIF9maCwgX2ZpLCBfZmosIF9maywgX2ZsKSBcCisgICAgICB7KCgoKF9mYSA+PSAwKSAmJiAoX2ZhIDwgNjQpKSA/ICgoKHU2NF90KSAxKSA8PCAoX2ZhJjB4M2YpKSA6ICh1NjRfdCkgMCkgfCBcCisJKCgoX2ZiID49IDApICYmIChfZmIgPCA2NCkpID8gKCgodTY0X3QpIDEpIDw8IChfZmImMHgzZikpIDogKHU2NF90KSAwKSB8IFwKKwkoKChfZmMgPj0gMCkgJiYgKF9mYyA8IDY0KSkgPyAoKCh1NjRfdCkgMSkgPDwgKF9mYyYweDNmKSkgOiAodTY0X3QpIDApIHwgXAorCSgoKF9mZCA+PSAwKSAmJiAoX2ZkIDwgNjQpKSA/ICgoKHU2NF90KSAxKSA8PCAoX2ZkJjB4M2YpKSA6ICh1NjRfdCkgMCkgfCBcCisJKCgoX2ZlID49IDApICYmIChfZmUgPCA2NCkpID8gKCgodTY0X3QpIDEpIDw8IChfZmUmMHgzZikpIDogKHU2NF90KSAwKSB8IFwKKwkoKChfZmYgPj0gMCkgJiYgKF9mZiA8IDY0KSkgPyAoKCh1NjRfdCkgMSkgPDwgKF9mZiYweDNmKSkgOiAodTY0X3QpIDApIHwgXAorCSgoKF9mZyA+PSAwKSAmJiAoX2ZnIDwgNjQpKSA/ICgoKHU2NF90KSAxKSA8PCAoX2ZnJjB4M2YpKSA6ICh1NjRfdCkgMCkgfCBcCisJKCgoX2ZoID49IDApICYmIChfZmggPCA2NCkpID8gKCgodTY0X3QpIDEpIDw8IChfZmgmMHgzZikpIDogKHU2NF90KSAwKSB8IFwKKwkoKChfZmkgPj0gMCkgJiYgKF9maSA8IDY0KSkgPyAoKCh1NjRfdCkgMSkgPDwgKF9maSYweDNmKSkgOiAodTY0X3QpIDApIHwgXAorCSgoKF9maiA+PSAwKSAmJiAoX2ZqIDwgNjQpKSA/ICgoKHU2NF90KSAxKSA8PCAoX2ZqJjB4M2YpKSA6ICh1NjRfdCkgMCkgfCBcCisJKCgoX2ZrID49IDApICYmIChfZmsgPCA2NCkpID8gKCgodTY0X3QpIDEpIDw8IChfZmsmMHgzZikpIDogKHU2NF90KSAwKSB8IFwKKwkoKChfZmwgPj0gMCkgJiYgKF9mbCA8IDY0KSkgPyAoKCh1NjRfdCkgMSkgPDwgKF9mbCYweDNmKSkgOiAodTY0X3QpIDApIHwgXAorCSAgICAgICAoKCgoX2ZhID4gNjMpICYmIChfZmEgPCAxMjgpKSA/ICgoKHU2NF90KSAxKSA8PCAoKF9mYSAtIDY0KSYweDNmKSkgOiAodTY0X3QpIDApIHwgXAorCQkoKChfZmIgPiA2MykgJiYgKF9mYiA8IDEyOCkpID8gKCgodTY0X3QpIDEpIDw8ICgoX2ZiIC0gNjQpJjB4M2YpKSA6ICh1NjRfdCkgMCkgfCBcCisJCSgoKF9mYyA+IDYzKSAmJiAoX2ZjIDwgMTI4KSkgPyAoKCh1NjRfdCkgMSkgPDwgKChfZmMgLSA2NCkmMHgzZikpIDogKHU2NF90KSAwKSB8IFwKKwkJKCgoX2ZkID4gNjMpICYmIChfZmQgPCAxMjgpKSA/ICgoKHU2NF90KSAxKSA8PCAoKF9mZCAtIDY0KSYweDNmKSkgOiAodTY0X3QpIDApIHwgXAorCQkoKChfZmUgPiA2MykgJiYgKF9mZSA8IDEyOCkpID8gKCgodTY0X3QpIDEpIDw8ICgoX2ZlIC0gNjQpJjB4M2YpKSA6ICh1NjRfdCkgMCkgfCBcCisJCSgoKF9mZiA+IDYzKSAmJiAoX2ZmIDwgMTI4KSkgPyAoKCh1NjRfdCkgMSkgPDwgKChfZmYgLSA2NCkmMHgzZikpIDogKHU2NF90KSAwKSB8IFwKKwkJKCgoX2ZnID4gNjMpICYmIChfZmcgPCAxMjgpKSA/ICgoKHU2NF90KSAxKSA8PCAoKF9mZyAtIDY0KSYweDNmKSkgOiAodTY0X3QpIDApIHwgXAorCQkoKChfZmggPiA2MykgJiYgKF9maCA8IDEyOCkpID8gKCgodTY0X3QpIDEpIDw8ICgoX2ZoIC0gNjQpJjB4M2YpKSA6ICh1NjRfdCkgMCkgfCBcCisJCSgoKF9maSA+IDYzKSAmJiAoX2ZpIDwgMTI4KSkgPyAoKCh1NjRfdCkgMSkgPDwgKChfZmkgLSA2NCkmMHgzZikpIDogKHU2NF90KSAwKSB8IFwKKwkJKCgoX2ZqID4gNjMpICYmIChfZmogPCAxMjgpKSA/ICgoKHU2NF90KSAxKSA8PCAoKF9maiAtIDY0KSYweDNmKSkgOiAodTY0X3QpIDApIHwgXAorCQkoKChfZmsgPiA2MykgJiYgKF9mayA8IDEyOCkpID8gKCgodTY0X3QpIDEpIDw8ICgoX2ZrIC0gNjQpJjB4M2YpKSA6ICh1NjRfdCkgMCkgfCBcCisJCSgoKF9mbCA+IDYzKSAmJiAoX2ZsIDwgMTI4KSkgPyAoKCh1NjRfdCkgMSkgPDwgKChfZmwgLSA2NCkmMHgzZikpIDogKHU2NF90KSAwKSkpfQorCisjZW5kaWYKKworLyogTWFzayB0byBjaGVjayB3aGV0aGVyIGEgZG9tYWluIGlzIGEgbXVsdGlkb21haW4gb3IgYSBzaW5nbGUKKyAgIGRvbWFpbiAqLworCisjZGVmaW5lIE1VTFRJX0RPTUFJTl9NQVNLIDB4RkYwMAorCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGRlc2NyaWJlIHRoZSBiaXQgbWFza3MgZm9yIGRpZmZlcmVudCBwYXNzaXZlIHNjYW4KKyAqIGNhcGFiaWxpdHkvcmVxdWlyZW1lbnRzIHBlciByZWdkb21haW4uCisgKi8KKyNkZWZpbmUJTk9fUFNDQU4JMHgwVUxMCisjZGVmaW5lCVBTQ0FOX0ZDQwkweDAwMDAwMDAwMDAwMDAwMDFVTEwKKyNkZWZpbmUJUFNDQU5fRkNDX1QJMHgwMDAwMDAwMDAwMDAwMDAyVUxMCisjZGVmaW5lCVBTQ0FOX0VUU0kJMHgwMDAwMDAwMDAwMDAwMDA0VUxMCisjZGVmaW5lCVBTQ0FOX01LSzEJMHgwMDAwMDAwMDAwMDAwMDA4VUxMCisjZGVmaW5lCVBTQ0FOX01LSzIJMHgwMDAwMDAwMDAwMDAwMDEwVUxMCisjZGVmaW5lCVBTQ0FOX01LS0EJMHgwMDAwMDAwMDAwMDAwMDIwVUxMCisjZGVmaW5lCVBTQ0FOX01LS0FfRwkweDAwMDAwMDAwMDAwMDAwNDBVTEwKKyNkZWZpbmUJUFNDQU5fRVRTSUEJMHgwMDAwMDAwMDAwMDAwMDgwVUxMCisjZGVmaW5lCVBTQ0FOX0VUU0lCCTB4MDAwMDAwMDAwMDAwMDEwMFVMTAorI2RlZmluZQlQU0NBTl9FVFNJQwkweDAwMDAwMDAwMDAwMDAyMDBVTEwKKyNkZWZpbmUJUFNDQU5fV1dSCTB4MDAwMDAwMDAwMDAwMDQwMFVMTAorI2RlZmluZQlQU0NBTl9NS0tBMQkweDAwMDAwMDAwMDAwMDA4MDBVTEwKKyNkZWZpbmUJUFNDQU5fTUtLQTFfRwkweDAwMDAwMDAwMDAwMDEwMDBVTEwKKyNkZWZpbmUJUFNDQU5fTUtLQTIJMHgwMDAwMDAwMDAwMDAyMDAwVUxMCisjZGVmaW5lCVBTQ0FOX01LS0EyX0cJMHgwMDAwMDAwMDAwMDA0MDAwVUxMCisjZGVmaW5lCVBTQ0FOX01LSzMJMHgwMDAwMDAwMDAwMDA4MDAwVUxMCisjZGVmaW5lCVBTQ0FOX0RFRkVSCTB4N0ZGRkZGRkZGRkZGRkZGRlVMTAorI2RlZmluZQlJU19FQ01fQ0hBTgkweDgwMDAwMDAwMDAwMDAwMDBVTEwKKworLyoKKyAqIFRIRSBmb2xsb3dpbmcgdGFibGUgaXMgdGhlIG1hcHBpbmcgb2YgcmVnZG9tYWluIHBhaXJzIHNwZWNpZmllZCBieQorICogYW4gOCBiaXQgcmVnZG9tYWluIHZhbHVlIHRvIHRoZSBpbmRpdmlkdWFsIHVuaXRhcnkgcmVnIGRvbWFpbnMKKyAqLworCit0eXBlZGVmIHN0cnVjdCByZWdfZG1uX3BhaXJfbWFwcGluZyB7CisJdTE2X3QgcmVnRG1uRW51bTsJLyogMTYgYml0IHJlZyBkb21haW4gcGFpciAqLworCXUxNl90IHJlZ0RtbjVHSHo7CS8qIDVHSHogcmVnIGRvbWFpbiAqLworCXUxNl90IHJlZ0RtbjJHSHo7CS8qIDJHSHogcmVnIGRvbWFpbiAqLworCXUzMl90IGZsYWdzNUdIejsJCS8qIFJlcXVpcmVtZW50cyBmbGFncyAoQWRIb2MKKwkJCQkJICAgZGlzYWxsb3csIG5vaXNlIGZsb29yIGNhbCBuZWVkZWQsCisJCQkJCSAgIGV0YykgKi8KKwl1MzJfdCBmbGFnczJHSHo7CQkvKiBSZXF1aXJlbWVudHMgZmxhZ3MgKEFkSG9jCisJCQkJCSAgIGRpc2FsbG93LCBub2lzZSBmbG9vciBjYWwgbmVlZGVkLAorCQkJCQkgICBldGMpICovCisJdTY0X3QgcHNjYW5NYXNrOwkJLyogUGFzc2l2ZSBTY2FuIGZsYWdzIHdoaWNoCisJCQkJCSAgIGNhbiBvdmVycmlkZSB1bml0YXJ5IGRvbWFpbgorCQkJCQkgICBwYXNzaXZlIHNjYW4gZmxhZ3MuICBUaGlzCisJCQkJCSAgIHZhbHVlIGlzIHVzZWQgYXMgYSBtYXNrIG9uCisJCQkJCSAgIHRoZSB1bml0YXJ5IGZsYWdzKi8KKwl1MTZfdCBzaW5nbGVDQzsJCS8qIENvdW50cnkgY29kZSBvZiBzaW5nbGUgY291bnRyeSBpZgorCQkJCQkgICBhIG9uZS1vbi1vbmUgbWFwcGluZyBleGlzdHMgKi8KK30gIFJFR19ETU5fUEFJUl9NQVBQSU5HOworCitzdGF0aWMgUkVHX0RNTl9QQUlSX01BUFBJTkcgcmVnRG9tYWluUGFpcnNbXSA9IHsKKwl7Tk9fRU5VTVJELAkgICAgRkNDMiwJREVCVUdfUkVHX0RNTiwgIE5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtOVUxMMV9XT1JMRCwJTlVMTDEsCQlXT1JMRCwJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtOVUxMMV9FVFNJQiwJTlVMTDEsCQlFVFNJQiwJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtOVUxMMV9FVFNJQywJTlVMTDEsCQlFVFNJQywJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCisJe0ZDQzJfRkNDQSwgICAgIEZDQzIsCQlGQ0NBLAkJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe0ZDQzJfV09STEQsICAgIEZDQzIsCQlXT1JMRCwJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtGQ0MyX0VUU0lDLAlGQ0MyLAkJRVRTSUMsCQlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7RkNDM19GQ0NBLCAgICAgRkNDMywJCUZDQ0EsCQlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7RkNDM19XT1JMRCwgICAgRkNDMywJCVdPUkxELAkJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe0ZDQzRfRkNDQSwgICAgIEZDQzQsCQlGQ0NBLAkJRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7RkNDNV9GQ0NBLCAgICAgRkNDNSwJCUZDQ0EsCQlESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtGQ0M2X0ZDQ0EsICAgICBGQ0M2LAkJRkNDQSwJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtGQ0M2X1dPUkxELCAgICBGQ0M2LAkJV09STEQsCQlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKworCXtFVFNJMV9XT1JMRCwJRVRTSTEsCQlXT1JMRCwJCURJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe0VUU0kyX1dPUkxELAlFVFNJMiwJCVdPUkxELAkJRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7RVRTSTNfV09STEQsCUVUU0kzLAkJV09STEQsCQlESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtFVFNJNF9XT1JMRCwJRVRTSTQsCQlXT1JMRCwJCURJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe0VUU0k1X1dPUkxELAlFVFNJNSwJCVdPUkxELAkJRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7RVRTSTZfV09STEQsCUVUU0k2LAkJV09STEQsCQlESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCisJe0VUU0kzX0VUU0lBLAlFVFNJMywJCVdPUkxELAkJRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7RlJBTkNFX1JFUywJRVRTSTMsCQlXT1JMRCwJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCisJe0ZDQzFfV09STEQsCUZDQzEsCQlXT1JMRCwJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtGQ0MxX0ZDQ0EsICAgICBGQ0MxLAkJRkNDQSwJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtBUEwxX1dPUkxELAlBUEwxLAkJV09STEQsCQlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7QVBMMl9XT1JMRCwJQVBMMiwJCVdPUkxELAkJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe0FQTDNfV09STEQsCUFQTDMsCQlXT1JMRCwJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtBUEw0X1dPUkxELAlBUEw0LAkJV09STEQsCQlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7QVBMNV9XT1JMRCwJQVBMNSwJCVdPUkxELAkJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe0FQTDZfV09STEQsCUFQTDYsCQlXT1JMRCwJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtBUEw4X1dPUkxELAlBUEw4LAkJV09STEQsCQlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7QVBMOV9XT1JMRCwJQVBMOSwJCVdPUkxELAkJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisKKwl7QVBMM19GQ0NBLCAgICAgQVBMMywJCUZDQ0EsCQlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7QVBMMV9FVFNJQywJQVBMMSwJCUVUU0lDLAkJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe0FQTDJfRVRTSUMsCUFQTDIsCQlFVFNJQywJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtBUEwyX0ZDQ0EsCQlBUEwyLAkJRkNDQSwJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtBUEwyX0FQTEQsICAgICBBUEwyLAkJQVBMRCwJCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMH0sCisJe0FQTDdfRkNDQSwJCUFQTDcsCQlGQ0NBLAkJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisKKwl7TUtLMV9NS0tBLCAgICAgTUtLMSwJCU1LS0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLMSB8IFBTQ0FOX01LS0EsIENUUllfSkFQQU4gfSwKKwl7TUtLMV9NS0tCLCAgICAgTUtLMSwJCU1LS0EsCQlNS0s1R0haX0ZMQUcyLCBORUVEX05GQywgUFNDQU5fTUtLMSB8IFBTQ0FOX01LS0EgfCBQU0NBTl9NS0tBX0csIENUUllfSkFQQU4xIH0sCisJe01LSzFfRkNDQSwgICAgIE1LSzEsCQlGQ0NBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LSzEsIENUUllfSkFQQU4yIH0sCisJe01LSzFfTUtLQTEsICAgIE1LSzEsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LSzEgfCBQU0NBTl9NS0tBMSB8IFBTQ0FOX01LS0ExX0csIENUUllfSkFQQU40IH0sCisJe01LSzFfTUtLQTIsICAgIE1LSzEsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LSzEgfCBQU0NBTl9NS0tBMiB8IFBTQ0FOX01LS0EyX0csIENUUllfSkFQQU41IH0sCisJe01LSzFfTUtLQywgICAgIE1LSzEsCQlNS0tDLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LSzEsIENUUllfSkFQQU42IH0sCisKKwkvKiBNS0syICovCisJe01LSzJfTUtLQSwgICAgIE1LSzIsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMiwgTkVFRF9ORkMsIFBTQ0FOX01LSzIgfCBQU0NBTl9NS0tBIHwgUFNDQU5fTUtLQV9HLCBDVFJZX0pBUEFOMyB9LAorCisJLyogTUtLMyAqLworCXtNS0szX01LS0EsICAgICBNS0szLAkJTUtLQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBOT19QU0NBTiwgQ1RSWV9KQVBBTjI1IH0sCisJe01LSzNfTUtLQiwgICAgIE1LSzMsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMiwgTkVFRF9ORkMsIFBTQ0FOX01LS0EgfCBQU0NBTl9NS0tBX0csIENUUllfSkFQQU43IH0sCisJe01LSzNfTUtLQTEsICAgIE1LSzMsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LS0ExIHwgUFNDQU5fTUtLQTFfRywgQ1RSWV9KQVBBTjI2IH0sCisJe01LSzNfTUtLQTIsICAgIE1LSzMsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LS0EyIHwgUFNDQU5fTUtLQTJfRywgQ1RSWV9KQVBBTjggfSwKKwl7TUtLM19NS0tDLCAgICAgTUtLMywJCU1LS0MsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgTk9fUFNDQU4sIENUUllfSkFQQU45IH0sCisJe01LSzNfRkNDQSwgICAgIE1LSzMsCQlGQ0NBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIE5PX1BTQ0FOLCBDVFJZX0pBUEFOMjcgfSwKKworCS8qIE1LSzQgKi8KKwl7TUtLNF9NS0tCLCAgICAgTUtLNCwJCU1LS0EsCQlNS0s1R0haX0ZMQUcyLCBORUVEX05GQywgUFNDQU5fTUtLMyB8IFBTQ0FOX01LS0EgfCBQU0NBTl9NS0tBX0csIENUUllfSkFQQU4xMCB9LAorCXtNS0s0X01LS0ExLCAgICBNS0s0LAkJTUtLQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBQU0NBTl9NS0szIHwgUFNDQU5fTUtLQTEgfCBQU0NBTl9NS0tBMV9HLCBDVFJZX0pBUEFOMjggfSwKKwl7TUtLNF9NS0tBMiwgICAgTUtLNCwJCU1LS0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLMyB8UFNDQU5fTUtLQTIgfCBQU0NBTl9NS0tBMl9HLCBDVFJZX0pBUEFOMTEgfSwKKwl7TUtLNF9NS0tDLCAgICAgTUtLNCwJCU1LS0MsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLMywgQ1RSWV9KQVBBTjEyIH0sCisJe01LSzRfRkNDQSwgICAgIE1LSzQsCQlGQ0NBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIE5PX1BTQ0FOLCBDVFJZX0pBUEFOMjkgfSwKKwl7TUtLNF9NS0tBLCAgICAgTUtLNCwJCU1LS0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLMyB8IFBTQ0FOX01LS0EsIENUUllfSkFQQU4zNiB9LAorCisJLyogTUtLNSAqLworCXtNS0s1X01LS0IsICAgICBNS0s1LAkJTUtLQSwJCU1LSzVHSFpfRkxBRzIsIE5FRURfTkZDLCBQU0NBTl9NS0szIHwgUFNDQU5fTUtLQSB8IFBTQ0FOX01LS0FfRywgQ1RSWV9KQVBBTjEzIH0sCisJe01LSzVfTUtLQTIsICAgIE1LSzUsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LSzMgfCBQU0NBTl9NS0tBMiB8IFBTQ0FOX01LS0EyX0csIENUUllfSkFQQU4xNCB9LAorCXtNS0s1X01LS0MsICAgICBNS0s1LAkJTUtLQywJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBQU0NBTl9NS0szLCBDVFJZX0pBUEFOMTUgfSwKKworCS8qIE1LSzYgKi8KKwl7TUtLNl9NS0tCLCAgICAgTUtLNiwJCU1LS0EsCQlNS0s1R0haX0ZMQUcyLCBORUVEX05GQywgUFNDQU5fTUtLMSB8IFBTQ0FOX01LS0EgfCBQU0NBTl9NS0tBX0csIENUUllfSkFQQU4xNiB9LAorCXtNS0s2X01LS0EyLCAgICBNS0s2LAkJTUtLQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBQU0NBTl9NS0sxIHwgUFNDQU5fTUtLQTIgfCBQU0NBTl9NS0tBMl9HLCBDVFJZX0pBUEFOMTcgfSwKKwl7TUtLNl9NS0tDLCAgICAgTUtLNiwJCU1LS0MsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLMSwgQ1RSWV9KQVBBTjE4IH0sCisJe01LSzZfTUtLQTEsICAgIE1LSzYsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LS0ExIHwgUFNDQU5fTUtLQTFfRywgQ1RSWV9KQVBBTjMwIH0sCisJe01LSzZfRkNDQSwgICAgIE1LSzYsCQlGQ0NBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIE5PX1BTQ0FOLCBDVFJZX0pBUEFOMzEgfSwKKworCS8qIE1LSzcgKi8KKwl7TUtLN19NS0tCLCAgICAgTUtLNywJCU1LS0EsCQlNS0s1R0haX0ZMQUcyLCBORUVEX05GQywgUFNDQU5fTUtLMSB8IFBTQ0FOX01LSzMgfCBQU0NBTl9NS0tBIHwgUFNDQU5fTUtLQV9HLCBDVFJZX0pBUEFOMTkgfSwKKwl7TUtLN19NS0tBLCAgICAgTUtLNywJCU1LS0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLMSB8IFBTQ0FOX01LSzMgfCBQU0NBTl9NS0tBMiB8IFBTQ0FOX01LS0EyX0csIENUUllfSkFQQU4yMCB9LAorCXtNS0s3X01LS0MsICAgICBNS0s3LAkJTUtLQywJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBQU0NBTl9NS0sxIHwgUFNDQU5fTUtLMywgQ1RSWV9KQVBBTjIxIH0sCisJe01LSzdfTUtLQTEsICAgIE1LSzcsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LS0ExIHwgUFNDQU5fTUtLQTFfRywgQ1RSWV9KQVBBTjMyIH0sCisJe01LSzdfRkNDQSwgICAgIE1LSzcsCQlGQ0NBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIE5PX1BTQ0FOLCBDVFJZX0pBUEFOMzMgfSwKKworCS8qIE1LSzggKi8KKwl7TUtLOF9NS0tCLCAgICAgTUtLOCwJCU1LS0EsCQlNS0s1R0haX0ZMQUcyLCBORUVEX05GQywgUFNDQU5fTUtLMSB8IFBTQ0FOX01LSzMgfCBQU0NBTl9NS0tBIHwgUFNDQU5fTUtLQV9HLCBDVFJZX0pBUEFOMjIgfSwKKwl7TUtLOF9NS0tBMiwgICAgTUtLOCwJCU1LS0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLMSB8IFBTQ0FOX01LSzMgfCBQU0NBTl9NS0tBMiB8IFBTQ0FOX01LS0EyX0csIENUUllfSkFQQU4yMyB9LAorCXtNS0s4X01LS0MsICAgICBNS0s4LAkJTUtLQywJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBQU0NBTl9NS0sxIHwgUFNDQU5fTUtLMyAsIENUUllfSkFQQU4yNCB9LAorCisgICAJLyogTUtLOSAqLworCXtNS0s5X01LS0EsICAgICBNS0s5LAkJTUtLQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBOT19QU0NBTiwgQ1RSWV9KQVBBTjM0IH0sCisJe01LSzlfRkNDQSwgICAgIE1LSzksCQlGQ0NBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIE5PX1BTQ0FOLCBDVFJZX0pBUEFOMzcgfSwKKwl7TUtLOV9NS0tBMSwgICAgTUtLOSwJCU1LS0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLQTEgfCBQU0NBTl9NS0tBMV9HLCBDVFJZX0pBUEFOMzggfSwKKwl7TUtLOV9NS0tDLCAgICAgTUtLOSwJCU1LS0MsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgTk9fUFNDQU4sIENUUllfSkFQQU4zOSB9LAorCXtNS0s5X01LS0EyLAlNS0s5LAkJTUtLQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBQU0NBTl9NS0sxIHwgUFNDQU5fTUtLMyB8IFBTQ0FOX01LS0EyIHwgUFNDQU5fTUtLQTJfRywgQ1RSWV9KQVBBTjQwIH0sCisKKwkvKiBNS0sxMCAqLworCXtNS0sxMF9NS0tBLAlNS0sxMCwJCU1LS0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgTk9fUFNDQU4sIENUUllfSkFQQU4zNSB9LAorCXtNS0sxMF9GQ0NBLAlNS0sxMCwJCUZDQ0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgTk9fUFNDQU4sIENUUllfSkFQQU40MSB9LAorCXtNS0sxMF9NS0tBMSwJTUtLMTAsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LS0ExIHwgUFNDQU5fTUtLQTFfRywgQ1RSWV9KQVBBTjQyIH0sCisJe01LSzEwX01LS0MsCU1LSzEwLAkJTUtLQywJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBOT19QU0NBTiwgQ1RSWV9KQVBBTjQzIH0sCisJe01LSzEwX01LS0EyLAlNS0sxMCwJCU1LS0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLMSB8IFBTQ0FOX01LSzMgfCBQU0NBTl9NS0tBMiB8IFBTQ0FOX01LS0EyX0csIENUUllfSkFQQU40NCB9LAorCisJLyogTUtLMTEgKi8KKwl7TUtLMTFfTUtLQSwJTUtLMTEsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIE5PX1BTQ0FOLCBDVFJZX0pBUEFONDUgfSwKKwl7TUtLMTFfRkNDQSwJTUtLMTEsCQlGQ0NBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIE5PX1BTQ0FOLCBDVFJZX0pBUEFONDYgfSwKKwl7TUtLMTFfTUtLQTEsCU1LSzExLAkJTUtLQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBQU0NBTl9NS0tBMSB8IFBTQ0FOX01LS0ExX0csIENUUllfSkFQQU40NyB9LAorCXtNS0sxMV9NS0tDLAlNS0sxMSwJCU1LS0MsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgTk9fUFNDQU4sIENUUllfSkFQQU40OCB9LAorCXtNS0sxMV9NS0tBMiwJTUtLMTEsCQlNS0tBLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIFBTQ0FOX01LSzEgfCBQU0NBTl9NS0szIHwgUFNDQU5fTUtLQTIgfCBQU0NBTl9NS0tBMl9HLCBDVFJZX0pBUEFONDkgfSwKKworCS8qIE1LSzEyICovCisJe01LSzEyX01LS0EsCU1LSzEyLAkJTUtLQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBOT19QU0NBTiwgQ1RSWV9KQVBBTjUwIH0sCisJe01LSzEyX0ZDQ0EsCU1LSzEyLAkJRkNDQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBOT19QU0NBTiwgQ1RSWV9KQVBBTjUxIH0sCisJe01LSzEyX01LS0ExLAlNS0sxMiwJCU1LS0EsCQlNS0s1R0haX0ZMQUcxLCBORUVEX05GQywgUFNDQU5fTUtLQTEgfCBQU0NBTl9NS0tBMV9HLCBDVFJZX0pBUEFONTIgfSwKKwl7TUtLMTJfTUtLQywJTUtLMTIsCQlNS0tDLAkJTUtLNUdIWl9GTEFHMSwgTkVFRF9ORkMsIE5PX1BTQ0FOLCBDVFJZX0pBUEFONTMgfSwKKwl7TUtLMTJfTUtLQTIsCU1LSzEyLAkJTUtLQSwJCU1LSzVHSFpfRkxBRzEsIE5FRURfTkZDLCBQU0NBTl9NS0sxIHwgUFNDQU5fTUtLMyB8IFBTQ0FOX01LS0EyIHwgUFNDQU5fTUtLQTJfRywgQ1RSWV9KQVBBTjU0IH0sCisKKworCS8qIFRoZXNlIGFyZSBzdXBlciBkb21haW5zICovCisJe1dPUjBfV09STEQsCVdPUjBfV09STEQsCVdPUjBfV09STEQsCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtXT1IxX1dPUkxELAlXT1IxX1dPUkxELAlXT1IxX1dPUkxELAlESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtXT1IyX1dPUkxELAlXT1IyX1dPUkxELAlXT1IyX1dPUkxELAlESVNBTExPV19BREhPQ18xMUFfVFVSQiwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtXT1IzX1dPUkxELAlXT1IzX1dPUkxELAlXT1IzX1dPUkxELAlOT19SRVEsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7V09SNF9XT1JMRCwJV09SNF9XT1JMRCwJV09SNF9XT1JMRCwJRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7V09SNV9FVFNJQywJV09SNV9FVFNJQywJV09SNV9FVFNJQywJRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsIE5PX1JFUSwgUFNDQU5fREVGRVIsIDAgfSwKKwl7V09SMDFfV09STEQsCVdPUjAxX1dPUkxELAlXT1IwMV9XT1JMRCwJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe1dPUjAyX1dPUkxELAlXT1IwMl9XT1JMRCwJV09SMDJfV09STEQsCU5PX1JFUSwgTk9fUkVRLCBQU0NBTl9ERUZFUiwgMCB9LAorCXtFVTFfV09STEQsCSAgICBFVTFfV09STEQsCUVVMV9XT1JMRCwJTk9fUkVRLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe1dPUjlfV09STEQsCVdPUjlfV09STEQsCVdPUjlfV09STEQsCURJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCisJe1dPUkFfV09STEQsCVdPUkFfV09STEQsCVdPUkFfV09STEQsCURJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLCBOT19SRVEsIFBTQ0FOX0RFRkVSLCAwIH0sCit9OworCisvKgorICogVGhlIGZvbGxvd2luZyB0YWJsZSBpcyB0aGUgbWFzdGVyIGxpc3QgZm9yIGFsbCBkaWZmZXJlbnQgZnJlcWV1bmN5CisgKiBiYW5kcyB3aXRoIHRoZSBjb21wbGV0ZSBtYXRyaXggb2YgYWxsIHBvc3NpYmxlIGZsYWdzIGFuZCBzZXR0aW5ncworICogZm9yIGVhY2ggYmFuZCBpZiBpdCBpcyB1c2VkIGluIEFOWSByZWcgZG9tYWluLgorICovCisKKyNkZWZpbmUgREVGX1JFR0RNTgkJRkNDMV9GQ0NBCisjZGVmaW5lCURFRl9ETU5fNQkJRkNDMQorI2RlZmluZQlERUZfRE1OXzIJCUZDQ0EKKyNkZWZpbmUJQ09VTlRSWV9FUkRfRkxBRyAgICAgICAgMHg4MDAwCisjZGVmaW5lIFdPUkxEV0lERV9ST0FNSU5HX0ZMQUcgIDB4NDAwMAorI2RlZmluZQlTVVBFUl9ET01BSU5fTUFTSwkweDBmZmYKKyNkZWZpbmUJQ09VTlRSWV9DT0RFX01BU0sJMHgwM2ZmCisjZGVmaW5lIENGX0lOVEVSRkVSRU5DRQkJKENIQU5ORUxfQ1dfSU5UIHwgQ0hBTk5FTF9SQURBUl9JTlQpCisjZGVmaW5lIENIQU5ORUxfMTQJCSgyNDg0KQkvKiA4MDIuMTFnIG9wZXJhdGlvbiBpcyBub3QgcGVybWl0dGVkIG9uIGNoYW5uZWwgMTQgKi8KKyNkZWZpbmUgSVNfMTFHX0NIMTQoX2NoLF9jZikgXAorCSgoKF9jaCkgPT0gQ0hBTk5FTF8xNCkgJiYgKChfY2YpID09IENIQU5ORUxfRykpCisKKyNkZWZpbmUJWUVTCVRSVUUKKyNkZWZpbmUJTk8JRkFMU0UKKworZW51bSB7CisJQ1RSWV9ERUJVRwk9IDB4MWZmLAkJLyogZGVidWcgY291bnRyeSBjb2RlICovCisJQ1RSWV9ERUZBVUxUCT0gMAkJCS8qIGRlZmF1bHQgY291bnRyeSBjb2RlICovCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisJSEFMX0NUUllfQ09ERQljb3VudHJ5Q29kZTsKKwlIQUxfUkVHX0RPTUFJTglyZWdEbW5FbnVtOworCWNvbnN0IGNoYXIqCQlpc29OYW1lOworCWNvbnN0IGNoYXIqCQluYW1lOworCUhBTF9CT09MCQlhbGxvdzExZzsKKwlIQUxfQk9PTAkJYWxsb3cxMWFUdXJibzsKKwlIQUxfQk9PTAkJYWxsb3cxMWdUdXJibzsKKyAgICBIQUxfQk9PTCAgICAgICAgYWxsb3cxMW5hOyAgICAgIC8qIEhULTQwIGFsbG93ZWQgaW4gNUdIej8gKi8KKyAgICBIQUxfQk9PTCAgICAgICAgYWxsb3cxMW5nOyAgICAgIC8qIEhULTQwIGFsbG93ZWQgaW4gMkdIej8gKi8KKwl1MTZfdAkJb3V0ZG9vckNoYW5TdGFydDsKK30gQ09VTlRSWV9DT0RFX1RPX0VOVU1fUkQ7CisKK3N0YXRpYyBDT1VOVFJZX0NPREVfVE9fRU5VTV9SRCBhbGxDb3VudHJpZXNbXSA9IHsKKyAgICB7Q1RSWV9ERUJVRywgICAgICAgTk9fRU5VTVJELCAgICAgIkRCIiwgIkRFQlVHIiwgICAgICAgICAgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9ERUZBVUxULCAgICAgREVGX1JFR0RNTiwgICAgIk5BIiwgIk5PX0NPVU5UUllfU0VUIiwgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9BTEJBTklBLCAgICAgTlVMTDFfV09STEQsICAgIkFMIiwgIkFMQkFOSUEiLCAgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9BTEdFUklBLCAgICAgTlVMTDFfV09STEQsICAgIkRaIiwgIkFMR0VSSUEiLCAgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9BUkdFTlRJTkEsICAgQVBMM19XT1JMRCwgICAgIkFSIiwgIkFSR0VOVElOQSIsICAgICAgWUVTLCBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9BUk1FTklBLCAgICAgRVRTSTRfV09STEQsICAgIkFNIiwgIkFSTUVOSUEiLCAgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9BVVNUUkFMSUEsICAgRkNDNl9XT1JMRCwgICAgIkFVIiwgIkFVU1RSQUxJQSIsICAgICAgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9BVVNUUklBLCAgICAgRVRTSTJfV09STEQsICAgIkFUIiwgIkFVU1RSSUEiLCAgICAgICAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9BWkVSQkFJSkFOLCAgRVRTSTRfV09STEQsICAgIkFaIiwgIkFaRVJCQUlKQU4iLCAgICAgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9CQUhSQUlOLCAgICAgQVBMNl9XT1JMRCwgICAgIkJIIiwgIkJBSFJBSU4iLCAgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9CRUxBUlVTLCAgICAgRVRTSTFfV09STEQsICAgIkJZIiwgIkJFTEFSVVMiLCAgICAgICAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9CRUxHSVVNLCAgICAgRVRTSTFfV09STEQsICAgIkJFIiwgIkJFTEdJVU0iLCAgICAgICAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9CRUxJWkUsICAgICAgQVBMMV9FVFNJQywgICAgIkJaIiwgIkJFTElaRSIsICAgICAgICAgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9CT0xJVklBLCAgICAgQVBMMV9FVFNJQywgICAgIkJPIiwgIkJPTFZJQSIsICAgICAgICAgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9CUkFaSUwsICAgICAgRkNDM19XT1JMRCwgICAgIkJSIiwgIkJSQVpJTCIsICAgICAgICAgTk8sICBOTywgIE5PLCAgTk8sICBOTywgIDcwMDAgfSwKKyAgICB7Q1RSWV9CUlVORUlfREFSVVNTQUxBTSxBUEwxX1dPUkxELCJCTiIsICJCUlVORUkgREFSVVNTQUxBTSIsIFlFUywgWUVTLCBZRVMsICBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0JVTEdBUklBLCAgICBFVFNJNl9XT1JMRCwgICAiQkciLCAiQlVMR0FSSUEiLCAgICAgICBZRVMsIE5PLCAgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0NBTkFEQSwgICAgICBGQ0M2X0ZDQ0EsICAgICAiQ0EiLCAiQ0FOQURBIiwgICAgICAgICBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0NISUxFLCAgICAgICBBUEw2X1dPUkxELCAgICAiQ0wiLCAiQ0hJTEUiLCAgICAgICAgICBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0NISU5BLCAgICAgICBBUEwxX1dPUkxELCAgICAiQ04iLCAiQ0hJTkEiLCAgICAgICAgICBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0NPTE9NQklBLCAgICBGQ0MxX0ZDQ0EsICAgICAiQ08iLCAiQ09MT01CSUEiLCAgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0NPU1RBX1JJQ0EsICBGQ0MxX1dPUkxELCAgICAiQ1IiLCAiQ09TVEEgUklDQSIsICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0NST0FUSUEsICAgICBFVFNJM19XT1JMRCwgICAiSFIiLCAiQ1JPQVRJQSIsICAgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0NZUFJVUywgICAgICBFVFNJM19XT1JMRCwgICAiQ1kiLCAiQ1lQUlVTIiwgICAgICAgICBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0NaRUNILCAgICAgICBFVFNJM19XT1JMRCwgICAiQ1oiLCAiQ1pFQ0ggUkVQVUJMSUMiLCBZRVMsIE5PLCBZRVMsICBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0RFTk1BUkssICAgICBFVFNJMV9XT1JMRCwgICAiREsiLCAiREVOTUFSSyIsICAgICAgICBZRVMsIE5PLCAgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX0RPTUlOSUNBTl9SRVBVQkxJQyxGQ0MxX0ZDQ0EsIkRPIiwgIkRPTUlOSUNBTiBSRVBVQkxJQyIsIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfRUNVQURPUiwgICAgIEZDQzFfV09STEQsICAgICJFQyIsICJFQ1VBRE9SIiwgICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfRUdZUFQsICAgICAgIEVUU0kzX1dPUkxELCAgICJFRyIsICJFR1lQVCIsICAgICAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfRUxfU0FMVkFET1IsIEZDQzFfV09STEQsICAgICJTViIsICJFTCBTQUxWQURPUiIsICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfRVNUT05JQSwgICAgIEVUU0kxX1dPUkxELCAgICJFRSIsICJFU1RPTklBIiwgICAgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfRklOTEFORCwgICAgIEVUU0kxX1dPUkxELCAgICJGSSIsICJGSU5MQU5EIiwgICAgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfRlJBTkNFLCAgICAgIEVUU0kxX1dPUkxELCAgICJGUiIsICJGUkFOQ0UiLCAgICAgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfRlJBTkNFMiwgICAgIEVUU0kzX1dPUkxELCAgICJGMiIsICJGUkFOQ0VfUkVTIiwgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfR0VPUkdJQSwgICAgIEVUU0k0X1dPUkxELCAgICJHRSIsICJHRU9SR0lBIiwgICAgICAgIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfR0VSTUFOWSwgICAgIEVUU0kxX1dPUkxELCAgICJERSIsICJHRVJNQU5ZIiwgICAgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfR1JFRUNFLCAgICAgIEVUU0kxX1dPUkxELCAgICJHUiIsICJHUkVFQ0UiLCAgICAgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfR1VBVEVNQUxBLCAgIEZDQzFfRkNDQSwgICAgICJHVCIsICJHVUFURU1BTEEiLCAgICAgIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfSE9ORFVSQVMsICAgIE5VTEwxX1dPUkxELCAgICJITiIsICJIT05EVVJBUyIsICAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfSE9OR19LT05HLCAgIEZDQzJfV09STEQsICAgICJISyIsICJIT05HIEtPTkciLCAgICAgIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfSFVOR0FSWSwgICAgIEVUU0k0X1dPUkxELCAgICJIVSIsICJIVU5HQVJZIiwgICAgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfSUNFTEFORCwgICAgIEVUU0kxX1dPUkxELCAgICJJUyIsICJJQ0VMQU5EIiwgICAgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfSU5ESUEsICAgICAgIEFQTDZfV09STEQsICAgICJJTiIsICJJTkRJQSIsICAgICAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfSU5ET05FU0lBLCAgIEFQTDFfV09STEQsICAgICJJRCIsICJJTkRPTkVTSUEiLCAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfSVJBTiwgICAgICAgIEFQTDFfV09STEQsICAgICJJUiIsICJJUkFOIiwgICAgICAgICAgIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfSVJFTEFORCwgICAgIEVUU0kxX1dPUkxELCAgICJJRSIsICJJUkVMQU5EIiwgICAgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfSVNSQUVMLCAgICAgIEVUU0kzX1dPUkxELCAgICJJTCIsICJJU1JBRUwiLCAgICAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfSVNSQUVMMiwgICAgIE5VTEwxX0VUU0lCLCAgICJJU1IiLCJJU1JBRUxfUkVTIiwgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfSVRBTFksICAgICAgIEVUU0kxX1dPUkxELCAgICJJVCIsICJJVEFMWSIsICAgICAgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfSkFNQUlDQSwgICAgIEVUU0kxX1dPUkxELCAgICJKTSIsICJKQU1BSUNBIiwgICAgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfSkFQQU4sICAgICAgIE1LSzFfTUtLQSwgICAgICJKUCIsICJKQVBBTiIsICAgICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4xLCAgICAgIE1LSzFfTUtLQiwgICAgICJKMSIsICJKQVBBTjEiLCAgICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4yLCAgICAgIE1LSzFfRkNDQSwgICAgICJKMiIsICJKQVBBTjIiLCAgICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4zLCAgICAgIE1LSzJfTUtLQSwgICAgICJKMyIsICJKQVBBTjMiLCAgICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU40LCAgICAgIE1LSzFfTUtLQTEsICAgICJKNCIsICJKQVBBTjQiLCAgICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU41LCAgICAgIE1LSzFfTUtLQTIsICAgICJKNSIsICJKQVBBTjUiLCAgICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU42LCAgICAgIE1LSzFfTUtLQywgICAgICJKNiIsICJKQVBBTjYiLCAgICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU43LCAgICAgIE1LSzNfTUtLQiwgICAgICJKNyIsICJKQVBBTjciLCAgICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU44LCAgICAgIE1LSzNfTUtLQTIsICAgICJKOCIsICJKQVBBTjgiLCAgICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU45LCAgICAgIE1LSzNfTUtLQywgICAgICJKOSIsICJKQVBBTjkiLCAgICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4xMCwgICAgIE1LSzRfTUtLQiwgICAgICJKMTAiLCAiSkFQQU4xMCIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4xMSwgICAgIE1LSzRfTUtLQTIsICAgICJKMTEiLCAiSkFQQU4xMSIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4xMiwgICAgIE1LSzRfTUtLQywgICAgICJKMTIiLCAiSkFQQU4xMiIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4xMywgICAgIE1LSzVfTUtLQiwgICAgICJKMTMiLCAiSkFQQU4xMyIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4xNCwgICAgIE1LSzVfTUtLQTIsICAgICJKMTQiLCAiSkFQQU4xNCIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4xNSwgICAgIE1LSzVfTUtLQywgICAgICJKMTUiLCAiSkFQQU4xNSIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4xNiwgICAgIE1LSzZfTUtLQiwgICAgICJKMTYiLCAiSkFQQU4xNiIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4xNywgICAgIE1LSzZfTUtLQTIsICAgICJKMTciLCAiSkFQQU4xNyIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4xOCwgICAgIE1LSzZfTUtLQywgICAgICJKMTgiLCAiSkFQQU4xOCIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4xOSwgICAgIE1LSzdfTUtLQiwgICAgICJKMTkiLCAiSkFQQU4xOSIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4yMCwgICAgIE1LSzdfTUtLQSwgICAgICJKMjAiLCAiSkFQQU4yMCIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4yMSwgICAgIE1LSzdfTUtLQywgICAgICJKMjEiLCAiSkFQQU4yMSIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4yMiwgICAgIE1LSzhfTUtLQiwgICAgICJKMjIiLCAiSkFQQU4yMiIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4yMywgICAgIE1LSzhfTUtLQTIsICAgICJKMjMiLCAiSkFQQU4yMyIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4yNCwgICAgIE1LSzhfTUtLQywgICAgICJKMjQiLCAiSkFQQU4yNCIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4yNSwgICAgIE1LSzNfTUtLQSwgICAgICJKMjUiLCAiSkFQQU4yNSIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4yNiwgICAgIE1LSzNfTUtLQTEsICAgICJKMjYiLCAiSkFQQU4yNiIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4yNywgICAgIE1LSzNfRkNDQSwgICAgICJKMjciLCAiSkFQQU4yNyIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4yOCwgICAgIE1LSzRfTUtLQTEsICAgICJKMjgiLCAiSkFQQU4yOCIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4yOSwgICAgIE1LSzRfRkNDQSwgICAgICJKMjkiLCAiSkFQQU4yOSIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4zMCwgICAgIE1LSzZfTUtLQTEsICAgICJKMzAiLCAiSkFQQU4zMCIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4zMSwgICAgIE1LSzZfRkNDQSwgICAgICJKMzEiLCAiSkFQQU4zMSIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4zMiwgICAgIE1LSzdfTUtLQTEsICAgICJKMzIiLCAiSkFQQU4zMiIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4zMywgICAgIE1LSzdfRkNDQSwgICAgICJKMzMiLCAiSkFQQU4zMyIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4zNCwgICAgIE1LSzlfTUtLQSwgICAgICJKMzQiLCAiSkFQQU4zNCIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4zNSwgICAgIE1LSzEwX01LS0EsICAgICJKMzUiLCAiSkFQQU4zNSIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4zNiwgICAgIE1LSzRfTUtLQSwgICAgICJKMzYiLCAiSkFQQU4zNiIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4zNywgICAgIE1LSzlfRkNDQSwgICAgICJKMzciLCAiSkFQQU4zNyIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4zOCwgICAgIE1LSzlfTUtLQTEsICAgICJKMzgiLCAiSkFQQU4zOCIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU4zOSwgICAgIE1LSzlfTUtLQywgICAgICJKMzkiLCAiSkFQQU4zOSIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU40MCwgICAgIE1LSzEwX01LS0EyLCAgICJKNDAiLCAiSkFQQU40MCIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU40MSwgICAgIE1LSzEwX0ZDQ0EsICAgICJKNDEiLCAiSkFQQU40MSIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU40MiwgICAgIE1LSzEwX01LS0ExLCAgICJKNDIiLCAiSkFQQU40MiIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU40MywgICAgIE1LSzEwX01LS0MsICAgICJKNDMiLCAiSkFQQU40MyIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU40NCwgICAgIE1LSzEwX01LS0EyLCAgICJKNDQiLCAiSkFQQU40NCIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU40NSwgICAgIE1LSzExX01LS0EsICAgICJKNDUiLCAiSkFQQU40NSIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU40NiwgICAgIE1LSzExX0ZDQ0EsICAgICJKNDYiLCAiSkFQQU40NiIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU40NywgICAgIE1LSzExX01LS0ExLCAgICJKNDciLCAiSkFQQU40NyIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU40OCwgICAgIE1LSzExX01LS0MsICAgICJKNDgiLCAiSkFQQU40OCIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU40OSwgICAgIE1LSzExX01LS0EyLCAgICJKNDkiLCAiSkFQQU40OSIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU41MCwgICAgIE1LSzEyX01LS0EsICAgICJKNTAiLCAiSkFQQU41MCIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU41MSwgICAgIE1LSzEyX0ZDQ0EsICAgICJKNTEiLCAiSkFQQU41MSIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU41MiwgICAgIE1LSzEyX01LS0ExLCAgICJKNTIiLCAiSkFQQU41MiIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU41MywgICAgIE1LSzEyX01LS0MsICAgICJKNTMiLCAiSkFQQU41MyIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSkFQQU41NCwgICAgIE1LSzEyX01LS0EyLCAgICJKNTQiLCAiSkFQQU41NCIsICAgICAgIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfSk9SREFOLCAgICAgIEVUU0kyX1dPUkxELCAgICJKTyIsICJKT1JEQU4iLCAgICAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfS0FaQUtIU1RBTiwgIE5VTEwxX1dPUkxELCAgICJLWiIsICJLQVpBS0hTVEFOIiwgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfS09SRUFfTk9SVEgsIEFQTDlfV09STEQsICAgICJLUCIsICJOT1JUSCBLT1JFQSIsICAgIFlFUywgTk8sICBOTywgIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfS09SRUFfUk9DLCAgIEFQTDlfV09STEQsICAgICJLUiIsICJLT1JFQSBSRVBVQkxJQyIsIFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfS09SRUFfUk9DMiwgIEFQTDJfQVBMRCwgICAgICJLMiIsICJLT1JFQSBSRVBVQkxJQzIiLFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfS09SRUFfUk9DMywgIEFQTDlfV09STEQsICAgICJLMyIsICJLT1JFQSBSRVBVQkxJQzMiLFlFUywgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfS1VXQUlULCAgICAgIE5VTEwxX1dPUkxELCAgICJLVyIsICJLVVdBSVQiLCAgICAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfTEFUVklBLCAgICAgIEVUU0kxX1dPUkxELCAgICJMViIsICJMQVRWSUEiLCAgICAgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfTEVCQU5PTiwgICAgIE5VTEwxX1dPUkxELCAgICJMQiIsICJMRUJBTk9OIiwgICAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfTElFQ0hURU5TVEVJTixFVFNJMV9XT1JMRCwgICJMSSIsICJMSUVDSFRFTlNURUlOIiwgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfTElUSFVBTklBLCAgIEVUU0kxX1dPUkxELCAgICJMVCIsICJMSVRIVUFOSUEiLCAgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfTFVYRU1CT1VSRywgIEVUU0kxX1dPUkxELCAgICJMVSIsICJMVVhFTUJPVVJHIiwgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfTUFDQVUsICAgICAgIEZDQzJfV09STEQsICAgICJNTyIsICJNQUNBVSIsICAgICAgICAgIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfTUFDRURPTklBLCAgIE5VTEwxX1dPUkxELCAgICJNSyIsICJNQUNFRE9OSUEiLCAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfTUFMQVlTSUEsICAgIEFQTDhfV09STEQsICAgICJNWSIsICJNQUxBWVNJQSIsICAgICAgIE5PLCAgTk8sICBOTywgIE5PLCAgTk8sICA3MDAwIH0sCisgICAge0NUUllfTUFMVEEsICAgICAgIEVUU0kxX1dPUkxELCAgICJNVCIsICJNQUxUQSIsICAgICAgICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfTUVYSUNPLCAgICAgIEZDQzFfRkNDQSwgICAgICJNWCIsICJNRVhJQ08iLCAgICAgICAgIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfTU9OQUNPLCAgICAgIEVUU0k0X1dPUkxELCAgICJNQyIsICJNT05BQ08iLCAgICAgICAgIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfTU9ST0NDTywgICAgIE5VTEwxX1dPUkxELCAgICJNQSIsICJNT1JPQ0NPIiwgICAgICAgIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfTkVUSEVSTEFORFMsIEVUU0kxX1dPUkxELCAgICJOTCIsICJORVRIRVJMQU5EUyIsICAgIFlFUywgTk8sICBZRVMsIFlFUywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfTkVUSEVSTEFORFNfQU5ULCBFVFNJMV9XT1JMRCwgIkFOIiwgIk5FVEhFUkxBTkRTLUFOVElMTEVTIiwgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9ORVdfWkVBTEFORCwgRkNDMl9FVFNJQywgICAgIk5aIiwgIk5FVyBaRUFMQU5EIiwgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9OT1JXQVksICAgICAgRVRTSTFfV09STEQsICAgIk5PIiwgIk5PUldBWSIsICAgICAgICAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9PTUFOLCAgICAgICAgQVBMNl9XT1JMRCwgICAgIk9NIiwgIk9NQU4iLCAgICAgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9QQUtJU1RBTiwgICAgTlVMTDFfV09STEQsICAgIlBLIiwgIlBBS0lTVEFOIiwgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9QQU5BTUEsICAgICAgRkNDMV9GQ0NBLCAgICAgIlBBIiwgIlBBTkFNQSIsICAgICAgICAgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9QRVJVLCAgICAgICAgQVBMMV9XT1JMRCwgICAgIlBFIiwgIlBFUlUiLCAgICAgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9QSElMSVBQSU5FUywgQVBMMV9XT1JMRCwgICAgIlBIIiwgIlBISUxJUFBJTkVTIiwgICAgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9QT0xBTkQsICAgICAgRVRTSTFfV09STEQsICAgIlBMIiwgIlBPTEFORCIsICAgICAgICAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9QT1JUVUdBTCwgICAgRVRTSTFfV09STEQsICAgIlBUIiwgIlBPUlRVR0FMIiwgICAgICAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9QVUVSVE9fUklDTywgRkNDMV9GQ0NBLCAgICAgIlBSIiwgIlBVRVJUTyBSSUNPIiwgICAgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9RQVRBUiwgICAgICAgTlVMTDFfV09STEQsICAgIlFBIiwgIlFBVEFSIiwgICAgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9ST01BTklBLCAgICAgTlVMTDFfV09STEQsICAgIlJPIiwgIlJPTUFOSUEiLCAgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9SVVNTSUEsICAgICAgTlVMTDFfV09STEQsICAgIlJVIiwgIlJVU1NJQSIsICAgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9TQVVESV9BUkFCSUEsTlVMTDFfV09STEQsICAgIlNBIiwgIlNBVURJIEFSQUJJQSIsICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9TRVJCSUFfTU9OVCwgRVRTSTFfV09STEQsICAgIkNTIiwgIlNFUkJJQSAmIE1PTlRFTkVHUk8iLCBZRVMsIE5PLCAgWUVTLCBZRVMsICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9TSU5HQVBPUkUsICAgQVBMNl9XT1JMRCwgICAgIlNHIiwgIlNJTkdBUE9SRSIsICAgICAgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9TTE9WQUtJQSwgICAgRVRTSTFfV09STEQsICAgIlNLIiwgIlNMT1ZBSyBSRVBVQkxJQyIsWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9TTE9WRU5JQSwgICAgRVRTSTFfV09STEQsICAgIlNJIiwgIlNMT1ZFTklBIiwgICAgICAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9TT1VUSF9BRlJJQ0EsRkNDM19XT1JMRCwgICAgIlpBIiwgIlNPVVRIIEFGUklDQSIsICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9TUEFJTiwgICAgICAgRVRTSTFfV09STEQsICAgIkVTIiwgIlNQQUlOIiwgICAgICAgICAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9TUklMQU5LQSwgICAgRkNDM19XT1JMRCwgICAgIkxLIiwgIlNSSSBMQU5LQSIsICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9TV0VERU4sICAgICAgRVRTSTFfV09STEQsICAgIlNFIiwgIlNXRURFTiIsICAgICAgICAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9TV0lUWkVSTEFORCwgRVRTSTFfV09STEQsICAgIkNIIiwgIlNXSVRaRVJMQU5EIiwgICAgWUVTLCBOTywgIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9TWVJJQSwgICAgICAgTlVMTDFfV09STEQsICAgIlNZIiwgIlNZUklBIiwgICAgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9UQUlXQU4sICAgICAgQVBMM19GQ0NBLCAgICAgIlRXIiwgIlRBSVdBTiIsICAgICAgICAgWUVTLCBZRVMsIFlFUywgWUVTLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9USEFJTEFORCwgICAgTlVMTDFfV09STEQsICAgIlRIIiwgIlRIQUlMQU5EIiwgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9UUklOSURBRF9ZX1RPQkFHTyxFVFNJNF9XT1JMRCwiVFQiLCAiVFJJTklEQUQgJiBUT0JBR08iLCBZRVMsIE5PLCBZRVMsIE5PLCBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9UVU5JU0lBLCAgICAgRVRTSTNfV09STEQsICAgIlROIiwgIlRVTklTSUEiLCAgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9UVVJLRVksICAgICAgRVRTSTNfV09STEQsICAgIlRSIiwgIlRVUktFWSIsICAgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9VS1JBSU5FLCAgICAgTlVMTDFfV09STEQsICAgIlVBIiwgIlVLUkFJTkUiLCAgICAgICAgWUVTLCBOTywgIFlFUywgTk8sICBZRVMsIDcwMDAgfSwKKyAgICB7Q1RSWV9VQUUsICAgICAgICAgTlVMTDFfV09STEQsICAgIkFFIiwgIlVOSVRFRCBBUkFCIEVNSVJBVEVTIiwgWUVTLCBOTywgWUVTLCBOTywgWUVTLCA3MDAwIH0sCisgICAge0NUUllfVU5JVEVEX0tJTkdET00sIEVUU0kxX1dPUkxELCJHQiIsICJVTklURUQgS0lOR0RPTSIsIFlFUywgTk8sICBZRVMsIE5PLCAgWUVTLCA3MDAwIH0sCisgICAge0NUUllfVU5JVEVEX1NUQVRFUywgRkNDM19GQ0NBLCAgICJVUyIsICJVTklURUQgU1RBVEVTIiwgIFlFUywgWUVTLCBZRVMsIFlFUywgWUVTLCA1ODI1IH0sCisgICAge0NUUllfVU5JVEVEX1NUQVRFU19GQ0M0OSwgRkNDNF9GQ0NBLCAgICJQUyIsICJVTklURUQgU1RBVEVTIChQVUJMSUMgU0FGRVRZKSIsICBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1VSVUdVQVksICAgICBGQ0MxX1dPUkxELCAgICAiVVkiLCAiVVJVR1VBWSIsICAgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1VaQkVLSVNUQU4sICBGQ0MzX0ZDQ0EsICAgICAiVVoiLCAiVVpCRUtJU1RBTiIsICAgICBZRVMsIFlFUywgWUVTLCBZRVMsIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1ZFTkVaVUVMQSwgICBBUEwyX0VUU0lDLCAgICAiVkUiLCAiVkVORVpVRUxBIiwgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1ZJRVRfTkFNLCAgICBOVUxMMV9XT1JMRCwgICAiVk4iLCAiVklFVCBOQU0iLCAgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1lFTUVOLCAgICAgICBOVUxMMV9XT1JMRCwgICAiWUUiLCAiWUVNRU4iLCAgICAgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9LAorICAgIHtDVFJZX1pJTUJBQldFLCAgICBOVUxMMV9XT1JMRCwgICAiWlciLCAiWklNQkFCV0UiLCAgICAgICBZRVMsIE5PLCAgWUVTLCBOTywgIFlFUywgNzAwMCB9Cit9OworCit0eXBlZGVmIHN0cnVjdCBSZWdEbW5GcmVxQmFuZCB7CisJdTE2X3QJbG93Q2hhbm5lbDsJLyogTG93IGNoYW5uZWwgY2VudGVyIGluIE1IeiAqLworCXUxNl90CWhpZ2hDaGFubmVsOwkvKiBIaWdoIENoYW5uZWwgY2VudGVyIGluIE1IeiAqLworCXU4X3QJcG93ZXJEZnM7CS8qIE1heCBwb3dlciAoZEJtKSBmb3IgY2hhbm5lbAorCQkJCQkgICByYW5nZSB3aGVuIHVzaW5nIERGUyAqLworCXU4X3QJYW50ZW5uYU1heDsJLyogTWF4IGFsbG93ZWQgYW50ZW5uYSBnYWluICovCisJdThfdAljaGFubmVsQlc7CS8qIEJhbmR3aWR0aCBvZiB0aGUgY2hhbm5lbCAqLworCXU4X3QJY2hhbm5lbFNlcDsJLyogQ2hhbm5lbCBzZXBhcmF0aW9uIHdpdGhpbgorCQkJCQkgICB0aGUgYmFuZCAqLworCXU2NF90CXVzZURmczsJCS8qIFVzZSBERlMgaW4gdGhlIFJlZ0RvbWFpbgorCQkJCQkgICBpZiBjb3JyZXNwb25kaW5nIGJpdCBpcyBzZXQgKi8KKwl1NjRfdAl1c2VQYXNzU2NhbjsJLyogVXNlIFBhc3NpdmUgU2NhbiBpbiB0aGUgUmVnRG9tYWluCisJCQkJCSAgIGlmIGNvcnJlc3BvbmRpbmcgYml0IGlzIHNldCAqLworCXU4X3QJcmVnQ2xhc3NJZDsJLyogUmVndWxhdG9yeSBjbGFzcyBpZCAqLworCXU4X3QJdXNlRXh0Q2hhbkRmczsJLyogUmVndWxhdG9yeSBjbGFzcyBpZCAqLworfSBSRUdfRE1OX0ZSRVFfQkFORDsKKworLyogQml0IG1hc2tzIGZvciBERlMgcGVyIHJlZ2RvbWFpbiAqLworCitlbnVtIHsKKwlOT19ERlMgICA9IDB4MDAwMDAwMDAwMDAwMDAwMFVMTCwKKwlERlNfRkNDMyA9IDB4MDAwMDAwMDAwMDAwMDAwMVVMTCwKKwlERlNfRVRTSSA9IDB4MDAwMDAwMDAwMDAwMDAwMlVMTCwKKwlERlNfTUtLNCA9IDB4MDAwMDAwMDAwMDAwMDAwNFVMTCwKK307CisKKy8qIFRoZSB0YWJsZSBvZiBmcmVxdWVuY3kgYmFuZHMgaXMgaW5kZXhlZCBieSBhIGJpdG1hc2suICBUaGUgb3JkZXJpbmcKKyAqIG11c3QgYmUgY29uc2lzdGVudCB3aXRoIHRoZSBlbnVtIGJlbG93LiAgV2hlbiBhZGRpbmcgYSBuZXcKKyAqIGZyZXF1ZW5jeSBiYW5kLCBiZSBzdXJlIHRvIG1hdGNoIHRoZSBsb2NhdGlvbiBpbiB0aGUgZW51bSB3aXRoIHRoZQorICogY29tbWVudHMKKyAqLworCisvKgorICogNUdIeiAxMUEgY2hhbm5lbCB0YWdzCisgKi8KKworZW51bSB7CisJRjFfNDkxNV80OTI1LAorCUYxXzQ5MzVfNDk0NSwKKwlGMV80OTIwXzQ5ODAsCisJRjFfNDk0Ml80OTg3LAorCUYxXzQ5NDVfNDk4NSwKKwlGMV80OTUwXzQ5ODAsCisJRjFfNTAzNV81MDQwLAorCUYxXzUwNDBfNTA4MCwKKwlGMV81MDU1XzUwNTUsCisKKwlGMV81MTIwXzUyNDAsCisKKwlGMV81MTcwXzUyMzAsCisJRjJfNTE3MF81MjMwLAorCisJRjFfNTE4MF81MjQwLAorCUYyXzUxODBfNTI0MCwKKwlGM181MTgwXzUyNDAsCisJRjRfNTE4MF81MjQwLAorCUY1XzUxODBfNTI0MCwKKwlGNl81MTgwXzUyNDAsCisJRjdfNTE4MF81MjQwLAorCisJRjFfNTE4MF81MzIwLAorCisJRjFfNTI0MF81MjgwLAorCisJRjFfNTI2MF81MjgwLAorCisJRjFfNTI2MF81MzIwLAorCUYyXzUyNjBfNTMyMCwKKwlGM181MjYwXzUzMjAsCisJRjRfNTI2MF81MzIwLAorCUY1XzUyNjBfNTMyMCwKKwlGNl81MjYwXzUzMjAsCisJRjdfNTI2MF81MzIwLAorCisJRjFfNTI2MF81NzAwLAorCisJRjFfNTI4MF81MzIwLAorCisgICAgRjFfNTUwMF81NTgwLAorCisJRjFfNTUwMF81NjIwLAorCisJRjFfNTUwMF81NzAwLAorCUYyXzU1MDBfNTcwMCwKKwlGM181NTAwXzU3MDAsCisJRjRfNTUwMF81NzAwLAorCisgICAgRjFfNTY2MF81NzAwLAorCisJRjFfNTc0NV81ODA1LAorCUYyXzU3NDVfNTgwNSwKKwlGM181NzQ1XzU4MDUsCisKKwlGMV81NzQ1XzU4MjUsCisJRjJfNTc0NV81ODI1LAorCUYzXzU3NDVfNTgyNSwKKwlGNF81NzQ1XzU4MjUsCisJRjVfNTc0NV81ODI1LAorCUY2XzU3NDVfNTgyNSwKKworCVcxXzQ5MjBfNDk4MCwKKwlXMV81MDQwXzUwODAsCisJVzFfNTE3MF81MjMwLAorCVcxXzUxODBfNTI0MCwKKwlXMV81MjYwXzUzMjAsCisJVzFfNTc0NV81ODI1LAorCVcxXzU1MDBfNTcwMCwKKwlXMl81MjYwXzUzMjAsCisgICAgICAgIFcyXzUxODBfNTI0MCwKKwlXMl81ODI1XzU4MjUsCit9OworCitzdGF0aWMgUkVHX0RNTl9GUkVRX0JBTkQgcmVnRG1uNUdoekZyZXFbXSA9IHsKKwl7IDQ5MTUsIDQ5MjUsIDIzLCAwLCAxMCwgNSwgTk9fREZTLCBQU0NBTl9NS0syLCAxNiwgMCB9LAkJLyogRjFfNDkxNV80OTI1ICovCisJeyA0OTM1LCA0OTQ1LCAyMywgMCwgMTAsIDUsIE5PX0RGUywgUFNDQU5fTUtLMiwgMTYsIDAgfSwJCS8qIEYxXzQ5MzVfNDk0NSAqLworCXsgNDkyMCwgNDk4MCwgMjMsIDAsIDIwLCAyMCwgTk9fREZTLCBQU0NBTl9NS0syLCA3LCAwIH0sCQkvKiBGMV80OTIwXzQ5ODAgKi8KKwl7IDQ5NDIsIDQ5ODcsIDI3LCA2LCA1LCAgNSwgREZTX0ZDQzMsIFBTQ0FOX0ZDQywgMCwgMCB9LAkJLyogRjFfNDk0Ml80OTg3ICovCisJeyA0OTQ1LCA0OTg1LCAzMCwgNiwgMTAsIDUsIERGU19GQ0MzLCBQU0NBTl9GQ0MsIDAsIDAgfSwJCS8qIEYxXzQ5NDVfNDk4NSAqLworCXsgNDk1MCwgNDk4MCwgMzMsIDYsIDIwLCA1LCBERlNfRkNDMywgUFNDQU5fRkNDLCAwLCAwIH0sCQkvKiBGMV80OTUwXzQ5ODAgKi8KKwl7IDUwMzUsIDUwNDAsIDIzLCAwLCAxMCwgNSwgTk9fREZTLCBQU0NBTl9NS0syLCAxMiwgMCB9LAkJLyogRjFfNTAzNV81MDQwICovCisJeyA1MDQwLCA1MDgwLCAyMywgMCwgMjAsIDIwLCBOT19ERlMsIFBTQ0FOX01LSzIsIDIsIDAgfSwJCS8qIEYxXzUwNDBfNTA4MCAqLworCXsgNTA1NSwgNTA1NSwgMjMsIDAsIDEwLCA1LCBOT19ERlMsIFBTQ0FOX01LSzIsIDEyLCAwIH0sCQkvKiBGMV81MDU1XzUwNTUgKi8KKworCXsgNTEyMCwgNTI0MCwgNSwgIDYsIDIwLCAyMCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMCB9LAkJCS8qIEYxXzUxMjBfNTI0MCAqLworCisJeyA1MTcwLCA1MjMwLCAyMywgMCwgMjAsIDIwLCBOT19ERlMsIFBTQ0FOX01LSzEgfCBQU0NBTl9NS0syLCAxLCAwIH0sCS8qIEYxXzUxNzBfNTIzMCAqLworCXsgNTE3MCwgNTIzMCwgMjAsIDAsIDIwLCAyMCwgTk9fREZTLCBQU0NBTl9NS0sxIHwgUFNDQU5fTUtLMiwgMSwgMCB9LAkvKiBGMl81MTcwXzUyMzAgKi8KKworCXsgNTE4MCwgNTI0MCwgMTUsIDAsIDIwLCAyMCwgTk9fREZTLCBQU0NBTl9GQ0MgfCBQU0NBTl9FVFNJLCAwLCAwIH0sCS8qIEYxXzUxODBfNTI0MCAqLworCXsgNTE4MCwgNTI0MCwgMTcsIDYsIDIwLCAyMCwgTk9fREZTLCBQU0NBTl9GQ0MsIDEsIDAgfSwJCQkJLyogRjJfNTE4MF81MjQwICovCisJeyA1MTgwLCA1MjQwLCAxOCwgMCwgMjAsIDIwLCBOT19ERlMsIFBTQ0FOX0ZDQyB8IFBTQ0FOX0VUU0ksIDAsIDAgfSwJLyogRjNfNTE4MF81MjQwICovCisJeyA1MTgwLCA1MjQwLCAyMCwgMCwgMjAsIDIwLCBOT19ERlMsIFBTQ0FOX0ZDQyB8IFBTQ0FOX0VUU0ksIDAsIDAgfSwJLyogRjRfNTE4MF81MjQwICovCisJeyA1MTgwLCA1MjQwLCAyMywgMCwgMjAsIDIwLCBOT19ERlMsIFBTQ0FOX0ZDQyB8IFBTQ0FOX0VUU0ksIDAsIDAgfSwJLyogRjVfNTE4MF81MjQwICovCisJeyA1MTgwLCA1MjQwLCAyMywgNiwgMjAsIDIwLCBOT19ERlMsIFBTQ0FOX0ZDQywgMCwgMCB9LAkJCQkvKiBGNl81MTgwXzUyNDAgKi8KKyAgeyA1MTgwLCA1MjQwLCAyMywgNiwgMjAsIDIwLCBOT19ERlMsIE5PX1BTQ0FOLCAwIH0sICAgICAgICAgICAvKiBGN181MTgwXzUyNDAgKi8KKworCXsgNTE4MCwgNTMyMCwgMjAsIDYsIDIwLCAyMCwgREZTX0VUU0ksIFBTQ0FOX0VUU0ksIDAsIDAgfSwJCQkvKiBGMV81MTgwXzUzMjAgKi8KKworCXsgNTI0MCwgNTI4MCwgMjMsIDAsIDIwLCAyMCwgREZTX0ZDQzMsIFBTQ0FOX0ZDQyB8IFBTQ0FOX0VUU0ksIDAsIDAgfSwJLyogRjFfNTI0MF81MjgwICovCisKKwl7IDUyNjAsIDUyODAsIDIzLCAwLCAyMCwgMjAsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX0ZDQyB8IFBTQ0FOX0VUU0ksIDAsIDAgfSwJLyogRjFfNTI2MF81MjgwICovCisKKwl7IDUyNjAsIDUzMjAsIDE4LCAwLCAyMCwgMjAsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX0ZDQyB8IFBTQ0FOX0VUU0ksIDAsIDAgfSwJLyogRjFfNTI2MF81MzIwICovCisKKwl7IDUyNjAsIDUzMjAsIDIwLCAwLCAyMCwgMjAsIERGU19GQ0MzIHwgREZTX0VUU0kgfCBERlNfTUtLNCwgUFNDQU5fRkNDIHwgUFNDQU5fRVRTSSB8IFBTQ0FOX01LSzMgLCAwLCAwIH0sCisJCQkJCQkJCQkJCS8qIEYyXzUyNjBfNTMyMCAqLworCisJeyA1MjYwLCA1MzIwLCAyMCwgNiwgMjAsIDIwLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9GQ0MsIDIsIDAgfSwJLyogRjNfNTI2MF81MzIwICovCisJeyA1MjYwLCA1MzIwLCAyMywgNiwgMjAsIDIwLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9GQ0MsIDIsIDAgfSwJLyogRjRfNTI2MF81MzIwICovCisJeyA1MjYwLCA1MzIwLCAyMywgNiwgMjAsIDIwLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9GQ0MsIDAsIDAgfSwJLyogRjVfNTI2MF81MzIwICovCisJeyA1MjYwLCA1MzIwLCAzMCwgMCwgMjAsIDIwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwIH0sCQkJCS8qIEY2XzUyNjBfNTMyMCAqLworCXsgNTI2MCwgNTMyMCwgMTcsIDYsIDIwLCAyMCwgREZTX0VUU0ksIFBTQ0FOX0VUU0ksIDAsIDAgfSwJCQkJLyogRjdfNTI2MF81MzIwICovCisKKwl7IDUyNjAsIDU3MDAsIDUsICA2LCAyMCwgMjAsIERGU19GQ0MzIHwgREZTX0VUU0ksIE5PX1BTQ0FOLCAwLCAwIH0sCQkvKiBGMV81MjYwXzU3MDAgKi8KKworCXsgNTI4MCwgNTMyMCwgMTcsIDYsIDIwLCAyMCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fRkNDLCAwLCAwIH0sCS8qIEYxXzUyODBfNTMyMCAqLworCisgICAgeyA1NTAwLCA1NTgwLCAyMywgNiwgMjAsIDIwLCBERlNfRkNDMywgUFNDQU5fRkNDLCAwfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGMV81NTAwXzU1ODAgKi8KKworCXsgNTUwMCwgNTYyMCwgMzAsIDYsIDIwLCAyMCwgREZTX0VUU0ksIFBTQ0FOX0VUU0ksIDAsIDAgfSwJCQkJLyogRjFfNTUwMF81NjIwICovCisKKwl7IDU1MDAsIDU3MDAsIDIwLCA2LCAyMCwgMjAsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX0ZDQywgNCwgMCB9LAkJLyogRjFfNTUwMF81NzAwICovCisJeyA1NTAwLCA1NzAwLCAyNywgMCwgMjAsIDIwLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9GQ0MgfCBQU0NBTl9FVFNJLCAwLCAwIH0sCS8qIEYyXzU1MDBfNTcwMCAqLworCXsgNTUwMCwgNTcwMCwgMzAsIDAsIDIwLCAyMCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fRkNDIHwgUFNDQU5fRVRTSSwgMCwgMCB9LAkvKiBGM181NTAwXzU3MDAgKi8KKwl7IDU1MDAsIDU3MDAsIDIwLCAwLCAyMCwgMjAsIERGU19GQ0MzIHwgREZTX0VUU0kgfCBERlNfTUtLNCwgUFNDQU5fTUtLMyB8IFBTQ0FOX0ZDQywgMCwgMCB9LAorCQkJCQkJCQkJCQkvKiBGNF81NTAwXzU3MDAgKi8KKworICAgIHsgNTY2MCwgNTcwMCwgMjMsIDYsIDIwLCAyMCwgREZTX0ZDQzMsIFBTQ0FOX0ZDQywgMH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRjFfNTY2MF81NzAwICovCisKKwl7IDU3NDUsIDU4MDUsIDIzLCAwLCAyMCwgMjAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDAgfSwJCQkJLyogRjFfNTc0NV81ODA1ICovCisJeyA1NzQ1LCA1ODA1LCAzMCwgNiwgMjAsIDIwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwIH0sCQkJCS8qIEYyXzU3NDVfNTgwNSAqLworCXsgNTc0NSwgNTgwNSwgMzAsIDYsIDIwLCAyMCwgREZTX0VUU0ksIFBTQ0FOX0VUU0ksIDAsIDAgfSwJCQkJLyogRjNfNTc0NV81ODA1ICovCisJeyA1NzQ1LCA1ODI1LCA1LCAgNiwgMjAsIDIwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwIH0sCQkJCS8qIEYxXzU3NDVfNTgyNSAqLworCXsgNTc0NSwgNTgyNSwgMTcsIDAsIDIwLCAyMCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMCB9LAkJCQkvKiBGMl81NzQ1XzU4MjUgKi8KKwl7IDU3NDUsIDU4MjUsIDIwLCAwLCAyMCwgMjAsIERGU19FVFNJLCBOT19QU0NBTiwgMCwgMCB9LAkJCQkvKiBGM181NzQ1XzU4MjUgKi8KKwl7IDU3NDUsIDU4MjUsIDMwLCAwLCAyMCwgMjAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDAgfSwJCQkJLyogRjRfNTc0NV81ODI1ICovCisJeyA1NzQ1LCA1ODI1LCAzMCwgNiwgMjAsIDIwLCBOT19ERlMsIE5PX1BTQ0FOLCAzLCAwIH0sCQkJLyogRjVfNTc0NV81ODI1ICovCisJeyA1NzQ1LCA1ODI1LCAzMCwgNiwgMjAsIDIwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwIH0sCQkJCS8qIEY2XzU3NDVfNTgyNSAqLworCisJLyoKKwkgKiBCZWxvdyBhcmUgdGhlIHdvcmxkIHJvYW1pbmcgY2hhbm5lbHMKKwkgKiBBbGwgV1dSIGRvbWFpbnMgaGF2ZSBubyBwb3dlciBsaW1pdCwgaW5zdGVhZCB1c2UgdGhlIGNhcmQncyBDVEwKKwkgKiBvciBtYXggcG93ZXIgc2V0dGluZ3MuCisJICovCisJeyA0OTIwLCA0OTgwLCAzMCwgMCwgMjAsIDIwLCBOT19ERlMsIFBTQ0FOX1dXUiwgMCwgMCB9LAkJCQkvKiBXMV80OTIwXzQ5ODAgKi8KKwl7IDUwNDAsIDUwODAsIDMwLCAwLCAyMCwgMjAsIE5PX0RGUywgUFNDQU5fV1dSLCAwIH0sCQkJCS8qIFcxXzUwNDBfNTA4MCAqLworCXsgNTE3MCwgNTIzMCwgMzAsIDAsIDIwLCAyMCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fV1dSLCAwLCAwIH0sCQkvKiBXMV81MTcwXzUyMzAgKi8KKwl7IDUxODAsIDUyNDAsIDMwLCAwLCAyMCwgMjAsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX1dXUiwgMCwgMCB9LAkJLyogVzFfNTE4MF81MjQwICovCisJeyA1MjYwLCA1MzIwLCAzMCwgMCwgMjAsIDIwLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9XV1IsIDAsIDAgfSwJCS8qIFcxXzUyNjBfNTMyMCAqLworCXsgNTc0NSwgNTgyNSwgMzAsIDAsIDIwLCAyMCwgTk9fREZTLCBQU0NBTl9XV1IsIDAsIDAgfSwJCQkJLyogVzFfNTc0NV81ODI1ICovCisJeyA1NTAwLCA1NzAwLCAzMCwgMCwgMjAsIDIwLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9XV1IsIDAsIDAgfSwJCS8qIFcxXzU1MDBfNTcwMCAqLworCXsgNTI2MCwgNTMyMCwgMzAsIDAsIDIwLCAyMCwgTk9fREZTLCBOT19QU0NBTiwgIDAsIDAgfSwJCQkJLyogVzJfNTI2MF81MzIwICovCisJeyA1MTgwLCA1MjQwLCAzMCwgMCwgMjAsIDIwLCBOT19ERlMsIE5PX1BTQ0FOLCAgMCwgMCB9LAkJCQkvKiBXMl81MTgwXzUyNDAgKi8KKwl7IDU4MjUsIDU4MjUsIDMwLCAwLCAyMCwgMjAsIE5PX0RGUywgUFNDQU5fV1dSLCAwLCAwIH0sCQkJCS8qIFcyXzU4MjVfNTgyNSAqLworfTsKKy8qCisgKiA1R0h6IFR1cmJvIChkeW5hbWljICYgc3RhdGljKSB0YWdzCisgKi8KKworZW51bSB7CisJVDFfNTEzMF81MjEwLAorCVQxXzUyNTBfNTMzMCwKKwlUMV81MzcwXzU0OTAsCisJVDFfNTUzMF81NjUwLAorCisJVDFfNTE1MF81MTkwLAorCVQxXzUyMzBfNTMxMCwKKwlUMV81MzUwXzU0NzAsCisJVDFfNTUxMF81NjcwLAorCisJVDFfNTIwMF81MjQwLAorCVQyXzUyMDBfNTI0MCwKKwlUMV81MjEwXzUyMTAsCisJVDJfNTIxMF81MjEwLAorCisJVDFfNTI4MF81MjgwLAorCVQyXzUyODBfNTI4MCwKKwlUMV81MjUwXzUyNTAsCisJVDFfNTI5MF81MjkwLAorCVQxXzUyNTBfNTI5MCwKKwlUMl81MjUwXzUyOTAsCisKKwlUMV81NTQwXzU2NjAsCisJVDFfNTc2MF81ODAwLAorCVQyXzU3NjBfNTgwMCwKKworCVQxXzU3NjVfNTgwNSwKKworCVdUMV81MjEwXzUyNTAsCisJV1QxXzUyOTBfNTI5MCwKKwlXVDFfNTU0MF81NjYwLAorCVdUMV81NzYwXzU4MDAsCit9OworCitzdGF0aWMgUkVHX0RNTl9GUkVRX0JBTkQgcmVnRG1uNUdoelR1cmJvRnJlcVtdID0geworCXsgNTEzMCwgNTIxMCwgNSwgIDYsIDQwLCA0MCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIFQxXzUxMzBfNTIxMCAqLworCXsgNTI1MCwgNTMzMCwgNSwgIDYsIDQwLCA0MCwgREZTX0ZDQzMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogVDFfNTI1MF81MzMwICovCisJeyA1MzcwLCA1NDkwLCA1LCAgNiwgNDAsIDQwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogVDFfNTM3MF81NDkwICovCisJeyA1NTMwLCA1NjUwLCA1LCAgNiwgNDAsIDQwLCBERlNfRkNDMywgTk9fUFNDQU4sIDAsIDB9LAkvKiBUMV81NTMwXzU2NTAgKi8KKworCXsgNTE1MCwgNTE5MCwgNSwgIDYsIDQwLCA0MCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIFQxXzUxNTBfNTE5MCAqLworCXsgNTIzMCwgNTMxMCwgNSwgIDYsIDQwLCA0MCwgREZTX0ZDQzMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogVDFfNTIzMF81MzEwICovCisJeyA1MzUwLCA1NDcwLCA1LCAgNiwgNDAsIDQwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogVDFfNTM1MF81NDcwICovCisJeyA1NTEwLCA1NjcwLCA1LCAgNiwgNDAsIDQwLCBERlNfRkNDMywgTk9fUFNDQU4sIDAsIDB9LAkvKiBUMV81NTEwXzU2NzAgKi8KKworCXsgNTIwMCwgNTI0MCwgMTcsIDYsIDQwLCA0MCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIFQxXzUyMDBfNTI0MCAqLworCXsgNTIwMCwgNTI0MCwgMjMsIDYsIDQwLCA0MCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIFQyXzUyMDBfNTI0MCAqLworCXsgNTIxMCwgNTIxMCwgMTcsIDYsIDQwLCA0MCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIFQxXzUyMTBfNTIxMCAqLworCXsgNTIxMCwgNTIxMCwgMjMsIDAsIDQwLCA0MCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIFQyXzUyMTBfNTIxMCAqLworCisJeyA1MjgwLCA1MjgwLCAyMywgNiwgNDAsIDQwLCBERlNfRkNDMywgUFNDQU5fRkNDX1QsIDAsIDB9LAkvKiBUMV81MjgwXzUyODAgKi8KKwl7IDUyODAsIDUyODAsIDIwLCA2LCA0MCwgNDAsIERGU19GQ0MzLCBQU0NBTl9GQ0NfVCwgMCwgMH0sCS8qIFQyXzUyODBfNTI4MCAqLworCXsgNTI1MCwgNTI1MCwgMTcsIDAsIDQwLCA0MCwgREZTX0ZDQzMsIFBTQ0FOX0ZDQ19ULCAwLCAwfSwJLyogVDFfNTI1MF81MjUwICovCisJeyA1MjkwLCA1MjkwLCAyMCwgMCwgNDAsIDQwLCBERlNfRkNDMywgUFNDQU5fRkNDX1QsIDAsIDB9LAkvKiBUMV81MjkwXzUyOTAgKi8KKwl7IDUyNTAsIDUyOTAsIDIwLCAwLCA0MCwgNDAsIERGU19GQ0MzLCBQU0NBTl9GQ0NfVCwgMCwgMH0sCS8qIFQxXzUyNTBfNTI5MCAqLworCXsgNTI1MCwgNTI5MCwgMjMsIDYsIDQwLCA0MCwgREZTX0ZDQzMsIFBTQ0FOX0ZDQ19ULCAwLCAwfSwJLyogVDJfNTI1MF81MjkwICovCisKKwl7IDU1NDAsIDU2NjAsIDIwLCA2LCA0MCwgNDAsIERGU19GQ0MzLCBQU0NBTl9GQ0NfVCwgMCwgMH0sCS8qIFQxXzU1NDBfNTY2MCAqLworCXsgNTc2MCwgNTgwMCwgMjAsIDAsIDQwLCA0MCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIFQxXzU3NjBfNTgwMCAqLworCXsgNTc2MCwgNTgwMCwgMzAsIDYsIDQwLCA0MCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIFQyXzU3NjBfNTgwMCAqLworCisJeyA1NzY1LCA1ODA1LCAzMCwgNiwgNDAsIDQwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogVDFfNTc2NV81ODA1ICovCisKKwkvKgorCSAqIEJlbG93IGFyZSB0aGUgV1dSIGZyZXF1ZW5jaWVzCisJICovCisKKwl7IDUyMTAsIDUyNTAsIDE1LCAwLCA0MCwgNDAsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX1dXUiwgMCwgMH0sIC8qIFdUMV81MjEwXzUyNTAgKi8KKwl7IDUyOTAsIDUyOTAsIDE4LCAwLCA0MCwgNDAsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX1dXUiwgMCwgMH0sIC8qIFdUMV81MjkwXzUyOTAgKi8KKwl7IDU1NDAsIDU2NjAsIDIwLCAwLCA0MCwgNDAsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX1dXUiwgMCwgMH0sIC8qIFdUMV81NTQwXzU2NjAgKi8KKwl7IDU3NjAsIDU4MDAsIDIwLCAwLCA0MCwgNDAsIE5PX0RGUywgUFNDQU5fV1dSLCAwLCAwfSwJLyogV1QxXzU3NjBfNTgwMCAqLworfTsKKworLyoKKyAqIDJHSHogMTFiIGNoYW5uZWwgdGFncworICovCitlbnVtIHsKKwlGMV8yMzEyXzIzNzIsCisJRjJfMjMxMl8yMzcyLAorCisJRjFfMjQxMl8yNDcyLAorCUYyXzI0MTJfMjQ3MiwKKwlGM18yNDEyXzI0NzIsCisKKwlGMV8yNDEyXzI0NjIsCisJRjJfMjQxMl8yNDYyLAorCisJRjFfMjQzMl8yNDQyLAorCisJRjFfMjQ1N18yNDcyLAorCisJRjFfMjQ2N18yNDcyLAorCisJRjFfMjQ4NF8yNDg0LAorCUYyXzI0ODRfMjQ4NCwKKworCUYxXzI1MTJfMjczMiwKKworCVcxXzIzMTJfMjM3MiwKKwlXMV8yNDEyXzI0MTIsCisJVzFfMjQxN18yNDMyLAorCVcxXzI0MzdfMjQ0MiwKKwlXMV8yNDQ3XzI0NTcsCisJVzFfMjQ2Ml8yNDYyLAorCVcxXzI0NjdfMjQ2NywKKwlXMl8yNDY3XzI0NjcsCisJVzFfMjQ3Ml8yNDcyLAorCVcyXzI0NzJfMjQ3MiwKKwlXMV8yNDg0XzI0ODQsCisJVzJfMjQ4NF8yNDg0LAorfTsKKworc3RhdGljIFJFR19ETU5fRlJFUV9CQU5EIHJlZ0RtbjJHaHpGcmVxW10gPSB7CisJeyAyMzEyLCAyMzcyLCA1LCAgNiwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBGMV8yMzEyXzIzNzIgKi8KKwl7IDIzMTIsIDIzNzIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIEYyXzIzMTJfMjM3MiAqLworCisJeyAyNDEyLCAyNDcyLCA1LCAgNiwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBGMV8yNDEyXzI0NzIgKi8KKwl7IDI0MTIsIDI0NzIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBQU0NBTl9NS0tBLCAwLCAwfSwJLyogRjJfMjQxMl8yNDcyICovCisJeyAyNDEyLCAyNDcyLCAzMCwgMCwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBGM18yNDEyXzI0NzIgKi8KKworCXsgMjQxMiwgMjQ2MiwgMjcsIDYsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogRjFfMjQxMl8yNDYyICovCisJeyAyNDEyLCAyNDYyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgUFNDQU5fTUtLQSwgMCwgMH0sCS8qIEYyXzI0MTJfMjQ2MiAqLworCXsgMjQzMiwgMjQ0MiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogRjFfMjQzMl8yNDQyICovCisKKwl7IDI0NTcsIDI0NzIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIEYxXzI0NTdfMjQ3MiAqLworCisJeyAyNDY3LCAyNDcyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgUFNDQU5fTUtLQTIgfCBQU0NBTl9NS0tBLCAwLCAwfSwgLyogRjFfMjQ2N18yNDcyICovCisKKwl7IDI0ODQsIDI0ODQsIDUsICA2LCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIEYxXzI0ODRfMjQ4NCAqLworCXsgMjQ4NCwgMjQ4NCwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIFBTQ0FOX01LS0EgfCBQU0NBTl9NS0tBMSB8IFBTQ0FOX01LS0EyLCAwLCAwfSwJLyogRjJfMjQ4NF8yNDg0ICovCisKKwl7IDI1MTIsIDI3MzIsIDUsICA2LCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIEYxXzI1MTJfMjczMiAqLworCisJLyoKKwkgKiBXV1IgaGF2ZSBwb3dlcnMgb3BlbmVkIHVwIHRvIDIwZEJtLiAgTGltaXRzIHNob3VsZCBvZnRlbiBjb21lIGZyb20gQ1RML01heCBwb3dlcnMKKwkgKi8KKworCXsgMjMxMiwgMjM3MiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogVzFfMjMxMl8yMzcyICovCisJeyAyNDEyLCAyNDEyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBXMV8yNDEyXzI0MTIgKi8KKwl7IDI0MTcsIDI0MzIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIFcxXzI0MTdfMjQzMiAqLworCXsgMjQzNywgMjQ0MiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogVzFfMjQzN18yNDQyICovCisJeyAyNDQ3LCAyNDU3LCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBXMV8yNDQ3XzI0NTcgKi8KKwl7IDI0NjIsIDI0NjIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIFcxXzI0NjJfMjQ2MiAqLworCXsgMjQ2NywgMjQ2NywgMjAsIDAsIDIwLCA1LCBOT19ERlMsIFBTQ0FOX1dXUiB8IElTX0VDTV9DSEFOLCAwLCAwfSwgLyogVzFfMjQ2N18yNDY3ICovCisJeyAyNDY3LCAyNDY3LCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4gfCBJU19FQ01fQ0hBTiwgMCwgMH0sCS8qIFcyXzI0NjdfMjQ2NyAqLworCXsgMjQ3MiwgMjQ3MiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIFBTQ0FOX1dXUiB8IElTX0VDTV9DSEFOLCAwLCAwfSwgLyogVzFfMjQ3Ml8yNDcyICovCisJeyAyNDcyLCAyNDcyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4gfCBJU19FQ01fQ0hBTiwgMCwgMH0sCS8qIFcyXzI0NzJfMjQ3MiAqLworCXsgMjQ4NCwgMjQ4NCwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIFBTQ0FOX1dXUiB8IElTX0VDTV9DSEFOLCAwLCAwfSwgLyogVzFfMjQ4NF8yNDg0ICovCisJeyAyNDg0LCAyNDg0LCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4gfCBJU19FQ01fQ0hBTiwgMCwgMH0sCS8qIFcyXzI0ODRfMjQ4NCAqLworfTsKKworCisvKgorICogMkdIeiAxMWcgY2hhbm5lbCB0YWdzCisgKi8KKworZW51bSB7CisJRzFfMjMxMl8yMzcyLAorCUcyXzIzMTJfMjM3MiwKKworCUcxXzI0MTJfMjQ3MiwKKwlHMl8yNDEyXzI0NzIsCisJRzNfMjQxMl8yNDcyLAorCisJRzFfMjQxMl8yNDYyLAorCUcyXzI0MTJfMjQ2MiwKKworCUcxXzI0MzJfMjQ0MiwKKworCUcxXzI0NTdfMjQ3MiwKKworCUcxXzI1MTJfMjczMiwKKworCUcxXzI0NjdfMjQ3MiAsCisKKwlXRzFfMjMxMl8yMzcyLAorCVdHMV8yNDEyXzI0MTIsCisJV0cxXzI0MTdfMjQzMiwKKwlXRzFfMjQzN18yNDQyLAorCVdHMV8yNDQ3XzI0NTcsCisJV0cxXzI0NjJfMjQ2MiwKKwlXRzFfMjQ2N18yNDY3LAorCVdHMl8yNDY3XzI0NjcsCisJV0cxXzI0NzJfMjQ3MiwKKwlXRzJfMjQ3Ml8yNDcyLAorCit9Oworc3RhdGljIFJFR19ETU5fRlJFUV9CQU5EIHJlZ0RtbjJHaHoxMWdGcmVxW10gPSB7CisJeyAyMzEyLCAyMzcyLCA1LCAgNiwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBHMV8yMzEyXzIzNzIgKi8KKwl7IDIzMTIsIDIzNzIsIDIwLCAwLCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIEcyXzIzMTJfMjM3MiAqLworCisJeyAyNDEyLCAyNDcyLCA1LCAgNiwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBHMV8yNDEyXzI0NzIgKi8KKwl7IDI0MTIsIDI0NzIsIDIwLCAwLCAyMCwgNSwgIE5PX0RGUywgUFNDQU5fTUtLQV9HLCAwLCAwfSwJLyogRzJfMjQxMl8yNDcyICovCisJeyAyNDEyLCAyNDcyLCAzMCwgMCwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBHM18yNDEyXzI0NzIgKi8KKworCXsgMjQxMiwgMjQ2MiwgMjcsIDYsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogRzFfMjQxMl8yNDYyICovCisJeyAyNDEyLCAyNDYyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgUFNDQU5fTUtLQV9HLCAwLCAwfSwJLyogRzJfMjQxMl8yNDYyICovCisJeyAyNDMyLCAyNDQyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBHMV8yNDMyXzI0NDIgKi8KKworCXsgMjQ1NywgMjQ3MiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogRzFfMjQ1N18yNDcyICovCisKKwl7IDI1MTIsIDI3MzIsIDUsICA2LCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIEcxXzI1MTJfMjczMiAqLworCisJeyAyNDY3LCAyNDcyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgUFNDQU5fTUtLQTIgfCBQU0NBTl9NS0tBLCAwLCAwIH0sIC8qIEcxXzI0NjdfMjQ3MiAqLworCisJLyoKKwkgKiBXV1Igb3BlbiB1cCB0aGUgcG93ZXIgdG8gMjBkQm0KKwkgKi8KKworCXsgMjMxMiwgMjM3MiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogV0cxXzIzMTJfMjM3MiAqLworCXsgMjQxMiwgMjQxMiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogV0cxXzI0MTJfMjQxMiAqLworCXsgMjQxNywgMjQzMiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogV0cxXzI0MTdfMjQzMiAqLworCXsgMjQzNywgMjQ0MiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogV0cxXzI0MzdfMjQ0MiAqLworCXsgMjQ0NywgMjQ1NywgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogV0cxXzI0NDdfMjQ1NyAqLworCXsgMjQ2MiwgMjQ2MiwgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJLyogV0cxXzI0NjJfMjQ2MiAqLworCXsgMjQ2NywgMjQ2NywgMjAsIDAsIDIwLCA1LCBOT19ERlMsIFBTQ0FOX1dXUiB8IElTX0VDTV9DSEFOLCAwLCAwfSwgLyogV0cxXzI0NjdfMjQ2NyAqLworCXsgMjQ2NywgMjQ2NywgMjAsIDAsIDIwLCA1LCBOT19ERlMsIE5PX1BTQ0FOIHwgSVNfRUNNX0NIQU4sIDAsIDB9LAkvKiBXRzJfMjQ2N18yNDY3ICovCisJeyAyNDcyLCAyNDcyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgUFNDQU5fV1dSIHwgSVNfRUNNX0NIQU4sIDAsIDB9LCAvKiBXRzFfMjQ3Ml8yNDcyICovCisJeyAyNDcyLCAyNDcyLCAyMCwgMCwgMjAsIDUsIE5PX0RGUywgTk9fUFNDQU4gfCBJU19FQ01fQ0hBTiwgMCwgMH0sCS8qIFdHMl8yNDcyXzI0NzIgKi8KK307CisvKgorICogMkdIeiBEeW5hbWljIHR1cmJvIHRhZ3MKKyAqLworCitlbnVtIHsKKwlUMV8yMzEyXzIzNzIsCisJVDFfMjQzN18yNDM3LAorCVQyXzI0MzdfMjQzNywKKwlUM18yNDM3XzI0MzcsCisJVDFfMjUxMl8yNzMyCit9OworCitzdGF0aWMgUkVHX0RNTl9GUkVRX0JBTkQgcmVnRG1uMkdoejExZ1R1cmJvRnJlcVtdID0geworCXsgMjMxMiwgMjM3MiwgNSwgIDYsIDQwLCA0MCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sICAvKiBUMV8yMzEyXzIzNzIgKi8KKwl7IDI0MzcsIDI0MzcsIDUsICA2LCA0MCwgNDAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LCAgLyogVDFfMjQzN18yNDM3ICovCisJeyAyNDM3LCAyNDM3LCAyMCwgNiwgNDAsIDQwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwgIC8qIFQyXzI0MzdfMjQzNyAqLworCXsgMjQzNywgMjQzNywgMTgsIDYsIDQwLCA0MCwgTk9fREZTLCBQU0NBTl9XV1IsIDAsIDB9LCAvKiBUM18yNDM3XzI0MzcgKi8KKwl7IDI1MTIsIDI3MzIsIDUsICA2LCA0MCwgNDAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LCAgLyogVDFfMjUxMl8yNzMyICovCit9OworCisKKworLyoKKyAqIDJHSHogMTFuIGZyZXF1ZW5jeSB0YWdzCisgKi8KK2VudW0geworICAgIE5HMV8yNDIyXzI0NTIsCisgICAgTkcyXzI0MjJfMjQ1MiwKKyAgICBORzNfMjQyMl8yNDUyLAorCisgICAgTkdfREVNT19BTExfQ0hBTk5FTFMsCit9OworCitzdGF0aWMgUkVHX0RNTl9GUkVRX0JBTkQgcmVnRG1uMkdoejExbmdGcmVxW10gPSB7CisgICAgeyAyNDIyLCAyNDUyLCAyMCwgMCwgNDAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LCAgICAvKiBORzFfMjQyMl8yNDUyICovCisgICAgeyAyNDIyLCAyNDUyLCAyNywgMCwgNDAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LCAgICAvKiBORzJfMjQyMl8yNDUyICovCisgICAgeyAyNDIyLCAyNDUyLCAzMCwgMCwgNDAsIDUsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LCAgICAvKiBORzNfMjQyMl8yNDUyICovCisKKwl7IDIzMTIsIDI3MzIsIDI3LCA2LCAyMCwgNSwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sICAgIC8qIE5HX0RFTU9fQUxMX0NIQU5ORUxTICovCit9OworCisKKy8qCisgKiA1R0h6IDExbiBmcmVxdWVuY3kgdGFncworICovCitlbnVtIHsKKyAgICBOQTFfNTE5MF81MjMwLAorICAgIE5BMl81MTkwXzUyMzAsCisgICAgTkEzXzUxOTBfNTIzMCwKKyAgICBOQTRfNTE5MF81MjMwLAorICAgIE5BNV81MTkwXzUyMzAsCisKKyAgICBOQTFfNTI3MF81MjcwLAorCisgICAgTkExXzUyNzBfNTMxMCwKKyAgICBOQTJfNTI3MF81MzEwLAorICAgIE5BM181MjcwXzUzMTAsCisgICAgTkE0XzUyNzBfNTMxMCwKKworICAgIE5BMV81MzEwXzUzMTAsCisKKyAgICBOQTFfNTUxMF81NjMwLAorCisgICAgTkExXzU1MTBfNTY3MCwKKyAgICBOQTJfNTUxMF81NjcwLAorICAgIE5BM181NTEwXzU2NzAsCisKKyAgICBOQTFfNTc1NV81Nzk1LAorICAgIE5BMl81NzU1XzU3OTUsCisgICAgTkEzXzU3NTVfNTc5NSwKKyAgICBOQTRfNTc1NV81Nzk1LAorICAgIE5BNV81NzU1XzU3OTUsCisKKyAgICBOQTFfNTc5NV81Nzk1LAorCisgICAgTkFfREVNT19BTExfQ0hBTk5FTFMsCit9OworCitzdGF0aWMgUkVHX0RNTl9GUkVRX0JBTkQgcmVnRG1uNUdoejExbmFGcmVxW10gPSB7CisgICAgLyoKKyAgICAgKiBUb0RvOiBUaGlzIHRhYmxlIG5lZWRzIHRvIGJlIGNvbXBsZXRlbHkgcG9wdWxhdGVkIHdpdGggNUdIeiAxMW4gcHJvcGVydGllcworICAgICAqLworCXsgNTE5MCwgNTIzMCwgMTUsICAwLCA0MCwgNDAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkgICAgLyogTkExXzUxOTBfNTIzMCAqLworCXsgNTE5MCwgNTIzMCwgMTcsICA2LCA0MCwgNDAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBOQTJfNTE5MF81MjMwICovCisJeyA1MTkwLCA1MjMwLCAxOCwgIDYsIDQwLCA0MCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCSAgICAvKiBOQTNfNTE5MF81MjMwICovCisJeyA1MTkwLCA1MjMwLCAyMCwgIDAsIDQwLCA0MCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCS8qIE5BNF81MTkwXzUyMzAgKi8KKwl7IDUxOTAsIDUyMzAsIDIzLCAgNiwgNDAsIDQwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJICAgIC8qIE5BNV81MTkwXzUyMzAgKi8KKworCXsgNTI3MCwgNTI3MCwgMjMsICA2LCA0MCwgNDAsIERGU19GQ0MzfERGU19FVFNJLCBOT19QU0NBTiwgMCwgMX0sICAvKiBOQTFfNTI3MF81MjcwICovCisKKwl7IDUyNzAsIDUzMTAsIDE4LCAgNiwgNDAsIDQwLCBERlNfRkNDM3xERlNfRVRTSSwgTk9fUFNDQU4sIDAsIDF9LCAgLyogTkExXzUyNzBfNTMxMCAqLworCXsgNTI3MCwgNTMxMCwgMjAsICAwLCA0MCwgNDAsIERGU19GQ0MzfERGU19FVFNJfERGU19NS0s0LCBOT19QU0NBTiwgMCwgMX0sICAvKiBOQTJfNTI3MF81MzEwICovCisJeyA1MjcwLCA1MzEwLCAyMywgIDYsIDQwLCA0MCwgREZTX0ZDQzN8REZTX0VUU0ksIE5PX1BTQ0FOLCAwLCAxfSwgIC8qIE5BM181MjcwXzUzMTAgKi8KKwl7IDUyNzAsIDUzMTAsIDMwLCAgNiwgNDAsIDQwLCBERlNfRkNDM3xERlNfRVRTSSwgTk9fUFNDQU4sIDAsIDF9LCAgLyogTkE0XzUyNzBfNTMxMCAqLworCisJeyA1MzEwLCA1MzEwLCAxNywgIDYsIDQwLCA0MCwgREZTX0ZDQzN8REZTX0VUU0ksIE5PX1BTQ0FOLCAwLCAxfSwgIC8qIE5BMV81MzEwXzUzMTAgKi8KKworCXsgNTUxMCwgNTYzMCwgMzAsICA2LCA0MCwgNDAsIERGU19GQ0MzfERGU19FVFNJLCBOT19QU0NBTiwgMCwgMX0sICAvKiBOQTFfNTUxMF81NjMwICovCisKKwl7IDU1MTAsIDU2NzAsIDIwLCAgNiwgNDAsIDQwLCBERlNfRkNDM3xERlNfRVRTSXxERlNfTUtLNCwgTk9fUFNDQU4sIDAsIDF9LCAgLyogTkExXzU1MTBfNTY3MCAqLworCXsgNTUxMCwgNTY3MCwgMjcsICAwLCA0MCwgNDAsIERGU19GQ0MzfERGU19FVFNJLCBOT19QU0NBTiwgMCwgMX0sICAvKiBOQTJfNTUxMF81NjcwICovCisJeyA1NTEwLCA1NjcwLCAzMCwgIDYsIDQwLCA0MCwgREZTX0ZDQzMsIE5PX1BTQ0FOLCAwLCAxfSwgICAvKiBOQTNfNTUxMF81NjcwICovCisKKwl7IDU3NTUsIDU3OTUsIDE3LCAgMCwgNDAsIDQwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJICAgIC8qIE5BMV81NzU1XzU3OTUgKi8KKwl7IDU3NTUsIDU3OTUsIDIwLCAgNiwgNDAsIDQwLCBERlNfRVRTSSwgTk9fUFNDQU4sIDAsIDB9LAkgICAgLyogTkEyXzU3NTVfNTc5NSAqLworCXsgNTc1NSwgNTc5NSwgMjMsICAwLCA0MCwgNDAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkgICAgLyogTkEzXzU3NTVfNTc5NSAqLworCXsgNTc1NSwgNTc5NSwgMzAsICAwLCA0MCwgNDAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBOQTRfNTc1NV81Nzk1ICovCisJeyA1NzU1LCA1Nzk1LCAzMCwgIDYsIDQwLCA0MCwgTk9fREZTLCBOT19QU0NBTiwgMCwgMH0sCSAgICAvKiBOQTVfNTc1NV81Nzk1ICovCisKKwl7IDU3OTUsIDU3OTUsIDMwLCAgNiwgNDAsIDQwLCBOT19ERlMsIE5PX1BTQ0FOLCAwLCAwfSwJICAgIC8qIE5BMV81Nzk1XzU3OTUgKi8KKworICAgIHsgNDkyMCwgNjEwMCwgMzAsICA2LCA0MCwgNDAsIE5PX0RGUywgTk9fUFNDQU4sIDAsIDB9LAkvKiBOQV9ERU1PX0FMTF9DSEFOTkVMUyAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QgcmVnRG9tYWluIHsKKwl1MTZfdCByZWdEbW5FbnVtOwkvKiB2YWx1ZSBmcm9tIEVudW1SZCB0YWJsZSAqLworCXU4X3QgY29uZm9ybWFuY2VUZXN0TGltaXQ7CisJdTY0X3QgZGZzTWFzazsJLyogREZTIGJpdG1hc2sgZm9yIDVHaHogdGFibGVzICovCisJdTY0X3QgcHNjYW47CS8qIEJpdG1hc2sgZm9yIHBhc3NpdmUgc2NhbiAqLworCXUzMl90IGZsYWdzOwkvKiBSZXF1aXJlbWVudCBmbGFncyAoQWRIb2MgZGlzYWxsb3csIG5vaXNlCisJCQkJICAgZmxvb3IgY2FsIG5lZWRlZCwgZXRjKSAqLworCXU2NF90IGNoYW4xMWFbQk1MRU5dOy8qIDEyOCBiaXQgYml0bWFzayBmb3IgY2hhbm5lbC9iYW5kCisJCQkJICAgc2VsZWN0aW9uICovCisJdTY0X3QgY2hhbjExYV90dXJib1tCTUxFTl07LyogMTI4IGJpdCBiaXRtYXNrIGZvciBjaGFubmVsL2JhbmQKKwkJCQkgICBzZWxlY3Rpb24gKi8KKwl1NjRfdCBjaGFuMTFhX2R5bl90dXJib1tCTUxFTl07IC8qIDEyOCBiaXQgYml0bWFzayBmb3IgY2hhbm5lbC9iYW5kCisJCQkJCSAgICAgICBzZWxlY3Rpb24gKi8KKwl1NjRfdCBjaGFuMTFiW0JNTEVOXTsvKiAxMjggYml0IGJpdG1hc2sgZm9yIGNoYW5uZWwvYmFuZAorCQkJCSAgIHNlbGVjdGlvbiAqLworCXU2NF90IGNoYW4xMWdbQk1MRU5dOy8qIDEyOCBiaXQgYml0bWFzayBmb3IgY2hhbm5lbC9iYW5kCisJCQkJICAgc2VsZWN0aW9uICovCisJdTY0X3QgY2hhbjExZ190dXJib1tCTUxFTl07LyogMTI4IGJpdCBiaXRtYXNrIGZvciBjaGFubmVsL2JhbmQKKwkJCQkJICBzZWxlY3Rpb24gKi8KKwl1NjRfdCBjaGFuMTFuZ1tCTUxFTl07LyogMTI4IGJpdCBiaXRtYXNrIGZvciAxMW4gaW4gMkdIeiAqLworCXU2NF90IGNoYW4xMW5hW0JNTEVOXTsvKiAxMjggYml0IGJpdG1hc2sgZm9yIDExbiBpbiA1R0h6ICovCit9IFJFR19ET01BSU47CisKK3N0YXRpYyBSRUdfRE9NQUlOIHJlZ0RvbWFpbnNbXSA9IHsKKworCXtERUJVR19SRUdfRE1OLCBGQ0MsIE5PX0RGUywgTk9fUFNDQU4sIE5PX1JFUSwKKwkgQk0oRjFfNTEyMF81MjQwLCBGMV81MjYwXzU3MDAsIEYxXzU3NDVfNTgyNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQxXzUxMzBfNTIxMCwgVDFfNTI1MF81MzMwLCBUMV81MzcwXzU0OTAsIFQxXzU1MzBfNTY1MCwgVDFfNTE1MF81MTkwLCBUMV81MjMwXzUzMTAsIFQxXzUzNTBfNTQ3MCwgVDFfNTUxMF81NjcwLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQxXzUyMDBfNTI0MCwgVDFfNTI4MF81MjgwLCBUMV81NTQwXzU2NjAsIFQxXzU3NjVfNTgwNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oRjFfMjMxMl8yMzcyLCBGMV8yNDEyXzI0NzIsIEYxXzI0ODRfMjQ4NCwgRjFfMjUxMl8yNzMyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShHMV8yMzEyXzIzNzIsIEcxXzI0MTJfMjQ3MiwgRzFfMjUxMl8yNzMyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDFfMjMxMl8yMzcyLCBUMV8yNDM3XzI0MzcsIFQxXzI1MTJfMjczMiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKE5HX0RFTU9fQUxMX0NIQU5ORUxTLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShOQV9ERU1PX0FMTF9DSEFOTkVMUywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKX0sCisKKwl7QVBMMSwgRVRTSSwgTk9fREZTLCBOT19QU0NBTiwgTk9fUkVRLAorCSBCTShGNF81NzQ1XzU4MjUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKE5BNF81NzU1XzU3OTUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSl9LAorCisJe0FQTDIsIEVUU0ksIE5PX0RGUywgTk9fUFNDQU4sIE5PX1JFUSwKKwkgQk0oRjFfNTc0NV81ODA1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShOQTNfNTc1NV81Nzk1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpfSwKKworCXtBUEwzLCBGQ0MsIE5PX0RGUywgTk9fUFNDQU4sIE5PX1JFUSwKKwkgQk0oRjFfNTI4MF81MzIwLCBGMl81NzQ1XzU4MDUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oTkExXzUzMTBfNTMxMCwgTkE0XzU3NTVfNTc5NSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpfSwKKworCXtBUEw0LCBFVFNJLCBOT19ERlMsIE5PX1BTQ0FOLCBOT19SRVEsCisJIEJNKEY0XzUxODBfNTI0MCwgIEYzXzU3NDVfNTgyNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShOQTRfNTE5MF81MjMwLCBOQTJfNTc1NV81Nzk1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSl9LAorCisJe0FQTDUsIEVUU0ksIE5PX0RGUywgTk9fUFNDQU4sIE5PX1JFUSwKKwkgQk0oRjJfNTc0NV81ODI1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShOQTFfNTc1NV81Nzk1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpfSwKKworCXtBUEw2LCBFVFNJLCBERlNfRVRTSSwgUFNDQU5fRkNDX1QgfCBQU0NBTl9GQ0MgLCBOT19SRVEsCisJIEJNKEY0XzUxODBfNTI0MCwgRjJfNTI2MF81MzIwLCBGM181NzQ1XzU4MjUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUMl81MjEwXzUyMTAsIFQxXzUyNTBfNTI5MCwgVDFfNTc2MF81ODAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKE5BNF81MTkwXzUyMzAsIE5BMl81MjcwXzUzMTAsIE5BMl81NzU1XzU3OTUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpfSwKKworCXtBUEw3LCBGQ0MsIE5PX0RGUywgUFNDQU5fRkNDX1QgfCBQU0NBTl9GQ0MgLCBOT19SRVEsCisJIEJNKEY3XzUyNjBfNTMyMCwgRjRfNTUwMF81NzAwLCBGM181NzQ1XzU4MDUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShOQTFfNTMxMF81MzEwLCBOQTJfNTc1NV81Nzk1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSl9LAorCXtBUEw4LCBFVFNJLCBOT19ERlMsIE5PX1BTQ0FOLCBESVNBTExPV19BREhPQ18xMUF8RElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNKEY2XzUyNjBfNTMyMCwgRjRfNTc0NV81ODI1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKE5BNF81MjcwXzUzMTAsIE5BNF81NzU1XzU3OTUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKX0sCisKKwl7QVBMOSwgRVRTSSwgREZTX0VUU0ksIFBTQ0FOX0VUU0ksIERJU0FMTE9XX0FESE9DXzExQXxESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQk0oRjFfNTE4MF81MzIwLCBGMV81NTAwXzU2MjAsIEYzXzU3NDVfNTgwNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKE5BNF81MTkwXzUyMzAsIE5BMl81MjcwXzUzMTAsIE5BMV81NTEwXzU2MzAsIE5BNF81NzU1XzU3OTUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSl9LAorCisJe0VUU0kxLCBFVFNJLCBERlNfRVRTSSwgUFNDQU5fRVRTSSwgRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNKFcyXzUxODBfNTI0MCwgRjJfNTI2MF81MzIwLCBGMl81NTAwXzU3MDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShOQTRfNTE5MF81MjMwLCBOQTJfNTI3MF81MzEwLCBOQTJfNTUxMF81NjcwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKX0sCisKKwl7RVRTSTIsIEVUU0ksIERGU19FVFNJLCBQU0NBTl9FVFNJLCBESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQk0oRjNfNTE4MF81MjQwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShOQTNfNTE5MF81MjMwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpfSwKKworCXtFVFNJMywgRVRTSSwgREZTX0VUU0ksIFBTQ0FOX0VUU0ksIERJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTShXMl81MTgwXzUyNDAsIEYyXzUyNjBfNTMyMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShOQTRfNTE5MF81MjMwLCBOQTJfNTI3MF81MzEwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSl9LAorCisJe0VUU0k0LCBFVFNJLCBERlNfRVRTSSwgUFNDQU5fRVRTSSwgRElTQUxMT1dfQURIT0NfMTFBIHwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNKEYzXzUxODBfNTI0MCwgRjFfNTI2MF81MzIwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKE5BM181MTkwXzUyMzAsIE5BMV81MjcwXzUzMTAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKX0sCisKKwl7RVRTSTUsIEVUU0ksIERGU19FVFNJLCBQU0NBTl9FVFNJLCBESVNBTExPV19BREhPQ18xMUEgfCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKwkgQk0oRjFfNTE4MF81MjQwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShOQTFfNTE5MF81MjMwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpfSwKKworCXtFVFNJNiwgRVRTSSwgREZTX0VUU0ksIFBTQ0FOX0VUU0ksIERJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTShGNV81MTgwXzUyNDAsIEYxXzUyNjBfNTI4MCwgRjNfNTUwMF81NzAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oTkE1XzUxOTBfNTIzMCwgTkExXzUyNzBfNTI3MCwgTkEzXzU1MTBfNTY3MCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSl9LAorCisJe0ZDQzEsIEZDQywgTk9fREZTLCBOT19QU0NBTiwgTk9fUkVRLAorCSBCTShGMl81MTgwXzUyNDAsIEY0XzUyNjBfNTMyMCwgRjVfNTc0NV81ODI1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDFfNTIxMF81MjEwLCBUMl81MjUwXzUyOTAsIFQyXzU3NjBfNTgwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQxXzUyMDBfNTI0MCwgVDFfNTI4MF81MjgwLCBUMV81NzY1XzU4MDUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKE5BMl81MTkwXzUyMzAsIE5BM181MjcwXzUzMTAsIE5BNF81NzU1XzU3OTUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpfSwKKworCXtGQ0MyLCBGQ0MsIE5PX0RGUywgTk9fUFNDQU4sIE5PX1JFUSwKKwkgQk0oRjZfNTE4MF81MjQwLCBGNV81MjYwXzUzMjAsIEY2XzU3NDVfNTgyNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUMl81MjAwXzUyNDAsIFQxXzUyODBfNTI4MCwgVDFfNTc2NV81ODA1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShOQTVfNTE5MF81MjMwLCBOQTNfNTI3MF81MzEwLCBOQTRfNTc1NV81Nzk1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKX0sCisKKwl7RkNDMywgRkNDLCBERlNfRkNDMywgUFNDQU5fRkNDIHwgUFNDQU5fRkNDX1QsIE5PX1JFUSwKKwkgQk0oRjJfNTE4MF81MjQwLCBGM181MjYwXzUzMjAsIEYxXzU1MDBfNTcwMCwgRjVfNTc0NV81ODI1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUMV81MjEwXzUyMTAsIFQxXzUyNTBfNTI1MCwgVDFfNTI5MF81MjkwLCBUMl81NzYwXzU4MDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQxXzUyMDBfNTI0MCwgVDJfNTI4MF81MjgwLCBUMV81NTQwXzU2NjAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKE5BMl81MTkwXzUyMzAsIE5BMl81MjcwXzUzMTAsIE5BM181NTEwXzU2NzAsIE5BNF81NzU1XzU3OTUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSl9LAorCisJe0ZDQzQsIEZDQywgREZTX0ZDQzMsIFBTQ0FOX0ZDQyB8IFBTQ0FOX0ZDQ19ULCBOT19SRVEsCisJIEJNKEYxXzQ5NDJfNDk4NywgRjFfNDk0NV80OTg1LCBGMV80OTUwXzQ5ODAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk99LAorCisJe0ZDQzUsIEZDQywgTk9fREZTLCBOT19QU0NBTiwgTk9fUkVRLAorCSBCTShGMl81MTgwXzUyNDAsIEY1XzU3NDVfNTgyNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShOQTJfNTE5MF81MjMwLCBOQTRfNTc1NV81Nzk1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSl9LAorCisgICAge0ZDQzYsIEZDQywgREZTX0ZDQzMsIFBTQ0FOX0ZDQywgTk9fUkVRLAorCSBCTShGN181MTgwXzUyNDAsIEY1XzUyNjBfNTMyMCwgRjFfNTUwMF81NTgwLCBGMV81NjYwXzU3MDAsIEY2XzU3NDVfNTgyNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTSgtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDJfNTIwMF81MjQwLCBUMV81MjgwXzUyODAsIFQxXzU3NjVfNTgwNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorICAgICBCTVpFUk8sCisgICAgIEJNWkVSTywKKwkgQk0oTkE1XzUxOTBfNTIzMCwgTkE1XzU3NTVfNTc5NSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpfSwKKworCXtNS0sxLCBNS0ssIE5PX0RGUywgUFNDQU5fTUtLMSwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNKEYxXzUxNzBfNTIzMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPfSwKKworCXtNS0syLCBNS0ssIE5PX0RGUywgUFNDQU5fTUtLMiwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNKEYxXzQ5MTVfNDkyNSwgRjFfNDkzNV80OTQ1LCBGMV80OTIwXzQ5ODAsIEYxXzUwMzVfNTA0MCwgRjFfNTA1NV81MDU1LCBGMV81MDQwXzUwODAsIEYxXzUxNzBfNTIzMCwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPfSwKKworCS8qIFVOSS0xIGV2ZW4gKi8KKwl7TUtLMywgTUtLLCBOT19ERlMsIFBTQ0FOX01LSzMsIERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTShGNF81MTgwXzUyNDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKE5BNF81MTkwXzUyMzAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSl9LAorCisJLyogVU5JLTEgZXZlbiArIFVOSS0yICovCisJe01LSzQsIE1LSywgREZTX01LSzQsIFBTQ0FOX01LSzMsIERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTShGNF81MTgwXzUyNDAsIEYyXzUyNjBfNTMyMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShOQTRfNTE5MF81MjMwLCBOQTJfNTI3MF81MzEwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSl9LAorCisJLyogVU5JLTEgZXZlbiArIFVOSS0yICsgbWlkLWJhbmQgKi8KKwl7TUtLNSwgTUtLLCBERlNfTUtLNCwgUFNDQU5fTUtLMywgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNKEY0XzUxODBfNTI0MCwgRjJfNTI2MF81MzIwLCBGNF81NTAwXzU3MDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShOQTRfNTE5MF81MjMwLCBOQTJfNTI3MF81MzEwLCBOQTFfNTUxMF81NjcwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKX0sCisKKwkvKiBVTkktMSBvZGQgKyBldmVuICovCisJe01LSzYsIE1LSywgREZTX01LSzQsIFBTQ0FOX01LSzEsIERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTShGMl81MTcwXzUyMzAsIEY0XzUxODBfNTI0MCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShOQTRfNTE5MF81MjMwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpfSwKKworCS8qIFVOSS0xIG9kZCArIFVOSS0xIGV2ZW4gKyBVTkktMiAqLworCXtNS0s3LCBNS0ssIERGU19NS0s0LCBQU0NBTl9NS0sxIHwgUFNDQU5fTUtLMyAsIERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTShGMl81MTcwXzUyMzAsIEY0XzUxODBfNTI0MCwgRjJfNTI2MF81MzIwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oTkE0XzUxOTBfNTIzMCwgTkEyXzUyNzBfNTMxMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpfSwKKworCS8qIFVOSS0xIG9kZCArIFVOSS0xIGV2ZW4gKyBVTkktMiArIG1pZC1iYW5kICovCisJe01LSzgsIE1LSywgREZTX01LSzQsIFBTQ0FOX01LSzEgfCBQU0NBTl9NS0szICwgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNKEYyXzUxNzBfNTIzMCwgRjRfNTE4MF81MjQwLCBGMl81MjYwXzUzMjAsIEY0XzU1MDBfNTcwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oTkE0XzUxOTBfNTIzMCwgTkEyXzUyNzBfNTMxMCwgTkExXzU1MTBfNTY3MCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSl9LAorCisgICAgLyogVU5JLTEgZXZlbiArIDQuOSBHSFogKi8KKyAgICB7TUtLOSwgTUtLLCBOT19ERlMsIE5PX1BTQ0FOLCBESVNBTExPV19BREhPQ18xMUFfVFVSQiwKKyAgICAgQk0oRjFfNDkxNV80OTI1LCBGMV80OTM1XzQ5NDUsIEYxXzQ5MjBfNDk4MCwgRjFfNTAzNV81MDQwLCBGMV81MDU1XzUwNTUsIEYxXzUwNDBfNTA4MCwgRjRfNTE4MF81MjQwLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk99LAorCisgICAgLyogVU5JLTEgZXZlbiArIFVOSS0yICsgNC45IEdIWiAqLworCXtNS0sxMCwgTUtLLCBERlNfTUtLNCwgUFNDQU5fTUtLMywgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNKEYxXzQ5MTVfNDkyNSwgRjFfNDkzNV80OTQ1LCBGMV80OTIwXzQ5ODAsIEYxXzUwMzVfNTA0MCwgRjFfNTA1NV81MDU1LCBGMV81MDQwXzUwODAsIEY0XzUxODBfNTI0MCwgRjJfNTI2MF81MzIwLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVST30sCisKKwkvKiBVTkktMSBldmVuICsgVU5JLTIgKyA0LjkgR0haICsgbWlkLWJhbmQgKi8KKwl7TUtLMTEsIE1LSywgREZTX01LSzQsIFBTQ0FOX01LSzMsIERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTShGMV80OTE1XzQ5MjUsIEYxXzQ5MzVfNDk0NSwgRjFfNDkyMF80OTgwLCBGMV81MDM1XzUwNDAsIEYxXzUwNTVfNTA1NSwgRjFfNTA0MF81MDgwLCBGNF81MTgwXzUyNDAsIEYyXzUyNjBfNTMyMCwgRjRfNTUwMF81NzAwLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPfSwKKworCS8qIFVOSS0xIGV2ZW4gKyBVTkktMSBvZGQgKyBVTkktMiArIDQuOSBHSFogKyBtaWQtYmFuZCAqLworCXtNS0sxMiwgTUtLLCBERlNfTUtLNCwgUFNDQU5fTUtLMywgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNKEYxXzQ5MTVfNDkyNSwgRjFfNDkzNV80OTQ1LCBGMV80OTIwXzQ5ODAsIEYxXzUwMzVfNTA0MCwgRjFfNTA1NV81MDU1LCBGMV81MDQwXzUwODAsIEYxXzUxNzBfNTIzMCwgRjRfNTE4MF81MjQwLCBGMl81MjYwXzUzMjAsIEY0XzU1MDBfNTcwMCwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPfSwKKworCS8qIERlZmluZWQgaGVyZSB0byB1c2Ugd2hlbiAyRyBjaGFubmVscyBhcmUgYXV0aG9yaXNlZCBmb3IgY291bnRyeSBLMiAqLworCXtBUExELCBOT19DVEwsIE5PX0RGUywgTk9fUFNDQU4sIE5PX1JFUSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk0oRjJfMjMxMl8yMzcyLEYyXzI0MTJfMjQ3MiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShHMl8yMzEyXzIzNzIsRzJfMjQxMl8yNDcyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk99LAorCisJe0VUU0lBLCBOT19DVEwsIE5PX0RGUywgUFNDQU5fRVRTSUEsIERJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShGMV8yNDU3XzI0NzIsLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oRzFfMjQ1N18yNDcyLC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQyXzI0MzdfMjQzNywtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVST30sCisKKwl7RVRTSUIsIEVUU0ksIE5PX0RGUywgUFNDQU5fRVRTSUIsIERJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShGMV8yNDMyXzI0NDIsLTEsLTEsLTEsLTEsLTEsLTEsLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oRzFfMjQzMl8yNDQyLC0xLC0xLC0xLC0xLC0xLC0xLC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQyXzI0MzdfMjQzNywtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVST30sCisKKwl7RVRTSUMsIEVUU0ksIE5PX0RGUywgUFNDQU5fRVRTSUMsIERJU0FMTE9XX0FESE9DXzExQSB8IERJU0FMTE9XX0FESE9DXzExQV9UVVJCLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShGM18yNDEyXzI0NzIsLTEsLTEsLTEsLTEsLTEsLTEsLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oRzNfMjQxMl8yNDcyLC0xLC0xLC0xLC0xLC0xLC0xLC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQyXzI0MzdfMjQzNywtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVST30sCisKKwl7RkNDQSwgRkNDLCBOT19ERlMsIE5PX1BTQ0FOLCBOT19SRVEsCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKEYxXzI0MTJfMjQ2MiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShHMV8yNDEyXzI0NjIsLTEsLTEsLTEsLTEsLTEsLTEsLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDJfMjQzN18yNDM3LC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKE5HMl8yNDIyXzI0NTIsLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPfSwKKworCXtNS0tBLCBNS0ssIE5PX0RGUywgUFNDQU5fTUtLQSB8IFBTQ0FOX01LS0FfRyB8IFBTQ0FOX01LS0ExIHwgUFNDQU5fTUtLQTFfRyB8IFBTQ0FOX01LS0EyIHwgUFNDQU5fTUtLQTJfRywgRElTQUxMT1dfQURIT0NfMTFBX1RVUkIsCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNKEYyXzI0MTJfMjQ2MiwgRjFfMjQ2N18yNDcyLCBGMl8yNDg0XzI0ODQsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShHMl8yNDEyXzI0NjIsIEcxXzI0NjdfMjQ3MiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUMl8yNDM3XzI0MzcsLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oTkcxXzI0MjJfMjQ1MiwtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk99LAorCisJe01LS0MsIE1LSywgTk9fREZTLCBOT19QU0NBTiwgTk9fUkVRLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShGMl8yNDEyXzI0NzIsLTEsLTEsLTEsLTEsLTEsLTEsLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oRzJfMjQxMl8yNDcyLC0xLC0xLC0xLC0xLC0xLC0xLC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQyXzI0MzdfMjQzNywtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShORzFfMjQyMl8yNDUyLC0xLC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPfSwKKworCXtXT1JMRCwgRVRTSSwgTk9fREZTLCBOT19QU0NBTiwgTk9fUkVRLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShGMl8yNDEyXzI0NzIsLTEsLTEsLTEsLTEsLTEsLTEsLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oRzJfMjQxMl8yNDcyLC0xLC0xLC0xLC0xLC0xLC0xLC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQyXzI0MzdfMjQzNywtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShORzFfMjQyMl8yNDUyLC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVST30sCisKKwl7V09SMF9XT1JMRCwgTk9fQ1RMLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9XV1IsIEFESE9DX1BFUl8xMUQsCisJIEJNKFcxXzUyNjBfNTMyMCwgVzFfNTE4MF81MjQwLCBXMV81MTcwXzUyMzAsIFcxXzU3NDVfNTgyNSwgVzFfNTUwMF81NzAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFdUMV81MjEwXzUyNTAsIFdUMV81MjkwXzUyOTAsIFdUMV81NzYwXzU4MDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNKFcxXzI0MTJfMjQxMixXMV8yNDM3XzI0NDIsVzFfMjQ2Ml8yNDYyLFcxXzI0NzJfMjQ3MixXMV8yNDE3XzI0MzIsIFcxXzI0NDdfMjQ1NywgVzFfMjQ2N18yNDY3LCBXMV8yNDg0XzI0ODQsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oV0cxXzI0MTJfMjQxMixXRzFfMjQzN18yNDQyLFdHMV8yNDYyXzI0NjIsV0cxXzI0NzJfMjQ3MixXRzFfMjQxN18yNDMyLFdHMV8yNDQ3XzI0NTcsV0cxXzI0NjdfMjQ2NywgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDNfMjQzN18yNDM3LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVST30sCisKKwl7V09SMDFfV09STEQsIE5PX0NUTCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fV1dSLCBBREhPQ19QRVJfMTFELAorCSBCTShXMV81MjYwXzUzMjAsIFcxXzUxODBfNTI0MCwgVzFfNTE3MF81MjMwLCBXMV81NzQ1XzU4MjUsIFcxXzU1MDBfNTcwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShXVDFfNTIxMF81MjUwLCBXVDFfNTI5MF81MjkwLCBXVDFfNTc2MF81ODAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTShXMV8yNDEyXzI0MTIsIFcxXzI0MzdfMjQ0MiwgVzFfMjQ2Ml8yNDYyLCBXMV8yNDE3XzI0MzIsIFcxXzI0NDdfMjQ1NywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShXRzFfMjQxMl8yNDEyLCBXRzFfMjQzN18yNDQyLCBXRzFfMjQ2Ml8yNDYyLCBXRzFfMjQxN18yNDMyLCBXRzFfMjQ0N18yNDU3LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQzXzI0MzdfMjQzNywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk99LAorCisJe1dPUjAyX1dPUkxELCBOT19DVEwsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX1dXUiwgQURIT0NfUEVSXzExRCwKKwkgQk0oVzFfNTI2MF81MzIwLCBXMV81MTgwXzUyNDAsVzFfNTE3MF81MjMwLFcxXzU3NDVfNTgyNSxXMV81NTAwXzU3MDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oV1QxXzUyMTBfNTI1MCwgV1QxXzUyOTBfNTI5MCwgV1QxXzU3NjBfNTgwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk0oVzFfMjQxMl8yNDEyLFcxXzI0MzdfMjQ0MixXMV8yNDYyXzI0NjIsIFcxXzI0NzJfMjQ3MixXMV8yNDE3XzI0MzIsIFcxXzI0NDdfMjQ1NywgVzFfMjQ2N18yNDY3LCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShXRzFfMjQxMl8yNDEyLFdHMV8yNDM3XzI0NDIsV0cxXzI0NjJfMjQ2MiwgV0cxXzI0NzJfMjQ3MixXRzFfMjQxN18yNDMyLCBXRzFfMjQ0N18yNDU3LCBXRzFfMjQ2N18yNDY3LCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUM18yNDM3XzI0MzcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPfSwKKworCXtFVTFfV09STEQsIE5PX0NUTCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fV1dSLCBBREhPQ19QRVJfMTFELAorCSBCTShXMV81MjYwXzUzMjAsIFcxXzUxODBfNTI0MCxXMV81MTcwXzUyMzAsVzFfNTc0NV81ODI1LFcxXzU1MDBfNTcwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShXVDFfNTIxMF81MjUwLCBXVDFfNTI5MF81MjkwLCBXVDFfNTc2MF81ODAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTShXMV8yNDEyXzI0MTIsVzFfMjQzN18yNDQyLFcxXzI0NjJfMjQ2MiwgVzJfMjQ3Ml8yNDcyLFcxXzI0MTdfMjQzMiwgVzFfMjQ0N18yNDU3LCBXMl8yNDY3XzI0NjcsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFdHMV8yNDEyXzI0MTIsV0cxXzI0MzdfMjQ0MixXRzFfMjQ2Ml8yNDYyLCBXRzJfMjQ3Ml8yNDcyLFdHMV8yNDE3XzI0MzIsIFdHMV8yNDQ3XzI0NTcsIFdHMl8yNDY3XzI0NjcsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQzXzI0MzdfMjQzNywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk99LAorCisJe1dPUjFfV09STEQsIE5PX0NUTCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fV1dSLCBBREhPQ19OT18xMUEsCisJIEJNKFcxXzUyNjBfNTMyMCwgVzFfNTE4MF81MjQwLCBXMV81MTcwXzUyMzAsIFcxXzU3NDVfNTgyNSwgVzFfNTUwMF81NzAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShXMV8yNDEyXzI0MTIsVzFfMjQzN18yNDQyLFcxXzI0NjJfMjQ2MixXMV8yNDcyXzI0NzIsVzFfMjQxN18yNDMyLCBXMV8yNDQ3XzI0NTcsIFcxXzI0NjdfMjQ2NywgVzFfMjQ4NF8yNDg0LCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFdHMV8yNDEyXzI0MTIsV0cxXzI0MzdfMjQ0MixXRzFfMjQ2Ml8yNDYyLFdHMV8yNDcyXzI0NzIsV0cxXzI0MTdfMjQzMixXRzFfMjQ0N18yNDU3LFdHMV8yNDY3XzI0NjcsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQzXzI0MzdfMjQzNywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk99LAorCisJe1dPUjJfV09STEQsIE5PX0NUTCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fV1dSLCBBREhPQ19OT18xMUEsCisJIEJNKFcxXzUyNjBfNTMyMCwgVzFfNTE4MF81MjQwLCBXMV81MTcwXzUyMzAsIFcxXzU3NDVfNTgyNSwgVzFfNTUwMF81NzAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFdUMV81MjEwXzUyNTAsIFdUMV81MjkwXzUyOTAsIFdUMV81NzYwXzU4MDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNKFcxXzI0MTJfMjQxMixXMV8yNDM3XzI0NDIsVzFfMjQ2Ml8yNDYyLFcxXzI0NzJfMjQ3MixXMV8yNDE3XzI0MzIsIFcxXzI0NDdfMjQ1NywgVzFfMjQ2N18yNDY3LCBXMV8yNDg0XzI0ODQsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oV0cxXzI0MTJfMjQxMixXRzFfMjQzN18yNDQyLFdHMV8yNDYyXzI0NjIsV0cxXzI0NzJfMjQ3MixXRzFfMjQxN18yNDMyLFdHMV8yNDQ3XzI0NTcsV0cxXzI0NjdfMjQ2NywgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDNfMjQzN18yNDM3LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVST30sCisKKwl7V09SM19XT1JMRCwgTk9fQ1RMLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9XV1IsIEFESE9DX1BFUl8xMUQsCisJIEJNKFcxXzUyNjBfNTMyMCwgVzFfNTE4MF81MjQwLCBXMV81MTcwXzUyMzAsIFcxXzU3NDVfNTgyNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oV1QxXzUyMTBfNTI1MCwgV1QxXzUyOTBfNTI5MCwgV1QxXzU3NjBfNTgwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk0oVzFfMjQxMl8yNDEyLFcxXzI0MzdfMjQ0MixXMV8yNDYyXzI0NjIsVzFfMjQ3Ml8yNDcyLFcxXzI0MTdfMjQzMiwgVzFfMjQ0N18yNDU3LCBXMV8yNDY3XzI0NjcsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFdHMV8yNDEyXzI0MTIsV0cxXzI0MzdfMjQ0MixXRzFfMjQ2Ml8yNDYyLFdHMV8yNDcyXzI0NzIsV0cxXzI0MTdfMjQzMixXRzFfMjQ0N18yNDU3LFdHMV8yNDY3XzI0NjcsLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDNfMjQzN18yNDM3LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVST30sCisKKwl7V09SNF9XT1JMRCwgTk9fQ1RMLCBERlNfRkNDMywgUFNDQU5fV1dSLCBBREhPQ19OT18xMUEsCisJIEJNKFcyXzUyNjBfNTMyMCwgVzJfNTE4MF81MjQwLCBGMl81NzQ1XzU4MDUsIFcyXzU4MjVfNTgyNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oV1QxXzUyMTBfNTI1MCwgV1QxXzUyOTBfNTI5MCwgV1QxXzU3NjBfNTgwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk0oVzFfMjQxMl8yNDEyLFcxXzI0MzdfMjQ0MixXMV8yNDYyXzI0NjIsIFcxXzI0MTdfMjQzMixXMV8yNDQ3XzI0NTcsLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShXRzFfMjQxMl8yNDEyLFdHMV8yNDM3XzI0NDIsV0cxXzI0NjJfMjQ2MiwgV0cxXzI0MTdfMjQzMixXRzFfMjQ0N18yNDU3LC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oVDNfMjQzN18yNDM3LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTVpFUk8sCisJIEJNWkVST30sCisKKwl7V09SNV9FVFNJQywgTk9fQ1RMLCBERlNfRkNDMyB8IERGU19FVFNJLCBQU0NBTl9XV1IsIEFESE9DX05PXzExQSwKKwkgQk0oVzFfNTI2MF81MzIwLCBXMl81MTgwXzUyNDAsIEY2XzU3NDVfNTgyNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShXMV8yNDEyXzI0MTIsIFcxXzI0MzdfMjQ0MiwgVzFfMjQ2Ml8yNDYyLCBXMl8yNDcyXzI0NzIsIFcxXzI0MTdfMjQzMiwgVzFfMjQ0N18yNDU3LCBXMl8yNDY3XzI0NjcsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFdHMV8yNDEyXzI0MTIsIFdHMV8yNDM3XzI0NDIsIFdHMV8yNDYyXzI0NjIsIFdHMV8yNDcyXzI0NzIsIFdHMV8yNDE3XzI0MzIsIFdHMV8yNDQ3XzI0NTcsIFdHMV8yNDY3XzI0NjcsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQzXzI0MzdfMjQzNywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk99LAorCisJe1dPUjlfV09STEQsIE5PX0NUTCwgREZTX0ZDQzMgfCBERlNfRVRTSSwgUFNDQU5fV1dSLCBBREhPQ19OT18xMUEsCisJIEJNKFcxXzUyNjBfNTMyMCwgVzFfNTE4MF81MjQwLCBXMV81NzQ1XzU4MjUsIFcxXzU1MDBfNTcwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oV1QxXzUyMTBfNTI1MCwgV1QxXzUyOTBfNTI5MCwgV1QxXzU3NjBfNTgwMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk0oVzFfMjQxMl8yNDEyLCBXMV8yNDM3XzI0NDIsIFcxXzI0NjJfMjQ2MiwgVzFfMjQxN18yNDMyLCBXMV8yNDQ3XzI0NTcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk0oV0cxXzI0MTJfMjQxMiwgV0cxXzI0MzdfMjQ0MiwgV0cxXzI0NjJfMjQ2MiwgV0cxXzI0MTdfMjQzMiwgV0cxXzI0NDdfMjQ1NywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpLAorCSBCTShUM18yNDM3XzI0MzcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPfSwKKworCXtXT1JBX1dPUkxELCBOT19DVEwsIERGU19GQ0MzIHwgREZTX0VUU0ksIFBTQ0FOX1dXUiwgQURIT0NfTk9fMTFBLAorCSBCTShXMV81MjYwXzUzMjAsIFcxXzUxODBfNTI0MCwgVzFfNTc0NV81ODI1LCBXMV81NTAwXzU3MDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTShXMV8yNDEyXzI0MTIsIFcxXzI0MzdfMjQ0MiwgVzFfMjQ2Ml8yNDYyLCBXMV8yNDcyXzI0NzIsIFcxXzI0MTdfMjQzMiwgVzFfMjQ0N18yNDU3LCBXMV8yNDY3XzI0NjcsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFdHMV8yNDEyXzI0MTIsIFdHMV8yNDM3XzI0NDIsIFdHMV8yNDYyXzI0NjIsIFdHMV8yNDcyXzI0NzIsIFdHMV8yNDE3XzI0MzIsIFdHMV8yNDQ3XzI0NTcsIFdHMV8yNDY3XzI0NjcsIC0xLCAtMSwgLTEsIC0xLCAtMSksCisJIEJNKFQzXzI0MzdfMjQzNywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKSwKKwkgQk1aRVJPLAorCSBCTVpFUk99LAorCisJe05VTEwxLCBOT19DVEwsIE5PX0RGUywgTk9fUFNDQU4sIE5PX1JFUSwKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk8sCisJIEJNWkVSTywKKwkgQk1aRVJPLAorCSBCTVpFUk99LAorfTsKKworc3RydWN0IGNtb2RlIHsKKwl1MTZfdAltb2RlOworCXUzMl90CWZsYWdzOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbW9kZSBtb2Rlc1tdID0geworCXsgSEFMX01PREVfVFVSQk8sCUNIQU5ORUxfU1R9LAkvKiBUVVJCTyBtZWFucyAxMWEgU3RhdGljIFR1cmJvICovCisJeyBIQUxfTU9ERV8xMUEsCQlDSEFOTkVMX0F9LAorCXsgSEFMX01PREVfMTFCLAkJQ0hBTk5FTF9CfSwKKwl7IEhBTF9NT0RFXzExRywJCUNIQU5ORUxfR30sCisJeyBIQUxfTU9ERV8xMUdfVFVSQk8sCUNIQU5ORUxfMTA4R30sCisJeyBIQUxfTU9ERV8xMUFfVFVSQk8sCUNIQU5ORUxfMTA4QX0sCisJeyBIQUxfTU9ERV8xMU5BLAlDSEFOTkVMX0FfSFQ0MH0sCisJeyBIQUxfTU9ERV8xMU5BLAlDSEFOTkVMX0FfSFQyMH0sCisJeyBIQUxfTU9ERV8xMU5HLAlDSEFOTkVMX0dfSFQ0MH0sCisJeyBIQUxfTU9ERV8xMU5HLAlDSEFOTkVMX0dfSFQyMH0sCit9OworCisvKgorICogUmV0dXJuIHRoZSBXaXJlbGVzcyBNb2RlIFJlZ3VsYXRvcnkgRG9tYWluIGJhc2VkCisgKiBvbiB0aGUgY291bnRyeSBjb2RlIGFuZCB0aGUgd2lyZWxlc3MgbW9kZS4KKyAqLwordThfdCBHZXRXbVJEKHUxNl90IHJlZ2lvbkNvZGUsIHUxNl90IGNoYW5uZWxGbGFnLCBSRUdfRE9NQUlOICpyZCkKK3sKKwlzMTZfdCBpLCBmb3VuZCwgcmVnRG1uOworCXU2NF90IGZsYWdzPU5PX1JFUTsKKwlSRUdfRE1OX1BBSVJfTUFQUElORyAqcmVnUGFpcj1OVUxMOworCisJZm9yIChpPTAsIGZvdW5kPTA7IChpPE4ocmVnRG9tYWluUGFpcnMpKSYmKCFmb3VuZCk7IGkrKykKKwl7CisJCWlmIChyZWdEb21haW5QYWlyc1tpXS5yZWdEbW5FbnVtID09IHJlZ2lvbkNvZGUpCisJCXsKKwkJCXJlZ1BhaXIgPSAmcmVnRG9tYWluUGFpcnNbaV07CisJCQlmb3VuZCA9IDE7CisJCX0KKwl9CisJaWYgKCFmb3VuZCkKKwl7CisJCXptX2RlYnVnX21zZzEoIkZhaWxlZCB0byBmaW5kIHJlZyBkb21haW4gcGFpciAiLCByZWdpb25Db2RlKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmIChjaGFubmVsRmxhZyAmIFpNX1JFR19GTEFHX0NIQU5ORUxfMkdIWikKKwl7CisJCXJlZ0RtbiA9IHJlZ1BhaXItPnJlZ0RtbjJHSHo7CisJCWZsYWdzID0gcmVnUGFpci0+ZmxhZ3MyR0h6OworCX0KKyAgICBlbHNlCisJeworCQlyZWdEbW4gPSByZWdQYWlyLT5yZWdEbW41R0h6OworCQlmbGFncyA9IHJlZ1BhaXItPmZsYWdzNUdIejsKKwl9CisKKwkvKgorCSAqIFdlIGVpdGhlciBzdGFydGVkIHdpdGggYSB1bml0YXJ5IHJlZyBkb21haW4gb3Igd2UndmUgZm91bmQgdGhlCisJICogdW5pdGFyeSByZWcgZG9tYWluIG9mIHRoZSBwYWlyCisJICovCisKKwlmb3IgKGk9MDtpPE4ocmVnRG9tYWlucyk7IGkrKykKKwl7CisJCWlmIChyZWdEb21haW5zW2ldLnJlZ0RtbkVudW0gPT0gcmVnRG1uKQorCQl7CisJCQlpZiAocmQgIT0gTlVMTCkKKwkJCXsKKwkJCQl6Zk1lbW9yeUNvcHkoKHU4X3QgKilyZCwgKHU4X3QgKikmcmVnRG9tYWluc1tpXSwKKwkJCQkJICBzaXplb2YoUkVHX0RPTUFJTikpOworCQkJfQorCQl9CisJfQorCXJkLT5wc2NhbiAmPSByZWdQYWlyLT5wc2Nhbk1hc2s7CisgICAgcmQtPmZsYWdzID0gKHUzMl90KWZsYWdzOworCXJldHVybiBUUlVFOworfQorCisvKgorICogVGVzdCB0byBzZWUgaWYgdGhlIGJpdG1hc2sgYXJyYXkgaXMgYWxsIHplcm9zCisgKi8KK3U4X3QgaXNDaGFuQml0TWFza1plcm8odTY0X3QgKmJpdG1hc2spCit7CisJdTE2X3QgaTsKKworCWZvciAoaT0wOyBpPEJNTEVOOyBpKyspIHsKKwkJaWYgKGJpdG1hc2tbaV0gIT0gMCkKKwkJCXJldHVybiBGQUxTRTsKKwl9CisJcmV0dXJuIFRSVUU7Cit9CisKK3U4X3QgSVNfQklUX1NFVCh1MzJfdCBiaXQsIHU2NF90ICpiaXRtYXNrKQoreworCXUzMl90IGJ5dGVPZmZzZXQsIGJpdG51bTsKKwl1NjRfdCB2YWw7CisKKwlieXRlT2Zmc2V0ID0gYml0LzY0OworCWJpdG51bSA9IGJpdCAtIGJ5dGVPZmZzZXQqNjQ7CisJdmFsID0gKCh1NjRfdCkgMSkgPDwgYml0bnVtOworCWlmIChiaXRtYXNrW2J5dGVPZmZzZXRdICYgdmFsKQorCQlyZXR1cm4gVFJVRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsKK30KKworCit2b2lkIHpmSHBHZXRSZWd1bGF0aW9uVGFibGUoemRldl90KiBkZXYsIHUxNl90IHJlZ2lvbkNvZGUsIHUxNl90IGNfbG8sIHUxNl90IGNfaGkpCit7CisJUkVHX0RPTUFJTiByZDVHSHosIHJkMkdIejsKKwljb25zdCBzdHJ1Y3QgY21vZGUgKmNtOworCXMxNl90IG5leHQ9MCxiOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdj13ZC0+aHBQcml2YXRlOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworCWlmICghR2V0V21SRChyZWdpb25Db2RlLCB+Wk1fUkVHX0ZMQUdfQ0hBTk5FTF8yR0haLCAmcmQ1R0h6KSkKKwl7CisgICAgICAgIHptX2RlYnVnX21zZzEoImNvdWxkbid0IGZpbmQgdW5pdGFyeSA1R0h6IHJlZyBkb21haW4gZm9yIFJlZ2lvbiBDb2RlICIsIHJlZ2lvbkNvZGUpOworCQlyZXR1cm47CisJfQorCWlmICghR2V0V21SRChyZWdpb25Db2RlLCBaTV9SRUdfRkxBR19DSEFOTkVMXzJHSFosICZyZDJHSHopKQorCXsKKyAgICAgICAgem1fZGVidWdfbXNnMSgiY291bGRuJ3QgZmluZCB1bml0YXJ5IDJHSHogcmVnIGRvbWFpbiBmb3IgUmVnaW9uIENvZGUgIiwgcmVnaW9uQ29kZSk7CisJCXJldHVybjsKKwl9CisgICAgaWYgKHdkLT5yZWd1bGF0aW9uVGFibGUucmVnaW9uQ29kZSA9PSByZWdpb25Db2RlKQorICAgIHsKKyAgICAgICAgem1fZGVidWdfbXNnMSgiY3VycmVudCByZWdpb24gY29kZSBpcyB0aGUgc2FtZSB3aXRoIFJlZ2lvbiBDb2RlICIsIHJlZ2lvbkNvZGUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHdkLT5yZWd1bGF0aW9uVGFibGUucmVnaW9uQ29kZSA9IHJlZ2lvbkNvZGU7CisgICAgfQorCisgICAgbmV4dCA9IDA7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisJZm9yIChjbSA9IG1vZGVzOyBjbSA8ICZtb2Rlc1tOKG1vZGVzKV07IGNtKyspCisJeworCQl1MTZfdCBjOworCQl1NjRfdCAqY2hhbm5lbEJNPU5VTEw7CisJCVJFR19ET01BSU4gKnJkPU5VTEw7CisJCVJFR19ETU5fRlJFUV9CQU5EICpmYmFuZD1OVUxMLCpmcmVxcz1OVUxMOworCisJCXN3aXRjaCAoY20tPm1vZGUpCisJCXsKKwkJY2FzZSBIQUxfTU9ERV9UVVJCTzoKKwkJICAgIC8vd2UgZG9uJ3QgaGF2ZSB0dXJibyBtb2RlIHNvIHdlIGRpc2FibGUgaXQKKyAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMCgiQ1dZIC0gSEFMX01PREVfVFVSQk8iKTsKKyAgICAgICAgICAgIGNoYW5uZWxCTSA9IE5VTEw7CisJCQkvL3JkID0gJnJkNUdIejsKKwkJCS8vY2hhbm5lbEJNID0gcmQtPmNoYW4xMWFfdHVyYm87CisJCQkvL2ZyZXFzID0gJnJlZ0RtbjVHaHpUdXJib0ZyZXFbMF07CisJCQkvL2N0bCA9IHJkLT5jb25mb3JtYW5jZVRlc3RMaW1pdCB8IENUTF9UVVJCTzsKKwkJCWJyZWFrOworCQljYXNlIEhBTF9NT0RFXzExQToKKwkJICAgIGlmICgoaHBQcml2LT5PcEZsYWdzICYgMHgxKSAhPSAwKQorCQkgICAgeworICAgIAkJCXJkID0gJnJkNUdIejsKKyAgICAJCQljaGFubmVsQk0gPSByZC0+Y2hhbjExYTsKKyAgICAJCQlmcmVxcyA9ICZyZWdEbW41R2h6RnJlcVswXTsKKyAgICAJCQljX2xvID0gNDkyMDsgLy9mcm9tIGNoYW5uZWwgMTg0CisgICAgCQkJY19oaSA9IDU4MjU7IC8vdG8gICBjaGFubmVsIDE2NQorICAgIAkJCS8vY3RsID0gcmQtPmNvbmZvcm1hbmNlVGVzdExpbWl0OworICAgICAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMigiQ1dZIC0gSEFMX01PREVfMTFBLCBjaGFubmVsQk0gPSAweCIsICpjaGFubmVsQk0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9lbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9jaGFubmVsQk0gPSBOVUxMOworICAgICAgICAgICAgfQorCQkJYnJlYWs7CisJCWNhc2UgSEFMX01PREVfMTFCOgorCQkgICAgLy9EaXNhYmxlIDExQiBtb2RlIGJlY2F1c2UgaXQgb25seSBoYXMgZGlmZmVyZW5jZSB3aXRoIDExRyBpbiBQb3dlckRGUyBEYXRhLAorCQkgICAgLy9hbmQgd2UgZG9uJ3QgdXNlIHRoaXMgbm93LgorCQkJLy96bV9kZWJ1Z19tc2cwKCJDV1kgLSBIQUxfTU9ERV8xMUIiKTsKKwkJCWNoYW5uZWxCTSA9IE5VTEw7CisJCQkvL3JkID0gJnJkMkdIejsKKwkJCS8vY2hhbm5lbEJNID0gcmQtPmNoYW4xMWI7CisJCQkvL2ZyZXFzID0gJnJlZ0RtbjJHaHpGcmVxWzBdOworCQkJLy9jdGwgPSByZC0+Y29uZm9ybWFuY2VUZXN0TGltaXQgfCBDVExfMTFCOworICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cyKCJDV1kgLSBIQUxfTU9ERV8xMUIsIGNoYW5uZWxCTSA9IDB4IiwgKmNoYW5uZWxCTSk7CisJCQlicmVhazsKKwkJY2FzZSBIQUxfTU9ERV8xMUc6CisJCSAgICBpZiAoKGhwUHJpdi0+T3BGbGFncyAmIDB4MikgIT0gMCkKKwkJICAgIHsKKyAgICAJCQlyZCA9ICZyZDJHSHo7CisgICAgCQkJY2hhbm5lbEJNID0gcmQtPmNoYW4xMWc7CisgICAgCQkJZnJlcXMgPSAmcmVnRG1uMkdoejExZ0ZyZXFbMF07CisgICAgCQkJY19sbyA9IDI0MTI7IC8vZnJvbSBjaGFubmVsICAxCisgICAgCQkJLy9jX2hpID0gMjQ2MjsgLy90byAgIGNoYW5uZWwgMTEKKyAgICAgICAgICAgICAgICBjX2hpID0gMjQ3MjsgLy90byAgIGNoYW5uZWwgMTMKKyAgICAJCQkvL2N0bCA9IHJkLT5jb25mb3JtYW5jZVRlc3RMaW1pdCB8IENUTF8xMUc7CisgICAgICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cyKCJDV1kgLSBIQUxfTU9ERV8xMUcsIGNoYW5uZWxCTSA9IDB4IiwgKmNoYW5uZWxCTSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL2Vsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL2NoYW5uZWxCTSA9IE5VTEw7CisgICAgICAgICAgICB9CisJCQlicmVhazsKKwkJY2FzZSBIQUxfTU9ERV8xMUdfVFVSQk86CisJCSAgICAvL3dlIGRvbid0IGhhdmUgdHVyYm8gbW9kZSBzbyB3ZSBkaXNhYmxlIGl0CisgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzAoIkNXWSAtIEhBTF9NT0RFXzExR19UVVJCTyIpOworICAgICAgICAgICAgY2hhbm5lbEJNID0gTlVMTDsKKwkJCS8vcmQgPSAmcmQyR0h6OworCQkJLy9jaGFubmVsQk0gPSByZC0+Y2hhbjExZ190dXJibzsKKwkJCS8vZnJlcXMgPSAmcmVnRG1uMkdoejExZ1R1cmJvRnJlcVswXTsKKwkJCS8vY3RsID0gcmQtPmNvbmZvcm1hbmNlVGVzdExpbWl0IHwgQ1RMXzEwOEc7CisJCQlicmVhazsKKwkJY2FzZSBIQUxfTU9ERV8xMUFfVFVSQk86CisJCSAgICAvL3dlIGRvbid0IGhhdmUgdHVyYm8gbW9kZSBzbyB3ZSBkaXNhYmxlIGl0CisgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzAoIkNXWSAtIEhBTF9NT0RFXzExQV9UVVJCTyIpOworICAgICAgICAgICAgY2hhbm5lbEJNID0gTlVMTDsKKwkJCS8vcmQgPSAmcmQ1R0h6OworCQkJLy9jaGFubmVsQk0gPSByZC0+Y2hhbjExYV9keW5fdHVyYm87CisJCQkvL2ZyZXFzID0gJnJlZ0RtbjVHaHpUdXJib0ZyZXFbMF07CisJCQkvL2N0bCA9IHJkLT5jb25mb3JtYW5jZVRlc3RMaW1pdCB8IENUTF8xMDhHOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJVbmtvbnduIEhBTCBtb2RlICIsIGNtLT5tb2RlKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjaGFubmVsQk0gPT0gTlVMTCkKKwkJeworCQkgICAgLy96bV9kZWJ1Z19tc2cwKCJDV1kgLSBjaGFubmVsQk0gaXMgTlVMTCIpOworCQkgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzQ2hhbkJpdE1hc2taZXJvKGNoYW5uZWxCTSkpCisgICAgICAgIHsKKwkgICAgICAgIC8vem1fZGVidWdfbXNnMCgiQ1dZIC0gQml0TWFzayBpcyBaZXJvIik7CisJICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJBWTpJcyBpdCBvaz8/CisgICAgICAgIGlmIChmcmVxcyA9PSBOVUxMICkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworCQlmb3IgKGI9MDtiPDY0KkJNTEVOOyBiKyspCisJCXsKKwkJCWlmIChJU19CSVRfU0VUKGIsY2hhbm5lbEJNKSkKKwkJCXsKKwkJCQlmYmFuZCA9ICZmcmVxc1tiXTsKKworCQkJCS8vem1fZGVidWdfbXNnMSgiQ1dZIC0gbG93Q2hhbm5lbCA9ICIsIGZiYW5kLT5sb3dDaGFubmVsKTsKKwkJCQkvL3ptX2RlYnVnX21zZzEoIkNXWSAtIGhpZ2hDaGFubmVsID0gIiwgZmJhbmQtPmhpZ2hDaGFubmVsKTsKKwkJCQkvL3ptX2RlYnVnX21zZzEoIkNXWSAtIGNoYW5uZWxTZXAgPSAiLCBmYmFuZC0+Y2hhbm5lbFNlcCk7CisJCQkJZm9yIChjPWZiYW5kLT5sb3dDaGFubmVsOyBjIDw9IGZiYW5kLT5oaWdoQ2hhbm5lbDsKKwkJCQkgICAgIGMgKz0gZmJhbmQtPmNoYW5uZWxTZXApCisJCQkJeworCQkJCQlaTV9IQUxfQ0hBTk5FTCBpY3Y7CisKKyAgICAgICAgICAgICAgICAgICAgLy9EaXNhYmxlIGFsbCBERlMgY2hhbm5lbAorICAgICAgICAgICAgICAgICAgICBpZiAoKGhwUHJpdi0+ZGlzYWJsZURmc0NoPT0wKSB8fCAoIShmYmFuZC0+dXNlRGZzICYgcmQtPmRmc01hc2spKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGZiYW5kLT5jaGFubmVsQlcgPCAyMCApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIFRlbXBvcmFyeSBkaXNjYXJkIGNoYW5uZWwgdGhhdCBCVyA8IDIwTUh6ICg1IG9yIDEwTUh6KSAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICBPdXIgYXJjaGl0ZWN0dXJlIGRvZXMgbm90IGltcGxlbW50IGl0ICEhISAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisJCQkJCWlmICgoYyA+PSBjX2xvKSAmJiAoYyA8PSBjX2hpKSkKKwkJCQkJeworCQkJCQkgICAgaWN2LmNoYW5uZWwgPSBjOworCQkJCQkgICAgaWN2LmNoYW5uZWxGbGFncyA9IGNtLT5mbGFnczsKKwkJCQkJICAgIGljdi5tYXhSZWdUeFBvd2VyID0gZmJhbmQtPnBvd2VyRGZzOworCQkJCQkgICAgaWYgKGZiYW5kLT51c2VQYXNzU2NhbiAmIHJkLT5wc2NhbikKKwkJCQkJICAgIAlpY3YuY2hhbm5lbEZsYWdzIHw9IFpNX1JFR19GTEFHX0NIQU5ORUxfUEFTU0lWRTsKKwkJCQkJICAgIGVsc2UKKwkJCQkJICAgIAlpY3YuY2hhbm5lbEZsYWdzICY9IH5aTV9SRUdfRkxBR19DSEFOTkVMX1BBU1NJVkU7CisJCQkJCSAgICBpZiAoZmJhbmQtPnVzZURmcyAmIHJkLT5kZnNNYXNrKQorCQkJCQkgICAgCWljdi5wcml2RmxhZ3MgPSBaTV9SRUdfRkxBR19DSEFOTkVMX0RGUzsKKwkJCQkJICAgIGVsc2UKKwkJCQkJICAgIAlpY3YucHJpdkZsYWdzID0gMDsKKworCQkJCQkgICAgLyogRm9yIG5vdyBkaXNhYmxlIHJhZGFyIGZvciBGQ0MzICovCisJCQkJCSAgICBpZiAoZmJhbmQtPnVzZURmcyAmIHJkLT5kZnNNYXNrICYgREZTX0ZDQzMpCisJCQkJCSAgICB7CisJCQkJCSAgICAJaWN2LnByaXZGbGFncyAmPSB+Wk1fUkVHX0ZMQUdfQ0hBTk5FTF9ERlM7CisJCQkJCSAgICAJaWN2LnByaXZGbGFncyB8PSBaTV9SRUdfRkxBR19DSEFOTkVMX0RGU19DTEVBUjsKKwkJCQkJICAgIH0KKworCQkJCQkgICAgaWYocmQtPmZsYWdzICYgTElNSVRfRlJBTUVfNE1TKQorCQkJCQkgICAgCWljdi5wcml2RmxhZ3MgfD0gWk1fUkVHX0ZMQUdfQ0hBTk5FTF9ERlNfQ0xFQVI7CisKKwkJCQkJICAgIGljdi5taW5UeFBvd2VyID0gMDsKKwkJCQkJICAgIGljdi5tYXhUeFBvd2VyID0gMDsKKworICAgICAgICAJCQkgICAgem1fYXNzZXJ0KG5leHQgPCA2MCk7CisKKwkJCQkJICAgIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW25leHQrK10gPSBpY3Y7CisJCQkJICAgIH0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisJfQorCXdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250ID0gbmV4dDsKKworICAgICNpZiAwCisgICAgeworICAgICAgICAvKiBkZWJ1ZyBwcmludCAqLworICAgICAgICB1MzJfdCBpOworICAgICAgICBEYmdQcmludCgiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgICAgICAgRGJnUHJpbnQoInpmSHBHZXRSZWd1bGF0aW9uVGFibGUgcHJpbnQgYWxsIGNoYW5uZWwgaW5mbyByZWdpbmNvZGUgPSAweCV4XG4iLCB3ZC0+cmVndWxhdGlvblRhYmxlLnJlZ2lvbkNvZGUpOworICAgICAgICBEYmdQcmludCgiaW5kZXggIGNoYW5uZWwgIGNoYW5uZWxGbGFncyAgIG1heFJlZ1R4UG93ZXIgIHByaXZGbGFncyAgdXNlREZTXG4iKTsKKworICAgICAgICBmb3IgKGk9MDsgaTx3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbENudDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBEYmdQcmludCgiJTAyZCAgICAgICAlZCAgICAgICAgICUwNHggICAgICAgICAgICUwMmQgICAgICAgICV4ICAgICAleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgICAgICAgIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLmNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLm1heFJlZ1R4UG93ZXIsCisgICAgICAgICAgICAgICAgICAgICAgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0ucHJpdkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLnByaXZGbGFncyAmIFpNX1JFR19GTEFHX0NIQU5ORUxfREZTKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAjZW5kaWYKKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7Cit9CisKK3ZvaWQgemZIcEdldFJlZ3VsYXRpb25UYWJsZWZyb21SZWdpb25Db2RlKHpkZXZfdCogZGV2LCB1MTZfdCByZWdpb25Db2RlKQoreworICAgIHUxNl90IGNfbG8gPSAyMDAwLCBjX2hpID0gNjAwMDsgLy9kZWZhdWx0IGNoYW5uZWwgaXMgYWxsIGVuYWJsZQorICAgIHU4X3QgaXNvTmFtZVszXSA9IHsnTicsICdBJywgMH07CisKKyAgICB6ZkNvcmVTZXRJc29OYW1lKGRldiwgaXNvTmFtZSk7CisKKyAgICB6ZkhwR2V0UmVndWxhdGlvblRhYmxlKGRldiwgcmVnaW9uQ29kZSwgY19sbywgY19oaSk7Cit9CisKK3ZvaWQgemZIcEdldFJlZ3VsYXRpb25UYWJsZWZyb21Db3VudHJ5KHpkZXZfdCogZGV2LCB1MTZfdCBDb3VudHJ5Q29kZSkKK3sKKyAgICB1MTZfdCBpOworICAgIHUxNl90IGNfbG8gPSAyMDAwLCBjX2hpID0gNjAwMDsgLy9kZWZhdWx0IGNoYW5uZWwgaXMgYWxsIGVuYWJsZQorICAgIHUxNl90IFJlZ0RvbWFpbjsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTihhbGxDb3VudHJpZXMpOyBpKyspCisgICAgeworICAgICAgICBpZiAoQ291bnRyeUNvZGUgPT0gYWxsQ291bnRyaWVzW2ldLmNvdW50cnlDb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBSZWdEb21haW4gPSBhbGxDb3VudHJpZXNbaV0ucmVnRG1uRW51bTsKKworICAgICAgICAgICAgLy8gcmVhZCB0aGUgQUNVIGNvdW50cnkgY29kZSBmcm9tIEVFUFJPTQorICAgICAgICAgICAgemZDb3JlU2V0SXNvTmFtZShkZXYsICh1OF90KilhbGxDb3VudHJpZXNbaV0uaXNvTmFtZSk7CisKKyAgICAgICAgICAgIC8vem1fZGVidWdfbXNnX3MoIkNXWSAtIENvdW50cnkgTmFtZSA9ICIsIGFsbENvdW50cmllc1tpXS5uYW1lKTsKKworICAgICAgICAgICAgaWYgKHdkLT5yZWd1bGF0aW9uVGFibGUucmVnaW9uQ29kZSAhPSBSZWdEb21haW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cwKCJDV1kgLSBDaGFuZ2UgcmVndWxhdG9yeSB0YWJsZSIpOworCisgICAgICAgICAgICAgICAgemZIcEdldFJlZ3VsYXRpb25UYWJsZShkZXYsIFJlZ0RvbWFpbiwgY19sbywgY19oaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgem1fZGVidWdfbXNnMSgiSW52YWxpZCBDb3VudHJ5Q29kZSA9ICIsIENvdW50cnlDb2RlKTsKK30KKwordThfdCB6ZkhwR2V0UmVndWxhdGlvblRhYmxlZnJvbUlTTyh6ZGV2X3QqIGRldiwgdThfdCAqY291bnRyeUluZm8sIHU4X3QgbGVuZ3RoKQoreworICAgIHUxNl90IGk7CisgICAgdTE2X3QgUmVnRG9tYWluOworICAgIHUxNl90IGNfbG8gPSAyMDAwLCBjX2hpID0gNjAwMDsgLy9kZWZhdWx0IGNoYW5uZWwgaXMgYWxsIGVuYWJsZQorICAgIC8vdThfdCBzdHJMZW4gPSAyOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIGlmIChjb3VudHJ5SW5mb1s0XSAhPSAweDIwKQorICAgIHsgLy8gd2l0aCAoSSluZG9vci8oTyl1dGRvb3IgaW5mbworICAgICAgICAvL3N0ckxlbiA9IDM7CisgICAgfQorICAgIC8vem1fZGVidWdfbXNnX3MoIkRlc2lyZWQgaXNvIG5hbWUgPSAiLCBpc29OYW1lKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTihhbGxDb3VudHJpZXMpOyBpKyspCisgICAgeworICAgICAgICAvL3ptX2RlYnVnX21zZ19zKCJDdXJyZW50IGlzbyBuYW1lID0gIiwgYWxsQ291bnRyaWVzW2ldLmlzb05hbWUpOworICAgICAgICBpZiAoemZNZW1vcnlJc0VxdWFsKCh1OF90ICopYWxsQ291bnRyaWVzW2ldLmlzb05hbWUsICh1OF90ICopJmNvdW50cnlJbmZvWzJdLCBsZW5ndGgtMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vRGJnUHJpbnQoIlNldCBjdXJyZW50IGlzbyBuYW1lID0gJXNcbiIsIGFsbENvdW50cmllc1tpXS5pc29OYW1lKTsKKyAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMCgiaXNvIG5hbWUgaGl0ISEiKTsKKworICAgICAgICAgICAgUmVnRG9tYWluID0gYWxsQ291bnRyaWVzW2ldLnJlZ0RtbkVudW07CisKKyAgICAgICAgICAgIGlmICh3ZC0+cmVndWxhdGlvblRhYmxlLnJlZ2lvbkNvZGUgIT0gUmVnRG9tYWluKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmSHBHZXRSZWd1bGF0aW9uVGFibGUoZGV2LCBSZWdEb21haW4sIGNfbG8sIGNfaGkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL3doaWxlIChpbmRleCA8IChjb3VudHJ5SW5mb1sxXSsyKSkKKyAgICAgICAgICAgIC8veworICAgICAgICAgICAgLy8gIGlmIChjb3VudHJ5SW5mb1tpbmRleF0gPD0gMTQpCisgICAgICAgICAgICAvLyAgeworICAgICAgICAgICAgLy8gICAgICAgIC8qIGNhbGN1bGF0ZSAyLjRHSHogbG93IGJvdW5kYXJ5IGNoYW5uZWwgZnJlcXVlbmN5ICovCisgICAgICAgICAgICAvLyAgICAgICAgY2ggPSBjb3VudHJ5SW5mb1tpbmRleF07CisgICAgICAgICAgICAvLyAgICAgICAgaWYgKCBjaCA9PSAxNCApCisgICAgICAgICAgICAvLyAgICAgICAgICAgIGNfbG8gPSBaTV9DSF9HXzE0OworICAgICAgICAgICAgLy8gICAgICAgIGVsc2UKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgY19sbyA9IFpNX0NIX0dfMSArIChjaCAtIDEpICogNTsKKyAgICAgICAgICAgIC8vICAgICAgICAvKiBjYWxjdWxhdGUgMi40R0h6IGhpZ2ggYm91bmRhcnkgY2hhbm5lbCBmcmVxdWVuY3kgKi8KKyAgICAgICAgICAgIC8vICAgICAgICBjaCA9IGNvdW50cnlJbmZvW2luZGV4XSArIGNvdW50cnlJbmZvW2luZGV4ICsgMV0gLSAxOworICAgICAgICAgICAgLy8gICAgICAgIGlmICggY2ggPT0gMTQgKQorICAgICAgICAgICAgLy8gICAgICAgICAgICBjX2hpID0gWk1fQ0hfR18xNDsKKyAgICAgICAgICAgIC8vICAgICAgICBlbHNlCisgICAgICAgICAgICAvLyAgICAgICAgICAgIGNfaGkgPSBaTV9DSF9HXzEgKyAoY2ggLSAxKSAqIDU7CisgICAgICAgICAgICAvLyAgfQorICAgICAgICAgICAgLy8gIGVsc2UKKyAgICAgICAgICAgIC8vICB7CisgICAgICAgICAgICAvLyAgICAgICAgLyogY2FsY3VsYXRlIDVHSHogbG93IGJvdW5kYXJ5IGNoYW5uZWwgZnJlcXVlbmN5ICovCisgICAgICAgICAgICAvLyAgICAgICAgY2ggPSBjb3VudHJ5SW5mb1tpbmRleF07CisgICAgICAgICAgICAvLyAgICAgICAgaWYgKCAoY2ggPj0gMTg0KSYmKGNoIDw9IDE5NikgKQorICAgICAgICAgICAgLy8gICAgICAgICAgICBjX2xvID0gNDAwMCArIGNoKjU7CisgICAgICAgICAgICAvLyAgICAgICAgZWxzZQorICAgICAgICAgICAgLy8gICAgICAgICAgICBjX2xvID0gNTAwMCArIGNoKjU7CisgICAgICAgICAgICAvLyAgICAgICAgLyogY2FsY3VsYXRlIDVHSHogaGlnaCBib3VuZGFyeSBjaGFubmVsIGZyZXF1ZW5jeSAqLworICAgICAgICAgICAgLy8gICAgICAgIGNoID0gY291bnRyeUluZm9baW5kZXhdICsgY291bnRyeUluZm9baW5kZXggKyAxXSAtIDE7CisgICAgICAgICAgICAvLyAgICAgICAgaWYgKCAoY2ggPj0gMTg0KSYmKGNoIDw9IDE5NikgKQorICAgICAgICAgICAgLy8gICAgICAgICAgICBjX2hpID0gNDAwMCArIGNoKjU7CisgICAgICAgICAgICAvLyAgICAgICAgZWxzZQorICAgICAgICAgICAgLy8gICAgICAgICAgICBjX2hpID0gNTAwMCArIGNoKjU7CisgICAgICAgICAgICAvLyAgfQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vICB6ZkhwR2V0UmVndWxhdGlvblRhYmxlKGRldiwgUmVnRG9tYWluLCBjX2xvLCBjX2hpKTsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyAgaW5kZXgrPTM7CisgICAgICAgICAgICAvL30KKworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgLy96bV9kZWJ1Z19tc2dfcygiSW52YWxpZCBpc28gbmFtZSA9ICIsICZjb3VudHJ5SW5mb1syXSk7CisgICAgcmV0dXJuIDE7Cit9CisKK2NvbnN0IGNoYXIqIHpmSHBHZXRpc29OYW1lZnJvbXJlZ2lvbkNvZGUoemRldl90KiBkZXYsIHUxNl90IHJlZ2lvbkNvZGUpCit7CisgICAgdTE2X3QgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBOKGFsbENvdW50cmllcyk7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChhbGxDb3VudHJpZXNbaV0ucmVnRG1uRW51bSA9PSByZWdpb25Db2RlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYWxsQ291bnRyaWVzW2ldLmlzb05hbWU7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogbm8gbWF0Y2hpbmcgaXRlbSwgcmV0dXJuIGRlZmF1bHQgKi8KKyAgICByZXR1cm4gYWxsQ291bnRyaWVzWzBdLmlzb05hbWU7Cit9CisKK3UxNl90IHpmSHBHZXRSZWdpb25Db2RlRnJvbUlzb05hbWUoemRldl90KiBkZXYsIHU4X3QgKmNvdW50cnlJc29OYW1lKQoreworICAgIHUxNl90IGk7CisgICAgdTE2X3QgcmVnaW9uQ29kZTsKKworICAgIC8qIGlmIG5vIG1hdGNoaW5nIGl0ZW0sIHJldHVybiBkZWZhdWx0ICovCisgICAgcmVnaW9uQ29kZSA9IERFRl9SRUdETU47CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTihhbGxDb3VudHJpZXMpOyBpKyspCisgICAgeworICAgICAgICBpZiAoemZNZW1vcnlJc0VxdWFsKCh1OF90ICopYWxsQ291bnRyaWVzW2ldLmlzb05hbWUsIGNvdW50cnlJc29OYW1lLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmVnaW9uQ29kZSA9IGFsbENvdW50cmllc1tpXS5yZWdEbW5FbnVtOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVnaW9uQ29kZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmSHBEZWxldGVBbGxvd0NoYW5uZWwgICAgICAqLworLyogICAgICBEZWxldGUgQWxsb3cgQ2hhbm5lbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgIDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZnJlcSA6IGZyZXF1ZW5jeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMCA6IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG90aGVyIDogZmFpbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIENoYW8tV2VuIFlhbmcgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDcuMyAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZkhwRGVsZXRlQWxsb3dDaGFubmVsKHpkZXZfdCogZGV2LCB1MTZfdCBmcmVxKQoreworICAgIHUxNl90IGksIGJhbmRJbmRleCA9IDA7CisgICAgdTE2X3QgZGZzNUdCYW5kW11bMl0gPSB7ezUxNTAsIDUyNDB9LCB7NTI2MCwgNTM1MH0sIHs1NDUwLCA1NzAwfSwgezU3MjUsIDU4MjV9fTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICAvKiBGaW5kIHdoaWNoIGJhbmQgZG9lcyB0aGlzIGZyZXF1ZW5jeSBiZWxvbmcgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKChmcmVxID49IGRmczVHQmFuZFtpXVswXSkgJiYgKGZyZXEgPD0gZGZzNUdCYW5kW2ldWzFdKSkKKyAgICAgICAgICAgIGJhbmRJbmRleCA9IGkgKyAxOworICAgIH0KKworICAgIGlmIChiYW5kSW5kZXggPT0gMCkKKyAgICB7CisgICAgICAgIC8qIDIuNEcsIGRvbid0IGNhcmUgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJhbmRJbmRleC0tOworICAgIH0KKyAgICAvKiBTZXQgYWxsIGNoYW5uZWxzIGluIHRoaXMgYmFuZCB0byBwYXNzaXZlIHNjYW4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmICgod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbCA+PSBkZnM1R0JhbmRbYmFuZEluZGV4XVswXSkgJiYKKyAgICAgICAgICAgICh3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsIDw9IGRmczVHQmFuZFtiYW5kSW5kZXhdWzFdKSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogaWYgY2hhbm5lbCBpcyBub3QgcGFzc2l2ZSwgc2V0IGl0IHRvIGJlIHBhc3NpdmUgYW5kIG1hcmsgaXQgKi8KKyAgICAgICAgICAgIGlmICgod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbEZsYWdzICYKKyAgICAgICAgICAgICAgICAgICAgWk1fUkVHX0ZMQUdfQ0hBTk5FTF9QQVNTSVZFKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLmNoYW5uZWxGbGFncyB8PQorICAgICAgICAgICAgICAgICAgICAgICAgKFpNX1JFR19GTEFHX0NIQU5ORUxfUEFTU0lWRSB8IFpNX1JFR19GTEFHX0NIQU5ORUxfQ1NBKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCit1MTZfdCB6ZkhwQWRkQWxsb3dDaGFubmVsKHpkZXZfdCogZGV2LCB1MTZfdCBmcmVxKQoreworICAgIHUxNl90IGksIGosIGFycmF5SW5kZXg7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsID09IGZyZXEpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIGkgPT0gd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQpCisgICAgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQ7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2pdLmNoYW5uZWwgPiBmcmVxKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy96bV9kZWJ1Z19tc2cxKCJDV1kgLSBhZGQgZnJlcXVlbmN5ID0gIiwgZnJlcSk7CisgICAgICAgIC8vem1fZGVidWdfbXNnMSgiQ1dZIC0gY2hhbm5lbCBhcnJheSBpbmRleCA9ICIsIGopOworCisgICAgICAgIGFycmF5SW5kZXggPSBqOworCisgICAgICAgIGlmIChhcnJheUluZGV4IDwgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaiA9IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBqID4gYXJyYXlJbmRleDsgai0tKQorICAgICAgICAgICAgICAgIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2pdID0gd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaiAtIDFdOworICAgICAgICB9CisgICAgICAgIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2FycmF5SW5kZXhdLmNoYW5uZWwgPSBmcmVxOworCisgICAgICAgIHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250Kys7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3UxNl90IHpmSHBJc0Rmc0NoYW5uZWxOQ1MoemRldl90KiBkZXYsIHUxNl90IGZyZXEpCit7CisgICAgdThfdCBmbGFnID0gWk1fUkVHX0ZMQUdfQ0hBTk5FTF9ERlM7CisgICAgdTE2X3QgaTsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQ7IGkrKykKKyAgICB7CisgICAgICAgIC8vRGJnUHJpbnQoIkRGUzpmcmVxPSVkLCBjaGFuPSVkIiwgZnJlcSwgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbCk7CisgICAgICAgIGlmICh3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsID09IGZyZXEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsYWcgPSB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5wcml2RmxhZ3M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoZmxhZyAmIChaTV9SRUdfRkxBR19DSEFOTkVMX0RGU3xaTV9SRUdfRkxBR19DSEFOTkVMX0RGU19DTEVBUikpOworfQorCit1MTZfdCB6ZkhwSXNEZnNDaGFubmVsKHpkZXZfdCogZGV2LCB1MTZfdCBmcmVxKQoreworICAgIHU4X3QgZmxhZyA9IFpNX1JFR19GTEFHX0NIQU5ORUxfREZTOworICAgIHUxNl90IGk7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQ7IGkrKykKKyAgICB7CisgICAgICAgIC8vRGJnUHJpbnQoIkRGUzpmcmVxPSVkLCBjaGFuPSVkIiwgZnJlcSwgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbCk7CisgICAgICAgIGlmICh3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsID09IGZyZXEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsYWcgPSB3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5wcml2RmxhZ3M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICByZXR1cm4gKGZsYWcgJiAoWk1fUkVHX0ZMQUdfQ0hBTk5FTF9ERlN8Wk1fUkVHX0ZMQUdfQ0hBTk5FTF9ERlNfQ0xFQVIpKTsKK30KKwordTE2X3QgemZIcElzQWxsb3dlZENoYW5uZWwoemRldl90KiBkZXYsIHUxNl90IGZyZXEpCit7CisgICAgdTE2X3QgaTsKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxDbnQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh3ZC0+cmVndWxhdGlvblRhYmxlLmFsbG93Q2hhbm5lbFtpXS5jaGFubmVsID09IGZyZXEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3UxNl90IHpmSHBGaW5kRmlyc3ROb25EZnNDaGFubmVsKHpkZXZfdCogZGV2LCB1MTZfdCBhQmFuZCkKK3sKKyAgICB1MTZfdCBjaGFuID0gMjQxMjsKKyAgICB1MTZfdCBpOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgZm9yIChpID0gMDsgaSA8IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsQ250OyBpKyspCisgICAgeworICAgICAgICBpZiAoKHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLnByaXZGbGFncyAmIFpNX1JFR19GTEFHX0NIQU5ORUxfREZTKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYUJhbmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLmNoYW5uZWwgPiAzMDAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhbiA9IHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW2ldLmNoYW5uZWw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbCA8IDMwMDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaGFuID0gd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbaV0uY2hhbm5lbDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIHJldHVybiBjaGFuOworfQorCisKKy8qIHBvcnRpbmcgZnJvbSBBQ1UgKi8KKy8qIHNhdmUgUmVndWxhdG9yeURvbWFpbiBpbiBocHJpdiAqLwordThfdCB6ZkhwR2V0UmVndWxhdG9yeURvbWFpbih6ZGV2X3QqIGRldikKK3sKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzd2l0Y2ggKHdkLT5yZWd1bGF0aW9uVGFibGUucmVnaW9uQ29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgTk9fRU5VTVJEOgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGQ0MxX0ZDQ0E6CisgICAgICAgIGNhc2UgRkNDMV9XT1JMRDoKKyAgICAgICAgY2FzZSBGQ0M0X0ZDQ0E6CisgICAgICAgIGNhc2UgRkNDNV9GQ0NBOgorICAgICAgICBjYXNlIEZDQzJfV09STEQ6CisgICAgICAgIGNhc2UgRkNDMl9FVFNJQzoKKyAgICAgICAgY2FzZSBGQ0MzX0ZDQ0E6CisgICAgICAgIGNhc2UgRkNDM19XT1JMRDoKKyAgICAgICAgY2FzZSBGQ0MxOgorICAgICAgICBjYXNlIEZDQzI6CisgICAgICAgIGNhc2UgRkNDMzoKKyAgICAgICAgY2FzZSBGQ0M0OgorICAgICAgICBjYXNlIEZDQzU6CisgICAgICAgIGNhc2UgRkNDQToKKyAgICAgICAgICAgIHJldHVybiAweDEwOy8vV0dfQU1FUklDQVMgRE9UMTFfUkVHX0RPTUFJTl9GQ0MgIFVuaXRlZCBTdGF0ZXMKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRkNDMl9GQ0NBOgorICAgICAgICAgICAgcmV0dXJuIDB4MjA7Ly9ET1QxMV9SRUdfRE9NQUlOX0RPQyAgQ2FuYWRhCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVUU0kxX1dPUkxEOgorICAgICAgICBjYXNlIEVUU0kzX0VUU0lBOgorICAgICAgICBjYXNlIEVUU0kyX1dPUkxEOgorICAgICAgICBjYXNlIEVUU0kzX1dPUkxEOgorICAgICAgICBjYXNlIEVUU0k0X1dPUkxEOgorICAgICAgICBjYXNlIEVUU0k0X0VUU0lDOgorICAgICAgICBjYXNlIEVUU0k1X1dPUkxEOgorICAgICAgICBjYXNlIEVUU0k2X1dPUkxEOgorICAgICAgICBjYXNlIEVUU0lfUkVTRVJWRUQ6CisgICAgICAgIGNhc2UgRVRTSTE6CisgICAgICAgIGNhc2UgRVRTSTI6CisgICAgICAgIGNhc2UgRVRTSTM6CisgICAgICAgIGNhc2UgRVRTSTQ6CisgICAgICAgIGNhc2UgRVRTSTU6CisgICAgICAgIGNhc2UgRVRTSTY6CisgICAgICAgIGNhc2UgRVRTSUE6CisgICAgICAgIGNhc2UgRVRTSUI6CisgICAgICAgIGNhc2UgRVRTSUM6CisgICAgICAgICAgICByZXR1cm4gMHgzMDsvL1dHX0VNRUEgRE9UMTFfUkVHX0RPTUFJTl9FVFNJICBNb3N0IG9mIEV1cm9wZQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNS0sxX01LS0E6CisgICAgICAgIGNhc2UgTUtLMV9NS0tCOgorICAgICAgICBjYXNlIE1LSzJfTUtLQToKKyAgICAgICAgY2FzZSBNS0sxX0ZDQ0E6CisgICAgICAgIGNhc2UgTUtLMV9NS0tBMToKKyAgICAgICAgY2FzZSBNS0sxX01LS0EyOgorICAgICAgICBjYXNlIE1LSzFfTUtLQzoKKyAgICAgICAgY2FzZSBNS0szX01LS0I6CisgICAgICAgIGNhc2UgTUtLM19NS0tBMjoKKyAgICAgICAgY2FzZSBNS0szX01LS0M6CisgICAgICAgIGNhc2UgTUtLNF9NS0tCOgorICAgICAgICBjYXNlIE1LSzRfTUtLQTI6CisgICAgICAgIGNhc2UgTUtLNF9NS0tDOgorICAgICAgICBjYXNlIE1LSzVfTUtLQjoKKyAgICAgICAgY2FzZSBNS0s1X01LS0EyOgorICAgICAgICBjYXNlIE1LSzVfTUtLQzoKKyAgICAgICAgY2FzZSBNS0s2X01LS0I6CisgICAgICAgIGNhc2UgTUtLNl9NS0tBMjoKKyAgICAgICAgY2FzZSBNS0s2X01LS0M6CisgICAgICAgIGNhc2UgTUtLN19NS0tCOgorICAgICAgICBjYXNlIE1LSzdfTUtLQToKKyAgICAgICAgY2FzZSBNS0s3X01LS0M6CisgICAgICAgIGNhc2UgTUtLOF9NS0tCOgorICAgICAgICBjYXNlIE1LSzhfTUtLQTI6CisgICAgICAgIGNhc2UgTUtLOF9NS0tDOgorICAgICAgICBjYXNlIE1LSzZfTUtLQTE6CisgICAgICAgIGNhc2UgTUtLNl9GQ0NBOgorICAgICAgICBjYXNlIE1LSzdfTUtLQTE6CisgICAgICAgIGNhc2UgTUtLN19GQ0NBOgorICAgICAgICBjYXNlIE1LSzlfRkNDQToKKyAgICAgICAgY2FzZSBNS0s5X01LS0ExOgorICAgICAgICBjYXNlIE1LSzlfTUtLQzoKKyAgICAgICAgY2FzZSBNS0s5X01LS0EyOgorICAgICAgICBjYXNlIE1LSzEwX0ZDQ0E6CisgICAgICAgIGNhc2UgTUtLMTBfTUtLQTE6CisgICAgICAgIGNhc2UgTUtLMTBfTUtLQzoKKyAgICAgICAgY2FzZSBNS0sxMF9NS0tBMjoKKyAgICAgICAgY2FzZSBNS0sxMV9NS0tBOgorICAgICAgICBjYXNlIE1LSzExX0ZDQ0E6CisgICAgICAgIGNhc2UgTUtLMTFfTUtLQTE6CisgICAgICAgIGNhc2UgTUtLMTFfTUtLQzoKKyAgICAgICAgY2FzZSBNS0sxMV9NS0tBMjoKKyAgICAgICAgY2FzZSBNS0sxMl9NS0tBOgorICAgICAgICBjYXNlIE1LSzEyX0ZDQ0E6CisgICAgICAgIGNhc2UgTUtLMTJfTUtLQTE6CisgICAgICAgIGNhc2UgTUtLMTJfTUtLQzoKKyAgICAgICAgY2FzZSBNS0sxMl9NS0tBMjoKKyAgICAgICAgY2FzZSBNS0szX01LS0E6CisgICAgICAgIGNhc2UgTUtLM19NS0tBMToKKyAgICAgICAgY2FzZSBNS0szX0ZDQ0E6CisgICAgICAgIGNhc2UgTUtLNF9NS0tBOgorICAgICAgICBjYXNlIE1LSzRfTUtLQTE6CisgICAgICAgIGNhc2UgTUtLNF9GQ0NBOgorICAgICAgICBjYXNlIE1LSzlfTUtLQToKKyAgICAgICAgY2FzZSBNS0sxMF9NS0tBOgorICAgICAgICBjYXNlIE1LSzE6CisgICAgICAgIGNhc2UgTUtLMjoKKyAgICAgICAgY2FzZSBNS0szOgorICAgICAgICBjYXNlIE1LSzQ6CisgICAgICAgIGNhc2UgTUtLNToKKyAgICAgICAgY2FzZSBNS0s2OgorICAgICAgICBjYXNlIE1LSzc6CisgICAgICAgIGNhc2UgTUtLODoKKyAgICAgICAgY2FzZSBNS0s5OgorICAgICAgICBjYXNlIE1LSzEwOgorICAgICAgICBjYXNlIE1LSzExOgorICAgICAgICBjYXNlIE1LSzEyOgorICAgICAgICBjYXNlIE1LS0E6CisgICAgICAgIGNhc2UgTUtLQzoKKyAgICAgICAgICAgIHJldHVybiAweDQwOy8vV0dfSkFQQU4gRE9UMTFfUkVHX0RPTUFJTl9NS0sgIEphcGFuCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAweEZGOy8vIERpZG4ndCBpbnB1dCBSZWdEbW4gYnkgbWVhbiB0byBkaXN0aW5ndWlzaCBieSBjdXN0b21lcgorCit9CisKKwordm9pZCB6ZkhwRGlzYWJsZURmc0NoYW5uZWwoemRldl90KiBkZXYsIHU4X3QgZGlzYWJsZUZsYWcpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXY9d2QtPmhwUHJpdmF0ZTsKKyAgICBocFByaXYtPmRpc2FibGVEZnNDaCA9IGRpc2FibGVGbGFnOworICAgIHJldHVybjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocHJlZy5oIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY4YzczZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocHJlZy5oCkBAIC0wLDAgKzEsNTI0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICBNb2R1bGUgTmFtZSA6IGhwcmVnLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgUmVndWxhdG9yeSBUYWJsZSBkZWZpbml0aW9ucy4gICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfSFBSRUdfSAorI2RlZmluZSBfSFBSRUdfSAorCit0eXBlZGVmIHUxNl90IEhBTF9DVFJZX0NPREU7CQkvKiBjb3VudHJ5IGNvZGUgKi8KK3R5cGVkZWYgdTE2X3QgSEFMX1JFR19ET01BSU47CQkvKiByZWd1bGF0b3J5IGRvbWFpbiBjb2RlICovCit0eXBlZGVmIGVudW0geworCUFIX0ZBTFNFID0gMCwJCS8qIE5COiBsb3RzIG9mIGNvZGUgYXNzdW1lcyBmYWxzZSBpcyB6ZXJvICovCisJQUhfVFJVRSAgPSAxLAorfSBIQUxfQk9PTDsKKworCisvKgorICogQ291bnRyeS9SZWdpb24gQ29kZXMgZnJvbSBNUyBXSU5OTFMuSAorICogTnVtYmVyaW5nIGZyb20gSVNPIDMxNjYKKyAqLworZW51bSBDb3VudHJ5Q29kZSB7CisgICAgQ1RSWV9BTEJBTklBICAgICAgICAgICAgICA9IDgsICAgICAgIC8qIEFsYmFuaWEgKi8KKyAgICBDVFJZX0FMR0VSSUEgICAgICAgICAgICAgID0gMTIsICAgICAgLyogQWxnZXJpYSAqLworICAgIENUUllfQVJHRU5USU5BICAgICAgICAgICAgPSAzMiwgICAgICAvKiBBcmdlbnRpbmEgKi8KKyAgICBDVFJZX0FSTUVOSUEgICAgICAgICAgICAgID0gNTEsICAgICAgLyogQXJtZW5pYSAqLworICAgIENUUllfQVVTVFJBTElBICAgICAgICAgICAgPSAzNiwgICAgICAvKiBBdXN0cmFsaWEgKi8KKyAgICBDVFJZX0FVU1RSSUEgICAgICAgICAgICAgID0gNDAsICAgICAgLyogQXVzdHJpYSAqLworICAgIENUUllfQVpFUkJBSUpBTiAgICAgICAgICAgPSAzMSwgICAgICAvKiBBemVyYmFpamFuICovCisgICAgQ1RSWV9CQUhSQUlOICAgICAgICAgICAgICA9IDQ4LCAgICAgIC8qIEJhaHJhaW4gKi8KKyAgICBDVFJZX0JFTEFSVVMgICAgICAgICAgICAgID0gMTEyLCAgICAgLyogQmVsYXJ1cyAqLworICAgIENUUllfQkVMR0lVTSAgICAgICAgICAgICAgPSA1NiwgICAgICAvKiBCZWxnaXVtICovCisgICAgQ1RSWV9CRUxJWkUgICAgICAgICAgICAgICA9IDg0LCAgICAgIC8qIEJlbGl6ZSAqLworICAgIENUUllfQk9MSVZJQSAgICAgICAgICAgICAgPSA2OCwgICAgICAvKiBCb2xpdmlhICovCisgICAgQ1RSWV9CT1NOSUEgICAgICAgICAgICAgICA9IDcwLCAgICAgIC8qIEJvc25pYSAqLworICAgIENUUllfQlJBWklMICAgICAgICAgICAgICAgPSA3NiwgICAgICAvKiBCcmF6aWwgKi8KKyAgICBDVFJZX0JSVU5FSV9EQVJVU1NBTEFNICAgID0gOTYsICAgICAgLyogQnJ1bmVpIERhcnVzc2FsYW0gKi8KKyAgICBDVFJZX0JVTEdBUklBICAgICAgICAgICAgID0gMTAwLCAgICAgLyogQnVsZ2FyaWEgKi8KKyAgICBDVFJZX0NBTkFEQSAgICAgICAgICAgICAgID0gMTI0LCAgICAgLyogQ2FuYWRhICovCisgICAgQ1RSWV9DSElMRSAgICAgICAgICAgICAgICA9IDE1MiwgICAgIC8qIENoaWxlICovCisgICAgQ1RSWV9DSElOQSAgICAgICAgICAgICAgICA9IDE1NiwgICAgIC8qIFBlb3BsZSdzIFJlcHVibGljIG9mIENoaW5hICovCisgICAgQ1RSWV9DT0xPTUJJQSAgICAgICAgICAgICA9IDE3MCwgICAgIC8qIENvbG9tYmlhICovCisgICAgQ1RSWV9DT1NUQV9SSUNBICAgICAgICAgICA9IDE4OCwgICAgIC8qIENvc3RhIFJpY2EgKi8KKyAgICBDVFJZX0NST0FUSUEgICAgICAgICAgICAgID0gMTkxLCAgICAgLyogQ3JvYXRpYSAqLworICAgIENUUllfQ1lQUlVTICAgICAgICAgICAgICAgPSAxOTYsICAgICAvKiBDeXBydXMgKi8KKyAgICBDVFJZX0NaRUNIICAgICAgICAgICAgICAgID0gMjAzLCAgICAgLyogQ3plY2ggUmVwdWJsaWMgKi8KKyAgICBDVFJZX0RFTk1BUksgICAgICAgICAgICAgID0gMjA4LCAgICAgLyogRGVubWFyayAqLworICAgIENUUllfRE9NSU5JQ0FOX1JFUFVCTElDICAgPSAyMTQsICAgICAvKiBEb21pbmljYW4gUmVwdWJsaWMgKi8KKyAgICBDVFJZX0VDVUFET1IgICAgICAgICAgICAgID0gMjE4LCAgICAgLyogRWN1YWRvciAqLworICAgIENUUllfRUdZUFQgICAgICAgICAgICAgICAgPSA4MTgsICAgICAvKiBFZ3lwdCAqLworICAgIENUUllfRUxfU0FMVkFET1IgICAgICAgICAgPSAyMjIsICAgICAvKiBFbCBTYWx2YWRvciAqLworICAgIENUUllfRVNUT05JQSAgICAgICAgICAgICAgPSAyMzMsICAgICAvKiBFc3RvbmlhICovCisgICAgQ1RSWV9GQUVST0VfSVNMQU5EUyAgICAgICA9IDIzNCwgICAgIC8qIEZhZXJvZSBJc2xhbmRzICovCisgICAgQ1RSWV9GSU5MQU5EICAgICAgICAgICAgICA9IDI0NiwgICAgIC8qIEZpbmxhbmQgKi8KKyAgICBDVFJZX0ZSQU5DRSAgICAgICAgICAgICAgID0gMjUwLCAgICAgLyogRnJhbmNlICovCisgICAgQ1RSWV9GUkFOQ0UyICAgICAgICAgICAgICA9IDI1NSwgICAgIC8qIEZyYW5jZTIgKi8KKyAgICBDVFJZX0dFT1JHSUEgICAgICAgICAgICAgID0gMjY4LCAgICAgLyogR2VvcmdpYSAqLworICAgIENUUllfR0VSTUFOWSAgICAgICAgICAgICAgPSAyNzYsICAgICAvKiBHZXJtYW55ICovCisgICAgQ1RSWV9HUkVFQ0UgICAgICAgICAgICAgICA9IDMwMCwgICAgIC8qIEdyZWVjZSAqLworICAgIENUUllfR1VBVEVNQUxBICAgICAgICAgICAgPSAzMjAsICAgICAvKiBHdWF0ZW1hbGEgKi8KKyAgICBDVFJZX0hPTkRVUkFTICAgICAgICAgICAgID0gMzQwLCAgICAgLyogSG9uZHVyYXMgKi8KKyAgICBDVFJZX0hPTkdfS09ORyAgICAgICAgICAgID0gMzQ0LCAgICAgLyogSG9uZyBLb25nIFMuQS5SLiwgUC5SLkMuICovCisgICAgQ1RSWV9IVU5HQVJZICAgICAgICAgICAgICA9IDM0OCwgICAgIC8qIEh1bmdhcnkgKi8KKyAgICBDVFJZX0lDRUxBTkQgICAgICAgICAgICAgID0gMzUyLCAgICAgLyogSWNlbGFuZCAqLworICAgIENUUllfSU5ESUEgICAgICAgICAgICAgICAgPSAzNTYsICAgICAvKiBJbmRpYSAqLworICAgIENUUllfSU5ET05FU0lBICAgICAgICAgICAgPSAzNjAsICAgICAvKiBJbmRvbmVzaWEgKi8KKyAgICBDVFJZX0lSQU4gICAgICAgICAgICAgICAgID0gMzY0LCAgICAgLyogSXJhbiAqLworICAgIENUUllfSVJBUSAgICAgICAgICAgICAgICAgPSAzNjgsICAgICAvKiBJcmFxICovCisgICAgQ1RSWV9JUkVMQU5EICAgICAgICAgICAgICA9IDM3MiwgICAgIC8qIElyZWxhbmQgKi8KKyAgICBDVFJZX0lTUkFFTCAgICAgICAgICAgICAgID0gMzc2LCAgICAgLyogSXNyYWVsICovCisgICAgQ1RSWV9JU1JBRUwyICAgICAgICAgICAgICA9IDM3NywgICAgIC8qIElzcmFlbDIgKi8KKyAgICBDVFJZX0lUQUxZICAgICAgICAgICAgICAgID0gMzgwLCAgICAgLyogSXRhbHkgKi8KKyAgICBDVFJZX0pBTUFJQ0EgICAgICAgICAgICAgID0gMzg4LCAgICAgLyogSmFtYWljYSAqLworICAgIENUUllfSkFQQU4gICAgICAgICAgICAgICAgPSAzOTIsICAgICAvKiBKYXBhbiAqLworICAgIENUUllfSkFQQU4xICAgICAgICAgICAgICAgPSAzOTMsICAgICAvKiBKYXBhbiAoSlAxKSAqLworICAgIENUUllfSkFQQU4yICAgICAgICAgICAgICAgPSAzOTQsICAgICAvKiBKYXBhbiAoSlAwKSAqLworICAgIENUUllfSkFQQU4zICAgICAgICAgICAgICAgPSAzOTUsICAgICAvKiBKYXBhbiAoSlAxLTEpICovCisgICAgQ1RSWV9KQVBBTjQgICAgICAgICAgICAgICA9IDM5NiwgICAgIC8qIEphcGFuIChKRTEpICovCisgICAgQ1RSWV9KQVBBTjUgICAgICAgICAgICAgICA9IDM5NywgICAgIC8qIEphcGFuIChKRTIpICovCisgICAgQ1RSWV9KQVBBTjYgICAgICAgICAgICAgICA9IDM5OSwgICAgIC8qIEphcGFuIChKUDYpICovCisKKyAgICBDVFJZX0pBUEFONwkgICAgICAgICAgICAgID0gNDAwNywgICAgLyogSmFwYW4gKEo3KSAqLworICAgIENUUllfSkFQQU44CSAgICAgICAgICAgICAgPSA0MDA4LCAgICAvKiBKYXBhbiAoSjgpICovCisgICAgQ1RSWV9KQVBBTjkgICAgICAgICAgICAgICA9IDQwMDksICAgIC8qIEphcGFuIChKOSkgKi8KKworICAgIENUUllfSkFQQU4xMCAgICAgICAgICAgICAgPSA0MDEwLCAgICAvKiBKYXBhbiAoSjEwKSAqLworICAgIENUUllfSkFQQU4xMSAgICAgICAgICAgICAgPSA0MDExLCAgICAvKiBKYXBhbiAoSjExKSAqLworICAgIENUUllfSkFQQU4xMiAgICAgICAgICAgICAgPSA0MDEyLCAgICAvKiBKYXBhbiAoSjEyKSAqLworCisgICAgQ1RSWV9KQVBBTjEzICAgICAgICAgICAgICA9IDQwMTMsICAgIC8qIEphcGFuIChKMTMpICovCisgICAgQ1RSWV9KQVBBTjE0ICAgICAgICAgICAgICA9IDQwMTQsICAgIC8qIEphcGFuIChKMTQpICovCisgICAgQ1RSWV9KQVBBTjE1ICAgICAgICAgICAgICA9IDQwMTUsICAgIC8qIEphcGFuIChKMTUpICovCisKKyAgICBDVFJZX0pBUEFOMTYgICAgICAgICAgICAgID0gNDAxNiwgICAgLyogSmFwYW4gKEoxNikgKi8KKyAgICBDVFJZX0pBUEFOMTcgICAgICAgICAgICAgID0gNDAxNywgICAgLyogSmFwYW4gKEoxNykgKi8KKyAgICBDVFJZX0pBUEFOMTggICAgICAgICAgICAgID0gNDAxOCwgICAgLyogSmFwYW4gKEoxOCkgKi8KKworICAgIENUUllfSkFQQU4xOSAgICAgICAgICAgICAgPSA0MDE5LCAgICAvKiBKYXBhbiAoSjE5KSAqLworICAgIENUUllfSkFQQU4yMCAgICAgICAgICAgICAgPSA0MDIwLCAgICAvKiBKYXBhbiAoSjIwKSAqLworICAgIENUUllfSkFQQU4yMSAgICAgICAgICAgICAgPSA0MDIxLCAgICAvKiBKYXBhbiAoSjIxKSAqLworCisgICAgQ1RSWV9KQVBBTjIyICAgICAgICAgICAgICA9IDQwMjIsICAgIC8qIEphcGFuIChKMjIpICovCisgICAgQ1RSWV9KQVBBTjIzICAgICAgICAgICAgICA9IDQwMjMsICAgIC8qIEphcGFuIChKMjMpICovCisgICAgQ1RSWV9KQVBBTjI0ICAgICAgICAgICAgICA9IDQwMjQsICAgIC8qIEphcGFuIChKMjQpICovCisKKyAgICBDVFJZX0pBUEFOMjUgICAgICAgICAgICAgID0gNDAyNSwgICAgLyogSmFwYW4gKEoyNSkgKi8KKyAgICBDVFJZX0pBUEFOMjYgICAgICAgICAgICAgID0gNDAyNiwgICAgLyogSmFwYW4gKEoyNikgKi8KKyAgICBDVFJZX0pBUEFOMjcgICAgICAgICAgICAgID0gNDAyNywgICAgLyogSmFwYW4gKEoyNykgKi8KKworICAgIENUUllfSkFQQU4yOCAgICAgICAgICAgICAgPSA0MDI4LCAgICAvKiBKYXBhbiAoSjI4KSAqLworICAgIENUUllfSkFQQU4yOSAgICAgICAgICAgICAgPSA0MDI5LCAgICAvKiBKYXBhbiAoSjI5KSAqLworICAgIENUUllfSkFQQU4zMCAgICAgICAgICAgICAgPSA0MDMwLCAgICAvKiBKYXBhbiAoSjMwKSAqLworCisgICAgQ1RSWV9KQVBBTjMxICAgICAgICAgICAgICA9IDQwMzEsICAgIC8qIEphcGFuIChKMzEpICovCisgICAgQ1RSWV9KQVBBTjMyICAgICAgICAgICAgICA9IDQwMzIsICAgIC8qIEphcGFuIChKMzIpICovCisgICAgQ1RSWV9KQVBBTjMzICAgICAgICAgICAgICA9IDQwMzMsICAgIC8qIEphcGFuIChKMzMpICovCisKKyAgICBDVFJZX0pBUEFOMzQgICAgICAgICAgICAgID0gNDAzNCwgICAgLyogSmFwYW4gKEozNCkgKi8KKyAgICBDVFJZX0pBUEFOMzUgICAgICAgICAgICAgID0gNDAzNSwgICAgLyogSmFwYW4gKEozNSkgKi8KKyAgICBDVFJZX0pBUEFOMzYgICAgICAgICAgICAgID0gNDAzNiwgICAgLyogSmFwYW4gKEozNikgKi8KKworICAgIENUUllfSkFQQU4zNyAgICAgICAgICAgICAgPSA0MDM3LCAgICAvKiBKYXBhbiAoSjM3KSAqLworICAgIENUUllfSkFQQU4zOCAgICAgICAgICAgICAgPSA0MDM4LCAgICAvKiBKYXBhbiAoSjM4KSAqLworICAgIENUUllfSkFQQU4zOSAgICAgICAgICAgICAgPSA0MDM5LCAgICAvKiBKYXBhbiAoSjM5KSAqLworCisgICAgQ1RSWV9KQVBBTjQwICAgICAgICAgICAgICA9IDQwNDAsICAgIC8qIEphcGFuIChKNDApICovCisgICAgQ1RSWV9KQVBBTjQxICAgICAgICAgICAgICA9IDQwNDEsICAgIC8qIEphcGFuIChKNDEpICovCisgICAgQ1RSWV9KQVBBTjQyICAgICAgICAgICAgICA9IDQwNDIsICAgIC8qIEphcGFuIChKNDIpICovCisgICAgQ1RSWV9KQVBBTjQzICAgICAgICAgICAgICA9IDQwNDMsICAgIC8qIEphcGFuIChKNDMpICovCisgICAgQ1RSWV9KQVBBTjQ0ICAgICAgICAgICAgICA9IDQwNDQsICAgIC8qIEphcGFuIChKNDQpICovCisgICAgQ1RSWV9KQVBBTjQ1ICAgICAgICAgICAgICA9IDQwNDUsICAgIC8qIEphcGFuIChKNDUpICovCisgICAgQ1RSWV9KQVBBTjQ2ICAgICAgICAgICAgICA9IDQwNDYsICAgIC8qIEphcGFuIChKNDYpICovCisgICAgQ1RSWV9KQVBBTjQ3ICAgICAgICAgICAgICA9IDQwNDcsICAgIC8qIEphcGFuIChKNDcpICovCisgICAgQ1RSWV9KQVBBTjQ4ICAgICAgICAgICAgICA9IDQwNDgsICAgIC8qIEphcGFuIChKNDgpICovCisgICAgQ1RSWV9KQVBBTjQ5ICAgICAgICAgICAgICA9IDQwNDksICAgIC8qIEphcGFuIChKNDkpICovCisKKyAgICBDVFJZX0pBUEFONTAgICAgICAgICAgICAgID0gNDA1MCwgICAgLyogSmFwYW4gKEo1MCkgKi8KKyAgICBDVFJZX0pBUEFONTEgICAgICAgICAgICAgID0gNDA1MSwgICAgLyogSmFwYW4gKEo1MSkgKi8KKyAgICBDVFJZX0pBUEFONTIgICAgICAgICAgICAgID0gNDA1MiwgICAgLyogSmFwYW4gKEo1MikgKi8KKyAgICBDVFJZX0pBUEFONTMgICAgICAgICAgICAgID0gNDA1MywgICAgLyogSmFwYW4gKEo1MykgKi8KKyAgICBDVFJZX0pBUEFONTQgICAgICAgICAgICAgID0gNDA1NCwgICAgLyogSmFwYW4gKEo1NCkgKi8KKworICAgIENUUllfSk9SREFOICAgICAgICAgICAgICAgPSA0MDAsICAgICAvKiBKb3JkYW4gKi8KKyAgICBDVFJZX0tBWkFLSFNUQU4gICAgICAgICAgID0gMzk4LCAgICAgLyogS2F6YWtoc3RhbiAqLworICAgIENUUllfS0VOWUEgICAgICAgICAgICAgICAgPSA0MDQsICAgICAvKiBLZW55YSAqLworICAgIENUUllfS09SRUFfTk9SVEggICAgICAgICAgPSA0MDgsICAgICAvKiBOb3J0aCBLb3JlYSAqLworICAgIENUUllfS09SRUFfUk9DICAgICAgICAgICAgPSA0MTAsICAgICAvKiBTb3V0aCBLb3JlYSAqLworICAgIENUUllfS09SRUFfUk9DMiAgICAgICAgICAgPSA0MTEsICAgICAvKiBTb3V0aCBLb3JlYSAqLworICAgIENUUllfS09SRUFfUk9DMyAgICAgICAgICAgPSA0MTIsICAgICAvKiBTb3V0aCBLb3JlYSAqLworICAgIENUUllfS1VXQUlUICAgICAgICAgICAgICAgPSA0MTQsICAgICAvKiBLdXdhaXQgKi8KKyAgICBDVFJZX0xBVFZJQSAgICAgICAgICAgICAgID0gNDI4LCAgICAgLyogTGF0dmlhICovCisgICAgQ1RSWV9MRUJBTk9OICAgICAgICAgICAgICA9IDQyMiwgICAgIC8qIExlYmFub24gKi8KKyAgICBDVFJZX0xJQllBICAgICAgICAgICAgICAgID0gNDM0LCAgICAgLyogTGlieWEgKi8KKyAgICBDVFJZX0xJRUNIVEVOU1RFSU4gICAgICAgID0gNDM4LCAgICAgLyogTGllY2h0ZW5zdGVpbiAqLworICAgIENUUllfTElUSFVBTklBICAgICAgICAgICAgPSA0NDAsICAgICAvKiBMaXRodWFuaWEgKi8KKyAgICBDVFJZX0xVWEVNQk9VUkcgICAgICAgICAgID0gNDQyLCAgICAgLyogTHV4ZW1ib3VyZyAqLworICAgIENUUllfTUFDQVUgICAgICAgICAgICAgICAgPSA0NDYsICAgICAvKiBNYWNhdSAqLworICAgIENUUllfTUFDRURPTklBICAgICAgICAgICAgPSA4MDcsICAgICAvKiB0aGUgRm9ybWVyIFl1Z29zbGF2IFJlcHVibGljIG9mIE1hY2Vkb25pYSAqLworICAgIENUUllfTUFMQVlTSUEgICAgICAgICAgICAgPSA0NTgsICAgICAvKiBNYWxheXNpYSAqLworICAgIENUUllfTUFMVEEJICAgICAgICAgICAgICA9IDQ3MCwgICAgIC8qIE1hbHRhICovCisgICAgQ1RSWV9NRVhJQ08gICAgICAgICAgICAgICA9IDQ4NCwgICAgIC8qIE1leGljbyAqLworICAgIENUUllfTU9OQUNPICAgICAgICAgICAgICAgPSA0OTIsICAgICAvKiBQcmluY2lwYWxpdHkgb2YgTW9uYWNvICovCisgICAgQ1RSWV9NT1JPQ0NPICAgICAgICAgICAgICA9IDUwNCwgICAgIC8qIE1vcm9jY28gKi8KKyAgICBDVFJZX05FVEhFUkxBTkRTICAgICAgICAgID0gNTI4LCAgICAgLyogTmV0aGVybGFuZHMgKi8KKyAgICBDVFJZX05FVEhFUkxBTkRTX0FOVCAgICAgID0gNTMwLCAgICAgLyogTmV0aGVybGFuZHMtQW50ZWxsaXMgKi8KKyAgICBDVFJZX05FV19aRUFMQU5EICAgICAgICAgID0gNTU0LCAgICAgLyogTmV3IFplYWxhbmQgKi8KKyAgICBDVFJZX05JQ0FSQUdVQSAgICAgICAgICAgID0gNTU4LCAgICAgLyogTmljYXJhZ3VhICovCisgICAgQ1RSWV9OT1JXQVkgICAgICAgICAgICAgICA9IDU3OCwgICAgIC8qIE5vcndheSAqLworICAgIENUUllfT01BTiAgICAgICAgICAgICAgICAgPSA1MTIsICAgICAvKiBPbWFuICovCisgICAgQ1RSWV9QQUtJU1RBTiAgICAgICAgICAgICA9IDU4NiwgICAgIC8qIElzbGFtaWMgUmVwdWJsaWMgb2YgUGFraXN0YW4gKi8KKyAgICBDVFJZX1BBTkFNQSAgICAgICAgICAgICAgID0gNTkxLCAgICAgLyogUGFuYW1hICovCisgICAgQ1RSWV9QQVJBR1VBWSAgICAgICAgICAgICA9IDYwMCwgICAgIC8qIFBhcmFndWF5ICovCisgICAgQ1RSWV9QRVJVICAgICAgICAgICAgICAgICA9IDYwNCwgICAgIC8qIFBlcnUgKi8KKyAgICBDVFJZX1BISUxJUFBJTkVTICAgICAgICAgID0gNjA4LCAgICAgLyogUmVwdWJsaWMgb2YgdGhlIFBoaWxpcHBpbmVzICovCisgICAgQ1RSWV9QT0xBTkQgICAgICAgICAgICAgICA9IDYxNiwgICAgIC8qIFBvbGFuZCAqLworICAgIENUUllfUE9SVFVHQUwgICAgICAgICAgICAgPSA2MjAsICAgICAvKiBQb3J0dWdhbCAqLworICAgIENUUllfUFVFUlRPX1JJQ08gICAgICAgICAgPSA2MzAsICAgICAvKiBQdWVydG8gUmljbyAqLworICAgIENUUllfUUFUQVIgICAgICAgICAgICAgICAgPSA2MzQsICAgICAvKiBRYXRhciAqLworICAgIENUUllfUk9NQU5JQSAgICAgICAgICAgICAgPSA2NDIsICAgICAvKiBSb21hbmlhICovCisgICAgQ1RSWV9SVVNTSUEgICAgICAgICAgICAgICA9IDY0MywgICAgIC8qIFJ1c3NpYSAqLworICAgIENUUllfU0FVRElfQVJBQklBICAgICAgICAgPSA2ODIsICAgICAvKiBTYXVkaSBBcmFiaWEgKi8KKyAgICBDVFJZX1NFUkJJQV9NT05UICAgICAgICAgID0gODkxLCAgICAgLyogU2VyYmlhIGFuZCBNb250ZW5lZ3JvICovCisgICAgQ1RSWV9TSU5HQVBPUkUgICAgICAgICAgICA9IDcwMiwgICAgIC8qIFNpbmdhcG9yZSAqLworICAgIENUUllfU0xPVkFLSUEgICAgICAgICAgICAgPSA3MDMsICAgICAvKiBTbG92YWsgUmVwdWJsaWMgKi8KKyAgICBDVFJZX1NMT1ZFTklBICAgICAgICAgICAgID0gNzA1LCAgICAgLyogU2xvdmVuaWEgKi8KKyAgICBDVFJZX1NPVVRIX0FGUklDQSAgICAgICAgID0gNzEwLCAgICAgLyogU291dGggQWZyaWNhICovCisgICAgQ1RSWV9TUEFJTiAgICAgICAgICAgICAgICA9IDcyNCwgICAgIC8qIFNwYWluICovCisgICAgQ1RSWV9TUklMQU5LQSAgICAgICAgICAgICA9IDE0NCwgICAgIC8qIFNyaWxhbmthICovCisgICAgQ1RSWV9TV0VERU4gICAgICAgICAgICAgICA9IDc1MiwgICAgIC8qIFN3ZWRlbiAqLworICAgIENUUllfU1dJVFpFUkxBTkQgICAgICAgICAgPSA3NTYsICAgICAvKiBTd2l0emVybGFuZCAqLworICAgIENUUllfU1lSSUEgICAgICAgICAgICAgICAgPSA3NjAsICAgICAvKiBTeXJpYSAqLworICAgIENUUllfVEFJV0FOICAgICAgICAgICAgICAgPSAxNTgsICAgICAvKiBUYWl3YW4gKi8KKyAgICBDVFJZX1RIQUlMQU5EICAgICAgICAgICAgID0gNzY0LCAgICAgLyogVGhhaWxhbmQgKi8KKyAgICBDVFJZX1RSSU5JREFEX1lfVE9CQUdPICAgID0gNzgwLCAgICAgLyogVHJpbmlkYWQgeSBUb2JhZ28gKi8KKyAgICBDVFJZX1RVTklTSUEgICAgICAgICAgICAgID0gNzg4LCAgICAgLyogVHVuaXNpYSAqLworICAgIENUUllfVFVSS0VZICAgICAgICAgICAgICAgPSA3OTIsICAgICAvKiBUdXJrZXkgKi8KKyAgICBDVFJZX1VBRSAgICAgICAgICAgICAgICAgID0gNzg0LCAgICAgLyogVS5BLkUuICovCisgICAgQ1RSWV9VS1JBSU5FICAgICAgICAgICAgICA9IDgwNCwgICAgIC8qIFVrcmFpbmUgKi8KKyAgICBDVFJZX1VOSVRFRF9LSU5HRE9NICAgICAgID0gODI2LCAgICAgLyogVW5pdGVkIEtpbmdkb20gKi8KKyAgICBDVFJZX1VOSVRFRF9TVEFURVMgICAgICAgID0gODQwLCAgICAgLyogVW5pdGVkIFN0YXRlcyAqLworICAgIENUUllfVU5JVEVEX1NUQVRFU19GQ0M0OSAgPSA4NDIsICAgICAvKiBVbml0ZWQgU3RhdGVzIChQdWJsaWMgU2FmZXR5KSovCisgICAgQ1RSWV9VUlVHVUFZICAgICAgICAgICAgICA9IDg1OCwgICAgIC8qIFVydWd1YXkgKi8KKyAgICBDVFJZX1VaQkVLSVNUQU4gICAgICAgICAgID0gODYwLCAgICAgLyogVXpiZWtpc3RhbiAqLworICAgIENUUllfVkVORVpVRUxBICAgICAgICAgICAgPSA4NjIsICAgICAvKiBWZW5lenVlbGEgKi8KKyAgICBDVFJZX1ZJRVRfTkFNICAgICAgICAgICAgID0gNzA0LCAgICAgLyogVmlldCBOYW0gKi8KKyAgICBDVFJZX1lFTUVOICAgICAgICAgICAgICAgID0gODg3LCAgICAgLyogWWVtZW4gKi8KKyAgICBDVFJZX1pJTUJBQldFICAgICAgICAgICAgID0gNzE2ICAgICAgLyogWmltYmFid2UgKi8KK307CisKKy8qIEVudW1lcmF0ZWQgUmVndWxhdG9yeSBEb21haW4gSW5mb3JtYXRpb24gOCBiaXQgdmFsdWVzIGluZGljYXRlIHRoYXQKKyAqIHRoZSByZWdkb21haW4gaXMgcmVhbGx5IGEgcGFpciBvZiB1bml0YXJ5IHJlZ2RvbWFpbnMuICAxMiBiaXQgdmFsdWVzCisgKiBhcmUgdGhlIHJlYWwgdW5pdGFyeSByZWdkb21haW5zIGFuZCBhcmUgdGhlIG9ubHkgb25lcyB3aGljaCBoYXZlIHRoZQorICogZnJlcXVlbmN5IGJpdG1hc2tzIGFuZCBmbGFncyBzZXQuCisgKi8KK2VudW0gRW51bVJkIHsKKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgcmVndWxhdG9yeSBkb21haW4gZGVmaW5pdGlvbnMgYXJlCisJICogZm91bmQgaW4gdGhlIEVFUFJPTS4gRWFjaCByZWd1bGF0b3J5IGRvbWFpbgorCSAqIGNhbiBvcGVyYXRlIGluIGVpdGhlciBhIDVHSHogb3IgMi40R0h6IHdpcmVsZXNzIG1vZGUgb3IKKwkgKiBib3RoIDVHSHogYW5kIDIuNEdIeiB3aXJlbGVzcyBtb2Rlcy4KKwkgKiBJbiBnZW5lcmFsLCB0aGUgdmFsdWUgaG9sZHMgbm8gc3BlY2lhbAorCSAqIG1lYW5pbmcgYW5kIGlzIHVzZWQgdG8gZGVjb2RlIGludG8gZWl0aGVyIHNwZWNpZmljCisJICogMi40R0h6IG9yIDVHSHogd2lyZWxlc3MgbW9kZSBmb3IgdGhhdCBwYXJ0aWN1bGFyCisJICogcmVndWxhdG9yeSBkb21haW4uCisJICovCisJTk9fRU5VTVJECT0gMHgwMCwKKwlOVUxMMV9XT1JMRAk9IDB4MDMsCQkvKiBGb3IgMTFiLW9ubHkgY291bnRyaWVzIChubyAxMWEgYWxsb3dlZCkgKi8KKwlOVUxMMV9FVFNJQgk9IDB4MDcsCQkvKiBJc3JhZWwgKi8KKwlOVUxMMV9FVFNJQwk9IDB4MDgsCisJRkNDMV9GQ0NBCT0gMHgxMCwJCS8qIFVTQSAqLworCUZDQzFfV09STEQJPSAweDExLAkJLyogSG9uZyBLb25nICovCisJRkNDNF9GQ0NBCT0gMHgxMiwJCS8qIFVTQSAtIFB1YmxpYyBTYWZldHkgKi8KKwlGQ0M1X0ZDQ0EJPSAweDEzLAkJLyogVVNBIC0gd2l0aCBubyBERlMgKFVOSUktMSArIFVOSUktMyBvbmx5KSAqLworICBGQ0M2X0ZDQ0EgICAgICAgPSAweDE0LCAgICAgICAgIC8qIENhbmFkYSAqLworCisJRkNDMl9GQ0NBCT0gMHgyMCwJCS8qIENhbmFkYSAqLworCUZDQzJfV09STEQJPSAweDIxLAkJLyogQXVzdHJhbGlhICYgSEsgKi8KKwlGQ0MyX0VUU0lDCT0gMHgyMiwKKyAgRkNDNl9XT1JMRCAgICAgID0gMHgyMywgICAgICAgICAvKiBBdXN0cmFsaWEgKi8KKworCUZSQU5DRV9SRVMJPSAweDMxLAkJLyogTGVnYWN5IEZyYW5jZSBmb3IgT0VNICovCisJRkNDM19GQ0NBCT0gMHgzQSwJCS8qIFVTQSAmIENhbmFkYSB3LzU0NzAgYmFuZCwgMTFoLCBERlMgZW5hYmxlZCAqLworCUZDQzNfV09STEQJPSAweDNCLAkJLyogVVNBICYgQ2FuYWRhIHcvNTQ3MCBiYW5kLCAxMWgsIERGUyBlbmFibGVkICovCisKKwlFVFNJMV9XT1JMRAk9IDB4MzcsCisJRVRTSTNfRVRTSUEJPSAweDMyLAkJLyogRnJhbmNlIChvcHRpb25hbCkgKi8KKwlFVFNJMl9XT1JMRAk9IDB4MzUsCQkvKiBIdW5nYXJ5ICYgb3RoZXJzICovCisJRVRTSTNfV09STEQJPSAweDM2LAkJLyogRnJhbmNlICYgb3RoZXJzICovCisJRVRTSTRfV09STEQJPSAweDMwLAorCUVUU0k0X0VUU0lDCT0gMHgzOCwKKwlFVFNJNV9XT1JMRAk9IDB4MzksCisJRVRTSTZfV09STEQJPSAweDM0LAkJLyogQnVsZ2FyaWEgKi8KKwlFVFNJX1JFU0VSVkVECT0gMHgzMywJCS8qIFJlc2VydmVkIChEbyBub3QgdXNlZCkgKi8KKworCU1LSzFfTUtLQQk9IDB4NDAsCQkvKiBKYXBhbiAoSlAxKSAqLworCU1LSzFfTUtLQgk9IDB4NDEsCQkvKiBKYXBhbiAoSlAwKSAqLworCUFQTDRfV09STEQJPSAweDQyLAkJLyogU2luZ2Fwb3JlICovCisJTUtLMl9NS0tBCT0gMHg0MywJCS8qIEphcGFuIHdpdGggNC45RyBjaGFubmVscyAqLworCUFQTF9SRVNFUlZFRAk9IDB4NDQsCQkvKiBSZXNlcnZlZCAoRG8gbm90IHVzZWQpICAqLworCUFQTDJfV09STEQJPSAweDQ1LAkJLyogS29yZWEgKi8KKwlBUEwyX0FQTEMJPSAweDQ2LAorCUFQTDNfV09STEQJPSAweDQ3LAorCU1LSzFfRkNDQQk9IDB4NDgsCQkvKiBKYXBhbiAoSlAxLTEpICovCisJQVBMMl9BUExECT0gMHg0OSwJCS8qIEtvcmVhIHdpdGggMi4zRyBjaGFubmVscyAqLworCU1LSzFfTUtLQTEJPSAweDRBLAkJLyogSmFwYW4gKEpFMSkgKi8KKwlNS0sxX01LS0EyCT0gMHg0QiwJCS8qIEphcGFuIChKRTIpICovCisJTUtLMV9NS0tDCT0gMHg0QywJCS8qIEphcGFuIChNS0sxX01LS0EsZXhjZXB0IENoMTQpICovCisKKwlBUEwzX0ZDQ0EgICA9IDB4NTAsCisJQVBMMV9XT1JMRAk9IDB4NTIsCQkvKiBMYXRpbiBBbWVyaWNhICovCisJQVBMMV9GQ0NBCT0gMHg1MywKKwlBUEwxX0FQTEEJPSAweDU0LAorCUFQTDFfRVRTSUMJPSAweDU1LAorCUFQTDJfRVRTSUMJPSAweDU2LAkJLyogVmVuZXp1ZWxhICovCisJQVBMMl9GQ0NBICAgPSAweDU3LCAJLyogbmV3IExhdGluIEFtZXJpY2EgKi8KKwlBUEw1X1dPUkxECT0gMHg1OCwJCS8qIENoaWxlICovCisJQVBMNl9XT1JMRAk9IDB4NUIsCQkvKiBTaW5nYXBvcmUgKi8KKwlBUEw3X0ZDQ0EgICA9IDB4NUMsICAgICAvKiBUYWl3YW4gNS40NyBCYW5kICovCisJQVBMOF9XT1JMRCAgPSAweDVELCAgICAgLyogTWFsYXlzaWEgNUdIeiAqLworCUFQTDlfV09STEQgID0gMHg1RSwgICAgIC8qIEtvcmVhIDVHSHogKi8KKworCS8qCisJICogV29ybGQgbW9kZSBTS1VzCisJICovCisJV09SMF9XT1JMRAk9IDB4NjAsCQkvKiBXb3JsZDAgKFdPMCBTS1UpICovCisJV09SMV9XT1JMRAk9IDB4NjEsCQkvKiBXb3JsZDEgKFdPMSBTS1UpICovCisJV09SMl9XT1JMRAk9IDB4NjIsCQkvKiBXb3JsZDIgKFdPMiBTS1UpICovCisJV09SM19XT1JMRAk9IDB4NjMsCQkvKiBXb3JsZDMgKFdPMyBTS1UpICovCisJV09SNF9XT1JMRAk9IDB4NjQsCQkvKiBXb3JsZDQgKFdPNCBTS1UpICovCisJV09SNV9FVFNJQwk9IDB4NjUsCQkvKiBXb3JsZDUgKFdPNSBTS1UpICovCisKKwlXT1IwMV9XT1JMRAk9IDB4NjYsCQkvKiBXb3JsZDAtMSAoV1cwLTEgU0tVKSAqLworCVdPUjAyX1dPUkxECT0gMHg2NywJCS8qIFdvcmxkMC0yIChXVzAtMiBTS1UpICovCisJRVUxX1dPUkxECT0gMHg2OCwJCS8qIFNhbWUgYXMgV29ybGQwLTIgKFdXMC0yIFNLVSksIGV4Y2VwdCBhY3RpdmUgc2NhbiBjaDEtMTMuIE5vIGNoMTQgKi8KKworCVdPUjlfV09STEQJPSAweDY5LAkJLyogV29ybGQ5IChXTzkgU0tVKSAqLworCVdPUkFfV09STEQJPSAweDZBLAkJLyogV29ybGRBIChXT0EgU0tVKSAqLworCisJTUtLM19NS0tCCT0gMHg4MCwJCS8qIEphcGFuIFVOSS0xIGV2ZW4gKyBNS0tCICovCisJTUtLM19NS0tBMgk9IDB4ODEsCQkvKiBKYXBhbiBVTkktMSBldmVuICsgTUtLQTIgKi8KKwlNS0szX01LS0MJPSAweDgyLAkJLyogSmFwYW4gVU5JLTEgZXZlbiArIE1LS0MgKi8KKworCU1LSzRfTUtLQgk9IDB4ODMsCQkvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTIgKyBNS0tCICovCisJTUtLNF9NS0tBMgk9IDB4ODQsCQkvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTIgKyBNS0tBMiAqLworCU1LSzRfTUtLQwk9IDB4ODUsCQkvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTIgKyBNS0tDICovCisKKwlNS0s1X01LS0IJPSAweDg2LAkJLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0yICsgbWlkLWJhbmQgKyBNS0tCICovCisJTUtLNV9NS0tBMgk9IDB4ODcsCQkvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTIgKyBtaWQtYmFuZCArIE1LS0EyICovCisJTUtLNV9NS0tDCT0gMHg4OCwJCS8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMiArIG1pZC1iYW5kICsgTUtLQyAqLworCisJTUtLNl9NS0tCCT0gMHg4OSwJCS8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMSBvZGQgTUtLQiAqLworCU1LSzZfTUtLQTIJPSAweDhBLAkJLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0xIG9kZCArIE1LS0EyICovCisJTUtLNl9NS0tDCT0gMHg4QiwJCS8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMSBvZGQgKyBNS0tDICovCisKKwlNS0s3X01LS0IJPSAweDhDLAkJLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0xIG9kZCArIFVOSS0yICsgTUtLQiAqLworCU1LSzdfTUtLQQk9IDB4OEQsCQkvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTEgb2RkICsgVU5JLTIgKyBNS0tBMiAqLworCU1LSzdfTUtLQwk9IDB4OEUsCQkvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTEgb2RkICsgVU5JLTIgKyBNS0tDICovCisKKwlNS0s4X01LS0IJPSAweDhGLAkJLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0xIG9kZCArIFVOSS0yICsgbWlkLWJhbmQgKyBNS0tCICovCisJTUtLOF9NS0tBMgk9IDB4OTAsCQkvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTEgb2RkICsgVU5JLTIgKyBtaWQtYmFuZCArIE1LS0EyICovCisJTUtLOF9NS0tDCT0gMHg5MSwJCS8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMSBvZGQgKyBVTkktMiArIG1pZC1iYW5kICsgTUtLQyAqLworCisJTUtLNl9NS0tBMSAgICAgID0gMHhGOCwgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTEgb2RkICsgTUtLQTEgKi8KKwlNS0s2X0ZDQ0EgICAgICAgPSAweEY5LCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMSBvZGQgKyBGQ0NBICovCisJTUtLN19NS0tBMSAgICAgID0gMHhGQSwgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTEgb2RkICsgVU5JLTIgKyBNS0tBMSAqLworCU1LSzdfRkNDQSAgICAgICA9IDB4RkIsICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0xIG9kZCArIFVOSS0yICsgRkNDQSAqLworCU1LSzlfRkNDQSAgICAgICA9IDB4RkMsICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIDQuOUdIeiArIEZDQ0EgKi8KKwlNS0s5X01LS0ExICAgICAgPSAweEZELCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyA0LjlHSHogKyBNS0tBMSAqLworCU1LSzlfTUtLQyAgICAgICA9IDB4RkUsICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIDQuOUdIeiArIE1LS0MgKi8KKwlNS0s5X01LS0EyICAgICAgPSAweEZGLCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyA0LjlHSHogKyBNS0tBMiAqLworCisJTUtLMTBfRkNDQSAgICAgID0gMHhEMCwgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTIgKyA0LjlHSHogKyBGQ0NBICovCisJTUtLMTBfTUtLQTEgICAgID0gMHhEMSwgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTIgKyA0LjlHSHogKyBNS0tBMSAqLworCU1LSzEwX01LS0MgICAgICA9IDB4RDIsICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0yICsgNC45R0h6ICsgTUtLQyAqLworCU1LSzEwX01LS0EyICAgICA9IDB4RDMsICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0yICsgNC45R0h6ICsgTUtLQTIgKi8KKworCU1LSzExX01LS0EgICAgICA9IDB4RDQsICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0yICsgTWlkYmFuZCArIDQuOUdIeiArIE1LS0EgKi8KKwlNS0sxMV9GQ0NBICAgICAgPSAweEQ1LCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMiArIE1pZGJhbmQgKyA0LjlHSHogKyBGQ0NBICovCisJTUtLMTFfTUtLQTEgICAgID0gMHhENiwgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTIgKyBNaWRiYW5kICsgNC45R0h6ICsgTUtLQTEgKi8KKwlNS0sxMV9NS0tDICAgICAgPSAweEQ3LCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMiArIE1pZGJhbmQgKyA0LjlHSHogKyBNS0tDICovCisJTUtLMTFfTUtLQTIgICAgID0gMHhEOCwgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTIgKyBNaWRiYW5kICsgNC45R0h6ICsgTUtLQTIgKi8KKworCU1LSzEyX01LS0EgICAgICA9IDB4RDksICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0xIG9kZCArIFVOSS0yICsgTWlkYmFuZCArIDQuOUdIeiArIE1LS0EgKi8KKwlNS0sxMl9GQ0NBICAgICAgPSAweERBLCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMSBvZGQgKyBVTkktMiArIE1pZGJhbmQgKyA0LjlHSHogKyBGQ0NBICovCisJTUtLMTJfTUtLQTEgICAgID0gMHhEQiwgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTEgb2RkICsgVU5JLTIgKyBNaWRiYW5kICsgNC45R0h6ICsgTUtLQTEgKi8KKwlNS0sxMl9NS0tDICAgICAgPSAweERDLCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMSBvZGQgKyBVTkktMiArIE1pZGJhbmQgKyA0LjlHSHogKyBNS0tDICovCisJTUtLMTJfTUtLQTIgICAgID0gMHhERCwgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgVU5JLTEgb2RkICsgVU5JLTIgKyBNaWRiYW5kICsgNC45R0h6ICsgTUtLQTIgKi8KKworCS8qIEZvbGxvd2luZyBkZWZpbml0aW9ucyBhcmUgdXNlZCBvbmx5IGJ5IHMvdyB0byBtYXAgb2xkCisgCSAqIEphcGFuIFNLVXMuCisJICovCisJTUtLM19NS0tBICAgICAgID0gMHhGMCwgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgTUtLQSAqLworCU1LSzNfTUtLQTEgICAgICA9IDB4RjEsICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIE1LS0ExICovCisJTUtLM19GQ0NBICAgICAgID0gMHhGMiwgICAgICAgICAvKiBKYXBhbiBVTkktMSBldmVuICsgRkNDQSAqLworCU1LSzRfTUtLQSAgICAgICA9IDB4RjMsICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0yICsgTUtLQSAqLworCU1LSzRfTUtLQTEgICAgICA9IDB4RjQsICAgICAgICAgLyogSmFwYW4gVU5JLTEgZXZlbiArIFVOSS0yICsgTUtLQTEgKi8KKwlNS0s0X0ZDQ0EgICAgICAgPSAweEY1LCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMiArIEZDQ0EgKi8KKwlNS0s5X01LS0EgICAgICAgPSAweEY2LCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyA0LjlHSHogKyBNS0tBKi8KKwlNS0sxMF9NS0tBICAgICAgPSAweEY3LCAgICAgICAgIC8qIEphcGFuIFVOSS0xIGV2ZW4gKyBVTkktMiArIDQuOUdIeiArIE1LS0EgKi8KKworCS8qCisJICogUmVndWxhdG9yIGRvbWFpbnMgZW5kaW5nIGluIGEgbnVtYmVyIChlLmcuIEFQTDEsCisJICogTUsxLCBFVFNJNCwgZXRjKSBhcHBseSB0byA1R0h6IGNoYW5uZWwgYW5kIHBvd2VyCisJICogaW5mb3JtYXRpb24uICBSZWd1bGF0b3IgZG9tYWlucyBlbmRpbmcgaW4gYSBsZXR0ZXIKKwkgKiAoZS5nLiBBUExBLCBGQ0NBLCBldGMpIGFwcGx5IHRvIDIuNEdIeiBjaGFubmVsIGFuZAorCSAqIHBvd2VyIGluZm9ybWF0aW9uLgorCSAqLworCUFQTDEJCT0gMHgwMTUwLAkvKiBMQVQgJiBBc2lhICovCisJQVBMMgkJPSAweDAyNTAsCS8qIExBVCAmIEFzaWEgKi8KKwlBUEwzCQk9IDB4MDM1MCwJLyogVGFpd2FuICovCisJQVBMNAkJPSAweDA0NTAsCS8qIEpvcmRhbiAqLworCUFQTDUJCT0gMHgwNTUwLAkvKiBDaGlsZSAqLworCUFQTDYJCT0gMHgwNjUwLAkvKiBTaW5nYXBvcmUgKi8KKwlBUEw3CQk9IDB4MDc1MCwJLyogVGFpd2FuIE1pZGRsZSAqLworCUFQTDgJCT0gMHgwODUwLAkvKiBNYWxheXNpYSAqLworCUFQTDkJCT0gMHgwOTUwLAkvKiBLb3JlYSAoU291dGgpIFJPQyAzICovCisKKwlFVFNJMQkJPSAweDAxMzAsCS8qIEV1cm9wZSAmIG90aGVycyAqLworCUVUU0kyCQk9IDB4MDIzMCwJLyogRXVyb3BlICYgb3RoZXJzICovCisJRVRTSTMJCT0gMHgwMzMwLAkvKiBFdXJvcGUgJiBvdGhlcnMgKi8KKwlFVFNJNAkJPSAweDA0MzAsCS8qIEV1cm9wZSAmIG90aGVycyAqLworCUVUU0k1CQk9IDB4MDUzMCwJLyogRXVyb3BlICYgb3RoZXJzICovCisJRVRTSTYJCT0gMHgwNjMwLAkvKiBFdXJvcGUgJiBvdGhlcnMgKi8KKwlFVFNJQQkJPSAweDBBMzAsCS8qIEZyYW5jZSAqLworCUVUU0lCCQk9IDB4MEIzMCwJLyogSXNyYWVsICovCisJRVRTSUMJCT0gMHgwQzMwLAkvKiBMYXRpbiBBbWVyaWNhICovCisKKwlGQ0MxCQk9IDB4MDExMCwJLyogVVMgJiBvdGhlcnMgKi8KKwlGQ0MyCQk9IDB4MDEyMCwJLyogQ2FuYWRhLCBBdXN0cmFsaWEgJiBOZXcgWmVhbGFuZCAqLworCUZDQzMJCT0gMHgwMTYwLAkvKiBVUyB3L25ldyBtaWRkbGUgYmFuZCAmIERGUyAqLworCUZDQzQJCT0gMHgwMTY1LAkvKiBVUyBQdWJsaWMgU2FmZXR5ICovCisJRkNDNQkJPSAweDA1MTAsCS8qIFVTIG5vIERGUyAqLworICAgIEZDQzYgICAgPSAweDA2MTAsIC8qIENhbmFkYSAmIEF1c3RyYWxpYSAqLworCisJRkNDQQkJPSAweDBBMTAsCisKKwlBUExECQk9IDB4MEQ1MCwJLyogU291dGggS29yZWEgKi8KKworCU1LSzEJCT0gMHgwMTQwLAkvKiBKYXBhbiAoVU5JLTEgb2RkKSovCisJTUtLMgkJPSAweDAyNDAsCS8qIEphcGFuICg0LjkgR0h6ICsgVU5JLTEgb2RkKSAqLworCU1LSzMJCT0gMHgwMzQwLAkvKiBKYXBhbiAoVU5JLTEgZXZlbikgKi8KKwlNS0s0CQk9IDB4MDQ0MCwJLyogSmFwYW4gKFVOSS0xIGV2ZW4gKyBVTkktMikgKi8KKwlNS0s1CQk9IDB4MDU0MCwJLyogSmFwYW4gKFVOSS0xIGV2ZW4gKyBVTkktMiArIG1pZC1iYW5kKSAqLworCU1LSzYJCT0gMHgwNjQwLAkvKiBKYXBhbiAoVU5JLTEgb2RkICsgVU5JLTEgZXZlbikgKi8KKwlNS0s3CQk9IDB4MDc0MCwJLyogSmFwYW4gKFVOSS0xIG9kZCArIFVOSS0xIGV2ZW4gKyBVTkktMiAqLworCU1LSzgJCT0gMHgwODQwLAkvKiBKYXBhbiAoVU5JLTEgb2RkICsgVU5JLTEgZXZlbiArIFVOSS0yICsgbWlkLWJhbmQpICovCisJTUtLOQkJPSAweDA5NDAsICAgLyogSmFwYW4gKFVOSS0xIGV2ZW4gKyA0LjkgR0haKSAqLworCU1LSzEwCQk9IDB4MEI0MCwgICAvKiBKYXBhbiAoVU5JLTEgZXZlbiArIFVOSS0yICsgNC45IEdIWikgKi8KKwlNS0sxMQkJPSAweDExNDAsICAgLyogSmFwYW4gKFVOSS0xIGV2ZW4gKyBVTkktMiArIG1pZC1iYW5kICsgNC45IEdIWikgKi8KKwlNS0sxMgkJPSAweDEyNDAsICAgLyogSmFwYW4gKFVOSS0xIGV2ZW4gKyBVTkktMSBvZGQgKyBVTkktMiArIG1pZC1iYW5kICsgNC45IEdIWikgKi8KKwlNS0tBCQk9IDB4MEE0MCwJLyogSmFwYW4gKi8KKwlNS0tDCQk9IDB4MEE1MCwKKworCU5VTEwxCQk9IDB4MDE5OCwKKwlXT1JMRAkJPSAweDAxOTksCisJREVCVUdfUkVHX0RNTgk9IDB4MDFmZiwKK307CisKKy8qIGNoYW5uZWxGbGFncyAqLworI2RlZmluZQlaTV9SRUdfRkxBR19DSEFOTkVMX0NXX0lOVAkweDAwMDIJLyogQ1cgaW50ZXJmZXJlbmNlIGRldGVjdGVkIG9uIGNoYW5uZWwgKi8KKyNkZWZpbmUJWk1fUkVHX0ZMQUdfQ0hBTk5FTF9UVVJCTwkweDAwMTAJLyogVHVyYm8gQ2hhbm5lbCAqLworI2RlZmluZQlaTV9SRUdfRkxBR19DSEFOTkVMX0NDSwkgICAgMHgwMDIwCS8qIENDSyBjaGFubmVsICovCisjZGVmaW5lCVpNX1JFR19GTEFHX0NIQU5ORUxfT0ZETQkweDAwNDAJLyogT0ZETSBjaGFubmVsICovCisjZGVmaW5lCVpNX1JFR19GTEFHX0NIQU5ORUxfMkdIWgkweDAwODAJLyogMiBHSHogc3BlY3RydW0gY2hhbm5lbC4gKi8KKyNkZWZpbmUJWk1fUkVHX0ZMQUdfQ0hBTk5FTF81R0haCTB4MDEwMAkvKiA1IEdIeiBzcGVjdHJ1bSBjaGFubmVsICovCisjZGVmaW5lCVpNX1JFR19GTEFHX0NIQU5ORUxfUEFTU0lWRQkweDAyMDAJLyogT25seSBwYXNzaXZlIHNjYW4gYWxsb3dlZCBpbiB0aGUgY2hhbm5lbCAqLworI2RlZmluZQlaTV9SRUdfRkxBR19DSEFOTkVMX0RZTgkgICAgMHgwNDAwCS8qIGR5bmFtaWMgQ0NLLU9GRE0gY2hhbm5lbCAqLworI2RlZmluZQlaTV9SRUdfRkxBR19DSEFOTkVMX1hSCSAgICAweDA4MDAJLyogWFIgY2hhbm5lbCAqLworI2RlZmluZQlaTV9SRUdfRkxBR19DSEFOTkVMX0NTQSAJMHgxMDAwCS8qIENoYW5uZWwgYnkgQ1NBKENoYW5uZWwgU3dpdGNoIEFubm91bmNlbWVudCkgKi8KKyNkZWZpbmUJWk1fUkVHX0ZMQUdfQ0hBTk5FTF9TVFVSQk8JMHgyMDAwCS8qIFN0YXRpYyB0dXJibywgbm8gMTFhLW9ubHkgdXNhZ2UgKi8KKyNkZWZpbmUgWk1fUkVHX0ZMQUdfQ0hBTk5FTF9IQUxGICAgIDB4NDAwMCAJLyogSGFsZiByYXRlIGNoYW5uZWwgKi8KKyNkZWZpbmUgWk1fUkVHX0ZMQUdfQ0hBTk5FTF9RVUFSVEVSIDB4ODAwMCAJLyogUXVhcnRlciByYXRlIGNoYW5uZWwgKi8KKworLyogY2hhbm5lbEZsYWdzICovCisjZGVmaW5lIENIQU5ORUxfQ1dfSU5UICAweDAwMDIgIC8qIENXIGludGVyZmVyZW5jZSBkZXRlY3RlZCBvbiBjaGFubmVsICovCisjZGVmaW5lIENIQU5ORUxfVFVSQk8gICAweDAwMTAgIC8qIFR1cmJvIENoYW5uZWwgKi8KKyNkZWZpbmUgQ0hBTk5FTF9DQ0sgMHgwMDIwICAvKiBDQ0sgY2hhbm5lbCAqLworI2RlZmluZSBDSEFOTkVMX09GRE0gICAgMHgwMDQwICAvKiBPRkRNIGNoYW5uZWwgKi8KKyNkZWZpbmUgQ0hBTk5FTF8yR0haICAgIDB4MDA4MCAgLyogMiBHSHogc3BlY3RydW0gY2hhbm5lbC4gKi8KKyNkZWZpbmUgQ0hBTk5FTF81R0haICAgIDB4MDEwMCAgLyogNSBHSHogc3BlY3RydW0gY2hhbm5lbCAqLworI2RlZmluZSBDSEFOTkVMX1BBU1NJVkUgMHgwMjAwICAvKiBPbmx5IHBhc3NpdmUgc2NhbiBhbGxvd2VkIGluIHRoZSBjaGFubmVsICovCisjZGVmaW5lIENIQU5ORUxfRFlOIDB4MDQwMCAgLyogZHluYW1pYyBDQ0stT0ZETSBjaGFubmVsICovCisjZGVmaW5lIENIQU5ORUxfWFIgIDB4MDgwMCAgLyogWFIgY2hhbm5lbCAqLworI2RlZmluZSBDSEFOTkVMX1NUVVJCTyAgMHgyMDAwICAvKiBTdGF0aWMgdHVyYm8sIG5vIDExYS1vbmx5IHVzYWdlICovCisjZGVmaW5lIENIQU5ORUxfSEFMRiAgICAweDQwMDAgIC8qIEhhbGYgcmF0ZSBjaGFubmVsICovCisjZGVmaW5lIENIQU5ORUxfUVVBUlRFUiAweDgwMDAgIC8qIFF1YXJ0ZXIgcmF0ZSBjaGFubmVsICovCisjZGVmaW5lIENIQU5ORUxfSFQyMCAgICAweDEwMDAwIC8qIEhUMjAgY2hhbm5lbCAqLworI2RlZmluZSBDSEFOTkVMX0hUNDAgICAgMHgyMDAwMCAvKiBIVDQwIGNoYW5uZWwgKi8KKyNkZWZpbmUgQ0hBTk5FTF9IVDQwVSAJMHg0MDAwMCAvKiBjb250cm9sIGNoYW5uZWwgY2FuIGJlIHVwcGVyIGNoYW5uZWwgKi8KKyNkZWZpbmUgQ0hBTk5FTF9IVDQwTCAJMHg4MDAwMCAvKiBjb250cm9sIGNoYW5uZWwgY2FuIGJlIGxvd2VyIGNoYW5uZWwgKi8KKworLyogcHJpdkZsYWdzICovCisjZGVmaW5lIFpNX1JFR19GTEFHX0NIQU5ORUxfSU5URVJGRVJFTkNFICAgCTB4MDEgLyogU29mdHdhcmUgdXNlOiBjaGFubmVsIGludGVyZmVyZW5jZQorCQkJCSAgICAgICAgdXNlZCBmb3IgYXMgQVIgYXMgd2VsbCBhcyBSQURBUgorCQkJCSAgICAgICAgaW50ZXJmZXJlbmNlIGRldGVjdGlvbiAqLworI2RlZmluZSBaTV9SRUdfRkxBR19DSEFOTkVMX0RGUwkJMHgwMiAvKiBERlMgcmVxdWlyZWQgb24gY2hhbm5lbCAqLworI2RlZmluZSBaTV9SRUdfRkxBR19DSEFOTkVMXzRNU19MSU1JVAkweDA0IC8qIDRtc2VjIHBhY2tldCBsaW1pdCBvbiB0aGlzIGNoYW5uZWwgKi8KKyNkZWZpbmUgWk1fUkVHX0ZMQUdfQ0hBTk5FTF9ERlNfQ0xFQVIgICAgICAgMHgwOCAvKiBpZiBjaGFubmVsIGhhcyBiZWVuIGNoZWNrZWQgZm9yIERGUyAqLworCisjZGVmaW5lIENIQU5ORUxfQSAgIChDSEFOTkVMXzVHSFp8Q0hBTk5FTF9PRkRNKQorI2RlZmluZSBDSEFOTkVMX0IgICAoQ0hBTk5FTF8yR0hafENIQU5ORUxfQ0NLKQorI2RlZmluZSBDSEFOTkVMX1BVUkVHICAgKENIQU5ORUxfMkdIWnxDSEFOTkVMX09GRE0pCisjaWZkZWYgbm90ZGVmCisjZGVmaW5lIENIQU5ORUxfRyAgIChDSEFOTkVMXzJHSFp8Q0hBTk5FTF9EWU4pCisjZWxzZQorI2RlZmluZSBDSEFOTkVMX0cgICAoQ0hBTk5FTF8yR0hafENIQU5ORUxfT0ZETSkKKyNlbmRpZgorI2RlZmluZSBDSEFOTkVMX1QgICAoQ0hBTk5FTF81R0hafENIQU5ORUxfT0ZETXxDSEFOTkVMX1RVUkJPKQorI2RlZmluZSBDSEFOTkVMX1NUICAoQ0hBTk5FTF9UfENIQU5ORUxfU1RVUkJPKQorI2RlZmluZSBDSEFOTkVMXzEwOEcgICAgKENIQU5ORUxfMkdIWnxDSEFOTkVMX09GRE18Q0hBTk5FTF9UVVJCTykKKyNkZWZpbmUgQ0hBTk5FTF8xMDhBICAgIENIQU5ORUxfVAorI2RlZmluZSBDSEFOTkVMX1ggICAoQ0hBTk5FTF81R0hafENIQU5ORUxfT0ZETXxDSEFOTkVMX1hSKQorI2RlZmluZSBDSEFOTkVMX0dfSFQgICAgICAoQ0hBTk5FTF8yR0haIHwgQ0hBTk5FTF9PRkRNIHwgQ0hBTk5FTF9IVDIwKQorI2RlZmluZSBDSEFOTkVMX0FfSFQgICAgICAoQ0hBTk5FTF81R0haIHwgQ0hBTk5FTF9PRkRNIHwgQ0hBTk5FTF9IVDIwKQorCisjZGVmaW5lIENIQU5ORUxfR19IVDIwICAoQ0hBTk5FTF8yR0hafENIQU5ORUxfSFQyMCkKKyNkZWZpbmUgQ0hBTk5FTF9BX0hUMjAgIChDSEFOTkVMXzVHSFp8Q0hBTk5FTF9IVDIwKQorI2RlZmluZSBDSEFOTkVMX0dfSFQ0MCAgKENIQU5ORUxfMkdIWnxDSEFOTkVMX0hUMjB8Q0hBTk5FTF9IVDQwKQorI2RlZmluZSBDSEFOTkVMX0FfSFQ0MCAgKENIQU5ORUxfNUdIWnxDSEFOTkVMX0hUMjB8Q0hBTk5FTF9IVDQwKQorI2RlZmluZSBDSEFOTkVMX0FMTCBcCisgICAgKENIQU5ORUxfT0ZETXxDSEFOTkVMX0NDS3wgQ0hBTk5FTF8yR0haIHwgQ0hBTk5FTF81R0haIHwgQ0hBTk5FTF9UVVJCTyB8IENIQU5ORUxfSFQyMCB8IENIQU5ORUxfSFQ0MCkKKyNkZWZpbmUgQ0hBTk5FTF9BTExfTk9UVVJCTyAgICAgKENIQU5ORUxfQUxMICZ+IENIQU5ORUxfVFVSQk8pCisKK2VudW0geworICAgIEhBTF9NT0RFXzExQSAgICA9IDB4MDAxLCAgICAgICAgLyogMTFhIGNoYW5uZWxzICovCisgICAgSEFMX01PREVfVFVSQk8gID0gMHgwMDIsICAgICAgICAvKiAxMWEgdHVyYm8tb25seSBjaGFubmVscyAqLworICAgIEhBTF9NT0RFXzExQiAgICA9IDB4MDA0LCAgICAgICAgLyogMTFiIGNoYW5uZWxzICovCisgICAgSEFMX01PREVfUFVSRUcgID0gMHgwMDgsICAgICAgICAvKiAxMWcgY2hhbm5lbHMgKE9GRE0gb25seSkgKi8KKyNpZmRlZiBub3RkZWYKKyAgICBIQUxfTU9ERV8xMUcgICAgPSAweDAxMCwgICAgICAgIC8qIDExZyBjaGFubmVscyAoT0ZETS9DQ0spICovCisjZWxzZQorICAgIEhBTF9NT0RFXzExRyAgICA9IDB4MDA4LCAgICAgICAgLyogWFhYIGhpc3RvcmljYWwgKi8KKyNlbmRpZgorICAgIEhBTF9NT0RFXzEwOEcgICA9IDB4MDIwLCAgICAgICAgLyogMTFhK1R1cmJvIGNoYW5uZWxzICovCisgICAgSEFMX01PREVfMTA4QSAgID0gMHgwNDAsICAgICAgICAvKiAxMWcrVHVyYm8gY2hhbm5lbHMgKi8KKyAgICBIQUxfTU9ERV9YUiAgICAgPSAweDEwMCwgICAgICAgIC8qIFhSIGNoYW5uZWxzICovCisgICAgSEFMX01PREVfMTFBX0hBTEZfUkFURSA9IDB4MjAwLCAgICAgLyogMTFBIGhhbGYgcmF0ZSBjaGFubmVscyAqLworICAgIEhBTF9NT0RFXzExQV9RVUFSVEVSX1JBVEUgPSAweDQwMCwgIC8qIDExQSBxdWFydGVyIHJhdGUgY2hhbm5lbHMgKi8KKyAgICBIQUxfTU9ERV8xMU5HICAgPSAweDQwMDAsICAgICAgICAgICAvKiAxMW5nIGNoYW5uZWxzICovCisgICAgSEFMX01PREVfMTFOQSAgID0gMHg4MDAwLCAgICAgICAgICAgLyogMTFuYSBjaGFubmVscyAqLworICAgIEhBTF9NT0RFX0FMTCAgICA9IDB4ZmZmZgorfTsKKworI2VuZGlmIC8qICNpZm5kZWYgX0hQUkVHX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocHJ3LmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBydy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiN2Q0OTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHBydy5jCkBAIC0wLDAgKzEsMTU1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSAiLi4vODAyMTFjb3JlL2NwcmVjb21wLmgiCisjaW5jbHVkZSAiaHBhbmkuaCIKKyNpbmNsdWRlICJocHVzYi5oIgorI2luY2x1ZGUgImhwcmVnLmgiCisjaW5jbHVkZSAiLi4vODAyMTFjb3JlL3JhdGVjdHJsLmgiCisKK2V4dGVybiB2b2lkIHpmSWRsQ21kKHpkZXZfdCogZGV2LCB1MzJfdCogY21kLCB1MTZfdCBjbWRMZW4pOworCitleHRlcm4gdm9pZCB6ZkNvcmVDd21CdXN5KHpkZXZfdCogZGV2LCB1MTZfdCBidXN5KTsKK3UxNl90IHpmRGVsYXlXcml0ZUludGVybmFsUmVnKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCB2YWwpOwordTE2X3QgemZGbHVzaERlbGF5V3JpdGUoemRldl90KiBkZXYpOworCisvLyNkZWZpbmUgem1faHBfcHJpdih4KSBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdj16Z1dsYW5EZXYuaHBQcml2YXRlOworCit2b2lkIHpmSW5pdENtZFF1ZXVlKHpkZXZfdCogZGV2KQoreworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdiA9IChzdHJ1Y3QgenNIcFByaXYqKSh3ZC0+aHBQcml2YXRlKTsKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworI2lmZGVmIFpNX1hQX1VTQl9NVUxUQ01ECisgICAgaHBQcml2LT5jbWRUYWlsID0gaHBQcml2LT5jbWRIZWFkID0gaHBQcml2LT5jbWRTZW5kID0gMDsKKyNlbHNlCisgICAgaHBQcml2LT5jbWRUYWlsID0gaHBQcml2LT5jbWRIZWFkID0gMDsKKyNlbmRpZgorICAgIGhwUHJpdi0+Y21kUGVuZGluZyA9IDA7CisgICAgaHBQcml2LT5jbWQuZGVsYXlXY21kQ291bnQgPSAwOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7Cit9CisKK3UxNl90IHpmUHV0Q21kKHpkZXZfdCogZGV2LCB1MzJfdCogY21kLCB1MTZfdCBjbWRMZW4sIHUxNl90IHNyYywgdThfdCogYnVmKQoreworICAgIHUxNl90IGk7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXY9d2QtPmhwUHJpdmF0ZTsKKworICAgIC8qIE1ha2Ugc3VyZSBjb21tYW5kIGxlbmd0aCA8IFpNX01BWF9DTURfU0laRSAqLworICAgIHptX2Fzc2VydChjbWRMZW4gPD0gWk1fTUFYX0NNRF9TSVpFKTsKKyAgICAvKiBNYWtlIHN1cmUgY29tbWFuZCBxdWV1ZSBub3QgZnVsbCAqLworICAgIC8vem1fYXNzZXJ0KCgoaHBQcml2LT5jbWRUYWlsKzEpICYgKFpNX0NNRF9RVUVVRV9TSVpFLTEpKSAhPSBocFByaXYtPmNtZEhlYWQpOworICAgIGlmICgoKGhwUHJpdi0+Y21kVGFpbCsxKSAmIChaTV9DTURfUVVFVUVfU0laRS0xKSkgPT0gaHBQcml2LT5jbWRIZWFkICkgeworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJDTUQgcXVldWUgZnVsbCEhIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGhwUHJpdi0+Y21kUVtocFByaXYtPmNtZFRhaWxdLmNtZExlbiA9IGNtZExlbjsKKyAgICBocFByaXYtPmNtZFFbaHBQcml2LT5jbWRUYWlsXS5zcmMgPSBzcmM7CisgICAgaHBQcml2LT5jbWRRW2hwUHJpdi0+Y21kVGFpbF0uYnVmID0gYnVmOworICAgIGZvciAoaT0wOyBpPChjbWRMZW4+PjIpOyBpKyspCisgICAgeworICAgICAgICBocFByaXYtPmNtZFFbaHBQcml2LT5jbWRUYWlsXS5jbWRbaV0gPSBjbWRbaV07CisgICAgfQorCisgICAgaHBQcml2LT5jbWRUYWlsID0gKGhwUHJpdi0+Y21kVGFpbCsxKSAmIChaTV9DTURfUVVFVUVfU0laRS0xKTsKKworICAgIHJldHVybiAwOworfQorCit1MTZfdCB6ZkdldENtZCh6ZGV2X3QqIGRldiwgdTMyX3QqIGNtZCwgdTE2X3QqIGNtZExlbiwgdTE2X3QqIHNyYywgdThfdCoqIGJ1ZikKK3sKKyAgICB1MTZfdCBpOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2PXdkLT5ocFByaXZhdGU7CisKKyAgICBpZiAoaHBQcml2LT5jbWRUYWlsID09IGhwUHJpdi0+Y21kSGVhZCkKKyAgICB7CisgICAgICAgIHJldHVybiAzOworICAgIH0KKworICAgICpjbWRMZW4gPSBocFByaXYtPmNtZFFbaHBQcml2LT5jbWRIZWFkXS5jbWRMZW47CisgICAgKnNyYyA9IGhwUHJpdi0+Y21kUVtocFByaXYtPmNtZEhlYWRdLnNyYzsKKyAgICAqYnVmID0gaHBQcml2LT5jbWRRW2hwUHJpdi0+Y21kSGVhZF0uYnVmOworICAgIGZvciAoaT0wOyBpPCgoKmNtZExlbik+PjIpOyBpKyspCisgICAgeworICAgICAgICBjbWRbaV0gPSBocFByaXYtPmNtZFFbaHBQcml2LT5jbWRIZWFkXS5jbWRbaV07CisgICAgfQorCisgICAgaHBQcml2LT5jbWRIZWFkID0gKGhwUHJpdi0+Y21kSGVhZCsxKSAmIChaTV9DTURfUVVFVUVfU0laRS0xKTsKKworICAgIHJldHVybiAwOworfQorCisjaWZkZWYgWk1fWFBfVVNCX01VTFRDTUQKK3ZvaWQgemZTZW5kQ21kRXgoemRldl90KiBkZXYpCit7CisgICAgdTMyX3QgbmNtZFtaTV9NQVhfQ01EX1NJWkUvNF07CisgICAgdTE2X3QgbmNtZExlbiA9IDA7CisgICAgdTE2X3QgY21kRmxhZyA9IDA7CisgICAgdTE2X3QgaTsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdj13ZC0+aHBQcml2YXRlOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAoaHBQcml2LT5jbWRQZW5kaW5nID09IDApCisgICAgeworICAgICAgICBpZiAoaHBQcml2LT5jbWRUYWlsICE9IGhwUHJpdi0+Y21kU2VuZCkKKyAgICAgICAgeworICAgICAgICAgICAgY21kRmxhZyA9IDE7CisgICAgICAgICAgICAvKiBHZXQgcXVldWVpbmcgY29tbWFuZCAqLworICAgICAgICAgICAgbmNtZExlbj0gaHBQcml2LT5jbWRRW2hwUHJpdi0+Y21kU2VuZF0uY21kTGVuOworICAgICAgICAgICAgZm9yIChpPTA7IGk8KG5jbWRMZW4+PjIpOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmNtZFtpXSA9IGhwUHJpdi0+Y21kUVtocFByaXYtPmNtZFNlbmRdLmNtZFtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhwUHJpdi0+Y21kU2VuZCA9IChocFByaXYtPmNtZFNlbmQrMSkgJiAoWk1fQ01EX1FVRVVFX1NJWkUtMSk7CisKKyAgICAgICAgICAgIGhwUHJpdi0+Y21kUGVuZGluZyA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKChjbWRGbGFnID09IDEpKQorICAgIHsKKyAgICAgICAgemZJZGxDbWQoZGV2LCBuY21kLCBuY21kTGVuKTsKKyAgICB9Cit9CisKK3ZvaWQgemZpU2VuZENtZENvbXAoemRldl90KiBkZXYpCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2PXdkLT5ocFByaXZhdGU7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyAgICBocFByaXYtPmNtZFBlbmRpbmcgPSAwOworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICB6ZlNlbmRDbWRFeChkZXYpOworfQorI2VuZGlmCisKK3UxNl90IHpmSXNzdWVDbWQoemRldl90KiBkZXYsIHUzMl90KiBjbWQsIHUxNl90IGNtZExlbiwgdTE2X3Qgc3JjLCB1OF90KiBidWYpCit7CisgICAgdTE2X3QgY21kRmxhZyA9IDA7CisgICAgdTE2X3QgcmV0OworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2PXdkLT5ocFByaXZhdGU7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgem1fbXNnMl9tbShaTV9MVl8xLCAiY21kTGVuPSIsIGNtZExlbik7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisjaWZkZWYgWk1fWFBfVVNCX01VTFRDTUQKKyAgICByZXQgPSB6ZlB1dENtZChkZXYsIGNtZCwgY21kTGVuLCBzcmMsIGJ1Zik7CisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgIGlmIChyZXQgIT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHpmU2VuZENtZEV4KGRldik7CisjZWxzZQorICAgIGlmIChocFByaXYtPmNtZFBlbmRpbmcgPT0gMCkKKyAgICB7CisgICAgICAgIGhwUHJpdi0+Y21kUGVuZGluZyA9IDE7CisgICAgICAgIGNtZEZsYWcgPSAxOworICAgIH0KKyAgICByZXQgPSB6ZlB1dENtZChkZXYsIGNtZCwgY21kTGVuLCBzcmMsIGJ1Zik7CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgaWYgKHJldCAhPSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKGNtZEZsYWcgPT0gMSkKKyAgICB7CisgICAgICAgIHpmSWRsQ21kKGRldiwgY21kLCBjbWRMZW4pOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiAwOworfQorCit2b2lkIHpmSWRsUnNwKHpkZXZfdCogZGV2LCB1MzJfdCogcnNwLCB1MTZfdCByc3BMZW4pCit7CisgICAgdTMyX3QgY21kW1pNX01BWF9DTURfU0laRS80XTsKKyAgICB1MTZfdCBjbWRMZW47CisgICAgdTE2X3Qgc3JjOworICAgIHU4X3QqIGJ1ZjsKKyAgICB1MzJfdCBuY21kW1pNX01BWF9DTURfU0laRS80XTsKKyAgICB1MTZfdCBuY21kTGVuID0gMDsKKyAgICB1MTZfdCByZXQ7CisgICAgdTE2X3QgY21kRmxhZyA9IDA7CisgICAgdTE2X3QgaTsKKyAgICBzMzJfdCBuZjsKKyAgICBzMzJfdCBub2lzZWZsb29yWzRdOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2PXdkLT5ocFByaXZhdGU7CisKKworICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgcmV0ID0gemZHZXRDbWQoZGV2LCBjbWQsICZjbWRMZW4sICZzcmMsICZidWYpOworICAgICNpZiAwCisgICAgem1fYXNzZXJ0KHJldCA9PSAwKTsKKyAgICAjZWxzZQorICAgIGlmIChyZXQgIT0gMCkKKyAgICB7CisgICAgICAgIHptX2RlYnVnX21zZzAoIkVycm9yIElkbFJzcCBiZWNhdXNlIG5vbmUgY21kISFcbiIpOworICAgICAgICAjaWZuZGVmIFpNX1hQX1VTQl9NVUxUQ01ECisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgICAgIHJldHVybjsKKyAgICAgICAgI2VuZGlmCisgICAgfQorICAgICNlbmRpZgorI2lmZGVmIFpNX1hQX1VTQl9NVUxUQ01ECisgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKyNlbHNlCisgICAgaWYgKGhwUHJpdi0+Y21kVGFpbCAhPSBocFByaXYtPmNtZEhlYWQpCisgICAgeworICAgICAgICBjbWRGbGFnID0gMTsKKyAgICAgICAgLyogR2V0IHF1ZXVlaW5nIGNvbW1hbmQgKi8KKyAgICAgICAgbmNtZExlbj0gaHBQcml2LT5jbWRRW2hwUHJpdi0+Y21kSGVhZF0uY21kTGVuOworICAgICAgICBmb3IgKGk9MDsgaTwobmNtZExlbj4+Mik7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgbmNtZFtpXSA9IGhwUHJpdi0+Y21kUVtocFByaXYtPmNtZEhlYWRdLmNtZFtpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBocFByaXYtPmNtZFBlbmRpbmcgPSAwOworICAgIH0KKworICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICBpZiAoY21kRmxhZyA9PSAxKQorICAgIHsKKyAgICAgICAgemZJZGxDbWQoZGV2LCBuY21kLCBuY21kTGVuKTsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoc3JjID09IFpNX09JRF9SRUFEKQorICAgIHsKKyAgICAgICAgWk1fUEVSRk9STUFOQ0VfUkVHKGRldiwgMHgxMTc3MmMsIHJzcFsxXSk7CisgICAgICAgIHpmd0RiZ1JlYWRSZWdEb25lKGRldiwgY21kWzFdLCByc3BbMV0pOworICAgIH0KKyAgICBlbHNlIGlmIChzcmMgPT0gWk1fT0lEX0ZMQVNIX0NIS1NVTSkKKyAgICB7CisgICAgICAgIHpmd0RiZ0dldEZsYXNoQ2hrU3VtRG9uZShkZXYsIHJzcCsxKTsKKyAgICB9CisgICAgZWxzZSBpZiAoc3JjID09IFpNX09JRF9GTEFTSF9SRUFEKQorICAgIHsKKyAgICAgICAgdTMyX3QgIGRhdGFsZW47CisgICAgICAgIHUxNl90IGk7CisKKyAgICAgICAgZGF0YWxlbiA9IChyc3BbMF0gJiAyNTUpOworCisgICAgICAgIHpmd0RiZ1JlYWRGbGFzaERvbmUoZGV2LCBjbWRbMV0sIHJzcCsxLCBkYXRhbGVuKTsKKyAgICB9CisgICAgZWxzZSBpZiAoc3JjID09IFpNX09JRF9GTEFTSF9QUk9HUkFNKQorICAgIHsKKyAgICAgICAgLyogTm9uIGRvICovCisgICAgfQorICAgIGVsc2UgaWYgKHNyYyA9PSBaTV9PSURfV1JJVEUpCisgICAgeworICAgICAgICB6ZndEYmdXcml0ZVJlZ0RvbmUoZGV2LCBjbWRbMV0sIGNtZFsyXSk7CisgICAgfQorICAgIGVsc2UgaWYgKHNyYyA9PSBaTV9PSURfVEFMTFkpCisgICAgeworCQl6ZkNvbGxlY3RIV1RhbGx5KGRldiwgcnNwLCAwKTsKKyAgICB9CisgICAgZWxzZSBpZiAoc3JjID09IFpNX09JRF9UQUxMWV9BUEQpCisgICAgeworCQl6ZkNvbGxlY3RIV1RhbGx5KGRldiwgcnNwLCAxKTsKKyAgICAgICAgemZ3RGJnUmVhZFRhbGx5RG9uZShkZXYpOworI2lmZGVmIFpNX0VOQUJMRV9CQV9SQVRFQ1RSTAorICAgICAgICB6ZlJhdGVDdHJsQWdnclN0YShkZXYpOworI2VuZGlmCisgICAgfQorICAgIGVsc2UgaWYgKHNyYyA9PSBaTV9PSURfREtUWF9TVEFUVVMpCisgICAgeworICAgICAgICB6bV9kZWJ1Z19tc2cwKCJzcmMgPSB6bV9PSURfREtUWF9TVEFUVVMiKTsKKyAgICAgICAgemZ3RGJnUXVlcnlId1R4QnVzeURvbmUoZGV2LCByc3BbMV0pOworICAgIH0KKyAgICBlbHNlIGlmIChzcmMgPT0gWk1fQ01EX1NFVF9GUkVRVUVOQ1kpCisgICAgeworCisvLyNpZmRlZiBaTV9PVFVTX0VOQUJMRV9SRVRSWV9GUkVRX0NIQU5HRQorI2lmIDAKKyAgICB6bV9kZWJ1Z19tc2cxKCJSZXRyeSBTZXQgRnJlcXVlbmN5ID0gIiwgcnNwWzFdKTsKKworICAgICNpZiAxCisgICAgLy8gUmVhZCB0aGUgTm9pc2UgRmxvb3IgdmFsdWUgIQorICAgIG5mID0gKChyc3BbMl0+PjE5KSAmIDB4MWZmKTsKKyAgICBpZiAoKG5mICYgMHgxMDApICE9IDB4MCkKKyAgICB7CisgICAgICAgIG5vaXNlZmxvb3JbMF0gPSAwIC0gKChuZiBeIDB4MWZmKSArIDEpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBub2lzZWZsb29yWzBdID0gbmY7CisgICAgfQorCisgICAgem1fZGVidWdfbXNnMSgiTm9pc2UgRmxvb3JbMV0gPSAiLCBub2lzZWZsb29yWzBdKTsKKworICAgIG5mID0gKChyc3BbM10+PjE5KSAmIDB4MWZmKTsKKyAgICBpZiAoKG5mICYgMHgxMDApICE9IDB4MCkKKyAgICB7CisgICAgICAgIG5vaXNlZmxvb3JbMV0gPSAwIC0gKChuZiBeIDB4MWZmKSArIDEpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBub2lzZWZsb29yWzFdID0gbmY7CisgICAgfQorCisgICAgem1fZGVidWdfbXNnMSgiTm9pc2UgRmxvb3JbMl0gPSAiLCBub2lzZWZsb29yWzFdKTsKKyAgICB6bV9kZWJ1Z19tc2cxKCJJcyBTaXRlIFN1cnZleSA9ICIsIGhwUHJpdi0+aXNTaXRlU3VydmV5KTsKKyAgICAjZW5kaWYKKworICAgICAgICBpZiAoIChyc3BbMV0gJiYgaHBQcml2LT5mcmVxUmV0cnlDb3VudGVyID09IDApIHx8CisgICAgICAgICAgICAgKCgobm9pc2VmbG9vclswXT4tNjApfHwobm9pc2VmbG9vclsxXT4tNjApKSAmJiBocFByaXYtPmZyZXFSZXRyeUNvdW50ZXI9PTApIHx8CisgICAgICAgICAgICAgKChhYnMobm9pc2VmbG9vclswXS1ub2lzZWZsb29yWzFdKT49OSkgJiYgaHBQcml2LT5mcmVxUmV0cnlDb3VudGVyPT0wKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlJldHJ5IHRvIGlzc3VlIHRoZSBmcmVxdWVuY3kgY2hhbmdlIGNvbW1hbmQiKTsKKworICAgICAgICAgICAgaWYgKCBocFByaXYtPnJlY29yZEZyZXFSZXRyeUNvdW50ZXIgPT0gMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiQ29sZCBSZXNldCIpOworCisgICAgICAgICAgICAgICAgemZIcFNldEZyZXF1ZW5jeUV4KGRldiwgaHBQcml2LT5sYXRlc3RGcmVxdWVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHBQcml2LT5sYXRlc3RCdzQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+bGF0ZXN0RXh0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpOworCisgICAgICAgICAgICAgICAgaWYgKCBocFByaXYtPmlzU2l0ZVN1cnZleSAhPSAyICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+ZnJlcVJldHJ5Q291bnRlcisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBocFByaXYtPnJlY29yZEZyZXFSZXRyeUNvdW50ZXIgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmSHBTZXRGcmVxdWVuY3lFeChkZXYsIGhwUHJpdi0+bGF0ZXN0RnJlcXVlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+bGF0ZXN0Qnc0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocFByaXYtPmxhdGVzdEV4dE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhwUHJpdi0+cmVjb3JkRnJlcVJldHJ5Q291bnRlcisrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZgorCisvKiByZXQ6IEJpdDA6IEFHQyBjYWxpYnJhdGlvbiAgIDA9PmZpbmlzaCAgMT0+dW5maW5pc2ggICAgICAgICAgICAgICAqLworLyogICAgICBCaXQxOiBOb2lzZSBjYWxpYnJhdGlvbiAwPT5maW5pc2ggIDE9PnVuZmluaXNoICAgICAgICAgICAgICAgKi8KKy8qICAgICAgQml0MjogTm9pc2UgY2FsaWJyYXRpb24gZmluaXNoLCBidXQgTkYgdmFsdWUgdW5leGNlcHRlZCA9PiAxICovCisgICAgICAgIGlmICggKHJzcFsxXSAmIDB4MSkgfHwgKHJzcFsxXSAmIDB4NCkgKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJTZXQgRnJlcXVlbmN5IGZhaWwgOiByZXQgPSAiLCByc3BbMV0pOworCisgICAgICAgICAgICAvKiAxLiBBR0MgQ2FsaWJyYXRpb24gZmFpbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgLyogMi4gTm9pc2UgQ2FsaWJyYXRpb24gZmluaXNoIGJ1dCBlcnJvciBOb2lzZUZsb29yIHZhbHVlICAgKi8KKyAgICAgICAgICAgIC8qICAgICAgYW5kIG5vdCBpbiBzaXRlc3VydmV5LCB0cnkgbW9yZSB0d2ljZSAgICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoIGhwUHJpdi0+aXNTaXRlU3VydmV5ID09IDIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggaHBQcml2LT5yZWNvcmRGcmVxUmV0cnlDb3VudGVyIDwgMiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBjb2xkIHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgIHpmSHBTZXRGcmVxdWVuY3lFeChkZXYsIGhwUHJpdi0+bGF0ZXN0RnJlcXVlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocFByaXYtPmxhdGVzdEJ3NDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+bGF0ZXN0RXh0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKTsKKyAgICAgICAgICAgICAgICAgICAgaHBQcml2LT5yZWNvcmRGcmVxUmV0cnlDb3VudGVyKys7CisgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIlJldHJ5IHRvIGlzc3VlIHRoZSBmcmVxdWVuY3kgY2hhbmdlIGNvbW1hbmQoY29sZCByZXNldCkgY291bnRlciA9ICIsIGhwUHJpdi0+cmVjb3JkRnJlcVJldHJ5Q291bnRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIEZhaWwgOiB3ZSB3b3VsZCBub3QgYWNjZXB0IHRoaXMgcmVzdWx0ISAqLworICAgICAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJcblxuXG5cbiAgRmFpbCB0d2ljZSBjb2xkIHJlc2V0IFxuXG5cblxuIik7CisgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+Y29sZFJlc2V0TmVlZEZyZXEgPSAwOworICAgICAgICAgICAgICAgICAgICBocFByaXYtPnJlY29yZEZyZXFSZXRyeUNvdW50ZXIgPSAwOworICAgICAgICAgICAgICAgICAgICB6ZkNvcmVTZXRGcmVxdWVuY3lDb21wbGV0ZShkZXYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBpbiBzaXRlc3VydmV5LCBjb2xkcmVzZXQgaW4gbmV4dCBjaGFubmVsICovCisgICAgICAgICAgICAgICAgaHBQcml2LT5jb2xkUmVzZXROZWVkRnJlcSA9IDE7CisgICAgICAgICAgICAgICAgaHBQcml2LT5yZWNvcmRGcmVxUmV0cnlDb3VudGVyID0gMDsKKyAgICAgICAgICAgICAgICB6ZkNvcmVTZXRGcmVxdWVuY3lDb21wbGV0ZShkZXYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHJzcFsxXSAmIDB4MikKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiU2V0IEZyZXF1ZW5jeSBmYWlsIDIgOiByZXQgPSAiLCByc3BbMV0pOworCisgICAgICAgICAgICAvKiBOb2lzZSBDYWxpYnJhdGlvbiB1bi1maW5pc2ggICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAvKiAgICAgIGFuZCBub3QgaW4gc2l0ZXN1cnZleSwgdHJ5IG1vcmUgb25jZSAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoIGhwUHJpdi0+aXNTaXRlU3VydmV5ID09IDIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggaHBQcml2LT5yZWNvcmRGcmVxUmV0cnlDb3VudGVyIDwgMSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBjb2xkIHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgIHpmSHBTZXRGcmVxdWVuY3lFeChkZXYsIGhwUHJpdi0+bGF0ZXN0RnJlcXVlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocFByaXYtPmxhdGVzdEJ3NDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhwUHJpdi0+bGF0ZXN0RXh0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKTsKKyAgICAgICAgICAgICAgICAgICAgaHBQcml2LT5yZWNvcmRGcmVxUmV0cnlDb3VudGVyKys7CisgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzEoIjIgUmV0cnkgdG8gaXNzdWUgdGhlIGZyZXF1ZW5jeSBjaGFuZ2UgY29tbWFuZChjb2xkIHJlc2V0KSBjb3VudGVyID0gIiwgaHBQcml2LT5yZWNvcmRGcmVxUmV0cnlDb3VudGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRmFpbCA6IHdlIHdvdWxkIG5vdCBhY2NlcHQgdGhpcyByZXN1bHQhICovCisgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlxuXG5cblxuICAyIEZhaWwgdHdpY2UgY29sZCByZXNldCBcblxuXG5cbiIpOworICAgICAgICAgICAgICAgICAgICBocFByaXYtPmNvbGRSZXNldE5lZWRGcmVxID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaHBQcml2LT5yZWNvcmRGcmVxUmV0cnlDb3VudGVyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgemZDb3JlU2V0RnJlcXVlbmN5Q29tcGxldGUoZGV2KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogaW4gc2l0ZXN1cnZleSwgc2tpcCB0aGlzIGZyZXF1ZW5jeSAqLworICAgICAgICAgICAgICAgIGhwUHJpdi0+Y29sZFJlc2V0TmVlZEZyZXEgPSAwOworICAgICAgICAgICAgICAgIGhwUHJpdi0+cmVjb3JkRnJlcVJldHJ5Q291bnRlciA9IDA7CisgICAgICAgICAgICAgICAgemZDb3JlU2V0RnJlcXVlbmN5Q29tcGxldGUoZGV2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvL2Vsc2UgaWYgKHJzcFsxXSAmIDB4NCkKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIHptX2RlYnVnX21zZzEoIlNldCBGcmVxdWVuY3kgZmFpbCAzIDogcmV0ID0gIiwgcnNwWzFdKTsKKyAgICAgICAgLy8gICAgaHBQcml2LT5jb2xkUmVzZXROZWVkRnJlcSA9IDA7CisgICAgICAgIC8vICAgIGhwUHJpdi0+cmVjb3JkRnJlcVJldHJ5Q291bnRlciA9IDA7CisgICAgICAgIC8vICAgIHpmQ29yZVNldEZyZXF1ZW5jeUNvbXBsZXRlKGRldik7CisgICAgICAgIC8vfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vaHBQcml2LT5mcmVxUmV0cnlDb3VudGVyID0gMDsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzIoIiByZXR1cm4gY29tcGxldGUsIHJldCA9ICIsIHJzcFsxXSk7CisKKyAgICAgICAgICAgIC8qIHNldCBiYl9oZWF2eV9jbGlwX2VuYWJsZSAqLworICAgICAgICAgICAgaWYgKGhwUHJpdi0+ZW5hYmxlQkJIZWF2eUNsaXAgJiYgaHBQcml2LT5od0JCSGVhdnlDbGlwICYmCisgICAgICAgICAgICAgICAgaHBQcml2LT5kb0JCSGVhdnlDbGlwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHUzMl90IHNldFZhbHVlID0gMHgyMDA7CisKKyAgICAgICAgICAgICAgICBzZXRWYWx1ZSB8PSBocFByaXYtPnNldFZhbHVlSGVhdnlDbGlwOworCisgICAgICAgICAgICAgICAgLy96bV9kYmcoKCJEbyBoZWF2eSBjbGlwIHNldFZhbHVlID0gJWRcbiIsIHNldFZhbHVlKSk7CisKKyAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4OTllMCsweDFiYzAwMCwgc2V0VmFsdWUpOworICAgICAgICAgICAgICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGhwUHJpdi0+Y29sZFJlc2V0TmVlZEZyZXEgPSAwOworICAgICAgICAgICAgaHBQcml2LT5yZWNvcmRGcmVxUmV0cnlDb3VudGVyID0gMDsKKyAgICAJICAgIHpmQ29yZVNldEZyZXF1ZW5jeUNvbXBsZXRlKGRldik7CisgICAgCX0KKworICAgICAgICAjaWYgMQorICAgICAgICAvLyBSZWFkIHRoZSBOb2lzZSBGbG9vciB2YWx1ZSAhCisgICAgICAgIG5mID0gKChyc3BbMl0+PjE5KSAmIDB4MWZmKTsKKyAgICAgICAgaWYgKChuZiAmIDB4MTAwKSAhPSAweDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG5vaXNlZmxvb3JbMF0gPSAwIC0gKChuZiBeIDB4MWZmKSArIDEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbm9pc2VmbG9vclswXSA9IG5mOworICAgICAgICB9CisKKyAgICAgICAgLy96bV9kZWJ1Z19tc2cxKCJOb2lzZSBGbG9vclsxXSA9ICIsIG5vaXNlZmxvb3JbMF0pOworCisgICAgICAgIG5mID0gKChyc3BbM10+PjE5KSAmIDB4MWZmKTsKKyAgICAgICAgaWYgKChuZiAmIDB4MTAwKSAhPSAweDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG5vaXNlZmxvb3JbMV0gPSAwIC0gKChuZiBeIDB4MWZmKSArIDEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbm9pc2VmbG9vclsxXSA9IG5mOworICAgICAgICB9CisKKyAgICAgICAgLy96bV9kZWJ1Z19tc2cxKCJOb2lzZSBGbG9vclsyXSA9ICIsIG5vaXNlZmxvb3JbMV0pOworCisgICAgICAgIG5mID0gKChyc3BbNV0+PjIzKSAmIDB4MWZmKTsKKyAgICAgICAgaWYgKChuZiAmIDB4MTAwKSAhPSAweDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG5vaXNlZmxvb3JbMl0gPSAwIC0gKChuZiBeIDB4MWZmKSArIDEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbm9pc2VmbG9vclsyXSA9IG5mOworICAgICAgICB9CisKKyAgICAgICAgLy96bV9kZWJ1Z19tc2cxKCJOb2lzZSBGbG9vciBleHRbMV0gPSAiLCBub2lzZWZsb29yWzJdKTsKKworICAgICAgICBuZiA9ICgocnNwWzZdPj4yMykgJiAweDFmZik7CisgICAgICAgIGlmICgobmYgJiAweDEwMCkgIT0gMHgwKQorICAgICAgICB7CisgICAgICAgICAgICBub2lzZWZsb29yWzNdID0gMCAtICgobmYgXiAweDFmZikgKyAxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG5vaXNlZmxvb3JbM10gPSBuZjsKKyAgICAgICAgfQorCisgICAgICAgIC8vem1fZGVidWdfbXNnMSgiTm9pc2UgRmxvb3IgZXh0WzJdID0gIiwgbm9pc2VmbG9vclszXSk7CisKKyAgICAgICAgLy96bV9kZWJ1Z19tc2cxKCJJcyBTaXRlIFN1cnZleSA9ICIsIGhwUHJpdi0+aXNTaXRlU3VydmV5KTsKKyAgICAgICAgI2VuZGlmCisgICAgfQorICAgIGVsc2UgaWYgKHNyYyA9PSBaTV9DTURfU0VUX0tFWSkKKyAgICB7CisgICAgICAgIHpmQ29yZVNldEtleUNvbXBsZXRlKGRldik7CisgICAgfQorICAgIGVsc2UgaWYgKHNyYyA9PSBaTV9DV01fUkVBRCkKKyAgICB7CisgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMCwgIkNXTSByc3BbMV09IiwgcnNwWzFdKTsKKyAgICAgICAgem1fbXNnMl9tbShaTV9MVl8wLCAiQ1dNIHJzcFsyXT0iLCByc3BbMl0pOworICAgICAgICB6ZkNvcmVDd21CdXN5KGRldiwgemZDd21Jc0V4dENoYW5CdXN5KHJzcFsxXSwgcnNwWzJdKSk7CisgICAgfQorICAgIGVsc2UgaWYgKHNyYyA9PSBaTV9NQUNfUkVBRCkKKyAgICB7CisgICAgICAgIC8qIHJzcFsxXSA9IFpNX1NFRVBST01fTUFDX0FERFJFU1NfT0ZGU0VUOyAgICovCisgICAgICAgIC8qIHJzcFsyXSA9IFpNX1NFRVBST01fTUFDX0FERFJFU1NfT0ZGU0VUKzQ7ICovCisgICAgICAgIC8qIHJzcFszXSA9IFpNX1NFRVBST01fUkVHRE9NQUlOX09GRlNFVDsgICAgICovCisgICAgICAgIC8qIHJzcFs0XSA9IFpNX1NFRVBST01fVkVSSVNPTl9PRkZTRVQ7ICAgICAgICovCisgICAgICAgIC8qIHJzcFs1XSA9IFpNX1NFRVBST01fSEFSRFdBUkVfVFlQRV9PRkZTRVQ7ICovCisgICAgICAgIC8qIHJzcFs2XSA9IFpNX1NFRVBST01fSFdfSEVBVllfQ0xJUDsgICAgICAgICovCisKKyAgICAgICAgdThfdCBhZGRyWzZdLCBDQ1MsIFdXUjsKKyAgICAgICAgdTE2X3QgQ291bnRyeURvbWFpbkNvZGU7CisKKyAgICAgICAgLyogQkIgaGVhdnkgY2xpcCAqLworICAgICAgICAvL2hwUHJpdi0+ZWVwcm9tSGVhdnlDbGlwRmxhZyA9ICh1OF90KSgocnNwWzZdPj4yNCkgJiAweGZmKTsgLy8gZm9yY2UgZW5hYmxlIDgxMDcKKyAgICAgICAgLy96bV9tc2cyX21tKFpNX0xWXzAsICJlZXByb21IZWF2eUNsaXBGbGFnIiwgaHBQcml2LT5lZXByb21IZWF2eUNsaXBGbGFnKTsKKyAgICAgICAgI2lmIDAKKyAgICAgICAgaWYgKGhwUHJpdi0+aHdCQkhlYXZ5Q2xpcCkKKyAgICAgICAgeworICAgICAgICAgICAgem1fbXNnMF9tbShaTV9MVl8wLCAiZW5hYmxlIEJCIEhlYXZ5IENsaXAiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIk5vdCBlbmFibGUgQkIgSGVhdnkgQ2xpcCIpOworICAgICAgICB9CisgICAgICAgICNlbmRpZgorICAgICAgICB6bV9tc2cyX21tKFpNX0xWXzAsICJNQUMgcnNwWzFdPSIsIHJzcFsxXSk7CisgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMCwgIk1BQyByc3BbMl09IiwgcnNwWzJdKTsKKworICAgICAgICBhZGRyWzBdID0gKHU4X3QpKHJzcFsxXSAmIDB4ZmYpOworICAgICAgICBhZGRyWzFdID0gKHU4X3QpKChyc3BbMV0+PjgpICYgMHhmZik7CisgICAgICAgIGFkZHJbMl0gPSAodThfdCkoKHJzcFsxXT4+MTYpICYgMHhmZik7CisgICAgICAgIGFkZHJbM10gPSAodThfdCkoKHJzcFsxXT4+MjQpICYgMHhmZik7CisgICAgICAgIGFkZHJbNF0gPSAodThfdCkocnNwWzJdICYgMHhmZik7CisgICAgICAgIGFkZHJbNV0gPSAodThfdCkoKHJzcFsyXT4+OCkgJiAweGZmKTsKKy8qI2lmZGVmIFpNX0ZCNTAKKyAgICAgICAgYWRkclswXSA9ICh1OF90KSgwICYgMHhmZik7CisgICAgICAgIGFkZHJbMV0gPSAodThfdCkoMyAmIDB4ZmYpOworICAgICAgICBhZGRyWzJdID0gKHU4X3QpKDEyNyAmIDB4ZmYpOworICAgICAgICBhZGRyWzNdID0gKHU4X3QpKDAgJiAweGZmKTsKKyAgICAgICAgYWRkcls0XSA9ICh1OF90KSg5ICYgMHhmZik7CisgICAgICAgIGFkZHJbNV0gPSAodThfdCkoMTEgJiAweGZmKTsKKyNlbmRpZiovCisKKyAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX01BQ19BRERSX0wsCisgICAgICAgICAgICAgICAgKCgoKHUzMl90KWFkZHJbM10pPDwyNCkgfCAoKCh1MzJfdClhZGRyWzJdKTw8MTYpIHwgKCgodTMyX3QpYWRkclsxXSk8PDgpIHwgYWRkclswXSkpOworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfTUFDX0FERFJfSCwKKyAgICAgICAgICAgICAgICAoKCgodTMyX3QpYWRkcls1XSk8PDgpIHwgYWRkcls0XSkpOworICAgICAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworCisgICAgICAgIHdkLT5sZWRTdHJ1Y3QubGVkTW9kZVswXSA9ICh1MTZfdCkocnNwWzVdJjB4ZmZmZik7CisgICAgICAgIHdkLT5sZWRTdHJ1Y3QubGVkTW9kZVsxXSA9ICh1MTZfdCkocnNwWzVdPj4xNik7CisgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMCwgImxlZE1vZGVbMF09Iiwgd2QtPmxlZFN0cnVjdC5sZWRNb2RlWzBdKTsKKyAgICAgICAgem1fbXNnMl9tbShaTV9MVl8wLCAibGVkTW9kZVsxXT0iLCB3ZC0+bGVkU3RydWN0LmxlZE1vZGVbMV0pOworCisgICAgICAgIC8qIFJlZ3VsYXRvcnkgUmVsYXRlZCBTZXR0aW5nICovCisgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMCwgIlJlZ0RvbWFpbiByc3A9IiwgcnNwWzNdKTsKKyAgICAgICAgem1fbXNnMl9tbShaTV9MVl8wLCAiT3BGbGFncytFZXBNaXNjPSIsIHJzcFs0XSk7CisgICAgICAgIGhwUHJpdi0+T3BGbGFncyA9ICh1OF90KSgocnNwWzRdPj4xNikgJiAweGZmKTsKKyAgICAgICAgaWYgKChyc3BbMl0gPj4gMjQpID09IDB4MSkgLy9UeCBtYXNrID09IDB4MQorICAgICAgICB7CisgICAgICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzAsICJPVFVTIDF4MiIpOworICAgICAgICAgICAgaHBQcml2LT5oYWxDYXBhYmlsaXR5IHw9IFpNX0hQX0NBUF8xMU5fT05FX1RYX1NUUkVBTTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMCwgIk9UVVMgMngyIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhwUHJpdi0+T3BGbGFncyAmIDB4MSkKKyAgICAgICAgeworICAgICAgICAgICAgaHBQcml2LT5oYWxDYXBhYmlsaXR5IHw9IFpNX0hQX0NBUF81RzsKKyAgICAgICAgfQorICAgICAgICBpZiAoaHBQcml2LT5PcEZsYWdzICYgMHgyKQorICAgICAgICB7CisgICAgICAgICAgICBocFByaXYtPmhhbENhcGFiaWxpdHkgfD0gWk1fSFBfQ0FQXzJHOworICAgICAgICB9CisKKworICAgICAgICBDQ1MgPSAodThfdCkoKHJzcFszXSAmIDB4ODAwMCkgPj4gMTUpOworICAgICAgICBXV1IgPSAodThfdCkoKHJzcFszXSAmIDB4NDAwMCkgPj4gMTQpOworICAgICAgICBDb3VudHJ5RG9tYWluQ29kZSA9ICh1MTZfdCkocnNwWzNdICYgMHgzRkZGKTsKKworICAgICAgICBpZiAocnNwWzNdICE9IDB4ZmZmZmZmZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChDQ1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cwKCJDV1kgLSBHZXQgUmVndWxhdGlvbiBUYWJsZSBmcm9tIENvdW50cnkgQ29kZSIpOworICAgICAgICAgICAgICAgIHpmSHBHZXRSZWd1bGF0aW9uVGFibGVmcm9tQ291bnRyeShkZXYsIENvdW50cnlEb21haW5Db2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3ptX2RlYnVnX21zZzAoIkNXWSAtIEdldCBSZWd1bGF0aW9uIFRhYmxlIGZyb20gUmVnIERvbWFpbiIpOworICAgICAgICAgICAgICAgIHpmSHBHZXRSZWd1bGF0aW9uVGFibGVmcm9tUmVnaW9uQ29kZShkZXYsIENvdW50cnlEb21haW5Db2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChXV1IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cwKCJDV1kgLSBFbmFibGUgODAyLjExZCIpOworICAgICAgICAgICAgICAgIC8qIGJlbG93IGxpbmUgc2hhbGwgYmUgdW5tYXJrZWQgYWZ0ZXIgQSBiYW5kIGlzIHJlYWR5ICovCisgICAgICAgICAgICAgICAgLy96ZmlXbGFuU2V0RG90MTFETW9kZShkZXYsIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgemZIcEdldFJlZ3VsYXRpb25UYWJsZWZyb21SZWdpb25Db2RlKGRldiwgTk9fRU5VTVJEKTsKKyAgICAgICAgfQorCisgICAgICAgIHpmQ29yZU1hY0FkZHJlc3NOb3RpZnkoZGV2LCBhZGRyKTsKKworICAgIH0KKyAgICBlbHNlIGlmIChzcmMgPT0gWk1fRUVQUk9NX1JFQUQpCisgICAgeworI2lmIDAKKyAgICAgICAgdThfdCBhZGRyWzZdLCBDQ1MsIFdXUjsKKyAgICAgICAgdTE2X3QgQ291bnRyeURvbWFpbkNvZGU7CisjZW5kaWYKKyAgICAgICAgZm9yIChpPTA7IGk8Wk1fSEFMX01BWF9FRVBST01fUFJROyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChocFByaXYtPmVlcHJvbUltYWdlSW5kZXggPCAxMDI0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhwUHJpdi0+ZWVwcm9tSW1hZ2VbaHBQcml2LT5lZXByb21JbWFnZUluZGV4KytdID0gcnNwW2krMV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoaHBQcml2LT5lZXByb21JbWFnZUluZGV4ID09IChaTV9IQUxfTUFYX0VFUFJPTV9SRVEqWk1fSEFMX01BWF9FRVBST01fUFJRKSkKKyAgICAgICAgeworICAgICAgICAgICAgI2lmIDAKKyAgICAgICAgICAgIGZvciAoaT0wOyBpPDEwMjQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9tc2cyX21tKFpNX0xWXzAsICJpbmRleD0iLCBpKTsKKyAgICAgICAgICAgICAgICB6bV9tc2cyX21tKFpNX0xWXzAsICJlZXByb21JbWFnZT0iLCBocFByaXYtPmVlcHJvbUltYWdlW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgem1fbXNnMl9tbShaTV9MVl8wLCAiTUFDIFsxXT0iLCBocFByaXYtPmVlcHJvbUltYWdlWzB4MjBjLzRdKTsKKyAgICAgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMCwgIk1BQyBbMl09IiwgaHBQcml2LT5lZXByb21JbWFnZVsweDIxMC80XSk7CisjaWYgMAorICAgICAgICAgICAgYWRkclswXSA9ICh1OF90KShocFByaXYtPmVlcHJvbUltYWdlWzB4MjBjLzRdICYgMHhmZik7CisgICAgICAgICAgICBhZGRyWzFdID0gKHU4X3QpKChocFByaXYtPmVlcHJvbUltYWdlWzB4MjBjLzRdPj44KSAmIDB4ZmYpOworICAgICAgICAgICAgYWRkclsyXSA9ICh1OF90KSgoaHBQcml2LT5lZXByb21JbWFnZVsweDIwYy80XT4+MTYpICYgMHhmZik7CisgICAgICAgICAgICBhZGRyWzNdID0gKHU4X3QpKChocFByaXYtPmVlcHJvbUltYWdlWzB4MjBjLzRdPj4yNCkgJiAweGZmKTsKKyAgICAgICAgICAgIGFkZHJbNF0gPSAodThfdCkoaHBQcml2LT5lZXByb21JbWFnZVsweDIxMC80XSAmIDB4ZmYpOworICAgICAgICAgICAgYWRkcls1XSA9ICh1OF90KSgoaHBQcml2LT5lZXByb21JbWFnZVsweDIxMC80XT4+OCkgJiAweGZmKTsKKworICAgICAgICAgICAgemZDb3JlTWFjQWRkcmVzc05vdGlmeShkZXYsIGFkZHIpOworCisgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfTUFDX0FERFJfTCwKKyAgICAgICAgICAgICAgICAgICAgKCgoKHUzMl90KWFkZHJbM10pPDwyNCkgfCAoKCh1MzJfdClhZGRyWzJdKTw8MTYpIHwgKCgodTMyX3QpYWRkclsxXSk8PDgpIHwgYWRkclswXSkpOworICAgICAgICAgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX01BQ19BRERSX0gsCisgICAgICAgICAgICAgICAgICAgICgoKCh1MzJfdClhZGRyWzVdKTw8OCkgfCBhZGRyWzRdKSk7CisgICAgICAgICAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworCisgICAgICAgICAgICAvKiBSZWd1bGF0b3J5IFJlbGF0ZWQgU2V0dGluZyAqLworICAgICAgICAgICAgem1fbXNnMl9tbShaTV9MVl8wLCAiUmVnRG9tYWluID0iLCBocFByaXYtPmVlcHJvbUltYWdlWzB4MjA4LzRdKTsKKyAgICAgICAgICAgIENDUyA9ICh1OF90KSgoaHBQcml2LT5lZXByb21JbWFnZVsweDIwOC80XSAmIDB4ODAwMCkgPj4gMTUpOworICAgICAgICAgICAgV1dSID0gKHU4X3QpKChocFByaXYtPmVlcHJvbUltYWdlWzB4MjA4LzRdICYgMHg0MDAwKSA+PiAxNCk7CisgICAgICAgICAgICAvKiBiZWxvdyBsaW5lIHNoYWxsIGJlIHVubWFya2VkIGFmdGVyIEEgYmFuZCBpcyByZWFkeSAqLworICAgICAgICAgICAgLy9Db3VudHJ5RG9tYWluQ29kZSA9ICh1MTZfdCkoaHBQcml2LT5lZXByb21JbWFnZVsweDIwOC80XSAmIDB4M0ZGRik7CisgICAgICAgICAgICBDb3VudHJ5RG9tYWluQ29kZSA9IDg7CisgICAgICAgICAgICBpZiAoQ0NTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMCgiQ1dZIC0gR2V0IFJlZ3VsYXRpb24gVGFibGUgZnJvbSBDb3VudHJ5IENvZGUiKTsKKyAgICAgICAgICAgICAgICB6ZkhwR2V0UmVndWxhdGlvblRhYmxlZnJvbUNvdW50cnkoZGV2LCBDb3VudHJ5RG9tYWluQ29kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cwKCJDV1kgLSBHZXQgUmVndWxhdGlvbiBUYWJsZSBmcm9tIFJlZyBEb21haW4iKTsKKyAgICAgICAgICAgICAgICB6ZkhwR2V0UmVndWxhdGlvblRhYmxlZnJvbVJlZ2lvbkNvZGUoZGV2LCBDb3VudHJ5RG9tYWluQ29kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoV1dSKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vem1fZGVidWdfbXNnMCgiQ1dZIC0gRW5hYmxlIDgwMi4xMWQiKTsKKyAgICAgICAgICAgICAgICAvKiBiZWxvdyBsaW5lIHNoYWxsIGJlIHVubWFya2VkIGFmdGVyIEEgYmFuZCBpcyByZWFkeSAqLworICAgICAgICAgICAgICAgIC8vemZpV2xhblNldERvdDExRE1vZGUoZGV2LCAxKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgemZDb3JlSGFsSW5pdENvbXBsZXRlKGRldik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBocFByaXYtPmVlcHJvbUltYWdlUmRSZXErKzsKKyAgICAgICAgICAgIHpmSHBMb2FkRUVQUk9NRnJvbUZXKGRldik7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoc3JjID09IFpNX0VFUFJPTV9XUklURSkKKyAgICB7CisgICAgICAgIHpmd0RiZ1dyaXRlRWVwcm9tRG9uZShkZXYsIGNtZFsxXSwgY21kWzJdKTsKKyAgICB9CisgICAgZWxzZSBpZiAoc3JjID09IFpNX0FOSV9SRUFEKQorICAgIHsKKyAgICAgICAgdTMyX3QgY3ljbGVUaW1lLCBjdGxDbGVhcjsKKworICAgICAgICB6bV9tc2cyX21tKFpNX0xWXzAsICJBTkkgcnNwWzFdPSIsIHJzcFsxXSk7CisgICAgICAgIHptX21zZzJfbW0oWk1fTFZfMCwgIkFOSSByc3BbMl09IiwgcnNwWzJdKTsKKyAgICAgICAgem1fbXNnMl9tbShaTV9MVl8wLCAiQU5JIHJzcFszXT0iLCByc3BbM10pOworICAgICAgICB6bV9tc2cyX21tKFpNX0xWXzAsICJBTkkgcnNwWzRdPSIsIHJzcFs0XSk7CisKKyAgICAgICAgaHBQcml2LT5jdGxCdXN5ICs9IHJzcFsxXTsKKyAgICAgICAgaHBQcml2LT5leHRCdXN5ICs9IHJzcFsyXTsKKworICAgICAgICBjeWNsZVRpbWUgPSAxMDAwMDA7IC8vMTAwIG1pbmlzZWNvbmRzCisKKyAgICAgICAgaWYgKGN5Y2xlVGltZSA+IHJzcFsxXSkKKyAgICAgICAgeworICAgICAgICAgICAgY3RsQ2xlYXIgPSAoY3ljbGVUaW1lIC0gcnNwWzFdKSAvIDEwMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGN0bENsZWFyID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAod2QtPmFuaUVuYWJsZSkKKyAgICAgICAgICAgIHpmSHBBbmlBclBvbGwoZGV2LCBjdGxDbGVhciwgcnNwWzNdLCByc3BbNF0pOworICAgIH0KKyAgICBlbHNlIGlmIChzcmMgPT0gWk1fQ01EX0VDSE8pCisgICAgeworICAgICAgICBpZiAoICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUmVJbml0ICkKKyAgICAgICAgeworICAgICAgICAgICAgemZDb3JlSGFsSW5pdENvbXBsZXRlKGRldik7CisgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJlSW5pdCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6ZkhwTG9hZEVFUFJPTUZyb21GVyhkZXYpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHNyYyA9PSBaTV9PSURfRldfRExfSU5JVCkKKyAgICB7CisgICAgICAgIHpmd0RiZ0Rvd25sb2FkRndJbml0RG9uZShkZXYpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmV3JpdGVSZWdJbnRlcm5hbFJlZyAgICAgICAqLworLyogICAgICBXcml0ZSBvbiBjaGlwIGludGVybmFsIHJlZ2lzdGVyIGltbWVkaWF0ZWx5LiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWRkciA6IHJlZ2lzdGVyIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHZhbCA6IHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDAgOiBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvdGhlciA6IGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMSAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyX3QgemZXcml0ZVJlZ0ludGVybmFsUmVnKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCB2YWwpCit7CisgICAgdTMyX3QgY21kWzNdOworICAgIHUxNl90IHJldDsKKworICAgIGNtZFswXSA9IDB4MDAwMDAxMDg7CisgICAgY21kWzFdID0gYWRkcjsKKyAgICBjbWRbMl0gPSB2YWw7CisKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCAxMiwgWk1fT0lEX0lOVEVSTkFMX1dSSVRFLCBOVUxMKTsKKyAgICByZXR1cm4gcmV0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyAgICAgKi8KKy8qICAgICAgV3JpdGUgb24gY2hpcCBpbnRlcm5hbCByZWdpc3Rlciwgd3JpdGUgb3BlcmF0aW9uIG1heSBiZSAgICAgICAgICovCisvKiAgICAgIHBvc3Rwb25lZCB0byBmb3JtIGEgbXVsdGlwbGUgd3JpdGUgY29tbWFuZC4gICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhZGRyIDogcmVnaXN0ZXIgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdmFsIDogdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMCA6IGNvbW1hbmQgYmVlbiBwb3N0cG9uZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDEgOiBjb21tYW5kcyBiZWVuIGV4ZWN1dGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjExICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QgdmFsKQoreworICAgIHUzMl90IGNtZFsoWk1fTUFYX0NNRF9TSVpFLzQpXTsKKyAgICB1MTZfdCBpOworICAgIHUxNl90IHJldDsKKworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdj13ZC0+aHBQcml2YXRlOworCisgICAgem13X2RlY2xhcmVfZm9yX2NyaXRpY2FsX3NlY3Rpb24oKTsKKworICAgIC8qIGVudGVyIGNyaXRpY2FsIHNlY3Rpb24gKi8KKyAgICB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgLyogU3RvcmUgY29tbWFuZCB0byBnbG9iYWwgYnVmZmVyICovCisgICAgaHBQcml2LT5jbWQuZGVsYXlXY21kQWRkcltocFByaXYtPmNtZC5kZWxheVdjbWRDb3VudF0gPSBhZGRyOworICAgIGhwUHJpdi0+Y21kLmRlbGF5V2NtZFZhbFtocFByaXYtPmNtZC5kZWxheVdjbWRDb3VudCsrXSA9IHZhbDsKKworICAgIC8qIElmIHBlbmRpbmcgY29tbWFuZCByZWFjaCBzaXplIGxpbWl0ICovCisgICAgaWYgKChocFByaXYtPmNtZC5kZWxheVdjbWRDb3VudCkgPj0gKChaTV9NQVhfQ01EX1NJWkUgLSA0KSA+PiAzKSkKKyAgICB7CisgICAgICAgIGNtZFswXSA9IDB4MDAwMDAxMDAgKyAoaHBQcml2LT5jbWQuZGVsYXlXY21kQ291bnQ8PDMpOworCisgICAgICAgIC8qIGNvcHkgY29tbWFuZCB0byBjbWQgYnVmZmVyICovCisgICAgICAgIGZvciAoaT0wOyBpPGhwUHJpdi0+Y21kLmRlbGF5V2NtZENvdW50OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNtZFsxKyhpPDwxKV0gPSBocFByaXYtPmNtZC5kZWxheVdjbWRBZGRyW2ldOworICAgICAgICAgICAgY21kWzIrKGk8PDEpXSA9IGhwUHJpdi0+Y21kLmRlbGF5V2NtZFZhbFtpXTsKKyAgICAgICAgfQorICAgICAgICAvKiByZXNldCBwZW5kaW5nIGNvbW1hbmQgKi8KKyAgICAgICAgaHBQcml2LT5jbWQuZGVsYXlXY21kQ291bnQgPSAwOworCisgICAgICAgIC8qIGxlYXZlIGNyaXRpY2FsIHNlY3Rpb24gKi8KKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICAvKiBpc3N1ZSB3cml0ZSBjb21tYW5kICovCisgICAgICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDQrKGk8PDMpLCBaTV9PSURfSU5URVJOQUxfV1JJVEUsIE5VTEwpOworCisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBsZWF2ZSBjcml0aWNhbCBzZWN0aW9uICovCisgICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkZsdXNoRGVsYXlXcml0ZSAgICAgICAgICAgKi8KKy8qICAgICAgRmx1c2ggcGVuZGluZyB3cml0ZSBjb21tYW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMCA6IG5vIHBlbmRpbmcgY29tbWFuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDEgOiBjb21tYW5kcyBiZWVuIGV4ZWN1dGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjExICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTZfdCB6ZkZsdXNoRGVsYXlXcml0ZSh6ZGV2X3QqIGRldikKK3sKKyAgICB1MzJfdCBjbWRbKFpNX01BWF9DTURfU0laRS80KV07CisgICAgdTE2X3QgaTsKKyAgICB1MTZfdCByZXQ7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHN0cnVjdCB6c0hwUHJpdiogaHBQcml2PXdkLT5ocFByaXZhdGU7CisKKyAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCisgICAgLyogZW50ZXIgY3JpdGljYWwgc2VjdGlvbiAqLworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisKKyAgICAvKiBJZiB0aGVyZSBpcyBwZW5kaW5nIGNvbW1hbmQgKi8KKyAgICBpZiAoaHBQcml2LT5jbWQuZGVsYXlXY21kQ291bnQgPiAwKQorICAgIHsKKyAgICAgICAgY21kWzBdID0gMHgwMDAwMDEwMCArIChocFByaXYtPmNtZC5kZWxheVdjbWRDb3VudDw8Myk7CisKKyAgICAgICAgLyogY29weSBjb21tYW5kIHRvIGNtZCBidWZmZXIgKi8KKyAgICAgICAgZm9yIChpPTA7IGk8aHBQcml2LT5jbWQuZGVsYXlXY21kQ291bnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgY21kWzErKGk8PDEpXSA9IGhwUHJpdi0+Y21kLmRlbGF5V2NtZEFkZHJbaV07CisgICAgICAgICAgICBjbWRbMisoaTw8MSldID0gaHBQcml2LT5jbWQuZGVsYXlXY21kVmFsW2ldOworICAgICAgICB9CisgICAgICAgIC8qIHJlc2V0IHBlbmRpbmcgY29tbWFuZCAqLworICAgICAgICBocFByaXYtPmNtZC5kZWxheVdjbWRDb3VudCA9IDA7CisKKyAgICAgICAgLyogbGVhdmUgY3JpdGljYWwgc2VjdGlvbiAqLworICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgICAgIC8qIGlzc3VlIHdyaXRlIGNvbW1hbmQgKi8KKyAgICAgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgNCsoaTw8MyksIFpNX09JRF9JTlRFUk5BTF9XUklURSwgTlVMTCk7CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIGxlYXZlIGNyaXRpY2FsIHNlY3Rpb24gKi8KKyAgICAgICAgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKwordTMyX3QgemZpRGJnRGVsYXlXcml0ZVJlZyh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QgdmFsKQoreworCXpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgYWRkciwgdmFsKTsKKwlyZXR1cm4gMDsKK30KKwordTMyX3QgemZpRGJnRmx1c2hEZWxheVdyaXRlKHpkZXZfdCogZGV2KQoreworCXpmRmx1c2hEZWxheVdyaXRlKGRldik7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZmlEYmdXcml0ZVJlZyAgICAgICAgICAgICAgKi8KKy8qICAgICAgV3JpdGUgcmVnaXN0ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGFkZHIgOiByZWdpc3RlciBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB2YWwgOiB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAwIDogc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgb3RoZXIgOiBmYWlsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMl90IHpmaURiZ1dyaXRlUmVnKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCB2YWwpCit7CisgICAgdTMyX3QgY21kWzNdOworICAgIHUxNl90IHJldDsKKworICAgIGNtZFswXSA9IDB4MDAwMDAxMDg7CisgICAgY21kWzFdID0gYWRkcjsKKyAgICBjbWRbMl0gPSB2YWw7CisKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCAxMiwgWk1fT0lEX1dSSVRFLCAwKTsKKyAgICByZXR1cm4gcmV0OworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmaURiZ1dyaXRlRmxhc2ggICAgICAgICAgICAqLworLyogICAgICBXcml0ZSBmbGFzaC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWRkciA6IHJlZ2lzdGVyIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHZhbCA6IHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDAgOiBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvdGhlciA6IGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBZanN1bmcgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNy4wMiAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyX3QgemZpRGJnV3JpdGVGbGFzaCh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QgdmFsKQoreworICAgIHUzMl90IGNtZFszXTsKKyAgICB1MTZfdCByZXQ7CisKKyAgICAvL2NtZFswXSA9IDB4MDAwMEIwMDg7CisJLyogbGVuWzBdIDogdHlwZVsweEIwXSA6IHNlcVs/XSAqLworICAgIGNtZFswXSA9IDggfCAoWk1fQ01EX1dGTEFTSCA8PCA4KTsKKyAgICBjbWRbMV0gPSBhZGRyOworICAgIGNtZFsyXSA9IHZhbDsKKworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDEyLCBaTV9PSURfV1JJVEUsIDApOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZmlEYmdXcml0ZUVlcHJvbSAgICAgICAgICAgICovCisvKiAgICAgIFdyaXRlIEVFUFJPTS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWRkciA6IHJlZ2lzdGVyIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHZhbCA6IHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDAgOiBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvdGhlciA6IGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBQYXVsICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDcuMDYgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyX3QgemZpRGJnV3JpdGVFZXByb20oemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCkKK3sKKyAgICB1MzJfdCBjbWRbM107CisgICAgdTE2X3QgcmV0OworCisgICAgLy9jbWRbMF0gPSAweDAwMDBCMDA4OworCS8qIGxlblswXSA6IHR5cGVbMHhCMF0gOiBzZXFbP10gKi8KKyAgICBjbWRbMF0gPSA4IHwgKFpNX0NNRF9XUkVFUFJPTSA8PCA4KTsKKyAgICBjbWRbMV0gPSBhZGRyOworICAgIGNtZFsyXSA9IHZhbDsKKworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDEyLCBaTV9FRVBST01fV1JJVEUsIDApOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZmlEYmdCbG9ja1dyaXRlRWVwcm9tICAgICAgKi8KKy8qICAgICAgQmxvY2sgV3JpdGUgRWVwcm9tLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBwLnM6IG5vdyxpdCB3aWxsIHdyaXRlIDE2IGJ5dGVzIHJlZ2lzdGVyIGRhdGEgcGVyIGJsb2NrIChOPTQpICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWRkciA6IHJlZ2lzdGVyIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGlucHV0IGRhdGEgYnVmZmVyIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDAgOiBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvdGhlciA6IGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBQYXVsICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDcuMDYgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8jZGVmaW5lIE4gICAgICAgYnVmbGVuLzQKKy8vI2RlZmluZSBTSVpFICAgICgyKk4rMSkKKwordTMyX3QgemZpRGJnQmxvY2tXcml0ZUVlcHJvbSh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QqIGJ1ZikKK3sKKyAgICB1MzJfdCBjbWRbOV07ICAvLzJOKzEKKyAgICB1MTZfdCByZXQsaTsKKworICAgIC8vY21kWzBdID0gMHgwMDAwQjAwODsKKwkgIC8qIGxlblswXSA6IHR5cGVbMHhCMF0gOiBzZXFbP10gKi8KKworICAgIC8vY21kWzBdID0gKDgqTikgfCAoWk1fQ01EX1dGTEFTSCA8PCA4KTsKKyAgICBjbWRbMF0gPSAzMiB8IChaTV9DTURfV1JFRVBST00gPDwgOCk7ICAgIC8vOE4KKworICAgIGZvciAoaT0wOyBpPDQ7IGkrKykgICAvLyBpPE4KKyAgICB7CisgICAgICAgIGNtZFsoMippKSsxXSA9IGFkZHIrKDQqaSk7CisgICAgICAgIGNtZFsoMippKSsyXSA9ICooYnVmK2kpOworICAgIH0KKworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDM2LCBaTV9FRVBST01fV1JJVEUsIDApOyAgICAvLzhOKzQKKworICAgIC8vIGFkZGVkIGZvciBFRVBST01VcGRhdGUsIHdhaXQgYSBtb21lbnQgZm9yIHByZXZlbnQgY21kIHF1ZXVlIGZ1bGwhCisgICAgLy96ZndTbGVlcChkZXYsIDEpOworCisgICAgcmV0dXJuIHJldDsKK30KKworCisvKiB3cml0ZSBFRVBST00gd2l0aCB3cmxlbiA6IHdybGVuIG11c3QgYmUgNCpuICovCisvKiBjb21tYW5kIGZvcm1hdCA6IGNtZF9pbmZvKDQpICsgYWRkcig0KSArIGVlcHJvbSh3cmxlbikgKi8KK3UzMl90IHpmaURiZ0Jsb2NrV3JpdGVFZXByb21fdjIoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90KiBidWYsIHUzMl90IHdybGVuKQoreworICAgIHUzMl90IGNtZFsxNl07CisgICAgdTE2X3QgcmV0LGk7CisKKwkgIC8qIGxlblswXSA6IHR5cGVbMHhCMF0gOiBzZXFbP10gKi8KKwkgIC8qIGxlbiA9IGFkZHIoNCkgKyBlZXByb21fYmxvY2sod3JsZW4pICovCisgICAgY21kWzBdID0gKHdybGVuKzQpIHwgKFpNX0NNRF9NRU1fV1JFRVBST00gPDwgOCk7CisgICAgY21kWzFdID0gYWRkcjsKKworICAgIGZvciAoaT0wOyBpPCh3cmxlbi80KTsgaSsrKSAgIC8vIGk8d3JsZW4vNAorICAgIHsKKyAgICAgICAgY21kWzIraV0gPSAqKGJ1ZitpKTsKKyAgICB9CisgICAgLyogY21kX2luZm8oNCkgKyBhZGRyKDQpICsgZWVwcm9tKHdybGVuKSAqLworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsICh1MTZfdCkod3JsZW4rOCksIFpNX0VFUFJPTV9XUklURSwgMCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZEYmdPcGVuRWVwcm9tICAgICAgICAgICAgKi8KKy8qICAgICAgT3BlbiBFRVBST00uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBQYXVsICAgICAgICAgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNy4wNiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB6ZkRiZ09wZW5FZXByb20oemRldl90KiBkZXYpCit7CisgICAgLy8gdW5sb2NrIEVFUFJPTQorICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxRDE0MDAsIDB4MTIzNDU2NzgpOworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxRDE0MDQsIDB4NTVhYTAwZmYpOworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxRDE0MDgsIDB4MTM1NzlhY2UpOworICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxRDE0MTQsIDB4MCk7CisgICAgemZGbHVzaERlbGF5V3JpdGUoZGV2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmRGJnQ2xvc2VFZXByb20gICAgICAgICAgICAqLworLyogICAgICBDbG9zZSBFRVBST00uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBQYXVsICAgICAgICAgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNy4wNSAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB6ZkRiZ0Nsb3NlRWVwcm9tKHpkZXZfdCogZGV2KQoreworICAgIC8vIGxvY2sgRUVQUk9NCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFEMTQwMCwgMHg4NzY1NDMyMSk7CisgICAgLy96ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIDB4MUQxNDA0LCAweGZmZmZmZmZmKTsKKyAgICAvL3pmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgMHgxRDE0MDgsIDB4ZmZmZmZmZmYpOworICAgIC8vemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCAweDFEMTQxNCwgMHgxMDApOworICAgIHpmRmx1c2hEZWxheVdyaXRlKGRldik7Cit9CisjaWYgMAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmaVNlcmlhbGx5V3JpdGVFZXByb20gICAgICAqLworLyogICAgICBXcml0ZSBFRVBST00gU2VyaWFsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWRkciA6IHN0YXJ0IGFkZHJlc3Mgb2Ygd3JpdGluZyBFRVBST00gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGlucHV0IGRhdGEgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWZsZW4gOiBzaXplIG9mIGlucHV0IGRhdGEgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgKGxlbmd0aCBvZiBkYXRhIHdyaXRlIGludG8gRUVQUk9NKSAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFBhdWwgICAgICAgICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA3LjA2ICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzJfdCB6ZmlTZXJpYWxseVdyaXRlRWVwcm9tKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCogYnVmLCB1MzJfdCBidWZsZW4pCit7CisgICAgdTMyX3QgY291bnQ7CisgICAgdTE2X3QgaSxyZXQsYmxvY2tzaXplOworICAgIHU4X3QgIHRlbXBbMl07CisKKyAgICAvLyBwZXIgNCBieXRlcyA9IDEgY291bnQKKyAgICBjb3VudCA9IGJ1Zmxlbi80OworCisgICAgLy8gT3BlbiBFRVBST00KKyAgICB6ZkRiZ09wZW5FZXByb20oZGV2KTsKKworICAgIC8vIFdyaXRlIEVFUFJPTQorICAgIGZvciAoaT0wOyBpPGNvdW50OyBpKyspCisgICAgeworICAgICAgICBpZiAoemZ3V3JpdGVFZXByb20oZGV2LCAoYWRkcisoNCppKSksICooYnVmK2kpLCAwKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBVcGRhdGUgZmFpbGVkLCBDbG9zZSBFRVBST00KKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoInpmd1dyaXRlRWVwcm9tIGZhaWxlZCBcbiIpOworICAgICAgICAgICAgemZEYmdDbG9zZUVlcHJvbShkZXYpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDbG9zZSBFRVBST00KKyAgICB6ZkRiZ0Nsb3NlRWVwcm9tKGRldik7CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKyNpZiAwCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZpU2VyaWFsbHlCbG9ja1dyaXRlRWVwcm9tICovCisvKiAgICAgICBCbG9jayBXcml0ZSBFRVBST00gU2VyaWFsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAoQmxvY2tXcml0ZTogcGVyIDE2Ynl0ZXMgd3JpdGUgRUVQUk9NIG9uY2UpICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWRkciA6IHJlZ2lzdGVyIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6IGlucHV0IGRhdGEgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWZsZW4gOiBhY2Nlc3MgZGF0YSBzaXplIG9mIGJ1ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAwIDogc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgb3RoZXIgOiBmYWlsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgUGF1bCAgICAgICAgICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDcuMDUgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMl90IHpmaVNlcmlhbGx5QmxvY2tXcml0ZUVlcHJvbSh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QqIGJ1ZiwgdTMyX3QgYnVmbGVuKQoreworICAgIHUzMl90IGNvdW50OworICAgIHUxNl90IGkscmV0LGJsb2Nrc2l6ZTsKKyAgICB1OF90ICB0ZW1wWzJdOworCisgICAgLy8gcGVyIDQgYnl0ZXMgPSAxIGNvdW50CisgICAgY291bnQgPSBidWZsZW4vNDsKKworICAgIC8vIE9wZW4gRUVQUk9NCisgICAgemZEYmdPcGVuRWVwcm9tKGRldik7CisKKyAgICAvLyBXcml0ZSBFRVBST00KKyAgICAvLyBFRVBST00gV3JpdGUgc3RhcnQgYWRkcmVzcyBmcm9tOiAweDEwMDAhPworICAgIC8vIHBlciAxNmJ5dGVzKE49NCkgYmxvY2sgd3JpdGUgRUVQUk9NIG9uY2UKKyAgICBmb3IgKGk9MDsgaTwoY291bnQvNCk7IGkrKykgICAvLyBjb3VudC9OCisgICAgeworICAgICAgICAvL3pmaURiZ0Jsb2NrV3JpdGVFZXByb20oZGV2LCAoYWRkcisoNCpOKmkpKSwgYnVmKyhOKmkpKTsKKyAgICAgICAgLy96ZmlEYmdCbG9ja1dyaXRlRWVwcm9tKGRldiwgKGFkZHIrKDE2KmkpKSwgYnVmKyg0KmkpKTsKKyAgICAgICAgaWYgKHpmd0Jsb2NrV3JpdGVFZXByb20oZGV2LCAoYWRkcisoMTYqaSkpLCBidWYrKDQqaSksIDApICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoInpmaURiZ0Jsb2NrV3JpdGVFZXByb20gZmFpbGVkIFxuIik7CisgICAgICAgICAgICAvLyBDbG9zZSBFRVBST00KKyAgICAgICAgICAgIHpmRGJnQ2xvc2VFZXByb20oZGV2KTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ2xvc2UgRUVQUk9NCisgICAgemZEYmdDbG9zZUVlcHJvbShkZXYpOworICAgIHJldHVybiAwOworfQorI2VuZGlmCisjaWYgMAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmaURiZ0R1bXBFZXByb20gICAgICAgICAgICAqLworLyogICAgICBEdW1wIEVFUFJPTS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWRkciA6IHN0YXJ0IGFkZHJlc3Mgb2YgZHVtcGluZyBFRVBST00gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRhdGFsZW4gOiAgbGVuZ3RoIG9mIGFjY2VzcyBFRVBST00gZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGJ1ZiA6ICBwb2ludCBvZiBidWZmZXIsIHRoZSBidWZmZXIgc2F2ZWQgZHVtcCBkYXRhICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDAgOiBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvdGhlciA6IGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBQYXVsICAgICAgICAgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNy4wNiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyX3QgemZpRGJnRHVtcEVlcHJvbSh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QgZGF0YWxlbiwgdTMyX3QqIGJ1ZikKK3sKKyAgICB1MzJfdCBjb3VudDsKKyAgICB1MTZfdCBpLHJldDsKKworICAgIGNvdW50ID0gZGF0YWxlbi80OworCisgICAgLy8gb3ZlciBFRVBST00gbGVuZ3RoCisgICAgaWYoZGF0YWxlbiA+IDB4MjAwMCkKKyAgICB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGZvcihpPTA7IGk8Y291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIGJ1ZltpXSA9IHpmd1JlYWRFZXByb20oZGV2LCBhZGRyKyg0KmkpKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmaURiZ1JlYWRSZWcgICAgICAgICAgICAgICAqLworLyogICAgICBSZWFkIHJlZ2lzdGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWRkciA6IHJlZ2lzdGVyIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgMCA6IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIG90aGVyIDogZmFpbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEwICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzJfdCB6ZmlEYmdSZWFkUmVnKHpkZXZfdCogZGV2LCB1MzJfdCBhZGRyKQoreworICAgIHUzMl90IGNtZFsyXTsKKyAgICB1MTZfdCByZXQ7CisKKyAgICBjbWRbMF0gPSAweDAwMDAwMDA0OworICAgIGNtZFsxXSA9IGFkZHI7CisKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCA4LCBaTV9PSURfUkVBRCwgMCk7CisgICAgcmV0dXJuIHJldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZpRGJnUmVhZFRhbGx5ICAgICAgICAgICAgICovCisvKiAgICAgIFJlYWQgcmVnaXN0ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDAgOiBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvdGhlciA6IGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMCAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyX3QgemZpRGJnUmVhZFRhbGx5KHpkZXZfdCogZGV2KQoreworICAgIHUzMl90IGNtZFsxXTsKKyAgICB1MTZfdCByZXQ7CisJem13X2dldF93bGFuX2RldihkZXYpOworCisJaWYgKCAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJlSW5pdCApCisJeworCSAgICByZXR1cm4gMTsKKwl9CisKKwkvKiBsZW5bMF0gOiB0eXBlWzB4ODFdIDogc2VxWz9dICovCisgICAgY21kWzBdID0gMCB8IChaTV9DTURfVEFMTFkgPDwgOCk7CisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgNCwgWk1fT0lEX1RBTExZLCAwKTsKKworCS8qIGxlblswXSA6IHR5cGVbMHg4Ml0gOiBzZXFbP10gKi8KKyAgICBjbWRbMF0gPSAwIHwgKFpNX0NNRF9UQUxMWV9BUEQgPDwgOCk7CisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgNCwgWk1fT0lEX1RBTExZX0FQRCwgMCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisKK3UzMl90IHpmaURiZ1NldElGU3ludGhlc2l6ZXIoemRldl90KiBkZXYsIHUzMl90IHZhbHVlKQoreworICAgIHUzMl90IGNtZFsyXTsKKyAgICB1MTZfdCByZXQ7CisKKwkvKiBsZW5bNF0gOiB0eXBlWzB4MzJdIDogc2VxWz9dICovCisgICAgY21kWzBdID0gMHg0IHwgKFpNX09JRF9TWU5USCA8PCA4KTsKKyAgICBjbWRbMV0gPSB2YWx1ZTsKKworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDgsIFpNX09JRF9TWU5USCwgMCk7CisgICAgcmV0dXJuIHJldDsKK30KKwordTMyX3QgemZpRGJnUXVlcnlId1R4QnVzeSh6ZGV2X3QqIGRldikKK3sKKyAgICB1MzJfdCBjbWRbMV07CisgICAgdTE2X3QgcmV0OworCisJLyogbGVuWzRdIDogdHlwZVsweEMwXSA6IHNlcVs/XSAqLworCWNtZFswXSA9IDAgfCAoWk1fQ01EX0RLVFhfU1RBVFVTIDw8IDgpOworCisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgNCwgWk1fT0lEX0RLVFhfU1RBVFVTLCAwKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvL1BhdWwrKworI2lmIDAKK3UxNl90IHpmSHBCbG9ja0VyYXNlRmxhc2goemRldl90ICpkZXYsIHUzMl90IGFkZHIpCit7CisgICAgdTMyX3QgY21kWyhaTV9NQVhfQ01EX1NJWkUvNCldOworICAgIHUxNl90IHJldDsKKworICAgIGNtZFswXSA9IDB4MDAwMDAwMDQgfCAoWk1fQ01EX0ZMQVNIX0VSQVNFIDw8IDgpOworICAgIGNtZFsxXSA9IGFkZHI7CisKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCA4LCBaTV9PSURfSU5URVJOQUxfV1JJVEUsIE5VTEwpOworICAgIHJldHVybiByZXQ7Cit9CisjZW5kaWYKKworI2lmIDAKK3UxNl90IHpmaURiZ1Byb2dyYW1GbGFzaCh6ZGV2X3QgKmRldiwgdTMyX3Qgb2Zmc2V0LCB1MzJfdCBsZW4sIHUzMl90ICpkYXRhKQoreworICAgIHUzMl90IGNtZFsoWk1fTUFYX0NNRF9TSVpFLzQpXTsKKyAgICB1MTZfdCByZXQ7CisgICAgdTE2X3QgaTsKKworCisgICAgY21kWzBdID0gKFpNX0NNRF9GTEFTSF9QUk9HIDw8IDgpIHwgKChsZW4rOCkgJiAweGZmKTsKKyAgICBjbWRbMV0gPSBvZmZzZXQ7CisgICAgY21kWzJdID0gbGVuOworCisgICAgZm9yIChpID0gMDsgaSA8IChsZW4gPj4gMik7IGkrKykKKyAgICB7CisgICAgICAgICBjbWRbMytpXSA9IGRhdGFbaV07CisgICAgfQorCisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgMTIsIFpNX09JRF9GTEFTSF9QUk9HUkFNLCBOVUxMKTsKKworICAgIHJldHVybiByZXQ7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmaURiZ0NoaXBFcmFzZUZsYXNoICAgICAgICAqLworLyogICAgICBDaGlwIEVyYXNlIEZsYXNoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAwIDogc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgb3RoZXIgOiBmYWlsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgUGF1bCAgICAgICAgICAgICAgICBBdGhlcm9zIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNy4wOSAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNl90IHpmaURiZ0NoaXBFcmFzZUZsYXNoKHpkZXZfdCAqZGV2KQoreworICAgIHUzMl90IGNtZFsoWk1fTUFYX0NNRF9TSVpFLzQpXTsKKyAgICB1MTZfdCByZXQ7CisKKyAgICBjbWRbMF0gPSAweDAwMDAwMDAwIHwgKFpNX0NNRF9GTEFTSF9FUkFTRSA8PCA4KTsKKworICAgIHJldCA9IHpmSXNzdWVDbWQoZGV2LCBjbWQsIDQsIFpNX09JRF9JTlRFUk5BTF9XUklURSwgTlVMTCk7CisgICAgcmV0dXJuIHJldDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZmlEYmdHZXRGbGFzaENoZWNrU3VtICAgICAgKi8KKy8qICAgICAgR2V0IEZsYXNoQ2hlY2tTdW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGFkZHIgOiBTdGFydCBhZGRyZXNzIG9mIGdldGNoa3N1bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBsZW4gOiB0b3RhbCBsZW50aCBvZiBjYWxjdWxhdGUgZ2V0Y2hrc3VtICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAwIDogc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgb3RoZXIgOiBmYWlsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgUGF1bCAgICAgICAgICAgICAgICBBdGhlcm9zIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNy4wOCAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMl90IHpmaURiZ0dldEZsYXNoQ2hlY2tTdW0oemRldl90ICpkZXYsIHUzMl90IGFkZHIsIHUzMl90IGxlbikKK3sKKyAgICB1MzJfdCBjbWRbKFpNX01BWF9DTURfU0laRS80KV07CisgICAgdTMyX3QgcmV0OworCisgICAgY21kWzBdID0gMHgwMDAwMDAwOCB8IChaTV9DTURfRkxBU0hfQ0hLU1VNIDw8IDgpOworICAgIGNtZFsxXSA9IGFkZHI7CisgICAgY21kWzJdID0gbGVuOworCisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgMTIsIFpNX09JRF9GTEFTSF9DSEtTVU0sIE5VTEwpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmaURiZ1JlYWRGbGFzaCAgICAgICAgICAgICAqLworLyogICAgICBSZWFkIEZsYXNoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWRkciA6IFN0YXJ0IGFkZHJlc3Mgb2YgcmVhZCBmbGFzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGxlbiA6IHRvdGFsIGxlbnRoIG9mIHJlYWQgZmxhc2ggZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDAgOiBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBvdGhlciA6IGZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBQYXVsICAgICAgICAgICAgICAgIEF0aGVyb3MgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA3LjA5ICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyX3QgemZpRGJnUmVhZEZsYXNoKHpkZXZfdCAqZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCBsZW4pCit7CisgICAgdTMyX3QgY21kWyhaTV9NQVhfQ01EX1NJWkUvNCldOworICAgIHUzMl90IHJldDsKKworICAgIGNtZFswXSA9IGxlbiB8IChaTV9DTURfRkxBU0hfUkVBRCA8PCA4KTsKKyAgICBjbWRbMV0gPSBhZGRyOworCisgICAgcmV0ID0gemZJc3N1ZUNtZChkZXYsIGNtZCwgOCwgWk1fT0lEX0ZMQVNIX1JFQUQsIE5VTEwpOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZmlEb3dubG9hZEZ3U2V0ICAgICAgICAgICAgKi8KKy8qICAgICAgQmVmb3JlIERvd25sb2FkIEZXLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIENvbW1hbmQgRlcgdG8gU29mdHdhcmUgcmVzZXQgYW5kIGNsb3NlIHdhdGNoIGRvZyBjb250cm9sLiAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAwIDogc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgb3RoZXIgOiBmYWlsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgUGF1bCAgICAgICAgICAgICAgICBBdGhlcm9zIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNy4wOSAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMl90IHpmaURvd25sb2FkRndTZXQoemRldl90ICpkZXYpCit7CisvL3NvZnR3YXJlcmVzZXQKKy8vY2xvc2Ugd2F0Y2ggZG9nCisgICAgdTMyX3QgY21kWyhaTV9NQVhfQ01EX1NJWkUvNCldOworICAgIHUzMl90IHJldDsKKworICAgIGNtZFswXSA9IDB4MDAwMDAwMDggfCAoWk1fQ01EX0ZXX0RMX0lOSVQgPDwgOCk7CisKKyAgICByZXQgPSB6Zklzc3VlQ21kKGRldiwgY21kLCAxMiwgWk1fT0lEX0ZXX0RMX0lOSVQsIE5VTEwpOworCisgICAgcmV0dXJuIHJldDsKK30KKy8vUGF1bC0tCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHB1c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocHVzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNzZkZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvaHB1c2IuYwpAQCAtMCwwICsxLDE1ODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IHVkLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgVVNCIGRlc2NyaXB0b3IgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICIuLi84MDIxMWNvcmUvY3ByZWNvbXAuaCIKKyNpbmNsdWRlICJocGFuaS5oIgorI2luY2x1ZGUgImhwdXNiLmgiCisKK2V4dGVybiB2b2lkIHpmd1VzYkNtZCh6ZGV2X3QqIGRldiwgdThfdCBlbmRwdCwgdTMyX3QqIGNtZCwgdTE2X3QgY21kTGVuKTsKKworZXh0ZXJuIHZvaWQgemZJZGxSc3AoemRldl90KiBkZXYsIHUzMl90KiByc3AsIHUxNl90IHJzcExlbik7CitleHRlcm4gdTE2X3QgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCk7CitleHRlcm4gdTE2X3QgemZGbHVzaERlbGF5V3JpdGUoemRldl90KiBkZXYpOworCisKKyNkZWZpbmUgVVNCX0VORFBPSU5UX1RYX0lOREVYICAgMQorI2RlZmluZSBVU0JfRU5EUE9JTlRfUlhfSU5ERVggICAyCisjZGVmaW5lIFVTQl9FTkRQT0lOVF9JTlRfSU5ERVggIDMKKyNkZWZpbmUgVVNCX0VORFBPSU5UX0NNRF9JTkRFWCAgNAorCit2b2lkIHpmSWRsQ21kKHpkZXZfdCogZGV2LCB1MzJfdCogY21kLCB1MTZfdCBjbWRMZW4pCit7CisjaWYgWk1fU1dfTE9PUF9CQUNLICE9IDEKKyAgICB6ZndVc2JDbWQoZGV2LCBVU0JfRU5EUE9JTlRfQ01EX0lOREVYLCBjbWQsIGNtZExlbik7CisjZW5kaWYKKworICAgIHJldHVybjsKK30KKworCisvKiB6ZkFkanVzdEN0cmxTZXR0aW5nOiBmaXQgT1VUUyBmb3JtYXQgKi8KKy8qICAgICBjb252ZXJ0IE1JTU8yIHRvIE9VVFMgICAgICAgICAgICAgKi8KK3ZvaWQgemZBZGp1c3RDdHJsU2V0dGluZyh6ZGV2X3QqIGRldiwgdTE2X3QqIGhlYWRlciwgemJ1Zl90KiBidWYpCit7CisgICAgLyogTUlNTzIgPT4gT1VUUyBGQi01MCAqLworICAgIC8qIGxlbmd0aCBub3QgY2hhbmdlLCBvbmx5IG1vZGlmeSBmb3JtYXQgKi8KKworICAgIHUzMl90IG9sZE1UOworCXUzMl90IG9sZE1DUzsKKworICAgIHUzMl90IHBoeUN0cmw7CisgICAgdTMyX3Qgb2xkUGh5Q3RybDsKKworICAgIHUxNl90IHRwYyA9IDA7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisgICAgc3RydWN0IHpzSHBQcml2KiBocFByaXY9d2QtPmhwUHJpdmF0ZTsKKworICAgLyogbW0gKi8KKyAgICBpZiAoaGVhZGVyID09IE5VTEwpCisgICAgeworICAgICAgICBvbGRQaHlDdHJsID0gem13X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNCkgfCAoKHUzMl90KXptd19idWZfcmVhZGgoZGV2LCBidWYsIDYpIDw8IDE2KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgb2xkUGh5Q3RybCA9IGhlYWRlclsyXSB8ICgodTMyX3QpaGVhZGVyWzNdIDw8MTYpOworICAgIH0KKworCXBoeUN0cmwgPSAwOworCisKKwkvKiBNVCA6IEJpdFsxfjBdICovCisJb2xkTVQgPSBvbGRQaHlDdHJsJjB4MzsKKwlwaHlDdHJsIHw9IG9sZE1UOworICAgIGlmICggb2xkTVQgPT0gMHgzICkgICAvKiBETC1PRkRNIChEdXBsaWNhdGUgTGVnYWN5IE9GRE0pICovCisJCXBoeUN0cmwgfD0gMHgxOworCisKKwkvKiBQVCA6IEJpdFsyXSAgICBIVCBQVDogMCBNaXhlZCBtb2RlICAgIDEgR3JlZW4gZmllbGQgKi8KKwlwaHlDdHJsIHw9IChvbGRQaHlDdHJsJjB4NCk7CisKKwkvKiBCYW5kd2lkdGggY29udHJvbCA6IEJpdFs0fjNdICovCisJaWYgKCBvbGRQaHlDdHJsJjB4ODAwMDAwICkgICAgLyogQml0MjMgOiA0ME0gKi8KKwl7CisJCSNpZiAwCisJCWlmIChvbGRNVCA9PSAweDMpICAgICAgICAgICAgIC8qIERMLU9GRE0gKi8KKyAgICAgICAgICAgIHBoeUN0cmwgfD0gKDB4Mzw8Myk7ICAgLyogNDBNIGR1cGxpY2F0ZSAqLworCQllbHNlCisJCQlwaHlDdHJsIHw9ICgweDI8PDMpOyAgIC8qIDQwTSBzaGFyZWQgKi8KKwkJI2Vsc2UKKwkJaWYgKG9sZE1UID09IDB4MiAmJiAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmh3Qnc0MCkKKwkJeworCQkJcGh5Q3RybCB8PSAoMHgyPDwzKTsgICAvKiA0ME0gc2hhcmVkICovCisJCX0KKwkJI2VuZGlmCisJfQorCWVsc2UgeworICAgICAgICBvbGRQaHlDdHJsICY9IH4weDgwMDAwMDAwOworICAgIH0KKworCS8qIE1DUyA6IEJpdFsyNH4xOF0gKi8KKwlvbGRNQ1MgPSAob2xkUGh5Q3RybCYweDdmMDAwMCk+PjE2OyAgLyogQml0WzIyfjE2XSAqLworCXBoeUN0cmwgfD0gKG9sZE1DUzw8MTgpOworCisJLyogU2hvcnQgR0kgOiBCaXRbMzFdKi8KKyAgICBwaHlDdHJsIHw9IChvbGRQaHlDdHJsJjB4ODAwMDAwMDApOworCisJLyogQU0gOiBBbnRlbm5hIG1hc2sgKi8KKwkvL2lmICgob2xkTVQgPT0gMikgJiYgKG9sZE1DUyA+IDcpKQorCWlmIChocFByaXYtPmhhbENhcGFiaWxpdHkgJiBaTV9IUF9DQVBfMTFOX09ORV9UWF9TVFJFQU0pCisJeworCSAgICBwaHlDdHJsIHw9ICgweDE8PDE1KTsKKwl9CisJZWxzZQorCXsKKwkgICAgLyogSFQgICAgICAgICAgICAgICAgICAgICBUeCAyIGNoYWluICovCisJICAgIC8qIE9GRE0gNk0vOU0vMTJNLzE4TS8yNE0gVHggMiBjaGFpbiAqLworCSAgICAvKiBPRkRNIDM2TS80OE0vNTRNLyAgICAgIFR4IDEgY2hhaW4gKi8KKwkgICAgLyogQ0NLICAgICAgICAgICAgICAgICAgICBUeCAyIGNoYWluICovCisJICAgIGlmICgob2xkTVQgPT0gMikgfHwgKG9sZE1UID09IDMpKQorCSAgICB7CisJICAgICAgICBwaHlDdHJsIHw9ICgweDU8PDE1KTsKKwkgICAgfQorCSAgICBlbHNlIGlmIChvbGRNVCA9PSAxKQorCSAgICB7CisJICAgICAgICBpZiAoKG9sZE1DUyA9PSAweGIpIHx8IChvbGRNQ1MgPT0gMHhmKSB8fAorCSAgICAgICAgICAgIChvbGRNQ1MgPT0gMHhhKSB8fCAob2xkTUNTID09IDB4ZSkgfHwKKwkgICAgICAgICAgICAob2xkTUNTID09IDB4OSkpICAgICAgICAgICAgICAgICAgICAgICAvLzZNLzlNLzEyTS8xOE0vMjRNCisJICAgICAgICB7CisJICAgICAgICAgICAgcGh5Q3RybCB8PSAoMHg1PDwxNSk7CisJICAgICAgICB9CisJICAgICAgICBlbHNlCisJICAgICAgICB7CisJICAgICAgICAgICAgcGh5Q3RybCB8PSAoMHgxPDwxNSk7CisJICAgICAgICB9CisJICAgIH0KKwkgICAgZWxzZSAvLyhvbGRNVD09MCkKKwkgICAgeworCSAgICAgICAgcGh5Q3RybCB8PSAoMHg1PDwxNSk7CisJICAgIH0KKwl9CisJLy9lbHNlCisJLy8gICAgcGh5Q3RybCB8PSAoMHgxPDwxNSk7CisKKwkvKiBUUEMgKi8KKwkvKiBUT0RPIDogYWNjZWxlcmF0aW5nIHRoZXNlIGNvZGUgKi8KKwlpZiAoaHBQcml2LT5od0ZyZXF1ZW5jeSA8IDMwMDApCisJeworICAgICAgICBpZiAob2xkTVQgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQ0NLICovCisgICAgICAgICAgICB0cGMgPSAoaHBQcml2LT50UG93MnhDY2tbb2xkTUNTXSYweDNmKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChvbGRNVCA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBPRkRNICovCisgICAgICAgICAgICBpZiAob2xkTUNTID09IDB4YykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cGMgPSAoaHBQcml2LT50UG93MngyZ1szXSYweDNmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKG9sZE1DUyA9PSAweDgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHBjID0gKGhwUHJpdi0+dFBvdzJ4MmdbMl0mMHgzZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChvbGRNQ1MgPT0gMHhkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRwYyA9IChocFByaXYtPnRQb3cyeDJnWzFdJjB4M2YpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAob2xkTUNTID09IDB4OSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cGMgPSAoKGhwUHJpdi0+dFBvdzJ4MmdbMF0taHBQcml2LT50UG93MngyZzI0SGVhdnlDbGlwT2Zmc2V0KSYweDNmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cGMgPSAoaHBQcml2LT50UG93MngyZ1swXSYweDNmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChvbGRNVCA9PSAyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIG9sZFBoeUN0cmwmMHg4MDAwMDAgKSAgICAvKiBCaXQyMyA6IDQwTSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEhUIDQwICovCisgICAgICAgICAgICAgICAgdHBjID0gKGhwUHJpdi0+dFBvdzJ4MmdIdDQwW29sZE1DUyYweDddJjB4M2YpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEhUIDIwICovCisgICAgICAgICAgICAgICAgdHBjID0gKGhwUHJpdi0+dFBvdzJ4MmdIdDIwW29sZE1DUyYweDddJjB4M2YpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgIC8vNUdIegorICAgIHsKKyAgICAgICAgaWYgKG9sZE1UID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE9GRE0gKi8KKyAgICAgICAgICAgIGlmIChvbGRNQ1MgPT0gMHhjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRwYyA9IChocFByaXYtPnRQb3cyeDVnWzNdJjB4M2YpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAob2xkTUNTID09IDB4OCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cGMgPSAoaHBQcml2LT50UG93Mng1Z1syXSYweDNmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKG9sZE1DUyA9PSAweGQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHBjID0gKGhwUHJpdi0+dFBvdzJ4NWdbMV0mMHgzZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHBjID0gKGhwUHJpdi0+dFBvdzJ4NWdbMF0mMHgzZik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAob2xkTVQgPT0gMikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBvbGRQaHlDdHJsJjB4ODAwMDAwICkgICAgLyogQml0MjMgOiA0ME0gKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBIVCA0MCAqLworICAgICAgICAgICAgICAgIHRwYyA9IChocFByaXYtPnRQb3cyeDVnSHQ0MFtvbGRNQ1MmMHg3XSYweDNmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBIVCAyMCAqLworICAgICAgICAgICAgICAgIHRwYyA9IChocFByaXYtPnRQb3cyeDVnSHQyMFtvbGRNQ1MmMHg3XSYweDNmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFR4IHBvd2VyIGFkanVzdCBmb3IgSFQ0MCAqLworCS8qIEhUNDAgICArMWRCbSAqLworCWlmICgob2xkTVQ9PTIpICYmIChvbGRQaHlDdHJsJjB4ODAwMDAwKSApCisJeworCSAgICB0cGMgKz0gMjsKKwl9CisJdHBjICY9IDB4M2Y7CisKKyAgICAvKiBFdmwgZm9yY2UgdHggVFBDICovCisgICAgaWYod2QtPmZvcmNlVHhUUEMpCisgICAgeworICAgICAgICB0cGMgPSAodTE2X3QpKHdkLT5mb3JjZVR4VFBDICYgMHgzZik7CisgICAgfQorCisgICAgaWYgKGhwUHJpdi0+aHdGcmVxdWVuY3kgPCAzMDAwKSB7CisgICAgICAgIHdkLT5tYXhUeFBvd2VyMiAmPSAweDNmOworICAgICAgICB0cGMgPSAodHBjID4gd2QtPm1heFR4UG93ZXIyKT8gd2QtPm1heFR4UG93ZXIyIDogdHBjOworICAgIH0gZWxzZSB7CisgICAgICAgIHdkLT5tYXhUeFBvd2VyNSAmPSAweDNmOworICAgICAgICB0cGMgPSAodHBjID4gd2QtPm1heFR4UG93ZXI1KT8gd2QtPm1heFR4UG93ZXI1IDogdHBjOworICAgIH0KKworCisjZGVmaW5lIFpNX01JTl9UUEMgICAgIDUKKyNkZWZpbmUgWk1fVFBDX09GRlNFVCAgNQorI2RlZmluZSBaTV9TSUdOQUxfVEhSRVNIT0xEICA1NgorICAgIGlmICgod2QtPnN0YS5iU2NoZWR1bGVTY2FuID09IEZBTFNFKSAmJiAod2QtPnN0YS5iQ2hhbm5lbFNjYW4gPT0gRkFMU0UpKQorICAgIHsKKyAgICAgICAgaWYgKCggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUgKQorICAgICAgICAgICAgICAgICYmICh6ZlN0YUlzQ29ubmVjdGVkKGRldikpCisgICAgICAgICAgICAgICAgJiYgKHdkLT5TaWduYWxTdHJlbmd0aCA+IFpNX1NJR05BTF9USFJFU0hPTEQpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodHBjID4gKChaTV9NSU5fVFBDK1pNX1RQQ19PRkZTRVQpKjIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRwYyAtPSAoWk1fVFBDX09GRlNFVCoyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHRwYyA+IChaTV9NSU5fVFBDKjIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRwYyA9IChaTV9NSU5fVFBDKjIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI3VuZGVmIFpNX01JTl9UUEMKKyN1bmRlZiBaTV9UUENfT0ZGU0VUCisjdW5kZWYgWk1fU0lHTkFMX1RIUkVTSE9MRAorCisgICAgI2lmbmRlZiBaTV9PVFVTX0xJTlVYX1BIQVNFXzIKKyAgICBwaHlDdHJsIHw9ICh0cGMgJiAweDNmKSA8PCA5OworICAgICNlbmRpZgorCisgICAgLyogU2V0IGJpdHNbODo2XUJGLU1DUyBmb3IgaGVhdnkgY2xpcCAqLworICAgIGlmICgocGh5Q3RybCYweDMpID09IDIpCisJeworCSAgICBwaHlDdHJsIHw9ICgocGh5Q3RybCA+PiAxMikgJiAweDFjMCk7CisgICAgfQorCisJLyogUEhZIGNvbnRyb2wgKi8KKyAgICBpZiAoaGVhZGVyID09IE5VTEwpCisgICAgeworICAgICAgICB6bXdfYnVmX3dyaXRlaChkZXYsIGJ1ZiwgNCwgKHUxNl90KSAocGh5Q3RybCYweGZmZmYpKTsKKyAgICAgICAgem13X2J1Zl93cml0ZWgoZGV2LCBidWYsIDYsICh1MTZfdCkgKHBoeUN0cmw+PjE2KSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vUEhZIGNvbnRyb2wgTAorICAgICAgICBoZWFkZXJbMl0gPSAodTE2X3QpIChwaHlDdHJsJjB4ZmZmZik7CisgICAgICAgIC8vUEhZIGNvbnRyb2wgSAorICAgICAgICBoZWFkZXJbM10gPSAodTE2X3QpIChwaHlDdHJsPj4xNik7CisgICAgfQorCisJem1fbXNnMl90eChaTV9MVl8yLCAib2xkIHBoeSBjdHJsID0gIiwgb2xkUGh5Q3RybCk7CisgICAgem1fbXNnMl90eChaTV9MVl8yLCAibmV3IHBoeSBjdHJsID0gIiwgcGh5Q3RybCk7CisJLy9EYmdQcmludCgib2xkIHBoeSBjdHJsID0lMDh4IFxuIiwgb2xkUGh5Q3RybCk7CisgICAgLy9EYmdQcmludCgibmV3IHBoeSBjdHJsID0lMDh4IFxuIiwgcGh5Q3RybCk7Cit9CisKKworI2RlZmluZSBFWFRSQV9JTkZPX0xFTiAgICAgIDI0ICAgIC8vUlNTSSg3KSArIEVWTSgxMikgKyBQSFkoMSkgKyBNQUNTdGF0dXMoNCkKK3UxNl90IHpmSHBTZW5kKHpkZXZfdCogZGV2LCB1MTZfdCogaGVhZGVyLCB1MTZfdCBoZWFkZXJMZW4sCisgICAgICAgICAgICAgICAgdTE2X3QqIHNuYXAsIHUxNl90IHNuYXBMZW4sCisgICAgICAgICAgICAgICAgdTE2X3QqIHRhaWwsIHUxNl90IHRhaWxMZW4sIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgdTE2X3QgYnVmVHlwZSwgdThfdCBhYywgdThfdCBrZXlJZHgpCit7CisjaWYgWk1fU1dfTE9PUF9CQUNLID09IDEKKyAgICB6YnVmX3QgKnJ4YnVmOworICAgIHU4X3QgKnB1UnhCdWY7CisgICAgdThfdCAqcEhkcjsKKwkgICB1OF90ICpwc25hcDsKKwkgICB1MTZfdCBwbGNwbGVuID0gMTI7CisgICAgdTE2X3QgaTsKKyAgIAl1MTZfdCBzd2xwT2Zmc2V0OworI2VuZGlmIC8qICNpZiBaTV9TV19MT09QX0JBQ0sgPT0gMSAqLworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdj13ZC0+aHBQcml2YXRlOworCisgICAgem1fbXNnMV90eChaTV9MVl8xLCAiemZIcFNlbmQoKSwgbGVuID0gIiwgMTIgKyBoZWFkZXJMZW4tOCArIHNuYXBMZW4gKyB6ZndCdWZHZXRTaXplKGRldiwgYnVmKSArIDQgKyA4KTsKKworCS8qIEFkanVzdCBjdHJsIHNldHRpbmcgOiA2TjE0IHlqc3VuZyAqLworICAgIHpmQWRqdXN0Q3RybFNldHRpbmcoZGV2LCBoZWFkZXIsIGJ1Zik7CisKKyNpZiBaTV9TV19MT09QX0JBQ0sgIT0gMQorICAgIGhwUHJpdi0+dXNiU2VuZEJ5dGVzICs9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworICAgIGhwUHJpdi0+dXNiQWNTZW5kQnl0ZXNbYWMmMHgzXSArPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKworICAgIC8qIFN1Ym1pdCBVU0IgT3V0IFVyYiAqLworICAgIHpmd1VzYlNlbmQoZGV2LCBVU0JfRU5EUE9JTlRfVFhfSU5ERVgsICh1OF90ICopaGVhZGVyLCBoZWFkZXJMZW4sCisgICAgICAgICAgICAgICAgICAodThfdCAqKXNuYXAsIHNuYXBMZW4sICh1OF90ICopdGFpbCwgdGFpbExlbiwgYnVmLCBvZmZzZXQpOworI2VuZGlmCisKKyNpZiBaTV9TV19MT09QX0JBQ0sgPT0gMQorCisgICAgcnhidWYgPSB6ZndCdWZBbGxvY2F0ZShkZXYsIHBsY3BsZW4gKyBoZWFkZXJMZW4tOCArIHNuYXBMZW4gKyAoemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Ziktb2Zmc2V0KSArIDQgKyBFWFRSQV9JTkZPX0xFTik7CisgICAgcEhkciA9ICh1OF90ICopIGhlYWRlcis4OworICAgCXBzbmFwID0gKHU4X3QgKikgc25hcDsKKworICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgLyogc29mdHdhcmUgbG9vcCBiYWNrICovCisgICAgLyogQ29weSBXTEFOIGhlYWRlciBhbmQgcGFja2V0IGJ1ZmZlciAqLworICAgCXN3bHBPZmZzZXQgPSBwbGNwbGVuOworCisgICAgZm9yKGkgPSAwOyBpIDwgaGVhZGVyTGVuLTg7IGkrKykKKyAgICB7CisgICAgICAgIHptd19yeF9idWZfd3JpdGViKGRldiwgcnhidWYsIHN3bHBPZmZzZXQraSwgcEhkcltpXSk7CisgICAgfQorCisgICAJc3dscE9mZnNldCArPSBoZWFkZXJMZW4tODsKKworICAgIC8qIENvcHkgU05BUCBoZWFkZXIgKi8KKyAgICBmb3IoaSA9IDA7IGkgPCBzbmFwTGVuOyBpKyspCisgICAgeworCQkgICAgICB6bXdfcnhfYnVmX3dyaXRlYihkZXYsIHJ4YnVmLCBzd2xwT2Zmc2V0K2ksIHBzbmFwW2ldKTsKKyAgICB9CisKKwkgICBzd2xwT2Zmc2V0ICs9IHNuYXBMZW47CisKKyAgICAvKiBDb3B5IGJvZHkgZnJvbSB0eCBidWYgdG8gcnhidWYgKi8KKyAgICBmb3IoaSA9IDA7IGkgPCAoemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Ziktb2Zmc2V0KTsgaSsrKQorICAgIHsKKyAgICAgICAgdThfdCB2YWx1ZSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIGkrb2Zmc2V0KTsKKyAgICAgICAgem13X3J4X2J1Zl93cml0ZWIoZGV2LCByeGJ1Ziwgc3dscE9mZnNldCtpLCB2YWx1ZSk7CisgICAgfQorCisJICAgLyogdG90YWwgbGVuZ3RoID0gUExDUCArICAgICAgICAgTWFjSGVhZGVyICAgICAgICsgUGF5bG9hZCAgICsgRkNTICsgUlhzdGF0dXMgKi8KKwkgICAvKiAgICAgICAgICAgICAgICAgMTIgICsgIGhlYWRlckxlbi04ICArIHNuYXBMZW4gKyBidWYgbGVuZ3RoICsgNCAgKyA4ICAgICAgICAqLworICAgCXpmd1NldEJ1ZlNldFNpemUoZGV2LCByeGJ1Ziwgc3dscE9mZnNldCArICh6ZndCdWZHZXRTaXplKGRldiwgYnVmKS1vZmZzZXQpICsgNCArIEVYVFJBX0lORk9fTEVOICk7CisKKyAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworCisgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisKKwkgICAvL3pmd0R1bXBCdWYoZGV2LCByeGJ1Zik7CisJICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvL3pmQ29yZVJlY3YoZGV2LCByeGJ1Zik7CisKKyNlbmRpZiAvKiAjaWYgWk1fU1dfTE9PUF9CQUNLICovCisKKyAgICByZXR1cm4gWk1fU1VDQ0VTUzsKK30KKworLyogUmVwb3J0IG1vbml0ZXIgSGFsIHJ4IGluZm9ybWF0aW9uIGFib3V0IHJzc2ksIGV2bSwgYmFuZHdpZHRoLCBTRyBldGMgKi8KK3ZvaWQgemZIcFF1ZXJ5TW9uSGFsUnhJbmZvKHpkZXZfdCogZGV2LCB1OF90ICptb25IYWxSeEluZm8pCit7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworICAgIHpmTWVtb3J5Q29weShtb25IYWxSeEluZm8sCisgICAgICAgICAgICAgICAgKHU4X3QqKSYoKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8pLAorICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgenNIYWxSeEluZm8pKTsKK30KKworCit1OF90IHpmSXNEYXRhRnJhbWUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHU4X3QgZnJhbWVUeXBlOworICAgIHU4X3QgbXBkdUluZDsKKworICAgIG1wZHVJbmQgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCB6ZndCdWZHZXRTaXplKGRldiwgYnVmKS0xKTsKKworICAgIC8qIHNpbmxnZSBvciBGaXJzdCAqLworICAgIGlmICgobXBkdUluZCAmIDB4MzApID09IDB4MDAgfHwgKG1wZHVJbmQgJiAweDMwKSA9PSAweDIwKQorICAgIHsKKyAgICAgICAgZnJhbWVUeXBlID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMTIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmcmFtZVR5cGUgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKTsKKyAgICB9CisKKyAgICBpZigoZnJhbWVUeXBlICYgMHhmKSA9PSBaTV9XTEFOX0RBVEFfRlJBTUUpCisgICAgICAgIHJldHVybiAxOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3UzMl90IHpmY0NvbnZlcnRSYXRlT0ZETSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgLy8gV2hhdCdzIHRoZSBkZWZhdWx0IHZhbHVlPz8KKyAgICB1MzJfdCBNQ1MgPSAwOworCisgICAgc3dpdGNoKHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDApJiAweGYpCisgICAgeworICAgICAgICBjYXNlIDB4YjoKKyAgICAgICAgICAgIE1DUyA9IDB4NDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4ZjoKKyAgICAgICAgICAgIE1DUyA9IDB4NTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4YToKKyAgICAgICAgICAgIE1DUyA9IDB4NjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4ZToKKyAgICAgICAgICAgIE1DUyA9IDB4NzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4OToKKyAgICAgICAgICAgIE1DUyA9IDB4ODsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4ZDoKKyAgICAgICAgICAgIE1DUyA9IDB4OTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4ODoKKyAgICAgICAgICAgIE1DUyA9IDB4YTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4YzoKKyAgICAgICAgICAgIE1DUyA9IDB4YjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gTUNTOworfQorCit1MTZfdCB6ZkhwR2V0UGF5bG9hZExlbih6ZGV2X3QqIGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHpidWZfdCogYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgdTE2X3QgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgdTE2X3QgcGxjcEhkckxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ICpyeE1ULAorICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3QgKnJ4TUNTLAorICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3QgKnJ4QlcsCisgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdCAqcnhTRworICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICAgIHU4X3QgbW9kdWxhdGlvbixtcGR1SW5kOworICAgIHUxNl90IGxvdywgaGlnaCwgbXNiOworICAgIHMxNl90IHBheWxvYWRMZW4gPSAwOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgbXBkdUluZCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIGxlbi0xKTsKKyAgICBtb2R1bGF0aW9uID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgKGxlbi0xKSkgJiAweDM7CisgICAgKnJ4TVQgPSBtb2R1bGF0aW9uOworCisgICAgLy96bV9kZWJ1Z19tc2cxKCIgbW9kdWxhdGlvbj0gIiwgbW9kdWxhdGlvbik7CisgICAgc3dpdGNoIChtb2R1bGF0aW9uKSB7CisgICAgY2FzZSAwOiAvKiBDQ0sgTW9kZSAqLworICAgICAgICBsb3cgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAyKTsKKyAgICAgICAgaGlnaCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDMpOworICAgICAgICBwYXlsb2FkTGVuID0gKGxvdyB8IGhpZ2ggPDwgOCkgLSA0OworICAgICAgICBpZiAod2QtPmVuYWJsZUhBTERiZ0luZm8pCisgICAgICAgIHsKKyAgICAgICAgICAgICpyeE1DUyA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDApOworICAgICAgICAgICAgKnJ4QlcgID0gMDsKKyAgICAgICAgICAgICpyeFNHICA9IDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOiAvKiBMZWdhY3ktT0ZETSBtb2RlICovCisgICAgICAgIGxvdyA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDApID4+IDU7CisgICAgICAgIGhpZ2ggPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAxKTsKKyAgICAgICAgbXNiID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMikgJiAweDE7CisgICAgICAgIHBheWxvYWRMZW4gPSAobG93IHwgKGhpZ2ggPDwgMykgfCAobXNiIDw8IDExKSkgLSA0OworICAgICAgICBpZiAod2QtPmVuYWJsZUhBTERiZ0luZm8pCisgICAgICAgIHsKKyAgICAgICAgICAgICpyeE1DUyA9IHpmY0NvbnZlcnRSYXRlT0ZETShkZXYsIGJ1Zik7CisgICAgICAgICAgICAqcnhCVyAgPSAwOworICAgICAgICAgICAgKnJ4U0cgID0gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6IC8qIEhUIE9GRE0gbW9kZSAqLworICAgICAgICAvL3ptX2RlYnVnX21zZzEoImFnZ3JlZ2F0aW9uPSAiLCAoem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgNikgPj4gMykgJjB4MSApOworICAgICAgICBpZiAoKG1wZHVJbmQgJiAweDMwKSA9PSAweDAwIHx8IChtcGR1SW5kICYgMHgzMCkgPT0gMHgxMCkgICAgLy9zaW5nbGUgb3IgbGFzdCBtcGR1CisgICAgICAgICAgICBwYXlsb2FkTGVuID0gbGVuIC0gMjQgLSA0IC0gcGxjcEhkckxlbjsgIC8vIC0gcnhTdGF0dXMgLSBmY3MKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBwYXlsb2FkTGVuID0gbGVuIC0gNCAtIDQgLSBwbGNwSGRyTGVuOyAgLy8gLSByeFN0YXR1cyAtIGZjcworICAgICAgICAgICAgLy96bV9kZWJ1Z19tc2cxKCJmaXJzdCBvciBtaWRkbGUgbXBkdSwgcGxjcEhkckxlbj0gIiwgcGxjcEhkckxlbik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdkLT5lbmFibGVIQUxEYmdJbmZvKQorICAgICAgICB7CisgICAgICAgICAgICAqcnhNQ1MgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAzKSAmIDB4N2Y7CisgICAgICAgICAgICAqcnhCVyAgPSAoem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMykgPj4gNykgJiAweDE7CisgICAgICAgICAgICAqcnhTRyAgPSAoem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgNikgPj4gNykgJiAweDE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisKKyAgICB9CisgICAgLyogcmV0dXJuIHRoZSBwYXlsb2FkIGxlbmd0aCAtIEZDUyAqLworICAgIGlmIChwYXlsb2FkTGVuIDwgMCkgcGF5bG9hZExlbiA9IDA7CisgICAgcmV0dXJuIHBheWxvYWRMZW47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZmlVc2JSZWN2ICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIFVTQiBJTiBUcmFuc2Zlci4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2OiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgWXVhbi1HdSBXZWkgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMCAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgWk1fSU5UX1VTRV9FUDIgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaTV9JTlRfVVNFX0VQMl9IRUFERVJfU0laRSAgIDEyCisKKyNpZiBaTV9JTlRfVVNFX0VQMiA9PSAxCit2b2lkIHpmaVVzYlJlZ0luKHpkZXZfdCogZGV2LCB1MzJfdCogcnNwLCB1MTZfdCByc3BMZW4pOworI2VuZGlmCisKKyNpZmRlZiBaTV9PVFVTX1JYX1NUUkVBTV9NT0RFCit2b2lkIHpmaVVzYlJlY3ZQZXJQa3QoemRldl90ICpkZXYsIHpidWZfdCAqYnVmKQorI2Vsc2UKK3ZvaWQgemZpVXNiUmVjdih6ZGV2X3QgKmRldiwgemJ1Zl90ICpidWYpCisjZW5kaWYKK3sKKworCisjaWYgWk1fRldfTE9PUF9CQUNLICE9IDEKKyAgICB1OF90IG1wZHVJbmQ7CisgICAgdTE2X3QgcGxjcEhkckxlbjsKKyAgICB1MTZfdCBjcmNQbHVzUnhTdGF0dXNMZW47CisgICAgdTE2X3QgbGVuLCBwYXlsb2FkTGVuPTA7CisgICAgdTE2X3QgaTsgLy9DV1lhbmcoKykKKyAgICBzdHJ1Y3QgenNBZGRpdGlvbkluZm8gYWRkSW5mbzsKKyAgICB1MzJfdCAgICAgICAgICAgICAgIHJ4TVQ7CisgICAgdTMyX3QgICAgICAgICAgICAgICByeE1DUzsKKyAgICB1MzJfdCAgICAgICAgICAgICAgIHJ4Qlc7CisgICAgdTMyX3QgICAgICAgICAgICAgICByeFNHOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKyAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdj13ZC0+aHBQcml2YXRlOworCisgICAgLy96bV9tc2cwX3J4KFpNX0xWXzAsICJ6ZmlVc2JSZWN2KCkiKTsKKworI2lmIFpNX0lOVF9VU0VfRVAyID09IDEKKworICAgIGZvciAoaT0wOyBpPChaTV9JTlRfVVNFX0VQMl9IRUFERVJfU0laRT4+MSk7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBpKjIpICE9IDB4ZmZmZikKKyAgICAgICAgCWJyZWFrOworICAgIH0KKworICAgIGlmIChpPT0oWk1fSU5UX1VTRV9FUDJfSEVBREVSX1NJWkU+PjEpKQorICAgIHsKKyAgICAgICAgdTMyX3QgICAgICAgICAgICAgICByc3BbWk1fVVNCX01BWF9FUElOVF9CVUZGRVIvNF07CisgICAgICAgIHUxNl90ICAgICAgICAgICAgICAgcnNwTGVuOworICAgICAgICB1MzJfdCAgICAgICAgICAgICAgIHJzcGk7CisgICAgICAgIHU4X3QqICAgICAgICAgICAgICAgcGRzdCA9ICh1OF90Kilyc3A7CisKKyAgICAgICAgLyogSW50ZXJydXB0IFJzcCAqLworICAgICAgICByc3BMZW4gPSAodTE2X3QpIHpmd0J1ZkdldFNpemUoZGV2LCBidWYpLVpNX0lOVF9VU0VfRVAyX0hFQURFUl9TSVpFOworCisgICAgICAgIGlmIChyc3BMZW4gPiA2MCkKKyAgICAgICAgeworICAgICAgICAgICAgem1fZGVidWdfbXNnMSgiR2V0IGVycm9yIGxlbiBieSBFUDIgPSBcbiIsIHJzcExlbik7CisgICAgICAgICAgICAvKiBmcmVlIFVTQiBidWYgKi8KKwkgICAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisJICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAocnNwaT0wOyByc3BpPHJzcExlbjsgcnNwaSsrKQorICAgICAgICB7CisgICAgICAgIAkqcGRzdCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIHJzcGkrWk1fSU5UX1VTRV9FUDJfSEVBREVSX1NJWkUpOworICAgICAgICAJcGRzdCsrOworICAgICAgICB9CisKKyAgICAgICAgLy9pZiAoYWRhcHRlci0+emZjYlVzYlJlZ0luKQorICAgICAgICAvLyAgICBhZGFwdGVyLT56ZmNiVXNiUmVnSW4oYWRhcHRlciwgcnNwLCByc3BMZW4pOworICAgICAgICB6ZmlVc2JSZWdJbihkZXYsIHJzcCwgcnNwTGVuKTsKKworCSAgICAgIC8qIGZyZWUgVVNCIGJ1ZiAqLworCSAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworCSAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYgLyogZW5kIG9mICNpZiBaTV9JTlRfVVNFX0VQMiA9PSAxICovCisKKyAgICBaTV9QRVJGT1JNQU5DRV9SWF9NUERVKGRldiwgYnVmKTsKKworICAgIGlmICh3ZC0+c3dTbmlmZmVyKQorICAgIHsKKyAgICAgICAgLyogYWlyb3BlZWs6IFJlcG9ydCBldmVyeXRoaW5nIHVwICovCisgICAgICAgIGlmICh3ZC0+emZjYlJlY3Y4MDIxMSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB3ZC0+emZjYlJlY3Y4MDIxMShkZXYsIGJ1ZiwgTlVMTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBSZWFkIHRoZSBsYXN0IGJ5dGUgKi8KKyAgICBsZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKKyAgICBtcGR1SW5kID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgbGVuLTEpOworCisgICAgLyogRmlyc3QgTVBEVSAqLworICAgIGlmKChtcGR1SW5kICYgMHgzMCkgPT0gMHgyMCkKKyAgICB7CisgICAgICAgIHUxNl90IGR1cmF0aW9uOworICAgICAgICBpZiAoem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMzYpID09IDApIC8vQUMgPSBCRQorICAgICAgICB7CisgICAgICAgICAgICBkdXJhdGlvbiA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDE0KTsKKyAgICAgICAgICAgIGlmIChkdXJhdGlvbiA+IGhwUHJpdi0+YWdnTWF4RHVyYXRpb25CRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBocFByaXYtPmFnZ01heER1cmF0aW9uQkUgPSBkdXJhdGlvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoaHBQcml2LT5hZ2dNYXhEdXJhdGlvbkJFID4gMTApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBocFByaXYtPmFnZ01heER1cmF0aW9uQkUtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL0RiZ1ByaW50KCJhZ2dNYXhEdXJhdGlvbkJFPSVkIiwgaHBQcml2LT5hZ2dNYXhEdXJhdGlvbkJFKTsKKyAgICAgICAgfQorICAgIH0KKworI2lmIDEKKyAgICAvKiBGaXJzdCBNUERVIG9yIFNpbmdsZSBNUERVICovCisgICAgaWYoKChtcGR1SW5kICYgMHgzMCkgPT0gMHgwMCkgfHwgKChtcGR1SW5kICYgMHgzMCkgPT0gMHgyMCkpCisgICAgLy9pZiAoKG1wZHVJbmQgJiAweDEwKSA9PSAweDAwKQorICAgIHsKKyAgICAgICAgcGxjcEhkckxlbiA9IDEyOyAgICAgICAgLy8gUExDUCBoZWFkZXIgbGVuZ3RoCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICh6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCA0KSA9PSB3ZC0+bWFjQWRkclswXSAmJgorICAgICAgICAgICAgem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgNikgPT0gd2QtPm1hY0FkZHJbMV0gJiYKKyAgICAgICAgICAgIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDgpID09IHdkLT5tYWNBZGRyWzJdKSB7CisgICAgICAgICAgICBwbGNwSGRyTGVuID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAxNikgPT0gd2QtPm1hY0FkZHJbMF0gJiYKKyAgICAgICAgICAgICAgICAgem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTgpID09IHdkLT5tYWNBZGRyWzFdICYmCisgICAgICAgICAgICAgICAgIHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDIwKSA9PSB3ZC0+bWFjQWRkclsyXSl7CisgICAgICAgICAgICBwbGNwSGRyTGVuID0gMTI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBwbGNwSGRyTGVuID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIExhc3QgTVBEVSBvciBTaW5nbGUgTVBEVSAqLworICAgIGlmICgobXBkdUluZCAmIDB4MzApID09IDB4MDAgfHwgKG1wZHVJbmQgJiAweDMwKSA9PSAweDEwKQorICAgIHsKKyAgICAgICAgY3JjUGx1c1J4U3RhdHVzTGVuID0gRVhUUkFfSU5GT19MRU4gKyA0OyAgICAgLy8gRXh0cmEgYnl0ZXMgKyBGQ1MKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY3JjUGx1c1J4U3RhdHVzTGVuID0gNCArIDQ7ICAgICAvLyBFeHRyYSA0IGJ5dGVzICsgRkNTCisgICAgfQorI2Vsc2UKKyAgICBwbGNwSGRyTGVuID0gMTI7CisgICAgY3JjUGx1c1J4U3RhdHVzTGVuID0gRVhUUkFfSU5GT19MRU4gKyA0OyAgICAgLy8gRXh0cmEgYnl0ZXMgKyBGQ1MKKyNlbmRpZgorCisgICAgaWYgKGxlbiA8IChwbGNwSGRyTGVuKzEwK2NyY1BsdXNSeFN0YXR1c0xlbikpCisgICAgeworICAgICAgICB6bV9tc2cxX3J4KFpNX0xWXzAsICJJbnZhbGlkIFJ4IGxlbmd0aD0iLCBsZW4pOworICAgICAgICAvL3pmd0R1bXBCdWYoZGV2LCBidWYpOworCisgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogZGlzcGxheSBSU1NJIGNvbWJpbmVkICovCisgICAgLyoKKyAgICAgKiCieqJ3oneid6J3oneid6J3oneid6J3oneid6J3onOid6J3oneid6J3oneid6J3onOid6J3oneid6J3oneic6J3oneid6J3oneid6Jzoneid6J3oneid6J3oneid6J3onOid6J3oneid6J3oneid6J3oneid6J3oneid6J7CisgICAgICogonggUExDUCBIZWFkZXIgonggIE1QRFUgIKJ4IFJTU0kgonggIEVWTSCieCBQSFkgRXJyIKJ4ICBNQUMgU3RhdHVzIKJ4CisgICAgICogonWid6J3oneid6J3oneid6J3oneid6J3oneid6Jxoneid6J3oneid6J3oneid6Jxoneid6J3oneid6J3onGid6J3oneid6J3oneicaJ3oneid6J3oneid6J3oneid6Jxoneid6J3oneid6J3oneid6J3oneid6J3oneidAorICAgICAqIKJ4ICAgICAxMiAgICAgIKJ4ICAgIG4gICCieCAgNyAgIKJ4ICAxMiAgonggICAgMSAgICCieCAgICAgIDQgICAgICCieAorICAgICAqIKJ8oneid6J3oneid6J3oneid6J3oneid6J3oneicqJ3oneid6J3oneid6J3oneicqJ3oneid6J3oneid6Jyoneid6J3oneid6J3onKid6J3oneid6J3oneid6J3oneicqJ3oneid6J3oneid6J3oneid6J3oneid6J3on0KKyAgICAgKglSU1NJIGZpbGVkIChGcm9tIEJCIGFuZCBNQUMganVzdCBwYXNzIHRoZW0gdG8gaG9zdCkKKyAgICAgKiAgIEJ5dGUxOiBSU1NJIGZvciBhbnRlbm5hIDAuCisgICAgICogICBCeXRlMjogUlNTSSBmb3IgYW50ZW5uYSAxLgorICAgICAqICAgQnl0ZTM6IFJTU0kgZm9yIGFudGVubmEgMi4KKyAgICAgKiAgIEJ5dGU0OiBSU1NJIGZvciBhbnRlbm5hIDAgZXh0ZW5zaW9uLgorICAgICAqICAgQnl0ZTU6IFJTU0kgZm9yIGFudGVubmEgMSBleHRlbnNpb24uCisgICAgICogICBCeXRlNjogUlNTSSBmb3IgYW50ZW5uYSAyIGV4dGVuc2lvbi4KKyAgICAgKiAgIEJ5dGU3OiBSU1NJIGZvciBhbnRlbm5hIGNvbWJpbmVkLgorICAgICAqLworCisgICAgLy96bV9kZWJ1Z19tc2cxKCIgcmVjdiBSU1NJID0gIiwgem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgKGxlbi0xKS0xNykpOworCisgICAgcGF5bG9hZExlbiA9IHpmSHBHZXRQYXlsb2FkTGVuKGRldiwgYnVmLCBsZW4sIHBsY3BIZHJMZW4sICZyeE1ULCAmcnhNQ1MsICZyeEJXLCAmcnhTRyk7CisKKyAgICAvKiBIYWwgUnggaW5mbyAqLworICAgIC8qIEZpcnN0IE1QRFUgb3IgU2luZ2xlIE1QRFUgKi8KKyAgICBpZigoKG1wZHVJbmQgJiAweDMwKSA9PSAweDAwKSB8fCAoKG1wZHVJbmQgJiAweDMwKSA9PSAweDIwKSkKKyAgICB7CisgICAgICAgIGlmICh3ZC0+ZW5hYmxlSEFMRGJnSW5mbyAmJiB6ZklzRGF0YUZyYW1lKGRldiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJ4RGF0YU1UICAgPSByeE1UOworICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJ4RGF0YU1DUyAgPSByeE1DUzsKKyAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSeERhdGFCVyAgID0gcnhCVzsKKyAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSeERhdGFTRyAgID0gcnhTRzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgocGxjcEhkckxlbiArIHBheWxvYWRMZW4pID4gbGVuKSB7CisgICAgICAgIHptX21zZzFfcngoWk1fTFZfMCwgIkludmFsaWQgcGF5bG9hZCBsZW5ndGg9IiwgcGF5bG9hZExlbik7CisgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy9TdG9yZSBSeCBUYWlsIEluZm9tYXRpb24gYmVmb3JlIFJlbW92ZS0tQ1dZYW5nKCspCisKKyNpZiAwCisgICAgZm9yIChpID0gMDsgaSA8IGNyY1BsdXNSeFN0YXR1c0xlbi00OyBpKyspCisgICAgeworICAgICAgIGFkZEluZm8uVGFpbC5CeXRlW2ldID0KKyAgICAgICAgICAgICAgIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIGxlbiAtIGNyY1BsdXNSeFN0YXR1c0xlbiArIDQgKyBpKTsKKyAgICB9CisjZWxzZQorLyoKKyogQnJpZWYgZm9ybWF0IG9mIE9VVFMgY2hpcAorKiCieqJ3oneid6J3oneid6J3oneid6J3oneid6J3onOid6J3oneid6J3oneid6J3onOid6J3oneid6J3oneic6J3oneid6J3oneid6Jzoneid6J3oneid6J3oneid6J3onOid6J3oneid6J3oneid6J3oneid6J3oneid6J7CisqIKJ4IFBMQ1AgSGVhZGVyIKJ4ICBNUERVICCieCBSU1NJIKJ4ICBFVk0gonggUEhZIEVyciCieCAgTUFDIFN0YXR1cyCieAorKiCidaJ3oneid6J3oneid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneicaJ3oneid6J3oneid6Jxoneid6J3oneid6J3oneid6J3onGid6J3oneid6J3oneid6J3oneid6J3oneid6J0CisqIKJ4ICAgICAxMiAgICAgIKJ4ICAgIG4gICCieCAgNyAgIKJ4ICAxMiAgonggICAgMSAgICCieCAgICAgIDQgICAgICCieAorKiCifKJ3oneid6J3oneid6J3oneid6J3oneid6J3onKid6J3oneid6J3oneid6J3onKid6J3oneid6J3oneicqJ3oneid6J3oneid6Jyoneid6J3oneid6J3oneid6J3onKid6J3oneid6J3oneid6J3oneid6J3oneid6J9CisqIFJTU0k6CisqICAgICAgIEJ5dGUgMSAgYW50ZW5uYSAwCisqICAgICAgIEJ5dGUgMiAgYW50ZW5uYSAxCisqICAgICAgIEJ5dGUgMyAgYW50ZW5uYSAyCisqICAgICAgIEJ5dGUgNCAgYW50ZW5uYSAwIGV4dGVuc2lvbgorKiAgICAgICBCeXRlIDUgIGFudGVubmEgMSBleHRlbnNpb24KKyogICAgICAgQnl0ZSA2ICBhbnRlbm5hIDIgZXh0ZW5zaW9uCisqICAgICAgIEJ5dGUgNyAgYW50ZW5uYSBjb21iaW5lZAorKiBFVk06CisqICAgICAgIEJ5dGUgMSAgU3RyZWFtIDAgcGlsb3QgMAorKiAgICAgICBCeXRlIDIgIFN0cmVhbSAwIHBpbG90IDEKKyogICAgICAgQnl0ZSAzICBTdHJlYW0gMCBwaWxvdCAyCisqICAgICAgIEJ5dGUgNCAgU3RyZWFtIDAgcGlsb3QgMworKiAgICAgICBCeXRlIDUgIFN0cmVhbSAwIHBpbG90IDQKKyogICAgICAgQnl0ZSA2ICBTdHJlYW0gMCBwaWxvdCA1CisqICAgICAgIEJ5dGUgNyAgU3RyZWFtIDEgcGlsb3QgMAorKiAgICAgICBCeXRlIDggIFN0cmVhbSAxIHBpbG90IDEKKyogICAgICAgQnl0ZSA5ICBTdHJlYW0gMSBwaWxvdCAyCisqICAgICAgIEJ5dGUgMTAgU3RyZWFtIDEgcGlsb3QgMworKiAgICAgICBCeXRlIDExIFN0cmVhbSAxIHBpbG90IDQKKyogICAgICAgQnl0ZSAxMiBTdHJlYW0gMSBwaWxvdCA1CisqLworCisgICAgLyogRmlsbCB0aGUgVGFpbCBpbmZvcm1hdGlvbiAqLworICAgIC8qIExhc3QgTVBEVSBvciBTaW5nbGUgTVBEVSAqLworICAgIGlmICgobXBkdUluZCAmIDB4MzApID09IDB4MDAgfHwgKG1wZHVJbmQgJiAweDMwKSA9PSAweDEwKQorICAgIHsKKyNkZWZpbmUgWk1fUlhfUlNTSV9DT01QRU5TQVRJT04gICAgIDI3CisgICAgICAgIHU4X3Qgem1fcnhfcnNzaV9jb21wZW5zYXRpb24gPSBaTV9SWF9SU1NJX0NPTVBFTlNBVElPTjsKKworICAgIAkvKiBSU1NJIGluZm9ybWF0aW9uICovCisgICAgICAgIGFkZEluZm8uVGFpbC5EYXRhLlNpZ25hbFN0cmVuZ3RoMSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsCisgICAgICAgICAgICAgICAgKGxlbi0xKSAtIDE3KSArICgoaHBQcml2LT5yeFN0cm9uZ1JTU0kgPT0gMSk/em1fcnhfcnNzaV9jb21wZW5zYXRpb246MCk7CisjdW5kZWYgWk1fUlhfUlNTSV9DT01QRU5TQVRJT04KKworICAgICAgLyogRVZNICovCisKKyAgICAgIC8qIFRPRE86IGZvciBSRC9CQiBkZWJ1ZyBtZXNzYWdlICovCisgICAgICAvKiBzYXZlIGN1cnJlbnQgcnggaHcgaW5mb21yYXRpb24sIHJlcG9ydCB0byBEcnZDb3JlL0FwcGxpY2F0aW9uICovCisgICAgICBpZiAod2QtPmVuYWJsZUhBTERiZ0luZm8gJiYgemZJc0RhdGFGcmFtZShkZXYsIGJ1ZikpCisgICAgICB7CisgICAgICAgICAgICB1OF90IHRyc3NpOworICAgICAgICAgICAgZm9yIChpPTA7IGk8NzsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyc3NpID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgKGxlbi0xKSAtIDIzICsgaSk7CisJICAgICAgICAgICAgaWYgKHRyc3NpJjB4ODApCisJICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnNzaSA9ICgofigodThfdCl0cnNzaSkgJiAweDdmKSArIDEpICYgMHg3ZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJTU0lbaV0gPSB0cnNzaTsKKworICAgICAgICAgICAgfQorICAgICAgICAgIGlmIChyeE1UPT0yKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vaWYgKHJ4QlcpCisgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgIAkgIGZvciAoaT0wOyBpPDEyOyBpKyspCisgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSeEVWTVtpXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAobGVuLTEpIC0gMTYgKyBpKTsKKyAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgLy9lbHNlCisgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgIC8vCSAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICAgICAgLy8gICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSeEVWTVtpXSA9CisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIChsZW4tMSkgLSAxNiArIGkpOworICAgICAgICAgICAgLy99CisgICAgICAgICAgfQorCisgICAgICAgICAgI2lmIDAKKyAgICAgICAgICAvKiBwcmludCAqLworICAgICAgICAgICAgem1fZGJnKCgiTVQoJWQpIE1DUyglZCkgQlcoJWQpIFNHKCVkKSBSU1NJOiVkLCVkLCVkLCVkLCVkLCVkLCVkIEVWTTooJWQsJWQsJWQsJWQsJWQsJWQpKCVkLCVkLCVkLCVkLCVkLCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcnhNVCwKKyAgICAgICAgICAgICAgICAgICAgICAgcnhNQ1MsCisgICAgICAgICAgICAgICAgICAgICAgIHJ4QlcsCisgICAgICAgICAgICAgICAgICAgICAgIHJ4U0csCisgICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSU1NJWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UlNTSVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJTU0lbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSU1NJWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UlNTSVs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJTU0lbNV0sCisgICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSU1NJWzZdLAorICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UnhFVk1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSeEVWTVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJ4RVZNWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UnhFVk1bM10sCisgICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSeEVWTVs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJ4RVZNWzVdLAorICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UnhFVk1bNl0sCisgICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSeEVWTVs3XSwKKyAgICAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGUpLT5oYWxSeEluZm8uY3VycmVudFJ4RVZNWzhdLAorICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZSktPmhhbFJ4SW5mby5jdXJyZW50UnhFVk1bOV0sCisgICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSeEVWTVsxMF0sCisgICAgICAgICAgICAgICAgICAgICAgICgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aGFsUnhJbmZvLmN1cnJlbnRSeEVWTVsxMV0KKyAgICAgICAgICAgICAgICAgICAgICAgKSk7CisgICAgICAgICAgI2VuZGlmCisgICAgICB9IC8qIGlmICh3ZC0+ZW5hYmxlSEFMRGJnSW5mbyAmJiB6ZklzRGF0YUZyYW1lKGRldiwgYnVmKSkgKi8KKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBNaWQgb3IgRmlyc3QgYWdncmVnYXRlIGZyYW1lIHdpdGhvdXQgcGh5IHJ4IGluZm9ybWF0aW9uICovCisgICAgICAgIGFkZEluZm8uVGFpbC5EYXRhLlNpZ25hbFN0cmVuZ3RoMSA9IDA7CisgICAgfQorCisgICAgYWRkSW5mby5UYWlsLkRhdGEuU2lnbmFsU3RyZW5ndGgyID0gMDsKKyAgICBhZGRJbmZvLlRhaWwuRGF0YS5TaWduYWxTdHJlbmd0aDMgPSAwOworICAgIGFkZEluZm8uVGFpbC5EYXRhLlNpZ25hbFF1YWxpdHkgICA9IDA7CisKKyAgICBhZGRJbmZvLlRhaWwuRGF0YS5TQUluZGV4ICAgICAgICAgICA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIGxlbiAtIDQpOworICAgIGFkZEluZm8uVGFpbC5EYXRhLkRBSW5kZXggICAgICAgICAgID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgbGVuIC0gMyk7CisgICAgYWRkSW5mby5UYWlsLkRhdGEuRXJyb3JJbmRpY2F0aW9uICAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBsZW4gLSAyKTsKKyAgICBhZGRJbmZvLlRhaWwuRGF0YS5SeE1hY1N0YXR1cyAgICAgICA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIGxlbiAtIDEpOworCisjZW5kaWYKKyAgICAvKiBSZW1vdmUgQ1JDIGFuZCBSeCBTdGF0dXMgKi8KKyAgICB6ZndCdWZTZXRTaXplKGRldiwgYnVmLCAobGVuLWNyY1BsdXNSeFN0YXR1c0xlbikpOworICAgIC8vemZ3QnVmU2V0U2l6ZShkZXYsIGJ1ZiwgcGF5bG9hZExlbiArIHBsY3BIZHJMZW4pOyAgICAvKiBwYXlsb2FkTGVuICsgUExDUCAxMiAtIEZDUyA0Ki8KKworICAgIC8vU3RvcmUgUExDUCBIZWFkZXIgSW5mb21hdGlvbiBiZWZvcmUgUmVtb3ZlLS1DV1lhbmcoKykKKyAgICBpZiAocGxjcEhkckxlbiAhPSAwKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBsY3BIZHJMZW47IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgYWRkSW5mby5QbGNwSGVhZGVyW2ldID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgaSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYWRkSW5mby5QbGNwSGVhZGVyWzBdID0gMDsKKyAgICB9CisgICAgLyogUmVtb3ZlIFBMQ1AgaGVhZGVyICovCisgICAgemZ3QnVmUmVtb3ZlSGVhZChkZXYsIGJ1ZiwgcGxjcEhkckxlbik7CisKKyAgICAvKiBoYW5kbGUgODAyLjExIGZyYW1lICovCisgICAgemZDb3JlUmVjdihkZXYsIGJ1ZiwgJmFkZEluZm8pOworCisjZWxzZQorICAgIC8qIEZpcm13YXJlIGxvb3BiYWNrOiBSeCBmcmFtZSA9IFR4IGZyYW1lICAgICAgICovCisgICAgLyogY29udmVydCBSeCBmcmFtZSB0byBmaXQgcmVjZWl2ZSBmcmFtZSBmb3JtYXQgKi8KKyAgICB6YnVmX3QgKm5ld19idWY7CisgICAgdThfdCAgICBjdHJsX29mZnNldCA9IDg7CisgICAgdThfdCAgICBQTENQX0xlbiA9IDEyOworICAgIHU4X3QgICAgZGF0YTsKKyAgICB1OF90ICAgIGk7CisKKworICAgIC8qIFR4OiAgfCBjdHJsX3NldHRpbmcgfCBNYWMgaGRyIHwgZGF0YSB8ICovCisgICAgLyogICAgICAgICAgICA4ICAgICAgICAgICAgMjQgICAgICAgeCAgICAgKi8KKworICAgIC8qIFJ4OiAgICAgICAgICB8IFBMQ1AgfCBNYWMgaGRyIHwgZGF0YSB8IEZDUyB8IFJ4c3RhdHVzIHwgKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgMTIgICAgICAyNCAgICAgICAgeCAgICAgNCAgICAgICA4ICAgICAgICovCisKKyAgICAvKiBuZXcgYWxsb2NhdGUgYSByeCBmb3JtYXQgc2l6ZSBidWYgKi8KKyAgICBuZXdfYnVmID0gemZ3QnVmQWxsb2NhdGUoZGV2LCB6ZndCdWZHZXRTaXplKGRldiwgYnVmKS04KzEyKzQrRVhUUkFfSU5GT19MRU4pOworCisgICAgZm9yIChpPTA7IGk8emZ3QnVmR2V0U2l6ZShkZXYsIGJ1ZiktY3RybF9vZmZzZXQ7IGkrKykKKyAgICB7CisgICAgICAgIGRhdGEgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBjdHJsX29mZnNldCtpKTsKKyAgICAgICAgem13X3J4X2J1Zl93cml0ZWIoZGV2LCBuZXdfYnVmLCBQTENQX0xlbitpLCBkYXRhKTsKKyAgICB9CisKKyAgICB6ZndCdWZTZXRTaXplKGRldiwgbmV3X2J1ZiwgemZ3QnVmR2V0U2l6ZShkZXYsIGJ1ZiktOCsxMis0K0VYVFJBX0lORk9fTEVOKTsKKworICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworCisgICAgLyogcmVjZWl2ZSB0aGUgbmV3X2J1ZiAqLworICAgIC8vemZDb3JlUmVjdihkZXYsIG5ld19idWYpOworCisjZW5kaWYKKworfQorCisjaWZkZWYgWk1fT1RVU19SWF9TVFJFQU1fTU9ERQordm9pZCB6ZmlVc2JSZWN2KHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZikKK3sKKyAgICB1MTZfdCBpbmRleCA9IDA7CisgICAgdTE2X3QgY2hrSWR4OworICAgIHUzMl90IHN0YXR1cyA9IDA7CisgICAgdTE2X3QgaWk7CisgICAgemJ1Zl90ICpuZXdCdWY7CisgICAgemJ1Zl90ICpyeEJ1ZlBvb2xbOF07CisgICAgdTE2X3QgcnhCdWZQb29sSW5kZXggPSAwOworICAgIHN0cnVjdCB6c0hwUHJpdiAqaGFsUHJpdjsKKyAgICB1OF90ICpzcmNCdWZQdHI7CisgICAgdTMyX3QgYnVmZmVyTGVuZ3RoOworICAgIHUxNl90IHVzYlJ4UmVtYWluTGVuOworICAgIHUxNl90IHVzYlJ4UGt0TGVuOworCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaGFsUHJpdiA9IChzdHJ1Y3QgenNIcFByaXYqKXdkLT5ocFByaXZhdGU7CisgICAgc3JjQnVmUHRyID0gem13X2J1Zl9nZXRfYnVmZmVyKGRldiwgYnVmKTsKKworICAgIGJ1ZmZlckxlbmd0aCA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworCisgICAgLyogWmVybyBMZW5ndGggVHJhbnNmZXIgKi8KKyAgICBpZiAoIWJ1ZmZlckxlbmd0aCkKKyAgICB7CisgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdXNiUnhSZW1haW5MZW4gPSBoYWxQcml2LT51c2JSeFJlbWFpbkxlbjsKKyAgICB1c2JSeFBrdExlbiA9IGhhbFByaXYtPnVzYlJ4VHJhbnNmZXJMZW47CisKKyAgICAvKiBDaGVjayB3aGV0aGVyIHRoZXJlIGlzIGFueSBkYXRhIGluIHRoZSBsYXN0IHRyYW5zZmVyICovCisgICAgaWYgKHVzYlJ4UmVtYWluTGVuICE9IDAgKQorICAgIHsKKyAgICAgICAgemJ1Zl90ICpyZW1haW5CdWZQdHIgPSBoYWxQcml2LT5yZW1haW5CdWY7CisgICAgICAgIHU4X3QqIEJ1ZlB0ciA9IE5VTEw7CisKKyAgICAgICAgaWYgKCByZW1haW5CdWZQdHIgIT0gTlVMTCApCisgICAgICAgIHsKKyAgICAgICAgICAgIEJ1ZlB0ciA9IHptd19idWZfZ2V0X2J1ZmZlcihkZXYsIHJlbWFpbkJ1ZlB0cik7CisgICAgICAgIH0KKworICAgICAgICBpbmRleCA9IHVzYlJ4UmVtYWluTGVuOworICAgICAgICB1c2JSeFJlbWFpbkxlbiAtPSBoYWxQcml2LT51c2JSeFBhZExlbjsKKworICAgICAgICAvKiAgQ29weSBkYXRhICovCisgICAgICAgIGlmICggQnVmUHRyICE9IE5VTEwgKQorICAgICAgICB7CisgICAgICAgICAgICB6ZndNZW1vcnlDb3B5KCYoQnVmUHRyW3VzYlJ4UGt0TGVuXSksIHNyY0J1ZlB0ciwgdXNiUnhSZW1haW5MZW4pOworICAgICAgICB9CisKKyAgICAgICAgdXNiUnhQa3RMZW4gKz0gdXNiUnhSZW1haW5MZW47CisgICAgICAgIGhhbFByaXYtPnVzYlJ4UmVtYWluTGVuID0gMDsKKworICAgICAgICBpZiAoIHJlbWFpbkJ1ZlB0ciAhPSBOVUxMICkKKyAgICAgICAgeworICAgICAgICAgICAgemZ3QnVmU2V0U2l6ZShkZXYsIHJlbWFpbkJ1ZlB0ciwgdXNiUnhQa3RMZW4pOworICAgICAgICAgICAgcnhCdWZQb29sW3J4QnVmUG9vbEluZGV4KytdID0gcmVtYWluQnVmUHRyOworICAgICAgICB9CisgICAgICAgIGhhbFByaXYtPnJlbWFpbkJ1ZiA9IE5VTEw7CisgICAgfQorCisgICAgLy96bV9kZWJ1Z19tc2cxKCJsZW5ndGg6ICVkXG4iLCAoaW50KXBVc2JSeFRyYW5zZmVyLT5wUnhVcmItPlVyYkJ1bGtPckludGVycnVwdFRyYW5zZmVyLlRyYW5zZmVyQnVmZmVyTGVuZ3RoKTsKKworICAgIGJ1ZmZlckxlbmd0aCA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOworLy9wcmludGsoImJ1ZmZlckxlbmd0aCAlZFxuIiwgYnVmZmVyTGVuZ3RoKTsKKyAgICB3aGlsZShpbmRleCA8IGJ1ZmZlckxlbmd0aCkKKyAgICB7CisgICAgICAgIHUxNl90IHBrdExlbjsKKyAgICAgICAgdTE2X3QgcGt0VGFnOworICAgICAgICAvL3U4X3QgKnB0ciA9ICh1OF90KikoKHN0cnVjdCB6c0J1ZmZlciopcFVzYlJ4VHJhbnNmZXItPmJ1ZiktPmRhdGE7CisgICAgICAgIHU4X3QgKnB0ciA9IHNyY0J1ZlB0cjsKKworICAgICAgICAvKiBSZXRyaWV2ZSBwYWNrZXQgbGVuZ3RoIGFuZCB0YWcgKi8KKyAgICAgICAgcGt0TGVuID0gcHRyW2luZGV4XSArIChwdHJbaW5kZXgrMV0gPDwgOCk7CisgICAgICAgIHBrdFRhZyA9IHB0cltpbmRleCsyXSArIChwdHJbaW5kZXgrM10gPDwgOCk7CisKKyAgICAgICAgaWYgKHBrdFRhZyA9PSBaTV9VU0JfU1RSRUFNX01PREVfVEFHKQorICAgICAgICB7CisgICAgICAgICAgICB1MTZfdCBwYWRMZW47CisKKyAgICAgICAgICAgIHptX2Fzc2VydChwa3RMZW4gPCBaTV9XTEFOX01BWF9SWF9TSVpFKTsKKworICAgICAgICAgICAgLy9wcmludGsoIkdldCBhIHBhY2tldCwgcGt0TGVuOiAweCUwNHhcbiIsIHBrdExlbik7CisgICAgICAgICAgICAjaWYgMAorICAgICAgICAgICAgLyogRHVtcCBkYXRhICovCisgICAgICAgICAgICBmb3IgKGlpID0gaW5kZXg7IGlpIDwgcGt0X2xlbis0OykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEYmdQcmludCgiMHglMDJ4ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAoem13X3J4X2J1Zl9yZWFkYihhZGFwdGVyLCBwVXNiUnhUcmFuc2Zlci0+YnVmLCBpaSkgJiAweGZmKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoKCsraWkgJSAxNikgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgRGJnUHJpbnQoIlxuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIERiZ1ByaW50KCJcbiIpOworICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgIC8qIENhbGN1YXRlIHRoZSBwYWRkaW5nIGxlbmd0aCwgaW4gdGhlIGN1cnJlbnQgZGVzaWduLAorICAgICAgICAgICAgICAgdGhlIGxlbmd0aCBzaG91bGQgYmUgcGFkZGVkIHRvIDQgYnl0ZSBib3VuZHJheS4gKi8KKyAgICAgICAgICAgIHBhZExlbiA9IFpNX1VTQl9TVFJFQU1fTU9ERV9UQUdfTEVOIC0gKHBrdExlbiAmIDB4Myk7CisKKyAgICAgICAgICAgIGlmKHBhZExlbiA9PSBaTV9VU0JfU1RSRUFNX01PREVfVEFHX0xFTikKKyAgICAgICAgICAgICAgICBwYWRMZW4gPSAwOworCisgICAgICAgICAgICBjaGtJZHggPSBpbmRleDsKKyAgICAgICAgICAgIGluZGV4ID0gaW5kZXggKyBaTV9VU0JfU1RSRUFNX01PREVfVEFHX0xFTiArIHBrdExlbiArIHBhZExlbjsKKworICAgICAgICAgICAgaWYgKGNoa0lkeCA+IFpNX01BWF9VU0JfSU5fVFJBTlNGRVJfU0laRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cxKCJjaGtJZHggaXMgdG9vIGxhcmdlLCBjaGtJZHg6ICVkXG4iLCBjaGtJZHgpOworICAgICAgICAgICAgICAgIHptX2Fzc2VydCgwKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaW5kZXggPiBaTV9NQVhfVVNCX0lOX1RSQU5TRkVSX1NJWkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9zdHJ1Y3QgenNCdWZmZXIqIEJ1ZlB0cjsKKyAgICAgICAgICAgICAgICAvL3N0cnVjdCB6c0J1ZmZlciogVXNiQnVmUHRyOworICAgICAgICAgICAgICAgIHU4X3QgKkJ1ZlB0cjsKKyAgICAgICAgICAgICAgICB1OF90ICpVc2JCdWZQdHI7CisKKyAgICAgICAgICAgICAgICBoYWxQcml2LT51c2JSeFJlbWFpbkxlbiA9IGluZGV4IC0gWk1fTUFYX1VTQl9JTl9UUkFOU0ZFUl9TSVpFOyAvLyAtIHBhZExlbjsKKyAgICAgICAgICAgICAgICBoYWxQcml2LT51c2JSeFRyYW5zZmVyTGVuID0gWk1fTUFYX1VTQl9JTl9UUkFOU0ZFUl9TSVpFIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNoa0lkeCAtIFpNX1VTQl9TVFJFQU1fTU9ERV9UQUdfTEVOOworICAgICAgICAgICAgICAgIGhhbFByaXYtPnVzYlJ4UGFkTGVuID0gcGFkTGVuOworICAgICAgICAgICAgICAgIC8vY2hlY2tfaW5kZXggPSBpbmRleDsKKworICAgICAgICAgICAgICAgIGlmIChoYWxQcml2LT51c2JSeFRyYW5zZmVyTGVuID4gWk1fV0xBTl9NQVhfUlhfU0laRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHptX2RlYnVnX21zZzEoImNoZWNrX2xlbiBpcyB0b28gbGFyZ2UsIGNoa19sZW46ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbFByaXYtPnVzYlJ4VHJhbnNmZXJMZW4pOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBhIHNrYiBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICBuZXdCdWYgPSB6ZndCdWZBbGxvY2F0ZShkZXYsIFpNX1dMQU5fTUFYX1JYX1NJWkUpOworCisgICAgICAgICAgICAgICAgaWYgKCBuZXdCdWYgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCdWZQdHIgPSB6bXdfYnVmX2dldF9idWZmZXIoZGV2LCBuZXdCdWYpOworICAgICAgICAgICAgICAgICAgICBVc2JCdWZQdHIgPSBzcmNCdWZQdHI7CisKKyAgICAgICAgICAgICAgICAgICAgLyogQ29weSB0aGUgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgIHpmd01lbW9yeUNvcHkoQnVmUHRyLCAmKFVzYkJ1ZlB0cltjaGtJZHgrWk1fVVNCX1NUUkVBTV9NT0RFX1RBR19MRU5dKSwgaGFsUHJpdi0+dXNiUnhUcmFuc2Zlckxlbik7CisKKyAgICAgICAgICAgICAgICAgICAgLyogUmVjb3JkIHRoZSBidWZmZXIgcG9pbnRlciAqLworICAgICAgICAgICAgICAgICAgICBoYWxQcml2LT5yZW1haW5CdWYgPSBuZXdCdWY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHU4X3QqIEJ1ZlB0cjsKKyAgICAgICAgICAgICAgICB1OF90KiBVc2JCdWZQdHI7CisKKyAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBhIHNrYiBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICBuZXdCdWYgPSB6ZndCdWZBbGxvY2F0ZShkZXYsIFpNX1dMQU5fTUFYX1JYX1NJWkUpOworICAgICAgICAgICAgICAgIGlmICggbmV3QnVmICE9IE5VTEwgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQnVmUHRyID0gem13X2J1Zl9nZXRfYnVmZmVyKGRldiwgbmV3QnVmKTsKKyAgICAgICAgICAgICAgICAgICAgVXNiQnVmUHRyID0gc3JjQnVmUHRyOworCisgICAgICAgICAgICAgICAgICAgIC8qIENvcHkgdGhlIGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICB6ZndNZW1vcnlDb3B5KEJ1ZlB0ciwgJihVc2JCdWZQdHJbY2hrSWR4K1pNX1VTQl9TVFJFQU1fTU9ERV9UQUdfTEVOXSksIHBrdExlbik7CisKKyAgICAgICAgICAgICAgICAgICAgemZ3QnVmU2V0U2l6ZShkZXYsIG5ld0J1ZiwgcGt0TGVuKTsKKyAgICAgICAgICAgICAgICAgICAgcnhCdWZQb29sW3J4QnVmUG9vbEluZGV4KytdID0gbmV3QnVmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1MTZfdCBpOworCisgICAgICAgICAgICAgICAgRGJnUHJpbnQoIkNhbid0IGZpbmQgdGFnLCBwa3RfbGVuOiAweCUwNHgsIHRhZzogMHglMDR4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcGt0TGVuLCBwa3RUYWcpOworCisgICAgICAgICAgICAgICAgI2lmIDAKKyAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCAzMjsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRGJnUHJpbnQoIiUwMnggIiwgYnVmLT5kYXRhW2luZGV4LTE2K2ldKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoKGkgJiAweGYpID09IDB4ZikKKyAgICAgICAgICAgICAgICAgICAgICAgIERiZ1ByaW50KCJcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLyogRnJlZSBidWZmZXIgKi8KKyAgICAvL3pmd0J1ZkZyZWUoYWRhcHRlciwgcFVzYlJ4VHJhbnNmZXItPmJ1ZiwgMCk7CisgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisKKyAgICBmb3IoaWkgPSAwOyBpaSA8IHJ4QnVmUG9vbEluZGV4OyBpaSsrKQorICAgIHsKKyAgICAgICAgemZpVXNiUmVjdlBlclBrdChkZXYsIHJ4QnVmUG9vbFtpaV0pOworICAgIH0KK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZVc2JJbml0ICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEluaXRpYWxpemUgVVNCIHJlc291cmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEyICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmVXNiSW5pdCh6ZGV2X3QqIGRldikKK3sKKyAgICAvKiBJbml0aWFsaXplIFJ4ICYgSU5UIGVuZHBvaW50IGZvciByZWNlaXZpbmcgZGF0YSAmIGludGVycnVwdCAqLworICAgIHpmd1VzYkVuYWJsZVJ4RXB0KGRldiwgVVNCX0VORFBPSU5UX1JYX0lOREVYKTsKKyAgICB6ZndVc2JFbmFibGVJbnRFcHQoZGV2LCBVU0JfRU5EUE9JTlRfSU5UX0lOREVYKTsKKworICAgIHJldHVybjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZVc2JGcmVlICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEZyZWUgUENJIHJlc291cmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEyICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHpmVXNiRnJlZSh6ZGV2X3QqIGRldikKK3sKKyAgICBzdHJ1Y3QgenNIcFByaXYgKmhhbFByaXY7CisKKyAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBoYWxQcml2ID0gKHN0cnVjdCB6c0hwUHJpdiopd2QtPmhwUHJpdmF0ZTsKKworI2lmZGVmIFpNX09UVVNfUlhfU1RSRUFNX01PREUKKyAgICBpZiAoIGhhbFByaXYtPnJlbWFpbkJ1ZiAhPSBOVUxMICkKKyAgICB7CisgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBoYWxQcml2LT5yZW1haW5CdWYsIDApOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuOworfQorCit2b2lkIHpmSHBTZW5kQmVhY29uKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgbGVuKQoreworICAgIHUzMl90IGh3LCBsdzsKKyAgICB1MTZfdCBpOworICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKKworICAgIC8qIFdyaXRlIHRvIGJlYWNvbiBidWZmZXIgKFpNX0JFQUNPTl9CVUZGRVJfQUREUkVTUykgKi8KKyAgICBmb3IgKGkgPSAwOyBpPGxlbjsgaSs9NCkKKyAgICB7CisgICAgICAgIGx3ID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgaSk7CisgICAgICAgIGh3ID0gem13X3R4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgaSsyKTsKKworICAgICAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX0JFQUNPTl9CVUZGRVJfQUREUkVTUytpLCAoaHc8PDE2KStsdyk7CisgICAgfQorCisgICAgLyogQmVhY29uIFBDTFAgaGVhZGVyICovCisgICAgaWYgKCgoc3RydWN0IHpzSHBQcml2Kil3ZC0+aHBQcml2YXRlKS0+aHdGcmVxdWVuY3kgPCAzMDAwKQorICAgIHsKKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQkNOX1BMQ1AsICgobGVuKzQpPDwoMysxNikpKzB4MDQwMCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHpmRGVsYXlXcml0ZUludGVybmFsUmVnKGRldiwgWk1fTUFDX1JFR19CQ05fUExDUCwgKChsZW4rNCk8PCgxNikpKzB4MDAxYik7CisgICAgfQorCisgICAgLyogQmVhY29uIGxlbmd0aCAoaW5jbHVkZSBDUkMzMikgKi8KKyAgICB6ZkRlbGF5V3JpdGVJbnRlcm5hbFJlZyhkZXYsIFpNX01BQ19SRUdfQkNOX0xFTkdUSCwgbGVuKzQpOworCisgICAgLyogQmVhY29uIFJlYWR5ICovCisgICAgemZEZWxheVdyaXRlSW50ZXJuYWxSZWcoZGV2LCBaTV9NQUNfUkVHX0JDTl9DVFJMLCAxKTsKKyAgICB6ZkZsdXNoRGVsYXlXcml0ZShkZXYpOworCisgICAgLyogRnJlZSBiZWFjb24gYnVmICovCisgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisKKyAgICByZXR1cm47Cit9CisKKworI2RlZmluZSBaTV9TVEFUVVNfVFhfQ09NUCAgICAgICAweDAwCisjZGVmaW5lIFpNX1NUQVRVU19SRVRSWV9DT01QICAgIDB4MDEKKyNkZWZpbmUgWk1fU1RBVFVTX1RYX0ZBSUxFRCAgICAgMHgwMgordm9pZCB6ZmlVc2JSZWdJbih6ZGV2X3QqIGRldiwgdTMyX3QqIHJzcCwgdTE2X3QgcnNwTGVuKQoreworICAgIC8vdThfdCBsZW4sIHR5cGUsIGk7CisgICAgdThfdCB0eXBlOworICAgIHU4X3QgKnU4cnNwOworICAgIHUxNl90IHN0YXR1czsKKyAgICB1MzJfdCBiaXRtYXA7CisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgem1fbXNnMF9tbShaTV9MVl8zLCAiemZpVXNiUmVnSW4oKSIpOworCisgICAgdThyc3AgPSAodThfdCAqKXJzcDsKKworICAgIC8vbGVuID0gKnU4cnNwOworICAgIHR5cGUgPSAqKHU4cnNwKzEpOworICAgIHU4cnNwID0gdThyc3ArNDsKKworCisgICAgLyogSW50ZXJydXB0IGV2ZW50ICovCisgICAgaWYgKCh0eXBlICYgMHhDMCkgPT0gMHhDMCkKKyAgICB7CisgICAgICAgIGlmICh0eXBlID09IDB4QzApCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmQ29yZUV2ZW50KGRldiwgMCwgdThyc3ApOworCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodHlwZSA9PSAweEMxKQorICAgICAgICB7CisjaWYgMAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHUxNl90IGk7CisgICAgICAgICAgICAgICAgRGJnUHJpbnQoInJzcExlbj0lZFxuIiwgcnNwTGVuKTsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTwocnNwTGVuLzQpOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEYmdQcmludCgicnNwWyVkXT0weCVseFxuIiwgaSwgcnNwW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIHN0YXR1cyA9ICh1MTZfdCkocnNwWzNdID4+IDE2KTsKKworICAgICAgICAgICAgLy8vLzY3ODkKKyAgICAgICAgICAgIHJzcFs4XSA9IHJzcFs4XSA+PiAyIHwgKHJzcFs5XSAmIDB4MSkgPDwgNjsKKyAgICAgICAgICAgIHN3aXRjaCAoc3RhdHVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBaTV9TVEFUVVNfUkVUUllfQ09NUCA6CisgICAgICAgICAgICAgICAgemZDb3JlRXZlbnQoZGV2LCAxLCB1OHJzcCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFpNX1NUQVRVU19UWF9GQUlMRUQgOgorICAgICAgICAgICAgICAgIHpmQ29yZUV2ZW50KGRldiwgMiwgdThyc3ApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBaTV9TVEFUVVNfVFhfQ09NUCA6CisgICAgICAgICAgICAgICAgemZDb3JlRXZlbnQoZGV2LCAzLCB1OHJzcCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodHlwZSA9PSAweEMyKQorICAgICAgICB7CisgICAgICAgICAgICB6ZkJlYWNvbkNmZ0ludGVycnVwdChkZXYsIHU4cnNwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0eXBlID09IDB4QzMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmRW5kT2ZBdGltV2luZG93SW50ZXJydXB0KGRldik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodHlwZSA9PSAweEM0KQorICAgICAgICB7CisjaWYgMAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHUxNl90IGk7CisgICAgICAgICAgICAgICAgRGJnUHJpbnQoIjB4QzI6cnNwTGVuPSVkXG4iLCByc3BMZW4pOworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPChyc3BMZW4vNCk7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERiZ1ByaW50KCIweEMyOnJzcFslZF09MHglbHhcbiIsIGksIHJzcFtpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBiaXRtYXAgPSAocnNwWzFdID4+IDE2KSArICgocnNwWzJdICYgMHhGRkZGKSA8PCAxNiApOworICAgICAgICAgICAgLy96ZkJhd0NvcmUoZGV2LCAodTE2X3QpcnNwWzFdICYgMHhGRkZGLCBiaXRtYXAsICh1MTZfdCkocnNwWzJdID4+IDE2KSAmIDB4RkYpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gMHhDNSkKKyAgICAgICAgeworICAgICAgICAgICAgdTE2X3QgaTsKKyNpZiAwCisKKyAgICAgICAgICAgIGZvciAoaT0wOyBpPChyc3BMZW4vNCk7IGkrKykgeworICAgICAgICAgICAgICAgIERiZ1ByaW50KCIweEM1OnJzcFslZF09MHglbHhcbiIsIGksIHJzcFtpXSk7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIGZvciAoaT0xOyBpPChyc3BMZW4vNCk7IGkrKykgeworICAgICAgICAgICAgICAgIHU4cnNwID0gKHU4X3QgKikocnNwK2kpOworICAgICAgICAgICAgICAgIC8vRGJnUHJpbnQoIjB4QzU6cnNwWyVkXT0weCVseFxuIiwgaSwgKCh1MzJfdCopdThyc3ApWzBdKTsKKyAgICAgICAgICAgICAgICB6ZkNvcmVFdmVudChkZXYsIDQsIHU4cnNwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0eXBlID09IDB4QzYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHptX2RlYnVnX21zZzAoIlxuXG4gV2F0Y2hEb2cgaW50ZXJydXB0ISEhIDogMHhDNiBcblxuIik7CisgICAgICAgICAgICBpZiAod2QtPnpmY2JId1dhdGNoRG9nTm90aWZ5ICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2QtPnpmY2JId1dhdGNoRG9nTm90aWZ5KGRldik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodHlwZSA9PSAweEM4KQorICAgICAgICB7CisgICAgICAgICAgICAvL1BaU1dfQURBUFRFUiBhZGFwdGVyOworCisgICAgICAgICAgICAvLyBmb3IgU1BJIGZsYXNoIHByb2dyYW0gY2hrIEZsYWcKKyAgICAgICAgICAgIHpmd0RiZ1Byb2dyYW1lRmxhc2hDaGtEb25lKGRldik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodHlwZSA9PSAweEM5KQorICAgICAgICB7CisgICAgICAgICAgICBzdHJ1Y3QgenNIcFByaXYqIGhwUHJpdj13ZC0+aHBQcml2YXRlOworCisgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCIjIyMjIyBUeCByZXRyYW5zbWlzc2lvbiA1IHRpbWVzIGV2ZW50ICMjIyMjIik7CisKKyAgICAgICAgICAgIC8qIGNvcnJlY3QgdHggcmV0cmFuc21pc3Npb24gaXNzdWUgKi8KKyAgICAgICAgICAgIGhwUHJpdi0+cmV0cmFuc21pc3Npb25FdmVudCA9IDE7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgemZJZGxSc3AoZGV2LCByc3AsIHJzcExlbik7CisgICAgfQorfQorCisKKyNkZWZpbmUgWk1fUFJPR1JBTV9SQU1fQUREUiAgICAgMHgyMDAwMDAgLy8weDEwMDAgLy8weDcwMDAwMAorI2RlZmluZSBGSVJNV0FSRV9ET1dOTE9BRCAgICAgICAweDMwCisjZGVmaW5lIEZJUk1XQVJFX0RPV05MT0FEX0NPTVAgIDB4MzEKKyNkZWZpbmUgRklSTVdBUkVfQ09ORklSTSAgICAgICAgMHgzMgorCit1MTZfdCB6ZkZpcm13YXJlRG93bmxvYWQoemRldl90KiBkZXYsIHUzMl90KiBmdywgdTMyX3QgbGVuLCB1MzJfdCBvZmZzZXQpCit7CisgICAgdTE2X3QgcmV0ID0gWk1fU1VDQ0VTUzsKKyAgICB1MzJfdCB1Q29kZU9mc3QgPSBvZmZzZXQ7CisgICAgdThfdCAqaW1hZ2UsICpwdHI7CisgICAgdTMyX3QgcmVzdWx0OworCisgICAgaW1hZ2UgPSAodThfdCopIGZ3OworICAgIHB0ciA9IGltYWdlOworCisgICAgd2hpbGUgKGxlbiA+IDApCisgICAgeworICAgICAgICB1MzJfdCB0cmFuc2xlbiA9IChsZW4gPiA0MDk2KSA/IDQwOTYgOiBsZW47CisKKyAgICAgICAgcmVzdWx0ID0gemZ3VXNiU3VibWl0Q29udHJvbChkZXYsIEZJUk1XQVJFX0RPV05MT0FELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MTZfdCkgKHVDb2RlT2ZzdCA+PiA4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBpbWFnZSwgdHJhbnNsZW4pOworCisgICAgICAgIGlmIChyZXN1bHQgIT0gWk1fU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgem1fbXNnMF9pbml0KFpNX0xWXzAsICJGSVJNV0FSRV9ET1dOTE9BRCBmYWlsZWQiKTsKKyAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKworICAgICAgICBsZW4gLT0gdHJhbnNsZW47CisgICAgICAgIGltYWdlICs9IHRyYW5zbGVuOworICAgICAgICB1Q29kZU9mc3QgKz0gdHJhbnNsZW47IC8vIGluIFdvcmQgKDE2IGJpdCkKKworICAgICAgICByZXN1bHQgPSAwOworICAgIH0KKworICAgIC8qIElmIGRvd25sb2FkIGZpcm13YXJlIHN1Y2Nlc3MsIGlzc3VlIGEgY29tbWFuZCB0byBmaXJtd2FyZSAqLworICAgIGlmIChyZXQgPT0gMCkKKyAgICB7CisgICAgICAgIHJlc3VsdCA9IHpmd1VzYlN1Ym1pdENvbnRyb2woZGV2LCBGSVJNV0FSRV9ET1dOTE9BRF9DT01QLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIE5VTEwsIDApOworCisgICAgICAgIGlmIChyZXN1bHQgIT0gWk1fU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgem1fbXNnMF9pbml0KFpNX0xWXzAsICJGSVJNV0FSRV9ET1dOTE9BRF9DT01QIGZhaWxlZCIpOworICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorICAgIH0KKworI2lmIDAKKyAgICAvKiBQQ0kgY29kZSAqLworICAgIC8qIFdhaXQgZm9yIGZpcm13YXJlIHJlYWR5ICovCisgICAgcmVzdWx0ID0gemZ3VXNiU3VibWl0Q29udHJvbChkZXYsIEZJUk1XQVJFX0NPTkZJUk0sIFVTQl9ESVJfSU4gfCAweDQwLAorICAgICAgICAgICAgICAgICAgICAgMCwgMCwgJnJldF92YWx1ZSwgc2l6ZW9mKHJldF92YWx1ZSksIEhaKTsKKworICAgIGlmIChyZXN1bHQgIT0gMCkKKyAgICB7CisgICAgICAgIHptX21zZzBfaW5pdChaTV9MVl8wLCAiQ2FuJ3QgcmVjZWl2ZSBmaXJtd2FyZSByZWFkeTogIiwgcmVzdWx0KTsKKyAgICAgICAgcmV0ID0gMTsKKyAgICB9CisjZW5kaWYKKworZXhpdDoKKworICAgIHJldHVybiByZXQ7CisKK30KKwordTE2X3QgemZGaXJtd2FyZURvd25sb2FkTm90SnVtcCh6ZGV2X3QqIGRldiwgdTMyX3QqIGZ3LCB1MzJfdCBsZW4sIHUzMl90IG9mZnNldCkKK3sKKyAgICB1MTZfdCByZXQgPSBaTV9TVUNDRVNTOworICAgIHUzMl90IHVDb2RlT2ZzdCA9IG9mZnNldDsKKyAgICB1OF90ICppbWFnZSwgKnB0cjsKKyAgICB1MzJfdCByZXN1bHQ7CisKKyAgICBpbWFnZSA9ICh1OF90KikgZnc7CisgICAgcHRyID0gaW1hZ2U7CisKKyAgICB3aGlsZSAobGVuID4gMCkKKyAgICB7CisgICAgICAgIHUzMl90IHRyYW5zbGVuID0gKGxlbiA+IDQwOTYpID8gNDA5NiA6IGxlbjsKKworICAgICAgICByZXN1bHQgPSB6ZndVc2JTdWJtaXRDb250cm9sKGRldiwgRklSTVdBUkVfRE9XTkxPQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUxNl90KSAodUNvZGVPZnN0ID4+IDgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGltYWdlLCB0cmFuc2xlbik7CisKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBaTV9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICB6bV9tc2cwX2luaXQoWk1fTFZfMCwgIkZJUk1XQVJFX0RPV05MT0FEIGZhaWxlZCIpOworICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorCisgICAgICAgIGxlbiAtPSB0cmFuc2xlbjsKKyAgICAgICAgaW1hZ2UgKz0gdHJhbnNsZW47CisgICAgICAgIHVDb2RlT2ZzdCArPSB0cmFuc2xlbjsgLy8gaW4gV29yZCAoMTYgYml0KQorCisgICAgICAgIHJlc3VsdCA9IDA7CisgICAgfQorCitleGl0OgorCisgICAgcmV0dXJuIHJldDsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZJZGxHZXRGcmVlVHhkQ291bnQgICAgICAgICovCisvKiAgICAgIEdldCBmcmVlIFBDSSBQQ0kgVHhEIGNvdW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFN0ZXBoZW4gICAgICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA2LjYgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzJfdCB6ZkhwR2V0RnJlZVR4ZENvdW50KHpkZXZfdCogZGV2KQoreworICAgIHJldHVybiB6ZndVc2JHZXRGcmVlVHhRU2l6ZShkZXYpOworfQorCit1MzJfdCB6ZkhwR2V0TWF4VHhkQ291bnQoemRldl90KiBkZXYpCit7CisgICAgLy9yZXR1cm4gODsKKyAgICByZXR1cm4gemZ3VXNiR2V0TWF4VHhRU2l6ZShkZXYpOworfQorCit2b2lkIHpmaVVzYlJlZ091dENvbXBsZXRlKHpkZXZfdCogZGV2KQoreworICAgIHJldHVybjsKK30KKworZXh0ZXJuIHZvaWQgemZQdXNoVnR4cSh6ZGV2X3QqIGRldik7CisKK3ZvaWQgemZpVXNiT3V0Q29tcGxldGUoemRldl90KiBkZXYsIHpidWZfdCAqYnVmLCB1OF90IHN0YXR1cywgdThfdCAqaGRyKSB7CisjaWZuZGVmIFpNX0VOQUJMRV9BR0dSRUdBVElPTgorICAgIGlmIChidWYpIHsKKyAgICAgICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CisgICAgfQorI2Vsc2UKKyAgICAjaWZkZWYgWk1fQllQQVNTX0FHR1JfU0NIRURVTElORworICAgIC8vU2ltcGx5IGZyZWUgdGhlIGJ1ZiBzaW5jZSBCQSByZXRyYW5zbWlzc2lvbiBpcyBkb25lIGluIHRoZSBmaXJtd2FyZQorICAgIGlmIChidWYpCisgICAgeworICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICB9CisgICAgemZQdXNoVnR4cShkZXYpOworICAgICNlbHNlCisgICAgem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgI2lmZGVmIFpNX0VOQUJMRV9GV19CQV9SRVRSQU5TTUlTU0lPTgorICAgIC8vU2ltcGx5IGZyZWUgdGhlIGJ1ZiBzaW5jZSBCQSByZXRyYW5zbWlzc2lvbiBpcyBkb25lIGluIHRoZSBmaXJtd2FyZQorICAgIGlmIChidWYpCisgICAgeworICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICB9CisgICAgI2Vsc2UKKyAgICB1OF90IGFnZzsKKyAgICB1MTZfdCBmcmFtZVR5cGU7CisKKyAgICBpZighaGRyICYmIGJ1ZikgeworICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgLy96bV9kZWJ1Z19tc2cwKCJidWYgRnJlZSBkdWUgdG8gaGRyID09IE5VTEwiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmKGhkciAmJiBidWYpIHsKKyAgICAgICAgZnJhbWVUeXBlID0gaGRyWzhdICYgMHhmOworICAgICAgICBhZ2cgPSAodThfdCkoaGRyWzJdID4+IDUgKSAmIDB4MTsKKyAgICAgICAgLy96bV9kZWJ1Z19tc2cxKCJBR0c9IiwgYWdnKTsKKworICAgICAgICBpZiAoIXN0YXR1cykgeworICAgICAgICAgICAgaWYgKGFnZykgeworICAgICAgICAgICAgICAgIC8vZGVsZXRlIGJ1ZiBpbiBiYSBmYWlsIHF1ZXVlPz8KKyAgICAgICAgICAgICAgICAvL25vdCBnYW5uYSBoYXBwZW4/CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB6ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChhZ2cpIHsKKyAgICAgICAgICAgICAgICAvL2Rvbid0IGRvIGFueXRoaW5nCisgICAgICAgICAgICAgICAgLy96ZndCdWZGcmVlKGRldiwgYnVmLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHpmd0J1ZkZyZWUoZGV2LCBidWYsIDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgICNlbmRpZgorCisgICAgaWYgKHdkLT5zdGF0ZSAhPSBaTV9XTEFOX1NUQVRFX0VOQUJMRUQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmKCAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApIHx8CisgICAgICAgICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSAmJiB3ZC0+c3RhLkVuYWJsZUhUKSB8fAorICAgICAgICAod2QtPndsYW5Nb2RlID09IFpNX01PREVfUFNFVURPKSApIHsKKyAgICAgICAgemZBZ2dUeFNjaGVkdWxlcihkZXYsIDApOworICAgIH0KKyAgICAjZW5kaWYKKyNlbmRpZgorCisgICAgcmV0dXJuOworCit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocHVzYi5oIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL2hwdXNiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVhMGM1NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2hhbC9ocHVzYi5oCkBAIC0wLDAgKzEsNDM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICBNb2R1bGUgTmFtZSA6IHVkX2RlZnMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgVVNCIGRhdGEgc3RydWN0dXJlIGRlZmluaXRpb25zLiAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfSFBVU0JfSAorI2RlZmluZSBfSFBVU0JfSAorCisjZGVmaW5lIFpNX09UVVNfRU5BQkxFX1JFVFJZX0ZSRVFfQ0hBTkdFCisjZGVmaW5lIFpNX0JFQUNPTl9CVUZGRVJfQUREUkVTUyAgICAgICAgICAgIDB4MTE3OTAwCisKKyNkZWZpbmUgWk1fTUFYX0NNRF9TSVpFICAgICAgICAgICAgICAgICAgICAgNjQKKyNkZWZpbmUgWk1fSEFMX01BWF9FRVBST01fUkVRICAgICAgICAgICAgICAgNTEwCisjZGVmaW5lIFpNX0hBTF9NQVhfRUVQUk9NX1BSUSAgICAgICAgICAgICAgIDIKKworLyogRm9yIFVTQiBTVFJFQU0gbW9kZSAqLworI2lmZGVmIFpNX0RJU0FCTEVfQU1TRFU4S19TVVBQT1JUCisjZGVmaW5lIFpNX01BWF9VU0JfSU5fVFJBTlNGRVJfU0laRSAgICAgICAgIDQwOTYKKyNlbHNlCisjZGVmaW5lIFpNX01BWF9VU0JfSU5fVFJBTlNGRVJfU0laRSAgICAgICAgIDgxOTIKKyNlbmRpZgorI2RlZmluZSBaTV9VU0JfU1RSRUFNX01PREVfVEFHX0xFTiAgICAgICAgICA0CisjZGVmaW5lIFpNX1VTQl9TVFJFQU1fTU9ERV9UQUcgICAgICAgICAgICAgIDB4NGUwMAorI2RlZmluZSBaTV9VU0JfTUFYX0VQSU5UX0JVRkZFUiAgICAgICAgICAgICA2NAorCitzdHJ1Y3QgenNDbWRRCit7CisgICAgdTE2X3Qgc3JjOworICAgIHUxNl90IGNtZExlbjsKKyAgICB1OF90KiBidWY7CisgICAgdTMyX3QgY21kW1pNX01BWF9DTURfU0laRS80XTsKK307CisKK3N0cnVjdCB6c0NvbW1hbmQKK3sKKyAgICB1MTZfdCBkZWxheVdjbWRDb3VudDsKKyAgICB1MzJfdCBkZWxheVdjbWRBZGRyWyhaTV9DTURfUVVFVUVfU0laRS00KS80XTsKKyAgICB1MzJfdCBkZWxheVdjbWRWYWxbKFpNX0NNRF9RVUVVRV9TSVpFLTQpLzRdOworfTsKKworc3RydWN0IHpzSGFsUnhJbmZvCit7CisgICAgdTMyX3QgY3VycmVudFJTU0lbN107ICAgICAgIC8qIFJTU0kgY29tYmluZWQgKi8KKyAgICB1MzJfdCBjdXJyZW50UnhFVk1bMTRdOworICAgIHUzMl90IGN1cnJlbnRSeERhdGFNVDsKKyAgICB1MzJfdCBjdXJyZW50UnhEYXRhTUNTOworICAgIHUzMl90IGN1cnJlbnRSeERhdGFCVzsKKyAgICB1MzJfdCBjdXJyZW50UnhEYXRhU0c7Cit9OworCitzdHJ1Y3QgenNIcFByaXYKK3sKKyAgICB1MTZfdCBod0ZyZXF1ZW5jeTsKKyAgICB1OF90ICBod0J3NDA7CisgICAgdThfdCAgaHdFeHRPZmZzZXQ7CisKKyAgICB1OF90ICBkaXNhYmxlRGZzQ2g7CisKKyAgICB1MzJfdCBoYWxDYXBhYmlsaXR5OworCisgICAgLyogRm9ydHVuYXRlbHkgdGhlIHNlY29uZCBsb29wIGNhbiBiZSBkaXNhYmxlZCB3aXRoIGEgYml0ICovCisgICAgLyogY2FsbGVkIGVuX3BkX2RjX29mZnNldF90aHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdThfdCBod05vdEZpcnN0SW5pdDsKKworICAgIC8qIGNvbW1hbmQgcXVldWUgKi8KKyAgICB1MTZfdCAgICAgICAgICAgICAgIGNtZEhlYWQ7CisgICAgdTE2X3QgICAgICAgICAgICAgICBjbWRUYWlsOworI2lmZGVmIFpNX1hQX1VTQl9NVUxUQ01ECisgICAgdTE2X3QgICAgICAgICAgICAgICBjbWRTZW5kOyAgLy8gVXNlZCBmb3IgTXVsdCBzZW5kIFVTQiBjbWQKKyNlbmRpZgorICAgIHN0cnVjdCB6c0NtZFEgICAgICAgY21kUVtaTV9DTURfUVVFVUVfU0laRV07CisgICAgdTE2X3QgICAgICAgICAgICAgICBjbWRQZW5kaW5nOworICAgIHN0cnVjdCB6c0NvbW1hbmQgICAgY21kOyAvKiBidWZmZXIgZm9yIGRlbGF5ZWQgY29tbWFuZHMgKi8KKyAgICB1OF90ICAgICAgICAgICAgICAgIGxlZE1vZGVbMl07CisgICAgdTMyX3QgICAgICAgICAgICAgICBjdGxCdXN5OworICAgIHUzMl90ICAgICAgICAgICAgICAgZXh0QnVzeTsKKworICAgIC8qCisgICAgICogQU5JICYgUmFkYXIgc3VwcG9ydC4KKyAgICAgKi8KKyAgICB1MzJfdCAgIHByb2NQaHlFcnI7ICAgICAgICAgLyogUHJvY2VzcyBQaHkgZXJycyAqLworICAgIHU4X3QgaGFzSHdQaHlDb3VudGVyczsgICAvKiBIYXJkd2FyZSBoYXMgcGh5IGNvdW50ZXJzICovCisgICAgdTMyX3QgICBhbmlQZXJpb2Q7ICAgICAgICAgIC8qIGFuaSB1cGRhdGUgbGlzdCBwZXJpb2QgKi8KKyAgICBzdHJ1Y3QgenNBbmlTdGF0cyAgIHN0YXRzOyAgICAgIC8qIHZhcmlvdXMgc3RhdGlzdGljcyAqLworICAgIHN0cnVjdCB6c0FuaVN0YXRlICAgKmN1cmFuaTsgICAgLyogY2FjaGVkIGxhc3QgcmVmZXJlbmNlICovCisgICAgc3RydWN0IHpzQW5pU3RhdGUgICBhbmlbNTBdOyAgIC8qIHBlci1jaGFubmVsIHN0YXRlICovCisKKyAgICAvKgorICAgICAqIEFuaSB0YWJsZXMgdGhhdCBjaGFuZ2UgYmV0d2VlbiB0aGUgNTQxNiBhbmQgNTMxMi4KKyAgICAgKiBUaGVzZSBnZXQgc2V0IGF0IGF0dGFjaCB0aW1lLgorICAgICAqIFhYWCBkb24ndCBiZWxvbmcgaGVyZQorICAgICAqIFhYWCBuZWVkIGJldHRlciBleHBsYW5hdGlvbgorICAgICAqLworICAgIHMzMl90ICAgICB0b3RhbFNpemVEZXNpcmVkWzVdOworICAgIHMzMl90ICAgICBjb2Fyc2VIaWdoWzVdOworICAgIHMzMl90ICAgICBjb2Fyc2VMb3dbNV07CisgICAgczMyX3QgICAgIGZpcnB3cls1XTsKKworICAgIC8qCisgICAgICogQU5JIHJlbGF0ZWQgUEhZIHJlZ2lzdGVyIHZhbHVlLgorICAgICAqLworICAgIHUzMl90IHJlZ1BIWURlc2lyZWRTWjsKKyAgICB1MzJfdCByZWdQSFlGaW5kU2lnOworICAgIHUzMl90IHJlZ1BIWUFnY0N0bDE7CisgICAgdTMyX3QgcmVnUEhZU2Zjb3JyOworICAgIHUzMl90IHJlZ1BIWVNmY29yckxvdzsKKyAgICB1MzJfdCByZWdQSFlUaW1pbmc1OworICAgIHUzMl90IHJlZ1BIWUNja0RldGVjdDsKKworICAgIHUzMl90IGVlcHJvbUltYWdlWzEwMjRdOworICAgIHUzMl90IGVlcHJvbUltYWdlSW5kZXg7CisgICAgdTMyX3QgZWVwcm9tSW1hZ2VSZFJlcTsKKworICAgIHU4X3QgIGhhbFJlSW5pdDsKKworICAgIHU4X3QgIE9wRmxhZ3M7CisKKyAgICB1OF90IHRQb3cyeENja1s0XTsKKyAgICB1OF90IHRQb3cyeDJnWzRdOworICAgIHU4X3QgdFBvdzJ4MmcyNEhlYXZ5Q2xpcE9mZnNldDsKKyAgICB1OF90IHRQb3cyeDJnSHQyMFs4XTsKKyAgICB1OF90IHRQb3cyeDJnSHQ0MFs4XTsKKyAgICB1OF90IHRQb3cyeDVnWzRdOworICAgIHU4X3QgdFBvdzJ4NWdIdDIwWzhdOworICAgIHU4X3QgdFBvdzJ4NWdIdDQwWzhdOworCisgICAgLyogaHdCQkhlYXZ5Q2xpcCA6IHVzZWQgY29tcGF0aWJpbGl0eSAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICAgICAgICAwIDogZG9uZ2xlIG5vdCBzdXBwb3J0LiAgICAgICAgICAqLworICAgIC8qICAgICAgICAgICAgICEwOiBzdXBwb3J0IGhlYXZ5IGNsaXAuICAgICAgICAgICovCisgICAgdThfdCBod0JCSGVhdnlDbGlwOworICAgIHU4X3QgZW5hYmxlQkJIZWF2eUNsaXA7IC8qIDA9PmZvcmNlIGRpc2FibGUgMT0+ZW5hYmxlICovCisgICAgdThfdCBkb0JCSGVhdnlDbGlwOyAgICAgLyogc2V0IDEgaWYgaGVhdnkgY2xpcCBuZWVkIGJ5IGVhY2ggZnJlcXVlbmN5IHN3aXRjaCAqLworICAgIHUzMl90IHNldFZhbHVlSGVhdnlDbGlwOyAvKiBzYXZlIHNldHRpbmcgdmFsdWUgZm9yIGhlYXZ5IGNsaXAgd2hlbiBjb21wbGV0ZWQgcm91dGluZSAqLworCisgICAgLyoKKyAgICAgKiBSeGRhdGEgUlNTSSwgRVZNLCBSYXRlIGV0Yy4uLgorICAgICAqLworICAgIHN0cnVjdCB6c0hhbFJ4SW5mbyBoYWxSeEluZm87CisKKyAgICB1MzJfdCB1c2JTZW5kQnl0ZXM7CisgICAgdTMyX3QgdXNiQWNTZW5kQnl0ZXNbNF07CisKKyAgICB1MTZfdCBhZ2dNYXhEdXJhdGlvbkJFOworICAgIHUzMl90IGFnZ1BrdE51bTsKKworICAgIHUxNl90IHR4b3BbNF07CisgICAgdTE2X3QgY3dtaW5bNF07CisgICAgdTE2X3QgY3dtYXhbNF07CisgICAgdThfdCAgc3Ryb25nUlNTSTsKKyAgICB1OF90ICByeFN0cm9uZ1JTU0k7CisKKyAgICB1OF90ICBzbG90VHlwZTsgIC8vMC0+MjB1cywgMT0+OXVzCisKKyNpZmRlZiBaTV9PVFVTX1JYX1NUUkVBTV9NT0RFCisgICAgdTE2X3QgdXNiUnhSZW1haW5MZW47CisgICAgdTE2X3QgdXNiUnhQa3RMZW47CisgICAgdTE2X3QgdXNiUnhQYWRMZW47CisgICAgdTE2X3QgdXNiUnhUcmFuc2ZlckxlbjsKKyAgICB6YnVmX3QgICpyZW1haW5CdWY7CisjZW5kaWYKKworICAgIHU4X3QgICAgZG90MTFNb2RlOworCisgICAgdThfdCAgICBpYnNzQmNuRW5hYmxlZDsKKyAgICB1MzJfdCAgIGlic3NCY25JbnRlcnZhbDsKKworICAgIC8vIEZvciByZS1pc3N1ZSB0aGUgZnJlcXVlbmN5IGNoYW5nZSBjb21tYW5kCisgICAgdTMyX3QgICBsYXRlc3RGcmVxdWVuY3k7CisgICAgdThfdCAgICBsYXRlc3RCdzQwOworICAgIHU4X3QgICAgbGF0ZXN0RXh0T2Zmc2V0OworICAgIHU4X3QgICAgZnJlcVJldHJ5Q291bnRlcjsKKworICAgIHU4X3QgICAgcmVjb3JkRnJlcVJldHJ5Q291bnRlcjsKKyAgICB1OF90ICAgIGlzU2l0ZVN1cnZleTsKKyAgICB1OF90ICAgIGNvbGRSZXNldE5lZWRGcmVxOworCisgICAgdTY0X3QgICBjYW1Sb2xsQ2FsbFRhYmxlOworICAgIHU4X3QgICAgY3VycmVudEFja1J0c1RwYzsKKworICAgIC8qICMxIFNhdmUgdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIHJlbGF0ZWQgUklGUyByZWdpc3RlciBzZXR0aW5ncyAqLworICAgIC8vdTMyX3QgICBpc0luaXRpYWxQaHk7CisgICAgdTMyX3QgICBpbml0RGVzaXJlZFNpZ1NpemU7CisgICAgdTMyX3QgICBpbml0QUdDOworICAgIHUzMl90ICAgaW5pdEFnY0NvbnRyb2w7CisgICAgdTMyX3QgICBpbml0U2VhcmNoU3RhcnREZWxheTsKKyAgICB1MzJfdCAgIGluaXRSSUZTU2VhcmNoUGFyYW1zOworICAgIHUzMl90ICAgaW5pdEZhc3RDaGFubmVsQ2hhbmdlQ29udHJvbDsKKworICAgIC8qIER5bmFtaWMgU0lGUyBmb3IgcmV0cmFuc21pc3Npb24gZXZlbnQgKi8KKyAgICB1OF90ICAgIHJldHJhbnNtaXNzaW9uRXZlbnQ7CisgICAgdThfdCAgICBsYXRlc3RTSUZTOworfTsKKworZXh0ZXJuIHUzMl90IHpmSHBMb2FkRUVQUk9NRnJvbUZXKHpkZXZfdCogZGV2KTsKKworCit0eXBlZGVmIHU4X3QgQV9VSU5UODsKK3R5cGVkZWYgczhfdCBBX0lOVDg7Cit0eXBlZGVmIHUxNl90IEFfVUlOVDE2OwordHlwZWRlZiB1MzJfdCBBX1VJTlQzMjsKKyNkZWZpbmUgX19BVFRSSUJfUEFDSworCisjcHJhZ21hIHBhY2sgKHB1c2gsIDEpCisKKyNkZWZpbmUgQVI1NDE2X0VFUF9WRVIgICAgICAgICAgICAgICAweEUKKyNkZWZpbmUgQVI1NDE2X0VFUF9WRVJfTUlOT1JfTUFTSyAgICAweEZGRgorI2RlZmluZSBBUjU0MTZfRUVQX05PX0JBQ0tfVkVSICAgICAgIDB4MQorI2RlZmluZSBBUjU0MTZfRUVQX01JTk9SX1ZFUl8yICAgICAgIDB4MiAgLy8gQWRkcyBtb2RhbCBwYXJhbXMgdHhGcmFtZVRvUGFPbiwgdHhGcmFtZXRvRGF0YVN0YXJ0LCBodDQwUG93ZXJJbmMKKyNkZWZpbmUgQVI1NDE2X0VFUF9NSU5PUl9WRVJfMyAgICAgICAweDMgIC8vIEFkZHMgbW9kYWwgcGFyYW1zIGJzd0F0dGVuLCBic3dNYXJnaW4sIHN3U2V0dGxlIGFuZCBiYXNlIE9wRmxhZ3MgZm9yIEhUMjAvNDAgRGlzYWJsZQorCisvLyAxNi1iaXQgb2Zmc2V0IGxvY2F0aW9uIHN0YXJ0IG9mIGNhbGlicmF0aW9uIHN0cnVjdAorI2RlZmluZSBBUjU0MTZfRUVQX1NUQVJUX0xPQyAgICAgICAgIDI1NgorI2RlZmluZSBBUjU0MTZfTlVNXzVHX0NBTF9QSUVSUyAgICAgIDgKKyNkZWZpbmUgQVI1NDE2X05VTV8yR19DQUxfUElFUlMgICAgICA0CisjZGVmaW5lIEFSNTQxNl9OVU1fNUdfMjBfVEFSR0VUX1BPV0VSUyAgOAorI2RlZmluZSBBUjU0MTZfTlVNXzVHXzQwX1RBUkdFVF9QT1dFUlMgIDgKKyNkZWZpbmUgQVI1NDE2X05VTV8yR19DQ0tfVEFSR0VUX1BPV0VSUyAzCisjZGVmaW5lIEFSNTQxNl9OVU1fMkdfMjBfVEFSR0VUX1BPV0VSUyAgNAorI2RlZmluZSBBUjU0MTZfTlVNXzJHXzQwX1RBUkdFVF9QT1dFUlMgIDQKKyNkZWZpbmUgQVI1NDE2X05VTV9DVExTICAgICAgICAgICAgICAyNAorI2RlZmluZSBBUjU0MTZfTlVNX0JBTkRfRURHRVMgICAgICAgIDgKKyNkZWZpbmUgQVI1NDE2X05VTV9QRF9HQUlOUyAgICAgICAgICA0CisjZGVmaW5lIEFSNTQxNl9QRF9HQUlOU19JTl9NQVNLICAgICAgNAorI2RlZmluZSBBUjU0MTZfUERfR0FJTl9JQ0VQVFMgICAgICAgIDUKKyNkZWZpbmUgQVI1NDE2X0VFUFJPTV9NT0RBTF9TUFVSUyAgICA1CisjZGVmaW5lIEFSNTQxNl9NQVhfUkFURV9QT1dFUiAgICAgICAgNjMKKyNkZWZpbmUgQVI1NDE2X05VTV9QREFEQ19WQUxVRVMgICAgICAxMjgKKyNkZWZpbmUgQVI1NDE2X05VTV9SQVRFUyAgICAgICAgICAgICAxNgorI2RlZmluZSBBUjU0MTZfQkNIQU5fVU5VU0VEICAgICAgICAgIDB4RkYKKyNkZWZpbmUgQVI1NDE2X01BWF9QV1JfUkFOR0VfSU5fSEFMRl9EQiA2NAorI2RlZmluZSBBUjU0MTZfT1BGTEFHU18xMUEgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgQVI1NDE2X09QRkxBR1NfMTFHICAgICAgICAgICAweDAyCisjZGVmaW5lIEFSNTQxNl9PUEZMQUdTXzVHX0hUNDAgICAgICAgMHgwNAorI2RlZmluZSBBUjU0MTZfT1BGTEFHU18yR19IVDQwICAgICAgIDB4MDgKKyNkZWZpbmUgQVI1NDE2X09QRkxBR1NfNUdfSFQyMCAgICAgICAweDEwCisjZGVmaW5lIEFSNTQxNl9PUEZMQUdTXzJHX0hUMjAgICAgICAgMHgyMAorI2RlZmluZSBBUjU0MTZfRUVQTUlTQ19CSUdfRU5ESUFOICAgIDB4MDEKKyNkZWZpbmUgRlJFUTJGQklOKHgseSkgKCh5KSA/ICgoeCkgLSAyMzAwKSA6ICgoKHgpIC0gNDgwMCkgLyA1KSkKKyNkZWZpbmUgQVI1NDE2X01BWF9DSEFJTlMgICAgICAgICAgICAyCisjZGVmaW5lIEFSNTQxNl9BTlRfMTZTICAgICAgICAgICAgICAgMjUKKworI2RlZmluZSBBUjU0MTZfTlVNX0FOVF9DSEFJTl9GSUVMRFMgICAgIDcKKyNkZWZpbmUgQVI1NDE2X05VTV9BTlRfQ09NTU9OX0ZJRUxEUyAgICA0CisjZGVmaW5lIEFSNTQxNl9TSVpFX0FOVF9DSEFJTl9GSUVMRCAgICAgMworI2RlZmluZSBBUjU0MTZfU0laRV9BTlRfQ09NTU9OX0ZJRUxEICAgIDQKKyNkZWZpbmUgQVI1NDE2X0FOVF9DSEFJTl9NQVNLICAgICAgICAgICAweDcKKyNkZWZpbmUgQVI1NDE2X0FOVF9DT01NT05fTUFTSyAgICAgICAgICAweGYKKyNkZWZpbmUgQVI1NDE2X0NIQUlOXzBfSURYICAgICAgICAgICAgICAwCisjZGVmaW5lIEFSNTQxNl9DSEFJTl8xX0lEWCAgICAgICAgICAgICAgMQorI2RlZmluZSBBUjU0MTZfQ0hBSU5fMl9JRFggICAgICAgICAgICAgIDIKKworCisvKiBDYXBhYmlsaXRpZXMgRW51bSAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBFRVBDQVBfQ09NUFJFU1NfRElTICA9IDB4MDAwMSwKKyAgICBFRVBDQVBfQUVTX0RJUyAgICAgICA9IDB4MDAwMiwKKyAgICBFRVBDQVBfRkFTVEZSQU1FX0RJUyA9IDB4MDAwNCwKKyAgICBFRVBDQVBfQlVSU1RfRElTICAgICA9IDB4MDAwOCwKKyAgICBFRVBDQVBfTUFYUUNVX00gICAgICA9IDB4MDFGMCwKKyAgICBFRVBDQVBfTUFYUUNVX1MgICAgICA9IDQsCisgICAgRUVQQ0FQX0hFQVZZX0NMSVBfRU4gPSAweDAyMDAsCisgICAgRUVQQ0FQX0tDX0VOVFJJRVNfTSAgPSAweEYwMDAsCisgICAgRUVQQ0FQX0tDX0VOVFJJRVNfUyAgPSAxMiwKK30gRUVQUk9NX0NBUEFCSUxJVElFUzsKKwordHlwZWRlZiBlbnVtIEFyNTQxNl9SYXRlcyB7CisgICAgcmF0ZTZtYiwgIHJhdGU5bWIsICByYXRlMTJtYiwgcmF0ZTE4bWIsCisgICAgcmF0ZTI0bWIsIHJhdGUzNm1iLCByYXRlNDhtYiwgcmF0ZTU0bWIsCisgICAgcmF0ZTFsLCAgIHJhdGUybCwgICByYXRlMnMsICAgcmF0ZTVfNWwsCisgICAgcmF0ZTVfNXMsIHJhdGUxMWwsICByYXRlMTFzLCAgcmF0ZVhyLAorICAgIHJhdGVIdDIwXzAsIHJhdGVIdDIwXzEsIHJhdGVIdDIwXzIsIHJhdGVIdDIwXzMsCisgICAgcmF0ZUh0MjBfNCwgcmF0ZUh0MjBfNSwgcmF0ZUh0MjBfNiwgcmF0ZUh0MjBfNywKKyAgICByYXRlSHQ0MF8wLCByYXRlSHQ0MF8xLCByYXRlSHQ0MF8yLCByYXRlSHQ0MF8zLAorICAgIHJhdGVIdDQwXzQsIHJhdGVIdDQwXzUsIHJhdGVIdDQwXzYsIHJhdGVIdDQwXzcsCisgICAgcmF0ZUR1cENjaywgcmF0ZUR1cE9mZG0sIHJhdGVFeHRDY2ssIHJhdGVFeHRPZmRtLAorICAgIEFyNTQxNlJhdGVTaXplCit9IEFSNTQxNl9SQVRFUzsKKwordHlwZWRlZiBzdHJ1Y3QgZWVwRmxhZ3MgeworICAgIEFfVUlOVDggIG9wRmxhZ3M7CisgICAgQV9VSU5UOCAgZWVwTWlzYzsKK30gX19BVFRSSUJfUEFDSyBFRVBfRkxBR1M7CisKKyNkZWZpbmUgQVI1NDE2X0NIRUNLU1VNX0xPQ0FUSU9OIChBUjU0MTZfRUVQX1NUQVJUX0xPQyArIDEpCit0eXBlZGVmIHN0cnVjdCBCYXNlRWVwSGVhZGVyIHsKKyAgICBBX1VJTlQxNiAgbGVuZ3RoOworICAgIEFfVUlOVDE2ICBjaGVja3N1bTsKKyAgICBBX1VJTlQxNiAgdmVyc2lvbjsKKyAgICBFRVBfRkxBR1Mgb3BDYXBGbGFnczsKKyAgICBBX1VJTlQxNiAgcmVnRG1uWzJdOworICAgIEFfVUlOVDggICBtYWNBZGRyWzZdOworICAgIEFfVUlOVDggICByeE1hc2s7CisgICAgQV9VSU5UOCAgIHR4TWFzazsKKyAgICBBX1VJTlQxNiAgcmZTaWxlbnQ7CisgICAgQV9VSU5UMTYgIGJsdWVUb290aE9wdGlvbnM7CisgICAgQV9VSU5UMTYgIGRldmljZUNhcDsKKyAgICBBX1VJTlQzMiAgYmluQnVpbGROdW1iZXI7CisgICAgQV9VSU5UOCAgIGRldmljZVR5cGU7CisgICAgQV9VSU5UOCAgIGZ1dHVyZUJhc2VbMzNdOworfSBfX0FUVFJJQl9QQUNLIEJBU0VfRUVQX0hFQURFUjsgLy8gNjQgQgorCit0eXBlZGVmIHN0cnVjdCBzcHVyQ2hhblN0cnVjdCB7CisgICAgQV9VSU5UMTYgc3B1ckNoYW47CisgICAgQV9VSU5UOCAgc3B1clJhbmdlTG93OworICAgIEFfVUlOVDggIHNwdXJSYW5nZUhpZ2g7Cit9IF9fQVRUUklCX1BBQ0sgU1BVUl9DSEFOOworCit0eXBlZGVmIHN0cnVjdCBNb2RhbEVlcEhlYWRlciB7CisgICAgQV9VSU5UMzIgIGFudEN0cmxDaGFpbltBUjU0MTZfTUFYX0NIQUlOU107ICAgICAgIC8vIDEyCisgICAgQV9VSU5UMzIgIGFudEN0cmxDb21tb247ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDQKKyAgICBBX0lOVDggICAgYW50ZW5uYUdhaW5DaFtBUjU0MTZfTUFYX0NIQUlOU107ICAgICAgLy8gMworICAgIEFfVUlOVDggICBzd2l0Y2hTZXR0bGluZzsgICAgICAgICAgICAgICAgICAgICAgICAvLyAxCisgICAgQV9VSU5UOCAgIHR4UnhBdHRlbkNoW0FSNTQxNl9NQVhfQ0hBSU5TXTsgICAgICAgIC8vIDMKKyAgICBBX1VJTlQ4ICAgcnhUeE1hcmdpbkNoW0FSNTQxNl9NQVhfQ0hBSU5TXTsgICAgICAgLy8gMworICAgIEFfSU5UOCAgICBhZGNEZXNpcmVkU2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAvLyAxCisgICAgQV9JTlQ4ICAgIHBnYURlc2lyZWRTaXplOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEKKyAgICBBX1VJTlQ4ICAgeGxuYUdhaW5DaFtBUjU0MTZfTUFYX0NIQUlOU107ICAgICAgICAgLy8gMworICAgIEFfVUlOVDggICB0eEVuZFRvWHBhT2ZmOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxCisgICAgQV9VSU5UOCAgIHR4RW5kVG9SeE9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEKKyAgICBBX1VJTlQ4ICAgdHhGcmFtZVRvWHBhT247ICAgICAgICAgICAgICAgICAgICAgICAgLy8gMQorICAgIEFfVUlOVDggICB0aHJlc2g2MjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxCisgICAgQV9JTlQ4ICAgIG5vaXNlRmxvb3JUaHJlc2hDaFtBUjU0MTZfTUFYX0NIQUlOU107IC8vIDMKKyAgICBBX1VJTlQ4ICAgeHBkR2FpbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMQorICAgIEFfVUlOVDggICB4cGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxCisgICAgQV9JTlQ4ICAgIGlxQ2FsSUNoW0FSNTQxNl9NQVhfQ0hBSU5TXTsgICAgICAgICAgIC8vIDEKKyAgICBBX0lOVDggICAgaXFDYWxRQ2hbQVI1NDE2X01BWF9DSEFJTlNdOyAgICAgICAgICAgLy8gMQorICAgIEFfVUlOVDggICBwZEdhaW5PdmVybGFwOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxCisgICAgQV9VSU5UOCAgIG9iOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEKKyAgICBBX1VJTlQ4ICAgZGI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMQorICAgIEFfVUlOVDggICB4cGFCaWFzTHZsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxCisgICAgQV9VSU5UOCAgIHB3ckRlY3JlYXNlRm9yMkNoYWluOyAgICAgICAgICAgICAgICAgIC8vIDEKKyAgICBBX1VJTlQ4ICAgcHdyRGVjcmVhc2VGb3IzQ2hhaW47ICAgICAgICAgICAgICAgICAgLy8gMSAtPiA0OCBCCisgICAgQV9VSU5UOCAgIHR4RnJhbWVUb0RhdGFTdGFydDsgICAgICAgICAgICAgICAgICAgIC8vIDEKKyAgICBBX1VJTlQ4ICAgdHhGcmFtZVRvUGFPbjsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMQorICAgIEFfVUlOVDggICBodDQwUG93ZXJJbmNGb3JQZGFkYzsgICAgICAgICAgICAgICAgICAvLyAxCisgICAgQV9VSU5UOCAgIGJzd0F0dGVuW0FSNTQxNl9NQVhfQ0hBSU5TXTsgICAgICAgICAgIC8vIDMKKyAgICBBX1VJTlQ4ICAgYnN3TWFyZ2luW0FSNTQxNl9NQVhfQ0hBSU5TXTsgICAgICAgICAgLy8gMworICAgIEFfVUlOVDggICBzd1NldHRsZUh0NDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxCisgICAgQV9VSU5UOCAgIGZ1dHVyZU1vZGFsWzIyXTsgICAgICAgICAgICAgICAgICAgICAgIC8vCisgICAgU1BVUl9DSEFOIHNwdXJDaGFuc1tBUjU0MTZfRUVQUk9NX01PREFMX1NQVVJTXTsgIC8vIDIwIEIKK30gX19BVFRSSUJfUEFDSyBNT0RBTF9FRVBfSEVBREVSOyAgICAgICAgICAgICAgICAgICAgLy8gPT0gMTAwIEIKKwordHlwZWRlZiBzdHJ1Y3QgY2FsRGF0YVBlckZyZXEgeworICAgIEFfVUlOVDggcHdyUGRnW0FSNTQxNl9OVU1fUERfR0FJTlNdW0FSNTQxNl9QRF9HQUlOX0lDRVBUU107CisgICAgQV9VSU5UOCB2cGRQZGdbQVI1NDE2X05VTV9QRF9HQUlOU11bQVI1NDE2X1BEX0dBSU5fSUNFUFRTXTsKK30gX19BVFRSSUJfUEFDSyBDQUxfREFUQV9QRVJfRlJFUTsKKwordHlwZWRlZiBzdHJ1Y3QgQ2FsVGFyZ2V0UG93ZXJMZWdhY3kgeworICAgIEFfVUlOVDggIGJDaGFubmVsOworICAgIEFfVUlOVDggIHRQb3cyeFs0XTsKK30gX19BVFRSSUJfUEFDSyBDQUxfVEFSR0VUX1BPV0VSX0xFRzsKKwordHlwZWRlZiBzdHJ1Y3QgQ2FsVGFyZ2V0UG93ZXJIdCB7CisgICAgQV9VSU5UOCAgYkNoYW5uZWw7CisgICAgQV9VSU5UOCAgdFBvdzJ4WzhdOworfSBfX0FUVFJJQl9QQUNLIENBTF9UQVJHRVRfUE9XRVJfSFQ7CisKKyNpZiBkZWZpbmVkKEFSQ0hfQklHX0VORElBTikgfHwgZGVmaW5lZChCSUdfRU5ESUFOKQordHlwZWRlZiBzdHJ1Y3QgQ2FsQ3RsRWRnZXMgeworICAgIEFfVUlOVDggIGJDaGFubmVsOworICAgIEFfVUlOVDggIGZsYWcgICA6MiwKKyAgICAgICAgICAgICB0UG93ZXIgOjY7Cit9IF9fQVRUUklCX1BBQ0sgQ0FMX0NUTF9FREdFUzsKKyNlbHNlCit0eXBlZGVmIHN0cnVjdCBDYWxDdGxFZGdlcyB7CisgICAgQV9VSU5UOCAgYkNoYW5uZWw7CisgICAgQV9VSU5UOCAgdFBvd2VyIDo2LAorICAgICAgICAgICAgIGZsYWcgICA6MjsKK30gX19BVFRSSUJfUEFDSyBDQUxfQ1RMX0VER0VTOworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IENhbEN0bERhdGEgeworICAgIENBTF9DVExfRURHRVMgIGN0bEVkZ2VzW0FSNTQxNl9NQVhfQ0hBSU5TXVtBUjU0MTZfTlVNX0JBTkRfRURHRVNdOworfSBfX0FUVFJJQl9QQUNLIENBTF9DVExfREFUQTsKKwordHlwZWRlZiBzdHJ1Y3QgYXI1NDE2RWVwcm9tIHsKKyAgICBCQVNFX0VFUF9IRUFERVIgICAgYmFzZUVlcEhlYWRlcjsgICAgICAgICAvLyA2NCBCCisgICAgQV9VSU5UOCAgIGN1c3REYXRhWzY0XTsgICAgICAgICAgICAgICAgICAgLy8gNjQgQgorICAgIE1PREFMX0VFUF9IRUFERVIgICBtb2RhbEhlYWRlclsyXTsgICAgICAgIC8vIDIwMCBCCisgICAgQV9VSU5UOCAgICAgICAgICAgIGNhbEZyZXFQaWVyNUdbQVI1NDE2X05VTV81R19DQUxfUElFUlNdOworICAgIEFfVUlOVDggICAgICAgICAgICBjYWxGcmVxUGllcjJHW0FSNTQxNl9OVU1fMkdfQ0FMX1BJRVJTXTsKKyAgICBDQUxfREFUQV9QRVJfRlJFUSAgY2FsUGllckRhdGE1R1tBUjU0MTZfTUFYX0NIQUlOU11bQVI1NDE2X05VTV81R19DQUxfUElFUlNdOworICAgIENBTF9EQVRBX1BFUl9GUkVRICBjYWxQaWVyRGF0YTJHW0FSNTQxNl9NQVhfQ0hBSU5TXVtBUjU0MTZfTlVNXzJHX0NBTF9QSUVSU107CisgICAgQ0FMX1RBUkdFVF9QT1dFUl9MRUcgY2FsVGFyZ2V0UG93ZXI1R1tBUjU0MTZfTlVNXzVHXzIwX1RBUkdFVF9QT1dFUlNdOworICAgIENBTF9UQVJHRVRfUE9XRVJfSFQgIGNhbFRhcmdldFBvd2VyNUdIVDIwW0FSNTQxNl9OVU1fNUdfMjBfVEFSR0VUX1BPV0VSU107CisgICAgQ0FMX1RBUkdFVF9QT1dFUl9IVCAgY2FsVGFyZ2V0UG93ZXI1R0hUNDBbQVI1NDE2X05VTV81R180MF9UQVJHRVRfUE9XRVJTXTsKKyAgICBDQUxfVEFSR0VUX1BPV0VSX0xFRyBjYWxUYXJnZXRQb3dlckNja1tBUjU0MTZfTlVNXzJHX0NDS19UQVJHRVRfUE9XRVJTXTsKKyAgICBDQUxfVEFSR0VUX1BPV0VSX0xFRyBjYWxUYXJnZXRQb3dlcjJHW0FSNTQxNl9OVU1fMkdfMjBfVEFSR0VUX1BPV0VSU107CisgICAgQ0FMX1RBUkdFVF9QT1dFUl9IVCAgY2FsVGFyZ2V0UG93ZXIyR0hUMjBbQVI1NDE2X05VTV8yR18yMF9UQVJHRVRfUE9XRVJTXTsKKyAgICBDQUxfVEFSR0VUX1BPV0VSX0hUICBjYWxUYXJnZXRQb3dlcjJHSFQ0MFtBUjU0MTZfTlVNXzJHXzQwX1RBUkdFVF9QT1dFUlNdOworICAgIEFfVUlOVDggICAgICAgICAgICBjdGxJbmRleFtBUjU0MTZfTlVNX0NUTFNdOworICAgIENBTF9DVExfREFUQSAgICAgICBjdGxEYXRhW0FSNTQxNl9OVU1fQ1RMU107CisgICAgQV9VSU5UOCAgICAgICAgICAgIHBhZGRpbmc7Cit9IF9fQVRUUklCX1BBQ0sgQVI1NDE2X0VFUFJPTTsKKworI3ByYWdtYSBwYWNrIChwb3ApCisKK3R5cGVkZWYgZW51bSBDb25mb3JtYW5jZVRlc3RMaW1pdHMgeworICAgIEZDQyAgICAgICAgPSAweDEwLAorICAgIE1LSyAgICAgICAgPSAweDQwLAorICAgIEVUU0kgICAgICAgPSAweDMwLAorICAgIFNEX05PX0NUTCAgPSAweEUwLAorICAgIE5PX0NUTCAgICAgPSAweEZGLAorICAgIENUTF9NT0RFX00gPSAweEYsCisgICAgQ1RMXzExQSAgICA9IDAsCisgICAgQ1RMXzExQiAgICA9IDEsCisgICAgQ1RMXzExRyAgICA9IDIsCisgICAgQ1RMX1RVUkJPICA9IDMsCisgICAgQ1RMXzEwOEcgICA9IDQsCisgICAgQ1RMXzJHSFQyMCA9IDUsCisgICAgQ1RMXzVHSFQyMCA9IDYsCisgICAgQ1RMXzJHSFQ0MCA9IDcsCisgICAgQ1RMXzVHSFQ0MCA9IDgsCit9IEFUSF9DVExTOworCisjZW5kaWYgLyogI2lmbmRlZiBfSFBVU0JfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL290dXMuaW5pIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaGFsL290dXMuaW5pCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZWZlYjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9oYWwvb3R1cy5pbmkKQEAgLTAsMCArMSw0MTQgQEAKKy8qIDg2MDIgOiB1cGRhdGUgbWlzbWF0Y2ggcmVnaXN0ZXIgYmV0d2VlbiBORElTIGFuZCBBUlQgKi8KK3N0YXRpYyBjb25zdCB1MzJfdCBhcjU0MTZNb2Rlc1tdWzZdID0geworLyogUmVnaXN0ZXIgICBBLTIwICAgICAgICBBLTIwLzQwICAgICBHLTIwLzQwICAgICBHLTIwICAgICAgICBHLVR1cmJvICAgICovCisgICAgIHsweDk4MDAsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB9LAorICAgICB7MHg5ODA0LCAweDAwMDAwMzAwLCAweDAwMDAwM2M0LCAweDAwMDAwM2M0LCAweDAwMDAwMzAwLCAwfSwKKyAgICAgezB4OTgwOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDk4MGMsIDB4YWQ4NDhlMTksIDB4YWQ4NDhlMTksIDB4YWQ4NDhlMTksIDB4YWQ4NDhlMTksIDB9LAorICAgICB7MHg5ODEwLCAweDdkMTRlMDAwLCAweDdkMTRlMDAwLCAweDdkMTRlMDAwLCAweDdkMTRlMDAwLCAwfSwKKyAgICAgezB4OTgxNCwgMHg5YzBhOWY2YiwgMHg5YzBhOWY2YiwgMHg5YzBhOWY2YiwgMHg5YzBhOWY2YiwgMH0sCisgICAgIHsweDk4MTgsIDB4MDAwMDAwOTAsIDB4MDAwMDAwOTAsIDB4MDAwMDAwOTAsIDB4MDAwMDAwOTAsIDB9LAorICAgICB7MHg5ODFjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OTgyMCwgMHgwMjAyMDIwMCwgMHgwMjAyMDIwMCwgMHgwMjAyMDIwMCwgMHgwMjAyMDIwMCwgMH0sCisgICAgIHsweDk4MjQsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB4MDAwMDBlMGUsIDB9LAorICAgICB7MHg5ODI4LCAweDBhMDIwMDAxLCAweDBhMDIwMDAxLCAweDBhMDIwMDAxLCAweDBhMDIwMDAxLCAwfSwKKyAgICAgezB4OTgyYywgMHgwMDAwYTAwMCwgMHgwMDAwYTAwMCwgMHgwMDAwYTAwMCwgMHgwMDAwYTAwMCwgMH0sCisgICAgIHsweDk4MzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5ODM0LCAweDAwMDAwZTBlLCAweDAwMDAwZTBlLCAweDAwMDAwZTBlLCAweDAwMDAwZTBlLCAwfSwKKyAgICAgezB4OTgzOCwgMHgwMDAwMDAwNywgMHgwMDAwMDAwNywgMHgwMDAwMDAwNywgMHgwMDAwMDAwNywgMH0sCisgICAgIHsweDk4M2MsIDB4MDAyMDA0MDAsIDB4MDAyMDA0MDAsIDB4MDAyMDA0MDAsIDB4MDAyMDA0MDAsIDB9LAorICAgICB7MHg5ODQwLCAweDIwNmEwMDJlLCAweDIwNmEwMDJlLCAweDIwNmEwMDJlLCAweDIwNmEwMDJlLCAwfSwKKyAgICAgezB4OTg0NCwgMHgxMzcyMTYxZSwgMHgxMzcyMWMxZSwgMHgxMzcyMWMyNCwgMHgxMzcyMTZhNCwgMH0sCisgICAgIHsweDk4NDgsIDB4MDAxYTZhNjUsIDB4MDAxYTZhNjUsIDB4MDAxOTdhNjgsIDB4MDAxOTdhNjgsIDB9LAorICAgICB7MHg5ODRjLCAweDEyODQyMzNjLCAweDEyODQyMzNjLCAweDEyODQyMzNjLCAweDEyODQyMzNjLCAwfSwKKyAgICAgezB4OTg1MCwgMHg2YzQ4YjRlNCwgMHg2YzQ4YjRlNCwgMHg2YzQ4YjBlNCwgMHg2YzQ4YjBlNCwgMH0sCisgICAgIHsweDk4NTQsIDB4MDAwMDA4NTksIDB4MDAwMDA4NTksIDB4MDAwMDA4NTksIDB4MDAwMDA4NTksIDB9LAorICAgICB7MHg5ODU4LCAweDdlYzgwZDJlLCAweDdlYzgwZDJlLCAweDdlYzgwZDJlLCAweDdlYzgwZDJlLCAwfSwKKyAgICAgezB4OTg1YywgMHgzMTM5NWM1ZSwgMHgzMTM5NWM1ZSwgMHgzMTM5NWM1ZSwgMHgzMTM5NWM1ZSwgMH0sCisgICAgIHsweDk4NjAsIDB4MDAwNGRkMTAsIDB4MDAwNGRkMTAsIDB4MDAwNGRkMjAsIDB4MDAwNGRkMjAsIDB9LAorICAgICB7MHg5ODY4LCAweDQwOWE0MTkwLCAweDQwOWE0MTkwLCAweDQwOWE0MTkwLCAweDQwOWE0MTkwLCAwfSwKKyAgICAgezB4OTg2YywgMHgwNTBjYjA4MSwgMHgwNTBjYjA4MSwgMHgwNTBjYjA4MSwgMHgwNTBjYjA4MSwgMH0sCisgICAgIHsweDk5MDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5OTA0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OTkwOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDk5MGMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5OTE0LCAweDAwMDAwN2QwLCAweDAwMDAwN2QwLCAweDAwMDAwODk4LCAweDAwMDAwODk4LCAwfSwKKyAgICAgezB4OTkxOCwgMHgwMDAwMDExOCwgMHgwMDAwMDIzMCwgMHgwMDAwMDI2OCwgMHgwMDAwMDEzNCwgMH0sCisgICAgIHsweDk5MWMsIDB4MTAwMDBmZmYsIDB4MTAwMDBmZmYsIDB4MTAwMDBmZmYsIDB4MTAwMDBmZmYsIDB9LAorICAgICB7MHg5OTIwLCAweDA1MTAwODFjLCAweDA1MTAwODFjLCAweDA1MTAwMDFjLCAweDA1MTAwMDFjLCAwfSwKKyAgICAgezB4OTkyNCwgMHhkMDA1OGExNSwgMHhkMDA1OGExNSwgMHhkMDA1OGExNSwgMHhkMDA1OGExNSwgMH0sCisgICAgIHsweDk5MjgsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEsIDB9LAorICAgICB7MHg5OTJjLCAweDAwMDAwMDA0LCAweDAwMDAwMDA0LCAweDAwMDAwMDA0LCAweDAwMDAwMDA0LCAwfSwKKyAgICAgezB4OTkzNCwgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMH0sCisgICAgIHsweDk5MzgsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB9LAorICAgICB7MHg5OTNjLCAweDAwMDAwMDdmLCAweDAwMDAwMDdmLCAweDAwMDAwMDdmLCAweDAwMDAwMDdmLCAwfSwKKyAgICAgezB4OTk0NCwgMHhkZmI4MTAyMCwgMHhkZmI4MTAyMCwgMHhkZmI4MTAyMCwgMHhkZmI4MTAyMCwgMH0sCisgICAgIHsweDk5NDgsIDB4OTI4MGIyMTIsIDB4OTI4MGIyMTIsIDB4OTI4MGIyMTIsIDB4OTI4MGIyMTIsIDB9LAorICAgICB7MHg5OTRjLCAweDAwMDIwMDI4LCAweDAwMDIwMDI4LCAweDAwMDIwMDI4LCAweDAwMDIwMDI4LCAwfSwKKyAgICAgezB4OTk1NCwgMHg1ZDUwZTE4OCwgMHg1ZDUwZTE4OCwgMHg1ZDUwZTE4OCwgMHg1ZDUwZTE4OCwgMH0sCisgICAgIHsweDk5NTgsIDB4MDAwODFmZmYsIDB4MDAwODFmZmYsIDB4MDAwODFmZmYsIDB4MDAwODFmZmYsIDB9LAorICAgICB7MHg5OTYwLCAweDAwMDA5YjQwLCAweDAwMDA5YjQwLCAweDAwMDA5YjQwLCAweDAwMDA5YjQwLCAwfSwKKyAgICAgezB4OTk2NCwgMHgwMDAwMTEyMCwgMHgwMDAwMTEyMCwgMHgwMDAwMTEyMCwgMHgwMDAwMTEyMCwgMH0sCisgICAgIHsweDk5NzAsIDB4MTkwZmI1MTUsIDB4MTkwZmI1MTUsIDB4MTkwZmI1MTUsIDB4MTkwZmI1MTUsIDB9LAorICAgICB7MHg5OTc0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OTk3OCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSwgMH0sCisgICAgIHsweDk5N2MsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5OTgwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OTk4NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDk5ODgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5OThjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OTk5MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDk5OTQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5OTk4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OTk5YywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDk5YTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5OWE0LCAweDAwMDAwMDA3LCAweDAwMDAwMDA3LCAweDAwMDAwMDA3LCAweDAwMDAwMDA3LCAwfSwKKyAgICAgezB4OTlhOCwgMHgwMDFmZmYwMCwgMHgwMDFmZmYwMCwgMHgwMDFmZmYwMCwgMHgwMDFmZmYwMCwgMH0sCisgICAgIHsweDk5YWMsIDB4MDA2ZjAwYzQsIDB4MDA2ZjAwYzQsIDB4MDA2ZjAwYzQsIDB4MDA2ZjAwYzQsIDB9LAorICAgICB7MHg5OWIwLCAweDAzMDUxMDAwLCAweDAzMDUxMDAwLCAweDAzMDUxMDAwLCAweDAzMDUxMDAwLCAwfSwKKyAgICAgezB4OTliNCwgMHgwMDAwMDgyMCwgMHgwMDAwMDgyMCwgMHgwMDAwMDgyMCwgMHgwMDAwMDgyMCwgMH0sCisgICAgIHsweDk5YzAsIDB4MDM4OTE5YmUsIDB4MDM4OTE5YmUsIDB4MDM4OTE5YmUsIDB4MDM4OTE5YmUsIDB9LAorICAgICB7MHg5OWM0LCAweDA2MzM2Zjc3LCAweDA2MzM2Zjc3LCAweDA2MzM2Zjc3LCAweDA2MzM2Zjc3LCAwfSwKKyAgICAgezB4OTljOCwgMHg2MGY2NTMyYywgMHg2MGY2NTMyYywgMHg2MGY2NTMyYywgMHg2MGY2NTMyYywgMH0sCisgICAgIHsweDk5Y2MsIDB4MDhmMTg2YzgsIDB4MDhmMTg2YzgsIDB4MDhmMTg2YzgsIDB4MDhmMTg2YzgsIDB9LAorICAgICB7MHg5OWQwLCAweDAwMDQ2Mzg0LCAweDAwMDQ2Mzg0LCAweDAwMDQ2Mzg0LCAweDAwMDQ2Mzg0LCAwfSwKKyAgICAgezB4OTlkNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDk5ZDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5OWRjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OTllMCwgMHgwMDAwMDIwMCwgMHgwMDAwMDIwMCwgMHgwMDAwMDIwMCwgMHgwMDAwMDIwMCwgMH0sCisgICAgIHsweDk5ZTQsIDB4NjQ2NDY0NjQsIDB4NjQ2NDY0NjQsIDB4NjQ2NDY0NjQsIDB4NjQ2NDY0NjQsIDB9LAorICAgICB7MHg5OWU4LCAweDNjNzg3ODc4LCAweDNjNzg3ODc4LCAweDNjNzg3ODc4LCAweDNjNzg3ODc4LCAwfSwKKyAgICAgezB4OTllYywgMHgwMDAwMDBhYSwgMHgwMDAwMDBhYSwgMHgwMDAwMDBhYSwgMHgwMDAwMDBhYSwgMH0sCisgICAgIHsweDk5ZjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5OWZjLCAweDAwMDAxMDQyLCAweDAwMDAxMDQyLCAweDAwMDAxMDQyLCAweDAwMDAxMDQyLCAwfSwKKyAgICAgezB4OWEwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDlhMDQsIDB4MDAwMDAwNDAsIDB4MDAwMDAwNDAsIDB4MDAwMDAwNDAsIDB4MDAwMDAwNDAsIDB9LAorICAgICB7MHg5YTA4LCAweDAwMDAwMDgwLCAweDAwMDAwMDgwLCAweDAwMDAwMDgwLCAweDAwMDAwMDgwLCAwfSwKKyAgICAgezB4OWEwYywgMHgwMDAwMDFhMSwgMHgwMDAwMDFhMSwgMHgwMDAwMDE0MSwgMHgwMDAwMDE0MSwgMH0sCisgICAgIHsweDlhMTAsIDB4MDAwMDAxZTEsIDB4MDAwMDAxZTEsIDB4MDAwMDAxODEsIDB4MDAwMDAxODEsIDB9LAorICAgICB7MHg5YTE0LCAweDAwMDAwMDIxLCAweDAwMDAwMDIxLCAweDAwMDAwMWMxLCAweDAwMDAwMWMxLCAwfSwKKyAgICAgezB4OWExOCwgMHgwMDAwMDA2MSwgMHgwMDAwMDA2MSwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSwgMH0sCisgICAgIHsweDlhMWMsIDB4MDAwMDAxNjgsIDB4MDAwMDAxNjgsIDB4MDAwMDAwNDEsIDB4MDAwMDAwNDEsIDB9LAorICAgICB7MHg5YTIwLCAweDAwMDAwMWE4LCAweDAwMDAwMWE4LCAweDAwMDAwMWE4LCAweDAwMDAwMWE4LCAwfSwKKyAgICAgezB4OWEyNCwgMHgwMDAwMDFlOCwgMHgwMDAwMDFlOCwgMHgwMDAwMDFlOCwgMHgwMDAwMDFlOCwgMH0sCisgICAgIHsweDlhMjgsIDB4MDAwMDAwMjgsIDB4MDAwMDAwMjgsIDB4MDAwMDAwMjgsIDB4MDAwMDAwMjgsIDB9LAorICAgICB7MHg5YTJjLCAweDAwMDAwMDY4LCAweDAwMDAwMDY4LCAweDAwMDAwMDY4LCAweDAwMDAwMDY4LCAwfSwKKyAgICAgezB4OWEzMCwgMHgwMDAwMDE4OSwgMHgwMDAwMDE4OSwgMHgwMDAwMDBhOCwgMHgwMDAwMDBhOCwgMH0sCisgICAgIHsweDlhMzQsIDB4MDAwMDAxYzksIDB4MDAwMDAxYzksIDB4MDAwMDAxNjksIDB4MDAwMDAxNjksIDB9LAorICAgICB7MHg5YTM4LCAweDAwMDAwMDA5LCAweDAwMDAwMDA5LCAweDAwMDAwMWE5LCAweDAwMDAwMWE5LCAwfSwKKyAgICAgezB4OWEzYywgMHgwMDAwMDA0OSwgMHgwMDAwMDA0OSwgMHgwMDAwMDFlOSwgMHgwMDAwMDFlOSwgMH0sCisgICAgIHsweDlhNDAsIDB4MDAwMDAwODksIDB4MDAwMDAwODksIDB4MDAwMDAwMjksIDB4MDAwMDAwMjksIDB9LAorICAgICB7MHg5YTQ0LCAweDAwMDAwMTcwLCAweDAwMDAwMTcwLCAweDAwMDAwMDY5LCAweDAwMDAwMDY5LCAwfSwKKyAgICAgezB4OWE0OCwgMHgwMDAwMDFiMCwgMHgwMDAwMDFiMCwgMHgwMDAwMDE5MCwgMHgwMDAwMDE5MCwgMH0sCisgICAgIHsweDlhNGMsIDB4MDAwMDAxZjAsIDB4MDAwMDAxZjAsIDB4MDAwMDAxZDAsIDB4MDAwMDAxZDAsIDB9LAorICAgICB7MHg5YTUwLCAweDAwMDAwMDMwLCAweDAwMDAwMDMwLCAweDAwMDAwMDEwLCAweDAwMDAwMDEwLCAwfSwKKyAgICAgezB4OWE1NCwgMHgwMDAwMDA3MCwgMHgwMDAwMDA3MCwgMHgwMDAwMDA1MCwgMHgwMDAwMDA1MCwgMH0sCisgICAgIHsweDlhNTgsIDB4MDAwMDAxOTEsIDB4MDAwMDAxOTEsIDB4MDAwMDAwOTAsIDB4MDAwMDAwOTAsIDB9LAorICAgICB7MHg5YTVjLCAweDAwMDAwMWQxLCAweDAwMDAwMWQxLCAweDAwMDAwMTUxLCAweDAwMDAwMTUxLCAwfSwKKyAgICAgezB4OWE2MCwgMHgwMDAwMDAxMSwgMHgwMDAwMDAxMSwgMHgwMDAwMDE5MSwgMHgwMDAwMDE5MSwgMH0sCisgICAgIHsweDlhNjQsIDB4MDAwMDAwNTEsIDB4MDAwMDAwNTEsIDB4MDAwMDAxZDEsIDB4MDAwMDAxZDEsIDB9LAorICAgICB7MHg5YTY4LCAweDAwMDAwMDkxLCAweDAwMDAwMDkxLCAweDAwMDAwMDExLCAweDAwMDAwMDExLCAwfSwKKyAgICAgezB4OWE2YywgMHgwMDAwMDFiOCwgMHgwMDAwMDFiOCwgMHgwMDAwMDA1MSwgMHgwMDAwMDA1MSwgMH0sCisgICAgIHsweDlhNzAsIDB4MDAwMDAxZjgsIDB4MDAwMDAxZjgsIDB4MDAwMDAxOTgsIDB4MDAwMDAxOTgsIDB9LAorICAgICB7MHg5YTc0LCAweDAwMDAwMDM4LCAweDAwMDAwMDM4LCAweDAwMDAwMWQ4LCAweDAwMDAwMWQ4LCAwfSwKKyAgICAgezB4OWE3OCwgMHgwMDAwMDA3OCwgMHgwMDAwMDA3OCwgMHgwMDAwMDAxOCwgMHgwMDAwMDAxOCwgMH0sCisgICAgIHsweDlhN2MsIDB4MDAwMDAxOTksIDB4MDAwMDAxOTksIDB4MDAwMDAwNTgsIDB4MDAwMDAwNTgsIDB9LAorICAgICB7MHg5YTgwLCAweDAwMDAwMWQ5LCAweDAwMDAwMWQ5LCAweDAwMDAwMDk4LCAweDAwMDAwMDk4LCAwfSwKKyAgICAgezB4OWE4NCwgMHgwMDAwMDAxOSwgMHgwMDAwMDAxOSwgMHgwMDAwMDE1OSwgMHgwMDAwMDE1OSwgMH0sCisgICAgIHsweDlhODgsIDB4MDAwMDAwNTksIDB4MDAwMDAwNTksIDB4MDAwMDAxOTksIDB4MDAwMDAxOTksIDB9LAorICAgICB7MHg5YThjLCAweDAwMDAwMDk5LCAweDAwMDAwMDk5LCAweDAwMDAwMWQ5LCAweDAwMDAwMWQ5LCAwfSwKKyAgICAgezB4OWE5MCwgMHgwMDAwMDBkOSwgMHgwMDAwMDBkOSwgMHgwMDAwMDAxOSwgMHgwMDAwMDAxOSwgMH0sCisgICAgIHsweDlhOTQsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwNTksIDB4MDAwMDAwNTksIDB9LAorICAgICB7MHg5YTk4LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMDk5LCAweDAwMDAwMDk5LCAwfSwKKyAgICAgezB4OWE5YywgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBkOSwgMHgwMDAwMDBkOSwgMH0sCisgICAgIHsweDlhYTAsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB9LAorICAgICB7MHg5YWE0LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAwfSwKKyAgICAgezB4OWFhOCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMH0sCisgICAgIHsweDlhYWMsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB9LAorICAgICB7MHg5YWIwLCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAwfSwKKyAgICAgezB4OWFiNCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMH0sCisgICAgIHsweDlhYjgsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB9LAorICAgICB7MHg5YWJjLCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAwfSwKKyAgICAgezB4OWFjMCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMH0sCisgICAgIHsweDlhYzQsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB9LAorICAgICB7MHg5YWM4LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAwfSwKKyAgICAgezB4OWFjYywgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMH0sCisgICAgIHsweDlhZDAsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB9LAorICAgICB7MHg5YWQ0LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAwfSwKKyAgICAgezB4OWFkOCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMH0sCisgICAgIHsweDlhZGMsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB9LAorICAgICB7MHg5YWUwLCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAwfSwKKyAgICAgezB4OWFlNCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMH0sCisgICAgIHsweDlhZTgsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB9LAorICAgICB7MHg5YWVjLCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAwfSwKKyAgICAgezB4OWFmMCwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMH0sCisgICAgIHsweDlhZjQsIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB4MDAwMDAwZjksIDB9LAorICAgICB7MHg5YWY4LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAweDAwMDAwMGY5LCAwfSwKKyAgICAgezB4OWFmYywgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMHgwMDAwMDBmOSwgMH0sCisgICAgIHsweDliMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5YjA0LCAweDAwMDAwMDAxLCAweDAwMDAwMDAxLCAweDAwMDAwMDAxLCAweDAwMDAwMDAxLCAwfSwKKyAgICAgezB4OWIwOCwgMHgwMDAwMDAwMiwgMHgwMDAwMDAwMiwgMHgwMDAwMDAwMiwgMHgwMDAwMDAwMiwgMH0sCisgICAgIHsweDliMGMsIDB4MDAwMDAwMDMsIDB4MDAwMDAwMDMsIDB4MDAwMDAwMDMsIDB4MDAwMDAwMDMsIDB9LAorICAgICB7MHg5YjEwLCAweDAwMDAwMDA0LCAweDAwMDAwMDA0LCAweDAwMDAwMDA0LCAweDAwMDAwMDA0LCAwfSwKKyAgICAgezB4OWIxNCwgMHgwMDAwMDAwNSwgMHgwMDAwMDAwNSwgMHgwMDAwMDAwNSwgMHgwMDAwMDAwNSwgMH0sCisgICAgIHsweDliMTgsIDB4MDAwMDAwMDgsIDB4MDAwMDAwMDgsIDB4MDAwMDAwMDgsIDB4MDAwMDAwMDgsIDB9LAorICAgICB7MHg5YjFjLCAweDAwMDAwMDA5LCAweDAwMDAwMDA5LCAweDAwMDAwMDA5LCAweDAwMDAwMDA5LCAwfSwKKyAgICAgezB4OWIyMCwgMHgwMDAwMDAwYSwgMHgwMDAwMDAwYSwgMHgwMDAwMDAwYSwgMHgwMDAwMDAwYSwgMH0sCisgICAgIHsweDliMjQsIDB4MDAwMDAwMGIsIDB4MDAwMDAwMGIsIDB4MDAwMDAwMGIsIDB4MDAwMDAwMGIsIDB9LAorICAgICB7MHg5YjI4LCAweDAwMDAwMDBjLCAweDAwMDAwMDBjLCAweDAwMDAwMDBjLCAweDAwMDAwMDBjLCAwfSwKKyAgICAgezB4OWIyYywgMHgwMDAwMDAwZCwgMHgwMDAwMDAwZCwgMHgwMDAwMDAwZCwgMHgwMDAwMDAwZCwgMH0sCisgICAgIHsweDliMzAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMTAsIDB9LAorICAgICB7MHg5YjM0LCAweDAwMDAwMDExLCAweDAwMDAwMDExLCAweDAwMDAwMDExLCAweDAwMDAwMDExLCAwfSwKKyAgICAgezB4OWIzOCwgMHgwMDAwMDAxMiwgMHgwMDAwMDAxMiwgMHgwMDAwMDAxMiwgMHgwMDAwMDAxMiwgMH0sCisgICAgIHsweDliM2MsIDB4MDAwMDAwMTMsIDB4MDAwMDAwMTMsIDB4MDAwMDAwMTMsIDB4MDAwMDAwMTMsIDB9LAorICAgICB7MHg5YjQwLCAweDAwMDAwMDE0LCAweDAwMDAwMDE0LCAweDAwMDAwMDE0LCAweDAwMDAwMDE0LCAwfSwKKyAgICAgezB4OWI0NCwgMHgwMDAwMDAxNSwgMHgwMDAwMDAxNSwgMHgwMDAwMDAxNSwgMHgwMDAwMDAxNSwgMH0sCisgICAgIHsweDliNDgsIDB4MDAwMDAwMTgsIDB4MDAwMDAwMTgsIDB4MDAwMDAwMTgsIDB4MDAwMDAwMTgsIDB9LAorICAgICB7MHg5YjRjLCAweDAwMDAwMDE5LCAweDAwMDAwMDE5LCAweDAwMDAwMDE5LCAweDAwMDAwMDE5LCAwfSwKKyAgICAgezB4OWI1MCwgMHgwMDAwMDAxYSwgMHgwMDAwMDAxYSwgMHgwMDAwMDAxYSwgMHgwMDAwMDAxYSwgMH0sCisgICAgIHsweDliNTQsIDB4MDAwMDAwMWIsIDB4MDAwMDAwMWIsIDB4MDAwMDAwMWIsIDB4MDAwMDAwMWIsIDB9LAorICAgICB7MHg5YjU4LCAweDAwMDAwMDFjLCAweDAwMDAwMDFjLCAweDAwMDAwMDFjLCAweDAwMDAwMDFjLCAwfSwKKyAgICAgezB4OWI1YywgMHgwMDAwMDAxZCwgMHgwMDAwMDAxZCwgMHgwMDAwMDAxZCwgMHgwMDAwMDAxZCwgMH0sCisgICAgIHsweDliNjAsIDB4MDAwMDAwMjAsIDB4MDAwMDAwMjAsIDB4MDAwMDAwMjAsIDB4MDAwMDAwMjAsIDB9LAorICAgICB7MHg5YjY0LCAweDAwMDAwMDIxLCAweDAwMDAwMDIxLCAweDAwMDAwMDIxLCAweDAwMDAwMDIxLCAwfSwKKyAgICAgezB4OWI2OCwgMHgwMDAwMDAyMiwgMHgwMDAwMDAyMiwgMHgwMDAwMDAyMiwgMHgwMDAwMDAyMiwgMH0sCisgICAgIHsweDliNmMsIDB4MDAwMDAwMjMsIDB4MDAwMDAwMjMsIDB4MDAwMDAwMjMsIDB4MDAwMDAwMjMsIDB9LAorICAgICB7MHg5YjcwLCAweDAwMDAwMDI0LCAweDAwMDAwMDI0LCAweDAwMDAwMDI0LCAweDAwMDAwMDI0LCAwfSwKKyAgICAgezB4OWI3NCwgMHgwMDAwMDAyNSwgMHgwMDAwMDAyNSwgMHgwMDAwMDAyNSwgMHgwMDAwMDAyNSwgMH0sCisgICAgIHsweDliNzgsIDB4MDAwMDAwMjgsIDB4MDAwMDAwMjgsIDB4MDAwMDAwMjgsIDB4MDAwMDAwMjgsIDB9LAorICAgICB7MHg5YjdjLCAweDAwMDAwMDI5LCAweDAwMDAwMDI5LCAweDAwMDAwMDI5LCAweDAwMDAwMDI5LCAwfSwKKyAgICAgezB4OWI4MCwgMHgwMDAwMDAyYSwgMHgwMDAwMDAyYSwgMHgwMDAwMDAyYSwgMHgwMDAwMDAyYSwgMH0sCisgICAgIHsweDliODQsIDB4MDAwMDAwMmIsIDB4MDAwMDAwMmIsIDB4MDAwMDAwMmIsIDB4MDAwMDAwMmIsIDB9LAorICAgICB7MHg5Yjg4LCAweDAwMDAwMDJjLCAweDAwMDAwMDJjLCAweDAwMDAwMDJjLCAweDAwMDAwMDJjLCAwfSwKKyAgICAgezB4OWI4YywgMHgwMDAwMDAyZCwgMHgwMDAwMDAyZCwgMHgwMDAwMDAyZCwgMHgwMDAwMDAyZCwgMH0sCisgICAgIHsweDliOTAsIDB4MDAwMDAwMzAsIDB4MDAwMDAwMzAsIDB4MDAwMDAwMzAsIDB4MDAwMDAwMzAsIDB9LAorICAgICB7MHg5Yjk0LCAweDAwMDAwMDMxLCAweDAwMDAwMDMxLCAweDAwMDAwMDMxLCAweDAwMDAwMDMxLCAwfSwKKyAgICAgezB4OWI5OCwgMHgwMDAwMDAzMiwgMHgwMDAwMDAzMiwgMHgwMDAwMDAzMiwgMHgwMDAwMDAzMiwgMH0sCisgICAgIHsweDliOWMsIDB4MDAwMDAwMzMsIDB4MDAwMDAwMzMsIDB4MDAwMDAwMzMsIDB4MDAwMDAwMzMsIDB9LAorICAgICB7MHg5YmEwLCAweDAwMDAwMDM0LCAweDAwMDAwMDM0LCAweDAwMDAwMDM0LCAweDAwMDAwMDM0LCAwfSwKKyAgICAgezB4OWJhNCwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMH0sCisgICAgIHsweDliYTgsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB9LAorICAgICB7MHg5YmFjLCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAwfSwKKyAgICAgezB4OWJiMCwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMH0sCisgICAgIHsweDliYjQsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB9LAorICAgICB7MHg5YmI4LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAwfSwKKyAgICAgezB4OWJiYywgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMH0sCisgICAgIHsweDliYzAsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB9LAorICAgICB7MHg5YmM0LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAwfSwKKyAgICAgezB4OWJjOCwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMH0sCisgICAgIHsweDliY2MsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB9LAorICAgICB7MHg5YmQwLCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAwfSwKKyAgICAgezB4OWJkNCwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMH0sCisgICAgIHsweDliZDgsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB9LAorICAgICB7MHg5YmRjLCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAwfSwKKyAgICAgezB4OWJlMCwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMH0sCisgICAgIHsweDliZTQsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB9LAorICAgICB7MHg5YmU4LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAwfSwKKyAgICAgezB4OWJlYywgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMHgwMDAwMDAzNSwgMH0sCisgICAgIHsweDliZjAsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB4MDAwMDAwMzUsIDB9LAorICAgICB7MHg5YmY0LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAweDAwMDAwMDM1LCAwfSwKKyAgICAgezB4OWJmOCwgMHgwMDAwMDAxMCwgMHgwMDAwMDAxMCwgMHgwMDAwMDAxMCwgMHgwMDAwMDAxMCwgMH0sCisgICAgIHsweDliZmMsIDB4MDAwMDAwMWEsIDB4MDAwMDAwMWEsIDB4MDAwMDAwMWEsIDB4MDAwMDAwMWEsIDB9LAorICAgICB7MHg5YzAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OWMwYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDljMTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5YzE0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OWMxOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDljMWMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5YzIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OWMyNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDljMjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5YzJjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OWMzMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDljMzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5YzM4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OWMzYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDljZjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHg5Y2Y0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4OWNmOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweDljZmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHhhMjAwLCAweDAwMDAwMDA4LCAweDAwMDAwMDA4LCAweDAwMDAwMDBlLCAweDAwMDAwMDBlLCAwfSwKKyAgICAgezB4YTIwNCwgMHgwMDAwMDQ0MCwgMHgwMDAwMDQ0MCwgMHgwMDAwMDQ0MCwgMHgwMDAwMDQ0MCwgMH0sCisgICAgIHsweGEyMDgsIDB4ZDZiZTQ3ODgsIDB4ZDZiZTQ3ODgsIDB4ZDAzZTQ3ODgsIDB4ZDAzZTQ3ODgsIDB9LAorICAgICB7MHhhMjBjLCAweDAxMmU4MTYwLCAweDAxMmU4MTYwLCAweDAxMmE4MTYwLCAweDAxMmE4MTYwLCAwfSwKKyAgICAgezB4YTIxMCwgMHg0MDgwNjMzMywgMHg0MDgwNjMzMywgMHg0MDgwNjMzMywgMHg0MDgwNjMzMywgMH0sCisgICAgIHsweGEyMTQsIDB4MDAxMDZjMTAsIDB4MDAxMDZjMTAsIDB4MDAxMDZjMTAsIDB4MDAxMDZjMTAsIDB9LAorICAgICB7MHhhMjE4LCAweDAwOWM0MDYwLCAweDAwOWM0MDYwLCAweDAwOWM0MDYwLCAweDAwOWM0MDYwLCAwfSwKKyAgICAgezB4YTIxYywgMHgxODgzODAwYSwgMHgxODgzODAwYSwgMHgxODgzODAwYSwgMHgxODgzODAwYSwgMH0sCisgICAgIHsweGEyMjAsIDB4MDE4ODMwYzYsIDB4MDE4ODMwYzYsIDB4MDE4ODMwYzYsIDB4MDE4ODMwYzYsIDB9LAorICAgICB7MHhhMjI0LCAweDAwMDAwNDAwLCAweDAwMDAwNDAwLCAweDAwMDAwNDAwLCAweDAwMDAwNDAwLCAwfSwKKyAgICAgezB4YTIyOCwgMHgwMDAwMDliNSwgMHgwMDAwMDliNSwgMHgwMDAwMDliNSwgMHgwMDAwMDliNSwgMH0sCisgICAgIHsweGEyMmMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHhhMjMwLCAweDAwMDAwMTA4LCAweDAwMDAwMjEwLCAweDAwMDAwMjEwLCAweDAwMDAwMTA4LCAwfSwKKyAgICAgezB4YTIzNCwgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMH0sCisgICAgIHsweGEyMzgsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB9LAorICAgICB7MHhhMjNjLCAweDEzYzg4OWFmLCAweDEzYzg4OWFmLCAweDEzYzg4OWFmLCAweDEzYzg4OWFmLCAwfSwKKyAgICAgezB4YTI0MCwgMHgzODQ5MGEyMCwgMHgzODQ5MGEyMCwgMHgzODQ5MGEyMCwgMHgzODQ5MGEyMCwgMH0sCisgICAgIHsweGEyNDQsIDB4MDAwMDdiYjYsIDB4MDAwMDdiYjYsIDB4MDAwMDdiYjYsIDB4MDAwMDdiYjYsIDB9LAorICAgICB7MHhhMjQ4LCAweDBmZmYzZmZjLCAweDBmZmYzZmZjLCAweDBmZmYzZmZjLCAweDBmZmYzZmZjLCAwfSwKKyAgICAgezB4YTI0YywgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSwgMH0sCisgICAgIHsweGEyNTAsIDB4MDAwMGEwMDAsIDB4MDAwMGEwMDAsIDB4MDAwMGEwMDAsIDB4MDAwMGEwMDAsIDB9LAorICAgICB7MHhhMjU0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4YTI1OCwgMHgwY2M3NTM4MCwgMHgwY2M3NTM4MCwgMHgwY2M3NTM4MCwgMHgwY2M3NTM4MCwgMH0sCisgICAgIHsweGEyNWMsIDB4MGYwZjBmMDEsIDB4MGYwZjBmMDEsIDB4MGYwZjBmMDEsIDB4MGYwZjBmMDEsIDB9LAorICAgICB7MHhhMjYwLCAweGRmYTkxZjAxLCAweGRmYTkxZjAxLCAweGRmYTkxZjAxLCAweGRmYTkxZjAxLCAwfSwKKyAgICAgezB4YTI2NCwgMHgwMDQxOGExMSwgMHgwMDQxOGExMSwgMHgwMDQxOGExMSwgMHgwMDQxOGExMSwgMH0sCisgICAgIHsweGEyNjgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHhhMjZjLCAweDA5MjQ5MTI2LCAweDA5MjQ5MTI2LCAweDA5MjQ5MTI2LCAweDA5MjQ5MTI2LCAwfSwKKyAgICAgezB4YTI3NCwgMHgwYTFhOWNhYSwgMHgwYTFhOWNhYSwgMHgwYTFhN2NhYSwgMHgwYTFhN2NhYSwgMH0sCisgICAgIHsweGEyNzgsIDB4MWNlNzM5Y2UsIDB4MWNlNzM5Y2UsIDB4MWNlNzM5Y2UsIDB4MWNlNzM5Y2UsIDB9LAorICAgICB7MHhhMjdjLCAweDA1MTcwMWNlLCAweDA1MTcwMWNlLCAweDA1MTcwMWNlLCAweDA1MTcwMWNlLCAwfSwKKyAgICAgezB4YTMwMCwgMHgxODAxMDAwMCwgMHgxODAxMDAwMCwgMHgxODAxMDAwMCwgMHgxODAxMDAwMCwgMH0sCisgICAgIHsweGEzMDQsIDB4MzAwMzI2MDIsIDB4MzAwMzI2MDIsIDB4MmUwMzI0MDIsIDB4MmUwMzI0MDIsIDB9LAorICAgICB7MHhhMzA4LCAweDQ4MDczZTA2LCAweDQ4MDczZTA2LCAweDRhMGEzYzA2LCAweDRhMGEzYzA2LCAwfSwKKyAgICAgezB4YTMwYywgMHg1NjBiNGMwYSwgMHg1NjBiNGMwYSwgMHg2MjFhNTQwYiwgMHg2MjFhNTQwYiwgMH0sCisgICAgIHsweGEzMTAsIDB4NjQxYTYwMGYsIDB4NjQxYTYwMGYsIDB4NzY0ZjZjMWIsIDB4NzY0ZjZjMWIsIDB9LAorICAgICB7MHhhMzE0LCAweDdhNGY2ZTFiLCAweDdhNGY2ZTFiLCAweDg0NWI3YTVhLCAweDg0NWI3YTVhLCAwfSwKKyAgICAgezB4YTMxOCwgMHg4YzViN2U1YSwgMHg4YzViN2U1YSwgMHg5NTBmOGNjZiwgMHg5NTBmOGNjZiwgMH0sCisgICAgIHsweGEzMWMsIDB4OWQwZjk2Y2YsIDB4OWQwZjk2Y2YsIDB4YTVjZjliNGYsIDB4YTVjZjliNGYsIDB9LAorICAgICB7MHhhMzIwLCAweGI1MWZhNjlmLCAweGI1MWZhNjlmLCAweGJkZGZhZjFmLCAweGJkZGZhZjFmLCAwfSwKKyAgICAgezB4YTMyNCwgMHhjYjNmYmQwNywgMHhjYjNmYmNiZiwgMHhkMWZmYzkzZiwgMHhkMWZmYzkzZiwgMH0sCisgICAgIHsweGEzMjgsIDB4MDAwMGQ3YmYsIDB4MDAwMGQ3YmYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHhhMzJjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4YTMzMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweGEzMzQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHhhMzM4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4YTMzYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweGEzNDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHhhMzQ0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4YTM0OCwgMHgzZmZmZmZmZiwgMHgzZmZmZmZmZiwgMHgzZmZmZmZmZiwgMHgzZmZmZmZmZiwgMH0sCisgICAgIHsweGEzNGMsIDB4M2ZmZmZmZmYsIDB4M2ZmZmZmZmYsIDB4M2ZmZmZmZmYsIDB4M2ZmZmZmZmYsIDB9LAorICAgICB7MHhhMzUwLCAweDNmZmZmZmZmLCAweDNmZmZmZmZmLCAweDNmZmZmZmZmLCAweDNmZmZmZmZmLCAwfSwKKyAgICAgezB4YTM1NCwgMHgwMDAzZmZmZiwgMHgwMDAzZmZmZiwgMHgwMDAzZmZmZiwgMHgwMDAzZmZmZiwgMH0sCisgICAgIHsweGEzNTgsIDB4NzlhOGFhMWYsIDB4NzlhOGFhMWYsIDB4NzlhOGFhMWYsIDB4NzlhOGFhMWYsIDB9LAorICAgICB7MHhhMzg4LCAweDA4MDAwMDAwLCAweDA4MDAwMDAwLCAweDA4MDAwMDAwLCAweDA4MDAwMDAwLCAwfSwKKyAgICAgezB4YTM4YywgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMH0sCisgICAgIHsweGEzOTAsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB9LAorICAgICB7MHhhMzk0LCAweDFjZTczOWNlLCAweDFjZTczOWNlLCAweDFjZTczOWNlLCAweDFjZTczOWNlLCAwfSwKKyAgICAgezB4YTM5OCwgMHgwMDAwMDFjZSwgMHgwMDAwMDFjZSwgMHgwMDAwMDFjZSwgMHgwMDAwMDFjZSwgMH0sCisgICAgIHsweGEzOWMsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMDcsIDB9LAorICAgICB7MHhhM2EwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4YTNhNCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweGEzYTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHhhM2FjLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4YTNiMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweGEzYjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHhhM2I4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4YTNiYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweGEzYzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHhhM2M0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfSwKKyAgICAgezB4YTNjOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0sCisgICAgIHsweGEzY2MsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB4M2YzZjNmM2YsIDB9LAorICAgICB7MHhhM2QwLCAweDNmM2YzZjNmLCAweDNmM2YzZjNmLCAweDNmM2YzZjNmLCAweDNmM2YzZjNmLCAwfSwKKyAgICAgezB4YTNkNCwgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMHgzZjNmM2YzZiwgMH0sCisgICAgIHsweGEzZDgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9LAorICAgICB7MHhhM2RjLCAweDFjZTczOWNlLCAweDFjZTczOWNlLCAweDFjZTczOWNlLCAweDFjZTczOWNlLCAwfSwKKyAgICAgezB4YTNlMCwgMHgwMDAwMDBjMCwgMHgwMDAwMDBjMCwgMHgwMDAwMDBjMCwgMHgwMDAwMDBjMCwgMH0sCisgICAgIHsweGE4NDgsIDB4MDAxODBhNjUsIDB4MDAxODBhNjUsIDB4MDAxODBhNjgsIDB4MDAxODBhNjgsIDB9LAorICAgICB7MHhhOTIwLCAweDA1MTAwMDFjLCAweDA1MTAwMDFjLCAweDA1MTAwMDFjLCAweDA1MTAwMDFjLCAwfSwKKyAgICAgezB4YTk2MCwgMHgwMDAwOWI0MCwgMHgwMDAwOWI0MCwgMHgwMDAwOWI0MCwgMHgwMDAwOWI0MCwgMH0sCisgICAgIHsweGIyMGMsIDB4MDEyZTgxNjAsIDB4MDEyZTgxNjAsIDB4MDEyYTgxNjAsIDB4MDEyYTgxNjAsIDB9LAorICAgICB7MHhiMjZjLCAweDA5MjQ5MTI2LCAweDA5MjQ5MTI2LCAweDA5MjQ5MTI2LCAweDA5MjQ5MTI2LCAwfSwKKyAgICAgezB4Yjg0OCwgMHgwMDE4MGE2NSwgMHgwMDE4MGE2NSwgMHgwMDE4MGE2OCwgMHgwMDE4MGE2OCwgMH0sCisgICAgIHsweGI5MjAsIDB4MDUxMDAwMWMsIDB4MDUxMDAwMWMsIDB4MDUxMDAwMWMsIDB4MDUxMDAwMWMsIDB9LAorICAgICB7MHhiOTYwLCAweDAwMDA5YjQwLCAweDAwMDA5YjQwLCAweDAwMDA5YjQwLCAweDAwMDA5YjQwLCAwfSwKKyAgICAgezB4YzIwYywgMHgwMTJlODE2MCwgMHgwMTJlODE2MCwgMHgwMTJhODE2MCwgMHgwMTJhODE2MCwgMH0sCisgICAgIHsweGMyNmMsIDB4MDkyNDkxMjYsIDB4MDkyNDkxMjYsIDB4MDkyNDkxMjYsIDB4MDkyNDkxMjYsIDB9LAorICAgICAvL3sweGM4NjQsIDB4MDAwMWNlMDAsIDB4MDAwMWNlMDAsIDB4MDAwMWNlMDAsIDB4MDAwMWNlMDAsIDB9LAorICAgICB7MHhjODY0LCAweDAwMDFjNjAwLCAweDAwMDFjNjAwLCAweDAwMDFjNjAwLCAweDAwMDFjNjAwLCAwfSwKKyAgICAgezB4Yzk1YywgMHgwMDRiNmE4ZSwgMHgwMDRiNmE4ZSwgMHgwMDRiNmE4ZSwgMHgwMDRiNmE4ZSwgMH0sCisgICAgIHsweGM5NjgsIDB4MDAwMDAzY2UsIDB4MDAwMDAzY2UsIDB4MDAwMDAzY2UsIDB4MDAwMDAzY2UsIDB9LAorICAgICB7MHhjOWJjLCAweDAwMTgxNDAwLCAweDAwMTgxNDAwLCAweDAwMTgxNDAwLCAweDAwMTgxNDAwLCAwfSwKKyAgICAgezB4ZDI3MCwgMHgwMDgyMDgyMCwgMHgwMDgyMDgyMCwgMHgwMDgyMDgyMCwgMHgwMDgyMDgyMCwgMH0sCisgICAgIHsweGQzNWMsIDB4MDY2YzQyMGYsIDB4MDY2YzQyMGYsIDB4MDY2YzQyMGYsIDB4MDY2YzQyMGYsIDB9LAorICAgICB7MHhkMzYwLCAweDBmMjgyMjA3LCAweDBmMjgyMjA3LCAweDBmMjgyMjA3LCAweDBmMjgyMjA3LCAwfSwKKyAgICAgezB4ZDM2NCwgMHgxNzYwMTY4NSwgMHgxNzYwMTY4NSwgMHgxNzYwMTY4NSwgMHgxNzYwMTY4NSwgMH0sCisgICAgIHsweGQzNjgsIDB4MWY4MDExMDQsIDB4MWY4MDExMDQsIDB4MWY4MDExMDQsIDB4MWY4MDExMDQsIDB9LAorICAgICB7MHhkMzZjLCAweDM3YTAwYzAzLCAweDM3YTAwYzAzLCAweDM3YTAwYzAzLCAweDM3YTAwYzAzLCAwfSwKKyAgICAgezB4ZDM3MCwgMHgzZmM0MDg4MywgMHgzZmM0MDg4MywgMHgzZmM0MDg4MywgMHgzZmM0MDg4MywgMH0sCisgICAgIHsweGQzNzQsIDB4NTdjMDA4MDMsIDB4NTdjMDA4MDMsIDB4NTdjMDA4MDMsIDB4NTdjMDA4MDMsIDB9LAorICAgICB7MHhkMzc4LCAweDVmZDgwNjgyLCAweDVmZDgwNjgyLCAweDVmZDgwNjgyLCAweDVmZDgwNjgyLCAwfSwKKyAgICAgezB4ZDM3YywgMHg3ZmUwMDQ4MiwgMHg3ZmUwMDQ4MiwgMHg3ZmUwMDQ4MiwgMHg3ZmUwMDQ4MiwgMH0sCisgICAgIHsweGQzODAsIDB4N2YzYzdiYmEsIDB4N2YzYzdiYmEsIDB4N2YzYzdiYmEsIDB4N2YzYzdiYmEsIDB9LAorICAgICB7MHhkMzg0LCAweGYzMzA3ZmYwLCAweGYzMzA3ZmYwLCAweGYzMzA3ZmYwLCAweGYzMzA3ZmYwLCAwfQorfTsKKworCitzdGF0aWMgY29uc3QgdTMyX3Qgb3R1c0JhbmtbXVszXSA9IHsKKyAgICAgLy8jIGJhbmsgMAorICAgICB7MHg5OGIwLCAgMHgxZTU3OTVlNSwgIDB4MWU1Nzk1ZTV9LAorICAgICB7MHg5OGUwLCAgMHgwMjAwODAyMCwgIDB4MDIwMDgwMjB9LAorICAgICAvLyMgYmFuayAxCisgICAgIHsweDk4YjAsICAweDAyMTA4NDIxLCAgMHgwMjEwODQyMX0sCisgICAgIHsweDk4ZWMsICAweDAwMDAwMDA4LCAgMHgwMDAwMDAwOH0sCisgICAgIC8vIyBiYW5rIDIKKyAgICAgezB4OThiMCwgIDB4MGU3M2ZmMTcsICAweDBlNzNmZjE3fSwKKyAgICAgezB4OThlMCwgIDB4MDAwMDA0MjAsICAweDAwMDAwNDIwfSwKKyAgICAgLy8jIGJhbmsgMworICAgICB7MHg5OGYwLCAgMHgwMTQwMDAxOCwgIDB4MDFjMDAwMTh9LAorICAgICAvLyMgYmFuayA0CisgICAgIHsweDk4YjAsICAweDAwMDAwMWExLCAgMHgwMDAwMDFhMX0sCisgICAgIHsweDk4ZTgsICAweDAwMDAwMDAxLCAgMHgwMDAwMDAwMX0sCisgICAgIC8vIyBiYW5rIDUKKyAgICAgezB4OThiMCwgIDB4MDAwMDAwMTMsICAweDAwMDAwMDEzfSwKKyAgICAgezB4OThlNCwgIDB4MDAwMDAwMDIsICAweDAwMDAwMDAyfSwKKyAgICAgLy8jIGJhbmsgNgorICAgICB7MHg5OGIwLCAgMHgwMDAwMDAwMCwgIDB4MDAwMDAwMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMDAwMCwgIDB4MDAwMDAwMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMDAwMCwgIDB4MDAwMDAwMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMDAwMCwgIDB4MDAwMDAwMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMDAwMCwgIDB4MDAwMDAwMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwNDAwMCwgIDB4MDAwMDQwMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwNmMwMCwgIDB4MDAwMDZjMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMmMwMCwgIDB4MDAwMDJjMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwNDgwMCwgIDB4MDAwMDQ4MDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwNDAwMCwgIDB4MDAwMDQwMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwNjAwMCwgIDB4MDAwMDYwMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMTAwMCwgIDB4MDAwMDEwMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwNDAwMCwgIDB4MDAwMDQwMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwN2MwMCwgIDB4MDAwMDdjMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwN2MwMCwgIDB4MDAwMDdjMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwN2MwMCwgIDB4MDAwMDdjMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwN2MwMCwgIDB4MDAwMDdjMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwN2MwMCwgIDB4MDAwMDdjMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDA4N2MwMCwgIDB4MDAwODdjMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwN2MwMCwgIDB4MDAwMDdjMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwNTQwMCwgIDB4MDAwMDU0MDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMGMwMCwgIDB4MDAwMDBjMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMTgwMCwgIDB4MDAwMDE4MDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwN2MwMCwgIDB4MDAwMDdjMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwNmMwMCwgIDB4MDAwMDZjMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwNmMwMCwgIDB4MDAwMDZjMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwN2MwMCwgIDB4MDAwMDdjMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMmMwMCwgIDB4MDAwMDJjMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwM2MwMCwgIDB4MDAwMDNjMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMzgwMCwgIDB4MDAwMDM4MDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMWMwMCwgIDB4MDAwMDFjMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMDgwMCwgIDB4MDAwMDA4MDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMDQwOCwgIDB4MDAwMDA0MDh9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwNGMxNSwgIDB4MDAwMDRjMTV9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwNDE4OCwgIDB4MDAwMDQxODh9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMjAxZSwgIDB4MDAwMDIwMWV9LAorICAgICB7MHg5OGIwLCAgMHgwMDAxMDQwOCwgIDB4MDAwMTA0MDh9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMDgwMSwgIDB4MDAwMDA4MDF9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMGMwOCwgIDB4MDAwMDBjMDh9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMTgxZSwgIDB4MDAwMDE4MWV9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMTAxNiwgIDB4MDAwMDEwMTZ9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMjgwMCwgIDB4MDAwMDI4MDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwNDAxMCwgIDB4MDAwMDQwMTB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMDgxYywgIDB4MDAwMDA4MWN9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMDExNSwgIDB4MDAwMDAxMTV9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMDAxNSwgIDB4MDAwMDAwMTV9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMDA2NiwgIDB4MDAwMDAwNjZ9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMDAxYywgIDB4MDAwMDAwMWN9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMDAwMCwgIDB4MDAwMDAwMDB9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMDAwNCwgIDB4MDAwMDAwMDR9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMDAxNSwgIDB4MDAwMDAwMTV9LAorICAgICB7MHg5OGIwLCAgMHgwMDAwMDAxZiwgIDB4MDAwMDAwMWZ9LAorICAgICB7MHg5OGUwLCAgMHgwMDAwMDAwMCwgIDB4MDAwMDA0MDB9LAorICAgICAvLyMgYmFuayA3CisgICAgIHsweDk4YjAsICAweDAwMDAwMGEwLCAgMHgwMDAwMDBhMH0sCisgICAgIHsweDk4YjAsICAweDAwMDAwMDAwLCAgMHgwMDAwMDAwMH0sCisgICAgIHsweDk4YjAsICAweDAwMDAwMDQwLCAgMHgwMDAwMDA0MH0sCisgICAgIHsweDk4ZjAsICAweDAwMDAwMDFjLCAgMHgwMDAwMDAxY30KK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9pb2N0bC5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaW9jdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTVjMWU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvaW9jdGwuYwpAQCAtMCwwICsxLDI5MTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IGlvY3RsLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgTGludXggd2lyZWxlc3MgZXh0ZW5zaW9uIHJlbGF0ZWQgZnVuY3RvbnMuICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQbGF0Zm9ybSBkZXBlbmRlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAidXNiZHJ2LmgiCisKKyNkZWZpbmUgWkRfSU9DVExfV1BBCQkJICAgIChTSU9DREVWUFJJVkFURSArIDEpCisjZGVmaW5lIFpEX0lPQ1RMX1BBUkFNCQkJICAgIChTSU9DREVWUFJJVkFURSArIDIpCisjZGVmaW5lIFpEX0lPQ1RMX0dFVFdQQUlFCQkgICAgKFNJT0NERVZQUklWQVRFICsgMykKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworI2RlZmluZSBaTV9JT0NUTF9DRU5DICAgICAgICAgICAgICAgKFNJT0NERVZQUklWQVRFICsgNCkKKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisjZGVmaW5lIFpEX1BBUkFNX1JPQU1JTkcJCSAgICAweDAwMDEKKyNkZWZpbmUgWkRfUEFSQU1fUFJJVkFDWQkJICAgIDB4MDAwMgorI2RlZmluZSBaRF9QQVJBTV9XUEEJCQkgICAgMHgwMDAzCisjZGVmaW5lIFpEX1BBUkFNX0NPVU5URVJNRUFTVVJFUwkweDAwMDQKKyNkZWZpbmUgWkRfUEFSQU1fRFJPUFVORU5DUllQVEVECTB4MDAwNQorI2RlZmluZSBaRF9QQVJBTV9BVVRIX0FMR1MJCSAgICAweDAwMDYKKyNkZWZpbmUgWkRfUEFSQU1fV1BTX0ZJTFRFUgkJICAgIDB4MDAwNworCisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyNkZWZpbmUgUDgwMjExX1BBQ0tFVF9DRU5DRkxBRwkJMHgwMDAxCisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworI2RlZmluZSBQODAyMTFfUEFDS0VUX1NFVEtFWSAgICAgCTB4MDAwMworCisjZGVmaW5lIFpEX0NNRF9TRVRfRU5DUllQVF9LRVkJCTB4MDAwMQorI2RlZmluZSBaRF9DTURfU0VUX01MTUUJCQkgICAgMHgwMDAyCisjZGVmaW5lIFpEX0NNRF9TQ0FOX1JFUQkJCSAgICAweDAwMDMKKyNkZWZpbmUgWkRfQ01EX1NFVF9HRU5FUklDX0VMRU1FTlQJMHgwMDA0CisjZGVmaW5lIFpEX0NNRF9HRVRfVFNDCQkJICAgIDB4MDAwNQorCisjZGVmaW5lIFpEX0NSWVBUX0FMR19OQU1FX0xFTgkJMTYKKyNkZWZpbmUgWkRfTUFYX0tFWV9TSVpFCQkJICAgIDMyCisjZGVmaW5lIFpEX01BWF9HRU5FUklDX1NJWkUJCSAgICA2NAorCisjaWYgV0lSRUxFU1NfRVhUID4gMTIKKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorI2VuZGlmCisKK2V4dGVybiB1MTZfdCB6ZkxueEdldFZhcElkKHpkZXZfdCogZGV2KTsKKworc3RhdGljIGNvbnN0IHUzMl90IGNoYW5uZWxfZnJlcXVlbmN5XzExQVtdID0KK3sKKy8vRXZlbiBlbGVtZW50IGZvciBDaGFubmVsIE51bWJlciwgT2RkIGZvciBGcmVxdWVuY3kKKyAgICAzNiw1MTgwLAorICAgIDQwLDUyMDAsCisgICAgNDQsNTIyMCwKKyAgICA0OCw1MjQwLAorICAgIDUyLDUyNjAsCisgICAgNTYsNTI4MCwKKyAgICA2MCw1MzAwLAorICAgIDY0LDUzMjAsCisgICAgMTAwLDU1MDAsCisgICAgMTA0LDU1MjAsCisgICAgMTA4LDU1NDAsCisgICAgMTEyLDU1NjAsCisgICAgMTE2LDU1ODAsCisgICAgMTIwLDU2MDAsCisgICAgMTI0LDU2MjAsCisgICAgMTI4LDU2NDAsCisgICAgMTMyLDU2NjAsCisgICAgMTM2LDU2ODAsCisgICAgMTQwLDU3MDAsCisvLworICAgIDE4NCw0OTIwLAorICAgIDE4OCw0OTQwLAorICAgIDE5Miw0OTYwLAorICAgIDE5Niw0OTgwLAorICAgIDgsNTA0MCwKKyAgICAxMiw1MDYwLAorICAgIDE2LDUwODAsCisgICAgMzQsNTE3MCwKKyAgICAzOCw1MTkwLAorICAgIDQyLDUyMTAsCisgICAgNDYsNTIzMCwKKy8vCisgICAgMTQ5LDU3NDUsCisgICAgMTUzLDU3NjUsCisgICAgMTU3LDU3ODUsCisgICAgMTYxLDU4MDUsCisgICAgMTY1LDU4MjUKKy8vCit9OworCitpbnQgdXNiZHJ2X2ZyZXEyY2hhbih1MzJfdCBmcmVxKQoreworICAgIC8qIDIuNEcgSHogKi8KKyAgICBpZiAoZnJlcSA+IDI0MDAgJiYgZnJlcSA8IDMwMDApCisgICAgeworICAgICAgICByZXR1cm4gKChmcmVxLTI0MTIpLzUpICsgMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdTE2X3QgaWk7CisgICAgICAgIHUxNl90IG51bV9jaGFuID0gc2l6ZW9mKGNoYW5uZWxfZnJlcXVlbmN5XzExQSkvc2l6ZW9mKHUzMl90KTsKKworICAgICAgICBmb3IoaWkgPSAxOyBpaSA8IG51bV9jaGFuOyBpaSArPSAyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2hhbm5lbF9mcmVxdWVuY3lfMTFBW2lpXSA9PSBmcmVxKQorICAgICAgICAgICAgICAgIHJldHVybiBjaGFubmVsX2ZyZXF1ZW5jeV8xMUFbaWktMV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHVzYmRydl9jaGFuMmZyZXEoaW50IGNoYW4pCit7CisgICAgaW50IGZyZXE7CisKKyAgICAvKiBJZiBjaGFubmVsIG51bWJlciBpcyBvdXQgb2YgcmFuZ2UgKi8KKyAgICBpZiAoY2hhbiA+IDE2NSB8fCBjaGFuIDw9IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIDIuNEcgYmFuZCAqLworICAgIGlmIChjaGFuID49IDEgJiYgY2hhbiA8PSAxMykKKyAgICB7CisgICAgICAgIGZyZXEgPSAoMjQxMiArIChjaGFuIC0gMSkgKiA1KTsKKyAgICAgICAgcmV0dXJuIGZyZXE7CisgICAgfQorICAgIGVsc2UgaWYgKGNoYW4gPj0gMzYgJiYgY2hhbiA8PSAxNjUpCisgICAgeworICAgICAgICB1MTZfdCBpaTsKKyAgICAgICAgdTE2X3QgbnVtX2NoYW4gPSBzaXplb2YoY2hhbm5lbF9mcmVxdWVuY3lfMTFBKS9zaXplb2YodTMyX3QpOworCisgICAgICAgIGZvcihpaSA9IDA7IGlpIDwgbnVtX2NoYW47IGlpICs9IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjaGFubmVsX2ZyZXF1ZW5jeV8xMUFbaWldID09IGNoYW4pCisgICAgICAgICAgICAgICAgcmV0dXJuIGNoYW5uZWxfZnJlcXVlbmN5XzExQVtpaSsxXTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENhbid0IGZpbmQgZGVzaXJlZCBmcmVxdWVuY3kgKi8KKyAgICAgICAgaWYgKGlpID09IG51bV9jaGFuKQorICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogQ2FuJ3QgZmluZCBkZWlzcmVkIGZyZXF1ZW5jeSAqLworICAgIHJldHVybiAtMTsKK30KKworaW50IHVzYmRydl9pb2N0bF9zZXRlc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcG9pbnQgKmVycSkKK3sKKyNpZmRlZiBaTV9IT1NUQVBEX1NVUFBPUlQKKyAgICAvL3N0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICBjaGFyIGVzc2lkYnVmW0lXX0VTU0lEX01BWF9TSVpFKzFdOworICAgIGludCBpOworCisgICAgaWYoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBtZW1zZXQoZXNzaWRidWYsIDAsIHNpemVvZihlc3NpZGJ1ZikpOworCisgICAgcHJpbnRrKEtFUk5fRVJSICJ1c2JkcnZfaW9jdGxfc2V0ZXNzaWRcbiIpOworCisgICAgLy9wcmludGsoInNzaWRsZW49JWRcbiIsIGVycS0+bGVuZ3RoKTsgLy9mb3IgYW55LCBpdCBpcyAxLgorICAgIGlmIChlcnEtPmZsYWdzKSB7CisgICAgICAgIGlmIChlcnEtPmxlbmd0aCA+IChJV19FU1NJRF9NQVhfU0laRSsxKSkKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisKKyAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKGVzc2lkYnVmLCBlcnEtPnBvaW50ZXIsIGVycS0+bGVuZ3RoKSkKKyAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgIH0KKworICAgIC8vemRfRGlzYXNvY0FsbCgyKTsKKyAgICAvL3dhaXRfbXMoMTAwKTsKKworICAgIHByaW50ayhLRVJOX0VSUiAiZXNzaWRidWY6ICIpOworCisgICAgZm9yKGkgPSAwOyBpIDwgZXJxLT5sZW5ndGg7IGkrKykKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiAiJTAyeCAiLCBlc3NpZGJ1ZltpXSk7CisgICAgfQorCisgICAgcHJpbnRrKEtFUk5fRVJSICJcbiIpOworCisgICAgZXNzaWRidWZbZXJxLT5sZW5ndGhdID0gJ1wwJzsKKyAgICAvL21lbWNweShtYWNwLT53ZC53cy5zc2lkLCBlc3NpZGJ1ZiwgZXJxLT5sZW5ndGgpOworICAgIC8vbWFjcC0+d2Qud3Muc3NpZExlbiA9IHN0cmxlbihlc3NpZGJ1ZikrMjsKKyAgICAvL21hY3AtPndkLndzLnNzaWRbMV0gPSBzdHJsZW4oZXNzaWRidWYpOyAvLyBVcGRhdGUgc3NpZCBsZW5ndGgKKworICAgIHpmaVdsYW5TZXRTU0lEKGRldiwgZXNzaWRidWYsIGVycS0+bGVuZ3RoKTsKKyNpZiAwCisgICAgcHJpbnRrKEtFUk5fRVJSICJtYWNwLT53ZC53cy5zc2lkOiAiKTsKKworICAgIGZvcihpID0gMDsgaSA8IG1hY3AtPndkLndzLnNzaWRMZW47IGkrKykKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiAiJTAyeCAiLCBtYWNwLT53ZC53cy5zc2lkW2ldKTsKKyAgICB9CisKKyAgICBwcmludGsoS0VSTl9FUlIgIlxuIik7CisjZW5kaWYKKyAgICB6ZmlXbGFuRGlzYWJsZShkZXYsIDApOworICAgIHpmaVdsYW5FbmFibGUoZGV2KTsKKworI2VuZGlmCisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHVzYmRydl9pb2N0bF9nZXRlc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcG9pbnQgKmVycSkKK3sKKyAgICAgLy9zdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgIHU4X3QgZXNzaWRidWZbSVdfRVNTSURfTUFYX1NJWkUrMV07CisgICAgIHU4X3QgbGVuOworICAgICB1OF90IGk7CisKKworICAgICAvL2xlbiA9IG1hY3AtPndkLndzLnNzaWRMZW47CisgICAgIC8vbWVtY3B5KGVzc2lkYnVmLCBtYWNwLT53ZC53cy5zc2lkLCBtYWNwLT53ZC53cy5zc2lkTGVuKTsKKyAgICAgemZpV2xhblF1ZXJ5U1NJRChkZXYsIGVzc2lkYnVmLCAmbGVuKTsKKworICAgICBlc3NpZGJ1ZltsZW5dID0gMDsKKworICAgICBwcmludGsoS0VSTl9FUlIgIkVTU0lEOiAiKTsKKworICAgICBmb3IoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICAgeworICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlYyIsIGVzc2lkYnVmW2ldKTsKKyAgICAgfQorCisgICAgIHByaW50ayhLRVJOX0VSUiAiXG4iKTsKKworICAgICBlcnEtPmZsYWdzPSAxOworICAgICBlcnEtPmxlbmd0aCA9IHN0cmxlbihlc3NpZGJ1ZikgKyAxOworCisgICAgIGlmIChlcnEtPnBvaW50ZXIpCisgICAgICAgICBpZiAoY29weV90b191c2VyKGVycS0+cG9pbnRlciwgZXNzaWRidWYsIGVycS0+bGVuZ3RoKSkKKyAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKworICAgICByZXR1cm4gMDsKK30KKworCitpbnQgdXNiZHJ2X2lvY3RsX3NldHJ0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcGFyYW0gKnJycSkKK3sKKworICAgIHJldHVybiAwOworfQorCisjaWYgV0lSRUxFU1NfRVhUID4gMTQKKy8qCisgKiBFbmNvZGUgYSBXUEEgb3IgUlNOIGluZm9ybWF0aW9uIGVsZW1lbnQgYXMgYSBjdXN0b20KKyAqIGVsZW1lbnQgdXNpbmcgdGhlIGhvc3RhcCBmb3JtYXQuCisgKi8KK3UzMiBlbmNvZGVfaWUodm9pZCAqYnVmLCB1MzIgYnVmc2l6ZSwgY29uc3QgdTggKmllLCB1MzIgaWVsZW4sIGNvbnN0IHU4ICpsZWFkZXIsIHUzMiBsZWFkZXJfbGVuKQoreworICAgIHU4ICpwOworICAgIHUzMiBpOworCisgICAgaWYgKGJ1ZnNpemUgPCBsZWFkZXJfbGVuKQorICAgICAgICByZXR1cm4gMDsKKyAgICBwID0gYnVmOworICAgIG1lbWNweShwLCBsZWFkZXIsIGxlYWRlcl9sZW4pOworICAgIGJ1ZnNpemUgLT0gbGVhZGVyX2xlbjsKKyAgICBwICs9IGxlYWRlcl9sZW47CisgICAgZm9yIChpID0gMDsgaSA8IGllbGVuICYmIGJ1ZnNpemUgPiAyOyBpKyspCisgICAgICAgIHAgKz0gc3ByaW50ZihwLCAiJTAyeCIsIGllW2ldKTsKKyAgICByZXR1cm4gKGkgPT0gaWVsZW4gPyBwIC0gKHU4ICopYnVmIDogMCk7Cit9CisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdJUkVMRVNTX0VYVCA+IDE0ICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUcmFuc2xhdGUgc2NhbiBkYXRhIHJldHVybmVkIGZyb20gdGhlIGNhcmQgdG8gYSBjYXJkIGluZGVwZW5kZW50CisgKiBmb3JtYXQgdGhhdCB0aGUgV2lyZWxlc3MgVG9vbHMgd2lsbCB1bmRlcnN0YW5kCisgKi8KK2NoYXIgKnVzYmRydl90cmFuc2xhdGVfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIGNoYXIgKmN1cnJlbnRfZXYsCisgICAgICAgIGNoYXIgKmVuZF9idWYsIHN0cnVjdCB6c0Jzc0luZm8gKmxpc3QpCit7CisgICAgc3RydWN0IGl3X2V2ZW50IGl3ZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRlbXBvcmFyeSBidWZmZXIgKi8KKyAgICB1MTZfdCBjYXBhYmlsaXRpZXM7CisgICAgY2hhciAqY3VycmVudF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciByYXRlcyAqLworICAgIGNoYXIgKmxhc3RfZXY7CisgICAgaW50IGk7CisjaWYgV0lSRUxFU1NfRVhUID4gMTQKKyAgICBjaGFyICAgIGJ1Zls2NCoyICsgMzBdOworI2VuZGlmCisKKyAgICBsYXN0X2V2ID0gY3VycmVudF9ldjsKKworLyogRmlyc3QgZW50cnkgKk1VU1QqIGJlIHRoZSBBUCBNQUMgYWRkcmVzcyAqLworICAgIGl3ZS5jbWQgPSBTSU9DR0lXQVA7CisgICAgaXdlLnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisgICAgbWVtY3B5KGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwgbGlzdC0+YnNzaWQsIEVUSF9BTEVOKTsKKyAgICBjdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoCisJaW5mbywKKwljdXJyZW50X2V2LAorCWVuZF9idWYsICZpd2UsIElXX0VWX0FERFJfTEVOKTsKKworICAgIC8qIFJhbiBvdXQgb2YgYnVmZmVyICovCisgICAgaWYgKGxhc3RfZXYgPT0gY3VycmVudF9ldikKKyAgICB7CisgICAgICAgIHJldHVybiBlbmRfYnVmOworICAgIH0KKworICAgIGxhc3RfZXYgPSBjdXJyZW50X2V2OworCisvKiBPdGhlciBlbnRyaWVzIHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBvcmRlciB3ZSBnaXZlIHRoZW0gKi8KKworLyogQWRkIHRoZSBFU1NJRCAqLworICAgIGl3ZS51LmRhdGEubGVuZ3RoID0gbGlzdC0+c3NpZFsxXTsKKyAgICBpZihpd2UudS5kYXRhLmxlbmd0aCA+IDMyKQorICAgICAgICBpd2UudS5kYXRhLmxlbmd0aCA9IDMyOworICAgIGl3ZS5jbWQgPSBTSU9DR0lXRVNTSUQ7CisgICAgaXdlLnUuZGF0YS5mbGFncyA9IDE7CisgICAgY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KAorCWluZm8sCisJY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgJmxpc3QtPnNzaWRbMl0pOworCisgICAgLyogUmFuIG91dCBvZiBidWZmZXIgKi8KKyAgICBpZiAobGFzdF9ldiA9PSBjdXJyZW50X2V2KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVuZF9idWY7CisgICAgfQorCisgICAgbGFzdF9ldiA9IGN1cnJlbnRfZXY7CisKKy8qIEFkZCBtb2RlICovCisgICAgaXdlLmNtZCA9IFNJT0NHSVdNT0RFOworICAgIGNhcGFiaWxpdGllcyA9IChsaXN0LT5jYXBhYmlsaXR5WzFdIDw8IDgpICsgbGlzdC0+Y2FwYWJpbGl0eVswXTsKKyAgICBpZihjYXBhYmlsaXRpZXMgJiAoMHgwMSB8IDB4MDIpKQorICAgIHsKKyAgICAgICAgaWYoY2FwYWJpbGl0aWVzICYgMHgwMSkKKyAgICAgICAgICAgIGl3ZS51Lm1vZGUgPSBJV19NT0RFX01BU1RFUjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaXdlLnUubW9kZSA9IElXX01PREVfQURIT0M7CisgICAgICAgIGN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudCgKKwkJaW5mbywKKwkJY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgSVdfRVZfVUlOVF9MRU4pOworICAgIH0KKworICAgIC8qIFJhbiBvdXQgb2YgYnVmZmVyICovCisgICAgaWYgKGxhc3RfZXYgPT0gY3VycmVudF9ldikKKyAgICB7CisgICAgICAgIHJldHVybiBlbmRfYnVmOworICAgIH0KKworICAgIGxhc3RfZXYgPSBjdXJyZW50X2V2OworCisvKiBBZGQgZnJlcXVlbmN5ICovCisgICAgaXdlLmNtZCA9IFNJT0NHSVdGUkVROworICAgIGl3ZS51LmZyZXEubSA9IGxpc3QtPmNoYW5uZWw7CisvKiBDaGFubmVsIGZyZXF1ZW5jeSBpbiBLSHogKi8KKyAgICBpZiAoaXdlLnUuZnJlcS5tID4gMTQpCisgICAgeworICAgICAgICBpZiAoKDE4NCA8PSBpd2UudS5mcmVxLm0pICYmIChpd2UudS5mcmVxLm08PTE5NikpCisgICAgICAgICAgICAgIGl3ZS51LmZyZXEubSA9IDQwMDAgKyBpd2UudS5mcmVxLm0gKiA1OworICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGl3ZS51LmZyZXEubSA9IDUwMDAgKyBpd2UudS5mcmVxLm0gKiA1OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoaXdlLnUuZnJlcS5tID09IDE0KQorICAgICAgICAgICAgICBpd2UudS5mcmVxLm0gPSAyNDg0OworICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGl3ZS51LmZyZXEubSA9IDI0MTIgKyAoaXdlLnUuZnJlcS5tIC0gMSkgKiA1OworICAgIH0KKyAgICBpd2UudS5mcmVxLmUgPSA2OworICAgIGN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudCgKKwlpbmZvLAorICAgIAljdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBJV19FVl9GUkVRX0xFTik7CisKKyAgICAvKiBSYW4gb3V0IG9mIGJ1ZmZlciAqLworICAgIGlmIChsYXN0X2V2ID09IGN1cnJlbnRfZXYpCisgICAgeworICAgICAgICByZXR1cm4gZW5kX2J1ZjsKKyAgICB9CisKKyAgICBsYXN0X2V2ID0gY3VycmVudF9ldjsKKworLyogQWRkIHF1YWxpdHkgc3RhdGlzdGljcyAqLworICAgIGl3ZS5jbWQgPSBJV0VWUVVBTDsKKyNpZiBXSVJFTEVTU19FWFQgPiAxOAorICAgIGl3ZS51LnF1YWwudXBkYXRlZCA9IElXX1FVQUxfUVVBTF9VUERBVEVEIHwgSVdfUVVBTF9MRVZFTF9VUERBVEVECisgICAgICAgICAgICAgICAgICAgICAgICB8SVdfUVVBTF9OT0lTRV9VUERBVEVEOworI2VuZGlmCisgICAgaXdlLnUucXVhbC5sZXZlbCA9IGxpc3QtPnNpZ25hbFN0cmVuZ3RoOworICAgIGl3ZS51LnF1YWwubm9pc2UgPSAwOworICAgIGl3ZS51LnF1YWwucXVhbCA9IGxpc3QtPnNpZ25hbFF1YWxpdHk7CisgICAgY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KAorCWluZm8sCisJY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgSVdfRVZfUVVBTF9MRU4pOworCisgICAgLyogUmFuIG91dCBvZiBidWZmZXIgKi8KKyAgICBpZiAobGFzdF9ldiA9PSBjdXJyZW50X2V2KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVuZF9idWY7CisgICAgfQorCisgICAgbGFzdF9ldiA9IGN1cnJlbnRfZXY7CisKKy8qIEFkZCBlbmNyeXB0aW9uIGNhcGFiaWxpdHkgKi8KKworICAgIGl3ZS5jbWQgPSBTSU9DR0lXRU5DT0RFOworICAgIGlmKGNhcGFiaWxpdGllcyAmIDB4MTApCisgICAgICAgIGl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRU5BQkxFRCB8IElXX0VOQ09ERV9OT0tFWTsKKyAgICBlbHNlCisgICAgICAgIGl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7CisKKyAgICBpd2UudS5kYXRhLmxlbmd0aCA9IDA7CisgICAgY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KAorCWluZm8sCisJY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgbGlzdC0+c3NpZCk7CisKKyAgICAvKiBSYW4gb3V0IG9mIGJ1ZmZlciAqLworICAgIGlmIChsYXN0X2V2ID09IGN1cnJlbnRfZXYpCisgICAgeworICAgICAgICByZXR1cm4gZW5kX2J1ZjsKKyAgICB9CisKKyAgICBsYXN0X2V2ID0gY3VycmVudF9ldjsKKworLyogUmF0ZSA6IHN0dWZmaW5nIG11bHRpcGxlIHZhbHVlcyBpbiBhIHNpbmdsZSBldmVudCByZXF1aXJlIGEgYml0CisgKiBtb3JlIG9mIG1hZ2ljICovCisgICAgY3VycmVudF92YWwgPSBjdXJyZW50X2V2ICsgSVdfRVZfTENQX0xFTjsKKworICAgIGl3ZS5jbWQgPSBTSU9DR0lXUkFURTsKKy8qIFRob3NlIHR3byBmbGFncyBhcmUgaWdub3JlZC4uLiAqLworICAgIGl3ZS51LmJpdHJhdGUuZml4ZWQgPSBpd2UudS5iaXRyYXRlLmRpc2FibGVkID0gMDsKKworICAgIGZvcihpID0gMCA7IGkgPCBsaXN0LT5zdXBwb3J0ZWRSYXRlc1sxXSA7IGkrKykKKyAgICB7CisvKiBCaXQgcmF0ZSBnaXZlbiBpbiA1MDAga2IvcyB1bml0cyAoKyAweDgwKSAqLworICAgICAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gKChsaXN0LT5zdXBwb3J0ZWRSYXRlc1tpKzJdICYgMHg3ZikgKiA1MDAwMDApOworLyogQWRkIG5ldyB2YWx1ZSB0byBldmVudCAqLworICAgICAgICBjdXJyZW50X3ZhbCA9IGl3ZV9zdHJlYW1fYWRkX3ZhbHVlKAorCQlpbmZvLAorCQljdXJyZW50X2V2LCBjdXJyZW50X3ZhbCwgZW5kX2J1ZiwgJml3ZSwgSVdfRVZfUEFSQU1fTEVOKTsKKworICAgICAgICAvKiBSYW4gb3V0IG9mIGJ1ZmZlciAqLworICAgICAgICBpZiAobGFzdF9ldiA9PSBjdXJyZW50X3ZhbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVuZF9idWY7CisgICAgICAgIH0KKworICAgICAgICBsYXN0X2V2ID0gY3VycmVudF92YWw7CisgICAgfQorCisgICAgZm9yIChpID0gMCA7IGkgPCBsaXN0LT5leHRTdXBwb3J0ZWRSYXRlc1sxXSA7IGkrKykKKyAgICB7CisvKiBCaXQgcmF0ZSBnaXZlbiBpbiA1MDAga2IvcyB1bml0cyAoKyAweDgwKSAqLworICAgICAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gKChsaXN0LT5leHRTdXBwb3J0ZWRSYXRlc1tpKzJdICYgMHg3ZikgKiA1MDAwMDApOworLyogQWRkIG5ldyB2YWx1ZSB0byBldmVudCAqLworICAgICAgICBjdXJyZW50X3ZhbCA9IGl3ZV9zdHJlYW1fYWRkX3ZhbHVlKAorCQlpbmZvLAorCQljdXJyZW50X2V2LCBjdXJyZW50X3ZhbCwgZW5kX2J1ZiwgJml3ZSwgSVdfRVZfUEFSQU1fTEVOKTsKKworICAgICAgICAvKiBSYW4gb3V0IG9mIGJ1ZmZlciAqLworICAgICAgICBpZiAobGFzdF9ldiA9PSBjdXJyZW50X3ZhbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVuZF9idWY7CisgICAgICAgIH0KKworICAgICAgICBsYXN0X2V2ID0gY3VycmVudF9ldjsKKyAgICB9CisKKy8qIENoZWNrIGlmIHdlIGFkZGVkIGFueSBldmVudCAqLworICAgIGlmKChjdXJyZW50X3ZhbCAtIGN1cnJlbnRfZXYpID4gSVdfRVZfTENQX0xFTikKKyAgICAgICAgY3VycmVudF9ldiA9IGN1cnJlbnRfdmFsOworI2lmIFdJUkVMRVNTX0VYVCA+IDE0CisjZGVmaW5lIElFRUU4MDIxMV9FTEVNSURfUlNOIDB4MzAKKyAgICBtZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworICAgIGl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJiY25faW50PSVkIiwgKGxpc3QtPmJlYWNvbkludGVydmFsWzFdIDw8IDgpICsgbGlzdC0+YmVhY29uSW50ZXJ2YWxbMF0pOworICAgIGl3ZS51LmRhdGEubGVuZ3RoID0gc3RybGVuKGJ1Zik7CisgICAgY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KAorCQlpbmZvLAorCQljdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBidWYpOworCisgICAgLyogUmFuIG91dCBvZiBidWZmZXIgKi8KKyAgICBpZiAobGFzdF9ldiA9PSBjdXJyZW50X2V2KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVuZF9idWY7CisgICAgfQorCisgICAgbGFzdF9ldiA9IGN1cnJlbnRfZXY7CisKKyAgICBpZiAobGlzdC0+d3BhSWVbMV0gIT0gMCkKKyAgICB7CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHJzbl9sZWFkZXJbXSA9ICJyc25faWU9IjsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgd3BhX2xlYWRlcltdID0gIndwYV9pZT0iOworCisgICAgICAgIG1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisgICAgICAgIGl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworICAgICAgICBpZiAobGlzdC0+d3BhSWVbMF0gPT0gSUVFRTgwMjExX0VMRU1JRF9SU04pCisgICAgICAgICAgICBpd2UudS5kYXRhLmxlbmd0aCA9IGVuY29kZV9pZShidWYsIHNpemVvZihidWYpLAorICAgICAgICAgICAgICAgIGxpc3QtPndwYUllLCBsaXN0LT53cGFJZVsxXSsyLAorICAgICAgICAgICAgICAgIHJzbl9sZWFkZXIsIHNpemVvZihyc25fbGVhZGVyKS0xKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaXdlLnUuZGF0YS5sZW5ndGggPSBlbmNvZGVfaWUoYnVmLCBzaXplb2YoYnVmKSwKKyAgICAgICAgICAgICAgICBsaXN0LT53cGFJZSwgbGlzdC0+d3BhSWVbMV0rMiwKKyAgICAgICAgICAgICAgICB3cGFfbGVhZGVyLCBzaXplb2Yod3BhX2xlYWRlciktMSk7CisKKyAgICAgICAgaWYgKGl3ZS51LmRhdGEubGVuZ3RoICE9IDApCisgICAgICAgICAgICBjdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoCisJCWluZm8sCisJCWN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIGJ1Zik7CisKKyAgICAgICAgLyogUmFuIG91dCBvZiBidWZmZXIgKi8KKyAgICAgICAgaWYgKGxhc3RfZXYgPT0gY3VycmVudF9ldikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVuZF9idWY7CisgICAgICAgIH0KKworICAgICAgICBsYXN0X2V2ID0gY3VycmVudF9ldjsKKyAgICB9CisgICAgaWYgKGxpc3QtPnJzbkllWzFdICE9IDApCisgICAgeworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciByc25fbGVhZGVyW10gPSAicnNuX2llPSI7CisgICAgICAgIG1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisgICAgICAgIGl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworCisgICAgICAgIGlmIChsaXN0LT5yc25JZVswXSA9PSBJRUVFODAyMTFfRUxFTUlEX1JTTikKKyAgICAgICAgeworICAgICAgICAgICAgaXdlLnUuZGF0YS5sZW5ndGggPSBlbmNvZGVfaWUoYnVmLCBzaXplb2YoYnVmKSwKKyAgICAgICAgICAgICAgICBsaXN0LT5yc25JZSwgbGlzdC0+cnNuSWVbMV0rMiwKKyAgICAgICAgICAgICAgICByc25fbGVhZGVyLCBzaXplb2YocnNuX2xlYWRlciktMSk7CisgICAgICAgICAgICBpZiAoaXdlLnUuZGF0YS5sZW5ndGggIT0gMCkKKyAgICAgICAgICAgICAgICBjdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoCisJCQlpbmZvLAorCQkJY3VycmVudF9ldiwgZW5kX2J1ZiwgICZpd2UsIGJ1Zik7CisKKyAgICAgICAgICAgIC8qIFJhbiBvdXQgb2YgYnVmZmVyICovCisgICAgICAgICAgICBpZiAobGFzdF9ldiA9PSBjdXJyZW50X2V2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBlbmRfYnVmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsYXN0X2V2ID0gY3VycmVudF9ldjsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorLyogVGhlIG90aGVyIGRhdGEgaW4gdGhlIHNjYW4gcmVzdWx0IGFyZSBub3QgcmVhbGx5CisgKiBpbnRlcmVzdGluZywgc28gZm9yIG5vdyBkcm9wIGl0ICovCisgICAgcmV0dXJuIGN1cnJlbnRfZXY7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X2dpd25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnEsIGNoYXIgKmV4dHJhKQoreworICAgIC8vc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgc3RyY3B5KHdycS0+bmFtZSwgIklFRUUgODAyLjExLU1JTU8iKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9zaXdmcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgc3RydWN0IGl3X2ZyZXEgKmZyZXEsIGNoYXIgKmV4dHJhKQoreworICAgIHUzMl90IEZyZXFLSHo7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgaWYoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBpZiAoZnJlcS0+ZSA+IDEpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgaWYgKGZyZXEtPmUgPT0gMSkKKyAgICB7CisgICAgICAgIEZyZXFLSHogPSAoZnJlcS0+bSAvIDEwMDAwMCk7CisKKyAgICAgICAgaWYgKEZyZXFLSHogPiA0MDAwMDAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoRnJlcUtIeiA+IDU4MjUwMDApCisgICAgICAgICAgICAgICAgRnJlcUtIeiA9IDU4MjUwMDA7CisgICAgICAgICAgICBlbHNlIGlmIChGcmVxS0h6IDwgNDkyMDAwMCkKKyAgICAgICAgICAgICAgICBGcmVxS0h6ID0gNDkyMDAwMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKEZyZXFLSHogPCA1MDAwMDAwKQorICAgICAgICAgICAgICAgIEZyZXFLSHogPSAoKChGcmVxS0h6IC0gNDAwMDAwMCkgLyA1MDAwKSAqIDUwMDApICsgNDAwMDAwMDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBGcmVxS0h6ID0gKCgoRnJlcUtIeiAtIDUwMDAwMDApIC8gNTAwMCkgKiA1MDAwKSArIDUwMDAwMDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoRnJlcUtIeiA+IDI0ODQwMDApCisgICAgICAgICAgICAgICAgRnJlcUtIeiA9IDI0ODQwMDA7CisgICAgICAgICAgICBlbHNlIGlmIChGcmVxS0h6IDwgMjQxMjAwMCkKKyAgICAgICAgICAgICAgICBGcmVxS0h6ID0gMjQxMjAwMDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBGcmVxS0h6ID0gKCgoRnJlcUtIeiAtIDI0MTIwMDApIC8gNTAwMCkgKiA1MDAwKSArIDI0MTIwMDA7CisgICAgICAgIH0KKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBGcmVxS0h6ID0gdXNiZHJ2X2NoYW4yZnJlcShmcmVxLT5tKTsKKworICAgICAgICBpZiAoRnJlcUtIeiAhPSAtMSkKKyAgICAgICAgICAgIEZyZXFLSHogKj0gMTAwMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgRnJlcUtIeiA9IDI0MTIwMDA7CisgICAgfQorCisgICAgLy9wcmludGsoImZyZXEtPm06ICVkLCBmcmVxLT5lOiAlZFxuIiwgZnJlcS0+bSwgZnJlcS0+ZSk7CisgICAgLy9wcmludGsoIkZyZXFLSHo6ICVkXG4iLCBGcmVxS0h6KTsKKworICAgIGlmIChtYWNwLT5EZXZpY2VPcGVuZWQgPT0gMSkKKyAgICB7CisgICAgICAgIHpmaVdsYW5TZXRGcmVxdWVuY3koZGV2LCBGcmVxS0h6LCAwKTsgLy8gSW1tZWRpYXRlCisgICAgICAgIC8vdThfdCB3cGFpZUxlbix3cGFpZVs1MF07CisgICAgICAgIC8vemZpV2xhblF1ZXJ5V3BhSWUoZGV2LCB3cGFpZSwgJndwYWllTGVuKTsKKyAgICAgICAgemZpV2xhbkRpc2FibGUoZGV2LCAwKTsKKyAgICAgICAgemZpV2xhbkVuYWJsZShkZXYpOworICAgICAgICAvL2lmICh3cGFpZUxlbiA+IDIpCisgICAgICAgIC8vICAgIHpmaVdsYW5TZXRXcGFJZShkZXYsIHdwYWllLCB3cGFpZUxlbik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X2dpd2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICBzdHJ1Y3QgaXdfZnJlcSAqZnJlcSwgY2hhciAqZXh0cmEpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgaWYgKG1hY3AtPkRldmljZU9wZW5lZCAhPSAxKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGZyZXEtPm0gPSB6ZmlXbGFuUXVlcnlGcmVxdWVuY3koZGV2KTsKKyAgICBmcmVxLT5lID0gMzsKKworICAgIHJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9zaXdtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxLCBjaGFyICpleHRyYSkKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgdThfdCBXbGFuTW9kZTsKKworICAgIGlmKCFuZXRpZl9ydW5uaW5nKGRldikpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgaWYgKG1hY3AtPkRldmljZU9wZW5lZCAhPSAxKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHN3aXRjaCh3cnEtPm1vZGUpCisgICAgeworICAgICAgICBjYXNlIElXX01PREVfTUFTVEVSOgorICAgICAgICAgICAgV2xhbk1vZGUgPSBaTV9NT0RFX0FQOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSVdfTU9ERV9JTkZSQToKKyAgICAgICAgICAgIFdsYW5Nb2RlID0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElXX01PREVfQURIT0M6CisgICAgICAgICAgICBXbGFuTW9kZSA9IFpNX01PREVfSUJTUzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgV2xhbk1vZGUgPSBaTV9NT0RFX0lCU1M7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICB6ZmlXbGFuU2V0V2xhbk1vZGUoZGV2LFdsYW5Nb2RlKTsKKyAgICB6ZmlXbGFuRGlzYWJsZShkZXYsIDEpOworICAgIHpmaVdsYW5FbmFibGUoZGV2KTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9naXdtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgX191MzIgKm1vZGUsIGNoYXIgKmV4dHJhKQoreworICAgIHVuc2lnbmVkIGxvbmcgaXJxRmxhZzsKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisKKyAgICBpZighbmV0aWZfcnVubmluZyhkZXYpKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIGlmIChtYWNwLT5EZXZpY2VPcGVuZWQgIT0gMSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CisKKyAgICBzd2l0Y2goemZpV2xhblF1ZXJ5V2xhbk1vZGUoZGV2KSkKKyAgICB7CisgICAgICAgIGNhc2UgWk1fTU9ERV9BUDoKKyAgICAgICAgICAgICptb2RlID0gSVdfTU9ERV9NQVNURVI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFOgorICAgICAgICAgICAgKm1vZGUgPSBJV19NT0RFX0lORlJBOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgWk1fTU9ERV9JQlNTOgorICAgICAgICAgICAgKm1vZGUgPSBJV19NT0RFX0FESE9DOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAqbW9kZSA9IElXX01PREVfQURIT0M7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9zaXdzZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BhcmFtICpzZW5zLCBjaGFyICpleHRyYSkKK3sKKwlyZXR1cm4gMDsKK30KKworaW50IHVzYmRydndleHRfZ2l3c2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wYXJhbSAqc2VucywgY2hhciAqZXh0cmEpCit7CisJc2Vucy0+dmFsdWUgPSAwOworCXNlbnMtPmZpeGVkID0gMTsKKworCXJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9naXdyYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisgICAgc3RydWN0IGl3X3JhbmdlICpyYW5nZSA9IChzdHJ1Y3QgaXdfcmFuZ2UgKikgZXh0cmE7CisgICAgaW50IGksIHZhbDsKKyAgICAvL2ludCBudW1fYmFuZF9hOworICAgIHUxNl90IGNoYW5uZWxzWzYwXTsKKyAgICB1MTZfdCBjaGFubmVsX251bTsKKworICAgIGlmKCFuZXRpZl9ydW5uaW5nKGRldikpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisjaWYgV0lSRUxFU1NfRVhUID4gOQorICAgIHJhbmdlLT50eHBvd2VyX2NhcGEgPSBJV19UWFBPV19EQk07CisvLyBYWFggd2hhdCBhYm91dCBtaW4vbWF4X3BtcCwgbWluL21heF9wbXQsIGV0Yy4KKyNlbmRpZgorCisjaWYgV0lSRUxFU1NfRVhUID4gMTAKKyAgICByYW5nZS0+d2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKKyAgICByYW5nZS0+d2VfdmVyc2lvbl9zb3VyY2UgPSAxMzsKKworICAgIHJhbmdlLT5yZXRyeV9jYXBhID0gSVdfUkVUUllfTElNSVQ7CisgICAgcmFuZ2UtPnJldHJ5X2ZsYWdzID0gSVdfUkVUUllfTElNSVQ7CisgICAgcmFuZ2UtPm1pbl9yZXRyeSA9IDA7CisgICAgcmFuZ2UtPm1heF9yZXRyeSA9IDI1NTsKKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXSVJFTEVTU19FWFQgPiAxMCAqLworCisgICAgY2hhbm5lbF9udW0gPSB6ZmlXbGFuUXVlcnlBbGxvd0NoYW5uZWxzKGRldiwgY2hhbm5lbHMpOworCisgICAgLyogR3VyYW50ZWUgcmVwb3J0ZWQgY2hhbm5lbCBudW1iZXJzIGlzIGxlc3Mgb3IgZXF1YWwgdG8gSVdfTUFYX0ZSRVFVRU5DSUVTICovCisgICAgaWYgKGNoYW5uZWxfbnVtID4gSVdfTUFYX0ZSRVFVRU5DSUVTKQorICAgICAgICBjaGFubmVsX251bSA9IElXX01BWF9GUkVRVUVOQ0lFUzsKKworICAgIHZhbCA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbF9udW07IGkrKykKKyAgICB7CisgICAgICAgIHJhbmdlLT5mcmVxW3ZhbF0uaSA9IHVzYmRydl9mcmVxMmNoYW4oY2hhbm5lbHNbaV0pOworICAgICAgICByYW5nZS0+ZnJlcVt2YWxdLm0gPSBjaGFubmVsc1tpXTsKKyAgICAgICAgcmFuZ2UtPmZyZXFbdmFsXS5lID0gNjsKKyAgICAgICAgdmFsKys7CisgICAgfQorCisgICAgcmFuZ2UtPm51bV9jaGFubmVscyA9IGNoYW5uZWxfbnVtOworICAgIHJhbmdlLT5udW1fZnJlcXVlbmN5ID0gY2hhbm5lbF9udW07CisKKyNpZiAwCisgICAgcmFuZ2UtPm51bV9jaGFubmVscyA9IDE0OyAvLyBPbmx5IDIuNEcKKworLyogWFhYIG5lZWQgdG8gZmlsdGVyIGFnYWluc3QgdGhlIHJlZ3VsYXRvcnkgZG9tYWluICZ8IGFjdGl2ZSBzZXQgKi8KKyAgICB2YWwgPSAwOworICAgIGZvciAoaSA9IDE7IGkgPD0gMTQ7IGkrKykgLy8gQixHIEJhbmRzCisgICAgeworICAgICAgICByYW5nZS0+ZnJlcVt2YWxdLmkgPSBpOworICAgICAgICBpZiAoaSA9PSAxNCkKKyAgICAgICAgICAgICAgcmFuZ2UtPmZyZXFbdmFsXS5tID0gMjQ4NDAwMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICByYW5nZS0+ZnJlcVt2YWxdLm0gPSAoMjQxMisoaS0xKSo1KSoxMDAwOworICAgICAgICByYW5nZS0+ZnJlcVt2YWxdLmUgPSAzOworICAgICAgICB2YWwrKzsKKyAgICB9CisKKyAgICBudW1fYmFuZF9hID0gKElXX01BWF9GUkVRVUVOQ0lFUyAtIHZhbCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2JhbmRfYTsgaSsrKSAvLyBBIEJhbmRzCisgICAgeworICAgICAgICByYW5nZS0+ZnJlcVt2YWxdLmkgPSBjaGFubmVsX2ZyZXF1ZW5jeV8xMUFbMiAqIGldOworICAgICAgICByYW5nZS0+ZnJlcVt2YWxdLm0gPSBjaGFubmVsX2ZyZXF1ZW5jeV8xMUFbMiAqIGkgKyAxXSAqIDEwMDA7CisgICAgICAgIHJhbmdlLT5mcmVxW3ZhbF0uZSA9IDM7CisgICAgICAgIHZhbCsrOworICAgIH0KKyAgICAvLyBNSU1PIFJhdGUgTm90IERlZmluZWQgTm93CisgICAgLy9Gb3IgODAyLjExYSwgdGhlcmUgYXJlIHRvbyBtb3JlIGZyZXF1ZW5jeS4gV2UgY2FuJ3QgcmV0dXJuIHRoZW0gYWxsCisgICAgcmFuZ2UtPm51bV9mcmVxdWVuY3kgPSB2YWw7CisjZW5kaWYKKworLyogTWF4IG9mIC9wcm9jL25ldC93aXJlbGVzcyAqLworICAgIHJhbmdlLT5tYXhfcXVhbC5xdWFsID0gMTAwOyAvLz8/ICAgICAgICAgICAgICAgICAgLy85MjsKKyAgICByYW5nZS0+bWF4X3F1YWwubGV2ZWwgPSAxNTQ7IC8vPz8KKyAgICByYW5nZS0+bWF4X3F1YWwubm9pc2UgPSAxNTQ7IC8vPz8KKyAgICByYW5nZS0+c2Vuc2l0aXZpdHkgPSAzOyAvLz8/CisKKy8vIFhYWCB0aGVzZSBuZWVkIHRvIGJlIG5zZC1zcGVjaWZpYyEKKyAgICByYW5nZS0+bWluX3J0cyA9IDA7CisgICAgcmFuZ2UtPm1heF9ydHMgPSAyMzQ3OworICAgIHJhbmdlLT5taW5fZnJhZyA9IDI1NjsKKyAgICByYW5nZS0+bWF4X2ZyYWcgPSAyMzQ2OworICAgIHJhbmdlLT5tYXhfZW5jb2RpbmdfdG9rZW5zID0gNC8qTlVNX1dFUEtFWVMqLzsgLy8/PworICAgIHJhbmdlLT5udW1fZW5jb2Rpbmdfc2l6ZXMgPSAyOyAvLz8/CisKKyAgICByYW5nZS0+ZW5jb2Rpbmdfc2l6ZVswXSA9IDU7IC8vPz8gICAgICAgICAgICAgICAvL1dFUCBLZXkgRW5jb2RpbmcgU2l6ZQorICAgIHJhbmdlLT5lbmNvZGluZ19zaXplWzFdID0gMTM7Ly8/PworCisvLyBYWFggd2hhdCBhYm91dCBudW1fYml0cmF0ZXMvdGhyb3VnaHB1dD8KKyAgICByYW5nZS0+bnVtX2JpdHJhdGVzID0gMDsgLy8/PworCisvKiBlc3RpbWF0ZWQgbWF4IHRocm91Z2hwdXQgKi8KKy8vIFhYWCBuZWVkIHRvIGNhcCBpdCBpZiB3ZSdyZSBydW5uaW5nIGF0IH4yTWJwcy4uCisKKyAgICByYW5nZS0+dGhyb3VnaHB1dCA9IDMwMDAwMDAwMDsKKworICAgIHJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9zaXdhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKk1hY0FkZHIsIGNoYXIgKmV4dHJhKQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKworICAgIGlmKCFuZXRpZl9ydW5uaW5nKGRldikpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgaWYgKHpmaVdsYW5RdWVyeVdsYW5Nb2RlKGRldikgPT0gWk1fTU9ERV9BUCkgLy8gQVAgTW9kZQorICAgICAgICB6ZmlXbGFuU2V0TWFjQWRkcmVzcyhkZXYsKHUxNl90ICopJk1hY0FkZHItPnNhX2RhdGFbMF0pOworICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1NUQSBNb2RlCisgICAgICAgIHpmaVdsYW5TZXRCc3NpZChkZXYsJk1hY0FkZHItPnNhX2RhdGFbMF0pOworCisgICAgaWYgKG1hY3AtPkRldmljZU9wZW5lZCA9PSAxKQorICAgIHsKKyAgICAgICAgLy91OF90IHdwYWllTGVuLHdwYWllWzgwXTsKKyAgICAgICAgLy96ZmlXbGFuUXVlcnlXcGFJZShkZXYsIHdwYWllLCAmd3BhaWVMZW4pOworICAgICAgICB6ZmlXbGFuRGlzYWJsZShkZXYsIDApOworICAgICAgICB6ZmlXbGFuRW5hYmxlKGRldik7CisgICAgICAgIC8vaWYgKHdwYWllTGVuID4gMikKKyAgICAgICAgLy8gICAgemZpV2xhblNldFdwYUllKGRldiwgd3BhaWUsIHdwYWllTGVuKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHVzYmRydndleHRfZ2l3YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKk1hY0FkZHIsIGNoYXIgKmV4dHJhKQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKworICAgIGlmIChtYWNwLT5EZXZpY2VPcGVuZWQgIT0gMSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoemZpV2xhblF1ZXJ5V2xhbk1vZGUoZGV2KSA9PSBaTV9NT0RFX0FQKSAvLyBBUCBNb2RlCisgICAgICAgIHpmaVdsYW5RdWVyeU1hY0FkZHJlc3MoZGV2LCAmTWFjQWRkci0+c2FfZGF0YVswXSk7CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vU1RBIE1vZGUKKyAgICB7CisgICAgICAgIGlmIChtYWNwLT5hZGFwdGVyU3RhdGUgPT0gWk1fU1RBVFVTX01FRElBX0NPTk5FQ1QpCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmaVdsYW5RdWVyeUJzc2lkKGRldiwgJk1hY0FkZHItPnNhX2RhdGFbMF0pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdThfdCB6ZXJvX2FkZHJbNl0gPSB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKyAgICAgICAgICAgIG1lbWNweSgmTWFjQWRkci0+c2FfZGF0YVswXSwgemVyb19hZGRyLCBzaXplb2YoemVyb19hZGRyKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHVzYmRydndleHRfaXdhcGxpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQoreworICAgIC8vRG9uJ3Qga25vdyBob3cgdG8gZG8geWV0LS1DV1lhbmcoKykKKyAgICByZXR1cm4gMDsKKworfQorCitpbnQgdXNiZHJ2d2V4dF9zaXdzY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgaWYgKG1hY3AtPkRldmljZU9wZW5lZCAhPSAxKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHByaW50aygiQ1dZIC0gdXNiZHJ2d2V4dF9zaXdzY2FuXG4iKTsKKworICAgIHpmaVdsYW5TY2FuKGRldik7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHVzYmRydndleHRfZ2l3c2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworICAgIC8vc3RydWN0IHpzV2xhbkRldiogd2QgPSAoc3RydWN0IHpzV2xhbkRldiopIHptd193bGFuX2RldihkZXYpOworICAgIGNoYXIgKmN1cnJlbnRfZXYgPSBleHRyYTsKKyAgICBjaGFyICplbmRfYnVmOworICAgIGludCBpOworICAgIC8vc3RydWN0IHpzQnNzTGlzdCBCc3NMaXN0OworICAgIHN0cnVjdCB6c0Jzc0xpc3RWMSAqcEJzc0xpc3QgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgenNCc3NMaXN0VjEpLCBHRlBfS0VSTkVMKTsKKyAgICAvL0Jzc0xpc3QgPSB3ZC0+c3RhLnBCc3NMaXN0OworICAgIC8vem13X2dldF93bGFuX2RldihkZXYpOworCisgICAgaWYgKG1hY3AtPkRldmljZU9wZW5lZCAhPSAxKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChkYXRhLT5sZW5ndGggPT0gMCkKKyAgICB7CisgICAgICAgZW5kX2J1ZiA9IGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZW5kX2J1ZiA9IGV4dHJhICsgZGF0YS0+bGVuZ3RoOworICAgIH0KKworICAgIHByaW50aygiZ2l3c2NhbiAtIFJlcG9ydCBTY2FuIFJlc3VsdHNcbiIpOworICAgIC8vcHJpbnRrKCJnaXdzY2FuIC0gQnNzTGlzdCBTcmV1Y3R1cmUgTGVuIDogJWRcbiIsIHNpemVvZihCc3NMaXN0KSk7CisgICAgLy9wcmludGsoImdpd3NjYW4gLSBCc3NMaXN0IENvdW50IDogJWRcbiIsIHdkLT5zdGEucEJzc0xpc3QtPmJzc0NvdW50KTsKKyAgICAvL3ByaW50aygiZ2l3c2NhbiAtIFVwZGF0ZUJzc0xpc3QgQ291bnQgOiAlZFxuIiwgd2QtPnN0YS5wVXBkYXRlQnNzTGlzdC0+YnNzQ291bnQpOworICAgIHpmaVdsYW5RdWVyeUJzc0xpc3RWMShkZXYsIHBCc3NMaXN0KTsKKyAgICAvL3pmaVdsYW5RdWVyeUJzc0xpc3QoZGV2LCAmQnNzTGlzdCk7CisKKy8qIFJlYWQgYW5kIHBhcnNlIGFsbCBlbnRyaWVzICovCisgICAgcHJpbnRrKCJnaXdzY2FuIC0gcEJzc0xpc3QtPmJzc0NvdW50IDogJWRcbiIsIHBCc3NMaXN0LT5ic3NDb3VudCk7CisgICAgLy9wcmludGsoImdpd3NjYW4gLSBCc3NMaXN0LmJzc0NvdW50IDogJWRcbiIsIEJzc0xpc3QuYnNzQ291bnQpOworCisgICAgZm9yIChpID0gMDsgaSA8IHBCc3NMaXN0LT5ic3NDb3VudDsgaSsrKQorICAgIHsKKy8qIFRyYW5zbGF0ZSB0byBXRSBmb3JtYXQgdGhpcyBlbnRyeSAqLworICAgICAgICAvL2N1cnJlbnRfZXYgPSB1c2JkcnZfdHJhbnNsYXRlX3NjYW4oZGV2LCBpbmZvLCBjdXJyZW50X2V2LAorICAgICAgICAvLyAgICBleHRyYSArIElXX1NDQU5fTUFYX0RBVEEsICZwQnNzTGlzdC0+YnNzSW5mb1tpXSk7CisgICAgICAgIGN1cnJlbnRfZXYgPSB1c2JkcnZfdHJhbnNsYXRlX3NjYW4oZGV2LCBpbmZvLCBjdXJyZW50X2V2LAorICAgICAgICAgICAgZW5kX2J1ZiwgJnBCc3NMaXN0LT5ic3NJbmZvW2ldKTsKKworI2lmIFdJUkVMRVNTX0VYVCA+IDE2CisgICAgICAgIGlmIChjdXJyZW50X2V2ID09IGVuZF9idWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGtmcmVlKHBCc3NMaXN0KTsKKyAgICAgICAgICAgIGRhdGEtPmxlbmd0aCA9IGN1cnJlbnRfZXYgLSBleHRyYTsKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKworLyogTGVuZ3RoIG9mIGRhdGEgKi8KKyAgICBkYXRhLT5sZW5ndGggPSAoY3VycmVudF9ldiAtIGV4dHJhKTsKKyAgICBkYXRhLT5mbGFncyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdG9kbyAqLworCisgICAga2ZyZWUocEJzc0xpc3QpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X3Npd2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgc3RydWN0IGl3X3BvaW50ICplc3NpZCwgY2hhciAqZXh0cmEpCit7CisgICAgY2hhciBFc3NpZEJ1ZltJV19FU1NJRF9NQVhfU0laRSsxXTsKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisKKyAgICBpZighbmV0aWZfcnVubmluZyhkZXYpKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIGlmIChlc3NpZC0+ZmxhZ3MgPT0gMSkKKyAgICB7CisgICAgICAgIGlmIChlc3NpZC0+bGVuZ3RoID4gKElXX0VTU0lEX01BWF9TSVpFKzEpKQorICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKworICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoJkVzc2lkQnVmLCBlc3NpZC0+cG9pbnRlciwgZXNzaWQtPmxlbmd0aCkpCisgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKworICAgICAgICBFc3NpZEJ1Zltlc3NpZC0+bGVuZ3RoXSA9ICdcMCc7CisgICAgICAgIC8vcHJpbnRrKCJzaXdlc3NpZCAtIFNldCBFc3NpZCA6ICVzXG4iLEVzc2lkQnVmKTsKKyAgICAgICAgLy9wcmludGsoInNpd2Vzc2lkIC0gRXNzaWQgTGVuIDogJWRcbiIsZXNzaWQtPmxlbmd0aCk7CisgICAgICAgIC8vcHJpbnRrKCJzaXdlc3NpZCAtIEVzc2lkIEZsYWcgOiAleFxuIixlc3NpZC0+ZmxhZ3MpOworICAgICAgICBpZiAobWFjcC0+RGV2aWNlT3BlbmVkID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHpmaVdsYW5TZXRTU0lEKGRldiwgRXNzaWRCdWYsIHN0cmxlbihFc3NpZEJ1ZikpOworICAgICAgICAgICAgemZpV2xhblNldEZyZXF1ZW5jeShkZXYsIHpmaVdsYW5RdWVyeUZyZXF1ZW5jeShkZXYpLCBGQUxTRSk7CisgICAgICAgICAgICB6ZmlXbGFuU2V0RW5jcnlNb2RlKGRldiwgemZpV2xhblF1ZXJ5RW5jcnlNb2RlKGRldikpOworICAgICAgICAgICAgLy91OF90IHdwYWllTGVuLHdwYWllWzUwXTsKKyAgICAgICAgICAgIC8vemZpV2xhblF1ZXJ5V3BhSWUoZGV2LCB3cGFpZSwgJndwYWllTGVuKTsKKyAgICAgICAgICAgIHpmaVdsYW5EaXNhYmxlKGRldiwgMCk7CisgICAgICAgICAgICB6ZmlXbGFuRW5hYmxlKGRldik7CisgICAgICAgICAgICAvL2lmICh3cGFpZUxlbiA+IDIpCisgICAgICAgICAgICAvLyAgICB6ZmlXbGFuU2V0V3BhSWUoZGV2LCB3cGFpZSwgd3BhaWVMZW4pOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X2dpd2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgc3RydWN0IGl3X3BvaW50ICplc3NpZCwgY2hhciAqZXh0cmEpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworICAgIHU4X3QgRXNzaWRMZW47CisgICAgY2hhciBFc3NpZEJ1ZltJV19FU1NJRF9NQVhfU0laRSsxXTsKKyAgICBpbnQgc3NpZF9sZW47CisKKyAgICBpZighbmV0aWZfcnVubmluZyhkZXYpKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIGlmIChtYWNwLT5EZXZpY2VPcGVuZWQgIT0gMSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICB6ZmlXbGFuUXVlcnlTU0lEKGRldiwgJkVzc2lkQnVmWzBdLCAmRXNzaWRMZW4pOworCisgICAgLyogQ29udmVydCB0eXBlIGZyb20gdW5zaWduZWQgY2hhciB0byBjaGFyICovCisgICAgc3NpZF9sZW4gPSAoaW50KUVzc2lkTGVuOworCisgICAgLyogTWFrZSBzdXJlIHRoZSBlc3NpZCBsZW5ndGggaXMgbm90IGdyZWF0ZXIgdGhhbiBJV19FU1NJRF9NQVhfU0laRSAqLworICAgIGlmIChzc2lkX2xlbiA+IElXX0VTU0lEX01BWF9TSVpFKQorICAgICAgICBzc2lkX2xlbiA9IElXX0VTU0lEX01BWF9TSVpFOworCisgICAgRXNzaWRCdWZbc3NpZF9sZW5dID0gJ1wwJzsKKworICAgIGVzc2lkLT5mbGFncyA9IDE7CisgICAgZXNzaWQtPmxlbmd0aCA9IHN0cmxlbihFc3NpZEJ1Zik7CisKKyAgICBtZW1jcHkoZXh0cmEsIEVzc2lkQnVmLCBlc3NpZC0+bGVuZ3RoKTsKKyAgICAvLyB3aXJlbGVzcy5jIGluIEtlcm5lbCB3b3VsZCBoYW5kbGUgY29weV90b191c2VyIC0tIGxpbmUgNjc5CisgICAgLyppZiAoZXNzaWQtPnBvaW50ZXIpCisgICAgeworICAgICAgICBpZiAoIGNvcHlfdG9fdXNlcihlc3NpZC0+cG9pbnRlciwgRXNzaWRCdWYsIGVzc2lkLT5sZW5ndGgpICkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKCJnaXdlc3NpZCAtIGNvcHlfdG9fdXNlciBGYWlsXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgICAgICB9CisgICAgfSovCisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHVzYmRydndleHRfc2l3bmlja24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKm5pY2tuYW1lKQoreworICAgIC8vRXhpc3QgYnV0IGp1bmstLUNXWWFuZygrKQorCXJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9naXduaWNrbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqbmlja25hbWUpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworICAgIHU4X3QgRXNzaWRMZW47CisgICAgY2hhciBFc3NpZEJ1ZltJV19FU1NJRF9NQVhfU0laRSsxXTsKKworICAgIGlmIChtYWNwLT5EZXZpY2VPcGVuZWQgIT0gMSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICB6ZmlXbGFuUXVlcnlTU0lEKGRldiwgJkVzc2lkQnVmWzBdLCAmRXNzaWRMZW4pOworICAgIEVzc2lkQnVmW0Vzc2lkTGVuXSA9IDA7CisKKyAgICBkYXRhLT5mbGFncyA9IDE7CisgICAgZGF0YS0+bGVuZ3RoID0gc3RybGVuKEVzc2lkQnVmKTsKKworICAgIG1lbWNweShuaWNrbmFtZSwgRXNzaWRCdWYsIGRhdGEtPmxlbmd0aCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHVzYmRydndleHRfc2l3cmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgIHN0cnVjdCBpd19wYXJhbSAqZnJxLCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgLy9BcnJheSB0byBEZWZpbmUgUmF0ZSBOdW1iZXIgdGhhdCBTZW5kIHRvIERyaXZlcgorICAgIHUxNl90IHpjSW5kZXh0b1JhdGVCR1sxNl0gPSB7MTAwMCwgMjAwMCwgNTUwMCwgMTEwMDAsIDAsIDAsIDAsIDAsIDQ4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MDAwLCAxMjAwMCwgNjAwMCwgNTQwMDAsIDM2MDAwLCAxODAwMCwgOTAwMH07CisgICAgdTE2X3QgemNSYXRlVG9NQ1NbXSA9IHsweGZmLCAwLCAxLCAyLCAzLCAweGIsIDB4ZiwgMHhhLCAweGUsIDB4OSwgMHhkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4LCAweGN9OworICAgIHU4X3QgaSxSYXRlSW5kZXggPSA0OworICAgIHUxNl90IFJhdGVLYnBzOworCisgICAgLy9wcmludGsoImZycS0+ZGlzYWJsZWQgOiAweCV4XG4iLGZycS0+ZGlzYWJsZWQpOworICAgIC8vcHJpbnRrKCJmcnEtPnZhbHVlIDogMHgleFxuIixmcnEtPnZhbHVlKTsKKworICAgIFJhdGVLYnBzID0gZnJxLT52YWx1ZSAvIDEwMDA7CisgICAgLy9wcmludGsoIlJhdGVLYnBzIDogJWRcbiIsIFJhdGVLYnBzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChSYXRlS2JwcyA9PSB6Y0luZGV4dG9SYXRlQkdbaV0pCisgICAgICAgICAgICBSYXRlSW5kZXggPSBpOworICAgIH0KKyAgICBpZiAoemNJbmRleHRvUmF0ZUJHW1JhdGVJbmRleF0gPT0gMCkKKyAgICAgICAgUmF0ZUluZGV4ID0gMHhmZjsKKyAgICAvL3ByaW50aygiUmF0ZUluZGV4IDogJXhcbiIsIFJhdGVJbmRleCk7CisgICAgZm9yIChpID0gMDsgaSA8IDEzOyBpKyspCisgICAgICAgIGlmIChSYXRlSW5kZXggPT0gemNSYXRlVG9NQ1NbaV0pCisgICAgICAgICAgICBicmVhazsKKyAgICAvL3ByaW50aygiSW5kZXggOiAleFxuIiwgaSk7CisgICAgaWYgKFJhdGVLYnBzID09IDY1MDAwKQorICAgIHsKKyAgICAgICAgUmF0ZUluZGV4ID0gMjA7CisgICAgICAgIHByaW50aygiUmF0ZUluZGV4IDogJWRcbiIsIFJhdGVJbmRleCk7CisgICAgfQorICAgIGlmIChtYWNwLT5EZXZpY2VPcGVuZWQgPT0gMSkKKyAgICB7CisgICAgICAgIHpmaVdsYW5TZXRUeFJhdGUoZGV2LCBpKTsKKyAgICAgICAgLy96ZmlXbGFuRGlzYWJsZShkZXYpOworICAgICAgICAvL3pmaVdsYW5FbmFibGUoZGV2KTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHVzYmRydndleHRfZ2l3cmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgIHN0cnVjdCBpd19wYXJhbSAqZnJxLCBjaGFyICpleHRyYSkKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisKKyAgICBpZighbmV0aWZfcnVubmluZyhkZXYpKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIGlmIChtYWNwLT5EZXZpY2VPcGVuZWQgIT0gMSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBmcnEtPmZpeGVkID0gMDsKKyAgICBmcnEtPmRpc2FibGVkID0gMDsKKyAgICBmcnEtPnZhbHVlID0gemZpV2xhblF1ZXJ5UnhSYXRlKGRldikgKiAxMDAwOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X3Npd3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgIHN0cnVjdCBpd19wYXJhbSAqcnRzLCBjaGFyICpleHRyYSkKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgaW50IHZhbCA9IHJ0cy0+dmFsdWU7CisKKyAgICBpZiAobWFjcC0+RGV2aWNlT3BlbmVkICE9IDEpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKHJ0cy0+ZGlzYWJsZWQpCisgICAgICAgIHZhbCA9IDIzNDc7CisKKyAgICBpZiAoKHZhbCA8IDApIHx8ICh2YWwgPiAyMzQ3KSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICB6ZmlXbGFuU2V0UnRzVGhyZXNob2xkKGRldix2YWwpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X2dpd3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgIHN0cnVjdCBpd19wYXJhbSAqcnRzLCBjaGFyICpleHRyYSkKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisKKyAgICBpZighbmV0aWZfcnVubmluZyhkZXYpKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIGlmIChtYWNwLT5EZXZpY2VPcGVuZWQgIT0gMSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBydHMtPnZhbHVlID0gemZpV2xhblF1ZXJ5UnRzVGhyZXNob2xkKGRldik7CisgICAgcnRzLT5kaXNhYmxlZCA9IChydHMtPnZhbHVlID49IDIzNDcpOworICAgIHJ0cy0+Zml4ZWQgPSAxOworCisgICAgcmV0dXJuIDA7CisKK30KKworaW50IHVzYmRydndleHRfc2l3ZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgIHN0cnVjdCBpd19wYXJhbSAqZnJhZywgY2hhciAqZXh0cmEpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworICAgIHUxNl90IGZyYWdUaHJlc2hvbGQ7CisKKyAgICBpZiAobWFjcC0+RGV2aWNlT3BlbmVkICE9IDEpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKGZyYWctPmRpc2FibGVkKQorICAgICAgICBmcmFnVGhyZXNob2xkID0gMDsKKyAgICBlbHNlCisgICAgICAgIGZyYWdUaHJlc2hvbGQgPSBmcmFnLT52YWx1ZTsKKworICAgIHpmaVdsYW5TZXRGcmFnVGhyZXNob2xkKGRldixmcmFnVGhyZXNob2xkKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9naXdmcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgc3RydWN0IGl3X3BhcmFtICpmcmFnLCBjaGFyICpleHRyYSkKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgdTE2IHZhbDsKKyAgICB1bnNpZ25lZCBsb25nIGlycUZsYWc7CisKKyAgICBpZighbmV0aWZfcnVubmluZyhkZXYpKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIGlmIChtYWNwLT5EZXZpY2VPcGVuZWQgIT0gMSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CisKKyAgICB2YWwgPSB6ZmlXbGFuUXVlcnlGcmFnVGhyZXNob2xkKGRldik7CisKKyAgICBmcmFnLT52YWx1ZSA9IHZhbDsKKworICAgIGZyYWctPmRpc2FibGVkID0gKHZhbCA+PSAyMzQ2KTsKKyAgICBmcmFnLT5maXhlZCA9IDE7CisKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9zaXd0eHBvdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wYXJhbSAqcnJxLCBjaGFyICpleHRyYSkKK3sKKyAgICAvL05vdCBzdXBwb3J0IHlldC0tQ1dZbmcoKykKKwlyZXR1cm4gMDsKK30KKworaW50IHVzYmRydndleHRfZ2l3dHhwb3coc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcGFyYW0gKnJycSwgY2hhciAqZXh0cmEpCit7CisgICAgLy9Ob3Qgc3VwcG9ydCB5ZXQtLUNXWW5nKCspCisJcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X3Npd3JldHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BhcmFtICpycnEsIGNoYXIgKmV4dHJhKQoreworICAgIC8vRG8gbm90aGluZy0tQ1dZYW5nKCspCisJcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X2dpd3JldHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BhcmFtICpycnEsIGNoYXIgKmV4dHJhKQoreworICAgIC8vRG8gbm90aGluZy0tQ1dZYW5nKCspCisJcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X3Npd2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgIHN0cnVjdCBpd19wb2ludCAqZXJxLCBjaGFyICprZXkpCit7CisgICAgc3RydWN0IHpzS2V5SW5mbyBrZXlJbmZvOworICAgIGludCBpLCBXZXBTdGF0ZSA9IFpNX0VOQ1JZUFRJT05fV0VQX0RJU0FCTEVEOworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKworICAgIGlmKCFuZXRpZl9ydW5uaW5nKGRldikpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgaWYgKChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKSA9PSAwKQorICAgIHsKKyAgICAgICAga2V5SW5mby5rZXkgPSBrZXk7CisgICAgICAgIGtleUluZm8ua2V5TGVuZ3RoID0gZXJxLT5sZW5ndGg7CisgICAgICAgIGtleUluZm8ua2V5SW5kZXggPSAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOworICAgICAgICBpZiAoa2V5SW5mby5rZXlJbmRleCA+PSA0KQorICAgICAgICAgICAga2V5SW5mby5rZXlJbmRleCA9IDA7CisgICAgICAgIGtleUluZm8uZmxhZyA9IFpNX0tFWV9GTEFHX0RFRkFVTFRfS0VZOworCisgICAgICAgIHpmaVdsYW5TZXRLZXkoZGV2LCBrZXlJbmZvKTsKKyAgICAgICAgV2VwU3RhdGUgPSBaTV9FTkNSWVBUSU9OX1dFUF9FTkFCTEVEOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgemZpV2xhblJlbW92ZUtleShkZXYsIDAsIGkpOworICAgICAgICBXZXBTdGF0ZSA9IFpNX0VOQ1JZUFRJT05fV0VQX0RJU0FCTEVEOworICAgICAgICAvL3pmaVdsYW5TZXRFbmNyeU1vZGUoZGV2LCBaTV9OT19XRVApOworICAgIH0KKworICAgIGlmIChtYWNwLT5EZXZpY2VPcGVuZWQgPT0gMSkKKyAgICB7CisgICAgICAgIHpmaVdsYW5TZXRXZXBTdGF0dXMoZGV2LCBXZXBTdGF0ZSk7CisgICAgICAgIHpmaVdsYW5TZXRGcmVxdWVuY3koZGV2LCB6ZmlXbGFuUXVlcnlGcmVxdWVuY3koZGV2KSwgRkFMU0UpOworICAgICAgICAvL3pmaVdsYW5TZXRFbmNyeU1vZGUoZGV2LCB6ZmlXbGFuUXVlcnlFbmNyeU1vZGUoZGV2KSk7CisgICAgICAgIC8vdThfdCB3cGFpZUxlbix3cGFpZVs1MF07CisgICAgICAgIC8vemZpV2xhblF1ZXJ5V3BhSWUoZGV2LCB3cGFpZSwgJndwYWllTGVuKTsKKyAgICAgICAgemZpV2xhbkRpc2FibGUoZGV2LCAwKTsKKyAgICAgICAgemZpV2xhbkVuYWJsZShkZXYpOworICAgICAgICAvL2lmICh3cGFpZUxlbiA+IDIpCisgICAgICAgIC8vICAgIHpmaVdsYW5TZXRXcGFJZShkZXYsIHdwYWllLCB3cGFpZUxlbik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X2dpd2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgIHN0cnVjdCBpd19wb2ludCAqZXJxLCBjaGFyICprZXkpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworICAgIHU4X3QgRW5jcnlwdGlvbk1vZGU7CisgICAgdThfdCBrZXlMZW4gPSAwOworCisgICAgaWYgKG1hY3AtPkRldmljZU9wZW5lZCAhPSAxKQorICAgICAgICByZXR1cm4gMDsKKworICAgIEVuY3J5cHRpb25Nb2RlID0gemZpV2xhblF1ZXJ5RW5jcnlNb2RlKGRldik7CisKKyAgICBpZiAoRW5jcnlwdGlvbk1vZGUpCisgICAgeworICAgICAgICBlcnEtPmZsYWdzID0gSVdfRU5DT0RFX0VOQUJMRUQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGVycS0+ZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7CisgICAgfQorCisvKiBXZSBjYW4ndCByZXR1cm4gdGhlIGtleSwgc28gc2V0IHRoZSBwcm9wZXIgZmxhZyBhbmQgcmV0dXJuIHplcm8gKi8KKyAgICBlcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9OT0tFWTsKKyAgICBtZW1zZXQoa2V5LCAwLCAxNik7CisKKy8qIENvcHkgdGhlIGtleSB0byB0aGUgdXNlciBidWZmZXIgKi8KKyAgICBzd2l0Y2goRW5jcnlwdGlvbk1vZGUpCisgICAgeworICAgICAgICBjYXNlIFpNX1dFUDY0OgorICAgICAgICAgICAga2V5TGVuID0gNTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFpNX1dFUDEyODoKKyAgICAgICAgICAgIGtleUxlbiA9IDEzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgWk1fV0VQMjU2OgorICAgICAgICAgICAga2V5TGVuID0gMjk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBaTV9BRVM6CisgICAgICAgICAgICBrZXlMZW4gPSAxNjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFpNX1RLSVA6CisgICAgICAgICAgICBrZXlMZW4gPSAzMjsKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgICAgIGNhc2UgWk1fQ0VOQzoKKyAgICAgICAgICAgIGtleUxlbiA9IDMyOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworICAgICAgICBjYXNlIFpNX05PX1dFUDoKKyAgICAgICAgICAgIGtleUxlbiA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICBrZXlMZW4gPSAwOworICAgICAgICAgICAgcHJpbnRrKCJVbmtub3duIEVuY3J5TW9kZVxuIik7CisgICAgICAgICAgICBicmVhazsKKworICAgIH0KKyAgICBlcnEtPmxlbmd0aCA9IGtleUxlbjsKKworICAgIHJldHVybiAwOworfQorCitpbnQgdXNiZHJ2d2V4dF9zaXdwb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgIHN0cnVjdCBpd19wYXJhbSAqZnJxLCBjaGFyICpleHRyYSkKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgdThfdCBQU01vZGU7CisKKyAgICBpZiAobWFjcC0+RGV2aWNlT3BlbmVkICE9IDEpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKGZycS0+ZGlzYWJsZWQpCisgICAgICAgIFBTTW9kZSA9IFpNX1NUQV9QU19OT05FOworICAgIGVsc2UKKyAgICAgICAgUFNNb2RlID0gWk1fU1RBX1BTX01BWDsKKworICAgIHpmaVdsYW5TZXRQb3dlclNhdmVNb2RlKGRldixQU01vZGUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X2dpd3Bvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgc3RydWN0IGl3X3BhcmFtICpmcnEsIGNoYXIgKmV4dHJhKQoreworICAgIHVuc2lnbmVkIGxvbmcgaXJxRmxhZzsKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisKKyAgICBpZiAobWFjcC0+RGV2aWNlT3BlbmVkICE9IDEpCisgICAgICAgIHJldHVybiAwOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworCisgICAgaWYgKHpmaVdsYW5RdWVyeVBvd2VyU2F2ZU1vZGUoZGV2KSA9PSBaTV9TVEFfUFNfTk9ORSkKKyAgICAgICAgZnJxLT5kaXNhYmxlZCA9IDE7CisgICAgZWxzZQorICAgICAgICBmcnEtPmRpc2FibGVkID0gMDsKKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8vaW50IHVzYmRydndleHRfc2V0cGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKy8vCQkgICAJIHZvaWQgKncsIGNoYXIgKmV4dHJhKQorLy97CisvLwlzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAgPSBkZXYtPm1sX3ByaXY7CisvLwlzdHJ1Y3QgaWVlZTgwMjExY29tICppYyA9IHZhcC0+aXZfaWM7CisvLwlzdHJ1Y3QgaWVlZTgwMjExX3JzbnBhcm1zICpyc24gPSAmdmFwLT5pdl9ic3MtPm5pX3JzbjsKKy8vCWludCAqaSA9IChpbnQgKikgZXh0cmE7CisvLwlpbnQgcGFyYW0gPSBpWzBdOwkJLyogcGFyYW1ldGVyIGlkIGlzIDFzdCAqLworLy8JaW50IHZhbHVlID0gaVsxXTsJCS8qIE5COiBtb3N0IHZhbHVlcyBhcmUgVFlQRV9JTlQgKi8KKy8vCWludCByZXR2ID0gMDsKKy8vCWludCBqLCBjYXBzOworLy8JY29uc3Qgc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdG9yICphdXRoOworLy8JY29uc3Qgc3RydWN0IGllZWU4MDIxMV9hY2xhdG9yICphY2w7CisvLworLy8Jc3dpdGNoIChwYXJhbSkgeworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fQVVUSE1PREU6CisvLwkJc3dpdGNoICh2YWx1ZSkgeworLy8JCWNhc2UgSUVFRTgwMjExX0FVVEhfV1BBOgkvKiBXUEEgKi8KKy8vCQljYXNlIElFRUU4MDIxMV9BVVRIXzgwMjFYOgkvKiA4MDIuMXggKi8KKy8vCQljYXNlIElFRUU4MDIxMV9BVVRIX09QRU46CS8qIG9wZW4gKi8KKy8vCQljYXNlIElFRUU4MDIxMV9BVVRIX1NIQVJFRDoJLyogc2hhcmVkLWtleSAqLworLy8JCWNhc2UgSUVFRTgwMjExX0FVVEhfQVVUTzoJLyogYXV0byAqLworLy8JCQlhdXRoID0gaWVlZTgwMjExX2F1dGhlbnRpY2F0b3JfZ2V0KHZhbHVlKTsKKy8vCQkJaWYgKGF1dGggPT0gTlVMTCkKKy8vCQkJCXJldHVybiAtRUlOVkFMOworLy8JCQlicmVhazsKKy8vCQlkZWZhdWx0OgorLy8JCQlyZXR1cm4gLUVJTlZBTDsKKy8vCQl9CisvLwkJc3dpdGNoICh2YWx1ZSkgeworLy8JCWNhc2UgSUVFRTgwMjExX0FVVEhfV1BBOgkvKiBXUEEgdy8gODAyLjF4ICovCisvLwkJCXZhcC0+aXZfZmxhZ3MgfD0gSUVFRTgwMjExX0ZfUFJJVkFDWTsKKy8vCQkJdmFsdWUgPSBJRUVFODAyMTFfQVVUSF84MDIxWDsKKy8vCQkJYnJlYWs7CisvLwkJY2FzZSBJRUVFODAyMTFfQVVUSF9PUEVOOgkvKiBvcGVuICovCisvLwkJCXZhcC0+aXZfZmxhZ3MgJj0gfihJRUVFODAyMTFfRl9XUEF8SUVFRTgwMjExX0ZfUFJJVkFDWSk7CisvLwkJCWJyZWFrOworLy8JCWNhc2UgSUVFRTgwMjExX0FVVEhfU0hBUkVEOgkvKiBzaGFyZWQta2V5ICovCisvLwkJY2FzZSBJRUVFODAyMTFfQVVUSF9BVVRPOgkvKiBhdXRvICovCisvLwkJY2FzZSBJRUVFODAyMTFfQVVUSF84MDIxWDoJLyogODAyLjF4ICovCisvLwkJCXZhcC0+aXZfZmxhZ3MgJj0gfklFRUU4MDIxMV9GX1dQQTsKKy8vCQkJLyogYm90aCByZXF1aXJlIGEga2V5IHNvIG1hcmsgdGhlIFBSSVZBQ1kgY2FwYWJpbGl0eSAqLworLy8JCQl2YXAtPml2X2ZsYWdzIHw9IElFRUU4MDIxMV9GX1BSSVZBQ1k7CisvLwkJCWJyZWFrOworLy8JCX0KKy8vCQkvKiBOQjogYXV0aGVudGljYXRvciBhdHRhY2gvZGV0YWNoIGhhcHBlbnMgb24gc3RhdGUgY2hhbmdlICovCisvLwkJdmFwLT5pdl9ic3MtPm5pX2F1dGhtb2RlID0gdmFsdWU7CisvLwkJLyogWFhYIG1peGVkL21vZGUvdXNhZ2U/ICovCisvLwkJdmFwLT5pdl9hdXRoID0gYXV0aDsKKy8vCQlyZXR2ID0gRU5FVFJFU0VUOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fUFJPVE1PREU6CisvLwkJaWYgKHZhbHVlID4gSUVFRTgwMjExX1BST1RfUlRTQ1RTKQorLy8JCQlyZXR1cm4gLUVJTlZBTDsKKy8vCQlpYy0+aWNfcHJvdG1vZGUgPSB2YWx1ZTsKKy8vCQkvKiBOQjogaWYgbm90IG9wZXJhdGluZyBpbiAxMWcgdGhpcyBjYW4gd2FpdCAqLworLy8JCWlmIChpYy0+aWNfYnNzY2hhbiAhPSBJRUVFODAyMTFfQ0hBTl9BTllDICYmCisvLwkJICAgIElFRUU4MDIxMV9JU19DSEFOX0FOWUcoaWMtPmljX2Jzc2NoYW4pKQorLy8JCQlyZXR2ID0gRU5FVFJFU0VUOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fTUNBU1RDSVBIRVI6CisvLwkJaWYgKCh2YXAtPml2X2NhcHMgJiBjaXBoZXIyY2FwKHZhbHVlKSkgPT0gMCAmJgorLy8JCSAgICAhaWVlZTgwMjExX2NyeXB0b19hdmFpbGFibGUodmFsdWUpKQorLy8JCQlyZXR1cm4gLUVJTlZBTDsKKy8vCQlyc24tPnJzbl9tY2FzdGNpcGhlciA9IHZhbHVlOworLy8JCWlmICh2YXAtPml2X2ZsYWdzICYgSUVFRTgwMjExX0ZfV1BBKQorLy8JCQlyZXR2ID0gRU5FVFJFU0VUOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fTUNBU1RLRVlMRU46CisvLwkJaWYgKCEoMCA8IHZhbHVlICYmIHZhbHVlIDwgSUVFRTgwMjExX0tFWUJVRl9TSVpFKSkKKy8vCQkJcmV0dXJuIC1FSU5WQUw7CisvLwkJLyogWFhYIG5vIHdheSB0byB2ZXJpZnkgZHJpdmVyIGNhcGFiaWxpdHkgKi8KKy8vCQlyc24tPnJzbl9tY2FzdGtleWxlbiA9IHZhbHVlOworLy8JCWlmICh2YXAtPml2X2ZsYWdzICYgSUVFRTgwMjExX0ZfV1BBKQorLy8JCQlyZXR2ID0gRU5FVFJFU0VUOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fVUNBU1RDSVBIRVJTOgorLy8JCS8qCisvLwkJICogQ29udmVydCBjaXBoZXIgc2V0IHRvIGVxdWl2YWxlbnQgY2FwYWJpbGl0aWVzLgorLy8JCSAqIE5COiB0aGlzIGxvZ2ljIGludGVudGlvbmFsbHkgaWdub3JlcyB1bmtub3duIGFuZAorLy8JCSAqIHVuc3VwcG9ydGVkIGNpcGhlcnMgc28gZm9sa3MgY2FuIHNwZWNpZnkgMHhmZiBvcgorLy8JCSAqIHNpbWlsYXIgYW5kIGdldCBhbGwgYXZhaWxhYmxlIGNpcGhlcnMuCisvLwkJICovCisvLwkJY2FwcyA9IDA7CisvLwkJZm9yIChqID0gMTsgaiA8IDMyOyBqKyspCS8qIE5COiBza2lwIFdFUCAqLworLy8JCQlpZiAoKHZhbHVlICYgKDE8PGopKSAmJgorLy8JCQkgICAgKCh2YXAtPml2X2NhcHMgJiBjaXBoZXIyY2FwKGopKSB8fAorLy8JCQkgICAgIGllZWU4MDIxMV9jcnlwdG9fYXZhaWxhYmxlKGopKSkKKy8vCQkJCWNhcHMgfD0gMTw8ajsKKy8vCQlpZiAoY2FwcyA9PSAwKQkJCS8qIG5vdGhpbmcgYXZhaWxhYmxlICovCisvLwkJCXJldHVybiAtRUlOVkFMOworLy8JCS8qIFhYWCB2ZXJpZnkgY2lwaGVycyBvayBmb3IgdW5pY2FzdCB1c2U/ICovCisvLwkJLyogWFhYIGRpc2FsbG93IGlmIHJ1bm5pbmcgYXMgaXQnbGwgaGF2ZSBubyBlZmZlY3QgKi8KKy8vCQlyc24tPnJzbl91Y2FzdGNpcGhlcnNldCA9IGNhcHM7CisvLwkJaWYgKHZhcC0+aXZfZmxhZ3MgJiBJRUVFODAyMTFfRl9XUEEpCisvLwkJCXJldHYgPSBFTkVUUkVTRVQ7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9VQ0FTVENJUEhFUjoKKy8vCQlpZiAoKHJzbi0+cnNuX3VjYXN0Y2lwaGVyc2V0ICYgY2lwaGVyMmNhcCh2YWx1ZSkpID09IDApCisvLwkJCXJldHVybiAtRUlOVkFMOworLy8JCXJzbi0+cnNuX3VjYXN0Y2lwaGVyID0gdmFsdWU7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9VQ0FTVEtFWUxFTjoKKy8vCQlpZiAoISgwIDwgdmFsdWUgJiYgdmFsdWUgPCBJRUVFODAyMTFfS0VZQlVGX1NJWkUpKQorLy8JCQlyZXR1cm4gLUVJTlZBTDsKKy8vCQkvKiBYWFggbm8gd2F5IHRvIHZlcmlmeSBkcml2ZXIgY2FwYWJpbGl0eSAqLworLy8JCXJzbi0+cnNuX3VjYXN0a2V5bGVuID0gdmFsdWU7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9LRVlNR1RBTEdTOgorLy8JCS8qIFhYWCBjaGVjayAqLworLy8JCXJzbi0+cnNuX2tleW1nbXRzZXQgPSB2YWx1ZTsKKy8vCQlpZiAodmFwLT5pdl9mbGFncyAmIElFRUU4MDIxMV9GX1dQQSkKKy8vCQkJcmV0diA9IEVORVRSRVNFVDsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX1JTTkNBUFM6CisvLwkJLyogWFhYIGNoZWNrICovCisvLwkJcnNuLT5yc25fY2FwcyA9IHZhbHVlOworLy8JCWlmICh2YXAtPml2X2ZsYWdzICYgSUVFRTgwMjExX0ZfV1BBKQorLy8JCQlyZXR2ID0gRU5FVFJFU0VUOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fV1BBOgorLy8JCWlmICh2YWx1ZSA+IDMpCisvLwkJCXJldHVybiAtRUlOVkFMOworLy8JCS8qIFhYWCB2ZXJpZnkgY2lwaGVycyBhdmFpbGFibGUgKi8KKy8vCQl2YXAtPml2X2ZsYWdzICY9IH5JRUVFODAyMTFfRl9XUEE7CisvLwkJc3dpdGNoICh2YWx1ZSkgeworLy8JCWNhc2UgMToKKy8vCQkJdmFwLT5pdl9mbGFncyB8PSBJRUVFODAyMTFfRl9XUEExOworLy8JCQlicmVhazsKKy8vCQljYXNlIDI6CisvLwkJCXZhcC0+aXZfZmxhZ3MgfD0gSUVFRTgwMjExX0ZfV1BBMjsKKy8vCQkJYnJlYWs7CisvLwkJY2FzZSAzOgorLy8JCQl2YXAtPml2X2ZsYWdzIHw9IElFRUU4MDIxMV9GX1dQQTEgfCBJRUVFODAyMTFfRl9XUEEyOworLy8JCQlicmVhazsKKy8vCQl9CisvLwkJcmV0diA9IEVORVRSRVNFVDsJCS8qIFhYWD8gKi8KKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX1JPQU1JTkc6CisvLwkJaWYgKCEoSUVFRTgwMjExX1JPQU1JTkdfREVWSUNFIDw9IHZhbHVlICYmCisvLwkJICAgIHZhbHVlIDw9IElFRUU4MDIxMV9ST0FNSU5HX01BTlVBTCkpCisvLwkJCXJldHVybiAtRUlOVkFMOworLy8JCWljLT5pY19yb2FtaW5nID0gdmFsdWU7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9QUklWQUNZOgorLy8JCWlmICh2YWx1ZSkgeworLy8JCQkvKiBYWFggY2hlY2sgZm9yIGtleSBzdGF0ZT8gKi8KKy8vCQkJdmFwLT5pdl9mbGFncyB8PSBJRUVFODAyMTFfRl9QUklWQUNZOworLy8JCX0gZWxzZQorLy8JCQl2YXAtPml2X2ZsYWdzICY9IH5JRUVFODAyMTFfRl9QUklWQUNZOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fRFJPUFVORU5DUllQVEVEOgorLy8JCWlmICh2YWx1ZSkKKy8vCQkJdmFwLT5pdl9mbGFncyB8PSBJRUVFODAyMTFfRl9EUk9QVU5FTkM7CisvLwkJZWxzZQorLy8JCQl2YXAtPml2X2ZsYWdzICY9IH5JRUVFODAyMTFfRl9EUk9QVU5FTkM7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9DT1VOVEVSTUVBU1VSRVM6CisvLwkJaWYgKHZhbHVlKSB7CisvLwkJCWlmICgodmFwLT5pdl9mbGFncyAmIElFRUU4MDIxMV9GX1dQQSkgPT0gMCkKKy8vCQkJCXJldHVybiAtRUlOVkFMOworLy8JCQl2YXAtPml2X2ZsYWdzIHw9IElFRUU4MDIxMV9GX0NPVU5URVJNOworLy8JCX0gZWxzZQorLy8JCQl2YXAtPml2X2ZsYWdzICY9IH5JRUVFODAyMTFfRl9DT1VOVEVSTTsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX0RSSVZFUl9DQVBTOgorLy8JCXZhcC0+aXZfY2FwcyA9IHZhbHVlOwkJLyogTkI6IGZvciB0ZXN0aW5nICovCisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9NQUNDTUQ6CisvLwkJYWNsID0gdmFwLT5pdl9hY2w7CisvLwkJc3dpdGNoICh2YWx1ZSkgeworLy8JCWNhc2UgSUVFRTgwMjExX01BQ0NNRF9QT0xJQ1lfT1BFTjoKKy8vCQljYXNlIElFRUU4MDIxMV9NQUNDTURfUE9MSUNZX0FMTE9XOgorLy8JCWNhc2UgSUVFRTgwMjExX01BQ0NNRF9QT0xJQ1lfREVOWToKKy8vCQkJaWYgKGFjbCA9PSBOVUxMKSB7CisvLwkJCQlhY2wgPSBpZWVlODAyMTFfYWNsYXRvcl9nZXQoIm1hYyIpOworLy8JCQkJaWYgKGFjbCA9PSBOVUxMIHx8ICFhY2wtPmlhY19hdHRhY2godmFwKSkKKy8vCQkJCQlyZXR1cm4gLUVJTlZBTDsKKy8vCQkJCXZhcC0+aXZfYWNsID0gYWNsOworLy8JCQl9CisvLwkJCWFjbC0+aWFjX3NldHBvbGljeSh2YXAsIHZhbHVlKTsKKy8vCQkJYnJlYWs7CisvLwkJY2FzZSBJRUVFODAyMTFfTUFDQ01EX0ZMVVNIOgorLy8JCQlpZiAoYWNsICE9IE5VTEwpCisvLwkJCQlhY2wtPmlhY19mbHVzaCh2YXApOworLy8JCQkvKiBOQjogc2lsZW50bHkgaWdub3JlIHdoZW4gbm90IGluIHVzZSAqLworLy8JCQlicmVhazsKKy8vCQljYXNlIElFRUU4MDIxMV9NQUNDTURfREVUQUNIOgorLy8JCQlpZiAoYWNsICE9IE5VTEwpIHsKKy8vCQkJCXZhcC0+aXZfYWNsID0gTlVMTDsKKy8vCQkJCWFjbC0+aWFjX2RldGFjaCh2YXApOworLy8JCQl9CisvLwkJCWJyZWFrOworLy8JCX0KKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX1dNTToKKy8vCQlpZiAoaWMtPmljX2NhcHMgJiBJRUVFODAyMTFfQ19XTUUpeworLy8JCQlpZiAodmFsdWUpIHsKKy8vCQkJCXZhcC0+aXZfZmxhZ3MgfD0gSUVFRTgwMjExX0ZfV01FOworLy8JCQkJdmFwLT5pdl9pYy0+aWNfZmxhZ3MgfD0gSUVFRTgwMjExX0ZfV01FOyAvKiBYWFggbmVlZGVkIGJ5IGljX3Jlc2V0ICovCisvLwkJCX0KKy8vCQkJZWxzZSB7CisvLwkJCQl2YXAtPml2X2ZsYWdzICY9IH5JRUVFODAyMTFfRl9XTUU7CisvLwkJCQl2YXAtPml2X2ljLT5pY19mbGFncyAmPSB+SUVFRTgwMjExX0ZfV01FOyAvKiBYWFggbmVlZGVkIGJ5IGljX3Jlc2V0ICovCisvLwkJCX0KKy8vCQkJcmV0diA9IEVORVRSRVNFVDsJLyogUmVuZWdvdGlhdGUgZm9yIGNhcGFiaWxpdGllcyAqLworLy8JCX0KKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX0hJREVTU0lEOgorLy8JCWlmICh2YWx1ZSkKKy8vCQkJdmFwLT5pdl9mbGFncyB8PSBJRUVFODAyMTFfRl9ISURFU1NJRDsKKy8vCQllbHNlCisvLwkJCXZhcC0+aXZfZmxhZ3MgJj0gfklFRUU4MDIxMV9GX0hJREVTU0lEOworLy8JCXJldHYgPSBFTkVUUkVTRVQ7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9BUEJSSURHRToKKy8vCQlpZiAodmFsdWUgPT0gMCkKKy8vCQkJdmFwLT5pdl9mbGFncyB8PSBJRUVFODAyMTFfRl9OT0JSSURHRTsKKy8vCQllbHNlCisvLwkJCXZhcC0+aXZfZmxhZ3MgJj0gfklFRUU4MDIxMV9GX05PQlJJREdFOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fSU5BQ1Q6CisvLwkJdmFwLT5pdl9pbmFjdF9ydW4gPSB2YWx1ZSAvIElFRUU4MDIxMV9JTkFDVF9XQUlUOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fSU5BQ1RfQVVUSDoKKy8vCQl2YXAtPml2X2luYWN0X2F1dGggPSB2YWx1ZSAvIElFRUU4MDIxMV9JTkFDVF9XQUlUOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fSU5BQ1RfSU5JVDoKKy8vCQl2YXAtPml2X2luYWN0X2luaXQgPSB2YWx1ZSAvIElFRUU4MDIxMV9JTkFDVF9XQUlUOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fQUJPTFQ6CisvLwkJY2FwcyA9IDA7CisvLwkJLyoKKy8vCQkgKiBNYXAgYWJvbHQgc2V0dGluZ3MgdG8gY2FwYWJpbGl0eSBiaXRzOworLy8JCSAqIHRoaXMgYWxzbyBzdHJpcHMgdW5rbm93bi91bndhbnRlZCBiaXRzLgorLy8JCSAqLworLy8JCWlmICh2YWx1ZSAmIElFRUU4MDIxMV9BQk9MVF9UVVJCT19QUklNRSkKKy8vCQkJY2FwcyB8PSBJRUVFODAyMTFfQVRIQ19UVVJCT1A7CisvLwkJaWYgKHZhbHVlICYgSUVFRTgwMjExX0FCT0xUX0NPTVBSRVNTSU9OKQorLy8JCQljYXBzIHw9IElFRUU4MDIxMV9BVEhDX0NPTVA7CisvLwkJaWYgKHZhbHVlICYgSUVFRTgwMjExX0FCT0xUX0ZBU1RfRlJBTUUpCisvLwkJCWNhcHMgfD0gSUVFRTgwMjExX0FUSENfRkY7CisvLwkJaWYgKHZhbHVlICYgSUVFRTgwMjExX0FCT0xUX1hSKQorLy8JCQljYXBzIHw9IElFRUU4MDIxMV9BVEhDX1hSOworLy8JCWlmICh2YWx1ZSAmIElFRUU4MDIxMV9BQk9MVF9BUikKKy8vCQkJY2FwcyB8PSBJRUVFODAyMTFfQVRIQ19BUjsKKy8vCQlpZiAodmFsdWUgJiBJRUVFODAyMTFfQUJPTFRfQlVSU1QpCisvLwkJCWNhcHMgfD0gSUVFRTgwMjExX0FUSENfQlVSU1Q7CisvLyAgICAgICAgaWYgKHZhbHVlICYgSUVFRTgwMjExX0FCT0xUX1dNRV9FTEUpCisvLyAgICAgICAgICAgIGNhcHMgfD0gSUVFRTgwMjExX0FUSENfV01FOworLy8JCS8qIHZlcmlmeSByZXF1ZXN0ZWQgY2FwYWJpbGl0aWVzIGFyZSBzdXBwb3J0ZWQgKi8KKy8vCQlpZiAoKGNhcHMgJiBpYy0+aWNfYXRoX2NhcCkgIT0gY2FwcykKKy8vCQkJcmV0dXJuIC1FSU5WQUw7CisvLwkJaWYgKHZhcC0+aXZfYXRoX2NhcCAhPSBjYXBzKSB7CisvLwkJCWlmICgodmFwLT5pdl9hdGhfY2FwIF4gY2FwcykgJiBJRUVFODAyMTFfQVRIQ19UVVJCT1ApIHsKKy8vCQkJCWlmIChpZWVlODAyMTFfc2V0X3R1cmJvKGRldiwgIGNhcHMgJiBJRUVFODAyMTFfQVRIQ19UVVJCT1ApKQorLy8JCQkJCXJldHVybiAtRUlOVkFMOworLy8JCQkJaWVlZTgwMjExX3NjYW5fZmx1c2goaWMpOworLy8JCQl9CisvLwkJCXZhcC0+aXZfYXRoX2NhcCA9IGNhcHM7CisvLwkJCWljLT5pY19hdGhjYXBzZXR1cCh2YXAtPml2X2ljLCB2YXAtPml2X2F0aF9jYXApOworLy8JCQlyZXR2ID0gRU5FVFJFU0VUOworLy8JCX0KKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX0RUSU1fUEVSSU9EOgorLy8JCWlmICh2YXAtPml2X29wbW9kZSAhPSBJRUVFODAyMTFfTV9IT1NUQVAgJiYKKy8vCQkgICAgdmFwLT5pdl9vcG1vZGUgIT0gSUVFRTgwMjExX01fSUJTUykKKy8vCQkJcmV0dXJuIC1FSU5WQUw7CisvLwkJaWYgKElFRUU4MDIxMV9EVElNX01JTiA8PSB2YWx1ZSAmJgorLy8JCSAgICB2YWx1ZSA8PSBJRUVFODAyMTFfRFRJTV9NQVgpIHsKKy8vCQkJdmFwLT5pdl9kdGltX3BlcmlvZCA9IHZhbHVlOworLy8JCQlyZXR2ID0gRU5FVFJFU0VUOwkJLyogcmVxdWlyZXMgcmVzdGFydCAqLworLy8JCX0gZWxzZQorLy8JCQlyZXR2ID0gRUlOVkFMOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fQkVBQ09OX0lOVEVSVkFMOgorLy8JCWlmICh2YXAtPml2X29wbW9kZSAhPSBJRUVFODAyMTFfTV9IT1NUQVAgJiYKKy8vCQkgICAgdmFwLT5pdl9vcG1vZGUgIT0gSUVFRTgwMjExX01fSUJTUykKKy8vCQkJcmV0dXJuIC1FSU5WQUw7CisvLwkJaWYgKElFRUU4MDIxMV9CSU5UVkFMX01JTiA8PSB2YWx1ZSAmJgorLy8JCSAgICB2YWx1ZSA8PSBJRUVFODAyMTFfQklOVFZBTF9NQVgpIHsKKy8vCQkJaWMtPmljX2xpbnR2YWwgPSB2YWx1ZTsJCS8qIFhYWCBtdWx0aS1ic3MgKi8KKy8vCQkJcmV0diA9IEVORVRSRVNFVDsJCS8qIHJlcXVpcmVzIHJlc3RhcnQgKi8KKy8vCQl9IGVsc2UKKy8vCQkJcmV0diA9IEVJTlZBTDsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX0RPVEg6CisvLwkJaWYgKHZhbHVlKSB7CisvLwkJCWljLT5pY19mbGFncyB8PSBJRUVFODAyMTFfRl9ET1RIOworLy8JCX0KKy8vCQllbHNlCisvLwkJCWljLT5pY19mbGFncyAmPSB+SUVFRTgwMjExX0ZfRE9USDsKKy8vCQlyZXR2ID0gRU5FVFJFU0VUOwkvKiBYWFg6IG5lZWQgc29tZXRoaW5nIHRoaXMgZHJhc3RpYz8gKi8KKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX1BXUlRBUkdFVDoKKy8vCQlpYy0+aWNfY3VyY2hhbm1heHB3ciA9IHZhbHVlOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fR0VOUkVBU1NPQzoKKy8vCQlJRUVFODAyMTFfU0VORF9NR01UKHZhcC0+aXZfYnNzLCBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUkVBU1NPQ19SRVEsIDApOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fQ09NUFJFU1NJT046CisvLwkJcmV0diA9IGllZWU4MDIxMV9zZXRhdGhjYXAodmFwLCBJRUVFODAyMTFfQVRIQ19DT01QLCB2YWx1ZSk7CisvLwkJYnJlYWs7CisvLyAgICBjYXNlIElFRUU4MDIxMV9QQVJBTV9XTU1fQUdHUk1PREU6CisvLyAgICAgICAgcmV0diA9IGllZWU4MDIxMV9zZXRhdGhjYXAodmFwLCBJRUVFODAyMTFfQVRIQ19XTUUsIHZhbHVlKTsKKy8vICAgICAgICBicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX0ZGOgorLy8JCXJldHYgPSBpZWVlODAyMTFfc2V0YXRoY2FwKHZhcCwgSUVFRTgwMjExX0FUSENfRkYsIHZhbHVlKTsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX1RVUkJPOgorLy8JCXJldHYgPSBpZWVlODAyMTFfc2V0YXRoY2FwKHZhcCwgSUVFRTgwMjExX0FUSENfVFVSQk9QLCB2YWx1ZSk7CisvLwkJaWYgKHJldHYgPT0gRU5FVFJFU0VUKSB7CisvLwkJCWlmKGllZWU4MDIxMV9zZXRfdHVyYm8oZGV2LHZhbHVlKSkKKy8vCQkJCQlyZXR1cm4gLUVJTlZBTDsKKy8vCQkJaWVlZTgwMjExX3NjYW5fZmx1c2goaWMpOworLy8JCX0KKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX1hSOgorLy8JCXJldHYgPSBpZWVlODAyMTFfc2V0YXRoY2FwKHZhcCwgSUVFRTgwMjExX0FUSENfWFIsIHZhbHVlKTsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX0JVUlNUOgorLy8JCXJldHYgPSBpZWVlODAyMTFfc2V0YXRoY2FwKHZhcCwgSUVFRTgwMjExX0FUSENfQlVSU1QsIHZhbHVlKTsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX0FSOgorLy8JCXJldHYgPSBpZWVlODAyMTFfc2V0YXRoY2FwKHZhcCwgSUVFRTgwMjExX0FUSENfQVIsIHZhbHVlKTsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX1BVUkVHOgorLy8JCWlmICh2YWx1ZSkKKy8vCQkJdmFwLT5pdl9mbGFncyB8PSBJRUVFODAyMTFfRl9QVVJFRzsKKy8vCQllbHNlCisvLwkJCXZhcC0+aXZfZmxhZ3MgJj0gfklFRUU4MDIxMV9GX1BVUkVHOworLy8JCS8qIE5COiByZXNldCBvbmx5IGlmIHdlJ3JlIG9wZXJhdGluZyBvbiBhbiAxMWcgY2hhbm5lbCAqLworLy8JCWlmIChpYy0+aWNfYnNzY2hhbiAhPSBJRUVFODAyMTFfQ0hBTl9BTllDICYmCisvLwkJICAgIElFRUU4MDIxMV9JU19DSEFOX0FOWUcoaWMtPmljX2Jzc2NoYW4pKQorLy8JCQlyZXR2ID0gRU5FVFJFU0VUOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fV0RTOgorLy8JCWlmICh2YWx1ZSkKKy8vCQkJdmFwLT5pdl9mbGFnc19leHQgfD0gSUVFRTgwMjExX0ZFWFRfV0RTOworLy8JCWVsc2UKKy8vCQkJdmFwLT5pdl9mbGFnc19leHQgJj0gfklFRUU4MDIxMV9GRVhUX1dEUzsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX0JHU0NBTjoKKy8vCQlpZiAodmFsdWUpIHsKKy8vCQkJaWYgKCh2YXAtPml2X2NhcHMgJiBJRUVFODAyMTFfQ19CR1NDQU4pID09IDApCisvLwkJCQlyZXR1cm4gLUVJTlZBTDsKKy8vCQkJdmFwLT5pdl9mbGFncyB8PSBJRUVFODAyMTFfRl9CR1NDQU47CisvLwkJfSBlbHNlIHsKKy8vCQkJLyogWFhYIHJhY2V5PyAqLworLy8JCQl2YXAtPml2X2ZsYWdzICY9IH5JRUVFODAyMTFfRl9CR1NDQU47CisvLwkJCWllZWU4MDIxMV9jYW5jZWxfc2Nhbih2YXApOwkvKiBhbnl0aGluZyBjdXJyZW50ICovCisvLwkJfQorLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fQkdTQ0FOX0lETEU6CisvLwkJaWYgKHZhbHVlID49IElFRUU4MDIxMV9CR1NDQU5fSURMRV9NSU4pCisvLwkJCXZhcC0+aXZfYmdzY2FuaWRsZSA9IHZhbHVlKkhaLzEwMDA7CisvLwkJZWxzZQorLy8JCQlyZXR2ID0gRUlOVkFMOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fQkdTQ0FOX0lOVEVSVkFMOgorLy8JCWlmICh2YWx1ZSA+PSBJRUVFODAyMTFfQkdTQ0FOX0lOVFZBTF9NSU4pCisvLwkJCXZhcC0+aXZfYmdzY2FuaW50dmwgPSB2YWx1ZSpIWjsKKy8vCQllbHNlCisvLwkJCXJldHYgPSBFSU5WQUw7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9NQ0FTVF9SQVRFOgorLy8JCS8qIHVuaXRzIGFyZSBpbiBLSUxPYml0cyBwZXIgc2Vjb25kICovCisvLwkJaWYgKHZhbHVlID49IDI1NiAmJiB2YWx1ZSA8PSA1NDAwMCkKKy8vCQkJdmFwLT5pdl9tY2FzdF9yYXRlID0gdmFsdWU7CisvLwkJZWxzZQorLy8JCQlyZXR2ID0gRUlOVkFMOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fQ09WRVJBR0VfQ0xBU1M6CisvLwkJaWYgKHZhbHVlID49IDAgJiYgdmFsdWUgPD0gSUVFRTgwMjExX0NPVkVSQUdFX0NMQVNTX01BWCkgeworLy8JCQlpYy0+aWNfY292ZXJhZ2VjbGFzcyA9IHZhbHVlOworLy8JCQlpZiAoSVNfVVBfQVVUTyh2YXApKQorLy8JCQkJaWVlZTgwMjExX25ld19zdGF0ZSh2YXAsIElFRUU4MDIxMV9TX1NDQU4sIDApOworLy8JCQlyZXR2ID0gMDsKKy8vCQl9CisvLwkJZWxzZQorLy8JCQlyZXR2ID0gRUlOVkFMOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fQ09VTlRSWV9JRToKKy8vCQlpZiAodmFsdWUpCisvLwkJCWljLT5pY19mbGFnc19leHQgfD0gSUVFRTgwMjExX0ZFWFRfQ09VTlRSWUlFOworLy8JCWVsc2UKKy8vCQkJaWMtPmljX2ZsYWdzX2V4dCAmPSB+SUVFRTgwMjExX0ZFWFRfQ09VTlRSWUlFOworLy8JCXJldHYgPSBFTkVUUkVTRVQ7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9SRUdDTEFTUzoKKy8vCQlpZiAodmFsdWUpCisvLwkJCWljLT5pY19mbGFnc19leHQgfD0gSUVFRTgwMjExX0ZFWFRfUkVHQ0xBU1M7CisvLwkJZWxzZQorLy8JCQlpYy0+aWNfZmxhZ3NfZXh0ICY9IH5JRUVFODAyMTFfRkVYVF9SRUdDTEFTUzsKKy8vCQlyZXR2ID0gRU5FVFJFU0VUOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fU0NBTlZBTElEOgorLy8JCXZhcC0+aXZfc2NhbnZhbGlkID0gdmFsdWUqSFo7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9ST0FNX1JTU0lfMTFBOgorLy8JCXZhcC0+aXZfcm9hbS5yc3NpMTFhID0gdmFsdWU7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9ST0FNX1JTU0lfMTFCOgorLy8JCXZhcC0+aXZfcm9hbS5yc3NpMTFiT25seSA9IHZhbHVlOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fUk9BTV9SU1NJXzExRzoKKy8vCQl2YXAtPml2X3JvYW0ucnNzaTExYiA9IHZhbHVlOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fUk9BTV9SQVRFXzExQToKKy8vCQl2YXAtPml2X3JvYW0ucmF0ZTExYSA9IHZhbHVlOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fUk9BTV9SQVRFXzExQjoKKy8vCQl2YXAtPml2X3JvYW0ucmF0ZTExYk9ubHkgPSB2YWx1ZTsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX1JPQU1fUkFURV8xMUc6CisvLwkJdmFwLT5pdl9yb2FtLnJhdGUxMWIgPSB2YWx1ZTsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX1VBUFNESU5GTzoKKy8vCQlpZiAodmFwLT5pdl9vcG1vZGUgPT0gSUVFRTgwMjExX01fSE9TVEFQKSB7CisvLwkJCWlmIChpYy0+aWNfY2FwcyAmIElFRUU4MDIxMV9DX1VBUFNEKSB7CisvLwkJCQlpZiAodmFsdWUpCisvLwkJCQkJSUVFRTgwMjExX1ZBUF9VQVBTRF9FTkFCTEUodmFwKTsKKy8vCQkJCWVsc2UKKy8vCQkJCQlJRUVFODAyMTFfVkFQX1VBUFNEX0RJU0FCTEUodmFwKTsKKy8vCQkJCXJldHYgPSBFTkVUUkVTRVQ7CisvLwkJCX0KKy8vCQl9CisvLwkJZWxzZSBpZiAodmFwLT5pdl9vcG1vZGUgPT0gSUVFRTgwMjExX01fU1RBKSB7CisvLwkJCXZhcC0+aXZfdWFwc2RpbmZvID0gdmFsdWU7CisvLwkJCUlFRUU4MDIxMV9WQVBfVUFQU0RfRU5BQkxFKHZhcCk7CisvLwkJCXJldHYgPSBFTkVUUkVTRVQ7CisvLwkJfQorLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fU0xFRVA6CisvLwkJLyogWFhYOiBGb3JjZWQgc2xlZXAgZm9yIHRlc3RpbmcuIERvZXMgbm90IGFjdHVhbGx5IHBsYWNlIHRoZQorLy8JCSAqICAgICAgSFcgaW4gc2xlZXAgbW9kZSB5ZXQuIHRoaXMgb25seSBtYWtlcyBzZW5zZSBmb3IgU1RBcy4KKy8vCQkgKi8KKy8vCQlpZiAodmFsdWUpIHsKKy8vCQkJLyogZ290byBzbGVlcCAqLworLy8JCQlJRUVFODAyMTFfVkFQX0dPVE9TTEVFUCh2YXApOworLy8JCX0KKy8vCQllbHNlIHsKKy8vCQkJLyogd2FrZXVwICovCisvLwkJCUlFRUU4MDIxMV9WQVBfV0FLRVVQKHZhcCk7CisvLwkJfQorLy8JCWllZWU4MDIxMV9zZW5kX251bGxkYXRhKGllZWU4MDIxMV9yZWZfbm9kZSh2YXAtPml2X2JzcykpOworLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fUU9TTlVMTDoKKy8vCQkvKiBGb3JjZSBhIFFvUyBOdWxsIGZvciB0ZXN0aW5nLiAqLworLy8JCWllZWU4MDIxMV9zZW5kX3Fvc251bGxkYXRhKHZhcC0+aXZfYnNzLCB2YWx1ZSk7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9QU1BPTEw6CisvLwkJLyogRm9yY2UgYSBQUy1QT0xMIGZvciB0ZXN0aW5nLiAqLworLy8JCWllZWU4MDIxMV9zZW5kX3BzcG9sbCh2YXAtPml2X2Jzcyk7CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9FT1NQRFJPUDoKKy8vCQlpZiAodmFwLT5pdl9vcG1vZGUgPT0gSUVFRTgwMjExX01fSE9TVEFQKSB7CisvLwkJCWlmICh2YWx1ZSkgSUVFRTgwMjExX1ZBUF9FT1NQRFJPUF9FTkFCTEUodmFwKTsKKy8vCQkJZWxzZSBJRUVFODAyMTFfVkFQX0VPU1BEUk9QX0RJU0FCTEUodmFwKTsKKy8vCQl9CisvLwkJYnJlYWs7CisvLwljYXNlIElFRUU4MDIxMV9QQVJBTV9NQVJLREZTOgorLy8JCWlmICh2YWx1ZSkKKy8vCQkJaWMtPmljX2ZsYWdzX2V4dCB8PSBJRUVFODAyMTFfRkVYVF9NQVJLREZTOworLy8JCWVsc2UKKy8vCQkJaWMtPmljX2ZsYWdzX2V4dCAmPSB+SUVFRTgwMjExX0ZFWFRfTUFSS0RGUzsKKy8vCQlicmVhazsKKy8vCWNhc2UgSUVFRTgwMjExX1BBUkFNX0NIQU5CVzoKKy8vCQlzd2l0Y2ggKHZhbHVlKSB7CisvLwkJCWNhc2UgMDoKKy8vCQkJCWljLT5pY19jaGFuYndmbGFnID0gMDsKKy8vCQkJCWJyZWFrOworLy8JCQljYXNlIDE6CisvLwkJCQlpYy0+aWNfY2hhbmJ3ZmxhZyA9IElFRUU4MDIxMV9DSEFOX0hBTEY7CisvLwkJCQlicmVhazsKKy8vCQkJY2FzZSAyOgorLy8JCQkJaWMtPmljX2NoYW5id2ZsYWcgPSBJRUVFODAyMTFfQ0hBTl9RVUFSVEVSOworLy8JCQkJYnJlYWs7CisvLwkJCWRlZmF1bHQ6CisvLwkJCQlyZXR2ID0gRUlOVkFMOworLy8JCQkJYnJlYWs7CisvLwkJfQorLy8JCWJyZWFrOworLy8JY2FzZSBJRUVFODAyMTFfUEFSQU1fU0hPUlRQUkVBTUJMRToKKy8vCQlpZiAodmFsdWUpIHsKKy8vCQkJaWMtPmljX2NhcHMgfD0gSUVFRTgwMjExX0NfU0hQUkVBTUJMRTsKKy8vCQl9IGVsc2UgeworLy8JCQlpYy0+aWNfY2FwcyAmPSB+SUVFRTgwMjExX0NfU0hQUkVBTUJMRTsKKy8vCQl9CisvLwkJcmV0diA9IEVORVRSRVNFVDsKKy8vCQlicmVhazsKKy8vCWRlZmF1bHQ6CisvLwkJcmV0diA9IEVPUE5PVFNVUFA7CisvLwkJYnJlYWs7CisvLwl9CisvLwkvKiBYWFggc2hvdWxkIGFueSBvZiB0aGVzZSBjYXVzZSBhIHJlc2Nhbj8gKi8KKy8vCWlmIChyZXR2ID09IEVORVRSRVNFVCkKKy8vCQlyZXR2ID0gSVNfVVBfQVVUTyh2YXApID8gaWVlZTgwMjExX29wZW4odmFwLT5pdl9kZXYpIDogMDsKKy8vCXJldHVybiAtcmV0djsKKy8vfQorCitpbnQgdXNiZHJ2d2V4dF9zZXRtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIAkgdm9pZCAqdywgY2hhciAqZXh0cmEpCit7CisJcmV0dXJuIDA7Cit9CisKK2ludCB1c2JkcnZ3ZXh0X2dldG1vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXZvaWQgKncsIGNoYXIgKmV4dHJhKQoreworCS8vc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCBpd19wb2ludCAqd3JpID0gKHN0cnVjdCBpd19wb2ludCAqKWV4dHJhOworCWNoYXIgbW9kZVs4XTsKKworICAgIHN0cmNweShtb2RlLCIxMWciKTsKKwlyZXR1cm4gKGNvcHlfdG9fdXNlcih3cmktPnBvaW50ZXIsIG1vZGUsIDYpID8gLUVGQVVMVCA6IDApOworfQorCitpbnQgemZMbnhQcml2YXRlSW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHpkYXBfaW9jdGwqIHpkcmVxKQoreworCS8vdm9pZCogcmVncCA9IG1hY3AtPnJlZ3A7CisJdTE2X3QgY21kOworCS8vdTMyX3QgdGVtcDsKKwl1MzJfdCogcDsKKwl1MzJfdCBpOworCisJY21kID0gemRyZXEtPmNtZDsKKwlzd2l0Y2goY21kKQorCXsKKwljYXNlIFpNX0lPQ1RMX1JFR19SRUFEOgorCQl6ZmlEYmdSZWFkUmVnKGRldiwgemRyZXEtPmFkZHIpOworCQlicmVhazsKKworCWNhc2UgWk1fSU9DVExfUkVHX1dSSVRFOgorCQl6ZmlEYmdXcml0ZVJlZyhkZXYsIHpkcmVxLT5hZGRyLCB6ZHJlcS0+dmFsdWUpOworCQlicmVhazsKKworCWNhc2UgWk1fSU9DVExfTUVNX1JFQUQ6CisJCXAgPSAodTMyX3QgKikgYnVzX3RvX3ZpcnQoemRyZXEtPmFkZHIpOworCQlwcmludGsoS0VSTl9ERUJVRyAidXNiZHJ2OiByZWFkIG1lbW9yeSBhZGRyOiAweCUwOHggdmFsdWU6IDB4JTA4eFxuIiwgemRyZXEtPmFkZHIsICpwKTsKKwkJYnJlYWs7CisKKwljYXNlIFpNX0lPQ1RMX01FTV9XUklURToKKwkJcCA9ICh1MzJfdCAqKSBidXNfdG9fdmlydCh6ZHJlcS0+YWRkcik7CisJCSpwID0gemRyZXEtPnZhbHVlOworCQlwcmludGsoS0VSTl9ERUJVRyAidXNiZHJ2OiB3cml0ZSB2YWx1ZTogMHglMDh4IHRvIG1lbW9yeSBhZGRyOiAweCUwOHhcbiIsIHpkcmVxLT52YWx1ZSwgemRyZXEtPmFkZHIpOworCQlicmVhazsKKworCWNhc2UgWk1fSU9DVExfVEFMTFkgOgorCQl6ZmlXbGFuU2hvd1RhbGx5KGRldik7CisJCWlmICh6ZHJlcS0+YWRkcikKKwkJCXpmaVdsYW5SZXNldFRhbGx5KGRldik7CisJCWJyZWFrOworCisJY2FzZSBaTV9JT0NUTF9URVNUIDoKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJaTV9JT0NUTF9URVNUOmxlbj0lZFxuIiwgemRyZXEtPmFkZHIpOworICAgICAgICAgICAgLy96ZmlXbGFuUmVhZFJlZyhkZXYsIDB4MTBmNDAwKTsKKyAgICAgICAgICAgIC8vemZpV2xhblJlYWRSZWcoZGV2LCAweDEwZjQwNCk7CisgICAgICAgICAgICBwcmludGsoIklPQ1RMIFRFU1RcbiIpOworICAgICAgICAgICAgI2lmIDEKKyAgICAgICAgICAgIC8vcHJpbnQgcGFja2V0CisgICAgICAgICAgICBmb3IgKGk9MDsgaTx6ZHJlcS0+YWRkcjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoaSYweDcpID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcmludGsoIlxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByaW50aygiJTAyWCAiLCAodW5zaWduZWQgY2hhcil6ZHJlcS0+ZGF0YVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmludGsoIlxuIik7CisgICAgICAgICAgICAjZW5kaWYKKworCisgICAgICAgICAgICAjaWYgMCAvL0ZvciBUZXN0Pz8gMSB0byAwIGJ5IENXWWFuZygtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgc3RydWN0IHNrX2J1ZmYqIHM7CisKKyAgICAgICAgICAgIC8qIEFsbG9jYXRlIGEgc2tiICovCisgICAgICAgICAgICBzID0gYWxsb2Nfc2tiKDIwMDAsIEdGUF9BVE9NSUMpOworCisgICAgICAgICAgICAvKiBDb3B5IGRhdGEgdG8gc2tiICovCisgICAgICAgICAgICBmb3IgKGk9MDsgaTx6ZHJlcS0+YWRkcjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHMtPmRhdGFbaV0gPSB6ZHJlcS0+ZGF0YVtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPmxlbiA9IHpkcmVxLT5hZGRyOworCisgICAgICAgICAgICAvKiBDYWxsIHpmSWRsUmVjdigpICovCisgICAgICAgICAgICB6ZmlSZWN2ODAyMTEoZGV2LCBzLCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICBicmVhazsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFpEQ09ORklHICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgY2FzZSBaTV9JT0NUTF9GUkFHIDoKKyAgICAgICAgICAgIHpmaVdsYW5TZXRGcmFnVGhyZXNob2xkKGRldiwgemRyZXEtPmFkZHIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9JT0NUTF9SVFMgOgorICAgICAgICAgICAgemZpV2xhblNldFJ0c1RocmVzaG9sZChkZXYsIHpkcmVxLT5hZGRyKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWk1fSU9DVExfU0NBTiA6CisgICAgICAgICAgICB6ZmlXbGFuU2NhbihkZXYpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9JT0NUTF9LRVkgOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHU4X3Qga2V5WzI5XTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgenNLZXlJbmZvIGtleUluZm87CisgICAgICAgICAgICAgICAgdTMyX3QgaTsKKworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPDI5OyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrZXlbaV0gPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPHpkcmVxLT5hZGRyOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrZXlbaV0gPSB6ZHJlcS0+ZGF0YVtpXTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmludGsoImtleSBsZW49JWQsIGtleT0lMDJ4JTAyeCUwMnglMDJ4JTAyeC4uLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHpkcmVxLT5hZGRyLCBrZXlbMF0sIGtleVsxXSwga2V5WzJdLCBrZXlbM10sIGtleVs0XSk7CisKKyAgICAgICAgICAgICAgICBrZXlJbmZvLmtleUxlbmd0aCA9IHpkcmVxLT5hZGRyOworICAgICAgICAgICAgICAgIGtleUluZm8ua2V5SW5kZXggPSAwOworICAgICAgICAgICAgICAgIGtleUluZm8uZmxhZyA9IDA7CisgICAgICAgICAgICAgICAga2V5SW5mby5rZXkgPSBrZXk7CisgICAgICAgICAgICAgICAgemZpV2xhblNldEtleShkZXYsIGtleUluZm8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaTV9JT0NUTF9SQVRFIDoKKyAgICAgICAgICAgIHpmaVdsYW5TZXRUeFJhdGUoZGV2LCB6ZHJlcS0+YWRkcik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpNX0lPQ1RMX0VOQ1JZUFRJT05fTU9ERSA6CisgICAgICAgICAgICB6ZmlXbGFuU2V0RW5jcnlNb2RlKGRldiwgemRyZXEtPmFkZHIpOworCisgICAgICAgICAgICB6ZmlXbGFuRGlzYWJsZShkZXYsIDApOworICAgICAgICAgICAgemZpV2xhbkVuYWJsZShkZXYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8vQ1dZYW5nKCspCisgICAgICAgIGNhc2UgWk1fSU9DVExfU0lHTkFMX1NUUkVOR1RIIDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1OF90IGJ1ZmZlclsyXTsKKyAgICAgICAgICAgICAgICB6ZmlXbGFuUXVlcnlTaWduYWxJbmZvKGRldiwgJmJ1ZmZlclswXSk7CisgICAgICAgICAgICAgICAgcHJpbnRrKCJDdXJyZW50IFNpZ25hbCBTdHJlbmd0aCA6ICUwMmRcbiIsIGJ1ZmZlclswXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLy9DV1lhbmcoKykKKyAgICAgICAgY2FzZSBaTV9JT0NUTF9TSUdOQUxfUVVBTElUWSA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdThfdCBidWZmZXJbMl07CisgICAgICAgICAgICAgICAgemZpV2xhblF1ZXJ5U2lnbmFsSW5mbyhkZXYsICZidWZmZXJbMF0pOworICAgICAgICAgICAgICAgIHByaW50aygiQ3VycmVudCBTaWduYWwgUXVhbGl0eSA6ICUwMmRcbiIsIGJ1ZmZlclsxXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworCWNhc2UgWk1fSU9DVExfU0VUX1BJQlNTX01PREU6CisJCWlmICh6ZHJlcS0+YWRkciA9PSAxKQorCQkJemZpV2xhblNldFdsYW5Nb2RlKGRldiwgWk1fTU9ERV9QU0VVRE8pOworCQllbHNlCisJCQl6ZmlXbGFuU2V0V2xhbk1vZGUoZGV2LCBaTV9NT0RFX0lORlJBU1RSVUNUVVJFKTsKKworCQl6ZmlXbGFuRGlzYWJsZShkZXYsIDApOworCQl6ZmlXbGFuRW5hYmxlKGRldik7CisKKwkJYnJlYWs7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFpEQ09ORklHICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCWRlZmF1bHQgOgorCQlwcmludGsoS0VSTl9FUlIgInVzYmRydjogZXJyb3IgY29tbWFuZCA9ICV4XG4iLCBjbWQpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHVzYmRydl93cGFfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGF0aHJfd2xhbl9wYXJhbSAqemRwYXJtKQoreworICAgIGludCByZXQgPSAwOworICAgIHU4X3QgYmNfYWRkcls2XSA9IHsgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiB9OworICAgIHU4X3QgbWFjX2FkZHJbODBdOworICAgIHN0cnVjdCB6c0tleUluZm8ga2V5SW5mbzsKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgdTE2X3QgdmFwSWQgPSAwOworCisgICAgLy96bXdfZ2V0X3dsYW5fZGV2KGRldik7CisKKyAgICBzd2l0Y2goemRwYXJtLT5jbWQpCisgICAgeworICAgICAgICBjYXNlIFpEX0NNRF9TRVRfRU5DUllQVF9LRVk6CisKKyAgICAgICAgICAgIC8qIFNldCB1cCBrZXkgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgIGtleUluZm8ua2V5TGVuZ3RoID0gemRwYXJtLT51LmNyeXB0LmtleV9sZW47CisgICAgICAgICAgICBrZXlJbmZvLmtleUluZGV4ID0gemRwYXJtLT51LmNyeXB0LmlkeDsKKyAgICAgICAgICAgIGlmICh6ZmlXbGFuUXVlcnlXbGFuTW9kZShkZXYpID09IFpNX01PREVfQVApIC8vIEFQIE1vZGUKKyAgICAgICAgICAgICAgICBrZXlJbmZvLmZsYWcgPSBaTV9LRVlfRkxBR19BVVRIRU5USUNBVE9SOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGtleUluZm8uZmxhZyA9IDA7CisgICAgICAgICAgICBrZXlJbmZvLmtleSA9IHpkcGFybS0+dS5jcnlwdC5rZXk7CisgICAgICAgICAgICBrZXlJbmZvLmluaXRJdiA9IHpkcGFybS0+dS5jcnlwdC5zZXE7CisgICAgICAgICAgICBrZXlJbmZvLm1hY0FkZHIgPSAodTE2X3QgKil6ZHBhcm0tPnN0YV9hZGRyOworCisgICAgICAgICAgICAvKiBJZGVudGlmeSB0aGUgTUFDIGFkZHJlc3MgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgIGlmIChtZW1jbXAoemRwYXJtLT5zdGFfYWRkciwgYmNfYWRkciwgc2l6ZW9mKGJjX2FkZHIpKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGtleUluZm8uZmxhZyB8PSBaTV9LRVlfRkxBR19HSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBrZXlJbmZvLmZsYWcgfD0gWk1fS0VZX0ZMQUdfUEs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghc3RyY21wKHpkcGFybS0+dS5jcnlwdC5hbGcsICJOT05FIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy91OF90IHplcm9fbWFjW109ezAsMCwwLDAsMCwwfTsKKworICAgICAgICAgICAgICAgIC8qIFNldCBrZXkgbGVuZ3RoIHRvIHplcm8gKi8KKyAgICAgICAgICAgICAgICBrZXlJbmZvLmtleUxlbmd0aCA9IDA7CisKKyAgICAgICAgICAgICAgICBpZiAoemRwYXJtLT5zdGFfYWRkclswXSAmIDEpLy9kZWwgZ3JvdXAga2V5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL2lmIChtYWNwLT5jYXJkU2V0dGluZy5XUEFJZUxlbj09MCkKKyAgICAgICAgICAgICAgICAgICAgLy97Ly84MDIuMXggZHluYW1pYyBXRVAKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgbUR5bktleU1vZGUgPSAwOworICAgICAgICAgICAgICAgICAgICAvLyAgICBtS2V5Rm9ybWF0WzBdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgbVByaXZhY3lJbnZva2VkWzBdPUZBTFNFOworICAgICAgICAgICAgICAgICAgICAvLyAgICBtQ2FwWzBdICY9IH5DQVBfUFJJVkFDWTsKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgbWFjcC0+Y2FyZFNldHRpbmcuRW5jcnlPbk9mZlswXT0wOworICAgICAgICAgICAgICAgICAgICAvL30KKyAgICAgICAgICAgICAgICAgICAgLy9tV3BhQmNLZXlMZW4gPSBtR2tJbnN0YWxsZWQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL2lmIChtZW1jbXAoemVyb19tYWMsemRwYXJtLT5zdGFfYWRkciwgNik9PTApCisgICAgICAgICAgICAgICAgICAgIC8veworICAgICAgICAgICAgICAgICAgICAvLyAgICBtRHluS2V5TW9kZT0wOworICAgICAgICAgICAgICAgICAgICAvLyAgICBtS2V5Rm9ybWF0WzBdPTA7CisgICAgICAgICAgICAgICAgICAgIC8vICAgIHBTZXR0aW5nLT5EeW5LZXlNb2RlPTA7CisgICAgICAgICAgICAgICAgICAgIC8vICAgIHBTZXR0aW5nLT5FbmNyeU1vZGVbMF09MDsKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgbUR5bktleU1vZGU9MDsKKyAgICAgICAgICAgICAgICAgICAgLy99CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJTZXQgRW5jcnlwdGlvbiBUeXBlIE5PTkVcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKHpkcGFybS0+dS5jcnlwdC5hbGcsICJUS0lQIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemZpV2xhblNldEVuY3J5TW9kZShkZXYsIFpNX1RLSVApOworICAgICAgICAgICAgICAgIC8vTGludXggU3VwcGxpY2FudCB3aWxsIGludmVyc2UgVHgvUngga2V5CisgICAgICAgICAgICAgICAgLy9TbyB3ZSBpbnZlcnNlIGl0IGJhY2sgLy9DV1lhbmcoKykKKyAgICAgICAgICAgICAgICAvL3pmTWVtb3J5Q29weSgmdGVtcFswXSwgJmtleUluZm8ua2V5WzE2XSwgOCk7CisgICAgICAgICAgICAgICAgLy96Zk1lbW9yeUNvcHkoJmtleUluZm8ua2V5WzE2XSwga2V5SW5mby5rZXlbMjRdLCA4KTsKKyAgICAgICAgICAgICAgICAvL3pmTWVtb3J5Q29weSgma2V5SW5mby5rZXlbMjRdLCAmdGVtcFswXSwgOCk7CisgICAgICAgICAgICAgICAgLy91OF90IHRlbXA7CisgICAgICAgICAgICAgICAgLy9pbnQgazsKKyAgICAgICAgICAgICAgICAvL2ZvciAoayA9IDA7IGsgPCA4OyBrKyspCisgICAgICAgICAgICAgICAgLy97CisgICAgICAgICAgICAgICAgLy8gICAgdGVtcCA9IGtleUluZm8ua2V5WzE2ICsga107CisgICAgICAgICAgICAgICAgLy8gICAga2V5SW5mby5rZXlbMTYgKyBrXSA9IGtleUluZm8ua2V5WzI0ICsga107CisgICAgICAgICAgICAgICAgLy8gICAga2V5SW5mby5rZXlbMjQgKyBrXSA9IHRlbXA7CisgICAgICAgICAgICAgICAgLy99CisgICAgICAgICAgICAgICAgLy9DYW1FbmNyeVR5cGUgPSBaTV9US0lQOworICAgICAgICAgICAgICAgIC8vLy9pZiAoaWR4ID09IDApCisgICAgICAgICAgICAgICAgLy97Ly8gUGFpcndpc2Uga2V5CisgICAgICAgICAgICAgICAgLy8gICAgbUtleUZvcm1hdFswXSA9IENhbUVuY3J5VHlwZTsKKyAgICAgICAgICAgICAgICAvLyAgICBtRHluS2V5TW9kZSA9IHBTZXR0aW5nLT5EeW5LZXlNb2RlID0gRFlOX0tFWV9US0lQOworICAgICAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcCh6ZHBhcm0tPnUuY3J5cHQuYWxnLCAiQ0NNUCIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmaVdsYW5TZXRFbmNyeU1vZGUoZGV2LCBaTV9BRVMpOworICAgICAgICAgICAgICAgIC8vQ2FtRW5jcnlUeXBlID0gWk1fQUVTOworICAgICAgICAgICAgICAgIC8vLy9pZiAoaWR4ID09IDApCisgICAgICAgICAgICAgICAgLy97Ly8gUGFpcndpc2Uga2V5CisgICAgICAgICAgICAgICAgLy8gICAgbUtleUZvcm1hdFswXSA9IENhbUVuY3J5VHlwZTsKKyAgICAgICAgICAgICAgICAvLyAgICBtRHluS2V5TW9kZSA9IHBTZXR0aW5nLT5EeW5LZXlNb2RlID0gRFlOX0tFWV9BRVM7CisgICAgICAgICAgICAgICAgLy99CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKHpkcGFybS0+dS5jcnlwdC5hbGcsICJXRVAiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoa2V5SW5mby5rZXlMZW5ndGggPT0gNSkKKyAgICAgICAgICAgICAgICB7IC8vIFdFUCA2NAorICAgICAgICAgICAgICAgICAgICB6ZmlXbGFuU2V0RW5jcnlNb2RlKGRldiwgWk1fV0VQNjQpOworICAgICAgICAgICAgICAgIC8vICAgIENhbUVuY3J5VHlwZSA9IFpNX1dFUDY0OworICAgICAgICAgICAgICAgIC8vICAgIHRtcER5bktleU1vZGU9RFlOX0tFWV9XRVA2NDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoa2V5SW5mby5rZXlMZW5ndGggPT0gMTMpCisgICAgICAgICAgICAgICAgey8va2V5bGVuPTEzLCBXRVAgMTI4CisgICAgICAgICAgICAgICAgICAgIHpmaVdsYW5TZXRFbmNyeU1vZGUoZGV2LCBaTV9XRVAxMjgpOworICAgICAgICAgICAgICAgIC8vICAgIENhbUVuY3J5VHlwZSA9IFpNX1dFUDEyODsKKyAgICAgICAgICAgICAgICAvLyAgICB0bXBEeW5LZXlNb2RlPURZTl9LRVlfV0VQMTI4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB6ZmlXbGFuU2V0RW5jcnlNb2RlKGRldiwgWk1fV0VQMjU2KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBGb3IgRHluYW1pYyBXRVAga2V5IChOb24tV1BBIFJhZGl1cyksIHRoZSBrZXkgSUQgcmFuZ2U6IDAtMworICAgICAgICAgICAgICAgIC8vIEluIFdQQS9SU04gbW9kZSwgdGhlIGtleSBJRCByYW5nZTogMS0zLCB1c3VhbGx5LCBhIGJyb2FkY2FzdCBrZXkuCisgICAgICAgICAgICAgICAgLy8gRm9yIFdFUCBrZXkgc2V0dGluZzogd2Ugc2V0IG1EeW5LZXlNb2RlIGFuZCBtS2V5Rm9ybWF0IGluIGZvbGxvd2luZyBjYXNlOgorICAgICAgICAgICAgICAgIC8vICAgMS4gRm9yIDgwMi4xeCBkeW5hbWljYWxseSBnZW5lcmF0ZWQgV0VQIGtleSBtZXRob2QuCisgICAgICAgICAgICAgICAgLy8gICAyLiBGb3IgV1BBL1JTTiBtb2RlLCBidXQga2V5IGlkID09IDAuIChCdXQgdGhpcyBpcyBhbiBpbXBvc3NpYmxlIGNhc2UpCisgICAgICAgICAgICAgICAgLy8gU28sIG9ubHkgY2hlY2sgY2FzZSAxLgorICAgICAgICAgICAgICAgIC8vaWYgKG1hY3AtPmNhcmRTZXR0aW5nLldQQUllTGVuPT0wKQorICAgICAgICAgICAgICAgIC8veworICAgICAgICAgICAgICAgIC8vICAgIG1LZXlGb3JtYXRbMF0gPSBDYW1FbmNyeVR5cGU7CisgICAgICAgICAgICAgICAgLy8gICAgbUR5bktleU1vZGUgPSBwU2V0dGluZy0+RHluS2V5TW9kZSA9IHRtcER5bktleU1vZGU7CisgICAgICAgICAgICAgICAgLy8gICAgbVByaXZhY3lJbnZva2VkWzBdPVRSVUU7CisgICAgICAgICAgICAgICAgLy8gICAgbUNhcFswXSB8PSBDQVBfUFJJVkFDWTsKKyAgICAgICAgICAgICAgICAvLyAgICBtYWNwLT5jYXJkU2V0dGluZy5FbmNyeU9uT2ZmWzBdPTE7CisgICAgICAgICAgICAgICAgLy99CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIERVTVAga2V5IGNvbnRleHQgKi8KKy8vI2lmZGVmIFdQQV9ERUJVRworICAgICAgICAgICAgaWYgKGtleUluZm8ua2V5TGVuZ3RoID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaWk7CisgICAgICAgICAgICAgICAgcHJpbnRrKCJPdHVzOiBLZXkgQ29udGV4dDpcbiIpOworICAgICAgICAgICAgICAgIGZvcihpaSA9IDA7IGlpIDwga2V5SW5mby5rZXlMZW5ndGg7KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIweCUwMnggIiwga2V5SW5mby5rZXlbaWldKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoKCsraWkgJSAxNikgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJpbnRrKCJcbiIpOworICAgICAgICAgICAgfQorLy8jZW5kaWYKKworICAgICAgICAgICAgLyogU2V0IGVuY3J5cHQgbW9kZSAqLworICAgICAgICAgICAgLy96ZmlXbGFuU2V0RW5jcnlNb2RlKGRldiwgQ2FtRW5jcnlUeXBlKTsKKyAgICAgICAgICAgIHZhcElkID0gemZMbnhHZXRWYXBJZChkZXYpOworICAgICAgICAgICAgaWYgKHZhcElkID09IDB4ZmZmZikKKyAgICAgICAgICAgICAgICBrZXlJbmZvLnZhcElkID0gMDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBrZXlJbmZvLnZhcElkID0gdmFwSWQgKyAxOworICAgICAgICAgICAga2V5SW5mby52YXBBZGRyWzBdID0ga2V5SW5mby5tYWNBZGRyWzBdOworICAgICAgICAgICAga2V5SW5mby52YXBBZGRyWzFdID0ga2V5SW5mby5tYWNBZGRyWzFdOworICAgICAgICAgICAga2V5SW5mby52YXBBZGRyWzJdID0ga2V5SW5mby5tYWNBZGRyWzJdOworCisgICAgICAgICAgICB6ZmlXbGFuU2V0S2V5KGRldiwga2V5SW5mbyk7CisKKyAgICAgICAgICAgIC8vemZpV2xhbkRpc2FibGUoZGV2KTsKKyAgICAgICAgICAgIC8vemZpV2xhbkVuYWJsZShkZXYpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaRF9DTURfU0VUX01MTUU6CisgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgInVzYmRydl93cGFfaW9jdGw6IFpEX0NNRF9TRVRfTUxNRVxuIik7CisKKyAgICAgICAgICAgIC8qIFRyYW5zbGF0ZSBTVEEncyBhZGRyZXNzICovCisgICAgICAgICAgICBzcHJpbnRmKG1hY19hZGRyLCAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLCB6ZHBhcm0tPnN0YV9hZGRyWzBdLCB6ZHBhcm0tPnN0YV9hZGRyWzFdLAorICAgICAgICAgICAgICAgIHpkcGFybS0+c3RhX2FkZHJbMl0sIHpkcGFybS0+c3RhX2FkZHJbM10sIHpkcGFybS0+c3RhX2FkZHJbNF0sIHpkcGFybS0+c3RhX2FkZHJbNV0pOworCisgICAgICAgICAgICBzd2l0Y2goemRwYXJtLT51Lm1sbWUuY21kKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgTUxNRV9TVEFfREVBVVRIOgorICAgICAgICAgICAgICAgICAgICBwcmludGsoIiAtLS0tLS0tQ2FsbCB6ZmlXbGFuRGVhdXRoLCByZWFzb246JWRcbiIsemRwYXJtLT51Lm1sbWUucmVhc29uX2NvZGUpOworICAgICAgICAgICAgICAgICAgICBpZih6ZmlXbGFuRGVhdXRoKGRldiwgKHUxNl90KikgemRwYXJtLT5zdGFfYWRkciwgemRwYXJtLT51Lm1sbWUucmVhc29uX2NvZGUpICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIkNhbid0IGRlYXV0aGVuY2F0ZSBTVEE6ICVzXG4iLCBtYWNfYWRkcik7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiRGVhdXRoZW50aWNhdGUgU1RBOiAlcyB3aXRoIHJlYXNvbiBjb2RlOiAlZFxuIiwgbWFjX2FkZHIsIHpkcGFybS0+dS5tbG1lLnJlYXNvbl9jb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1MTUVfU1RBX0RJU0FTU09DOgorICAgICAgICAgICAgICAgICAgICBwcmludGsoIiAtLS0tLS0tQ2FsbCB6ZmlXbGFuRGVhdXRoLCByZWFzb246JWRcbiIsemRwYXJtLT51Lm1sbWUucmVhc29uX2NvZGUpOworICAgICAgICAgICAgICAgICAgICBpZih6ZmlXbGFuRGVhdXRoKGRldiwgKHUxNl90KikgemRwYXJtLT5zdGFfYWRkciwgemRwYXJtLT51Lm1sbWUucmVhc29uX2NvZGUpICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIkNhbid0IGRpc2Fzc29jaWF0ZSBTVEE6ICVzXG4iLCBtYWNfYWRkcik7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiRGlzYXNzb2NpYXRlIFNUQTogJXMgd2l0aCByZWFzb24gY29kZTogJWRcbiIsIG1hY19hZGRyLCB6ZHBhcm0tPnUubWxtZS5yZWFzb25fY29kZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJNTE1FIGNvbW1hbmQ6IDB4JTA0eCBub3Qgc3VwcG9ydFxuIiwgemRwYXJtLT51Lm1sbWUuY21kKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWkRfQ01EX1NDQU5fUkVROgorICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ1c2JkcnZfd3BhX2lvY3RsOiBaRF9DTURfU0NBTl9SRVFcbiIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaRF9DTURfU0VUX0dFTkVSSUNfRUxFTUVOVDoKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAidXNiZHJ2X3dwYV9pb2N0bDogWkRfQ01EX1NFVF9HRU5FUklDX0VMRU1FTlRcbiIpOworCisgICAgICAgICAgICAvKiBDb3B5IHRoZSBXUEEgSUUgKi8KKyAgICAgICAgICAgIC8vem1fbXNnMV9tbShaTV9MVl8wLCAiQ1dZIC0gd3BhaWUgTGVuZ3RoIDogIiwgemRwYXJtLT51LmdlbmVyaWNfZWxlbS5sZW4pOworICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ3cGFpZSBMZW5ndGggOiAlZFxuIiwgemRwYXJtLT51LmdlbmVyaWNfZWxlbS5sZW4pOworICAgICAgICAgICAgaWYgKHpmaVdsYW5RdWVyeVdsYW5Nb2RlKGRldikgPT0gWk1fTU9ERV9BUCkgLy8gQVAgTW9kZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHpmaVdsYW5TZXRXcGFJZShkZXYsIHpkcGFybS0+dS5nZW5lcmljX2VsZW0uZGF0YSwgemRwYXJtLT51LmdlbmVyaWNfZWxlbS5sZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1hY3AtPnN1cExlbiA9IHpkcGFybS0+dS5nZW5lcmljX2VsZW0ubGVuOworICAgICAgICAgICAgICAgIG1lbWNweShtYWNwLT5zdXBJZSwgemRwYXJtLT51LmdlbmVyaWNfZWxlbS5kYXRhLCB6ZHBhcm0tPnUuZ2VuZXJpY19lbGVtLmxlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB6ZmlXbGFuU2V0V3BhU3VwcG9ydChkZXYsIDEpOworICAgICAgICAgICAgLy96ZmlXbGFuU2V0V3BhSWUoZGV2LCB6ZHBhcm0tPnUuZ2VuZXJpY19lbGVtLmRhdGEsIHpkcGFybS0+dS5nZW5lcmljX2VsZW0ubGVuKTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaWk7CisgICAgICAgICAgICAgICAgdThfdCBsZW4gPSB6ZHBhcm0tPnUuZ2VuZXJpY19lbGVtLmxlbjsKKyAgICAgICAgICAgICAgICB1OF90ICp3cGFpZSA9ICh1OF90ICopemRwYXJtLT51LmdlbmVyaWNfZWxlbS5kYXRhOworCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ3ZC0+YXAud3BhTGVuOiAlZFxuIiwgbGVuKTsKKworICAgICAgICAgICAgICAgIC8qIERVTVAgV1BBIElFICovCisgICAgICAgICAgICAgICAgZm9yKGlpID0gMDsgaWkgPCBsZW47KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIweCUwMnggIiwgd3BhaWVbaWldKTsKKworICAgICAgICAgICAgICAgICAgICBpZigoKytpaSAlIDE2KSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIlxuIik7CisgICAgICAgICAgICB9CisKKy8vICAgICAgICAgICAgI2lmZGVmIFpNX0hPU1RBUERfU1VQUE9SVAorICAgICAgICAgICAgLy9pZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVApCisgICAgICAgICAgICAvL3svLyBVcGRhdGUgQmVhY29uIEZJRk8gaW4gdGhlIG5leHQgVEJUVC4KKyAgICAgICAgICAgIC8vICAgIG1lbWNweSgmbVdQQUllLCBwU2V0dGluZy0+V1BBSWUsIHBTZXR0aW5nLT5XUEFJZUxlbik7CisgICAgICAgICAgICAvLyAgICBwcmludGsoS0VSTl9FUlIgIkNvcHkgV1BBIElFIGludG8gbVdQQUllXG4iKTsKKyAgICAgICAgICAgIC8vfQorLy8gICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIGJyZWFrOworCisvLyAgICAgICAgI2lmZGVmIFpNX0hPU1RBUERfU1VQUE9SVAorICAgICAgICBjYXNlIFpEX0NNRF9HRVRfVFNDOgorICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ1c2JkcnZfd3BhX2lvY3RsOiBaRF9DTURfR0VUX1RTQ1xuIik7CisgICAgICAgICAgICBicmVhazsKKy8vICAgICAgICAjZW5kaWYKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ1c2JkcnZfd3BhX2lvY3RsIGRlZmF1bHQ6IDB4JTA0eFxuIiwgemRwYXJtLT5jbWQpOworICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworaW50IHVzYmRydl9jZW5jX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCB6eWRhc19jZW5jX3BhcmFtICp6ZHBhcm0pCit7CisgICAgLy9zdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgc3RydWN0IHpzS2V5SW5mbyBrZXlJbmZvOworICAgIHUxNl90IGFwSWQ7CisgICAgdThfdCBiY19hZGRyWzZdID0geyAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmIH07CisgICAgaW50IHJldCA9IDA7CisgICAgaW50IGlpOworCisgICAgLyogR2V0IHRoZSBBUCBJZCAqLworICAgIGFwSWQgPSB6ZkxueEdldFZhcElkKGRldik7CisKKyAgICBpZiAoYXBJZCA9PSAweGZmZmYpCisgICAgeworICAgICAgICBhcElkID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBJZCA9IGFwSWQrMTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHpkcGFybS0+Y21kKQorICAgIHsKKyAgICAgICAgY2FzZSBaTV9DTURfQ0VOQ19TRVRDRU5DOgorICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJaTV9DTURfQ0VOQ19TRVRDRU5DXG4iKTsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAibGVuZ3RoOiAlZFxuIiwgemRwYXJtLT5sZW4pOworICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJwb2xpY3k6ICVkXG4iLCB6ZHBhcm0tPnUuaW5mby5jZW5jX3BvbGljeSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBaTV9DTURfQ0VOQ19TRVRLRVk6CisgICAgICAgICAgICAvL3JldCA9IHdhaV9pb2N0bF9zZXRrZXkodmFwLCBpb2N0bF9tc2cpOworICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJaTV9DTURfQ0VOQ19TRVRLRVlcbiIpOworCisgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIk1BQyBhZGRyZXNzPSAiKTsKKyAgICAgICAgICAgIGZvcihpaSA9IDA7IGlpIDwgNjsgaWkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIjB4JTAyeCAiLCB6ZHBhcm0tPnUuY3J5cHQuc3RhX2FkZHJbaWldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiXG4iKTsKKworICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJLZXkgSW5kZXg6ICVkXG4iLCB6ZHBhcm0tPnUuY3J5cHQua2V5aWQpOworICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJFbmNyeXB0aW9uIGtleT0gIik7CisgICAgICAgICAgICBmb3IoaWkgPSAwOyBpaSA8IDE2OyBpaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiMHglMDJ4ICIsIHpkcGFybS0+dS5jcnlwdC5rZXlbaWldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiXG4iKTsKKworICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJNSUMga2V5PSAiKTsKKyAgICAgICAgICAgIGZvcihpaSA9IDE2OyBpaSA8IFpNX0NFTkNfS0VZX1NJWkU7IGlpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIweCUwMnggIiwgemRwYXJtLT51LmNyeXB0LmtleVtpaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJcbiIpOworCisgICAgICAgICAgICAvKiBTZXQgdXAga2V5IGluZm9ybWF0aW9uICovCisgICAgICAgICAgICBrZXlJbmZvLmtleUxlbmd0aCA9IFpNX0NFTkNfS0VZX1NJWkU7CisgICAgICAgICAgICBrZXlJbmZvLmtleUluZGV4ID0gemRwYXJtLT51LmNyeXB0LmtleWlkOworICAgICAgICAgICAga2V5SW5mby5mbGFnID0gWk1fS0VZX0ZMQUdfQVVUSEVOVElDQVRPUiB8IFpNX0tFWV9GTEFHX0NFTkM7CisgICAgICAgICAgICBrZXlJbmZvLmtleSA9IHpkcGFybS0+dS5jcnlwdC5rZXk7CisgICAgICAgICAgICBrZXlJbmZvLm1hY0FkZHIgPSAodTE2X3QgKil6ZHBhcm0tPnUuY3J5cHQuc3RhX2FkZHI7CisKKyAgICAgICAgICAgIC8qIElkZW50aWZ5IHRoZSBNQUMgYWRkcmVzcyBpbmZvcm1hdGlvbiAqLworICAgICAgICAgICAgaWYgKG1lbWNtcCh6ZHBhcm0tPnUuY3J5cHQuc3RhX2FkZHIsIGJjX2FkZHIsIHNpemVvZihiY19hZGRyKSkgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBrZXlJbmZvLmZsYWcgfD0gWk1fS0VZX0ZMQUdfR0s7CisgICAgICAgICAgICAgICAga2V5SW5mby52YXBJZCA9IGFwSWQ7CisgICAgICAgICAgICAgICAgbWVtY3B5KGtleUluZm8udmFwQWRkciwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGtleUluZm8uZmxhZyB8PSBaTV9LRVlfRkxBR19QSzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgemZpV2xhblNldEtleShkZXYsIGtleUluZm8pOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBaTV9DTURfQ0VOQ19SRUtFWToKKyAgICAgICAgICAgIC8vcmV0ID0gd2FpX2lvY3RsX3Jla2V5KHZhcCwgaW9jdGxfbXNnKTsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiWk1fQ01EX0NFTkNfUkVLRVlcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXQgPSAtRU9QTk9UU1VQUDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgfQorCisgICAgLy9pZiAocmV0diA9PSBFTkVUUkVTRVQpCisgICAgLy8gICAgcmV0diA9IElTX1VQX0FVVE8odmFwKSA/IGllZWU4MDIxMV9vcGVuKHZhcC0+aXZfZGV2KSA6IDA7CisKKyAgICByZXR1cm4gcmV0OworfQorI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitpbnQgdXNiZHJ2X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworLy8gICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwOworLy8gICAgdm9pZCAqcmVncDsKKyAgICBzdHJ1Y3QgemRhcF9pb2N0bCB6ZHJlcTsKKyAgICBzdHJ1Y3QgaXdyZXEgKndycSA9IChzdHJ1Y3QgaXdyZXEgKilpZnI7CisgICAgc3RydWN0IGF0aHJfd2xhbl9wYXJhbSB6ZHBhcm07CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgaW50IGVyciA9IDA7CisgICAgaW50IGNoYW5nZWQgPSAwOworCisvLyAgICByZWdwID0gbWFjcC0+cmVncDsKKworICAgIGlmKCFuZXRpZl9ydW5uaW5nKGRldikpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgc3dpdGNoIChjbWQpCisgICAgeworICAgICAgICAgICAgY2FzZSBTSU9DR0lXTkFNRToKKyAgICAgICAgICAgIHN0cmNweSh3cnEtPnUubmFtZSwgIklFRUUgODAyLjExLURTIik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNJT0NHSVdBUDoKKyAgICAgICAgICAgIGVyciA9IHVzYmRydndleHRfZ2l3YXAoZGV2LCBOVUxMLCAmd3JxLT51LmFwX2FkZHIsIE5VTEwpOworICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICBjYXNlIFNJT0NTSVdBUDoKKyAgICAgICAgICAgIGVyciA9IHVzYmRydndleHRfc2l3YXAoZGV2LCBOVUxMLCAmd3JxLT51LmFwX2FkZHIsIE5VTEwpOworICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICBjYXNlIFNJT0NHSVdNT0RFOgorICAgICAgICAgICAgZXJyID0gdXNiZHJ2d2V4dF9naXdtb2RlKGRldiwgTlVMTCwgJndycS0+dS5tb2RlLCBOVUxMKTsKKyAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgY2FzZSBTSU9DU0lXRVNTSUQ6CisgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIkNXWSAtIHVzYmRydndleHRfc2l3ZXNzaWRcbiIpOworICAgICAgICAgICAgLy9lcnIgPSB1c2JkcnZfaW9jdGxfc2V0ZXNzaWQoZGV2LCAmd3JxLT51LmVzc2lkKTsKKyAgICAgICAgICAgIGVyciA9IHVzYmRydndleHRfc2l3ZXNzaWQoZGV2LCBOVUxMLCAmd3JxLT51LmVzc2lkLCBOVUxMKTsKKworICAgICAgICAgICAgaWYgKCEgZXJyKQorICAgICAgICAgICAgICAgIGNoYW5nZWQgPSAxOworICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICBjYXNlIFNJT0NHSVdFU1NJRDoKKyAgICAgICAgICAgIGVyciA9IHVzYmRydndleHRfZ2l3ZXNzaWQoZGV2LCBOVUxMLCAmd3JxLT51LmVzc2lkLCBOVUxMKTsKKyAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgY2FzZSBTSU9DU0lXUlRTOgorCisgICAgICAgICAgICBlcnIgPSB1c2JkcnZfaW9jdGxfc2V0cnRzKGRldiwgJndycS0+dS5ydHMpOworICAgICAgICAgICAgaWYgKCEgZXJyKQorICAgICAgICAgICAgICAgIGNoYW5nZWQgPSAxOworICAgICAgICAgICAgYnJlYWs7CisKKworCQljYXNlIFNJT0NJV0ZJUlNUUFJJViArIDB4MjogLyogc2V0X2F1dGggKi8KKwkJeworCQkJLy9wcmludGsoIkNXWSAtIFNJT0NJV0ZJUlNUUFJJViArIDB4MiAoc2V0X2F1dGgpXG4iKTsKKwkJCWlmICghIGNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQl7CisJCQkJZXJyID0gLUVQRVJNOworCQkJCWJyZWFrOworCQkJfQorCQkJeworCQkJCWludCB2YWwgPSAqKCAoaW50ICopIHdycS0+dS5uYW1lICk7CisJCQkJaWYgKCh2YWwgPCAwKSB8fCAodmFsID4gMikpCisJCQkJeworCQkJCQllcnIgPSAtRUlOVkFMOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJemZpV2xhblNldEF1dGhlbnRpY2F0aW9uTW9kZShkZXYsIHZhbCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1hY3AtPkRldmljZU9wZW5lZCA9PSAxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB6ZmlXbGFuRGlzYWJsZShkZXYsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgemZpV2xhbkVuYWJsZShkZXYpOworICAgICAgICAgICAgICAgICAgICB9CisKKwkJCQkJZXJyID0gMDsKKwkJCQkJY2hhbmdlZCA9IDE7CisJCQkJfQorCQkJfQorCQl9CisJCQlicmVhazsKKworCQljYXNlIFNJT0NJV0ZJUlNUUFJJViArIDB4MzogLyogZ2V0X2F1dGggKi8KKwkJeworCQkgICAgaW50IEF1dGhNb2RlID0gWk1fQVVUSF9NT0RFX09QRU47CisKKwkJCS8vcHJpbnRrKCJDV1kgLSBTSU9DSVdGSVJTVFBSSVYgKyAweDMgKGdldF9hdXRoKVxuIik7CisKKwkJCWlmICh3cnEtPnUuZGF0YS5wb2ludGVyKQorCQkJeworCQkJCXdycS0+dS5kYXRhLmZsYWdzID0gMTsKKworCQkJCUF1dGhNb2RlID0gemZpV2xhblF1ZXJ5QXV0aGVudGljYXRpb25Nb2RlKGRldiwgMCk7CisJCQkJaWYgKEF1dGhNb2RlID09IFpNX0FVVEhfTU9ERV9PUEVOKQorCQkJCXsKKwkJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gMTI7CisKKwkJCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAib3BlbiBzeXN0ZW0iLCAxMikpCisJCQkJCXsKKwkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYgKEF1dGhNb2RlID09IFpNX0FVVEhfTU9ERV9TSEFSRURfS0VZKQorCQkJCXsKKwkJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gMTE7CisKKwkJCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAic2hhcmVkIGtleSIsIDExKSkKKwkJCQkJeworCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZiAoQXV0aE1vZGUgPT0gWk1fQVVUSF9NT0RFX0FVVE8pCisJCQkJeworCQkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAxMDsKKworCQkJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICJhdXRvIG1vZGUiLCAxMCkpCisJCQkJCXsKKwkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCX0KKwkJfQorCQkJYnJlYWs7CisKKworICAgICAgICBjYXNlIFpEQVBJT0NUTDogICAgLy9kZWJ1ZyBjb21tYW5kCisgICAgICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoJnpkcmVxLCBpZnItPmlmcl9kYXRhLCBzaXplb2YgKHpkcmVxKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ1c2JkcnY6IGNvcHlfZnJvbV91c2VyIGVycm9yXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9wcmludGsoS0VSTl9ERUJVRyAidXNiZHJ2OiBjbWQ9JTJ4LCByZWc9MHglMDRseCwgdmFsdWU9MHglMDhseFxuIiwKKyAgICAgICAgICAgIC8vICAgICAgICB6ZHJlcS5jbWQsIHpkcmVxLmFkZHIsIHpkcmVxLnZhbHVlKTsKKworCQkJemZMbnhQcml2YXRlSW9jdGwoZGV2LCAmemRyZXEpOworCisgICAgICAgICAgICBlcnIgPSAwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaRF9JT0NUTF9XUEE6CisgICAgICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoJnpkcGFybSwgaWZyLT5pZnJfZGF0YSwgc2l6ZW9mKHN0cnVjdCBhdGhyX3dsYW5fcGFyYW0pKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgInVzYmRydjogY29weV9mcm9tX3VzZXIgZXJyb3JcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1c2JkcnZfd3BhX2lvY3RsKGRldiwgJnpkcGFybSk7CisgICAgICAgICAgICBlcnIgPSAwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBaRF9JT0NUTF9QQVJBTToKKyAgICAgICAgeworICAgICAgICAgICAgaW50ICpwOworICAgICAgICAgICAgaW50IG9wOworICAgICAgICAgICAgaW50IGFyZzsKKworICAgICAgICAgICAgLyogUG9pbnQgdG8gdGhlIG5hbWUgZmllbGQgYW5kIHJldHJpZXZlIHRoZQorICAgICAgICAgICAgICogb3AgYW5kIGFyZyBlbGVtZW50cy4gICAgICAgICAgKi8KKyAgICAgICAgICAgIHAgPSAoaW50ICopd3JxLT51Lm5hbWU7CisgICAgICAgICAgICBvcCA9ICpwKys7CisgICAgICAgICAgICBhcmcgPSAqcDsKKworICAgICAgICAgICAgaWYob3AgPT0gWkRfUEFSQU1fUk9BTUlORykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIioqKioqKioqKioqKiogWkRfUEFSQU1fUk9BTUlORzogJWRcbiIsIGFyZyk7CisgICAgICAgICAgICAgICAgLy9tYWNwLT5jYXJkU2V0dGluZy5hcF9zY2FuPShVOClhcmc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihvcCA9PSBaRF9QQVJBTV9QUklWQUNZKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiWkRfSU9DVExfUFJJVkFDWTogIik7CisKKyAgICAgICAgICAgICAgICAvKiBUdXJuIG9uIHRoZSBwcml2YWN5IGludm9rZSBmbGFnICovCisgICAgICAgICAgICAgICAgaWYoYXJnKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyAgICBtQ2FwWzBdIHw9IENBUF9QUklWQUNZOworICAgICAgICAgICAgICAgIC8vICAgIG1hY3AtPmNhcmRTZXR0aW5nLkVuY3J5T25PZmZbMF0gPSAxOworICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImVuYWJsZVxuIik7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyAgICBtQ2FwWzBdICY9IH5DQVBfUFJJVkFDWTsKKyAgICAgICAgICAgICAgICAvLyAgICBtYWNwLT5jYXJkU2V0dGluZy5FbmNyeU9uT2ZmWzBdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJkaXNhYmxlXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY2hhbmdlZD0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYob3AgPT0gWkRfUEFSQU1fV1BBKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiWkRfUEFSQU1fV1BBOiAiKTsKKworICAgICAgICAgICAgICAgIGlmKGFyZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiZW5hYmxlXG4iKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoemZpV2xhblF1ZXJ5V2xhbk1vZGUoZGV2KSAhPSBaTV9NT0RFX0FQKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIlN0YXRpb24gTW9kZVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3pmaVdsYW5RdWVyeVdwYUllKGRldiwgKHU4X3QgKikmd3BhSWUsICZ3cGFsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmludGsoIndwYUllIDogJTJ4LCUyeCwlMnhcbiIsIHdwYUllWzIxXSwgd3BhSWVbMjJdLCB3cGFJZVsyM10pOworICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmludGsoInJzbkllIDogJTJ4LCUyeCwlMnhcbiIsIHdwYUllWzE3XSwgd3BhSWVbMThdLCB3cGFJZVsxOV0pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChtYWNwLT5zdXBJZVsyMV0gPT0gMHg1MCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFjcC0+c3VwSWVbMjJdID09IDB4ZjIpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hY3AtPnN1cEllWzIzXSA9PSAweDIpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAid2QtPnN0YS5hdXRoTW9kZSA9IFpNX0FVVEhfTU9ERV9XUEFQU0tcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vd2QtPnN0YS5hdXRoTW9kZSA9IFpNX0FVVEhfTU9ERV9XUEFQU0s7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy93ZC0+d3MuYXV0aE1vZGUgPSBaTV9BVVRIX01PREVfV1BBUFNLOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmaVdsYW5TZXRBdXRoZW50aWNhdGlvbk1vZGUoZGV2LCBaTV9BVVRIX01PREVfV1BBUFNLKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChtYWNwLT5zdXBJZVsyMV0gPT0gMHg1MCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYWNwLT5zdXBJZVsyMl0gPT0gMHhmMikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYWNwLT5zdXBJZVsyM10gPT0gMHgxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIndkLT5zdGEuYXV0aE1vZGUgPSBaTV9BVVRIX01PREVfV1BBXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3dkLT5zdGEuYXV0aE1vZGUgPSBaTV9BVVRIX01PREVfV1BBOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vd2QtPndzLmF1dGhNb2RlID0gWk1fQVVUSF9NT0RFX1dQQTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZmlXbGFuU2V0QXV0aGVudGljYXRpb25Nb2RlKGRldiwgWk1fQVVUSF9NT0RFX1dQQSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgobWFjcC0+c3VwSWVbMTddID09IDB4ZikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYWNwLT5zdXBJZVsxOF0gPT0gMHhhYykgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYWNwLT5zdXBJZVsxOV0gPT0gMHgyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIndkLT5zdGEuYXV0aE1vZGUgPSBaTV9BVVRIX01PREVfV1BBMlBTS1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy93ZC0+c3RhLmF1dGhNb2RlID0gWk1fQVVUSF9NT0RFX1dQQTJQU0s7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy93ZC0+d3MuYXV0aE1vZGUgPSBaTV9BVVRIX01PREVfV1BBMlBTSzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZmlXbGFuU2V0QXV0aGVudGljYXRpb25Nb2RlKGRldiwgWk1fQVVUSF9NT0RFX1dQQTJQU0spOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKG1hY3AtPnN1cEllWzE3XSA9PSAweGYpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFjcC0+c3VwSWVbMThdID09IDB4YWMpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFjcC0+c3VwSWVbMTldID09IDB4MSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ3ZC0+c3RhLmF1dGhNb2RlID0gWk1fQVVUSF9NT0RFX1dQQTJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vd2QtPnN0YS5hdXRoTW9kZSA9IFpNX0FVVEhfTU9ERV9XUEEyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vd2QtPndzLmF1dGhNb2RlID0gWk1fQVVUSF9NT0RFX1dQQTI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZpV2xhblNldEF1dGhlbnRpY2F0aW9uTW9kZShkZXYsIFpNX0FVVEhfTU9ERV9XUEEyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobWFjcC0+c3VwSWVbMjFdID09IDB4NTApIHx8IChtYWNwLT5zdXBJZVsyMl0gPT0gMHhmMikpLy9XUEEgb3IgV1BBUFNLCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hY3AtPnN1cEllWzExXSA9PSAweDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIndkLT5zdGEud2VwU3RhdHVzID0gWk1fRU5DUllQVElPTl9US0lQXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy93ZC0+c3RhLndlcFN0YXR1cyA9IFpNX0VOQ1JZUFRJT05fVEtJUDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy93ZC0+d3Mud2VwU3RhdHVzID0gWk1fRU5DUllQVElPTl9US0lQOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZmlXbGFuU2V0V2VwU3RhdHVzKGRldiwgWk1fRU5DUllQVElPTl9US0lQKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ3ZC0+c3RhLndlcFN0YXR1cyA9IFpNX0VOQ1JZUFRJT05fQUVTXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy93ZC0+c3RhLndlcFN0YXR1cyA9IFpNX0VOQ1JZUFRJT05fQUVTOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3dkLT53cy53ZXBTdGF0dXMgPSBaTV9FTkNSWVBUSU9OX0FFUzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZpV2xhblNldFdlcFN0YXR1cyhkZXYsIFpNX0VOQ1JZUFRJT05fQUVTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG1hY3AtPnN1cEllWzE3XSA9PSAweGYpIHx8IChtYWNwLT5zdXBJZVsxOF0gPT0gMHhhYykpIC8vV1BBMiBvciBXUEEyUFNLCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hY3AtPnN1cEllWzEzXSA9PSAweDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIndkLT5zdGEud2VwU3RhdHVzID0gWk1fRU5DUllQVElPTl9US0lQXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy93ZC0+c3RhLndlcFN0YXR1cyA9IFpNX0VOQ1JZUFRJT05fVEtJUDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy93ZC0+d3Mud2VwU3RhdHVzID0gWk1fRU5DUllQVElPTl9US0lQOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZmlXbGFuU2V0V2VwU3RhdHVzKGRldiwgWk1fRU5DUllQVElPTl9US0lQKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ3ZC0+c3RhLndlcFN0YXR1cyA9IFpNX0VOQ1JZUFRJT05fQUVTXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy93ZC0+c3RhLndlcFN0YXR1cyA9IFpNX0VOQ1JZUFRJT05fQUVTOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3dkLT53cy53ZXBTdGF0dXMgPSBaTV9FTkNSWVBUSU9OX0FFUzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZpV2xhblNldFdlcFN0YXR1cyhkZXYsIFpNX0VOQ1JZUFRJT05fQUVTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgemZpV2xhblNldFdwYVN1cHBvcnQoZGV2LCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogUmVzZXQgdGhlIFdQQSByZWxhdGVkIHZhcmlhYmxlcyAqLworICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImRpc2FibGVcbiIpOworCisgICAgICAgICAgICAgICAgICAgIHpmaVdsYW5TZXRXcGFTdXBwb3J0KGRldiwgMCk7CisgICAgICAgICAgICAgICAgICAgIHpmaVdsYW5TZXRBdXRoZW50aWNhdGlvbk1vZGUoZGV2LCBaTV9BVVRIX01PREVfT1BFTik7CisgICAgICAgICAgICAgICAgICAgIHpmaVdsYW5TZXRXZXBTdGF0dXMoZGV2LCBaTV9FTkNSWVBUSU9OX1dFUF9ESVNBQkxFRCk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogTm93IHdlIG9ubHkgc2V0IHRoZSBsZW5ndGggaW4gdGhlIFdQQSBJRQorICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCB0byB6ZXJvLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAvL21hY3AtPmNhcmRTZXR0aW5nLldQQUllWzFdID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihvcCA9PSBaRF9QQVJBTV9DT1VOVEVSTUVBU1VSRVMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICI9PT09PT09PT09PT09PT09WkRfUEFSQU1fQ09VTlRFUk1FQVNVUkVTOiAiKTsKKworICAgICAgICAgICAgICAgIGlmKGFyZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gICAgbUNvdW50ZXJNZWFzdXJlU3RhdGU9MTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJlbmFibGVcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vICAgIG1Db3VudGVyTWVhc3VyZVN0YXRlPTA7CisgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiZGlzYWJsZVxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYob3AgPT0gWkRfUEFSQU1fRFJPUFVORU5DUllQVEVEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiWkRfUEFSQU1fRFJPUFVORU5DUllQVEVEOiAiKTsKKworICAgICAgICAgICAgICAgIGlmKGFyZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiZW5hYmxlXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJkaXNhYmxlXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihvcCA9PSBaRF9QQVJBTV9BVVRIX0FMR1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJaRF9QQVJBTV9BVVRIX0FMR1M6ICIpOworCisgICAgICAgICAgICAgICAgaWYoYXJnID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIk9QRU5fU1lTVEVNXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJTSEFSRURfS0VZXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihvcCA9PSBaRF9QQVJBTV9XUFNfRklMVEVSKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiWkRfUEFSQU1fV1BTX0ZJTFRFUjogIik7CisKKyAgICAgICAgICAgICAgICBpZihhcmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vICAgIG1Db3VudGVyTWVhc3VyZVN0YXRlPTE7CisgICAgICAgICAgICAgICAgICAgIG1hY3AtPmZvcndhcmRNZ210ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJlbmFibGVcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vICAgIG1Db3VudGVyTWVhc3VyZVN0YXRlPTA7CisgICAgICAgICAgICAgICAgICAgIG1hY3AtPmZvcndhcmRNZ210ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJkaXNhYmxlXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgICAgIGVyciA9IDA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFpEX0lPQ1RMX0dFVFdQQUlFOgorICAgICAgICB7CisgICAgICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExcmVxX3dwYWllIHJlcV93cGFpZTsKKyAgICAgICAgICAgIHUxNl90IGFwSWQsIGksIGo7CisKKyAgICAgICAgICAgIC8qIEdldCB0aGUgQVAgSWQgKi8KKyAgICAgICAgICAgIGFwSWQgPSB6ZkxueEdldFZhcElkKGRldik7CisKKyAgICAgICAgICAgIGlmIChhcElkID09IDB4ZmZmZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcElkID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcElkID0gYXBJZCsxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoJnJlcV93cGFpZSwgaWZyLT5pZnJfZGF0YSwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFyZXFfd3BhaWUpKSl7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ1c2JkcnY6IGNvcHlfZnJvbV91c2VyIGVycm9yXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgWk1fT0FMX01BWF9TVEFfU1VQUE9SVDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcihqID0gMDsgaiA8IElFRUU4MDIxMV9BRERSX0xFTjsgaisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1hY3AtPnN0YXdwYWllW2ldLndwYV9tYWNhZGRyW2pdICE9IHJlcV93cGFpZS53cGFfbWFjYWRkcltqXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaiA9PSA2KQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpIDwgWk1fT0FMX01BWF9TVEFfU1VQUE9SVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3ByaW50aygiWkRfSU9DVExfR0VUV1BBSUUgLSBzdGEgaW5kZXggPSAlZFxuIiwgaSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KHJlcV93cGFpZS53cGFfaWUsIG1hY3AtPnN0YXdwYWllW2ldLndwYV9pZSwgSUVFRTgwMjExX01BWF9JRV9TSVpFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcmVxX3dwYWllLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMXJlcV93cGFpZSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICAgICBlcnIgPSAwOworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgY2FzZSBaTV9JT0NUTF9DRU5DOgorICAgICAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKCZtYWNwLT56ZF93cGFfcmVxLCBpZnItPmlmcl9kYXRhLCBzaXplb2Yoc3RydWN0IGF0aHJfd2xhbl9wYXJhbSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAidXNiZHJ2OiBjb3B5X2Zyb21fdXNlciBlcnJvclxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVzYmRydl9jZW5jX2lvY3RsKGRldiwgKHN0cnVjdCB6eWRhc19jZW5jX3BhcmFtICopJm1hY3AtPnpkX3dwYV9yZXEpOworICAgICAgICAgICAgZXJyID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGVyciA9IC1FT1BOT1RTVVBQOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisKKyAgICByZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvb2FsX2R0LmggYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9vYWxfZHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODJiOTc3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvb2FsX2R0LmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgTW9kdWxlIE5hbWUgOiBvYWxfZHQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGRhdGEgdHlwZSBkZWZpbml0aW9uLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFBsYXRmb3JtIGRlcGVuZGVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX09BTF9EVF9ICisjZGVmaW5lIF9PQUxfRFRfSAorCisvKiBQbGVhc2UgaW5jbHVkZSBoZWFkZXIgZmlsZXMgZm9yIGJ1ZmZlciB0eXBlIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBmaWxlICovCisvKiBQbGVhc2UgaW5jbHVkZSBoZWFkZXIgZmlsZXMgZm9yIGRldmljZSB0eXBlIGhlcmUgKi8KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKwordHlwZWRlZiAgICAgdW5zaWduZWQgbG9uZyBsb25nICB1NjRfdDsKK3R5cGVkZWYgICAgIHVuc2lnbmVkIGludCAgICAgICAgdTMyX3Q7Cit0eXBlZGVmICAgICB1bnNpZ25lZCBzaG9ydCAgICAgIHUxNl90OwordHlwZWRlZiAgICAgdW5zaWduZWQgY2hhciAgICAgICB1OF90OwordHlwZWRlZiAgICAgbG9uZyBsb25nICAgICAgICAgICBzNjRfdDsKK3R5cGVkZWYgICAgIGxvbmcgICAgICAgICAgICAgICAgczMyX3Q7Cit0eXBlZGVmICAgICBzaG9ydCAgICAgICAgICAgICAgIHMxNl90OwordHlwZWRlZiAgICAgY2hhciAgICAgICAgICAgICAgICBzOF90OworCisjaWZuZGVmICAgICBUUlVFCisjZGVmaW5lICAgICBUUlVFICAgICAgICAgICAgICAgICgxPT0xKQorI2VuZGlmCisKKyNpZm5kZWYgICAgIEZBTFNFCisjZGVmaW5lICAgICBGQUxTRSAgICAgICAgICAgICAgICgxPT0wKQorI2VuZGlmCisKKyNpZm5kZWYgICAgIE5VTEwKKyNkZWZpbmUgICAgIE5VTEwgICAgICAgICAgICAgICAgMAorI2VuZGlmCisKKy8qIFBsZWFzZSBpbmNsdWRlIGhlYWRlciBmaWxlcyBmb3IgYnVmZmVyIHR5cGUgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGlzIGZpbGUgKi8KK3R5cGVkZWYgICAgIHN0cnVjdCBza19idWZmICAgICAgemJ1Zl90OworCisvKiBQbGVhc2UgaW5jbHVkZSBoZWFkZXIgZmlsZXMgZm9yIGRldmljZSB0eXBlIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBmaWxlICovCit0eXBlZGVmICAgICBzdHJ1Y3QgbmV0X2RldmljZSAgIHpkZXZfdDsKKworI2VuZGlmIC8qICNpZm5kZWYgX09BTF9EVF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9vYWxfbWFyYy5oIGIvZHJpdmVycy9zdGFnaW5nL290dXMvb2FsX21hcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDYxMTE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvb2FsX21hcmMuaApAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgTW9kdWxlIE5hbWUgOiBvYWxfbWFyYy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHdhcnBwZXIgZGVmaW5pdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFBsYXRmb3JtIGRlcGVuZGVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX09BTF9NQVJDX0gKKyNkZWZpbmUgX09BTF9NQVJDX0gKKworI2luY2x1ZGUgIm9hbF9kdC5oIgorI2luY2x1ZGUgInVzYmRydi5oIgorCisjZGVmaW5lIFpNX09TX0xJTlVYX0ZVTkMKKworLyoqKioqIENyaXRpY2FsIHNlY3Rpb24gKioqKiovCisvKiBEZWNsYXJlIGZvciBjcml0aWNhbCBzZWN0aW9uICovCisjaWZuZGVmIFpNX0hBTFBMVVNfTE9DSworI2RlZmluZSB6bXdfZ2V0X3dsYW5fZGV2KGRldikgICAgc3RydWN0IHpzV2xhbkRldiAqd2QgPSAoc3RydWN0IHpzV2xhbkRldiopICgoKChzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUqKWRldi0+cHJpdiktPndkKSkKKworI2RlZmluZSB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpIHVuc2lnbmVkIGxvbmcgaXJxRmxhZzsKKworLyogRW50ZXIgY3JpdGljYWwgc2VjdGlvbiAqLworI2RlZmluZSB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpIFwKKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJigoKHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqKShkZXYtPnByaXYpKS0+Y3NfbG9jayksIGlycUZsYWcpOworCisvKiBsZWF2ZSBjcml0aWNhbCBzZWN0aW9uICovCisjZGVmaW5lIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldikgXAorICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoKChzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKikoZGV2LT5wcml2KSktPmNzX2xvY2spLCBpcnFGbGFnKTsKKyNlbHNlCisjZGVmaW5lIHptd19nZXRfd2xhbl9kZXYoZGV2KSAgICBzdHJ1Y3QgenNXbGFuRGV2ICp3ZCA9IHpmd0dldFdsYW5EZXYoZGV2KTsKKworLyogRGVjbGFyZSBmb3IgY3JpdGljYWwgc2VjdGlvbiAqLworI2RlZmluZSB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpCisKKy8qIEVudGVyIGNyaXRpY2FsIHNlY3Rpb24gKi8KKyNkZWZpbmUgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KSBcCisgICAgICAgIHpmd0VudGVyQ3JpdGljYWxTZWN0aW9uKGRldik7CisKKy8qIGxlYXZlIGNyaXRpY2FsIHNlY3Rpb24gKi8KKyNkZWZpbmUgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KSBcCisgICAgICAgIHpmd0xlYXZlQ3JpdGljYWxTZWN0aW9uKGRldik7CisjZW5kaWYKKworLyoqKioqIEJ5dGUgb3JkZXIgY29udmVydGluZyAqKioqKi8KKyNpZmRlZiBaTV9DT05GSUdfQklHX0VORElBTgorI2RlZmluZSB6bXdfY3B1X3RvX2xlMzIodikgICAgKCgodiAmIDB4ZmYwMDAwMDApID4+IDI0KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHYgJiAweDAwZmYwMDAwKSA+PiA4KSAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh2ICYgMHgwMDAwZmYwMCkgPDwgOCkgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodiAmIDB4MDAwMDAwZmYpIDw8IDI0KSkKKworI2RlZmluZSB6bXdfbGUzMl90b19jcHUodikgICAgKCgodiAmIDB4ZmYwMDAwMDApID4+IDI0KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHYgJiAweDAwZmYwMDAwKSA+PiA4KSAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh2ICYgMHgwMDAwZmYwMCkgPDwgOCkgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodiAmIDB4MDAwMDAwZmYpIDw8IDI0KSkKKworI2RlZmluZSB6bXdfY3B1X3RvX2xlMTYodikgICAgKCgodiAmIDB4ZmYwMCkgPj4gOCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh2ICYgMHgwMGZmKSA8PCA4KSkKKworI2RlZmluZSB6bXdfbGUxNl90b19jcHUodikgICAgKCgodiAmIDB4ZmYwMCkgPj4gOCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh2ICYgMHgwMGZmKSA8PCA4KSkKKyNlbHNlCisjZGVmaW5lIHptd19jcHVfdG9fbGUzMih2KSAgICAodikKKyNkZWZpbmUgem13X2xlMzJfdG9fY3B1KHYpICAgICh2KQorI2RlZmluZSB6bXdfY3B1X3RvX2xlMTYodikgICAgKHYpCisjZGVmaW5lIHptd19sZTE2X3RvX2NwdSh2KSAgICAodikKKyNlbmRpZgorCisvKioqKiogQnVmZmVyIGFjY2VzcyAqKioqKi8KKy8qIENhbGxlZCB0byByZWFkL3dyaXRlIGJ1ZmZlciAqLworI2lmbmRlZiBaTV9IQUxQTFVTX0xPQ0sKKworI2RlZmluZSB6bXdfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpICoodThfdCopKCh1OF90KilidWYtPmRhdGErb2Zmc2V0KQorI2RlZmluZSB6bXdfYnVmX3JlYWRoKGRldiwgYnVmLCBvZmZzZXQpIHptd19jcHVfdG9fbGUxNigqKHUxNl90KikoKHU4X3QqKWJ1Zi0+ZGF0YStvZmZzZXQpKQorI2RlZmluZSB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0LCB2YWx1ZSkgKih1OF90KikoKHU4X3QqKWJ1Zi0+ZGF0YStvZmZzZXQpID0gdmFsdWUKKyNkZWZpbmUgem13X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgdmFsdWUpICoodTE2X3QqKSgodThfdCopYnVmLT5kYXRhK29mZnNldCkgPSB6bXdfY3B1X3RvX2xlMTYodmFsdWUpCisjZGVmaW5lIHptd19idWZfZ2V0X2J1ZmZlcihkZXYsIGJ1ZikgKHU4X3QqKShidWYtPmRhdGEpCisKKyNlbHNlCisKKyNkZWZpbmUgem13X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KSB6ZndCdWZSZWFkQnl0ZShkZXYsIGJ1Ziwgb2Zmc2V0KQorI2RlZmluZSB6bXdfYnVmX3JlYWRoKGRldiwgYnVmLCBvZmZzZXQpIHpmd0J1ZlJlYWRIYWxmV29yZChkZXYsIGJ1Ziwgb2Zmc2V0KQorI2RlZmluZSB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0LCB2YWx1ZSkgemZ3QnVmV3JpdGVCeXRlKGRldiwgYnVmLCBvZmZzZXQsIHZhbHVlKQorI2RlZmluZSB6bXdfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCB2YWx1ZSkgemZ3QnVmV3JpdGVIYWxmV29yZChkZXYsIGJ1Ziwgb2Zmc2V0LCB2YWx1ZSkKKyNkZWZpbmUgem13X2J1Zl9nZXRfYnVmZmVyKGRldiwgYnVmKSB6ZndHZXRCdWZmZXIoZGV2LCBidWYpCisKKyNlbmRpZgorCisvKioqKiogRGVidWcgbWVzc2FnZSAqKioqKi8KKyNpZiAwCisjZGVmaW5lIHptX2RlYnVnX21zZzAobXNnKSBwcmludGsoIiVzOiVzXG4iLCBfX2Z1bmNfXywgbXNnKTsKKyNkZWZpbmUgem1fZGVidWdfbXNnMShtc2csIHZhbCkgcHJpbnRrKCIlczolcyVsZFxuIiwgX19mdW5jX18sIFwKKyAgICAgICAgbXNnLCAodTMyX3QpdmFsKTsKKyNkZWZpbmUgem1fZGVidWdfbXNnMihtc2csIHZhbCkgcHJpbnRrKCIlczolcyVseGhcbiIsIF9fZnVuY19fLCBcCisgICAgICAgIG1zZywgKHUzMl90KXZhbCk7CisjZGVmaW5lIHptX2RlYnVnX21zZ19zKG1zZywgdmFsKSBwcmludGsoIiVzOiVzJXNcbiIsIF9fZnVuY19fLCBcCisgICAgICAgIG1zZywgdmFsKTsKKyNkZWZpbmUgem1fZGVidWdfbXNnX3AobXNnLCB2YWwxLCB2YWwyKSBwcmludGsoIiVzOiVzJTAxbGQuJTAybGRcbiIsIF9fZnVuY19fLCBcCisgICAgICAgIG1zZywgKHZhbDEvdmFsMiksICgoKHZhbDEqMTAwKS92YWwyKSUxMDApKTsKKyNkZWZpbmUgem1fZGJnKFMpIHByaW50ayBTCisjZWxzZQorI2RlZmluZSB6bV9kZWJ1Z19tc2cwKG1zZykKKyNkZWZpbmUgem1fZGVidWdfbXNnMShtc2csIHZhbCkKKyNkZWZpbmUgem1fZGVidWdfbXNnMihtc2csIHZhbCkKKyNkZWZpbmUgem1fZGVidWdfbXNnX3MobXNnLCB2YWwpCisjZGVmaW5lIHptX2RlYnVnX21zZ19wKG1zZywgdmFsMSwgdmFsMikKKyNkZWZpbmUgem1fZGJnKFMpCisjZW5kaWYKKworI2RlZmluZSB6bV9hc3NlcnQoZXhwcikgaWYoIShleHByKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcHJpbnRrKCAiQXRoZW9ycyBBc3NlcnRpb24gZmFpbGVkISAlcywlcywlcyxsaW5lPSVkXG4iLCAgIFwKKyAgICAgICAgI2V4cHIsX19GSUxFX18sX19mdW5jX18sX19MSU5FX18pOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfQorCisjZGVmaW5lIERiZ1ByaW50IHByaW50aworCisjZW5kaWYgLyogI2lmbmRlZiBfT0FMX01BUkNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvdXNiZHJ2LmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy91c2JkcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmUwNzA3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvdXNiZHJ2LmMKQEAgLTAsMCArMSwxMTQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICBNb2R1bGUgTmFtZSA6IHVzYmRydi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBuZXR3b3JrIGludGVyZmFjZSB1cC9kb3duIHJlbGF0ZWQgZnVuY3Rpb25zLiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQbGF0Zm9ybSBkZXBlbmRlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogc3JjL3VzYmRydi5jICovCisKKyNkZWZpbmUgWk1fUElCU1NfTU9ERSAgIDAKKyNkZWZpbmUgWk1fQVBfTU9ERSAgICAgIDAKKyNkZWZpbmUgWk1fQ0hBTk5FTCAgICAgIDExCisjZGVmaW5lIFpNX1dFUF9NT01FICAgICAwCisjZGVmaW5lIFpNX1NIQVJFX0FVVEggICAwCisjZGVmaW5lIFpNX0RJU0FCTEVfWE1JVCAwCisKKyNpbmNsdWRlICJ1c2JkcnYuaCIKKyNpbmNsdWRlICJvYWxfZHQuaCIKKyNpbmNsdWRlICI4MDIxMWNvcmUvcHViX3pmaS5oIgorCisjaW5jbHVkZSAibGludXgvbmV0bGluay5oIgorI2luY2x1ZGUgImxpbnV4L3J0bmV0bGluay5oIgorCisjaWYgV0lSRUxFU1NfRVhUID4gMTIKKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorI2VuZGlmCisKKyNpZmRlZiBaTV9IT1NUQVBEX1NVUFBPUlQKKyNpbmNsdWRlICJhdGhyX2NvbW1vbi5oIgorI2VuZGlmCisKK2V4dGVybiB2b2lkIHpmRHVtcERlc2NyaXB0b3IoemRldl90KiBkZXYsIHUxNl90IHR5cGUpOworLy9leHRlcm4gdm9pZCB6ZmlXbGFuUXVlcnlNYWNBZGRyZXNzKHpkZXZfdCogZGV2LCB1OF90KiBhZGRyKTsKKworLy8gSVNSIGhhbmRsZXIKK2lycXJldHVybl90IHVzYmRydl9pbnRyKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKKworLy8gTmV0d29yayBEZXZpY2UgaW50ZXJmYWNlIHJlbGF0ZWQgZnVuY3Rpb24KK2ludCB1c2JkcnZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK2ludCB1c2JkcnZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKik7CitpbnQgdXNiZHJ2X2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50KTsKK2ludCB1c2JkcnZfc2V0X21hYyhzdHJ1Y3QgbmV0X2RldmljZSAqLCB2b2lkICopOworaW50IHVzYmRydl94bWl0X2ZyYW1lKHN0cnVjdCBza19idWZmICosIHN0cnVjdCBuZXRfZGV2aWNlICopOwordm9pZCB1c2JkcnZfc2V0X211bHRpKHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnVzYmRydl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKik7CisKKy8vd2lyZWxlc3MgZXh0ZW5zaW9uIGhlbHBlciBmdW5jdGlvbnMKK2ludCB1c2JkcnZfaW9jdGxfc2V0ZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BvaW50ICplcnEpOworaW50IHVzYmRydl9pb2N0bF9nZXRlc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcG9pbnQgKmVycSk7CitpbnQgdXNiZHJ2X2lvY3RsX3NldHJ0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcGFyYW0gKnJycSk7CisvKiBXaXJlbGVzcyBFeHRlbnNpb24gSGFuZGxlciBmdW5jdGlvbnMgKi8KK2ludCB1c2JkcnZ3ZXh0X2dpd21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyogaW5mbywKKyAgICAgICAgX191MzIgKm1vZGUsIGNoYXIgKmV4dHJhKTsKK2ludCB6ZkxueFByaXZhdGVJb2N0bChzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AsIHN0cnVjdCB6ZGFwX2lvY3RsICp6ZHJlcSk7CisKK3ZvaWQgemZMbngxMG1zVGltZXIoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CitpbnQgemZVbnJlZ2lzdGVyV2RzRGV2KHN0cnVjdCBuZXRfZGV2aWNlKiBwYXJlbnREZXYsIHUxNl90IHdkc0lkKTsKK2ludCB6ZlJlZ2lzdGVyV2RzRGV2KHN0cnVjdCBuZXRfZGV2aWNlKiBwYXJlbnREZXYsIHUxNl90IHdkc0lkKTsKK2ludCB6Zldkc09wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitpbnQgemZXZHNDbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2ludCB6ZkxueFZhcE9wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitpbnQgemZMbnhWYXBDbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2ludCB6ZkxueFZhcFhtaXRGcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2ludCB6ZkxueFJlZ2lzdGVyVmFwRGV2KHN0cnVjdCBuZXRfZGV2aWNlKiBwYXJlbnREZXYsIHUxNl90IHZhcElkKTsKK2ludCB1c2JkcnZfd3BhX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBhdGhyX3dsYW5fcGFyYW0gKnpkcGFybSk7CitleHRlcm4gdTE2X3QgemZMbnhHZXRWYXBJZCh6ZGV2X3QqIGRldik7CitleHRlcm4gdTE2X3QgemZMbnhDaGVja1R4QnVmZmVyQ250KHpkZXZfdCAqZGV2KTsKK2V4dGVybiBVc2JUeFFfdCAqemZMbnhHZXRVc2JUeEJ1ZmZlcih6ZGV2X3QgKmRldik7CisKK2V4dGVybiB1MTZfdCB6ZkxueEF1dGhOb3RpZnkoemRldl90KiBkZXYsIHUxNl90KiBtYWNBZGRyKTsKK2V4dGVybiB1MTZfdCB6ZkxueEFzb2NOb3RpZnkoemRldl90KiBkZXYsIHUxNl90KiBtYWNBZGRyLCB1OF90KiBib2R5LCB1MTZfdCBib2R5U2l6ZSwgdTE2X3QgcG9ydCk7CitleHRlcm4gdTE2X3QgemZMbnhEaXNBc29jTm90aWZ5KHpkZXZfdCogZGV2LCB1OF90KiBtYWNBZGRyLCB1MTZfdCBwb3J0KTsKK2V4dGVybiB1MTZfdCB6ZkxueEFwQ29ubmVjdE5vdGlmeSh6ZGV2X3QqIGRldiwgdThfdCogbWFjQWRkciwgdTE2X3QgcG9ydCk7CitleHRlcm4gdm9pZCB6ZkxueENvbm5lY3ROb3RpZnkoemRldl90KiBkZXYsIHUxNl90IHN0YXR1cywgdTE2X3QqIGJzc2lkKTsKK2V4dGVybiB2b2lkIHpmTG54U2Nhbk5vdGlmeSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzU2NhblJlc3VsdCogcmVzdWx0KTsKK2V4dGVybiB2b2lkIHpmTG54U3RhdGlzdGljc05vdGlmeSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzU3Rhc3RpY3MqIHJlc3VsdCk7CitleHRlcm4gdm9pZCB6ZkxueE1pY0ZhaWx1cmVOb3RpZnkoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MTZfdCBzdGF0dXMpOworZXh0ZXJuIHZvaWQgemZMbnhBcE1pY0ZhaWx1cmVOb3RpZnkoemRldl90KiBkZXYsIHU4X3QqIGFkZHIsIHpidWZfdCogYnVmKTsKK2V4dGVybiB2b2lkIHpmTG54SWJzc1BhcnRuZXJOb3RpZnkoemRldl90KiBkZXYsIHUxNl90IHN0YXR1cywgc3RydWN0IHpzUGFydG5lck5vdGlmeUV2ZW50ICpldmVudCk7CitleHRlcm4gdm9pZCB6ZkxueE1hY0FkZHJlc3NOb3RpZnkoemRldl90KiBkZXYsIHU4X3QqIGFkZHIpOworZXh0ZXJuIHZvaWQgemZMbnhTZW5kQ29tcGxldGVJbmRpY2F0aW9uKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zik7CitleHRlcm4gdm9pZCB6ZkxueFJlY3ZFdGgoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBwb3J0KTsKK2V4dGVybiB2b2lkIHpmTG54UmVzdG9yZUJ1ZkRhdGEoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworZXh0ZXJuIHUxNl90IHpmTG54Q2VuY0Fzb2NOb3RpZnkoemRldl90KiBkZXYsIHUxNl90KiBtYWNBZGRyLCB1OF90KiBib2R5LCB1MTZfdCBib2R5U2l6ZSwgdTE2X3QgcG9ydCk7CisjZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworZXh0ZXJuIHZvaWQgemZMbnhXYXRjaERvZ05vdGlmeSh6ZGV2X3QqIGRldik7CitleHRlcm4gdm9pZCB6ZkxueFJlY3Y4MDIxMSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogYWRkSW5mbyk7CitleHRlcm4gdThfdCB6ZkxueENyZWF0ZVRocmVhZCh6ZGV2X3QgKmRldik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgICAgICAgICAgICAgICAgICAgICBQIFUgQiBMIEkgQyAgIEQgQSBUIEEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKy8qIERlZmluaXRpb24gb2YgV2lyZWxlc3MgRXh0ZW5zaW9uICovCisKKyNpZiBXSVJFTEVTU19FWFQgPiAxMgorI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CisjZW5kaWYKKy8vd2lyZWxlc3MgZXh0ZW5zaW9uIGhlbHBlciBmdW5jdGlvbnMKK2V4dGVybiBpbnQgdXNiZHJ2X2lvY3RsX3NldGVzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wb2ludCAqZXJxKTsKK2V4dGVybiBpbnQgdXNiZHJ2X2lvY3RsX3NldHJ0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcGFyYW0gKnJycSk7CisvKiBXaXJlbGVzcyBFeHRlbnNpb24gSGFuZGxlciBmdW5jdGlvbnMgKi8KK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9naXduYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycSwgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X3Npd2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgc3RydWN0IGl3X2ZyZXEgKmZyZXEsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9naXdmcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHN0cnVjdCBpd19mcmVxICpmcmVxLCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IHVzYmRydndleHRfc2l3bW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnEsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9naXdtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIF9fdTMyICptb2RlLCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IHVzYmRydndleHRfc2l3c2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQlzdHJ1Y3QgaXdfcGFyYW0gKnNlbnMsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9naXdzZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBpd19wYXJhbSAqc2VucywgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X2dpd3JhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X3Npd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHN0cnVjdCBzb2NrYWRkciAqTWFjQWRkciwgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X2dpd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHN0cnVjdCBzb2NrYWRkciAqTWFjQWRkciwgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X2l3YXBsaXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X3Npd3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IHVzYmRydndleHRfZ2l3c2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9zaXdlc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmVzc2lkLCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IHVzYmRydndleHRfZ2l3ZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgc3RydWN0IGl3X3BvaW50ICplc3NpZCwgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X3Npd25pY2tuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJICAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqbmlja25hbWUpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X2dpd25pY2tuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJICAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqbmlja25hbWUpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X3Npd3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgc3RydWN0IGl3X3BhcmFtICpmcnEsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9naXdyYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHN0cnVjdCBpd19wYXJhbSAqZnJxLCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IHVzYmRydndleHRfc2l3cnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHN0cnVjdCBpd19wYXJhbSAqcnRzLCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IHVzYmRydndleHRfZ2l3cnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHN0cnVjdCBpd19wYXJhbSAqcnRzLCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IHVzYmRydndleHRfc2l3ZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKmZyYWcsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9naXdmcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHN0cnVjdCBpd19wYXJhbSAqZnJhZywgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X3Npd3R4cG93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBpd19wYXJhbSAqcnJxLCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IHVzYmRydndleHRfZ2l3dHhwb3coc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJc3RydWN0IGl3X3BhcmFtICpycnEsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9zaXdyZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCSAgICBzdHJ1Y3QgaXdfcGFyYW0gKnJycSwgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X2dpd3JldHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJICAgIHN0cnVjdCBpd19wYXJhbSAqcnJxLCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IHVzYmRydndleHRfc2l3ZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHN0cnVjdCBpd19wb2ludCAqZXJxLCBjaGFyICprZXkpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X2dpd2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmVycSwgY2hhciAqa2V5KTsKK2V4dGVybiBpbnQgdXNiZHJ2d2V4dF9zaXdwb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKmZycSwgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCB1c2JkcnZ3ZXh0X2dpd3Bvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgIHN0cnVjdCBpd19wYXJhbSAqZnJxLCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IHVzYmRydl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCk7CisvKgorICogU3RydWN0dXJlcyB0byBleHBvcnQgdGhlIFdpcmVsZXNzIEhhbmRsZXJzCisgKi8KKworc3RydWN0IGl3X3ByaXZfYXJncyB1c2JkcnZfcHJpdmF0ZV9hcmdzW10gPSB7CisvLyAgICB7IFNJT0NJV0ZJUlNUUFJJViArIDB4MCwgMCwgMCwgImxpc3RfYnNzIiB9LAorLy8gICAgeyBTSU9DSVdGSVJTVFBSSVYgKyAweDEsIDAsIDAsICJjYXJkX3Jlc2V0IiB9LAorICAgIHsgU0lPQ0lXRklSU1RQUklWICsgMHgyLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgInNldF9hdXRoIiB9LCAgLyogMCAtIG9wZW4sIDEgLSBzaGFyZWQga2V5ICovCisgICAgeyBTSU9DSVdGSVJTVFBSSVYgKyAweDMsIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgMTIsICJnZXRfYXV0aCIgfSwKKy8vICAgIHsgU0lPQ0lXRklSU1RQUklWICsgMHg0LCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgInNldF9wcmVhbWJsZSIgfSwgIC8qIDAgLSBsb25nLCAxIC0gc2hvcnQgKi8KKy8vICAgIHsgU0lPQ0lXRklSU1RQUklWICsgMHg1LCAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IDYsICJnZXRfcHJlYW1ibGUiIH0sCisvLyAgICB7IFNJT0NJV0ZJUlNUUFJJViArIDB4NiwgMCwgMCwgImNudCIgfSwKKy8vICAgIHsgU0lPQ0lXRklSU1RQUklWICsgMHg3LCAwLCAwLCAicmVncyIgfSwKKy8vICAgIHsgU0lPQ0lXRklSU1RQUklWICsgMHg4LCAwLCAwLCAicHJvYmUiIH0sCisvLyAgICB7IFNJT0NJV0ZJUlNUUFJJViArIDB4OSwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJkYmdfZmxhZyIgfSwKKy8vICAgIHsgU0lPQ0lXRklSU1RQUklWICsgMHhBLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgImNvbm5lY3QiIH0sCisvLyAgICB7IFNJT0NJV0ZJUlNUUFJJViArIDB4QiwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJzZXRfbWFjX21vZGUiIH0sCisvLyAgICB7IFNJT0NJV0ZJUlNUUFJJViArIDB4QywgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMiwgImdldF9tYWNfbW9kZSIgfSwKK307CisKKyNpZiBXSVJFTEVTU19FWFQgPiAxMgorc3RhdGljIGl3X2hhbmRsZXIgdXNiZHJ2d2V4dF9oYW5kbGVyW10gPSB7CisgICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV0NPTU1JVCAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X2dpd25hbWUsICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdOQU1FICovCisgICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV05XSUQgKi8KKyAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DR0lXTldJRCAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X3Npd2ZyZXEsICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdGUkVRICovCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfZ2l3ZnJlcSwgICAgICAgICAgICAgICAgLyogU0lPQ0dJV0ZSRVEgKi8KKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9zaXdtb2RlLCAgICAgICAgICAgICAgICAvKiBTSU9DU0lXTU9ERSAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X2dpd21vZGUsICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdNT0RFICovCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfc2l3c2VucywgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1NFTlMgKi8KKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9naXdzZW5zLCAgICAgICAgICAgICAgICAvKiBTSU9DR0lXU0VOUyAqLworICAgIChpd19oYW5kbGVyKSBOVUxMLCAvKiBub3QgdXNlZCAqLyAgICAgICAgICAgICAgIC8qIFNJT0NTSVdSQU5HRSAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X2dpd3JhbmdlLCAgICAgICAgICAgICAgIC8qIFNJT0NHSVdSQU5HRSAqLworICAgIChpd19oYW5kbGVyKSBOVUxMLCAvKiBub3QgdXNlZCAqLyAgICAgICAgICAgICAgIC8qIFNJT0NTSVdQUklWICovCisgICAgKGl3X2hhbmRsZXIpIE5VTEwsIC8qIGtlcm5lbCBjb2RlICovICAgICAgICAgICAgLyogU0lPQ0dJV1BSSVYgKi8KKyAgICAoaXdfaGFuZGxlcikgTlVMTCwgLyogbm90IHVzZWQgKi8gICAgICAgICAgICAgICAvKiBTSU9DU0lXU1RBVFMgKi8KKyAgICAoaXdfaGFuZGxlcikgTlVMTCwgLyoga2VybmVsIGNvZGUgKi8gICAgICAgICAgICAvKiBTSU9DR0lXU1RBVFMgKi8KKyAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXU1BZICovCisgICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1NQWSAqLworICAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIC0tIGhvbGUgLS0gKi8KKyAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAtLSBob2xlIC0tICovCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfc2l3YXAsICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV0FQICovCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfZ2l3YXAsICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV0FQICovCisgICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAvKiAtLSBob2xlIC0tICovCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfaXdhcGxpc3QsICAgICAgICAgICAgICAgLyogU0lPQ0dJV0FQTElTVCAqLworI2lmIFdJUkVMRVNTX0VYVCA+IDEzCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfc2l3c2NhbiwgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1NDQU4gKi8KKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9naXdzY2FuLCAgICAgICAgICAgICAgICAvKiBTSU9DR0lXU0NBTiAqLworI2Vsc2UgLyogV0lSRUxFU1NfRVhUID4gMTMgKi8KKyAgICAoaXdfaGFuZGxlcikgTlVMTCwgLyogbnVsbCAqLyAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXU0NBTiAqLworICAgIChpd19oYW5kbGVyKSBOVUxMLCAvKiBudWxsICovICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdTQ0FOICovCisjZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gMTMgKi8KKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9zaXdlc3NpZCwgICAgICAgICAgICAgICAvKiBTSU9DU0lXRVNTSUQgKi8KKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9naXdlc3NpZCwgICAgICAgICAgICAgICAvKiBTSU9DR0lXRVNTSUQgKi8KKworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X3Npd25pY2tuLCAgICAgICAgICAgICAgIC8qIFNJT0NTSVdOSUNLTiAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X2dpd25pY2tuLCAgICAgICAgICAgICAgIC8qIFNJT0NHSVdOSUNLTiAqLworICAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIC0tIGhvbGUgLS0gKi8KKyAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAtLSBob2xlIC0tICovCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfc2l3cmF0ZSwgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1JBVEUgKi8KKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9naXdyYXRlLCAgICAgICAgICAgICAgICAvKiBTSU9DR0lXUkFURSAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X3Npd3J0cywgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdSVFMgKi8KKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9naXdydHMsICAgICAgICAgICAgICAgICAvKiBTSU9DR0lXUlRTICovCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfc2l3ZnJhZywgICAgICAgICAgICAgICAgLyogU0lPQ1NJV0ZSQUcgKi8KKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9naXdmcmFnLCAgICAgICAgICAgICAgICAvKiBTSU9DR0lXRlJBRyAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X3Npd3R4cG93LCAgICAgICAgICAgICAgIC8qIFNJT0NTSVdUWFBPVyAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X2dpd3R4cG93LCAgICAgICAgICAgICAgIC8qIFNJT0NHSVdUWFBPVyAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X3Npd3JldHJ5LCAgICAgICAgICAgICAgIC8qIFNJT0NTSVdSRVRSWSAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X2dpd3JldHJ5LCAgICAgICAgICAgICAgIC8qIFNJT0NHSVdSRVRSWSAqLworICAgIChpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X3Npd2VuY29kZSwgICAgICAgICAgICAgIC8qIFNJT0NTSVdFTkNPREUgKi8KKyAgICAoaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9naXdlbmNvZGUsICAgICAgICAgICAgICAvKiBTSU9DR0lXRU5DT0RFICovCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfc2l3cG93ZXIsICAgICAgICAgICAgICAgLyogU0lPQ1NJV1BPV0VSICovCisgICAgKGl3X2hhbmRsZXIpIHVzYmRydndleHRfZ2l3cG93ZXIsICAgICAgICAgICAgICAgLyogU0lPQ0dJV1BPV0VSICovCit9OworCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlciB1c2JkcnZfcHJpdmF0ZV9oYW5kbGVyW10gPQoreworCS8vKGl3X2hhbmRsZXIpIHVzYmRydndleHRfc2V0cGFyYW0sCQkvKiBTSU9DV0ZJUlNUUFJJViswICovCisJLy8oaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9nZXRwYXJhbSwJCS8qIFNJT0NXRklSU1RQUklWKzEgKi8KKwkvLyhpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X3NldGtleSwJCSAgICAvKiBTSU9DV0ZJUlNUUFJJVisyICovCisJLy8oaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9zZXR3bW1wYXJhbXMsCS8qIFNJT0NXRklSU1RQUklWKzMgKi8KKwkvLyhpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X2RlbGtleSwJCSAgICAvKiBTSU9DV0ZJUlNUUFJJVis0ICovCisJLy8oaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9nZXR3bW1wYXJhbXMsCS8qIFNJT0NXRklSU1RQUklWKzUgKi8KKwkvLyhpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X3NldG1sbWUsCQkvKiBTSU9DV0ZJUlNUUFJJVis2ICovCisJLy8oaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9nZXRjaGFuaW5mbywJLyogU0lPQ1dGSVJTVFBSSVYrNyAqLworCS8vKGl3X2hhbmRsZXIpIHVzYmRydndleHRfc2V0b3B0aWUsCQkvKiBTSU9DV0ZJUlNUUFJJVis4ICovCisJLy8oaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9nZXRvcHRpZSwJCS8qIFNJT0NXRklSU1RQUklWKzkgKi8KKwkvLyhpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X2FkZG1hYywJCSAgICAvKiBTSU9DV0ZJUlNUUFJJVisxMCAqLworCS8vKGl3X2hhbmRsZXIpIHVzYmRydndleHRfZ2V0c2NhbnJlc3VsdHMsCS8qIFNJT0NXRklSU1RQUklWKzExICovCisJLy8oaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9kZWxtYWMsCQkgICAgLyogU0lPQ1dGSVJTVFBSSVYrMTIgKi8KKwkvLyhpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X2dldGNoYW5saXN0LAkvKiBTSU9DV0ZJUlNUUFJJVisxMyAqLworCS8vKGl3X2hhbmRsZXIpIHVzYmRydndleHRfc2V0Y2hhbmxpc3QsCS8qIFNJT0NXRklSU1RQUklWKzE0ICovCisJLy8oaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiBTSU9DV0ZJUlNUUFJJVisxNSAqLworCS8vKGl3X2hhbmRsZXIpIHVzYmRydndleHRfY2hhbnN3aXRjaCwJICAgIC8qIFNJT0NXRklSU1RQUklWKzE2ICovCisJLy8oaXdfaGFuZGxlcikgdXNiZHJ2d2V4dF9zZXRtb2RlLAkJLyogU0lPQ1dGSVJTVFBSSVYrMTcgKi8KKwkvLyhpd19oYW5kbGVyKSB1c2JkcnZ3ZXh0X2dldG1vZGUsCQkvKiBTSU9DV0ZJUlNUUFJJVisxOCAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgLyogU0lPQ0lXRklSU1RQUklWICovCit9OworCitzdGF0aWMgc3RydWN0IGl3X2hhbmRsZXJfZGVmIHA4MDIxMXdleHRfaGFuZGxlcl9kZWYgPSB7CisgICAgLm51bV9zdGFuZGFyZCA9IHNpemVvZih1c2JkcnZ3ZXh0X2hhbmRsZXIpIC8gc2l6ZW9mKGl3X2hhbmRsZXIpLAorICAgIC5udW1fcHJpdmF0ZSA9IHNpemVvZih1c2JkcnZfcHJpdmF0ZV9oYW5kbGVyKS9zaXplb2YoaXdfaGFuZGxlciksCisgICAgLm51bV9wcml2YXRlX2FyZ3MgPSBzaXplb2YodXNiZHJ2X3ByaXZhdGVfYXJncykvc2l6ZW9mKHN0cnVjdCBpd19wcml2X2FyZ3MpLAorICAgIC5zdGFuZGFyZCA9IHVzYmRydndleHRfaGFuZGxlciwKKyAgICAucHJpdmF0ZSA9IChpd19oYW5kbGVyICopIHVzYmRydl9wcml2YXRlX2hhbmRsZXIsCisgICAgLnByaXZhdGVfYXJncyA9IChzdHJ1Y3QgaXdfcHJpdl9hcmdzICopIHVzYmRydl9wcml2YXRlX2FyZ3MKK307CisjZW5kaWYKKworLyogV0RTICovCisvL3N0cnVjdCB6c1dkc1N0cnVjdCB3ZHNbWk1fV0RTX1BPUlRfTlVNQkVSXTsKKy8vdm9pZCB6ZkluaXRXZHNTdHJ1Y3Qodm9pZCk7CisKKy8qIFZBUCAqLworc3RydWN0IHpzVmFwU3RydWN0IHZhcFtaTV9WQVBfUE9SVF9OVU1CRVJdOwordm9pZCB6ZkxueEluaXRWYXBTdHJ1Y3Qodm9pZCk7CisKKworLyoqCisgKiB1c2JkcnZfaW50ciAtIGludGVycnVwdCBoYW5kbGVyCisgKiBAaXJxOiB0aGUgSVJRIG51bWJlcgorICogQGRldl9pbnN0OiB0aGUgbmV0X2RldmljZSBzdHJ1Y3QKKyAqIEByZWdzOiByZWdpc3RlcnMgKHVudXNlZCkKKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgdGhlIElTUiBmb3IgdGhlIHVzYmRydiBib2FyZC4gSXQgc2VydmljZXMKKyAqIHRoZSBSWCAmIFRYIHF1ZXVlcyAmIHN0YXJ0cyB0aGUgUlUgaWYgaXQgaGFzIHN0b3BwZWQgZHVlCisgKiB0byBubyByZXNvdXJjZXMuCisgKi8KK2lycXJldHVybl90IHVzYmRydl9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pbnN0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcDsKKworICAgIGRldiA9IGRldl9pbnN0OworICAgIG1hY3AgPSBkZXYtPm1sX3ByaXY7CisKKworICAgIC8qIFJlYWQgcmVnaXN0ZXIgZXJyb3IsIGNhcmQgbWF5IGJlIHVucGx1Z2VkICovCisgICAgaWYgKDApLy8oaW50cl9zdGF0dXMgPT0gLTEpCisgICAgICAgIHJldHVybiBJUlFfTk9ORTsKKworICAgIC8qIHRoZSBkZXZpY2UgaXMgY2xvc2VkLCBkb24ndCBjb250aW51ZSBvciBlbHNlIGJhZCB0aGluZ3MgbWF5IGhhcHBlbi4gKi8KKyAgICBpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkgeworICAgICAgICByZXR1cm4gSVJRX05PTkU7CisgICAgfQorCisgICAgaWYgKG1hY3AtPmRyaXZlcl9pc29sYXRlZCkgeworICAgICAgICByZXR1cm4gSVJRX05PTkU7CisgICAgfQorCisjaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUENJKQorICAgIC8vemZpSXNyUGNpKGRldik7CisjZW5kaWYKKworICAgIHJldHVybiBJUlFfSEFORExFRDsKK30KKworaW50IHVzYmRydl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworICAgIGludCByYyA9IDA7CisgICAgdTE2X3Qgc2l6ZTsKKyAgICB2b2lkKiBtZW07CisgICAgLy91bnNpZ25lZCBjaGFyIGFkZHJbNl07CisgICAgc3RydWN0IHpzQ2JGdW5jVGJsIGNiRnVuY1RibDsKKworICAgIHByaW50aygiRW50ZXIgb3BlbigpXG4iKTsKKworLy8jaWZuZGVmIENPTkZJR19TTVAKKy8vICAgIHJlYWRfbG9jaygmKG1hY3AtPmlzb2xhdGVfbG9jaykpOworLy8jZW5kaWYKKyAgICBpZiAobWFjcC0+ZHJpdmVyX2lzb2xhdGVkKSB7CisgICAgICAgIHJjID0gLUVCVVNZOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgc2l6ZSA9IHpmaUdsb2JhbERhdGFTaXplKGRldik7CisgICAgaWYgKChtZW0gPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmMgPSAtRUJVU1k7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisgICAgbWFjcC0+d2QgPSBtZW07CisKKyAgICBtZW1zZXQoJmNiRnVuY1RibCwgMCwgc2l6ZW9mKHN0cnVjdCB6c0NiRnVuY1RibCkpOworICAgIGNiRnVuY1RibC56ZmNiQXV0aE5vdGlmeSA9IHpmTG54QXV0aE5vdGlmeTsKKyAgICBjYkZ1bmNUYmwuemZjYkF1dGhOb3RpZnkgPSB6ZkxueEF1dGhOb3RpZnk7CisgICAgY2JGdW5jVGJsLnpmY2JBc29jTm90aWZ5ID0gemZMbnhBc29jTm90aWZ5OworICAgIGNiRnVuY1RibC56ZmNiRGlzQXNvY05vdGlmeSA9IHpmTG54RGlzQXNvY05vdGlmeTsKKyAgICBjYkZ1bmNUYmwuemZjYkFwQ29ubmVjdE5vdGlmeSA9IHpmTG54QXBDb25uZWN0Tm90aWZ5OworICAgIGNiRnVuY1RibC56ZmNiQ29ubmVjdE5vdGlmeSA9IHpmTG54Q29ubmVjdE5vdGlmeTsKKyAgICBjYkZ1bmNUYmwuemZjYlNjYW5Ob3RpZnkgPSB6ZkxueFNjYW5Ob3RpZnk7CisgICAgY2JGdW5jVGJsLnpmY2JNaWNGYWlsdXJlTm90aWZ5ID0gemZMbnhNaWNGYWlsdXJlTm90aWZ5OworICAgIGNiRnVuY1RibC56ZmNiQXBNaWNGYWlsdXJlTm90aWZ5ID0gemZMbnhBcE1pY0ZhaWx1cmVOb3RpZnk7CisgICAgY2JGdW5jVGJsLnpmY2JJYnNzUGFydG5lck5vdGlmeSA9IHpmTG54SWJzc1BhcnRuZXJOb3RpZnk7CisgICAgY2JGdW5jVGJsLnpmY2JNYWNBZGRyZXNzTm90aWZ5ID0gemZMbnhNYWNBZGRyZXNzTm90aWZ5OworICAgIGNiRnVuY1RibC56ZmNiU2VuZENvbXBsZXRlSW5kaWNhdGlvbiA9IHpmTG54U2VuZENvbXBsZXRlSW5kaWNhdGlvbjsKKyAgICBjYkZ1bmNUYmwuemZjYlJlY3ZFdGggPSB6ZkxueFJlY3ZFdGg7CisgICAgY2JGdW5jVGJsLnpmY2JSZWN2ODAyMTEgPSB6ZkxueFJlY3Y4MDIxMTsKKyAgICBjYkZ1bmNUYmwuemZjYlJlc3RvcmVCdWZEYXRhID0gemZMbnhSZXN0b3JlQnVmRGF0YTsKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgIGNiRnVuY1RibC56ZmNiQ2VuY0Fzb2NOb3RpZnkgPSB6ZkxueENlbmNBc29jTm90aWZ5OworI2VuZGlmIC8vWk1fRU5BQkxFX0NFTkMKKyAgICBjYkZ1bmNUYmwuemZjYkh3V2F0Y2hEb2dOb3RpZnkgPSB6ZkxueFdhdGNoRG9nTm90aWZ5OworICAgIHpmaVdsYW5PcGVuKGRldiwgJmNiRnVuY1RibCk7CisKKyNpZiAwCisgICAgeworICAgICAgICAvL3UxNl90IG1hY1szXSA9IHsweDEzMDAsIDB4YjZkNCwgMHg1YWFmfTsKKyAgICAgICAgdTE2X3QgbWFjWzNdID0gezB4ODAwMCwgMHgwMGFiLCAweDAwMDB9OworICAgICAgICAvL3pmaVdsYW5TZXRNYWNBZGRyZXNzKGRldiwgbWFjKTsKKyAgICB9CisgICAgLyogTUFDIGFkZHJlc3MgKi8KKyAgICB6ZmlXbGFuUXVlcnlNYWNBZGRyZXNzKGRldiwgYWRkcik7CisgICAgZGV2LT5kZXZfYWRkclswXSA9IGFkZHJbMF07CisgICAgZGV2LT5kZXZfYWRkclsxXSA9IGFkZHJbMV07CisgICAgZGV2LT5kZXZfYWRkclsyXSA9IGFkZHJbMl07CisgICAgZGV2LT5kZXZfYWRkclszXSA9IGFkZHJbM107CisgICAgZGV2LT5kZXZfYWRkcls0XSA9IGFkZHJbNF07CisgICAgZGV2LT5kZXZfYWRkcls1XSA9IGFkZHJbNV07CisjZW5kaWYKKyAgICAvL3pmd01hY0FkZHJlc3NOb3RpZnkoKSB3aWxsIGJlIGNhbGxlZCB0byBzZXR1cCBkZXYtPmRldl9hZGRyW10KKworICAgIHpmTG54Q3JlYXRlVGhyZWFkKGRldik7CisKKyAgICBtb2RfdGltZXIoJihtYWNwLT5oYlRpbWVyMTBtcyksIGppZmZpZXMgKyAoMSpIWikvMTAwKTsgICAvLzEwIG1zCisKKyAgICBuZXRpZl9jYXJyaWVyX29uKGRldik7CisKKyAgICBuZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisjaWYgWk1fQVBfTU9ERSA9PSAxCisgICAgemZpV2xhblNldFdsYW5Nb2RlKGRldiwgWk1fTU9ERV9BUCk7CisgICAgemZpV2xhblNldEJhc2ljUmF0ZShkZXYsIDB4ZiwgMCwgMCk7CisgICAgemZpV2xhblNldFNTSUQoZGV2LCAiT1RVU19DV1kiLCA4KTsKKyAgICB6ZmlXbGFuU2V0RHRpbUNvdW50KGRldiwgMyk7CisKKyAgI2lmIFpNX1dFUF9NT01FID09IDEKKyAgICB7CisgICAgICAgIHU4X3Qga2V5WzE2XSA9IHsweDEyLCAweDM0LCAweDU2LCAweDc4LCAweDkwfTsKKyAgICAgICAgc3RydWN0IHpzS2V5SW5mbyBrZXlJbmZvOworCisgICAgICAgIGtleUluZm8ua2V5TGVuZ3RoID0gNTsKKyAgICAgICAga2V5SW5mby5rZXlJbmRleCA9IDA7CisgICAgICAgIGtleUluZm8uZmxhZyA9IDA7CisgICAgICAgIGtleUluZm8ua2V5ID0ga2V5OworICAgICAgICB6ZmlXbGFuU2V0S2V5KGRldiwga2V5SW5mbyk7CisKKyAgICAgICAgemZpV2xhblNldEVuY3J5TW9kZShkZXYsIFpNX1dFUDY0KTsKKyAgICB9CisKKyAgICAjaWYgWk1fU0hBUkVfQVVUSCA9PSAxCisgICAgemZpV2xhblNldEF1dGhlbnRpY2F0aW9uTW9kZShkZXYsIDEpOworICAgICNlbmRpZiAvLyNpZiBaTV9TSEFSRV9BVVRIID09IDEKKyAgI2VuZGlmIC8vI2lmIFpNX1dFUF9NT01FID09IDEKKworI2VsaWYgWk1fUElCU1NfTU9ERSA9PSAxCisgICAgemZpV2xhblNldFdsYW5Nb2RlKGRldiwgWk1fTU9ERV9QU0VVRE8pOworI2Vsc2UKKyAgICB6ZmlXbGFuU2V0V2xhbk1vZGUoZGV2LCBaTV9NT0RFX0lORlJBU1RSVUNUVVJFKTsKKyNlbmRpZgorICAgIC8vemZpV2xhblNldENoYW5uZWwoZGV2LCBaTV9DSEFOTkVMLCBGQUxTRSk7CisgICAgemZpV2xhblNldEZyZXF1ZW5jeShkZXYsIDI0NjIwMDAsIEZBTFNFKTsKKyAgICB6ZmlXbGFuU2V0UnRzVGhyZXNob2xkKGRldiwgMzI3NjcpOworICAgIHpmaVdsYW5TZXRGcmFnVGhyZXNob2xkKGRldiwgMCk7CisKKyAgICB6ZmlXbGFuRW5hYmxlKGRldik7CisKKyNpZmRlZiBaTV9FTkFCTEVfQ0VOQworICAgIG1hY3AtPm5ldGxpbmtfc2sgPSBuZXRsaW5rX2tlcm5lbF9jcmVhdGUoTkVUTElOS19VU0VSU09DSywgMSwgTlVMTCwgVEhJU19NT0RVTEUpOworCisgICAgaWYgKG1hY3AtPm5ldGxpbmtfc2sgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgY3JlYXRlIE5FVExJTksgc29ja2V0XG4iKTsKKyAgICB9CisjZW5kaWYKKworICAgIG1hY3AtPkRldmljZU9wZW5lZCA9IDE7CitleGl0OgorLy8jaWZuZGVmIENPTkZJR19TTVAKKy8vICAgIHJlYWRfdW5sb2NrKCYobWFjcC0+aXNvbGF0ZV9sb2NrKSk7CisvLyNlbmRpZgorICAgIC8vemZSZWdpc3Rlcldkc0RldihkZXYsIDApOworICAgIC8vemZMbnhSZWdpc3RlclZhcERldihkZXYsIDApOworCisgICAgcmV0dXJuIHJjOworfQorCisKKworCisvKioKKyAqIHVzYmRydl9nZXRfc3RhdHMgLSBnZXQgZHJpdmVyIHN0YXRpc3RpY3MKKyAqIEBkZXY6IGFkYXB0ZXIncyBuZXRfZGV2aWNlIHN0cnVjdAorICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbiB0aGUgT1Mgd2FudHMgdGhlIGFkYXB0ZXIncyBzdGF0cyByZXR1cm5lZC4KKyAqIEl0IHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIG5ldF9kZXZpY2Vfc3RhdHMgc3R1Y3R1cmUgZm9yIHRoZSBkZXZpY2UuCisgKiBJZiB0aGUgc3RhdGlzdGljcyBhcmUgY3VycmVudGx5IGJlaW5nIHVwZGF0ZWQsIHRoZW4gdGhleSBtaWdodCBiZSBpbmNvcnJlY3QKKyAqIGZvciBhIHNob3J0IHdoaWxlLiBIb3dldmVyLCBzaW5jZSB0aGlzIGNhbm5vdCBhY3R1YWxseSBjYXVzZSBkYW1hZ2UsIG5vCisgKiBsb2NraW5nIGlzIHVzZWQuCisgKi8KKworc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKiB1c2JkcnZfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgbWFjcC0+ZHJ2X3N0YXRzLm5ldF9zdGF0cy50eF9lcnJvcnMgPQorICAgICAgICBtYWNwLT5kcnZfc3RhdHMubmV0X3N0YXRzLnR4X2NhcnJpZXJfZXJyb3JzICsKKyAgICAgICAgbWFjcC0+ZHJ2X3N0YXRzLm5ldF9zdGF0cy50eF9hYm9ydGVkX2Vycm9yczsKKworICAgIG1hY3AtPmRydl9zdGF0cy5uZXRfc3RhdHMucnhfZXJyb3JzID0KKyAgICAgICAgbWFjcC0+ZHJ2X3N0YXRzLm5ldF9zdGF0cy5yeF9jcmNfZXJyb3JzICsKKyAgICAgICAgbWFjcC0+ZHJ2X3N0YXRzLm5ldF9zdGF0cy5yeF9mcmFtZV9lcnJvcnMgKworICAgICAgICBtYWNwLT5kcnZfc3RhdHMubmV0X3N0YXRzLnJ4X2xlbmd0aF9lcnJvcnM7CisKKworICAgIHJldHVybiAmKG1hY3AtPmRydl9zdGF0cy5uZXRfc3RhdHMpOworfQorCisKKy8qKgorICogdXNiZHJ2X3NldF9tYWMgLSBzZXQgdGhlIE1BQyBhZGRyZXNzCisgKiBAZGV2OiBhZGFwdGVyJ3MgbmV0X2RldmljZSBzdHJ1Y3QKKyAqIEBhZGRyOiB0aGUgbmV3IGFkZHJlc3MKKyAqCisgKiBUaGlzIHJvdXRpbmUgc2V0cyB0aGUgZXRoZXJuZXQgYWRkcmVzcyBvZiB0aGUgYm9hcmQKKyAqIFJldHVybnM6CisgKiAwICAtIGlmIHN1Y2Nlc3NmdWwKKyAqIC0xIC0gb3RoZXJ3aXNlCisgKi8KKworaW50IHVzYmRydl9zZXRfbWFjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwOworICAgIGludCByYyA9IC0xOworCisgICAgbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICByZWFkX2xvY2soJihtYWNwLT5pc29sYXRlX2xvY2spKTsKKworICAgIGlmIChtYWNwLT5kcml2ZXJfaXNvbGF0ZWQpIHsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIHJjID0gMDsKKworCitleGl0OgorICAgIHJlYWRfdW5sb2NrKCYobWFjcC0+aXNvbGF0ZV9sb2NrKSk7CisgICAgcmV0dXJuIHJjOworfQorCisKKwordm9pZAordXNiZHJ2X2lzb2xhdGVfZHJpdmVyKHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCkKK3sKKyNpZm5kZWYgQ09ORklHX1NNUAorICAgIHdyaXRlX2xvY2tfaXJxKCYobWFjcC0+aXNvbGF0ZV9sb2NrKSk7CisjZW5kaWYKKyAgICBtYWNwLT5kcml2ZXJfaXNvbGF0ZWQgPSBUUlVFOworI2lmbmRlZiBDT05GSUdfU01QCisgICAgd3JpdGVfdW5sb2NrX2lycSgmKG1hY3AtPmlzb2xhdGVfbG9jaykpOworI2VuZGlmCisKKyAgICBpZiAobmV0aWZfcnVubmluZyhtYWNwLT5kZXZpY2UpKQorICAgIHsKKyAgICAgICAgbmV0aWZfY2Fycmllcl9vZmYobWFjcC0+ZGV2aWNlKTsKKyAgICAgICAgbmV0aWZfc3RvcF9xdWV1ZShtYWNwLT5kZXZpY2UpOworICAgIH0KK30KKworI2RlZmluZSBWTEFOX1NJWkUgICAJNAoraW50IHVzYmRydl9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworICAgIGlmICgobmV3X210dSA8IDY4KSB8fCAobmV3X210dSA+IChFVEhfREFUQV9MRU4gKyBWTEFOX1NJWkUpKSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBkZXYtPm10dSA9IG5ld19tdHU7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgemZMbnhVbmxpbmtBbGxVcmJzKHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCk7CisKK2ludCB1c2JkcnZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKK2V4dGVybiB2b2lkIHpmSHBMZWRDdHJsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNl90IGxlZElkLCB1OF90IG1vZGUpOworCisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgcHJpbnRrKEtFUk5fREVCVUcgInVzYmRydl9jbG9zZVxuIik7CisKKyAgICBuZXRpZl9jYXJyaWVyX29mZihtYWNwLT5kZXZpY2UpOworCisgICAgZGVsX3RpbWVyX3N5bmMoJm1hY3AtPmhiVGltZXIxMG1zKTsKKworICAgIHByaW50ayhLRVJOX0RFQlVHICJ1c2JkcnZfbmV0aWZfY2Fycmllcl9vZmZcbiIpOworCisgICAgdXNiZHJ2X2lzb2xhdGVfZHJpdmVyKG1hY3ApOworCisgICAgcHJpbnRrKEtFUk5fREVCVUcgInVzYmRydl9pc29sYXRlX2RyaXZlclxuIik7CisKKyAgICBuZXRpZl9jYXJyaWVyX29mZihtYWNwLT5kZXZpY2UpOworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCisgICAgLyogQ0VOQyAqLworICAgIGlmIChtYWNwLT5uZXRsaW5rX3NrICE9IE5VTEwpCisgICAgeworICAgIC8vICAgIHNvY2tfcmVsZWFzZShtYWNwLT5uZXRsaW5rX3NrKTsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ1c2JkcnYgY2xvc2UgbmV0bGluayBzb2NrZXRcbiIpOworICAgIH0KKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisjaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUENJKQorICAgIC8vZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisjZW5kaWYKKworICAgIC8qIFR1cm4gb2ZmIExFRCAqLworICAgIHpmSHBMZWRDdHJsKGRldiwgMCwgMCk7CisgICAgemZIcExlZEN0cmwoZGV2LCAxLCAwKTsKKworICAgIC8qIERlbGF5IGZvciBhIHdoaWxlICovCisgICAgbWRlbGF5KDEwKTsKKworICAgIC8qIGNsZWFyIFdQQS9SU04gSUUgKi8KKyAgICBtYWNwLT5zdXBJZVsxXSA9IDA7CisKKyAgICAvKiBzZXQgdGhlIGlzb2xhdGUgZmxhZyB0byBmYWxzZSwgc28gdXNiZHJ2X29wZW4gY2FuIGJlIGNhbGxlZCAqLworICAgIG1hY3AtPmRyaXZlcl9pc29sYXRlZCA9IEZBTFNFOworCisgICAgemZpV2xhbkNsb3NlKGRldik7CisgICAga2ZyZWUobWFjcC0+d2QpOworCisgICAgemZMbnhVbmxpbmtBbGxVcmJzKG1hY3ApOworCisgICAgcmV0dXJuIDA7Cit9CisKKworCisKK2ludCB1c2JkcnZfeG1pdF9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGludCBub3RpZnlfc3RvcCA9IEZBTFNFOworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKworI2lmIDAKKyAgICAvKiBUZXN0IGNvZGUgKi8KKyAgICB7CisgICAgICAgIHN0cnVjdCBza19idWZmKiBzOworCisgICAgICAgIHMgPSBza2JfY29weV9leHBhbmQoc2tiLCA4LCAwLCBHRlBfQVRPTUlDKTsKKyAgICAgICAgc2tiX3B1c2gocywgOCk7CisgICAgICAgIHMtPmRhdGFbMF0gPSAneic7CisgICAgICAgIHMtPmRhdGFbMV0gPSAneSc7CisgICAgICAgIHMtPmRhdGFbMl0gPSAnZCc7CisgICAgICAgIHMtPmRhdGFbM10gPSAnYSc7CisgICAgICAgIHMtPmRhdGFbNF0gPSAncyc7CisgICAgICAgIHByaW50aygibGVuMT0lZCwgbGVuMj0lZCIsIHNrYi0+bGVuLCBzLT5sZW4pOworICAgICAgICBuZXRsaW5rX2Jyb2FkY2FzdChydG5sLCBzLCAwLCBSVE1HUlBfTElOSywgR0ZQX0FUT01JQyk7CisgICAgfQorI2VuZGlmCisKKyNpZiBaTV9ESVNBQkxFX1hNSVQKKyAgICBkZXZfa2ZyZWVfc2tiX2lycShza2IpOworI2Vsc2UKKyAgICB6ZmlUeFNlbmRFdGgoZGV2LCBza2IsIDApOworI2VuZGlmCisgICAgbWFjcC0+ZHJ2X3N0YXRzLm5ldF9zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKyAgICBtYWNwLT5kcnZfc3RhdHMubmV0X3N0YXRzLnR4X3BhY2tldHMrKzsKKworICAgIC8vZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKworICAgIGlmIChub3RpZnlfc3RvcCkgeworICAgICAgICBuZXRpZl9jYXJyaWVyX29mZihkZXYpOworICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKworCisKK3ZvaWQgdXNiZHJ2X3NldF9tdWx0aShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisKKyAgICBpZiAoIShkZXYtPmZsYWdzICYgSUZGX1VQKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgICAgIHJldHVybjsKKworfQorCisKKworLyoqCisgKiB1c2JkcnZfY2xlYXJfc3RydWN0cyAtIGZyZWUgcmVzb3VyY2VzCisKKyAqIEBkZXY6IGFkYXB0ZXIncyBuZXRfZGV2aWNlIHN0cnVjdAorICoKKyAqIEZyZWUgYWxsIGRldmljZSBzcGVjaWZpYyBzdHJ1Y3RzLCB1bm1hcCBpL28gYWRkcmVzcywgZXRjLgorICovCit2b2lkIHVzYmRydl9jbGVhcl9zdHJ1Y3RzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisKKyNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ0kpCisgICAgaW91bm1hcChtYWNwLT5yZWdwKTsKKworICAgIHBjaV9yZWxlYXNlX3JlZ2lvbnMobWFjcC0+cGRldik7CisgICAgcGNpX2Rpc2FibGVfZGV2aWNlKG1hY3AtPnBkZXYpOworICAgIHBjaV9zZXRfZHJ2ZGF0YShtYWNwLT5wZGV2LCBOVUxMKTsKKyNlbmRpZgorCisgICAga2ZyZWUobWFjcCk7CisKKyAgICBrZnJlZShkZXYpOworCit9CisKK3ZvaWQgdXNiZHJ2X3JlbW92ZTEoc3RydWN0IHBjaV9kZXYgKnBjaWQpCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3A7CisKKyAgICBpZiAoIShkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgcGNpX2dldF9kcnZkYXRhKHBjaWQpKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICB1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisgICAgdXNiZHJ2X2NsZWFyX3N0cnVjdHMoZGV2KTsKK30KKworCit2b2lkIHpmTG54MTBtc1RpbWVyKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgbW9kX3RpbWVyKCYobWFjcC0+aGJUaW1lcjEwbXMpLCBqaWZmaWVzICsgKDEqSFopLzEwMCk7ICAgLy8xMCBtcworICAgIHpmaUhlYXJ0QmVhdChkZXYpOworICAgIHJldHVybjsKK30KKwordm9pZCB6ZkxueEluaXRWYXBTdHJ1Y3Qodm9pZCkKK3sKKyAgICB1MTZfdCBpOworCisgICAgZm9yIChpPTA7IGk8Wk1fVkFQX1BPUlRfTlVNQkVSOyBpKyspCisgICAgeworICAgICAgICB2YXBbaV0uZGV2ID0gTlVMTDsKKyAgICAgICAgdmFwW2ldLm9wZW5GbGFnID0gMDsKKyAgICB9Cit9CisKK2ludCB6ZkxueFZhcE9wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICB1MTZfdCB2YXBJZDsKKworICAgIHZhcElkID0gemZMbnhHZXRWYXBJZChkZXYpOworCisgICAgaWYgKHZhcFt2YXBJZF0ub3BlbkZsYWcgPT0gMCkKKyAgICB7CisgICAgICAgIHZhcFt2YXBJZF0ub3BlbkZsYWcgPSAxOworICAgIAlwcmludGsoInpmTG54VmFwT3BlbiA6IGRldmljZSBuYW1lPSVzLCB2YXAgSUQ9JWRcbiIsIGRldi0+bmFtZSwgdmFwSWQpOworICAgIAl6ZmlXbGFuU2V0U1NJRChkZXYsICJ2YXAxIiwgNCk7CisgICAgCXpmaVdsYW5FbmFibGUoZGV2KTsKKyAgICAJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJWQVAgb3BlbmVkIGVycm9yIDogdmFwIElEPSVkXG4iLCB2YXBJZCk7CisgICAgfQorCXJldHVybiAwOworfQorCitpbnQgemZMbnhWYXBDbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHUxNl90IHZhcElkOworCisgICAgdmFwSWQgPSB6ZkxueEdldFZhcElkKGRldik7CisKKyAgICBpZiAodmFwSWQgIT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgaWYgKHZhcFt2YXBJZF0ub3BlbkZsYWcgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKCJ6ZkxueFZhcENsb3NlOiBkZXZpY2UgbmFtZT0lcywgdmFwIElEPSVkXG4iLCBkZXYtPm5hbWUsIHZhcElkKTsKKworICAgICAgICAgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworICAgICAgICAgICAgdmFwW3ZhcElkXS5vcGVuRmxhZyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoIlZBUCBwb3J0IHdhcyBub3Qgb3BlbmVkIDogdmFwIElEPSVkXG4iLCB2YXBJZCk7CisgICAgICAgIH0KKyAgICB9CisJcmV0dXJuIDA7Cit9CisKK2ludCB6ZkxueFZhcFhtaXRGcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGludCBub3RpZnlfc3RvcCA9IEZBTFNFOworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICB1MTZfdCB2YXBJZDsKKworICAgIHZhcElkID0gemZMbnhHZXRWYXBJZChkZXYpOworICAgIC8vcHJpbnRrKCJ6ZkxueFZhcFhtaXRGcmFtZTogdmFwIElEPSVkXG4iLCB2YXBJZCk7CisgICAgLy9wcmludGsoInpmTG54VmFwWG1pdEZyYW1lKCksIHNrYj0lbHhoXG4iLCAodTMyX3Qpc2tiKTsKKworICAgIGlmICh2YXBJZCA+PSBaTV9WQVBfUE9SVF9OVU1CRVIpCisgICAgeworICAgICAgICBkZXZfa2ZyZWVfc2tiX2lycShza2IpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisjaWYgMQorICAgIGlmICh2YXBbdmFwSWRdLm9wZW5GbGFnID09IDApCisgICAgeworICAgICAgICBkZXZfa2ZyZWVfc2tiX2lycShza2IpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisjZW5kaWYKKworCisgICAgemZpVHhTZW5kRXRoKGRldiwgc2tiLCAweDEpOworCisgICAgbWFjcC0+ZHJ2X3N0YXRzLm5ldF9zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKyAgICBtYWNwLT5kcnZfc3RhdHMubmV0X3N0YXRzLnR4X3BhY2tldHMrKzsKKworICAgIC8vZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKworICAgIGlmIChub3RpZnlfc3RvcCkgeworICAgICAgICBuZXRpZl9jYXJyaWVyX29mZihkZXYpOworICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB6ZkxueFJlZ2lzdGVyVmFwRGV2KHN0cnVjdCBuZXRfZGV2aWNlKiBwYXJlbnREZXYsIHUxNl90IHZhcElkKQoreworICAgIC8qIEFsbG9jYXRlIG5ldCBkZXZpY2Ugc3RydWN0dXJlICovCisgICAgdmFwW3ZhcElkXS5kZXYgPSBhbGxvY19ldGhlcmRldigwKTsKKyAgICBwcmludGsoIlJlZ2lzdGVyIHZhcCBkZXY9JXhcbiIsICh1MzJfdCl2YXBbdmFwSWRdLmRldik7CisKKyAgICBpZih2YXBbdmFwSWRdLmRldiA9PSBOVUxMKSB7CisgICAgICAgIHByaW50aygiYWxsb2NfZXRoZXJkZXYgZmFpbFxuIik7CisgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgIH0KKworICAgIC8qIFNldHVwIHRoZSBkZWZhdWx0IHNldHRpbmdzICovCisgICAgZXRoZXJfc2V0dXAodmFwW3ZhcElkXS5kZXYpOworCisgICAgLyogTUFDIGFkZHJlc3MgKi8KKyAgICBtZW1jcHkodmFwW3ZhcElkXS5kZXYtPmRldl9hZGRyLCBwYXJlbnREZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisKKyAgICB2YXBbdmFwSWRdLmRldi0+aXJxID0gcGFyZW50RGV2LT5pcnE7CisgICAgdmFwW3ZhcElkXS5kZXYtPmJhc2VfYWRkciA9IHBhcmVudERldi0+YmFzZV9hZGRyOworICAgIHZhcFt2YXBJZF0uZGV2LT5tZW1fc3RhcnQgPSBwYXJlbnREZXYtPm1lbV9zdGFydDsKKyAgICB2YXBbdmFwSWRdLmRldi0+bWVtX2VuZCA9IHBhcmVudERldi0+bWVtX2VuZDsKKyAgICB2YXBbdmFwSWRdLmRldi0+bWxfcHJpdiA9IHBhcmVudERldi0+bWxfcHJpdjsKKworICAgIC8vZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmemQxMjEyX3dkc194bWl0X2ZyYW1lOworICAgIHZhcFt2YXBJZF0uZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmemZMbnhWYXBYbWl0RnJhbWU7CisgICAgdmFwW3ZhcElkXS5kZXYtPm9wZW4gPSAmemZMbnhWYXBPcGVuOworICAgIHZhcFt2YXBJZF0uZGV2LT5zdG9wID0gJnpmTG54VmFwQ2xvc2U7CisgICAgdmFwW3ZhcElkXS5kZXYtPmdldF9zdGF0cyA9ICZ1c2JkcnZfZ2V0X3N0YXRzOworICAgIHZhcFt2YXBJZF0uZGV2LT5jaGFuZ2VfbXR1ID0gJnVzYmRydl9jaGFuZ2VfbXR1OworI2lmZGVmIFpNX0hPU1RBUERfU1VQUE9SVAorICAgIHZhcFt2YXBJZF0uZGV2LT5kb19pb2N0bCA9IHVzYmRydl9pb2N0bDsKKyNlbHNlCisgICAgdmFwW3ZhcElkXS5kZXYtPmRvX2lvY3RsID0gTlVMTDsKKyNlbmRpZgorICAgIHZhcFt2YXBJZF0uZGV2LT5kZXN0cnVjdG9yID0gZnJlZV9uZXRkZXY7CisKKyAgICB2YXBbdmFwSWRdLmRldi0+dHhfcXVldWVfbGVuID0gMDsKKworICAgIHZhcFt2YXBJZF0uZGV2LT5kZXZfYWRkclswXSA9IHBhcmVudERldi0+ZGV2X2FkZHJbMF07CisgICAgdmFwW3ZhcElkXS5kZXYtPmRldl9hZGRyWzFdID0gcGFyZW50RGV2LT5kZXZfYWRkclsxXTsKKyAgICB2YXBbdmFwSWRdLmRldi0+ZGV2X2FkZHJbMl0gPSBwYXJlbnREZXYtPmRldl9hZGRyWzJdOworICAgIHZhcFt2YXBJZF0uZGV2LT5kZXZfYWRkclszXSA9IHBhcmVudERldi0+ZGV2X2FkZHJbM107CisgICAgdmFwW3ZhcElkXS5kZXYtPmRldl9hZGRyWzRdID0gcGFyZW50RGV2LT5kZXZfYWRkcls0XTsKKyAgICB2YXBbdmFwSWRdLmRldi0+ZGV2X2FkZHJbNV0gPSBwYXJlbnREZXYtPmRldl9hZGRyWzVdICsgKHZhcElkKzEpOworCisgICAgLyogU3RvcCB0aGUgbmV0d29yayBxdWV1ZSBmaXJzdCAqLworICAgIG5ldGlmX3N0b3BfcXVldWUodmFwW3ZhcElkXS5kZXYpOworCisgICAgc3ByaW50Zih2YXBbdmFwSWRdLmRldi0+bmFtZSwgInZhcCVkIiwgdmFwSWQpOworICAgIHByaW50aygiUmVnaXN0ZXIgVkFQIGRldiBzdWNjZXNzIDogJXNcbiIsIHZhcFt2YXBJZF0uZGV2LT5uYW1lKTsKKworICAgIGlmKHJlZ2lzdGVyX25ldGRldmljZSh2YXBbdmFwSWRdLmRldikgIT0gMCkgeworICAgICAgICBwcmludGsoInJlZ2lzdGVyIFZBUCBkZXZpY2UgZmFpbFxuIik7CisgICAgICAgIHZhcFt2YXBJZF0uZGV2ID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB6ZkxueFVucmVnaXN0ZXJWYXBEZXYoc3RydWN0IG5ldF9kZXZpY2UqIHBhcmVudERldiwgdTE2X3QgdmFwSWQpCit7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBwcmludGsoIlVucmVnaXN0ZXIgVkFQIGRldiA6ICVzXG4iLCB2YXBbdmFwSWRdLmRldi0+bmFtZSk7CisKKyAgICBpZih2YXBbdmFwSWRdLmRldiAhPSBOVUxMKSB7CisgICAgICAgIHByaW50aygiVW5yZWdpc3RlciB2YXAgZGV2PSV4XG4iLCAodTMyX3QpdmFwW3ZhcElkXS5kZXYpOworICAgICAgICAvLworICAgICAgICAvL3VucmVnaXN0ZXJfbmV0ZGV2aWNlKHdkc1t3ZHNJZF0uZGV2KTsKKyAgICAgICAgdW5yZWdpc3Rlcl9uZXRkZXYodmFwW3ZhcElkXS5kZXYpOworCisgICAgICAgIHByaW50aygiVkFQIHVucmVnaXN0ZXJfbmV0ZGV2aWNlXG4iKTsKKyAgICAgICAgdmFwW3ZhcElkXS5kZXYgPSBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcHJpbnRrKCJ1bnJlZ2lzdGVyIFZBUCBkZXZpY2U6ICVkIGZhaWxcbiIsIHZhcElkKTsKKyAgICAgICAgcmV0ID0gLUVJTlZBTDsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisKKworIyAgZGVmaW5lIFNVQk1JVF9VUkIodSxmKSAgICAgICB1c2Jfc3VibWl0X3VyYih1LGYpCisjICBkZWZpbmUgVVNCX0FMTE9DX1VSQih1LGYpICAgIHVzYl9hbGxvY191cmIodSxmKQorCisvL2V4dGVybiB2b2lkIHpmaVdsYW5RdWVyeU1hY0FkZHJlc3MoemRldl90KiBkZXYsIHU4X3QqIGFkZHIpOworCitleHRlcm4gaW50IHVzYmRydl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCB1c2JkcnZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IHVzYmRydl94bWl0X2ZyYW1lKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCB1c2JkcnZfeG1pdF9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgdXNiZHJ2X2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpOworZXh0ZXJuIHZvaWQgdXNiZHJ2X3NldF9tdWx0aShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgdXNiZHJ2X3NldF9tYWMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcik7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKiB1c2JkcnZfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCB1c2JkcnZfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpOworZXh0ZXJuIFVzYlR4UV90ICp6ZkxueEdldFVzYlR4QnVmZmVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitpbnQgemZMbnhBbGxvY0FsbFVyYnMoc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwKQoreworICAgIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBtYWNwLT5pbnRlcmZhY2U7CisgICAgc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaWZhY2VfZGVzYyA9ICZpbnRlcmZhY2UtPmFsdHNldHRpbmdbMF07CisKKyAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OworICAgIGludCBpOworCisgICAgLyogZGVzY3JpcHRvciBtYXRjaGVzLCBsZXQncyBmaW5kIHRoZSBlbmRwb2ludHMgbmVlZGVkICovCisgICAgLyogY2hlY2sgb3V0IHRoZSBlbmRwb2ludHMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyArK2kpCisgICAgeworICAgICAgICBlbmRwb2ludCA9ICZpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjOworICAgICAgICBpZiAoKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgMHg4MCkgJiYKKyAgICAgICAgICAgICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIDMpID09IDB4MDIpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiB3ZSBmb3VuZCBhIGJ1bGsgaW4gZW5kcG9pbnQgKi8KKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiYnVsayBpbjogd01heFBhY2tldFNpemUgPSAleFxuIiwgbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKChlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIDB4ODApID09IDB4MDApICYmCisgICAgICAgICAgICAoKGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMgJiAzKSA9PSAweDAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogd2UgZm91bmQgYSBidWxrIG91dCBlbmRwb2ludCAqLworICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJidWxrIG91dDogd01heFBhY2tldFNpemUgPSAleFxuIiwgbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgMHg4MCkgJiYKKyAgICAgICAgICAgICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIDMpID09IDB4MDMpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiB3ZSBmb3VuZCBhIGludGVycnVwdCBpbiBlbmRwb2ludCAqLworICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJpbnRlcnJ1cHQgaW46IHdNYXhQYWNrZXRTaXplID0gJXhcbiIsIGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSkpOworICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJpbnRlcnJ1cHQgaW46IGludF9pbnRlcnZhbCA9ICVkXG4iLCBlbmRwb2ludC0+YkludGVydmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgMHg4MCkgPT0gMHgwMCkgJiYKKyAgICAgICAgICAgICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIDMpID09IDB4MDMpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiB3ZSBmb3VuZCBhIGludGVycnVwdCBvdXQgZW5kcG9pbnQgKi8KKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiaW50ZXJydXB0IG91dDogd01heFBhY2tldFNpemUgPSAleFxuIiwgbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKSk7CisgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImludGVycnVwdCBvdXQ6IGludF9pbnRlcnZhbCA9ICVkXG4iLCBlbmRwb2ludC0+YkludGVydmFsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEFsbG9jYXRlIGFsbCBUeCBVUkJzICovCisgICAgZm9yIChpID0gMDsgaSA8IFpNX01BWF9UWF9VUkJfTlVNOyBpKyspCisgICAgeworICAgICAgICBtYWNwLT5XbGFuVHhEYXRhVXJiW2ldID0gVVNCX0FMTE9DX1VSQigwLCBHRlBfS0VSTkVMKTsKKworICAgICAgICBpZiAobWFjcC0+V2xhblR4RGF0YVVyYltpXSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgajsKKworICAgICAgICAgICAgLyogRnJlZSBhbGwgdXJicyAqLworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGk7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1c2JfZnJlZV91cmIobWFjcC0+V2xhblR4RGF0YVVyYltqXSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQWxsb2NhdGUgYWxsIFJ4IFVSQnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgWk1fTUFYX1JYX1VSQl9OVU07IGkrKykKKyAgICB7CisgICAgICAgIG1hY3AtPldsYW5SeERhdGFVcmJbaV0gPSBVU0JfQUxMT0NfVVJCKDAsIEdGUF9LRVJORUwpOworCisgICAgICAgIGlmIChtYWNwLT5XbGFuUnhEYXRhVXJiW2ldID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBqOworCisgICAgICAgICAgICAvKiBGcmVlIGFsbCB1cmJzICovCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaTsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVzYl9mcmVlX3VyYihtYWNwLT5XbGFuUnhEYXRhVXJiW2pdKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IFpNX01BWF9UWF9VUkJfTlVNOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNiX2ZyZWVfdXJiKG1hY3AtPldsYW5UeERhdGFVcmJbal0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEFsbG9jYXRlIFJlZ2lzdGVyIFJlYWQvV3JpdGUgVVNCICovCisgICAgbWFjcC0+UmVnT3V0VXJiID0gVVNCX0FMTE9DX1VSQigwLCBHRlBfS0VSTkVMKTsKKyAgICBtYWNwLT5SZWdJblVyYiA9IFVTQl9BTExPQ19VUkIoMCwgR0ZQX0tFUk5FTCk7CisKKyAgICByZXR1cm4gMTsKK30KKwordm9pZCB6ZkxueEZyZWVBbGxVcmJzKHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCkKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIEZyZWUgYWxsIFR4IFVSQnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgWk1fTUFYX1RYX1VSQl9OVU07IGkrKykKKyAgICB7CisgICAgICAgIGlmIChtYWNwLT5XbGFuVHhEYXRhVXJiW2ldICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzYl9mcmVlX3VyYihtYWNwLT5XbGFuVHhEYXRhVXJiW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEZyZWUgYWxsIFJ4IFVSQnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgWk1fTUFYX1JYX1VSQl9OVU07IGkrKykKKyAgICB7CisgICAgICAgIGlmIChtYWNwLT5XbGFuUnhEYXRhVXJiW2ldICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzYl9mcmVlX3VyYihtYWNwLT5XbGFuUnhEYXRhVXJiW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEZyZWUgVVNCIFJlZ2lzdGVyIFJlYWQvV3JpdGUgVVJCICovCisgICAgdXNiX2ZyZWVfdXJiKG1hY3AtPlJlZ091dFVyYik7CisgICAgdXNiX2ZyZWVfdXJiKG1hY3AtPlJlZ0luVXJiKTsKK30KKwordm9pZCB6ZkxueFVubGlua0FsbFVyYnMoc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwKQoreworICAgIGludCBpOworCisgICAgLyogVW5saW5rIGFsbCBUeCBVUkJzICovCisgICAgZm9yIChpID0gMDsgaSA8IFpNX01BWF9UWF9VUkJfTlVNOyBpKyspCisgICAgeworICAgICAgICBpZiAobWFjcC0+V2xhblR4RGF0YVVyYltpXSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB1c2JfdW5saW5rX3VyYihtYWNwLT5XbGFuVHhEYXRhVXJiW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFVubGluayBhbGwgUnggVVJCcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBaTV9NQVhfUlhfVVJCX05VTTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKG1hY3AtPldsYW5SeERhdGFVcmJbaV0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNiX3VubGlua191cmIobWFjcC0+V2xhblJ4RGF0YVVyYltpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBVbmxpbmsgVVNCIFJlZ2lzdGVyIFJlYWQvV3JpdGUgVVJCICovCisgICAgdXNiX3VubGlua191cmIobWFjcC0+UmVnT3V0VXJiKTsKKworICAgIHVzYl91bmxpbmtfdXJiKG1hY3AtPlJlZ0luVXJiKTsKK30KKwordThfdCB6ZkxueEluaXRTZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3ApCit7CisgICAgLy91bnNpZ25lZCBjaGFyIGFkZHJbNl07CisKKyAgICAvL2luaXRfTVVURVgoJm1hY3AtPnBzX3NlbSk7CisgICAgLy9pbml0X01VVEVYKCZtYWNwLT5yZWdfc2VtKTsKKyAgICAvL2luaXRfTVVURVgoJm1hY3AtPmJjbl9zZW0pOworICAgIC8vaW5pdF9NVVRFWCgmbWFjcC0+Y29uZmlnX3NlbSk7CisKKyAgICBzcGluX2xvY2tfaW5pdCgmKG1hY3AtPmNzX2xvY2spKTsKKyNpZiAwCisgICAgLyogTUFDIGFkZHJlc3MgKi8KKyAgICB6ZmlXbGFuUXVlcnlNYWNBZGRyZXNzKGRldiwgYWRkcik7CisgICAgZGV2LT5kZXZfYWRkclswXSA9IGFkZHJbMF07CisgICAgZGV2LT5kZXZfYWRkclsxXSA9IGFkZHJbMV07CisgICAgZGV2LT5kZXZfYWRkclsyXSA9IGFkZHJbMl07CisgICAgZGV2LT5kZXZfYWRkclszXSA9IGFkZHJbM107CisgICAgZGV2LT5kZXZfYWRkcls0XSA9IGFkZHJbNF07CisgICAgZGV2LT5kZXZfYWRkcls1XSA9IGFkZHJbNV07CisjZW5kaWYKKyNpZiBXSVJFTEVTU19FWFQgPiAxMgorICAgIGRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAoc3RydWN0IGl3X2hhbmRsZXJfZGVmICopJnA4MDIxMXdleHRfaGFuZGxlcl9kZWY7CisjZW5kaWYKKworICAgIGRldi0+b3BlbiA9IHVzYmRydl9vcGVuOworICAgIGRldi0+aGFyZF9zdGFydF94bWl0ID0gdXNiZHJ2X3htaXRfZnJhbWU7CisgICAgZGV2LT5zdG9wID0gdXNiZHJ2X2Nsb3NlOworICAgIGRldi0+Y2hhbmdlX210dSA9ICZ1c2JkcnZfY2hhbmdlX210dTsKKyAgICBkZXYtPmdldF9zdGF0cyA9IHVzYmRydl9nZXRfc3RhdHM7CisgICAgZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSB1c2JkcnZfc2V0X211bHRpOworICAgIGRldi0+c2V0X21hY19hZGRyZXNzID0gdXNiZHJ2X3NldF9tYWM7CisgICAgZGV2LT5kb19pb2N0bCA9IHVzYmRydl9pb2N0bDsKKworICAgIGRldi0+ZmxhZ3MgfD0gSUZGX01VTFRJQ0FTVDsKKworICAgIGRldi0+ZGV2X2FkZHJbMF0gPSAweDAwOworICAgIGRldi0+ZGV2X2FkZHJbMV0gPSAweDAzOworICAgIGRldi0+ZGV2X2FkZHJbMl0gPSAweDdmOworICAgIGRldi0+ZGV2X2FkZHJbM10gPSAweDExOworICAgIGRldi0+ZGV2X2FkZHJbNF0gPSAweDIyOworICAgIGRldi0+ZGV2X2FkZHJbNV0gPSAweDMzOworCisgICAgLyogSW5pdGlhbGl6ZSBIZWFydCBCZWF0IHRpbWVyICovCisgICAgaW5pdF90aW1lcigmbWFjcC0+aGJUaW1lcjEwbXMpOworICAgIG1hY3AtPmhiVGltZXIxMG1zLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CisgICAgbWFjcC0+aGJUaW1lcjEwbXMuZnVuY3Rpb24gPSAodm9pZCAqKSZ6ZkxueDEwbXNUaW1lcjsKKworICAgIC8qIEluaXRpYWxpemUgV0RTIGFuZCBWQVAgZGF0YSBzdHJ1Y3R1cmUgKi8KKyAgICAvL3pmSW5pdFdkc1N0cnVjdCgpOworICAgIHpmTG54SW5pdFZhcFN0cnVjdCgpOworCisgICAgcmV0dXJuIDE7Cit9CisKK3U4X3QgemZMbnhDbGVhclN0cnVjdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICB1MTZfdCBpaTsKKyAgICB1MTZfdCBUeFFDbnQ7CisKKyAgICBUeFFDbnQgPSB6ZkxueENoZWNrVHhCdWZmZXJDbnQoZGV2KTsKKworICAgIHByaW50ayhLRVJOX0VSUiAiVHhRQ250OiAlZFxuIiwgVHhRQ250KTsKKworICAgIGZvcihpaSA9IDA7IGlpIDwgVHhRQ250OyBpaSsrKQorICAgIHsKKyAgICAgICAgVXNiVHhRX3QgKlR4USA9IHpmTG54R2V0VXNiVHhCdWZmZXIoZGV2KTsKKworICAgICAgICBwcmludGsoS0VSTl9FUlIgImRldl9rZnJlZV9za2JfYW55XG4iKTsKKyAgICAgICAgLyogRnJlZSBidWZmZXIgKi8KKyAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoVHhRLT5idWYpOworICAgIH0KKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvdXNiZHJ2LmggYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy91c2JkcnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTFiM2IzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvdXNiZHJ2LmgKQEAgLTAsMCArMSwyNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IHVzYmRydi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBuZXR3b3JrIGludGVyZmFjZSB1cC9kb3duIHJlbGF0ZWQgZGVmaW5pdGlvbiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQbGF0Zm9ybSBkZXBlbmRlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfVVNCRFJWX0gKKyNkZWZpbmUgX1VTQkRSVl9ICisKKyNkZWZpbmUgV0xBTl9VU0IgICAgMAorI2RlZmluZSBXTEFOX1BDSSAgICAxCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlICJ6ZGNvbXBhdC5oIgorCisjaW5jbHVkZSAib2FsX2R0LmgiCisjaW5jbHVkZSAib2FsX21hcmMuaCIKKyNpbmNsdWRlICI4MDIxMWNvcmUvcHViX3pmaS5oIgorLy8jaW5jbHVkZSAicHViX3pmdy5oIgorI2luY2x1ZGUgIjgwMjExY29yZS9wdWJfdXNiLmgiCisKKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKy8qIFBsZWFzZSBpbmNsdWRlIGhlYWRlciBmaWxlcyBmb3IgZGV2aWNlIHR5cGUgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGlzIGZpbGUgKi8KKyNkZWZpbmUgdXJiX3QgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1cmIKKworI2RlZmluZSB1c2JfY29tcGxldGVfdCAgICAgICAgICAgICAgdXNiX2NvbXBsZXRlX3QKKyNkZWZpbmUgcGlwZV90ICAgICAgICAgICAgICAgICAgICAgIHUzMl90CisKKy8qIFVTQiBFbmRwb2ludCBkZWZpbml0aW9uICovCisjZGVmaW5lIFVTQl9XTEFOX1RYX1BJUEUgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVVNCX1dMQU5fUlhfUElQRSAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBVU0JfUkVHX0lOX1BJUEUgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFVTQl9SRUdfT1VUX1BJUEUgICAgICAgICAgICAgICAgICAgIDQKKworI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1VTQikKKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNlbmRpZgorCisjaWZkZWYgWk1fSE9TVEFQRF9TVVBQT1JUCisjaW5jbHVkZSAiYXRocl9jb21tb24uaCIKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCQlEZXNjcmlwdG9yIERhdGEgU3RydWN0dXJlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgZHJpdmVyX3N0YXRzIHsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBuZXRfc3RhdHM7Cit9OworCisjZGVmaW5lIFpNX01BWF9SWF9CVUZGRVJfU0laRSAgICAgICAgICAgICAgIDgxOTIKKworI2lmIFpNX1VTQl9UWF9TVFJFQU1fTU9ERSA9PSAxCisjZGVmaW5lIFpNX01BWF9UWF9BR0dSRUdBVEVfTlVNICAgICAgICAgICAgIDQKKyNkZWZpbmUgWk1fVVNCX1RYX0JVRl9TSVpFICAgICAgICAgICAgICAgICAgODA5NgorI2RlZmluZSBaTV9NQVhfVFhfVVJCX05VTSAgICAgICAgICAgICAgICAgICA0CisjZWxzZQorI2RlZmluZSBaTV9VU0JfVFhfQlVGX1NJWkUgICAgICAgICAgICAgICAgICAyMDQ4CisjZGVmaW5lIFpNX01BWF9UWF9VUkJfTlVNICAgICAgICAgICAgICAgICAgIDgKKyNlbmRpZgorI2RlZmluZSBaTV9VU0JfUkVHX01BWF9CVUZfU0laRSAgICAgICAgICAgICA2NAorI2RlZmluZSBaTV9NQVhfUlhfVVJCX05VTSAgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBaTV9NQVhfVFhfQlVGX05VTSAgICAgICAgICAgICAgICAgICAxMjgKKwordHlwZWRlZiBzdHJ1Y3QgVXNiVHhRCit7CisgICAgemJ1Zl90ICpidWY7CisgICAgdThfdCBoZHJbODBdOworICAgIHUxNl90IGhkcmxlbjsKKyAgICB1OF90IHNuYXBbOF07CisgICAgdTE2X3Qgc25hcExlbjsKKyAgICB1OF90IHRhaWxbMTZdOworICAgIHUxNl90IHRhaWxMZW47CisgICAgdTE2X3Qgb2Zmc2V0OworfSBVc2JUeFFfdDsKKworCitzdHJ1Y3QgemRhcF9pb2N0bCB7CisJdTE2X3QgY21kOyAgICAgICAgICAgICAgICAvKiBDb21tYW5kIHRvIHJ1biAqLworCXUzMl90IGFkZHI7ICAgICAgICAgICAgICAgIC8qIExlbmd0aCBvZiB0aGUgZGF0YSBidWZmZXIgKi8KKwl1MzJfdCB2YWx1ZTsgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGRhdGEgYnVmZmVyICovCisJdThfdAlkYXRhWzB4MTAwXTsKK307CisKKyNkZWZpbmUgWk1fT0FMX01BWF9TVEFfU1VQUE9SVCAxNgorCitzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUKK3sKKwkvL2xpbnV4IHVzZWQKKwlzdHJ1Y3QgbmV0X2RldmljZSAJKmRldmljZTsKKyNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ0kpCisJc3RydWN0IHBjaV9kZXYgCQkqcGRldjsKKyNlbmRpZgorI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1VTQikKKwlzdHJ1Y3QgdXNiX2RldmljZQkqdWRldjsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAgICAqaW50ZXJmYWNlOworI2VuZGlmCisJc3RydWN0IGRyaXZlcl9zdGF0cyBkcnZfc3RhdHM7CisJY2hhciBpZm5hbWVbSUZOQU1TSVpdOworCWludAkgICAgICAgICAgICAgICAgdXNpbmdfZGFjOworCXU4X3QJCQlyZXZfaWQ7CQkvKiBhZGFwdGVyIFBDSSByZXZpc2lvbiBJRCAqLworCXJ3bG9ja190IAkJaXNvbGF0ZV9sb2NrOworICAgIHNwaW5sb2NrX3QgICAgICBjc19sb2NrOworCWludCAJCQlkcml2ZXJfaXNvbGF0ZWQ7CisjaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUENJKQorCXZvaWQJCQkqcmVncDsKKyNlbmRpZgorCisgICAgICAgIC8qIHRpbWVyIGZvciBoZWFydCBiZWF0ICovCisJc3RydWN0IHRpbWVyX2xpc3QgaGJUaW1lcjEwbXM7CisKKwkvKiBGb3IgZHJpdmVyIGNvcmUgKi8KKwl2b2lkKiB3ZDsKKworI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1VTQikKKwl1OF90ICAgICAgICAgICAgICAgICAgICB0eFVzYkJ1ZltaTV9NQVhfVFhfVVJCX05VTV1bWk1fVVNCX1RYX0JVRl9TSVpFXTsKKwl1OF90ICAgICAgICAgICAgICAgICAgICByZWdVc2JSZWFkQnVmW1pNX1VTQl9SRUdfTUFYX0JVRl9TSVpFXTsKKwl1OF90ICAgICAgICAgICAgICAgICAgICByZWdVc2JXcml0ZUJ1ZltaTV9VU0JfUkVHX01BWF9CVUZfU0laRV07CisJdXJiX3QJCQkqV2xhblR4RGF0YVVyYltaTV9NQVhfVFhfVVJCX05VTV07CisJdXJiX3QJCQkqV2xhblJ4RGF0YVVyYltaTV9NQVhfUlhfVVJCX05VTV07CisJdXJiX3QJCQkqUmVnT3V0VXJiOworCXVyYl90CQkJKlJlZ0luVXJiOworCVVzYlR4UV90ICAgICAgICAgICAgICAgIFVzYlR4QnVmUVtaTV9NQVhfVFhfQlVGX05VTV07CisJemJ1Zl90ICAgICAgICAgICAgICAgICAgKlVzYlJ4QnVmUVtaTV9NQVhfUlhfVVJCX05VTV07CisgICAgICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIFR4QnVmSGVhZDsKKyAgICAgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgVHhCdWZUYWlsOworICAgICAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBUeEJ1ZkNudDsKKyAgICAgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgVHhVcmJIZWFkOworICAgICAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBUeFVyYlRhaWw7CisgICAgICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIFR4VXJiQ250OworICAgICAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBSeEJ1ZkhlYWQ7CisgICAgICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIFJ4QnVmVGFpbDsKKyAgICAgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgUnhCdWZDbnQ7CisjZW5kaWYKKworI2lmIFpNX1VTQl9TVFJFQU1fTU9ERSA9PSAxCisgICAgICAgIHpidWZfdCAgICAgICAgICAgICAgICAgICpyZWFtaW5fYnVmOworI2VuZGlmCisKKyNpZmRlZiBaTV9IT1NUQVBEX1NVUFBPUlQKKyAgICAgICAgc3RydWN0IGF0aHJfd2xhbl9wYXJhbSAgYXRocl93cGFfcmVxOworI2VuZGlmCisgICAgICAgIHN0cnVjdCBzb2NrICAgICAgICAgICAgICpuZXRsaW5rX3NrOworICAgICAgICB1OF90ICAgICAgICAgICAgRGV2aWNlT3BlbmVkOyAvL0NXWWFuZygrKQorICAgICAgICB1OF90ICAgICAgICAgICAgc3VwSWVbNTBdOworICAgICAgICB1OF90ICAgICAgICAgICAgc3VwTGVuOworICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExcmVxX3dwYWllIHN0YXdwYWllW1pNX09BTF9NQVhfU1RBX1NVUFBPUlRdOworICAgICAgICB1OF90ICAgICAgICAgICAgZm9yd2FyZE1nbXQ7CisKKyAgICAgICAgc3RydWN0IHpmQ2JVc2JGdW5jVGJsIHVzYkNiRnVuY3Rpb25zOworCisgICAgICAgIC8qIEZvciBrZXZlbnRkICovCisgICAgICAgIHUzMl90ICAgICAgICAgICAgICAgICAgIGZsYWdzOworICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICBrZXZlbnRfZmxhZ3M7CisgICAgICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIGtldmVudF9yZWFkeTsKKworICAgICAgICBzdHJ1Y3Qgc2VtYXBob3JlICAgICAgICBpb2N0bF9zZW07CisgICAgICAgIHN0cnVjdCB3b3JrX3N0cnVjdCAgICAgIGtldmVudDsKKyAgICAgICAgd2FpdF9xdWV1ZV9oZWFkX3QgICAgICAgd2FpdF9xdWV1ZV9ldmVudDsKKyNpZmRlZiBaTV9IQUxQTFVTX0xPQ0sKKyAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgaGFsX2lycUZsYWc7CisjZW5kaWYKKyAgICAgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgYWRhcHRlclN0YXRlOworfTsKKworLyogV0RTICovCisjZGVmaW5lIFpNX1dEU19QT1JUX05VTUJFUiAgNgorCitzdHJ1Y3QgenNXZHNTdHJ1Y3QKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSogZGV2OworICAgIHUxNl90IG9wZW5GbGFnOworfTsKKworLyogVkFQICovCisjZGVmaW5lIFpNX1ZBUF9QT1JUX05VTUJFUiAgNworCitzdHJ1Y3QgenNWYXBTdHJ1Y3QKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSogZGV2OworICAgIHUxNl90IG9wZW5GbGFnOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBaTV9JT0NUTF9SRUdfUkVBRAkJCTB4MDEKKyNkZWZpbmUgWk1fSU9DVExfUkVHX1dSSVRFCQkJMHgwMgorI2RlZmluZSBaTV9JT0NUTF9NRU1fRFVNUAkJCTB4MDMKKyNkZWZpbmUgWk1fSU9DVExfUkVHX0RVTVAJCQkweDA1CisjZGVmaW5lIFpNX0lPQ1RMX1RYRF9EVU1QIAkJCTB4MDYKKyNkZWZpbmUgWk1fSU9DVExfUlhEX0RVTVAgCQkJMHgwNworI2RlZmluZSBaTV9JT0NUTF9NRU1fUkVBRAkJCTB4MEIKKyNkZWZpbmUgWk1fSU9DVExfTUVNX1dSSVRFCQkJMHgwQworI2RlZmluZSBaTV9JT0NUTF9ETUFfVEVTVCAgICAgICAgICAgMHgxMAorI2RlZmluZSBaTV9JT0NUTF9SRUdfVEVTVCAgICAgICAgICAgMHgxMQorI2RlZmluZSBaTV9JT0NUTF9URVNUICAgICAgICAgICAgICAgMHg4MAorI2RlZmluZSBaTV9JT0NUTF9UQUxMWSAgICAgICAgICAgICAgMHg4MSAvL0NXWWFuZygrKQorI2RlZmluZSBaTV9JT0NUTF9SVFMgICAgICAgICAgICAgICAgMHhBMAorI2RlZmluZSBaTV9JT0NUTF9NSVhfTU9ERSAgICAgICAgICAgMHhBMQorI2RlZmluZSBaTV9JT0NUTF9GUkFHICAgICAgICAgICAgICAgMHhBMgorI2RlZmluZSBaTV9JT0NUTF9TQ0FOICAgICAgICAgICAgICAgMHhBMworI2RlZmluZSBaTV9JT0NUTF9LRVkgICAgICAgICAgICAgICAgMHhBNAorI2RlZmluZSBaTV9JT0NUTF9SQVRFICAgICAgICAgICAgICAgMHhBNQorI2RlZmluZSBaTV9JT0NUTF9FTkNSWVBUSU9OX01PREUgICAgMHhBNgorI2RlZmluZSBaTV9JT0NUTF9HRVRfVFhDTlQgICAgICAgICAgMHhBNworI2RlZmluZSBaTV9JT0NUTF9HRVRfREVBR0dfQ05UICAgICAgMHhBOAorI2RlZmluZSBaTV9JT0NUTF9EVVJBVElPTl9NT0RFICAgICAgMHhBOQorI2RlZmluZSBaTV9JT0NUTF9TRVRfQUVTX0tFWSAgICAgICAgMHhBQQorI2RlZmluZSBaTV9JT0NUTF9TRVRfQUVTX01PREUgICAgICAgMHhBQgorI2RlZmluZSBaTV9JT0NUTF9TSUdOQUxfU1RSRU5HVEggICAgMHhBQyAvL0NXWWFuZygrKQorI2RlZmluZSBaTV9JT0NUTF9TSUdOQUxfUVVBTElUWSAgICAgMHhBRCAvL0NXWWFuZygrKQorI2RlZmluZSBaTV9JT0NUTF9TRVRfUElCU1NfTU9ERSAgICAgMHhBRQorCisjZGVmaW5lCVpEQVBJT0NUTAkJCQlTSU9DREVWUFJJVkFURQorCitlbnVtIGRldlN0YXRlIHsKKyAgICBPcGVuZWQsCisgICAgRW5hYmxlZCwKKyAgICBEaXNhYmxlZCwKKyAgICBDbG9zZWQKK307CisKKyNlbmRpZgkvKiBfVVNCRFJWX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9idWYuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfYnVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI0OTZhMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfYnVmLmMKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IHdyYXBfYnVmLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBUaGlzIG1vZHVsZSBjb250YWlucyB3cmFwcGVyIGZ1bmN0aW9ucyBmb3IgYnVmZmVyIG1hbmFnZW1lbnQgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQbGF0Zm9ybSBkZXBlbmRlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIm9hbF9kdC5oIgorI2luY2x1ZGUgInVzYmRydi5oIgorCisKKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisKKyNpZiBXSVJFTEVTU19FWFQgPiAxMgorI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CisjZW5kaWYKKworCisKKy8qIENhbGxlZCB0byBhbGxvY2F0ZSBidWZmZXIsIG11c3QgcmV0dXJuIGEgY29udGludWUgYnVmZmVyIHNwYWNlICovCit6YnVmX3QqIHpmd0J1ZkFsbG9jYXRlKHpkZXZfdCogZGV2LCB1MTZfdCBsZW4pCit7CisgICAgemJ1Zl90KiBidWY7CisKKyAgICAvKiBBbGxvY2F0ZSBTS0IgZm9yIHBhY2tldCovCisgICAgYnVmID0gZGV2X2FsbG9jX3NrYihsZW4pOworCisgICAgcmV0dXJuIGJ1ZjsKK30KKworCisvKiBDYWxsZWQgdG8gZnJlZSBidWZmZXIsIHJlcGxhY2UgYmVsb3cgMyBmdW5jdGlvbnMgKi8KK3ZvaWQgemZ3QnVmRnJlZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IHN0YXR1cykKK3sKKyAgICBkZXZfa2ZyZWVfc2tiX2FueShidWYpOworfQorCisvKiBDYWxsZWQgdG8gYWRqdXN0IGJ1ZmZlciBzaXplIGFuZCBoZWFkIHBvaW50ZXIgKi8KK3UxNl90IHpmd0J1ZlJlbW92ZUhlYWQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBzaXplKQoreworICAgIC8vem1fYXNzZXJ0KGJ1Zi0+bGVuID4gc2l6ZSk7CisKKyAgICBidWYtPmRhdGEgKz0gc2l6ZTsKKyAgICBidWYtPmxlbiAtPSBzaXplOworICAgIHJldHVybiAwOworfQorCisKKworCisvKiByZXR1cm4gdGFpbCBpZiBoZWFkPT1OVUxMLCBjYWxsZWQgdG8gY2hhaW4gbXVsdGlwbGUgYnVmZmVyIHRvZ2V0aGVyICovCisvKiBVc2VkIHRvIGNoYWluIFJ4IGJ1ZmZlciB0byBmb3JtIGEgZnJhbWUuIGlmIHRoZSBwcmVwYXJlZCBSeCBidWZmZXIgICovCisvKiBpcyBncmVhdGVyIHRoYW4gYW4gZXRoZXJuZXQgZnJhbWUoMTUxOCszMiBieXRlKSwgdGhlbiB0aGlzIGZ1bmN0aW9uICAgICovCisvKiB3aWxsIG9ubHkgYmUgY2FsbGVkIHdpdGggaGVhZD1OVUxMLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit1MTZfdCB6ZndCdWZDaGFpbih6ZGV2X3QqIGRldiwgemJ1Zl90KiogaGVhZCwgemJ1Zl90KiB0YWlsKQoreworCisgICAgKmhlYWQgPSB0YWlsOworICAgIHJldHVybiAwOworfQorCisKKy8qIENhbGxlZCB3aGVuIGRvaW5nIGluZnJhLWJzcyBmb3J3YXJkaW5nICovCit1MTZfdCB6ZndCdWZDb3B5KHpkZXZfdCogZGV2LCB6YnVmX3QqIGRzdCwgemJ1Zl90KiBzcmMpCit7CisgICAgbWVtY3B5KGRzdC0+ZGF0YSwgc3JjLT5kYXRhLCBzcmMtPmxlbik7CisgICAgZHN0LT50YWlsID0gZHN0LT5kYXRhOworICAgIHNrYl9wdXQoZHN0LCBzcmMtPmxlbik7CisgICAgcmV0dXJuIDA7Cit9CisKKworLyogQ2FsbGVkIHRvIGFkanVzdCBidWZmZXIgc2l6ZSBhbmQgdGFpbCBwb2ludGVyICovCit1MTZfdCB6ZndCdWZTZXRTaXplKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgc2l6ZSkKK3sKKyNpZmRlZiBORVRfU0tCVUZGX0RBVEFfVVNFU19PRkZTRVQKKyAgICBidWYtPnRhaWwgPSAwOworICAgIGJ1Zi0+bGVuID0gMDsKKyNlbHNlCisgICAgYnVmLT50YWlsID0gYnVmLT5kYXRhOworICAgIGJ1Zi0+bGVuID0gMDsKKyNlbmRpZgorCisgICAgc2tiX3B1dChidWYsIHNpemUpOworICAgIHJldHVybiAwOworfQorCit1MTZfdCB6ZndCdWZHZXRTaXplKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK3sKKyAgICByZXR1cm4gYnVmLT5sZW47Cit9CisKK3ZvaWQgemZ3Q29weUJ1ZkNvbnRleHQoemRldl90KiBkZXYsIHpidWZfdCogc291cmNlLCB6YnVmX3QqIGRzdCkKK3sKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfZGJnLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX2RiZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNzYzZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX2RiZy5jCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICBNb2R1bGUgTmFtZSA6IHdyYXBfZGJnLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBUaGlzIG1vZHVsZSBjb250YWlucyB3cmFwcGVyIGZ1bmN0aW9ucyBmb3IgZGVidWcgZnVuY3Rpb25zICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQbGF0Zm9ybSBkZXBlbmRlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIm9hbF9kdC5oIgorI2luY2x1ZGUgInVzYmRydi5oIgorCisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorCisjaWYgV0lSRUxFU1NfRVhUID4gMTIKKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorI2VuZGlmCisKK3ZvaWQgemZ3RHVtcEJ1Zih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgdTE2X3QgaTsKKworICAgIGZvciAoaT0wOyBpPGJ1Zi0+bGVuOyBpKyspCisgICAgeworICAgICAgICBwcmludGsoIiUwMnggIiwgKigoKHU4X3QqKWJ1Zi0+ZGF0YSkraSkpOworICAgICAgICBpZiAoKGkmMHhmKT09MHhmKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgcHJpbnRrKCJcbiIpOworfQorCisKK3ZvaWQgemZ3RGJnUmVhZFJlZ0RvbmUoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCkKK3sKKyAgICBwcmludGsoIlJlYWQgYWRkcjoleCA9ICV4XG4iLCBhZGRyLCB2YWwpOworfQorCit2b2lkIHpmd0RiZ1dyaXRlUmVnRG9uZSh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QgdmFsKQoreworICAgIHByaW50aygiV3JpdGUgYWRkcjoleCA9ICV4XG4iLCBhZGRyLCB2YWwpOworfQorCit2b2lkIHpmd0RiZ1JlYWRUYWxseURvbmUoemRldl90KiBkZXYpCit7CisgICAgLy9wcmludGsoIlJlYWQgVGFsbCBEb25lXG4iKTsKK30KKwordm9pZCB6ZndEYmdXcml0ZUVlcHJvbURvbmUoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCkKK3sKK30KKwordm9pZCB6ZndEYmdRdWVyeUh3VHhCdXN5RG9uZSh6ZGV2X3QqIGRldiwgdTMyX3QgdmFsKQoreworfQorCisvL0ZvciBFdmwgKysKK3ZvaWQgemZ3RGJnUmVhZEZsYXNoRG9uZSh6ZGV2X3QqIGRldiwgdTMyX3QgYWRkciwgdTMyX3QqIHJzcGRhdGEsIHUzMl90IGRhdGFsZW4pCit7CisgICAgcHJpbnRrKCJSZWFkIEZsYXNoIGFkZHI6JXggbGVuZ3RoOiV4XG4iLCBhZGRyLCBkYXRhbGVuKTsKK30KKwordm9pZCB6ZndEYmdQcm9ncmFtZUZsYXNoRG9uZSh6ZGV2X3QqIGRldikKK3sKKyAgICBwcmludGsoIlByb2dyYW0gRmxhc2ggRG9uZVxuIik7Cit9CisKK3ZvaWQgemZ3RGJnUHJvZ3JhbWVGbGFzaENoa0RvbmUoemRldl90KiBkZXYpCit7CisgICAgcHJpbnRrKCJQcm9ncmFtIEZsYXNoIERvbmVcbiIpOworfQorCit2b2lkIHpmd0RiZ0dldEZsYXNoQ2hrU3VtRG9uZSh6ZGV2X3QqIGRldiwgdTMyX3QqIHJzcGRhdGEpCit7CisgICAgcHJpbnRrKCJHZXQgRmxhc2ggQ2hrU3VtIERvbmVcbiIpOworfQorCit2b2lkIHpmd0RiZ0Rvd25sb2FkRndJbml0RG9uZSh6ZGV2X3QqIGRldikKK3sKKyAgICBwcmludGsoIkRvd25sb2FkIEZXIEluaXQgRG9uZVxuIik7Cit9CisvL0ZvciBFdmwgLS0KKworLyogTGVhdmUgYW4gZW1wdHkgbGluZSBiZWxvdyB0byByZW1vdmUgd2FybmluZyBtZXNzYWdlIG9uIHNvbWUgY29tcGlsZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjZiNzg3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9ldi5jCkBAIC0wLDAgKzEsMjgzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kdWxlIE5hbWUgOiB3cmFwX2V2LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBUaGlzIG1vZHVsZSBjb250YWlucyB3cmFwcGVyIGZ1bmN0aW9ucyBmb3IgZXZlbnRzICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQbGF0Zm9ybSBkZXBlbmRlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIm9hbF9kdC5oIgorI2luY2x1ZGUgInVzYmRydi5oIgorCisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorCisjaWYgV0lSRUxFU1NfRVhUID4gMTIKKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorI2VuZGlmCisKKworLyoqKioqIE1hbmFnZW1lbnQgKioqKiovCit1MTZfdCB6ZkxueEF1dGhOb3RpZnkoemRldl90KiBkZXYsIHUxNl90KiBtYWNBZGRyKQoreworICAgIHJldHVybiAwOworfQorCit1MTZfdCB6ZkxueEFzb2NOb3RpZnkoemRldl90KiBkZXYsIHUxNl90KiBtYWNBZGRyLCB1OF90KiBib2R5LCB1MTZfdCBib2R5U2l6ZSwgdTE2X3QgcG9ydCkKK3sKKy8vI2lmZGVmIFpNX0hPU1RBUERfU1VQUE9SVAorICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICB1bmlvbiBpd3JlcV9kYXRhIHdyZXE7CisgICAgdThfdCAqYWRkciA9ICh1OF90ICopIG1hY0FkZHI7CisgICAgdTE2X3QgaSwgajsKKworICAgIG1lbXNldCgmd3JlcSwgMCwgc2l6ZW9mKHdyZXEpKTsKKyAgICBtZW1jcHkod3JlcS5hZGRyLnNhX2RhdGEsIG1hY0FkZHIsIEVUSF9BTEVOKTsKKyAgICB3cmVxLmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworICAgIHByaW50ayhLRVJOX0RFQlVHICJqb2luX2V2ZW50IG9mIE1BQzogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisgICAgICAgICAgICBhZGRyWzBdLCBhZGRyWzFdLCBhZGRyWzJdLCBhZGRyWzNdLCBhZGRyWzRdLCBhZGRyWzVdKTsKKworICAgIGZvcihpID0gMDsgaSA8IFpNX09BTF9NQVhfU1RBX1NVUFBPUlQ7IGkrKykKKyAgICB7CisgICAgICAgIGZvcihqID0gMDsgaiA8IElFRUU4MDIxMV9BRERSX0xFTjsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKG1hY3AtPnN0YXdwYWllW2ldLndwYV9tYWNhZGRyW2pdICE9IDApICYmCisgICAgICAgICAgICAgICAgKG1hY3AtPnN0YXdwYWllW2ldLndwYV9tYWNhZGRyW2pdICE9IGFkZHJbal0pKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChqID09IDYpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGkgPCBaTV9PQUxfTUFYX1NUQV9TVVBQT1JUKQorICAgIHsKKyAgICAgICAgLy9wcmludGsoInpmd0Fzb2NOb3RpZnkgLSBzdG9yZSB3cGEgaWUgaW4gbWFjcCwgaW5kZXggPSAlZFxuIiwgaSk7CisgICAgICAgIG1lbWNweShtYWNwLT5zdGF3cGFpZVtpXS53cGFfbWFjYWRkciwgbWFjQWRkciwgSUVFRTgwMjExX0FERFJfTEVOKTsKKyAgICAgICAgbWVtY3B5KG1hY3AtPnN0YXdwYWllW2ldLndwYV9pZSwgYm9keSwgYm9keVNpemUpOworICAgIH0KKyAgICAvL2lmKG1hY3AtPmNhcmRTZXR0aW5nLkJzc1R5cGUgPT0gSU5GUkFTVFJVQ1RVUkVfQlNTKSB7CisgICAgLy8gICAgICAgICAgICAvL3dpcmVsZXNzX3NlbmRfZXZlbnQobWFjcC0+ZGV2aWNlLCBTSU9DR0lXU0NBTiwgJndyZXEsIE5VTEwpOworICAgIC8vICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQobWFjcC0+ZGV2aWNlLCBTSU9DR0lXQVAsICZ3cmVxLCBOVUxMKTsKKyAgICAvL30KKyNpZiBXSVJFTEVTU19FWFQgPj0gMTUKKyAgICAvL2Vsc2UgaWYobWFjcC0+Y2FyZFNldHRpbmcuQnNzVHlwZSA9PSBBUF9CU1MpIHsKKy8vICAgICAgICBpZiAocG9ydCA9PSAwKQorLy8gICAgICAgIHsKKyAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBJV0VWUkVHSVNURVJFRCwgJndyZXEsIE5VTEwpOworLy8gICAgICAgIH0KKy8vICAgICAgICBlbHNlCisvLyAgICAgICAgeworLy8gICAgICAgICAgICAvKiBDaGVjayB3aGV0aGVyIHRoZSBWQVAgZGV2aWNlIGlzIHZhbGlkICovCisvLyAgICAgICAgICAgIGlmICh2YXBbcG9ydF0uZGV2ICE9IE5VTEwpCisvLyAgICAgICAgICAgIHsKKy8vICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQodmFwW3BvcnRdLmRldiwgSVdFVlJFR0lTVEVSRUQsICZ3cmVxLCBOVUxMKTsKKy8vICAgICAgICAgICAgfQorLy8gICAgICAgICAgICBlbHNlCisvLyAgICAgICAgICAgIHsKKy8vICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiQ2FuJyBmaW5kIGEgdmFsaWQgVkFQIGRldmljZSwgcG9ydDogJWRcbiIsIHBvcnQpOworLy8gICAgICAgICAgICB9CisvLyAgICAgICAgfQorICAgIC8vfQorI2VuZGlmCisvLyNlbmRpZgorCisgICAgcmV0dXJuIDA7Cit9CisKKworLyogTm90aWZpY2F0aW9uIHRoYXQgYSBTVEEgaXMgZGlzYXNzb2NpYXRlZCBmcm9tIEFQICovCisvKiBBUCBtb2RlIG9ubHkgKi8KK3UxNl90IHpmTG54RGlzQXNvY05vdGlmeSh6ZGV2X3QqIGRldiwgdThfdCogbWFjQWRkciwgdTE2X3QgcG9ydCkKK3sKKyAgICB1bmlvbiBpd3JlcV9kYXRhIHdyZXE7CisgICAgdThfdCAqYWRkciA9ICh1OF90ICopIG1hY0FkZHI7CisKKyAgICBtZW1zZXQoJndyZXEsIDAsIHNpemVvZih3cmVxKSk7CisgICAgbWVtY3B5KHdyZXEuYWRkci5zYV9kYXRhLCBtYWNBZGRyLCBFVEhfQUxFTik7CisgICAgd3JlcS5hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKyAgICBwcmludGsoS0VSTl9ERUJVRyAiemZ3RGlzQXNvY05vdGlmeSgpLCBNQUM6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorICAgICAgICAgICAgYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwgYWRkclszXSwgYWRkcls0XSwgYWRkcls1XSk7CisKKworICAgIHJldHVybiAwOworfQorCisvKiBOb3RpZmljYXRpb24gdGhhdCBhIFNUQSBpcyBjb25uZWN0IHRvIEFQICovCisvKiBBUCBtb2RlIG9ubHkgKi8KK3UxNl90IHpmTG54QXBDb25uZWN0Tm90aWZ5KHpkZXZfdCogZGV2LCB1OF90KiBtYWNBZGRyLCB1MTZfdCBwb3J0KQoreworICAgIHVuaW9uIGl3cmVxX2RhdGEgd3JlcTsKKyAgICB1OF90ICphZGRyID0gKHU4X3QgKikgbWFjQWRkcjsKKworICAgIG1lbXNldCgmd3JlcSwgMCwgc2l6ZW9mKHdyZXEpKTsKKyAgICBtZW1jcHkod3JlcS5hZGRyLnNhX2RhdGEsIG1hY0FkZHIsIEVUSF9BTEVOKTsKKyAgICB3cmVxLmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworICAgIHByaW50ayhLRVJOX0RFQlVHICJ6ZndBcENvbm5lY3ROb3RpZnkoKSwgTUFDOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKyAgICAgICAgICAgIGFkZHJbMF0sIGFkZHJbMV0sIGFkZHJbMl0sIGFkZHJbM10sIGFkZHJbNF0sIGFkZHJbNV0pOworCisKKyAgICByZXR1cm4gMDsKK30KKworCisKK3ZvaWQgemZMbnhDb25uZWN0Tm90aWZ5KHpkZXZfdCogZGV2LCB1MTZfdCBzdGF0dXMsIHUxNl90KiBic3NpZCkKK3sKKyAgICB1bmlvbiBpd3JlcV9kYXRhIHdyZXE7CisgICAgdThfdCAqYWRkciA9ICh1OF90ICopIGJzc2lkOworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKworICAgIGlmIChic3NpZCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbWVtc2V0KCZ3cmVxLCAwLCBzaXplb2Yod3JlcSkpOworICAgICAgICBpZiAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9DT05ORUNUKQorICAgICAgICAgICAgbWVtY3B5KHdyZXEuYWRkci5zYV9kYXRhLCBic3NpZCwgRVRIX0FMRU4pOworICAgICAgICB3cmVxLmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCisgICAgICAgIGlmIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0NPTk5FQ1QpCisgICAgICAgIHsKKyNpZmRlZiBaTV9DT05GSUdfQklHX0VORElBTgorICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIkNvbm5lY3RlZCB0byBBUCwgTUFDOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKyAgICAgICAgICAgICAgICAgICAgYWRkclsxXSwgYWRkclswXSwgYWRkclszXSwgYWRkclsyXSwgYWRkcls1XSwgYWRkcls0XSk7CisjZWxzZQorICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIkNvbm5lY3RlZCB0byBBUCwgTUFDOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKyAgICAgICAgICAgICAgICAgICAgYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwgYWRkclszXSwgYWRkcls0XSwgYWRkcls1XSk7CisjZW5kaWYKKworICAgICAgICAgICAgbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUKSB8fAorICAgICAgICAgICAgICAgICAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9ESVNBQkxFRCkgfHwKKyAgICAgICAgICAgICAgICAgKHN0YXR1cyA9PSBaTV9TVEFUVVNfTUVESUFfQ09OTkVDVElPTl9ESVNBQkxFRCkgfHwKKwkgICAgICAgICAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9DT05ORUNUSU9OX1JFU0VUKSB8fAorCSAgICAgICAgIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX1JFU0VUKSB8fAorCSAgICAgICAgIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfREVBVVRIKSB8fAorCSAgICAgICAgIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfRElTQVNPQykgfHwKKwkgICAgICAgICAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX0JFQUNPTl9NSVNTKSB8fAorICAgICAgICAgICAgICAgICAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX05PVF9GT1VORCkgfHwKKwkgICAgICAgICAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX1RJTUVPVVQpKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiRGlzY29ubmVjdGlvbiBOb3RpZnlcbiIpOworCisgICAgICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisgICAgICAgIH0KKworCS8qIFNhdmUgdGhlIGNvbm5lY3RlZCBzdGF0dXMgKi8KKwltYWNwLT5hZGFwdGVyU3RhdGUgPSBzdGF0dXM7CisKKyAgICAgICAgaWYoemZpV2xhblF1ZXJ5V2xhbk1vZGUoZGV2KSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFKSB7CisgICAgICAgIC8vICAgICAgICAgICAgLy93aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgU0lPQ0dJV1NDQU4sICZ3cmVxLCBOVUxMKTsKKyAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBTSU9DR0lXQVAsICZ3cmVxLCBOVUxMKTsKKyAgICAgICAgfQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNQorICAgICAgICBlbHNlIGlmKHpmaVdsYW5RdWVyeVdsYW5Nb2RlKGRldikgPT0gWk1fTU9ERV9BUCkgeworICAgICAgICAgICAgLy9pZiAocG9ydCA9PSAwKQorICAgICAgICAgICAgLy97CisgICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIElXRVZSRUdJU1RFUkVELCAmd3JlcSwgTlVMTCk7CisgICAgICAgICAgICAvL30KKyAgICAgICAgICAgIC8vZWxzZQorICAgICAgICAgICAgLy97CisgICAgICAgICAgICAvLyAgICAvKiBDaGVjayB3aGV0aGVyIHRoZSBWQVAgZGV2aWNlIGlzIHZhbGlkICovCisgICAgICAgICAgICAvLyAgICBpZiAodmFwW3BvcnRdLmRldiAhPSBOVUxMKQorICAgICAgICAgICAgLy8gICAgeworICAgICAgICAgICAgLy8gICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQodmFwW3BvcnRdLmRldiwgSVdFVlJFR0lTVEVSRUQsICZ3cmVxLCBOVUxMKTsKKyAgICAgICAgICAgIC8vICAgIH0KKyAgICAgICAgICAgIC8vICAgIGVsc2UKKyAgICAgICAgICAgIC8vICAgIHsKKyAgICAgICAgICAgIC8vICAgICAgICBwcmludGsoS0VSTl9FUlIgIkNhbicgZmluZCBhIHZhbGlkIFZBUCBkZXZpY2UsIHBvcnQ6ICVkXG4iLCBwb3J0KTsKKyAgICAgICAgICAgIC8vICAgIH0KKyAgICAgICAgICAgIC8vfQorICAgICAgICB9CisjZW5kaWYKKyAgICB9CisgICAgLy9yZXR1cm4gMDsKK30KKwordm9pZCB6ZkxueFNjYW5Ob3RpZnkoemRldl90KiBkZXYsIHN0cnVjdCB6c1NjYW5SZXN1bHQqIHJlc3VsdCkKK3sKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgemZMbnhTdGF0aXN0aWNzTm90aWZ5KHpkZXZfdCogZGV2LCBzdHJ1Y3QgenNTdGFzdGljcyogcmVzdWx0KQoreworICAgIHJldHVybjsKK30KKworLy92b2lkIHpmd01pY0ZhaWx1cmVOb3RpZnkoemRldl90KiBkZXYsIHU4X3QqIG1lc3NhZ2UsIHUxNl90IGV2ZW50KQordm9pZCB6ZkxueE1pY0ZhaWx1cmVOb3RpZnkoemRldl90KiBkZXYsIHUxNl90KiBhZGRyLCB1MTZfdCBzdGF0dXMpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKnRhZyA9ICJNTE1FLU1JQ0hBRUxNSUNGQUlMVVJFLmluZGljYXRpb24iOworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwljaGFyIGJ1ZlsxMjhdOworCisJLyogVE9ETzogbmVlZGVkIHBhcmFtZXRlcnM6IGNvdW50LCB0eXBlLCBzcmMgYWRkcmVzcyAqLworCS8vc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzKCVzY2FzdCBhZGRyPSVzKSIsIHRhZywKKwkvLyAgICAoc3RhdHVzID09IFpNX01JQ19HUk9VUF9FUlJPUikgPyAgImJyb2FkIiA6ICJ1bmkiLAorCS8vICAgIGV0aGVyX3NwcmludGYoKHU4X3QgKilhZGRyKSk7CisKKwlpZiAoemZpV2xhblF1ZXJ5V2xhbk1vZGUoZGV2KSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFKQorCXsKKwkJc3RyY3B5KGJ1ZiwgdGFnKTsKKwl9CisKKwltZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisJd3JxdS5kYXRhLmxlbmd0aCA9IHN0cmxlbihidWYpOworCXdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgYnVmKTsKK30KKworCit2b2lkIHpmTG54QXBNaWNGYWlsdXJlTm90aWZ5KHpkZXZfdCogZGV2LCB1OF90KiBhZGRyLCB6YnVmX3QqIGJ1ZikKK3sKKyAgICB1bmlvbiBpd3JlcV9kYXRhIHdyZXE7CisKKyAgICBtZW1zZXQoJndyZXEsIDAsIHNpemVvZih3cmVxKSk7CisgICAgbWVtY3B5KHdyZXEuYWRkci5zYV9kYXRhLCBhZGRyLCBFVEhfQUxFTik7CisgICAgd3JlcS5hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKyAgICBwcmludGsoS0VSTl9ERUJVRyAiemZ3QXBNaWNGYWlsdXJlTm90aWZ5KCksIE1BQzogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisgICAgICAgICAgICBhZGRyWzBdLCBhZGRyWzFdLCBhZGRyWzJdLCBhZGRyWzNdLCBhZGRyWzRdLCBhZGRyWzVdKTsKKworICAgIHJldHVybjsKK30KKworLy8gc3RhdHVzID0gMCAgPT4gcGFydG5lciBsb3N0CisvLyAgICAgICAgPSAxICA9PiBwYXJ0bmVyIGFsaXZlCisvL3ZvaWQgemZ3SWJzc1BhcnRuZXJOb3RpZnkoemRldl90KiBkZXYsIHU4X3Qgc3RhdHVzKQordm9pZCB6ZkxueElic3NQYXJ0bmVyTm90aWZ5KHpkZXZfdCogZGV2LCB1MTZfdCBzdGF0dXMsIHN0cnVjdCB6c1BhcnRuZXJOb3RpZnlFdmVudCAqZXZlbnQpCit7Cit9CisKK3ZvaWQgemZMbnhNYWNBZGRyZXNzTm90aWZ5KHpkZXZfdCogZGV2LCB1OF90KiBhZGRyKQoreworICAgIGRldi0+ZGV2X2FkZHJbMF0gPSBhZGRyWzBdOworICAgIGRldi0+ZGV2X2FkZHJbMV0gPSBhZGRyWzFdOworICAgIGRldi0+ZGV2X2FkZHJbMl0gPSBhZGRyWzJdOworICAgIGRldi0+ZGV2X2FkZHJbM10gPSBhZGRyWzNdOworICAgIGRldi0+ZGV2X2FkZHJbNF0gPSBhZGRyWzRdOworICAgIGRldi0+ZGV2X2FkZHJbNV0gPSBhZGRyWzVdOworfQorCit2b2lkIHpmTG54U2VuZENvbXBsZXRlSW5kaWNhdGlvbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7Cit9CisKKwordm9pZCB6ZkxueFJlc3RvcmVCdWZEYXRhKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikgeworCit9CisvKiBMZWF2ZSBhbiBlbXB0eSBsaW5lIGJlbG93IHRvIHJlbW92ZSB3YXJuaW5nIG1lc3NhZ2Ugb24gc29tZSBjb21waWxlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9tZW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfbWVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA4MWJiMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfbWVtLmMKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogIE1vZHVsZSBOYW1lIDogd3JhcF9tZW0uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHdyYXBwZXIgZnVuY3Rpb25zIGZvciBtZW1vcnkgbWFuYWdlbWVudCAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFBsYXRmb3JtIGRlcGVuZGVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAib2FsX2R0LmgiCisjaW5jbHVkZSAidXNiZHJ2LmgiCisKKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisKKyNpZiBXSVJFTEVTU19FWFQgPiAxMgorI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CisjZW5kaWYKKworLyogTWVtb3J5IG1hbmFnZW1lbnQgKi8KKy8qIENhbGxlZCB0byBhbGxvY2F0ZSB1bmNhY2hlZCBtZW1vcnksIGFsbG9jYXRlZCBtZW1vcnkgbXVzdCAgICAqLworLyogaW4gNC1ieXRlIGJvdW5kYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit2b2lkKiB6ZndNZW1BbGxvY2F0ZSh6ZGV2X3QqIGRldiwgdTMyX3Qgc2l6ZSkKK3sKKyAgICB2b2lkKiBtZW0gPSBOVUxMOworICAgIG1lbSA9IGttYWxsb2Moc2l6ZSwgR0ZQX0FUT01JQyk7CisgICAgcmV0dXJuIG1lbTsKK30KKworCisvKiBDYWxsZWQgdG8gZnJlZSBhbGxvY2F0ZWQgbWVtb3J5ICovCit2b2lkIHpmd01lbUZyZWUoemRldl90KiBkZXYsIHZvaWQqIG1lbSwgdTMyX3Qgc2l6ZSkKK3sKKyAgICBrZnJlZShtZW0pOworICAgIHJldHVybjsKK30KKwordm9pZCB6ZndNZW1vcnlDb3B5KHU4X3QqIGRzdCwgdThfdCogc3JjLCB1MTZfdCBsZW5ndGgpCit7CisgICAgLy91MTZfdCBpOworCisgICAgbWVtY3B5KGRzdCwgc3JjLCBsZW5ndGgpOworICAgIC8vZm9yKGk9MDsgaTxsZW5ndGg7IGkrKykKKyAgICAvL3sKKyAgICAvLyAgICBkc3RbaV0gPSBzcmNbaV07CisgICAgLy99CisgICAgcmV0dXJuOworfQorCit2b2lkIHpmd1plcm9NZW1vcnkodThfdCogdmEsIHUxNl90IGxlbmd0aCkKK3sKKyAgICAvL3UxNl90IGk7CisgICAgbWVtc2V0KHZhLCAwLCBsZW5ndGgpOworICAgIC8vZm9yKGk9MDsgaTxsZW5ndGg7IGkrKykKKyAgICAvL3sKKyAgICAvLyAgICB2YVtpXSA9IDA7CisgICAgLy99CisgICAgcmV0dXJuOworfQorCit2b2lkIHpmd01lbW9yeU1vdmUodThfdCogZHN0LCB1OF90KiBzcmMsIHUxNl90IGxlbmd0aCkKK3sKKyAgICBtZW1jcHkoZHN0LCBzcmMsIGxlbmd0aCk7CisgICAgcmV0dXJuOworfQorCit1OF90IHpmd01lbW9yeUlzRXF1YWwodThfdCogbTEsIHU4X3QqIG0yLCB1MTZfdCBsZW5ndGgpCit7CisgICAgLy91MTZfdCBpOworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBtZW1jbXAobTEsIG0yLCBsZW5ndGgpOworCisgICAgcmV0dXJuICgocmV0PT0wKT9UUlVFOkZBTFNFKTsKKyAgICAvL2ZvcihpPTA7IGk8bGVuZ3RoOyBpKyspCisgICAgLy97CisgICAgLy8gICAgaWYgKCBtMVtpXSAhPSBtMltpXSApCisgICAgLy8gICAgeworICAgIC8vICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgLy8gICAgfQorICAgIC8vfQorCisgICAgLy9yZXR1cm4gVFJVRTsKK30KKworLyogTGVhdmUgYW4gZW1wdHkgbGluZSBiZWxvdyB0byByZW1vdmUgd2FybmluZyBtZXNzYWdlIG9uIHNvbWUgY29tcGlsZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfbWlzLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX21pcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNzkxOGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX21pcy5jCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kdWxlIE5hbWUgOiB3cmFwX21pcy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgd3JhcHBlciBmdW5jdGlvbnMgZm9yIG1pc2MgZnVuY3Rpb25zICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUGxhdGZvcm0gZGVwZW5kZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJvYWxfZHQuaCIKKyNpbmNsdWRlICJ1c2JkcnYuaCIKKworI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKworI2lmIFdJUkVMRVNTX0VYVCA+IDEyCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KKyNlbmRpZgorCisvL2V4dGVybiBzdHJ1Y3QgenNXZHNTdHJ1Y3Qgd2RzW1pNX1dEU19QT1JUX05VTUJFUl07CitleHRlcm4gc3RydWN0IHpzVmFwU3RydWN0IHZhcFtaTV9WQVBfUE9SVF9OVU1CRVJdOworZXh0ZXJuIHUxNl90IHpmTG54R2V0VmFwSWQoemRldl90KiBkZXYpOworCisvKiBTaW1wbHkgcmV0dXJuIDB4ZmZmZiBpZiBWQVAgZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCAqLwordTE2X3QgemZ3R2V0VmFwSWQoemRldl90KiBkZXYpCit7CisgICAgcmV0dXJuIHpmTG54R2V0VmFwSWQoZGV2KTsKK30KKwordm9pZCB6ZndTbGVlcCh6ZGV2X3QqIGRldiwgdTMyX3QgbXMpCit7CisgICAgaWYgKGluX2ludGVycnVwdCgpID09IDApCisgICAgeworICAgICAgICBtZGVsYXkobXMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpbnQgaWk7CisgICAgICAgIGludCBpdGVyID0gMTAwMDAwICogbXM7CisKKyAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgaXRlcjsgaWkrKykKKyAgICAgICAgeworCisgICAgICAgIH0KKyAgICB9Cit9CisKKyNpZmRlZiBaTV9IQUxQTFVTX0xPQ0sKK2FzbWxpbmthZ2Ugc3RydWN0IHpzV2xhbkRldiAqemZ3R2V0V2xhbkRldih6ZGV2X3QqIGRldikKK3sKKwlzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisJcmV0dXJuIG1hY3AtPndkOworfQorCithc21saW5rYWdlIHZvaWQgemZ3RW50ZXJDcml0aWNhbFNlY3Rpb24oemRldl90KiBkZXYpCit7CisJc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCXNwaW5fbG9ja19pcnFzYXZlKCZtYWNwLT5jc19sb2NrLCBtYWNwLT5oYWxfaXJxRmxhZyk7Cit9CisKK2FzbWxpbmthZ2Ugdm9pZCB6ZndMZWF2ZUNyaXRpY2FsU2VjdGlvbih6ZGV2X3QqIGRldikKK3sKKwlzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjcC0+Y3NfbG9jaywgbWFjcC0+aGFsX2lycUZsYWcpOworfQorCithc21saW5rYWdlIHU4X3QgemZ3QnVmUmVhZEJ5dGUoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQpCit7CisgICAgcmV0dXJuICoodThfdCopKCh1OF90KilidWYtPmRhdGErb2Zmc2V0KTsKK30KKworYXNtbGlua2FnZSB1MTZfdCB6ZndCdWZSZWFkSGFsZldvcmQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQpCit7CisgICAgcmV0dXJuIHptd19jcHVfdG9fbGUxNigqKHUxNl90KikoKHU4X3QqKWJ1Zi0+ZGF0YStvZmZzZXQpKTsKK30KKworYXNtbGlua2FnZSB2b2lkIHpmd0J1ZldyaXRlQnl0ZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgdThfdCB2YWx1ZSkKK3sKKyAgICAqKHU4X3QqKSgodThfdCopYnVmLT5kYXRhK29mZnNldCkgPSB2YWx1ZTsKK30KKworYXNtbGlua2FnZSB2b2lkIHpmd0J1ZldyaXRlSGFsZldvcmQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHUxNl90IHZhbHVlKQoreworICAgICoodTE2X3QqKSgodThfdCopYnVmLT5kYXRhK29mZnNldCkgPSB6bXdfY3B1X3RvX2xlMTYodmFsdWUpOworfQorCithc21saW5rYWdlIHU4X3QgKnpmd0dldEJ1ZmZlcih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit7CisgICAgcmV0dXJuICh1OF90KikoYnVmLT5kYXRhKTsKK30KKyNlbmRpZgorCisvKiBMZWF2ZSBhbiBlbXB0eSBsaW5lIGJlbG93IHRvIHJlbW92ZSB3YXJuaW5nIG1lc3NhZ2Ugb24gc29tZSBjb21waWxlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9wa3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfcGt0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRiMDAwNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfcGt0LmMKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IHdyYXBfcGt0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBUaGlzIG1vZHVsZSBjb250YWlucyB3cmFwcGVyIGZ1bmN0aW9ucyBmb3IgcGFja2V0IGhhbmRsaW5nICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQbGF0Zm9ybSBkZXBlbmRlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIm9hbF9kdC5oIgorI2luY2x1ZGUgInVzYmRydi5oIgorCisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorCisjaWYgV0lSRUxFU1NfRVhUID4gMTIKKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorI2VuZGlmCisKKworCisvL2V4dGVybiBzdHJ1Y3QgenNXZHNTdHJ1Y3Qgd2RzW1pNX1dEU19QT1JUX05VTUJFUl07CitleHRlcm4gc3RydWN0IHpzVmFwU3RydWN0IHZhcFtaTV9WQVBfUE9SVF9OVU1CRVJdOworCisKKy8qKioqKiBSeCAqKioqKi8KK3ZvaWQgemZMbnhSZWN2ODAyMTEoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBzdHJ1Y3QgenNBZGRpdGlvbkluZm8qIGFkZEluZm8pCit7CisgICAgdTE2X3QgZnJhbWVUeXBlOworICAgIHUxNl90IGZyYW1lQ3RybDsKKyAgICB1MTZfdCBmcmFtZVN1YnR5cGU7CisgICAgemJ1Zl90ICpza2IxOworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKworICAgIC8vZnJhbWVDdHJsID0gem13X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCk7CisgICAgZnJhbWVDdHJsID0gKih1OF90KikoKHU4X3QqKWJ1Zi0+ZGF0YSk7CisgICAgZnJhbWVUeXBlID0gZnJhbWVDdHJsICYgMHhmOworICAgIGZyYW1lU3VidHlwZSA9IGZyYW1lQ3RybCAmIDB4ZjA7CisKKyAgICBpZiAoKGZyYW1lVHlwZSA9PSAweDApICYmIChtYWNwLT5mb3J3YXJkTWdtdCkpCisgICAgeworICAgICAgICBzd2l0Y2ggKGZyYW1lU3VidHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEJlYWNvbiAqLworICAgICAgICAgICAgY2FzZSAweDgwIDoKKyAgICAgICAgICAgICAgICAvKiBQcm9iZSByZXNwb25zZSAqLworICAgICAgICAgICAgY2FzZSAweDUwIDoKKyAgICAgICAgICAgICAgICBza2IxID0gc2tiX2NvcHkoYnVmLCBHRlBfQVRPTUlDKTsKKyAgICAgICAgICAgICAgICBpZihza2IxICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBza2IxLT5kZXYgPSBkZXY7CisgICAgICAgICAgICAgICAgICAgIHNrYjEtPm1hY19oZWFkZXIgPSBza2IxLT5kYXRhOworCSAgICAgICAgICAgIHNrYjEtPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJICAgICAgICAgICAgc2tiMS0+cGt0X3R5cGUgPSBQQUNLRVRfT1RIRVJIT1NUOworCSAgICAgICAgICAgIHNrYjEtPnByb3RvY29sID0gX19jb25zdGFudF9odG9ucygweDAwMTkpOyAgLyogRVRIX1BfODAyMTFfUkFXICovCisgICAgCSAgICAgICAgICAgIG5ldGlmX3J4KHNrYjEpOworCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB6ZmlSZWN2ODAyMTEoZGV2LCBidWYsIGFkZEluZm8pOworICAgIHJldHVybjsKK30KKworI2RlZmluZSBaTV9BVk9JRF9VRFBfTEFSR0VfUEFDS0VUX0ZBSUwKK3ZvaWQgemZMbnhSZWN2RXRoKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QgcG9ydCkKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisjaWZkZWYgWk1fQVZPSURfVURQX0xBUkdFX1BBQ0tFVF9GQUlMCisgICAgemJ1Zl90ICpuZXdfYnVmOworCisgICAgLy9uZXdfYnVmID0gZGV2X2FsbG9jX3NrYigyMDQ4KTsKKyAgICBuZXdfYnVmID0gZGV2X2FsbG9jX3NrYihidWYtPmxlbik7CisKKyNpZmRlZiBORVRfU0tCVUZGX0RBVEFfVVNFU19PRkZTRVQKKyAgICBuZXdfYnVmLT50YWlsID0gMDsKKyAgICBuZXdfYnVmLT5sZW4gPSAwOworI2Vsc2UKKyAgICBuZXdfYnVmLT50YWlsID0gbmV3X2J1Zi0+ZGF0YTsKKyAgICBuZXdfYnVmLT5sZW4gPSAwOworI2VuZGlmCisKKyAgICBza2JfcHV0KG5ld19idWYsIGJ1Zi0+bGVuKTsKKyAgICBtZW1jcHkobmV3X2J1Zi0+ZGF0YSwgYnVmLT5kYXRhLCBidWYtPmxlbik7CisKKyAgICAvKiBGcmVlIGJ1ZmZlciAqLworICAgIGRldl9rZnJlZV9za2JfYW55KGJ1Zik7CisKKyAgICBpZiAocG9ydCA9PSAwKQorICAgIHsKKyAgICAgICAgbmV3X2J1Zi0+ZGV2ID0gZGV2OworICAgICAgICBuZXdfYnVmLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKG5ld19idWYsIGRldik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFZBUCAqLworICAgICAgICBpZiAodmFwWzBdLmRldiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBuZXdfYnVmLT5kZXYgPSB2YXBbMF0uZGV2OworICAgICAgICAgICAgbmV3X2J1Zi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhuZXdfYnVmLCB2YXBbMF0uZGV2KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG5ld19idWYtPmRldiA9IGRldjsKKyAgICAgICAgICAgIG5ld19idWYtPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMobmV3X2J1ZiwgZGV2KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG5ld19idWYtPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisgICAgZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKworICAgIHN3aXRjaChuZXRpZl9yeChuZXdfYnVmKSkKKyNlbHNlCisgICAgaWYgKHBvcnQgPT0gMCkKKyAgICB7CisgICAgICAgIGJ1Zi0+ZGV2ID0gZGV2OworICAgICAgICBidWYtPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoYnVmLCBkZXYpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBWQVAgKi8KKyAgICAgICAgaWYgKHZhcFswXS5kZXYgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYnVmLT5kZXYgPSB2YXBbMF0uZGV2OworICAgICAgICAgICAgYnVmLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKGJ1ZiwgdmFwWzBdLmRldik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBidWYtPmRldiA9IGRldjsKKyAgICAgICAgICAgIGJ1Zi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhidWYsIGRldik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBidWYtPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisgICAgZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKworICAgIHN3aXRjaChuZXRpZl9yeChidWYpKQorI2VuZGlmCisgICAgeworICAgIGNhc2UgTkVUX1JYX0JBRDoKKyAgICBjYXNlIE5FVF9SWF9EUk9QOgorICAgIGNhc2UgTkVUX1JYX0NOX01PRDoKKyAgICBjYXNlIE5FVF9SWF9DTl9ISUdIOgorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICAgICAgbWFjcC0+ZHJ2X3N0YXRzLm5ldF9zdGF0cy5yeF9wYWNrZXRzKys7CisgICAgICAgICAgICBtYWNwLT5kcnZfc3RhdHMubmV0X3N0YXRzLnJ4X2J5dGVzICs9IGJ1Zi0+bGVuOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qIExlYXZlIGFuIGVtcHR5IGxpbmUgYmVsb3cgdG8gcmVtb3ZlIHdhcm5pbmcgbWVzc2FnZSBvbiBzb21lIGNvbXBpbGVyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX3NlYy5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9zZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjg4ZDA2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9zZWMuYwpAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogd3JhcF9zZWMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHdyYXBwZXIgZnVuY3Rpb25zIGZvciBDRU5DLiAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFBsYXRmb3JtIGRlcGVuZGVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAib2FsX2R0LmgiCisjaW5jbHVkZSAidXNiZHJ2LmgiCisKKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisKKyNpZiBXSVJFTEVTU19FWFQgPiAxMgorI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CisjZW5kaWYKKworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCitleHRlcm4gaW50IHpmTG54Q2VuY1NlbmRNc2coc3RydWN0IHNvY2sgKm5ldGxpbmtfc2ssIHVfaW50OF90ICptc2csIGludCBsZW4pOworCit1MTZfdCB6ZkxueENlbmNBc29jTm90aWZ5KHpkZXZfdCogZGV2LCB1MTZfdCogbWFjQWRkciwgdThfdCogYm9keSwgdTE2X3QgYm9keVNpemUsIHUxNl90IHBvcnQpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gKHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqKWRldi0+cHJpdjsKKyAgICBzdHJ1Y3QgenlkYXNfY2VuY19zdGFfaW5mbyBjZW5jX2luZm87CisgICAgLy9zdHJ1Y3Qgc29jayAqbmV0bGlua19zazsKKyAgICB1OF90IGllX2xlbjsKKyAgICBpbnQgaWk7CisKKyAgICAvKiBDcmVhdGUgTkVUTElOSyBzb2NrZXQgKi8KKyAgICAvL25ldGxpbmtfc2sgPSBuZXRsaW5rX2tlcm5lbF9jcmVhdGUoTkVUTElOS19VU0VSU09DSywgTlVMTCk7CisKKyAgICBpZiAobWFjcC0+bmV0bGlua19zayA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJORVRMSU5LIFNvY2tldCBpcyBOVUxMXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIG1lbXNldCgmY2VuY19pbmZvLCAwLCBzaXplb2YoY2VuY19pbmZvKSk7CisKKyAgICAvL21lbWNweShjZW5jX2luZm8uZ3NuLCB2YXAtPml2X2NlbmNtc2tfa2V5cy53a190eGl2LCBaTV9DRU5DX0lWX0xFTik7CisgICAgemZpV2xhblF1ZXJ5R1NOKGRldiwgY2VuY19pbmZvLmdzbiwgcG9ydCk7CisgICAgY2VuY19pbmZvLmRhdGFsZW4gKz0gWk1fQ0VOQ19JVl9MRU47CisgICAgaWVfbGVuID0gYm9keVsxXSArIDI7CisgICAgbWVtY3B5KGNlbmNfaW5mby53aWUsIGJvZHksIGllX2xlbik7CisgICAgY2VuY19pbmZvLmRhdGFsZW4gKz0gaWVfbGVuOworCisgICAgbWVtY3B5KGNlbmNfaW5mby5zdGFfbWFjLCBtYWNBZGRyLCA2KTsKKyAgICBjZW5jX2luZm8ubXNnX3R5cGUgPSBaTV9DRU5DX1dBSV9SRVFVRVNUOworICAgIGNlbmNfaW5mby5kYXRhbGVuICs9IDYgKyAyOworCisgICAgcHJpbnRrKEtFUk5fRVJSICI9PT09PSB6ZndDZW5jU2VuZE1zZywgYm9keVNpemU6ICVkID09PT09XG4iLCBib2R5U2l6ZSk7CisKKyAgICBmb3IoaWkgPSAwOyBpaSA8IGJvZHlTaXplOyBpaSsrKQorICAgIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlMDJ4ICIsIGJvZHlbaWldKTsKKworICAgICAgICBpZiAoKGlpICYgMHhmKSA9PSAweGYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiXG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHpmTG54Q2VuY1NlbmRNc2cobWFjcC0+bmV0bGlua19zaywgKHU4X3QgKikmY2VuY19pbmZvLCBjZW5jX2luZm8uZGF0YWxlbis0KTsKKworICAgIC8qIENsb3NlIE5FVExJTksgc29ja2V0ICovCisgICAgLy9zb2NrX3JlbGVhc2UobmV0bGlua19zayk7CisKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisKK3U4X3QgemZ3Q2VuY0hhbmRsZUJlYWNvblByb2JyZXNwb24oemRldl90KiBkZXYsIHU4X3QgKnBXSUVjLAorICAgICAgICB1OF90ICpwUGVlclNTSURjLCB1OF90ICpwUGVlckFkZHJjKQoreworICAgIHJldHVybiAwOworfQorCit1OF90IHpmd0dldFBrdEVuY0V4ZW1wdGlvbkFjdGlvblR5cGUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQoreworICAgIHJldHVybiBaTV9FTkNSWVBUSU9OX0VYRU1QVF9OT19FWEVNUFRJT047Cit9CisKK3ZvaWQgY29weVRvSW50VHhCdWZmZXIoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdTE2X3Qgb2Zmc2V0LCB1MTZfdCBsZW5ndGgpCit7CisgICAgdTE2X3QgaTsKKworICAgIGZvcihpPTA7IGk8bGVuZ3RoO2krKykKKyAgICB7CisgICAgICAgIC8vem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCtpLCBzcmNbaV0pOworICAgICAgICAqKHU4X3QqKSgodThfdCopYnVmLT5kYXRhK29mZnNldCtpKSA9IHNyY1tpXTsKKyAgICB9Cit9CisKK3UxNl90IHpmd1N0YUFkZEllV3BhUnNuKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGZyYW1lVHlwZSkKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgLy96bV9tc2cxX21tKFpNX0xWXzAsICJDV1kgLSBhZGQgd3BhaWUgY29udGVudCBMZW5ndGggOiAiLCBtYWNwLT5zdXBJZVsxXSk7CisgICAgaWYgKG1hY3AtPnN1cEllWzFdICE9IDApCisgICAgeworICAgICAgICBjb3B5VG9JbnRUeEJ1ZmZlcihkZXYsIGJ1ZiwgbWFjcC0+c3VwSWUsIG9mZnNldCwgbWFjcC0+c3VwSWVbMV0rMik7CisgICAgICAgIC8vbWVtY3B5KGJ1Zi0+ZGF0YVtvZmZzZXRdLCBtYWNwLT5zdXBJZSwgbWFjcC0+c3VwSWVbMV0rMik7CisgICAgICAgIG9mZnNldCArPSAobWFjcC0+c3VwSWVbMV0rMik7CisgICAgfQorCisgICAgcmV0dXJuIG9mZnNldDsKK30KKworLyogTGVhdmUgYW4gZW1wdHkgbGluZSBiZWxvdyB0byByZW1vdmUgd2FybmluZyBtZXNzYWdlIG9uIHNvbWUgY29tcGlsZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX3VzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNzZlNTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX3VzYi5jCkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kdWxlIE5hbWUgOiB3cmFwX3VzYi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBYnN0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgd3JhcHBlciBmdW5jdGlvbnMgZm9yIFVTQiBtYW5hZ2VtZW50ICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOT1RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgUGxhdGZvcm0gZGVwZW5kZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJvYWxfZHQuaCIKKyNpbmNsdWRlICJ1c2JkcnYuaCIKKworI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKworI2lmIFdJUkVMRVNTX0VYVCA+IDEyCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KKyNlbmRpZgorCitleHRlcm4gdm9pZCB6ZkxueEluaXRVc2JUeFEoemRldl90KiBkZXYpOworZXh0ZXJuIHZvaWQgemZMbnhJbml0VXNiUnhRKHpkZXZfdCogZGV2KTsKK2V4dGVybiB1MzJfdCB6ZkxueFN1Ym1pdFJlZ0luVXJiKHpkZXZfdCAqZGV2KTsKK3UzMl90IHpmTG54VXNiT3V0KHpkZXZfdCogZGV2LCB1OF90ICpoZHIsIHUxNl90IGhkcmxlbiwgdThfdCAqc25hcCwgdTE2X3Qgc25hcExlbiwKKyAgICAgICAgdThfdCAqdGFpbCwgdTE2X3QgdGFpbExlbiwgemJ1Zl90ICpidWYsIHUxNl90IG9mZnNldCk7Cit1MzJfdCB6ZkxueFVzYldyaXRlUmVnKHpkZXZfdCogZGV2LCB1MzJfdCogY21kLCB1MTZfdCBjbWRMZW4pOworCit2b2lkIHpmd1VzYlJlZ2lzdGVyQ2FsbEJhY2soemRldl90KiBkZXYsIHN0cnVjdCB6ZkNiVXNiRnVuY1RibCAqemZVc2JGdW5jKSB7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgbWFjcC0+dXNiQ2JGdW5jdGlvbnMuemZjYlVzYlJlY3YgPSB6ZlVzYkZ1bmMtPnpmY2JVc2JSZWN2OworICAgIG1hY3AtPnVzYkNiRnVuY3Rpb25zLnpmY2JVc2JSZWdJbiA9IHpmVXNiRnVuYy0+emZjYlVzYlJlZ0luOworICAgIG1hY3AtPnVzYkNiRnVuY3Rpb25zLnpmY2JVc2JPdXRDb21wbGV0ZSA9IHpmVXNiRnVuYy0+emZjYlVzYk91dENvbXBsZXRlOworCisgICAgcmV0dXJuOworfQorCit1MzJfdCB6ZndVc2JHZXRGcmVlVHhRU2l6ZSh6ZGV2X3QqIGRldikKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgdTMyX3QgICAgICAgIGZyZWVUeFFTaXplOworICAgIHVuc2lnbmVkIGxvbmcgaXJxRmxhZzsKKyAgICAvL3ptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CisKKyAgICAvL3ptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworCisgICAgZnJlZVR4UVNpemUgPSBaTV9NQVhfVFhfQlVGX05VTSAtIG1hY3AtPlR4QnVmQ250OworCisgICAgLy96bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworCisgICAgcmV0dXJuIGZyZWVUeFFTaXplOworfQorCit1MzJfdCB6ZndVc2JHZXRNYXhUeFFTaXplKHpkZXZfdCogZGV2KQoreworICAgIHJldHVybiBaTV9NQVhfVFhfQlVGX05VTTsKK30KKwordTMyX3QgemZ3VXNiRW5hYmxlSW50RXB0KHpkZXZfdCAqZGV2LCB1OF90IGVuZHB0KQoreworICAgIC8qIEluaXRpYWxpemUgVVNCIFR4USAqLworICAgIHpmTG54SW5pdFVzYlR4UShkZXYpOworCisgICAgLyogSW5pdGlhbGl6ZSBVU0IgUnhRICovCisgICAgemZMbnhJbml0VXNiUnhRKGRldik7CisKKyAgICAvKiBJbml0aWFsaXplIFVTQiBSZWdpc3RlciBJbiBVUkIgKi8KKyAgICAvL3pmd1VzYlN1Ym1pdFJlZ0luKGRldik7CisgICAgLyogSW5pdGlhbGl6ZSBVU0IgUmVnaXN0ZXIgSW4gVVJCICovCisgICAgemZMbnhTdWJtaXRSZWdJblVyYihkZXYpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB6ZndVc2JFbmFibGVSeEVwdCh6ZGV2X3QqIGRldiwgdThfdCBlbmRwdCkKK3sKKyAgICByZXR1cm4gMDsKK30KKwordTMyX3QgemZ3VXNiU3VibWl0Q29udHJvbCh6ZGV2X3QqIGRldiwgdThfdCByZXEsIHUxNl90IHZhbHVlLCB1MTZfdCBpbmRleCwgdm9pZCAqZGF0YSwgdTMyX3Qgc2l6ZSkKK3sKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICB1MzJfdCByZXQgPSAwOworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICB1OF90KiBidWY7CisKKyAgICBpZiAoc2l6ZSA+IDApCisgICAgeworICAgICAgICBidWYgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworICAgICAgICBtZW1jcHkoYnVmLCAodThfdCopZGF0YSwgc2l6ZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJ1ZiA9IE5VTEw7CisgICAgfQorCisjaWYgMAorICAgIHByaW50ayhLRVJOX0VSUiAicmVxID0gMHglMDJ4XG4iLCByZXEpOworICAgIHByaW50ayhLRVJOX0VSUiAidmFsdWUgPSAweCUwNHhcbiIsIHZhbHVlKTsKKyAgICBwcmludGsoS0VSTl9FUlIgImluZGV4ID0gMHglMDR4XG4iLCBpbmRleCk7CisgICAgcHJpbnRrKEtFUk5fRVJSICJkYXRhID0gMHglbHhcbiIsICh1MzJfdCkgZGF0YSk7CisgICAgcHJpbnRrKEtFUk5fRVJSICJzaXplID0gJWxkXG4iLCBzaXplKTsKKyNlbmRpZgorCisgICAgcmVzdWx0ID0gdXNiX2NvbnRyb2xfbXNnKG1hY3AtPnVkZXYsIHVzYl9zbmRjdHJscGlwZShtYWNwLT51ZGV2LCAwKSwKKyAgICAgICAgICAgIHJlcSwgVVNCX0RJUl9PVVQgfCAweDQwLCB2YWx1ZSwgaW5kZXgsIGJ1Ziwgc2l6ZSwgSFopOworCisgICAgaWYgKHJlc3VsdCA8IDApCisgICAgeworICAgICAgICBwcmludGsoInpmd1VzYlN1Ym1pdENvbnRyb2woKSBmYWlsZWQsIHJlc3VsdD0weCV4XG4iLCByZXN1bHQpOworICAgICAgICByZXQgPSAxOworICAgIH0KKyAgICBrZnJlZShidWYpOworCisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCB6ZndVc2JDbWQoemRldl90KiBkZXYsIHU4X3QgZW5kcHQsIHUzMl90KiBjbWQsIHUxNl90IGNtZExlbikKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgdTMyX3QgcmV0OworCisgICAgLy9NUFVzYkNvbW1hbmQoZGV2LCBlbmRwdCwgY21kLCBjbWRMZW4pOworICAgIHJldCA9IHpmTG54VXNiV3JpdGVSZWcoZGV2LCBjbWQsIGNtZExlbik7CisKKyAgICAvKiBpZiB6ZkxueFVzYldyaXRlUmVnKCkgcmV0dXJuIGVycm9yLCBmcmVlIGFuZCBhbGxvY2F0ZSB1cmIsIHJlc2VuZCBhZ2FpbiAqLworICAgIGlmIChyZXQgIT0gMCkKKyAgICB7CisgICAgICAgIHVzYl9mcmVlX3VyYihtYWNwLT5SZWdPdXRVcmIpOworICAgICAgICBtYWNwLT5SZWdPdXRVcmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOworICAgICAgICByZXQgPSB6ZkxueFVzYldyaXRlUmVnKGRldiwgY21kLCBjbWRMZW4pOworICAgIH0KK30KKwordTMyX3QgemZ3VXNiU2VuZCh6ZGV2X3QqIGRldiwgdThfdCBlbmRwdCwgdThfdCAqaGRyLCB1MTZfdCBoZHJsZW4sIHU4X3QgKnNuYXAsIHUxNl90IHNuYXBMZW4sCisgICAgICAgICAgICAgICAgdThfdCAqdGFpbCwgdTE2X3QgdGFpbExlbiwgemJ1Zl90ICpidWYsIHUxNl90IG9mZnNldCkKK3sKKyAgICB1MzJfdCBzdGF0dXM7CisKKyNpZmRlZiBaTV9DT05GSUdfQklHX0VORElBTgorICAgIHUzMl90IGlpID0gMDsKKyAgICB1MTZfdCAqcGMgPSBOVUxMOworCisgICAgcGMgPSAodTE2X3QgKiloZHI7CisgICAgZm9yKGlpPTA7IGlpPChoZHJsZW4+PjEpOyBpaSsrKQorICAgIHsKKyAgICAgICAgcGNbaWldID0gY3B1X3RvX2xlMTYocGNbaWldKTsKKyAgICB9CisKKyAgICBwYyA9ICh1MTZfdCAqKXNuYXA7CisgICAgZm9yKGlpPTA7IGlpPChzbmFwTGVuPj4xKTsgaWkrKykKKyAgICB7CisgICAgICAgIHBjW2lpXSA9IGNwdV90b19sZTE2KHBjW2lpXSk7CisgICAgfQorCisgICAgcGMgPSAodTE2X3QgKil0YWlsOworICAgIGZvcihpaT0wOyBpaTwodGFpbExlbj4+MSk7IGlpKyspCisgICAgeworICAgICAgICBwY1tpaV0gPSBjcHVfdG9fbGUxNihwY1tpaV0pOworICAgIH0KKyNlbmRpZgorCisgICAgc3RhdHVzID0gemZMbnhVc2JPdXQoZGV2LCBoZHIsIGhkcmxlbiwgc25hcCwgc25hcExlbiwgdGFpbCwgdGFpbExlbiwgYnVmLCBvZmZzZXQpOworICAgIGlmICggc3RhdHVzID09IDAgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KK30KKworLyogTGVhdmUgYW4gZW1wdHkgbGluZSBiZWxvdyB0byByZW1vdmUgd2FybmluZyBtZXNzYWdlIG9uIHNvbWUgY29tcGlsZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3d3cmFwLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93d3JhcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYjVmNTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93d3JhcC5jCkBAIC0wLDAgKzEsMTEzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgTW9kdWxlIE5hbWUgOiB3d3JhcC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgd3JhcHBlciBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgUGxhdGZvcm0gZGVwZW5kZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBQbGVhc2UgaW5jbHVkZSB5b3VyIGhlYWRlciBmaWxlcyBoZXJlICovCisjaW5jbHVkZSAib2FsX2R0LmgiCisjaW5jbHVkZSAidXNiZHJ2LmgiCisKKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisKKyNpZiBXSVJFTEVTU19FWFQgPiAxMgorI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CisjZW5kaWYKKworZXh0ZXJuIHZvaWQgemZpUmVjdjgwMjExKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBhZGRJbmZvKTsKK2V4dGVybiB2b2lkIHpmQ29yZVJlY3YoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCBzdHJ1Y3QgenNBZGRpdGlvbkluZm8qIGFkZEluZm8pOworZXh0ZXJuIHZvaWQgemZJZGxDaGtSc3AoemRldl90KiBkZXYsIHUzMl90KiByc3AsIHUxNl90IHJzcExlbik7CitleHRlcm4gdm9pZCB6ZklkbFJzcCh6ZGV2X3QqIGRldiwgdTMyX3QgKnJzcCwgdTE2X3QgcnNwTGVuKTsKKworCisKKy8vZXh0ZXJuIHN0cnVjdCB6c1dkc1N0cnVjdCB3ZHNbWk1fV0RTX1BPUlRfTlVNQkVSXTsKK2V4dGVybiBzdHJ1Y3QgenNWYXBTdHJ1Y3QgdmFwW1pNX1ZBUF9QT1JUX05VTUJFUl07CisKK3UzMl90IHpmTG54VXNiU3VibWl0VHhEYXRhKHpkZXZfdCogZGV2KTsKK3UzMl90IHpmTG54VXNiSW4oemRldl90KiBkZXYsIHVyYl90ICp1cmIsIHpidWZfdCAqYnVmKTsKK3UzMl90IHpmTG54U3VibWl0UmVnSW5VcmIoemRldl90ICpkZXYpOwordTMyX3QgemZMbnhVc2JTdWJtaXRCdWxrVXJiKHVyYl90ICp1cmIsIHN0cnVjdCB1c2JfZGV2aWNlICp1c2IsIHUxNl90IGVwbnVtLCB1MTZfdCBkaXJlY3Rpb24sCisgICAgICAgIHZvaWQgKnRyYW5zZmVyX2J1ZmZlciwgaW50IGJ1ZmZlcl9sZW5ndGgsIHVzYl9jb21wbGV0ZV90IGNvbXBsZXRlLCB2b2lkICpjb250ZXh0KTsKK3UzMl90IHpmTG54VXNiU3VibWl0SW50VXJiKHVyYl90ICp1cmIsIHN0cnVjdCB1c2JfZGV2aWNlICp1c2IsIHUxNl90IGVwbnVtLCB1MTZfdCBkaXJlY3Rpb24sCisgICAgICAgIHZvaWQgKnRyYW5zZmVyX2J1ZmZlciwgaW50IGJ1ZmZlcl9sZW5ndGgsIHVzYl9jb21wbGV0ZV90IGNvbXBsZXRlLCB2b2lkICpjb250ZXh0LAorICAgICAgICB1MzJfdCBpbnRlcnZhbCk7CisKK3UxNl90IHpmTG54R2V0RnJlZVR4VXJiKHpkZXZfdCAqZGV2KQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICB1MTZfdCBpZHg7CisgICAgdW5zaWduZWQgbG9uZyBpcnFGbGFnOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworCisgICAgLy9pZHggPSAoKG1hY3AtPlR4VXJiVGFpbCArIDEpICYgKFpNX01BWF9UWF9VUkJfTlVNIC0gMSkpOworCisgICAgLy9pZiAoaWR4ICE9IG1hY3AtPlR4VXJiSGVhZCkKKyAgICBpZiAobWFjcC0+VHhVcmJDbnQgIT0gMCkKKyAgICB7CisgICAgICAgIGlkeCA9IG1hY3AtPlR4VXJiVGFpbDsKKyAgICAgICAgbWFjcC0+VHhVcmJUYWlsID0gKChtYWNwLT5UeFVyYlRhaWwgKyAxKSAmIChaTV9NQVhfVFhfVVJCX05VTSAtIDEpKTsKKyAgICAgICAgbWFjcC0+VHhVcmJDbnQtLTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy9wcmludGsoS0VSTl9FUlIgIm1hY3AtPlR4VXJiQ250OiAlZFxuIiwgbWFjcC0+VHhVcmJDbnQpOworICAgICAgICBpZHggPSAweGZmZmY7CisgICAgfQorCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CisgICAgcmV0dXJuIGlkeDsKK30KKwordm9pZCB6ZkxueFB1dFR4VXJiKHpkZXZfdCAqZGV2KQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICB1MTZfdCBpZHg7CisgICAgdW5zaWduZWQgbG9uZyBpcnFGbGFnOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworCisgICAgaWR4ID0gKChtYWNwLT5UeFVyYkhlYWQgKyAxKSAmIChaTV9NQVhfVFhfVVJCX05VTSAtIDEpKTsKKworICAgIC8vaWYgKGlkeCAhPSBtYWNwLT5UeFVyYlRhaWwpCisgICAgaWYgKG1hY3AtPlR4VXJiQ250IDwgWk1fTUFYX1RYX1VSQl9OVU0pCisgICAgeworICAgICAgICBtYWNwLT5UeFVyYkhlYWQgPSBpZHg7CisgICAgICAgIG1hY3AtPlR4VXJiQ250Kys7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHByaW50aygiVXNiVHhVcmJRIGluY29uc2lzdGVudDogVHhVcmJIZWFkOiAlZCwgVHhVcmJUYWlsOiAlZFxuIiwKKyAgICAgICAgICAgICAgICBtYWNwLT5UeFVyYkhlYWQsIG1hY3AtPlR4VXJiVGFpbCk7CisgICAgfQorCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7Cit9CisKK3UxNl90IHpmTG54Q2hlY2tUeEJ1ZmZlckNudCh6ZGV2X3QgKmRldikKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisgICAgdTE2X3QgVHhCdWZDbnQ7CisgICAgdW5zaWduZWQgbG9uZyBpcnFGbGFnOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworCisgICAgVHhCdWZDbnQgPSBtYWNwLT5UeEJ1ZkNudDsKKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworICAgIHJldHVybiBUeEJ1ZkNudDsKK30KKworVXNiVHhRX3QgKnpmTG54R2V0VXNiVHhCdWZmZXIoemRldl90ICpkZXYpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworICAgIHUxNl90IGlkeDsKKyAgICBVc2JUeFFfdCAqVHhROworICAgIHVuc2lnbmVkIGxvbmcgaXJxRmxhZzsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKKworICAgIGlkeCA9ICgobWFjcC0+VHhCdWZIZWFkKzEpICYgKFpNX01BWF9UWF9CVUZfTlVNIC0gMSkpOworCisgICAgLy9pZiAoaWR4ICE9IG1hY3AtPlR4QnVmVGFpbCkKKyAgICBpZiAobWFjcC0+VHhCdWZDbnQgPiAwKQorICAgIHsKKyAgICAgICAgLy9wcmludGsoIkNXWSAtIHpmd0dldFVzYlR4QnVmZmVyICxtYWNwLT5UeEJ1ZkNudCA9ICVkXG4iLCBtYWNwLT5UeEJ1ZkNudCk7CisgICAgICAgIFR4USA9IChVc2JUeFFfdCAqKSYobWFjcC0+VXNiVHhCdWZRW21hY3AtPlR4QnVmSGVhZF0pOworICAgICAgICBtYWNwLT5UeEJ1ZkhlYWQgPSAoKG1hY3AtPlR4QnVmSGVhZCsxKSAmIChaTV9NQVhfVFhfQlVGX05VTSAtIDEpKTsKKyAgICAgICAgbWFjcC0+VHhCdWZDbnQtLTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKG1hY3AtPlR4QnVmSGVhZCAhPSBtYWNwLT5UeEJ1ZlRhaWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiemZ3R2V0VXNiVHhCdWYgVXNiVHhCdWZRIGluY29uc2lzdGVudDogVHhCdWZIZWFkOiAlZCwgVHhCdWZUYWlsOiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgbWFjcC0+VHhCdWZIZWFkLCBtYWNwLT5UeEJ1ZlRhaWwpOworICAgICAgICB9CisKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworICAgIHJldHVybiBUeFE7Cit9CisKK3UxNl90IHpmTG54UHV0VXNiVHhCdWZmZXIoemRldl90ICpkZXYsIHU4X3QgKmhkciwgdTE2X3QgaGRybGVuLAorICAgICAgICB1OF90ICpzbmFwLCB1MTZfdCBzbmFwTGVuLCB1OF90ICp0YWlsLCB1MTZfdCB0YWlsTGVuLAorICAgICAgICB6YnVmX3QgKmJ1ZiwgdTE2X3Qgb2Zmc2V0KQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICB1MTZfdCBpZHg7CisgICAgVXNiVHhRX3QgKlR4UTsKKyAgICB1bnNpZ25lZCBsb25nIGlycUZsYWc7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CisKKyAgICBpZHggPSAoKG1hY3AtPlR4QnVmVGFpbCsxKSAmIChaTV9NQVhfVFhfQlVGX05VTSAtIDEpKTsKKworICAgIC8qIEZvciBUeCBkZWJ1ZyAqLworICAgIC8vem1fYXNzZXJ0KG1hY3AtPlR4QnVmQ250ID49IDApOyAvLyBkZWxldGVkIGJlY2F1c2Ugb2YgYWx3YXlzIHRydWUKKworICAgIC8vaWYgKGlkeCAhPSBtYWNwLT5UeEJ1ZkhlYWQpCisgICAgaWYgKG1hY3AtPlR4QnVmQ250IDwgWk1fTUFYX1RYX0JVRl9OVU0pCisgICAgeworICAgICAgICAvL3ByaW50aygiQ1dZIC0gemZ3UHV0VXNiVHhCdWZmZXIgLG1hY3AtPlR4QnVmQ250ID0gJWRcbiIsIG1hY3AtPlR4QnVmQ250KTsKKyAgICAgICAgVHhRID0gKFVzYlR4UV90ICopJihtYWNwLT5Vc2JUeEJ1ZlFbbWFjcC0+VHhCdWZUYWlsXSk7CisgICAgICAgIG1lbWNweShUeFEtPmhkciwgaGRyLCBoZHJsZW4pOworICAgICAgICBUeFEtPmhkcmxlbiA9IGhkcmxlbjsKKyAgICAgICAgbWVtY3B5KFR4US0+c25hcCwgc25hcCwgc25hcExlbik7CisgICAgICAgIFR4US0+c25hcExlbiA9IHNuYXBMZW47CisgICAgICAgIG1lbWNweShUeFEtPnRhaWwsIHRhaWwsIHRhaWxMZW4pOworICAgICAgICBUeFEtPnRhaWxMZW4gPSB0YWlsTGVuOworICAgICAgICBUeFEtPmJ1ZiA9IGJ1ZjsKKyAgICAgICAgVHhRLT5vZmZzZXQgPSBvZmZzZXQ7CisKKyAgICAgICAgbWFjcC0+VHhCdWZUYWlsID0gKChtYWNwLT5UeEJ1ZlRhaWwrMSkgJiAoWk1fTUFYX1RYX0JVRl9OVU0gLSAxKSk7CisgICAgICAgIG1hY3AtPlR4QnVmQ250Kys7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiAiemZMbnhQdXRVc2JUeEJ1ZmZlciBVc2JUeEJ1ZlEgaW5jb25zaXN0ZW50OiBUeEJ1ZkhlYWQ6ICVkLCBUeEJ1ZlRhaWw6ICVkLCBUeEJ1ZkNudDogJWRcbiIsCisgICAgICAgICAgICBtYWNwLT5UeEJ1ZkhlYWQsIG1hY3AtPlR4QnVmVGFpbCwgbWFjcC0+VHhCdWZDbnQpOworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKKyAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICB9CisKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKKyAgICByZXR1cm4gMDsKK30KKworemJ1Zl90ICp6ZkxueEdldFVzYlJ4QnVmZmVyKHpkZXZfdCAqZGV2KQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICAvL3UxNl90IGlkeDsKKyAgICB6YnVmX3QgKmJ1ZjsKKyAgICB1bnNpZ25lZCBsb25nIGlycUZsYWc7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CisKKyAgICAvL2lkeCA9ICgobWFjcC0+UnhCdWZIZWFkKzEpICYgKFpNX01BWF9SWF9VUkJfTlVNIC0gMSkpOworCisgICAgLy9pZiAoaWR4ICE9IG1hY3AtPlJ4QnVmVGFpbCkKKyAgICBpZiAobWFjcC0+UnhCdWZDbnQgIT0gMCkKKyAgICB7CisgICAgICAgIGJ1ZiA9IG1hY3AtPlVzYlJ4QnVmUVttYWNwLT5SeEJ1ZkhlYWRdOworICAgICAgICBtYWNwLT5SeEJ1ZkhlYWQgPSAoKG1hY3AtPlJ4QnVmSGVhZCsxKSAmIChaTV9NQVhfUlhfVVJCX05VTSAtIDEpKTsKKyAgICAgICAgbWFjcC0+UnhCdWZDbnQtLTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJSeEJ1ZlEgaW5jb25zaXN0ZW50OiBSeEJ1ZkhlYWQ6ICVkLCBSeEJ1ZlRhaWw6ICVkXG4iLAorICAgICAgICAgICAgICAgIG1hY3AtPlJ4QnVmSGVhZCwgbWFjcC0+UnhCdWZUYWlsKTsKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworICAgIHJldHVybiBidWY7Cit9CisKK3UzMl90IHpmTG54UHV0VXNiUnhCdWZmZXIoemRldl90ICpkZXYsIHpidWZfdCAqYnVmKQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICB1MTZfdCBpZHg7CisgICAgdW5zaWduZWQgbG9uZyBpcnFGbGFnOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworCisgICAgaWR4ID0gKChtYWNwLT5SeEJ1ZlRhaWwrMSkgJiAoWk1fTUFYX1JYX1VSQl9OVU0gLSAxKSk7CisKKyAgICAvL2lmIChpZHggIT0gbWFjcC0+UnhCdWZIZWFkKQorICAgIGlmIChtYWNwLT5SeEJ1ZkNudCAhPSBaTV9NQVhfUlhfVVJCX05VTSkKKyAgICB7CisgICAgICAgIG1hY3AtPlVzYlJ4QnVmUVttYWNwLT5SeEJ1ZlRhaWxdID0gYnVmOworICAgICAgICBtYWNwLT5SeEJ1ZlRhaWwgPSBpZHg7CisgICAgICAgIG1hY3AtPlJ4QnVmQ250Kys7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHByaW50aygiUnhCdWZRIGluY29uc2lzdGVudDogUnhCdWZIZWFkOiAlZCwgUnhCdWZUYWlsOiAlZFxuIiwKKyAgICAgICAgICAgICAgICBtYWNwLT5SeEJ1ZkhlYWQsIG1hY3AtPlJ4QnVmVGFpbCk7CisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworICAgICAgICByZXR1cm4gMHhmZmZmOworICAgIH0KKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworICAgIHJldHVybiAwOworfQorCit2b2lkIHpmTG54VXNiRGF0YU91dF9jYWxsYmFjayh1cmJfdCAqdXJiKQoreworICAgIHpkZXZfdCogZGV2ID0gdXJiLT5jb250ZXh0OworICAgIC8vVXNiVHhRX3QgKlR4RGF0YTsKKworICAgIC8qIEdpdmUgdGhlIHVyYiBiYWNrICovCisgICAgemZMbnhQdXRUeFVyYihkZXYpOworCisgICAgLyogQ2hlY2sgd2hldGhlciB0aGVyZSBpcyBhbnkgcGVuZGluZyBidWZmZXIgbmVlZGVkICovCisgICAgLyogdG8gYmUgc2VudCAqLworICAgIGlmICh6ZkxueENoZWNrVHhCdWZmZXJDbnQoZGV2KSAhPSAwKQorICAgIHsKKyAgICAgICAgLy9UeERhdGEgPSB6ZndHZXRVc2JUeEJ1ZmZlcihkZXYpOworCisgICAgICAgIC8vaWYgKFR4RGF0YSA9PSBOVUxMKQorICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgcHJpbnRrKCJHZXQgYSBOVUxMIGJ1ZmZlciBmcm9tIHpmd0dldFVzYlR4QnVmZmVyXG4iKTsKKyAgICAgICAgLy8gICAgcmV0dXJuOworICAgICAgICAvL30KKyAgICAgICAgLy9lbHNlCisgICAgICAgIC8veworICAgICAgICAgICAgemZMbnhVc2JTdWJtaXRUeERhdGEoZGV2KTsKKyAgICAgICAgLy99CisgICAgfQorfQorCit2b2lkIHpmTG54VXNiRGF0YUluX2NhbGxiYWNrKHVyYl90ICp1cmIpCit7CisgICAgemRldl90KiBkZXYgPSB1cmItPmNvbnRleHQ7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworICAgIHpidWZfdCAqYnVmOworICAgIHpidWZfdCAqbmV3X2J1ZjsKKyAgICBpbnQgc3RhdHVzOworCisjaWYgWk1fVVNCX1NUUkVBTV9NT0RFID09IDEKKyAgICBzdGF0aWMgaW50IHJlbWFpbl9sZW4gPSAwLCBjaGVja19wYWQgPSAwLCBjaGVja19sZW4gPSAwOworICAgIGludCBpbmRleCA9IDA7CisgICAgaW50IGNoa19pZHg7CisgICAgdTE2X3QgcGt0X2xlbjsKKyAgICB1MTZfdCBwa3RfdGFnOworICAgIHUxNl90IGlpOworICAgIHpidWZfdCAqcnhCdWZQb29sWzhdOworICAgIHUxNl90IHJ4QnVmUG9vbEluZGV4ID0gMDsKKyNlbmRpZgorCisgICAgLyogQ2hlY2sgc3RhdHVzIGZvciBVUkIgKi8KKyAgICBpZiAodXJiLT5zdGF0dXMgIT0gMCl7CisgICAgICAgIHByaW50aygiemZMbnhVc2JEYXRhSW5fY2FsbGJhY2soKSA6IHN0YXR1cz0weCV4XG4iLCB1cmItPnN0YXR1cyk7CisgICAgICAgIGlmICgodXJiLT5zdGF0dXMgIT0gLUVOT0VOVCkgJiYgKHVyYi0+c3RhdHVzICE9IC1FQ09OTlJFU0VUKQorICAgICAgICAgICAgJiYgKHVyYi0+c3RhdHVzICE9IC1FU0hVVERPV04pKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHVyYi0+c3RhdHVzID09IC1FUElQRSl7CisgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRrKEtFUk5fRVJSICJub256ZXJvIHJlYWQgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6IC1FUElQRSIpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAtMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodXJiLT5zdGF0dXMgPT0gLUVQUk9UTyl7CisgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRrKEtFUk5fRVJSICJub256ZXJvIHJlYWQgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6IC1FUFJPVE8iKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy9wcmludGsoS0VSTl9FUlIgInVyYi0+c3RhdHVzOiAweCUwOHhcbiIsIHVyYi0+c3RhdHVzKTsKKworICAgICAgICAvKiBEZXF1ZXVlIHNrYiBidWZmZXIgKi8KKyAgICAgICAgYnVmID0gemZMbnhHZXRVc2JSeEJ1ZmZlcihkZXYpOworICAgICAgICBkZXZfa2ZyZWVfc2tiX2FueShidWYpOworICAgICAgICAjaWYgMAorICAgICAgICAvKiBFbnF1ZXVlIHNrYiBidWZmZXIgKi8KKyAgICAgICAgemZMbnhQdXRVc2JSeEJ1ZmZlcihkZXYsIGJ1Zik7CisKKyAgICAgICAgLyogU3VibWl0IGEgUnggdXJiICovCisgICAgICAgIHpmTG54VXNiSW4oZGV2LCB1cmIsIGJ1Zik7CisgICAgICAgICNlbmRpZgorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA9PSAwKQorICAgIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJHZXQgYW4gVVJCIHdob3NlIGxlbmd0aCBpcyB6ZXJvIik7CisgICAgICAgIHN0YXR1cyA9IC0xOworICAgIH0KKworICAgIC8qIERlcXVldWUgc2tiIGJ1ZmZlciAqLworICAgIGJ1ZiA9IHpmTG54R2V0VXNiUnhCdWZmZXIoZGV2KTsKKworICAgIC8vemZ3QnVmU2V0U2l6ZShkZXYsIGJ1ZiwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKyNpZmRlZiBORVRfU0tCVUZGX0RBVEFfVVNFU19PRkZTRVQKKyAgICBidWYtPnRhaWwgPSAwOworICAgIGJ1Zi0+bGVuID0gMDsKKyNlbHNlCisgICAgYnVmLT50YWlsID0gYnVmLT5kYXRhOworICAgIGJ1Zi0+bGVuID0gMDsKKyNlbmRpZgorCisgICAgaWYgKChidWYtPnRhaWwgKyB1cmItPmFjdHVhbF9sZW5ndGgpID4gYnVmLT5lbmQpCisgICAgICAgIEJVRygpOworCisgICAgc2tiX3B1dChidWYsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisKKyNpZiBaTV9VU0JfU1RSRUFNX01PREUgPT0gMQorICAgIGlmIChyZW1haW5fbGVuICE9IDApCisgICAgeworICAgICAgICB6YnVmX3QgKnJlbWFpbl9idWYgPSBtYWNwLT5yZWFtaW5fYnVmOworCisgICAgICAgIGluZGV4ID0gcmVtYWluX2xlbjsKKyAgICAgICAgcmVtYWluX2xlbiAtPSBjaGVja19wYWQ7CisKKyAgICAgICAgLyogIENvcHkgZGF0YSAqLworICAgICAgICBtZW1jcHkoJihyZW1haW5fYnVmLT5kYXRhW2NoZWNrX2xlbl0pLCBidWYtPmRhdGEsIHJlbWFpbl9sZW4pOworICAgICAgICBjaGVja19sZW4gKz0gcmVtYWluX2xlbjsKKyAgICAgICAgcmVtYWluX2xlbiA9IDA7CisKKyAgICAgICAgcnhCdWZQb29sW3J4QnVmUG9vbEluZGV4KytdID0gcmVtYWluX2J1ZjsKKyAgICB9CisKKyAgICB3aGlsZShpbmRleCA8IHVyYi0+YWN0dWFsX2xlbmd0aCkKKyAgICB7CisgICAgICAgIHBrdF9sZW4gPSBidWYtPmRhdGFbaW5kZXhdICsgKGJ1Zi0+ZGF0YVtpbmRleCsxXSA8PCA4KTsKKyAgICAgICAgcGt0X3RhZyA9IGJ1Zi0+ZGF0YVtpbmRleCsyXSArIChidWYtPmRhdGFbaW5kZXgrM10gPDwgOCk7CisKKyAgICAgICAgaWYgKHBrdF90YWcgPT0gMHg0ZTAwKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcGFkX2xlbjsKKworICAgICAgICAgICAgLy9wcmludGsoIkdldCBhIHBhY2tldCwgaW5kZXg6ICVkLCBwa3RfbGVuOiAweCUwNHhcbiIsIGluZGV4LCBwa3RfbGVuKTsKKyAgICAgICAgICAgICNpZiAwCisgICAgICAgICAgICAvKiBEdW1wIGRhdGEgKi8KKyAgICAgICAgICAgIGZvciAoaWkgPSBpbmRleDsgaWkgPCBwa3RfbGVuKzQ7KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50aygiJTAyeCAiLCAoYnVmLT5kYXRhW2lpXSAmIDB4ZmYpKTsKKworICAgICAgICAgICAgICAgIGlmICgoKytpaSAlIDE2KSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBwcmludGsoIlxuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaW50aygiXG4iKTsKKyAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICBwYWRfbGVuID0gNCAtIChwa3RfbGVuICYgMHgzKTsKKworICAgICAgICAgICAgaWYocGFkX2xlbiA9PSA0KQorICAgICAgICAgICAgICAgIHBhZF9sZW4gPSAwOworCisgICAgICAgICAgICBjaGtfaWR4ID0gaW5kZXg7CisgICAgICAgICAgICBpbmRleCA9IGluZGV4ICsgNCArIHBrdF9sZW4gKyBwYWRfbGVuOworCisgICAgICAgICAgICBpZiAoaW5kZXggPiBaTV9NQVhfUlhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVtYWluX2xlbiA9IGluZGV4IC0gWk1fTUFYX1JYX0JVRkZFUl9TSVpFOyAvLyAtIHBhZF9sZW47CisgICAgICAgICAgICAgICAgY2hlY2tfbGVuID0gWk1fTUFYX1JYX0JVRkZFUl9TSVpFIC0gY2hrX2lkeCAtIDQ7CisgICAgICAgICAgICAgICAgY2hlY2tfcGFkID0gcGFkX2xlbjsKKworICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRlIGEgc2tiIGJ1ZmZlciAqLworICAgICAgICAgICAgICAgIC8vbmV3X2J1ZiA9IHpmd0J1ZkFsbG9jYXRlKGRldiwgWk1fTUFYX1JYX0JVRkZFUl9TSVpFKTsKKyAgICAgICAgICAgICAgICBuZXdfYnVmID0gZGV2X2FsbG9jX3NrYihaTV9NQVhfUlhfQlVGRkVSX1NJWkUpOworCisgICAgICAgICAgICAgICAgLyogU2V0IHNrYiBidWZmZXIgbGVuZ3RoICovCisgICAgICAgICAgICAjaWZkZWYgTkVUX1NLQlVGRl9EQVRBX1VTRVNfT0ZGU0VUCisgICAgICAgICAgICAgICAgbmV3X2J1Zi0+dGFpbCA9IDA7CisgICAgICAgICAgICAgICAgbmV3X2J1Zi0+bGVuID0gMDsKKyAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgbmV3X2J1Zi0+dGFpbCA9IG5ld19idWYtPmRhdGE7CisgICAgICAgICAgICAgICAgbmV3X2J1Zi0+bGVuID0gMDsKKyAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICAgICAgc2tiX3B1dChuZXdfYnVmLCBwa3RfbGVuKTsKKworICAgICAgICAgICAgICAgIC8qIENvcHkgdGhlIGJ1ZmZlciAqLworICAgICAgICAgICAgICAgIG1lbWNweShuZXdfYnVmLT5kYXRhLCAmKGJ1Zi0+ZGF0YVtjaGtfaWR4KzRdKSwgY2hlY2tfbGVuKTsKKworICAgICAgICAgICAgICAgIC8qIFJlY29yZCB0aGUgYnVmZmVyIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICBtYWNwLT5yZWFtaW5fYnVmID0gbmV3X2J1ZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgI2lmZGVmIFpNX0RPTlRfQ09QWV9SWF9CVUZGRVIKKyAgICAgICAgICAgICAgICBpZiAocnhCdWZQb29sSW5kZXggPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5ld19idWYgPSBza2JfY2xvbmUoYnVmLCBHRlBfQVRPTUlDKTsKKworICAgICAgICAgICAgICAgICAgICBuZXdfYnVmLT5kYXRhID0gJihidWYtPmRhdGFbY2hrX2lkeCs0XSk7CisgICAgICAgICAgICAgICAgICAgIG5ld19idWYtPmxlbiA9IHBrdF9sZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRlIGEgc2tiIGJ1ZmZlciAqLworICAgICAgICAgICAgICAgIG5ld19idWYgPSBkZXZfYWxsb2Nfc2tiKFpNX01BWF9SWF9CVUZGRVJfU0laRSk7CisKKyAgICAgICAgICAgICAgICAvKiBTZXQgc2tiIGJ1ZmZlciBsZW5ndGggKi8KKyAgICAgICAgICAgICNpZmRlZiBORVRfU0tCVUZGX0RBVEFfVVNFU19PRkZTRVQKKyAgICAgICAgICAgICAgICBuZXdfYnVmLT50YWlsID0gMDsKKyAgICAgICAgICAgICAgICBuZXdfYnVmLT5sZW4gPSAwOworICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICBuZXdfYnVmLT50YWlsID0gbmV3X2J1Zi0+ZGF0YTsKKyAgICAgICAgICAgICAgICBuZXdfYnVmLT5sZW4gPSAwOworICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgICAgICBza2JfcHV0KG5ld19idWYsIHBrdF9sZW4pOworCisgICAgICAgICAgICAgICAgLyogQ29weSB0aGUgYnVmZmVyICovCisgICAgICAgICAgICAgICAgbWVtY3B5KG5ld19idWYtPmRhdGEsICYoYnVmLT5kYXRhW2Noa19pZHgrNF0pLCBwa3RfbGVuKTsKKworICAgICAgICAjaWZkZWYgWk1fRE9OVF9DT1BZX1JYX0JVRkZFUgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgcnhCdWZQb29sW3J4QnVmUG9vbEluZGV4KytdID0gbmV3X2J1ZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgZmluZCB0YWcsIHBrdF9sZW46IDB4JTA0eCwgdGFnOiAweCUwNHhcbiIsIHBrdF9sZW4sIHBrdF90YWcpOworCisgICAgICAgICAgICAvKiBGcmVlIGJ1ZmZlciAqLworICAgICAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoYnVmKTsKKworICAgICAgICAgICAgLyogQWxsb2NhdGUgYSBza2IgYnVmZmVyICovCisgICAgICAgICAgICBuZXdfYnVmID0gZGV2X2FsbG9jX3NrYihaTV9NQVhfUlhfQlVGRkVSX1NJWkUpOworCisgICAgICAgICAgICAvKiBFbnF1ZXVlIHNrYiBidWZmZXIgKi8KKyAgICAgICAgICAgIHpmTG54UHV0VXNiUnhCdWZmZXIoZGV2LCBuZXdfYnVmKTsKKworICAgICAgICAgICAgLyogU3VibWl0IGEgUnggdXJiICovCisgICAgICAgICAgICB6ZkxueFVzYkluKGRldiwgdXJiLCBuZXdfYnVmKTsKKworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLyogRnJlZSBidWZmZXIgKi8KKyAgICBkZXZfa2ZyZWVfc2tiX2FueShidWYpOworI2VuZGlmCisKKyAgICAvKiBBbGxvY2F0ZSBhIHNrYiBidWZmZXIgKi8KKyAgICBuZXdfYnVmID0gZGV2X2FsbG9jX3NrYihaTV9NQVhfUlhfQlVGRkVSX1NJWkUpOworCisgICAgLyogRW5xdWV1ZSBza2IgYnVmZmVyICovCisgICAgemZMbnhQdXRVc2JSeEJ1ZmZlcihkZXYsIG5ld19idWYpOworCisgICAgLyogU3VibWl0IGEgUnggdXJiICovCisgICAgemZMbnhVc2JJbihkZXYsIHVyYiwgbmV3X2J1Zik7CisKKyNpZiBaTV9VU0JfU1RSRUFNX01PREUgPT0gMQorICAgIGZvcihpaSA9IDA7IGlpIDwgcnhCdWZQb29sSW5kZXg7IGlpKyspCisgICAgeworICAgICAgICBtYWNwLT51c2JDYkZ1bmN0aW9ucy56ZmNiVXNiUmVjdihkZXYsIHJ4QnVmUG9vbFtpaV0pOworICAgIH0KKyNlbHNlCisgICAgLyogcGFzcyBkYXRhIHRvIHVwcGVyIGxheWVyICovCisgICAgbWFjcC0+dXNiQ2JGdW5jdGlvbnMuemZjYlVzYlJlY3YoZGV2LCBidWYpOworI2VuZGlmCit9CisKK3ZvaWQgemZMbnhVc2JSZWdPdXRfY2FsbGJhY2sodXJiX3QgKnVyYikKK3sKKyAgICAvL2Rldl90KiBkZXYgPSB1cmItPmNvbnRleHQ7CisKKyAgICAvL3ByaW50ayhLRVJOX0VSUiAiemZ3VXNiUmVnT3V0X2NhbGxiYWNrXG4iKTsKK30KKwordm9pZCB6ZkxueFVzYlJlZ0luX2NhbGxiYWNrKHVyYl90ICp1cmIpCit7CisgICAgemRldl90KiBkZXYgPSB1cmItPmNvbnRleHQ7CisgICAgdTMyX3QgcnNwWzY0LzRdOworICAgIGludCBzdGF0dXM7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgLyogQ2hlY2sgc3RhdHVzIGZvciBVUkIgKi8KKyAgICBpZiAodXJiLT5zdGF0dXMgIT0gMCl7CisgICAgICAgIHByaW50aygiemZMbnhVc2JSZWdJbl9jYWxsYmFjaygpIDogc3RhdHVzPTB4JXhcbiIsIHVyYi0+c3RhdHVzKTsKKyAgICAgICAgaWYgKCh1cmItPnN0YXR1cyAhPSAtRU5PRU5UKSAmJiAodXJiLT5zdGF0dXMgIT0gLUVDT05OUkVTRVQpCisgICAgICAgICAgICAmJiAodXJiLT5zdGF0dXMgIT0gLUVTSFVURE9XTikpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodXJiLT5zdGF0dXMgPT0gLUVQSVBFKXsKKyAgICAgICAgICAgICAgICAgICAgLy9wcmludGsoS0VSTl9FUlIgIm5vbnplcm8gcmVhZCBidWxrIHN0YXR1cyByZWNlaXZlZDogLUVQSVBFIik7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IC0xOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh1cmItPnN0YXR1cyA9PSAtRVBST1RPKXsKKyAgICAgICAgICAgICAgICAgICAgLy9wcmludGsoS0VSTl9FUlIgIm5vbnplcm8gcmVhZCBidWxrIHN0YXR1cyByZWNlaXZlZDogLUVQUk9UTyIpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvL3ByaW50ayhLRVJOX0VSUiAidXJiLT5zdGF0dXM6IDB4JTA4eFxuIiwgdXJiLT5zdGF0dXMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA9PSAwKQorICAgIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJHZXQgYW4gVVJCIHdob3NlIGxlbmd0aCBpcyB6ZXJvIik7CisgICAgICAgIHN0YXR1cyA9IC0xOworICAgIH0KKworICAgIC8qIENvcHkgZGF0YSBpbnRvIHJlc3BvbmUgYnVmZmVyICovCisgICAgbWVtY3B5KHJzcCwgbWFjcC0+cmVnVXNiUmVhZEJ1ZiwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKworICAgIC8qIE5vdGlmeSB0byB1cHBlciBsYXllciAqLworICAgIC8vemZJZGxDaGtSc3AoZGV2LCByc3AsICh1MTZfdCl1cmItPmFjdHVhbF9sZW5ndGgpOworICAgIC8vemZpVXNiUmVnSW4oZGV2LCByc3AsICh1MTZfdCl1cmItPmFjdHVhbF9sZW5ndGgpOworICAgIG1hY3AtPnVzYkNiRnVuY3Rpb25zLnpmY2JVc2JSZWdJbihkZXYsIHJzcCwgKHUxNl90KXVyYi0+YWN0dWFsX2xlbmd0aCk7CisKKyAgICAvKiBJc3N1ZSBhbm90aGVyIFVTQiBJTiBVUkIgKi8KKyAgICB6ZkxueFN1Ym1pdFJlZ0luVXJiKGRldik7Cit9CisKK3UzMl90IHpmTG54U3VibWl0UmVnSW5VcmIoemRldl90ICpkZXYpCit7CisgICAgdTMyX3QgcmV0OworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKworICAgIC8qIFN1Ym1pdCBhIHJ4IHVyYiAqLworICAgIC8vcmV0ID0gemZMbnhVc2JTdWJtaXRCdWxrVXJiKG1hY3AtPlJlZ0luVXJiLCBtYWNwLT51ZGV2LAorICAgIC8vICAgICAgICBVU0JfUkVHX0lOX1BJUEUsIFVTQl9ESVJfSU4sIG1hY3AtPnJlZ1VzYlJlYWRCdWYsCisgICAgLy8gICAgICAgIFpNX1VTQl9SRUdfTUFYX0JVRl9TSVpFLCB6ZkxueFVzYlJlZ0luX2NhbGxiYWNrLCBkZXYpOworICAgIC8vQ1dZYW5nKC0pCisgICAgLy9pZiAocmV0ICE9IDApCisgICAgLy8gICAgcHJpbnRrKCJ6ZndVc2JTdWJtaXRCdWxrVXJiIGZhaWwsIHN0YXR1czogMHglMDh4XG4iLCAoaW50KXJldCk7CisKKyAgICByZXQgPSB6ZkxueFVzYlN1Ym1pdEludFVyYihtYWNwLT5SZWdJblVyYiwgbWFjcC0+dWRldiwKKyAgICAgICAgICAgIFVTQl9SRUdfSU5fUElQRSwgVVNCX0RJUl9JTiwgbWFjcC0+cmVnVXNiUmVhZEJ1ZiwKKyAgICAgICAgICAgIFpNX1VTQl9SRUdfTUFYX0JVRl9TSVpFLCB6ZkxueFVzYlJlZ0luX2NhbGxiYWNrLCBkZXYsIDEpOworCisgICAgcmV0dXJuIHJldDsKK30KKwordTMyX3QgemZMbnhVc2JTdWJtaXRUeERhdGEoemRldl90KiBkZXYpCit7CisgICAgdTMyX3QgaTsKKyAgICB1MzJfdCByZXQ7CisgICAgdTE2X3QgZnJlZVR4VXJiOworICAgIHU4X3QgKnB1VHhCdWYgPSBOVUxMOworICAgIFVzYlR4UV90ICpUeERhdGE7CisgICAgaW50IGxlbiA9IDA7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworI2lmIFpNX1VTQl9UWF9TVFJFQU1fTU9ERSA9PSAxCisgICAgdThfdCAgICAgICAgICAgICAgIGlpOworICAgIHUxNl90ICAgICAgICAgICAgICBvZmZzZXQgPSAwOworICAgIHUxNl90ICAgICAgICAgICAgICB1c2JUeEFnZ0NudDsKKyAgICB1MTZfdCAgICAgICAgICAgICAgKnBVc2JUeEhkcjsKKyAgICBVc2JUeFFfdCAgICAgICAgICAgKlR4UVBvb2xbWk1fTUFYX1RYX0FHR1JFR0FURV9OVU1dOworI2VuZGlmCisKKyAgICAvKiBGaXJzdCBjaGVjayB3aGV0aGVyIHRoZXJlIGlzIGEgZnJlZSBVUkIgKi8KKyAgICBmcmVlVHhVcmIgPSB6ZkxueEdldEZyZWVUeFVyYihkZXYpOworCisgICAgLyogSWYgdGhlcmUgaXMgbm8gYW55IGZyZWUgVHggVXJiICovCisgICAgaWYgKGZyZWVUeFVyYiA9PSAweGZmZmYpCisgICAgeworICAgICAgICAvL3ByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgZ2V0IGZyZWUgVHggVXJiXG4iKTsKKyAgICAgICAgLy9wcmludGsoIkNXWSAtIENhbid0IGdldCBmcmVlIFR4IFVyYlxuIik7CisgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgfQorCisjaWYgWk1fVVNCX1RYX1NUUkVBTV9NT0RFID09IDEKKyAgICB1c2JUeEFnZ0NudCA9IHpmTG54Q2hlY2tUeEJ1ZmZlckNudChkZXYpOworCisgICAgaWYgKHVzYlR4QWdnQ250ID49IFpNX01BWF9UWF9BR0dSRUdBVEVfTlVNKQorICAgIHsKKyAgICAgICB1c2JUeEFnZ0NudCA9IFpNX01BWF9UWF9BR0dSRUdBVEVfTlVNOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgIHVzYlR4QWdnQ250ID0gMTsKKyAgICB9CisKKyAgICAvL3ByaW50aygidXNiVHhBZ2dDbnQ6ICVkXG4iLCB1c2JUeEFnZ0NudCk7CisjZW5kaWYKKworI2lmIFpNX1VTQl9UWF9TVFJFQU1fTU9ERSA9PSAxCisgICAgZm9yKGlpID0gMDsgaWkgPCB1c2JUeEFnZ0NudDsgaWkrKykKKyAgICB7CisjZW5kaWYKKyAgICAvKiBEZXF1ZXVlIHRoZSBwYWNrZXQgZnJvbSBVc2JUeEJ1ZlEgKi8KKyAgICBUeERhdGEgPSB6ZkxueEdldFVzYlR4QnVmZmVyKGRldik7CisgICAgaWYgKFR4RGF0YSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgLyogR2l2ZSB0aGUgdXJiIGJhY2sgKi8KKyAgICAgICAgemZMbnhQdXRUeFVyYihkZXYpOworICAgICAgICByZXR1cm4gMHhmZmZmOworICAgIH0KKworICAgIC8qIFBvaW50IHRvIHRoZSBmcmVlVHhVcmIgYnVmZmVyICovCisgICAgcHVUeEJ1ZiA9IG1hY3AtPnR4VXNiQnVmW2ZyZWVUeFVyYl07CisKKyNpZiBaTV9VU0JfVFhfU1RSRUFNX01PREUgPT0gMQorICAgIHB1VHhCdWYgKz0gb2Zmc2V0OworICAgIHBVc2JUeEhkciA9ICh1MTZfdCAqKXB1VHhCdWY7CisKKyAgICAvKiBBZGQgdGhlIHBhY2tldCBsZW5ndGggYW5kIHRhZyBpbmZvcm1hdGlvbiAqLworICAgICpwVXNiVHhIZHIrKyA9IFR4RGF0YS0+aGRybGVuICsgVHhEYXRhLT5zbmFwTGVuICsKKyAgICAgICAgICAgICAoVHhEYXRhLT5idWYtPmxlbiAtIFR4RGF0YS0+b2Zmc2V0KSArICBUeERhdGEtPnRhaWxMZW47CisKKyAgICAqcFVzYlR4SGRyKysgPSAweDY5N2U7CisKKyAgICBwdVR4QnVmICs9IDQ7CisjZW5kaWYgLy8gI2lmZGVmIFpNX1VTQl9UWF9TVFJFQU1fTU9ERQorCisgICAgLyogQ29weSBXTEFOIGhlYWRlciBhbmQgcGFja2V0IGJ1ZmZlciBpbnRvIFVTQiBidWZmZXIgKi8KKyAgICBmb3IoaSA9IDA7IGkgPCBUeERhdGEtPmhkcmxlbjsgaSsrKQorICAgIHsKKyAgICAgICAgKnB1VHhCdWYrKyA9IFR4RGF0YS0+aGRyW2ldOworICAgIH0KKworICAgIC8qIENvcHkgU05BUCBoZWFkZXIgKi8KKyAgICBmb3IoaSA9IDA7IGkgPCBUeERhdGEtPnNuYXBMZW47IGkrKykKKyAgICB7CisgICAgICAgICpwdVR4QnVmKysgPSBUeERhdGEtPnNuYXBbaV07CisgICAgfQorCisgICAgLyogQ29weSBwYWNrZXQgYnVmZmVyICovCisgICAgZm9yKGkgPSAwOyBpIDwgVHhEYXRhLT5idWYtPmxlbiAtIFR4RGF0YS0+b2Zmc2V0OyBpKyspCisgICAgeworICAgIAkvLypwdVR4QnVmKysgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgVHhEYXRhLT5idWYsIGkpOworICAgIAkqcHVUeEJ1ZisrID0gKih1OF90KikoKHU4X3QqKVR4RGF0YS0+YnVmLT5kYXRhK2krVHhEYXRhLT5vZmZzZXQpOworICAgIH0KKworICAgIC8qIENvcHkgdGFpbCAqLworICAgIGZvcihpID0gMDsgaSA8IFR4RGF0YS0+dGFpbExlbjsgaSsrKQorICAgIHsKKyAgICAgICAgKnB1VHhCdWYrKyA9IFR4RGF0YS0+dGFpbFtpXTsKKyAgICB9CisKKyAgICBsZW4gPSBUeERhdGEtPmhkcmxlbitUeERhdGEtPnNuYXBMZW4rVHhEYXRhLT5idWYtPmxlbitUeERhdGEtPnRhaWxMZW4tVHhEYXRhLT5vZmZzZXQ7CisKKyAgICAjaWYgMAorICAgIGlmIChUeERhdGEtPmhkcmxlbiAhPSAwKQorICAgIHsKKyAgICAgICAgcHVUeEJ1ZiA9IG1hY3AtPnR4VXNiQnVmW2ZyZWVUeFVyYl07CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKCIlMDJ4ICIsIHB1VHhCdWZbaV0pOworICAgICAgICAgICAgaWYgKGkgJSAxNiA9PSAxNSkKKyAgICAgICAgICAgICAgICBwcmludGsoIlxuIik7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRrKCJcbiIpOworICAgIH0KKyAgICAjZW5kaWYKKyAgICAjaWYgMAorICAgIC8qIEZvciBkZWJ1ZyBwdXJwb3NlICovCisgICAgaWYoVHhEYXRhLT5oZHJbOV0gJiAweDQwKQorICAgIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIHUxNl90IGN0cmxMZW4gPSBUeERhdGEtPmhkclswXSArIChUeERhdGEtPmhkclsxXSA8PCA4KTsKKworICAgICAgICBpZiAoY3RybExlbiAhPSBsZW4gKyA0KQorICAgICAgICB7CisgICAgICAgIC8qIER1bXAgY29udHJvbCBzZXR0aW5nICovCisgICAgICAgIGZvcihpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIweCUwMnggIiwgVHhEYXRhLT5oZHJbaV0pOworICAgICAgICB9CisgICAgICAgIHByaW50ayhLRVJOX0VSUiAiXG4iKTsKKworICAgICAgICBwcmludGsoS0VSTl9FUlIgImN0ckxlbjogJWQsIGhkckxlbjogJWQsIHNuYXBMZW46ICVkXG4iLCBjdHJsTGVuLCBUeERhdGEtPmhkcmxlbiwgVHhEYXRhLT5zbmFwTGVuKTsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJidWZMZW46ICVkLCB0YWlsTGVuOiAlZCwgbGVuOiAlZFxuIiwgVHhEYXRhLT5idWYtPmxlbiwgVHhEYXRhLT50YWlsTGVuLCBsZW4pOworICAgICAgICB9CisgICAgfQorICAgICNlbmRpZgorCisjaWYgWk1fVVNCX1RYX1NUUkVBTV9NT0RFID09IDEKKyAgICAvLyBBZGQgdGhlIExlbmd0aCBhbmQgVGFnCisgICAgbGVuICs9IDQ7CisKKyAgICAvL3ByaW50aygiJWQgcGFja2V0LCBsZW5ndGg6ICVkXG4iLCBpaSsxLCBsZW4pOworCisgICAgaWYgKGlpIDwgKFpNX01BWF9UWF9BR0dSRUdBVEVfTlVNLTEpKQorICAgIHsKKyAgICAgICAgLyogUGFkIHRoZSBidWZmZXIgdG8gZmlybXdhcmUgZGVzY3JpcHRvciBib3VuZGFyeSAqLworICAgICAgICBvZmZzZXQgKz0gKCgobGVuLTEpIC8gNCkgKyAxKSAqIDQ7CisgICAgfQorCisgICAgaWYgKGlpID09IChaTV9NQVhfVFhfQUdHUkVHQVRFX05VTS0xKSkKKyAgICB7CisgICAgICAgIGxlbiArPSBvZmZzZXQ7CisgICAgfQorCisgICAgVHhRUG9vbFtpaV0gPSBUeERhdGE7CisKKyAgICAvL0RiZ1ByaW50KCIlZCBwYWNrZXQsIG9mZnNldDogJWRcbiIsIGlpKzEsIHBVc2JUeFRyYW5zZmVyLT5vZmZzZXQpOworCisgICAgLyogZnJlZSBwYWNrZXQgKi8KKyAgICAvL3pmQnVmRnJlZShkZXYsIHR4RGF0YS0+YnVmKTsKKyAgICB9CisjZW5kaWYKKyAgICAvL3ByaW50aygiQ1dZIC0gY2FsbCB6ZndVc2JTdWJtaXRCdWxrVXJiKCksIGxlbiA9IDB4JWRcbiIsIGxlbik7CisgICAgLyogU3VibWl0IGEgdHggdXJiICovCisgICAgcmV0ID0gemZMbnhVc2JTdWJtaXRCdWxrVXJiKG1hY3AtPldsYW5UeERhdGFVcmJbZnJlZVR4VXJiXSwgbWFjcC0+dWRldiwKKyAgICAgICAgICAgIFVTQl9XTEFOX1RYX1BJUEUsIFVTQl9ESVJfT1VULCBtYWNwLT50eFVzYkJ1ZltmcmVlVHhVcmJdLAorICAgICAgICAgICAgbGVuLCB6ZkxueFVzYkRhdGFPdXRfY2FsbGJhY2ssIGRldik7CisgICAgLy9DV1lhbmcoLSkKKyAgICAvL2lmIChyZXQgIT0gMCkKKyAgICAvLyAgICBwcmludGsoInpmd1VzYlN1Ym1pdEJ1bGtVcmIgZmFpbCwgc3RhdHVzOiAweCUwOHhcbiIsIChpbnQpcmV0KTsKKworICAgIC8qIGZyZWUgcGFja2V0ICovCisgICAgLy9kZXZfa2ZyZWVfc2tiX2FueShUeERhdGEtPmJ1Zik7CisjaWYgWk1fVVNCX1RYX1NUUkVBTV9NT0RFID09IDEKKyAgICBmb3IoaWkgPSAwOyBpaSA8IHVzYlR4QWdnQ250OyBpaSsrKQorICAgICAgICBtYWNwLT51c2JDYkZ1bmN0aW9ucy56ZmNiVXNiT3V0Q29tcGxldGUoZGV2LCBUeFFQb29sW2lpXS0+YnVmLCAxLCBUeFFQb29sW2lpXS0+aGRyKTsKKyNlbHNlCisgICAgbWFjcC0+dXNiQ2JGdW5jdGlvbnMuemZjYlVzYk91dENvbXBsZXRlKGRldiwgVHhEYXRhLT5idWYsIDEsIFR4RGF0YS0+aGRyKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIHJldDsKK30KKworCisKK3UzMl90IHpmTG54VXNiSW4oemRldl90KiBkZXYsIHVyYl90ICp1cmIsIHpidWZfdCAqYnVmKQoreworICAgIHUzMl90IHJldDsKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisKKyAgICAvKiBTdWJtaXQgYSByeCB1cmIgKi8KKyAgICByZXQgPSB6ZkxueFVzYlN1Ym1pdEJ1bGtVcmIodXJiLCBtYWNwLT51ZGV2LCBVU0JfV0xBTl9SWF9QSVBFLAorICAgICAgICAgICAgVVNCX0RJUl9JTiwgYnVmLT5kYXRhLCBaTV9NQVhfUlhfQlVGRkVSX1NJWkUsCisgICAgICAgICAgICB6ZkxueFVzYkRhdGFJbl9jYWxsYmFjaywgZGV2KTsKKyAgICAvL0NXWWFuZygtKQorICAgIC8vaWYgKHJldCAhPSAwKQorICAgIC8vICAgIHByaW50aygiemZ3VXNiU3VibWl0QnVsa1VyYiBmYWlsLCBzdGF0dXM6IDB4JTA4eFxuIiwgKGludClyZXQpOworCisgICAgcmV0dXJuIHJldDsKK30KKwordTMyX3QgemZMbnhVc2JXcml0ZVJlZyh6ZGV2X3QqIGRldiwgdTMyX3QqIGNtZCwgdTE2X3QgY21kTGVuKQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKyAgICB1MzJfdCByZXQ7CisKKyNpZmRlZiBaTV9DT05GSUdfQklHX0VORElBTgorICAgIGludCBpaSA9IDA7CisKKyAgICBmb3IoaWk9MDsgaWk8KGNtZExlbj4+Mik7IGlpKyspCisJY21kW2lpXSA9IGNwdV90b19sZTMyKGNtZFtpaV0pOworI2VuZGlmCisKKyAgICBtZW1jcHkobWFjcC0+cmVnVXNiV3JpdGVCdWYsIGNtZCwgY21kTGVuKTsKKworICAgIC8qIElzc3VlIGFuIFVTQiBPdXQgdHJhbnNmZXIgKi8KKyAgICAvKiBTdWJtaXQgYSB0eCB1cmIgKi8KKyAgICByZXQgPSB6ZkxueFVzYlN1Ym1pdEludFVyYihtYWNwLT5SZWdPdXRVcmIsIG1hY3AtPnVkZXYsCisgICAgICAgICAgICBVU0JfUkVHX09VVF9QSVBFLCBVU0JfRElSX09VVCwgbWFjcC0+cmVnVXNiV3JpdGVCdWYsCisgICAgICAgICAgICBjbWRMZW4sIHpmTG54VXNiUmVnT3V0X2NhbGxiYWNrLCBkZXYsIDEpOworCisgICAgcmV0dXJuIHJldDsKK30KKworCit1MzJfdCB6ZkxueFVzYk91dCh6ZGV2X3QqIGRldiwgdThfdCAqaGRyLCB1MTZfdCBoZHJsZW4sIHU4X3QgKnNuYXAsIHUxNl90IHNuYXBMZW4sCisgICAgICAgIHU4X3QgKnRhaWwsIHUxNl90IHRhaWxMZW4sIHpidWZfdCAqYnVmLCB1MTZfdCBvZmZzZXQpCit7CisgICAgdTMyX3QgcmV0OworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKworICAgIC8qIENoZWNrIGxlbmd0aCBvZiB0YWlsIGJ1ZmZlciAqLworICAgIC8vem1fYXNzZXJ0KCh0YWlsTGVuIDw9IDE2KSk7CisKKyAgICAvKiBFbnF1ZXVlIHRoZSBwYWNrZXQgaW50byBVc2JUeEJ1ZlEgKi8KKyAgICBpZiAoemZMbnhQdXRVc2JUeEJ1ZmZlcihkZXYsIGhkciwgaGRybGVuLCBzbmFwLCBzbmFwTGVuLCB0YWlsLCB0YWlsTGVuLCBidWYsIG9mZnNldCkgPT0gMHhmZmZmKQorICAgIHsKKyAgICAgICAgLyogZnJlZSBwYWNrZXQgKi8KKyAgICAgICAgLy9wcmludGsoIkNXWSAtIHpmd1B1dFVzYlR4QnVmZmVyIEVycm9yLCBmcmVlIHBhY2tldFxuIik7CisgICAgICAgIC8vZGV2X2tmcmVlX3NrYl9hbnkoYnVmKTsKKyAgICAgICAgbWFjcC0+dXNiQ2JGdW5jdGlvbnMuemZjYlVzYk91dENvbXBsZXRlKGRldiwgYnVmLCAwLCBoZHIpOworICAgICAgICByZXR1cm4gMHhmZmZmOworICAgIH0KKworICAgIC8vcmV0dXJuIDA7CisgICAgLy9wcmludGsoIkNXWSAtIGNhbGwgemZ3VXNiU3VibWl0VHhEYXRhKClcbiIpOworICAgIHJldCA9IHpmTG54VXNiU3VibWl0VHhEYXRhKGRldik7CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCB6ZkxueEluaXRVc2JUeFEoemRldl90KiBkZXYpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgcHJpbnRrKEtFUk5fRVJSICJ6ZndJbml0VXNiVHhRXG4iKTsKKworICAgIC8qIFplcm8gbWVtb3J5IGZvciBVc2JUeEJ1ZlEgKi8KKyAgICBtZW1zZXQobWFjcC0+VXNiVHhCdWZRLCAwLCBzaXplb2YoVXNiVHhRX3QpICogWk1fTUFYX1RYX1VSQl9OVU0pOworCisgICAgbWFjcC0+VHhCdWZIZWFkID0gMDsKKyAgICBtYWNwLT5UeEJ1ZlRhaWwgPSAwOworICAgIG1hY3AtPlR4VXJiSGVhZCA9IDA7CisgICAgbWFjcC0+VHhVcmJUYWlsID0gMDsKKyAgICBtYWNwLT5UeFVyYkNudCA9IFpNX01BWF9UWF9VUkJfTlVNOworfQorCit2b2lkIHpmTG54SW5pdFVzYlJ4USh6ZGV2X3QqIGRldikKK3sKKyAgICB1MTZfdCBpOworICAgIHpidWZfdCAqYnVmOworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKworICAgIC8qIFplcm8gbWVtb3J5IGZvciBVc2JSeEJ1ZlEgKi8KKyAgICBtZW1zZXQobWFjcC0+VXNiUnhCdWZRLCAwLCBzaXplb2YoemJ1Zl90ICopICogWk1fTUFYX1JYX1VSQl9OVU0pOworCisgICAgbWFjcC0+UnhCdWZIZWFkID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBaTV9NQVhfUlhfVVJCX05VTTsgaSsrKQorICAgIHsKKyAgICAgICAgLy9idWYgPSB6ZndCdWZBbGxvY2F0ZShkZXYsIFpNX01BWF9SWF9CVUZGRVJfU0laRSk7CisgICAgICAgIGJ1ZiA9IGRldl9hbGxvY19za2IoWk1fTUFYX1JYX0JVRkZFUl9TSVpFKTsKKyAgICAgICAgbWFjcC0+VXNiUnhCdWZRW2ldID0gYnVmOworICAgIH0KKworICAgIC8vbWFjcC0+UnhCdWZUYWlsID0gWk1fTUFYX1JYX1VSQl9OVU0gLSAxOworICAgIG1hY3AtPlJ4QnVmVGFpbCA9IDA7CisKKyAgICAvKiBTdWJtaXQgYWxsIFJ4IHVyYnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgWk1fTUFYX1JYX1VSQl9OVU07IGkrKykKKyAgICB7CisgICAgICAgIHpmTG54UHV0VXNiUnhCdWZmZXIoZGV2LCBtYWNwLT5Vc2JSeEJ1ZlFbaV0pOworICAgICAgICB6ZkxueFVzYkluKGRldiwgbWFjcC0+V2xhblJ4RGF0YVVyYltpXSwgbWFjcC0+VXNiUnhCdWZRW2ldKTsKKyAgICB9Cit9CisKKworCit1MzJfdCB6ZkxueFVzYlN1Ym1pdEJ1bGtVcmIodXJiX3QgKnVyYiwgc3RydWN0IHVzYl9kZXZpY2UgKnVzYiwgdTE2X3QgZXBudW0sIHUxNl90IGRpcmVjdGlvbiwKKyAgICAgICAgdm9pZCAqdHJhbnNmZXJfYnVmZmVyLCBpbnQgYnVmZmVyX2xlbmd0aCwgdXNiX2NvbXBsZXRlX3QgY29tcGxldGUsIHZvaWQgKmNvbnRleHQpCit7CisgICAgdTMyX3QgcmV0OworCisgICAgaWYoZGlyZWN0aW9uID09IFVTQl9ESVJfT1VUKQorICAgIHsKKyAgICAgICAgdXNiX2ZpbGxfYnVsa191cmIodXJiLCB1c2IsIHVzYl9zbmRidWxrcGlwZSh1c2IsIGVwbnVtKSwKKyAgICAgICAgICAgICAgICB0cmFuc2Zlcl9idWZmZXIsIGJ1ZmZlcl9sZW5ndGgsIGNvbXBsZXRlLCBjb250ZXh0KTsKKworICAgICAgICB1cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9aRVJPX1BBQ0tFVDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdXNiX2ZpbGxfYnVsa191cmIodXJiLCB1c2IsIHVzYl9yY3ZidWxrcGlwZSh1c2IsIGVwbnVtKSwKKyAgICAgICAgICAgICAgICB0cmFuc2Zlcl9idWZmZXIsIGJ1ZmZlcl9sZW5ndGgsIGNvbXBsZXRlLCBjb250ZXh0KTsKKyAgICB9CisKKyAgICBpZiAoZXBudW0gPT0gNCkKKyAgICB7CisgICAgICAgIGlmICh1cmItPmhjcHJpdikKKyAgICAgICAgeworICAgICAgICAgICAgLy9wcmludGsoIkNXWSAtIHVyYi0+aGNwcml2IHNldCBieSB1bmtub3duIHJlYXNvbiwgcmVzZXQgaXRcbiIpOworICAgICAgICAgICAgLy91cmItPmhjcHJpdiA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworICAgIGlmICgoZXBudW0gPT0gNCkgJiAocmV0ICE9IDApKQorICAgIHsKKyAgICAgICAgLy9wcmludGsoIkNXWSAtIHJldCA9ICV4XG4iLCByZXQpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCit1MzJfdCB6ZkxueFVzYlN1Ym1pdEludFVyYih1cmJfdCAqdXJiLCBzdHJ1Y3QgdXNiX2RldmljZSAqdXNiLCB1MTZfdCBlcG51bSwgdTE2X3QgZGlyZWN0aW9uLAorICAgICAgICB2b2lkICp0cmFuc2Zlcl9idWZmZXIsIGludCBidWZmZXJfbGVuZ3RoLCB1c2JfY29tcGxldGVfdCBjb21wbGV0ZSwgdm9pZCAqY29udGV4dCwKKyAgICAgICAgdTMyX3QgaW50ZXJ2YWwpCit7CisgICAgdTMyX3QgcmV0OworCisgICAgaWYoZGlyZWN0aW9uID09IFVTQl9ESVJfT1VUKQorICAgIHsKKyAgICAgICAgdXNiX2ZpbGxfaW50X3VyYih1cmIsIHVzYiwgdXNiX3NuZGJ1bGtwaXBlKHVzYiwgZXBudW0pLAorICAgICAgICAgICAgICAgIHRyYW5zZmVyX2J1ZmZlciwgYnVmZmVyX2xlbmd0aCwgY29tcGxldGUsIGNvbnRleHQsIGludGVydmFsKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdXNiX2ZpbGxfaW50X3VyYih1cmIsIHVzYiwgdXNiX3JjdmJ1bGtwaXBlKHVzYiwgZXBudW0pLAorICAgICAgICAgICAgICAgIHRyYW5zZmVyX2J1ZmZlciwgYnVmZmVyX2xlbmd0aCwgY29tcGxldGUsIGNvbnRleHQsIGludGVydmFsKTsKKyAgICB9CisKKyAgICByZXQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCisgICAgcmV0dXJuIHJldDsKK30KKworI2lmZGVmIFpNX0VOQUJMRV9DRU5DCitpbnQgemZMbnhDZW5jU2VuZE1zZyhzdHJ1Y3Qgc29jayAqbmV0bGlua19zaywgdV9pbnQ4X3QgKm1zZywgaW50IGxlbikKK3sKKyNkZWZpbmUgQ09NTVRZUEVfR1JPVVAgICA4CisjZGVmaW5lIFdBSV9LX01TRyAgICAgICAgMHgxMQorCisJaW50IHJldCA9IC0xOworCWludCBzaXplOworCXVuc2lnbmVkIGNoYXIgKm9sZF90YWlsOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IG5sbXNnaGRyICpubGg7CisJY2hhciAqcG9zID0gTlVMTDsKKworCXNpemUgPSBOTE1TR19TUEFDRShsZW4pOworCXNrYiA9IGFsbG9jX3NrYihzaXplLCBHRlBfQVRPTUlDKTsKKworCWlmKHNrYiA9PSBOVUxMKQorCXsKKwkJcHJpbnRrKCJkZXZfYWxsb2Nfc2tiIGZhaWx1cmUgXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCW9sZF90YWlsID0gc2tiLT50YWlsOworCisJLyrM7tC0yv2+3bGoz+C52NDFz6IqLworCW5saCA9IE5MTVNHX1BVVChza2IsIDAsIDAsIFdBSV9LX01TRywgc2l6ZS1zaXplb2YoKm5saCkpOworCXBvcyA9IE5MTVNHX0RBVEEobmxoKTsKKwltZW1zZXQocG9zLCAwLCBsZW4pOworCisJLyq0q8rktb3Tw7unv9W85LXEyv2+3SovCisJbWVtY3B5KHBvcywgbXNnLCAgbGVuKTsKKwkvKrzGy+O+rbn919a92rbUxuS687XEyv2+3cq1vMqzpLbIKi8KKwlubGgtPm5sbXNnX2xlbiA9IHNrYi0+dGFpbCAtIG9sZF90YWlsOworCU5FVExJTktfQ0Ioc2tiKS5kc3RfZ3JvdXAgPSBDT01NVFlQRV9HUk9VUDsKKwluZXRsaW5rX2Jyb2FkY2FzdChuZXRsaW5rX3NrLCBza2IsIDAsIENPTU1UWVBFX0dST1VQLCBHRlBfQVRPTUlDKTsKKwlyZXQgPSAwOworb3V0OgorCXJldHVybiByZXQ7CitubG1zZ19mYWlsdXJlOiAvKk5MTVNHX1BVVCDKp7Dco6zU8rO3z/rM173T19a7urTmKi8KKyAgCWlmKHNrYikKKyAgICAJCWtmcmVlX3NrYihza2IpOworCWdvdG8gb3V0OworCisjdW5kZWYgQ09NTVRZUEVfR1JPVVAKKyN1bmRlZiBXQUlfS19NU0cKK30KKyNlbmRpZiAvL1pNX0VOQUJMRV9DRU5DCisKKy8qIFNpbXBseSByZXR1cm4gMHhmZmZmIGlmIFZBUCBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkICovCit1MTZfdCB6ZkxueEdldFZhcElkKHpkZXZfdCogZGV2KQoreworICAgIHUxNl90IGk7CisKKyAgICBmb3IgKGk9MDsgaTxaTV9WQVBfUE9SVF9OVU1CRVI7IGkrKykKKyAgICB7CisgICAgICAgIGlmICh2YXBbaV0uZGV2ID09IGRldikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDB4ZmZmZjsKK30KKwordTMyX3QgemZ3UmVhZFJlZyh6ZGV2X3QqIGRldiwgdTMyX3Qgb2Zmc2V0KQoreworICAgIHJldHVybiAwOworfQorCisjaWZuZGVmIElOSVRfV09SSworI2RlZmluZSB3b3JrX3N0cnVjdCB0cV9zdHJ1Y3QKKworI2RlZmluZSBzY2hlZHVsZV93b3JrKGEpICBzY2hlZHVsZV90YXNrKGEpCisKKyNkZWZpbmUgZmx1c2hfc2NoZWR1bGVkX3dvcmsgIGZsdXNoX3NjaGVkdWxlZF90YXNrcworI2RlZmluZSBJTklUX1dPUksoX3dxLCBfcm91dGluZSwgX2RhdGEpICBJTklUX1RRVUVVRShfd3EsIF9yb3V0aW5lLCBfZGF0YSkKKyNkZWZpbmUgUFJFUEFSRV9XT1JLKF93cSwgX3JvdXRpbmUsIF9kYXRhKSAgUFJFUEFSRV9UUVVFVUUoX3dxLCBfcm91dGluZSwgX2RhdGEpCisjZW5kaWYKKworI2RlZmluZSBLRVZFTlRfV0FUQ0hET0cgICAgICAgIDB4MDAwMDAwMDEKKwordTMyX3Qgc21wX2tldmVudF9Mb2NrID0gMDsKKwordm9pZCBrZXZlbnQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9CisgICAgICAgICAgICAgICBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHVzYmRydl9wcml2YXRlLCBrZXZlbnQpOworICAgIHpkZXZfdCAqZGV2ID0gbWFjcC0+ZGV2aWNlOworCisgICAgaWYgKG1hY3AgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAodm9pZCAqKSZzbXBfa2V2ZW50X0xvY2spKQorICAgIHsKKyAgICAgICAgLy9zY2hlZHVsZV93b3JrKCZtYWNwLT5rZXZlbnQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZG93bigmbWFjcC0+aW9jdGxfc2VtKTsKKworICAgIGlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoS0VWRU5UX1dBVENIRE9HLCAmbWFjcC0+a2V2ZW50X2ZsYWdzKSkKKyAgICB7CisgICAgZXh0ZXJuIHUxNl90IHpmSHBTdGFydFJlY3YoemRldl90ICpkZXYpOworICAgICAgICAvL3pmaUh3V2F0Y2hEb2dSZWluaXQoZGV2KTsKKyAgICAgICAgcHJpbnRrKCgiXG4gKioqKioqKioqKioqIEh3IHdhdGNoRG9nIG9jY3VyISEgKioqKioqKioqKioqKiogXG4iKSk7CisgICAgICAgIHpmaVdsYW5TdXNwZW5kKGRldik7CisgICAgICAgIHpmaVdsYW5SZXN1bWUoZGV2LDApOworICAgICAgICB6ZkhwU3RhcnRSZWN2KGRldik7CisgICAgfQorCisgICAgY2xlYXJfYml0KDAsICh2b2lkICopJnNtcF9rZXZlbnRfTG9jayk7CisgICAgdXAoJm1hY3AtPmlvY3RsX3NlbSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgIHpmTG54Q3JlYXRlVGhyZWFkICAgICAgICAgICAgKi8KKy8qICAgICAgQ3JlYXRlIGEgVGhyZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYWx3YXlzIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgWXVhbi1HdSBXZWkgICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuMyAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4X3QgemZMbnhDcmVhdGVUaHJlYWQoemRldl90ICpkZXYpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgLyogQ3JlYXRlIE11dGV4IGFuZCBrZXZlbnRkICovCisgICAgSU5JVF9XT1JLKCZtYWNwLT5rZXZlbnQsIGtldmVudCk7CisgICAgaW5pdF9NVVRFWCgmbWFjcC0+aW9jdGxfc2VtKTsKKworICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICB6ZkxueFNpZ25hbFRocmVhZCAgICAgICAgICAgICovCisvKiAgICAgIFNpZ25hbCBUaHJlYWQgd2l0aCBGbGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBmbGFnIDogc2lnbmFsIHRocmVhZCBmbGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBZdWFuLUd1IFdlaSAgICAgICAgIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIElOQy4gICAgMjAwNy4zICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB6ZkxueFNpZ25hbFRocmVhZCh6ZGV2X3QgKmRldiwgaW50IGZsYWcpCit7CisgICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCisgICAgaWYgKG1hY3AgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHByaW50aygibWFjcCBpcyBOVUxMXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICgwICYmIG1hY3AtPmtldmVudF9yZWFkeSAhPSAxKQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJLZXZlbnQgbm90IHJlYWR5XG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNldF9iaXQoZmxhZywgJm1hY3AtPmtldmVudF9mbGFncyk7CisKKyAgICBpZiAoIXNjaGVkdWxlX3dvcmsoJm1hY3AtPmtldmVudCkpCisgICAgeworICAgICAgICAvL0ZhaWxzIGlzIE5vcm1hbAorICAgICAgICAvL3ByaW50ayhLRVJOX0VSUiAic2NoZWR1bGVfdGFzayBmYWlsZWQsIGZsYWcgPSAleFxuIiwgZmxhZyk7CisgICAgfQorfQorCisvKiBOb3RpZnkgd3JhcHBlciB0b2RvIHJlZG93bmxvYWQgZmlybXdhcmUgYW5kIHJlaW5pdCBwcm9jZWR1cmUgd2hlbiAqLworLyogaGFyZHdhcmUgd2F0Y2hkb2cgb2NjdXIgOiB6ZmlId1dhdGNoRG9nUmVpbml0KCkgKi8KK3ZvaWQgemZMbnhXYXRjaERvZ05vdGlmeSh6ZGV2X3QqIGRldikKK3sKKyAgICB6ZkxueFNpZ25hbFRocmVhZChkZXYsIEtFVkVOVF9XQVRDSERPRyk7Cit9CisKKy8qIFF1ZXJ5IER1cmFudGlvbiBvZiBBY3RpdmUgU2NhbiAqLwordm9pZCB6ZndHZXRBY3RpdmVTY2FuRHVyKHpkZXZfdCogZGV2LCB1OF90KiBEdXIpCit7CisgICAgKkR1ciA9IDMwOyAvLyBkZWZhdWx0IDMwIG1zCit9CisKK3ZvaWQgemZ3R2V0U2hvd1plcm9MZW5ndGhTU0lEKHpkZXZfdCogZGV2LCB1OF90KiBEdXIpCit7CisgICAgKkR1ciA9IDA7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3pkY29tcGF0LmggYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy96ZGNvbXBhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhY2Y0MDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy96ZGNvbXBhdC5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IHpkY29tcGF0LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBmdW5jdGlvbiBkZWZpbnRpb24gZm9yIGNvbXBhdGliaWxpdHkuICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQbGF0Zm9ybSBkZXBlbmRlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfWkRDT01QQVRfSAorI2RlZmluZSBfWkRDT01QQVRfSAorCisKKyNpZm5kZWYgREVDTEFSRV9UQVNLTEVUCisjZGVmaW5lIHRhc2tsZXRfc2NoZWR1bGUoYSkgICBzY2hlZHVsZV90YXNrKGEpCisjZW5kaWYKKworI3VuZGVmIG5ldGRldmljZV90Cit0eXBlZGVmIHN0cnVjdCBuZXRfZGV2aWNlIG5ldGRldmljZV90OworCisjaWZkZWYgV0lSRUxFU1NfRVhUCisjaWYgKFdJUkVMRVNTX0VYVCA8IDEzKQorc3RydWN0IGl3X3JlcXVlc3RfaW5mbworeworICAgICAgICBfX3UxNiAgICAgICAgICAgY21kOyAgICAgICAgICAgIC8qIFdpcmVsZXNzIEV4dGVuc2lvbiBjb21tYW5kICovCisgICAgICAgIF9fdTE2ICAgICAgICAgICBmbGFnczsgICAgICAgICAgLyogTW9yZSB0byBjb21lIDstKSAqLworfTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgSVJRX05PTkUKK3R5cGVkZWYgdm9pZCBpcnFyZXR1cm5fdDsKKyNkZWZpbmUgSVJRX05PTkUKKyNkZWZpbmUgSVJRX0hBTkRMRUQKKyNkZWZpbmUgSVJRX1JFVFZBTCh4KQorI2VuZGlmCisKKyNpZm5kZWYgaW5fYXRvbWljCisjZGVmaW5lIGluX2F0b21pYygpICAwCisjZW5kaWYKKworI2RlZmluZSBVU0JfUVVFVUVfQlVMSyAwCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy96ZHVzYi5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvemR1c2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGYxZDIyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvemR1c2IuYwpAQCAtMCwwICsxLDIzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4IEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZHVsZSBOYW1lIDogemR1c2IuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHBsdWcgYW5kIHBsYXkgaGFuZGxpbmcgZm9yIFVTQiBkZXZpY2UgZHJpdmVyKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIFBsYXRmb3JtIGRlcGVuZGVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgTU9EVkVSU0lPTlMKKyNpbmNsdWRlIDxsaW51eC9tb2R2ZXJzaW9ucy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKworI2luY2x1ZGUgInVzYmRydi5oIgorI2luY2x1ZGUgInpkdXNiLmgiCisKK2ludCB6ZkxueEFsbG9jQWxsVXJicyhzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3ApOwordm9pZCB6ZkxueEZyZWVBbGxVcmJzKHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCk7Cit2b2lkIHpmTG54VW5saW5rQWxsVXJicyhzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3ApOworCitNT0RVTEVfQVVUSE9SKCJBdGhlcm9zIENvbW11bmljYXRpb25zIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkF0aGVyb3MgODAyLjExbiBXaXJlbGVzcyBMQU4gYWRhcHRlciIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworCitzdGF0aWMgY29uc3QgY2hhciBkcml2ZXJfbmFtZVtdID0gIk90dXMiOworCisvKiB0YWJsZSBvZiBkZXZpY2VzIHRoYXQgd29yayB3aXRoIHRoaXMgZHJpdmVyICovCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgemQxMjIxX2lkcyBbXSA9IHsKKwl7IFVTQl9ERVZJQ0UoVkVORE9SX0FUSFIsIFBST0RVQ1RfQVI5MTcwKSB9LAorICAgICAgICB7IFVTQl9ERVZJQ0UoVkVORE9SX0RMSU5LLCBQUk9EVUNUX0RXQTE2MEEpIH0sCisJeyBVU0JfREVWSUNFKDB4MDg0NiwgMHg5MDEwKSB9LAorCXsgfQkJCQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCB6ZDEyMjFfaWRzKTsKKworZXh0ZXJuIHU4X3QgemZMbnhJbml0U2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwKTsKK2V4dGVybiBpbnQgdXNiZHJ2X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHU4X3QgemZMbnhDbGVhclN0cnVjdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IHpmV2RzQ2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IHpmVW5yZWdpc3Rlcldkc0RldihzdHJ1Y3QgbmV0X2RldmljZSogcGFyZW50RGV2LCB1MTZfdCB3ZHNJZCk7CitleHRlcm4gaW50IHpmTG54VmFwQ2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IHpmTG54VW5yZWdpc3RlclZhcERldihzdHJ1Y3QgbmV0X2RldmljZSogcGFyZW50RGV2LCB1MTZfdCB2YXBJZCk7CisKKy8qIFdEUyAqLworZXh0ZXJuIHN0cnVjdCB6c1dkc1N0cnVjdCB3ZHNbWk1fV0RTX1BPUlRfTlVNQkVSXTsKKworLyogVkFQICovCitleHRlcm4gc3RydWN0IHpzVmFwU3RydWN0IHZhcFtaTV9WQVBfUE9SVF9OVU1CRVJdOworCitzdGF0aWMgaW50IHpmTG54UHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSwKKwljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisgICAgc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKTsKKworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZXQgPSBOVUxMOworICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IE5VTEw7CisgICAgaW50IHZlbmRvcl9pZCwgcHJvZHVjdF9pZDsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKworICAgIHVzYl9nZXRfZGV2KGRldik7CisKKyAgICB2ZW5kb3JfaWQgPSBkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3I7CisgICAgcHJvZHVjdF9pZCA9IGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3Q7CisKKyNpZmRlZiBITUFDX0RFQlVHCisgICAgcHJpbnRrKEtFUk5fTk9USUNFICJ2ZW5kb3JfaWQgPSAlMDR4XG4iLCB2ZW5kb3JfaWQpOworICAgIHByaW50ayhLRVJOX05PVElDRSAicHJvZHVjdF9pZCA9ICUwNHhcbiIsIHByb2R1Y3RfaWQpOworCisgICAgaWYgKGRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpCisgICAgICAgIHByaW50ayhLRVJOX05PVElDRSAiVVNCIDIuMCBIb3N0XG4iKTsKKyAgICBlbHNlCisgICAgICAgIHByaW50ayhLRVJOX05PVElDRSAiVVNCIDEuMSBIb3N0XG4iKTsKKyNlbmRpZgorCisgICAgaWYgKCEobWFjcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSksIEdGUF9LRVJORUwpKSkKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiAib3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nIGRldmljZSBzdHJ1Y3R1cmVcbiIpOworICAgICAgICByZXN1bHQgPSAtRU5PTUVNOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgLyogWmVybyB0aGUgbWVtb3J5ICovCisgICAgbWVtc2V0KG1hY3AsIDAsIHNpemVvZihzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUpKTsKKworICAgIG5ldCA9IGFsbG9jX2V0aGVyZGV2KDApOworCisgICAgaWYgKG5ldCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ6ZkxueFByb2JlOiBOb3QgYWJsZSB0byBhbGxvYyBldGhlcmRldiBzdHJ1Y3RcbiIpOworICAgICAgICByZXN1bHQgPSAtRU5PTUVNOworICAgICAgICBnb3RvIGZhaWwxOworICAgIH0KKworICAgIHN0cmNweShuZXQtPm5hbWUsICJhdGglZCIpOworCisgICAgbmV0LT5tbF9wcml2ID0gbWFjcDsgICAvL2tlcm5lbCAyLjYKKyAgICBtYWNwLT51ZGV2ID0gZGV2OworICAgIG1hY3AtPmRldmljZSA9IG5ldDsKKworICAgIC8qIHNldCB1cCB0aGUgZW5kcG9pbnQgaW5mb3JtYXRpb24gKi8KKyAgICAvKiBjaGVjayBvdXQgdGhlIGVuZHBvaW50cyAqLworICAgIG1hY3AtPmludGVyZmFjZSA9IGludGVyZmFjZTsKKworICAgIC8vaW5pdF93YWl0cXVldWVfaGVhZCgmbWFjcC0+cmVnU2V0X3dhaXQpOworICAgIC8vaW5pdF93YWl0cXVldWVfaGVhZCgmbWFjcC0+aW9yd1JzcF93YWl0KTsKKyAgICAvL2luaXRfd2FpdHF1ZXVlX2hlYWQoJm1hY3AtPnRlcm1fd2FpdCk7CisKKyAgICBpZiAoIXpmTG54QWxsb2NBbGxVcmJzKG1hY3ApKQorICAgIHsKKyAgICAgICAgcmVzdWx0ID0gLUVOT01FTTsKKyAgICAgICAgZ290byBmYWlsMjsKKyAgICB9CisKKyAgICBpZiAoIXpmTG54SW5pdFNldHVwKG5ldCwgbWFjcCkpCisgICAgeworICAgICAgICByZXN1bHQgPSAtRUlPOworICAgICAgICBnb3RvIGZhaWwzOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgbWFjcCk7CisgICAgICAgIFNFVF9ORVRERVZfREVWKG5ldCwgJmludGVyZmFjZS0+ZGV2KTsKKworICAgICAgICBpZiAocmVnaXN0ZXJfbmV0ZGV2KG5ldCkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOworICAgICAgICAgICAgZ290byBmYWlsMzsKKyAgICAgICAgfQorICAgIH0KKworICAgIG5ldGlmX2NhcnJpZXJfb2ZmKG5ldCk7CisgICAgZ290byBkb25lOworCitmYWlsMzoKKyAgICB6ZkxueEZyZWVBbGxVcmJzKG1hY3ApOworZmFpbDI6CisgICAgZnJlZV9uZXRkZXYobmV0KTsgIC8va2VybmVsIDIuNgorZmFpbDE6CisgICAga2ZyZWUobWFjcCk7CisKK2ZhaWw6CisgICAgdXNiX3B1dF9kZXYoZGV2KTsKKyAgICBtYWNwID0gTlVMTDsKKworZG9uZToKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCB6ZkxueERpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKK3sKKyAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSAoc3RydWN0IHVzYmRydl9wcml2YXRlICopIHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKKworICAgIHByaW50ayhLRVJOX0RFQlVHICJ6ZkxueERpc2Nvbm5lY3RcbiIpOworCisgICAgaWYgKCFtYWNwKQorICAgIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJ1bnJlZ2lzdGVyaW5nIG5vbi1leGlzdGFudCBkZXZpY2VcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1hY3AtPmRyaXZlcl9pc29sYXRlZCkKKyAgICB7CisgICAgICAgIGlmIChtYWNwLT5kZXZpY2UtPmZsYWdzICYgSUZGX1VQKQorICAgICAgICAgICAgdXNiZHJ2X2Nsb3NlKG1hY3AtPmRldmljZSk7CisgICAgfQorCisjaWYgMAorICAgIC8qIENsb3NlIFdEUyAqLworICAgIC8vemZXZHNDbG9zZSh3ZHNbMF0uZGV2KTsKKyAgICAvKiBVbnJlZ2lzdGVyIFdEUyAqLworICAgIC8vemZVbnJlZ2lzdGVyV2RzRGV2KG1hY3AtPmRldmljZSwgMCk7CisKKyAgICAvKiBDbG9zZSBWQVAgKi8KKyAgICB6ZkxueFZhcENsb3NlKHZhcFswXS5kZXYpOworICAgIC8qIFVucmVnaXN0ZXIgVkFQICovCisgICAgemZMbnhVbnJlZ2lzdGVyVmFwRGV2KG1hY3AtPmRldmljZSwgMCk7CisjZW5kaWYKKworICAgIHpmTG54Q2xlYXJTdHJ1Y3RzKG1hY3AtPmRldmljZSk7CisKKyAgICB1bnJlZ2lzdGVyX25ldGRldihtYWNwLT5kZXZpY2UpOworCisgICAgdXNiX3B1dF9kZXYoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpKTsKKworICAgIC8vcHJpbnRrKEtFUk5fRVJSICIzLiB6ZkxueFVubGlua0FsbFVyYnNcbiIpOworICAgIC8vemZMbnhVbmxpbmtBbGxVcmJzKG1hY3ApOworCisgICAgLyogRnJlZSBuZXR3b3JrIGludGVyZmFjZSAqLworICAgIGZyZWVfbmV0ZGV2KG1hY3AtPmRldmljZSk7CisKKyAgICB6ZkxueEZyZWVBbGxVcmJzKG1hY3ApOworICAgIC8vemZMbnhDbGVhclN0cnVjdHMobWFjcC0+ZGV2aWNlKTsKKyAgICBrZnJlZShtYWNwKTsKKyAgICBtYWNwID0gTlVMTDsKKworICAgIHVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHpkMTIyMV9kcml2ZXIgPSB7CisJLm5hbWUgICAgICAgICA9IGRyaXZlcl9uYW1lLAorCS5wcm9iZSAgICAgICAgPSB6ZkxueFByb2JlLAorCS5kaXNjb25uZWN0ICAgPSB6ZkxueERpc2Nvbm5lY3QsCisJLmlkX3RhYmxlICAgICA9IHpkMTIyMV9pZHMsCit9OworCitpbnQgX19pbml0IHpmTG54SWluaXQodm9pZCkKK3sKKyAgICBwcmludGsoS0VSTl9OT1RJQ0UgIiVzIC0gdmVyc2lvbiAlc1xuIiwgIERSSVZFUl9OQU1FLCBWRVJTSU9OSUQpOworICAgIHJldHVybiB1c2JfcmVnaXN0ZXIoJnpkMTIyMV9kcml2ZXIpOworfQorCit2b2lkIF9fZXhpdCB6ZkxueEV4aXQodm9pZCkKK3sKKyAgICB1c2JfZGVyZWdpc3RlcigmemQxMjIxX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHpmTG54SWluaXQpOworbW9kdWxlX2V4aXQoemZMbnhFeGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3pkdXNiLmggYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy96ZHVzYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NmRjMjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy96ZHVzYi5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2R1bGUgTmFtZSA6IHpkdXNiLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFic3RyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBkZWZpbml0aW9ucyBmb3IgVVNCIGRldmljZSBkcml2ZXIgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5PVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBQbGF0Zm9ybSBkZXBlbmRlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfWkRVU0JfSAorI2RlZmluZSBfWkRVU0JfSAorCisjaWZuZGVmIERSSVZFUl9OQU1FCisjZGVmaW5lIERSSVZFUl9OQU1FICAgICAgICAgICAgICJhcnVzYiIKKyNlbmRpZgorCisjZGVmaW5lIFZFUlNJT05JRCAgICAgICAgICAgICAgICIwLjAuMC45OTkiCisKKy8qIERlZmluZSB0aGVzZSB2YWx1ZXMgdG8gbWF0Y2ggeW91ciBkZXZpY2UgKi8KKyNkZWZpbmUgVkVORE9SX0FUSFIgICAgICAgICAgICAgMHgwQ0YzICAvL0F0aGVyb3MKKyNkZWZpbmUgUFJPRFVDVF9BUjkxNzAgICAgICAgICAgMHg5MTcwCisKKyNkZWZpbmUgVkVORE9SX0RMSU5LICAgICAgICAgICAgMHgwN0QxICAvL0RsaW5rCisjZGVmaW5lIFBST0RVQ1RfRFdBMTYwQSAgICAgICAgIDB4M0MxMAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9wYW5lbC9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3BhbmVsL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRiMzBmMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9wYW5lbC9LY29uZmlnCkBAIC0wLDAgKzEsMjc4IEBACitjb25maWcgUEFORUwKKwl0cmlzdGF0ZSAiUGFyYWxsZWwgcG9ydCBMQ0QvS2V5cGFkIFBhbmVsIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQVJQT1JUCisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhbiBIRDQ0NzgwIG9yIEtTLTAwNzQgTENEIGNvbm5lY3RlZCB0byB5b3VyCisJICBwYXJhbGxlbCBwb3J0LiBUaGlzIGRyaXZlciBhbHNvIGZlYXR1cmVzIDQgYW5kIDYta2V5IGtleXBhZHMuIFRoZSBMQ0QKKwkgIGlzIGFjY2Vzc2libGUgdGhyb3VnaCB0aGUgL2Rldi9sY2QgY2hhciBkZXZpY2UgKDEwLCAxNTYpLCBhbmQgdGhlCisJICBrZXlwYWQgdGhyb3VnaCAvZGV2L2tleXBhZCAoMTAsIDE4NSkuIEJvdGggcmVxdWlyZSBtaXNjIGRldmljZSB0byBiZQorCSAgZW5hYmxlZC4gVGhpcyBjb2RlIGNhbiBlaXRoZXIgYmUgY29tcGlsZWQgYXMgYSBtb2R1bGUsIG9yIGxpbmtlZCBpbnRvCisJICB0aGUga2VybmVsIGFuZCBzdGFydGVkIGF0IGJvb3QuIElmIHlvdSBkb24ndCB1bmRlcnN0YW5kIHdoYXQgYWxsIHRoaXMKKwkgIGlzIGFib3V0LCBzYXkgTi4KKworY29uZmlnIFBBTkVMX1BBUlBPUlQKKwlpbnQgIkRlZmF1bHQgcGFyYWxsZWwgcG9ydCBudW1iZXIgKDA9TFBUMSkiCisJZGVwZW5kcyBvbiBQQU5FTAorCXJhbmdlIDAgMjU1CisJZGVmYXVsdCAiMCIKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHRoZSBpbmRleCBvZiB0aGUgcGFyYWxsZWwgcG9ydCB0aGUgcGFuZWwgaXMgY29ubmVjdGVkIHRvLiBPbmUKKwkgIGRyaXZlciBpbnN0YW5jZSBvbmx5IHN1cHBvcnRzIG9uZSBwYXJhbGxlbCBwb3J0LCBzbyBpZiB5b3VyIGtleXBhZAorCSAgYW5kIExDRCBhcmUgY29ubmVjdGVkIHRvIHR3byBzZXBhcmF0ZSBwb3J0cywgeW91IGhhdmUgdG8gc3RhcnQgdHdvCisJICBtb2R1bGVzIHdpdGggZGlmZmVyZW50IGFyZ3VtZW50cy4gTnVtYmVyaW5nIHN0YXJ0cyB3aXRoICcwJyBmb3IgTFBUMSwKKwkgIGFuZCBzbyBvbi4KKworY29uZmlnIFBBTkVMX1BST0ZJTEUKKwlpbnQgIkRlZmF1bHQgcGFuZWwgcHJvZmlsZSAoMC01LCAwPWN1c3RvbSkiCisJZGVwZW5kcyBvbiBQQU5FTAorCXJhbmdlIDAgNQorCWRlZmF1bHQgIjUiCisJLS0taGVscC0tLQorCSAgVG8gZWFzZSBjb25maWd1cmF0aW9uLCB0aGUgZHJpdmVyIHN1cHBvcnRzIGRpZmZlcmVudCBjb25maWd1cmF0aW9uCisJICBwcm9maWxlcyBmb3IgcGFzdCBhbmQgcmVjZW50IHdpcmluZ3MuIFRoZXNlIHByb2ZpbGVzIGNhbiBhbHNvIGJlCisJICB1c2VkIHRvIGRlZmluZSBhbiBhcHByb3hpbWF0aXZlIGNvbmZpZ3VyYXRpb24sIGNvbXBsZXRlZCBieSBhIGZldworCSAgb3RoZXIgb3B0aW9ucy4gSGVyZSBhcmUgdGhlIHByb2ZpbGVzIDoKKworCSAgICAwID0gY3VzdG9tIChzZWUgZnVydGhlcikKKwkgICAgMSA9IDJ4MTYgcGFyYWxsZWwgTENELCBvbGQga2V5cGFkCisJICAgIDIgPSAyeDE2IHNlcmlhbCBMQ0QgKEtTLTAwNzQpLCBuZXcga2V5cGFkCisJICAgIDMgPSAyeDE2IHBhcmFsbGVsIExDRCAoSGFudHJvbml4KSwgbm8ga2V5cGFkCisJICAgIDQgPSAyeDE2IHBhcmFsbGVsIExDRCAoTmV4Y29tIE5TQTEwNDUpIHdpdGggTmV4Y29tJ3Mga2V5cGFkCisJICAgIDUgPSAyeDQwIHBhcmFsbGVsIExDRCAob2xkIG9uZSksIHdpdGggb2xkIGtleXBhZAorCisJICBDdXN0b20gY29uZmlndXJhdGlvbnMgYWxsb3cgeW91IHRvIGRlZmluZSBob3cgeW91ciBkaXNwbGF5IGlzCisJICB3aXJlZCB0byB0aGUgcGFyYWxsZWwgcG9ydCwgYW5kIGhvdyBpdCB3b3Jrcy4gVGhpcyBpcyBvbmx5IGludGVuZGVkCisJICBmb3IgZXhwZXJ0cy4KKworY29uZmlnIFBBTkVMX0tFWVBBRAorCWRlcGVuZHMgb24gUEFORUwgJiYgUEFORUxfUFJPRklMRT0iMCIKKwlpbnQgIktleXBhZCB0eXBlICgwPW5vbmUsIDE9b2xkIDYga2V5cywgMj1uZXcgNiBrZXlzLCAzPU5leGNvbSA0IGtleXMpIgorCXJhbmdlIDAgNAorCWRlZmF1bHQgMAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZW5hYmxlcyBhbmQgY29uZmlndXJlcyBhIGtleXBhZCBjb25uZWN0ZWQgdG8gdGhlIHBhcmFsbGVsIHBvcnQuCisJICBUaGUga2V5cyB3aWxsIGJlIHJlYWQgZnJvbSBjaGFyYWN0ZXIgZGV2aWNlIDEwLDE4NS4gVmFsaWQgdmFsdWVzIGFyZSA6CisKKwkgICAgMCA6IGRvIG5vdCBlbmFibGUgdGhpcyBkcml2ZXIKKwkgICAgMSA6IG9sZCA2IGtleXMga2V5cGFkCisJICAgIDIgOiBuZXcgNiBrZXlzIGtleXBhZCwgYXMgdXNlZCBvbiB0aGUgc2VydmVyIGF0IHd3dy5hbnQtY29tcHV0aW5nLmNvbQorCSAgICAzIDogTmV4Y29tIE5TQTEwNDUncyA0IGtleXMga2V5cGFkCisKKwkgIE5ldyBwcm9maWxlcyBjYW4gYmUgZGVzY3JpYmVkIGluIHRoZSBkcml2ZXIgc291cmNlLiBUaGUgZHJpdmVyIGFsc28KKwkgIHN1cHBvcnRzIHNpbXVsdGFuZW91cyBrZXlzIHByZXNzZWQgd2hlbiB0aGUga2V5cGFkIHN1cHBvcnRzIHRoZW0uCisKK2NvbmZpZyBQQU5FTF9MQ0QKKwlkZXBlbmRzIG9uIFBBTkVMICYmIFBBTkVMX1BST0ZJTEU9IjAiCisJaW50ICJMQ0QgdHlwZSAoMD1ub25lLCAxPWN1c3RvbSwgMj1vbGQgLy8sIDM9a3MwMDc0LCA0PWhhbnRyb25peCwgNT1OZXhjb20pIgorCXJhbmdlIDAgNQorCWRlZmF1bHQgMAorCS0tLWhlbHAtLS0KKwkgICBUaGlzIGVuYWJsZXMgYW5kIGNvbmZpZ3VyZXMgYW4gTENEIGNvbm5lY3RlZCB0byB0aGUgcGFyYWxsZWwgcG9ydC4KKwkgICBUaGUgZHJpdmVyIGluY2x1ZGVzIGFuIGludGVycHJldGVyIGZvciBlc2NhcGUgY29kZXMgc3RhcnRpbmcgd2l0aAorCSAgICdcZVtMJyB3aGljaCBhcmUgc3BlY2lmaWMgdG8gdGhlIExDRCwgYW5kIGEgZmV3IEFOU0kgY29kZXMuIFRoZQorCSAgIGRyaXZlciB3aWxsIGJlIHJlZ2lzdGVyZWQgYXMgY2hhcmFjdGVyIGRldmljZSAxMCwxNTYsIHVzdWFsbHkKKwkgICB1bmRlciB0aGUgbmFtZSAnL2Rldi9sY2QnLiBUaGVyZSBhcmUgYSB0b3RhbCBvZiA2IHN1cHBvcnRlZCB0eXBlcyA6CisKKwkgICAgIDAgOiBkbyBub3QgZW5hYmxlIHRoZSBkcml2ZXIKKwkgICAgIDEgOiBjdXN0b20gY29uZmlndXJhdGlvbiBhbmQgd2lyaW5nIChzZWUgZnVydGhlcikKKwkgICAgIDIgOiAyeDE2ICYgMng0MCBwYXJhbGxlbCBMQ0QgKG9sZCB3aXJpbmcpCisJICAgICAzIDogMngxNiBzZXJpYWwgTENEIChLUy0wMDc0IGJhc2VkKQorCSAgICAgNCA6IDJ4MTYgcGFyYWxsZWwgTENEIChIYW50cm9uaXggd2lyaW5nKQorCSAgICAgNSA6IDJ4MTYgcGFyYWxsZWwgTENEIChOZXhjb20gd2lyaW5nKQorCisJICAgV2hlbiB0eXBlICcxJyBpcyBzcGVjaWZpZWQsIG90aGVyIG9wdGlvbnMgd2lsbCBhcHBlYXIgdG8gY29uZmlndXJlCisJICAgbW9yZSBwcmVjaXNlIGFzcGVjdHMgKHdpcmluZywgZGltZW5zaW9ucywgcHJvdG9jb2wsIC4uLikuIFBsZWFzZSBub3RlCisJICAgdGhhdCB0aG9zZSB2YWx1ZXMgY2hhbmdlZCBmcm9tIHRoZSAyLjQgZHJpdmVyIGZvciBiZXR0ZXIgY29uc2lzdGVuY3kuCisKK2NvbmZpZyBQQU5FTF9MQ0RfSEVJR0hUCisJZGVwZW5kcyBvbiBQQU5FTCAmJiBQQU5FTF9QUk9GSUxFPSIwIiAmJiBQQU5FTF9MQ0Q9IjEiCisJaW50ICJOdW1iZXIgb2YgbGluZXMgb24gdGhlIExDRCAoMS0yKSIKKwlyYW5nZSAxIDIKKwlkZWZhdWx0IDIKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHRoZSBudW1iZXIgb2YgdmlzaWJsZSBjaGFyYWN0ZXIgbGluZXMgb24gdGhlIExDRCBpbiBjdXN0b20gcHJvZmlsZS4KKwkgIEl0IGNhbiBlaXRoZXIgYmUgMSBvciAyLgorCitjb25maWcgUEFORUxfTENEX1dJRFRICisJZGVwZW5kcyBvbiBQQU5FTCAmJiBQQU5FTF9QUk9GSUxFPSIwIiAmJiBQQU5FTF9MQ0Q9IjEiCisJaW50ICJOdW1iZXIgb2YgY2hhcmFjdGVycyBwZXIgbGluZSBvbiB0aGUgTENEICgxLTQwKSIKKwlyYW5nZSAxIDQwCisJZGVmYXVsdCA0MAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHBlciBsaW5lIG9uIHRoZSBMQ0QgaW4gY3VzdG9tIHByb2ZpbGUuCisJICBDb21tb24gdmFsdWVzIGFyZSAxNiwyMCwyNCw0MC4KKworY29uZmlnIFBBTkVMX0xDRF9CV0lEVEgKKwlkZXBlbmRzIG9uIFBBTkVMICYmIFBBTkVMX1BST0ZJTEU9IjAiICYmIFBBTkVMX0xDRD0iMSIKKwlpbnQgIkludGVybmFsIExDRCBsaW5lIHdpZHRoICgxLTQwLCA0MCBieSBkZWZhdWx0KSIKKwlyYW5nZSAxIDQwCisJZGVmYXVsdCA0MAorCS0tLWhlbHAtLS0KKwkgIE1vc3QgTENEcyB1c2UgYSBzdGFuZGFyZCBjb250cm9sbGVyIHdoaWNoIHN1cHBvcnRzIGhhcmR3YXJlIGxpbmVzIG9mIDQwCisJICBjaGFyYWN0ZXJzLCBhbHRob3VnaCBzb21ldGltZXMgb25seSAxNiwgMjAgb3IgMjQgb2YgdGhlbSBhcmUgcmVhbGx5IHdpcmVkCisJICB0byB0aGUgdGVybWluYWwuIFRoaXMgcmVzdWx0cyBpbiBzb21lIG5vbi12aXNpYmxlIGJ1dCBhZHJlc3NhYmxlIGNoYXJhY3RlcnMsCisJICBhbmQgaXMgdGhlIGNhc2UgZm9yIG1vc3QgcGFyYWxsZWwgTENEcy4gT3RoZXIgTENEcywgYW5kIHNvbWUgc2VyaWFsIG9uZXMsCisJICBob3dldmVyLCB1c2UgdGhlIHNhbWUgbGluZSB3aWR0aCBpbnRlcm5hbGx5IGFzIHdoYXQgaXMgdmlzaWJsZS4gVGhlIEtTMDA3NAorCSAgZm9yIGV4YW1wbGUsIHVzZXMgMTYgY2hhcmFjdGVycyBwZXIgbGluZSBmb3IgMTYgdmlzaWJsZSBjaGFyYWN0ZXJzIHBlciBsaW5lLgorCisJICBUaGlzIG9wdGlvbiBsZXRzIHlvdSBjb25maWd1cmUgdGhlIHZhbHVlIHVzZWQgYnkgeW91ciBMQ0QgaW4gJ2N1c3RvbScgcHJvZmlsZS4KKwkgIElmIHlvdSBkb24ndCBrbm93LCBwdXQgJzQwJyBoZXJlLgorCitjb25maWcgUEFORUxfTENEX0hXSURUSAorCWRlcGVuZHMgb24gUEFORUwgJiYgUEFORUxfUFJPRklMRT0iMCIgJiYgUEFORUxfTENEPSIxIgorCWludCAiSGFyZHdhcmUgTENEIGxpbmUgd2lkdGggKDEtNjQsIDY0IGJ5IGRlZmF1bHQpIgorCXJhbmdlIDEgNjQKKwlkZWZhdWx0IDY0CisJLS0taGVscC0tLQorCSAgTW9zdCBMQ0RzIHVzZSBhIHNpbmdsZSBhZGRyZXNzIGJpdCB0byBkaWZmZXJlbnRpYXRlIGxpbmUgMCBhbmQgbGluZSAxLiBTaW5jZQorCSAgc29tZSBvZiB0aGVtIG5lZWQgdG8gYmUgYWJsZSB0byBhZGRyZXNzIDQwIGNoYXJzIHdpdGggdGhlIGxvd2VyIGJpdHMsIHRoZXkKKwkgIG9mdGVuIHVzZSB0aGUgaW1tZWRpYXRlbHkgc3VwZXJpb3IgcG93ZXIgb2YgMiwgd2hpY2ggaXMgNjQsIHRvIGFkZHJlc3MgdGhlCisJICBuZXh0IGxpbmUuCisKKwkgIElmIHlvdSBkb24ndCBrbm93IHdoYXQgeW91ciBMQ0QgdXNlcywgaW4gZG91YnQgbGV0IDE2IGhlcmUgZm9yIGEgMngxNiwgYW5kCisJICA2NCBoZXJlIGZvciBhIDJ4NDAuCisKK2NvbmZpZyBQQU5FTF9MQ0RfQ0hBUlNFVAorCWRlcGVuZHMgb24gUEFORUwgJiYgUEFORUxfUFJPRklMRT0iMCIgJiYgUEFORUxfTENEPSIxIgorCWludCAiTENEIGNoYXJhY3RlciBzZXQgKDA9bm9ybWFsLCAxPUtTMDA3NCkiCisJcmFuZ2UgMCAxCisJZGVmYXVsdCAwCisJLS0taGVscC0tLQorCSAgU29tZSBjb250cm9sbGVycyBzdWNoIGFzIHRoZSBLUzAwNzQgdXNlIGEgc29tZXdoYXQgc3RyYW5nZSBjaGFyYWN0ZXIgc2V0CisJICB3aGVyZSBtYW55IHN5bWJvbHMgYXJlIGF0IHVudXN1YWwgcGxhY2VzLiBUaGUgZHJpdmVyIGtub3dzIGhvdyB0byBtYXAKKwkgICdzdGFuZGFyZCcgQVNDSUkgY2hhcmFjdGVycyB0byB0aGUgY2hhcmFjdGVyIHNldHMgdXNlZCBieSB0aGVzZSBjb250cm9sbGVycy4KKwkgIFZhbGlkIHZhbHVlcyBhcmUgOgorCisJICAgICAwIDogbm9ybWFsICh1bnRyYW5zbGF0ZWQpIGNoYXJhY3RlciBzZXQKKwkgICAgIDEgOiBLUzAwNzQgY2hhcmFjdGVyIHNldAorCisJICBJZiB5b3UgZG9uJ3Qga25vdywgdXNlIHRoZSBub3JtYWwgb25lICgwKS4KKworY29uZmlnIFBBTkVMX0xDRF9QUk9UTworCWRlcGVuZHMgb24gUEFORUwgJiYgUEFORUxfUFJPRklMRT0iMCIgJiYgUEFORUxfTENEPSIxIgorCWludCAiTENEIGNvbW11bmljYXRpb24gbW9kZSAoMD1wYXJhbGxlbCA4IGJpdHMsIDE9c2VyaWFsKSIKKwlyYW5nZSAwIDEKKwlkZWZhdWx0IDAKKwktLS1oZWxwLS0tCisJICBUaGlzIGRyaXZlciBub3cgc3VwcG9ydHMgYW55IHNlcmlhbCBvciBwYXJhbGxlbCBMQ0Qgd2lyZWQgdG8gYSBwYXJhbGxlbAorCSAgcG9ydC4gQnV0IGJlZm9yZSBhc3NpZ25pbmcgc2lnbmFscywgdGhlIGRyaXZlciBuZWVkcyB0byBrbm93IGlmIGl0IHdpbGwKKwkgIGJlIGRyaXZpbmcgYSBzZXJpYWwgTENEIG9yIGEgcGFyYWxsZWwgb25lLiBTZXJpYWwgTENEcyBvbmx5IHVzZSAyIHdpcmVzCisJICAoU0RBL1NDTCksIHdoaWxlIHBhcmFsbGVsIG9uZXMgdXNlIDIgb3IgMyB3aXJlcyBmb3IgdGhlIGNvbnRyb2wgc2lnbmFscworCSAgKEUsIFJTLCBzb21ldGltZXMgUlcpLCBhbmQgNCBvciA4IGZvciB0aGUgZGF0YS4gVXNlIDAgaGVyZSBmb3IgYSA4IGJpdHMKKwkgIHBhcmFsbGVsIExDRCwgYW5kIDEgZm9yIGEgc2VyaWFsIExDRC4KKworY29uZmlnIFBBTkVMX0xDRF9QSU5fRQorCWRlcGVuZHMgb24gUEFORUwgJiYgUEFORUxfUFJPRklMRT0iMCIgJiYgUEFORUxfTENEPSIxIiAmJiBQQU5FTF9MQ0RfUFJPVE89IjAiCisgICAgICAgIGludCAiUGFyYWxsZWwgcG9ydCBwaW4gbnVtYmVyICYgcG9sYXJpdHkgY29ubmVjdGVkIHRvIHRoZSBMQ0QgRSBzaWduYWwgKC0xNy4uLjE3KSAiCisJcmFuZ2UgLTE3IDE3CisJZGVmYXVsdCAxNAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZGVzY3JpYmVzIHRoZSBudW1iZXIgb2YgdGhlIHBhcmFsbGVsIHBvcnQgcGluIHRvIHdoaWNoIHRoZSBMQ0QgJ0UnCisJICBzaWduYWwgaGFzIGJlZW4gY29ubmVjdGVkLiBJdCBjYW4gYmUgOgorCisJICAgICAgICAgIDAgOiBubyBjb25uZWN0aW9uIChlZzogY29ubmVjdGVkIHRvIGdyb3VuZCkKKwkgICAgICAxLi4xNyA6IGRpcmVjdGx5IGNvbm5lY3RlZCB0byBhbnkgb2YgdGhlc2UgcGlucyBvbiB0aGUgREIyNSBwbHVnCisJICAgIC0xLi4tMTcgOiBjb25uZWN0ZWQgdG8gdGhlIHNhbWUgcGluIHRocm91Z2ggYW4gaW52ZXJ0ZXIgKGVnOiB0cmFuc2lzdG9yKS4KKworCSAgRGVmYXVsdCBmb3IgdGhlICdFJyBwaW4gaW4gY3VzdG9tIHByb2ZpbGUgaXMgJzE0JyAoQVVUT0ZFRUQpLgorCitjb25maWcgUEFORUxfTENEX1BJTl9SUworCWRlcGVuZHMgb24gUEFORUwgJiYgUEFORUxfUFJPRklMRT0iMCIgJiYgUEFORUxfTENEPSIxIiAmJiBQQU5FTF9MQ0RfUFJPVE89IjAiCisgICAgICAgIGludCAiUGFyYWxsZWwgcG9ydCBwaW4gbnVtYmVyICYgcG9sYXJpdHkgY29ubmVjdGVkIHRvIHRoZSBMQ0QgUlMgc2lnbmFsICgtMTcuLi4xNykgIgorCXJhbmdlIC0xNyAxNworCWRlZmF1bHQgMTcKKwktLS1oZWxwLS0tCisJICBUaGlzIGRlc2NyaWJlcyB0aGUgbnVtYmVyIG9mIHRoZSBwYXJhbGxlbCBwb3J0IHBpbiB0byB3aGljaCB0aGUgTENEICdSUycKKwkgIHNpZ25hbCBoYXMgYmVlbiBjb25uZWN0ZWQuIEl0IGNhbiBiZSA6CisKKwkgICAgICAgICAgMCA6IG5vIGNvbm5lY3Rpb24gKGVnOiBjb25uZWN0ZWQgdG8gZ3JvdW5kKQorCSAgICAgIDEuLjE3IDogZGlyZWN0bHkgY29ubmVjdGVkIHRvIGFueSBvZiB0aGVzZSBwaW5zIG9uIHRoZSBEQjI1IHBsdWcKKwkgICAgLTEuLi0xNyA6IGNvbm5lY3RlZCB0byB0aGUgc2FtZSBwaW4gdGhyb3VnaCBhbiBpbnZlcnRlciAoZWc6IHRyYW5zaXN0b3IpLgorCisJICBEZWZhdWx0IGZvciB0aGUgJ1JTJyBwaW4gaW4gY3VzdG9tIHByb2ZpbGUgaXMgJzE3JyAoU0VMRUNUIElOKS4KKworY29uZmlnIFBBTkVMX0xDRF9QSU5fUlcKKwlkZXBlbmRzIG9uIFBBTkVMICYmIFBBTkVMX1BST0ZJTEU9IjAiICYmIFBBTkVMX0xDRD0iMSIgJiYgUEFORUxfTENEX1BST1RPPSIwIgorICAgICAgICBpbnQgIlBhcmFsbGVsIHBvcnQgcGluIG51bWJlciAmIHBvbGFyaXR5IGNvbm5lY3RlZCB0byB0aGUgTENEIFJXIHNpZ25hbCAoLTE3Li4uMTcpICIKKwlyYW5nZSAtMTcgMTcKKwlkZWZhdWx0IDE2CisJLS0taGVscC0tLQorCSAgVGhpcyBkZXNjcmliZXMgdGhlIG51bWJlciBvZiB0aGUgcGFyYWxsZWwgcG9ydCBwaW4gdG8gd2hpY2ggdGhlIExDRCAnUlcnCisJICBzaWduYWwgaGFzIGJlZW4gY29ubmVjdGVkLiBJdCBjYW4gYmUgOgorCisJICAgICAgICAgIDAgOiBubyBjb25uZWN0aW9uIChlZzogY29ubmVjdGVkIHRvIGdyb3VuZCkKKwkgICAgICAxLi4xNyA6IGRpcmVjdGx5IGNvbm5lY3RlZCB0byBhbnkgb2YgdGhlc2UgcGlucyBvbiB0aGUgREIyNSBwbHVnCisJICAgIC0xLi4tMTcgOiBjb25uZWN0ZWQgdG8gdGhlIHNhbWUgcGluIHRocm91Z2ggYW4gaW52ZXJ0ZXIgKGVnOiB0cmFuc2lzdG9yKS4KKworCSAgRGVmYXVsdCBmb3IgdGhlICdSVycgcGluIGluIGN1c3RvbSBwcm9maWxlIGlzICcxNicgKElOSVQpLgorCitjb25maWcgUEFORUxfTENEX1BJTl9TQ0wKKwlkZXBlbmRzIG9uIFBBTkVMICYmIFBBTkVMX1BST0ZJTEU9IjAiICYmIFBBTkVMX0xDRD0iMSIgJiYgUEFORUxfTENEX1BST1RPIT0iMCIKKyAgICAgICAgaW50ICJQYXJhbGxlbCBwb3J0IHBpbiBudW1iZXIgJiBwb2xhcml0eSBjb25uZWN0ZWQgdG8gdGhlIExDRCBTQ0wgc2lnbmFsICgtMTcuLi4xNykgIgorCXJhbmdlIC0xNyAxNworCWRlZmF1bHQgMQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZGVzY3JpYmVzIHRoZSBudW1iZXIgb2YgdGhlIHBhcmFsbGVsIHBvcnQgcGluIHRvIHdoaWNoIHRoZSBzZXJpYWwKKwkgIExDRCAnU0NMJyBzaWduYWwgaGFzIGJlZW4gY29ubmVjdGVkLiBJdCBjYW4gYmUgOgorCisJICAgICAgICAgIDAgOiBubyBjb25uZWN0aW9uIChlZzogY29ubmVjdGVkIHRvIGdyb3VuZCkKKwkgICAgICAxLi4xNyA6IGRpcmVjdGx5IGNvbm5lY3RlZCB0byBhbnkgb2YgdGhlc2UgcGlucyBvbiB0aGUgREIyNSBwbHVnCisJICAgIC0xLi4tMTcgOiBjb25uZWN0ZWQgdG8gdGhlIHNhbWUgcGluIHRocm91Z2ggYW4gaW52ZXJ0ZXIgKGVnOiB0cmFuc2lzdG9yKS4KKworCSAgRGVmYXVsdCBmb3IgdGhlICdTQ0wnIHBpbiBpbiBjdXN0b20gcHJvZmlsZSBpcyAnMScgKFNUUk9CRSkuCisKK2NvbmZpZyBQQU5FTF9MQ0RfUElOX1NEQQorCWRlcGVuZHMgb24gUEFORUwgJiYgUEFORUxfUFJPRklMRT0iMCIgJiYgUEFORUxfTENEPSIxIiAmJiBQQU5FTF9MQ0RfUFJPVE8hPSIwIgorICAgICAgICBpbnQgIlBhcmFsbGVsIHBvcnQgcGluIG51bWJlciAmIHBvbGFyaXR5IGNvbm5lY3RlZCB0byB0aGUgTENEIFNEQSBzaWduYWwgKC0xNy4uLjE3KSAiCisJcmFuZ2UgLTE3IDE3CisJZGVmYXVsdCAyCisJLS0taGVscC0tLQorCSAgVGhpcyBkZXNjcmliZXMgdGhlIG51bWJlciBvZiB0aGUgcGFyYWxsZWwgcG9ydCBwaW4gdG8gd2hpY2ggdGhlIHNlcmlhbAorCSAgTENEICdTREEnIHNpZ25hbCBoYXMgYmVlbiBjb25uZWN0ZWQuIEl0IGNhbiBiZSA6CisKKwkgICAgICAgICAgMCA6IG5vIGNvbm5lY3Rpb24gKGVnOiBjb25uZWN0ZWQgdG8gZ3JvdW5kKQorCSAgICAgIDEuLjE3IDogZGlyZWN0bHkgY29ubmVjdGVkIHRvIGFueSBvZiB0aGVzZSBwaW5zIG9uIHRoZSBEQjI1IHBsdWcKKwkgICAgLTEuLi0xNyA6IGNvbm5lY3RlZCB0byB0aGUgc2FtZSBwaW4gdGhyb3VnaCBhbiBpbnZlcnRlciAoZWc6IHRyYW5zaXN0b3IpLgorCisJICBEZWZhdWx0IGZvciB0aGUgJ1NEQScgcGluIGluIGN1c3RvbSBwcm9maWxlIGlzICcyJyAoRDApLgorCitjb25maWcgUEFORUxfTENEX1BJTl9CTAorCWRlcGVuZHMgb24gUEFORUwgJiYgUEFORUxfUFJPRklMRT0iMCIgJiYgUEFORUxfTENEPSIxIgorICAgICAgICBpbnQgIlBhcmFsbGVsIHBvcnQgcGluIG51bWJlciAmIHBvbGFyaXR5IGNvbm5lY3RlZCB0byB0aGUgTENEIGJhY2tsaWdodCBzaWduYWwgKC0xNy4uLjE3KSAiCisJcmFuZ2UgLTE3IDE3CisJZGVmYXVsdCAwCisJLS0taGVscC0tLQorCSAgVGhpcyBkZXNjcmliZXMgdGhlIG51bWJlciBvZiB0aGUgcGFyYWxsZWwgcG9ydCBwaW4gdG8gd2hpY2ggdGhlIExDRCAnQkwnIHNpZ25hbAorICAgICAgICAgIGhhcyBiZWVuIGNvbm5lY3RlZC4gSXQgY2FuIGJlIDoKKworCSAgICAgICAgICAwIDogbm8gY29ubmVjdGlvbiAoZWc6IGNvbm5lY3RlZCB0byBncm91bmQpCisJICAgICAgMS4uMTcgOiBkaXJlY3RseSBjb25uZWN0ZWQgdG8gYW55IG9mIHRoZXNlIHBpbnMgb24gdGhlIERCMjUgcGx1ZworCSAgICAtMS4uLTE3IDogY29ubmVjdGVkIHRvIHRoZSBzYW1lIHBpbiB0aHJvdWdoIGFuIGludmVydGVyIChlZzogdHJhbnNpc3RvcikuCisKKwkgIERlZmF1bHQgZm9yIHRoZSAnQkwnIHBpbiBpbiBjdXN0b20gcHJvZmlsZSBpcyAnMCcgKHVuY29udHJvbGxlZCkuCisKK2NvbmZpZyBQQU5FTF9DSEFOR0VfTUVTU0FHRQorCWRlcGVuZHMgb24gUEFORUwKKwlib29sICJDaGFuZ2UgTENEIGluaXRpYWxpemF0aW9uIG1lc3NhZ2UgPyIKKwlkZWZhdWx0ICJuIgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgYWxsb3dzIHlvdSB0byByZXBsYWNlIHRoZSBib290IG1lc3NhZ2UgaW5kaWNhdGluZyB0aGUga2VybmVsIHZlcnNpb24KKwkgIGFuZCB0aGUgZHJpdmVyIHZlcnNpb24gd2l0aCBhIGN1c3RvbSBtZXNzYWdlLiBUaGlzIGlzIHVzZWZ1bCBvbiBhcHBsaWFuY2VzCisJICB3aGVyZSBhIHNpbXBsZSAnU3RhcnRpbmcgc3lzdGVtJyBtZXNzYWdlIGNhbiBiZSBlbm91Z2ggdG8gc3RvcCBhIGN1c3RvbWVyCisJICBmcm9tIHdvcnJ5aW5nLgorCisJICBJZiB5b3Ugc2F5ICdZJyBoZXJlLCB5b3UnbGwgYmUgYWJsZSB0byBjaG9vc2UgYSBtZXNzYWdlIHlvdXJzZWxmLiBPdGhlcndpc2UsCisJICBzYXkgJ04nIGFuZCBrZWVwIHRoZSBkZWZhdWx0IG1lc3NhZ2Ugd2l0aCB0aGUgdmVyc2lvbi4KKworY29uZmlnIFBBTkVMX0JPT1RfTUVTU0FHRQorCWRlcGVuZHMgb24gUEFORUwgJiYgUEFORUxfQ0hBTkdFX01FU1NBR0U9InkiCisJc3RyaW5nICJOZXcgaW5pdGlhbGl6YXRpb24gbWVzc2FnZSIKKwlkZWZhdWx0ICIiCisJLS0taGVscC0tLQorCSAgVGhpcyBhbGxvd3MgeW91IHRvIHJlcGxhY2UgdGhlIGJvb3QgbWVzc2FnZSBpbmRpY2F0aW5nIHRoZSBrZXJuZWwgdmVyc2lvbgorCSAgYW5kIHRoZSBkcml2ZXIgdmVyc2lvbiB3aXRoIGEgY3VzdG9tIG1lc3NhZ2UuIFRoaXMgaXMgdXNlZnVsIG9uIGFwcGxpYW5jZXMKKwkgIHdoZXJlIGEgc2ltcGxlICdTdGFydGluZyBzeXN0ZW0nIG1lc3NhZ2UgY2FuIGJlIGVub3VnaCB0byBzdG9wIGEgY3VzdG9tZXIKKwkgIGZyb20gd29ycnlpbmcuCisKKwkgIEFuIGVtcHR5IG1lc3NhZ2Ugd2lsbCBvbmx5IGNsZWFyIHRoZSBkaXNwbGF5IGF0IGRyaXZlciBpbml0IHRpbWUuIEFueSBvdGhlcgorCSAgcHJpbnRmKCktZm9ybWF0dGVkIG1lc3NhZ2UgaXMgdmFsaWQgd2l0aCBuZXdsaW5lIGFuZCBlc2NhcGUgY29kZXMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcGFuZWwvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvcGFuZWwvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ3YzIzOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9wYW5lbC9NYWtlZmlsZQpAQCAtMCwwICsxIEBACitvYmotJChDT05GSUdfUEFORUwpCQkrPSBwYW5lbC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcGFuZWwvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9wYW5lbC9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YmU3NDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcGFuZWwvVE9ETwpAQCAtMCwwICsxLDkgQEAKK1RPRE86CisJLSBjaGVja3BhdGNoLnBsIGNsZWFudXBzCisJLSBMaW5kZW50CisJLSByZXZpZXcgbWFqb3IvbWlub3IgdXNhZ2VzCisJLSByZXZpZXcgdXNlcnNwYWNlIGFwaQorCS0gc2VlIGlmIGFsbCBvZiB0aGlzIGNvdWxkIGJlIGVhc2llciBkb25lIGluIHVzZXJzcGFjZSBpbnN0ZWFkLgorCitQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+IGFuZAorV2lsbHkgVGFycmVhdSA8d2lsbHlAbWV0YS14Lm9yZz4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9wYW5lbC9sY2QtcGFuZWwtY2dyYW0udHh0IGIvZHJpdmVycy9zdGFnaW5nL3BhbmVsL2xjZC1wYW5lbC1jZ3JhbS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjljZWVmNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9wYW5lbC9sY2QtcGFuZWwtY2dyYW0udHh0CkBAIC0wLDAgKzEsMjQgQEAKK1NvbWUgTENEcyBhbGxvdyB5b3UgdG8gZGVmaW5lIHVwIHRvIDggY2hhcmFjdGVycywgbWFwcGVkIHRvIEFTQ0lJCitjaGFyYWN0ZXJzIDAgdG8gNy4gVGhlIGVzY2FwZSBjb2RlIHRvIGRlZmluZSBhIG5ldyBjaGFyYWN0ZXIgaXMKKydcZVtMRycgZm9sbG93ZWQgYnkgb25lIGRpZ2l0IGZyb20gMCB0byA3LCByZXByZXNlbnRpbmcgdGhlIGNoYXJhY3RlcgorbnVtYmVyLCBhbmQgdXAgdG8gOCBjb3VwbGVzIG9mIGhleCBkaWdpdHMgdGVybWluYXRlZCBieSBhIHNlbWktY29sb24KKygnOycpLiBFYWNoIGNvdXBsZSBvZiBkaWdpdHMgcmVwcmVzZW50cyBhIGxpbmUsIHdpdGggMS1iaXRzIGZvciBlYWNoCitpbGx1bWluYXRlZCBwaXhlbCB3aXRoIExTQiBvbiB0aGUgcmlnaHQuIExpbmVzIGFyZSBudW1iZXJyZWQgZnJvbSB0aGUKK3RvcCBvZiB0aGUgY2hhcmFjdGVyIHRvIHRoZSBib3R0b20uIE9uIGEgNXg3IG1hdHJpeCwgb25seSB0aGUgNSBsb3dlcgorYml0cyBvZiB0aGUgNyBmaXJzdCBieXRlcyBhcmUgdXNlZCBmb3IgZWFjaCBjaGFyYWN0ZXIuIElmIHRoZSBzdHJpbmcKK2lzIGluY29tcGxldGUsIG9ubHkgY29tcGxldGUgbGluZXMgd2lsbCBiZSByZWRlZmluZWQuIEhlcmUgYXJlIHNvbWUKK2V4YW1wbGVzIDoKKworICBwcmludGYgIlxlW0xHMDAxMDEwMTA1MEQxRjBDMDQ7IiAgPT4gMCA9IFtlbnRlcl0KKyAgcHJpbnRmICJcZVtMRzEwNDBFMUYwMDAwMDAwMDAwOyIgID0+IDEgPSBbdXBdCisgIHByaW50ZiAiXGVbTEcyMDAwMDAwMDAxRjBFMDQwMDsiICA9PiAyID0gW2Rvd25dCisgIHByaW50ZiAiXGVbTEczMDQwRTFGMDAxRjBFMDQwMDsiICA9PiAzID0gW3VwLWRvd25dCisgIHByaW50ZiAiXGVbTEc0MDAwMjA2MEUxRTBFMDYwMjsiICA9PiA0ID0gW2xlZnRdCisgIHByaW50ZiAiXGVbTEc1MDAwODBDMEUwRjBFMEMwODsiICA9PiA1ID0gW3JpZ2h0XQorICBwcmludGYgIlxlW0xHNjAwMTYwNTE1MTYxNDE0MDA7IiAgPT4gNiA9ICJJUCIKKworICBwcmludGYgIlxlW0xHMDAxMDMwNzFGMUYwNzAzMDE7IiAgPT4gYmlnIHNwZWFrZXIKKyAgcHJpbnRmICJcZVtMRzAwMDAyMDYxRTFFMDYwMjAwOyIgID0+IHNtYWxsIHNwZWFrZXIKKworV2lsbHkKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3BhbmVsL3BhbmVsLmMgYi9kcml2ZXJzL3N0YWdpbmcvcGFuZWwvcGFuZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmZlMjY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3BhbmVsL3BhbmVsLmMKQEAgLTAsMCArMSwyMTkzIEBACisvKgorICogRnJvbnQgcGFuZWwgZHJpdmVyIGZvciBMaW51eAorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDgsIFdpbGx5IFRhcnJlYXUgPHdAMXd0LmV1PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBjb2RlIGRyaXZlcyBhbiBMQ0QgbW9kdWxlICgvZGV2L2xjZCksIGFuZCBhIGtleXBhZCAoL2Rldi9rZXlwYWQpCisgKiBjb25uZWN0ZWQgdG8gYSBwYXJhbGxlbCBwcmludGVyIHBvcnQuCisgKgorICogVGhlIExDRCBtb2R1bGUgbWF5IGVpdGhlciBiZSBhbiBIRDQ0NzgwLWxpa2UgOC1iaXQgcGFyYWxsZWwgTENELCBvciBhIDEtYml0CisgKiBzZXJpYWwgbW9kdWxlIGNvbXBhdGlibGUgd2l0aCBTYW1zdW5nJ3MgS1MwMDc0LiBUaGUgcGlucyBtYXkgYmUgY29ubmVjdGVkIGluCisgKiBhbnkgY29tYmluYXRpb24sIGV2ZXJ5dGhpbmcgaXMgcHJvZ3JhbW1hYmxlLgorICoKKyAqIFRoZSBrZXlwYWQgY29uc2lzdHMgaW4gYSBtYXRyaXggb2YgcHVzaCBidXR0b25zIGNvbm5lY3RpbmcgaW5wdXQgcGlucyB0bworICogZGF0YSBvdXRwdXQgcGlucyBvciB0byB0aGUgZ3JvdW5kLiBUaGUgY29tYmluYXRpb25zIGhhdmUgdG8gYmUgaGFyZC1jb2RlZAorICogaW4gdGhlIGRyaXZlciwgdGhvdWdoIHNldmVyYWwgcHJvZmlsZXMgZXhpc3QgYW5kIGFkZGluZyBuZXcgb25lcyBpcyBlYXN5LgorICoKKyAqIFNldmVyYWwgcHJvZmlsZXMgYXJlIHByb3ZpZGVkIGZvciBjb21tb25seSBmb3VuZCBMQ0Qra2V5cGFkIG1vZHVsZXMgb24gdGhlCisgKiBtYXJrZXQsIHN1Y2ggYXMgdGhvc2UgZm91bmQgaW4gTmV4Y29tJ3MgYXBwbGlhbmNlcy4KKyAqCisgKiBGSVhNRToKKyAqICAgICAgLSB0aGUgaW5pdGlhbGl6YXRpb24vZGVpbml0aWFsaXphdGlvbiBwcm9jZXNzIGlzIHZlcnkgZGlydHkgYW5kIHNob3VsZAorICogICAgICAgIGJlIHJld3JpdHRlbi4gSXQgbWF5IGV2ZW4gYmUgYnVnZ3kuCisgKgorICogVE9ETzoKKyAqCS0gZG9jdW1lbnQgMjQga2V5cyBrZXlib2FyZCAoMyByb3dzIG9mIDggY29scywgMzIgZGlvZGVzICsgMiBpbnB1dHMpCisgKiAgICAgIC0gbWFrZSB0aGUgTENEIGEgcGFydCBvZiBhIHZpcnR1YWwgc2NyZWVuIG9mIFZ4KlZ5CisgKgktIG1ha2UgdGhlIGlucHV0cyBsaXN0IHNtcC1zYWZlCisgKiAgICAgIC0gY2hhbmdlIHRoZSBrZXlib2FyZCB0byBhIGRvdWJsZSBtYXBwaW5nIDogc2lnbmFscyAtPiBrZXlfaWQgLT4gdmFsdWVzCisgKiAgICAgICAgc28gdGhhdCBhcHBsaWNhdGlvbnMgY2FuIGNoYW5nZSB2YWx1ZXMgd2l0aG91dCBrbm93aW5nIHNpZ25hbHMKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvdXRzcmVsZWFzZS5oPgorCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2RlZmluZSBMQ0RfTUlOT1IJCTE1NgorI2RlZmluZSBLRVlQQURfTUlOT1IJCTE4NQorCisjZGVmaW5lIFBBTkVMX1ZFUlNJT04JCSIwLjkuNSIKKworI2RlZmluZSBMQ0RfTUFYQllURVMJCTI1NgkvKiBtYXggYnVyc3Qgd3JpdGUgKi8KKworI2RlZmluZSBLRVlQQURfQlVGRkVSCQk2NAorI2RlZmluZSBJTlBVVF9QT0xMX1RJTUUJCShIWi81MCkJLyogcG9sbCB0aGUga2V5Ym9hcmQgdGhpcyBldmVyeSBzZWNvbmQgKi8KKyNkZWZpbmUgS0VZUEFEX1JFUF9TVEFSVAkoMTApCS8qIGEga2V5IHN0YXJ0cyB0byByZXBlYXQgYWZ0ZXIgdGhpcyB0aW1lcyBJTlBVVF9QT0xMX1RJTUUgKi8KKyNkZWZpbmUgS0VZUEFEX1JFUF9ERUxBWQkoMikJLyogYSBrZXkgcmVwZWF0cyB0aGlzIHRpbWVzIElOUFVUX1BPTExfVElNRSAqLworCisjZGVmaW5lIEZMQVNIX0xJR0hUX1RFTVBPCSgyMDApCS8qIGtlZXAgdGhlIGxpZ2h0IG9uIHRoaXMgdGltZXMgSU5QVVRfUE9MTF9USU1FIGZvciBlYWNoIGZsYXNoICovCisKKy8qIGNvbnZlcnRzIGFuIHJfc3RyKCkgaW5wdXQgdG8gYW4gYWN0aXZlIGhpZ2gsIGJpdHMgc3RyaW5nIDogMDAwQkFPU0UgKi8KKyNkZWZpbmUgUE5MX1BJTlBVVChhKQkJKCgoKHVuc2lnbmVkIGNoYXIpKGEpKSBeIDB4N0YpID4+IDMpCisKKyNkZWZpbmUgUE5MX1BCVVNZCQkweDgwCS8qIGludmVydGVkIGlucHV0LCBhY3RpdmUgbG93ICovCisjZGVmaW5lIFBOTF9QQUNLCQkweDQwCS8qIGRpcmVjdCBpbnB1dCwgYWN0aXZlIGxvdyAqLworI2RlZmluZSBQTkxfUE9VVFBBCQkweDIwCS8qIGRpcmVjdCBpbnB1dCwgYWN0aXZlIGhpZ2ggKi8KKyNkZWZpbmUgUE5MX1BTRUxFQ0QJCTB4MTAJLyogZGlyZWN0IGlucHV0LCBhY3RpdmUgaGlnaCAqLworI2RlZmluZSBQTkxfUEVSUk9SUAkJMHgwOAkvKiBkaXJlY3QgaW5wdXQsIGFjdGl2ZSBsb3cgKi8KKworI2RlZmluZSBQTkxfUEJJRElSCQkweDIwCS8qIGJpLWRpcmVjdGlvbmFsIHBvcnRzICovCisjZGVmaW5lIFBOTF9QSU5URU4JCTB4MTAJLyogaGlnaCB0byByZWFkIGRhdGEgaW4gb3ItZWQgd2l0aCBkYXRhIG91dCAqLworI2RlZmluZSBQTkxfUFNFTEVDUAkJMHgwOAkvKiBpbnZlcnRlZCBvdXRwdXQsIGFjdGl2ZSBsb3cgKi8KKyNkZWZpbmUgUE5MX1BJTklUUAkJMHgwNAkvKiBkaXJlY3Qgb3V0cHV0LCBhY3RpdmUgbG93ICovCisjZGVmaW5lIFBOTF9QQVVUT0xGCQkweDAyCS8qIGludmVydGVkIG91dHB1dCwgYWN0aXZlIGxvdyAqLworI2RlZmluZSBQTkxfUFNUUk9CRQkJMHgwMQkvKiBpbnZlcnRlZCBvdXRwdXQgKi8KKworI2RlZmluZSBQTkxfUEQwCQkJMHgwMQorI2RlZmluZSBQTkxfUEQxCQkJMHgwMgorI2RlZmluZSBQTkxfUEQyCQkJMHgwNAorI2RlZmluZSBQTkxfUEQzCQkJMHgwOAorI2RlZmluZSBQTkxfUEQ0CQkJMHgxMAorI2RlZmluZSBQTkxfUEQ1CQkJMHgyMAorI2RlZmluZSBQTkxfUEQ2CQkJMHg0MAorI2RlZmluZSBQTkxfUEQ3CQkJMHg4MAorCisjZGVmaW5lIFBJTl9OT05FCQkwCisjZGVmaW5lIFBJTl9TVFJPQkUJCTEKKyNkZWZpbmUgUElOX0QwCQkJMgorI2RlZmluZSBQSU5fRDEJCQkzCisjZGVmaW5lIFBJTl9EMgkJCTQKKyNkZWZpbmUgUElOX0QzCQkJNQorI2RlZmluZSBQSU5fRDQJCQk2CisjZGVmaW5lIFBJTl9ENQkJCTcKKyNkZWZpbmUgUElOX0Q2CQkJOAorI2RlZmluZSBQSU5fRDcJCQk5CisjZGVmaW5lIFBJTl9BVVRPTEYJCTE0CisjZGVmaW5lIFBJTl9JTklUUAkJMTYKKyNkZWZpbmUgUElOX1NFTEVDUAkJMTcKKyNkZWZpbmUgUElOX05PVF9TRVQJCTEyNworCisjZGVmaW5lIExDRF9GTEFHX1MJCTB4MDAwMQorI2RlZmluZSBMQ0RfRkxBR19JRAkJMHgwMDAyCisjZGVmaW5lIExDRF9GTEFHX0IJCTB4MDAwNAkvKiBibGluayBvbiAqLworI2RlZmluZSBMQ0RfRkxBR19DCQkweDAwMDgJLyogY3Vyc29yIG9uICovCisjZGVmaW5lIExDRF9GTEFHX0QJCTB4MDAxMAkvKiBkaXNwbGF5IG9uICovCisjZGVmaW5lIExDRF9GTEFHX0YJCTB4MDAyMAkvKiBsYXJnZSBmb250IG1vZGUgKi8KKyNkZWZpbmUgTENEX0ZMQUdfTgkJMHgwMDQwCS8qIDItcm93cyBtb2RlICovCisjZGVmaW5lIExDRF9GTEFHX0wJCTB4MDA4MAkvKiBiYWNrbGlnaHQgZW5hYmxlZCAqLworCisjZGVmaW5lIExDRF9FU0NBUEVfTEVOCQkyNAkvKiAyNCBjaGFycyBtYXggZm9yIGFuIExDRCBlc2NhcGUgY29tbWFuZCAqLworI2RlZmluZSBMQ0RfRVNDQVBFX0NIQVIJMjcJLyogdXNlIGNoYXIgMjcgZm9yIGVzY2FwZSBjb21tYW5kICovCisKKy8qIG1hY3JvcyB0byBzaW1wbGlmeSB1c2Ugb2YgdGhlIHBhcmFsbGVsIHBvcnQgKi8KKyNkZWZpbmUgcl9jdHIoeCkgICAgICAgIChwYXJwb3J0X3JlYWRfY29udHJvbCgoeCktPnBvcnQpKQorI2RlZmluZSByX2R0cih4KSAgICAgICAgKHBhcnBvcnRfcmVhZF9kYXRhKCh4KS0+cG9ydCkpCisjZGVmaW5lIHJfc3RyKHgpICAgICAgICAocGFycG9ydF9yZWFkX3N0YXR1cygoeCktPnBvcnQpKQorI2RlZmluZSB3X2N0cih4LCB5KSAgICAgZG8geyBwYXJwb3J0X3dyaXRlX2NvbnRyb2woKHgpLT5wb3J0LCAoeSkpOyB9IHdoaWxlICgwKQorI2RlZmluZSB3X2R0cih4LCB5KSAgICAgZG8geyBwYXJwb3J0X3dyaXRlX2RhdGEoKHgpLT5wb3J0LCAoeSkpOyB9IHdoaWxlICgwKQorCisvKiB0aGlzIGRlZmluZXMgd2hpY2ggYml0cyBhcmUgdG8gYmUgdXNlZCBhbmQgd2hpY2ggb25lcyB0byBiZSBpZ25vcmVkICovCitzdGF0aWMgX191OCBzY2FuX21hc2tfbzsJLyogbG9naWNhbCBvciBvZiB0aGUgb3V0cHV0IGJpdHMgaW52b2x2ZWQgaW4gdGhlIHNjYW4gbWF0cml4ICovCitzdGF0aWMgX191OCBzY2FuX21hc2tfaTsJLyogbG9naWNhbCBvciBvZiB0aGUgaW5wdXQgYml0cyBpbnZvbHZlZCBpbiB0aGUgc2NhbiBtYXRyaXggKi8KKwordHlwZWRlZiBfX3U2NCBwbWFza190OworCitlbnVtIGlucHV0X3R5cGUgeworCUlOUFVUX1RZUEVfU1RELAorCUlOUFVUX1RZUEVfS0JELAorfTsKKworZW51bSBpbnB1dF9zdGF0ZSB7CisJSU5QVVRfU1RfTE9XLAorCUlOUFVUX1NUX1JJU0lORywKKwlJTlBVVF9TVF9ISUdILAorCUlOUFVUX1NUX0ZBTExJTkcsCit9OworCitzdHJ1Y3QgbG9naWNhbF9pbnB1dCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXBtYXNrX3QgbWFzazsKKwlwbWFza190IHZhbHVlOworCWVudW0gaW5wdXRfdHlwZSB0eXBlOworCWVudW0gaW5wdXRfc3RhdGUgc3RhdGU7CisJX191OCByaXNlX3RpbWUsIGZhbGxfdGltZTsKKwlfX3U4IHJpc2VfdGltZXIsIGZhbGxfdGltZXIsIGhpZ2hfdGltZXI7CisKKwl1bmlvbiB7CisJCXN0cnVjdCB7CS8qIHRoaXMgc3RydWN0dXJlIGlzIHZhbGlkIHdoZW4gdHlwZSA9PSBJTlBVVF9UWVBFX1NURCAqLworCQkJdm9pZCAoKnByZXNzX2ZjdCkgKGludCk7CisJCQl2b2lkICgqcmVsZWFzZV9mY3QpIChpbnQpOworCQkJaW50IHByZXNzX2RhdGE7CisJCQlpbnQgcmVsZWFzZV9kYXRhOworCQl9IHN0ZDsKKwkJc3RydWN0IHsJLyogdGhpcyBzdHJ1Y3R1cmUgaXMgdmFsaWQgd2hlbiB0eXBlID09IElOUFVUX1RZUEVfS0JEICovCisJCQkvKiBzdHJpbmdzIGNhbiBiZSBmdWxsLWxlbmd0aCAoaWUuIG5vbiBudWxsLXRlcm1pbmF0ZWQpICovCisJCQljaGFyIHByZXNzX3N0cltzaXplb2Yodm9pZCAqKSArIHNpemVvZihpbnQpXTsKKwkJCWNoYXIgcmVwZWF0X3N0cltzaXplb2Yodm9pZCAqKSArIHNpemVvZihpbnQpXTsKKwkJCWNoYXIgcmVsZWFzZV9zdHJbc2l6ZW9mKHZvaWQgKikgKyBzaXplb2YoaW50KV07CisJCX0ga2JkOworCX0gdTsKK307CisKK0xJU1RfSEVBRChsb2dpY2FsX2lucHV0cyk7CS8qIGxpc3Qgb2YgYWxsIGRlZmluZWQgbG9naWNhbCBpbnB1dHMgKi8KKworLyogcGh5c2ljYWwgY29udGFjdHMgaGlzdG9yeQorICogUGh5c2ljYWwgY29udGFjdHMgYXJlIGEgNDUgYml0cyBzdHJpbmcgb2YgOSBncm91cHMgb2YgNSBiaXRzIGVhY2guCisgKiBUaGUgOCBsb3dlciBncm91cHMgY29ycmVzcG9uZCB0byBvdXRwdXQgYml0cyAwIHRvIDcsIGFuZCB0aGUgOXRoIGdyb3VwCisgKiBjb3JyZXNwb25kcyB0byB0aGUgZ3JvdW5kLgorICogV2l0aGluIGVhY2ggZ3JvdXAsIGJpdHMgYXJlIHN0b3JlZCBpbiB0aGUgc2FtZSBvcmRlciBhcyByZWFkIG9uIHRoZSBwb3J0IDoKKyAqIEJBUFNFIChidXN5PTQsIGFjaz0zLCBwYXBlciBlbXB0eT0yLCBzZWxlY3Q9MSwgZXJyb3I9MCkuCisgKiBTbywgZWFjaCBfX3U2NCAob3IgcG1hc2tfdCkgaXMgcmVwcmVzZW50ZWQgbGlrZSB0aGlzIDoKKyAqIDAwMDAwMDAwMDAwMDAwMDAwMDBCQVBTRUJBUFNFQkFQU0VCQVBTRUJBUFNFQkFQU0VCQVBTRUJBUFNFQkFQU0UKKyAqIDwtLS0tLXVudXNlZC0tLS0tLT48Z25kPjxkMDc+PGQwNj48ZDA1PjxkMDQ+PGQwMz48ZDAyPjxkMDE+PGQwMD4KKyAqLworc3RhdGljIHBtYXNrX3QgcGh5c19yZWFkOwkvKiB3aGF0IGhhcyBqdXN0IGJlZW4gcmVhZCBmcm9tIHRoZSBJL08gcG9ydHMgKi8KK3N0YXRpYyBwbWFza190IHBoeXNfcmVhZF9wcmV2OwkvKiBwcmV2aW91cyBwaHlzX3JlYWQgKi8KK3N0YXRpYyBwbWFza190IHBoeXNfY3VycjsJLyogc3RhYmlsaXplZCBwaHlzX3JlYWQgKHBoeXNfcmVhZHxwaHlzX3JlYWRfcHJldikgKi8KK3N0YXRpYyBwbWFza190IHBoeXNfcHJldjsJLyogcHJldmlvdXMgcGh5c19jdXJyICovCitzdGF0aWMgY2hhciBpbnB1dHNfc3RhYmxlOwkvKiAwIG1lYW5zIHRoYXQgYXQgbGVhc3Qgb25lIGxvZ2ljYWwgc2lnbmFsIG5lZWRzIGJlIGNvbXB1dGVkICovCisKKy8qIHRoZXNlIHZhcmlhYmxlcyBhcmUgc3BlY2lmaWMgdG8gdGhlIGtleXBhZCAqLworc3RhdGljIGNoYXIga2V5cGFkX2J1ZmZlcltLRVlQQURfQlVGRkVSXTsKK3N0YXRpYyBpbnQga2V5cGFkX2J1ZmxlbjsKK3N0YXRpYyBpbnQga2V5cGFkX3N0YXJ0Oworc3RhdGljIGNoYXIga2V5cHJlc3NlZDsKK3N0YXRpYyB3YWl0X3F1ZXVlX2hlYWRfdCBrZXlwYWRfcmVhZF93YWl0OworCisvKiBsY2Qtc3BlY2lmaWMgdmFyaWFibGVzICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbnQgbGNkX2ZsYWdzOwkvKiBjb250YWlucyB0aGUgTENEIGNvbmZpZyBzdGF0ZSAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW50IGxjZF9hZGRyX3g7CS8qIGNvbnRhaW5zIHRoZSBMQ0QgWCBvZmZzZXQgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGludCBsY2RfYWRkcl95OwkvKiBjb250YWlucyB0aGUgTENEIFkgb2Zmc2V0ICovCitzdGF0aWMgY2hhciBsY2RfZXNjYXBlW0xDRF9FU0NBUEVfTEVOICsgMV07CS8qIGN1cnJlbnQgZXNjYXBlIHNlcXVlbmNlLCAwIHRlcm1pbmF0ZWQgKi8KK3N0YXRpYyBpbnQgbGNkX2VzY2FwZV9sZW4gPSAtMTsJLyogbm90IGluIGVzY2FwZSBzdGF0ZS4gPj0wID0gZXNjYXBlIGNtZCBsZW4gKi8KKworLyoKKyAqIEJpdCBtYXNrcyB0byBjb252ZXJ0IExDRCBzaWduYWxzIHRvIHBhcmFsbGVsIHBvcnQgb3V0cHV0cy4KKyAqIF9kXyBhcmUgdmFsdWVzIGZvciBkYXRhIHBvcnQsIF9jXyBhcmUgZm9yIGNvbnRyb2wgcG9ydC4KKyAqIFswXSA9IHNpZ25hbCBPRkYsIFsxXSA9IHNpZ25hbCBPTiwgWzJdID0gbWFzaworICovCisjZGVmaW5lIEJJVF9DTFIJCTAKKyNkZWZpbmUgQklUX1NFVAkJMQorI2RlZmluZSBCSVRfTVNLCQkyCisjZGVmaW5lIEJJVF9TVEFURVMJMworLyoKKyAqIG9uZSBlbnRyeSBmb3IgZWFjaCBiaXQgb24gdGhlIExDRAorICovCisjZGVmaW5lIExDRF9CSVRfRQkwCisjZGVmaW5lIExDRF9CSVRfUlMJMQorI2RlZmluZSBMQ0RfQklUX1JXCTIKKyNkZWZpbmUgTENEX0JJVF9CTAkzCisjZGVmaW5lIExDRF9CSVRfQ0wJNAorI2RlZmluZSBMQ0RfQklUX0RBCTUKKyNkZWZpbmUgTENEX0JJVFMJNgorCisvKgorICogZWFjaCBiaXQgY2FuIGJlIGVpdGhlciBjb25uZWN0ZWQgdG8gYSBEQVRBIG9yIENUUkwgcG9ydAorICovCisjZGVmaW5lIExDRF9QT1JUX0MJMAorI2RlZmluZSBMQ0RfUE9SVF9ECTEKKyNkZWZpbmUgTENEX1BPUlRTCTIKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgbGNkX2JpdHNbTENEX1BPUlRTXVtMQ0RfQklUU11bQklUX1NUQVRFU107CisKKy8qCisgKiBMQ0QgcHJvdG9jb2xzCisgKi8KKyNkZWZpbmUgTENEX1BST1RPX1BBUkFMTEVMICAgICAgMAorI2RlZmluZSBMQ0RfUFJPVE9fU0VSSUFMICAgICAgICAxCisKKy8qCisgKiBMQ0QgY2hhcmFjdGVyIHNldHMKKyAqLworI2RlZmluZSBMQ0RfQ0hBUlNFVF9OT1JNQUwgICAgICAwCisjZGVmaW5lIExDRF9DSEFSU0VUX0tTMDA3NCAgICAgIDEKKworLyoKKyAqIExDRCB0eXBlcworICovCisjZGVmaW5lIExDRF9UWVBFX05PTkUJCTAKKyNkZWZpbmUgTENEX1RZUEVfT0xECQkxCisjZGVmaW5lIExDRF9UWVBFX0tTMDA3NAkJMgorI2RlZmluZSBMQ0RfVFlQRV9IQU5UUk9OSVgJMworI2RlZmluZSBMQ0RfVFlQRV9ORVhDT00JCTQKKyNkZWZpbmUgTENEX1RZUEVfQ1VTVE9NCQk1CisKKy8qCisgKiBrZXlwYWQgdHlwZXMKKyAqLworI2RlZmluZSBLRVlQQURfVFlQRV9OT05FCTAKKyNkZWZpbmUgS0VZUEFEX1RZUEVfT0xECQkxCisjZGVmaW5lIEtFWVBBRF9UWVBFX05FVwkJMgorI2RlZmluZSBLRVlQQURfVFlQRV9ORVhDT00JMworCisvKgorICogcGFuZWwgcHJvZmlsZXMKKyAqLworI2RlZmluZSBQQU5FTF9QUk9GSUxFX0NVU1RPTQkwCisjZGVmaW5lIFBBTkVMX1BST0ZJTEVfT0xECTEKKyNkZWZpbmUgUEFORUxfUFJPRklMRV9ORVcJMgorI2RlZmluZSBQQU5FTF9QUk9GSUxFX0hBTlRST05JWAkzCisjZGVmaW5lIFBBTkVMX1BST0ZJTEVfTkVYQ09NCTQKKyNkZWZpbmUgUEFORUxfUFJPRklMRV9MQVJHRQk1CisKKy8qCisgKiBDb25zdHJ1Y3QgY3VzdG9tIGNvbmZpZyBmcm9tIHRoZSBrZXJuZWwncyBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgREVGQVVMVF9QUk9GSUxFICAgICAgICAgUEFORUxfUFJPRklMRV9MQVJHRQorI2RlZmluZSBERUZBVUxUX1BBUlBPUlQgICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfTENEICAgICAgICAgICAgIExDRF9UWVBFX09MRAorI2RlZmluZSBERUZBVUxUX0tFWVBBRCAgICAgICAgICBLRVlQQURfVFlQRV9PTEQKKyNkZWZpbmUgREVGQVVMVF9MQ0RfV0lEVEggICAgICAgNDAKKyNkZWZpbmUgREVGQVVMVF9MQ0RfQldJRFRIICAgICAgNDAKKyNkZWZpbmUgREVGQVVMVF9MQ0RfSFdJRFRIICAgICAgNjQKKyNkZWZpbmUgREVGQVVMVF9MQ0RfSEVJR0hUICAgICAgMgorI2RlZmluZSBERUZBVUxUX0xDRF9QUk9UTyAgICAgICBMQ0RfUFJPVE9fUEFSQUxMRUwKKworI2RlZmluZSBERUZBVUxUX0xDRF9QSU5fRSAgICAgICBQSU5fQVVUT0xGCisjZGVmaW5lIERFRkFVTFRfTENEX1BJTl9SUyAgICAgIFBJTl9TRUxFQ1AKKyNkZWZpbmUgREVGQVVMVF9MQ0RfUElOX1JXICAgICAgUElOX0lOSVRQCisjZGVmaW5lIERFRkFVTFRfTENEX1BJTl9TQ0wgICAgIFBJTl9TVFJPQkUKKyNkZWZpbmUgREVGQVVMVF9MQ0RfUElOX1NEQSAgICAgUElOX0QwCisjZGVmaW5lIERFRkFVTFRfTENEX1BJTl9CTCAgICAgIFBJTl9OT1RfU0VUCisjZGVmaW5lIERFRkFVTFRfTENEX0NIQVJTRVQgICAgIExDRF9DSEFSU0VUX05PUk1BTAorCisjaWZkZWYgQ09ORklHX1BBTkVMX1BST0ZJTEUKKyN1bmRlZiBERUZBVUxUX1BST0ZJTEUKKyNkZWZpbmUgREVGQVVMVF9QUk9GSUxFIENPTkZJR19QQU5FTF9QUk9GSUxFCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQU5FTF9QQVJQT1JUCisjdW5kZWYgREVGQVVMVF9QQVJQT1JUCisjZGVmaW5lIERFRkFVTFRfUEFSUE9SVCBDT05GSUdfUEFORUxfUEFSUE9SVAorI2VuZGlmCisKKyNpZiBERUZBVUxUX1BST0ZJTEUgPT0gMAkvKiBjdXN0b20gKi8KKyNpZmRlZiBDT05GSUdfUEFORUxfS0VZUEFECisjdW5kZWYgREVGQVVMVF9LRVlQQUQKKyNkZWZpbmUgREVGQVVMVF9LRVlQQUQgQ09ORklHX1BBTkVMX0tFWVBBRAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUEFORUxfTENECisjdW5kZWYgREVGQVVMVF9MQ0QKKyNkZWZpbmUgREVGQVVMVF9MQ0QgQ09ORklHX1BBTkVMX0xDRAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUEFORUxfTENEX1dJRFRICisjdW5kZWYgREVGQVVMVF9MQ0RfV0lEVEgKKyNkZWZpbmUgREVGQVVMVF9MQ0RfV0lEVEggQ09ORklHX1BBTkVMX0xDRF9XSURUSAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUEFORUxfTENEX0JXSURUSAorI3VuZGVmIERFRkFVTFRfTENEX0JXSURUSAorI2RlZmluZSBERUZBVUxUX0xDRF9CV0lEVEggQ09ORklHX1BBTkVMX0xDRF9CV0lEVEgKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BBTkVMX0xDRF9IV0lEVEgKKyN1bmRlZiBERUZBVUxUX0xDRF9IV0lEVEgKKyNkZWZpbmUgREVGQVVMVF9MQ0RfSFdJRFRIIENPTkZJR19QQU5FTF9MQ0RfSFdJRFRICisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQU5FTF9MQ0RfSEVJR0hUCisjdW5kZWYgREVGQVVMVF9MQ0RfSEVJR0hUCisjZGVmaW5lIERFRkFVTFRfTENEX0hFSUdIVCBDT05GSUdfUEFORUxfTENEX0hFSUdIVAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUEFORUxfTENEX1BST1RPCisjdW5kZWYgREVGQVVMVF9MQ0RfUFJPVE8KKyNkZWZpbmUgREVGQVVMVF9MQ0RfUFJPVE8gQ09ORklHX1BBTkVMX0xDRF9QUk9UTworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUEFORUxfTENEX1BJTl9FCisjdW5kZWYgREVGQVVMVF9MQ0RfUElOX0UKKyNkZWZpbmUgREVGQVVMVF9MQ0RfUElOX0UgQ09ORklHX1BBTkVMX0xDRF9QSU5fRQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUEFORUxfTENEX1BJTl9SUworI3VuZGVmIERFRkFVTFRfTENEX1BJTl9SUworI2RlZmluZSBERUZBVUxUX0xDRF9QSU5fUlMgQ09ORklHX1BBTkVMX0xDRF9QSU5fUlMKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BBTkVMX0xDRF9QSU5fUlcKKyN1bmRlZiBERUZBVUxUX0xDRF9QSU5fUlcKKyNkZWZpbmUgREVGQVVMVF9MQ0RfUElOX1JXIENPTkZJR19QQU5FTF9MQ0RfUElOX1JXCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQU5FTF9MQ0RfUElOX1NDTAorI3VuZGVmIERFRkFVTFRfTENEX1BJTl9TQ0wKKyNkZWZpbmUgREVGQVVMVF9MQ0RfUElOX1NDTCBDT05GSUdfUEFORUxfTENEX1BJTl9TQ0wKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BBTkVMX0xDRF9QSU5fU0RBCisjdW5kZWYgREVGQVVMVF9MQ0RfUElOX1NEQQorI2RlZmluZSBERUZBVUxUX0xDRF9QSU5fU0RBIENPTkZJR19QQU5FTF9MQ0RfUElOX1NEQQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUEFORUxfTENEX1BJTl9CTAorI3VuZGVmIERFRkFVTFRfTENEX1BJTl9CTAorI2RlZmluZSBERUZBVUxUX0xDRF9QSU5fQkwgQ09ORklHX1BBTkVMX0xDRF9QSU5fQkwKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BBTkVMX0xDRF9DSEFSU0VUCisjdW5kZWYgREVGQVVMVF9MQ0RfQ0hBUlNFVAorI2RlZmluZSBERUZBVUxUX0xDRF9DSEFSU0VUCisjZW5kaWYKKworI2VuZGlmIC8qIERFRkFVTFRfUFJPRklMRSA9PSAwICovCisKKy8qIGdsb2JhbCB2YXJpYWJsZXMgKi8KK3N0YXRpYyBpbnQga2V5cGFkX29wZW5fY250OwkvKiAjdGltZXMgb3BlbmVkICovCitzdGF0aWMgaW50IGxjZF9vcGVuX2NudDsJLyogI3RpbWVzIG9wZW5lZCAqLworc3RhdGljIHN0cnVjdCBwYXJkZXZpY2UgKnBwcnQ7CisKK3N0YXRpYyBpbnQgbGNkX2luaXRpYWxpemVkOworc3RhdGljIGludCBrZXlwYWRfaW5pdGlhbGl6ZWQ7CisKK3N0YXRpYyBpbnQgbGlnaHRfdGVtcG87CisKK3N0YXRpYyBjaGFyIGxjZF9tdXN0X2NsZWFyOworc3RhdGljIGNoYXIgbGNkX2xlZnRfc2hpZnQ7CitzdGF0aWMgY2hhciBpbml0X2luX3Byb2dyZXNzOworCitzdGF0aWMgdm9pZCAoKmxjZF93cml0ZV9jbWQpIChpbnQpOworc3RhdGljIHZvaWQgKCpsY2Rfd3JpdGVfZGF0YSkgKGludCk7CitzdGF0aWMgdm9pZCAoKmxjZF9jbGVhcl9mYXN0KSAodm9pZCk7CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socHBydF9sb2NrKTsKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBzY2FuX3RpbWVyOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkdlbmVyaWMgcGFyYWxsZWwgcG9ydCBMQ0QvS2V5cGFkIGRyaXZlciIpOworCitzdGF0aWMgaW50IHBhcnBvcnQgPSAtMTsKK21vZHVsZV9wYXJhbShwYXJwb3J0LCBpbnQsIDAwMDApOworTU9EVUxFX1BBUk1fREVTQyhwYXJwb3J0LCAiUGFyYWxsZWwgcG9ydCBpbmRleCAoMD1scHQxLCAxPWxwdDIsIC4uLikiKTsKKworc3RhdGljIGludCBsY2RfaGVpZ2h0ID0gLTE7Cittb2R1bGVfcGFyYW0obGNkX2hlaWdodCwgaW50LCAwMDAwKTsKK01PRFVMRV9QQVJNX0RFU0MobGNkX2hlaWdodCwgIk51bWJlciBvZiBsaW5lcyBvbiB0aGUgTENEIik7CisKK3N0YXRpYyBpbnQgbGNkX3dpZHRoID0gLTE7Cittb2R1bGVfcGFyYW0obGNkX3dpZHRoLCBpbnQsIDAwMDApOworTU9EVUxFX1BBUk1fREVTQyhsY2Rfd2lkdGgsICJOdW1iZXIgb2YgY29sdW1ucyBvbiB0aGUgTENEIik7CisKK3N0YXRpYyBpbnQgbGNkX2J3aWR0aCA9IC0xOwkvKiBpbnRlcm5hbCBidWZmZXIgd2lkdGggKHVzdWFsbHkgNDApICovCittb2R1bGVfcGFyYW0obGNkX2J3aWR0aCwgaW50LCAwMDAwKTsKK01PRFVMRV9QQVJNX0RFU0MobGNkX2J3aWR0aCwgIkludGVybmFsIExDRCBsaW5lIHdpZHRoICg0MCkiKTsKKworc3RhdGljIGludCBsY2RfaHdpZHRoID0gLTE7CS8qIGhhcmR3YXJlIGJ1ZmZlciB3aWR0aCAodXN1YWxseSA2NCkgKi8KK21vZHVsZV9wYXJhbShsY2RfaHdpZHRoLCBpbnQsIDAwMDApOworTU9EVUxFX1BBUk1fREVTQyhsY2RfaHdpZHRoLCAiTENEIGxpbmUgaGFyZHdhcmUgYWRkcmVzcyAoNjQpIik7CisKK3N0YXRpYyBpbnQgbGNkX2VuYWJsZWQgPSAtMTsKK21vZHVsZV9wYXJhbShsY2RfZW5hYmxlZCwgaW50LCAwMDAwKTsKK01PRFVMRV9QQVJNX0RFU0MobGNkX2VuYWJsZWQsICJEZXByZWNhdGVkIG9wdGlvbiwgdXNlIGxjZF90eXBlIGluc3RlYWQiKTsKKworc3RhdGljIGludCBrZXlwYWRfZW5hYmxlZCA9IC0xOworbW9kdWxlX3BhcmFtKGtleXBhZF9lbmFibGVkLCBpbnQsIDAwMDApOworTU9EVUxFX1BBUk1fREVTQyhrZXlwYWRfZW5hYmxlZCwgIkRlcHJlY2F0ZWQgb3B0aW9uLCB1c2Uga2V5cGFkX3R5cGUgaW5zdGVhZCIpOworCitzdGF0aWMgaW50IGxjZF90eXBlID0gLTE7Cittb2R1bGVfcGFyYW0obGNkX3R5cGUsIGludCwgMDAwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGxjZF90eXBlLAorCQkgIkxDRCB0eXBlOiAwPW5vbmUsIDE9b2xkIC8vLCAyPXNlcmlhbCBrczAwNzQsIDM9aGFudHJvbml4IC8vLCA0PW5leGNvbSAvLywgNT1jb21waWxlZC1pbiIpOworCitzdGF0aWMgaW50IGxjZF9wcm90byA9IC0xOworbW9kdWxlX3BhcmFtKGxjZF9wcm90bywgaW50LCAwMDAwKTsKK01PRFVMRV9QQVJNX0RFU0MobGNkX3Byb3RvLCAiTENEIGNvbW11bmljYXRpb246IDA9cGFyYWxsZWwgKC8vKSwgMT1zZXJpYWwiKTsKKworc3RhdGljIGludCBsY2RfY2hhcnNldCA9IC0xOworbW9kdWxlX3BhcmFtKGxjZF9jaGFyc2V0LCBpbnQsIDAwMDApOworTU9EVUxFX1BBUk1fREVTQyhsY2RfY2hhcnNldCwgIkxDRCBjaGFyYWN0ZXIgc2V0OiAwPXN0YW5kYXJkLCAxPUtTMDA3NCIpOworCitzdGF0aWMgaW50IGtleXBhZF90eXBlID0gLTE7Cittb2R1bGVfcGFyYW0oa2V5cGFkX3R5cGUsIGludCwgMDAwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGtleXBhZF90eXBlLAorCQkgIktleXBhZCB0eXBlOiAwPW5vbmUsIDE9b2xkIDYga2V5cywgMj1uZXcgNisxIGtleXMsIDM9bmV4Y29tIDQga2V5cyIpOworCitzdGF0aWMgaW50IHByb2ZpbGUgPSBERUZBVUxUX1BST0ZJTEU7Cittb2R1bGVfcGFyYW0ocHJvZmlsZSwgaW50LCAwMDAwKTsKK01PRFVMRV9QQVJNX0RFU0MocHJvZmlsZSwKKwkJICIxPTE2eDIgb2xkIGtwOyAyPXNlcmlhbCAxNngyLCBuZXcga3A7IDM9MTZ4MiBoYW50cm9uaXg7IDQ9MTZ4MiBuZXhjb207IGRlZmF1bHQ9NDB4Miwgb2xkIGtwIik7CisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIHBhcmFsbGVsIHBvcnQgcGlucyB0aGUgTENEIGNvbnRyb2wgc2lnbmFscyBhcmUgY29ubmVjdGVkIHRvLgorICogU2V0IHRoaXMgdG8gMCBpZiB0aGUgc2lnbmFsIGlzIG5vdCB1c2VkLiBTZXQgaXQgdG8gaXRzIG9wcG9zaXRlIHZhbHVlCisgKiAobmVnYXRpdmUpIGlmIHRoZSBzaWduYWwgaXMgbmVnYXRlZC4gLU1BWElOVCBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlCisgKiBwaW4gaGFzIG5vdCBiZWVuIGV4cGxpY2l0bHkgc3BlY2lmaWVkLgorICoKKyAqIFdBUk5JTkchIG5vIGNoZWNrIHdpbGwgYmUgcGVyZm9ybWVkIGFib3V0IGNvbGxpc2lvbnMgd2l0aCBrZXlwYWQgIQorICovCisKK3N0YXRpYyBpbnQgbGNkX2VfcGluICA9IFBJTl9OT1RfU0VUOworbW9kdWxlX3BhcmFtKGxjZF9lX3BpbiwgaW50LCAwMDAwKTsKK01PRFVMRV9QQVJNX0RFU0MobGNkX2VfcGluLAorCQkgIiMgb2YgdGhlIC8vIHBvcnQgcGluIGNvbm5lY3RlZCB0byBMQ0QgJ0UnIHNpZ25hbCwgd2l0aCBwb2xhcml0eSAoLTE3Li4xNykiKTsKKworc3RhdGljIGludCBsY2RfcnNfcGluID0gUElOX05PVF9TRVQ7Cittb2R1bGVfcGFyYW0obGNkX3JzX3BpbiwgaW50LCAwMDAwKTsKK01PRFVMRV9QQVJNX0RFU0MobGNkX3JzX3BpbiwKKwkJICIjIG9mIHRoZSAvLyBwb3J0IHBpbiBjb25uZWN0ZWQgdG8gTENEICdSUycgc2lnbmFsLCB3aXRoIHBvbGFyaXR5ICgtMTcuLjE3KSIpOworCitzdGF0aWMgaW50IGxjZF9yd19waW4gPSBQSU5fTk9UX1NFVDsKK21vZHVsZV9wYXJhbShsY2RfcndfcGluLCBpbnQsIDAwMDApOworTU9EVUxFX1BBUk1fREVTQyhsY2RfcndfcGluLAorCQkgIiMgb2YgdGhlIC8vIHBvcnQgcGluIGNvbm5lY3RlZCB0byBMQ0QgJ1JXJyBzaWduYWwsIHdpdGggcG9sYXJpdHkgKC0xNy4uMTcpIik7CisKK3N0YXRpYyBpbnQgbGNkX2JsX3BpbiA9IFBJTl9OT1RfU0VUOworbW9kdWxlX3BhcmFtKGxjZF9ibF9waW4sIGludCwgMDAwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGxjZF9ibF9waW4sCisJCSAiIyBvZiB0aGUgLy8gcG9ydCBwaW4gY29ubmVjdGVkIHRvIExDRCBiYWNrbGlnaHQsIHdpdGggcG9sYXJpdHkgKC0xNy4uMTcpIik7CisKK3N0YXRpYyBpbnQgbGNkX2RhX3BpbiA9IFBJTl9OT1RfU0VUOworbW9kdWxlX3BhcmFtKGxjZF9kYV9waW4sIGludCwgMDAwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGxjZF9kYV9waW4sCisJCSAiIyBvZiB0aGUgLy8gcG9ydCBwaW4gY29ubmVjdGVkIHRvIHNlcmlhbCBMQ0QgJ1NEQScgc2lnbmFsLCB3aXRoIHBvbGFyaXR5ICgtMTcuLjE3KSIpOworCitzdGF0aWMgaW50IGxjZF9jbF9waW4gPSBQSU5fTk9UX1NFVDsKK21vZHVsZV9wYXJhbShsY2RfY2xfcGluLCBpbnQsIDAwMDApOworTU9EVUxFX1BBUk1fREVTQyhsY2RfY2xfcGluLAorCQkgIiMgb2YgdGhlIC8vIHBvcnQgcGluIGNvbm5lY3RlZCB0byBzZXJpYWwgTENEICdTQ0wnIHNpZ25hbCwgd2l0aCBwb2xhcml0eSAoLTE3Li4xNykiKTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKmxjZF9jaGFyX2NvbnY7CisKKy8qIGZvciBzb21lIExDRCBkcml2ZXJzIChrczAwNzQpIHdlIG5lZWQgYSBjaGFyc2V0IGNvbnZlcnNpb24gdGFibGUuICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBsY2RfY2hhcl9jb252X2tzMDA3NFsyNTZdID0geworCS8qICAgICAgICAgIDB8OCAgIDF8OSAgIDJ8QSAgIDN8QiAgIDR8QyAgIDV8RCAgIDZ8RSAgIDd8RiAqLworCS8qIDB4MDAgKi8gMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKKwkvKiAweDA4ICovIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsCisJLyogMHgxMCAqLyAweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LAorCS8qIDB4MTggKi8gMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwKKwkvKiAweDIwICovIDB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4YTIsIDB4MjUsIDB4MjYsIDB4MjcsCisJLyogMHgyOCAqLyAweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLAorCS8qIDB4MzAgKi8gMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywKKwkvKiAweDM4ICovIDB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsCisJLyogMHg0MCAqLyAweGEwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LAorCS8qIDB4NDggKi8gMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwKKwkvKiAweDUwICovIDB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsCisJLyogMHg1OCAqLyAweDU4LCAweDU5LCAweDVhLCAweGZhLCAweGZiLCAweGZjLCAweDFkLCAweGM0LAorCS8qIDB4NjAgKi8gMHg5NiwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywKKwkvKiAweDY4ICovIDB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsCisJLyogMHg3MCAqLyAweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LAorCS8qIDB4NzggKi8gMHg3OCwgMHg3OSwgMHg3YSwgMHhmZCwgMHhmZSwgMHhmZiwgMHhjZSwgMHgyMCwKKwkvKiAweDgwICovIDB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsCisJLyogMHg4OCAqLyAweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLAorCS8qIDB4OTAgKi8gMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywKKwkvKiAweDk4ICovIDB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsCisJLyogMHhBMCAqLyAweDIwLCAweDQwLCAweGIxLCAweGExLCAweDI0LCAweGEzLCAweGZlLCAweDVmLAorCS8qIDB4QTggKi8gMHgyMiwgMHhjOCwgMHg2MSwgMHgxNCwgMHg5NywgMHgyZCwgMHhhZCwgMHg5NiwKKwkvKiAweEIwICovIDB4ODAsIDB4OGMsIDB4ODIsIDB4ODMsIDB4MjcsIDB4OGYsIDB4ODYsIDB4ZGQsCisJLyogMHhCOCAqLyAweDJjLCAweDgxLCAweDZmLCAweDE1LCAweDhiLCAweDhhLCAweDg0LCAweDYwLAorCS8qIDB4QzAgKi8gMHhlMiwgMHhlMiwgMHhlMiwgMHg1YiwgMHg1YiwgMHhhZSwgMHhiYywgMHhhOSwKKwkvKiAweEM4ICovIDB4YzUsIDB4YmYsIDB4YzYsIDB4ZjEsIDB4ZTMsIDB4ZTMsIDB4ZTMsIDB4ZTMsCisJLyogMHhEMCAqLyAweDQ0LCAweDVkLCAweGE4LCAweGU0LCAweGVjLCAweGVjLCAweDVjLCAweDc4LAorCS8qIDB4RDggKi8gMHhhYiwgMHhhNiwgMHhlNSwgMHg1ZSwgMHg1ZSwgMHhlNiwgMHhhYSwgMHhiZSwKKwkvKiAweEUwICovIDB4N2YsIDB4ZTcsIDB4YWYsIDB4N2IsIDB4N2IsIDB4YWYsIDB4YmQsIDB4YzgsCisJLyogMHhFOCAqLyAweGE0LCAweGE1LCAweGM3LCAweGY2LCAweGE3LCAweGU4LCAweDY5LCAweDY5LAorCS8qIDB4RjAgKi8gMHhlZCwgMHg3ZCwgMHhhOCwgMHhlNCwgMHhlYywgMHg1YywgMHg1YywgMHgyNSwKKwkvKiAweEY4ICovIDB4YWMsIDB4YTYsIDB4ZWEsIDB4ZWYsIDB4N2UsIDB4ZWIsIDB4YjIsIDB4NzksCit9OworCitjaGFyIG9sZF9rZXlwYWRfcHJvZmlsZVtdWzRdWzldID0geworCXsiUzAiLCAiTGVmdFxuIiwgIkxlZnRcbiIsICIifSwKKwl7IlMxIiwgIkRvd25cbiIsICJEb3duXG4iLCAiIn0sCisJeyJTMiIsICJVcFxuIiwgIlVwXG4iLCAiIn0sCisJeyJTMyIsICJSaWdodFxuIiwgIlJpZ2h0XG4iLCAiIn0sCisJeyJTNCIsICJFc2NcbiIsICJFc2NcbiIsICIifSwKKwl7IlM1IiwgIlJldFxuIiwgIlJldFxuIiwgIiJ9LAorCXsiIiwgIiIsICIiLCAiIn0KK307CisKKy8qIHNpZ25hbHMsIHByZXNzLCByZXBlYXQsIHJlbGVhc2UgKi8KK2NoYXIgbmV3X2tleXBhZF9wcm9maWxlW11bNF1bOV0gPSB7CisJeyJTMCIsICJMZWZ0XG4iLCAiTGVmdFxuIiwgIiJ9LAorCXsiUzEiLCAiRG93blxuIiwgIkRvd25cbiIsICIifSwKKwl7IlMyIiwgIlVwXG4iLCAiVXBcbiIsICIifSwKKwl7IlMzIiwgIlJpZ2h0XG4iLCAiUmlnaHRcbiIsICIifSwKKwl7IlM0czUiLCAiIiwgIkVzY1xuIiwgIkVzY1xuIn0sCisJeyJzNFM1IiwgIiIsICJSZXRcbiIsICJSZXRcbiJ9LAorCXsiUzRTNSIsICJIZWxwXG4iLCAiIiwgIiJ9LAorCS8qIGFkZCBuZXcgc2lnbmFscyBhYm92ZSB0aGlzIGxpbmUgKi8KKwl7IiIsICIiLCAiIiwgIiJ9Cit9OworCisvKiBzaWduYWxzLCBwcmVzcywgcmVwZWF0LCByZWxlYXNlICovCitjaGFyIG5leGNvbV9rZXlwYWRfcHJvZmlsZVtdWzRdWzldID0geworCXsiYS1wLWUtIiwgIkRvd25cbiIsICJEb3duXG4iLCAiIn0sCisJeyJhLXAtRS0iLCAiUmV0XG4iLCAiUmV0XG4iLCAiIn0sCisJeyJhLVAtRS0iLCAiRXNjXG4iLCAiRXNjXG4iLCAiIn0sCisJeyJhLVAtZS0iLCAiVXBcbiIsICJVcFxuIiwgIiJ9LAorCS8qIGFkZCBuZXcgc2lnbmFscyBhYm92ZSB0aGlzIGxpbmUgKi8KKwl7IiIsICIiLCAiIiwgIiJ9Cit9OworCitzdGF0aWMgY2hhciAoKmtleXBhZF9wcm9maWxlKVs0XVs5XSA9IG9sZF9rZXlwYWRfcHJvZmlsZTsKKworLyogRklYTUU6IHRoaXMgc2hvdWxkIGJlIGNvbnZlcnRlZCB0byBhIGJpdCBhcnJheSBjb250YWluaW5nIHNpZ25hbHMgc3RhdGVzICovCitzdGF0aWMgc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyIGU7CS8qIHBhcmFsbGVsIExDRCBFICAgKGRhdGEgbGF0Y2ggb24gZmFsbGluZyBlZGdlKSAqLworCXVuc2lnbmVkIGNoYXIgcnM7CS8qIHBhcmFsbGVsIExDRCBSUyAgKDAgPSBjbWQsIDEgPSBkYXRhKSAqLworCXVuc2lnbmVkIGNoYXIgcnc7CS8qIHBhcmFsbGVsIExDRCBSL1cgKDAgPSBXLCAxID0gUikgKi8KKwl1bnNpZ25lZCBjaGFyIGJsOwkvKiBwYXJhbGxlbCBMQ0QgYmFja2xpZ2h0ICgwID0gb2ZmLCAxID0gb24pICovCisJdW5zaWduZWQgY2hhciBjbDsJLyogc2VyaWFsIExDRCBjbG9jayAobGF0Y2ggb24gcmlzaW5nIGVkZ2UpICovCisJdW5zaWduZWQgY2hhciBkYTsJLyogc2VyaWFsIExDRCBkYXRhICovCit9IGJpdHM7CisKK3N0YXRpYyB2b2lkIGluaXRfc2Nhbl90aW1lcih2b2lkKTsKKworLyogc2V0cyBkYXRhIHBvcnQgYml0cyBhY2NvcmRpbmcgdG8gY3VycmVudCBzaWduYWxzIHZhbHVlcyAqLworc3RhdGljIGludCBzZXRfZGF0YV9iaXRzKHZvaWQpCit7CisJaW50IHZhbCwgYml0OworCisJdmFsID0gcl9kdHIocHBydCk7CisJZm9yIChiaXQgPSAwOyBiaXQgPCBMQ0RfQklUUzsgYml0KyspCisJCXZhbCAmPSBsY2RfYml0c1tMQ0RfUE9SVF9EXVtiaXRdW0JJVF9NU0tdOworCisJdmFsIHw9IGxjZF9iaXRzW0xDRF9QT1JUX0RdW0xDRF9CSVRfRV1bYml0cy5lXQorCSAgICB8IGxjZF9iaXRzW0xDRF9QT1JUX0RdW0xDRF9CSVRfUlNdW2JpdHMucnNdCisJICAgIHwgbGNkX2JpdHNbTENEX1BPUlRfRF1bTENEX0JJVF9SV11bYml0cy5yd10KKwkgICAgfCBsY2RfYml0c1tMQ0RfUE9SVF9EXVtMQ0RfQklUX0JMXVtiaXRzLmJsXQorCSAgICB8IGxjZF9iaXRzW0xDRF9QT1JUX0RdW0xDRF9CSVRfQ0xdW2JpdHMuY2xdCisJICAgIHwgbGNkX2JpdHNbTENEX1BPUlRfRF1bTENEX0JJVF9EQV1bYml0cy5kYV07CisKKwl3X2R0cihwcHJ0LCB2YWwpOworCXJldHVybiB2YWw7Cit9CisKKy8qIHNldHMgY3RybCBwb3J0IGJpdHMgYWNjb3JkaW5nIHRvIGN1cnJlbnQgc2lnbmFscyB2YWx1ZXMgKi8KK3N0YXRpYyBpbnQgc2V0X2N0cmxfYml0cyh2b2lkKQoreworCWludCB2YWwsIGJpdDsKKworCXZhbCA9IHJfY3RyKHBwcnQpOworCWZvciAoYml0ID0gMDsgYml0IDwgTENEX0JJVFM7IGJpdCsrKQorCQl2YWwgJj0gbGNkX2JpdHNbTENEX1BPUlRfQ11bYml0XVtCSVRfTVNLXTsKKworCXZhbCB8PSBsY2RfYml0c1tMQ0RfUE9SVF9DXVtMQ0RfQklUX0VdW2JpdHMuZV0KKwkgICAgfCBsY2RfYml0c1tMQ0RfUE9SVF9DXVtMQ0RfQklUX1JTXVtiaXRzLnJzXQorCSAgICB8IGxjZF9iaXRzW0xDRF9QT1JUX0NdW0xDRF9CSVRfUlddW2JpdHMucnddCisJICAgIHwgbGNkX2JpdHNbTENEX1BPUlRfQ11bTENEX0JJVF9CTF1bYml0cy5ibF0KKwkgICAgfCBsY2RfYml0c1tMQ0RfUE9SVF9DXVtMQ0RfQklUX0NMXVtiaXRzLmNsXQorCSAgICB8IGxjZF9iaXRzW0xDRF9QT1JUX0NdW0xDRF9CSVRfREFdW2JpdHMuZGFdOworCisJd19jdHIocHBydCwgdmFsKTsKKwlyZXR1cm4gdmFsOworfQorCisvKiBzZXRzIGN0cmwgJiBkYXRhIHBvcnQgYml0cyBhY2NvcmRpbmcgdG8gY3VycmVudCBzaWduYWxzIHZhbHVlcyAqLworc3RhdGljIHZvaWQgc2V0X2JpdHModm9pZCkKK3sKKwlzZXRfZGF0YV9iaXRzKCk7CisJc2V0X2N0cmxfYml0cygpOworfQorCisvKgorICogQ29udmVydHMgYSBwYXJhbGxlbCBwb3J0IHBpbiAoZnJvbSAtMjUgdG8gMjUpIHRvIGRhdGEgYW5kIGNvbnRyb2wgcG9ydHMKKyAqIG1hc2tzLCBhbmQgZGF0YSBhbmQgY29udHJvbCBwb3J0IGJpdHMuIFRoZSBzaWduYWwgd2lsbCBiZSBjb25zaWRlcmVkCisgKiB1bmNvbm5lY3RlZCBpZiBpdCdzIG9uIHBpbiAwIG9yIGFuIGludmFsaWQgcGluICg8LTI1IG9yID4yNSkuCisgKgorICogUmVzdWx0IHdpbGwgYmUgdXNlZCB0aGlzIHdheSA6CisgKiAgIG91dChkcG9ydCwgaW4oZHBvcnQpICYgZF92YWxbMl0gfCBkX3ZhbFtzaWduYWxfc3RhdGVdKQorICogICBvdXQoY3BvcnQsIGluKGNwb3J0KSAmIGNfdmFsWzJdIHwgY192YWxbc2lnbmFsX3N0YXRlXSkKKyAqLwordm9pZCBwaW5fdG9fYml0cyhpbnQgcGluLCB1bnNpZ25lZCBjaGFyICpkX3ZhbCwgdW5zaWduZWQgY2hhciAqY192YWwpCit7CisJaW50IGRfYml0LCBjX2JpdCwgaW52OworCisJZF92YWxbMF0gPSBjX3ZhbFswXSA9IGRfdmFsWzFdID0gY192YWxbMV0gPSAwOworCWRfdmFsWzJdID0gY192YWxbMl0gPSAweEZGOworCisJaWYgKHBpbiA9PSAwKQorCQlyZXR1cm47CisKKwlpbnYgPSAocGluIDwgMCk7CisJaWYgKGludikKKwkJcGluID0gLXBpbjsKKworCWRfYml0ID0gY19iaXQgPSAwOworCisJc3dpdGNoIChwaW4pIHsKKwljYXNlIFBJTl9TVFJPQkU6CS8qIHN0cm9iZSwgaW52ZXJ0ZWQgKi8KKwkJY19iaXQgPSBQTkxfUFNUUk9CRTsKKwkJaW52ID0gIWludjsKKwkJYnJlYWs7CisJY2FzZSBQSU5fRDAuLi5QSU5fRDc6CS8qIEQwIC0gRDcgPSAyIC0gOSAqLworCQlkX2JpdCA9IDEgPDwgKHBpbiAtIDIpOworCQlicmVhazsKKwljYXNlIFBJTl9BVVRPTEY6CS8qIGF1dG9mZWVkLCBpbnZlcnRlZCAqLworCQljX2JpdCA9IFBOTF9QQVVUT0xGOworCQlpbnYgPSAhaW52OworCQlicmVhazsKKwljYXNlIFBJTl9JTklUUDoJLyogaW5pdCwgZGlyZWN0ICovCisJCWNfYml0ID0gUE5MX1BJTklUUDsKKwkJYnJlYWs7CisJY2FzZSBQSU5fU0VMRUNQOgkvKiBzZWxlY3RfaW4sIGludmVydGVkICovCisJCWNfYml0ID0gUE5MX1BTRUxFQ1A7CisJCWludiA9ICFpbnY7CisJCWJyZWFrOworCWRlZmF1bHQ6CQkvKiB1bmtub3duIHBpbiwgaWdub3JlICovCisJCWJyZWFrOworCX0KKworCWlmIChjX2JpdCkgeworCQljX3ZhbFsyXSAmPSB+Y19iaXQ7CisJCWNfdmFsWyFpbnZdID0gY19iaXQ7CisJfSBlbHNlIGlmIChkX2JpdCkgeworCQlkX3ZhbFsyXSAmPSB+ZF9iaXQ7CisJCWRfdmFsWyFpbnZdID0gZF9iaXQ7CisJfQorfQorCisvKiBzbGVlcHMgdGhhdCBtYW55IG1pbGxpc2Vjb25kcyB3aXRoIGEgcmVzY2hlZHVsZSAqLworc3RhdGljIHZvaWQgbG9uZ19zbGVlcChpbnQgbXMpCit7CisKKwlpZiAoaW5faW50ZXJydXB0KCkpCisJCW1kZWxheShtcyk7CisJZWxzZSB7CisJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCQlzY2hlZHVsZV90aW1lb3V0KChtcyAqIEhaICsgOTk5KSAvIDEwMDApOworCX0KK30KKworLyogc2VuZCBhIHNlcmlhbCBieXRlIHRvIHRoZSBMQ0QgcGFuZWwuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGxvY2tpbmcgaWYgbmVlZGVkLiAqLworc3RhdGljIHZvaWQgbGNkX3NlbmRfc2VyaWFsKGludCBieXRlKQoreworCWludCBiaXQ7CisKKwkvKiB0aGUgZGF0YSBiaXQgaXMgc2V0IG9uIEQwLCBhbmQgdGhlIGNsb2NrIG9uIFNUUk9CRS4KKwkgKiBMQ0QgcmVhZHMgRDAgb24gU1RST0JFJ3MgcmlzaW5nIGVkZ2UuCisJICovCisJZm9yIChiaXQgPSAwOyBiaXQgPCA4OyBiaXQrKykgeworCQliaXRzLmNsID0gQklUX0NMUjsJLyogQ0xLIGxvdyAqLworCQlzZXRfYml0cygpOworCQliaXRzLmRhID0gYnl0ZSAmIDE7CisJCXNldF9iaXRzKCk7CisJCXVkZWxheSgyKTsJLyogbWFpbnRhaW4gdGhlIGRhdGEgZHVyaW5nIDIgdXMgYmVmb3JlIENMSyB1cCAqLworCQliaXRzLmNsID0gQklUX1NFVDsJLyogQ0xLIGhpZ2ggKi8KKwkJc2V0X2JpdHMoKTsKKwkJdWRlbGF5KDEpOwkvKiBtYWludGFpbiB0aGUgc3Ryb2JlIGR1cmluZyAxIHVzICovCisJCWJ5dGUgPj49IDE7CisJfQorfQorCisvKiB0dXJuIHRoZSBiYWNrbGlnaHQgb24gb3Igb2ZmICovCitzdGF0aWMgdm9pZCBsY2RfYmFja2xpZ2h0KGludCBvbikKK3sKKwlpZiAobGNkX2JsX3BpbiA9PSBQSU5fTk9ORSkKKwkJcmV0dXJuOworCisJLyogVGhlIGJhY2tsaWdodCBpcyBhY3RpdmF0ZWQgYnkgc2V0aW5nIHRoZSBBVVRPRkVFRCBsaW5lIHRvICs1ViAgKi8KKwlzcGluX2xvY2soJnBwcnRfbG9jayk7CisJYml0cy5ibCA9IG9uOworCXNldF9iaXRzKCk7CisJc3Bpbl91bmxvY2soJnBwcnRfbG9jayk7Cit9CisKKy8qIHNlbmQgYSBjb21tYW5kIHRvIHRoZSBMQ0QgcGFuZWwgaW4gc2VyaWFsIG1vZGUgKi8KK3N0YXRpYyB2b2lkIGxjZF93cml0ZV9jbWRfcyhpbnQgY21kKQoreworCXNwaW5fbG9jaygmcHBydF9sb2NrKTsKKwlsY2Rfc2VuZF9zZXJpYWwoMHgxRik7CS8qIFIvVz1XLCBSUz0wICovCisJbGNkX3NlbmRfc2VyaWFsKGNtZCAmIDB4MEYpOworCWxjZF9zZW5kX3NlcmlhbCgoY21kID4+IDQpICYgMHgwRik7CisJdWRlbGF5KDQwKTsJCS8qIHRoZSBzaG9ydGVzdCBjb21tYW5kIHRha2VzIGF0IGxlYXN0IDQwIHVzICovCisJc3Bpbl91bmxvY2soJnBwcnRfbG9jayk7Cit9CisKKy8qIHNlbmQgZGF0YSB0byB0aGUgTENEIHBhbmVsIGluIHNlcmlhbCBtb2RlICovCitzdGF0aWMgdm9pZCBsY2Rfd3JpdGVfZGF0YV9zKGludCBkYXRhKQoreworCXNwaW5fbG9jaygmcHBydF9sb2NrKTsKKwlsY2Rfc2VuZF9zZXJpYWwoMHg1Rik7CS8qIFIvVz1XLCBSUz0xICovCisJbGNkX3NlbmRfc2VyaWFsKGRhdGEgJiAweDBGKTsKKwlsY2Rfc2VuZF9zZXJpYWwoKGRhdGEgPj4gNCkgJiAweDBGKTsKKwl1ZGVsYXkoNDApOwkJLyogdGhlIHNob3J0ZXN0IGRhdGEgdGFrZXMgYXQgbGVhc3QgNDAgdXMgKi8KKwlzcGluX3VubG9jaygmcHBydF9sb2NrKTsKK30KKworLyogc2VuZCBhIGNvbW1hbmQgdG8gdGhlIExDRCBwYW5lbCBpbiA4IGJpdHMgcGFyYWxsZWwgbW9kZSAqLworc3RhdGljIHZvaWQgbGNkX3dyaXRlX2NtZF9wOChpbnQgY21kKQoreworCXNwaW5fbG9jaygmcHBydF9sb2NrKTsKKwkvKiBwcmVzZW50IHRoZSBkYXRhIHRvIHRoZSBkYXRhIHBvcnQgKi8KKwl3X2R0cihwcHJ0LCBjbWQpOworCXVkZWxheSgyMCk7CQkvKiBtYWludGFpbiB0aGUgZGF0YSBkdXJpbmcgMjAgdXMgYmVmb3JlIHRoZSBzdHJvYmUgKi8KKworCWJpdHMuZSA9IEJJVF9TRVQ7CisJYml0cy5ycyA9IEJJVF9DTFI7CisJYml0cy5ydyA9IEJJVF9DTFI7CisJc2V0X2N0cmxfYml0cygpOworCisJdWRlbGF5KDQwKTsJCS8qIG1haW50YWluIHRoZSBzdHJvYmUgZHVyaW5nIDQwIHVzICovCisKKwliaXRzLmUgPSBCSVRfQ0xSOworCXNldF9jdHJsX2JpdHMoKTsKKworCXVkZWxheSgxMjApOwkJLyogdGhlIHNob3J0ZXN0IGNvbW1hbmQgdGFrZXMgYXQgbGVhc3QgMTIwIHVzICovCisJc3Bpbl91bmxvY2soJnBwcnRfbG9jayk7Cit9CisKKy8qIHNlbmQgZGF0YSB0byB0aGUgTENEIHBhbmVsIGluIDggYml0cyBwYXJhbGxlbCBtb2RlICovCitzdGF0aWMgdm9pZCBsY2Rfd3JpdGVfZGF0YV9wOChpbnQgZGF0YSkKK3sKKwlzcGluX2xvY2soJnBwcnRfbG9jayk7CisJLyogcHJlc2VudCB0aGUgZGF0YSB0byB0aGUgZGF0YSBwb3J0ICovCisJd19kdHIocHBydCwgZGF0YSk7CisJdWRlbGF5KDIwKTsJCS8qIG1haW50YWluIHRoZSBkYXRhIGR1cmluZyAyMCB1cyBiZWZvcmUgdGhlIHN0cm9iZSAqLworCisJYml0cy5lID0gQklUX1NFVDsKKwliaXRzLnJzID0gQklUX1NFVDsKKwliaXRzLnJ3ID0gQklUX0NMUjsKKwlzZXRfY3RybF9iaXRzKCk7CisKKwl1ZGVsYXkoNDApOwkJLyogbWFpbnRhaW4gdGhlIHN0cm9iZSBkdXJpbmcgNDAgdXMgKi8KKworCWJpdHMuZSA9IEJJVF9DTFI7CisJc2V0X2N0cmxfYml0cygpOworCisJdWRlbGF5KDQ1KTsJCS8qIHRoZSBzaG9ydGVzdCBkYXRhIHRha2VzIGF0IGxlYXN0IDQ1IHVzICovCisJc3Bpbl91bmxvY2soJnBwcnRfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGxjZF9nb3RveHkodm9pZCkKK3sKKwlsY2Rfd3JpdGVfY21kKDB4ODAJLyogc2V0IEREUkFNIGFkZHJlc3MgKi8KKwkJICAgICAgfCAobGNkX2FkZHJfeSA/IGxjZF9od2lkdGggOiAwKQorCQkgICAgICAvKiB3ZSBmb3JjZSB0aGUgY3Vyc29yIHRvIHN0YXkgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSBpZiBpdCB3YW50cyB0byBnbyBmYXJ0aGVyICovCisJCSAgICAgIHwgKChsY2RfYWRkcl94IDwgbGNkX2J3aWR0aCkgPyBsY2RfYWRkcl94ICYKKwkJCSAobGNkX2h3aWR0aCAtIDEpIDogbGNkX2J3aWR0aCAtIDEpKTsKK30KKworc3RhdGljIHZvaWQgbGNkX3ByaW50KGNoYXIgYykKK3sKKwlpZiAobGNkX2FkZHJfeCA8IGxjZF9id2lkdGgpIHsKKwkJaWYgKGxjZF9jaGFyX2NvbnYgIT0gTlVMTCkKKwkJCWMgPSBsY2RfY2hhcl9jb252Wyh1bnNpZ25lZCBjaGFyKWNdOworCQlsY2Rfd3JpdGVfZGF0YShjKTsKKwkJbGNkX2FkZHJfeCsrOworCX0KKwkvKiBwcmV2ZW50cyB0aGUgY3Vyc29yIGZyb20gd3JhcHBpbmcgb250byB0aGUgbmV4dCBsaW5lICovCisJaWYgKGxjZF9hZGRyX3ggPT0gbGNkX2J3aWR0aCkKKwkJbGNkX2dvdG94eSgpOworfQorCisvKiBmaWxscyB0aGUgZGlzcGxheSB3aXRoIHNwYWNlcyBhbmQgcmVzZXRzIFgvWSAqLworc3RhdGljIHZvaWQgbGNkX2NsZWFyX2Zhc3Rfcyh2b2lkKQoreworCWludCBwb3M7CisJbGNkX2FkZHJfeCA9IGxjZF9hZGRyX3kgPSAwOworCWxjZF9nb3RveHkoKTsKKworCXNwaW5fbG9jaygmcHBydF9sb2NrKTsKKwlmb3IgKHBvcyA9IDA7IHBvcyA8IGxjZF9oZWlnaHQgKiBsY2RfaHdpZHRoOyBwb3MrKykgeworCQlsY2Rfc2VuZF9zZXJpYWwoMHg1Rik7CS8qIFIvVz1XLCBSUz0xICovCisJCWxjZF9zZW5kX3NlcmlhbCgnICcgJiAweDBGKTsKKwkJbGNkX3NlbmRfc2VyaWFsKCgnICcgPj4gNCkgJiAweDBGKTsKKwkJdWRlbGF5KDQwKTsJLyogdGhlIHNob3J0ZXN0IGRhdGEgdGFrZXMgYXQgbGVhc3QgNDAgdXMgKi8KKwl9CisJc3Bpbl91bmxvY2soJnBwcnRfbG9jayk7CisKKwlsY2RfYWRkcl94ID0gbGNkX2FkZHJfeSA9IDA7CisJbGNkX2dvdG94eSgpOworfQorCisvKiBmaWxscyB0aGUgZGlzcGxheSB3aXRoIHNwYWNlcyBhbmQgcmVzZXRzIFgvWSAqLworc3RhdGljIHZvaWQgbGNkX2NsZWFyX2Zhc3RfcDgodm9pZCkKK3sKKwlpbnQgcG9zOworCWxjZF9hZGRyX3ggPSBsY2RfYWRkcl95ID0gMDsKKwlsY2RfZ290b3h5KCk7CisKKwlzcGluX2xvY2soJnBwcnRfbG9jayk7CisJZm9yIChwb3MgPSAwOyBwb3MgPCBsY2RfaGVpZ2h0ICogbGNkX2h3aWR0aDsgcG9zKyspIHsKKwkJLyogcHJlc2VudCB0aGUgZGF0YSB0byB0aGUgZGF0YSBwb3J0ICovCisJCXdfZHRyKHBwcnQsICcgJyk7CisJCXVkZWxheSgyMCk7CS8qIG1haW50YWluIHRoZSBkYXRhIGR1cmluZyAyMCB1cyBiZWZvcmUgdGhlIHN0cm9iZSAqLworCisJCWJpdHMuZSA9IEJJVF9TRVQ7CisJCWJpdHMucnMgPSBCSVRfU0VUOworCQliaXRzLnJ3ID0gQklUX0NMUjsKKwkJc2V0X2N0cmxfYml0cygpOworCisJCXVkZWxheSg0MCk7CS8qIG1haW50YWluIHRoZSBzdHJvYmUgZHVyaW5nIDQwIHVzICovCisKKwkJYml0cy5lID0gQklUX0NMUjsKKwkJc2V0X2N0cmxfYml0cygpOworCisJCXVkZWxheSg0NSk7CS8qIHRoZSBzaG9ydGVzdCBkYXRhIHRha2VzIGF0IGxlYXN0IDQ1IHVzICovCisJfQorCXNwaW5fdW5sb2NrKCZwcHJ0X2xvY2spOworCisJbGNkX2FkZHJfeCA9IGxjZF9hZGRyX3kgPSAwOworCWxjZF9nb3RveHkoKTsKK30KKworLyogY2xlYXJzIHRoZSBkaXNwbGF5IGFuZCByZXNldHMgWC9ZICovCitzdGF0aWMgdm9pZCBsY2RfY2xlYXJfZGlzcGxheSh2b2lkKQoreworCWxjZF93cml0ZV9jbWQoMHgwMSk7CS8qIGNsZWFyIGRpc3BsYXkgKi8KKwlsY2RfYWRkcl94ID0gbGNkX2FkZHJfeSA9IDA7CisJLyogd2UgbXVzdCB3YWl0IGEgZmV3IG1pbGxpc2Vjb25kcyAoMTUpICovCisJbG9uZ19zbGVlcCgxNSk7Cit9CisKK3N0YXRpYyB2b2lkIGxjZF9pbml0X2Rpc3BsYXkodm9pZCkKK3sKKworCWxjZF9mbGFncyA9ICgobGNkX2hlaWdodCA+IDEpID8gTENEX0ZMQUdfTiA6IDApCisJICAgIHwgTENEX0ZMQUdfRCB8IExDRF9GTEFHX0MgfCBMQ0RfRkxBR19COworCisJbG9uZ19zbGVlcCgyMCk7CQkvKiB3YWl0IDIwIG1zIGFmdGVyIHBvd2VyLXVwIGZvciB0aGUgcGFyYW5vaWQgKi8KKworCWxjZF93cml0ZV9jbWQoMHgzMCk7CS8qIDhiaXRzLCAxIGxpbmUsIHNtYWxsIGZvbnRzICovCisJbG9uZ19zbGVlcCgxMCk7CisJbGNkX3dyaXRlX2NtZCgweDMwKTsJLyogOGJpdHMsIDEgbGluZSwgc21hbGwgZm9udHMgKi8KKwlsb25nX3NsZWVwKDEwKTsKKwlsY2Rfd3JpdGVfY21kKDB4MzApOwkvKiA4Yml0cywgMSBsaW5lLCBzbWFsbCBmb250cyAqLworCWxvbmdfc2xlZXAoMTApOworCisJbGNkX3dyaXRlX2NtZCgweDMwCS8qIHNldCBmb250IGhlaWdodCBhbmQgbGluZXMgbnVtYmVyICovCisJCSAgICAgIHwgKChsY2RfZmxhZ3MgJiBMQ0RfRkxBR19GKSA/IDQgOiAwKQorCQkgICAgICB8ICgobGNkX2ZsYWdzICYgTENEX0ZMQUdfTikgPyA4IDogMCkKKwkgICAgKTsKKwlsb25nX3NsZWVwKDEwKTsKKworCWxjZF93cml0ZV9jbWQoMHgwOCk7CS8qIGRpc3BsYXkgb2ZmLCBjdXJzb3Igb2ZmLCBibGluayBvZmYgKi8KKwlsb25nX3NsZWVwKDEwKTsKKworCWxjZF93cml0ZV9jbWQoMHgwOAkvKiBzZXQgZGlzcGxheSBtb2RlICovCisJCSAgICAgIHwgKChsY2RfZmxhZ3MgJiBMQ0RfRkxBR19EKSA/IDQgOiAwKQorCQkgICAgICB8ICgobGNkX2ZsYWdzICYgTENEX0ZMQUdfQykgPyAyIDogMCkKKwkJICAgICAgfCAoKGxjZF9mbGFncyAmIExDRF9GTEFHX0IpID8gMSA6IDApCisJICAgICk7CisKKwlsY2RfYmFja2xpZ2h0KChsY2RfZmxhZ3MgJiBMQ0RfRkxBR19MKSA/IDEgOiAwKTsKKworCWxvbmdfc2xlZXAoMTApOworCisJbGNkX3dyaXRlX2NtZCgweDA2KTsJLyogZW50cnkgbW9kZSBzZXQgOiBpbmNyZW1lbnQsIGN1cnNvciBzaGlmdGluZyAqLworCisJbGNkX2NsZWFyX2Rpc3BsYXkoKTsKK30KKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgZmlsZSBvcGVyYXRpb24gZnVuY3Rpb24gZm9yIHVzZXIgYWNjZXNzIHRvIC9kZXYvbGNkCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBhbHNvIGJlIGNhbGxlZCBmcm9tIGluc2lkZSB0aGUga2VybmVsLCBieQorICogc2V0dGluZyBmaWxlIGFuZCBwcG9zIHRvIE5VTEwuCisgKgorICovCisKK3N0YXRpYyBzc2l6ZV90IGxjZF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCisJY29uc3QgY2hhciAqdG1wID0gYnVmOworCWNoYXIgYzsKKworCWZvciAoOyBjb3VudC0tID4gMDsgKHBwb3MgPyAoKnBwb3MpKysgOiAwKSwgKyt0bXApIHsKKwkJaWYgKCFpbl9pbnRlcnJ1cHQoKSAmJiAoKChjb3VudCArIDEpICYgMHgxZikgPT0gMCkpCisJCQlzY2hlZHVsZSgpOwkvKiBsZXQncyBiZSBhIGxpdHRsZSBuaWNlIHdpdGggb3RoZXIgcHJvY2Vzc2VzIHRoYXQgbmVlZCBzb21lIENQVSAqLworCisJCWlmIChwcG9zID09IE5VTEwgJiYgZmlsZSA9PSBOVUxMKQorCQkJYyA9ICp0bXA7CS8qIGxldCdzIG5vdCB1c2UgZ2V0X3VzZXIoKSBmcm9tIHRoZSBrZXJuZWwgISAqLworCQllbHNlIGlmIChnZXRfdXNlcihjLCB0bXApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJLyogZmlyc3QsIHdlJ2xsIHRlc3QgaWYgd2UncmUgaW4gZXNjYXBlIG1vZGUgKi8KKwkJaWYgKChjICE9ICdcbicpICYmIGxjZF9lc2NhcGVfbGVuID49IDApIHsJLyogeWVzLCBsZXQncyBhZGQgdGhpcyBjaGFyIHRvIHRoZSBidWZmZXIgKi8KKwkJCWxjZF9lc2NhcGVbbGNkX2VzY2FwZV9sZW4rK10gPSBjOworCQkJbGNkX2VzY2FwZVtsY2RfZXNjYXBlX2xlbl0gPSAwOworCQl9IGVsc2UgeworCQkJbGNkX2VzY2FwZV9sZW4gPSAtMTsJLyogYWJvcnRzIGFueSBwcmV2aW91cyBlc2NhcGUgc2VxdWVuY2UgKi8KKworCQkJc3dpdGNoIChjKSB7CisJCQljYXNlIExDRF9FU0NBUEVfQ0hBUjoJLyogc3RhcnQgb2YgYW4gZXNjYXBlIHNlcXVlbmNlICovCisJCQkJbGNkX2VzY2FwZV9sZW4gPSAwOworCQkJCWxjZF9lc2NhcGVbbGNkX2VzY2FwZV9sZW5dID0gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1xiJzoJLyogZ28gYmFjayBvbmUgY2hhciBhbmQgY2xlYXIgaXQgKi8KKwkJCQlpZiAobGNkX2FkZHJfeCA+IDApIHsKKwkJCQkJaWYgKGxjZF9hZGRyX3ggPCBsY2RfYndpZHRoKQkvKiBjaGVjayBpZiB3ZSdyZSBub3QgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSAqLworCQkJCQkJbGNkX3dyaXRlX2NtZCgweDEwKTsJLyogYmFjayBvbmUgY2hhciAqLworCQkJCQlsY2RfYWRkcl94LS07CisJCQkJfQorCQkJCWxjZF93cml0ZV9kYXRhKCcgJyk7CS8qIHJlcGxhY2Ugd2l0aCBhIHNwYWNlICovCisJCQkJbGNkX3dyaXRlX2NtZCgweDEwKTsJLyogYmFjayBvbmUgY2hhciBhZ2FpbiAqLworCQkJCWJyZWFrOworCQkJY2FzZSAnXDAxNCc6CS8qIHF1aWNrbHkgY2xlYXIgdGhlIGRpc3BsYXkgKi8KKwkJCQlsY2RfY2xlYXJfZmFzdCgpOworCQkJCWJyZWFrOworCQkJY2FzZSAnXG4nOgkvKiBmbHVzaCB0aGUgcmVtYWluZGVyIG9mIHRoZSBjdXJyZW50IGxpbmUgYW5kIGdvIHRvIHRoZQorCQkJCQkgICBiZWdpbm5pbmcgb2YgdGhlIG5leHQgbGluZSAqLworCQkJCWZvciAoOyBsY2RfYWRkcl94IDwgbGNkX2J3aWR0aDsgbGNkX2FkZHJfeCsrKQorCQkJCQlsY2Rfd3JpdGVfZGF0YSgnICcpOworCQkJCWxjZF9hZGRyX3ggPSAwOworCQkJCWxjZF9hZGRyX3kgPSAobGNkX2FkZHJfeSArIDEpICUgbGNkX2hlaWdodDsKKwkJCQlsY2RfZ290b3h5KCk7CisJCQkJYnJlYWs7CisJCQljYXNlICdccic6CS8qIGdvIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNhbWUgbGluZSAqLworCQkJCWxjZF9hZGRyX3ggPSAwOworCQkJCWxjZF9nb3RveHkoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1x0JzoJLyogcHJpbnQgYSBzcGFjZSBpbnN0ZWFkIG9mIHRoZSB0YWIgKi8KKwkJCQlsY2RfcHJpbnQoJyAnKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CS8qIHNpbXBseSBwcmludCB0aGlzIGNoYXIgKi8KKwkJCQlsY2RfcHJpbnQoYyk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvKiBub3cgd2UnbGwgc2VlIGlmIHdlJ3JlIGluIGFuIGVzY2FwZSBtb2RlIGFuZCBpZiB0aGUgY3VycmVudAorCQkgICBlc2NhcGUgc2VxdWVuY2UgY2FuIGJlIHVuZGVyc3Rvb2QuCisJCSAqLworCQlpZiAobGNkX2VzY2FwZV9sZW4gPj0gMikgewkvKiBtaW5pbWFsIGxlbmd0aCBmb3IgYW4gZXNjYXBlIGNvbW1hbmQgKi8KKwkJCWludCBwcm9jZXNzZWQgPSAwOwkvKiAxIG1lYW5zIHRoZSBjb21tYW5kIGhhcyBiZWVuIHByb2Nlc3NlZCAqLworCisJCQlpZiAoIXN0cmNtcChsY2RfZXNjYXBlLCAiWzJKIikpIHsJLyogQ2xlYXIgdGhlIGRpc3BsYXkgKi8KKwkJCQlsY2RfY2xlYXJfZmFzdCgpOwkvKiBjbGVhciBkaXNwbGF5ICovCisJCQkJcHJvY2Vzc2VkID0gMTsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChsY2RfZXNjYXBlLCAiW0giKSkgewkvKiBDdXJzb3IgdG8gaG9tZSAqLworCQkJCWxjZF9hZGRyX3ggPSBsY2RfYWRkcl95ID0gMDsKKwkJCQlsY2RfZ290b3h5KCk7CisJCQkJcHJvY2Vzc2VkID0gMTsKKwkJCX0KKwkJCS8qIGNvZGVzIHN0YXJ0aW5nIHdpdGggXltbTCAqLworCQkJZWxzZSBpZiAoKGxjZF9lc2NhcGVfbGVuID49IDMpICYmCisJCQkJIChsY2RfZXNjYXBlWzBdID09ICdbJykgJiYgKGxjZF9lc2NhcGVbMV0gPT0gJ0wnKSkgewkvKiBMQ0Qgc3BlY2lhbCBjb2RlcyAqLworCisJCQkJY2hhciAqZXNjID0gbGNkX2VzY2FwZSArIDI7CisJCQkJaW50IG9sZGZsYWdzID0gbGNkX2ZsYWdzOworCisJCQkJLyogY2hlY2sgZm9yIGRpc3BsYXkgbW9kZSBmbGFncyAqLworCQkJCXN3aXRjaCAoKmVzYykgeworCQkJCWNhc2UgJ0QnOgkvKiBEaXNwbGF5IE9OICovCisJCQkJCWxjZF9mbGFncyB8PSBMQ0RfRkxBR19EOworCQkJCQlwcm9jZXNzZWQgPSAxOworCQkJCQlicmVhazsKKwkJCQljYXNlICdkJzoJLyogRGlzcGxheSBPRkYgKi8KKwkJCQkJbGNkX2ZsYWdzICY9IH5MQ0RfRkxBR19EOworCQkJCQlwcm9jZXNzZWQgPSAxOworCQkJCQlicmVhazsKKwkJCQljYXNlICdDJzoJLyogQ3Vyc29yIE9OICovCisJCQkJCWxjZF9mbGFncyB8PSBMQ0RfRkxBR19DOworCQkJCQlwcm9jZXNzZWQgPSAxOworCQkJCQlicmVhazsKKwkJCQljYXNlICdjJzoJLyogQ3Vyc29yIE9GRiAqLworCQkJCQlsY2RfZmxhZ3MgJj0gfkxDRF9GTEFHX0M7CisJCQkJCXByb2Nlc3NlZCA9IDE7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ0InOgkvKiBCbGluayBPTiAqLworCQkJCQlsY2RfZmxhZ3MgfD0gTENEX0ZMQUdfQjsKKwkJCQkJcHJvY2Vzc2VkID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnYic6CS8qIEJsaW5rIE9GRiAqLworCQkJCQlsY2RfZmxhZ3MgJj0gfkxDRF9GTEFHX0I7CisJCQkJCXByb2Nlc3NlZCA9IDE7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJysnOgkvKiBCYWNrIGxpZ2h0IE9OICovCisJCQkJCWxjZF9mbGFncyB8PSBMQ0RfRkxBR19MOworCQkJCQlwcm9jZXNzZWQgPSAxOworCQkJCQlicmVhazsKKwkJCQljYXNlICctJzoJLyogQmFjayBsaWdodCBPRkYgKi8KKwkJCQkJbGNkX2ZsYWdzICY9IH5MQ0RfRkxBR19MOworCQkJCQlwcm9jZXNzZWQgPSAxOworCQkJCQlicmVhazsKKwkJCQljYXNlICcqJzoJLyogZmxhc2ggYmFjayBsaWdodCB1c2luZyB0aGUga2V5cGFkIHRpbWVyICovCisJCQkJCWlmIChzY2FuX3RpbWVyLmZ1bmN0aW9uICE9IE5VTEwpIHsKKwkJCQkJCWlmIChsaWdodF90ZW1wbyA9PSAwCisJCQkJCQkgICAgJiYgKChsY2RfZmxhZ3MgJiBMQ0RfRkxBR19MKQorCQkJCQkJCT09IDApKQorCQkJCQkJCWxjZF9iYWNrbGlnaHQoMSk7CisJCQkJCQlsaWdodF90ZW1wbyA9IEZMQVNIX0xJR0hUX1RFTVBPOworCQkJCQl9CisJCQkJCXByb2Nlc3NlZCA9IDE7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ2YnOgkvKiBTbWFsbCBGb250ICovCisJCQkJCWxjZF9mbGFncyAmPSB+TENEX0ZMQUdfRjsKKwkJCQkJcHJvY2Vzc2VkID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnRic6CS8qIExhcmdlIEZvbnQgKi8KKwkJCQkJbGNkX2ZsYWdzIHw9IExDRF9GTEFHX0Y7CisJCQkJCXByb2Nlc3NlZCA9IDE7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ24nOgkvKiBPbmUgTGluZSAqLworCQkJCQlsY2RfZmxhZ3MgJj0gfkxDRF9GTEFHX047CisJCQkJCXByb2Nlc3NlZCA9IDE7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ04nOgkvKiBUd28gTGluZXMgKi8KKwkJCQkJbGNkX2ZsYWdzIHw9IExDRF9GTEFHX047CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAnbCc6CS8qIFNoaWZ0IEN1cnNvciBMZWZ0ICovCisJCQkJCWlmIChsY2RfYWRkcl94ID4gMCkgeworCQkJCQkJaWYgKGxjZF9hZGRyX3ggPCBsY2RfYndpZHRoKQorCQkJCQkJCWxjZF93cml0ZV9jbWQoMHgxMCk7CS8qIGJhY2sgb25lIGNoYXIgaWYgbm90IGF0IGVuZCBvZiBsaW5lICovCisJCQkJCQlsY2RfYWRkcl94LS07CisJCQkJCX0KKwkJCQkJcHJvY2Vzc2VkID0gMTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlICdyJzoJLyogc2hpZnQgY3Vyc29yIHJpZ2h0ICovCisJCQkJCWlmIChsY2RfYWRkcl94IDwgbGNkX3dpZHRoKSB7CisJCQkJCQlpZiAobGNkX2FkZHJfeCA8IChsY2RfYndpZHRoIC0gMSkpCisJCQkJCQkJbGNkX3dyaXRlX2NtZCgweDE0KTsJLyogYWxsb3cgdGhlIGN1cnNvciB0byBwYXNzIHRoZSBlbmQgb2YgdGhlIGxpbmUgKi8KKwkJCQkJCWxjZF9hZGRyX3grKzsKKwkJCQkJfQorCQkJCQlwcm9jZXNzZWQgPSAxOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgJ0wnOgkvKiBzaGlmdCBkaXNwbGF5IGxlZnQgKi8KKwkJCQkJbGNkX2xlZnRfc2hpZnQrKzsKKwkJCQkJbGNkX3dyaXRlX2NtZCgweDE4KTsKKwkJCQkJcHJvY2Vzc2VkID0gMTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlICdSJzoJLyogc2hpZnQgZGlzcGxheSByaWdodCAqLworCQkJCQlsY2RfbGVmdF9zaGlmdC0tOworCQkJCQlsY2Rfd3JpdGVfY21kKDB4MUMpOworCQkJCQlwcm9jZXNzZWQgPSAxOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgJ2snOnsJLyoga2lsbCBlbmQgb2YgbGluZSAqLworCQkJCQkJaW50IHg7CisJCQkJCQlmb3IgKHggPSBsY2RfYWRkcl94OyB4IDwgbGNkX2J3aWR0aDsgeCsrKQorCQkJCQkJCWxjZF93cml0ZV9kYXRhKCcgJyk7CisJCQkJCQlsY2RfZ290b3h5KCk7CS8qIHJlc3RvcmUgY3Vyc29yIHBvc2l0aW9uICovCisJCQkJCQlwcm9jZXNzZWQgPSAxOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQljYXNlICdJJzoJLyogcmVpbml0aWFsaXplIGRpc3BsYXkgKi8KKwkJCQkJbGNkX2luaXRfZGlzcGxheSgpOworCQkJCQlsY2RfbGVmdF9zaGlmdCA9IDA7CisJCQkJCXByb2Nlc3NlZCA9IDE7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAnRyc6CS8qIEdlbmVyYXRvciA6IExHY3h4eHh4Li4ueHg7ICovICB7CisJCQkJCQkvKiBtdXN0IGhhdmUgPGM+IGJldHdlZW4gJzAnIGFuZCAnNycsIHJlcHJlc2VudGluZyB0aGUgbnVtZXJpY2FsCisJCQkJCQkgKiBBU0NJSSBjb2RlIG9mIHRoZSByZWRlZmluZWQgY2hhcmFjdGVyLCBhbmQgPHh4Li4ueHg+IGEgc2VxdWVuY2UKKwkJCQkJCSAqIG9mIDE2IGhleCBkaWdpdHMgcmVwcmVzZW50aW5nIDggYnl0ZXMgZm9yIGVhY2ggY2hhcmFjdGVyLiBNb3N0CisJCQkJCQkgKiBMQ0RzIHdpbGwgb25seSB1c2UgNSBsb3dlciBiaXRzIG9mIHRoZSA3IGZpcnN0IGJ5dGVzLgorCQkJCQkJICovCisKKwkJCQkJCXVuc2lnbmVkIGNoYXIgY2dieXRlc1s4XTsKKwkJCQkJCXVuc2lnbmVkIGNoYXIgY2dhZGRyOworCQkJCQkJaW50IGNnb2Zmc2V0OworCQkJCQkJaW50IHNoaWZ0OworCQkJCQkJY2hhciB2YWx1ZTsKKwkJCQkJCWludCBhZGRyOworCisJCQkJCQlpZiAoc3RyY2hyKGVzYywgJzsnKSA9PSBOVUxMKQorCQkJCQkJCWJyZWFrOworCisJCQkJCQllc2MrKzsKKworCQkJCQkJY2dhZGRyID0gKihlc2MrKykgLSAnMCc7CisJCQkJCQlpZiAoY2dhZGRyID4gNykgeworCQkJCQkJCXByb2Nlc3NlZCA9IDE7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisKKwkJCQkJCWNnb2Zmc2V0ID0gMDsKKwkJCQkJCXNoaWZ0ID0gMDsKKwkJCQkJCXZhbHVlID0gMDsKKwkJCQkJCXdoaWxlICgqZXNjICYmIGNnb2Zmc2V0IDwgOCkgeworCQkJCQkJCXNoaWZ0IF49IDQ7CisJCQkJCQkJaWYgKCplc2MgPj0gJzAnICYmICplc2MgPD0gJzknKQorCQkJCQkJCQl2YWx1ZSB8PSAoKmVzYyAtICcwJykgPDwgc2hpZnQ7CisJCQkJCQkJZWxzZSBpZiAoKmVzYyA+PSAnQScgJiYgKmVzYyA8PSAnWicpCisJCQkJCQkJCXZhbHVlIHw9ICgqZXNjIC0gJ0EnICsgMTApIDw8IHNoaWZ0OworCQkJCQkJCWVsc2UgaWYgKCplc2MgPj0gJ2EnICYmICplc2MgPD0gJ3onKQorCQkJCQkJCQl2YWx1ZSB8PSAoKmVzYyAtICdhJyArIDEwKSA8PCBzaGlmdDsKKwkJCQkJCQllbHNlIHsKKwkJCQkJCQkJZXNjKys7CisJCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJCX0KKworCQkJCQkJCWlmIChzaGlmdCA9PSAwKSB7CisJCQkJCQkJCWNnYnl0ZXNbY2dvZmZzZXQrK10gPSB2YWx1ZTsKKwkJCQkJCQkJdmFsdWUgPSAwOworCQkJCQkJCX0KKworCQkJCQkJCWVzYysrOworCQkJCQkJfQorCisJCQkJCQlsY2Rfd3JpdGVfY21kKDB4NDAgfCAoY2dhZGRyICogOCkpOworCQkJCQkJZm9yIChhZGRyID0gMDsgYWRkciA8IGNnb2Zmc2V0OyBhZGRyKyspCisJCQkJCQkJbGNkX3dyaXRlX2RhdGEoY2dieXRlc1thZGRyXSk7CisKKwkJCQkJCWxjZF9nb3RveHkoKTsJLyogZW5zdXJlcyB0aGF0IHdlIHN0b3Agd3JpdGluZyB0byBDR1JBTSAqLworCQkJCQkJcHJvY2Vzc2VkID0gMTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJY2FzZSAneCc6CS8qIGdvdG94eSA6IEx4WFhYW3lZWVldOyAqLworCQkJCWNhc2UgJ3knOgkvKiBnb3RveHkgOiBMeVlZWVt4WFhYXTsgKi8KKwkJCQkJaWYgKHN0cmNocihlc2MsICc7JykgPT0gTlVMTCkKKwkJCQkJCWJyZWFrOworCisJCQkJCXdoaWxlICgqZXNjKSB7CisJCQkJCQlpZiAoKmVzYyA9PSAneCcpIHsKKwkJCQkJCQllc2MrKzsKKwkJCQkJCQlsY2RfYWRkcl94ID0gMDsKKwkJCQkJCQl3aGlsZSAoaXNkaWdpdCgqZXNjKSkgeworCQkJCQkJCQlsY2RfYWRkcl94ID0KKwkJCQkJCQkJICAgIGxjZF9hZGRyX3ggKgorCQkJCQkJCQkgICAgMTAgKyAoKmVzYyAtCisJCQkJCQkJCQkgICcwJyk7CisJCQkJCQkJCWVzYysrOworCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSBpZiAoKmVzYyA9PSAneScpIHsKKwkJCQkJCQllc2MrKzsKKwkJCQkJCQlsY2RfYWRkcl95ID0gMDsKKwkJCQkJCQl3aGlsZSAoaXNkaWdpdCgqZXNjKSkgeworCQkJCQkJCQlsY2RfYWRkcl95ID0KKwkJCQkJCQkJICAgIGxjZF9hZGRyX3kgKgorCQkJCQkJCQkgICAgMTAgKyAoKmVzYyAtCisJCQkJCQkJCQkgICcwJyk7CisJCQkJCQkJCWVzYysrOworCQkJCQkJCX0KKwkJCQkJCX0gZWxzZQorCQkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJbGNkX2dvdG94eSgpOworCQkJCQlwcm9jZXNzZWQgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CS8qIGVuZCBvZiBzd2l0Y2ggKi8KKworCQkJCS8qIENoZWNrIHdldGhlciBvbmUgZmxhZyB3YXMgY2hhbmdlZCAqLworCQkJCWlmIChvbGRmbGFncyAhPSBsY2RfZmxhZ3MpIHsKKwkJCQkJLyogY2hlY2sgd2V0aGVyIG9uZSBvZiBCLEMsRCBmbGFncyB3YXMgY2hhbmdlZCAqLworCQkJCQlpZiAoKG9sZGZsYWdzIF4gbGNkX2ZsYWdzKSAmCisJCQkJCSAgICAoTENEX0ZMQUdfQiB8IExDRF9GTEFHX0MgfCBMQ0RfRkxBR19EKSkKKwkJCQkJCS8qIHNldCBkaXNwbGF5IG1vZGUgKi8KKwkJCQkJCWxjZF93cml0ZV9jbWQoMHgwOCB8CisJCQkJCQkJICAgICAgKChsY2RfZmxhZ3MgJiBMQ0RfRkxBR19EKSA/IDQgOiAwKSB8CisJCQkJCQkJICAgICAgKChsY2RfZmxhZ3MgJiBMQ0RfRkxBR19DKSA/IDIgOiAwKSB8CisJCQkJCQkJICAgICAgKChsY2RfZmxhZ3MgJiBMQ0RfRkxBR19CKSA/IDEgOiAwKSk7CisJCQkJCS8qIGNoZWNrIHdldGhlciBvbmUgb2YgRixOIGZsYWdzIHdhcyBjaGFuZ2VkICovCisJCQkJCWVsc2UgaWYgKChvbGRmbGFncyBeIGxjZF9mbGFncykgJgorCQkJCQkJIChMQ0RfRkxBR19GIHwgTENEX0ZMQUdfTikpCisJCQkJCQlsY2Rfd3JpdGVfY21kKDB4MzAgfAorCQkJCQkJCSAgICAgICgobGNkX2ZsYWdzICYgTENEX0ZMQUdfRikgPyA0IDogMCkgfAorCQkJCQkJCSAgICAgICgobGNkX2ZsYWdzICYgTENEX0ZMQUdfTikgPyA4IDogMCkpOworCQkJCQkvKiBjaGVjayB3ZXRoZXIgTCBmbGFnIHdhcyBjaGFuZ2VkICovCisJCQkJCWVsc2UgaWYgKChvbGRmbGFncyBeIGxjZF9mbGFncykgJgorCQkJCQkJIChMQ0RfRkxBR19MKSkgeworCQkJCQkJaWYgKGxjZF9mbGFncyAmIChMQ0RfRkxBR19MKSkKKwkJCQkJCQlsY2RfYmFja2xpZ2h0KDEpOworCQkJCQkJZWxzZSBpZiAobGlnaHRfdGVtcG8gPT0gMCkJLyogc3dpdGNoIG9mZiB0aGUgbGlnaHQgb25seSB3aGVuIHRoZSB0ZW1wbyBsaWdodGluZyBpcyBnb25lICovCisJCQkJCQkJbGNkX2JhY2tsaWdodCgwKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJLyogTENEIHNwZWNpYWwgZXNjYXBlIGNvZGVzICovCisJCQkvKiBmbHVzaCB0aGUgZXNjYXBlIHNlcXVlbmNlIGlmIGl0J3MgYmVlbiBwcm9jZXNzZWQgb3IgaWYgaXQgaXMKKwkJCSAgIGdldHRpbmcgdG9vIGxvbmcuICovCisJCQlpZiAocHJvY2Vzc2VkIHx8IChsY2RfZXNjYXBlX2xlbiA+PSBMQ0RfRVNDQVBFX0xFTikpCisJCQkJbGNkX2VzY2FwZV9sZW4gPSAtMTsKKwkJfQkJLyogZXNjYXBlIGNvZGVzICovCisJfQorCisJcmV0dXJuIHRtcCAtIGJ1ZjsKK30KKworc3RhdGljIGludCBsY2Rfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAobGNkX29wZW5fY250KQorCQlyZXR1cm4gLUVCVVNZOwkvKiBvcGVuIG9ubHkgb25jZSBhdCBhIHRpbWUgKi8KKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQkvKiBkZXZpY2UgaXMgd3JpdGUtb25seSAqLworCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKGxjZF9tdXN0X2NsZWFyKSB7CisJCWxjZF9jbGVhcl9kaXNwbGF5KCk7CisJCWxjZF9tdXN0X2NsZWFyID0gMDsKKwl9CisJbGNkX29wZW5fY250Kys7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGNkX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJbGNkX29wZW5fY250LS07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxjZF9mb3BzID0geworCS53cml0ZSAgID0gbGNkX3dyaXRlLAorCS5vcGVuICAgID0gbGNkX29wZW4sCisJLnJlbGVhc2UgPSBsY2RfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBsY2RfZGV2ID0geworCUxDRF9NSU5PUiwKKwkibGNkIiwKKwkmbGNkX2ZvcHMKK307CisKKy8qIHB1YmxpYyBmdW5jdGlvbiB1c2FibGUgZnJvbSB0aGUga2VybmVsIGZvciBhbnkgcHVycG9zZSAqLwordm9pZCBwYW5lbF9sY2RfcHJpbnQoY2hhciAqcykKK3sKKwlpZiAobGNkX2VuYWJsZWQgJiYgbGNkX2luaXRpYWxpemVkKQorCQlsY2Rfd3JpdGUoTlVMTCwgcywgc3RybGVuKHMpLCBOVUxMKTsKK30KKworLyogaW5pdGlhbGl6ZSB0aGUgTENEIGRyaXZlciAqLwordm9pZCBsY2RfaW5pdCh2b2lkKQoreworCXN3aXRjaCAobGNkX3R5cGUpIHsKKwljYXNlIExDRF9UWVBFX09MRDoJLyogcGFyYWxsZWwgbW9kZSwgOCBiaXRzICovCisJCWlmIChsY2RfcHJvdG8gPCAwKQorCQkJbGNkX3Byb3RvID0gTENEX1BST1RPX1BBUkFMTEVMOworCQlpZiAobGNkX2NoYXJzZXQgPCAwKQorCQkJbGNkX2NoYXJzZXQgPSBMQ0RfQ0hBUlNFVF9OT1JNQUw7CisJCWlmIChsY2RfZV9waW4gPT0gUElOX05PVF9TRVQpCisJCQlsY2RfZV9waW4gPSBQSU5fU1RST0JFOworCQlpZiAobGNkX3JzX3BpbiA9PSBQSU5fTk9UX1NFVCkKKwkJCWxjZF9yc19waW4gPSBQSU5fQVVUT0xGOworCisJCWlmIChsY2Rfd2lkdGggPCAwKQorCQkJbGNkX3dpZHRoID0gNDA7CisJCWlmIChsY2RfYndpZHRoIDwgMCkKKwkJCWxjZF9id2lkdGggPSA0MDsKKwkJaWYgKGxjZF9od2lkdGggPCAwKQorCQkJbGNkX2h3aWR0aCA9IDY0OworCQlpZiAobGNkX2hlaWdodCA8IDApCisJCQlsY2RfaGVpZ2h0ID0gMjsKKwkJYnJlYWs7CisJY2FzZSBMQ0RfVFlQRV9LUzAwNzQ6CS8qIHNlcmlhbCBtb2RlLCBrczAwNzQgKi8KKwkJaWYgKGxjZF9wcm90byA8IDApCisJCQlsY2RfcHJvdG8gPSBMQ0RfUFJPVE9fU0VSSUFMOworCQlpZiAobGNkX2NoYXJzZXQgPCAwKQorCQkJbGNkX2NoYXJzZXQgPSBMQ0RfQ0hBUlNFVF9LUzAwNzQ7CisJCWlmIChsY2RfYmxfcGluID09IFBJTl9OT1RfU0VUKQorCQkJbGNkX2JsX3BpbiA9IFBJTl9BVVRPTEY7CisJCWlmIChsY2RfY2xfcGluID09IFBJTl9OT1RfU0VUKQorCQkJbGNkX2NsX3BpbiA9IFBJTl9TVFJPQkU7CisJCWlmIChsY2RfZGFfcGluID09IFBJTl9OT1RfU0VUKQorCQkJbGNkX2RhX3BpbiA9IFBJTl9EMDsKKworCQlpZiAobGNkX3dpZHRoIDwgMCkKKwkJCWxjZF93aWR0aCA9IDE2OworCQlpZiAobGNkX2J3aWR0aCA8IDApCisJCQlsY2RfYndpZHRoID0gNDA7CisJCWlmIChsY2RfaHdpZHRoIDwgMCkKKwkJCWxjZF9od2lkdGggPSAxNjsKKwkJaWYgKGxjZF9oZWlnaHQgPCAwKQorCQkJbGNkX2hlaWdodCA9IDI7CisJCWJyZWFrOworCWNhc2UgTENEX1RZUEVfTkVYQ09NOgkvKiBwYXJhbGxlbCBtb2RlLCA4IGJpdHMsIGdlbmVyaWMgKi8KKwkJaWYgKGxjZF9wcm90byA8IDApCisJCQlsY2RfcHJvdG8gPSBMQ0RfUFJPVE9fUEFSQUxMRUw7CisJCWlmIChsY2RfY2hhcnNldCA8IDApCisJCQlsY2RfY2hhcnNldCA9IExDRF9DSEFSU0VUX05PUk1BTDsKKwkJaWYgKGxjZF9lX3BpbiA9PSBQSU5fTk9UX1NFVCkKKwkJCWxjZF9lX3BpbiA9IFBJTl9BVVRPTEY7CisJCWlmIChsY2RfcnNfcGluID09IFBJTl9OT1RfU0VUKQorCQkJbGNkX3JzX3BpbiA9IFBJTl9TRUxFQ1A7CisJCWlmIChsY2RfcndfcGluID09IFBJTl9OT1RfU0VUKQorCQkJbGNkX3J3X3BpbiA9IFBJTl9JTklUUDsKKworCQlpZiAobGNkX3dpZHRoIDwgMCkKKwkJCWxjZF93aWR0aCA9IDE2OworCQlpZiAobGNkX2J3aWR0aCA8IDApCisJCQlsY2RfYndpZHRoID0gNDA7CisJCWlmIChsY2RfaHdpZHRoIDwgMCkKKwkJCWxjZF9od2lkdGggPSA2NDsKKwkJaWYgKGxjZF9oZWlnaHQgPCAwKQorCQkJbGNkX2hlaWdodCA9IDI7CisJCWJyZWFrOworCWNhc2UgTENEX1RZUEVfQ1VTVE9NOgkvKiBjdXN0b21lci1kZWZpbmVkICovCisJCWlmIChsY2RfcHJvdG8gPCAwKQorCQkJbGNkX3Byb3RvID0gREVGQVVMVF9MQ0RfUFJPVE87CisJCWlmIChsY2RfY2hhcnNldCA8IDApCisJCQlsY2RfY2hhcnNldCA9IERFRkFVTFRfTENEX0NIQVJTRVQ7CisJCS8qIGRlZmF1bHQgZ2VvbWV0cnkgd2lsbCBiZSBzZXQgbGF0ZXIgKi8KKwkJYnJlYWs7CisJY2FzZSBMQ0RfVFlQRV9IQU5UUk9OSVg6CS8qIHBhcmFsbGVsIG1vZGUsIDggYml0cywgaGFudHJvbml4LWxpa2UgKi8KKwlkZWZhdWx0OgorCQlpZiAobGNkX3Byb3RvIDwgMCkKKwkJCWxjZF9wcm90byA9IExDRF9QUk9UT19QQVJBTExFTDsKKwkJaWYgKGxjZF9jaGFyc2V0IDwgMCkKKwkJCWxjZF9jaGFyc2V0ID0gTENEX0NIQVJTRVRfTk9STUFMOworCQlpZiAobGNkX2VfcGluID09IFBJTl9OT1RfU0VUKQorCQkJbGNkX2VfcGluID0gUElOX1NUUk9CRTsKKwkJaWYgKGxjZF9yc19waW4gPT0gUElOX05PVF9TRVQpCisJCQlsY2RfcnNfcGluID0gUElOX1NFTEVDUDsKKworCQlpZiAobGNkX3dpZHRoIDwgMCkKKwkJCWxjZF93aWR0aCA9IDE2OworCQlpZiAobGNkX2J3aWR0aCA8IDApCisJCQlsY2RfYndpZHRoID0gNDA7CisJCWlmIChsY2RfaHdpZHRoIDwgMCkKKwkJCWxjZF9od2lkdGggPSA2NDsKKwkJaWYgKGxjZF9oZWlnaHQgPCAwKQorCQkJbGNkX2hlaWdodCA9IDI7CisJCWJyZWFrOworCX0KKworCS8qIHRoaXMgaXMgdXNlZCB0byBjYXRjaCB3cm9uZyBhbmQgZGVmYXVsdCB2YWx1ZXMgKi8KKwlpZiAobGNkX3dpZHRoIDw9IDApCisJCWxjZF93aWR0aCA9IERFRkFVTFRfTENEX1dJRFRIOworCWlmIChsY2RfYndpZHRoIDw9IDApCisJCWxjZF9id2lkdGggPSBERUZBVUxUX0xDRF9CV0lEVEg7CisJaWYgKGxjZF9od2lkdGggPD0gMCkKKwkJbGNkX2h3aWR0aCA9IERFRkFVTFRfTENEX0hXSURUSDsKKwlpZiAobGNkX2hlaWdodCA8PSAwKQorCQlsY2RfaGVpZ2h0ID0gREVGQVVMVF9MQ0RfSEVJR0hUOworCisJaWYgKGxjZF9wcm90byA9PSBMQ0RfUFJPVE9fU0VSSUFMKSB7CS8qIFNFUklBTCAqLworCQlsY2Rfd3JpdGVfY21kID0gbGNkX3dyaXRlX2NtZF9zOworCQlsY2Rfd3JpdGVfZGF0YSA9IGxjZF93cml0ZV9kYXRhX3M7CisJCWxjZF9jbGVhcl9mYXN0ID0gbGNkX2NsZWFyX2Zhc3RfczsKKworCQlpZiAobGNkX2NsX3BpbiA9PSBQSU5fTk9UX1NFVCkKKwkJCWxjZF9jbF9waW4gPSBERUZBVUxUX0xDRF9QSU5fU0NMOworCQlpZiAobGNkX2RhX3BpbiA9PSBQSU5fTk9UX1NFVCkKKwkJCWxjZF9kYV9waW4gPSBERUZBVUxUX0xDRF9QSU5fU0RBOworCisJfSBlbHNlIHsJCS8qIFBBUkFMTEVMICovCisJCWxjZF93cml0ZV9jbWQgPSBsY2Rfd3JpdGVfY21kX3A4OworCQlsY2Rfd3JpdGVfZGF0YSA9IGxjZF93cml0ZV9kYXRhX3A4OworCQlsY2RfY2xlYXJfZmFzdCA9IGxjZF9jbGVhcl9mYXN0X3A4OworCisJCWlmIChsY2RfZV9waW4gPT0gUElOX05PVF9TRVQpCisJCQlsY2RfZV9waW4gPSBERUZBVUxUX0xDRF9QSU5fRTsKKwkJaWYgKGxjZF9yc19waW4gPT0gUElOX05PVF9TRVQpCisJCQlsY2RfcnNfcGluID0gREVGQVVMVF9MQ0RfUElOX1JTOworCQlpZiAobGNkX3J3X3BpbiA9PSBQSU5fTk9UX1NFVCkKKwkJCWxjZF9yd19waW4gPSBERUZBVUxUX0xDRF9QSU5fUlc7CisJfQorCisJaWYgKGxjZF9ibF9waW4gPT0gUElOX05PVF9TRVQpCisJCWxjZF9ibF9waW4gPSBERUZBVUxUX0xDRF9QSU5fQkw7CisKKwlpZiAobGNkX2VfcGluID09IFBJTl9OT1RfU0VUKQorCQlsY2RfZV9waW4gPSBQSU5fTk9ORTsKKwlpZiAobGNkX3JzX3BpbiA9PSBQSU5fTk9UX1NFVCkKKwkJbGNkX3JzX3BpbiA9IFBJTl9OT05FOworCWlmIChsY2RfcndfcGluID09IFBJTl9OT1RfU0VUKQorCQlsY2RfcndfcGluID0gUElOX05PTkU7CisJaWYgKGxjZF9ibF9waW4gPT0gUElOX05PVF9TRVQpCisJCWxjZF9ibF9waW4gPSBQSU5fTk9ORTsKKwlpZiAobGNkX2NsX3BpbiA9PSBQSU5fTk9UX1NFVCkKKwkJbGNkX2NsX3BpbiA9IFBJTl9OT05FOworCWlmIChsY2RfZGFfcGluID09IFBJTl9OT1RfU0VUKQorCQlsY2RfZGFfcGluID0gUElOX05PTkU7CisKKwlpZiAobGNkX2NoYXJzZXQgPCAwKQorCQlsY2RfY2hhcnNldCA9IERFRkFVTFRfTENEX0NIQVJTRVQ7CisKKwlpZiAobGNkX2NoYXJzZXQgPT0gTENEX0NIQVJTRVRfS1MwMDc0KQorCQlsY2RfY2hhcl9jb252ID0gbGNkX2NoYXJfY29udl9rczAwNzQ7CisJZWxzZQorCQlsY2RfY2hhcl9jb252ID0gTlVMTDsKKworCWlmIChsY2RfYmxfcGluICE9IFBJTl9OT05FKQorCQlpbml0X3NjYW5fdGltZXIoKTsKKworCXBpbl90b19iaXRzKGxjZF9lX3BpbiwgbGNkX2JpdHNbTENEX1BPUlRfRF1bTENEX0JJVF9FXSwKKwkJICAgIGxjZF9iaXRzW0xDRF9QT1JUX0NdW0xDRF9CSVRfRV0pOworCXBpbl90b19iaXRzKGxjZF9yc19waW4sIGxjZF9iaXRzW0xDRF9QT1JUX0RdW0xDRF9CSVRfUlNdLAorCQkgICAgbGNkX2JpdHNbTENEX1BPUlRfQ11bTENEX0JJVF9SU10pOworCXBpbl90b19iaXRzKGxjZF9yd19waW4sIGxjZF9iaXRzW0xDRF9QT1JUX0RdW0xDRF9CSVRfUlddLAorCQkgICAgbGNkX2JpdHNbTENEX1BPUlRfQ11bTENEX0JJVF9SV10pOworCXBpbl90b19iaXRzKGxjZF9ibF9waW4sIGxjZF9iaXRzW0xDRF9QT1JUX0RdW0xDRF9CSVRfQkxdLAorCQkgICAgbGNkX2JpdHNbTENEX1BPUlRfQ11bTENEX0JJVF9CTF0pOworCXBpbl90b19iaXRzKGxjZF9jbF9waW4sIGxjZF9iaXRzW0xDRF9QT1JUX0RdW0xDRF9CSVRfQ0xdLAorCQkgICAgbGNkX2JpdHNbTENEX1BPUlRfQ11bTENEX0JJVF9DTF0pOworCXBpbl90b19iaXRzKGxjZF9kYV9waW4sIGxjZF9iaXRzW0xDRF9QT1JUX0RdW0xDRF9CSVRfREFdLAorCQkgICAgbGNkX2JpdHNbTENEX1BPUlRfQ11bTENEX0JJVF9EQV0pOworCisJLyogYmVmb3JlIHRoaXMgbGluZSwgd2UgbXVzdCBOT1Qgc2VuZCBhbnl0aGluZyB0byB0aGUgZGlzcGxheS4KKwkgKiBTaW5jZSBsY2RfaW5pdF9kaXNwbGF5KCkgbmVlZHMgdG8gd3JpdGUgZGF0YSwgd2UgaGF2ZSB0bworCSAqIGVuYWJsZSBtYXJrIHRoZSBMQ0QgaW5pdGlhbGl6ZWQganVzdCBiZWZvcmUuCisJICovCisJbGNkX2luaXRpYWxpemVkID0gMTsKKwlsY2RfaW5pdF9kaXNwbGF5KCk7CisKKwkvKiBkaXNwbGF5IGEgc2hvcnQgbWVzc2FnZSAqLworI2lmZGVmIENPTkZJR19QQU5FTF9DSEFOR0VfTUVTU0FHRQorI2lmZGVmIENPTkZJR19QQU5FTF9CT09UX01FU1NBR0UKKwlwYW5lbF9sY2RfcHJpbnQoIlx4MWJbTGNceDFiW0xiXHgxYltMKiIgQ09ORklHX1BBTkVMX0JPT1RfTUVTU0FHRSk7CisjZW5kaWYKKyNlbHNlCisJcGFuZWxfbGNkX3ByaW50KCJceDFiW0xjXHgxYltMYlx4MWJbTCpMaW51eC0iIFVUU19SRUxFQVNFICJcblBhbmVsLSIKKwkJCVBBTkVMX1ZFUlNJT04pOworI2VuZGlmCisJbGNkX2FkZHJfeCA9IGxjZF9hZGRyX3kgPSAwOworCWxjZF9tdXN0X2NsZWFyID0gMTsJLyogY2xlYXIgdGhlIGRpc3BsYXkgb24gdGhlIG5leHQgZGV2aWNlIG9wZW5pbmcgKi8KKwlsY2RfZ290b3h5KCk7Cit9CisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIGZpbGUgb3BlcmF0aW9uIGZ1bmN0aW9uIGZvciB1c2VyIGFjY2VzcyB0byAvZGV2L2tleXBhZAorICovCisKK3N0YXRpYyBzc2l6ZV90IGtleXBhZF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKworCXVuc2lnbmVkIGkgPSAqcHBvczsKKwljaGFyICp0bXAgPSBidWY7CisKKwlpZiAoa2V5cGFkX2J1ZmxlbiA9PSAwKSB7CisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKKwkJCXJldHVybiAtRUFHQUlOOworCisJCWludGVycnVwdGlibGVfc2xlZXBfb24oJmtleXBhZF9yZWFkX3dhaXQpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlyZXR1cm4gLUVJTlRSOworCX0KKworCWZvciAoOyBjb3VudC0tID4gMCAmJiAoa2V5cGFkX2J1ZmxlbiA+IDApOyArK2ksICsrdG1wLCAtLWtleXBhZF9idWZsZW4pIHsKKwkJcHV0X3VzZXIoa2V5cGFkX2J1ZmZlcltrZXlwYWRfc3RhcnRdLCB0bXApOworCQlrZXlwYWRfc3RhcnQgPSAoa2V5cGFkX3N0YXJ0ICsgMSkgJSBLRVlQQURfQlVGRkVSOworCX0KKwkqcHBvcyA9IGk7CisKKwlyZXR1cm4gdG1wIC0gYnVmOworfQorCitzdGF0aWMgaW50IGtleXBhZF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCisJaWYgKGtleXBhZF9vcGVuX2NudCkKKwkJcmV0dXJuIC1FQlVTWTsJLyogb3BlbiBvbmx5IG9uY2UgYXQgYSB0aW1lICovCisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCS8qIGRldmljZSBpcyByZWFkLW9ubHkgKi8KKwkJcmV0dXJuIC1FUEVSTTsKKworCWtleXBhZF9idWZsZW4gPSAwOwkvKiBmbHVzaCB0aGUgYnVmZmVyIG9uIG9wZW5pbmcgKi8KKwlrZXlwYWRfb3Blbl9jbnQrKzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBrZXlwYWRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlrZXlwYWRfb3Blbl9jbnQtLTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMga2V5cGFkX2ZvcHMgPSB7CisJLnJlYWQgICAgPSBrZXlwYWRfcmVhZCwJCS8qIHJlYWQgKi8KKwkub3BlbiAgICA9IGtleXBhZF9vcGVuLAkJLyogb3BlbiAqLworCS5yZWxlYXNlID0ga2V5cGFkX3JlbGVhc2UsCS8qIGNsb3NlICovCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2Uga2V5cGFkX2RldiA9IHsKKwlLRVlQQURfTUlOT1IsCisJImtleXBhZCIsCisJJmtleXBhZF9mb3BzCit9OworCitzdGF0aWMgdm9pZCBrZXlwYWRfc2VuZF9rZXkoY2hhciAqc3RyaW5nLCBpbnQgbWF4X2xlbikKK3sKKwlpZiAoaW5pdF9pbl9wcm9ncmVzcykKKwkJcmV0dXJuOworCisJLyogc2VuZCB0aGUga2V5IHRvIHRoZSBkZXZpY2Ugb25seSBpZiBhIHByb2Nlc3MgaXMgYXR0YWNoZWQgdG8gaXQuICovCisJaWYgKGtleXBhZF9vcGVuX2NudCA+IDApIHsKKwkJd2hpbGUgKG1heF9sZW4tLSAmJiBrZXlwYWRfYnVmbGVuIDwgS0VZUEFEX0JVRkZFUiAmJiAqc3RyaW5nKSB7CisJCQlrZXlwYWRfYnVmZmVyWyhrZXlwYWRfc3RhcnQgKyBrZXlwYWRfYnVmbGVuKyspICUKKwkJCQkgICAgICBLRVlQQURfQlVGRkVSXSA9ICpzdHJpbmcrKzsKKwkJfQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmtleXBhZF9yZWFkX3dhaXQpOworCX0KK30KKworLyogdGhpcyBmdW5jdGlvbiBzY2FucyBhbGwgdGhlIGJpdHMgaW52b2x2aW5nIGF0IGxlYXN0IG9uZSBsb2dpY2FsIHNpZ25hbCwgYW5kIHB1dHMgdGhlCisgKiByZXN1bHRzIGluIHRoZSBiaXRmaWVsZCAicGh5c19yZWFkIiAob25lIGJpdCBwZXIgZXN0YWJsaXNoZWQgY29udGFjdCksIGFuZCBzZXRzCisgKiAicGh5c19yZWFkX3ByZXYiIHRvICJwaHlzX3JlYWQiLgorICoKKyAqIE5vdGU6IHRvIGRlYm91bmNlIGlucHV0IHNpZ25hbHMsIHdlIHdpbGwgb25seSBjb25zaWRlciBhcyBzd2l0Y2hlZCBhIHNpZ25hbCB3aGljaCBpcworICogc3RhYmxlIGFjcm9zcyAyIG1lYXN1cmVzLiBTaWduYWxzIHdoaWNoIGFyZSBkaWZmZXJlbnQgYmV0d2VlbiB0d28gcmVhZHMgd2lsbCBiZSBrZXB0CisgKiBhcyB0aGV5IHByZXZpb3VzbHkgd2VyZSBpbiB0aGVpciBsb2dpY2FsIGZvcm0gKHBoeXNfcHJldikuIEEgc2lnbmFsIHdoaWNoIGhhcyBqdXN0CisgKiBzd2l0Y2hlZCB3aWxsIGhhdmUgYSAxIGluIChwaHlzX3JlYWQgXiBwaHlzX3JlYWRfcHJldikuCisgKi8KK3N0YXRpYyB2b2lkIHBoeXNfc2Nhbl9jb250YWN0cyh2b2lkKQoreworCWludCBiaXQsIGJpdHZhbDsKKwljaGFyIG9sZHZhbDsKKwljaGFyIGJpdG1hc2s7CisJY2hhciBnbmRtYXNrOworCisJcGh5c19wcmV2ID0gcGh5c19jdXJyOworCXBoeXNfcmVhZF9wcmV2ID0gcGh5c19yZWFkOworCXBoeXNfcmVhZCA9IDA7CQkvKiBmbHVzaCBhbGwgc2lnbmFscyAqLworCisJb2xkdmFsID0gcl9kdHIocHBydCkgfCBzY2FuX21hc2tfbzsJLyoga2VlcCB0cmFjayBvZiBvbGQgdmFsdWUsIHdpdGggYWxsIG91dHB1dHMgZGlzYWJsZWQgKi8KKwl3X2R0cihwcHJ0LCBvbGR2YWwgJiB+c2Nhbl9tYXNrX28pOwkvKiBhY3RpdmF0ZSBhbGwga2V5Ym9hcmQgb3V0cHV0cyAoYWN0aXZlIGxvdykgKi8KKwliaXRtYXNrID0gUE5MX1BJTlBVVChyX3N0cihwcHJ0KSkgJiBzY2FuX21hc2tfaTsJLyogd2lsbCBoYXZlIGEgMSBmb3IgZWFjaCBiaXQgc2V0IHRvIGduZCAqLworCXdfZHRyKHBwcnQsIG9sZHZhbCk7CS8qIGRpc2FibGUgYWxsIG1hdHJpeCBzaWduYWxzICovCisKKwkvKiBub3cgdGhhdCBhbGwgb3V0cHV0cyBhcmUgY2xlYXJlZCwgdGhlIG9ubHkgYWN0aXZlIGlucHV0IGJpdHMgYXJlCisJICogZGlyZWN0bHkgY29ubmVjdGVkIHRvIHRoZSBncm91bmQKKwkgKi8KKwlnbmRtYXNrID0gUE5MX1BJTlBVVChyX3N0cihwcHJ0KSkgJiBzY2FuX21hc2tfaTsJLyogMSBmb3IgZWFjaCBncm91bmRlZCBpbnB1dCAqLworCisJcGh5c19yZWFkIHw9IChwbWFza190KSBnbmRtYXNrIDw8IDQwOwkvKiBncm91bmRlZCBpbnB1dHMgYXJlIHNpZ25hbHMgNDAtNDQgKi8KKworCWlmIChiaXRtYXNrICE9IGduZG1hc2spIHsKKwkJLyogc2luY2UgY2xlYXJpbmcgdGhlIG91dHB1dHMgY2hhbmdlZCBzb21lIGlucHV0cywgd2Uga25vdyB0aGF0IHNvbWUKKwkJICogaW5wdXQgc2lnbmFscyBhcmUgY3VycmVudGx5IHRpZWQgdG8gc29tZSBvdXRwdXRzLiBTbyB3ZSdsbCBzY2FuIHRoZW0uCisJCSAqLworCQlmb3IgKGJpdCA9IDA7IGJpdCA8IDg7IGJpdCsrKSB7CisJCQliaXR2YWwgPSAxIDw8IGJpdDsKKworCQkJaWYgKCEoc2Nhbl9tYXNrX28gJiBiaXR2YWwpKQkvKiBza2lwIHVudXNlZCBiaXRzICovCisJCQkJY29udGludWU7CisKKwkJCXdfZHRyKHBwcnQsIG9sZHZhbCAmIH5iaXR2YWwpOwkvKiBlbmFibGUgdGhpcyBvdXRwdXQgKi8KKwkJCWJpdG1hc2sgPSBQTkxfUElOUFVUKHJfc3RyKHBwcnQpKSAmIH5nbmRtYXNrOworCQkJcGh5c19yZWFkIHw9IChwbWFza190KSBiaXRtYXNrIDw8ICg1ICogYml0KTsKKwkJfQorCQl3X2R0cihwcHJ0LCBvbGR2YWwpOwkvKiBkaXNhYmxlIGFsbCBvdXRwdXRzICovCisJfQorCS8qIHRoaXMgaXMgZWFzeTogdXNlIG9sZCBiaXRzIHdoZW4gdGhleSBhcmUgZmxhcHBpbmcsIHVzZSBuZXcgb25lcyB3aGVuIHN0YWJsZSAqLworCXBoeXNfY3VyciA9CisJICAgIChwaHlzX3ByZXYgJiAocGh5c19yZWFkIF4gcGh5c19yZWFkX3ByZXYpKSB8IChwaHlzX3JlYWQgJgorCQkJCQkJCSAgfihwaHlzX3JlYWQgXgorCQkJCQkJCSAgICBwaHlzX3JlYWRfcHJldikpOworfQorCitzdGF0aWMgdm9pZCBwYW5lbF9wcm9jZXNzX2lucHV0cyh2b2lkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKml0ZW07CisJc3RydWN0IGxvZ2ljYWxfaW5wdXQgKmlucHV0OworCisjaWYgMAorCXByaW50ayhLRVJOX0RFQlVHCisJICAgICAgICJlbnRlcmluZyBwYW5lbF9wcm9jZXNzX2lucHV0cyB3aXRoIHBwPSUwMTZMeCAmIHBjPSUwMTZMeFxuIiwKKwkgICAgICAgcGh5c19wcmV2LCBwaHlzX2N1cnIpOworI2VuZGlmCisKKwlrZXlwcmVzc2VkID0gMDsKKwlpbnB1dHNfc3RhYmxlID0gMTsKKwlsaXN0X2Zvcl9lYWNoKGl0ZW0sICZsb2dpY2FsX2lucHV0cykgeworCQlpbnB1dCA9IGxpc3RfZW50cnkoaXRlbSwgc3RydWN0IGxvZ2ljYWxfaW5wdXQsIGxpc3QpOworCisJCXN3aXRjaCAoaW5wdXQtPnN0YXRlKSB7CisJCWNhc2UgSU5QVVRfU1RfTE9XOgorCQkJaWYgKChwaHlzX2N1cnIgJiBpbnB1dC0+bWFzaykgIT0gaW5wdXQtPnZhbHVlKQorCQkJCWJyZWFrOworCQkJLyogaWYgYWxsIG5lZWRlZCBvbmVzIHdlcmUgYWxyZWFkeSBzZXQgcHJldmlvdXNseSwgdGhpcyBtZWFucyB0aGF0CisJCQkgKiB0aGlzIGxvZ2ljYWwgc2lnbmFsIGhhcyBiZWVuIGFjdGl2YXRlZCBieSB0aGUgcmVsZWFzaW5nIG9mCisJCQkgKiBhbm90aGVyIGNvbWJpbmVkIHNpZ25hbCwgc28gd2UgZG9uJ3Qgd2FudCB0byBtYXRjaC4KKwkJCSAqIGVnOiBBQiAtKHJlbGVhc2UgQiktPiBBIC0ocmVsZWFzZSBBKS0+IDAgOiBkb24ndCBtYXRjaCBBLgorCQkJICovCisJCQlpZiAoKHBoeXNfcHJldiAmIGlucHV0LT5tYXNrKSA9PSBpbnB1dC0+dmFsdWUpCisJCQkJYnJlYWs7CisJCQlpbnB1dC0+cmlzZV90aW1lciA9IDA7CisJCQlpbnB1dC0+c3RhdGUgPSBJTlBVVF9TVF9SSVNJTkc7CisJCQkvKiBubyBicmVhayBoZXJlLCBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBJTlBVVF9TVF9SSVNJTkc6CisJCQlpZiAoKHBoeXNfY3VyciAmIGlucHV0LT5tYXNrKSAhPSBpbnB1dC0+dmFsdWUpIHsKKwkJCQlpbnB1dC0+c3RhdGUgPSBJTlBVVF9TVF9MT1c7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoaW5wdXQtPnJpc2VfdGltZXIgPCBpbnB1dC0+cmlzZV90aW1lKSB7CisJCQkJaW5wdXRzX3N0YWJsZSA9IDA7CisJCQkJaW5wdXQtPnJpc2VfdGltZXIrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlucHV0LT5oaWdoX3RpbWVyID0gMDsKKwkJCWlucHV0LT5zdGF0ZSA9IElOUFVUX1NUX0hJR0g7CisJCQkvKiBubyBicmVhayBoZXJlLCBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBJTlBVVF9TVF9ISUdIOgorI2lmIDAKKwkJCS8qIEZJWE1FOgorCQkJICogdGhpcyBpcyBhbiBpbnZhbGlkIHRlc3QuIEl0IHRyaWVzIHRvIGNhdGNoIHRyYW5zaXRpb25zIGZyb20gc2luZ2xlLWtleQorCQkJICogdG8gbXVsdGlwbGUta2V5LCBidXQgZG9lc24ndCB0YWtlIGludG8gYWNjb3VudCB0aGUgY29udGFjdHMgcG9sYXJpdHkuCisJCQkgKiBUaGUgb25seSBzb2x1dGlvbiB0byB0aGUgcHJvYmxlbSBpcyB0byBwYXJzZSBrZXlzIGZyb20gdGhlIG1vc3QgY29tcGxleAorCQkJICogdG8gdGhlIHNpbXBsZXN0IGNvbWJpbmF0aW9ucywgYW5kIG1hcmsgdGhlbSBhcyAnY2F1Z2h0JyBvbmNlIGEgY29tYmluYXRpb24KKwkJCSAqIG1hdGNoZXMsIHRoZW4gdW5tYXRjaCBpdCBmb3IgYWxsIG90aGVyIG9uZXMuCisJCQkgKi8KKworCQkJLyogdHJ5IHRvIGNhdGNoIGRhbmdlcm91cyB0cmFuc2l0aW9ucyBjYXNlcyA6CisJCQkgKiBzb21lb25lIGFkZHMgYSBiaXQsIHNvIHRoaXMgc2lnbmFsIHdhcyBhIGZhbHNlCisJCQkgKiBwb3NpdGl2ZSByZXN1bHRpbmcgZnJvbSBhIHRyYW5zaXRpb24uIFdlIHNob3VsZCBpbnZhbGlkYXRlCisJCQkgKiB0aGUgc2lnbmFsIGltbWVkaWF0ZWx5IGFuZCBub3QgY2FsbCB0aGUgcmVsZWFzZSBmdW5jdGlvbi4KKwkJCSAqIGVnOiAwIC0ocHJlc3MgQSktPiBBIC0ocHJlc3MgQiktPiBBQiA6IGRvbid0IG1hdGNoIEEncyByZWxlYXNlLgorCQkJICovCisJCQlpZiAoKChwaHlzX3ByZXYgJiBpbnB1dC0+bWFzaykgPT0gaW5wdXQtPnZhbHVlKQorCQkJICAgICYmICgocGh5c19jdXJyICYgaW5wdXQtPm1hc2spID4gaW5wdXQtPnZhbHVlKSkgeworCQkJCWlucHV0LT5zdGF0ZSA9IElOUFVUX1NUX0xPVzsJLyogaW52YWxpZGF0ZSAqLworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmCisKKwkJCWlmICgocGh5c19jdXJyICYgaW5wdXQtPm1hc2spID09IGlucHV0LT52YWx1ZSkgeworCQkJCWlmICgoaW5wdXQtPnR5cGUgPT0gSU5QVVRfVFlQRV9TVEQpCisJCQkJICAgICYmIChpbnB1dC0+aGlnaF90aW1lciA9PSAwKSkgeworCQkJCQlpbnB1dC0+aGlnaF90aW1lcisrOworCQkJCQlpZiAoaW5wdXQtPnUuc3RkLnByZXNzX2ZjdCAhPSBOVUxMKQorCQkJCQkJaW5wdXQtPnUuc3RkLnByZXNzX2ZjdChpbnB1dC0+dS4KKwkJCQkJCQkJICAgICAgIHN0ZC4KKwkJCQkJCQkJICAgICAgIHByZXNzX2RhdGEpOworCQkJCX0gZWxzZSBpZiAoaW5wdXQtPnR5cGUgPT0gSU5QVVRfVFlQRV9LQkQpIHsKKwkJCQkJa2V5cHJlc3NlZCA9IDE7CS8qIHdpbGwgdHVybiBvbiB0aGUgbGlnaHQgKi8KKworCQkJCQlpZiAoaW5wdXQtPmhpZ2hfdGltZXIgPT0gMCkgeworCQkJCQkJaWYgKGlucHV0LT51LmtiZC5wcmVzc19zdHJbMF0pCisJCQkJCQkJa2V5cGFkX3NlbmRfa2V5KGlucHV0LT4KKwkJCQkJCQkJCXUua2JkLgorCQkJCQkJCQkJcHJlc3Nfc3RyLAorCQkJCQkJCQkJc2l6ZW9mCisJCQkJCQkJCQkoaW5wdXQtPgorCQkJCQkJCQkJIHUua2JkLgorCQkJCQkJCQkJIHByZXNzX3N0cikpOworCQkJCQl9CisKKwkJCQkJaWYgKGlucHV0LT51LmtiZC5yZXBlYXRfc3RyWzBdKSB7CisJCQkJCQlpZiAoaW5wdXQtPmhpZ2hfdGltZXIgPj0KKwkJCQkJCSAgICBLRVlQQURfUkVQX1NUQVJUKSB7CisJCQkJCQkJaW5wdXQtPmhpZ2hfdGltZXIgLT0KKwkJCQkJCQkgICAgS0VZUEFEX1JFUF9ERUxBWTsKKwkJCQkJCQlrZXlwYWRfc2VuZF9rZXkoaW5wdXQtPgorCQkJCQkJCQkJdS5rYmQuCisJCQkJCQkJCQlyZXBlYXRfc3RyLAorCQkJCQkJCQkJc2l6ZW9mCisJCQkJCQkJCQkoaW5wdXQtPgorCQkJCQkJCQkJIHUua2JkLgorCQkJCQkJCQkJIHJlcGVhdF9zdHIpKTsKKwkJCQkJCX0KKwkJCQkJCWlucHV0c19zdGFibGUgPSAwOwkvKiB3ZSB3aWxsIG5lZWQgdG8gY29tZSBiYWNrIGhlcmUgc29vbiAqLworCQkJCQl9CisKKwkJCQkJaWYgKGlucHV0LT5oaWdoX3RpbWVyIDwgMjU1KQorCQkJCQkJaW5wdXQtPmhpZ2hfdGltZXIrKzsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCS8qIGVsc2Ugc2lnbmFsIGZhbGxpbmcgZG93bi4gTGV0J3MgZmFsbCB0aHJvdWdoLiAqLworCQkJCWlucHV0LT5zdGF0ZSA9IElOUFVUX1NUX0ZBTExJTkc7CisJCQkJaW5wdXQtPmZhbGxfdGltZXIgPSAwOworCQkJfQorCQkJLyogbm8gYnJlYWsgaGVyZSwgZmFsbCB0aHJvdWdoICovCisJCWNhc2UgSU5QVVRfU1RfRkFMTElORzoKKyNpZiAwCisJCQkvKiBGSVhNRSAhISEgc2FtZSBjb21tZW50IGFzIGFib3ZlICovCisJCQlpZiAoKChwaHlzX3ByZXYgJiBpbnB1dC0+bWFzaykgPT0gaW5wdXQtPnZhbHVlKQorCQkJICAgICYmICgocGh5c19jdXJyICYgaW5wdXQtPm1hc2spID4gaW5wdXQtPnZhbHVlKSkgeworCQkJCWlucHV0LT5zdGF0ZSA9IElOUFVUX1NUX0xPVzsJLyogaW52YWxpZGF0ZSAqLworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmCisKKwkJCWlmICgocGh5c19jdXJyICYgaW5wdXQtPm1hc2spID09IGlucHV0LT52YWx1ZSkgeworCQkJCWlmIChpbnB1dC0+dHlwZSA9PSBJTlBVVF9UWVBFX0tCRCkgeworCQkJCQlrZXlwcmVzc2VkID0gMTsJLyogd2lsbCB0dXJuIG9uIHRoZSBsaWdodCAqLworCisJCQkJCWlmIChpbnB1dC0+dS5rYmQucmVwZWF0X3N0clswXSkgeworCQkJCQkJaWYgKGlucHV0LT5oaWdoX3RpbWVyID49IEtFWVBBRF9SRVBfU1RBUlQpCisJCQkJCQkJaW5wdXQtPmhpZ2hfdGltZXIgLT0gS0VZUEFEX1JFUF9ERUxBWTsKKwkJCQkJCWtleXBhZF9zZW5kX2tleShpbnB1dC0+dS5rYmQucmVwZWF0X3N0ciwKKwkJCQkJCQkJc2l6ZW9mKGlucHV0LT51LmtiZC5yZXBlYXRfc3RyKSk7CisJCQkJCQlpbnB1dHNfc3RhYmxlID0gMDsJLyogd2Ugd2lsbCBuZWVkIHRvIGNvbWUgYmFjayBoZXJlIHNvb24gKi8KKwkJCQkJfQorCisJCQkJCWlmIChpbnB1dC0+aGlnaF90aW1lciA8IDI1NSkKKwkJCQkJCWlucHV0LT5oaWdoX3RpbWVyKys7CisJCQkJfQorCQkJCWlucHV0LT5zdGF0ZSA9IElOUFVUX1NUX0hJR0g7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKGlucHV0LT5mYWxsX3RpbWVyID49IGlucHV0LT5mYWxsX3RpbWUpIHsKKwkJCQkvKiBjYWxsIHJlbGVhc2UgZXZlbnQgKi8KKwkJCQlpZiAoaW5wdXQtPnR5cGUgPT0gSU5QVVRfVFlQRV9TVEQpIHsKKwkJCQkJaWYgKGlucHV0LT51LnN0ZC5yZWxlYXNlX2ZjdCAhPSBOVUxMKQorCQkJCQkJaW5wdXQtPnUuc3RkLnJlbGVhc2VfZmN0KGlucHV0LT51LnN0ZC5yZWxlYXNlX2RhdGEpOworCisJCQkJfSBlbHNlIGlmIChpbnB1dC0+dHlwZSA9PSBJTlBVVF9UWVBFX0tCRCkgeworCQkJCQlpZiAoaW5wdXQtPnUua2JkLnJlbGVhc2Vfc3RyWzBdKQorCQkJCQkJa2V5cGFkX3NlbmRfa2V5KGlucHV0LT51LmtiZC5yZWxlYXNlX3N0ciwKKwkJCQkJCQkJc2l6ZW9mKGlucHV0LT51LmtiZC5yZWxlYXNlX3N0cikpOworCQkJCX0KKworCQkJCWlucHV0LT5zdGF0ZSA9IElOUFVUX1NUX0xPVzsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJaW5wdXQtPmZhbGxfdGltZXIrKzsKKwkJCQlpbnB1dHNfc3RhYmxlID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcGFuZWxfc2Nhbl90aW1lcih2b2lkKQoreworCWlmIChrZXlwYWRfZW5hYmxlZCAmJiBrZXlwYWRfaW5pdGlhbGl6ZWQpIHsKKwkJaWYgKHNwaW5fdHJ5bG9jaygmcHBydF9sb2NrKSkgeworCQkJcGh5c19zY2FuX2NvbnRhY3RzKCk7CisJCQlzcGluX3VubG9jaygmcHBydF9sb2NrKTsJLyogbm8gbmVlZCBmb3IgdGhlIHBhcnBvcnQgYW55bW9yZSAqLworCQl9CisKKwkJaWYgKCFpbnB1dHNfc3RhYmxlIHx8IHBoeXNfY3VyciAhPSBwaHlzX3ByZXYpCisJCQlwYW5lbF9wcm9jZXNzX2lucHV0cygpOworCX0KKworCWlmIChsY2RfZW5hYmxlZCAmJiBsY2RfaW5pdGlhbGl6ZWQpIHsKKwkJaWYgKGtleXByZXNzZWQpIHsKKwkJCWlmIChsaWdodF90ZW1wbyA9PSAwICYmICgobGNkX2ZsYWdzICYgTENEX0ZMQUdfTCkgPT0gMCkpCisJCQkJbGNkX2JhY2tsaWdodCgxKTsKKwkJCWxpZ2h0X3RlbXBvID0gRkxBU0hfTElHSFRfVEVNUE87CisJCX0gZWxzZSBpZiAobGlnaHRfdGVtcG8gPiAwKSB7CisJCQlsaWdodF90ZW1wby0tOworCQkJaWYgKGxpZ2h0X3RlbXBvID09IDAgJiYgKChsY2RfZmxhZ3MgJiBMQ0RfRkxBR19MKSA9PSAwKSkKKwkJCQlsY2RfYmFja2xpZ2h0KDApOworCQl9CisJfQorCisJbW9kX3RpbWVyKCZzY2FuX3RpbWVyLCBqaWZmaWVzICsgSU5QVVRfUE9MTF9USU1FKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9zY2FuX3RpbWVyKHZvaWQpCit7CisJaWYgKHNjYW5fdGltZXIuZnVuY3Rpb24gIT0gTlVMTCkKKwkJcmV0dXJuOwkJLyogYWxyZWFkeSBzdGFydGVkICovCisKKwlpbml0X3RpbWVyKCZzY2FuX3RpbWVyKTsKKwlzY2FuX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSU5QVVRfUE9MTF9USU1FOworCXNjYW5fdGltZXIuZGF0YSA9IDA7CisJc2Nhbl90aW1lci5mdW5jdGlvbiA9ICh2b2lkICopJnBhbmVsX3NjYW5fdGltZXI7CisJYWRkX3RpbWVyKCZzY2FuX3RpbWVyKTsKK30KKworLyogY29udmVydHMgYSBuYW1lIG9mIHRoZSBmb3JtICIoe0JiQWFQcFNzRWV9ezAxMjM0NTY3LX0pKiIgdG8gYSBzZXJpZXMgb2YgYml0cy4KKyAqIGlmIDxvbWFzaz4gb3IgPGltYXNrPiBhcmUgbm9uLW51bGwsIHRoZXkgd2lsbCBiZSBvcidlZCB3aXRoIHRoZSBiaXRzIGNvcnJlc3BvbmRpbmcKKyAqIHRvIG91dCBhbmQgaW4gYml0cyByZXNwZWN0aXZlbHkuCisgKiByZXR1cm5zIDEgaWYgb2ssIDAgaWYgZXJyb3IgKGluIHdoaWNoIGNhc2UsIG5vdGhpbmcgaXMgd3JpdHRlbikuCisgKi8KK3N0YXRpYyBpbnQgaW5wdXRfbmFtZTJtYXNrKGNoYXIgKm5hbWUsIHBtYXNrX3QgKm1hc2ssIHBtYXNrX3QgKnZhbHVlLAorCQkJICAgY2hhciAqaW1hc2ssIGNoYXIgKm9tYXNrKQoreworCXN0YXRpYyBjaGFyIHNpZ3RhYlsxMF0gPSAiRWVTc1BwQWFCYiI7CisJY2hhciBpbSwgb207CisJcG1hc2tfdCBtLCB2OworCisJb20gPSBpbSA9IG0gPSB2ID0gMFVMTDsKKwl3aGlsZSAoKm5hbWUpIHsKKwkJaW50IGluLCBvdXQsIGJpdCwgbmVnOworCQlmb3IgKGluID0gMDsgKGluIDwgc2l6ZW9mKHNpZ3RhYikpICYmIChzaWd0YWJbaW5dICE9ICpuYW1lKTsgaW4rKykKKwkJCTsKKwkJaWYgKGluID49IHNpemVvZihzaWd0YWIpKQorCQkJcmV0dXJuIDA7CS8qIGlucHV0IG5hbWUgbm90IGZvdW5kICovCisJCW5lZyA9IChpbiAmIDEpOwkvKiBvZGQgKGxvd2VyKSBuYW1lcyBhcmUgbmVnYXRlZCAqLworCQlpbiA+Pj0gMTsKKwkJaW0gfD0gKDEgPDwgaW4pOworCisJCW5hbWUrKzsKKwkJaWYgKGlzZGlnaXQoKm5hbWUpKSB7CisJCQlvdXQgPSAqbmFtZSAtICcwJzsKKwkJCW9tIHw9ICgxIDw8IG91dCk7CisJCX0gZWxzZSBpZiAoKm5hbWUgPT0gJy0nKQorCQkJb3V0ID0gODsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CS8qIHVua25vd24gYml0IG5hbWUgKi8KKworCQliaXQgPSAob3V0ICogNSkgKyBpbjsKKworCQltIHw9IDFVTEwgPDwgYml0OworCQlpZiAoIW5lZykKKwkJCXYgfD0gMVVMTCA8PCBiaXQ7CisJCW5hbWUrKzsKKwl9CisJKm1hc2sgPSBtOworCSp2YWx1ZSA9IHY7CisJaWYgKGltYXNrKQorCQkqaW1hc2sgfD0gaW07CisJaWYgKG9tYXNrKQorCQkqb21hc2sgfD0gb207CisJcmV0dXJuIDE7Cit9CisKKy8qIHRyaWVzIHRvIGJpbmQgYSBrZXkgdG8gdGhlIHNpZ25hbCBuYW1lIDxuYW1lPi4gVGhlIGtleSB3aWxsIHNlbmQgdGhlCisgKiBzdHJpbmdzIDxwcmVzcz4sIDxyZXBlYXQ+LCA8cmVsZWFzZT4gZm9yIHRoZXNlIHJlc3BlY3RpdmUgZXZlbnRzLgorICogUmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgbmV3IGtleSBpZiBvaywgTlVMTCBpZiB0aGUga2V5IGNvdWxkIG5vdCBiZSBib3VuZC4KKyAqLworc3RhdGljIHN0cnVjdCBsb2dpY2FsX2lucHV0ICpwYW5lbF9iaW5kX2tleShjaGFyICpuYW1lLCBjaGFyICpwcmVzcywKKwkJCQkJICAgIGNoYXIgKnJlcGVhdCwgY2hhciAqcmVsZWFzZSkKK3sKKwlzdHJ1Y3QgbG9naWNhbF9pbnB1dCAqa2V5OworCisJa2V5ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxvZ2ljYWxfaW5wdXQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWtleSkgeworCQlwcmludGsoS0VSTl9FUlIgInBhbmVsOiBub3QgZW5vdWdoIG1lbW9yeVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwltZW1zZXQoa2V5LCAwLCBzaXplb2Yoc3RydWN0IGxvZ2ljYWxfaW5wdXQpKTsKKwlpZiAoIWlucHV0X25hbWUybWFzayhuYW1lLCAma2V5LT5tYXNrLCAma2V5LT52YWx1ZSwgJnNjYW5fbWFza19pLAorCQkJICAgICAmc2Nhbl9tYXNrX28pKQorCQlyZXR1cm4gTlVMTDsKKworCWtleS0+dHlwZSA9IElOUFVUX1RZUEVfS0JEOworCWtleS0+c3RhdGUgPSBJTlBVVF9TVF9MT1c7CisJa2V5LT5yaXNlX3RpbWUgPSAxOworCWtleS0+ZmFsbF90aW1lID0gMTsKKworI2lmIDAKKwlwcmludGsoS0VSTl9ERUJVRyAiYmluZDogPCVzPiA6IG09JTAxNkx4IHY9JTAxNkx4XG4iLCBuYW1lLCBrZXktPm1hc2ssCisJICAgICAgIGtleS0+dmFsdWUpOworI2VuZGlmCisJc3RybmNweShrZXktPnUua2JkLnByZXNzX3N0ciwgcHJlc3MsIHNpemVvZihrZXktPnUua2JkLnByZXNzX3N0cikpOworCXN0cm5jcHkoa2V5LT51LmtiZC5yZXBlYXRfc3RyLCByZXBlYXQsIHNpemVvZihrZXktPnUua2JkLnJlcGVhdF9zdHIpKTsKKwlzdHJuY3B5KGtleS0+dS5rYmQucmVsZWFzZV9zdHIsIHJlbGVhc2UsCisJCXNpemVvZihrZXktPnUua2JkLnJlbGVhc2Vfc3RyKSk7CisJbGlzdF9hZGQoJmtleS0+bGlzdCwgJmxvZ2ljYWxfaW5wdXRzKTsKKwlyZXR1cm4ga2V5OworfQorCisjaWYgMAorLyogdHJpZXMgdG8gYmluZCBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHRoZSBzaWduYWwgbmFtZSA8bmFtZT4uIFRoZSBmdW5jdGlvbgorICogPHByZXNzX2ZjdD4gd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgPHByZXNzX2RhdGE+IGFyZyB3aGVuIHRoZSBzaWduYWwgaXMKKyAqIGFjdGl2YXRlZCwgYW5kIHNvIG9uIGZvciA8cmVsZWFzZV9mY3Q+LzxyZWxlYXNlX2RhdGE+CisgKiBSZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBuZXcgc2lnbmFsIGlmIG9rLCBOVUxMIGlmIHRoZSBzaWduYWwgY291bGQgbm90IGJlIGJvdW5kLgorICovCitzdGF0aWMgc3RydWN0IGxvZ2ljYWxfaW5wdXQgKnBhbmVsX2JpbmRfY2FsbGJhY2soY2hhciAqbmFtZSwKKwkJCQkJCSB2b2lkICgqcHJlc3NfZmN0KSAoaW50KSwKKwkJCQkJCSBpbnQgcHJlc3NfZGF0YSwKKwkJCQkJCSB2b2lkICgqcmVsZWFzZV9mY3QpIChpbnQpLAorCQkJCQkJIGludCByZWxlYXNlX2RhdGEpCit7CisJc3RydWN0IGxvZ2ljYWxfaW5wdXQgKmNhbGxiYWNrOworCisJY2FsbGJhY2sgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbG9naWNhbF9pbnB1dCksIEdGUF9LRVJORUwpOworCWlmICghY2FsbGJhY2spIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJwYW5lbDogbm90IGVub3VnaCBtZW1vcnlcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtc2V0KGNhbGxiYWNrLCAwLCBzaXplb2Yoc3RydWN0IGxvZ2ljYWxfaW5wdXQpKTsKKwlpZiAoIWlucHV0X25hbWUybWFzayhuYW1lLCAmY2FsbGJhY2stPm1hc2ssICZjYWxsYmFjay0+dmFsdWUsCisJCQkgICAgICZzY2FuX21hc2tfaSwgJnNjYW5fbWFza19vKSkKKwkJcmV0dXJuIE5VTEw7CisKKwljYWxsYmFjay0+dHlwZSA9IElOUFVUX1RZUEVfU1REOworCWNhbGxiYWNrLT5zdGF0ZSA9IElOUFVUX1NUX0xPVzsKKwljYWxsYmFjay0+cmlzZV90aW1lID0gMTsKKwljYWxsYmFjay0+ZmFsbF90aW1lID0gMTsKKwljYWxsYmFjay0+dS5zdGQucHJlc3NfZmN0ID0gcHJlc3NfZmN0OworCWNhbGxiYWNrLT51LnN0ZC5wcmVzc19kYXRhID0gcHJlc3NfZGF0YTsKKwljYWxsYmFjay0+dS5zdGQucmVsZWFzZV9mY3QgPSByZWxlYXNlX2ZjdDsKKwljYWxsYmFjay0+dS5zdGQucmVsZWFzZV9kYXRhID0gcmVsZWFzZV9kYXRhOworCWxpc3RfYWRkKCZjYWxsYmFjay0+bGlzdCwgJmxvZ2ljYWxfaW5wdXRzKTsKKwlyZXR1cm4gY2FsbGJhY2s7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQga2V5cGFkX2luaXQodm9pZCkKK3sKKwlpbnQga2V5bnVtOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmtleXBhZF9yZWFkX3dhaXQpOworCWtleXBhZF9idWZsZW4gPSAwOwkvKiBmbHVzaGVzIGFueSBldmVudHVhbCBub2lzeSBrZXlzdHJva2UgKi8KKworCS8qIExldCdzIGNyZWF0ZSBhbGwga25vd24ga2V5cyAqLworCisJZm9yIChrZXludW0gPSAwOyBrZXlwYWRfcHJvZmlsZVtrZXludW1dWzBdWzBdOyBrZXludW0rKykgeworCQlwYW5lbF9iaW5kX2tleShrZXlwYWRfcHJvZmlsZVtrZXludW1dWzBdLAorCQkJICAgICAgIGtleXBhZF9wcm9maWxlW2tleW51bV1bMV0sCisJCQkgICAgICAga2V5cGFkX3Byb2ZpbGVba2V5bnVtXVsyXSwKKwkJCSAgICAgICBrZXlwYWRfcHJvZmlsZVtrZXludW1dWzNdKTsKKwl9CisKKwlpbml0X3NjYW5fdGltZXIoKTsKKwlrZXlwYWRfaW5pdGlhbGl6ZWQgPSAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBkZXZpY2UgaW5pdGlhbGl6YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgcGFuZWxfbm90aWZ5X3N5cyhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgY29kZSwKKwkJCSAgICB2b2lkICp1bnVzZWQpCit7CisJaWYgKGxjZF9lbmFibGVkICYmIGxjZF9pbml0aWFsaXplZCkgeworCQlzd2l0Y2ggKGNvZGUpIHsKKwkJY2FzZSBTWVNfRE9XTjoKKwkJCXBhbmVsX2xjZF9wcmludAorCQkJICAgICgiXHgwY1JlbG9hZGluZ1xuU3lzdGVtLi4uXHgxYltMY1x4MWJbTGJceDFiW0wrIik7CisJCQlicmVhazsKKwkJY2FzZSBTWVNfSEFMVDoKKwkJCXBhbmVsX2xjZF9wcmludAorCQkJICAgICgiXHgwY1N5c3RlbSBIYWx0ZWQuXHgxYltMY1x4MWJbTGJceDFiW0wrIik7CisJCQlicmVhazsKKwkJY2FzZSBTWVNfUE9XRVJfT0ZGOgorCQkJcGFuZWxfbGNkX3ByaW50KCJceDBjUG93ZXIgb2ZmLlx4MWJbTGNceDFiW0xiXHgxYltMKyIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcGFuZWxfbm90aWZpZXIgPSB7CisJcGFuZWxfbm90aWZ5X3N5cywKKwlOVUxMLAorCTAKK307CisKK3N0YXRpYyB2b2lkIHBhbmVsX2F0dGFjaChzdHJ1Y3QgcGFycG9ydCAqcG9ydCkKK3sKKwlpZiAocG9ydC0+bnVtYmVyICE9IHBhcnBvcnQpCisJCXJldHVybjsKKworCWlmIChwcHJ0KSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgInBhbmVsX2F0dGFjaCgpOiBwb3J0LT5udW1iZXI9JWQgcGFycG9ydD0lZCwgYWxyZWFkeSByZWdpc3RlcmVkICFcbiIsCisJCSAgICAgICBwb3J0LT5udW1iZXIsIHBhcnBvcnQpOworCQlyZXR1cm47CisJfQorCisJcHBydCA9IHBhcnBvcnRfcmVnaXN0ZXJfZGV2aWNlKHBvcnQsICJwYW5lbCIsIE5VTEwsIE5VTEwsCS8qIHBmLCBrZiAqLworCQkJCSAgICAgICBOVUxMLAorCQkJCSAgICAgICAvKlBBUlBPUlRfREVWX0VYQ0wgKi8KKwkJCQkgICAgICAgMCwgKHZvaWQgKikmcHBydCk7CisKKwlpZiAocGFycG9ydF9jbGFpbShwcHJ0KSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJQYW5lbDogY291bGQgbm90IGNsYWltIGFjY2VzcyB0byBwYXJwb3J0JWQuIEFib3J0aW5nLlxuIiwKKwkJICAgICAgIHBhcnBvcnQpOworCQlyZXR1cm47CisJfQorCisJLyogbXVzdCBpbml0IExDRCBmaXJzdCwganVzdCBpbiBjYXNlIGFuIElSUSBmcm9tIHRoZSBrZXlwYWQgaXMgZ2VuZXJhdGVkIGF0IGtleXBhZCBpbml0ICovCisJaWYgKGxjZF9lbmFibGVkKSB7CisJCWxjZF9pbml0KCk7CisJCW1pc2NfcmVnaXN0ZXIoJmxjZF9kZXYpOworCX0KKworCWlmIChrZXlwYWRfZW5hYmxlZCkgeworCQlrZXlwYWRfaW5pdCgpOworCQltaXNjX3JlZ2lzdGVyKCZrZXlwYWRfZGV2KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBhbmVsX2RldGFjaChzdHJ1Y3QgcGFycG9ydCAqcG9ydCkKK3sKKwlpZiAocG9ydC0+bnVtYmVyICE9IHBhcnBvcnQpCisJCXJldHVybjsKKworCWlmICghcHBydCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJwYW5lbF9kZXRhY2goKTogcG9ydC0+bnVtYmVyPSVkIHBhcnBvcnQ9JWQsIG5vdGhpbmcgdG8gdW5yZWdpc3Rlci5cbiIsCisJCSAgICAgICBwb3J0LT5udW1iZXIsIHBhcnBvcnQpOworCQlyZXR1cm47CisJfQorCisJaWYgKGtleXBhZF9lbmFibGVkICYmIGtleXBhZF9pbml0aWFsaXplZCkKKwkJbWlzY19kZXJlZ2lzdGVyKCZrZXlwYWRfZGV2KTsKKworCWlmIChsY2RfZW5hYmxlZCAmJiBsY2RfaW5pdGlhbGl6ZWQpCisJCW1pc2NfZGVyZWdpc3RlcigmbGNkX2Rldik7CisKKwlwYXJwb3J0X3JlbGVhc2UocHBydCk7CisJcGFycG9ydF91bnJlZ2lzdGVyX2RldmljZShwcHJ0KTsKKwlwcHJ0ID0gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBwYXJwb3J0X2RyaXZlciBwYW5lbF9kcml2ZXIgPSB7CisJLm5hbWUgPSAicGFuZWwiLAorCS5hdHRhY2ggPSBwYW5lbF9hdHRhY2gsCisJLmRldGFjaCA9IHBhbmVsX2RldGFjaCwKK307CisKKy8qIGluaXQgZnVuY3Rpb24gKi8KK2ludCBwYW5lbF9pbml0KHZvaWQpCit7CisJLyogZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCisJaWYgKGtleXBhZF90eXBlIDwgMCkKKwkJa2V5cGFkX3R5cGUgPSBrZXlwYWRfZW5hYmxlZDsKKworCWlmIChsY2RfdHlwZSA8IDApCisJCWxjZF90eXBlID0gbGNkX2VuYWJsZWQ7CisKKwlpZiAocGFycG9ydCA8IDApCisJCXBhcnBvcnQgPSBERUZBVUxUX1BBUlBPUlQ7CisKKwkvKiB0YWtlIGNhcmUgb2YgYW4gZXZlbnR1YWwgcHJvZmlsZSAqLworCXN3aXRjaCAocHJvZmlsZSkgeworCWNhc2UgUEFORUxfUFJPRklMRV9DVVNUT006CS8qIGN1c3RvbSBwcm9maWxlICovCisJCWlmIChrZXlwYWRfdHlwZSA8IDApCisJCQlrZXlwYWRfdHlwZSA9IERFRkFVTFRfS0VZUEFEOworCQlpZiAobGNkX3R5cGUgPCAwKQorCQkJbGNkX3R5cGUgPSBERUZBVUxUX0xDRDsKKwkJYnJlYWs7CisJY2FzZSBQQU5FTF9QUk9GSUxFX09MRDoJLyogOCBiaXRzLCAyKjE2LCBvbGQga2V5cGFkICovCisJCWlmIChrZXlwYWRfdHlwZSA8IDApCisJCQlrZXlwYWRfdHlwZSA9IEtFWVBBRF9UWVBFX09MRDsKKwkJaWYgKGxjZF90eXBlIDwgMCkKKwkJCWxjZF90eXBlID0gTENEX1RZUEVfT0xEOworCQlpZiAobGNkX3dpZHRoIDwgMCkKKwkJCWxjZF93aWR0aCA9IDE2OworCQlpZiAobGNkX2h3aWR0aCA8IDApCisJCQlsY2RfaHdpZHRoID0gMTY7CisJCWJyZWFrOworCWNhc2UgUEFORUxfUFJPRklMRV9ORVc6CS8qIHNlcmlhbCwgMioxNiwgbmV3IGtleXBhZCAqLworCQlpZiAoa2V5cGFkX3R5cGUgPCAwKQorCQkJa2V5cGFkX3R5cGUgPSBLRVlQQURfVFlQRV9ORVc7CisJCWlmIChsY2RfdHlwZSA8IDApCisJCQlsY2RfdHlwZSA9IExDRF9UWVBFX0tTMDA3NDsKKwkJYnJlYWs7CisJY2FzZSBQQU5FTF9QUk9GSUxFX0hBTlRST05JWDoJLyogOCBiaXRzLCAyKjE2IGhhbnRyb25peC1saWtlLCBubyBrZXlwYWQgKi8KKwkJaWYgKGtleXBhZF90eXBlIDwgMCkKKwkJCWtleXBhZF90eXBlID0gS0VZUEFEX1RZUEVfTk9ORTsKKwkJaWYgKGxjZF90eXBlIDwgMCkKKwkJCWxjZF90eXBlID0gTENEX1RZUEVfSEFOVFJPTklYOworCQlicmVhazsKKwljYXNlIFBBTkVMX1BST0ZJTEVfTkVYQ09NOgkvKiBnZW5lcmljIDggYml0cywgMioxNiwgbmV4Y29tIGtleXBhZCwgZWcuIE5leGNvbS4gKi8KKwkJaWYgKGtleXBhZF90eXBlIDwgMCkKKwkJCWtleXBhZF90eXBlID0gS0VZUEFEX1RZUEVfTkVYQ09NOworCQlpZiAobGNkX3R5cGUgPCAwKQorCQkJbGNkX3R5cGUgPSBMQ0RfVFlQRV9ORVhDT007CisJCWJyZWFrOworCWNhc2UgUEFORUxfUFJPRklMRV9MQVJHRToJLyogOCBiaXRzLCAyKjQwLCBvbGQga2V5cGFkICovCisJCWlmIChrZXlwYWRfdHlwZSA8IDApCisJCQlrZXlwYWRfdHlwZSA9IEtFWVBBRF9UWVBFX09MRDsKKwkJaWYgKGxjZF90eXBlIDwgMCkKKwkJCWxjZF90eXBlID0gTENEX1RZUEVfT0xEOworCQlicmVhazsKKwl9CisKKwlsY2RfZW5hYmxlZCA9IChsY2RfdHlwZSA+IDApOworCWtleXBhZF9lbmFibGVkID0gKGtleXBhZF90eXBlID4gMCk7CisKKwlzd2l0Y2ggKGtleXBhZF90eXBlKSB7CisJY2FzZSBLRVlQQURfVFlQRV9PTEQ6CisJCWtleXBhZF9wcm9maWxlID0gb2xkX2tleXBhZF9wcm9maWxlOworCQlicmVhazsKKwljYXNlIEtFWVBBRF9UWVBFX05FVzoKKwkJa2V5cGFkX3Byb2ZpbGUgPSBuZXdfa2V5cGFkX3Byb2ZpbGU7CisJCWJyZWFrOworCWNhc2UgS0VZUEFEX1RZUEVfTkVYQ09NOgorCQlrZXlwYWRfcHJvZmlsZSA9IG5leGNvbV9rZXlwYWRfcHJvZmlsZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJa2V5cGFkX3Byb2ZpbGUgPSBOVUxMOworCQlicmVhazsKKwl9CisKKwkvKiB0ZWxscyB2YXJpb3VzIHN1YnN5c3RlbXMgYWJvdXQgdGhlIGZhY3QgdGhhdCB3ZSBhcmUgaW5pdGlhbGl6aW5nICovCisJaW5pdF9pbl9wcm9ncmVzcyA9IDE7CisKKwlpZiAocGFycG9ydF9yZWdpc3Rlcl9kcml2ZXIoJnBhbmVsX2RyaXZlcikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiUGFuZWw6IGNvdWxkIG5vdCByZWdpc3RlciB3aXRoIHBhcnBvcnQuIEFib3J0aW5nLlxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmICghbGNkX2VuYWJsZWQgJiYgIWtleXBhZF9lbmFibGVkKSB7CisJCS8qIG5vIGRldmljZSBlbmFibGVkLCBsZXQncyByZWxlYXNlIHRoZSBwYXJwb3J0ICovCisJCWlmIChwcHJ0KSB7CisJCQlwYXJwb3J0X3JlbGVhc2UocHBydCk7CisJCQlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKHBwcnQpOworCQl9CisJCXBhcnBvcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJnBhbmVsX2RyaXZlcik7CisJCXByaW50ayhLRVJOX0VSUiAiUGFuZWwgZHJpdmVyIHZlcnNpb24gIiBQQU5FTF9WRVJTSU9OCisJCSAgICAgICAiIGRpc2FibGVkLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmcGFuZWxfbm90aWZpZXIpOworCisJaWYgKHBwcnQpCisJCXByaW50ayhLRVJOX0lORk8gIlBhbmVsIGRyaXZlciB2ZXJzaW9uICIgUEFORUxfVkVSU0lPTgorCQkgICAgICAgIiByZWdpc3RlcmVkIG9uIHBhcnBvcnQlZCAoaW89MHglbHgpLlxuIiwgcGFycG9ydCwKKwkJICAgICAgIHBwcnQtPnBvcnQtPmJhc2UpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUGFuZWwgZHJpdmVyIHZlcnNpb24gIiBQQU5FTF9WRVJTSU9OCisJCSAgICAgICAiIG5vdCB5ZXQgcmVnaXN0ZXJlZFxuIik7CisJLyogdGVsbHMgdmFyaW91cyBzdWJzeXN0ZW1zIGFib3V0IHRoZSBmYWN0IHRoYXQgaW5pdGlhbGl6YXRpb24gaXMgZmluaXNoZWQgKi8KKwlpbml0X2luX3Byb2dyZXNzID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgcGFuZWxfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gcGFuZWxfaW5pdCgpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcGFuZWxfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmcGFuZWxfbm90aWZpZXIpOworCisJaWYgKHNjYW5fdGltZXIuZnVuY3Rpb24gIT0gTlVMTCkKKwkJZGVsX3RpbWVyKCZzY2FuX3RpbWVyKTsKKworCWlmIChrZXlwYWRfZW5hYmxlZCkKKwkJbWlzY19kZXJlZ2lzdGVyKCZrZXlwYWRfZGV2KTsKKworCWlmIChsY2RfZW5hYmxlZCkgeworCQlwYW5lbF9sY2RfcHJpbnQoIlx4MGNMQ0QgZHJpdmVyICIgUEFORUxfVkVSU0lPTgorCQkJCSJcbnVubG9hZGVkLlx4MWJbTGNceDFiW0xiXHgxYltMLSIpOworCQltaXNjX2RlcmVnaXN0ZXIoJmxjZF9kZXYpOworCX0KKworCS8qIFRPRE86IGZyZWUgYWxsIGlucHV0IHNpZ25hbHMgKi8KKworCXBhcnBvcnRfcmVsZWFzZShwcHJ0KTsKKwlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKHBwcnQpOworCXBhcnBvcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJnBhbmVsX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHBhbmVsX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHBhbmVsX2NsZWFudXBfbW9kdWxlKTsKK01PRFVMRV9BVVRIT1IoIldpbGx5IFRhcnJlYXUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjLWluZGVudC1sZXZlbDogNAorICogIHRhYi13aWR0aDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcG9jaC9SRUFETUUgYi9kcml2ZXJzL3N0YWdpbmcvcG9jaC9SRUFETUUKaW5kZXggZjY1ZTk3OS4uODQyYWZkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3BvY2gvUkVBRE1FCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9wb2NoL1JFQURNRQpAQCAtMSw1ICsxLDEyIEBACiBUT0RPOgotCS0gZml4IHRyYW5zbWl0IG92ZXJmbG93cworCS0gUnggYmxvY2sgc2l6ZSBpcyBsaW1pdGVkIHRvIDwgMjA0OCwgaGFyZHdhcmUgYnVnPworCS0gR3JvdXAgc2l6ZSBpcyBsaW1pdGVkIHRvIDwgcGFnZSBzaXplLCBrZXJuZWwgYWxsb2MvbW1hcCBBUEkgaXNzdWVzCisJLSBmaXgvd29ya2Fyb3VuZCBjYWNoZSBpc3N1ZXMgaW4gY2lyY3VsYXIgYnVmZmVyIGhlYWRlcgorCS0gdGVzdCB3aGV0aGVyIFR4IGlzIHRyYW5zbWl0dGluZyBkYXRhIGZyb20gcHJvdmlkZWQgYnVmZmVycworCS0gaGFuZGxlIGRldmljZSB1bnBsdWcgY2FzZQorCS0gaGFuZGxlIHRlbXBlcmF0dXJlIGFib3ZlIHRocmVzaG9sZAorCS0gdXNlIGJ1cyBhZGRyZXNzIGluc3RlYWQgb2YgcGh5c2ljYWwgYWRkcmVzcyBmb3IgRE1BCisJLSBzdXBwb3J0IGZvciBzbmFwc2hvdCBtb2RlCiAJLSBhdWRpdCB1c2Vyc3BhY2UgaW50ZXJmYWNlcwogCS0gZ2V0IHJlc2VydmVkIG1ham9yL21pbm9yIGlmIG5lZWRlZAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcG9jaC9wb2NoLmMgYi9kcml2ZXJzL3N0YWdpbmcvcG9jaC9wb2NoLmMKaW5kZXggMGUxMTNmOS4uZWMzNDNlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3BvY2gvcG9jaC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9wb2NoL3BvY2guYwpAQCAtMTI2LDkgKzEyNiwxMSBAQAogI2RlZmluZSBGUEdBX0lOVF9UWF9BQ1FfRE9ORQkJKDB4MSA8PCAxKQogI2RlZmluZSBGUEdBX0lOVF9SWF9BQ1FfRE9ORQkJKDB4MSkKIAotI2RlZmluZSBGUEdBX1JYX0FEQ19DVExfUkVHCQkweDIxNAotI2RlZmluZSBGUEdBX1JYX0FEQ19DVExfQ09OVF9DQVAJKDB4MCkKLSNkZWZpbmUgRlBHQV9SWF9BRENfQ1RMX1NOQVBfQ0FQCSgweDEpCisjZGVmaW5lIEZQR0FfUlhfQ1RMX1JFRwkJCTB4MjE0CisjZGVmaW5lIEZQR0FfUlhfQ1RMX0ZJRk9fRkxVU0ggICAgICAJKDB4MSA8PCA5KQorI2RlZmluZSBGUEdBX1JYX0NUTF9TWU5USF9EQVRBCQkoMHgxIDw8IDgpCisjZGVmaW5lIEZQR0FfUlhfQ1RMX0NPTlRfQ0FQCQkoMHgwIDw8IDEpCisjZGVmaW5lIEZQR0FfUlhfQ1RMX1NOQVBfQ0FQCQkoMHgxIDw8IDEpCiAKICNkZWZpbmUgRlBHQV9SWF9BUk1fUkVHCQkJMHgyMUMKIApAQCAtMjk5LDYgKzMwMSwxNCBAQAogfQogc3RhdGljIERFVklDRV9BVFRSKGRpciwgU19JUlVTUnxTX0lSR1JQLCBzaG93X2RpcmVjdGlvbiwgTlVMTCk7CiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG5wYWdlcyh1bnNpZ25lZCBsb25nIGJ5dGVzKQoreworCWlmIChieXRlcyAlIFBBR0VfU0laRSA9PSAwKQorCQlyZXR1cm4gYnl0ZXMgLyBQQUdFX1NJWkU7CisJZWxzZQorCQlyZXR1cm4gKGJ5dGVzIC8gUEFHRV9TSVpFKSArIDE7Cit9CisKIHN0YXRpYyBzc2l6ZV90IHNob3dfbW1hcF9zaXplKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CkBAIC0zMDksMTAgKzMxOSw4IEBACiAJdW5zaWduZWQgbG9uZyBoZWFkZXJfcGFnZXM7CiAJdW5zaWduZWQgbG9uZyB0b3RhbF9ncm91cF9wYWdlczsKIAotCS8qIEZJWE1FOiBXZSBkbyBub3QgaGF2ZSB0byBhZGQgMSwgaWYgZ3JvdXBfc2l6ZSBhIG11bHRpcGxlIG9mCi0JICAgUEFHRV9TSVpFLiAqLwotCWdyb3VwX3BhZ2VzID0gKGNoYW5uZWwtPmdyb3VwX3NpemUgLyBQQUdFX1NJWkUpICsgMTsKLQloZWFkZXJfcGFnZXMgPSAoY2hhbm5lbC0+aGVhZGVyX3NpemUgLyBQQUdFX1NJWkUpICsgMTsKKwlncm91cF9wYWdlcyA9IG5wYWdlcyhjaGFubmVsLT5ncm91cF9zaXplKTsKKwloZWFkZXJfcGFnZXMgPSBucGFnZXMoY2hhbm5lbC0+aGVhZGVyX3NpemUpOwogCXRvdGFsX2dyb3VwX3BhZ2VzID0gZ3JvdXBfcGFnZXMgKiBjaGFubmVsLT5ncm91cF9jb3VudDsKIAogCW1tYXBfc2l6ZSA9IChoZWFkZXJfcGFnZXMgKyB0b3RhbF9ncm91cF9wYWdlcykgKiBQQUdFX1NJWkU7CkBAIC0zNTAsOCArMzU4LDggQEAKIAl1bnNpZ25lZCBsb25nIGdyb3VwX3BhZ2VzOwogCXVuc2lnbmVkIGxvbmcgaGVhZGVyX3BhZ2VzOwogCi0JZ3JvdXBfcGFnZXMgPSAoY2hhbm5lbC0+Z3JvdXBfc2l6ZSAvIFBBR0VfU0laRSkgKyAxOwotCWhlYWRlcl9wYWdlcyA9IChjaGFubmVsLT5oZWFkZXJfc2l6ZSAvIFBBR0VfU0laRSkgKyAxOworCWdyb3VwX3BhZ2VzID0gbnBhZ2VzKGNoYW5uZWwtPmdyb3VwX3NpemUpOworCWhlYWRlcl9wYWdlcyA9IG5wYWdlcyhjaGFubmVsLT5oZWFkZXJfc2l6ZSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbC0+Z3JvdXBfY291bnQ7IGkrKykgewogCQlzdHJ1Y3QgcG9jaF9ncm91cF9pbmZvICpncm91cDsKQEAgLTM4NCwxOCArMzkyLDQ1IEBACiAJCWdyb3VwLT51c2VyX29mZnNldCA9CiAJCQkoaGVhZGVyX3BhZ2VzICsgKGkgKiBncm91cF9wYWdlcykpICogUEFHRV9TSVpFOwogCi0JCXByaW50ayhLRVJOX0lORk8gUEZYICIlbGQ6IHVzZXJfb2Zmc2V0OiAweCVseCBkbWE6IDB4JXhcbiIsIGksCi0JCSAgICAgICBncm91cC0+dXNlcl9vZmZzZXQsIGdyb3VwLT5kbWFfYWRkcik7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICIlbGQ6IHVzZXJfb2Zmc2V0OiAweCVseFxuIiwgaSwKKwkJICAgICAgIGdyb3VwLT51c2VyX29mZnNldCk7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGNoYW5uZWxfbGF0Y2hfYXR0cihzdHJ1Y3QgY2hhbm5lbF9pbmZvICpjaGFubmVsKQorc3RhdGljIGludCBjaGFubmVsX2xhdGNoX2F0dHIoc3RydWN0IGNoYW5uZWxfaW5mbyAqY2hhbm5lbCkKIHsKIAljaGFubmVsLT5ncm91cF9jb3VudCA9IGF0b21pY19yZWFkKCZjaGFubmVsLT5zeXNfZ3JvdXBfY291bnQpOwogCWNoYW5uZWwtPmdyb3VwX3NpemUgPSBhdG9taWNfcmVhZCgmY2hhbm5lbC0+c3lzX2dyb3VwX3NpemUpOwogCWNoYW5uZWwtPmJsb2NrX3NpemUgPSBhdG9taWNfcmVhZCgmY2hhbm5lbC0+c3lzX2Jsb2NrX3NpemUpOworCisJaWYgKGNoYW5uZWwtPmdyb3VwX2NvdW50ID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiaW52YWxpZCBncm91cCBjb3VudCAlbHUiLAorCQkgICAgICAgY2hhbm5lbC0+Z3JvdXBfY291bnQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoY2hhbm5lbC0+Z3JvdXBfc2l6ZSA9PSAwIHx8CisJICAgIGNoYW5uZWwtPmdyb3VwX3NpemUgPCBjaGFubmVsLT5ibG9ja19zaXplKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImludmFsaWQgZ3JvdXAgc2l6ZSAlbHUiLAorCQkgICAgICAgY2hhbm5lbC0+Z3JvdXBfc2l6ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjaGFubmVsLT5ibG9ja19zaXplID09IDAgfHwgKGNoYW5uZWwtPmJsb2NrX3NpemUgJSA4KSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImludmFsaWQgYmxvY2sgc2l6ZSAlbHUiLAorCQkgICAgICAgY2hhbm5lbC0+YmxvY2tfc2l6ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjaGFubmVsLT5ncm91cF9zaXplICUgY2hhbm5lbC0+YmxvY2tfc2l6ZSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJICAgICAgICJncm91cCBzaXplIHNob3VsZCBiZSBtdWx0aXBsZSBvZiBibG9jayBzaXplIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOwogfQogCiAvKgpAQCAtNDMyLDcgKzQ2NywxMCBAQAogCX0KIAogCXByaW50ayhLRVJOX1dBUk5JTkcgImJsb2NrX3NpemUsIGdyb3VwX3NpemUsIGdyb3VwX2NvdW50XG4iKTsKLQlpb3dyaXRlMzIoY2hhbm5lbC0+YmxvY2tfc2l6ZSwgZnBnYSArIGJsb2NrX3NpemVfcmVnKTsKKwkvKgorCSAqIEJsb2NrIHNpemUgaXMgcmVwcmVzZW50ZWQgaW4gbm8uIG9mIDY0IGJpdCB0cmFuc2ZlcnMuCisJICovCisJaW93cml0ZTMyKGNoYW5uZWwtPmJsb2NrX3NpemUgLyA4LCBmcGdhICsgYmxvY2tfc2l6ZV9yZWcpOwogCWlvd3JpdGUzMihjaGFubmVsLT5ncm91cF9zaXplIC8gY2hhbm5lbC0+YmxvY2tfc2l6ZSwKIAkJICBmcGdhICsgYmxvY2tfY291bnRfcmVnKTsKIAlpb3dyaXRlMzIoY2hhbm5lbC0+Z3JvdXBfY291bnQsIGZwZ2EgKyBncm91cF9jb3VudF9yZWcpOwpAQCAtNDQ3LDI3ICs0ODUsMzAgQEAKIAkvKiBUaGUgRE1BIGFkZHJlc3MgcGFnZSByZWdpc3RlciBpcyBzaGFyZWQgYmV0d2VlbiB0aGUgUlggYW5kCiAJICogVFggY2hhbm5lbHMsIHNvIGFjcXVpcmUgbG9jay4KIAkgKi8KLQlzcGluX2xvY2soY2hhbm5lbC0+aW9tZW1fbG9jayk7CiAJZm9yIChpID0gMDsgaSA8IGNoYW5uZWwtPmdyb3VwX2NvdW50OyBpKyspIHsKIAkJcGFnZSA9IGkgLyAzMjsKIAkJZ3JvdXBfaW5fcGFnZSA9IGkgJSAzMjsKIAogCQlncm91cF9yZWcgPSBncm91cF9yZWdzX2Jhc2UgKyAoZ3JvdXBfaW5fcGFnZSAqIDQpOwogCisJCXNwaW5fbG9jayhjaGFubmVsLT5pb21lbV9sb2NrKTsKIAkJaW93cml0ZTMyKHBhZ2UsIGZwZ2EgKyBGUEdBX0RNQV9BRFJfUEFHRV9SRUcpOwogCQlpb3dyaXRlMzIoY2hhbm5lbC0+Z3JvdXBzW2ldLmRtYV9hZGRyLCBmcGdhICsgZ3JvdXBfcmVnKTsKKwkJc3Bpbl91bmxvY2soY2hhbm5lbC0+aW9tZW1fbG9jayk7CiAJfQorCiAJZm9yIChpID0gMDsgaSA8IGNoYW5uZWwtPmdyb3VwX2NvdW50OyBpKyspIHsKIAkJcGFnZSA9IGkgLyAzMjsKIAkJZ3JvdXBfaW5fcGFnZSA9IGkgJSAzMjsKIAogCQlncm91cF9yZWcgPSBncm91cF9yZWdzX2Jhc2UgKyAoZ3JvdXBfaW5fcGFnZSAqIDQpOwogCisJCXNwaW5fbG9jayhjaGFubmVsLT5pb21lbV9sb2NrKTsKIAkJaW93cml0ZTMyKHBhZ2UsIGZwZ2EgKyBGUEdBX0RNQV9BRFJfUEFHRV9SRUcpOwogCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiJWxkOiByZWFkIGRtYV9hZGRyOiAweCV4XG4iLCBpLAogCQkgICAgICAgaW9yZWFkMzIoZnBnYSArIGdyb3VwX3JlZykpOworCQlzcGluX3VubG9jayhjaGFubmVsLT5pb21lbV9sb2NrKTsKIAl9Ci0Jc3Bpbl91bmxvY2soY2hhbm5lbC0+aW9tZW1fbG9jayk7CiAKIH0KIApAQCAtNTM4LDcgKzU3OSw5IEBACiAKIAlwcmludGsoS0VSTl9XQVJOSU5HICJjaGFubmVsX2xhdGNoX2F0dHJcbiIpOwogCi0JY2hhbm5lbF9sYXRjaF9hdHRyKGNoYW5uZWwpOworCXJldCA9IGNoYW5uZWxfbGF0Y2hfYXR0cihjaGFubmVsKTsKKwlpZiAocmV0ICE9IDApCisJCWdvdG8gb3V0OwogCiAJY2hhbm5lbC0+dHJhbnNmZXIgPSAwOwogCkBAIC03ODEsNiArODI0LDExIEBACiAJCWlvd3JpdGUzMihGUEdBX1RYX0NUTF9GSUZPX0ZMVVNICiAJCQkgIHwgRlBHQV9UWF9DVExfT1VUUFVUX0NBUkRCVVMsCiAJCQkgIGZwZ2EgKyBGUEdBX1RYX0NUTF9SRUcpOworCX0gZWxzZSB7CisJCS8qIEZsdXNoIFJYIEZJRk8gYW5kIG91dHB1dCBkYXRhIHRvIGNhcmRidXMuICovCisJCWlvd3JpdGUzMihGUEdBX1JYX0NUTF9DT05UX0NBUAorCQkJICB8IEZQR0FfUlhfQ1RMX0ZJRk9fRkxVU0gsCisJCQkgIGZwZ2EgKyBGUEdBX1JYX0NUTF9SRUcpOwogCX0KIAogCWF0b21pY19pbmMoJmNoYW5uZWwtPmluaXRlZCk7CkBAIC04NDcsOCArODk1LDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JZ3JvdXBfcGFnZXMgPSAoY2hhbm5lbC0+Z3JvdXBfc2l6ZSAvIFBBR0VfU0laRSkgKyAxOwotCWhlYWRlcl9wYWdlcyA9IChjaGFubmVsLT5oZWFkZXJfc2l6ZSAvIFBBR0VfU0laRSkgKyAxOworCWdyb3VwX3BhZ2VzID0gbnBhZ2VzKGNoYW5uZWwtPmdyb3VwX3NpemUpOworCWhlYWRlcl9wYWdlcyA9IG5wYWdlcyhjaGFubmVsLT5oZWFkZXJfc2l6ZSk7CiAJdG90YWxfZ3JvdXBfcGFnZXMgPSBncm91cF9wYWdlcyAqIGNoYW5uZWwtPmdyb3VwX2NvdW50OwogCiAJc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKQEAgLTkwMywxNCArOTUxLDcgQEAKIAlzcGluX2xvY2tfaXJxKCZjaGFubmVsLT5ncm91cF9vZmZzZXRzX2xvY2spOwogCiAJZm9yIChpID0gMDsgaSA8IGNoYW5uZWwtPmdyb3VwX2NvdW50OyBpKyspIHsKLQkJaWYgKGNoYW5uZWwtPmRpciA9PSBDSEFOTkVMX0RJUl9SWAotCQkgICAgJiYgY2hhbm5lbC0+aGVhZGVyLT5ncm91cF9vZmZzZXRzW2ldID09IC0xKSB7Ci0JCQlzcGluX3VubG9ja19pcnEoJmNoYW5uZWwtPmdyb3VwX29mZnNldHNfbG9jayk7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCi0JCWlmIChjaGFubmVsLT5kaXIgPT0gQ0hBTk5FTF9ESVJfVFgKLQkJICAgICYmIGNoYW5uZWwtPmhlYWRlci0+Z3JvdXBfb2Zmc2V0c1tpXSAhPSAtMSkgeworCQlpZiAoY2hhbm5lbC0+aGVhZGVyLT5ncm91cF9vZmZzZXRzW2ldICE9IC0xKSB7CiAJCQlzcGluX3VubG9ja19pcnEoJmNoYW5uZWwtPmdyb3VwX29mZnNldHNfbG9jayk7CiAJCQlyZXR1cm4gMTsKIAkJfQpAQCAtMTA1OCwxMCArMTA5OSw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgZ3JvdXBzX2RvbmU7IGkrKykgewogCQlqID0gKHByZXZfdHJhbnNmZXIgKyBpKSAlIGNoYW5uZWwtPmdyb3VwX2NvdW50OwotCQlpZiAoY2hhbm5lbC0+ZGlyID09IENIQU5ORUxfRElSX1JYKQotCQkJZ3JvdXBfb2Zmc2V0c1tqXSA9IC0xOwotCQllbHNlCi0JCQlncm91cF9vZmZzZXRzW2pdID0gZ3JvdXBzW2pdLnVzZXJfb2Zmc2V0OworCQlncm91cF9vZmZzZXRzW2pdID0gZ3JvdXBzW2pdLnVzZXJfb2Zmc2V0OwogCX0KIAogCXNwaW5fdW5sb2NrKCZjaGFubmVsLT5ncm91cF9vZmZzZXRzX2xvY2spOwpAQCAtMTI4Myw3ICsxMzIxLDcgQEAKIAl9CiAKIAlyZXQgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsIHBvY2hfaXJxX2hhbmRsZXIsIElSUUZfU0hBUkVELAotCQkJICBkZXYtPmJ1c19pZCwgcG9jaF9kZXYpOworCQkJICBkZXZfbmFtZShkZXYpLCBwb2NoX2Rldik7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGRldiwgImVycm9yIHJlcXVlc3RpbmcgSVJRICV1XG4iLCBwZGV2LT5pcnEpOwogCQlyZXQgPSAtRU5PTUVNOwpAQCAtMTM1MCwxMiArMTM4OCwxMiBAQAogCXVuc2lnbmVkIGludCBtaW5vciA9IE1JTk9SKHBvY2hfZGV2LT5jZGV2LmRldik7CiAJdW5zaWduZWQgaW50IGlkID0gbWlub3IgLyBwb2NoX2Rldi0+bmNoYW5uZWxzOwogCi0JLyogRklYTUU6IHVubWFwIGZwZ2FfaW9tZW0gYW5kIGJyaWRnZV9pb21lbSAqLwotCiAJcG9jaF9jbGFzc19kZXZfdW5yZWdpc3Rlcihwb2NoX2RldiwgaWQpOwogCWNkZXZfZGVsKCZwb2NoX2Rldi0+Y2Rldik7CiAJaWRyX3JlbW92ZSgmcG9jaF9pZHMsIGlkKTsKIAlmcmVlX2lycShwZGV2LT5pcnEsIHBvY2hfZGV2KTsKKwlpb3VubWFwKHBvY2hfZGV2LT5mcGdhX2lvbWVtKTsKKwlpb3VubWFwKHBvY2hfZGV2LT5icmlkZ2VfaW9tZW0pOwogCXVpb191bnJlZ2lzdGVyX2RldmljZSh1aW8pOwogCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3JzcGl1c2IvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9yc3BpdXNiL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIyNWY2NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9yc3BpdXNiL0tjb25maWcKQEAgLTAsMCArMSw2IEBACitjb25maWcgVVNCX1JTUEkKKwl0cmlzdGF0ZSAiUHJpbmNldG9uIEluc3RydW1lbnRzIFVTQiBjYW1lcmEgc3VwcG9ydCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFVTQiAmJiBCUk9LRU4KKwloZWxwCisJICBUaGlzIGRyaXZlciBpcyBmb3IgdGhlIFByaW5jZXRvbiBJbnN0cnVtZW50cyBVU0IgY2FtZXJhIGRldmljZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9yc3BpdXNiL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3JzcGl1c2IvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M3YWVkOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9yc3BpdXNiL01ha2VmaWxlCkBAIC0wLDAgKzEgQEAKK29iai0kKENPTkZJR19VU0JfUlNQSSkJCSs9IHJzcGl1c2IubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3JzcGl1c2IvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9yc3BpdXNiL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q2MzM2YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9yc3BpdXNiL1RPRE8KQEAgLTAsMCArMSwyMiBAQAorVGhpcyBkcml2ZXIgaXMgZm9yIHRoZSBQcmluY2V0b24gSW5zdHJ1bWVudHMgVVNCIGNhbWVyYS4KKworSXQgbmVlZHMgbG90cyBvZiB3b3JrIHRvIGdldCBpdCBpbnRvIHRoZSBtYWluIGRyaXZlcnMvdXNiLyBzdWJkaXJlY3Rvcnk6CisKK0FueSBwYXRjaGVzIHRvIGRvIGFueSBvZiB0aGUgZm9sbG93aW5nIGNoYW5nZXMgYXJlIGdyZWF0bHkgYXBwcmVjaWF0ZWQ6CisKKwktIG1ha2UgY2hlY2twYXRjaC5wbCBjbGVhbgorCS0gY29kaW5nIHN0eWxlIGZpeHVwcyAodHlwZWRlZnMsIGV0Yy4pCisJLSBnZXQgaXQgdG8gYnVpbGQgcHJvcGVybHkKKwktIGF1ZGl0IGlvY3RscworCS0gcmVtb3ZlIGlvY3RscyBpZiBwb3NzaWJsZQorCS0gYXNzaWduIHByb3BlciBtaW5vciBudW1iZXIKKwktIHJlbW92ZSBkYmcoKSBtYWNybworCS0gbG90cyBvZiBnZW5lcmFsIGNsZWFudXBzCisJLSByZXZpZXcgbG9ja2luZworCitQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvOgorCUdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ2toQHN1c2UuZGU+CithbmQgQ0M6CisJSnVkZCBNb250Z29tZXJ5IDxqdWRkQGpwaWxvdC5vcmc+CisJSmVmZiBGcm9udHogPGplZmYuZnJvbnR6QGdtYWlsLmNvbT4KK2FzIHRoZXkgaGF2ZSB0aGlzIGRldmljZSBhbmQgY2FuIHRlc3QgYW55IG5lZWRlZCBjaGFuZ2VzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3JzcGl1c2IvcnNwaXVzYi5jIGIvZHJpdmVycy9zdGFnaW5nL3JzcGl1c2IvcnNwaXVzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMjgxZDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnNwaXVzYi9yc3BpdXNiLmMKQEAgLTAsMCArMSw4ODcgQEAKKy8qCisgKiByc3BpdXNiLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYgUHJpbmNldG9uIEluc3RydW1lbnRzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSAicnNwaXVzYi5oIgorCisjaWZkZWYgQ09ORklHX1VTQl9ERUJVRworc3RhdGljIGludCBkZWJ1ZyA9IDE7CisjZWxzZQorc3RhdGljIGludCBkZWJ1ZzsKKyNlbmRpZgorLyogVXNlIG91ciBvd24gZGJnIG1hY3JvICovCisjdW5kZWYgZGJnCisjZGVmaW5lIGRiZyhmb3JtYXQsIGFyZy4uLikgZG8geyBpZiAoZGVidWcpIHByaW50ayhLRVJOX0RFQlVHIF9fRklMRV9fICI6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmcpOyB9IHdoaWxlICgwKQorCisvKiBWZXJzaW9uIEluZm9ybWF0aW9uICovCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICJWMS4wLjEiCisjZGVmaW5lIERSSVZFUl9BVVRIT1IgICJQcmluY2V0b24gSW5zdHJ1bWVudHMiCisjZGVmaW5lIERSSVZFUl9ERVNDICAgICJQSSBVU0IyLjAgRGV2aWNlIERyaXZlciBmb3IgTGludXgiCisKKy8qIERlZmluZSB0aGVzZSB2YWx1ZXMgdG8gbWF0Y2ggeW91ciBkZXZpY2VzICovCisjZGVmaW5lIFZFTkRPUl9JRCAgIDB4MEJENworI2RlZmluZSBTVDEzM19QSUQgICAweEEwMTAKKyNkZWZpbmUgUElYSVNfUElEICAgMHhBMDI2CisKKy8qIEdldCBhIG1pbm9yIHJhbmdlIGZvciB5b3VyIGRldmljZXMgZnJvbSB0aGUgdXNiIG1haW50YWluZXIgKi8KKyNpZmRlZiBDT05GSUdfVVNCX0RZTkFNSUNfTUlOT1JTCisjZGVmaW5lIFBJVVNCX01JTk9SX0JBU0UgICAgMAorI2Vsc2UKKyNkZWZpbmUgUElVU0JfTUlOT1JfQkFTRSAgICAxOTIKKyNlbmRpZgorCisvKiBwcmV2ZW50IHJhY2VzIGJldHdlZW4gb3BlbigpIGFuZCBkaXNjb25uZWN0KCkgKi8KK3N0YXRpYyBERUNMQVJFX01VVEVYKGRpc2Nvbm5lY3Rfc2VtKTsKKworLyogU3RydWN0dXJlIHRvIGhvbGQgYWxsIG9mIG91ciBkZXZpY2Ugc3BlY2lmaWMgc3R1ZmYgKi8KK3N0cnVjdCBkZXZpY2VfZXh0ZW5zaW9uIHsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsJLyogc2F2ZSBvZmYgdGhlIHVzYiBkZXZpY2UgcG9pbnRlciAqLworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2U7CS8qIHRoZSBpbnRlcmZhY2UgZm9yIHRoaXMgZGV2aWNlICovCisJdW5zaWduZWQgY2hhciBtaW5vcjsJLyogdGhlIHN0YXJ0aW5nIG1pbm9yIG51bWJlciBmb3IgdGhpcyBkZXZpY2UgKi8KKwlzaXplX3QgYnVsa19pbl9zaXplX3JldHVybmVkOworCWludCBidWxrX2luX2J5dGVfdHJrOworCXN0cnVjdCB1cmIgKioqUGl4ZWxVcmI7CisJaW50IGZyYW1lSWR4OworCWludCB1cmJJZHg7CisJdW5zaWduZWQgaW50ICptYXBsaXN0X251bVBhZ2VzTWFwcGVkOworCWludCBvcGVuOwkJLyogaWYgdGhlIHBvcnQgaXMgb3BlbiBvciBub3QgKi8KKwlpbnQgcHJlc2VudDsJCS8qIGlmIHRoZSBkZXZpY2UgaXMgbm90IGRpc2Nvbm5lY3RlZCAqLworCWludCB1c2VyQnVmTWFwcGVkOwkvKiBoYXMgdGhlIHVzZXIgYnVmZmVyIGJlZW4gbWFwcGVkPyAqLworCXN0cnVjdCBzY2F0dGVybGlzdCAqKnNnbDsJLyogc2NhdHRlci1nYXRoZXIgbGlzdCBmb3IgdXNlciBidWZmZXIgKi8KKwl1bnNpZ25lZCBpbnQgKnNnRW50cmllczsKKwlzdHJ1Y3Qga3JlZiBrcmVmOworCWludCBnb3RQaXhlbERhdGE7CisJaW50IHBlbmRpbmdXcml0ZTsKKwljaGFyICoqcGVuZGVkUGl4ZWxVcmJzOworCWludCBpYW1hOwkJLypQSVhJUyBvciBTVDEzMyAqLworCWludCBudW1fZnJhbWVzOwkJLyogdGhlIG51bWJlciBvZiBmcmFtZXMgdGhhdCB3aWxsIGZpdCBpbiB0aGUgdXNlciBidWZmZXIgKi8KKwlpbnQgYWN0aXZlX2ZyYW1lOworCXVuc2lnbmVkIGxvbmcgZnJhbWVTaXplOworCXN0cnVjdCBzZW1hcGhvcmUgc2VtOworCS8vRlgyIHNwZWNpZmljIGVuZHBvaW50cworCXVuc2lnbmVkIGludCBoRVBbOF07Cit9OworI2RlZmluZSB0b19waV9kZXYoZCkgY29udGFpbmVyX29mKCBkLCBzdHJ1Y3QgZGV2aWNlX2V4dGVuc2lvbiwga3JlZiApCisKK3N0YXRpYyBpbnQgTWFwVXNlckJ1ZmZlcihzdHJ1Y3QgaW9jdGxfc3RydWN0ICosIHN0cnVjdCBkZXZpY2VfZXh0ZW5zaW9uICopOworc3RhdGljIGludCBVbk1hcFVzZXJCdWZmZXIoc3RydWN0IGRldmljZV9leHRlbnNpb24gKik7CitzdGF0aWMgaW50IHBpdXNiX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIGludCBwaXVzYl9vdXRwdXQoc3RydWN0IGlvY3RsX3N0cnVjdCAqLCB1bnNpZ25lZCBjaGFyICosIGludCwgc3RydWN0IGRldmljZV9leHRlbnNpb24gKik7CitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgcGl1c2JfZHJpdmVyOworCisvKiB0YWJsZSBvZiBkZXZpY2VzIHRoYXQgd29yayB3aXRoIHRoaXMgZHJpdmVyICovCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgcGlfZGV2aWNlX3RhYmxlW10gPSB7CisJe1VTQl9ERVZJQ0UoVkVORE9SX0lELCBTVDEzM19QSUQpfSwKKwl7VVNCX0RFVklDRShWRU5ET1JfSUQsIFBJWElTX1BJRCl9LAorCXswLCB9CQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBwaV9kZXZpY2VfdGFibGUpOworCitzdGF0aWMgaW50IGxhc3RFcnIgPSAwOworc3RhdGljIGludCBlcnJDbnQgPSAwOworCitzdGF0aWMgdm9pZCBwaXVzYl9kZWxldGUoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IGRldmljZV9leHRlbnNpb24gKnBkeCA9IHRvX3BpX2RldihrcmVmKTsKKworCWRldl9kYmcoJnBkeC0+dWRldi0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKwl1c2JfcHV0X2RldihwZHgtPnVkZXYpOworCWtmcmVlKHBkeCk7Cit9CisKK3N0YXRpYyBpbnQgcGl1c2Jfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX2V4dGVuc2lvbiAqcGR4ID0gTlVMTDsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlOworCWludCBzdWJtaW5vcjsKKwlpbnQgcmV0dmFsID0gMDsKKworCWRiZygiUGl1c2JfT3BlbigpIik7CisJc3VibWlub3IgPSBpbWlub3IoaW5vZGUpOworCWludGVyZmFjZSA9IHVzYl9maW5kX2ludGVyZmFjZSgmcGl1c2JfZHJpdmVyLCBzdWJtaW5vcik7CisJaWYgKCFpbnRlcmZhY2UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlcyAtIGVycm9yLCBjYW4ndCBmaW5kIGRldmljZSBmb3IgbWlub3IgJWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgc3VibWlub3IpOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGV4aXRfbm9fZGV2aWNlOworCX0KKworCXBkeCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKKwlpZiAoIXBkeCkgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGV4aXRfbm9fZGV2aWNlOworCX0KKwlkYmcoIkFsdGVybmF0ZSBTZXR0aW5nID0gJWQiLCBpbnRlcmZhY2UtPm51bV9hbHRzZXR0aW5nKTsKKworCXBkeC0+ZnJhbWVJZHggPSBwZHgtPnVyYklkeCA9IDA7CisJcGR4LT5nb3RQaXhlbERhdGEgPSAwOworCXBkeC0+cGVuZGluZ1dyaXRlID0gMDsKKwlwZHgtPmZyYW1lU2l6ZSA9IDA7CisJcGR4LT5udW1fZnJhbWVzID0gMDsKKwlwZHgtPmFjdGl2ZV9mcmFtZSA9IDA7CisJcGR4LT5idWxrX2luX2J5dGVfdHJrID0gMDsKKwlwZHgtPnVzZXJCdWZNYXBwZWQgPSAwOworCXBkeC0+cGVuZGVkUGl4ZWxVcmJzID0gTlVMTDsKKwlwZHgtPnNnRW50cmllcyA9IE5VTEw7CisJcGR4LT5zZ2wgPSBOVUxMOworCXBkeC0+bWFwbGlzdF9udW1QYWdlc01hcHBlZCA9IE5VTEw7CisJcGR4LT5QaXhlbFVyYiA9IE5VTEw7CisJcGR4LT5idWxrX2luX3NpemVfcmV0dXJuZWQgPSAwOworCS8qIGluY3JlbWVudCBvdXIgdXNhZ2UgY291bnQgZm9yIHRoZSBkZXZpY2UgKi8KKwlrcmVmX2dldCgmcGR4LT5rcmVmKTsKKwkvKiBzYXZlIG91ciBvYmplY3QgaW4gdGhlIGZpbGUncyBwcml2YXRlIHN0cnVjdHVyZSAqLworCWZpbGUtPnByaXZhdGVfZGF0YSA9IHBkeDsKKyAgICAgIGV4aXRfbm9fZGV2aWNlOgorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgcGl1c2JfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX2V4dGVuc2lvbiAqcGR4OworCWludCByZXR2YWwgPSAwOworCisJZGJnKCJQaXVzYl9SZWxlYXNlKCkiKTsKKwlwZHggPSAoc3RydWN0IGRldmljZV9leHRlbnNpb24gKilmaWxlLT5wcml2YXRlX2RhdGE7CisJaWYgKHBkeCA9PSBOVUxMKSB7CisJCWRiZygiJXMgLSBvYmplY3QgaXMgTlVMTCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCS8qIGRlY3JlbWVudCB0aGUgY291bnQgb24gb3VyIGRldmljZSAqLworCWtyZWZfcHV0KCZwZHgtPmtyZWYsIHBpdXNiX2RlbGV0ZSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKglwaXVzYl9pb2N0bAorICovCitzdGF0aWMgaW50IHBpdXNiX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGRldmljZV9leHRlbnNpb24gKnBkeDsKKwljaGFyIGR1bW15Q3RsQnVmW10gPSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKKwl1bnNpZ25lZCBsb25nIGRldlJCID0gMDsKKwlpbnQgaSA9IDA7CisJaW50IGVyciA9IDA7CisJaW50IHJldHZhbCA9IDA7CisJc3RydWN0IGlvY3RsX3N0cnVjdCBjdHJsOworCXVuc2lnbmVkIGNoYXIgKnVCdWY7CisJaW50IG51bWJ5dGVzID0gMDsKKwl1bnNpZ25lZCBzaG9ydCBjb250cm9sRGF0YSA9IDA7CisKKwlwZHggPSAoc3RydWN0IGRldmljZV9leHRlbnNpb24gKilmaWxlLT5wcml2YXRlX2RhdGE7CisJLyogdmVyaWZ5IHRoYXQgdGhlIGRldmljZSB3YXNuJ3QgdW5wbHVnZ2VkICovCisJaWYgKCFwZHgtPnByZXNlbnQpIHsKKwkJZGJnKCJObyBEZXZpY2UgUHJlc2VudFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwkvKiBmaWxsIGluIHlvdXIgZGV2aWNlIHNwZWNpZmljIHN0dWZmIGhlcmUgKi8KKwlpZiAoX0lPQ19ESVIoY21kKSAmIF9JT0NfUkVBRCkKKwkJZXJyID0gIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsICh2b2lkIF9fdXNlciAqKWFyZywgX0lPQ19TSVpFKGNtZCkpOworCWVsc2UgaWYgKF9JT0NfRElSKGNtZCkgJiBfSU9DX1dSSVRFKQorCQllcnIgPSAhYWNjZXNzX29rKFZFUklGWV9SRUFELCAodm9pZCBfX3VzZXIgKilhcmcsIF9JT0NfU0laRShjbWQpKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkeC0+dWRldi0+ZGV2LCAicmV0dXJuIHdpdGggZXJyb3IgPSAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCXN3aXRjaCAoY21kKSB7CisJY2FzZSBQSVVTQl9HRVRWTkRDTUQ6CisJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkgICAgKCZjdHJsLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihzdHJ1Y3QgaW9jdGxfc3RydWN0KSkpCisJCQlpbmZvKCJjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIpOworCQlkYmcoIiVzICV4XG4iLCAiR2V0IFZlbmRvciBDb21tYW5kID0gIiwgY3RybC5jbWQpOworCQlyZXR2YWwgPQorCQkgICAgdXNiX2NvbnRyb2xfbXNnKHBkeC0+dWRldiwgdXNiX3JjdmN0cmxwaXBlKHBkeC0+dWRldiwgMCksCisJCQkJICAgIGN0cmwuY21kLCBVU0JfRElSX0lOLCAwLCAwLCAmZGV2UkIsCisJCQkJICAgIGN0cmwubnVtYnl0ZXMsIEhaICogMTApOworCQlpZiAoY3RybC5jbWQgPT0gMHhGMSkgeworCQkJZGJnKCJGVyBWZXJzaW9uIHJldHVybmVkIGZyb20gSFcgPSAlbGQuJWxkIiwKKwkJCSAgICAoZGV2UkIgPj4gOCksIChkZXZSQiAmIDB4RkYpKTsKKwkJfQorCQlyZXR1cm4gZGV2UkI7CisJY2FzZSBQSVVTQl9TRVRWTkRDTUQ6CisJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkgICAgKCZjdHJsLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihzdHJ1Y3QgaW9jdGxfc3RydWN0KSkpCisJCQlpbmZvKCJjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIpOworLy8gICAgICAgICAgICBkYmcoICIlcyAleCIsICJTZXQgVmVuZG9yIENvbW1hbmQgPSAiLGN0cmwuY21kICk7CisJCWNvbnRyb2xEYXRhID0gY3RybC5wRGF0YVswXTsKKwkJY29udHJvbERhdGEgfD0gKGN0cmwucERhdGFbMV0gPDwgOCk7CisvLyAgICAgICAgICAgIGRiZyggIiVzICVkIiwgIlZlbmRvciBEYXRhID0iLGNvbnRyb2xEYXRhICk7CisJCXJldHZhbCA9IHVzYl9jb250cm9sX21zZyhwZHgtPnVkZXYsIHVzYl9zbmRjdHJscGlwZShwZHgtPnVkZXYsIDApLCBjdHJsLmNtZCwgKFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SKSwJLyogfCBVU0JfUkVDSVBfRU5EUE9JTlQpLCAqLworCQkJCQkgY29udHJvbERhdGEsCisJCQkJCSAwLAorCQkJCQkgJmR1bW15Q3RsQnVmLCBjdHJsLm51bWJ5dGVzLCBIWiAqIDEwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwkJYnJlYWs7CisJY2FzZSBQSVVTQl9JU0hJR0hTUEVFRDoKKwkJcmV0dXJuICgocGR4LT51ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCkgPyAxIDogMCk7CisJCWJyZWFrOworCWNhc2UgUElVU0JfV1JJVEVQSVBFOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJmN0cmwsICh2b2lkIF9fdXNlciAqKWFyZywgX0lPQ19TSVpFKGNtZCkpKQorCQkJaW5mbygiY29weV9mcm9tX3VzZXIgV1JJVEVfRFVNTVkgZmFpbGVkXG4iKTsKKwkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGN0cmwucERhdGEsIGN0cmwubnVtYnl0ZXMpKSB7CisJCQlkYmcoImNhbid0IGFjY2VzcyBwRGF0YSIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcGl1c2Jfb3V0cHV0KCZjdHJsLCBjdHJsLnBEYXRhIC8qdUJ1ZiAqLyAsIGN0cmwubnVtYnl0ZXMsIHBkeCk7CisJCXJldHVybiBjdHJsLm51bWJ5dGVzOworCQlicmVhazsKKwljYXNlIFBJVVNCX1VTRVJCVUZGRVI6CisJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkgICAgKCZjdHJsLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihzdHJ1Y3QgaW9jdGxfc3RydWN0KSkpCisJCQlpbmZvKCJjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIpOworCQlyZXR1cm4gTWFwVXNlckJ1ZmZlcigoc3RydWN0IGlvY3RsX3N0cnVjdCAqKSAmIGN0cmwsIHBkeCk7CisJCWJyZWFrOworCWNhc2UgUElVU0JfVU5NQVBfVVNFUkJVRkZFUjoKKwkJVW5NYXBVc2VyQnVmZmVyKHBkeCk7CisJCXJldHVybiAwOworCQlicmVhazsKKwljYXNlIFBJVVNCX1JFQURQSVBFOgorCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJICAgICgmY3RybCwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2Yoc3RydWN0IGlvY3RsX3N0cnVjdCkpKQorCQkJaW5mbygiY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iKTsKKwkJc3dpdGNoIChjdHJsLmVuZHBvaW50KSB7CisJCWNhc2UgMDoJLy9TVDEzMyBQaXhlbCBEYXRhIG9yIFBJWElTIElPCisJCQlpZiAocGR4LT5pYW1hID09IFBJWElTX1BJRCkgeworCQkJCXVuc2lnbmVkIGludCBudW1Ub1JlYWQgPSAwOworCQkJCXVuc2lnbmVkIGludCB0b3RhbFJlYWQgPSAwOworCQkJCXVCdWYgPSBrbWFsbG9jKGN0cmwubnVtYnl0ZXMsIEdGUF9LRVJORUwpOworCQkJCWlmICghdUJ1ZikgeworCQkJCQlkYmcoIkFsbG9jIGZvciB1QnVmIGZhaWxlZCIpOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJbnVtYnl0ZXMgPSBjdHJsLm51bWJ5dGVzOworCQkJCW51bVRvUmVhZCA9IG51bWJ5dGVzOworCQkJCWRiZygibnVtYnl0ZXMgdG8gcmVhZCA9ICVkIiwgbnVtYnl0ZXMpOworCQkJCWRiZygiZW5kcG9pbnQgIyAlZCIsIGN0cmwuZW5kcG9pbnQpOworCQkJCWlmIChjb3B5X2Zyb21fdXNlcih1QnVmLCBjdHJsLnBEYXRhLCBudW1ieXRlcykpCisJCQkJCWRiZygiY29weWluZyBjdHJsLnBEYXRhIHRvIGR1bW15QnVmIGZhaWxlZCIpOworCQkJCWRvIHsKKwkJCQkJaSA9IHVzYl9idWxrX21zZyhwZHgtPnVkZXYsIHBkeC0+aEVQW2N0cmwuZW5kcG9pbnRdLCAodUJ1ZiArIHRvdGFsUmVhZCksIChudW1Ub1JlYWQgPiA2NCkgPyA2NCA6IG51bVRvUmVhZCwgJm51bWJ5dGVzLCBIWiAqIDEwKTsJLy9FUDAgY2FuIG9ubHkgaGFuZGxlIDY0IGJ5dGVzIGF0IGEgdGltZQorCQkJCQlpZiAoaSkgeworCQkJCQkJZGJnKCJDTUQgPSAlcywgQWRkcmVzcyA9IDB4JTAyWCIsICgodUJ1ZlszXSA9PSAweDAyKSA/ICJXUklURSIgOiAiUkVBRCIpLCB1QnVmWzFdKTsKKwkJCQkJCWRiZygiTnVtYmVyIG9mIGJ5dGVzIEF0dGVtcHRlZCB0byByZWFkID0gJWQiLCAoaW50KWN0cmwubnVtYnl0ZXMpOworCQkJCQkJZGJnKCJCbG9ja2luZyBSZWFkSS9PIEZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGkpOworCQkJCQkJa2ZyZWUodUJ1Zik7CisJCQkJCQlyZXR1cm4gLTE7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlkYmcoIlBpeGlzIEVQMCBSZWFkICVkIGJ5dGVzIiwKKwkJCQkJCSAgICBudW1ieXRlcyk7CisJCQkJCQl0b3RhbFJlYWQgKz0gbnVtYnl0ZXM7CisJCQkJCQludW1Ub1JlYWQgLT0gbnVtYnl0ZXM7CisJCQkJCX0KKwkJCQl9CisJCQkJd2hpbGUgKG51bVRvUmVhZCk7CisJCQkJbWVtY3B5KGN0cmwucERhdGEsIHVCdWYsIHRvdGFsUmVhZCk7CisJCQkJZGJnKCJUb3RhbCBCeXRlcyBSZWFkIGZyb20gUElYSVMgRVAwID0gJWQiLAorCQkJCSAgICB0b3RhbFJlYWQpOworCQkJCWN0cmwubnVtYnl0ZXMgPSB0b3RhbFJlYWQ7CisJCQkJaWYgKGNvcHlfdG9fdXNlcgorCQkJCSAgICAoKHN0cnVjdCBpb2N0bF9zdHJ1Y3QgKikgYXJnLCAmY3RybCwKKwkJCQkgICAgIHNpemVvZihzdHJ1Y3QgaW9jdGxfc3RydWN0KSkpCisJCQkJCWRiZygiY29weV90b191c2VyIGZhaWxlZCBpbiBJT1JCIik7CisJCQkJa2ZyZWUodUJ1Zik7CisJCQkJcmV0dXJuIGN0cmwubnVtYnl0ZXM7CisJCQl9IGVsc2UJLy9TVDEzMyBQaXhlbCBEYXRhCisJCQl7CisJCQkJaWYgKCFwZHgtPmdvdFBpeGVsRGF0YSkKKwkJCQkJcmV0dXJuIDA7CisJCQkJZWxzZSB7CisJCQkJCXBkeC0+Z290UGl4ZWxEYXRhID0gMDsKKwkJCQkJY3RybC5udW1ieXRlcyA9CisJCQkJCSAgICBwZHgtPmJ1bGtfaW5fc2l6ZV9yZXR1cm5lZDsKKwkJCQkJcGR4LT5idWxrX2luX3NpemVfcmV0dXJuZWQgLT0KKwkJCQkJICAgIHBkeC0+ZnJhbWVTaXplOworCQkJCQlmb3IgKGkgPSAwOyBpIDwgcGR4LT5tYXBsaXN0X251bVBhZ2VzTWFwcGVkW3BkeC0+YWN0aXZlX2ZyYW1lXTsgaSsrKQorCQkJCQkJU2V0UGFnZURpcnR5KHBkeC0+c2dsW3BkeC0+YWN0aXZlX2ZyYW1lXVtpXS5wYWdlX2xpbmspOworCQkJCQlwZHgtPmFjdGl2ZV9mcmFtZSA9CisJCQkJCSAgICAoKHBkeC0+YWN0aXZlX2ZyYW1lICsKKwkJCQkJICAgICAgMSkgJSBwZHgtPm51bV9mcmFtZXMpOworCQkJCQlyZXR1cm4gY3RybC5udW1ieXRlczsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAxOgkvL1NUMTMzSU8KKwkJY2FzZSA0OgkvL1BJWElTIElPCisJCQl1QnVmID0ga21hbGxvYyhjdHJsLm51bWJ5dGVzLCBHRlBfS0VSTkVMKTsKKwkJCWlmICghdUJ1ZikgeworCQkJCWRiZygiQWxsb2MgZm9yIHVCdWYgZmFpbGVkIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQludW1ieXRlcyA9IGN0cmwubnVtYnl0ZXM7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJnKCAibnVtYnl0ZXMgdG8gcmVhZCA9ICVkIiwgbnVtYnl0ZXMgKTsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcih1QnVmLCBjdHJsLnBEYXRhLCBudW1ieXRlcykpCisJCQkJZGJnKCJjb3B5aW5nIGN0cmwucERhdGEgdG8gZHVtbXlCdWYgZmFpbGVkIik7CisJCQlpID0gdXNiX2J1bGtfbXNnKHBkeC0+dWRldiwgcGR4LT5oRVBbY3RybC5lbmRwb2ludF0sCisJCQkJCSB1QnVmLCBudW1ieXRlcywgJm51bWJ5dGVzLCBIWiAqIDEwKTsKKwkJCWlmIChpKSB7CisJCQkJZGJnKCJCbG9ja2luZyBSZWFkSS9PIEZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsCisJCQkJICAgIGkpOworCQkJCWtmcmVlKHVCdWYpOworCQkJCXJldHVybiAtMTsKKwkJCX0gZWxzZSB7CisJCQkJY3RybC5udW1ieXRlcyA9IG51bWJ5dGVzOworCQkJCW1lbWNweShjdHJsLnBEYXRhLCB1QnVmLCBudW1ieXRlcyk7CisJCQkJaWYgKGNvcHlfdG9fdXNlcgorCQkJCSAgICAoKHN0cnVjdCBpb2N0bF9zdHJ1Y3QgKikgYXJnLCAmY3RybCwKKwkJCQkgICAgIHNpemVvZihzdHJ1Y3QgaW9jdGxfc3RydWN0KSkpCisJCQkJCWRiZygiY29weV90b191c2VyIGZhaWxlZCBpbiBJT1JCIik7CisJCQkJa2ZyZWUodUJ1Zik7CisJCQkJcmV0dXJuIGN0cmwubnVtYnl0ZXM7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIDI6CS8vUElYSVMgUGluZworCQljYXNlIDM6CS8vUElYSVMgUG9uZworCQkJaWYgKCFwZHgtPmdvdFBpeGVsRGF0YSkKKwkJCQlyZXR1cm4gMDsKKwkJCWVsc2UgeworCQkJCXBkeC0+Z290UGl4ZWxEYXRhID0gMDsKKwkJCQljdHJsLm51bWJ5dGVzID0gcGR4LT5idWxrX2luX3NpemVfcmV0dXJuZWQ7CisJCQkJcGR4LT5idWxrX2luX3NpemVfcmV0dXJuZWQgLT0gcGR4LT5mcmFtZVNpemU7CisJCQkJZm9yIChpID0gMDsKKwkJCQkgICAgIGkgPAorCQkJCSAgICAgcGR4LT5tYXBsaXN0X251bVBhZ2VzTWFwcGVkW3BkeC0+CisJCQkJCQkJCSBhY3RpdmVfZnJhbWVdOworCQkJCSAgICAgaSsrKQorCQkJCQlTZXRQYWdlRGlydHkocGR4LT5zZ2xbcGR4LT5hY3RpdmVfZnJhbWVdW2ldLnBhZ2VfbGluayk7CisJCQkJcGR4LT5hY3RpdmVfZnJhbWUgPQorCQkJCSAgICAoKHBkeC0+YWN0aXZlX2ZyYW1lICsgMSkgJSBwZHgtPm51bV9mcmFtZXMpOworCQkJCXJldHVybiBjdHJsLm51bWJ5dGVzOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBQSVVTQl9XSEFUQ0FNRVJBOgorCQlyZXR1cm4gcGR4LT5pYW1hOworCWNhc2UgUElVU0JfU0VURlJBTUVTSVpFOgorCQlkYmcoIlBJVVNCX1NFVEZSQU1FU0laRSIpOworCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJICAgICgmY3RybCwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2Yoc3RydWN0IGlvY3RsX3N0cnVjdCkpKQorCQkJaW5mbygiY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iKTsKKwkJcGR4LT5mcmFtZVNpemUgPSBjdHJsLm51bWJ5dGVzOworCQlwZHgtPm51bV9mcmFtZXMgPSBjdHJsLm51bUZyYW1lczsKKwkJaWYgKCFwZHgtPnNnbCkKKwkJCXBkeC0+c2dsID0KKwkJCSAgICBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgKgorCQkJCSAgICBwZHgtPm51bV9mcmFtZXMsIEdGUF9LRVJORUwpOworCQlpZiAoIXBkeC0+c2dFbnRyaWVzKQorCQkJcGR4LT5zZ0VudHJpZXMgPQorCQkJICAgIGttYWxsb2Moc2l6ZW9mKHVuc2lnbmVkIGludCkgKiBwZHgtPm51bV9mcmFtZXMsCisJCQkJICAgIEdGUF9LRVJORUwpOworCQlpZiAoIXBkeC0+UGl4ZWxVcmIpCisJCQlwZHgtPlBpeGVsVXJiID0KKwkJCSAgICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdXJiICoqKSAqIHBkeC0+bnVtX2ZyYW1lcywKKwkJCQkgICAgR0ZQX0tFUk5FTCk7CisJCWlmICghcGR4LT5tYXBsaXN0X251bVBhZ2VzTWFwcGVkKQorCQkJcGR4LT5tYXBsaXN0X251bVBhZ2VzTWFwcGVkID0KKwkJCSAgICB2bWFsbG9jKHNpemVvZih1bnNpZ25lZCBpbnQpICogcGR4LT5udW1fZnJhbWVzKTsKKwkJaWYgKCFwZHgtPnBlbmRlZFBpeGVsVXJicykKKwkJCXBkeC0+cGVuZGVkUGl4ZWxVcmJzID0KKwkJCSAgICBrbWFsbG9jKHNpemVvZihjaGFyICopICogcGR4LT5udW1fZnJhbWVzLAorCQkJCSAgICBHRlBfS0VSTkVMKTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJZGJnKCIlc1xuIiwgIk5vIElPQ1RMIGZvdW5kIik7CisJCWJyZWFrOworCisJfQorCS8qIHJldHVybiB0aGF0IHdlIGRpZCBub3QgdW5kZXJzdGFuZCB0aGlzIGlvY3RsIGNhbGwgKi8KKwlkYmcoIlJldHVybmluZyAtRU5PVFRZIik7CisJcmV0dXJuIC1FTk9UVFk7Cit9CisKK3N0YXRpYyB2b2lkIHBpdXNiX3dyaXRlX2J1bGtfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCBkZXZpY2VfZXh0ZW5zaW9uICpwZHggPSB1cmItPmNvbnRleHQ7CisJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOworCisJLyogc3luYy9hc3luYyB1bmxpbmsgZmF1bHRzIGFyZW4ndCBlcnJvcnMgKi8KKwlpZiAoc3RhdHVzICYmICEoc3RhdHVzID09IC1FTk9FTlQgfHwgc3RhdHVzID09IC1FQ09OTlJFU0VUKSkKKwkJZGV2X2RiZygmdXJiLT5kZXYtPmRldiwKKwkJCSIlcyAtIG5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKKwkJCV9fZnVuY19fLCBzdGF0dXMpOworCisJcGR4LT5wZW5kaW5nV3JpdGUgPSAwOworCXVzYl9idWZmZXJfZnJlZSh1cmItPmRldiwgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLAorCQkJdXJiLT50cmFuc2Zlcl9idWZmZXIsIHVyYi0+dHJhbnNmZXJfZG1hKTsKK30KKworaW50IHBpdXNiX291dHB1dChzdHJ1Y3QgaW9jdGxfc3RydWN0ICogaW8sIHVuc2lnbmVkIGNoYXIgKnVCdWYsIGludCBsZW4sCisJCSBzdHJ1Y3QgZGV2aWNlX2V4dGVuc2lvbiAqcGR4KQoreworCXN0cnVjdCB1cmIgKnVyYiA9IE5VTEw7CisJaW50IGVyciA9IDA7CisJdW5zaWduZWQgY2hhciAqa2J1ZiA9IE5VTEw7CisKKwl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCWlmICh1cmIgIT0gTlVMTCkgeworCQlrYnVmID0KKwkJICAgIHVzYl9idWZmZXJfYWxsb2MocGR4LT51ZGV2LCBsZW4sIEdGUF9LRVJORUwsCisJCQkJICAgICAmdXJiLT50cmFuc2Zlcl9kbWEpOworCQlpZiAoIWtidWYpIHsKKwkJCWluZm8oImJ1ZmZlcl9hbGxvYyBmYWlsZWRcbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJbWVtY3B5KGtidWYsIHVCdWYsIGxlbik7CisJCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwgcGR4LT51ZGV2LCBwZHgtPmhFUFtpby0+ZW5kcG9pbnRdLCBrYnVmLAorCQkJCSAgbGVuLCBwaXVzYl93cml0ZV9idWxrX2NhbGxiYWNrLCBwZHgpOworCQl1cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOworCQllcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9LRVJORUwpOworCQlpZiAoZXJyKSB7CisJCQlkZXZfZXJyKCZwZHgtPnVkZXYtPmRldiwKKwkJCQkiV1JJVEUgRVJST1I6c3VibWl0IHVyYiBlcnJvciA9ICVkXG4iLCBlcnIpOworCQl9CisJCXBkeC0+cGVuZGluZ1dyaXRlID0gMTsKKwkJdXNiX2ZyZWVfdXJiKHVyYik7CisJfQorCXJldHVybiAtRUlOUFJPR1JFU1M7Cit9CisKK3N0YXRpYyBpbnQgVW5NYXBVc2VyQnVmZmVyKHN0cnVjdCBkZXZpY2VfZXh0ZW5zaW9uICpwZHgpCit7CisJaW50IGkgPSAwOworCWludCBrID0gMDsKKwl1bnNpZ25lZCBpbnQgZXBBZGRyOworCWZvciAoayA9IDA7IGsgPCBwZHgtPm51bV9mcmFtZXM7IGsrKykgeworCQlkYmcoIktpbGxpbmcgVXJicyBmb3IgRnJhbWUgJWQiLCBrKTsKKwkJZm9yIChpID0gMDsgaSA8IHBkeC0+c2dFbnRyaWVzW2tdOyBpKyspIHsKKwkJCXVzYl9raWxsX3VyYihwZHgtPlBpeGVsVXJiW2tdW2ldKTsKKwkJCXVzYl9mcmVlX3VyYihwZHgtPlBpeGVsVXJiW2tdW2ldKTsKKwkJCXBkeC0+cGVuZGVkUGl4ZWxVcmJzW2tdW2ldID0gMDsKKwkJfQorCQlkYmcoIlVyYiBlcnJvciBjb3VudCA9ICVkIiwgZXJyQ250KTsKKwkJZXJyQ250ID0gMDsKKwkJZGJnKCJVcmJzIGZyZWUnZCBhbmQgS2lsbGVkIGZvciBGcmFtZSAlZCIsIGspOworCX0KKworCWZvciAoayA9IDA7IGsgPCBwZHgtPm51bV9mcmFtZXM7IGsrKykgeworCQlpZiAocGR4LT5pYW1hID09IFBJWElTX1BJRCkJLy9pZiBzbywgd2hpY2ggRVAgc2hvdWxkIHdlIG1hcCB0aGlzIGZyYW1lIHRvCisJCXsKKwkJCWlmIChrICUgMikJLy9jaGVjayB0byBzZWUgaWYgdGhpcyBzaG91bGQgdXNlIEVQNChQT05HKQorCQkJeworCQkJCWVwQWRkciA9IHBkeC0+aEVQWzNdOwkvL1BPTkcsIG9kZCBmcmFtZXMKKwkJCX0gZWxzZSB7CisJCQkJZXBBZGRyID0gcGR4LT5oRVBbMl07CS8vUElORywgZXZlbiBmcmFtZXMgYW5kIHplcm8KKwkJCX0KKwkJfSBlbHNlCQkvL1NUMTMzIG9ubHkgaGFzIDEgZW5kcG9pbnQgZm9yIFBpeGVsIGRhdGEgdHJhbnNmZXIKKwkJeworCQkJZXBBZGRyID0gcGR4LT5oRVBbMF07CisJCX0KKwkJdXNiX2J1ZmZlcl91bm1hcF9zZyhwZHgtPnVkZXYsIGVwQWRkciwgcGR4LT5zZ2xba10sCisJCQkJICAgIHBkeC0+bWFwbGlzdF9udW1QYWdlc01hcHBlZFtrXSk7CisJCWZvciAoaSA9IDA7IGkgPCBwZHgtPm1hcGxpc3RfbnVtUGFnZXNNYXBwZWRba107IGkrKykgeworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBkeC0+c2dsW2tdW2ldLnBhZ2VfbGluayk7CisJCX0KKwkJa2ZyZWUocGR4LT5zZ2xba10pOworCQlrZnJlZShwZHgtPlBpeGVsVXJiW2tdKTsKKwkJa2ZyZWUocGR4LT5wZW5kZWRQaXhlbFVyYnNba10pOworCQlwZHgtPnNnbFtrXSA9IE5VTEw7CisJCXBkeC0+UGl4ZWxVcmJba10gPSBOVUxMOworCQlwZHgtPnBlbmRlZFBpeGVsVXJic1trXSA9IE5VTEw7CisJfQorCWtmcmVlKHBkeC0+c2dFbnRyaWVzKTsKKwl2ZnJlZShwZHgtPm1hcGxpc3RfbnVtUGFnZXNNYXBwZWQpOworCXBkeC0+c2dFbnRyaWVzID0gTlVMTDsKKwlwZHgtPm1hcGxpc3RfbnVtUGFnZXNNYXBwZWQgPSBOVUxMOworCWtmcmVlKHBkeC0+c2dsKTsKKwlrZnJlZShwZHgtPnBlbmRlZFBpeGVsVXJicyk7CisJa2ZyZWUocGR4LT5QaXhlbFVyYik7CisJcGR4LT5zZ2wgPSBOVUxMOworCXBkeC0+cGVuZGVkUGl4ZWxVcmJzID0gTlVMTDsKKwlwZHgtPlBpeGVsVXJiID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGl1c2JfcmVhZFBJWEVMX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlpbnQgaSA9IDA7CisJc3RydWN0IGRldmljZV9leHRlbnNpb24gKnBkeCA9IHVyYi0+Y29udGV4dDsKKwlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CisKKwlpZiAoc3RhdHVzICYmICEoc3RhdHVzID09IC1FTk9FTlQgfHwgc3RhdHVzID09IC1FQ09OTlJFU0VUKSkgeworCQlkYmcoIiVzIC0gbm9uemVybyByZWFkIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIF9fZnVuY19fLAorCQkgICAgc3RhdHVzKTsKKwkJZGJnKCJFcnJvciBpbiByZWFkIEVQMiBjYWxsYmFjayIpOworCQlkYmcoIkZyYW1lSW5kZXggPSAlZCIsIHBkeC0+ZnJhbWVJZHgpOworCQlkYmcoIkJ5dGVzIHJlY2VpdmVkIGJlZm9yZSBwcm9ibGVtIG9jY3VycmVkID0gJWQiLAorCQkgICAgcGR4LT5idWxrX2luX2J5dGVfdHJrKTsKKwkJZGJnKCJVcmIgSWR4ID0gJWQiLCBwZHgtPnVyYklkeCk7CisJCXBkeC0+cGVuZGVkUGl4ZWxVcmJzW3BkeC0+ZnJhbWVJZHhdW3BkeC0+dXJiSWR4XSA9IDA7CisJfSBlbHNlIHsKKwkJcGR4LT5idWxrX2luX2J5dGVfdHJrICs9IHVyYi0+YWN0dWFsX2xlbmd0aDsKKwkJeworCQkJaSA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CS8vcmVzdWJtaXQgdGhlIFVSQgorCQkJaWYgKGkpIHsKKwkJCQllcnJDbnQrKzsKKwkJCQlpZiAoaSAhPSBsYXN0RXJyKSB7CisJCQkJCWRiZygic3VibWl0IHVyYiBpbiBjYWxsYmFjayBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICVkIiwgaSk7CisJCQkJCWxhc3RFcnIgPSBpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJcGR4LT51cmJJZHgrKzsJLy9wb2ludCB0byBuZXh0IFVSQiB3aGVuIHdlIGNhbGxiYWNrCisJCQkJaWYgKHBkeC0+YnVsa19pbl9ieXRlX3RyayA+PSBwZHgtPmZyYW1lU2l6ZSkgeworCQkJCQlwZHgtPmJ1bGtfaW5fc2l6ZV9yZXR1cm5lZCA9CisJCQkJCSAgICBwZHgtPmJ1bGtfaW5fYnl0ZV90cms7CisJCQkJCXBkeC0+YnVsa19pbl9ieXRlX3RyayA9IDA7CisJCQkJCXBkeC0+Z290UGl4ZWxEYXRhID0gMTsKKwkJCQkJcGR4LT5mcmFtZUlkeCA9CisJCQkJCSAgICAoKHBkeC0+ZnJhbWVJZHggKworCQkJCQkgICAgICAxKSAlIHBkeC0+bnVtX2ZyYW1lcyk7CisJCQkJCXBkeC0+dXJiSWR4ID0gMDsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKKy8qIE1hcFVzZXJCdWZmZXIoCisJaW5wdXRzOgorCXN0cnVjdCBpb2N0bF9zdHJ1Y3QgKmlvIC0gc3RydWN0dXJlIGNvbnRhaW5pbmcgdXNlciBhZGRyZXNzLCBmcmFtZSAjLCBhbmQgc2l6ZQorCXN0cnVjdCBkZXZpY2VfZXh0ZW5zaW9uICpwZHggLSB0aGUgUElVU0IgZGV2aWNlIGV4dGVuc2lvbgorCXJldHVybnM6CisJaW50IC0gc3RhdHVzIG9mIHRoZSB0YXNrCisJTm90ZXM6CisJTWFwVXNlckJ1ZmZlciBtYXBzIGEgYnVmZmVyIHBhc3NlZCBkb3duIHRocm91Z2ggYW4gaW9jdGwuICBUaGUgdXNlciBidWZmZXIgaXMgUGFnZSBBbGlnbmVkIGJ5IHRoZSBhcHAKKwlhbmQgdGhlbiBwYXNzZWQgZG93bi4gIFRoZSBmdW5jdGlvbiBnZXRfZnJlZV9wYWdlcyguLi4pIGRvZXMgdGhlIGFjdHVhbCBtYXBwaW5nIG9mIHRoZSBidWZmZXIgZnJvbSB1c2VyIHNwYWNlIHRvCisJa2VybmVsIHNwYWNlLiAgRnJvbSB0aGVyZSBhIHNjYXR0ZXJsaXN0IGlzIGNyZWF0ZWQgZnJvbSBhbGwgdGhlIHBhZ2VzLiAgVGhlIG5leHQgZnVuY3Rpb24gY2FsbGVkIGlzIHRvIHVzYl9idWZmZXJfbWFwX3NnCisJd2hpY2ggYWxsb2NhdGVkIERNQSBhZGRyZXNzZXMgZm9yIGVhY2ggcGFnZSwgZXZlbiBjb2FsZXNjaW5nIHRoZW0gaWYgcG9zc2libGUuICBUaGUgRE1BIGFkZHJlc3MgaXMgcGxhY2VkIGluIHRoZSBzY2F0dGVybGlzdAorCXN0cnVjdHVyZS4gIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgRE1BIGFkZHJlc3Nlcy4gIFRoaXMgbWF5IG9yIG1heSBub3QgYmUgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBwYWdlcyB0aGF0CisJdGhlIHVzZXIgYnVmZmVyIHVzZXMuICBXZSB0aGVuIGJ1aWxkIGFuIFVSQiBmb3IgZWFjaCBETUEgYWRkcmVzcyBhbmQgdGhlbiBzdWJtaXQgdGhlbS4KKyovCisvL2ludCBNYXBVc2VyQnVmZmVyKCB1bnNpZ25lZCBsb25nIHVhZGRyLCB1bnNpZ25lZCBsb25nIG51bWJ5dGVzLCB1bnNpZ25lZCBsb25nIGZyYW1lSW5mbywgc3RydWN0IGRldmljZV9leHRlbnNpb24gKnBkeCApCitzdGF0aWMgaW50IE1hcFVzZXJCdWZmZXIoc3RydWN0IGlvY3RsX3N0cnVjdCAqaW8sIHN0cnVjdCBkZXZpY2VfZXh0ZW5zaW9uICpwZHgpCit7CisJdW5zaWduZWQgbG9uZyB1YWRkcjsKKwl1bnNpZ25lZCBsb25nIG51bWJ5dGVzOworCWludCBmcmFtZUluZm87CQkvL3doaWNoIGZyYW1lIHdlJ3JlIG1hcHBpbmcKKwl1bnNpZ25lZCBpbnQgZXBBZGRyID0gMDsKKwl1bnNpZ25lZCBsb25nIGNvdW50ID0gMDsKKwlpbnQgaSA9IDA7CisJaW50IGsgPSAwOworCWludCBlcnIgPSAwOworCXN0cnVjdCBwYWdlICoqbWFwbGlzdF9wOworCWludCBudW1QYWdlc1JlcXVpcmVkOworCWZyYW1lSW5mbyA9IGlvLT5udW1GcmFtZXM7CisJdWFkZHIgPSAodW5zaWduZWQgbG9uZylpby0+cERhdGE7CisJbnVtYnl0ZXMgPSBpby0+bnVtYnl0ZXM7CisKKwlpZiAocGR4LT5pYW1hID09IFBJWElTX1BJRCkJLy9pZiBzbywgd2hpY2ggRVAgc2hvdWxkIHdlIG1hcCB0aGlzIGZyYW1lIHRvCisJeworCQlpZiAoZnJhbWVJbmZvICUgMikJLy9jaGVjayB0byBzZWUgaWYgdGhpcyBzaG91bGQgdXNlIEVQNChQT05HKQorCQl7CisJCQllcEFkZHIgPSBwZHgtPmhFUFszXTsJLy9QT05HLCBvZGQgZnJhbWVzCisJCX0gZWxzZSB7CisJCQllcEFkZHIgPSBwZHgtPmhFUFsyXTsJLy9QSU5HLCBldmVuIGZyYW1lcyBhbmQgemVybworCQl9CisJCWRiZygiUGl4aXMgRnJhbWUgIyVkOiBFUD0lZCIsIGZyYW1lSW5mbywKKwkJICAgIChlcEFkZHIgPT0gcGR4LT5oRVBbMl0pID8gMiA6IDQpOworCX0gZWxzZQkJCS8vU1QxMzMgb25seSBoYXMgMSBlbmRwb2ludCBmb3IgUGl4ZWwgZGF0YSB0cmFuc2ZlcgorCXsKKwkJZXBBZGRyID0gcGR4LT5oRVBbMF07CisJCWRiZygiU1QxMzMgRnJhbWUgIyVkOiBFUD0yIiwgZnJhbWVJbmZvKTsKKwl9CisJY291bnQgPSBudW1ieXRlczsKKwlkYmcoIlVzZXJBZGRyZXNzID0gMHglMDhsWCIsIHVhZGRyKTsKKwlkYmcoIm51bWJ5dGVzID0gJWQiLCAoaW50KW51bWJ5dGVzKTsKKwkvL251bWJlciBvZiBwYWdlcyB0byBtYXAgdGhlIGVudGlyZSB1c2VyIHNwYWNlIERNQSBidWZmZXIKKwludW1QYWdlc1JlcXVpcmVkID0KKwkgICAgKCh1YWRkciAmIH5QQUdFX01BU0spICsgY291bnQgKyB+UEFHRV9NQVNLKSA+PiBQQUdFX1NISUZUOworCWRiZygiTnVtYmVyIG9mIHBhZ2VzIG5lZWRlZCA9ICVkIiwgbnVtUGFnZXNSZXF1aXJlZCk7CisJbWFwbGlzdF9wID0gdm1hbGxvYyhudW1QYWdlc1JlcXVpcmVkICogc2l6ZW9mKHN0cnVjdCBwYWdlKSk7CS8vLCBHRlBfQVRPTUlDKTsKKwlpZiAoIW1hcGxpc3RfcCkgeworCQlkYmcoIkNhbid0IEFsbG9jYXRlIE1lbW9yeSBmb3IgbWFwbGlzdF9wIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkvL21hcCB0aGUgdXNlciBidWZmZXIgdG8ga2VybmVsIG1lbW9yeQorCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJcGR4LT5tYXBsaXN0X251bVBhZ2VzTWFwcGVkW2ZyYW1lSW5mb10gPSBnZXRfdXNlcl9wYWdlcyhjdXJyZW50LCBjdXJyZW50LT5tbSwgKHVhZGRyICYgUEFHRV9NQVNLKSwgbnVtUGFnZXNSZXF1aXJlZCwgV1JJVEUsIDAsCS8vRG9uJ3QgRm9yY2UKKwkJCQkJCQkJbWFwbGlzdF9wLAorCQkJCQkJCQlOVUxMKTsKKwl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwlkYmcoIk51bWJlciBvZiBwYWdlcyBtYXBwZWQgPSAlZCIsCisJICAgIHBkeC0+bWFwbGlzdF9udW1QYWdlc01hcHBlZFtmcmFtZUluZm9dKTsKKwlmb3IgKGkgPSAwOyBpIDwgcGR4LT5tYXBsaXN0X251bVBhZ2VzTWFwcGVkW2ZyYW1lSW5mb107IGkrKykKKwkJZmx1c2hfZGNhY2hlX3BhZ2UobWFwbGlzdF9wW2ldKTsKKwlpZiAoIXBkeC0+bWFwbGlzdF9udW1QYWdlc01hcHBlZFtmcmFtZUluZm9dKSB7CisJCWRiZygiZ2V0X3VzZXJfcGFnZXMoKSBmYWlsZWQiKTsKKwkJdmZyZWUobWFwbGlzdF9wKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCS8vbmVlZCB0byBjcmVhdGUgYSBzY2F0dGVybGlzdCB0aGF0IHNwYW5zIGVhY2ggZnJhbWUgdGhhdCBjYW4gZml0IGludG8gdGhlIG1hcHBlZCBidWZmZXIKKwlwZHgtPnNnbFtmcmFtZUluZm9dID0KKwkgICAga21hbGxvYygocGR4LT5tYXBsaXN0X251bVBhZ2VzTWFwcGVkW2ZyYW1lSW5mb10gKgorCQkgICAgIHNpemVvZihzdHJ1Y3Qgc2NhdHRlcmxpc3QpKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFwZHgtPnNnbFtmcmFtZUluZm9dKSB7CisJCXZmcmVlKG1hcGxpc3RfcCk7CisJCWRiZygiY2FuJ3QgYWxsb2NhdGUgbWVtIGZvciBzZ2wiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXBkeC0+c2dsW2ZyYW1lSW5mb11bMF0ucGFnZV9saW5rID0gbWFwbGlzdF9wWzBdOworCXBkeC0+c2dsW2ZyYW1lSW5mb11bMF0ub2Zmc2V0ID0gdWFkZHIgJiB+UEFHRV9NQVNLOworCWlmIChwZHgtPm1hcGxpc3RfbnVtUGFnZXNNYXBwZWRbZnJhbWVJbmZvXSA+IDEpIHsKKwkJcGR4LT5zZ2xbZnJhbWVJbmZvXVswXS5sZW5ndGggPQorCQkgICAgUEFHRV9TSVpFIC0gcGR4LT5zZ2xbZnJhbWVJbmZvXVswXS5vZmZzZXQ7CisJCWNvdW50IC09IHBkeC0+c2dsW2ZyYW1lSW5mb11bMF0ubGVuZ3RoOworCQlmb3IgKGsgPSAxOyBrIDwgcGR4LT5tYXBsaXN0X251bVBhZ2VzTWFwcGVkW2ZyYW1lSW5mb107IGsrKykgeworCQkJcGR4LT5zZ2xbZnJhbWVJbmZvXVtrXS5vZmZzZXQgPSAwOworCQkJcGR4LT5zZ2xbZnJhbWVJbmZvXVtrXS5wYWdlX2xpbmsgPSBtYXBsaXN0X3Bba107CisJCQlwZHgtPnNnbFtmcmFtZUluZm9dW2tdLmxlbmd0aCA9CisJCQkgICAgKGNvdW50IDwgUEFHRV9TSVpFKSA/IGNvdW50IDogUEFHRV9TSVpFOworCQkJY291bnQgLT0gUEFHRV9TSVpFOwkvL2V4YW1wbGUgaGFkIFBBR0VfU0laRSBoZXJlOworCQl9CisJfSBlbHNlIHsKKwkJcGR4LT5zZ2xbZnJhbWVJbmZvXVswXS5sZW5ndGggPSBjb3VudDsKKwl9CisJcGR4LT5zZ0VudHJpZXNbZnJhbWVJbmZvXSA9CisJICAgIHVzYl9idWZmZXJfbWFwX3NnKHBkeC0+dWRldiwgZXBBZGRyLCBwZHgtPnNnbFtmcmFtZUluZm9dLAorCQkJICAgICAgcGR4LT5tYXBsaXN0X251bVBhZ2VzTWFwcGVkW2ZyYW1lSW5mb10pOworCWRiZygibnVtYmVyIG9mIHNnRW50cmllcyA9ICVkIiwgcGR4LT5zZ0VudHJpZXNbZnJhbWVJbmZvXSk7CisJcGR4LT51c2VyQnVmTWFwcGVkID0gMTsKKwl2ZnJlZShtYXBsaXN0X3ApOworCS8vQ3JlYXRlIGFuZCBTZW5kIHRoZSBVUkIncyBmb3IgZWFjaCBzL2cgZW50cnkKKwlwZHgtPlBpeGVsVXJiW2ZyYW1lSW5mb10gPQorCSAgICBrbWFsbG9jKHBkeC0+c2dFbnRyaWVzW2ZyYW1lSW5mb10gKiBzaXplb2Yoc3RydWN0IHVyYiAqKSwKKwkJICAgIEdGUF9LRVJORUwpOworCWlmICghcGR4LT5QaXhlbFVyYltmcmFtZUluZm9dKSB7CisJCWRiZygiQ2FuJ3QgQWxsb2NhdGUgTWVtb3J5IGZvciBVcmIiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWZvciAoaSA9IDA7IGkgPCBwZHgtPnNnRW50cmllc1tmcmFtZUluZm9dOyBpKyspIHsKKwkJcGR4LT5QaXhlbFVyYltmcmFtZUluZm9dW2ldID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsJLy8wIGJlY2F1c2Ugd2UncmUgdXNpbmcgQlVMSyB0cmFuc2ZlcnMKKwkJdXNiX2ZpbGxfYnVsa191cmIocGR4LT5QaXhlbFVyYltmcmFtZUluZm9dW2ldLAorCQkJCSAgcGR4LT51ZGV2LAorCQkJCSAgZXBBZGRyLAorCQkJCSAgKGRtYV9hZGRyX3QgKikgc2dfZG1hX2FkZHJlc3MoJnBkeC0+CisJCQkJCQkJCXNnbFtmcmFtZUluZm9dCisJCQkJCQkJCVtpXSksCisJCQkJICBzZ19kbWFfbGVuKCZwZHgtPnNnbFtmcmFtZUluZm9dW2ldKSwKKwkJCQkgIHBpdXNiX3JlYWRQSVhFTF9jYWxsYmFjaywgKHZvaWQgKilwZHgpOworCQlwZHgtPlBpeGVsVXJiW2ZyYW1lSW5mb11baV0tPnRyYW5zZmVyX2RtYSA9CisJCSAgICBzZ19kbWFfYWRkcmVzcygmcGR4LT5zZ2xbZnJhbWVJbmZvXVtpXSk7CisJCXBkeC0+UGl4ZWxVcmJbZnJhbWVJbmZvXVtpXS0+dHJhbnNmZXJfZmxhZ3MgPQorCQkgICAgVVJCX05PX1RSQU5TRkVSX0RNQV9NQVAgfCBVUkJfTk9fSU5URVJSVVBUOworCX0KKwlwZHgtPlBpeGVsVXJiW2ZyYW1lSW5mb11bLS1pXS0+dHJhbnNmZXJfZmxhZ3MgJj0gflVSQl9OT19JTlRFUlJVUFQ7CS8vb25seSBpbnRlcnJ1cHQgd2hlbiBsYXN0IFVSQiBjb21wbGV0ZXMKKwlwZHgtPnBlbmRlZFBpeGVsVXJic1tmcmFtZUluZm9dID0KKwkgICAga21hbGxvYygocGR4LT5zZ0VudHJpZXNbZnJhbWVJbmZvXSAqIHNpemVvZihjaGFyKSksIEdGUF9LRVJORUwpOworCWlmICghcGR4LT5wZW5kZWRQaXhlbFVyYnNbZnJhbWVJbmZvXSkKKwkJZGJnKCJDYW4ndCBhbGxvY2F0ZSBNZW1vcnkgZm9yIHBlbmRlZFBpeGVsVXJicyIpOworCWZvciAoaSA9IDA7IGkgPCBwZHgtPnNnRW50cmllc1tmcmFtZUluZm9dOyBpKyspIHsKKwkJZXJyID0gdXNiX3N1Ym1pdF91cmIocGR4LT5QaXhlbFVyYltmcmFtZUluZm9dW2ldLCBHRlBfQVRPTUlDKTsKKwkJaWYgKGVycikgeworCQkJZGJnKCIlcyAlZFxuIiwgInN1Ym1pdCB1cmIgZXJyb3IgPSIsIGVycik7CisJCQlwZHgtPnBlbmRlZFBpeGVsVXJic1tmcmFtZUluZm9dW2ldID0gMDsKKwkJCXJldHVybiBlcnI7CisJCX0gZWxzZQorCQkJcGR4LT5wZW5kZWRQaXhlbFVyYnNbZnJhbWVJbmZvXVtpXSA9IDE7OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcGl1c2JfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkuaW9jdGwgPSBwaXVzYl9pb2N0bCwKKwkub3BlbiA9IHBpdXNiX29wZW4sCisJLnJlbGVhc2UgPSBwaXVzYl9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCB1c2JfY2xhc3NfZHJpdmVyIHBpdXNiX2NsYXNzID0geworCS5uYW1lID0gInVzYi9yc3BpdXNiJWQiLAorCS5mb3BzID0gJnBpdXNiX2ZvcHMsCisJLm1pbm9yX2Jhc2UgPSBQSVVTQl9NSU5PUl9CQVNFLAorfTsKKworLyoqCisgKglwaXVzYl9wcm9iZQorICoKKyAqCUNhbGxlZCBieSB0aGUgdXNiIGNvcmUgd2hlbiBhIG5ldyBkZXZpY2UgaXMgY29ubmVjdGVkIHRoYXQgaXQgdGhpbmtzCisgKgl0aGlzIGRyaXZlciBtaWdodCBiZSBpbnRlcmVzdGVkIGluLgorICovCitzdGF0aWMgaW50IHBpdXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGRldmljZV9leHRlbnNpb24gKnBkeCA9IE5VTEw7CisJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaWZhY2VfZGVzYzsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OworCWludCBpOworCWludCByZXR2YWwgPSAtRU5PTUVNOworCisJZGV2X2RiZygmaW50ZXJmYWNlLT5kZXYsICIlcyAtIExvb2tpbmcgZm9yIFBJIFVTQiBIYXJkd2FyZSIsIF9fZnVuY19fKTsKKworCXBkeCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkZXZpY2VfZXh0ZW5zaW9uKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHBkeCA9PSBOVUxMKSB7CisJCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiT3V0IG9mIG1lbW9yeVxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCWtyZWZfaW5pdCgmcGR4LT5rcmVmKTsKKwlwZHgtPnVkZXYgPSB1c2JfZ2V0X2RldihpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSkpOworCXBkeC0+aW50ZXJmYWNlID0gaW50ZXJmYWNlOworCWlmYWNlX2Rlc2MgPSBpbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nOworCisJLyogU2VlIGlmIHRoZSBkZXZpY2Ugb2ZmZXJlZCB1cyBtYXRjaGVzIHdoYXQgd2UgY2FuIGFjY2VwdCAqLworCWlmICgocGR4LT51ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yICE9IFZFTkRPUl9JRCkKKwkgICAgfHwgKChwZHgtPnVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0ICE9IFBJWElTX1BJRCkKKwkJJiYgKHBkeC0+dWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QgIT0gU1QxMzNfUElEKSkpIHsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXBkeC0+aWFtYSA9IHBkeC0+dWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3Q7CisKKwlpZiAoZGVidWcpIHsKKwkJaWYgKHBkeC0+dWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QgPT0gUElYSVNfUElEKQorCQkJZGJnKCJQSVVTQjpQaXhpcyBDYW1lcmEgRm91bmQiKTsKKwkJZWxzZQorCQkJZGJnKCJQSVVTQjpTVDEzMyBVU0IgQ29udHJvbGxlciBGb3VuZCIpOworCQlpZiAocGR4LT51ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCkKKwkJCWRiZygiSGlnaHNwZWVkKFVTQjIuMCkgRGV2aWNlIEF0dGFjaGVkIik7CisJCWVsc2UKKwkJCWRiZygiTG93c3BlZWQgKFVTQjEuMSkgRGV2aWNlIEF0dGFjaGVkIik7CisKKwkJZGJnKCJOdW1FbmRwb2ludHMgaW4gQ29uZmlndXJhdGlvbjogJWQiLAorCQkgICAgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50czsgKytpKSB7CisJCWVuZHBvaW50ID0gJmlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2M7CisJCWlmIChkZWJ1ZykgeworCQkJZGJnKCJFbmRwb2ludFslZF0tPmJEZXNjcmlwdG9yVHlwZSA9ICVkIiwgaSwKKwkJCSAgICBlbmRwb2ludC0+YkRlc2NyaXB0b3JUeXBlKTsKKwkJCWRiZygiRW5kcG9pbnRbJWRdLT5iRW5kcG9pbnRBZGRyZXNzID0gMHglMDJYIiwgaSwKKwkJCSAgICBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyk7CisJCQlkYmcoIkVuZHBvaW50WyVkXS0+YmJtQXR0cmlidXRlcyA9ICVkIiwgaSwKKwkJCSAgICBlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzKTsKKwkJCWRiZygiRW5kcG9pbnRbJWRdLT5NYXhQYWNrZXRTaXplID0gJWRcbiIsIGksCisJCQkgICAgZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKTsKKwkJfQorCQlpZiAoKGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgPT0KKwkJICAgIFVTQl9FTkRQT0lOVF9YRkVSX0JVTEspIHsKKwkJCWlmIChlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9ESVJfSU4pCisJCQkJcGR4LT5oRVBbaV0gPQorCQkJCSAgICB1c2JfcmN2YnVsa3BpcGUocGR4LT51ZGV2LAorCQkJCQkJICAgIGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKTsKKwkJCWVsc2UKKwkJCQlwZHgtPmhFUFtpXSA9CisJCQkJICAgIHVzYl9zbmRidWxrcGlwZShwZHgtPnVkZXYsCisJCQkJCQkgICAgZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpOworCQl9CisJfQorCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBwZHgpOworCXJldHZhbCA9IHVzYl9yZWdpc3Rlcl9kZXYoaW50ZXJmYWNlLCAmcGl1c2JfY2xhc3MpOworCWlmIChyZXR2YWwpIHsKKwkJZXJyKCJOb3QgYWJsZSB0byBnZXQgYSBtaW5vciBmb3IgdGhpcyBkZXZpY2UuIik7CisJCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKKwkJZ290byBlcnJvcjsKKwl9CisJcGR4LT5wcmVzZW50ID0gMTsKKworCS8qIHdlIGNhbiByZWdpc3RlciB0aGUgZGV2aWNlIG5vdywgYXMgaXQgaXMgcmVhZHkgKi8KKwlwZHgtPm1pbm9yID0gaW50ZXJmYWNlLT5taW5vcjsKKwkvKiBsZXQgdGhlIHVzZXIga25vdyB3aGF0IG5vZGUgdGhpcyBkZXZpY2UgaXMgbm93IGF0dGFjaGVkIHRvICovCisJZGJnKCJQSSBVU0IyLjAgZGV2aWNlIG5vdyBhdHRhY2hlZCB0byBwaXVzYi0lZCIsIHBkeC0+bWlub3IpOworCXJldHVybiAwOworCisgICAgICBlcnJvcjoKKwlpZiAocGR4KQorCQlrcmVmX3B1dCgmcGR4LT5rcmVmLCBwaXVzYl9kZWxldGUpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICoJcGl1c2JfZGlzY29ubmVjdAorICoKKyAqCUNhbGxlZCBieSB0aGUgdXNiIGNvcmUgd2hlbiB0aGUgZGV2aWNlIGlzIHJlbW92ZWQgZnJvbSB0aGUgc3lzdGVtLgorICoKKyAqCVRoaXMgcm91dGluZSBndWFyYW50ZWVzIHRoYXQgdGhlIGRyaXZlciB3aWxsIG5vdCBzdWJtaXQgYW55IG1vcmUgdXJicworICoJYnkgY2xlYXJpbmcgcGR4LT51ZGV2LiAgSXQgaXMgYWxzbyBzdXBwb3NlZCB0byB0ZXJtaW5hdGUgYW55IGN1cnJlbnRseQorICoJYWN0aXZlIHVyYnMuICBVbmZvcnR1bmF0ZWx5LCB1c2JfYnVsa19tc2coKSwgdXNlZCBpbiBwaXVzYl9yZWFkKCksIGRvZXMKKyAqCW5vdCBwcm92aWRlIGFueSB3YXkgdG8gZG8gdGhpcy4gIEJ1dCBhdCBsZWFzdCB3ZSBjYW4gY2FuY2VsIGFuIGFjdGl2ZQorICoJd3JpdGUuCisgKi8KK3N0YXRpYyB2b2lkIHBpdXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX2V4dGVuc2lvbiAqcGR4OworCWludCBtaW5vciA9IGludGVyZmFjZS0+bWlub3I7CisJbG9ja19rZXJuZWwoKTsKKwlwZHggPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CisJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOworCS8qIGdpdmUgYmFjayBvdXIgbWlub3IgKi8KKwl1c2JfZGVyZWdpc3Rlcl9kZXYoaW50ZXJmYWNlLCAmcGl1c2JfY2xhc3MpOworCXVubG9ja19rZXJuZWwoKTsKKwkvKiBwcmV2ZW50IGRldmljZSByZWFkLCB3cml0ZSBhbmQgaW9jdGwgKi8KKwlwZHgtPnByZXNlbnQgPSAwOworCWtyZWZfcHV0KCZwZHgtPmtyZWYsIHBpdXNiX2RlbGV0ZSk7CisJZGJnKCJQSSBVU0IyLjAgZGV2aWNlICMlZCBub3cgZGlzY29ubmVjdGVkXG4iLCBtaW5vcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBwaXVzYl9kcml2ZXIgPSB7CisJLm5hbWUgPSAic3ViIiwKKwkucHJvYmUgPSBwaXVzYl9wcm9iZSwKKwkuZGlzY29ubmVjdCA9IHBpdXNiX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlID0gcGlfZGV2aWNlX3RhYmxlLAorfTsKKworLyoqCisgKglwaXVzYl9pbml0CisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHBpdXNiX2luaXQodm9pZCkKK3sKKwlpbnQgcmVzdWx0OworCS8qIHJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIFVTQiBzdWJzeXN0ZW0gKi8KKwlyZXN1bHQgPSB1c2JfcmVnaXN0ZXIoJnBpdXNiX2RyaXZlcik7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIgS0JVSUxEX01PRE5BTUUKKwkJICAgICAgICI6IHVzYl9yZWdpc3RlciBmYWlsZWQuIEVycm9yIG51bWJlciAlZFxuIiwgcmVzdWx0KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyBLQlVJTERfTU9ETkFNRSAiOiVzOiAlc1xuIiwgRFJJVkVSX0RFU0MsCisJICAgICAgIERSSVZFUl9WRVJTSU9OKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglwaXVzYl9leGl0CisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBwaXVzYl9leGl0KHZvaWQpCit7CisJLyogZGVyZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSBVU0Igc3Vic3lzdGVtICovCisJdXNiX2RlcmVnaXN0ZXIoJnBpdXNiX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHBpdXNiX2luaXQpOworbW9kdWxlX2V4aXQocGl1c2JfZXhpdCk7CisKKy8qIE1vZHVsZSBwYXJhbWV0ZXJzICovCittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgZW5hYmxlZCBvciBub3QiKTsKKworTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnNwaXVzYi9yc3BpdXNiLmggYi9kcml2ZXJzL3N0YWdpbmcvcnNwaXVzYi9yc3BpdXNiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY1Y2QyZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9yc3BpdXNiL3JzcGl1c2IuaApAQCAtMCwwICsxLDI1IEBACisjaWZuZGVmIF9fUlNQSVVTQl9ICisjZGVmaW5lIF9fUlNQSVVTQl9ICisKKyNkZWZpbmUgUElVU0JfTUFHSUMJCSdtJworI2RlZmluZSBQSVVTQl9JT0NUTF9CQVNFCTE5MgorI2RlZmluZSBQSVVTQl9HRVRWTkRDTUQJCV9JT1IoUElVU0JfTUFHSUMsIFBJVVNCX0lPQ1RMX0JBU0UgKyAxLCBzdHJ1Y3QgaW9jdGxfc3RydWN0KQorI2RlZmluZSBQSVVTQl9TRVRWTkRDTUQJCV9JT1coUElVU0JfTUFHSUMsIFBJVVNCX0lPQ1RMX0JBU0UgKyAyLCBzdHJ1Y3QgaW9jdGxfc3RydWN0KQorI2RlZmluZSBQSVVTQl9XUklURVBJUEUJCV9JT1coUElVU0JfTUFHSUMsIFBJVVNCX0lPQ1RMX0JBU0UgKyAzLCBzdHJ1Y3QgaW9jdGxfc3RydWN0KQorI2RlZmluZSBQSVVTQl9SRUFEUElQRQkJX0lPUihQSVVTQl9NQUdJQywgUElVU0JfSU9DVExfQkFTRSArIDQsIHN0cnVjdCBpb2N0bF9zdHJ1Y3QpCisjZGVmaW5lIFBJVVNCX1NFVEZSQU1FU0laRQlfSU9XKFBJVVNCX01BR0lDLCBQSVVTQl9JT0NUTF9CQVNFICsgNSwgc3RydWN0IGlvY3RsX3N0cnVjdCkKKyNkZWZpbmUgUElVU0JfV0hBVENBTUVSQQlfSU8oUElVU0JfTUFHSUMsICBQSVVTQl9JT0NUTF9CQVNFICsgNikKKyNkZWZpbmUgUElVU0JfVVNFUkJVRkZFUglfSU9XKFBJVVNCX01BR0lDLCBQSVVTQl9JT0NUTF9CQVNFICsgNywgc3RydWN0IGlvY3RsX3N0cnVjdCkKKyNkZWZpbmUgUElVU0JfSVNISUdIU1BFRUQJX0lPKFBJVVNCX01BR0lDLCAgUElVU0JfSU9DVExfQkFTRSArIDgpCisjZGVmaW5lIFBJVVNCX1VOTUFQX1VTRVJCVUZGRVIJX0lPVyhQSVVTQl9NQUdJQywgUElVU0JfSU9DVExfQkFTRSArIDksIHN0cnVjdCBpb2N0bF9zdHJ1Y3QpCisKK3N0cnVjdCBpb2N0bF9zdHJ1Y3QgeworCXVuc2lnbmVkIGNoYXIgY21kOworCXVuc2lnbmVkIGxvbmcgbnVtYnl0ZXM7CisJdW5zaWduZWQgY2hhciBkaXI7CS8vMT1vdXQ7MD1pbgorCWludCBlbmRwb2ludDsKKwlpbnQgbnVtRnJhbWVzOworCXVuc2lnbmVkIGNoYXIgKnBEYXRhOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwLzI4NjBfbWFpbl9kZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvMjg2MF9tYWluX2Rldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4Y2E4MWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwLzI4NjBfbWFpbl9kZXYuYwpAQCAtMCwwICsxLDEzNzcgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgMjg3MF9tYWluX2Rldi5jCisKKyAgICBBYnN0cmFjdDoKKyAgICBDcmVhdGUgYW5kIHJlZ2lzdGVyIG5ldHdvcmsgaW50ZXJmYWNlLgorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaW5jbHVkZSAicnRfY29uZmlnLmgiCisKKworI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAorLy8gcmVjb3JkIHdoZXRoZXIgdGhlIGNhcmQgaW4gdGhlIGNhcmQgbGlzdCBpcyB1c2VkIGluIHRoZSBjYXJkIGZpbGUKK2V4dGVybiBVSU5UOCAgTUNfQ2FyZFVzZWRbXTsKKyNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KKworCitleHRlcm4gSU5UIF9fZGV2aW5pdCBydDI4eHhfcHJvYmUoSU4gdm9pZCAqX2Rldl9wLCBJTiB2b2lkICpfZGV2X2lkX3AsCisJCQkJCQkJCQlJTiBVSU5UIGFyZ2MsIE9VVCBQUlRNUF9BREFQVEVSICpwcEFkKTsKKworc3RhdGljIHZvaWQgcnhfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBtZ210X2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIGFjMF9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBhYzFfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgYWMyX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIGFjM19kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBoY2NhX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIGZpZm9fc3RhdGlzdGljX2Z1bGxfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFN5bWJvbCAmIE1hY3JvIERlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgUlQyODYwX0lOVF9SWF9ETFkJCQkJKDE8PDApCQkvLyBiaXQgMAorI2RlZmluZSBSVDI4NjBfSU5UX1RYX0RMWQkJCQkoMTw8MSkJCS8vIGJpdCAxCisjZGVmaW5lIFJUMjg2MF9JTlRfUlhfRE9ORQkJCQkoMTw8MikJCS8vIGJpdCAyCisjZGVmaW5lIFJUMjg2MF9JTlRfQUMwX0RNQV9ET05FCQkJKDE8PDMpCQkvLyBiaXQgMworI2RlZmluZSBSVDI4NjBfSU5UX0FDMV9ETUFfRE9ORQkJCSgxPDw0KQkJLy8gYml0IDQKKyNkZWZpbmUgUlQyODYwX0lOVF9BQzJfRE1BX0RPTkUJCQkoMTw8NSkJCS8vIGJpdCA1CisjZGVmaW5lIFJUMjg2MF9JTlRfQUMzX0RNQV9ET05FCQkJKDE8PDYpCQkvLyBiaXQgNgorI2RlZmluZSBSVDI4NjBfSU5UX0hDQ0FfRE1BX0RPTkUJCSgxPDw3KQkJLy8gYml0IDcKKyNkZWZpbmUgUlQyODYwX0lOVF9NR01UX0RPTkUJCQkoMTw8OCkJCS8vIGJpdCA4CisKKyNkZWZpbmUgSU5UX1JYCQkJUlQyODYwX0lOVF9SWF9ET05FCisKKyNkZWZpbmUgSU5UX0FDMF9ETFkJCShSVDI4NjBfSU5UX0FDMF9ETUFfRE9ORSkgLy98IFJUMjg2MF9JTlRfVFhfRExZKQorI2RlZmluZSBJTlRfQUMxX0RMWQkJKFJUMjg2MF9JTlRfQUMxX0RNQV9ET05FKSAvL3wgUlQyODYwX0lOVF9UWF9ETFkpCisjZGVmaW5lIElOVF9BQzJfRExZCQkoUlQyODYwX0lOVF9BQzJfRE1BX0RPTkUpIC8vfCBSVDI4NjBfSU5UX1RYX0RMWSkKKyNkZWZpbmUgSU5UX0FDM19ETFkJCShSVDI4NjBfSU5UX0FDM19ETUFfRE9ORSkgLy98IFJUMjg2MF9JTlRfVFhfRExZKQorI2RlZmluZSBJTlRfSENDQV9ETFkgCShSVDI4NjBfSU5UX0hDQ0FfRE1BX0RPTkUpIC8vfCBSVDI4NjBfSU5UX1RYX0RMWSkKKyNkZWZpbmUgSU5UX01HTVRfRExZCVJUMjg2MF9JTlRfTUdNVF9ET05FCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByb3RvdHlwZXMgb2YgRnVuY3Rpb25zIFVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAqLworc3RhdGljIElOVCBfX2RldmluaXQgcnQyODYwX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgICplbnQpOworc3RhdGljIFZPSUQgX19kZXZleGl0IHJ0Mjg2MF9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KTsKK3N0YXRpYyBJTlQgX19kZXZpbml0IHJ0Mjg2MF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgICplbnQpOwordm9pZCBpbml0X3RocmVhZF90YXNrKFBSVE1QX0FEQVBURVIgcEFkKTsKK3N0YXRpYyB2b2lkIF9fZXhpdCBydDI4NjBfY2xlYW51cF9tb2R1bGUodm9pZCk7CitzdGF0aWMgaW50IF9faW5pdCBydDI4NjBfaW5pdF9tb2R1bGUodm9pZCk7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHJ0Mjg2MF9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOworc3RhdGljIGludCBydDI4NjBfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KTsKKyNlbmRpZiAvLyBDT05GSUdfUE0gLy8KKyNlbmRpZgorCisKKy8vCisvLyBSYWxpbmsgUENJIGRldmljZSB0YWJsZSwgaW5jbHVkZSBhbGwgc3VwcG9ydGVkIGNoaXBzZXRzCisvLworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHJ0Mjg2MF9wY2lfdGJsW10gX19kZXZpbml0ZGF0YSA9Cit7CisJe1BDSV9ERVZJQ0UoTklDX1BDSV9WRU5ET1JfSUQsIE5JQzI4NjBfUENJX0RFVklDRV9JRCl9LAkJLy9SVDI4NjAyLjRHCisJe1BDSV9ERVZJQ0UoTklDX1BDSV9WRU5ET1JfSUQsIE5JQzI4NjBfUENJZV9ERVZJQ0VfSUQpfSwKKwl7UENJX0RFVklDRShOSUNfUENJX1ZFTkRPUl9JRCwgTklDMjc2MF9QQ0lfREVWSUNFX0lEKX0sCisJe1BDSV9ERVZJQ0UoTklDX1BDSV9WRU5ET1JfSUQsIE5JQzI3OTBfUENJZV9ERVZJQ0VfSUQpfSwKKwl7UENJX0RFVklDRShWRU5fQVdUX1BDSV9WRU5ET1JfSUQsIFZFTl9BV1RfUENJZV9ERVZJQ0VfSUQpfSwKKyAgICB7MCx9CQkvLyB0ZXJtaW5hdGUgbGlzdAorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHJ0Mjg2MF9wY2lfdGJsKTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKyNpZmRlZiBNT0RVTEVfVkVSU0lPTgorTU9EVUxFX1ZFUlNJT04oU1RBX0RSSVZFUl9WRVJTSU9OKTsKKyNlbmRpZgorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKKy8vCisvLyBPdXIgUENJIGRyaXZlciBzdHJ1Y3R1cmUKKy8vCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcnQyODYwX2RyaXZlciA9Cit7CisgICAgbmFtZTogICAgICAgInJ0Mjg2MCIsCisgICAgaWRfdGFibGU6ICAgcnQyODYwX3BjaV90YmwsCisgICAgcHJvYmU6ICAgICAgcnQyODYwX2luaXRfb25lLAorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSAweDIwNDEyCisgICAgcmVtb3ZlOiAgICAgX19kZXZleGl0X3AocnQyODYwX3JlbW92ZV9vbmUpLAorI2Vsc2UKKyAgICByZW1vdmU6ICAgICBfX2RldmV4aXQocnQyODYwX3JlbW92ZV9vbmUpLAorI2VuZGlmCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisjaWZkZWYgQ09ORklHX1BNCisJc3VzcGVuZDoJcnQyODYwX3N1c3BlbmQsCisJcmVzdW1lOgkJcnQyODYwX3Jlc3VtZSwKKyNlbmRpZgorI2VuZGlmCit9OworCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisjaWZkZWYgQ09ORklHX1BNCisKK1ZPSUQgUlQyODYwUmVqZWN0UGVuZGluZ1BhY2tldHMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJLy8gY2xlYXIgUFMgcGFja2V0cworCS8vIGNsZWFyIFR4U3cgcGFja2V0cworfQorCitzdGF0aWMgaW50IHJ0Mjg2MF9zdXNwZW5kKAorCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LAorCXBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKKwlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKU5VTEw7CisJSU5UMzIgcmV0dmFsOworCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IHJ0Mjg2MF9zdXNwZW5kKClcbiIpKTsKKworCWlmIChuZXRfZGV2ID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJuZXRfZGV2ID09IE5VTEwhXG4iKSk7CisJfQorCWVsc2UKKwl7CisJCXBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisKKwkJLyogd2UgY2FuIG5vdCB1c2UgSUZGX1VQIGJlY2F1c2UgcmEwIGRvd24gYnV0IHJhMSB1cCAqLworCQkvKiBhbmQgMSBzdXNwZW5kL3Jlc3VtZSBmdW5jdGlvbiBmb3IgMSBtb2R1bGUsIG5vdCBmb3IgZWFjaCBpbnRlcmZhY2UgKi8KKwkJLyogc28gTGludXggd2lsbCBjYWxsIHN1c3BlbmQvcmVzdW1lIGZ1bmN0aW9uIG9uY2UgKi8KKwkJaWYgKFZJUlRVQUxfSUZfTlVNKHBBZCkgPiAwKQorCQl7CisJCQkvLyBhdm9pZCB1c2VycyBkbyBzdXNwZW5kIGFmdGVyIGludGVyZmFjZSBpcyBkb3duCisKKwkJCS8vIHN0b3AgaW50ZXJmYWNlCisJCQluZXRpZl9jYXJyaWVyX29mZihuZXRfZGV2KTsKKwkJCW5ldGlmX3N0b3BfcXVldWUobmV0X2Rldik7CisKKwkJCS8vIG1hcmsgZGV2aWNlIGFzIHJlbW92ZWQgZnJvbSBzeXN0ZW0gYW5kIHRoZXJlZm9yZSBubyBsb25nZXIgYXZhaWxhYmxlCisJCQluZXRpZl9kZXZpY2VfZGV0YWNoKG5ldF9kZXYpOworCisJCQkvLyBtYXJrIGhhbHQgZmxhZworCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7CisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOworCisJCQkvLyB0YWtlIGRvd24gdGhlIGRldmljZQorCQkJcnQyOHh4X2Nsb3NlKChQTkVUX0RFViluZXRfZGV2KTsKKworCQkJUlRfTU9EX0RFQ19VU0VfQ09VTlQoKTsKKwkJfQorCX0KKworCS8vIHJlZmVyZW5jZSB0byBodHRwOi8vdm92bzIwMDAuY29tL3R5cGUtbGFiL2xpbnV4L2tlcm5lbC1hcGkvbGludXgta2VybmVsLWFwaS5odG1sCisJLy8gZW5hYmxlIGRldmljZSB0byBnZW5lcmF0ZSBQTUUjIHdoZW4gc3VzcGVuZGVkCisJLy8gcGNpX2Nob29zZV9zdGF0ZSgpOiBDaG9vc2UgdGhlIHBvd2VyIHN0YXRlIG9mIGEgUENJIGRldmljZSB0byBiZSBzdXNwZW5kZWQKKwlyZXR2YWwgPSBwY2lfZW5hYmxlX3dha2UocGNpX2RldiwgcGNpX2Nob29zZV9zdGF0ZShwY2lfZGV2LCBzdGF0ZSksIDEpOworCS8vIHNhdmUgdGhlIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIG9mIGEgZGV2aWNlIGJlZm9yZSBzdXNwZW5kaW5nCisJcGNpX3NhdmVfc3RhdGUocGNpX2Rldik7CisJLy8gZGlzYWJsZSBQQ0kgZGV2aWNlIGFmdGVyIHVzZQorCXBjaV9kaXNhYmxlX2RldmljZShwY2lfZGV2KTsKKworCXJldHZhbCA9IHBjaV9zZXRfcG93ZXJfc3RhdGUocGNpX2RldiwgcGNpX2Nob29zZV9zdGF0ZShwY2lfZGV2LCBzdGF0ZSkpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PSBydDI4NjBfc3VzcGVuZCgpXG4iKSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBydDI4NjBfcmVzdW1lKAorCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpTlVMTDsKKwlJTlQzMiByZXR2YWw7CisKKworCS8vIHNldCB0aGUgcG93ZXIgc3RhdGUgb2YgYSBQQ0kgZGV2aWNlCisJLy8gUENJIGhhcyA0IHBvd2VyIHN0YXRlcywgRE8gKG5vcm1hbCkgfiBEMyhsZXNzIHBvd2VyKQorCS8vIGluIGluY2x1ZGUvbGludXgvcGNpLmgsIHlvdSBjYW4gZmluZCB0aGF0CisJLy8gI2RlZmluZSBQQ0lfRDAgICAgICAgICAgKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSAwKQorCS8vICNkZWZpbmUgUENJX0QxICAgICAgICAgICgocGNpX3Bvd2VyX3QgX19mb3JjZSkgMSkKKwkvLyAjZGVmaW5lIFBDSV9EMiAgICAgICAgICAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIDIpCisJLy8gI2RlZmluZSBQQ0lfRDNob3QgICAgICAgKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSAzKQorCS8vICNkZWZpbmUgUENJX0QzY29sZCAgICAgICgocGNpX3Bvd2VyX3QgX19mb3JjZSkgNCkKKwkvLyAjZGVmaW5lIFBDSV9VTktOT1dOICAgICAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIDUpCisJLy8gI2RlZmluZSBQQ0lfUE9XRVJfRVJST1IgKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSAtMSkKKwlyZXR2YWwgPSBwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaV9kZXYsIFBDSV9EMCk7CisKKwkvLyByZXN0b3JlIHRoZSBzYXZlZCBzdGF0ZSBvZiBhIFBDSSBkZXZpY2UKKwlwY2lfcmVzdG9yZV9zdGF0ZShwY2lfZGV2KTsKKworCS8vIGluaXRpYWxpemUgZGV2aWNlIGJlZm9yZSBpdCdzIHVzZWQgYnkgYSBkcml2ZXIKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpX2RldikpCisJeworCQlwcmludGsoInBjaSBlbmFibGUgZmFpbCFcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IHJ0Mjg2MF9yZXN1bWUoKVxuIikpOworCisJaWYgKG5ldF9kZXYgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIm5ldF9kZXYgPT0gTlVMTCFcbiIpKTsKKwl9CisJZWxzZQorCQlwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCisJaWYgKHBBZCAhPSBOVUxMKQorCXsKKwkJLyogd2UgY2FuIG5vdCB1c2UgSUZGX1VQIGJlY2F1c2UgcmEwIGRvd24gYnV0IHJhMSB1cCAqLworCQkvKiBhbmQgMSBzdXNwZW5kL3Jlc3VtZSBmdW5jdGlvbiBmb3IgMSBtb2R1bGUsIG5vdCBmb3IgZWFjaCBpbnRlcmZhY2UgKi8KKwkJLyogc28gTGludXggd2lsbCBjYWxsIHN1c3BlbmQvcmVzdW1lIGZ1bmN0aW9uIG9uY2UgKi8KKwkJaWYgKFZJUlRVQUxfSUZfTlVNKHBBZCkgPiAwKQorCQl7CisJCQkvLyBtYXJrIGRldmljZSBhcyBhdHRhY2hlZCBmcm9tIHN5c3RlbSBhbmQgcmVzdGFydCBpZiBuZWVkZWQKKwkJCW5ldGlmX2RldmljZV9hdHRhY2gobmV0X2Rldik7CisKKwkJCWlmIChydDI4eHhfb3BlbigoUE5FVF9ERVYpbmV0X2RldikgIT0gMCkKKwkJCXsKKwkJCQkvLyBvcGVuIGZhaWwKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09IHJ0Mjg2MF9yZXN1bWUoKVxuIikpOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQkvLyBpbmNyZWFzZSBNT0RVTEUgdXNlIGNvdW50CisJCQlSVF9NT0RfSU5DX1VTRV9DT1VOVCgpOworCisJCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpOworCQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOworCisJCQluZXRpZl9zdGFydF9xdWV1ZShuZXRfZGV2KTsKKwkJCW5ldGlmX2NhcnJpZXJfb24obmV0X2Rldik7CisJCQluZXRpZl93YWtlX3F1ZXVlKG5ldF9kZXYpOworCQl9CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PSBydDI4NjBfcmVzdW1lKClcbiIpKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvLyBDT05GSUdfUE0gLy8KKyNlbmRpZgorCisKK3N0YXRpYyBJTlQgX19pbml0IHJ0Mjg2MF9pbml0X21vZHVsZShWT0lEKQoreworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmcnQyODYwX2RyaXZlcik7CisjZWxzZQorICAgIHJldHVybiBwY2lfbW9kdWxlX2luaXQoJnJ0Mjg2MF9kcml2ZXIpOworI2VuZGlmCit9CisKKworLy8KKy8vIERyaXZlciBtb2R1bGUgdW5sb2FkIGZ1bmN0aW9uCisvLworc3RhdGljIFZPSUQgX19leGl0IHJ0Mjg2MF9jbGVhbnVwX21vZHVsZShWT0lEKQoreworICAgIHBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcnQyODYwX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHJ0Mjg2MF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChydDI4NjBfY2xlYW51cF9tb2R1bGUpOworCisKK3N0YXRpYyBJTlQgX19kZXZpbml0IHJ0Mjg2MF9pbml0X29uZSAoCisgICAgSU4gIHN0cnVjdCBwY2lfZGV2ICAgICAgICAgICAgICAqcGNpX2RldiwKKyAgICBJTiAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgICplbnQpCit7CisgICAgSU5UIHJjOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBydDI4NjBfaW5pdF9vbmVcbiIpKTsKKworICAgIC8vIHdha2UgdXAgYW5kIGVuYWJsZSBkZXZpY2UKKyAgICBpZiAocGNpX2VuYWJsZV9kZXZpY2UgKHBjaV9kZXYpKQorICAgIHsKKyAgICAgICAgcmMgPSAtRUlPOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByYyA9IHJ0Mjg2MF9wcm9iZShwY2lfZGV2LCBlbnQpOworICAgIH0KKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gcnQyODYwX2luaXRfb25lXG4iKSk7CisgICAgcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyBWT0lEIF9fZGV2ZXhpdCBydDI4NjBfcmVtb3ZlX29uZSgKKyAgICBJTiAgc3RydWN0IHBjaV9kZXYgICpwY2lfZGV2KQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICAgKm5ldF9kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CisgICAgUlRNUF9BREFQVEVSICAgICAgICAqcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnQyODYwX3JlbW92ZV9vbmVcbiIpKTsKKworCWlmIChwQWQgIT0gTlVMTCkKKwl7CisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisJCWlmICgocEFkLT5NQ19Sb3dJRCA+PSAwKSAmJiAocEFkLT5NQ19Sb3dJRCA8PSBNQVhfTlVNX09GX01VTFRJUExFX0NBUkQpKQorCQkJTUNfQ2FyZFVzZWRbcEFkLT5NQ19Sb3dJRF0gPSAwOyAvLyBub3QgY2xlYXIgTUFDIGFkZHJlc3MKKyNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KKworCisKKworCQkvLyBVbnJlZ2lzdGVyIG5ldHdvcmsgZGV2aWNlCisJCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldF9kZXYpOworCisJCS8vIFVubWFwIENTUiBiYXNlIGFkZHJlc3MKKwkJaW91bm1hcCgoY2hhciAqKShuZXRfZGV2LT5iYXNlX2FkZHIpKTsKKworCQlSVE1QRnJlZUFkYXB0ZXIocEFkKTsKKworCQkvLyByZWxlYXNlIG1lbW9yeSByZWdpb24KKwkJcmVsZWFzZV9tZW1fcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2LCAwKSwgcGNpX3Jlc291cmNlX2xlbihwY2lfZGV2LCAwKSk7CisJfQorCWVsc2UKKwl7CisJCS8vIFVucmVnaXN0ZXIgbmV0d29yayBkZXZpY2UKKwkJdW5yZWdpc3Rlcl9uZXRkZXYobmV0X2Rldik7CisKKwkJLy8gVW5tYXAgQ1NSIGJhc2UgYWRkcmVzcworCQlpb3VubWFwKChjaGFyICopKG5ldF9kZXYtPmJhc2VfYWRkcikpOworCisJCS8vIHJlbGVhc2UgbWVtb3J5IHJlZ2lvbgorCQlyZWxlYXNlX21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApLCBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXYsIDApKTsKKwl9CisKKwkvLyBGcmVlIHByZS1hbGxvY2F0ZWQgbmV0X2RldmljZSBtZW1vcnkKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJZnJlZV9uZXRkZXYobmV0X2Rldik7CisjZWxzZQorCWtmcmVlKG5ldF9kZXYpOworI2VuZGlmCit9CisKKy8vCisvLyBQQ0kgZGV2aWNlIHByb2JlICYgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KKy8vCitzdGF0aWMgSU5UIF9fZGV2aW5pdCAgIHJ0Mjg2MF9wcm9iZSgKKyAgICBJTiAgc3RydWN0IHBjaV9kZXYgICAgICAgICAgICAgICpwY2lfZGV2LAorICAgIElOICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAgKmVudCkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZDsKKyAgICBJTlQgcnYgPSAwOworCisgICAgcnYgPSAoSU5UKXJ0Mjh4eF9wcm9iZSgodm9pZCAqKXBjaV9kZXYsICh2b2lkICopZW50LCAwLCAmcEFkKTsKKwlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpOworCXJldHVybiBydjsKK30KKworCit2b2lkIGluaXRfdGhyZWFkX3Rhc2soSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJUE9TX0NPT0tJRSBwT2JqOworCisJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKworCXRhc2tsZXRfaW5pdCgmcE9iai0+cnhfZG9uZV90YXNrLCByeF9kb25lX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7CisJdGFza2xldF9pbml0KCZwT2JqLT5tZ210X2RtYV9kb25lX3Rhc2ssIG1nbXRfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPmFjMF9kbWFfZG9uZV90YXNrLCBhYzBfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPmFjMV9kbWFfZG9uZV90YXNrLCBhYzFfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPmFjMl9kbWFfZG9uZV90YXNrLCBhYzJfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPmFjM19kbWFfZG9uZV90YXNrLCBhYzNfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPmhjY2FfZG1hX2RvbmVfdGFzaywgaGNjYV9kbWFfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOworCXRhc2tsZXRfaW5pdCgmcE9iai0+dGJ0dF90YXNrLCB0YnR0X3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7CisJdGFza2xldF9pbml0KCZwT2JqLT5maWZvX3N0YXRpc3RpY19mdWxsX3Rhc2ssIGZpZm9fc3RhdGlzdGljX2Z1bGxfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKK30KKwordm9pZCBraWxsX3RocmVhZF90YXNrKElOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVBPU19DT09LSUUgcE9iajsKKworCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwl0YXNrbGV0X2tpbGwoJnBPYmotPnJ4X2RvbmVfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT5tZ210X2RtYV9kb25lX3Rhc2spOworCXRhc2tsZXRfa2lsbCgmcE9iai0+YWMwX2RtYV9kb25lX3Rhc2spOworCXRhc2tsZXRfa2lsbCgmcE9iai0+YWMxX2RtYV9kb25lX3Rhc2spOworCXRhc2tsZXRfa2lsbCgmcE9iai0+YWMyX2RtYV9kb25lX3Rhc2spOworCXRhc2tsZXRfa2lsbCgmcE9iai0+YWMzX2RtYV9kb25lX3Rhc2spOworCXRhc2tsZXRfa2lsbCgmcE9iai0+aGNjYV9kbWFfZG9uZV90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJnBPYmotPnRidHRfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT5maWZvX3N0YXRpc3RpY19mdWxsX3Rhc2spOworfQorCisKK3N0YXRpYyB2b2lkIHJ0Mjg2MF9pbnRfZW5hYmxlKFBSVE1QX0FEQVBURVIgcEFkLCB1bnNpZ25lZCBpbnQgbW9kZSkKK3sKKwl1MzIgcmVnVmFsdWU7CisKKwlwQWQtPmludF9kaXNhYmxlX21hc2sgJj0gfihtb2RlKTsKKwlyZWdWYWx1ZSA9IHBBZC0+aW50X2VuYWJsZV9yZWcgJiB+KHBBZC0+aW50X2Rpc2FibGVfbWFzayk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgSU5UX01BU0tfQ1NSLCByZWdWYWx1ZSk7ICAgICAvLyAxOmVuYWJsZQorCisJaWYgKHJlZ1ZhbHVlICE9IDApCisJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9BQ1RJVkUpOworfQorCisKK3N0YXRpYyB2b2lkIHJ0Mjg2MF9pbnRfZGlzYWJsZShQUlRNUF9BREFQVEVSIHBBZCwgdW5zaWduZWQgaW50IG1vZGUpCit7CisJdTMyIHJlZ1ZhbHVlOworCisJcEFkLT5pbnRfZGlzYWJsZV9tYXNrIHw9IG1vZGU7CisJcmVnVmFsdWUgPSAJcEFkLT5pbnRfZW5hYmxlX3JlZyAmIH4ocEFkLT5pbnRfZGlzYWJsZV9tYXNrKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBJTlRfTUFTS19DU1IsIHJlZ1ZhbHVlKTsgICAgIC8vIDA6IGRpc2FibGUKKworCWlmIChyZWdWYWx1ZSA9PSAwKQorCXsKKwkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfQUNUSVZFKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG1nbXRfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkYXRhOworICAgIElOVF9TT1VSQ0VfQ1NSX1NUUlVDCUludFNvdXJjZTsKKwlQT1NfQ09PS0lFIHBPYmo7CisKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQlyZXR1cm47CisKKyAgICBwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisJSW50U291cmNlLndvcmQgPSAwOworCUludFNvdXJjZS5maWVsZC5NZ210RG1hRG9uZSA9IDE7CisJcEFkLT5pbnRfcGVuZGluZyAmPSB+SU5UX01HTVRfRExZOworCisJUlRNUEhhbmRsZU1nbXRSaW5nRG1hRG9uZUludGVycnVwdChwQWQpOworCisJLy8gaWYgeW91IHVzZSBSVE1QX1NFTV9MT0NLLCBzb21ldGltZXMga2VybmVsIHdpbGwgaGFuZyB1cCwgbm8gYW55CisJLy8gYnVnIHJlcG9ydCBvdXRwdXQKKwlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgbG9zZSBvZiBpbnRlcnJ1cHRzCisJICovCisJaWYgKHBBZC0+aW50X3BlbmRpbmcgJiBJTlRfTUdNVF9ETFkpCisJeworCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5tZ210X2RtYV9kb25lX3Rhc2spOworCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGVuYWJsZSBUeERhdGFJbnQgYWdhaW4gKi8KKwlydDI4NjBfaW50X2VuYWJsZShwQWQsIElOVF9NR01UX0RMWSk7CisJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHJ4X2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkYXRhOworCUJPT0xFQU4JYlJlc2NoZWR1bGUgPSAwOworCVBPU19DT09LSUUgcE9iajsKKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCXJldHVybjsKKworICAgIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwlwQWQtPmludF9wZW5kaW5nICY9IH4oSU5UX1JYKTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQliUmVzY2hlZHVsZSA9IFNUQVJ4RG9uZUludGVycnVwdEhhbmRsZShwQWQsIDApOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJUlRNUF9JTlRfTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCS8qCisJICogZG91YmxlIGNoZWNrIHRvIGF2b2lkIHJvdHRpbmcgcGFja2V0CisJICovCisJaWYgKHBBZC0+aW50X3BlbmRpbmcgJiBJTlRfUlggfHwgYlJlc2NoZWR1bGUpCisJeworCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5yeF9kb25lX3Rhc2spOworCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGVuYWJsZSBSeElOVCBhZ2FpbiAqLworCXJ0Mjg2MF9pbnRfZW5hYmxlKHBBZCwgSU5UX1JYKTsKKwlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKKworfQorCit2b2lkIGZpZm9fc3RhdGlzdGljX2Z1bGxfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkYXRhOworCVBPU19DT09LSUUgcE9iajsKKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCXJldHVybjsKKworICAgIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwlwQWQtPmludF9wZW5kaW5nICY9IH4oRmlmb1N0YUZ1bGxJbnQpOworCU5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycyhwQWQpOworCisJUlRNUF9JTlRfTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCS8qCisJICogZG91YmxlIGNoZWNrIHRvIGF2b2lkIHJvdHRpbmcgcGFja2V0CisJICovCisJaWYgKHBBZC0+aW50X3BlbmRpbmcgJiBGaWZvU3RhRnVsbEludCkKKwl7CisJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmZpZm9fc3RhdGlzdGljX2Z1bGxfdGFzayk7CisJCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyogZW5hYmxlIFJ4SU5UIGFnYWluICovCisKKwlydDI4NjBfaW50X2VuYWJsZShwQWQsIEZpZm9TdGFGdWxsSW50KTsKKwlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKKworfQorCitzdGF0aWMgdm9pZCBoY2NhX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJUFJUTVBfQURBUFRFUiBwQWQgPSAoUFJUTVBfQURBUFRFUikgZGF0YTsKKyAgICBJTlRfU09VUkNFX0NTUl9TVFJVQwlJbnRTb3VyY2U7CisJUE9TX0NPT0tJRSBwT2JqOworCisJLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCisJLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0CisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkJcmV0dXJuOworCisgICAgcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKworCisJSW50U291cmNlLndvcmQgPSAwOworCUludFNvdXJjZS5maWVsZC5IY2NhRG1hRG9uZSA9IDE7CisJcEFkLT5pbnRfcGVuZGluZyAmPSB+SU5UX0hDQ0FfRExZOworCisJUlRNUEhhbmRsZVR4UmluZ0RtYURvbmVJbnRlcnJ1cHQocEFkLCBJbnRTb3VyY2UpOworCisJUlRNUF9JTlRfTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCS8qCisJICogZG91YmxlIGNoZWNrIHRvIGF2b2lkIGxvc2Ugb2YgaW50ZXJydXB0cworCSAqLworCWlmIChwQWQtPmludF9wZW5kaW5nICYgSU5UX0hDQ0FfRExZKQorCXsKKwkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+aGNjYV9kbWFfZG9uZV90YXNrKTsKKwkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBlbmFibGUgVHhEYXRhSW50IGFnYWluICovCisJcnQyODYwX2ludF9lbmFibGUocEFkLCBJTlRfSENDQV9ETFkpOworCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBhYzNfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkYXRhOworICAgIElOVF9TT1VSQ0VfQ1NSX1NUUlVDCUludFNvdXJjZTsKKwlQT1NfQ09PS0lFIHBPYmo7CisJQk9PTEVBTiBiUmVzY2hlZHVsZSA9IDA7CisKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQlyZXR1cm47CisKKyAgICBwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisJSW50U291cmNlLndvcmQgPSAwOworCUludFNvdXJjZS5maWVsZC5BYzNEbWFEb25lID0gMTsKKwlwQWQtPmludF9wZW5kaW5nICY9IH5JTlRfQUMzX0RMWTsKKworCWJSZXNjaGVkdWxlID0gUlRNUEhhbmRsZVR4UmluZ0RtYURvbmVJbnRlcnJ1cHQocEFkLCBJbnRTb3VyY2UpOworCisJUlRNUF9JTlRfTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCS8qCisJICogZG91YmxlIGNoZWNrIHRvIGF2b2lkIGxvc2Ugb2YgaW50ZXJydXB0cworCSAqLworCWlmICgocEFkLT5pbnRfcGVuZGluZyAmIElOVF9BQzNfRExZKSB8fCBiUmVzY2hlZHVsZSkKKwl7CisJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjM19kbWFfZG9uZV90YXNrKTsKKwkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBlbmFibGUgVHhEYXRhSW50IGFnYWluICovCisJcnQyODYwX2ludF9lbmFibGUocEFkLCBJTlRfQUMzX0RMWSk7CisJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGFjMl9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRhdGE7CisgICAgSU5UX1NPVVJDRV9DU1JfU1RSVUMJSW50U291cmNlOworCVBPU19DT09LSUUgcE9iajsKKwlCT09MRUFOIGJSZXNjaGVkdWxlID0gMDsKKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCXJldHVybjsKKworICAgIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwlJbnRTb3VyY2Uud29yZCA9IDA7CisJSW50U291cmNlLmZpZWxkLkFjMkRtYURvbmUgPSAxOworCXBBZC0+aW50X3BlbmRpbmcgJj0gfklOVF9BQzJfRExZOworCisJYlJlc2NoZWR1bGUgPSBSVE1QSGFuZGxlVHhSaW5nRG1hRG9uZUludGVycnVwdChwQWQsIEludFNvdXJjZSk7CisKKwlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIGRvdWJsZSBjaGVjayB0byBhdm9pZCBsb3NlIG9mIGludGVycnVwdHMKKwkgKi8KKwlpZiAoKHBBZC0+aW50X3BlbmRpbmcgJiBJTlRfQUMyX0RMWSkgfHwgYlJlc2NoZWR1bGUpCisJeworCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzJfZG1hX2RvbmVfdGFzayk7CisJCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyogZW5hYmxlIFR4RGF0YUludCBhZ2FpbiAqLworCXJ0Mjg2MF9pbnRfZW5hYmxlKHBBZCwgSU5UX0FDMl9ETFkpOworCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBhYzFfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkYXRhOworICAgIElOVF9TT1VSQ0VfQ1NSX1NUUlVDCUludFNvdXJjZTsKKwlQT1NfQ09PS0lFIHBPYmo7CisJQk9PTEVBTiBiUmVzY2hlZHVsZSA9IDA7CisKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQlyZXR1cm47CisKKyAgICBwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisJSW50U291cmNlLndvcmQgPSAwOworCUludFNvdXJjZS5maWVsZC5BYzFEbWFEb25lID0gMTsKKwlwQWQtPmludF9wZW5kaW5nICY9IH5JTlRfQUMxX0RMWTsKKworCWJSZXNjaGVkdWxlID0gUlRNUEhhbmRsZVR4UmluZ0RtYURvbmVJbnRlcnJ1cHQocEFkLCBJbnRTb3VyY2UpOworCisJUlRNUF9JTlRfTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCS8qCisJICogZG91YmxlIGNoZWNrIHRvIGF2b2lkIGxvc2Ugb2YgaW50ZXJydXB0cworCSAqLworCWlmICgocEFkLT5pbnRfcGVuZGluZyAmIElOVF9BQzFfRExZKSB8fCBiUmVzY2hlZHVsZSkKKwl7CisJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMV9kbWFfZG9uZV90YXNrKTsKKwkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBlbmFibGUgVHhEYXRhSW50IGFnYWluICovCisJcnQyODYwX2ludF9lbmFibGUocEFkLCBJTlRfQUMxX0RMWSk7CisJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGFjMF9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRhdGE7CisgICAgSU5UX1NPVVJDRV9DU1JfU1RSVUMJSW50U291cmNlOworCVBPU19DT09LSUUgcE9iajsKKwlCT09MRUFOIGJSZXNjaGVkdWxlID0gMDsKKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCXJldHVybjsKKworICAgIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwlJbnRTb3VyY2Uud29yZCA9IDA7CisJSW50U291cmNlLmZpZWxkLkFjMERtYURvbmUgPSAxOworCXBBZC0+aW50X3BlbmRpbmcgJj0gfklOVF9BQzBfRExZOworCisJYlJlc2NoZWR1bGUgPSBSVE1QSGFuZGxlVHhSaW5nRG1hRG9uZUludGVycnVwdChwQWQsIEludFNvdXJjZSk7CisKKwlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgbG9zZSBvZiBpbnRlcnJ1cHRzCisJICovCisJaWYgKChwQWQtPmludF9wZW5kaW5nICYgSU5UX0FDMF9ETFkpIHx8IGJSZXNjaGVkdWxlKQorCXsKKwkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMwX2RtYV9kb25lX3Rhc2spOworCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGVuYWJsZSBUeERhdGFJbnQgYWdhaW4gKi8KKwlydDI4NjBfaW50X2VuYWJsZShwQWQsIElOVF9BQzBfRExZKTsKKwlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKK30KKworCitpbnQgcHJpbnRfaW50X2NvdW50OworCitJUlFfSEFORExFX1RZUEUKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwxOSkpCitydDI4NjBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSkKKyNlbHNlCitydDI4NjBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCisjZW5kaWYKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaW5zdGFuY2U7CisJUFJUTVBfQURBUFRFUiBwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCUlOVF9TT1VSQ0VfQ1NSX1NUUlVDCUludFNvdXJjZTsKKwlQT1NfQ09PS0lFIHBPYmo7CisKKwlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisKKwkvKiBOb3RlIDAzMzEyMDA4OiB3ZSBjYW4gbm90IHJldHVybiBoZXJlIGJlZm9yZQorCQlSVE1QX0lPX1JFQUQzMihwQWQsIElOVF9TT1VSQ0VfQ1NSLCAmSW50U291cmNlLndvcmQpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBJTlRfU09VUkNFX0NTUiwgSW50U291cmNlLndvcmQpOworCQlPciBrZXJuZWwgd2lsbCBwYW5pYyBhZnRlciBpZmNvbmZpZyByYTAgZG93biBzb21ldGltZXMgKi8KKworCisJLy8KKwkvLyBJbml0YWwgdGhlIEludGVycnVwdCBzb3VyY2UuCisJLy8KKwlJbnRTb3VyY2Uud29yZCA9IDB4MDAwMDAwMDBMOworLy8JTWN1SW50U291cmNlLndvcmQgPSAweDAwMDAwMDAwTDsKKworCS8vCisJLy8gR2V0IHRoZSBpbnRlcnJ1cHQgc291cmNlcyAmIHNhdmVkIHRvIGxvY2FsIHZhcmlhYmxlCisJLy8KKwkvL1JUTVBfSU9fUkVBRDMyKHBBZCwgd2hlcmUsICZNY3VJbnRTb3VyY2Uud29yZCk7CisJLy9SVE1QX0lPX1dSSVRFMzIocEFkLCAsIE1jdUludFNvdXJjZS53b3JkKTsKKworCS8vCisJLy8gRmxhZyBmT1BfU1RBVFVTX0RPWkUgT24sIG1lYW5zIEFTSUMgcHV0IHRvIHNsZWVwLCBlbGFzZSBtZWFucyBBU0lDSyBXYWtlVXAKKwkvLyBBbmQgYXQgdGhlIHNhbWUgdGltZSwgY2xvY2sgbWF5YmUgdHVybmVkIG9mZiB0aGF0IHNheSB0aGVyZSBpcyBubyBETUEgc2VydmljZS4KKwkvLyB3aGVuIEFTSUMgZ2V0IHRvIHNsZWVwLgorCS8vIFRvIHByZXZlbnQgc3lzdGVtIGhhbmcgb24gcG93ZXIgc2F2aW5nLgorCS8vIFdlIG5lZWQgdG8gY2hlY2sgaXQgYmVmb3JlIGhhbmRsZSB0aGUgSU5UX1NPVVJDRV9DU1IsIEFTSUMgbXVzdCBiZSB3YWtlIHVwLgorCS8vCisJLy8gUlQyNjYxID0+IHdoZW4gQVNJQyBpcyBzbGVlcGluZywgTUFDIHJlZ2lzdGVyIGNhbm5vdCBiZSByZWFkIGFuZCB3cml0dGVuLgorCS8vIFJUMjg2MCA9PiB3aGVuIEFTSUMgaXMgc2xlZXBpbmcsIE1BQyByZWdpc3RlciBjYW4gYmUgcmVhZCBhbmQgd3JpdHRlbi4KKworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBJTlRfU09VUkNFX0NTUiwgJkludFNvdXJjZS53b3JkKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgSU5UX1NPVVJDRV9DU1IsIEludFNvdXJjZS53b3JkKTsgLy8gd3JpdGUgMSB0byBjbGVhcgorCX0KKworCS8vIERvIG5vdGhpbmcgaWYgUmVzZXQgaW4gcHJvZ3Jlc3MKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSB8fAorCQlSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpCisJeworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKyAgICAgICAgcmV0dXJuICBJUlFfSEFORExFRDsKKyNlbHNlCisgICAgICAgIHJldHVybjsKKyNlbmRpZgorCX0KKworCS8vCisJLy8gSGFuZGxlIGludGVycnVwdCwgd2FsayB0aHJvdWdoIGFsbCBiaXRzCisJLy8gU2hvdWxkIHN0YXJ0IGZyb20gaGlnaGVzdCBwcmlvcml0eSBpbnRlcnJ1cHQKKwkvLyBUaGUgcHJpb3JpdHkgY2FuIGJlIGFkanVzdCBieSBhbHRlcmluZyBwcm9jZXNzaW5nIGlmIHN0YXRlbWVudAorCS8vCisKKyAgICBwQWQtPmJQQ0ljbGtPZmYgPSBGQUxTRTsKKworCS8vIElmIHJlcXVpcmVkIHNwaW5sb2NrLCBlYWNoIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgaGFzIHRvIGFjcXVpcmUKKwkvLyBhbmQgcmVsZWFzZSBpdHNlbGYuCisJLy8KKworCS8vIERvIG5vdGhpbmcgaWYgTklDIGRvZXNuJ3QgZXhpc3QKKwlpZiAoSW50U291cmNlLndvcmQgPT0gMHhmZmZmZmZmZikKKwl7CisJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QgfCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKyAgICAgICAgcmV0dXJuICBJUlFfSEFORExFRDsKKyNlbHNlCisgICAgICAgIHJldHVybjsKKyNlbmRpZgorCX0KKworCWlmIChJbnRTb3VyY2Uud29yZCAmIFR4Q29oZXJlbnQpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCI+Pj5UeENvaGVyZW50PDw8XG4iKSk7CisJCVJUTVBIYW5kbGVSeENvaGVyZW50SW50ZXJydXB0KHBBZCk7CisJfQorCisJaWYgKEludFNvdXJjZS53b3JkICYgUnhDb2hlcmVudCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIj4+PlJ4Q29oZXJlbnQ8PDxcbiIpKTsKKwkJUlRNUEhhbmRsZVJ4Q29oZXJlbnRJbnRlcnJ1cHQocEFkKTsKKwl9CisKKwlpZiAoSW50U291cmNlLndvcmQgJiBGaWZvU3RhRnVsbEludCkKKwl7CisjaWYgMQorCQlpZiAoKHBBZC0+aW50X2Rpc2FibGVfbWFzayAmIEZpZm9TdGFGdWxsSW50KSA9PSAwKQorCQl7CisJCQkvKiBtYXNrIEZpZm9TdGFGdWxsSW50ICovCisJCQlydDI4NjBfaW50X2Rpc2FibGUocEFkLCBGaWZvU3RhRnVsbEludCk7CisJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5maWZvX3N0YXRpc3RpY19mdWxsX3Rhc2spOworCQl9CisJCXBBZC0+aW50X3BlbmRpbmcgfD0gRmlmb1N0YUZ1bGxJbnQ7CisjZWxzZQorCQlOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMocEFkKTsKKyNlbmRpZgorCX0KKworCWlmIChJbnRTb3VyY2Uud29yZCAmIElOVF9NR01UX0RMWSkKKwl7CisJCWlmICgocEFkLT5pbnRfZGlzYWJsZV9tYXNrICYgSU5UX01HTVRfRExZKSA9PTAgKQorCQl7CisJCQlydDI4NjBfaW50X2Rpc2FibGUocEFkLCBJTlRfTUdNVF9ETFkpOworCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+bWdtdF9kbWFfZG9uZV90YXNrKTsKKwkJfQorCQlwQWQtPmludF9wZW5kaW5nIHw9IElOVF9NR01UX0RMWSA7CisJfQorCisJaWYgKEludFNvdXJjZS53b3JkICYgSU5UX1JYKQorCXsKKwkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBJTlRfUlgpID09IDApCisJCXsKKwkJCS8qIG1hc2sgUnhJTlQgKi8KKwkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIElOVF9SWCk7CisJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5yeF9kb25lX3Rhc2spOworCQl9CisJCXBBZC0+aW50X3BlbmRpbmcgfD0gSU5UX1JYOworCX0KKworCWlmIChJbnRTb3VyY2Uud29yZCAmIElOVF9IQ0NBX0RMWSkKKwl7CisKKwkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBJTlRfSENDQV9ETFkpID09IDApCisJCXsKKwkJCS8qIG1hc2sgVHhEYXRhSW50ICovCisJCQlydDI4NjBfaW50X2Rpc2FibGUocEFkLCBJTlRfSENDQV9ETFkpOworCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+aGNjYV9kbWFfZG9uZV90YXNrKTsKKwkJfQorCQlwQWQtPmludF9wZW5kaW5nIHw9IElOVF9IQ0NBX0RMWTsKKwl9CisKKwlpZiAoSW50U291cmNlLndvcmQgJiBJTlRfQUMzX0RMWSkKKwl7CisKKwkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBJTlRfQUMzX0RMWSkgPT0gMCkKKwkJeworCQkJLyogbWFzayBUeERhdGFJbnQgKi8KKwkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIElOVF9BQzNfRExZKTsKKwkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjM19kbWFfZG9uZV90YXNrKTsKKwkJfQorCQlwQWQtPmludF9wZW5kaW5nIHw9IElOVF9BQzNfRExZOworCX0KKworCWlmIChJbnRTb3VyY2Uud29yZCAmIElOVF9BQzJfRExZKQorCXsKKworCQlpZiAoKHBBZC0+aW50X2Rpc2FibGVfbWFzayAmIElOVF9BQzJfRExZKSA9PSAwKQorCQl7CisJCQkvKiBtYXNrIFR4RGF0YUludCAqLworCQkJcnQyODYwX2ludF9kaXNhYmxlKHBBZCwgSU5UX0FDMl9ETFkpOworCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMyX2RtYV9kb25lX3Rhc2spOworCQl9CisJCXBBZC0+aW50X3BlbmRpbmcgfD0gSU5UX0FDMl9ETFk7CisJfQorCisJaWYgKEludFNvdXJjZS53b3JkICYgSU5UX0FDMV9ETFkpCisJeworCisJCXBBZC0+aW50X3BlbmRpbmcgfD0gSU5UX0FDMV9ETFk7CisKKwkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBJTlRfQUMxX0RMWSkgPT0gMCkKKwkJeworCQkJLyogbWFzayBUeERhdGFJbnQgKi8KKwkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIElOVF9BQzFfRExZKTsKKwkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMV9kbWFfZG9uZV90YXNrKTsKKwkJfQorCisJfQorCisJaWYgKEludFNvdXJjZS53b3JkICYgSU5UX0FDMF9ETFkpCisJeworCQlwQWQtPmludF9wZW5kaW5nIHw9IElOVF9BQzBfRExZOworCisJCWlmICgocEFkLT5pbnRfZGlzYWJsZV9tYXNrICYgSU5UX0FDMF9ETFkpID09IDApCisJCXsKKwkJCS8qIG1hc2sgVHhEYXRhSW50ICovCisJCQlydDI4NjBfaW50X2Rpc2FibGUocEFkLCBJTlRfQUMwX0RMWSk7CisJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzBfZG1hX2RvbmVfdGFzayk7CisJCX0KKworCX0KKworICAgIGlmIChJbnRTb3VyY2Uud29yZCAmIFByZVRCVFRJbnQpCisJeworCQlSVE1QSGFuZGxlUHJlVEJUVEludGVycnVwdChwQWQpOworCX0KKworCWlmIChJbnRTb3VyY2Uud29yZCAmIFRCVFRJbnQpCisJeworCQlSVE1QSGFuZGxlVEJUVEludGVycnVwdChwQWQpOworCX0KKworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJaWYgKEludFNvdXJjZS53b3JkICYgQXV0b1dha2V1cEludCkKKwkJCVJUTVBIYW5kbGVUd2FrZXVwSW50ZXJydXB0KHBBZCk7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorICAgIHJldHVybiAgSVJRX0hBTkRMRUQ7CisjZW5kaWYKKworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIENoZWNrIHRoZSBjaGlwc2V0IHZlbmRvci9wcm9kdWN0IElELgorCitBcmd1bWVudHM6CisgICAgX2Rldl9wCQkJCVBvaW50IHRvIHRoZSBQQ0kgb3IgVVNCIGRldmljZQorCitSZXR1cm4gVmFsdWU6CisgICAgVFJVRQkJCQlDaGVjayBvaworCUZBTFNFCQkJCUNoZWNrIGZhaWwKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gUlQyOFhYQ2hpcHNldENoZWNrKAorCUlOIHZvaWQgKl9kZXZfcCkKK3sKKwkvKiBhbHdheXMgVFJVRSAqLworCXJldHVybiBUUlVFOworfQorCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgSW5pdCBuZXQgZGV2aWNlIHN0cnVjdHVyZS4KKworQXJndW1lbnRzOgorICAgIF9kZXZfcAkJCQlQb2ludCB0byB0aGUgUENJIG9yIFVTQiBkZXZpY2UKKyAgICAqbmV0X2RldgkJCVBvaW50IHRvIHRoZSBuZXQgZGV2aWNlCisJKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKyAgICBUUlVFCQkJCUluaXQgb2sKKwlGQUxTRQkJCQlJbml0IGZhaWwKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gUlQyOFhYTmV0RGV2SW5pdCgKKwlJTiB2b2lkIAkJCQkqX2Rldl9wLAorCUlOIHN0cnVjdCAgbmV0X2RldmljZQkqbmV0X2RldiwKKwlJTiBSVE1QX0FEQVBURVIgCQkqcEFkKQoreworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gKHN0cnVjdCBwY2lfZGV2ICopX2Rldl9wOworICAgIGNvbnN0IENIQVIJKnByaW50X25hbWU7CisgICAgVUxPTkcJY3NyX2FkZHI7CisKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKyAgICBwcmludF9uYW1lID0gcGNpX2RldiA/IHBjaV9uYW1lKHBjaV9kZXYpIDogInJ0Mjg2MCI7CisjZWxzZQorICAgIHByaW50X25hbWUgPSBwY2lfZGV2ID8gcGNpX2Rldi0+c2xvdF9uYW1lIDogInJ0Mjg2MCI7CisjZW5kaWYgLy8gTElOVVhfVkVSU0lPTl9DT0RFIC8vCisKKwluZXRfZGV2LT5iYXNlX2FkZHIgPSAwOworCW5ldF9kZXYtPmlycSA9IDA7CisKKyAgICBpZiAocGNpX3JlcXVlc3RfcmVnaW9ucyhwY2lfZGV2LCBwcmludF9uYW1lKSkKKyAgICAgICAgZ290byBlcnJfb3V0X2ZyZWVfbmV0ZGV2OworCisgICAgLy8gaW50ZXJydXB0IElSUSBudW1iZXIKKyAgICBuZXRfZGV2LT5pcnEgPSBwY2lfZGV2LT5pcnE7CisKKyAgICAvLyBtYXAgcGh5c2ljYWwgYWRkcmVzcyB0byB2aXJ0dWFsIGFkZHJlc3MgZm9yIGFjY2Vzc2luZyByZWdpc3RlcgorICAgIGNzcl9hZGRyID0gKHVuc2lnbmVkIGxvbmcpIGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApLAorCQkJCQkJCQkJCXBjaV9yZXNvdXJjZV9sZW4ocGNpX2RldiwgMCkpOworCisgICAgaWYgKCFjc3JfYWRkcikKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCSgiaW9yZW1hcCBmYWlsZWQgZm9yIGRldmljZSAlcywgcmVnaW9uIDB4JWxYIEAgMHglbFhcbiIsCisJCQkJcHJpbnRfbmFtZSwgKFVMT05HKXBjaV9yZXNvdXJjZV9sZW4ocGNpX2RldiwgMCksCisJCQkJKFVMT05HKXBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2LCAwKSkpOworICAgICAgICBnb3RvIGVycl9vdXRfZnJlZV9yZXM7CisgICAgfQorCisgICAgLy8gU2F2ZSBDU1IgdmlydHVhbCBhZGRyZXNzIGFuZCBpcnEgdG8gZGV2aWNlIHN0cnVjdHVyZQorICAgIG5ldF9kZXYtPmJhc2VfYWRkciA9IGNzcl9hZGRyOworICAgIHBBZC0+Q1NSQmFzZUFkZHJlc3MgPSAoUFVDSEFSKW5ldF9kZXYtPmJhc2VfYWRkcjsKKworICAgIC8vIFNldCBETUEgbWFzdGVyCisgICAgcGNpX3NldF9tYXN0ZXIocGNpX2Rldik7CisKKyAgICBuZXRfZGV2LT5wcml2X2ZsYWdzID0gSU5UX01BSU47CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczogYXQgMHglbHgsIFZBIDB4JWx4LCBJUlEgJWQuIFxuIiwKKyAgICAgICAgCW5ldF9kZXYtPm5hbWUsIChVTE9ORylwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMCksCisJCQkoVUxPTkcpY3NyX2FkZHIsIHBjaV9kZXYtPmlycSkpOworCXJldHVybiBUUlVFOworCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRVJST1IgSEFORExFIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworZXJyX291dF9mcmVlX3JlczoKKyAgICBwY2lfcmVsZWFzZV9yZWdpb25zKHBjaV9kZXYpOworZXJyX291dF9mcmVlX25ldGRldjoKKwkvKiBmcmVlIG5ldGRldiBpbiBjYWxsZXIsIG5vdCBoZXJlICovCisJcmV0dXJuIEZBTFNFOworfQorCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgSW5pdCBuZXQgZGV2aWNlIHN0cnVjdHVyZS4KKworQXJndW1lbnRzOgorICAgIF9kZXZfcAkJCQlQb2ludCB0byB0aGUgUENJIG9yIFVTQiBkZXZpY2UKKwkqcEFkCQkJCXRoZSByYXh4IGludGVyZmFjZSBkYXRhIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorICAgIFRSVUUJCQkJQ29uZmlnIG9rCisJRkFMU0UJCQkJQ29uZmlnIGZhaWwKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gUlQyOFhYUHJvYmVQb3N0Q29uZmlnKAorCUlOIHZvaWQgCQkJCSpfZGV2X3AsCisJSU4gUlRNUF9BREFQVEVSIAkJKnBBZCwKKwlJTiBJTlQzMgkJCQlhcmdjKQoreworCS8qIG5vIHVzZSAqLworCXJldHVybiBUUlVFOworfQorCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgRGlzYWJsZSBETUEuCisKK0FyZ3VtZW50czoKKwkqcEFkCQkJCXRoZSByYXh4IGludGVyZmFjZSBkYXRhIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorCU5vbmUKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlQyOFhYRE1BRGlzYWJsZSgKKwlJTiBSVE1QX0FEQVBURVIgCQkqcEFkKQoreworCVdQRE1BX0dMT19DRkdfU1RSVUMgICAgIEdsb0NmZzsKKworCisJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOworCUdsb0NmZy53b3JkICY9IDB4ZmYwOworCUdsb0NmZy5maWVsZC5FblRYV3JpdGVCYWNrRERPTkUgPTE7CisJUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfR0xPX0NGRywgR2xvQ2ZnLndvcmQpOworfQorCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgRW5hYmxlIERNQS4KKworQXJndW1lbnRzOgorCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisJTm9uZQorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVDI4WFhETUFFbmFibGUoCisJSU4gUlRNUF9BREFQVEVSIAkJKnBBZCkKK3sKKwlXUERNQV9HTE9fQ0ZHX1NUUlVDCUdsb0NmZzsKKwlpbnQgaSA9IDA7CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4NCk7CisJZG8KKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsKKwkJaWYgKChHbG9DZmcuZmllbGQuVHhETUFCdXN5ID09IDApICAmJiAoR2xvQ2ZnLmZpZWxkLlJ4RE1BQnVzeSA9PSAwKSkKKwkJCWJyZWFrOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiAgRE1BQnVzeVxuIikpOworCQlSVE1QdXNlY0RlbGF5KDEwMDApOworCQlpKys7CisJfXdoaWxlICggaSA8MjAwKTsKKworCVJUTVB1c2VjRGVsYXkoNTApOworCisJR2xvQ2ZnLmZpZWxkLkVuVFhXcml0ZUJhY2tERE9ORSA9IDE7CisJR2xvQ2ZnLmZpZWxkLldQRE1BQnVyc3RTSVpFID0gMjsKKwlHbG9DZmcuZmllbGQuRW5hYmxlUnhETUEgPSAxOworCUdsb0NmZy5maWVsZC5FbmFibGVUeERNQSA9IDE7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gV1JJVEUgRE1BIG9mZnNldCAweDIwOCA9IDB4JXhcbiIsIEdsb0NmZy53b3JkKSk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfR0xPX0NGRywgR2xvQ2ZnLndvcmQpOworCit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgV3JpdGUgQmVhY29uIGJ1ZmZlciB0byBBc2ljLgorCitBcmd1bWVudHM6CisJKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKwlOb25lCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUMjh4eF9VcGRhdGVCZWFjb25Ub0FzaWMoCisJSU4gUlRNUF9BREFQVEVSCQkqcEFkLAorCUlOIElOVAkJCQlhcGlkeCwKKwlJTiBVTE9ORwkJCUZyYW1lTGVuLAorCUlOIFVMT05HCQkJVXBkYXRlUG9zKQoreworCVVMT05HCQkJCUNhcEluZm9Qb3MgPSAwOworCVVDSEFSICAJCQkqcHRyLCAqcHRyX3VwZGF0ZSwgKnB0cl9jYXBpbmZvOworCVVJTlQgIAkJCWk7CisJQk9PTEVBTgkJCWJCY25SZXEgPSBGQUxTRTsKKwlVQ0hBUgkJCWJjbl9pZHggPSAwOworCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcygpIDogTm8gdmFsaWQgSW50ZXJmYWNlIGJlIGZvdW5kLlxuIiwgX19mdW5jX18pKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChiQmNuUmVxID09IEZBTFNFKQorCXsKKwkJLyogd2hlbiB0aGUgcmEgaW50ZXJmYWNlIGlzIGRvd24sIGRvIG5vdCBzZW5kIGl0cyBiZWFjb24gZnJhbWUgKi8KKwkJLyogY2xlYXIgYWxsIHplcm8gKi8KKwkJZm9yKGk9MDsgaTxUWFdJX1NJWkU7IGkrPTQpCisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBwQWQtPkJlYWNvbk9mZnNldFtiY25faWR4XSArIGksIDB4MDApOworCX0KKwllbHNlCisJeworCQlwdHIgPSAoUFVDSEFSKSZwQWQtPkJlYWNvblR4V0k7CisjaWZkZWYgUlRfQklHX0VORElBTgorCQlSVE1QV0lFbmRpYW5DaGFuZ2UocHRyLCBUWVBFX1RYV0kpOworI2VuZGlmCisJCWZvciAoaT0wOyBpPFRYV0lfU0laRTsgaSs9NCkgIC8vIDE2LWJ5dGUgVFhXSSBmaWVsZAorCQl7CisJCQlVSU5UMzIgbG9uZ3B0ciA9ICAqcHRyICsgKCoocHRyKzEpPDw4KSArICgqKHB0cisyKTw8MTYpICsgKCoocHRyKzMpPDwyNCk7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBwQWQtPkJlYWNvbk9mZnNldFtiY25faWR4XSArIGksIGxvbmdwdHIpOworCQkJcHRyICs9IDQ7CisJCX0KKworCQkvLyBVcGRhdGUgQ2FwYWJpbGl0eUluZm8gaW4gQmVhY29uCisJCWZvciAoaSA9IENhcEluZm9Qb3M7IGkgPCAoQ2FwSW5mb1BvcysyKTsgaSsrKQorCQl7CisJCQlSVE1QX0lPX1dSSVRFOChwQWQsIHBBZC0+QmVhY29uT2Zmc2V0W2Jjbl9pZHhdICsgVFhXSV9TSVpFICsgaSwgKnB0cl9jYXBpbmZvKTsKKwkJCXB0cl9jYXBpbmZvICsrOworCQl9CisKKwkJaWYgKEZyYW1lTGVuID4gVXBkYXRlUG9zKQorCQl7CisJCQlmb3IgKGk9IFVwZGF0ZVBvczsgaTwgKEZyYW1lTGVuKTsgaSsrKQorCQkJeworCQkJCVJUTVBfSU9fV1JJVEU4KHBBZCwgcEFkLT5CZWFjb25PZmZzZXRbYmNuX2lkeF0gKyBUWFdJX1NJWkUgKyBpLCAqcHRyX3VwZGF0ZSk7CisJCQkJcHRyX3VwZGF0ZSArKzsKKwkJCX0KKwkJfQorCisJfQorCit9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK1ZPSUQgUlRNUEluaXRQQ0llTGlua0N0cmxWYWx1ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKK30KKworVk9JRCBSVE1QRmluZEhvc3RQQ0lEZXYoCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQpCit7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCQlMZXZlbCA9IFJFU1RPUkVfSEFMVCA6IFJlc3RvcmUgUENJIGhvc3QgYW5kIFJhbGluayBQQ0llIExpbmsgQ29udHJvbCBmaWVsZCB0byBpdHMgZGVmYXVsdCB2YWx1ZS4KKwkJTGV2ZWwgPSBPdGhlciBWYWx1ZSA6IFJlc3RvcmUgZnJvbSBkb3QxMSBwb3dlciBzYXZlIG9yIHJhZGlvIG9mZiBzdGF0dXMuIEFuZCBmb3JjZSBQQ0kgaG9zdCBMaW5rIENvbnRyb2wgZmllbGRzIHRvIDB4MQorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICAgVUNIQVIJCUxldmVsKQoreworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKwkJTWF4IDogbGltaXQgSG9zdCBQQ0kgYW5kIFJhbGluayBQQ0llIGRldmljZSdzIExJTksgQ09OVFJPTCBmaWVsZCdzIHZhbHVlLgorCQlCZWNhdXNlIG5vdyBmcmVxdWVudGx5IHNldCBvdXIgZGV2aWNlIHRvIG1vZGUgMSBvciBtb2RlIDMgd2lsbCBjYXVzZSBwcm9ibGVtLgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QUENJZUxpbmtDdHJsU2V0dGluZygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAJVVNIT1JUCQlNYXgpCit7Cit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK1ZPSUQgcnQyODYwX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisgICAgUFJUTVBfQURBUFRFUiBwQWQgPSAoUFJUTVBfQURBUFRFUilOVUxMOworICAgIGlmIChuZXRfZGV2ID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJuZXRfZGV2ID09IE5VTEwhXG4iKSk7CisJfQorCWVsc2UKKwkJcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKworCWlmIChwQWQgIT0gTlVMTCkKKwl7CisJICAgIC8vIHN0b3AgaW50ZXJmYWNlCisJCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldF9kZXYpOworCQluZXRpZl9zdG9wX3F1ZXVlKG5ldF9kZXYpOworCisJCS8vIG1hcmsgZGV2aWNlIGFzIHJlbW92ZWQgZnJvbSBzeXN0ZW0gYW5kIHRoZXJlZm9yZSBubyBsb25nZXIgYXZhaWxhYmxlCisJCW5ldGlmX2RldmljZV9kZXRhY2gobmV0X2Rldik7CisKKwkJLy8gbWFyayBoYWx0IGZsYWcKKwkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7CisJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7CisKKwkJLy8gdGFrZSBkb3duIHRoZSBkZXZpY2UKKwkJcnQyOHh4X2Nsb3NlKChQTkVUX0RFViluZXRfZGV2KTsKKwkJUlRfTU9EX0RFQ19VU0VfQ09VTlQoKTsKKwl9CisgICAgcmV0dXJuOworfQorCisvKgorICogaW52YWlsZCBvciB3cml0ZWJhY2sgY2FjaGUKKyAqIGFuZCBjb252ZXJ0IHZpcnR1YWwgYWRkcmVzcyB0byBwaHlzaWNhbCBhZGRyZXNzCisgKi8KK2RtYV9hZGRyX3QgbGludXhfcGNpX21hcF9zaW5nbGUodm9pZCAqaGFuZGxlLCB2b2lkICpwdHIsIHNpemVfdCBzaXplLCBpbnQgc2RfaWR4LCBpbnQgZGlyZWN0aW9uKQoreworCVBSVE1QX0FEQVBURVIgcEFkOworCVBPU19DT09LSUUgcE9iajsKKworCS8qCisJCS0tLS0tLSBQb3J0aW5nIEluZm9ybWF0aW9uIC0tLS0tLQorCQk+IEZvciBUeCBBbGxvYzoKKwkJCW1nbXQgcGFja2V0cyA9PiBzZF9pZHggPSAwCisJCQlTd0lkeDogcEFkLT5NZ210UmluZy5UeENwdUlkeAorCQkJcFR4RCA6IHBBZC0+TWdtdFJpbmcuQ2VsbFtTd0lkeF0uQWxsb2NWYTsKKworCQkJZGF0YSBwYWNrZXRzID0+IHNkX2lkeCA9IDEKKwkgCQlUeElkeCA6IHBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XS5UeENwdUlkeAorCSAJCVF1ZUlkeDogcFR4QmxrLT5RdWVJZHgKKwkgCQlwVHhEICA6IHBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XS5DZWxsW1R4SWR4XS5BbGxvY1ZhOworCisJIAk+IEZvciBSeCBBbGxvYzoKKwkgCQlzZF9pZHggPSAtMQorCSovCisKKwlwQWQgPSAoUFJUTVBfQURBUFRFUiloYW5kbGU7CisJcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOworCisJaWYgKHNkX2lkeCA9PSAxKQorCXsKKwkJUFRYX0JMSwkJcFR4QmxrOworCQlwVHhCbGsgPSAoUFRYX0JMSylwdHI7CisJCXJldHVybiBwY2lfbWFwX3NpbmdsZShwT2JqLT5wY2lfZGV2LCBwVHhCbGstPnBTcmNCdWZEYXRhLCBwVHhCbGstPlNyY0J1ZkxlbiwgZGlyZWN0aW9uKTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuIHBjaV9tYXBfc2luZ2xlKHBPYmotPnBjaV9kZXYsIHB0ciwgc2l6ZSwgZGlyZWN0aW9uKTsKKwl9CisKK30KKwordm9pZCBsaW51eF9wY2lfdW5tYXBfc2luZ2xlKHZvaWQgKmhhbmRsZSwgZG1hX2FkZHJfdCBkbWFfYWRkciwgc2l6ZV90IHNpemUsIGludCBkaXJlY3Rpb24pCit7CisJUFJUTVBfQURBUFRFUiBwQWQ7CisJUE9TX0NPT0tJRSBwT2JqOworCisJcEFkPShQUlRNUF9BREFQVEVSKWhhbmRsZTsKKwlwT2JqID0gKFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7CisKKwlwY2lfdW5tYXBfc2luZ2xlKHBPYmotPnBjaV9kZXYsIGRtYV9hZGRyLCBzaXplLCBkaXJlY3Rpb24pOworCit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjQ0ZTVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9LY29uZmlnCkBAIC0wLDAgKzEsNSBAQAorY29uZmlnIFJUMjg2MAorCXRyaXN0YXRlICJSYWxpbmsgMjg2MCB3aXJlbGVzcyBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJICYmIFg4NiAmJiBXTEFOXzgwMjExCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhbiBleHBlcmltZW50YWwgZHJpdmVyIGZvciB0aGUgUmFsaW5rIDI4NjAgd2lyZWxlc3MgY2hpcC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNjIyMTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL01ha2VmaWxlCkBAIC0wLDAgKzEsNDMgQEAKK29iai0kKENPTkZJR19SVDI4NjApCSs9IHJ0Mjg2MHN0YS5vCisKKyMgVE9ETzogYWxsIG9mIHRoZXNlIHNob3VsZCBiZSByZW1vdmVkCitFWFRSQV9DRkxBR1MgKz0gLURMSU5VWCAtREFHR1JFR0FUSU9OX1NVUFBPUlQgLURQSUdHWUJBQ0tfU1VQUE9SVCAtRFdNTV9TVVBQT1JUCitFWFRSQV9DRkxBR1MgKz0gLURSVDI4NjAKK0VYVFJBX0NGTEFHUyArPSAtRENPTkZJR19TVEFfU1VQUE9SVAorRVhUUkFfQ0ZMQUdTICs9IC1EREJHCitFWFRSQV9DRkxBR1MgKz0gLURET1QxMV9OX1NVUFBPUlQKK0VYVFJBX0NGTEFHUyArPSAtRFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKK0VYVFJBX0NGTEFHUyArPSAtRE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisKK3J0Mjg2MHN0YS1vYmpzIDo9CVwKKwljb21tb24vbWQ1Lm8JCVwKKwljb21tb24vbWxtZS5vCQlcCisJY29tbW9uL3J0bXBfd2VwLm8JXAorCWNvbW1vbi9hY3Rpb24ubwkJXAorCWNvbW1vbi9jbW1fZGF0YS5vCVwKKwljb21tb24vcnRtcF9pbml0Lm8JXAorCWNvbW1vbi9ydG1wX3RraXAubwlcCisJY29tbW9uL2NtbV9zeW5jLm8JXAorCWNvbW1vbi9lZXByb20ubwkJXAorCWNvbW1vbi9jbW1fc2FuaXR5Lm8JXAorCWNvbW1vbi9jbW1faW5mby5vCVwKKwljb21tb24vY21tX3dwYS5vCVwKKwljb21tb24vZGZzLm8JCVwKKwljb21tb24vc3BlY3RydW0ubwlcCisJc3RhL2Fzc29jLm8JCVwKKwlzdGEvYWlyb25ldC5vCQlcCisJc3RhL2F1dGgubwkJXAorCXN0YS9hdXRoX3JzcC5vCQlcCisJc3RhL3N5bmMubwkJXAorCXN0YS9zYW5pdHkubwkJXAorCXN0YS9ydG1wX2RhdGEubwkJXAorCXN0YS9jb25uZWN0Lm8JCVwKKwlzdGEvd3BhLm8JCVwKKwlydF9saW51eC5vCQlcCisJcnRfcHJvZmlsZS5vCQlcCisJcnRfbWFpbl9kZXYubwkJXAorCXN0YV9pb2N0bC5vCQlcCisJY29tbW9uL2JhX2FjdGlvbi5vCVwKKwljb21tb24vMjg2MF9ydG1wX2luaXQubwlcCisJMjg2MF9tYWluX2Rldi5vCQlcCisJY29tbW9uL2NtbV9kYXRhXzI4NjAubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNzBiMGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL1RPRE8KQEAgLTAsMCArMSwxNyBAQAorSSdtIGhlc2l0YW50IHRvIGFkZCBhIFRPRE8gZmlsZSBoZXJlLCBhcyB0aGUgd2lyZWxlc3MgZGV2ZWxvcGVycyB3b3VsZAorcmVhbGx5IGhhdmUgcGVvcGxlIGhlbHAgdGhlbSBvdXQgb24gdGhlICJjbGVhbiIgcnQyODYwIGRyaXZlciB0aGF0IGNhbgorYmUgZm91bmQgYXQgdGhlIHJ0Mjg2MC5zZi5uZXQgc2l0ZS4KKworQnV0LCBpZiB5b3Ugd2lzaCB0byBjbGVhbiB1cCB0aGlzIGRyaXZlciBpbnN0ZWFkLCBoZXJlJ3MgYSBzaG9ydCBsaXN0IG9mCit0aGluZ3MgdGhhdCBuZWVkIHRvIGJlIGRvbmUgdG8gZ2V0IGl0IGludG8gYSBtb3JlIG1lcmdhYmxlIHNoYXBlOgorCitUT0RPOgorCS0gY2hlY2twYXRjaC5wbCBjbGVhbgorCS0gc3BhcnNlIGNsZWFuCisJLSBwb3J0IHRvIGluLWtlcm5lbCA4MDIxMSBzdGFjaworCS0gcmVtb3ZlIHJlYWRpbmcgZnJvbSAvZXRjLyBjb25maWcgZmlsZXMKKwktIHJldmlldyBieSB0aGUgd2lyZWxlc3MgZGV2ZWxvcGVyIGNvbW11bml0eQorCitQbGVhc2Ugc2VuZCBhbnkgcGF0Y2hlcyBvciBjb21wbGFpbnRzIGFib3V0IHRoaXMgZHJpdmVyIHRvIEdyZWcKK0tyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPiBhbmQgZG9uJ3QgYm90aGVyIHRoZSB1cHN0cmVhbSB3aXJlbGVzcwora2VybmVsIGRldmVsb3BlcnMgYWJvdXQgaXQsIHRoZXkgd2FudCBub3RoaW5nIHRvIGRvIHdpdGggaXQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2Fpcm9uZXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvYWlyb25ldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMDdiMTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2Fpcm9uZXQuaApAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlhaXJvbmV0LmgKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlOYW1lCQlEYXRlCQkJTW9kaWZpY2F0aW9uIGxvZ3MKKwlQYXVsIExpbgkwNC0wNi0xNQkJSW5pdGlhbAorKi8KKworI2lmbmRlZglfX0FJUk9ORVRfSF9fCisjZGVmaW5lCV9fQUlST05FVF9IX18KKworLy8gTWVhc3VyZW1lbnQgVHlwZSBkZWZpbml0aW9uCisjZGVmaW5lCU1TUk5fVFlQRV9VTlVTRUQJCQkJMAorI2RlZmluZQlNU1JOX1RZUEVfQ0hBTk5FTF9MT0FEX1JFUQkJMQorI2RlZmluZQlNU1JOX1RZUEVfTk9JU0VfSElTVF9SRVEJCTIKKyNkZWZpbmUJTVNSTl9UWVBFX0JFQUNPTl9SRVEJCQkzCisjZGVmaW5lCU1TUk5fVFlQRV9GUkFNRV9SRVEJCQkJNAorCisvLyBTY2FuIE1vZGUgaW4gQmVhY29uIFJlcXVlc3QKKyNkZWZpbmUJTVNSTl9TQ0FOX01PREVfUEFTU0lWRQkJCTAKKyNkZWZpbmUJTVNSTl9TQ0FOX01PREVfQUNUSVZFCQkJMQorI2RlZmluZQlNU1JOX1NDQU5fTU9ERV9CRUFDT05fVEFCTEUJCTIKKworLy8gUEhZIHR5cGUgZGVmaW5pdGlvbiBmb3IgQWlyb25ldCBiZWFjb24gcmVwb3J0LCBDQ1ggMiB0YWJsZSAzNi05CisjZGVmaW5lCVBIWV9GSAkJCQkJCQkxCisjZGVmaW5lCVBIWV9EU1MJCQkJCQkJMgorI2RlZmluZQlQSFlfVU5VU0VECQkJCQkJMworI2RlZmluZQlQSFlfT0ZETQkJCQkJCTQKKyNkZWZpbmUJUEhZX0hSX0RTUwkJCQkJCTUKKyNkZWZpbmUJUEhZX0VSUAkJCQkJCQk2CisKKy8vIFJQSSB0YWJsZSBpbiBkQm0KKyNkZWZpbmUJUlBJXzAJCQkwCQkJLy8JUG93ZXIgPD0gLTg3CisjZGVmaW5lCVJQSV8xCQkJMQkJCS8vCS04NyA8IFBvd2VyIDw9IC04MgorI2RlZmluZQlSUElfMgkJCTIJCQkvLwktODIgPCBQb3dlciA8PSAtNzcKKyNkZWZpbmUJUlBJXzMJCQkzCQkJLy8JLTc3IDwgUG93ZXIgPD0gLTcyCisjZGVmaW5lCVJQSV80CQkJNAkJCS8vCS03MiA8IFBvd2VyIDw9IC02NworI2RlZmluZQlSUElfNQkJCTUJCQkvLwktNjcgPCBQb3dlciA8PSAtNjIKKyNkZWZpbmUJUlBJXzYJCQk2CQkJLy8JLTYyIDwgUG93ZXIgPD0gLTU3CisjZGVmaW5lCVJQSV83CQkJNwkJCS8vCS01NyA8IFBvd2VyCisKKy8vIENpc2NvIEFpcm9uZXQgSUFQUCBkZWZpbmV0aW9ucworI2RlZmluZQlBSVJPTkVUX0lBUFBfVFlQRQkJCQkJMHgzMgorI2RlZmluZQlBSVJPTkVUX0lBUFBfU1VCVFlQRV9SRVFVRVNUCQkweDAxCisjZGVmaW5lCUFJUk9ORVRfSUFQUF9TVUJUWVBFX1JFUE9SVAkJCTB4ODEKKworLy8gTWVhc3VyZW1lbnQgUmVxdWVzdCBkZXRhaWwgZm9ybWF0Cit0eXBlZGVmCXN0cnVjdAlfTUVBU1VSRU1FTlRfUkVRVUVTVAl7CisJVUNIQVIJQ2hhbm5lbDsKKwlVQ0hBUglTY2FuTW9kZTsJCQkvLyBVc2Ugb25seSBpbiBiZWFjb24gcmVxdWVzdCwgb3RoZXIgcmVxdWVzdHMgZGlkIG5vdCB1c2UgdGhpcyBmaWVsZAorCVVTSE9SVAlEdXJhdGlvbjsKK30JTUVBU1VSRU1FTlRfUkVRVUVTVCwgKlBNRUFTVVJFTUVOVF9SRVFVRVNUOworCisvLyBCZWFjb24gTWVhc3VyZW1lbnQgUmVwb3J0CisvLyBBbGwgdGhlc2UgZmllbGQgbWlnaHQgY2hhbmdlIHRvIFVDSEFSLCBiZWNhdXNlIHdlIGRpZG4ndCBkbyBhbnl0aGluZyB0byB0aGVzZSByZXBvcnQuCisvLyBXZSBjb3B5IGFsbCB0aGVzZSBiZWFjb25zIGFuZCByZXBvcnQgdG8gQ0NYIDIgQVAuCit0eXBlZGVmCXN0cnVjdAlfQkVBQ09OX1JFUE9SVAl7CisJVUNIQVIJQ2hhbm5lbDsKKwlVQ0hBUglTcGFyZTsKKwlVU0hPUlQJRHVyYXRpb247CisJVUNIQVIJUGh5VHlwZTsJCQkvLyBEZWZpbmlhdGlvbiBpcyBsaXN0ZWQgYWJvdmUgdGFibGUgMzYtOQorCVVDSEFSCVJ4UG93ZXI7CisJVUNIQVIJQlNTSURbNl07CisJVUNIQVIJUGFyZW50VFNGWzRdOworCVVDSEFSCVRhcmdldFRTRls4XTsKKwlVU0hPUlQJQmVhY29uSW50ZXJ2YWw7CisJVVNIT1JUCUNhcGFiaWxpdHlJbmZvOworfQlCRUFDT05fUkVQT1JULCAqUEJFQUNPTl9SRVBPUlQ7CisKKy8vIEZyYW1lIE1lYXN1cmVtZW50IFJlcG9ydCAoT3B0aW9uYWwpCit0eXBlZGVmCXN0cnVjdAlfRlJBTUVfUkVQT1JUCXsKKwlVQ0hBUglDaGFubmVsOworCVVDSEFSCVNwYXJlOworCVVTSE9SVAlEdXJhdGlvbjsKKwlVQ0hBUglUQTsKKwlVQ0hBUglCU1NJRFs2XTsKKwlVQ0hBUglSU1NJOworCVVDSEFSCUNvdW50OworfQlGUkFNRV9SRVBPUlQsICpQRlJBTUVfUkVQT1JUOworCisjcHJhZ21hIHBhY2soMSkKKy8vIENoYW5uZWwgTG9hZCBSZXBvcnQKK3R5cGVkZWYJc3RydWN0CV9DSEFOTkVMX0xPQURfUkVQT1JUCXsKKwlVQ0hBUglDaGFubmVsOworCVVDSEFSCVNwYXJlOworCVVTSE9SVAlEdXJhdGlvbjsKKwlVQ0hBUglDQ0FCdXN5OworfQlDSEFOTkVMX0xPQURfUkVQT1JULCAqUENIQU5ORUxfTE9BRF9SRVBPUlQ7CisjcHJhZ21hIHBhY2soKQorCisvLyBOb3NpZSBIaXN0b2dyYW0gUmVwb3J0Cit0eXBlZGVmCXN0cnVjdAlfTk9JU0VfSElTVF9SRVBPUlQJeworCVVDSEFSCUNoYW5uZWw7CisJVUNIQVIJU3BhcmU7CisJVVNIT1JUCUR1cmF0aW9uOworCVVDSEFSCURlbnNpdHlbOF07Cit9CU5PSVNFX0hJU1RfUkVQT1JULCAqUE5PSVNFX0hJU1RfUkVQT1JUOworCisvLyBSYWRpbyBNYW5hZ2VtZW50IENhcGFiaWxpdHkgZWxlbWVudAordHlwZWRlZglzdHJ1Y3QJX1JBRElPX01BTkFHRU1FTlRfQ0FQQUJJTElUWQl7CisJVUNIQVIJRWlkOwkJCQkvLyBUT0RPOiBXaHkgdGhlIEVpZCBpcyAxIGJ5dGUsIG5vdCBub3JtYWwgMiBieXRlcz8/PworCVVDSEFSCUxlbmd0aDsKKwlVQ0hBUglBaXJvbmV0T3VpWzNdOwkJLy8gQUlyb25ldCBPVUkgKDAwIDQwIDk2KQorCVVDSEFSCVR5cGU7CQkJCS8vIFR5cGUgLyBWZXJzaW9uCisJVVNIT1JUCVN0YXR1czsJCQkJLy8gc3dhcDE2IHJlcXVpcmVkCit9CVJBRElPX01BTkFHRU1FTlRfQ0FQQUJJTElUWSwgKlBSQURJT19NQU5BR0VNRU5UX0NBUEFCSUxJVFk7CisKKy8vIE1lYXN1cmVtZW50IE1vZGUgQml0IGRlZmluaXRpb24KK3R5cGVkZWYJc3RydWN0CV9NRUFTVVJFTUVOVF9NT0RFCXsKKwlVQ0hBUglSc3ZkOjQ7CisJVUNIQVIJUmVwb3J0OjE7CisJVUNIQVIJTm90VXNlZDoxOworCVVDSEFSCUVuYWJsZToxOworCVVDSEFSCVBhcmFsbGVsOjE7Cit9CU1FQVNVUkVNRU5UX01PREUsICpQTUVBU1VSRU1FTlRfTU9ERTsKKworLy8gTWVhc3VyZW1lbnQgUmVxdWVzdCBlbGVtZW50LCBUaGlzIGlzIGxpdHRsZSBlbmRpYW4gbW9kZQordHlwZWRlZglzdHJ1Y3QJX01FQVNVUkVNRU5UX1JFUVVFU1RfRUxFTUVOVAl7CisJVVNIT1JUCQkJCUVpZDsKKwlVU0hPUlQJCQkJTGVuZ3RoOwkJCQkvLyBzd2FwMTYgcmVxdWlyZWQKKwlVU0hPUlQJCQkJVG9rZW47CQkJCS8vIG5vbi16ZXJvIHVuaXF1ZSB0b2tlbgorCVVDSEFSCQkJCU1vZGU7CQkJCS8vIE1lYXN1cmVtZW50IE1vZGUKKwlVQ0hBUgkJCQlUeXBlOwkJCQkvLyBNZWFzdXJlbWVudCB0eXBlCit9CU1FQVNVUkVNRU5UX1JFUVVFU1RfRUxFTUVOVCwgKlBNRUFTVVJFTUVOVF9SRVFVRVNUX0VMRU1FTlQ7CisKKy8vIE1lYXN1cmVtZW50IFJlcG9ydCBlbGVtZW50LCBUaGlzIGlzIGxpdHRsZSBlbmRpYW4gbW9kZQordHlwZWRlZglzdHJ1Y3QJX01FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UCXsKKwlVU0hPUlQJCQkJRWlkOworCVVTSE9SVAkJCQlMZW5ndGg7CQkJCS8vIHN3YXAxNiByZXF1aXJlZAorCVVTSE9SVAkJCQlUb2tlbjsJCQkJLy8gbm9uLXplcm8gdW5pcXVlIHRva2VuCisJVUNIQVIJCQkJTW9kZTsJCQkJLy8gTWVhc3VyZW1lbnQgTW9kZQorCVVDSEFSCQkJCVR5cGU7CQkJCS8vIE1lYXN1cmVtZW50IHR5cGUKK30JTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQsICpQTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQ7CisKKy8vIENpc2NvIEFpcm9uZXQgSUFQUCBGcmFtZSBIZWFkZXIsIE5ldHdvcmsgYnl0ZSBvcmRlciB1c2VkCit0eXBlZGVmCXN0cnVjdAlfQUlST05FVF9JQVBQX0hFQURFUiB7CisJVUNIQVIJQ2lzY29TbmFwSGVhZGVyWzhdOwkvLyA4IGJ5dGVzIENpc2NvIHNuYXAgaGVhZGVyCisJVVNIT1JUCUxlbmd0aDsJCQkJLy8gSUFQUCBJRCAmIGxlbmd0aCwgcmVtZW1iZXIgdG8gc3dhcDE2IGluIExFIHN5c3RlbQorCVVDSEFSCVR5cGU7CQkJCS8vIElBUFAgdHlwZQorCVVDSEFSCVN1YlR5cGU7CQkJLy8gSUFQUCBzdWJ0eXBlCisJVUNIQVIJREFbNl07CQkJCS8vIERlc3RpbmF0aW9uIE1BQyBhZGRyZXNzCisJVUNIQVIJU0FbNl07CQkJCS8vIFNvdXJjZSBNQUMgYWRkcmVzcworCVVTSE9SVAlUb2tlbjsJCQkJLy8gRGlhbG9nIHRva2VuLCBubyBuZWVkIHRvIHN3YXAxNiBzaW5jZSBpdCBpcyBmb3IgeW9rZW4gdXNhZ2Ugb25seQorfQlBSVJPTkVUX0lBUFBfSEVBREVSLCAqUEFJUk9ORVRfSUFQUF9IRUFERVI7CisKKy8vIFJhZGlvIE1lYXN1cmVtZW50IFJlcXVlc3QgZnJhbWUKK3R5cGVkZWYJc3RydWN0CV9BSVJPTkVUX1JNX1JFUVVFU1RfRlJBTUUJeworICAgIEFJUk9ORVRfSUFQUF9IRUFERVIJSUFQUDsJCQkvLyBDb21tb24gaGVhZGVyCisJVUNIQVIJCQkJRGVsYXk7CQkJLy8gQWN0aXZhdGlvbiBEZWxheQorCVVDSEFSCQkJCU9mZnNldDsJCQkvLyBNZWFzdXJlbWVudCBvZmZzZXQKK30JQUlST05FVF9STV9SRVFVRVNUX0ZSQU1FLCAqUEFJUk9ORVRfUk1fUkVRVUVTVF9GUkFNRTsKKworLy8gUmFkaW8gTWVhc3VyZW1lbnQgUmVwb3J0IGZyYW1lCit0eXBlZGVmCXN0cnVjdAlfQUlST05FVF9STV9SRVBPUlRfRlJBTUUJeworICAgIEFJUk9ORVRfSUFQUF9IRUFERVIJSUFQUDsJCQkvLyBDb21tb24gaGVhZGVyCit9CUFJUk9ORVRfUk1fUkVQT1JUX0ZSQU1FLCAqUEFJUk9ORVRfUk1fUkVQT1JUX0ZSQU1FOworCisvLyBTYXZlZCBlbGVtZW50IHJlcXVlc3QgYWN0aW9ucyB3aGljaCB3aWxsIHNhdmVkIGluIFN0YUNmZy4KK3R5cGVkZWYJc3RydWN0CV9STV9SRVFVRVNUX0FDVElPTgl7CisJTUVBU1VSRU1FTlRfUkVRVUVTVF9FTEVNRU5UCVJlcUVsZW07CQkvLyBTYXZlZCByZXF1ZXN0IGVsZW1lbnQKKwlNRUFTVVJFTUVOVF9SRVFVRVNUCQkJTWVhc3VyZW1lbnQ7CS8vIFNhdmVkIG1lYXN1cmVtZW50IHdpdGhpbiB0aGUgcmVxdWVzdCBlbGVtZW50Cit9CVJNX1JFUVVFU1RfQUNUSU9OLCAqUFJNX1JFUVVFU1RfQUNUSU9OOworCisvLyBDQ1ggYWRtaW5pc3RyYXRpb24gY29udHJvbAordHlwZWRlZgl1bmlvbglfQ0NYX0NPTlRST0wJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJRW5hYmxlOjE7CQkJLy8gRW5hYmxlIENDWDIKKwkJVUlOVDMyCQlMZWFwRW5hYmxlOjE7CQkvLyBFbmFibGUgTEVBUCBhdCBDQ1gyCisJCVVJTlQzMgkJUk1FbmFibGU6MTsJCQkvLyBSYWRpbyBNZWFzdXJlbWVudCBFbmFibGUKKwkJVUlOVDMyCQlEQ1JNRW5hYmxlOjE7CQkvLyBOb24gc2VydmluZyBjaGFubmVsIFJhZGlvIE1lYXN1cmVtZW50IGVuYWJsZQorCQlVSU5UMzIJCVFPU0VuYWJsZToxOwkJLy8gRW5hYmxlIFFPUyBmb3IgQ0NYIDIuMCBzdXBwb3J0CisJCVVJTlQzMgkJRmFzdFJvYW1FbmFibGU6MTsJLy8gRW5hYmxlIGZhc3Qgcm9hbWluZworCQlVSU5UMzIJCVJzdmQ6MjsJCQkJLy8gTm90IHVzZWQKKwkJVUlOVDMyCQlkQm1Ub1JvYW06ODsJCS8vIHRoZSBjb25kaXRpb24gdG8gcm9hbSB3aGVuIHJlY2VpdmluZyBSc3NpIGxlc3MgdGhhbiB0aGlzIHZhbHVlLiBJdCdzIG5lZ2F0aXZlIHZhbHVlLgorCQlVSU5UMzIJCVR1TGltaXQ6MTY7CQkJLy8gTGltaXQgZm9yIGRpZmZlcmVudCBjaGFubmVsIHNjYW4KKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUNDWF9DT05UUk9MLCAqUENDWF9DT05UUk9MOworCisjZW5kaWYJLy8gX19BSVJPTkVUX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9hcC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNmRiMjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2FwLmgKQEAgLTAsMCArMSw1NTcgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgYXAuaAorCisgICAgQWJzdHJhY3Q6CisgICAgTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFBhdWwgTGluICAgIDA4LTAxLTIwMDIgICAgY3JlYXRlZAorICAgIEphbWVzIFRhbiAgIDA5LTA2LTIwMDIgICAgbW9kaWZpZWQgKFJldmlzZSBOVENSZWdUYWJsZSkKKyAgICBKb2huIENoYW5nICAxMi0yMi0yMDA0ICAgIG1vZGlmaWVkIGZvciBSVDI1NjEvMjY2MS4gbWVyZ2Ugd2l0aCBTVEEgZHJpdmVyCisqLworI2lmbmRlZiBfX0FQX0hfXworI2RlZmluZSBfX0FQX0hfXworCisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBBUCBSVE1QLmggPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICAgICAgRnVuY3Rpb24gUHJvdG90eXBlcworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBhcF9kYXRhLmMKKworQk9PTEVBTiBBUEJyaWRnZVRvV2lyZWxlc3NTdGEoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBwSGVhZGVyLAorICAgIElOICBVSU5UICAgICAgICAgICAgSGRyTGVuLAorICAgIElOICBQVUNIQVIgICAgICAgICAgcERhdGEsCisgICAgSU4gIFVJTlQgICAgICAgICAgICBEYXRhTGVuLAorICAgIElOICBVTE9ORyAgICAgICAgICAgZnJvbXdkc2lkeCk7CisKK0JPT0xFQU4gQVBIYW5kbGVSeERvbmVJbnRlcnJ1cHQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lECUFQU2VuZFBhY2tldHMoCisJSU4JTkRJU19IQU5ETEUJCU1pbmlwb3J0QWRhcHRlckNvbnRleHQsCisJSU4JUFBORElTX1BBQ0tFVAlwcFBhY2tldEFycmF5LAorCUlOCVVJTlQJCQlOdW1iZXJPZlBhY2tldHMpOworCitORElTX1NUQVRVUyBBUFNlbmRQYWNrZXQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBORElTX1BBQ0tFVCAgICBwUGFja2V0KTsKKworCitORElTX1NUQVRVUyBBUEhhcmRUcmFuc21pdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrLAorCUlOCVVDSEFSCQkJUXVlSWR4KTsKKworVk9JRCBBUFJ4RUFQT0xGcmFtZUluZGljYXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKK05ESVNfU1RBVFVTIEFQQ2hlY2tSeEVycm9yKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBSVDI4WFhfUlhEX1NUUlVDCQlwUnhELAorCUlOCVVDSEFSCQkJV2NpZCk7CisKK0JPT0xFQU4gQVBDaGVja0NsYXNzMkNsYXNzM0Vycm9yKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOIFVMT05HIFdjaWQsCisJSU4gIFBIRUFERVJfODAyXzExICBwSGVhZGVyKTsKKworVk9JRCBBUEhhbmRsZVJ4UHNQb2xsKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBBZGRyLAorCUlOCVVTSE9SVAkJCUFpZCwKKyAgICBJTglCT09MRUFOCQkJaXNBY3RpdmUpOworCitWT0lEICAgIFJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKAorICAgIElOICBQVUNIQVIgICAgICAgICAgcERhdGEsCisgICAgSU4gIFVMT05HICAgICAgICAgICBEZXNjcmlwdG9yVHlwZSk7CisKK1ZPSUQgICAgUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgcERhdGEsCisgICAgSU4gIFVMT05HICAgICAgICAgICBEaXIsCisgICAgSU4gIEJPT0xFQU4gICAgICAgICBGcm9tUnhEb25lSW50KTsKKworLy8gYXBfYXNzb2MuYworCitWT0lEIEFQQXNzb2NTdGF0ZU1hY2hpbmVJbml0KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBTVEFURV9NQUNISU5FICpTLAorICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CisKK1ZPSUQgIEFQUGVlckFzc29jUmVxQWN0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICBBUFBlZXJSZWFzc29jUmVxQWN0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICBBUFBlZXJEaXNhc3NvY1JlcUFjdGlvbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBNYnNzS2lja091dFN0YXMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gSU5UIGFwaWR4LAorCUlOIFVTSE9SVCBSZWFzb24pOworCitWT0lEIEFQTWxtZUtpY2tPdXRTdGEoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBTdGFBZGRyLAorCUlOIFVDSEFSIFdjaWQsCisJSU4gVVNIT1JUIFJlYXNvbik7CisKK1ZPSUQgQVBNbG1lRGlzYXNzb2NSZXFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgQVBDbHMzZXJyQWN0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOIAlVTE9ORyBXY2lkLAorICAgIElOCVBIRUFERVJfODAyXzExCXBIZWFkZXIpOworCisKK1VTSE9SVCBBUEJ1aWxkQXNzb2NpYXRpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUFDX1RBQkxFX0VOVFJZICpwRW50cnksCisgICAgSU4gVVNIT1JUIENhcGFiaWxpdHlJbmZvLAorICAgIElOIFVDSEFSICBNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzLAorICAgIElOIFVDSEFSICAqUlNOLAorICAgIElOIFVDSEFSICAqcFJTTkxlbiwKKyAgICBJTiBCT09MRUFOIGJXbW1DYXBhYmxlLAorICAgIElOIFVMT05HICBSYWxpbmtJZSwKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisgICAgSU4gRVhUX0NBUF9JTkZPX0VMRU1FTlQgRXh0Q2FwSW5mbywKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisJSU4gSFRfQ0FQQUJJTElUWV9JRQkJKnBIdENhcGFiaWxpdHksCisJSU4gVUNIQVIJCSBIdENhcGFiaWxpdHlMZW4sCisgICAgT1VUIFVTSE9SVCAqcEFpZCk7CisKKy8vIGFwX2F1dGguYworCit2b2lkIEFQQXV0aFN0YXRlTWFjaGluZUluaXQoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gU1RBVEVfTUFDSElORSAqU20sCisgICAgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKKworVk9JRCBBUE1sbWVEZWF1dGhSZXFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBUENsczJlcnJBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gCVVMT05HIFdjaWQsCisgICAgSU4JUEhFQURFUl84MDJfMTEJcEhlYWRlcik7CisKKy8vIGFwX2F1dGhyc3AuYworCitWT0lEIEFQQXV0aFJzcFN0YXRlTWFjaGluZUluaXQoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gUFNUQVRFX01BQ0hJTkUgU20sCisgICAgSU4gU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCitWT0lEIEFQUGVlckF1dGhBdEF1dGhSc3BJZGxlQWN0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFQUGVlckRlYXV0aFJlcUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFQUGVlckF1dGhTaW1wbGVSc3BHZW5BbmRTZW5kKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCisgICAgSU4gIFVTSE9SVCBBbGcsCisgICAgSU4gIFVTSE9SVCBTZXEsCisgICAgSU4gIFVTSE9SVCBTdGF0dXNDb2RlKTsKKworLy8gYXBfY29ubmVjdC5jCisKK0JPT0xFQU4gQmVhY29uVHJhbnNtaXRSZXF1aXJlZCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBJTlQJCQkJYXBpZHgpOworCitWT0lEIEFQTWFrZUJzc0JlYWNvbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTglJTlQJCQkJYXBpZHgpOworCitWT0lEICBBUFVwZGF0ZUJlYWNvbkZyYW1lKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCUlOVAkJCQlhcGlkeCk7CisKK1ZPSUQgQVBNYWtlQWxsQnNzQmVhY29uKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCAgQVBVcGRhdGVBbGxCZWFjb25GcmFtZSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKKworLy8gYXBfc3luYy5jCisKK1ZPSUQgQVBTeW5jU3RhdGVNYWNoaW5lSW5pdCgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBTVEFURV9NQUNISU5FICpTbSwKKyAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCitWT0lEIEFQU2NhblRpbWVvdXQoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBBUEludmFsaWRTdGF0ZVdoZW5TY2FuKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQVBTY2FuVGltZW91dEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFQUGVlclByb2JlUmVxQWN0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBUFBlZXJCZWFjb25BY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBUE1sbWVTY2FuUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQVBQZWVyQmVhY29uQXRTY2FuQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQVBTY2FuQ25jbEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFwU2l0ZVN1cnZleSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgU3VwcG9ydFJhdGUoCisJSU4gUFVDSEFSIFN1cFJhdGUsCisJSU4gVUNIQVIgU3VwUmF0ZUxlbiwKKwlJTiBQVUNIQVIgRXh0UmF0ZSwKKwlJTiBVQ0hBUiBFeHRSYXRlTGVuLAorCU9VVCBQVUNIQVIgKlJhdGVzLAorCU9VVCBQVUNIQVIgUmF0ZXNMZW4sCisJT1VUIFBVQ0hBUiBwTWF4U3VwcG9ydFJhdGUpOworCisKK0JPT0xFQU4gQXBTY2FuUnVubmluZygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCitWT0lEIEFQT3ZlcmxhcHBpbmdCU1NTY2FuKAorCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisKKy8vIGFwX3dwYS5jCisKK1ZPSUQgQVBXcGFTdGF0ZU1hY2hpbmVJbml0KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBTVEFURV9NQUNISU5FICpTbSwKKyAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCisvLyBhcF9tbG1lLmMKKworVk9JRCBBUE1sbWVQZXJpb2RpY0V4ZWMoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIEFQTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKAorCUlOIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiBQTUFDX1RBQkxFX0VOVFJZCQlwRW50cnksCisJSU4gUFVDSEFSCQkJCSpwcFRhYmxlLAorCUlOIFBVQ0hBUgkJCQlwVGFibGVTaXplLAorCUlOIFBVQ0hBUgkJCQlwSW5pdFR4UmF0ZUlkeCk7CisKK1ZPSUQgQVBNbG1lU2V0VHhSYXRlKAorCUlOIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiBQTUFDX1RBQkxFX0VOVFJZCQlwRW50cnksCisJSU4gUFJUTVBfVFhfUkFURV9TV0lUQ0gJcFR4UmF0ZSk7CisKK1ZPSUQgQVBNbG1lRHluYW1pY1R4UmF0ZVN3aXRjaGluZygKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgQVBRdWlja1Jlc3BvbmVGb3JSYXRlVXBFeGVjKAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKyAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK0JPT0xFQU4gQVBNc2dUeXBlU3Vic3QoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gUEZSQU1FXzgwMl8xMSBwRnJhbWUsCisgICAgT1VUIElOVCAqTWFjaGluZSwKKyAgICBPVVQgSU5UICpNc2dUeXBlKTsKKworVk9JRCBBUFF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMoCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworCitWT0lEIFJUTVBTZXRQaWdneUJhY2soCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gQk9PTEVBTgkJCWJQaWdneUJhY2spOworCitWT0lEIEFQQXNpY0V2YWx1YXRlUnhBbnQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIEFQQXNpY1J4QW50RXZhbFRpbWVvdXQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCisvLyBhcC5jCisKK1ZPSUQgQVBTd2l0Y2hDaGFubmVsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIElOVCBDaGFubmVsKTsKKworTkRJU19TVEFUVVMgQVBJbml0aWFsaXplKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBBUFNodXRkb3duKAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkKTsKKworVk9JRCBBUFN0YXJ0VXAoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIEFQU3RvcCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgQVBDbGVhbnVwUHNRdWV1ZSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFFVRVVFX0hFQURFUiAgIHBRdWV1ZSk7CisKK1ZPSUQgTWFjVGFibGVSZXNldCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK01BQ19UQUJMRV9FTlRSWSAqTWFjVGFibGVJbnNlcnRFbnRyeSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIHBBZGRyLAorCUlOCVVDSEFSCQkJYXBpZHgsCisJSU4gQk9PTEVBTglDbGVhbkFsbCk7CisKK0JPT0xFQU4gTWFjVGFibGVEZWxldGVFbnRyeSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiBVU0hPUlQgd2NpZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIHBBZGRyKTsKKworTUFDX1RBQkxFX0VOVFJZICpNYWNUYWJsZUxvb2t1cCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIHBBZGRyKTsKKworVk9JRCBNYWNUYWJsZU1haW50ZW5hbmNlKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVUlOVDMyIE1hY1RhYmxlQXNzb2NTdGFOdW1HZXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitNQUNfVEFCTEVfRU5UUlkgKkFQU3NQc0lucXVpcnkoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBwQWRkciwKKyAgICBPVVQgU1NUICAgICAgICAgICAgICpTc3QsCisgICAgT1VUIFVTSE9SVCAgICAgICAgICAqQWlkLAorICAgIE9VVCBVQ0hBUiAgICAgICAgICAgKlBzTW9kZSwKKyAgICBPVVQgVUNIQVIgICAgICAgICAgICpSYXRlKTsKKworQk9PTEVBTiBBUFBzSW5kaWNhdGUoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBwQWRkciwKKwlJTiBVTE9ORyBXY2lkLAorICAgIElOICBVQ0hBUiAgICAgICAgICAgUHNtKTsKKworVk9JRCBBcExvZ0V2ZW50KAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorICAgIElOIFBVQ0hBUiAgICAgICAgICAgcEFkZHIsCisgICAgSU4gVVNIT1JUICAgICAgICAgICBFdmVudCk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQgQVBVcGRhdGVPcGVyYXRpb25Nb2RlKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBBUFVwZGF0ZUNhcGFiaWxpdHlBbmRFcnBJZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK0JPT0xFQU4gQXBDaGVja0FjY2Vzc0NvbnRyb2xMaXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiAgICAgICAgcEFkZHIsCisJSU4gVUNIQVIgICAgICAgICBBcGlkeCk7CisKK1ZPSUQgQXBVcGRhdGVBY2Nlc3NDb250cm9sTGlzdCgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBVQ0hBUiAgICAgICAgIEFwaWR4KTsKKworVk9JRCBBcEVucXVldWVOdWxsRnJhbWUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSICAgICAgICBwQWRkciwKKwlJTiBVQ0hBUiAgICAgICAgIFR4UmF0ZSwKKwlJTiBVQ0hBUiAgICAgICAgIFBJRCwKKwlJTiBVQ0hBUiAgICAgICAgIGFwaWR4LAorICAgIElOIEJPT0xFQU4gICAgICAgYlFvc051bGwsCisgICAgSU4gQk9PTEVBTiAgICAgICBiRU9TUCwKKyAgICBJTiBVQ0hBUiAgICAgICAgIE9sZFVQKTsKKworVk9JRCBBcFNlbmRGcmFtZSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFZPSUQgICAgICAgICAgIHBCdWZmZXIsCisgICAgSU4gIFVMT05HICAgICAgICAgICBMZW5ndGgsCisgICAgSU4gIFVDSEFSICAgICAgICAgICBUeFJhdGUsCisgICAgSU4gIFVDSEFSICAgICAgICAgICBQSUQpOworCitWT0lEIEFwRW5xdWV1ZUFja0ZyYW1lKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFBVQ0hBUiAgICAgICAgcEFkZHIsCisgICAgSU4gVUNIQVIgICAgICAgICBUeFJhdGUsCisJSU4gVUNIQVIgICAgICAgICBhcGlkeCk7CisKK1VDSEFSIEFQQXV0b1NlbGVjdENoYW5uZWwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gQk9PTEVBTiBPcHRpbWFsKTsKKworLy8gYXBfc2FuaXR5LmMKKworCitCT09MRUFOIFBlZXJBc3NvY1JlcUNtbVNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBCT09MRUFOIGlzUmVzc29jLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQWRkcjIsCisgICAgT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAorICAgIE9VVCBVU0hPUlQgKnBMaXN0ZW5JbnRlcnZhbCwKKyAgICBPVVQgUFVDSEFSIHBBcEFkZHIsCisgICAgT1VUIFVDSEFSICpwU3NpZExlbiwKKyAgICBPVVQgY2hhciAqU3NpZCwKKyAgICBPVVQgVUNIQVIgKnBSYXRlc0xlbiwKKyAgICBPVVQgVUNIQVIgUmF0ZXNbXSwKKyAgICBPVVQgVUNIQVIgKlJTTiwKKyAgICBPVVQgVUNIQVIgKnBSU05MZW4sCisgICAgT1VUIEJPT0xFQU4gKnBiV21tQ2FwYWJsZSwKKyAgICBPVVQgVUxPTkcgICpwUmFsaW5rSWUsCisjaWZkZWYgRE9UMTFOX0RSQUZUMworICAgIE9VVCBFWFRfQ0FQX0lORk9fRUxFTUVOVAkqcEV4dENhcEluZm8sCisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworICAgIE9VVCBVQ0hBUgkJICpwSHRDYXBhYmlsaXR5TGVuLAorICAgIE9VVCBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5KTsKKworQk9PTEVBTiBQZWVyRGlzYXNzb2NSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMiwKKyAgICBPVVQgVVNIT1JUICpSZWFzb24pOworCitCT09MRUFOIFBlZXJEZWF1dGhSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMiwKKyAgICBPVVQgVVNIT1JUICpSZWFzb24pOworCitCT09MRUFOIEFQUGVlckF1dGhTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKwlPVVQgUFVDSEFSIHBBZGRyMSwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMiwKKyAgICBPVVQgVVNIT1JUICpBbGcsCisgICAgT1VUIFVTSE9SVCAqU2VxLAorICAgIE9VVCBVU0hPUlQgKlN0YXR1cywKKyAgICBDSEFSICpDaGxnVGV4dCk7CisKK0JPT0xFQU4gQVBQZWVyUHJvYmVSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMiwKKyAgICBPVVQgQ0hBUiBTc2lkW10sCisgICAgT1VUIFVDSEFSICpTc2lkTGVuKTsKKworQk9PTEVBTiBBUFBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcEFkZHIyLAorICAgIE9VVCBQVUNIQVIgcEJzc2lkLAorICAgIE9VVCBDSEFSIFNzaWRbXSwKKyAgICBPVVQgVUNIQVIgKlNzaWRMZW4sCisgICAgT1VUIFVDSEFSICpCc3NUeXBlLAorICAgIE9VVCBVU0hPUlQgKkJlYWNvblBlcmlvZCwKKyAgICBPVVQgVUNIQVIgKkNoYW5uZWwsCisgICAgT1VUIExBUkdFX0lOVEVHRVIgKlRpbWVzdGFtcCwKKyAgICBPVVQgVVNIT1JUICpDYXBhYmlsaXR5SW5mbywKKyAgICBPVVQgVUNIQVIgUmF0ZVtdLAorICAgIE9VVCBVQ0hBUiAqUmF0ZUxlbiwKKyAgICBPVVQgQk9PTEVBTiAqRXh0ZW5kZWRSYXRlSWVFeGlzdCwKKyAgICBPVVQgVUNIQVIgKkVycCk7CisKKy8vIGFwX2luZm8uYworCisjaWZkZWYgV0lOX05ESVMKK05ESVNfU1RBVFVTIEFQUXVlcnlJbmZvcm1hdGlvbigKKyAgICBJTiAgTkRJU19IQU5ETEUgTWluaXBvcnRBZGFwdGVyQ29udGV4dCwKKyAgICBJTiAgTkRJU19PSUQgICAgT2lkLAorICAgIElOICBQVk9JRCAgICAgICBwSW5mb3JtYXRpb25CdWZmZXIsCisgICAgSU4gIFVMT05HICAgICAgIEluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoLAorICAgIE9VVCBQVUxPTkcgICAgICBwQnl0ZXNXcml0dGVuLAorICAgIE9VVCBQVUxPTkcgICAgICBwQnl0ZXNOZWVkZWQpOworCitORElTX1NUQVRVUyBBUFNldEluZm9ybWF0aW9uKAorICAgIElOICBORElTX0hBTkRMRSBNaW5pcG9ydEFkYXB0ZXJDb250ZXh0LAorICAgIElOICBORElTX09JRCAgICBPaWQsCisgICAgSU4gIFBWT0lEICAgICAgIHBJbmZvcm1hdGlvbkJ1ZmZlciwKKyAgICBJTiAgVUxPTkcgICAgICAgSW5mb3JtYXRpb25CdWZmZXJMZW5ndGgsCisgICAgT1VUIFBVTE9ORyAgICAgIHBCeXRlc1JlYWQsCisgICAgT1VUIFBVTE9ORyAgICAgIHBCeXRlc05lZWRlZCk7CisjZW5kaWYKKworCisvLyA9PT09PT09PT09PT09PT09PT0gZW5kIG9mIEFQIFJUTVAuaCA9PT09PT09PT09PT09PT09PT09PT09PT0KKworCisjZW5kaWYgIC8vIF9fQVBfSF9fCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hsaXN0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NobGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMTViOWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NobGlzdC5oCkBAIC0wLDAgKzEsMTI5NiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwljaGxpc3QuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUZvbmNoaSBXdSAgIDIwMDctMTItMTkgICAgY3JlYXRlZAorKi8KKworI2lmbmRlZiBfX0NITElTVF9IX18KKyNkZWZpbmUgX19DSExJU1RfSF9fCisKKyNpbmNsdWRlICJydG1wX3R5cGUuaCIKKyNpbmNsdWRlICJydG1wX2RlZi5oIgorCisKKyNkZWZpbmUgT0RPUgkJCTAKKyNkZWZpbmUgSURPUgkJCTEKKyNkZWZpbmUgQk9USAkJCTIKKworI2RlZmluZSBCQU5EXzVHICAgICAgICAgMAorI2RlZmluZSBCQU5EXzI0RyAgICAgICAgMQorI2RlZmluZSBCQU5EX0JPVEggICAgICAgMgorCit0eXBlZGVmIHN0cnVjdCBfQ0hfREVTUCB7CisJVUNIQVIgRmlyc3RDaGFubmVsOworCVVDSEFSIE51bU9mQ2g7CisJQ0hBUiBNYXhUeFB3cjsJCQkvLyBkQm0KKwlVQ0hBUiBHZW9ncmFwaHk7CQkJLy8gMDpvdXQgZG9vciwgMTppbiBkb29yLCAyOmJvdGgKKwlCT09MRUFOIERmc1JlcTsJCQkvLyBEZnMgcmVxdWlyZSwgMDogTm8sIDE6IHllcy4KK30gQ0hfREVTUCwgKlBDSF9ERVNQOworCit0eXBlZGVmIHN0cnVjdCBfQ0hfUkVHSU9OIHsKKwlVQ0hBUiBDb3VudFJlZ1szXTsKKwlVQ0hBUiBEZnNUeXBlOwkJCS8vIDA6IENFLCAxOiBGQ0MsIDI6IEpBUCwgMzpKQVBfVzUzLCBKQVBfVzU2CisJQ0hfREVTUCBDaERlc3BbMTBdOworfSBDSF9SRUdJT04sICpQQ0hfUkVHSU9OOworCitzdGF0aWMgQ0hfUkVHSU9OIENoUmVnaW9uW10gPQoreworCQl7CS8vIEFudGlndWEgYW5kIEJlcmJ1ZGEKKwkJCSJBRyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEFyZ2VudGluYQorCQkJIkFSIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCA0LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEFydWJhCisJCQkiQVciLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBBdXN0cmFsaWEKKwkJCSJBVSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCA1LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEF1c3RyaWEKKwkJCSJBVCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMywgSURPUiwgVFJVRX0sCQkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgMzAsIEJPVEgsIFRSVUV9LAkJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEJhaGFtYXMKKwkJCSJCUyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCA1LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEJhcmJhZG9zCisJCQkiQkIiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBCZXJtdWRhCisJCQkiQk0iLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBCcmF6aWwKKwkJCSJCUiIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDE0OSwgNSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBCZWxnaXVtCisJCQkiQkUiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMTgsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAxOCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEJ1bGdhcmlhCisJCQkiQkciLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgMzAsIE9ET1IsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQ2FuYWRhCisJCQkiQ0EiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDE0OSwgNSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBDYXltYW4gSXNMYW5kcworCQkJIktZIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQ2hpbGUKKwkJCSJDTCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCA1LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIENoaW5hCisJCQkiQ04iLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMTQ5LCA0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIENvbG9tYmlhCisJCQkiQ08iLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMTcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAxNDksIDUsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQ29zdGEgUmljYQorCQkJIkNSIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDE3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxNDksIDQsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQ3lwcnVzCisJCQkiQ1kiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyNCwgSURPUiwgVFJVRX0sCQkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfSwJCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBDemVjaF9SZXB1YmxpYworCQkJIkNaIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMjMsIElET1IsIFRSVUV9LAkJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBEZW5tYXJrCisJCQkiREsiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyMywgSURPUiwgVFJVRX0sCQkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfSwJCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBEb21pbmljYW4gUmVwdWJsaWMKKwkJCSJETyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAwCisJCQkJeyAxNDksIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gRXF1YWRvcgorCQkJIkVDIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAxMDAsIDExLCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEVsIFNhbHZhZG9yCisJCQkiU1YiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCA0LCAgIDM2LCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDE0OX4xNjUKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEZpbmxhbmQKKwkJCSJGSSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gRnJhbmNlCisJCQkiRlIiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gR2VybWFueQorCQkJIkRFIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBHcmVlY2UKKwkJCSJHUiIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIE9ET1IsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gR3VhbQorCQkJIkdVIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMSwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCisJCQkJeyAzNiwgIDQsICAgMTcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDE0OSwgIDUsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gR3VhdGVtYWxhCisJCQkiR1QiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgICAxNywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDE0OSwgIDQsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gSGFpdGkKKwkJCSJIVCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgIDE3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCAgNCwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBIb25kdXJhcworCQkJIkhOIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAxNDksICA0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEhvbmcgS29uZworCQkJIkhLIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxNDksICA0LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEh1bmdhcnkKKwkJCSJIVSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBJY2VsYW5kCisJCQkiSVMiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEluZGlhCisJCQkiSU4iLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDE0OSwgCTQsICAyNCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gSW5kb25lc2lhCisJCQkiSUQiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDE0OSwgCTQsICAyNywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gSXJlbGFuZAorCQkJIklFIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAJNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIE9ET1IsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gSXNyYWVsCisJCQkiSUwiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgICAzLCAgMjAsIElET1IsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MworCQkJCXsgNCwgCTYsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggNH45CisJCQkJeyAxMCwgCTQsICAyMCwgSURPUiwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMTB+MTMKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEl0YWx5CisJCQkiSVQiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsIAk0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgT0RPUiwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBKYXBhbgorCQkJIkpQIiwKKwkJCUpBUCwKKwkJCXsKKwkJCQl7IDEsICAgMTQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xNAorCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBKb3JkYW4KKwkJCSJKTyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgSURPUiwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyAxNDksIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIExhdHZpYQorCQkJIkxWIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAJNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gTGllY2h0ZW5zdGVpbgorCQkJIkxJIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyA1MiwgCTQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIExpdGh1YW5pYQorCQkJIkxUIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAJNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gTHV4ZW1idXJnCisJCQkiTFUiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsIAk0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBNYWxheXNpYQorCQkJIk1ZIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMzYsIAk0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgCTQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDE0OSwgIDUsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gTWFsdGEKKwkJCSJNVCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgCTQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIE1hcm9jY28KKwkJCSJNQSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsIAk0LCAgMjQsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBNZXhpY28KKwkJCSJNWCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsIAk0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgCTQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDE0OSwgIDUsICAzMCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gTmV0aGVybGFuZHMKKwkJCSJOTCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgCTQsICAyNCwgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIE5ldyBaZWFsYW5kCisJCQkiTloiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAJNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsIAk0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxNDksICA0LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIE5vcndheQorCQkJIk5PIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgCTQsICAyNCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAJNCwgIDI0LCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gUGVydQorCQkJIlBFIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAxNDksICA0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFBvcnR1Z2FsCisJCQkiUFQiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFBvbGFuZAorCQkJIlBMIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBSb21hbmlhCisJCQkiUk8iLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFJ1c3NpYQorCQkJIlJVIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAxNDksICA0LCAgMjAsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFNhdWRpIEFyYWJpYQorCQkJIlNBIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxNDksICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFNlcmJpYV9hbmRfTW9udGVuZWdybworCQkJIkNTIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBTaW5nYXBvcmUKKwkJCSJTRyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCAgNCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBTbG92YWtpYQorCQkJIlNLIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBTbG92ZW5pYQorCQkJIlNJIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFNvdXRoIEFmcmljYQorCQkJIlpBIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMTQ5LCAgNCwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBTb3V0aCBLb3JlYQorCQkJIktSIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsICA4LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xMjgKKwkJCQl7IDE0OSwgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gU3BhaW4KKwkJCSJFUyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICAgNCwgIDE3LCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gU3dlZGVuCisJCQkiU0UiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFN3aXR6ZXJsYW5kCisJCQkiQ0giLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBUYWl3YW4KKwkJCSJUVyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTEsICAzMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQorCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gVHVya2V5CisJCQkiVFIiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKKwkJCQl7IDM2LCAgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFVLCisJCQkiR0IiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKKwkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFVrcmFpbmUKKwkJCSJVQSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gVW5pdGVkX0FyYWJfRW1pcmF0ZXMKKwkJCSJBRSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gVW5pdGVkX1N0YXRlcworCQkJIlVTIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCisJCQkJeyAzNiwgICA0LCAgMTcsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyA1MiwgICA0LCAgMjQsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAxNDksICA1LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFZlbmV6dWVsYQorCQkJIlZFIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCisJCQkJeyAxNDksICA0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIERlZmF1bHQKKwkJCSIiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDExLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKKwkJCQl7IDM2LCAgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDUyLCAgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMTQ5LCAgNSwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCit9OworCitzdGF0aWMgaW5saW5lIFBDSF9SRUdJT04gR2V0Q2hSZWdpb24oCisJSU4gUFVDSEFSIENudHJ5Q29kZSkKK3sKKwlJTlQgbG9vcCA9IDA7CisJUENIX1JFR0lPTiBwQ2hSZWdpb24gPSBOVUxMOworCisJd2hpbGUgKHN0cmNtcChDaFJlZ2lvbltsb29wXS5Db3VudFJlZywgIiIpICE9IDApCisJeworCQlpZiAoc3RybmNtcChDaFJlZ2lvbltsb29wXS5Db3VudFJlZywgQ250cnlDb2RlLCAyKSA9PSAwKQorCQl7CisJCQlwQ2hSZWdpb24gPSAmQ2hSZWdpb25bbG9vcF07CisJCQlicmVhazsKKwkJfQorCQlsb29wKys7CisJfQorCisJaWYgKHBDaFJlZ2lvbiA9PSBOVUxMKQorCQlwQ2hSZWdpb24gPSAmQ2hSZWdpb25bbG9vcF07CisJcmV0dXJuIHBDaFJlZ2lvbjsKK30KKworc3RhdGljIGlubGluZSBWT0lEIENoQmFuZENoZWNrKAorCUlOIFVDSEFSIFBoeU1vZGUsCisJT1VUIFBVQ0hBUiBwQ2hUeXBlKQoreworCXN3aXRjaChQaHlNb2RlKQorCXsKKwkJY2FzZSBQSFlfMTFBOgorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQljYXNlIFBIWV8xMUFOX01JWEVEOgorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJKnBDaFR5cGUgPSBCQU5EXzVHOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExQUJHX01JWEVEOgorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQljYXNlIFBIWV8xMUFHTl9NSVhFRDoKKwkJY2FzZSBQSFlfMTFBQkdOX01JWEVEOgorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJKnBDaFR5cGUgPSBCQU5EX0JPVEg7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJKnBDaFR5cGUgPSBCQU5EXzI0RzsKKwkJCWJyZWFrOworCX0KK30KKworc3RhdGljIGlubGluZSBVQ0hBUiBGaWxsQ2hMaXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBDSF9ERVNQIHBDaERlc3AsCisJSU4gVUNIQVIgT2Zmc2V0LAorCUlOIFVDSEFSIGluY3JlbWVudCkKK3sKKwlJTlQgaSwgaiwgbDsKKwlVQ0hBUiBjaGFubmVsOworCisJaiA9IE9mZnNldDsKKwlmb3IgKGkgPSAwOyBpIDwgcENoRGVzcC0+TnVtT2ZDaDsgaSsrKQorCXsKKwkJY2hhbm5lbCA9IHBDaERlc3AtPkZpcnN0Q2hhbm5lbCArIGkgKiBpbmNyZW1lbnQ7CisJCWZvciAobD0wOyBsPE1BWF9OVU1fT0ZfQ0hBTk5FTFM7IGwrKykKKwkJeworCQkJaWYgKGNoYW5uZWwgPT0gcEFkLT5UeFBvd2VyW2xdLkNoYW5uZWwpCisJCQl7CisJCQkJcEFkLT5DaGFubmVsTGlzdFtqXS5Qb3dlciA9IHBBZC0+VHhQb3dlcltsXS5Qb3dlcjsKKwkJCQlwQWQtPkNoYW5uZWxMaXN0W2pdLlBvd2VyMiA9IHBBZC0+VHhQb3dlcltsXS5Qb3dlcjI7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGwgPT0gTUFYX05VTV9PRl9DSEFOTkVMUykKKwkJCWNvbnRpbnVlOworCisJCXBBZC0+Q2hhbm5lbExpc3Rbal0uQ2hhbm5lbCA9IHBDaERlc3AtPkZpcnN0Q2hhbm5lbCArIGkgKiBpbmNyZW1lbnQ7CisJCXBBZC0+Q2hhbm5lbExpc3Rbal0uTWF4VHhQd3IgPSBwQ2hEZXNwLT5NYXhUeFB3cjsKKwkJcEFkLT5DaGFubmVsTGlzdFtqXS5EZnNSZXEgPSBwQ2hEZXNwLT5EZnNSZXE7CisJCWorKzsKKwl9CisJcEFkLT5DaGFubmVsTGlzdE51bSA9IGo7CisKKwlyZXR1cm4gajsKK30KKworc3RhdGljIGlubGluZSBWT0lEIENyZWF0ZUNoTGlzdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQQ0hfUkVHSU9OIHBDaFJlZ2lvbiwKKwlJTiBVQ0hBUiBHZW9ncmFwaHkpCit7CisJSU5UIGk7CisJVUNIQVIgb2Zmc2V0ID0gMDsKKwlQQ0hfREVTUCBwQ2hEZXNwOworCVVDSEFSIENoVHlwZTsKKwlVQ0hBUiBpbmNyZW1lbnQ7CisKKwlpZiAocENoUmVnaW9uID09IE5VTEwpCisJCXJldHVybjsKKworCUNoQmFuZENoZWNrKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUsICZDaFR5cGUpOworCisJZm9yIChpPTA7IGk8MTA7IGkrKykKKwl7CisJCXBDaERlc3AgPSAmcENoUmVnaW9uLT5DaERlc3BbaV07CisJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPT0gMCkKKwkJCWJyZWFrOworCisJCWlmIChDaFR5cGUgPT0gQkFORF81RykKKwkJeworCQkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA8PSAxNCkKKwkJCQljb250aW51ZTsKKwkJfQorCQllbHNlIGlmIChDaFR5cGUgPT0gQkFORF8yNEcpCisJCXsKKwkJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPiAxNCkKKwkJCQljb250aW51ZTsKKwkJfQorCisJCWlmICgocENoRGVzcC0+R2VvZ3JhcGh5ID09IEJPVEgpCisJCQl8fCAocENoRGVzcC0+R2VvZ3JhcGh5ID09IEdlb2dyYXBoeSkpCisgICAgICAgIHsKKwkJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPiAxNCkKKyAgICAgICAgICAgICAgICBpbmNyZW1lbnQgPSA0OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGluY3JlbWVudCA9IDE7CisJCQlvZmZzZXQgPSBGaWxsQ2hMaXN0KHBBZCwgcENoRGVzcCwgb2Zmc2V0LCBpbmNyZW1lbnQpOworICAgICAgICB9CisJfQorfQorCitzdGF0aWMgaW5saW5lIFZPSUQgQnVpbGRDaGFubmVsTGlzdEV4KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVBDSF9SRUdJT04gcENoUmVnOworCisJcENoUmVnID0gR2V0Q2hSZWdpb24ocEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGUpOworCUNyZWF0ZUNoTGlzdChwQWQsIHBDaFJlZywgcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5KTsKK30KKworc3RhdGljIGlubGluZSBWT0lEIEJ1aWxkQmVhY29uQ2hMaXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBQVUNIQVIgcEJ1ZiwKKwlPVVQJUFVMT05HIHBCdWZMZW4pCit7CisJSU5UIGk7CisJVUxPTkcgVG1wTGVuOworCVBDSF9SRUdJT04gcENoUmVnaW9uOworCVBDSF9ERVNQIHBDaERlc3A7CisJVUNIQVIgQ2hUeXBlOworCisJcENoUmVnaW9uID0gR2V0Q2hSZWdpb24ocEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGUpOworCisJaWYgKHBDaFJlZ2lvbiA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlDaEJhbmRDaGVjayhwQWQtPkNvbW1vbkNmZy5QaHlNb2RlLCAmQ2hUeXBlKTsKKwkqcEJ1ZkxlbiA9IDA7CisKKwlmb3IgKGk9MDsgaTwxMDsgaSsrKQorCXsKKwkJcENoRGVzcCA9ICZwQ2hSZWdpb24tPkNoRGVzcFtpXTsKKwkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA9PSAwKQorCQkJYnJlYWs7CisKKwkJaWYgKENoVHlwZSA9PSBCQU5EXzVHKQorCQl7CisJCQlpZiAocENoRGVzcC0+Rmlyc3RDaGFubmVsIDw9IDE0KQorCQkJCWNvbnRpbnVlOworCQl9CisJCWVsc2UgaWYgKENoVHlwZSA9PSBCQU5EXzI0RykKKwkJeworCQkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA+IDE0KQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKChwQ2hEZXNwLT5HZW9ncmFwaHkgPT0gQk9USCkKKwkJCXx8IChwQ2hEZXNwLT5HZW9ncmFwaHkgPT0gcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5KSkKKwkJeworCQkJTWFrZU91dGdvaW5nRnJhbWUocEJ1ZiArICpwQnVmTGVuLAkJJlRtcExlbiwKKwkJCQkJCQkJMSwgICAgICAgICAgICAgICAgIAkmcENoRGVzcC0+Rmlyc3RDaGFubmVsLAorCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgCSZwQ2hEZXNwLT5OdW1PZkNoLAorCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgCSZwQ2hEZXNwLT5NYXhUeFB3ciwKKwkJCQkJCQkJRU5EX09GX0FSR1MpOworCQkJKnBCdWZMZW4gKz0gVG1wTGVuOworCQl9CisJfQorfQorCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK3N0YXRpYyBpbmxpbmUgQk9PTEVBTiBJc1ZhbGlkQ2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiBjaGFubmVsKQorCit7CisJSU5UIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCA9PSBjaGFubmVsKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gcEFkLT5DaGFubmVsTGlzdE51bSkKKwkJcmV0dXJuIEZBTFNFOworCWVsc2UKKwkJcmV0dXJuIFRSVUU7Cit9CisKKworc3RhdGljIGlubGluZSBVQ0hBUiBHZXRFeHRDaCgKKwlJTiBVQ0hBUiBDaGFubmVsLAorCUlOIFVDSEFSIERpcmVjdGlvbikKK3sKKwlDSEFSIEV4dENoOworCisJaWYgKERpcmVjdGlvbiA9PSBFWFRDSEFfQUJPVkUpCisJCUV4dENoID0gQ2hhbm5lbCArIDQ7CisJZWxzZQorCQlFeHRDaCA9IChDaGFubmVsIC0gNCkgPiAwID8gKENoYW5uZWwgLSA0KSA6IDA7CisKKwlyZXR1cm4gRXh0Q2g7Cit9CisKKworc3RhdGljIGlubGluZSBWT0lEIE5fQ2hhbm5lbENoZWNrKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCS8vVUNIQVIgQ2hhbm5lbE51bSA9IHBBZC0+Q2hhbm5lbExpc3ROdW07CisJVUNIQVIgQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPT0gQldfNDApKQorCXsKKwkJaWYgKENoYW5uZWwgPiAxNCkKKwkJeworCQkJaWYgKChDaGFubmVsID09IDM2KSB8fCAoQ2hhbm5lbCA9PSA0NCkgfHwgKENoYW5uZWwgPT0gNTIpIHx8IChDaGFubmVsID09IDYwKSB8fCAoQ2hhbm5lbCA9PSAxMDApIHx8IChDaGFubmVsID09IDEwOCkgfHwKKwkJCSAgICAoQ2hhbm5lbCA9PSAxMTYpIHx8IChDaGFubmVsID09IDEyNCkgfHwgKENoYW5uZWwgPT0gMTMyKSB8fCAoQ2hhbm5lbCA9PSAxNDkpIHx8IChDaGFubmVsID09IDE1NykpCisJCQl7CisJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9BQk9WRTsKKwkJCX0KKwkJCWVsc2UgaWYgKChDaGFubmVsID09IDQwKSB8fCAoQ2hhbm5lbCA9PSA0OCkgfHwgKENoYW5uZWwgPT0gNTYpIHx8IChDaGFubmVsID09IDY0KSB8fCAoQ2hhbm5lbCA9PSAxMDQpIHx8IChDaGFubmVsID09IDExMikgfHwKKwkJCQkJKENoYW5uZWwgPT0gMTIwKSB8fCAoQ2hhbm5lbCA9PSAxMjgpIHx8IChDaGFubmVsID09IDEzNikgfHwgKENoYW5uZWwgPT0gMTUzKSB8fCAoQ2hhbm5lbCA9PSAxNjEpKQorCQkJeworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfQkVMT1c7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzIwOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJZG8KKwkJCXsKKwkJCQlVQ0hBUiBFeHRDaDsKKwkJCQlVQ0hBUiBEaXIgPSBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBOworCQkJCUV4dENoID0gR2V0RXh0Q2goQ2hhbm5lbCwgRGlyKTsKKwkJCQlpZiAoSXNWYWxpZENoYW5uZWwocEFkLCBFeHRDaCkpCisJCQkJCWJyZWFrOworCisJCQkJRGlyID0gKERpciA9PSBFWFRDSEFfQUJPVkUpID8gRVhUQ0hBX0JFTE9XIDogRVhUQ0hBX0FCT1ZFOworCQkJCUV4dENoID0gR2V0RXh0Q2goQ2hhbm5lbCwgRGlyKTsKKwkJCQlpZiAoSXNWYWxpZENoYW5uZWwocEFkLCBFeHRDaCkpCisJCQkJeworCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRGlyOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzIwOworCQkJfSB3aGlsZShGQUxTRSk7CisKKwkJCWlmIChDaGFubmVsID09IDE0KQorCQkJeworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPSBCV18yMDsKKwkJCQkvL3BBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfTk9ORTsJLy8gV2UgZGlkbid0IHNldCB0aGUgRXh0Q2ggYXMgTk9ORSBkdWUgdG8gaXQnbGwgc2V0IGluIFJUTVBTZXRIVCgpCisJCQl9CisjaWYgMAorCQkJc3dpdGNoIChwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uICAmIDB4N2YpCisJCQl7CisJCQkJY2FzZSBSRUdJT05fMF9CR19CQU5EOgkvLyAxIC0xMQorCQkJCWNhc2UgUkVHSU9OXzFfQkdfQkFORDoJLy8gMSAtIDEzCisJCQkJY2FzZSBSRUdJT05fNV9CR19CQU5EOgkvLyAxIC0gMTQKKwkJCQkJaWYgKENoYW5uZWwgPD0gNCkKKwkJCQkJeworCQkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9BQk9WRTsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChDaGFubmVsID49IDgpCisJCQkJCXsKKwkJCQkJCWlmICgoQ2hhbm5lbE51bSAtIENoYW5uZWwpIDwgNCkKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRVhUQ0hBX0JFTE9XOworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBSRUdJT05fMl9CR19CQU5EOgkvLyAxMCAtIDExCisJCQkJY2FzZSBSRUdJT05fM19CR19CQU5EOgkvLyAxMCAtIDEzCisJCQkJY2FzZSBSRUdJT05fNF9CR19CQU5EOgkvLyAxNAorCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgID0gQldfMjA7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBSRUdJT05fNl9CR19CQU5EOgkvLyAzIC0gOQorCQkJCQlpZiAoQ2hhbm5lbCA8PSA1KQorCQkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9BQk9WRTsKKwkJCQkJZWxzZSBpZiAoQ2hhbm5lbCA9PSA2KQorCQkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzIwOworCQkJCQllbHNlIGlmIChDaGFubmVsID49IDcpCisJCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRVhUQ0hBX0JFTE9XOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgUkVHSU9OXzdfQkdfQkFORDogIC8vIDUgLSAxMworCQkJCQlpZiAoQ2hhbm5lbCA8PSA4KQorCQkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9BQk9WRTsKKwkJCQkJZWxzZSBpZiAoQ2hhbm5lbCA+PSAxMCkKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfQkVMT1c7CisJCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoJLy8gRXJyb3IuIHNob3VsZCBuZXZlciBoYXBwZW4KKwkJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYKKwkJfQorCX0KKworCit9CisKKworc3RhdGljIGlubGluZSBWT0lEIE5fU2V0Q2VuQ2goCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PSBCV180MCkKKwl7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID09IEVYVENIQV9BQk9WRSkKKwkJeworCQkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsICsgMjsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID09IDE0KQorCQkJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCAtIDE7CisJCQllbHNlCisJCQkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsIC0gMjsKKwkJfQorCX0KKwllbHNlCisJeworCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJfQorfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisKK3N0YXRpYyBpbmxpbmUgVUlOVDggR2V0Q3VudHJ5TWF4VHhQd3IoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUlOVDggY2hhbm5lbCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCA9PSBjaGFubmVsKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gcEFkLT5DaGFubmVsTGlzdE51bSkKKwkJcmV0dXJuIDB4ZmY7CisJZWxzZQorCQlyZXR1cm4gcEFkLT5DaGFubmVsTGlzdFtpXS5NYXhUeFB3cjsKK30KKyNlbmRpZiAvLyBfX0NITElTVF9IX18KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vMjg2MF9ydG1wX2luaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uLzI4NjBfcnRtcF9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ2ZjMwNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uLzI4NjBfcnRtcF9pbml0LmMKQEAgLTAsMCArMSw5MjIgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJMjg2MF9ydG1wX2luaXQuYworCisJQWJzdHJhY3Q6CisJTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVBhdWwgTGluICAgIDIwMDItMDgtMDEgICAgY3JlYXRlZAorICAgIEpvaG4gQ2hhbmcgIDIwMDQtMDgtMjAgICAgUlQyNTYxLzI2NjEgdXNlIHNjYXR0ZXItZ2F0aGVyIHNjaGVtZQorICAgIEphbiBMZWUgIDIwMDYtMDktMTUgICAgUlQyODYwLiBDaGFuZ2UgZm9yIDgwMi4xMW4gLCBFRVBST00sIExlZCwgQkEsIEhULgorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworCisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUFsbG9jYXRlIERNQSBtZW1vcnkgYmxvY2tzIGZvciBzZW5kLCByZWNlaXZlCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTkRJU19TVEFUVVNfU1VDQ0VTUworCQlORElTX1NUQVRVU19GQUlMVVJFCisJCU5ESVNfU1RBVFVTX1JFU09VUkNFUworCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUwlSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlORElTX1NUQVRVUwkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlVTE9ORwkJCVJpbmdCYXNlUGFIaWdoOworCVVMT05HCQkJUmluZ0Jhc2VQYUxvdzsKKwlQVk9JRAkJCVJpbmdCYXNlVmE7CisJSU5UCQkJCWluZGV4LCBudW07CisJUFRYRF9TVFJVQwkJcFR4RDsKKwlQUlhEX1NUUlVDCQlwUnhEOworCVVMT05HCQkJRXJyb3JWYWx1ZSA9IDA7CisJUFJUTVBfVFhfUklORwlwVHhSaW5nOworCVBSVE1QX0RNQUJVRglwRG1hQnVmOworCVBORElTX1BBQ0tFVAlwUGFja2V0OworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFJUTVBBbGxvY1R4UnhSaW5nTWVtb3J5XG4iKSk7CisJZG8KKwl7CisJCS8vCisJCS8vIEFsbG9jYXRlIGFsbCByaW5nIGRlc2NyaXB0b3JzLCBpbmNsdWRlIFR4RCwgUnhELCBNZ210RC4KKwkJLy8gQWx0aG91Z2ggZWFjaCBzaXplIGlzIGRpZmZlcmVudCwgdG8gcHJldmVudCBjYWNoZWxpbmUgYW5kIGFsaWdubWVudAorCQkvLyBpc3N1ZSwgSSBpbnRlbnRpb25hbCBzZXQgdGhlbSBhbGwgdG8gNjQgYnl0ZXMuCisJCS8vCisJCWZvciAobnVtPTA7IG51bTxOVU1fT0ZfVFhfUklORzsgbnVtKyspCisJCXsKKwkJCVVMT05HICBCdWZCYXNlUGFIaWdoOworCQkJVUxPTkcgIEJ1ZkJhc2VQYUxvdzsKKwkJCVBWT0lEICBCdWZCYXNlVmE7CisKKwkJCS8vCisJCQkvLyBBbGxvY2F0ZSBUeCByaW5nIGRlc2NyaXB0b3IncyBtZW1vcnkgKDUgVFggcmluZ3MgPSA0IEFDcyArIDEgSENDQSkKKwkJCS8vCisJCQlwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1NpemUgPSBUWF9SSU5HX1NJWkUgKiBUWERfU0laRTsKKwkJCVJUTVBfQWxsb2NhdGVUeERlc2NNZW1vcnkoCisJCQkJcEFkLAorCQkJCW51bSwKKwkJCQlwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1NpemUsCisJCQkJRkFMU0UsCisJCQkJJnBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jVmEsCisJCQkJJnBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jUGEpOworCisJCQlpZiAocEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NWYSA9PSBOVUxMKQorCQkJeworCQkJCUVycm9yVmFsdWUgPSBFUlJMT0dfT1VUX09GX1NIQVJFRF9NRU1PUlk7CisJCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlclxuIikpOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLy8gWmVybyBpbml0IHRoaXMgbWVtb3J5IGJsb2NrCisJCQlOZGlzWmVyb01lbW9yeShwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1ZhLCBwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1NpemUpOworCisJCQkvLyBTYXZlIFBBICYgVkEgZm9yIGZ1cnRoZXIgb3BlcmF0aW9uCisJCQlSaW5nQmFzZVBhSGlnaCA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1BhKTsKKwkJCVJpbmdCYXNlUGFMb3cgID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cgKHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jUGEpOworCQkJUmluZ0Jhc2VWYSAgICAgPSBwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1ZhOworCisJCQkvLworCQkJLy8gQWxsb2NhdGUgYWxsIDFzdCBUWEJ1ZidzIG1lbW9yeSBmb3IgdGhpcyBUeFJpbmcKKwkJCS8vCisJCQlwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1NpemUgPSBUWF9SSU5HX1NJWkUgKiBUWF9ETUFfMVNUX0JVRkZFUl9TSVpFOworCQkJUlRNUF9BbGxvY2F0ZUZpcnN0VHhCdWZmZXIoCisJCQkJcEFkLAorCQkJCW51bSwKKwkJCQlwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1NpemUsCisJCQkJRkFMU0UsCisJCQkJJnBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jVmEsCisJCQkJJnBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jUGEpOworCisJCQlpZiAocEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NWYSA9PSBOVUxMKQorCQkJeworCQkJCUVycm9yVmFsdWUgPSBFUlJMT0dfT1VUX09GX1NIQVJFRF9NRU1PUlk7CisJCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlclxuIikpOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLy8gWmVybyBpbml0IHRoaXMgbWVtb3J5IGJsb2NrCisJCQlOZGlzWmVyb01lbW9yeShwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1ZhLCBwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1NpemUpOworCisJCQkvLyBTYXZlIFBBICYgVkEgZm9yIGZ1cnRoZXIgb3BlcmF0aW9uCisJCQlCdWZCYXNlUGFIaWdoID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NIaWdoKHBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jUGEpOworCQkJQnVmQmFzZVBhTG93ICA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93IChwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1BhKTsKKwkJCUJ1ZkJhc2VWYSAgICAgPSBwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1ZhOworCisJCQkvLworCQkJLy8gSW5pdGlhbGl6ZSBUeCBSaW5nIERlc2NyaXB0b3IgYW5kIGFzc29jaWF0ZWQgYnVmZmVyIG1lbW9yeQorCQkJLy8KKwkJCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbbnVtXTsKKwkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFRYX1JJTkdfU0laRTsgaW5kZXgrKykKKwkJCXsKKwkJCQlwVHhSaW5nLT5DZWxsW2luZGV4XS5wTmRpc1BhY2tldCA9IE5VTEw7CisJCQkJcFR4UmluZy0+Q2VsbFtpbmRleF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKwkJCQkvLyBJbml0IFR4IFJpbmcgU2l6ZSwgVmEsIFBhIHZhcmlhYmxlcworCQkJCXBUeFJpbmctPkNlbGxbaW5kZXhdLkFsbG9jU2l6ZSA9IFRYRF9TSVpFOworCQkJCXBUeFJpbmctPkNlbGxbaW5kZXhdLkFsbG9jVmEgPSBSaW5nQmFzZVZhOworCQkJCVJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwVHhSaW5nLT5DZWxsW2luZGV4XS5BbGxvY1BhLCBSaW5nQmFzZVBhSGlnaCk7CisJCQkJUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NMb3cgKHBUeFJpbmctPkNlbGxbaW5kZXhdLkFsbG9jUGEsIFJpbmdCYXNlUGFMb3cpOworCisJCQkJLy8gU2V0dXAgVHggQnVmZmVyIHNpemUgJiBhZGRyZXNzLiBvbmx5IDgwMi4xMSBoZWFkZXIgd2lsbCBzdG9yZSBpbiB0aGlzIHNwYWNlCisJCQkJcERtYUJ1ZiA9ICZwVHhSaW5nLT5DZWxsW2luZGV4XS5EbWFCdWY7CisJCQkJcERtYUJ1Zi0+QWxsb2NTaXplID0gVFhfRE1BXzFTVF9CVUZGRVJfU0laRTsKKwkJCQlwRG1hQnVmLT5BbGxvY1ZhID0gQnVmQmFzZVZhOworCQkJCVJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwRG1hQnVmLT5BbGxvY1BhLCBCdWZCYXNlUGFIaWdoKTsKKwkJCQlSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdyhwRG1hQnVmLT5BbGxvY1BhLCBCdWZCYXNlUGFMb3cpOworCisJCQkJLy8gbGluayB0aGUgcHJlLWFsbG9jYXRlZCBUeEJ1ZiB0byBUWEQKKwkJCQlwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbaW5kZXhdLkFsbG9jVmE7CisJCQkJcFR4RC0+U0RQdHIwID0gQnVmQmFzZVBhTG93OworCQkJCS8vIGFkdmFuY2UgdG8gbmV4dCByaW5nIGRlc2NyaXB0b3IgYWRkcmVzcworCQkJCXBUeEQtPkRNQURPTkUgPSAxOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCQlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKKyNlbmRpZgorCQkJCVJpbmdCYXNlUGFMb3cgKz0gVFhEX1NJWkU7CisJCQkJUmluZ0Jhc2VWYSA9IChQVUNIQVIpIFJpbmdCYXNlVmEgKyBUWERfU0laRTsKKworCQkJCS8vIGFkdmFuY2UgdG8gbmV4dCBUeEJ1ZiBhZGRyZXNzCisJCQkJQnVmQmFzZVBhTG93ICs9IFRYX0RNQV8xU1RfQlVGRkVSX1NJWkU7CisJCQkJQnVmQmFzZVZhID0gKFBVQ0hBUikgQnVmQmFzZVZhICsgVFhfRE1BXzFTVF9CVUZGRVJfU0laRTsKKwkJCX0KKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4UmluZ1slZF06IHRvdGFsICVkIGVudHJ5IGFsbG9jYXRlZFxuIiwgbnVtLCBpbmRleCkpOworCQl9CisJCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTKQorCQkJYnJlYWs7CisKKwkJLy8KKwkJLy8gQWxsb2NhdGUgTUdNVCByaW5nIGRlc2NyaXB0b3IncyBtZW1vcnkgZXhjZXB0IFR4IHJpbmcgd2hpY2ggYWxsb2NhdGVkIGVhcmlsZXIKKwkJLy8KKwkJcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplID0gTUdNVF9SSU5HX1NJWkUgKiBUWERfU0laRTsKKwkJUlRNUF9BbGxvY2F0ZU1nbXREZXNjTWVtb3J5KAorCQkJcEFkLAorCQkJcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplLAorCQkJRkFMU0UsCisJCQkmcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSwKKwkJCSZwQWQtPk1nbXREZXNjUmluZy5BbGxvY1BhKTsKKworCQlpZiAocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSA9PSBOVUxMKQorCQl7CisJCQlFcnJvclZhbHVlID0gRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZOworCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlclxuIikpOworCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOworCQkJYnJlYWs7CisJCX0KKworCQkvLyBaZXJvIGluaXQgdGhpcyBtZW1vcnkgYmxvY2sKKwkJTmRpc1plcm9NZW1vcnkocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSwgcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplKTsKKworCQkvLyBTYXZlIFBBICYgVkEgZm9yIGZ1cnRoZXIgb3BlcmF0aW9uCisJCVJpbmdCYXNlUGFIaWdoID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NIaWdoKHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jUGEpOworCQlSaW5nQmFzZVBhTG93ICA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93IChwQWQtPk1nbXREZXNjUmluZy5BbGxvY1BhKTsKKwkJUmluZ0Jhc2VWYSAgICAgPSBwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhOworCisJCS8vCisJCS8vIEluaXRpYWxpemUgTUdNVCBSaW5nIGFuZCBhc3NvY2lhdGVkIGJ1ZmZlciBtZW1vcnkKKwkJLy8KKwkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTUdNVF9SSU5HX1NJWkU7IGluZGV4KyspCisJCXsKKwkJCXBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0ucE5kaXNQYWNrZXQgPSBOVUxMOworCQkJcEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOworCQkJLy8gSW5pdCBNR01UIFJpbmcgU2l6ZSwgVmEsIFBhIHZhcmlhYmxlcworCQkJcEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5BbGxvY1NpemUgPSBUWERfU0laRTsKKwkJCXBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0uQWxsb2NWYSA9IFJpbmdCYXNlVmE7CisJCQlSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0hpZ2gocEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5BbGxvY1BhLCBSaW5nQmFzZVBhSGlnaCk7CisJCQlSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdyAocEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5BbGxvY1BhLCBSaW5nQmFzZVBhTG93KTsKKworCQkJLy8gT2Zmc2V0IHRvIG5leHQgcmluZyBkZXNjcmlwdG9yIGFkZHJlc3MKKwkJCVJpbmdCYXNlUGFMb3cgKz0gVFhEX1NJWkU7CisJCQlSaW5nQmFzZVZhID0gKFBVQ0hBUikgUmluZ0Jhc2VWYSArIFRYRF9TSVpFOworCisJCQkvLyBsaW5rIHRoZSBwcmUtYWxsb2NhdGVkIFR4QnVmIHRvIFRYRAorCQkJcFR4RCA9IChQVFhEX1NUUlVDKSBwQWQtPk1nbXRSaW5nLkNlbGxbaW5kZXhdLkFsbG9jVmE7CisJCQlwVHhELT5ETUFET05FID0gMTsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworI2VuZGlmCisJCQkvLyBubyBwcmUtYWxsb2NhdGVkIGJ1ZmZlciByZXF1aXJlZCBpbiBNZ210UmluZyBmb3Igc2NhdHRlci1nYXRoZXIgY2FzZQorCQl9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1HTVQgUmluZzogdG90YWwgJWQgZW50cnkgYWxsb2NhdGVkXG4iLCBpbmRleCkpOworCisJCS8vCisJCS8vIEFsbG9jYXRlIFJYIHJpbmcgZGVzY3JpcHRvcidzIG1lbW9yeSBleGNlcHQgVHggcmluZyB3aGljaCBhbGxvY2F0ZWQgZWFyaWxlcgorCQkvLworCQlwQWQtPlJ4RGVzY1JpbmcuQWxsb2NTaXplID0gUlhfUklOR19TSVpFICogUlhEX1NJWkU7CisJCVJUTVBfQWxsb2NhdGVSeERlc2NNZW1vcnkoCisJCQlwQWQsCisJCQlwQWQtPlJ4RGVzY1JpbmcuQWxsb2NTaXplLAorCQkJRkFMU0UsCisJCQkmcEFkLT5SeERlc2NSaW5nLkFsbG9jVmEsCisJCQkmcEFkLT5SeERlc2NSaW5nLkFsbG9jUGEpOworCisJCWlmIChwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYSA9PSBOVUxMKQorCQl7CisJCQlFcnJvclZhbHVlID0gRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZOworCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlclxuIikpOworCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOworCQkJYnJlYWs7CisJCX0KKworCQkvLyBaZXJvIGluaXQgdGhpcyBtZW1vcnkgYmxvY2sKKwkJTmRpc1plcm9NZW1vcnkocEFkLT5SeERlc2NSaW5nLkFsbG9jVmEsIHBBZC0+UnhEZXNjUmluZy5BbGxvY1NpemUpOworCisKKwkJcHJpbnRrKCJSWCBERVNDICVwICBzaXplID0gJWxkXG4iLCBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYSwKKwkJCQkJcEFkLT5SeERlc2NSaW5nLkFsbG9jU2l6ZSk7CisKKwkJLy8gU2F2ZSBQQSAmIFZBIGZvciBmdXJ0aGVyIG9wZXJhdGlvbgorCQlSaW5nQmFzZVBhSGlnaCA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwQWQtPlJ4RGVzY1JpbmcuQWxsb2NQYSk7CisJCVJpbmdCYXNlUGFMb3cgID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cgKHBBZC0+UnhEZXNjUmluZy5BbGxvY1BhKTsKKwkJUmluZ0Jhc2VWYSAgICAgPSBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYTsKKworCQkvLworCQkvLyBJbml0aWFsaXplIFJ4IFJpbmcgYW5kIGFzc29jaWF0ZWQgYnVmZmVyIG1lbW9yeQorCQkvLworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBSWF9SSU5HX1NJWkU7IGluZGV4KyspCisJCXsKKwkJCS8vIEluaXQgUlggUmluZyBTaXplLCBWYSwgUGEgdmFyaWFibGVzCisJCQlwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5BbGxvY1NpemUgPSBSWERfU0laRTsKKwkJCXBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkFsbG9jVmEgPSBSaW5nQmFzZVZhOworCQkJUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NIaWdoKHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkFsbG9jUGEsIFJpbmdCYXNlUGFIaWdoKTsKKwkJCVJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzTG93IChwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5BbGxvY1BhLCBSaW5nQmFzZVBhTG93KTsKKworCQkJLy8gT2Zmc2V0IHRvIG5leHQgcmluZyBkZXNjcmlwdG9yIGFkZHJlc3MKKwkJCVJpbmdCYXNlUGFMb3cgKz0gUlhEX1NJWkU7CisJCQlSaW5nQmFzZVZhID0gKFBVQ0hBUikgUmluZ0Jhc2VWYSArIFJYRF9TSVpFOworCisJCQkvLyBTZXR1cCBSeCBhc3NvY2lhdGVkIEJ1ZmZlciBzaXplICYgYWxsb2NhdGUgc2hhcmUgbWVtb3J5CisJCQlwRG1hQnVmID0gJnBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkRtYUJ1ZjsKKwkJCXBEbWFCdWYtPkFsbG9jU2l6ZSA9IFJYX0JVRkZFUl9BR0dSRVNJWkU7CisJCQlwUGFja2V0ID0gUlRNUF9BbGxvY2F0ZVJ4UGFja2V0QnVmZmVyKAorCQkJCXBBZCwKKwkJCQlwRG1hQnVmLT5BbGxvY1NpemUsCisJCQkJRkFMU0UsCisJCQkJJnBEbWFCdWYtPkFsbG9jVmEsCisJCQkJJnBEbWFCdWYtPkFsbG9jUGEpOworCisJCQkvKiBrZWVwIGFsbG9jYXRlZCByeCBwYWNrZXQgKi8KKwkJCXBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLnBOZGlzUGFja2V0ID0gcFBhY2tldDsKKworCQkJLy8gRXJyb3IgaGFuZGxpbmcKKwkJCWlmIChwRG1hQnVmLT5BbGxvY1ZhID09IE5VTEwpCisJCQl7CisJCQkJRXJyb3JWYWx1ZSA9IEVSUkxPR19PVVRfT0ZfU0hBUkVEX01FTU9SWTsKKwkJCQlEQkdQUklOVF9FUlIoKCJGYWlsZWQgdG8gYWxsb2NhdGUgUnhSaW5nJ3MgMXN0IGJ1ZmZlclxuIikpOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLy8gWmVybyBpbml0IHRoaXMgbWVtb3J5IGJsb2NrCisJCQlOZGlzWmVyb01lbW9yeShwRG1hQnVmLT5BbGxvY1ZhLCBwRG1hQnVmLT5BbGxvY1NpemUpOworCisJCQkvLyBXcml0ZSBSeEQgYnVmZmVyIGFkZHJlc3MgJiBhbGxvY2F0ZWQgYnVmZmVyIGxlbmd0aAorCQkJcFJ4RCA9IChQUlhEX1NUUlVDKSBwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5BbGxvY1ZhOworCQkJcFJ4RC0+U0RQMCA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBEbWFCdWYtPkFsbG9jUGEpOworCQkJcFJ4RC0+RERPTkUgPSAwOworCisjaWZkZWYgUlRfQklHX0VORElBTgorCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwUnhELCBUWVBFX1JYRCk7CisjZW5kaWYKKwkJfQorCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJ4IFJpbmc6IHRvdGFsICVkIGVudHJ5IGFsbG9jYXRlZFxuIiwgaW5kZXgpKTsKKworCX0Jd2hpbGUgKEZBTFNFKTsKKworCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+RnJhZ0ZyYW1lLCBzaXplb2YoRlJBR01FTlRfRlJBTUUpKTsKKwlwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCA9ICBSVE1QX0FsbG9jYXRlRnJhZ1BhY2tldEJ1ZmZlcihwQWQsIFJYX0JVRkZFUl9OT1JNU0laRSk7CisKKwlpZiAocEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQgPT0gTlVMTCkKKwl7CisJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwl9CisKKwlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQkvLyBMb2cgZXJyb3IgaW5mb3JhbXRpb24KKwkJTmRpc1dyaXRlRXJyb3JMb2dFbnRyeSgKKwkJCXBBZC0+QWRhcHRlckhhbmRsZSwKKwkJCU5ESVNfRVJST1JfQ09ERV9PVVRfT0ZfUkVTT1VSQ0VTLAorCQkJMSwKKwkJCUVycm9yVmFsdWUpOworCX0KKworCURCR1BSSU5UX1MoU3RhdHVzLCAoIjwtLSBSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeSwgU3RhdHVzPSV4XG4iLCBTdGF0dXMpKTsKKwlyZXR1cm4gU3RhdHVzOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlJbml0aWFsaXplIHRyYW5zbWl0IGRhdGEgc3RydWN0dXJlcworCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKwkJSW5pdGlhbGl6ZSBhbGwgdHJhbnNtaXQgcmVsZWF0ZWQgcHJpdmF0ZSBidWZmZXIsIGluY2x1ZGUgdGhvc2UgZGVmaW5lCisJCWluIFJUTVBfQURBUFRFUiBzdHJ1Y3R1cmUgYW5kIGFsbCBwcml2YXRlIGRhdGEgc3RydWN0dXJlcy4KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJTklDSW5pdFR4UnhSaW5nQW5kQmFja2xvZ1F1ZXVlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCS8vV1BETUFfR0xPX0NGR19TVFJVQwlHbG9DZmc7CisJaW50IGk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0+IE5JQ0luaXRUeFJ4UmluZ0FuZEJhY2tsb2dRdWV1ZVxuIikpOworCisJLy8gSW5pdGlhbGl6ZSBhbGwgdHJhbnNtaXQgcmVsYXRlZCBzb2Z0d2FyZSBxdWV1ZXMKKwlJbml0aWFsaXplUXVldWVIZWFkZXIoJnBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CRV0pOworCUluaXRpYWxpemVRdWV1ZUhlYWRlcigmcEFkLT5UeFN3UXVldWVbUUlEX0FDX0JLXSk7CisJSW5pdGlhbGl6ZVF1ZXVlSGVhZGVyKCZwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVkldKTsKKwlJbml0aWFsaXplUXVldWVIZWFkZXIoJnBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WT10pOworCUluaXRpYWxpemVRdWV1ZUhlYWRlcigmcEFkLT5UeFN3UXVldWVbUUlEX0hDQ0FdKTsKKworCS8vIEluaXQgUlggUmluZyBpbmRleCBwb2ludGVyCisJcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHggPSAwOworCXBBZC0+UnhSaW5nLlJ4Q3B1SWR4ID0gUlhfUklOR19TSVpFIC0gMTsKKworCS8vIEluaXQgVFggcmluZ3MgaW5kZXggcG9pbnRlcgorCQlmb3IgKGk9MDsgaTxOVU1fT0ZfVFhfUklORzsgaSsrKQorCQl7CisJCQlwQWQtPlR4UmluZ1tpXS5UeFN3RnJlZUlkeCA9IDA7CisJCQlwQWQtPlR4UmluZ1tpXS5UeENwdUlkeCA9IDA7CisJCX0KKworCS8vIGluaXQgTUdNVCByaW5nIGluZGV4IHBvaW50ZXIKKwlwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ID0gMDsKKwlwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4ID0gMDsKKworCXBBZC0+UHJpdmF0ZUluZm8uVHhSaW5nRnVsbENudCAgICAgICA9IDA7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJlc2V0IE5JQyBBc2ljcy4gQ2FsbCBhZnRlciByZXN0IERNQS4gU28gcmVzZXQgVFhfQ1RYX0lEWCB0byB6ZXJvLgorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKwkJUmVzZXQgTklDIHRvIGluaXRpYWwgc3RhdGUgQVMgSVMgc3lzdGVtIGJvb3QgdXAgdGltZS4KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFJpbmdDbGVhblVwKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJUmluZ1R5cGUpCit7CisJUFRYRF9TVFJVQwkJcFR4RDsKKwlQUlhEX1NUUlVDCQlwUnhEOworCVBRVUVVRV9FTlRSWQlwRW50cnk7CisJUE5ESVNfUEFDS0VUCXBQYWNrZXQ7CisJaW50CQkJCWk7CisJUFJUTVBfVFhfUklORwlwVHhSaW5nOworCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBSaW5nQ2xlYW5VcChSaW5nSWR4PSVkLCBQZW5kaW5nLU5ESVM9JWxkKVxuIiwgUmluZ1R5cGUsIHBBZC0+UmFsaW5rQ291bnRlcnMuUGVuZGluZ05kaXNQYWNrZXRDb3VudCkpOworCXN3aXRjaCAoUmluZ1R5cGUpCisJeworCQljYXNlIFFJRF9BQ19CSzoKKwkJY2FzZSBRSURfQUNfQkU6CisJCWNhc2UgUUlEX0FDX1ZJOgorCQljYXNlIFFJRF9BQ19WTzoKKwkJY2FzZSBRSURfSENDQToKKwkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKKwkJCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbUmluZ1R5cGVdOworCisJCQkvLyBXZSBoYXZlIHRvIGNsZWFuIGFsbCBkZXNjcmlwdG9ycyBpbiBjYXNlIHNvbWUgZXJyb3IgaGFwcGVuZWQgd2l0aCByZXNldAorCQkJZm9yIChpPTA7IGk8VFhfUklOR19TSVpFOyBpKyspIC8vIFdlIGhhdmUgdG8gc2NhbiBhbGwgVFggcmluZworCQkJeworCQkJCXBUeEQgID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbaV0uQWxsb2NWYTsKKworCQkJCXBQYWNrZXQgPSAoUE5ESVNfUEFDS0VUKSBwVHhSaW5nLT5DZWxsW2ldLnBOZGlzUGFja2V0OworCQkJCS8vIHJlbGVhc2Ugc2NhdHRlci1hbmQtZ2F0aGVyIE5ESVNfUEFDS0VUCisJCQkJaWYgKHBQYWNrZXQpCisJCQkJeworCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkJCXBUeFJpbmctPkNlbGxbaV0ucE5kaXNQYWNrZXQgPSBOVUxMOworCQkJCX0KKworCQkJCXBQYWNrZXQgPSAoUE5ESVNfUEFDS0VUKSBwVHhSaW5nLT5DZWxsW2ldLnBOZXh0TmRpc1BhY2tldDsKKwkJCQkvLyByZWxlYXNlIHNjYXR0ZXItYW5kLWdhdGhlciBORElTX1BBQ0tFVAorCQkJCWlmIChwUGFja2V0KQorCQkJCXsKKwkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJCQlwVHhSaW5nLT5DZWxsW2ldLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7CisJCQkJfQorCQkJfQorCisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0RUWF9JRFgwICsgUmluZ1R5cGUgKiAweDEwLCAmcFR4UmluZy0+VHhEbWFJZHgpOworCQkJcFR4UmluZy0+VHhTd0ZyZWVJZHggPSBwVHhSaW5nLT5UeERtYUlkeDsKKwkJCXBUeFJpbmctPlR4Q3B1SWR4ID0gcFR4UmluZy0+VHhEbWFJZHg7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DVFhfSURYMCArIFJpbmdUeXBlICogMHgxMCwgcFR4UmluZy0+VHhDcHVJZHgpOworCisJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKKwkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKKwkJCXdoaWxlIChwQWQtPlR4U3dRdWV1ZVtSaW5nVHlwZV0uSGVhZCAhPSBOVUxMKQorCQkJeworCQkJCXBFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZSgmcEFkLT5UeFN3UXVldWVbUmluZ1R5cGVdKTsKKwkJCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBFbnRyeSk7CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUmVsZWFzZSAxIE5ESVMgcGFja2V0IGZyb20gcy93IGJhY2tsb2cgcXVldWVcbiIpKTsKKwkJCX0KKwkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworCQkJYnJlYWs7CisKKwkJY2FzZSBRSURfTUdNVDoKKwkJCS8vIFdlIGhhdmUgdG8gY2xlYW4gYWxsIGRlc2NyaXB0b3JzIGluIGNhc2Ugc29tZSBlcnJvciBoYXBwZW5lZCB3aXRoIHJlc2V0CisJCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1nbXRSaW5nTG9jayk7CisKKwkJCWZvciAoaT0wOyBpPE1HTVRfUklOR19TSVpFOyBpKyspCisJCQl7CisJCQkJcFR4RCAgPSAoUFRYRF9TVFJVQykgcEFkLT5NZ210UmluZy5DZWxsW2ldLkFsbG9jVmE7CisKKwkJCQlwUGFja2V0ID0gKFBORElTX1BBQ0tFVCkgcEFkLT5NZ210UmluZy5DZWxsW2ldLnBOZGlzUGFja2V0OworCQkJCS8vIHJsZWFzZSBzY2F0dGVyLWFuZC1nYXRoZXIgTkRJU19QQUNLRVQKKwkJCQlpZiAocFBhY2tldCkKKwkJCQl7CisJCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjAsIHBUeEQtPlNETGVuMCwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCQl9CisJCQkJcEFkLT5NZ210UmluZy5DZWxsW2ldLnBOZGlzUGFja2V0ID0gTlVMTDsKKworCQkJCXBQYWNrZXQgPSAoUE5ESVNfUEFDS0VUKSBwQWQtPk1nbXRSaW5nLkNlbGxbaV0ucE5leHROZGlzUGFja2V0OworCQkJCS8vIHJlbGVhc2Ugc2NhdHRlci1hbmQtZ2F0aGVyIE5ESVNfUEFDS0VUCisJCQkJaWYgKHBQYWNrZXQpCisJCQkJeworCQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCBwVHhELT5TRExlbjEsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkJfQorCQkJCXBBZC0+TWdtdFJpbmcuQ2VsbFtpXS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOworCisJCQl9CisKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfTUdNVERUWF9JRFgsICZwQWQtPk1nbXRSaW5nLlR4RG1hSWR4KTsKKwkJCXBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggPSBwQWQtPk1nbXRSaW5nLlR4RG1hSWR4OworCQkJcEFkLT5NZ210UmluZy5UeENwdUlkeCA9IHBBZC0+TWdtdFJpbmcuVHhEbWFJZHg7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9NR01UQ1RYX0lEWCwgcEFkLT5NZ210UmluZy5UeENwdUlkeCk7CisKKwkJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWdtdFJpbmdMb2NrKTsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuTWdtdFJpbmdGdWxsQ291bnQgPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBRSURfUlg6CisJCQkvLyBXZSBoYXZlIHRvIGNsZWFuIGFsbCBkZXNjcmlwdG9ycyBpbiBjYXNlIHNvbWUgZXJyb3IgaGFwcGVuZWQgd2l0aCByZXNldAorCQkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5SeFJpbmdMb2NrKTsKKworCQkJZm9yIChpPTA7IGk8UlhfUklOR19TSVpFOyBpKyspCisJCQl7CisJCQkJcFJ4RCAgPSAoUFJYRF9TVFJVQykgcEFkLT5SeFJpbmcuQ2VsbFtpXS5BbGxvY1ZhOworCQkJCXBSeEQtPkRET05FID0gMCA7CisJCQl9CisKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfRFJYX0lEWCwgJnBBZC0+UnhSaW5nLlJ4RG1hSWR4KTsKKwkJCXBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4ID0gcEFkLT5SeFJpbmcuUnhEbWFJZHg7CisJCQlwQWQtPlJ4UmluZy5SeENwdUlkeCA9ICgocEFkLT5SeFJpbmcuUnhEbWFJZHggPT0gMCkgPyAoUlhfUklOR19TSVpFLTEpIDogKHBBZC0+UnhSaW5nLlJ4RG1hSWR4LTEpKTsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0NSWF9JRFgsIHBBZC0+UnhSaW5nLlJ4Q3B1SWR4KTsKKworCQkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5SeFJpbmdMb2NrKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9Cit9CisKKworTkRJU19TVEFUVVMgQWRhcHRlckJsb2NrQWxsb2NhdGVNZW1vcnkoCisJSU4gUFZPSUQJaGFuZGxlLAorCU9VVAlQVk9JRAkqcHBBZCkKK3sKKwlQUENJX0RFViBwY2lfZGV2OworCWRtYV9hZGRyX3QJKnBoeV9hZGRyOworCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKSBoYW5kbGU7CisKKwlwY2lfZGV2ID0gcE9iai0+cGNpX2RldjsKKwlwaHlfYWRkciA9ICZwT2JqLT5wQWRfcGE7CisKKwkqcHBBZCA9IChQVk9JRCl2bWFsbG9jKHNpemVvZihSVE1QX0FEQVBURVIpKTsgLy9wY2lfYWxsb2NfY29uc2lzdGVudChwY2lfZGV2LCBzaXplb2YoUlRNUF9BREFQVEVSKSwgcGh5X2FkZHIpOworCisJaWYgKCpwcEFkKQorCXsKKwkJTmRpc1plcm9NZW1vcnkoKnBwQWQsIHNpemVvZihSVE1QX0FEQVBURVIpKTsKKwkJKChQUlRNUF9BREFQVEVSKSpwcEFkKS0+T1NfQ29va2llID0gaGFuZGxlOworCQlyZXR1cm4gKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCX0gZWxzZSB7CisJCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJfQorfQorCisKK3ZvaWQgUlRNUF9BbGxvY2F0ZVR4RGVzY01lbW9yeSgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVSU5UCUluZGV4LAorCUlOCVVMT05HCUxlbmd0aCwKKwlJTglCT09MRUFOCUNhY2hlZCwKKwlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAorCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcykKK3sKKwlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKKworCSpWaXJ0dWFsQWRkcmVzcyA9IChQVk9JRClQQ0lfQUxMT0NfQ09OU0lTVEVOVChwT2JqLT5wY2lfZGV2LHNpemVvZihjaGFyKSpMZW5ndGgsIFBoeXNpY2FsQWRkcmVzcyk7CisKK30KKwordm9pZCBSVE1QX0FsbG9jYXRlTWdtdERlc2NNZW1vcnkoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCUJPT0xFQU4JQ2FjaGVkLAorCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCisJT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKQoreworCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOworCisJKlZpcnR1YWxBZGRyZXNzID0gKFBWT0lEKVBDSV9BTExPQ19DT05TSVNURU5UKHBPYmotPnBjaV9kZXYsc2l6ZW9mKGNoYXIpKkxlbmd0aCwgUGh5c2ljYWxBZGRyZXNzKTsKKworfQorCit2b2lkIFJUTVBfQWxsb2NhdGVSeERlc2NNZW1vcnkoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCUJPT0xFQU4JQ2FjaGVkLAorCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCisJT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKQoreworCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOworCisJKlZpcnR1YWxBZGRyZXNzID0gKFBWT0lEKVBDSV9BTExPQ19DT05TSVNURU5UKHBPYmotPnBjaV9kZXYsc2l6ZW9mKGNoYXIpKkxlbmd0aCwgUGh5c2ljYWxBZGRyZXNzKTsKKworfQorCit2b2lkIFJUTVBfRnJlZVJ4RGVzY01lbW9yeSgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVTE9ORwlMZW5ndGgsCisJSU4JUFZPSUQJVmlydHVhbEFkZHJlc3MsCisJSU4JTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcykKK3sKKwlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKKworCVBDSV9GUkVFX0NPTlNJU1RFTlQocE9iai0+cGNpX2RldiwgTGVuZ3RoLCBWaXJ0dWFsQWRkcmVzcywgUGh5c2ljYWxBZGRyZXNzKTsKK30KKworCit2b2lkIFJUTVBfQWxsb2NhdGVGaXJzdFR4QnVmZmVyKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVJTlQJSW5kZXgsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCUJPT0xFQU4JQ2FjaGVkLAorCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCisJT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKQoreworCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOworCisJKlZpcnR1YWxBZGRyZXNzID0gKFBWT0lEKVBDSV9BTExPQ19DT05TSVNURU5UKHBPYmotPnBjaV9kZXYsc2l6ZW9mKGNoYXIpKkxlbmd0aCwgUGh5c2ljYWxBZGRyZXNzKTsKK30KKworLyoKKyAqIEZVTkNUSU9OOiBBbGxvY2F0ZSBhIGNvbW1vbiBidWZmZXIgZm9yIERNQQorICogQVJHVU1FTlRTOgorICogICAgIEFkYXB0ZXJIYW5kbGU6ICBBZGFwdGVySGFuZGxlCisgKiAgICAgTGVuZ3RoOiAgTnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlCisgKiAgICAgQ2FjaGVkOiAgV2hldGhlciBvciBub3QgdGhlIG1lbW9yeSBjYW4gYmUgY2FjaGVkCisgKiAgICAgVmlydHVhbEFkZHJlc3M6ICBQb2ludGVyIHRvIG1lbW9yeSBpcyByZXR1cm5lZCBoZXJlCisgKiAgICAgUGh5c2ljYWxBZGRyZXNzOiAgUGh5c2ljYWwgYWRkcmVzcyBjb3JyZXNwb25kaW5nIHRvIHZpcnR1YWwgYWRkcmVzcworICovCisKK3ZvaWQgUlRNUF9BbGxvY2F0ZVNoYXJlZE1lbW9yeSgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVTE9ORwlMZW5ndGgsCisJSU4JQk9PTEVBTglDYWNoZWQsCisJT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKKwlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpCit7CisJUE9TX0NPT0tJRSBwT2JqID0gKFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7CisKKwkqVmlydHVhbEFkZHJlc3MgPSAoUFZPSUQpUENJX0FMTE9DX0NPTlNJU1RFTlQocE9iai0+cGNpX2RldixzaXplb2YoY2hhcikqTGVuZ3RoLCBQaHlzaWNhbEFkZHJlc3MpOworfQorCitWT0lEIFJUTVBGcmVlVHhSeFJpbmdNZW1vcnkoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpCit7CisJaW50IGluZGV4LCBudW0gLCBqOworCVBSVE1QX1RYX1JJTkcgcFR4UmluZzsKKwlQVFhEX1NUUlVDCSAgcFR4RDsKKwlQTkRJU19QQUNLRVQgIHBQYWNrZXQ7CisJdW5zaWduZWQgaW50ICBJcnFGbGFnczsKKworCVBPU19DT09LSUUgcE9iaiA9KFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFJUTVBGcmVlVHhSeFJpbmdNZW1vcnlcbiIpKTsKKworCS8vIEZyZWUgVHhTd1F1ZXVlIFBhY2tldAorCWZvciAoaW5kZXg9MDsgaW5kZXggPE5VTV9PRl9UWF9SSU5HOyBpbmRleCsrKQorCXsKKwkJUFFVRVVFX0VOVFJZIHBFbnRyeTsKKwkJUE5ESVNfUEFDS0VUIHBQYWNrZXQ7CisJCVBRVUVVRV9IRUFERVIgICBwUXVldWU7CisKKwkJUlRNUF9JUlFfTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworCQlwUXVldWUgPSAmcEFkLT5UeFN3UXVldWVbaW5kZXhdOworCQl3aGlsZSAocFF1ZXVlLT5IZWFkKQorCQl7CisJCQlwRW50cnkgPSBSZW1vdmVIZWFkUXVldWUocFF1ZXVlKTsKKwkJCXBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocEVudHJ5KTsKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJfQorCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKKwl9CisKKwkvLyBGcmVlIFR4IFJpbmcgUGFja2V0CisJZm9yIChpbmRleD0wO2luZGV4PCBOVU1fT0ZfVFhfUklORztpbmRleCsrKQorCXsKKwkJcFR4UmluZyA9ICZwQWQtPlR4UmluZ1tpbmRleF07CisKKwkJZm9yIChqPTA7IGo8IFRYX1JJTkdfU0laRTsgaisrKQorCQl7CisJCQlwVHhEID0gKFBUWERfU1RSVUMpIChwVHhSaW5nLT5DZWxsW2pdLkFsbG9jVmEpOworCQkJcFBhY2tldCA9IHBUeFJpbmctPkNlbGxbal0ucE5kaXNQYWNrZXQ7CisKKwkJCWlmIChwUGFja2V0KQorCQkJeworICAgICAgICAgICAgCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjAsIHBUeEQtPlNETGVuMCwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkJfQorCQkJLy9BbHdheXMgYXNzaWduIHBOZGlzUGFja2V0IGFzIE5VTEwgYWZ0ZXIgY2xlYXIKKwkJCXBUeFJpbmctPkNlbGxbal0ucE5kaXNQYWNrZXQgPSBOVUxMOworCisJCQlwUGFja2V0ID0gcFR4UmluZy0+Q2VsbFtqXS5wTmV4dE5kaXNQYWNrZXQ7CisKKwkJCWlmIChwUGFja2V0KQorCQkJeworICAgICAgICAgICAgCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsIHBUeEQtPlNETGVuMSwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkJfQorCQkJLy9BbHdheXMgYXNzaWduIHBOZXh0TmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCisJCQlwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOworCisJCX0KKwl9CisKKwlmb3IgKGluZGV4ID0gUlhfUklOR19TSVpFIC0gMSA7IGluZGV4ID49IDA7IGluZGV4LS0pCisJeworCQlpZiAoKHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkRtYUJ1Zi5BbGxvY1ZhKSAmJiAocEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0ucE5kaXNQYWNrZXQpKQorCQl7CisJCQlQQ0lfVU5NQVBfU0lOR0xFKHBPYmotPnBjaV9kZXYsIHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkRtYUJ1Zi5BbGxvY1BhLCBwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5EbWFCdWYuQWxsb2NTaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLnBOZGlzUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJfQorCX0KKwlOZGlzWmVyb01lbW9yeShwQWQtPlJ4UmluZy5DZWxsLCBSWF9SSU5HX1NJWkUgKiBzaXplb2YoUlRNUF9ETUFDQikpOworCisJaWYgKHBBZC0+UnhEZXNjUmluZy5BbGxvY1ZhKQorICAgIHsKKyAgICAJUENJX0ZSRUVfQ09OU0lTVEVOVChwT2JqLT5wY2lfZGV2LCBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NTaXplLCBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYSwgcEFkLT5SeERlc2NSaW5nLkFsbG9jUGEpOworICAgIH0KKyAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5SeERlc2NSaW5nLCBzaXplb2YoUlRNUF9ETUFCVUYpKTsKKworCWlmIChwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhKQorCXsKKwkJUENJX0ZSRUVfQ09OU0lTVEVOVChwT2JqLT5wY2lfZGV2LCBwQWQtPk1nbXREZXNjUmluZy5BbGxvY1NpemUsCXBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEsIHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jUGEpOworCX0KKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5NZ210RGVzY1JpbmcsIHNpemVvZihSVE1QX0RNQUJVRikpOworCisJZm9yIChudW0gPSAwOyBudW0gPCBOVU1fT0ZfVFhfUklORzsgbnVtKyspCisJeworICAgIAlpZiAocEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NWYSkKKwkgICAgeworCSAgICAJUENJX0ZSRUVfQ09OU0lTVEVOVChwT2JqLT5wY2lfZGV2LCBwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1NpemUsIHBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jVmEsIHBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jUGEpOworCSAgICB9CisJICAgIE5kaXNaZXJvTWVtb3J5KCZwQWQtPlR4QnVmU3BhY2VbbnVtXSwgc2l6ZW9mKFJUTVBfRE1BQlVGKSk7CisKKyAgICAJaWYgKHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jVmEpCisJICAgIHsKKwkgICAgCVBDSV9GUkVFX0NPTlNJU1RFTlQocE9iai0+cGNpX2RldiwgcEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NTaXplLCBwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1ZhLCBwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1BhKTsKKwkgICAgfQorCSAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5UeERlc2NSaW5nW251bV0sIHNpemVvZihSVE1QX0RNQUJVRikpOworCX0KKworCWlmIChwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCkKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBSVE1QRnJlZVR4UnhSaW5nTWVtb3J5XG4iKSk7Cit9CisKKworLyoKKyAqIEZVTkNUSU9OOiBBbGxvY2F0ZSBhIHBhY2tldCBidWZmZXIgZm9yIERNQQorICogQVJHVU1FTlRTOgorICogICAgIEFkYXB0ZXJIYW5kbGU6ICBBZGFwdGVySGFuZGxlCisgKiAgICAgTGVuZ3RoOiAgTnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlCisgKiAgICAgQ2FjaGVkOiAgV2hldGhlciBvciBub3QgdGhlIG1lbW9yeSBjYW4gYmUgY2FjaGVkCisgKiAgICAgVmlydHVhbEFkZHJlc3M6ICBQb2ludGVyIHRvIG1lbW9yeSBpcyByZXR1cm5lZCBoZXJlCisgKiAgICAgUGh5c2ljYWxBZGRyZXNzOiAgUGh5c2ljYWwgYWRkcmVzcyBjb3JyZXNwb25kaW5nIHRvIHZpcnR1YWwgYWRkcmVzcworICogTm90ZXM6CisgKiAgICAgQ2FjaGVkIGlzIGlnbm9yZWQ6IGFsd2F5cyBjYWNoZWQgbWVtb3J5CisgKi8KK1BORElTX1BBQ0tFVCBSVE1QX0FsbG9jYXRlUnhQYWNrZXRCdWZmZXIoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCUJPT0xFQU4JQ2FjaGVkLAorCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCisJT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKQoreworCVBORElTX1BBQ0tFVCBwa3Q7CisKKwlwa3QgPSBSVFBLVF9UT19PU1BLVChERVZfQUxMT0NfU0tCKExlbmd0aCkpOworCisJaWYgKHBrdCA9PSBOVUxMKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNhbid0IGFsbG9jYXRlIHJ4ICVsZCBzaXplIHBhY2tldFxuIixMZW5ndGgpKTsKKwl9CisKKwlpZiAocGt0KSB7CisJCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UocGt0LCBQS1RTUkNfTkRJUyk7CisJCSpWaXJ0dWFsQWRkcmVzcyA9IChQVk9JRCkgUlRQS1RfVE9fT1NQS1QocGt0KS0+ZGF0YTsKKwkJKlBoeXNpY2FsQWRkcmVzcyA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgKlZpcnR1YWxBZGRyZXNzLCBMZW5ndGgsIC0xLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCX0gZWxzZSB7CisJCSpWaXJ0dWFsQWRkcmVzcyA9IChQVk9JRCkgTlVMTDsKKwkJKlBoeXNpY2FsQWRkcmVzcyA9IChORElTX1BIWVNJQ0FMX0FERFJFU1MpIE5VTEw7CisJfQorCisJcmV0dXJuIChQTkRJU19QQUNLRVQpIHBrdDsKK30KKworCitWT0lEIEludmFsaWRfUmVtYWluaW5nX1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTgkgVUxPTkcgVmlydHVhbEFkZHJlc3MpCit7CisJTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzczsKKworCVBoeXNpY2FsQWRkcmVzcyA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgKHZvaWQgKikoVmlydHVhbEFkZHJlc3MrMTYwMCksIFJYX0JVRkZFUl9OT1JNU0laRS0xNjAwLCAtMSwgUENJX0RNQV9GUk9NREVWSUNFKTsKK30KKworUE5ESVNfUEFDS0VUIEdldFBhY2tldEZyb21SeFJpbmcoCisJSU4JCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAkJUFJUMjhYWF9SWERfU1RSVUMJcFNhdmVSeEQsCisJT1VUCQlCT09MRUFOCQkJKnBiUmVzY2hlZHVsZSwKKwlJTiBPVVQJVUlOVDMyCQkJKnBSeFBlbmRpbmcpCit7CisJUFJYRF9TVFJVQwkJCQlwUnhEOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlQUlhEX1NUUlVDCQkJCXBEZXN0UnhEOworCVJYRF9TVFJVQwkJCQlSeEQ7CisjZW5kaWYKKwlQTkRJU19QQUNLRVQJCQlwUnhQYWNrZXQgPSBOVUxMOworCVBORElTX1BBQ0tFVAkJCXBOZXdQYWNrZXQ7CisJUFZPSUQJCQkJCUFsbG9jVmE7CisJTkRJU19QSFlTSUNBTF9BRERSRVNTCUFsbG9jUGE7CisJQk9PTEVBTgkJCQkJYlJlc2NoZWR1bGUgPSBGQUxTRTsKKworCVJUTVBfU0VNX0xPQ0soJnBBZC0+UnhSaW5nTG9jayk7CisKKwlpZiAoKnBSeFBlbmRpbmcgPT0gMCkKKwl7CisJCS8vIEdldCBob3cgbWF5IHBhY2tldHMgaGFkIGJlZW4gcmVjZWl2ZWQKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9EUlhfSURYICwgJnBBZC0+UnhSaW5nLlJ4RG1hSWR4KTsKKworCQlpZiAocEFkLT5SeFJpbmcuUnhTd1JlYWRJZHggPT0gcEFkLT5SeFJpbmcuUnhEbWFJZHgpCisJCXsKKwkJCS8vIG5vIG1vcmUgcnggcGFja2V0cworCQkJYlJlc2NoZWR1bGUgPSBGQUxTRTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCS8vIGdldCByeCBwZW5kaW5nIGNvdW50CisJCWlmIChwQWQtPlJ4UmluZy5SeERtYUlkeCA+IHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4KQorCQkJKnBSeFBlbmRpbmcgPSBwQWQtPlJ4UmluZy5SeERtYUlkeCAtIHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4OworCQllbHNlCisJCQkqcFJ4UGVuZGluZwk9IHBBZC0+UnhSaW5nLlJ4RG1hSWR4ICsgUlhfUklOR19TSVpFIC0gcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHg7CisKKwl9CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJcERlc3RSeEQgPSAoUFJYRF9TVFJVQykgcEFkLT5SeFJpbmcuQ2VsbFtwQWQtPlJ4UmluZy5SeFN3UmVhZElkeF0uQWxsb2NWYTsKKwlSeEQgPSAqcERlc3RSeEQ7CisJcFJ4RCA9ICZSeEQ7CisJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwUnhELCBUWVBFX1JYRCk7CisjZWxzZQorCS8vIFBvaW50IHRvIFJ4IGluZGV4ZWQgcnggcmluZyBkZXNjcmlwdG9yCisJcFJ4RCA9IChQUlhEX1NUUlVDKSBwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XS5BbGxvY1ZhOworI2VuZGlmCisKKwlpZiAocFJ4RC0+RERPTkUgPT0gMCkKKwl7CisJCSpwUnhQZW5kaW5nID0gMDsKKwkJLy8gRE1BSW5keCBoYWQgZG9uZSBidXQgRERPTkUgYml0IG5vdCByZWFkeQorCQliUmVzY2hlZHVsZSA9IFRSVUU7CisJCWdvdG8gZG9uZTsKKwl9CisKKworCS8vIHJldHVybiByeCBkZXNjcmlwdG9yCisJTmRpc01vdmVNZW1vcnkocFNhdmVSeEQsIHBSeEQsIFJYRF9TSVpFKTsKKworCXBOZXdQYWNrZXQgPSBSVE1QX0FsbG9jYXRlUnhQYWNrZXRCdWZmZXIocEFkLCBSWF9CVUZGRVJfQUdHUkVTSVpFLCBGQUxTRSwgJkFsbG9jVmEsICZBbGxvY1BhKTsKKworCWlmIChwTmV3UGFja2V0KQorCXsKKwkJLy8gdW5tYXAgdGhlIHJ4IGJ1ZmZlcgorCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcEFkLT5SeFJpbmcuQ2VsbFtwQWQtPlJ4UmluZy5SeFN3UmVhZElkeF0uRG1hQnVmLkFsbG9jUGEsCisJCQkJCSBwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XS5EbWFCdWYuQWxsb2NTaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlwUnhQYWNrZXQgPSBwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XS5wTmRpc1BhY2tldDsKKworCQlwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XS5EbWFCdWYuQWxsb2NTaXplCT0gUlhfQlVGRkVSX0FHR1JFU0laRTsKKwkJcEFkLT5SeFJpbmcuQ2VsbFtwQWQtPlJ4UmluZy5SeFN3UmVhZElkeF0ucE5kaXNQYWNrZXQJCT0gKFBORElTX1BBQ0tFVCkgcE5ld1BhY2tldDsKKwkJcEFkLT5SeFJpbmcuQ2VsbFtwQWQtPlJ4UmluZy5SeFN3UmVhZElkeF0uRG1hQnVmLkFsbG9jVmEJPSBBbGxvY1ZhOworCQlwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XS5EbWFCdWYuQWxsb2NQYQk9IEFsbG9jUGE7CisJCS8qIHVwZGF0ZSBTRFAwIHRvIG5ldyBidWZmZXIgb2YgcnggcGFja2V0ICovCisJCXBSeEQtPlNEUDAgPSBBbGxvY1BhOworCX0KKwllbHNlCisJeworCQkvL3ByaW50aygiTm8gUnggQnVmZmVyXG4iKTsKKwkJcFJ4UGFja2V0ID0gTlVMTDsKKwkJYlJlc2NoZWR1bGUgPSBUUlVFOworCX0KKworCXBSeEQtPkRET05FID0gMDsKKworCS8vIGhhZCBoYW5kbGVkIG9uZSByeCBwYWNrZXQKKwkqcFJ4UGVuZGluZyA9ICpwUnhQZW5kaW5nIC0gMTsKKworCS8vIHVwZGF0ZSByeCBkZXNjcmlwdG9yIGFuZCBraWNrIHJ4CisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFJ4RCwgVFlQRV9SWEQpOworCVdyaXRlQmFja1RvRGVzY3JpcHRvcigoUFVDSEFSKXBEZXN0UnhELCAoUFVDSEFSKXBSeEQsIEZBTFNFLCBUWVBFX1JYRCk7CisjZW5kaWYKKwlJTkNfUklOR19JTkRFWChwQWQtPlJ4UmluZy5SeFN3UmVhZElkeCwgUlhfUklOR19TSVpFKTsKKworCXBBZC0+UnhSaW5nLlJ4Q3B1SWR4ID0gKHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4ID09IDApID8gKFJYX1JJTkdfU0laRS0xKSA6IChwQWQtPlJ4UmluZy5SeFN3UmVhZElkeC0xKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9DUlhfSURYLCBwQWQtPlJ4UmluZy5SeENwdUlkeCk7CisKK2RvbmU6CisJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPlJ4UmluZ0xvY2spOworCSpwYlJlc2NoZWR1bGUgPSBiUmVzY2hlZHVsZTsKKwlyZXR1cm4gcFJ4UGFja2V0OworfQorLyogRW5kIG9mIDI4NjBfcnRtcF9pbml0LmMgKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vYWN0aW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9hY3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmY1MzBmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vYWN0aW9uLmMKQEAgLTAsMCArMSwxMDMxIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorCWFjdGlvbi5jCisKKyAgICBBYnN0cmFjdDoKKyAgICBIYW5kbGUgYXNzb2NpYXRpb24gcmVsYXRlZCByZXF1ZXN0cyBlaXRoZXIgZnJvbSBXU1RBIG9yIGZyb20gbG9jYWwgTUxNRQorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlKYW4gTGVlCQkyMDA2CSAgCWNyZWF0ZWQgZm9yIHJ0Mjg2MAorICovCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKyNpbmNsdWRlICJhY3Rpb24uaCIKKworCitzdGF0aWMgVk9JRCBSZXNlcnZlZEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIGFzc29jaWF0aW9uIHN0YXRlIG1hY2hpbmUgaW5pdCwgaW5jbHVkaW5nIHN0YXRlIHRyYW5zaXRpb24gYW5kIHRpbWVyIGluaXQKKyAgICBQYXJhbWV0ZXJzOgorICAgICAgICBTIC0gcG9pbnRlciB0byB0aGUgYXNzb2NpYXRpb24gc3RhdGUgbWFjaGluZQorICAgIE5vdGU6CisgICAgICAgIFRoZSBzdGF0ZSBtYWNoaW5lIGxvb2tzIGxpa2UgdGhlIGZvbGxvd2luZworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1NPQ19JRExFCisgICAgICAgIE1UMl9NTE1FX0RJU0FTU09DX1JFUSAgICBtbG1lX2Rpc2Fzc29jX3JlcV9hY3Rpb24KKyAgICAgICAgTVQyX1BFRVJfRElTQVNTT0NfUkVRICAgIHBlZXJfZGlzYXNzb2NfYWN0aW9uCisgICAgICAgIE1UMl9QRUVSX0FTU09DX1JFUSAgICAgICBkcm9wCisgICAgICAgIE1UMl9QRUVSX1JFQVNTT0NfUkVRICAgICBkcm9wCisgICAgICAgIE1UMl9DTFMzRVJSICAgICAgICAgICAgICBjbHMzZXJyX2FjdGlvbgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQWN0aW9uU3RhdGVNYWNoaW5lSW5pdCgKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiAgU1RBVEVfTUFDSElORSAqUywKKyAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCit7CisJU3RhdGVNYWNoaW5lSW5pdChTLCAoU1RBVEVfTUFDSElORV9GVU5DICopVHJhbnMsIE1BWF9BQ1RfU1RBVEUsIE1BWF9BQ1RfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIEFDVF9JRExFLCBBQ1RfTUFDSElORV9CQVNFKTsKKworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfU1BFQ1RSVU1fQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyU3BlY3RydW1BY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfUU9TX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlclFPU0FjdGlvbik7CisKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9QRUVSX0RMU19DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKVJlc2VydmVkQWN0aW9uKTsKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9ETFNfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRExTQWN0aW9uKTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfQkFfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQkFBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfSFRfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVySFRBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX01MTUVfQUREX0JBX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZUFEREJBQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9NTE1FX09SSV9ERUxCQV9DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVERUxCQUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfTUxNRV9SRUNfREVMQkFfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lREVMQkFBY3Rpb24pOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9QVUJMSUNfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyUHVibGljQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9QRUVSX1JNX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlclJNQWN0aW9uKTsKKworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX01MTUVfUU9TX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZVFPU0FjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfTUxNRV9ETFNfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lRExTQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9BQ1RfSU5WQUxJRCwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lSW52YWxpZEFjdGlvbik7Cit9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQgTWxtZUFEREJBQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKKworeworCU1MTUVfQUREQkFfUkVRX1NUUlVDVCAqcEluZm87CisJVUNIQVIgICAgICAgICAgIEFkZHJbNl07CisJUFVDSEFSICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMgICAgIE5TdGF0dXM7CisJVUxPTkcJCUlkeDsKKwlGUkFNRV9BRERCQV9SRVEgIEZyYW1lOworCVVMT05HCQlGcmFtZUxlbjsKKwlCQV9PUklfRU5UUlkJCQkqcEJBRW50cnkgPSBOVUxMOworCisJcEluZm8gPSAoTUxNRV9BRERCQV9SRVFfU1RSVUNUICopRWxlbS0+TXNnOworCU5kaXNaZXJvTWVtb3J5KCZGcmFtZSwgc2l6ZW9mKEZSQU1FX0FEREJBX1JFUSkpOworCisJaWYoTWxtZUFkZEJBUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIpKQorCXsKKwkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwkJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJBIC0gTWxtZUFEREJBQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJCXJldHVybjsKKwkJfQorCQkvLyAxLiBmaW5kIGVudHJ5CisJCUlkeCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkJBT3JpV2NpZEFycmF5W3BJbmZvLT5USURdOworCQlpZiAoSWR4ID09IDApCisJCXsKKwkJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkJBIC0gTWxtZUFEREJBQWN0aW9uKCkgY2FuJ3QgZmluZCBCQU9yaUVudHJ5IFxuIikpOworCQkJcmV0dXJuOworCQl9CisJCWVsc2UKKwkJeworCQkJcEJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtJZHhdOworCQl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJaWYgKEFESE9DX09OKHBBZCkpCisJCQkJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBJbmZvLT5wQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJZWxzZQorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLlZhbGlkQXNEbHMpCisJCQkJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBJbmZvLT5wQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQkJCUFjdEhlYWRlckluaXQocEFkLCAmRnJhbWUuSGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEluZm8tPnBBZGRyKTsKKworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJRnJhbWUuQ2F0ZWdvcnkgPSBDQVRFR09SWV9CQTsKKwkJRnJhbWUuQWN0aW9uID0gQUREQkFfUkVROworCQlGcmFtZS5CYVBhcm0uQU1TRFVTdXBwb3J0ZWQgPSAwOworCQlGcmFtZS5CYVBhcm0uQkFQb2xpY3kgPSBJTU1FRF9CQTsKKwkJRnJhbWUuQmFQYXJtLlRJRCA9IHBJbmZvLT5USUQ7CisJCUZyYW1lLkJhUGFybS5CdWZTaXplID0gcEluZm8tPkJhQnVmU2l6ZTsKKwkJRnJhbWUuVG9rZW4gPSBwSW5mby0+VG9rZW47CisJCUZyYW1lLlRpbWVPdXRWYWx1ZSA9IHBJbmZvLT5UaW1lT3V0VmFsdWU7CisJCUZyYW1lLkJhU3RhcnRTZXEuZmllbGQuRnJhZ051bSA9IDA7CisJCUZyYW1lLkJhU3RhcnRTZXEuZmllbGQuU3RhcnRTZXEgPSBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5UeFNlcVtwSW5mby0+VElEXTsKKworCQkqKFVTSE9SVCAqKSgmRnJhbWUuQmFQYXJtKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZGcmFtZS5CYVBhcm0pKTsKKwkJRnJhbWUuVGltZU91dFZhbHVlID0gY3B1MmxlMTYoRnJhbWUuVGltZU91dFZhbHVlKTsKKwkJRnJhbWUuQmFTdGFydFNlcS53b3JkID0gY3B1MmxlMTYoRnJhbWUuQmFTdGFydFNlcS53b3JkKTsKKworCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJICAgJkZyYW1lTGVuLAorCQkgICAgICAgICAgICAgIHNpemVvZihGUkFNRV9BRERCQV9SRVEpLCAmRnJhbWUsCisJCSAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJBIC0gU2VuZCBBRERCQSByZXF1ZXN0LiBTdGFydFNlcSA9ICV4LCAgRnJhbWVMZW4gPSAlbGQuIEJ1ZlNpemUgPSAlZFxuIiwgRnJhbWUuQmFTdGFydFNlcS5maWVsZC5TdGFydFNlcSwgRnJhbWVMZW4sIEZyYW1lLkJhUGFybS5CdWZTaXplKSk7CisgICAgfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIHNlbmQgREVMQkEgYW5kIGRlbGV0ZSBCYUVudHJ5IGlmIGFueQorICAgIFBhcmFtZXRyczoKKyAgICAgICAgRWxlbSAtIE1MTUUgbWVzc2FnZSBNTE1FX0RFTEJBX1JFUV9TVFJVQ1QKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lREVMQkFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCU1MTUVfREVMQkFfUkVRX1NUUlVDVCAqcEluZm87CisJUFVDSEFSICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJUFVDSEFSCQkgICBwT3V0QnVmZmVyMiA9IE5VTEw7CisJTkRJU19TVEFUVVMgICAgIE5TdGF0dXM7CisJVUxPTkcJCUlkeDsKKwlGUkFNRV9ERUxCQV9SRVEgIEZyYW1lOworCVVMT05HCQlGcmFtZUxlbjsKKwlGUkFNRV9CQVIJRnJhbWVCYXI7CisKKwlwSW5mbyA9IChNTE1FX0RFTEJBX1JFUV9TVFJVQ1QgKilFbGVtLT5Nc2c7CisJLy8gbXVzdCBzZW5kIGJhY2sgREVMQkEKKwlOZGlzWmVyb01lbW9yeSgmRnJhbWUsIHNpemVvZihGUkFNRV9ERUxCQV9SRVEpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gTWxtZURFTEJBQWN0aW9uKCksIEluaXRpYXRvciglZCkgXG4iLCBwSW5mby0+SW5pdGlhdG9yKSk7CisKKwlpZihNbG1lRGVsQkFSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbikpCisJeworCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQkEgLSBNbG1lREVMQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIDEuIFxuIikpOworCQkJcmV0dXJuOworCQl9CisKKwkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyMik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJeworCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkJBIC0gTWxtZURFTEJBQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCAyLiBcbiIpKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIFNFTkQgQkFSIChTZW5kIEJBUiB0byByZWZyZXNoIHBlZXIgcmVvcmRlcmluZyBidWZmZXIuKQorCQlJZHggPSBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5CQU9yaVdjaWRBcnJheVtwSW5mby0+VElEXTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCUJhckhlYWRlckluaXQocEFkLCAmRnJhbWVCYXIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCUZyYW1lQmFyLlN0YXJ0aW5nU2VxLmZpZWxkLkZyYWdOdW0gPSAwOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KKwkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEgPSBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5UeFNlcVtwSW5mby0+VElEXTsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCisJCUZyYW1lQmFyLkJhckNvbnRyb2wuVElEID0gcEluZm8tPlRJRDsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCisJCUZyYW1lQmFyLkJhckNvbnRyb2wuQUNLUG9saWN5ID0gSU1NRURfQkE7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgorCQlGcmFtZUJhci5CYXJDb250cm9sLkNvbXByZXNzZWQgPSAxOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KKwkJRnJhbWVCYXIuQmFyQ29udHJvbC5NVElEID0gMDsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCisKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlcjIsCQkJCSZGcmFtZUxlbiwKKwkJCQkJICBzaXplb2YoRlJBTUVfQkFSKSwJICAmRnJhbWVCYXIsCisJCQkJCSAgRU5EX09GX0FSR1MpOworCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlcjIsIEZyYW1lTGVuKTsKKwkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyMik7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkEgLSBNbG1lREVMQkFBY3Rpb24oKSAuIFNlbmQgQkFSIHRvIHJlZnJlc2ggcGVlciByZW9yZGVyaW5nIGJ1ZmZlciBcbiIpKTsKKworCQkvLyBTRU5EIERFTEJBIEZSQU1FCisJCUZyYW1lTGVuID0gMDsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJaWYgKEFESE9DX09OKHBBZCkpCisJCQkJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCWVsc2UKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5WYWxpZEFzRGxzKQorCQkJCUFjdEhlYWRlckluaXQocEFkLCAmRnJhbWUuSGRyLCBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5BZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQllbHNlCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCQkJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsICBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uQWRkcik7CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJRnJhbWUuQ2F0ZWdvcnkgPSBDQVRFR09SWV9CQTsKKwkJRnJhbWUuQWN0aW9uID0gREVMQkE7CisJCUZyYW1lLkRlbGJhUGFybS5Jbml0aWF0b3IgPSBwSW5mby0+SW5pdGlhdG9yOworCQlGcmFtZS5EZWxiYVBhcm0uVElEID0gcEluZm8tPlRJRDsKKwkJRnJhbWUuUmVhc29uQ29kZSA9IDM5OyAvLyBUaW1lIE91dAorCQkqKFVTSE9SVCAqKSgmRnJhbWUuRGVsYmFQYXJtKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZGcmFtZS5EZWxiYVBhcm0pKTsKKwkJRnJhbWUuUmVhc29uQ29kZSA9IGNwdTJsZTE2KEZyYW1lLlJlYXNvbkNvZGUpOworCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAorCQkgICAgICAgICAgICAgIHNpemVvZihGUkFNRV9ERUxCQV9SRVEpLCAgICAmRnJhbWUsCisJCSAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCQSAtIE1sbWVERUxCQUFjdGlvbigpIC4gMyBERUxCQSBzZW50LiBJbml0aWF0b3IoJWQpXG4iLCBwSW5mby0+SW5pdGlhdG9yKSk7CisgICAgCX0KK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBNbG1lUU9TQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKK30KKworVk9JRCBNbG1lRExTQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKK30KKworVk9JRCBNbG1lSW52YWxpZEFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJLy9QVUNIQVIJCSAgIHBPdXRCdWZmZXIgPSBOVUxMOworCS8vUmV0dXJuIHRoZSByZWNlaXZpbmcgZnJhbWUgZXhjZXB0IHRoZSBNU0Igb2YgY2F0ZWdvcnkgZmlsZWQgc2V0IHRvIDEuICA3LjMuMS4xMQorfQorCitWT0lEIFBlZXJRT1NBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworfQorCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCitWT0lEIFBlZXJETFNBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSCUFjdGlvbiA9IEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzFdOworCisJc3dpdGNoKEFjdGlvbikKKwl7CisJCWNhc2UgQUNUSU9OX0RMU19SRVFVRVNUOgorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCVBlZXJEbHNSZXFBY3Rpb24ocEFkLCBFbGVtKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCWJyZWFrOworCisJCWNhc2UgQUNUSU9OX0RMU19SRVNQT05TRToKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQlQZWVyRGxzUnNwQWN0aW9uKHBBZCwgRWxlbSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQlicmVhazsKKworCQljYXNlIEFDVElPTl9ETFNfVEVBUkRPV046CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJUGVlckRsc1RlYXJEb3duQWN0aW9uKHBBZCwgRWxlbSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQlicmVhazsKKwl9Cit9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQgUGVlckJBQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUglBY3Rpb24gPSBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsxXTsKKworCXN3aXRjaChBY3Rpb24pCisJeworCQljYXNlIEFEREJBX1JFUToKKwkJCVBlZXJBZGRCQVJlcUFjdGlvbihwQWQsRWxlbSk7CisJCQlicmVhazsKKwkJY2FzZSBBRERCQV9SRVNQOgorCQkJUGVlckFkZEJBUnNwQWN0aW9uKHBBZCxFbGVtKTsKKwkJCWJyZWFrOworCQljYXNlIERFTEJBOgorCQkJUGVlckRlbEJBQWN0aW9uKHBBZCxFbGVtKTsKKwkJCWJyZWFrOworCX0KK30KKworCisjaWZkZWYgRE9UMTFOX0RSQUZUMworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitWT0lEIFN0YVB1YmxpY0FjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiBCc3MyMDQwQ29leGlzdCkKK3sKKwlCU1NfMjA0MF9DT0VYSVNUX0lFCQlCc3NDb2V4aXN0OworCU1MTUVfU0NBTl9SRVFfU1RSVUNUCQkJU2NhblJlcTsKKworCUJzc0NvZXhpc3Qud29yZCA9IEJzczIwNDBDb2V4aXN0OworCS8vIEFQIGFza3MgU3RhdGlvbiB0byByZXR1cm4gYSAyMC80MCBCU1MgQ29leGlzdGVuY2UgbWdtdCBmcmFtZS4gIFNvIHdlIGZpcnN0IHN0YXJ0cyBhIHNjYW4sIHRoZW4gc2VuZCBiYWNrIDIwLzQwIEJTUyBDb2V4aXN0ZW5jZSBtZ210IGZyYW1lCisJaWYgKChCc3NDb2V4aXN0LmZpZWxkLkluZm9SZXEgPT0gMSkgJiYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0NBTl8yMDQwKSkpCisJeworCQkvLyBDbGVhciByZWNvcmQgZmlyc3QuICBBZnRlciBzY2FuICwgd2lsbCB1cGRhdGUgdGhvc2UgYml0IGFuZCBzZW5kIGJhY2sgdG8gdHJhbnNtaXRlci4KKwkJcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAuZmllbGQuSW5mb1JlcSA9IDE7CisJCXBBZC0+Q29tbW9uQ2ZnLkJTU0NvZXhpc3QyMDQwLmZpZWxkLkludG9sZXJhbnQ0MCA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkJTU0NvZXhpc3QyMDQwLmZpZWxkLkJTUzIwV2lkdGhSZXEgPSAwOworCQkvLyBGaWxsIG91dCBzdHVmZiBmb3Igc2NhbiByZXF1ZXN0CisJCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCBaZXJvU3NpZCwgMCwgQlNTX0FOWSwgU0NBTl8yMDQwX0JTU19DT0VYSVNUKTsKKwkJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NDQU5fUkVRLCBzaXplb2YoTUxNRV9TQ0FOX1JFUV9TVFJVQ1QpLCAmU2NhblJlcSk7CisJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0xJU1RfU0NBTjsKKwl9Cit9CisKKworLyoKK0Rlc2NyaXB0aW9uIDogQnVpbGQgSW50b2xlcmFudCBDaGFubmVsIFJlcnBvdCBmcm9tIFRyaWdnZXIgZXZlbnQgdGFibGUuCityZXR1cm4gOiBob3cgbWFueSBieXRlcyBjb3BpZWQuCisqLworVUxPTkcgQnVpbGRJbnRvbGVyYW50Q2hhbm5lbFJlcCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgICBQVUNIQVIgIHBEZXN0KQoreworCVVMT05HCQkJRnJhbWVMZW4gPSAwOworCVVMT05HCQkJUmVhZE9mZnNldCA9IDA7CisJVUNIQVIJCQlpOworCVVDSEFSCQkJTGFzdFJlZ0NsYXNzID0gMHhmZjsKKwlQVUNIQVIJCQlwTGVuOworCisJZm9yICggaSA9IDA7aSA8IE1BWF9UUklHR0VSX0VWRU5UO2krKykKKwl7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLmJWYWxpZCA9PSBUUlVFKQorCQl7CisJCQlpZiAocEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5SZWdDbGFzcyA9PSBMYXN0UmVnQ2xhc3MpCisJCQl7CisJCQkJKihwRGVzdCArIFJlYWRPZmZzZXQpID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFbaV0uQ2hhbm5lbDsKKwkJCQkqcExlbisrOworCQkJCVJlYWRPZmZzZXQrKzsKKwkJCQlGcmFtZUxlbisrOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCSoocERlc3QgKyBSZWFkT2Zmc2V0KSA9IElFXzIwNDBfQlNTX0lOVE9MRVJBTlRfUkVQT1JUOyAgLy8gSUUKKwkJCQkqKHBEZXN0ICsgUmVhZE9mZnNldCArIDEpID0gMjsJLy8gTGVuID0gUmVnQ2xhc3MgYnl0ZSArIGNoYW5uZWwgYnl0ZS4KKwkJCQlwTGVuID0gcERlc3QgKyBSZWFkT2Zmc2V0ICsgMTsKKwkJCQlMYXN0UmVnQ2xhc3MgPSBwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLlJlZ0NsYXNzOworCQkJCSoocERlc3QgKyBSZWFkT2Zmc2V0ICsgMikgPSBMYXN0UmVnQ2xhc3M7CS8vIExlbiA9IFJlZ0NsYXNzIGJ5dGUgKyBjaGFubmVsIGJ5dGUuCisJCQkJKihwRGVzdCArIFJlYWRPZmZzZXQgKyAzKSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLkNoYW5uZWw7CisJCQkJRnJhbWVMZW4gKz0gNDsKKwkJCQlSZWFkT2Zmc2V0ICs9IDQ7CisJCQl9CisKKwkJfQorCX0KKwlyZXR1cm4gRnJhbWVMZW47Cit9CisKKworLyoKK0Rlc2NyaXB0aW9uIDogU2VuZCAyMC80MCBCU1MgQ29leGlzdGVuY2UgQWN0aW9uIGZyYW1lIElmIG9uZSB0cmlnZ2VyIGV2ZW50IGlzIHRyaWdnZXJlZC4KKyovCitWT0lEIFNlbmQyMDQwQ29leGlzdEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgICBVQ0hBUiAgV2NpZCwKKwlJTglCT09MRUFOCWJBZGRJbnRvbGVyYW50Q2hhKQoreworCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTIAlOU3RhdHVzOworCUZSQU1FX0FDVElPTl9IRFIJRnJhbWU7CisJVUxPTkcJCQlGcmFtZUxlbjsKKwlVTE9ORwkJCUludG9sZXJhbnRDaGFSZXBMZW47CisKKwlJbnRvbGVyYW50Q2hhUmVwTGVuID0gMDsKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQUNUIC0gU2VuZDIwNDBDb2V4aXN0QWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJcmV0dXJuOworCX0KKwlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJRnJhbWUuQ2F0ZWdvcnkgPSBDQVRFR09SWV9QVUJMSUM7CisJRnJhbWUuQWN0aW9uID0gQUNUSU9OX0JTU18yMDQwX0NPRVhJU1Q7CisKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJCQkmRnJhbWVMZW4sCisJCQkJICBzaXplb2YoRlJBTUVfQUNUSU9OX0hEUiksCSAgJkZyYW1lLAorCQkJCSAgRU5EX09GX0FSR1MpOworCisJKihwT3V0QnVmZmVyICsgRnJhbWVMZW4pID0gcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAud29yZDsKKwlGcmFtZUxlbisrOworCisJaWYgKGJBZGRJbnRvbGVyYW50Q2hhID09IFRSVUUpCisJCUludG9sZXJhbnRDaGFSZXBMZW4gPSBCdWlsZEludG9sZXJhbnRDaGFubmVsUmVwKHBBZCwgcE91dEJ1ZmZlciArIEZyYW1lTGVuKTsKKworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbiArIEludG9sZXJhbnRDaGFSZXBMZW4pOworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQUNUIC0gU2VuZDIwNDBDb2V4aXN0QWN0aW9uKCBCU1NDb2V4aXN0MjA0MCA9IDB4JXggKSAgXG4iLCBwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC53b3JkKSk7CisKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJQWZ0ZXIgc2NhbiwgVXBkYXRlIDIwLzQwIEJTUyBDb2V4aXN0ZW5jZSBJRSBhbmQgc2VuZCBvdXQuCisJQWNjb3JkaW5nIHRvIDgwMi4xMW4gRDMuMDMgMTEuMTQuMTAKKworCVBhcmFtZXRlcnM6CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBVcGRhdGUyMDQwQ29leGlzdEZyYW1lQW5kTm90aWZ5KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICAgIFVDSEFSICBXY2lkLAorCUlOCUJPT0xFQU4JYkFkZEludG9sZXJhbnRDaGEpCit7CisJQlNTXzIwNDBfQ09FWElTVF9JRQlPbGRWYWx1ZTsKKworCU9sZFZhbHVlLndvcmQgPSBwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC53b3JkOworCWlmICgocEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QU5vID4gMCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEJDb3VudERvd24gPiAwKSkKKwkJcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAuZmllbGQuQlNTMjBXaWR0aFJlcSA9IDE7CisKKwkvLyBOZWVkIHRvIGNoZWNrICEhISEKKwkvLyBIb3cgU1RBIHdpbGwgc2V0IEludG9sZXJhbnQ0MCBpZiBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQuIE5vdyB3ZSBkb24ndCBzZXQgdGhpcyBiaXQgZmlyc3QuISEhISEKKwkvLyBTbyBPbmx5IGNoZWNrIEJTUzIwV2lkdGhSZXEgY2hhbmdlLgorCWlmIChPbGRWYWx1ZS5maWVsZC5CU1MyMFdpZHRoUmVxICE9IHBBZC0+Q29tbW9uQ2ZnLkJTU0NvZXhpc3QyMDQwLmZpZWxkLkJTUzIwV2lkdGhSZXEpCisJeworCQlTZW5kMjA0MENvZXhpc3RBY3Rpb24ocEFkLCBXY2lkLCBiQWRkSW50b2xlcmFudENoYSk7CisJfQorfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKK0JPT0xFQU4gQ2hhbm5lbFN3aXRjaFNhbml0eUNoZWNrKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICAgIFVDSEFSICBXY2lkLAorCUlOICAgIFVDSEFSICBOZXdDaGFubmVsLAorCUlOICAgIFVDSEFSICBTZWNvbmRhcnkpCit7CisJVUNIQVIJCWk7CisKKwlpZiAoV2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJcmV0dXJuIEZBTFNFOworCisJaWYgKChOZXdDaGFubmVsID4gNykgJiYgKFNlY29uZGFyeSA9PSAxKSkKKwkJcmV0dXJuIEZBTFNFOworCisJaWYgKChOZXdDaGFubmVsIDwgNSkgJiYgKFNlY29uZGFyeSA9PSAzKSkKKwkJcmV0dXJuIEZBTFNFOworCisJLy8gMC4gQ2hlY2sgaWYgbmV3IGNoYW5uZWwgaXMgaW4gdGhlIGNoYW5uZWxsaXN0LgorCWZvciAoaSA9IDA7aSA8IHBBZC0+Q2hhbm5lbExpc3ROdW07aSsrKQorCXsKKwkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCA9PSBOZXdDaGFubmVsKQorCQl7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpID09IHBBZC0+Q2hhbm5lbExpc3ROdW0pCisJCXJldHVybiBGQUxTRTsKKworCXJldHVybiBUUlVFOworfQorCisKK1ZPSUQgQ2hhbm5lbFN3aXRjaEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgICBVQ0hBUiAgV2NpZCwKKwlJTiAgICBVQ0hBUiAgTmV3Q2hhbm5lbCwKKwlJTiAgICBVQ0hBUiAgU2Vjb25kYXJ5KQoreworCVVDSEFSCQlCQlBWYWx1ZSA9IDA7CisJVUxPTkcJCU1BQ1ZhbHVlOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTUEVDVFJVTSAtIENoYW5uZWxTd2l0Y2hBY3Rpb24oTmV3Q2hhbm5lbCA9ICVkICwgU2Vjb25kYXJ5ID0gJWQpICBcbiIsIE5ld0NoYW5uZWwsIFNlY29uZGFyeSkpOworCisJaWYgKENoYW5uZWxTd2l0Y2hTYW5pdHlDaGVjayhwQWQsIFdjaWQsIE5ld0NoYW5uZWwsIFNlY29uZGFyeSkgPT0gRkFMU0UpCisJCXJldHVybjsKKworCS8vIDEuICBTd2l0Y2hlcyB0byBCVyA9IDIwLgorCWlmIChTZWNvbmRhcnkgPT0gMCkKKwl7CisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKKwkJQkJQVmFsdWUmPSAofjB4MTgpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7CisJCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKKwkJeworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIDB4MTYpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsIDB4MDgpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzMsIDB4MTEpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhcnQyODYwQyAhISEgXG4iICkpOworCQl9CisJCXBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzIwOworCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsID0gTmV3Q2hhbm5lbDsKKwkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsRkFMU0UpOworCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5IVFBoeU1vZGUuZmllbGQuQlcgPSAwOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEyME1IeiAgICEhISBcbiIgKSk7CisJfQorCS8vIDEuICBTd2l0Y2hlcyB0byBCVyA9IDQwIEFuZCBTdGF0aW9uIHN1cHBvcnRzIEJXID0gNDAuCisJZWxzZSBpZiAoKChTZWNvbmRhcnkgPT0gMSkgfHwgKFNlY29uZGFyeSA9PSAzKSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IDEpKQorCXsKKwkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IE5ld0NoYW5uZWw7CisKKwkJaWYgKFNlY29uZGFyeSA9PSAxKQorCQl7CisJCQkvLyBTZWNvbmRhcnkgYWJvdmUuCisJCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgKyAyOworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJk1BQ1ZhbHVlKTsKKwkJCU1BQ1ZhbHVlICY9IDB4ZmU7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgTUFDVmFsdWUpOworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOworCQkJQkJQVmFsdWUmPSAofjB4MTgpOworCQkJQkJQVmFsdWV8PSAoMHgxMCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7CisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCQlBWYWx1ZSk7CisJCQlCQlBWYWx1ZSY9ICh+MHgyMCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCQlBWYWx1ZSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISE0ME1IeiBMb3dlciBMSU5LIFVQICEhISBDb250cm9sIENoYW5uZWwgYXQgQmVsb3cuIENlbnRyYWwgPSAlZCBcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICkpOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gU2Vjb25kYXJ5IGJlbG93LgorCQkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsIC0gMjsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZNQUNWYWx1ZSk7CisJCQlNQUNWYWx1ZSAmPSAweGZlOworCQkJTUFDVmFsdWUgfD0gMHgxOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIE1BQ1ZhbHVlKTsKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKKwkJCUJCUFZhbHVlJj0gKH4weDE4KTsKKwkJCUJCUFZhbHVlfD0gKDB4MTApOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQkJQVmFsdWUpOworCQkJQkJQVmFsdWUmPSAofjB4MjApOworCQkJQkJQVmFsdWV8PSAoMHgyMCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCQlBWYWx1ZSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISE0ME1IeiBVcHBlciBMSU5LIFVQICEhISBDb250cm9sIENoYW5uZWwgYXQgVXBwZXJDZW50cmFsID0gJWQgXG4iLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCApKTsKKwkJfQorCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV180MDsKKwkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOworCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uSFRQaHlNb2RlLmZpZWxkLkJXID0gMTsKKwl9Cit9CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitWT0lEIFBlZXJQdWJsaWNBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworI2lmZGVmIERPVDExTl9EUkFGVDMKKwlVQ0hBUglBY3Rpb24gPSBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsxXTsKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisKKwlpZiAoRWxlbS0+V2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJcmV0dXJuOworCisjaWZkZWYgRE9UMTFOX0RSQUZUMworCXN3aXRjaChBY3Rpb24pCisJeworCQljYXNlIEFDVElPTl9CU1NfMjA0MF9DT0VYSVNUOgkvLyBGb3JtYXQgZGVmaW5lZCBpbiBJRUVFIDcuNC43YS4xIGluIDExbiBEcmFmMy4wMworCQkJeworCQkJCS8vVUNIQVIJQnNzQ29leGlzdDsKKwkJCQlCU1NfMjA0MF9DT0VYSVNUX0VMRU1FTlQJCSpwQ29leGlzdEluZm87CisJCQkJQlNTXzIwNDBfQ09FWElTVF9JRSAJCQkqcEJzc0NvZXhpc3RJZTsKKwkJCQlCU1NfMjA0MF9JTlRPTEVSQU5UX0NIX1JFUE9SVAkqcEludG9sZXJhbnRSZXBvcnQgPSBOVUxMOworCisJCQkJaWYgKEVsZW0tPk1zZ0xlbiA8PSAoTEVOR1RIXzgwMl8xMSArIHNpemVvZihCU1NfMjA0MF9DT0VYSVNUX0VMRU1FTlQpKSApCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBQ1RJT04gLSAyMC80MCBCU1MgQ29leGlzdGVuY2UgTWFuYWdlbWVudCBGcmFtZSBsZW5ndGggdG9vIHNob3J0ISBsZW4gPSAlbGQhXG4iLCBFbGVtLT5Nc2dMZW4pKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFDVElPTiAtIDIwLzQwIEJTUyBDb2V4aXN0ZW5jZSBNYW5hZ2VtZW50IGFjdGlvbi0tLS0+IFxuIikpOworCQkJCWhleF9kdW1wKCJDb2V4aXN0ZW5jZU1nbXRGcmFtZSIsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKTsKKworCisJCQkJcENvZXhpc3RJbmZvID0gKEJTU18yMDQwX0NPRVhJU1RfRUxFTUVOVCAqKSAmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMl07CisJCQkJLy9oZXhfZHVtcCgiQ29leGlzdEluZm8iLCAoUFVDSEFSKXBDb2V4aXN0SW5mbywgc2l6ZW9mKEJTU18yMDQwX0NPRVhJU1RfRUxFTUVOVCkpOworCQkJCWlmIChFbGVtLT5Nc2dMZW4gPj0gKExFTkdUSF84MDJfMTEgKyBzaXplb2YoQlNTXzIwNDBfQ09FWElTVF9FTEVNRU5UKSArIHNpemVvZihCU1NfMjA0MF9JTlRPTEVSQU5UX0NIX1JFUE9SVCkpKQorCQkJCXsKKwkJCQkJcEludG9sZXJhbnRSZXBvcnQgPSAoQlNTXzIwNDBfSU5UT0xFUkFOVF9DSF9SRVBPUlQgKikoKFBVQ0hBUilwQ29leGlzdEluZm8gKyBzaXplb2YoQlNTXzIwNDBfQ09FWElTVF9FTEVNRU5UKSk7CisJCQkJfQorCQkJCS8vaGV4X2R1bXAoIkludG9sZXJhbnRSZXBvcnQgIiwgKFBVQ0hBUilwSW50b2xlcmFudFJlcG9ydCwgc2l6ZW9mKEJTU18yMDQwX0lOVE9MRVJBTlRfQ0hfUkVQT1JUKSk7CisKKwkJCQlwQnNzQ29leGlzdEllID0gKEJTU18yMDQwX0NPRVhJU1RfSUUgKikoJnBDb2V4aXN0SW5mby0+QnNzQ29leGlzdEllKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJeworCQkJCQlpZiAoSU5GUkFfT04ocEFkKSkKKwkJCQkJeworCQkJCQkJU3RhUHVibGljQWN0aW9uKHBBZCwgcENvZXhpc3RJbmZvKTsKKwkJCQkJfQorCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkJfQorCQkJYnJlYWs7CisJfQorCisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCit9CisKKworc3RhdGljIFZPSUQgUmVzZXJ2ZWRBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSIENhdGVnb3J5OworCisJaWYgKEVsZW0tPk1zZ0xlbiA8PSBMRU5HVEhfODAyXzExKQorCXsKKwkJcmV0dXJuOworCX0KKworCUNhdGVnb3J5ID0gRWxlbS0+TXNnW0xFTkdUSF84MDJfMTFdOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUmN2IHJlc2VydmVkIGNhdGVnb3J5KCVkKSBBY3Rpb24gRnJhbWVcbiIsIENhdGVnb3J5KSk7CisJaGV4X2R1bXAoIlJlc2VydmVkIEFjdGlvbiBGcmFtZSIsICZFbGVtLT5Nc2dbMF0sIEVsZW0tPk1zZ0xlbik7Cit9CisKK1ZPSUQgUGVlclJNQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKKworeworCXJldHVybjsKK30KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorc3RhdGljIFZPSUQgcmVzcG9uZF9odF9pbmZvcm1hdGlvbl9leGNoYW5nZV9hY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTCQlOU3RhdHVzOworCVVMT05HCQkJRnJhbWVMZW47CisJRlJBTUVfSFRfSU5GTwlIVElORk9mcmFtZSwgKnBGcmFtZTsKKwlVQ0hBUiAgIAkJKnBBZGRyOworCisKKwkvLyAyLiBBbHdheXMgc2VuZCBiYWNrIEFEREJBIFJlc3BvbnNlCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsJIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKworCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFDVElPTiAtIHJlc3BvbmRfaHRfaW5mb3JtYXRpb25fZXhjaGFuZ2VfYWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCS8vIGdldCBSQQorCXBGcmFtZSA9IChGUkFNRV9IVF9JTkZPICopICZFbGVtLT5Nc2dbMF07CisJcEFkZHIgPSBwRnJhbWUtPkhkci5BZGRyMjsKKworCU5kaXNaZXJvTWVtb3J5KCZIVElORk9mcmFtZSwgc2l6ZW9mKEZSQU1FX0hUX0lORk8pKTsKKwkvLyAyLTEuIFByZXBhcmUgQUREQkEgUmVzcG9uc2UgZnJhbWUuCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWlmIChBREhPQ19PTihwQWQpKQorCQkJQWN0SGVhZGVySW5pdChwQWQsICZIVElORk9mcmFtZS5IZHIsIHBBZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCWVsc2UKKwkJCUFjdEhlYWRlckluaXQocEFkLCAmSFRJTkZPZnJhbWUuSGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkZHIpOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCUhUSU5GT2ZyYW1lLkNhdGVnb3J5ID0gQ0FURUdPUllfSFQ7CisJSFRJTkZPZnJhbWUuQWN0aW9uID0gSFRfSU5GT19FWENIQU5HRTsKKwlIVElORk9mcmFtZS5IVF9JbmZvLlJlcXVlc3QgPSAwOworCUhUSU5GT2ZyYW1lLkhUX0luZm8uRm9ydHlfTUh6X0ludG9sZXJhbnQgPSBwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkZvcnR5X01oel9JbnRvbGVyYW50OworCUhUSU5GT2ZyYW1lLkhUX0luZm8uU1RBX0NoYW5uZWxfV2lkdGgJID0gcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5SZWNvbVdpZHRoOworCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJCSZGcmFtZUxlbiwKKwkJCQkJICBzaXplb2YoRlJBTUVfSFRfSU5GTyksCSZIVElORk9mcmFtZSwKKwkJCQkJICBFTkRfT0ZfQVJHUyk7CisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Cit9CisKKworI2lmZGVmIERPVDExTl9EUkFGVDMKK1ZPSUQgU2VuZE5vdGlmeUJXQWN0aW9uRnJhbWUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgIFdjaWQsCisJSU4gVUNIQVIgYXBpZHgpCit7CisJUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMgCU5TdGF0dXM7CisJRlJBTUVfQUNUSU9OX0hEUglGcmFtZTsKKwlVTE9ORwkJCUZyYW1lTGVuOworCVBVQ0hBUgkJCXBBZGRyMTsKKworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkFDVCAtIFNlbmROb3RpZnlCV0FjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoV2NpZCA9PSBNQ0FTVF9XQ0lEKQorCQlwQWRkcjEgPSAmQlJPQURDQVNUX0FERFJbMF07CisJZWxzZQorCQlwQWRkcjEgPSBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkFkZHI7CisJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBBZGRyMSwgcEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLkJzc2lkLCBwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uQnNzaWQpOworCisJRnJhbWUuQ2F0ZWdvcnkgPSBDQVRFR09SWV9IVDsKKwlGcmFtZS5BY3Rpb24gPSBOT1RJRllfQldfQUNUSU9OOworCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAorCQkJCSAgc2l6ZW9mKEZSQU1FX0FDVElPTl9IRFIpLAkgICZGcmFtZSwKKwkJCQkgIEVORF9PRl9BUkdTKTsKKworCSoocE91dEJ1ZmZlciArIEZyYW1lTGVuKSA9IHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aDsKKwlGcmFtZUxlbisrOworCisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQUNUIC0gU2VuZE5vdGlmeUJXQWN0aW9uKE5vdGlmeUJXPSAlZCkhXG4iLCBwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLlJlY29tV2lkdGgpKTsKKworfQorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKworCitWT0lEIFBlZXJIVEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVUNIQVIJQWN0aW9uID0gRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMV07CisKKwlpZiAoRWxlbS0+V2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJcmV0dXJuOworCisJc3dpdGNoKEFjdGlvbikKKwl7CisJCWNhc2UgTk9USUZZX0JXX0FDVElPTjoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQUNUSU9OIC0gSFQgTm90aWZ5IENoYW5uZWwgYmFuZHdpZHRoIGFjdGlvbi0tLS0+IFxuIikpOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJaWYocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gRkFMU0UpCisJCQl7CisJCQkJLy8gTm90ZSwgdGhpcyBpcyB0byBwYXRjaCBESVItMTM1MyBBUC4gV2hlbiB0aGUgQVAgc2V0IHRvIFdlcCwgaXQgd2lsbCB1c2UgbGVnYWN5IG1vZGUuIEJ1dCBBUCBzdGlsbCBrZWVwcworCQkJCS8vIHNlbmRpbmcgQldfTm90aWZ5IEFjdGlvbiBmcmFtZSwgYW5kIGNhdXNlIHVzIHRvIGxpbmt1cCBhbmQgbGlua2Rvd24uCisJCQkJLy8gSW4gbGVnYWN5IG1vZGUsIGRvbid0IG5lZWQgdG8gcGFyc2UgSFQgYWN0aW9uIGZyYW1lLgorCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQUNUSU9OIC1JZ25vcmUgSFQgTm90aWZ5IENoYW5uZWwgQlcgd2hlbiBsaW5rIGFzIGxlZ2FjeSBtb2RlLiBCVyA9ICVkLS0tPiBcbiIsCisJCQkJCQkJCUVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdICkpOworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCQlpZiAoRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMl0gPT0gMCkJLy8gNy40LjguMi4gaWYgdmFsdWUgaXMgMSwga2VlcCB0aGUgc2FtZSBhcyBzdXBwb3J0ZWQgY2hhbm5lbCBiYW5kd2lkdGguCisJCQkJcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5IVFBoeU1vZGUuZmllbGQuQlcgPSAwOworCisJCQlicmVhazsKKwkJY2FzZSBTTVBTX0FDVElPTjoKKwkJCS8vIDcuMy4xLjI1CisgCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1RJT04gLSBTTVBTIGFjdGlvbi0tLS0+IFxuIikpOworCQkJaWYgKCgoRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMl0mMHgxKSA9PSAwKSkKKwkJCXsKKwkJCQlwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLk1tcHNNb2RlID0gTU1QU19FTkFCTEU7CisJCQl9CisJCQllbHNlIGlmICgoKEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdJjB4MikgPT0gMCkpCisJCQl7CisJCQkJcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5NbXBzTW9kZSA9IE1NUFNfU1RBVElDOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uTW1wc01vZGUgPSBNTVBTX0RZTkFNSUM7CisJCQl9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQWlkKCVkKSBNSU1PIFBTID0gJWRcbiIsIEVsZW0tPldjaWQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uTW1wc01vZGUpKTsKKwkJCS8vIHJ0Mjg2MGMgOiBhZGQgc29tZXRoaW5nIGZvciBzbXBzIGNoYW5nZS4KKwkJCWJyZWFrOworCisJCWNhc2UgU0VUUENPX0FDVElPTjoKKwkJCWJyZWFrOworCQljYXNlIE1JTU9fQ0hBX01FQVNVUkVfQUNUSU9OOgorCQkJYnJlYWs7CisJCWNhc2UgSFRfSU5GT19FWENIQU5HRToKKwkJCXsKKwkJCQlIVF9JTkZPUk1BVElPTl9PQ1RFVAkqcEhUX2luZm87CisKKwkJCQlwSFRfaW5mbyA9IChIVF9JTkZPUk1BVElPTl9PQ1RFVCAqKSAmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMl07CisgICAgCQkJCS8vIDcuNC44LjEwCisgICAgCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQUNUSU9OIC0gSFQgSW5mb3JtYXRpb24gRXhjaGFuZ2UgYWN0aW9uLS0tLT4gXG4iKSk7CisgICAgCQkJCWlmIChwSFRfaW5mby0+UmVxdWVzdCkKKyAgICAJCQkJeworICAgIAkJCQkJcmVzcG9uZF9odF9pbmZvcm1hdGlvbl9leGNoYW5nZV9hY3Rpb24ocEFkLCBFbGVtKTsKKyAgICAJCQkJfQorCQkJfQorICAgIAkJCWJyZWFrOworCX0KK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVJldHJ5IHNlbmRpbmcgQUREQkEgUmVxZXN0LgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlQYXJhbWV0cnM6CisJcDgwMjNIZWFkZXI6IGlmIHRoaXMgaXMgYWxyZWFkeSA4MDIuMyBmb3JtYXQsIHA4MDIzSGVhZGVyIGlzIE5VTEwKKworCVJldHVybgk6IFRSVUUgaWYgcHV0IGludG8gcnggcmVvcmRlcmluZyBidWZmZXIsIHNob3VsZG4ndCBpbmRpY2F0ZXJ4aGVyZS4KKwkJCQlGQUxTRSAsIHRoZW4gY29udGludWUgaW5kaWNhdGVyeCBhdCB0aGlzIG1vbWVudC4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE9SSUJBVGltZXJUaW1lb3V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5OworCUlOVAkJCWksIHRvdGFsOworCVVDSEFSCQkJVElEOworCisjaWZkZWYgUkFMSU5LX0FURQorCWlmIChBVEVfT04ocEFkKSkKKwkJcmV0dXJuOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCXRvdGFsID0gcEFkLT5NYWNUYWIuU2l6ZSAqIE5VTV9PRl9USUQ7CisKKwlmb3IgKGkgPSAxOyAoKGkgPE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFKSAmJiAodG90YWwgPiAwKSkgOyBpKyspCisJeworCQlpZiAgKHBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W2ldLk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9Eb25lKQorCQl7CisJCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpXS5XY2lkXTsKKwkJCVRJRCA9IHBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W2ldLlRJRDsKKworCQkJQVNTRVJUKHBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W2ldLldjaWQgPCBNQVhfTEVOX09GX01BQ19UQUJMRSk7CisJCX0KKwkJdG90YWwgLS07CisJfQorfQorCisKK1ZPSUQgU2VuZFJlZnJlc2hCQVIoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnkpCit7CisJRlJBTUVfQkFSCQlGcmFtZUJhcjsKKwlVTE9ORwkJCUZyYW1lTGVuOworCU5ESVNfU1RBVFVTIAlOU3RhdHVzOworCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOworCVVTSE9SVAkJCVNlcXVlbmNlOworCVVDSEFSCQkJaSwgVElEOworCVVTSE9SVAkJCWlkeDsKKwlCQV9PUklfRU5UUlkJKnBCQUVudHJ5OworCisJZm9yIChpID0gMDsgaSA8TlVNX09GX1RJRDsgaSsrKQorCXsKKwkJaWR4ID0gcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtpXTsKKwkJaWYgKGlkeCA9PSAwKQorCQl7CisJCQljb250aW51ZTsKKwkJfQorCQlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpZHhdOworCisJCWlmICAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9Eb25lKQorCQl7CisJCQlUSUQgPSBwQkFFbnRyeS0+VElEOworCisJCQlBU1NFUlQocEJBRW50cnktPldjaWQgPCBNQVhfTEVOX09GX01BQ19UQUJMRSk7CisKKwkJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJCQSAtIE1sbWVBRERCQUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQlTZXF1ZW5jZSA9IHBFbnRyeS0+VHhTZXFbVElEXTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJQmFySGVhZGVySW5pdChwQWQsICZGcmFtZUJhciwgcEVudHJ5LT5BZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuRnJhZ051bSA9IDA7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmN0aW9uLgorCQkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEgPSBTZXF1ZW5jZTsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCisJCQlGcmFtZUJhci5CYXJDb250cm9sLlRJRCA9IFRJRDsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCisKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkJCSZGcmFtZUxlbiwKKwkJCQkJCQkgIHNpemVvZihGUkFNRV9CQVIpLAkgICZGcmFtZUJhciwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCWlmICgxKQkvLyBOb3cgd2UgYWx3YXlzIHNlbmQgQkFSLgorCQkJeworCQkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQkJfQorCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJfQorCX0KK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBBY3RIZWFkZXJJbml0KAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorICAgIElOIE9VVCBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCisgICAgSU4gUFVDSEFSIEFkZHIxLAorICAgIElOIFBVQ0hBUiBBZGRyMiwKKyAgICBJTiBQVUNIQVIgQWRkcjMpCit7CisgICAgTmRpc1plcm9NZW1vcnkocEhkcjgwMjExLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworICAgIHBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX01HTVQ7CisgICAgcEhkcjgwMjExLT5GQy5TdWJUeXBlID0gU1VCVFlQRV9BQ1RJT047CisKKyAgICBDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjEsIEFkZHIxKTsKKwlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjIsIEFkZHIyKTsKKyAgICBDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjMsIEFkZHIzKTsKK30KKworVk9JRCBCYXJIZWFkZXJJbml0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOIE9VVCBQRlJBTUVfQkFSIHBDbnRsQmFyLAorCUlOIFBVQ0hBUiBwREEsCisJSU4gUFVDSEFSIHBTQSkKK3sKKwlOZGlzWmVyb01lbW9yeShwQ250bEJhciwgc2l6ZW9mKEZSQU1FX0JBUikpOworCXBDbnRsQmFyLT5GQy5UeXBlID0gQlRZUEVfQ05UTDsKKwlwQ250bEJhci0+RkMuU3ViVHlwZSA9IFNVQlRZUEVfQkxPQ0tfQUNLX1JFUTsKKyAgIAlwQ250bEJhci0+QmFyQ29udHJvbC5NVElEID0gMDsKKwlwQ250bEJhci0+QmFyQ29udHJvbC5Db21wcmVzc2VkID0gMTsKKwlwQ250bEJhci0+QmFyQ29udHJvbC5BQ0tQb2xpY3kgPSAwOworCisKKwlwQ250bEJhci0+RHVyYXRpb24gPSAxNiArIFJUTVBDYWxjRHVyYXRpb24ocEFkLCBSQVRFXzEsIHNpemVvZihGUkFNRV9CQSkpOworCisJQ09QWV9NQUNfQUREUihwQ250bEJhci0+QWRkcjEsIHBEQSk7CisJQ09QWV9NQUNfQUREUihwQ250bEJhci0+QWRkcjIsIHBTQSk7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlJbnNlcnQgQ2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlIGludG8gdGhlIGFjdGlvbiBmcmFtZS4KKworCVBhcmFtZXRyczoKKwkJMS4gZnJhbWUgYnVmZmVyIHBvaW50ZXIuCisJCTIuIGZyYW1lIGxlbmd0aC4KKwkJMy4gY2F0ZWdvcnkgY29kZSBvZiB0aGUgZnJhbWUuCisJCTQuIGFjdGlvbiBjb2RlIG9mIHRoZSBmcmFtZS4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBJbnNlcnRBY3RGaWVsZCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKKwlPVVQgUFVMT05HIHBGcmFtZUxlbiwKKwlJTiBVSU5UOCBDYXRlZ29yeSwKKwlJTiBVSU5UOCBBY3RDb2RlKQoreworCVVMT05HIFRlbXBMZW47CisKKwlNYWtlT3V0Z29pbmdGcmFtZSgJcEZyYW1lQnVmLAkJJlRlbXBMZW4sCisJCQkJCQkxLAkJCQkmQ2F0ZWdvcnksCisJCQkJCQkxLAkJCQkmQWN0Q29kZSwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKworCSpwRnJhbWVMZW4gPSAqcEZyYW1lTGVuICsgVGVtcExlbjsKKworCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2FjdGlvbi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vYWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UzODc3ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2FjdGlvbi5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJYWlyb25ldC5oCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCisJUGF1bCBMaW4JMDQtMDYtMTUJCUluaXRpYWwKKyovCisKKyNpZm5kZWYJX19BQ1RJT05fSF9fCisjZGVmaW5lCV9fQUNUSU9OX0hfXworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX19IVF9JTkZPX09DVEVUCit7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCVJlc2VydmVkOjU7CisJVUNIQVIgCVNUQV9DaGFubmVsX1dpZHRoOjE7CisJVUNIQVIJRm9ydHlfTUh6X0ludG9sZXJhbnQ6MTsKKwlVQ0hBUglSZXF1ZXN0OjE7CisjZWxzZQorCVVDSEFSCVJlcXVlc3Q6MTsKKwlVQ0hBUglGb3J0eV9NSHpfSW50b2xlcmFudDoxOworCVVDSEFSIAlTVEFfQ2hhbm5lbF9XaWR0aDoxOworCVVDSEFSCVJlc2VydmVkOjU7CisjZW5kaWYKK30gSFRfSU5GT1JNQVRJT05fT0NURVQ7CisKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9fRlJBTUVfSFRfSU5GTworeworCUhFQURFUl84MDJfMTEgICAJCUhkcjsKKwlVQ0hBUgkJCQkJQ2F0ZWdvcnk7CisJVUNIQVIJCQkJCUFjdGlvbjsKKwlIVF9JTkZPUk1BVElPTl9PQ1RFVAlIVF9JbmZvOworfSAgIEZSQU1FX0hUX0lORk8sICpQRlJBTUVfSFRfSU5GTzsKKworI2VuZGlmIC8qIF9fQUNUSU9OX0hfXyAqLworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2JhX2FjdGlvbi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vYmFfYWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkxZDFlMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2JhX2FjdGlvbi5jCkBAIC0wLDAgKzEsMTgwMiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKworCisjZGVmaW5lIEJBX09SSV9JTklUX1NFUQkJKHBFbnRyeS0+VHhTZXFbVElEXSkgLy8xCQkJLy8gaW5pdGFsIHNlcXVlbmNlIG51bWJlciBvZiBCQSBzZXNzaW9uCisKKyNkZWZpbmUgT1JJX1NFU1NJT05fTUFYX1JFVFJZCTgKKyNkZWZpbmUgT1JJX0JBX1NFU1NJT05fVElNRU9VVAkoMjAwMCkJLy8gbXMKKyNkZWZpbmUgUkVDX0JBX1NFU1NJT05fSURMRV9USU1FT1VUCSgxMDAwKQkvLyBtcworCisjZGVmaW5lIFJFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQJCSgoMTAwICogSFopLzEwMDApCS8vIHN5c3RlbSB0aWNrcyAtLSAxMDAgbXMKKyNkZWZpbmUgTUFYX1JFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQJKCgzMDAwICogSFopLzEwMDApCS8vIHN5c3RlbSB0aWNrcyAtLSAxMDAgbXMKKworI2RlZmluZSBSRVNFVF9SQ1ZfU0VRCQkoMHhGRkZGKQorCitzdGF0aWMgdm9pZCBiYV9tcGR1X2Jsa19mcmVlKFBSVE1QX0FEQVBURVIgcEFkLCBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2Jsayk7CisKKworQkFfT1JJX0VOVFJZICpCQVRhYmxlQWxsb2NPcmlFbnRyeSgKKwkJCQkJCQkJICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwkJCQkJCQkJICBPVVQgVVNIT1JUICAgICAgICAgICpJZHgpOworCitCQV9SRUNfRU5UUlkgKkJBVGFibGVBbGxvY1JlY0VudHJ5KAorCQkJCQkJCQkgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCQkJCQkJCQkgIE9VVCBVU0hPUlQgICAgICAgICAgKklkeCk7CisKK1ZPSUQgQkFPcmlTZXNzaW9uU2V0dXBUaW1lb3V0KAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKyAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgQkFSZWNTZXNzaW9uSWRsZVRpbWVvdXQoCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworCitCVUlMRF9USU1FUl9GVU5DVElPTihCQU9yaVNlc3Npb25TZXR1cFRpbWVvdXQpOworQlVJTERfVElNRVJfRlVOQ1RJT04oQkFSZWNTZXNzaW9uSWRsZVRpbWVvdXQpOworCisjZGVmaW5lIEFOTk9VTkNFX1JFT1JERVJJTkdfUEFDS0VUKF9wQWQsIF9tcGR1X2JsaykJXAorCQkJQW5ub3VuY2VfUmVvcmRlcmluZ19QYWNrZXQoX3BBZCwgX21wZHVfYmxrKTsKKworVk9JRCBCQV9NYXhXaW5TaXplUmVhc2lnbigKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnlQZWVyLAorCU9VVCBVQ0hBUgkJCSpwV2luU2l6ZSkKK3sKKwlVQ0hBUiBNYXhTaXplOworCisKKwlpZiAocEFkLT5NQUNWZXJzaW9uID49IFJBTElOS18yODgzX1ZFUlNJT04pIC8vIDMqMworCXsKKwkJaWYgKHBBZC0+TUFDVmVyc2lvbiA+PSBSQUxJTktfMzA3MF9WRVJTSU9OKQorCQl7CisJCQlpZiAocEVudHJ5UGVlci0+V2VwU3RhdHVzICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQpCisJCQkJTWF4U2l6ZSA9IDc7IC8vIGZvciBub24tb3BlbiBtb2RlCisJCQllbHNlCisJCQkJTWF4U2l6ZSA9IDEzOworCQl9CisJCWVsc2UKKwkJCU1heFNpemUgPSAzMTsKKwl9CisJZWxzZSBpZiAocEFkLT5NQUNWZXJzaW9uID49IFJBTElOS18yODgwRV9WRVJTSU9OKSAvLyAyODgwIGUKKwl7CisJCWlmIChwRW50cnlQZWVyLT5XZXBTdGF0dXMgIT0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCkKKwkJCU1heFNpemUgPSA3OyAvLyBmb3Igbm9uLW9wZW4gbW9kZQorCQllbHNlCisJCQlNYXhTaXplID0gMTM7CisJfQorCWVsc2UKKwkJTWF4U2l6ZSA9IDc7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJiYT4gV2luIFNpemUgPSAlZCwgTWF4IFNpemUgPSAlZFxuIiwKKwkJCSpwV2luU2l6ZSwgTWF4U2l6ZSkpOworCisJaWYgKCgqcFdpblNpemUpID4gTWF4U2l6ZSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImJhPiByZWFzc2lnbiBtYXggd2luIHNpemUgZnJvbSAlZCB0byAlZFxuIiwKKwkJCQkqcFdpblNpemUsIE1heFNpemUpKTsKKworCQkqcFdpblNpemUgPSBNYXhTaXplOworCX0KK30KKwordm9pZCBBbm5vdW5jZV9SZW9yZGVyaW5nX1BhY2tldChJTiBQUlRNUF9BREFQVEVSCQkJcEFkLAorCQkJCQkJCQlJTiBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1CSptcGR1KQoreworCVBORElTX1BBQ0tFVCAgICBwUGFja2V0OworCisJcFBhY2tldCA9IG1wZHUtPnBQYWNrZXQ7CisKKwlpZiAobXBkdS0+YkFNU0RVKQorCXsKKwkJQVNTRVJUKDApOworCQlCQV9SZW9yZGVyX0FNU0RVX0Fubm5vdW5jZShwQWQsIHBQYWNrZXQpOworCX0KKwllbHNlCisJeworCQkvLworCQkvLyBwYXNzIHRoaXMgODAyLjMgcGFja2V0IHRvIHVwcGVyIGxheWVyIG9yIGZvcndhcmQgdGhpcyBwYWNrZXQgdG8gV00gZGlyZWN0bHkKKwkJLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQocEFkLCBwUGFja2V0LCBSVE1QX0dFVF9QQUNLRVRfSUYocFBhY2tldCkpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KK30KKworLyoKKyAqIEluc2VydCBhIHJlb3JkZXJpbmcgbXBkdSBpbnRvIHNvcnRlZCBsaW5rZWQgbGlzdCBieSBzZXF1ZW5jZSBuby4KKyAqLworQk9PTEVBTiBiYV9yZW9yZGVyaW5nX21wZHVfaW5zZXJ0c29ydGVkKHN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmxpc3QsIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHUpCit7CisKKwlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICoqcHBTY2FuID0gJmxpc3QtPm5leHQ7CisKKwl3aGlsZSAoKnBwU2NhbiAhPSBOVUxMKQorCXsKKwkJaWYgKFNFUV9TTUFMTEVSKCgqcHBTY2FuKS0+U2VxdWVuY2UsIG1wZHUtPlNlcXVlbmNlLCBNQVhTRVEpKQorCQl7CisJCQlwcFNjYW4gPSAmKCpwcFNjYW4pLT5uZXh0OworCQl9CisJCWVsc2UgaWYgKCgqcHBTY2FuKS0+U2VxdWVuY2UgPT0gbXBkdS0+U2VxdWVuY2UpCisJCXsKKwkJCS8qIGdpdmUgdXAgdGhpcyBkdXBsaWNhdGVkIGZyYW1lICovCisJCQlyZXR1cm4oRkFMU0UpOworCQl9CisJCWVsc2UKKwkJeworCQkJLyogZmluZCBwb3NpdGlvbiAqLworCQkJYnJlYWs7CisJCX0KKwl9CisKKwltcGR1LT5uZXh0ID0gKnBwU2NhbjsKKwkqcHBTY2FuID0gbXBkdTsKKwlsaXN0LT5xbGVuKys7CisJcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyAqIGNhbGxlciBsb2NrIGNyaXRpY2FsIHNlY3Rpb24gaWYgbmVjZXNzYXJ5CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBiYV9lbnF1ZXVlKHN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmxpc3QsIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrKQoreworCWxpc3QtPnFsZW4rKzsKKwltcGR1X2Jsay0+bmV4dCA9IGxpc3QtPm5leHQ7CisJbGlzdC0+bmV4dCA9IG1wZHVfYmxrOworfQorCisvKgorICogY2FsbGVyIGxvY2sgY3JpdGljYWwgc2VjdGlvbiBpZiBuZWNlc3NhcnkKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICogYmFfZGVxdWV1ZShzdHJ1Y3QgcmVvcmRlcmluZ19saXN0ICpsaXN0KQoreworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrID0gTlVMTDsKKworCUFTU0VSVChsaXN0KTsKKworCQlpZiAobGlzdC0+cWxlbikKKwkJeworCQkJbGlzdC0+cWxlbi0tOworCQkJbXBkdV9ibGsgPSBsaXN0LT5uZXh0OworCQkJaWYgKG1wZHVfYmxrKQorCQkJeworCQkJCWxpc3QtPm5leHQgPSBtcGR1X2Jsay0+bmV4dDsKKwkJCQltcGR1X2Jsay0+bmV4dCA9IE5VTEw7CisJCQl9CisJCX0KKwlyZXR1cm4gbXBkdV9ibGs7Cit9CisKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICAqYmFfcmVvcmRlcmluZ19tcGR1X2RlcXVldWUoc3RydWN0IHJlb3JkZXJpbmdfbGlzdCAqbGlzdCkKK3sKKwlyZXR1cm4oYmFfZGVxdWV1ZShsaXN0KSk7Cit9CisKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICAqYmFfcmVvcmRlcmluZ19tcGR1X3Byb2JlKHN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmxpc3QpCisJeworCUFTU0VSVChsaXN0KTsKKworCQlyZXR1cm4obGlzdC0+bmV4dCk7CisJfQorCisKKy8qCisgKiBmcmVlIGFsbCByZXNvdXJjZSBmb3IgcmVvcmRlcmluZyBtZWNoYW5pc20KKyAqLwordm9pZCBiYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2UoUFJUTVBfQURBUFRFUiBwQWQpCit7CisJQkFfVEFCTEUgICAgICAgICpUYWI7CisJUEJBX1JFQ19FTlRSWSAgIHBCQUVudHJ5OworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOworCWludCBpOworCisJVGFiID0gJnBBZC0+QkFUYWJsZTsKKworCS8qIEkuICByZWxlYXNlIGFsbCBwZW5kaW5nIHJlb3JkZXJpbmcgcGFja2V0ICovCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX0JBX1JFQ19UQUJMRTsgaSsrKQorCXsKKwkJcEJBRW50cnkgPSAmVGFiLT5CQVJlY0VudHJ5W2ldOworCQlpZiAocEJBRW50cnktPlJFQ19CQV9TdGF0dXMgIT0gUmVjaXBpZW50X05PTkUpCisJCXsKKwkJCXdoaWxlICgobXBkdV9ibGsgPSBiYV9yZW9yZGVyaW5nX21wZHVfZGVxdWV1ZSgmcEJBRW50cnktPmxpc3QpKSkKKwkJCXsKKwkJCQlBU1NFUlQobXBkdV9ibGstPnBQYWNrZXQpOworCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBtcGR1X2Jsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkJYmFfbXBkdV9ibGtfZnJlZShwQWQsIG1wZHVfYmxrKTsKKwkJCX0KKwkJfQorCX0KKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisKKwlBU1NFUlQocEJBRW50cnktPmxpc3QucWxlbiA9PSAwKTsKKwkvKiBJSS4gZnJlZSBtZW1vcnkgb2YgcmVvcmRlcmluZyBtcGR1IHRhYmxlICovCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOworCW9zX2ZyZWVfbWVtKHBBZCwgcEFkLT5tcGR1X2Jsa19wb29sLm1lbSk7CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOworfQorCisKKworLyoKKyAqIEFsbG9jYXRlIGFsbCByZXNvdXJjZSBmb3IgcmVvcmRlcmluZyBtZWNoYW5pc20KKyAqLworQk9PTEVBTiBiYV9yZW9yZGVyaW5nX3Jlc291cmNlX2luaXQoUFJUTVBfQURBUFRFUiBwQWQsIGludCBudW0pCit7CisJaW50ICAgICBpOworCVBVQ0hBUiAgbWVtOworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOworCXN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmZyZWVsaXN0OworCisJLyogYWxsb2NhdGUgc3BpbmxvY2sgKi8KKwlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOworCisJLyogaW5pdGlhbGl6ZSBmcmVlbGlzdCAqLworCWZyZWVsaXN0ID0gJnBBZC0+bXBkdV9ibGtfcG9vbC5mcmVlbGlzdDsKKwlmcmVlbGlzdC0+bmV4dCA9IE5VTEw7CisJZnJlZWxpc3QtPnFsZW4gPSAwOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQWxsb2NhdGUgJWQgbWVtb3J5IGZvciBCQSByZW9yZGVyaW5nXG4iLCAoVUlOVDMyKShudW0qc2l6ZW9mKHN0cnVjdCByZW9yZGVyaW5nX21wZHUpKSkpOworCisJLyogYWxsb2NhdGUgbnVtYmVyIG9mIG1wZHVfYmxrIG1lbW9yeSAqLworCW9zX2FsbG9jX21lbShwQWQsIChQVUNIQVIgKikmbWVtLCAobnVtKnNpemVvZihzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1KSkpOworCisJcEFkLT5tcGR1X2Jsa19wb29sLm1lbSA9IG1lbTsKKworCWlmIChtZW0gPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkNhbid0IEFsbG9jYXRlIE1lbW9yeSBmb3IgQkEgUmVvcmRlcmluZ1xuIikpOworCQlyZXR1cm4oRkFMU0UpOworCX0KKworCS8qIGJ1aWxkIG1wZHVfYmxrIGZyZWUgbGlzdCAqLworCWZvciAoaT0wOyBpPG51bTsgaSsrKQorCXsKKwkJLyogZ2V0IG1wZHVfYmxrICovCisJCW1wZHVfYmxrID0gKHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKikgbWVtOworCQkvKiBpbml0aWFsIG1wZHVfYmxrICovCisJCU5kaXNaZXJvTWVtb3J5KG1wZHVfYmxrLCBzaXplb2Yoc3RydWN0IHJlb3JkZXJpbmdfbXBkdSkpOworCQkvKiBuZXh0IG1wZHVfYmxrICovCisJCW1lbSArPSBzaXplb2Yoc3RydWN0IHJlb3JkZXJpbmdfbXBkdSk7CisJCS8qIGluc2VydCBtcGR1X2JsayBpbnRvIGZyZWVsaXN0ICovCisJCWJhX2VucXVldWUoZnJlZWxpc3QsIG1wZHVfYmxrKTsKKwl9CisKKwlyZXR1cm4oVFJVRSk7Cit9CisKKy8vc3RhdGljIGludCBibGtfY291bnQ9MDsgLy8gc2FtcGxlIHRha2Ugb2ZmLCBubyB1c2UKKworc3RhdGljIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKmJhX21wZHVfYmxrX2FsbG9jKFBSVE1QX0FEQVBURVIgcEFkKQoreworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOworCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOworCW1wZHVfYmxrID0gYmFfZGVxdWV1ZSgmcEFkLT5tcGR1X2Jsa19wb29sLmZyZWVsaXN0KTsKKwlpZiAobXBkdV9ibGspCisJeworLy8JCWJsa19jb3VudCsrOworCQkvKiByZXNldCBtcGR1X2JsayAqLworCQlOZGlzWmVyb01lbW9yeShtcGR1X2Jsaywgc2l6ZW9mKHN0cnVjdCByZW9yZGVyaW5nX21wZHUpKTsKKwl9CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOworCXJldHVybiBtcGR1X2JsazsKK30KKworc3RhdGljIHZvaWQgYmFfbXBkdV9ibGtfZnJlZShQUlRNUF9BREFQVEVSIHBBZCwgc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGspCit7CisJQVNTRVJUKG1wZHVfYmxrKTsKKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+bXBkdV9ibGtfcG9vbC5sb2NrKTsKKy8vCWJsa19jb3VudC0tOworCWJhX2VucXVldWUoJnBBZC0+bXBkdV9ibGtfcG9vbC5mcmVlbGlzdCwgbXBkdV9ibGspOworCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+bXBkdV9ibGtfcG9vbC5sb2NrKTsKK30KKworCitzdGF0aWMgVVNIT1JUIGJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfaW5fb3JkZXIoCisJCQkJCQkJCQkJCQkgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwkJCQkJCQkJCQkJCSAgIElOIFBCQV9SRUNfRU5UUlkgICAgcEJBRW50cnksCisJCQkJCQkJCQkJCQkgICBJTiBVU0hPUlQgICAgICAgICAgIFN0YXJ0U2VxKQoreworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOworCVVTSE9SVCAgTGFzdEluZFNlcSA9IFJFU0VUX1JDVl9TRVE7CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKKworCXdoaWxlICgobXBkdV9ibGsgPSBiYV9yZW9yZGVyaW5nX21wZHVfcHJvYmUoJnBCQUVudHJ5LT5saXN0KSkpCisJCXsKKwkJCS8qIGZpbmQgaW4tb3JkZXIgZnJhbWUgKi8KKwkJaWYgKCFTRVFfU1RFUE9ORShtcGR1X2Jsay0+U2VxdWVuY2UsIFN0YXJ0U2VxLCBNQVhTRVEpKQorCQkJeworCQkJCWJyZWFrOworCQkJfQorCQkJLyogZGVxdWV1ZSBpbi1vcmRlciBmcmFtZSBmcm9tIHJlb2RlcmluZyBsaXN0ICovCisJCQltcGR1X2JsayA9IGJhX3Jlb3JkZXJpbmdfbXBkdV9kZXF1ZXVlKCZwQkFFbnRyeS0+bGlzdCk7CisJCQkvKiBwYXNzIHRoaXMgZnJhbWUgdXAgKi8KKwkJQU5OT1VOQ0VfUkVPUkRFUklOR19QQUNLRVQocEFkLCBtcGR1X2Jsayk7CisJCS8qIG1vdmUgdG8gbmV4dCBzZXF1ZW5jZSAqLworCQkJU3RhcnRTZXEgPSBtcGR1X2Jsay0+U2VxdWVuY2U7CisJCUxhc3RJbmRTZXEgPSBTdGFydFNlcTsKKwkJLyogZnJlZSBtcGR1X2JsayAqLworCQkJYmFfbXBkdV9ibGtfZnJlZShwQWQsIG1wZHVfYmxrKTsKKwl9CisKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKKworCS8qIHVwZGF0ZSBsYXN0IGluZGljYXRlZCBzZXF1ZW5jZSAqLworCXJldHVybiBMYXN0SW5kU2VxOworfQorCitzdGF0aWMgdm9pZCBiYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2xlX3NlcSgKKwkJCQkJCQkJCQkJICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJCQkJCQkJCQkJCSAgIElOIFBCQV9SRUNfRU5UUlkgICAgcEJBRW50cnksCisJCQkJCQkJCQkJCSAgIElOIFVTSE9SVCAgICAgICAgICAgU2VxdWVuY2UpCit7CisJc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGs7CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKKwl3aGlsZSAoKG1wZHVfYmxrID0gYmFfcmVvcmRlcmluZ19tcGR1X3Byb2JlKCZwQkFFbnRyeS0+bGlzdCkpKQorCQl7CisJCQkvKiBmaW5kIGluLW9yZGVyIGZyYW1lICovCisJCWlmICgobXBkdV9ibGstPlNlcXVlbmNlID09IFNlcXVlbmNlKSB8fCBTRVFfU01BTExFUihtcGR1X2Jsay0+U2VxdWVuY2UsIFNlcXVlbmNlLCBNQVhTRVEpKQorCQl7CisJCQkvKiBkZXF1ZXVlIGluLW9yZGVyIGZyYW1lIGZyb20gcmVvZGVyaW5nIGxpc3QgKi8KKwkJCW1wZHVfYmxrID0gYmFfcmVvcmRlcmluZ19tcGR1X2RlcXVldWUoJnBCQUVudHJ5LT5saXN0KTsKKwkJCS8qIHBhc3MgdGhpcyBmcmFtZSB1cCAqLworCQkJQU5OT1VOQ0VfUkVPUkRFUklOR19QQUNLRVQocEFkLCBtcGR1X2Jsayk7CisJCQkvKiBmcmVlIG1wZHVfYmxrICovCisJCQliYV9tcGR1X2Jsa19mcmVlKHBBZCwgbXBkdV9ibGspOworCQl9CisJCWVsc2UKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKwl9CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7Cit9CisKKworc3RhdGljIHZvaWQgYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKAorCQkJCQkJCQkJICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJCQkJCQkJCQkgICBQQkFfUkVDX0VOVFJZICAgICAgIHBCQUVudHJ5KQoreworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOworCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7CisKKwkJCS8qIGRlcXVldWUgaW4tb3JkZXIgZnJhbWUgZnJvbSByZW9kZXJpbmcgbGlzdCAqLworCXdoaWxlICgobXBkdV9ibGsgPSBiYV9yZW9yZGVyaW5nX21wZHVfZGVxdWV1ZSgmcEJBRW50cnktPmxpc3QpKSkKKwl7CisJCQkvKiBwYXNzIHRoaXMgZnJhbWUgdXAgKi8KKwkJQU5OT1VOQ0VfUkVPUkRFUklOR19QQUNLRVQocEFkLCBtcGR1X2Jsayk7CisKKwkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBtcGR1X2Jsay0+U2VxdWVuY2U7CisJCQliYV9tcGR1X2Jsa19mcmVlKHBBZCwgbXBkdV9ibGspOworCisJCS8qIHVwZGF0ZSBsYXN0IGluZGljYXRlZCBzZXF1ZW5jZSAqLworCX0KKwlBU1NFUlQocEJBRW50cnktPmxpc3QucWxlbiA9PSAwKTsKKwlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFJFU0VUX1JDVl9TRVE7CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7Cit9CisKKworLy9zdGF0aWMKK3ZvaWQgYmFfZmx1c2hfcmVvcmRlcmluZ190aW1lb3V0X21wZHVzKAorCQkJCQkJCQkJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJCQkJCQkJCQlJTiBQQkFfUkVDX0VOVFJZICAgIHBCQUVudHJ5LAorCQkJCQkJCQkJSU4gVUxPTkcgICAgICAgICAgICBOb3czMikKKworeworCVVTSE9SVCBTZXF1ZW5jZTsKKworLy8JaWYgKChSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93MzIsICh1bnNpZ25lZCBsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIrUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCkpICYmCisvLwkJIChwQkFFbnRyeS0+bGlzdC5xbGVuID4gKChwQkFFbnRyeS0+QkFXaW5TaXplKjcpLzgpKSkgLy98fAorLy8JCShSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93MzIsICh1bnNpZ25lZCBsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIrKDEwKlJFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQpKSkgJiYKKy8vCQkgKHBCQUVudHJ5LT5saXN0LnFsZW4gPiAocEJBRW50cnktPkJBV2luU2l6ZS84KSkpCisJaWYgKFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3czMiwgKHVuc2lnbmVkIGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lcisoTUFYX1JFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQvNikpKQorCQkgJiYocEJBRW50cnktPmxpc3QucWxlbiA+IDEpCisJCSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgidGltZW91dFslZF0gKCUwOGx4LSUwOGx4ID0gJWQgPiAlZCk6ICV4LCBmbHVzaCBhbGwhXG4gIiwgcEJBRW50cnktPmxpc3QucWxlbiwgTm93MzIsIChwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIpLAorCQkJICAgKGludCkoKGxvbmcpIE5vdzMyIC0gKGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lcikpLCBNQVhfUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCwKKwkJCSAgIHBCQUVudHJ5LT5MYXN0SW5kU2VxKSk7CisJCWJhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhwQWQsIHBCQUVudHJ5KTsKKwkJcEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyID0gTm93MzI7CisJfQorCWVsc2UKKwlpZiAoUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdzMyLCAodW5zaWduZWQgbG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyKyhSRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VUKSkpCisJCSYmIChwQkFFbnRyeS0+bGlzdC5xbGVuID4gMCkKKwkgICApCisJCXsKKy8vCQlwcmludGsoInRpbWVvdXRbJWRdICglbHgtJWx4ID0gJWQgPiAlZCk6ICV4LCAiLCBwQkFFbnRyeS0+bGlzdC5xbGVuLCBOb3czMiwgKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciksCisvLwkJCSAgIChpbnQpKChsb25nKSBOb3czMiAtIChsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIpKSwgUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCwKKy8vCQkJICAgcEJBRW50cnktPkxhc3RJbmRTZXEpOworICAgIAkJLy8KKwkJLy8gZm9yY2UgTGFzdEluZFNlcSB0byBzaGlmdCB0byBMYXN0SW5kU2VxKzEKKyAgICAJCS8vCisgICAgCQlTZXF1ZW5jZSA9IChwQkFFbnRyeS0+TGFzdEluZFNlcSsxKSAmIE1BWFNFUTsKKyAgICAJCWJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfbGVfc2VxKHBBZCwgcEJBRW50cnksIFNlcXVlbmNlKTsKKyAgICAJCXBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciA9IE5vdzMyOworCQkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBTZXF1ZW5jZTsKKyAgICAJCS8vCisgICAgCQkvLyBpbmRpY2F0ZSBpbi1vcmRlciBtcGR1cworICAgIAkJLy8KKyAgICAJCVNlcXVlbmNlID0gYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19pbl9vcmRlcihwQWQsIHBCQUVudHJ5LCBTZXF1ZW5jZSk7CisgICAgCQlpZiAoU2VxdWVuY2UgIT0gUkVTRVRfUkNWX1NFUSkKKyAgICAJCXsKKyAgICAJCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFNlcXVlbmNlOworICAgIAkJfQorCisJCS8vcHJpbnRrKCIleCwgZmx1c2ggb25lIVxuIiwgcEJBRW50cnktPkxhc3RJbmRTZXEpOworCisJfQorI2lmIDAKKwllbHNlIGlmICgKKwkJCSAoUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdzMyLCAodW5zaWduZWQgbG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyKyhNQVhfUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCkpKSAmJgorCQkJICAocEJBRW50cnktPmxpc3QucWxlbiA+IDEpKQorCQkJKQorCQl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgidGltZW91dFslZF0gKCVseC0lbHggPSAlZCA+ICVkKTogJXhcbiAiLCBwQkFFbnRyeS0+bGlzdC5xbGVuLCBOb3czMiwgKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciksCisJCQkgICAoaW50KSgobG9uZykgTm93MzIgLSAobG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyKSksIE1BWF9SRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VULAorCQkJICAgcEJBRW50cnktPkxhc3RJbmRTZXEpKTsKKwkJYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKHBBZCwgcEJBRW50cnkpOworCQkJcEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyID0gTm93MzI7CisJCQkJfQorI2VuZGlmCit9CisKKworLyoKKyAqIGdlbmVyYXRlIEFEREJBIHJlcXVlc3QgdG8KKyAqIHNldCB1cCBCQSBhZ3JlZW1lbnQKKyAqLworVk9JRCBCQU9yaVNlc3Npb25TZXRVcCgKKwkJCQkJICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwkJCQkJICBJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnksCisJCQkJCSAgSU4gVUNIQVIgICAgICAgICAgICBUSUQsCisJCQkJCSAgSU4gVVNIT1JUICAgICAgICAgICBUaW1lT3V0LAorCQkJCQkgIElOIFVMT05HICAgICAgICAgICAgRGVsYXlUaW1lLAorCQkJCQkgIElOIEJPT0xFQU4gICAgICAgICAgaXNGb3JjZWQpCisKK3sKKwkvL01MTUVfQUREQkFfUkVRX1NUUlVDVAlBZGRiYVJlcTsKKwlCQV9PUklfRU5UUlkgICAgICAgICAgICAqcEJBRW50cnkgPSBOVUxMOworCVVTSE9SVCAgICAgICAgICAgICAgICAgIElkeDsKKwlCT09MRUFOICAgICAgICAgICAgICAgICBDYW5jZWxsZWQ7CisKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgIT0gVFJVRSkgICYmICAoaXNGb3JjZWQgPT0gRkFMU0UpKQorCQlyZXR1cm47CisKKwkvLyBpZiB0aGlzIGVudHJ5IGlzIGxpbWl0ZWQgdG8gdXNlIGxlZ2FjeSB0eCBtb2RlLCBpdCBkb2Vzbid0IGdlbmVyYXRlIEJBLgorCWlmIChSVE1QU3RhRml4ZWRUeE1vZGUocEFkLCBwRW50cnkpICE9IEZJWEVEX1RYTU9ERV9IVCkKKwkJcmV0dXJuOworCisJaWYgKChwRW50cnktPkJBRGVjbGluZUJpdG1hcCAmICgxPDxUSUQpKSAmJiAoaXNGb3JjZWQgPT0gRkFMU0UpKQorCXsKKwkJLy8gdHJ5IGFnYWluIGFmdGVyIDMgc2VjcworCQlEZWxheVRpbWUgPSAzMDAwOworLy8JCXByaW50aygiRGVDbGluZSBCQSBmcm9tIFBlZXJcbiIpOworLy8JCXJldHVybjsKKwl9CisKKworCUlkeCA9IHBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbVElEXTsKKwlpZiAoSWR4ID09IDApCisJeworCQkvLyBhbGxvY2F0ZSBhIEJBIHNlc3Npb24KKwkJcEJBRW50cnkgPSBCQVRhYmxlQWxsb2NPcmlFbnRyeShwQWQsICZJZHgpOworCQlpZiAocEJBRW50cnkgPT0gTlVMTCkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBRERCQSAtIE1sbWVBRERCQUFjdGlvbigpIGFsbG9jYXRlIEJBIHNlc3Npb24gZmFpbGVkIFxuIikpOworCQkJcmV0dXJuOworCQl9CisJfQorCWVsc2UKKwl7CisJCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbSWR4XTsKKwl9CisKKwlpZiAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPj0gT3JpZ2luYXRvcl9XYWl0UmVzKQorCXsKKwkJcmV0dXJuOworCX0KKworCXBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbVElEXSA9IElkeDsKKworCS8vIEluaXRpYWxpemUgQkEgc2Vzc2lvbgorCXBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID0gT3JpZ2luYXRvcl9XYWl0UmVzOworCXBCQUVudHJ5LT5XY2lkID0gcEVudHJ5LT5BaWQ7CisJcEJBRW50cnktPkJBV2luU2l6ZSA9IHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQ7CisJcEJBRW50cnktPlNlcXVlbmNlID0gQkFfT1JJX0lOSVRfU0VROworCXBCQUVudHJ5LT5Ub2tlbiA9IDE7CS8vICgyMDA4LTAxLTIxKSBKYW4gTGVlIHJlY29tbWVuZHMgaXQgLSB0aGlzIHRva2VuIGNhbid0IGJlIDAKKwlwQkFFbnRyeS0+VElEID0gVElEOworCXBCQUVudHJ5LT5UaW1lT3V0VmFsdWUgPSBUaW1lT3V0OworCXBCQUVudHJ5LT5wQWRhcHRlciA9IHBBZDsKKworCWlmICghKHBFbnRyeS0+VFhCQWJpdG1hcCAmICgxPDxUSUQpKSkKKwl7CisJCVJUTVBJbml0VGltZXIocEFkLCAmcEJBRW50cnktPk9SSUJBVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihCQU9yaVNlc3Npb25TZXR1cFRpbWVvdXQpLCBwQkFFbnRyeSwgRkFMU0UpOworCX0KKwllbHNlCisJCVJUTVBDYW5jZWxUaW1lcigmcEJBRW50cnktPk9SSUJBVGltZXIsICZDYW5jZWxsZWQpOworCisJLy8gc2V0IHRpbWVyIHRvIHNlbmQgQUREQkEgcmVxdWVzdAorCVJUTVBTZXRUaW1lcigmcEJBRW50cnktPk9SSUJBVGltZXIsIERlbGF5VGltZSk7Cit9CisKK1ZPSUQgQkFPcmlTZXNzaW9uQWRkKAorCQkJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJCQkJCUlOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKKwkJCUlOIFBGUkFNRV9BRERCQV9SU1AgcEZyYW1lKQoreworCUJBX09SSV9FTlRSWSAgKnBCQUVudHJ5ID0gTlVMTDsKKwlCT09MRUFOICAgICAgIENhbmNlbGxlZDsKKwlVQ0hBUiAgICAgICAgIFRJRDsKKwlVU0hPUlQgICAgICAgIElkeDsKKwlQVUNIQVIgICAgICAgICAgcE91dEJ1ZmZlcjIgPSBOVUxMOworCU5ESVNfU1RBVFVTICAgICBOU3RhdHVzOworCVVMT05HICAgICAgICAgICBGcmFtZUxlbjsKKwlGUkFNRV9CQVIgICAgICAgRnJhbWVCYXI7CisKKwlUSUQgPSBwRnJhbWUtPkJhUGFybS5USUQ7CisJSWR4ID0gcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtUSURdOworCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbSWR4XTsKKworCS8vIFN0YXJ0IGZpbGwgaW4gcGFyYW1ldGVycy4KKwlpZiAoKElkeCAhPTApICYmIChwQkFFbnRyeS0+VElEID09IFRJRCkgJiYgKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfV2FpdFJlcykpCisJeworCQlwQkFFbnRyeS0+QkFXaW5TaXplID0gbWluKHBCQUVudHJ5LT5CQVdpblNpemUsICgoVUNIQVIpcEZyYW1lLT5CYVBhcm0uQnVmU2l6ZSkpOworCQlCQV9NYXhXaW5TaXplUmVhc2lnbihwQWQsIHBFbnRyeSwgJnBCQUVudHJ5LT5CQVdpblNpemUpOworCisJCXBCQUVudHJ5LT5UaW1lT3V0VmFsdWUgPSBwRnJhbWUtPlRpbWVPdXRWYWx1ZTsKKwkJcEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPSBPcmlnaW5hdG9yX0RvbmU7CisJCS8vIHJlc2V0IHNlcXVlbmNlIG51bWJlcgorCQlwQkFFbnRyeS0+U2VxdWVuY2UgPSBCQV9PUklfSU5JVF9TRVE7CisJCS8vIFNldCBCaXRtYXAgZmxhZy4KKwkJcEVudHJ5LT5UWEJBYml0bWFwIHw9ICgxPDxUSUQpOworCQkJCVJUTVBDYW5jZWxUaW1lcigmcEJBRW50cnktPk9SSUJBVGltZXIsICZDYW5jZWxsZWQpOworCisJCXBCQUVudHJ5LT5PUklCQVRpbWVyLlRpbWVyVmFsdWUgPSAwOwkvL3BGcmFtZS0+VGltZU91dFZhbHVlOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiJXMgOiBUWEJBYml0bWFwID0gJXgsIEJBV2luU2l6ZSA9ICVkLCBUaW1lT3V0ID0gJWxkXG4iLCBfX2Z1bmNfXywgcEVudHJ5LT5UWEJBYml0bWFwLAorCQkJCQkJCQkgcEJBRW50cnktPkJBV2luU2l6ZSwgcEJBRW50cnktPk9SSUJBVGltZXIuVGltZXJWYWx1ZSkpOworCisJCS8vIFNFTkQgQkFSIDsKKwkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyMik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkEgLSBCQU9yaVNlc3Npb25BZGQoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQkJcmV0dXJuOworCQl9CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJQmFySGVhZGVySW5pdChwQWQsICZGcmFtZUJhciwgcEFkLT5NYWNUYWIuQ29udGVudFtwQkFFbnRyeS0+V2NpZF0uQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuRnJhZ051bSA9IDA7CS8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmN0aW9uLgorCQlGcmFtZUJhci5TdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSA9IHBCQUVudHJ5LT5TZXF1ZW5jZTsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCisJCUZyYW1lQmFyLkJhckNvbnRyb2wuVElEID0gcEJBRW50cnktPlRJRDsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIyLCAgICAgICAgICAgICAgJkZyYW1lTGVuLAorCQkJCQkJICBzaXplb2YoRlJBTUVfQkFSKSwgICAgICAmRnJhbWVCYXIsCisJCQkJCSAgRU5EX09GX0FSR1MpOworCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlcjIsIEZyYW1lTGVuKTsKKwkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyMik7CisKKworCQlpZiAocEJBRW50cnktPk9SSUJBVGltZXIuVGltZXJWYWx1ZSkKKwkJCVJUTVBTZXRUaW1lcigmcEJBRW50cnktPk9SSUJBVGltZXIsIHBCQUVudHJ5LT5PUklCQVRpbWVyLlRpbWVyVmFsdWUpOyAvLyBpbiBtU2VjCisJfQorfQorCitCT09MRUFOIEJBUmVjU2Vzc2lvbkFkZCgKKwkJCQkJICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJCQkJCSAgIElOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKKwkJCQkJICAgSU4gUEZSQU1FX0FEREJBX1JFUSBwRnJhbWUpCit7CisJQkFfUkVDX0VOVFJZICAgICAgICAgICAgKnBCQUVudHJ5ID0gTlVMTDsKKwlCT09MRUFOICAgICAgICAgICAgICAgICBTdGF0dXMgPSBUUlVFOworCUJPT0xFQU4gICAgICAgICAgICAgICAgIENhbmNlbGxlZDsKKwlVU0hPUlQgICAgICAgICAgICAgICAgICBJZHg7CisJVUNIQVIgICAgICAgICAgICAgICAgICAgVElEOworCVVDSEFSICAgICAgICAgICAgICAgICAgIEJBV2luU2l6ZTsKKwkvL1VJTlQzMiAgICAgICAgICAgICAgICAgIFZhbHVlOworCS8vVUlOVCAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OworCisKKwlBU1NFUlQocEVudHJ5KTsKKworCS8vIGZpbmQgVElECisJVElEID0gcEZyYW1lLT5CYVBhcm0uVElEOworCisJQkFXaW5TaXplID0gbWluKCgoVUNIQVIpcEZyYW1lLT5CYVBhcm0uQnVmU2l6ZSksIChVQ0hBUilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0KTsKKworCS8vIEludGVsIHBhdGNoCisJaWYgKEJBV2luU2l6ZSA9PSAwKQorCXsKKwkJQkFXaW5TaXplID0gNjQ7CisJfQorCisJSWR4ID0gcEVudHJ5LT5CQVJlY1djaWRBcnJheVtUSURdOworCisKKwlpZiAoSWR4ID09IDApCisJeworCQlwQkFFbnRyeSA9IEJBVGFibGVBbGxvY1JlY0VudHJ5KHBBZCwgJklkeCk7CisJfQorCWVsc2UKKwl7CisJCXBCQUVudHJ5ID0gJnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W0lkeF07CisJCS8vIGZsdXNoIGFsbCBwZW5kaW5nIHJlb3JkZXJpbmcgbXBkdXMKKwkJYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKHBBZCwgcEJBRW50cnkpOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiJXMoJWxkKTogSWR4ID0gJWQsIEJBV2luU2l6ZShyZXEgJWQpID0gJWRcbiIsIF9fZnVuY19fLCBwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQsIElkeCwKKwkJCQkJCQkgcEZyYW1lLT5CYVBhcm0uQnVmU2l6ZSwgQkFXaW5TaXplKSk7CisKKwkvLyBTdGFydCBmaWxsIGluIHBhcmFtZXRlcnMuCisJaWYgKHBCQUVudHJ5ICE9IE5VTEwpCisJeworCQlBU1NFUlQocEJBRW50cnktPmxpc3QucWxlbiA9PSAwKTsKKworCQlwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9IFJlY2lwaWVudF9IYW5kbGVSZXM7CisJCXBCQUVudHJ5LT5CQVdpblNpemUgPSBCQVdpblNpemU7CisJCXBCQUVudHJ5LT5XY2lkID0gcEVudHJ5LT5BaWQ7CisJCXBCQUVudHJ5LT5USUQgPSBUSUQ7CisJCXBCQUVudHJ5LT5UaW1lT3V0VmFsdWUgPSBwRnJhbWUtPlRpbWVPdXRWYWx1ZTsKKwkJcEJBRW50cnktPlJFQ19CQV9TdGF0dXMgPSBSZWNpcGllbnRfQWNjZXB0OworCQkvLyBpbml0aWFsIHNlcXVlbmNlIG51bWJlcgorCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFJFU0VUX1JDVl9TRVE7IC8vcEZyYW1lLT5CYVN0YXJ0U2VxLmZpZWxkLlN0YXJ0U2VxOworCisJCXByaW50aygiU3RhcnQgU2VxID0gJTA4eFxuIiwgIHBGcmFtZS0+QmFTdGFydFNlcS5maWVsZC5TdGFydFNlcSk7CisKKwkJaWYgKHBFbnRyeS0+UlhCQWJpdG1hcCAmICgxPDxUSUQpKQorCQl7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBCQUVudHJ5LT5SRUNCQVRpbWVyLCAmQ2FuY2VsbGVkKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVJUTVBJbml0VGltZXIocEFkLCAmcEJBRW50cnktPlJFQ0JBVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihCQVJlY1Nlc3Npb25JZGxlVGltZW91dCksIHBCQUVudHJ5LCBUUlVFKTsKKwkJfQorCisjaWYgMAkvLyBmb3IgZGVidWdnaW5nCisJCVJUTVBTZXRUaW1lcigmcEJBRW50cnktPlJFQ0JBVGltZXIsIFJFQ19CQV9TRVNTSU9OX0lETEVfVElNRU9VVCk7CisjZW5kaWYKKworCQkvLyBTZXQgQml0bWFwIGZsYWcuCisJCXBFbnRyeS0+UlhCQWJpdG1hcCB8PSAoMTw8VElEKTsKKwkJcEVudHJ5LT5CQVJlY1djaWRBcnJheVtUSURdID0gSWR4OworCisJCXBFbnRyeS0+QkFEZWNsaW5lQml0bWFwICY9IH4oMTw8VElEKTsKKworCQkvLyBTZXQgQkEgc2Vzc2lvbiBtYXNrIGluIFdDSUQgdGFibGUuCisJCVJUMjhYWF9BRERfQkFfU0VTU0lPTl9UT19BU0lDKHBBZCwgcEVudHJ5LT5BaWQsIFRJRCk7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJNQUNFbnRyeVslZF1SWEJBYml0bWFwID0gMHgleC4gQkFSZWNXY2lkQXJyYXk9JWRcbiIsCisJCQkJcEVudHJ5LT5BaWQsIHBFbnRyeS0+UlhCQWJpdG1hcCwgcEVudHJ5LT5CQVJlY1djaWRBcnJheVtUSURdKSk7CisJfQorCWVsc2UKKwl7CisJCVN0YXR1cyA9IEZBTFNFOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkNhbid0IEFjY2VwdCBBRERCQSBmb3IgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggVElEID0gJWRcbiIsCisJCQkJUFJJTlRfTUFDKHBFbnRyeS0+QWRkciksIFRJRCkpOworCX0KKwlyZXR1cm4oU3RhdHVzKTsKK30KKworCitCQV9SRUNfRU5UUlkgKkJBVGFibGVBbGxvY1JlY0VudHJ5KAorCQkJCQkJCQkgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCQkJCQkJCQkgIE9VVCBVU0hPUlQgICAgICAgICAgKklkeCkKK3sKKwlpbnQgICAgICAgICAgICAgaTsKKwlCQV9SRUNfRU5UUlkgICAgKnBCQUVudHJ5ID0gTlVMTDsKKworCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCisJaWYgKHBBZC0+QkFUYWJsZS5udW1Bc1JlY2lwaWVudCA+PSBNQVhfQkFSRUNJX1NFU1NJT04pCisJeworCQlwcmludGsoIkJBIFJlY2lwZWludCBTZXNzaW9uICglbGQpID4gJWRcbiIsIHBBZC0+QkFUYWJsZS5udW1Bc1JlY2lwaWVudCwKKwkJCU1BWF9CQVJFQ0lfU0VTU0lPTik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvLyByZXNlcnZlIGlkeCAwIHRvIGlkZW50aWZ5IEJBV2NpZEFycmF5W1RJRF0gYXMgZW1wdHkKKwlmb3IgKGk9MTsgaSA8IE1BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFOyBpKyspCisJeworCQlwQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W2ldOworCQlpZiAoKHBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzID09IFJlY2lwaWVudF9OT05FKSkKKwkJeworCQkJLy8gZ2V0IG9uZQorCQkJcEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50Kys7CisJCQlwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9IFJlY2lwaWVudF9VU0VEOworCQkJKklkeCA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKworZG9uZToKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisJcmV0dXJuIHBCQUVudHJ5OworfQorCitCQV9PUklfRU5UUlkgKkJBVGFibGVBbGxvY09yaUVudHJ5KAorCQkJCQkJCQkgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCQkJCQkJCQkgIE9VVCBVU0hPUlQgICAgICAgICAgKklkeCkKK3sKKwlpbnQgICAgICAgICAgICAgaTsKKwlCQV9PUklfRU5UUlkgICAgKnBCQUVudHJ5ID0gTlVMTDsKKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKKworCWlmIChwQWQtPkJBVGFibGUubnVtQXNPcmlnaW5hdG9yID49IChNQVhfTEVOX09GX0JBX09SSV9UQUJMRSkpCisJeworCQlnb3RvIGRvbmU7CisJfQorCisJLy8gcmVzZXJ2ZSBpZHggMCB0byBpZGVudGlmeSBCQVdjaWRBcnJheVtUSURdIGFzIGVtcHR5CisJZm9yIChpPTE7IGk8TUFYX0xFTl9PRl9CQV9PUklfVEFCTEU7IGkrKykKKwl7CisJCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbaV07CisJCWlmICgocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9OT05FKSkKKwkJeworCQkJLy8gZ2V0IG9uZQorCQkJcEFkLT5CQVRhYmxlLm51bUFzT3JpZ2luYXRvcisrOworCQkJcEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPSBPcmlnaW5hdG9yX1VTRUQ7CisJCQlwQkFFbnRyeS0+cEFkYXB0ZXIgPSBwQWQ7CisJCQkqSWR4ID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCitkb25lOgorCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKKwlyZXR1cm4gcEJBRW50cnk7Cit9CisKKworVk9JRCBCQVRhYmxlRnJlZU9yaUVudHJ5KAorCQkJCQkJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJCQkJCQlJTiAgVUxPTkcgICAgICAgICAgIElkeCkKK3sKKwlCQV9PUklfRU5UUlkgICAgKnBCQUVudHJ5ID0gTlVMTDsKKwlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKworCisJaWYgKChJZHggPT0gMCkgfHwgKElkeCA+PSBNQVhfTEVOX09GX0JBX09SSV9UQUJMRSkpCisJCXJldHVybjsKKworCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbSWR4XTsKKworCWlmIChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyAhPSBPcmlnaW5hdG9yX05PTkUpCisJeworCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtwQkFFbnRyeS0+V2NpZF07CisJCXBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbcEJBRW50cnktPlRJRF0gPSAwOworCisKKwkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCQlpZiAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9Eb25lKQorCQl7CisJCSAJcEVudHJ5LT5UWEJBYml0bWFwICY9ICh+KDE8PChwQkFFbnRyeS0+VElEKSApKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJBVGFibGVGcmVlT3JpRW50cnkgbnVtQXNPcmlnaW5hdG9yPSAlbGRcbiIsIHBBZC0+QkFUYWJsZS5udW1Bc1JlY2lwaWVudCkpOworCQkJLy8gRXJhc2UgQml0bWFwIGZsYWcuCisJCX0KKworCQlBU1NFUlQocEFkLT5CQVRhYmxlLm51bUFzT3JpZ2luYXRvciAhPSAwKTsKKworCQlwQWQtPkJBVGFibGUubnVtQXNPcmlnaW5hdG9yIC09IDE7CisKKwkJcEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPSBPcmlnaW5hdG9yX05PTkU7CisJCXBCQUVudHJ5LT5Ub2tlbiA9IDA7CisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKKwl9Cit9CisKKworVk9JRCBCQVRhYmxlRnJlZVJlY0VudHJ5KAorCQkJCQkJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJCQkJCQlJTiAgVUxPTkcgICAgICAgICAgIElkeCkKK3sKKwlCQV9SRUNfRU5UUlkgICAgKnBCQUVudHJ5ID0gTlVMTDsKKwlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKworCisJaWYgKChJZHggPT0gMCkgfHwgKElkeCA+PSBNQVhfTEVOX09GX0JBX1JFQ19UQUJMRSkpCisJCXJldHVybjsKKworCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbSWR4XTsKKworCWlmIChwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyAhPSBSZWNpcGllbnRfTk9ORSkKKwl7CisJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3BCQUVudHJ5LT5XY2lkXTsKKwkJcEVudHJ5LT5CQVJlY1djaWRBcnJheVtwQkFFbnRyeS0+VElEXSA9IDA7CisKKwkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCisJCUFTU0VSVChwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQgIT0gMCk7CisKKwkJcEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50IC09IDE7CisKKwkJcEJBRW50cnktPlJFQ19CQV9TdGF0dXMgPSBSZWNpcGllbnRfTk9ORTsKKwkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCX0KK30KKworCitWT0lEIEJBT3JpU2Vzc2lvblRlYXJEb3duKAorCQkJCQkJIElOIE9VVCAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwkJCQkJCSBJTiAgICAgIFVDSEFSICAgICAgICAgICBXY2lkLAorCQkJCQkJIElOICAgICAgVUNIQVIgICAgICAgICAgIFRJRCwKKwkJCQkJCSBJTiAgICAgIEJPT0xFQU4gICAgICAgICBiUGFzc2l2ZSwKKwkJCQkJCSBJTiAgICAgIEJPT0xFQU4gICAgICAgICBiRm9yY2VTZW5kKQoreworCVVMT05HICAgICAgICAgICBJZHggPSAwOworCUJBX09SSV9FTlRSWSAgICAqcEJBRW50cnk7CisJQk9PTEVBTiAgICAgICAgIENhbmNlbGxlZDsKKworCWlmIChXY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCXsKKwkJcmV0dXJuOworCX0KKworCS8vCisJLy8gTG9jYXRlIGNvcnJlc3BvbmRpbmcgQkEgT3JpZ2luYXRvciBFbnRyeSBpbiBCQSBUYWJsZSB3aXRoIHRoZSAocEFkZHIsVElEKS4KKwkvLworCUlkeCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQkFPcmlXY2lkQXJyYXlbVElEXTsKKwlpZiAoKElkeCA9PSAwKSB8fCAoSWR4ID49IE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFKSkKKwl7CisJCWlmIChiRm9yY2VTZW5kID09IFRSVUUpCisJCXsKKwkJCS8vIGZvcmNlIHNlbmQgc3BlY2lmaWVkIFRJRCBEZWxCQQorCQkJTUxNRV9ERUxCQV9SRVFfU1RSVUNUICAgRGVsYmFSZXE7CisJCQlNTE1FX1FVRVVFX0VMRU0gKkVsZW0gPSAoTUxNRV9RVUVVRV9FTEVNICopIGttYWxsb2Moc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSksIE1FTV9BTExPQ19GTEFHKTsKKworCQkJTmRpc1plcm9NZW1vcnkoJkRlbGJhUmVxLCBzaXplb2YoRGVsYmFSZXEpKTsKKwkJCU5kaXNaZXJvTWVtb3J5KEVsZW0sIHNpemVvZihNTE1FX1FVRVVFX0VMRU0pKTsKKworCQkJQ09QWV9NQUNfQUREUihEZWxiYVJlcS5BZGRyLCBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkFkZHIpOworCQkJRGVsYmFSZXEuV2NpZCA9IFdjaWQ7CisJCQlEZWxiYVJlcS5USUQgPSBUSUQ7CisJCQlEZWxiYVJlcS5Jbml0aWF0b3IgPSBPUklHSU5BVE9SOworI2lmIDEKKwkJCUVsZW0tPk1zZ0xlbiAgPSBzaXplb2YoRGVsYmFSZXEpOworCQkJTmRpc01vdmVNZW1vcnkoRWxlbS0+TXNnLCAmRGVsYmFSZXEsIHNpemVvZihEZWxiYVJlcSkpOworCQkJTWxtZURFTEJBQWN0aW9uKHBBZCwgRWxlbSk7CisJCQlrZnJlZShFbGVtKTsKKyNlbHNlCisJCQlNbG1lRW5xdWV1ZShwQWQsIEFDVElPTl9TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9PUklfREVMQkFfQ0FURSwgc2l6ZW9mKE1MTUVfREVMQkFfUkVRX1NUUlVDVCksIChQVk9JRCkmRGVsYmFSZXEpOworCQkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworI2VuZGlmCisJCX0KKworCQlyZXR1cm47CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcz09PT5XY2lkPSVkLlRJRD0lZCBcbiIsIF9fZnVuY19fLCBXY2lkLCBUSUQpKTsKKworCXBCQUVudHJ5ID0gJnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W0lkeF07CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJcdD09PT5JZHggPSAlbGQsIFdjaWQ9JWQuVElEPSVkLCBPUklfQkFfU3RhdHVzID0gJWQgXG4iLCBJZHgsIFdjaWQsIFRJRCwgcEJBRW50cnktPk9SSV9CQV9TdGF0dXMpKTsKKwkvLworCS8vIFByZXBhcmUgRGVsQkEgYWN0aW9uIGZyYW1lIGFuZCBzZW5kIHRvIHRoZSBwZWVyLgorCS8vCisJaWYgKChiUGFzc2l2ZSA9PSBGQUxTRSkgJiYgKFRJRCA9PSBwQkFFbnRyeS0+VElEKSAmJiAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9Eb25lKSkKKwl7CisJCU1MTUVfREVMQkFfUkVRX1NUUlVDVCAgIERlbGJhUmVxOworCQlNTE1FX1FVRVVFX0VMRU0gKkVsZW0gPSAoTUxNRV9RVUVVRV9FTEVNICopIGttYWxsb2Moc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSksIE1FTV9BTExPQ19GTEFHKTsKKworCQlOZGlzWmVyb01lbW9yeSgmRGVsYmFSZXEsIHNpemVvZihEZWxiYVJlcSkpOworCQlOZGlzWmVyb01lbW9yeShFbGVtLCBzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSk7CisKKwkJQ09QWV9NQUNfQUREUihEZWxiYVJlcS5BZGRyLCBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkFkZHIpOworCQlEZWxiYVJlcS5XY2lkID0gV2NpZDsKKwkJRGVsYmFSZXEuVElEID0gcEJBRW50cnktPlRJRDsKKwkJRGVsYmFSZXEuSW5pdGlhdG9yID0gT1JJR0lOQVRPUjsKKyNpZiAxCisJCUVsZW0tPk1zZ0xlbiAgPSBzaXplb2YoRGVsYmFSZXEpOworCQlOZGlzTW92ZU1lbW9yeShFbGVtLT5Nc2csICZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7CisJCU1sbWVERUxCQUFjdGlvbihwQWQsIEVsZW0pOworCQlrZnJlZShFbGVtKTsKKyNlbHNlCisJCU1sbWVFbnF1ZXVlKHBBZCwgQUNUSU9OX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX09SSV9ERUxCQV9DQVRFLCBzaXplb2YoTUxNRV9ERUxCQV9SRVFfU1RSVUNUKSwgKFBWT0lEKSZEZWxiYVJlcSk7CisJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKyNlbmRpZgorCX0KKwlSVE1QQ2FuY2VsVGltZXIoJnBCQUVudHJ5LT5PUklCQVRpbWVyLCAmQ2FuY2VsbGVkKTsKKwlCQVRhYmxlRnJlZU9yaUVudHJ5KHBBZCwgSWR4KTsKKworCWlmIChiUGFzc2l2ZSkKKwl7CisJCS8vQkFPcmlTZXNzaW9uU2V0VXAocEFkLCAmcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXSwgVElELCAwLCAxMDAwMCwgVFJVRSk7CisJfQorfQorCitWT0lEIEJBUmVjU2Vzc2lvblRlYXJEb3duKAorCQkJCQkJIElOIE9VVCAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwkJCQkJCSBJTiAgICAgIFVDSEFSICAgICAgICAgICBXY2lkLAorCQkJCQkJIElOICAgICAgVUNIQVIgICAgICAgICAgIFRJRCwKKwkJCQkJCSBJTiAgICAgIEJPT0xFQU4gICAgICAgICBiUGFzc2l2ZSkKK3sKKwlVTE9ORyAgICAgICAgICAgSWR4ID0gMDsKKwlCQV9SRUNfRU5UUlkgICAgKnBCQUVudHJ5OworCisJaWYgKFdjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJeworCQlyZXR1cm47CisJfQorCisJLy8KKwkvLyAgTG9jYXRlIGNvcnJlc3BvbmRpbmcgQkEgT3JpZ2luYXRvciBFbnRyeSBpbiBCQSBUYWJsZSB3aXRoIHRoZSAocEFkZHIsVElEKS4KKwkvLworCUlkeCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQkFSZWNXY2lkQXJyYXlbVElEXTsKKwlpZiAoSWR4ID09IDApCisJCXJldHVybjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiJXM9PT0+V2NpZD0lZC5USUQ9JWQgXG4iLCBfX2Z1bmNfXywgV2NpZCwgVElEKSk7CisKKworCXBCQUVudHJ5ID0gJnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W0lkeF07CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJcdD09PT5JZHggPSAlbGQsIFdjaWQ9JWQuVElEPSVkLCBSRUNfQkFfU3RhdHVzID0gJWQgXG4iLCBJZHgsIFdjaWQsIFRJRCwgcEJBRW50cnktPlJFQ19CQV9TdGF0dXMpKTsKKwkvLworCS8vIFByZXBhcmUgRGVsQkEgYWN0aW9uIGZyYW1lIGFuZCBzZW5kIHRvIHRoZSBwZWVyLgorCS8vCisJaWYgKChUSUQgPT0gcEJBRW50cnktPlRJRCkgJiYgKHBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzID09IFJlY2lwaWVudF9BY2NlcHQpKQorCXsKKwkJTUxNRV9ERUxCQV9SRVFfU1RSVUNUICAgRGVsYmFSZXE7CisJCUJPT0xFQU4gCQkJCUNhbmNlbGxlZDsKKwkJTUxNRV9RVUVVRV9FTEVNICpFbGVtID0gKE1MTUVfUVVFVUVfRUxFTSAqKSBrbWFsbG9jKHNpemVvZihNTE1FX1FVRVVFX0VMRU0pLCBNRU1fQUxMT0NfRkxBRyk7CisJCS8vVUxPTkcgICBvZmZzZXQ7CisJCS8vVUlOVDMyICBWQUxVRTsKKworCQlSVE1QQ2FuY2VsVGltZXIoJnBCQUVudHJ5LT5SRUNCQVRpbWVyLCAmQ2FuY2VsbGVkKTsKKworCQkvLworCQkvLyAxLiBTZW5kIERFTEJBIEFjdGlvbiBGcmFtZQorCQkvLworCQlpZiAoYlBhc3NpdmUgPT0gRkFMU0UpCisJCXsKKwkJCU5kaXNaZXJvTWVtb3J5KCZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7CisJCQlOZGlzWmVyb01lbW9yeShFbGVtLCBzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSk7CisKKwkJCUNPUFlfTUFDX0FERFIoRGVsYmFSZXEuQWRkciwgcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5BZGRyKTsKKwkJCURlbGJhUmVxLldjaWQgPSBXY2lkOworCQkJRGVsYmFSZXEuVElEID0gVElEOworCQkJRGVsYmFSZXEuSW5pdGlhdG9yID0gUkVDSVBJRU5UOworI2lmIDEKKwkJCUVsZW0tPk1zZ0xlbiAgPSBzaXplb2YoRGVsYmFSZXEpOworCQkJTmRpc01vdmVNZW1vcnkoRWxlbS0+TXNnLCAmRGVsYmFSZXEsIHNpemVvZihEZWxiYVJlcSkpOworCQkJTWxtZURFTEJBQWN0aW9uKHBBZCwgRWxlbSk7CisJCQlrZnJlZShFbGVtKTsKKyNlbHNlCisJCQlNbG1lRW5xdWV1ZShwQWQsIEFDVElPTl9TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9PUklfREVMQkFfQ0FURSwgc2l6ZW9mKE1MTUVfREVMQkFfUkVRX1NUUlVDVCksIChQVk9JRCkmRGVsYmFSZXEpOworCQkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworI2VuZGlmCisJCX0KKworCisJCS8vCisJCS8vIDIuIEZyZWUgcmVzb3VyY2Ugb2YgQkEgc2Vzc2lvbgorCQkvLworCQkvLyBmbHVzaCBhbGwgcGVuZGluZyByZW9yZGVyaW5nIG1wZHVzCisJCWJhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhwQWQsIHBCQUVudHJ5KTsKKworCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisKKwkJLy8gRXJhc2UgQml0bWFwIGZsYWcuCisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gUkVTRVRfUkNWX1NFUTsKKwkJcEJBRW50cnktPkJBV2luU2l6ZSA9IDA7CisJCS8vIEVyYXNlIEJpdG1hcCBmbGFnIGF0IHNvZnR3YXJlIG1hY3RhYmxlCisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uUlhCQWJpdG1hcCAmPSAofigxPDwocEJBRW50cnktPlRJRCkpKTsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5CQVJlY1djaWRBcnJheVtUSURdID0gMDsKKworCQlSVDI4WFhfREVMX0JBX1NFU1NJT05fRlJPTV9BU0lDKHBBZCwgV2NpZCwgVElEKTsKKworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisKKwl9CisKKwlCQVRhYmxlRnJlZVJlY0VudHJ5KHBBZCwgSWR4KTsKK30KKworVk9JRCBCQVNlc3Npb25UZWFyRG93bkFMTCgKKwkJCQkJCSBJTiBPVVQgIFBSVE1QX0FEQVBURVIgcEFkLAorCQkJCQkJIElOICAgICAgVUNIQVIgV2NpZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaT0wOyBpPE5VTV9PRl9USUQ7IGkrKykKKwl7CisJCUJBT3JpU2Vzc2lvblRlYXJEb3duKHBBZCwgV2NpZCwgaSwgRkFMU0UsIEZBTFNFKTsKKwkJQkFSZWNTZXNzaW9uVGVhckRvd24ocEFkLCBXY2lkLCBpLCBGQUxTRSk7CisJfQorfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUmV0cnkgc2VuZGluZyBBRERCQSBSZXFlc3QuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCVBhcmFtZXRyczoKKwlwODAyM0hlYWRlcjogaWYgdGhpcyBpcyBhbHJlYWR5IDgwMi4zIGZvcm1hdCwgcDgwMjNIZWFkZXIgaXMgTlVMTAorCisJUmV0dXJuCTogVFJVRSBpZiBwdXQgaW50byByeCByZW9yZGVyaW5nIGJ1ZmZlciwgc2hvdWxkbid0IGluZGljYXRlcnhoZXJlLgorCQkJCUZBTFNFICwgdGhlbiBjb250aW51ZSBpbmRpY2F0ZXJ4IGF0IHRoaXMgbW9tZW50LgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQkFPcmlTZXNzaW9uU2V0dXBUaW1lb3V0KAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKyAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKwlCQV9PUklfRU5UUlkgICAgKnBCQUVudHJ5ID0gKEJBX09SSV9FTlRSWSAqKUZ1bmN0aW9uQ29udGV4dDsKKwlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKwlQUlRNUF9BREFQVEVSICAgcEFkOworCisJaWYgKHBCQUVudHJ5ID09IE5VTEwpCisJCXJldHVybjsKKworCXBBZCA9IHBCQUVudHJ5LT5wQWRhcHRlcjsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQkvLyBEbyBub3RoaW5nIGlmIG1vbml0b3IgbW9kZSBpcyBvbgorCQlpZiAoTU9OSVRPUl9PTihwQWQpKQorCQkJcmV0dXJuOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIFJBTElOS19BVEUKKwkvLyBOb3RoaW5nIHRvIGRvIGluIEFURSBtb2RlLgorCWlmIChBVEVfT04ocEFkKSkKKwkJcmV0dXJuOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3BCQUVudHJ5LT5XY2lkXTsKKworCWlmICgocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9XYWl0UmVzKSAmJiAocEJBRW50cnktPlRva2VuIDwgT1JJX1NFU1NJT05fTUFYX1JFVFJZKSkKKwl7CisJCU1MTUVfQUREQkFfUkVRX1NUUlVDVCAgICBBZGRiYVJlcTsKKworCQlOZGlzWmVyb01lbW9yeSgmQWRkYmFSZXEsIHNpemVvZihBZGRiYVJlcSkpOworCQlDT1BZX01BQ19BRERSKEFkZGJhUmVxLnBBZGRyLCBwRW50cnktPkFkZHIpOworCQlBZGRiYVJlcS5XY2lkID0gKFVDSEFSKShwRW50cnktPkFpZCk7CisJCUFkZGJhUmVxLlRJRCA9IHBCQUVudHJ5LT5USUQ7CisJCUFkZGJhUmVxLkJhQnVmU2l6ZSA9IHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQ7CisJCUFkZGJhUmVxLlRpbWVPdXRWYWx1ZSA9IDA7CisJCUFkZGJhUmVxLlRva2VuID0gcEJBRW50cnktPlRva2VuOworCQlNbG1lRW5xdWV1ZShwQWQsIEFDVElPTl9TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9BRERfQkFfQ0FURSwgc2l6ZW9mKE1MTUVfQUREQkFfUkVRX1NUUlVDVCksIChQVk9JRCkmQWRkYmFSZXEpOworCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkEgT3JpIFNlc3Npb24gVGltZW91dCglZCkgOiBTZW5kIEFERCBCQSBhZ2FpblxuIiwgcEJBRW50cnktPlRva2VuKSk7CisKKwkJcEJBRW50cnktPlRva2VuKys7CisJCVJUTVBTZXRUaW1lcigmcEJBRW50cnktPk9SSUJBVGltZXIsIE9SSV9CQV9TRVNTSU9OX1RJTUVPVVQpOworCX0KKwllbHNlCisJeworCQlCQVRhYmxlRnJlZU9yaUVudHJ5KHBBZCwgcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtwQkFFbnRyeS0+VElEXSk7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVJldHJ5IHNlbmRpbmcgQUREQkEgUmVxZXN0LgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlQYXJhbWV0cnM6CisJcDgwMjNIZWFkZXI6IGlmIHRoaXMgaXMgYWxyZWFkeSA4MDIuMyBmb3JtYXQsIHA4MDIzSGVhZGVyIGlzIE5VTEwKKworCVJldHVybgk6IFRSVUUgaWYgcHV0IGludG8gcnggcmVvcmRlcmluZyBidWZmZXIsIHNob3VsZG4ndCBpbmRpY2F0ZXJ4aGVyZS4KKwkJCQlGQUxTRSAsIHRoZW4gY29udGludWUgaW5kaWNhdGVyeCBhdCB0aGlzIG1vbWVudC4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEJBUmVjU2Vzc2lvbklkbGVUaW1lb3V0KAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKyAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKworCUJBX1JFQ19FTlRSWSAgICAqcEJBRW50cnkgPSAoQkFfUkVDX0VOVFJZICopRnVuY3Rpb25Db250ZXh0OworCVBSVE1QX0FEQVBURVIgICBwQWQ7CisJVUxPTkcgICAgICAgICAgIE5vdzMyOworCisJaWYgKHBCQUVudHJ5ID09IE5VTEwpCisJCXJldHVybjsKKworCWlmICgocEJBRW50cnktPlJFQ19CQV9TdGF0dXMgPT0gUmVjaXBpZW50X0FjY2VwdCkpCisJeworCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3czMik7CisKKwkJaWYgKFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3czMiwgKHVuc2lnbmVkIGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciArIFJFQ19CQV9TRVNTSU9OX0lETEVfVElNRU9VVCkpKQorCQl7CisJCQlwQWQgPSBwQkFFbnRyeS0+cEFkYXB0ZXI7CisJCQkvLyBmbHVzaCBhbGwgcGVuZGluZyByZW9yZGVyaW5nIG1wZHVzCisJCQliYV9yZWZyZXNoX3Jlb3JkZXJpbmdfbXBkdXMocEFkLCBwQkFFbnRyeSk7CisJCQlwcmludGsoIiVsZDogUkVDIEJBIHNlc3Npb24gVGltZW91dFxuIiwgTm93MzIpOworCQl9CisJfQorfQorCisKK1ZPSUQgUGVlckFkZEJBUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKKworeworCS8vCTcuNC40LjEKKwkvL1VMT05HCUlkeDsKKwlVQ0hBUiAgIFN0YXR1cyA9IDE7CisJVUNIQVIgICBwQWRkcls2XTsKKwlGUkFNRV9BRERCQV9SU1AgQUREZnJhbWU7CisJUFVDSEFSICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMgICAgIE5TdGF0dXM7CisJUEZSQU1FX0FEREJBX1JFUSAgcEFkZHJlcUZyYW1lID0gTlVMTDsKKwkvL1VDSEFSCQlCdWZTaXplOworCVVMT05HICAgICAgIEZyYW1lTGVuOworCVBVTE9ORyAgICAgIHB0ZW1wOworCVBNQUNfVEFCTEVfRU5UUlkJcE1hY0VudHJ5OworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgPT0+IChXY2lkID0gJWQpXG4iLCBfX2Z1bmNfXywgRWxlbS0+V2NpZCkpOworCisJLy9oZXhfZHVtcCgiQWRkQkFSZXEiLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbik7CisKKwkvL0FEREJBIFJlcXVlc3QgZnJvbSB1bmtub3duIHBlZXIsIGlnbm9yZSB0aGlzLgorCWlmIChFbGVtLT5XY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCQlyZXR1cm47CisKKwlwTWFjRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJBIC0gUGVlckFkZEJBUmVxQWN0aW9uLS0tLT4gXG4iKSk7CisJcHRlbXAgPSAoUFVMT05HKUVsZW0tPk1zZzsKKwkvL0RCR1BSSU5UX1JBVyhSVF9ERUJVR19FTVUsICgiJTA4eDo6ICUwOHg6OiAlMDh4OjogJTA4eDo6ICUwOHg6OiAlMDh4OjogJTA4eDo6ICUwOHg6OiAlMDh4XG4iLCAqKHB0ZW1wKSwgKihwdGVtcCsxKSwgKihwdGVtcCsyKSwgKihwdGVtcCszKSwgKihwdGVtcCs0KSwgKihwdGVtcCs1KSwgKihwdGVtcCs2KSwgKihwdGVtcCs3KSwgKihwdGVtcCs4KSkpOworCisJaWYgKFBlZXJBZGRCQVJlcUFjdGlvblNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBwQWRkcikpCisJeworCisJCWlmICgocEFkLT5Db21tb25DZmcuYkJBRGVjbGluZSA9PSBGQUxTRSkgJiYgSVNfSFRfU1RBKHBNYWNFbnRyeSkpCisJCXsKKwkJCXBBZGRyZXFGcmFtZSA9IChQRlJBTUVfQUREQkFfUkVRKSgmRWxlbS0+TXNnWzBdKTsKKwkJCXByaW50aygiUmN2IFdjaWQoJWQpIEFkZEJBUmVxXG4iLCBFbGVtLT5XY2lkKTsKKwkJCWlmIChCQVJlY1Nlc3Npb25BZGQocEFkLCAmcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXSwgcEFkZHJlcUZyYW1lKSkKKwkJCQlTdGF0dXMgPSAwOworCQkJZWxzZQorCQkJCVN0YXR1cyA9IDM4OyAvLyBtb3JlIHBhcmFtZXRlcnMgaGF2ZSBpbnZhbGlkIHZhbHVlcworCQl9CisJCWVsc2UKKwkJeworCQkJU3RhdHVzID0gMzc7IC8vIHRoZSByZXF1ZXN0IGhhcyBiZWVuIGRlY2xpbmVkLgorCQl9CisJfQorCisJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uVmFsaWRBc0NMSSkKKwkJQVNTRVJUKHBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uU3N0ID09IFNTVF9BU1NPQyk7CisKKwlwQWRkcmVxRnJhbWUgPSAoUEZSQU1FX0FEREJBX1JFUSkoJkVsZW0tPk1zZ1swXSk7CisJLy8gMi4gQWx3YXlzIHNlbmQgYmFjayBBRERCQSBSZXNwb25zZQorCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CSAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQUNUSU9OIC0gUGVlckJBQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCU5kaXNaZXJvTWVtb3J5KCZBRERmcmFtZSwgc2l6ZW9mKEZSQU1FX0FEREJBX1JTUCkpOworCS8vIDItMS4gUHJlcGFyZSBBRERCQSBSZXNwb25zZSBmcmFtZS4KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJaWYgKEFESE9DX09OKHBBZCkpCisJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkFERGZyYW1lLkhkciwgcEFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJZWxzZQorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5WYWxpZEFzRGxzKQorCQkJQWN0SGVhZGVySW5pdChwQWQsICZBRERmcmFtZS5IZHIsIHBBZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCWVsc2UKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkJCUFjdEhlYWRlckluaXQocEFkLCAmQUREZnJhbWUuSGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkZHIpOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlBRERmcmFtZS5DYXRlZ29yeSA9IENBVEVHT1JZX0JBOworCUFERGZyYW1lLkFjdGlvbiA9IEFEREJBX1JFU1A7CisJQUREZnJhbWUuVG9rZW4gPSBwQWRkcmVxRnJhbWUtPlRva2VuOworCS8vIFdoYXQgaXMgdGhlIFN0YXR1cyBjb2RlPz8gIG5lZWQgdG8gY2hlY2suCisJQUREZnJhbWUuU3RhdHVzQ29kZSA9IFN0YXR1czsKKwlBRERmcmFtZS5CYVBhcm0uQkFQb2xpY3kgPSBJTU1FRF9CQTsKKwlBRERmcmFtZS5CYVBhcm0uQU1TRFVTdXBwb3J0ZWQgPSAwOworCUFERGZyYW1lLkJhUGFybS5USUQgPSBwQWRkcmVxRnJhbWUtPkJhUGFybS5USUQ7CisJQUREZnJhbWUuQmFQYXJtLkJ1ZlNpemUgPSBtaW4oKChVQ0hBUilwQWRkcmVxRnJhbWUtPkJhUGFybS5CdWZTaXplKSwgKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQpOworCWlmIChBRERmcmFtZS5CYVBhcm0uQnVmU2l6ZSA9PSAwKQorCXsKKwkJQUREZnJhbWUuQmFQYXJtLkJ1ZlNpemUgPSA2NDsKKwl9CisJQUREZnJhbWUuVGltZU91dFZhbHVlID0gMDsgLy9wQWRkcmVxRnJhbWUtPlRpbWVPdXRWYWx1ZTsKKworCSooVVNIT1JUICopKCZBRERmcmFtZS5CYVBhcm0pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJkFERGZyYW1lLkJhUGFybSkpOworCUFERGZyYW1lLlN0YXR1c0NvZGUgPSBjcHUybGUxNihBRERmcmFtZS5TdGF0dXNDb2RlKTsKKwlBRERmcmFtZS5UaW1lT3V0VmFsdWUgPSBjcHUybGUxNihBRERmcmFtZS5UaW1lT3V0VmFsdWUpOworCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAmRnJhbWVMZW4sCisJCQkJCSAgc2l6ZW9mKEZSQU1FX0FEREJBX1JTUCksICAmQUREZnJhbWUsCisJCQkgIEVORF9PRl9BUkdTKTsKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyglZCk6IFRJRCglZCksIEJ1ZlNpemUoJWQpIDw9PSBcbiIsIF9fZnVuY19fLCBFbGVtLT5XY2lkLCBBRERmcmFtZS5CYVBhcm0uVElELAorCQkJCQkJCSAgQUREZnJhbWUuQmFQYXJtLkJ1ZlNpemUpKTsKK30KKworCitWT0lEIFBlZXJBZGRCQVJzcEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCisKK3sKKwkvL1VDSEFSCQlJZHgsIGk7CisJLy9QVUNIQVIJCSAgIHBPdXRCdWZmZXIgPSBOVUxMOworCVBGUkFNRV9BRERCQV9SU1AgICAgcEZyYW1lID0gTlVMTDsKKwkvL1BCQV9PUklfRU5UUlkJCXBCQUVudHJ5OworCisJLy9BRERCQSBSZXNwb25zZSBmcm9tIHVua25vd24gcGVlciwgaWdub3JlIHRoaXMuCisJaWYgKEVsZW0tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCXJldHVybjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzID09PiBXY2lkKCVkKVxuIiwgX19mdW5jX18sIEVsZW0tPldjaWQpKTsKKworCS8vaGV4X2R1bXAoIlBlZXJBZGRCQVJzcEFjdGlvbigpIiwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4pOworCisJaWYgKFBlZXJBZGRCQVJzcEFjdGlvblNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKSkKKwl7CisJCXBGcmFtZSA9IChQRlJBTUVfQUREQkFfUlNQKSgmRWxlbS0+TXNnWzBdKTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJcdFx0IFN0YXR1c0NvZGUgPSAlZFxuIiwgcEZyYW1lLT5TdGF0dXNDb2RlKSk7CisJCXN3aXRjaCAocEZyYW1lLT5TdGF0dXNDb2RlKQorCQl7CisJCQljYXNlIDA6CisJCQkJLy8gSSB3YW50IGEgQkFzZXNzaW9uIHdpdGggdGhpcyBwZWVyIGFzIGFuIG9yaWdpbmF0b3IuCisJCQkJQkFPcmlTZXNzaW9uQWRkKHBBZCwgJnBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0sIHBGcmFtZSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCS8vIGNoZWNrIHN0YXR1cyA9PSBVU0VEID8/PworCQkJCUJBT3JpU2Vzc2lvblRlYXJEb3duKHBBZCwgRWxlbS0+V2NpZCwgcEZyYW1lLT5CYVBhcm0uVElELCBUUlVFLCBGQUxTRSk7CisJCQkJYnJlYWs7CisJCX0KKwkJLy8gUmN2IERlY2xpbmUgU3RhdHVzQ29kZQorCQlpZiAoKHBGcmFtZS0+U3RhdHVzQ29kZSA9PSAzNykKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyAgICAgICAgICAgIHx8ICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYgU1RBX1RHTl9XSUZJX09OKHBBZCkgJiYgKHBGcmFtZS0+U3RhdHVzQ29kZSAhPSAwKSkKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICkKKwkJeworCQkJcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5CQURlY2xpbmVCaXRtYXAgfD0gMTw8cEZyYW1lLT5CYVBhcm0uVElEOworCQl9CisJfQorfQorCitWT0lEIFBlZXJEZWxCQUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCisKK3sKKwkvL1VDSEFSCQkJCUlkeDsKKwkvL1BVQ0hBUgkJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlQRlJBTUVfREVMQkFfUkVRICAgIHBEZWxGcmFtZSA9IE5VTEw7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzID09PlxuIiwgX19mdW5jX18pKTsKKwkvL0RFTEJBIFJlcXVlc3QgZnJvbSB1bmtub3duIHBlZXIsIGlnbm9yZSB0aGlzLgorCWlmIChQZWVyRGVsQkFBY3Rpb25TYW5pdHkocEFkLCBFbGVtLT5XY2lkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbikpCisJeworCQlwRGVsRnJhbWUgPSAoUEZSQU1FX0RFTEJBX1JFUSkoJkVsZW0tPk1zZ1swXSk7CisJCWlmIChwRGVsRnJhbWUtPkRlbGJhUGFybS5Jbml0aWF0b3IgPT0gT1JJR0lOQVRPUikKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQSAtIFBlZXJEZWxCQUFjdGlvbi0tLS0+IE9SSUdJTkFUT1JcbiIpKTsKKwkJCUJBUmVjU2Vzc2lvblRlYXJEb3duKHBBZCwgRWxlbS0+V2NpZCwgcERlbEZyYW1lLT5EZWxiYVBhcm0uVElELCBUUlVFKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkEgLSBQZWVyRGVsQkFBY3Rpb24tLS0tPiBSRUNJUElFTlQsIFJlYXNvbiA9ICVkXG4iLCAgcERlbEZyYW1lLT5SZWFzb25Db2RlKSk7CisJCQkvL2hleF9kdW1wKCJEZWxCQSBGcmFtZSIsIHBEZWxGcmFtZSwgRWxlbS0+TXNnTGVuKTsKKwkJCUJBT3JpU2Vzc2lvblRlYXJEb3duKHBBZCwgRWxlbS0+V2NpZCwgcERlbEZyYW1lLT5EZWxiYVBhcm0uVElELCBUUlVFLCBGQUxTRSk7CisJCX0KKwl9Cit9CisKKworQk9PTEVBTiBDbnRsRW5xdWV1ZUZvclJlY3YoCisJCQkJCQkgIElOIFBSVE1QX0FEQVBURVIJCXBBZCwKKwkJCQkJCSAgSU4gVUxPTkcJCQkJV2NpZCwKKwkJCQkJCSAgSU4gVUxPTkcJCQkJTXNnTGVuLAorCQkJCQkJICBJTiBQRlJBTUVfQkFfUkVRCQlwTXNnKQoreworCVBGUkFNRV9CQV9SRVEgICBwRnJhbWUgPSBwTXNnOworCS8vUFJUTVBfUkVPUkRFUkJVRglwQnVmZmVyOworCS8vUFJUTVBfUkVPUkRFUkJVRglwRG1hQnVmOworCVBCQV9SRUNfRU5UUlkgcEJBRW50cnk7CisJLy9CT09MRUFOIAlSZXN1bHQ7CisJVUxPTkcgICBJZHg7CisJLy9VQ0hBUglOdW1SeFBrdDsKKwlVQ0hBUglUSUQ7Ly8sIGk7CisKKwlUSUQgPSAoVUNIQVIpcEZyYW1lLT5CQVJDb250cm9sLlRJRDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCk6IEJBUi1XY2lkKCVsZCksIFRpZCAoJWQpXG4iLCBfX2Z1bmNfXywgV2NpZCwgVElEKSk7CisJLy9oZXhfZHVtcCgiQkFSIiwgKFBDSEFSKSBwRnJhbWUsIE1zZ0xlbik7CisJLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCisJLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0CisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkJcmV0dXJuIEZBTFNFOworCisJLy8gRmlyc3QgY2hlY2sgdGhlIHNpemUsIGl0IE1VU1Qgbm90IGV4Y2VlZCB0aGUgbWxtZSBxdWV1ZSBzaXplCisJaWYgKE1zZ0xlbiA+IE1HTVRfRE1BX0JVRkZFUl9TSVpFKQorCXsKKwkJREJHUFJJTlRfRVJSKCgiQ250bEVucXVldWVGb3JSZWN2OiBmcmFtZSB0b28gbGFyZ2UsIHNpemUgPSAlbGQgXG4iLCBNc2dMZW4pKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwllbHNlIGlmIChNc2dMZW4gIT0gc2l6ZW9mKEZSQU1FX0JBX1JFUSkpCisJeworCQlEQkdQUklOVF9FUlIoKCJDbnRsRW5xdWV1ZUZvclJlY3Y6IEJsb2NrQWNrIFJlcXVlc3QgZnJhbWUgbGVuZ3RoIHNpemUgPSAlbGQgaW5jb3JyZWN0XG4iLCBNc2dMZW4pKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwllbHNlIGlmIChNc2dMZW4gIT0gc2l6ZW9mKEZSQU1FX0JBX1JFUSkpCisJeworCQlEQkdQUklOVF9FUlIoKCJDbnRsRW5xdWV1ZUZvclJlY3Y6IEJsb2NrQWNrIFJlcXVlc3QgZnJhbWUgbGVuZ3RoIHNpemUgPSAlbGQgaW5jb3JyZWN0XG4iLCBNc2dMZW4pKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmICgoV2NpZCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKSAmJiAoVElEIDwgOCkpCisJCXsKKwkJLy8gaWYgdGhpcyByZWNlaXZpbmcgcGFja2V0IGlzIGZyb20gU0EgdGhhdCBpcyBpbiBvdXIgT3JpRW50cnkuIFNpbmNlIFdDSUQgPDkgaGFzIGRpcmVjdCBtYXBwaW5nLiBubyBuZWVkIHNlYXJjaC4KKwkJSWR4ID0gcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5CQVJlY1djaWRBcnJheVtUSURdOworCQlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtJZHhdOworCQl9CisJCWVsc2UKKwkJeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkFSKCVsZCkgOiBUaWQgKCVkKSAtICUwNHg6JTA0eFxuIiwgV2NpZCwgVElELCBwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEsIHBCQUVudHJ5LT5MYXN0SW5kU2VxICkpOworCisJaWYgKFNFUV9TTUFMTEVSKHBCQUVudHJ5LT5MYXN0SW5kU2VxLCBwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEsIE1BWFNFUSkpCisJeworCQkvL3ByaW50aygiQkFSIFNlcSA9ICV4LCBMYXN0SW5kU2VxID0gJXhcbiIsIHBGcmFtZS0+QkFTdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSwgcEJBRW50cnktPkxhc3RJbmRTZXEpOworCQliYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2xlX3NlcShwQWQsIHBCQUVudHJ5LCBwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEpOworCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IChwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEgPT0gMCkgPyBNQVhTRVEgOihwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEgLTEpOworCX0KKwkvL2JhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhwQWQsIHBCQUVudHJ5KTsKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKK0Rlc2NyaXB0aW9uIDogU2VuZCBQU01QIEFjdGlvbiBmcmFtZSBJZiBQU01QIG1vZGUgc3dpdGNoZXMuCisqLworVk9JRCBTZW5kUFNNUEFjdGlvbigKKwkJCQkgICBJTiBQUlRNUF9BREFQVEVSCQlwQWQsCisJCQkJICAgSU4gVUNIQVIJCQkJV2NpZCwKKwkJCQkgICBJTiBVQ0hBUgkJCQlQc21wKQoreworCVBVQ0hBUiAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUyAgICAgTlN0YXR1czsKKwkvL1VMT05HICAgICAgICAgICBJZHg7CisJRlJBTUVfUFNNUF9BQ1RJT04gICBGcmFtZTsKKwlVTE9ORyAgICAgICAgICAgRnJhbWVMZW47CisKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOwkgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkJBIC0gTWxtZUFEREJBQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJcmV0dXJuOworCX0KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQWRkcik7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlGcmFtZS5DYXRlZ29yeSA9IENBVEVHT1JZX0hUOworCUZyYW1lLkFjdGlvbiA9IFNNUFNfQUNUSU9OOworCXN3aXRjaCAoUHNtcCkKKwl7CisJCWNhc2UgTU1QU19FTkFCTEU6CisJCQlGcmFtZS5Qc21wID0gMDsKKwkJCWJyZWFrOworCQljYXNlIE1NUFNfRFlOQU1JQzoKKwkJCUZyYW1lLlBzbXAgPSAzOworCQkJYnJlYWs7CisJCWNhc2UgTU1QU19TVEFUSUM6CisJCQlGcmFtZS5Qc21wID0gMTsKKwkJCWJyZWFrOworCX0KKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKwkJCQkJICBzaXplb2YoRlJBTUVfUFNNUF9BQ1RJT04pLCAgICAgICZGcmFtZSwKKwkJCQkJICBFTkRfT0ZfQVJHUyk7CisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiSFQgLSBTZW5kUFNNUEFjdGlvbiggJWQgKSAgXG4iLCBGcmFtZS5Qc21wKSk7Cit9CisKKworI2RlZmluZSBSQURJT19NRUFTVVJFTUVOVF9SRVFVRVNUX0FDVElPTgkwCisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRAoreworCVVDSEFSCVJlZ3VsYXRvcnlDbGFzczsKKwlVQ0hBUglDaGFubmVsTnVtYmVyOworCVVTSE9SVAlSYW5kb21JbnRlcnZhbDsKKwlVU0hPUlQJTWVhc3VyZW1lbnREdXJhdGlvbjsKKwlVQ0hBUglNZWFzdXJlbWVudE1vZGU7CisJVUNIQVIgICBCU1NJRFtNQUNfQUREUl9MRU5dOworCVVDSEFSCVJlcG9ydGluZ0NvbmRpdGlvbjsKKwlVQ0hBUglUaHJlc2hvbGQ7CisJVUNIQVIgICBTU0lESUVbMl07CQkJLy8gMiBieXRlCit9IEJFQUNPTl9SRVFVRVNUOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQKK3sKKwlVQ0hBUglJRDsKKwlVQ0hBUglMZW5ndGg7CisJVUNIQVIJVG9rZW47CisJVUNIQVIJUmVxdWVzdE1vZGU7CisJVUNIQVIJVHlwZTsKK30gTUVBU1VSRU1FTlRfUkVROworCisKKworCit2b2lkIGNvbnZlcnRfcmVvcmRlcmluZ19wYWNrZXRfdG9fcHJlQU1TRFVfb3JfODAyXzNfcGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4gIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJUE5ESVNfUEFDS0VUCXBSeFBrdDsKKwlVQ0hBUgkJCUhlYWRlcjgwMl8zW0xFTkdUSF84MDJfM107CisKKwkvLyAxLiBnZXQgODAyLjMgSGVhZGVyCisJLy8gMi4gcmVtb3ZlIExMQworCS8vIAkJYS4gcG9pbnRlciBwUnhCbGstPnBEYXRhIHRvIHBheWxvYWQKKwkvLyAgICAgIGIuIG1vZGlmeSBwUnhCbGstPkRhdGFTaXplCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlSVE1QXzgwMl8xMV9SRU1PVkVfTExDX0FORF9DT05WRVJUX1RPXzgwMl8zKHBSeEJsaywgSGVhZGVyODAyXzMpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJQVNTRVJUKHBSeEJsay0+cFJ4UGFja2V0KTsKKwlwUnhQa3QgPSBSVFBLVF9UT19PU1BLVChwUnhCbGstPnBSeFBhY2tldCk7CisKKwlSVFBLVF9UT19PU1BLVChwUnhQa3QpLT5kZXYgPSBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBGcm9tV2hpY2hCU1NJRCk7CisJUlRQS1RfVE9fT1NQS1QocFJ4UGt0KS0+ZGF0YSA9IHBSeEJsay0+cERhdGE7CisJUlRQS1RfVE9fT1NQS1QocFJ4UGt0KS0+bGVuID0gcFJ4QmxrLT5EYXRhU2l6ZTsKKwlSVFBLVF9UT19PU1BLVChwUnhQa3QpLT50YWlsID0gUlRQS1RfVE9fT1NQS1QocFJ4UGt0KS0+ZGF0YSArIFJUUEtUX1RPX09TUEtUKHBSeFBrdCktPmxlbjsKKworCS8vCisJLy8gY29weSA4MDIuMyBoZWFkZXIsIGlmIG5lY2Vzc2FyeQorCS8vCisJaWYgKCFSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNU0RVKSkKKwl7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworI2lmZGVmIExJTlVYCisJCQlOZGlzTW92ZU1lbW9yeShza2JfcHVzaChwUnhQa3QsIExFTkdUSF84MDJfMyksIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMpOworI2VuZGlmCisjaWZkZWYgVUNPUworCQkJTmRpc01vdmVNZW1vcnkobmV0X3BrdF9wdXNoKHBSeFBrdCwgTEVOR1RIXzgwMl8zKSwgSGVhZGVyODAyXzMsIExFTkdUSF84MDJfMyk7CisjZW5kaWYKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KK30KKworCisjZGVmaW5lIElORElDQVRFX0xFR0FDWV9PUl9BTVNEVShfcEFkLCBfcFJ4QmxrLCBfZnJvbVdoaWNoQlNTSUQpCQlcCisJZG8JCQkJCQkJCQkJCQkJCQkJCVwKKwl7CQkJCQkJCQkJCQkJCQkJCQlcCisgICAgCWlmIChSWF9CTEtfVEVTVF9GTEFHKF9wUnhCbGssIGZSWF9BTVNEVSkpCQkJCQkJXAorICAgIAl7CQkJCQkJCQkJCQkJCQkJCVwKKyAgICAJCUluZGljYXRlX0FNU0RVX1BhY2tldChfcEFkLCBfcFJ4QmxrLCBfZnJvbVdoaWNoQlNTSUQpOwkJXAorICAgIAl9CQkJCQkJCQkJCQkJCQkJCVwKKwkJZWxzZSBpZiAoUlhfQkxLX1RFU1RfRkxBRyhfcFJ4QmxrLCBmUlhfRUFQKSkJCQkJCVwKKwkJewkJCQkJCQkJCQkJCQkJCQlcCisJCQlJbmRpY2F0ZV9FQVBPTF9QYWNrZXQoX3BBZCwgX3BSeEJsaywgX2Zyb21XaGljaEJTU0lEKTsJCVwKKwkJfQkJCQkJCQkJCQkJCQkJCQlcCisgICAgCWVsc2UJCQkJCQkJCQkJCQkJCQlcCisgICAgCXsJCQkJCQkJCQkJCQkJCQkJXAorICAgIAkJSW5kaWNhdGVfTGVnYWN5X1BhY2tldChfcEFkLCBfcFJ4QmxrLCBfZnJvbVdoaWNoQlNTSUQpOwkJXAorICAgIAl9CQkJCQkJCQkJCQkJCQkJCVwKKwl9IHdoaWxlICgwKTsKKworCisKK3N0YXRpYyBWT0lEIGJhX2VucXVldWVfcmVvcmRlcmluZ19wYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUEJBX1JFQ19FTlRSWQlwQkFFbnRyeSwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGs7CisJVUlOVDE2CVNlcXVlbmNlID0gKFVJTlQxNikgcFJ4QmxrLT5wSGVhZGVyLT5TZXF1ZW5jZTsKKworCW1wZHVfYmxrID0gYmFfbXBkdV9ibGtfYWxsb2MocEFkKTsKKwlpZiAobXBkdV9ibGsgIT0gTlVMTCkKKwl7CisJCS8vIFdyaXRlIFJ4RCBidWZmZXIgYWRkcmVzcyAmIGFsbG9jYXRlZCBidWZmZXIgbGVuZ3RoCisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBCQUVudHJ5LT5SeFJlUmluZ0xvY2spOworCisJCW1wZHVfYmxrLT5TZXF1ZW5jZSA9IFNlcXVlbmNlOworCisJCW1wZHVfYmxrLT5iQU1TRFUgPSBSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNU0RVKTsKKworCQljb252ZXJ0X3Jlb3JkZXJpbmdfcGFja2V0X3RvX3ByZUFNU0RVX29yXzgwMl8zX3BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCisJCVNUQVRTX0lOQ19SWF9QQUNLRVRTKHBBZCwgRnJvbVdoaWNoQlNTSUQpOworCisgICAgICAgIC8vCisJCS8vIGl0IGlzIG5lY2Vzc2FyeSBmb3IgcmVvcmRlcmluZyBwYWNrZXQgdG8gcmVjb3JkCisJCS8vIHdoaWNoIEJTUyBpdCBjb21lIGZyb20KKwkJLy8KKwkJUlRNUF9TRVRfUEFDS0VUX0lGKHBSeEJsay0+cFJ4UGFja2V0LCBGcm9tV2hpY2hCU1NJRCk7CisKKwkJbXBkdV9ibGstPnBQYWNrZXQgPSBwUnhCbGstPnBSeFBhY2tldDsKKworCQlpZiAoYmFfcmVvcmRlcmluZ19tcGR1X2luc2VydHNvcnRlZCgmcEJBRW50cnktPmxpc3QsIG1wZHVfYmxrKSA9PSBGQUxTRSkKKwkJeworCQkJLy8gaGFkIGJlZW4gYWxyZWFkeSB3aXRoaW4gcmVvcmRlcmluZyBsaXN0CisJCQkvLyBkb24ndCBpbmRpY2F0ZQorCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJCWJhX21wZHVfYmxrX2ZyZWUocEFkLCBtcGR1X2Jsayk7CisJCX0KKworCQlBU1NFUlQoKDA8PSBwQkFFbnRyeS0+bGlzdC5xbGVuKSAgJiYgKHBCQUVudHJ5LT5saXN0LnFsZW4gPD0gcEJBRW50cnktPkJBV2luU2l6ZSkpOworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKKwl9CisJZWxzZQorCXsKKyNpZiAwCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAgKCIhISEgKCVkOiVkKSBDYW4ndCBhbGxvY2F0ZSByZW9yZGVyaW5nIG1wZHUgYmxrXG4iLAorCQkJCQkJCQkgICBibGtfY291bnQsIHBCQUVudHJ5LT5saXN0LnFsZW4pKTsKKyNlbHNlCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAgKCIhISEgKCVkKSBDYW4ndCBhbGxvY2F0ZSByZW9yZGVyaW5nIG1wZHUgYmxrXG4iLAorCQkJCQkJCQkgICBwQkFFbnRyeS0+bGlzdC5xbGVuKSk7CisjZW5kaWYKKwkJLyoKKwkJICogZmx1c2ggYWxsIHBlbmRpbmcgcmVvcmRlcmluZyBtcGR1cworCQkgKiBhbmQgcmVjZXZpbmcgbXBkdSB0byB1cHBlciBsYXllcgorCQkgKiBtYWtlIHRjcC9pcCB0byB0YWtlIGNhcmUgcmVvcmRlcmluZyBtZWNoYW5pc20KKwkJICovCisJCS8vYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKHBBZCwgcEJBRW50cnkpOworCQliYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2xlX3NlcShwQWQsIHBCQUVudHJ5LCBTZXF1ZW5jZSk7CisKKwkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBTZXF1ZW5jZTsKKwkJSU5ESUNBVEVfTEVHQUNZX09SX0FNU0RVKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJfQorfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJSW5kaWNhdGUgdGhpcyBwYWNrZXQgdG8gdXBwZXIgbGF5ZXIgb3IgcHV0IGl0IGludG8gcmVvcmRlcmluZyBidWZmZXIKKworCVBhcmFtZXRyczoKKwkJcFJ4QmxrICAgICAgICAgOiBjYXJyeSBuZWNlc3NhcnkgcGFja2V0IGluZm8gODAyLjExIGZvcm1hdAorCQlGcm9tV2hpY2hCU1NJRCA6IHRoZSBwYWNrZXQgcmVjZWl2ZWQgZnJvbSB3aGljaCBCU1MKKworCVJldHVybgk6CisJCQkgIG5vbmUKKworCU5vdGUgICAgOgorCSAgICAgICAgICB0aGUgcGFja2V0IHF1ZXVlZCBpbnRvIHJlb3JkZXJpbmcgYnVmZmVyIG5lZWQgdG8gY292ZXIgdG8gODAyLjMgZm9ybWF0CisJCQkgIG9yIHByZV9BTVNEVSBmb3JtYXQKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK1ZPSUQgSW5kaWNhdGVfQU1QRFVfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKwlVU0hPUlQJCQkJSWR4OworCVBCQV9SRUNfRU5UUlkJCXBCQUVudHJ5ID0gTlVMTDsKKwlVSU5UMTYJCQkJU2VxdWVuY2UgPSBwUnhCbGstPnBIZWFkZXItPlNlcXVlbmNlOworCVVMT05HCQkJCU5vdzMyOworCVVDSEFSCQkJCVdjaWQgPSBwUnhCbGstPnBSeFdJLT5XaXJlbGVzc0NsaUlEOworCVVDSEFSCQkJCVRJRCA9IHBSeEJsay0+cFJ4V0ktPlRJRDsKKworCisJaWYgKCFSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNU0RVKSAmJiAgKHBSeEJsay0+RGF0YVNpemUgPiBNQVhfUlhfUEtUX0xFTikpCisJeworI2lmIDAgLy8gc2FtcGxlIHRha2Ugb2ZmLCBubyB1c2UKKwkJc3RhdGljIGludCBlcnJfc2l6ZTsKKworCQllcnJfc2l6ZSsrOworCQlpZiAoZXJyX3NpemUgPiAyMCkgeworCQkJIHByaW50aygiQU1QRFUgRGF0YVNpemUgPSAlZFxuIiwgcFJ4QmxrLT5EYXRhU2l6ZSk7CisJCQkgaGV4X2R1bXAoIjgwMi4xMSBIZWFkZXIiLCAoVUNIQVIgKilwUnhCbGstPnBIZWFkZXIsIDI0KTsKKwkJCSBoZXhfZHVtcCgiUGF5bG9hZCIsIHBSeEJsay0+cERhdGEsIDY0KTsKKwkJCSBlcnJfc2l6ZSA9IDA7CisJCX0KKyNlbmRpZgorCQkvLyByZWxlYXNlIHBhY2tldAorCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlyZXR1cm47CisJfQorCisKKyNpZiAwIC8vIHRlc3QKKwkvKiBSZWMgQkEgU2Vzc2lvbiBoYWQgYmVlbiB0b3JuIGRvd24gKi8KKwlJTkRJQ0FURV9MRUdBQ1lfT1JfQU1TRFUocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwlyZXR1cm47CisjZW5kaWYKKworCWlmIChXY2lkIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJeworCQlJZHggPSBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkJBUmVjV2NpZEFycmF5W1RJRF07CisJCWlmIChJZHggPT0gMCkKKwkJeworCQkJLyogUmVjIEJBIFNlc3Npb24gaGFkIGJlZW4gdG9ybiBkb3duICovCisJCQlJTkRJQ0FURV9MRUdBQ1lfT1JfQU1TRFUocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwkJCXJldHVybjsKKwkJfQorCQlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtJZHhdOworCX0KKwllbHNlCisJeworCQkvLyBpbXBvc3NpYmxlICEhIQorCQlBU1NFUlQoMCk7CisJCS8vIHJlbGVhc2UgcGFja2V0CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybjsKKwl9CisKKwlBU1NFUlQocEJBRW50cnkpOworCisJLy8gdXBkYXRlIGxhc3QgcnggdGltZQorCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdzMyKTsKKworCXBCQUVudHJ5LT5yY3ZTZXEgPSBTZXF1ZW5jZTsKKworCisJYmFfZmx1c2hfcmVvcmRlcmluZ190aW1lb3V0X21wZHVzKHBBZCwgcEJBRW50cnksIE5vdzMyKTsKKwlwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIgPSBOb3czMjsKKworCS8vCisJLy8gUmVzZXQgTGFzdCBJbmRpY2F0ZSBTZXF1ZW5jZQorCS8vCisJaWYgKHBCQUVudHJ5LT5MYXN0SW5kU2VxID09IFJFU0VUX1JDVl9TRVEpCisJeworCQlBU1NFUlQoKHBCQUVudHJ5LT5saXN0LnFsZW4gPT0gMCkgJiYgKHBCQUVudHJ5LT5saXN0Lm5leHQgPT0gTlVMTCkpOworCisJCS8vIHJlc2V0IHJjdiBzZXF1ZW5jZSBvZiBCQSBzZXNzaW9uCisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gU2VxdWVuY2U7CisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciA9IE5vdzMyOworCQlJTkRJQ0FURV9MRUdBQ1lfT1JfQU1TRFUocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwkJcmV0dXJuOworCX0KKworCisJLy8KKwkvLyBJLiBDaGVjayBpZiBpbiBvcmRlci4KKwkvLworCWlmIChTRVFfU1RFUE9ORShTZXF1ZW5jZSwgcEJBRW50cnktPkxhc3RJbmRTZXEsIE1BWFNFUSkpCisJeworCQlVU0hPUlQgIExhc3RJbmRTZXE7CisKKwkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBTZXF1ZW5jZTsKKwkJSU5ESUNBVEVfTEVHQUNZX09SX0FNU0RVKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisgCQlMYXN0SW5kU2VxID0gYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19pbl9vcmRlcihwQWQsIHBCQUVudHJ5LCBwQkFFbnRyeS0+TGFzdEluZFNlcSk7CisJCWlmIChMYXN0SW5kU2VxICE9IFJFU0VUX1JDVl9TRVEpCisJCXsKKwkJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gTGFzdEluZFNlcTsKKwkJfQorCQlwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIgPSBOb3czMjsKKwl9CisJLy8KKwkvLyBJSS4gRHJvcCBEdXBsaWNhdGVkIFBhY2tldAorCS8vCisJZWxzZSBpZiAoU2VxdWVuY2UgPT0gcEJBRW50cnktPkxhc3RJbmRTZXEpCisJeworCisJCS8vIGRyb3AgYW5kIHJlbGVhc2UgcGFja2V0CisJCXBCQUVudHJ5LT5uRHJvcFBhY2tldCsrOworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKwkvLworCS8vIElJSS4gRHJvcCBPbGQgUmVjZWl2ZWQgUGFja2V0CisJLy8KKwllbHNlIGlmIChTRVFfU01BTExFUihTZXF1ZW5jZSwgcEJBRW50cnktPkxhc3RJbmRTZXEsIE1BWFNFUSkpCisJeworCisJCS8vIGRyb3AgYW5kIHJlbGVhc2UgcGFja2V0CisJCXBCQUVudHJ5LT5uRHJvcFBhY2tldCsrOworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKwkvLworCS8vIElWLiBSZWNlaXZlIFNlcXVlbmNlIHdpdGhpbiBXaW5kb3cgU2l6ZQorCS8vCisJZWxzZSBpZiAoU0VRX1NNQUxMRVIoU2VxdWVuY2UsICgoKHBCQUVudHJ5LT5MYXN0SW5kU2VxK3BCQUVudHJ5LT5CQVdpblNpemUrMSkpICYgTUFYU0VRKSwgTUFYU0VRKSkKKwl7CisJCWJhX2VucXVldWVfcmVvcmRlcmluZ19wYWNrZXQocEFkLCBwQkFFbnRyeSwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJfQorCS8vCisJLy8gVi4gUmVjZWl2ZSBzZXEgc3VycGFzc2VzIFdpbihsYXN0c2VxICsgbk1TRFUpLiBTbyByZWZyZXNoIGFsbCByZW9yZGVyIGJ1ZmZlcgorCS8vCisJZWxzZQorCXsKKyNpZiAwCisJCWJhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhwQWQsIHBCQUVudHJ5KTsKKwkJSU5ESUNBVEVfTEVHQUNZX09SX0FNU0RVKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisjZWxzZQorCQlMT05HIFdpblN0YXJ0U2VxLCBUbXBTZXE7CisKKworCQlUbXBTZXEgPSBTZXF1ZW5jZSAtIChwQkFFbnRyeS0+QkFXaW5TaXplKSAtMTsKKwkJaWYgKFRtcFNlcSA8IDApCisJCXsKKwkJCVRtcFNlcSA9IChNQVhTRVErMSkgKyBUbXBTZXE7CisJCX0KKwkJV2luU3RhcnRTZXEgPSAoVG1wU2VxKzEpICYgTUFYU0VROworCQliYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2xlX3NlcShwQWQsIHBCQUVudHJ5LCBXaW5TdGFydFNlcSk7CisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gV2luU3RhcnRTZXE7IC8vVG1wU2VxOworCisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciA9IE5vdzMyOworCisJCWJhX2VucXVldWVfcmVvcmRlcmluZ19wYWNrZXQocEFkLCBwQkFFbnRyeSwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisKKwkJVG1wU2VxID0gYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19pbl9vcmRlcihwQWQsIHBCQUVudHJ5LCBwQkFFbnRyeS0+TGFzdEluZFNlcSk7CisJCWlmIChUbXBTZXEgIT0gUkVTRVRfUkNWX1NFUSkKKwkJeworCQkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBUbXBTZXE7CisJCX0KKyNlbmRpZgorCX0KK30KKworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2RhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjdiOWViCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2RhdGEuYwpAQCAtMCwwICsxLDM0NjYgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisjZGVmaW5lIE1BWF9UWF9JTl9UQlRUCQkoMTYpCisKKworVUNIQVIJU05BUF84MDJfMUhbXSA9IHsweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweDAwfTsKK1VDSEFSCVNOQVBfQlJJREdFX1RVTk5FTFtdID0gezB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4Zjh9OworLy8gQWRkIENpc2NvIEFpcm9uZXQgU05BUCBoZWFkZSBmb3IgQ0NYMiBzdXBwb3J0CitVQ0hBUglTTkFQX0FJUk9ORVRbXSA9IHsweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDQwLCAweDk2LCAweDAwLCAweDAwfTsKK1VDSEFSCUNLSVBfTExDX1NOQVBbXSA9IHsweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDQwLCAweDk2LCAweDAwLCAweDAyfTsKK1VDSEFSCUVBUE9MX0xMQ19TTkFQW109IHsweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDg4LCAweDhlfTsKK1VDSEFSCUVBUE9MW10gPSB7MHg4OCwgMHg4ZX07CitVQ0hBUiAgIFRQSURbXSA9IHsweDgxLCAweDAwfTsgLyogVkxBTiByZWxhdGVkICovCisKK1VDSEFSCUlQWFtdID0gezB4ODEsIDB4Mzd9OworVUNIQVIJQVBQTEVfVEFMS1tdID0gezB4ODAsIDB4ZjN9OworVUNIQVIJUmF0ZUlkVG9QbGNwU2lnbmFsWzEyXSA9IHsKKwkgMCwgLyogUkFURV8xICovCTEsIC8qIFJBVEVfMiAqLyAJMiwgLyogUkFURV81XzUgKi8JMywgLyogUkFURV8xMSAqLwkvLyBzZWUgQkJQIHNwZWMKKwkxMSwgLyogUkFURV82ICovICAgMTUsIC8qIFJBVEVfOSAqLyAgICAxMCwgLyogUkFURV8xMiAqLyAgIDE0LCAvKiBSQVRFXzE4ICovCS8vIHNlZSBJRUVFODAyLjExYS0xOTk5IHAuMTQKKwkgOSwgLyogUkFURV8yNCAqLyAgMTMsIC8qIFJBVEVfMzYgKi8JOCwgLyogUkFURV80OCAqLyAgIDEyICAvKiBSQVRFXzU0ICovIH07IC8vIHNlZSBJRUVFODAyLjExYS0xOTk5IHAuMTQKKworVUNIQVIJIE9mZG1TaWduYWxUb1JhdGVJZFsxNl0gPSB7CisJUkFURV81NCwgIFJBVEVfNTQsCVJBVEVfNTQsICBSQVRFXzU0LAkvLyBPRkRNIFBMQ1AgU2lnbmFsID0gMCwgIDEsICAyLCAgMyByZXNwZWN0aXZlbHkKKwlSQVRFXzU0LCAgUkFURV81NCwJUkFURV81NCwgIFJBVEVfNTQsCS8vIE9GRE0gUExDUCBTaWduYWwgPSA0LCAgNSwgIDYsICA3IHJlc3BlY3RpdmVseQorCVJBVEVfNDgsICBSQVRFXzI0LAlSQVRFXzEyLCAgUkFURV82LAkvLyBPRkRNIFBMQ1AgU2lnbmFsID0gOCwgIDksICAxMCwgMTEgcmVzcGVjdGl2ZWx5CisJUkFURV81NCwgIFJBVEVfMzYsCVJBVEVfMTgsICBSQVRFXzksCS8vIE9GRE0gUExDUCBTaWduYWwgPSAxMiwgMTMsIDE0LCAxNSByZXNwZWN0aXZlbHkKK307CisKK1VDSEFSCSBPZmRtUmF0ZVRvUnh3aU1DU1sxMl0gPSB7CisJMCwgIDAsCTAsICAwLAorCTAsICAxLAkyLCAgMywJLy8gT0ZETSByYXRlIDYsOSwxMiwxOCA9IHJ4d2kgbWNzIDAsMSwyLDMKKwk0LCAgNSwJNiwgIDcsCS8vIE9GRE0gcmF0ZSAyNCwzNiw0OCw1NCA9IHJ4d2kgbWNzIDQsNSw2LDcKK307CitVQ0hBUgkgUnh3aU1DU1RvT2ZkbVJhdGVbMTJdID0geworCVJBVEVfNiwgIFJBVEVfOSwJUkFURV8xMiwgIFJBVEVfMTgsCisJUkFURV8yNCwgIFJBVEVfMzYsCVJBVEVfNDgsICBSQVRFXzU0LAkvLyBPRkRNIHJhdGUgNiw5LDEyLDE4ID0gcnh3aSBtY3MgMCwxLDIsMworCTQsICA1LAk2LCAgNywJLy8gT0ZETSByYXRlIDI0LDM2LDQ4LDU0ID0gcnh3aSBtY3MgNCw1LDYsNworfTsKKworY2hhciogICBNQ1NUb01icHNbXSA9IHsiMU1icHMiLCIyTWJwcyIsIjUuNU1icHMiLCIxMU1icHMiLCIwNk1icHMiLCIwOU1icHMiLCIxMk1icHMiLCIxOE1icHMiLCIyNE1icHMiLCIzNk1icHMiLCI0OE1icHMiLCI1NE1icHMiLCJNTS0wIiwiTU0tMSIsIk1NLTIiLCJNTS0zIiwiTU0tNCIsIk1NLTUiLCJNTS02IiwiTU0tNyIsIk1NLTgiLCJNTS05IiwiTU0tMTAiLCJNTS0xMSIsIk1NLTEyIiwiTU0tMTMiLCJNTS0xNCIsIk1NLTE1IiwiTU0tMzIiLCJlZTEiLCJlZTIiLCJlZTMifTsKKworVUNIQVIgZGVmYXVsdF9jd21pbltdPXtDV19NSU5fSU5fQklUUywgQ1dfTUlOX0lOX0JJVFMsIENXX01JTl9JTl9CSVRTLTEsIENXX01JTl9JTl9CSVRTLTJ9OworVUNIQVIgZGVmYXVsdF9zdGFfYWlmc25bXT17Myw3LDIsMn07CisKK1VDSEFSIE1hcFVzZXJQcmlvcml0eVRvQWNjZXNzQ2F0ZWdvcnlbOF0gPSB7UUlEX0FDX0JFLCBRSURfQUNfQkssIFFJRF9BQ19CSywgUUlEX0FDX0JFLCBRSURfQUNfVkksIFFJRF9BQ19WSSwgUUlEX0FDX1ZPLCBRSURfQUNfVk99OworCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlBUEkgZm9yIE1MTUUgdG8gdHJhbnNtaXQgbWFuYWdlbWVudCBmcmFtZSB0byBBUCAoQlNTIE1vZGUpCisJb3Igc3RhdGlvbiAoSUJTUyBNb2RlKQorCisJQXJndW1lbnRzOgorCQlwQWQgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwRGF0YQkJUG9pbnRlciB0byB0aGUgb3V0Z29pbmcgODAyLjExIGZyYW1lCisJCUxlbmd0aAkJU2l6ZSBvZiBvdXRnb2luZyBtYW5hZ2VtZW50IGZyYW1lCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX0ZBSUxVUkUKKwkJTkRJU19TVEFUVVNfUEVORElORworCQlORElTX1NUQVRVU19TVUNDRVNTCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTIE1pbmlwb3J0TU1SZXF1ZXN0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJUXVlSWR4LAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVJTlQJCQlMZW5ndGgpCit7CisJUE5ESVNfUEFDS0VUCXBQYWNrZXQ7CisJTkRJU19TVEFUVVMgIAlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCVVMT05HCSAJCUZyZWVOdW07CisjaWZkZWYgUlQyODYwCisJdW5zaWduZWQgbG9uZwlJcnFGbGFncyA9IDA7CisjZW5kaWYgLy8gUlQyODYwIC8vCisJVUNIQVIJCQlJcnFTdGF0ZTsKKwlVQ0hBUgkJCXJ0bXBId0hkcltUWElORk9fU0laRSArIFRYV0lfU0laRV07IC8vUlRNUF9IV19IRFJfTEVOXTsKKworCUFTU0VSVChMZW5ndGggPD0gTUdNVF9ETUFfQlVGRkVSX1NJWkUpOworCisJUXVlSWR4PTM7CisKKwkvLyAyODYwQyB1c2UgVHggUmluZworCisJSXJxU3RhdGUgPSBwQWQtPmlycV9kaXNhYmxlZDsKKyNpZmRlZiBSVDI4NjAKKwlpZiAoKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKSAmJiAoIUlycVN0YXRlKSkKKwkJUlRNUF9JUlFfTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworI2VuZGlmIC8vIFJUMjg2MCAvLworCisJZG8KKwl7CisJCS8vIFJlc2V0IGlzIGluIHByb2dyZXNzLCBzdG9wIGltbWVkaWF0ZWx5CisJCWlmICggUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSB8fAorCQkJIFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKXx8CisJCQkgIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkpCisJCXsKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJCQlicmVhazsKKwkJfQorCisJCS8vIENoZWNrIEZyZWUgcHJpb3JpdHkgcXVldWUKKwkJLy8gU2luY2Ugd2UgdXNlIFBCRiBRdWV1ZTIgZm9yIG1hbmFnZW1lbnQgZnJhbWUuICBJdHMgY29ycmVzcG9uZGluZyBETUEgcmluZyBzaG91bGQgYmUgdXNpbmcgVHhSaW5nLgorCisJCS8vIDI4NjBDIHVzZSBUeCBSaW5nCisJCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKKwkJeworCQkJRnJlZU51bSA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCUZyZWVOdW0gPSBHRVRfTUdNVFJJTkdfRlJFRU5PKHBBZCk7CisJCX0KKworCQlpZiAoKEZyZWVOdW0gPiAwKSkKKwkJeworCQkJLy8gV2UgbmVlZCB0byByZXNlcnZlIHNwYWNlIGZvciBydG1wIGhhcmR3YXJlIGhlYWRlci4gaS5lLiwgVHhXSSBmb3IgUlQyODYwIGFuZCBUeEluZm8rVHhXSSBmb3IgUlQyODcwCisJCQlOZGlzWmVyb01lbW9yeSgmcnRtcEh3SGRyLCAoVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUpKTsKKwkJCVN0YXR1cyA9IFJUTVBBbGxvY2F0ZU5kaXNQYWNrZXQocEFkLCAmcFBhY2tldCwgKFBVQ0hBUikmcnRtcEh3SGRyLCAoVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUpLCBwRGF0YSwgTGVuZ3RoKTsKKwkJCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIk1pbmlwb3J0TU1SZXF1ZXN0IChlcnJvcjo6IGNhbid0IGFsbG9jYXRlIE5ESVMgUEFDS0VUKVxuIikpOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvL3BBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCQkvL3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV8yOworCisKKwkJCVN0YXR1cyA9IE1sbWVIYXJkVHJhbnNtaXQocEFkLCBRdWVJZHgsIHBQYWNrZXQpOworCQkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCVJUTVBGcmVlTmRpc1BhY2tldChwQWQsIHBQYWNrZXQpOworCQl9CisJCWVsc2UKKwkJeworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5NZ210UmluZ0Z1bGxDb3VudCsrOworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUWlkeCglZCksIG5vdCBlbm91Z2ggc3BhY2UgaW4gTWdtdFJpbmcsIE1nbXRSaW5nRnVsbENvdW50PSVsZCFcbiIsCisJCQkJCQkJCQkJUXVlSWR4LCBwQWQtPlJhbGlua0NvdW50ZXJzLk1nbXRSaW5nRnVsbENvdW50KSk7CisJCX0KKworCX0gd2hpbGUgKEZBTFNFKTsKKworI2lmZGVmIFJUMjg2MAorCS8vIDI4NjBDIHVzZSBUeCBSaW5nCisJaWYgKChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkgJiYgKCFJcnFTdGF0ZSkpCisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworI2VuZGlmIC8vIFJUMjg2MCAvLworCisJcmV0dXJuIFN0YXR1czsKK30KKworCisjaWZkZWYgUlQyODYwCitORElTX1NUQVRVUyBNaW5pcG9ydE1NUmVxdWVzdFVubG9jaygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCVF1ZUlkeCwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVSU5UCQkJTGVuZ3RoKQoreworCVBORElTX1BBQ0tFVAlwUGFja2V0OworCU5ESVNfU1RBVFVTICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCVVMT05HCSBGcmVlTnVtOworCVRYV0lfU1RSVUMJCVRYV0k7CisJVUxPTkcJU1dfVFhfSURYOworCVBUWERfU1RSVUMJCXBUeEQ7CisKKwlRdWVJZHggPSAzOworCUFTU0VSVChMZW5ndGggPD0gTUdNVF9ETUFfQlVGRkVSX1NJWkUpOworCisJZG8KKwl7CisJCS8vIFJlc2V0IGlzIGluIHByb2dyZXNzLCBzdG9wIGltbWVkaWF0ZWx5CisJCWlmICggUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSB8fAorCQkJIFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKXx8CisJCQkgIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkpCisJCXsKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJCQlicmVhazsKKwkJfQorCisJCS8vIENoZWNrIEZyZWUgcHJpb3JpdHkgcXVldWUKKwkJLy8gU2luY2Ugd2UgdXNlIFBCRiBRdWV1ZTIgZm9yIG1hbmFnZW1lbnQgZnJhbWUuICBJdHMgY29ycmVzcG9uZGluZyBETUEgcmluZyBzaG91bGQgYmUgdXNpbmcgVHhSaW5nLgorCQkvLyAyODYwQyB1c2UgVHggUmluZworCQlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCisJCXsKKwkJCUZyZWVOdW0gPSBHRVRfVFhSSU5HX0ZSRUVOTyhwQWQsIFF1ZUlkeCk7CisJCQlTV19UWF9JRFggPSBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4OworCQkJcFR4RCAgPSAoUFRYRF9TVFJVQykgcEFkLT5UeFJpbmdbUXVlSWR4XS5DZWxsW1NXX1RYX0lEWF0uQWxsb2NWYTsKKwkJfQorCQllbHNlCisJCXsKKwkJCUZyZWVOdW0gPSBHRVRfTUdNVFJJTkdfRlJFRU5PKHBBZCk7CisJCQlTV19UWF9JRFggPSBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4OworCQkJcFR4RCAgPSAoUFRYRF9TVFJVQykgcEFkLT5NZ210UmluZy5DZWxsW1NXX1RYX0lEWF0uQWxsb2NWYTsKKwkJfQorCQlpZiAoKEZyZWVOdW0gPiAwKSkKKwkJeworCQkJTmRpc1plcm9NZW1vcnkoJlRYV0ksIFRYV0lfU0laRSk7CisJCQlTdGF0dXMgPSBSVE1QQWxsb2NhdGVOZGlzUGFja2V0KHBBZCwgJnBQYWNrZXQsIChQVUNIQVIpJlRYV0ksIFRYV0lfU0laRSwgcERhdGEsIExlbmd0aCk7CisJCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJNaW5pcG9ydE1NUmVxdWVzdCAoZXJyb3I6OiBjYW4ndCBhbGxvY2F0ZSBORElTIFBBQ0tFVClcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJU3RhdHVzID0gTWxtZUhhcmRUcmFuc21pdChwQWQsIFF1ZUlkeCwgcFBhY2tldCk7CisJCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkJUlRNUEZyZWVOZGlzUGFja2V0KHBBZCwgcFBhY2tldCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLk1nbXRSaW5nRnVsbENvdW50Kys7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJRaWR4KCVkKSwgbm90IGVub3VnaCBzcGFjZSBpbiBNZ210UmluZ1xuIiwgUXVlSWR4KSk7CisJCX0KKworCX0gd2hpbGUgKEZBTFNFKTsKKworCisJcmV0dXJuIFN0YXR1czsKK30KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ29weSBmcmFtZSBmcm9tIHdhaXRpbmcgcXVldWUgaW50byByZWxhdGl2ZSByaW5nIGJ1ZmZlciBhbmQgc2V0CisJYXBwcm9wcmlhdGUgQVNJQyByZWdpc3RlciB0byBraWNrIGhhcmR3YXJlIHRyYW5zbWl0IGZ1bmN0aW9uCisKKwlBcmd1bWVudHM6CisJCXBBZCBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBCdWZmZXIgCVBvaW50ZXIgdG8JbWVtb3J5IG9mIG91dGdvaW5nIGZyYW1lCisJCUxlbmd0aAkJU2l6ZSBvZiBvdXRnb2luZyBtYW5hZ2VtZW50IGZyYW1lCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX0ZBSUxVUkUKKwkJTkRJU19TVEFUVVNfUEVORElORworCQlORElTX1NUQVRVU19TVUNDRVNTCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTIE1sbWVIYXJkVHJhbnNtaXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlRdWVJZHgsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCit7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSAhPSBSRF9OT1JNQUxfTU9ERSkKKwl7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworI2lmZGVmIFJUMjg2MAorCWlmICggcEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDAgKQorCQlyZXR1cm4gTWxtZUhhcmRUcmFuc21pdFR4UmluZyhwQWQsUXVlSWR4LHBQYWNrZXQpOworCWVsc2UKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwkJcmV0dXJuIE1sbWVIYXJkVHJhbnNtaXRNZ210UmluZyhwQWQsUXVlSWR4LHBQYWNrZXQpOworCit9CisKKworI2lmZGVmIFJUMjg2MAorTkRJU19TVEFUVVMgTWxtZUhhcmRUcmFuc21pdFR4UmluZygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUglRdWVJZHgsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCit7CisJUEFDS0VUX0lORk8gCVBhY2tldEluZm87CisJUFVDSEFSCQkJcFNyY0J1ZlZBOworCVVJTlQJCQlTcmNCdWZMZW47CisJUFRYRF9TVFJVQwkJcFR4RDsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgUFRYRF9TVFJVQyAgICAgIHBEZXN0VHhEOworICAgIFRYRF9TVFJVQyAgICAgICBUeEQ7CisjZW5kaWYKKwlQSEVBREVSXzgwMl8xMQlwSGVhZGVyXzgwMl8xMTsKKwlCT09MRUFOIAkJYkFja1JlcXVpcmVkLCBiSW5zZXJ0VGltZXN0YW1wOworCVVMT05HCQkJU3JjQnVmUEE7CisJVUNIQVIJCQlNbG1lUmF0ZTsKKwlVTE9ORwkJCVN3SWR4ID0gcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeDsKKwlQVFhXSV9TVFJVQyAJcEZpcnN0VHhXSTsKKwlVTE9ORwkgRnJlZU51bTsKKwlNQUNfVEFCTEVfRU5UUlkJKnBNYWNFbnRyeSA9IE5VTEw7CisKKworCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBQYWNrZXQsICZQYWNrZXRJbmZvLCAmcFNyY0J1ZlZBLCAmU3JjQnVmTGVuKTsKKworCWlmIChwU3JjQnVmVkEgPT0gTlVMTCkKKwl7CisJCS8vIFRoZSBidWZmZXIgc2hvdWxkbid0IGJlIE5VTEwKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJLy8gTWFrZSBzdXJlIE1HTVQgcmluZyByZXNvdXJjZSB3b24ndCBiZSB1c2VkIGJ5IG90aGVyIHRocmVhZHMKKwkvL05kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+VHhSaW5nTG9jayk7CisKKwlGcmVlTnVtID0gR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOworCisJaWYgKEZyZWVOdW0gPT0gMCkKKwl7CisJCS8vTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5UeFJpbmdMb2NrKTsKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJU3dJZHggPSBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4OworCisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKwlwVHhEICA9IChQVFhEX1NUUlVDKSBwQWQtPlR4UmluZ1tRdWVJZHhdLkNlbGxbU3dJZHhdLkFsbG9jVmE7CisjZWxzZQorICAgIHBEZXN0VHhEICA9IChQVFhEX1NUUlVDKXBBZC0+VHhSaW5nW1F1ZUlkeF0uQ2VsbFtTd0lkeF0uQWxsb2NWYTsKKyAgICBUeEQgPSAqcERlc3RUeEQ7CisgICAgcFR4RCA9ICZUeEQ7CisgICAgUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisjZW5kaWYKKworCWlmIChwQWQtPlR4UmluZ1tRdWVJZHhdLkNlbGxbU3dJZHhdLnBOZGlzUGFja2V0KQorCXsKKwkJcHJpbnRrKCJNbG1lSGFyZFRyYW5zbWl0IEVycm9yXG4iKTsKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJLy8gb3V0Z29pbmcgZnJhbWUgYWx3YXlzIHdha2V1cCBQSFkgdG8gcHJldmVudCBmcmFtZSBsb3N0CisJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQorCQkJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgVFJVRSk7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCXBGaXJzdFR4V0kJPShQVFhXSV9TVFJVQylwU3JjQnVmVkE7CisKKwlwSGVhZGVyXzgwMl8xMSA9IChQSEVBREVSXzgwMl8xMSkgKHBTcmNCdWZWQSArIFRYV0lfU0laRSk7CisJaWYgKHBIZWFkZXJfODAyXzExLT5BZGRyMVswXSAmIDB4MDEpCisJeworCQlNbG1lUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLkJhc2ljTWxtZVJhdGU7CisJfQorCWVsc2UKKwl7CisJCU1sbWVSYXRlID0gcEFkLT5Db21tb25DZmcuTWxtZVJhdGU7CisJfQorCisJaWYgKChwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSA9PSBCVFlQRV9EQVRBKSAmJgorCQkocEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPT0gU1VCVFlQRV9RT1NfTlVMTCkpCisJeworCQlwTWFjRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIHBIZWFkZXJfODAyXzExLT5BZGRyMSk7CisJfQorCisJLy8gVmVyaWZ5IE1sbWUgcmF0ZSBmb3IgYSAvIGcgYmFuZHMuCisJaWYgKChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkgJiYgKE1sbWVSYXRlIDwgUkFURV82KSkgLy8gMTFBIGJhbmQKKwkJTWxtZVJhdGUgPSBSQVRFXzY7CisKKwkvLworCS8vIFNob3VsZCBub3QgYmUgaGFyZCBjb2RlIHRvIHNldCBQd3JNZ210IHRvIDAgKFBXUl9BQ1RJVkUpCisJLy8gU25pY2UgaXQncyBiZWVuIHNldCB0byAwIHdoaWxlIG9uIE1ndE1hY0hlYWRlckluaXQKKwkvLyBCeSB0aGUgd2F5IHRoaXMgd2lsbCBjYXVzZSBmcmFtZSB0byBiZSBzZW5kIG9uIFBXUl9TQVZFIGZhaWxlZC4KKwkvLworCS8vCisJLy8gSW4gV01NLVVBUFNELCBtbG1lIGZyYW1lIHNob3VsZCBiZSBzZXQgcHNtIGFzIHBvd2VyIHNhdmluZyBidXQgcHJvYmUgcmVxdWVzdCBmcmFtZQorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorICAgIC8vIERhdGEtTnVsbCBwYWNrZXRzIGFsc2UgcGFzcyB0aHJvdWdoIE1NUmVxdWVzdCBpbiBSVDI4NjAsIGhvd2V2ZXIsIHdlIGhvcGUgY29udHJvbCB0aGUgcHNtIGJpdCB0byBwYXNzIEFQU0QKKwlpZiAocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgIT0gQlRZUEVfREFUQSkKKyAgICB7CisgICAgCWlmICgocEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPT0gU1VCVFlQRV9QUk9CRV9SRVEpIHx8ICEocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlKSkKKyAgICAJeworICAgIAkJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSBQV1JfQUNUSVZFOworICAgIAl9CisgICAgCWVsc2UKKyAgICAJeworICAgIAkJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlOworICAgIAl9CisgICAgfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJYkluc2VydFRpbWVzdGFtcCA9IEZBTFNFOworCWlmIChwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSA9PSBCVFlQRV9DTlRMKSAvLyBtdXN0IGJlIFBTLVBPTEwKKwl7CisJCWJBY2tSZXF1aXJlZCA9IEZBTFNFOworCX0KKwllbHNlIC8vIEJUWVBFX01HTVQgb3IgQlRZUEVfREFUQShtdXN0IGJlIE5VTEwgZnJhbWUpCisJeworCQlpZiAocEhlYWRlcl84MDJfMTEtPkFkZHIxWzBdICYgMHgwMSkgLy8gTVVMVElDQVNULCBCUk9BRENBU1QKKwkJeworCQkJYkFja1JlcXVpcmVkID0gRkFMU0U7CisJCQlwSGVhZGVyXzgwMl8xMS0+RHVyYXRpb24gPSAwOworCQl9CisJCWVsc2UKKwkJeworCQkJYkFja1JlcXVpcmVkID0gVFJVRTsKKwkJCXBIZWFkZXJfODAyXzExLT5EdXJhdGlvbiA9IFJUTVBDYWxjRHVyYXRpb24ocEFkLCBNbG1lUmF0ZSwgMTQpOworCQkJaWYgKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUFJPQkVfUlNQKQorCQkJeworCQkJCWJJbnNlcnRUaW1lc3RhbXAgPSBUUlVFOworCQkJfQorCQl9CisJfQorCXBIZWFkZXJfODAyXzExLT5TZXF1ZW5jZSA9IHBBZC0+U2VxdWVuY2UrKzsKKwlpZiAocEFkLT5TZXF1ZW5jZSA+IDB4ZmZmKQorCQlwQWQtPlNlcXVlbmNlID0gMDsKKwkvLyBCZWZvcmUgcmFkYXIgZGV0ZWN0aW9uIGRvbmUsIG1nbXQgZnJhbWUgY2FuIG5vdCBiZSBzZW50IGJ1dCBwcm9iZSByZXEKKwkvLyBCZWNhdXNlIHdlIG5lZWQgdG8gdXNlIHByb2JlIHJlcSB0byB0cmlnZ2VyIGRyaXZlciB0byBzZW5kIHByb2JlIHJlcSBpbiBwYXNzaXZlIHNjYW4KKwlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlICE9IFNVQlRZUEVfUFJPQkVfUkVRKQorCQkmJiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkKKwkJJiYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSAhPSBSRF9OT1JNQUxfTU9ERSkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIk1sbWVIYXJkVHJhbnNtaXQgLS0+IHJhZGFyIGRldGVjdCBub3QgaW4gbm9ybWFsIG1vZGUgISEhXG4iKSk7CisJCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJfQorCisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIChQVUNIQVIpcEhlYWRlcl84MDJfMTEsIERJUl9XUklURSwgRkFMU0UpOworI2VuZGlmCisJLy8KKwkvLyBmaWxsIHNjYXR0ZXItYW5kLWdhdGhlciBidWZmZXIgbGlzdCBpbnRvIFRYRC4gSW50ZXJuYWxseSBjcmVhdGVkIE5ESVMgUEFDS0VUCisJLy8gc2hvdWxkIGFsd2F5cyBoYXMgb25seSBvbmUgb2h5c2ljYWwgYnVmZmVyLCBhbmQgdGhlIHdob2xlIGZyYW1lIHNpemUgZXF1YWxzCisJLy8gdG8gdGhlIGZpcnN0IHNjYXR0ZXIgYnVmZmVyIHNpemUKKwkvLworCisJLy8gSW5pdGlhbGl6ZSBUWCBEZXNjcmlwdG9yCisJLy8gRm9yIGludGVyLWZyYW1lIGdhcCwgdGhlIG51bWJlciBpcyBmb3IgdGhpcyBmcmFtZSBhbmQgbmV4dCBmcmFtZQorCS8vIEZvciBNTE1FIHJhdGUsIHdlIHdpbGwgZml4IGFzIDJNYiB0byBtYXRjaCBvdGhlciB2ZW5kb3IncyBpbXBsZW1lbnQKKworLy8gbWFuYWdlbWVudCBmcmFtZSBkb2Vzbid0IG5lZWQgZW5jcnlwdGlvbi4gc28gdXNlIFJFU0VSVkVEX1dDSUQgbm8gbWF0dGVyIHUgYXJlIHNlbmRpbmcgdG8gc3BlY2lmaWMgd2NpZCBvciBub3QuCisJLy8gT25seSBiZWFjb24gdXNlIE5zZXE9VFJVRS4gU28gaGVyZSB3ZSB1c2UgTnNlcT1GQUxTRS4KKwlpZiAocE1hY0VudHJ5ID09IE5VTEwpCisJeworCQlSVE1QV3JpdGVUeFdJKHBBZCwgcEZpcnN0VHhXSSwgRkFMU0UsIEZBTFNFLCBiSW5zZXJ0VGltZXN0YW1wLCBGQUxTRSwgYkFja1JlcXVpcmVkLCBGQUxTRSwKKwkJMCwgUkVTRVJWRURfV0NJRCwgKFNyY0J1ZkxlbiAtIFRYV0lfU0laRSksIFBJRF9NR01ULCAwLCAgKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MsIElGU19CQUNLT0ZGLCBGQUxTRSwgJnBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdCk7CisJfQorCWVsc2UKKwl7CisJCVJUTVBXcml0ZVR4V0kocEFkLCBwRmlyc3RUeFdJLCBGQUxTRSwgRkFMU0UsCisJCQkJCWJJbnNlcnRUaW1lc3RhbXAsIEZBTFNFLCBiQWNrUmVxdWlyZWQsIEZBTFNFLAorCQkJCQkwLCBwTWFjRW50cnktPkFpZCwgKFNyY0J1ZkxlbiAtIFRYV0lfU0laRSksCisJCQkJCXBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUywgMCwKKwkJCQkJKFVDSEFSKXBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUywKKwkJCQkJSUZTX0JBQ0tPRkYsIEZBTFNFLCAmcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUpOworCX0KKworCXBBZC0+VHhSaW5nW1F1ZUlkeF0uQ2VsbFtTd0lkeF0ucE5kaXNQYWNrZXQgPSBwUGFja2V0OworCXBBZC0+VHhSaW5nW1F1ZUlkeF0uQ2VsbFtTd0lkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUFdJRW5kaWFuQ2hhbmdlKChQVUNIQVIpcEZpcnN0VHhXSSwgVFlQRV9UWFdJKTsKKyNlbmRpZgorCVNyY0J1ZlBBID0gUENJX01BUF9TSU5HTEUocEFkLCBwU3JjQnVmVkEsIFNyY0J1ZkxlbiwgMCwgUENJX0RNQV9UT0RFVklDRSk7CisKKworCVJUTVBXcml0ZVR4RGVzY3JpcHRvcihwQWQsIHBUeEQsIFRSVUUsIEZJRk9fRURDQSk7CisJcFR4RC0+TGFzdFNlYzAgPSAxOworCXBUeEQtPkxhc3RTZWMxID0gMTsKKwlwVHhELT5TRExlbjAgPSBTcmNCdWZMZW47CisJcFR4RC0+U0RMZW4xID0gMDsKKwlwVHhELT5TRFB0cjAgPSBTcmNCdWZQQTsKKwlwVHhELT5ETUFET05FID0gMDsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKKyAgICBXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoKFBVQ0hBUilwRGVzdFR4RCwgKFBVQ0hBUilwVHhELCBGQUxTRSwgVFlQRV9UWEQpOworI2VuZGlmCisKKwlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeERvbmVDb3VudCsrOworCisgICAJLy8gSW5jcmVhc2UgVFhfQ1RYX0lEWCwgYnV0IHdyaXRlIHRvIHJlZ2lzdGVyIGxhdGVyLgorCUlOQ19SSU5HX0lOREVYKHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhDcHVJZHgsIFRYX1JJTkdfU0laRSk7CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DVFhfSURYMCArIFF1ZUlkeCoweDEwLCAgcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeCk7CisKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCitORElTX1NUQVRVUyBNbG1lSGFyZFRyYW5zbWl0TWdtdFJpbmcoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJUXVlSWR4LAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQoreworCVBBQ0tFVF9JTkZPIAlQYWNrZXRJbmZvOworCVBVQ0hBUgkJCXBTcmNCdWZWQTsKKwlVSU5UCQkJU3JjQnVmTGVuOworCVBIRUFERVJfODAyXzExCXBIZWFkZXJfODAyXzExOworCUJPT0xFQU4gCQliQWNrUmVxdWlyZWQsIGJJbnNlcnRUaW1lc3RhbXA7CisJVUNIQVIJCQlNbG1lUmF0ZTsKKwlQVFhXSV9TVFJVQyAJcEZpcnN0VHhXSTsKKwlNQUNfVEFCTEVfRU5UUlkJKnBNYWNFbnRyeSA9IE5VTEw7CisKKwlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwUGFja2V0LCAmUGFja2V0SW5mbywgJnBTcmNCdWZWQSwgJlNyY0J1Zkxlbik7CisJCVJUTVBfU0VNX0xPQ0soJnBBZC0+TWdtdFJpbmdMb2NrKTsKKworCisJaWYgKHBTcmNCdWZWQSA9PSBOVUxMKQorCXsKKwkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPk1nbXRSaW5nTG9jayk7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQkvLyBvdXRnb2luZyBmcmFtZSBhbHdheXMgd2FrZXVwIFBIWSB0byBwcmV2ZW50IGZyYW1lIGxvc3QKKwkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCisJCQlBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlwRmlyc3RUeFdJID0gKFBUWFdJX1NUUlVDKShwU3JjQnVmVkEgKyAgVFhJTkZPX1NJWkUpOworCXBIZWFkZXJfODAyXzExID0gKFBIRUFERVJfODAyXzExKSAocFNyY0J1ZlZBICsgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUpOyAvL1RYV0lfU0laRSk7CisKKwlpZiAocEhlYWRlcl84MDJfMTEtPkFkZHIxWzBdICYgMHgwMSkKKwl7CisJCU1sbWVSYXRlID0gcEFkLT5Db21tb25DZmcuQmFzaWNNbG1lUmF0ZTsKKwl9CisJZWxzZQorCXsKKwkJTWxtZVJhdGUgPSBwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZTsKKwl9CisKKwkvLyBWZXJpZnkgTWxtZSByYXRlIGZvciBhIC8gZyBiYW5kcy4KKwlpZiAoKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA+IDE0KSAmJiAoTWxtZVJhdGUgPCBSQVRFXzYpKSAvLyAxMUEgYmFuZAorCQlNbG1lUmF0ZSA9IFJBVEVfNjsKKworCWlmICgocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgPT0gQlRZUEVfREFUQSkgJiYKKwkJKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUU9TX05VTEwpKQorCXsKKwkJcE1hY0VudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwSGVhZGVyXzgwMl8xMS0+QWRkcjEpOworCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQkvLyBGaXhlZCBXNTIgd2l0aCBBY3Rpdml0eSBzY2FuIGlzc3VlIGluIEFCR19NSVhFRCBhbmQgQUJHTl9NSVhFRCBtb2RlLgorCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdfTUlYRUQKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCXx8IHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHTl9NSVhFRAorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkpCisJCXsKKwkJCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkKKwkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IDE7CisJCQllbHNlCisJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSAwOworCQl9CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8KKwkvLyBTaG91bGQgbm90IGJlIGhhcmQgY29kZSB0byBzZXQgUHdyTWdtdCB0byAwIChQV1JfQUNUSVZFKQorCS8vIFNuaWNlIGl0J3MgYmVlbiBzZXQgdG8gMCB3aGlsZSBvbiBNZ3RNYWNIZWFkZXJJbml0CisJLy8gQnkgdGhlIHdheSB0aGlzIHdpbGwgY2F1c2UgZnJhbWUgdG8gYmUgc2VuZCBvbiBQV1JfU0FWRSBmYWlsZWQuCisJLy8KKwkvLyBwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IDA7IC8vIChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpOworCS8vCisJLy8gSW4gV01NLVVBUFNELCBtbG1lIGZyYW1lIHNob3VsZCBiZSBzZXQgcHNtIGFzIHBvd2VyIHNhdmluZyBidXQgcHJvYmUgcmVxdWVzdCBmcmFtZQorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorICAgIC8vIERhdGEtTnVsbCBwYWNrZXRzIGFsc2UgcGFzcyB0aHJvdWdoIE1NUmVxdWVzdCBpbiBSVDI4NjAsIGhvd2V2ZXIsIHdlIGhvcGUgY29udHJvbCB0aGUgcHNtIGJpdCB0byBwYXNzIEFQU0QKKwlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlICE9IEJUWVBFX0RBVEEpICYmIChwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSAhPSBCVFlQRV9DTlRMKSkKKwl7CisJCWlmICgocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKSAmJgorCQkJKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfQUNUSU9OKSkKKwkJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7CisJCWVsc2UKKwkJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX0FDVElWRTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwliSW5zZXJ0VGltZXN0YW1wID0gRkFMU0U7CisJaWYgKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlID09IEJUWVBFX0NOVEwpIC8vIG11c3QgYmUgUFMtUE9MTAorCXsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJLy9TZXQgUE0gYml0IGluIHBzLXBvbGwsIHRvIGZpeCBXTEsgMS4yICBQb3dlclNhdmVNb2RlX2V4dCBmYWlsdXJlIGlzc3VlLgorCQlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmIChwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX1BTX1BPTEwpKQorCQl7CisJCQlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IFBXUl9TQVZFOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCWJBY2tSZXF1aXJlZCA9IEZBTFNFOworCX0KKwllbHNlIC8vIEJUWVBFX01HTVQgb3IgQlRZUEVfREFUQShtdXN0IGJlIE5VTEwgZnJhbWUpCisJeworCQlpZiAocEhlYWRlcl84MDJfMTEtPkFkZHIxWzBdICYgMHgwMSkgLy8gTVVMVElDQVNULCBCUk9BRENBU1QKKwkJeworCQkJYkFja1JlcXVpcmVkID0gRkFMU0U7CisJCQlwSGVhZGVyXzgwMl8xMS0+RHVyYXRpb24gPSAwOworCQl9CisJCWVsc2UKKwkJeworCQkJYkFja1JlcXVpcmVkID0gVFJVRTsKKwkJCXBIZWFkZXJfODAyXzExLT5EdXJhdGlvbiA9IFJUTVBDYWxjRHVyYXRpb24ocEFkLCBNbG1lUmF0ZSwgMTQpOworCQkJaWYgKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUFJPQkVfUlNQKQorCQkJeworCQkJCWJJbnNlcnRUaW1lc3RhbXAgPSBUUlVFOworCQkJfQorCQl9CisJfQorCisJcEhlYWRlcl84MDJfMTEtPlNlcXVlbmNlID0gcEFkLT5TZXF1ZW5jZSsrOworCWlmIChwQWQtPlNlcXVlbmNlID4weGZmZikKKwkJcEFkLT5TZXF1ZW5jZSA9IDA7CisKKwkvLyBCZWZvcmUgcmFkYXIgZGV0ZWN0aW9uIGRvbmUsIG1nbXQgZnJhbWUgY2FuIG5vdCBiZSBzZW50IGJ1dCBwcm9iZSByZXEKKwkvLyBCZWNhdXNlIHdlIG5lZWQgdG8gdXNlIHByb2JlIHJlcSB0byB0cmlnZ2VyIGRyaXZlciB0byBzZW5kIHByb2JlIHJlcSBpbiBwYXNzaXZlIHNjYW4KKwlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlICE9IFNVQlRZUEVfUFJPQkVfUkVRKQorCQkmJiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkKKwkJJiYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSAhPSBSRF9OT1JNQUxfTU9ERSkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIk1sbWVIYXJkVHJhbnNtaXQgLS0+IHJhZGFyIGRldGVjdCBub3QgaW4gbm9ybWFsIG1vZGUgISEhXG4iKSk7CisJCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5NZ210UmluZ0xvY2spOworCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKXBIZWFkZXJfODAyXzExLCBESVJfV1JJVEUsIEZBTFNFKTsKKyNlbmRpZgorCisJLy8KKwkvLyBmaWxsIHNjYXR0ZXItYW5kLWdhdGhlciBidWZmZXIgbGlzdCBpbnRvIFRYRC4gSW50ZXJuYWxseSBjcmVhdGVkIE5ESVMgUEFDS0VUCisJLy8gc2hvdWxkIGFsd2F5cyBoYXMgb25seSBvbmUgb2h5c2ljYWwgYnVmZmVyLCBhbmQgdGhlIHdob2xlIGZyYW1lIHNpemUgZXF1YWxzCisJLy8gdG8gdGhlIGZpcnN0IHNjYXR0ZXIgYnVmZmVyIHNpemUKKwkvLworCisJLy8gSW5pdGlhbGl6ZSBUWCBEZXNjcmlwdG9yCisJLy8gRm9yIGludGVyLWZyYW1lIGdhcCwgdGhlIG51bWJlciBpcyBmb3IgdGhpcyBmcmFtZSBhbmQgbmV4dCBmcmFtZQorCS8vIEZvciBNTE1FIHJhdGUsIHdlIHdpbGwgZml4IGFzIDJNYiB0byBtYXRjaCBvdGhlciB2ZW5kb3IncyBpbXBsZW1lbnQKKworLy8gbWFuYWdlbWVudCBmcmFtZSBkb2Vzbid0IG5lZWQgZW5jcnlwdGlvbi4gc28gdXNlIFJFU0VSVkVEX1dDSUQgbm8gbWF0dGVyIHUgYXJlIHNlbmRpbmcgdG8gc3BlY2lmaWMgd2NpZCBvciBub3QuCisJaWYgKHBNYWNFbnRyeSA9PSBOVUxMKQorCXsKKwkJUlRNUFdyaXRlVHhXSShwQWQsIHBGaXJzdFR4V0ksIEZBTFNFLCBGQUxTRSwgYkluc2VydFRpbWVzdGFtcCwgRkFMU0UsIGJBY2tSZXF1aXJlZCwgRkFMU0UsCisJCTAsIFJFU0VSVkVEX1dDSUQsIChTcmNCdWZMZW4gLSBUWElORk9fU0laRSAtIFRYV0lfU0laRSksIFBJRF9NR01ULCAwLCAgKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MsIElGU19CQUNLT0ZGLCBGQUxTRSwgJnBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdCk7CisJfQorCWVsc2UKKwl7CisJCVJUTVBXcml0ZVR4V0kocEFkLCBwRmlyc3RUeFdJLCBGQUxTRSwgRkFMU0UsCisJCQkJCWJJbnNlcnRUaW1lc3RhbXAsIEZBTFNFLCBiQWNrUmVxdWlyZWQsIEZBTFNFLAorCQkJCQkwLCBwTWFjRW50cnktPkFpZCwgKFNyY0J1ZkxlbiAtIFRYSU5GT19TSVpFIC0gVFhXSV9TSVpFKSwKKwkJCQkJcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTLCAwLAorCQkJCQkoVUNIQVIpcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTLAorCQkJCQlJRlNfQkFDS09GRiwgRkFMU0UsICZwTWFjRW50cnktPk1heEhUUGh5TW9kZSk7CisJfQorCisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBXSUVuZGlhbkNoYW5nZSgoUFVDSEFSKXBGaXJzdFR4V0ksIFRZUEVfVFhXSSk7CisjZW5kaWYKKworCS8vIE5vdyBkbyBoYXJkd2FyZS1kZXBlbmVkIGtpY2sgb3V0LgorCUhBTF9LaWNrT3V0TWdtdFR4KHBBZCwgUXVlSWR4LCBwUGFja2V0LCBwU3JjQnVmVkEsIFNyY0J1Zkxlbik7CisKKwkvLyBNYWtlIHN1cmUgdG8gcmVsZWFzZSBNR01UIHJpbmcgcmVzb3VyY2UKKwlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+TWdtdFJpbmdMb2NrKTsKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU5ldyBEZVF1ZXVlIFByb2NlZHVyZXMuCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBERVFVRVVFX0xPQ0sobG9jaywgYkludENvbnRleHQsIElycUZsYWdzKSAJCQkJXAorCQkJZG97CQkJCQkJCQkJCQkJCVwKKwkJCQlpZiAoYkludENvbnRleHQgPT0gRkFMU0UpCQkJCQkJXAorCQkJCVJUTVBfSVJRX0xPQ0soKGxvY2spLCBJcnFGbGFncyk7CQlcCisJCQl9d2hpbGUoMCkKKworI2RlZmluZSBERVFVRVVFX1VOTE9DSyhsb2NrLCBiSW50Q29udGV4dCwgSXJxRmxhZ3MpCQkJCVwKKwkJCWRvewkJCQkJCQkJCQkJCQlcCisJCQkJaWYgKGJJbnRDb250ZXh0ID09IEZBTFNFKQkJCQkJCVwKKwkJCQkJUlRNUF9JUlFfVU5MT0NLKChsb2NrKSwgSXJxRmxhZ3MpOwlcCisJCQl9d2hpbGUoMCkKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlUeCBQYXRoIGRlc2lnbiBhbGdvcml0aG06CisJCUJhc2ljYWxseSwgd2UgZGl2aWRlIHRoZSBwYWNrZXRzIGludG8gZm91ciB0eXBlcywgQnJvYWRjYXN0L011bHRpY2FzdCwgMTFOIFJhdGUoQU1QRFUsIEFNU0RVLCBOb3JtYWwpLCBCL0cgUmF0ZShBUkFMSU5LLCBOb3JtYWwpLAorCQlTcGVjaWZpYyBQYWNrZXQgVHlwZS4gRm9sbG93aW5nIHNob3cgdGhlIGNsYXNzaWZpY2F0aW9uIHJ1bGUgYW5kIHBvbGljeSBmb3IgZWFjaCBraW5kcyBvZiBwYWNrZXRzLgorCQkJCUNsYXNzaWZpY2F0aW9uIFJ1bGU9PgorCQkJCQlNdWx0aWNhc3Q6ICgqYWRkcjEgJiAweDAxKSA9PSAweDAxCisJCQkJCVNwZWNpZmljIDogYkRIQ1BGcmFtZSwgYkFSUEZyYW1lLCBiRUFQT0xGcmFtZSwgZXRjLgorCQkJCQkxMU4gUmF0ZSA6IElmIHBlZXIgc3VwcG9ydCBIVAorCQkJCQkJCQkoMSkuQU1QRFUgIC0tIElmIFRYQkEgaXMgbmVnb3RpYXRlZC4KKwkJCQkJCQkJKDIpLkFNU0RVICAtLSBJZiBBTVNEVSBpcyBjYXBhYmxlIGZvciBib3RoIHBlZXIgYW5kIG91cnNlbGYuCisJCQkJCQkJCQkJCSopLiBBTVNEVSBjYW4gZW1iZWRkZWQgaW4gYSBBTVBEVSwgYnV0IG5vdyB3ZSBkaWRuJ3Qgc3VwcG9ydCBpdC4KKwkJCQkJCQkJKDMpLk5vcm1hbCAtLSBPdGhlciBwYWNrZXRzIHdoaWNoIHNlbmQgYXMgMTFuIHJhdGUuCisKKwkJCQkJQi9HIFJhdGUgOiBJZiBwZWVyIGlzIGIvZyBvbmx5LgorCQkJCQkJCQkoMSkuQVJBTElOSy0tIElmIGJvdGggb2YgcGVlci91cyBzdXBwcm90IFJhbGluayBwcm9wcmlldGFyeSBBZ2dyZWdhdGlvbiBhbmQgdGhlIFR4UmF0ZSBpcyBsYXJnZSB0aGFuIFJBVEVfNgorCQkJCQkJCQkoMikuTm9ybWFsIC0tIE90aGVyIHBhY2tldHMgd2hpY2ggc2VuZCBhcyBiL2cgcmF0ZS4KKwkJCQkJRnJhZ21lbnQ6CisJCQkJCQkJCVRoZSBwYWNrZXQgbXVzdCBiZSB1bmljYXN0LCBOT1QgQS1SQUxJTkssIE5PVCBBLU1TRFUsIE5PVCAxMW4sIHRoZW4gY2FuIGNvbnNpZGVyIGFib3V0IGZyYWdtZW50LgorCisJCQkJQ2xhc3NpZmllZCBQYWNrZXQgSGFuZGxlIFJ1bGU9PgorCQkJCQlNdWx0aWNhc3Q6CisJCQkJCQkJCU5vIEFDSywgCQkvL3BUeEJsay0+YkFja1JlcXVpcmVkID0gRkFMU0U7CisJCQkJCQkJCU5vIFdNTSwgCQkvL3BUeEJsay0+YldNTSA9IEZBTFNFOworCQkJCQkJCQlObyBwaWdneWJhY2ssICAgLy9wVHhCbGstPmJQaWdneUJhY2sgPSBGQUxTRTsKKwkJCQkJCQkJRm9yY2UgTG93UmF0ZSwgIC8vcFR4QmxrLT5iRm9yY2VMb3dSYXRlID0gVFJVRTsKKwkJCQkJU3BlY2lmaWMgOglCYXNpY2FsbHksIGZvciBzcGVjaWZpYyBwYWNrZXQsIHdlIHNob3VsZCBoYW5kbGUgaXQgc3BlY2lmaWNhbGx5LCBidXQgbm93IGFsbCBzcGVjaWZpYyBwYWNrZXRzIGFyZSB1c2UKKwkJCQkJCQkJCXRoZSBzYW1lIHBvbGljeSB0byBoYW5kbGUgaXQuCisJCQkJCQkJCUZvcmNlIExvd1JhdGUsICAvL3BUeEJsay0+YkZvcmNlTG93UmF0ZSA9IFRSVUU7CisKKwkJCQkJMTFOIFJhdGUgOgorCQkJCQkJCQlObyBwaWdneWJhY2ssCS8vcFR4QmxrLT5iUGlnZ3lCYWNrID0gRkFMU0U7CisKKwkJCQkJCQkJKDEpLkFNU0RVCisJCQkJCQkJCQlwVHhCbGstPmJXTU0gPSBUUlVFOworCQkJCQkJCQkoMikuQU1QRFUKKwkJCQkJCQkJCXBUeEJsay0+YldNTSA9IFRSVUU7CisJCQkJCQkJCSgzKS5Ob3JtYWwKKworCQkJCQlCL0cgUmF0ZSA6CisJCQkJCQkJCSgxKS5BUkFMSU5LCisKKwkJCQkJCQkJKDIpLk5vcm1hbAorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBVQ0hBUiBUeFBrdENsYXNzaWZpY2F0aW9uKAorCUlOIFJUTVBfQURBUFRFUiAqcEFkLAorCUlOIFBORElTX1BBQ0tFVCAgcFBhY2tldCkKK3sKKwlVQ0hBUgkJCVR4RnJhbWVUeXBlID0gVFhfVU5LT1dOX0ZSQU1FOworCVVDSEFSCQkJV2NpZDsKKwlNQUNfVEFCTEVfRU5UUlkJKnBNYWNFbnRyeSA9IE5VTEw7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJQk9PTEVBTgkJCWJIVFJhdGUgPSBGQUxTRTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCVdjaWQgPSBSVE1QX0dFVF9QQUNLRVRfV0NJRChwUGFja2V0KTsKKwlpZiAoV2NpZCA9PSBNQ0FTVF9XQ0lEKQorCXsJLy8gSGFuZGxlIGZvciBSQSBpcyBCcm9hZGNhc3QvTXVsdGljYXN0IEFkZHJlc3MuCisJCXJldHVybiBUWF9NQ0FTVF9GUkFNRTsKKwl9CisKKwkvLyBIYW5kbGUgZm9yIHVuaWNhc3QgcGFja2V0cworCXBNYWNFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdOworCWlmIChSVE1QX0dFVF9QQUNLRVRfTE9XUkFURShwUGFja2V0KSkKKwl7CS8vIEl0J3MgYSBzcGVjaWZpYyBwYWNrZXQgbmVlZCB0byBmb3JjZSBsb3cgcmF0ZSwgaS5lLiwgYkRIQ1BGcmFtZSwgYkVBUE9MRnJhbWUsIGJXQUlGcmFtZQorCQlUeEZyYW1lVHlwZSA9IFRYX0xFR0FDWV9GUkFNRTsKKwl9CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJZWxzZSBpZiAoSVNfSFRfUkFURShwTWFjRW50cnkpKQorCXsJLy8gaXQncyBhIDExbiBjYXBhYmxlIHBhY2tldAorCisJCS8vIERlcGVuZHMgb24gSFRQaHlNb2RlIHRvIGNoZWNrIGlmIHRoZSBwZWVyIHN1cHBvcnQgdGhlIEhUUmF0ZSB0cmFuc21pc3Npb24uCisJCS8vIAlDdXJyZW50bHkgZGlkbid0IHN1cHBvcnQgQS1NU0RVIGVtYmVkZGVkIGluIEEtTVBEVQorCQliSFRSYXRlID0gVFJVRTsKKwkJaWYgKFJUTVBfR0VUX1BBQ0tFVF9NT1JFREFUQShwUGFja2V0KSB8fCAocE1hY0VudHJ5LT5Qc01vZGUgPT0gUFdSX1NBVkUpKQorCQkJVHhGcmFtZVR5cGUgPSBUWF9MRUdBQ1lfRlJBTUU7CisjaWZkZWYgVUFQU0RfQVBfU1VQUE9SVAorCQllbHNlIGlmIChSVE1QX0dFVF9QQUNLRVRfRU9TUChwUGFja2V0KSkKKwkJCVR4RnJhbWVUeXBlID0gVFhfTEVHQUNZX0ZSQU1FOworI2VuZGlmIC8vIFVBUFNEX0FQX1NVUFBPUlQgLy8KKwkJZWxzZSBpZigocE1hY0VudHJ5LT5UWEJBYml0bWFwICYgKDE8PChSVE1QX0dFVF9QQUNLRVRfVVAocFBhY2tldCkpKSkgIT0gMCkKKwkJCXJldHVybiBUWF9BTVBEVV9GUkFNRTsKKwkJZWxzZSBpZihDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX0FNU0RVX0lOVVNFRCkpCisJCQlyZXR1cm4gVFhfQU1TRFVfRlJBTUU7CisJCWVsc2UKKwkJCVR4RnJhbWVUeXBlID0gVFhfTEVHQUNZX0ZSQU1FOworCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwllbHNlCisJewkvLyBpdCdzIGEgbGVnYWN5IGIvZyBwYWNrZXQuCisJCWlmICgoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19BR0dSRUdBVElPTl9DQVBBQkxFKSAmJiBwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlKSAmJgorCQkJKFJUTVBfR0VUX1BBQ0tFVF9UWFJBVEUocFBhY2tldCkgPj0gUkFURV82KSAmJgorCQkJKCEoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKSkpKQorCQl7CS8vIGlmIHBlZXIgc3VwcG9ydCBSYWxpbmsgQWdncmVnYXRpb24sIHdlIHVzZSBpdC4KKwkJCVR4RnJhbWVUeXBlID0gVFhfUkFMSU5LX0ZSQU1FOworCQl9CisJCWVsc2UKKwkJeworCQkJVHhGcmFtZVR5cGUgPSBUWF9MRUdBQ1lfRlJBTUU7CisJCX0KKwl9CisKKwkvLyBDdXJyZW50bHksIG91ciBmcmFnbWVudCBvbmx5IHN1cHBvcnQgd2hlbiBhIHVuaWNhc3QgcGFja2V0IHNlbmQgYXMgTk9ULUFSQUxJTkssIE5PVC1BTVNEVSBhbmQgTk9ULUFNUERVLgorCWlmICgoUlRNUF9HRVRfUEFDS0VUX0ZSQUdNRU5UUyhwUGFja2V0KSA+IDEpICYmIChUeEZyYW1lVHlwZSA9PSBUWF9MRUdBQ1lfRlJBTUUpKQorCQlUeEZyYW1lVHlwZSA9IFRYX0ZSQUdfRlJBTUU7CisKKwlyZXR1cm4gVHhGcmFtZVR5cGU7Cit9CisKKworQk9PTEVBTiBSVE1QX0ZpbGxUeEJsa0luZm8oCisJSU4gUlRNUF9BREFQVEVSICpwQWQsCisJSU4gVFhfQkxLICpwVHhCbGspCit7CisJUEFDS0VUX0lORk8JCQlQYWNrZXRJbmZvOworCVBORElTX1BBQ0tFVAkJcFBhY2tldDsKKwlQTUFDX1RBQkxFX0VOVFJZCXBNYWNFbnRyeSA9IE5VTEw7CisKKwlwUGFja2V0ID0gcFR4QmxrLT5wUGFja2V0OworCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBQYWNrZXQsICZQYWNrZXRJbmZvLCAmcFR4QmxrLT5wU3JjQnVmSGVhZGVyLCAmcFR4QmxrLT5TcmNCdWZMZW4pOworCisJcFR4QmxrLT5XY2lkCSAJIAkJPSBSVE1QX0dFVF9QQUNLRVRfV0NJRChwUGFja2V0KTsKKwlwVHhCbGstPmFwaWR4CQkgCQk9IFJUTVBfR0VUX1BBQ0tFVF9JRihwUGFja2V0KTsKKwlwVHhCbGstPlVzZXJQcmlvcml0eSAJCT0gUlRNUF9HRVRfUEFDS0VUX1VQKHBQYWNrZXQpOworCXBUeEJsay0+RnJhbWVHYXAgPSBJRlNfSFRUWE9QOwkJLy8gQVNJQyBkZXRlcm1pbmUgRnJhbWUgR2FwCisKKwlpZiAoUlRNUF9HRVRfUEFDS0VUX0NMRUFSX0VBUF9GUkFNRShwVHhCbGstPnBQYWNrZXQpKQorCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYkNsZWFyRUFQRnJhbWUpOworCWVsc2UKKwkJVFhfQkxLX0NMRUFSX0ZMQUcocFR4QmxrLCBmVFhfYkNsZWFyRUFQRnJhbWUpOworCisJLy8gRGVmYXVsdCB0byBjbGVhciB0aGlzIGZsYWcKKwlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iRm9yY2VOb25Rb1MpOworCisKKwlpZiAocFR4QmxrLT5XY2lkID09IE1DQVNUX1dDSUQpCisJeworCQlwVHhCbGstPnBNYWNFbnRyeSA9IE5VTEw7CisJCXsKKyNpZmRlZiBNQ0FTVF9SQVRFX1NQRUNJRklDCisJCQlQVUNIQVIgcERBID0gR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOworCQkJaWYgKCgoKnBEQSAmIDB4MDEpID09IDB4MDEpICYmICgqcERBICE9IDB4ZmYpKQorCQkJCXBUeEJsay0+cFRyYW5zbWl0ID0gJnBBZC0+Q29tbW9uQ2ZnLk1DYXN0UGh5TW9kZTsKKwkJCWVsc2UKKyNlbmRpZiAvLyBNQ0FTVF9SQVRFX1NQRUNJRklDIC8vCisJCQkJcFR4QmxrLT5wVHJhbnNtaXQgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXS5IVFBoeU1vZGU7CisJCX0KKworCQlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iQWNrUmVxdWlyZWQpOwkvLyBBY2tSZXF1aXJlZCA9IEZBTFNFLCB3aGVuIGJyb2FkY2FzdCBwYWNrZXQgaW4gQWRob2MgbW9kZS4KKwkJLy9UWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYkZvcmNlTG93UmF0ZSk7CisJCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JBbGxvd0ZyYWcpOworCQlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iV01NKTsKKwkJaWYgKFJUTVBfR0VUX1BBQ0tFVF9NT1JFREFUQShwUGFja2V0KSkKKwkJeworCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JNb3JlRGF0YSk7CisJCX0KKworCX0KKwllbHNlCisJeworCQlwVHhCbGstPnBNYWNFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3BUeEJsay0+V2NpZF07CisJCXBUeEJsay0+cFRyYW5zbWl0ID0gJnBUeEJsay0+cE1hY0VudHJ5LT5IVFBoeU1vZGU7CisKKwkJcE1hY0VudHJ5ID0gcFR4QmxrLT5wTWFjRW50cnk7CisKKworCQkvLyBGb3IgYWxsIHVuaWNhc3QgcGFja2V0cywgbmVlZCBBY2sgdW5sZXNzIHRoZSBBY2sgUG9saWN5IGlzIG5vdCBzZXQgYXMgTk9STUFMX0FDSy4KKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkFja1BvbGljeVtwVHhCbGstPlF1ZUlkeF0gIT0gTk9STUFMX0FDSykKKwkJCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JBY2tSZXF1aXJlZCk7CisJCWVsc2UKKwkJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iQWNrUmVxdWlyZWQpOworCisJCXsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCXsKKworCQkJCS8vIElmIHN1cHBvcnQgV01NLCBlbmFibGUgaXQuCisJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkpCisJCQkJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iV01NKTsKKwkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJfQorCisJCWlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0xFR0FDWV9GUkFNRSkKKwkJeworCQkJaWYgKCAoUlRNUF9HRVRfUEFDS0VUX0xPV1JBVEUocFBhY2tldCkpIHx8CisgICAgICAgICAgICAgICAgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApICYmIChwTWFjRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID09IE1PREVfQ0NLKSAmJiAocE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID09IFJBVEVfMSkpKQorCQkJewkvLyBTcGVjaWZpYyBwYWNrZXQsIGkuZS4sIGJESENQRnJhbWUsIGJFQVBPTEZyYW1lLCBiV0FJRnJhbWUsIG5lZWQgZm9yY2UgbG93IHJhdGUuCisJCQkJcFR4QmxrLT5wVHJhbnNtaXQgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXS5IVFBoeU1vZGU7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJLy8gTW9kaWZ5IHRoZSBXTU0gYml0IGZvciBJQ1YgaXNzdWUuIElmIHdlIGhhdmUgYSBwYWNrZXQgd2l0aCBFT1NQIGZpZWxkIG5lZWQgdG8gc2V0IGFzIDEsIGhvdyB0byBoYW5kbGUgaXQ/Pz8KKwkJCQlpZiAoSVNfSFRfU1RBKHBUeEJsay0+cE1hY0VudHJ5KSAmJgorCQkJCQkoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19SQUxJTktfQ0hJUFNFVCkpICYmCisJCQkJCSgocEFkLT5Db21tb25DZmcuYlJkZyA9PSBUUlVFKSAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKSkpCisJCQkJeworCQkJCQlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iV01NKTsKKwkJCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JGb3JjZU5vblFvUyk7CisJCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlpZiAoIChJU19IVF9SQVRFKHBNYWNFbnRyeSkgPT0gRkFMU0UpICYmCisJCQkJKENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUElHR1lCQUNLX0NBUEFCTEUpKSkKKwkJCXsJLy8gQ3VycmVudGx5IHBpZ2d5LWJhY2sgb25seSBzdXBwb3J0IHdoZW4gcGVlciBpcyBvcGVyYXRlIGluIGIvZyBtb2RlLgorCQkJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iUGlnZ3lCYWNrKTsKKwkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkJaWYgKFJUTVBfR0VUX1BBQ0tFVF9NT1JFREFUQShwUGFja2V0KSkKKwkJCXsKKwkJCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYk1vcmVEYXRhKTsKKwkJCX0KKyNpZmRlZiBVQVBTRF9BUF9TVVBQT1JUCisJCQlpZiAoUlRNUF9HRVRfUEFDS0VUX0VPU1AocFBhY2tldCkpCisJCQl7CisJCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JXTU1fVUFQU0RfRU9TUCk7CisJCQl9CisjZW5kaWYgLy8gVUFQU0RfQVBfU1VQUE9SVCAvLworCQl9CisJCWVsc2UgaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfRlJBR19GUkFNRSkKKwkJeworCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JBbGxvd0ZyYWcpOworCQl9CisKKwkJcE1hY0VudHJ5LT5EZWJ1Z1R4Q291bnQrKzsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworCitCT09MRUFOIENhbkRvQWdncmVnYXRlVHJhbnNtaXQoCisJSU4gUlRNUF9BREFQVEVSICpwQWQsCisJSU4gTkRJU19QQUNLRVQgKnBQYWNrZXQsCisJSU4gVFhfQkxLCQkqcFR4QmxrKQoreworCisJLy9wcmludGsoIkNoZWNrIGlmIGNhbiBkbyBhZ2dyZWdhdGlvbiEgVHhGcmFtZVR5cGU9JWQhXG4iLCBwVHhCbGstPlR4RnJhbWVUeXBlKTsKKworCWlmIChSVE1QX0dFVF9QQUNLRVRfV0NJRChwUGFja2V0KSA9PSBNQ0FTVF9XQ0lEKQorCQlyZXR1cm4gRkFMU0U7CisKKwlpZiAoUlRNUF9HRVRfUEFDS0VUX0RIQ1AocFBhY2tldCkgfHwKKwkJUlRNUF9HRVRfUEFDS0VUX0VBUE9MKHBQYWNrZXQpIHx8CisJCVJUTVBfR0VUX1BBQ0tFVF9XQUkocFBhY2tldCkpCisJCXJldHVybiBGQUxTRTsKKworCWlmICgocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVNEVV9GUkFNRSkgJiYKKwkJKChwVHhCbGstPlRvdGFsRnJhbWVMZW4gKyBHRVRfT1NfUEtUX0xFTihwUGFja2V0KSk+IChSWF9CVUZGRVJfQUdHUkVTSVpFIC0gMTAwKSkpCisJewkvLyBGb3IgQU1TRFUsIGFsbG93IHRoZSBwYWNrZXRzIHdpdGggdG90YWwgbGVuZ3RoIDwgbWF4LWFtc2R1IHNpemUKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmICgocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9SQUxJTktfRlJBTUUpICYmCisJCShwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXIgPT0gMikpCisJewkvLyBGb3IgUkFMSU5LLUFnZ3JlZ2F0aW9uLCBhbGxvdyB0d28gZnJhbWVzIGluIG9uZSBiYXRjaC4KKwkJcmV0dXJuIEZBTFNFOworCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCWlmICgoSU5GUkFfT04ocEFkKSkgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKSAvLyBtdXN0IGJlIHVuaWNhc3QgdG8gQVAKKwkJcmV0dXJuIFRSVUU7CisJZWxzZQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQlyZXR1cm4gRkFMU0U7CisKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJVG8gZG8gdGhlIGVucXVldWUgb3BlcmF0aW9uIGFuZCBleHRyYWN0IHRoZSBmaXJzdCBpdGVtIG9mIHdhaXRpbmcKKwkJbGlzdC4gSWYgYSBudW1iZXIgb2YgYXZhaWxhYmxlIHNoYXJlZCBtZW1vcnkgc2VnbWVudHMgY291bGQgbWVldAorCQl0aGUgcmVxdWVzdCBvZiBleHRyYWN0ZWQgaXRlbSwgdGhlIGV4dHJhY3RlZCBpdGVtIHdpbGwgYmUgZnJhZ21lbnRlZAorCQlpbnRvIHNoYXJlZCBtZW1vcnkgc2VnbWVudHMuCisKKwlBcmd1bWVudHM6CisJCXBBZCBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBRdWV1ZQkJUG9pbnRlciB0byBXYWl0aW5nIFF1ZXVlCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUERlUXVldWVQYWNrZXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIEJPT0xFQU4gICAgICAgICBiSW50Q29udGV4dCwKKwlJTiAgVUNIQVIJCQlRSWR4LCAvKiBCdWxrT3V0UGlwZUlkICovCisJSU4gIFVDSEFSICAgICAgICAgICBNYXhfVHhfUGFja2V0cykKK3sKKwlQUVVFVUVfRU5UUlkgICAgcEVudHJ5ID0gTlVMTDsKKwlQTkRJU19QQUNLRVQgCXBQYWNrZXQ7CisJTkRJU19TVEFUVVMgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJVUNIQVIgICAgICAgICAgIENvdW50PTA7CisJUFFVRVVFX0hFQURFUiAgIHBRdWV1ZTsKKwlVTE9ORyAgICAgICAgICAgRnJlZU51bWJlcltOVU1fT0ZfVFhfUklOR107CisJVUNIQVIJCQlRdWVJZHgsIHNRSWR4LCBlUUlkeDsKKwl1bnNpZ25lZCBsb25nCUlycUZsYWdzID0gMDsKKwlCT09MRUFOCQkJaGFzVHhEZXNjID0gRkFMU0U7CisJVFhfQkxLCQkJVHhCbGs7CisJVFhfQkxLCQkJKnBUeEJsazsKKworI2lmZGVmIERCR19ESUFHTk9TRQorCUJPT0xFQU4JCQlmaXJzdFJvdW5kOworCVJ0bXBEaWFnU3RydWN0CSpwRGlhZ1N0cnVjdCA9ICZwQWQtPkRpYWdTdHJ1Y3Q7CisjZW5kaWYKKworCisJaWYgKFFJZHggPT0gTlVNX09GX1RYX1JJTkcpCisJeworCQlzUUlkeCA9IDA7CisJCWVRSWR4ID0gMzsJLy8gNCBBQ3MsIHN0YXJ0IGZyb20gMC4KKwl9CisJZWxzZQorCXsKKwkJc1FJZHggPSBlUUlkeCA9IFFJZHg7CisJfQorCisJZm9yIChRdWVJZHg9c1FJZHg7IFF1ZUlkeCA8PSBlUUlkeDsgUXVlSWR4KyspCisJeworCQlDb3VudD0wOworCisJCVJUMjhYWF9TVEFSVF9ERVFVRVVFKHBBZCwgUXVlSWR4LCBJcnFGbGFncyk7CisKKyNpZmRlZiBEQkdfRElBR05PU0UKKwkJZmlyc3RSb3VuZCA9ICgoUXVlSWR4ID09IDApID8gVFJVRSA6IEZBTFNFKTsKKyNlbmRpZiAvLyBEQkdfRElBR05PU0UgLy8KKworCQl3aGlsZSAoMSkKKwkJeworCQkJaWYgKChSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JBRElPX09GRiB8CisJCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8CisJCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpCisJCQl7CisJCQkJUlQyOFhYX1NUT1BfREVRVUVVRShwQWQsIFF1ZUlkeCwgSXJxRmxhZ3MpOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJaWYgKENvdW50ID49IE1heF9UeF9QYWNrZXRzKQorCQkJCWJyZWFrOworCisJCQlERVFVRVVFX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncyk7CisJCQlpZiAoJnBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0gPT0gTlVMTCkKKwkJCXsKKyNpZmRlZiBEQkdfRElBR05PU0UKKwkJCQlpZiAoZmlyc3RSb3VuZCA9PSBUUlVFKQorCQkJCQlwRGlhZ1N0cnVjdC0+VHhTV1F1ZUNudFtwRGlhZ1N0cnVjdC0+QXJyYXlDdXJJZHhdWzBdKys7CisjZW5kaWYgLy8gREJHX0RJQUdOT1NFIC8vCisJCQkJREVRVUVVRV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncyk7CisJCQkJYnJlYWs7CisJCQl9CisKKyNpZmRlZiBSVDI4NjAKKwkJCUZyZWVOdW1iZXJbUXVlSWR4XSA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKKworI2lmZGVmIERCR19ESUFHTk9TRQorCQkJaWYgKGZpcnN0Um91bmQgPT0gVFJVRSkKKwkJCXsKKwkJCQlVQ0hBUgl0eERlc2NOdW1MZXZlbCwgdHhTd1FOdW1MZXZlbDsKKworCQkJCXR4RGVzY051bUxldmVsID0gKFRYX1JJTkdfU0laRSAtIEZyZWVOdW1iZXJbUXVlSWR4XSk7IC8vIE51bWJlciBvZiBvY2N1cGllZCBodyBkZXNjLgorCQkJCXR4RGVzY051bUxldmVsID0gKCh0eERlc2NOdW1MZXZlbCA8PTE1KSA/IHR4RGVzY051bUxldmVsIDogMTUpOworCQkJCXBEaWFnU3RydWN0LT5UeERlc2NDbnRbcERpYWdTdHJ1Y3QtPkFycmF5Q3VySWR4XVt0eERlc2NOdW1MZXZlbF0rKzsKKworCQkJCXR4U3dRTnVtTGV2ZWwgPSAoKHBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0uTnVtYmVyIDw9NykgPyBwQWQtPlR4U3dRdWV1ZVtRdWVJZHhdLk51bWJlciA6IDgpOworCQkJCXBEaWFnU3RydWN0LT5UeFNXUXVlQ250W3BEaWFnU3RydWN0LT5BcnJheUN1cklkeF1bdHhTd1FOdW1MZXZlbF0rKzsKKworCQkJCWZpcnN0Um91bmQgPSBGQUxTRTsKKwkJCX0KKyNlbmRpZiAvLyBEQkdfRElBR05PU0UgLy8KKworCQkJaWYgKEZyZWVOdW1iZXJbUXVlSWR4XSA8PSA1KQorCQkJeworCQkJCS8vIGZyZWUgVHgoUXVlSWR4KSByZXNvdXJjZXMKKwkJCQlSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRdWVJZHgpOworCQkJCUZyZWVOdW1iZXJbUXVlSWR4XSA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKKwkJCX0KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCQkJLy8gcHJvYmUgdGhlIFF1ZXVlIEhlYWQKKwkJCXBRdWV1ZSA9ICZwQWQtPlR4U3dRdWV1ZVtRdWVJZHhdOworCQkJaWYgKChwRW50cnkgPSBwUXVldWUtPkhlYWQpID09IE5VTEwpCisJCQl7CisJCQkJREVRVUVVRV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncyk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXBUeEJsayA9ICZUeEJsazsKKwkJCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpcFR4QmxrLCBzaXplb2YoVFhfQkxLKSk7CisJCQlwVHhCbGstPlF1ZUlkeCA9IFF1ZUlkeDsKKworCQkJcFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BLVChwRW50cnkpOworCisJCQkvLyBFYXJseSBjaGVjayB0byBtYWtlIHN1cmUgd2UgaGF2ZSBlbm9ndWggVHggUmVzb3VyY2UuCisJCQloYXNUeERlc2MgPSBSVDI4WFhfSEFTX0VOT1VHSF9GUkVFX0RFU0MocEFkLCBwVHhCbGssIEZyZWVOdW1iZXJbUXVlSWR4XSwgcFBhY2tldCk7CisJCQlpZiAoIWhhc1R4RGVzYykKKwkJCXsKKwkJCQlwQWQtPlByaXZhdGVJbmZvLlR4UmluZ0Z1bGxDbnQrKzsKKworCQkJCURFUVVFVUVfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBiSW50Q29udGV4dCwgSXJxRmxhZ3MpOworCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXBUeEJsay0+VHhGcmFtZVR5cGUgPSBUeFBrdENsYXNzaWZpY2F0aW9uKHBBZCwgcFBhY2tldCk7CisJCQlwRW50cnkgPSBSZW1vdmVIZWFkUXVldWUocFF1ZXVlKTsKKwkJCXBUeEJsay0+VG90YWxGcmFtZU51bSsrOworCQkJcFR4QmxrLT5Ub3RhbEZyYWdOdW0gKz0gUlRNUF9HRVRfUEFDS0VUX0ZSQUdNRU5UUyhwUGFja2V0KTsJLy8gVGhlIHJlYWwgZnJhZ21lbnQgbnVtYmVyIG1heWJlIHZhcnkKKwkJCXBUeEJsay0+VG90YWxGcmFtZUxlbiArPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKKwkJCXBUeEJsay0+cFBhY2tldCA9IHBQYWNrZXQ7CisJCQlJbnNlcnRUYWlsUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0LCBQQUNLRVRfVE9fUVVFVUVfRU5UUlkocFBhY2tldCkpOworCisJCQlpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9SQUxJTktfRlJBTUUgfHwgcFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVNEVV9GUkFNRSkKKwkJCXsKKwkJCQkvLyBFbmhhbmNlIFNXIEFnZ3JlZ2F0aW9uIE1lY2hhbmlzbQorCQkJCWlmIChORUVEX1FVRVVFX0JBQ0tfRk9SX0FHRyhwQWQsIFF1ZUlkeCwgRnJlZU51bWJlcltRdWVJZHhdLCBwVHhCbGstPlR4RnJhbWVUeXBlKSkKKwkJCQl7CisJCQkJCUluc2VydEhlYWRRdWV1ZShwUXVldWUsIFBBQ0tFVF9UT19RVUVVRV9FTlRSWShwUGFja2V0KSk7CisJCQkJCURFUVVFVUVfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBiSW50Q29udGV4dCwgSXJxRmxhZ3MpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlkb3sKKwkJCQkJaWYoKHBFbnRyeSA9IHBRdWV1ZS0+SGVhZCkgPT0gTlVMTCkKKwkJCQkJCWJyZWFrOworCisJCQkJCS8vIEZvciBUWF9BTVNEVV9GUkFNRS9UWF9SQUxJTktfRlJBTUUsIE5lZWQgdG8gY2hlY2sgaWYgbmV4dCBwYWtjZXQgY2FuIGRvIGFnZ3JlZ2F0aW9uLgorCQkJCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEtUKHBFbnRyeSk7CisJCQkJCUZyZWVOdW1iZXJbUXVlSWR4XSA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKKwkJCQkJaGFzVHhEZXNjID0gUlQyOFhYX0hBU19FTk9VR0hfRlJFRV9ERVNDKHBBZCwgcFR4QmxrLCBGcmVlTnVtYmVyW1F1ZUlkeF0sIHBQYWNrZXQpOworCQkJCQlpZiAoKGhhc1R4RGVzYyA9PSBGQUxTRSkgfHwgKENhbkRvQWdncmVnYXRlVHJhbnNtaXQocEFkLCBwUGFja2V0LCBwVHhCbGspID09IEZBTFNFKSkKKwkJCQkJCWJyZWFrOworCisJCQkJCS8vUmVtb3ZlIHRoZSBwYWNrZXQgZnJvbSB0aGUgVHhTd1F1ZXVlIGFuZCBpbnNlcnQgaW50byBwVHhCbGsKKwkJCQkJcEVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKHBRdWV1ZSk7CisJCQkJCUFTU0VSVChwRW50cnkpOworCQkJCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEtUKHBFbnRyeSk7CisJCQkJCXBUeEJsay0+VG90YWxGcmFtZU51bSsrOworCQkJCQlwVHhCbGstPlRvdGFsRnJhZ051bSArPSBSVE1QX0dFVF9QQUNLRVRfRlJBR01FTlRTKHBQYWNrZXQpOwkvLyBUaGUgcmVhbCBmcmFnbWVudCBudW1iZXIgbWF5YmUgdmFyeQorCQkJCQlwVHhCbGstPlRvdGFsRnJhbWVMZW4gKz0gR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7CisJCQkJCUluc2VydFRhaWxRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QsIFBBQ0tFVF9UT19RVUVVRV9FTlRSWShwUGFja2V0KSk7CisJCQkJfXdoaWxlKDEpOworCisJCQkJaWYgKHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlciA9PSAxKQorCQkJCQlwVHhCbGstPlR4RnJhbWVUeXBlID0gVFhfTEVHQUNZX0ZSQU1FOworCQkJfQorCisKKwkJCUNvdW50ICs9IHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlcjsKKworCQkJCS8vIERvIEhhcmRUcmFuc21pdCBub3cuCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCVN0YXR1cyA9IFNUQUhhcmRUcmFuc21pdChwQWQsIHBUeEJsaywgUXVlSWR4KTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIFJUMjg2MAorCQkJREVRVUVVRV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncyk7CisJCQkvLyBzdGF0aWMgcmF0ZSBhbHNvIG5lZWQgTklDVXBkYXRlRmlmb1N0YUNvdW50ZXJzKCkgZnVuY3Rpb24uCisJCQkvL2lmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpKQorCQkJCU5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycyhwQWQpOworI2VuZGlmIC8vIFJUMjg2MCAvLworCQl9CisKKwkJUlQyOFhYX1NUT1BfREVRVUVVRShwQWQsIFF1ZUlkeCwgSXJxRmxhZ3MpOworCisKKyNpZmRlZiBCTE9DS19ORVRfSUYKKwkJaWYgKChwQWQtPmJsb2NrUXVldWVUYWJbUXVlSWR4XS5Td1R4UXVldWVCbG9ja0ZsYWcgPT0gVFJVRSkKKwkJCSYmIChwQWQtPlR4U3dRdWV1ZVtRdWVJZHhdLk51bWJlciA8IDEpKQorCQl7CisJCQlyZWxlYXNlTmV0SWYoJnBBZC0+YmxvY2tRdWV1ZVRhYltRdWVJZHhdKTsKKwkJfQorI2VuZGlmIC8vIEJMT0NLX05FVF9JRiAvLworCisJfQorCit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNhbGN1bGF0ZXMgdGhlIGR1cmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHRyYW5zbWl0IG91dCBmcmFtZXMKKwl3aXRoIGdpdmVuIHNpemUgYW5kIHNwZWNpZmllZCByYXRlLgorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJUmF0ZQkJCVRyYW5zbWl0IHJhdGUKKwkJU2l6ZQkJCUZyYW1lIHNpemUgaW4gdW5pdHMgb2YgYnl0ZQorCisJUmV0dXJuIFZhbHVlOgorCQlEdXJhdGlvbiBudW1iZXIgaW4gdW5pdHMgb2YgdXNlYworCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitVU0hPUlQJUlRNUENhbGNEdXJhdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCVJhdGUsCisJSU4JVUxPTkcJCQlTaXplKQoreworCVVMT05HCUR1cmF0aW9uID0gMDsKKworCWlmIChSYXRlIDwgUkFURV9GSVJTVF9PRkRNX1JBVEUpIC8vIENDSworCXsKKwkJaWYgKChSYXRlID4gUkFURV8xKSAmJiBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCkpCisJCQlEdXJhdGlvbiA9IDk2OwkvLyA3MisyNCBwcmVhbWJsZStwbGNwCisJCWVsc2UKKwkJCUR1cmF0aW9uID0gMTkyOyAvLyAxNDQrNDggcHJlYW1ibGUrcGxjcAorCisJCUR1cmF0aW9uICs9IChVU0hPUlQpKChTaXplIDw8IDQpIC8gUmF0ZUlkVG81MDBLYnBzW1JhdGVdKTsKKwkJaWYgKChTaXplIDw8IDQpICUgUmF0ZUlkVG81MDBLYnBzW1JhdGVdKQorCQkJRHVyYXRpb24gKys7CisJfQorCWVsc2UgaWYgKFJhdGUgPD0gUkFURV9MQVNUX09GRE1fUkFURSkvLyBPRkRNIHJhdGVzCisJeworCQlEdXJhdGlvbiA9IDIwICsgNjsJCS8vIDE2KzQgcHJlYW1ibGUrcGxjcCArIFNpZ25hbCBFeHRlbnNpb24KKwkJRHVyYXRpb24gKz0gNCAqIChVU0hPUlQpKCgxMSArIFNpemUgKiA0KSAvIFJhdGVJZFRvNTAwS2Jwc1tSYXRlXSk7CisJCWlmICgoMTEgKyBTaXplICogNCkgJSBSYXRlSWRUbzUwMEticHNbUmF0ZV0pCisJCQlEdXJhdGlvbiArPSA0OworCX0KKwllbHNlCS8vbWltbyByYXRlCisJeworCQlEdXJhdGlvbiA9IDIwICsgNjsJCS8vIDE2KzQgcHJlYW1ibGUrcGxjcCArIFNpZ25hbCBFeHRlbnNpb24KKwl9CisKKwlyZXR1cm4gKFVTSE9SVClEdXJhdGlvbjsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ2FsY3VsYXRlcyB0aGUgZHVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gdHJhbnNtaXQgb3V0IGZyYW1lcworCXdpdGggZ2l2ZW4gc2l6ZSBhbmQgc3BlY2lmaWVkIHJhdGUuCisKKwlBcmd1bWVudHM6CisJCXBUeFdJCQlQb2ludGVyIHRvIGhlYWQgb2YgZWFjaCBNUERVIHRvIEhXLgorCQlBY2sgCQlTZXR0aW5nIGZvciBBY2sgcmVxdWlyZW1lbnQgYml0CisJCUZyYWdtZW50CVNldHRpbmcgZm9yIEZyYWdtZW50IGJpdAorCQlSZXRyeU1vZGUJU2V0dGluZyBmb3IgcmV0cnkgbW9kZQorCQlJZnMgCQlTZXR0aW5nIGZvciBJRlMgZ2FwCisJCVJhdGUJCVNldHRpbmcgZm9yIHRyYW5zbWl0IHJhdGUKKwkJU2VydmljZSAJU2V0dGluZyBmb3Igc2VydmljZQorCQlMZW5ndGgJCUZyYW1lIGxlbmd0aAorCQlUeFByZWFtYmxlCVNob3J0IG9yIExvbmcgcHJlYW1ibGUgd2hlbiB1c2luZyBDQ0sgcmF0ZXMKKwkJUXVlSWR4IC0gMC0zLCBhY2NvcmRpbmcgdG8gODAyLjExZS9kNC40IEp1bmUvMjAwMworCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgU2VlIGFsc28gOiBCQVNtYXJ0SGFyZFRyYW5zbWl0KCkgICAgISEhCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBXcml0ZVR4V0koCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFRYV0lfU1RSVUMgCXBPdXRUeFdJLAorCUlOCUJPT0xFQU4JCQlGUkFHLAorCUlOCUJPT0xFQU4JCQlDRkFDSywKKwlJTglCT09MRUFOCQkJSW5zVGltZXN0YW1wLAorCUlOCUJPT0xFQU4gCQlBTVBEVSwKKwlJTglCT09MRUFOIAkJQWNrLAorCUlOCUJPT0xFQU4gCQlOU2VxLAkJLy8gSFcgbmV3IGEgc2VxdWVuY2UuCisJSU4JVUNIQVIJCQlCQVNpemUsCisJSU4JVUNIQVIJCQlXQ0lELAorCUlOCVVMT05HCQkJTGVuZ3RoLAorCUlOCVVDSEFSIAkJCVBJRCwKKwlJTglVQ0hBUgkJCVRJRCwKKwlJTglVQ0hBUgkJCVR4UmF0ZSwKKwlJTglVQ0hBUgkJCVR4b3Btb2RlLAorCUlOCUJPT0xFQU4JCQlDZkFjaywKKwlJTglIVFRSQU5TTUlUX1NFVFRJTkcJKnBUcmFuc21pdCkKK3sKKwlQTUFDX1RBQkxFX0VOVFJZCXBNYWMgPSBOVUxMOworCVRYV0lfU1RSVUMgCQlUeFdJOworCVBUWFdJX1NUUlVDIAlwVHhXSTsKKworCWlmIChXQ0lEIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCXBNYWMgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtXQ0lEXTsKKworCS8vCisJLy8gQWx3YXlzIHVzZSBMb25nIHByZWFtYmxlIGJlZm9yZSB2ZXJpZmlhdGlvbiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzIHdlbGwuCisJLy8gVG9kbzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZSBpZiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzCisJLy8KKwlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpOworCU5kaXNaZXJvTWVtb3J5KCZUeFdJLCBUWFdJX1NJWkUpOworCXBUeFdJID0gJlR4V0k7CisKKwlwVHhXSS0+RlJBRz0gRlJBRzsKKworCXBUeFdJLT5DRkFDSyA9IENGQUNLOworCXBUeFdJLT5UUz0gSW5zVGltZXN0YW1wOworCXBUeFdJLT5BTVBEVSA9IEFNUERVOworCXBUeFdJLT5BQ0sgPSBBY2s7CisJcFR4V0ktPnR4b3A9IFR4b3Btb2RlOworCisJcFR4V0ktPk5TRVEgPSBOU2VxOworCS8vIEpvaG4gdHVuZSB0aGUgcGVyZm9ybWFjZSB3aXRoIEludGVsIENsaWVudCBpbiAyMCBNSHogcGVyZm9ybWFuY2UKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlCQVNpemUgPSBwQWQtPkNvbW1vbkNmZy5UeEJBU2l6ZTsKKworCWlmKCBCQVNpemUgPjcgKQorCQlCQVNpemUgPTc7CisJcFR4V0ktPkJBV2luU2l6ZSA9IEJBU2l6ZTsKKwlwVHhXSS0+U2hvcnRHSSA9IHBUcmFuc21pdC0+ZmllbGQuU2hvcnRHSTsKKwlwVHhXSS0+U1RCQyA9IHBUcmFuc21pdC0+ZmllbGQuU1RCQzsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCXBUeFdJLT5XaXJlbGVzc0NsaUlEID0gV0NJRDsKKwlwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID0gTGVuZ3RoOworCXBUeFdJLT5QYWNrZXRJZCA9IFBJRDsKKworCS8vIElmIENDSyBvciBPRkRNLCBCVyBtdXN0IGJlIDIwCisJcFR4V0ktPkJXID0gKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pID8gKEJXXzIwKSA6IChwVHJhbnNtaXQtPmZpZWxkLkJXKTsKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJaWYgKHBUeFdJLT5CVykKKwkJcFR4V0ktPkJXID0gKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aCA9PSAwKSA/IChCV18yMCkgOiAocFRyYW5zbWl0LT5maWVsZC5CVyk7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCisJcFR4V0ktPk1DUyA9IHBUcmFuc21pdC0+ZmllbGQuTUNTOworCXBUeFdJLT5QSFlNT0RFID0gcFRyYW5zbWl0LT5maWVsZC5NT0RFOworCXBUeFdJLT5DRkFDSyA9IENmQWNrOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKHBNYWMpCisJeworCQlpZiAocEFkLT5Db21tb25DZmcuYk1JTU9QU0VuYWJsZSkKKwkJeworCQkJaWYgKChwTWFjLT5NbXBzTW9kZSA9PSBNTVBTX0RZTkFNSUMpICYmIChwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpKQorCQkJeworCQkJCS8vIER5bmFtaWMgTUlNTyBQb3dlciBTYXZlIE1vZGUKKwkJCQlwVHhXSS0+TUlNT3BzID0gMTsKKwkJCX0KKwkJCWVsc2UgaWYgKHBNYWMtPk1tcHNNb2RlID09IE1NUFNfU1RBVElDKQorCQkJeworCQkJCS8vIFN0YXRpYyBNSU1PIFBvd2VyIFNhdmUgTW9kZQorCQkJCWlmIChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCAmJiBwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpCisJCQkJeworCQkJCQlwVHhXSS0+TUNTID0gNzsKKwkJCQkJcFR4V0ktPk1JTU9wcyA9IDA7CisJCQkJfQorCQkJfQorCQl9CisJCS8vcFR4V0ktPk1JTU9wcyA9IChwTWFjLT5Qc01vZGUgPT0gUFdSX01NUFMpPyAxOjA7CisJCWlmIChwTWFjLT5iSUFtQmFkQXRoZXJvcyAmJiAocE1hYy0+V2VwU3RhdHVzICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkpCisJCXsKKwkJCXBUeFdJLT5NcGR1RGVuc2l0eSA9IDc7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwVHhXSS0+TXBkdURlbnNpdHkgPSBwTWFjLT5NcGR1RGVuc2l0eTsKKwkJfQorCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCXBUeFdJLT5QYWNrZXRJZCA9IHBUeFdJLT5NQ1M7CisJTmRpc01vdmVNZW1vcnkocE91dFR4V0ksICZUeFdJLCBzaXplb2YoVFhXSV9TVFJVQykpOworfQorCisKK1ZPSUQgUlRNUFdyaXRlVHhXSV9EYXRhKAorCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTglPVVQgUFRYV0lfU1RSVUMJCXBUeFdJLAorCUlOCVRYX0JMSwkJCQkqcFR4QmxrKQoreworCUhUVFJBTlNNSVRfU0VUVElORwkqcFRyYW5zbWl0OworCVBNQUNfVEFCTEVfRU5UUlkJcE1hY0VudHJ5OworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCVVDSEFSCQkJCUJBU2l6ZTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCisJQVNTRVJUKHBUeFdJKTsKKworCXBUcmFuc21pdCA9IHBUeEJsay0+cFRyYW5zbWl0OworCXBNYWNFbnRyeSA9IHBUeEJsay0+cE1hY0VudHJ5OworCisKKwkvLworCS8vIEFsd2F5cyB1c2UgTG9uZyBwcmVhbWJsZSBiZWZvcmUgdmVyaWZpYXRpb24gc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcyB3ZWxsLgorCS8vIFRvZG86IHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUgaWYgc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcworCS8vCisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsKKwlOZGlzWmVyb01lbW9yeShwVHhXSSwgVFhXSV9TSVpFKTsKKworCXBUeFdJLT5GUkFHCQk9IFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYkFsbG93RnJhZyk7CisJcFR4V0ktPkFDSwkJPSBUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JBY2tSZXF1aXJlZCk7CisJcFR4V0ktPnR4b3AJCT0gcFR4QmxrLT5GcmFtZUdhcDsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCWlmIChwTWFjRW50cnkgJiYKKwkJKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0lORlJBKSAmJgorCQkocE1hY0VudHJ5LT5WYWxpZEFzRGxzID09IFRSVUUpKQorCQlwVHhXSS0+V2lyZWxlc3NDbGlJRCA9IEJTU0lEX1dDSUQ7CisJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQlwVHhXSS0+V2lyZWxlc3NDbGlJRAkJPSBwVHhCbGstPldjaWQ7CisKKwlwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50CT0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5TcmNCdWZMZW47CisJcFR4V0ktPkNGQUNLCQkJCT0gVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iUGlnZ3lCYWNrKTsKKworCS8vIElmIENDSyBvciBPRkRNLCBCVyBtdXN0IGJlIDIwCisJcFR4V0ktPkJXID0gKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pID8gKEJXXzIwKSA6IChwVHJhbnNtaXQtPmZpZWxkLkJXKTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJaWYgKHBUeFdJLT5CVykKKwkJcFR4V0ktPkJXID0gKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aCA9PSAwKSA/IChCV18yMCkgOiAocFRyYW5zbWl0LT5maWVsZC5CVyk7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCXBUeFdJLT5BTVBEVQk9ICgocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVBEVV9GUkFNRSkgPyBUUlVFIDogRkFMU0UpOworCisJLy8gSm9obiB0dW5lIHRoZSBwZXJmb3JtYWNlIHdpdGggSW50ZWwgQ2xpZW50IGluIDIwIE1IeiBwZXJmb3JtYW5jZQorCUJBU2l6ZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4QkFTaXplOworCWlmKChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0FNUERVX0ZSQU1FKSAmJiAocE1hY0VudHJ5KSkKKwl7CisJCVVDSEFSCQlSQUJBT3JpSWR4ID0gMDsJLy9UaGUgUkEncyBCQSBPcmlnaW5hdG9yIHRhYmxlIGluZGV4LgorCisJCVJBQkFPcmlJZHggPSBwVHhCbGstPnBNYWNFbnRyeS0+QkFPcmlXY2lkQXJyYXlbcFR4QmxrLT5Vc2VyUHJpb3JpdHldOworCQlCQVNpemUgPSBwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtSQUJBT3JpSWR4XS5CQVdpblNpemU7CisJfQorCisJcFR4V0ktPlR4QkYgPSBwVHJhbnNtaXQtPmZpZWxkLlR4QkY7CisJcFR4V0ktPkJBV2luU2l6ZSA9IEJBU2l6ZTsKKwlwVHhXSS0+U2hvcnRHSSA9IHBUcmFuc21pdC0+ZmllbGQuU2hvcnRHSTsKKwlwVHhXSS0+U1RCQyA9IHBUcmFuc21pdC0+ZmllbGQuU1RCQzsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCXBUeFdJLT5NQ1MgPSBwVHJhbnNtaXQtPmZpZWxkLk1DUzsKKwlwVHhXSS0+UEhZTU9ERSA9IHBUcmFuc21pdC0+ZmllbGQuTU9ERTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmIChwTWFjRW50cnkpCisJeworCQlpZiAoKHBNYWNFbnRyeS0+TW1wc01vZGUgPT0gTU1QU19EWU5BTUlDKSAmJiAocFRyYW5zbWl0LT5maWVsZC5NQ1MgPiA3KSkKKwkJeworCQkJLy8gRHluYW1pYyBNSU1PIFBvd2VyIFNhdmUgTW9kZQorCQkJcFR4V0ktPk1JTU9wcyA9IDE7CisJCX0KKwkJZWxzZSBpZiAocE1hY0VudHJ5LT5NbXBzTW9kZSA9PSBNTVBTX1NUQVRJQykKKwkJeworCQkJLy8gU3RhdGljIE1JTU8gUG93ZXIgU2F2ZSBNb2RlCisJCQlpZiAocFRyYW5zbWl0LT5maWVsZC5NT0RFID49IE1PREVfSFRNSVggJiYgcFRyYW5zbWl0LT5maWVsZC5NQ1MgPiA3KQorCQkJeworCQkJCXBUeFdJLT5NQ1MgPSA3OworCQkJCXBUeFdJLT5NSU1PcHMgPSAwOworCQkJfQorCQl9CisKKwkJaWYgKHBNYWNFbnRyeS0+YklBbUJhZEF0aGVyb3MgJiYgKHBNYWNFbnRyeS0+V2VwU3RhdHVzICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkpCisJCXsKKwkJCXBUeFdJLT5NcGR1RGVuc2l0eSA9IDc7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwVHhXSS0+TXBkdURlbnNpdHkgPSBwTWFjRW50cnktPk1wZHVEZW5zaXR5OworCQl9CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjaWZkZWYgREJHX0RJQUdOT1NFCisJCWlmIChwVHhCbGstPlF1ZUlkeD09IDApCisJCXsKKwkJCXBBZC0+RGlhZ1N0cnVjdC5UeERhdGFDbnRbcEFkLT5EaWFnU3RydWN0LkFycmF5Q3VySWR4XSsrOworCQkJcEFkLT5EaWFnU3RydWN0LlR4TWNzQ250W3BBZC0+RGlhZ1N0cnVjdC5BcnJheUN1cklkeF1bcFR4V0ktPk1DU10rKzsKKwkJfQorI2VuZGlmIC8vIERCR19ESUFHTk9TRSAvLworCisJLy8gZm9yIHJhdGUgYWRhcGF0aW9uCisJcFR4V0ktPlBhY2tldElkID0gcFR4V0ktPk1DUzsKK30KKworCitWT0lEIFJUTVBXcml0ZVR4V0lfQ2FjaGUoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCU9VVCBQVFhXSV9TVFJVQwkJcFR4V0ksCisJSU4JVFhfQkxLCQkJCSpwVHhCbGspCit7CisJUEhUVFJBTlNNSVRfU0VUVElORwlwVHJhbnNtaXQ7CisJUE1BQ19UQUJMRV9FTlRSWQlwTWFjRW50cnk7CisKKwkvLworCS8vIHVwZGF0ZSBUWFdJCisJLy8KKwlwTWFjRW50cnkgPSBwVHhCbGstPnBNYWNFbnRyeTsKKwlwVHJhbnNtaXQgPSBwVHhCbGstPnBUcmFuc21pdDsKKworCWlmIChwTWFjRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoKQorCXsKKwkJcFR4V0ktPnR4b3AgPSBJRlNfSFRUWE9QOworCisJCS8vIElmIENDSyBvciBPRkRNLCBCVyBtdXN0IGJlIDIwCisJCXBUeFdJLT5CVyA9IChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSA/IChCV18yMCkgOiAocFRyYW5zbWl0LT5maWVsZC5CVyk7CisJCXBUeFdJLT5TaG9ydEdJID0gcFRyYW5zbWl0LT5maWVsZC5TaG9ydEdJOworCQlwVHhXSS0+U1RCQyA9IHBUcmFuc21pdC0+ZmllbGQuU1RCQzsKKworCQlwVHhXSS0+TUNTID0gcFRyYW5zbWl0LT5maWVsZC5NQ1M7CisJCXBUeFdJLT5QSFlNT0RFID0gcFRyYW5zbWl0LT5maWVsZC5NT0RFOworCisJCS8vIHNldCBQSUQgZm9yIFR4UmF0ZVN3aXRjaGluZworCQlwVHhXSS0+UGFja2V0SWQgPSBwVHJhbnNtaXQtPmZpZWxkLk1DUzsKKwl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlwVHhXSS0+QU1QRFUgPSAoKHBNYWNFbnRyeS0+Tm9CQURhdGFDb3VudERvd24gPT0gMCkgPyBUUlVFOiBGQUxTRSk7CisJcFR4V0ktPk1JTU9wcyA9IDA7CisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJaWYgKHBUeFdJLT5CVykKKwkJcFR4V0ktPkJXID0gKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aCA9PSAwKSA/IChCV18yMCkgOiAocFRyYW5zbWl0LT5maWVsZC5CVyk7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUpCisJeworCQkvLyBNSU1PIFBvd2VyIFNhdmUgTW9kZQorCQlpZiAoKHBNYWNFbnRyeS0+TW1wc01vZGUgPT0gTU1QU19EWU5BTUlDKSAmJiAocFRyYW5zbWl0LT5maWVsZC5NQ1MgPiA3KSkKKwkJeworCQkJLy8gRHluYW1pYyBNSU1PIFBvd2VyIFNhdmUgTW9kZQorCQkJcFR4V0ktPk1JTU9wcyA9IDE7CisJCX0KKwkJZWxzZSBpZiAocE1hY0VudHJ5LT5NbXBzTW9kZSA9PSBNTVBTX1NUQVRJQykKKwkJeworCQkJLy8gU3RhdGljIE1JTU8gUG93ZXIgU2F2ZSBNb2RlCisJCQlpZiAoKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYKSAmJiAocFRyYW5zbWl0LT5maWVsZC5NQ1MgPiA3KSkKKwkJCXsKKwkJCQlwVHhXSS0+TUNTID0gNzsKKwkJCQlwVHhXSS0+TUlNT3BzID0gMDsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2lmZGVmIERCR19ESUFHTk9TRQorCWlmIChwVHhCbGstPlF1ZUlkeD09IDApCisJeworCQlwQWQtPkRpYWdTdHJ1Y3QuVHhEYXRhQ250W3BBZC0+RGlhZ1N0cnVjdC5BcnJheUN1cklkeF0rKzsKKwkJcEFkLT5EaWFnU3RydWN0LlR4TWNzQ250W3BBZC0+RGlhZ1N0cnVjdC5BcnJheUN1cklkeF1bcFR4V0ktPk1DU10rKzsKKwl9CisjZW5kaWYgLy8gREJHX0RJQUdOT1NFIC8vCisKKwlwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5TcmNCdWZMZW47CisKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ2FsY3VsYXRlcyB0aGUgZHVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gdHJhbnNtaXQgb3V0IGZyYW1lcworCXdpdGggZ2l2ZW4gc2l6ZSBhbmQgc3BlY2lmaWVkIHJhdGUuCisKKwlBcmd1bWVudHM6CisJCXBUeEQJCVBvaW50ZXIgdG8gdHJhbnNtaXQgZGVzY3JpcHRvcgorCQlBY2sgCQlTZXR0aW5nIGZvciBBY2sgcmVxdWlyZW1lbnQgYml0CisJCUZyYWdtZW50CVNldHRpbmcgZm9yIEZyYWdtZW50IGJpdAorCQlSZXRyeU1vZGUJU2V0dGluZyBmb3IgcmV0cnkgbW9kZQorCQlJZnMgCQlTZXR0aW5nIGZvciBJRlMgZ2FwCisJCVJhdGUJCVNldHRpbmcgZm9yIHRyYW5zbWl0IHJhdGUKKwkJU2VydmljZSAJU2V0dGluZyBmb3Igc2VydmljZQorCQlMZW5ndGgJCUZyYW1lIGxlbmd0aAorCQlUeFByZWFtYmxlCVNob3J0IG9yIExvbmcgcHJlYW1ibGUgd2hlbiB1c2luZyBDQ0sgcmF0ZXMKKwkJUXVlSWR4IC0gMC0zLCBhY2NvcmRpbmcgdG8gODAyLjExZS9kNC40IEp1bmUvMjAwMworCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QV3JpdGVUeERlc2NyaXB0b3IoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFRYRF9TVFJVQwkJcFR4RCwKKwlJTglCT09MRUFOIAkJYldJViwKKwlJTglVQ0hBUgkJCVF1ZXVlU0VMKQoreworCS8vCisJLy8gQWx3YXlzIHVzZSBMb25nIHByZWFtYmxlIGJlZm9yZSB2ZXJpZmlhdGlvbiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzIHdlbGwuCisJLy8gVG9kbzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZSBpZiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzCisJLy8KKwlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpOworCisJcFR4RC0+V0lWCT0gKGJXSVYpID8gMTogMDsKKwlwVHhELT5RU0VMPSAoUXVldWVTRUwpOworCWlmIChwQWQtPmJHZW5PbmVIQ0NBID09IFRSVUUpCisJCXBUeEQtPlFTRUw9IEZJRk9fSENDQTsKKwlwVHhELT5ETUFET05FID0gMDsKK30KKworCisvLyBzaG91bGQgYmUgY2FsbGVkIG9ubHkgd2hlbiAtCisvLyAxLiBNRUFESUFfQ09OTkVDVEVECisvLyAyLiBBR0dSRUdBVElPTl9JTl9VU0VECisvLyAzLiBGcmFnbWVudGF0aW9uIG5vdCBpbiB1c2VkCisvLyA0LiBlaXRoZXIgbm8gcHJldmlvdXMgZnJhbWUgKHBQcmV2QWRkcjE9TlVMTCkgLk9SLiBwcmV2aW91ZCBmcmFtZSBpcyBhZ2dyZWdhdGlibGUKK0JPT0xFQU4gVHhGcmFtZUlzQWdncmVnYXRpYmxlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBQcmV2QWRkcjEsCisJSU4JUFVDSEFSCQkJcDgwMjNoZHIpCit7CisKKwkvLyBjYW4ndCBhZ2dyZWdhdGUgRUFQT0wgKDgwMi4xeCkgZnJhbWUKKwlpZiAoKHA4MDIzaGRyWzEyXSA9PSAweDg4KSAmJiAocDgwMjNoZHJbMTNdID09IDB4OGUpKQorCQlyZXR1cm4gRkFMU0U7CisKKwkvLyBjYW4ndCBhZ2dyZWdhdGUgbXVsdGljYXN0L2Jyb2FkY2FzdCBmcmFtZQorCWlmIChwODAyM2hkclswXSAmIDB4MDEpCisJCXJldHVybiBGQUxTRTsKKworCWlmIChJTkZSQV9PTihwQWQpKSAvLyBtdXN0IGJlIHVuaWNhc3QgdG8gQVAKKwkJcmV0dXJuIFRSVUU7CisJZWxzZSBpZiAoKHBQcmV2QWRkcjEgPT0gTlVMTCkgfHwgTUFDX0FERFJfRVFVQUwocFByZXZBZGRyMSwgcDgwMjNoZHIpKSAvLyB1bmljYXN0IHRvIHNhbWUgU1RBCisJCXJldHVybiBUUlVFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCSAgIENoZWNrIHRoZSBNU0RVIEFnZ3JlZ2F0aW9uIHBvbGljeQorCTEuSFQgYWdncmVnYXRpb24gaXMgQS1NU0RVCisJMi5sZWdhYWN5IHJhdGUgYWdncmVnYXRpb24gaXMgc29mdHdhcmUgYWdncmVnYXRpb24gYnkgUmFsaW5rLgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gUGVlcklzQWdncmVPbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVTE9ORwkJICAgVHhSYXRlLAorCUlOCVBNQUNfVEFCTEVfRU5UUlkgcE1hY0VudHJ5KQoreworCVVMT05HCUFGbGFncyA9IChmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQgfCBmQ0xJRU5UX1NUQVRVU19BR0dSRUdBVElPTl9DQVBBQkxFKTsKKworCWlmIChwTWFjRW50cnkgIT0gTlVMTCAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIEFGbGFncykpCisJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAocE1hY0VudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYKQorCQl7CisJCQlyZXR1cm4gVFJVRTsKKwkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAorCQlpZiAoVHhSYXRlID49IFJBVEVfNiAmJiBwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlICYmICghKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkgJiYgQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSkpKSkKKwkJewkvLyBsZWdhY3kgIFJhbGluayBBZ2dyZWdhdGlvbiBzdXBwb3J0CisJCQlyZXR1cm4gVFJVRTsKKwkJfQorI2VuZGlmIC8vIEFHR1JFR0FUSU9OX1NVUFBPUlQgLy8KKwl9CisKKwlyZXR1cm4gRkFMU0U7CisKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ2hlY2sgYW5kIGZpbmUgdGhlIHBhY2tldCB3YWl0aW5nIGluIFNXIHF1ZXVlIHdpdGggaGlnaGVzdCBwcmlvcml0eQorCisJQXJndW1lbnRzOgorCQlwQWQgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlwUXVldWUJCVBvaW50ZXIgdG8gV2FpdGluZyBRdWV1ZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworUFFVRVVFX0hFQURFUglSVE1QQ2hlY2tUeFN3UXVldWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUIFBVQ0hBUgkJCXBRdWVJZHgpCit7CisKKwlVTE9ORwlOdW1iZXI7CisKKwlOdW1iZXIgPSBwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQktdLk51bWJlcgorCQkJICsgcEFkLT5UeFN3UXVldWVbUUlEX0FDX0JFXS5OdW1iZXIKKwkJCSArIHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WSV0uTnVtYmVyCisJCQkgKyBwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVk9dLk51bWJlcgorCQkJICsgcEFkLT5UeFN3UXVldWVbUUlEX0hDQ0FdLk51bWJlcjsKKworCWlmIChwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVk9dLkhlYWQgIT0gTlVMTCkKKwl7CisJCSpwUXVlSWR4ID0gUUlEX0FDX1ZPOworCQlyZXR1cm4gKCZwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVk9dKTsKKwl9CisJZWxzZSBpZiAocEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZJXS5IZWFkICE9IE5VTEwpCisJeworCQkqcFF1ZUlkeCA9IFFJRF9BQ19WSTsKKwkJcmV0dXJuICgmcEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZJXSk7CisJfQorCWVsc2UgaWYgKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CRV0uSGVhZCAhPSBOVUxMKQorCXsKKwkJKnBRdWVJZHggPSBRSURfQUNfQkU7CisJCXJldHVybiAoJnBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CRV0pOworCX0KKwllbHNlIGlmIChwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQktdLkhlYWQgIT0gTlVMTCkKKwl7CisJCSpwUXVlSWR4ID0gUUlEX0FDX0JLOworCQlyZXR1cm4gKCZwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQktdKTsKKwl9CisJZWxzZSBpZiAocEFkLT5UeFN3UXVldWVbUUlEX0hDQ0FdLkhlYWQgIT0gTlVMTCkKKwl7CisJCSpwUXVlSWR4ID0gUUlEX0hDQ0E7CisJCXJldHVybiAoJnBBZC0+VHhTd1F1ZXVlW1FJRF9IQ0NBXSk7CisJfQorCisJLy8gTm8gcGFja2V0IHBlbmRpbmcgaW4gVHggU3cgcXVldWUKKwkqcFF1ZUlkeCA9IFFJRF9BQ19CSzsKKworCXJldHVybiAoTlVMTCk7Cit9CisKKworI2lmZGVmIFJUMjg2MAorQk9PTEVBTiAgUlRNUEZyZWVUWERVcG9uVHhEbWFEb25lKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVDSEFSCQkJUXVlSWR4KQoreworCVBSVE1QX1RYX1JJTkcgcFR4UmluZzsKKwlQVFhEX1NUUlVDCSAgcFR4RDsKKyNpZmRlZglSVF9CSUdfRU5ESUFOCisgICAgUFRYRF9TVFJVQyAgICAgIHBEZXN0VHhEOworI2VuZGlmCisJUE5ESVNfUEFDS0VUICBwUGFja2V0OworCVVDSEFSCUZSRUUgPSAwOworCVRYRF9TVFJVQwlUeEQsICpwT3JpVHhEOworCS8vVUxPTkcJCUlycUZsYWdzOworCUJPT0xFQU4JCQliUmVzY2hlZHVsZSA9IEZBTFNFOworCisKKwlBU1NFUlQoUXVlSWR4IDwgTlVNX09GX1RYX1JJTkcpOworCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbUXVlSWR4XTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfRFRYX0lEWDAgKyBRdWVJZHggKiBSSU5HUkVHX0RJRkYsICZwVHhSaW5nLT5UeERtYUlkeCk7CisJd2hpbGUgKHBUeFJpbmctPlR4U3dGcmVlSWR4ICE9IHBUeFJpbmctPlR4RG1hSWR4KQorCXsKKyNpZmRlZiBSQUxJTktfQVRFCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwkJUEhFQURFUl84MDJfMTEJcEhlYWRlcjgwMjExOworCisJCWlmICgoQVRFX09OKHBBZCkpICYmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpKQorCQl7CisJCQlpZiAocEFkLT5hdGUuUUlEID09IFF1ZUlkeCkKKwkJCXsKKwkJCQlwQWQtPmF0ZS5UeERvbmVDb3VudCsrOworCQkJCS8vcEFkLT5hdGUuUmVwZWF0Kys7CisJCQkJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOworCisJCQkJLyogYWx3YXlzIHVzZSBRSURfQUNfQkUgYW5kIEZJRk9fRURDQSAqLworCQkJCUFTU0VSVChwQWQtPmF0ZS5RSUQgPT0gMCk7CisJCQkJcEFkLT5hdGUuVHhBYzArKzsKKworCQkJCUZSRUUrKzsKKyNpZm5kZWYgUlRfQklHX0VORElBTgorCQkJCXBUeEQgPSAoUFRYRF9TVFJVQykgKHBUeFJpbmctPkNlbGxbcFR4UmluZy0+VHhTd0ZyZWVJZHhdLkFsbG9jVmEpOworCQkJCXBPcmlUeEQgPSBwVHhEOworCQkgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZUeEQsIHBUeEQsIHNpemVvZihUWERfU1RSVUMpKTsKKwkJCQlwVHhEID0gJlR4RDsKKyNlbHNlCisJCSAgICAgICAgcERlc3RUeEQgPSAoUFRYRF9TVFJVQykgKHBUeFJpbmctPkNlbGxbcFR4UmluZy0+VHhTd0ZyZWVJZHhdLkFsbG9jVmEpOworCQkgICAgICAgIHBPcmlUeEQgPSBwRGVzdFR4RCA7CisJCSAgICAgICAgVHhEID0gKnBEZXN0VHhEOworCQkgICAgICAgIHBUeEQgPSAmVHhEOworCQkgICAgICAgIFJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworI2VuZGlmCisJCQkJcFR4RC0+RE1BRE9ORSA9IDA7CisKKwkJCQlwSGVhZGVyODAyMTEgPSBwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5EbWFCdWYuQWxsb2NWYSArIHNpemVvZihUWFdJX1NUUlVDKTsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJCQkJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUilwSGVhZGVyODAyMTEsIERJUl9SRUFELCBGQUxTRSk7CisjZW5kaWYKKwkJCQlwSGVhZGVyODAyMTEtPlNlcXVlbmNlID0gKytwQWQtPmF0ZS5zZXE7CisjaWZkZWYgUlRfQklHX0VORElBTgorCQkJCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIChQVUNIQVIpcEhlYWRlcjgwMjExLCBESVJfV1JJVEUsIEZBTFNFKTsKKyNlbmRpZgorCisJCQkJaWYgICgocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKSAmJiAocEFkLT5hdGUuTW9kZSAmIEFURV9UWEZSQU1FKSAmJiAocEFkLT5hdGUuVHhEb25lQ291bnQgPCBwQWQtPmF0ZS5UeENvdW50KSkKKwkJCQl7CisJCQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRCeXRlQ291bnQgKz0gIChwVHhELT5TRExlbjEgKyBwVHhELT5TRExlbjApOworCQkJCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0RtYURvbmVDb3VudFtRdWVJZHhdICsrOworCQkJCQlJTkNfUklOR19JTkRFWChwVHhSaW5nLT5UeFN3RnJlZUlkeCwgVFhfUklOR19TSVpFKTsKKwkJCQkJLyogZ2V0IHR4X3RkeF9pZHggYWdhaW4gKi8KKwkJCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYMCArIFF1ZUlkeCAqIFJJTkdSRUdfRElGRiAsICAmcFR4UmluZy0+VHhEbWFJZHgpOworCQkJCQlnb3RvIGtpY2tfb3V0OworCQkJCX0KKwkJCQllbHNlIGlmICgocEFkLT5hdGUuVHhTdGF0dXMgPT0gMSkvKiBvciAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKSA/Pz8gKi8gJiYgKHBBZC0+YXRlLlR4RG9uZUNvdW50ID09IHBBZC0+YXRlLlR4Q291bnQpKS8vPD09PT09PT09PT09PT09PT09PT09PT09PVBFVEVSCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoImFsbCBUeCBpcyBkb25lXG4iKSk7CisJCQkJCS8vIFR4IHN0YXR1cyBlbnRlcnMgaWRsZSBtb2RlLgorCQkJCQlwQWQtPmF0ZS5UeFN0YXR1cyA9IDA7CisJCQkJfQorCQkJCWVsc2UgaWYgKCEocEFkLT5hdGUuTW9kZSAmIEFURV9UWEZSQU1FKSkKKwkJCQl7CisJCQkJCS8qIG5vdCBjb21wbGV0ZSBzZW5kaW5nIHlldCwgYnV0IHNvbWVvbmUgcHJlc3MgdGhlIFN0b3AgVFggYm90dG9uLiAqLworCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIm5vdCBjb21wbGV0ZSBzZW5kaW5nIHlldCwgYnV0IHNvbWVvbmUgcHJlc3NlZCB0aGUgU3RvcCBUWCBib3R0b21cbiIpKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJwQWQtPmF0ZS5Nb2RlID0gMHglMDJ4XG4iLCBwQWQtPmF0ZS5Nb2RlKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwoInBUeFJpbmctPlR4U3dGcmVlSWR4ID0gJWRcbiIsIHBUeFJpbmctPlR4U3dGcmVlSWR4KSk7CisgIAkJCQl9CisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKwkgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwT3JpVHhELCBwVHhELCBzaXplb2YoVFhEX1NUUlVDKSk7CisjZWxzZQorICAgICAgICAJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworICAgICAgICAJCSpwRGVzdFR4RCA9IFR4RDsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisKKwkJCQlJTkNfUklOR19JTkRFWChwVHhSaW5nLT5UeFN3RnJlZUlkeCwgVFhfUklOR19TSVpFKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisJCS8vIHN0YXRpYyByYXRlIGFsc28gbmVlZCBOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMoKSBmdW5jdGlvbi4KKwkJLy9pZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKSkKKwkJCU5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycyhwQWQpOworCisJCS8qIE5vdGUgOiBJZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKSwgd2Ugd2lsbCBuZXZlciByZWFjaCBoZXJlLiAqLworCQlGUkVFKys7CisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKyAgICAgICAgICAgICAgICBwVHhEID0gKFBUWERfU1RSVUMpIChwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5BbGxvY1ZhKTsKKwkJcE9yaVR4RCA9IHBUeEQ7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoJlR4RCwgcFR4RCwgc2l6ZW9mKFRYRF9TVFJVQykpOworCQlwVHhEID0gJlR4RDsKKyNlbHNlCisgICAgICAgIHBEZXN0VHhEID0gKFBUWERfU1RSVUMpIChwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5BbGxvY1ZhKTsKKyAgICAgICAgcE9yaVR4RCA9IHBEZXN0VHhEIDsKKyAgICAgICAgVHhEID0gKnBEZXN0VHhEOworICAgICAgICBwVHhEID0gJlR4RDsKKyAgICAgICAgUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisjZW5kaWYKKworCQlwVHhELT5ETUFET05FID0gMDsKKworCisjaWZkZWYgUkFMSU5LX0FURQorCQkvKiBFeGVjdXRpb24gb2YgdGhpcyBibG9jayBpcyBub3QgYWxsb3dlZCB3aGVuIEFURSBpcyBydW5uaW5nLiAqLworCQlpZiAoIShBVEVfT04ocEFkKSkpCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisJCXsKKwkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5wTmRpc1BhY2tldDsKKwkJCWlmIChwUGFja2V0KQorCQkJeworI2lmZGVmIENPTkZJR181VlRfRU5IQU5DRQorCQkJCWlmIChSVE1QX0dFVF9QQUNLRVRfNVZUKHBQYWNrZXQpKQorCQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCAxNiwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJZWxzZQorI2VuZGlmIC8vIENPTkZJR181VlRfRU5IQU5DRSAvLworCQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCBwVHhELT5TRExlbjEsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJCX0KKwkJCS8vQWx3YXlzIGFzc2lnbiBwTmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCisJCQlwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5wTmRpc1BhY2tldCA9IE5VTEw7CisKKwkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5wTmV4dE5kaXNQYWNrZXQ7CisKKwkJCUFTU0VSVChwUGFja2V0ID09IE5VTEwpOworCQkJaWYgKHBQYWNrZXQpCisJCQl7CisjaWZkZWYgQ09ORklHXzVWVF9FTkhBTkNFCisJCQkJaWYgKFJUTVBfR0VUX1BBQ0tFVF81VlQocFBhY2tldCkpCisJCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsIDE2LCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQllbHNlCisjZW5kaWYgLy8gQ09ORklHXzVWVF9FTkhBTkNFIC8vCisJCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsIHBUeEQtPlNETGVuMSwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkJfQorCQkJLy9BbHdheXMgYXNzaWduIHBOZXh0TmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCisJCQlwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOworCQl9CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQnl0ZUNvdW50ICs9ICAocFR4RC0+U0RMZW4xICsgcFR4RC0+U0RMZW4wKTsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNEbWFEb25lQ291bnRbUXVlSWR4XSArKzsKKwkJSU5DX1JJTkdfSU5ERVgocFR4UmluZy0+VHhTd0ZyZWVJZHgsIFRYX1JJTkdfU0laRSk7CisJCS8qIGdldCB0eF90ZHhfaWR4IGFnYWluICovCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfRFRYX0lEWDAgKyBRdWVJZHggKiBSSU5HUkVHX0RJRkYgLCAgJnBUeFJpbmctPlR4RG1hSWR4KTsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgICAgIFJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworICAgICAgICAqcERlc3RUeEQgPSBUeEQ7CisjZWxzZQorICAgICAgICBOZGlzTW92ZU1lbW9yeShwT3JpVHhELCBwVHhELCBzaXplb2YoVFhEX1NUUlVDKSk7CisjZW5kaWYKKworI2lmZGVmIFJBTElOS19BVEUKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQora2lja19vdXQ6CisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKworCQkvLworCQkvLyBBVEVfVFhDT05UIG1vZGUgYWxzbyBuZWVkIHRvIHNlbmQgc29tZSBub3JtYWwgZnJhbWVzLCBzbyBsZXQgaXQgaW4uCisJCS8vIEFURV9TVE9QIG11c3QgYmUgY2hhbmdlZCBub3QgdG8gYmUgMHhmZgorCQkvLyB0byBwcmV2ZW50IGl0IGZyb20gcnVubmluZyBpbnRvIHRoaXMgYmxvY2suCisJCS8vCisJCWlmICgocEFkLT5hdGUuTW9kZSAmIEFURV9UWEZSQU1FKSAmJiAocEFkLT5hdGUuUUlEID09IFF1ZUlkeCkpCisJCXsKKwkJCS8vIFR4RG9uZUNvdW50KysgaGFzIGJlZW4gZG9uZSBpZiBRQSBpcyB1c2VkLgorCQkJaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gRkFMU0UpCisJCQl7CisJCQkJcEFkLT5hdGUuVHhEb25lQ291bnQrKzsKKwkJCX0KKwkJCWlmICgoKHBBZC0+YXRlLlR4Q291bnQgLSBwQWQtPmF0ZS5UeERvbmVDb3VudCArIDEpID49IFRYX1JJTkdfU0laRSkpCisJCQl7CisJCQkJLyogTm90ZSA6IFdlIGluY3JlYXNlIFR4Q3B1SWR4IGhlcmUsIG5vdCBUeFN3RnJlZUlkeCAhICovCisJCQkJSU5DX1JJTkdfSU5ERVgocEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeCwgVFhfUklOR19TSVpFKTsKKyNpZm5kZWYgUlRfQklHX0VORElBTi8vPD09PT09PT09PT09PT09PT09PT09PT09PT09UEVURVIKKwkJCQlwVHhEID0gKFBUWERfU1RSVUMpIChwVHhSaW5nLT5DZWxsW3BBZC0+VHhSaW5nW1F1ZUlkeF0uVHhDcHVJZHhdLkFsbG9jVmEpOworCQkJCXBPcmlUeEQgPSBwVHhEOworCQkgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZUeEQsIHBUeEQsIHNpemVvZihUWERfU1RSVUMpKTsKKwkJCQlwVHhEID0gJlR4RDsKKyNlbHNlCisJCSAgICAgICAgcERlc3RUeEQgPSAoUFRYRF9TVFJVQykgKHBUeFJpbmctPkNlbGxbcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeF0uQWxsb2NWYSk7CisJCSAgICAgICAgcE9yaVR4RCA9IHBEZXN0VHhEIDsKKwkJICAgICAgICBUeEQgPSAqcERlc3RUeEQ7CisJCSAgICAgICAgcFR4RCA9ICZUeEQ7CisJCSAgICAgICAgUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisjZW5kaWYKKwkJCQlwVHhELT5ETUFET05FID0gMDsKKyNpZm5kZWYgUlRfQklHX0VORElBTi8vPD09PT09PT09PT09PT09PT09PT09PT09PT09UEVURVIKKyAgICAgICAgCQlOZGlzTW92ZU1lbW9yeShwT3JpVHhELCBwVHhELCBzaXplb2YoVFhEX1NUUlVDKSk7CisjZWxzZQorICAgICAgICAJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworICAgICAgICAJCSpwRGVzdFR4RCA9IFR4RDsKKyNlbmRpZgorCQkJCS8vIGtpY2sgVHgtUmluZy4KKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DVFhfSURYMCArIFF1ZUlkeCAqIFJJTkdSRUdfRElGRiwgcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeCk7CisJCQkJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOworCQkJfQorCQl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCX0KKworCisJcmV0dXJuICBiUmVzY2hlZHVsZTsKKworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlQcm9jZXNzIFRYIFJpbmdzIERNQSBEb25lIGludGVycnVwdCwgcnVubmluZyBpbiBEUEMgbGV2ZWwKKworCUFyZ3VtZW50czoKKwkJQWRhcHRlciAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4JUlRNUEhhbmRsZVR4UmluZ0RtYURvbmVJbnRlcnJ1cHQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JSU5UX1NPVVJDRV9DU1JfU1RSVUMgVHhSaW5nQml0bWFwKQoreworICAgIHVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7CisJQk9PTEVBTgkJCWJSZXNjaGVkdWxlID0gRkFMU0U7CisKKwkvLyBNYWtlIHN1cmUgVHggcmluZyByZXNvdXJjZSB3b24ndCBiZSB1c2VkIGJ5IG90aGVyIHRocmVhZHMKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKKworCWlmIChUeFJpbmdCaXRtYXAuZmllbGQuQWMwRG1hRG9uZSkKKwkJYlJlc2NoZWR1bGUgPSBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRSURfQUNfQkUpOworCisJaWYgKFR4UmluZ0JpdG1hcC5maWVsZC5IY2NhRG1hRG9uZSkKKwkJYlJlc2NoZWR1bGUgfD0gUlRNUEZyZWVUWERVcG9uVHhEbWFEb25lKHBBZCwgUUlEX0hDQ0EpOworCisJaWYgKFR4UmluZ0JpdG1hcC5maWVsZC5BYzNEbWFEb25lKQorCQliUmVzY2hlZHVsZSB8PSBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRSURfQUNfVk8pOworCisJaWYgKFR4UmluZ0JpdG1hcC5maWVsZC5BYzJEbWFEb25lKQorCQliUmVzY2hlZHVsZSB8PSBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRSURfQUNfVkkpOworCisJaWYgKFR4UmluZ0JpdG1hcC5maWVsZC5BYzFEbWFEb25lKQorCQliUmVzY2hlZHVsZSB8PSBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRSURfQUNfQkspOworCisJLy8gTWFrZSBzdXJlIHRvIHJlbGVhc2UgVHggcmluZyByZXNvdXJjZQorCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworCisJLy8gRGVxdWV1ZSBvdXRnb2luZyBmcmFtZXMgZnJvbSBUeFN3UXVldWVbXSBhbmQgcHJvY2VzcyBpdAorCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7CisKKwlyZXR1cm4gIGJSZXNjaGVkdWxlOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlQcm9jZXNzIE1HTVQgcmluZyBETUEgZG9uZSBpbnRlcnJ1cHQsIHJ1bm5pbmcgaW4gRFBDIGxldmVsCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBIYW5kbGVNZ210UmluZ0RtYURvbmVJbnRlcnJ1cHQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJUFRYRF9TVFJVQwkgcFR4RDsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgUFRYRF9TVFJVQyAgICAgIHBEZXN0VHhEOworICAgIFRYRF9TVFJVQyAgICAgICBUeEQ7CisjZW5kaWYKKwlQTkRJU19QQUNLRVQgcFBhY2tldDsKKwlVQ0hBUglGUkVFID0gMDsKKwlQUlRNUF9NR01UX1JJTkcgcE1nbXRSaW5nID0gJnBBZC0+TWdtdFJpbmc7CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1nbXRSaW5nTG9jayk7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX01HTVREVFhfSURYLCAmcE1nbXRSaW5nLT5UeERtYUlkeCk7CisJd2hpbGUgKHBNZ210UmluZy0+VHhTd0ZyZWVJZHghPSBwTWdtdFJpbmctPlR4RG1hSWR4KQorCXsKKwkJRlJFRSsrOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICAgICAgcERlc3RUeEQgPSAoUFRYRF9TVFJVQykgKHBNZ210UmluZy0+Q2VsbFtwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4XS5BbGxvY1ZhKTsKKyAgICAgICAgVHhEID0gKnBEZXN0VHhEOworICAgICAgICBwVHhEID0gJlR4RDsKKwkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisjZWxzZQorCQlwVHhEID0gKFBUWERfU1RSVUMpIChwTWdtdFJpbmctPkNlbGxbcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeF0uQWxsb2NWYSk7CisjZW5kaWYKKwkJcFR4RC0+RE1BRE9ORSA9IDA7CisJCXBQYWNrZXQgPSBwTWdtdFJpbmctPkNlbGxbcE1nbXRSaW5nLT5UeFN3RnJlZUlkeF0ucE5kaXNQYWNrZXQ7CisKKworCQlpZiAocFBhY2tldCkKKwkJeworCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMCwgcFR4RC0+U0RMZW4wLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJfQorCQlwTWdtdFJpbmctPkNlbGxbcE1nbXRSaW5nLT5UeFN3RnJlZUlkeF0ucE5kaXNQYWNrZXQgPSBOVUxMOworCisJCXBQYWNrZXQgPSBwTWdtdFJpbmctPkNlbGxbcE1nbXRSaW5nLT5UeFN3RnJlZUlkeF0ucE5leHROZGlzUGFja2V0OworCQlpZiAocFBhY2tldCkKKwkJeworCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMSwgcFR4RC0+U0RMZW4xLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJfQorCQlwTWdtdFJpbmctPkNlbGxbcE1nbXRSaW5nLT5UeFN3RnJlZUlkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKwkJSU5DX1JJTkdfSU5ERVgocE1nbXRSaW5nLT5UeFN3RnJlZUlkeCwgTUdNVF9SSU5HX1NJWkUpOworCisjaWZkZWYgUlRfQklHX0VORElBTgorICAgICAgICBSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKKyAgICAgICAgV3JpdGVCYWNrVG9EZXNjcmlwdG9yKChQVUNIQVIpcERlc3RUeEQsIChQVUNIQVIpcFR4RCwgVFJVRSwgVFlQRV9UWEQpOworI2VuZGlmCisJfQorCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWdtdFJpbmdMb2NrKTsKKworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCUFyZ3VtZW50czoKKwkJQWRhcHRlciAJUG9pbnRlciB0byBvdXIgYWRhcHRlci4gRGVxdWV1ZSBhbGwgcG93ZXIgc2FmZSBkZWxheWVkIGJyYW9kY2FzdCBmcmFtZXMgYWZ0ZXIgYmVhY29uLgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBIYW5kbGVUQlRUSW50ZXJydXB0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCXsKKwkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCisJCXsKKwkJfQorCX0KK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIuIFJld3JpdGUgYmVhY29uIGNvbnRlbnQgYmVmb3JlIG5leHQgc2VuZC1vdXQuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUEhhbmRsZVByZVRCVFRJbnRlcnJ1cHQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJeworCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUEhhbmRsZVByZVRCVFRJbnRlcnJ1cHQuLi5cbiIpKTsKKwkJfQorCX0KKworCit9CisKK1ZPSUQJUlRNUEhhbmRsZVJ4Q29oZXJlbnRJbnRlcnJ1cHQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJV1BETUFfR0xPX0NGR19TVFJVQwlHbG9DZmc7CisKKwlpZiAocEFkID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiBwQWQgaXMgTlVMTCwgcmV0dXJuLlxuIikpOworCQlyZXR1cm47CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IFJUTVBIYW5kbGVSeENvaGVyZW50SW50ZXJydXB0IFxuIikpOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHICwgJkdsb0NmZy53b3JkKTsKKworCUdsb0NmZy5maWVsZC5FblRYV3JpdGVCYWNrRERPTkUgPSAwOworCUdsb0NmZy5maWVsZC5FbmFibGVSeERNQSA9IDA7CisJR2xvQ2ZnLmZpZWxkLkVuYWJsZVR4RE1BID0gMDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7CisKKwlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkUpOworCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19CSyk7CisJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZJKTsKKwlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVk8pOworCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9IQ0NBKTsKKwlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfTUdNVCk7CisJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX1JYKTsKKworCVJUTVBFbmFibGVSeFR4KHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gUlRNUEhhbmRsZVJ4Q29oZXJlbnRJbnRlcnJ1cHQgXG4iKSk7Cit9CisKKworVk9JRCBEQkdQUklOVF9UWF9SSU5HKAorCUlOIFBSVE1QX0FEQVBURVIgIHBBZCwKKwlJTiBVQ0hBUiAgICAgICAgICBRdWVJZHgpCit7CisJVUlOVDMyCQlBYzBCYXNlOworCVVJTlQzMgkJQWMwSHdJZHggPSAwLCBBYzBTd0lkeCA9IDAsIEFDMGZyZWVJZHg7CisJaW50CQkJaTsKKwlQVUxPTkcJcHRlbXA7CisKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAiICApKTsKKwlzd2l0Y2ggKFF1ZUlkeCkKKwl7CisJCWNhc2UgUUlEX0FDX0JFOgorCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQVNFX1BUUjAsICZBYzBCYXNlKTsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQ1RYX0lEWDAsICZBYzBTd0lkeCk7CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0RUWF9JRFgwLCAmQWMwSHdJZHgpOworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkFsbCBRSURfQUNfQkUgREVTQ1JJUFRPUiAgXG4gIiAgKSk7CisJCQlmb3IgKGk9MDtpPFRYX1JJTkdfU0laRTtpKyspCisJCQl7CisJCQkJcHRlbXA9IChQVUxPTkcpcEFkLT5UeFJpbmdbUUlEX0FDX0JFXS5DZWxsW2ldLkFsbG9jVmE7CisJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIlslMDJkXSAgJTA4bHg6ICUwOGx4OiAlMDhseDogJTA4bHhcbiAiICwgaSwgKnB0ZW1wLCoocHRlbXArMSksKihwdGVtcCsyKSwqKHB0ZW1wKzMpKSk7CisJCQl9CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiICBcbiAiICApKTsKKwkJCWJyZWFrOworCQljYXNlIFFJRF9BQ19CSzoKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFTRV9QVFIxLCAmQWMwQmFzZSk7CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0NUWF9JRFgxLCAmQWMwU3dJZHgpOworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYMSwgJkFjMEh3SWR4KTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJBbGwgUUlEX0FDX0JLIERFU0NSSVBUT1IgIFxuICIgICkpOworCQkJZm9yIChpPTA7aTxUWF9SSU5HX1NJWkU7aSsrKQorCQkJeworCQkJCXB0ZW1wPSAoUFVMT05HKXBBZC0+VHhSaW5nW1FJRF9BQ19CS10uQ2VsbFtpXS5BbGxvY1ZhOworCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJbJTAyZF0gICUwOGx4OiAlMDhseDogJTA4bHg6ICUwOGx4XG4gIiAsIGksICpwdGVtcCwqKHB0ZW1wKzEpLCoocHRlbXArMiksKihwdGVtcCszKSkpOworCQkJfQorCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiAgXG4gIiAgKSk7CisJCQlicmVhazsKKwkJY2FzZSBRSURfQUNfVkk6CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBU0VfUFRSMiwgJkFjMEJhc2UpOworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9DVFhfSURYMiwgJkFjMFN3SWR4KTsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfRFRYX0lEWDIsICZBYzBId0lkeCk7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQWxsIFFJRF9BQ19WSSBERVNDUklQVE9SIFxuICIgICkpOworCQkJZm9yIChpPTA7aTxUWF9SSU5HX1NJWkU7aSsrKQorCQkJeworCQkJCXB0ZW1wPSAoUFVMT05HKXBBZC0+VHhSaW5nW1FJRF9BQ19WSV0uQ2VsbFtpXS5BbGxvY1ZhOworCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJbJTAyZF0gICUwOGx4OiAlMDhseDogJTA4bHg6ICUwOGx4XG4gIiAsIGksICpwdGVtcCwqKHB0ZW1wKzEpLCoocHRlbXArMiksKihwdGVtcCszKSkpOworCQkJfQorCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiAgXG4gIiAgKSk7CisJCQlicmVhazsKKwkJY2FzZSBRSURfQUNfVk86CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBU0VfUFRSMywgJkFjMEJhc2UpOworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9DVFhfSURYMywgJkFjMFN3SWR4KTsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfRFRYX0lEWDMsICZBYzBId0lkeCk7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQWxsIFFJRF9BQ19WTyBERVNDUklQVE9SIFxuICIgICkpOworCQkJZm9yIChpPTA7aTxUWF9SSU5HX1NJWkU7aSsrKQorCQkJeworCQkJCXB0ZW1wPSAoUFVMT05HKXBBZC0+VHhSaW5nW1FJRF9BQ19WT10uQ2VsbFtpXS5BbGxvY1ZhOworCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJbJTAyZF0gICUwOGx4OiAlMDhseDogJTA4bHg6ICUwOGx4XG4gIiAsIGksICpwdGVtcCwqKHB0ZW1wKzEpLCoocHRlbXArMiksKihwdGVtcCszKSkpOworCQkJfQorCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiAgXG4gIiAgKSk7CisJCQlicmVhazsKKwkJY2FzZSBRSURfTUdNVDoKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFTRV9QVFI1LCAmQWMwQmFzZSk7CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0NUWF9JRFg1LCAmQWMwU3dJZHgpOworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYNSwgJkFjMEh3SWR4KTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIgQWxsIFFJRF9NR01UICBERVNDUklQVE9SIFxuICIgICkpOworCQkJZm9yIChpPTA7aTxNR01UX1JJTkdfU0laRTtpKyspCisJCQl7CisJCQkJcHRlbXA9IChQVUxPTkcpcEFkLT5NZ210UmluZy5DZWxsW2ldLkFsbG9jVmE7CisJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIlslMDJkXSAgJTA4bHg6ICUwOGx4OiAlMDhseDogJTA4bHhcbiAiICwgaSwgKnB0ZW1wLCoocHRlbXArMSksKihwdGVtcCsyKSwqKHB0ZW1wKzMpKSk7CisJCQl9CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiICBcbiAiICApKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlEQkdQUklOVF9FUlIoKCJEQkdQUklOVF9UWF9SSU5HKFJpbmcgJWQpIG5vdCBzdXBwb3J0ZWRcbiIsIFF1ZUlkeCkpOworCQkJYnJlYWs7CisJfQorCUFDMGZyZWVJZHggPSBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4U3dGcmVlSWR4OworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJUeFJpbmclZCwgVFhfRFRYX0lEWD0lZCwgVFhfQ1RYX0lEWD0lZFxuIiwgUXVlSWR4LCBBYzBId0lkeCwgQWMwU3dJZHgpKTsKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCIgCVR4U3dGcmVlSWR4WyVkXSIsIEFDMGZyZWVJZHgpKTsKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCIJcGVuZGluZy1ORElTPSVsZFxuIiwgcEFkLT5SYWxpbmtDb3VudGVycy5QZW5kaW5nTmRpc1BhY2tldENvdW50KSk7CisKKworfQorCisKK1ZPSUQgREJHUFJJTlRfUlhfUklORygKKwlJTiBQUlRNUF9BREFQVEVSICBwQWQpCit7CisJVUlOVDMyCQlBYzBCYXNlOworCVVJTlQzMgkJQWMwSHdJZHggPSAwLCBBYzBTd0lkeCA9IDAsIEFDMGZyZWVJZHg7CisJaW50CQkJaTsKKwlVSU5UMzIJKnB0ZW1wOworCisJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIiAgKSk7CisJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9CQVNFX1BUUiwgJkFjMEJhc2UpOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfQ1JYX0lEWCwgJkFjMFN3SWR4KTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX0RSWF9JRFgsICZBYzBId0lkeCk7CisJQUMwZnJlZUlkeCA9IHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4OworCisJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkFsbCBSWCBEU1AgIFxuICIgICkpOworCWZvciAoaT0wO2k8UlhfUklOR19TSVpFO2krKykKKwl7CisJCXB0ZW1wID0gKFVJTlQzMiAqKXBBZC0+UnhSaW5nLkNlbGxbaV0uQWxsb2NWYTsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIlslMDJkXSAgJTA4eDogJTA4eDogJTA4eDogJTA4eFxuICIgLCBpLCAqcHRlbXAsKihwdGVtcCsxKSwqKHB0ZW1wKzIpLCoocHRlbXArMykpKTsKKwl9CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSeFJpbmcsIFJYX0RSWF9JRFg9JWQsIFJYX0NSWF9JRFg9JWQgXG4iLCBBYzBId0lkeCwgQWMwU3dJZHgpKTsKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCIgCVJ4U3dSZWFkSWR4IFslZF09IiwgQUMwZnJlZUlkeCkpOworCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIglwZW5kaW5nLU5ESVM9JWxkXG4iLCBwQWQtPlJhbGlua0NvdW50ZXJzLlBlbmRpbmdOZGlzUGFja2V0Q291bnQpKTsKK30KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVN1c3BlbmQgTVNEVSB0cmFuc21pc3Npb24KKworCUFyZ3VtZW50czoKKwkJcEFkIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBTdXNwZW5kTXNkdVRyYW5zbWlzc2lvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNDQU5OSU5HLCBzdXNwZW5kIE1TRFUgdHJhbnNtaXNzaW9uIC4uLlxuIikpOworCisKKwkvLworCS8vIEJlZm9yZSBCU1NfU0NBTl9JTl9QUk9HUkVTUywgd2UgbmVlZCB0byBrZWVwIEN1cnJlbnQgUjY2IHZhbHVlIGFuZAorCS8vIHVzZSBMb3dib3VuZCBhcyBSNjYgdmFsdWUgb24gU2Nhbk5leHRDaGFubmVsKC4uLikKKwkvLworCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsICZwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUpOworCisJLy8gc2V0IEJCUF9SNjYgdG8gMHgzMC8weDQwIHdoZW4gc2Nhbm5pbmcgKEFzaWNTd2l0Y2hDaGFubmVsIHdpbGwgc2V0IFI2NiBhY2NvcmRpbmcgdG8gY2hhbm5lbCB3aGVuIHNjYW5uaW5nKQorCVJUTVBTZXRBR0NJbml0VmFsdWUocEFkLCBCV18yMCk7CisKKwlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUyk7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJlc3VtZSBNU0RVIHRyYW5zbWlzc2lvbgorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QUmVzdW1lTXNkdVRyYW5zbWlzc2lvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNDQU4gZG9uZSwgcmVzdW1lIE1TRFUgdHJhbnNtaXNzaW9uIC4uLlxuIikpOworCisKKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgcEFkLT5CYnBUdW5pbmcuUjY2Q3VycmVudFZhbHVlKTsKKworCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpOworCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7Cit9CisKKworVUlOVCBkZWFnZ3JlZ2F0ZV9BTVNEVV9hbm5vdW5jZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlQTkRJU19QQUNLRVQJCXBQYWNrZXQsCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEYXRhU2l6ZSkKK3sKKwlVU0hPUlQgCQkJUGF5bG9hZFNpemU7CisJVVNIT1JUIAkJCVN1YkZyYW1lU2l6ZTsKKwlQSEVBREVSXzgwMl8zIAlwQU1TRFVzdWJoZWFkZXI7CisJVUlOVAkJCW5NU0RVOworICAgIFVDSEFSCQkJSGVhZGVyODAyXzNbMTRdOworCisJUFVDSEFSCQkJcFBheWxvYWQsIHBEQSwgcFNBLCBwUmVtb3ZlZExMQ1NOQVA7CisJUE5ESVNfUEFDS0VUCXBDbG9uZVBhY2tldDsKKworCisKKwluTVNEVSA9IDA7CisKKwl3aGlsZSAoRGF0YVNpemUgPiBMRU5HVEhfODAyXzMpCisJeworCisJCW5NU0RVKys7CisKKwkJcEFNU0RVc3ViaGVhZGVyID0gKFBIRUFERVJfODAyXzMpcERhdGE7CisJCVBheWxvYWRTaXplID0gcEFNU0RVc3ViaGVhZGVyLT5PY3RldFsxXSArIChwQU1TRFVzdWJoZWFkZXItPk9jdGV0WzBdPDw4KTsKKwkJU3ViRnJhbWVTaXplID0gUGF5bG9hZFNpemUgKyBMRU5HVEhfODAyXzM7CisKKworCQlpZiAoKERhdGFTaXplIDwgU3ViRnJhbWVTaXplKSB8fCAoUGF5bG9hZFNpemUgPiAxNTE4ICkpCisJCXsKKwkJCWJyZWFrOworCQl9CisKKwkJcFBheWxvYWQgPSBwRGF0YSArIExFTkdUSF84MDJfMzsKKwkJcERBID0gcERhdGE7CisJCXBTQSA9IHBEYXRhICsgTUFDX0FERFJfTEVOOworCisJCS8vIGNvbnZlcnQgdG8gODAyLjMgaGVhZGVyCisgICAgICAgIENPTlZFUlRfVE9fODAyXzMoSGVhZGVyODAyXzMsIHBEQSwgcFNBLCBwUGF5bG9hZCwgUGF5bG9hZFNpemUsIHBSZW1vdmVkTExDU05BUCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJaWYgKChIZWFkZXI4MDJfM1sxMl0gPT0gMHg4OCkgJiYgKEhlYWRlcjgwMl8zWzEzXSA9PSAweDhFKSApCisJCXsKKwkJICAgIC8vIGF2b2lkIGxvY2FsIGhlYXAgb3ZlcmZsb3csIHVzZSBkeWFuYW1pYyBhbGxvY2F0aW9uCisJCSAgIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOworCQkgICBtZW1tb3ZlKEVsZW0tPk1zZysoTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IKSwgcFBheWxvYWQsIFBheWxvYWRTaXplKTsKKwkJICAgRWxlbS0+TXNnTGVuID0gTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IICsgUGF5bG9hZFNpemU7CisJCSAgIFdwYUVBUE9MS2V5QWN0aW9uKHBBZCwgRWxlbSk7CisJCSAgIGtmcmVlKEVsZW0pOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCSAgICAgICAgCWlmIChwUmVtb3ZlZExMQ1NOQVApCisJICAgICAgICAJeworCSAgICAJCQlwUGF5bG9hZCAtPSBMRU5HVEhfODAyXzM7CisJICAgIAkJCVBheWxvYWRTaXplICs9IExFTkdUSF84MDJfMzsKKwkgICAgCQkJTmRpc01vdmVNZW1vcnkocFBheWxvYWQsICZIZWFkZXI4MDJfM1swXSwgTEVOR1RIXzgwMl8zKTsKKwkgICAgICAgIAl9CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQlwQ2xvbmVQYWNrZXQgPSBDbG9uZVBhY2tldChwQWQsIHBQYWNrZXQsIHBQYXlsb2FkLCBQYXlsb2FkU2l6ZSk7CisJCWlmIChwQ2xvbmVQYWNrZXQpCisJCXsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQocEFkLCBwQ2xvbmVQYWNrZXQsIFJUTVBfR0VUX1BBQ0tFVF9JRihwUGFja2V0KSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCX0KKworCisJCS8vIEEtTVNEVSBoYXMgcGFkZGluZyB0byBtdWx0aXBsZSBvZiA0IGluY2x1ZGluZyBzdWJmcmFtZSBoZWFkZXIuCisJCS8vIGFsaWduIFN1YkZyYW1lU2l6ZSB1cCB0byBtdWx0aXBsZSBvZiA0CisJCVN1YkZyYW1lU2l6ZSA9IChTdWJGcmFtZVNpemUrMykmKH4weDMpOworCisKKwkJaWYgKFN1YkZyYW1lU2l6ZSA+IDE1MjggfHwgU3ViRnJhbWVTaXplIDwgMzIpCisJCXsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKERhdGFTaXplID4gU3ViRnJhbWVTaXplKQorCQl7CisJCQlwRGF0YSArPSBTdWJGcmFtZVNpemU7CisJCQlEYXRhU2l6ZSAtPSBTdWJGcmFtZVNpemU7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBlbmQgb2YgQS1NU0RVCisJCQlEYXRhU2l6ZSA9IDA7CisJCX0KKwl9CisKKwkvLyBmaW5hbGx5IHJlbGVhc2Ugb3JpZ2luYWwgcnggcGFja2V0CisJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCisJcmV0dXJuIG5NU0RVOworfQorCisKK1VJTlQgQkFfUmVvcmRlcl9BTVNEVV9Bbm5ub3VuY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCit7CisJUFVDSEFSCQkJcERhdGE7CisJVVNIT1JUCQkJRGF0YVNpemU7CisJVUlOVAkJCW5NU0RVID0gMDsKKworCXBEYXRhID0gKFBVQ0hBUikgR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOworCURhdGFTaXplID0gKFVTSE9SVCkgR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7CisKKwluTVNEVSA9IGRlYWdncmVnYXRlX0FNU0RVX2Fubm91bmNlKHBBZCwgcFBhY2tldCwgcERhdGEsIERhdGFTaXplKTsKKworCXJldHVybiBuTVNEVTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUxvb2sgdXAgdGhlIE1BQyBhZGRyZXNzIGluIHRoZSBNQUMgdGFibGUuIFJldHVybiBOVUxMIGlmIG5vdCBmb3VuZC4KKwlSZXR1cm46CisJCXBFbnRyeSAtIHBvaW50ZXIgdG8gdGhlIE1BQyBlbnRyeTsgTlVMTCBpcyBub3QgZm91bmQKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK01BQ19UQUJMRV9FTlRSWSAqTWFjVGFibGVMb29rdXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJUFVDSEFSIHBBZGRyKQoreworCVVMT05HIEhhc2hJZHg7CisJTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSBOVUxMOworCisJSGFzaElkeCA9IE1BQ19BRERSX0hBU0hfSU5ERVgocEFkZHIpOworCXBFbnRyeSA9IHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF07CisKKwl3aGlsZSAocEVudHJ5ICYmIChwRW50cnktPlZhbGlkQXNDTEkgfHwgcEVudHJ5LT5WYWxpZEFzV0RTIHx8IHBFbnRyeS0+VmFsaWRBc0FwQ2xpIHx8IHBFbnRyeS0+VmFsaWRBc01lc2gpKQorCXsKKwkJaWYgKE1BQ19BRERSX0VRVUFMKHBFbnRyeS0+QWRkciwgcEFkZHIpKQorCQl7CisJCQlicmVhazsKKwkJfQorCQllbHNlCisJCQlwRW50cnkgPSBwRW50cnktPnBOZXh0OworCX0KKworCXJldHVybiBwRW50cnk7Cit9CisKK01BQ19UQUJMRV9FTlRSWSAqTWFjVGFibGVJbnNlcnRFbnRyeSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSCQkJcEFkZHIsCisJSU4JVUNIQVIJCQlhcGlkeCwKKwlJTiBCT09MRUFOCUNsZWFuQWxsKQoreworCVVDSEFSIEhhc2hJZHg7CisJaW50IGksIEZpcnN0V2NpZDsKKwlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9IE5VTEwsICpwQ3VyckVudHJ5OworCisJLy8gaWYgRlVMTCwgcmV0dXJuCisJaWYgKHBBZC0+TWFjVGFiLlNpemUgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCXJldHVybiBOVUxMOworCisJRmlyc3RXY2lkID0gMTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCWlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19JTkZSQSkKKwkJRmlyc3RXY2lkID0gMjsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIGFsbG9jYXRlIG9uZSBNQUMgZW50cnkKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCWZvciAoaSA9IEZpcnN0V2NpZDsgaTwgTUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykgICAvLyBza2lwIGVudHJ5IzAgc28gdGhhdCAiZW50cnkgaW5kZXggPT0gQUlEIiBmb3IgZmFzdCBsb29rdXAKKwl7CisJCS8vIHBpY2sgdXAgdGhlIGZpcnN0IGF2YWlsYWJsZSB2YWNhbmN5CisJCWlmICgocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQ0xJID09IEZBTFNFKSAmJgorCQkJKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc1dEUyA9PSBGQUxTRSkgJiYKKwkJCShwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNBcENsaT09IEZBTFNFKSAmJgorCQkJKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc01lc2ggPT0gRkFMU0UpCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCQkmJiAocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzRGxzID09IEZBTFNFKQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJKQorCQl7CisJCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtpXTsKKwkJCWlmIChDbGVhbkFsbCA9PSBUUlVFKQorCQkJeworCQkJCXBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7CisJCQkJcEVudHJ5LT5DdXJyVHhSYXRlID0gUkFURV8xMTsKKwkJCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihNQUNfVEFCTEVfRU5UUlkpKTsKKwkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LktleUxlbiA9IDA7CisJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJCX0KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCWlmIChhcGlkeCA+PSBNSU5fTkVUX0RFVklDRV9GT1JfRExTKQorCQkJeworCQkJCXBFbnRyeS0+VmFsaWRBc0NMSSA9IEZBTFNFOworCQkJCXBFbnRyeS0+VmFsaWRBc1dEUyA9IEZBTFNFOworCQkJCXBFbnRyeS0+VmFsaWRBc0FwQ2xpID0gRkFMU0U7CisJCQkJcEVudHJ5LT5WYWxpZEFzTWVzaCA9IEZBTFNFOworCQkJCXBFbnRyeS0+VmFsaWRBc0RscyA9IFRSVUU7CisJCQkJcEVudHJ5LT5pc0NhY2hlZCA9IEZBTFNFOworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJeworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQl7CisJCQkJCXBFbnRyeS0+VmFsaWRBc0NMSSA9IFRSVUU7CisJCQkJCXBFbnRyeS0+VmFsaWRBc1dEUyA9IEZBTFNFOworCQkJCQlwRW50cnktPlZhbGlkQXNBcENsaSA9IEZBTFNFOworCQkJCQlwRW50cnktPlZhbGlkQXNNZXNoID0gRkFMU0U7CisJCQkJCXBFbnRyeS0+VmFsaWRBc0RscyA9IEZBTFNFOworCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCX0KKworCQkJcEVudHJ5LT5iSUFtQmFkQXRoZXJvcyA9IEZBTFNFOworCQkJcEVudHJ5LT5wQWQgPSBwQWQ7CisJCQlwRW50cnktPkNNVGltZXJSdW5uaW5nID0gRkFMU0U7CisJCQlwRW50cnktPkVucXVldWVFYXBvbFN0YXJ0VGltZXJSdW5uaW5nID0gRUFQT0xfU1RBUlRfRElTQUJMRTsKKwkJCXBFbnRyeS0+UlNOSUVfTGVuID0gMDsKKwkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+Ul9Db3VudGVyLCBzaXplb2YocEVudHJ5LT5SX0NvdW50ZXIpKTsKKwkJCXBFbnRyeS0+UmVUcnlDb3VudGVyID0gUEVFUl9NU0cxX1JFVFJZX1RJTUVSX0NUUjsKKworCQkJaWYgKHBFbnRyeS0+VmFsaWRBc01lc2gpCisJCQkJcEVudHJ5LT5hcGlkeCA9IChhcGlkeCAtIE1JTl9ORVRfREVWSUNFX0ZPUl9NRVNIKTsKKwkJCWVsc2UgaWYgKHBFbnRyeS0+VmFsaWRBc0FwQ2xpKQorCQkJCXBFbnRyeS0+YXBpZHggPSAoYXBpZHggLSBNSU5fTkVUX0RFVklDRV9GT1JfQVBDTEkpOworCQkJZWxzZSBpZiAocEVudHJ5LT5WYWxpZEFzV0RTKQorCQkJCXBFbnRyeS0+YXBpZHggPSAoYXBpZHggLSBNSU5fTkVUX0RFVklDRV9GT1JfV0RTKTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCWVsc2UgaWYgKHBFbnRyeS0+VmFsaWRBc0RscykKKwkJCQlwRW50cnktPmFwaWR4ID0gKGFwaWR4IC0gTUlOX05FVF9ERVZJQ0VfRk9SX0RMUyk7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQllbHNlCisJCQkJcEVudHJ5LT5hcGlkeCA9IGFwaWR4OworCisJCQl7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCXsKKwkJCQkJcEVudHJ5LT5BdXRoTW9kZSA9IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlOworCQkJCQlwRW50cnktPldlcFN0YXR1cyA9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKKwkJCQkJcEVudHJ5LT5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXJBY2NlcHRBbGw7CisjaWZkZWYgUlQyODYwCisJCQkJCUFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KHBBZCwgcEVudHJ5LT5hcGlkeCwgKFVDSEFSKWkpOworI2VuZGlmIC8vIFJUMjg2MCAvLworCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCX0KKworCQkJcEVudHJ5LT5HVEtTdGF0ZSA9IFJFS0VZX05FR09USUFUSU5HOworCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5LZXlMZW4gPSAwOworCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCWlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYKKwkJCQkocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpKQorCQkJCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwkJCWVsc2UKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCWlmIChwRW50cnktPlZhbGlkQXNEbHMgPT0gVFJVRSkKKwkJCQlwRW50cnktPlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCQllbHNlCisjZW5kaWYgLy9RT1NfRExTX1NVUFBPUlQKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisJCQlwRW50cnktPlBNS0lEX0NhY2hlSWR4ID0gRU5UUllfTk9UX0ZPVU5EOworCQkJQ09QWV9NQUNfQUREUihwRW50cnktPkFkZHIsIHBBZGRyKTsKKwkJCXBFbnRyeS0+U3N0ID0gU1NUX05PVF9BVVRIOworCQkJcEVudHJ5LT5BdXRoU3RhdGUgPSBBU19OT1RfQVVUSDsKKwkJCXBFbnRyeS0+QWlkID0gKFVTSE9SVClpOyAgLy8wOworCQkJcEVudHJ5LT5DYXBhYmlsaXR5SW5mbyA9IDA7CisJCQlwRW50cnktPlBzTW9kZSA9IFBXUl9BQ1RJVkU7CisJCQlwRW50cnktPlBzUUlkbGVDb3VudCA9IDA7CisJCQlwRW50cnktPk5vRGF0YUlkbGVDb3VudCA9IDA7CisJCQlwRW50cnktPkNvbnRpbnVlVHhGYWlsQ250ID0gMDsKKwkJCUluaXRpYWxpemVRdWV1ZUhlYWRlcigmcEVudHJ5LT5Qc1F1ZXVlKTsKKworCisJCQlwQWQtPk1hY1RhYi5TaXplICsrOworCQkJLy8gQWRkIHRoaXMgZW50cnkgaW50byBBU0lDIFJYIFdDSUQgc2VhcmNoIHRhYmxlCisJCQlSVDI4WFhfU1RBX0VOVFJZX0FERChwQWQsIHBFbnRyeSk7CisKKworCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYWNUYWJsZUluc2VydEVudHJ5IC0gYWxsb2NhdGUgZW50cnkgIyVkLCBUb3RhbD0gJWRcbiIsaSwgcEFkLT5NYWNUYWIuU2l6ZSkpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvLyBhZGQgdGhpcyBNQUMgZW50cnkgaW50byBIQVNIIHRhYmxlCisJaWYgKHBFbnRyeSkKKwl7CisJCUhhc2hJZHggPSBNQUNfQUREUl9IQVNIX0lOREVYKHBBZGRyKTsKKwkJaWYgKHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF0gPT0gTlVMTCkKKwkJeworCQkJcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XSA9IHBFbnRyeTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBDdXJyRW50cnkgPSBwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdOworCQkJd2hpbGUgKHBDdXJyRW50cnktPnBOZXh0ICE9IE5VTEwpCisJCQkJcEN1cnJFbnRyeSA9IHBDdXJyRW50cnktPnBOZXh0OworCQkJcEN1cnJFbnRyeS0+cE5leHQgPSBwRW50cnk7CisJCX0KKwl9CisKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCXJldHVybiBwRW50cnk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJRGVsZXRlIGEgc3BlY2lmaWVkIGNsaWVudCBmcm9tIE1BQyB0YWJsZQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gTWFjVGFibGVEZWxldGVFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQgd2NpZCwKKwlJTiBQVUNIQVIgcEFkZHIpCit7CisJVVNIT1JUIEhhc2hJZHg7CisJTUFDX1RBQkxFX0VOVFJZICpwRW50cnksICpwUHJldkVudHJ5LCAqcFByb2JlRW50cnk7CisJQk9PTEVBTiBDYW5jZWxsZWQ7CisKKwlpZiAod2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJcmV0dXJuIEZBTFNFOworCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKworCUhhc2hJZHggPSBNQUNfQUREUl9IQVNIX0lOREVYKHBBZGRyKTsKKwlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFt3Y2lkXTsKKworCWlmIChwRW50cnkgJiYgKHBFbnRyeS0+VmFsaWRBc0NMSSB8fCBwRW50cnktPlZhbGlkQXNBcENsaSB8fCBwRW50cnktPlZhbGlkQXNXRFMgfHwgcEVudHJ5LT5WYWxpZEFzTWVzaAorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorIAkJfHwgcEVudHJ5LT5WYWxpZEFzRGxzCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCSkpCisJeworCQlpZiAoTUFDX0FERFJfRVFVQUwocEVudHJ5LT5BZGRyLCBwQWRkcikpCisJCXsKKworCQkJLy8gRGVsZXRlIHRoaXMgZW50cnkgZnJvbSBBU0lDIG9uLWNoaXAgV0NJRCBUYWJsZQorCQkJUlQyOFhYX1NUQV9FTlRSWV9NQUNfUkVTRVQocEFkLCB3Y2lkKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJLy8gZnJlZSByZXNvdXJjZXMgb2YgQkEKKwkJCUJBU2Vzc2lvblRlYXJEb3duQUxMKHBBZCwgcEVudHJ5LT5BaWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisKKwkJCXBQcmV2RW50cnkgPSBOVUxMOworCQkJcFByb2JlRW50cnkgPSBwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdOworCQkJQVNTRVJUKHBQcm9iZUVudHJ5KTsKKworCQkJLy8gdXBkYXRlIEhhc2ggbGlzdAorCQkJZG8KKwkJCXsKKwkJCQlpZiAocFByb2JlRW50cnkgPT0gcEVudHJ5KQorCQkJCXsKKwkJCQkJaWYgKHBQcmV2RW50cnkgPT0gTlVMTCkKKwkJCQkJeworCQkJCQkJcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XSA9IHBFbnRyeS0+cE5leHQ7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwUHJldkVudHJ5LT5wTmV4dCA9IHBFbnRyeS0+cE5leHQ7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJcFByZXZFbnRyeSA9IHBQcm9iZUVudHJ5OworCQkJCXBQcm9iZUVudHJ5ID0gcFByb2JlRW50cnktPnBOZXh0OworCQkJfSB3aGlsZSAocFByb2JlRW50cnkpOworCisJCQkvLyBub3QgZm91bmQgISEhCisJCQlBU1NFUlQocFByb2JlRW50cnkgIT0gTlVMTCk7CisKKwkJCVJUMjhYWF9TVEFfRU5UUllfS0VZX0RFTChwQWQsIEJTUzAsIHdjaWQpOworCisKKwkJaWYgKHBFbnRyeS0+RW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgIT0gRUFQT0xfU1RBUlRfRElTQUJMRSkKKwkJeworCQkJUlRNUENhbmNlbFRpbWVyKCZwRW50cnktPkVucXVldWVTdGFydEZvclBTS1RpbWVyLCAmQ2FuY2VsbGVkKTsKKwkJCXBFbnRyeS0+RW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgPSBFQVBPTF9TVEFSVF9ESVNBQkxFOworCQl9CisKKworICAgCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2YoTUFDX1RBQkxFX0VOVFJZKSk7CisJCQlwQWQtPk1hY1RhYi5TaXplIC0tOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWFjVGFibGVEZWxldGVFbnRyeTEgLSBUb3RhbD0gJWRcbiIsIHBBZC0+TWFjVGFiLlNpemUpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXByaW50aygiXG4lczogSW1wb3NzaWJsZSBXY2lkID0gJWQgISEhISFcbiIsIF9fZnVuY19fLCB3Y2lkKTsKKwkJfQorCX0KKworCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisKKwkvL1Jlc2V0IG9wZXJhdGluZyBtb2RlIHdoZW4gbm8gU3RhLgorCWlmIChwQWQtPk1hY1RhYi5TaXplID09IDApCisJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUgPSAwOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIDAgLypwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUqLywgKEFMTE5fU0VUUFJPVEVDVCksIFRSVUUsIDAgLypwQWQtPk1hY1RhYi5mQW55U3RhdGlvbk5vbkdGKi8pOworCX0KKworCXJldHVybiBUUlVFOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIHJlc2V0IHRoZSBlbnRpcmUgTUFDIHRhYmxlLiBBbGwgcGFja2V0cyBwZW5kaW5nIGluCisJCXRoZSBwb3dlci1zYXZpbmcgcXVldWVzIGFyZSBmcmVlZCBoZXJlLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWFjVGFibGVSZXNldCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgcEFkKQoreworCWludCAgICAgICAgIGk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYWNUYWJsZVJlc2V0XG4iKSk7CisJLy9OZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCisJZm9yIChpPTE7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKKwl7CisjaWZkZWYgUlQyODYwCisJCVJUMjhYWF9TVEFfRU5UUllfTUFDX1JFU0VUKHBBZCwgaSk7CisjZW5kaWYgLy8gUlQyODYwIC8vCisJCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNDTEkgPT0gVFJVRSkKKwkgICB7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCS8vIGZyZWUgcmVzb3VyY2VzIG9mIEJBCisJCQlCQVNlc3Npb25UZWFyRG93bkFMTChwQWQsIGkpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCQlwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNDTEkgPSBGQUxTRTsKKworCisKKworCQkJLy9Bc2ljRGVsV2NpZFRhYihwQWQsIGkpOworCQl9CisJfQorCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBBc3NvY1Bhcm1GaWxsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE9VVCBNTE1FX0FTU09DX1JFUV9TVFJVQ1QgKkFzc29jUmVxLAorCUlOIFBVQ0hBUiAgICAgICAgICAgICAgICAgICAgIHBBZGRyLAorCUlOIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgIENhcGFiaWxpdHlJbmZvLAorCUlOIFVMT05HICAgICAgICAgICAgICAgICAgICAgIFRpbWVvdXQsCisJSU4gVVNIT1JUICAgICAgICAgICAgICAgICAgICAgTGlzdGVuSW50dikKK3sKKwlDT1BZX01BQ19BRERSKEFzc29jUmVxLT5BZGRyLCBwQWRkcik7CisJLy8gQWRkIG1hc2sgdG8gc3VwcG9ydCA4MDIuMTFiIG1vZGUgb25seQorCUFzc29jUmVxLT5DYXBhYmlsaXR5SW5mbyA9IENhcGFiaWxpdHlJbmZvICYgU1VQUE9SVEVEX0NBUEFCSUxJVFlfSU5GTzsgLy8gbm90IGNmLXBvbGxhYmxlLCBub3QgY2YtcG9sbC1yZXF1ZXN0CisJQXNzb2NSZXEtPlRpbWVvdXQgPSBUaW1lb3V0OworCUFzc29jUmVxLT5MaXN0ZW5JbnR2ID0gTGlzdGVuSW50djsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBEaXNhc3NvY1Bhcm1GaWxsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE9VVCBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QgKkRpc2Fzc29jUmVxLAorCUlOIFBVQ0hBUiBwQWRkciwKKwlJTiBVU0hPUlQgUmVhc29uKQoreworCUNPUFlfTUFDX0FERFIoRGlzYXNzb2NSZXEtPkFkZHIsIHBBZGRyKTsKKwlEaXNhc3NvY1JlcS0+UmVhc29uID0gUmVhc29uOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDaGVjayB0aGUgb3V0IGdvaW5nIGZyYW1lLCBpZiB0aGlzIGlzIGFuIERIQ1Agb3IgQVJQIGRhdGFncmFtCisJd2lsbCBiZSBkdXBsaWNhdGUgYW5vdGhlciBmcmFtZSBhdCBsb3cgZGF0YSByYXRlIHRyYW5zbWl0LgorCisJQXJndW1lbnRzOgorCQlwQWQgCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBQYWNrZXQgCVBvaW50ZXIgdG8gb3V0Z29pbmcgTmRpcyBmcmFtZQorCisJUmV0dXJuIFZhbHVlOgorCQlUUlVFCQlUbyBiZSBkdXBsaWNhdGUgYXQgTG93IGRhdGEgcmF0ZSB0cmFuc21pdC4gKDFtYikKKwkJRkFMU0UJCURvIG5vdGhpbmcuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwkJTUFDIGhlYWRlciArIElQIEhlYWRlciArIFVEUCBIZWFkZXIKKwkJICAxNCBCeXRlcwkgIDIwIEJ5dGVzCisKKwkJVURQIEhlYWRlcgorCQkwMHwwMXwwMnwwM3wwNHwwNXwwNnwwN3wwOHwwOXwxMHwxMXwxMnwxM3wxNHwxNXwKKwkJCQkJCVNvdXJjZSBQb3J0CisJCTE2fDE3fDE4fDE5fDIwfDIxfDIyfDIzfDI0fDI1fDI2fDI3fDI4fDI5fDMwfDMxfAorCQkJCQlEZXN0aW5hdGlvbiBQb3J0CisKKwkJcG9ydCAweDQzIG1lYW5zIEJvb3RzdHJhcCBQcm90b2NvbCwgc2VydmVyLgorCQlQb3J0IDB4NDQgbWVhbnMgQm9vdHN0cmFwIFByb3RvY29sLCBjbGllbnQuCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKK0JPT0xFQU4gUlRNUENoZWNrREhDUEZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQoreworCVBBQ0tFVF9JTkZPIAlQYWNrZXRJbmZvOworCVVMT05HCQkJTnVtYmVyT2ZCeXRlc1JlYWQgPSAwOworCVVMT05HCQkJQ3VycmVudE9mZnNldCA9IDA7CisJUFZPSUQJCQlwVmlydHVhbEFkZHJlc3MgPSBOVUxMOworCVVJTlQJCQlOZGlzQnVmZmVyTGVuZ3RoOworCVBVQ0hBUgkJCXBTcmM7CisJVVNIT1JUCQkJUHJvdG9jb2w7CisJVUNIQVIJCQlCeXRlT2Zmc2V0MzYgPSAwOworCVVDSEFSCQkJQnl0ZU9mZnNldDM4ID0gMDsKKwlCT09MRUFOIAkJUmVhZEZpcnN0UGFybSA9IFRSVUU7CisKKwlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwUGFja2V0LCAmUGFja2V0SW5mbywgKFBVQ0hBUiAqKSZwVmlydHVhbEFkZHJlc3MsICZOZGlzQnVmZmVyTGVuZ3RoKTsKKworCU51bWJlck9mQnl0ZXNSZWFkICs9IE5kaXNCdWZmZXJMZW5ndGg7CisJcFNyYyA9IChQVUNIQVIpIHBWaXJ0dWFsQWRkcmVzczsKKwlQcm90b2NvbCA9ICoocFNyYyArIDEyKSAqIDI1NiArICoocFNyYyArIDEzKTsKKworCS8vCisJLy8gQ2hlY2sgREhDUCAmIEJPT1RQIHByb3RvY29sCisJLy8KKwl3aGlsZSAoTnVtYmVyT2ZCeXRlc1JlYWQgPD0gUGFja2V0SW5mby5Ub3RhbFBhY2tldExlbmd0aCkKKwl7CisJCWlmICgoTnVtYmVyT2ZCeXRlc1JlYWQgPj0gMzUpICYmIChSZWFkRmlyc3RQYXJtID09IFRSVUUpKQorCQl7CisJCQlDdXJyZW50T2Zmc2V0ID0gMzUgLSAoTnVtYmVyT2ZCeXRlc1JlYWQgLSBOZGlzQnVmZmVyTGVuZ3RoKTsKKwkJCUJ5dGVPZmZzZXQzNiA9ICoocFNyYyArIEN1cnJlbnRPZmZzZXQpOworCQkJUmVhZEZpcnN0UGFybSA9IEZBTFNFOworCQl9CisKKwkJaWYgKE51bWJlck9mQnl0ZXNSZWFkID49IDM3KQorCQl7CisJCQlDdXJyZW50T2Zmc2V0ID0gMzcgLSAoTnVtYmVyT2ZCeXRlc1JlYWQgLSBOZGlzQnVmZmVyTGVuZ3RoKTsKKwkJCUJ5dGVPZmZzZXQzOCA9ICoocFNyYyArIEN1cnJlbnRPZmZzZXQpOworCQkJLy9FbmQgb2YgUmVhZAorCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIEZBTFNFOworCX0KKworCS8vIENoZWNrIGZvciBESENQICYgQk9PVFAgcHJvdG9jb2wKKwlpZiAoKEJ5dGVPZmZzZXQzNiAhPSAweDQ0KSB8fCAoQnl0ZU9mZnNldDM4ICE9IDB4NDMpKQorCQl7CisJCS8vCisJCS8vIDIwNTQgKGhleCAwODA2KSBmb3IgQVJQIGRhdGFncmFtcworCQkvLyBpZiB0aGlzIHBhY2tldCBpcyBub3QgQVJQIGRhdGFncmFtcywgdGhlbiBkbyBub3RoaW5nCisJCS8vIEFSUCBkYXRhZ3JhbXMgd2lsbCBhbHNvIGJlIGR1cGxpY2F0ZSBhdCAxbWIgYnJvYWRjYXN0IGZyYW1lcworCQkvLworCQlpZiAoUHJvdG9jb2wgIT0gMHgwODA2ICkKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKKworQk9PTEVBTiBSVE1QQ2hlY2tFdGhlclR5cGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCit7CisJVVNIT1JUCVR5cGVMZW47CisJVUNIQVIJQnl0ZTAsIEJ5dGUxOworCVBVQ0hBUglwU3JjQnVmOworCVVJTlQzMglwa3RMZW47CisJVUlOVDE2IAlzcmNQb3J0LCBkc3RQb3J0OworCUJPT0xFQU4Jc3RhdHVzID0gVFJVRTsKKworCisJcFNyY0J1ZiA9IEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKKwlwa3RMZW4gPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKKworCUFTU0VSVChwU3JjQnVmKTsKKworCVJUTVBfU0VUX1BBQ0tFVF9TUEVDSUZJQyhwUGFja2V0LCAwKTsKKworCS8vIGdldCBFdGhlcm5ldCBwcm90b2NvbCBmaWVsZAorCVR5cGVMZW4gPSAocFNyY0J1ZlsxMl0gPDwgOCkgKyBwU3JjQnVmWzEzXTsKKworCXBTcmNCdWYgKz0gTEVOR1RIXzgwMl8zOwkvLyBTa2lwIHRoZSBFdGhlcm5ldCBIZWFkZXIuCisKKwlpZiAoVHlwZUxlbiA8PSAxNTAwKQorCXsJLy8gODAyLjMsIDgwMi4zIExMQworCQkvKgorCQkJRGVzdE1BQyg2KSArIFNyY01BQyg2KSArIExlbmdodCgyKSArCisJCQlEU0FQKDEpICsgU1NBUCgxKSArIENvbnRyb2woMSkgKworCQkJaWYgdGhlIERTQVAgPSAweEFBLCBTU0FQPTB4QUEsIENvbnRvcmwgPSAweDAzLCBpdCBoYXMgYSA1LWJ5dGVzIFNOQVAgaGVhZGVyLgorCQkJCT0+ICsgU05BUCAoNSwgT3JpZ2luYXRpb25JRCgzKSArIGV0aGVyVHlwZSgyKSkKKwkJKi8KKwkJaWYgKHBTcmNCdWZbMF0gPT0gMHhBQSAmJiBwU3JjQnVmWzFdID09IDB4QUEgJiYgcFNyY0J1ZlsyXSA9PSAweDAzKQorCQl7CisJCQlTbmlmZjJCeXRlc0Zyb21OZGlzQnVmZmVyKHBTcmNCdWYsIDYsICZCeXRlMCwgJkJ5dGUxKTsKKwkJCVJUTVBfU0VUX1BBQ0tFVF9MTENTTkFQKHBQYWNrZXQsIDEpOworCQkJVHlwZUxlbiA9IChVU0hPUlQpKChCeXRlMCA8PCA4KSArIEJ5dGUxKTsKKwkJCXBTcmNCdWYgKz0gODsgLy8gU2tpcCB0aGlzIExMQy9TTkFQIGhlYWRlcgorCQl9CisJCWVsc2UKKwkJeworCQkJLy9JdCBqdXN0IGhhcyAzLWJ5dGUgTExDIGhlYWRlciwgbWF5YmUgYSBsZWdhY3kgZXRoZXIgdHlwZSBmcmFtZS4gd2UgZGlkbid0IGhhbmRsZSBpdC4KKwkJfQorCX0KKworCS8vIElmIGl0J3MgYSBWTEFOIHBhY2tldCwgZ2V0IHRoZSByZWFsIFR5cGUvTGVuZ3RoIGZpZWxkLgorCWlmIChUeXBlTGVuID09IDB4ODEwMCkKKwl7CisJCS8qIDB4ODEwMCBtZWFucyBWTEFOIHBhY2tldHMgKi8KKworCQkvKiBEZXN0LiBNQUMgQWRkcmVzcyAoNi1ieXRlcykgKworCQkgICBTb3VyY2UgTUFDIEFkZHJlc3MgKDYtYnl0ZXMpICsKKwkJICAgTGVuZ3RoL1R5cGUgPSA4MDIuMVEgVGFnIFR5cGUgKDItYnl0ZSkgKworCQkgICBUYWcgQ29udHJvbCBJbmZvcm1hdGlvbiAoMi1ieXRlcykgKworCQkgICBMZW5ndGggLyBUeXBlICgyLWJ5dGVzKSArCisJCSAgIGRhdGEgcGF5bG9hZCAoMC1uIGJ5dGVzKSArCisJCSAgIFBhZCAoMC1wIGJ5dGVzKSArCisJCSAgIEZyYW1lIENoZWNrIFNlcXVlbmNlICg0LWJ5dGVzKSAqLworCisJCVJUTVBfU0VUX1BBQ0tFVF9WTEFOKHBQYWNrZXQsIDEpOworCQlTbmlmZjJCeXRlc0Zyb21OZGlzQnVmZmVyKHBTcmNCdWYsIDIsICZCeXRlMCwgJkJ5dGUxKTsKKwkJVHlwZUxlbiA9IChVU0hPUlQpKChCeXRlMCA8PCA4KSArIEJ5dGUxKTsKKworCQlwU3JjQnVmICs9IDQ7IC8vIFNraXAgdGhlIFZMQU4gSGVhZGVyLgorCX0KKworCXN3aXRjaCAoVHlwZUxlbikKKwl7CisJCWNhc2UgMHgwODAwOgorCQkJeworCQkJCUFTU0VSVCgocGt0TGVuID4gMzQpKTsKKwkJCQlpZiAoKihwU3JjQnVmICsgOSkgPT0gMHgxMSkKKwkJCQl7CS8vIHVkcCBwYWNrZXQKKwkJCQkJQVNTRVJUKChwa3RMZW4gPiAzNCkpOwkvLyAxNCBmb3IgZXRoZXJuZXQgaGVhZGVyLCAyMCBmb3IgSVAgaGVhZGVyCisKKwkJCQkJcFNyY0J1ZiArPSAyMDsJLy8gU2tpcCB0aGUgSVAgaGVhZGVyCisJCQkJCXNyY1BvcnQgPSBPU19OVE9IUygqKChVSU5UMTYgKilwU3JjQnVmKSk7CisJCQkJCWRzdFBvcnQgPSBPU19OVE9IUygqKChVSU5UMTYgKikocFNyY0J1ZiArMikpKTsKKworCQkJCQlpZiAoKHNyY1BvcnQ9PTB4NDQgJiYgZHN0UG9ydD09MHg0MykgfHwgKHNyY1BvcnQ9PTB4NDMgJiYgZHN0UG9ydD09MHg0NCkpCisJCQkJCXsJLy9JdCdzIGEgQk9PVFAvREhDUCBwYWNrZXQKKwkJCQkJCVJUTVBfU0VUX1BBQ0tFVF9ESENQKHBQYWNrZXQsIDEpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMHgwODA2OgorCQkJeworCQkJCS8vQVJQIFBhY2tldC4KKwkJCQlSVE1QX1NFVF9QQUNLRVRfREhDUChwUGFja2V0LCAxKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDB4ODg4ZToKKwkJCXsKKwkJCQkvLyBFQVBPTCBQYWNrZXQuCisJCQkJUlRNUF9TRVRfUEFDS0VUX0VBUE9MKHBQYWNrZXQsIDEpOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzdGF0dXMgPSBGQUxTRTsKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBzdGF0dXM7CisKK30KKworCisKK1ZPSUQgVXBkYXRlX1Jzc2lfU2FtcGxlKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFJTU0lfU0FNUExFCQkqcFJzc2ksCisJSU4gUFJYV0lfU1RSVUMJCXBSeFdJKQorCQl7CisJQ0hBUglyc3NpMCA9IHBSeFdJLT5SU1NJMDsKKwlDSEFSCXJzc2kxID0gcFJ4V0ktPlJTU0kxOworCUNIQVIJcnNzaTIgPSBwUnhXSS0+UlNTSTI7CisKKwlpZiAocnNzaTAgIT0gMCkKKwl7CisJCXBSc3NpLT5MYXN0UnNzaTAJPSBDb252ZXJ0VG9Sc3NpKHBBZCwgKENIQVIpcnNzaTAsIFJTU0lfMCk7CisJCXBSc3NpLT5BdmdSc3NpMFg4CT0gKHBSc3NpLT5BdmdSc3NpMFg4IC0gcFJzc2ktPkF2Z1Jzc2kwKSArIHBSc3NpLT5MYXN0UnNzaTA7CisJCXBSc3NpLT5BdmdSc3NpMAk9IHBSc3NpLT5BdmdSc3NpMFg4ID4+IDM7CisJfQorCisJaWYgKHJzc2kxICE9IDApCisJeworCQlwUnNzaS0+TGFzdFJzc2kxCT0gQ29udmVydFRvUnNzaShwQWQsIChDSEFSKXJzc2kxLCBSU1NJXzEpOworCQlwUnNzaS0+QXZnUnNzaTFYOAk9IChwUnNzaS0+QXZnUnNzaTFYOCAtIHBSc3NpLT5BdmdSc3NpMSkgKyBwUnNzaS0+TGFzdFJzc2kxOworCQlwUnNzaS0+QXZnUnNzaTEJPSBwUnNzaS0+QXZnUnNzaTFYOCA+PiAzOworCX0KKworCWlmIChyc3NpMiAhPSAwKQorCXsKKwkJcFJzc2ktPkxhc3RSc3NpMgk9IENvbnZlcnRUb1Jzc2kocEFkLCAoQ0hBUilyc3NpMiwgUlNTSV8yKTsKKwkJcFJzc2ktPkF2Z1Jzc2kyWDggID0gKHBSc3NpLT5BdmdSc3NpMlg4IC0gcFJzc2ktPkF2Z1Jzc2kyKSArIHBSc3NpLT5MYXN0UnNzaTI7CisJCXBSc3NpLT5BdmdSc3NpMiA9IHBSc3NpLT5BdmdSc3NpMlg4ID4+IDM7CisJfQorfQorCisKKworLy8gTm9ybWFsIGxlZ2FjeSBSeCBwYWNrZXQgaW5kaWNhdGlvbgorVk9JRCBJbmRpY2F0ZV9MZWdhY3lfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKwlQTkRJU19QQUNLRVQJcFJ4UGFja2V0ID0gcFJ4QmxrLT5wUnhQYWNrZXQ7CisJVUNIQVIJCQlIZWFkZXI4MDJfM1tMRU5HVEhfODAyXzNdOworCisJLy8gMS4gZ2V0IDgwMi4zIEhlYWRlcgorCS8vIDIuIHJlbW92ZSBMTEMKKwkvLyAJCWEuIHBvaW50ZXIgcFJ4QmxrLT5wRGF0YSB0byBwYXlsb2FkCisJLy8gICAgICBiLiBtb2RpZnkgcFJ4QmxrLT5EYXRhU2l6ZQorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCVJUTVBfODAyXzExX1JFTU9WRV9MTENfQU5EX0NPTlZFUlRfVE9fODAyXzMocFJ4QmxrLCBIZWFkZXI4MDJfMyk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlpZiAocFJ4QmxrLT5EYXRhU2l6ZSA+IE1BWF9SWF9QS1RfTEVOKQorCXsKKworCQkvLyByZWxlYXNlIHBhY2tldAorCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJcmV0dXJuOworCX0KKworCisJU1RBVFNfSU5DX1JYX1BBQ0tFVFMocEFkLCBGcm9tV2hpY2hCU1NJRCk7CisKKworCXdsYW5fODAyXzExX3RvXzgwMl8zX3BhY2tldChwQWQsIHBSeEJsaywgSGVhZGVyODAyXzMsIEZyb21XaGljaEJTU0lEKTsKKworCS8vCisJLy8gcGFzcyB0aGlzIDgwMi4zIHBhY2tldCB0byB1cHBlciBsYXllciBvciBmb3J3YXJkIHRoaXMgcGFja2V0IHRvIFdNIGRpcmVjdGx5CisJLy8KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlBTk5PVU5DRV9PUl9GT1JXQVJEXzgwMl8zX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgRnJvbVdoaWNoQlNTSUQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCit9CisKKworLy8gTm9ybWFsLCBBTVBEVSBvciBBTVNEVQorVk9JRCBDbW1SeG5vblJhbGlua0ZyYW1lSW5kaWNhdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQoreworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmIChSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNUERVKSAmJiAocEFkLT5Db21tb25DZmcuYkRpc2FibGVSZW9yZGVyaW5nID09IDApKQorCXsKKwkJSW5kaWNhdGVfQU1QRFVfUGFja2V0KHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJfQorCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwl7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWlmIChSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNU0RVKSkKKwkJeworCQkJLy8gaGFuZGxlIEEtTVNEVQorCQkJSW5kaWNhdGVfQU1TRFVfUGFja2V0KHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQl7CisJCQlJbmRpY2F0ZV9MZWdhY3lfUGFja2V0KHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJCX0KKwl9Cit9CisKKworVk9JRCBDbW1SeFJhbGlua0ZyYW1lSW5kaWNhdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnksCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQoreworCVVDSEFSCQkJSGVhZGVyODAyXzNbTEVOR1RIXzgwMl8zXTsKKwlVSU5UMTYJCQlNc2R1MlNpemU7CisJVUlOVDE2IAkJCVBheWxvYWQxU2l6ZSwgUGF5bG9hZDJTaXplOworCVBVQ0hBUiAJCQlwRGF0YTI7CisJUE5ESVNfUEFDS0VUCXBQYWNrZXQyID0gTlVMTDsKKworCisKKwlNc2R1MlNpemUgPSAqKHBSeEJsay0+cERhdGEpICsgKCoocFJ4QmxrLT5wRGF0YSsxKSA8PCA4KTsKKworCWlmICgoTXNkdTJTaXplIDw9IDE1MzYpICYmIChNc2R1MlNpemUgPCBwUnhCbGstPkRhdGFTaXplKSkKKwl7CisJCS8qIHNraXAgdHdvIGJ5dGUgTVNEVTIgbGVuICovCisJCXBSeEJsay0+cERhdGEgKz0gMjsKKwkJcFJ4QmxrLT5EYXRhU2l6ZSAtPSAyOworCX0KKwllbHNlCisJeworCQkvLyByZWxlYXNlIHBhY2tldAorCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlyZXR1cm47CisJfQorCisJLy8gZ2V0IDgwMi4zIEhlYWRlciBhbmQgIHJlbW92ZSBMTEMKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlSVE1QXzgwMl8xMV9SRU1PVkVfTExDX0FORF9DT05WRVJUX1RPXzgwMl8zKHBSeEJsaywgSGVhZGVyODAyXzMpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKKwlBU1NFUlQocFJ4QmxrLT5wUnhQYWNrZXQpOworCisJLy8gUmFsaW5rIEFnZ3JlZ2F0aW9uIGZyYW1lCisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeEFnZ3JlZ2F0aW9uQ291bnQgKys7CisJUGF5bG9hZDFTaXplID0gcFJ4QmxrLT5EYXRhU2l6ZSAtIE1zZHUyU2l6ZTsKKwlQYXlsb2FkMlNpemUgPSBNc2R1MlNpemUgLSBMRU5HVEhfODAyXzM7CisKKwlwRGF0YTIgPSBwUnhCbGstPnBEYXRhICsgUGF5bG9hZDFTaXplICsgTEVOR1RIXzgwMl8zOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXBQYWNrZXQyID0gZHVwbGljYXRlX3BrdChwQWQsIChwRGF0YTItTEVOR1RIXzgwMl8zKSwgTEVOR1RIXzgwMl8zLCBwRGF0YTIsIFBheWxvYWQyU2l6ZSwgRnJvbVdoaWNoQlNTSUQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJaWYgKCFwUGFja2V0MikKKwl7CisJCS8vIHJlbGVhc2UgcGFja2V0CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybjsKKwl9CisKKwkvLyB1cGRhdGUgcGF5bG9hZCBzaXplIG9mIDFzdCBwYWNrZXQKKwlwUnhCbGstPkRhdGFTaXplID0gUGF5bG9hZDFTaXplOworCXdsYW5fODAyXzExX3RvXzgwMl8zX3BhY2tldChwQWQsIHBSeEJsaywgSGVhZGVyODAyXzMsIEZyb21XaGljaEJTU0lEKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCUFOTk9VTkNFX09SX0ZPUldBUkRfODAyXzNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIEZyb21XaGljaEJTU0lEKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCWlmIChwUGFja2V0MikKKwl7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQlBTk5PVU5DRV9PUl9GT1JXQVJEXzgwMl8zX1BBQ0tFVChwQWQsIHBQYWNrZXQyLCBGcm9tV2hpY2hCU1NJRCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfQorfQorCisKKyNkZWZpbmUgUkVTRVRfRlJBR0ZSQU1FKF9mcmFnRnJhbWUpIFwKKwl7CQkJCQkJCQlcCisJCV9mcmFnRnJhbWUuUnhTaXplID0gMDsJCVwKKwkJX2ZyYWdGcmFtZS5TZXF1ZW5jZSA9IDA7CVwKKwkJX2ZyYWdGcmFtZS5MYXN0RnJhZyA9IDA7CVwKKwkJX2ZyYWdGcmFtZS5GbGFncyA9IDA7CQlcCisJfQorCisKK1BORElTX1BBQ0tFVCBSVE1QRGVGcmFnbWVudERhdGFGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrKQoreworCVBIRUFERVJfODAyXzExCXBIZWFkZXIgPSBwUnhCbGstPnBIZWFkZXI7CisJUE5ESVNfUEFDS0VUCXBSeFBhY2tldCA9IHBSeEJsay0+cFJ4UGFja2V0OworCVVDSEFSCQkJKnBEYXRhID0gcFJ4QmxrLT5wRGF0YTsKKwlVU0hPUlQJCQlEYXRhU2l6ZSA9IHBSeEJsay0+RGF0YVNpemU7CisJUE5ESVNfUEFDS0VUCXBSZXRQYWNrZXQgPSBOVUxMOworCVVDSEFSCQkJKnBGcmFnQnVmZmVyID0gTlVMTDsKKwlCT09MRUFOIAkJYlJlYXNzRG9uZSA9IEZBTFNFOworCVVDSEFSCQkJSGVhZGVyUm9vbSA9IDA7CisKKworCUFTU0VSVChwSGVhZGVyKTsKKworCUhlYWRlclJvb20gPSBwRGF0YSAtIChVQ0hBUiAqKXBIZWFkZXI7CisKKwkvLyBSZS1hc3NlbWJsZSB0aGUgZnJhZ21lbnRlZCBwYWNrZXRzCisJaWYgKHBIZWFkZXItPkZyYWcgPT0gMCkJCS8vIEZyYWcuIE51bWJlciBpcyAwIDogRmlyc3QgZnJhZyBvciBvbmx5IG9uZSBwa3QKKwl7CisJCS8vIHRoZSBmaXJzdCBwa3Qgb2YgZnJhZ21lbnQsIHJlY29yZCBpdC4KKwkJaWYgKHBIZWFkZXItPkZDLk1vcmVGcmFnKQorCQl7CisJCQlBU1NFUlQocEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQpOworCQkJcEZyYWdCdWZmZXIgPSBHRVRfT1NfUEtUX0RBVEFQVFIocEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQpOworCQkJcEFkLT5GcmFnRnJhbWUuUnhTaXplICAgPSBEYXRhU2l6ZSArIEhlYWRlclJvb207CisJCQlOZGlzTW92ZU1lbW9yeShwRnJhZ0J1ZmZlciwJIHBIZWFkZXIsIHBBZC0+RnJhZ0ZyYW1lLlJ4U2l6ZSk7CisJCQlwQWQtPkZyYWdGcmFtZS5TZXF1ZW5jZSA9IHBIZWFkZXItPlNlcXVlbmNlOworCQkJcEFkLT5GcmFnRnJhbWUuTGFzdEZyYWcgPSBwSGVhZGVyLT5GcmFnOwkgICAvLyBTaG91bGQgYmUgMAorCQkJQVNTRVJUKHBBZC0+RnJhZ0ZyYW1lLkxhc3RGcmFnID09IDApOworCQkJZ290byBkb25lOwkvLyBlbmQgb2YgcHJvY2Vzc2luZyB0aGlzIGZyYW1lCisJCX0KKwl9CisJZWxzZQkvL01pZGRsZSAmIEVuZCBvZiBmcmFnbWVudAorCXsKKwkJaWYgKChwSGVhZGVyLT5TZXF1ZW5jZSAhPSBwQWQtPkZyYWdGcmFtZS5TZXF1ZW5jZSkgfHwKKwkJCShwSGVhZGVyLT5GcmFnICE9IChwQWQtPkZyYWdGcmFtZS5MYXN0RnJhZyArIDEpKSkKKwkJeworCQkJLy8gRnJhZ21lbnQgaXMgbm90IHRoZSBzYW1lIHNlcXVlbmNlIG9yIG91dCBvZiBmcmFnbWVudCBudW1iZXIgb3JkZXIKKwkJCS8vIFJlc2V0IEZyYWdtZW50IGNvbnRyb2wgYmxrCisJCQlSRVNFVF9GUkFHRlJBTUUocEFkLT5GcmFnRnJhbWUpOworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRnJhZ21lbnQgaXMgbm90IHRoZSBzYW1lIHNlcXVlbmNlIG9yIG91dCBvZiBmcmFnbWVudCBudW1iZXIgb3JkZXIuXG4iKSk7CisJCQlnb3RvIGRvbmU7IC8vIGdpdmUgdXAgdGhpcyBmcmFtZQorCQl9CisJCWVsc2UgaWYgKChwQWQtPkZyYWdGcmFtZS5SeFNpemUgKyBEYXRhU2l6ZSkgPiBNQVhfRlJBTUVfU0laRSkKKwkJeworCQkJLy8gRnJhZ21lbnQgZnJhbWUgaXMgdG9vIGxhcmdlLCBpdCBleGVlZHMgdGhlIG1heGltdW0gZnJhbWUgc2l6ZS4KKwkJCS8vIFJlc2V0IEZyYWdtZW50IGNvbnRyb2wgYmxrCisJCQlSRVNFVF9GUkFHRlJBTUUocEFkLT5GcmFnRnJhbWUpOworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRnJhZ21lbnQgZnJhbWUgaXMgdG9vIGxhcmdlLCBpdCBleGVlZHMgdGhlIG1heGltdW0gZnJhbWUgc2l6ZS5cbiIpKTsKKwkJCWdvdG8gZG9uZTsgLy8gZ2l2ZSB1cCB0aGlzIGZyYW1lCisJCX0KKworICAgICAgICAvLworCQkvLyBCcm9hZGNvbSBBUChCQ005NDcwNEFHUikgd2lsbCBzZW5kIG91dCBMTEMgaW4gZnJhZ21lbnQncyBwYWNrZXQsIExMQyBvbmx5IGNhbiBhY2NwZXQgYXQgZmlyc3QgZnJhZ21lbnQuCisJCS8vIEluIHRoaXMgY2FzZSwgd2Ugd2lsbCBkcm9wdCBpdC4KKwkJLy8KKwkJaWYgKE5kaXNFcXVhbE1lbW9yeShwRGF0YSwgU05BUF84MDJfMUgsIHNpemVvZihTTkFQXzgwMl8xSCkpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJGaW5kIGFub3RoZXIgTExDIGF0IE1pZGRsZSBvciBFbmQgZnJhZ21lbnQoU049JWQsIEZyYWc9JWQpXG4iLCBwSGVhZGVyLT5TZXF1ZW5jZSwgcEhlYWRlci0+RnJhZykpOworCQkJZ290byBkb25lOyAvLyBnaXZlIHVwIHRoaXMgZnJhbWUKKwkJfQorCisJCXBGcmFnQnVmZmVyID0gR0VUX09TX1BLVF9EQVRBUFRSKHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0KTsKKworCQkvLyBjb25jYXRlbmF0ZSB0aGlzIGZyYWdtZW50IGludG8gdGhlIHJlLWFzc2VtYmx5IGJ1ZmZlcgorCQlOZGlzTW92ZU1lbW9yeSgocEZyYWdCdWZmZXIgKyBwQWQtPkZyYWdGcmFtZS5SeFNpemUpLCBwRGF0YSwgRGF0YVNpemUpOworCQlwQWQtPkZyYWdGcmFtZS5SeFNpemUgICs9IERhdGFTaXplOworCQlwQWQtPkZyYWdGcmFtZS5MYXN0RnJhZyA9IHBIZWFkZXItPkZyYWc7CSAgIC8vIFVwZGF0ZSBmcmFnbWVudCBudW1iZXIKKworCQkvLyBMYXN0IGZyYWdtZW50CisJCWlmIChwSGVhZGVyLT5GQy5Nb3JlRnJhZyA9PSBGQUxTRSkKKwkJeworCQkJYlJlYXNzRG9uZSA9IFRSVUU7CisJCX0KKwl9CisKK2RvbmU6CisJLy8gYWx3YXlzIHJlbGVhc2UgcnggZnJhZ21lbnRlZCBwYWNrZXQKKwlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKworCS8vIHJldHVybiBkZWZyYWdtZW50ZWQgcGFja2V0IGlmIHBhY2tldCBpcyByZWFzc2VtYmxlZCBjb21wbGV0ZWx5CisJLy8gb3RoZXJ3aXNlIHJldHVybiBOVUxMCisJaWYgKGJSZWFzc0RvbmUpCisJeworCQlQTkRJU19QQUNLRVQgcE5ld0ZyYWdQYWNrZXQ7CisKKwkJLy8gYWxsb2NhdGUgYSBuZXcgcGFja2V0IGJ1ZmZlciBmb3IgZnJhZ21lbnQKKwkJcE5ld0ZyYWdQYWNrZXQgPSBSVE1QX0FsbG9jYXRlRnJhZ1BhY2tldEJ1ZmZlcihwQWQsIFJYX0JVRkZFUl9OT1JNU0laRSk7CisJCWlmIChwTmV3RnJhZ1BhY2tldCkKKwkJeworCQkJLy8gdXBkYXRlIFJ4QmxrCisJCQlwUmV0UGFja2V0ID0gcEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQ7CisJCQlwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCA9IHBOZXdGcmFnUGFja2V0OworCQkJcFJ4QmxrLT5wSGVhZGVyID0gKFBIRUFERVJfODAyXzExKSBHRVRfT1NfUEtUX0RBVEFQVFIocFJldFBhY2tldCk7CisJCQlwUnhCbGstPnBEYXRhID0gKFVDSEFSICopcFJ4QmxrLT5wSGVhZGVyICsgSGVhZGVyUm9vbTsKKwkJCXBSeEJsay0+RGF0YVNpemUgPSBwQWQtPkZyYWdGcmFtZS5SeFNpemUgLSBIZWFkZXJSb29tOworCQkJcFJ4QmxrLT5wUnhQYWNrZXQgPSBwUmV0UGFja2V0OworCQl9CisJCWVsc2UKKwkJeworCQkJUkVTRVRfRlJBR0ZSQU1FKHBBZC0+RnJhZ0ZyYW1lKTsKKwkJfQorCX0KKworCXJldHVybiBwUmV0UGFja2V0OworfQorCisKK1ZPSUQgSW5kaWNhdGVfQU1TRFVfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKwlVSU5UCQkJbk1TRFU7CisKKwl1cGRhdGVfb3NfcGFja2V0X2luZm8ocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwlSVE1QX1NFVF9QQUNLRVRfSUYocFJ4QmxrLT5wUnhQYWNrZXQsIEZyb21XaGljaEJTU0lEKTsKKwluTVNEVSA9IGRlYWdncmVnYXRlX0FNU0RVX2Fubm91bmNlKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIHBSeEJsay0+cERhdGEsIHBSeEJsay0+RGF0YVNpemUpOworfQorCitWT0lEIEluZGljYXRlX0VBUE9MX1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSBOVUxMOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07CisJCVNUQVJ4RUFQT0xGcmFtZUluZGljYXRlKHBBZCwgcEVudHJ5LCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCWlmIChwRW50cnkgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiSW5kaWNhdGVfRUFQT0xfUGFja2V0OiBkcm9wIGFuZCByZWxlYXNlIHRoZSBpbnZhbGlkIHBhY2tldC5cbiIpKTsKKwkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJcmV0dXJuOworCX0KK30KKworI2RlZmluZSBCQ05fVEJUVF9PRkZTRVQJCTY0CS8vZGVmZXIgNjQgdXMKK1ZPSUQgUmVTeW5jQmVhY29uVGltZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCkKK3sKKworCVVJTlQzMiAgT2Zmc2V0OworCisKKwlPZmZzZXQgPSAocEFkLT5UYnR0VGlja0NvdW50KSAlIChCQ05fVEJUVF9PRkZTRVQpOworCisJcEFkLT5UYnR0VGlja0NvdW50Kys7CisKKwkvLworCS8vIFRoZSB1cGRhdGVkIEJlYWNvbkludGVydmFsIFZhbHVlIHdpbGwgYWZmZWN0IEJlYWNvbiBJbnRlcnZhbCBhZnRlciB0d28gVEJUVAorCS8vIGJlYWNhc3VlIHRoZSBvcmlnaW5hbCBCZWFjb25JbnRlcnZhbCBoYWQgYmVlbiBsb2FkZWQgaW50byBuZXh0IFRCVFRfVElNRVIKKwkvLworCWlmIChPZmZzZXQgPT0gKEJDTl9UQlRUX09GRlNFVC0yKSkKKwl7CisJCUJDTl9USU1FX0NGR19TVFJVQyBjc3I7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAmY3NyLndvcmQpOworCQljc3IuZmllbGQuQmVhY29uSW50ZXJ2YWwgPSAocEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kIDw8IDQpIC0gMSA7CS8vIEFTSUMgcmVnaXN0ZXIgaW4gdW5pdHMgb2YgMS8xNiBUVSA9IDY0dXMKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCBjc3Iud29yZCk7CisJfQorCWVsc2UKKwl7CisJCWlmIChPZmZzZXQgPT0gKEJDTl9UQlRUX09GRlNFVC0xKSkKKwkJeworCQkJQkNOX1RJTUVfQ0ZHX1NUUlVDIGNzcjsKKworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBCQ05fVElNRV9DRkcsICZjc3Iud29yZCk7CisJCQljc3IuZmllbGQuQmVhY29uSW50ZXJ2YWwgPSAocEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kKSA8PCA0OyAvLyBBU0lDIHJlZ2lzdGVyIGluIHVuaXRzIG9mIDEvMTYgVFUKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJDTl9USU1FX0NGRywgY3NyLndvcmQpOworCQl9CisJfQorfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YV8yODYwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YV8yODYwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE5ZTUwYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9kYXRhXzI4NjAuYwpAQCAtMCwwICsxLDEyNDAgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworLyoKKyAgIEFsbCBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIG11c3QgYmUgUENJLWRlcGVuZGVkLCBvciB5b3Ugc2hvdWxkIG91dCB5b3VyIGZ1bmN0aW9uCisJaW4gb3RoZXIgZmlsZXMuCisKKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKK2V4dGVybiBSVE1QX1JGX1JFR1MgUkYyODUwUmVnVGFibGVbXTsKK2V4dGVybiBVQ0hBUglOVU1fT0ZfMjg1MF9DSE5MOworCitVU0hPUlQgUnRtcFBDSV9Xcml0ZVR4UmVzb3VyY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaywKKwlJTglCT09MRUFOCQkJYklzTGFzdCwKKwlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpCit7CisKKwlVQ0hBUgkJCSpwRE1BSGVhZGVyQnVmVkE7CisJVVNIT1JUCQkJVHhJZHgsIFJldFR4SWR4OworCVBUWERfU1RSVUMJCXBUeEQ7CisJVUlOVDMyCQkJQnVmQmFzZVBhTG93OworCVBSVE1QX1RYX1JJTkcJcFR4UmluZzsKKwlVU0hPUlQJCQlod0hlYWRlckxlbjsKKworCS8vCisJLy8gZ2V0IFR4IFJpbmcgUmVzb3VyY2UKKwkvLworCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbcFR4QmxrLT5RdWVJZHhdOworCVR4SWR4ID0gcEFkLT5UeFJpbmdbcFR4QmxrLT5RdWVJZHhdLlR4Q3B1SWR4OworCXBETUFIZWFkZXJCdWZWQSA9IChQVUNIQVIpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkRtYUJ1Zi5BbGxvY1ZhOworCUJ1ZkJhc2VQYUxvdyA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBUeFJpbmctPkNlbGxbVHhJZHhdLkRtYUJ1Zi5BbGxvY1BhKTsKKworCS8vIGNvcHkgVFhJTkZPICsgVFhXSSArIFdMQU4gSGVhZGVyICsgTExDIGludG8gRE1BIEhlYWRlciBCdWZmZXIKKwlpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVNEVV9GUkFNRSkKKwl7CisJCWh3SGVhZGVyTGVuID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuIC0gTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCArIHBUeEJsay0+SGRyUGFkTGVuICsgTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRDsKKwl9CisJZWxzZQorCXsKKwkJaHdIZWFkZXJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPkhkclBhZExlbjsKKwl9CisJTmRpc01vdmVNZW1vcnkocERNQUhlYWRlckJ1ZlZBLCBwVHhCbGstPkhlYWRlckJ1ZiwgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hlYWRlckxlbik7CisKKwlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmRpc1BhY2tldCA9IHBUeEJsay0+cFBhY2tldDsKKwlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOworCisJLy8KKwkvLyBidWlsZCBUeCBEZXNjcmlwdG9yCisJLy8KKworCXBUeEQgPSAoUFRYRF9TVFJVQykgcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKKwlOZGlzWmVyb01lbW9yeShwVHhELCBUWERfU0laRSk7CisKKwlwVHhELT5TRFB0cjAgPSBCdWZCYXNlUGFMb3c7CisJcFR4RC0+U0RMZW4wID0gVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hlYWRlckxlbjsgLy8gaW5jbHVkZSBwYWRkaW5nCisJcFR4RC0+U0RQdHIxID0gUENJX01BUF9TSU5HTEUocEFkLCBwVHhCbGssIDAsIDEsIFBDSV9ETUFfVE9ERVZJQ0UpOzsKKwlwVHhELT5TRExlbjEgPSBwVHhCbGstPlNyY0J1ZkxlbjsKKwlwVHhELT5MYXN0U2VjMCA9IDA7CisJcFR4RC0+TGFzdFNlYzEgPSAoYklzTGFzdCkgPyAxIDogMDsKKworCVJUTVBXcml0ZVR4RGVzY3JpcHRvcihwQWQsIHBUeEQsIEZBTFNFLCBGSUZPX0VEQ0EpOworCisJUmV0VHhJZHggPSBUeElkeDsKKwkvLworCS8vIFVwZGF0ZSBUeCBpbmRleAorCS8vCisJSU5DX1JJTkdfSU5ERVgoVHhJZHgsIFRYX1JJTkdfU0laRSk7CisJcFR4UmluZy0+VHhDcHVJZHggPSBUeElkeDsKKworCSpGcmVlTnVtYmVyIC09IDE7CisKKwlyZXR1cm4gUmV0VHhJZHg7Cit9CisKKworVVNIT1JUIFJ0bXBQQ0lfV3JpdGVTaW5nbGVUeFJlc291cmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGssCisJSU4JQk9PTEVBTgkJCWJJc0xhc3QsCisJT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKQoreworCisJVUNIQVIJCQkqcERNQUhlYWRlckJ1ZlZBOworCVVTSE9SVAkJCVR4SWR4LCBSZXRUeElkeDsKKwlQVFhEX1NUUlVDCQlwVHhEOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBQVFhEX1NUUlVDICAgICAgcERlc3RUeEQ7CisgICAgVFhEX1NUUlVDICAgICAgIFR4RDsKKyNlbmRpZgorCVVJTlQzMgkJCUJ1ZkJhc2VQYUxvdzsKKwlQUlRNUF9UWF9SSU5HCXBUeFJpbmc7CisJVVNIT1JUCQkJaHdIZWFkZXJMZW47CisKKwkvLworCS8vIGdldCBUeCBSaW5nIFJlc291cmNlCisJLy8KKwlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XTsKKwlUeElkeCA9IHBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XS5UeENwdUlkeDsKKwlwRE1BSGVhZGVyQnVmVkEgPSAoUFVDSEFSKSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NWYTsKKwlCdWZCYXNlUGFMb3cgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NQYSk7CisKKwkvLyBjb3B5IFRYSU5GTyArIFRYV0kgKyBXTEFOIEhlYWRlciArIExMQyBpbnRvIERNQSBIZWFkZXIgQnVmZmVyCisJaHdIZWFkZXJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPkhkclBhZExlbjsKKworCU5kaXNNb3ZlTWVtb3J5KHBETUFIZWFkZXJCdWZWQSwgcFR4QmxrLT5IZWFkZXJCdWYsIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZWFkZXJMZW4pOworCisJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5kaXNQYWNrZXQgPSBwVHhCbGstPnBQYWNrZXQ7CisJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKworCS8vCisJLy8gYnVpbGQgVHggRGVzY3JpcHRvcgorCS8vCisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKwlwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7CisjZWxzZQorCXBEZXN0VHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7CisJVHhEID0gKnBEZXN0VHhEOworCXBUeEQgPSAmVHhEOworI2VuZGlmCisJTmRpc1plcm9NZW1vcnkocFR4RCwgVFhEX1NJWkUpOworCisJcFR4RC0+U0RQdHIwID0gQnVmQmFzZVBhTG93OworCXBUeEQtPlNETGVuMCA9IFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZWFkZXJMZW47IC8vIGluY2x1ZGUgcGFkZGluZworCXBUeEQtPlNEUHRyMSA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgcFR4QmxrLCAwLCAxLCBQQ0lfRE1BX1RPREVWSUNFKTs7CisJcFR4RC0+U0RMZW4xID0gcFR4QmxrLT5TcmNCdWZMZW47CisJcFR4RC0+TGFzdFNlYzAgPSAwOworCXBUeEQtPkxhc3RTZWMxID0gKGJJc0xhc3QpID8gMSA6IDA7CisKKwlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBGQUxTRSwgRklGT19FRENBKTsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUFdJRW5kaWFuQ2hhbmdlKChQVUNIQVIpKHBETUFIZWFkZXJCdWZWQSArIFRYSU5GT19TSVpFKSwgVFlQRV9UWFdJKTsKKwlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKShwRE1BSGVhZGVyQnVmVkEgKyBUWElORk9fU0laRSArIFRYV0lfU0laRSksIERJUl9XUklURSwgRkFMU0UpOworCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworICAgIFdyaXRlQmFja1RvRGVzY3JpcHRvcigoUFVDSEFSKXBEZXN0VHhELCAoUFVDSEFSKXBUeEQsIEZBTFNFLCBUWVBFX1RYRCk7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCisJUmV0VHhJZHggPSBUeElkeDsKKwkvLworCS8vIFVwZGF0ZSBUeCBpbmRleAorCS8vCisJSU5DX1JJTkdfSU5ERVgoVHhJZHgsIFRYX1JJTkdfU0laRSk7CisJcFR4UmluZy0+VHhDcHVJZHggPSBUeElkeDsKKworCSpGcmVlTnVtYmVyIC09IDE7CisKKwlyZXR1cm4gUmV0VHhJZHg7Cit9CisKKworVVNIT1JUIFJ0bXBQQ0lfV3JpdGVNdWx0aVR4UmVzb3VyY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaywKKwlJTglVQ0hBUgkJCWZyYW1lTnVtLAorCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcikKK3sKKwlCT09MRUFOIGJJc0xhc3Q7CisJVUNIQVIJCQkqcERNQUhlYWRlckJ1ZlZBOworCVVTSE9SVAkJCVR4SWR4LCBSZXRUeElkeDsKKwlQVFhEX1NUUlVDCQlwVHhEOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBQVFhEX1NUUlVDICAgICAgcERlc3RUeEQ7CisgICAgVFhEX1NUUlVDICAgICAgIFR4RDsKKyNlbmRpZgorCVVJTlQzMgkJCUJ1ZkJhc2VQYUxvdzsKKwlQUlRNUF9UWF9SSU5HCXBUeFJpbmc7CisJVVNIT1JUCQkJaHdIZHJMZW47CisJVUlOVDMyCQkJZmlyc3RETUFMZW47CisKKwliSXNMYXN0ID0gKChmcmFtZU51bSA9PSAocFR4QmxrLT5Ub3RhbEZyYW1lTnVtIC0gMSkpID8gMSA6IDApOworCisJLy8KKwkvLyBnZXQgVHggUmluZyBSZXNvdXJjZQorCS8vCisJcFR4UmluZyA9ICZwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF07CisJVHhJZHggPSBwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF0uVHhDcHVJZHg7CisJcERNQUhlYWRlckJ1ZlZBID0gKFBVQ0hBUikgcFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jVmE7CisJQnVmQmFzZVBhTG93ID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jUGEpOworCisJaWYgKGZyYW1lTnVtID09IDApCisJeworCQkvLyBjb3B5IFRYSU5GTyArIFRYV0kgKyBXTEFOIEhlYWRlciArIExMQyBpbnRvIERNQSBIZWFkZXIgQnVmZmVyCisJCWlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0FNU0RVX0ZSQU1FKQorCQkJLy9od0hkckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbi1MRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFELCA0KStMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEOworCQkJaHdIZHJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gLSBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEICsgcFR4QmxrLT5IZHJQYWRMZW4gKyBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEOworCQllbHNlIGlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX1JBTElOS19GUkFNRSkKKwkJCS8vaHdIZHJMZW4gPSBST1VORF9VUChwVHhCbGstPk1wZHVIZWFkZXJMZW4tTEVOR1RIX0FSQUxJTktfSEVBREVSX0ZJRUxELCA0KStMRU5HVEhfQVJBTElOS19IRUFERVJfRklFTEQ7CisJCQlod0hkckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiAtIExFTkdUSF9BUkFMSU5LX0hFQURFUl9GSUVMRCArIHBUeEJsay0+SGRyUGFkTGVuICsgTEVOR1RIX0FSQUxJTktfSEVBREVSX0ZJRUxEOworCQllbHNlCisJCQkvL2h3SGRyTGVuID0gUk9VTkRfVVAocFR4QmxrLT5NcGR1SGVhZGVyTGVuLCA0KTsKKwkJCWh3SGRyTGVuID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5IZHJQYWRMZW47CisKKwkJZmlyc3RETUFMZW4gPSBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGRyTGVuOworCX0KKwllbHNlCisJeworCQlmaXJzdERNQUxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKKwl9CisKKwlOZGlzTW92ZU1lbW9yeShwRE1BSGVhZGVyQnVmVkEsIHBUeEJsay0+SGVhZGVyQnVmLCBmaXJzdERNQUxlbik7CisKKwlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmRpc1BhY2tldCA9IHBUeEJsay0+cFBhY2tldDsKKwlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOworCisJLy8KKwkvLyBidWlsZCBUeCBEZXNjcmlwdG9yCisJLy8KKyNpZm5kZWYgUlRfQklHX0VORElBTgorCXBUeEQgPSAoUFRYRF9TVFJVQykgcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKKyNlbHNlCisJcERlc3RUeEQgPSAoUFRYRF9TVFJVQykgcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKKwlUeEQgPSAqcERlc3RUeEQ7CisJcFR4RCA9ICZUeEQ7CisjZW5kaWYKKwlOZGlzWmVyb01lbW9yeShwVHhELCBUWERfU0laRSk7CisKKwlwVHhELT5TRFB0cjAgPSBCdWZCYXNlUGFMb3c7CisJcFR4RC0+U0RMZW4wID0gZmlyc3RETUFMZW47IC8vIGluY2x1ZGUgcGFkZGluZworCXBUeEQtPlNEUHRyMSA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgcFR4QmxrLCAwLCAxLCBQQ0lfRE1BX1RPREVWSUNFKTs7CisJcFR4RC0+U0RMZW4xID0gcFR4QmxrLT5TcmNCdWZMZW47CisJcFR4RC0+TGFzdFNlYzAgPSAwOworCXBUeEQtPkxhc3RTZWMxID0gKGJJc0xhc3QpID8gMSA6IDA7CisKKwlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBGQUxTRSwgRklGT19FRENBKTsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlpZiAoZnJhbWVOdW0gPT0gMCkKKwkJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUikocERNQUhlYWRlckJ1ZlZBKyBUWElORk9fU0laRSArIFRYV0lfU0laRSksIERJUl9XUklURSwgRkFMU0UpOworCisJaWYgKGZyYW1lTnVtICE9IDApCisJCVJUTVBXSUVuZGlhbkNoYW5nZSgoUFVDSEFSKShwRE1BSGVhZGVyQnVmVkEgKyBUWElORk9fU0laRSksIFRZUEVfVFhXSSk7CisKKwlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKKwlXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoKFBVQ0hBUilwRGVzdFR4RCwgKFBVQ0hBUilwVHhELCBGQUxTRSwgVFlQRV9UWEQpOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKworCVJldFR4SWR4ID0gVHhJZHg7CisJLy8KKwkvLyBVcGRhdGUgVHggaW5kZXgKKwkvLworCUlOQ19SSU5HX0lOREVYKFR4SWR4LCBUWF9SSU5HX1NJWkUpOworCXBUeFJpbmctPlR4Q3B1SWR4ID0gVHhJZHg7CisKKwkqRnJlZU51bWJlciAtPSAxOworCisJcmV0dXJuIFJldFR4SWR4OworCit9CisKKworVk9JRCBSdG1wUENJX0ZpbmFsV3JpdGVUeFJlc291cmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGssCisJSU4JVVNIT1JUCQkJdG90YWxNUERVU2l6ZSwKKwlJTglVU0hPUlQJCQlGaXJzdFR4SWR4KQoreworCisJUFRYV0lfU1RSVUMJCXBUeFdJOworCVBSVE1QX1RYX1JJTkcJcFR4UmluZzsKKworCS8vCisJLy8gZ2V0IFR4IFJpbmcgUmVzb3VyY2UKKwkvLworCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbcFR4QmxrLT5RdWVJZHhdOworCXBUeFdJID0gKFBUWFdJX1NUUlVDKSBwVHhSaW5nLT5DZWxsW0ZpcnN0VHhJZHhdLkRtYUJ1Zi5BbGxvY1ZhOworCXBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPSB0b3RhbE1QRFVTaXplOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlSVE1QV0lFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhXSSwgVFlQRV9UWFdJKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisKK30KKworCitWT0lEIFJ0bXBQQ0lEYXRhTGFzdFR4SWR4KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJUXVlSWR4LAorCUlOCVVTSE9SVAkJCUxhc3RUeElkeCkKK3sKKwlQVFhEX1NUUlVDCQlwVHhEOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBQVFhEX1NUUlVDICAgICAgcERlc3RUeEQ7CisgICAgVFhEX1NUUlVDICAgICAgIFR4RDsKKyNlbmRpZgorCVBSVE1QX1RYX1JJTkcJcFR4UmluZzsKKworCS8vCisJLy8gZ2V0IFR4IFJpbmcgUmVzb3VyY2UKKwkvLworCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbUXVlSWR4XTsKKworCS8vCisJLy8gYnVpbGQgVHggRGVzY3JpcHRvcgorCS8vCisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKwlwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbTGFzdFR4SWR4XS5BbGxvY1ZhOworI2Vsc2UKKwlwRGVzdFR4RCA9IChQVFhEX1NUUlVDKSBwVHhSaW5nLT5DZWxsW0xhc3RUeElkeF0uQWxsb2NWYTsKKwlUeEQgPSAqcERlc3RUeEQ7CisJcFR4RCA9ICZUeEQ7CisjZW5kaWYKKworCXBUeEQtPkxhc3RTZWMxID0gMTsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKKyAgICBXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoKFBVQ0hBUilwRGVzdFR4RCwgKFBVQ0hBUilwVHhELCBGQUxTRSwgVFlQRV9UWEQpOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKworfQorCisKK1VTSE9SVAlSdG1wUENJX1dyaXRlRnJhZ1R4UmVzb3VyY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaywKKwlJTglVQ0hBUgkJCWZyYWdOdW0sCisJT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKQoreworCVVDSEFSCQkJKnBETUFIZWFkZXJCdWZWQTsKKwlVU0hPUlQJCQlUeElkeCwgUmV0VHhJZHg7CisJUFRYRF9TVFJVQwkJcFR4RDsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgUFRYRF9TVFJVQyAgICAgIHBEZXN0VHhEOworICAgIFRYRF9TVFJVQyAgICAgICBUeEQ7CisjZW5kaWYKKwlVSU5UMzIJCQlCdWZCYXNlUGFMb3c7CisJUFJUTVBfVFhfUklORwlwVHhSaW5nOworCVVTSE9SVAkJCWh3SGVhZGVyTGVuOworCVVJTlQzMgkJCWZpcnN0RE1BTGVuOworCisJLy8KKwkvLyBHZXQgVHggUmluZyBSZXNvdXJjZQorCS8vCisJcFR4UmluZyA9ICZwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF07CisJVHhJZHggPSBwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF0uVHhDcHVJZHg7CisJcERNQUhlYWRlckJ1ZlZBID0gKFBVQ0hBUikgcFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jVmE7CisJQnVmQmFzZVBhTG93ID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jUGEpOworCisJLy8KKwkvLyBDb3B5IFRYSU5GTyArIFRYV0kgKyBXTEFOIEhlYWRlciArIExMQyBpbnRvIERNQSBIZWFkZXIgQnVmZmVyCisJLy8KKwlod0hlYWRlckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+SGRyUGFkTGVuOworCisJZmlyc3RETUFMZW4gPSBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGVhZGVyTGVuOworCU5kaXNNb3ZlTWVtb3J5KHBETUFIZWFkZXJCdWZWQSwgcFR4QmxrLT5IZWFkZXJCdWYsIGZpcnN0RE1BTGVuKTsKKworCisJLy8KKwkvLyBCdWlsZCBUeCBEZXNjcmlwdG9yCisJLy8KKyNpZm5kZWYgUlRfQklHX0VORElBTgorCXBUeEQgPSAoUFRYRF9TVFJVQykgcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKKyNlbHNlCisJcERlc3RUeEQgPSAoUFRYRF9TVFJVQykgcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKKwlUeEQgPSAqcERlc3RUeEQ7CisJcFR4RCA9ICZUeEQ7CisjZW5kaWYKKwlOZGlzWmVyb01lbW9yeShwVHhELCBUWERfU0laRSk7CisKKwlpZiAoZnJhZ051bSA9PSBwVHhCbGstPlRvdGFsRnJhZ051bSkKKwl7CisJCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZGlzUGFja2V0ID0gcFR4QmxrLT5wUGFja2V0OworCQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOworCX0KKworCXBUeEQtPlNEUHRyMCA9IEJ1ZkJhc2VQYUxvdzsKKwlwVHhELT5TRExlbjAgPSBmaXJzdERNQUxlbjsgLy8gaW5jbHVkZSBwYWRkaW5nCisJcFR4RC0+U0RQdHIxID0gUENJX01BUF9TSU5HTEUocEFkLCBwVHhCbGssIDAsIDEsIFBDSV9ETUFfVE9ERVZJQ0UpOworCXBUeEQtPlNETGVuMSA9IHBUeEJsay0+U3JjQnVmTGVuOworCXBUeEQtPkxhc3RTZWMwID0gMDsKKwlwVHhELT5MYXN0U2VjMSA9IDE7CisKKwlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBGQUxTRSwgRklGT19FRENBKTsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlSVE1QV0lFbmRpYW5DaGFuZ2UoKFBVQ0hBUikocERNQUhlYWRlckJ1ZlZBICsgVFhJTkZPX1NJWkUpLCBUWVBFX1RYV0kpOworCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIChQVUNIQVIpKHBETUFIZWFkZXJCdWZWQSArIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFKSwgRElSX1dSSVRFLCBGQUxTRSk7CisJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisgICAgV3JpdGVCYWNrVG9EZXNjcmlwdG9yKChQVUNIQVIpcERlc3RUeEQsIChQVUNIQVIpcFR4RCwgRkFMU0UsIFRZUEVfVFhEKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisKKwlSZXRUeElkeCA9IFR4SWR4OworCXBUeEJsay0+UHJpdiArPSBwVHhCbGstPlNyY0J1ZkxlbjsKKworCS8vCisJLy8gVXBkYXRlIFR4IGluZGV4CisJLy8KKwlJTkNfUklOR19JTkRFWChUeElkeCwgVFhfUklOR19TSVpFKTsKKwlwVHhSaW5nLT5UeENwdUlkeCA9IFR4SWR4OworCisJKkZyZWVOdW1iZXIgLT0gMTsKKworCXJldHVybiBSZXRUeElkeDsKKworfQorCisvKgorCU11c3QgYmUgcnVuIGluIEludGVycnVwdCBjb250ZXh0CisJVGhpcyBmdW5jdGlvbiBoYW5kbGUgUENJIHNwZWNpZmljIFR4RGVzYyBhbmQgY3B1IGluZGV4IHVwZGF0ZSBhbmQga2ljayB0aGUgcGFja2V0IG91dC4KKyAqLworaW50IFJ0bXBQQ0lNZ210S2lja091dCgKKwlJTiBSVE1QX0FEQVBURVIgCSpwQWQsCisJSU4gVUNIQVIgCQkJUXVlSWR4LAorCUlOIFBORElTX1BBQ0tFVAkJcFBhY2tldCwKKwlJTiBQVUNIQVIJCQlwU3JjQnVmVkEsCisJSU4gVUlOVCAJCQlTcmNCdWZMZW4pCit7CisJUFRYRF9TVFJVQwkJcFR4RDsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgUFRYRF9TVFJVQyAgICAgIHBEZXN0VHhEOworICAgIFRYRF9TVFJVQyAgICAgICBUeEQ7CisjZW5kaWYKKwlVTE9ORwkJCVN3SWR4ID0gcEFkLT5NZ210UmluZy5UeENwdUlkeDsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBwRGVzdFR4RCAgPSAoUFRYRF9TVFJVQylwQWQtPk1nbXRSaW5nLkNlbGxbU3dJZHhdLkFsbG9jVmE7CisgICAgVHhEID0gKnBEZXN0VHhEOworICAgIHBUeEQgPSAmVHhEOworICAgIFJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworI2Vsc2UKKwlwVHhEICA9IChQVFhEX1NUUlVDKSBwQWQtPk1nbXRSaW5nLkNlbGxbU3dJZHhdLkFsbG9jVmE7CisjZW5kaWYKKworCXBBZC0+TWdtdFJpbmcuQ2VsbFtTd0lkeF0ucE5kaXNQYWNrZXQgPSBwUGFja2V0OworCXBBZC0+TWdtdFJpbmcuQ2VsbFtTd0lkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKworCVJUTVBXcml0ZVR4RGVzY3JpcHRvcihwQWQsIHBUeEQsIFRSVUUsIEZJRk9fTUdNVCk7CisJcFR4RC0+TGFzdFNlYzAgPSAxOworCXBUeEQtPkxhc3RTZWMxID0gMTsKKwlwVHhELT5ETUFET05FID0gMDsKKwlwVHhELT5TRExlbjEgPSAwOworCXBUeEQtPlNEUHRyMCA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgcFNyY0J1ZlZBLCBTcmNCdWZMZW4sIDAsIFBDSV9ETUFfVE9ERVZJQ0UpOzsKKwlwVHhELT5TRExlbjAgPSBTcmNCdWZMZW47CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisgICAgV3JpdGVCYWNrVG9EZXNjcmlwdG9yKChQVUNIQVIpcERlc3RUeEQsIChQVUNIQVIpcFR4RCwgRkFMU0UsIFRZUEVfVFhEKTsKKyNlbmRpZgorCisJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQrKzsKKworCS8vIEluY3JlYXNlIFRYX0NUWF9JRFgsIGJ1dCB3cml0ZSB0byByZWdpc3RlciBsYXRlci4KKwlJTkNfUklOR19JTkRFWChwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4LCBNR01UX1JJTkdfU0laRSk7CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9NR01UQ1RYX0lEWCwgIHBBZC0+TWdtdFJpbmcuVHhDcHVJZHgpOworCisJcmV0dXJuIDA7Cit9CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNoZWNrIFJ4IGRlc2NyaXB0b3IsIHJldHVybiBORElTX1NUQVRVU19GQUlMVVJFIGlmIGFueSBlcnJvciBkb3VuZAorCisJQXJndW1lbnRzOgorCQlwUnhECQlQb2ludGVyIHRvIHRoZSBSeCBkZXNjcmlwdG9yCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX1NVQ0NFU1MgCU5vIGVycgorCQlORElTX1NUQVRVU19GQUlMVVJFIAlFcnJvcgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTIFJUTVBDaGVja1J4RXJyb3IoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCVBIRUFERVJfODAyXzExCQlwSGVhZGVyLAorCUlOCVBSWFdJX1NUUlVDIAkJcFJ4V0ksCisJSU4gIFBSVDI4WFhfUlhEX1NUUlVDIAlwUnhEKQoreworCVBDSVBIRVJfS0VZIHBXcGFLZXk7CisJSU5UIGRCbTsKKworCS8vIFBoeSBlcnJvcnMgJiBDUkMgZXJyb3JzCisJaWYgKC8qKHBSeEQtPlBoeUVycikgfHwqLyAocFJ4RC0+Q3JjKSkKKwl7CisJCS8vIENoZWNrIFJTU0kgZm9yIE5vaXNlIEhpc3Qgc3RhdGlzdGljIGNvbGxlY3Rpb24uCisJCWRCbSA9IChJTlQpIChwUnhXSS0+UlNTSTApIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YTsKKwkJaWYgKGRCbSA8PSAtODcpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzBdICs9IDE7CisJCWVsc2UgaWYgKGRCbSA8PSAtODIpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzFdICs9IDE7CisJCWVsc2UgaWYgKGRCbSA8PSAtNzcpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzJdICs9IDE7CisJCWVsc2UgaWYgKGRCbSA8PSAtNzIpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzNdICs9IDE7CisJCWVsc2UgaWYgKGRCbSA8PSAtNjcpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzRdICs9IDE7CisJCWVsc2UgaWYgKGRCbSA8PSAtNjIpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzVdICs9IDE7CisJCWVsc2UgaWYgKGRCbSA8PSAtNTcpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzZdICs9IDE7CisJCWVsc2UgaWYgKGRCbSA+IC01NykKKwkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbN10gKz0gMTsKKworCQlyZXR1cm4oTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJfQorCisJLy8gQWRkIFJ4IHNpemUgdG8gY2hhbm5lbCBsb2FkIGNvdW50ZXIsIHdlIHNob3VsZCBpZ25vcmUgZXJyb3IgY291bnRzCisJcEFkLT5TdGFDZmcuQ0xCdXN5Qnl0ZXMgKz0gKHBSeEQtPlNETDAgKyAxNCk7CisKKwkvLyBEcm9wIFRvRHMgcHJvbWlzY291cyBmcmFtZSwgaXQgaXMgb3BlbmVkIGR1ZSB0byBDQ1ggMiBjaGFubmVsIGxvYWQgc3RhdGlzdGljcworCWlmIChwSGVhZGVyICE9IE5VTEwpCisJeworCQlpZiAocEhlYWRlci0+RkMuVG9EcykKKwkJeworCQkJcmV0dXJuKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQl9CisJfQorCisJLy8gRHJvcCBub3QgVTJNIGZyYW1lcywgY2FudCdzIGRyb3AgaGVyZSBiZWNhdXNlIHdlIHdpbGwgZHJvcCBiZWFjb24gaW4gdGhpcyBjYXNlCisJLy8gSSBhbSBraW5kIG9mIGRvdWJ0aW5nIHRoZSBVMk0gYml0IG9wZXJhdGlvbgorCS8vIGlmIChwUnhELT5VMk0gPT0gMCkKKwkvLwlyZXR1cm4oTkRJU19TVEFUVVNfRkFJTFVSRSk7CisKKwkvLyBkcm9wIGRlY3lwdGlvbiBmYWlsIGZyYW1lCisJaWYgKHBSeEQtPkNpcGhlckVycikKKwl7CisJCWlmIChwUnhELT5DaXBoZXJFcnIgPT0gMikKKwkJCXtEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJwUnhEIEVSUk9SOiBJQ1Ygb2sgYnV0IE1JQ0VyciAiKSk7fQorCQllbHNlIGlmIChwUnhELT5DaXBoZXJFcnIgPT0gMSkKKwkJCXtEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJwUnhEIEVSUk9SOiBJQ1YgRXJyICIpKTt9CisJCWVsc2UgaWYgKHBSeEQtPkNpcGhlckVyciA9PSAzKQorCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgicFJ4RCBFUlJPUjogS2V5IG5vdCB2YWxpZCAiKSk7CisKKyAgICAgICAgaWYgKCgocFJ4RC0+Q2lwaGVyRXJyICYgMSkgPT0gMSkgJiYgcEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQgJiYgSU5GUkFfT04ocEFkKSkKKyAgICAgICAgICAgIFJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0lDVl9FUlJPUl9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworCisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIiAlZCAobGVuPSVkLCBNY2FzdD0lZCwgTXlCc3M9JWQsIFdjaWQ9JWQsIEtleUlkPSVkKVxuIiwKKwkJCXBSeEQtPkNpcGhlckVyciwKKwkJCXBSeEQtPlNETDAsCisJCQlwUnhELT5NY2FzdCB8IHBSeEQtPkJjYXN0LAorCQkJcFJ4RC0+TXlCc3MsCisJCQlwUnhXSS0+V2lyZWxlc3NDbGlJRCwKKwkJCXBSeFdJLT5LZXlJbmRleCkpOworCisJCS8vCisJCS8vIE1JQyBFcnJvcgorCQkvLworCQlpZiAocFJ4RC0+Q2lwaGVyRXJyID09IDIpCisJCXsKKwkJCXBXcGFLZXkgPSAmcEFkLT5TaGFyZWRLZXlbQlNTMF1bcFJ4V0ktPktleUluZGV4XTsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKQorICAgICAgICAgICAgICAgIFdwYVNlbmRNaWNGYWlsdXJlVG9XcGFTdXBwbGljYW50KHBBZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBXcGFLZXktPlR5cGUgPT0gUEFJUldJU0VLRVkpID8gVFJVRTpGQUxTRSk7CisgICAgICAgICAgICBlbHNlCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCQkJICAgIFJUTVBSZXBvcnRNaWNFcnJvcihwQWQsIHBXcGFLZXkpOworCisgICAgICAgICAgICBpZiAoKChwUnhELT5DaXBoZXJFcnIgJiAyKSA9PSAyKSAmJiBwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCAmJiBJTkZSQV9PTihwQWQpKQorICAgICAgICAgICAgICAgIFJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX01JQ19FUlJPUl9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworCisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJSeCBNSUMgVmFsdWUgZXJyb3JcbiIpKTsKKwkJfQorCisJCWlmIChwSGVhZGVyID09IE5VTEwpCisJCQlyZXR1cm4oTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisKKwkJcmV0dXJuKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKworCXJldHVybihORElTX1NUQVRVU19TVUNDRVNTKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIHJvdXRpbmUgc2VuZHMgY29tbWFuZCB0byBmaXJtd2FyZSBhbmQgdHVybiBvdXIgY2hpcCB0byBwb3dlciBzYXZlIG1vZGUuCisJCUJvdGggUmFkaW9PZmYgYW5kIC4xMSBwb3dlciBzYXZlIGZ1bmN0aW9uIG5lZWRzIHRvIGNhbGwgdGhpcyByb3V0aW5lLgorCUlucHV0OgorCQlMZXZlbCA9IEdVSVJBRElPX09GRiAgOiBHVUkgUmFkaW8gT2ZmIG1vZGUKKwkJTGV2ZWwgPSBET1QxMVBPV0VSU0FWRSAgOiA4MDIuMTEgcG93ZXIgc2F2ZSBtb2RlCisJCUxldmVsID0gUlRNUF9IQUxUICA6IFdoZW4gRGlzYWJsZSBkZXZpY2UuCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFJUMjh4eFBjaUFzaWNSYWRpb09mZigKKwlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwlJTiBVQ0hBUiAgICAgICAgICAgIExldmVsLAorCUlOIFVTSE9SVCAgICAgICAgICAgVGJ0dE51bVRvTmV4dFdha2VVcCkKK3sKKwlXUERNQV9HTE9fQ0ZHX1NUUlVDCURtYUNmZzsKKwlVQ0hBUgkJaSwgdGVtcEJCUF9SMyA9IDA7CisJQk9PTEVBTgkJYnJjID0gRkFMU0UsIENhbmNlbGxlZDsKKyAgICBVSU5UMzIJCVRiVFRUaW1lID0gMDsKKwlVSU5UMzIJCVBzUG9sbFRpbWUgPSAwLCBNQUNWYWx1ZTsKKyAgICBVTE9ORwkJQmVhY29uUGVyaW9kVGltZTsKKyAgICBVSU5UMzIJCVJ4RG1hSWR4LCBSeENwdUlkeDsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljUmFkaW9PZmYgPT09PiBUeENwdUlkeCA9ICVkLCBUeERtYUlkeCA9ICVkLiBSeENwdUlkeCA9ICVkLCBSeERtYUlkeCA9ICVkLlxuIiwgcEFkLT5UeFJpbmdbMF0uVHhDcHVJZHgsIHBBZC0+VHhSaW5nWzBdLlR4RG1hSWR4LCBwQWQtPlJ4UmluZy5SeENwdUlkeCwgcEFkLT5SeFJpbmcuUnhEbWFJZHgpKTsKKworICAgIC8vIENoZWNrIFJ4IERNQSBidXN5IHN0YXR1cywgaWYgbW9yZSB0aGFuIGhhbGYgaXMgb2NjdXBpZWQsIGdpdmUgdXAgdGhpcyByYWRpbyBvZmYuCisJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9EUlhfSURYICwgJlJ4RG1hSWR4KTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX0NSWF9JRFggLCAmUnhDcHVJZHgpOworCWlmICgoUnhEbWFJZHggPiBSeENwdUlkeCkgJiYgKChSeERtYUlkeCAtIFJ4Q3B1SWR4KSA+IFJYX1JJTkdfU0laRS8zKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzaWNSYWRpb09mZiA9PT0+IHJldHVybjEuIFJ4RG1hSWR4ID0gJWQgLCAgUnhDcHVJZHggPSAlZC4gXG4iLCBSeERtYUlkeCwgUnhDcHVJZHgpKTsKKwkJcmV0dXJuOworCX0KKwllbHNlIGlmICgoUnhDcHVJZHggPj0gUnhEbWFJZHgpICYmICgoUnhDcHVJZHggLSBSeERtYUlkeCkgPCBSWF9SSU5HX1NJWkUvMykpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljUmFkaW9PZmYgPT09PiByZXR1cm4yLiAgUnhDcHVJZHggPSAlZC4gUnhEbWFJZHggPSAlZCAsICBcbiIsIFJ4Q3B1SWR4LCBSeERtYUlkeCkpOworCQlyZXR1cm47CisJfQorCisgICAgLy8gT25jZSBnbyBpbnRvIHRoaXMgZnVuY3Rpb24sIGRpc2FibGUgdHggYmVjYXVzZSBkb24ndCB3YW50IHRvbyBtYW55IHBhY2tldHMgaW4gcXVldWUgdG8gcHJldmVudCBIVyBzdG9wcy4KKwlwQWQtPmJQQ0ljbGtPZmZEaXNhYmxlVHggPSBUUlVFOworCisJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkKKwl7CisJICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlJhZGlvT25PZmZUaW1lciwJJkNhbmNlbGxlZCk7CisJICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLAkmQ2FuY2VsbGVkKTsKKworCSAgICBpZiAoTGV2ZWwgPT0gRE9UMTFQT1dFUlNBVkUpCisJCXsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVEJUVF9USU1FUiwgJlRiVFRUaW1lKTsKKwkJCVRiVFRUaW1lICY9IDB4MWZmZmY7CisJCQkvLyAwMC4gY2hlY2sgaWYgbmVlZCB0byBkbyBzbGVlcCBpbiB0aGlzIERUSU0gcGVyaW9kLiAgIElmIG5leHQgYmVhY29uIHdpbGwgYXJyaXZlIHdpdGhpbiAzMG1zICwgLi4uZG9lc24ndCBuZWNlc3NhcmlseSBzbGVlcC4KKwkJCS8vIFRiVFRUaW1lIHVpbnQgPSA2NHVzLCBMRUFEX1RJTUUgdW5pdCA9IDEwMjR1cywgUHNQb2xsVGltZSB1bml0ID0gMW1zCisJICAgICAgICBpZiAgKCgoNjQqVGJUVFRpbWUpIDwoKExFQURfVElNRSoxMDI0KSArIDQwMDAwKSkgJiYgKFRidHROdW1Ub05leHRXYWtlVXAgPT0gMCkpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVGJUVFRpbWUgPSAweCV4ICwgZ2l2ZSB1cCB0aGlzIHNsZWVwLiBcbiIsIFRiVFRUaW1lKSk7CisJICAgICAgICAgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7CisJICAgICAgICAgICAgcEFkLT5iUENJY2xrT2ZmRGlzYWJsZVR4ID0gRkFMU0U7CisJCQkJcmV0dXJuOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCVBzUG9sbFRpbWUgPSAoNjQqVGJUVFRpbWUtIExFQURfVElNRSoxMDI0KS8xMDAwOworCQkJCVBzUG9sbFRpbWUgLT0gMzsKKworCSAgICAgICAgICAgIEJlYWNvblBlcmlvZFRpbWUgPSBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QqMTAyLzEwMDsKKwkJCQlpZiAoVGJ0dE51bVRvTmV4dFdha2VVcCA+IDApCisJCQkJCVBzUG9sbFRpbWUgKz0gKChUYnR0TnVtVG9OZXh0V2FrZVVwIC0xKSAqIEJlYWNvblBlcmlvZFRpbWUpOworCisJICAgICAgICAgICAgcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBUUlVFOworCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLCBQc1BvbGxUaW1lKTsKKwkJCX0KKwkJfQorCX0KKworICAgIC8vIDAuIERpc2FibGUgVHggRE1BLgorCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkRtYUNmZy53b3JkKTsKKwlEbWFDZmcuZmllbGQuRW5hYmxlVHhETUEgPSAwOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIERtYUNmZy53b3JkKTsKKworCS8vIDEuIFdhaXQgRE1BIG5vdCBidXN5CisJaSA9IDA7CisJZG8KKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkRtYUNmZy53b3JkKTsKKwkJaWYgKChEbWFDZmcuZmllbGQuVHhETUFCdXN5ID09IDApICYmIChEbWFDZmcuZmllbGQuUnhETUFCdXN5ID09IDApKQorCQkJYnJlYWs7CisJCVJUTVB1c2VjRGVsYXkoMjApOworCQlpKys7CisJfXdoaWxlKGkgPCA1MCk7CisKKwlpZiAoaSA+PSA1MCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRNQSBrZWVwcyBidXN5LiAgcmV0dXJuIG9uIFJUMjh4eFBjaUFzaWNSYWRpb09mZiAoKVxuIikpOworCQlwQWQtPmJQQ0ljbGtPZmZEaXNhYmxlVHggPSBGQUxTRTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmRG1hQ2ZnLndvcmQpOworCQlEbWFDZmcuZmllbGQuRW5hYmxlVHhETUEgPSAxOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBEbWFDZmcud29yZCk7CisJCXJldHVybjsKKwl9CisKKyAgICBSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRik7CisKKyAgICAvLyBTZXQgdG8gMVIuCisgICAgdGVtcEJCUF9SMyA9IChwQWQtPlN0YUNmZy5CQlBSMyAmIDB4RTcpOworCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIHRlbXBCQlBfUjMpOworCisJLy8gSW4gUmFkaW8gT2ZmLCB3ZSB0dXJuIG9mZiBSRiBjbGssIFNvIG5vdyBuZWVkIHRvIGNhbGwgQVNJQ1N3aXRjaENoYW5uZWwgYWdhaW4uCisJaWYgKElORlJBX09OKHBBZCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJCSYmIChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQorCXsKKwkJLy8gTXVzdCB1c2luZyA0ME1Iei4KKwkJQXNpY1R1cm5PZmZSRkNsayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKwl9CisJZWxzZQorCXsKKwkJLy8gTXVzdCB1c2luZyAyME1Iei4KKwkJQXNpY1R1cm5PZmZSRkNsayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCX0KKworICAgIC8vIFdoZW4gUENJIGNsb2NrIGlzIG9mZiwgZG9uJ3Qgd2FudCB0byBzZXJ2aWNlIGludGVycnVwdC4KKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBJTlRfTUFTS19DU1IsIEF1dG9XYWtldXBJbnQpOworCisgICAgUlRNUF9JT19XUklURTMyKHBBZCwgUlhfQ1JYX0lEWCwgcEFkLT5SeFJpbmcuUnhDcHVJZHgpOworCS8vIERpc2FibGUgTUFDIFJ4CisJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwgLCAmTUFDVmFsdWUpOworCU1BQ1ZhbHVlICY9IDB4Zjc7CisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMICwgTUFDVmFsdWUpOworCisJLy8gIDIuIFNlbmQgU2xlZXAgY29tbWFuZAorCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX1NUQVRVUywgMHhmZmZmZmZmZik7CisJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX01BSUxCT1hfQ0lELCAweGZmZmZmZmZmKTsKKwlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzAsIFBvd2VyU2FmZUNJRCwgMHhmZiwgMHgwMCk7ICAgLy8gc2VuZCBQT1dFUi1TQVZFIGNvbW1hbmQgdG8gTUNVLiBUaW1lb3V0IHVuaXQ6NDB1cy4KKwkvLyAgMi0xLiBXYWl0IGNvbW1hbmQgc3VjY2VzcworCS8vIFN0YXR1cyA9IDEgOiBzdWNjZXNzLCBTdGF0dXMgPSAyLCBhbHJlYWR5IHNsZWVwLCBTdGF0dXMgPSAzLCBNYXliZSBNQUMgaXMgYnVzeSBzbyBjYW4ndCBmaW5pc2ggdGhpcyB0YXNrLgorCWJyYyA9IEFzaWNDaGVja0NvbW1hbk9rKHBBZCwgUG93ZXJTYWZlQ0lEKTsKKworICAgIGlmIChicmMgPT0gRkFMU0UpCisgICAgeworICAgICAgICAvLyB0cnkgYWdhaW4KKyAgICAJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMwLCBQb3dlclNhZmVDSUQsIDB4ZmYsIDB4MDApOyAgIC8vIHNlbmQgUE9XRVItU0FWRSBjb21tYW5kIHRvIE1DVS4gVGltZW91dCB1bml0OjQwdXMuCisgICAgCS8vUlRNUHVzZWNEZWxheSgyMDApOworICAgIAlicmMgPSBBc2ljQ2hlY2tDb21tYW5PayhwQWQsIFBvd2VyU2FmZUNJRCk7CisgICAgfQorCisJLy8gIDMuIEFmdGVyIDB4MzAgY29tbWFuZCBpcyBvaywgc2VuZCByYWRpbyBvZmYgY29tbWFuZC4gbG93Ynl0ZSA9IDAgZm9yIHBvd2VyIHNhZmUuCisJLy8gSWYgMHgzMCBjb21tYW5kIGlzIG5vdCBvayB0aGlzIHRpbWUsIHdlIGNhbiBpZ25vcmUgMHgzNSBjb21tYW5kLiBJdCB3aWxsIG1ha2Ugc3VyZSBub3QgY2F1c2UgZmlybXdhcmUnciBwcm9ibGVtLgorCWlmICgoTGV2ZWwgPT0gRE9UMTFQT1dFUlNBVkUpICYmIChicmMgPT0gVFJVRSkpCisJeworCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzUsIFBvd2VyUmFkaW9PZmZDSUQsIDAsIDB4MDApOwkvLyBsb3dieXRlID0gMCBtZWFucyB0byBkbyBwb3dlciBzYWZlLCBOT1QgdHVybiBvZmYgcmFkaW8uCisJIAkvLyAgMy0xLiBXYWl0IGNvbW1hbmQgc3VjY2VzcworCSAJQXNpY0NoZWNrQ29tbWFuT2socEFkLCBQb3dlclJhZGlvT2ZmQ0lEKTsKKwl9CisJZWxzZSBpZiAoYnJjID09IFRSVUUpCisJeworCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzUsIFBvd2VyUmFkaW9PZmZDSUQsIDEsIDB4MDApOwkvLyBsb3dieXRlID0gMCBtZWFucyB0byBkbyBwb3dlciBzYWZlLCBOT1QgdHVybiBvZmYgcmFkaW8uCisJIAkvLyAgMy0xLiBXYWl0IGNvbW1hbmQgc3VjY2VzcworCSAJQXNpY0NoZWNrQ29tbWFuT2socEFkLCBQb3dlclJhZGlvT2ZmQ0lEKTsKKwl9CisKKyAgICAvLyBXYWl0IERNQSBub3QgYnVzeQorCWkgPSAwOworCWRvCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZEbWFDZmcud29yZCk7CisJCWlmIChEbWFDZmcuZmllbGQuUnhETUFCdXN5ID09IDApCisJCQlicmVhazsKKwkJUlRNUHVzZWNEZWxheSgyMCk7CisJCWkrKzsKKwl9d2hpbGUoaSA8IDUwKTsKKworCWlmIChpID49IDUwKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRE1BIFJ4IGtlZXBzIGJ1c3kuICBvbiBSVDI4eHhQY2lBc2ljUmFkaW9PZmYgKClcbiIpKTsKKwl9CisJLy8gZGlzYWJsZSBETUEgUnguCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZEbWFDZmcud29yZCk7CisJCURtYUNmZy5maWVsZC5FbmFibGVSeERNQSA9IDA7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIERtYUNmZy53b3JkKTsKKwl9CisKKwlpZiAoTGV2ZWwgPT0gRE9UMTFQT1dFUlNBVkUpCisJeworCQlBVVRPX1dBS0VVUF9TVFJVQwlBdXRvV2FrZXVwQ2ZnOworCQkvL1JUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLCA5MCk7CisKKwkJLy8gd2UgaGF2ZSBkZWNpZGVkIHRvIFNMRUVQLCBzbyBhdCBsZWFzdCBkbyBpdCBmb3IgYSBCRUFDT04gcGVyaW9kLgorCQlpZiAoVGJ0dE51bVRvTmV4dFdha2VVcCA9PSAwKQorCQkJVGJ0dE51bVRvTmV4dFdha2VVcCA9IDE7CisKKwkJQXV0b1dha2V1cENmZy53b3JkID0gMDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOworCisJCS8vIDEuIFNldCBhdXRvIHdha2UgdXAgdGltZXIuCisJCUF1dG9XYWtldXBDZmcuZmllbGQuTnVtb2ZTbGVlcGluZ1RidHQgPSBUYnR0TnVtVG9OZXh0V2FrZVVwIC0gMTsKKwkJQXV0b1dha2V1cENmZy5maWVsZC5FbmFibGVBdXRvV2FrZXVwID0gMTsKKwkJQXV0b1dha2V1cENmZy5maWVsZC5BdXRvTGVhZFRpbWUgPSBMRUFEX1RJTUU7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKKwl9CisKKwkvLyAgNC0xLiBJZiBpdCdzIHRvIGRpc2FibGUgb3VyIGRldmljZS4gTmVlZCB0byByZXN0b3JlIFBDSSBDb25maWd1cmF0aW9uIFNwYWNlIHRvIGl0cyBvcmlnaW5hbCB2YWx1ZS4KKwlpZiAoTGV2ZWwgPT0gUlRNUF9IQUxUKQorCXsKKwkJaWYgKChicmMgPT0gVFJVRSkgJiYgKGkgPCA1MCkpCisJCQlSVE1QUENJZUxpbmtDdHJsU2V0dGluZyhwQWQsIDEpOworCX0KKwkvLyAgNC4gU2V0IFBDSSBjb25maWd1cmF0aW9uIFNwYWNlIExpbmsgQ29tdHJvbCBmaWVsZHMuICBPbmx5IFJhZGlvIE9mZiBuZWVkcyB0byBjYWxsIHRoaXMgZnVuY3Rpb24KKwllbHNlCisJeworCQlpZiAoKGJyYyA9PSBUUlVFKSAmJiAoaSA8IDUwKSkKKwkJCVJUTVBQQ0llTGlua0N0cmxTZXR0aW5nKHBBZCwgMyk7CisJfQorCisgICAgcEFkLT5iUENJY2xrT2ZmRGlzYWJsZVR4ID0gRkFMU0U7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIHJvdXRpbmUgc2VuZHMgY29tbWFuZCB0byBmaXJtd2FyZSBhbmQgdHVybiBvdXIgY2hpcCB0byB3YWtlIHVwIG1vZGUgZnJvbSBwb3dlciBzYXZlIG1vZGUuCisJCUJvdGggUmFkaW9PbiBhbmQgLjExIHBvd2VyIHNhdmUgZnVuY3Rpb24gbmVlZHMgdG8gY2FsbCB0aGlzIHJvdXRpbmUuCisJSW5wdXQ6CisJCUxldmVsID0gR1VJUkFESU9fT0ZGIDogY2FsbCB0aGlzIGZ1bmN0aW9uIGlzIGZyb20gUmFkaW8gT2ZmIHRvIFJhZGlvIE9uLiAgTmVlZCB0byByZXN0b3JlIFBDSSBob3N0IHZhbHVlLgorCQlMZXZlbCA9IG90aGVyIHZhbHVlIDogbm9ybWFsIHdha2UgdXAgZnVuY3Rpb24uCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIFJUMjh4eFBjaUFzaWNSYWRpb09uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSICAgICBMZXZlbCkKK3sKKyAgICBXUERNQV9HTE9fQ0ZHX1NUUlVDCURtYUNmZzsKKwlCT09MRUFOCQkJCUNhbmNlbGxlZCwgYnJ2ID0gVFJVRTsKKyAgICBVSU5UMzIJCQkgICAgTUFDVmFsdWU7CisKKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpKQorCXsKKwkgICAgcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsCSZDYW5jZWxsZWQpOworCQlpZiAoKExldmVsID09IEdVSVJBRElPX09GRikgfHwgKExldmVsID09IEdVSV9JRExFX1BPV0VSX1NBVkUpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVDI4eHhQY2lBc2ljUmFkaW9PbiAoKVxuIikpOworCQkJLy8gMS4gU2V0IFBDSSBMaW5rIENvbnRyb2wgaW4gQ29uZmlndXJhdGlvbiBTcGFjZS4KKwkJCVJUTVBQQ0llTGlua0N0cmxWYWx1ZVJlc3RvcmUocEFkLCBSRVNUT1JFX1dBS0VVUCk7CisJCQlSVE1QdXNlY0RlbGF5KDYwMDApOworCQl9CisJfQorCisgICAgcEFkLT5iUENJY2xrT2ZmID0gRkFMU0U7CisKKwkvLyAyLiBTZW5kIHdha2UgdXAgY29tbWFuZC4KKwlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzEsIFBvd2VyV2FrZUNJRCwgMHgwMCwgMHgwMCk7CisKKwkvLyAyLTEuIHdhaXQgY29tbWFuZCBvay4KKwlicnYgPSBBc2ljQ2hlY2tDb21tYW5PayhwQWQsIFBvd2VyV2FrZUNJRCk7CisgICAgaWYgKGJydikKKyAgICB7CisgICAgCS8vUlRNUF9JT19XUklURTMyKHBBZCwgSU5UX01BU0tfQ1NSLCAoREVMQVlJTlRNQVNLfFJ4SU5UKSk7CisgICAgCU5JQ0VuYWJsZUludGVycnVwdChwQWQpOworCisgICAgCS8vIDMuIEVuYWJsZSBUeCBETUEuCisgICAgCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkRtYUNmZy53b3JkKTsKKyAgICAJRG1hQ2ZnLmZpZWxkLkVuYWJsZVR4RE1BID0gMTsKKyAgICAgICAgRG1hQ2ZnLmZpZWxkLkVuYWJsZVJ4RE1BID0gMTsKKyAgICAJUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfR0xPX0NGRywgRG1hQ2ZnLndvcmQpOworCisgICAgICAgIC8vIEVhYmxlIE1BQyBSeAorICAgIAlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCAsICZNQUNWYWx1ZSk7CisgICAgCU1BQ1ZhbHVlIHw9IDB4ODsKKyAgICAJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMICwgTUFDVmFsdWUpOworCisgICAgCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpOworICAgIAlpZiAoTGV2ZWwgPT0gR1VJX0lETEVfUE9XRVJfU0FWRSkKKyAgICAJeworICAgIAkJLy8gSW4gUmFkaW8gT2ZmLCB3ZSB0dXJuIG9mZiBSRiBjbGssIFNvIG5vdyBuZWVkIHRvIGNhbGwgQVNJQ1N3aXRjaENoYW5uZWwgYWdhaW4uCisgICAgCQlpZiAoSU5GUkFfT04ocEFkKSAmJiAocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgIT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKyAgICAJCQkmJiAocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKKyAgICAJCXsKKyAgICAJCQkvLyBNdXN0IHVzaW5nIDQwTUh6LgorICAgIAkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKKyAgICAJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisgICAgCQl9CisgICAgCQllbHNlCisgICAgCQl7CisgICAgCQkJLy8gTXVzdCB1c2luZyAyME1Iei4KKyAgICAJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKKyAgICAJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKyAgICAJCX0KKyAgICAJfQorICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFMU0U7Cit9CisKK1ZPSUQgUlQyOHh4UGNpU3RhQXNpY0ZvcmNlV2FrZXVwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIEJPT0xFQU4gICAgICAgYkZyb21UeCkKK3sKKyAgICBBVVRPX1dBS0VVUF9TVFJVQwlBdXRvV2FrZXVwQ2ZnOworCisgICAgaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XQUtFVVBfTk9XKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIndha2luZyB1cCBub3chXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV0FLRVVQX05PVyk7CisKKyAgICBpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpKQorICAgIHsKKyAgICAgICAgLy8gU3VwcG9ydCBQQ0llIEFkdmFuY2UgUG93ZXIgU2F2ZQorICAgIAlpZiAoYkZyb21UeCA9PSBUUlVFKQorICAgIAl7CisgICAgICAgICAgICBwQWQtPk1sbWUuYlBzUG9sbFRpbWVyUnVubmluZyA9IEZBTFNFOworICAgIAkJUlRNUFBDSWVMaW5rQ3RybFZhbHVlUmVzdG9yZShwQWQsIFJFU1RPUkVfV0FLRVVQKTsKKyAgICAJCVJUTVB1c2VjRGVsYXkoMzAwMCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PT09QXNpY0ZvcmNlV2FrZXVwPT09YkZyb21UeFxuIikpOworICAgIAl9CisKKwkJQXV0b1dha2V1cENmZy53b3JkID0gMDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOworCisgICAgICAgIGlmIChSVDI4eHhQY2lBc2ljUmFkaW9PbihwQWQsIERPVDExUE9XRVJTQVZFKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gSW4gUmFkaW8gT2ZmLCB3ZSB0dXJuIG9mZiBSRiBjbGssIFNvIG5vdyBuZWVkIHRvIGNhbGwgQVNJQ1N3aXRjaENoYW5uZWwgYWdhaW4uCisgICAgICAgIAlpZiAoSU5GUkFfT04ocEFkKSAmJiAocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgIT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKyAgICAgICAgCQkmJiAocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKKyAgICAgICAgCXsKKyAgICAgICAgCQkvLyBNdXN0IHVzaW5nIDQwTUh6LgorICAgICAgICAJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKKyAgICAgICAgCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisgICAgICAgIAl9CisgICAgICAgIAllbHNlCisgICAgICAgIAl7CisgICAgICAgIAkJLy8gTXVzdCB1c2luZyAyME1Iei4KKyAgICAgICAgCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKKyAgICAgICAgCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKyAgICAgICAgCX0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBQQ0ksIDI4NjAtUENJZQorICAgICAgICBBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzEsIDB4ZmYsIDB4MDAsIDB4MDApOworCQlBdXRvV2FrZXVwQ2ZnLndvcmQgPSAwOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7CisgICAgfQorCisgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7CisgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV0FLRVVQX05PVyk7CisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PT09PT1SVDI4eHhQY2lTdGFBc2ljRm9yY2VXYWtldXBcbiIpKTsKK30KKworVk9JRCBSVDI4eHhQY2lTdGFBc2ljU2xlZXBUaGVuQXV0b1dha2V1cCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQgVGJ0dE51bVRvTmV4dFdha2VVcCkKK3sKKyAgICBpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IEZBTFNFKQorCXsKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7CisJCXJldHVybjsKKwl9CisgICAgaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkKKyAgICB7CisgICAgCVVMT05HCU5vdyA9IDA7CisgICAgICAgIGlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dBS0VVUF9OT1cpKQorICAgICAgICB7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ3YWtpbmcgdXAgbm93IVxuIikpOworICAgICAgICAgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOworCQkvLyBJZiBsYXN0IHNlbmQgTlVMTCBmcmFtIHRpbWUgaXMgdG9vIGNsb3NlIHRvIHRoaXMgcmVjZWl2aW5nIGJlYWNvbiAod2l0aGluIDhtcyksIGRvbid0IGdvIHRvIHNsZWVwIGZvciB0aGlzIERUTS4KKwkJLy8gQmVjYXVzZSBTb21lIEFQIGNhbid0IHF1ZXVpbmcgb3V0Z29pbmcgZnJhbWVzIGltbWVkaWF0ZWx5LgorCQlpZiAoKChwQWQtPk1sbWUuTGFzdFNlbmROVUxMcHNtVGltZSArIDgpID49IE5vdykgJiYgKHBBZC0+TWxtZS5MYXN0U2VuZE5VTExwc21UaW1lIDw9IE5vdykpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5vdyA9ICVsdSwgTGFzdFNlbmROVUxMcHNtVGltZT0lbHUgOiAgUnhDb3VudFNpbmNlTGFzdE5VTEwgPSAlbHUuIFxuIiwgTm93LCBwQWQtPk1sbWUuTGFzdFNlbmROVUxMcHNtVGltZSwgcEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50U2luY2VMYXN0TlVMTCkpOworCQkJcmV0dXJuOworCQl9CisJCWVsc2UgaWYgKChwQWQtPlJhbGlua0NvdW50ZXJzLlJ4Q291bnRTaW5jZUxhc3ROVUxMID4gMCkgJiYgKChwQWQtPk1sbWUuTGFzdFNlbmROVUxMcHNtVGltZSArIHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCkgPj0gTm93KSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTm93ID0gJWx1LCBMYXN0U2VuZE5VTExwc21UaW1lPSVsdTogUnhDb3VudFNpbmNlTGFzdE5VTEwgPSAlbHUgPiAwIFxuIiwgTm93LCBwQWQtPk1sbWUuTGFzdFNlbmROVUxMcHNtVGltZSwgIHBBZC0+UmFsaW5rQ291bnRlcnMuUnhDb3VudFNpbmNlTGFzdE5VTEwpKTsKKwkJCXJldHVybjsKKwkJfQorCisgICAgICAgIFJUMjh4eFBjaUFzaWNSYWRpb09mZihwQWQsIERPVDExUE9XRVJTQVZFLCBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQVVUT19XQUtFVVBfU1RSVUMJQXV0b1dha2V1cENmZzsKKyAgICAgICAgLy8gd2UgaGF2ZSBkZWNpZGVkIHRvIFNMRUVQLCBzbyBhdCBsZWFzdCBkbyBpdCBmb3IgYSBCRUFDT04gcGVyaW9kLgorICAgICAgICBpZiAoVGJ0dE51bVRvTmV4dFdha2VVcCA9PSAwKQorICAgICAgICAgICAgVGJ0dE51bVRvTmV4dFdha2VVcCA9IDE7CisKKyAgICAgICAgQXV0b1dha2V1cENmZy53b3JkID0gMDsKKyAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOworICAgICAgICBBdXRvV2FrZXVwQ2ZnLmZpZWxkLk51bW9mU2xlZXBpbmdUYnR0ID0gVGJ0dE51bVRvTmV4dFdha2VVcCAtIDE7CisgICAgICAgIEF1dG9XYWtldXBDZmcuZmllbGQuRW5hYmxlQXV0b1dha2V1cCA9IDE7CisgICAgICAgIEF1dG9XYWtldXBDZmcuZmllbGQuQXV0b0xlYWRUaW1lID0gNTsKKyAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOworICAgICAgICBBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzAsIDB4ZmYsIDB4ZmYsIDB4MDApOyAgIC8vIHNlbmQgUE9XRVItU0FWRSBjb21tYW5kIHRvIE1DVS4gVGltZW91dCA0MHVzLgorICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gJXMsIFRidHROdW1Ub05leHRXYWtlVXA9JWQgXG4iLCBfX2Z1bmNfXywgVGJ0dE51bVRvTmV4dFdha2VVcCkpOworICAgIH0KKyAgICBPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7Cit9CisKK1ZPSUQgUHNQb2xsV2FrZUV4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCVJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCItLT5Qc1BvbGxXYWtlRXhlYyBcbiIpKTsKKwlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisgICAgaWYgKHBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nKQorICAgIHsKKwkgICAgUlRNUFBDSWVMaW5rQ3RybFZhbHVlUmVzdG9yZShwQWQsIFJFU1RPUkVfV0FLRVVQKTsKKyAgICB9CisgICAgcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKKwlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKK30KKworVk9JRCAgUmFkaW9PbkV4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCVJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKKwlXUERNQV9HTE9fQ0ZHX1NUUlVDCURtYUNmZzsKKwlCT09MRUFOCQkJCUNhbmNlbGxlZDsKKworCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCItLT5SYWRpb09uRXhlYygpIHJldHVybiBvbiBmT1BfU1RBVFVTX0RPWkUgPT0gVFJVRTsgXG4iKSk7CisJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlJhZGlvT25PZmZUaW1lciwgMTApOworCQlyZXR1cm47CisJfQorCisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIi0tPlJhZGlvT25FeGVjKCkgcmV0dXJuIG9uIFNDQU5fSU5fUFJPR1JFU1M7IFxuIikpOworCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsIDEwKTsKKwkJcmV0dXJuOworCX0KKyAgICBwQWQtPk1sbWUuYlBzUG9sbFRpbWVyUnVubmluZyA9IEZBTFNFOworCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLAkmQ2FuY2VsbGVkKTsKKwlpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpCisJeworCQlwQWQtPmJQQ0ljbGtPZmYgPSBGQUxTRTsKKyAgICAgICAgUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX0JLKTsKKwkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX0JFKTsKKwkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZJKTsKKwkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZPKTsKKwkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0hDQ0EpOworCQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfTUdNVCk7CisJCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9SWCk7CisKKwkJLy8gMi4gU2VuZCB3YWtlIHVwIGNvbW1hbmQuCisJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMSwgUG93ZXJXYWtlQ0lELCAweDAwLCAweDAyKTsKKwkJLy8gMi0xLiB3YWl0IGNvbW1hbmQgb2suCisJCUFzaWNDaGVja0NvbW1hbk9rKHBBZCwgUG93ZXJXYWtlQ0lEKTsKKworCQkvLyBXaGVuIFBDSSBjbG9jayBpcyBvZmYsIGRvbid0IHdhbnQgdG8gc2VydmljZSBpbnRlcnJ1cHQuIFNvIHdoZW4gYmFjayB0byBjbG9jayBvbiwgZW5hYmxlIGludGVycnVwdC4KKwkJTklDRW5hYmxlSW50ZXJydXB0KHBBZCk7CisKKwkJLy8gMy4gRW5hYmxlIFR4IERNQS4KKwkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmRG1hQ2ZnLndvcmQpOworCQlEbWFDZmcuZmllbGQuRW5hYmxlVHhETUEgPSAxOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBEbWFDZmcud29yZCk7CisKKwkJLy8gSW4gUmFkaW8gT2ZmLCB3ZSB0dXJuIG9mZiBSRiBjbGssIFNvIG5vdyBuZWVkIHRvIGNhbGwgQVNJQ1N3aXRjaENoYW5uZWwgYWdhaW4uCisJCWlmIChJTkZSQV9PTihwQWQpICYmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQkJJiYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCisJCXsKKwkJCS8vIE11c3QgdXNpbmcgNDBNSHouCisJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7CisJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBNdXN0IHVzaW5nIDIwTUh6LgorCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJfQorCisJCS8vIENsZWFyIFJhZGlvIG9mZiBmbGFnCisJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKTsKKworCQkvLyBTZXQgTEVECisJCVJUTVBTZXRMRUQocEFkLCBMRURfUkFESU9fT04pOworCisgICAgICAgIGlmIChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX0FDVElWRSkKKyAgICAgICAgeworICAgIAkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgcEFkLT5TdGFDZmcuQkJQUjMpOworICAgICAgICB9CisJfQorCWVsc2UKKwl7CisJCVJUMjh4eFBjaUFzaWNSYWRpb09mZihwQWQsIEdVSVJBRElPX09GRiwgMCk7CisJfQorfQorCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK1ZPSUQgUlQyOHh4UGNpTWxtZVJhZGlvT24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisgICAgaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkKKyAgIAkJcmV0dXJuOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcz09PT5cbiIsIF9fZnVuY19fKSk7CisKKyAgICBpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkgfHwKKyAgICAgICAgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkpKQorICAgIHsKKyAgICAJTklDUmVzZXRGcm9tRXJyb3IocEFkKTsKKworICAgIAlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkspOworICAgIAlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkUpOworICAgIAlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVkkpOworICAgIAlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVk8pOworICAgIAlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfSENDQSk7CisgICAgCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9NR01UKTsKKyAgICAJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX1JYKTsKKworICAgIAkvLyBFbmFibGUgVHgvUngKKyAgICAJUlRNUEVuYWJsZVJ4VHgocEFkKTsKKworICAgIAkvLyBDbGVhciBSYWRpbyBvZmYgZmxhZworICAgIAlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7CisKKwkgICAgLy8gU2V0IExFRAorCSAgICBSVE1QU2V0TEVEKHBBZCwgTEVEX1JBRElPX09OKTsKKyAgICB9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyAgICBpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmCisgICAgICAgIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSkpKQorICAgIHsKKyAgICAgICAgQk9PTEVBTgkJQ2FuY2VsbGVkOworCisgICAgCVJUTVBQQ0llTGlua0N0cmxWYWx1ZVJlc3RvcmUocEFkLCBSRVNUT1JFX1dBS0VVUCk7CisKKyAgICAgICAgcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKKyAgICAJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsCSZDYW5jZWxsZWQpOworICAgIAlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsCSZDYW5jZWxsZWQpOworICAgIAlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsIDEwKTsKKyAgICB9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCit9CisKK1ZPSUQgUlQyOHh4UGNpTWxtZVJhZGlvT0ZGKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworICAgIFdQRE1BX0dMT19DRkdfU1RSVUMJR2xvQ2ZnOworCVVJTlQzMglpOworCisgICAgaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpKQorICAgIAlyZXR1cm47CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzPT09PlxuIiwgX19mdW5jX18pKTsKKworCS8vIFNldCBMRUQKKwlSVE1QU2V0TEVEKHBBZCwgTEVEX1JBRElPX09GRik7CisJLy8gU2V0IFJhZGlvIG9mZiBmbGFnCisJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisgICAgeworICAgIAlCT09MRUFOCQlDYW5jZWxsZWQ7CisgICAgCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorICAgIAl7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsICZDYW5jZWxsZWQpOworCQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUyk7CisgICAgCX0KKworCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpKQorICAgICAgICB7CisgICAgICAgICAgICBCT09MRUFOIENhbmNlbGxlZDsKKyAgICAgICAgICAgIHBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID0gRkFMU0U7CisgICAgICAgICAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwJJkNhbmNlbGxlZCk7CisJICAgICAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsCSZDYW5jZWxsZWQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTGluayBkb3duIGZpcnN0IGlmIGFueSBhc3NvY2lhdGlvbiBleGlzdHMKKyAgICAgICAgaWYgKElORlJBX09OKHBBZCkgfHwgQURIT0NfT04ocEFkKSkKKyAgICAgICAgICAgIExpbmtEb3duKHBBZCwgRkFMU0UpOworICAgICAgICBSVE1QdXNlY0RlbGF5KDEwMDAwKTsKKyAgICAgICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgLy8gQ2xlYW4gdXAgb2xkIGJzcyB0YWJsZQorICAgICAgICBCc3NUYWJsZUluaXQoJnBBZC0+U2NhblRhYik7CisgICAgfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8gRGlzYWJsZSBUeC9SeCBETUEKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZHbG9DZmcud29yZCk7CSAgIC8vIGRpc2FibGUgRE1BCisJR2xvQ2ZnLmZpZWxkLkVuYWJsZVR4RE1BID0gMDsKKwlHbG9DZmcuZmllbGQuRW5hYmxlUnhETUEgPSAwOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIEdsb0NmZy53b3JkKTsJICAgLy8gYWJvcnQgYWxsIFRYIHJpbmdzCisKKworCS8vIE1BQ19TWVNfQ1RSTCA9PiB2YWx1ZSA9IDB4MCA9PiA0MG1BCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAwKTsKKworCS8vIFBXUl9QSU5fQ0ZHID0+IHZhbHVlID0gMHgwID0+IDQwbUEKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBQV1JfUElOX0NGRywgMCk7CisKKwkvLyBUWF9QSU5fQ0ZHID0+IHZhbHVlID0gMHgwID0+IDIwbUEKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QSU5fQ0ZHLCAwKTsKKworCWlmIChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfNDApCisJeworCQkvLyBNdXN0IHVzaW5nIDQwTUh6LgorCQlBc2ljVHVybk9mZlJGQ2xrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworCX0KKwllbHNlCisJeworCQkvLyBNdXN0IHVzaW5nIDIwTUh6LgorCQlBc2ljVHVybk9mZlJGQ2xrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJfQorCisJLy8gV2FpdGluZyBmb3IgRE1BIGlkbGUKKwlpID0gMDsKKwlkbworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOworCQlpZiAoKEdsb0NmZy5maWVsZC5UeERNQUJ1c3kgPT0gMCkgJiYgKEdsb0NmZy5maWVsZC5SeERNQUJ1c3kgPT0gMCkpCisJCQlicmVhazsKKworCQlSVE1QdXNlY0RlbGF5KDEwMDApOworCX13aGlsZSAoaSsrIDwgMTAwKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9pbmZvLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1faW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkOTJhYzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1faW5mby5jCkBAIC0wLDAgKzEsMzQxNyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKK0lOVAlTaG93X1NTSURfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X1dpcmVsZXNzTW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfVHhCdXJzdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfVHhQcmVhbWJsZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfVHhQb3dlcl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfQ2hhbm5lbF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfQkdQcm90ZWN0aW9uX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19SVFNUaHJlc2hvbGRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0ZyYWdUaHJlc2hvbGRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK0lOVAlTaG93X0h0QndfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0h0TWNzX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19IdEdpX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19IdE9wTW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfSHRFeHRjaGFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0h0TXBkdURlbnNpdHlfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0h0QmFXaW5TaXplX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19IdFJkZ19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfSHRBbXNkdV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfSHRBdXRvQmFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK0lOVAlTaG93X0NvdW50cnlSZWdpb25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0NvdW50cnlSZWdpb25BQmFuZF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfQ291bnRyeUNvZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKKyNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCitJTlQJU2hvd19Qa3RBZ2dyZWdhdGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisjZW5kaWYgLy8gQUdHUkVHQVRJT05fU1VQUE9SVCAvLworCisjaWZkZWYgV01NX1NVUFBPUlQKK0lOVAlTaG93X1dtbUNhcGFibGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisjZW5kaWYgLy8gV01NX1NVUFBPUlQgLy8KKworSU5UCVNob3dfSUVFRTgwMjExSF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorSU5UCVNob3dfTmV0d29ya1R5cGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK0lOVAlTaG93X0F1dGhNb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19FbmNyeXBUeXBlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19EZWZhdWx0S2V5SURfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0tleTFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0tleTJfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0tleTNfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0tleTRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X1dQQVBTS19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworc3RhdGljIHN0cnVjdCB7CisJQ0hBUiAqbmFtZTsKKwlJTlQgKCpzaG93X3Byb2MpKFBSVE1QX0FEQVBURVIgcEFkYXB0ZXIsIFBVQ0hBUiBhcmcpOworfSAqUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQywgUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DW10gPSB7CisJeyJTU0lEIiwJCQkJCVNob3dfU1NJRF9Qcm9jfSwKKwl7IldpcmVsZXNzTW9kZSIsCQkJU2hvd19XaXJlbGVzc01vZGVfUHJvY30sCisJeyJUeEJ1cnN0IiwJCQkJCVNob3dfVHhCdXJzdF9Qcm9jfSwKKwl7IlR4UHJlYW1ibGUiLAkJCQlTaG93X1R4UHJlYW1ibGVfUHJvY30sCisJeyJUeFBvd2VyIiwJCQkJCVNob3dfVHhQb3dlcl9Qcm9jfSwKKwl7IkNoYW5uZWwiLAkJCQkJU2hvd19DaGFubmVsX1Byb2N9LAorCXsiQkdQcm90ZWN0aW9uIiwJCQlTaG93X0JHUHJvdGVjdGlvbl9Qcm9jfSwKKwl7IlJUU1RocmVzaG9sZCIsCQkJU2hvd19SVFNUaHJlc2hvbGRfUHJvY30sCisJeyJGcmFnVGhyZXNob2xkIiwJCQlTaG93X0ZyYWdUaHJlc2hvbGRfUHJvY30sCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJeyJIdEJ3IiwJCQkJCVNob3dfSHRCd19Qcm9jfSwKKwl7Ikh0TWNzIiwJCQkJCVNob3dfSHRNY3NfUHJvY30sCisJeyJIdEdpIiwJCQkJCVNob3dfSHRHaV9Qcm9jfSwKKwl7Ikh0T3BNb2RlIiwJCQkJU2hvd19IdE9wTW9kZV9Qcm9jfSwKKwl7Ikh0RXh0Y2hhIiwJCQkJU2hvd19IdEV4dGNoYV9Qcm9jfSwKKwl7Ikh0TXBkdURlbnNpdHkiLAkJCVNob3dfSHRNcGR1RGVuc2l0eV9Qcm9jfSwKKwl7Ikh0QmFXaW5TaXplIiwJCSAgICAgICAgU2hvd19IdEJhV2luU2l6ZV9Qcm9jfSwKKwl7Ikh0UmRnIiwJCSAgICAgICAgCVNob3dfSHRSZGdfUHJvY30sCisJeyJIdEFtc2R1IiwJCSAgICAgICAgCVNob3dfSHRBbXNkdV9Qcm9jfSwKKwl7Ikh0QXV0b0JhIiwJCSAgICAgICAgU2hvd19IdEF1dG9CYV9Qcm9jfSwKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwl7IkNvdW50cnlSZWdpb24iLAkJCVNob3dfQ291bnRyeVJlZ2lvbl9Qcm9jfSwKKwl7IkNvdW50cnlSZWdpb25BQmFuZCIsCQlTaG93X0NvdW50cnlSZWdpb25BQmFuZF9Qcm9jfSwKKwl7IkNvdW50cnlDb2RlIiwJCQkJU2hvd19Db3VudHJ5Q29kZV9Qcm9jfSwKKyNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCisJeyJQa3RBZ2dyZWdhdGUiLAkJCVNob3dfUGt0QWdncmVnYXRlX1Byb2N9LAorI2VuZGlmCisKKyNpZmRlZiBXTU1fU1VQUE9SVAorCXsiV21tQ2FwYWJsZSIsCQkJCVNob3dfV21tQ2FwYWJsZV9Qcm9jfSwKKyNlbmRpZgorCXsiSUVFRTgwMjExSCIsCQkJCVNob3dfSUVFRTgwMjExSF9Qcm9jfSwKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyAgICB7Ik5ldHdvcmtUeXBlIiwJCQkJU2hvd19OZXR3b3JrVHlwZV9Qcm9jfSwKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl7IkF1dGhNb2RlIiwJCQkJU2hvd19BdXRoTW9kZV9Qcm9jfSwKKwl7IkVuY3J5cFR5cGUiLAkJCQlTaG93X0VuY3J5cFR5cGVfUHJvY30sCisJeyJEZWZhdWx0S2V5SUQiLAkJCVNob3dfRGVmYXVsdEtleUlEX1Byb2N9LAorCXsiS2V5MSIsCQkJCQlTaG93X0tleTFfUHJvY30sCisJeyJLZXkyIiwJCQkJCVNob3dfS2V5Ml9Qcm9jfSwKKwl7IktleTMiLAkJCQkJU2hvd19LZXkzX1Byb2N9LAorCXsiS2V5NCIsCQkJCQlTaG93X0tleTRfUHJvY30sCisJeyJXUEFQU0siLAkJCQkJU2hvd19XUEFQU0tfUHJvY30sCisJe05VTEwsIE5VTEx9Cit9OworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIEdldCBEcml2ZXIgdmVyc2lvbi4KKworICAgIFJldHVybjoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfRHJpdmVyVmVyc2lvbl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRyaXZlciB2ZXJzaW9uLSVzXG4iLCBTVEFfRFJJVkVSX1ZFUlNJT04pKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBDb3VudHJ5IFJlZ2lvbi4KKyAgICAgICAgVGhpcyBjb21tYW5kIHdpbGwgbm90IHdvcmssIGlmIHRoZSBmaWVsZCBvZiBDb3VudHJ5UmVnaW9uIGluIGVlcHJvbSBpcyBwcm9ncmFtbWVkLgorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9Db3VudHJ5UmVnaW9uX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIHJlZ2lvbjsKKworCXJlZ2lvbiA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJcmV0dXJuIC1FT1BOT1RTVVBQOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKworCS8vIENvdW50cnkgY2FuIGJlIHNldCBvbmx5IHdoZW4gRUVQUk9NIG5vdCBwcm9ncmFtbWVkCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gJiAweDgwKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0NvdW50cnlSZWdpb25fUHJvYzo6cGFyYW1ldGVyIG9mIENvdW50cnlSZWdpb24gaW4gZWVwcm9tIGlzIHByb2dyYW1tZWQgXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZigocmVnaW9uID49IDApICYmIChyZWdpb24gPD0gUkVHSU9OX01BWElNVU1fQkdfQkFORCkpCisJeworCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uID0gKFVDSEFSKSByZWdpb247CisJfQorCWVsc2UgaWYgKHJlZ2lvbiA9PSBSRUdJT05fMzFfQkdfQkFORCkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gPSAoVUNIQVIpIHJlZ2lvbjsKKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0NvdW50cnlSZWdpb25fUHJvYzo6cGFyYW1ldGVycyBvdXQgb2YgcmFuZ2VcbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCS8vIGlmIHNldCBjb3VudHJ5IHJlZ2lvbiwgZHJpdmVyIG5lZWRzIHRvIGJlIHJlc2V0CisJQnVpbGRDaGFubmVsTGlzdChwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0NvdW50cnlSZWdpb25fUHJvYzo6KENvdW50cnlSZWdpb249JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQ291bnRyeSBSZWdpb24gZm9yIEEgYmFuZC4KKyAgICAgICAgVGhpcyBjb21tYW5kIHdpbGwgbm90IHdvcmssIGlmIHRoZSBmaWVsZCBvZiBDb3VudHJ5UmVnaW9uIGluIGVlcHJvbSBpcyBwcm9ncmFtbWVkLgorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9Db3VudHJ5UmVnaW9uQUJhbmRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgcmVnaW9uOworCisJcmVnaW9uID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwlyZXR1cm4gLUVPUE5PVFNVUFA7CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworCisJLy8gQ291bnRyeSBjYW4gYmUgc2V0IG9ubHkgd2hlbiBFRVBST00gbm90IHByb2dyYW1tZWQKKwlpZiAocEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kICYgMHg4MCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9Db3VudHJ5UmVnaW9uQUJhbmRfUHJvYzo6cGFyYW1ldGVyIG9mIENvdW50cnlSZWdpb24gaW4gZWVwcm9tIGlzIHByb2dyYW1tZWQgXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZigocmVnaW9uID49IDApICYmIChyZWdpb24gPD0gUkVHSU9OX01BWElNVU1fQV9CQU5EKSkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCA9IChVQ0hBUikgcmVnaW9uOworCX0KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2M6OnBhcmFtZXRlcnMgb3V0IG9mIHJhbmdlXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkvLyBpZiBzZXQgY291bnRyeSByZWdpb24sIGRyaXZlciBuZWVkcyB0byBiZSByZXNldAorCUJ1aWxkQ2hhbm5lbExpc3QocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9Db3VudHJ5UmVnaW9uQUJhbmRfUHJvYzo6KENvdW50cnlSZWdpb249JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQpKTsKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXaXJlbGVzcyBNb2RlCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X1dpcmVsZXNzTW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORwlXaXJlbGVzc01vZGU7CisJSU5UCQlzdWNjZXNzID0gVFJVRTsKKworCVdpcmVsZXNzTW9kZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlJTlQgTWF4UGh5TW9kZSA9IFBIWV8xMUc7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJTWF4UGh5TW9kZSA9IFBIWV8xMU5fNUc7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJaWYgKFdpcmVsZXNzTW9kZSA8PSBNYXhQaHlNb2RlKQorCQl7CisJCQlSVE1QU2V0UGh5TW9kZShwQWQsIFdpcmVsZXNzTW9kZSk7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlpZiAoV2lyZWxlc3NNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpCisJCQl7CisJCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IFRSVUU7CisJCQkJcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IFRSVUU7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IEZBTFNFOworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBGQUxTRTsKKwkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCS8vIFNldCBBZGhvY01vZGUgcmF0ZXMKKwkJCWlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKKwkJCXsKKwkJCQlNbG1lVXBkYXRlVHhSYXRlcyhwQWQsIEZBTFNFLCAwKTsKKwkJCQlNYWtlSWJzc0JlYWNvbihwQWQpOyAgICAgICAgICAgLy8gcmUtYnVpbGQgQkVBQ09OIGZyYW1lCisJCQkJQXNpY0VuYWJsZUlic3NTeW5jKHBBZCk7ICAgICAgIC8vIGNvcHkgdG8gb24tY2hpcCBtZW1vcnkKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCXN1Y2Nlc3MgPSBGQUxTRTsKKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIGl0IGlzIG5lZWRlZCB0byBzZXQgU1NJRCB0byB0YWtlIGVmZmVjdAorCWlmIChzdWNjZXNzID09IFRSVUUpCisJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlTZXRDb21tb25IVChwQWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfV2lyZWxlc3NNb2RlX1Byb2M6Oig9JWxkKVxuIiwgV2lyZWxlc3NNb2RlKSk7CisJfQorCWVsc2UKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9XaXJlbGVzc01vZGVfUHJvYzo6cGFyYW1ldGVycyBvdXQgb2YgcmFuZ2VcbiIpKTsKKwl9CisKKwlyZXR1cm4gc3VjY2VzczsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQ2hhbm5lbAorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9DaGFubmVsX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworIAlJTlQJCXN1Y2Nlc3MgPSBUUlVFOworCVVDSEFSCUNoYW5uZWw7CisKKwlDaGFubmVsID0gKFVDSEFSKSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJLy8gY2hlY2sgaWYgdGhpcyBjaGFubmVsIGlzIHZhbGlkCisJaWYgKENoYW5uZWxTYW5pdHkocEFkLCBDaGFubmVsKSA9PSBUUlVFKQorCXsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IENoYW5uZWw7CisKKwkJCWlmIChNT05JVE9SX09OKHBBZCkpCisJCQl7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJTl9DaGFubmVsQ2hlY2socEFkKTsKKwkJCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEICYmCisJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PSBCV180MCkKKwkJCQl7CisJCQkJCU5fU2V0Q2VuQ2gocEFkKTsKKwkJCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOworCQkJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJXXzQwLCBjb250cm9sX2NoYW5uZWwoJWQpLCBDZW50cmFsQ2hhbm5lbCglZCkgXG4iLAorCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCkpOworCQkJCX0KKwkJCQllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkJeworCQkJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKKwkJCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJXXzIwLCBDaGFubmVsKCVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCQkJCX0KKwkJCX0KKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQlzdWNjZXNzID0gVFJVRTsKKwl9CisJZWxzZQorCXsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJc3VjY2VzcyA9IEZBTFNFOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KKworCisJaWYgKHN1Y2Nlc3MgPT0gVFJVRSkKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0NoYW5uZWxfUHJvYzo6KENoYW5uZWw9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7CisKKwlyZXR1cm4gc3VjY2VzczsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgU2hvcnQgU2xvdCBUaW1lIEVuYWJsZSBvciBEaXNhYmxlCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X1Nob3J0U2xvdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBTaG9ydFNsb3Q7CisKKwlTaG9ydFNsb3QgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKFNob3J0U2xvdCA9PSAxKQorCQlwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSA9IFRSVUU7CisJZWxzZSBpZiAoU2hvcnRTbG90ID09IDApCisJCXBBZC0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lID0gRkFMU0U7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9TaG9ydFNsb3RfUHJvYzo6KFNob3J0U2xvdD0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgVHggcG93ZXIKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfVHhQb3dlcl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBUeFBvd2VyOworCUlOVCAgIHN1Y2Nlc3MgPSBGQUxTRTsKKworCVR4UG93ZXIgPSAoVUxPTkcpIHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJaWYgKFR4UG93ZXIgPD0gMTAwKQorCXsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdCA9IFR4UG93ZXI7CisJCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0OworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCXN1Y2Nlc3MgPSBUUlVFOworCX0KKwllbHNlCisJCXN1Y2Nlc3MgPSBGQUxTRTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9UeFBvd2VyX1Byb2M6OihUeFBvd2VyUGVyY2VudGFnZT0lbGQpXG4iLCBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSkpOworCisJcmV0dXJuIHN1Y2Nlc3M7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IDExQi8xMUcgUHJvdGVjdGlvbgorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9CR1Byb3RlY3Rpb25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJc3dpdGNoIChzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApKQorCXsKKwkJY2FzZSAwOiAvL0FVVE8KKwkJCXBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAxOiAvL0Fsd2F5cyBPbgorCQkJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMTsKKwkJCWJyZWFrOworCQljYXNlIDI6IC8vQWx3YXlzIE9GRgorCQkJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OiAgLy9JbnZhbGlkIGFyZ3VtZW50CisJCQlyZXR1cm4gRkFMU0U7CisJfQorCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQkdQcm90ZWN0aW9uX1Byb2M6OihCR1Byb3RlY3Rpb249JWxkKVxuIiwgcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgVHhQcmVhbWJsZQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9UeFByZWFtYmxlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVJUXzgwMl8xMV9QUkVBTUJMRQlQcmVhbWJsZTsKKworCVByZWFtYmxlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCisJc3dpdGNoIChQcmVhbWJsZSkKKwl7CisJCWNhc2UgUnQ4MDJfMTFQcmVhbWJsZVNob3J0OgorCQkJcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFByZWFtYmxlOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQlNbG1lU2V0VHhQcmVhbWJsZShwQWQsIFJ0ODAyXzExUHJlYW1ibGVTaG9ydCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQlicmVhazsKKwkJY2FzZSBSdDgwMl8xMVByZWFtYmxlTG9uZzoKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJY2FzZSBSdDgwMl8xMVByZWFtYmxlQXV0bzoKKwkJCS8vIGlmIHVzZXIgd2FudHMgQVVUTywgaW5pdGlhbGl6ZSB0byBMT05HIGhlcmUsIHRoZW4gY2hhbmdlIGFjY29yZGluZyB0byBBUCdzCisJCQkvLyBjYXBhYmlsaXR5IHVwb24gYXNzb2NpYXRpb24uCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQlwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUHJlYW1ibGU7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCU1sbWVTZXRUeFByZWFtYmxlKHBBZCwgUnQ4MDJfMTFQcmVhbWJsZUxvbmcpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6IC8vSW52YWxpZCBhcmd1bWVudAorCQkJcmV0dXJuIEZBTFNFOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9UeFByZWFtYmxlX1Byb2M6OihUeFByZWFtYmxlPSVsZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUpKTsKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBSVFMgVGhyZXNob2xkCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X1JUU1RocmVzaG9sZF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwkgTkRJU184MDJfMTFfUlRTX1RIUkVTSE9MRCAgICAgICAgICAgUnRzVGhyZXNoOworCisJUnRzVGhyZXNoID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmKChSdHNUaHJlc2ggPiAwKSAmJiAoUnRzVGhyZXNoIDw9IE1BWF9SVFNfVEhSRVNIT0xEKSkKKwkJcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkICA9IChVU0hPUlQpUnRzVGhyZXNoOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCWVsc2UgaWYgKFJ0c1RocmVzaCA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPSBNQVhfUlRTX1RIUkVTSE9MRDsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfUlRTVGhyZXNob2xkX1Byb2M6OihSVFNUaHJlc2hvbGQ9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQpKTsKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBGcmFnbWVudCBUaHJlc2hvbGQKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfRnJhZ1RocmVzaG9sZF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwkgTkRJU184MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQgICAgIEZyYWdUaHJlc2g7CisKKwlGcmFnVGhyZXNoID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChGcmFnVGhyZXNoID4gTUFYX0ZSQUdfVEhSRVNIT0xEIHx8IEZyYWdUaHJlc2ggPCBNSU5fRlJBR19USFJFU0hPTEQpCisJeworCQkvL0lsbGVnYWwgRnJhZ1RocmVzaCBzbyB3ZSBzZXQgaXQgdG8gZGVmYXVsdAorCQlwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKKwl9CisJZWxzZSBpZiAoRnJhZ1RocmVzaCAlIDIgPT0gMSkKKwl7CisJCS8vIFRoZSBsZW5ndGggb2YgZWFjaCBmcmFnbWVudCBzaGFsbCBhbHdheXMgYmUgYW4gZXZlbiBudW1iZXIgb2Ygb2N0ZXRzLCBleGNlcHQgZm9yIHRoZSBsYXN0IGZyYWdtZW50CisJCS8vIG9mIGFuIE1TRFUgb3IgTU1QRFUsIHdoaWNoIG1heSBiZSBlaXRoZXIgYW4gZXZlbiBvciBhbiBvZGQgbnVtYmVyIG9mIG9jdGV0cy4KKwkJcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSAoVVNIT1JUKShGcmFnVGhyZXNoIC0gMSk7CisJfQorCWVsc2UKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gKFVTSE9SVClGcmFnVGhyZXNoOworCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlpZiAocEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPT0gTUFYX0ZSQUdfVEhSRVNIT0xEKQorCQkJcEFkLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9IFRSVUU7CisJCWVsc2UKKwkJCXBBZC0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBGQUxTRTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfRnJhZ1RocmVzaG9sZF9Qcm9jOjooRnJhZ1RocmVzaG9sZD0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgVHhCdXJzdAorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9UeEJ1cnN0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIFR4QnVyc3Q7CisKKwlUeEJ1cnN0ID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKwlpZiAoVHhCdXJzdCA9PSAxKQorCQlwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCA9IFRSVUU7CisJZWxzZSBpZiAoVHhCdXJzdCA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCA9IEZBTFNFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfVHhCdXJzdF9Qcm9jOjooVHhCdXJzdD0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0KSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFR4QnVyc3QKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfUGt0QWdncmVnYXRlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIGFnZ3JlOworCisJYWdncmUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKGFnZ3JlID09IDEpCisJCXBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUgPSBUUlVFOworCWVsc2UgaWYgKGFnZ3JlID09IDApCisJCXBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUgPSBGQUxTRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAorCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfUGt0QWdncmVnYXRlX1Byb2M6OihBR0dSRT0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUpKTsKKworCXJldHVybiBUUlVFOworfQorI2VuZGlmCisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IElFRUU4MDIxMUguCisgICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIDEgd2hlbiBuZWVkcyByYWRhciBkZXRlY3Rpb24sIG90aGVyd2lzZSAwCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0lFRUU4MDIxMUhfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisgICAgVUxPTkcgaWVlZTgwMjExaDsKKworCWllZWU4MDIxMWggPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKGllZWU4MDIxMWggPT0gMSkKKwkJcEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPSBUUlVFOworCWVsc2UgaWYgKGllZWU4MDIxMWggPT0gMCkKKwkJcEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPSBGQUxTRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0lFRUU4MDIxMUhfUHJvYzo6KElFRUU4MDIxMUg9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKworI2lmZGVmIERCRworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBGb3IgRGVidWcgaW5mb3JtYXRpb24KKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfRGVidWdfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IFNldF9EZWJ1Z19Qcm9jICoqKioqKioqKioqKioqKioqKipcbiIpKTsKKworICAgIGlmKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPD0gUlRfREVCVUdfTE9VRCkKKyAgICAgICAgUlREZWJ1Z0xldmVsID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBTZXRfRGVidWdfUHJvYyhSVERlYnVnTGV2ZWwgPSAlbGQpXG4iLCBSVERlYnVnTGV2ZWwpKTsKKworCXJldHVybiBUUlVFOworfQorI2VuZGlmCisKK0lOVAlTaG93X0Rlc2NJbmZvX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworI2lmZGVmIFJUMjg2MAorCUlOVCBpLCBRdWVJZHg9MDsKKwlQUlQyOFhYX1JYRF9TVFJVQyBwUnhEOworICAgIFBUWERfU1RSVUMgcFR4RDsKKwlQUlRNUF9UWF9SSU5HCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbUXVlSWR4XTsKKwlQUlRNUF9NR01UX1JJTkcJcE1nbXRSaW5nID0gJnBBZC0+TWdtdFJpbmc7CisJUFJUTVBfUlhfUklORwlwUnhSaW5nID0gJnBBZC0+UnhSaW5nOworCisJZm9yKGk9MDtpPFRYX1JJTkdfU0laRTtpKyspCisJeworCSAgICBwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbaV0uQWxsb2NWYTsKKwkgICAgcHJpbnRrKCJEZXNjICMlZFxuIixpKTsKKwkgICAgaGV4X2R1bXAoIlR4IERlc2NyaXB0b3IiLCAoY2hhciAqKXBUeEQsIDE2KTsKKwkgICAgcHJpbnRrKCJwVHhELT5ETUFET05FID0gJXhcbiIsIHBUeEQtPkRNQURPTkUpOworCX0KKwlwcmludGsoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJZm9yKGk9MDtpPE1HTVRfUklOR19TSVpFO2krKykKKwl7CisJICAgIHBUeEQgPSAoUFRYRF9TVFJVQykgcE1nbXRSaW5nLT5DZWxsW2ldLkFsbG9jVmE7CisJICAgIHByaW50aygiRGVzYyAjJWRcbiIsaSk7CisJICAgIGhleF9kdW1wKCJNZ210IERlc2NyaXB0b3IiLCAoY2hhciAqKXBUeEQsIDE2KTsKKwkgICAgcHJpbnRrKCJwTWdtdC0+RE1BRE9ORSA9ICV4XG4iLCBwVHhELT5ETUFET05FKTsKKwl9CisJcHJpbnRrKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCWZvcihpPTA7aTxSWF9SSU5HX1NJWkU7aSsrKQorCXsKKwkgICAgcFJ4RCA9IChQUlQyOFhYX1JYRF9TVFJVQykgcFJ4UmluZy0+Q2VsbFtpXS5BbGxvY1ZhOworCSAgICBwcmludGsoIkRlc2MgIyVkXG4iLGkpOworCSAgICBoZXhfZHVtcCgiUnggRGVzY3JpcHRvciIsIChjaGFyICopcFJ4RCwgMTYpOworCQlwcmludGsoInBSeEQtPkRET05FID0gJXhcbiIsIHBSeEQtPkRET05FKTsKKwl9CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBSZXNldCBzdGF0aXN0aWNzIGNvdW50ZXIKKworICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkYXB0ZXIgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgICAgIGFyZworCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X1Jlc2V0U3RhdENvdW50ZXJfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+U2V0X1Jlc2V0U3RhdENvdW50ZXJfUHJvY1xuIikpOworCisJLy8gYWRkIHRoZSBtb3N0IHVwLXRvLWRhdGUgaC93IHJhdyBjb3VudGVycyBpbnRvIHNvZnR3YXJlIGNvdW50ZXJzCisJTklDVXBkYXRlUmF3Q291bnRlcnMocEFkKTsKKworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPldsYW5Db3VudGVycywgc2l6ZW9mKENPVU5URVJfODAyXzExKSk7CisJTmRpc1plcm9NZW1vcnkoJnBBZC0+Q291bnRlcnM4MDIzLCBzaXplb2YoQ09VTlRFUl84MDJfMykpOworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlJhbGlua0NvdW50ZXJzLCBzaXplb2YoQ09VTlRFUl9SQUxJTkspKTsKKworCXJldHVybiBUUlVFOworfQorCitCT09MRUFOIFJUTVBDaGVja1N0clByaW50QWJsZSgKKyAgICBJTiAgQ0hBUiAqcEluUHV0U3RyLAorICAgIElOICBVQ0hBUiBzdHJMZW4pCit7CisgICAgVUNIQVIgaT0wOworCisgICAgZm9yIChpPTA7IGk8c3RyTGVuOyBpKyspCisgICAgeworICAgICAgICBpZiAoKHBJblB1dFN0cltpXSA8IDB4MjEpIHx8CisgICAgICAgICAgICAocEluUHV0U3RyW2ldID4gMHg3RSkpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlSZW1vdmUgV1BBIEtleSBwcm9jZXNzCisKKwlBcmd1bWVudHM6CisJCXBBZCAJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcEJ1ZgkJCQkJCQlQb2ludGVyIHRvIHRoZSB3aGVyZSB0aGUga2V5IHN0b3JlZAorCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NVQ0NFU1MJCQkJCUFkZCBrZXkgc3VjY2Vzc2Z1bGx5CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitWT0lEICAgIFJUTVBTZXREZXNpcmVkUmF0ZXMoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgTE9ORyAgICAgICAgICAgIFJhdGVzKQoreworICAgIE5ESVNfODAyXzExX1JBVEVTIGFyeVJhdGVzOworCisgICAgbWVtc2V0KCZhcnlSYXRlcywgMHgwMCwgc2l6ZW9mKE5ESVNfODAyXzExX1JBVEVTKSk7CisgICAgc3dpdGNoIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUpCisgICAgeworICAgICAgICBjYXNlIFBIWV8xMUE6IC8vIEEgb25seQorICAgICAgICAgICAgc3dpdGNoIChSYXRlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDYwMDAwMDA6IC8vNk0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDBjOyAvLyA2TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgOTAwMDAwMDogLy85TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MTI7IC8vIDlNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxMjAwMDAwMDogLy8xMk0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDE4OyAvLyAxMk0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18yOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE4MDAwMDAwOiAvLzE4TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MjQ7IC8vIDE4TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjQwMDAwMDA6IC8vMjRNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgzMDsgLy8gMjRNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzNjAwMDAwMDogLy8zNk0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDQ4OyAvLyAzNk0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU181OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQ4MDAwMDAwOiAvLzQ4TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4NjA7IC8vIDQ4TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzY7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNTQwMDAwMDA6IC8vNTRNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHg2YzsgLy8gNTRNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAtMTogLy9BdXRvCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDZjOyAvLyA1NE1icHMKKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMV0gPSAweDYwOyAvLyA0OE1icHMKKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMl0gPSAweDQ4OyAvLyAzNk1icHMKKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbM10gPSAweDMwOyAvLyAyNE1icHMKKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbNF0gPSAweDI0OyAvLyAxOE0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbNV0gPSAweDE4OyAvLyAxMk0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbNl0gPSAweDEyOyAvLyA5TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1s3XSA9IDB4MGM7IC8vIDZNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQSFlfMTFCR19NSVhFRDogLy8gQi9HIE1peGVkCisgICAgICAgIGNhc2UgUEhZXzExQjogLy8gQiBvbmx5CisgICAgICAgIGNhc2UgUEhZXzExQUJHX01JWEVEOiAvLyBBL0IvRyBNaXhlZAorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc3dpdGNoIChSYXRlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEwMDAwMDA6IC8vMU0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDAyOworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjAwMDAwMDogLy8yTQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MDQ7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA1MDAwMDAwOiAvLzUuNU0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDBiOyAvLyA1LjVNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxMTAwMDAwMDogLy8xMU0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDE2OyAvLyAxMU0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18zOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDYwMDAwMDA6IC8vNk0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDBjOyAvLyA2TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgOTAwMDAwMDogLy85TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MTI7IC8vIDlNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxMjAwMDAwMDogLy8xMk0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDE4OyAvLyAxMk0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18yOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE4MDAwMDAwOiAvLzE4TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MjQ7IC8vIDE4TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjQwMDAwMDA6IC8vMjRNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgzMDsgLy8gMjRNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzNjAwMDAwMDogLy8zNk0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDQ4OyAvLyAzNk0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU181OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQ4MDAwMDAwOiAvLzQ4TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4NjA7IC8vIDQ4TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzY7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNTQwMDAwMDA6IC8vNTRNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHg2YzsgLy8gNTRNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAtMTogLy9BdXRvCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCKQorICAgICAgICAgICAgICAgICAgICB7IC8vQiBPbmx5CisgICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MTY7IC8vIDExTWJwcworICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMV0gPSAweDBiOyAvLyA1LjVNYnBzCisgICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1syXSA9IDB4MDQ7IC8vIDJNYnBzCisgICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1szXSA9IDB4MDI7IC8vIDFNYnBzCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7IC8vKEIvRykgTWl4ZWQgb3IgKEEvQi9HKSBNaXhlZAorICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDZjOyAvLyA1NE1icHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzFdID0gMHg2MDsgLy8gNDhNYnBzCisgICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1syXSA9IDB4NDg7IC8vIDM2TWJwcworICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbM10gPSAweDMwOyAvLyAyNE1icHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzRdID0gMHgxNjsgLy8gMTFNYnBzCisgICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1s1XSA9IDB4MGI7IC8vIDUuNU1icHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzZdID0gMHgwNDsgLy8gMk1icHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzddID0gMHgwMjsgLy8gMU1icHMKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTX0FVVE87CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlLCAmYXJ5UmF0ZXMsIHNpemVvZihORElTXzgwMl8xMV9SQVRFUykpOworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBSVE1QU2V0RGVzaXJlZFJhdGVzICglMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngpXG4iLAorICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMF0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzFdLAorICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMl0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzNdLAorICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNF0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzVdLAorICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNl0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzddICkpOworICAgIC8vIENoYW5naW5nIERlc2lyZWRSYXRlIG1heSBhZmZlY3QgdGhlIE1BWCBUWCByYXRlIHdlIHVzZWQgdG8gVFggZnJhbWVzIG91dAorICAgIE1sbWVVcGRhdGVUeFJhdGVzKHBBZGFwdGVyLCBGQUxTRSwgMCk7Cit9CisKK05ESVNfU1RBVFVTIFJUTVBXUEFSZW1vdmVLZXlQcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBWT0lECQkJcEJ1ZikKK3sKKwlQTkRJU184MDJfMTFfUkVNT1ZFX0tFWSBwS2V5OworCVVMT05HCQkJCQlLZXlJZHg7CisJTkRJU19TVEFUVVMgCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwlCT09MRUFOIAliVHhLZXk7IAkJLy8gU2V0IHRoZSBrZXkgYXMgdHJhbnNtaXQga2V5CisJQk9PTEVBTiAJYlBhaXJ3aXNlOwkJLy8gSW5kaWNhdGUgdGhlIGtleSBpcyBwYWlyd2lzZSBrZXkKKwlCT09MRUFOIAliS2V5UlNDOwkJLy8gaW5kaWNhdGUgdGhlIHJlY2VpdmUgIFNDIHNldCBieSBLZXlSU0MgdmFsdWUuCisJCQkJCQkJCS8vIE90aGVyd2lzZSwgaXQgd2lsbCBzZXQgYnkgdGhlIE5JQy4KKwlCT09MRUFOIAliQXV0aGVudGljYXRvcjsgLy8gaW5kaWNhdGUga2V5IGlzIHNldCBieSBhdXRoZW50aWNhdG9yLgorCUlOVCAJCWk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIi0tLT4gUlRNUFdQQVJlbW92ZUtleVByb2NcbiIpKTsKKworCXBLZXkgPSAoUE5ESVNfODAyXzExX1JFTU9WRV9LRVkpIHBCdWY7CisJS2V5SWR4ID0gcEtleS0+S2V5SW5kZXggJiAweGZmOworCS8vIEJpdCAzMSBvZiBBZGQta2V5LCBUeCBLZXkKKwliVHhLZXkJCSAgID0gKHBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkgPyBUUlVFIDogRkFMU0U7CisJLy8gQml0IDMwIG9mIEFkZC1rZXkgUGFpcndpc2VLZXkKKwliUGFpcndpc2UJICAgPSAocEtleS0+S2V5SW5kZXggJiAweDQwMDAwMDAwKSA/IFRSVUUgOiBGQUxTRTsKKwkvLyBCaXQgMjkgb2YgQWRkLWtleSBLZXlSU0MKKwliS2V5UlNDIAkgICA9IChwS2V5LT5LZXlJbmRleCAmIDB4MjAwMDAwMDApID8gVFJVRSA6IEZBTFNFOworCS8vIEJpdCAyOCBvZiBBZGQta2V5IEF1dGhlbnRpY2F0b3IKKwliQXV0aGVudGljYXRvciA9IChwS2V5LT5LZXlJbmRleCAmIDB4MTAwMDAwMDApID8gVFJVRSA6IEZBTFNFOworCisJLy8gMS4gSWYgYlR4IGlzIFRSVUUsIHJldHVybiBmYWlsdXJlIGluZm9ybWF0aW9uCisJaWYgKGJUeEtleSA9PSBUUlVFKQorCQlyZXR1cm4oTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBKTsKKworCS8vIDIuIENoZWNrIFBhaXJ3aXNlIEtleQorCWlmIChiUGFpcndpc2UpCisJeworCQkvLyBhLiBJZiBCU1NJRCBpcyBicm9hZGNhc3QsIHJlbW92ZSBhbGwgcGFpcndpc2Uga2V5cy4KKwkJLy8gYi4gSWYgbm90IGJyb2FkY2FzdCwgcmVtb3ZlIHRoZSBwYWlyd2lzZSBzcGVjaWZpZWQgYnkgQlNTSUQKKwkJZm9yIChpID0gMDsgaSA8IFNIQVJFX0tFWV9OVU07IGkrKykKKwkJeworCQkJaWYgKE1BQ19BRERSX0VRVUFMKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkJzc0lkLCBwS2V5LT5CU1NJRCkpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSVE1QV1BBUmVtb3ZlS2V5UHJvYyhLZXlJZHg9JWQpXG4iLCBpKSk7CisJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uS2V5TGVuID0gMDsKKwkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCAoVUNIQVIpaSk7CisJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwkvLyAzLiBHcm91cCBLZXkKKwllbHNlCisJeworCQkvLyBhLiBJZiBCU1NJRCBpcyBicm9hZGNhc3QsIHJlbW92ZSBhbGwgZ3JvdXAga2V5cyBpbmRleGVkCisJCS8vIGIuIElmIEJTU0lEIG1hdGNoZWQsIGRlbGV0ZSB0aGUgZ3JvdXAga2V5IGluZGV4ZWQuCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFdQQVJlbW92ZUtleVByb2MoS2V5SWR4PSVsZClcbiIsIEtleUlkeCkpOworCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9IDA7CisJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJCUFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIChVQ0hBUilLZXlJZHgpOworCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCX0KKworCXJldHVybiAoU3RhdHVzKTsKK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUmVtb3ZlIEFsbCBXUEEgS2V5cworCisJQXJndW1lbnRzOgorCQlwQWQgCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFdQQVJlbW92ZUFsbEtleXMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisKKwlVQ0hBUiAJaTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFdQQVJlbW92ZUFsbEtleXMoQXV0aE1vZGU9JWQsIFdlcFN0YXR1cz0lZClcbiIsIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMpKTsKKworCS8vIEZvciBXRVAvQ0tJUCwgdGhlcmUgaXMgbm8gbmVlZCB0byByZW1vdmUgaXQsIHNpbmNlIFdpblhQIHdvbid0IHNldCBpdCBhZ2FpbiBhZnRlcgorCS8vIExpbmsgdXAuIEFuZCBpdCB3aWxsIGJlIHJlcGxhY2VkIGlmIHVzZXIgY2hhbmdlZCBpdC4KKwlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJCXJldHVybjsKKworCS8vIEZvciBXUEEtTm9uZSwgdGhlcmUgaXMgbm8gbmVlZCB0byByZW1vdmUgaXQsIHNpbmNlIFdpblhQIHdvbid0IHNldCBpdCBhZ2FpbiBhZnRlcgorCS8vIExpbmsgdXAuIEFuZCBpdCB3aWxsIGJlIHJlcGxhY2VkIGlmIHVzZXIgY2hhbmdlZCBpdC4KKwlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKwkJcmV0dXJuOworCisJLy8gc2V0IEJTU0lEIHdjaWQgZW50cnkgb2YgdGhlIFBhaXItd2lzZSBLZXkgdGFibGUgYXMgbm8tc2VjdXJpdHkgbW9kZQorCUFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KHBBZCwgQlNTMCwgQlNTSURfV0NJRCk7CisKKwkvLyBzZXQgYWxsIHNoYXJlZCBrZXkgbW9kZSBhcyBuby1zZWN1cml0eS4KKwlmb3IgKGkgPSAwOyBpIDwgU0hBUkVfS0VZX05VTTsgaSsrKQorICAgIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJyZW1vdmUgJXMga2V5ICMlZFxuIiwgQ2lwaGVyTmFtZVtwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGddLCBpKSk7CisJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVtpXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKworCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCBpKTsKKwl9CisKK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDaGFuZ2UgTklDIFBIWSBtb2RlLiBSZS1hc3NvY2lhdGlvbiBtYXkgYmUgbmVjZXNzYXJ5LiBwb3NzaWJsZSBzZXR0aW5ncworCQlpbmNsdWRlIC0gUEhZXzExQiwgUEhZXzExQkdfTUlYRUQsIFBIWV8xMUEsIGFuZCBQSFlfMTFBQkdfTUlYRUQKKworCUFyZ3VtZW50czoKKwkJcEFkIC0gUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwaHltb2RlICAtCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QU2V0UGh5TW9kZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVTE9ORyBwaHltb2RlKQoreworCUlOVCBpOworCS8vIHRoZSBzZWxlY3RlZCBwaHltb2RlIG11c3QgYmUgc3VwcG9ydGVkIGJ5IHRoZSBSRiBJQyBlbmNvZGVkIGluIEUyUFJPTQorCisJLy8gaWYgbm8gY2hhbmdlLCBkbyBub3RoaW5nCisJLyogYnVnIGZpeAorCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IHBoeW1vZGUpCisJCXJldHVybjsKKyAgICAqLworCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSAoVUNIQVIpcGh5bW9kZTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFNldFBoeU1vZGUgOiBQaHlNb2RlPSVkLCBjaGFubmVsPSVkIFxuIiwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwlCdWlsZENoYW5uZWxMaXN0RXgocEFkKTsKKyNlbHNlCisJQnVpbGRDaGFubmVsTGlzdChwQWQpOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKworCS8vIHNhbml0eSBjaGVjayB1c2VyIHNldHRpbmcKKwlmb3IgKGkgPSAwOyBpIDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPT0gcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gcEFkLT5DaGFubmVsTGlzdE51bSkKKwl7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsID0gRmlyc3RDaGFubmVsKHBBZCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBTZXRQaHlNb2RlOiBjaGFubmVsIGlzIG91dCBvZiByYW5nZSwgdXNlIGZpcnN0IGNoYW5uZWw9JWQgXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJfQorCisJTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcuU3VwUmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOworCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKwlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisJc3dpdGNoIChwaHltb2RlKSB7CisJCWNhc2UgUEhZXzExQjoKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMF0gID0gMHg4MjsJICAvLyAxIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzFdICA9IDB4ODQ7CSAgLy8gMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQorCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVsyXSAgPSAweDhCOwkgIC8vIDUuNSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQorCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVszXSAgPSAweDk2OwkgIC8vIDExIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuICA9IDQ7CisJCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuICA9IDA7CisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzBdICA9IDI7CSAgIC8vIDEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMV0gID0gNDsJICAgLy8gMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsyXSAgPSAxMTsgICAgLy8gNS41IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzNdICA9IDIyOyAgICAvLyAxMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJLy9wQWQtPkNvbW1vbkNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOyAvLyBUaGlzIE1PREUgaXMgb25seSBGWUkuIG5vdCB1c2UKKwkJCWJyZWFrOworCisJCWNhc2UgUEhZXzExRzoKKwkJY2FzZSBQSFlfMTFCR19NSVhFRDoKKwkJY2FzZSBQSFlfMTFBQkdfTUlYRUQ6CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgUEhZXzExTl8yXzRHOgorCQljYXNlIFBIWV8xMUFCR05fTUlYRUQ6CisJCWNhc2UgUEhZXzExQkdOX01JWEVEOgorCQljYXNlIFBIWV8xMUdOX01JWEVEOgorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVswXSAgPSAweDgyOwkgIC8vIDEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMV0gID0gMHg4NDsJICAvLyAyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzJdICA9IDB4OEI7CSAgLy8gNS41IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzNdICA9IDB4OTY7CSAgLy8gMTEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNF0gID0gMHgxMjsJICAvLyA5IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzVdICA9IDB4MjQ7CSAgLy8gMTggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNl0gID0gMHg0ODsJICAvLyAzNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs3XSAgPSAweDZjOwkgIC8vIDU0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuICA9IDg7CisJCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlWzBdICA9IDB4MEM7CSAgLy8gNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZVsxXSAgPSAweDE4OwkgIC8vIDEyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlWzJdICA9IDB4MzA7CSAgLy8gMjQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVbM10gID0gMHg2MDsJICAvLyA0OCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbiAgPSA0OworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVswXSAgPSAyOwkgICAvLyAxIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzFdICA9IDQ7CSAgIC8vIDIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMl0gID0gMTE7ICAgIC8vIDUuNSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVszXSAgPSAyMjsgICAgLy8gMTEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNF0gID0gMTI7ICAgIC8vIDYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNV0gID0gMTg7ICAgIC8vIDkgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNl0gID0gMjQ7ICAgIC8vIDEyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzddICA9IDM2OyAgICAvLyAxOCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs4XSAgPSA0ODsgICAgLy8gMjQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbOV0gID0gNzI7ICAgIC8vIDM2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzEwXSA9IDk2OyAgICAvLyA0OCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxMV0gPSAxMDg7ICAgLy8gNTQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCWJyZWFrOworCisJCWNhc2UgUEhZXzExQToKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJY2FzZSBQSFlfMTFBTl9NSVhFRDoKKwkJY2FzZSBQSFlfMTFBR05fTUlYRUQ6CisJCWNhc2UgUEhZXzExTl81RzoKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMF0gID0gMHg4QzsJICAvLyA2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzFdICA9IDB4MTI7CSAgLy8gOSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVsyXSAgPSAweDk4OwkgIC8vIDEyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzNdICA9IDB4MjQ7CSAgLy8gMTggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNF0gID0gMHhiMDsJICAvLyAyNCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQorCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs1XSAgPSAweDQ4OwkgIC8vIDM2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzZdICA9IDB4NjA7CSAgLy8gNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbN10gID0gMHg2YzsJICAvLyA1NCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbiAgPSA4OworCQkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbiAgPSAwOworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVswXSAgPSAxMjsgICAgLy8gNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxXSAgPSAxODsgICAgLy8gOSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsyXSAgPSAyNDsgICAgLy8gMTIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbM10gID0gMzY7ICAgIC8vIDE4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzRdICA9IDQ4OyAgICAvLyAyNCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs1XSAgPSA3MjsgICAgLy8gMzYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNl0gID0gOTY7ICAgIC8vIDQ4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzddICA9IDEwODsgICAvLyA1NCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJLy9wQWQtPkNvbW1vbkNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsgLy8gVGhpcyBNT0RFIGlzIG9ubHkgRllJLiBub3QgdXNlCisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisKKwlwQWQtPkNvbW1vbkNmZy5CYW5kU3RhdGUgPSBVTktOT1dOX0JBTkQ7Cit9CisKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDYWxsZXIgZW5zdXJlcyB3ZSBoYXMgODAyLjExbiBzdXBwb3J0LgorCQlDYWxscyBhdCBzZXR0aW5nIEhUIGZyb20gQVAvU1RBU2V0aW5mb3JtYXRpb24KKworCUFyZ3VtZW50czoKKwkJcEFkIC0gUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwaHltb2RlICAtCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBTZXRIVCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglPSURfU0VUX0hUX1BIWU1PREUgKnBIVFBoeU1vZGUpCit7CisJLy9VTE9ORwkqcG1jczsKKwlVSU5UMzIJVmFsdWUgPSAwOworCVVDSEFSCUJCUFZhbHVlID0gMDsKKwlVQ0hBUglCQlAzVmFsdWUgPSAwOworCVVDSEFSCVJ4U3RyZWFtID0gcEFkLT5Db21tb25DZmcuUnhTdHJlYW07CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2V0SFQgOiBIVF9tb2RlKCVkKSwgRXh0T2Zmc2V0KCVkKSwgTUNTKCVkKSwgQlcoJWQpLCBTVEJDKCVkKSwgU0hPUlRHSSglZClcbiIsCisJCQkJCQkJCQkJcEhUUGh5TW9kZS0+SHRNb2RlLCBwSFRQaHlNb2RlLT5FeHRPZmZzZXQsCisJCQkJCQkJCQkJcEhUUGh5TW9kZS0+TUNTLCBwSFRQaHlNb2RlLT5CVywKKwkJCQkJCQkJCQlwSFRQaHlNb2RlLT5TVEJDLCBwSFRQaHlNb2RlLT5TSE9SVEdJKSk7CisKKwkvLyBEb24ndCB6ZXJvIHN1cHBvcnRlZEh5UGh5IHN0cnVjdHVyZS4KKwlSVE1QWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LCBzaXplb2YocEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5KSk7CisJUlRNUFplcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbywgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbykpOworCVJUTVBaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5OZXdFeHRDaGFuT2Zmc2V0LCBzaXplb2YocEFkLT5Db21tb25DZmcuTmV3RXh0Q2hhbk9mZnNldCkpOworCVJUTVBaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHksIHNpemVvZihwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkpKTsKKworICAgCWlmIChwQWQtPkNvbW1vbkNmZy5iUmRnKQorCXsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDID0gMTsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0ID0gMTsKKwl9CisJZWxzZQorCXsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDID0gMDsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0ID0gMDsKKwl9CisKKwlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1heFJBbXBkdUZhY3RvciA9IDM7CisJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1heFJBbXBkdUZhY3RvciA9IDM7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2V0SFQgOiBSeEJBV2luTGltaXQgPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCkpOworCisJLy8gTWltbyBwb3dlciBzYXZlLCBBLU1TRFUgc2l6ZSwKKwlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUgPSAoVVNIT1JUKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZTsKKwlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdVNpemU7CisJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QcyA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGU7CisJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5ID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eTsKKworCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVTaXplOworCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGU7CisJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2V0SFQgOiBBTXNkdVNpemUgPSAlZCwgTWltb1BzID0gJWQsIE1wZHVEZW5zaXR5ID0gJWQsIE1heFJBbXBkdUZhY3RvciA9ICVkXG4iLAorCQkJCQkJCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemUsCisJCQkJCQkJCQkJCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QcywKKwkJCQkJCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTXBkdURlbnNpdHksCisJCQkJCQkJCQkJCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1heFJBbXBkdUZhY3RvcikpOworCisJaWYocEhUUGh5TW9kZS0+SHRNb2RlID09IEhUTU9ERV9HRikKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uR0YgPSAxOworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuR0YgPSAxOworCX0KKwllbHNlCisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRiA9IDA7CisKKwkvLyBEZWNpZGUgUnggTUNTU2V0CisJc3dpdGNoIChSeFN0cmVhbSkKKwl7CisJCWNhc2UgMToKKwkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAgMHhmZjsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAgMHgwMDsKKwkJCWJyZWFrOworCisJCWNhc2UgMjoKKwkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAgMHhmZjsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAgMHhmZjsKKwkJCWJyZWFrOworCisJCWNhc2UgMzogLy8gMyozCisJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzBdID0gIDB4ZmY7CisJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzFdID0gIDB4ZmY7CisJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzJdID0gIDB4ZmY7CisJCQlicmVhazsKKwl9CisKKwlpZiAocEFkLT5Db21tb25DZmcuYkZvcnR5X01oel9JbnRvbGVyYW50ICYmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KSAmJiAocEhUUGh5TW9kZS0+QlcgPT0gQldfNDApICkKKwl7CisJCXBIVFBoeU1vZGUtPkJXID0gQldfMjA7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uRm9ydHlfTWh6X0ludG9sZXJhbnQgPSAxOworCX0KKworCWlmKHBIVFBoeU1vZGUtPkJXID09IEJXXzQwKQorCXsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFs0XSA9IDB4MTsgLy8gTUNTIDMyCisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID0gMTsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpCisJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNDS21vZGVpbjQwID0gMTsKKworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoID0gMTsKKwkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5SZWNvbVdpZHRoID0gMTsKKwkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID0gKHBIVFBoeU1vZGUtPkV4dE9mZnNldCA9PSBFWFRDSEFfQkVMT1cpPyAoRVhUQ0hBX0JFTE9XKTogRVhUQ0hBX0FCT1ZFOworCQkvLyBTZXQgUmVnc2l0ZXIgZm9yIGV4dGVuc2lvbiBjaGFubmVsIHBvc2l0aW9uLgorCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmVmFsdWUpOworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCQlAzVmFsdWUpOworCQlpZiAoKHBIVFBoeU1vZGUtPkV4dE9mZnNldCA9PSBFWFRDSEFfQkVMT1cpKQorCQl7CisJCQlWYWx1ZSB8PSAweDE7CisJCQlCQlAzVmFsdWUgfD0gKDB4MjApOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIFZhbHVlKTsKKwkJfQorCQllbHNlIGlmICgocEhUUGh5TW9kZS0+RXh0T2Zmc2V0ID09IEVYVENIQV9BQk9WRSkpCisJCXsKKwkJCVZhbHVlICY9IDB4ZmU7CisJCQlCQlAzVmFsdWUgJj0gKH4weDIwKTsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7CisJCX0KKworCQkvLyBUdXJuIG9uIEJCUCA0ME1IeiBtb2RlIG5vdyBvbmx5IGFzIEFQIC4KKwkJLy8gU3RhIGNhbiB0dXJuIG9uIEJCUCA0ME1IeiBhZnRlciBjb25uZWN0aW9uIHdpdGggNDBNSHogQVAuIFN0YSBvbmx5IGJyb2FkY2FzdCA0ME1IeiBjYXBhYmlsaXR5IGJlZm9yZSBjb25uZWN0aW9uLgorCQlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkgfHwgSU5GUkFfT04ocEFkKSB8fCBBREhPQ19PTihwQWQpCisJCQkpCisJCXsKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKKwkJCUJCUFZhbHVlICY9ICh+MHgxOCk7CisJCQlCQlBWYWx1ZSB8PSAweDEwOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOworCisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCQlAzVmFsdWUpOworCQkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPSAwOworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoID0gMDsKKwkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5SZWNvbVdpZHRoID0gMDsKKwkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID0gRVhUQ0hBX05PTkU7CisJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKKwkJLy8gVHVybiBvbiBCQlAgMjBNSHogbW9kZSBieSByZXF1ZXN0IGhlcmUuCisJCXsKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKKwkJCUJCUFZhbHVlICY9ICh+MHgxOCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7CisJCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV18yMDsKKwkJfQorCX0KKworCWlmKHBIVFBoeU1vZGUtPlNUQkMgPT0gU1RCQ19VU0UpCisJeworCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlR4U1RCQyA9IDE7CisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMgPSAxOworCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQyA9IDE7CisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5SeFNUQkMgPSAxOworCX0KKwllbHNlCisJeworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDID0gMDsKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlJ4U1RCQyA9IDA7CisJfQorCisKKwlpZihwSFRQaHlNb2RlLT5TSE9SVEdJID09IEdJXzQwMCkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjIwID0gMTsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yNDAgPSAxOworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjIwID0gMTsKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3I0MCA9IDE7CisJfQorCWVsc2UKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjIwID0gMDsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yNDAgPSAwOworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjIwID0gMDsKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3I0MCA9IDA7CisJfQorCisJLy8gV2Ugc3VwcG9ydCBsaW5rIGFkYXB0YXRpb24gZm9yIHVuc29saWNpdCBNQ1MgZmVlZGJhY2ssIHNldCB0byAyLgorCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uTUNTRmVlZGJhY2sgPSBNQ1NGQktfTk9ORTsgLy9NQ1NGQktfVU5TT0xJQ0lUOworCXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5Db250cm9sQ2hhbiA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJLy8gMSwgdGhlIGV4dGVuc2lvbiBjaGFubmVsIGFib3ZlIHRoZSBjb250cm9sIGNoYW5uZWwuCisKKwkvLyBFRENBIHBhcmFtZXRlcnMgdXNlZCBmb3IgQVAncyBvd24gdHJhbnNtaXNzaW9uCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYlZhbGlkID09IEZBTFNFKQorCXsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iVmFsaWQgPSBUUlVFOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkFpZnNuWzBdID0gMzsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblsxXSA9IDc7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQWlmc25bMl0gPSAxOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkFpZnNuWzNdID0gMTsKKworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWluWzBdID0gNDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21pblsxXSA9IDQ7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtaW5bMl0gPSAzOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWluWzNdID0gMjsKKworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWF4WzBdID0gNjsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFsxXSA9IDEwOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWF4WzJdID0gNDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFszXSA9IDM7CisKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzBdICA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFsxXSAgPSAwOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbMl0gID0gOTQ7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFszXSAgPSA0NzsKKwl9CisJQXNpY1NldEVkY2FQYXJtKHBBZCwgJnBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0pOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJUlRNUFNldEluZGl2aWR1YWxIVChwQWQsIDApOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNhbGxlciBlbnN1cmVzIHdlIGhhcyA4MDIuMTFuIHN1cHBvcnQuCisJCUNhbGxzIGF0IHNldHRpbmcgSFQgZnJvbSBBUC9TVEFTZXRpbmZvcm1hdGlvbgorCisJQXJndW1lbnRzOgorCQlwQWQgLSBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBoeW1vZGUgIC0KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFNldEluZGl2aWR1YWxIVCgKKwlJTglQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4JVUNIQVIJCQkJYXBpZHgpCit7CisJUFJUX0hUX1BIWV9JTkZPCQlwRGVzaXJlZF9odF9waHkgPSBOVUxMOworCVVDSEFSCVR4U3RyZWFtID0gcEFkLT5Db21tb25DZmcuVHhTdHJlYW07CisJVUNIQVIJRGVzaXJlZE1jcwk9IE1DU19BVVRPOworCisJZG8KKwl7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJcERlc2lyZWRfaHRfcGh5ID0gJnBBZC0+U3RhQ2ZnLkRlc2lyZWRIdFBoeUluZm87CisJCQlEZXNpcmVkTWNzID0gcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1M7CisJCQkvL3BBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gKERlc2lyZWRNY3MgPT0gTUNTX0FVVE8pID8gVFJVRSA6IEZBTFNFOworCQkJCWJyZWFrOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfSB3aGlsZSAoRkFMU0UpOworCisJaWYgKHBEZXNpcmVkX2h0X3BoeSA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRNUFNldEluZGl2aWR1YWxIVDogaW52YWxpZCBhcGlkeCglZClcbiIsIGFwaWR4KSk7CisJCXJldHVybjsKKwl9CisJUlRNUFplcm9NZW1vcnkocERlc2lyZWRfaHRfcGh5LCBzaXplb2YoUlRfSFRfUEhZX0lORk8pKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBTZXRJbmRpdmlkdWFsSFQgOiBEZXNpcmVkIE1DUyA9ICVkXG4iLCBEZXNpcmVkTWNzKSk7CisJLy8gQ2hlY2sgdGhlIHZhbGlkaXR5IG9mIE1DUworCWlmICgoVHhTdHJlYW0gPT0gMSkgJiYgKChEZXNpcmVkTWNzID49IE1DU184KSAmJiAoRGVzaXJlZE1jcyA8PSBNQ1NfMTUpKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUlRNUFNldEluZGl2aWR1YWxIVDogTUNTKCVkKSBpcyBpbnZhbGlkIGluIDFTLCByZXNldCBpdCBhcyBNQ1NfN1xuIiwgRGVzaXJlZE1jcykpOworCQlEZXNpcmVkTWNzID0gTUNTXzc7CisJfQorCisJaWYgKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoID09IEJXXzIwKSAmJiAoRGVzaXJlZE1jcyA9PSBNQ1NfMzIpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJSVE1QU2V0SW5kaXZpZHVhbEhUOiBNQ1NfMzIgaXMgb25seSBzdXBwb3J0ZWQgaW4gNDAtTUh6LCByZXNldCBpdCBhcyBNQ1NfMFxuIikpOworCQlEZXNpcmVkTWNzID0gTUNTXzA7CisJfQorCisJcERlc2lyZWRfaHRfcGh5LT5iSHRFbmFibGUgPSBUUlVFOworCisJLy8gRGVjaWRlIGRlc2lyZWQgVHggTUNTCisJc3dpdGNoIChUeFN0cmVhbSkKKwl7CisJCWNhc2UgMToKKwkJCWlmIChEZXNpcmVkTWNzID09IE1DU19BVVRPKQorCQkJeworCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzBdPSAweGZmOworCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzFdPSAweDAwOworCQkJfQorCQkJZWxzZSBpZiAoRGVzaXJlZE1jcyA8PSBNQ1NfNykKKwkJCXsKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFswXT0gMTw8RGVzaXJlZE1jczsKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsxXT0gMHgwMDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgMjoKKwkJCWlmIChEZXNpcmVkTWNzID09IE1DU19BVVRPKQorCQkJeworCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzBdPSAweGZmOworCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzFdPSAweGZmOworCQkJfQorCQkJZWxzZSBpZiAoRGVzaXJlZE1jcyA8PSBNQ1NfMTUpCisJCQl7CisJCQkJVUxPTkcgbW9kZTsKKworCQkJCW1vZGUgPSBEZXNpcmVkTWNzIC8gODsKKwkJCQlpZiAobW9kZSA8IDIpCisJCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0W21vZGVdID0gKDEgPDwgKERlc2lyZWRNY3MgLSBtb2RlICogOCkpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSAzOiAvLyAzKjMKKwkJCWlmIChEZXNpcmVkTWNzID09IE1DU19BVVRPKQorCQkJeworCQkJCS8qIE1DUzAgfiBNQ1MyMywgMyBieXRlcyAqLworCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzBdPSAweGZmOworCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzFdPSAweGZmOworCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzJdPSAweGZmOworCQkJfQorCQkJZWxzZSBpZiAoRGVzaXJlZE1jcyA8PSBNQ1NfMjMpCisJCQl7CisJCQkJVUxPTkcgbW9kZTsKKworCQkJCW1vZGUgPSBEZXNpcmVkTWNzIC8gODsKKwkJCQlpZiAobW9kZSA8IDMpCisJCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0W21vZGVdID0gKDEgPDwgKERlc2lyZWRNY3MgLSBtb2RlICogOCkpOworCQkJfQorCQkJYnJlYWs7CisJfQorCisJaWYocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCA9PSBCV180MCkKKwl7CisJCWlmIChEZXNpcmVkTWNzID09IE1DU19BVVRPIHx8IERlc2lyZWRNY3MgPT0gTUNTXzMyKQorCQkJcERlc2lyZWRfaHRfcGh5LT5NQ1NTZXRbNF0gPSAweDE7CisJfQorCisJLy8gdXBkYXRlIEhUIFJhdGUgc2V0dGluZworICAgIGlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorICAgICAgICBNbG1lVXBkYXRlSHRUeFJhdGVzKHBBZCwgQlNTMCk7CisgICAgZWxzZQorCSAgICBNbG1lVXBkYXRlSHRUeFJhdGVzKHBBZCwgYXBpZHgpOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJVXBkYXRlIEhUIElFIGZyb20gb3VyIGNhcGFiaWxpdHkuCisKKwlBcmd1bWVudHM6CisJCVNlbmQgYWxsIEhUIElFIGluIGJlYWNvbi9wcm9iZSByc3AvYXNzb2MgcnNwL2FjdGlvbiBmcmFtZS4KKworCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QVXBkYXRlSFRJRSgKKwlJTglSVF9IVF9DQVBBQklMSVRZCSpwUnRIdCwKKwlJTgkJVUNIQVIJCQkJKnBNY3NTZXQsCisJT1VUCQlIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAorCU9VVAkJQUREX0hUX0lORk9fSUUJCSpwQWRkSHRJbmZvKQoreworCVJUTVBaZXJvTWVtb3J5KHBIdENhcGFiaWxpdHksIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSk7CisJUlRNUFplcm9NZW1vcnkocEFkZEh0SW5mbywgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7CisKKwkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9IHBSdEh0LT5DaGFubmVsV2lkdGg7CisJCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5NaW1vUHMgPSBwUnRIdC0+TWltb1BzOworCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uR0YgPSBwUnRIdC0+R0Y7CisJCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5TaG9ydEdJZm9yMjAgPSBwUnRIdC0+U2hvcnRHSWZvcjIwOworCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjQwID0gcFJ0SHQtPlNob3J0R0lmb3I0MDsKKwkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlR4U1RCQyA9IHBSdEh0LT5UeFNUQkM7CisJCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5SeFNUQkMgPSBwUnRIdC0+UnhTVEJDOworCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uQU1zZHVTaXplID0gcFJ0SHQtPkFtc2R1U2l6ZTsKKwkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBQYXJtLk1heFJBbXBkdUZhY3RvciA9IHBSdEh0LT5NYXhSQW1wZHVGYWN0b3I7CisJCXBIdENhcGFiaWxpdHktPkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IHBSdEh0LT5NcGR1RGVuc2l0eTsKKworCQlwQWRkSHRJbmZvLT5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9IHBSdEh0LT5FeHRDaGFuT2Zmc2V0IDsKKwkJcEFkZEh0SW5mby0+QWRkSHRJbmZvLlJlY29tV2lkdGggPSBwUnRIdC0+UmVjb21XaWR0aDsKKwkJcEFkZEh0SW5mby0+QWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUgPSBwUnRIdC0+T3BlcmFpb25Nb2RlOworCQlwQWRkSHRJbmZvLT5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9IHBSdEh0LT5Ob25HZlByZXNlbnQ7CisJCVJUTVBNb3ZlTWVtb3J5KHBBZGRIdEluZm8tPk1DU1NldCwgLypwUnRIdC0+TUNTU2V0Ki9wTWNzU2V0LCA0KTsgLy8gcnQyODYwIG9ubHkgc3VwcG9ydCBNQ1MgbWF4PTMyLCBubyBuZWVkIHRvIGNvcHkgYWxsIDE2IHVjaGFyLgorCisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFVwZGF0ZUhUSUUgPD09IFxuIikpOworfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlBZGQgQ2xpZW50IHNlY3VyaXR5IGluZm9ybWF0aW9uIGludG8gQVNJQyBXQ0lEIHRhYmxlIGFuZCBJVkVJViB0YWJsZS4KKyAgICBSZXR1cm46CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJQnNzSWR4LAorCUlOIAlVQ0hBUgkJIAlLZXlJZHgsCisJSU4gCVVDSEFSCQkgCUNpcGhlckFsZywKKwlJTiAJTUFDX1RBQkxFX0VOVFJZICpwRW50cnkpCit7CisJVUlOVDMyCQlXQ0lEQXR0cmkgPSAwOworCVVTSE9SVAkJb2Zmc2V0OworCVVDSEFSCQlJVkVJViA9IDA7CisJVVNIT1JUCQlXY2lkID0gMDsKKworCXsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJaWYgKEJzc0lkeCA+IEJTUzApCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeTogVGhlIEJTUy1pbmRleCglZCkgaXMgb3V0IG9mIHJhbmdlIGZvciBJbmZyYSBsaW5rLiBcbiIsIEJzc0lkeCkpOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy8gMS4JSW4gQURIT0MgbW9kZSwgdGhlIEFJRCBpcyB3Y2lkIG51bWJlci4gQW5kIE5PIG1lc2ggbGluayBleGlzdHMuCisJCQkvLyAyLglJbiBJbmZyYSBtb2RlLCB0aGUgQUlEOjEgTVVTVCBiZSB3Y2lkIG9mIGluZnJhIFNUQS4KKwkJCS8vCQkJCQkgICB0aGUgQUlEOjJ+IGFzc2lnbiB0byBtZXNoIGxpbmsgZW50cnkuCisJCQlpZiAocEVudHJ5ICYmIEFESE9DX09OKHBBZCkpCisJCQkJV2NpZCA9IHBFbnRyeS0+QWlkOworCQkJZWxzZSBpZiAocEVudHJ5ICYmIElORlJBX09OKHBBZCkpCisJCQl7CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCQkJaWYgKHBFbnRyeS0+VmFsaWRBc0RscyA9PSBUUlVFKQorCQkJCQlXY2lkID0gcEVudHJ5LT5BaWQ7CisJCQkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQkJCVdjaWQgPSBCU1NJRF9XQ0lEOworCQkJfQorCQkJZWxzZQorCQkJCVdjaWQgPSBNQ0FTVF9XQ0lEOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfQorCisJLy8gVXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlCisJb2Zmc2V0ID0gTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgKyAoV2NpZCAqIEhXX1dDSURfQVRUUklfU0laRSk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJaWYgKHBFbnRyeSAmJiBwRW50cnktPlZhbGlkQXNNZXNoKQorCQkJV0NJREF0dHJpID0gKENpcGhlckFsZzw8MSkgfCBQQUlSV0lTRUtFWVRBQkxFOworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQllbHNlIGlmICgocEVudHJ5KSAmJiAocEVudHJ5LT5WYWxpZEFzRGxzKSAmJgorCQkJCQkoKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkgfHwKKwkJCQkgCShDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVBfTk9fTUlDKSB8fAorCQkJCQkoQ2lwaGVyQWxnID09IENJUEhFUl9BRVMpIHx8CisJCQkJIAkoQ2lwaGVyQWxnID09IENJUEhFUl9OT05FKSkpCisJCQlXQ0lEQXR0cmkgPSAoQ2lwaGVyQWxnPDwxKSB8IFBBSVJXSVNFS0VZVEFCTEU7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCWVsc2UKKwkJCVdDSURBdHRyaSA9IChDaXBoZXJBbGc8PDEpIHwgU0hBUkVES0VZVEFCTEU7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBXQ0lEQXR0cmkpOworCisKKwkvLyBVcGRhdGUgSVYvRUlWIHRhYmxlCisJb2Zmc2V0ID0gTUFDX0lWRUlWX1RBQkxFX0JBU0UgKyAoV2NpZCAqIEhXX0lWRUlWX0VOVFJZX1NJWkUpOworCisJLy8gV1BBIG1vZGUKKwlpZiAoKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkgfHwgKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUF9OT19NSUMpIHx8IChDaXBoZXJBbGcgPT0gQ0lQSEVSX0FFUykpCisJeworCQkvLyBFaXYgYml0IG9uLiBrZXlpZCBhbHdheXMgaXMgMCBmb3IgcGFpcndpc2Uga2V5CisJCUlWRUlWID0gKEtleUlkeCA8PDYpIHwgMHgyMDsKKwl9CisJZWxzZQorCXsKKwkJLy8gV0VQIEtleUlkeCBpcyBkZWZhdWx0IHR4IGtleS4KKwkJSVZFSVYgPSAoS2V5SWR4IDw8IDYpOworCX0KKworCS8vIEZvciBrZXkgaW5kZXggYW5kIGV4dCBJViBiaXQsIHNvIG9ubHkgbmVlZCB0byB1cGRhdGUgdGhlIHBvc2l0aW9uKG9mZnNldCszKS4KKyNpZmRlZiBSVDI4NjAKKwlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCszLCBJVkVJVik7CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnk6IFdDSUQgIyVkLCBLZXlJbmRleCAjJWQsIEFsZz0lc1xuIixXY2lkLCBLZXlJZHgsIENpcGhlck5hbWVbQ2lwaGVyQWxnXSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiCVdDSURBdHRyaSA9IDB4JXggXG4iLCAgV0NJREF0dHJpKSk7CisKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBQYXJzZSBlbmNyeXB0aW9uIHR5cGUKK0FyZ3VtZW50czoKKyAgICBwQWRhcHRlciAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorICAgIHdycSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpb2N0bCBhcmd1bWVudAorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOb25lCisKKyAgICBOb3RlOgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQ0hBUiAqR2V0RW5jcnlwdFR5cGUoQ0hBUiBlbmMpCit7CisgICAgaWYoZW5jID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKKyAgICAgICAgcmV0dXJuICJOT05FIjsKKyAgICBpZihlbmMgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpCisgICAgCXJldHVybiAiV0VQIjsKKyAgICBpZihlbmMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKyAgICAJcmV0dXJuICJUS0lQIjsKKyAgICBpZihlbmMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKyAgICAJcmV0dXJuICJBRVMiOworCWlmKGVuYyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjRFbmFibGVkKQorICAgIAlyZXR1cm4gIlRLSVBBRVMiOworICAgIGVsc2UKKyAgICAJcmV0dXJuICJVTktOT1ciOworfQorCitDSEFSICpHZXRBdXRoTW9kZShDSEFSIGF1dGgpCit7CisgICAgaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQorICAgIAlyZXR1cm4gIk9QRU4iOworICAgIGlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKQorICAgIAlyZXR1cm4gIlNIQVJFRCI7CisJaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoKQorICAgIAlyZXR1cm4gIkFVVE9XRVAiOworICAgIGlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgIAlyZXR1cm4gIldQQSI7CisgICAgaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spCisgICAgCXJldHVybiAiV1BBUFNLIjsKKyAgICBpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisgICAgCXJldHVybiAiV1BBTk9ORSI7CisgICAgaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQorICAgIAlyZXR1cm4gIldQQTIiOworICAgIGlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykKKyAgICAJcmV0dXJuICJXUEEyUFNLIjsKKwlpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyKQorICAgIAlyZXR1cm4gIldQQTFXUEEyIjsKKwlpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLKQorICAgIAlyZXR1cm4gIldQQTFQU0tXUEEyUFNLIjsKKworICAgIAlyZXR1cm4gIlVOS05PVyI7Cit9CisKKyNpZiAxIC8vI2lmbmRlZiBVQ09TCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIEdldCBzaXRlIHN1cnZleSByZXN1bHRzCisJQXJndW1lbnRzOgorCSAgICBwQWRhcHRlciAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCSAgICB3cnEgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW9jdGwgYXJndW1lbnQKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgTm9uZQorCisgICAgTm90ZToKKyAgICAgICAgVXNhZ2U6CisgICAgICAgIAkJMS4pIFVJIG5lZWRzIHRvIHdhaXQgNCBzZWNvbmRzIGFmdGVyIGlzc3VlIGEgc2l0ZSBzdXJ2ZXkgY29tbWFuZAorICAgICAgICAJCTIuKSBpd3ByaXYgcmEwIGdldF9zaXRlX3N1cnZleQorICAgICAgICAJCTMuKSBVSSBuZWVkcyB0byBwcmVwYXJlIGF0IGxlYXN0IDQwOTZieXRlcyB0byBnZXQgdGhlIHJlc3VsdHMKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKyNkZWZpbmUJTElORV9MRU4JKDQrMzMrMjArOCsxMCs5KzcrMykJLy8gQ2hhbm5lbCtTU0lEK0Jzc2lkK1dlcFN0YXR1cytBdXRoTW9kZStTaWduYWwrV2lyZXNzTW9kZStOZXR3b3JrVHlwZQorVk9JRCBSVE1QSW9jdGxHZXRTaXRlU3VydmV5KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4Jc3RydWN0IGl3cmVxCSp3cnEpCit7CisJQ0hBUgkJKm1zZzsKKwlJTlQgCQlpPTA7CisJSU5UCQkJV2FpdENudDsKKwlJTlQgCQlTdGF0dXM9MDsKKwlDSEFSCQlTc2lkW01BWF9MRU5fT0ZfU1NJRCArMV07CisgICAgSU5UICAgICAgICAgUnNzaSA9IDAsIG1heF9sZW4gPSBMSU5FX0xFTjsKKwlVSU5UICAgICAgICBSc3NpX1F1YWxpdHkgPSAwOworCU5ESVNfODAyXzExX05FVFdPUktfVFlQRSAgICB3aXJlbGVzc19tb2RlOworCisJb3NfYWxsb2NfbWVtKE5VTEwsIChQVUNIQVIgKikmbXNnLCBzaXplb2YoQ0hBUikqKChNQVhfTEVOX09GX0JTU19UQUJMRSkqbWF4X2xlbikpOworCisJaWYgKG1zZyA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUElvY3RsR2V0U2l0ZVN1cnZleSAtIG1zZyBtZW1vcnkgYWxsb2MgZmFpbC5cbiIpKTsKKwkJcmV0dXJuOworCX0KKworCW1lbXNldChtc2csIDAgLChNQVhfTEVOX09GX0JTU19UQUJMRSkqbWF4X2xlbiApOworCW1lbXNldChTc2lkLCAwICwoTUFYX0xFTl9PRl9TU0lEICsxKSk7CisJc3ByaW50Zihtc2csIiVzIiwiXG4iKTsKKwlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS00cyUtMzNzJS0yMHMlLThzJS0xMHMlLTlzJS03cyUtM3NcbiIsCisJICAgICJDaCIsICJTU0lEIiwgIkJTU0lEIiwgIkVuYyIsICJBdXRoIiwgIlNpZ2FubCglKSIsICJXLU1vZGUiLCAiIE5UIik7CisKKwlXYWl0Q250ID0gMDsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBUUlVFOworCXdoaWxlICgoU2NhblJ1bm5pbmcocEFkYXB0ZXIpID09IFRSVUUpICYmIChXYWl0Q250KysgPCAyMDApKQorCQlPU19XQUlUKDUwMCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlmb3IoaT0wOyBpPHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yIDtpKyspCisJeworCQlpZiggcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQ2hhbm5lbD09MCkKKwkJCWJyZWFrOworCisJCWlmKChzdHJsZW4obXNnKSttYXhfbGVuICkgPj0gSVdfU0NBTl9NQVhfREFUQSkKKwkJCWJyZWFrOworCisJCS8vQ2hhbm5lbAorCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS00ZCIsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkNoYW5uZWwpOworCQkvL1NTSUQKKwkJbWVtY3B5KFNzaWQsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWQsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWRMZW4pOworCQlTc2lkW3BBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWRMZW5dID0gJ1wwJzsKKwkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtMzNzIiwgU3NpZCk7CisJCS8vQlNTSUQKKwkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4ICAgIiwKKwkJCXBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkWzBdLAorCQkJcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWRbMV0sCisJCQlwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZFsyXSwKKwkJCXBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkWzNdLAorCQkJcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWRbNF0sCisJCQlwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZFs1XSk7CisJCS8vRW5jcnlwdGlvbiBUeXBlCisJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLThzIixHZXRFbmNyeXB0VHlwZShwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XZXBTdGF0dXMpKTsKKwkJLy9BdXRoZW50aWNhdGlvbiBNb2RlCisJCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0xMHMiLCAiVU5LTk9XIik7CisJCWVsc2UKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTEwcyIsR2V0QXV0aE1vZGUocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQXV0aE1vZGUpKTsKKwkJLy8gUnNzaQorCQlSc3NpID0gKElOVClwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc3NpOworCQlpZiAoUnNzaSA+PSAtNTApCisJCQlSc3NpX1F1YWxpdHkgPSAxMDA7CisJCWVsc2UgaWYgKFJzc2kgPj0gLTgwKSAgICAvLyBiZXR3ZWVuIC01MCB+IC04MGRibQorCQkJUnNzaV9RdWFsaXR5ID0gKFVJTlQpKDI0ICsgKChSc3NpICsgODApICogMjYpLzEwKTsKKwkJZWxzZSBpZiAoUnNzaSA+PSAtOTApICAgLy8gYmV0d2VlbiAtODAgfiAtOTBkYm0KKwkJCVJzc2lfUXVhbGl0eSA9IChVSU5UKSgoKFJzc2kgKyA5MCkgKiAyNikvMTApOworCQllbHNlICAgIC8vIDwgLTg0IGRibQorCQkJUnNzaV9RdWFsaXR5ID0gMDsKKwkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtOWQiLCBSc3NpX1F1YWxpdHkpOworCQkvLyBXaXJlbGVzcyBNb2RlCisJCXdpcmVsZXNzX21vZGUgPSBOZXR3b3JrVHlwZUluVXNlU2FuaXR5KCZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXSk7CisJCWlmICh3aXJlbGVzc19tb2RlID09IE5kaXM4MDJfMTFGSCB8fAorCQkJd2lyZWxlc3NfbW9kZSA9PSBOZGlzODAyXzExRFMpCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS03cyIsICIxMWIiKTsKKwkJZWxzZSBpZiAod2lyZWxlc3NfbW9kZSA9PSBOZGlzODAyXzExT0ZETTUpCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS03cyIsICIxMWEiKTsKKwkJZWxzZSBpZiAod2lyZWxlc3NfbW9kZSA9PSBOZGlzODAyXzExT0ZETTVfTikKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTdzIiwgIjExYS9uIik7CisJCWVsc2UgaWYgKHdpcmVsZXNzX21vZGUgPT0gTmRpczgwMl8xMU9GRE0yNCkKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTdzIiwgIjExYi9nIik7CisJCWVsc2UgaWYgKHdpcmVsZXNzX21vZGUgPT0gTmRpczgwMl8xMU9GRE0yNF9OKQorCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtN3MiLCAiMTFiL2cvbiIpOworCQllbHNlCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS03cyIsICJ1bmtub3ciKTsKKwkJLy9OZXR3b3JrIFR5cGUKKwkJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc1R5cGUgPT0gQlNTX0FESE9DKQorCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtM3MiLCAiIEFkIik7CisJCWVsc2UKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTNzIiwgIiBJbiIpOworCisgICAgICAgIHNwcmludGYobXNnK3N0cmxlbihtc2cpLCJcbiIpOworCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCXBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihtc2cpOworCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBtc2csIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QSW9jdGxHZXRTaXRlU3VydmV5IC0gd3JxLT51LmRhdGEubGVuZ3RoID0gJWRcbiIsIHdycS0+dS5kYXRhLmxlbmd0aCkpOworCW9zX2ZyZWVfbWVtKE5VTEwsIChQVUNIQVIpbXNnKTsKK30KKworCisjZGVmaW5lCU1BQ19MSU5FX0xFTgkoMTQrNCs0KzEwKzEwKzEwKzYrNikJLy8gQWRkcithaWQrcHNtK2RhdGF0aW1lK3J4Ynl0ZSt0eGJ5dGUrY3VycmVudCB0eCByYXRlK2xhc3QgdHggcmF0ZQorVk9JRCBSVE1QSW9jdGxHZXRNYWNUYWJsZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBzdHJ1Y3QgaXdyZXEgKndycSkKK3sKKwlJTlQgaTsKKwlSVF84MDJfMTFfTUFDX1RBQkxFIE1hY1RhYjsKKwljaGFyICptc2c7CisKKwlNYWNUYWIuTnVtID0gMDsKKwlmb3IgKGk9MDsgaTxNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0NMSSAmJiAocEFkLT5NYWNUYWIuQ29udGVudFtpXS5Tc3QgPT0gU1NUX0FTU09DKSkKKwkJeworCQkJQ09QWV9NQUNfQUREUihNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uQWRkciwgJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uQWRkcik7CisJCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uQWlkID0gKFVDSEFSKXBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uQWlkOworCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLlBzbSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uUHNNb2RlOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLk1pbW9QcyA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uTW1wc01vZGU7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJCS8vIEZpbGwgaW4gUlNTSSBwZXIgZW50cnkKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5BdmdSc3NpMCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uUnNzaVNhbXBsZS5BdmdSc3NpMDsKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5BdmdSc3NpMSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uUnNzaVNhbXBsZS5BdmdSc3NpMTsKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5BdmdSc3NpMiA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uUnNzaVNhbXBsZS5BdmdSc3NpMjsKKworCQkJLy8gdGhlIGNvbm5lY3RlZCB0aW1lIHBlciBlbnRyeQorCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLkNvbm5lY3RlZFRpbWUgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlN0YUNvbm5lY3RUaW1lOworCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLlR4UmF0ZS5maWVsZC5NQ1MgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisJCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uVHhSYXRlLmZpZWxkLkJXID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IVFBoeU1vZGUuZmllbGQuQlc7CisJCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uVHhSYXRlLmZpZWxkLlNob3J0R0kgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJOworCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLlR4UmF0ZS5maWVsZC5TVEJDID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IVFBoeU1vZGUuZmllbGQuU1RCQzsKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5UeFJhdGUuZmllbGQucnN2ID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IVFBoeU1vZGUuZmllbGQucnN2OworCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLlR4UmF0ZS5maWVsZC5NT0RFID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IVFBoeU1vZGUuZmllbGQuTU9ERTsKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5UeFJhdGUud29yZCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLndvcmQ7CisKKwkJCU1hY1RhYi5OdW0gKz0gMTsKKwkJfQorCX0KKwl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUlRfODAyXzExX01BQ19UQUJMRSk7CisJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmTWFjVGFiLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6IGNvcHlfdG9fdXNlcigpIGZhaWxcbiIsIF9fZnVuY19fKSk7CisJfQorCisJbXNnID0gKENIQVIgKikga21hbGxvYyhzaXplb2YoQ0hBUikqKE1BWF9MRU5fT0ZfTUFDX1RBQkxFKk1BQ19MSU5FX0xFTiksIE1FTV9BTExPQ19GTEFHKTsKKwltZW1zZXQobXNnLCAwICxNQVhfTEVOX09GX01BQ19UQUJMRSpNQUNfTElORV9MRU4gKTsKKwlzcHJpbnRmKG1zZywiJXMiLCJcbiIpOworCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTE0cyUtNHMlLTRzJS0xMHMlLTEwcyUtMTBzJS02cyUtNnNcbiIsCisJCSJNQUMiLCAiQUlEIiwgIlBTTSIsICJMRFQiLCAiUnhCIiwgIlR4QiIsIkNUeFIiLCAiTFR4UiIpOworCisJZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKKwl7CisJCVBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV07CisJCWlmIChwRW50cnktPlZhbGlkQXNDTEkgJiYgKHBFbnRyeS0+U3N0ID09IFNTVF9BU1NPQykpCisJCXsKKwkJCWlmKChzdHJsZW4obXNnKStNQUNfTElORV9MRU4gKSA+PSAoTUFYX0xFTl9PRl9NQUNfVEFCTEUqTUFDX0xJTkVfTEVOKSApCisJCQkJYnJlYWs7CisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICAiLAorCQkJCXBFbnRyeS0+QWRkclswXSwgcEVudHJ5LT5BZGRyWzFdLCBwRW50cnktPkFkZHJbMl0sCisJCQkJcEVudHJ5LT5BZGRyWzNdLCBwRW50cnktPkFkZHJbNF0sIHBFbnRyeS0+QWRkcls1XSk7CisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS00ZCIsIChpbnQpcEVudHJ5LT5BaWQpOworCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtNGQiLCAoaW50KXBFbnRyeS0+UHNNb2RlKTsKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTEwZCIsMC8qcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IU0NvdW50ZXIuTGFzdERhdGFQYWNrZXRUaW1lKi8pOyAvLyBUb0RvCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0xMGQiLDAvKnBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFNDb3VudGVyLlRvdGFsUnhCeXRlQ291bnQqLyk7IC8vIFRvRG8KKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTEwZCIsMC8qcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IU0NvdW50ZXIuVG90YWxUeEJ5dGVDb3VudCovKTsgLy8gVG9EbworCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtNmQiLFJhdGVJZFRvTWJwc1twQWQtPk1hY1RhYi5Db250ZW50W2ldLkN1cnJUeFJhdGVdKTsKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTZkXG4iLDAvKlJhdGVJZFRvTWJwc1twQWQtPk1hY1RhYi5Db250ZW50W2ldLkxhc3RUeFJhdGVdKi8pOyAvLyBUb0RvCisJCX0KKwl9CisJLy8gZm9yIGNvbXBhdGlibGUgd2l0aCBvbGQgQVBJIGp1c3QgZG8gdGhlIHByaW50ayB0byBjb25zb2xlCisJLy93cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4obXNnKTsKKwkvL2lmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgbXNnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMiLCBtc2cpKTsKKwl9CisKKwlrZnJlZShtc2cpOworfQorI2VuZGlmIC8vIFVDT1MgLy8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorSU5UCVNldF9CQVNldHVwX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworICAgIFVDSEFSIG1hY1s2XSwgdGlkOworCWNoYXIgKnRva2VuLCBzZXBWYWx1ZVtdID0gIjoiLCBEQVNIID0gJy0nOworCUlOVCBpOworICAgIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCisvKgorCVRoZSBCQVNldHVwIGludXB0IHN0cmluZyBmb3JtYXQgc2hvdWxkIGJlIHh4Onh4Onh4Onh4Onh4Onh4LWQsCisJCT0+VGhlIHNpeCAyIGRpZ2l0IGhleC1kZWNpbWFsIG51bWJlciBwcmV2aW91cyBhcmUgdGhlIE1hYyBhZGRyZXNzLAorCQk9PlRoZSBzZXZlbnRoIGRlY2ltYWwgbnVtYmVyIGlzIHRoZSB0aWQgdmFsdWUuCisqLworCS8vcHJpbnRrKCJcbiVzXG4iLCBhcmcpOworCisJaWYoc3RybGVuKGFyZykgPCAxOSkgIC8vTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgMDE6MDI6MDM6MDQ6MDU6MDYgbGVuZ3RoIDE3IHBsdXMgdGhlICItIiBhbmQgdGlkIHZhbHVlIGluIGRlY2ltYWwgZm9ybWF0LgorCQlyZXR1cm4gRkFMU0U7CisKKwl0b2tlbiA9IHN0cmNocihhcmcsIERBU0gpOworCWlmICgodG9rZW4gIT0gTlVMTCkgJiYgKHN0cmxlbih0b2tlbik+MSkpCisJeworCQl0aWQgPSBzaW1wbGVfc3RydG9sKCh0b2tlbisxKSwgMCwgMTApOworCQlpZiAodGlkID4gMTUpCisJCQlyZXR1cm4gRkFMU0U7CisKKwkJKnRva2VuID0gJ1wwJzsKKwkJZm9yIChpID0gMCwgdG9rZW4gPSByc3RydG9rKGFyZywgJnNlcFZhbHVlWzBdKTsgdG9rZW47IHRva2VuID0gcnN0cnRvayhOVUxMLCAmc2VwVmFsdWVbMF0pLCBpKyspCisJCXsKKwkJCWlmKChzdHJsZW4odG9rZW4pICE9IDIpIHx8ICghaXN4ZGlnaXQoKnRva2VuKSkgfHwgKCFpc3hkaWdpdCgqKHRva2VuKzEpKSkpCisJCQkJcmV0dXJuIEZBTFNFOworCQkJQXRvSCh0b2tlbiwgKFBVQ0hBUikoJm1hY1tpXSksIDEpOworCQl9CisJCWlmKGkgIT0gNikKKwkJCXJldHVybiBGQUxTRTsKKworCQlwcmludGsoIlxuJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngtJTAyeFxuIiwgbWFjWzBdLCBtYWNbMV0sCisJCQkJbWFjWzJdLCBtYWNbM10sIG1hY1s0XSwgbWFjWzVdLCB0aWQpOworCisJICAgIHBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgbWFjKTsKKworICAgIAlpZiAocEVudHJ5KSB7CisgICAgICAgIAlwcmludGsoIlxuU2V0dXAgQkEgU2Vzc2lvbjogVGlkID0gJWRcbiIsIHRpZCk7CisJICAgICAgICBCQU9yaVNlc3Npb25TZXRVcChwQWQsIHBFbnRyeSwgdGlkLCAwLCAxMDAsIFRSVUUpOworICAgIAl9CisKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJcmV0dXJuIEZBTFNFOworCit9CisKK0lOVAlTZXRfQkFEZWNsaW5lX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIGJCQURlY2xpbmU7CisKKwliQkFEZWNsaW5lID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChiQkFEZWNsaW5lID09IDApCisJeworCQlwQWQtPkNvbW1vbkNmZy5iQkFEZWNsaW5lID0gRkFMU0U7CisJfQorCWVsc2UgaWYgKGJCQURlY2xpbmUgPT0gMSkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLmJCQURlY2xpbmUgPSBUUlVFOworCX0KKwllbHNlCisJeworCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9CQURlY2xpbmVfUHJvYzo6KEJBRGVjbGluZT0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJCQURlY2xpbmUpKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X0JBT3JpVGVhckRvd25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisgICAgVUNIQVIgbWFjWzZdLCB0aWQ7CisJY2hhciAqdG9rZW4sIHNlcFZhbHVlW10gPSAiOiIsIERBU0ggPSAnLSc7CisJSU5UIGk7CisgICAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7CisKKy8qCisJVGhlIEJBT3JpVGVhckRvd24gaW51cHQgc3RyaW5nIGZvcm1hdCBzaG91bGQgYmUgeHg6eHg6eHg6eHg6eHg6eHgtZCwKKwkJPT5UaGUgc2l4IDIgZGlnaXQgaGV4LWRlY2ltYWwgbnVtYmVyIHByZXZpb3VzIGFyZSB0aGUgTWFjIGFkZHJlc3MsCisJCT0+VGhlIHNldmVudGggZGVjaW1hbCBudW1iZXIgaXMgdGhlIHRpZCB2YWx1ZS4KKyovCisgICAgaWYoc3RybGVuKGFyZykgPCAxOSkgIC8vTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgMDE6MDI6MDM6MDQ6MDU6MDYgbGVuZ3RoIDE3IHBsdXMgdGhlICItIiBhbmQgdGlkIHZhbHVlIGluIGRlY2ltYWwgZm9ybWF0LgorCQlyZXR1cm4gRkFMU0U7CisKKwl0b2tlbiA9IHN0cmNocihhcmcsIERBU0gpOworCWlmICgodG9rZW4gIT0gTlVMTCkgJiYgKHN0cmxlbih0b2tlbik+MSkpCisJeworCQl0aWQgPSBzaW1wbGVfc3RydG9sKCh0b2tlbisxKSwgMCwgMTApOworCQlpZiAodGlkID4gTlVNX09GX1RJRCkKKwkJCXJldHVybiBGQUxTRTsKKworCQkqdG9rZW4gPSAnXDAnOworCQlmb3IgKGkgPSAwLCB0b2tlbiA9IHJzdHJ0b2soYXJnLCAmc2VwVmFsdWVbMF0pOyB0b2tlbjsgdG9rZW4gPSByc3RydG9rKE5VTEwsICZzZXBWYWx1ZVswXSksIGkrKykKKwkJeworCQkJaWYoKHN0cmxlbih0b2tlbikgIT0gMikgfHwgKCFpc3hkaWdpdCgqdG9rZW4pKSB8fCAoIWlzeGRpZ2l0KCoodG9rZW4rMSkpKSkKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQlBdG9IKHRva2VuLCAoUFVDSEFSKSgmbWFjW2ldKSwgMSk7CisJCX0KKwkJaWYoaSAhPSA2KQorCQkJcmV0dXJuIEZBTFNFOworCisJICAgIHByaW50aygiXG4lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC0lMDJ4IiwgbWFjWzBdLCBtYWNbMV0sCisJICAgICAgICAgICBtYWNbMl0sIG1hY1szXSwgbWFjWzRdLCBtYWNbNV0sIHRpZCk7CisKKwkgICAgcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBtYWMpOworCisJICAgIGlmIChwRW50cnkpIHsKKwkgICAgICAgIHByaW50aygiXG5UZWFyIGRvd24gT3JpIEJBIFNlc3Npb246IFRpZCA9ICVkXG4iLCB0aWQpOworICAgICAgICBCQU9yaVNlc3Npb25UZWFyRG93bihwQWQsIHBFbnRyeS0+QWlkLCB0aWQsIEZBTFNFLCBUUlVFKTsKKwkgICAgfQorCisJCXJldHVybiBUUlVFOworCX0KKworCXJldHVybiBGQUxTRTsKKworfQorCitJTlQJU2V0X0JBUmVjVGVhckRvd25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisgICAgVUNIQVIgbWFjWzZdLCB0aWQ7CisJY2hhciAqdG9rZW4sIHNlcFZhbHVlW10gPSAiOiIsIERBU0ggPSAnLSc7CisJSU5UIGk7CisgICAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7CisKKyAgICAvL3ByaW50aygiXG4lc1xuIiwgYXJnKTsKKy8qCisJVGhlIEJBUmVjVGVhckRvd24gaW51cHQgc3RyaW5nIGZvcm1hdCBzaG91bGQgYmUgeHg6eHg6eHg6eHg6eHg6eHgtZCwKKwkJPT5UaGUgc2l4IDIgZGlnaXQgaGV4LWRlY2ltYWwgbnVtYmVyIHByZXZpb3VzIGFyZSB0aGUgTWFjIGFkZHJlc3MsCisJCT0+VGhlIHNldmVudGggZGVjaW1hbCBudW1iZXIgaXMgdGhlIHRpZCB2YWx1ZS4KKyovCisgICAgaWYoc3RybGVuKGFyZykgPCAxOSkgIC8vTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgMDE6MDI6MDM6MDQ6MDU6MDYgbGVuZ3RoIDE3IHBsdXMgdGhlICItIiBhbmQgdGlkIHZhbHVlIGluIGRlY2ltYWwgZm9ybWF0LgorCQlyZXR1cm4gRkFMU0U7CisKKwl0b2tlbiA9IHN0cmNocihhcmcsIERBU0gpOworCWlmICgodG9rZW4gIT0gTlVMTCkgJiYgKHN0cmxlbih0b2tlbik+MSkpCisJeworCQl0aWQgPSBzaW1wbGVfc3RydG9sKCh0b2tlbisxKSwgMCwgMTApOworCQlpZiAodGlkID4gTlVNX09GX1RJRCkKKwkJCXJldHVybiBGQUxTRTsKKworCQkqdG9rZW4gPSAnXDAnOworCQlmb3IgKGkgPSAwLCB0b2tlbiA9IHJzdHJ0b2soYXJnLCAmc2VwVmFsdWVbMF0pOyB0b2tlbjsgdG9rZW4gPSByc3RydG9rKE5VTEwsICZzZXBWYWx1ZVswXSksIGkrKykKKwkJeworCQkJaWYoKHN0cmxlbih0b2tlbikgIT0gMikgfHwgKCFpc3hkaWdpdCgqdG9rZW4pKSB8fCAoIWlzeGRpZ2l0KCoodG9rZW4rMSkpKSkKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQlBdG9IKHRva2VuLCAoUFVDSEFSKSgmbWFjW2ldKSwgMSk7CisJCX0KKwkJaWYoaSAhPSA2KQorCQkJcmV0dXJuIEZBTFNFOworCisJCXByaW50aygiXG4lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC0lMDJ4IiwgbWFjWzBdLCBtYWNbMV0sCisJCSAgICAgICBtYWNbMl0sIG1hY1szXSwgbWFjWzRdLCBtYWNbNV0sIHRpZCk7CisKKwkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBtYWMpOworCisJCWlmIChwRW50cnkpIHsKKwkJICAgIHByaW50aygiXG5UZWFyIGRvd24gUmVjIEJBIFNlc3Npb246IFRpZCA9ICVkXG4iLCB0aWQpOworCQkgICAgQkFSZWNTZXNzaW9uVGVhckRvd24ocEFkLCBwRW50cnktPkFpZCwgdGlkLCBGQUxTRSk7CisJCX0KKworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlyZXR1cm4gRkFMU0U7CisKK30KKworSU5UCVNldF9IdEJ3X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIEh0Qnc7CisKKwlIdEJ3ID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKwlpZiAoSHRCdyA9PSBCV180MCkKKwkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzQwOworCWVsc2UgaWYgKEh0QncgPT0gQldfMjApCisJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPSBCV18yMDsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAorCisJU2V0Q29tbW9uSFQocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdEJ3X1Byb2M6OihIdEJ3PSVkKVxuIiwgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9IdE1jc19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBIdE1jcywgTWNzX3RtcDsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyAgICBCT09MRUFOIGJBdXRvUmF0ZSA9IEZBTFNFOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJTWNzX3RtcCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoTWNzX3RtcCA8PSAxNSB8fCBNY3NfdG1wID09IDMyKQorCQlIdE1jcyA9IE1jc190bXA7CisJZWxzZQorCQlIdE1jcyA9IE1DU19BVVRPOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gSHRNY3M7CisJCXBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gKEh0TWNzID09IE1DU19BVVRPKSA/IFRSVUU6RkFMU0U7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdE1jc19Qcm9jOjooSHRNY3M9JWQsIGJBdXRvVHhSYXRlU3dpdGNoID0gJWQpXG4iLAorCQkJCQkJcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MsIHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoKSk7CisKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlIDwgUEhZXzExQUJHTl9NSVhFRCkgfHwKKwkJCShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFIDwgTU9ERV9IVE1JWCkpCisJCXsKKwkgICAgICAgIGlmICgocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgIT0gTUNTX0FVVE8pICYmCisJCQkJKEh0TWNzID49IDAgJiYgSHRNY3MgPD0gMykgJiYKKwkgICAgICAgICAgICAocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSA9PSBGSVhFRF9UWE1PREVfQ0NLKSkKKwkJCXsKKwkJCQlSVE1QU2V0RGVzaXJlZFJhdGVzKHBBZCwgKExPTkcpIChSYXRlSWRUb01icHNbSHRNY3NdICogMTAwMDAwMCkpOworCQkJfQorCSAgICAgICAgZWxzZSBpZiAoKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICE9IE1DU19BVVRPKSAmJgorCQkJCQkoSHRNY3MgPj0gMCAmJiBIdE1jcyA8PSA3KSAmJgorCSAgICAgICAgICAgIAkocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSA9PSBGSVhFRF9UWE1PREVfT0ZETSkpCisJCQl7CisJCQkJUlRNUFNldERlc2lyZWRSYXRlcyhwQWQsIChMT05HKSAoUmF0ZUlkVG9NYnBzW0h0TWNzKzRdICogMTAwMDAwMCkpOworCQkJfQorCQkJZWxzZQorCQkJCWJBdXRvUmF0ZSA9IFRSVUU7CisKKwkJCWlmIChiQXV0b1JhdGUpCisJCQl7CisJICAgICAgICAgICAgcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsKKwkJCQlSVE1QU2V0RGVzaXJlZFJhdGVzKHBBZCwgLTEpOworCQkJfQorCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0TWNzX1Byb2M6OihGaXhlZFR4TW9kZT0lZClcbiIscEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSkpOworCQl9CisgICAgICAgIGlmIChBREhPQ19PTihwQWQpKQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJU2V0Q29tbW9uSFQocEFkKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X0h0R2lfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgSHRHaTsKKworCUh0R2kgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKCBIdEdpID09IEdJXzQwMCkKKwkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0kgPSBHSV80MDA7CisJZWxzZSBpZiAoIEh0R2kgPT0gR0lfODAwICkKKwkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJU2V0Q29tbW9uSFQocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdEdpX1Byb2M6OihTaG9ydEdJPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKworSU5UCVNldF9IdFR4QkFTaXplX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVDSEFSIFNpemU7CisKKwlTaXplID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChTaXplIDw9MCB8fCBTaXplID49NjQpCisJeworCQlTaXplID0gODsKKwl9CisJcEFkLT5Db21tb25DZmcuVHhCQVNpemUgPSBTaXplLTE7CisJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0h0VHhCQVNpemUgOjooVHhCQVNpemU9ICVkKVxuIiwgU2l6ZSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKworSU5UCVNldF9IdE9wTW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKFZhbHVlID09IEhUTU9ERV9HRikKKwkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERSAgPSBIVE1PREVfR0Y7CisJZWxzZSBpZiAoIFZhbHVlID09IEhUTU9ERV9NTSApCisJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREUgID0gSFRNT0RFX01NOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworCVNldENvbW1vbkhUKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRPcE1vZGVfUHJvYzo6KEh0T3BNb2RlPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFKSk7CisKKwlyZXR1cm4gVFJVRTsKKworfQorCitJTlQJU2V0X0h0U3RiY19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKFZhbHVlID09IFNUQkNfVVNFKQorCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQyA9IFNUQkNfVVNFOworCWVsc2UgaWYgKCBWYWx1ZSA9PSBTVEJDX05PTkUgKQorCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlTZXRDb21tb25IVChwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1N0YmNfUHJvYzo6KEh0U3RiYz0lZClcbiIscEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkMpKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X0h0SHRjX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJaWYgKFZhbHVlID09IDApCisJCXBBZC0+SFRDRW5hYmxlID0gRkFMU0U7CisJZWxzZSBpZiAoIFZhbHVlID09MSApCisgICAgICAgIAlwQWQtPkhUQ0VuYWJsZSA9IFRSVUU7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0SHRjX1Byb2M6OihIdEh0Yz0lZClcbiIscEFkLT5IVENFbmFibGUpKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X0h0RXh0Y2hhX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoVmFsdWUgPT0gMCkKKwkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSAgPSBFWFRDSEFfQkVMT1c7CisJZWxzZSBpZiAoIFZhbHVlID09MSApCisgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfQUJPVkU7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJU2V0Q29tbW9uSFQocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdEV4dGNoYV9Qcm9jOjooSHRFeHRjaGE9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEpKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X0h0TXBkdURlbnNpdHlfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoVmFsdWUgPD03ICYmIFZhbHVlID49IDApCisJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eSA9IFZhbHVlOworCWVsc2UKKwkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gNDsKKworCVNldENvbW1vbkhUKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRNcGR1RGVuc2l0eV9Qcm9jOjooSHRNcGR1RGVuc2l0eT0lZClcbiIscEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5KSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9IdEJhV2luU2l6ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCisJaWYgKFZhbHVlID49MSAmJiBWYWx1ZSA8PSA2NCkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSBWYWx1ZTsKKwkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IFZhbHVlOworCX0KKwllbHNlCisJeworICAgICAgICBwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gNjQ7CisJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSA2NDsKKwl9CisKKwlTZXRDb21tb25IVChwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0QmFXaW5TaXplX1Byb2M6OihIdEJhV2luU2l6ZT0lZClcbiIscEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfSHRSZGdfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoVmFsdWUgPT0gMCkKKwkJcEFkLT5Db21tb25DZmcuYlJkZyA9IEZBTFNFOworCWVsc2UgaWYgKCBWYWx1ZSA9PTEgKQorCXsKKwkJcEFkLT5IVENFbmFibGUgPSBUUlVFOworICAgICAgICAJcEFkLT5Db21tb25DZmcuYlJkZyA9IFRSVUU7CisJfQorCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworCVNldENvbW1vbkhUKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRSZGdfUHJvYzo6KEh0UmRnPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5iUmRnKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9IdExpbmtBZGFwdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKwlpZiAoVmFsdWUgPT0gMCkKKwkJcEFkLT5iTGlua0FkYXB0ID0gRkFMU0U7CisJZWxzZSBpZiAoIFZhbHVlID09MSApCisJeworCQkJcEFkLT5IVENFbmFibGUgPSBUUlVFOworCQkJcEFkLT5iTGlua0FkYXB0ID0gVFJVRTsKKwl9CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0TGlua0FkYXB0X1Byb2M6OihIdExpbmtBZGFwdD0lZClcbiIscEFkLT5iTGlua0FkYXB0KSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9IdEFtc2R1X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCWlmIChWYWx1ZSA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGUgPSBGQUxTRTsKKwllbHNlIGlmICggVmFsdWUgPT0gMSApCisgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZSA9IFRSVUU7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJU2V0Q29tbW9uSFQocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdEFtc2R1X1Byb2M6OihIdEFtc2R1PSVkKVxuIixwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGUpKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X0h0QXV0b0JhX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCWlmIChWYWx1ZSA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gRkFMU0U7CisgICAgZWxzZSBpZiAoVmFsdWUgPT0gMSkKKwkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IFRSVUU7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisgICAgcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkE7CisJU2V0Q29tbW9uSFQocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdEF1dG9CYV9Qcm9jOjooSHRBdXRvQmE9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEpKTsKKworCXJldHVybiBUUlVFOworCit9CisKK0lOVAlTZXRfSHRQcm90ZWN0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCWlmIChWYWx1ZSA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5iSFRQcm90ZWN0ID0gRkFMU0U7CisgICAgZWxzZSBpZiAoVmFsdWUgPT0gMSkKKwkJcEFkLT5Db21tb25DZmcuYkhUUHJvdGVjdCA9IFRSVUU7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0UHJvdGVjdF9Qcm9jOjooSHRQcm90ZWN0PSVkKVxuIixwQWQtPkNvbW1vbkNmZy5iSFRQcm90ZWN0KSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9TZW5kUFNNUEFjdGlvbl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKyAgICBVQ0hBUiBtYWNbNl0sIG1vZGU7CisJY2hhciAqdG9rZW4sIHNlcFZhbHVlW10gPSAiOiIsIERBU0ggPSAnLSc7CisJSU5UIGk7CisgICAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7CisKKyAgICAvL3ByaW50aygiXG4lc1xuIiwgYXJnKTsKKy8qCisJVGhlIEJBUmVjVGVhckRvd24gaW51cHQgc3RyaW5nIGZvcm1hdCBzaG91bGQgYmUgeHg6eHg6eHg6eHg6eHg6eHgtZCwKKwkJPT5UaGUgc2l4IDIgZGlnaXQgaGV4LWRlY2ltYWwgbnVtYmVyIHByZXZpb3VzIGFyZSB0aGUgTWFjIGFkZHJlc3MsCisJCT0+VGhlIHNldmVudGggZGVjaW1hbCBudW1iZXIgaXMgdGhlIG1vZGUgdmFsdWUuCisqLworICAgIGlmKHN0cmxlbihhcmcpIDwgMTkpICAvL01hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNyBwbHVzIHRoZSAiLSIgYW5kIG1vZGUgdmFsdWUgaW4gZGVjaW1hbCBmb3JtYXQuCisJCXJldHVybiBGQUxTRTsKKworICAgCXRva2VuID0gc3RyY2hyKGFyZywgREFTSCk7CisJaWYgKCh0b2tlbiAhPSBOVUxMKSAmJiAoc3RybGVuKHRva2VuKT4xKSkKKwl7CisJCW1vZGUgPSBzaW1wbGVfc3RydG9sKCh0b2tlbisxKSwgMCwgMTApOworCQlpZiAobW9kZSA+IE1NUFNfRU5BQkxFKQorCQkJcmV0dXJuIEZBTFNFOworCisJCSp0b2tlbiA9ICdcMCc7CisJCWZvciAoaSA9IDAsIHRva2VuID0gcnN0cnRvayhhcmcsICZzZXBWYWx1ZVswXSk7IHRva2VuOyB0b2tlbiA9IHJzdHJ0b2soTlVMTCwgJnNlcFZhbHVlWzBdKSwgaSsrKQorCQl7CisJCQlpZigoc3RybGVuKHRva2VuKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCp0b2tlbikpIHx8ICghaXN4ZGlnaXQoKih0b2tlbisxKSkpKQorCQkJCXJldHVybiBGQUxTRTsKKwkJCUF0b0godG9rZW4sIChQVUNIQVIpKCZtYWNbaV0pLCAxKTsKKwkJfQorCQlpZihpICE9IDYpCisJCQlyZXR1cm4gRkFMU0U7CisKKwkJcHJpbnRrKCJcbiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LSUwMngiLCBtYWNbMF0sIG1hY1sxXSwKKwkJICAgICAgIG1hY1syXSwgbWFjWzNdLCBtYWNbNF0sIG1hY1s1XSwgbW9kZSk7CisKKwkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBtYWMpOworCisJCWlmIChwRW50cnkpIHsKKwkJICAgIHByaW50aygiXG5TZW5kUFNNUEFjdGlvbiBNSVBTIG1vZGUgPSAlZFxuIiwgbW9kZSk7CisJCSAgICBTZW5kUFNNUEFjdGlvbihwQWQsIHBFbnRyeS0+QWlkLCBtb2RlKTsKKwkJfQorCisJCXJldHVybiBUUlVFOworCX0KKworCXJldHVybiBGQUxTRTsKKworCit9CisKK0lOVAlTZXRfSHRNSU1PUFNtb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKFZhbHVlIDw9MyAmJiBWYWx1ZSA+PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSBWYWx1ZTsKKwllbHNlCisJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSA9IDM7CisKKwlTZXRDb21tb25IVChwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0TUlNT1BTbW9kZV9Qcm9jOjooTUlNT1BTIG1vZGU9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKworSU5UCVNldF9Gb3JjZVNob3J0R0lfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJaWYgKFZhbHVlID09IDApCisJCXBBZC0+V0lGSXRlc3RiZWQuYlNob3J0R0kgPSBGQUxTRTsKKwllbHNlIGlmIChWYWx1ZSA9PSAxKQorCQlwQWQtPldJRkl0ZXN0YmVkLmJTaG9ydEdJID0gVFJVRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlTZXRDb21tb25IVChwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0ZvcmNlU2hvcnRHSV9Qcm9jOjooRm9yY2VTaG9ydEdJPSVkKVxuIiwgcEFkLT5XSUZJdGVzdGJlZC5iU2hvcnRHSSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKworCitJTlQJU2V0X0ZvcmNlR0ZfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJaWYgKFZhbHVlID09IDApCisJCXBBZC0+V0lGSXRlc3RiZWQuYkdyZWVuRmllbGQgPSBGQUxTRTsKKwllbHNlIGlmIChWYWx1ZSA9PSAxKQorCQlwQWQtPldJRkl0ZXN0YmVkLmJHcmVlbkZpZWxkID0gVFJVRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlTZXRDb21tb25IVChwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0ZvcmNlR0ZfUHJvYzo6KEZvcmNlR0Y9JWQpXG4iLCBwQWQtPldJRkl0ZXN0YmVkLmJHcmVlbkZpZWxkKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9IdE1pbW9Qc19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKwlpZiAoVmFsdWUgPT0gMCkKKwkJcEFkLT5Db21tb25DZmcuYk1JTU9QU0VuYWJsZSA9IEZBTFNFOworCWVsc2UgaWYgKFZhbHVlID09IDEpCisJCXBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUgPSBUUlVFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdE1pbW9Qc19Qcm9jOjooSHRNaW1vUHM9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUpKTsKKworCXJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK0lOVAlTZXRDb21tb25IVCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlPSURfU0VUX0hUX1BIWU1PREUJCVNldEhUOworCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPCBQSFlfMTFBQkdOX01JWEVEKQorCQlyZXR1cm4gRkFMU0U7CisKKwlTZXRIVC5QaHlNb2RlID0gcEFkLT5Db21tb25DZmcuUGh5TW9kZTsKKwlTZXRIVC5UcmFuc21pdE5vID0gKChVQ0hBUilwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoKTsKKwlTZXRIVC5IdE1vZGUgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERTsKKwlTZXRIVC5FeHRPZmZzZXQgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQTsKKwlTZXRIVC5NQ1MgPSBNQ1NfQVVUTzsKKwlTZXRIVC5CVyA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlc7CisJU2V0SFQuU1RCQyA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQzsKKwlTZXRIVC5TSE9SVEdJID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJOworCisJUlRNUFNldEhUKHBBZCwgJlNldEhUKTsKKworCXJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitJTlQJU2V0X0ZpeGVkVHhNb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVDSEFSCWZpeF90eF9tb2RlID0gRklYRURfVFhNT0RFX0hUOworCisJaWYgKHN0cmNtcChhcmcsICJPRkRNIikgPT0gMCB8fCBzdHJjbXAoYXJnLCAib2ZkbSIpID09IDApCisJeworCQlmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9PRkRNOworCX0KKwllbHNlIGlmIChzdHJjbXAoYXJnLCAiQ0NLIikgPT0gMCB8fCBzdHJjbXAoYXJnLCAiY2NrIikgPT0gMCkKKwl7CisgICAgICAgIGZpeF90eF9tb2RlID0gRklYRURfVFhNT0RFX0NDSzsKKwl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlID0gZml4X3R4X21vZGU7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfRml4ZWRUeE1vZGVfUHJvYzo6KEZpeGVkVHhNb2RlPSVkKVxuIiwgZml4X3R4X21vZGUpKTsKKworCXJldHVybiBUUlVFOworfQorCisjaWZkZWYgQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQKK0lOVAlTZXRfT3BNb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisjaWZkZWYgUlQyODYwCisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkNhbiBub3Qgc3dpdGNoIG9wZXJhdGUgbW9kZSBvbiBpbnRlcmZhY2UgdXAgISEgXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAoVmFsdWUgPT0gMCkKKwkJcEFkLT5PcE1vZGUgPSBPUE1PREVfU1RBOworCWVsc2UgaWYgKFZhbHVlID09IDEpCisJCXBBZC0+T3BNb2RlID0gT1BNT0RFX0FQOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9PcE1vZGVfUHJvYzo6KE9wTW9kZT0lcylcbiIsIHBBZC0+T3BNb2RlID09IDEgPyAiQVAgTW9kZSIgOiAiU1RBIE1vZGUiKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvLyBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVCAvLworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK1BDSEFSICAgUlRNUEdldFJhbGlua0F1dGhNb2RlU3RyKAorICAgIElOICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFIGF1dGhNb2RlKQoreworCXN3aXRjaChhdXRoTW9kZSkKKwl7CisJCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlT3BlbjoKKwkJCXJldHVybiAiT1BFTiI7CisgICAgICAgIGRlZmF1bHQ6CisJCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLOgorCQkJcmV0dXJuICJXUEFQU0siOworCQljYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZDoKKwkJCXJldHVybiAiU0hBUkVEIjsKKwkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEE6CisJCQlyZXR1cm4gIldQQSI7CisJCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMjoKKwkJCXJldHVybiAiV1BBMiI7CisJCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzoKKwkJCXJldHVybiAiV1BBMlBTSyI7CisgICAgICAgIGNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0s6CisJCQlyZXR1cm4gIldQQVBTS1dQQTJQU0siOworICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyOgorCQkJcmV0dXJuICJXUEExV1BBMiI7CisJCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZToKKwkJCXJldHVybiAiV1BBTk9ORSI7CisJfQorfQorCitQQ0hBUiAgIFJUTVBHZXRSYWxpbmtFbmNyeU1vZGVTdHIoCisgICAgSU4gIFVTSE9SVCBlbmNyeU1vZGUpCit7CisJc3dpdGNoKGVuY3J5TW9kZSkKKwl7CisJICAgIGRlZmF1bHQ6CisJCWNhc2UgTmRpczgwMl8xMVdFUERpc2FibGVkOgorCQkJcmV0dXJuICJOT05FIjsKKwkJY2FzZSBOZGlzODAyXzExV0VQRW5hYmxlZDoKKwkJCXJldHVybiAiV0VQIjsKKwkJY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOgorCQkJcmV0dXJuICJUS0lQIjsKKwkJY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOgorCQkJcmV0dXJuICJBRVMiOworICAgICAgICBjYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQ6CisJCQlyZXR1cm4gIlRLSVBBRVMiOworCX0KK30KKworSU5UIFJUTVBTaG93Q2ZnVmFsdWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcE5hbWUsCisJSU4JUFVDSEFSCQkJcEJ1ZikKK3sKKwlJTlQJU3RhdHVzID0gMDsKKworCWZvciAoUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQyA9IFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQzsgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQy0+bmFtZTsgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQysrKQorCXsKKwkJaWYgKCFzdHJjbXAocE5hbWUsIFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MtPm5hbWUpKQorCQl7CisJCQlpZihQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DLT5zaG93X3Byb2MocEFkLCBwQnVmKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJYnJlYWs7ICAvL0V4aXQgZm9yIGxvb3AuCisJCX0KKwl9CisKKwlpZihQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DLT5uYW1lID09IE5VTEwpCisJeworCQlzcHJpbnRmKHBCdWYsICJcbiIpOworCQlmb3IgKFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MgPSBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0M7IFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MtPm5hbWU7IFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MrKykKKwkJCXNwcmludGYocEJ1ZiwgIiVzJXNcbiIsIHBCdWYsIFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MtPm5hbWUpOworCX0KKworCXJldHVybiBTdGF0dXM7Cit9CisKK0lOVAlTaG93X1NTSURfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5Tc2lkKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfV2lyZWxlc3NNb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3dpdGNoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpCisJeworCQljYXNlIFBIWV8xMUJHX01JWEVEOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMUIvRyIpOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExQjoKKwkJCXNwcmludGYocEJ1ZiwgIlx0MTFCIik7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfMTFBOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMUEiKTsKKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMUFCR19NSVhFRDoKKwkJCXNwcmludGYocEJ1ZiwgIlx0MTFBL0IvRyIpOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExRzoKKwkJCXNwcmludGYocEJ1ZiwgIlx0MTFHIik7CisJCQlicmVhazsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJY2FzZSBQSFlfMTFBQkdOX01JWEVEOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMUEvQi9HL04iKTsKKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMU5fMl80RzoKKwkJCXNwcmludGYocEJ1ZiwgIlx0MTFOIG9ubHkgd2l0aCAyLjRHIik7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfMTFHTl9NSVhFRDoKKwkJCXNwcmludGYocEJ1ZiwgIlx0MTFHL04iKTsKKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMUFOX01JWEVEOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMUEvTiIpOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExQkdOX01JWEVEOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMUIvRy9OIik7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfMTFBR05fTUlYRUQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdDExQS9HL04iKTsKKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMU5fNUc6CisJCQlzcHJpbnRmKHBCdWYsICJcdDExTiBvbmx5IHdpdGggNUciKTsKKwkJCWJyZWFrOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQlkZWZhdWx0OgorCQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJWQpIiwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSk7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworSU5UCVNob3dfVHhCdXJzdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCA/ICJUUlVFIjoiRkFMU0UiKTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfVHhQcmVhbWJsZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXN3aXRjaChwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlKQorCXsKKwkJY2FzZSBSdDgwMl8xMVByZWFtYmxlU2hvcnQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdFNob3J0Iik7CisJCQlicmVhazsKKwkJY2FzZSBSdDgwMl8xMVByZWFtYmxlTG9uZzoKKwkJCXNwcmludGYocEJ1ZiwgIlx0TG9uZyIpOworCQkJYnJlYWs7CisJCWNhc2UgUnQ4MDJfMTFQcmVhbWJsZUF1dG86CisJCQlzcHJpbnRmKHBCdWYsICJcdEF1dG8iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJWx1KSIsIHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUpOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X1R4UG93ZXJfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCVsdSIsIHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlKTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfQ2hhbm5lbF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JWQiLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfQkdQcm90ZWN0aW9uX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3dpdGNoKHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbikKKwl7CisJCWNhc2UgMTogLy9BbHdheXMgT24KKwkJCXNwcmludGYocEJ1ZiwgIlx0T04iKTsKKwkJCWJyZWFrOworCQljYXNlIDI6IC8vQWx3YXlzIE9GRgorCQkJc3ByaW50ZihwQnVmLCAiXHRPRkYiKTsKKwkJCWJyZWFrOworCQljYXNlIDA6IC8vQVVUTworCQkJc3ByaW50ZihwQnVmLCAiXHRBdXRvIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCVsdSkiLCBwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24pOworCQkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitJTlQJU2hvd19SVFNUaHJlc2hvbGRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCV1IiwgcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkKTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfRnJhZ1RocmVzaG9sZF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXUiLCBwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK0lOVAlTaG93X0h0QndfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlpZiAocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwKQorCXsKKwkJc3ByaW50ZihwQnVmLCAiXHQ0MCBNSHoiKTsKKwl9CisJZWxzZQorCXsKKyAgICAgICAgc3ByaW50ZihwQnVmLCAiXHQyMCBNSHoiKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X0h0TWNzX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlzcHJpbnRmKHBCdWYsICJcdCV1IiwgcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCXJldHVybiAwOworfQorCitJTlQJU2hvd19IdEdpX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3dpdGNoKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJKQorCXsKKwkJY2FzZSBHSV80MDA6CisJCQlzcHJpbnRmKHBCdWYsICJcdEdJXzQwMCIpOworCQkJYnJlYWs7CisJCWNhc2UgR0lfODAwOgorCQkJc3ByaW50ZihwQnVmLCAiXHRHSV84MDAiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJXUpIiwgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0kpOworCQkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitJTlQJU2hvd19IdE9wTW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXN3aXRjaChwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFKQorCXsKKwkJY2FzZSBIVE1PREVfR0Y6CisJCQlzcHJpbnRmKHBCdWYsICJcdEdGIik7CisJCQlicmVhazsKKwkJY2FzZSBIVE1PREVfTU06CisJCQlzcHJpbnRmKHBCdWYsICJcdE1NIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCV1KSIsIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREUpOworCQkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitJTlQJU2hvd19IdEV4dGNoYV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXN3aXRjaChwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBKQorCXsKKwkJY2FzZSBFWFRDSEFfQkVMT1c6CisJCQlzcHJpbnRmKHBCdWYsICJcdEJlbG93Iik7CisJCQlicmVhazsKKwkJY2FzZSBFWFRDSEFfQUJPVkU6CisJCQlzcHJpbnRmKHBCdWYsICJcdEFib3ZlIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCV1KSIsIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEpOworCQkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCisKK0lOVAlTaG93X0h0TXBkdURlbnNpdHlfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCV1IiwgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5KTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfSHRCYVdpblNpemVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCV1IiwgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCk7CisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X0h0UmRnX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLmJSZGcgPyAiVFJVRSI6IkZBTFNFIik7CisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X0h0QW1zZHVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCVzIiwgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1RW5hYmxlID8gIlRSVUUiOiJGQUxTRSIpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19IdEF1dG9CYV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID8gIlRSVUUiOiJGQUxTRSIpOworCXJldHVybiAwOworfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitJTlQJU2hvd19Db3VudHJ5UmVnaW9uX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3ByaW50ZihwQnVmLCAiXHQlZCIsIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24pOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19Db3VudHJ5UmVnaW9uQUJhbmRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCVkIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kKTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfQ291bnRyeUNvZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCVzIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGUpOworCXJldHVybiAwOworfQorCisjaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAorSU5UCVNob3dfUGt0QWdncmVnYXRlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUgPyAiVFJVRSI6IkZBTFNFIik7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gQUdHUkVHQVRJT05fU1VQUE9SVCAvLworCisjaWZkZWYgV01NX1NVUFBPUlQKK0lOVAlTaG93X1dtbUNhcGFibGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSA/ICJUUlVFIjoiRkFMU0UiKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCXJldHVybiAwOworfQorI2VuZGlmIC8vIFdNTV9TVVBQT1JUIC8vCisKK0lOVAlTaG93X0lFRUU4MDIxMUhfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCVzIiwgcEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPyAiVFJVRSI6IkZBTFNFIik7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK0lOVAlTaG93X05ldHdvcmtUeXBlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3dpdGNoKHBBZC0+U3RhQ2ZnLkJzc1R5cGUpCisJeworCQljYXNlIEJTU19BREhPQzoKKwkJCXNwcmludGYocEJ1ZiwgIlx0QWRob2MiKTsKKwkJCWJyZWFrOworCQljYXNlIEJTU19JTkZSQToKKwkJCXNwcmludGYocEJ1ZiwgIlx0SW5mcmEiKTsKKwkJCWJyZWFrOworCQljYXNlIEJTU19BTlk6CisJCQlzcHJpbnRmKHBCdWYsICJcdEFueSIpOworCQkJYnJlYWs7CisJCWNhc2UgQlNTX01PTklUT1I6CisJCQlzcHJpbnRmKHBCdWYsICJcdE1vbml0b3IiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJWQpIiwgcEFkLT5TdGFDZmcuQnNzVHlwZSk7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK0lOVAlTaG93X0F1dGhNb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERQlBdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlBdXRoTW9kZSA9IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJaWYgKChBdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKSAmJgorCQkoQXV0aE1vZGUgPD0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0spKQorCQlzcHJpbnRmKHBCdWYsICJcdCVzIiwgUlRNUEdldFJhbGlua0F1dGhNb2RlU3RyKEF1dGhNb2RlKSk7CisJZWxzZQorCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSglZCkiLCBBdXRoTW9kZSk7CisKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfRW5jcnlwVHlwZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCU5ESVNfODAyXzExX1dFUF9TVEFUVVMJV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJV2VwU3RhdHVzID0gcEFkLT5TdGFDZmcuV2VwU3RhdHVzOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJaWYgKChXZXBTdGF0dXMgPj0gTmRpczgwMl8xMVdFUEVuYWJsZWQpICYmCisJCShXZXBTdGF0dXMgPD0gTmRpczgwMl8xMUVuY3J5cHRpb240S2V5QWJzZW50KSkKKwkJc3ByaW50ZihwQnVmLCAiXHQlcyIsIFJUTVBHZXRSYWxpbmtFbmNyeU1vZGVTdHIoV2VwU3RhdHVzKSk7CisJZWxzZQorCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSglZCkiLCBXZXBTdGF0dXMpOworCisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X0RlZmF1bHRLZXlJRF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCVVDSEFSIERlZmF1bHRLZXlJZCA9IDA7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlEZWZhdWx0S2V5SWQgPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlzcHJpbnRmKHBCdWYsICJcdCVkIiwgRGVmYXVsdEtleUlkKTsKKworCXJldHVybiAwOworfQorCitJTlQJU2hvd19XZXBLZXlfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgSU5UCQkJCUtleUlkeCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlVQ0hBUiAgIEtleVsxNl0gPSB7MH0sIEtleUxlbmd0aCA9IDA7CisJSU5UCQlpbmRleCA9IEJTUzA7CisKKwlLZXlMZW5ndGggPSBwQWQtPlNoYXJlZEtleVtpbmRleF1bS2V5SWR4XS5LZXlMZW47CisJTmRpc01vdmVNZW1vcnkoS2V5LCBwQWQtPlNoYXJlZEtleVtpbmRleF1bS2V5SWR4XS5LZXksIEtleUxlbmd0aCk7CisKKwkvL2NoZWNrIGtleSBzdHJpbmcgaXMgQVNDSUkgb3Igbm90CisgICAgaWYgKFJUTVBDaGVja1N0clByaW50QWJsZShLZXksIEtleUxlbmd0aCkpCisgICAgICAgIHNwcmludGYocEJ1ZiwgIlx0JXMiLCBLZXkpOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGludCBpZHg7CisgICAgICAgIHNwcmludGYocEJ1ZiwgIlx0Iik7CisgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgS2V5TGVuZ3RoOyBpZHgrKykKKyAgICAgICAgICAgIHNwcmludGYocEJ1ZitzdHJsZW4ocEJ1ZiksICIlMDJYIiwgS2V5W2lkeF0pOworICAgIH0KKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfS2V5MV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCVNob3dfV2VwS2V5X1Byb2MocEFkLCAwLCBwQnVmKTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfS2V5Ml9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCVNob3dfV2VwS2V5X1Byb2MocEFkLCAxLCBwQnVmKTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfS2V5M19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCVNob3dfV2VwS2V5X1Byb2MocEFkLCAyLCBwQnVmKTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfS2V5NF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCVNob3dfV2VwS2V5X1Byb2MocEFkLCAzLCBwQnVmKTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfV1BBUFNLX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJSU5UIAlpZHg7CisJVUNIQVIJUE1LWzMyXSA9IHswfTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJTmRpc01vdmVNZW1vcnkoUE1LLCBwQWQtPlN0YUNmZy5QTUssIDMyKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworICAgIHNwcmludGYocEJ1ZiwgIlx0UE1LID0gIik7CisgICAgZm9yIChpZHggPSAwOyBpZHggPCAzMjsgaWR4KyspCisgICAgICAgIHNwcmludGYocEJ1ZitzdHJsZW4ocEJ1ZiksICIlMDJYIiwgUE1LW2lkeF0pOworCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9zYW5pdHkuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9zYW5pdHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGYwNzBkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3Nhbml0eS5jCkBAIC0wLDAgKzEsMTYzMyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlzYW5pdHkuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUpvaG4gQ2hhbmcgIDIwMDQtMDktMDEgICAgICBhZGQgV01NIHN1cHBvcnQKKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKworZXh0ZXJuIFVDSEFSCUNJU0NPX09VSVtdOworCitleHRlcm4gVUNIQVIJV1BBX09VSVtdOworZXh0ZXJuIFVDSEFSCVJTTl9PVUlbXTsKK2V4dGVybiBVQ0hBUglXTUVfSU5GT19FTEVNW107CitleHRlcm4gVUNIQVIJV01FX1BBUk1fRUxFTVtdOworZXh0ZXJuIFVDSEFSCUNjeDJRb3NJbmZvW107CitleHRlcm4gVUNIQVIJUkFMSU5LX09VSVtdOworZXh0ZXJuIFVDSEFSCUJST0FEQ09NX09VSVtdOworZXh0ZXJuIFVDSEFSICAgIFdQU19PVUlbXTsKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gTWxtZUFkZEJBUmVxU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQWRkcjIpCit7CisgICAgUE1MTUVfQUREQkFfUkVRX1NUUlVDVCAgIHBJbmZvOworCisgICAgcEluZm8gPSAoTUxNRV9BRERCQV9SRVFfU1RSVUNUICopTXNnOworCisgICAgaWYgKChNc2dMZW4gIT0gc2l6ZW9mKE1MTUVfQUREQkFfUkVRX1NUUlVDVCkpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZUFkZEJBUmVxU2FuaXR5IGZhaWwgLSBtZXNzYWdlIGxlbmdodCBub3QgY29ycmVjdC5cbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGlmICgocEluZm8tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZUFkZEJBUmVxU2FuaXR5IGZhaWwgLSBUaGUgcGVlciBNYWMgaXMgbm90IGFzc29jaWF0ZWQgeWV0LlxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKChwSW5mby0+cEFkZHJbMF0mMHgwMSkgPT0gMHgwMSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVBZGRCQVJlcVNhbml0eSBmYWlsIC0gYnJvYWRjYXN0IGFkZHJlc3Mgbm90IHN1cHBvcnQgQkFcbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBNbG1lRGVsQkFSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbikKK3sKKwlNTE1FX0RFTEJBX1JFUV9TVFJVQ1QgKnBJbmZvOworCXBJbmZvID0gKE1MTUVfREVMQkFfUkVRX1NUUlVDVCAqKU1zZzsKKworICAgIGlmICgoTXNnTGVuICE9IHNpemVvZihNTE1FX0RFTEJBX1JFUV9TVFJVQ1QpKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIk1sbWVEZWxCQVJlcVNhbml0eSBmYWlsIC0gbWVzc2FnZSBsZW5naHQgbm90IGNvcnJlY3QuXG4iKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHBJbmZvLT5XY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIk1sbWVEZWxCQVJlcVNhbml0eSBmYWlsIC0gVGhlIHBlZXIgTWFjIGlzIG5vdCBhc3NvY2lhdGVkIHlldC5cbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGlmICgocEluZm8tPlRJRCAmIDB4ZjApKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTWxtZURlbEJBUmVxU2FuaXR5IGZhaWwgLSBUaGUgcGVlciBUSUQgaXMgaW5jb3JyZWN0LlxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisJaWYgKE5kaXNFcXVhbE1lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5BZGRyLCBwSW5mby0+QWRkciwgTUFDX0FERFJfTEVOKSA9PSAwKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTWxtZURlbEJBUmVxU2FuaXR5IGZhaWwgLSB0aGUgcGVlciBhZGRyIGRvc2VuJ3QgZXhpc3QuXG4iKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworQk9PTEVBTiBQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqcE1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisJT1VUIFBVQ0hBUiBwQWRkcjIpCit7CisJUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOworCVBGUkFNRV9BRERCQV9SRVEgcEFkZEZyYW1lOworCXBBZGRGcmFtZSA9IChQRlJBTUVfQUREQkFfUkVRKShwTXNnKTsKKwlpZiAoTXNnTGVuIDwgKHNpemVvZihGUkFNRV9BRERCQV9SRVEpKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiUGVlckFkZEJBUmVxQWN0aW9uU2FuaXR5OiBBRERCQSBSZXF1ZXN0IGZyYW1lIGxlbmd0aCBzaXplID0gJWxkIGluY29ycmVjdFxuIiwgTXNnTGVuKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJLy8gd2Ugc3VwcG9ydCBpbW1lZGlhdGUgQkEuCisJKihVU0hPUlQgKikoJnBBZGRGcmFtZS0+QmFQYXJtKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwQWRkRnJhbWUtPkJhUGFybSkpOworCXBBZGRGcmFtZS0+VGltZU91dFZhbHVlID0gY3B1MmxlMTYocEFkZEZyYW1lLT5UaW1lT3V0VmFsdWUpOworCXBBZGRGcmFtZS0+QmFTdGFydFNlcS53b3JkID0gY3B1MmxlMTYocEFkZEZyYW1lLT5CYVN0YXJ0U2VxLndvcmQpOworCisJaWYgKHBBZGRGcmFtZS0+QmFQYXJtLkJBUG9saWN5ICE9IElNTUVEX0JBKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHk6IEFEREJBIFJlcXVlc3QgQmEgUG9saWN5WyVkXSBub3Qgc3VwcG9ydFxuIiwgcEFkZEZyYW1lLT5CYVBhcm0uQkFQb2xpY3kpKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJBRERCQSBSZXF1ZXN0LiB0aWQ9JXgsIEJ1ZnNpemU9JXgsIEFNU0RVU3VwcG9ydGVkPSV4IFxuIiwgcEFkZEZyYW1lLT5CYVBhcm0uVElELCBwQWRkRnJhbWUtPkJhUGFybS5CdWZTaXplLCBwQWRkRnJhbWUtPkJhUGFybS5BTVNEVVN1cHBvcnRlZCkpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLy8gd2Ugc3VwcG9ydCBpbW1lZGlhdGUgQkEuCisJaWYgKHBBZGRGcmFtZS0+QmFQYXJtLlRJRCAmMHhmZmYwKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHk6IEFEREJBIFJlcXVlc3QgaW5jb3JyZWN0IFRJRCA9ICVkXG4iLCBwQWRkRnJhbWUtPkJhUGFybS5USUQpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlDT1BZX01BQ19BRERSKHBBZGRyMiwgcEZyYW1lLT5IZHIuQWRkcjIpOworCXJldHVybiBUUlVFOworfQorCitCT09MRUFOIFBlZXJBZGRCQVJzcEFjdGlvblNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpwTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbikKK3sKKwlQRlJBTUVfQUREQkFfUlNQIHBBZGRGcmFtZTsKKworCXBBZGRGcmFtZSA9IChQRlJBTUVfQUREQkFfUlNQKShwTXNnKTsKKwlpZiAoTXNnTGVuIDwgKHNpemVvZihGUkFNRV9BRERCQV9SU1ApKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiUGVlckFkZEJBUnNwQWN0aW9uU2FuaXR5OiBBRERCQSBSZXNwb25zZSBmcmFtZSBsZW5ndGggc2l6ZSA9ICVsZCBpbmNvcnJlY3RcbiIsIE1zZ0xlbikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCS8vIHdlIHN1cHBvcnQgaW1tZWRpYXRlIEJBLgorCSooVVNIT1JUICopKCZwQWRkRnJhbWUtPkJhUGFybSkgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEFkZEZyYW1lLT5CYVBhcm0pKTsKKwlwQWRkRnJhbWUtPlN0YXR1c0NvZGUgPSBjcHUybGUxNihwQWRkRnJhbWUtPlN0YXR1c0NvZGUpOworCXBBZGRGcmFtZS0+VGltZU91dFZhbHVlID0gY3B1MmxlMTYocEFkZEZyYW1lLT5UaW1lT3V0VmFsdWUpOworCisJaWYgKHBBZGRGcmFtZS0+QmFQYXJtLkJBUG9saWN5ICE9IElNTUVEX0JBKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHk6IEFEREJBIFJlc3BvbnNlIEJhIFBvbGljeVslZF0gbm90IHN1cHBvcnRcbiIsIHBBZGRGcmFtZS0+QmFQYXJtLkJBUG9saWN5KSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkvLyB3ZSBzdXBwb3J0IGltbWVkaWF0ZSBCQS4KKwlpZiAocEFkZEZyYW1lLT5CYVBhcm0uVElEICYweGZmZjApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlBlZXJBZGRCQVJzcEFjdGlvblNhbml0eTogQUREQkEgUmVzcG9uc2UgaW5jb3JyZWN0IFRJRCA9ICVkXG4iLCBwQWRkRnJhbWUtPkJhUGFybS5USUQpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlyZXR1cm4gVFJVRTsKKworfQorCitCT09MRUFOIFBlZXJEZWxCQUFjdGlvblNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBVQ0hBUiBXY2lkLAorICAgIElOIFZPSUQgKnBNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuICkKK3sKKwkvL1BGUkFNRV84MDJfMTEgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpcE1zZzsKKwlQRlJBTUVfREVMQkFfUkVRICBwRGVsRnJhbWU7CisJaWYgKE1zZ0xlbiAhPSAoc2l6ZW9mKEZSQU1FX0RFTEJBX1JFUSkpKQorCQlyZXR1cm4gRkFMU0U7CisKKwlpZiAoV2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJcmV0dXJuIEZBTFNFOworCisJcERlbEZyYW1lID0gKFBGUkFNRV9ERUxCQV9SRVEpKHBNc2cpOworCisJKihVU0hPUlQgKikoJnBEZWxGcmFtZS0+RGVsYmFQYXJtKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwRGVsRnJhbWUtPkRlbGJhUGFybSkpOworCXBEZWxGcmFtZS0+UmVhc29uQ29kZSA9IGNwdTJsZTE2KHBEZWxGcmFtZS0+UmVhc29uQ29kZSk7CisKKwlpZiAocERlbEZyYW1lLT5EZWxiYVBhcm0uVElEICYweGZmZjApCisJCXJldHVybiBGQUxTRTsKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBJTiBVQ0hBUiAgTXNnQ2hhbm5lbCwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMiwKKyAgICBPVVQgUFVDSEFSIHBCc3NpZCwKKyAgICBPVVQgQ0hBUiBTc2lkW10sCisgICAgT1VUIFVDSEFSICpwU3NpZExlbiwKKyAgICBPVVQgVUNIQVIgKnBCc3NUeXBlLAorICAgIE9VVCBVU0hPUlQgKnBCZWFjb25QZXJpb2QsCisgICAgT1VUIFVDSEFSICpwQ2hhbm5lbCwKKyAgICBPVVQgVUNIQVIgKnBOZXdDaGFubmVsLAorICAgIE9VVCBMQVJHRV9JTlRFR0VSICpwVGltZXN0YW1wLAorICAgIE9VVCBDRl9QQVJNICpwQ2ZQYXJtLAorICAgIE9VVCBVU0hPUlQgKnBBdGltV2luLAorICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKKyAgICBPVVQgVUNIQVIgKnBFcnAsCisgICAgT1VUIFVDSEFSICpwRHRpbUNvdW50LAorICAgIE9VVCBVQ0hBUiAqcER0aW1QZXJpb2QsCisgICAgT1VUIFVDSEFSICpwQmNhc3RGbGFnLAorICAgIE9VVCBVQ0hBUiAqcE1lc3NhZ2VUb01lLAorICAgIE9VVCBVQ0hBUiBTdXBSYXRlW10sCisgICAgT1VUIFVDSEFSICpwU3VwUmF0ZUxlbiwKKyAgICBPVVQgVUNIQVIgRXh0UmF0ZVtdLAorICAgIE9VVCBVQ0hBUiAqcEV4dFJhdGVMZW4sCisgICAgT1VUCVVDSEFSICpwQ2tpcEZsYWcsCisgICAgT1VUCVVDSEFSICpwQWlyb25ldENlbGxQb3dlckxpbWl0LAorICAgIE9VVCBQRURDQV9QQVJNICAgICAgIHBFZGNhUGFybSwKKyAgICBPVVQgUFFCU1NfTE9BRF9QQVJNICBwUWJzc0xvYWQsCisgICAgT1VUIFBRT1NfQ0FQQUJJTElUWV9QQVJNIHBRb3NDYXBhYmlsaXR5LAorICAgIE9VVCBVTE9ORyAqcFJhbGlua0llLAorICAgIE9VVCBVQ0hBUgkJICpwSHRDYXBhYmlsaXR5TGVuLAorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorICAgIE9VVCBVQ0hBUgkJICpwUHJlTkh0Q2FwYWJpbGl0eUxlbiwKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKyAgICBPVVQgSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKKwlPVVQgVUNIQVIJCSAqQWRkSHRJbmZvTGVuLAorCU9VVCBBRERfSFRfSU5GT19JRSAqQWRkSHRJbmZvLAorCU9VVCBVQ0hBUiAqTmV3RXh0Q2hhbm5lbE9mZnNldCwJCS8vIEh0IGV4dGVuc2lvbiBjaGFubmVsIG9mZnNldChhYm92ZSBvciBiZWxvdykKKyAgICBPVVQgVVNIT1JUICpMZW5ndGhWSUUsCisgICAgT1VUCVBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMgcFZJRSkKK3sKKyAgICBDSEFSCQkJCSpQdHI7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJQ0hBUiAJCQkJVGltTGVuOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworICAgIFBGUkFNRV84MDJfMTEJCXBGcmFtZTsKKyAgICBQRUlEX1NUUlVDVCAgICAgICAgIHBFaWQ7CisgICAgVUNIQVIJCQkJU3ViVHlwZTsKKyAgICBVQ0hBUgkJCQlTYW5pdHk7CisgICAgLy9VQ0hBUgkJCQlFQ1dNaW4sIEVDV01heDsKKyAgICAvL01BQ19DU1I5X1NUUlVDCQlDc3I5OworICAgIFVMT05HCQkJCUxlbmd0aCA9IDA7CisKKwkvLyBGb3Igc29tZSAxMWEgQVAgd2hpY2ggZGlkbid0IGhhdmUgRFNfSUUsIHdlIHVzZSB0d28gY29uZGl0aW9ucyB0byBkZWNpZGUgdGhlIGNoYW5uZWwKKwkvLwkxLiBJZiB0aGUgQVAgaXMgMTFuIGVuYWJsZWQsIHRoZW4gY2hlY2sgdGhlIGNvbnRyb2wgY2hhbm5lbC4KKwkvLwkyLiBJZiB0aGUgQVAgZGlkbid0IGhhdmUgYW55IGluZm8gYWJvdXQgY2hhbm5lbCwgdXNlIHRoZSBjaGFubmVsIHdlIHJlY2VpdmVkIHRoaXMgZnJhbWUgYXMgdGhlIGNoYW5uZWwuIChNYXkgaW5hY2N1cmFjeSEhKQorCVVDSEFSCQkJQ3RybENoYW5uZWwgPSAwOworCisgICAgLy8gQWRkIGZvciAzIG5lY2Vzc2FyeSBFSUQgZmllbGQgY2hlY2sKKyAgICBTYW5pdHkgPSAwOworCisgICAgKnBBdGltV2luID0gMDsKKyAgICAqcEVycCA9IDA7CisgICAgKnBEdGltQ291bnQgPSAwOworICAgICpwRHRpbVBlcmlvZCA9IDA7CisgICAgKnBCY2FzdEZsYWcgPSAwOworICAgICpwTWVzc2FnZVRvTWUgPSAwOworICAgICpwRXh0UmF0ZUxlbiA9IDA7CisgICAgKnBDa2lwRmxhZyA9IDA7CQkJICAgICAgICAvLyBEZWZhdWx0IG9mIENraXBGbGFnIGlzIDAKKyAgICAqcEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA9IDB4RkY7ICAvLyBEZWZhdWx0IG9mIEFpcm9uZXRDZWxsUG93ZXJMaW1pdCBpcyAweEZGCisgICAgKkxlbmd0aFZJRSA9IDA7CQkJCQkvLyBTZXQgdGhlIGxlbmd0aCBvZiBWSUUgdG8gaW5pdCB2YWx1ZSAwCisgICAgKnBIdENhcGFiaWxpdHlMZW4gPSAwOwkJCQkJLy8gU2V0IHRoZSBsZW5ndGggb2YgVklFIHRvIGluaXQgdmFsdWUgMAorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorCQkqcFByZU5IdENhcGFiaWxpdHlMZW4gPSAwOwkJCQkJLy8gU2V0IHRoZSBsZW5ndGggb2YgVklFIHRvIGluaXQgdmFsdWUgMAorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworICAgICpBZGRIdEluZm9MZW4gPSAwOwkJCQkJLy8gU2V0IHRoZSBsZW5ndGggb2YgVklFIHRvIGluaXQgdmFsdWUgMAorICAgICpwUmFsaW5rSWUgPSAwOworICAgICpwTmV3Q2hhbm5lbCA9IDA7CisgICAgKk5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOwkvL0RlZmF1bHQgMHhmZiBtZWFucyBubyBzdWNoIElFCisgICAgcENmUGFybS0+YlZhbGlkID0gRkFMU0U7ICAgICAgICAvLyBkZWZhdWx0OiBubyBJRV9DRiBmb3VuZAorICAgIHBRYnNzTG9hZC0+YlZhbGlkID0gRkFMU0U7ICAgICAgLy8gZGVmYXVsdDogbm8gSUVfUUJTU19MT0FEIGZvdW5kCisgICAgcEVkY2FQYXJtLT5iVmFsaWQgPSBGQUxTRTsgICAgICAvLyBkZWZhdWx0OiBubyBJRV9FRENBX1BBUkFNRVRFUiBmb3VuZAorICAgIHBRb3NDYXBhYmlsaXR5LT5iVmFsaWQgPSBGQUxTRTsgLy8gZGVmYXVsdDogbm8gSUVfUU9TX0NBUEFCSUxJVFkgZm91bmQKKworICAgIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKU1zZzsKKworICAgIC8vIGdldCBzdWJ0eXBlIGZyb20gaGVhZGVyCisgICAgU3ViVHlwZSA9IChVQ0hBUilwRnJhbWUtPkhkci5GQy5TdWJUeXBlOworCisgICAgLy8gZ2V0IEFkZHIyIGFuZCBCU1NJRCBmcm9tIGhlYWRlcgorICAgIENPUFlfTUFDX0FERFIocEFkZHIyLCBwRnJhbWUtPkhkci5BZGRyMik7CisgICAgQ09QWV9NQUNfQUREUihwQnNzaWQsIHBGcmFtZS0+SGRyLkFkZHIzKTsKKworICAgIFB0ciA9IHBGcmFtZS0+T2N0ZXQ7CisgICAgTGVuZ3RoICs9IExFTkdUSF84MDJfMTE7CisKKyAgICAvLyBnZXQgdGltZXN0YW1wIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBUaW1lc3RhbXAsIFB0ciwgVElNRVNUQU1QX0xFTik7CisKKwlwVGltZXN0YW1wLT51Lkxvd1BhcnQgPSBjcHUybGUzMihwVGltZXN0YW1wLT51Lkxvd1BhcnQpOworCXBUaW1lc3RhbXAtPnUuSGlnaFBhcnQgPSBjcHUybGUzMihwVGltZXN0YW1wLT51LkhpZ2hQYXJ0KTsKKworICAgIFB0ciArPSBUSU1FU1RBTVBfTEVOOworICAgIExlbmd0aCArPSBUSU1FU1RBTVBfTEVOOworCisgICAgLy8gZ2V0IGJlYWNvbiBpbnRlcnZhbCBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICBOZGlzTW92ZU1lbW9yeShwQmVhY29uUGVyaW9kLCBQdHIsIDIpOworICAgIFB0ciArPSAyOworICAgIExlbmd0aCArPSAyOworCisgICAgLy8gZ2V0IGNhcGFiaWxpdHkgaW5mbyBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICBOZGlzTW92ZU1lbW9yeShwQ2FwYWJpbGl0eUluZm8sIFB0ciwgMik7CisgICAgUHRyICs9IDI7CisgICAgTGVuZ3RoICs9IDI7CisKKyAgICBpZiAoQ0FQX0lTX0VTU19PTigqcENhcGFiaWxpdHlJbmZvKSkKKyAgICAgICAgKnBCc3NUeXBlID0gQlNTX0lORlJBOworICAgIGVsc2UKKyAgICAgICAgKnBCc3NUeXBlID0gQlNTX0FESE9DOworCisgICAgcEVpZCA9IChQRUlEX1NUUlVDVCkgUHRyOworCisgICAgLy8gZ2V0IHZhcmlhYmxlIGZpZWxkcyBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICB3aGlsZSAoKExlbmd0aCArIDIgKyBwRWlkLT5MZW4pIDw9IE1zZ0xlbikKKyAgICB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFNlY3VyZSBjb3B5IFZJRSB0byBWYXJJRVtNQVhfVklFX0xFTl0gZGlkbid0IG92ZXJmbG93LgorICAgICAgICAvLworICAgICAgICBpZiAoKCpMZW5ndGhWSUUgKyBwRWlkLT5MZW4gKyAyKSA+PSBNQVhfVklFX0xFTikKKyAgICAgICAgeworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSBWYXJpYWJsZSBJRXMgb3V0IG9mIHJlc291cmNlIFtsZW4oPSVkKSA+IE1BWF9WSUVfTEVOKD0lZCldXG4iLAorICAgICAgICAgICAgICAgICAgICAoKkxlbmd0aFZJRSArIHBFaWQtPkxlbiArIDIpLCBNQVhfVklFX0xFTikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2gocEVpZC0+RWlkKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIElFX1NTSUQ6CisgICAgICAgICAgICAgICAgLy8gQWxyZWFkeSBoYXMgb25lIFNTSUQgRUlEIGluIHRoaXMgYmVhY29uLCBpZ25vcmUgdGhlIHNlY29uZCBvbmUKKyAgICAgICAgICAgICAgICBpZiAoU2FuaXR5ICYgMHgxKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBpZihwRWlkLT5MZW4gPD0gTUFYX0xFTl9PRl9TU0lEKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoU3NpZCwgcEVpZC0+T2N0ZXQsIHBFaWQtPkxlbik7CisgICAgICAgICAgICAgICAgICAgICpwU3NpZExlbiA9IHBFaWQtPkxlbjsKKyAgICAgICAgICAgICAgICAgICAgU2FuaXR5IHw9IDB4MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gd3JvbmcgSUVfU1NJRCAobGVuPSVkKVxuIixwRWlkLT5MZW4pKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBJRV9TVVBQX1JBVEVTOgorICAgICAgICAgICAgICAgIGlmKHBFaWQtPkxlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNhbml0eSB8PSAweDI7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFN1cFJhdGUsIHBFaWQtPk9jdGV0LCBwRWlkLT5MZW4pOworICAgICAgICAgICAgICAgICAgICAqcFN1cFJhdGVMZW4gPSBwRWlkLT5MZW47CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogMjAwNC0wOS0xNCBub3QgYSBnb29kIGRlc2lnbiBoZXJlLCBjYXVzZSBpdCBleGNsdWRlIGV4dHJhIHJhdGVzCisgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gU2NhblRhYi4gV2Ugc2hvdWxkIHJlcG9ydCBhcyBpcy4gQW5kIGZpbHRlciBvdXQgdW5zdXBwb3J0ZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gcmF0ZXMgaW4gTWxtZUF1eC4KKyAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgYWdhaW5zdCB0aGUgc3VwcG9ydGVkIHJhdGVzCisgICAgICAgICAgICAgICAgICAgIC8vIFJUTVBDaGVja1JhdGVzKHBBZCwgU3VwUmF0ZSwgcFN1cFJhdGVMZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9TVVBQX1JBVEVTIChsZW49JWQpXG4iLHBFaWQtPkxlbikpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIElFX0hUX0NBUDoKKwkJCWlmIChwRWlkLT5MZW4gPj0gU0laRV9IVF9DQVBfSUUpICAvL05vdGU6IGFsbG93IGV4dGVuc2lvbi4hIQorCQkJeworCQkJCU5kaXNNb3ZlTWVtb3J5KHBIdENhcGFiaWxpdHksIHBFaWQtPk9jdGV0LCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOworCQkJCSpwSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7CS8vIE5ub3cgd2Ugb25seSBzdXBwb3J0IDI2IGJ5dGVzLgorCisJCQkJKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSk7CisJCQkJKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCXsKKwkJCQkJKnBQcmVOSHRDYXBhYmlsaXR5TGVuID0gMDsJLy8gTm5vdyB3ZSBvbmx5IHN1cHBvcnQgMjYgYnl0ZXMuCisKKwkJCQkJUHRyID0gKFBVQ0hBUikgcFZJRTsKKwkJCQkJTmRpc01vdmVNZW1vcnkoUHRyICsgKkxlbmd0aFZJRSwgJnBFaWQtPkVpZCwgcEVpZC0+TGVuICsgMik7CisJCQkJCSpMZW5ndGhWSUUgKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX0hUX0NBUC4gcEVpZC0+TGVuID0gJWRcbiIsIHBFaWQtPkxlbikpOworCQkJfQorCisJCWJyZWFrOworICAgICAgICAgICAgY2FzZSBJRV9BRERfSFQ6CisJCQlpZiAocEVpZC0+TGVuID49IHNpemVvZihBRERfSFRfSU5GT19JRSkpCisJCQl7CisJCQkJLy8gVGhpcyBJRSBhbGxvd3MgZXh0ZW5zaW9uLCBidXQgd2UgY2FuIGlnbm9yZSBleHRyYSBieXRlcyBiZXlvbmQgb3VyIGtub3dsZWRnZSAsIHNvIG9ubHkKKwkJCQkvLyBjb3B5IGZpcnN0IHNpemVvZihBRERfSFRfSU5GT19JRSkKKwkJCQlOZGlzTW92ZU1lbW9yeShBZGRIdEluZm8sIHBFaWQtPk9jdGV0LCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKKwkJCQkqQWRkSHRJbmZvTGVuID0gU0laRV9BRERfSFRfSU5GT19JRTsKKworCQkJCUN0cmxDaGFubmVsID0gQWRkSHRJbmZvLT5Db250cm9sQ2hhbjsKKworCQkJCSooVVNIT1JUICopKCZBZGRIdEluZm8tPkFkZEh0SW5mbzIpID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJkFkZEh0SW5mby0+QWRkSHRJbmZvMikpOworCQkJCSooVVNIT1JUICopKCZBZGRIdEluZm8tPkFkZEh0SW5mbzMpID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJkFkZEh0SW5mby0+QWRkSHRJbmZvMykpOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQl7CisJCQkgICAgICAgICAgICAgICAgUHRyID0gKFBVQ0hBUikgcFZJRTsKKwkJCSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShQdHIgKyAqTGVuZ3RoVklFLCAmcEVpZC0+RWlkLCBwRWlkLT5MZW4gKyAyKTsKKwkJCSAgICAgICAgICAgICAgICAqTGVuZ3RoVklFICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9BRERfSFQuIFxuIikpOworCQkJfQorCisJCWJyZWFrOworICAgICAgICAgICAgY2FzZSBJRV9TRUNPTkRBUllfQ0hfT0ZGU0VUOgorCQkJaWYgKHBFaWQtPkxlbiA9PSAxKQorCQkJeworCQkJCSpOZXdFeHRDaGFubmVsT2Zmc2V0ID0gcEVpZC0+T2N0ZXRbMF07CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9TRUNPTkRBUllfQ0hfT0ZGU0VULiBcbiIpKTsKKwkJCX0KKworCQlicmVhazsKKyAgICAgICAgICAgIGNhc2UgSUVfRkhfUEFSTToKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkoSUVfRkhfUEFSTSkgXG4iKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgSUVfRFNfUEFSTToKKyAgICAgICAgICAgICAgICBpZihwRWlkLT5MZW4gPT0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICpwQ2hhbm5lbCA9ICpwRWlkLT5PY3RldDsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQkJeworCQkJCQkJaWYgKENoYW5uZWxTYW5pdHkocEFkLCAqcENoYW5uZWwpID09IDApCisJCQkJCQl7CisKKwkJCQkJCQlyZXR1cm4gRkFMU0U7CisJCQkJCQl9CisJCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICAgICAgU2FuaXR5IHw9IDB4NDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gd3JvbmcgSUVfRFNfUEFSTSAobGVuPSVkKVxuIixwRWlkLT5MZW4pKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBJRV9DRl9QQVJNOgorICAgICAgICAgICAgICAgIGlmKHBFaWQtPkxlbiA9PSA2KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcENmUGFybS0+YlZhbGlkID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcENmUGFybS0+Q2ZwQ291bnQgPSBwRWlkLT5PY3RldFswXTsKKyAgICAgICAgICAgICAgICAgICAgcENmUGFybS0+Q2ZwUGVyaW9kID0gcEVpZC0+T2N0ZXRbMV07CisgICAgICAgICAgICAgICAgICAgIHBDZlBhcm0tPkNmcE1heER1cmF0aW9uID0gcEVpZC0+T2N0ZXRbMl0gKyAyNTYgKiBwRWlkLT5PY3RldFszXTsKKyAgICAgICAgICAgICAgICAgICAgcENmUGFybS0+Q2ZwRHVyUmVtYWluaW5nID0gcEVpZC0+T2N0ZXRbNF0gKyAyNTYgKiBwRWlkLT5PY3RldFs1XTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gd3JvbmcgSUVfQ0ZfUEFSTVxuIikpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIElFX0lCU1NfUEFSTToKKyAgICAgICAgICAgICAgICBpZihwRWlkLT5MZW4gPT0gMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBdGltV2luLCBwRWlkLT5PY3RldCwgcEVpZC0+TGVuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gd3JvbmcgSUVfSUJTU19QQVJNXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyAgICAgICAgICAgIGNhc2UgSUVfVElNOgorICAgICAgICAgICAgICAgIGlmKElORlJBX09OKHBBZCkgJiYgU3ViVHlwZSA9PSBTVUJUWVBFX0JFQUNPTikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEdldFRpbUJpdCgoUFVDSEFSKXBFaWQsIHBBZC0+U3RhQWN0aXZlLkFpZCwgJlRpbUxlbiwgcEJjYXN0RmxhZywgcER0aW1Db3VudCwgcER0aW1QZXJpb2QsIHBNZXNzYWdlVG9NZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworICAgICAgICAgICAgY2FzZSBJRV9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlQ6CisgICAgICAgICAgICAgICAgaWYocEVpZC0+TGVuID09IDMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIAkqcE5ld0NoYW5uZWwgPSBwRWlkLT5PY3RldFsxXTsJLy9leHRyYWN0IG5ldyBjaGFubmVsIG51bWJlcgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLy8gTmV3IGZvciBXUEEKKyAgICAgICAgICAgIC8vIENDWCB2MiBoYXMgdGhlIHNhbWUgSUUsIHdlIG5lZWQgdG8gcGFyc2UgdGhhdCB0b28KKyAgICAgICAgICAgIC8vIFdpZmkgV01NIHVzZSB0aGUgc2FtZSBJRSB2YWxlLCBuZWVkIHRvIHBhcnNlIHRoYXQgdG9vCisgICAgICAgICAgICAvLyBjYXNlIElFX1dQQToKKyAgICAgICAgICAgIGNhc2UgSUVfVkVORE9SX1NQRUNJRklDOgorICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoZSBPVUkgdmVyc2lvbiwgZmlsdGVyIG91dCBub24tc3RhbmRhcmQgdXNhZ2UKKyAgICAgICAgICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBSQUxJTktfT1VJLCAzKSAmJiAocEVpZC0+TGVuID09IDcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8qcFJhbGlua0llID0gcEVpZC0+T2N0ZXRbM107CisgICAgICAgICAgICAgICAgICAgIGlmIChwRWlkLT5PY3RldFszXSAhPSAwKQorICAgICAgICAJCQkJKnBSYWxpbmtJZSA9IHBFaWQtPk9jdGV0WzNdOworICAgICAgICAJCQllbHNlCisgICAgICAgIAkJCQkqcFJhbGlua0llID0gMHhmMDAwMDAwMDsgLy8gU2V0IHRvIG5vbi16ZXJvIHZhbHVlIChjYW4ndCBzZXQgYml0MC0yKSB0byByZXByZXNlbnQgdGhpcyBpcyBSYWxpbmsgQ2hpcC4gU28gYXQgbGlua3VwLCB3ZSB3aWxsIHNldCByYWxpbmtjaGlwIGZsYWcuCisgICAgICAgICAgICAgICAgfQorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkvLyBUaGlzIEhUIElFIGlzIGJlZm9yZSBJRUVFIGRyYWZ0IHNldCBIVCBJRSB2YWx1ZS4yMDA2LTA5LTI4IGJ5IEphbi4KKworICAgICAgICAgICAgICAgIC8vIE90aGVyIHZlbmRvcnMgaGFkIHByb2R1Y3Rpb24gYmVmb3JlIElFX0hUX0NBUCB2YWx1ZSBpcyBhc3NpZ25lZC4gVG8gYmFja3dhcmQgc3VwcG9ydCB0aG9zZSBvbGQtZmlybXdhcmUgQVAsCisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgYnJvYWRjb20tZGVmaWVuZCBwcmUtODAyLjExbkQxLjAgT1VJIGZvciBIVCByZWxhdGVkIElFLCBpbmNsdWRpbmcgSFQgQ2FwYXRpbGl0aWVzIElFIGFuZCBIVCBJbmZvcm1hdGlvbiBJRQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCgqcEh0Q2FwYWJpbGl0eUxlbiA9PSAwKSAmJiBOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFBSRV9OX0hUX09VSSwgMykgJiYgKHBFaWQtPkxlbiA+PSA0KSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHBFaWQtPk9jdGV0WzNdID09IE9VSV9QUkVOX0hUX0NBUCkgJiYgKHBFaWQtPkxlbiA+PSAzMCkgJiYgKCpwSHRDYXBhYmlsaXR5TGVuID09IDApKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwSHRDYXBhYmlsaXR5LCAmcEVpZC0+T2N0ZXRbNF0sIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAqcFByZU5IdENhcGFiaWxpdHlMZW4gPSBTSVpFX0hUX0NBUF9JRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICgocEVpZC0+T2N0ZXRbM10gPT0gT1VJX1BSRU5fQUREX0hUKSAmJiAocEVpZC0+TGVuID49IDI2KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoQWRkSHRJbmZvLCAmcEVpZC0+T2N0ZXRbNF0sIHNpemVvZihBRERfSFRfSU5GT19JRSkpOworICAgICAgICAgICAgICAgICAgICAgICAgKkFkZEh0SW5mb0xlbiA9IFNJWkVfQUREX0hUX0lORk9fSUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXUEFfT1VJLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIENvcHkgdG8gcFZJRSB3aGljaCB3aWxsIHJlcG9ydCB0byBtaWNyb3NvZnQgYnNzaWQgbGlzdC4KKyAgICAgICAgICAgICAgICAgICAgUHRyID0gKFBVQ0hBUikgcFZJRTsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoUHRyICsgKkxlbmd0aFZJRSwgJnBFaWQtPkVpZCwgcEVpZC0+TGVuICsgMik7CisgICAgICAgICAgICAgICAgICAgICpMZW5ndGhWSUUgKz0gKHBFaWQtPkxlbiArIDIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdNRV9QQVJNX0VMRU0sIDYpICYmIChwRWlkLT5MZW4gPT0gMjQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUFVDSEFSIHB0cjsKKyAgICAgICAgICAgICAgICAgICAgaW50IGk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcGFyc2luZyBFRENBIHBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iVmFsaWQgICAgICAgICAgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJRQWNrICAgICAgICAgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4MTA7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlF1ZXVlUmVxdWVzdCAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHgyMDsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iVHhvcFJlcXVlc3QgICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDQwOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkVkY2FVcGRhdGVDb3VudCA9IHBFaWQtPk9jdGV0WzZdICYgMHgwZjsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQVBTRENhcGFibGUgICAgPSAocEVpZC0+T2N0ZXRbNl0gJiAweDgwKSA/IDEgOiAwOworICAgICAgICAgICAgICAgICAgICBwdHIgPSAmcEVpZC0+T2N0ZXRbOF07CisgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgYWNpID0gKCpwdHIgJiAweDYwKSA+PiA1OyAvLyBiNX42IGlzIEFDIElOREVYCisgICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBQ01bYWNpXSAgPSAoKCgqcHRyKSAmIDB4MTApID09IDB4MTApOyAgIC8vIGI1IGlzIEFDTQorICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5BaWZzblthY2ldID0gKCpwdHIpICYgMHgwZjsgICAgICAgICAgICAgICAvLyBiMH4zIGlzIEFJRlNOCisgICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWluW2FjaV0gPSAqKHB0cisxKSAmIDB4MGY7ICAgICAgICAgICAgIC8vIGIwfjQgaXMgQ3dtaW4KKyAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtYXhbYWNpXSA9ICoocHRyKzEpID4+IDQ7ICAgICAgICAgICAgICAgLy8gYjV+OCBpcyBDd21heAorICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5UeG9wW2FjaV0gID0gKihwdHIrMikgKyAyNTYgKiAoKihwdHIrMykpOyAvLyBpbiB1bml0IG9mIDMyLXVzCisgICAgICAgICAgICAgICAgICAgICAgICBwdHIgKz0gNDsgLy8gcG9pbnQgdG8gbmV4dCBBQworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV01FX0lORk9fRUxFTSwgNikgJiYgKHBFaWQtPkxlbiA9PSA3KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIHBhcnNpbmcgRURDQSBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlZhbGlkICAgICAgICAgID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iUUFjayAgICAgICAgICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDEwOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJRdWV1ZVJlcXVlc3QgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4MjA7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlR4b3BSZXF1ZXN0ICAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHg0MDsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5FZGNhVXBkYXRlQ291bnQgPSBwRWlkLT5PY3RldFs2XSAmIDB4MGY7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFQU0RDYXBhYmxlICAgID0gKHBFaWQtPk9jdGV0WzZdICYgMHg4MCkgPyAxIDogMDsKKworICAgICAgICAgICAgICAgICAgICAvLyB1c2UgZGVmYXVsdCBFRENBIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBQ01bUUlEX0FDX0JFXSAgPSAwOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CRV0gPSAzOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CRV0gPSBDV19NSU5fSU5fQklUUzsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfQkVdID0gQ1dfTUFYX0lOX0JJVFM7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQkVdICA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQUNNW1FJRF9BQ19CS10gID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQktdID0gNzsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfQktdID0gQ1dfTUlOX0lOX0JJVFM7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX0JLXSA9IENXX01BWF9JTl9CSVRTOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX0JLXSAgPSAwOworCisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFDTVtRSURfQUNfVkldICA9IDA7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXSA9IDI7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX1ZJXSA9IENXX01JTl9JTl9CSVRTLTE7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZJXSA9IENXX01BWF9JTl9CSVRTOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX1ZJXSAgPSA5NjsgICAvLyBBQ19WSTogOTYqMzJ1cyB+PSAzbXMKKworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBQ01bUUlEX0FDX1ZPXSAgPSAwOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WT10gPSAyOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19WT10gPSBDV19NSU5fSU5fQklUUy0yOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19WT10gPSBDV19NQVhfSU5fQklUUy0xOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX1ZPXSAgPSA0ODsgICAvLyBBQ19WTzogNDgqMzJ1cyB+PSAxLjVtcworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBJRV9FWFRfU1VQUF9SQVRFUzoKKyAgICAgICAgICAgICAgICBpZiAocEVpZC0+TGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoRXh0UmF0ZSwgcEVpZC0+T2N0ZXQsIHBFaWQtPkxlbik7CisgICAgICAgICAgICAgICAgICAgICpwRXh0UmF0ZUxlbiA9IHBFaWQtPkxlbjsKKworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiAyMDA0LTA5LTE0IG5vdCBhIGdvb2QgZGVzaWduIGhlcmUsIGNhdXNlIGl0IGV4Y2x1ZGUgZXh0cmEgcmF0ZXMKKyAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBTY2FuVGFiLiBXZSBzaG91bGQgcmVwb3J0IGFzIGlzLiBBbmQgZmlsdGVyIG91dCB1bnN1cHBvcnRlZAorICAgICAgICAgICAgICAgICAgICAvLyByYXRlcyBpbiBNbG1lQXV4LgorICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBhZ2FpbnN0IHRoZSBzdXBwb3J0ZWQgcmF0ZXMKKyAgICAgICAgICAgICAgICAgICAgLy8gUlRNUENoZWNrUmF0ZXMocEFkLCBFeHRSYXRlLCBwRXh0UmF0ZUxlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIElFX0VSUDoKKyAgICAgICAgICAgICAgICBpZiAocEVpZC0+TGVuID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqcEVycCA9IChVQ0hBUilwRWlkLT5PY3RldFswXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgSUVfQUlST05FVF9DS0lQOgorICAgICAgICAgICAgICAgIC8vIDAuIENoZWNrIEFpcm9uZXQgSUUgbGVuZ3RoLCBpdCBtdXN0IGJlIGxhcmdlciBvciBlcXVhbCB0byAyOAorICAgICAgICAgICAgICAgIC8vIENpc2NvIEFQMzUwIHVzZWQgbGVuZ3RoIGFzIDI4CisgICAgICAgICAgICAgICAgLy8gQ2lzY28gQVAxMlhYIHVzZWQgbGVuZ3RoIGFzIDMwCisgICAgICAgICAgICAgICAgaWYgKHBFaWQtPkxlbiA8IChDS0lQX05FR09USUFUSU9OX0xFTkdUSCAtIDIpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIC8vIDEuIENvcHkgQ0tJUCBmbGFnIGJ5dGUgdG8gYnVmZmVyIGZvciBwcm9jZXNzCisgICAgICAgICAgICAgICAgKnBDa2lwRmxhZyA9ICoocEVpZC0+T2N0ZXQgKyA4KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBJRV9BUF9UWF9QT1dFUjoKKyAgICAgICAgICAgICAgICAvLyBBUCBDb250cm9sIG9mIENsaWVudCBUcmFuc21pdCBQb3dlcgorICAgICAgICAgICAgICAgIC8vMC4gQ2hlY2sgQWlyb25ldCBJRSBsZW5ndGgsIGl0IG11c3QgYmUgNgorICAgICAgICAgICAgICAgIGlmIChwRWlkLT5MZW4gIT0gMHgwNikKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAvLyBHZXQgY2VsbCBwb3dlciBsaW1pdCBpbiBkQm0KKyAgICAgICAgICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBDSVNDT19PVUksIDMpID09IDEpCisgICAgICAgICAgICAgICAgICAgICpwQWlyb25ldENlbGxQb3dlckxpbWl0ID0gKihwRWlkLT5PY3RldCArIDQpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvLyBXUEEyICYgODAyLjExaSBSU04KKyAgICAgICAgICAgIGNhc2UgSUVfUlNOOgorICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIE9VSSBmb3IgdmVyc2lvbiBhbnltb3JlLCBjaGVjayB0aGUgZ3JvdXAgY2lwaGVyIE9VSSBiZWZvcmUgY29weWluZworICAgICAgICAgICAgICAgIGlmIChSVE1QRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQgKyAyLCBSU05fT1VJLCAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIENvcHkgdG8gcFZJRSB3aGljaCB3aWxsIHJlcG9ydCB0byBtaWNyb3NvZnQgYnNzaWQgbGlzdC4KKyAgICAgICAgICAgICAgICAgICAgUHRyID0gKFBVQ0hBUikgcFZJRTsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoUHRyICsgKkxlbmd0aFZJRSwgJnBFaWQtPkVpZCwgcEVpZC0+TGVuICsgMik7CisgICAgICAgICAgICAgICAgICAgICpMZW5ndGhWSUUgKz0gKHBFaWQtPkxlbiArIDIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJCQljYXNlIElFX0NPVU5UUlk6CisJCQkJUHRyID0gKFBVQ0hBUikgcFZJRTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShQdHIgKyAqTGVuZ3RoVklFLCAmcEVpZC0+RWlkLCBwRWlkLT5MZW4gKyAyKTsKKyAgICAgICAgICAgICAgICAqTGVuZ3RoVklFICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJCQlicmVhazsKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBMZW5ndGggPSBMZW5ndGggKyAyICsgcEVpZC0+TGVuOyAgLy8gRWlkWzFdICsgTGVuWzFdKyBjb250ZW50W0xlbl0KKyAgICAgICAgcEVpZCA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKilwRWlkICsgMiArIHBFaWQtPkxlbik7CisgICAgfQorCisgICAgLy8gRm9yIHNvbWUgMTFhIEFQLiBpdCBkaWQgbm90IGhhdmUgdGhlIGNoYW5uZWwgRUlELCBwYXRjaCBoZXJlCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCVVDSEFSIExhdGNoUmZDaGFubmVsID0gTXNnQ2hhbm5lbDsKKwkJaWYgKChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkgJiYgKChTYW5pdHkgJiAweDQpID09IDApKQorCQl7CisJCQlpZiAoQ3RybENoYW5uZWwgIT0gMCkKKwkJCQkqcENoYW5uZWwgPSBDdHJsQ2hhbm5lbDsKKwkJCWVsc2UKKwkJCQkqcENoYW5uZWwgPSBMYXRjaFJmQ2hhbm5lbDsKKwkJCVNhbml0eSB8PSAweDQ7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlpZiAoU2FuaXR5ICE9IDB4NykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gbWlzc2luZyBmaWVsZCwgU2FuaXR5PTB4JTAyeFxuIiwgU2FuaXR5KSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuIFRSVUU7CisJfQorCit9CisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCU1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sgZm9yIHNvbWUgSUUgYWRkcmVzc2VkICBpbiA4MDIuMTFuIGQzLjAzLgorCVJldHVybjoKKwkJVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIFBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eTIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVk9JRCAqTXNnLAorCUlOIFVMT05HIE1zZ0xlbiwKKwlPVVQgVUNIQVIgCSpSZWdDbGFzcykKK3sKKwlDSEFSCQkJCSpQdHI7CisJUEZSQU1FXzgwMl8xMQkJcEZyYW1lOworCVBFSURfU1RSVUNUCQkJcEVpZDsKKwlVTE9ORwkJCQlMZW5ndGggPSAwOworCisJcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpTXNnOworCisJKlJlZ0NsYXNzID0gMDsKKwlQdHIgPSBwRnJhbWUtPk9jdGV0OworCUxlbmd0aCArPSBMRU5HVEhfODAyXzExOworCisJLy8gZ2V0IHRpbWVzdGFtcCBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKwlQdHIgKz0gVElNRVNUQU1QX0xFTjsKKwlMZW5ndGggKz0gVElNRVNUQU1QX0xFTjsKKworCS8vIGdldCBiZWFjb24gaW50ZXJ2YWwgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisJUHRyICs9IDI7CisJTGVuZ3RoICs9IDI7CisKKwkvLyBnZXQgY2FwYWJpbGl0eSBpbmZvIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorCVB0ciArPSAyOworCUxlbmd0aCArPSAyOworCisJcEVpZCA9IChQRUlEX1NUUlVDVCkgUHRyOworCisJLy8gZ2V0IHZhcmlhYmxlIGZpZWxkcyBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKwl3aGlsZSAoKExlbmd0aCArIDIgKyBwRWlkLT5MZW4pIDw9IE1zZ0xlbikKKwl7CisJCXN3aXRjaChwRWlkLT5FaWQpCisJCXsKKwkJCWNhc2UgSUVfU1VQUF9SRUdfQ0xBU1M6CisJCQkJaWYocEVpZC0+TGVuID4gMCkKKwkJCQl7CisJCQkJCSpSZWdDbGFzcyA9ICpwRWlkLT5PY3RldDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gd3JvbmcgSUVfU1NJRCAobGVuPSVkKVxuIixwRWlkLT5MZW4pKTsKKwkJCQkJcmV0dXJuIEZBTFNFOworCQkJCX0KKwkJCQlicmVhazsKKwkJfQorCisJCUxlbmd0aCA9IExlbmd0aCArIDIgKyBwRWlkLT5MZW47ICAvLyBFaWRbMV0gKyBMZW5bMV0rIGNvbnRlbnRbTGVuXQorCQlwRWlkID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKXBFaWQgKyAyICsgcEVpZC0+TGVuKTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKKworfQorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBNbG1lU2NhblJlcVNhbml0eSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBWT0lEICpNc2csCisJSU4gVUxPTkcgTXNnTGVuLAorCU9VVCBVQ0hBUiAqcEJzc1R5cGUsCisJT1VUIENIQVIgU3NpZFtdLAorCU9VVCBVQ0hBUiAqcFNzaWRMZW4sCisJT1VUIFVDSEFSICpwU2NhblR5cGUpCit7CisJTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgKkluZm87CisKKwlJbmZvID0gKE1MTUVfU0NBTl9SRVFfU1RSVUNUICopKE1zZyk7CisJKnBCc3NUeXBlID0gSW5mby0+QnNzVHlwZTsKKwkqcFNzaWRMZW4gPSBJbmZvLT5Tc2lkTGVuOworCU5kaXNNb3ZlTWVtb3J5KFNzaWQsIEluZm8tPlNzaWQsICpwU3NpZExlbik7CisJKnBTY2FuVHlwZSA9IEluZm8tPlNjYW5UeXBlOworCisJaWYgKCgqcEJzc1R5cGUgPT0gQlNTX0lORlJBIHx8ICpwQnNzVHlwZSA9PSBCU1NfQURIT0MgfHwgKnBCc3NUeXBlID09IEJTU19BTlkpCisJCSYmICgqcFNjYW5UeXBlID09IFNDQU5fQUNUSVZFIHx8ICpwU2NhblR5cGUgPT0gU0NBTl9QQVNTSVZFCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCXx8ICpwU2NhblR5cGUgPT0gU0NBTl9DSVNDT19QQVNTSVZFIHx8ICpwU2NhblR5cGUgPT0gU0NBTl9DSVNDT19BQ1RJVkUKKwkJfHwgKnBTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX0NIQU5ORUxfTE9BRCB8fCAqcFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fTk9JU0UKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJKSkKKwl7CisJCXJldHVybiBUUlVFOworCX0KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lU2NhblJlcVNhbml0eSBmYWlsIC0gd3JvbmcgQnNzVHlwZSBvciBTY2FuVHlwZVxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorfQorCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1VDSEFSIENoYW5uZWxTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVUNIQVIgY2hhbm5lbCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwQWQtPkNoYW5uZWxMaXN0TnVtOyBpICsrKQorICAgIHsKKyAgICAgICAgaWYgKGNoYW5uZWwgPT0gcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBQZWVyRGVhdXRoU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQWRkcjIsCisgICAgT1VUIFVTSE9SVCAqcFJlYXNvbikKK3sKKyAgICBQRlJBTUVfODAyXzExIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKU1zZzsKKworICAgIENPUFlfTUFDX0FERFIocEFkZHIyLCBwRnJhbWUtPkhkci5BZGRyMik7CisgICAgTmRpc01vdmVNZW1vcnkocFJlYXNvbiwgJnBGcmFtZS0+T2N0ZXRbMF0sIDIpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjaworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIFBlZXJBdXRoU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQWRkciwKKyAgICBPVVQgVVNIT1JUICpwQWxnLAorICAgIE9VVCBVU0hPUlQgKnBTZXEsCisgICAgT1VUIFVTSE9SVCAqcFN0YXR1cywKKyAgICBDSEFSICpwQ2hsZ1RleHQpCit7CisgICAgUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlNc2c7CisKKyAgICBDT1BZX01BQ19BRERSKHBBZGRyLCAgIHBGcmFtZS0+SGRyLkFkZHIyKTsKKyAgICBOZGlzTW92ZU1lbW9yeShwQWxnLCAgICAmcEZyYW1lLT5PY3RldFswXSwgMik7CisgICAgTmRpc01vdmVNZW1vcnkocFNlcSwgICAgJnBGcmFtZS0+T2N0ZXRbMl0sIDIpOworICAgIE5kaXNNb3ZlTWVtb3J5KHBTdGF0dXMsICZwRnJhbWUtPk9jdGV0WzRdLCAyKTsKKworICAgIGlmICgoKnBBbGcgPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKyAgICAgIHx8ICgqcEFsZyA9PSBDSVNDT19BdXRoTW9kZUxFQVApCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisgICAgICApCisgICAgeworICAgICAgICBpZiAoKnBTZXEgPT0gMSB8fCAqcFNlcSA9PSAyKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJBdXRoU2FuaXR5IGZhaWwgLSB3cm9uZyBTZWcjXG4iKSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoKnBBbGcgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKQorICAgIHsKKyAgICAgICAgaWYgKCpwU2VxID09IDEgfHwgKnBTZXEgPT0gNCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKnBTZXEgPT0gMiB8fCAqcFNlcSA9PSAzKQorICAgICAgICB7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQ2hsZ1RleHQsICZwRnJhbWUtPk9jdGV0WzhdLCBDSVBIRVJfVEVYVF9MRU4pOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQXV0aFNhbml0eSBmYWlsIC0gd3JvbmcgU2VnI1xuIikpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJBdXRoU2FuaXR5IGZhaWwgLSB3cm9uZyBhbGdvcml0aG1cbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBNbG1lQXV0aFJlcVNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcEFkZHIsCisgICAgT1VUIFVMT05HICpwVGltZW91dCwKKyAgICBPVVQgVVNIT1JUICpwQWxnKQoreworICAgIE1MTUVfQVVUSF9SRVFfU1RSVUNUICpwSW5mbzsKKworICAgIHBJbmZvICA9IChNTE1FX0FVVEhfUkVRX1NUUlVDVCAqKU1zZzsKKyAgICBDT1BZX01BQ19BRERSKHBBZGRyLCBwSW5mby0+QWRkcik7CisgICAgKnBUaW1lb3V0ID0gcEluZm8tPlRpbWVvdXQ7CisgICAgKnBBbGcgPSBwSW5mby0+QWxnOworCisgICAgaWYgKCgoKnBBbGcgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKSB8fCgqcEFsZyA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQorI2lmZGVmIExFQVBfU1VQUE9SVAorICAgICB8fCAoKnBBbGcgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKQorI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworICAgICAJKSAmJgorICAgICAgICAoKCpwQWRkciAmIDB4MDEpID09IDApKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVBdXRoUmVxU2FuaXR5IGZhaWwgLSB3cm9uZyBhbGdvcml0aG1cbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gTWxtZUFzc29jUmVxU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQXBBZGRyLAorICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKKyAgICBPVVQgVUxPTkcgKnBUaW1lb3V0LAorICAgIE9VVCBVU0hPUlQgKnBMaXN0ZW5JbnR2KQoreworICAgIE1MTUVfQVNTT0NfUkVRX1NUUlVDVCAqcEluZm87CisKKyAgICBwSW5mbyA9IChNTE1FX0FTU09DX1JFUV9TVFJVQ1QgKilNc2c7CisgICAgKnBUaW1lb3V0ID0gcEluZm8tPlRpbWVvdXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aW1lb3V0CisgICAgQ09QWV9NQUNfQUREUihwQXBBZGRyLCBwSW5mby0+QWRkcik7ICAgICAgICAgICAgICAgICAgIC8vIEFQIGFkZHJlc3MKKyAgICAqcENhcGFiaWxpdHlJbmZvID0gcEluZm8tPkNhcGFiaWxpdHlJbmZvOyAgICAgICAgICAgICAgIC8vIGNhcGFiaWxpdHkgaW5mbworICAgICpwTGlzdGVuSW50diA9IHBJbmZvLT5MaXN0ZW5JbnR2OworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjaworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIFBlZXJEaXNhc3NvY1Nhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcEFkZHIyLAorICAgIE9VVCBVU0hPUlQgKnBSZWFzb24pCit7CisgICAgUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlNc2c7CisKKyAgICBDT1BZX01BQ19BRERSKHBBZGRyMiwgcEZyYW1lLT5IZHIuQWRkcjIpOworICAgIE5kaXNNb3ZlTWVtb3J5KHBSZWFzb24sICZwRnJhbWUtPk9jdGV0WzBdLCAyKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVNhbml0eSBjaGVjayBOZXR3b3JrVHlwZSAoMTFiLCAxMWcgb3IgMTFhKQorCisJQXJndW1lbnRzOgorCQlwQnNzIC0gUG9pbnRlciB0byBCU1MgdGFibGUuCisKKwlSZXR1cm4gVmFsdWU6CisgICAgICAgIE5kaXM4MDJfMTFEUyAuLi4uLi4uKDExYikKKyAgICAgICAgTmRpczgwMl8xMU9GRE0yNC4uLi4oMTFnKQorICAgICAgICBOZGlzODAyXzExT0ZETTUuLi4uLigxMWEpCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfODAyXzExX05FVFdPUktfVFlQRSBOZXR3b3JrVHlwZUluVXNlU2FuaXR5KAorICAgIElOIFBCU1NfRU5UUlkgcEJzcykKK3sKKwlORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUJTmV0V29ya1R5cGU7CisJVUNIQVIJCQkJCQlyYXRlLCBpOworCisJTmV0V29ya1R5cGUgPSBOZGlzODAyXzExRFM7CisKKwlpZiAocEJzcy0+Q2hhbm5lbCA8PSAxNCkKKwl7CisJCS8vCisJCS8vIEZpcnN0IGNoZWNrIHN1cHBvcnQgUmF0ZS4KKwkJLy8KKwkJZm9yIChpID0gMDsgaSA8IHBCc3MtPlN1cFJhdGVMZW47IGkrKykKKwkJeworCQkJcmF0ZSA9IHBCc3MtPlN1cFJhdGVbaV0gJiAweDdmOyAvLyBNYXNrIG91dCBiYXNpYyByYXRlIHNldCBiaXQKKwkJCWlmICgocmF0ZSA9PSAyKSB8fCAocmF0ZSA9PSA0KSB8fCAocmF0ZSA9PSAxMSkgfHwgKHJhdGUgPT0gMjIpKQorCQkJeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vCisJCQkJLy8gT3RoZXJ3aXNlIChldmVuIHJhdGUgPiAxMDgpIG1lYW5zIE5kaXM4MDJfMTFPRkRNMjQKKwkJCQkvLworCQkJCU5ldFdvcmtUeXBlID0gTmRpczgwMl8xMU9GRE0yNDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8vCisJCS8vIFNlY29uZCBjaGVjayBFeHRlbmQgUmF0ZS4KKwkJLy8KKwkJaWYgKE5ldFdvcmtUeXBlICE9IE5kaXM4MDJfMTFPRkRNMjQpCisJCXsKKwkJCWZvciAoaSA9IDA7IGkgPCBwQnNzLT5FeHRSYXRlTGVuOyBpKyspCisJCQl7CisJCQkJcmF0ZSA9IHBCc3MtPlN1cFJhdGVbaV0gJiAweDdmOyAvLyBNYXNrIG91dCBiYXNpYyByYXRlIHNldCBiaXQKKwkJCQlpZiAoKHJhdGUgPT0gMikgfHwgKHJhdGUgPT0gNCkgfHwgKHJhdGUgPT0gMTEpIHx8IChyYXRlID09IDIyKSkKKwkJCQl7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQkvLworCQkJCQkvLyBPdGhlcndpc2UgKGV2ZW4gcmF0ZSA+IDEwOCkgbWVhbnMgTmRpczgwMl8xMU9GRE0yNAorCQkJCQkvLworCQkJCQlOZXRXb3JrVHlwZSA9IE5kaXM4MDJfMTFPRkRNMjQ7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwllbHNlCisJeworCQlOZXRXb3JrVHlwZSA9IE5kaXM4MDJfMTFPRkRNNTsKKwl9CisKKyAgICBpZiAocEJzcy0+SHRDYXBhYmlsaXR5TGVuICE9IDApCisgICAgeworICAgICAgICBpZiAoTmV0V29ya1R5cGUgPT0gTmRpczgwMl8xMU9GRE01KQorICAgICAgICAgICAgTmV0V29ya1R5cGUgPSBOZGlzODAyXzExT0ZETTVfTjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgTmV0V29ya1R5cGUgPSBOZGlzODAyXzExT0ZETTI0X047CisgICAgfQorCisJcmV0dXJuIE5ldFdvcmtUeXBlOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFdQQSBtZXNzYWdlIHNhbml0eSBjaGVjaworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gUGVlcldwYU1lc3NhZ2VTYW5pdHkoCisgICAgSU4gCVBSVE1QX0FEQVBURVIgCQlwQWQsCisgICAgSU4gCVBFQVBPTF9QQUNLRVQgCQlwTXNnLAorICAgIElOIAlVTE9ORyAJCQkJTXNnTGVuLAorICAgIElOIAlVQ0hBUgkJCQlNc2dUeXBlLAorICAgIElOIAlNQUNfVEFCTEVfRU5UUlkgIAkqcEVudHJ5KQoreworCVVDSEFSCQkJbWljW0xFTl9LRVlfREVTQ19NSUNdLCBkaWdlc3RbODBdLCBLRVlEQVRBW01BWF9MRU5fT0ZfUlNOSUVdOworCUJPT0xFQU4JCQliUmVwbGF5RGlmZiA9IEZBTFNFOworCUJPT0xFQU4JCQliV1BBMiA9IEZBTFNFOworCUtFWV9JTkZPCQlFYXBvbEtleUluZm87CisJVUNIQVIJCQlHcm91cEtleUluZGV4ID0gMDsKKworCisJTmRpc1plcm9NZW1vcnkobWljLCBzaXplb2YobWljKSk7CisJTmRpc1plcm9NZW1vcnkoZGlnZXN0LCBzaXplb2YoZGlnZXN0KSk7CisJTmRpc1plcm9NZW1vcnkoS0VZREFUQSwgc2l6ZW9mKEtFWURBVEEpKTsKKwlOZGlzWmVyb01lbW9yeSgoUFVDSEFSKSZFYXBvbEtleUluZm8sIHNpemVvZihFYXBvbEtleUluZm8pKTsKKworCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpJkVhcG9sS2V5SW5mbywgKFBVQ0hBUikmcE1zZy0+S2V5RGVzYy5LZXlJbmZvLCBzaXplb2YoS0VZX0lORk8pKTsKKworCSooKFVTSE9SVCAqKSZFYXBvbEtleUluZm8pID0gY3B1MmxlMTYoKigoVVNIT1JUICopJkVhcG9sS2V5SW5mbykpOworCisJLy8gQ2hvb3NlIFdQQTIgb3Igbm90CisJaWYgKChwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8IChwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQorCQliV1BBMiA9IFRSVUU7CisKKwkvLyAwLiBDaGVjayBNc2dUeXBlCisJaWYgKChNc2dUeXBlID4gRUFQT0xfR1JPVVBfTVNHXzIpIHx8IChNc2dUeXBlIDwgRUFQT0xfUEFJUl9NU0dfMSkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJUaGUgbWVzc2FnZSB0eXBlIGlzIGludmFsaWQoJWQpISBcbiIsIE1zZ1R5cGUpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCS8vIDEuIFJlcGxheSBjb3VudGVyIGNoZWNrCisgCWlmIChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzEgfHwgTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zIHx8IE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpCS8vIEZvciBzdXBwbGljYW50CisgICAgeworICAgIAkvLyBGaXJzdCB2YWxpZGF0ZSByZXBsYXkgY291bnRlciwgb25seSBhY2NlcHQgbWVzc2FnZSB3aXRoIGxhcmdlciByZXBsYXkgY291bnRlci4KKwkJLy8gTGV0IGVxdWFsIHBhc3MsIHNvbWUgQVAgc3RhcnQgd2l0aCBhbGwgemVybyByZXBsYXkgY291bnRlcgorCQlVQ0hBUglaZXJvUmVwbGF5W0xFTl9LRVlfREVTQ19SRVBMQVldOworCisgICAgICAgIE5kaXNaZXJvTWVtb3J5KFplcm9SZXBsYXksIExFTl9LRVlfREVTQ19SRVBMQVkpOworCQlpZiAoKFJUTVBDb21wYXJlTWVtb3J5KHBNc2ctPktleURlc2MuUmVwbGF5Q291bnRlciwgcEVudHJ5LT5SX0NvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDEpICYmCisJCQkoUlRNUENvbXBhcmVNZW1vcnkocE1zZy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBaZXJvUmVwbGF5LCBMRU5fS0VZX0RFU0NfUkVQTEFZKSAhPSAwKSkKKyAgICAJeworCQkJYlJlcGxheURpZmYgPSBUUlVFOworICAgIAl9CisgCX0KKwllbHNlIGlmIChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzIgfHwgTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR180IHx8IE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzIpCS8vIEZvciBhdXRoZW50aWNhdG9yCisJeworCQkvLyBjaGVjayBSZXBsYXkgQ291bnRlciBjb3Jlc3BvbmRzIHRvIE1TRyBmcm9tIGF1dGhlbnRpY2F0b3IsIG90aGVyd2lzZSBkaXNjYXJkCisgICAgCWlmICghTmRpc0VxdWFsTWVtb3J5KHBNc2ctPktleURlc2MuUmVwbGF5Q291bnRlciwgcEVudHJ5LT5SX0NvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpKQorICAgIAl7CisJCQliUmVwbGF5RGlmZiA9IFRSVUU7CisgICAgCX0KKwl9CisKKwkvLyBSZXBsYXkgQ291bnRlciBkaWZmZXJlbnQgY29uZGl0aW9uCisJaWYgKGJSZXBsYXlEaWZmKQorCXsKKwkJLy8gc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciByZXBsYXkgY291bnRlciBkaWZmZXJlbnQKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfUkVQTEFZX0NPVU5URVJfRElGRl9FVkVOVF9GTEFHLCBwRW50cnktPkFkZHIsIHBFbnRyeS0+YXBpZHgsIDApOworCisJCWlmIChNc2dUeXBlIDwgRUFQT0xfR1JPVVBfTVNHXzEpCisJCXsKKyAgICAgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJlcGxheSBDb3VudGVyIERpZmZlcmVudCBpbiBwYWlyd2lzZSBtc2cgJWQgb2YgNC13YXkgaGFuZHNoYWtlIVxuIiwgTXNnVHlwZSkpOworCQl9CisJCWVsc2UKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUmVwbGF5IENvdW50ZXIgRGlmZmVyZW50IGluIGdyb3VwIG1zZyAlZCBvZiAyLXdheSBoYW5kc2hha2UhXG4iLCAoTXNnVHlwZSAtIEVBUE9MX1BBSVJfTVNHXzQpKSk7CisJCX0KKworCQloZXhfZHVtcCgiUmVjZWl2ZSByZXBsYXkgY291bnRlciAiLCBwTXNnLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCQloZXhfZHVtcCgiQ3VycmVudCByZXBsYXkgY291bnRlciAiLCBwRW50cnktPlJfQ291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKwl9CisKKwkvLyAyLiBWZXJpZnkgTUlDIGV4Y2VwdCBQYWlyd2lzZSBNc2cxCisJaWYgKE1zZ1R5cGUgIT0gRUFQT0xfUEFJUl9NU0dfMSkKKwl7CisJCVVDSEFSCQkJcmN2ZF9taWNbTEVOX0tFWV9ERVNDX01JQ107CisKKwkJLy8gUmVjb3JkIHRoZSByZWNlaXZlZCBNSUMgZm9yIGNoZWNrIGxhdGVyCisJCU5kaXNNb3ZlTWVtb3J5KHJjdmRfbWljLCBwTXNnLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisJCU5kaXNaZXJvTWVtb3J5KHBNc2ctPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKworICAgICAgICBpZiAocEVudHJ5LT5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkJLy8gVEtJUAorICAgICAgICB7CisgICAgICAgICAgICBobWFjX21kNShwRW50cnktPlBUSywgTEVOX0VBUF9NSUNLLCAoUFVDSEFSKXBNc2csIE1zZ0xlbiwgbWljKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQkvLyBBRVMKKyAgICAgICAgeworICAgICAgICAgICAgSE1BQ19TSEExKChQVUNIQVIpcE1zZywgTXNnTGVuLCBwRW50cnktPlBUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkobWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFOZGlzRXF1YWxNZW1vcnkocmN2ZF9taWMsIG1pYywgTEVOX0tFWV9ERVNDX01JQykpCisgICAgICAgIHsKKwkJCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3IgTUlDIGRpZmZlcmVudAorCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX01JQ19ESUZGX0VWRU5UX0ZMQUcsIHBFbnRyeS0+QWRkciwgcEVudHJ5LT5hcGlkeCwgMCk7CisKKwkJCWlmIChNc2dUeXBlIDwgRUFQT0xfR1JPVVBfTVNHXzEpCisJCQl7CisgICAgICAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTUlDIERpZmZlcmVudCBpbiBwYWlyd2lzZSBtc2cgJWQgb2YgNC13YXkgaGFuZHNoYWtlIVxuIiwgTXNnVHlwZSkpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIk1JQyBEaWZmZXJlbnQgaW4gZ3JvdXAgbXNnICVkIG9mIDItd2F5IGhhbmRzaGFrZSFcbiIsIChNc2dUeXBlIC0gRUFQT0xfUEFJUl9NU0dfNCkpKTsKKwkJCX0KKworCQkJaGV4X2R1bXAoIlJlY2VpdmVkIE1JQyIsIHJjdmRfbWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKwkJCWhleF9kdW1wKCJEZXNpcmVkICBNSUMiLCBtaWMsIExFTl9LRVlfREVTQ19NSUMpOworCisJCQlyZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKwl9CisKKwkvLyBFeHRyYWN0IHRoZSBjb250ZXh0IG9mIHRoZSBLZXkgRGF0YSBmaWVsZCBpZiBpdCBleGlzdAorCS8vIFRoZSBmaWVsZCBpbiBwYWlyd2lzZV9tc2dfMl9XUEExKFdQQTIpICYgcGFpcndpc2VfbXNnXzNfV1BBMSBpcyB1bi1lbmNyeXB0ZWQuCisJLy8gVGhlIGZpZWxkIGluIGdyb3VwX21zZ18xX1dQQTEoV1BBMikgJiBwYWlyd2lzZV9tc2dfM19XUEEyIGlzIGVuY3J5cHRlZC4KKwlpZiAocE1zZy0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdID4gMCkKKwl7CisJCS8vIERlY3J5cHQgdGhpcyBmaWVsZAorCQlpZiAoKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMyAmJiBiV1BBMikgfHwgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKQorCQl7CisJCQlpZihwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCQkJeworCQkJCS8vIEFFUworCQkJCUFFU19HVEtfS0VZX1VOV1JBUCgmcEVudHJ5LT5QVEtbMTZdLCBLRVlEQVRBLCBwTXNnLT5LZXlEZXNjLktleURhdGFMZW5bMV0scE1zZy0+S2V5RGVzYy5LZXlEYXRhKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlJTlQgCWk7CisJCQkJVUNIQVIgICBLZXlbMzJdOworCQkJCS8vIERlY3J5cHQgVEtJUCBHVEsKKwkJCQkvLyBDb25zdHJ1Y3QgMzIgYnl0ZXMgUkM0IEtleQorCQkJCU5kaXNNb3ZlTWVtb3J5KEtleSwgcE1zZy0+S2V5RGVzYy5LZXlJdiwgMTYpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZLZXlbMTZdLCAmcEVudHJ5LT5QVEtbMTZdLCAxNik7CisJCQkJQVJDRk9VUl9JTklUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIEtleSwgMzIpOworCQkJCS8vZGlzY2FyZCBmaXJzdCAyNTYgYnl0ZXMKKwkJCQlmb3IoaSA9IDA7IGkgPCAyNTY7IGkrKykKKwkJCQkJQVJDRk9VUl9CWVRFKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQpOworCQkJCS8vIERlY3J5cHQgR1RLLiBCZWNhcmVmdWwsIHRoZXJlIGlzIG5vIElDViB0byBjaGVjayB0aGUgcmVzdWx0IGlzIGNvcnJlY3Qgb3Igbm90CisJCQkJQVJDRk9VUl9ERUNSWVBUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIEtFWURBVEEsIHBNc2ctPktleURlc2MuS2V5RGF0YSwgcE1zZy0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdKTsKKwkJCX0KKworCQkJaWYgKCFiV1BBMiAmJiAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpCisJCQkJR3JvdXBLZXlJbmRleCA9IEVhcG9sS2V5SW5mby5LZXlJbmRleDsKKworCQl9CisJCWVsc2UgaWYgKChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzIpIHx8IChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMgJiYgIWJXUEEyKSkKKwkJeworCQkJTmRpc01vdmVNZW1vcnkoS0VZREFUQSwgcE1zZy0+S2V5RGVzYy5LZXlEYXRhLCBwTXNnLT5LZXlEZXNjLktleURhdGFMZW5bMV0pOworCQl9CisJCWVsc2UKKwkJeworCisJCQlyZXR1cm4gVFJVRTsKKwkJfQorCisJCS8vIFBhcnNlIEtleSBEYXRhIGZpZWxkIHRvCisJCS8vIDEuIHZlcmlmeSBSU04gSUUgZm9yIHBhaXJ3aXNlX21zZ18yX1dQQTEoV1BBMikgLHBhaXJ3aXNlX21zZ18zX1dQQTEoV1BBMikKKwkJLy8gMi4gdmVyaWZ5IEtERSBmb3JtYXQgZm9yIHBhaXJ3aXNlX21zZ18zX1dQQTIsIGdyb3VwX21zZ18xX1dQQTIKKwkJLy8gMy4gdXBkYXRlIHNoYXJlZCBrZXkgZm9yIHBhaXJ3aXNlX21zZ18zX1dQQTIsIGdyb3VwX21zZ18xX1dQQTEoV1BBMikKKwkJaWYgKCFSVE1QUGFyc2VFYXBvbEtleURhdGEocEFkLCBLRVlEQVRBLCBwTXNnLT5LZXlEZXNjLktleURhdGFMZW5bMV0sIEdyb3VwS2V5SW5kZXgsIE1zZ1R5cGUsIGJXUEEyLCBwRW50cnkpKQorCQl7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwl9CisKKwlyZXR1cm4gVFJVRTsKKworfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCitCT09MRUFOIE1sbWVEbHNSZXFTYW5pdHkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFJUXzgwMl8xMV9ETFMgKnBETFMsCisgICAgT1VUIFBVU0hPUlQgcFJlYXNvbikKK3sKKwlNTE1FX0RMU19SRVFfU1RSVUNUICpwSW5mbzsKKworICAgIHBJbmZvID0gKE1MTUVfRExTX1JFUV9TVFJVQ1QgKilNc2c7CisKKwkqcERMUyA9IHBJbmZvLT5wRExTOworCSpwUmVhc29uID0gcEluZm8tPlJlYXNvbjsKKworCXJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCitCT09MRUFOIFBlZXJEbHNSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBEQSwKKyAgICBPVVQgUFVDSEFSIHBTQSwKKyAgICBPVVQgVVNIT1JUICpwQ2FwYWJpbGl0eUluZm8sCisgICAgT1VUIFVTSE9SVCAqcERsc1RpbWVvdXQsCisgICAgT1VUIFVDSEFSICpwUmF0ZXNMZW4sCisgICAgT1VUIFVDSEFSIFJhdGVzW10sCisJT1VUIFVDSEFSICpwSHRDYXBhYmlsaXR5TGVuLAorICAgIE9VVCBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5KQoreworCUNIQVIgICAgICAgICAgICAqUHRyOworICAgIFBGUkFNRV84MDJfMTEJRnIgPSAoUEZSQU1FXzgwMl8xMSlNc2c7CisJUEVJRF9TVFJVQ1QgIGVpZF9wdHI7CisKKyAgICAvLyB0byBwcmV2ZW50IGNhbGxlciBmcm9tIHVzaW5nIGdhcmJhZ2Ugb3V0cHV0IHZhbHVlCisgICAgKnBDYXBhYmlsaXR5SW5mbwk9IDA7CisgICAgKnBEbHNUaW1lb3V0CT0gMDsKKwkqcEh0Q2FwYWJpbGl0eUxlbiA9IDA7CisKKyAgICBQdHIgPSBGci0+T2N0ZXQ7CisKKwkvLyBvZmZzZXQgdG8gZGVzdGluYXRpb24gTUFDIGFkZHJlc3MgKENhdGVnb3J5IGFuZCBBY3Rpb24gZmllbGQpCisgICAgUHRyICs9IDI7CisKKyAgICAvLyBnZXQgREEgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisgICAgTmRpc01vdmVNZW1vcnkocERBLCBQdHIsIE1BQ19BRERSX0xFTik7CisgICAgUHRyICs9IE1BQ19BRERSX0xFTjsKKworICAgIC8vIGdldCBTQSBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICBOZGlzTW92ZU1lbW9yeShwU0EsIFB0ciwgTUFDX0FERFJfTEVOKTsKKyAgICBQdHIgKz0gTUFDX0FERFJfTEVOOworCisgICAgLy8gZ2V0IGNhcGFiaWxpdHkgaW5mbyBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICBOZGlzTW92ZU1lbW9yeShwQ2FwYWJpbGl0eUluZm8sIFB0ciwgMik7CisgICAgUHRyICs9IDI7CisKKyAgICAvLyBnZXQgY2FwYWJpbGl0eSBpbmZvIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBEbHNUaW1lb3V0LCBQdHIsIDIpOworICAgIFB0ciArPSAyOworCisJLy8gQ2F0ZWdvcnkgYW5kIEFjdGlvbiBmaWVsZCArIERBICsgU0EgKyBjYXBhYmlsaXR5ICsgVGltZW91dAorCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpICZGci0+T2N0ZXRbMThdOworCisJd2hpbGUgKCgoVUNIQVIqKWVpZF9wdHIgKyBlaWRfcHRyLT5MZW4gKyAxKSA8ICgoVUNIQVIqKUZyICsgTXNnTGVuKSkKKwl7CisJCXN3aXRjaChlaWRfcHRyLT5FaWQpCisJCXsKKwkJCWNhc2UgSUVfU1VQUF9SQVRFUzoKKyAgICAgICAgICAgICAgICBpZiAoKGVpZF9wdHItPkxlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykgJiYgKGVpZF9wdHItPkxlbiA+IDApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoUmF0ZXMsIGVpZF9wdHItPk9jdGV0LCBlaWRfcHRyLT5MZW4pOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyRGxzUmVxU2FuaXR5IC0gSUVfU1VQUF9SQVRFUy4sIExlbj0lZC4gUmF0ZXNbMF09JXhcbiIsZWlkX3B0ci0+TGVuLCBSYXRlc1swXSkpOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYXRlc1sxXT0leCAleCAleCAleCAleCAleCAleFxuIiwgUmF0ZXNbMV0sIFJhdGVzWzJdLCBSYXRlc1szXSwgUmF0ZXNbNF0sIFJhdGVzWzVdLCBSYXRlc1s2XSwgUmF0ZXNbN10pKTsKKyAgICAgICAgICAgICAgICAgICAgKnBSYXRlc0xlbiA9IGVpZF9wdHItPkxlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKnBSYXRlc0xlbiA9IDg7CisJCQkJCVJhdGVzWzBdID0gMHg4MjsKKwkJCQkJUmF0ZXNbMV0gPSAweDg0OworCQkJCQlSYXRlc1syXSA9IDB4OGI7CisJCQkJCVJhdGVzWzNdID0gMHg5NjsKKwkJCQkJUmF0ZXNbNF0gPSAweDEyOworCQkJCQlSYXRlc1s1XSA9IDB4MjQ7CisJCQkJCVJhdGVzWzZdID0gMHg0ODsKKwkJCQkJUmF0ZXNbN10gPSAweDZjOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyRGxzUmVxU2FuaXR5IC0gd3JvbmcgSUVfU1VQUF9SQVRFUy4sIExlbj0lZFxuIixlaWRfcHRyLT5MZW4pKTsKKyAgICAgICAgICAgICAgICB9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSUVfRVhUX1NVUFBfUkFURVM6CisgICAgICAgICAgICAgICAgaWYgKGVpZF9wdHItPkxlbiArICpwUmF0ZXNMZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeSgmUmF0ZXNbKnBSYXRlc0xlbl0sIGVpZF9wdHItPk9jdGV0LCBlaWRfcHRyLT5MZW4pOworICAgICAgICAgICAgICAgICAgICAqcFJhdGVzTGVuID0gKCpwUmF0ZXNMZW4pICsgZWlkX3B0ci0+TGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeSgmUmF0ZXNbKnBSYXRlc0xlbl0sIGVpZF9wdHItPk9jdGV0LCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyAtICgqcFJhdGVzTGVuKSk7CisgICAgICAgICAgICAgICAgICAgICpwUmF0ZXNMZW4gPSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsKKyAgICAgICAgICAgICAgICB9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSUVfSFRfQ0FQOgorCQkJCWlmIChlaWRfcHRyLT5MZW4gPj0gc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKQorCQkJCXsKKwkJCQkJTmRpc01vdmVNZW1vcnkocEh0Q2FwYWJpbGl0eSwgZWlkX3B0ci0+T2N0ZXQsIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSk7CisKKwkJCQkJKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSk7CisJCQkJCSooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mbykpOworCQkJCQkqcEh0Q2FwYWJpbGl0eUxlbiA9IHNpemVvZihIVF9DQVBBQklMSVRZX0lFKTsKKworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyRGxzUmVxU2FuaXR5IC0gSUVfSFRfQ0FQXG4iKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJEbHNSZXFTYW5pdHkgLSB3cm9uZyBJRV9IVF9DQVAuZWlkX3B0ci0+TGVuID0gJWRcbiIsIGVpZF9wdHItPkxlbikpOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJfQorCisJCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopZWlkX3B0ciArIDIgKyBlaWRfcHRyLT5MZW4pOworCX0KKworICAgIHJldHVybiBUUlVFOworfQorCitCT09MRUFOIFBlZXJEbHNSc3BTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBEQSwKKyAgICBPVVQgUFVDSEFSIHBTQSwKKyAgICBPVVQgVVNIT1JUICpwQ2FwYWJpbGl0eUluZm8sCisgICAgT1VUIFVTSE9SVCAqcFN0YXR1cywKKyAgICBPVVQgVUNIQVIgKnBSYXRlc0xlbiwKKyAgICBPVVQgVUNIQVIgUmF0ZXNbXSwKKyAgICBPVVQgVUNIQVIgKnBIdENhcGFiaWxpdHlMZW4sCisgICAgT1VUIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHkpCit7CisgICAgQ0hBUiAgICAgICAgICAgICpQdHI7CisgICAgUEZSQU1FXzgwMl8xMQlGciA9IChQRlJBTUVfODAyXzExKU1zZzsKKwlQRUlEX1NUUlVDVCAgZWlkX3B0cjsKKworICAgIC8vIHRvIHByZXZlbnQgY2FsbGVyIGZyb20gdXNpbmcgZ2FyYmFnZSBvdXRwdXQgdmFsdWUKKyAgICAqcFN0YXR1cwkJPSAwOworICAgICpwQ2FwYWJpbGl0eUluZm8JPSAwOworCSpwSHRDYXBhYmlsaXR5TGVuID0gMDsKKworICAgIFB0ciA9IEZyLT5PY3RldDsKKworCS8vIG9mZnNldCB0byBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcyAoQ2F0ZWdvcnkgYW5kIEFjdGlvbiBmaWVsZCkKKyAgICBQdHIgKz0gMjsKKworCS8vIGdldCBzdGF0dXMgY29kZSBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICBOZGlzTW92ZU1lbW9yeShwU3RhdHVzLCBQdHIsIDIpOworICAgIFB0ciArPSAyOworCisgICAgLy8gZ2V0IERBIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBEQSwgUHRyLCBNQUNfQUREUl9MRU4pOworICAgIFB0ciArPSBNQUNfQUREUl9MRU47CisKKyAgICAvLyBnZXQgU0EgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisgICAgTmRpc01vdmVNZW1vcnkocFNBLCBQdHIsIE1BQ19BRERSX0xFTik7CisgICAgUHRyICs9IE1BQ19BRERSX0xFTjsKKworCWlmIChwU3RhdHVzID09IDApCisJeworCSAgICAvLyBnZXQgY2FwYWJpbGl0eSBpbmZvIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorCSAgICBOZGlzTW92ZU1lbW9yeShwQ2FwYWJpbGl0eUluZm8sIFB0ciwgMik7CisJICAgIFB0ciArPSAyOworCX0KKworCS8vIENhdGVnb3J5IGFuZCBBY3Rpb24gZmllbGQgKyBzdGF0dXMgY29kZSArIERBICsgU0EgKyBjYXBhYmlsaXR5CisJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkgJkZyLT5PY3RldFsxOF07CisKKwl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChVQ0hBUiopRnIgKyBNc2dMZW4pKQorCXsKKwkJc3dpdGNoKGVpZF9wdHItPkVpZCkKKwkJeworCQkJY2FzZSBJRV9TVVBQX1JBVEVTOgorICAgICAgICAgICAgICAgIGlmICgoZWlkX3B0ci0+TGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKSAmJiAoZWlkX3B0ci0+TGVuID4gMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShSYXRlcywgZWlkX3B0ci0+T2N0ZXQsIGVpZF9wdHItPkxlbik7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJEbHNSc3BTYW5pdHkgLSBJRV9TVVBQX1JBVEVTLiwgTGVuPSVkLiBSYXRlc1swXT0leFxuIixlaWRfcHRyLT5MZW4sIFJhdGVzWzBdKSk7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhdGVzWzFdPSV4ICV4ICV4ICV4ICV4ICV4ICV4XG4iLCBSYXRlc1sxXSwgUmF0ZXNbMl0sIFJhdGVzWzNdLCBSYXRlc1s0XSwgUmF0ZXNbNV0sIFJhdGVzWzZdLCBSYXRlc1s3XSkpOworICAgICAgICAgICAgICAgICAgICAqcFJhdGVzTGVuID0gZWlkX3B0ci0+TGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqcFJhdGVzTGVuID0gODsKKwkJCQkJUmF0ZXNbMF0gPSAweDgyOworCQkJCQlSYXRlc1sxXSA9IDB4ODQ7CisJCQkJCVJhdGVzWzJdID0gMHg4YjsKKwkJCQkJUmF0ZXNbM10gPSAweDk2OworCQkJCQlSYXRlc1s0XSA9IDB4MTI7CisJCQkJCVJhdGVzWzVdID0gMHgyNDsKKwkJCQkJUmF0ZXNbNl0gPSAweDQ4OworCQkJCQlSYXRlc1s3XSA9IDB4NmM7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJEbHNSc3BTYW5pdHkgLSB3cm9uZyBJRV9TVVBQX1JBVEVTLiwgTGVuPSVkXG4iLGVpZF9wdHItPkxlbikpOworICAgICAgICAgICAgICAgIH0KKwkJCQlicmVhazsKKworCQkJY2FzZSBJRV9FWFRfU1VQUF9SQVRFUzoKKyAgICAgICAgICAgICAgICBpZiAoZWlkX3B0ci0+TGVuICsgKnBSYXRlc0xlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZSYXRlc1sqcFJhdGVzTGVuXSwgZWlkX3B0ci0+T2N0ZXQsIGVpZF9wdHItPkxlbik7CisgICAgICAgICAgICAgICAgICAgICpwUmF0ZXNMZW4gPSAoKnBSYXRlc0xlbikgKyBlaWRfcHRyLT5MZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZSYXRlc1sqcFJhdGVzTGVuXSwgZWlkX3B0ci0+T2N0ZXQsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTIC0gKCpwUmF0ZXNMZW4pKTsKKyAgICAgICAgICAgICAgICAgICAgKnBSYXRlc0xlbiA9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOworICAgICAgICAgICAgICAgIH0KKwkJCQlicmVhazsKKworCQkJY2FzZSBJRV9IVF9DQVA6CisJCQkJaWYgKGVpZF9wdHItPkxlbiA+PSBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpCisJCQkJeworCQkJCQlOZGlzTW92ZU1lbW9yeShwSHRDYXBhYmlsaXR5LCBlaWRfcHRyLT5PY3RldCwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKKworCQkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pKTsKKwkJCQkJKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSk7CisJCQkJCSpwSHRDYXBhYmlsaXR5TGVuID0gc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpOworCisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJEbHNSc3BTYW5pdHkgLSBJRV9IVF9DQVBcbiIpKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckRsc1JzcFNhbml0eSAtIHdyb25nIElFX0hUX0NBUC5laWRfcHRyLT5MZW4gPSAlZFxuIiwgZWlkX3B0ci0+TGVuKSk7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisKKwkJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKillaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7CisJfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK0JPT0xFQU4gUGVlckRsc1RlYXJEb3duU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwREEsCisgICAgT1VUIFBVQ0hBUiBwU0EsCisgICAgT1VUIFVTSE9SVCAqcFJlYXNvbikKK3sKKyAgICBDSEFSICAgICAgICAgICAgKlB0cjsKKyAgICBQRlJBTUVfODAyXzExCUZyID0gKFBGUkFNRV84MDJfMTEpTXNnOworCisgICAgLy8gdG8gcHJldmVudCBjYWxsZXIgZnJvbSB1c2luZyBnYXJiYWdlIG91dHB1dCB2YWx1ZQorICAgICpwUmVhc29uCT0gMDsKKworICAgIFB0ciA9IEZyLT5PY3RldDsKKworCS8vIG9mZnNldCB0byBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcyAoQ2F0ZWdvcnkgYW5kIEFjdGlvbiBmaWVsZCkKKyAgICBQdHIgKz0gMjsKKworICAgIC8vIGdldCBEQSBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICBOZGlzTW92ZU1lbW9yeShwREEsIFB0ciwgTUFDX0FERFJfTEVOKTsKKyAgICBQdHIgKz0gTUFDX0FERFJfTEVOOworCisgICAgLy8gZ2V0IFNBIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBTQSwgUHRyLCBNQUNfQUREUl9MRU4pOworICAgIFB0ciArPSBNQUNfQUREUl9MRU47CisKKwkvLyBnZXQgcmVhc29uIGNvZGUgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisgICAgTmRpc01vdmVNZW1vcnkocFJlYXNvbiwgUHRyLCAyKTsKKyAgICBQdHIgKz0gMjsKKworICAgIHJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fc3luYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3N5bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGU0MTA5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3N5bmMuYwpAQCAtMCwwICsxLDcwMiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlzeW5jLmMKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlKb2huIENoYW5nCTIwMDQtMDktMDEgICAgICBtb2RpZmllZCBmb3IgcnQyNTYxLzI2NjEKKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKy8vIDIuNCBHaHogY2hhbm5lbCBwbGFuIGluZGV4IGluIHRoZSBUeFBvd2VyIGFycmF5cy4KKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fMF9TVEFSVAkwCQkJLy8gMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fMF9TSVpFCTExCisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzFfU1RBUlQJMAkJCS8vIDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzCisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzFfU0laRQkxMworI2RlZmluZQlCR19CQU5EX1JFR0lPTl8yX1NUQVJUCTkJCQkvLyAxMCwxMQorI2RlZmluZQlCR19CQU5EX1JFR0lPTl8yX1NJWkUJMgorI2RlZmluZQlCR19CQU5EX1JFR0lPTl8zX1NUQVJUCTkJCQkvLyAxMCwxMSwxMiwxMworI2RlZmluZQlCR19CQU5EX1JFR0lPTl8zX1NJWkUJNAorI2RlZmluZQlCR19CQU5EX1JFR0lPTl80X1NUQVJUCTEzCQkJLy8gMTQKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fNF9TSVpFCTEKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fNV9TVEFSVAkwCQkJLy8gMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fNV9TSVpFCTE0CisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzZfU1RBUlQJMgkJCS8vIDMsNCw1LDYsNyw4LDkKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fNl9TSVpFCTcKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fN19TVEFSVAk0CQkJLy8gNSw2LDcsOCw5LDEwLDExLDEyLDEzCisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzdfU0laRQk5CisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzMxX1NUQVJUCTAJCQkvLyAxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNAorI2RlZmluZQlCR19CQU5EX1JFR0lPTl8zMV9TSVpFCTE0CisKKy8vIDUgR2h6IGNoYW5uZWwgcGxhbiBpbmRleCBpbiB0aGUgVHhQb3dlciBhcnJheXMuCitVQ0hBUiBBX0JBTkRfUkVHSU9OXzBfQ0hBTk5FTF9MSVNUW109ezM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjV9OworVUNIQVIgQV9CQU5EX1JFR0lPTl8xX0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwfTsKK1VDSEFSIEFfQkFORF9SRUdJT05fMl9DSEFOTkVMX0xJU1RbXT17MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0fTsKK1VDSEFSIEFfQkFORF9SRUdJT05fM19DSEFOTkVMX0xJU1RbXT17NTIsIDU2LCA2MCwgNjQsIDE0OSwgMTUzLCAxNTcsIDE2MX07CitVQ0hBUiBBX0JBTkRfUkVHSU9OXzRfQ0hBTk5FTF9MSVNUW109ezE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1fTsKK1VDSEFSIEFfQkFORF9SRUdJT05fNV9DSEFOTkVMX0xJU1RbXT17MTQ5LCAxNTMsIDE1NywgMTYxfTsKK1VDSEFSIEFfQkFORF9SRUdJT05fNl9DSEFOTkVMX0xJU1RbXT17MzYsIDQwLCA0NCwgNDh9OworVUNIQVIgQV9CQU5EX1JFR0lPTl83X0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwLCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NX07CitVQ0hBUiBBX0JBTkRfUkVHSU9OXzhfQ0hBTk5FTF9MSVNUW109ezUyLCA1NiwgNjAsIDY0fTsKK1VDSEFSIEFfQkFORF9SRUdJT05fOV9DSEFOTkVMX0xJU1RbXT17MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTMyLCAxMzYsIDE0MCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjV9OworVUNIQVIgQV9CQU5EX1JFR0lPTl8xMF9DSEFOTkVMX0xJU1RbXT17MzYsIDQwLCA0NCwgNDgsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1fTsKK1VDSEFSIEFfQkFORF9SRUdJT05fMTFfQ0hBTk5FTF9MSVNUW109ezM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTQ5LCAxNTMsIDE1NywgMTYxfTsKKworLy9CYVNpemVBcnJheSBmb2xsb3dzIHRoZSA4MDIuMTFuIGRlZmluaXRpb24gYXMgTWF4UnhGYWN0b3IuICAyXigxMytmYWN0b3IpIGJ5dGVzLiBXaGVuIGZhY3RvciA9MCwgaXQncyBhYm91dCBCYSBidWZmZXIgc2l6ZSA9OC4KK1VDSEFSIEJhU2l6ZUFycmF5WzRdID0gezgsMTYsMzIsNjR9OworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVVwZGF0ZSBTdGFDZmctPkNoYW5uZWxMaXN0W10gYWNjb3JkaW5nIHRvIDEpIENvdW50cnkgUmVnaW9uIDIpIFJGIElDIHR5cGUsCisJCWFuZCAzKSBQSFktbW9kZSB1c2VyIHNlbGVjdGVkLgorCQlUaGUgb3V0Y29tZSBpcyB1c2VkIGJ5IGRyaXZlciB3aGVuIGRvaW5nIHNpdGUgc3VydmV5LgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQnVpbGRDaGFubmVsTGlzdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlVQ0hBUiBpLCBqLCBpbmRleD0wLCBudW09MDsKKwlQVUNIQVIJcENoYW5uZWxMaXN0ID0gTlVMTDsKKworCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q2hhbm5lbExpc3QsIE1BWF9OVU1fT0ZfQ0hBTk5FTFMgKiBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikpOworCisJLy8gaWYgbm90IDExYS1vbmx5IG1vZGUsIGNoYW5uZWwgbGlzdCBzdGFydHMgZnJvbSAyLjRHaHogYmFuZAorCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSAhPSBQSFlfMTFBKQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSAhPSBQSFlfMTFBTl9NSVhFRCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgIT0gUEhZXzExTl81RykKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkpCisJeworCQlzd2l0Y2ggKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gICYgMHg3ZikKKwkJeworCQkJY2FzZSBSRUdJT05fMF9CR19CQU5EOgkvLyAxIC0xMQorCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl8wX1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fMF9TSVpFKTsKKwkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl8wX1NJWkU7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl8xX0JHX0JBTkQ6CS8vIDEgLSAxMworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl8xX1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fMV9TSVpFKTsKKwkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl8xX1NJWkU7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl8yX0JHX0JBTkQ6CS8vIDEwIC0gMTEKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fMl9TVEFSVF0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSAqIEJHX0JBTkRfUkVHSU9OXzJfU0laRSk7CisJCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fMl9TSVpFOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fM19CR19CQU5EOgkvLyAxMCAtIDEzCisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzNfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl8zX1NJWkUpOworCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzNfU0laRTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzRfQkdfQkFORDoJLy8gMTQKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fNF9TVEFSVF0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSAqIEJHX0JBTkRfUkVHSU9OXzRfU0laRSk7CisJCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fNF9TSVpFOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fNV9CR19CQU5EOgkvLyAxIC0gMTQKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fNV9TVEFSVF0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSAqIEJHX0JBTkRfUkVHSU9OXzVfU0laRSk7CisJCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fNV9TSVpFOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fNl9CR19CQU5EOgkvLyAzIC0gOQorCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl82X1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fNl9TSVpFKTsKKwkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl82X1NJWkU7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl83X0JHX0JBTkQ6ICAvLyA1IC0gMTMKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fN19TVEFSVF0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSAqIEJHX0JBTkRfUkVHSU9OXzdfU0laRSk7CisJCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fN19TSVpFOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fMzFfQkdfQkFORDoJLy8gMSAtIDE0CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzMxX1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fMzFfU0laRSk7CisJCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fMzFfU0laRTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6ICAgICAgICAgICAgLy8gRXJyb3IuIHNob3VsZCBuZXZlciBoYXBwZW4KKwkJCQlicmVhazsKKwkJfQorCQlmb3IgKGk9MDsgaTxpbmRleDsgaSsrKQorCQkJcEFkLT5DaGFubmVsTGlzdFtpXS5NYXhUeFB3ciA9IDIwOworCX0KKworCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBKSB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdfTUlYRUQpCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCXx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFCR05fTUlYRUQpIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFOX01JWEVEKQorCQl8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBR05fTUlYRUQpIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fNUcpCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJKQorCXsKKwkJc3dpdGNoIChwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQgJiAweDdmKQorCQl7CisJCQljYXNlIFJFR0lPTl8wX0FfQkFORDoKKwkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl8wX0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKKwkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzBfQ0hBTk5FTF9MSVNUOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fMV9BX0JBTkQ6CisJCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fMV9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7CisJCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8xX0NIQU5ORUxfTElTVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzJfQV9CQU5EOgorCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzJfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOworCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fMl9DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl8zX0FfQkFORDoKKwkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl8zX0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKKwkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzNfQ0hBTk5FTF9MSVNUOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fNF9BX0JBTkQ6CisJCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fNF9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7CisJCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl80X0NIQU5ORUxfTElTVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzVfQV9CQU5EOgorCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzVfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOworCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fNV9DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl82X0FfQkFORDoKKwkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl82X0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKKwkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzZfQ0hBTk5FTF9MSVNUOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fN19BX0JBTkQ6CisJCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fN19DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7CisJCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl83X0NIQU5ORUxfTElTVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzhfQV9CQU5EOgorCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzhfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOworCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fOF9DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl85X0FfQkFORDoKKwkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl85X0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKKwkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzlfQ0hBTk5FTF9MSVNUOworCQkJCWJyZWFrOworCisJCQljYXNlIFJFR0lPTl8xMF9BX0JBTkQ6CisJCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fMTBfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOworCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fMTBfQ0hBTk5FTF9MSVNUOworCQkJCWJyZWFrOworCisJCQljYXNlIFJFR0lPTl8xMV9BX0JBTkQ6CisJCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fMTFfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOworCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fMTFfQ0hBTk5FTF9MSVNUOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OiAgICAgICAgICAgIC8vIEVycm9yLiBzaG91bGQgbmV2ZXIgaGFwcGVuCisJCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwoImNvdW50cnlyZWdpb249JWQgbm90IHN1cHBvcnQiLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQpKTsKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChudW0gIT0gMCkKKwkJeworCQkJVUNIQVIgUmFkYXJDaFsxNV09ezUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MH07CisJCQlmb3IgKGk9MDsgaTxudW07IGkrKykKKwkJCXsKKwkJCQlmb3IgKGo9MDsgajxNQVhfTlVNX09GX0NIQU5ORUxTOyBqKyspCisJCQkJeworCQkJCQlpZiAocENoYW5uZWxMaXN0W2ldID09IHBBZC0+VHhQb3dlcltqXS5DaGFubmVsKQorCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXgraV0sICZwQWQtPlR4UG93ZXJbal0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSk7CisJCQkJCX0KKwkJCQlmb3IgKGo9MDsgajwxNTsgaisrKQorCQkJCXsKKwkJCQkJaWYgKHBDaGFubmVsTGlzdFtpXSA9PSBSYWRhckNoW2pdKQorCQkJCQkJcEFkLT5DaGFubmVsTGlzdFtpbmRleCtpXS5EZnNSZXEgPSBUUlVFOworCQkJCX0KKwkJCQlwQWQtPkNoYW5uZWxMaXN0W2luZGV4K2ldLk1heFR4UHdyID0gMjA7CisJCQl9CisJCQlpbmRleCArPSBudW07CisJCX0KKwl9CisKKwlwQWQtPkNoYW5uZWxMaXN0TnVtID0gaW5kZXg7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJjb3VudHJ5IGNvZGU9JWQvJWQsIFJGSUM9JWQsIFBIWSBtb2RlPSVkLCBzdXBwb3J0ICVkIGNoYW5uZWxzXG4iLAorCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQsIHBBZC0+UmZJY1R5cGUsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUsIHBBZC0+Q2hhbm5lbExpc3ROdW0pKTsKKyNpZmRlZiBEQkcKKwlmb3IgKGk9MDtpPHBBZC0+Q2hhbm5lbExpc3ROdW07aSsrKQorCXsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiQnVpbGRDaGFubmVsICMgJWQgOjogUHdyMCA9ICVkLCBQd3IxID0lZCwgXG4gIiwgcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsLCBwQWQtPkNoYW5uZWxMaXN0W2ldLlBvd2VyLCBwQWQtPkNoYW5uZWxMaXN0W2ldLlBvd2VyMikpOworCX0KKyNlbmRpZgorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoaXMgcm91dGluZSByZXR1cm4gdGhlIGZpcnN0IGNoYW5uZWwgbnVtYmVyIGFjY29yZGluZyB0byB0aGUgY291bnRyeQorCQljb2RlIHNlbGVjdGlvbiBhbmQgUkYgSUMgc2VsZWN0aW9uIChzaWduYWwgYmFuZCBvciBkdWFsIGJhbmQpLiBJdCBpcyBjYWxsZWQKKwkJd2hlbmV2ZXIgZHJpdmVyIG5lZWQgdG8gc3RhcnQgYSBzaXRlIHN1cnZleSBvZiBhbGwgc3VwcG9ydGVkIGNoYW5uZWxzLgorCVJldHVybjoKKwkJY2ggLSB0aGUgZmlyc3QgY2hhbm5lbCBudW1iZXIgb2YgY3VycmVudCBjb3VudHJ5IGNvZGUgc2V0dGluZworCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1VDSEFSIEZpcnN0Q2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlyZXR1cm4gcEFkLT5DaGFubmVsTGlzdFswXS5DaGFubmVsOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBuZXh0IGNoYW5uZWwgbnVtYmVyLiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkCisJCWR1cmluZyBkcml2ZXIgbmVlZCB0byBzdGFydCBhIHNpdGUgc3VydmV5IG9mIGFsbCBzdXBwb3J0ZWQgY2hhbm5lbHMuCisJUmV0dXJuOgorCQluZXh0X2NoYW5uZWwgLSB0aGUgbmV4dCBjaGFubmVsIG51bWJlciB2YWxpZCBpbiBjdXJyZW50IGNvdW50cnkgY29kZSBzZXR0aW5nLgorCU5vdGU6CisJCXJldHVybiAwIGlmIG5vIG1vcmUgbmV4dCBjaGFubmVsCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVUNIQVIgTmV4dENoYW5uZWwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgY2hhbm5lbCkKK3sKKwlpbnQgaTsKKwlVQ0hBUiBuZXh0X2NoYW5uZWwgPSAwOworCisJZm9yIChpID0gMDsgaSA8IChwQWQtPkNoYW5uZWxMaXN0TnVtIC0gMSk7IGkrKykKKwkJaWYgKGNoYW5uZWwgPT0gcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsKQorCQl7CisJCQluZXh0X2NoYW5uZWwgPSBwQWQtPkNoYW5uZWxMaXN0W2krMV0uQ2hhbm5lbDsKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gbmV4dF9jaGFubmVsOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoaXMgcm91dGluZSBpcyBmb3IgQ2lzY28gQ29tcGF0aWJsZSBFeHRlbnNpb25zIDIuWAorCQlTcGVjMzEuIEFQIENvbnRyb2wgb2YgQ2xpZW50IFRyYW5zbWl0IFBvd2VyCisJUmV0dXJuOgorCQlOb25lCisJTm90ZToKKwkgICBSZXF1aXJlZCBieSBBaXJvbmV0IGRCbShtVykKKwkJICAgMGRCbSgxbVcpLCAgIDFkQm0oNW1XKSwgMTNkQm0oMjBtVyksIDE1ZEJtKDMwbVcpLAorCQkgIDE3ZEJtKDUwbXcpLCAyMGRCbSgxMDBtVykKKworCSAgIFdlIHN1cHBvcnRlZAorCQkgICAzZEJtKExvd2VzdCksIDZkQm0oMTAlKSwgOWRCbSgyNSUpLCAxMmRCbSg1MCUpLAorCQkgIDE0ZEJtKDc1JSksICAgMTVkQm0oMTAwJSkKKworCQlUaGUgY2xpZW50IHN0YXRpb24ncyBhY3R1YWwgdHJhbnNtaXQgcG93ZXIgc2hhbGwgYmUgd2l0aGluICsvLSA1ZEIgb2YKKwkJdGhlIG1pbmltdW0gdmFsdWUgb3IgbmV4dCBsb3dlciB2YWx1ZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIENoYW5nZVRvQ2VsbFBvd2VyTGltaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgICAgICAgICBBaXJvbmV0Q2VsbFBvd2VyTGltaXQpCit7CisJLy92YWx1ZCAweEZGIG1lYW5zIHRoYXQgaGFzbid0IGZvdW5kIHBvd2VyIGxpbWl0IGluZm9ybWF0aW9uCisJLy9mcm9tIHRoZSBBUCdzIEJlYWNvbi9Qcm9iZSByZXNwb25zZS4KKwlpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0ID09IDB4RkYpCisJCXJldHVybjsKKworCWlmIChBaXJvbmV0Q2VsbFBvd2VyTGltaXQgPCA2KSAvL1VzZWQgTG93ZXN0IFBvd2VyIFBlcmNlbnRhZ2UuCisJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gNjsKKwllbHNlIGlmIChBaXJvbmV0Q2VsbFBvd2VyTGltaXQgPCA5KQorCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IDEwOworCWVsc2UgaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA8IDEyKQorCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IDI1OworCWVsc2UgaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA8IDE0KQorCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IDUwOworCWVsc2UgaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA8IDE1KQorCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IDc1OworCWVsc2UKKwkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSAxMDA7IC8vZWxzZSB1c2VkIG1heGltdW0KKworCWlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0KQorCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0OworCit9CisKK0NIQVIJQ29udmVydFRvUnNzaSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglDSEFSCQkJUnNzaSwKKwlJTiAgVUNIQVIgICBSc3NpTnVtYmVyKQoreworCVVDSEFSCVJzc2lPZmZzZXQsIExOQUdhaW47CisKKwkvLyBSc3NpIGVxdWFscyB0byB6ZXJvIHNob3VsZCBiZSBhbiBpbnZhbGlkIHZhbHVlCisJaWYgKFJzc2kgPT0gMCkKKwkJcmV0dXJuIC05OTsKKworCUxOQUdhaW4gPSBHRVRfTE5BX0dBSU4ocEFkKTsKKyAgICBpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsID4gMTQpCisgICAgeworICAgICAgICBpZiAoUnNzaU51bWJlciA9PSAwKQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QVJzc2lPZmZzZXQwOworCQllbHNlIGlmIChSc3NpTnVtYmVyID09IDEpCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5BUnNzaU9mZnNldDE7CisJCWVsc2UKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkFSc3NpT2Zmc2V0MjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKFJzc2lOdW1iZXIgPT0gMCkKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkJHUnNzaU9mZnNldDA7CisJCWVsc2UgaWYgKFJzc2lOdW1iZXIgPT0gMSkKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkJHUnNzaU9mZnNldDE7CisJCWVsc2UKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkJHUnNzaU9mZnNldDI7CisgICAgfQorCisgICAgcmV0dXJuICgtMTIgLSBSc3NpT2Zmc2V0IC0gTE5BR2FpbiAtIFJzc2kpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVNjYW4gbmV4dCBjaGFubmVsCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBTY2FuTmV4dENoYW5uZWwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJSEVBREVSXzgwMl8xMSAgIEhkcjgwMjExOworCVBVQ0hBUiAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUyAgICAgTlN0YXR1czsKKwlVTE9ORyAgICAgICAgICAgRnJhbWVMZW4gPSAwOworCVVDSEFSICAgICAgICAgICBTc2lkTGVuID0gMCwgU2NhblR5cGUgPSBwQWQtPk1sbWVBdXguU2NhblR5cGUsIEJCUFZhbHVlID0gMDsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlVU0hPUlQgICAgICAgICAgU3RhdHVzOworCVBIRUFERVJfODAyXzExICBwSGRyODAyMTE7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJVUlOVAkJCVNjYW5UaW1lSW41Z0NoYW5uZWwgPSBTSE9SVF9DSEFOTkVMX1RJTUU7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJaWYgKE1PTklUT1JfT04ocEFkKSkKKwkJCXJldHVybjsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBSQUxJTktfQVRFCisJLy8gTm90aGluZyB0byBkbyBpbiBBVEUgbW9kZS4KKwlpZiAoQVRFX09OKHBBZCkpCisJCXJldHVybjsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKwlpZiAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPT0gMCkKKwl7CisJCWlmICgocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzQwKQorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJJiYgKElORlJBX09OKHBBZCkKKwkJCQl8fCAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX0FQKSkKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCSkKKwkJeworCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOworCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOworCQkJQkJQVmFsdWUgJj0gKH4weDE4KTsKKwkJCUJCUFZhbHVlIHw9IDB4MTA7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gRW5kIG9mIFNDQU4sIHJlc3RvcmUgdG8gNDBNSHogY2hhbm5lbCAlZCwgVG90YWwgQlNTWyUwMmRdXG4iLHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBwQWQtPlNjYW5UYWIuQnNzTnIpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOworCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gRW5kIG9mIFNDQU4sIHJlc3RvcmUgdG8gY2hhbm5lbCAlZCwgVG90YWwgQlNTWyUwMmRdXG4iLHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+U2NhblRhYi5Cc3NOcikpOworCQl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJLy8KKwkJCS8vIFRvIHByZXZlbnQgZGF0YSBsb3N0LgorCQkJLy8gU2VuZCBhbiBOVUxMIGRhdGEgd2l0aCB0dXJuZWQgUFNNIGJpdCBvbiB0byBjdXJyZW50IGFzc29jaWF0ZWQgQVAgYmVmb3JlIFNDQU4gcHJvZ3Jlc3MuCisJCQkvLyBOb3csIHdlIG5lZWQgdG8gc2VuZCBhbiBOVUxMIGRhdGEgd2l0aCB0dXJuZWQgUFNNIGJpdCBvZmYgdG8gQVAsIHdoZW4gc2NhbiBwcm9ncmVzcyBkb25lCisJCQkvLworCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSAmJiAoSU5GUkFfT04ocEFkKSkpCisJCQl7CisJCQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7CisJCQkJaWYgKE5TdGF0dXMJPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCQl7CisJCQkJCXBIZHI4MDIxMSA9IChQSEVBREVSXzgwMl8xMSkgcE91dEJ1ZmZlcjsKKwkJCQkJTWd0TWFjSGVhZGVySW5pdChwQWQsIHBIZHI4MDIxMSwgU1VCVFlQRV9OVUxMX0ZVTkMsIDEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQkJCXBIZHI4MDIxMS0+RHVyYXRpb24gPSAwOworCQkJCQlwSGRyODAyMTEtPkZDLlR5cGUgPSBCVFlQRV9EQVRBOworCQkJCQlwSGRyODAyMTEtPkZDLlB3ck1nbXQgPSAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKTsKKworCQkJCQkvLyBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCisJCQkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVNjYW5SZXFBY3Rpb24gLS0gU2VuZCBQU00gRGF0YSBmcmFtZVxuIikpOworCQkJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQkJCQlSVE1QdXNlY0RlbGF5KDUwMDApOworCQkJCX0KKwkJCX0KKworCQkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKKwkJCVN0YXR1cyA9IE1MTUVfU1VDQ0VTUzsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9TQ0FOX0NPTkYsIDIsICZTdGF0dXMpOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKTsKKwl9CisJZWxzZQorCXsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkvLyBCQlAgYW5kIFJGIGFyZSBub3QgYWNjZXNzaWJsZSBpbiBQUyBtb2RlLCB3ZSBoYXMgdG8gd2FrZSB0aGVtIHVwIGZpcnN0CisJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQorCQkJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgVFJVRSk7CisKKwkJCS8vIGxlYXZlIFBTTSBkdXJpbmcgc2Nhbm5pbmcuIG90aGVyd2lzZSB3ZSBtYXkgbG9zdCBQcm9iZVJzcCAmIEJFQUNPTgorCQkJaWYgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkKKwkJCQlNbG1lU2V0UHNtQml0KHBBZCwgUFdSX0FDVElWRSk7CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsLCBUUlVFKTsKKwkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA+IDE0KQorCQkJeworCQkJCWlmICgocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkgJiYgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCkpCisJCQkJeworCQkJCQlTY2FuVHlwZSA9IFNDQU5fUEFTU0lWRTsKKwkJCQkJU2NhblRpbWVJbjVnQ2hhbm5lbCA9IE1JTl9DSEFOTkVMX1RJTUU7CisJCQkJfQorCQkJfQorCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLyBSb2dlciBzeW5jIENhcnJpZXIKKwkJCS8vIGNhcnJpZXIgZGV0ZWN0aW9uCisJCQlpZiAocEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPT0gVFJVRSkKKwkJCXsKKwkJCQlTY2FuVHlwZSA9IFNDQU5fUEFTU0lWRTsKKwkJCQlTY2FuVGltZUluNWdDaGFubmVsID0gTUlOX0NIQU5ORUxfVElNRTsKKwkJCX0KKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisJCX0KKworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCS8vR2xvYmFsIGNvdW50cnkgZG9tYWluKGNoMS0xMTphY3RpdmUgc2NhbiwgY2gxMi0xNCBwYXNzaXZlIHNjYW4pCisJCWlmICgocEFkLT5NbG1lQXV4LkNoYW5uZWwgPD0gMTQpICYmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA+PSAxMikgJiYgKChwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uICYgMHg3ZikgPT0gUkVHSU9OXzMxX0JHX0JBTkQpKQorCQl7CisJCQlTY2FuVHlwZSA9IFNDQU5fUEFTU0lWRTsKKwkJfQorCisJCS8vIFdlIG5lZWQgdG8gc2hvcnRlbiBhY3RpdmUgc2NhbiB0aW1lIGluIG9yZGVyIGZvciBXWkMgY29ubmVjdCBpc3N1ZQorCQkvLyBDaG5hZ2UgdGhlIGNoYW5uZWwgc2NhbiB0aW1lIGZvciBDSVNDTyBzdHVmZiBiYXNlZCBvbiBpdHMgSUFQUCBhbm5vdW5jZW1lbnQKKwkJaWYgKFNjYW5UeXBlID09IEZBU1RfU0NBTl9BQ1RJVkUpCisJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsIEZBU1RfQUNUSVZFX1NDQU5fVElNRSk7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCWVsc2UgaWYgKCgoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19BQ1RJVkUpIHx8CisJCQkJKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fUEFTU0lWRSkgfHwKKwkJCQkoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19DSEFOTkVMX0xPQUQpIHx8CisJCQkJKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fTk9JU0UpKSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCisJCXsKKwkJCWlmIChwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSA8IDI1KQorCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgcEFkLT5TdGFDZmcuQ0NYU2NhblRpbWUgKiAyKTsKKwkJCWVsc2UKKwkJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsIHBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lKTsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQllbHNlIC8vIG11c3QgYmUgU0NBTl9QQVNTSVZFIG9yIFNDQU5fQUNUSVZFCisJCXsKKwkJCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdfTUlYRUQpCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHTl9NSVhFRCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUdOX01JWEVEKQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJKQorCQkJeworCQkJCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA+IDE0KQorCQkJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsIFNjYW5UaW1lSW41Z0NoYW5uZWwpOworCQkJCWVsc2UKKwkJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsIE1JTl9DSEFOTkVMX1RJTUUpOworCQkJfQorCQkJZWxzZQorCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgTUFYX0NIQU5ORUxfVElNRSk7CisJCX0KKworCQlpZiAoKFNjYW5UeXBlID09IFNDQU5fQUNUSVZFKSB8fCAoU2NhblR5cGUgPT0gRkFTVF9TQ0FOX0FDVElWRSkgfHwKKwkJCShTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX0FDVElWRSkpCisJCXsKKwkJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBTY2FuTmV4dENoYW5uZWwoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbFxuIikpOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJeworCQkJCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOworCQkJCQlTdGF0dXMgPSBNTE1FX0ZBSUxfTk9fUkVTT1VSQ0U7CisJCQkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9TQ0FOX0NPTkYsIDIsICZTdGF0dXMpOworCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy8gVGhlcmUgaXMgbm8gbmVlZCB0byBzZW5kIGJyb2FkY2FzdCBwcm9iZSByZXF1ZXN0IGlmIGFjdGl2ZSBzY2FuIGlzIGluIGVmZmVjdC4KKwkJCWlmICgoU2NhblR5cGUgPT0gU0NBTl9BQ1RJVkUpIHx8IChTY2FuVHlwZSA9PSBGQVNUX1NDQU5fQUNUSVZFKQorCQkJCSkKKwkJCQlTc2lkTGVuID0gcEFkLT5NbG1lQXV4LlNzaWRMZW47CisJCQllbHNlCisJCQkJU3NpZExlbiA9IDA7CisKKwkJCU1ndE1hY0hlYWRlckluaXQocEFkLCAmSGRyODAyMTEsIFNVQlRZUEVfUFJPQkVfUkVRLCAwLCBCUk9BRENBU1RfQUREUiwgQlJPQURDQVNUX0FERFIpOworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAmRnJhbWVMZW4sCisJCQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksICAgICZIZHI4MDIxMSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRJZSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRMZW4sCisJCQkJCQkJICBTc2lkTGVuLAkJCSAgICAgICAgcEFkLT5NbG1lQXV4LlNzaWQsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZTdXBSYXRlSWUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuLAorCQkJCQkJCSAgcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbiwgIHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGUsCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuKQorCQkJeworCQkJCVVMT05HIFRtcDsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcCwKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkV4dFJhdGVJZSwKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW4sCisJCQkJCQkJCSAgcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbiwgICAgICAgICAgcEFkLT5Db21tb25DZmcuRXh0UmF0ZSwKKwkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQkJRnJhbWVMZW4gKz0gVG1wOworCQkJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQorCQkJeworCQkJCVVMT05HCVRtcDsKKwkJCQlVQ0hBUglIdExlbjsKKwkJCQlVQ0hBUglCUk9BRENPTVs0XSA9IHsweDAsIDB4OTAsIDB4NGMsIDB4MzN9OworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCQlIVF9DQVBBQklMSVRZX0lFIEh0Q2FwYWJpbGl0eVRtcDsKKyNlbmRpZgorCQkJCWlmIChwQWQtPmJCcm9hZENvbUhUID09IFRSVUUpCisJCQkJeworCQkJCQlIdExlbiA9IHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gKyA0OworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCQkJTmRpc01vdmVNZW1vcnkoJkh0Q2FwYWJpbGl0eVRtcCwgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksIFNJWkVfSFRfQ0FQX0lFKTsKKwkJCQkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSk7CisJCQkJCSooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykpOworCisJCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgJlRtcCwKKwkJCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmV3BhSWUsCisJCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0TGVuLAorCQkJCQkJCQkJNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCUk9BRENPTVswXSwKKwkJCQkJCQkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sICAgICAmSHRDYXBhYmlsaXR5VG1wLAorCQkJCQkJCQkJRU5EX09GX0FSR1MpOworI2Vsc2UKKwkJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAmVG1wLAorCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZXcGFJZSwKKwkJCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRMZW4sCisJCQkJCQkJCQk0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkJST0FEQ09NWzBdLAorCQkJCQkJCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LAorCQkJCQkJCQkJRU5EX09GX0FSR1MpOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJSHRMZW4gPSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCQkJTmRpc01vdmVNZW1vcnkoJkh0Q2FwYWJpbGl0eVRtcCwgJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwgU0laRV9IVF9DQVBfSUUpOworCQkJCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pKTsKKwkJCQkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSk7CisKKwkJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAmVG1wLAorCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcEllLAorCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdExlbiwKKwkJCQkJCQkJCUh0TGVuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRDYXBhYmlsaXR5VG1wLAorCQkJCQkJCQkJRU5EX09GX0FSR1MpOworI2Vsc2UKKwkJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAmVG1wLAorCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcEllLAorCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdExlbiwKKwkJCQkJCQkJCUh0TGVuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LAorCQkJCQkJCQkJRU5EX09GX0FSR1MpOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKwkJCQl9CisJCQkJRnJhbWVMZW4gKz0gVG1wOworCisjaWZkZWYgRE9UMTFOX0RSQUZUMworCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuYjIwNDBDb2V4aXN0U2NhblN1cCA9PSAxKQorCQkJCXsKKwkJCQkJVUxPTkcJCVRtcDsKKwkJCQkJSHRMZW4gPSAxOworCQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcCwKKwkJCQkJCQkJCSAgMSwJCQkJCSZFeHRIdENhcEllLAorCQkJCQkJCQkJICAxLAkJCQkJJkh0TGVuLAorCQkJCQkJCQkJICAxLCAgICAgICAgICAJCQkmcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAud29yZCwKKwkJCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCisJCQkJCUZyYW1lTGVuICs9IFRtcDsKKwkJCQl9CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisKKwkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJfQorCisJCS8vIEZvciBTQ0FOX0NJU0NPX1BBU1NJVkUsIGRvIG5vdGhpbmcgYW5kIHNpbGVudGx5IHdhaXQgZm9yIGJlYWNvbiBvciBvdGhlciBwcm9iZSByZXBvbnNlCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTQ0FOX0xJU1RFTjsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCX0KK30KKworVk9JRCBNZ3RQcm9iUmVxTWFjSGVhZGVySW5pdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBPVVQgUEhFQURFUl84MDJfMTEgcEhkcjgwMjExLAorCUlOIFVDSEFSIFN1YlR5cGUsCisJSU4gVUNIQVIgVG9EcywKKwlJTiBQVUNIQVIgcERBLAorCUlOIFBVQ0hBUiBwQnNzaWQpCit7CisJTmRpc1plcm9NZW1vcnkocEhkcjgwMjExLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCisJcEhkcjgwMjExLT5GQy5UeXBlID0gQlRZUEVfTUdNVDsKKwlwSGRyODAyMTEtPkZDLlN1YlR5cGUgPSBTdWJUeXBlOworCWlmIChTdWJUeXBlID09IFNVQlRZUEVfQUNLKQorCQlwSGRyODAyMTEtPkZDLlR5cGUgPSBCVFlQRV9DTlRMOworCXBIZHI4MDIxMS0+RkMuVG9EcyA9IFRvRHM7CisJQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIxLCBwREEpOworCUNPUFlfTUFDX0FERFIocEhkcjgwMjExLT5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIzLCBwQnNzaWQpOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV93cGEuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV93cGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWMzMzJhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3dwYS5jCkBAIC0wLDAgKzEsMTYwNiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwl3cGEuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUphbglMZWUJCTAzLTA3LTIyCQlJbml0aWFsCisJUGF1bCBMaW4JMDMtMTEtMjgJCU1vZGlmeSBmb3Igc3VwcGxpY2FudAorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKy8vIFdQQSBPVUkKK1VDSEFSCQlPVUlfV1BBX05PTkVfQUtNWzRdCQk9IHsweDAwLCAweDUwLCAweEYyLCAweDAwfTsKK1VDSEFSICAgICAgIE9VSV9XUEFfVkVSU0lPTls0XSAgICAgID0gezB4MDAsIDB4NTAsIDB4RjIsIDB4MDF9OworVUNIQVIgICAgICAgT1VJX1dQQV9US0lQWzRdICAgICA9IHsweDAwLCAweDUwLCAweEYyLCAweDAyfTsKK1VDSEFSICAgICAgIE9VSV9XUEFfQ0NNUFs0XSAgICAgPSB7MHgwMCwgMHg1MCwgMHhGMiwgMHgwNH07CitVQ0hBUiAgICAgICBPVUlfV1BBXzgwMjFYX0FLTVs0XQk9IHsweDAwLCAweDUwLCAweEYyLCAweDAxfTsKK1VDSEFSICAgICAgIE9VSV9XUEFfUFNLX0FLTVs0XSAgICAgID0gezB4MDAsIDB4NTAsIDB4RjIsIDB4MDJ9OworLy8gV1BBMiBPVUkKK1VDSEFSICAgICAgIE9VSV9XUEEyX1dFUDQwWzRdICAgPSB7MHgwMCwgMHgwRiwgMHhBQywgMHgwMX07CitVQ0hBUiAgICAgICBPVUlfV1BBMl9US0lQWzRdICAgICAgICA9IHsweDAwLCAweDBGLCAweEFDLCAweDAyfTsKK1VDSEFSICAgICAgIE9VSV9XUEEyX0NDTVBbNF0gICAgICAgID0gezB4MDAsIDB4MEYsIDB4QUMsIDB4MDR9OworVUNIQVIgICAgICAgT1VJX1dQQTJfODAyMVhfQUtNWzRdICAgPSB7MHgwMCwgMHgwRiwgMHhBQywgMHgwMX07CitVQ0hBUiAgICAgICBPVUlfV1BBMl9QU0tfQUtNWzRdICAgCT0gezB4MDAsIDB4MEYsIDB4QUMsIDB4MDJ9OworLy8gTVNBIE9VSQorVUNIQVIgICAJT1VJX01TQV84MDIxWF9BS01bNF0gICAgPSB7MHgwMCwgMHgwRiwgMHhBQywgMHgwNX07CQkvLyBOb3QgeWV0IGZpbmFsIC0gSUVFRSA4MDIuMTFzLUQxLjA2CitVQ0hBUiAgIAlPVUlfTVNBX1BTS19BS01bNF0gICAJPSB7MHgwMCwgMHgwRiwgMHhBQywgMHgwNn07CQkvLyBOb3QgeWV0IGZpbmFsIC0gSUVFRSA4MDIuMTFzLUQxLjA2CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlUaGUgcHNldWRvLXJhbmRvbSBmdW5jdGlvbihQUkYpIHRoYXQgaGFzaGVzIHZhcmlvdXMgaW5wdXRzIHRvCisJCWRlcml2ZSBhIHBzZXVkby1yYW5kb20gdmFsdWUuIFRvIGFkZCBsaXZlbmVzcyB0byB0aGUgcHNldWRvLXJhbmRvbQorCQl2YWx1ZSwgYSBub25jZSBzaG91bGQgYmUgb25lIG9mIHRoZSBpbnB1dHMuCisKKwkJSXQgaXMgdXNlZCB0byBnZW5lcmF0ZSBQVEssIEdUSyBvciBzb21lIHNwZWNpZmljIHJhbmRvbSB2YWx1ZS4KKworCUFyZ3VtZW50czoKKwkJVUNIQVIJKmtleSwJCS0JdGhlIGtleSBtYXRlcmlhbCBmb3IgSE1BQ19TSEExIHVzZQorCQlJTlQJCWtleV9sZW4JCS0JdGhlIGxlbmd0aCBvZiBrZXkKKwkJVUNIQVIJKnByZWZpeAkJLQlhIHByZWZpeCBsYWJlbAorCQlJTlQJCXByZWZpeF9sZW4JLQl0aGUgbGVuZ3RoIG9mIHRoZSBsYWJlbAorCQlVQ0hBUgkqZGF0YQkJLQlhIHNwZWNpZmljIGRhdGEgd2l0aCB2YXJpYWJsZSBsZW5ndGgKKwkJSU5UCQlkYXRhX2xlbgktCXRoZSBsZW5ndGggb2YgYSBzcGVjaWZpYyBkYXRhCisJCUlOVAkJbGVuCQkJLQl0aGUgb3V0cHV0IGxlbmdodAorCisJUmV0dXJuIFZhbHVlOgorCQlVQ0hBUgkqb3V0cHV0CQktCXRoZSBjYWxjdWxhdGVkIHJlc3VsdAorCisJTm90ZToKKwkJODAyLjExaS0yMDA0CUFubmV4IEguMworCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlQUkYoCisJSU4JVUNIQVIJKmtleSwKKwlJTglJTlQJCWtleV9sZW4sCisJSU4JVUNIQVIJKnByZWZpeCwKKwlJTglJTlQJCXByZWZpeF9sZW4sCisJSU4JVUNIQVIJKmRhdGEsCisJSU4JSU5UCQlkYXRhX2xlbiwKKwlPVVQJVUNIQVIJKm91dHB1dCwKKwlJTglJTlQJCWxlbikKK3sKKwlJTlQJCWk7CisgICAgVUNIQVIgICAqaW5wdXQ7CisJSU5UCQljdXJyZW50aW5kZXggPSAwOworCUlOVAkJdG90YWxfbGVuOworCisJLy8gQWxsb2NhdGUgbWVtb3J5IGZvciBpbnB1dAorCW9zX2FsbG9jX21lbShOVUxMLCAoUFVDSEFSICopJmlucHV0LCAxMDI0KTsKKworICAgIGlmIChpbnB1dCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiISEhUFJGOiBubyBtZW1vcnkhISFcbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworCS8vIEdlbmVyYXRlIGNvbmNhdGVuYXRpb24gaW5wdXQKKwlOZGlzTW92ZU1lbW9yeShpbnB1dCwgcHJlZml4LCBwcmVmaXhfbGVuKTsKKworCS8vIENvbmNhdGVuYXRlIGEgc2luZ2xlIG9jdGV0IGNvbnRhaW5pbmcgMAorCWlucHV0W3ByZWZpeF9sZW5dID0JMDsKKworCS8vIENvbmNhdGVuYXRlIHNwZWNpZmljIGRhdGEKKwlOZGlzTW92ZU1lbW9yeSgmaW5wdXRbcHJlZml4X2xlbiArIDFdLCBkYXRhLCBkYXRhX2xlbik7CisJdG90YWxfbGVuID0JcHJlZml4X2xlbiArIDEgKyBkYXRhX2xlbjsKKworCS8vIENvbmNhdGVuYXRlIGEgc2luZ2xlIG9jdGV0IGNvbnRhaW5pbmcgMAorCS8vIFRoaXMgb2N0ZXQgc2hhbGwgYmUgdXBkYXRlIGxhdGVyCisJaW5wdXRbdG90YWxfbGVuXSA9IDA7CisJdG90YWxfbGVuKys7CisKKwkvLyBJdGVyYXRlIHRvIGNhbGN1bGF0ZSB0aGUgcmVzdWx0IGJ5IGhtYWMtc2hhLTEKKwkvLyBUaGVuIGNvbmNhdGVuYXRlIHRvIGxhc3QgcmVzdWx0CisJZm9yCShpID0gMDsJaSA8CShsZW4gKyAxOSkgLyAyMDsgaSsrKQorCXsKKwkJSE1BQ19TSEExKGlucHV0LCB0b3RhbF9sZW4sCWtleSwga2V5X2xlbiwgJm91dHB1dFtjdXJyZW50aW5kZXhdKTsKKwkJY3VycmVudGluZGV4ICs9CTIwOworCisJCS8vIHVwZGF0ZSB0aGUgbGFzdCBvY3RldAorCQlpbnB1dFt0b3RhbF9sZW4gLSAxXSsrOworCX0KKyAgICBvc19mcmVlX21lbShOVUxMLCBpbnB1dCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlJdCB1dGlsaXplcyBQUkYtMzg0IG9yIFBSRi01MTIgdG8gZGVyaXZlIHNlc3Npb24tc3BlY2lmaWMga2V5cyBmcm9tIGEgUE1LLgorCQlJdCBzaGFsbCBiZSBjYWxsZWQgYnkgNC13YXkgaGFuZHNoYWtlIHByb2Nlc3NpbmcuCisKKwlBcmd1bWVudHM6CisJCXBBZCAJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0CisJCVBNSwkJLQlwb2ludGVyIHRvIFBNSworCQlBTm9uY2UJLQlwb2ludGVyIHRvIEFOb25jZQorCQlBQQkJLQlwb2ludGVyIHRvIEF1dGhlbnRpY2F0b3IgQWRkcmVzcworCQlTTm9uY2UJLQlwb2ludGVyIHRvIFNOb25jZQorCQlTQQkJLQlwb2ludGVyIHRvIFN1cHBsaWNhbnQgQWRkcmVzcworCQlsZW4JCS0JaW5kaWNhdGUgdGhlIGxlbmd0aCBvZiBQVEsgKG9jdGV0KQorCisJUmV0dXJuIFZhbHVlOgorCQlPdXRwdXQJCXBvaW50ZXIgdG8gdGhlIFBUSworCisJTm90ZToKKwkJUmVmZXIgdG8gSUVFRSA4MDIuMTFpLTIwMDQgOC41LjEuMgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBXcGFDb3VudFBUSygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkqUE1LLAorCUlOCVVDSEFSCSpBTm9uY2UsCisJSU4JVUNIQVIJKkFBLAorCUlOCVVDSEFSCSpTTm9uY2UsCisJSU4JVUNIQVIJKlNBLAorCU9VVAlVQ0hBUgkqb3V0cHV0LAorCUlOCVVJTlQJbGVuKQoreworCVVDSEFSCWNvbmNhdGVuYXRpb25bNzZdOworCVVJTlQJQ3VyclBvcyA9IDA7CisJVUNIQVIJdGVtcFszMl07CisJVUNIQVIJUHJlZml4W10gPSB7J1AnLCAnYScsICdpJywgJ3InLCAndycsICdpJywgJ3MnLCAnZScsICcgJywgJ2snLCAnZScsICd5JywgJyAnLAorCQkJCQkJJ2UnLCAneCcsICdwJywgJ2EnLCAnbicsICdzJywgJ2knLCAnbycsICduJ307CisKKwkvLyBpbml0aWF0ZSB0aGUgY29uY2F0ZW5hdGlvbiBpbnB1dAorCU5kaXNaZXJvTWVtb3J5KHRlbXAsIHNpemVvZih0ZW1wKSk7CisJTmRpc1plcm9NZW1vcnkoY29uY2F0ZW5hdGlvbiwgNzYpOworCisJLy8gR2V0IHNtYWxsZXIgYWRkcmVzcworCWlmIChSVE1QQ29tcGFyZU1lbW9yeShTQSwgQUEsIDYpID09IDEpCisJCU5kaXNNb3ZlTWVtb3J5KGNvbmNhdGVuYXRpb24sIEFBLCA2KTsKKwllbHNlCisJCU5kaXNNb3ZlTWVtb3J5KGNvbmNhdGVuYXRpb24sIFNBLCA2KTsKKwlDdXJyUG9zICs9IDY7CisKKwkvLyBHZXQgbGFyZ2VyIGFkZHJlc3MKKwlpZiAoUlRNUENvbXBhcmVNZW1vcnkoU0EsIEFBLCA2KSA9PSAxKQorCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgU0EsIDYpOworCWVsc2UKKwkJTmRpc01vdmVNZW1vcnkoJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIEFBLCA2KTsKKworCS8vIHN0b3JlIHRoZSBsYXJnZXIgbWFjIGFkZHJlc3MgZm9yIGJhY2t3YXJkIGNvbXBhdGlibGUgb2YKKwkvLyByYWxpbmsgcHJvcHJpZXRhcnkgU1RBLWtleSBpc3N1ZQorCU5kaXNNb3ZlTWVtb3J5KHRlbXAsICZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCBNQUNfQUREUl9MRU4pOworCUN1cnJQb3MgKz0gNjsKKworCS8vIEdldCBzbWFsbGVyIE5vbmNlCisJaWYgKFJUTVBDb21wYXJlTWVtb3J5KEFOb25jZSwgU05vbmNlLCAzMikgPT0gMCkKKwkJTmRpc01vdmVNZW1vcnkoJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIHRlbXAsIDMyKTsJLy8gcGF0Y2ggZm9yIHJhbGluayBwcm9wcmlldGFyeSBTVEEta2V5IGlzc3VlCisJZWxzZSBpZiAoUlRNUENvbXBhcmVNZW1vcnkoQU5vbmNlLCBTTm9uY2UsIDMyKSA9PSAxKQorCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgU05vbmNlLCAzMik7CisJZWxzZQorCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgQU5vbmNlLCAzMik7CisJQ3VyclBvcyArPSAzMjsKKworCS8vIEdldCBsYXJnZXIgTm9uY2UKKwlpZiAoUlRNUENvbXBhcmVNZW1vcnkoQU5vbmNlLCBTTm9uY2UsIDMyKSA9PSAwKQorCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgdGVtcCwgMzIpOwkvLyBwYXRjaCBmb3IgcmFsaW5rIHByb3ByaWV0YXJ5IFNUQS1rZXkgaXNzdWUKKwllbHNlIGlmIChSVE1QQ29tcGFyZU1lbW9yeShBTm9uY2UsIFNOb25jZSwgMzIpID09IDEpCisJCU5kaXNNb3ZlTWVtb3J5KCZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCBBTm9uY2UsIDMyKTsKKwllbHNlCisJCU5kaXNNb3ZlTWVtb3J5KCZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCBTTm9uY2UsIDMyKTsKKwlDdXJyUG9zICs9IDMyOworCisJaGV4X2R1bXAoImNvbmNhdGVuYXRpb249IiwgY29uY2F0ZW5hdGlvbiwgNzYpOworCisJLy8gVXNlIFBSRiB0byBnZW5lcmF0ZSBQVEsKKwlQUkYoUE1LLCBMRU5fTUFTVEVSX0tFWSwgUHJlZml4LCAyMiwgY29uY2F0ZW5hdGlvbiwgNzYsIG91dHB1dCwgbGVuKTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJR2VuZXJhdGUgcmFuZG9tIG51bWJlciBieSBzb2Z0d2FyZS4KKworCUFyZ3VtZW50czoKKwkJcEFkCQktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKKwkJbWFjQWRkcgktCXBvaW50ZXIgdG8gbG9jYWwgTUFDIGFkZHJlc3MKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisJCTgwMi4xaWktMjAwNCAgQW5uZXggSC41CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUdlblJhbmRvbSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCSptYWNBZGRyLAorCU9VVAlVQ0hBUgkJCSpyYW5kb20pCit7CisJSU5UCQlpLCBjdXJyOworCVVDSEFSCWxvY2FsWzgwXSwgS2V5Q291bnRlclszMl07CisJVUNIQVIJcmVzdWx0WzgwXTsKKwlVTE9ORwlDdXJyZW50VGltZTsKKwlVQ0hBUglwcmVmaXhbXSA9IHsnSScsICduJywgJ2knLCAndCcsICcgJywgJ0MnLCAnbycsICd1JywgJ24nLCAndCcsICdlJywgJ3InfTsKKworCS8vIFplcm8gdGhlIHJlbGF0ZWQgaW5mb3JtYXRpb24KKwlOZGlzWmVyb01lbW9yeShyZXN1bHQsIDgwKTsKKwlOZGlzWmVyb01lbW9yeShsb2NhbCwgODApOworCU5kaXNaZXJvTWVtb3J5KEtleUNvdW50ZXIsIDMyKTsKKworCWZvcgkoaSA9IDA7CWkgPAkzMjsJaSsrKQorCXsKKwkJLy8gY29weSB0aGUgbG9jYWwgTUFDIGFkZHJlc3MKKwkJQ09QWV9NQUNfQUREUihsb2NhbCwgbWFjQWRkcik7CisJCWN1cnIgPQlNQUNfQUREUl9MRU47CisKKwkJLy8gY29uY2F0ZW5hdGUgdGhlIGN1cnJlbnQgdGltZQorCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZDdXJyZW50VGltZSk7CisJCU5kaXNNb3ZlTWVtb3J5KCZsb2NhbFtjdXJyXSwgICZDdXJyZW50VGltZSwJc2l6ZW9mKEN1cnJlbnRUaW1lKSk7CisJCWN1cnIgKz0Jc2l6ZW9mKEN1cnJlbnRUaW1lKTsKKworCQkvLyBjb25jYXRlbmF0ZSB0aGUgbGFzdCByZXN1bHQKKwkJTmRpc01vdmVNZW1vcnkoJmxvY2FsW2N1cnJdLCAgcmVzdWx0LCAzMik7CisJCWN1cnIgKz0JMzI7CisKKwkJLy8gY29uY2F0ZW5hdGUgYSB2YXJpYWJsZQorCQlOZGlzTW92ZU1lbW9yeSgmbG9jYWxbY3Vycl0sICAmaSwgIDIpOworCQljdXJyICs9CTI7CisKKwkJLy8gY2FsY3VsYXRlIHRoZSByZXN1bHQKKwkJUFJGKEtleUNvdW50ZXIsIDMyLCBwcmVmaXgsMTIsIGxvY2FsLCBjdXJyLCByZXN1bHQsIDMyKTsKKwl9CisKKwlOZGlzTW92ZU1lbW9yeShyYW5kb20sIHJlc3VsdCwJMzIpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQnVpbGQgY2lwaGVyIHN1aXRlIGluIFJTTi1JRS4KKwkJSXQgb25seSBzaGFsbCBiZSBjYWxsZWQgYnkgUlRNUE1ha2VSU05JRS4KKworCUFyZ3VtZW50czoKKwkJcEFkCQkJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0CisgICAgCUVsZW1lbnRJRAktCWluZGljYXRlIHRoZSBXUEExIG9yIFdQQTIKKyAgICAJV2VwU3RhdHVzCS0JaW5kaWNhdGUgdGhlIGVuY3J5cHRpb24gdHlwZQorCQliTWl4Q2lwaGVyCS0JYSBib29sZWFuIHRvIGluZGljYXRlIHRoZSBwYWlyd2lzZSBjaXBoZXIgYW5kIGdyb3VwCisJCQkJCQljaXBoZXIgYXJlIHRoZSBzYW1lIG9yIG5vdAorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBWT0lEIFJUTVBJbnNlcnRSc25JZUNpcGhlcigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTglVQ0hBUgkJCUVsZW1lbnRJRCwKKwlJTglVSU5UCQkJV2VwU3RhdHVzLAorCUlOCUJPT0xFQU4JCQliTWl4Q2lwaGVyLAorCUlOCVVDSEFSCQkJRmxleGlibGVDaXBoZXIsCisJT1VUCVBVQ0hBUgkJCXBSc25JZSwKKwlPVVQJVUNIQVIJCQkqcnNuX2xlbikKK3sKKwlVQ0hBUglQYWlyd2lzZUNudDsKKworCSpyc25fbGVuID0gMDsKKworCS8vIGRlY2lkZSBXUEEyIG9yIFdQQTEKKwlpZiAoRWxlbWVudElEID09IFdwYTJJZSkKKwl7CisJCVJTTklFMgkqcFJzbmllX2NpcGhlciA9IChSU05JRTIqKXBSc25JZTsKKworCQkvLyBBc3NpZ24gdGhlIHZlcnNvbiBhcyAxCisJCXBSc25pZV9jaXBoZXItPnZlcnNpb24gPSAxOworCisgICAgICAgIHN3aXRjaCAoV2VwU3RhdHVzKQorICAgICAgICB7CisgICAgICAgIAkvLyBUS0lQIG1vZGUKKyAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDoKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQTJfVEtJUCwgNCk7CisgICAgICAgICAgICAgICAgcFJzbmllX2NpcGhlci0+dWNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksIE9VSV9XUEEyX1RLSVAsIDQpOworICAgICAgICAgICAgICAgICpyc25fbGVuID0gc2l6ZW9mKFJTTklFMik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKwkJCS8vIEFFUyBtb2RlCisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ6CisJCQkJaWYgKGJNaXhDaXBoZXIpCisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBMl9US0lQLCA0KTsKKwkJCQllbHNlCisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBMl9DQ01QLCA0KTsKKyAgICAgICAgICAgICAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSAxOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQTJfQ0NNUCwgNCk7CisgICAgICAgICAgICAgICAgKnJzbl9sZW4gPSBzaXplb2YoUlNOSUUyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworCQkJLy8gVEtJUC1BRVMgbWl4IG1vZGUKKyAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZDoKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQTJfVEtJUCwgNCk7CisKKwkJCQlQYWlyd2lzZUNudCA9IDE7CisJCQkJLy8gSW5zZXJ0IFdQQTIgVEtJUCBhcyB0aGUgZmlyc3QgcGFpcndpc2UgY2lwaGVyCisJCQkJaWYgKE1JWF9DSVBIRVJfV1BBMl9US0lQX09OKEZsZXhpYmxlQ2lwaGVyKSkKKwkJCQl7CisgICAgICAgICAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQTJfVEtJUCwgNCk7CisJCQkJCS8vIEluc2VydCBXUEEyIEFFUyBhcyB0aGUgc2Vjb25kYXJ5IHBhaXJ3aXNlIGNpcGhlcgorCQkJCQlpZiAoTUlYX0NJUEhFUl9XUEEyX0FFU19PTihGbGV4aWJsZUNpcGhlcikpCisJCQkJCXsKKyAgICAgICAgICAgICAgICAJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSArIDQsIE9VSV9XUEEyX0NDTVAsIDQpOworCQkJCQkJUGFpcndpc2VDbnQgPSAyOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8vIEluc2VydCBXUEEyIEFFUyBhcyB0aGUgZmlyc3QgcGFpcndpc2UgY2lwaGVyCisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQTJfQ0NNUCwgNCk7CisJCQkJfQorCisgICAgICAgICAgICAgICAgcFJzbmllX2NpcGhlci0+dWNvdW50ID0gUGFpcndpc2VDbnQ7CisgICAgICAgICAgICAgICAgKnJzbl9sZW4gPSBzaXplb2YoUlNOSUUyKSArICg0ICogKFBhaXJ3aXNlQ250IC0gMSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKwkJLy8gc3dhcCBmb3IgYmlnLWVuZGlhbiBwbGF0Zm9ybQorCQlwUnNuaWVfY2lwaGVyLT52ZXJzaW9uID0gY3B1MmxlMTYocFJzbmllX2NpcGhlci0+dmVyc2lvbik7CisJICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IGNwdTJsZTE2KHBSc25pZV9jaXBoZXItPnVjb3VudCk7CisJfQorCWVsc2UKKwl7CisJCVJTTklFCSpwUnNuaWVfY2lwaGVyID0gKFJTTklFKilwUnNuSWU7CisKKwkJLy8gQXNzaWduIE9VSSBhbmQgdmVyc2lvbgorCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5vdWksIE9VSV9XUEFfVkVSU0lPTiwgNCk7CisgICAgICAgIHBSc25pZV9jaXBoZXItPnZlcnNpb24gPSAxOworCisJCXN3aXRjaCAoV2VwU3RhdHVzKQorCQl7CisJCQkvLyBUS0lQIG1vZGUKKyAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDoKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQV9US0lQLCA0KTsKKyAgICAgICAgICAgICAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSAxOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQV9US0lQLCA0KTsKKyAgICAgICAgICAgICAgICAqcnNuX2xlbiA9IHNpemVvZihSU05JRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKwkJCS8vIEFFUyBtb2RlCisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ6CisJCQkJaWYgKGJNaXhDaXBoZXIpCisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBX1RLSVAsIDQpOworCQkJCWVsc2UKKwkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEFfQ0NNUCwgNCk7CisgICAgICAgICAgICAgICAgcFJzbmllX2NpcGhlci0+dWNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksIE9VSV9XUEFfQ0NNUCwgNCk7CisgICAgICAgICAgICAgICAgKnJzbl9sZW4gPSBzaXplb2YoUlNOSUUpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisJCQkvLyBUS0lQLUFFUyBtaXggbW9kZQorICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjRFbmFibGVkOgorICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBX1RLSVAsIDQpOworCisJCQkJUGFpcndpc2VDbnQgPSAxOworCQkJCS8vIEluc2VydCBXUEEgVEtJUCBhcyB0aGUgZmlyc3QgcGFpcndpc2UgY2lwaGVyCisJCQkJaWYgKE1JWF9DSVBIRVJfV1BBX1RLSVBfT04oRmxleGlibGVDaXBoZXIpKQorCQkJCXsKKyAgICAgICAgICAgICAgICAJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBX1RLSVAsIDQpOworCQkJCQkvLyBJbnNlcnQgV1BBIEFFUyBhcyB0aGUgc2Vjb25kYXJ5IHBhaXJ3aXNlIGNpcGhlcgorCQkJCQlpZiAoTUlYX0NJUEhFUl9XUEFfQUVTX09OKEZsZXhpYmxlQ2lwaGVyKSkKKwkJCQkJeworICAgICAgICAgICAgICAgIAkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpICsgNCwgT1VJX1dQQV9DQ01QLCA0KTsKKwkJCQkJCVBhaXJ3aXNlQ250ID0gMjsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQkvLyBJbnNlcnQgV1BBIEFFUyBhcyB0aGUgZmlyc3QgcGFpcndpc2UgY2lwaGVyCisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQV9DQ01QLCA0KTsKKwkJCQl9CisKKyAgICAgICAgICAgICAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSBQYWlyd2lzZUNudDsKKyAgICAgICAgICAgICAgICAqcnNuX2xlbiA9IHNpemVvZihSU05JRSkgKyAoNCAqIChQYWlyd2lzZUNudCAtIDEpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisJCS8vIHN3YXAgZm9yIGJpZy1lbmRpYW4gcGxhdGZvcm0KKwkJcFJzbmllX2NpcGhlci0+dmVyc2lvbiA9IGNwdTJsZTE2KHBSc25pZV9jaXBoZXItPnZlcnNpb24pOworCSAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSBjcHUybGUxNihwUnNuaWVfY2lwaGVyLT51Y291bnQpOworCX0KKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQnVpbGQgQUtNIHN1aXRlIGluIFJTTi1JRS4KKwkJSXQgb25seSBzaGFsbCBiZSBjYWxsZWQgYnkgUlRNUE1ha2VSU05JRS4KKworCUFyZ3VtZW50czoKKwkJcEFkCQkJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0CisgICAgCUVsZW1lbnRJRAktCWluZGljYXRlIHRoZSBXUEExIG9yIFdQQTIKKyAgICAJQXV0aE1vZGUJLQlpbmRpY2F0ZSB0aGUgYXV0aGVudGljYXRpb24gbW9kZQorCQlhcGlkeAkJLQlpbmRpY2F0ZSB0aGUgaW50ZXJmYWNlIGluZGV4CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIFZPSUQgUlRNUEluc2VydFJzbkllQUtNKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCVVDSEFSCQkJRWxlbWVudElELAorCUlOCVVJTlQJCQlBdXRoTW9kZSwKKwlJTglVQ0hBUgkJCWFwaWR4LAorCU9VVAlQVUNIQVIJCQlwUnNuSWUsCisJT1VUCVVDSEFSCQkJKnJzbl9sZW4pCit7CisJUlNOSUVfQVVUSAkJKnBSc25pZV9hdXRoOworCisJcFJzbmllX2F1dGggPSAoUlNOSUVfQVVUSCopKHBSc25JZSArICgqcnNuX2xlbikpOworCisJLy8gZGVjaWRlIFdQQTIgb3IgV1BBMQorCWlmIChFbGVtZW50SUQgPT0gV3BhMkllKQorCXsKKwkJc3dpdGNoIChBdXRoTW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEEyOgorICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEExV1BBMjoKKyAgICAgICAgICAgICAgICBwUnNuaWVfYXV0aC0+YWNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICAJTmRpc01vdmVNZW1vcnkocFJzbmllX2F1dGgtPmF1dGhbMF0ub3VpLCBPVUlfV1BBMl84MDIxWF9BS00sIDQpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s6CisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLOgorICAgICAgICAgICAgICAgIHBSc25pZV9hdXRoLT5hY291bnQgPSAxOworICAgICAgICAgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwUnNuaWVfYXV0aC0+YXV0aFswXS5vdWksIE9VSV9XUEEyX1BTS19BS00sIDQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisJfQorCWVsc2UKKwl7CisJCXN3aXRjaCAoQXV0aE1vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBOgorICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEExV1BBMjoKKyAgICAgICAgICAgICAgICBwUnNuaWVfYXV0aC0+YWNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfYXV0aC0+YXV0aFswXS5vdWksIE9VSV9XUEFfODAyMVhfQUtNLCA0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s6CisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLOgorICAgICAgICAgICAgICAgIHBSc25pZV9hdXRoLT5hY291bnQgPSAxOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9hdXRoLT5hdXRoWzBdLm91aSwgT1VJX1dQQV9QU0tfQUtNLCA0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworCQkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOgorICAgICAgICAgICAgICAgIHBSc25pZV9hdXRoLT5hY291bnQgPSAxOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9hdXRoLT5hdXRoWzBdLm91aSwgT1VJX1dQQV9OT05FX0FLTSwgNCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwl9CisKKwlwUnNuaWVfYXV0aC0+YWNvdW50ID0gY3B1MmxlMTYocFJzbmllX2F1dGgtPmFjb3VudCk7CisKKwkoKnJzbl9sZW4pICs9IHNpemVvZihSU05JRV9BVVRIKTsJLy8gdXBkYXRlIGN1cnJlbnQgUlNOSUUgbGVuZ3RoCisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUJ1aWxkIGNhcGFiaWxpdHkgaW4gUlNOLUlFLgorCQlJdCBvbmx5IHNoYWxsIGJlIGNhbGxlZCBieSBSVE1QTWFrZVJTTklFLgorCisJQXJndW1lbnRzOgorCQlwQWQJCQktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKKyAgICAJRWxlbWVudElECS0JaW5kaWNhdGUgdGhlIFdQQTEgb3IgV1BBMgorCQlhcGlkeAkJLQlpbmRpY2F0ZSB0aGUgaW50ZXJmYWNlIGluZGV4CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIFZPSUQgUlRNUEluc2VydFJzbkllQ2FwKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCVVDSEFSCQkJRWxlbWVudElELAorCUlOCVVDSEFSCQkJYXBpZHgsCisJT1VUCVBVQ0hBUgkJCXBSc25JZSwKKwlPVVQJVUNIQVIJCQkqcnNuX2xlbikKK3sKKwlSU05fQ0FQQUJJTElUSUVTICAgICpwUlNOX0NhcDsKKworCS8vIGl0IGNvdWxkIGJlIGlnbm9yZWQgaW4gV1BBMSBtb2RlCisJaWYgKEVsZW1lbnRJRCA9PSBXcGFJZSkKKwkJcmV0dXJuOworCisJcFJTTl9DYXAgPSAoUlNOX0NBUEFCSUxJVElFUyopKHBSc25JZSArICgqcnNuX2xlbikpOworCisKKwlwUlNOX0NhcC0+d29yZCA9IGNwdTJsZTE2KHBSU05fQ2FwLT53b3JkKTsKKworCSgqcnNuX2xlbikgKz0gc2l6ZW9mKFJTTl9DQVBBQklMSVRJRVMpOwkvLyB1cGRhdGUgY3VycmVudCBSU05JRSBsZW5ndGgKKworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlCdWlsZCBSU04gSUUgY29udGV4dC4gSXQgaXMgbm90IGluY2x1ZGVkIGVsZW1lbnQtSUQgYW5kIGxlbmd0aC4KKworCUFyZ3VtZW50czoKKwkJcEFkCQkJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0CisgICAgCUF1dGhNb2RlCS0JaW5kaWNhdGUgdGhlIGF1dGhlbnRpY2F0aW9uIG1vZGUKKyAgICAJV2VwU3RhdHVzCS0JaW5kaWNhdGUgdGhlIGVuY3J5cHRpb24gdHlwZQorCQlhcGlkeAkJLQlpbmRpY2F0ZSB0aGUgaW50ZXJmYWNlIGluZGV4CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QTWFrZVJTTklFKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBVSU5UICAgICAgICAgICAgQXV0aE1vZGUsCisgICAgSU4gIFVJTlQgICAgICAgICAgICBXZXBTdGF0dXMsCisJSU4JVUNIQVIJCQlhcGlkeCkKK3sKKwlQVUNIQVIJCXBSc25JZSA9IE5VTEw7CQkJLy8gcHJpbWFyeSBSU05JRQorCVVDSEFSIAkJKnJzbmllbGVuX2N1cl9wID0gMDsJLy8gdGhlIGxlbmd0aCBvZiB0aGUgcHJpbWFyeSBSU05JRQorCVVDSEFSCQkqcnNuaWVsZW5fZXhfY3VyX3AgPSAwOwkvLyB0aGUgbGVuZ3RoIG9mIHRoZSBzZWNvbmRhcnkgUlNOSUUKKwlVQ0hBUgkJUHJpbWFyeVJzbmllOworCUJPT0xFQU4JCWJNaXhDaXBoZXIgPSBGQUxTRTsJLy8gaW5kaWNhdGUgdGhlIHBhaXJ3aXNlIGFuZCBncm91cCBjaXBoZXIgYXJlIGRpZmZlcmVudAorCVVDSEFSCQlwX29mZnNldDsKKwlXUEFfTUlYX1BBSVJfQ0lQSEVSCQlGbGV4aWJsZUNpcGhlciA9IE1JWF9DSVBIRVJfTk9UVVNFOwkvLyBpdCBwcm92aWRlIHRoZSBtb3JlIGZsZXhpYmxlIGNpcGhlciBjb21iaW5hdGlvbiBpbiBXUEEtV1BBMiBhbmQgVEtJUEFFUyBtb2RlCisKKwlyc25pZWxlbl9jdXJfcCA9IE5VTEw7CisJcnNuaWVsZW5fZXhfY3VyX3AgPSBOVUxMOworCisJeworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQkJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQorCQkJeworCQkJCWlmIChBdXRoTW9kZSA8IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKwkJCQkJcmV0dXJuOworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwkJCXsKKwkJCQkvLyBTdXBwb3J0IFdQQVBTSyBvciBXUEEyUFNLIGluIFNUQS1JbmZyYSBtb2RlCisJCQkJLy8gU3VwcG9ydCBXUEFOb25lIGluIFNUQS1BZGhvYyBtb2RlCisJCQkJaWYgKChBdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spICYmCisJCQkJCShBdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSAmJgorCQkJCQkoQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKwkJCQkJKQorCQkJCQlyZXR1cm47CisJCQl9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiPT0+IFJUTVBNYWtlUlNOSUUoU1RBKVxuIikpOworCisJCQkvLyBaZXJvIFJTTklFIGNvbnRleHQKKwkJCXBBZC0+U3RhQ2ZnLlJTTklFX0xlbiA9IDA7CisJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5SU05fSUUsIE1BWF9MRU5fT0ZfUlNOSUUpOworCisJCQkvLyBQb2ludGVyIHRvIFJTTklFCisJCQlyc25pZWxlbl9jdXJfcCA9ICZwQWQtPlN0YUNmZy5SU05JRV9MZW47CisJCQlwUnNuSWUgPSBwQWQtPlN0YUNmZy5SU05fSUU7CisKKwkJCWJNaXhDaXBoZXIgPSBwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfQorCisJLy8gaW5kaWNhdGUgcHJpbWFyeSBSU05JRSBhcyBXUEEgb3IgV1BBMgorCWlmICgoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAorCQkoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAorCQkoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkgfHwKKwkJKEF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyKSB8fAorCQkoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0spKQorCQlQcmltYXJ5UnNuaWUgPSBXcGFJZTsKKwllbHNlCisJCVByaW1hcnlSc25pZSA9IFdwYTJJZTsKKworCXsKKwkJLy8gQnVpbGQgdGhlIHByaW1hcnkgUlNOSUUKKwkJLy8gMS4gaW5zZXJ0IGNpcGhlciBzdWl0ZQorCQlSVE1QSW5zZXJ0UnNuSWVDaXBoZXIocEFkLCBQcmltYXJ5UnNuaWUsIFdlcFN0YXR1cywgYk1peENpcGhlciwgRmxleGlibGVDaXBoZXIsIHBSc25JZSwgJnBfb2Zmc2V0KTsKKworCQkvLyAyLiBpbnNlcnQgQUtNCisJCVJUTVBJbnNlcnRSc25JZUFLTShwQWQsIFByaW1hcnlSc25pZSwgQXV0aE1vZGUsIGFwaWR4LCBwUnNuSWUsICZwX29mZnNldCk7CisKKwkJLy8gMy4gaW5zZXJ0IGNhcGFiaWxpdHkKKwkJUlRNUEluc2VydFJzbkllQ2FwKHBBZCwgUHJpbWFyeVJzbmllLCBhcGlkeCwgcFJzbkllLCAmcF9vZmZzZXQpOworCX0KKworCS8vIDQuIHVwZGF0ZSB0aGUgUlNOSUUgbGVuZ3RoCisJKnJzbmllbGVuX2N1cl9wID0gcF9vZmZzZXQ7CisKKwloZXhfZHVtcCgiVGhlIHByaW1hcnkgUlNOSUUiLCBwUnNuSWUsICgqcnNuaWVsZW5fY3VyX3ApKTsKKworCit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKwkJQ2hlY2sgd2hldGhlciB0aGUgcmVjZWl2ZWQgZnJhbWUgaXMgRUFQIGZyYW1lLgorCisJQXJndW1lbnRzOgorCQlwQWQJCQkJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0CisJCXBFbnRyeQkJCS0JcG9pbnRlciB0byBhY3RpdmUgZW50cnkKKwkJcERhdGEJCQktCXRoZSByZWNlaXZlZCBmcmFtZQorCQlEYXRhQnl0ZUNvdW50IAktCXRoZSByZWNlaXZlZCBmcmFtZSdzIGxlbmd0aAorCQlGcm9tV2hpY2hCU1NJRAktCWluZGljYXRlIHRoZSBpbnRlcmZhY2UgaW5kZXgKKworICAgIFJldHVybjoKKyAgICAgICAgIFRSVUUgCQkJLQlUaGlzIGZyYW1lIGlzIEVBUCBmcmFtZQorICAgICAgICAgRkFMU0UgCQkJLQlvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gUlRNUENoZWNrV1BBZnJhbWUoCisgICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisgICAgSU4gUE1BQ19UQUJMRV9FTlRSWQlwRW50cnksCisgICAgSU4gUFVDSEFSICAgICAgICAgICBwRGF0YSwKKyAgICBJTiBVTE9ORyAgICAgICAgICAgIERhdGFCeXRlQ291bnQsCisJSU4gVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKwlVTE9ORwlCb2R5X2xlbjsKKwlCT09MRUFOIENhbmNlbGxlZDsKKworCisgICAgaWYoRGF0YUJ5dGVDb3VudCA8IChMRU5HVEhfODAyXzFfSCArIExFTkdUSF9FQVBPTF9IKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisKKwkvLyBTa2lwIExMQyBoZWFkZXIKKyAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KFNOQVBfODAyXzFILCBwRGF0YSwgNikgfHwKKyAgICAgICAgLy8gQ2lzY28gMTIwMCBBUCBtYXkgc2VuZCBwYWNrZXQgd2l0aCBTTkFQX0JSSURHRV9UVU5ORUwKKyAgICAgICAgTmRpc0VxdWFsTWVtb3J5KFNOQVBfQlJJREdFX1RVTk5FTCwgcERhdGEsIDYpKQorICAgIHsKKyAgICAgICAgcERhdGEgKz0gNjsKKyAgICB9CisJLy8gU2tpcCAyLWJ5dGVzIEVBUG9MIHR5cGUKKyAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KEVBUE9MLCBwRGF0YSwgMikpCisgICAgeworICAgICAgICBwRGF0YSArPSAyOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHN3aXRjaCAoKihwRGF0YSsxKSkKKyAgICB7CisgICAgICAgIGNhc2UgRUFQUGFja2V0OgorCQkJQm9keV9sZW4gPSAoKihwRGF0YSsyKTw8OCkgfCAoKihwRGF0YSszKSk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUC1QYWNrZXQgZnJhbWUsIFRZUEUgPSAwLCBMZW5ndGggPSAlbGRcbiIsIEJvZHlfbGVuKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFQVBPTFN0YXJ0OgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTC1TdGFydCBmcmFtZSwgVFlQRSA9IDEgXG4iKSk7CisJCQlpZiAocEVudHJ5LT5FbnF1ZXVlRWFwb2xTdGFydFRpbWVyUnVubmluZyAhPSBFQVBPTF9TVEFSVF9ESVNBQkxFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNhbmNlbCB0aGUgRW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgXG4iKSk7CisgICAgICAgICAgICAgICAgUlRNUENhbmNlbFRpbWVyKCZwRW50cnktPkVucXVldWVTdGFydEZvclBTS1RpbWVyLCAmQ2FuY2VsbGVkKTsKKyAgICAgICAgICAgICAgICBwRW50cnktPkVucXVldWVFYXBvbFN0YXJ0VGltZXJSdW5uaW5nID0gRUFQT0xfU1RBUlRfRElTQUJMRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVBUE9MTG9nb2ZmOgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTExvZ29mZiBmcmFtZSwgVFlQRSA9IDIgXG4iKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFQVBPTEtleToKKwkJCUJvZHlfbGVuID0gKCoocERhdGErMik8PDgpIHwgKCoocERhdGErMykpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTC1LZXkgZnJhbWUsIFRZUEUgPSAzLCBMZW5ndGggPSAlbGRcbiIsIEJvZHlfbGVuKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFQVBPTEFTRkFsZXJ0OgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTEFTRkFsZXJ0IGZyYW1lLCBUWVBFID0gNCBcbiIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgfQorICAgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgRU5DUllQVCBBRVMgR1RLIGJlZm9yZSBzZW5kaW5nIGluIEVBUE9MIGZyYW1lLgorICAgICAgICBBRVMgR1RLIGxlbmd0aCA9IDEyOCBiaXQsICBzbyBmaXggYmxvY2tzIGZvciBhZXMta2V5LXdyYXAgYXMgMiBpbiB0aGlzIGZ1bmN0aW9uLgorICAgICAgICBUaGlzIGZ1bmN0aW9uIHJlZmVyZW5jZXMgdG8gUkZDIDMzOTQgZm9yIGFlcyBrZXkgd3JhcCBhbGdvcml0aG0uCisgICAgUmV0dXJuOgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBBRVNfR1RLX0tFWV9XUkFQKAorICAgIElOIFVDSEFSICAgICprZXksCisgICAgSU4gVUNIQVIgICAgKnBsYWludGV4dCwKKyAgICBJTiBVQ0hBUiAgICBwX2xlbiwKKyAgICBPVVQgVUNIQVIgICAqY2lwaGVydGV4dCkKK3sKKyAgICBVQ0hBUiAgICAgICBBWzhdLCBCSU5bMTZdLCBCT1VUWzE2XTsKKyAgICBVQ0hBUiAgICAgICBSWzUxMl07CisgICAgSU5UICAgICAgICAgbnVtX2Jsb2NrcyA9IHBfbGVuLzg7ICAgLy8gdW5pdDo2NGJpdHMKKyAgICBJTlQgICAgICAgICBpLCBqOworICAgIGFlc19jb250ZXh0IGFlc2N0eDsKKyAgICBVQ0hBUiAgICAgICB4b3I7CisKKyAgICBydG1wX2Flc19zZXRfa2V5KCZhZXNjdHgsIGtleSwgMTI4KTsKKworICAgIC8vIEluaXQgSUEKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICBBW2ldID0gMHhhNjsKKworICAgIC8vSW5wdXQgcGxhaW50ZXh0CisgICAgZm9yIChpID0gMDsgaSA8IG51bV9ibG9ja3M7IGkrKykKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDAgOyBqIDwgODsgaisrKQorICAgICAgICAgICAgUls4ICogKGkgKyAxKSArIGpdID0gcGxhaW50ZXh0WzggKiBpICsgal07CisgICAgfQorCisgICAgLy8gS2V5IE1peAorICAgIGZvciAoaiA9IDA7IGogPCA2OyBqKyspCisgICAgeworICAgICAgICBmb3IoaSA9IDE7IGkgPD0gbnVtX2Jsb2NrczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAvL3BoYXNlIDEKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KEJJTiwgQSwgOCk7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeSgmQklOWzhdLCAmUls4ICogaV0sIDgpOworICAgICAgICAgICAgcnRtcF9hZXNfZW5jcnlwdCgmYWVzY3R4LCBCSU4sIEJPVVQpOworCisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShBLCAmQk9VVFswXSwgOCk7CisgICAgICAgICAgICB4b3IgPSBudW1fYmxvY2tzICogaiArIGk7CisgICAgICAgICAgICBBWzddID0gQk9VVFs3XSBeIHhvcjsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZSWzggKiBpXSwgJkJPVVRbOF0sIDgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gT3V0cHV0IGNpcGhlcnRleHQKKyAgICBOZGlzTW92ZU1lbW9yeShjaXBoZXJ0ZXh0LCBBLCA4KTsKKworICAgIGZvciAoaSA9IDE7IGkgPD0gbnVtX2Jsb2NrczsgaSsrKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMCA7IGogPCA4OyBqKyspCisgICAgICAgICAgICBjaXBoZXJ0ZXh0WzggKiBpICsgal0gPSBSWzggKiBpICsgal07CisgICAgfQorfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlNaXNjIGZ1bmN0aW9uIHRvIGRlY3J5cHQgQUVTIGJvZHkKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisJCVRoaXMgZnVuY3Rpb24gcmVmZXJlbmNlcyB0bwlSRkMJMzM5NCBmb3IgYWVzIGtleSB1bndyYXAgYWxnb3JpdGhtLgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlBRVNfR1RLX0tFWV9VTldSQVAoCisJSU4JVUNIQVIJKmtleSwKKwlPVVQJVUNIQVIJKnBsYWludGV4dCwKKwlJTglVQ0hBUiAgICBjX2xlbiwKKwlJTglVQ0hBUgkqY2lwaGVydGV4dCkKKworeworCVVDSEFSICAgICAgIEFbOF0sIEJJTlsxNl0sIEJPVVRbMTZdOworCVVDSEFSICAgICAgIHhvcjsKKwlJTlQgICAgICAgICBpLCBqOworCWFlc19jb250ZXh0IGFlc2N0eDsKKwlVQ0hBUiAgICAgICAqUjsKKwlJTlQgICAgICAgICBudW1fYmxvY2tzID0gY19sZW4vODsJLy8gdW5pdDo2NGJpdHMKKworCisJb3NfYWxsb2NfbWVtKE5VTEwsIChQVUNIQVIgKikmUiwgNTEyKTsKKworCWlmIChSID09IE5VTEwpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIhISFBRVNfR1RLX0tFWV9VTldSQVA6IG5vIG1lbW9yeSEhIVxuIikpOworICAgICAgICByZXR1cm47CisgICAgfSAvKiBFbmQgb2YgaWYgKi8KKworCS8vIEluaXRpYWxpemUKKwlOZGlzTW92ZU1lbW9yeShBLCBjaXBoZXJ0ZXh0LCA4KTsKKwkvL0lucHV0IHBsYWludGV4dAorCWZvcihpID0gMDsgaSA8IChjX2xlbi04KTsgaSsrKQorCXsKKwkJUlsgaV0gPSBjaXBoZXJ0ZXh0W2kgKyA4XTsKKwl9CisKKwlydG1wX2Flc19zZXRfa2V5KCZhZXNjdHgsIGtleSwgMTI4KTsKKworCWZvcihqID0gNTsgaiA+PSAwOyBqLS0pCisJeworCQlmb3IoaSA9IChudW1fYmxvY2tzLTEpOyBpID4gMDsgaS0tKQorCQl7CisJCQl4b3IgPSAobnVtX2Jsb2NrcyAtMSApKiBqICsgaTsKKwkJCU5kaXNNb3ZlTWVtb3J5KEJJTiwgQSwgOCk7CisJCQlCSU5bN10gPSBBWzddIF4geG9yOworCQkJTmRpc01vdmVNZW1vcnkoJkJJTls4XSwgJlJbKGktMSkqOF0sIDgpOworCQkJcnRtcF9hZXNfZGVjcnlwdCgmYWVzY3R4LCBCSU4sIEJPVVQpOworCQkJTmRpc01vdmVNZW1vcnkoQSwgJkJPVVRbMF0sIDgpOworCQkJTmRpc01vdmVNZW1vcnkoJlJbKGktMSkqOF0sICZCT1VUWzhdLCA4KTsKKwkJfQorCX0KKworCS8vIE9VVFBVVAorCWZvcihpID0gMDsgaSA8IGNfbGVuOyBpKyspCisJeworCQlwbGFpbnRleHRbaV0gPSBSW2ldOworCX0KKworCisJb3NfZnJlZV9tZW0oTlVMTCwgUik7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKwkJUmVwb3J0IHRoZSBFQVAgbWVzc2FnZSB0eXBlCisKKwlBcmd1bWVudHM6CisJCW1zZwkJLQlFQVBPTF9QQUlSX01TR18xCisJCQkJCUVBUE9MX1BBSVJfTVNHXzIKKwkJCQkJRUFQT0xfUEFJUl9NU0dfMworCQkJCQlFQVBPTF9QQUlSX01TR180CisJCQkJCUVBUE9MX0dST1VQX01TR18xCisJCQkJCUVBUE9MX0dST1VQX01TR18yCisKKyAgICBSZXR1cm46CisgICAgICAgICBtZXNzYWdlIHR5cGUgc3RyaW5nCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0NIQVIgKkdldEVhcG9sTXNnVHlwZShDSEFSIG1zZykKK3sKKyAgICBpZihtc2cgPT0gRUFQT0xfUEFJUl9NU0dfMSkKKyAgICAgICAgcmV0dXJuICJQYWlyd2lzZSBNZXNzYWdlIDEiOworICAgIGVsc2UgaWYobXNnID09IEVBUE9MX1BBSVJfTVNHXzIpCisgICAgICAgIHJldHVybiAiUGFpcndpc2UgTWVzc2FnZSAyIjsKKwllbHNlIGlmKG1zZyA9PSBFQVBPTF9QQUlSX01TR18zKQorICAgICAgICByZXR1cm4gIlBhaXJ3aXNlIE1lc3NhZ2UgMyI7CisJZWxzZSBpZihtc2cgPT0gRUFQT0xfUEFJUl9NU0dfNCkKKyAgICAgICAgcmV0dXJuICJQYWlyd2lzZSBNZXNzYWdlIDQiOworCWVsc2UgaWYobXNnID09IEVBUE9MX0dST1VQX01TR18xKQorICAgICAgICByZXR1cm4gIkdyb3VwIE1lc3NhZ2UgMSI7CisJZWxzZSBpZihtc2cgPT0gRUFQT0xfR1JPVVBfTVNHXzIpCisgICAgICAgIHJldHVybiAiR3JvdXAgTWVzc2FnZSAyIjsKKyAgICBlbHNlCisgICAgCXJldHVybiAiSW52YWxpZCBNZXNzYWdlIjsKK30KKworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBDaGVjayBTYW5pdHkgUlNOIElFIG9mIEVBUG9MIG1lc3NhZ2UKKworICAgIEFyZ3VtZW50czoKKworICAgIFJldHVybiBWYWx1ZToKKworCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBSVE1QQ2hlY2tSU05JRSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEYXRhLAorCUlOICBVQ0hBUiAgICAgICAgICAgRGF0YUxlbiwKKwlJTiAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnksCisJT1VUCVVDSEFSCQkJKk9mZnNldCkKK3sKKwlQVUNIQVIgICAgICAgICAgICAgIHBWSUU7CisJVUNIQVIgICAgICAgICAgICAgICBsZW47CisJUEVJRF9TVFJVQ1QgICAgICAgICBwRWlkOworCUJPT0xFQU4JCQkJcmVzdWx0ID0gRkFMU0U7CisKKwlwVklFID0gcERhdGE7CisJbGVuCSA9IERhdGFMZW47CisJKk9mZnNldCA9IDA7CisKKwl3aGlsZSAobGVuID4gc2l6ZW9mKFJTTklFMikpCisJeworCQlwRWlkID0gKFBFSURfU1RSVUNUKSBwVklFOworCQkvLyBXUEEgUlNOIElFCisJCWlmICgocEVpZC0+RWlkID09IElFX1dQQSkgJiYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV1BBX09VSSwgNCkpKQorCQl7CisJCQlpZiAoKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBIHx8IHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSAmJgorCQkJCShOZGlzRXF1YWxNZW1vcnkocFZJRSwgcEVudHJ5LT5SU05fSUUsIHBFbnRyeS0+UlNOSUVfTGVuKSkgJiYKKwkJCQkocEVudHJ5LT5SU05JRV9MZW4gPT0gKHBFaWQtPkxlbiArIDIpKSkKKwkJCXsKKwkJCQkJcmVzdWx0ID0gVFJVRTsKKwkJCX0KKworCQkJKk9mZnNldCArPSAocEVpZC0+TGVuICsgMik7CisJCX0KKwkJLy8gV1BBMiBSU04gSUUKKwkJZWxzZSBpZiAoKHBFaWQtPkVpZCA9PSBJRV9SU04pICYmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQgKyAyLCBSU05fT1VJLCAzKSkpCisJCXsKKwkJCWlmICgocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyIHx8IHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgJiYKKwkJCQkoTmRpc0VxdWFsTWVtb3J5KHBWSUUsIHBFbnRyeS0+UlNOX0lFLCBwRW50cnktPlJTTklFX0xlbikpICYmCisJCQkJKHBFbnRyeS0+UlNOSUVfTGVuID09IChwRWlkLT5MZW4gKyAyKSkvKiBUb0RvLUFsYmVydFkgZm9yIG1lc2gqLykKKwkJCXsKKwkJCQkJcmVzdWx0ID0gVFJVRTsKKwkJCX0KKworCQkJKk9mZnNldCArPSAocEVpZC0+TGVuICsgMik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlicmVhazsKKwkJfQorCisJCXBWSUUgKz0gKHBFaWQtPkxlbiArIDIpOworCQlsZW4gIC09IChwRWlkLT5MZW4gKyAyKTsKKwl9CisKKworCXJldHVybiByZXN1bHQ7CisKK30KKworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBQYXJzZSBLRVlEQVRBIGZpZWxkLiAgS0VZREFUQVtdIE1heSBjb250YWluIDIgUlNOIElFIGFuZCBvcHRpb25hbGx5IEdUSy4KKyAgICBHVEsgIGlzIGVuY2FwdHVsYXRlZCBpbiBLREUgZm9ybWF0IGF0ICBwLjgzIDgwMi4xMWkgRDEwCisKKyAgICBBcmd1bWVudHM6CisKKyAgICBSZXR1cm4gVmFsdWU6CisKKyAgICBOb3RlOgorICAgICAgICA4MDIuMTFpIEQxMAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBSVE1QUGFyc2VFYXBvbEtleURhdGEoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwS2V5RGF0YSwKKwlJTiAgVUNIQVIgICAgICAgICAgIEtleURhdGFMZW4sCisJSU4JVUNIQVIJCQlHcm91cEtleUluZGV4LAorCUlOCVVDSEFSCQkJTXNnVHlwZSwKKwlJTglCT09MRUFOCQkJYldQQTIsCisJSU4gIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5KQoreworICAgIFBLREVfRU5DQVAgICAgICAgICAgcEtERSA9IE5VTEw7CisgICAgUFVDSEFSICAgICAgICAgICAgICBwTXlLZXlEYXRhID0gcEtleURhdGE7CisgICAgVUNIQVIgICAgICAgICAgICAgICBLZXlEYXRhTGVuZ3RoID0gS2V5RGF0YUxlbjsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIEdUS0xFTiA9IDA7CisJVUNIQVIJCQkJRGVmYXVsdElkeCA9IDA7CisJVUNIQVIJCQkJc2tpcF9vZmZzZXQ7CisKKwkvLyBWZXJpZnkgVGhlIFJTTiBJRSBjb250YWluZWQgaW4gcGFpcmV3aXNlX21zZ18yICYmIHBhaXJld2lzZV9tc2dfMyBhbmQgc2tpcCBpdAorCWlmIChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzIgfHwgTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKQorICAgIHsKKwkJLy8gQ2hlY2sgUlNOIElFIHdoZXRoZXIgaXQgaXMgV1BBMi9XUEEyUFNLCisJCWlmICghUlRNUENoZWNrUlNOSUUocEFkLCBwS2V5RGF0YSwgS2V5RGF0YUxlbiwgcEVudHJ5LCAmc2tpcF9vZmZzZXQpKQorCQl7CisJCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIFJTTiBJRSBkaWZmZXJlbnQKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19SU05JRV9ESUZGX0VWRU5UX0ZMQUcsIHBFbnRyeS0+QWRkciwgcEVudHJ5LT5hcGlkeCwgMCk7CisKKyAgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJTTl9JRSBEaWZmZXJlbnQgaW4gbXNnICVkIG9mIDQtd2F5IGhhbmRzaGFrZSFcbiIsIE1zZ1R5cGUpKTsKKwkJCWhleF9kdW1wKCJSZWNlaXZlIFJTTl9JRSAiLCBwS2V5RGF0YSwgS2V5RGF0YUxlbik7CisJCQloZXhfZHVtcCgiRGVzaXJlZCBSU05fSUUgIiwgcEVudHJ5LT5SU05fSUUsIHBFbnRyeS0+UlNOSUVfTGVuKTsKKworCQkJcmV0dXJuIEZBTFNFOworICAgIAl9CisgICAgCWVsc2UKKwkJeworCQkJaWYgKGJXUEEyICYmIE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykKKwkJCXsKKwkJCQkvLyBza2lwIFJTTiBJRQorCQkJCXBNeUtleURhdGEgKz0gc2tpcF9vZmZzZXQ7CisJCQkJS2V5RGF0YUxlbmd0aCAtPSBza2lwX29mZnNldDsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QUGFyc2VFYXBvbEtleURhdGEgPT0+IFdQQTIvV1BBMlBTSyBSU04gSUUgbWF0Y2hlZCBpbiBNc2cgMywgTGVuZ3RoKCVkKSBcbiIsIHNraXBfb2Zmc2V0KSk7CisJCQl9CisJCQllbHNlCisJCQkJcmV0dXJuIFRSVUU7CisJCX0KKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBQYXJzZUVhcG9sS2V5RGF0YSA9PT4gS2V5RGF0YUxlbmd0aCAlZCB3aXRob3V0IFJTTl9JRSBcbiIsIEtleURhdGFMZW5ndGgpKTsKKworCS8vIFBhcnNlIEVLRCBmb3JtYXQgaW4gcGFpcndpc2VfbXNnXzNfV1BBMiAmJiBncm91cF9tc2dfMV9XUEEyCisJaWYgKGJXUEEyICYmIChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMgfHwgTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpCisJeworCQlpZiAoS2V5RGF0YUxlbmd0aCA+PSA4KQkvLyBLREUgZm9ybWF0IGV4Y2x1ZGUgR1RLIGxlbmd0aAorICAgIAl7CisgICAgICAgIAlwS0RFID0gKFBLREVfRU5DQVApIHBNeUtleURhdGE7CisKKworCQkJRGVmYXVsdElkeCA9IHBLREUtPkdUS0VuY2FwLktpZDsKKworCQkJLy8gU2FuaXR5IGNoZWNrIC0gS0VEIGxlbmd0aAorCQkJaWYgKEtleURhdGFMZW5ndGggPCAocEtERS0+TGVuICsgMikpCisgICAgCQl7CisgICAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1I6IFRoZSBsZW4gZnJvbSBLREUgaXMgdG9vIHNob3J0IFxuIikpOworICAgICAgICAJCXJldHVybiBGQUxTRTsKKyAgICAJCX0KKworCQkJLy8gR2V0IEdUSyBsZW5ndGggLSByZWZlciB0byBJRUVFIDgwMi4xMWktMjAwNCBwLjgyCisJCQlHVEtMRU4gPSBwS0RFLT5MZW4gLTY7CisJCQlpZiAoR1RLTEVOIDwgTEVOX0FFU19LRVkpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1I6IEdUSyBLZXkgbGVuZ3RoIGlzIHRvbyBzaG9ydCAoJWQpIFxuIiwgR1RLTEVOKSk7CisgICAgICAgIAkJcmV0dXJuIEZBTFNFOworCQkJfQorCisgICAgCX0KKwkJZWxzZQorICAgIAl7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUjogS0RFIGZvcm1hdCBsZW5ndGggaXMgdG9vIHNob3J0IFxuIikpOworCSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIAl9CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiR1RLIGluIEtERSBmb3JtYXQgLERlZmF1bHRLZXlJRD0lZCwgS2V5TGVuPSVkIFxuIiwgRGVmYXVsdElkeCwgR1RLTEVOKSk7CisJCS8vIHNraXAgaXQKKwkJcE15S2V5RGF0YSArPSA4OworCQlLZXlEYXRhTGVuZ3RoIC09IDg7CisKKwl9CisJZWxzZSBpZiAoIWJXUEEyICYmIE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpCisJeworCQlEZWZhdWx0SWR4ID0gR3JvdXBLZXlJbmRleDsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiR1RLIERlZmF1bHRLZXlJRD0lZCBcbiIsIERlZmF1bHRJZHgpKTsKKwl9CisKKwkvLyBTYW5pdHkgY2hlY2sgLSBzaGFyZWQga2V5IGluZGV4IG11c3QgYmUgMSB+IDMKKwlpZiAoRGVmYXVsdElkeCA8IDEgfHwgRGVmYXVsdElkeCA+IDMpCisgICAgeworICAgICAJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1I6IEdUSyBLZXkgaW5kZXgoJWQpIGlzIGludmFsaWQgaW4gJXMgJXMgXG4iLCBEZWZhdWx0SWR4LCAoKGJXUEEyKSA/ICJXUEEyIiA6ICJXUEEiKSwgR2V0RWFwb2xNc2dUeXBlKE1zZ1R5cGUpKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCS8vIFRvZG8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCXJldHVybiBUUlVFOworCit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNvbnN0cnVjdCBFQVBvTCBtZXNzYWdlIGZvciBXUEEgaGFuZHNoYWtpbmcKKwkJSXRzIGZvcm1hdCBpcyBiZWxvdywKKworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgUHJvdG9jb2wgVmVyc2lvbgkgfCAgMSBvY3RldAorCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgUHJvdG9jb2wgVHlwZQkJIHwJMSBvY3RldAorCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgQm9keSBMZW5ndGgJCSB8ICAyIG9jdGV0cworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgRGVzY3JpcHRvciBUeXBlCSB8CTEgb2N0ZXQKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBJbmZvcm1hdGlvbiAgICB8CTIgb2N0ZXRzCisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBLZXkgTGVuZ3RoCSAgICAgfCAgMSBvY3RldAorCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgS2V5IFJlcGFseSBDb3VudGVyIHwJOCBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBOb25jZQkJICAgICB8ICAzMiBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBJVgkJCSB8ICAxNiBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBSU0MJCQkgfCAgOCBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBJRCBvciBSZXNlcnZlZCB8CTggb2N0ZXRzCisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBLZXkgTUlDCQkJIHwJMTYgb2N0ZXRzCisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBLZXkgRGF0YSBMZW5ndGgJIHwJMiBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBEYXRhCQkJIHwJbiBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCisKKwlBcmd1bWVudHM6CisJCXBBZAkJCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQ29uc3RydWN0RWFwb2xNc2coCisJSU4gCVBSVE1QX0FEQVBURVIgICAgCXBBZCwKKyAgICBJTiAJVUNIQVIJCQkJQXV0aE1vZGUsCisgICAgSU4gCVVDSEFSCQkJCVdlcFN0YXR1cywKKyAgICBJTiAJVUNIQVIJCQkJR3JvdXBLZXlXZXBTdGF0dXMsCisgICAgSU4gCVVDSEFSCQkJCU1zZ1R5cGUsCisgICAgSU4JVUNIQVIJCQkJRGVmYXVsdEtleUlkeCwKKyAgICBJTiAJVUNIQVIJCQkJKlJlcGxheUNvdW50ZXIsCisJSU4gCVVDSEFSCQkJCSpLZXlOb25jZSwKKwlJTglVQ0hBUgkJCQkqVHhSU0MsCisJSU4JVUNIQVIJCQkJKlBUSywKKwlJTglVQ0hBUgkJCQkqR1RLLAorCUlOCVVDSEFSCQkJCSpSU05JRSwKKwlJTglVQ0hBUgkJCQlSU05JRV9MZW4sCisgICAgT1VUIFBFQVBPTF9QQUNLRVQgICAgICAgcE1zZykKK3sKKwlCT09MRUFOCWJXUEEyID0gRkFMU0U7CisKKwkvLyBDaG9vc2UgV1BBMiBvciBub3QKKwlpZiAoKEF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8IChBdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKKwkJYldQQTIgPSBUUlVFOworCisgICAgLy8gSW5pdCBQYWNrZXQgYW5kIEZpbGwgaGVhZGVyCisgICAgcE1zZy0+UHJvVmVyID0gRUFQT0xfVkVSOworICAgIHBNc2ctPlByb1R5cGUgPSBFQVBPTEtleTsKKworCS8vIERlZmF1bHQgOTUgYnl0ZXMsIHRoZSBFQVBvTC1LZXkgZGVzY3JpcHRvciBleGNsdWRlIEtleS1kYXRhIGZpZWxkCisJcE1zZy0+Qm9keV9MZW5bMV0gPSBMRU5fRUFQT0xfS0VZX01TRzsKKworCS8vIEZpbGwgaW4gRUFQb0wgZGVzY3JpcHRvcgorCWlmIChiV1BBMikKKwkJcE1zZy0+S2V5RGVzYy5UeXBlID0gV1BBMl9LRVlfREVTQzsKKwllbHNlCisJCXBNc2ctPktleURlc2MuVHlwZSA9IFdQQTFfS0VZX0RFU0M7CisKKwkvLyBGaWxsIGluIEtleSBpbmZvcm1hdGlvbiwgcmVmZXIgdG8gSUVFRSBTdGQgODAyLjExaS0yMDA0IHBhZ2UgNzgKKwkvLyBXaGVuIGVpdGhlciB0aGUgcGFpcndpc2Ugb3IgdGhlIGdyb3VwIGNpcGhlciBpcyBBRVMsIHRoZSBERVNDX1RZUEVfQUVTKDIpIHNoYWxsIGJlIHVzZWQuCisJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPQorICAgICAgICAJKCgoV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpIHx8IChHcm91cEtleVdlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkgPyAoREVTQ19UWVBFX0FFUykgOiAoREVTQ19UWVBFX1RLSVApKTsKKworCS8vIFNwZWNpZnkgS2V5IFR5cGUgYXMgR3JvdXAoMCkgb3IgUGFpcndpc2UoMSkKKwlpZiAoTXNnVHlwZSA+PSBFQVBPTF9HUk9VUF9NU0dfMSkKKwkJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLktleVR5cGUgPSBHUk9VUEtFWTsKKwllbHNlCisJCXBNc2ctPktleURlc2MuS2V5SW5mby5LZXlUeXBlID0gUEFJUldJU0VLRVk7CisKKwkvLyBTcGVjaWZ5IEtleSBJbmRleCwgb25seSBncm91cF9tc2cxX1dQQTEKKwlpZiAoIWJXUEEyICYmIChNc2dUeXBlID49IEVBUE9MX0dST1VQX01TR18xKSkKKwkJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLktleUluZGV4ID0gRGVmYXVsdEtleUlkeDsKKworCWlmIChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpCisJCXBNc2ctPktleURlc2MuS2V5SW5mby5JbnN0YWxsID0gMTsKKworCWlmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpCisJCXBNc2ctPktleURlc2MuS2V5SW5mby5LZXlBY2sgPSAxOworCisJaWYgKE1zZ1R5cGUgIT0gRUFQT0xfUEFJUl9NU0dfMSkKKwkJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLktleU1pYyA9IDE7CisKKwlpZiAoKGJXUEEyICYmIChNc2dUeXBlID49IEVBUE9MX1BBSVJfTVNHXzMpKSB8fCAoIWJXUEEyICYmIChNc2dUeXBlID49IEVBUE9MX0dST1VQX01TR18xKSkpCisgICAgeworICAgICAgIAlwTXNnLT5LZXlEZXNjLktleUluZm8uU2VjdXJlID0gMTsKKyAgICB9CisKKwlpZiAoYldQQTIgJiYgKChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpIHx8IChNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkpCisgICAgeworICAgICAgICBwTXNnLT5LZXlEZXNjLktleUluZm8uRUtEX0RMID0gMTsKKyAgICB9CisKKwkvLyBrZXkgSW5mb3JtYXRpb24gZWxlbWVudCBoYXMgZG9uZS4KKwkqKFVTSE9SVCAqKSgmcE1zZy0+S2V5RGVzYy5LZXlJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwTXNnLT5LZXlEZXNjLktleUluZm8pKTsKKworCS8vIEZpbGwgaW4gS2V5IExlbmd0aAorCXsKKwkJaWYgKE1zZ1R5cGUgPj0gRUFQT0xfR1JPVVBfTVNHXzEpCisJCXsKKwkJCS8vIHRoZSBsZW5ndGggb2YgZ3JvdXAga2V5IGNpcGhlcgorCQkJcE1zZy0+S2V5RGVzYy5LZXlMZW5ndGhbMV0gPSAoKEdyb3VwS2V5V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpID8gVEtJUF9HVEtfTEVOR1RIIDogTEVOX0FFU19LRVkpOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gdGhlIGxlbmd0aCBvZiBwYWlyd2lzZSBrZXkgY2lwaGVyCisJCQlwTXNnLT5LZXlEZXNjLktleUxlbmd0aFsxXSA9ICgoV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpID8gTEVOX1RLSVBfS0VZIDogTEVOX0FFU19LRVkpOworCQl9CisJfQorCisgCS8vIEZpbGwgaW4gcmVwbGF5IGNvdW50ZXIKKyAgICBOZGlzTW92ZU1lbW9yeShwTXNnLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIFJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLy8gRmlsbCBLZXkgTm9uY2UgZmllbGQKKwkvLyBBTm9uY2UgOiBwYWlyd2lzZV9tc2cxICYgcGFpcndpc2VfbXNnMworCS8vIFNOb25jZSA6IHBhaXJ3aXNlX21zZzIKKwkvLyBHTm9uY2UgOiBncm91cF9tc2cxX3dwYTEKKwlpZiAoKE1zZ1R5cGUgPD0gRUFQT0xfUEFJUl9NU0dfMykgfHwgKCghYldQQTIgJiYgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKSkpCisgICAgCU5kaXNNb3ZlTWVtb3J5KHBNc2ctPktleURlc2MuS2V5Tm9uY2UsIEtleU5vbmNlLCBMRU5fS0VZX0RFU0NfTk9OQ0UpOworCisJLy8gRmlsbCBrZXkgSVYgLSBXUEEyIGFzIDAsIFdQQTEgYXMgcmFuZG9tCisJaWYgKCFiV1BBMiAmJiAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpCisJeworCQkvLyBTdWdnZXN0IElWIGJlIHJhbmRvbSBudW1iZXIgcGx1cyBzb21lIG51bWJlciwKKwkJTmRpc01vdmVNZW1vcnkocE1zZy0+S2V5RGVzYy5LZXlJdiwgJktleU5vbmNlWzE2XSwgTEVOX0tFWV9ERVNDX0lWKTsKKyAgICAgICAgcE1zZy0+S2V5RGVzYy5LZXlJdlsxNV0gKz0gMjsKKwl9CisKKyAgICAvLyBGaWxsIEtleSBSU0MgZmllbGQKKyAgICAvLyBJdCBjb250YWlucyB0aGUgUlNDIGZvciB0aGUgR1RLIGJlaW5nIGluc3RhbGxlZC4KKwlpZiAoKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMyAmJiBiV1BBMikgfHwgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKQorCXsKKyAgICAgICAgTmRpc01vdmVNZW1vcnkocE1zZy0+S2V5RGVzYy5LZXlSc2MsIFR4UlNDLCA2KTsKKwl9CisKKwkvLyBDbGVhciBLZXkgTUlDIGZpZWxkIGZvciBNSUMgY2FsY3VsYXRpb24gbGF0ZXIKKyAgICBOZGlzWmVyb01lbW9yeShwTXNnLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKwlDb25zdHJ1Y3RFYXBvbEtleURhdGEocEFkLAorCQkJCQkJICBBdXRoTW9kZSwKKwkJCQkJCSAgV2VwU3RhdHVzLAorCQkJCQkJICBHcm91cEtleVdlcFN0YXR1cywKKwkJCQkJCSAgTXNnVHlwZSwKKwkJCQkJCSAgRGVmYXVsdEtleUlkeCwKKwkJCQkJCSAgYldQQTIsCisJCQkJCQkgIFBUSywKKwkJCQkJCSAgR1RLLAorCQkJCQkJICBSU05JRSwKKwkJCQkJCSAgUlNOSUVfTGVuLAorCQkJCQkJICBwTXNnKTsKKworCS8vIENhbGN1bGF0ZSBNSUMgYW5kIGZpbGwgaW4gS2V5TWljIEZpZWxkIGV4Y2VwdCBQYWlyd2lzZSBNc2cgMS4KKwlpZiAoTXNnVHlwZSAhPSBFQVBPTF9QQUlSX01TR18xKQorCXsKKwkJQ2FsY3VsYXRlTUlDKHBBZCwgV2VwU3RhdHVzLCBQVEssIHBNc2cpOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gQ29uc3RydWN0RWFwb2xNc2cgZm9yICVzICVzXG4iLCAoKGJXUEEyKSA/ICJXUEEyIiA6ICJXUEEiKSwgR2V0RWFwb2xNc2dUeXBlKE1zZ1R5cGUpKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiCSAgICAgQm9keSBsZW5ndGggPSAlZCBcbiIsIHBNc2ctPkJvZHlfTGVuWzFdKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiCSAgICAgS2V5IGxlbmd0aCAgPSAlZCBcbiIsIHBNc2ctPktleURlc2MuS2V5TGVuZ3RoWzFdKSk7CisKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ29uc3RydWN0IHRoZSBLZXkgRGF0YSBmaWVsZCBvZiBFQVBvTCBtZXNzYWdlCisKKwlBcmd1bWVudHM6CisJCXBBZAkJCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKwkJRWxlbQkJTWVzc2FnZSBib2R5CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUNvbnN0cnVjdEVhcG9sS2V5RGF0YSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUF1dGhNb2RlLAorCUlOCVVDSEFSCQkJV2VwU3RhdHVzLAorCUlOCVVDSEFSCQkJR3JvdXBLZXlXZXBTdGF0dXMsCisJSU4gCVVDSEFSCQkJTXNnVHlwZSwKKwlJTglVQ0hBUgkJCURlZmF1bHRLZXlJZHgsCisJSU4JQk9PTEVBTgkJCWJXUEEyQ2FwYWJsZSwKKwlJTglVQ0hBUgkJCSpQVEssCisJSU4JVUNIQVIJCQkqR1RLLAorCUlOCVVDSEFSCQkJKlJTTklFLAorCUlOCVVDSEFSCQkJUlNOSUVfTEVOLAorCU9VVCBQRUFQT0xfUEFDS0VUICAgcE1zZykKK3sKKwlVQ0hBUgkJKm1wb29sLCAqS2V5X0RhdGEsICpSYzRHVEs7CisJVUNIQVIgICAgICAgZWtleVsoTEVOX0tFWV9ERVNDX0lWK0xFTl9FQVBfRUspXTsKKwlVQ0hBUgkJZGF0YV9vZmZzZXQ7CisKKworCWlmIChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzEgfHwgTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR180IHx8IE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzIpCisJCXJldHVybjsKKworCS8vIGFsbG9jYXRlIG1lbW9yeSBwb29sCisJb3NfYWxsb2NfbWVtKHBBZCwgKFBVQ0hBUiAqKSZtcG9vbCwgMTUwMCk7CisKKyAgICBpZiAobXBvb2wgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLyogUmM0R1RLIExlbiA9IDUxMiAqLworCVJjNEdUSyA9IChVQ0hBUiAqKSBST1VORF9VUChtcG9vbCwgNCk7CisJLyogS2V5X0RhdGEgTGVuID0gNTEyICovCisJS2V5X0RhdGEgPSAoVUNIQVIgKikgUk9VTkRfVVAoUmM0R1RLICsgNTEyLCA0KTsKKworCU5kaXNaZXJvTWVtb3J5KEtleV9EYXRhLCA1MTIpOworCXBNc2ctPktleURlc2MuS2V5RGF0YUxlblsxXSA9IDA7CisJZGF0YV9vZmZzZXQgPSAwOworCisJLy8gRW5jYXBzdWxhdGUgUlNOSUUgaW4gcGFpcndpc2VfbXNnMiAmIHBhaXJ3aXNlX21zZzMKKwlpZiAoUlNOSUVfTEVOICYmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18yKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKSkpCisJeworCQlpZiAoYldQQTJDYXBhYmxlKQorCQkJS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAwXSA9IElFX1dQQTI7CisJCWVsc2UKKwkJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMF0gPSBJRV9XUEE7CisKKyAgICAgICAgS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAxXSA9IFJTTklFX0xFTjsKKwkJTmRpc01vdmVNZW1vcnkoJktleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMl0sIFJTTklFLCBSU05JRV9MRU4pOworCQlkYXRhX29mZnNldCArPSAoMiArIFJTTklFX0xFTik7CisJfQorCisJLy8gRW5jYXBzdWxhdGUgS0RFIGZvcm1hdCBpbiBwYWlyd2lzZV9tc2czX1dQQTIgJiBncm91cF9tc2cxX1dQQTIKKwlpZiAoYldQQTJDYXBhYmxlICYmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpKQorCXsKKwkJLy8gS2V5IERhdGEgRW5jYXBzdWxhdGlvbiAoS0RFKSBmb3JtYXQgLSA4MDIuMTFpLTIwMDQgIEZpZ3VyZS00M3cgYW5kIFRhYmxlLTIwaAorICAgICAgICBLZXlfRGF0YVtkYXRhX29mZnNldCArIDBdID0gMHhERDsKKworCQlpZiAoR3JvdXBLZXlXZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJeworCQkJS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAxXSA9IDB4MTY7Ly8gNCsyKzE2KE9VSStEYXRhVHlwZStEYXRhRmllbGQpCisJCX0KKwkJZWxzZQorCQl7CisJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDFdID0gMHgyNjsvLyA0KzIrMzIoT1VJK0RhdGFUeXBlK0RhdGFGaWVsZCkKKwkJfQorCisgICAgICAgIEtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMl0gPSAweDAwOworICAgICAgICBLZXlfRGF0YVtkYXRhX29mZnNldCArIDNdID0gMHgwRjsKKyAgICAgICAgS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyA0XSA9IDB4QUM7CisgICAgICAgIEtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgNV0gPSAweDAxOworCisJCS8vIEdUSyBLREUgZm9ybWF0IC0gODAyLjExaS0yMDA0ICBGaWd1cmUtNDN4CisgICAgICAgIEtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgNl0gPSAoRGVmYXVsdEtleUlkeCAmIDB4MDMpOworICAgICAgICBLZXlfRGF0YVtkYXRhX29mZnNldCArIDddID0gMHgwMDsJLy8gUmVzZXJ2ZWQgQnl0ZQorCisJCWRhdGFfb2Zmc2V0ICs9IDg7CisJfQorCisKKwkvLyBFbmNhcHN1bGF0ZSBHVEsgYW5kIGVuY3J5cHQgdGhlIGtleS1kYXRhIGZpZWxkIHdpdGggS0VLLgorCS8vIE9ubHkgZm9yIHBhaXJ3aXNlX21zZzNfV1BBMiBhbmQgZ3JvdXBfbXNnMQorCWlmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zICYmIGJXUEEyQ2FwYWJsZSkgfHwgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKQorCXsKKwkJLy8gRmlsbCBpbiBHVEsKKwkJaWYgKEdyb3VwS2V5V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCXsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZLZXlfRGF0YVtkYXRhX29mZnNldF0sIEdUSywgTEVOX0FFU19LRVkpOworCQkJZGF0YV9vZmZzZXQgKz0gTEVOX0FFU19LRVk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlOZGlzTW92ZU1lbW9yeSgmS2V5X0RhdGFbZGF0YV9vZmZzZXRdLCBHVEssIFRLSVBfR1RLX0xFTkdUSCk7CisJCQlkYXRhX29mZnNldCArPSBUS0lQX0dUS19MRU5HVEg7CisJCX0KKworCQkvLyBTdGlsbCBkb250IGtub3cgd2h5LCBidXQgaWYgbm90IGFwcGVuZCB3aWxsIG9jY3VyICJHVEsgbm90IGluY2x1ZGUgaW4gTVNHMyIKKwkJLy8gUGF0Y2ggZm9yIGNvbXBhdGliaWxpdHkgYmV0d2VlbiB6ZXJvIGNvbmZpZyBhbmQgZnVuaworCQlpZiAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zICYmIGJXUEEyQ2FwYWJsZSkKKwkJeworCQkJaWYgKEdyb3VwS2V5V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCQl7CisJCQkJS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAwXSA9IDB4REQ7CisJCQkJS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAxXSA9IDA7CisJCQkJZGF0YV9vZmZzZXQgKz0gMjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDBdID0gMHhERDsKKwkJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDFdID0gMDsKKwkJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDJdID0gMDsKKwkJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDNdID0gMDsKKwkJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDRdID0gMDsKKwkJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDVdID0gMDsKKwkJCQlkYXRhX29mZnNldCArPSA2OworCQkJfQorCQl9CisKKwkJLy8gRW5jcnlwdCB0aGUgZGF0YSBtYXRlcmlhbCBpbiBrZXkgZGF0YSBmaWVsZAorCQlpZiAoV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCXsKKwkJCUFFU19HVEtfS0VZX1dSQVAoJlBUS1sxNl0sIEtleV9EYXRhLCBkYXRhX29mZnNldCwgUmM0R1RLKTsKKyAgICAgICAgICAgIC8vIEFFUyB3cmFwIGZ1bmN0aW9uIHdpbGwgZ3JvdyA4IGJ5dGVzIGluIGxlbmd0aAorICAgICAgICAgICAgZGF0YV9vZmZzZXQgKz0gODsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIFBSRVBBUkUgRW5jcnlwdGVkICAiS2V5IERBVEEiIGZpZWxkLiAgKEVuY3J5cHQgR1RLIHdpdGggUkM0LCB1c2luZiBQVEtbMTZdLT5bMzFdIGFzIEtleSwgSVYtZmllbGQgYXMgSVYpCisJCQkvLyBwdXQgVHhUc2MgaW4gS2V5IFJTQyBmaWVsZAorCQkJcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiA9IFBQUElOSVRGQ1MzMjsgICAvL0luaXQgY3JjMzIuCisKKwkJCS8vIGVrZXkgaXMgdGhlIGNvbnRhbmV0aW9uIG9mIElWLWZpZWxkLCBhbmQgUFRLWzE2XS0+UFRLWzMxXQorCQkJTmRpc01vdmVNZW1vcnkoZWtleSwgcE1zZy0+S2V5RGVzYy5LZXlJdiwgTEVOX0tFWV9ERVNDX0lWKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZla2V5W0xFTl9LRVlfREVTQ19JVl0sICZQVEtbMTZdLCBMRU5fRUFQX0VLKTsKKwkJCUFSQ0ZPVVJfSU5JVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBla2V5LCBzaXplb2YoZWtleSkpOyAgLy9JTklUIFNCT1gsIEtFWUxFTiszKElWKQorCQkJcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiA9IFJUTVBfQ0FMQ19GQ1MzMihwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyLCBLZXlfRGF0YSwgZGF0YV9vZmZzZXQpOworCQkJV1BBQVJDRk9VUl9FTkNSWVBUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIFJjNEdUSywgS2V5X0RhdGEsIGRhdGFfb2Zmc2V0KTsKKwkJfQorCisJCU5kaXNNb3ZlTWVtb3J5KHBNc2ctPktleURlc2MuS2V5RGF0YSwgUmM0R1RLLCBkYXRhX29mZnNldCk7CisJfQorCWVsc2UKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KHBNc2ctPktleURlc2MuS2V5RGF0YSwgS2V5X0RhdGEsIGRhdGFfb2Zmc2V0KTsKKwl9CisKKwkvLyBzZXQga2V5IGRhdGEgbGVuZ3RoIGZpZWxkIGFuZCB0b3RhbCBsZW5ndGgKKwlwTXNnLT5LZXlEZXNjLktleURhdGFMZW5bMV0gPSBkYXRhX29mZnNldDsKKyAgICBwTXNnLT5Cb2R5X0xlblsxXSArPSBkYXRhX29mZnNldDsKKworCW9zX2ZyZWVfbWVtKHBBZCwgbXBvb2wpOworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDYWxjYXVsYXRlIE1JQy4gSXQgaXMgdXNlZCBkdXJpbmcgNC13YXlzIGhhbmRzaGFya2luZy4KKworCUFyZ3VtZW50czoKKwkJcEFkCQkJCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAorICAgIAlQZWVyV2VwU3RhdHVzCS0JaW5kaWNhdGUgdGhlIGVuY3J5cHRpb24gdHlwZQorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQ2FsY3VsYXRlTUlDKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJUGVlcldlcFN0YXR1cywKKwlJTglVQ0hBUgkJCSpQVEssCisJT1VUIFBFQVBPTF9QQUNLRVQgICBwTXNnKQoreworICAgIFVDSEFSICAgKk91dEJ1ZmZlcjsKKwlVTE9ORwlGcmFtZUxlbiA9IDA7CisJVUNIQVIJbWljW0xFTl9LRVlfREVTQ19NSUNdOworCVVDSEFSCWRpZ2VzdFs4MF07CisKKwkvLyBhbGxvY2F0ZSBtZW1vcnkgZm9yIE1JQyBjYWxjdWxhdGlvbgorCW9zX2FsbG9jX21lbShwQWQsIChQVUNIQVIgKikmT3V0QnVmZmVyLCA1MTIpOworCisgICAgaWYgKE91dEJ1ZmZlciA9PSBOVUxMKQorICAgIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiISEhQ2FsY3VsYXRlTUlDOiBubyBtZW1vcnkhISFcbiIpKTsKKwkJcmV0dXJuOworICAgIH0KKworCS8vIG1ha2UgYSBmcmFtZSBmb3IgY2FsY3VsYXRpbmcgTUlDLgorICAgIE1ha2VPdXRnb2luZ0ZyYW1lKE91dEJ1ZmZlciwgICAgICAgICAgICAJJkZyYW1lTGVuLAorICAgICAgICAgICAgICAgICAgICAgIHBNc2ctPkJvZHlfTGVuWzFdICsgNCwgIAlwTXNnLAorICAgICAgICAgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKworCU5kaXNaZXJvTWVtb3J5KG1pYywgc2l6ZW9mKG1pYykpOworCisJLy8gQ2FsY3VsYXRlIE1JQworICAgIGlmIChQZWVyV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisgCXsKKwkJSE1BQ19TSEExKE91dEJ1ZmZlciwgIEZyYW1lTGVuLCBQVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJTmRpc01vdmVNZW1vcnkobWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKwllbHNlCisJeworCQlobWFjX21kNShQVEssICBMRU5fRUFQX01JQ0ssIE91dEJ1ZmZlciwgRnJhbWVMZW4sIG1pYyk7CisJfQorCisJLy8gc3RvcmUgdGhlIGNhbGN1bGF0ZWQgTUlDCisJTmRpc01vdmVNZW1vcnkocE1zZy0+S2V5RGVzYy5LZXlNaWMsIG1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKwlvc19mcmVlX21lbShwQWQsIE91dEJ1ZmZlcik7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlTb21lIHJlY2VpdmVkIGZyYW1lcyBjYW4ndCBkZWNyeXB0IGJ5IEFzaWMsIHNvIGRlY3J5cHQgdGhlbSBieSBzb2Z0d2FyZS4KKworCUFyZ3VtZW50czoKKwkJcEFkCQkJCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAorICAgIAlQZWVyV2VwU3RhdHVzCS0JaW5kaWNhdGUgdGhlIGVuY3J5cHRpb24gdHlwZQorCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NUQVRVU19TVUNDRVNTCQktCWRlY3J5cHRpb24gc3VjY2Vzc2Z1bAorCQlORElTX1NUQVRVU19GQUlMVVJFCQktCWRlY3J5cHRpb24gZmFpbHVyZQorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMJUlRNUFNvZnREZWNyeXB0QnJvYWRDYXN0RGF0YSgKKwlJTglQUlRNUF9BREFQVEVSCQkJCQlwQWQsCisJSU4JUlhfQkxLCQkJCQkJCSpwUnhCbGssCisJSU4gIE5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTIAlHcm91cENpcGhlciwKKwlJTiAgUENJUEhFUl9LRVkJCQkJCQlwU2hhcmRfa2V5KQoreworCVBSWFdJX1NUUlVDCQkJcFJ4V0kgPSBwUnhCbGstPnBSeFdJOworCisKKworCS8vIGhhbmRsZSBXRVAgZGVjcnlwdGlvbgorCWlmIChHcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKQorICAgIHsKKwkJaWYgKFJUTVBTb2Z0RGVjcnlwdFdFUChwQWQsIHBSeEJsay0+cERhdGEsIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQsIHBTaGFyZF9rZXkpKQorCQl7CisKKwkJCS8vTWludXMgSVZbNF0gJiBJQ1ZbNF0KKwkJCXBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQgLT0gODsKKwkJfQorCQllbHNlCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVSUk9SIDogU29mdHdhcmUgZGVjcnlwdCBXRVAgZGF0YSBmYWlscy5cbiIpKTsKKwkJCS8vIGdpdmUgdXAgdGhpcyBmcmFtZQorCQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJCX0KKwl9CisJLy8gaGFuZGxlIFRLSVAgZGVjcnlwdGlvbgorCWVsc2UgaWYgKEdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJeworCQlpZiAoUlRNUFNvZnREZWNyeXB0VEtJUChwQWQsIHBSeEJsay0+cERhdGEsIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQsIDAsIHBTaGFyZF9rZXkpKQorCQl7CisKKwkJCS8vTWludXMgOCBieXRlcyBNSUMsIDggYnl0ZXMgSVYvRUlWLCA0IGJ5dGVzIElDVgorCQkJcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCAtPSAyMDsKKwkJfQorICAgICAgICBlbHNlCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVSUk9SIDogUlRNUFNvZnREZWNyeXB0VEtJUCBGYWlsZWRcbiIpKTsKKwkJCS8vIGdpdmUgdXAgdGhpcyBmcmFtZQorCQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgIH0KKwl9CisJLy8gaGFuZGxlIEFFUyBkZWNyeXB0aW9uCisJZWxzZSBpZiAoR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CisJCWlmIChSVE1QU29mdERlY3J5cHRBRVMocEFkLCBwUnhCbGstPnBEYXRhLCBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ICwgcFNoYXJkX2tleSkpCisJCXsKKworCQkJLy84IGJ5dGVzIE1JQywgOCBieXRlcyBJVi9FSVYgKENDTVAgSGVhZGVyKQorCQkJcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCAtPSAxNjsKKwkJfQorCQllbHNlCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVSUk9SIDogUlRNUFNvZnREZWNyeXB0QUVTIEZhaWxlZFxuIikpOworCQkJLy8gZ2l2ZSB1cCB0aGlzIGZyYW1lCisJCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwkJfQorCX0KKwllbHNlCisJeworCQkvLyBnaXZlIHVwIHRoaXMgZnJhbWUKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vZGZzLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9kZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDliYmE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vZGZzLmMKQEAgLTAsMCArMSw0NTMgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgYXBfZGZzLmMKKworICAgIEFic3RyYWN0OgorICAgIFN1cHBvcnQgREZTIGZ1bmN0aW9uLgorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgV2hlbiAgICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgLS0tLS0tLS0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGb25jaGkgICAgMDMtMTItMjAwNyAgICAgIGNyZWF0ZWQKKyovCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKwordHlwZWRlZiBzdHJ1Y3QgX1JBREFSX0RVUkFUSU9OX1RBQkxFCit7CisJVUxPTkcgUkREdXJSZWdpb247CisJVUxPTkcgUmFkYXJTaWduYWxEdXJhdGlvbjsKKwlVTE9ORyBUb2xlcmFuY2U7Cit9IFJBREFSX0RVUkFUSU9OX1RBQkxFLCAqUFJBREFSX0RVUkFUSU9OX1RBQkxFOworCisKK3N0YXRpYyBVQ0hBUiBSZElkbGVUaW1lVGFibGVbTUFYX1JEX1JFR0lPTl1bNF0gPQoreworCXs5LCAyNTAsIDI1MCwgMjUwfSwJCS8vIENFCisJezQsIDI1MCwgMjUwLCAyNTB9LAkJLy8gRkNDCisJezQsIDI1MCwgMjUwLCAyNTB9LAkJLy8gSkFQCisJezE1LCAyNTAsIDI1MCwgMjUwfSwJLy8gSkFQX1c1MworCXs0LCAyNTAsIDI1MCwgMjUwfQkJLy8gSkFQX1c1NgorfTsKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUJicCBSYWRhciBkZXRlY3Rpb24gcm91dGluZQorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQmJwUmFkYXJEZXRlY3Rpb25TdGFydCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlVSU5UOCBSYWRhclBlcmlvZDsKKworCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMTQsIDB4MDIpOworCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMjEsIDB4MjApOworCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMjIsIDB4MDApOworCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMjMsIDB4MDgvKjB4ODAqLyk7CisJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIDEyNCwgMHgyOCk7CisJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIDEyNSwgMHhmZik7CisKKyNpZiAwCisJLy8gdG9nZ2xlIFJ4IGVuYWJsZSBiaXQgZm9yIHJhZGFyIGRldGVjdGlvbi4KKwkvLyBpdCdzIEFuZHkncyByZWNvbW1hbmQuCisJeworCQlVSU5UMzIgVmFsdWU7CisJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJVmFsdWUgfD0gKDB4MSA8PCAzKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKwlWYWx1ZSAmPSB+KDB4MSA8PCAzKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKwl9CisjZW5kaWYKKwlSYWRhclBlcmlvZCA9ICgoVUlOVClSZElkbGVUaW1lVGFibGVbcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb25dWzBdICsgKFVJTlQpcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUpIDwgMjUwID8KKwkJCShSZElkbGVUaW1lVGFibGVbcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb25dWzBdICsgcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUpIDogMjUwOworCisJUlRNUF9JT19XUklURTgocEFkLCAweDcwMjAsIDB4MWQpOworCVJUTVBfSU9fV1JJVEU4KHBBZCwgMHg3MDIxLCAweDQwKTsKKworCVJhZGFyRGV0ZWN0aW9uU3RhcnQocEFkLCAwLCBSYWRhclBlcmlvZCk7CisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQmJwIFJhZGFyIGRldGVjdGlvbiByb3V0aW5lCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBCYnBSYWRhckRldGVjdGlvblN0b3AoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJUlRNUF9JT19XUklURTgocEFkLCAweDcwMjAsIDB4MWQpOworCVJUTVBfSU9fV1JJVEU4KHBBZCwgMHg3MDIxLCAweDYwKTsKKworCVJhZGFyRGV0ZWN0aW9uU3RvcChwQWQpOworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJhZGFyIGRldGVjdGlvbiByb3V0aW5lCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSYWRhckRldGVjdGlvblN0YXJ0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIEJPT0xFQU4gQ1RTUHJvdGVjdCwKKwlJTiBVSU5UOCBDVFNQZXJpb2QpCit7CisJVUlOVDggRGZzQWN0aXZlVGltZSA9IChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSAmIDB4MWYpOworCVVJTlQ4IEN0c1Byb3RlY3QgPSAoQ1RTUHJvdGVjdCA9PSAxKSA/IDB4MDIgOiAweDAxOyAvLyBDVFMgcHJvdGVjdC4KKworCWlmIChDVFNQcm90ZWN0ICE9IDApCisJeworCQlzd2l0Y2gocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24pCisJCXsKKwkJY2FzZSBGQ0M6CisJCWNhc2UgSkFQX1c1NjoKKwkJCUN0c1Byb3RlY3QgPSAweDAzOworCQkJYnJlYWs7CisKKwkJY2FzZSBDRToKKwkJY2FzZSBKQVBfVzUzOgorCQlkZWZhdWx0OgorCQkJQ3RzUHJvdGVjdCA9IDB4MDI7CisJCQlicmVhazsKKwkJfQorCX0KKwllbHNlCisJCUN0c1Byb3RlY3QgPSAweDAxOworCisKKwkvLyBzZW5kIHN0YXJ0LVJEIHdpdGggQ1RTIHByb3RlY3Rpb24gY29tbWFuZCB0byBNQ1UKKwkvLyBoaWdoYnl0ZSBbN10JCXJlc2VydmUKKwkvLyBoaWdoYnl0ZSBbNjo1XQkweDogc3RvcCBDYXJyaWVyL1JhZGFyIGRldGVjdGlvbgorCS8vIGhpZ2hieXRlIFsxMF06CVN0YXJ0IENhcnJpZXIvUmFkYXIgZGV0ZWN0aW9uIHdpdGhvdXQgQ1RTIHByb3RlY3Rpb24sIDExOiBTdGFydCBDYXJyaWVyL1JhZGFyIGRldGVjdGlvbiB3aXRoIENUUyBwcm90ZWN0aW9uCisJLy8gaGlnaGJ5dGUgWzQ6MF0JUmFkYXIvY2FycmllciBkZXRlY3Rpb24gZHVyYXRpb24uIEluIDFtcy4KKworCS8vIGxvd2J5dGUgWzc6MF0JUmFkYXIvY2FycmllciBkZXRlY3Rpb24gcGVyaW9kLCBpbiAxbXMuCisJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDYwLCAweGZmLCBDVFNQZXJpb2QsIERmc0FjdGl2ZVRpbWUgfCAoQ3RzUHJvdGVjdCA8PCA1KSk7CisJLy9Bc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NjMsIDB4ZmYsIDEwLCAwKTsKKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJhZGFyIGRldGVjdGlvbiByb3V0aW5lCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlUUlVFCUZvdW5kIHJhZGFyIHNpZ25hbAorCQlGQUxTRQlOb3QgZm91bmQgcmFkYXIgc2lnbmFsCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJhZGFyRGV0ZWN0aW9uU3RvcCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJhZGFyRGV0ZWN0aW9uU3RvcC5cbiIpKTsKKwlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NjAsIDB4ZmYsIDB4MDAsIDB4MDApOwkvLyBzZW5kIHN0YXJ0LVJEIHdpdGggQ1RTIHByb3RlY3Rpb24gY29tbWFuZCB0byBNQ1UKKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJhZGFyIGNoYW5uZWwgY2hlY2sgcm91dGluZQorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJVFJVRQluZWVkIHRvIGRvIHJhZGFyIGRldGVjdAorCQlGQUxTRQluZWVkIG5vdCB0byBkbyByYWRhciBkZXRlY3QKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gUmFkYXJDaGFubmVsQ2hlY2soCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVUNIQVIJCQlDaCkKK3sKKyNpZiAxCisJSU5UCQlpOworCUJPT0xFQU4gcmVzdWx0ID0gRkFMU0U7CisKKwlmb3IgKGk9MDsgaTxwQWQtPkNoYW5uZWxMaXN0TnVtOyBpKyspCisJeworCQlpZiAoQ2ggPT0gcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsKQorCQl7CisJCQlyZXN1bHQgPSBwQWQtPkNoYW5uZWxMaXN0W2ldLkRmc1JlcTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJlc3VsdDsKKyNlbHNlCisJSU5UCQlpOworCVVDSEFSCUNoYW5uZWxbMTVdPXs1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDB9OworCisJZm9yIChpPTA7IGk8MTU7IGkrKykKKwl7CisJCWlmIChDaCA9PSBDaGFubmVsW2ldKQorCQl7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpICE9IDE1KQorCQlyZXR1cm4gVFJVRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsKKyNlbmRpZgorfQorCitVTE9ORyBKYXBSYWRhclR5cGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUxPTkcJCWk7CisJY29uc3QgVUNIQVIJQ2hhbm5lbFsxNV09ezUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MH07CisKKwlpZiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24gIT0gSkFQKQorCXsKKwkJcmV0dXJuIHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uOworCX0KKworCWZvciAoaT0wOyBpPDE1OyBpKyspCisJeworCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9PSBDaGFubmVsW2ldKQorCQl7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpIDwgNCkKKwkJcmV0dXJuIEpBUF9XNTM7CisJZWxzZSBpZiAoaSA8IDE1KQorCQlyZXR1cm4gSkFQX1c1NjsKKwllbHNlCisJCXJldHVybiBKQVA7IC8vIFc1MgorCit9CisKK1VMT05HIFJUTVBCYnBSZWFkUmFkYXJEdXJhdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlVSU5UOCBieXRlVmFsdWUgPSAwOworCVVMT05HIHJlc3VsdDsKKworCUJCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjExNSwgJmJ5dGVWYWx1ZSk7CisKKwlyZXN1bHQgPSAwOworCXN3aXRjaCAoYnl0ZVZhbHVlKQorCXsKKwljYXNlIDE6IC8vIHJhZGFyIHNpZ25hbCBkZXRlY3RlZCBieSBwdWxzZSBtb2RlLgorCWNhc2UgMjogLy8gcmFkYXIgc2lnbmFsIGRldGVjdGVkIGJ5IHdpZHRoIG1vZGUuCisJCXJlc3VsdCA9IFJUTVBSZWFkUmFkYXJEdXJhdGlvbihwQWQpOworCQlicmVhazsKKworCWNhc2UgMDogLy8gTm8gcmFkYXIgc2lnbmFsLgorCWRlZmF1bHQ6CisKKwkJcmVzdWx0ID0gMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworVUxPTkcgUlRNUFJlYWRSYWRhckR1cmF0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKQoreworCVVMT05HIHJlc3VsdCA9IDA7CisKKyNpZmRlZiBERlNfU1VQUE9SVAorCVVJTlQ4IGR1cmF0aW9uMSA9IDAsIGR1cmF0aW9uMiA9IDAsIGR1cmF0aW9uMyA9IDA7CisKKwlCQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxMTYsICZkdXJhdGlvbjEpOworCUJCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjExNywgJmR1cmF0aW9uMik7CisJQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMTE4LCAmZHVyYXRpb24zKTsKKwlyZXN1bHQgPSAoZHVyYXRpb24xIDw8IDE2KSArIChkdXJhdGlvbjIgPDwgOCkgKyBkdXJhdGlvbjM7CisjZW5kaWYgLy8gREZTX1NVUFBPUlQgLy8KKworCXJldHVybiByZXN1bHQ7CisKK30KKworVk9JRCBSVE1QQ2xlYW5SYWRhckR1cmF0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKQoreworCXJldHVybjsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBSYWRhciB3YXZlIGRldGVjdGlvbi4gVGhlIEFQSSBzaG91bGQgYmUgaW52b2tlIGVhY2ggc2Vjb25kLgorCisgICAgQXJndW1lbnRzOgorICAgICAgICBwQWQgICAgICAgICAtIEFkYXB0ZXIgcG9pbnRlcgorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOb25lCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEFwUmFkYXJEZXRlY3RQZXJpb2RpYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlJTlQJaTsKKworCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkluU2VydmljZU1vbml0b3JDb3VudCsrOworCisJZm9yIChpPTA7IGk8cEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaV0uUmVtYWluaW5nVGltZUZvclVzZSA+IDApCisJCXsKKwkJCXBBZC0+Q2hhbm5lbExpc3RbaV0uUmVtYWluaW5nVGltZUZvclVzZSAtLTsKKwkJCWlmICgocEFkLT5NbG1lLlBlcmlvZGljUm91bmQlNSkgPT0gMCkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWRhckRldGVjdFBlcmlvZGljIC0gY2g9JWQsIFJlbWFpbmluZ1RpbWVGb3JVc2U9JWRcbiIsIHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCwgcEFkLT5DaGFubmVsTGlzdFtpXS5SZW1haW5pbmdUaW1lRm9yVXNlKSk7CisJCQl9CisJCX0KKwl9CisKKwkvL3JhZGFyIGRldGVjdAorCWlmICgocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQorCQkmJiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkKKwkJJiYgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSkKKwl7CisJCVJhZGFyRGV0ZWN0UGVyaW9kaWMocEFkKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8vIFBlcmlvZGljIFJhZGFyIGRldGVjdGlvbiwgc3dpdGNoIGNoYW5uZWwgd2lsbCBvY2N1ciBpbiBSVE1QSGFuZGxlVEJUVEludGVycnVwdCgpCisvLyBCZWZvcmUgc3dpdGNoIGNoYW5uZWwsIGRyaXZlciBuZWVkcyBkb2luZyBjaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQuCitWT0lEIFJhZGFyRGV0ZWN0UGVyaW9kaWMoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpCit7CisJLy8gbmVlZCB0byBjaGVjayBjaGFubmVsIGF2YWlsYWJpbGl0eSwgYWZ0ZXIgc3dpdGNoIGNoYW5uZWwKKwlpZiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlICE9IFJEX1NJTEVOQ0VfTU9ERSkKKwkJCXJldHVybjsKKworCS8vIGNoYW5uZWwgYXZhaWxhYmlsaXR5IGNoZWNrIHRpbWUgaXMgNjBzZWMsIHVzZSA2NSBmb3IgYXNzdXJhbmNlCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJEQ291bnQrKyA+IHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNoTW92aW5nVGltZSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5vdCBmb3VuZCByYWRhciBzaWduYWwsIHN0YXJ0IHNlbmQgYmVhY29uIGFuZCByYWRhciBkZXRlY3Rpb24gaW4gc2VydmljZSBtb25pdG9yXG5cbiIpKTsKKwkJCUJicFJhZGFyRGV0ZWN0aW9uU3RvcChwQWQpOworCQlBc2ljRW5hYmxlQnNzU3luYyhwQWQpOworCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgPSBSRF9OT1JNQUxfTU9ERTsKKworCisJCXJldHVybjsKKwl9CisKKwlyZXR1cm47Cit9CisKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCQljaGFuZ2UgY2hhbm5lbCBtb3ZpbmcgdGltZSBmb3IgREZTIHRlc3RpbmcuCisKKwlBcmd1bWVudHM6CisJICAgIHBBZGFwdGVyICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJICAgIHdycSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpb2N0bCBhcmd1bWVudAorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOb25lCisKKyAgICBOb3RlOgorICAgICAgICBVc2FnZToKKyAgICAgICAgICAgICAgIDEuKSBpd3ByaXYgcmEwIHNldCBDaE1vdlRpbWU9W3ZhbHVlXQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9DaE1vdmluZ1RpbWVfUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgYXJnKQoreworCVVJTlQ4IFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ2hNb3ZpbmdUaW1lID0gVmFsdWU7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6ICVkXG4iLCBfX2Z1bmNfXywKKwkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ2hNb3ZpbmdUaW1lKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UIFNldF9Mb25nUHVsc2VSYWRhclRoX1Byb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIGFyZykKK3sKKwlVSU5UOCBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA+IDEwID8gMTAgOiBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuTG9uZ1B1bHNlUmFkYXJUaCA9IFZhbHVlOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OiAlZFxuIiwgX19mdW5jX18sCisJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkxvbmdQdWxzZVJhZGFyVGgpKTsKKworCXJldHVybiBUUlVFOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2VlcHJvbS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vZWVwcm9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVkMmQ2NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2VlcHJvbS5jCkBAIC0wLDAgKzEsMjQ0IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCWVlcHJvbS5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisvLyBJUlFMID0gUEFTU0lWRV9MRVZFTAorVk9JRCBSYWlzZUNsb2NrKAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorICAgIElOICBVSU5UMzIgKngpCit7CisgICAgKnggPSAqeCB8IEVFU0s7CisgICAgUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgKngpOworICAgIFJUTVB1c2VjRGVsYXkoMSk7CQkJCS8vIE1heCBmcmVxdWVuY3kgPSAxTUh6IGluIFNwZWMuIGRlZmluaXRpb24KK30KKworLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKK1ZPSUQgTG93ZXJDbG9jaygKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiAgVUlOVDMyICp4KQoreworICAgICp4ID0gKnggJiB+RUVTSzsKKyAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCAqeCk7CisgICAgUlRNUHVzZWNEZWxheSgxKTsKK30KKworLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKK1VTSE9SVCBTaGlmdEluQml0cygKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKyAgICBVSU5UMzIJCXgsaTsKKwlVU0hPUlQgICAgICBkYXRhPTA7CisKKyAgICBSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKworICAgIHggJj0gfiggRUVETyB8IEVFREkpOworCisgICAgZm9yKGk9MDsgaTwxNjsgaSsrKQorICAgIHsKKyAgICAgICAgZGF0YSA9IGRhdGEgPDwgMTsKKyAgICAgICAgUmFpc2VDbG9jayhwQWQsICZ4KTsKKworICAgICAgICBSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKworICAgICAgICB4ICY9IH4oRUVESSk7CisgICAgICAgIGlmKHggJiBFRURPKQorICAgICAgICAgICAgZGF0YSB8PSAxOworCisgICAgICAgIExvd2VyQ2xvY2socEFkLCAmeCk7CisgICAgfQorCisgICAgcmV0dXJuIGRhdGE7Cit9CisKKy8vIElSUUwgPSBQQVNTSVZFX0xFVkVMCitWT0lEIFNoaWZ0T3V0Qml0cygKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiAgVVNIT1JUIGRhdGEsCisgICAgSU4gIFVTSE9SVCBjb3VudCkKK3sKKyAgICBVSU5UMzIgICAgICAgeCxtYXNrOworCisgICAgbWFzayA9IDB4MDEgPDwgKGNvdW50IC0gMSk7CisgICAgUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7CisKKyAgICB4ICY9IH4oRUVETyB8IEVFREkpOworCisgICAgZG8KKyAgICB7CisgICAgICAgIHggJj0gfkVFREk7CisgICAgICAgIGlmKGRhdGEgJiBtYXNrKQkJeCB8PSBFRURJOworCisgICAgICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOworCisgICAgICAgIFJhaXNlQ2xvY2socEFkLCAmeCk7CisgICAgICAgIExvd2VyQ2xvY2socEFkLCAmeCk7CisKKyAgICAgICAgbWFzayA9IG1hc2sgPj4gMTsKKyAgICB9IHdoaWxlKG1hc2spOworCisgICAgeCAmPSB+RUVESTsKKyAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKK30KKworLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKK1ZPSUQgRUVwcm9tQ2xlYW51cCgKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKyAgICBVSU5UMzIgeDsKKworICAgIFJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOworCisgICAgeCAmPSB+KEVFQ1MgfCBFRURJKTsKKyAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKKworICAgIFJhaXNlQ2xvY2socEFkLCAmeCk7CisgICAgTG93ZXJDbG9jayhwQWQsICZ4KTsKK30KKworVk9JRCBFV0VOKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworICAgIFVJTlQzMgl4OworCisgICAgLy8gcmVzZXQgYml0cyBhbmQgc2V0IEVFQ1MKKyAgICBSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKyAgICB4ICY9IH4oRUVESSB8IEVFRE8gfCBFRVNLKTsKKyAgICB4IHw9IEVFQ1M7CisgICAgUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7CisKKwkvLyBraWNrIGEgcHVsc2UKKwlSYWlzZUNsb2NrKHBBZCwgJngpOworCUxvd2VyQ2xvY2socEFkLCAmeCk7CisKKyAgICAvLyBvdXRwdXQgdGhlIHJlYWRfb3Bjb2RlIGFuZCBzaXggcHVsc2UgaW4gdGhhdCBvcmRlcgorICAgIFNoaWZ0T3V0Qml0cyhwQWQsIEVFUFJPTV9FV0VOX09QQ09ERSwgNSk7CisgICAgU2hpZnRPdXRCaXRzKHBBZCwgMCwgNik7CisKKyAgICBFRXByb21DbGVhbnVwKHBBZCk7Cit9CisKK1ZPSUQgRVdEUygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKyAgICBVSU5UMzIJeDsKKworICAgIC8vIHJlc2V0IGJpdHMgYW5kIHNldCBFRUNTCisgICAgUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7CisgICAgeCAmPSB+KEVFREkgfCBFRURPIHwgRUVTSyk7CisgICAgeCB8PSBFRUNTOworICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOworCisJLy8ga2ljayBhIHB1bHNlCisJUmFpc2VDbG9jayhwQWQsICZ4KTsKKwlMb3dlckNsb2NrKHBBZCwgJngpOworCisgICAgLy8gb3V0cHV0IHRoZSByZWFkX29wY29kZSBhbmQgc2l4IHB1bHNlIGluIHRoYXQgb3JkZXIKKyAgICBTaGlmdE91dEJpdHMocEFkLCBFRVBST01fRVdEU19PUENPREUsIDUpOworICAgIFNoaWZ0T3V0Qml0cyhwQWQsIDAsIDYpOworCisgICAgRUVwcm9tQ2xlYW51cChwQWQpOworfQorCisvLyBJUlFMID0gUEFTU0lWRV9MRVZFTAorVVNIT1JUIFJUTVBfRUVQUk9NX1JFQUQxNigKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiAgVVNIT1JUIE9mZnNldCkKK3sKKyAgICBVSU5UMzIJCXg7CisgICAgVVNIT1JUCQlkYXRhOworCisgICAgT2Zmc2V0IC89IDI7CisgICAgLy8gcmVzZXQgYml0cyBhbmQgc2V0IEVFQ1MKKyAgICBSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKyAgICB4ICY9IH4oRUVESSB8IEVFRE8gfCBFRVNLKTsKKyAgICB4IHw9IEVFQ1M7CisgICAgUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7CisKKwkvLyBraWNrIGEgcHVsc2UKKwlSYWlzZUNsb2NrKHBBZCwgJngpOworCUxvd2VyQ2xvY2socEFkLCAmeCk7CisKKyAgICAvLyBvdXRwdXQgdGhlIHJlYWRfb3Bjb2RlIGFuZCByZWdpc3RlciBudW1iZXIgaW4gdGhhdCBvcmRlcgorICAgIFNoaWZ0T3V0Qml0cyhwQWQsIEVFUFJPTV9SRUFEX09QQ09ERSwgMyk7CisgICAgU2hpZnRPdXRCaXRzKHBBZCwgT2Zmc2V0LCBwQWQtPkVFUFJPTUFkZHJlc3NOdW0pOworCisgICAgLy8gTm93IHJlYWQgdGhlIGRhdGEgKDE2IGJpdHMpIGluIGZyb20gdGhlIHNlbGVjdGVkIEVFUFJPTSB3b3JkCisgICAgZGF0YSA9IFNoaWZ0SW5CaXRzKHBBZCk7CisKKyAgICBFRXByb21DbGVhbnVwKHBBZCk7CisKKyAgICByZXR1cm4gZGF0YTsKK30JLy9SZWFkRUVwcm9tCisKK1ZPSUQgUlRNUF9FRVBST01fV1JJVEUxNigKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiAgVVNIT1JUIE9mZnNldCwKKyAgICBJTiAgVVNIT1JUIERhdGEpCit7CisgICAgVUlOVDMyIHg7CisKKwlPZmZzZXQgLz0gMjsKKworCUVXRU4ocEFkKTsKKworICAgIC8vIHJlc2V0IGJpdHMgYW5kIHNldCBFRUNTCisgICAgUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7CisgICAgeCAmPSB+KEVFREkgfCBFRURPIHwgRUVTSyk7CisgICAgeCB8PSBFRUNTOworICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOworCisJLy8ga2ljayBhIHB1bHNlCisJUmFpc2VDbG9jayhwQWQsICZ4KTsKKwlMb3dlckNsb2NrKHBBZCwgJngpOworCisgICAgLy8gb3V0cHV0IHRoZSByZWFkX29wY29kZSAscmVnaXN0ZXIgbnVtYmVyIGFuZCBkYXRhIGluIHRoYXQgb3JkZXIKKyAgICBTaGlmdE91dEJpdHMocEFkLCBFRVBST01fV1JJVEVfT1BDT0RFLCAzKTsKKyAgICBTaGlmdE91dEJpdHMocEFkLCBPZmZzZXQsIHBBZC0+RUVQUk9NQWRkcmVzc051bSk7CisJU2hpZnRPdXRCaXRzKHBBZCwgRGF0YSwgMTYpOwkJLy8gMTYtYml0IGFjY2VzcworCisgICAgLy8gcmVhZCBETyBzdGF0dXMKKyAgICBSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKworCUVFcHJvbUNsZWFudXAocEFkKTsKKworCVJUTVB1c2VjRGVsYXkoMTAwMDApOwkvL2RlbGF5IGZvciB0d3AoTUFYKT0xMG1zCisKKwlFV0RTKHBBZCk7CisKKyAgICBFRXByb21DbGVhbnVwKHBBZCk7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2Zpcm13YXJlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9maXJtd2FyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3Mjk5NmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9maXJtd2FyZS5oCkBAIC0wLDAgKzEsNTU4IEBACisvKgorIENvcHlyaWdodCAoYykgMjAwNywgUmFsaW5rIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24KKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24uICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIGJpbmFyeSBmb3JtLCB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIG1ldDoKKworIAkqIFJlZGlzdHJpYnV0aW9ucyBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhlCisgCWZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAJcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIAkqIE5laXRoZXIgdGhlIG5hbWUgb2YgUmFsaW5rIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAJc3VwcGxpZXJzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcworIAlzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAJKiBObyByZXZlcnNlIGVuZ2luZWVyaW5nLCBkZWNvbXBpbGF0aW9uLCBvciBkaXNhc3NlbWJseSBvZiB0aGlzIHNvZnR3YXJlCisgCWlzIHBlcm1pdHRlZC4KKworIExpbWl0ZWQgcGF0ZW50IGxpY2Vuc2UuIFJhbGluayBUZWNobm9sb2d5IENvcnBvcmF0aW9uIGdyYW50cyBhIHdvcmxkLXdpZGUsCisgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlIGxpY2Vuc2UgdW5kZXIgcGF0ZW50cyBpdCBub3cgb3IgaGVyZWFmdGVyCisgb3ducyBvciBjb250cm9scyB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgaW1wb3J0LCBvZmZlciB0byBzZWxsIGFuZAorIHNlbGwgKCJVdGlsaXplIikgdGhpcyBzb2Z0d2FyZSwgYnV0IHNvbGVseSB0byB0aGUgZXh0ZW50IHRoYXQgYW55Cisgc3VjaCBwYXRlbnQgaXMgbmVjZXNzYXJ5IHRvIFV0aWxpemUgdGhlIHNvZnR3YXJlIGFsb25lLCBvciBpbgorIGNvbWJpbmF0aW9uIHdpdGggYW4gb3BlcmF0aW5nIHN5c3RlbSBsaWNlbnNlZCB1bmRlciBhbiBhcHByb3ZlZCBPcGVuCisgU291cmNlIGxpY2Vuc2UgYXMgbGlzdGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGF0CisgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzLiAgVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bworIGFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGlzIHNvZnR3YXJlLiAgTm8gaGFyZHdhcmUgcGVyCisgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLgorCisgRElTQ0xBSU1FUi4gIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORAorIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywKKyBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MKKyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyBEQU1BR0UuCisqLworLyogQVVUTyBHRU4gUExFQVNFIERPIE5PVCBNT0RJRlkgSVQgKi8KKy8qIEFVVE8gR0VOIFBMRUFTRSBETyBOT1QgTU9ESUZZIElUICovCisKKworVUNIQVIgRmlybXdhcmVJbWFnZSBbXSA9IHsKKzB4MDIsIDB4MDMsIDB4NWUsIDB4MDIsIDB4MDIsIDB4YjEsIDB4MjIsIDB4MjIsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDIsIDB4MDEsIDB4ODIsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweDAyLCAweDAwLCAweDFlLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDAyLCAweDAxLCAweDMzLCAweGMwLCAweGUwLAorMHhjMCwgMHhmMCwgMHhjMCwgMHg4MywgMHhjMCwgMHg4MiwgMHhjMCwgMHhkMCwgMHg3NSwgMHhkMCwgMHgxOCwgMHhjMiwgMHhhZiwgMHgzMCwgMHg0NSwgMHgwMywKKzB4MTIsIDB4MTAsIDB4MDksIDB4OTAsIDB4MDQsIDB4MTYsIDB4ZTAsIDB4MzAsIDB4ZTMsIDB4MDMsIDB4NzQsIDB4MDgsIDB4ZjAsIDB4OTAsIDB4MDQsIDB4MTQsCisweGUwLCAweDIwLCAweGU3LCAweDAzLCAweDAyLCAweDAwLCAweGNiLCAweDc0LCAweDgwLCAweGYwLCAweDkwLCAweDcwLCAweDEyLCAweGUwLCAweGY1LCAweDJmLAorMHg5MCwgMHgwNCwgMHgwNCwgMHhlMCwgMHgyNCwgMHhjZiwgMHg2MCwgMHgzMCwgMHgxNCwgMHg2MCwgMHg0MiwgMHgyNCwgMHhlMiwgMHg2MCwgMHg0NywgMHgxNCwKKzB4NjAsIDB4NTUsIDB4MjQsIDB4MjEsIDB4NzAsIDB4NjAsIDB4ZTUsIDB4NTUsIDB4MjQsIDB4ZmUsIDB4NjAsIDB4MDcsIDB4MTQsIDB4NjAsIDB4MDgsIDB4MjQsCisweDAyLCAweDcwLCAweDA4LCAweDdkLCAweDAxLCAweDgwLCAweDI4LCAweDdkLCAweDAyLCAweDgwLCAweDI0LCAweDkwLCAweDcwLCAweDEwLCAweGUwLCAweGY1LAorMHg1MCwgMHg4NSwgMHgyZiwgMHg0MCwgMHhkMiwgMHgwMSwgMHg4MCwgMHgzZSwgMHhlNSwgMHg1NSwgMHg2NCwgMHgwMywgMHg2MCwgMHgwNCwgMHhlNSwgMHg1NSwKKzB4NzAsIDB4MDQsIDB4N2QsIDB4MDIsIDB4ODAsIDB4MDksIDB4ODUsIDB4MmYsIDB4NDEsIDB4ZDIsIDB4MDIsIDB4ODAsIDB4MjksIDB4YWQsIDB4NTUsIDB4YWYsCisweDJmLCAweDEyLCAweDAyLCAweDhkLCAweDgwLCAweDIwLCAweDkwLCAweDcwLCAweDEwLCAweGUwLCAweGY1LCAweDQ3LCAweDkwLCAweDcwLCAweDExLCAweGUwLAorMHhmNSwgMHg0NCwgMHgxMiwgMHgxMCwgMHgyNSwgMHg4MCwgMHgwNiwgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHhmNSwgMHg0NSwgMHhlNCwgMHhmZCwgMHhhZiwKKzB4MmYsIDB4MTIsIDB4MDIsIDB4OGQsIDB4ZDIsIDB4MDQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZTQsIDB4ZjAsIDB4ZDIsIDB4YWYsIDB4ZDAsIDB4ZDAsIDB4ZDAsCisweDgyLCAweGQwLCAweDgzLCAweGQwLCAweGYwLCAweGQwLCAweGUwLCAweDMyLCAweDkwLCAweDcwLCAweDJhLCAweGUwLCAweDMwLCAweGUxLCAweDUzLCAweGMyLAorMHhhZiwgMHg5MCwgMHg3MCwgMHgyOCwgMHhlMCwgMHg5MCwgMHgxMCwgMHgxYywgMHhmMCwgMHg5MCwgMHg3MCwgMHgyOSwgMHhlMCwgMHg5MCwgMHgxMCwgMHgxZCwKKzB4ZjAsIDB4OTAsIDB4NzAsIDB4MmEsIDB4ZTAsIDB4OTAsIDB4MTAsIDB4MWUsIDB4ZjAsIDB4OTAsIDB4MTAsIDB4MWMsIDB4ZTAsIDB4ZjUsIDB4MzAsIDB4OTAsCisweDEwLCAweDFlLCAweGUwLCAweDIwLCAweGUxLCAweGYzLCAweDkwLCAweDEwLCAweDFjLCAweGUwLCAweDkwLCAweDcwLCAweDI4LCAweGYwLCAweDkwLCAweDEwLAorMHgxZCwgMHhlMCwgMHg5MCwgMHg3MCwgMHgyOSwgMHhmMCwgMHg5MCwgMHgxMCwgMHgxZSwgMHhlMCwgMHg5MCwgMHg3MCwgMHgyYSwgMHhmMCwgMHgzMCwgMHg0YSwKKzB4MGQsIDB4OTAsIDB4NzAsIDB4MjQsIDB4ZTAsIDB4NDQsIDB4MDEsIDB4ZjAsIDB4OTAsIDB4MDIsIDB4MmMsIDB4NzQsIDB4ZmYsIDB4ZjAsIDB4YzIsIDB4MDUsCisweGQyLCAweGFmLCAweDIyLCAweGMwLCAweGUwLCAweGMwLCAweGYwLCAweGMwLCAweDgzLCAweGMwLCAweDgyLCAweGMwLCAweGQwLCAweGU4LCAweGMwLCAweGUwLAorMHhlOSwgMHhjMCwgMHhlMCwgMHhlYSwgMHhjMCwgMHhlMCwgMHhlYiwgMHhjMCwgMHhlMCwgMHhlYywgMHhjMCwgMHhlMCwgMHhlZCwgMHhjMCwgMHhlMCwgMHhlZSwKKzB4YzAsIDB4ZTAsIDB4ZWYsIDB4YzAsIDB4ZTAsIDB4YzIsIDB4YWYsIDB4MzAsIDB4NDUsIDB4MDMsIDB4MTIsIDB4MTAsIDB4MTIsIDB4ZDIsIDB4YWYsIDB4ZDAsCisweGUwLCAweGZmLCAweGQwLCAweGUwLCAweGZlLCAweGQwLCAweGUwLCAweGZkLCAweGQwLCAweGUwLCAweGZjLCAweGQwLCAweGUwLCAweGZiLCAweGQwLCAweGUwLAorMHhmYSwgMHhkMCwgMHhlMCwgMHhmOSwgMHhkMCwgMHhlMCwgMHhmOCwgMHhkMCwgMHhkMCwgMHhkMCwgMHg4MiwgMHhkMCwgMHg4MywgMHhkMCwgMHhmMCwgMHhkMCwKKzB4ZTAsIDB4MzIsIDB4YzAsIDB4ZTAsIDB4YzAsIDB4ZjAsIDB4YzAsIDB4ODMsIDB4YzAsIDB4ODIsIDB4YzAsIDB4ZDAsIDB4NzUsIDB4ZDAsIDB4MTAsIDB4YzIsCisweGFmLCAweDMwLCAweDQ1LCAweDAzLCAweDEyLCAweDEwLCAweDBjLCAweDMwLCAweDU4LCAweDBhLCAweGU1LCAweDU0LCAweDYwLCAweDA0LCAweDE1LCAweDU0LAorMHg4MCwgMHgwMiwgMHhjMiwgMHg1OCwgMHgzMCwgMHg1OSwgMHgwYSwgMHhlNSwgMHg1MCwgMHg2MCwgMHgwNCwgMHgxNSwgMHg1MCwgMHg4MCwgMHgwMiwgMHhjMiwKKzB4NTksIDB4ZDUsIDB4NTMsIDB4MDcsIDB4MzAsIDB4NjAsIDB4MDQsIDB4MTUsIDB4NDYsIDB4ZDIsIDB4MDQsIDB4MzAsIDB4NDUsIDB4MDMsIDB4MTIsIDB4MTAsCisweDBmLCAweGMyLCAweDhkLCAweGQyLCAweGFmLCAweGQwLCAweGQwLCAweGQwLCAweDgyLCAweGQwLCAweDgzLCAweGQwLCAweGYwLCAweGQwLCAweGUwLCAweDMyLAorMHgxMiwgMHgwMiwgMHhkMywgMHgzMCwgMHg0NSwgMHgwMywgMHgxMiwgMHgxMCwgMHgwMywgMHgzMCwgMHgwMSwgMHgwNiwgMHgyMCwgMHgwOSwgMHgwMywgMHgxMiwKKzB4MTAsIDB4MWMsIDB4MzAsIDB4MDIsIDB4MDYsIDB4MjAsIDB4MGEsIDB4MDMsIDB4MTIsIDB4MTAsIDB4MWYsIDB4MzAsIDB4MDMsIDB4MDYsIDB4MjAsIDB4MGIsCisweDAzLCAweDEyLCAweDEwLCAweDFmLCAweDMwLCAweDA0LCAweDA2LCAweDIwLCAweDBjLCAweDAzLCAweDEyLCAweDEwLCAweDIyLCAweDIwLCAweDEzLCAweDA5LAorMHgyMCwgMHgxMSwgMHgwNiwgMHhlNSwgMHgyYiwgMHg0NSwgMHgyYywgMHg2MCwgMHgwMywgMHhkMywgMHg4MCwgMHgwMSwgMHhjMywgMHg5MiwgMHhhOSwgMHgxMiwKKzB4MDIsIDB4ZWMsIDB4ODAsIDB4YmYsIDB4YzIsIDB4NDMsIDB4ZDIsIDB4NDUsIDB4ZTQsIDB4ZjUsIDB4MjAsIDB4ZjUsIDB4MjEsIDB4ZjUsIDB4NTMsIDB4ZjUsCisweDQ2LCAweGY1LCAweDJiLCAweGY1LCAweDJjLCAweGMyLCAweDQyLCAweGY1LCAweDUxLCAweGY1LCAweDUyLCAweGY1LCAweDU1LCAweDkwLCAweDA0LCAweDE4LAorMHg3NCwgMHg4MCwgMHhmMCwgMHg5MCwgMHgwNCwgMHgxYSwgMHg3NCwgMHgwOCwgMHhmMCwgMHhjMiwgMHgxOSwgMHhjMiwgMHgxOCwgMHhjMiwgMHgxYSwgMHgyMiwKKzB4YzgsIDB4ZWYsIDB4YzgsIDB4ZTYsIDB4ZmEsIDB4MDgsIDB4ZTYsIDB4NGEsIDB4NjAsIDB4MGMsIDB4YzgsIDB4ZWYsIDB4YzgsIDB4MDgsIDB4ZTYsIDB4MTYsCisweDE4LCAweDcwLCAweDAxLCAweDE2LCAweGMzLCAweDIyLCAweGVkLCAweDI0LCAweGZmLCAweGZkLCAweGVjLCAweDM0LCAweGZmLCAweGM4LCAweGVmLCAweGM4LAorMHhmNiwgMHgwOCwgMHhjNiwgMHhlZCwgMHhjNiwgMHhkMywgMHgyMiwgMHhkMCwgMHg4MywgMHhkMCwgMHg4MiwgMHhmOCwgMHhlNCwgMHg5MywgMHg3MCwgMHgxMiwKKzB4NzQsIDB4MDEsIDB4OTMsIDB4NzAsIDB4MGQsIDB4YTMsIDB4YTMsIDB4OTMsIDB4ZjgsIDB4NzQsIDB4MDEsIDB4OTMsIDB4ZjUsIDB4ODIsIDB4ODgsIDB4ODMsCisweGU0LCAweDczLCAweDc0LCAweDAyLCAweDkzLCAweDY4LCAweDYwLCAweGVmLCAweGEzLCAweGEzLCAweGEzLCAweDgwLCAweGRmLCAweGVmLCAweGY0LCAweDYwLAorMHgxZiwgMHhlNCwgMHhmZSwgMHgxMiwgMHgwMywgMHg2YSwgMHhlMCwgMHhiNCwgMHhmZiwgMHgxMiwgMHgxMiwgMHgwMywgMHg2YSwgMHhlZiwgMHhmMCwgMHg3NCwKKzB4MWMsIDB4MmUsIDB4ZjUsIDB4ODIsIDB4ZTQsIDB4MzQsIDB4NzAsIDB4ZjUsIDB4ODMsIDB4ZWQsIDB4ZjAsIDB4MjIsIDB4MGUsIDB4YmUsIDB4MDQsIDB4ZTMsCisweDIyLCAweGMwLCAweGUwLCAweGMwLCAweGYwLCAweGMwLCAweDgzLCAweGMwLCAweDgyLCAweGMwLCAweGQwLCAweDc1LCAweGQwLCAweDA4LCAweGMyLCAweGFmLAorMHgzMCwgMHg0NSwgMHgwMywgMHgxMiwgMHgxMCwgMHgwNiwgMHhkMiwgMHhhZiwgMHhkMCwgMHhkMCwgMHhkMCwgMHg4MiwgMHhkMCwgMHg4MywgMHhkMCwgMHhmMCwKKzB4ZDAsIDB4ZTAsIDB4MzIsIDB4YzIsIDB4YWYsIDB4MTIsIDB4MDAsIDB4MDYsIDB4MTIsIDB4MDIsIDB4MTQsIDB4MTIsIDB4MDMsIDB4MWMsIDB4ZTQsIDB4ZjUsCisweDIyLCAweGY1LCAweDQ3LCAweDkwLCAweDA0LCAweDAwLCAweDc0LCAweDgwLCAweGYwLCAweGQyLCAweGFmLCAweDIyLCAweDMwLCAweDQ1LCAweDAzLCAweDEyLAorMHgxMCwgMHgxNSwgMHhlNSwgMHgyMCwgMHg3MCwgMHgwMywgMHgyMCwgMHgxMCwgMHgwMywgMHgzMCwgMHgxMSwgMHgwMywgMHg0MywgMHg4NywgMHgwMSwgMHgyMiwKKzB4YzAsIDB4MmEsIDB4NzQsIDB4MDMsIDB4YzAsIDB4ZTAsIDB4YzAsIDB4ODIsIDB4YzAsIDB4ODMsIDB4NzUsIDB4MmEsIDB4MGEsIDB4MjIsIDB4YzAsIDB4MmEsCisweDc0LCAweDAzLCAweGMwLCAweGUwLCAweGMwLCAweDgyLCAweGMwLCAweDgzLCAweDc1LCAweDJhLCAweDE4LCAweDIyLCAweDc1LCAweDg5LCAweDAyLCAweGU0LAorMHhmNSwgMHg4YywgMHhmNSwgMHg4YSwgMHhmNSwgMHg4OCwgMHhmNSwgMHhiOCwgMHhmNSwgMHhlOCwgMHg3NSwgMHg5MCwgMHgxOCwgMHhkMiwgMHg4YywgMHg3NSwKKzB4YTgsIDB4MDUsIDB4MjIsIDB4Y2UsIDB4ZWYsIDB4Y2UsIDB4ZWUsIDB4NjAsIDB4MDgsIDB4N2YsIDB4ZmYsIDB4MTIsIDB4MDMsIDB4ODAsIDB4MWUsIDB4ODAsCisweGY1LCAweDIyLCAweGM4LCAweGVmLCAweGM4LCAweGU2LCAweDYwLCAweDAzLCAweDE2LCAweGMzLCAweDIyLCAweGVkLCAweDE0LCAweGY2LCAweGQzLCAweDIyLAorMHhjOCwgMHhlZiwgMHhjOCwgMHhlNiwgMHg2MCwgMHgwNiwgMHgxNiwgMHhlNiwgMHgyNCwgMHhmZiwgMHhiMywgMHgyMiwgMHhjMywgMHgyMiwgMHg3OCwgMHg3ZiwKKzB4ZTQsIDB4ZjYsIDB4ZDgsIDB4ZmQsIDB4NzUsIDB4ODEsIDB4NWYsIDB4MDIsIDB4MDEsIDB4ZDAsIDB4NzQsIDB4MTQsIDB4MmUsIDB4ZjUsIDB4ODIsIDB4ZTQsCisweDM0LCAweDcwLCAweGY1LCAweDgzLCAweDIyLCAweGVmLCAweDkwLCAweDAzLCAweDdlLCAweDkzLCAweDkwLCAweDAzLCAweDAwLCAweDczLCAweDBhLCAweDE4LAorMHhlZiwgMHg2MCwgMHgwMywgMHgxZiwgMHg4MCwgMHhmYSwgMHgyMiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisweGZmLCAweGZmLCAweGZmLCAweDAyLCAweDEwLCAweDI4LCAweDAyLCAweDEwLCAweDNiLCAweDAyLCAweDEwLCAweDNjLCAweDAyLCAweDEyLCAweGI4LCAweDAyLAorMHgxMiwgMHhiOSwgMHgwMiwgMHgxMywgMHgzZSwgMHgwMiwgMHgxMywgMHgzZiwgMHhjMywgMHgyMiwgMHhmZiwgMHhmZiwgMHgwMiwgMHgxNiwgMHg1NiwgMHgwMiwKKzB4MTcsIDB4NmIsIDB4MDIsIDB4MTQsIDB4MmEsIDB4MDIsIDB4MTMsIDB4NDAsIDB4MzAsIDB4MDUsIDB4MDYsIDB4MjAsIDB4MGQsIDB4MDMsIDB4MTIsIDB4MDAsCisweGQ4LCAweDMwLCAweDA2LCAweDA2LCAweDIwLCAweDBlLCAweDAzLCAweDEyLCAweDE4LCAweDVlLCAweDIyLCAweDIyLCAweDkwLCAweDA0LCAweDE0LCAweGUwLAorMHgyMCwgMHhlNywgMHgwMywgMHgwMiwgMHgxMiwgMHhiNywgMHg5MCwgMHg3MCwgMHgxMiwgMHhlMCwgMHhmNSwgMHg1NiwgMHg5MCwgMHgwNCwgMHgwNCwgMHhlMCwKKzB4MTIsIDB4MDIsIDB4NjcsIDB4MTEsIDB4NGUsIDB4MzAsIDB4MTEsIDB4MjUsIDB4MzEsIDB4MTAsIDB4ODcsIDB4MzMsIDB4MTAsIDB4YWEsIDB4MzQsIDB4MTAsCisweGMzLCAweDM1LCAweDExLCAweDU3LCAweDUwLCAweDExLCAweDdiLCAweDUxLCAweDExLCAweDg0LCAweDUyLCAweDExLCAweDg0LCAweDUzLCAweDExLCAweDg0LAorMHg1NCwgMHgxMSwgMHhjNSwgMHg1NSwgMHgxMSwgMHhkYywgMHg3MCwgMHgxMiwgMHgwNywgMHg3MSwgMHgxMiwgMHgzNCwgMHg3MiwgMHgxMiwgMHg1ZSwgMHg4MCwKKzB4MTIsIDB4ODEsIDB4ODMsIDB4MDAsIDB4MDAsIDB4MTIsIDB4YjcsIDB4NzUsIDB4MjQsIDB4MDUsIDB4NzUsIDB4MjUsIDB4ZGMsIDB4OTAsIDB4NzAsIDB4OWYsCisweDc0LCAweDEyLCAweGYwLCAweGQyLCAweDE4LCAweGQyLCAweDYxLCAweDc1LCAweDM1LCAweDBkLCAweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLCAweGU1LAorMHg1NiwgMHhmNCwgMHg3MCwgMHgwMywgMHgwMiwgMHgxMiwgMHhiNywgMHgwMiwgMHgxMiwgMHhhYSwgMHhjMiwgMHgxOCwgMHg5MCwgMHgwMSwgMHgxNCwgMHhlMCwKKzB4NTQsIDB4ZmQsIDB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZjAsIDB4ZTUsIDB4NTYsIDB4ZjQsIDB4NzAsIDB4MDMsIDB4MDIsIDB4MTIsIDB4YjcsCisweDAyLCAweDEyLCAweGFhLCAweGU1LCAweDU1LCAweDY0LCAweDAyLCAweDcwLCAweDM3LCAweDkwLCAweDcwLCAweDEwLCAweGUwLCAweDYwLCAweDA4LCAweDkwLAorMHgwMSwgMHgwZCwgMHg3NCwgMHgwOSwgMHhmMCwgMHg4MCwgMHgyNSwgMHhlNSwgMHgzNCwgMHgxNCwgMHg2MCwgMHgwYSwgMHgxNCwgMHg2MCwgMHgwZiwgMHgxNCwKKzB4NjAsIDB4MTQsIDB4MjQsIDB4MDMsIDB4NzAsIDB4MTYsIDB4OTAsIDB4MDEsIDB4MGQsIDB4NzQsIDB4MDgsIDB4ZjAsIDB4ODAsIDB4MGUsIDB4OTAsIDB4MDEsCisweDBkLCAweDc0LCAweDBiLCAweGYwLCAweDgwLCAweDA2LCAweDkwLCAweDAxLCAweDBkLCAweDc0LCAweDFiLCAweGYwLCAweDdkLCAweDAxLCAweDgwLCAweDAyLAorMHg3ZCwgMHgwMiwgMHhhZiwgMHg1NiwgMHgxMiwgMHgwMiwgMHg4ZCwgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwgMHgyNCwgMHhmZiwgMHg5MiwgMHgxYiwgMHg5MCwKKzB4MDQsIDB4MTQsIDB4NzQsIDB4ODAsIDB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZjAsIDB4ZTUsIDB4NTYsIDB4ZjQsIDB4NzAsIDB4MDMsIDB4MDIsCisweDEyLCAweGI3LCAweDAyLCAweDEyLCAweGFhLCAweDIwLCAweDAyLCAweDAzLCAweDMwLCAweDAzLCAweDFkLCAweDdkLCAweDAyLCAweGFmLCAweDU2LCAweDEyLAorMHgwMiwgMHg4ZCwgMHg5MCwgMHgwNCwgMHgxNCwgMHg3NCwgMHg4MCwgMHhmMCwgMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywgMHhmMCwgMHhlNSwgMHg1NiwgMHhmNCwKKzB4NzAsIDB4MDMsIDB4MDIsIDB4MTIsIDB4YjcsIDB4MDIsIDB4MTIsIDB4YWEsIDB4ODUsIDB4NTYsIDB4NDEsIDB4ZDIsIDB4MDIsIDB4MjIsIDB4OTAsIDB4NzAsCisweDExLCAweGUwLCAweDI0LCAweGZmLCAweDkyLCAweDFiLCAweDIyLCAweDkwLCAweDcwLCAweDEwLCAweGUwLCAweDU0LCAweDdmLCAweDY0LCAweDAyLCAweDYwLAorMHgwMywgMHgwMiwgMHgxMiwgMHhiNywgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgwOCwgMHhlMCwgMHg2NCwgMHgyMCwgMHg2MCwKKzB4MDMsIDB4MDIsIDB4MTIsIDB4YjcsIDB4NzUsIDB4NGUsIDB4MDMsIDB4NzUsIDB4NGYsIDB4MjAsIDB4MjIsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsIDB4MjQsCisweGZmLCAweDkyLCAweDQ3LCAweDIyLCAweDkwLCAweDA0LCAweDA0LCAweGUwLCAweDI1LCAweGUwLCAweDI0LCAweDVkLCAweGY1LCAweDU3LCAweDkwLCAweDcwLAorMHgxMCwgMHhlMCwgMHhmZiwgMHg3NCwgMHg0NywgMHgyNSwgMHg1NywgMHhmOCwgMHhjNiwgMHhlZiwgMHhjNiwgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwgMHhmZiwKKzB4NzQsIDB4NDgsIDB4MjUsIDB4NTcsIDB4ZjgsIDB4YzYsIDB4ZWYsIDB4YzYsIDB4ZTQsIDB4ZmQsIDB4YWYsIDB4NTYsIDB4MTIsIDB4MDIsIDB4OGQsIDB4OTAsCisweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLCAweGU1LCAweDU2LCAweGY0LCAweDcwLCAweDAzLCAweDAyLAorMHgxMiwgMHhiNywgMHgwMiwgMHgxMiwgMHhhYSwgMHhlNSwgMHg0NywgMHhiNCwgMHgwNywgMHgwOCwgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwgMHg1NCwgMHgwNywKKzB4ZjUsIDB4MjYsIDB4ZTQsIDB4ZmQsIDB4YWYsIDB4NTYsIDB4MTIsIDB4MDIsIDB4OGQsIDB4ZDIsIDB4MDQsIDB4MjIsIDB4OTAsIDB4NzAsIDB4MTAsIDB4ZTAsCisweGZlLCAweDkwLCAweDcwLCAweDExLCAweGUwLCAweGZkLCAweGVkLCAweGY4LCAweGU2LCAweGY1LCAweDU3LCAweGZkLCAweGFmLCAweDU2LCAweDEyLCAweDAyLAorMHg4ZCwgMHg5MCwgMHgwNCwgMHgxNCwgMHg3NCwgMHg4MCwgMHhmMCwgMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywgMHhmMCwgMHhlNSwgMHg1NiwgMHhmNCwgMHg3MCwKKzB4MDMsIDB4MDIsIDB4MTIsIDB4YjcsIDB4MDIsIDB4MTIsIDB4YWEsIDB4OTAsIDB4NzAsIDB4MTAsIDB4ZTAsIDB4ZmUsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsCisweGZkLCAweGVkLCAweGY1LCAweDgyLCAweDhlLCAweDgzLCAweGUwLCAweGY1LCAweDU3LCAweGZkLCAweGFmLCAweDU2LCAweDEyLCAweDAyLCAweDhkLCAweDkwLAorMHgwNCwgMHgxNCwgMHg3NCwgMHg4MCwgMHhmMCwgMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywgMHhmMCwgMHhlNSwgMHg1NiwgMHhmNCwgMHg3MCwgMHgwMywgMHgwMiwKKzB4MTIsIDB4YjcsIDB4ODAsIDB4NzYsIDB4ZTQsIDB4ZjUsIDB4NGUsIDB4ZjUsIDB4NGYsIDB4NzUsIDB4MjYsIDB4ZmYsIDB4YzIsIDB4MTksIDB4YzIsIDB4MTgsCisweGMyLCAweDFhLCAweDc1LCAweDM0LCAweGZmLCAweGFkLCAweDU3LCAweGFmLCAweDU2LCAweDEyLCAweDAyLCAweDhkLCAweDkwLCAweDA0LCAweDE0LCAweDc0LAorMHg4MCwgMHhmMCwgMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywgMHhmMCwgMHhlNSwgMHg1NiwgMHhmNCwgMHg2MCwgMHg1YiwgMHg4MCwgMHg0YywgMHg5MCwgMHg3MCwKKzB4MTAsIDB4ZTAsIDB4MjQsIDB4ZmYsIDB4OTIsIDB4NGEsIDB4ZDIsIDB4MDUsIDB4YWQsIDB4NTcsIDB4YWYsIDB4NTYsIDB4MTIsIDB4MDIsIDB4OGQsIDB4OTAsCisweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLCAweGU1LCAweDU2LCAweGY0LCAweDYwLCAweDM4LCAweDgwLAorMHgyOSwgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHhmNSwgMHgzNCwgMHhkMywgMHg5NCwgMHgwMCwgMHg0MCwgMHgwNywgMHg5MCwgMHgwMSwgMHgwZCwgMHhlMCwKKzB4NTQsIDB4ZmIsIDB4ZjAsIDB4YWQsIDB4NTcsIDB4YWYsIDB4NTYsIDB4MTIsIDB4MDIsIDB4OGQsIDB4OTAsIDB4MDQsIDB4MTQsIDB4NzQsIDB4ODAsIDB4ZjAsCisweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLCAweGU1LCAweDU2LCAweGY0LCAweDYwLCAweDBkLCAweDkwLCAweDcwLCAweDI1LCAweGUwLCAweDQ0LCAweDAxLAorMHhmMCwgMHg5MCwgMHgwMiwgMHgyYywgMHg3NCwgMHhmZiwgMHhmMCwgMHgyMiwgMHgyMiwgMHhlNSwgMHg1MywgMHg2MCwgMHgwMywgMHgwMiwgMHgxMywgMHgzZCwKKzB4ZTUsIDB4NGYsIDB4NDUsIDB4NGUsIDB4NjAsIDB4MDgsIDB4ZTUsIDB4NGYsIDB4MTUsIDB4NGYsIDB4NzAsIDB4MDIsIDB4MTUsIDB4NGUsIDB4YTIsIDB4MTksCisweGU0LCAweDMzLCAweDkwLCAweDcwLCAweDkwLCAweGYwLCAweGEyLCAweDE4LCAweGU0LCAweDMzLCAweGEzLCAweGYwLCAweDMwLCAweDE5LCAweDRkLCAweDkwLAorMHg3MCwgMHg5OCwgMHg3NCwgMHgyMywgMHhmMCwgMHhhMywgMHhlNSwgMHgyNSwgMHhmMCwgMHhlNSwgMHgyNCwgMHhhMywgMHhmMCwgMHg3ZiwgMHgzNSwgMHg3ZCwKKzB4MzIsIDB4MTIsIDB4MDMsIDB4NDIsIDB4NTAsIDB4MDksIDB4OTAsIDB4MTAsIDB4MDQsIDB4ZTAsIDB4NTQsIDB4ZjcsIDB4ZjAsIDB4ZDIsIDB4MDYsIDB4ZTUsCisweDM1LCAweGQzLCAweDk0LCAweDEwLCAweDQwLCAweDFlLCAweDMwLCAweDFhLCAweDFiLCAweGMyLCAweDFhLCAweGEyLCAweDE4LCAweDkyLCAweDE5LCAweDIwLAorMHgxOSwgMHgxMiwgMHg5MCwgMHgwNCwgMHgwOSwgMHhlMCwgMHg1NCwgMHhkZCwgMHhmMCwgMHg5MCwgMHgxMCwgMHgwNCwgMHhlMCwgMHg0NCwgMHgwOCwgMHhmMCwKKzB4YzIsIDB4NjEsIDB4ZDIsIDB4MDMsIDB4ZTUsIDB4MzUsIDB4YjQsIDB4MGIsIDB4MTQsIDB4ZDIsIDB4MDMsIDB4MjIsIDB4ZTQsIDB4ZjUsIDB4MzUsIDB4YTIsCisweDE4LCAweDkyLCAweDE5LCAweDMwLCAweDE5LCAweDA3LCAweDkwLCAweDA0LCAweDA5LCAweGUwLCAweDQ0LCAweDIyLCAweGYwLCAweDIyLCAweDIyLCAweDIyLAorMHhjMiwgMHg0YiwgMHhjMiwgMHg0YywgMHhlNSwgMHg0NCwgMHgxMiwgMHgwMiwgMHg2NywgMHgxMywgMHg2MiwgMHgwMCwgMHgxMywgMHhmNSwgMHgwNCwgMHgxMywKKzB4ZjEsIDB4MDgsIDB4MTMsIDB4Y2MsIDB4MTAsIDB4MTMsIDB4NzYsIDB4MjAsIDB4MTMsIDB4OTYsIDB4NjAsIDB4MTMsIDB4YTcsIDB4YTAsIDB4MDAsIDB4MDAsCisweDEzLCAweGY3LCAweDg1LCAweDQ4LCAweDQzLCAweDg1LCAweDRhLCAweDQyLCAweDg1LCAweDRjLCAweDVlLCAweGU1LCAweDQ3LCAweDY0LCAweDA2LCAweDYwLAorMHgwMywgMHgwMiwgMHgxMywgMHhmNywgMHg4MCwgMHgxYiwgMHhlNSwgMHg0OCwgMHhjNCwgMHg1NCwgMHgwZiwgMHhmNSwgMHg0MywgMHhlNSwgMHg0YSwgMHhjNCwKKzB4NTQsIDB4MGYsIDB4ZjUsIDB4NDIsIDB4ZTUsIDB4NGMsIDB4YzQsIDB4NTQsIDB4MGYsIDB4ZjUsIDB4NWUsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDYsIDB4NzAsCisweDY2LCAweDUzLCAweDQzLCAweDBmLCAweDgwLCAweDYxLCAweDg1LCAweDQ5LCAweDQzLCAweDg1LCAweDRiLCAweDQyLCAweDg1LCAweDRkLCAweDVlLCAweGU1LAorMHg0NywgMHg2NCwgMHgwNiwgMHg3MCwgMHg1MiwgMHg4MCwgMHgxYiwgMHhlNSwgMHg0OSwgMHhjNCwgMHg1NCwgMHgwZiwgMHhmNSwgMHg0MywgMHhlNSwgMHg0YiwKKzB4YzQsIDB4NTQsIDB4MGYsIDB4ZjUsIDB4NDIsIDB4ZTUsIDB4NGQsIDB4YzQsIDB4NTQsIDB4MGYsIDB4ZjUsIDB4NWUsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDYsCisweDcwLCAweDM1LCAweGU1LCAweDQzLCAweDU0LCAweDBmLCAweDQ0LCAweDEwLCAweGY1LCAweDQzLCAweDgwLCAweDJiLCAweGU1LCAweDQ3LCAweGI0LCAweDA0LAorMHgwNiwgMHg1MywgMHg1ZSwgMHhmYiwgMHg3NSwgMHg0MiwgMHgwOSwgMHhlNSwgMHg0NywgMHhiNCwgMHgwNSwgMHgwNiwgMHg0MywgMHg1ZSwgMHgwNCwgMHg3NSwKKzB4NDIsIDB4MDksIDB4ZTUsIDB4NDcsIDB4YjQsIDB4MDYsIDB4MTAsIDB4ZTUsIDB4NDMsIDB4NTQsIDB4MGYsIDB4NDQsIDB4MzAsIDB4ZjUsIDB4NDMsIDB4ODAsCisweDA2LCAweGQyLCAweDRiLCAweDgwLCAweDAyLCAweGQyLCAweDRjLCAweGU0LCAweGY1LCAweDM4LCAweGU1LCAweDQyLCAweGM0LCAweDU0LCAweGYwLCAweGZmLAorMHhlNSwgMHg0MywgMHg1NCwgMHgwZiwgMHg0ZiwgMHhmNSwgMHg1ZiwgMHg5MCwgMHg3MCwgMHg0NCwgMHhmMCwgMHhhMywgMHhlNSwgMHg1ZSwgMHhmMCwgMHhhMywKKzB4ZTUsIDB4NGEsIDB4ZjAsIDB4YTMsIDB4ZTUsIDB4NDgsIDB4ZjAsIDB4YTMsIDB4ZTUsIDB4NGMsIDB4ZjAsIDB4YTMsIDB4ZTUsIDB4NDQsIDB4ZjAsIDB4YTMsCisweGU1LCAweDQyLCAweGYwLCAweGEzLCAweGU1LCAweDQzLCAweGYwLCAweGQyLCAweDYwLCAweDIyLCAweGU1LCAweDQ3LCAweDYwLCAweDEwLCAweDI0LCAweGMwLAorMHg3MCwgMHgwMywgMHgxMiwgMHgxNiwgMHgzNiwgMHgxMiwgMHgxNCwgMHgzZiwgMHhjMiwgMHhhZiwgMHhjMiwgMHgwNCwgMHhkMiwgMHhhZiwgMHgyMiwgMHhjMiwKKzB4YWYsIDB4OTAsIDB4MDQsIDB4MTQsIDB4ZTAsIDB4NTQsIDB4MGUsIDB4NjAsIDB4MDQsIDB4ZDIsIDB4MWMsIDB4ODAsIDB4MDgsIDB4ZTUsIDB4NGUsIDB4NDUsCisweDRmLCAweDI0LCAweGZmLCAweDkyLCAweDFjLCAweGQyLCAweGFmLCAweDkwLCAweDA0LCAweDE0LCAweGUwLCAweGEyLCAweGU0LCAweDkyLCAweDFkLCAweDc0LAorMHgxZSwgMHhmMCwgMHhlNSwgMHg1ZiwgMHg1NCwgMHgwZiwgMHhmNSwgMHgyZCwgMHhlNSwgMHgzOCwgMHg3MCwgMHgxMywgMHgzMCwgMHgxYywgMHgwNSwgMHhlNSwKKzB4NWYsIDB4MjAsIDB4ZTUsIDB4MGIsIDB4MzAsIDB4MWQsIDB4MTksIDB4ZTUsIDB4NWYsIDB4NTQsIDB4MzAsIDB4ZmYsIDB4YmYsIDB4MzAsIDB4MTEsIDB4ZTUsCisweDM4LCAweDcwLCAweDA1LCAweDc1LCAweDM4LCAweDBjLCAweDgwLCAweDAyLCAweDE1LCAweDM4LCAweGQyLCAweDZjLCAweGQyLCAweDZkLCAweDgwLCAweDBmLAorMHhlNSwgMHg1ZiwgMHgzMCwgMHhlNiwgMHgwNiwgMHhjMiwgMHg2YywgMHhkMiwgMHg2ZCwgMHg4MCwgMHgwNCwgMHhkMiwgMHg2YywgMHhjMiwgMHg2ZCwgMHhlNSwKKzB4NDcsIDB4NjQsIDB4MDMsIDB4NzAsIDB4MjEsIDB4MzAsIDB4NGIsIDB4MDYsIDB4YzIsIDB4NmMsIDB4ZDIsIDB4NmQsIDB4ODAsIDB4MTgsIDB4ZTUsIDB4MzgsCisweDcwLCAweDAzLCAweDMwLCAweDRjLCAweDExLCAweGMyLCAweDRjLCAweGU1LCAweDM4LCAweDcwLCAweDA1LCAweDc1LCAweDM4LCAweDA3LCAweDgwLCAweDAyLAorMHgxNSwgMHgzOCwgMHhkMiwgMHg2YywgMHhkMiwgMHg2ZCwgMHg5MCwgMHg3MCwgMHg0NiwgMHhlNSwgMHgyZCwgMHhmMCwgMHgyMCwgMHg2OSwgMHgwNywgMHhlNSwKKzB4NWUsIDB4MjAsIDB4ZTAsIDB4MDIsIDB4YjIsIDB4NjgsIDB4MjAsIDB4NmIsIDB4MDcsIDB4ZTUsIDB4NWUsIDB4MjAsIDB4ZTEsIDB4MDIsIDB4YjIsIDB4NmEsCisweDIwLCAweDZkLCAweDA3LCAweGU1LCAweDVlLCAweDIwLCAweGUyLCAweDAyLCAweGIyLCAweDZjLCAweDkwLCAweDcwLCAweDQ3LCAweGU1LCAweDJkLCAweGYwLAorMHg3NSwgMHgyZSwgMHg0MCwgMHgyMCwgMHg2OSwgMHgwNCwgMHhhMiwgMHg2OCwgMHg4MCwgMHgxNSwgMHgzMCwgMHg2OCwgMHgwNiwgMHhlNSwgMHg0NiwgMHhhMiwKKzB4ZTMsIDB4ODAsIDB4MGMsIDB4ZTUsIDB4NDYsIDB4NTQsIDB4ZjAsIDB4ZmYsIDB4YmYsIDB4ZjAsIDB4MDMsIDB4ZDMsIDB4ODAsIDB4MDEsIDB4YzMsIDB4OTIsCisweDczLCAweDkyLCAweDcyLCAweDIwLCAweDZiLCAweDA0LCAweGEyLCAweDZhLCAweDgwLCAweDE1LCAweDMwLCAweDZhLCAweDA2LCAweGU1LCAweDQ2LCAweGEyLAorMHhlMywgMHg4MCwgMHgwYywgMHhlNSwgMHg0NiwgMHg1NCwgMHhmMCwgMHhmZiwgMHhiZiwgMHhmMCwgMHgwMywgMHhkMywgMHg4MCwgMHgwMSwgMHhjMywgMHg5MiwKKzB4NzUsIDB4OTIsIDB4NzQsIDB4MjAsIDB4NmQsIDB4MDQsIDB4YTIsIDB4NmMsIDB4ODAsIDB4MTUsIDB4MzAsIDB4NmMsIDB4MDYsIDB4ZTUsIDB4NDYsIDB4YTIsCisweGUzLCAweDgwLCAweDBjLCAweGU1LCAweDQ2LCAweDU0LCAweGYwLCAweGZmLCAweGJmLCAweGYwLCAweDAzLCAweGQzLCAweDgwLCAweDAxLCAweGMzLCAweDkyLAorMHg3MSwgMHg5MiwgMHg3MCwgMHg5MCwgMHgxMCwgMHgyZiwgMHhlNSwgMHgyZSwgMHhmMCwgMHhlNSwgMHg0NywgMHg2NCwgMHgwNiwgMHg3MCwgMHg0NiwgMHg5MCwKKzB4MDIsIDB4MjksIDB4ZTAsIDB4NTQsIDB4ZmUsIDB4ZjAsIDB4ZTUsIDB4NDMsIDB4YzQsIDB4NTQsIDB4MGYsIDB4MTQsIDB4NjAsIDB4MTQsIDB4MjQsIDB4ZmUsCisweDYwLCAweDFmLCAweDI0LCAweDAzLCAweDYwLCAweDAzLCAweDAyLCAweDE2LCAweDM1LCAweDkwLCAweDAyLCAweDI4LCAweGUwLCAweDMwLCAweDQ3LCAweDBkLAorMHg4MCwgMHgwNywgMHg5MCwgMHgwMiwgMHgyOCwgMHhlMCwgMHgyMCwgMHg0NywgMHgwNCwgMHg1NCwgMHhmZSwgMHhmMCwgMHgyMiwgMHg0NCwgMHgwMSwgMHhmMCwKKzB4MjIsIDB4ZTUsIDB4NDYsIDB4MzAsIDB4ZTMsIDB4MDQsIDB4N2YsIDB4MDEsIDB4ODAsIDB4MDIsIDB4N2YsIDB4MDAsIDB4OTAsIDB4MDIsIDB4MjgsIDB4ZTAsCisweDU0LCAweGZlLCAweDRmLCAweGYwLCAweDIyLCAweGU1LCAweDQ3LCAweDY0LCAweDA3LCAweDYwLCAweDAzLCAweDAyLCAweDE2LCAweDM1LCAweGY1LCAweDI3LAorMHg5MCwgMHgwMiwgMHgyOSwgMHhlMCwgMHg1NCwgMHhmYywgMHhmMCwgMHhlNSwgMHgyNiwgMHgxNCwgMHg2MCwgMHgyNiwgMHgxNCwgMHg2MCwgMHgyZSwgMHgxNCwKKzB4NjAsIDB4MzYsIDB4MjQsIDB4MDMsIDB4NzAsIDB4NWYsIDB4ZTUsIDB4NDYsIDB4MTMsIDB4MTMsIDB4MTMsIDB4NTQsIDB4MWYsIDB4NzUsIDB4ZjAsIDB4MDMsCisweDg0LCAweGFmLCAweGYwLCAweDIwLCAweDQ3LCAweDA0LCAweDdlLCAweDAxLCAweDgwLCAweDAyLCAweDdlLCAweDAwLCAweGVmLCAweDZlLCAweDI0LCAweGZmLAorMHg4MCwgMHgwMiwgMHhhMiwgMHg0NywgMHg5MiwgMHgzOSwgMHhhMiwgMHg0NywgMHhiMywgMHg5MiwgMHgzOCwgMHg4MCwgMHgzZiwgMHhlNSwgMHg0NiwgMHgzMCwKKzB4ZTMsIDB4MDMsIDB4ZDMsIDB4ODAsIDB4MjcsIDB4YzMsIDB4ODAsIDB4MjQsIDB4ZTUsIDB4NDYsIDB4MzAsIDB4ZTMsIDB4MGQsIDB4NTQsIDB4NzAsIDB4YzMsCisweDk0LCAweDYwLCAweDUwLCAweDA2LCAweDdlLCAweDAwLCAweDdmLCAweDAxLCAweDgwLCAweDA0LCAweDdlLCAweDAwLCAweDdmLCAweDAwLCAweDIwLCAweDQ3LAorMHgwNCwgMHg3ZCwgMHgwMSwgMHg4MCwgMHgwMiwgMHg3ZCwgMHgwMCwgMHhlZiwgMHg2ZCwgMHg0ZSwgMHgyNCwgMHhmZiwgMHg5MiwgMHgzOCwgMHhhMiwgMHg0NywKKzB4YjMsIDB4OTIsIDB4MzksIDB4ODAsIDB4MDcsIDB4YTIsIDB4NDcsIDB4YjMsIDB4OTIsIDB4MzgsIDB4OTIsIDB4MzksIDB4OTAsIDB4MDIsIDB4MjgsIDB4ZTAsCisweDU0LCAweGZjLCAweDQ1LCAweDI3LCAweGYwLCAweDIyLCAweGU0LCAweDkwLCAweDAyLCAweDI5LCAweGYwLCAweDMwLCAweDQ3LCAweDA0LCAweGFmLCAweDQ1LAorMHg4MCwgMHgwNCwgMHhlNSwgMHg0NSwgMHhmNCwgMHhmZiwgMHg5MCwgMHgwMiwgMHgyOCwgMHhlZiwgMHhmMCwgMHgyMiwgMHg4ZiwgMHg1MCwgMHhkMiwgMHg1OSwKKzB4MjIsIDB4OGYsIDB4NTQsIDB4ZDIsIDB4NTgsIDB4MjIsIDB4ZTQsIDB4ZjUsIDB4MzAsIDB4YzIsIDB4YWYsIDB4ZTUsIDB4NTEsIDB4MTQsIDB4NjAsIDB4NGEsCisweDE0LCAweDYwLCAweDZhLCAweDI0LCAweDAyLCAweDYwLCAweDAzLCAweDAyLCAweDE3LCAweDRjLCAweGQyLCAweDU5LCAweDc1LCAweDU1LCAweDAxLCAweDIwLAorMHgxOSwgMHgxYywgMHg5MCwgMHgwMiwgMHgwOCwgMHhlMCwgMHg1NCwgMHhmZSwgMHhmMCwgMHhlMCwgMHgyMCwgMHhlMSwgMHgyMywgMHg5MCwgMHgwNCwgMHgzNCwKKzB4ZTAsIDB4YjQsIDB4MDIsIDB4MWMsIDB4YTMsIDB4ZTAsIDB4YjQsIDB4MDIsIDB4MTcsIDB4YTMsIDB4ZTAsIDB4YjQsIDB4MDIsIDB4MTIsIDB4N2YsIDB4MjAsCisweDEyLCAweDE2LCAweDRjLCAweDkwLCAweDEwLCAweDA0LCAweGUwLCAweDU0LCAweGYzLCAweGYwLCAweDc1LCAweDUxLCAweDAxLCAweDAyLCAweDE3LCAweDRjLAorMHhlNSwgMHg1MCwgMHg3MCwgMHgwNiwgMHg3NSwgMHgzMCwgMHgwMywgMHgwMiwgMHgxNywgMHg0YywgMHg5MCwgMHgxMiwgMHgwMCwgMHhlMCwgMHg1NCwgMHgwMywKKzB4NzAsIDB4MTUsIDB4N2YsIDB4MjAsIDB4MTIsIDB4MTYsIDB4NGMsIDB4MjAsIDB4MTksIDB4MDcsIDB4OTAsIDB4MDIsIDB4MDgsIDB4ZTAsIDB4NTQsIDB4ZmIsCisweGYwLCAweDc1LCAweDUxLCAweDAyLCAweDAyLCAweDE3LCAweDRjLCAweGU1LCAweDUwLCAweDcwLCAweDAyLCAweDgwLCAweDdhLCAweDIwLCAweDE5LCAweDBmLAorMHg5MCwgMHgwMiwgMHgwOCwgMHhlMCwgMHgyMCwgMHhlMywgMHg2YywgMHg5MCwgMHgwNCwgMHgzNywgMHhlMCwgMHg2NCwgMHgyMiwgMHg3MCwgMHg2NCwgMHg5MCwKKzB4MTIsIDB4MDQsIDB4NzQsIDB4MGEsIDB4ZjAsIDB4MzAsIDB4MWIsIDB4MTEsIDB4OTAsIDB4MTMsIDB4MjgsIDB4ZTAsIDB4NTQsIDB4ZjAsIDB4ZjAsIDB4YTMsCisweGUwLCAweDU0LCAweGYwLCAweGYwLCAweGEzLCAweGUwLCAweDU0LCAweGZhLCAweGYwLCAweDIwLCAweDE5LCAweDA3LCAweDkwLCAweDA0LCAweDAxLCAweGUwLAorMHg0NCwgMHgxMCwgMHhmMCwgMHhlNSwgMHgzNCwgMHhmNCwgMHg5MCwgMHgwNCwgMHgwMSwgMHg2MCwgMHgwNiwgMHhlMCwgMHg1NCwgMHhmYiwgMHhmMCwgMHg4MCwKKzB4MDQsIDB4ZTAsIDB4NTQsIDB4ZjksIDB4ZjAsIDB4MjAsIDB4MTksIDB4MDcsIDB4OTAsIDB4MTIsIDB4MDQsIDB4ZTAsIDB4NDQsIDB4MDQsIDB4ZjAsIDB4ZTUsCisweDM0LCAweGY0LCAweDYwLCAweDE0LCAweDkwLCAweDAxLCAweDBkLCAweGUwLCAweGY1LCAweDMzLCAweGU1LCAweDM0LCAweGQzLCAweDk0LCAweDAyLCAweDQwLAorMHgwNywgMHg5MCwgMHgxMiwgMHgwNCwgMHhlMCwgMHg1NCwgMHhmZCwgMHhmMCwgMHg3NSwgMHgzMCwgMHgwMSwgMHg3NSwgMHg1NSwgMHgwMiwgMHhlNCwgMHhmNSwKKzB4NTEsIDB4ODAsIDB4MDksIDB4ZTUsIDB4NTAsIDB4NzAsIDB4MDUsIDB4NzUsIDB4MzAsIDB4MDMsIDB4ZjUsIDB4NTEsIDB4ZTUsIDB4MzAsIDB4NjAsIDB4MTgsCisweGMyLCAweDAxLCAweGU0LCAweGY1LCAweDUxLCAweGMyLCAweDU5LCAweDIwLCAweDE5LCAweDBlLCAweGFkLCAweDMwLCAweGFmLCAweDQwLCAweDEyLCAweDE4LAorMHgyYSwgMHhlNSwgMHgzMCwgMHhiNCwgMHgwMywgMHgwMiwgMHhkMiwgMHgwMywgMHhkMiwgMHhhZiwgMHgyMiwgMHhjMiwgMHhhZiwgMHgzMCwgMHgwMSwgMHgwZSwKKzB4ZTQsIDB4ZjUsIDB4NTEsIDB4YzIsIDB4NTksIDB4YzIsIDB4MDEsIDB4N2QsIDB4MDIsIDB4YWYsIDB4NDAsIDB4MTIsIDB4MTgsIDB4MmEsIDB4ZTUsIDB4NTIsCisweDE0LCAweDYwLCAweDU1LCAweDE0LCAweDYwLCAweDJmLCAweDI0LCAweDAyLCAweDYwLCAweDAzLCAweDAyLCAweDE4LCAweDI3LCAweGU1LCAweDM0LCAweGY0LAorMHg2MCwgMHgyMywgMHhlNSwgMHgzNCwgMHhkMywgMHg5NCwgMHgwMiwgMHg0MCwgMHgxNiwgMHg5MCwgMHgxMiwgMHgwNCwgMHhlMCwgMHg0NCwgMHgwMiwgMHhmMCwKKzB4OTAsIDB4MDEsIDB4MGQsIDB4ZTAsIDB4MjAsIDB4ZTMsIDB4MDMsIDB4MDIsIDB4MTgsIDB4MjcsIDB4N2YsIDB4NTAsIDB4MTIsIDB4MTYsIDB4NTEsIDB4NzUsCisweDUyLCAweDAyLCAweDc1LCAweDU1LCAweDAzLCAweGU1LCAweDM0LCAweGY0LCAweDYwLCAweDBhLCAweGU1LCAweDU0LCAweDcwLCAweDY5LCAweDkwLCAweDAxLAorMHgwZCwgMHhlNSwgMHgzMywgMHhmMCwgMHg5MCwgMHgxMiwgMHgwNCwgMHhlMCwgMHg1NCwgMHhmYiwgMHhmMCwgMHg3ZiwgMHgyMCwgMHgxMiwgMHgxNiwgMHg1MSwKKzB4NzUsIDB4NTIsIDB4MDEsIDB4NzUsIDB4NTUsIDB4MDMsIDB4ODAsIDB4NGYsIDB4ZTUsIDB4NTQsIDB4NzAsIDB4NGIsIDB4OTAsIDB4MDQsIDB4MDEsIDB4ZTAsCisweDQ0LCAweDBlLCAweGYwLCAweDIwLCAweDE5LCAweDA0LCAweGUwLCAweDU0LCAweGVmLCAweGYwLCAweDkwLCAweDEzLCAweDI4LCAweGUwLCAweDQ0LCAweDBmLAorMHhmMCwgMHhhMywgMHhlMCwgMHg0NCwgMHgwZiwgMHhmMCwgMHhhMywgMHhlMCwgMHg0NCwgMHgwNSwgMHhmMCwgMHg5MCwgMHgxMiwgMHgwNCwgMHg3NCwgMHgwMywKKzB4ZjAsIDB4MjAsIDB4MTksIDB4MDcsIDB4OTAsIDB4MDIsIDB4MDgsIDB4ZTAsIDB4NDQsIDB4MDUsIDB4ZjAsIDB4OTAsIDB4MTAsIDB4MDQsIDB4ZTAsIDB4NDQsCisweDBjLCAweGYwLCAweGU0LCAweGY1LCAweDUyLCAweGY1LCAweDU1LCAweDMwLCAweDAyLCAweDBiLCAweGMyLCAweDAyLCAweDdkLCAweDAxLCAweGFmLCAweDQxLAorMHgxMiwgMHgxOCwgMHgyYSwgMHg4MCwgMHgwMiwgMHhjMiwgMHgwMywgMHhkMiwgMHhhZiwgMHgyMiwgMHhlZiwgMHhmNCwgMHg2MCwgMHgyZCwgMHhlNCwgMHhmZSwKKzB4NzQsIDB4MTQsIDB4MmUsIDB4ZjUsIDB4ODIsIDB4ZTQsIDB4MzQsIDB4NzAsIDB4ZjUsIDB4ODMsIDB4ZTAsIDB4YjQsIDB4ZmYsIDB4MTksIDB4NzQsIDB4MTQsCisweDJlLCAweGY1LCAweDgyLCAweGU0LCAweDM0LCAweDcwLCAweGY1LCAweDgzLCAweGVmLCAweGYwLCAweDc0LCAweDFjLCAweDJlLCAweGY1LCAweDgyLCAweGU0LAorMHgzNCwgMHg3MCwgMHhmNSwgMHg4MywgMHhlZCwgMHhmMCwgMHgyMiwgMHgwZSwgMHhiZSwgMHgwNCwgMHhkNSwgMHgyMiwgMHgyMiwgMHgyMiwgMHgyMCwgMHgxOSwKKzB4MDMsIDB4MDIsIDB4MTksIDB4MGYsIDB4OTAsIDB4NzAsIDB4ODAsIDB4ZTAsIDB4MDQsIDB4ZjAsIDB4OTAsIDB4MDQsIDB4MzcsIDB4ZTAsIDB4MzAsIDB4ZTUsCisweDAzLCAweDAyLCAweDE5LCAweDBiLCAweDkwLCAweDA0LCAweDI4LCAweGUwLCAweGY1LCAweDMxLCAweGEzLCAweGUwLCAweGY1LCAweDMwLCAweGY1LCAweDMyLAorMHhlNCwgMHhmNSwgMHgzNywgMHg5MCwgMHg3MCwgMHg4MSwgMHhlMCwgMHgwNCwgMHhmMCwgMHg5MCwgMHg3MCwgMHg4MiwgMHhlMCwgMHgwNCwgMHhmMCwgMHhlNSwKKzB4MzIsIDB4NzUsIDB4ZjAsIDB4ODAsIDB4YTQsIDB4MjQsIDB4MDAsIDB4ZmYsIDB4ZTUsIDB4ZjAsIDB4MzQsIDB4ODAsIDB4ZmUsIDB4ZTUsIDB4MzAsIDB4NjUsCisweDMyLCAweDcwLCAweDA1LCAweGZjLCAweDdkLCAweDE4LCAweDgwLCAweDA0LCAweDdjLCAweDAwLCAweDdkLCAweDAwLCAweGVmLCAweDJkLCAweGZmLCAweGVlLAorMHgzYywgMHhmZSwgMHgxMiwgMHgxOSwgMHgxMCwgMHg1MCwgMHgyNSwgMHg5MCwgMHg3MCwgMHg4MywgMHhlMCwgMHgwNCwgMHhmMCwgMHg5MCwgMHgwMSwgMHgxNCwKKzB4ZTAsIDB4NDQsIDB4MDIsIDB4ZjAsIDB4ZTAsIDB4MzAsIDB4ZTEsIDB4MDYsIDB4OTAsIDB4NzAsIDB4OTIsIDB4NzQsIDB4NDUsIDB4ZjAsIDB4OTAsIDB4NzAsCisweDkzLCAweGUwLCAweDA0LCAweGYwLCAweDkwLCAweDA0LCAweDAxLCAweGUwLCAweDkwLCAweDcwLCAweDk0LCAweGYwLCAweGU1LCAweDMyLCAweDY1LCAweDMxLAorMHg2MCwgMHgxMCwgMHhlNCwgMHgyNSwgMHgzMiwgMHhmZiwgMHhlNCwgMHgzNCwgMHg4MCwgMHg4ZiwgMHg4MiwgMHhmNSwgMHg4MywgMHhlMCwgMHhmNSwgMHgzMiwKKzB4ODAsIDB4OTcsIDB4OTAsIDB4MDQsIDB4MTAsIDB4NzQsIDB4MDEsIDB4ZjAsIDB4OTAsIDB4MDQsIDB4MjgsIDB4ZTUsIDB4MzEsIDB4ZjAsIDB4YTMsIDB4ZTUsCisweDMwLCAweGYwLCAweDkwLCAweDA0LCAweDExLCAweDc0LCAweDAxLCAweGYwLCAweDAyLCAweDE4LCAweDZhLCAweGMyLCAweDA2LCAweGQyLCAweDFhLCAweDIyLAorMHg5MCwgMHg3MCwgMHg4NCwgMHhlNSwgMHgzNywgMHhmMCwgMHhjMywgMHg5NCwgMHgwNiwgMHg1MCwgMHgxOSwgMHg4ZiwgMHg4MiwgMHg4ZSwgMHg4MywgMHhlMCwKKzB4YjQsIDB4ZmYsIDB4MDcsIDB4MDUsIDB4MzcsIDB4ZTQsIDB4ZjUsIDB4MzYsIDB4ODAsIDB4NTksIDB4ZTQsIDB4ZjUsIDB4MzcsIDB4OGYsIDB4ODIsIDB4OGUsCisweDgzLCAweGYwLCAweDgwLCAweDRmLCAweGU1LCAweDM2LCAweDc1LCAweGYwLCAweDA2LCAweDg0LCAweDc0LCAweDA4LCAweDI1LCAweGYwLCAweGY1LCAweDgyLAorMHhlNCwgMHgzNCwgMHgxMCwgMHhmNSwgMHg4MywgMHhlMCwgMHhmZCwgMHg4ZiwgMHg4MiwgMHg4ZSwgMHg4MywgMHhlMCwgMHhmYywgMHg2ZCwgMHg3MCwgMHgzMCwKKzB4OTAsIDB4NzAsIDB4ODgsIDB4ZTAsIDB4MDQsIDB4ZjAsIDB4YTMsIDB4ZTAsIDB4ZmQsIDB4ZDMsIDB4OTUsIDB4MzcsIDB4NDAsIDB4MDIsIDB4ODAsIDB4MDIsCisweGFkLCAweDM3LCAweDkwLCAweDcwLCAweDg5LCAweGVkLCAweGYwLCAweDA1LCAweDM3LCAweDA1LCAweDM2LCAweGU1LCAweDM2LCAweDc1LCAweGYwLCAweDA2LAorMHg4NCwgMHg3NCwgMHg4YSwgMHgyNSwgMHhmMCwgMHhmNSwgMHg4MiwgMHhlNCwgMHgzNCwgMHg3MCwgMHhmNSwgMHg4MywgMHhlYywgMHhmMCwgMHg4MCwgMHgwMywKKzB4ZTQsIDB4ZjUsIDB4MzcsIDB4MGYsIDB4YmYsIDB4MDAsIDB4MDEsIDB4MGUsIDB4ZWYsIDB4NTQsIDB4N2YsIDB4NjAsIDB4MGEsIDB4ZTUsIDB4MzcsIDB4YzMsCisweDk0LCAweDRlLCAweDUwLCAweDAzLCAweDAyLCAweDE5LCAweDEwLCAweGU1LCAweDM3LCAweGI0LCAweDRlLCAweDAzLCAweGQzLCAweDgwLCAweDAxLCAweGMzLAorMHgyMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBiLCAweDk0LCAweGViLCB9IDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL21kNS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vbWQ1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc0Nzc2YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL21kNS5jCkBAIC0wLDAgKzEsMTQyNyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICBtZDUuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCU5hbWUJCURhdGUJCQlNb2RpZmljYXRpb24gbG9ncworCWphbgkJCTEwLTI4LTAzCQlJbml0aWFsCisJUml0YSAgICAJMTEtMjMtMDQJCU1vZGlmeSBNRDUgYW5kIFNIQS0xCisJUml0YQkJMTAtMTQtMDUJCU1vZGlmeSBTSEEtMSBpbiBiaWctZW5kaWFuIHBsYXRmb3JtCisgKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworLyoqCisgKiBtZDVfbWFjOgorICogQGtleTogcG9pbnRlciB0bwl0aGUJa2V5CXVzZWQgZm9yIE1BQyBnZW5lcmF0aW9uCisgKiBAa2V5X2xlbjogbGVuZ3RoCW9mIHRoZSBrZXkgaW4gYnl0ZXMKKyAqIEBkYXRhOiBwb2ludGVyIHRvIHRoZSBkYXRhIGFyZWEgZm9yIHdoaWNoIHRoZSBNQUMgaXMJZ2VuZXJhdGVkCisgKiBAZGF0YV9sZW46IGxlbmd0aCBvZgl0aGUJZGF0YSBpbglieXRlcworICogQG1hYzogcG9pbnRlciB0bwl0aGUJYnVmZmVyIGhvbGRpbmcgc3BhY2UgZm9yIHRoZSBNQUM7IHRoZSBidWZmZXIgc2hvdWxkCisgKiBoYXZlCXNwYWNlIGZvciAxMjgtYml0ICgxNiBieXRlcykgTUQ1IGhhc2ggdmFsdWUKKyAqCisgKiBtZDVfbWFjKCkgZGV0ZXJtaW5lcwl0aGUJbWVzc2FnZQlhdXRoZW50aWNhdGlvbiBjb2RlCWJ5IHVzaW5nIHNlY3VyZQloYXNoCisgKiBNRDUoa2V5IHwgZGF0YSB8CWtleSkuCisgKi8KK3ZvaWQgbWQ1X21hYyh1OCAqa2V5LCBzaXplX3Qga2V5X2xlbiwgdTggKmRhdGEsIHNpemVfdCBkYXRhX2xlbiwgdTggKm1hYykKK3sKKwlNRDVfQ1RYCWNvbnRleHQ7CisKKwlNRDVJbml0KCZjb250ZXh0KTsKKwlNRDVVcGRhdGUoJmNvbnRleHQsCWtleSwga2V5X2xlbik7CisJTUQ1VXBkYXRlKCZjb250ZXh0LAlkYXRhLCBkYXRhX2xlbik7CisJTUQ1VXBkYXRlKCZjb250ZXh0LAlrZXksIGtleV9sZW4pOworCU1ENUZpbmFsKG1hYywgJmNvbnRleHQpOworfQorCisvKioKKyAqIGhtYWNfbWQ1OgorICogQGtleTogcG9pbnRlciB0bwl0aGUJa2V5CXVzZWQgZm9yIE1BQyBnZW5lcmF0aW9uCisgKiBAa2V5X2xlbjogbGVuZ3RoCW9mIHRoZSBrZXkgaW4gYnl0ZXMKKyAqIEBkYXRhOiBwb2ludGVyIHRvIHRoZSBkYXRhIGFyZWEgZm9yIHdoaWNoIHRoZSBNQUMgaXMJZ2VuZXJhdGVkCisgKiBAZGF0YV9sZW46IGxlbmd0aCBvZgl0aGUJZGF0YSBpbglieXRlcworICogQG1hYzogcG9pbnRlciB0bwl0aGUJYnVmZmVyIGhvbGRpbmcgc3BhY2UgZm9yIHRoZSBNQUM7IHRoZSBidWZmZXIgc2hvdWxkCisgKiBoYXZlCXNwYWNlIGZvciAxMjgtYml0ICgxNiBieXRlcykgTUQ1IGhhc2ggdmFsdWUKKyAqCisgKiBobWFjX21kNSgpIGRldGVybWluZXMgdGhlIG1lc3NhZ2UgYXV0aGVudGljYXRpb24JY29kZSB1c2luZyBITUFDLU1ENS4KKyAqIFRoaXMJaW1wbGVtZW50YXRpb24gaXMgYmFzZWQJb24gdGhlIHNhbXBsZSBjb2RlIHByZXNlbnRlZCBpbglSRkMJMjEwNC4KKyAqLwordm9pZCBobWFjX21kNSh1OCAqa2V5LCBzaXplX3Qga2V5X2xlbiwgdTggKmRhdGEsIHNpemVfdCBkYXRhX2xlbiwgdTggKm1hYykKK3sKKwlNRDVfQ1RYCWNvbnRleHQ7CisgICAgdTgga19pcGFkWzY1XTsgLyogaW5uZXIgcGFkZGluZyAtIGtleSBYT1JkIHdpdGggaXBhZCAqLworICAgIHU4IGtfb3BhZFs2NV07IC8qIG91dGVyIHBhZGRpbmcgLSBrZXkgWE9SZCB3aXRoIG9wYWQgKi8KKyAgICB1OCB0a1sxNl07CisJaW50CWk7CisKKwkvL2Fzc2VydChrZXkgIT0gTlVMTCAmJiBkYXRhICE9IE5VTEwgJiYgbWFjICE9IE5VTEwpOworCisJLyogaWYga2V5IGlzIGxvbmdlcgl0aGFuIDY0CWJ5dGVzIHJlc2V0CWl0IHRvIGtleSA9CU1ENShrZXkpICovCisJaWYgKGtleV9sZW4JPiA2NCkgeworCQlNRDVfQ1RYCXR0Y29udGV4dDsKKworCQlNRDVJbml0KCZ0dGNvbnRleHQpOworCQlNRDVVcGRhdGUoJnR0Y29udGV4dCwga2V5LCBrZXlfbGVuKTsKKwkJTUQ1RmluYWwodGssICZ0dGNvbnRleHQpOworCQkvL2tleT0oUFVDSEFSKXR0Y29udGV4dC5idWY7CisJCWtleQk9IHRrOworCQlrZXlfbGVuCT0gMTY7CisJfQorCisJLyogdGhlIEhNQUNfTUQ1CXRyYW5zZm9ybSBsb29rcwlsaWtlOgorCSAqCisJICogTUQ1KEsgWE9SIG9wYWQsIE1ENShLIFhPUiBpcGFkLCB0ZXh0KSkKKwkgKgorCSAqIHdoZXJlIEsgaXMgYW4gbiBieXRlCWtleQorCSAqIGlwYWQJaXMgdGhlIGJ5dGUJMHgzNiByZXBlYXRlZCA2NCB0aW1lcworCSAqIG9wYWQJaXMgdGhlIGJ5dGUJMHg1YyByZXBlYXRlZCA2NCB0aW1lcworCSAqIGFuZCB0ZXh0CWlzIHRoZSBkYXRhCWJlaW5nIHByb3RlY3RlZAkqLworCisJLyogc3RhcnQgb3V0IGJ5CXN0b3JpbmcJa2V5CWluIHBhZHMJKi8KKwlOZGlzWmVyb01lbW9yeShrX2lwYWQsIHNpemVvZihrX2lwYWQpKTsKKwlOZGlzWmVyb01lbW9yeShrX29wYWQsCXNpemVvZihrX29wYWQpKTsKKwkvL2Fzc2VydChrZXlfbGVuIDwgc2l6ZW9mKGtfaXBhZCkpOworCU5kaXNNb3ZlTWVtb3J5KGtfaXBhZCwga2V5LAlrZXlfbGVuKTsKKwlOZGlzTW92ZU1lbW9yeShrX29wYWQsIGtleSwJa2V5X2xlbik7CisKKwkvKiBYT1Iga2V5IHdpdGgJaXBhZCBhbmQgb3BhZCB2YWx1ZXMgKi8KKwlmb3IJKGkgPSAwOwlpIDwJNjQ7CWkrKykgeworCQlrX2lwYWRbaV0gXj0gMHgzNjsKKwkJa19vcGFkW2ldIF49IDB4NWM7CisJfQorCisJLyogcGVyZm9ybSBpbm5lciBNRDUgKi8KKwlNRDVJbml0KCZjb250ZXh0KTsJCQkJCSAvKglpbml0IGNvbnRleHQgZm9yIDFzdCBwYXNzICovCisJTUQ1VXBkYXRlKCZjb250ZXh0LAlrX2lwYWQsCTY0KTsJIC8qCXN0YXJ0IHdpdGggaW5uZXIgcGFkICovCisJTUQ1VXBkYXRlKCZjb250ZXh0LAlkYXRhLCBkYXRhX2xlbik7IC8qCXRoZW4gdGV4dCBvZiBkYXRhZ3JhbSAqLworCU1ENUZpbmFsKG1hYywgJmNvbnRleHQpOwkJCSAvKglmaW5pc2ggdXAgMXN0IHBhc3MgKi8KKworCS8qIHBlcmZvcm0gb3V0ZXIgTUQ1ICovCisJTUQ1SW5pdCgmY29udGV4dCk7CQkJCQkgLyoJaW5pdCBjb250ZXh0IGZvciAybmQgcGFzcyAqLworCU1ENVVwZGF0ZSgmY29udGV4dCwJa19vcGFkLAk2NCk7CSAvKglzdGFydCB3aXRoIG91dGVyIHBhZCAqLworCU1ENVVwZGF0ZSgmY29udGV4dCwJbWFjLCAxNik7CQkgLyoJdGhlbiByZXN1bHRzIG9mCTFzdAloYXNoICovCisJTUQ1RmluYWwobWFjLCAmY29udGV4dCk7CQkJIC8qCWZpbmlzaCB1cCAybmQgcGFzcyAqLworfQorCisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKyNkZWZpbmUgYnl0ZVJldmVyc2UoYnVmLCBsZW4pICAgLyogTm90aGluZyAqLworI2Vsc2UKK3ZvaWQgYnl0ZVJldmVyc2UodW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25ncyk7Cit2b2lkIGJ5dGVSZXZlcnNlKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZ3MpCit7CisgICAgZG8geworICAgICAgICAqKFVJTlQzMiAqKWJ1ZiA9IFNXQVAzMigqKFVJTlQzMiAqKWJ1Zik7CisgICAgICAgIGJ1ZiArPSA0OworICAgIH0gd2hpbGUgKC0tbG9uZ3MpOworfQorI2VuZGlmCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT0gIE1ENSBpbXBsZW1lbnRhdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8vIGZvdXIgYmFzZSBmdW5jdGlvbnMgZm9yIE1ENQorI2RlZmluZSBNRDVfRjEoeCwgeSwgeikgKCgoeCkgJiAoeSkpIHwgKCh+eCkgJiAoeikpKQorI2RlZmluZSBNRDVfRjIoeCwgeSwgeikgKCgoeCkgJiAoeikpIHwgKCh5KSAmICh+eikpKQorI2RlZmluZSBNRDVfRjMoeCwgeSwgeikgKCh4KSBeICh5KSBeICh6KSkKKyNkZWZpbmUgTUQ1X0Y0KHgsIHksIHopICgoeSkgXiAoKHgpIHwgKH56KSkpCisjZGVmaW5lIENZQ0xJQ19MRUZUX1NISUZUKHcsIHMpICgoKHcpIDw8IChzKSkgfCAoKHcpID4+ICgzMi0ocykpKSkKKworI2RlZmluZQlNRDVTdGVwKGYsIHcsIHgsIHksCXosIGRhdGEsIHQsIHMpCVwKKwkoIHcJKz0gZih4LAl5LCB6KSArCWRhdGEgKyB0LCAgdyA9IChDWUNMSUNfTEVGVF9TSElGVCh3LCBzKSkgJiAweGZmZmZmZmZmLCB3ICs9CXggKQorCisKKy8qCisgKiAgRnVuY3Rpb24gRGVzY3JpcHRpb246CisgKiAgICAgIEluaXRpYXRlIE1ENSBDb250ZXh0IHNhdGlzZmllZCBpbiBSRkMgMTMyMQorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICAgIHBDdHggICAgICAgIFBvaW50ZXIJdG8gTUQ1IGNvbnRleHQKKyAqCisgKiAgUmV0dXJuIFZhbHVlOgorICogICAgICBOb25lCisgKi8KK1ZPSUQgTUQ1SW5pdChNRDVfQ1RYICpwQ3R4KQoreworICAgIHBDdHgtPkJ1ZlswXT0weDY3NDUyMzAxOworICAgIHBDdHgtPkJ1ZlsxXT0weGVmY2RhYjg5OworICAgIHBDdHgtPkJ1ZlsyXT0weDk4YmFkY2ZlOworICAgIHBDdHgtPkJ1ZlszXT0weDEwMzI1NDc2OworCisgICAgcEN0eC0+TGVuSW5CaXRDb3VudFswXT0wOworICAgIHBDdHgtPkxlbkluQml0Q291bnRbMV09MDsKK30KKworCisvKgorICogIEZ1bmN0aW9uIERlc2NyaXB0aW9uOgorICogICAgICBVcGRhdGUgTUQ1IENvbnRleHQsIGFsbG93IG9mIGFuIGFycmFyeSBvZiBvY3RldHMgYXMgdGhlIG5leHQgcG9ydGlvbgorICogICAgICBvZiB0aGUgbWVzc2FnZQorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICAgIHBDdHgJCVBvaW50ZXIJdG8gTUQ1IGNvbnRleHQKKyAqIAkgICAgcERhdGEgICAgICAgUG9pbnRlciB0byBpbnB1dCBkYXRhCisgKiAgICAgIExlbkluQnl0ZXMgIFRoZSBsZW5ndGggb2YgaW5wdXQgZGF0YSAodW5pdDogYnl0ZSkKKyAqCisgKiAgUmV0dXJuIFZhbHVlOgorICogICAgICBOb25lCisgKgorICogIE5vdGU6CisgKiAgICAgIENhbGxlZCBhZnRlciBNRDVJbml0IG9yIE1ENVVwZGF0ZShpdHNlbGYpCisgKi8KK1ZPSUQgTUQ1VXBkYXRlKE1ENV9DVFggKnBDdHgsIFVDSEFSICpwRGF0YSwgVUlOVDMyIExlbkluQnl0ZXMpCit7CisKKyAgICBVSU5UMzIgVGZUaW1lczsKKyAgICBVSU5UMzIgdGVtcDsKKwl1bnNpZ25lZCBpbnQgaTsKKworICAgIHRlbXAgPSBwQ3R4LT5MZW5JbkJpdENvdW50WzBdOworCisgICAgcEN0eC0+TGVuSW5CaXRDb3VudFswXSA9IChVSU5UMzIpIChwQ3R4LT5MZW5JbkJpdENvdW50WzBdICsgKExlbkluQnl0ZXMgPDwgMykpOworCisgICAgaWYgKHBDdHgtPkxlbkluQml0Q291bnRbMF0gPCB0ZW1wKQorICAgICAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzFdKys7ICAgLy9jYXJyeSBpbgorCisgICAgcEN0eC0+TGVuSW5CaXRDb3VudFsxXSArPSBMZW5JbkJ5dGVzID4+IDI5OworCisgICAgLy8gbW9kIDY0IGJ5dGVzCisgICAgdGVtcCA9ICh0ZW1wID4+IDMpICYgMHgzZjsKKworICAgIC8vIHByb2Nlc3MgbGFja3Mgb2YgNjQtYnl0ZSBkYXRhCisgICAgaWYgKHRlbXApCisgICAgeworICAgICAgICBVQ0hBUiAqcEFkcyA9IChVQ0hBUiAqKSBwQ3R4LT5JbnB1dCArIHRlbXA7CisKKyAgICAgICAgaWYgKCh0ZW1wK0xlbkluQnl0ZXMpIDwgNjQpCisgICAgICAgIHsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZHMsIChVQ0hBUiAqKXBEYXRhLCBMZW5JbkJ5dGVzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZHMsIChVQ0hBUiAqKXBEYXRhLCA2NC10ZW1wKTsKKyAgICAgICAgYnl0ZVJldmVyc2UocEN0eC0+SW5wdXQsIDE2KTsKKyAgICAgICAgTUQ1VHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKKworICAgICAgICBwRGF0YSArPSA2NC10ZW1wOworICAgICAgICBMZW5JbkJ5dGVzIC09IDY0LXRlbXA7CisgICAgfSAvLyBlbmQgb2YgaWYgKHRlbXApCisKKworICAgIFRmVGltZXMgPSAoTGVuSW5CeXRlcyA+PiA2KTsKKworICAgIGZvciAoaT1UZlRpbWVzOyBpPjA7IGktLSkKKyAgICB7CisgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBDdHgtPklucHV0LCAoVUNIQVIgKilwRGF0YSwgNjQpOworICAgICAgICBieXRlUmV2ZXJzZShwQ3R4LT5JbnB1dCwgMTYpOworICAgICAgICBNRDVUcmFuc2Zvcm0ocEN0eC0+QnVmLCAoVUlOVDMyICopcEN0eC0+SW5wdXQpOworICAgICAgICBwRGF0YSArPSA2NDsKKyAgICAgICAgTGVuSW5CeXRlcyAtPSA2NDsKKyAgICB9IC8vIGVuZCBvZiBmb3IKKworICAgIC8vIGJ1ZmZlcmluZyBsYWNrcyBvZiA2NC1ieXRlIGRhdGEKKyAgICBpZihMZW5JbkJ5dGVzKQorICAgICAgICBOZGlzTW92ZU1lbW9yeShwQ3R4LT5JbnB1dCwgKFVDSEFSICopcERhdGEsIExlbkluQnl0ZXMpOworCit9CisKKworLyoKKyAqICBGdW5jdGlvbiBEZXNjcmlwdGlvbjoKKyAqICAgICAgQXBwZW5kIHBhZGRpbmcgYml0cyBhbmQgbGVuZ3RoIG9mIG9yaWdpbmFsIG1lc3NhZ2UgaW4gdGhlIHRhaWwKKyAqICAgICAgVGhlIG1lc3NhZ2UgZGlnZXN0IGhhcyB0byBiZSBjb21wbGV0ZWQgaW4gdGhlIGVuZAorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICAgIERpZ2VzdAkJT3V0cHV0IG9mIERpZ2VzdC1NZXNzYWdlIGZvciBNRDUKKyAqICAJcEN0eCAgICAgICAgUG9pbnRlcgl0byBNRDUgY29udGV4dAorICoKKyAqICBSZXR1cm4gVmFsdWU6CisgKiAgICAgIE5vbmUKKyAqCisgKiAgTm90ZToKKyAqICAgICAgQ2FsbGVkIGFmdGVyIE1ENVVwZGF0ZQorICovCitWT0lEIE1ENUZpbmFsKFVDSEFSIERpZ2VzdFsxNl0sIE1ENV9DVFggKnBDdHgpCit7CisgICAgVUNIQVIgUmVtYWluZGVyOworICAgIFVDSEFSIFBhZExlbkluQnl0ZXM7CisgICAgVUNIQVIgKnBBcHBlbmQ9MDsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgIFJlbWFpbmRlciA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMF0gPj4gMykgJiAweDNmKTsKKworICAgIFBhZExlbkluQnl0ZXMgPSAoUmVtYWluZGVyIDwgNTYpID8gKDU2LVJlbWFpbmRlcikgOiAoMTIwLVJlbWFpbmRlcik7CisKKyAgICBwQXBwZW5kID0gKFVDSEFSICopcEN0eC0+SW5wdXQgKyBSZW1haW5kZXI7CisKKyAgICAvLyBwYWRkaW5nIGJpdHMgd2l0aG91dCBjcm9zc2luZyBibG9jayg2NC1ieXRlIGJhc2VkKSBib3VuZGFyeQorICAgIGlmIChSZW1haW5kZXIgPCA1NikKKyAgICB7CisgICAgICAgICpwQXBwZW5kID0gMHg4MDsKKyAgICAgICAgUGFkTGVuSW5CeXRlcyAtLTsKKworICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCArIFJlbWFpbmRlcisxLCBQYWRMZW5JbkJ5dGVzKTsKKworCQkvLyBhZGQgZGF0YS1sZW5ndGggZmllbGQsIGZyb20gbG93IHRvIGhpZ2gKKyAgICAgICAJZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICB7CisgICAgICAgIAlwQ3R4LT5JbnB1dFs1NitpXSA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMF0gPj4gKGkgPDwgMykpICYgMHhmZik7CisgICAgICAgIAlwQ3R4LT5JbnB1dFs2MCtpXSA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMV0gPj4gKGkgPDwgMykpICYgMHhmZik7CisgICAgICAJfQorCisgICAgICAgIGJ5dGVSZXZlcnNlKHBDdHgtPklucHV0LCAxNik7CisgICAgICAgIE1ENVRyYW5zZm9ybShwQ3R4LT5CdWYsIChVSU5UMzIgKilwQ3R4LT5JbnB1dCk7CisgICAgfSAvLyBlbmQgb2YgaWYKKworICAgIC8vIHBhZGRpbmcgYml0cyB3aXRoIGNyb3NzaW5nIGJsb2NrKDY0LWJ5dGUgYmFzZWQpIGJvdW5kYXJ5CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gdGhlIGZpcnN0IGJsb2NrID09PQorICAgICAgICAqcEFwcGVuZCA9IDB4ODA7CisgICAgICAgIFBhZExlbkluQnl0ZXMgLS07CisKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQgKyBSZW1haW5kZXIrMSwgKDY0LVJlbWFpbmRlci0xKSk7CisgICAgICAgIFBhZExlbkluQnl0ZXMgLT0gKDY0IC0gUmVtYWluZGVyIC0gMSk7CisKKyAgICAgICAgYnl0ZVJldmVyc2UocEN0eC0+SW5wdXQsIDE2KTsKKyAgICAgICAgTUQ1VHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKKworCisgICAgICAgIC8vIHRoZSBzZWNvbmQgYmxvY2sgPT09CisgICAgICAgIE5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKXBDdHgtPklucHV0LCBQYWRMZW5JbkJ5dGVzKTsKKworICAgICAgICAvLyBhZGQgZGF0YS1sZW5ndGggZmllbGQKKyAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICB7CisgICAgICAgIAlwQ3R4LT5JbnB1dFs1NitpXSA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMF0gPj4gKGkgPDwgMykpICYgMHhmZik7CisgICAgICAgIAlwQ3R4LT5JbnB1dFs2MCtpXSA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMV0gPj4gKGkgPDwgMykpICYgMHhmZik7CisgICAgICAJfQorCisgICAgICAgIGJ5dGVSZXZlcnNlKHBDdHgtPklucHV0LCAxNik7CisgICAgICAgIE1ENVRyYW5zZm9ybShwQ3R4LT5CdWYsIChVSU5UMzIgKilwQ3R4LT5JbnB1dCk7CisgICAgfSAvLyBlbmQgb2YgZWxzZQorCisKKyAgICBOZGlzTW92ZU1lbW9yeSgoVUNIQVIgKilEaWdlc3QsIChVSU5UMzIgKilwQ3R4LT5CdWYsIDE2KTsgLy8gb3V0cHV0CisgICAgYnl0ZVJldmVyc2UoKFVDSEFSICopRGlnZXN0LCA0KTsKKyAgICBOZGlzWmVyb01lbW9yeShwQ3R4LCBzaXplb2YocEN0eCkpOyAvLyBtZW1vcnkgZnJlZQorfQorCisKKy8qCisgKiAgRnVuY3Rpb24gRGVzY3JpcHRpb246CisgKiAgICAgIFRoZSBjZW50cmFsIGFsZ29yaXRobSBvZiBNRDUsIGNvbnNpc3RzIG9mIGZvdXIgcm91bmRzIGFuZCBzaXh0ZWVuCisgKiAgCXN0ZXBzIHBlciByb3VuZAorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICAgIEJ1ZiAgICAgQnVmZmVycyBvZiBmb3VyIHN0YXRlcyAob3V0cHV0OiAxNiBieXRlcykKKyAqIAkgICAgTWVzICAgICBJbnB1dCBkYXRhIChpbnB1dDogNjQgYnl0ZXMpCisgKgorICogIFJldHVybiBWYWx1ZToKKyAqICAgICAgTm9uZQorICoKKyAqICBOb3RlOgorICogICAgICBDYWxsZWQgYnkgTUQ1VXBkYXRlIG9yIE1ENUZpbmFsCisgKi8KK1ZPSUQgTUQ1VHJhbnNmb3JtKFVJTlQzMiBCdWZbNF0sIFVJTlQzMiBNZXNbMTZdKQoreworICAgIFVJTlQzMiBSZWdbNF0sIFRlbXA7CisJdW5zaWduZWQgaW50IGk7CisKKyAgICBzdGF0aWMgVUNIQVIgTFNoaWZ0VmFsWzE2XSA9CisgICAgeworICAgICAgICA3LCAxMiwgMTcsIDIyLAorCQk1LCA5ICwgMTQsIDIwLAorCQk0LCAxMSwgMTYsIDIzLAorIAkJNiwgMTAsIDE1LCAyMSwKKyAJfTsKKworCisJLy8gW2VxdWFsIHRvIDQyOTQ5NjcyOTYqYWJzKHNpbihpbmRleCkpXQorICAgIHN0YXRpYyBVSU5UMzIgTUQ1VGFibGVbNjRdID0KKwl7CisJCTB4ZDc2YWE0NzgsCTB4ZThjN2I3NTYsCTB4MjQyMDcwZGIsCTB4YzFiZGNlZWUsCisJCTB4ZjU3YzBmYWYsCTB4NDc4N2M2MmEsCTB4YTgzMDQ2MTMsIDB4ZmQ0Njk1MDEsCisJCTB4Njk4MDk4ZDgsCTB4OGI0NGY3YWYsCTB4ZmZmZjViYjEsCTB4ODk1Y2Q3YmUsCisgICAgCTB4NmI5MDExMjIsCTB4ZmQ5ODcxOTMsCTB4YTY3OTQzOGUsCTB4NDliNDA4MjEsCisKKyAgICAJMHhmNjFlMjU2MiwJMHhjMDQwYjM0MCwJMHgyNjVlNWE1MSwJMHhlOWI2YzdhYSwKKyAgICAJMHhkNjJmMTA1ZCwJMHgwMjQ0MTQ1MywJMHhkOGExZTY4MSwJMHhlN2QzZmJjOCwKKyAgICAJMHgyMWUxY2RlNiwJMHhjMzM3MDdkNiwJMHhmNGQ1MGQ4NywJMHg0NTVhMTRlZCwKKyAgICAJMHhhOWUzZTkwNSwJMHhmY2VmYTNmOCwJMHg2NzZmMDJkOSwJMHg4ZDJhNGM4YSwKKworICAgIAkweGZmZmEzOTQyLAkweDg3NzFmNjgxLAkweDZkOWQ2MTIyLAkweGZkZTUzODBjLAorICAgIAkweGE0YmVlYTQ0LAkweDRiZGVjZmE5LAkweGY2YmI0YjYwLAkweGJlYmZiYzcwLAorICAgIAkweDI4OWI3ZWM2LAkweGVhYTEyN2ZhLAkweGQ0ZWYzMDg1LAkweDA0ODgxZDA1LAorICAgIAkweGQ5ZDRkMDM5LAkweGU2ZGI5OWU1LAkweDFmYTI3Y2Y4LAkweGM0YWM1NjY1LAorCisgICAgCTB4ZjQyOTIyNDQsCTB4NDMyYWZmOTcsCTB4YWI5NDIzYTcsCTB4ZmM5M2EwMzksCisgICAJCTB4NjU1YjU5YzMsCTB4OGYwY2NjOTIsCTB4ZmZlZmY0N2QsCTB4ODU4NDVkZDEsCisgICAgCTB4NmZhODdlNGYsCTB4ZmUyY2U2ZTAsCTB4YTMwMTQzMTQsCTB4NGUwODExYTEsCisgICAgCTB4Zjc1MzdlODIsCTB4YmQzYWYyMzUsCTB4MmFkN2QyYmIsCTB4ZWI4NmQzOTEKKwl9OworCisKKyAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgIFJlZ1tpXT1CdWZbaV07CisKKworICAgIC8vIDY0IHN0ZXBzIGluIE1ENSBhbGdvcml0aG0KKyAgICBmb3IgKGk9MDsgaTwxNjsgaSsrKQorICAgIHsKKyAgICAgICAgTUQ1U3RlcChNRDVfRjEsIFJlZ1swXSwgUmVnWzFdLCBSZWdbMl0sIFJlZ1szXSwgTWVzW2ldLAorICAgICAgICAgICAgICAgIE1ENVRhYmxlW2ldLCBMU2hpZnRWYWxbaSAmIDB4M10pOworCisgICAgICAgIC8vIG9uZS13b3JkIHJpZ2h0IHNoaWZ0CisgICAgICAgIFRlbXAgICA9IFJlZ1szXTsKKyAgICAgICAgUmVnWzNdID0gUmVnWzJdOworICAgICAgICBSZWdbMl0gPSBSZWdbMV07CisgICAgICAgIFJlZ1sxXSA9IFJlZ1swXTsKKyAgICAgICAgUmVnWzBdID0gVGVtcDsKKyAgICB9CisgICAgZm9yIChpPTE2OyBpPDMyOyBpKyspCisgICAgeworICAgICAgICBNRDVTdGVwKE1ENV9GMiwgUmVnWzBdLCBSZWdbMV0sIFJlZ1syXSwgUmVnWzNdLCBNZXNbKDUqKGkgJiAweGYpKzEpICYgMHhmXSwKKyAgICAgICAgICAgICAgICBNRDVUYWJsZVtpXSwgTFNoaWZ0VmFsWygweDEgPDwgMikrKGkgJiAweDMpXSk7CisKKyAgICAgICAgLy8gb25lLXdvcmQgcmlnaHQgc2hpZnQKKyAgICAgICAgVGVtcCAgID0gUmVnWzNdOworICAgICAgICBSZWdbM10gPSBSZWdbMl07CisgICAgICAgIFJlZ1syXSA9IFJlZ1sxXTsKKyAgICAgICAgUmVnWzFdID0gUmVnWzBdOworICAgICAgICBSZWdbMF0gPSBUZW1wOworICAgIH0KKyAgICBmb3IgKGk9MzI7IGk8NDg7IGkrKykKKyAgICB7CisgICAgICAgIE1ENVN0ZXAoTUQ1X0YzLCBSZWdbMF0sIFJlZ1sxXSwgUmVnWzJdLCBSZWdbM10sIE1lc1soMyooaSAmIDB4ZikrNSkgJiAweGZdLAorICAgICAgICAgICAgICAgIE1ENVRhYmxlW2ldLCBMU2hpZnRWYWxbKDB4MSA8PCAzKSsoaSAmIDB4MyldKTsKKworICAgICAgICAvLyBvbmUtd29yZCByaWdodCBzaGlmdAorICAgICAgICBUZW1wICAgPSBSZWdbM107CisgICAgICAgIFJlZ1szXSA9IFJlZ1syXTsKKyAgICAgICAgUmVnWzJdID0gUmVnWzFdOworICAgICAgICBSZWdbMV0gPSBSZWdbMF07CisgICAgICAgIFJlZ1swXSA9IFRlbXA7CisgICAgfQorICAgIGZvciAoaT00ODsgaTw2NDsgaSsrKQorICAgIHsKKyAgICAgICAgTUQ1U3RlcChNRDVfRjQsIFJlZ1swXSwgUmVnWzFdLCBSZWdbMl0sIFJlZ1szXSwgTWVzWyg3KihpICYgMHhmKSkgJiAweGZdLAorICAgICAgICAgICAgICAgIE1ENVRhYmxlW2ldLCBMU2hpZnRWYWxbKDB4MyA8PCAyKSsoaSAmIDB4MyldKTsKKworICAgICAgICAvLyBvbmUtd29yZCByaWdodCBzaGlmdAorICAgICAgICBUZW1wICAgPSBSZWdbM107CisgICAgICAgIFJlZ1szXSA9IFJlZ1syXTsKKyAgICAgICAgUmVnWzJdID0gUmVnWzFdOworICAgICAgICBSZWdbMV0gPSBSZWdbMF07CisgICAgICAgIFJlZ1swXSA9IFRlbXA7CisgICAgfQorCisKKyAgICAvLyAodGVtcG9yYXJ5KW91dHB1dAorICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgQnVmW2ldICs9IFJlZ1tpXTsKKworfQorCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PSAgU0hBLTEgaW1wbGVtZW50YXRpb24gPT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8vIGZvdXIgYmFzZSBmdW5jdGlvbnMgZm9yIFNIQS0xCisjZGVmaW5lIFNIQTFfRjEoYiwgYywgZCkgICAgKCgoYikgJiAoYykpIHwgKCh+YikgJiAoZCkpKQorI2RlZmluZSBTSEExX0YyKGIsIGMsIGQpICAgICgoYikgXiAoYykgXiAoZCkpCisjZGVmaW5lIFNIQTFfRjMoYiwgYywgZCkgICAgKCgoYikgJiAoYykpIHwgKChiKSAmIChkKSkgfCAoKGMpICYgKGQpKSkKKworCisjZGVmaW5lIFNIQTFTdGVwKGYsIGEsIGIsIGMsIGQsIGUsIHcsIGspICAgIFwKKyAgICAoIGUJKz0gKCBmKGIsIGMsIGQpICsgdyArIGsgKyBDWUNMSUNfTEVGVF9TSElGVChhLCA1KSkgJiAweGZmZmZmZmZmLCBcCisgICAgICBiID0gQ1lDTElDX0xFRlRfU0hJRlQoYiwgMzApICkKKworLy9Jbml0aWF0ZSBTSEEtMSBDb250ZXh0IHNhdGlzZmllZCBpbiBSRkMgMzE3NAorVk9JRCBTSEFJbml0KFNIQV9DVFggKnBDdHgpCit7CisgICAgcEN0eC0+QnVmWzBdPTB4Njc0NTIzMDE7CisgICAgcEN0eC0+QnVmWzFdPTB4ZWZjZGFiODk7CisgICAgcEN0eC0+QnVmWzJdPTB4OThiYWRjZmU7CisgICAgcEN0eC0+QnVmWzNdPTB4MTAzMjU0NzY7CisgICAgcEN0eC0+QnVmWzRdPTB4YzNkMmUxZjA7CisKKyAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzBdPTA7CisgICAgcEN0eC0+TGVuSW5CaXRDb3VudFsxXT0wOworfQorCisvKgorICogIEZ1bmN0aW9uIERlc2NyaXB0aW9uOgorICogICAgICBVcGRhdGUgU0hBLTEgQ29udGV4dCwgYWxsb3cgb2YgYW4gYXJyYXJ5IG9mIG9jdGV0cyBhcyB0aGUgbmV4dAorICogICAgICBwb3J0aW9uIG9mIHRoZSBtZXNzYWdlCisgKgorICogIEFyZ3VtZW50czoKKyAqICAgICAgcEN0eAkJUG9pbnRlcgl0byBTSEEtMSBjb250ZXh0CisgKiAJICAgIHBEYXRhICAgICAgIFBvaW50ZXIgdG8gaW5wdXQgZGF0YQorICogICAgICBMZW5JbkJ5dGVzICBUaGUgbGVuZ3RoIG9mIGlucHV0IGRhdGEgKHVuaXQ6IGJ5dGUpCisgKgorICogIFJldHVybiBWYWx1ZToKKyAqICAgICAgZXJyb3IgICAgICAgaW5kaWNhdGUgbW9yZSB0aGFuIHBvdygyLDY0KSBiaXRzIG9mIGRhdGEKKyAqCisgKiAgTm90ZToKKyAqICAgICAgQ2FsbGVkIGFmdGVyIFNIQUluaXQgb3IgU0hBVXBkYXRlKGl0c2VsZikKKyAqLworVUNIQVIgU0hBVXBkYXRlKFNIQV9DVFggKnBDdHgsIFVDSEFSICpwRGF0YSwgVUlOVDMyIExlbkluQnl0ZXMpCit7CisgICAgVUlOVDMyIFRmVGltZXM7CisgICAgVUlOVDMyIHRlbXAxLHRlbXAyOworCXVuc2lnbmVkIGludCBpOworCVVDSEFSIGVycj0xOworCisgICAgdGVtcDEgPSBwQ3R4LT5MZW5JbkJpdENvdW50WzBdOworICAgIHRlbXAyID0gcEN0eC0+TGVuSW5CaXRDb3VudFsxXTsKKworICAgIHBDdHgtPkxlbkluQml0Q291bnRbMF0gPSAoVUlOVDMyKSAocEN0eC0+TGVuSW5CaXRDb3VudFswXSArIChMZW5JbkJ5dGVzIDw8IDMpKTsKKyAgICBpZiAocEN0eC0+TGVuSW5CaXRDb3VudFswXSA8IHRlbXAxKQorICAgICAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzFdKys7ICAgLy9jYXJyeSBpbgorCisKKyAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzFdID0gKFVJTlQzMikgKHBDdHgtPkxlbkluQml0Q291bnRbMV0gKyhMZW5JbkJ5dGVzID4+IDI5KSk7CisgICAgaWYgKHBDdHgtPkxlbkluQml0Q291bnRbMV0gPCB0ZW1wMikKKyAgICAgICAgcmV0dXJuIChlcnIpOyAgIC8vY2hlY2sgdG90YWwgbGVuZ3RoIG9mIG9yaWdpbmFsIGRhdGEKKworCisgICAgLy8gbW9kIDY0IGJ5dGVzCisgICAgdGVtcDEgPSAodGVtcDEgPj4gMykgJiAweDNmOworCisgICAgLy8gcHJvY2VzcyBsYWNrcyBvZiA2NC1ieXRlIGRhdGEKKyAgICBpZiAodGVtcDEpCisgICAgeworICAgICAgICBVQ0hBUiAqcEFkcyA9IChVQ0hBUiAqKSBwQ3R4LT5JbnB1dCArIHRlbXAxOworCisgICAgICAgIGlmICgodGVtcDErTGVuSW5CeXRlcykgPCA2NCkKKyAgICAgICAgeworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkcywgKFVDSEFSICopcERhdGEsIExlbkluQnl0ZXMpOworICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgfQorCisgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZHMsIChVQ0hBUiAqKXBEYXRhLCA2NC10ZW1wMSk7CisgICAgICAgIGJ5dGVSZXZlcnNlKChVQ0hBUiAqKXBDdHgtPklucHV0LCAxNik7CisKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQgKyA2NCwgMTYpOworICAgICAgICBTSEFUcmFuc2Zvcm0ocEN0eC0+QnVmLCAoVUlOVDMyICopcEN0eC0+SW5wdXQpOworCisgICAgICAgIHBEYXRhICs9IDY0LXRlbXAxOworICAgICAgICBMZW5JbkJ5dGVzIC09IDY0LXRlbXAxOworICAgIH0gLy8gZW5kIG9mIGlmICh0ZW1wMSkKKworCisgICAgVGZUaW1lcyA9IChMZW5JbkJ5dGVzID4+IDYpOworCisgICAgZm9yIChpPVRmVGltZXM7IGk+MDsgaS0tKQorICAgIHsKKyAgICAgICAgTmRpc01vdmVNZW1vcnkocEN0eC0+SW5wdXQsIChVQ0hBUiAqKXBEYXRhLCA2NCk7CisgICAgICAgIGJ5dGVSZXZlcnNlKChVQ0hBUiAqKXBDdHgtPklucHV0LCAxNik7CisKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQgKyA2NCwgMTYpOworICAgICAgICBTSEFUcmFuc2Zvcm0ocEN0eC0+QnVmLCAoVUlOVDMyICopcEN0eC0+SW5wdXQpOworICAgICAgICBwRGF0YSArPSA2NDsKKyAgICAgICAgTGVuSW5CeXRlcyAtPSA2NDsKKyAgICB9IC8vIGVuZCBvZiBmb3IKKworICAgIC8vIGJ1ZmZlcmluZyBsYWNrcyBvZiA2NC1ieXRlIGRhdGEKKyAgICBpZihMZW5JbkJ5dGVzKQorICAgICAgICBOZGlzTW92ZU1lbW9yeShwQ3R4LT5JbnB1dCwgKFVDSEFSICopcERhdGEsIExlbkluQnl0ZXMpOworCisJcmV0dXJuICgwKTsKKworfQorCisvLyBBcHBlbmQgcGFkZGluZyBiaXRzIGFuZCBsZW5ndGggb2Ygb3JpZ2luYWwgbWVzc2FnZSBpbiB0aGUgdGFpbAorLy8gVGhlIG1lc3NhZ2UgZGlnZXN0IGhhcyB0byBiZSBjb21wbGV0ZWQgaW4gdGhlIGVuZAorVk9JRCBTSEFGaW5hbChTSEFfQ1RYICpwQ3R4LCBVQ0hBUiBEaWdlc3RbMjBdKQoreworICAgIFVDSEFSIFJlbWFpbmRlcjsKKyAgICBVQ0hBUiBQYWRMZW5JbkJ5dGVzOworICAgIFVDSEFSICpwQXBwZW5kPTA7CisgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICBSZW1haW5kZXIgPSAoVUNIQVIpKChwQ3R4LT5MZW5JbkJpdENvdW50WzBdID4+IDMpICYgMHgzZik7CisKKyAgICBwQXBwZW5kID0gKFVDSEFSICopcEN0eC0+SW5wdXQgKyBSZW1haW5kZXI7CisKKyAgICBQYWRMZW5JbkJ5dGVzID0gKFJlbWFpbmRlciA8IDU2KSA/ICg1Ni1SZW1haW5kZXIpIDogKDEyMC1SZW1haW5kZXIpOworCisgICAgLy8gcGFkZGluZyBiaXRzIHdpdGhvdXQgY3Jvc3NpbmcgYmxvY2soNjQtYnl0ZSBiYXNlZCkgYm91bmRhcnkKKyAgICBpZiAoUmVtYWluZGVyIDwgNTYpCisgICAgeworICAgICAgICAqcEFwcGVuZCA9IDB4ODA7CisgICAgICAgIFBhZExlbkluQnl0ZXMgLS07CisKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQgKyBSZW1haW5kZXIrMSwgUGFkTGVuSW5CeXRlcyk7CisKKwkJLy8gYWRkIGRhdGEtbGVuZ3RoIGZpZWxkLCBmcm9tIGhpZ2ggdG8gbG93CisgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAJcEN0eC0+SW5wdXRbNTYraV0gPSAoVUNIQVIpKChwQ3R4LT5MZW5JbkJpdENvdW50WzFdID4+ICgoMy1pKSA8PCAzKSkgJiAweGZmKTsKKyAgICAgICAgCXBDdHgtPklucHV0WzYwK2ldID0gKFVDSEFSKSgocEN0eC0+TGVuSW5CaXRDb3VudFswXSA+PiAoKDMtaSkgPDwgMykpICYgMHhmZik7CisgICAgICAJfQorCisgICAgICAgIGJ5dGVSZXZlcnNlKChVQ0hBUiAqKXBDdHgtPklucHV0LCAxNik7CisgICAgICAgIE5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKXBDdHgtPklucHV0ICsgNjQsIDE0KTsKKyAgICAgICAgU0hBVHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKKyAgICB9IC8vIGVuZCBvZiBpZgorCisgICAgLy8gcGFkZGluZyBiaXRzIHdpdGggY3Jvc3NpbmcgYmxvY2soNjQtYnl0ZSBiYXNlZCkgYm91bmRhcnkKKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyB0aGUgZmlyc3QgYmxvY2sgPT09CisgICAgICAgICpwQXBwZW5kID0gMHg4MDsKKyAgICAgICAgUGFkTGVuSW5CeXRlcyAtLTsKKworICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCArIFJlbWFpbmRlcisxLCAoNjQtUmVtYWluZGVyLTEpKTsKKyAgICAgICAgUGFkTGVuSW5CeXRlcyAtPSAoNjQgLSBSZW1haW5kZXIgLSAxKTsKKworICAgICAgICBieXRlUmV2ZXJzZSgoVUNIQVIgKilwQ3R4LT5JbnB1dCwgMTYpOworICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCArIDY0LCAxNik7CisgICAgICAgIFNIQVRyYW5zZm9ybShwQ3R4LT5CdWYsIChVSU5UMzIgKilwQ3R4LT5JbnB1dCk7CisKKworICAgICAgICAvLyB0aGUgc2Vjb25kIGJsb2NrID09PQorICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCwgUGFkTGVuSW5CeXRlcyk7CisKKwkJLy8gYWRkIGRhdGEtbGVuZ3RoIGZpZWxkCisJCWZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAJcEN0eC0+SW5wdXRbNTYraV0gPSAoVUNIQVIpKChwQ3R4LT5MZW5JbkJpdENvdW50WzFdID4+ICgoMy1pKSA8PCAzKSkgJiAweGZmKTsKKyAgICAgICAgCXBDdHgtPklucHV0WzYwK2ldID0gKFVDSEFSKSgocEN0eC0+TGVuSW5CaXRDb3VudFswXSA+PiAoKDMtaSkgPDwgMykpICYgMHhmZik7CisgICAgICAJfQorCisgICAgICAgIGJ5dGVSZXZlcnNlKChVQ0hBUiAqKXBDdHgtPklucHV0LCAxNik7CisgICAgICAgIE5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKXBDdHgtPklucHV0ICsgNjQsIDE2KTsKKyAgICAgICAgU0hBVHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKKyAgICB9IC8vIGVuZCBvZiBlbHNlCisKKworICAgIC8vT3V0cHV0LCBieXRlcmV2ZXJzZQorICAgIGZvciAoaT0wOyBpPDIwOyBpKyspCisgICAgeworICAgICAgICBEaWdlc3QgW2ldID0gKFVDSEFSKShwQ3R4LT5CdWZbaT4+Ml0gPj4gOCooMy0oaSAmIDB4MykpKTsKKyAgICB9CisKKyAgICBOZGlzWmVyb01lbW9yeShwQ3R4LCBzaXplb2YocEN0eCkpOyAvLyBtZW1vcnkgZnJlZQorfQorCisKKy8vIFRoZSBjZW50cmFsIGFsZ29yaXRobSBvZiBTSEEtMSwgY29uc2lzdHMgb2YgZm91ciByb3VuZHMgYW5kCisvLyB0d2VudHkgc3RlcHMgcGVyIHJvdW5kCitWT0lEIFNIQVRyYW5zZm9ybShVSU5UMzIgQnVmWzVdLCBVSU5UMzIgTWVzWzIwXSkKK3sKKyAgICBVSU5UMzIgUmVnWzVdLFRlbXA7CisJdW5zaWduZWQgaW50IGk7CisgICAgVUlOVDMyIFdbODBdOworCisgICAgc3RhdGljIFVJTlQzMiBTSEExVGFibGVbNF0gPSB7IDB4NWE4Mjc5OTksIDB4NmVkOWViYTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ZjFiYmNkYywgMHhjYTYyYzFkNiB9OworCisgICAgUmVnWzBdPUJ1ZlswXTsKKwlSZWdbMV09QnVmWzFdOworCVJlZ1syXT1CdWZbMl07CisJUmVnWzNdPUJ1ZlszXTsKKwlSZWdbNF09QnVmWzRdOworCisgICAgLy90aGUgZmlyc3Qgb2N0ZXQgb2YgYSB3b3JkIGlzIHN0b3JlZCBpbiB0aGUgMHRoIGVsZW1lbnQsIGJ5dGVyZXZlcnNlCisJZm9yKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICB7CisgICAgCVdbaV0gID0gKE1lc1tpXSA+PiAyNCkgJiAweGZmOworICAgICAgICBXW2ldIHw9IChNZXNbaV0gPj4gOCApICYgMHhmZjAwOworICAgICAgICBXW2ldIHw9IChNZXNbaV0gPDwgOCApICYgMHhmZjAwMDA7CisgICAgICAgIFdbaV0gfD0gKE1lc1tpXSA8PCAyNCkgJiAweGZmMDAwMDAwOworICAgIH0KKworCisgICAgZm9yCShpID0gMDsgaSA8IDY0OyBpKyspCisJICAgIFdbMTYraV0gPSBDWUNMSUNfTEVGVF9TSElGVChXW2ldIF4gV1syK2ldIF4gV1s4K2ldIF4gV1sxMytpXSwgMSk7CisKKworICAgIC8vIDgwIHN0ZXBzIGluIFNIQS0xIGFsZ29yaXRobQorICAgIGZvciAoaT0wOyBpPDgwOyBpKyspCisgICAgeworICAgICAgICBpZiAoaTwyMCkKKyAgICAgICAgICAgIFNIQTFTdGVwKFNIQTFfRjEsIFJlZ1swXSwgUmVnWzFdLCBSZWdbMl0sIFJlZ1szXSwgUmVnWzRdLAorICAgICAgICAgICAgICAgICAgICAgV1tpXSwgU0hBMVRhYmxlWzBdKTsKKworICAgICAgICBlbHNlIGlmIChpPj0yMCAmJiBpPDQwKQorICAgICAgICAgICAgU0hBMVN0ZXAoU0hBMV9GMiwgUmVnWzBdLCBSZWdbMV0sIFJlZ1syXSwgUmVnWzNdLCBSZWdbNF0sCisgICAgICAgICAgICAgICAgICAgICBXW2ldLCBTSEExVGFibGVbMV0pOworCisJCWVsc2UgaWYgKGk+PTQwICYmIGk8NjApCisgICAgICAgICAgICBTSEExU3RlcChTSEExX0YzLCBSZWdbMF0sIFJlZ1sxXSwgUmVnWzJdLCBSZWdbM10sIFJlZ1s0XSwKKyAgICAgICAgICAgICAgICAgICAgICBXW2ldLCBTSEExVGFibGVbMl0pOworCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFNIQTFTdGVwKFNIQTFfRjIsIFJlZ1swXSwgUmVnWzFdLCBSZWdbMl0sIFJlZ1szXSwgUmVnWzRdLAorICAgICAgICAgICAgICAgICAgICAgV1tpXSwgU0hBMVRhYmxlWzNdKTsKKworCisgICAgICAgLy8gb25lLXdvcmQgcmlnaHQgc2hpZnQKKwkJVGVtcCAgID0gUmVnWzRdOworICAgICAgICBSZWdbNF0gPSBSZWdbM107CisgICAgICAgIFJlZ1szXSA9IFJlZ1syXTsKKyAgICAgICAgUmVnWzJdID0gUmVnWzFdOworICAgICAgICBSZWdbMV0gPSBSZWdbMF07CisgICAgICAgIFJlZ1swXSA9IFRlbXA7CisKKyAgICB9IC8vIGVuZCBvZiBmb3ItbG9vcAorCisKKyAgICAvLyAodGVtcG9yYXJ5KW91dHB1dAorICAgIGZvciAoaT0wOyBpPDU7IGkrKykKKyAgICAgICAgQnVmW2ldICs9IFJlZ1tpXTsKKworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT0gIEFFUyBFbi9EZWNyeXB0aW9uID09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qIGZvcndhcmQgUy1ib3ggKi8KK3N0YXRpYyB1aW50MzIgRlNiWzI1Nl0gPQoreworCTB4NjMsIDB4N0MsCTB4NzcsIDB4N0IsCTB4RjIsIDB4NkIsCTB4NkYsIDB4QzUsCisJMHgzMCwgMHgwMSwJMHg2NywgMHgyQiwJMHhGRSwgMHhENywJMHhBQiwgMHg3NiwKKwkweENBLCAweDgyLAkweEM5LCAweDdELAkweEZBLCAweDU5LAkweDQ3LCAweEYwLAorCTB4QUQsIDB4RDQsCTB4QTIsIDB4QUYsCTB4OUMsIDB4QTQsCTB4NzIsIDB4QzAsCisJMHhCNywgMHhGRCwJMHg5MywgMHgyNiwJMHgzNiwgMHgzRiwJMHhGNywgMHhDQywKKwkweDM0LCAweEE1LAkweEU1LCAweEYxLAkweDcxLCAweEQ4LAkweDMxLCAweDE1LAorCTB4MDQsIDB4QzcsCTB4MjMsIDB4QzMsCTB4MTgsIDB4OTYsCTB4MDUsIDB4OUEsCisJMHgwNywgMHgxMiwJMHg4MCwgMHhFMiwJMHhFQiwgMHgyNywJMHhCMiwgMHg3NSwKKwkweDA5LCAweDgzLAkweDJDLCAweDFBLAkweDFCLCAweDZFLAkweDVBLCAweEEwLAorCTB4NTIsIDB4M0IsCTB4RDYsIDB4QjMsCTB4MjksIDB4RTMsCTB4MkYsIDB4ODQsCisJMHg1MywgMHhEMSwJMHgwMCwgMHhFRCwJMHgyMCwgMHhGQywJMHhCMSwgMHg1QiwKKwkweDZBLCAweENCLAkweEJFLCAweDM5LAkweDRBLCAweDRDLAkweDU4LCAweENGLAorCTB4RDAsIDB4RUYsCTB4QUEsIDB4RkIsCTB4NDMsIDB4NEQsCTB4MzMsIDB4ODUsCisJMHg0NSwgMHhGOSwJMHgwMiwgMHg3RiwJMHg1MCwgMHgzQywJMHg5RiwgMHhBOCwKKwkweDUxLCAweEEzLAkweDQwLCAweDhGLAkweDkyLCAweDlELAkweDM4LCAweEY1LAorCTB4QkMsIDB4QjYsCTB4REEsIDB4MjEsCTB4MTAsIDB4RkYsCTB4RjMsIDB4RDIsCisJMHhDRCwgMHgwQywJMHgxMywgMHhFQywJMHg1RiwgMHg5NywJMHg0NCwgMHgxNywKKwkweEM0LCAweEE3LAkweDdFLCAweDNELAkweDY0LCAweDVELAkweDE5LCAweDczLAorCTB4NjAsIDB4ODEsCTB4NEYsIDB4REMsCTB4MjIsIDB4MkEsCTB4OTAsIDB4ODgsCisJMHg0NiwgMHhFRSwJMHhCOCwgMHgxNCwJMHhERSwgMHg1RSwJMHgwQiwgMHhEQiwKKwkweEUwLCAweDMyLAkweDNBLCAweDBBLAkweDQ5LCAweDA2LAkweDI0LCAweDVDLAorCTB4QzIsIDB4RDMsCTB4QUMsIDB4NjIsCTB4OTEsIDB4OTUsCTB4RTQsIDB4NzksCisJMHhFNywgMHhDOCwJMHgzNywgMHg2RCwJMHg4RCwgMHhENSwJMHg0RSwgMHhBOSwKKwkweDZDLCAweDU2LAkweEY0LCAweEVBLAkweDY1LCAweDdBLAkweEFFLCAweDA4LAorCTB4QkEsIDB4NzgsCTB4MjUsIDB4MkUsCTB4MUMsIDB4QTYsCTB4QjQsIDB4QzYsCisJMHhFOCwgMHhERCwJMHg3NCwgMHgxRiwJMHg0QiwgMHhCRCwJMHg4QiwgMHg4QSwKKwkweDcwLCAweDNFLAkweEI1LCAweDY2LAkweDQ4LCAweDAzLAkweEY2LCAweDBFLAorCTB4NjEsIDB4MzUsCTB4NTcsIDB4QjksCTB4ODYsIDB4QzEsCTB4MUQsIDB4OUUsCisJMHhFMSwgMHhGOCwJMHg5OCwgMHgxMSwJMHg2OSwgMHhEOSwJMHg4RSwgMHg5NCwKKwkweDlCLCAweDFFLAkweDg3LCAweEU5LAkweENFLCAweDU1LAkweDI4LCAweERGLAorCTB4OEMsIDB4QTEsCTB4ODksIDB4MEQsCTB4QkYsIDB4RTYsCTB4NDIsIDB4NjgsCisJMHg0MSwgMHg5OSwJMHgyRCwgMHgwRiwJMHhCMCwgMHg1NCwJMHhCQiwgMHgxNgorfTsKKworLyogZm9yd2FyZCB0YWJsZSAqLworI2RlZmluZQlGVCBcCitcCisJVihDNiw2Myw2MyxBNSksCVYoRjgsN0MsN0MsODQpLAlWKEVFLDc3LDc3LDk5KSwJVihGNiw3Qiw3Qiw4RCksCVwKKwlWKEZGLEYyLEYyLDBEKSwJVihENiw2Qiw2QixCRCksCVYoREUsNkYsNkYsQjEpLAlWKDkxLEM1LEM1LDU0KSwJXAorCVYoNjAsMzAsMzAsNTApLAlWKDAyLDAxLDAxLDAzKSwJVihDRSw2Nyw2NyxBOSksCVYoNTYsMkIsMkIsN0QpLAlcCisJVihFNyxGRSxGRSwxOSksCVYoQjUsRDcsRDcsNjIpLAlWKDRELEFCLEFCLEU2KSwJVihFQyw3Niw3Niw5QSksCVwKKwlWKDhGLENBLENBLDQ1KSwJVigxRiw4Miw4Miw5RCksCVYoODksQzksQzksNDApLAlWKEZBLDdELDdELDg3KSwJXAorCVYoRUYsRkEsRkEsMTUpLAlWKEIyLDU5LDU5LEVCKSwJVig4RSw0Nyw0NyxDOSksCVYoRkIsRjAsRjAsMEIpLAlcCisJVig0MSxBRCxBRCxFQyksCVYoQjMsRDQsRDQsNjcpLAlWKDVGLEEyLEEyLEZEKSwJVig0NSxBRixBRixFQSksCVwKKwlWKDIzLDlDLDlDLEJGKSwJVig1MyxBNCxBNCxGNyksCVYoRTQsNzIsNzIsOTYpLAlWKDlCLEMwLEMwLDVCKSwJXAorCVYoNzUsQjcsQjcsQzIpLAlWKEUxLEZELEZELDFDKSwJVigzRCw5Myw5MyxBRSksCVYoNEMsMjYsMjYsNkEpLAlcCisJVig2QywzNiwzNiw1QSksCVYoN0UsM0YsM0YsNDEpLAlWKEY1LEY3LEY3LDAyKSwJVig4MyxDQyxDQyw0RiksCVwKKwlWKDY4LDM0LDM0LDVDKSwJVig1MSxBNSxBNSxGNCksCVYoRDEsRTUsRTUsMzQpLAlWKEY5LEYxLEYxLDA4KSwJXAorCVYoRTIsNzEsNzEsOTMpLAlWKEFCLEQ4LEQ4LDczKSwJVig2MiwzMSwzMSw1MyksCVYoMkEsMTUsMTUsM0YpLAlcCisJVigwOCwwNCwwNCwwQyksCVYoOTUsQzcsQzcsNTIpLAlWKDQ2LDIzLDIzLDY1KSwJVig5RCxDMyxDMyw1RSksCVwKKwlWKDMwLDE4LDE4LDI4KSwJVigzNyw5Niw5NixBMSksCVYoMEEsMDUsMDUsMEYpLAlWKDJGLDlBLDlBLEI1KSwJXAorCVYoMEUsMDcsMDcsMDkpLAlWKDI0LDEyLDEyLDM2KSwJVigxQiw4MCw4MCw5QiksCVYoREYsRTIsRTIsM0QpLAlcCisJVihDRCxFQixFQiwyNiksCVYoNEUsMjcsMjcsNjkpLAlWKDdGLEIyLEIyLENEKSwJVihFQSw3NSw3NSw5RiksCVwKKwlWKDEyLDA5LDA5LDFCKSwJVigxRCw4Myw4Myw5RSksCVYoNTgsMkMsMkMsNzQpLAlWKDM0LDFBLDFBLDJFKSwJXAorCVYoMzYsMUIsMUIsMkQpLAlWKERDLDZFLDZFLEIyKSwJVihCNCw1QSw1QSxFRSksCVYoNUIsQTAsQTAsRkIpLAlcCisJVihBNCw1Miw1MixGNiksCVYoNzYsM0IsM0IsNEQpLAlWKEI3LEQ2LEQ2LDYxKSwJVig3RCxCMyxCMyxDRSksCVwKKwlWKDUyLDI5LDI5LDdCKSwJVihERCxFMyxFMywzRSksCVYoNUUsMkYsMkYsNzEpLAlWKDEzLDg0LDg0LDk3KSwJXAorCVYoQTYsNTMsNTMsRjUpLAlWKEI5LEQxLEQxLDY4KSwJVigwMCwwMCwwMCwwMCksCVYoQzEsRUQsRUQsMkMpLAlcCisJVig0MCwyMCwyMCw2MCksCVYoRTMsRkMsRkMsMUYpLAlWKDc5LEIxLEIxLEM4KSwJVihCNiw1Qiw1QixFRCksCVwKKwlWKEQ0LDZBLDZBLEJFKSwJVig4RCxDQixDQiw0NiksCVYoNjcsQkUsQkUsRDkpLAlWKDcyLDM5LDM5LDRCKSwJXAorCVYoOTQsNEEsNEEsREUpLAlWKDk4LDRDLDRDLEQ0KSwJVihCMCw1OCw1OCxFOCksCVYoODUsQ0YsQ0YsNEEpLAlcCisJVihCQixEMCxEMCw2QiksCVYoQzUsRUYsRUYsMkEpLAlWKDRGLEFBLEFBLEU1KSwJVihFRCxGQixGQiwxNiksCVwKKwlWKDg2LDQzLDQzLEM1KSwJVig5QSw0RCw0RCxENyksCVYoNjYsMzMsMzMsNTUpLAlWKDExLDg1LDg1LDk0KSwJXAorCVYoOEEsNDUsNDUsQ0YpLAlWKEU5LEY5LEY5LDEwKSwJVigwNCwwMiwwMiwwNiksCVYoRkUsN0YsN0YsODEpLAlcCisJVihBMCw1MCw1MCxGMCksCVYoNzgsM0MsM0MsNDQpLAlWKDI1LDlGLDlGLEJBKSwJVig0QixBOCxBOCxFMyksCVwKKwlWKEEyLDUxLDUxLEYzKSwJVig1RCxBMyxBMyxGRSksCVYoODAsNDAsNDAsQzApLAlWKDA1LDhGLDhGLDhBKSwJXAorCVYoM0YsOTIsOTIsQUQpLAlWKDIxLDlELDlELEJDKSwJVig3MCwzOCwzOCw0OCksCVYoRjEsRjUsRjUsMDQpLAlcCisJVig2MyxCQyxCQyxERiksCVYoNzcsQjYsQjYsQzEpLAlWKEFGLERBLERBLDc1KSwJVig0MiwyMSwyMSw2MyksCVwKKwlWKDIwLDEwLDEwLDMwKSwJVihFNSxGRixGRiwxQSksCVYoRkQsRjMsRjMsMEUpLAlWKEJGLEQyLEQyLDZEKSwJXAorCVYoODEsQ0QsQ0QsNEMpLAlWKDE4LDBDLDBDLDE0KSwJVigyNiwxMywxMywzNSksCVYoQzMsRUMsRUMsMkYpLAlcCisJVihCRSw1Riw1RixFMSksCVYoMzUsOTcsOTcsQTIpLAlWKDg4LDQ0LDQ0LENDKSwJVigyRSwxNywxNywzOSksCVwKKwlWKDkzLEM0LEM0LDU3KSwJVig1NSxBNyxBNyxGMiksCVYoRkMsN0UsN0UsODIpLAlWKDdBLDNELDNELDQ3KSwJXAorCVYoQzgsNjQsNjQsQUMpLAlWKEJBLDVELDVELEU3KSwJVigzMiwxOSwxOSwyQiksCVYoRTYsNzMsNzMsOTUpLAlcCisJVihDMCw2MCw2MCxBMCksCVYoMTksODEsODEsOTgpLAlWKDlFLDRGLDRGLEQxKSwJVihBMyxEQyxEQyw3RiksCVwKKwlWKDQ0LDIyLDIyLDY2KSwJVig1NCwyQSwyQSw3RSksCVYoM0IsOTAsOTAsQUIpLAlWKDBCLDg4LDg4LDgzKSwJXAorCVYoOEMsNDYsNDYsQ0EpLAlWKEM3LEVFLEVFLDI5KSwJVig2QixCOCxCOCxEMyksCVYoMjgsMTQsMTQsM0MpLAlcCisJVihBNyxERSxERSw3OSksCVYoQkMsNUUsNUUsRTIpLAlWKDE2LDBCLDBCLDFEKSwJVihBRCxEQixEQiw3NiksCVwKKwlWKERCLEUwLEUwLDNCKSwJVig2NCwzMiwzMiw1NiksCVYoNzQsM0EsM0EsNEUpLAlWKDE0LDBBLDBBLDFFKSwJXAorCVYoOTIsNDksNDksREIpLAlWKDBDLDA2LDA2LDBBKSwJVig0OCwyNCwyNCw2QyksCVYoQjgsNUMsNUMsRTQpLAlcCisJVig5RixDMixDMiw1RCksCVYoQkQsRDMsRDMsNkUpLAlWKDQzLEFDLEFDLEVGKSwJVihDNCw2Miw2MixBNiksCVwKKwlWKDM5LDkxLDkxLEE4KSwJVigzMSw5NSw5NSxBNCksCVYoRDMsRTQsRTQsMzcpLAlWKEYyLDc5LDc5LDhCKSwJXAorCVYoRDUsRTcsRTcsMzIpLAlWKDhCLEM4LEM4LDQzKSwJVig2RSwzNywzNyw1OSksCVYoREEsNkQsNkQsQjcpLAlcCisJVigwMSw4RCw4RCw4QyksCVYoQjEsRDUsRDUsNjQpLAlWKDlDLDRFLDRFLEQyKSwJVig0OSxBOSxBOSxFMCksCVwKKwlWKEQ4LDZDLDZDLEI0KSwJVihBQyw1Niw1NixGQSksCVYoRjMsRjQsRjQsMDcpLAlWKENGLEVBLEVBLDI1KSwJXAorCVYoQ0EsNjUsNjUsQUYpLAlWKEY0LDdBLDdBLDhFKSwJVig0NyxBRSxBRSxFOSksCVYoMTAsMDgsMDgsMTgpLAlcCisJVig2RixCQSxCQSxENSksCVYoRjAsNzgsNzgsODgpLAlWKDRBLDI1LDI1LDZGKSwJVig1QywyRSwyRSw3MiksCVwKKwlWKDM4LDFDLDFDLDI0KSwJVig1NyxBNixBNixGMSksCVYoNzMsQjQsQjQsQzcpLAlWKDk3LEM2LEM2LDUxKSwJXAorCVYoQ0IsRTgsRTgsMjMpLAlWKEExLERELERELDdDKSwJVihFOCw3NCw3NCw5QyksCVYoM0UsMUYsMUYsMjEpLAlcCisJVig5Niw0Qiw0QixERCksCVYoNjEsQkQsQkQsREMpLAlWKDBELDhCLDhCLDg2KSwJVigwRiw4QSw4QSw4NSksCVwKKwlWKEUwLDcwLDcwLDkwKSwJVig3QywzRSwzRSw0MiksCVYoNzEsQjUsQjUsQzQpLAlWKENDLDY2LDY2LEFBKSwJXAorCVYoOTAsNDgsNDgsRDgpLAlWKDA2LDAzLDAzLDA1KSwJVihGNyxGNixGNiwwMSksCVYoMUMsMEUsMEUsMTIpLAlcCisJVihDMiw2MSw2MSxBMyksCVYoNkEsMzUsMzUsNUYpLAlWKEFFLDU3LDU3LEY5KSwJVig2OSxCOSxCOSxEMCksCVwKKwlWKDE3LDg2LDg2LDkxKSwJVig5OSxDMSxDMSw1OCksCVYoM0EsMUQsMUQsMjcpLAlWKDI3LDlFLDlFLEI5KSwJXAorCVYoRDksRTEsRTEsMzgpLAlWKEVCLEY4LEY4LDEzKSwJVigyQiw5OCw5OCxCMyksCVYoMjIsMTEsMTEsMzMpLAlcCisJVihEMiw2OSw2OSxCQiksCVYoQTksRDksRDksNzApLAlWKDA3LDhFLDhFLDg5KSwJVigzMyw5NCw5NCxBNyksCVwKKwlWKDJELDlCLDlCLEI2KSwJVigzQywxRSwxRSwyMiksCVYoMTUsODcsODcsOTIpLAlWKEM5LEU5LEU5LDIwKSwJXAorCVYoODcsQ0UsQ0UsNDkpLAlWKEFBLDU1LDU1LEZGKSwJVig1MCwyOCwyOCw3OCksCVYoQTUsREYsREYsN0EpLAlcCisJVigwMyw4Qyw4Qyw4RiksCVYoNTksQTEsQTEsRjgpLAlWKDA5LDg5LDg5LDgwKSwJVigxQSwwRCwwRCwxNyksCVwKKwlWKDY1LEJGLEJGLERBKSwJVihENyxFNixFNiwzMSksCVYoODQsNDIsNDIsQzYpLAlWKEQwLDY4LDY4LEI4KSwJXAorCVYoODIsNDEsNDEsQzMpLAlWKDI5LDk5LDk5LEIwKSwJVig1QSwyRCwyRCw3NyksCVYoMUUsMEYsMEYsMTEpLAlcCisJVig3QixCMCxCMCxDQiksCVYoQTgsNTQsNTQsRkMpLAlWKDZELEJCLEJCLEQ2KSwJVigyQywxNiwxNiwzQSkKKworI2RlZmluZQlWKGEsYixjLGQpIDB4IyNhIyNiIyNjIyNkCitzdGF0aWMgdWludDMyIEZUMFsyNTZdID0geyBGVCB9OworI3VuZGVmIFYKKworI2RlZmluZQlWKGEsYixjLGQpIDB4IyNkIyNhIyNiIyNjCitzdGF0aWMgdWludDMyIEZUMVsyNTZdID0geyBGVCB9OworI3VuZGVmIFYKKworI2RlZmluZQlWKGEsYixjLGQpIDB4IyNjIyNkIyNhIyNiCitzdGF0aWMgdWludDMyIEZUMlsyNTZdID0geyBGVCB9OworI3VuZGVmIFYKKworI2RlZmluZQlWKGEsYixjLGQpIDB4IyNiIyNjIyNkIyNhCitzdGF0aWMgdWludDMyIEZUM1syNTZdID0geyBGVCB9OworI3VuZGVmIFYKKworI3VuZGVmIEZUCisKKy8qIHJldmVyc2UgUy1ib3ggKi8KKworc3RhdGljIHVpbnQzMiBSU2JbMjU2XSA9Cit7CisJMHg1MiwgMHgwOSwJMHg2QSwgMHhENSwJMHgzMCwgMHgzNiwJMHhBNSwgMHgzOCwKKwkweEJGLCAweDQwLAkweEEzLCAweDlFLAkweDgxLCAweEYzLAkweEQ3LCAweEZCLAorCTB4N0MsIDB4RTMsCTB4MzksIDB4ODIsCTB4OUIsIDB4MkYsCTB4RkYsIDB4ODcsCisJMHgzNCwgMHg4RSwJMHg0MywgMHg0NCwJMHhDNCwgMHhERSwJMHhFOSwgMHhDQiwKKwkweDU0LCAweDdCLAkweDk0LCAweDMyLAkweEE2LCAweEMyLAkweDIzLCAweDNELAorCTB4RUUsIDB4NEMsCTB4OTUsIDB4MEIsCTB4NDIsIDB4RkEsCTB4QzMsIDB4NEUsCisJMHgwOCwgMHgyRSwJMHhBMSwgMHg2NiwJMHgyOCwgMHhEOSwJMHgyNCwgMHhCMiwKKwkweDc2LCAweDVCLAkweEEyLCAweDQ5LAkweDZELCAweDhCLAkweEQxLCAweDI1LAorCTB4NzIsIDB4RjgsCTB4RjYsIDB4NjQsCTB4ODYsIDB4NjgsCTB4OTgsIDB4MTYsCisJMHhENCwgMHhBNCwJMHg1QywgMHhDQywJMHg1RCwgMHg2NSwJMHhCNiwgMHg5MiwKKwkweDZDLCAweDcwLAkweDQ4LCAweDUwLAkweEZELCAweEVELAkweEI5LCAweERBLAorCTB4NUUsIDB4MTUsCTB4NDYsIDB4NTcsCTB4QTcsIDB4OEQsCTB4OUQsIDB4ODQsCisJMHg5MCwgMHhEOCwJMHhBQiwgMHgwMCwJMHg4QywgMHhCQywJMHhEMywgMHgwQSwKKwkweEY3LCAweEU0LAkweDU4LCAweDA1LAkweEI4LCAweEIzLAkweDQ1LCAweDA2LAorCTB4RDAsIDB4MkMsCTB4MUUsIDB4OEYsCTB4Q0EsIDB4M0YsCTB4MEYsIDB4MDIsCisJMHhDMSwgMHhBRiwJMHhCRCwgMHgwMywJMHgwMSwgMHgxMywJMHg4QSwgMHg2QiwKKwkweDNBLCAweDkxLAkweDExLCAweDQxLAkweDRGLCAweDY3LAkweERDLCAweEVBLAorCTB4OTcsIDB4RjIsCTB4Q0YsIDB4Q0UsCTB4RjAsIDB4QjQsCTB4RTYsIDB4NzMsCisJMHg5NiwgMHhBQywJMHg3NCwgMHgyMiwJMHhFNywgMHhBRCwJMHgzNSwgMHg4NSwKKwkweEUyLCAweEY5LAkweDM3LCAweEU4LAkweDFDLCAweDc1LAkweERGLCAweDZFLAorCTB4NDcsIDB4RjEsCTB4MUEsIDB4NzEsCTB4MUQsIDB4MjksCTB4QzUsIDB4ODksCisJMHg2RiwgMHhCNywJMHg2MiwgMHgwRSwJMHhBQSwgMHgxOCwJMHhCRSwgMHgxQiwKKwkweEZDLCAweDU2LAkweDNFLCAweDRCLAkweEM2LCAweEQyLAkweDc5LCAweDIwLAorCTB4OUEsIDB4REIsCTB4QzAsIDB4RkUsCTB4NzgsIDB4Q0QsCTB4NUEsIDB4RjQsCisJMHgxRiwgMHhERCwJMHhBOCwgMHgzMywJMHg4OCwgMHgwNywJMHhDNywgMHgzMSwKKwkweEIxLCAweDEyLAkweDEwLCAweDU5LAkweDI3LCAweDgwLAkweEVDLCAweDVGLAorCTB4NjAsIDB4NTEsCTB4N0YsIDB4QTksCTB4MTksIDB4QjUsCTB4NEEsIDB4MEQsCisJMHgyRCwgMHhFNSwJMHg3QSwgMHg5RiwJMHg5MywgMHhDOSwJMHg5QywgMHhFRiwKKwkweEEwLCAweEUwLAkweDNCLCAweDRELAkweEFFLCAweDJBLAkweEY1LCAweEIwLAorCTB4QzgsIDB4RUIsCTB4QkIsIDB4M0MsCTB4ODMsIDB4NTMsCTB4OTksIDB4NjEsCisJMHgxNywgMHgyQiwJMHgwNCwgMHg3RSwJMHhCQSwgMHg3NywJMHhENiwgMHgyNiwKKwkweEUxLCAweDY5LAkweDE0LCAweDYzLAkweDU1LCAweDIxLAkweDBDLCAweDdECit9OworCisvKiByZXZlcnNlIHRhYmxlICovCisKKyNkZWZpbmUJUlQgXAorXAorCVYoNTEsRjQsQTcsNTApLAlWKDdFLDQxLDY1LDUzKSwJVigxQSwxNyxBNCxDMyksCVYoM0EsMjcsNUUsOTYpLAlcCisJVigzQixBQiw2QixDQiksCVYoMUYsOUQsNDUsRjEpLAlWKEFDLEZBLDU4LEFCKSwJVig0QixFMywwMyw5MyksCVwKKwlWKDIwLDMwLEZBLDU1KSwJVihBRCw3Niw2RCxGNiksCVYoODgsQ0MsNzYsOTEpLAlWKEY1LDAyLDRDLDI1KSwJXAorCVYoNEYsRTUsRDcsRkMpLAlWKEM1LDJBLENCLEQ3KSwJVigyNiwzNSw0NCw4MCksCVYoQjUsNjIsQTMsOEYpLAlcCisJVihERSxCMSw1QSw0OSksCVYoMjUsQkEsMUIsNjcpLAlWKDQ1LEVBLDBFLDk4KSwJVig1RCxGRSxDMCxFMSksCVwKKwlWKEMzLDJGLDc1LDAyKSwJVig4MSw0QyxGMCwxMiksCVYoOEQsNDYsOTcsQTMpLAlWKDZCLEQzLEY5LEM2KSwJXAorCVYoMDMsOEYsNUYsRTcpLAlWKDE1LDkyLDlDLDk1KSwJVihCRiw2RCw3QSxFQiksCVYoOTUsNTIsNTksREEpLAlcCisJVihENCxCRSw4MywyRCksCVYoNTgsNzQsMjEsRDMpLAlWKDQ5LEUwLDY5LDI5KSwJVig4RSxDOSxDOCw0NCksCVwKKwlWKDc1LEMyLDg5LDZBKSwJVihGNCw4RSw3OSw3OCksCVYoOTksNTgsM0UsNkIpLAlWKDI3LEI5LDcxLEREKSwJXAorCVYoQkUsRTEsNEYsQjYpLAlWKEYwLDg4LEFELDE3KSwJVihDOSwyMCxBQyw2NiksCVYoN0QsQ0UsM0EsQjQpLAlcCisJVig2MyxERiw0QSwxOCksCVYoRTUsMUEsMzEsODIpLAlWKDk3LDUxLDMzLDYwKSwJVig2Miw1Myw3Riw0NSksCVwKKwlWKEIxLDY0LDc3LEUwKSwJVihCQiw2QixBRSw4NCksCVYoRkUsODEsQTAsMUMpLAlWKEY5LDA4LDJCLDk0KSwJXAorCVYoNzAsNDgsNjgsNTgpLAlWKDhGLDQ1LEZELDE5KSwJVig5NCxERSw2Qyw4NyksCVYoNTIsN0IsRjgsQjcpLAlcCisJVihBQiw3MyxEMywyMyksCVYoNzIsNEIsMDIsRTIpLAlWKEUzLDFGLDhGLDU3KSwJVig2Niw1NSxBQiwyQSksCVwKKwlWKEIyLEVCLDI4LDA3KSwJVigyRixCNSxDMiwwMyksCVYoODYsQzUsN0IsOUEpLAlWKEQzLDM3LDA4LEE1KSwJXAorCVYoMzAsMjgsODcsRjIpLAlWKDIzLEJGLEE1LEIyKSwJVigwMiwwMyw2QSxCQSksCVYoRUQsMTYsODIsNUMpLAlcCisJVig4QSxDRiwxQywyQiksCVYoQTcsNzksQjQsOTIpLAlWKEYzLDA3LEYyLEYwKSwJVig0RSw2OSxFMixBMSksCVwKKwlWKDY1LERBLEY0LENEKSwJVigwNiwwNSxCRSxENSksCVYoRDEsMzQsNjIsMUYpLAlWKEM0LEE2LEZFLDhBKSwJXAorCVYoMzQsMkUsNTMsOUQpLAlWKEEyLEYzLDU1LEEwKSwJVigwNSw4QSxFMSwzMiksCVYoQTQsRjYsRUIsNzUpLAlcCisJVigwQiw4MyxFQywzOSksCVYoNDAsNjAsRUYsQUEpLAlWKDVFLDcxLDlGLDA2KSwJVihCRCw2RSwxMCw1MSksCVwKKwlWKDNFLDIxLDhBLEY5KSwJVig5NixERCwwNiwzRCksCVYoREQsM0UsMDUsQUUpLAlWKDRELEU2LEJELDQ2KSwJXAorCVYoOTEsNTQsOEQsQjUpLAlWKDcxLEM0LDVELDA1KSwJVigwNCwwNixENCw2RiksCVYoNjAsNTAsMTUsRkYpLAlcCisJVigxOSw5OCxGQiwyNCksCVYoRDYsQkQsRTksOTcpLAlWKDg5LDQwLDQzLENDKSwJVig2NyxEOSw5RSw3NyksCVwKKwlWKEIwLEU4LDQyLEJEKSwJVigwNyw4OSw4Qiw4OCksCVYoRTcsMTksNUIsMzgpLAlWKDc5LEM4LEVFLERCKSwJXAorCVYoQTEsN0MsMEEsNDcpLAlWKDdDLDQyLDBGLEU5KSwJVihGOCw4NCwxRSxDOSksCVYoMDAsMDAsMDAsMDApLAlcCisJVigwOSw4MCw4Niw4MyksCVYoMzIsMkIsRUQsNDgpLAlWKDFFLDExLDcwLEFDKSwJVig2Qyw1QSw3Miw0RSksCVwKKwlWKEZELDBFLEZGLEZCKSwJVigwRiw4NSwzOCw1NiksCVYoM0QsQUUsRDUsMUUpLAlWKDM2LDJELDM5LDI3KSwJXAorCVYoMEEsMEYsRDksNjQpLAlWKDY4LDVDLEE2LDIxKSwJVig5Qiw1Qiw1NCxEMSksCVYoMjQsMzYsMkUsM0EpLAlcCisJVigwQywwQSw2NyxCMSksCVYoOTMsNTcsRTcsMEYpLAlWKEI0LEVFLDk2LEQyKSwJVigxQiw5Qiw5MSw5RSksCVwKKwlWKDgwLEMwLEM1LDRGKSwJVig2MSxEQywyMCxBMiksCVYoNUEsNzcsNEIsNjkpLAlWKDFDLDEyLDFBLDE2KSwJXAorCVYoRTIsOTMsQkEsMEEpLAlWKEMwLEEwLDJBLEU1KSwJVigzQywyMixFMCw0MyksCVYoMTIsMUIsMTcsMUQpLAlcCisJVigwRSwwOSwwRCwwQiksCVYoRjIsOEIsQzcsQUQpLAlWKDJELEI2LEE4LEI5KSwJVigxNCwxRSxBOSxDOCksCVwKKwlWKDU3LEYxLDE5LDg1KSwJVihBRiw3NSwwNyw0QyksCVYoRUUsOTksREQsQkIpLAlWKEEzLDdGLDYwLEZEKSwJXAorCVYoRjcsMDEsMjYsOUYpLAlWKDVDLDcyLEY1LEJDKSwJVig0NCw2NiwzQixDNSksCVYoNUIsRkIsN0UsMzQpLAlcCisJVig4Qiw0MywyOSw3NiksCVYoQ0IsMjMsQzYsREMpLAlWKEI2LEVELEZDLDY4KSwJVihCOCxFNCxGMSw2MyksCVwKKwlWKEQ3LDMxLERDLENBKSwJVig0Miw2Myw4NSwxMCksCVYoMTMsOTcsMjIsNDApLAlWKDg0LEM2LDExLDIwKSwJXAorCVYoODUsNEEsMjQsN0QpLAlWKEQyLEJCLDNELEY4KSwJVihBRSxGOSwzMiwxMSksCVYoQzcsMjksQTEsNkQpLAlcCisJVigxRCw5RSwyRiw0QiksCVYoREMsQjIsMzAsRjMpLAlWKDBELDg2LDUyLEVDKSwJVig3NyxDMSxFMyxEMCksCVwKKwlWKDJCLEIzLDE2LDZDKSwJVihBOSw3MCxCOSw5OSksCVYoMTEsOTQsNDgsRkEpLAlWKDQ3LEU5LDY0LDIyKSwJXAorCVYoQTgsRkMsOEMsQzQpLAlWKEEwLEYwLDNGLDFBKSwJVig1Niw3RCwyQyxEOCksCVYoMjIsMzMsOTAsRUYpLAlcCisJVig4Nyw0OSw0RSxDNyksCVYoRDksMzgsRDEsQzEpLAlWKDhDLENBLEEyLEZFKSwJVig5OCxENCwwQiwzNiksCVwKKwlWKEE2LEY1LDgxLENGKSwJVihBNSw3QSxERSwyOCksCVYoREEsQjcsOEUsMjYpLAlWKDNGLEFELEJGLEE0KSwJXAorCVYoMkMsM0EsOUQsRTQpLAlWKDUwLDc4LDkyLDBEKSwJVig2QSw1RixDQyw5QiksCVYoNTQsN0UsNDYsNjIpLAlcCisJVihGNiw4RCwxMyxDMiksCVYoOTAsRDgsQjgsRTgpLAlWKDJFLDM5LEY3LDVFKSwJVig4MixDMyxBRixGNSksCVwKKwlWKDlGLDVELDgwLEJFKSwJVig2OSxEMCw5Myw3QyksCVYoNkYsRDUsMkQsQTkpLAlWKENGLDI1LDEyLEIzKSwJXAorCVYoQzgsQUMsOTksM0IpLAlWKDEwLDE4LDdELEE3KSwJVihFOCw5Qyw2Myw2RSksCVYoREIsM0IsQkIsN0IpLAlcCisJVihDRCwyNiw3OCwwOSksCVYoNkUsNTksMTgsRjQpLAlWKEVDLDlBLEI3LDAxKSwJVig4Myw0Riw5QSxBOCksCVwKKwlWKEU2LDk1LDZFLDY1KSwJVihBQSxGRixFNiw3RSksCVYoMjEsQkMsQ0YsMDgpLAlWKEVGLDE1LEU4LEU2KSwJXAorCVYoQkEsRTcsOUIsRDkpLAlWKDRBLDZGLDM2LENFKSwJVihFQSw5RiwwOSxENCksCVYoMjksQjAsN0MsRDYpLAlcCisJVigzMSxBNCxCMixBRiksCVYoMkEsM0YsMjMsMzEpLAlWKEM2LEE1LDk0LDMwKSwJVigzNSxBMiw2NixDMCksCVwKKwlWKDc0LDRFLEJDLDM3KSwJVihGQyw4MixDQSxBNiksCVYoRTAsOTAsRDAsQjApLAlWKDMzLEE3LEQ4LDE1KSwJXAorCVYoRjEsMDQsOTgsNEEpLAlWKDQxLEVDLERBLEY3KSwJVig3RixDRCw1MCwwRSksCVYoMTcsOTEsRjYsMkYpLAlcCisJVig3Niw0RCxENiw4RCksCVYoNDMsRUYsQjAsNEQpLAlWKENDLEFBLDRELDU0KSwJVihFNCw5NiwwNCxERiksCVwKKwlWKDlFLEQxLEI1LEUzKSwJVig0Qyw2QSw4OCwxQiksCVYoQzEsMkMsMUYsQjgpLAlWKDQ2LDY1LDUxLDdGKSwJXAorCVYoOUQsNUUsRUEsMDQpLAlWKDAxLDhDLDM1LDVEKSwJVihGQSw4Nyw3NCw3MyksCVYoRkIsMEIsNDEsMkUpLAlcCisJVihCMyw2NywxRCw1QSksCVYoOTIsREIsRDIsNTIpLAlWKEU5LDEwLDU2LDMzKSwJVig2RCxENiw0NywxMyksCVwKKwlWKDlBLEQ3LDYxLDhDKSwJVigzNyxBMSwwQyw3QSksCVYoNTksRjgsMTQsOEUpLAlWKEVCLDEzLDNDLDg5KSwJXAorCVYoQ0UsQTksMjcsRUUpLAlWKEI3LDYxLEM5LDM1KSwJVihFMSwxQyxFNSxFRCksCVYoN0EsNDcsQjEsM0MpLAlcCisJVig5QyxEMixERiw1OSksCVYoNTUsRjIsNzMsM0YpLAlWKDE4LDE0LENFLDc5KSwJVig3MyxDNywzNyxCRiksCVwKKwlWKDUzLEY3LENELEVBKSwJVig1RixGRCxBQSw1QiksCVYoREYsM0QsNkYsMTQpLAlWKDc4LDQ0LERCLDg2KSwJXAorCVYoQ0EsQUYsRjMsODEpLAlWKEI5LDY4LEM0LDNFKSwJVigzOCwyNCwzNCwyQyksCVYoQzIsQTMsNDAsNUYpLAlcCisJVigxNiwxRCxDMyw3MiksCVYoQkMsRTIsMjUsMEMpLAlWKDI4LDNDLDQ5LDhCKSwJVihGRiwwRCw5NSw0MSksCVwKKwlWKDM5LEE4LDAxLDcxKSwJVigwOCwwQyxCMyxERSksCVYoRDgsQjQsRTQsOUMpLAlWKDY0LDU2LEMxLDkwKSwJXAorCVYoN0IsQ0IsODQsNjEpLAlWKEQ1LDMyLEI2LDcwKSwJVig0OCw2Qyw1Qyw3NCksCVYoRDAsQjgsNTcsNDIpCisKKyNkZWZpbmUJVihhLGIsYyxkKSAweCMjYSMjYiMjYyMjZAorc3RhdGljIHVpbnQzMiBSVDBbMjU2XSA9IHsgUlQgfTsKKyN1bmRlZiBWCisKKyNkZWZpbmUJVihhLGIsYyxkKSAweCMjZCMjYSMjYiMjYworc3RhdGljIHVpbnQzMiBSVDFbMjU2XSA9IHsgUlQgfTsKKyN1bmRlZiBWCisKKyNkZWZpbmUJVihhLGIsYyxkKSAweCMjYyMjZCMjYSMjYgorc3RhdGljIHVpbnQzMiBSVDJbMjU2XSA9IHsgUlQgfTsKKyN1bmRlZiBWCisKKyNkZWZpbmUJVihhLGIsYyxkKSAweCMjYiMjYyMjZCMjYQorc3RhdGljIHVpbnQzMiBSVDNbMjU2XSA9IHsgUlQgfTsKKyN1bmRlZiBWCisKKyN1bmRlZiBSVAorCisvKiByb3VuZCBjb25zdGFudHMgKi8KKworc3RhdGljIHVpbnQzMiBSQ09OWzEwXSA9Cit7CisJMHgwMTAwMDAwMCwJMHgwMjAwMDAwMCwJMHgwNDAwMDAwMCwJMHgwODAwMDAwMCwKKwkweDEwMDAwMDAwLAkweDIwMDAwMDAwLAkweDQwMDAwMDAwLAkweDgwMDAwMDAwLAorCTB4MUIwMDAwMDAsCTB4MzYwMDAwMDAKK307CisKKy8qIGtleSBzY2hlZHVsZQl0YWJsZXMgKi8KKworc3RhdGljIGludCBLVF9pbml0ID0gMTsKKworc3RhdGljIHVpbnQzMiBLVDBbMjU2XTsKK3N0YXRpYyB1aW50MzIgS1QxWzI1Nl07CitzdGF0aWMgdWludDMyIEtUMlsyNTZdOworc3RhdGljIHVpbnQzMiBLVDNbMjU2XTsKKworLyogcGxhdGZvcm0taW5kZXBlbmRhbnQJMzItYml0IGludGVnZXIgbWFuaXB1bGF0aW9uCW1hY3JvcyAqLworCisjZGVmaW5lCUdFVF9VSU5UMzIobixiLGkpCQkJCQkJXAorewkJCQkJCQkJCQkJCVwKKwkobikJPSAoCSh1aW50MzIpIChiKVsoaSkJXSA8PCAyNAkpCQlcCisJCXwgKAkodWludDMyKSAoYilbKGkpICsgMV0gPDwgMTYJKQkJXAorCQl8ICgJKHVpbnQzMikgKGIpWyhpKSArIDJdIDw8ICA4CSkJCVwKKwkJfCAoCSh1aW50MzIpIChiKVsoaSkgKyAzXQkJKTsJCVwKK30KKworI2RlZmluZQlQVVRfVUlOVDMyKG4sYixpKQkJCQkJCVwKK3sJCQkJCQkJCQkJCQlcCisJKGIpWyhpKQkgICBdID0gKHVpbnQ4KSAoIChuKSA+PgkyNCApOwkJXAorCShiKVsoaSkJKyAxXSA9ICh1aW50OCkgKCAobikgPj4JMTYgKTsJCVwKKwkoYilbKGkpCSsgMl0gPSAodWludDgpICggKG4pID4+CSA4ICk7CQlcCisJKGIpWyhpKQkrIDNdID0gKHVpbnQ4KSAoIChuKQkgICApOwkJXAorfQorCisvKiBBRVMga2V5IHNjaGVkdWxpbmcgcm91dGluZSAqLworCitpbnQJcnRtcF9hZXNfc2V0X2tleSggYWVzX2NvbnRleHQgKmN0eCwgdWludDggKmtleSwgaW50IG5iaXRzICkKK3sKKwlpbnQJaTsKKwl1aW50MzIgKlJLLAkqU0s7CisKKwlzd2l0Y2goCW5iaXRzICkKKwl7CisJCWNhc2UgMTI4OiBjdHgtPm5yID0JMTA7CWJyZWFrOworCQljYXNlIDE5MjogY3R4LT5uciA9CTEyOwlicmVhazsKKwkJY2FzZSAyNTY6IGN0eC0+bnIgPQkxNDsJYnJlYWs7CisJCWRlZmF1bHQJOiByZXR1cm4oIDEJKTsKKwl9CisKKwlSSyA9IGN0eC0+ZXJrOworCisJZm9yKCBpID0gMDsJaSA8CShuYml0cyA+PiA1KTsgaSsrICkKKwl7CisJCUdFVF9VSU5UMzIoCVJLW2ldLCBrZXksCWkgKgk0ICk7CisJfQorCisJLyogc2V0dXAgZW5jcnlwdGlvbglyb3VuZCBrZXlzICovCisKKwlzd2l0Y2goCW5iaXRzICkKKwl7CisJY2FzZSAxMjg6CisKKwkJZm9yKCBpID0gMDsJaSA8CTEwOwlpKyssIFJLCSs9IDQgKQorCQl7CisJCQlSS1s0XSAgPSBSS1swXSBeIFJDT05baV0gXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1szXSA+PiAxNiApIF0gPDwJMjQgKSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzNdID4+ICA4ICkgXSA8PAkxNiApIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbM10JCSApIF0gPDwJIDggKSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzNdID4+IDI0ICkgXQkgICApOworCisJCQlSS1s1XSAgPSBSS1sxXSBeIFJLWzRdOworCQkJUktbNl0gID0gUktbMl0gXiBSS1s1XTsKKwkJCVJLWzddICA9IFJLWzNdIF4gUktbNl07CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDE5MjoKKworCQlmb3IoIGkgPSAwOwlpIDwJODsgaSsrLAlSSyArPSA2CSkKKwkJeworCQkJUktbNl0gID0gUktbMF0gXiBSQ09OW2ldIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbNV0gPj4gMTYgKSBdIDw8CTI0ICkgXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s1XSA+PiAgOCApIF0gPDwJMTYgKSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzVdCQkgKSBdIDw8CSA4ICkgXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s1XSA+PiAyNCApIF0JICAgKTsKKworCQkJUktbN10gID0gUktbMV0gXiBSS1s2XTsKKwkJCVJLWzhdICA9IFJLWzJdIF4gUktbN107CisJCQlSS1s5XSAgPSBSS1szXSBeIFJLWzhdOworCQkJUktbMTBdID0gUktbNF0gXiBSS1s5XTsKKwkJCVJLWzExXSA9IFJLWzVdIF4gUktbMTBdOworCQl9CisJCWJyZWFrOworCisJY2FzZSAyNTY6CisKKwkJZm9yKCBpID0gMDsJaSA8CTc7IGkrKywJUksgKz0gOAkpCisJCXsKKwkJCVJLWzhdICA9IFJLWzBdIF4gUkNPTltpXSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzddID4+IDE2ICkgXSA8PAkyNCApIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbN10gPj4gIDggKSBdIDw8CTE2ICkgXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s3XQkJICkgXSA8PAkgOCApIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbN10gPj4gMjQgKSBdCSAgICk7CisKKwkJCVJLWzldICA9IFJLWzFdIF4gUktbOF07CisJCQlSS1sxMF0gPSBSS1syXSBeIFJLWzldOworCQkJUktbMTFdID0gUktbM10gXiBSS1sxMF07CisKKwkJCVJLWzEyXSA9IFJLWzRdIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbMTFdCT4+IDI0ICkJXSA8PCAyNAkpIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbMTFdCT4+IDE2ICkJXSA8PCAxNgkpIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbMTFdCT4+CTggKQldIDw8ICA4CSkgXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1sxMV0JCSAgKQldCQkpOworCisJCQlSS1sxM10gPSBSS1s1XSBeIFJLWzEyXTsKKwkJCVJLWzE0XSA9IFJLWzZdIF4gUktbMTNdOworCQkJUktbMTVdID0gUktbN10gXiBSS1sxNF07CisJCX0KKwkJYnJlYWs7CisJfQorCisJLyogc2V0dXAgZGVjcnlwdGlvbglyb3VuZCBrZXlzICovCisKKwlpZigJS1RfaW5pdAkpCisJeworCQlmb3IoIGkgPSAwOwlpIDwJMjU2OyBpKysgKQorCQl7CisJCQlLVDBbaV0gPSBSVDBbIEZTYltpXSBdOworCQkJS1QxW2ldID0gUlQxWyBGU2JbaV0gXTsKKwkJCUtUMltpXSA9IFJUMlsgRlNiW2ldIF07CisJCQlLVDNbaV0gPSBSVDNbIEZTYltpXSBdOworCQl9CisKKwkJS1RfaW5pdAk9IDA7CisJfQorCisJU0sgPSBjdHgtPmRyazsKKworCSpTSysrID0JKlJLKys7CisJKlNLKysgPQkqUksrKzsKKwkqU0srKyA9CSpSSysrOworCSpTSysrID0JKlJLKys7CisKKwlmb3IoIGkgPSAxOwlpIDwJY3R4LT5ucjsgaSsrICkKKwl7CisJCVJLIC09IDg7CisKKwkJKlNLKysgPQlLVDBbICh1aW50OCkgKCAqUksgPj4gMjQgKSBdIF4KKwkJCQlLVDFbICh1aW50OCkgKCAqUksgPj4gMTYgKSBdIF4KKwkJCQlLVDJbICh1aW50OCkgKCAqUksgPj4gIDggKSBdIF4KKwkJCQlLVDNbICh1aW50OCkgKCAqUksJCSApIF07IFJLKys7CisKKwkJKlNLKysgPQlLVDBbICh1aW50OCkgKCAqUksgPj4gMjQgKSBdIF4KKwkJCQlLVDFbICh1aW50OCkgKCAqUksgPj4gMTYgKSBdIF4KKwkJCQlLVDJbICh1aW50OCkgKCAqUksgPj4gIDggKSBdIF4KKwkJCQlLVDNbICh1aW50OCkgKCAqUksJCSApIF07IFJLKys7CisKKwkJKlNLKysgPQlLVDBbICh1aW50OCkgKCAqUksgPj4gMjQgKSBdIF4KKwkJCQlLVDFbICh1aW50OCkgKCAqUksgPj4gMTYgKSBdIF4KKwkJCQlLVDJbICh1aW50OCkgKCAqUksgPj4gIDggKSBdIF4KKwkJCQlLVDNbICh1aW50OCkgKCAqUksJCSApIF07IFJLKys7CisKKwkJKlNLKysgPQlLVDBbICh1aW50OCkgKCAqUksgPj4gMjQgKSBdIF4KKwkJCQlLVDFbICh1aW50OCkgKCAqUksgPj4gMTYgKSBdIF4KKwkJCQlLVDJbICh1aW50OCkgKCAqUksgPj4gIDggKSBdIF4KKwkJCQlLVDNbICh1aW50OCkgKCAqUksJCSApIF07IFJLKys7CisJfQorCisJUksgLT0gODsKKworCSpTSysrID0JKlJLKys7CisJKlNLKysgPQkqUksrKzsKKwkqU0srKyA9CSpSSysrOworCSpTSysrID0JKlJLKys7CisKKwlyZXR1cm4oCTAgKTsKK30KKworLyogQUVTIDEyOC1iaXQgYmxvY2sgZW5jcnlwdGlvbglyb3V0aW5lCSovCisKK3ZvaWQgcnRtcF9hZXNfZW5jcnlwdChhZXNfY29udGV4dCAqY3R4LCB1aW50OCBpbnB1dFsxNl0sCXVpbnQ4IG91dHB1dFsxNl0gKQoreworCXVpbnQzMiAqUkssCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMzsKKworCVJLID0gY3R4LT5lcms7CisJR0VUX1VJTlQzMigJWDAsCWlucHV0LAkwICk7IFgwCV49IFJLWzBdOworCUdFVF9VSU5UMzIoCVgxLAlpbnB1dCwJNCApOyBYMQlePSBSS1sxXTsKKwlHRVRfVUlOVDMyKAlYMiwJaW5wdXQsCTggKTsgWDIJXj0gUktbMl07CisJR0VUX1VJTlQzMigJWDMsCWlucHV0LCAxMiApOyBYMwlePSBSS1szXTsKKworI2RlZmluZQlBRVNfRlJPVU5EKFgwLFgxLFgyLFgzLFkwLFkxLFkyLFkzKQkJXAorewkJCQkJCQkJCQkJCVwKKwlSSyArPSA0OwkJCQkJCQkJCVwKKwkJCQkJCQkJCQkJCVwKKwlYMCA9IFJLWzBdIF4gRlQwWyAodWludDgpICgJWTAgPj4gMjQgKSBdIF4JXAorCQkJCSBGVDFbICh1aW50OCkgKAlZMSA+PiAxNiApIF0gXglcCisJCQkJIEZUMlsgKHVpbnQ4KSAoCVkyID4+ICA4ICkgXSBeCVwKKwkJCQkgRlQzWyAodWludDgpICgJWTMJCSApIF07CVwKKwkJCQkJCQkJCQkJCVwKKwlYMSA9IFJLWzFdIF4gRlQwWyAodWludDgpICgJWTEgPj4gMjQgKSBdIF4JXAorCQkJCSBGVDFbICh1aW50OCkgKAlZMiA+PiAxNiApIF0gXglcCisJCQkJIEZUMlsgKHVpbnQ4KSAoCVkzID4+ICA4ICkgXSBeCVwKKwkJCQkgRlQzWyAodWludDgpICgJWTAJCSApIF07CVwKKwkJCQkJCQkJCQkJCVwKKwlYMiA9IFJLWzJdIF4gRlQwWyAodWludDgpICgJWTIgPj4gMjQgKSBdIF4JXAorCQkJCSBGVDFbICh1aW50OCkgKAlZMyA+PiAxNiApIF0gXglcCisJCQkJIEZUMlsgKHVpbnQ4KSAoCVkwID4+ICA4ICkgXSBeCVwKKwkJCQkgRlQzWyAodWludDgpICgJWTEJCSApIF07CVwKKwkJCQkJCQkJCQkJCVwKKwlYMyA9IFJLWzNdIF4gRlQwWyAodWludDgpICgJWTMgPj4gMjQgKSBdIF4JXAorCQkJCSBGVDFbICh1aW50OCkgKAlZMCA+PiAxNiApIF0gXglcCisJCQkJIEZUMlsgKHVpbnQ4KSAoCVkxID4+ICA4ICkgXSBeCVwKKwkJCQkgRlQzWyAodWludDgpICgJWTIJCSApIF07CVwKK30KKworCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgMSAqLworCUFFU19GUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkJLyogcm91bmQgMiAqLworCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgMyAqLworCUFFU19GUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkJLyogcm91bmQgNCAqLworCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgNSAqLworCUFFU19GUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkJLyogcm91bmQgNiAqLworCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgNyAqLworCUFFU19GUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkJLyogcm91bmQgOCAqLworCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgOSAqLworCisJaWYoCWN0eC0+bnIJPiAxMCApCisJeworCQlBRVNfRlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJLyogcm91bmQgMTAJKi8KKwkJQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CS8qIHJvdW5kIDExCSovCisJfQorCisJaWYoCWN0eC0+bnIJPiAxMiApCisJeworCQlBRVNfRlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJLyogcm91bmQgMTIJKi8KKwkJQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CS8qIHJvdW5kIDEzCSovCisJfQorCisJLyogbGFzdAlyb3VuZCAqLworCisJUksgKz0gNDsKKworCVgwID0gUktbMF0gXiAoIEZTYlsJKHVpbnQ4KQkoIFkwID4+CTI0ICkgXSA8PCAyNCApIF4KKwkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMSA+PgkxNiApIF0gPDwgMTYgKSBeCisJCQkJICggRlNiWwkodWludDgpCSggWTIgPj4JIDggKSBdIDw8ICA4ICkgXgorCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkzCSAgICkgXQkJICk7CisKKwlYMSA9IFJLWzFdIF4gKCBGU2JbCSh1aW50OCkJKCBZMSA+PgkyNCApIF0gPDwgMjQgKSBeCisJCQkJICggRlNiWwkodWludDgpCSggWTIgPj4JMTYgKSBdIDw8IDE2ICkgXgorCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkzID4+CSA4ICkgXSA8PCAgOCApIF4KKwkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMAkgICApIF0JCSApOworCisJWDIgPSBSS1syXSBeICggRlNiWwkodWludDgpCSggWTIgPj4JMjQgKSBdIDw8IDI0ICkgXgorCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkzID4+CTE2ICkgXSA8PCAxNiApIF4KKwkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMCA+PgkgOCApIF0gPDwgIDggKSBeCisJCQkJICggRlNiWwkodWludDgpCSggWTEJICAgKSBdCQkgKTsKKworCVgzID0gUktbM10gXiAoIEZTYlsJKHVpbnQ4KQkoIFkzID4+CTI0ICkgXSA8PCAyNCApIF4KKwkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMCA+PgkxNiApIF0gPDwgMTYgKSBeCisJCQkJICggRlNiWwkodWludDgpCSggWTEgPj4JIDggKSBdIDw8ICA4ICkgXgorCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkyCSAgICkgXQkJICk7CisKKwlQVVRfVUlOVDMyKAlYMCwJb3V0cHV0LAkgMCApOworCVBVVF9VSU5UMzIoCVgxLAlvdXRwdXQsCSA0ICk7CisJUFVUX1VJTlQzMigJWDIsCW91dHB1dCwJIDggKTsKKwlQVVRfVUlOVDMyKAlYMywJb3V0cHV0LAkxMiApOworfQorCisvKiBBRVMgMTI4LWJpdCBibG9jayBkZWNyeXB0aW9uCXJvdXRpbmUJKi8KKwordm9pZCBydG1wX2Flc19kZWNyeXB0KCBhZXNfY29udGV4dCAqY3R4LAl1aW50OCBpbnB1dFsxNl0sIHVpbnQ4IG91dHB1dFsxNl0gKQoreworCXVpbnQzMiAqUkssCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMzsKKworCVJLID0gY3R4LT5kcms7CisKKwlHRVRfVUlOVDMyKAlYMCwJaW5wdXQsCTAgKTsgWDAJXj0gUktbMF07CisJR0VUX1VJTlQzMigJWDEsCWlucHV0LAk0ICk7IFgxCV49IFJLWzFdOworCUdFVF9VSU5UMzIoCVgyLAlpbnB1dCwJOCApOyBYMglePSBSS1syXTsKKwlHRVRfVUlOVDMyKAlYMywJaW5wdXQsIDEyICk7IFgzCV49IFJLWzNdOworCisjZGVmaW5lCUFFU19SUk9VTkQoWDAsWDEsWDIsWDMsWTAsWTEsWTIsWTMpCQlcCit7CQkJCQkJCQkJCQkJXAorCVJLICs9IDQ7CQkJCQkJCQkJXAorCQkJCQkJCQkJCQkJXAorCVgwID0gUktbMF0gXiBSVDBbICh1aW50OCkgKAlZMCA+PiAyNCApIF0gXglcCisJCQkJIFJUMVsgKHVpbnQ4KSAoCVkzID4+IDE2ICkgXSBeCVwKKwkJCQkgUlQyWyAodWludDgpICgJWTIgPj4gIDggKSBdIF4JXAorCQkJCSBSVDNbICh1aW50OCkgKAlZMQkJICkgXTsJXAorCQkJCQkJCQkJCQkJXAorCVgxID0gUktbMV0gXiBSVDBbICh1aW50OCkgKAlZMSA+PiAyNCApIF0gXglcCisJCQkJIFJUMVsgKHVpbnQ4KSAoCVkwID4+IDE2ICkgXSBeCVwKKwkJCQkgUlQyWyAodWludDgpICgJWTMgPj4gIDggKSBdIF4JXAorCQkJCSBSVDNbICh1aW50OCkgKAlZMgkJICkgXTsJXAorCQkJCQkJCQkJCQkJXAorCVgyID0gUktbMl0gXiBSVDBbICh1aW50OCkgKAlZMiA+PiAyNCApIF0gXglcCisJCQkJIFJUMVsgKHVpbnQ4KSAoCVkxID4+IDE2ICkgXSBeCVwKKwkJCQkgUlQyWyAodWludDgpICgJWTAgPj4gIDggKSBdIF4JXAorCQkJCSBSVDNbICh1aW50OCkgKAlZMwkJICkgXTsJXAorCQkJCQkJCQkJCQkJXAorCVgzID0gUktbM10gXiBSVDBbICh1aW50OCkgKAlZMyA+PiAyNCApIF0gXglcCisJCQkJIFJUMVsgKHVpbnQ4KSAoCVkyID4+IDE2ICkgXSBeCVwKKwkJCQkgUlQyWyAodWludDgpICgJWTEgPj4gIDggKSBdIF4JXAorCQkJCSBSVDNbICh1aW50OCkgKAlZMAkJICkgXTsJXAorfQorCisJQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCAxICovCisJQUVTX1JST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCAyICovCisJQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCAzICovCisJQUVTX1JST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCA0ICovCisJQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCA1ICovCisJQUVTX1JST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCA2ICovCisJQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCA3ICovCisJQUVTX1JST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCA4ICovCisJQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCA5ICovCisKKwlpZigJY3R4LT5ucgk+IDEwICkKKwl7CisJCUFFU19SUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkvKiByb3VuZCAxMAkqLworCQlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJLyogcm91bmQgMTEJKi8KKwl9CisKKwlpZigJY3R4LT5ucgk+IDEyICkKKwl7CisJCUFFU19SUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkvKiByb3VuZCAxMgkqLworCQlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJLyogcm91bmQgMTMJKi8KKwl9CisKKwkvKiBsYXN0CXJvdW5kICovCisKKwlSSyArPSA0OworCisJWDAgPSBSS1swXSBeICggUlNiWwkodWludDgpCSggWTAgPj4JMjQgKSBdIDw8IDI0ICkgXgorCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkzID4+CTE2ICkgXSA8PCAxNiApIF4KKwkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMiA+PgkgOCApIF0gPDwgIDggKSBeCisJCQkJICggUlNiWwkodWludDgpCSggWTEJICAgKSBdCQkgKTsKKworCVgxID0gUktbMV0gXiAoIFJTYlsJKHVpbnQ4KQkoIFkxID4+CTI0ICkgXSA8PCAyNCApIF4KKwkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMCA+PgkxNiApIF0gPDwgMTYgKSBeCisJCQkJICggUlNiWwkodWludDgpCSggWTMgPj4JIDggKSBdIDw8ICA4ICkgXgorCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkyCSAgICkgXQkJICk7CisKKwlYMiA9IFJLWzJdIF4gKCBSU2JbCSh1aW50OCkJKCBZMiA+PgkyNCApIF0gPDwgMjQgKSBeCisJCQkJICggUlNiWwkodWludDgpCSggWTEgPj4JMTYgKSBdIDw8IDE2ICkgXgorCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkwID4+CSA4ICkgXSA8PCAgOCApIF4KKwkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMwkgICApIF0JCSApOworCisJWDMgPSBSS1szXSBeICggUlNiWwkodWludDgpCSggWTMgPj4JMjQgKSBdIDw8IDI0ICkgXgorCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkyID4+CTE2ICkgXSA8PCAxNiApIF4KKwkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMSA+PgkgOCApIF0gPDwgIDggKSBeCisJCQkJICggUlNiWwkodWludDgpCSggWTAJICAgKSBdCQkgKTsKKworCVBVVF9VSU5UMzIoCVgwLAlvdXRwdXQsCSAwICk7CisJUFVUX1VJTlQzMigJWDEsCW91dHB1dCwJIDQgKTsKKwlQVVRfVUlOVDMyKAlYMiwJb3V0cHV0LAkgOCApOworCVBVVF9VSU5UMzIoCVgzLAlvdXRwdXQsCTEyICk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlTSEExIGZ1bmN0aW9uCisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlITUFDX1NIQTEoCisJSU4JVUNIQVIJKnRleHQsCisJSU4JVUlOVAl0ZXh0X2xlbiwKKwlJTglVQ0hBUgkqa2V5LAorCUlOCVVJTlQJa2V5X2xlbiwKKwlJTglVQ0hBUgkqZGlnZXN0KQoreworCVNIQV9DVFgJY29udGV4dDsKKwlVQ0hBUglrX2lwYWRbNjVdOyAvKiBpbm5lciBwYWRkaW5nIC0ga2V5IFhPUmQgd2l0aCBpcGFkCSovCisJVUNIQVIJa19vcGFkWzY1XTsgLyogb3V0ZXIgcGFkZGluZyAtIGtleSBYT1JkIHdpdGggb3BhZAkqLworCUlOVAkJaTsKKworCS8vIGlmIGtleSBpcyBsb25nZXIJdGhhbiA2NAlieXRlcyByZXNldAlpdCB0byBrZXk9U0hBMShrZXkpCisJaWYgKGtleV9sZW4JPiA2NCkKKwl7CisJCVNIQV9DVFgJCSB0Y3R4OworCQlTSEFJbml0KCZ0Y3R4KTsKKwkJU0hBVXBkYXRlKCZ0Y3R4LCBrZXksIGtleV9sZW4pOworCQlTSEFGaW5hbCgmdGN0eCwJa2V5KTsKKwkJa2V5X2xlbgk9IDIwOworCX0KKwlOZGlzWmVyb01lbW9yeShrX2lwYWQsIHNpemVvZihrX2lwYWQpKTsKKwlOZGlzWmVyb01lbW9yeShrX29wYWQsIHNpemVvZihrX29wYWQpKTsKKwlOZGlzTW92ZU1lbW9yeShrX2lwYWQsIGtleSwJa2V5X2xlbik7CisJTmRpc01vdmVNZW1vcnkoa19vcGFkLCBrZXksCWtleV9sZW4pOworCisJLy8gWE9SIGtleSB3aXRoCWlwYWQgYW5kIG9wYWQgdmFsdWVzCisJZm9yCShpID0gMDsJaSA8CTY0OwlpKyspCisJeworCQlrX2lwYWRbaV0gXj0gMHgzNjsKKwkJa19vcGFkW2ldIF49IDB4NWM7CisJfQorCisJLy8gcGVyZm9ybSBpbm5lciBTSEExCisJU0hBSW5pdCgmY29udGV4dCk7IAkJCQkJCS8qIGluaXQgY29udGV4dCBmb3IgMXN0IHBhc3MgKi8KKwlTSEFVcGRhdGUoJmNvbnRleHQsCWtfaXBhZCwJNjQpOwkJLyoJc3RhcnQgd2l0aCBpbm5lciBwYWQgKi8KKwlTSEFVcGRhdGUoJmNvbnRleHQsCXRleHQsIHRleHRfbGVuKTsJLyoJdGhlbiB0ZXh0IG9mIGRhdGFncmFtICovCisJU0hBRmluYWwoJmNvbnRleHQsIGRpZ2VzdCk7CQkJCS8qIGZpbmlzaCB1cCAxc3QgcGFzcyAqLworCisJLy9wZXJmb3JtIG91dGVyCVNIQTEKKwlTSEFJbml0KCZjb250ZXh0KTsJCQkJCS8qIGluaXQgY29udGV4dCBmb3IgMm5kIHBhc3MgKi8KKwlTSEFVcGRhdGUoJmNvbnRleHQsCWtfb3BhZCwJNjQpOwkvKglzdGFydCB3aXRoIG91dGVyIHBhZCAqLworCVNIQVVwZGF0ZSgmY29udGV4dCwJZGlnZXN0LAkyMCk7CS8qCXRoZW4gcmVzdWx0cyBvZgkxc3QJaGFzaCAqLworCVNIQUZpbmFsKCZjb250ZXh0LCBkaWdlc3QpOwkJCS8qIGZpbmlzaCB1cCAybmQgcGFzcyAqLworCit9CisKKy8qCisqIEYoUCwgUywgYywgaSkgPSBVMSB4b3IgVTIgeG9yIC4uLiBVYworKiBVMSA9IFBSRihQLCBTIHx8IEludChpKSkKKyogVTIgPSBQUkYoUCwgVTEpCisqIFVjID0gUFJGKFAsIFVjLTEpCisqLworCit2b2lkIEYoY2hhciAqcGFzc3dvcmQsIHVuc2lnbmVkIGNoYXIgKnNzaWQsIGludCBzc2lkbGVuZ3RoLCBpbnQgaXRlcmF0aW9ucywgaW50IGNvdW50LCB1bnNpZ25lZCBjaGFyICpvdXRwdXQpCit7CisgICAgdW5zaWduZWQgY2hhciBkaWdlc3RbMzZdLCBkaWdlc3QxW1NIQV9ESUdFU1RfTEVOXTsKKyAgICBpbnQgaSwgajsKKworICAgIC8qIFUxID0gUFJGKFAsIFMgfHwgaW50KGkpKSAqLworICAgIG1lbWNweShkaWdlc3QsIHNzaWQsIHNzaWRsZW5ndGgpOworICAgIGRpZ2VzdFtzc2lkbGVuZ3RoXSA9ICh1bnNpZ25lZCBjaGFyKSgoY291bnQ+PjI0KSAmIDB4ZmYpOworICAgIGRpZ2VzdFtzc2lkbGVuZ3RoKzFdID0gKHVuc2lnbmVkIGNoYXIpKChjb3VudD4+MTYpICYgMHhmZik7CisgICAgZGlnZXN0W3NzaWRsZW5ndGgrMl0gPSAodW5zaWduZWQgY2hhcikoKGNvdW50Pj44KSAmIDB4ZmYpOworICAgIGRpZ2VzdFtzc2lkbGVuZ3RoKzNdID0gKHVuc2lnbmVkIGNoYXIpKGNvdW50ICYgMHhmZik7CisgICAgSE1BQ19TSEExKGRpZ2VzdCwgc3NpZGxlbmd0aCs0LCAodW5zaWduZWQgY2hhciopIHBhc3N3b3JkLCAoaW50KSBzdHJsZW4ocGFzc3dvcmQpLCBkaWdlc3QxKTsgLy8gZm9yIFdQQSB1cGRhdGUKKworICAgIC8qIG91dHB1dCA9IFUxICovCisgICAgbWVtY3B5KG91dHB1dCwgZGlnZXN0MSwgU0hBX0RJR0VTVF9MRU4pOworCisgICAgZm9yIChpID0gMTsgaSA8IGl0ZXJhdGlvbnM7IGkrKykKKyAgICB7CisgICAgICAgIC8qIFVuID0gUFJGKFAsIFVuLTEpICovCisgICAgICAgIEhNQUNfU0hBMShkaWdlc3QxLCBTSEFfRElHRVNUX0xFTiwgKHVuc2lnbmVkIGNoYXIqKSBwYXNzd29yZCwgKGludCkgc3RybGVuKHBhc3N3b3JkKSwgZGlnZXN0KTsgLy8gZm9yIFdQQSB1cGRhdGUKKyAgICAgICAgbWVtY3B5KGRpZ2VzdDEsIGRpZ2VzdCwgU0hBX0RJR0VTVF9MRU4pOworCisgICAgICAgIC8qIG91dHB1dCA9IG91dHB1dCB4b3IgVW4gKi8KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IFNIQV9ESUdFU1RfTEVOOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dHB1dFtqXSBePSBkaWdlc3Rbal07CisgICAgICAgIH0KKyAgICB9Cit9CisvKgorKiBwYXNzd29yZCAtIGFzY2lpIHN0cmluZyB1cCB0byA2MyBjaGFyYWN0ZXJzIGluIGxlbmd0aAorKiBzc2lkIC0gb2N0ZXQgc3RyaW5nIHVwIHRvIDMyIG9jdGV0cworKiBzc2lkbGVuZ3RoIC0gbGVuZ3RoIG9mIHNzaWQgaW4gb2N0ZXRzCisqIG91dHB1dCBtdXN0IGJlIDQwIG9jdGV0cyBpbiBsZW5ndGggYW5kIG91dHB1dHMgMjU2IGJpdHMgb2Yga2V5CisqLworaW50IFBhc3N3b3JkSGFzaChjaGFyICpwYXNzd29yZCwgdW5zaWduZWQgY2hhciAqc3NpZCwgaW50IHNzaWRsZW5ndGgsIHVuc2lnbmVkIGNoYXIgKm91dHB1dCkKK3sKKyAgICBpZiAoKHN0cmxlbihwYXNzd29yZCkgPiA2MykgfHwgKHNzaWRsZW5ndGggPiAzMikpCisgICAgICAgIHJldHVybiAwOworCisgICAgRihwYXNzd29yZCwgc3NpZCwgc3NpZGxlbmd0aCwgNDA5NiwgMSwgb3V0cHV0KTsKKyAgICBGKHBhc3N3b3JkLCBzc2lkLCBzc2lkbGVuZ3RoLCA0MDk2LCAyLCAmb3V0cHV0W1NIQV9ESUdFU1RfTEVOXSk7CisgICAgcmV0dXJuIDE7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vbWxtZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vbWxtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyOTc0NzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9tbG1lLmMKQEAgLTAsMCArMSw4NjY3IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCW1sbWUuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUpvaG4gQ2hhbmcJMjAwNC0wOC0yNQkJTW9kaWZ5IGZyb20gUlQyNTAwIGNvZGUgYmFzZQorCUpvaG4gQ2hhbmcJMjAwNC0wOS0wNgkJbW9kaWZpZWQgZm9yIFJUMjYwMAorKi8KKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCitVQ0hBUglDSVNDT19PVUlbXSA9IHsweDAwLCAweDQwLCAweDk2fTsKKworVUNIQVIJV1BBX09VSVtdID0gezB4MDAsIDB4NTAsIDB4ZjIsIDB4MDF9OworVUNIQVIJUlNOX09VSVtdID0gezB4MDAsIDB4MGYsIDB4YWN9OworVUNIQVIJV0FQSV9PVUlbXSA9IHsweDAwLCAweDE0LCAweDcyfTsKK1VDSEFSICAgV01FX0lORk9fRUxFTVtdICA9IHsweDAwLCAweDUwLCAweGYyLCAweDAyLCAweDAwLCAweDAxfTsKK1VDSEFSICAgV01FX1BBUk1fRUxFTVtdID0gezB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsIDB4MDEsIDB4MDF9OworVUNIQVIJQ2N4MlFvc0luZm9bXSA9IHsweDAwLCAweDQwLCAweDk2LCAweDA0fTsKK1VDSEFSICAgUkFMSU5LX09VSVtdICA9IHsweDAwLCAweDBjLCAweDQzfTsKK1VDSEFSICAgQlJPQURDT01fT1VJW10gID0gezB4MDAsIDB4OTAsIDB4NGN9OworVUNIQVIgICBXUFNfT1VJW10gPSB7MHgwMCwgMHg1MCwgMHhmMiwgMHgwNH07CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitVQ0hBUglQUkVfTl9IVF9PVUlbXQk9IHsweDAwLCAweDkwLCAweDRjfTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlW10gPSB7CisvLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCisgICAgMHgxMSwgMHgwMCwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgorICAgIDB4MDAsIDB4MDAsICAwLCA0MCwgMTAxLAorICAgIDB4MDEsIDB4MDAsICAxLCA0MCwgNTAsCisgICAgMHgwMiwgMHgwMCwgIDIsIDM1LCA0NSwKKyAgICAweDAzLCAweDAwLCAgMywgMjAsIDQ1LAorICAgIDB4MDQsIDB4MjEsICAwLCAzMCwgNTAsCisgICAgMHgwNSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDA2LCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDcsIDB4MjEsICAzLCAxNSwgNTAsCisgICAgMHgwOCwgMHgyMSwgIDQsIDE1LCAzMCwKKyAgICAweDA5LCAweDIxLCAgNSwgMTAsIDI1LAorICAgIDB4MGEsIDB4MjEsICA2LCAgOCwgMjUsCisgICAgMHgwYiwgMHgyMSwgIDcsICA4LCAyNSwKKyAgICAweDBjLCAweDIwLCAxMiwgIDE1LCAzMCwKKyAgICAweDBkLCAweDIwLCAxMywgIDgsIDIwLAorICAgIDB4MGUsIDB4MjAsIDE0LCAgOCwgMjAsCisgICAgMHgwZiwgMHgyMCwgMTUsICA4LCAyNSwKKyAgICAweDEwLCAweDIyLCAxNSwgIDgsIDI1LAorICAgIDB4MTEsIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxMiwgMHgwMCwgIDAsICAwLCAgMCwKKyAgICAweDEzLCAweDAwLCAgMCwgIDAsICAwLAorICAgIDB4MTQsIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxNSwgMHgwMCwgIDAsICAwLCAgMCwKKyAgICAweDE2LCAweDAwLCAgMCwgIDAsICAwLAorICAgIDB4MTcsIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxOCwgMHgwMCwgIDAsICAwLCAgMCwKKyAgICAweDE5LCAweDAwLCAgMCwgIDAsICAwLAorICAgIDB4MWEsIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxYiwgMHgwMCwgIDAsICAwLCAgMCwKKyAgICAweDFjLCAweDAwLCAgMCwgIDAsICAwLAorICAgIDB4MWQsIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxZSwgMHgwMCwgIDAsICAwLCAgMCwKKyAgICAweDFmLCAweDAwLCAgMCwgIDAsICAwLAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCW10gPSB7CisvLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCisgICAgMHgwNCwgMHgwMywgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgorICAgIDB4MDAsIDB4MDAsICAwLCA0MCwgMTAxLAorICAgIDB4MDEsIDB4MDAsICAxLCA0MCwgNTAsCisgICAgMHgwMiwgMHgwMCwgIDIsIDM1LCA0NSwKKyAgICAweDAzLCAweDAwLCAgMywgMjAsIDQ1LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR1tdID0geworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MGEsIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDAwLCAgMCwgNDAsIDEwMSwKKyAgICAweDAxLCAweDAwLCAgMSwgNDAsIDUwLAorICAgIDB4MDIsIDB4MDAsICAyLCAzNSwgNDUsCisgICAgMHgwMywgMHgwMCwgIDMsIDIwLCA0NSwKKyAgICAweDA0LCAweDEwLCAgMiwgMjAsIDM1LAorICAgIDB4MDUsIDB4MTAsICAzLCAxNiwgMzUsCisgICAgMHgwNiwgMHgxMCwgIDQsIDEwLCAyNSwKKyAgICAweDA3LCAweDEwLCAgNSwgMTYsIDI1LAorICAgIDB4MDgsIDB4MTAsICA2LCAxMCwgMjUsCisgICAgMHgwOSwgMHgxMCwgIDcsIDEwLCAxMywKK307CisKK1VDSEFSIFJhdGVTd2l0Y2hUYWJsZTExR1tdID0geworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MDgsIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDEwLCAgMCwgMjAsIDEwMSwKKyAgICAweDAxLCAweDEwLCAgMSwgMjAsIDM1LAorICAgIDB4MDIsIDB4MTAsICAyLCAyMCwgMzUsCisgICAgMHgwMywgMHgxMCwgIDMsIDE2LCAzNSwKKyAgICAweDA0LCAweDEwLCAgNCwgMTAsIDI1LAorICAgIDB4MDUsIDB4MTAsICA1LCAxNiwgMjUsCisgICAgMHgwNiwgMHgxMCwgIDYsIDEwLCAyNSwKKyAgICAweDA3LCAweDEwLCAgNywgMTAsIDEzLAorfTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFOMVNbXSA9IHsKKy8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKKyAgICAweDA5LCAweDAwLCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCisgICAgMHgwMCwgMHgyMSwgIDAsIDMwLCAxMDEsCisgICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCisgICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKKyAgICAweDA1LCAweDIxLCAgNSwgMTAsIDI1LAorICAgIDB4MDYsIDB4MjEsICA2LCAgOCwgMTQsCisgICAgMHgwNywgMHgyMSwgIDcsICA4LCAxNCwKKyAgICAweDA4LCAweDIzLCAgNywgIDgsIDE0LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFOMlNbXSA9IHsKKy8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKKyAgICAweDBhLCAweDAwLCAgMCwgIDAsICAwLCAgICAgIC8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCisgICAgMHgwMCwgMHgyMSwgIDAsIDMwLCAxMDEsCisgICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCisgICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKKyAgICAweDA1LCAweDIwLCAxMiwgIDE1LCAzMCwKKyAgICAweDA2LCAweDIwLCAxMywgIDgsIDIwLAorICAgIDB4MDcsIDB4MjAsIDE0LCAgOCwgMjAsCisgICAgMHgwOCwgMHgyMCwgMTUsICA4LCAyNSwKKyAgICAweDA5LCAweDIyLCAxNSwgIDgsIDI1LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFOM1NbXSA9IHsKKy8vIEl0ZW0gTm8uCU1vZGUJQ3Vyci1NQ1MJVHJhaW5VcAlUcmFpbkRvd24JLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKKyAgICAweDBhLCAweDAwLCAgMCwgIDAsICAwLCAgICAgIC8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCisgICAgMHgwMCwgMHgyMSwgIDAsIDMwLCAxMDEsCisgICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCisgICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKKyAgICAweDA1LCAweDIwLCAxMiwgIDE1LCAzMCwKKyAgICAweDA2LCAweDIwLCAxMywgIDgsIDIwLAorICAgIDB4MDcsIDB4MjAsIDE0LCAgOCwgMjAsCisgICAgMHgwOCwgMHgyMCwgMTUsICA4LCAyNSwKKyAgICAweDA5LCAweDIyLCAxNSwgIDgsIDI1LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZFtdID0geworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MGIsIDB4MDksICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDIxLCAgMCwgMzAsIDEwMSwKKyAgICAweDAxLCAweDIxLCAgMSwgMjAsIDUwLAorICAgIDB4MDIsIDB4MjEsICAyLCAyMCwgNTAsCisgICAgMHgwMywgMHgyMSwgIDMsIDE1LCA1MCwKKyAgICAweDA0LCAweDIxLCAgNCwgMTUsIDMwLAorICAgIDB4MDUsIDB4MjEsICA1LCAxNSwgMzAsCisgICAgMHgwNiwgMHgyMCwgMTIsICAxNSwgMzAsCisgICAgMHgwNywgMHgyMCwgMTMsICA4LCAyMCwKKyAgICAweDA4LCAweDIwLCAxNCwgIDgsIDIwLAorICAgIDB4MDksIDB4MjAsIDE1LCAgOCwgMjUsCisgICAgMHgwYSwgMHgyMiwgMTUsICA4LCAyNSwKK307CisKK1VDSEFSIFJhdGVTd2l0Y2hUYWJsZTExTjNTRm9yQUJhbmRbXSA9IHsgLy8gMyozCisvLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCisgICAgMHgwYiwgMHgwOSwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgorICAgIDB4MDAsIDB4MjEsICAwLCAzMCwgMTAxLAorICAgIDB4MDEsIDB4MjEsICAxLCAyMCwgNTAsCisgICAgMHgwMiwgMHgyMSwgIDIsIDIwLCA1MCwKKyAgICAweDAzLCAweDIxLCAgMywgMTUsIDUwLAorICAgIDB4MDQsIDB4MjEsICA0LCAxNSwgMzAsCisgICAgMHgwNSwgMHgyMSwgIDUsIDE1LCAzMCwKKyAgICAweDA2LCAweDIwLCAxMiwgIDE1LCAzMCwKKyAgICAweDA3LCAweDIwLCAxMywgIDgsIDIwLAorICAgIDB4MDgsIDB4MjAsIDE0LCAgOCwgMjAsCisgICAgMHgwOSwgMHgyMCwgMTUsICA4LCAyNSwKKyAgICAweDBhLCAweDIyLCAxNSwgIDgsIDI1LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR04xU1tdID0geworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MGQsIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDAwLCAgMCwgNDAsIDEwMSwKKyAgICAweDAxLCAweDAwLCAgMSwgNDAsIDUwLAorICAgIDB4MDIsIDB4MDAsICAyLCAzNSwgNDUsCisgICAgMHgwMywgMHgwMCwgIDMsIDIwLCA0NSwKKyAgICAweDA0LCAweDIxLCAgMCwgMzAsMTAxLAkvLzUwCisgICAgMHgwNSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDA2LCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDcsIDB4MjEsICAzLCAxNSwgNTAsCisgICAgMHgwOCwgMHgyMSwgIDQsIDE1LCAzMCwKKyAgICAweDA5LCAweDIxLCAgNSwgMTAsIDI1LAorICAgIDB4MGEsIDB4MjEsICA2LCAgOCwgMTQsCisgICAgMHgwYiwgMHgyMSwgIDcsICA4LCAxNCwKKwkweDBjLCAweDIzLCAgNywgIDgsIDE0LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR04yU1tdID0geworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MGEsIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDIxLCAgMCwgMzAsMTAxLAkvLzUwCisgICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCisgICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKKyAgICAweDA1LCAweDIwLCAxMiwgMTUsIDMwLAorICAgIDB4MDYsIDB4MjAsIDEzLCAgOCwgMjAsCisgICAgMHgwNywgMHgyMCwgMTQsICA4LCAyMCwKKyAgICAweDA4LCAweDIwLCAxNSwgIDgsIDI1LAorICAgIDB4MDksIDB4MjIsIDE1LCAgOCwgMjUsCit9OworCitVQ0hBUiBSYXRlU3dpdGNoVGFibGUxMUJHTjNTW10gPSB7IC8vIDMqMworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MGEsIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDIxLCAgMCwgMzAsMTAxLAkvLzUwCisgICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDMsIDB4MjEsICAzLCAyMCwgNTAsCisgICAgMHgwNCwgMHgyMSwgIDQsIDE1LCA1MCwKKyAgICAweDA1LCAweDIwLCAyMCwgMTUsIDMwLAorICAgIDB4MDYsIDB4MjAsIDIxLCAgOCwgMjAsCisgICAgMHgwNywgMHgyMCwgMjIsICA4LCAyMCwKKyAgICAweDA4LCAweDIwLCAyMywgIDgsIDI1LAorICAgIDB4MDksIDB4MjIsIDIzLCAgOCwgMjUsCit9OworCitVQ0hBUiBSYXRlU3dpdGNoVGFibGUxMUJHTjJTRm9yQUJhbmRbXSA9IHsKKy8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKKyAgICAweDBiLCAweDA5LCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCisgICAgMHgwMCwgMHgyMSwgIDAsIDMwLDEwMSwJLy81MAorICAgIDB4MDEsIDB4MjEsICAxLCAyMCwgNTAsCisgICAgMHgwMiwgMHgyMSwgIDIsIDIwLCA1MCwKKyAgICAweDAzLCAweDIxLCAgMywgMTUsIDUwLAorICAgIDB4MDQsIDB4MjEsICA0LCAxNSwgMzAsCisgICAgMHgwNSwgMHgyMSwgIDUsIDE1LCAzMCwKKyAgICAweDA2LCAweDIwLCAxMiwgMTUsIDMwLAorICAgIDB4MDcsIDB4MjAsIDEzLCAgOCwgMjAsCisgICAgMHgwOCwgMHgyMCwgMTQsICA4LCAyMCwKKyAgICAweDA5LCAweDIwLCAxNSwgIDgsIDI1LAorICAgIDB4MGEsIDB4MjIsIDE1LCAgOCwgMjUsCit9OworCitVQ0hBUiBSYXRlU3dpdGNoVGFibGUxMUJHTjNTRm9yQUJhbmRbXSA9IHsgLy8gMyozCisvLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCisgICAgMHgwYywgMHgwOSwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgorICAgIDB4MDAsIDB4MjEsICAwLCAzMCwxMDEsCS8vNTAKKyAgICAweDAxLCAweDIxLCAgMSwgMjAsIDUwLAorICAgIDB4MDIsIDB4MjEsICAyLCAyMCwgNTAsCisgICAgMHgwMywgMHgyMSwgIDMsIDE1LCA1MCwKKyAgICAweDA0LCAweDIxLCAgNCwgMTUsIDMwLAorICAgIDB4MDUsIDB4MjEsICA1LCAxNSwgMzAsCisgICAgMHgwNiwgMHgyMSwgMTIsIDE1LCAzMCwKKyAgICAweDA3LCAweDIwLCAyMCwgMTUsIDMwLAorICAgIDB4MDgsIDB4MjAsIDIxLCAgOCwgMjAsCisgICAgMHgwOSwgMHgyMCwgMjIsICA4LCAyMCwKKyAgICAweDBhLCAweDIwLCAyMywgIDgsIDI1LAorICAgIDB4MGIsIDB4MjIsIDIzLCAgOCwgMjUsCit9OworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitQVUNIQVIgUmVhc29uU3RyaW5nW10gPSB7CisJLyogMCAgKi8JICJSZXNlcnZlZCIsCisJLyogMSAgKi8JICJVbnNwZWNpZmllZCBSZWFzb24iLAorCS8qIDIgICovCSAiUHJldmlvdXMgQXV0aCBubyBsb25nZXIgdmFsaWQiLAorCS8qIDMgICovCSAiU1RBIGlzIGxlYXZpbmcgLyBoYXMgbGVmdCIsCisJLyogNCAgKi8JICJESVMtQVNTT0MgZHVlIHRvIGluYWN0aXZpdHkiLAorCS8qIDUgICovCSAiQVAgdW5hYmxlIHRvIGhhbmxlIGFsbCBhc3NvY2lhdGlvbnMiLAorCS8qIDYgICovCSAiY2xhc3MgMiBlcnJvciIsCisJLyogNyAgKi8JICJjbGFzcyAzIGVycm9yIiwKKwkvKiA4ICAqLwkgIlNUQSBpcyBsZWF2aW5nIC8gaGFzIGxlZnQiLAorCS8qIDkgICovCSAicmVxdWlyZSBhdXRoIGJlZm9yZSBhc3NvYy9yZS1hc3NvYyIsCisJLyogMTAgKi8JICJSZXNlcnZlZCIsCisJLyogMTEgKi8JICJSZXNlcnZlZCIsCisJLyogMTIgKi8JICJSZXNlcnZlZCIsCisJLyogMTMgKi8JICJpbnZhbGlkIElFIiwKKwkvKiAxNCAqLwkgIk1JQyBlcnJvciIsCisJLyogMTUgKi8JICI0LXdheSBoYW5kc2hha2UgdGltZW91dCIsCisJLyogMTYgKi8JICIyLXdheSAoZ3JvdXAga2V5KSBoYW5kc2hha2UgdGltZW91dCIsCisJLyogMTcgKi8JICI0LXdheSBoYW5kc2hha2UgSUUgZGlmZiBhbW9uZyBBc3Nvc1JlcS9Sc3AvQmVhY29uIiwKKwkvKiAxOCAqLworfTsKKworZXh0ZXJuIFVDSEFSCSBPZmRtUmF0ZVRvUnh3aU1DU1tdOworLy8gc2luY2UgUlQ2MSBoYXMgYmV0dGVyIFJYIHNlbnNpYmlsaXR5LCB3ZSBoYXZlIHRvIGxpbWl0IFRYIEFDSyByYXRlIG5vdCB0byBleGNlZWQgb3VyIG5vcm1hbCBkYXRhIFRYIHJhdGUuCisvLyBvdGhlcndpc2UgdGhlIFdMQU4gcGVlciBtYXkgbm90IGJlIGFibGUgdG8gcmVjZWl2ZSB0aGUgQUNLIHRodXMgZG93bmdyYWRlIGl0cyBkYXRhIFRYIHJhdGUKK1VMT05HIEJhc2ljUmF0ZU1hc2tbMTJdCQkJCT0gezB4ZmZmZmYwMDEgLyogMS1NYnBzICovLCAweGZmZmZmMDAzIC8qIDIgTWJwcyAqLywgMHhmZmZmZjAwNyAvKiA1LjUgKi8sIDB4ZmZmZmYwMGYgLyogMTEgKi8sCisJCQkJCQkJCQkgIDB4ZmZmZmYwMWYgLyogNiAqLwkgLCAweGZmZmZmMDNmIC8qIDkgKi8JICAsIDB4ZmZmZmYwN2YgLyogMTIgKi8gLCAweGZmZmZmMGZmIC8qIDE4ICovLAorCQkJCQkJCQkJICAweGZmZmZmMWZmIC8qIDI0ICovCSAsIDB4ZmZmZmYzZmYgLyogMzYgKi8JICAsIDB4ZmZmZmY3ZmYgLyogNDggKi8gLCAweGZmZmZmZmZmIC8qIDU0ICovfTsKKworVUNIQVIgTVVMVElDQVNUX0FERFJbTUFDX0FERFJfTEVOXSA9IHsweDEsICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKK1VDSEFSIEJST0FEQ0FTVF9BRERSW01BQ19BRERSX0xFTl0gPSB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07CitVQ0hBUiBaRVJPX01BQ19BRERSW01BQ19BRERSX0xFTl0gID0gezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OworCisvLyBlLmcuIFJzc2lTYWZlTGV2ZWxGb3JUeFJhdGVbUkFURV8zNl0iIG1lYW5zIGlmIHRoZSBjdXJyZW50IFJTU0kgaXMgZ3JlYXRlciB0aGFuCisvLwkJdGhpcyB2YWx1ZSwgdGhlbiBpdCdzIHF1YXJhbnRlZWQgY2FwYWJsZSBvZiBvcGVyYXRpbmcgaW4gMzYgbWJwcyBUWCByYXRlIGluCisvLwkJY2xlYW4gZW52aXJvbm1lbnQuCisvLwkJCQkJCQkJICBUeFJhdGU6IDEgICAyICAgNS41CTExCSA2CSAgOSAgICAxMgkxOAkgMjQgICAzNiAgIDQ4CTU0CSA3MiAgMTAwCitDSEFSIFJzc2lTYWZlTGV2ZWxGb3JUeFJhdGVbXSA9eyAgLTkyLCAtOTEsIC05MCwgLTg3LCAtODgsIC04NiwgLTg1LCAtODMsIC04MSwgLTc4LCAtNzIsIC03MSwgLTQwLCAtNDAgfTsKKworVUNIQVIgIFJhdGVJZFRvTWJwc1tdCSA9IHsgMSwgMiwgNSwgMTEsIDYsIDksIDEyLCAxOCwgMjQsIDM2LCA0OCwgNTQsIDcyLCAxMDB9OworVVNIT1JUIFJhdGVJZFRvNTAwS2Jwc1tdID0geyAyLCA0LCAxMSwgMjIsIDEyLCAxOCwgMjQsIDM2LCA0OCwgNzIsIDk2LCAxMDgsIDE0NCwgMjAwfTsKKworVUNIQVIgIFNzaWRJZQkgPSBJRV9TU0lEOworVUNIQVIgIFN1cFJhdGVJZSA9IElFX1NVUFBfUkFURVM7CitVQ0hBUiAgRXh0UmF0ZUllID0gSUVfRVhUX1NVUFBfUkFURVM7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitVQ0hBUiAgSHRDYXBJZSA9IElFX0hUX0NBUDsKK1VDSEFSICBBZGRIdEluZm9JZSA9IElFX0FERF9IVDsKK1VDSEFSICBOZXdFeHRDaGFuSWUgPSBJRV9TRUNPTkRBUllfQ0hfT0ZGU0VUOworI2lmZGVmIERPVDExTl9EUkFGVDMKK1VDSEFSICBFeHRIdENhcEllID0gSUVfRVhUX0NBUEFCSUxJVFk7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworVUNIQVIgIEVycEllCSA9IElFX0VSUDsKK1VDSEFSICBEc0llIAkgPSBJRV9EU19QQVJNOworVUNIQVIgIFRpbUllCSA9IElFX1RJTTsKK1VDSEFSICBXcGFJZQkgPSBJRV9XUEE7CitVQ0hBUiAgV3BhMkllCSA9IElFX1dQQTI7CitVQ0hBUiAgSWJzc0llCSA9IElFX0lCU1NfUEFSTTsKK1VDSEFSICBDY3gySWUJID0gSUVfQ0NYX1YyOworCitleHRlcm4gVUNIQVIJV1BBX09VSVtdOworCitVQ0hBUglTRVNfT1VJW10gPSB7MHgwMCwgMHg5MCwgMHg0Y307CisKK1VDSEFSCVplcm9Tc2lkWzMyXSA9IHsweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9OworCisvLyBSZXNldCB0aGUgUkZJQyBzZXR0aW5nIHRvIG5ldyBzZXJpZXMKK1JUTVBfUkZfUkVHUyBSRjI4NTBSZWdUYWJsZVtdID0geworLy8JCWNoCSBSMSAJCSBSMiAJCSBSMyhUWDB+ND0wKSBSNAorCQl7MSwgIDB4OTg0MDJlY2MsIDB4OTg0YzA3ODYsIDB4OTgxNmI0NTUsIDB4OTgwMDUxMGJ9LAorCQl7MiwgIDB4OTg0MDJlY2MsIDB4OTg0YzA3ODYsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOWZ9LAorCQl7MywgIDB4OTg0MDJlY2MsIDB4OTg0YzA3OGEsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOGJ9LAorCQl7NCwgIDB4OTg0MDJlY2MsIDB4OTg0YzA3OGEsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOWZ9LAorCQl7NSwgIDB4OTg0MDJlY2MsIDB4OTg0YzA3OGUsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOGJ9LAorCQl7NiwgIDB4OTg0MDJlY2MsIDB4OTg0YzA3OGUsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOWZ9LAorCQl7NywgIDB4OTg0MDJlY2MsIDB4OTg0YzA3OTIsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOGJ9LAorCQl7OCwgIDB4OTg0MDJlY2MsIDB4OTg0YzA3OTIsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOWZ9LAorCQl7OSwgIDB4OTg0MDJlY2MsIDB4OTg0YzA3OTYsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOGJ9LAorCQl7MTAsIDB4OTg0MDJlY2MsIDB4OTg0YzA3OTYsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOWZ9LAorCQl7MTEsIDB4OTg0MDJlY2MsIDB4OTg0YzA3OWEsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOGJ9LAorCQl7MTIsIDB4OTg0MDJlY2MsIDB4OTg0YzA3OWEsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOWZ9LAorCQl7MTMsIDB4OTg0MDJlY2MsIDB4OTg0YzA3OWUsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOGJ9LAorCQl7MTQsIDB4OTg0MDJlY2MsIDB4OTg0YzA3YTIsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOTN9LAorCisJCS8vIDgwMi4xMSBVTkkgLyBIeXBlckxhbiAyCisJCXszNiwgMHg5ODQwMmVjYywgMHg5ODRjMDk5YSwgMHg5ODE1OGE1NSwgMHg5ODBlZDFhM30sCisJCXszOCwgMHg5ODQwMmVjYywgMHg5ODRjMDk5ZSwgMHg5ODE1OGE1NSwgMHg5ODBlZDE5M30sCisJCXs0MCwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4MiwgMHg5ODE1OGE1NSwgMHg5ODBlZDE4M30sCisJCXs0NCwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4MiwgMHg5ODE1OGE1NSwgMHg5ODBlZDFhM30sCisJCXs0NiwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4NiwgMHg5ODE1OGE1NSwgMHg5ODBlZDE4Yn0sCisJCXs0OCwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4NiwgMHg5ODE1OGE1NSwgMHg5ODBlZDE5Yn0sCisJCXs1MiwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4YSwgMHg5ODE1OGE1NSwgMHg5ODBlZDE5M30sCisJCXs1NCwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4YSwgMHg5ODE1OGE1NSwgMHg5ODBlZDFhM30sCisJCXs1NiwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4ZSwgMHg5ODE1OGE1NSwgMHg5ODBlZDE4Yn0sCisJCXs2MCwgMHg5ODQwMmVjOCwgMHg5ODRjMDY5MiwgMHg5ODE1OGE1NSwgMHg5ODBlZDE4M30sCisJCXs2MiwgMHg5ODQwMmVjOCwgMHg5ODRjMDY5MiwgMHg5ODE1OGE1NSwgMHg5ODBlZDE5M30sCisJCXs2NCwgMHg5ODQwMmVjOCwgMHg5ODRjMDY5MiwgMHg5ODE1OGE1NSwgMHg5ODBlZDFhM30sIC8vIFBsdWdmZXN0IzQsIERheTQsIGNoYW5nZSBSRlIzIGxlZnQ0dGggOS0+NS4KKworCQkvLyA4MDIuMTEgSHlwZXJMYW4gMgorCQl7MTAwLCAweDk4NDAyZWM4LCAweDk4NGMwNmIyLCAweDk4MTc4YTU1LCAweDk4MGVkNzgzfSwKKworCQkvLyAyMDA4LjA0LjMwIG1vZGlmaWVkCisJCS8vIFRoZSBzeXN0ZW0gdGVhbSBoYXMgQU4gdG8gaW1wcm92ZSB0aGUgRVZNIHZhbHVlCisJCS8vIGZvciBjaGFubmVsIDEwMiB0byAxMDggZm9yIHRoZSBSVDI4NTAvUlQyNzUwIGR1YWwgYmFuZCBzb2x1dGlvbi4KKwkJezEwMiwgMHg5ODQwMmVjOCwgMHg5ODVjMDZiMiwgMHg5ODU3OGE1NSwgMHg5ODBlZDc5M30sCisJCXsxMDQsIDB4OTg0MDJlYzgsIDB4OTg1YzA2YjIsIDB4OTg1NzhhNTUsIDB4OTgwZWQxYTN9LAorCQl7MTA4LCAweDk4NDAyZWNjLCAweDk4NWMwYTMyLCAweDk4NTc4YTU1LCAweDk4MGVkMTkzfSwKKworCQl7MTEwLCAweDk4NDAyZWNjLCAweDk4NGMwYTM2LCAweDk4MTc4YTU1LCAweDk4MGVkMTgzfSwKKwkJezExMiwgMHg5ODQwMmVjYywgMHg5ODRjMGEzNiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5Yn0sCisJCXsxMTYsIDB4OTg0MDJlY2MsIDB4OTg0YzBhM2EsIDB4OTgxNzhhNTUsIDB4OTgwZWQxYTN9LAorCQl7MTE4LCAweDk4NDAyZWNjLCAweDk4NGMwYTNlLCAweDk4MTc4YTU1LCAweDk4MGVkMTkzfSwKKwkJezEyMCwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4MiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4M30sCisJCXsxMjQsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODIsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOTN9LAorCQl7MTI2LCAweDk4NDAyZWM0LCAweDk4NGMwMzgyLCAweDk4MTc4YTU1LCAweDk4MGVkMTVifSwgLy8gMHg5ODBlZDFiYi0+MHg5ODBlZDE1YiByZXF1aXJlZCBieSBSb3J5IDIwMDcwOTI3CisJCXsxMjgsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODIsIDB4OTgxNzhhNTUsIDB4OTgwZWQxYTN9LAorCQl7MTMyLCAweDk4NDAyZWM0LCAweDk4NGMwMzg2LCAweDk4MTc4YTU1LCAweDk4MGVkMThifSwKKwkJezEzNCwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4NiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5M30sCisJCXsxMzYsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODYsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOWJ9LAorCQl7MTQwLCAweDk4NDAyZWM0LCAweDk4NGMwMzhhLCAweDk4MTc4YTU1LCAweDk4MGVkMTgzfSwKKworCQkvLyA4MDIuMTEgVU5JSQorCQl7MTQ5LCAweDk4NDAyZWM0LCAweDk4NGMwMzhhLCAweDk4MTc4YTU1LCAweDk4MGVkMWE3fSwKKwkJezE1MSwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4ZSwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4N30sCisJCXsxNTMsIDB4OTg0MDJlYzQsIDB4OTg0YzAzOGUsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOGZ9LAorCQl7MTU3LCAweDk4NDAyZWM0LCAweDk4NGMwMzhlLCAweDk4MTc4YTU1LCAweDk4MGVkMTlmfSwKKwkJezE1OSwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4ZSwgMHg5ODE3OGE1NSwgMHg5ODBlZDFhN30sCisJCXsxNjEsIDB4OTg0MDJlYzQsIDB4OTg0YzAzOTIsIDB4OTgxNzhhNTUsIDB4OTgwZWQxODd9LAorCQl7MTY1LCAweDk4NDAyZWM0LCAweDk4NGMwMzkyLCAweDk4MTc4YTU1LCAweDk4MGVkMTk3fSwKKworCQkvLyBKYXBhbgorCQl7MTg0LCAweDk1MDAyY2NjLCAweDk1MDA0OTFlLCAweDk1MDliZTU1LCAweDk1MGMwYTBifSwKKwkJezE4OCwgMHg5NTAwMmNjYywgMHg5NTAwNDkyMiwgMHg5NTA5YmU1NSwgMHg5NTBjMGExM30sCisJCXsxOTIsIDB4OTUwMDJjY2MsIDB4OTUwMDQ5MjYsIDB4OTUwOWJlNTUsIDB4OTUwYzBhMWJ9LAorCQl7MTk2LCAweDk1MDAyY2NjLCAweDk1MDA0OTJhLCAweDk1MDliZTU1LCAweDk1MGMwYTIzfSwKKwkJezIwOCwgMHg5NTAwMmNjYywgMHg5NTAwNDkzYSwgMHg5NTA5YmU1NSwgMHg5NTBjMGExM30sCisJCXsyMTIsIDB4OTUwMDJjY2MsIDB4OTUwMDQ5M2UsIDB4OTUwOWJlNTUsIDB4OTUwYzBhMWJ9LAorCQl7MjE2LCAweDk1MDAyY2NjLCAweDk1MDA0OTgyLCAweDk1MDliZTU1LCAweDk1MGMwYTIzfSwKKworCQkvLyBzdGlsbCBsYWNrIG9mIE1NQUMoSmFwYW4pIGNoIDM0LDM4LDQyLDQ2Cit9OworVUNIQVIJTlVNX09GXzI4NTBfQ0hOTCA9IChzaXplb2YoUkYyODUwUmVnVGFibGUpIC8gc2l6ZW9mKFJUTVBfUkZfUkVHUykpOworCitGUkVRVUVOQ1lfSVRFTSBGcmVxSXRlbXMzMDIwW10gPQoreworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvLyBJU00gOiAyLjQgdG8gMi40ODMgR0h6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCS8vIDExZworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvLy1DSC0tLU4tLS0tLS0tUi0tLUstLS0tLS0tLS0tLQorCXsxLCAgICAyNDEsICAyLCAgMn0sCisJezIsICAgIDI0MSwJIDIsICA3fSwKKwl7MywgICAgMjQyLAkgMiwgIDJ9LAorCXs0LCAgICAyNDIsCSAyLCAgN30sCisJezUsICAgIDI0MywJIDIsICAyfSwKKwl7NiwgICAgMjQzLAkgMiwgIDd9LAorCXs3LCAgICAyNDQsCSAyLCAgMn0sCisJezgsICAgIDI0NCwJIDIsICA3fSwKKwl7OSwgICAgMjQ1LAkgMiwgIDJ9LAorCXsxMCwgICAyNDUsCSAyLCAgN30sCisJezExLCAgIDI0NiwJIDIsICAyfSwKKwl7MTIsICAgMjQ2LAkgMiwgIDd9LAorCXsxMywgICAyNDcsCSAyLCAgMn0sCisJezE0LCAgIDI0OCwJIDIsICA0fSwKK307CisjZGVmaW5lCU5VTV9PRl8zMDIwX0NITkwJKHNpemVvZihGcmVxSXRlbXMzMDIwKSAvIHNpemVvZihGUkVRVUVOQ1lfSVRFTSkpCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJaW5pdGlhbGl6ZSB0aGUgTUxNRSB0YXNrIGFuZCBpdHMgZGF0YSBzdHJ1Y3R1cmUgKHF1ZXVlLCBzcGlubG9jaywKKwkJdGltZXIsIHN0YXRlIG1hY2hpbmVzKS4KKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwlSZXR1cm46CisJCWFsd2F5cyByZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUworCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUyBNbG1lSW5pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlORElTX1NUQVRVUyBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IE1MTUUgSW5pdGlhbGl6ZVxuIikpOworCisJZG8KKwl7CisJCVN0YXR1cyA9IE1sbWVRdWV1ZUluaXQoJnBBZC0+TWxtZS5RdWV1ZSk7CisJCWlmKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJYnJlYWs7CisKKwkJcEFkLT5NbG1lLmJSdW5uaW5nID0gRkFMU0U7CisJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCUJzc1RhYmxlSW5pdCgmcEFkLT5TY2FuVGFiKTsKKworCQkJLy8gaW5pdCBTVEEgc3RhdGUgbWFjaGluZXMKKwkJCUFzc29jU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLCBwQWQtPk1sbWUuQXNzb2NGdW5jKTsKKwkJCUF1dGhTdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5BdXRoTWFjaGluZSwgcEFkLT5NbG1lLkF1dGhGdW5jKTsKKwkJCUF1dGhSc3BTdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5BdXRoUnNwTWFjaGluZSwgcEFkLT5NbG1lLkF1dGhSc3BGdW5jKTsKKwkJCVN5bmNTdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5TeW5jTWFjaGluZSwgcEFkLT5NbG1lLlN5bmNGdW5jKTsKKwkJCVdwYVBza1N0YXRlTWFjaGluZUluaXQocEFkLCAmcEFkLT5NbG1lLldwYVBza01hY2hpbmUsIHBBZC0+TWxtZS5XcGFQc2tGdW5jKTsKKwkJCUFpcm9uZXRTdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZSwgcEFkLT5NbG1lLkFpcm9uZXRGdW5jKTsKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkJRGxzU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuRGxzTWFjaGluZSwgcEFkLT5NbG1lLkRsc0Z1bmMpOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisKKwkJCS8vIFNpbmNlIHdlIGFyZSB1c2luZyBzd2l0Y2gvY2FzZSB0byBpbXBsZW1lbnQgaXQsIHRoZSBpbml0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBhYm92ZQorCQkJLy8gc3RhdGUgbWFjaGluZSBpbml0CisJCQlNbG1lQ250bEluaXQocEFkLCAmcEFkLT5NbG1lLkNudGxNYWNoaW5lLCBOVUxMKTsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKKworCQlBY3Rpb25TdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5BY3RNYWNoaW5lLCBwQWQtPk1sbWUuQWN0RnVuYyk7CisKKwkJLy8gSW5pdCBtbG1lIHBlcmlvZGljIHRpbWVyCisJCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lLlBlcmlvZGljVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihNbG1lUGVyaW9kaWNFeGVjKSwgcEFkLCBUUlVFKTsKKworCQkvLyBTZXQgbWxtZSBwZXJpb2RpYyB0aW1lcgorCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5QZXJpb2RpY1RpbWVyLCBNTE1FX1RBU0tfRVhFQ19JTlRWKTsKKworCQkvLyBzb2Z0d2FyZS1iYXNlZCBSWCBBbnRlbm5hIGRpdmVyc2l0eQorCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZS5SeEFudEV2YWxUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKEFzaWNSeEFudEV2YWxUaW1lb3V0KSwgcEFkLCBGQUxTRSk7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIFJUMjg2MAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJICAgICAgICBpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpKQorCSAgICAgICAgeworCSAgICAgICAgICAgIC8vIG9ubHkgUENJZSBjYXJkcyBuZWVkIHRoZXNlIHR3byB0aW1lcnMKKwkgICAgCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKFBzUG9sbFdha2VFeGVjKSwgcEFkLCBGQUxTRSk7CisJICAgIAkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oUmFkaW9PbkV4ZWMpLCBwQWQsIEZBTFNFKTsKKwkgICAgICAgIH0KKwkJfQorI2VuZGlmIC8vIFJUMjg2MCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJfSB3aGlsZSAoRkFMU0UpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tIE1MTUUgSW5pdGlhbGl6ZVxuIikpOworCisJcmV0dXJuIFN0YXR1czsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQltYWluIGxvb3Agb2YgdGhlIE1MTUUKKwlQcmU6CisJCU1sbWUgaGFzIHRvIGJlIGluaXRpYWxpemVkLCBhbmQgdGhlcmUgYXJlIHNvbWV0aGluZyBpbnNpZGUgdGhlIHF1ZXVlCisJTm90ZToKKwkJVGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkIGZyb20gTVBTZXRJbmZvcm1hdGlvbiBhbmQgTVBSZWNlaXZlOworCQlUaGlzIHRhc2sgZ3VhcmFudGVlIG9ubHkgb25lIE1sbWVIYW5kbGVyIHdpbGwgcnVuLgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVIYW5kbGVyKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCU1MTUVfUVVFVUVfRUxFTSAJICAgKkVsZW0gPSBOVUxMOworI2lmZGVmIEFQQ0xJX1NVUFBPUlQKKwlTSE9SVCBhcGNsaUlmSW5kZXg7CisjZW5kaWYKKworCS8vIE9ubHkgYWNjZXB0IE1MTUUgYW5kIEZyYW1lIGZyb20gcGVlciBzaWRlLCBubyBvdGhlciAoY29udHJvbC9kYXRhKSBmcmFtZSBzaG91bGQKKwkvLyBnZXQgaW50byB0aGlzIHN0YXRlIG1hY2hpbmUKKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7CisJaWYocEFkLT5NbG1lLmJSdW5uaW5nKQorCXsKKwkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKKwkJcmV0dXJuOworCX0KKwllbHNlCisJeworCQlwQWQtPk1sbWUuYlJ1bm5pbmcgPSBUUlVFOworCX0KKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOworCisJd2hpbGUgKCFNbG1lUXVldWVFbXB0eSgmcEFkLT5NbG1lLlF1ZXVlKSkKKwl7CisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTUxNRV9SRVNFVF9JTl9QUk9HUkVTUykgfHwKKwkJCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSB8fAorCQkJUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEZXZpY2UgSGFsdGVkIG9yIFJlbW92ZWQgb3IgTWxtZVJlc3QsIGV4aXQgTWxtZUhhbmRsZXIhIChxdWV1ZSBudW0gPSAlbGQpXG4iLCBwQWQtPk1sbWUuUXVldWUuTnVtKSk7CisJCQlicmVhazsKKwkJfQorCisjaWZkZWYgUkFMSU5LX0FURQorCQlpZihBVEVfT04ocEFkKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVGhlIGRyaXZlciBpcyBpbiBBVEUgbW9kZSBub3cgaW4gTWxtZUhhbmRsZXJcbiIpKTsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisJCS8vRnJvbSBtZXNzYWdlIHR5cGUsIGRldGVybWluZSB3aGljaCBzdGF0ZSBtYWNoaW5lIEkgc2hvdWxkIGRyaXZlCisJCWlmIChNbG1lRGVxdWV1ZSgmcEFkLT5NbG1lLlF1ZXVlLCAmRWxlbSkpCisJCXsKKworCQkJLy8gaWYgZGVxdWV1ZSBzdWNjZXNzCisJCQlzd2l0Y2ggKEVsZW0tPk1hY2hpbmUpCisJCQl7CisJCQkJLy8gU1RBIHN0YXRlIG1hY2hpbmVzCisjaWZkZWYJQ09ORklHX1NUQV9TVVBQT1JUCisJCQkJY2FzZSBBU1NPQ19TVEFURV9NQUNISU5FOgorCQkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5Bc3NvY01hY2hpbmUsIEVsZW0pOworCQkJCQlicmVhazsKKwkJCQljYXNlIEFVVEhfU1RBVEVfTUFDSElORToKKwkJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuQXV0aE1hY2hpbmUsIEVsZW0pOworCQkJCQlicmVhazsKKwkJCQljYXNlIEFVVEhfUlNQX1NUQVRFX01BQ0hJTkU6CisJCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLkF1dGhSc3BNYWNoaW5lLCBFbGVtKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTWU5DX1NUQVRFX01BQ0hJTkU6CisJCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLlN5bmNNYWNoaW5lLCBFbGVtKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBNTE1FX0NOVExfU1RBVEVfTUFDSElORToKKwkJCQkJTWxtZUNudGxNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuQ250bE1hY2hpbmUsIEVsZW0pOworCQkJCQlicmVhazsKKwkJCQljYXNlIFdQQV9QU0tfU1RBVEVfTUFDSElORToKKwkJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuV3BhUHNrTWFjaGluZSwgRWxlbSk7CisJCQkJCWJyZWFrOworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJCWNhc2UgTEVBUF9TVEFURV9NQUNISU5FOgorCQkJCQlMZWFwTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLkxlYXBNYWNoaW5lLCBFbGVtKTsKKwkJCQkJYnJlYWs7CisjZW5kaWYKKwkJCQljYXNlIEFJUk9ORVRfU1RBVEVfTUFDSElORToKKwkJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUsIEVsZW0pOworCQkJCQlicmVhazsKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkJCWNhc2UgRExTX1NUQVRFX01BQ0hJTkU6CisJCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLkRsc01hY2hpbmUsIEVsZW0pOworCQkJCQlicmVhazsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkJCWNhc2UgQUNUSU9OX1NUQVRFX01BQ0hJTkU6CisJCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLkFjdE1hY2hpbmUsIEVsZW0pOworCQkJCQlicmVhazsKKworCisKKworCQkJCWRlZmF1bHQ6CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkVSUk9SOiBJbGxlZ2FsIG1hY2hpbmUgJWxkIGluIE1sbWVIYW5kbGVyKClcbiIsIEVsZW0tPk1hY2hpbmUpKTsKKwkJCQkJYnJlYWs7CisJCQl9IC8vIGVuZCBvZiBzd2l0Y2gKKworCQkJLy8gZnJlZSBNTE1FIGVsZW1lbnQKKwkJCUVsZW0tPk9jY3VwaWVkID0gRkFMU0U7CisJCQlFbGVtLT5Nc2dMZW4gPSAwOworCisJCX0KKwkJZWxzZSB7CisJCQlEQkdQUklOVF9FUlIoKCJNbG1lSGFuZGxlcjogTWxtZVF1ZXVlIGVtcHR5XG4iKSk7CisJCX0KKwl9CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOworCXBBZC0+TWxtZS5iUnVubmluZyA9IEZBTFNFOworCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJRGVzdHJ1Y3RvciBvZiBNTE1FIChEZXN0cm95IHF1ZXVlLCBzdGF0ZSBtYWNoaW5lLCBzcGluIGxvY2sgYW5kIHRpbWVyKQorCVBhcmFtZXRlcnM6CisJCUFkYXB0ZXIgLSBOSUMgQWRhcHRlciBwb2ludGVyCisJUG9zdDoKKwkJVGhlIE1MTUUgdGFzayB3aWxsIG5vIGxvbmdlciB3b3JrIHByb3Blcmx5CisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lSGFsdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlCT09MRUFOIAkgIENhbmNlbGxlZDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBNbG1lSGFsdFxuIikpOworCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJeworCQkvLyBkaXNhYmxlIEJFQUNPTiBnZW5lcmF0aW9uIGFuZCBvdGhlciBCRUFDT04gcmVsYXRlZCBoYXJkd2FyZSB0aW1lcnMKKwkJQXNpY0Rpc2FibGVTeW5jKHBBZCk7CisJfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCVVDSEFSCQlpOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQkvLyBDYW5jZWwgcGVuZGluZyB0aW1lcnMKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXNzb2NUaW1lciwJCSZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5SZWFzc29jVGltZXIsCQkmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguRGlzYXNzb2NUaW1lciwJJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwJCSZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5CZWFjb25UaW1lciwJCSZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsCQkmQ2FuY2VsbGVkKTsKKyNpZmRlZiBSVDI4NjAKKwkgICAgaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkKKwkgICAgeworCSAgIAkgICAgUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsCQkmQ2FuY2VsbGVkKTsKKwkJICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlJhZGlvT25PZmZUaW1lciwJCSZDYW5jZWxsZWQpOworCQl9CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJZm9yIChpPTA7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwkJeworCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJkNhbmNlbGxlZCk7CisJCX0KKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5QZXJpb2RpY1RpbWVyLAkJJkNhbmNlbGxlZCk7CisJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUnhBbnRFdmFsVGltZXIsCQkmQ2FuY2VsbGVkKTsKKworCisKKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwl7CisJCS8vIFNldCBMRUQKKwkJUlRNUFNldExFRChwQWQsIExFRF9IQUxUKTsKKyAgICAgICAgUlRNUFNldFNpZ25hbExFRChwQWQsIC0xMDApOwkvLyBGb3JjZSBzaWduYWwgc3RyZW5ndGggTGVkIHRvIGJlIHR1cm5lZCBvZmYsIGZpcm13YXJlIGlzIG5vdCBkb25lIGl0LgorCX0KKworCVJUTVB1c2VjRGVsYXkoNTAwMCk7ICAgIC8vICA1IG1zZWMgdG8gZ3VyYW50ZWUgQW50IERpdmVyc2l0eSB0aW1lciBjYW5jZWxlZAorCisJTWxtZVF1ZXVlRGVzdHJveSgmcEFkLT5NbG1lLlF1ZXVlKTsKKwlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IE1sbWVIYWx0XG4iKSk7Cit9CisKK1ZPSUQgTWxtZVJlc2V0UmFsaW5rQ291bnRlcnMoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpCit7CisJcEFkLT5SYWxpbmtDb3VudGVycy5MYXN0T25lU2VjUnhPa0RhdGFDbnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4T2tEYXRhQ250OworCS8vIGNsZWFyIGFsbCBPbmVTZWN4eHggY291bnRlcnMuCisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNCZWFjb25TZW50Q250ID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0ZhbHNlQ0NBQ250ID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4RmNzRXJyQ250ID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4T2tDbnQgPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQgPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeE9rRGF0YUNudCA9IDA7CisKKwkvLyBUT0RPOiBmb3IgZGVidWcgb25seS4gdG8gYmUgcmVtb3ZlZAorCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjT3NUeENvdW50W1FJRF9BQ19CRV0gPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjT3NUeENvdW50W1FJRF9BQ19CS10gPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjT3NUeENvdW50W1FJRF9BQ19WSV0gPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjT3NUeENvdW50W1FJRF9BQ19WT10gPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjRG1hRG9uZUNvdW50W1FJRF9BQ19CRV0gPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjRG1hRG9uZUNvdW50W1FJRF9BQ19CS10gPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjRG1hRG9uZUNvdW50W1FJRF9BQ19WSV0gPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjRG1hRG9uZUNvdW50W1FJRF9BQ19WT10gPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQgPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhDb3VudCA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEFnZ3JlZ2F0aW9uQ291bnQgPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhBZ2dyZWdhdGlvbkNvdW50ID0gMDsKKworCXJldHVybjsKK30KKwordW5zaWduZWQgbG9uZyByeF9BTVNEVTsKK3Vuc2lnbmVkIGxvbmcgcnhfVG90YWw7CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIGlzIGV4ZWN1dGVkIHBlcmlvZGljYWxseSB0byAtCisJCTEuIERlY2lkZSBpZiBpdCdzIGEgcmlnaHQgdGltZSB0byB0dXJuIG9uIFB3ck1nbXQgYml0IG9mIGFsbAorCQkgICBvdXRnb2lpbmcgZnJhbWVzCisJCTIuIENhbGN1bGF0ZSBDaGFubmVsUXVhbGl0eSBiYXNlZCBvbiBzdGF0aXN0aWNzIG9mIHRoZSBsYXN0CisJCSAgIHBlcmlvZCwgc28gdGhhdCBUWCByYXRlIHdvbid0IHRvZ2dsaW5nIHZlcnkgZnJlcXVlbnRseSBiZXR3ZWVuIGEKKwkJICAgc3VjY2Vzc2Z1bCBUWCBhbmQgYSBmYWlsZWQgVFguCisJCTMuIElmIHRoZSBjYWxjdWxhdGVkIENoYW5uZWxRdWFsaXR5IGluZGljYXRlZCBjdXJyZW50IGNvbm5lY3Rpb24gbm90CisJCSAgIGhlYWx0aHksIHRoZW4gYSBST0FNaW5nIGF0dGVtcHQgaXMgdHJpZWQgaGVyZS4KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworI2RlZmluZSBBREhPQ19CRUFDT05fTE9TVF9USU1FCQkoOCpPU19IWikgIC8vIDggc2VjCitWT0lEIE1sbWVQZXJpb2RpY0V4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCVVMT05HCQkJVHhUb3RhbENudDsKKwlQUlRNUF9BREFQVEVSCXBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBSVDI4NjAKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkgICAgLy8gSWYgSGFyZHdhcmUgY29udHJvbGxlZCBSYWRpbyBlbmFibGVkLCB3ZSBoYXZlIHRvIGNoZWNrIEdQSU8gcGluMiBldmVyeSAyIHNlY29uZC4KKwkJLy8gTW92ZSBjb2RlIHRvIGhlcmUsIGJlY2F1c2UgZm9sbG93aW5nIGNvZGUgd2lsbCByZXR1cm4gd2hlbiByYWRpbyBpcyBvZmYKKwkJaWYgKChwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCAlIChNTE1FX1RBU0tfRVhFQ19NVUxUSVBMRSAqIDIpID09IDApICYmIChwQWQtPlN0YUNmZy5iSGFyZHdhcmVSYWRpbyA9PSBUUlVFKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgJiYKKwkJCShwQWQtPmJQQ0ljbGtPZmYgPT0gRkFMU0UpKQorCQl7CisJCQlVSU5UMzIJCQkJZGF0YSA9IDA7CisKKwkJCS8vIFJlYWQgR1BJTyBwaW4yIGFzIEhhcmR3YXJlIGNvbnRyb2xsZWQgcmFkaW8gc3RhdGUKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgR1BJT19DVFJMX0NGRywgJmRhdGEpOworCQkJaWYgKGRhdGEgJiAweDA0KQorCQkJeworCQkJCXBBZC0+U3RhQ2ZnLmJId1JhZGlvID0gVFJVRTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlwQWQtPlN0YUNmZy5iSHdSYWRpbyA9IEZBTFNFOworCQkJfQorCQkJaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyAhPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pKQorCQkJeworCQkJCXBBZC0+U3RhQ2ZnLmJSYWRpbyA9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbyk7CisJCQkJaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBUUlVFKQorCQkJCXsKKwkJCQkJTWxtZVJhZGlvT24ocEFkKTsKKwkJCQkJLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uCisJCQkJCXBBZC0+RXh0cmFJbmZvID0gRVhUUkFfSU5GT19DTEVBUjsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJTWxtZVJhZGlvT2ZmKHBBZCk7CisJCQkJCS8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbgorCQkJCQlwQWQtPkV4dHJhSW5mbyA9IEhXX1JBRElPX09GRjsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisjZW5kaWYgLy8gUlQyODYwIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoKFJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8CisJCQkJCQkJCWZSVE1QX0FEQVBURVJfUkFESU9fT0ZGIHwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9SQURJT19NRUFTVVJFTUVOVCB8CisJCQkJCQkJCWZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpKSkpCisJCXJldHVybjsKKworCVJUMjhYWF9NTE1FX1BSRV9TQU5JVFlfQ0hFQ0socEFkKTsKKworI2lmZGVmIFJBTElOS19BVEUKKwkvKiBEbyBub3Qgc2hvdyBSU1NJIHVudGlsICJOb3JtYWwgMSBzZWNvbmQgTWxtZSBQZXJpb2RpY0V4ZWMiLiAqLworCWlmIChBVEVfT04ocEFkKSkKKwl7CisJCWlmIChwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCAlIE1MTUVfVEFTS19FWEVDX01VTFRJUExFICE9IChNTE1FX1RBU0tfRVhFQ19NVUxUSVBMRSAtIDEpKQorCXsKKwkJCXBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kICsrOworCQkJcmV0dXJuOworCQl9CisJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQkvLyBEbyBub3RoaW5nIGlmIG1vbml0b3IgbW9kZSBpcyBvbgorCQlpZiAoTU9OSVRPUl9PTihwQWQpKQorCQkJcmV0dXJuOworCisJCWlmIChwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCAmIDB4MSkKKwkJeworCQkJLy8gVGhpcyBpcyB0aGUgZml4IGZvciB3aWZpIDExbiBleHRlbnNpb24gY2hhbm5lbCBvdmVybGFwcGluZyB0ZXN0IGNhc2UuICBmb3IgMjg2MEQKKwkJCWlmICgoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPT0gMHgwMTAxKSAmJgorCQkJCShTVEFfVEdOX1dJRklfT04ocEFkKSkgJiYKKwkJCQkocEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iVG9nZ2xlID09IEZBTFNFKSkKKworCQkJCXsKKwkJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhPUF9DVFJMX0NGRywgMHgyNEJmKTsKKwkJCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iVG9nZ2xlID0gVFJVRTsKKwkJCQl9CisJCQkJZWxzZSBpZiAoKFNUQV9UR05fV0lGSV9PTihwQWQpKSAmJgorCQkJCQkJKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpID09IDB4MDEwMSkpCisJCQkJeworCQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWE9QX0NUUkxfQ0ZHLCAweDI0M2YpOworCQkJCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJUb2dnbGUgPSBGQUxTRTsKKwkJCQl9CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlwQWQtPmJVcGRhdGVCY25DbnREb25lID0gRkFMU0U7CisKKy8vCVJFQ0JBVGltZXJUaW1lb3V0KFN5c3RlbVNwZWNpZmljMSxGdW5jdGlvbkNvbnRleHQsU3lzdGVtU3BlY2lmaWMyLFN5c3RlbVNwZWNpZmljMyk7CisJcEFkLT5NbG1lLlBlcmlvZGljUm91bmQgKys7CisKKwkvLyBleGVjdXRlIGV2ZXJ5IDUwMG1zCisJaWYgKChwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCAlIDUgPT0gMCkgJiYgUlRNUEF1dG9SYXRlU3dpdGNoQ2hlY2socEFkKS8qKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCkpKi8pCisJeworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkvLyBwZXJmb3JtIGR5bmFtaWMgdHggcmF0ZSBzd2l0Y2hpbmcgYmFzZWQgb24gcGFzdCBUWCBoaXN0b3J5CisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCWlmICgoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpCisJCQkJCSkKKwkJCQkmJiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpKQorCQkJCU1sbWVEeW5hbWljVHhSYXRlU3dpdGNoaW5nKHBBZCk7CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl9CisKKwkvLyBOb3JtYWwgMSBzZWNvbmQgTWxtZSBQZXJpb2RpY0V4ZWMuCisJaWYgKHBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kICVNTE1FX1RBU0tfRVhFQ19NVUxUSVBMRSA9PSAwKQorCXsKKyAgICAgICAgICAgICAgICBwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCArKzsKKworI2lmZGVmIFJBTElOS19BVEUKKyAgICAJaWYgKEFURV9PTihwQWQpKQorICAgIAl7CisJCQkvKiByZXF1ZXN0IGZyb20gQmFyb24gOiBtb3ZlIHRoaXMgcm91dGluZSBmcm9tIGxhdGVyIHRvIGhlcmUgKi8KKwkJCS8qIGZvciBzaG93aW5nIFJ4IGVycm9yIGNvdW50IGluIEFURSBSWEZSQU1FICovCisgICAgICAgICAgICBOSUNVcGRhdGVSYXdDb3VudGVycyhwQWQpOworCQkJaWYgKHBBZC0+YXRlLmJSeEZlciA9PSAxKQorCQkJeworCQkJCXBBZC0+YXRlLlJ4VG90YWxDbnQgKz0gcEFkLT5hdGUuUnhDbnRQZXJTZWM7CisJCQkgICAgYXRlX3ByaW50KEtFUk5fRU1FUkcgIk1sbWVQZXJpb2RpY0V4ZWM6IFJ4IHBhY2tldCBjbnQgPSAlZC8lZFxuIiwgcEFkLT5hdGUuUnhDbnRQZXJTZWMsIHBBZC0+YXRlLlJ4VG90YWxDbnQpOworCQkJCXBBZC0+YXRlLlJ4Q250UGVyU2VjID0gMDsKKworCQkJCWlmIChwQWQtPmF0ZS5SeEFudGVubmFTZWwgPT0gMCkKKwkJCQkJYXRlX3ByaW50KEtFUk5fRU1FUkcgIk1sbWVQZXJpb2RpY0V4ZWM6IFJ4IEF2Z1Jzc2kwPSVkLCBBdmdSc3NpMT0lZCwgQXZnUnNzaTI9JWRcblxuIiwKKwkJCQkJCXBBZC0+YXRlLkF2Z1Jzc2kwLCBwQWQtPmF0ZS5BdmdSc3NpMSwgcEFkLT5hdGUuQXZnUnNzaTIpOworCQkJCWVsc2UKKwkJCQkJYXRlX3ByaW50KEtFUk5fRU1FUkcgIk1sbWVQZXJpb2RpY0V4ZWM6IFJ4IEF2Z1Jzc2k9JWRcblxuIiwgcEFkLT5hdGUuQXZnUnNzaTApOworCQkJfQorCQkJTWxtZVJlc2V0UmFsaW5rQ291bnRlcnMocEFkKTsKKwkJCXJldHVybjsKKyAgICAJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCisJCWlmIChyeF9Ub3RhbCkKKwkJeworCisJCQkvLyByZXNldCBjb3VudGVycworCQkJcnhfQU1TRFUgPSAwOworCQkJcnhfVG90YWwgPSAwOworCQl9CisKKwkJLy8gTWVkaWEgc3RhdHVzIGNoYW5nZWQsIHJlcG9ydCB0byBORElTCisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTUVESUFfU1RBVEVfQ0hBTkdFKSkKKwkJeworCQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9NRURJQV9TVEFURV9DSEFOR0UpOworCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwkJCXsKKwkJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworCQkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CisKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOworCQkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CisJCQl9CisJCX0KKworCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZwQWQtPk1sbWUuTm93MzIpOworCisJCS8vIGFkZCB0aGUgbW9zdCB1cC10by1kYXRlIGgvdyByYXcgY291bnRlcnMgaW50byBzb2Z0d2FyZSB2YXJpYWJsZSwgc28gdGhhdAorCQkvLyB0aGUgZHluYW1pYyB0dW5pbmcgbWVjaGFuaXNtIGJlbG93IGFyZSBiYXNlZCBvbiBtb3N0IHVwLXRvLWRhdGUgaW5mb3JtYXRpb24KKwkJTklDVXBkYXRlUmF3Q291bnRlcnMocEFkKTsKKworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAJCS8vIE5lZWQgc3RhdGlzdGljcyBhZnRlciByZWFkIGNvdW50ZXIuIFNvIHB1dCBhZnRlciBOSUNVcGRhdGVSYXdDb3VudGVycworCQlPUklCQVRpbWVyVGltZW91dChwQWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisKKwkJLy8gVGhlIHRpbWUgcGVyaW9kIGZvciBjaGVja2luZyBhbnRlbm5hIGlzIGFjY29yZGluZyB0byB0cmFmZmljCisJCWlmIChwQWQtPk1sbWUuYkVuYWJsZUF1dG9BbnRlbm5hQ2hlY2spCisJCXsKKwkJCVR4VG90YWxDbnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKworCQkJCQkJCSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKKwkJCQkJCQkgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudDsKKworCQkJaWYgKFR4VG90YWxDbnQgPiA1MCkKKwkJCXsKKwkJCQlpZiAocEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgJSAxMCA9PSAwKQorCQkJCXsKKwkJCQkJQXNpY0V2YWx1YXRlUnhBbnQocEFkKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgMyA9PSAwKQorCQkJCXsKKwkJCQkJQXNpY0V2YWx1YXRlUnhBbnQocEFkKTsKKwkJCQl9CisJCQl9CisJCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJU1RBTWxtZVBlcmlvZGljRXhlYyhwQWQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCU1sbWVSZXNldFJhbGlua0NvdW50ZXJzKHBBZCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworI2lmZGVmIFJUMjg2MAorCQkJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkgJiYgKHBBZC0+YlBDSWNsa09mZiA9PSBGQUxTRSkpCisjZW5kaWYgLy8gUlQyODYwIC8vCisJCQl7CisJCQkJLy8gV2hlbiBBZGhvYyBiZWFjb24gaXMgZW5hYmxlZCBhbmQgUlRTL0NUUyBpcyBlbmFibGVkLCB0aGVyZSBpcyBhIGNoYW5jZSB0aGF0IGhhcmR3YXJlIE1BQyBGU00gd2lsbCBydW4gaW50byBhIGRlYWRsb2NrCisJCQkJLy8gYW5kIHNlbmRpbmcgQ1RTLXRvLXNlbGYgb3ZlciBhbmQgb3Zlci4KKwkJCQkvLyBTb2Z0d2FyZSBQYXRjaCBTb2x1dGlvbjoKKwkJCQkvLyAxLiBQb2xsaW5nIGRlYnVnIHN0YXRlIHJlZ2lzdGVyIDB4MTBGNCBldmVyeSBvbmUgc2Vjb25kLgorCQkJCS8vIDIuIElmIGluIDB4MTBGNCB0aGUgKChiaXQyOT09MSkgJiYgKGJpdDc9PTEpKSBPUiAoKGJpdDI5PT0xKSAmJiAoYml0NT09MSkpLCBpdCBtZWFucyB0aGUgZGVhZGxvY2sgaGFzIG9jY3VycmVkLgorCQkJCS8vIDMuIElmIHRoZSBkZWFkbG9jayBvY2N1cnJlZCwgcmVzZXQgTUFDL0JCUCBieSBzZXR0aW5nIDB4MTAwNCB0byAweDAwMDEgZm9yIGEgd2hpbGUgdGhlbiBzZXR0aW5nIGl0IGJhY2sgdG8gMHgwMDBDIGFnYWluLgorCisJCQkJVUlOVDMyCU1hY1JlZyA9IDA7CisKKwkJCQlSVE1QX0lPX1JFQUQzMihwQWQsIDB4MTBGNCwgJk1hY1JlZyk7CisJCQkJaWYgKCgoTWFjUmVnICYgMHgyMDAwMDAwMCkgJiYgKE1hY1JlZyAmIDB4ODApKSB8fCAoKE1hY1JlZyAmIDB4MjAwMDAwMDApICYmIChNYWNSZWcgJiAweDIwKSkpCisJCQkJeworCQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4MSk7CisJCQkJCVJUTVB1c2VjRGVsYXkoMSk7CisJCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHhDKTsKKworCQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCgiV2FybmluZywgTUFDIHNwZWNpZmljIGNvbmRpdGlvbiBvY2N1cnMgXG4iKSk7CisJCQkJfQorCQkJfQorCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCX0KKworCisJcEFkLT5iVXBkYXRlQmNuQ250RG9uZSA9IEZBTFNFOworfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitWT0lEIFNUQU1sbWVQZXJpb2RpY0V4ZWMoCisJUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUxPTkcJCQkgICAgVHhUb3RhbENudDsKKworLy8KKy8vIFdlIHJldHVybiBoZXJlIGluIEFURSBtb2RlLCBiZWNhdXNlIHRoZSBzdGF0aXN0aWNzCisvLyB0aGF0IEFURSBuZWVkcyBhcmUgbm90IGNvbGxlY3RlZCB2aWEgdGhpcyByb3V0aW5lLgorLy8KKyNpZmRlZiBSQUxJTktfQVRFCisJLy8gSXQgaXMgc3VwcG9zZWQgdGhhdCB3ZSB3aWxsIG5ldmVyIHJlYWNoIGhlcmUgaW4gQVRFIG1vZGUuCisJQVNTRVJUKCEoQVRFX09OKHBBZCkpKTsKKwlpZiAoQVRFX09OKHBBZCkpCisJCXJldHVybjsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICB7CisgICAgCS8vIFdQQSBNSUMgZXJyb3Igc2hvdWxkIGJsb2NrIGFzc29jaWF0aW9uIGF0dGVtcHQgZm9yIDYwIHNlY29uZHMKKyAgICAJaWYgKHBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jICYmIChwQWQtPlN0YUNmZy5MYXN0TWljRXJyb3JUaW1lICsgKDYwICogT1NfSFopIDwgcEFkLT5NbG1lLk5vdzMyKSkKKyAgICAJCXBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jID0gRkFMU0U7CisgICAgfQorCisgICAgaWYgKChwQWQtPlByZU1lZGlhU3RhdGUgIT0gcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUpICYmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkpCisJeworCQlpZiAocEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPT0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQpCisJCXsKKwkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX1NUQV9MSU5LVVBfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKwkJfQorCQlwQWQtPlByZU1lZGlhU3RhdGUgPSBwQWQtPkluZGljYXRlTWVkaWFTdGF0ZTsKKwl9CisKKworCisKKyAgIAlBc2ljU3RhQmJwVHVuaW5nKHBBZCk7CisKKwlUeFRvdGFsQ250ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsKKwkJCQkJIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKworCQkJCQkgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudDsKKworCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJeworCQkvLyB1cGRhdGUgY2hhbm5lbCBxdWFsaXR5IGZvciBSb2FtaW5nIGFuZCBVSSBMaW5rUXVhbGl0eSBkaXNwbGF5CisJCU1sbWVDYWxjdWxhdGVDaGFubmVsUXVhbGl0eShwQWQsIHBBZC0+TWxtZS5Ob3czMik7CisJfQorCisJLy8gbXVzdCBiZSBBRlRFUiBNbG1lRHluYW1pY1R4UmF0ZVN3aXRjaGluZygpIGJlY2F1c2UgaXQgbmVlZHMgdG8ga25vdyBpZgorCS8vIFJhZGlvIGlzIGN1cnJlbnRseSBpbiBub2lzeSBlbnZpcm9ubWVudAorCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKwkJQXNpY0FkanVzdFR4UG93ZXIocEFkKTsKKworCWlmIChJTkZSQV9PTihwQWQpKQorCXsKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJLy8gQ2hlY2sgRExTIHRpbWUgb3V0LCB0aGVuIHRlYXIgZG93biB0aG9zZSBzZXNzaW9uCisJCVJUTVBDaGVja0RMU1RpbWVPdXQocEFkKTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCQkvLyBJcyBQU00gYml0IGNvbnNpc3RlbnQgd2l0aCB1c2VyIHBvd2VyIG1hbmFnZW1lbnQgcG9saWN5PworCQkvLyBUaGlzIGlzIHRoZSBvbmx5IHBsYWNlIHRoYXQgd2lsbCBzZXQgUFNNIGJpdCBPTi4KKwkJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQorCQlNbG1lQ2hlY2tQc21DaGFuZ2UocEFkLCBwQWQtPk1sbWUuTm93MzIpOworCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuTGFzdE9uZVNlY1RvdGFsVHhDb3VudCA9IFR4VG90YWxDbnQ7CisKKwkJaWYgKChwQWQtPlN0YUNmZy5MYXN0QmVhY29uUnhUaW1lICsgMSpPU19IWiA8IHBBZC0+TWxtZS5Ob3czMikgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgJiYKKwkJCSgoVHhUb3RhbENudCArIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhPa0NudCA8IDYwMCkpKQorCQl7CisJCQlSVE1QU2V0QUdDSW5pdFZhbHVlKHBBZCwgQldfMjApOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTU1DSEsgLSBObyBCRUFDT04uIHJlc3RvcmUgUjY2IHRvIHRoZSBsb3cgYm91bmQoJWQpIFxuIiwgKDB4MkUgKyBHRVRfTE5BX0dBSU4ocEFkKSkpKTsKKwkJfQorCisgICAgICAgIHsKKyAgICAJCWlmIChwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgJiYgcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iQVBTRENhcGFibGUpCisgICAgCQl7CisgICAgCQkgICAgLy8gV2hlbiBBUFNEIGlzIGVuYWJsZWQsIHRoZSBwZXJpb2QgY2hhbmdlcyBhcyAyMCBzZWMKKyAgICAJCQlpZiAoKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgMjApID09IDgpCisgICAgCQkJCVJUTVBTZW5kTnVsbEZyYW1lKHBBZCwgcEFkLT5Db21tb25DZmcuVHhSYXRlLCBUUlVFKTsKKyAgICAJCX0KKyAgICAJCWVsc2UKKyAgICAJCXsKKyAgICAJCSAgICAvLyBTZW5kIG91dCBhIE5VTEwgZnJhbWUgZXZlcnkgMTAgc2VjIHRvIGluZm9ybSBBUCB0aGF0IFNUQSBpcyBzdGlsbCBhbGl2ZSAoQXZvaWQgYmVpbmcgYWdlIG91dCkKKyAgICAJCQlpZiAoKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgMTApID09IDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUpCisgICAgCQkJCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSwgVFJVRSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKwkJCQkJCVJUTVBTZW5kTnVsbEZyYW1lKHBBZCwgcEFkLT5Db21tb25DZmcuVHhSYXRlLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgfQorICAgIAkJfQorICAgICAgICB9CisKKwkJaWYgKENRSV9JU19ERUFEKHBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSkpCisJCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIE5vIEJFQUNPTi4gRGVhZCBDUUkuIEF1dG8gUmVjb3ZlcnkgYXR0ZW1wdCAjJWxkXG4iLCBwQWQtPlJhbGlua0NvdW50ZXJzLkJhZENRSUF1dG9SZWNvdmVyeUNvdW50KSk7CisJCQlwQWQtPlN0YUNmZy5DQ1hBZGphY2VudEFQUmVwb3J0RmxhZyA9IFRSVUU7CisJCQlwQWQtPlN0YUNmZy5DQ1hBZGphY2VudEFQTGlua0Rvd25UaW1lID0gcEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZTsKKworCQkJLy8gTG9zdCBBUCwgc2VuZCBkaXNjb25uZWN0ICYgbGluayBkb3duIGV2ZW50CisJCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNpZm5kZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApCisJCQl7CisgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgICAgICAgICAgICAgIC8vc2VuZCBkaXNhc3NvY2lhdGUgZXZlbnQgdG8gd3BhX3N1cHBsaWNhbnQKKyAgICAgICAgICAgICAgICBtZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisgICAgICAgICAgICAgICAgd3JxdS5kYXRhLmZsYWdzID0gUlRfRElTQVNTT0NfRVZFTlRfRkxBRzsKKyAgICAgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkNVU1RPTSwgJndycXUsIE5VTEwpOworICAgICAgICAgICAgfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisgICAgICAgICAgICAgICAgbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBNQUNfQUREUl9MRU4pOworICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisJCQlNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKHBBZCk7CisJCX0KKwkJZWxzZSBpZiAoQ1FJX0lTX0JBRChwQWQtPk1sbWUuQ2hhbm5lbFF1YWxpdHkpKQorCQl7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLkJhZENRSUF1dG9SZWNvdmVyeUNvdW50ICsrOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTU1DSEsgLSBCYWQgQ1FJLiBBdXRvIFJlY292ZXJ5IGF0dGVtcHQgIyVsZFxuIiwgcEFkLT5SYWxpbmtDb3VudGVycy5CYWRDUUlBdXRvUmVjb3ZlcnlDb3VudCkpOworCQkJTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRChwQWQpOworCQl9CisKKwkJLy8gQWRkIGF1dG8gc2VhbWxlc3Mgcm9hbWluZworCQlpZiAocEFkLT5TdGFDZmcuYkZhc3RSb2FtaW5nKQorCQl7CisJCQlTSE9SVAlkQm1Ub1JvYW0gPSAoU0hPUlQpcEFkLT5TdGFDZmcuZEJtVG9Sb2FtOworCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSc3NpPSVkLCBkQm1Ub1JvYW09JWRcbiIsIFJUTVBNYXhSc3NpKHBBZCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMiksIChDSEFSKWRCbVRvUm9hbSkpOworCisJCQlpZiAoUlRNUE1heFJzc2kocEFkLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyKSA8PSAoQ0hBUilkQm1Ub1JvYW0pCisJCQl7CisJCQkJTWxtZUNoZWNrRm9yRmFzdFJvYW1pbmcocEFkLCBwQWQtPk1sbWUuTm93MzIpOworCQkJfQorCQl9CisJfQorCWVsc2UgaWYgKEFESE9DX09OKHBBZCkpCisJeworCQkvLyAyMDAzLTA0LTE3IGpvaG4uIHRoaXMgaXMgYSBwYXRjaCB0aGF0IGRyaXZlciBmb3JjZXMgYSBCRUFDT04gb3V0IGlmIEFTSUMgZmFpbHMKKwkJLy8gdGhlICJUWCBCRUFDT04gY29tcGV0aXRpb24iIGZvciB0aGUgZW50aXJlIHBhc3QgMSBzZWMuCisJCS8vIFNvIHRoYXQgZXZlbiB3aGVuIEFTSUMncyBCRUFDT05nZW4gZW5naW5lIGJlZW4gYmxvY2tlZAorCQkvLyBieSBwZWVyJ3MgQkVBQ09OIGR1ZSB0byBzbG93ZXIgc3lzdGVtIGNsb2NrLCB0aGlzIFNUQSBzdGlsbCBjYW4gc2VuZCBvdXQKKwkJLy8gbWluaW11bSBCRUFDT04gdG8gdGVsbCB0aGUgcGVlciBJJ20gYWxpdmUuCisJCS8vIGRyYXdiYWNrIGlzIHRoYXQgdGhpcyBCRUFDT04gd29uJ3QgYmUgd2VsbCBhbGlnbmVkIGF0IFRCVFQgYm91bmRhcnkuCisJCS8vIEVucXVldWVCZWFjb25GcmFtZShwQWQpOwkJCSAgLy8gc29mdHdhcmUgc2VuZCBCRUFDT04KKworCQkvLyBpZiBhbGwgMTFiIHBlZXJzIGxlYXZlIHRoaXMgQlNTIG1vcmUgdGhhbiA1IHNlY29uZHMsIHVwZGF0ZSBUeCByYXRlLAorCQkvLyByZXN0b3JlIG91dGdvaW5nIEJFQUNPTiB0byBzdXBwb3J0IEIvRy1taXhlZCBtb2RlCisJCWlmICgocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA8PSAxNCkJCQkgICAmJgorCQkJKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA8PSBSQVRFXzExKQkgICAmJgorCQkJKHBBZC0+Q29tbW9uQ2ZnLk1heERlc2lyZWRSYXRlID4gUkFURV8xMSkgICYmCisJCQkoKHBBZC0+U3RhQ2ZnLkxhc3QxMWJCZWFjb25SeFRpbWUgKyA1Kk9TX0haKSA8IHBBZC0+TWxtZS5Ob3czMikpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gbGFzdCAxMUIgcGVlciBsZWZ0LCB1cGRhdGUgVHggcmF0ZXNcbiIpKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQWN0aXZlLlN1cFJhdGUsIHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKwkJCXBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gPSBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuOworCQkJTWxtZVVwZGF0ZVR4UmF0ZXMocEFkLCBGQUxTRSwgMCk7CisJCQlNYWtlSWJzc0JlYWNvbihwQWQpOwkJLy8gcmUtYnVpbGQgQkVBQ09OIGZyYW1lCisJCQlBc2ljRW5hYmxlSWJzc1N5bmMocEFkKTsJLy8gY29weSB0byBvbi1jaGlwIG1lbW9yeQorCQkJcEFkLT5TdGFDZmcuQWRob2NCT25seUpvaW5lZCA9IEZBTFNFOworCQl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkKKwkJeworCQkJaWYgKChwQWQtPlN0YUNmZy5BZGhvY0JHSm9pbmVkKSAmJgorCQkJCSgocEFkLT5TdGFDZmcuTGFzdDExZ0JlYWNvblJ4VGltZSArIDUgKiBPU19IWikgPCBwQWQtPk1sbWUuTm93MzIpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gbGFzdCAxMUcgcGVlciBsZWZ0XG4iKSk7CisJCQkJcEFkLT5TdGFDZmcuQWRob2NCR0pvaW5lZCA9IEZBTFNFOworCQkJfQorCisJCQlpZiAoKHBBZC0+U3RhQ2ZnLkFkaG9jMjBOSm9pbmVkKSAmJgorCQkJCSgocEFkLT5TdGFDZmcuTGFzdDIwTkJlYWNvblJ4VGltZSArIDUgKiBPU19IWikgPCBwQWQtPk1sbWUuTm93MzIpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gbGFzdCAyME1IeiBOIHBlZXIgbGVmdFxuIikpOworCQkJCXBBZC0+U3RhQ2ZnLkFkaG9jMjBOSm9pbmVkID0gRkFMU0U7CisJCQl9CisJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkvL3JhZGFyIGRldGVjdAorCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKKwkJCSYmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKQorCQkJJiYgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSkKKwkJeworCQkJUmFkYXJEZXRlY3RQZXJpb2RpYyhwQWQpOworCQl9CisKKwkJLy8gSWYgYWxsIHBlZXJzIGxlYXZlLCBhbmQgdGhpcyBTVEEgYmVjb21lcyB0aGUgbGFzdCBvbmUgaW4gdGhpcyBJQlNTLCB0aGVuIGNoYW5nZSBNZWRpYVN0YXRlCisJCS8vIHRvIERJU0NPTk5FQ1RFRC4gQnV0IHN0aWxsIGhvbGRpbmcgdGhpcyBJQlNTIChpLmUuIHNlbmRpbmcgQkVBQ09OKSBzbyB0aGF0IG90aGVyIFNUQXMgY2FuCisJCS8vIGpvaW4gbGF0ZXIuCisJCWlmICgocEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSArIEFESE9DX0JFQUNPTl9MT1NUX1RJTUUgPCBwQWQtPk1sbWUuTm93MzIpICYmCisJCQlPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJCXsKKwkJCU1MTUVfU1RBUlRfUkVRX1NUUlVDVCAgICAgU3RhcnRSZXE7CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gZXhjZXNzaXZlIEJFQUNPTiBsb3N0LCBsYXN0IFNUQSBpbiB0aGlzIElCU1MsIE1lZGlhU3RhdGU9RGlzY29ubmVjdGVkXG4iKSk7CisJCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKKworCQkJU3RhcnRQYXJtRmlsbChwQWQsICZTdGFydFJlcSwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TVEFSVF9SRVEsIHNpemVvZihNTE1FX1NUQVJUX1JFUV9TVFJVQ1QpLCAmU3RhcnRSZXEpOworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9TVEFSVDsKKwkJfQorCX0KKwllbHNlIC8vIG5vIElORlJBIG5vciBBREhPQyBjb25uZWN0aW9uCisJeworCisJCWlmIChwQWQtPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJICYmCisgICAgICAgICAgICAoKHBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSArIDMwICogT1NfSFopID4gcEFkLT5NbG1lLk5vdzMyKSkKKwkJCWdvdG8gU0tJUF9BVVRPX1NDQU5fQ09OTjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOworCisJCWlmICgocEFkLT5TdGFDZmcuYkF1dG9SZWNvbm5lY3QgPT0gVFJVRSkKKwkJCSYmIFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkKKwkJCSYmIChNbG1lVmFsaWRhdGVTU0lEKHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKSA9PSBUUlVFKSkKKwkJeworCQkJaWYgKChwQWQtPlNjYW5UYWIuQnNzTnI9PTApICYmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkpCisJCQl7CisJCQkJTUxNRV9TQ0FOX1JFUV9TVFJVQ1QJICAgU2NhblJlcTsKKworCQkJCWlmICgocEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lICsgMTAgKiBPU19IWikgPCBwQWQtPk1sbWUuTm93MzIpCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTVEFNbG1lUGVyaW9kaWNFeGVjKCk6Q05UTCAtIFNjYW5UYWIuQnNzTnI9PTAsIHN0YXJ0IGEgbmV3IEFDVElWRSBzY2FuIFNTSURbJXNdXG4iLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQpKTsKKwkJCQkJU2NhblBhcm1GaWxsKHBBZCwgJlNjYW5SZXEsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuLCBCU1NfQU5ZLCBTQ0FOX0FDVElWRSk7CisJCQkJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TQ0FOX1JFUSwgc2l6ZW9mKE1MTUVfU0NBTl9SRVFfU1RSVUNUKSwgJlNjYW5SZXEpOworCQkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47CisJCQkJCS8vIFJlc2V0IE1pc3NlZCBzY2FuIG51bWJlcgorCQkJCQlwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgPSBwQWQtPk1sbWUuTm93MzI7CisJCQkJfQorCQkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKQkvLyBRdWl0IHRoZSBmb3JldmVyIHNjYW4gd2hlbiBpbiBhIHZlcnkgY2xlYW4gcm9vbQorCQkJCQlNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKHBBZCk7CisJCQl9CisJCQllbHNlIGlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkKKwkJCXsKKwkJCQlpZiAoKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgNykgPT0gMCkKKwkJCQl7CisJCQkJCU1sbWVBdXRvU2NhbihwQWQpOworCQkJCQlwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgPSBwQWQtPk1sbWUuTm93MzI7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLyBSb2dlciBzeW5jIENhcnJpZXIKKwkJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID09IFRSVUUpCisJCQkJCXsKKwkJCQkJCWlmICgocEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgJSA1KSA9PSAxKQorCQkJCQkJCU1sbWVBdXRvUmVjb25uZWN0TGFzdFNTSUQocEFkKTsKKwkJCQkJfQorCQkJCQllbHNlCisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworCQkJCQkJTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRChwQWQpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworU0tJUF9BVVRPX1NDQU5fQ09OTjoKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgIGlmICgocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5UWEJBYml0bWFwICE9MCkgJiYgKHBBZC0+TWFjVGFiLmZBbnlCQVNlc3Npb24gPT0gRkFMU0UpKQorCXsKKwkJcEFkLT5NYWNUYWIuZkFueUJBU2Vzc2lvbiA9IFRSVUU7CisJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgSFRfRk9SQ0VSVFNDVFMsICBBTExOX1NFVFBST1RFQ1QsIEZBTFNFLCBGQUxTRSk7CisJfQorCWVsc2UgaWYgKChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlRYQkFiaXRtYXAgPT0wKSAmJiAocEFkLT5NYWNUYWIuZkFueUJBU2Vzc2lvbiA9PSBUUlVFKSkKKwl7CisJCXBBZC0+TWFjVGFiLmZBbnlCQVNlc3Npb24gPSBGQUxTRTsKKwkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCAgQUxMTl9TRVRQUk9URUNULCBGQUxTRSwgRkFMU0UpOworCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisjaWZkZWYgRE9UMTFOX0RSQUZUMworCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NDQU5fMjA0MCkpCisJCVRyaUV2ZW50Q291bnRlck1haW50ZW5hbmNlKHBBZCk7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJcmV0dXJuOworfQorCisvLyBMaW5rIGRvd24gcmVwb3J0CitWT0lEIExpbmtEb3duRXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisKKwlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisKKwlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOworCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CisgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKK30KKworLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCitWT0lEIE1sbWVBdXRvU2NhbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwkvLyBjaGVjayBDbnRsTWFjaGluZS5DdXJyU3RhdGUgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggTkRJUyBTZXRPSUQgcmVxdWVzdAorCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gRHJpdmVyIGF1dG8gc2NhblxuIikpOworCQlNbG1lRW5xdWV1ZShwQWQsCisJCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJCQlPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTiwKKwkJCQkJMCwKKwkJCQkJTlVMTCk7CisJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwl9Cit9CisKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRCBNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCisKKwkvLyBjaGVjayBDbnRsTWFjaGluZS5DdXJyU3RhdGUgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggTkRJUyBTZXRPSUQgcmVxdWVzdAorCWlmICgocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpICYmCisJCShNbG1lVmFsaWRhdGVTU0lEKHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKSA9PSBUUlVFKSkKKwl7CisJCU5ESVNfODAyXzExX1NTSUQgT2lkU3NpZDsKKwkJT2lkU3NpZC5Tc2lkTGVuZ3RoID0gcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuOworCQlOZGlzTW92ZU1lbW9yeShPaWRTc2lkLlNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEcml2ZXIgYXV0byByZWNvbm5lY3QgdG8gbGFzdCBPSURfODAyXzExX1NTSUQgc2V0dGluZyAtICVzLCBsZW4gLSAlZFxuIiwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pKTsKKwkJTWxtZUVucXVldWUocEFkLAorCQkJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCQkJT0lEXzgwMl8xMV9TU0lELAorCQkJCQlzaXplb2YoTkRJU184MDJfMTFfU1NJRCksCisJCQkJCSZPaWRTc2lkKTsKKwkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCX0KK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCVZhbGlkYXRlIFNTSUQgZm9yIGNvbm5lY3Rpb24gdHJ5IGFuZCByZXNjYW4gcHVycG9zZQorCVZhbGlkIFNTSUQgd2lsbCBoYXZlIHZpc2libGUgY2hhcnMgb25seS4KKwlUaGUgdmFsaWQgbGVuZ3RoIGlzIGZyb20gMCB0byAzMi4KKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIE1sbWVWYWxpZGF0ZVNTSUQoCisJSU4gUFVDSEFSCXBTc2lkLAorCUlOIFVDSEFSCVNzaWRMZW4pCit7CisJaW50CWluZGV4OworCisJaWYgKFNzaWRMZW4gPiBNQVhfTEVOX09GX1NTSUQpCisJCXJldHVybiAoRkFMU0UpOworCisJLy8gQ2hlY2sgZWFjaCBjaGFyYWN0ZXIgdmFsdWUKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBTc2lkTGVuOyBpbmRleCsrKQorCXsKKwkJaWYgKHBTc2lkW2luZGV4XSA8IDB4MjApCisJCQlyZXR1cm4gKEZBTFNFKTsKKwl9CisKKwkvLyBBbGwgY2hlY2tlZAorCXJldHVybiAoVFJVRSk7Cit9CisKK1ZPSUQgTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKAorCUlOIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiBQTUFDX1RBQkxFX0VOVFJZCQlwRW50cnksCisJSU4gUFVDSEFSCQkJCSpwcFRhYmxlLAorCUlOIFBVQ0hBUgkJCQlwVGFibGVTaXplLAorCUlOIFBVQ0hBUgkJCQlwSW5pdFR4UmF0ZUlkeCkKK3sKKwlkbworCXsKKwkJLy8gZGVjaWRlIHRoZSByYXRlIHRhYmxlIGZvciB0dW5pbmcKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZVRhYmxlU2l6ZSA+IDApCisJCXsKKwkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlOworCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGVbMF07CisJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGVbMV07CisKKwkJCWJyZWFrOworCQl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJiBBREhPQ19PTihwQWQpKQorCQl7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkgJiYKKwkJCQkhcEFkLT5TdGFDZmcuQWRob2NCT25seUpvaW5lZCAmJgorCQkJCSFwQWQtPlN0YUNmZy5BZGhvY0JHSm9pbmVkICYmCisJCQkJKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDB4ZmYpICYmCisJCQkJKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAweDAwKSB8fCAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKSkpCisJCQl7Ly8gMTFOIDFTIEFkaG9jCisJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4xUzsKKwkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTWzBdOworCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTWzFdOworCisJCQl9CisJCQllbHNlIGlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSAmJgorCQkJCQkhcEFkLT5TdGFDZmcuQWRob2NCT25seUpvaW5lZCAmJgorCQkJCQkhcEFkLT5TdGFDZmcuQWRob2NCR0pvaW5lZCAmJgorCQkJCQkocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMHhmZikgJiYKKwkJCQkJKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDB4ZmYpICYmCisJCQkJCShwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpKQorCQkJey8vIDExTiAyUyBBZGhvYworCQkJCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpCisJCQkJeworCQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTOworCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTWzBdOworCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4yU1sxXTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kOworCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbMF07CisJCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbMV07CisJCQkJfQorCisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikKKwkJCXsKKwkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQjsKKwkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQlswXTsKKwkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJbMV07CisKKwkJCX0KKwkgICAgICAgIGVsc2UgaWYoKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkgJiYgKHBBZC0+U3RhQ2ZnLkFkaG9jQk9ubHlKb2luZWQgPT0gVFJVRSkpCisJCQl7CisJCQkJLy8gVVNlIEIgVGFibGUgd2hlbiBPbmx5IGItb25seSBTdGF0aW9uIGluIG15IElCU1MgLgorCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCOworCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFCWzBdOworCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQlsxXTsKKworCQkJfQorCQkJZWxzZSBpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQorCQkJeworCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCRzsKKwkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdbMF07CisJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCR1sxXTsKKworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFHOworCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFHWzBdOworCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExR1sxXTsKKworCQkJfQorCQkJYnJlYWs7CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAoKHBFbnRyeS0+UmF0ZUxlbiA9PSAxMikgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJgorCQkJKChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMHgwMCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDEpKSkKKwkJey8vIDExQkdOIDFTIEFQCisJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMVM7CisJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMVNbMF07CisJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJHTjFTWzFdOworCisJCQlicmVhazsKKwkJfQorCisJCWlmICgocEVudHJ5LT5SYXRlTGVuID09IDEyKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDB4ZmYpICYmCisJCQkocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4ZmYpICYmIChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAyKSkKKwkJey8vIDExQkdOIDJTIEFQCisJCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQorCQkJeworCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yUzsKKwkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNbMF07CisJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yU1sxXTsKKworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yU0ZvckFCYW5kOworCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yU0ZvckFCYW5kWzBdOworCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNGb3JBQmFuZFsxXTsKKworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQlpZiAoKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJiAoKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAweDAwKSB8fCAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMSkpKQorCQl7Ly8gMTFOIDFTIEFQCisJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTOworCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4xU1swXTsKKwkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTWzFdOworCisJCQlicmVhazsKKwkJfQorCisJCWlmICgocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDB4ZmYpICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMHhmZikgJiYgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDIpKQorCQl7Ly8gMTFOIDJTIEFQCisJCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQorCQkJeworCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4yUzsKKwkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMF07CisJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4yU1sxXTsKKyAgICAgICAgICAgIH0KKwkJCWVsc2UKKwkJCXsKKwkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmQ7CisJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzBdOworCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbMV07CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCS8vZWxzZSBpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gPT0gNCkgJiYgKHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4gPT0gMCkgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDApICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAwKSkKKwkJaWYgKChwRW50cnktPlJhdGVMZW4gPT0gNCkKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCSYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAwKQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJKQorCQl7Ly8gQiBvbmx5IEFQCisJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQjsKKwkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFCWzBdOworCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCWzFdOworCisJCQlicmVhazsKKwkJfQorCisJCS8vZWxzZSBpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gKyBwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuID4gOCkgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDApICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAwKSkKKwkJaWYgKChwRW50cnktPlJhdGVMZW4gPiA4KQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAwKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDApCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkpCisJCXsvLyBCL0cgIG1peGVkIEFQCisJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkc7CisJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdbMF07CisJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJHWzFdOworCisJCQlicmVhazsKKwkJfQorCisJCS8vZWxzZSBpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gKyBwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuID09IDgpICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSA9PSAwKSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMCkpCisJCWlmICgocEVudHJ5LT5SYXRlTGVuID09IDgpCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDApICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMCkKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCSkKKwkJey8vIEcgb25seSBBUAorCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUc7CisJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExR1swXTsKKwkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExR1sxXTsKKworCQkJYnJlYWs7CisJCX0KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkvL2Vsc2UgaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSA9PSAwKSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMCkpCisJCQlpZiAoKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAwKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDApKQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJewkvLyBMZWdhY3kgbW9kZQorCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPD0gUkFURV8xMSkKKwkJCQl7CisJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCOworCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQlswXTsKKwkJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCWzFdOworCQkJCX0KKwkJCQllbHNlIGlmICgocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlID4gUkFURV8xMSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZSA+IFJBVEVfMTEpKQorCQkJCXsKKwkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUc7CisJCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFHWzBdOworCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUdbMV07CisKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUJHOworCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdbMF07CisJCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQkdbMV07CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKKwkJCXsKKwkJCQlpZiAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMSkKKwkJCQl7CisJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVM7CisJCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVNbMF07CisJCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTWzFdOworCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJEUlM6IHVua293biBtb2RlLGRlZmF1bHQgdXNlIDExTiAxUyBBUCBcbiIpKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4yUzsKKwkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU1swXTsKKwkJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMV07CisJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwoIkRSUzogdW5rb3duIG1vZGUsZGVmYXVsdCB1c2UgMTFOIDJTIEFQIFxuIikpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMSkKKwkJCQl7CisJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVM7CisJCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVNbMF07CisJCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTWzFdOworCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJEUlM6IHVua293biBtb2RlLGRlZmF1bHQgdXNlIDExTiAxUyBBUCBcbiIpKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kOworCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbMF07CisJCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbMV07CisJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwoIkRSUzogdW5rb3duIG1vZGUsZGVmYXVsdCB1c2UgMTFOIDJTIEFQIFxuIikpOworCQkJCX0KKwkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwoIkRSUzogdW5rb3duIG1vZGUgKFN1cFJhdGVMZW49JWQsIEV4dFJhdGVMZW49JWQsIE1DU1NldFswXT0weCV4LCBNQ1NTZXRbMV09MHgleClcbiIsCisJCQkJcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiwgcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiwgcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0sIHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdKSk7CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl9IHdoaWxlKEZBTFNFKTsKK30KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIHJvdXRpbmUgY2hlY2tzIGlmIHRoZXJlJ3JlIG90aGVyIEFQcyBvdXQgdGhlcmUgY2FwYWJsZSBmb3IKKwkJcm9hbWluZy4gQ2FsbGVyIHNob3VsZCBjYWxsIHRoaXMgcm91dGluZSBvbmx5IHdoZW4gTGluayB1cCBpbiBJTkZSQSBtb2RlCisJCWFuZCBjaGFubmVsIHF1YWxpdHkgaXMgYmVsb3cgQ1FJX0dPT0RfVEhSRVNIT0xELgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlPdXRwdXQ6CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lQ2hlY2tGb3JSb2FtaW5nKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVMT05HCU5vdzMyKQoreworCVVTSE9SVAkgICBpOworCUJTU19UQUJMRSAgKnBSb2FtVGFiID0gJnBBZC0+TWxtZUF1eC5Sb2FtVGFiOworCUJTU19FTlRSWSAgKnBCc3M7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gTWxtZUNoZWNrRm9yUm9hbWluZ1xuIikpOworCS8vIHB1dCBhbGwgcm9hbWluZyBjYW5kaWRhdGVzIGludG8gUm9hbVRhYiwgYW5kIHNvcnQgaW4gUlNTSSBvcmRlcgorCUJzc1RhYmxlSW5pdChwUm9hbVRhYik7CisJZm9yIChpID0gMDsgaSA8IHBBZC0+U2NhblRhYi5Cc3NOcjsgaSsrKQorCXsKKwkJcEJzcyA9ICZwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV07CisKKwkJaWYgKChwQnNzLT5MYXN0QmVhY29uUnhUaW1lICsgQkVBQ09OX0xPU1RfVElNRSkgPCBOb3czMikKKwkJCWNvbnRpbnVlOwkgLy8gQVAgZGlzYXBwZWFyCisJCWlmIChwQnNzLT5Sc3NpIDw9IFJTU0lfVEhSRVNIT0xEX0ZPUl9ST0FNSU5HKQorCQkJY29udGludWU7CSAvLyBSU1NJIHRvbyB3ZWFrLiBmb3JnZXQgaXQuCisJCWlmIChNQUNfQUREUl9FUVVBTChwQnNzLT5Cc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpKQorCQkJY29udGludWU7CSAvLyBza2lwIGN1cnJlbnQgQVAKKwkJaWYgKHBCc3MtPlJzc2kgPCAocEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAgKyBSU1NJX0RFTFRBKSkKKwkJCWNvbnRpbnVlOwkgLy8gb25seSBBUCB3aXRoIHN0cm9uZ2VyIFJTU0kgaXMgZWxpZ2libGUgZm9yIHJvYW1pbmcKKworCQkvLyBBUCBwYXNzaW5nIGFsbCBhYm92ZSBydWxlcyBpcyBwdXQgaW50byByb2FtaW5nIGNhbmRpZGF0ZSB0YWJsZQorCQlOZGlzTW92ZU1lbW9yeSgmcFJvYW1UYWItPkJzc0VudHJ5W3BSb2FtVGFiLT5Cc3NOcl0sIHBCc3MsIHNpemVvZihCU1NfRU5UUlkpKTsKKwkJcFJvYW1UYWItPkJzc05yICs9IDE7CisJfQorCisJaWYgKHBSb2FtVGFiLT5Cc3NOciA+IDApCisJeworCQkvLyBjaGVjayBDbnRsTWFjaGluZS5DdXJyU3RhdGUgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggTkRJUyBTZXRPSUQgcmVxdWVzdAorCQlpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpCisJCXsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuUG9vckNRSVJvYW1pbmdDb3VudCArKzsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gUm9hbWluZyBhdHRlbXB0ICMlbGRcbiIsIHBBZC0+UmFsaW5rQ291bnRlcnMuUG9vckNRSVJvYW1pbmdDb3VudCkpOworCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfUk9BTUlOR19SRVEsIDAsIE5VTEwpOworCQkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCQl9CisJfQorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBNbG1lQ2hlY2tGb3JSb2FtaW5nKCMgb2YgY2FuZGlkYXRlPSAlZClcbiIscFJvYW1UYWItPkJzc05yKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIGNoZWNrcyBpZiB0aGVyZSdyZSBvdGhlciBBUHMgb3V0IHRoZXJlIGNhcGFibGUgZm9yCisJCXJvYW1pbmcuIENhbGxlciBzaG91bGQgY2FsbCB0aGlzIHJvdXRpbmUgb25seSB3aGVuIGxpbmsgdXAgaW4gSU5GUkEgbW9kZQorCQlhbmQgY2hhbm5lbCBxdWFsaXR5IGlzIGJlbG93IENRSV9HT09EX1RIUkVTSE9MRC4KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJT3V0cHV0OgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZUNoZWNrRm9yRmFzdFJvYW1pbmcoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUxPTkcJCQlOb3cpCit7CisJVVNIT1JUCQlpOworCUJTU19UQUJMRQkqcFJvYW1UYWIgPSAmcEFkLT5NbG1lQXV4LlJvYW1UYWI7CisJQlNTX0VOVFJZCSpwQnNzOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IE1sbWVDaGVja0ZvckZhc3RSb2FtaW5nXG4iKSk7CisJLy8gcHV0IGFsbCByb2FtaW5nIGNhbmRpZGF0ZXMgaW50byBSb2FtVGFiLCBhbmQgc29ydCBpbiBSU1NJIG9yZGVyCisJQnNzVGFibGVJbml0KHBSb2FtVGFiKTsKKwlmb3IgKGkgPSAwOyBpIDwgcEFkLT5TY2FuVGFiLkJzc05yOyBpKyspCisJeworCQlwQnNzID0gJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXTsKKworICAgICAgICBpZiAoKHBCc3MtPlJzc2kgPD0gLTUwKSAmJiAocEJzcy0+Q2hhbm5lbCA9PSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSkKKwkJCWNvbnRpbnVlOwkgLy8gUlNTSSB0b28gd2Vhay4gZm9yZ2V0IGl0LgorCQlpZiAoTUFDX0FERFJfRVFVQUwocEJzcy0+QnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKSkKKwkJCWNvbnRpbnVlOwkgLy8gc2tpcCBjdXJyZW50IEFQCisJCWlmICghU1NJRF9FUVVBTChwQnNzLT5Tc2lkLCBwQnNzLT5Tc2lkTGVuLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuKSkKKwkJCWNvbnRpbnVlOwkgLy8gc2tpcCBkaWZmZXJlbnQgU1NJRAorICAgICAgICBpZiAocEJzcy0+UnNzaSA8IChSVE1QTWF4UnNzaShwQWQsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMSwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIpICsgUlNTSV9ERUxUQSkpCisJCQljb250aW51ZTsJIC8vIHNraXAgQVAgd2l0aG91dCBiZXR0ZXIgUlNTSQorCisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkxhc3RSc3NpMCA9ICVkLCBwQnNzLT5Sc3NpID0gJWRcbiIsIFJUTVBNYXhSc3NpKHBBZCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMiksIHBCc3MtPlJzc2kpKTsKKwkJLy8gQVAgcGFzc2luZyBhbGwgYWJvdmUgcnVsZXMgaXMgcHV0IGludG8gcm9hbWluZyBjYW5kaWRhdGUgdGFibGUKKwkJTmRpc01vdmVNZW1vcnkoJnBSb2FtVGFiLT5Cc3NFbnRyeVtwUm9hbVRhYi0+QnNzTnJdLCBwQnNzLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJCXBSb2FtVGFiLT5Cc3NOciArPSAxOworCX0KKworCWlmIChwUm9hbVRhYi0+QnNzTnIgPiAwKQorCXsKKwkJLy8gY2hlY2sgQ250bE1hY2hpbmUuQ3VyclN0YXRlIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIE5ESVMgU2V0T0lEIHJlcXVlc3QKKwkJaWYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPT0gQ05UTF9JRExFKQorCQl7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLlBvb3JDUUlSb2FtaW5nQ291bnQgKys7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIFJvYW1pbmcgYXR0ZW1wdCAjJWxkXG4iLCBwQWQtPlJhbGlua0NvdW50ZXJzLlBvb3JDUUlSb2FtaW5nQ291bnQpKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1JPQU1JTkdfUkVRLCAwLCBOVUxMKTsKKwkJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwkJfQorCX0KKwkvLyBNYXliZSBzaXRlIHN1cnZleSByZXF1aXJlZAorCWVsc2UKKwl7CisJCWlmICgocEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lICsgMTAgKiAxMDAwKSA8IE5vdykKKwkJeworCQkJLy8gY2hlY2sgQ250bE1hY2hpbmUuQ3VyclN0YXRlIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIE5ESVMgU2V0T0lEIHJlcXVlc3QKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gUm9hbWluZywgTm8gZWxpZ2FibGUgZW50cnksIHRyeSBuZXcgc2NhbiFcbiIpKTsKKwkJCXBBZC0+U3RhQ2ZnLlNjYW5DbnQgPSAyOworCQkJcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gTm93OworCQkJTWxtZUF1dG9TY2FuKHBBZCk7CisJCX0KKwl9CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gTWxtZUNoZWNrRm9yRmFzdFJvYW1pbmcgKEJzc05yPSVkKVxuIiwgcFJvYW1UYWItPkJzc05yKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIGNhbGN1bGF0ZXMgVHhQRVIsIFJ4UEVSIG9mIHRoZSBwYXN0IE4tc2VjIHBlcmlvZC4gQW5kCisJCWFjY29yZGluZyB0byB0aGUgY2FsY3VsYXRpb24gcmVzdWx0LCBDaGFubmVsUXVhbGl0eSBpcyBjYWxjdWxhdGVkIGhlcmUKKwkJdG8gZGVjaWRlIGlmIGN1cnJlbnQgQVAgaXMgc3RpbGwgZG9pbmcgdGhlIGpvYi4KKworCQlJZiBDaGFubmVsUXVhbGl0eSBpcyBub3QgZ29vZCwgYSBST0FNaW5nIGF0dGVtcHQgbWF5IGJlIHRyaWVkIGxhdGVyLgorCU91dHB1dDoKKwkJU3RhQ2ZnLkNoYW5uZWxRdWFsaXR5IC0gMC4uMTAwCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5PVEU6IFRoaXMgcm91dGluZSBkZWNpZGUgY2hhbm5sZSBxdWFsaXR5IGJhc2VkIG9uIFJYIENSQyBlcnJvciByYXRpby4KKwkJQ2FsbGVyIHNob3VsZCBtYWtlIHN1cmUgYSBmdW5jdGlvbiBjYWxsIHRvIE5JQ1VwZGF0ZVJhd0NvdW50ZXJzKHBBZCkKKwkJaXMgcGVyZm9ybWVkIHJpZ2h0IGJlZm9yZSB0aGlzIHJvdXRpbmUsIHNvIHRoYXQgdGhpcyByb3V0aW5lIGNhbiBkZWNpZGUKKwkJY2hhbm5lbCBxdWFsaXR5IGJhc2VkIG9uIHRoZSBtb3N0IHVwLXRvLWRhdGUgaW5mb3JtYXRpb24KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVDYWxjdWxhdGVDaGFubmVsUXVhbGl0eSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVTE9ORyBOb3czMikKK3sKKwlVTE9ORyBUeE9rQ250LCBUeENudCwgVHhQRVIsIFR4UFJSOworCVVMT05HIFJ4Q250LCBSeFBFUjsKKwlVQ0hBUiBOb3JSc3NpOworCUNIQVIgIE1heFJzc2k7CisJVUxPTkcgQmVhY29uTG9zdFRpbWUgPSBCRUFDT05fTE9TVF9USU1FOworCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLyBSb2dlciBzeW5jIENhcnJpZXIKKwkvLyBsb25nZXIgYmVhY29uIGxvc3QgdGltZSB3aGVuIGNhcnJpZXIgZGV0ZWN0aW9uIGVuYWJsZWQKKwlpZiAocEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPT0gVFJVRSkKKwl7CisJCUJlYWNvbkxvc3RUaW1lID0gQkVBQ09OX0xPU1RfVElNRSArIEJFQUNPTl9MT1NUX1RJTUUvMjsKKwl9CisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworCisJTWF4UnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMik7CisKKwkvLworCS8vIGNhbGN1bGF0ZSBUWCBwYWNrZXQgZXJyb3IgcmF0aW8gYW5kIFRYIHJldHJ5IHJhdGlvIC0gaWYgdG9vIGZldyBUWCBzYW1wbGVzLCBza2lwIFRYIHJlbGF0ZWQgc3RhdGlzdGljcworCS8vCisJVHhPa0NudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQ7CisJVHhDbnQgPSBUeE9rQ250ICsgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudDsKKwlpZiAoVHhDbnQgPCA1KQorCXsKKwkJVHhQRVIgPSAwOworCQlUeFBSUiA9IDA7CisJfQorCWVsc2UKKwl7CisJCVR4UEVSID0gKHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQgKiAxMDApIC8gVHhDbnQ7CisJCVR4UFJSID0gKChUeENudCAtIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCkgKiAxMDApIC8gVHhDbnQ7CisJfQorCisJLy8KKwkvLyBjYWxjdWxhdGUgUlggUEVSIC0gZG9uJ3QgdGFrZSBSeFBFUiBpbnRvIGNvbnNpZGVyYXRpb24gaWYgdG9vIGZldyBzYW1wbGUKKwkvLworCVJ4Q250ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeE9rQ250ICsgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeEZjc0VyckNudDsKKwlpZiAoUnhDbnQgPCA1KQorCQlSeFBFUiA9IDA7CisJZWxzZQorCQlSeFBFUiA9IChwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4RmNzRXJyQ250ICogMTAwKSAvIFJ4Q250OworCisJLy8KKwkvLyBkZWNpZGUgQ2hhbm5lbFF1YWxpdHkgYmFzZWQgb246IDEpbGFzdCBCRUFDT04gcmVjZWl2ZWQgdGltZSwgMilsYXN0IFJTU0ksIDMpVHhQRVIsIGFuZCA0KVJ4UEVSCisJLy8KKwlpZiAoSU5GUkFfT04ocEFkKSAmJgorCQkocEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50IDwgMikgJiYgLy8gbm8gaGVhdnkgdHJhZmZpYworCQkocEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSArIEJlYWNvbkxvc3RUaW1lIDwgTm93MzIpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkVBQ09OIGxvc3QgPiAlbGQgbXNlYyB3aXRoIFR4T2tDbnQ9JWxkIC0+IENRST0wXG4iLCBCZWFjb25Mb3N0VGltZSwgVHhPa0NudCkpOworCQlwQWQtPk1sbWUuQ2hhbm5lbFF1YWxpdHkgPSAwOworCX0KKwllbHNlCisJeworCQkvLyBOb3JtYWxpemUgUnNzaQorCQlpZiAoTWF4UnNzaSA+IC00MCkKKwkJCU5vclJzc2kgPSAxMDA7CisJCWVsc2UgaWYgKE1heFJzc2kgPCAtOTApCisJCQlOb3JSc3NpID0gMDsKKwkJZWxzZQorCQkJTm9yUnNzaSA9IChNYXhSc3NpICsgOTApICogMjsKKworCQkvLyBDaGFubmVsUXVhbGl0eSA9IFcxKlJTU0kgKyBXMipUeFBSUiArIFczKlJ4UEVSCSAoUlNTSSAwLi4xMDApLCAoVHhQRVIgMTAwLi4wKSwgKFJ4UEVSIDEwMC4uMCkKKwkJcEFkLT5NbG1lLkNoYW5uZWxRdWFsaXR5ID0gKFJTU0lfV0VJR0hUSU5HICogTm9yUnNzaSArCisJCQkJCQkJCSAgIFRYX1dFSUdIVElORyAqICgxMDAgLSBUeFBSUikgKworCQkJCQkJCQkgICBSWF9XRUlHSFRJTkcqICgxMDAgLSBSeFBFUikpIC8gMTAwOworCQlpZiAocEFkLT5NbG1lLkNoYW5uZWxRdWFsaXR5ID49IDEwMCkKKwkJCXBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSA9IDEwMDsKKwl9CisKK30KKworVk9JRCBNbG1lU2V0VHhSYXRlKAorCUlOIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiBQTUFDX1RBQkxFX0VOVFJZCQlwRW50cnksCisJSU4gUFJUTVBfVFhfUkFURV9TV0lUQ0gJcFR4UmF0ZSkKK3sKKwlVQ0hBUglNYXhNb2RlID0gTU9ERV9PRkRNOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJTWF4TW9kZSA9IE1PREVfSFRHUkVFTkZJRUxEOworCisJaWYgKHBUeFJhdGUtPlNUQkMgJiYgKHBBZC0+U3RhQ2ZnLk1heEhUUGh5TW9kZS5maWVsZC5TVEJDKSAmJiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKSkKKwkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNUQkMgPSBTVEJDX1VTRTsKKwllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TVEJDID0gU1RCQ19OT05FOworCisJaWYgKHBUeFJhdGUtPkN1cnJNQ1MgPCBNQ1NfQVVUTykKKwkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBUeFJhdGUtPkN1cnJNQ1M7CisKKwlpZiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyA+IDcpCisJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TVEJDID0gU1RCQ19OT05FOworCisgICAJaWYgKEFESE9DX09OKHBBZCkpCisJeworCQkvLyBJZiBwZWVyIGFkaG9jIGlzIGItb25seSBtb2RlLCB3ZSBjYW4ndCBzZW5kIDExZyByYXRlLgorCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IEdJXzgwMDsKKwkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU1RCQwk9IFNUQkNfTk9ORTsKKworCQkvLworCQkvLyBGb3IgQWRob2MgTU9ERV9DQ0ssIGRyaXZlciB3aWxsIHVzZSBBZGhvY0JPbmx5Sm9pbmVkIGZsYWcgdG8gcm9sbCBiYWNrIHRvIEIgb25seSBpZiBuZWNlc3NhcnkKKwkJLy8KKwkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERQk9IHBUeFJhdGUtPk1vZGU7CisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSTsKKwkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisKKwkJLy8gUGF0Y2ggc3BlZWQgZXJyb3IgaW4gc3RhdHVzIHBhZ2UKKwkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFOworCX0KKwllbHNlCisJeworCQlpZiAocFR4UmF0ZS0+TW9kZSA8PSBNYXhNb2RlKQorCQkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBwVHhSYXRlLT5Nb2RlOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWlmIChwVHhSYXRlLT5TaG9ydEdJICYmIChwQWQtPlN0YUNmZy5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSkpCisJCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IEdJXzQwMDsKKwkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJLy8gUmVleGFtIGVhY2ggYmFuZHdpZHRoJ3MgU0dJIHN1cHBvcnQuCisJCWlmIChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9PSBHSV80MDApCisJCXsKKwkJCWlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuQlcgPT0gQldfMjApICYmICghQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0kyMF9DQVBBQkxFKSkpCisJCQkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7CisJCQlpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLkJXID09IEJXXzQwKSAmJiAoIUNMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJNDBfQ0FQQUJMRSkpKQorCQkJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gR0lfODAwOworCQl9CisKKwkJLy8gVHVybiBSVFMvQ1RTIHJhdGUgdG8gNk1icHMuCisJCWlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID09IDApICYmIChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTICE9IDApKQorCQl7CisJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MJCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKKwkJCWlmIChwQWQtPk1hY1RhYi5mQW55QkFTZXNzaW9uKQorCQkJeworCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgSFRfRk9SQ0VSVFNDVFMsIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwgKEJPT0xFQU4pcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCBBTExOX1NFVFBST1RFQ1QsIFRSVUUsIChCT09MRUFOKXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQpOworCQkJfQorCQl9CisJCWVsc2UgaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPT0gOCkgJiYgKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgIT0gOCkpCisJCXsKKwkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUwkJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOworCQkJaWYgKHBBZC0+TWFjVGFiLmZBbnlCQVNlc3Npb24pCisJCQl7CisJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBIVF9GT1JDRVJUU0NUUywgQUxMTl9TRVRQUk9URUNULCBUUlVFLCAoQk9PTEVBTilwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50KTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwgKEJPT0xFQU4pcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyAhPSAwKSAmJiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyA9PSAwKSkKKwkJeworCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBIVF9SVFNDVFNfNk0sIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwgKEJPT0xFQU4pcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCk7CisKKwkJfQorCQllbHNlIGlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTICE9IDgpICYmIChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTID09IDgpKQorCQl7CisJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIEhUX1JUU0NUU182TSwgQUxMTl9TRVRQUk9URUNULCBUUlVFLCAoQk9PTEVBTilwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50KTsKKwkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNUQkMJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU1RCQzsKKwkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJOworCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MJCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKKwkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAoKHBBZC0+U3RhQ2ZnLk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID09IE1PREVfSFRHUkVFTkZJRUxEKSAmJgorCQkgICAgcEFkLT5XSUZJdGVzdGJlZC5iR3JlZW5GaWVsZCkKKwkJICAgIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUR1JFRU5GSUVMRDsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwl9CisKKwlwQWQtPkxhc3RUeFJhdGUgPSAoVVNIT1JUKShwRW50cnktPkhUUGh5TW9kZS53b3JkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIHJvdXRpbmUgY2FsY3VsYXRlcyB0aGUgYWN1bXVsYXRlZCBUeFBFUiBvZiBlYXhoIFR4UmF0ZS4gQW5kCisJCWFjY29yZGluZyB0byB0aGUgY2FsY3VsYXRpb24gcmVzdWx0LCBjaGFuZ2UgQ29tbW9uQ2ZnLlR4UmF0ZSB3aGljaAorCQlpcyB0aGUgc3RhYmxlIFRYIFJhdGUgd2UgZXhwZWN0IHRoZSBSYWRpbyBzaXR1YXRpb24gY291bGQgc3VzdGFpbmVkLgorCisJCUNvbW1vbkNmZy5UeFJhdGUgd2lsbCBjaGFuZ2UgZHluYW1pY2FsbHkgd2l0aGluIHtSQVRFXzEvUkFURV82LCBNYXhUeFJhdGV9CisJT3V0cHV0OgorCQlDb21tb25DZmcuVHhSYXRlIC0KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTk9URToKKwkJY2FsbCB0aGlzIHJvdXRpbmUgZXZlcnkgc2Vjb25kCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lRHluYW1pY1R4UmF0ZVN3aXRjaGluZygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlVQ0hBUgkJCQkJVXBSYXRlSWR4ID0gMCwgRG93blJhdGVJZHggPSAwLCBDdXJyUmF0ZUlkeDsKKwlVTE9ORwkJCQkJaSwgQWNjdVR4VG90YWxDbnQgPSAwLCBUeFRvdGFsQ250OworCVVMT05HCQkJCQlUeEVycm9yUmF0aW8gPSAwOworCUJPT0xFQU4JCQkJCWJUeFJhdGVDaGFuZ2VkLCBiVXBncmFkZVF1YWxpdHkgPSBGQUxTRTsKKwlQUlRNUF9UWF9SQVRFX1NXSVRDSAlwQ3VyclR4UmF0ZSwgcE5leHRUeFJhdGUgPSBOVUxMOworCVBVQ0hBUgkJCQkJcFRhYmxlOworCVVDSEFSCQkJCQlUYWJsZVNpemUgPSAwOworCVVDSEFSCQkJCQlJbml0VHhSYXRlSWR4ID0gMCwgVHJhaW5VcCwgVHJhaW5Eb3duOworCUNIQVIJCQkJCVJzc2ksIFJzc2lPZmZzZXQgPSAwOworCVRYX1NUQV9DTlQxX1NUUlVDCQlTdGFUeDE7CisJVFhfU1RBX0NOVDBfU1RSVUMJCVR4U3RhQ250MDsKKwlVTE9ORwkJCQkJVHhSZXRyYW5zbWl0ID0gMCwgVHhTdWNjZXNzID0gMCwgVHhGYWlsQ291bnQgPSAwOworCU1BQ19UQUJMRV9FTlRSWQkJCSpwRW50cnk7CisKKyNpZmRlZiBSQUxJTktfQVRFCisJaWYgKEFURV9PTihwQWQpKQorCXsKKwkJcmV0dXJuOworCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKwkvKmlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID4gMSkKKwkJUnNzaSA9IChwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwICsgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMSkgPj4gMTsKKwllbHNlCisJCVJzc2kgPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwOyovCisKKwkvLworCS8vIHdhbGsgdGhyb3VnaCBNQUMgdGFibGUsIHNlZSBpZiBuZWVkIHRvIGNoYW5nZSBBUCdzIFRYIHJhdGUgdG93YXJkIGVhY2ggZW50cnkKKwkvLworICAgCWZvciAoaSA9IDE7IGkgPCBNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQorCXsKKwkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV07CisKKwkJLy8gY2hlY2sgaWYgdGhpcyBlbnRyeSBuZWVkIHRvIHN3aXRjaCByYXRlIGF1dG9tYXRpY2FsbHkKKwkJaWYgKFJUTVBDaGVja0VudHJ5RW5hYmxlQXV0b1JhdGVTd2l0Y2gocEFkLCBwRW50cnkpID09IEZBTFNFKQorCQkJY29udGludWU7CisKKwkJaWYgKChwQWQtPk1hY1RhYi5TaXplID09IDEpIHx8IChwRW50cnktPlZhbGlkQXNEbHMpKQorCQl7CisJCQlSc3NpID0gUlRNUE1heFJzc2kocEFkLCAoQ0hBUilwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwLCAoQ0hBUilwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxLCAoQ0hBUilwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyKTsKKworCQkJLy8gVXBkYXRlIHN0YXRpc3RpYyBjb3VudGVyCisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQwLCAmVHhTdGFDbnQwLndvcmQpOworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMSwgJlN0YVR4MS53b3JkKTsKKwkJCXBBZC0+YlVwZGF0ZUJjbkNudERvbmUgPSBUUlVFOworCQkJVHhSZXRyYW5zbWl0ID0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKKwkJCVR4U3VjY2VzcyA9IFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7CisJCQlUeEZhaWxDb3VudCA9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKwkJCVR4VG90YWxDbnQgPSBUeFJldHJhbnNtaXQgKyBUeFN1Y2Nlc3MgKyBUeEZhaWxDb3VudDsKKworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArPSBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICs9IFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50ICs9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKwkJCXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC51Lkxvd1BhcnQgKz0gU3RhVHgxLmZpZWxkLlR4U3VjY2VzczsKKwkJCXBBZC0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQudS5Mb3dQYXJ0ICs9IFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7CisJCQlwQWQtPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC51Lkxvd1BhcnQgKz0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OworCisJCQkvLyBpZiBubyB0cmFmZmljIGluIHRoZSBwYXN0IDEtc2VjIHBlcmlvZCwgZG9uJ3QgY2hhbmdlIFRYIHJhdGUsCisJCQkvLyBidXQgY2xlYXIgYWxsIGJhZCBoaXN0b3J5LiBiZWNhdXNlIHRoZSBiYWQgaGlzdG9yeSBtYXkgYWZmZWN0IHRoZSBuZXh0CisJCQkvLyBDaGFyaW90IHRocm91Z2hwdXQgdGVzdAorCQkJQWNjdVR4VG90YWxDbnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKworCQkJCQkJIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKworCQkJCQkJIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQ7CisKKwkJCWlmIChUeFRvdGFsQ250KQorCQkJCVR4RXJyb3JSYXRpbyA9ICgoVHhSZXRyYW5zbWl0ICsgVHhGYWlsQ291bnQpICogMTAwKSAvIFR4VG90YWxDbnQ7CisJCX0KKwkJZWxzZQorCQl7CisJCQlSc3NpID0gUlRNUE1heFJzc2kocEFkLCAoQ0hBUilwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTAsIChDSEFSKXBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMSwgKENIQVIpcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kyKTsKKworCQkJVHhUb3RhbENudCA9IHBFbnRyeS0+T25lU2VjVHhOb1JldHJ5T2tDb3VudCArCisJCQkJIHBFbnRyeS0+T25lU2VjVHhSZXRyeU9rQ291bnQgKworCQkJCSBwRW50cnktPk9uZVNlY1R4RmFpbENvdW50OworCisJCQlpZiAoVHhUb3RhbENudCkKKwkJCQlUeEVycm9yUmF0aW8gPSAoKHBFbnRyeS0+T25lU2VjVHhSZXRyeU9rQ291bnQgKyBwRW50cnktPk9uZVNlY1R4RmFpbENvdW50KSAqIDEwMCkgLyBUeFRvdGFsQ250OworCQl9CisKKwkJQ3VyclJhdGVJZHggPSBwRW50cnktPkN1cnJUeFJhdGVJbmRleDsKKworCQlNbG1lU2VsZWN0VHhSYXRlVGFibGUocEFkLCBwRW50cnksICZwVGFibGUsICZUYWJsZVNpemUsICZJbml0VHhSYXRlSWR4KTsKKworCQlpZiAoQ3VyclJhdGVJZHggPj0gVGFibGVTaXplKQorCQl7CisJCQlDdXJyUmF0ZUlkeCA9IFRhYmxlU2l6ZSAtIDE7CisJCX0KKworCQkvLyBXaGVuIHN3aXRjaCBmcm9tIEZpeGVkIHJhdGUgLT4gYXV0byByYXRlLCB0aGUgUkVBTCBUWCByYXRlIG1pZ2h0IGJlIGRpZmZlcmVudCBmcm9tIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4LgorCQkvLyBTbyBuZWVkIHRvIHN5bmMgaGVyZS4KKwkJcEN1cnJUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKEN1cnJSYXRlSWR4KzEpKjVdOworCQlpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyAhPSBwQ3VyclR4UmF0ZS0+Q3Vyck1DUykKKwkJCS8vJiYgKHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID09IFRSVUUpCisJCQkpCisJCXsKKworCQkJLy8gTmVlZCB0byBzeW5jIFJlYWwgVHggcmF0ZSBhbmQgb3VyIHJlY29yZC4KKwkJCS8vIFRoZW4gcmV0dXJuIGZvciBuZXh0IERSUy4KKwkJCXBDdXJyVHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhJbml0VHhSYXRlSWR4KzEpKjVdOworCQkJcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXggPSBJbml0VHhSYXRlSWR4OworCQkJTWxtZVNldFR4UmF0ZShwQWQsIHBFbnRyeSwgcEN1cnJUeFJhdGUpOworCisJCQkvLyByZXNldCBhbGwgT25lU2VjVHggY291bnRlcnMKKwkJCVJFU0VUX09ORV9TRUNfVFhfQ05UKHBFbnRyeSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8vIGRlY2lkZSB0aGUgbmV4dCB1cGdyYWRlIHJhdGUgYW5kIGRvd25ncmFkZSByYXRlLCBpZiBhbnkKKwkJaWYgKChDdXJyUmF0ZUlkeCA+IDApICYmIChDdXJyUmF0ZUlkeCA8IChUYWJsZVNpemUgLSAxKSkpCisJCXsKKwkJCVVwUmF0ZUlkeCA9IEN1cnJSYXRlSWR4ICsgMTsKKwkJCURvd25SYXRlSWR4ID0gQ3VyclJhdGVJZHggLTE7CisJCX0KKwkJZWxzZSBpZiAoQ3VyclJhdGVJZHggPT0gMCkKKwkJeworCQkJVXBSYXRlSWR4ID0gQ3VyclJhdGVJZHggKyAxOworCQkJRG93blJhdGVJZHggPSBDdXJyUmF0ZUlkeDsKKwkJfQorCQllbHNlIGlmIChDdXJyUmF0ZUlkeCA9PSAoVGFibGVTaXplIC0gMSkpCisJCXsKKwkJCVVwUmF0ZUlkeCA9IEN1cnJSYXRlSWR4OworCQkJRG93blJhdGVJZHggPSBDdXJyUmF0ZUlkeCAtIDE7CisJCX0KKworCQlwQ3VyclR4UmF0ZSA9IChQUlRNUF9UWF9SQVRFX1NXSVRDSCkgJnBUYWJsZVsoQ3VyclJhdGVJZHgrMSkqNV07CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJaWYgKChSc3NpID4gLTY1KSAmJiAocEN1cnJUeFJhdGUtPk1vZGUgPj0gTU9ERV9IVE1JWCkpCisJCXsKKwkJCVRyYWluVXAJCT0gKHBDdXJyVHhSYXRlLT5UcmFpblVwICsgKHBDdXJyVHhSYXRlLT5UcmFpblVwID4+IDEpKTsKKwkJCVRyYWluRG93bgk9IChwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duICsgKHBDdXJyVHhSYXRlLT5UcmFpbkRvd24gPj4gMSkpOworCQl9CisJCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJeworCQkJVHJhaW5VcAkJPSBwQ3VyclR4UmF0ZS0+VHJhaW5VcDsKKwkJCVRyYWluRG93bgk9IHBDdXJyVHhSYXRlLT5UcmFpbkRvd247CisJCX0KKworCQkvL3BBZC0+RHJzQ291bnRlcnMuTGFzdFRpbWVUeFJhdGVDaGFuZ2VBY3Rpb24gPSBwQWQtPkRyc0NvdW50ZXJzLkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb247CisKKwkJLy8KKwkJLy8gS2VlcCB0aGUgbGFzdCB0aW1lIFR4UmF0ZUNoYW5nZUFjdGlvbiBzdGF0dXMuCisJCS8vCisJCXBFbnRyeS0+TGFzdFRpbWVUeFJhdGVDaGFuZ2VBY3Rpb24gPSBwRW50cnktPkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb247CisKKworCisJCS8vCisJCS8vIENBU0UgMS4gd2hlbiBUWCBzYW1wbGVzIGFyZSBmZXdlciB0aGFuIDE1LCB0aGVuIGRlY2lkZSBUWCByYXRlIHNvbGVseSBvbiBSU1NJCisJCS8vICAgICAgICAgKGNyaXRlcmlhIGNvcGllZCBmcm9tIFJUMjUwMCBmb3IgTmV0b3BpYSBjYXNlKQorCQkvLworCQlpZiAoVHhUb3RhbENudCA8PSAxNSkKKwkJeworCQkJQ0hBUglpZHggPSAwOworCQkJVUNIQVIJVHhSYXRlSWR4OworCQkJLy9VQ0hBUglNQ1MwID0gMCwgTUNTMSA9IDAsIE1DUzIgPSAwLCBNQ1MzID0gMCwgTUNTNCA9IDAsIE1DUzcgPSAwLCBNQ1MxMiA9IDAsIE1DUzEzID0gMCwgTUNTMTQgPSAwLCBNQ1MxNSA9IDA7CisJCQlVQ0hBUglNQ1MwID0gMCwgTUNTMSA9IDAsIE1DUzIgPSAwLCBNQ1MzID0gMCwgTUNTNCA9IDAsICBNQ1M1ID0wLCBNQ1M2ID0gMCwgTUNTNyA9IDA7CisJICAgICAgICBVQ0hBUglNQ1MxMiA9IDAsIE1DUzEzID0gMCwgTUNTMTQgPSAwLCBNQ1MxNSA9IDA7CisJCQlVQ0hBUglNQ1MyMCA9IDAsIE1DUzIxID0gMCwgTUNTMjIgPSAwLCBNQ1MyMyA9IDA7IC8vIDMqMworCisJCQkvLyBjaGVjayB0aGUgZXhpc3RlbmNlIGFuZCBpbmRleCBvZiBlYWNoIG5lZWRlZCBNQ1MKKwkJCXdoaWxlIChpZHggPCBwVGFibGVbMF0pCisJCQl7CisJCQkJcEN1cnJUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKGlkeCsxKSo1XTsKKworCQkJCWlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMCkKKwkJCQl7CisJCQkJCU1DUzAgPSBpZHg7CisJCQkJfQorCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18xKQorCQkJCXsKKwkJCQkJTUNTMSA9IGlkeDsKKwkJCQl9CisJCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzIpCisJCQkJeworCQkJCQlNQ1MyID0gaWR4OworCQkJCX0KKwkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMykKKwkJCQl7CisJCQkJCU1DUzMgPSBpZHg7CisJCQkJfQorCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU180KQorCQkJCXsKKwkJCQkJTUNTNCA9IGlkeDsKKwkJCQl9CisJICAgICAgICAgICAgZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzUpCisJICAgICAgICAgICAgeworCSAgICAgICAgICAgICAgICBNQ1M1ID0gaWR4OworCSAgICAgICAgICAgIH0KKwkgICAgICAgICAgICBlbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfNikKKwkgICAgICAgICAgICB7CisJICAgICAgICAgICAgICAgIE1DUzYgPSBpZHg7CisJICAgICAgICAgICAgfQorCQkJCS8vZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzcpCisJCQkJZWxzZSBpZiAoKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU183KSAmJiAocEN1cnJUeFJhdGUtPlNob3J0R0kgPT0gR0lfODAwKSkJLy8gcHJldmVudCB0aGUgaGlnaGVzdCBNQ1MgdXNpbmcgc2hvcnQgR0kgd2hlbiAxVCBhbmQgbG93IHRocm91Z2hwdXQKKwkJCQl7CisJCQkJCU1DUzcgPSBpZHg7CisJCQkJfQorCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18xMikKKwkJCQl7CisJCQkJCU1DUzEyID0gaWR4OworCQkJCX0KKwkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMTMpCisJCQkJeworCQkJCQlNQ1MxMyA9IGlkeDsKKwkJCQl9CisJCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzE0KQorCQkJCXsKKwkJCQkJTUNTMTQgPSBpZHg7CisJCQkJfQorCQkJCS8vZWxzZSBpZiAoKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18xNSkvKiAmJiAocEN1cnJUeFJhdGUtPlNob3J0R0kgPT0gR0lfODAwKSovKQkvL3dlIGhvcGUgdG8gdXNlIFNob3J0R0kgYXMgaW5pdGlhbCByYXRlCisJCQkJZWxzZSBpZiAoKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18xNSkgJiYgKHBDdXJyVHhSYXRlLT5TaG9ydEdJID09IEdJXzgwMCkpCS8vd2UgaG9wZSB0byB1c2UgU2hvcnRHSSBhcyBpbml0aWFsIHJhdGUsIGhvd2V2ZXIgQXRoZXJvcydzIGNoaXAgaGFzIGJ1Z3Mgd2hlbiBzaG9ydCBHSQorCQkJCXsKKwkJCQkJTUNTMTUgPSBpZHg7CisJCQkJfQorCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18yMCkgLy8gMyozCisJCQkJeworCQkJCQlNQ1MyMCA9IGlkeDsKKwkJCQl9CisJCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzIxKQorCQkJCXsKKwkJCQkJTUNTMjEgPSBpZHg7CisJCQkJfQorCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18yMikKKwkJCQl7CisJCQkJCU1DUzIyID0gaWR4OworCQkJCX0KKwkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMjMpCisJCQkJeworCQkJCQlNQ1MyMyA9IGlkeDsKKwkJCQl9CisJCQkJaWR4ICsrOworCQkJfQorCisJCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQorCQkJeworCQkJCWlmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuRXh0ZXJuYWxMTkFGb3JHKQorCQkJCXsKKwkJCQkJUnNzaU9mZnNldCA9IDI7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVJzc2lPZmZzZXQgPSA1OworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkV4dGVybmFsTE5BRm9yQSkKKwkJCQl7CisJCQkJCVJzc2lPZmZzZXQgPSA1OworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSc3NpT2Zmc2V0ID0gODsKKwkJCQl9CisJCQl9CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkvKmlmIChNQ1MxNSkqLworCQkJaWYgKChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFCR04zUykgfHwKKwkJCQkocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExTjNTKSB8fAorCQkJCShwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlKSkKKwkJCXsvLyBOIG1vZGUgd2l0aCAzIHN0cmVhbSAvLyAzKjMKKwkJCQlpZiAoTUNTMjMgJiYgKFJzc2kgPj0gLTcwKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMTU7CisJCQkJZWxzZSBpZiAoTUNTMjIgJiYgKFJzc2kgPj0gLTcyKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMTQ7CisgICAgICAgIAkgICAgZWxzZSBpZiAoTUNTMjEgJiYgKFJzc2kgPj0gLTc2KSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMTM7CisJCQkJZWxzZSBpZiAoTUNTMjAgJiYgKFJzc2kgPj0gLTc4KSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMTI7CisJCQllbHNlIGlmIChNQ1M0ICYmIChSc3NpID49IC04MikpCisJCQkJVHhSYXRlSWR4ID0gTUNTNDsKKwkJCWVsc2UgaWYgKE1DUzMgJiYgKFJzc2kgPj0gLTg0KSkKKwkJCQlUeFJhdGVJZHggPSBNQ1MzOworCQkJZWxzZSBpZiAoTUNTMiAmJiAoUnNzaSA+PSAtODYpKQorCQkJCVR4UmF0ZUlkeCA9IE1DUzI7CisJCQllbHNlIGlmIChNQ1MxICYmIChSc3NpID49IC04OCkpCisJCQkJVHhSYXRlSWR4ID0gTUNTMTsKKwkJCWVsc2UKKwkJCQlUeFJhdGVJZHggPSBNQ1MwOworCQl9CisJCWVsc2UgaWYgKChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yUykgfHwgKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMUJHTjJTRm9yQUJhbmQpIHx8KHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMU4yUykgfHwocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmQpKSAvLyAzKjMKKwkJCXsvLyBOIG1vZGUgd2l0aCAyIHN0cmVhbQorCQkJCWlmIChNQ1MxNSAmJiAoUnNzaSA+PSAoLTcwK1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMTU7CisJCQkJZWxzZSBpZiAoTUNTMTQgJiYgKFJzc2kgPj0gKC03MitSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzE0OworCQkJCWVsc2UgaWYgKE1DUzEzICYmIChSc3NpID49ICgtNzYrUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MxMzsKKwkJCQllbHNlIGlmIChNQ1MxMiAmJiAoUnNzaSA+PSAoLTc4K1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMTI7CisJCQkJZWxzZSBpZiAoTUNTNCAmJiAoUnNzaSA+PSAoLTgyK1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTNDsKKwkJCQllbHNlIGlmIChNQ1MzICYmIChSc3NpID49ICgtODQrUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MzOworCQkJCWVsc2UgaWYgKE1DUzIgJiYgKFJzc2kgPj0gKC04NitSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzI7CisJCQkJZWxzZSBpZiAoTUNTMSAmJiAoUnNzaSA+PSAoLTg4K1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMTsKKwkJCQllbHNlCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzA7CisJCQl9CisJCQllbHNlIGlmICgocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExQkdOMVMpIHx8IChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFOMVMpKQorCQkJey8vIE4gbW9kZSB3aXRoIDEgc3RyZWFtCisJCQkJaWYgKE1DUzcgJiYgKFJzc2kgPiAoLTcyK1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTNzsKKwkJCQllbHNlIGlmIChNQ1M2ICYmIChSc3NpID4gKC03NCtSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzY7CisJCQkJZWxzZSBpZiAoTUNTNSAmJiAoUnNzaSA+ICgtNzcrUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1M1OworCQkJCWVsc2UgaWYgKE1DUzQgJiYgKFJzc2kgPiAoLTc5K1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTNDsKKwkJCQllbHNlIGlmIChNQ1MzICYmIChSc3NpID4gKC04MStSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzM7CisJCQkJZWxzZSBpZiAoTUNTMiAmJiAoUnNzaSA+ICgtODMrUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MyOworCQkJCWVsc2UgaWYgKE1DUzEgJiYgKFJzc2kgPiAoLTg2K1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMTsKKwkJCQllbHNlCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzA7CisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQl7Ly8gTGVnYWN5IG1vZGUKKwkJCQlpZiAoTUNTNyAmJiAoUnNzaSA+IC03MCkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzc7CisJCQkJZWxzZSBpZiAoTUNTNiAmJiAoUnNzaSA+IC03NCkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzY7CisJCQkJZWxzZSBpZiAoTUNTNSAmJiAoUnNzaSA+IC03OCkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzU7CisJCQkJZWxzZSBpZiAoTUNTNCAmJiAoUnNzaSA+IC04MikpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzQ7CisJCQkJZWxzZSBpZiAoTUNTNCA9PSAwKQkvLyBmb3IgQi1vbmx5IG1vZGUKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMzsKKwkJCQllbHNlIGlmIChNQ1MzICYmIChSc3NpID4gLTg1KSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMzsKKwkJCQllbHNlIGlmIChNQ1MyICYmIChSc3NpID4gLTg3KSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMjsKKwkJCQllbHNlIGlmIChNQ1MxICYmIChSc3NpID4gLTkwKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMTsKKwkJCQllbHNlCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzA7CisJCQl9CisKKwkJCXsKKwkJCQlwRW50cnktPkN1cnJUeFJhdGVJbmRleCA9IFR4UmF0ZUlkeDsKKwkJCQlwTmV4dFR4UmF0ZSA9IChQUlRNUF9UWF9SQVRFX1NXSVRDSCkgJnBUYWJsZVsocEVudHJ5LT5DdXJyVHhSYXRlSW5kZXgrMSkqNV07CisJCQkJTWxtZVNldFR4UmF0ZShwQWQsIHBFbnRyeSwgcE5leHRUeFJhdGUpOworCQkJfQorCisJCQlOZGlzWmVyb01lbW9yeShwRW50cnktPlR4UXVhbGl0eSwgc2l6ZW9mKFVTSE9SVCkgKiBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7CisJCQlOZGlzWmVyb01lbW9yeShwRW50cnktPlBFUiwgc2l6ZW9mKFVDSEFSKSAqIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKKwkJCXBFbnRyeS0+Zkxhc3RTZWNBY2NvcmRpbmdSU1NJID0gVFJVRTsKKwkJCS8vIHJlc2V0IGFsbCBPbmVTZWNUeCBjb3VudGVycworCQkJUkVTRVRfT05FX1NFQ19UWF9DTlQocEVudHJ5KTsKKworCQkJY29udGludWU7CisJCX0KKworCQlpZiAocEVudHJ5LT5mTGFzdFNlY0FjY29yZGluZ1JTU0kgPT0gVFJVRSkKKwkJeworCQkJcEVudHJ5LT5mTGFzdFNlY0FjY29yZGluZ1JTU0kgPSBGQUxTRTsKKwkJCXBFbnRyeS0+TGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9IDA7CisJCQkvLyByZXNldCBhbGwgT25lU2VjVHggY291bnRlcnMKKwkJCVJFU0VUX09ORV9TRUNfVFhfQ05UKHBFbnRyeSk7CisKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZG8KKwkJeworCQkJQk9PTEVBTgliVHJhaW5VcERvd24gPSBGQUxTRTsKKworCQkJcEVudHJ5LT5DdXJyVHhSYXRlU3RhYmxlVGltZSArKzsKKworCQkJLy8gZG93bmdyYWRlIFRYIHF1YWxpdHkgaWYgUEVSID49IFJhdGUtRG93biB0aHJlc2hvbGQKKwkJCWlmIChUeEVycm9yUmF0aW8gPj0gVHJhaW5Eb3duKQorCQkJeworCQkJCWJUcmFpblVwRG93biA9IFRSVUU7CisJCQkJcEVudHJ5LT5UeFF1YWxpdHlbQ3VyclJhdGVJZHhdID0gRFJTX1RYX1FVQUxJVFlfV09SU1RfQk9VTkQ7CisJCQl9CisJCQkvLyB1cGdyYWRlIFRYIHF1YWxpdHkgaWYgUEVSIDw9IFJhdGUtVXAgdGhyZXNob2xkCisJCQllbHNlIGlmIChUeEVycm9yUmF0aW8gPD0gVHJhaW5VcCkKKwkJCXsKKwkJCQliVHJhaW5VcERvd24gPSBUUlVFOworCQkJCWJVcGdyYWRlUXVhbGl0eSA9IFRSVUU7CisJCQkJaWYgKHBFbnRyeS0+VHhRdWFsaXR5W0N1cnJSYXRlSWR4XSkKKwkJCQkJcEVudHJ5LT5UeFF1YWxpdHlbQ3VyclJhdGVJZHhdIC0tOyAgLy8gcXVhbGl0eSB2ZXJ5IGdvb2QgaW4gQ3VyclJhdGUKKworCQkJCWlmIChwRW50cnktPlR4UmF0ZVVwUGVuYWx0eSkKKwkJCQkJcEVudHJ5LT5UeFJhdGVVcFBlbmFsdHkgLS07CisJCQkJZWxzZSBpZiAocEVudHJ5LT5UeFF1YWxpdHlbVXBSYXRlSWR4XSkKKwkJCQkJcEVudHJ5LT5UeFF1YWxpdHlbVXBSYXRlSWR4XSAtLTsgICAgLy8gbWF5IGltcHJvdmUgbmV4dCBVUCByYXRlJ3MgcXVhbGl0eQorCQkJfQorCisJCQlwRW50cnktPlBFUltDdXJyUmF0ZUlkeF0gPSAoVUNIQVIpVHhFcnJvclJhdGlvOworCisJCQlpZiAoYlRyYWluVXBEb3duKQorCQkJeworCQkJCS8vIHBlcmZvcm0gRFJTIC0gY29uc2lkZXIgVHhSYXRlIERvd24gZmlyc3QsIHRoZW4gcmF0ZSB1cC4KKwkJCQlpZiAoKEN1cnJSYXRlSWR4ICE9IERvd25SYXRlSWR4KSAmJiAocEVudHJ5LT5UeFF1YWxpdHlbQ3VyclJhdGVJZHhdID49IERSU19UWF9RVUFMSVRZX1dPUlNUX0JPVU5EKSkKKwkJCQl7CisJCQkJCXBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4ID0gRG93blJhdGVJZHg7CisJCQkJfQorCQkJCWVsc2UgaWYgKChDdXJyUmF0ZUlkeCAhPSBVcFJhdGVJZHgpICYmIChwRW50cnktPlR4UXVhbGl0eVtVcFJhdGVJZHhdIDw9IDApKQorCQkJCXsKKwkJCQkJcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXggPSBVcFJhdGVJZHg7CisJCQkJfQorCQkJfQorCQl9IHdoaWxlIChGQUxTRSk7CisKKwkJLy8gaWYgcmF0ZS11cCBoYXBwZW4sIGNsZWFyIGFsbCBiYWQgaGlzdG9yeSBvZiBhbGwgVFggcmF0ZXMKKwkJaWYgKHBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4ID4gQ3VyclJhdGVJZHgpCisJCXsKKwkJCXBFbnRyeS0+Q3VyclR4UmF0ZVN0YWJsZVRpbWUgPSAwOworCQkJcEVudHJ5LT5UeFJhdGVVcFBlbmFsdHkgPSAwOworCQkJcEVudHJ5LT5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID0gMTsgLy8gcmF0ZSBVUAorCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LT5UeFF1YWxpdHksIHNpemVvZihVU0hPUlQpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOworCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LT5QRVIsIHNpemVvZihVQ0hBUikgKiBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7CisKKwkJCS8vCisJCQkvLyBGb3IgVHhSYXRlIGZhc3QgdHJhaW4gdXAKKwkJCS8vCisJCQlpZiAoIXBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyUnVubmluZykKKwkJCXsKKwkJCQlSVE1QU2V0VGltZXIoJnBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyLCAxMDApOworCisJCQkJcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nID0gVFJVRTsKKwkJCX0KKwkJCWJUeFJhdGVDaGFuZ2VkID0gVFJVRTsKKwkJfQorCQkvLyBpZiByYXRlLWRvd24gaGFwcGVuLCBvbmx5IGNsZWFyIERvd25SYXRlJ3MgYmFkIGhpc3RvcnkKKwkJZWxzZSBpZiAocEVudHJ5LT5DdXJyVHhSYXRlSW5kZXggPCBDdXJyUmF0ZUlkeCkKKwkJeworCQkJcEVudHJ5LT5DdXJyVHhSYXRlU3RhYmxlVGltZSA9IDA7CisJCQlwRW50cnktPlR4UmF0ZVVwUGVuYWx0eSA9IDA7ICAgICAgICAgICAvLyBubyBwZW5hbHR5CisJCQlwRW50cnktPkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gPSAyOyAvLyByYXRlIERPV04KKwkJCXBFbnRyeS0+VHhRdWFsaXR5W3BFbnRyeS0+Q3VyclR4UmF0ZUluZGV4XSA9IDA7CisJCQlwRW50cnktPlBFUltwRW50cnktPkN1cnJUeFJhdGVJbmRleF0gPSAwOworCisJCQkvLworCQkJLy8gRm9yIFR4UmF0ZSBmYXN0IHRyYWluIGRvd24KKwkJCS8vCisJCQlpZiAoIXBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyUnVubmluZykKKwkJCXsKKwkJCQlSVE1QU2V0VGltZXIoJnBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyLCAxMDApOworCisJCQkJcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nID0gVFJVRTsKKwkJCX0KKwkJCWJUeFJhdGVDaGFuZ2VkID0gVFJVRTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBFbnRyeS0+TGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9IDA7IC8vIHJhdGUgbm8gY2hhbmdlCisJCQliVHhSYXRlQ2hhbmdlZCA9IEZBTFNFOworCQl9CisKKwkJcEVudHJ5LT5MYXN0VHhPa0NvdW50ID0gVHhTdWNjZXNzOworCisJCS8vIHJlc2V0IGFsbCBPbmVTZWNUeCBjb3VudGVycworCQlSRVNFVF9PTkVfU0VDX1RYX0NOVChwRW50cnkpOworCisJCXBOZXh0VHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhwRW50cnktPkN1cnJUeFJhdGVJbmRleCsxKSo1XTsKKwkJaWYgKGJUeFJhdGVDaGFuZ2VkICYmIHBOZXh0VHhSYXRlKQorCQl7CisJCQlNbG1lU2V0VHhSYXRlKHBBZCwgcEVudHJ5LCBwTmV4dFR4UmF0ZSk7CisJCX0KKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJU3RhdGlvbiBzaWRlLCBBdXRvIFR4UmF0ZSBmYXN0ZXIgdHJhaW4gdXAgdGltZXIgY2FsbCBiYWNrIGZ1bmN0aW9uLgorCisJQXJndW1lbnRzOgorCQlTeXN0ZW1TcGVjaWZpYzEJCQktIE5vdCB1c2VkLgorCQlGdW5jdGlvbkNvbnRleHQJCQktIFBvaW50ZXIgdG8gb3VyIEFkYXB0ZXIgY29udGV4dC4KKwkJU3lzdGVtU3BlY2lmaWMyCQkJLSBOb3QgdXNlZC4KKwkJU3lzdGVtU3BlY2lmaWMzCQkJLSBOb3QgdXNlZC4KKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBTdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBFeGVjKAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKwlQUlRNUF9BREFQVEVSCQkJcEFkID0gKFBSVE1QX0FEQVBURVIpRnVuY3Rpb25Db250ZXh0OworCVVDSEFSCQkJCQlVcFJhdGVJZHggPSAwLCBEb3duUmF0ZUlkeCA9IDAsIEN1cnJSYXRlSWR4ID0gMDsKKwlVTE9ORwkJCQkJVHhUb3RhbENudDsKKwlVTE9ORwkJCQkJVHhFcnJvclJhdGlvID0gMDsKKwlCT09MRUFOCQkJCQliVHhSYXRlQ2hhbmdlZCA9IFRSVUU7IC8vLCBiVXBncmFkZVF1YWxpdHkgPSBGQUxTRTsKKwlQUlRNUF9UWF9SQVRFX1NXSVRDSAlwQ3VyclR4UmF0ZSwgcE5leHRUeFJhdGUgPSBOVUxMOworCVBVQ0hBUgkJCQkJcFRhYmxlOworCVVDSEFSCQkJCQlUYWJsZVNpemUgPSAwOworCVVDSEFSCQkJCQlJbml0VHhSYXRlSWR4ID0gMCwgVHJhaW5VcCwgVHJhaW5Eb3duOworCVRYX1NUQV9DTlQxX1NUUlVDCQlTdGFUeDE7CisJVFhfU1RBX0NOVDBfU1RSVUMJCVR4U3RhQ250MDsKKwlDSEFSCQkJCQlSc3NpLCByYXRpbzsKKwlVTE9ORwkJCQkJVHhSZXRyYW5zbWl0ID0gMCwgVHhTdWNjZXNzID0gMCwgVHhGYWlsQ291bnQgPSAwOworCU1BQ19UQUJMRV9FTlRSWQkJCSpwRW50cnk7CisJVUxPTkcJCQkJCWk7CisKKwlwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lclJ1bm5pbmcgPSBGQUxTRTsKKworICAgIC8vCisgICAgLy8gd2FsayB0aHJvdWdoIE1BQyB0YWJsZSwgc2VlIGlmIG5lZWQgdG8gY2hhbmdlIEFQJ3MgVFggcmF0ZSB0b3dhcmQgZWFjaCBlbnRyeQorICAgIC8vCisJZm9yIChpID0gMTsgaSA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCisJeworCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtpXTsKKworCQkvLyBjaGVjayBpZiB0aGlzIGVudHJ5IG5lZWQgdG8gc3dpdGNoIHJhdGUgYXV0b21hdGljYWxseQorCQlpZiAoUlRNUENoZWNrRW50cnlFbmFibGVBdXRvUmF0ZVN3aXRjaChwQWQsIHBFbnRyeSkgPT0gRkFMU0UpCisJCQljb250aW51ZTsKKworCQkvL1Jzc2kgPSBSVE1QTWF4UnNzaShwQWQsIChDSEFSKXBBZC0+U3RhQ2ZnLkF2Z1Jzc2kwLCAoQ0hBUilwQWQtPlN0YUNmZy5BdmdSc3NpMSwgKENIQVIpcEFkLT5TdGFDZmcuQXZnUnNzaTIpOworCSAgICBpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA+IDEpCisJCQlSc3NpID0gKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAgKyBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxKSA+PiAxOworCQllbHNlCisJCQlSc3NpID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMDsKKworCQlDdXJyUmF0ZUlkeCA9IHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4OworCisJCQlNbG1lU2VsZWN0VHhSYXRlVGFibGUocEFkLCBwRW50cnksICZwVGFibGUsICZUYWJsZVNpemUsICZJbml0VHhSYXRlSWR4KTsKKworCQkvLyBkZWNpZGUgdGhlIG5leHQgdXBncmFkZSByYXRlIGFuZCBkb3duZ3JhZGUgcmF0ZSwgaWYgYW55CisJCWlmICgoQ3VyclJhdGVJZHggPiAwKSAmJiAoQ3VyclJhdGVJZHggPCAoVGFibGVTaXplIC0gMSkpKQorCQl7CisJCQlVcFJhdGVJZHggPSBDdXJyUmF0ZUlkeCArIDE7CisJCQlEb3duUmF0ZUlkeCA9IEN1cnJSYXRlSWR4IC0xOworCQl9CisJCWVsc2UgaWYgKEN1cnJSYXRlSWR4ID09IDApCisJCXsKKwkJCVVwUmF0ZUlkeCA9IEN1cnJSYXRlSWR4ICsgMTsKKwkJCURvd25SYXRlSWR4ID0gQ3VyclJhdGVJZHg7CisJCX0KKwkJZWxzZSBpZiAoQ3VyclJhdGVJZHggPT0gKFRhYmxlU2l6ZSAtIDEpKQorCQl7CisJCQlVcFJhdGVJZHggPSBDdXJyUmF0ZUlkeDsKKwkJCURvd25SYXRlSWR4ID0gQ3VyclJhdGVJZHggLSAxOworCQl9CisKKwkJcEN1cnJUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKEN1cnJSYXRlSWR4KzEpKjVdOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWlmICgoUnNzaSA+IC02NSkgJiYgKHBDdXJyVHhSYXRlLT5Nb2RlID49IE1PREVfSFRNSVgpKQorCQl7CisJCQlUcmFpblVwCQk9IChwQ3VyclR4UmF0ZS0+VHJhaW5VcCArIChwQ3VyclR4UmF0ZS0+VHJhaW5VcCA+PiAxKSk7CisJCQlUcmFpbkRvd24JPSAocEN1cnJUeFJhdGUtPlRyYWluRG93biArIChwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duID4+IDEpKTsKKwkJfQorCQllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCXsKKwkJCVRyYWluVXAJCT0gcEN1cnJUeFJhdGUtPlRyYWluVXA7CisJCQlUcmFpbkRvd24JPSBwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duOworCQl9CisKKwkJaWYgKHBBZC0+TWFjVGFiLlNpemUgPT0gMSkKKwkJeworCQkJLy8gVXBkYXRlIHN0YXRpc3RpYyBjb3VudGVyCisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQwLCAmVHhTdGFDbnQwLndvcmQpOworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMSwgJlN0YVR4MS53b3JkKTsKKworCQkJVHhSZXRyYW5zbWl0ID0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKKwkJCVR4U3VjY2VzcyA9IFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7CisJCQlUeEZhaWxDb3VudCA9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKwkJCVR4VG90YWxDbnQgPSBUeFJldHJhbnNtaXQgKyBUeFN1Y2Nlc3MgKyBUeEZhaWxDb3VudDsKKworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArPSBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICs9IFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50ICs9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKwkJCXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC51Lkxvd1BhcnQgKz0gU3RhVHgxLmZpZWxkLlR4U3VjY2VzczsKKwkJCXBBZC0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQudS5Mb3dQYXJ0ICs9IFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7CisJCQlwQWQtPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC51Lkxvd1BhcnQgKz0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OworCisJCQlpZiAoVHhUb3RhbENudCkKKwkJCQlUeEVycm9yUmF0aW8gPSAoKFR4UmV0cmFuc21pdCArIFR4RmFpbENvdW50KSAqIDEwMCkgLyBUeFRvdGFsQ250OworCQl9CisJCWVsc2UKKwkJeworCQkJVHhUb3RhbENudCA9IHBFbnRyeS0+T25lU2VjVHhOb1JldHJ5T2tDb3VudCArCisJCQkJIHBFbnRyeS0+T25lU2VjVHhSZXRyeU9rQ291bnQgKworCQkJCSBwRW50cnktPk9uZVNlY1R4RmFpbENvdW50OworCisJCQlpZiAoVHhUb3RhbENudCkKKwkJCQlUeEVycm9yUmF0aW8gPSAoKHBFbnRyeS0+T25lU2VjVHhSZXRyeU9rQ291bnQgKyBwRW50cnktPk9uZVNlY1R4RmFpbENvdW50KSAqIDEwMCkgLyBUeFRvdGFsQ250OworCQl9CisKKworCQkvLworCQkvLyBDQVNFIDEuIHdoZW4gVFggc2FtcGxlcyBhcmUgZmV3ZXIgdGhhbiAxNSwgdGhlbiBkZWNpZGUgVFggcmF0ZSBzb2xlbHkgb24gUlNTSQorCQkvLyAgICAgICAgIChjcml0ZXJpYSBjb3BpZWQgZnJvbSBSVDI1MDAgZm9yIE5ldG9waWEgY2FzZSkKKwkJLy8KKwkJaWYgKFR4VG90YWxDbnQgPD0gMTIpCisJCXsKKwkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+RHJzQ291bnRlcnMuVHhRdWFsaXR5LCBzaXplb2YoVVNIT1JUKSAqIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKKwkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+RHJzQ291bnRlcnMuUEVSLCBzaXplb2YoVUNIQVIpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOworCisJCQlpZiAoKHBBZC0+RHJzQ291bnRlcnMuTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9PSAxKSAmJiAoQ3VyclJhdGVJZHggIT0gRG93blJhdGVJZHgpKQorCQkJeworCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4ID0gRG93blJhdGVJZHg7CisJCQkJcEFkLT5EcnNDb3VudGVycy5UeFF1YWxpdHlbQ3VyclJhdGVJZHhdID0gRFJTX1RYX1FVQUxJVFlfV09SU1RfQk9VTkQ7CisJCQl9CisJCQllbHNlIGlmICgocEFkLT5EcnNDb3VudGVycy5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID09IDIpICYmIChDdXJyUmF0ZUlkeCAhPSBVcFJhdGVJZHgpKQorCQkJeworCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4ID0gVXBSYXRlSWR4OworCQkJfQorCisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJRdWlja0RSUzogVHhUb3RhbENudCA8PSAxNSwgdHJhaW4gYmFjayB0byBvcmlnaW5hbCByYXRlIFxuIikpOworCQkJcmV0dXJuOworCQl9CisKKwkJZG8KKwkJeworCQkJVUxPTkcgT25lU2VjVHhOb1JldHJ5T0tSYXRpb25Db3VudDsKKworCQkJaWYgKHBBZC0+RHJzQ291bnRlcnMuTGFzdFRpbWVUeFJhdGVDaGFuZ2VBY3Rpb24gPT0gMCkKKwkJCQlyYXRpbyA9IDU7CisJCQllbHNlCisJCQkJcmF0aW8gPSA0OworCisJCQkvLyBkb3duZ3JhZGUgVFggcXVhbGl0eSBpZiBQRVIgPj0gUmF0ZS1Eb3duIHRocmVzaG9sZAorCQkJaWYgKFR4RXJyb3JSYXRpbyA+PSBUcmFpbkRvd24pCisJCQl7CisJCQkJcEFkLT5EcnNDb3VudGVycy5UeFF1YWxpdHlbQ3VyclJhdGVJZHhdID0gRFJTX1RYX1FVQUxJVFlfV09SU1RfQk9VTkQ7CisJCQl9CisKKwkJCXBBZC0+RHJzQ291bnRlcnMuUEVSW0N1cnJSYXRlSWR4XSA9IChVQ0hBUilUeEVycm9yUmF0aW87CisKKwkJCU9uZVNlY1R4Tm9SZXRyeU9LUmF0aW9uQ291bnQgPSAoVHhTdWNjZXNzICogcmF0aW8pOworCisJCQkvLyBwZXJmb3JtIERSUyAtIGNvbnNpZGVyIFR4UmF0ZSBEb3duIGZpcnN0LCB0aGVuIHJhdGUgdXAuCisJCQlpZiAoKHBBZC0+RHJzQ291bnRlcnMuTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9PSAxKSAmJiAoQ3VyclJhdGVJZHggIT0gRG93blJhdGVJZHgpKQorCQkJeworCQkJCWlmICgocEFkLT5EcnNDb3VudGVycy5MYXN0VHhPa0NvdW50ICsgMikgPj0gT25lU2VjVHhOb1JldHJ5T0tSYXRpb25Db3VudCkKKwkJCQl7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4ID0gRG93blJhdGVJZHg7CisJCQkJCXBBZC0+RHJzQ291bnRlcnMuVHhRdWFsaXR5W0N1cnJSYXRlSWR4XSA9IERSU19UWF9RVUFMSVRZX1dPUlNUX0JPVU5EOworCisJCQkJfQorCisJCQl9CisJCQllbHNlIGlmICgocEFkLT5EcnNDb3VudGVycy5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID09IDIpICYmIChDdXJyUmF0ZUlkeCAhPSBVcFJhdGVJZHgpKQorCQkJeworCQkJCWlmICgoVHhFcnJvclJhdGlvID49IDUwKSB8fCAoVHhFcnJvclJhdGlvID49IFRyYWluRG93bikpCisJCQkJeworCisJCQkJfQorCQkJCWVsc2UgaWYgKChwQWQtPkRyc0NvdW50ZXJzLkxhc3RUeE9rQ291bnQgKyAyKSA+PSBPbmVTZWNUeE5vUmV0cnlPS1JhdGlvbkNvdW50KQorCQkJCXsKKwkJCQkJcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXggPSBVcFJhdGVJZHg7CisJCQkJfQorCQkJfQorCQl9d2hpbGUgKEZBTFNFKTsKKworCQkvLyBpZiByYXRlLXVwIGhhcHBlbiwgY2xlYXIgYWxsIGJhZCBoaXN0b3J5IG9mIGFsbCBUWCByYXRlcworCQlpZiAocEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXggPiBDdXJyUmF0ZUlkeCkKKwkJeworCQkJcEFkLT5EcnNDb3VudGVycy5UeFJhdGVVcFBlbmFsdHkgPSAwOworCQkJTmRpc1plcm9NZW1vcnkocEFkLT5EcnNDb3VudGVycy5UeFF1YWxpdHksIHNpemVvZihVU0hPUlQpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOworCQkJTmRpc1plcm9NZW1vcnkocEFkLT5EcnNDb3VudGVycy5QRVIsIHNpemVvZihVQ0hBUikgKiBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7CisJCX0KKwkJLy8gaWYgcmF0ZS1kb3duIGhhcHBlbiwgb25seSBjbGVhciBEb3duUmF0ZSdzIGJhZCBoaXN0b3J5CisJCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4IDwgQ3VyclJhdGVJZHgpCisJCXsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIlF1aWNrRFJTOiAtLVRYIHJhdGUgZnJvbSAlZCB0byAlZCBcbiIsIEN1cnJSYXRlSWR4LCBwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCkpOworCisJCQlwQWQtPkRyc0NvdW50ZXJzLlR4UmF0ZVVwUGVuYWx0eSA9IDA7ICAgICAgICAgICAvLyBubyBwZW5hbHR5CisJCQlwQWQtPkRyc0NvdW50ZXJzLlR4UXVhbGl0eVtwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleF0gPSAwOworCQkJcEFkLT5EcnNDb3VudGVycy5QRVJbcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXhdID0gMDsKKwkJfQorCQllbHNlCisJCXsKKwkJCWJUeFJhdGVDaGFuZ2VkID0gRkFMU0U7CisJCX0KKworCQlwTmV4dFR4UmF0ZSA9IChQUlRNUF9UWF9SQVRFX1NXSVRDSCkgJnBUYWJsZVsocEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXgrMSkqNV07CisJCWlmIChiVHhSYXRlQ2hhbmdlZCAmJiBwTmV4dFR4UmF0ZSkKKwkJeworCQkJTWxtZVNldFR4UmF0ZShwQWQsIHBFbnRyeSwgcE5leHRUeFJhdGUpOworCQl9CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoaXMgcm91dGluZSBpcyBleGVjdXRlZCBwZXJpb2RpY2FsbHkgaW5zaWRlIE1sbWVQZXJpb2RpY0V4ZWMoKSBhZnRlcgorCQlhc3NvY2lhdGlvbiB3aXRoIGFuIEFQLgorCQlJdCBjaGVja3MgaWYgU3RhQ2ZnLlBzbSBpcyBjb25zaXN0ZW50IHdpdGggdXNlciBwb2xpY3kgKHJlY29yZGVkIGluCisJCVN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlKS4gSWYgbm90LCBlbmZvcmNlIHVzZXIgcG9saWN5LiBIb3dldmVyLAorCQl0aGVyZSdyZSBzb21lIGNvbmRpdGlvbnMgdG8gY29uc2lkZXI6CisJCTEuIHdlIGRvbid0IHN1cHBvcnQgcG93ZXItc2F2aW5nIGluIEFESE9DIG1vZGUsIHNvIFBzbT1QV1JfQUNUSVZFIGFsbAorCQkgICB0aGUgdGltZSB3aGVuIE1pYnNzPT1UUlVFCisJCTIuIFdoZW4gbGluayB1cCBpbiBJTkZSQSBtb2RlLCBQc20gc2hvdWxkIG5vdCBiZSBzd2l0Y2ggdG8gUFdSX1NBVkUKKwkJICAgaWYgb3V0Z29pbmcgdHJhZmZpYyBhdmFpbGFibGUgaW4gVHhSaW5nIG9yIE1nbXRSaW5nLgorCU91dHB1dDoKKwkJMS4gY2hhbmdlIHBBZC0+U3RhQ2ZnLlBzbSB0byBQV1JfU0FWRSBvciBsZWF2ZSBpdCB1bnRvdWNoZWQKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lQ2hlY2tQc21DaGFuZ2UoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUxPTkcJTm93MzIpCit7CisJVUxPTkcJUG93ZXJNb2RlOworCisJLy8gY29uZGl0aW9uIC0KKwkvLyAxLiBQc20gbWF5YmUgT04gb25seSBoYXBwZW4gaW4gSU5GUkFTVFJVQ1RVUkUgbW9kZQorCS8vIDIuIHVzZXIgd2FudHMgZWl0aGVyIE1BWF9QU1Agb3IgRkFTVF9QU1AKKwkvLyAzLiBidXQgY3VycmVudCBwc20gaXMgbm90IGluIFBXUl9TQVZFCisJLy8gNC4gQ05UTCBzdGF0ZSBtYWNoaW5lIGlzIG5vdCBkb2luZyBTQ0FObmluZworCS8vIDUuIG5vIFRYIFNVQ0NFU1MgZXZlbnQgZm9yIHRoZSBwYXN0IDEtc2VjIHBlcmlvZAorI2lmZGVmIE5ESVM1MV9NSU5JUE9SVAorCWlmIChwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJQcm9maWxlID09IE5kaXNQb3dlclByb2ZpbGVCYXR0ZXJ5KQorCQlQb3dlck1vZGUgPSBwQWQtPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZTsKKwllbHNlCisjZW5kaWYKKwkJUG93ZXJNb2RlID0gcEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZTsKKworCWlmIChJTkZSQV9PTihwQWQpICYmCisJCShQb3dlck1vZGUgIT0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTSkgJiYKKwkJKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfQUNUSVZFKSAmJgorCQkocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpKQorCXsKKwkJTmRpc0dldFN5c3RlbVVwVGltZSgmcEFkLT5NbG1lLkxhc3RTZW5kTlVMTHBzbVRpbWUpOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlJ4Q291bnRTaW5jZUxhc3ROVUxMID0gMDsKKwkJTWxtZVNldFBzbUJpdChwQWQsIFBXUl9TQVZFKTsKKwkJaWYgKCEocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlKSkKKwkJeworCQkJUlRNUFNlbmROdWxsRnJhbWUocEFkLCBwQWQtPkNvbW1vbkNmZy5UeFJhdGUsIEZBTFNFKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVJUTVBTZW5kTnVsbEZyYW1lKHBBZCwgcEFkLT5Db21tb25DZmcuVHhSYXRlLCBUUlVFKTsKKwkJfQorCX0KK30KKworLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRCBNbG1lU2V0UHNtQml0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVCBwc20pCit7CisJQVVUT19SU1BfQ0ZHX1NUUlVDIGNzcjQ7CisKKwlwQWQtPlN0YUNmZy5Qc20gPSBwc207CisJUlRNUF9JT19SRUFEMzIocEFkLCBBVVRPX1JTUF9DRkcsICZjc3I0LndvcmQpOworCWNzcjQuZmllbGQuQWNrQ3RzUHNtQml0ID0gKHBzbSA9PSBQV1JfU0FWRSk/IDE6MDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1JTUF9DRkcsIGNzcjQud29yZCk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVNldFBzbUJpdCA9ICVkXG4iLCBwc20pKTsKK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQgTWxtZVNldFR4UHJlYW1ibGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUIFR4UHJlYW1ibGUpCit7CisJQVVUT19SU1BfQ0ZHX1NUUlVDIGNzcjQ7CisKKwkvLworCS8vIEFsd2F5cyB1c2UgTG9uZyBwcmVhbWJsZSBiZWZvcmUgdmVyaWZpYXRpb24gc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcyB3ZWxsLgorCS8vIFRvZG86IHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUgaWYgc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcworCS8vCisJLy9UeFByZWFtYmxlID0gUnQ4MDJfMTFQcmVhbWJsZUxvbmc7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIEFVVE9fUlNQX0NGRywgJmNzcjQud29yZCk7CisJaWYgKFR4UHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZUxvbmcpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lU2V0VHhQcmVhbWJsZSAoPSBMT05HIFBSRUFNQkxFKVxuIikpOworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpOworCQljc3I0LmZpZWxkLkF1dG9SZXNwb25kZXJQcmVhbWJsZSA9IDA7CisJfQorCWVsc2UKKwl7CisJCS8vIE5PVEU6IDFNYnBzIHNob3VsZCBhbHdheXMgdXNlIGxvbmcgcHJlYW1ibGUKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVNldFR4UHJlYW1ibGUgKD0gU0hPUlQgUFJFQU1CTEUpXG4iKSk7CisJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpOworCQljc3I0LmZpZWxkLkF1dG9SZXNwb25kZXJQcmVhbWJsZSA9IDE7CisJfQorCisJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19SU1BfQ0ZHLCBjc3I0LndvcmQpOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFVwZGF0ZSBiYXNpYyByYXRlIGJpdG1hcAorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworVk9JRCBVcGRhdGVCYXNpY1JhdGVCaXRtYXAoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlcikKK3sKKyAgICBJTlQgIGksIGo7CisgICAgICAgICAgICAgICAgICAvKiAxICAyICA1LjUsIDExLCAgNiwgIDksIDEyLCAxOCwgMjQsIDM2LCA0OCwgIDU0ICovCisgICAgVUNIQVIgcmF0ZVtdID0geyAyLCA0LCAgMTEsIDIyLCAxMiwgMTgsIDI0LCAzNiwgNDgsIDcyLCA5NiwgMTA4IH07CisgICAgVUNIQVIgKnN1cF9wID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5TdXBSYXRlOworICAgIFVDSEFSICpleHRfcCA9IHBBZGFwdGVyLT5Db21tb25DZmcuRXh0UmF0ZTsKKyAgICBVTE9ORyBiaXRtYXAgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJhc2ljUmF0ZUJpdG1hcDsKKworCisgICAgLyogaWYgQSBtb2RlLCBhbHdheXMgdXNlIGZpeCBCYXNpY1JhdGVCaXRNYXAgKi8KKyAgICAvL2lmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwgPT0gUEhZXzExQSkKKwlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCisgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQmFzaWNSYXRlQml0bWFwID0gMHgxNTA7IC8qIDYsIDEyLCAyNE0gKi8KKyAgICAvKiBFbmQgb2YgaWYgKi8KKworICAgIGlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLkJhc2ljUmF0ZUJpdG1hcCA+IDQwOTUpCisgICAgeworICAgICAgICAvKiAoMiBeIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKSAtMSAqLworICAgICAgICByZXR1cm47CisgICAgfSAvKiBFbmQgb2YgaWYgKi8KKworICAgIGZvcihpPTA7IGk8TUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVM7IGkrKykKKyAgICB7CisgICAgICAgIHN1cF9wW2ldICY9IDB4N2Y7CisgICAgICAgIGV4dF9wW2ldICY9IDB4N2Y7CisgICAgfSAvKiBFbmQgb2YgZm9yICovCisKKyAgICBmb3IoaT0wOyBpPE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOyBpKyspCisgICAgeworICAgICAgICBpZiAoYml0bWFwICYgKDEgPDwgaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcihqPTA7IGo8TUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVM7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc3VwX3Bbal0gPT0gcmF0ZVtpXSkKKyAgICAgICAgICAgICAgICAgICAgc3VwX3Bbal0gfD0gMHg4MDsKKyAgICAgICAgICAgICAgICAvKiBFbmQgb2YgaWYgKi8KKyAgICAgICAgICAgIH0gLyogRW5kIG9mIGZvciAqLworCisgICAgICAgICAgICBmb3Ioaj0wOyBqPE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGV4dF9wW2pdID09IHJhdGVbaV0pCisgICAgICAgICAgICAgICAgICAgIGV4dF9wW2pdIHw9IDB4ODA7CisgICAgICAgICAgICAgICAgLyogRW5kIG9mIGlmICovCisgICAgICAgICAgICB9IC8qIEVuZCBvZiBmb3IgKi8KKyAgICAgICAgfSAvKiBFbmQgb2YgaWYgKi8KKyAgICB9IC8qIEVuZCBvZiBmb3IgKi8KK30gLyogRW5kIG9mIFVwZGF0ZUJhc2ljUmF0ZUJpdG1hcCAqLworCisvLyBJUlFMID0gUEFTU0lWRV9MRVZFTAorLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCisvLyBiTGlua1VwIGlzIHRvIGlkZW50aWZ5IHRoZSBpbml0YWwgbGluayBzcGVlZC4KKy8vIFRSVUUgaW5kaWNhdGVzIHRoZSByYXRlIHVwZGF0ZSBhdCBsaW5rdXAsIHdlIHNob3VsZCBub3QgdHJ5IHRvIHNldCB0aGUgcmF0ZSBhdCA1NE1icHMuCitWT0lEIE1sbWVVcGRhdGVUeFJhdGVzKAorCUlOIFBSVE1QX0FEQVBURVIgCQlwQWQsCisJSU4gCUJPT0xFQU4JCSAJCWJMaW5rVXAsCisJSU4JVUNIQVIJCQkJYXBpZHgpCit7CisJaW50IGksIG51bTsKKwlVQ0hBUiBSYXRlID0gUkFURV82LCBNYXhEZXNpcmUgPSBSQVRFXzEsIE1heFN1cHBvcnQgPSBSQVRFXzE7CisJVUNIQVIgTWluU3VwcG9ydCA9IFJBVEVfNTQ7CisJVUxPTkcgQmFzaWNSYXRlQml0bWFwID0gMDsKKwlVQ0hBUiBDdXJyQmFzaWNSYXRlID0gUkFURV8xOworCVVDSEFSICpwU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgKnBFeHRSYXRlLCBFeHRSYXRlTGVuOworCVBIVFRSQU5TTUlUX1NFVFRJTkcJCXBIdFBoeSA9IE5VTEw7CisJUEhUVFJBTlNNSVRfU0VUVElORwkJcE1heEh0UGh5ID0gTlVMTDsKKwlQSFRUUkFOU01JVF9TRVRUSU5HCQlwTWluSHRQaHkgPSBOVUxMOworCUJPT0xFQU4gCQkJCSphdXRvX3JhdGVfY3VyX3A7CisJVUNIQVIJCQkJCUh0TWNzID0gTUNTX0FVVE87CisKKwkvLyBmaW5kIG1heCBkZXNpcmVkIHJhdGUKKwlVcGRhdGVCYXNpY1JhdGVCaXRtYXAocEFkKTsKKworCW51bSA9IDA7CisJYXV0b19yYXRlX2N1cl9wID0gTlVMTDsKKwlmb3IgKGk9MDsgaTxNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsgaSsrKQorCXsKKwkJc3dpdGNoIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlW2ldICYgMHg3ZikKKwkJeworCQkJY2FzZSAyOiAgUmF0ZSA9IFJBVEVfMTsgICBudW0rKzsgICBicmVhazsKKwkJCWNhc2UgNDogIFJhdGUgPSBSQVRFXzI7ICAgbnVtKys7ICAgYnJlYWs7CisJCQljYXNlIDExOiBSYXRlID0gUkFURV81XzU7IG51bSsrOyAgIGJyZWFrOworCQkJY2FzZSAyMjogUmF0ZSA9IFJBVEVfMTE7ICBudW0rKzsgICBicmVhazsKKwkJCWNhc2UgMTI6IFJhdGUgPSBSQVRFXzY7ICAgbnVtKys7ICAgYnJlYWs7CisJCQljYXNlIDE4OiBSYXRlID0gUkFURV85OyAgIG51bSsrOyAgIGJyZWFrOworCQkJY2FzZSAyNDogUmF0ZSA9IFJBVEVfMTI7ICBudW0rKzsgICBicmVhazsKKwkJCWNhc2UgMzY6IFJhdGUgPSBSQVRFXzE4OyAgbnVtKys7ICAgYnJlYWs7CisJCQljYXNlIDQ4OiBSYXRlID0gUkFURV8yNDsgIG51bSsrOyAgIGJyZWFrOworCQkJY2FzZSA3MjogUmF0ZSA9IFJBVEVfMzY7ICBudW0rKzsgICBicmVhazsKKwkJCWNhc2UgOTY6IFJhdGUgPSBSQVRFXzQ4OyAgbnVtKys7ICAgYnJlYWs7CisJCQljYXNlIDEwODogUmF0ZSA9IFJBVEVfNTQ7IG51bSsrOyAgIGJyZWFrOworCQkJLy9kZWZhdWx0OiBSYXRlID0gUkFURV8xOyAgIGJyZWFrOworCQl9CisJCWlmIChNYXhEZXNpcmUgPCBSYXRlKSAgTWF4RGVzaXJlID0gUmF0ZTsKKwl9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCXBIdFBoeSAJCT0gJnBBZC0+U3RhQ2ZnLkhUUGh5TW9kZTsKKwkJcE1heEh0UGh5CT0gJnBBZC0+U3RhQ2ZnLk1heEhUUGh5TW9kZTsKKwkJcE1pbkh0UGh5CT0gJnBBZC0+U3RhQ2ZnLk1pbkhUUGh5TW9kZTsKKworCQlhdXRvX3JhdGVfY3VyX3AgPSAmcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2g7CisJCUh0TWNzIAkJPSBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUzsKKworCQlpZiAoKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKSAmJgorCQkJKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikgJiYKKwkJCShNYXhEZXNpcmUgPiBSQVRFXzExKSkKKwkJeworCQkJTWF4RGVzaXJlID0gUkFURV8xMTsKKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCXBBZC0+Q29tbW9uQ2ZnLk1heERlc2lyZWRSYXRlID0gTWF4RGVzaXJlOworCXBNaW5IdFBoeS0+d29yZCA9IDA7CisJcE1heEh0UGh5LT53b3JkID0gMDsKKwlwSHRQaHktPndvcmQgPSAwOworCisJLy8gQXV0byByYXRlIHN3aXRjaGluZyBpcyBlbmFibGVkIG9ubHkgaWYgbW9yZSB0aGFuIG9uZSBERVNJUkVEIFJBVEVTIGFyZQorCS8vIHNwZWNpZmllZDsgb3RoZXJ3aXNlIGRpc2FibGVkCisJaWYgKG51bSA8PSAxKQorCXsKKwkJKmF1dG9fcmF0ZV9jdXJfcCA9IEZBTFNFOworCX0KKwllbHNlCisJeworCQkqYXV0b19yYXRlX2N1cl9wID0gVFJVRTsKKwl9CisKKyNpZiAxCisJaWYgKEh0TWNzICE9IE1DU19BVVRPKQorCXsKKwkJKmF1dG9fcmF0ZV9jdXJfcCA9IEZBTFNFOworCX0KKwllbHNlCisJeworCQkqYXV0b19yYXRlX2N1cl9wID0gVFJVRTsKKwl9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCWlmICgoQURIT0NfT04ocEFkKSB8fCBJTkZSQV9PTihwQWQpKSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCisJeworCQlwU3VwUmF0ZSA9ICZwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlWzBdOworCQlwRXh0UmF0ZSA9ICZwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlWzBdOworCQlTdXBSYXRlTGVuID0gcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbjsKKwkJRXh0UmF0ZUxlbiA9IHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW47CisJfQorCWVsc2UKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl7CisJCXBTdXBSYXRlID0gJnBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMF07CisJCXBFeHRSYXRlID0gJnBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVbMF07CisJCVN1cFJhdGVMZW4gPSBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuOworCQlFeHRSYXRlTGVuID0gcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbjsKKwl9CisKKwkvLyBmaW5kIG1heCBzdXBwb3J0ZWQgcmF0ZQorCWZvciAoaT0wOyBpPFN1cFJhdGVMZW47IGkrKykKKwl7CisJCXN3aXRjaCAocFN1cFJhdGVbaV0gJiAweDdmKQorCQl7CisJCQljYXNlIDI6ICAgUmF0ZSA9IFJBVEVfMTsJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwMTsJIGJyZWFrOworCQkJY2FzZSA0OiAgIFJhdGUgPSBSQVRFXzI7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDI7CSBicmVhazsKKwkJCWNhc2UgMTE6ICBSYXRlID0gUkFURV81XzU7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDQ7CSBicmVhazsKKwkJCWNhc2UgMjI6ICBSYXRlID0gUkFURV8xMTsJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwODsJIGJyZWFrOworCQkJY2FzZSAxMjogIFJhdGUgPSBSQVRFXzY7CS8qaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkqLyAgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAxMDsgIGJyZWFrOworCQkJY2FzZSAxODogIFJhdGUgPSBSQVRFXzk7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMjA7CSBicmVhazsKKwkJCWNhc2UgMjQ6ICBSYXRlID0gUkFURV8xMjsJLyppZiAocFN1cFJhdGVbaV0gJiAweDgwKSovICBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDQwOyAgYnJlYWs7CisJCQljYXNlIDM2OiAgUmF0ZSA9IFJBVEVfMTg7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwODA7CSBicmVhazsKKwkJCWNhc2UgNDg6ICBSYXRlID0gUkFURV8yNDsJLyppZiAocFN1cFJhdGVbaV0gJiAweDgwKSovICBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMTAwOyAgYnJlYWs7CisJCQljYXNlIDcyOiAgUmF0ZSA9IFJBVEVfMzY7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAyMDA7CSBicmVhazsKKwkJCWNhc2UgOTY6ICBSYXRlID0gUkFURV80ODsJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDQwMDsJIGJyZWFrOworCQkJY2FzZSAxMDg6IFJhdGUgPSBSQVRFXzU0OwlpZiAocFN1cFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwODAwOwkgYnJlYWs7CisJCQlkZWZhdWx0OiAgUmF0ZSA9IFJBVEVfMTsJYnJlYWs7CisJCX0KKwkJaWYgKE1heFN1cHBvcnQgPCBSYXRlKQlNYXhTdXBwb3J0ID0gUmF0ZTsKKworCQlpZiAoTWluU3VwcG9ydCA+IFJhdGUpIE1pblN1cHBvcnQgPSBSYXRlOworCX0KKworCWZvciAoaT0wOyBpPEV4dFJhdGVMZW47IGkrKykKKwl7CisJCXN3aXRjaCAocEV4dFJhdGVbaV0gJiAweDdmKQorCQl7CisJCQljYXNlIDI6ICAgUmF0ZSA9IFJBVEVfMTsJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwMTsJIGJyZWFrOworCQkJY2FzZSA0OiAgIFJhdGUgPSBSQVRFXzI7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDI7CSBicmVhazsKKwkJCWNhc2UgMTE6ICBSYXRlID0gUkFURV81XzU7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDQ7CSBicmVhazsKKwkJCWNhc2UgMjI6ICBSYXRlID0gUkFURV8xMTsJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwODsJIGJyZWFrOworCQkJY2FzZSAxMjogIFJhdGUgPSBSQVRFXzY7CS8qaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkqLyAgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAxMDsgIGJyZWFrOworCQkJY2FzZSAxODogIFJhdGUgPSBSQVRFXzk7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMjA7CSBicmVhazsKKwkJCWNhc2UgMjQ6ICBSYXRlID0gUkFURV8xMjsJLyppZiAocEV4dFJhdGVbaV0gJiAweDgwKSovICBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDQwOyAgYnJlYWs7CisJCQljYXNlIDM2OiAgUmF0ZSA9IFJBVEVfMTg7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwODA7CSBicmVhazsKKwkJCWNhc2UgNDg6ICBSYXRlID0gUkFURV8yNDsJLyppZiAocEV4dFJhdGVbaV0gJiAweDgwKSovICBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMTAwOyAgYnJlYWs7CisJCQljYXNlIDcyOiAgUmF0ZSA9IFJBVEVfMzY7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAyMDA7CSBicmVhazsKKwkJCWNhc2UgOTY6ICBSYXRlID0gUkFURV80ODsJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDQwMDsJIGJyZWFrOworCQkJY2FzZSAxMDg6IFJhdGUgPSBSQVRFXzU0OwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwODAwOwkgYnJlYWs7CisJCQlkZWZhdWx0OiAgUmF0ZSA9IFJBVEVfMTsJYnJlYWs7CisJCX0KKwkJaWYgKE1heFN1cHBvcnQgPCBSYXRlKQlNYXhTdXBwb3J0ID0gUmF0ZTsKKworCQlpZiAoTWluU3VwcG9ydCA+IFJhdGUpIE1pblN1cHBvcnQgPSBSYXRlOworCX0KKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIExFR0FDWV9CQVNJQ19SQVRFLCBCYXNpY1JhdGVCaXRtYXApOworCisJLy8gY2FsY3VsYXRlIHRoZSBleHB0ZWN0ZWQgQUNLIHJhdGUgZm9yIGVhY2ggVFggcmF0ZS4gVGhpcyBpbmZvIGlzIHVzZWQgdG8gY2FjdWxhdGUKKwkvLyB0aGUgRFVSQVRJT04gZmllbGQgb2Ygb3V0Z29pbmcgdW5paWNhc3QgREFUQS9NR01UIGZyYW1lCisJZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVM7IGkrKykKKwl7CisJCWlmIChCYXNpY1JhdGVCaXRtYXAgJiAoMHgwMSA8PCBpKSkKKwkJCUN1cnJCYXNpY1JhdGUgPSAoVUNIQVIpaTsKKwkJcEFkLT5Db21tb25DZmcuRXhwZWN0ZWRBQ0tSYXRlW2ldID0gQ3VyckJhc2ljUmF0ZTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIk1sbWVVcGRhdGVUeFJhdGVzW01heFN1cHBvcnQgPSAlZF0gPSBNYXhEZXNpcmUgJWQgTWJwc1xuIiwgUmF0ZUlkVG9NYnBzW01heFN1cHBvcnRdLCBSYXRlSWRUb01icHNbTWF4RGVzaXJlXSkpOworCS8vIG1heCB0eCByYXRlID0gbWluIHttYXggZGVzaXJlIHJhdGUsIG1heCBzdXBwb3J0ZWQgcmF0ZX0KKwlpZiAoTWF4U3VwcG9ydCA8IE1heERlc2lyZSkKKwkJcEFkLT5Db21tb25DZmcuTWF4VHhSYXRlID0gTWF4U3VwcG9ydDsKKwllbHNlCisJCXBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA9IE1heERlc2lyZTsKKworCXBBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZSA9IE1pblN1cHBvcnQ7CisJaWYgKCphdXRvX3JhdGVfY3VyX3ApCisJeworCQlzaG9ydCBkYm0gPSAwOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJZGJtID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGE7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCWlmIChiTGlua1VwID09IFRSVUUpCisJCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPSBSQVRFXzI0OworCQllbHNlCisJCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGU7CisKKwkJaWYgKGRibSA8IC03NSkKKwkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSA9IFJBVEVfMTE7CisJCWVsc2UgaWYgKGRibSA8IC03MCkKKwkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSA9IFJBVEVfMjQ7CisKKwkJLy8gc2hvdWxkIG5ldmVyIGV4Y2VlZCBNYXhUeFJhdGUgKGNvbnNpZGVyIDExQi1vbmx5IG1vZGUpCisJCWlmIChwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPiBwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUpCisJCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGU7CisKKwkJcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXggPSAwOworCX0KKwllbHNlCisJeworCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGU7CisJCXBIdFBoeS0+ZmllbGQuTUNTCT0gKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA+IDMpID8gKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSAtIDQpIDogcEFkLT5Db21tb25DZmcuTWF4VHhSYXRlOworCQlwSHRQaHktPmZpZWxkLk1PREUJPSAocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlID4gMykgPyBNT0RFX09GRE0gOiBNT0RFX0NDSzsKKworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5TVEJDCT0gcEh0UGh5LT5maWVsZC5TVEJDOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJCT0gcEh0UGh5LT5maWVsZC5TaG9ydEdJOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MJCT0gcEh0UGh5LT5maWVsZC5NQ1M7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUJPSBwSHRQaHktPmZpZWxkLk1PREU7CisJfQorCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSA8PSBSQVRFXzExKQorCXsKKwkJcE1heEh0UGh5LT5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCXBNYXhIdFBoeS0+ZmllbGQuTUNTID0gcEFkLT5Db21tb25DZmcuVHhSYXRlOworCQlwTWluSHRQaHktPmZpZWxkLk1DUyA9IHBBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZTsKKwl9CisJZWxzZQorCXsKKwkJcE1heEh0UGh5LT5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQlwTWF4SHRQaHktPmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLlR4UmF0ZV07CisJCWlmIChwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGUgPj0gUkFURV82ICYmIChwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGUgPD0gUkFURV81NCkpCisJCQl7cE1pbkh0UGh5LT5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGVdO30KKwkJZWxzZQorCQkJe3BNaW5IdFBoeS0+ZmllbGQuTUNTID0gcEFkLT5Db21tb25DZmcuTWluVHhSYXRlO30KKwl9CisKKwlwSHRQaHktPndvcmQgPSAocE1heEh0UGh5LT53b3JkKTsKKwlpZiAoYkxpbmtVcCAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCisJeworCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUud29yZCA9IHBIdFBoeS0+d29yZDsKKwkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTWF4SFRQaHlNb2RlLndvcmQgPSBwTWF4SHRQaHktPndvcmQ7CisJCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1pbkhUUGh5TW9kZS53b3JkID0gcE1pbkh0UGh5LT53b3JkOworCX0KKwllbHNlCisJeworCQlzd2l0Y2ggKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpCisJCXsKKwkJCWNhc2UgUEhZXzExQkdfTUlYRUQ6CisJCQljYXNlIFBIWV8xMUI6CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQljYXNlIFBIWV8xMUJHTl9NSVhFRDoKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IFJBVEVfMTsKKwkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBSQVRFXzE7CisJCQkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfMTE7CisJCQkJYnJlYWs7CisJCQljYXNlIFBIWV8xMUc6CisJCQljYXNlIFBIWV8xMUE6CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQljYXNlIFBIWV8xMUFHTl9NSVhFRDoKKwkJCWNhc2UgUEhZXzExR05fTUlYRUQ6CisJCQljYXNlIFBIWV8xMU5fMl80RzoKKwkJCWNhc2UgUEhZXzExQU5fTUlYRUQ6CisJCQljYXNlIFBIWV8xMU5fNUc6CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkJcEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPSBSQVRFXzY7CisJCQkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfNjsKKwkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOworCQkJCWJyZWFrOworCQkJY2FzZSBQSFlfMTFBQkdfTUlYRUQ6CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQljYXNlIFBIWV8xMUFCR05fTUlYRUQ6CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpCisJCQkJeworCQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IFJBVEVfMTsKKwkJCQkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfMTsKKwkJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IFJBVEVfMTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPSBSQVRFXzY7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBSQVRFXzY7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6IC8vIGVycm9yCisJCQkJcEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPSBSQVRFXzY7CisgICAgICAgICAgICAgICAgICAgICAgICAJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKKwkJCQlwQWQtPkNvbW1vbkNmZy5SdHNSYXRlID0gUkFURV8xOworCQkJCWJyZWFrOworCQl9CisJCS8vCisJCS8vIEtlZXAgQmFzaWMgTWxtZSBSYXRlLgorCQkvLworCQlwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdLkhUUGh5TW9kZS53b3JkID0gcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LndvcmQ7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9PSBNT0RFX09GRE0pCisJCQlwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1tSQVRFXzI0XTsKKwkJZWxzZQorCQkJcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTID0gUkFURV8xOworCQlwQWQtPkNvbW1vbkNmZy5CYXNpY01sbWVSYXRlID0gcEFkLT5Db21tb25DZmcuTWxtZVJhdGU7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIE1sbWVVcGRhdGVUeFJhdGVzIChNYXhEZXNpcmU9JWQsIE1heFN1cHBvcnQ9JWQsIE1heFR4UmF0ZT0lZCwgTWluUmF0ZT0lZCwgUmF0ZSBTd2l0Y2hpbmcgPSVkKVxuIiwKKwkJCSBSYXRlSWRUb01icHNbTWF4RGVzaXJlXSwgUmF0ZUlkVG9NYnBzW01heFN1cHBvcnRdLCBSYXRlSWRUb01icHNbcEFkLT5Db21tb25DZmcuTWF4VHhSYXRlXSwgUmF0ZUlkVG9NYnBzW3BBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZV0sCisJCQkgLypPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpKi8qYXV0b19yYXRlX2N1cl9wKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIE1sbWVVcGRhdGVUeFJhdGVzIChUeFJhdGU9JWQsIFJ0c1JhdGU9JWQsIEJhc2ljUmF0ZUJpdG1hcD0weCUwNGx4KVxuIiwKKwkJCSBSYXRlSWRUb01icHNbcEFkLT5Db21tb25DZmcuVHhSYXRlXSwgUmF0ZUlkVG9NYnBzW3BBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGVdLCBCYXNpY1JhdGVCaXRtYXApKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lVXBkYXRlVHhSYXRlcyAoTWxtZVRyYW5zbWl0PTB4JXgsIE1pbkhUUGh5TW9kZT0leCwgTWF4SFRQaHlNb2RlPTB4JXgsIEhUUGh5TW9kZT0weCV4KVxuIiwKKwkJCSBwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQud29yZCwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NaW5IVFBoeU1vZGUud29yZCAscEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NYXhIVFBoeU1vZGUud29yZCAscEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUud29yZCApKTsKK30KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIGZ1bmN0aW9uIHVwZGF0ZSBIVCBSYXRlIHNldHRpbmcuCisJCUlucHV0IFdjaWQgdmFsdWUgaXMgdmFsaWQgZm9yIDIgY2FzZSA6CisJCTEuIGl0J3MgdXNlZCBmb3IgU3RhdGlvbiBpbiBpbmZyYSBtb2RlIHRoYXQgY29weSBBUCByYXRlIHRvIE1hY3RhYmxlLgorCQkyLiBPUiBTdGF0aW9uIAlpbiBhZGhvYyBtb2RlIHRvIGNvcHkgcGVlcidzIEhUIHJhdGUgdG8gTWFjdGFibGUuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZVVwZGF0ZUh0VHhSYXRlcygKKwlJTiBQUlRNUF9BREFQVEVSIAkJcEFkLAorCUlOCVVDSEFSCQkJCWFwaWR4KQoreworCVVDSEFSCVN0YmNNY3M7IC8vaiwgU3RiY01jcywgYml0bWFzazsKKwlDSEFSIAlpOyAvLyAzKjMKKwlSVF9IVF9DQVBBQklMSVRZIAkqcFJ0SHRDYXAgPSBOVUxMOworCVJUX0hUX1BIWV9JTkZPCQkqcEFjdGl2ZUh0UGh5ID0gTlVMTDsKKwlVTE9ORwkJQmFzaWNNQ1M7CisJVUNIQVIgaiwgYml0bWFzazsKKwlQUlRfSFRfUEhZX0lORk8JCQlwRGVzaXJlSHRQaHkgPSBOVUxMOworCVBIVFRSQU5TTUlUX1NFVFRJTkcJCXBIdFBoeSA9IE5VTEw7CisJUEhUVFJBTlNNSVRfU0VUVElORwkJcE1heEh0UGh5ID0gTlVMTDsKKwlQSFRUUkFOU01JVF9TRVRUSU5HCQlwTWluSHRQaHkgPSBOVUxMOworCUJPT0xFQU4gCQkJCSphdXRvX3JhdGVfY3VyX3A7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIk1sbWVVcGRhdGVIdFR4UmF0ZXM9PT0+IFxuIikpOworCisJYXV0b19yYXRlX2N1cl9wID0gTlVMTDsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlwRGVzaXJlSHRQaHkJPSAmcEFkLT5TdGFDZmcuRGVzaXJlZEh0UGh5SW5mbzsKKwkJcEFjdGl2ZUh0UGh5CT0gJnBBZC0+U3RhQ2ZnLkRlc2lyZWRIdFBoeUluZm87CisJCXBIdFBoeSAJCT0gJnBBZC0+U3RhQ2ZnLkhUUGh5TW9kZTsKKwkJcE1heEh0UGh5CT0gJnBBZC0+U3RhQ2ZnLk1heEhUUGh5TW9kZTsKKwkJcE1pbkh0UGh5CT0gJnBBZC0+U3RhQ2ZnLk1pbkhUUGh5TW9kZTsKKworCQlhdXRvX3JhdGVfY3VyX3AgPSAmcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2g7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJaWYgKChBREhPQ19PTihwQWQpIHx8IElORlJBX09OKHBBZCkpICYmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSkKKwl7CisJCWlmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBGQUxTRSkKKwkJCXJldHVybjsKKworCQlwUnRIdENhcCA9ICZwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeTsKKwkJcEFjdGl2ZUh0UGh5ID0gJnBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm87CisJCVN0YmNNY3MgPSAoVUNIQVIpcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8zLlN0YmNNY3M7CisJCUJhc2ljTUNTID1wQWQtPk1sbWVBdXguQWRkSHRJbmZvLk1DU1NldFswXSsocEFkLT5NbG1lQXV4LkFkZEh0SW5mby5NQ1NTZXRbMV08PDgpKyhTdGJjTWNzPDwxNik7CisJCWlmICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlR4U1RCQykgJiYgKHBSdEh0Q2FwLT5SeFNUQkMpICYmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpKQorCQkJcE1heEh0UGh5LT5maWVsZC5TVEJDID0gU1RCQ19VU0U7CisJCWVsc2UKKwkJCXBNYXhIdFBoeS0+ZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKKwl9CisJZWxzZQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCXsKKwkJaWYgKHBEZXNpcmVIdFBoeS0+Ykh0RW5hYmxlID09IEZBTFNFKQorCQkJcmV0dXJuOworCisJCXBSdEh0Q2FwID0gJnBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeTsKKwkJU3RiY01jcyA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvMy5TdGJjTWNzOworCQlCYXNpY01DUyA9IHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5NQ1NTZXRbMF0rKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5NQ1NTZXRbMV08PDgpKyhTdGJjTWNzPDwxNik7CisJCWlmICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlR4U1RCQykgJiYgKHBSdEh0Q2FwLT5SeFNUQkMpICYmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpKQorCQkJcE1heEh0UGh5LT5maWVsZC5TVEJDID0gU1RCQ19VU0U7CisJCWVsc2UKKwkJCXBNYXhIdFBoeS0+ZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKKwl9CisKKwkvLyBEZWNpZGUgTUFYIGh0IHJhdGUuCisJaWYgKChwUnRIdENhcC0+R0YpICYmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuR0YpKQorCQlwTWF4SHRQaHktPmZpZWxkLk1PREUgPSBNT0RFX0hUR1JFRU5GSUVMRDsKKwllbHNlCisJCXBNYXhIdFBoeS0+ZmllbGQuTU9ERSA9IE1PREVfSFRNSVg7CisKKyAgICBpZiAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGgpICYmIChwUnRIdENhcC0+Q2hhbm5lbFdpZHRoKSkKKwkJcE1heEh0UGh5LT5maWVsZC5CVyA9IEJXXzQwOworCWVsc2UKKwkJcE1heEh0UGh5LT5maWVsZC5CVyA9IEJXXzIwOworCisgICAgaWYgKHBNYXhIdFBoeS0+ZmllbGQuQlcgPT0gQldfMjApCisJCXBNYXhIdFBoeS0+ZmllbGQuU2hvcnRHSSA9IChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjIwICYgcFJ0SHRDYXAtPlNob3J0R0lmb3IyMCk7CisJZWxzZQorCQlwTWF4SHRQaHktPmZpZWxkLlNob3J0R0kgPSAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3I0MCAmIHBSdEh0Q2FwLT5TaG9ydEdJZm9yNDApOworCisJZm9yIChpPTIzOyBpPj0wOyBpLS0pIC8vIDMqMworCXsKKwkJaiA9IGkvODsKKwkJYml0bWFzayA9ICgxPDwoaS0oaio4KSkpOworCisJCWlmICgocEFjdGl2ZUh0UGh5LT5NQ1NTZXRbal0gJiBiaXRtYXNrKSAmJiAocERlc2lyZUh0UGh5LT5NQ1NTZXRbal0gJiBiaXRtYXNrKSkKKwkJeworCQkJcE1heEh0UGh5LT5maWVsZC5NQ1MgPSBpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaT09MCkKKwkJCWJyZWFrOworCX0KKworCS8vIENvcHkgTUlOIGh0IHJhdGUuICBydDI4NjA/Pz8KKwlwTWluSHRQaHktPmZpZWxkLkJXID0gQldfMjA7CisJcE1pbkh0UGh5LT5maWVsZC5NQ1MgPSAwOworCXBNaW5IdFBoeS0+ZmllbGQuU1RCQyA9IDA7CisJcE1pbkh0UGh5LT5maWVsZC5TaG9ydEdJID0gMDsKKwkvL0lmIFNUQSBhc3NpZ25zIGZpeGVkIHJhdGUuIHVwZGF0ZSB0byBmaXhlZCBoZXJlLgorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCWlmICggKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmIChwRGVzaXJlSHRQaHktPk1DU1NldFswXSAhPSAweGZmKSkKKwl7CisJCWlmIChwRGVzaXJlSHRQaHktPk1DU1NldFs0XSAhPSAwKQorCQl7CisJCQlwTWF4SHRQaHktPmZpZWxkLk1DUyA9IDMyOworCQkJcE1pbkh0UGh5LT5maWVsZC5NQ1MgPSAzMjsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiTWxtZVVwZGF0ZUh0VHhSYXRlczw9PT0gVXNlIEZpeGVkIE1DUyA9ICVkXG4iLHBNaW5IdFBoeS0+ZmllbGQuTUNTKSk7CisJCX0KKworCQlmb3IgKGk9MjM7IChDSEFSKWkgPj0gMDsgaS0tKSAvLyAzKjMKKwkJeworCQkJaiA9IGkvODsKKwkJCWJpdG1hc2sgPSAoMTw8KGktKGoqOCkpKTsKKwkJCWlmICggKHBEZXNpcmVIdFBoeS0+TUNTU2V0W2pdICYgYml0bWFzaykgJiYgKHBBY3RpdmVIdFBoeS0+TUNTU2V0W2pdICYgYml0bWFzaykpCisJCQl7CisJCQkJcE1heEh0UGh5LT5maWVsZC5NQ1MgPSBpOworCQkJCXBNaW5IdFBoeS0+ZmllbGQuTUNTID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChpPT0wKQorCQkJCWJyZWFrOworCQl9CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKKwkvLyBEZWNpZGUgaHQgcmF0ZQorCXBIdFBoeS0+ZmllbGQuU1RCQyA9IHBNYXhIdFBoeS0+ZmllbGQuU1RCQzsKKwlwSHRQaHktPmZpZWxkLkJXID0gcE1heEh0UGh5LT5maWVsZC5CVzsKKwlwSHRQaHktPmZpZWxkLk1PREUgPSBwTWF4SHRQaHktPmZpZWxkLk1PREU7CisJcEh0UGh5LT5maWVsZC5NQ1MgPSBwTWF4SHRQaHktPmZpZWxkLk1DUzsKKwlwSHRQaHktPmZpZWxkLlNob3J0R0kgPSBwTWF4SHRQaHktPmZpZWxkLlNob3J0R0k7CisKKwkvLyB1c2UgZGVmYXVsdCBub3cuIHJ0Mjg2MAorCWlmIChwRGVzaXJlSHRQaHktPk1DU1NldFswXSAhPSAweGZmKQorCQkqYXV0b19yYXRlX2N1cl9wID0gRkFMU0U7CisJZWxzZQorCQkqYXV0b19yYXRlX2N1cl9wID0gVFJVRTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNbG1lVXBkYXRlSHRUeFJhdGVzPC0tLS5BTXNkdVNpemUgPSAlZCAgXG4iLCBwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplICkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiVFg6IE1DU1swXSA9ICV4IChjaG9vc2UgJWQpLCBCVyA9ICVkLCBTaG9ydEdJID0gJWQsIE1PREUgPSAlZCwgIFxuIiwgcEFjdGl2ZUh0UGh5LT5NQ1NTZXRbMF0scEh0UGh5LT5maWVsZC5NQ1MsCisJCXBIdFBoeS0+ZmllbGQuQlcsIHBIdFBoeS0+ZmllbGQuU2hvcnRHSSwgcEh0UGh5LT5maWVsZC5NT0RFKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJNbG1lVXBkYXRlSHRUeFJhdGVzPD09PSBcbiIpKTsKK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCitWT0lEIE1sbWVSYWRpb09mZigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlSVDI4WFhfTUxNRV9SQURJT19PRkYocEFkKTsKK30KKworLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCitWT0lEIE1sbWVSYWRpb09uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVJUMjhYWF9NTE1FX1JBRElPX09OKHBBZCk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGJzc190YWJsZS5jCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworLyohIFxicmllZiBpbml0aWFsaXplIEJTUyB0YWJsZQorICoJXHBhcmFtIHBfdGFiIHBvaW50ZXIgdG8gdGhlIHRhYmxlCisgKglccmV0dXJuIG5vbmUKKyAqCVxwcmUKKyAqCVxwb3N0CisKKyBJUlFMID0gUEFTU0lWRV9MRVZFTAorIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKi8KK1ZPSUQgQnNzVGFibGVJbml0KAorCUlOIEJTU19UQUJMRSAqVGFiKQoreworCWludCBpOworCisJVGFiLT5Cc3NOciA9IDA7CisgICAgVGFiLT5Cc3NPdmVybGFwTnIgPSAwOworCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX0JTU19UQUJMRTsgaSsrKQorCXsKKwkJTmRpc1plcm9NZW1vcnkoJlRhYi0+QnNzRW50cnlbaV0sIHNpemVvZihCU1NfRU5UUlkpKTsKKwkJVGFiLT5Cc3NFbnRyeVtpXS5Sc3NpID0gLTEyNzsJLy8gaW5pdGlhbCB0aGUgcnNzaSBhcyBhIG1pbmltdW0gdmFsdWUKKwl9Cit9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQgQkFUYWJsZUluaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gQkFfVEFCTEUgKlRhYikKK3sKKwlpbnQgaTsKKworCVRhYi0+bnVtQXNPcmlnaW5hdG9yID0gMDsKKwlUYWItPm51bUFzUmVjaXBpZW50ID0gMDsKKwlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX0JBX1JFQ19UQUJMRTsgaSsrKQorCXsKKwkJVGFiLT5CQVJlY0VudHJ5W2ldLlJFQ19CQV9TdGF0dXMgPSBSZWNpcGllbnRfTk9ORTsKKwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJihUYWItPkJBUmVjRW50cnlbaV0uUnhSZVJpbmdMb2NrKSk7CisJfQorCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX0JBX09SSV9UQUJMRTsgaSsrKQorCXsKKwkJVGFiLT5CQU9yaUVudHJ5W2ldLk9SSV9CQV9TdGF0dXMgPSBPcmlnaW5hdG9yX05PTkU7CisJfQorfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisvKiEgXGJyaWVmIHNlYXJjaCB0aGUgQlNTIHRhYmxlIGJ5IFNTSUQKKyAqCVxwYXJhbSBwX3RhYiBwb2ludGVyIHRvIHRoZSBic3MgdGFibGUKKyAqCVxwYXJhbSBzc2lkIFNTSUQgc3RyaW5nCisgKglccmV0dXJuIGluZGV4IG9mIHRoZSB0YWJsZSwgQlNTX05PVF9GT1VORCBpZiBub3QgaW4gdGhlIHRhYmxlCisgKglccHJlCisgKglccG9zdAorICoJXG5vdGUgc2VhcmNoIGJ5IHNlcXVlbnRpYWwgc2VhcmNoCisKKyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICovCitVTE9ORyBCc3NUYWJsZVNlYXJjaCgKKwlJTiBCU1NfVEFCTEUgKlRhYiwKKwlJTiBQVUNIQVIJIHBCc3NpZCwKKwlJTiBVQ0hBUgkgQ2hhbm5lbCkKK3sKKwlVQ0hBUiBpOworCisJZm9yIChpID0gMDsgaSA8IFRhYi0+QnNzTnI7IGkrKykKKwl7CisJCS8vCisJCS8vIFNvbWUgQVAgdGhhdCBzdXBwb3J0IEEvQi9HIG1vZGUgdGhhdCBtYXkgdXNlZCB0aGUgc2FtZSBCU1NJRCBvbiAxMUEgYW5kIDExQi9HLgorCQkvLyBXZSBzaG91bGQgZGlzdGluZ3Vpc2ggdGhpcyBjYXNlLgorCQkvLworCQlpZiAoKCgoVGFiLT5Cc3NFbnRyeVtpXS5DaGFubmVsIDw9IDE0KSAmJiAoQ2hhbm5lbCA8PSAxNCkpIHx8CisJCQkgKChUYWItPkJzc0VudHJ5W2ldLkNoYW5uZWwgPiAxNCkgJiYgKENoYW5uZWwgPiAxNCkpKSAmJgorCQkJTUFDX0FERFJfRVFVQUwoVGFiLT5Cc3NFbnRyeVtpXS5Cc3NpZCwgcEJzc2lkKSkKKwkJeworCQkJcmV0dXJuIGk7CisJCX0KKwl9CisJcmV0dXJuIChVTE9ORylCU1NfTk9UX0ZPVU5EOworfQorCitVTE9ORyBCc3NTc2lkVGFibGVTZWFyY2goCisJSU4gQlNTX1RBQkxFICpUYWIsCisJSU4gUFVDSEFSCSBwQnNzaWQsCisJSU4gUFVDSEFSCSBwU3NpZCwKKwlJTiBVQ0hBUgkgU3NpZExlbiwKKwlJTiBVQ0hBUgkgQ2hhbm5lbCkKK3sKKwlVQ0hBUiBpOworCisJZm9yIChpID0gMDsgaSA8IFRhYi0+QnNzTnI7IGkrKykKKwl7CisJCS8vCisJCS8vIFNvbWUgQVAgdGhhdCBzdXBwb3J0IEEvQi9HIG1vZGUgdGhhdCBtYXkgdXNlZCB0aGUgc2FtZSBCU1NJRCBvbiAxMUEgYW5kIDExQi9HLgorCQkvLyBXZSBzaG91bGQgZGlzdGluZ3Vpc2ggdGhpcyBjYXNlLgorCQkvLworCQlpZiAoKCgoVGFiLT5Cc3NFbnRyeVtpXS5DaGFubmVsIDw9IDE0KSAmJiAoQ2hhbm5lbCA8PSAxNCkpIHx8CisJCQkgKChUYWItPkJzc0VudHJ5W2ldLkNoYW5uZWwgPiAxNCkgJiYgKENoYW5uZWwgPiAxNCkpKSAmJgorCQkJTUFDX0FERFJfRVFVQUwoVGFiLT5Cc3NFbnRyeVtpXS5Cc3NpZCwgcEJzc2lkKSAmJgorCQkJU1NJRF9FUVVBTChwU3NpZCwgU3NpZExlbiwgVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkLCBUYWItPkJzc0VudHJ5W2ldLlNzaWRMZW4pKQorCQl7CisJCQlyZXR1cm4gaTsKKwkJfQorCX0KKwlyZXR1cm4gKFVMT05HKUJTU19OT1RfRk9VTkQ7Cit9CisKK1VMT05HIEJzc1RhYmxlU2VhcmNoV2l0aFNTSUQoCisJSU4gQlNTX1RBQkxFICpUYWIsCisJSU4gUFVDSEFSCSBCc3NpZCwKKwlJTiBQVUNIQVIJIHBTc2lkLAorCUlOIFVDSEFSCSBTc2lkTGVuLAorCUlOIFVDSEFSCSBDaGFubmVsKQoreworCVVDSEFSIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVGFiLT5Cc3NOcjsgaSsrKQorCXsKKwkJaWYgKCgoKFRhYi0+QnNzRW50cnlbaV0uQ2hhbm5lbCA8PSAxNCkgJiYgKENoYW5uZWwgPD0gMTQpKSB8fAorCQkJKChUYWItPkJzc0VudHJ5W2ldLkNoYW5uZWwgPiAxNCkgJiYgKENoYW5uZWwgPiAxNCkpKSAmJgorCQkJTUFDX0FERFJfRVFVQUwoJihUYWItPkJzc0VudHJ5W2ldLkJzc2lkKSwgQnNzaWQpICYmCisJCQkoU1NJRF9FUVVBTChwU3NpZCwgU3NpZExlbiwgVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkLCBUYWItPkJzc0VudHJ5W2ldLlNzaWRMZW4pIHx8CisJCQkoTmRpc0VxdWFsTWVtb3J5KHBTc2lkLCBaZXJvU3NpZCwgU3NpZExlbikpIHx8CisJCQkoTmRpc0VxdWFsTWVtb3J5KFRhYi0+QnNzRW50cnlbaV0uU3NpZCwgWmVyb1NzaWQsIFRhYi0+QnNzRW50cnlbaV0uU3NpZExlbikpKSkKKwkJeworCQkJcmV0dXJuIGk7CisJCX0KKwl9CisJcmV0dXJuIChVTE9ORylCU1NfTk9UX0ZPVU5EOworfQorCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQgQnNzVGFibGVEZWxldGVFbnRyeSgKKwlJTiBPVVQJQlNTX1RBQkxFICpUYWIsCisJSU4JCVBVQ0hBUgkgIHBCc3NpZCwKKwlJTgkJVUNIQVIJICBDaGFubmVsKQoreworCVVDSEFSIGksIGo7CisKKwlmb3IgKGkgPSAwOyBpIDwgVGFiLT5Cc3NOcjsgaSsrKQorCXsKKwkJaWYgKChUYWItPkJzc0VudHJ5W2ldLkNoYW5uZWwgPT0gQ2hhbm5lbCkgJiYKKwkJCShNQUNfQUREUl9FUVVBTChUYWItPkJzc0VudHJ5W2ldLkJzc2lkLCBwQnNzaWQpKSkKKwkJeworCQkJZm9yIChqID0gaTsgaiA8IFRhYi0+QnNzTnIgLSAxOyBqKyspCisJCQl7CisJCQkJTmRpc01vdmVNZW1vcnkoJihUYWItPkJzc0VudHJ5W2pdKSwgJihUYWItPkJzc0VudHJ5W2ogKyAxXSksIHNpemVvZihCU1NfRU5UUlkpKTsKKwkJCX0KKwkJCU5kaXNaZXJvTWVtb3J5KCYoVGFiLT5Cc3NFbnRyeVtUYWItPkJzc05yIC0gMV0pLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJCQlUYWItPkJzc05yIC09IDE7CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJRGVsZXRlIHRoZSBPcmlnaW5hdG9yIEVudHJ5IGluIEJBdGFibGUuIE9yIGRlY3JlYXNlIG51bUFzIE9yaWdpbmF0b3IgYnkgMSBpZiBuZWVkZWQuCisKKwlBcmd1bWVudHM6CisJLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBCQVRhYmxlRGVsZXRlT1JJRW50cnkoCisJSU4gT1VUCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCQlCQV9PUklfRU5UUlkJKnBCQU9SSUVudHJ5KQoreworCisJaWYgKHBCQU9SSUVudHJ5LT5PUklfQkFfU3RhdHVzICE9IE9yaWdpbmF0b3JfTk9ORSkKKwl7CisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKKwkJaWYgKHBCQU9SSUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfRG9uZSkKKwkJeworCQkJcEFkLT5CQVRhYmxlLm51bUFzT3JpZ2luYXRvciAtPSAxOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkFUYWJsZURlbGV0ZU9SSUVudHJ5IG51bUFzT3JpZ2luYXRvcj0gJWxkXG4iLCBwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQpKTsKKwkJCS8vIEVyYXNlIEJpdG1hcCBmbGFnLgorCQl9CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbcEJBT1JJRW50cnktPldjaWRdLlRYQkFiaXRtYXAgJj0gKH4oMTw8KHBCQU9SSUVudHJ5LT5USUQpICkpOwkvLyBJZiBTVEEgbW9kZSwgIGVyYXNlIGZsYWcgaGVyZQorCQlwQWQtPk1hY1RhYi5Db250ZW50W3BCQU9SSUVudHJ5LT5XY2lkXS5CQU9yaVdjaWRBcnJheVtwQkFPUklFbnRyeS0+VElEXSA9IDA7CS8vIElmIFNUQSBtb2RlLCAgZXJhc2UgZmxhZyBoZXJlCisJCXBCQU9SSUVudHJ5LT5PUklfQkFfU3RhdHVzID0gT3JpZ2luYXRvcl9OT05FOworCQlwQkFPUklFbnRyeS0+VG9rZW4gPSAxOworCQkvLyBOb3QgY2xlYXIgU2VxdWVuY2UgaGVyZS4KKwkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCX0KK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworLyohIFxicmllZgorICoJXHBhcmFtCisgKglccmV0dXJuCisgKglccHJlCisgKglccG9zdAorCisgSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAqLworVk9JRCBCc3NFbnRyeVNldCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQgQlNTX0VOVFJZICpwQnNzLAorCUlOIFBVQ0hBUiBwQnNzaWQsCisJSU4gQ0hBUiBTc2lkW10sCisJSU4gVUNIQVIgU3NpZExlbiwKKwlJTiBVQ0hBUiBCc3NUeXBlLAorCUlOIFVTSE9SVCBCZWFjb25QZXJpb2QsCisJSU4gUENGX1BBUk0gcENmUGFybSwKKwlJTiBVU0hPUlQgQXRpbVdpbiwKKwlJTiBVU0hPUlQgQ2FwYWJpbGl0eUluZm8sCisJSU4gVUNIQVIgU3VwUmF0ZVtdLAorCUlOIFVDSEFSIFN1cFJhdGVMZW4sCisJSU4gVUNIQVIgRXh0UmF0ZVtdLAorCUlOIFVDSEFSIEV4dFJhdGVMZW4sCisJSU4gSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKKwlJTiBBRERfSFRfSU5GT19JRSAqcEFkZEh0SW5mbywJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCisJSU4gVUNIQVIJCQlIdENhcGFiaWxpdHlMZW4sCisJSU4gVUNIQVIJCQlBZGRIdEluZm9MZW4sCisJSU4gVUNIQVIJCQlOZXdFeHRDaGFuT2Zmc2V0LAorCUlOIFVDSEFSIENoYW5uZWwsCisJSU4gQ0hBUiBSc3NpLAorCUlOIExBUkdFX0lOVEVHRVIgVGltZVN0YW1wLAorCUlOIFVDSEFSIENraXBGbGFnLAorCUlOIFBFRENBX1BBUk0gcEVkY2FQYXJtLAorCUlOIFBRT1NfQ0FQQUJJTElUWV9QQVJNIHBRb3NDYXBhYmlsaXR5LAorCUlOIFBRQlNTX0xPQURfUEFSTSBwUWJzc0xvYWQsCisJSU4gVVNIT1JUIExlbmd0aFZJRSwKKwlJTiBQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzIHBWSUUpCit7CisJQ09QWV9NQUNfQUREUihwQnNzLT5Cc3NpZCwgcEJzc2lkKTsKKwkvLyBEZWZhdWx0IEhpZGRlbiBTU0lEIHRvIGJlIFRSVUUsIGl0IHdpbGwgYmUgdHVybmVkIHRvIEZBTFNFIGFmdGVyIGNvcGluZyBTU0lECisJcEJzcy0+SGlkZGVuID0gMTsKKwlpZiAoU3NpZExlbiA+IDApCisJeworCQkvLyBGb3IgaGlkZGVuIFNTSUQgQVAsIGl0IG1pZ2h0IHNlbmQgYmVhY29uIHdpdGggU1NJRCBsZW4gZXF1YWwgdG8gMAorCQkvLyBPciBzZW5kIGJlYWNvbiAvcHJvYmUgcmVzcG9uc2Ugd2l0aCBTU0lEIGxlbiBtYXRjaGluZyByZWFsIFNTSUQgbGVuZ3RoLAorCQkvLyBidXQgU1NJRCBpcyBhbGwgemVyby4gc3VjaCBhcyAiMDAtMDAtMDAtMDAiIHdpdGggbGVuZ3RoIDQuCisJCS8vIFdlIGhhdmUgdG8gcHJldmVudCB0aGlzIGNhc2Ugb3ZlcndyaXRlIGNvcnJlY3QgdGFibGUKKwkJaWYgKE5kaXNFcXVhbE1lbW9yeShTc2lkLCBaZXJvU3NpZCwgU3NpZExlbikgPT0gMCkKKwkJeworCQkgICAgTmRpc1plcm9NZW1vcnkocEJzcy0+U3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPlNzaWQsIFNzaWQsIFNzaWRMZW4pOworCQkJcEJzcy0+U3NpZExlbiA9IFNzaWRMZW47CisJCQlwQnNzLT5IaWRkZW4gPSAwOworCQl9CisJfQorCWVsc2UKKwkJcEJzcy0+U3NpZExlbiA9IDA7CisJcEJzcy0+QnNzVHlwZSA9IEJzc1R5cGU7CisJcEJzcy0+QmVhY29uUGVyaW9kID0gQmVhY29uUGVyaW9kOworCWlmIChCc3NUeXBlID09IEJTU19JTkZSQSkKKwl7CisJCWlmIChwQ2ZQYXJtLT5iVmFsaWQpCisJCXsKKwkJCXBCc3MtPkNmcENvdW50ID0gcENmUGFybS0+Q2ZwQ291bnQ7CisJCQlwQnNzLT5DZnBQZXJpb2QgPSBwQ2ZQYXJtLT5DZnBQZXJpb2Q7CisJCQlwQnNzLT5DZnBNYXhEdXJhdGlvbiA9IHBDZlBhcm0tPkNmcE1heER1cmF0aW9uOworCQkJcEJzcy0+Q2ZwRHVyUmVtYWluaW5nID0gcENmUGFybS0+Q2ZwRHVyUmVtYWluaW5nOworCQl9CisJfQorCWVsc2UKKwl7CisJCXBCc3MtPkF0aW1XaW4gPSBBdGltV2luOworCX0KKworCXBCc3MtPkNhcGFiaWxpdHlJbmZvID0gQ2FwYWJpbGl0eUluZm87CisJLy8gVGhlIHByaXZhY3kgYml0IGluZGljYXRlIHNlY3VyaXR5IGlzIE9OLCBpdCBtYWlnaHQgYmUgV0VQLCBUS0lQIG9yIEFFUworCS8vIENvbWJpbmUgd2l0aCBBdXRoTW9kZSwgdGhleSB3aWxsIGRlY2lkZSB0aGUgY29ubmVjdGlvbiBtZXRob2RzLgorCXBCc3MtPlByaXZhY3kgPSBDQVBfSVNfUFJJVkFDWV9PTihwQnNzLT5DYXBhYmlsaXR5SW5mbyk7CisJQVNTRVJUKFN1cFJhdGVMZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOworCWlmIChTdXBSYXRlTGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKQorCQlOZGlzTW92ZU1lbW9yeShwQnNzLT5TdXBSYXRlLCBTdXBSYXRlLCBTdXBSYXRlTGVuKTsKKwllbHNlCisJCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPlN1cFJhdGUsIFN1cFJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKwlwQnNzLT5TdXBSYXRlTGVuID0gU3VwUmF0ZUxlbjsKKwlBU1NFUlQoRXh0UmF0ZUxlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisJTmRpc01vdmVNZW1vcnkocEJzcy0+RXh0UmF0ZSwgRXh0UmF0ZSwgRXh0UmF0ZUxlbik7CisJTmRpc01vdmVNZW1vcnkoJnBCc3MtPkh0Q2FwYWJpbGl0eSwgcEh0Q2FwYWJpbGl0eSwgSHRDYXBhYmlsaXR5TGVuKTsKKwlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+QWRkSHRJbmZvLCBwQWRkSHRJbmZvLCBBZGRIdEluZm9MZW4pOworCXBCc3MtPk5ld0V4dENoYW5PZmZzZXQgPSBOZXdFeHRDaGFuT2Zmc2V0OworCXBCc3MtPkV4dFJhdGVMZW4gPSBFeHRSYXRlTGVuOworCXBCc3MtPkNoYW5uZWwgPSBDaGFubmVsOworCXBCc3MtPkNlbnRyYWxDaGFubmVsID0gQ2hhbm5lbDsKKwlwQnNzLT5Sc3NpID0gUnNzaTsKKwkvLyBVcGRhdGUgQ2tpcEZsYWcuIGlmIG5vdCBleGlzdHMsIHRoZSB2YWx1ZSBpcyAweDAKKwlwQnNzLT5Da2lwRmxhZyA9IENraXBGbGFnOworCisJLy8gTmV3IGZvciBtaWNyb3NvZnQgRml4ZWQgSUVzCisJTmRpc01vdmVNZW1vcnkocEJzcy0+Rml4SUVzLlRpbWVzdGFtcCwgJlRpbWVTdGFtcCwgOCk7CisJcEJzcy0+Rml4SUVzLkJlYWNvbkludGVydmFsID0gQmVhY29uUGVyaW9kOworCXBCc3MtPkZpeElFcy5DYXBhYmlsaXRpZXMgPSBDYXBhYmlsaXR5SW5mbzsKKworCS8vIE5ldyBmb3IgbWljcm9zb2Z0IFZhcmlhYmxlIElFcworCWlmIChMZW5ndGhWSUUgIT0gMCkKKwl7CisJCXBCc3MtPlZhcklFTGVuID0gTGVuZ3RoVklFOworCQlOZGlzTW92ZU1lbW9yeShwQnNzLT5WYXJJRXMsIHBWSUUsIHBCc3MtPlZhcklFTGVuKTsKKwl9CisJZWxzZQorCXsKKwkJcEJzcy0+VmFySUVMZW4gPSAwOworCX0KKworCXBCc3MtPkFkZEh0SW5mb0xlbiA9IDA7CisJcEJzcy0+SHRDYXBhYmlsaXR5TGVuID0gMDsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlpZiAoSHRDYXBhYmlsaXR5TGVuPiAwKQorCXsKKwkJcEJzcy0+SHRDYXBhYmlsaXR5TGVuID0gSHRDYXBhYmlsaXR5TGVuOworCQlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+SHRDYXBhYmlsaXR5LCBwSHRDYXBhYmlsaXR5LCBIdENhcGFiaWxpdHlMZW4pOworCQlpZiAoQWRkSHRJbmZvTGVuID4gMCkKKwkJeworCQkJcEJzcy0+QWRkSHRJbmZvTGVuID0gQWRkSHRJbmZvTGVuOworCQkJTmRpc01vdmVNZW1vcnkoJnBCc3MtPkFkZEh0SW5mbywgcEFkZEh0SW5mbywgQWRkSHRJbmZvTGVuKTsKKworCSAJCQlpZiAoKHBBZGRIdEluZm8tPkNvbnRyb2xDaGFuID4gMikmJiAocEFkZEh0SW5mby0+QWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0gRVhUQ0hBX0JFTE9XKSAmJiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCisJIAkJCXsKKwkgCQkJCXBCc3MtPkNlbnRyYWxDaGFubmVsID0gcEFkZEh0SW5mby0+Q29udHJvbENoYW4gLSAyOworCSAJCQl9CisJIAkJCWVsc2UgaWYgKChwQWRkSHRJbmZvLT5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9PSBFWFRDSEFfQUJPVkUpICYmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKKwkJCQl7CisJCSAJCQkJcEJzcy0+Q2VudHJhbENoYW5uZWwgPSBwQWRkSHRJbmZvLT5Db250cm9sQ2hhbiArIDI7CisJCQkJfQorCQl9CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJQnNzQ2lwaGVyUGFyc2UocEJzcyk7CisKKwkvLyBuZXcgZm9yIFFPUworCWlmIChwRWRjYVBhcm0pCisJCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5FZGNhUGFybSwgcEVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7CisJZWxzZQorCQlwQnNzLT5FZGNhUGFybS5iVmFsaWQgPSBGQUxTRTsKKwlpZiAocFFvc0NhcGFiaWxpdHkpCisJCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5Rb3NDYXBhYmlsaXR5LCBwUW9zQ2FwYWJpbGl0eSwgc2l6ZW9mKFFPU19DQVBBQklMSVRZX1BBUk0pKTsKKwllbHNlCisJCXBCc3MtPlFvc0NhcGFiaWxpdHkuYlZhbGlkID0gRkFMU0U7CisJaWYgKHBRYnNzTG9hZCkKKwkJTmRpc01vdmVNZW1vcnkoJnBCc3MtPlFic3NMb2FkLCBwUWJzc0xvYWQsIHNpemVvZihRQlNTX0xPQURfUEFSTSkpOworCWVsc2UKKwkJcEJzcy0+UWJzc0xvYWQuYlZhbGlkID0gRkFMU0U7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJUEVJRF9TVFJVQ1QgICAgIHBFaWQ7CisJCVVTSE9SVCAgICAgICAgICBMZW5ndGggPSAwOworCisKKwkJTmRpc1plcm9NZW1vcnkoJnBCc3MtPldwYUlFLklFWzBdLCBNQVhfQ1VTVE9NX0xFTik7CisJCU5kaXNaZXJvTWVtb3J5KCZwQnNzLT5Sc25JRS5JRVswXSwgTUFYX0NVU1RPTV9MRU4pOworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwkJTmRpc1plcm9NZW1vcnkoJnBCc3MtPkNvdW50cnlTdHJpbmdbMF0sIDMpOworCQlwQnNzLT5iSGFzQ291bnRyeUlFID0gRkFMU0U7CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworCQlwRWlkID0gKFBFSURfU1RSVUNUKSBwVklFOworCQl3aGlsZSAoKExlbmd0aCArIDIgKyAoVVNIT1JUKXBFaWQtPkxlbikgPD0gTGVuZ3RoVklFKQorCQl7CisJCQlzd2l0Y2gocEVpZC0+RWlkKQorCQkJeworCQkJCWNhc2UgSUVfV1BBOgorCQkJCQlpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXUEFfT1VJLCA0KSkKKwkJCQkJeworCQkJCQkJaWYgKChwRWlkLT5MZW4gKyAyKSA+IE1BWF9DVVNUT01fTEVOKQorCQkJCQkJeworCQkJCQkJCXBCc3MtPldwYUlFLklFTGVuID0gMDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCXBCc3MtPldwYUlFLklFTGVuID0gcEVpZC0+TGVuICsgMjsKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPldwYUlFLklFLCBwRWlkLCBwQnNzLT5XcGFJRS5JRUxlbik7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBJRV9SU046CisgICAgICAgICAgICAgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQgKyAyLCBSU05fT1VJLCAzKSkKKwkJCQkJeworCQkJCQkJaWYgKChwRWlkLT5MZW4gKyAyKSA+IE1BWF9DVVNUT01fTEVOKQorCQkJCQkJeworCQkJCQkJCXBCc3MtPlJzbklFLklFTGVuID0gMDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCXBCc3MtPlJzbklFLklFTGVuID0gcEVpZC0+TGVuICsgMjsKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPlJzbklFLklFLCBwRWlkLCBwQnNzLT5Sc25JRS5JRUxlbik7CisJCQl9CisJCQkJYnJlYWs7CisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCQkJCWNhc2UgSUVfQ09VTlRSWToKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBCc3MtPkNvdW50cnlTdHJpbmdbMF0sIHBFaWQtPk9jdGV0LCAzKTsKKwkJCQkJcEJzcy0+Ykhhc0NvdW50cnlJRSA9IFRSVUU7CisJCQkJCWJyZWFrOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKyAgICAgICAgICAgIH0KKwkJCUxlbmd0aCA9IExlbmd0aCArIDIgKyAoVVNIT1JUKXBFaWQtPkxlbjsgIC8vIEVpZFsxXSArIExlblsxXSsgY29udGVudFtMZW5dCisJCQlwRWlkID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKXBFaWQgKyAyICsgcEVpZC0+TGVuKTsKKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KK30KKworLyohCisgKglcYnJpZWYgaW5zZXJ0IGFuIGVudHJ5IGludG8gdGhlIGJzcyB0YWJsZQorICoJXHBhcmFtIHBfdGFiIFRoZSBCU1MgdGFibGUKKyAqCVxwYXJhbSBCc3NpZCBCU1NJRAorICoJXHBhcmFtIHNzaWQgU1NJRAorICoJXHBhcmFtIHNzaWRfbGVuIExlbmd0aCBvZiBTU0lECisgKglccGFyYW0gYnNzX3R5cGUKKyAqCVxwYXJhbSBiZWFjb25fcGVyaW9kCisgKglccGFyYW0gdGltZXN0YW1wCisgKglccGFyYW0gcF9jZgorICoJXHBhcmFtIGF0aW1fd2luCisgKglccGFyYW0gY2FwCisgKglccGFyYW0gcmF0ZXMKKyAqCVxwYXJhbSByYXRlc19sZW4KKyAqCVxwYXJhbSBjaGFubmVsX2lkeAorICoJXHJldHVybiBub25lCisgKglccHJlCisgKglccG9zdAorICoJXG5vdGUgSWYgU1NJRCBpcyBpZGVudGljYWwsIHRoZSBvbGQgZW50cnkgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgbmV3IG9uZQorCisgSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAqLworVUxPTkcgQnNzVGFibGVTZXRFbnRyeSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQgQlNTX1RBQkxFICpUYWIsCisJSU4gUFVDSEFSIHBCc3NpZCwKKwlJTiBDSEFSIFNzaWRbXSwKKwlJTiBVQ0hBUiBTc2lkTGVuLAorCUlOIFVDSEFSIEJzc1R5cGUsCisJSU4gVVNIT1JUIEJlYWNvblBlcmlvZCwKKwlJTiBDRl9QQVJNICpDZlBhcm0sCisJSU4gVVNIT1JUIEF0aW1XaW4sCisJSU4gVVNIT1JUIENhcGFiaWxpdHlJbmZvLAorCUlOIFVDSEFSIFN1cFJhdGVbXSwKKwlJTiBVQ0hBUiBTdXBSYXRlTGVuLAorCUlOIFVDSEFSIEV4dFJhdGVbXSwKKwlJTiBVQ0hBUiBFeHRSYXRlTGVuLAorCUlOIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCisJSU4gQUREX0hUX0lORk9fSUUgKnBBZGRIdEluZm8sCS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQorCUlOIFVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuLAorCUlOIFVDSEFSCQkJQWRkSHRJbmZvTGVuLAorCUlOIFVDSEFSCQkJTmV3RXh0Q2hhbk9mZnNldCwKKwlJTiBVQ0hBUiBDaGFubmVsTm8sCisJSU4gQ0hBUiBSc3NpLAorCUlOIExBUkdFX0lOVEVHRVIgVGltZVN0YW1wLAorCUlOIFVDSEFSIENraXBGbGFnLAorCUlOIFBFRENBX1BBUk0gcEVkY2FQYXJtLAorCUlOIFBRT1NfQ0FQQUJJTElUWV9QQVJNIHBRb3NDYXBhYmlsaXR5LAorCUlOIFBRQlNTX0xPQURfUEFSTSBwUWJzc0xvYWQsCisJSU4gVVNIT1JUIExlbmd0aFZJRSwKKwlJTiBQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzIHBWSUUpCit7CisJVUxPTkcJSWR4OworCisJSWR4ID0gQnNzVGFibGVTZWFyY2hXaXRoU1NJRChUYWIsIHBCc3NpZCwgIFNzaWQsIFNzaWRMZW4sIENoYW5uZWxObyk7CisJaWYgKElkeCA9PSBCU1NfTk9UX0ZPVU5EKQorCXsKKwkJaWYgKFRhYi0+QnNzTnIgPj0gTUFYX0xFTl9PRl9CU1NfVEFCTEUpCisJICAgIHsKKwkJCS8vCisJCQkvLyBJdCBtYXkgaGFwcGVuIHdoZW4gQlNTIFRhYmxlIHdhcyBmdWxsLgorCQkJLy8gVGhlIGRlc2lyZWQgQVAgd2lsbCBub3QgYmUgYWRkZWQgaW50byBCU1MgVGFibGUKKwkJCS8vIEluIHRoaXMgY2FzZSwgaWYgd2UgZm91bmQgdGhlIGRlc2lyZWQgQVAgdGhlbiBvdmVyd3JpdGUgQlNTIFRhYmxlLgorCQkJLy8KKwkJCWlmKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJCQl7CisJCQkJaWYgKE1BQ19BRERSX0VRVUFMKHBBZC0+TWxtZUF1eC5Cc3NpZCwgcEJzc2lkKSB8fAorCQkJCQlTU0lEX0VRVUFMKHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbiwgU3NpZCwgU3NpZExlbikpCisJCQkJeworCQkJCQlJZHggPSBUYWItPkJzc092ZXJsYXBOcjsKKwkJCQkJQnNzRW50cnlTZXQocEFkLCAmVGFiLT5Cc3NFbnRyeVtJZHhdLCBwQnNzaWQsIFNzaWQsIFNzaWRMZW4sIEJzc1R5cGUsIEJlYWNvblBlcmlvZCwgQ2ZQYXJtLCBBdGltV2luLAorCQkJCQkJQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4scEh0Q2FwYWJpbGl0eSwgcEFkZEh0SW5mbyxIdENhcGFiaWxpdHlMZW4sIEFkZEh0SW5mb0xlbiwKKwkJCQkJCU5ld0V4dENoYW5PZmZzZXQsIENoYW5uZWxObywgUnNzaSwgVGltZVN0YW1wLCBDa2lwRmxhZywgcEVkY2FQYXJtLCBwUW9zQ2FwYWJpbGl0eSwgcFFic3NMb2FkLCBMZW5ndGhWSUUsIHBWSUUpOworICAgICAgICAgICAgICAgICAgICBUYWItPkJzc092ZXJsYXBOciA9IChUYWItPkJzc092ZXJsYXBOcisrKSAlIE1BWF9MRU5fT0ZfQlNTX1RBQkxFOworCQkJCX0KKwkJCQlyZXR1cm4gSWR4OworCQkJfQorCQkJZWxzZQorCQkJeworCQkJcmV0dXJuIEJTU19OT1RfRk9VTkQ7CisJCQl9CisJCX0KKwkJSWR4ID0gVGFiLT5Cc3NOcjsKKwkJQnNzRW50cnlTZXQocEFkLCAmVGFiLT5Cc3NFbnRyeVtJZHhdLCBwQnNzaWQsIFNzaWQsIFNzaWRMZW4sIEJzc1R5cGUsIEJlYWNvblBlcmlvZCwgQ2ZQYXJtLCBBdGltV2luLAorCQkJCQlDYXBhYmlsaXR5SW5mbywgU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgRXh0UmF0ZUxlbixwSHRDYXBhYmlsaXR5LCBwQWRkSHRJbmZvLEh0Q2FwYWJpbGl0eUxlbiwgQWRkSHRJbmZvTGVuLAorCQkJCQlOZXdFeHRDaGFuT2Zmc2V0LCBDaGFubmVsTm8sIFJzc2ksIFRpbWVTdGFtcCwgQ2tpcEZsYWcsIHBFZGNhUGFybSwgcFFvc0NhcGFiaWxpdHksIHBRYnNzTG9hZCwgTGVuZ3RoVklFLCBwVklFKTsKKwkJVGFiLT5Cc3NOcisrOworCX0KKwllbHNlCisJeworCQlCc3NFbnRyeVNldChwQWQsICZUYWItPkJzc0VudHJ5W0lkeF0sIHBCc3NpZCwgU3NpZCwgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLENmUGFybSwgQXRpbVdpbiwKKwkJCQkJQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4scEh0Q2FwYWJpbGl0eSwgcEFkZEh0SW5mbyxIdENhcGFiaWxpdHlMZW4sIEFkZEh0SW5mb0xlbiwKKwkJCQkJTmV3RXh0Q2hhbk9mZnNldCwgQ2hhbm5lbE5vLCBSc3NpLCBUaW1lU3RhbXAsIENraXBGbGFnLCBwRWRjYVBhcm0sIHBRb3NDYXBhYmlsaXR5LCBwUWJzc0xvYWQsIExlbmd0aFZJRSwgcFZJRSk7CisJfQorCisJcmV0dXJuIElkeDsKK30KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIERPVDExX05fU1VQUE9SVAorI2lmZGVmIERPVDExTl9EUkFGVDMKK1ZPSUQgIFRyaUV2ZW50SW5pdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlVQ0hBUgkJaTsKKworCWZvciAoaSA9IDA7aSA8IE1BWF9UUklHR0VSX0VWRU5UO2krKykKKwkJcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5iVmFsaWQgPSBGQUxTRTsKKworCXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFObyA9IDA7CisJcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QkNvdW50RG93biA9IDA7Cit9CisKK1VMT05HIFRyaUV2ZW50VGFibGVTZXRFbnRyeSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQgVFJJR0dFUl9FVkVOVF9UQUIgKlRhYiwKKwlJTiBQVUNIQVIgcEJzc2lkLAorCUlOIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCisJSU4gVUNIQVIJCQlIdENhcGFiaWxpdHlMZW4sCisJSU4gVUNIQVIJCQlSZWdDbGFzcywKKwlJTiBVQ0hBUiBDaGFubmVsTm8pCit7CisJLy8gRXZlbnQgQQorCWlmIChIdENhcGFiaWxpdHlMZW4gPT0gMCkKKwl7CisJCWlmIChUYWItPkV2ZW50QU5vIDwgTUFYX1RSSUdHRVJfRVZFTlQpCisJCXsKKwkJCVJUTVBNb3ZlTWVtb3J5KFRhYi0+RXZlbnRBW1RhYi0+RXZlbnRBTm9dLkJTU0lELCBwQnNzaWQsIDYpOworCQkJVGFiLT5FdmVudEFbVGFiLT5FdmVudEFOb10uYlZhbGlkID0gVFJVRTsKKwkJCVRhYi0+RXZlbnRBW1RhYi0+RXZlbnRBTm9dLkNoYW5uZWwgPSBDaGFubmVsTm87CisJCQlUYWItPkV2ZW50QVtUYWItPkV2ZW50QU5vXS5DRENvdW50ZXIgPSBwQWQtPkNvbW1vbkNmZy5Eb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheTsKKwkJCWlmIChSZWdDbGFzcyAhPSAwKQorCQkJeworCQkJCS8vIEJlYWNvbiBoYXMgUmVndWxhdG9yeSBjbGFzcyBJRS4gU28gdXNlIGJlYWNvbidzCisJCQkJVGFiLT5FdmVudEFbVGFiLT5FdmVudEFOb10uUmVnQ2xhc3MgPSBSZWdDbGFzczsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBVc2UgU3RhdGlvbidzIFJlZ3VsYXRvcnkgY2xhc3MgaW5zdGVhZC4KKwkJCQlpZiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuYkh0RW5hYmxlID09IFRSVUUpCisJCQkJeworCQkJCQlpZiAocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPiBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQkJCQl7CisJCQkJCQlUYWItPkV2ZW50QVtUYWItPkV2ZW50QU5vXS5SZWdDbGFzcyA9IDMyOworCQkJCQl9CisJCQkJCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsIDwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwkJCQkJCVRhYi0+RXZlbnRBW1RhYi0+RXZlbnRBTm9dLlJlZ0NsYXNzID0gMzM7CisJCQkJfQorCQkJCWVsc2UKKwkJCQkJVGFiLT5FdmVudEFbVGFiLT5FdmVudEFOb10uUmVnQ2xhc3MgPSA/PzsKKworCQkJfQorCisJCQlUYWItPkV2ZW50QU5vICsrOworCQl9CisJfQorCWVsc2UgaWYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5JbnRvbGVyYW50NDApCisJeworCQlUYWItPkV2ZW50QkNvdW50RG93biA9IHBBZC0+Q29tbW9uQ2ZnLkRvdDExQnNzV2lkdGhDaGFuVHJhbkRlbGF5OworCX0KKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVRyaWdnZXIgRXZlbnQgdGFibGUgTWFpbnRhaW5lbmNlIGNhbGxlZCBvbmNlIGV2ZXJ5IHNlY29uZC4KKworCUFyZ3VtZW50czoKKwkvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFRyaUV2ZW50Q291bnRlck1haW50ZW5hbmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVVDSEFSCQlpOworCUJPT0xFQU4JCQliTm90aWZ5ID0gRkFMU0U7CisJZm9yIChpID0gMDtpIDwgTUFYX1RSSUdHRVJfRVZFTlQ7aSsrKQorCXsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFbaV0uYlZhbGlkICYmIChwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLkNEQ291bnRlciA+IDApKQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLkNEQ291bnRlci0tOworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFbaV0uQ0RDb3VudGVyID09IDApCisJCQl7CisJCQkJcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5iVmFsaWQgPSBGQUxTRTsKKwkJCQlwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBTm8gLS07CisJCQkJLy8gTmVlZCB0byBzZW5kIDIwLzQwIENvZXhpc3RlbmNlIE5vdGlmeSBmcmFtZSBpZiBoYXMgc3RhdHVzIGNoYW5nZS4KKwkJCQliTm90aWZ5ID0gVFJVRTsKKwkJCX0KKwkJfQorCX0KKwlpZiAocEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QkNvdW50RG93biA+IDApCisJeworCQlwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRCQ291bnREb3duLS07CisJCWlmIChwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRCQ291bnREb3duID09IDApCisJCQliTm90aWZ5ID0gVFJVRTsKKwl9CisKKwlpZiAoYk5vdGlmeSA9PSBUUlVFKQorCQlVcGRhdGUyMDQwQ29leGlzdEZyYW1lQW5kTm90aWZ5KHBBZCwgQlNTSURfV0NJRCwgVFJVRSk7Cit9CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQgQnNzVGFibGVTc2lkU29ydCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQgQlNTX1RBQkxFICpPdXRUYWIsCisJSU4JQ0hBUiBTc2lkW10sCisJSU4JVUNIQVIgU3NpZExlbikKK3sKKwlJTlQgaTsKKwlCc3NUYWJsZUluaXQoT3V0VGFiKTsKKworCWZvciAoaSA9IDA7IGkgPCBwQWQtPlNjYW5UYWIuQnNzTnI7IGkrKykKKwl7CisJCUJTU19FTlRSWSAqcEluQnNzID0gJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXTsKKwkJQk9PTEVBTgliSXNIaWRkZW5BcEluY2x1ZGVkID0gRkFMU0U7CisKKwkJaWYgKCgocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkgJiYKKyAgICAgICAgICAgIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA+IDE0KSAmJgorICAgICAgICAgICAgIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEluQnNzLT5DaGFubmVsKSkKKyNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vIFJvZ2VyIHN5bmMgQ2FycmllcgorICAgICAgICAgICAgIHx8IChwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9PSBUUlVFKQorI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICkKKwkJeworCQkJaWYgKHBJbkJzcy0+SGlkZGVuKQorCQkJCWJJc0hpZGRlbkFwSW5jbHVkZWQgPSBUUlVFOworCQl9CisKKwkJaWYgKChwSW5Cc3MtPkJzc1R5cGUgPT0gcEFkLT5TdGFDZmcuQnNzVHlwZSkgJiYKKwkJCShTU0lEX0VRVUFMKFNzaWQsIFNzaWRMZW4sIHBJbkJzcy0+U3NpZCwgcEluQnNzLT5Tc2lkTGVuKSB8fCBiSXNIaWRkZW5BcEluY2x1ZGVkKSkKKwkJeworCQkJQlNTX0VOVFJZICpwT3V0QnNzID0gJk91dFRhYi0+QnNzRW50cnlbT3V0VGFiLT5Cc3NOcl07CisKKworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwkJCS8vIElmIG5vIENvdW50cnkgSUUgZXhpc3RzIG5vIENvbm5lY3Rpb24gd2lsbCBiZSBlc3RhYmxpc2hlZCB3aGVuIElFRUU4MDIxMWRDbGllbnRNb2RlIGlzIHN0cmljdC4KKwkJCWlmICgocEFkLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUgPT0gUnQ4MDJfMTFfRF9TdHJpY3QpICYmCisJCQkJKHBJbkJzcy0+Ykhhc0NvdW50cnlJRSA9PSBGQUxTRSkpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUgPT0gUnQ4MDJfMTFfRF9TdHJpY3QsIGJ1dCB0aGlzIEFQIGRvZXNuJ3QgaGF2ZSBjb3VudHJ5IElFLlxuIikpOworCQkJCWNvbnRpbnVlOworCQkJfQorI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJLy8gMi40Ry81RyBOIG9ubHkgbW9kZQorCQkJaWYgKChwSW5Cc3MtPkh0Q2FwYWJpbGl0eUxlbiA9PSAwKSAmJgorCQkJCSgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzJfNEcpIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fNUcpKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNUQSBpcyBpbiBOLW9ubHkgTW9kZSwgdGhpcyBBUCBkb24ndCBoYXZlIEh0IGNhcGFiaWxpdHkgaW4gQmVhY29uLlxuIikpOworCQkJCWNvbnRpbnVlOworCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCQkvLyBOZXcgZm9yIFdQQTIKKwkJCS8vIENoZWNrIHRoZSBBdXRobW9kZSBmaXJzdAorCQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKwkJCXsKKwkJCQkvLyBDaGVjayBBdXRoTW9kZSBhbmQgQXV0aE1vZGVBdXggZm9yIG1hdGNoaW5nLCBpbiBjYXNlIEFQIHN1cHBvcnQgZHVhbC1tb2RlCisJCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSAhPSBwSW5Cc3MtPkF1dGhNb2RlKSAmJiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gcEluQnNzLT5BdXRoTW9kZUF1eCkpCisJCQkJCS8vIE5vbmUgbWF0Y2hlZAorCQkJCQljb250aW51ZTsKKworCQkJCS8vIENoZWNrIGNpcGhlciBzdWl0ZSwgQVAgbXVzdCBoYXZlIG1vcmUgc2VjdXJlZCBjaXBoZXIgdGhhbiBzdGF0aW9uIHNldHRpbmcKKwkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpCisJCQkJeworCQkJCQkvLyBJZiBpdCdzIG5vdCBtaXhlZCBtb2RlLCB3ZSBzaG91bGQgb25seSBsZXQgQlNTIHBhc3Mgd2l0aCB0aGUgc2FtZSBlbmNyeXB0aW9uCisJCQkJCWlmIChwSW5Cc3MtPldQQS5iTWl4TW9kZSA9PSBGQUxTRSkKKwkJCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XUEEuR3JvdXBDaXBoZXIpCisJCQkJCQkJY29udGludWU7CisKKwkJCQkJLy8gY2hlY2sgZ3JvdXAgY2lwaGVyCisJCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPCBwSW5Cc3MtPldQQS5Hcm91cENpcGhlcikKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCS8vIGNoZWNrIHBhaXJ3aXNlIGNpcGhlciwgc2tpcCBpZiBub25lIG1hdGNoZWQKKwkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gQUVTLCBsZXQgaXQgcGFzcyB3aXRob3V0IHF1ZXN0aW9uLgorCQkJCQkvLyBJZiBwcm9maWxlIHNldCB0byBUS0lQLCB3ZSBtdXN0IGZpbmQgb25lIG1hdGVjaGVkCisJCQkJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpICYmCisJCQkJCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBLlBhaXJDaXBoZXIpICYmCisJCQkJCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBLlBhaXJDaXBoZXJBdXgpKQorCQkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWVsc2UgaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCisJCQkJeworCQkJCQkvLyBJZiBpdCdzIG5vdCBtaXhlZCBtb2RlLCB3ZSBzaG91bGQgb25seSBsZXQgQlNTIHBhc3Mgd2l0aCB0aGUgc2FtZSBlbmNyeXB0aW9uCisJCQkJCWlmIChwSW5Cc3MtPldQQTIuYk1peE1vZGUgPT0gRkFMU0UpCisJCQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBMi5Hcm91cENpcGhlcikKKwkJCQkJCQljb250aW51ZTsKKworCQkJCQkvLyBjaGVjayBncm91cCBjaXBoZXIKKwkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA8IHBJbkJzcy0+V1BBMi5Hcm91cENpcGhlcikKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCS8vIGNoZWNrIHBhaXJ3aXNlIGNpcGhlciwgc2tpcCBpZiBub25lIG1hdGNoZWQKKwkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gQUVTLCBsZXQgaXQgcGFzcyB3aXRob3V0IHF1ZXN0aW9uLgorCQkJCQkvLyBJZiBwcm9maWxlIHNldCB0byBUS0lQLCB3ZSBtdXN0IGZpbmQgb25lIG1hdGVjaGVkCisJCQkJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpICYmCisJCQkJCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBMi5QYWlyQ2lwaGVyKSAmJgorCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuUGFpckNpcGhlckF1eCkpCisJCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCQkvLyBCc3MgVHlwZSBtYXRjaGVkLCBTU0lEIG1hdGNoZWQuCisJCQkvLyBXZSB3aWxsIGNoZWNrIHdlcHN0YXR1cyBmb3IgcXVhbGlmaWNhdGlvbiBCc3MKKwkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldlcFN0YXR1cykKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlN0YUNmZy5XZXBTdGF0dXM9JWQsIHdoaWxlIHBJbkJzcy0+V2VwU3RhdHVzPSVkXG4iLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMsIHBJbkJzcy0+V2VwU3RhdHVzKSk7CisJCQkJLy8KKwkJCQkvLyBGb3IgdGhlIFNFU3YyIGNhc2UsIHdlIHdpbGwgbm90IHF1YWxpZnkgV2VwU3RhdHVzLgorCQkJCS8vCisJCQkJaWYgKCFwSW5Cc3MtPmJTRVMpCisJCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvLyBTaW5jZSB0aGUgQVAgaXMgdXNpbmcgaGlkZGVuIFNTSUQsIGFuZCB3ZSBhcmUgdHJ5aW5nIHRvIGNvbm5lY3QgdG8gQU5ZCisJCQkvLyBJdCBkZWZpbml0ZWx5IHdpbGwgZmFpbC4gU28sIHNraXAgaXQuCisJCQkvLyBDQ1ggYWxzbyByZXF1aXJlIG5vdCBldmVuIHRyeSB0byBjb25uZWN0IGl0ISEKKwkJCWlmIChTc2lkTGVuID09IDApCisJCQkJY29udGludWU7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCS8vIElmIGJvdGggc3RhdGlvbiBhbmQgQVAgdXNlIDQwTUh6LCBzdGlsbCBuZWVkIHRvIGNoZWNrIGlmIHRoZSA0ME1IWiBiYW5kJ3MgbGVnYWxpdHkgaW4gbXkgY291bnRyeSByZWdpb24KKwkJCS8vIElmIHRoaXMgNDBNSHogd2lkZWJhbmQgaXMgbm90IGFsbG93ZWQgaW4gbXkgY291bnRyeSBsaXN0LCB1c2UgYmFuZHdpZHRoIDIwTUhaIGluc3RlYWQsCisJCQlpZiAoKHBJbkJzcy0+Q2VudHJhbENoYW5uZWwgIT0gcEluQnNzLT5DaGFubmVsKSAmJgorCQkJCShwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDApKQorCQkJeworCQkJCWlmIChSVE1QQ2hlY2tDaGFubmVsKHBBZCwgcEluQnNzLT5DZW50cmFsQ2hhbm5lbCwgcEluQnNzLT5DaGFubmVsKSA9PSBGQUxTRSkKKwkJCQl7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9IEJXXzIwOworCQkJCQlTZXRDb21tb25IVChwQWQpOworCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPSBCV180MDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGggPT0gQkFORF9XSURUSF8yMCkKKwkJCQkJeworCQkJCQkJU2V0Q29tbW9uSFQocEFkKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkJLy8gY29weSBtYXRjaGluZyBCU1MgZnJvbSBJblRhYiB0byBPdXRUYWIKKwkJCU5kaXNNb3ZlTWVtb3J5KHBPdXRCc3MsIHBJbkJzcywgc2l6ZW9mKEJTU19FTlRSWSkpOworCisJCQlPdXRUYWItPkJzc05yKys7CisJCX0KKwkJZWxzZSBpZiAoKHBJbkJzcy0+QnNzVHlwZSA9PSBwQWQtPlN0YUNmZy5Cc3NUeXBlKSAmJiAoU3NpZExlbiA9PSAwKSkKKwkJeworCQkJQlNTX0VOVFJZICpwT3V0QnNzID0gJk91dFRhYi0+QnNzRW50cnlbT3V0VGFiLT5Cc3NOcl07CisKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJLy8gMi40Ry81RyBOIG9ubHkgbW9kZQorCQkJaWYgKChwSW5Cc3MtPkh0Q2FwYWJpbGl0eUxlbiA9PSAwKSAmJgorCQkJCSgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzJfNEcpIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fNUcpKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNUQSBpcyBpbiBOLW9ubHkgTW9kZSwgdGhpcyBBUCBkb24ndCBoYXZlIEh0IGNhcGFiaWxpdHkgaW4gQmVhY29uLlxuIikpOworCQkJCWNvbnRpbnVlOworCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCQkvLyBOZXcgZm9yIFdQQTIKKwkJCS8vIENoZWNrIHRoZSBBdXRobW9kZSBmaXJzdAorCQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKwkJCXsKKwkJCQkvLyBDaGVjayBBdXRoTW9kZSBhbmQgQXV0aE1vZGVBdXggZm9yIG1hdGNoaW5nLCBpbiBjYXNlIEFQIHN1cHBvcnQgZHVhbC1tb2RlCisJCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSAhPSBwSW5Cc3MtPkF1dGhNb2RlKSAmJiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gcEluQnNzLT5BdXRoTW9kZUF1eCkpCisJCQkJCS8vIE5vbmUgbWF0Y2hlZAorCQkJCQljb250aW51ZTsKKworCQkJCS8vIENoZWNrIGNpcGhlciBzdWl0ZSwgQVAgbXVzdCBoYXZlIG1vcmUgc2VjdXJlZCBjaXBoZXIgdGhhbiBzdGF0aW9uIHNldHRpbmcKKwkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpCisJCQkJeworCQkJCQkvLyBJZiBpdCdzIG5vdCBtaXhlZCBtb2RlLCB3ZSBzaG91bGQgb25seSBsZXQgQlNTIHBhc3Mgd2l0aCB0aGUgc2FtZSBlbmNyeXB0aW9uCisJCQkJCWlmIChwSW5Cc3MtPldQQS5iTWl4TW9kZSA9PSBGQUxTRSkKKwkJCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XUEEuR3JvdXBDaXBoZXIpCisJCQkJCQkJY29udGludWU7CisKKwkJCQkJLy8gY2hlY2sgZ3JvdXAgY2lwaGVyCisJCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPCBwSW5Cc3MtPldQQS5Hcm91cENpcGhlcikKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCS8vIGNoZWNrIHBhaXJ3aXNlIGNpcGhlciwgc2tpcCBpZiBub25lIG1hdGNoZWQKKwkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gQUVTLCBsZXQgaXQgcGFzcyB3aXRob3V0IHF1ZXN0aW9uLgorCQkJCQkvLyBJZiBwcm9maWxlIHNldCB0byBUS0lQLCB3ZSBtdXN0IGZpbmQgb25lIG1hdGVjaGVkCisJCQkJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpICYmCisJCQkJCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBLlBhaXJDaXBoZXIpICYmCisJCQkJCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBLlBhaXJDaXBoZXJBdXgpKQorCQkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWVsc2UgaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCisJCQkJeworCQkJCQkvLyBJZiBpdCdzIG5vdCBtaXhlZCBtb2RlLCB3ZSBzaG91bGQgb25seSBsZXQgQlNTIHBhc3Mgd2l0aCB0aGUgc2FtZSBlbmNyeXB0aW9uCisJCQkJCWlmIChwSW5Cc3MtPldQQTIuYk1peE1vZGUgPT0gRkFMU0UpCisJCQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBMi5Hcm91cENpcGhlcikKKwkJCQkJCQljb250aW51ZTsKKworCQkJCQkvLyBjaGVjayBncm91cCBjaXBoZXIKKwkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA8IHBJbkJzcy0+V1BBMi5Hcm91cENpcGhlcikKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCS8vIGNoZWNrIHBhaXJ3aXNlIGNpcGhlciwgc2tpcCBpZiBub25lIG1hdGNoZWQKKwkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gQUVTLCBsZXQgaXQgcGFzcyB3aXRob3V0IHF1ZXN0aW9uLgorCQkJCQkvLyBJZiBwcm9maWxlIHNldCB0byBUS0lQLCB3ZSBtdXN0IGZpbmQgb25lIG1hdGVjaGVkCisJCQkJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpICYmCisJCQkJCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBMi5QYWlyQ2lwaGVyKSAmJgorCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuUGFpckNpcGhlckF1eCkpCisJCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCQkvLyBCc3MgVHlwZSBtYXRjaGVkLCBTU0lEIG1hdGNoZWQuCisJCQkvLyBXZSB3aWxsIGNoZWNrIHdlcHN0YXR1cyBmb3IgcXVhbGlmaWNhdGlvbiBCc3MKKwkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldlcFN0YXR1cykKKwkJCQkJY29udGludWU7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCS8vIElmIGJvdGggc3RhdGlvbiBhbmQgQVAgdXNlIDQwTUh6LCBzdGlsbCBuZWVkIHRvIGNoZWNrIGlmIHRoZSA0ME1IWiBiYW5kJ3MgbGVnYWxpdHkgaW4gbXkgY291bnRyeSByZWdpb24KKwkJCS8vIElmIHRoaXMgNDBNSHogd2lkZWJhbmQgaXMgbm90IGFsbG93ZWQgaW4gbXkgY291bnRyeSBsaXN0LCB1c2UgYmFuZHdpZHRoIDIwTUhaIGluc3RlYWQsCisJCQlpZiAoKHBJbkJzcy0+Q2VudHJhbENoYW5uZWwgIT0gcEluQnNzLT5DaGFubmVsKSAmJgorCQkJCShwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDApKQorCQkJeworCQkJCWlmIChSVE1QQ2hlY2tDaGFubmVsKHBBZCwgcEluQnNzLT5DZW50cmFsQ2hhbm5lbCwgcEluQnNzLT5DaGFubmVsKSA9PSBGQUxTRSkKKwkJCQl7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9IEJXXzIwOworCQkJCQlTZXRDb21tb25IVChwQWQpOworCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPSBCV180MDsKKwkJCQl9CisJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJCS8vIGNvcHkgbWF0Y2hpbmcgQlNTIGZyb20gSW5UYWIgdG8gT3V0VGFiCisJCQlOZGlzTW92ZU1lbW9yeShwT3V0QnNzLCBwSW5Cc3MsIHNpemVvZihCU1NfRU5UUlkpKTsKKworCQkJT3V0VGFiLT5Cc3NOcisrOworCQl9CisKKwkJaWYgKE91dFRhYi0+QnNzTnIgPj0gTUFYX0xFTl9PRl9CU1NfVEFCTEUpCisJCQlicmVhazsKKwl9CisKKwlCc3NUYWJsZVNvcnRCeVJzc2koT3V0VGFiKTsKK30KKworCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQgQnNzVGFibGVTb3J0QnlSc3NpKAorCUlOIE9VVCBCU1NfVEFCTEUgKk91dFRhYikKK3sKKwlJTlQgCSAgaSwgajsKKwlCU1NfRU5UUlkgVG1wQnNzOworCisJZm9yIChpID0gMDsgaSA8IE91dFRhYi0+QnNzTnIgLSAxOyBpKyspCisJeworCQlmb3IgKGogPSBpKzE7IGogPCBPdXRUYWItPkJzc05yOyBqKyspCisJCXsKKwkJCWlmIChPdXRUYWItPkJzc0VudHJ5W2pdLlJzc2kgPiBPdXRUYWItPkJzc0VudHJ5W2ldLlJzc2kpCisJCQl7CisJCQkJTmRpc01vdmVNZW1vcnkoJlRtcEJzcywgJk91dFRhYi0+QnNzRW50cnlbal0sIHNpemVvZihCU1NfRU5UUlkpKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmT3V0VGFiLT5Cc3NFbnRyeVtqXSwgJk91dFRhYi0+QnNzRW50cnlbaV0sIHNpemVvZihCU1NfRU5UUlkpKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmT3V0VGFiLT5Cc3NFbnRyeVtpXSwgJlRtcEJzcywgc2l6ZW9mKEJTU19FTlRSWSkpOworCQkJfQorCQl9CisJfQorfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKK1ZPSUQgQnNzQ2lwaGVyUGFyc2UoCisJSU4gT1VUCVBCU1NfRU5UUlkJcEJzcykKK3sKKwlQRUlEX1NUUlVDVCAJCSBwRWlkOworCVBVQ0hBUgkJCQlwVG1wOworCVBSU05fSUVfSEVBREVSX1NUUlVDVAkJCXBSc25IZWFkZXI7CisJUENJUEhFUl9TVUlURV9TVFJVQ1QJCQlwQ2lwaGVyOworCVBBS01fU1VJVEVfU1RSVUNUCQkJCXBBS007CisJVVNIT1JUCQkJCQkJCUNvdW50OworCUlOVAkJCQkJCQkJTGVuZ3RoOworCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCVRtcENpcGhlcjsKKworCS8vCisJLy8gV2VwU3RhdHVzIHdpbGwgYmUgcmVzZXQgbGF0ZXIsIGlmIEFQIGFubm91bmNlIFRLSVAgb3IgQUVTIG9uIHRoZSBiZWFjb24gZnJhbWUuCisJLy8KKwlpZiAocEJzcy0+UHJpdmFjeSkKKwl7CisJCXBCc3MtPldlcFN0YXR1cyAJPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKwl9CisJZWxzZQorCXsKKwkJcEJzcy0+V2VwU3RhdHVzIAk9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwl9CisJLy8gU2V0IGRlZmF1bHQgdG8gZGlzYWJsZSAmIG9wZW4gYXV0aGVudGljYXRpb24gYmVmb3JlIHBhcnNpbmcgdmFyaWFibGUgSUUKKwlwQnNzLT5BdXRoTW9kZQkJPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworCXBCc3MtPkF1dGhNb2RlQXV4CT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKworCS8vIEluaXQgV1BBIHNldHRpbmcKKwlwQnNzLT5XUEEuUGFpckNpcGhlcgk9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwlwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwlwQnNzLT5XUEEuR3JvdXBDaXBoZXIJPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJcEJzcy0+V1BBLlJzbkNhcGFiaWxpdHkgPSAwOworCXBCc3MtPldQQS5iTWl4TW9kZQkJPSBGQUxTRTsKKworCS8vIEluaXQgV1BBMiBzZXR0aW5nCisJcEJzcy0+V1BBMi5QYWlyQ2lwaGVyCSA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwlwQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXggPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJcEJzcy0+V1BBMi5Hcm91cENpcGhlcgkgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJcEJzcy0+V1BBMi5Sc25DYXBhYmlsaXR5ID0gMDsKKwlwQnNzLT5XUEEyLmJNaXhNb2RlIAkgPSBGQUxTRTsKKworCisJTGVuZ3RoID0gKElOVCkgcEJzcy0+VmFySUVMZW47CisKKwl3aGlsZSAoTGVuZ3RoID4gMCkKKwl7CisJCS8vIFBhcnNlIGNpcGhlciBzdWl0ZSBiYXNlIG9uIFdQQTEgJiBXUEEyLCB0aGV5IHNob3VsZCBiZSBwYXJzZWQgZGlmZmVyZW50bHkKKwkJcFRtcCA9ICgoUFVDSEFSKSBwQnNzLT5WYXJJRXMpICsgcEJzcy0+VmFySUVMZW4gLSBMZW5ndGg7CisJCXBFaWQgPSAoUEVJRF9TVFJVQ1QpIHBUbXA7CisJCXN3aXRjaCAocEVpZC0+RWlkKQorCQl7CisJCQljYXNlIElFX1dQQToKKwkJCQkvL1BhcnNlIENpc2NvIElFX1dQQSAoTEVBUCwgQ0NLTSwgZXRjLikKKwkJCQlpZiAoIE5kaXNFcXVhbE1lbW9yeSgocFRtcCs4KSwgQ0lTQ09fT1VJLCAzKSkKKwkJCQl7CisJCQkJCXBUbXAgICArPSAxMTsKKwkJCQkJc3dpdGNoICgqcFRtcCkKKwkJCQkJeworCQkJCQkJY2FzZSAxOgorCQkJCQkJY2FzZSA1OgkvLyBBbHRob3VnaCBXRVAgaXMgbm90IGFsbG93ZWQgaW4gV1BBIHJlbGF0ZWQgYXV0aCBtb2RlLCB3ZSBwYXJzZSBpdCBhbnl3YXkKKwkJCQkJCQlwQnNzLT5XZXBTdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOworCQkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKKwkJCQkJCQlwQnNzLT5XUEEuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAyOgorCQkJCQkJCXBCc3MtPldlcFN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJCQkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOworCQkJCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDQ6CisJCQkJCQkJcEJzcy0+V2VwU3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKwkJCQkJCQlwQnNzLT5XUEEuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7CisJCQkJCQkJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQkvLyBpZiBDaXNjbyBJRV9XUEEsIGJyZWFrCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQllbHNlIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFNFU19PVUksIDMpICYmIChwRWlkLT5MZW4gPT0gNykpCisJCQkJeworCQkJCQlwQnNzLT5iU0VTID0gVFJVRTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWVsc2UgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV1BBX09VSSwgNCkgIT0gMSkKKwkJCQl7CisJCQkJCS8vIGlmIHVuc3VwcG9ydGVkIHZlbmRvciBzcGVjaWZpYyBJRQorCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLy8gU2tpcCBPVUksIHZlcnNpb24sIGFuZCBtdWx0aWNhc3Qgc3VpdGUKKwkJCQkvLyBUaGlzIHBhcnQgc2hvdWxkIGJlIGltcHJvdmVkIGluIHRoZSBmdXR1cmUgd2hlbiBBUCBzdXBwb3J0ZWQgbXVsdGlwbGUgY2lwaGVyIHN1aXRlLgorCQkJCS8vIEZvciBub3csIGl0J3MgT0sgc2luY2UgYWxtb3N0IGFsbCBBUHMgaGF2ZSBmaXhlZCBjaXBoZXIgc3VpdGUgc3VwcG9ydGVkLgorCQkJCS8vIHBUbXAgPSAoUFVDSEFSKSBwRWlkLT5PY3RldDsKKwkJCQlwVG1wICAgKz0gMTE7CisKKwkJCQkvLyBDaXBoZXIgU3VpdGUgU2VsZWN0b3JzIGZyb20gU3BlYyBQODAyLjExaS9EMy4yIFAyNi4KKwkJCQkvLwlWYWx1ZQkgICBNZWFuaW5nCisJCQkJLy8JMAkJCU5vbmUKKwkJCQkvLwkxCQkJV0VQLTQwCisJCQkJLy8JMgkJCVRraXAKKwkJCQkvLwkzCQkJV1JBUAorCQkJCS8vCTQJCQlBRVMKKwkJCQkvLwk1CQkJV0VQLTEwNAorCQkJCS8vIFBhcnNlIGdyb3VwIGNpcGhlcgorCQkJCXN3aXRjaCAoKnBUbXApCisJCQkJeworCQkJCQljYXNlIDE6CisJCQkJCWNhc2UgNToJLy8gQWx0aG91Z2ggV0VQIGlzIG5vdCBhbGxvd2VkIGluIFdQQSByZWxhdGVkIGF1dGggbW9kZSwgd2UgcGFyc2UgaXQgYW55d2F5CisJCQkJCQlwQnNzLT5XUEEuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMjoKKwkJCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSA0OgorCQkJCQkJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8vIG51bWJlciBvZiB1bmljYXN0IHN1aXRlCisJCQkJcFRtcCAgICs9IDE7CisKKwkJCQkvLyBza2lwIGFsbCB1bmljYXN0IGNpcGhlciBzdWl0ZXMKKwkJCQkvL0NvdW50ID0gKihQVVNIT1JUKSBwVG1wOworCQkJCUNvdW50ID0gKHBUbXBbMV08PDgpICsgcFRtcFswXTsKKwkJCQlwVG1wICAgKz0gc2l6ZW9mKFVTSE9SVCk7CisKKwkJCQkvLyBQYXJzaW5nIGFsbCB1bmljYXN0IGNpcGhlciBzdWl0ZQorCQkJCXdoaWxlIChDb3VudCA+IDApCisJCQkJeworCQkJCQkvLyBTa2lwIE9VSQorCQkJCQlwVG1wICs9IDM7CisJCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwkJCQkJc3dpdGNoICgqcFRtcCkKKwkJCQkJeworCQkJCQkJY2FzZSAxOgorCQkJCQkJY2FzZSA1OiAvLyBBbHRob3VnaCBXRVAgaXMgbm90IGFsbG93ZWQgaW4gV1BBIHJlbGF0ZWQgYXV0aCBtb2RlLCB3ZSBwYXJzZSBpdCBhbnl3YXkKKwkJCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAyOgorCQkJCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDQ6CisJCQkJCQkJVG1wQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJaWYgKFRtcENpcGhlciA+IHBCc3MtPldQQS5QYWlyQ2lwaGVyKQorCQkJCQl7CisJCQkJCQkvLyBNb3ZlIHRoZSBsb3dlciBjaXBoZXIgc3VpdGUgdG8gUGFpckNpcGhlckF1eAorCQkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPSBwQnNzLT5XUEEuUGFpckNpcGhlcjsKKwkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyCT0gVG1wQ2lwaGVyOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPSBUbXBDaXBoZXI7CisJCQkJCX0KKwkJCQkJcFRtcCsrOworCQkJCQlDb3VudC0tOworCQkJCX0KKworCQkJCS8vIDQuIGdldCBBS00gc3VpdGUgY291bnRzCisJCQkJLy9Db3VudAk9ICooUFVTSE9SVCkgcFRtcDsKKwkJCQlDb3VudCA9IChwVG1wWzFdPDw4KSArIHBUbXBbMF07CisJCQkJcFRtcCAgICs9IHNpemVvZihVU0hPUlQpOworCQkJCXBUbXAgICArPSAzOworCisJCQkJc3dpdGNoICgqcFRtcCkKKwkJCQl7CisJCQkJCWNhc2UgMToKKwkJCQkJCS8vIFNldCBBUCBzdXBwb3J0IFdQQSBtb2RlCisJCQkJCQlpZiAocEJzcy0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKKwkJCQkJCQlwQnNzLT5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlwQnNzLT5BdXRoTW9kZUF1eCA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDI6CisJCQkJCQkvLyBTZXQgQVAgc3VwcG9ydCBXUEEgbW9kZQorCQkJCQkJaWYgKHBCc3MtPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pCisJCQkJCQkJcEJzcy0+QXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s7CisJCQkJCQllbHNlCisJCQkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlwVG1wICAgKz0gMTsKKworCQkJCS8vIEZpeGVkIGZvciBXUEEtTm9uZQorCQkJCWlmIChwQnNzLT5Cc3NUeXBlID09IEJTU19BREhPQykKKwkJCQl7CisJCQkJCXBCc3MtPkF1dGhNb2RlCSAgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOworCQkJCQlwQnNzLT5BdXRoTW9kZUF1eCA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7CisJCQkJCXBCc3MtPldlcFN0YXR1cyAgID0gcEJzcy0+V1BBLkdyb3VwQ2lwaGVyOworCQkJCQkvLyBQYXRjaGVkIGJ1Z3MgZm9yIG9sZCBkcml2ZXIKKwkJCQkJaWYgKHBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKKwkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID0gcEJzcy0+V1BBLkdyb3VwQ2lwaGVyOworCQkJCX0KKwkJCQllbHNlCisJCQkJCXBCc3MtPldlcFN0YXR1cyAgID0gcEJzcy0+V1BBLlBhaXJDaXBoZXI7CisKKwkJCQkvLyBDaGVjayB0aGUgUGFpciAmIEdyb3VwLCBpZiBkaWZmZXJlbnQsIHR1cm4gb24gbWl4ZWQgbW9kZSBmbGFnCisJCQkJaWYgKHBCc3MtPldQQS5Hcm91cENpcGhlciAhPSBwQnNzLT5XUEEuUGFpckNpcGhlcikKKwkJCQkJcEJzcy0+V1BBLmJNaXhNb2RlID0gVFJVRTsKKworCQkJCWJyZWFrOworCisJCQljYXNlIElFX1JTTjoKKwkJCQlwUnNuSGVhZGVyID0gKFBSU05fSUVfSEVBREVSX1NUUlVDVCkgcFRtcDsKKworCQkJCS8vIDAuIFZlcnNpb24gbXVzdCBiZSAxCisJCQkJaWYgKGxlMmNwdTE2KHBSc25IZWFkZXItPlZlcnNpb24pICE9IDEpCisJCQkJCWJyZWFrOworCQkJCXBUbXAgICArPSBzaXplb2YoUlNOX0lFX0hFQURFUl9TVFJVQ1QpOworCisJCQkJLy8gMS4gQ2hlY2sgZ3JvdXAgY2lwaGVyCisJCQkJcENpcGhlciA9IChQQ0lQSEVSX1NVSVRFX1NUUlVDVCkgcFRtcDsKKwkJCQlpZiAoIVJUTVBFcXVhbE1lbW9yeShwVG1wLCBSU05fT1VJLCAzKSkKKwkJCQkJYnJlYWs7CisKKwkJCQkvLyBQYXJzZSBncm91cCBjaXBoZXIKKwkJCQlzd2l0Y2ggKHBDaXBoZXItPlR5cGUpCisJCQkJeworCQkJCQljYXNlIDE6CisJCQkJCWNhc2UgNToJLy8gQWx0aG91Z2ggV0VQIGlzIG5vdCBhbGxvd2VkIGluIFdQQSByZWxhdGVkIGF1dGggbW9kZSwgd2UgcGFyc2UgaXQgYW55d2F5CisJCQkJCQlwQnNzLT5XUEEyLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDI6CisJCQkJCQlwQnNzLT5XUEEyLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDQ6CisJCQkJCQlwQnNzLT5XUEEyLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8vIHNldCB0byBjb3JyZWN0IG9mZnNldCBmb3IgbmV4dCBwYXJzaW5nCisJCQkJcFRtcCAgICs9IHNpemVvZihDSVBIRVJfU1VJVEVfU1RSVUNUKTsKKworCQkJCS8vIDIuIEdldCBwYWlyd2lzZSBjaXBoZXIgY291bnRzCisJCQkJLy9Db3VudCA9ICooUFVTSE9SVCkgcFRtcDsKKwkJCQlDb3VudCA9IChwVG1wWzFdPDw4KSArIHBUbXBbMF07CisJCQkJcFRtcCAgICs9IHNpemVvZihVU0hPUlQpOworCisJCQkJLy8gMy4gR2V0IHBhaXJ3aXNlIGNpcGhlcgorCQkJCS8vIFBhcnNpbmcgYWxsIHVuaWNhc3QgY2lwaGVyIHN1aXRlCisJCQkJd2hpbGUgKENvdW50ID4gMCkKKwkJCQl7CisJCQkJCS8vIFNraXAgT1VJCisJCQkJCXBDaXBoZXIgPSAoUENJUEhFUl9TVUlURV9TVFJVQ1QpIHBUbXA7CisJCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwkJCQkJc3dpdGNoIChwQ2lwaGVyLT5UeXBlKQorCQkJCQl7CisJCQkJCQljYXNlIDE6CisJCQkJCQljYXNlIDU6IC8vIEFsdGhvdWdoIFdFUCBpcyBub3QgYWxsb3dlZCBpbiBXUEEgcmVsYXRlZCBhdXRoIG1vZGUsIHdlIHBhcnNlIGl0IGFueXdheQorCQkJCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDI6CisJCQkJCQkJVG1wQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgNDoKKwkJCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworCQkJCQkJCWJyZWFrOworCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlpZiAoVG1wQ2lwaGVyID4gcEJzcy0+V1BBMi5QYWlyQ2lwaGVyKQorCQkJCQl7CisJCQkJCQkvLyBNb3ZlIHRoZSBsb3dlciBjaXBoZXIgc3VpdGUgdG8gUGFpckNpcGhlckF1eAorCQkJCQkJcEJzcy0+V1BBMi5QYWlyQ2lwaGVyQXV4ID0gcEJzcy0+V1BBMi5QYWlyQ2lwaGVyOworCQkJCQkJcEJzcy0+V1BBMi5QYWlyQ2lwaGVyCSA9IFRtcENpcGhlcjsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBCc3MtPldQQTIuUGFpckNpcGhlckF1eCA9IFRtcENpcGhlcjsKKwkJCQkJfQorCQkJCQlwVG1wICs9IHNpemVvZihDSVBIRVJfU1VJVEVfU1RSVUNUKTsKKwkJCQkJQ291bnQtLTsKKwkJCQl9CisKKwkJCQkvLyA0LiBnZXQgQUtNIHN1aXRlIGNvdW50cworCQkJCS8vQ291bnQJPSAqKFBVU0hPUlQpIHBUbXA7CisJCQkJQ291bnQgPSAocFRtcFsxXTw8OCkgKyBwVG1wWzBdOworCQkJCXBUbXAgICArPSBzaXplb2YoVVNIT1JUKTsKKworCQkJCS8vIDUuIEdldCBBS00gY2lwaGVycworCQkJCXBBS00gPSAoUEFLTV9TVUlURV9TVFJVQ1QpIHBUbXA7CisJCQkJaWYgKCFSVE1QRXF1YWxNZW1vcnkocFRtcCwgUlNOX09VSSwgMykpCisJCQkJCWJyZWFrOworCisJCQkJc3dpdGNoIChwQUtNLT5UeXBlKQorCQkJCXsKKwkJCQkJY2FzZSAxOgorCQkJCQkJLy8gU2V0IEFQIHN1cHBvcnQgV1BBIG1vZGUKKwkJCQkJCWlmIChwQnNzLT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQorCQkJCQkJCXBCc3MtPkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMjsKKwkJCQkJCWVsc2UKKwkJCQkJCQlwQnNzLT5BdXRoTW9kZUF1eCA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAyOgorCQkJCQkJLy8gU2V0IEFQIHN1cHBvcnQgV1BBIG1vZGUKKwkJCQkJCWlmIChwQnNzLT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQorCQkJCQkJCXBCc3MtPkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzsKKwkJCQkJCWVsc2UKKwkJCQkJCQlwQnNzLT5BdXRoTW9kZUF1eCA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlwVG1wICAgKz0gKENvdW50ICogc2l6ZW9mKEFLTV9TVUlURV9TVFJVQ1QpKTsKKworCQkJCS8vIEZpeGVkIGZvciBXUEEtTm9uZQorCQkJCWlmIChwQnNzLT5Cc3NUeXBlID09IEJTU19BREhPQykKKwkJCQl7CisJCQkJCXBCc3MtPkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKKwkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOworCQkJCQlwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9IHBCc3MtPldQQTIuUGFpckNpcGhlckF1eDsKKwkJCQkJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyCT0gcEJzcy0+V1BBMi5Hcm91cENpcGhlcjsKKwkJCQkJcEJzcy0+V2VwU3RhdHVzIAkJPSBwQnNzLT5XUEEuR3JvdXBDaXBoZXI7CisJCQkJCS8vIFBhdGNoZWQgYnVncyBmb3Igb2xkIGRyaXZlcgorCQkJCQlpZiAocEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQorCQkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPSBwQnNzLT5XUEEuR3JvdXBDaXBoZXI7CisJCQkJfQorCQkJCXBCc3MtPldlcFN0YXR1cyAgID0gcEJzcy0+V1BBMi5QYWlyQ2lwaGVyOworCisJCQkJLy8gNi4gR2V0IFJTTiBjYXBhYmlsaXR5CisJCQkJLy9wQnNzLT5XUEEyLlJzbkNhcGFiaWxpdHkgPSAqKFBVU0hPUlQpIHBUbXA7CisJCQkJcEJzcy0+V1BBMi5Sc25DYXBhYmlsaXR5ID0gKHBUbXBbMV08PDgpICsgcFRtcFswXTsKKwkJCQlwVG1wICs9IHNpemVvZihVU0hPUlQpOworCisJCQkJLy8gQ2hlY2sgdGhlIFBhaXIgJiBHcm91cCwgaWYgZGlmZmVyZW50LCB0dXJuIG9uIG1peGVkIG1vZGUgZmxhZworCQkJCWlmIChwQnNzLT5XUEEyLkdyb3VwQ2lwaGVyICE9IHBCc3MtPldQQTIuUGFpckNpcGhlcikKKwkJCQkJcEJzcy0+V1BBMi5iTWl4TW9kZSA9IFRSVUU7CisKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KKwkJTGVuZ3RoIC09IChwRWlkLT5MZW4gKyAyKTsKKwl9Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIG1hY190YWJsZS5jCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8qISBcYnJpZWYgZ2VuZXJhdGVzIGEgcmFuZG9tIG1hYyBhZGRyZXNzIHZhbHVlIGZvciBJQlNTIEJTU0lECisgKglccGFyYW0gQWRkciB0aGUgYnNzaWQgbG9jYXRpb24KKyAqCVxyZXR1cm4gbm9uZQorICoJXHByZQorICoJXHBvc3QKKyAqLworVk9JRCBNYWNBZGRyUmFuZG9tQnNzaWQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJT1VUIFBVQ0hBUiBwQWRkcikKK3sKKwlJTlQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQUNfQUREUl9MRU47IGkrKykKKwl7CisJCXBBZGRyW2ldID0gUmFuZG9tQnl0ZShwQWQpOworCX0KKworCXBBZGRyWzBdID0gKHBBZGRyWzBdICYgMHhmZSkgfCAweDAyOyAgLy8gdGhlIGZpcnN0IDIgYml0cyBtdXN0IGJlIDAxeHh4eHh4eHgKK30KKworLyohIFxicmllZiBpbml0IHRoZSBtYW5hZ2VtZW50IG1hYyBmcmFtZSBoZWFkZXIKKyAqCVxwYXJhbSBwX2hkciBtYWMgaGVhZGVyCisgKglccGFyYW0gc3VidHlwZSBzdWJ0eXBlIG9mIHRoZSBmcmFtZQorICoJXHBhcmFtIHBfZHMgZGVzdGluYXRpb24gYWRkcmVzcywgZG9uJ3QgY2FyZSBpZiBpdCBpcyBhIGJyb2FkY2FzdCBhZGRyZXNzCisgKglccmV0dXJuIG5vbmUKKyAqCVxwcmUgdGhlIHN0YXRpb24gaGFzIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gaW4gdGhlIHBBZC0+U3RhQ2ZnCisgKgkgLSBic3NpZAorICoJIC0gc3RhdGlvbiBhZGRyZXNzCisgKglccG9zdAorICoJXG5vdGUgdGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgZm9sbG93aW5nIGZpZWxkCisKKyBJUlFMID0gUEFTU0lWRV9MRVZFTAorIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKi8KK1ZPSUQgTWd0TWFjSGVhZGVySW5pdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBPVVQgUEhFQURFUl84MDJfMTEgcEhkcjgwMjExLAorCUlOIFVDSEFSIFN1YlR5cGUsCisJSU4gVUNIQVIgVG9EcywKKwlJTiBQVUNIQVIgcERBLAorCUlOIFBVQ0hBUiBwQnNzaWQpCit7CisJTmRpc1plcm9NZW1vcnkocEhkcjgwMjExLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCisJcEhkcjgwMjExLT5GQy5UeXBlID0gQlRZUEVfTUdNVDsKKwlwSGRyODAyMTEtPkZDLlN1YlR5cGUgPSBTdWJUeXBlOworCXBIZHI4MDIxMS0+RkMuVG9EcyA9IFRvRHM7CisJQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIxLCBwREEpOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCUNPUFlfTUFDX0FERFIocEhkcjgwMjExLT5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIzLCBwQnNzaWQpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBtZW1fbWdtdC5jCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhpcyByb3V0aW5lIGJ1aWxkIGFuIG91dGdvaW5nIGZyYW1lLCBhbmQgZmlsbCBhbGwgaW5mb3JtYXRpb24gc3BlY2lmaWVkCisgKiBpbiBhcmd1bWVudCBsaXN0IHRvIHRoZSBmcmFtZSBib2R5LiBUaGUgYWN0dWFsIGZyYW1lIHNpemUgaXMgdGhlIHN1bW1hdGlvbgorICogb2YgYWxsIGFyZ3VtZW50cy4KKyAqIGlucHV0IHBhcmFtczoKKyAqCQlCdWZmZXIgLSBwb2ludGVyIHRvIGEgcHJlLWFsbG9jYXRlZCBtZW1vcnkgc2VnbWVudAorICoJCWFyZ3MgLSBhIGxpc3Qgb2YgPGludCBhcmdfc2l6ZSwgYXJnPiBwYWlycy4KKyAqCQlOT1RFIE5PVEUgTk9URSEhISEgdGhlIGxhc3QgYXJndW1lbnQgbXVzdCBiZSBOVUxMLCBvdGhlcndpc2UgdGhpcworICoJCQkJCQkgICBmdW5jdGlvbiB3aWxsIEZBSUwhISEKKyAqIHJldHVybjoKKyAqCQlTaXplIG9mIHRoZSBidWZmZXIKKyAqIHVzYWdlOgorICoJCU1ha2VPdXRnb2luZ0ZyYW1lKEJ1ZmZlciwgb3V0cHV0X2xlbmd0aCwgMiwgJmZjLCAyLCAmZHVyLCA2LCBwX2FkZHIxLCA2LHBfYWRkcjIsIEVORF9PRl9BUkdTKTsKKworIElSUUwgPSBQQVNTSVZFX0xFVkVMCisgSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworVUxPTkcgTWFrZU91dGdvaW5nRnJhbWUoCisJT1VUIENIQVIgKkJ1ZmZlciwKKwlPVVQgVUxPTkcgKkZyYW1lTGVuLCAuLi4pCit7CisJQ0hBUiAgICpwOworCWludCAJbGVuZzsKKwlVTE9ORwlUb3RMZW5nOworCXZhX2xpc3QgQXJnczsKKworCS8vIGNhbGN1bGF0ZXMgdGhlIHRvdGFsIGxlbmd0aAorCVRvdExlbmcgPSAwOworCXZhX3N0YXJ0KEFyZ3MsIEZyYW1lTGVuKTsKKwlkbworCXsKKwkJbGVuZyA9IHZhX2FyZyhBcmdzLCBpbnQpOworCQlpZiAobGVuZyA9PSBFTkRfT0ZfQVJHUykKKwkJeworCQkJYnJlYWs7CisJCX0KKwkJcCA9IHZhX2FyZyhBcmdzLCBQVk9JRCk7CisJCU5kaXNNb3ZlTWVtb3J5KCZCdWZmZXJbVG90TGVuZ10sIHAsIGxlbmcpOworCQlUb3RMZW5nID0gVG90TGVuZyArIGxlbmc7CisJfSB3aGlsZShUUlVFKTsKKworCXZhX2VuZChBcmdzKTsgLyogY2xlYW4gdXAgKi8KKwkqRnJhbWVMZW4gPSBUb3RMZW5nOworCXJldHVybiBUb3RMZW5nOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBtbG1lX3F1ZXVlLmMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLyohIFxicmllZglJbml0aWFsaXplIFRoZSBNTE1FIFF1ZXVlLCB1c2VkIGJ5IE1MTUUgRnVuY3Rpb25zCisgKglccGFyYW0JKlF1ZXVlCSAgIFRoZSBNTE1FIFF1ZXVlCisgKglccmV0dXJuIEFsd2F5cwkgICBSZXR1cm4gTkRJU19TVEFURV9TVUNDRVNTIGluIHRoaXMgaW1wbGVtZW50YXRpb24KKyAqCVxwcmUKKyAqCVxwb3N0CisgKglcbm90ZQlCZWNhdXNlIHRoaXMgaXMgZG9uZSBvbmx5IG9uY2UgKGF0IHRoZSBpbml0IHN0YWdlKSwgbm8gbmVlZCB0byBiZSBsb2NrZWQKKworIElSUUwgPSBQQVNTSVZFX0xFVkVMCisKKyAqLworTkRJU19TVEFUVVMgTWxtZVF1ZXVlSW5pdCgKKwlJTiBNTE1FX1FVRVVFICpRdWV1ZSkKK3sKKwlJTlQgaTsKKworCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZRdWV1ZS0+TG9jayk7CisKKwlRdWV1ZS0+TnVtCT0gMDsKKwlRdWV1ZS0+SGVhZCA9IDA7CisJUXVldWUtPlRhaWwgPSAwOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfTUxNRV9RVUVVRTsgaSsrKQorCXsKKwkJUXVldWUtPkVudHJ5W2ldLk9jY3VwaWVkID0gRkFMU0U7CisJCVF1ZXVlLT5FbnRyeVtpXS5Nc2dMZW4gPSAwOworCQlOZGlzWmVyb01lbW9yeShRdWV1ZS0+RW50cnlbaV0uTXNnLCBNR01UX0RNQV9CVUZGRVJfU0laRSk7CisJfQorCisJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qISBcYnJpZWYJIEVucXVldWUgYSBtZXNzYWdlIGZvciBvdGhlciB0aHJlYWRzLCBpZiB0aGV5IHdhbnQgdG8gc2VuZCBtZXNzYWdlcyB0byBNTE1FIHRocmVhZAorICoJXHBhcmFtCSpRdWV1ZQkgIFRoZSBNTE1FIFF1ZXVlCisgKglccGFyYW0JIE1hY2hpbmUgIFRoZSBTdGF0ZSBNYWNoaW5lIElkCisgKglccGFyYW0JIE1zZ1R5cGUgIFRoZSBNZXNzYWdlIFR5cGUKKyAqCVxwYXJhbQkgTXNnTGVuICAgVGhlIE1lc3NhZ2UgbGVuZ3RoCisgKglccGFyYW0JKk1zZwkgIFRoZSBtZXNzYWdlIHBvaW50ZXIKKyAqCVxyZXR1cm4gIFRSVUUgaWYgZW5xdWV1ZSBpcyBzdWNjZXNzZnVsLCBGQUxTRSBpZiB0aGUgcXVldWUgaXMgZnVsbAorICoJXHByZQorICoJXHBvc3QKKyAqCVxub3RlCSBUaGUgbWVzc2FnZSBoYXMgdG8gYmUgaW5pdGlhbGl6ZWQKKworIElSUUwgPSBQQVNTSVZFX0xFVkVMCisgSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAqLworQk9PTEVBTiBNbG1lRW5xdWV1ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVTE9ORyBNYWNoaW5lLAorCUlOIFVMT05HIE1zZ1R5cGUsCisJSU4gVUxPTkcgTXNnTGVuLAorCUlOIFZPSUQgKk1zZykKK3sKKwlJTlQgVGFpbDsKKwlNTE1FX1FVRVVFCSpRdWV1ZSA9IChNTE1FX1FVRVVFICopJnBBZC0+TWxtZS5RdWV1ZTsKKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCXJldHVybiBGQUxTRTsKKworCS8vIEZpcnN0IGNoZWNrIHRoZSBzaXplLCBpdCBNVVNUIG5vdCBleGNlZWQgdGhlIG1sbWUgcXVldWUgc2l6ZQorCWlmIChNc2dMZW4gPiBNR01UX0RNQV9CVUZGRVJfU0laRSkKKwl7CisJCURCR1BSSU5UX0VSUigoIk1sbWVFbnF1ZXVlOiBtc2cgdG9vIGxhcmdlLCBzaXplID0gJWxkIFxuIiwgTXNnTGVuKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAoTWxtZVF1ZXVlRnVsbChRdWV1ZSkpCisJeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJTmRpc0FjcXVpcmVTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7CisJVGFpbCA9IFF1ZXVlLT5UYWlsOworCVF1ZXVlLT5UYWlsKys7CisJUXVldWUtPk51bSsrOworCWlmIChRdWV1ZS0+VGFpbCA9PSBNQVhfTEVOX09GX01MTUVfUVVFVUUpCisJeworCQlRdWV1ZS0+VGFpbCA9IDA7CisJfQorCisJUXVldWUtPkVudHJ5W1RhaWxdLldjaWQgPSBSRVNFUlZFRF9XQ0lEOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5PY2N1cGllZCA9IFRSVUU7CisJUXVldWUtPkVudHJ5W1RhaWxdLk1hY2hpbmUgPSBNYWNoaW5lOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5Nc2dUeXBlID0gTXNnVHlwZTsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uTXNnTGVuICA9IE1zZ0xlbjsKKworCWlmIChNc2cgIT0gTlVMTCkKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KFF1ZXVlLT5FbnRyeVtUYWlsXS5Nc2csIE1zZywgTXNnTGVuKTsKKwl9CisKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKKwlyZXR1cm4gVFJVRTsKK30KKworLyohIFxicmllZgkgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHdoZW4gUmVjdiBnZXRzIGEgTUxNRSBtZXNzYWdlCisgKglccGFyYW0JKlF1ZXVlCQkJIFRoZSBNTE1FIFF1ZXVlCisgKglccGFyYW0JIFRpbWVTdGFtcEhpZ2gJIFRoZSB1cHBlciAzMiBiaXQgb2YgdGltZXN0YW1wCisgKglccGFyYW0JIFRpbWVTdGFtcExvdwkgVGhlIGxvd2VyIDMyIGJpdCBvZiB0aW1lc3RhbXAKKyAqCVxwYXJhbQkgUnNzaQkJCSBUaGUgcmVjZWl2aW5nIFJTU0kgc3RyZW5ndGgKKyAqCVxwYXJhbQkgTXNnTGVuIAkJIFRoZSBsZW5ndGggb2YgdGhlIG1lc3NhZ2UKKyAqCVxwYXJhbQkqTXNnCQkJIFRoZSBtZXNzYWdlIHBvaW50ZXIKKyAqCVxyZXR1cm4gIFRSVUUgaWYgZXZlcnl0aGluZyBvaywgRkFMU0Ugb3RoZXJ3aXNlIChsaWtlIFF1ZXVlIEZ1bGwpCisgKglccHJlCisgKglccG9zdAorCisgSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAqLworQk9PTEVBTiBNbG1lRW5xdWV1ZUZvclJlY3YoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVUxPTkcgV2NpZCwKKwlJTiBVTE9ORyBUaW1lU3RhbXBIaWdoLAorCUlOIFVMT05HIFRpbWVTdGFtcExvdywKKwlJTiBVQ0hBUiBSc3NpMCwKKwlJTiBVQ0hBUiBSc3NpMSwKKwlJTiBVQ0hBUiBSc3NpMiwKKwlJTiBVTE9ORyBNc2dMZW4sCisJSU4gVk9JRCAqTXNnLAorCUlOIFVDSEFSIFNpZ25hbCkKK3sKKwlJTlQgCQkgVGFpbCwgTWFjaGluZTsKKwlQRlJBTUVfODAyXzExIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKU1zZzsKKwlJTlQJCSBNc2dUeXBlOworCU1MTUVfUVVFVUUJKlF1ZXVlID0gKE1MTUVfUVVFVUUgKikmcEFkLT5NbG1lLlF1ZXVlOworCisjaWZkZWYgUkFMSU5LX0FURQorCS8qIE5vdGhpbmcgdG8gZG8gaW4gQVRFIG1vZGUgKi8KKwlpZihBVEVfT04ocEFkKSkKKwkJcmV0dXJuIEZBTFNFOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJeworCQlEQkdQUklOVF9FUlIoKCJNbG1lRW5xdWV1ZUZvclJlY3Y6IGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTU1xuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLy8gRmlyc3QgY2hlY2sgdGhlIHNpemUsIGl0IE1VU1Qgbm90IGV4Y2VlZCB0aGUgbWxtZSBxdWV1ZSBzaXplCisJaWYgKE1zZ0xlbiA+IE1HTVRfRE1BX0JVRkZFUl9TSVpFKQorCXsKKwkJREJHUFJJTlRfRVJSKCgiTWxtZUVucXVldWVGb3JSZWN2OiBmcmFtZSB0b28gbGFyZ2UsIHNpemUgPSAlbGQgXG4iLCBNc2dMZW4pKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmIChNbG1lUXVldWVGdWxsKFF1ZXVlKSkKKwl7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJaWYgKCFNc2dUeXBlU3Vic3QocEFkLCBwRnJhbWUsICZNYWNoaW5lLCAmTXNnVHlwZSkpCisJCXsKKwkJCURCR1BSSU5UX0VSUigoIk1sbWVFbnF1ZXVlRm9yUmVjdjogdW4tcmVjb25nbml6ZWQgbWdtdC0+c3VidHlwZT0lZFxuIixwRnJhbWUtPkhkci5GQy5TdWJUeXBlKSk7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLyBPSywgd2UgZ290IGFsbCB0aGUgaW5mb3JtYXRpb25zLCBpdCBpcyB0aW1lIHRvIHB1dCB0aGluZ3MgaW50byBxdWV1ZQorCU5kaXNBY3F1aXJlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOworCVRhaWwgPSBRdWV1ZS0+VGFpbDsKKwlRdWV1ZS0+VGFpbCsrOworCVF1ZXVlLT5OdW0rKzsKKwlpZiAoUXVldWUtPlRhaWwgPT0gTUFYX0xFTl9PRl9NTE1FX1FVRVVFKQorCXsKKwkJUXVldWUtPlRhaWwgPSAwOworCX0KKwlRdWV1ZS0+RW50cnlbVGFpbF0uT2NjdXBpZWQgPSBUUlVFOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5NYWNoaW5lID0gTWFjaGluZTsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uTXNnVHlwZSA9IE1zZ1R5cGU7CisJUXVldWUtPkVudHJ5W1RhaWxdLk1zZ0xlbiAgPSBNc2dMZW47CisJUXVldWUtPkVudHJ5W1RhaWxdLlRpbWVTdGFtcC51Lkxvd1BhcnQgPSBUaW1lU3RhbXBMb3c7CisJUXVldWUtPkVudHJ5W1RhaWxdLlRpbWVTdGFtcC51LkhpZ2hQYXJ0ID0gVGltZVN0YW1wSGlnaDsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uUnNzaTAgPSBSc3NpMDsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uUnNzaTEgPSBSc3NpMTsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uUnNzaTIgPSBSc3NpMjsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uU2lnbmFsID0gU2lnbmFsOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5XY2lkID0gKFVDSEFSKVdjaWQ7CisKKwlRdWV1ZS0+RW50cnlbVGFpbF0uQ2hhbm5lbCA9IHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbDsKKworCWlmIChNc2cgIT0gTlVMTCkKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KFF1ZXVlLT5FbnRyeVtUYWlsXS5Nc2csIE1zZywgTXNnTGVuKTsKKwl9CisKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKKworCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKworCXJldHVybiBUUlVFOworfQorCisKKy8qISBcYnJpZWYJIERlcXVldWUgYSBtZXNzYWdlIGZyb20gdGhlIE1MTUUgUXVldWUKKyAqCVxwYXJhbQkqUXVldWUJICBUaGUgTUxNRSBRdWV1ZQorICoJXHBhcmFtCSpFbGVtCSAgVGhlIG1lc3NhZ2UgZGVxdWV1ZWQgZnJvbSBNTE1FIFF1ZXVlCisgKglccmV0dXJuICBUUlVFIGlmIHRoZSBFbGVtIGNvbnRhaW5zIHNvbWV0aGluZywgRkFMU0Ugb3RoZXJ3aXNlCisgKglccHJlCisgKglccG9zdAorCisgSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAqLworQk9PTEVBTiBNbG1lRGVxdWV1ZSgKKwlJTiBNTE1FX1FVRVVFICpRdWV1ZSwKKwlPVVQgTUxNRV9RVUVVRV9FTEVNICoqRWxlbSkKK3sKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKKwkqRWxlbSA9ICYoUXVldWUtPkVudHJ5W1F1ZXVlLT5IZWFkXSk7CisJUXVldWUtPk51bS0tOworCVF1ZXVlLT5IZWFkKys7CisJaWYgKFF1ZXVlLT5IZWFkID09IE1BWF9MRU5fT0ZfTUxNRV9RVUVVRSkKKwl7CisJCVF1ZXVlLT5IZWFkID0gMDsKKwl9CisJTmRpc1JlbGVhc2VTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7CisJcmV0dXJuIFRSVUU7Cit9CisKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRAlNbG1lUmVzdGFydFN0YXRlTWFjaGluZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKyNpZmRlZiBSVDI4NjAKKwlNTE1FX1FVRVVFX0VMRU0JCSpFbGVtID0gTlVMTDsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlCT09MRUFOCQkJCUNhbmNlbGxlZDsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVSZXN0YXJ0U3RhdGVNYWNoaW5lIFxuIikpOworCisjaWZkZWYgUlQyODYwCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKKwlpZihwQWQtPk1sbWUuYlJ1bm5pbmcpCisJeworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOworCQlyZXR1cm47CisJfQorCWVsc2UKKwl7CisJCXBBZC0+TWxtZS5iUnVubmluZyA9IFRSVUU7CisJfQorCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7CisKKwkvLyBSZW1vdmUgYWxsIE1sbWUgcXVldWVzIGVsZW1lbnRzCisJd2hpbGUgKCFNbG1lUXVldWVFbXB0eSgmcEFkLT5NbG1lLlF1ZXVlKSkKKwl7CisJCS8vRnJvbSBtZXNzYWdlIHR5cGUsIGRldGVybWluZSB3aGljaCBzdGF0ZSBtYWNoaW5lIEkgc2hvdWxkIGRyaXZlCisJCWlmIChNbG1lRGVxdWV1ZSgmcEFkLT5NbG1lLlF1ZXVlLCAmRWxlbSkpCisJCXsKKwkJCS8vIGZyZWUgTUxNRSBlbGVtZW50CisJCQlFbGVtLT5PY2N1cGllZCA9IEZBTFNFOworCQkJRWxlbS0+TXNnTGVuID0gMDsKKworCQl9CisJCWVsc2UgeworCQkJREJHUFJJTlRfRVJSKCgiTWxtZVJlc3RhcnRTdGF0ZU1hY2hpbmU6IE1sbWVRdWV1ZSBlbXB0eVxuIikpOworCQl9CisJfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCVVDSEFSIGk7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCS8vIENhbmNlbCBhbGwgdGltZXIgZXZlbnRzCisJCS8vIEJlIGNhcmVmdWwgdG8gY2FuY2VsIG5ldyBhZGRlZCB0aW1lcgorCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5Bc3NvY1RpbWVyLAkgICZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5SZWFzc29jVGltZXIsICAgJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkRpc2Fzc29jVGltZXIsICAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLAkgICAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsCSAgICZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsCSAgICZDYW5jZWxsZWQpOworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJCXsKKwkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZDYW5jZWxsZWQpOworCQl9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8gQ2hhbmdlIGJhY2sgdG8gb3JpZ2luYWwgY2hhbm5lbCBpbiBjYXNlIG9mIGRvaW5nIHNjYW4KKwlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKKwlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKworCS8vIFJlc3VtZSBNU0RVIHdoaWNoIGlzIHR1cm5lZCBvZmYgZHVybmluZyBzY2FuCisJUlRNUFJlc3VtZU1zZHVUcmFuc21pc3Npb24ocEFkKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQkvLyBTZXQgYWxsIHN0YXRlIG1hY2hpbmVzIGJhY2sgSURMRQorCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICAgID0gQ05UTF9JRExFOworCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSAgID0gQVNTT0NfSURMRTsKKwkJcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSAgICA9IEFVVEhfUkVRX0lETEU7CisJCXBBZC0+TWxtZS5BdXRoUnNwTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JTUF9JRExFOworCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlICAgID0gU1lOQ19JRExFOworCQlwQWQtPk1sbWUuQWN0TWFjaGluZS5DdXJyU3RhdGUgICAgPSBBQ1RfSURMRTsKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJcEFkLT5NbG1lLkRsc01hY2hpbmUuQ3VyclN0YXRlICAgID0gRExTX0lETEU7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgUlQyODYwCisJLy8gUmVtb3ZlIHJ1bm5pbmcgc3RhdGUKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOworCXBBZC0+TWxtZS5iUnVubmluZyA9IEZBTFNFOworCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7CisjZW5kaWYgLy8gUlQyODYwIC8vCit9CisKKy8qISBcYnJpZWYJdGVzdCBpZiB0aGUgTUxNRSBRdWV1ZSBpcyBlbXB0eQorICoJXHBhcmFtCSpRdWV1ZQkgIFRoZSBNTE1FIFF1ZXVlCisgKglccmV0dXJuIFRSVUUgaWYgdGhlIFF1ZXVlIGlzIGVtcHR5LCBGQUxTRSBvdGhlcndpc2UKKyAqCVxwcmUKKyAqCVxwb3N0CisKKyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICovCitCT09MRUFOIE1sbWVRdWV1ZUVtcHR5KAorCUlOIE1MTUVfUVVFVUUgKlF1ZXVlKQoreworCUJPT0xFQU4gQW5zOworCisJTmRpc0FjcXVpcmVTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7CisJQW5zID0gKFF1ZXVlLT5OdW0gPT0gMCk7CisJTmRpc1JlbGVhc2VTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7CisKKwlyZXR1cm4gQW5zOworfQorCisvKiEgXGJyaWVmCSB0ZXN0IGlmIHRoZSBNTE1FIFF1ZXVlIGlzIGZ1bGwKKyAqCVxwYXJhbQkgKlF1ZXVlIAkgVGhlIE1MTUUgUXVldWUKKyAqCVxyZXR1cm4gIFRSVUUgaWYgdGhlIFF1ZXVlIGlzIGVtcHR5LCBGQUxTRSBvdGhlcndpc2UKKyAqCVxwcmUKKyAqCVxwb3N0CisKKyBJUlFMID0gUEFTU0lWRV9MRVZFTAorIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKi8KK0JPT0xFQU4gTWxtZVF1ZXVlRnVsbCgKKwlJTiBNTE1FX1FVRVVFICpRdWV1ZSkKK3sKKwlCT09MRUFOIEFuczsKKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOworCUFucyA9IChRdWV1ZS0+TnVtID09IE1BWF9MRU5fT0ZfTUxNRV9RVUVVRSB8fCBRdWV1ZS0+RW50cnlbUXVldWUtPlRhaWxdLk9jY3VwaWVkKTsKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKKworCXJldHVybiBBbnM7Cit9CisKKy8qISBcYnJpZWYJIFRoZSBkZXN0cnVjdG9yIG9mIE1MTUUgUXVldWUKKyAqCVxwYXJhbQorICoJXHJldHVybgorICoJXHByZQorICoJXHBvc3QKKyAqCVxub3RlCUNsZWFyIE1sbWUgUXVldWUsIFNldCBRdWV1ZS0+TnVtIHRvIFplcm8uCisKKyBJUlFMID0gUEFTU0lWRV9MRVZFTAorCisgKi8KK1ZPSUQgTWxtZVF1ZXVlRGVzdHJveSgKKwlJTiBNTE1FX1FVRVVFICpwUXVldWUpCit7CisJTmRpc0FjcXVpcmVTcGluTG9jaygmKHBRdWV1ZS0+TG9jaykpOworCXBRdWV1ZS0+TnVtICA9IDA7CisJcFF1ZXVlLT5IZWFkID0gMDsKKwlwUXVldWUtPlRhaWwgPSAwOworCU5kaXNSZWxlYXNlU3BpbkxvY2soJihwUXVldWUtPkxvY2spKTsKKwlOZGlzRnJlZVNwaW5Mb2NrKCYocFF1ZXVlLT5Mb2NrKSk7Cit9CisKKy8qISBcYnJpZWYJIFRvIHN1YnN0aXR1dGUgdGhlIG1lc3NhZ2UgdHlwZSBpZiB0aGUgbWVzc2FnZSBpcyBjb21pbmcgZnJvbSBleHRlcm5hbAorICoJXHBhcmFtCXBGcmFtZQkJICAgVGhlIGZyYW1lIHJlY2VpdmVkCisgKglccGFyYW0JKk1hY2hpbmUJICAgVGhlIHN0YXRlIG1hY2hpbmUKKyAqCVxwYXJhbQkqTXNnVHlwZQkgICB0aGUgbWVzc2FnZSB0eXBlIGZvciB0aGUgc3RhdGUgbWFjaGluZQorICoJXHJldHVybiBUUlVFIGlmIHRoZSBzdWJzdGl0dXRpb24gaXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlCisgKglccHJlCisgKglccG9zdAorCisgSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAqLworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorQk9PTEVBTiBNc2dUeXBlU3Vic3QoCisJSU4gUFJUTVBfQURBUFRFUiAgcEFkLAorCUlOIFBGUkFNRV84MDJfMTEgcEZyYW1lLAorCU9VVCBJTlQgKk1hY2hpbmUsCisJT1VUIElOVCAqTXNnVHlwZSkKK3sKKwlVU0hPUlQJU2VxOworCVVDSEFSCUVBUFR5cGU7CisJUFVDSEFSCXBEYXRhOworCisJLy8gUG9pbnRlciB0byBzdGFydCBvZiBkYXRhIGZyYW1lcyBpbmNsdWRpbmcgU05BUCBoZWFkZXIKKwlwRGF0YSA9IChQVUNIQVIpIHBGcmFtZSArIExFTkdUSF84MDJfMTE7CisKKwkvLyBUaGUgb25seSBkYXRhIHR5cGUgd2lsbCBwYXNzIHRvIHRoaXMgZnVuY3Rpb24gaXMgRUFQT0wgZnJhbWUKKwlpZiAocEZyYW1lLT5IZHIuRkMuVHlwZSA9PSBCVFlQRV9EQVRBKQorCXsKKwkJaWYgKE5kaXNFcXVhbE1lbW9yeShTTkFQX0FJUk9ORVQsIHBEYXRhLCBMRU5HVEhfODAyXzFfSCkpCisJCXsKKwkJCS8vIENpc2NvIEFpcm9uZXQgU05BUCBoZWFkZXIKKwkJCSpNYWNoaW5lID0gQUlST05FVF9TVEFURV9NQUNISU5FOworCQkJKk1zZ1R5cGUgPSBNVDJfQUlST05FVF9NU0c7CisJCQlyZXR1cm4gKFRSVUUpOworCQl9CisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCWlmICggcEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID09IENJU0NPX0F1dGhNb2RlTEVBUCApIC8vTEVBUAorCQl7CisJCQkvLyBMRUFQIGZyYW1lcworCQkJKk1hY2hpbmUgPSBMRUFQX1NUQVRFX01BQ0hJTkU7CisJCQlFQVBUeXBlID0gKigoVUNIQVIqKXBGcmFtZSArIExFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSCArIDEpOworCQkJcmV0dXJuIChMZWFwTXNnVHlwZVN1YnN0KEVBUFR5cGUsIE1zZ1R5cGUpKTsKKwkJfQorCQllbHNlCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCXsKKwkJCSpNYWNoaW5lID0gV1BBX1BTS19TVEFURV9NQUNISU5FOworCQkJRUFQVHlwZSA9ICooKFVDSEFSKilwRnJhbWUgKyBMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0ggKyAxKTsKKwkJCXJldHVybihXcGFNc2dUeXBlU3Vic3QoRUFQVHlwZSwgTXNnVHlwZSkpOworCQl9CisJfQorCisJc3dpdGNoIChwRnJhbWUtPkhkci5GQy5TdWJUeXBlKQorCXsKKwkJY2FzZSBTVUJUWVBFX0FTU09DX1JFUToKKwkJCSpNYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKKwkJCSpNc2dUeXBlID0gTVQyX1BFRVJfQVNTT0NfUkVROworCQkJYnJlYWs7CisJCWNhc2UgU1VCVFlQRV9BU1NPQ19SU1A6CisJCQkqTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7CisJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0FTU09DX1JTUDsKKwkJCWJyZWFrOworCQljYXNlIFNVQlRZUEVfUkVBU1NPQ19SRVE6CisJCQkqTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7CisJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX1JFQVNTT0NfUkVROworCQkJYnJlYWs7CisJCWNhc2UgU1VCVFlQRV9SRUFTU09DX1JTUDoKKwkJCSpNYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKKwkJCSpNc2dUeXBlID0gTVQyX1BFRVJfUkVBU1NPQ19SU1A7CisJCQlicmVhazsKKwkJY2FzZSBTVUJUWVBFX1BST0JFX1JFUToKKwkJCSpNYWNoaW5lID0gU1lOQ19TVEFURV9NQUNISU5FOworCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9QUk9CRV9SRVE7CisJCQlicmVhazsKKwkJY2FzZSBTVUJUWVBFX1BST0JFX1JTUDoKKwkJCSpNYWNoaW5lID0gU1lOQ19TVEFURV9NQUNISU5FOworCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9QUk9CRV9SU1A7CisJCQlicmVhazsKKwkJY2FzZSBTVUJUWVBFX0JFQUNPTjoKKwkJCSpNYWNoaW5lID0gU1lOQ19TVEFURV9NQUNISU5FOworCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9CRUFDT047CisJCQlicmVhazsKKwkJY2FzZSBTVUJUWVBFX0FUSU06CisJCQkqTWFjaGluZSA9IFNZTkNfU1RBVEVfTUFDSElORTsKKwkJCSpNc2dUeXBlID0gTVQyX1BFRVJfQVRJTTsKKwkJCWJyZWFrOworCQljYXNlIFNVQlRZUEVfRElTQVNTT0M6CisJCQkqTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7CisJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0RJU0FTU09DX1JFUTsKKwkJCWJyZWFrOworCQljYXNlIFNVQlRZUEVfQVVUSDoKKwkJCS8vIGdldCB0aGUgc2VxdWVuY2UgbnVtYmVyIGZyb20gcGF5bG9hZCAyNCBNYWMgSGVhZGVyICsgMiBieXRlcyBhbGdvcml0aG0KKwkJCU5kaXNNb3ZlTWVtb3J5KCZTZXEsICZwRnJhbWUtPk9jdGV0WzJdLCBzaXplb2YoVVNIT1JUKSk7CisJCQlpZiAoU2VxID09IDEgfHwgU2VxID09IDMpCisJCQl7CisJCQkJKk1hY2hpbmUgPSBBVVRIX1JTUF9TVEFURV9NQUNISU5FOworCQkJCSpNc2dUeXBlID0gTVQyX1BFRVJfQVVUSF9PREQ7CisJCQl9CisJCQllbHNlIGlmIChTZXEgPT0gMiB8fCBTZXEgPT0gNCkKKwkJCXsKKwkJCQkqTWFjaGluZSA9IEFVVEhfU1RBVEVfTUFDSElORTsKKwkJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0FVVEhfRVZFTjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTVUJUWVBFX0RFQVVUSDoKKwkJCSpNYWNoaW5lID0gQVVUSF9SU1BfU1RBVEVfTUFDSElORTsKKwkJCSpNc2dUeXBlID0gTVQyX1BFRVJfREVBVVRIOworCQkJYnJlYWs7CisJCWNhc2UgU1VCVFlQRV9BQ1RJT046CisJCQkqTWFjaGluZSA9IEFDVElPTl9TVEFURV9NQUNISU5FOworCQkJLy8gIFNvbWV0aW1lcyBTdGEgd2lsbCByZXR1cm4gd2l0aCBjYXRlZ29yeSBieXRlcyB3aXRoIE1TQiA9IDEsIGlmIHRoZXkgcmVjZWl2ZSBjYXRvZ29yeSBvdXQgb2YgdGhlaXIgc3VwcG9ydAorCQkJaWYgKChwRnJhbWUtPk9jdGV0WzBdJjB4N0YpID4gTUFYX1BFRVJfQ0FURV9NU0cpCisJCQl7CisJCQkJKk1zZ1R5cGUgPSBNVDJfQUNUX0lOVkFMSUQ7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJKk1zZ1R5cGUgPSAocEZyYW1lLT5PY3RldFswXSYweDdGKTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIEZBTFNFOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIHN0YXRlX21hY2hpbmUuYworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvKiEgXGJyaWVmIEluaXRpYWxpemUgdGhlIHN0YXRlIG1hY2hpbmUuCisgKglccGFyYW0gKlMJCQlwb2ludGVyIHRvIHRoZSBzdGF0ZSBtYWNoaW5lCisgKglccGFyYW0JVHJhbnMJCVN0YXRlIG1hY2hpbmUgdHJhbnNpdGlvbiBmdW5jdGlvbgorICoJXHBhcmFtCVN0TnIJCW51bWJlciBvZiBzdGF0ZXMKKyAqCVxwYXJhbQlNc2dOcgkJbnVtYmVyIG9mIG1lc3NhZ2VzCisgKglccGFyYW0JRGVmRnVuYyAJZGVmYXVsdCBmdW5jdGlvbiwgd2hlbiB0aGVyZSBpcyBpbnZhbGlkIHN0YXRlL21lc3NhZ2UgY29tYmluYXRpb24KKyAqCVxwYXJhbQlJbml0U3RhdGUJaW5pdGlhbCBzdGF0ZSBvZiB0aGUgc3RhdGUgbWFjaGluZQorICoJXHBhcmFtCUJhc2UJCVN0YXRlTWFjaGluZSBiYXNlLCBpbnRlcm5hbCB1c2Ugb25seQorICoJXHByZSBwX3NtIHNob3VsZCBiZSBhIGxlZ2FsIHBvaW50ZXIKKyAqCVxwb3N0CisKKyBJUlFMID0gUEFTU0lWRV9MRVZFTAorCisgKi8KK1ZPSUQgU3RhdGVNYWNoaW5lSW5pdCgKKwlJTiBTVEFURV9NQUNISU5FICpTLAorCUlOIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdLAorCUlOIFVMT05HIFN0TnIsCisJSU4gVUxPTkcgTXNnTnIsCisJSU4gU1RBVEVfTUFDSElORV9GVU5DIERlZkZ1bmMsCisJSU4gVUxPTkcgSW5pdFN0YXRlLAorCUlOIFVMT05HIEJhc2UpCit7CisJVUxPTkcgaSwgajsKKworCS8vIHNldCBudW1iZXIgb2Ygc3RhdGVzIGFuZCBtZXNzYWdlcworCVMtPk5yU3RhdGUgPSBTdE5yOworCVMtPk5yTXNnICAgPSBNc2dOcjsKKwlTLT5CYXNlICAgID0gQmFzZTsKKworCVMtPlRyYW5zRnVuYyAgPSBUcmFuczsKKworCS8vIGluaXQgYWxsIHN0YXRlIHRyYW5zaXRpb24gdG8gZGVmYXVsdCBmdW5jdGlvbgorCWZvciAoaSA9IDA7IGkgPCBTdE5yOyBpKyspCisJeworCQlmb3IgKGogPSAwOyBqIDwgTXNnTnI7IGorKykKKwkJeworCQkJUy0+VHJhbnNGdW5jW2kgKiBNc2dOciArIGpdID0gRGVmRnVuYzsKKwkJfQorCX0KKworCS8vIHNldCB0aGUgc3RhcnRpbmcgc3RhdGUKKwlTLT5DdXJyU3RhdGUgPSBJbml0U3RhdGU7Cit9CisKKy8qISBcYnJpZWYgVGhpcyBmdW5jdGlvbiBmaWxscyBpbiB0aGUgZnVuY3Rpb24gcG9pbnRlciBpbnRvIHRoZSBjZWxsIGluIHRoZSBzdGF0ZSBtYWNoaW5lCisgKglccGFyYW0gKlMJcG9pbnRlciB0byB0aGUgc3RhdGUgbWFjaGluZQorICoJXHBhcmFtIFN0CXN0YXRlCisgKglccGFyYW0gTXNnCWluY29taW5nIG1lc3NhZ2UKKyAqCVxwYXJhbSBmCXRoZSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCB3aGVuIChzdGF0ZSwgbWVzc2FnZSkgY29tYmluYXRpb24gb2NjdXJzIGF0IHRoZSBzdGF0ZSBtYWNoaW5lCisgKglccHJlICpTIHNob3VsZCBiZSBhIGxlZ2FsIHBvaW50ZXIgdG8gdGhlIHN0YXRlIG1hY2hpbmUsIHN0LCBtc2csIHNob3VsZCBiZSBhbGwgd2l0aGluIHRoZSByYW5nZSwgQmFzZSBzaG91bGQgYmUgc2V0IGluIHRoZSBpbml0aWFsIHN0YXRlCisgKglccG9zdAorCisgSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworICovCitWT0lEIFN0YXRlTWFjaGluZVNldEFjdGlvbigKKwlJTiBTVEFURV9NQUNISU5FICpTLAorCUlOIFVMT05HIFN0LAorCUlOIFVMT05HIE1zZywKKwlJTiBTVEFURV9NQUNISU5FX0ZVTkMgRnVuYykKK3sKKwlVTE9ORyBNc2dJZHg7CisKKwlNc2dJZHggPSBNc2cgLSBTLT5CYXNlOworCisJaWYgKFN0IDwgUy0+TnJTdGF0ZSAmJiBNc2dJZHggPCBTLT5Ock1zZykKKwl7CisJCS8vIGJvdW5kYXJ5IGNoZWNraW5nIGJlZm9yZSBzZXR0aW5nIHRoZSBhY3Rpb24KKwkJUy0+VHJhbnNGdW5jW1N0ICogUy0+TnJNc2cgKyBNc2dJZHhdID0gRnVuYzsKKwl9Cit9CisKKy8qISBcYnJpZWYJIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGUgc3RhdGUgdHJhbnNpdGlvbgorICoJXHBhcmFtCSAqQWRhcHRlciB0aGUgTklDIGFkYXB0ZXIgcG9pbnRlcgorICoJXHBhcmFtCSAqUyAJICB0aGUgc3RhdGUgbWFjaGluZQorICoJXHBhcmFtCSAqRWxlbQkgIHRoZSBtZXNzYWdlIHRvIGJlIGV4ZWN1dGVkCisgKglccmV0dXJuICAgTm9uZQorCisgSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAqLworVk9JRCBTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFNUQVRFX01BQ0hJTkUgKlMsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCSgqKFMtPlRyYW5zRnVuY1tTLT5DdXJyU3RhdGUgKiBTLT5Ock1zZyArIEVsZW0tPk1zZ1R5cGUgLSBTLT5CYXNlXSkpKHBBZCwgRWxlbSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhlIGRyb3AgZnVuY3Rpb24sIHdoZW4gbWFjaGluZSBleGVjdXRlcyB0aGlzLCB0aGUgbWVzc2FnZSBpcyBzaW1wbHkKKwkJaWdub3JlZC4gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmcsIHRoZSBtZXNzYWdlIGlzIGZyZWVkIGluCisJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24oKQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgRHJvcCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGxmc3IuYworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBMZnNySW5pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVTE9ORyBTZWVkKQoreworCWlmIChTZWVkID09IDApCisJCXBBZC0+TWxtZS5TaGlmdFJlZyA9IDE7CisJZWxzZQorCQlwQWQtPk1sbWUuU2hpZnRSZWcgPSBTZWVkOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVUNIQVIgUmFuZG9tQnl0ZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlVTE9ORyBpOworCVVDSEFSIFIsIFJlc3VsdDsKKworCVIgPSAwOworCisJaWYgKHBBZC0+TWxtZS5TaGlmdFJlZyA9PSAwKQorCU5kaXNHZXRTeXN0ZW1VcFRpbWUoKFVMT05HICopJnBBZC0+TWxtZS5TaGlmdFJlZyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCXsKKwkJaWYgKHBBZC0+TWxtZS5TaGlmdFJlZyAmIDB4MDAwMDAwMDEpCisJCXsKKwkJCXBBZC0+TWxtZS5TaGlmdFJlZyA9ICgocEFkLT5NbG1lLlNoaWZ0UmVnIF4gTEZTUl9NQVNLKSA+PiAxKSB8IDB4ODAwMDAwMDA7CisJCQlSZXN1bHQgPSAxOworCQl9CisJCWVsc2UKKwkJeworCQkJcEFkLT5NbG1lLlNoaWZ0UmVnID0gcEFkLT5NbG1lLlNoaWZ0UmVnID4+IDE7CisJCQlSZXN1bHQgPSAwOworCQl9CisJCVIgPSAoUiA8PCAxKSB8IFJlc3VsdDsKKwl9CisKKwlyZXR1cm4gUjsKK30KKworVk9JRCBBc2ljVXBkYXRlQXV0b0ZhbGxCYWNrVGFibGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcFJhdGVUYWJsZSkKK3sKKwlVQ0hBUgkJCQkJaTsKKwlIVF9GQktfQ0ZHMF9TVFJVQwkJSHRDZmcwOworCUhUX0ZCS19DRkcxX1NUUlVDCQlIdENmZzE7CisJTEdfRkJLX0NGRzBfU1RSVUMJCUxnQ2ZnMDsKKwlMR19GQktfQ0ZHMV9TVFJVQwkJTGdDZmcxOworCVBSVE1QX1RYX1JBVEVfU1dJVENICXBDdXJyVHhSYXRlLCBwTmV4dFR4UmF0ZTsKKworCS8vIHNldCB0byBpbml0aWFsIHZhbHVlCisJSHRDZmcwLndvcmQgPSAweDY1NDMyMTAwOworCUh0Q2ZnMS53b3JkID0gMHhlZGNiYTk4ODsKKwlMZ0NmZzAud29yZCA9IDB4ZWRjYmE5ODg7CisJTGdDZmcxLndvcmQgPSAweDAwMDAyMTAwOworCisJcE5leHRUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpcFJhdGVUYWJsZSsxOworCWZvciAoaSA9IDE7IGkgPCAqKChQVUNIQVIpIHBSYXRlVGFibGUpOyBpKyspCisJeworCQlwQ3VyclR4UmF0ZSA9IChQUlRNUF9UWF9SQVRFX1NXSVRDSClwUmF0ZVRhYmxlKzEraTsKKwkJc3dpdGNoIChwQ3VyclR4UmF0ZS0+TW9kZSkKKwkJeworCQkJY2FzZSAwOgkJLy9DQ0sKKwkJCQlicmVhazsKKwkJCWNhc2UgMToJCS8vT0ZETQorCQkJCXsKKwkJCQkJc3dpdGNoKHBDdXJyVHhSYXRlLT5DdXJyTUNTKQorCQkJCQl7CisJCQkJCQljYXNlIDA6CisJCQkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1MwRkJLID0gKHBOZXh0VHhSYXRlLT5Nb2RlID09IE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPkN1cnJNQ1MrOCk6IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAxOgorCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTMUZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgMjoKKwkJCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzJGQksgPSAocE5leHRUeFJhdGUtPk1vZGUgPT0gTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+Q3Vyck1DUys4KTogcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDM6CisJCQkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1MzRkJLID0gKHBOZXh0VHhSYXRlLT5Nb2RlID09IE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPkN1cnJNQ1MrOCk6IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSA0OgorCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTNEZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgNToKKwkJCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzVGQksgPSAocE5leHRUeFJhdGUtPk1vZGUgPT0gTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+Q3Vyck1DUys4KTogcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDY6CisJCQkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1M2RkJLID0gKHBOZXh0VHhSYXRlLT5Nb2RlID09IE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPkN1cnJNQ1MrOCk6IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSA3OgorCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTN0ZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCWNhc2UgMjoJCS8vSFQtTUlYCisJCQljYXNlIDM6CQkvL0hULUdGCisJCQkJeworCQkJCQlpZiAoKHBOZXh0VHhSYXRlLT5Nb2RlID49IE1PREVfSFRNSVgpICYmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyAhPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUykpCisJCQkJCXsKKwkJCQkJCXN3aXRjaChwQ3VyclR4UmF0ZS0+Q3Vyck1DUykKKwkJCQkJCXsKKwkJCQkJCQljYXNlIDA6CisJCQkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzBGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAxOgorCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1MxRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMjoKKwkJCQkJCQkJSHRDZmcwLmZpZWxkLkhUTUNTMkZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDM6CisJCQkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzNGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSA0OgorCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1M0RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgNToKKwkJCQkJCQkJSHRDZmcwLmZpZWxkLkhUTUNTNUZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDY6CisJCQkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzZGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSA3OgorCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1M3RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgODoKKwkJCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTOEZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDk6CisJCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzlGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAxMDoKKwkJCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTMTBGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAxMToKKwkJCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTMTFGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAxMjoKKwkJCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTMTJGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAxMzoKKwkJCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTMTNGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAxNDoKKwkJCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTMTRGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAxNToKKwkJCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTMTVGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQXNpY1VwZGF0ZUF1dG9GYWxsQmFja1RhYmxlOiBub3Qgc3VwcG9ydCBDdXJyTUNTPSVkXG4iLCBwQ3VyclR4UmF0ZS0+Q3Vyck1DUykpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQl9CisKKwkJcE5leHRUeFJhdGUgPSBwQ3VyclR4UmF0ZTsKKwl9CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIVF9GQktfQ0ZHMCwgSHRDZmcwLndvcmQpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEhUX0ZCS19DRkcxLCBIdENmZzEud29yZCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgTEdfRkJLX0NGRzAsIExnQ2ZnMC53b3JkKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBMR19GQktfQ0ZHMSwgTGdDZmcxLndvcmQpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJU2V0IE1BQyByZWdpc3RlciB2YWx1ZSBhY2NvcmRpbmcgb3BlcmF0aW9uIG1vZGUuCisJCU9wZXJhdGlvbk1vZGUgQU5EIGJOb25HRkV4aXN0IGFyZSBmb3IgTU0gYW5kIEdGIFByb3RlY2l0b24uCisJCUlmIE1NIG9yIEdGIG1hc2sgaXMgbm90IHNldCwgdGhvc2UgcGFzc2luZyBhcmd1bWVudCBkb2Vzbid0IG5vdCB0YWtlIGVmZmVjdC4KKworCQlPcGVyYXRpb24gbW9kZSBtZWFuaW5nOgorCQk9IDAgOiBQdXJlIEhULCBubyBwcmVvdGVjdGlvbi4KKwkJPSAweDAxOyB0aGVyZSBtYXkgYmUgbm9uLUhUIGRldmljZXMgaW4gYm90aCB0aGUgY29udHJvbCBhbmQgZXh0ZW5zaW9uIGNoYW5uZWwsIHByb3RlY3Rpb24gaXMgb3B0aW9uYWwgaW4gQlNTLgorCQk9IDB4MTA6IE5vIFRyYW5zbWlzc2lvbiBpbiA0ME0gaXMgcHJvdGVjdGVkLgorCQk9IDB4MTE6IFRyYW5zbWlzc2lvbiBpbiBib3RoIDQwTSBhbmQgMjBNIHNoYWxsIGJlIHByb3RlY3RlZAorCQlpZiAoYk5vbkdGRXhpc3QpCisJCQl3ZSBzaG91bGQgY2hvb3NlIG5vdCB0byB1c2UgR0YuIEJ1dCBzdGlsbCBzZXQgY29ycmVjdCBBU0lDIHJlZ2lzdGVycy4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIAlBc2ljVXBkYXRlUHJvdGVjdCgKKwlJTgkJUFJUTVBfQURBUFRFUglwQWQsCisJSU4gCQlVU0hPUlQJCQlPcGVyYXRpb25Nb2RlLAorCUlOIAkJVUNIQVIJCQlTZXRNYXNrLAorCUlOCQlCT09MRUFOCQkJYkRpc2FibGVCR1Byb3RlY3QsCisJSU4JCUJPT0xFQU4JCQliTm9uR0ZFeGlzdCkKK3sKKwlQUk9UX0NGR19TVFJVQwlQcm90Q2ZnLCBQcm90Q2ZnNDsKKwlVSU5UMzIgUHJvdGVjdFs2XTsKKwlVU0hPUlQJCQlvZmZzZXQ7CisJVUNIQVIJCQlpOworCVVJTlQzMiBNYWNSZWcgPSAwOworCisjaWZkZWYgUkFMSU5LX0FURQorCWlmIChBVEVfT04ocEFkKSkKKwkJcmV0dXJuOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmICghKHBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QpICYmIChPcGVyYXRpb25Nb2RlICE9IDgpKQorCXsKKwkJcmV0dXJuOworCX0KKworCWlmIChwQWQtPkJBVGFibGUubnVtQXNPcmlnaW5hdG9yKQorCXsKKwkJLy8KKwkJLy8gZW5hYmxlIHRoZSBSVFMvQ1RTIHRvIGF2b2lkIGNoYW5uZWwgY29sbGlzaW9uCisJCS8vCisJCVNldE1hc2sgPSBBTExOX1NFVFBST1RFQ1Q7CisJCU9wZXJhdGlvbk1vZGUgPSA4OworCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCS8vIENvbmZpZyBBU0lDIFJUUyB0aHJlc2hvbGQgcmVnaXN0ZXIKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1JUU19DRkcsICZNYWNSZWcpOworCU1hY1JlZyAmPSAweEZGMDAwMEZGOworI2lmIDAKKwlNYWNSZWcgfD0gKHBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA8PCA4KTsKKyNlbHNlCisJLy8gSWYgdGhlIHVzZXIgd2FudCBkaXNhYmxlIFJ0c1RocmVzaG9sZCBhbmQgZW5iYWxlIEFtc2R1L1JhbGluay1BZ2dyZWdhdGlvbiwgc2V0IHRoZSBSdHNUaHJlc2hvbGQgYXMgNDA5NgorICAgICAgICBpZiAoKAorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJKHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZSkgfHwKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCShwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID09IFRSVUUpKQorICAgICAgICAgICAgJiYgcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkID09IE1BWF9SVFNfVEhSRVNIT0xEKQorICAgICAgICB7CisJCQlNYWNSZWcgfD0gKDB4MTAwMCA8PCA4KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKwkJCU1hY1JlZyB8PSAocEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkIDw8IDgpOworICAgICAgICB9CisjZW5kaWYKKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1JUU19DRkcsIE1hY1JlZyk7CisKKwkvLyBJbml0aWFsIGNvbW1vbiBwcm90ZWN0aW9uIHNldHRpbmdzCisJUlRNUFplcm9NZW1vcnkoUHJvdGVjdCwgc2l6ZW9mKFByb3RlY3QpKTsKKwlQcm90Q2ZnNC53b3JkID0gMDsKKwlQcm90Q2ZnLndvcmQgPSAwOworCVByb3RDZmcuZmllbGQuVHhvcEFsbG93R0Y0MCA9IDE7CisJUHJvdENmZy5maWVsZC5UeG9wQWxsb3dHRjIwID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd01NNDAgPSAxOworCVByb3RDZmcuZmllbGQuVHhvcEFsbG93TU0yMCA9IDE7CisJUHJvdENmZy5maWVsZC5UeG9wQWxsb3dPZmRtID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd0NjayA9IDE7CisJUHJvdENmZy5maWVsZC5SVFNUaEVuID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOworCisJLy8gdXBkYXRlIFBIWSBtb2RlIGFuZCByYXRlCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKKwkJUHJvdENmZy5maWVsZC5Qcm90ZWN0UmF0ZSA9IDB4NDAwMDsKKwlQcm90Q2ZnLmZpZWxkLlByb3RlY3RSYXRlIHw9IHBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGU7CisKKwkvLyBIYW5kbGUgbGVnYWN5KEIvRykgcHJvdGVjdGlvbgorCWlmIChiRGlzYWJsZUJHUHJvdGVjdCkKKwl7CisJCS8vUHJvdENmZy5maWVsZC5Qcm90ZWN0UmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGU7CisJCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSAwOworCQlQcm90ZWN0WzBdID0gUHJvdENmZy53b3JkOworCQlQcm90ZWN0WzFdID0gUHJvdENmZy53b3JkOworCX0KKwllbHNlCisJeworCQkvL1Byb3RDZmcuZmllbGQuUHJvdGVjdFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5SdHNSYXRlOworCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gMDsJCQkvLyBDQ0sgZG8gbm90IG5lZWQgdG8gYmUgcHJvdGVjdGVkCisJCVByb3RlY3RbMF0gPSBQcm90Q2ZnLndvcmQ7CisJCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX0NUUzsJLy8gT0ZETSBuZWVkcyB1c2luZyBDQ0sgdG8gcHJvdGVjdAorCQlQcm90ZWN0WzFdID0gUHJvdENmZy53b3JkOworCX0KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCS8vIERlY2lkZSBIVCBmcmFtZSBwcm90ZWN0aW9uLgorCWlmICgoU2V0TWFzayAmIEFMTE5fU0VUUFJPVEVDVCkgIT0gMCkKKwl7CisJCXN3aXRjaChPcGVyYXRpb25Nb2RlKQorCQl7CisJCQljYXNlIDB4MDoKKwkJCQkvLyBOTyBQUk9URUNUCisJCQkJLy8gMS5BbGwgU1RBcyBpbiB0aGUgQlNTIGFyZSAyMC80MCBNSHogSFQKKwkJCQkvLyAyLiBpbiBhaSAyMC80ME1IeiBCU1MKKwkJCQkvLyAzLiBhbGwgU1RBcyBhcmUgMjBNSHogaW4gYSAyME1IeiBCU1MKKwkJCQkvLyBQdXJlIEhULiBubyBwcm90ZWN0aW9uLgorCisJCQkJLy8gTU0yMF9QUk9UX0NGRworCQkJCS8vCVJlc2VydmVkICgzMToyNykKKwkJCQkvLyAJUFJPVF9UWE9QKDI1OjIwKSAtLSAwMTAxMTEKKwkJCQkvLwlQUk9UX05BVigxOToxOCkgIC0tIDAxIChTaG9ydCBOQVYgcHJvdGVjdGlvbikKKwkJCQkvLyAgUFJPVF9DVFJMKDE3OjE2KSAtLSAwMCAoTm9uZSkKKwkJCQkvLyAJUFJPVF9SQVRFKDE1OjApICAtLSAweDQwMDQgKE9GRE0gMjRNKQorCQkJCVByb3RlY3RbMl0gPSAweDAxNzQ0MDA0OworCisJCQkJLy8gTU00MF9QUk9UX0NGRworCQkJCS8vCVJlc2VydmVkICgzMToyNykKKwkJCQkvLyAJUFJPVF9UWE9QKDI1OjIwKSAtLSAxMTExMTEKKwkJCQkvLwlQUk9UX05BVigxOToxOCkgIC0tIDAxIChTaG9ydCBOQVYgcHJvdGVjdGlvbikKKwkJCQkvLyAgUFJPVF9DVFJMKDE3OjE2KSAtLSAwMCAoTm9uZSkKKwkJCQkvLyAJUFJPVF9SQVRFKDE1OjApICAtLSAweDQwODQgKGR1cGxpY2F0ZSBPRkRNIDI0TSkKKwkJCQlQcm90ZWN0WzNdID0gMHgwM2Y0NDA4NDsKKworCQkJCS8vIENGMjBfUFJPVF9DRkcKKwkJCQkvLwlSZXNlcnZlZCAoMzE6MjcpCisJCQkJLy8gCVBST1RfVFhPUCgyNToyMCkgLS0gMDEwMTExCisJCQkJLy8JUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pCisJCQkJLy8gIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpCisJCQkJLy8gCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDA0IChPRkRNIDI0TSkKKwkJCQlQcm90ZWN0WzRdID0gMHgwMTc0NDAwNDsKKworCQkJCS8vIENGNDBfUFJPVF9DRkcKKwkJCQkvLwlSZXNlcnZlZCAoMzE6MjcpCisJCQkJLy8gCVBST1RfVFhPUCgyNToyMCkgLS0gMTExMTExCisJCQkJLy8JUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pCisJCQkJLy8gIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpCisJCQkJLy8gCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDg0IChkdXBsaWNhdGUgT0ZETSAyNE0pCisJCQkJUHJvdGVjdFs1XSA9IDB4MDNmNDQwODQ7CisKKwkJCQlpZiAoYk5vbkdGRXhpc3QpCisJCQkJeworCQkJCQkvLyBQUk9UX05BVigxOToxOCkgIC0tIDAxIChTaG9ydCBOQVYgcHJvdGVjdGlpb24pCisJCQkJCS8vIFBST1RfQ1RSTCgxNzoxNikgLS0gMDEgKFJUUy9DVFMpCisJCQkJCVByb3RlY3RbNF0gPSAweDAxNzU0MDA0OworCQkJCQlQcm90ZWN0WzVdID0gMHgwM2Y1NDA4NDsKKwkJCQl9CisJCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iUlRTTG9uZ1Byb3RPbiA9IEZBTFNFOworCQkJCWJyZWFrOworCisgCQkJY2FzZSAxOgorCQkJCS8vIFRoaXMgaXMgIkhUIG5vbi1tZW1iZXIgcHJvdGVjdGlvbiBtb2RlLiIKKwkJCQkvLyBJZiB0aGVyZSBtYXkgYmUgbm9uLUhUIFNUQXMgbXkgQlNTCisJCQkJUHJvdENmZy53b3JkID0gMHgwMTc0NDAwNDsJLy8gUFJPVF9DVFJMKDE3OjE2KSA6IDAgKE5vbmUpCisJCQkJUHJvdENmZzQud29yZCA9IDB4MDNmNDQwODQ7IC8vIGR1cGxpY2FldCBsZWdhY3kgMjRNLiBCVyBzZXQgMS4KKwkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19CR19QUk9URUNUSU9OX0lOVVNFRCkpCisJCQkJeworCQkJCQlQcm90Q2ZnLndvcmQgPSAweDAxNzQwMDAzOwkvL0VSUCB1c2UgUHJvdGVjdGlvbiBiaXQgaXMgc2V0LCB1c2UgcHJvdGVjdGlvbiByYXRlIGF0IENsYXVzZSAxOC4uCisJCQkJCVByb3RDZmc0LndvcmQgPSAweDAzZjQwMDAzOyAvLyBEb24ndCBkdXBsaWNhdGUgUlRTL0NUUyBpbiBDQ0sgbW9kZS4gMHgwM2Y0MDA4MzsKKwkJCQl9CisJCQkJLy9Bc3NpZ24gUHJvdGVjdGlvbiBtZXRob2QgZm9yIDIwJjQwIE1IeiBwYWNrZXRzCisJCQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0Q3RybCA9IEFTSUNfUlRTOworCQkJCVByb3RDZmcuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7CisJCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKKwkJCQlQcm90Q2ZnNC5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKKwkJCQlQcm90ZWN0WzJdID0gUHJvdENmZy53b3JkOworCQkJCVByb3RlY3RbM10gPSBQcm90Q2ZnNC53b3JkOworCQkJCVByb3RlY3RbNF0gPSBQcm90Q2ZnLndvcmQ7CisJCQkJUHJvdGVjdFs1XSA9IFByb3RDZmc0LndvcmQ7CisJCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iUlRTTG9uZ1Byb3RPbiA9IFRSVUU7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMjoKKwkJCQkvLyBJZiBvbmx5IEhUIFNUQXMgYXJlIGluIEJTUy4gYXQgbGVhc3Qgb25lIGlzIDIwTUh6LiBPbmx5IHByb3RlY3QgNDBNSHogcGFja2V0cworCQkJCVByb3RDZmcud29yZCA9IDB4MDE3NDQwMDQ7ICAvLyBQUk9UX0NUUkwoMTc6MTYpIDogMCAoTm9uZSkKKwkJCQlQcm90Q2ZnNC53b3JkID0gMHgwM2Y0NDA4NDsgLy8gZHVwbGljYWV0IGxlZ2FjeSAyNE0uIEJXIHNldCAxLgorCisJCQkJLy9Bc3NpZ24gUHJvdGVjdGlvbiBtZXRob2QgZm9yIDQwTUh6IHBhY2tldHMKKwkJCQlQcm90Q2ZnNC5maWVsZC5Qcm90ZWN0Q3RybCA9IEFTSUNfUlRTOworCQkJCVByb3RDZmc0LmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOworCQkJCVByb3RlY3RbMl0gPSBQcm90Q2ZnLndvcmQ7CisJCQkJUHJvdGVjdFszXSA9IFByb3RDZmc0LndvcmQ7CisJCQkJaWYgKGJOb25HRkV4aXN0KQorCQkJCXsKKwkJCQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0Q3RybCA9IEFTSUNfUlRTOworCQkJCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOworCQkJCX0KKwkJCQlQcm90ZWN0WzRdID0gUHJvdENmZy53b3JkOworCQkJCVByb3RlY3RbNV0gPSBQcm90Q2ZnNC53b3JkOworCisJCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iUlRTTG9uZ1Byb3RPbiA9IEZBTFNFOworCQkJCWJyZWFrOworCisJCQljYXNlIDM6CisJCQkJLy8gSFQgbWl4ZWQgbW9kZS4JIFBST1RFQ1QgQUxMIQorCQkJCS8vIEFzc2lnbiBSYXRlCisJCQkJUHJvdENmZy53b3JkID0gMHgwMTc0NDAwNDsJLy9kdXBsaWNhZXQgbGVnYWN5IDI0TS4gQlcgc2V0IDEuCisJCQkJUHJvdENmZzQud29yZCA9IDB4MDNmNDQwODQ7CisJCQkJLy8gYm90aCAyME1IeiBhbmQgNDBNSHogYXJlIHByb3RlY3RlZC4gV2hldGhlciB1c2UgUlRTIG9yIENUUy10by1zZWxmIGRlcGVuZHMgb24gdGhlCisJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQpKQorCQkJCXsKKwkJCQkJUHJvdENmZy53b3JkID0gMHgwMTc0MDAwMzsJLy9FUlAgdXNlIFByb3RlY3Rpb24gYml0IGlzIHNldCwgdXNlIHByb3RlY3Rpb24gcmF0ZSBhdCBDbGF1c2UgMTguLgorCQkJCQlQcm90Q2ZnNC53b3JkID0gMHgwM2Y0MDAwMzsgLy8gRG9uJ3QgZHVwbGljYXRlIFJUUy9DVFMgaW4gQ0NLIG1vZGUuIDB4MDNmNDAwODMKKwkJCQl9CisJCQkJLy9Bc3NpZ24gUHJvdGVjdGlvbiBtZXRob2QgZm9yIDIwJjQwIE1IeiBwYWNrZXRzCisJCQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0Q3RybCA9IEFTSUNfUlRTOworCQkJCVByb3RDZmcuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7CisJCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKKwkJCQlQcm90Q2ZnNC5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKKwkJCQlQcm90ZWN0WzJdID0gUHJvdENmZy53b3JkOworCQkJCVByb3RlY3RbM10gPSBQcm90Q2ZnNC53b3JkOworCQkJCVByb3RlY3RbNF0gPSBQcm90Q2ZnLndvcmQ7CisJCQkJUHJvdGVjdFs1XSA9IFByb3RDZmc0LndvcmQ7CisJCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iUlRTTG9uZ1Byb3RPbiA9IFRSVUU7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgODoKKwkJCQkvLyBTcGVjaWFsIG9uIGZvciBBdGhlcm9zIHByb2JsZW0gbiBjaGlwLgorCQkJCVByb3RlY3RbMl0gPSAweDAxNzU0MDA0OworCQkJCVByb3RlY3RbM10gPSAweDAzZjU0MDg0OworCQkJCVByb3RlY3RbNF0gPSAweDAxNzU0MDA0OworCQkJCVByb3RlY3RbNV0gPSAweDAzZjU0MDg0OworCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBUUlVFOworCQkJCWJyZWFrOworCQl9CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJb2Zmc2V0ID0gQ0NLX1BST1RfQ0ZHOworCWZvciAoaSA9IDA7aSA8IDY7aSsrKQorCXsKKwkJaWYgKChTZXRNYXNrICYgKDE8PCBpKSkpCisJCXsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCArIGkqNCwgUHJvdGVjdFtpXSk7CisJCX0KKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNTd2l0Y2hDaGFubmVsKAorCQkJCQkgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVDSEFSCQkJQ2hhbm5lbCwKKwlJTglCT09MRUFOCQkJYlNjYW4pCit7CisJVUxPTkcJCQlSMiA9IDAsIFIzID0gREVGQVVMVF9SRl9UWF9QT1dFUiwgUjQgPSAwOworCUNIQVIgICAgVHhQd2VyID0gMCwgVHhQd2VyMiA9IERFRkFVTFRfUkZfVFhfUE9XRVI7IC8vQmJwOTQgPSBCQlBSOTRfREVGQVVMVCwgVHhQd2VyMiA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJVUNIQVIJaW5kZXg7CisJVUlOVDMyIAlWYWx1ZSA9IDA7IC8vQmJwUmVnLCBWYWx1ZTsKKwlSVE1QX1JGX1JFR1MgKlJGUmVnVGFibGU7CisKKwkvLyBTZWFyY2ggVHggcG93ZXIgdmFsdWUKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBwQWQtPkNoYW5uZWxMaXN0TnVtOyBpbmRleCsrKQorCXsKKwkJaWYgKENoYW5uZWwgPT0gcEFkLT5DaGFubmVsTGlzdFtpbmRleF0uQ2hhbm5lbCkKKwkJeworCQkJVHhQd2VyID0gcEFkLT5DaGFubmVsTGlzdFtpbmRleF0uUG93ZXI7CisJCQlUeFB3ZXIyID0gcEFkLT5DaGFubmVsTGlzdFtpbmRleF0uUG93ZXIyOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoaW5kZXggPT0gTUFYX05VTV9PRl9DSEFOTkVMUykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFzaWNTd2l0Y2hDaGFubmVsOiBDYW50IGZpbmQgdGhlIENoYW5uZWwjJWQgXG4iLCBDaGFubmVsKSk7CisJfQorCisJeworCQlSRlJlZ1RhYmxlID0gUkYyODUwUmVnVGFibGU7CisKKwkJc3dpdGNoIChwQWQtPlJmSWNUeXBlKQorCQl7CisJCQljYXNlIFJGSUNfMjgyMDoKKwkJCWNhc2UgUkZJQ18yODUwOgorCQkJY2FzZSBSRklDXzI3MjA6CisJCQljYXNlIFJGSUNfMjc1MDoKKworCQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNX09GXzI4NTBfQ0hOTDsgaW5kZXgrKykKKwkJCXsKKwkJCQlpZiAoQ2hhbm5lbCA9PSBSRlJlZ1RhYmxlW2luZGV4XS5DaGFubmVsKQorCQkJCXsKKwkJCQkJUjIgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMjsKKwkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKKwkJCQkJeworCQkJCQkJUjIgfD0gMHg0MDAwOwkvLyBJZiBUWHBhdGggaXMgMSwgYml0IDE0ID0gMTsKKwkJCQkJfQorCisJCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpCisJCQkJCXsKKwkJCQkJCVIyIHw9IDB4NDA7CS8vIHdyaXRlIDEgdG8gb2ZmIFJ4cGF0aC4KKwkJCQkJfQorCQkJCQllbHNlIGlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCisJCQkJCXsKKwkJCQkJCVIyIHw9IDB4MjAwNDA7CS8vIHdyaXRlIDEgdG8gb2ZmIFJ4UGF0aAorCQkJCQl9CisKKwkJCQkJaWYgKENoYW5uZWwgPiAxNCkKKwkJCQkJeworCQkJCQkJLy8gaW5pdGlhbGl6ZSBSMywgUjQKKwkJCQkJCVIzID0gKFJGUmVnVGFibGVbaW5kZXhdLlIzICYgMHhmZmZmYzFmZik7CisJCQkJCQlSNCA9IChSRlJlZ1RhYmxlW2luZGV4XS5SNCAmICh+MHgwMDFmODdjMCkpIHwgKHBBZC0+UmZGcmVxT2Zmc2V0IDw8IDE1KTsKKworCQkJCQkJLy8gNUcgYmFuZCBwb3dlciByYW5nZTogMHhGOX4wWDBGLCBUWDAgUmVnMyBiaXQ5L1RYMSBSZWc0IGJpdDY9IjAiIG1lYW5zIHRoZSBUWCBwb3dlciByZWR1Y2UgN2RCCisJCQkJCQkvLyBSMworCQkJCQkJaWYgKChUeFB3ZXIgPj0gLTcpICYmIChUeFB3ZXIgPCAwKSkKKwkJCQkJCXsKKwkJCQkJCQlUeFB3ZXIgPSAoNytUeFB3ZXIpOworCQkJCQkJCVR4UHdlciA9IChUeFB3ZXIgPiAweEYpID8gKDB4RikgOiAoVHhQd2VyKTsKKwkJCQkJCQlSMyB8PSAoVHhQd2VyIDw8IDEwKTsKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBc2ljU3dpdGNoQ2hhbm5lbDogVHhQd2VyPSVkIFxuIiwgVHhQd2VyKSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJVHhQd2VyID0gKFR4UHdlciA+IDB4RikgPyAoMHhGKSA6IChUeFB3ZXIpOworCQkJCQkJCVIzIHw9IChUeFB3ZXIgPDwgMTApIHwgKDEgPDwgOSk7CisJCQkJCQl9CisKKwkJCQkJCS8vIFI0CisJCQkJCQlpZiAoKFR4UHdlcjIgPj0gLTcpICYmIChUeFB3ZXIyIDwgMCkpCisJCQkJCQl7CisJCQkJCQkJVHhQd2VyMiA9ICg3K1R4UHdlcjIpOworCQkJCQkJCVR4UHdlcjIgPSAoVHhQd2VyMiA+IDB4RikgPyAoMHhGKSA6IChUeFB3ZXIyKTsKKwkJCQkJCQlSNCB8PSAoVHhQd2VyMiA8PCA3KTsKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBc2ljU3dpdGNoQ2hhbm5lbDogVHhQd2VyMj0lZCBcbiIsIFR4UHdlcjIpKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlUeFB3ZXIyID0gKFR4UHdlcjIgPiAweEYpID8gKDB4RikgOiAoVHhQd2VyMik7CisJCQkJCQkJUjQgfD0gKFR4UHdlcjIgPDwgNykgfCAoMSA8PCA2KTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCVIzID0gKFJGUmVnVGFibGVbaW5kZXhdLlIzICYgMHhmZmZmYzFmZikgfCAoVHhQd2VyIDw8IDkpOyAvLyBzZXQgVFggcG93ZXIwCisJCQkJCVI0ID0gKFJGUmVnVGFibGVbaW5kZXhdLlI0ICYgKH4weDAwMWY4N2MwKSkgfCAocEFkLT5SZkZyZXFPZmZzZXQgPDwgMTUpIHwgKFR4UHdlcjIgPDw2KTsvLyBTZXQgZnJlcSBPZmZzZXQgJiBUeFB3cjEKKwkJCQkJfQorCisJCQkJCS8vIEJhc2VkIG9uIEJCUCBjdXJyZW50IG1vZGUgYmVmb3JlIGNoYW5naW5nIFJGIGNoYW5uZWwuCisJCQkJCWlmICghYlNjYW4gJiYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkpCisJCQkJCXsKKwkJCQkJCVI0IHw9MHgyMDAwMDA7CisJCQkJCX0KKworCQkJCQkvLyBVcGRhdGUgdmFyaWFibGVzCisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA9IENoYW5uZWw7CisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjEgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMTsKKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5SMiA9IFIyOworCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIzID0gUjM7CisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgPSBSNDsKKworCQkJCQkvLyBTZXQgUkYgdmFsdWUgMSdzIHNldCBSM1tiaXQyXSA9IFswXQorCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIxKTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMik7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIChwQWQtPkxhdGNoUmZSZWdzLlIzICYgKH4weDA0KSkpOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlI0KTsKKworCQkJCQlSVE1QdXNlY0RlbGF5KDIwMCk7CisKKwkJCQkJLy8gU2V0IFJGIHZhbHVlIDIncyBzZXQgUjNbYml0Ml0gPSBbMV0KKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMSk7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjIpOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCAocEFkLT5MYXRjaFJmUmVncy5SMyB8IDB4MDQpKTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SNCk7CisKKwkJCQkJUlRNUHVzZWNEZWxheSgyMDApOworCisJCQkJCS8vIFNldCBSRiB2YWx1ZSAzJ3Mgc2V0IFIzW2JpdDJdID0gWzBdCisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjEpOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIyKTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgJiAofjB4MDQpKSk7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpOworCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvLyBDaGFuZ2UgQkJQIHNldHRpbmcgZHVyaW5nIHNpd3RjaCBmcm9tIGEtPmcsIGctPmEKKwlpZiAoQ2hhbm5lbCA8PSAxNCkKKwl7CisJICAgIFVMT05HCVR4UGluQ2ZnID0gMHgwMDA1MEYwQTsvL0dhcnkgMjAwNy8wOC8wOSAweDA1MEEwQQorCisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjYyLCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjYzLCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY0LCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjg2LCAwKTsvLygweDQ0IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsJLy8gQWNjb3JkaW5nIHRoZSBSb3J5J3Mgc3VnZ2VzdGlvbiB0byBzb2x2ZSB0aGUgbWlkZGxlIHJhbmdlIGlzc3VlLgorCQkvL1JUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgyLCAweDYyKTsKKworCQkvLyBSeCBIaWdoIHBvd2VyIFZHQSBvZmZzZXQgZm9yIExOQSBzZWxlY3QKKwkgICAgaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5FeHRlcm5hbExOQUZvckcpCisJICAgIHsKKwkgICAgICAgIFJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgyLCAweDYyKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjc1LCAweDQ2KTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkgICAgICAgIFJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgyLCAweDg0KTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjc1LCAweDUwKTsKKwkgICAgfQorCisJCS8vIDVHIGJhbmQgc2VsZWN0aW9uIFBJTiwgYml0MSBhbmQgYml0MiBhcmUgY29tcGxlbWVudAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmVmFsdWUpOworCQlWYWx1ZSAmPSAofjB4Nik7CisJCVZhbHVlIHw9ICgweDA0KTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIFZhbHVlKTsKKworICAgICAgICAvLyBUdXJuIG9mZiB1bnVzZWQgUEEgb3IgTE5BIHdoZW4gb25seSAxVCBvciAxUgorCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKQorCQl7CisJCQlUeFBpbkNmZyAmPSAweEZGRkZGRkYzOworCQl9CisJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCisJCXsKKwkJCVR4UGluQ2ZnICY9IDB4RkZGRkYzRkY7CisJCX0KKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QSU5fQ0ZHLCBUeFBpbkNmZyk7CisJfQorCWVsc2UKKwl7CisJICAgIFVMT05HCVR4UGluQ2ZnID0gMHgwMDA1MEYwNTsvL0dhcnkgMjAwNy84LzkgMHgwNTA1MDUKKworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2MiwgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2MywgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NCwgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4NiwgMCk7Ly8oMHg0NCAtIEdFVF9MTkFfR0FJTihwQWQpKSk7ICAgLy8gQWNjb3JkaW5nIHRoZSBSb3J5J3Mgc3VnZ2VzdGlvbiB0byBzb2x2ZSB0aGUgbWlkZGxlIHJhbmdlIGlzc3VlLgorCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MiwgMHhGMik7CisKKwkJLy8gUnggSGlnaCBwb3dlciBWR0Egb2Zmc2V0IGZvciBMTkEgc2VsZWN0CisJCWlmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuRXh0ZXJuYWxMTkFGb3JBKQorCQl7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3NSwgMHg0Nik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3NSwgMHg1MCk7CisJCX0KKworCQkvLyA1RyBiYW5kIHNlbGVjdGlvbiBQSU4sIGJpdDEgYW5kIGJpdDIgYXJlIGNvbXBsZW1lbnQKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJlZhbHVlKTsKKwkJVmFsdWUgJj0gKH4weDYpOworCQlWYWx1ZSB8PSAoMHgwMik7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7CisKKyAgICAgICAgLy8gVHVybiBvZmYgdW51c2VkIFBBIG9yIExOQSB3aGVuIG9ubHkgMVQgb3IgMVIKKwkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKKwkJeworCQkJVHhQaW5DZmcgJj0gMHhGRkZGRkZGMzsKKwl9CisJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCisJCXsKKwkJCVR4UGluQ2ZnICY9IDB4RkZGRkYzRkY7CisJfQorCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BJTl9DRkcsIFR4UGluQ2ZnKTsKKwl9CisKKyAgICAvLyBSNjYgc2hvdWxkIGJlIHNldCBhY2NvcmRpbmcgdG8gQ2hhbm5lbCBhbmQgdXNlIDIwTUh6IHdoZW4gc2Nhbm5pbmcKKwkvL1JUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCAoMHgyRSArIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJaWYgKGJTY2FuKQorCQlSVE1QU2V0QUdDSW5pdFZhbHVlKHBBZCwgQldfMjApOworCWVsc2UKKwkJUlRNUFNldEFHQ0luaXRWYWx1ZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyk7CisKKwkvLworCS8vIE9uIDExQSwgV2Ugc2hvdWxkIGRlbGF5IGFuZCB3YWl0IFJGL0JCUCB0byBiZSBzdGFibGUKKwkvLyBhbmQgdGhlIGFwcHJvcHJpYXRlIHRpbWUgc2hvdWxkIGJlIDEwMDAgbWljcm8gc2Vjb25kcworCS8vIDIwMDUvMDYvMDUgLSBPbiAxMUcsIFdlIGFsc28gbmVlZCB0aGlzIGRlbGF5IHRpbWUuIE90aGVyd2lzZSBpdCdzIGRpZmZpY3VsdCB0byBwYXNzIHRoZSBXSFFMLgorCS8vCisJUlRNUHVzZWNEZWxheSgxMDAwKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN3aXRjaENoYW5uZWwjJWQoUkY9JWQsIFB3cjA9JWx1LCBQd3IxPSVsdSwgJWRUKSB0byAsIFIxPTB4JTA4bHgsIFIyPTB4JTA4bHgsIFIzPTB4JTA4bHgsIFI0PTB4JTA4bHhcbiIsCisJCQkJCQkJICBDaGFubmVsLAorCQkJCQkJCSAgcEFkLT5SZkljVHlwZSwKKwkJCQkJCQkgIChSMyAmIDB4MDAwMDNlMDApID4+IDksCisJCQkJCQkJICAoUjQgJiAweDAwMDAwN2MwKSA+PiA2LAorCQkJCQkJCSAgcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCwKKwkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjEsCisJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlIyLAorCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMywKKwkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciAyNDIxIG9ubHksIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgZHVyaW5nCisJCXNpdGUgc3VydmV5LiBJdCdzIG9ubHkgcmVxdWlyZWQgYWZ0ZXIgTklDIGRlY2lkZWQgdG8gc3RheSBhdCBhIGNoYW5uZWwKKwkJZm9yIGEgbG9uZ2VyIHBlcmlvZC4KKwkJV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgaXQncyBhbHdheXMgYWZ0ZXIgQXNpY1N3aXRjaENoYW5uZWwoKS4KKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNMb2NrQ2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiBDaGFubmVsKQoreworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRAlBc2ljQW50ZW5uYVNlbGVjdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUNoYW5uZWwpCit7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlBbnRlbm5hIG1pc2NlbGxhbmVvdXMgc2V0dGluZy4KKworCUFyZ3VtZW50czoKKwkJcEFkCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlCYW5kU3RhdGUJCQkJSW5kaWNhdGUgY3VycmVudCBCYW5kIFN0YXRlLgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMIDw9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCQkxLikgRnJhbWUgRW5kIHR5cGUgY29udHJvbAorCQkJb25seSB2YWxpZCBmb3IgRyBvbmx5IChSRl8yNTI3ICYgUkZfMjUyOSkKKwkJCTA6IG1lYW5zIERQRFQsIHNldCBCQlAgUjQgYml0IDUgdG8gMQorCQkJMTogbWVhbnMgU1BEVCwgc2V0IEJCUCBSNCBiaXQgNSB0byAwCisKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQXNpY0FudGVubmFTZXR0aW5nKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCUFCR0JBTkRfU1RBVEUJQmFuZFN0YXRlKQoreworfQorCitWT0lEIEFzaWNSZlR1bmluZ0V4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUdpdmVzIENDSyBUWCByYXRlIDIgbW9yZSBkQiBUWCBwb3dlci4KKwkJVGhpcyByb3V0aW5lIHdvcmtzIG9ubHkgaW4gTElOSyBVUCBpbiBJTkZSQVNUUlVDVFVSRSBtb2RlLgorCisJCWNhbGN1bGF0ZSBkZXNpcmVkIFR4IHBvd2VyIGluIFJGIFIzLlR4MH41LAlzaG91bGQgY29uc2lkZXIgLQorCQkwLiBpZiBjdXJyZW50IHJhZGlvIGlzIGEgbm9pc3kgZW52aXJvbm1lbnQgKHBBZC0+RHJzQ291bnRlcnMuZk5vaXN5RW52aXJvbm1lbnQpCisJCTEuIFR4UG93ZXJQZXJjZW50YWdlCisJCTIuIGF1dG8gY2FsaWJyYXRpb24gYmFzZWQgb24gVFNTSSBmZWVkYmFjaworCQkzLiBleHRyYSAyIGRiIGZvciBDQ0sKKwkJNC4gLTEwIGRiIHVwb24gdmVyeS1zaG9ydCBkaXN0YW5jZSAoQXZnUlNTSSA+PSAtNDBkYikgdG8gQVAKKworCU5PVEU6IFNpbmNlIHRoaXMgcm91dGluZSByZXF1aXJlcyB0aGUgdmFsdWUgb2YgKHBBZC0+RHJzQ291bnRlcnMuZk5vaXN5RW52aXJvbm1lbnQpLAorCQlpdCBzaG91bGQgYmUgY2FsbGVkIEFGVEVSIE1sbWVEeW5hbWljVHhSYXRTd2l0Y2hpbmcoKQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY0FkanVzdFR4UG93ZXIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJSU5UCQkJaSwgajsKKwlDSEFSCQlEZWx0YVB3ciA9IDA7CisJQk9PTEVBTgkJYkF1dG9UeEFnYyA9IEZBTFNFOworCVVDSEFSCQlUc3NpUmVmLCAqcFRzc2lNaW51c0JvdW5kYXJ5LCAqcFRzc2lQbHVzQm91bmRhcnksIFR4QWdjU3RlcDsKKwlVQ0hBUgkJQmJwUjEgPSAwLCBCYnBSNDkgPSAwLCBpZHg7CisJUENIQVIJCXBUeEFnY0NvbXBlbnNhdGU7CisJVUxPTkcJCVR4UHdyWzVdOworCUNIQVIJCVZhbHVlOworCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkKKwl7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA+IDE0KQorCQl7CisJCQlUeFB3clswXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFswXTsKKwkJCVR4UHdyWzFdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzFdOworCQkJVHhQd3JbMl0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbMl07CisJCQlUeFB3clszXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFszXTsKKwkJCVR4UHdyWzRdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzRdOworCQl9CisJCWVsc2UKKwkJeworCQkJVHhQd3JbMF0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbMF07CisJCQlUeFB3clsxXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFsxXTsKKwkJCVR4UHdyWzJdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzJdOworCQkJVHhQd3JbM10gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbM107CisJCQlUeFB3cls0XSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFs0XTsKKwkJfQorCX0KKwllbHNlCisJeworCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQorCQl7CisJCQlUeFB3clswXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFswXTsKKwkJCVR4UHdyWzFdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzFdOworCQkJVHhQd3JbMl0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbMl07CisJCQlUeFB3clszXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFszXTsKKwkJCVR4UHdyWzRdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzRdOworCQl9CisJCWVsc2UKKwkJeworCQkJVHhQd3JbMF0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbMF07CisJCQlUeFB3clsxXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFsxXTsKKwkJCVR4UHdyWzJdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzJdOworCQkJVHhQd3JbM10gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbM107CisJCQlUeFB3cls0XSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFs0XTsKKwkJfQorCX0KKworCS8vIFRYIHBvd2VyIGNvbXBlbnNhdGlvbiBmb3IgdGVtcGVyYXR1cmUgdmFyaWF0aW9uIGJhc2VkIG9uIFRTU0kuIHRyeSBldmVyeSA0IHNlY29uZAorCWlmIChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDQgPT0gMCkKKwl7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KQorCQl7CisJCQkvKiBiZyBjaGFubmVsICovCisJCQliQXV0b1R4QWdjICAgICAgICAgPSBwQWQtPmJBdXRvVHhBZ2NHOworCQkJVHNzaVJlZiAgICAgICAgICAgID0gcEFkLT5Uc3NpUmVmRzsKKwkJCXBUc3NpTWludXNCb3VuZGFyeSA9ICZwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1swXTsKKwkJCXBUc3NpUGx1c0JvdW5kYXJ5ICA9ICZwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzBdOworCQkJVHhBZ2NTdGVwICAgICAgICAgID0gcEFkLT5UeEFnY1N0ZXBHOworCQkJcFR4QWdjQ29tcGVuc2F0ZSAgID0gJnBBZC0+VHhBZ2NDb21wZW5zYXRlRzsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIGEgY2hhbm5lbCAqLworCQkJYkF1dG9UeEFnYyAgICAgICAgID0gcEFkLT5iQXV0b1R4QWdjQTsKKwkJCVRzc2lSZWYgICAgICAgICAgICA9IHBBZC0+VHNzaVJlZkE7CisJCQlwVHNzaU1pbnVzQm91bmRhcnkgPSAmcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbMF07CisJCQlwVHNzaVBsdXNCb3VuZGFyeSAgPSAmcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVswXTsKKwkJCVR4QWdjU3RlcCAgICAgICAgICA9IHBBZC0+VHhBZ2NTdGVwQTsKKwkJCXBUeEFnY0NvbXBlbnNhdGUgICA9ICZwQWQtPlR4QWdjQ29tcGVuc2F0ZUE7CisJCX0KKworCQlpZiAoYkF1dG9UeEFnYykKKwkJeworCQkJLyogQmJwUjEgaXMgdW5zaWduZWQgY2hhciAqLworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0OSwgJkJicFI0OSk7CisKKwkJCS8qIChwKSBUc3NpUGx1c0JvdW5kYXJ5R1swXSA9IDAgPSAobSkgVHNzaU1pbnVzQm91bmRhcnlHWzBdICovCisJCQkvKiBjb21wZW5zYXRlOiArNCAgICAgKzMgICArMiAgICsxICAgIDAgICAtMSAgIC0yICAgLTMgICAtNCAqIHN0ZXBzICovCisJCQkvKiBzdGVwIHZhbHVlIGlzIGRlZmluZWQgaW4gcEFkLT5UeEFnY1N0ZXBHIGZvciB0eCBwb3dlciB2YWx1ZSAqLworCisJCQkvKiBbNF0rMStbNF0gICBwNCAgICAgcDMgICBwMiAgIHAxICAgbzEgICBtMSAgIG0yICAgbTMgICBtNCAqLworCQkJLyogZXg6ICAgICAgICAgMHgwMCAweDE1IDB4MjUgMHg0NSAweDg4IDB4QTAgMHhCNSAweEQwIDB4RjAKKwkJCSAgIGFib3ZlIHZhbHVlIGFyZSBleGFtaW5lZCBpbiBtYXNzIGZhY3RvcnkgcHJvZHVjdGlvbiAqLworCQkJLyogICAgICAgICAgICAgWzRdICAgIFszXSAgWzJdICBbMV0gIFswXSAgWzFdICBbMl0gIFszXSAgWzRdICovCisKKwkJCS8qIHBsdXMgKCspIGlzIDB4MDAgfiAweDQ1LCBtaW51cyAoLSkgaXMgMHhhMCB+IDB4ZjAgKi8KKwkJCS8qIGlmIHZhbHVlIGlzIGJldHdlZW4gcDEgfiBvMSBvciBvMSB+IHMxLCBubyBuZWVkIHRvIGFkanVzdCB0eCBwb3dlciAqLworCQkJLyogaWYgdmFsdWUgaXMgMHhhNSwgdHggcG93ZXIgd2lsbCBiZSAtPSBUeEFnY1N0ZXAqKDItMSkgKi8KKworCQkJaWYgKEJicFI0OSA+IHBUc3NpTWludXNCb3VuZGFyeVsxXSkKKwkJCXsKKwkJCQkvLyBSZWFkaW5nIGlzIGxhcmdlciB0aGFuIHRoZSByZWZlcmVuY2UgdmFsdWUKKwkJCQkvLyBjaGVjayBmb3IgaG93IGxhcmdlIHdlIG5lZWQgdG8gZGVjcmVhc2UgdGhlIFR4IHBvd2VyCisJCQkJZm9yIChpZHggPSAxOyBpZHggPCA1OyBpZHgrKykKKwkJCQl7CisJCQkJCWlmIChCYnBSNDkgPD0gcFRzc2lNaW51c0JvdW5kYXJ5W2lkeF0pICAvLyBGb3VuZCB0aGUgcmFuZ2UKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvLyBUaGUgaW5kZXggaXMgdGhlIHN0ZXAgd2Ugc2hvdWxkIGRlY3JlYXNlLCBpZHggPSAwIG1lYW5zIHRoZXJlIGlzIG5vdGhpbmcgdG8gY29tcGVuc2F0ZQorCQkJCSpwVHhBZ2NDb21wZW5zYXRlID0gLShUeEFnY1N0ZXAgKiAoaWR4LTEpKTsKKworCQkJCURlbHRhUHdyICs9ICgqcFR4QWdjQ29tcGVuc2F0ZSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0gVHggUG93ZXIsIEJCUCBSMT0leCwgVHNzaVJlZj0leCwgVHhBZ2NTdGVwPSV4LCBzdGVwID0gLSVkXG4iLAorCQkJCQlCYnBSNDksIFRzc2lSZWYsIFR4QWdjU3RlcCwgaWR4LTEpKTsKKwkJCX0KKwkJCWVsc2UgaWYgKEJicFI0OSA8IHBUc3NpUGx1c0JvdW5kYXJ5WzFdKQorCQkJeworCQkJCS8vIFJlYWRpbmcgaXMgc21hbGxlciB0aGFuIHRoZSByZWZlcmVuY2UgdmFsdWUKKwkJCQkvLyBjaGVjayBmb3IgaG93IGxhcmdlIHdlIG5lZWQgdG8gaW5jcmVhc2UgdGhlIFR4IHBvd2VyCisJCQkJZm9yIChpZHggPSAxOyBpZHggPCA1OyBpZHgrKykKKwkJCQl7CisJCQkJCWlmIChCYnBSNDkgPj0gcFRzc2lQbHVzQm91bmRhcnlbaWR4XSkgICAvLyBGb3VuZCB0aGUgcmFuZ2UKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvLyBUaGUgaW5kZXggaXMgdGhlIHN0ZXAgd2Ugc2hvdWxkIGluY3JlYXNlLCBpZHggPSAwIG1lYW5zIHRoZXJlIGlzIG5vdGhpbmcgdG8gY29tcGVuc2F0ZQorCQkJCSpwVHhBZ2NDb21wZW5zYXRlID0gVHhBZ2NTdGVwICogKGlkeC0xKTsKKwkJCQlEZWx0YVB3ciArPSAoKnBUeEFnY0NvbXBlbnNhdGUpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIisrIFR4IFBvd2VyLCBCQlAgUjE9JXgsIFRzc2lSZWY9JXgsIFR4QWdjU3RlcD0leCwgc3RlcCA9ICslZFxuIiwKKwkJCQkJQmJwUjQ5LCBUc3NpUmVmLCBUeEFnY1N0ZXAsIGlkeC0xKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJKnBUeEFnY0NvbXBlbnNhdGUgPSAwOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiAgIFR4IFBvd2VyLCBCQlAgUjQ5PSV4LCBUc3NpUmVmPSV4LCBUeEFnY1N0ZXA9JXgsIHN0ZXAgPSArJWRcbiIsCisJCQkJCUJicFI0OSwgVHNzaVJlZiwgVHhBZ2NTdGVwLCAwKSk7CisJCQl9CisJCX0KKwl9CisJZWxzZQorCXsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpCisJCXsKKwkJCWJBdXRvVHhBZ2MgICAgICAgICA9IHBBZC0+YkF1dG9UeEFnY0c7CisJCQlwVHhBZ2NDb21wZW5zYXRlICAgPSAmcEFkLT5UeEFnY0NvbXBlbnNhdGVHOworCQl9CisJCWVsc2UKKwkJeworCQkJYkF1dG9UeEFnYyAgICAgICAgID0gcEFkLT5iQXV0b1R4QWdjQTsKKwkJCXBUeEFnY0NvbXBlbnNhdGUgICA9ICZwQWQtPlR4QWdjQ29tcGVuc2F0ZUE7CisJCX0KKworCQlpZiAoYkF1dG9UeEFnYykKKwkJCURlbHRhUHdyICs9ICgqcFR4QWdjQ29tcGVuc2F0ZSk7CisJfQorCisJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCAmQmJwUjEpOworCUJicFIxICY9IDB4RkM7CisKKyNpZmRlZiBTSU5HTEVfU0tVCisJLy8gSGFuZGxlIHJlZ3VsYXRvcnkgbWF4IHR4IHBvd2VyIGNvbnN0cmFpbgorCWRvCisJeworCQlVQ0hBUiAgICBUeFB3ckluRUVQUk9NID0gMHhGRiwgQ291bnRyeVR4UHdyID0gMHhGRiwgY3JpdGVyaW9uOworCQlVQ0hBUiAgICBBZGp1c3RNYXhUeFB3cls0MF07CisKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkgLy8gNUcgYmFuZAorCQkJVHhQd3JJbkVFUFJPTSA9ICgocEFkLT5Db21tb25DZmcuRGVmaW5lTWF4VHhQd3IgJiAweEZGMDApID4+IDgpOworCQllbHNlIC8vIDIuNEcgYmFuZAorCQkJVHhQd3JJbkVFUFJPTSA9IChwQWQtPkNvbW1vbkNmZy5EZWZpbmVNYXhUeFB3ciAmIDB4MDBGRik7CisJCUNvdW50cnlUeFB3ciA9IEdldEN1bnRyeU1heFR4UHdyKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisKKwkJLy8gZXJyb3IgaGFuZGxpbmcsIHJhbmdlIGNoZWNrCisJCWlmICgoVHhQd3JJbkVFUFJPTSA+IDB4NTApIHx8IChDb3VudHJ5VHhQd3IgPiAweDUwKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJBc2ljQWRqdXN0VHhQb3dlciAtIEludmFsaWQgbWF4IHR4IHBvd2VyICg9MHglMDJ4KSwgQ291bnRyeVR4UHdyPSVkXG4iLCBUeFB3ckluRUVQUk9NLCBDb3VudHJ5VHhQd3IpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY3JpdGVyaW9uID0gKigoUFVDSEFSKVR4UHdyICsgMikgJiAweEY7ICAgICAgICAvLyBGQUUgdXNlIE9GRE0gNk0gYXMgY3JpdGVyaW9uCisKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiQXNpY0FkanVzdFR4UG93ZXIgKGNyaXRlcmlvbj0lZCwgVHhQd3JJbkVFUFJPTT0lZCwgQ291bnRyeVR4UHdyPSVkKVxuIiwgY3JpdGVyaW9uLCBUeFB3ckluRUVQUk9NLCBDb3VudHJ5VHhQd3IpKTsKKworCQkvLyBBZGp1c3QgbWF4IHR4IHBvd2VyIGFjY29yZGluZyB0byB0aGUgcmVsYXRpb25zaGlwIG9mIHR4IHBvd2VyIGluIEUyUFJPTQorCQlmb3IgKGk9MDsgaTw1OyBpKyspCisJCXsKKwkJCS8vIENDSyB3aWxsIGhhdmUgNGRCbSBsYXJnZXIgdGhhbiBPRkRNCisJCQkvLyBUaGVyZWZvcmUsIHdlIHNob3VsZCBzZXBhcmF0ZSB0byBwYXJzZSB0aGUgdHggcG93ZXIgZmllbGQKKwkJCWlmIChpID09IDApCisJCQl7CisJCQkJZm9yIChqPTA7IGo8ODsgaisrKQorCQkJCXsKKwkJCQkJVmFsdWUgPSAoQ0hBUikoKFR4UHdyW2ldID4+IGoqNCkgJiAweDBGKTsKKworCQkJCQlpZiAoaiA8IDQpCisJCQkJCXsKKwkJCQkJCS8vIENDSyB3aWxsIGhhdmUgNGRCbSBsYXJnZXIgdGhhbiBPRkRNCisJCQkJCQlBZGp1c3RNYXhUeFB3cltpKjgral0gPSBUeFB3ckluRUVQUk9NICsgKFZhbHVlIC0gY3JpdGVyaW9uKSArIDQ7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlBZGp1c3RNYXhUeFB3cltpKjgral0gPSBUeFB3ckluRUVQUk9NICsgKFZhbHVlIC0gY3JpdGVyaW9uKTsKKwkJCQkJfQorCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJBc2ljQWRqdXN0VHhQb3dlciAoaS9qPSVkLyVkLCBWYWx1ZT0lZCwgJWQpXG4iLCBpLCBqLCBWYWx1ZSwgQWRqdXN0TWF4VHhQd3JbaSo4K2pdKSk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWZvciAoaj0wOyBqPDg7IGorKykKKwkJCQl7CisJCQkJCVZhbHVlID0gKENIQVIpKChUeFB3cltpXSA+PiBqKjQpICYgMHgwRik7CisKKwkJCQkJQWRqdXN0TWF4VHhQd3JbaSo4K2pdID0gVHhQd3JJbkVFUFJPTSArIChWYWx1ZSAtIGNyaXRlcmlvbik7CisJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIkFzaWNBZGp1c3RUeFBvd2VyIChpL2o9JWQvJWQsIFZhbHVlPSVkLCAlZClcbiIsIGksIGosIFZhbHVlLCBBZGp1c3RNYXhUeFB3cltpKjgral0pKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBBZGp1c3QgdHggcG93ZXIgYWNjb3JkaW5nIHRvIHRoZSByZWxhdGlvbnNoaXAKKwkJZm9yIChpPTA7IGk8NTsgaSsrKQorCQl7CisJCQlpZiAoVHhQd3JbaV0gIT0gMHhmZmZmZmZmZikKKwkJCXsKKwkJCQlmb3IgKGo9MDsgajw4OyBqKyspCisJCQkJeworCQkJCQlWYWx1ZSA9IChDSEFSKSgoVHhQd3JbaV0gPj4gaio0KSAmIDB4MEYpOworCisJCQkJCS8vIFRoZSBzeXN0ZW0gdHggcG93ZXIgaXMgbGFyZ2VyIHRoYW4gdGhlIHJlZ3VsYXRvcnksIHRoZSBwb3dlciBzaG91bGQgYmUgcmVzdHJhaW4KKwkJCQkJaWYgKEFkanVzdE1heFR4UHdyW2kqOCtqXSA+IENvdW50cnlUeFB3cikKKwkJCQkJeworCQkJCQkJLy8gZGVjcmVhc2UgdG8gemVybyBhbmQgZG9uJ3QgbmVlZCB0byB0YWtlIGNhcmUgQkJQUjEKKwkJCQkJCWlmICgoVmFsdWUgLSAoQWRqdXN0TWF4VHhQd3JbaSo4K2pdIC0gQ291bnRyeVR4UHdyKSkgPiAwKQorCQkJCQkJCVZhbHVlIC09IChBZGp1c3RNYXhUeFB3cltpKjgral0gLSBDb3VudHJ5VHhQd3IpOworCQkJCQkJZWxzZQorCQkJCQkJCVZhbHVlID0gMDsKKworCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiQXNpY0FkanVzdFR4UG93ZXIgKGkvaj0lZC8lZCwgVmFsdWU9JWQsICVkKVxuIiwgaSwgaiwgVmFsdWUsIEFkanVzdE1heFR4UHdyW2kqOCtqXSkpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIkFzaWNBZGp1c3RUeFBvd2VyIChpL2o9JWQvJWQsIFZhbHVlPSVkLCAlZCwgbm8gY2hhbmdlKVxuIiwgaSwgaiwgVmFsdWUsIEFkanVzdE1heFR4UHdyW2kqOCtqXSkpOworCisJCQkJCQlUeFB3cltpXSA9IChUeFB3cltpXSAmIH4oMHgwMDAwMDAwRiA8PCBqKjQpKSB8IChWYWx1ZSA8PCBqKjQpOworCQkJCX0KKwkJCX0KKwkJfQorCX0gd2hpbGUgKEZBTFNFKTsKKyNlbmRpZiAvLyBTSU5HTEVfU0tVIC8vCisKKwkvKiBjYWxjdWxhdGUgZGVsdGEgcG93ZXIgYmFzZWQgb24gdGhlIHBlcmNlbnRhZ2Ugc3BlY2lmaWVkIGZyb20gVUkgKi8KKwkvLyBFMlBST00gc2V0dGluZyBpcyBjYWxpYnJhdGVkIGZvciBtYXhpbXVtIFRYIHBvd2VyIChpLmUuIDEwMCUpCisJLy8gV2UgbG93ZXIgVFggcG93ZXIgaGVyZSBhY2NvcmRpbmcgdG8gdGhlIHBlcmNlbnRhZ2Ugc3BlY2lmaWVkIGZyb20gVUkKKwlpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPT0gMHhmZmZmZmZmZikgICAgICAgLy8gQVVUTyBUWCBQT1dFUiBjb250cm9sCisJCTsKKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDkwKSAgLy8gOTEgfiAxMDAlICYgQVVUTywgdHJlYXQgYXMgMTAwJSBpbiB0ZXJtcyBvZiBtVworCQk7CisJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiA2MCkgIC8vIDYxIH4gOTAlLCB0cmVhdCBhcyA3NSUgaW4gdGVybXMgb2YgbVcJCS8vIERlbHRhUHdyIC09IDE7CisJeworCQlEZWx0YVB3ciAtPSAxOworCX0KKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDMwKSAgLy8gMzEgfiA2MCUsIHRyZWF0IGFzIDUwJSBpbiB0ZXJtcyBvZiBtVwkJLy8gRGVsdGFQd3IgLT0gMzsKKwl7CisJCURlbHRhUHdyIC09IDM7CisJfQorCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gMTUpICAvLyAxNiB+IDMwJSwgdHJlYXQgYXMgMjUlIGluIHRlcm1zIG9mIG1XCQkvLyBEZWx0YVB3ciAtPSA2OworCXsKKwkJQmJwUjEgfD0gMHgwMTsKKwl9CisJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiA5KSAgIC8vIDEwIH4gMTUlLCB0cmVhdCBhcyAxMi41JSBpbiB0ZXJtcyBvZiBtVwkJLy8gRGVsdGFQd3IgLT0gOTsKKwl7CisJCUJicFIxIHw9IDB4MDE7CisJCURlbHRhUHdyIC09IDM7CisJfQorCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMCB+IDkgJSwgdHJlYXQgYXMgTUlOKH4zJSkgaW4gdGVybXMgb2YgbVcJCS8vIERlbHRhUHdyIC09IDEyOworCXsKKwkJQmJwUjEgfD0gMHgwMjsKKwl9CisKKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBCYnBSMSk7CisKKwkvKiByZXNldCBkaWZmZXJlbnQgbmV3IHR4IHBvd2VyIGZvciBkaWZmZXJlbnQgVFggcmF0ZSAqLworCWZvcihpPTA7IGk8NTsgaSsrKQorCXsKKwkJaWYgKFR4UHdyW2ldICE9IDB4ZmZmZmZmZmYpCisJCXsKKwkJCWZvciAoaj0wOyBqPDg7IGorKykKKwkJCXsKKwkJCQlWYWx1ZSA9IChDSEFSKSgoVHhQd3JbaV0gPj4gaio0KSAmIDB4MEYpOyAvKiAwIH4gMTUgKi8KKworCQkJCWlmICgoVmFsdWUgKyBEZWx0YVB3cikgPCAwKQorCQkJCXsKKwkJCQkJVmFsdWUgPSAwOyAvKiBtaW4gKi8KKwkJCQl9CisJCQkJZWxzZSBpZiAoKFZhbHVlICsgRGVsdGFQd3IpID4gMHhGKQorCQkJCXsKKwkJCQkJVmFsdWUgPSAweEY7IC8qIG1heCAqLworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlWYWx1ZSArPSBEZWx0YVB3cjsgLyogdGVtcGVyYXR1cmUgY29tcGVuc2F0aW9uICovCisJCQkJfQorCisJCQkJLyogZmlsbCBuZXcgdmFsdWUgdG8gQ1NSIG9mZnNldCAqLworCQkJCVR4UHdyW2ldID0gKFR4UHdyW2ldICYgfigweDAwMDAwMDBGIDw8IGoqNCkpIHwgKFZhbHVlIDw8IGoqNCk7CisJCQl9CisKKwkJCS8qIHdyaXRlIHR4IHBvd2VyIHZhbHVlIHRvIENTUiAqLworCQkJLyogVFhfUFdSX0NGR18wICg4IHR4IHJhdGUpIGZvcglUWCBwb3dlciBmb3IgT0ZETSAxMk0vMThNCisJCQkJCQkJCQkJCVRYIHBvd2VyIGZvciBPRkRNIDZNLzlNCisJCQkJCQkJCQkJCVRYIHBvd2VyIGZvciBDQ0s1LjVNLzExTQorCQkJCQkJCQkJCQlUWCBwb3dlciBmb3IgQ0NLMU0vMk0gKi8KKwkJCS8qIFRYX1BXUl9DRkdfMSB+IFRYX1BXUl9DRkdfNCAqLworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUFdSX0NGR18wICsgaSo0LCBUeFB3cltpXSk7CisJCX0KKwl9CisKK30KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlwdXQgUEhZIHRvIHNsZWVwIGhlcmUsIGFuZCBzZXQgbmV4dCB3YWtldXAgdGltZXIuIFBIWSBkb2Vzbid0IG5vdCB3YWtldXAKKwkJYXV0b21hdGljYWxseS4gSW5zdGVhZCwgTUNVIHdpbGwgaXNzdWUgYSBUd2FrZVVwSW50ZXJydXB0IHRvIGhvc3QgYWZ0ZXIKKwkJdGhlIHdha2V1cCB0aW1lciB0aW1lb3V0LiBEcml2ZXIgaGFzIHRvIGlzc3VlIGEgc2VwYXJhdGUgY29tbWFuZCB0byB3YWtlCisJCVBIWSB1cC4KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBc2ljU2xlZXBUaGVuQXV0b1dha2V1cCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQgVGJ0dE51bVRvTmV4dFdha2VVcCkKK3sKKyAgICBSVDI4WFhfU1RBX1NMRUVQX1RIRU5fQVVUT19XQUtFVVAocEFkLCBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlBc2ljRm9yY2VXYWtldXAoKSBpcyB1c2VkIHdoZW5ldmVyIG1hbnVhbCB3YWtldXAgaXMgcmVxdWlyZWQKKwkJQXNpY0ZvcmNlU2xlZXAoKSBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gbm90IGluIElORlJBIEJTUy4gV2hlbgorCQlpbiBJTkZSQSBCU1MsIHdlIHNob3VsZCB1c2UgQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAoKSBpbnN0ZWFkLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY0ZvcmNlU2xlZXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlBc2ljRm9yY2VXYWtldXAoKSBpcyB1c2VkIHdoZW5ldmVyIFR3YWtldXAgdGltZXIgKHNldCB2aWEgQXNpY1NsZWVwVGhlbkF1dG9XYWtldXApCisJCWV4cGlyZWQuCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY0ZvcmNlV2FrZXVwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIEJPT0xFQU4gICAgYkZyb21UeCkKK3sKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gQXNpY0ZvcmNlV2FrZXVwIFxuIikpOworICAgIFJUMjhYWF9TVEFfRk9SQ0VfV0FLRVVQKHBBZCwgYkZyb21UeCk7Cit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVNldCBNeSBCU1NJRAorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNTZXRCc3NpZCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcEJzc2lkKQoreworCVVMT05HCQkgIEFkZHI0OworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT09PT09PT09PT09PiBBc2ljU2V0QnNzaWQgJXg6JXg6JXg6JXg6JXg6JXhcbiIsCisJCXBCc3NpZFswXSxwQnNzaWRbMV0scEJzc2lkWzJdLHBCc3NpZFszXSwgcEJzc2lkWzRdLHBCc3NpZFs1XSkpOworCisJQWRkcjQgPSAoVUxPTkcpKHBCc3NpZFswXSkJCSB8CisJCQkoVUxPTkcpKHBCc3NpZFsxXSA8PCA4KSAgfAorCQkJKFVMT05HKShwQnNzaWRbMl0gPDwgMTYpIHwKKwkJCShVTE9ORykocEJzc2lkWzNdIDw8IDI0KTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQlNTSURfRFcwLCBBZGRyNCk7CisKKwlBZGRyNCA9IDA7CisJLy8gYWx3YXlzIG9uZSBCU1NJRCBpbiBTVEEgbW9kZQorCUFkZHI0ID0gKFVMT05HKShwQnNzaWRbNF0pIHwgKFVMT05HKShwQnNzaWRbNV0gPDwgOCk7CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQlNTSURfRFcxLCBBZGRyNCk7Cit9CisKK1ZPSUQgQXNpY1NldE1jYXN0V0MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXTsKKwlVU0hPUlQJCW9mZnNldDsKKworCXBFbnRyeS0+U3N0ICAgICAgICA9IFNTVF9BU1NPQzsKKwlwRW50cnktPkFpZCAgICAgICAgPSBNQ0FTVF9XQ0lEOwkvLyBTb2Z0YXAgc3VwcG9ydHMgMSBCU1NJRCBhbmQgdXNlIFdDSUQ9MCBhcyBtdWx0aWNhc3QgV2NpZCBpbmRleAorCXBFbnRyeS0+UHNNb2RlICAgICA9IFBXUl9BQ1RJVkU7CisJcEVudHJ5LT5DdXJyVHhSYXRlID0gcEFkLT5Db21tb25DZmcuTWxtZVJhdGU7CisJb2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArIEJTUzBNY2FzdF9XQ0lEICogSFdfV0NJRF9FTlRSWV9TSVpFOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY0RlbFdjaWRUYWIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIJV2NpZCkKK3sKKwlVTE9ORwkJICBBZGRyMCA9IDB4MCwgQWRkcjEgPSAweDA7CisJVUxPTkcgCQlvZmZzZXQ7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljRGVsV2NpZFRhYj09PldjaWQgPSAweCV4XG4iLFdjaWQpKTsKKwlvZmZzZXQgPSBNQUNfV0NJRF9CQVNFICsgV2NpZCAqIEhXX1dDSURfRU5UUllfU0laRTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIEFkZHIwKTsKKwlvZmZzZXQgKz0gNDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIEFkZHIxKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNFbmFibGVSREcoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVFhfTElOS19DRkdfU1RSVUMJVHhMaW5rQ2ZnOworCVVJTlQzMgkJCQlEYXRhID0gMDsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfTElOS19DRkcsICZUeExpbmtDZmcud29yZCk7CisJVHhMaW5rQ2ZnLmZpZWxkLlR4UkRHRW4gPSAxOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0xJTktfQ0ZHLCBUeExpbmtDZmcud29yZCk7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIEVEQ0FfQUMwX0NGRywgJkRhdGEpOworCURhdGEgICY9IDB4RkZGRkZGMDA7CisJRGF0YSAgfD0gMHg4MDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIERhdGEpOworCisJLy9PUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY0Rpc2FibGVSREcoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVFhfTElOS19DRkdfU1RSVUMJVHhMaW5rQ2ZnOworCVVJTlQzMgkJCQlEYXRhID0gMDsKKworCisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9MSU5LX0NGRywgJlR4TGlua0NmZy53b3JkKTsKKwlUeExpbmtDZmcuZmllbGQuVHhSREdFbiA9IDA7CisJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfTElOS19DRkcsIFR4TGlua0NmZy53b3JkKTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgRURDQV9BQzBfQ0ZHLCAmRGF0YSk7CisKKwlEYXRhICAmPSAweEZGRkZGRjAwOworCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfRFlOQU1JQ19CRV9UWE9QX0FDVElWRSkKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJJiYgKHBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uTUlNT1BTRHluYW1pYyA9PSBGQUxTRSkKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkpCisJeworCQkvLyBGb3IgQ1dDIHRlc3QsIGNoYW5nZSB0eG9wIGZyb20gMHgzMCB0byAweDIwIGluIFR4QnVyc3QgbW9kZQorCQlpZiAocEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QpCisJCQlEYXRhIHw9IDB4MjA7CisJfQorCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgRGF0YSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNEaXNhYmxlU3luYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlCQ05fVElNRV9DRkdfU1RSVUMgY3NyOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tPkRpc2FibGUgVFNGIHN5bmNocm9uaXphdGlvblxuIikpOworCisJLy8gMjAwMy0xMi0yMCBkaXNhYmxlIFRTRiBhbmQgVEJUVCB3aGlsZSBOSUMgaW4gcG93ZXItc2F2aW5nIGhhdmUgc2lkZSBlZmZlY3QKKwkvLwkJCSAgdGhhdCBOSUMgd2lsbCBuZXZlciB3YWtlcyB1cCBiZWNhdXNlIFRTRiBzdG9wcyBhbmQgbm8gbW9yZQorCS8vCQkJICBUQlRUIGludGVycnVwdHMKKwlwQWQtPlRidHRUaWNrQ291bnQgPSAwOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAmY3NyLndvcmQpOworCWNzci5maWVsZC5iQmVhY29uR2VuID0gMDsKKwljc3IuZmllbGQuYlRCVFRFbmFibGUgPSAwOworCWNzci5maWVsZC5Uc2ZTeW5jTW9kZSA9IDA7CisJY3NyLmZpZWxkLmJUc2ZUaWNraW5nID0gMDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIGNzci53b3JkKTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY0VuYWJsZUJzc1N5bmMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJQkNOX1RJTUVfQ0ZHX1NUUlVDIGNzcjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tLT5Bc2ljRW5hYmxlQnNzU3luYyhJTkZSQSBtb2RlKVxuIikpOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBCQ05fVElNRV9DRkcsICZjc3Iud29yZCk7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWNzci5maWVsZC5CZWFjb25JbnRlcnZhbCA9IHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA8PCA0OyAvLyBBU0lDIHJlZ2lzdGVyIGluIHVuaXRzIG9mIDEvMTYgVFUKKwkJY3NyLmZpZWxkLmJUc2ZUaWNraW5nID0gMTsKKwkJY3NyLmZpZWxkLlRzZlN5bmNNb2RlID0gMTsgLy8gc3luYyBUU0YgaW4gSU5GUkFTVFJVQ1RVUkUgbW9kZQorCQljc3IuZmllbGQuYkJlYWNvbkdlbiAgPSAwOyAvLyBkbyBOT1QgZ2VuZXJhdGUgQkVBQ09OCisJCWNzci5maWVsZC5iVEJUVEVuYWJsZSA9IDE7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJDTl9USU1FX0NGRywgY3NyLndvcmQpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJTm90ZToKKwkJQkVBQ09OIGZyYW1lIGluIHNoYXJlZCBtZW1vcnkgc2hvdWxkIGJlIGJ1aWx0IG9rIGJlZm9yZSB0aGlzIHJvdXRpbmUKKwkJY2FuIGJlIGNhbGxlZC4gT3RoZXJ3aXNlLCBhIGdhcmJhZ2UgZnJhbWUgbWF5YmUgdHJhbnNtaXR0ZWQgb3V0IGV2ZXJ5CisJCUJlYWNvbiBwZXJpb2QuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY0VuYWJsZUlic3NTeW5jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCUJDTl9USU1FX0NGR19TVFJVQyBjc3I5OworCVBVQ0hBUgkJCXB0cjsKKwlVSU5UIGk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLS0+QXNpY0VuYWJsZUlic3NTeW5jKEFESE9DIG1vZGUuIE1QRFV0b3RhbEJ5dGVDb3VudCA9ICVkKVxuIiwgcEFkLT5CZWFjb25UeFdJLk1QRFV0b3RhbEJ5dGVDb3VudCkpOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBCQ05fVElNRV9DRkcsICZjc3I5LndvcmQpOworCWNzcjkuZmllbGQuYkJlYWNvbkdlbiA9IDA7CisJY3NyOS5maWVsZC5iVEJUVEVuYWJsZSA9IDA7CisJY3NyOS5maWVsZC5iVHNmVGlja2luZyA9IDA7CisJUlRNUF9JT19XUklURTMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCBjc3I5LndvcmQpOworCisjaWZkZWYgUlQyODYwCisJLy8gbW92ZSBCRUFDT04gVFhEIGFuZCBmcmFtZSBjb250ZW50IHRvIG9uLWNoaXAgbWVtb3J5CisJcHRyID0gKFBVQ0hBUikmcEFkLT5CZWFjb25UeFdJOworCWZvciAoaT0wOyBpPFRYV0lfU0laRTsgaSs9NCkgIC8vIDE2LWJ5dGUgVFhXSSBmaWVsZAorCXsKKwkJVUlOVDMyIGxvbmdwdHIgPSAgKnB0ciArICgqKHB0cisxKTw8OCkgKyAoKihwdHIrMik8PDE2KSArICgqKHB0ciszKTw8MjQpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIV19CRUFDT05fQkFTRTAgKyBpLCBsb25ncHRyKTsKKwkJcHRyICs9IDQ7CisJfQorCisJLy8gc3RhcnQgcmlnaHQgYWZ0ZXIgdGhlIDE2LWJ5dGUgVFhXSSBmaWVsZAorCXB0ciA9IHBBZC0+QmVhY29uQnVmOworCWZvciAoaT0wOyBpPCBwQWQtPkJlYWNvblR4V0kuTVBEVXRvdGFsQnl0ZUNvdW50OyBpKz00KQorCXsKKwkJVUlOVDMyIGxvbmdwdHIgPSAgKnB0ciArICgqKHB0cisxKTw8OCkgKyAoKihwdHIrMik8PDE2KSArICgqKHB0ciszKTw8MjQpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIV19CRUFDT05fQkFTRTAgKyBUWFdJX1NJWkUgKyBpLCBsb25ncHRyKTsKKwkJcHRyICs9NDsKKwl9CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKwkvLyBzdGFydCBzZW5kaW5nIEJFQUNPTgorCWNzcjkuZmllbGQuQmVhY29uSW50ZXJ2YWwgPSBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgNDsgLy8gQVNJQyByZWdpc3RlciBpbiB1bml0cyBvZiAxLzE2IFRVCisJY3NyOS5maWVsZC5iVHNmVGlja2luZyA9IDE7CisJY3NyOS5maWVsZC5Uc2ZTeW5jTW9kZSA9IDI7IC8vIHN5bmMgVFNGIGluIElCU1MgbW9kZQorCWNzcjkuZmllbGQuYlRCVFRFbmFibGUgPSAxOworCWNzcjkuZmllbGQuYkJlYWNvbkdlbiA9IDE7CisJUlRNUF9JT19XUklURTMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCBjc3I5LndvcmQpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBc2ljU2V0RWRjYVBhcm0oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUEVEQ0FfUEFSTQkgcEVkY2FQYXJtKQoreworCUVEQ0FfQUNfQ0ZHX1NUUlVDICAgQWMwQ2ZnLCBBYzFDZmcsIEFjMkNmZywgQWMzQ2ZnOworCUFDX1RYT1BfQ1NSMF9TVFJVQyBjc3IwOworCUFDX1RYT1BfQ1NSMV9TVFJVQyBjc3IxOworCUFJRlNOX0NTUl9TVFJVQyAgICBBaWZzbkNzcjsKKwlDV01JTl9DU1JfU1RSVUMgICAgQ3dtaW5Dc3I7CisJQ1dNQVhfQ1NSX1NUUlVDICAgIEN3bWF4Q3NyOworCWludCBpOworCisJQWMwQ2ZnLndvcmQgPSAwOworCUFjMUNmZy53b3JkID0gMDsKKwlBYzJDZmcud29yZCA9IDA7CisJQWMzQ2ZnLndvcmQgPSAwOworCWlmICgocEVkY2FQYXJtID09IE5VTEwpIHx8IChwRWRjYVBhcm0tPmJWYWxpZCA9PSBGQUxTRSkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFzaWNTZXRFZGNhUGFybVxuIikpOworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKTsKKwkJZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKKwkJeworCQkJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0NMSSB8fCBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNBcENsaSkKKwkJCQlDTElFTlRfU1RBVFVTX0NMRUFSX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV0sIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKTsKKwkJfQorCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gICAgICBNQUMgUmVnaXN0ZXIgaGFzIGEgY29weSAuCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJaWYoIHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ICkKKwkJeworCQkJLy8gRm9yIENXQyB0ZXN0LCBjaGFuZ2UgdHhvcCBmcm9tIDB4MzAgdG8gMHgyMCBpbiBUeEJ1cnN0IG1vZGUKKwkJCUFjMENmZy5maWVsZC5BY1R4b3AgPSAweDIwOyAvLyBTdWdnZXN0IGJ5IEpvaG4gZm9yIFR4QnVyc3QgaW4gSFQgTW9kZQorCQl9CisJCWVsc2UKKwkJCUFjMENmZy5maWVsZC5BY1R4b3AgPSAwOwkvLyBRSURfQUNfQkUKKwkJQWMwQ2ZnLmZpZWxkLkN3bWluID0gQ1dfTUlOX0lOX0JJVFM7CisJCUFjMENmZy5maWVsZC5Dd21heCA9IENXX01BWF9JTl9CSVRTOworCQlBYzBDZmcuZmllbGQuQWlmc24gPSAyOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIEFjMENmZy53b3JkKTsKKworCQlBYzFDZmcuZmllbGQuQWNUeG9wID0gMDsJLy8gUUlEX0FDX0JLCisJCUFjMUNmZy5maWVsZC5Dd21pbiA9IENXX01JTl9JTl9CSVRTOworCQlBYzFDZmcuZmllbGQuQ3dtYXggPSBDV19NQVhfSU5fQklUUzsKKwkJQWMxQ2ZnLmZpZWxkLkFpZnNuID0gMjsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzFfQ0ZHLCBBYzFDZmcud29yZCk7CisKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikKKwkJeworCQkJQWMyQ2ZnLmZpZWxkLkFjVHhvcCA9IDE5MjsJLy8gQUNfVkk6IDE5MiozMnVzIH49IDZtcworCQkJQWMzQ2ZnLmZpZWxkLkFjVHhvcCA9IDk2OwkvLyBBQ19WTzogOTYqMzJ1cyAgfj0gM21zCisJCX0KKwkJZWxzZQorCQl7CisJCQlBYzJDZmcuZmllbGQuQWNUeG9wID0gOTY7CS8vIEFDX1ZJOiA5NiozMnVzIH49IDNtcworCQkJQWMzQ2ZnLmZpZWxkLkFjVHhvcCA9IDQ4OwkvLyBBQ19WTzogNDgqMzJ1cyB+PSAxLjVtcworCQl9CisJCUFjMkNmZy5maWVsZC5Dd21pbiA9IENXX01JTl9JTl9CSVRTOworCQlBYzJDZmcuZmllbGQuQ3dtYXggPSBDV19NQVhfSU5fQklUUzsKKwkJQWMyQ2ZnLmZpZWxkLkFpZnNuID0gMjsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzJfQ0ZHLCBBYzJDZmcud29yZCk7CisJCUFjM0NmZy5maWVsZC5Dd21pbiA9IENXX01JTl9JTl9CSVRTOworCQlBYzNDZmcuZmllbGQuQ3dtYXggPSBDV19NQVhfSU5fQklUUzsKKwkJQWMzQ2ZnLmZpZWxkLkFpZnNuID0gMjsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzNfQ0ZHLCBBYzNDZmcud29yZCk7CisKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkvLyAgICAgIERNQSBSZWdpc3RlciBoYXMgYSBjb3B5IHRvby4KKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQljc3IwLmZpZWxkLkFjMFR4b3AgPSAwOwkJLy8gUUlEX0FDX0JFCisJCWNzcjAuZmllbGQuQWMxVHhvcCA9IDA7CQkvLyBRSURfQUNfQksKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX1RYT1AwX0NGRywgY3NyMC53b3JkKTsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikKKwkJeworCQkJY3NyMS5maWVsZC5BYzJUeG9wID0gMTkyOwkJLy8gQUNfVkk6IDE5MiozMnVzIH49IDZtcworCQkJY3NyMS5maWVsZC5BYzNUeG9wID0gOTY7CQkvLyBBQ19WTzogOTYqMzJ1cyAgfj0gM21zCisJCX0KKwkJZWxzZQorCQl7CisJCQljc3IxLmZpZWxkLkFjMlR4b3AgPSA5NjsJCS8vIEFDX1ZJOiA5NiozMnVzIH49IDNtcworCQkJY3NyMS5maWVsZC5BYzNUeG9wID0gNDg7CQkvLyBBQ19WTzogNDgqMzJ1cyB+PSAxLjVtcworCQl9CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9UWE9QMV9DRkcsIGNzcjEud29yZCk7CisKKwkJQ3dtaW5Dc3Iud29yZCA9IDA7CisJCUN3bWluQ3NyLmZpZWxkLkN3bWluMCA9IENXX01JTl9JTl9CSVRTOworCQlDd21pbkNzci5maWVsZC5Dd21pbjEgPSBDV19NSU5fSU5fQklUUzsKKwkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4yID0gQ1dfTUlOX0lOX0JJVFM7CisJCUN3bWluQ3NyLmZpZWxkLkN3bWluMyA9IENXX01JTl9JTl9CSVRTOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQ1dNSU5fQ0ZHLCBDd21pbkNzci53b3JkKTsKKworCQlDd21heENzci53b3JkID0gMDsKKwkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgwID0gQ1dfTUFYX0lOX0JJVFM7CisJCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MSA9IENXX01BWF9JTl9CSVRTOworCQlDd21heENzci5maWVsZC5Dd21heDIgPSBDV19NQVhfSU5fQklUUzsKKwkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgzID0gQ1dfTUFYX0lOX0JJVFM7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9DV01BWF9DRkcsIEN3bWF4Q3NyLndvcmQpOworCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9BSUZTTl9DRkcsIDB4MDAwMDIyMjIpOworCisJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7CisJfQorCWVsc2UKKwl7CisJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKTsKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkvLyAgICAgIE1BQyBSZWdpc3RlciBoYXMgYSBjb3B5LgorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCS8vCisJCS8vIE1vZGlmeSBDd21pbi9Dd21heC9UeG9wIG9uIHF1ZXVlW1FJRF9BQ19WSV0sIFJlY29tbWVuZCBieSBKZXJyeSAyMDA1LzA3LzI3CisJCS8vIFRvIGRlZ3JhZGUgb3VyIFZJRE8gUXVldWUncyB0aHJvdWdocHV0IGZvciBXaUZpIFdNTSBTM1QwNyBJc3N1ZS4KKwkJLy8KKwkJLy9wRWRjYVBhcm0tPlR4b3BbUUlEX0FDX1ZJXSA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfVkldICogNyAvIDEwOyAvLyBydDI4NjBjIG5lZWQgdGhpcworCisJCUFjMENmZy5maWVsZC5BY1R4b3AgPSAgcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19CRV07CisJCUFjMENmZy5maWVsZC5Dd21pbj0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfQkVdOworCQlBYzBDZmcuZmllbGQuQ3dtYXggPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19CRV07CisJCUFjMENmZy5maWVsZC5BaWZzbiA9IHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JFXTsgLy8rMTsKKworCQlBYzFDZmcuZmllbGQuQWNUeG9wID0gIHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQktdOworCQlBYzFDZmcuZmllbGQuQ3dtaW4gPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CS107IC8vKzI7CisJCUFjMUNmZy5maWVsZC5Dd21heCA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX0JLXTsKKwkJQWMxQ2ZnLmZpZWxkLkFpZnNuID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQktdOyAvLysxOworCisJCUFjMkNmZy5maWVsZC5BY1R4b3AgPSAocEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WSV0gKiA2KSAvIDEwOworCQlBYzJDZmcuZmllbGQuQ3dtaW4gPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19WSV07CisJCUFjMkNmZy5maWVsZC5Dd21heCA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZJXTsKKwkJQWMyQ2ZnLmZpZWxkLkFpZnNuID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQkvLyBUdW5pbmcgZm9yIFdpLUZpIFdNTSBTMDYKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lGaVRlc3QgJiYKKwkJCQlwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WSV0gPT0gMTApCisJCQkJQWMyQ2ZnLmZpZWxkLkFpZnNuIC09IDE7CisKKwkJCS8vIFR1bmluZyBmb3IgVEduIFdpLUZpIDUuMi4zMgorCQkJLy8gU1RBIFRlc3RCZWQgY2hhbmdlcyBpbiB0aGlzIGl0ZW06IGNvbmV4YW50IGxlZ2FjeSBzdGEgPT0+IGJyb2FkY29tIDExbiBzdGEKKwkJCWlmIChTVEFfVEdOX1dJRklfT04ocEFkKSAmJgorCQkJCXBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXSA9PSAxMCkKKwkJCXsKKwkJCQlBYzBDZmcuZmllbGQuQWlmc24gPSAzOworCQkJCUFjMkNmZy5maWVsZC5BY1R4b3AgPSA1OworCQkJfQorCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJQWMzQ2ZnLmZpZWxkLkFjVHhvcCA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfVk9dOworCQlBYzNDZmcuZmllbGQuQ3dtaW4gPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19WT107CisJCUFjM0NmZy5maWVsZC5Dd21heCA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZPXTsKKwkJQWMzQ2ZnLmZpZWxkLkFpZnNuID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVk9dOworCisvLyNpZmRlZiBXSUZJX1RFU1QKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaUZpVGVzdCkKKwkJeworCQkJaWYgKEFjM0NmZy5maWVsZC5BY1R4b3AgPT0gMTAyKQorCQkJeworCQkJQWMwQ2ZnLmZpZWxkLkFjVHhvcCA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQkVdID8gcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19CRV0gOiAxMDsKKwkJCQlBYzBDZmcuZmllbGQuQWlmc24gID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQkVdLTE7IC8qIEFJRlNOIG11c3QgPj0gMSAqLworCQkJQWMxQ2ZnLmZpZWxkLkFjVHhvcCA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQktdOworCQkJCUFjMUNmZy5maWVsZC5BaWZzbiAgPSBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CS107CisJCQlBYzJDZmcuZmllbGQuQWNUeG9wID0gcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WSV07CisJCQl9IC8qIEVuZCBvZiBpZiAqLworCQl9CisvLyNlbmRpZiAvLyBXSUZJX1RFU1QgLy8KKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIEFjMENmZy53b3JkKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzFfQ0ZHLCBBYzFDZmcud29yZCk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMyX0NGRywgQWMyQ2ZnLndvcmQpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDM19DRkcsIEFjM0NmZy53b3JkKTsKKworCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gICAgICBETUEgUmVnaXN0ZXIgaGFzIGEgY29weSB0b28uCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJY3NyMC5maWVsZC5BYzBUeG9wID0gQWMwQ2ZnLmZpZWxkLkFjVHhvcDsKKwkJY3NyMC5maWVsZC5BYzFUeG9wID0gQWMxQ2ZnLmZpZWxkLkFjVHhvcDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX1RYT1AwX0NGRywgY3NyMC53b3JkKTsKKworCQljc3IxLmZpZWxkLkFjMlR4b3AgPSBBYzJDZmcuZmllbGQuQWNUeG9wOworCQljc3IxLmZpZWxkLkFjM1R4b3AgPSBBYzNDZmcuZmllbGQuQWNUeG9wOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fVFhPUDFfQ0ZHLCBjc3IxLndvcmQpOworCisJCUN3bWluQ3NyLndvcmQgPSAwOworCQlDd21pbkNzci5maWVsZC5Dd21pbjAgPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CRV07CisJCUN3bWluQ3NyLmZpZWxkLkN3bWluMSA9IHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX0JLXTsKKwkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4yID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVkldOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4zID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVk9dIC0gMTsgLy9mb3IgVEduIHdpZmkgdGVzdAorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQ1dNSU5fQ0ZHLCBDd21pbkNzci53b3JkKTsKKworCQlDd21heENzci53b3JkID0gMDsKKwkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgwID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfQkVdOworCQlDd21heENzci5maWVsZC5Dd21heDEgPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19CS107CisJCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MiA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZJXTsKKwkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgzID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfVk9dOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQ1dNQVhfQ0ZHLCBDd21heENzci53b3JkKTsKKworCQlBaWZzbkNzci53b3JkID0gMDsKKwkJQWlmc25Dc3IuZmllbGQuQWlmc24wID0gQWMwQ2ZnLmZpZWxkLkFpZnNuOyAvL3BFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JFXTsKKwkJQWlmc25Dc3IuZmllbGQuQWlmc24xID0gQWMxQ2ZnLmZpZWxkLkFpZnNuOyAvL3BFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JLXTsKKwkJQWlmc25Dc3IuZmllbGQuQWlmc24yID0gQWMyQ2ZnLmZpZWxkLkFpZnNuOyAvL3BFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJLy8gVHVuaW5nIGZvciBXaS1GaSBXTU0gUzA2CisJCQlpZiAocEFkLT5Db21tb25DZmcuYldpRmlUZXN0ICYmCisJCQkJcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldID09IDEwKQorCQkJCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMiA9IEFjMkNmZy5maWVsZC5BaWZzbiAtIDQ7CisKKwkJCS8vIFR1bmluZyBmb3IgVEduIFdpLUZpIDUuMi4zMgorCQkJLy8gU1RBIFRlc3RCZWQgY2hhbmdlcyBpbiB0aGlzIGl0ZW06IGNvbmV4YW50IGxlZ2FjeSBzdGEgPT0+IGJyb2FkY29tIDExbiBzdGEKKwkJCWlmIChTVEFfVEdOX1dJRklfT04ocEFkKSAmJgorCQkJCXBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXSA9PSAxMCkKKwkJCXsKKwkJCQlBaWZzbkNzci5maWVsZC5BaWZzbjAgPSAzOworCQkJCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMiA9IDc7CisJCQl9CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJQWlmc25Dc3IuZmllbGQuQWlmc24zID0gQWMzQ2ZnLmZpZWxkLkFpZnNuIC0gMTsgLy9wRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WT107IC8vZm9yIFRHbiB3aWZpIHRlc3QKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX0FJRlNOX0NGRywgQWlmc25Dc3Iud29yZCk7CisKKwkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0sIHBFZGNhUGFybSwgc2l6ZW9mKEVEQ0FfUEFSTSkpOworCQlpZiAoIUFESE9DX09OKHBBZCkpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRURDQSBbIyVkXTogQUlGU04gQ1dtaW4gQ1dtYXggIFRYT1AodXMpICBBQ01cbiIsIHBFZGNhUGFybS0+RWRjYVVwZGF0ZUNvdW50KSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiAgICAgQUNfQkUgICAgICAlMmQgICAgICUyZCAgICAgJTJkICAgICAgJTRkICAgICAlZFxuIiwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPkFpZnNuWzBdLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+Q3dtaW5bMF0sCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21heFswXSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPlR4b3BbMF08PDUsCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5iQUNNWzBdKSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiAgICAgQUNfQksgICAgICAlMmQgICAgICUyZCAgICAgJTJkICAgICAgJTRkICAgICAlZFxuIiwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPkFpZnNuWzFdLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+Q3dtaW5bMV0sCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21heFsxXSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPlR4b3BbMV08PDUsCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5iQUNNWzFdKSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiAgICAgQUNfVkkgICAgICAlMmQgICAgICUyZCAgICAgJTJkICAgICAgJTRkICAgICAlZFxuIiwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPkFpZnNuWzJdLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+Q3dtaW5bMl0sCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21heFsyXSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPlR4b3BbMl08PDUsCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5iQUNNWzJdKSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiAgICAgQUNfVk8gICAgICAlMmQgICAgICUyZCAgICAgJTJkICAgICAgJTRkICAgICAlZFxuIiwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPkFpZnNuWzNdLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+Q3dtaW5bM10sCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21heFszXSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPlR4b3BbM108PDUsCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5iQUNNWzNdKSk7CisJCX0KKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIAlBc2ljU2V0U2xvdFRpbWUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gQk9PTEVBTiBiVXNlU2hvcnRTbG90VGltZSkKK3sKKwlVTE9ORwlTbG90VGltZTsKKwlVSU5UMzIJUmVnVmFsdWUgPSAwOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKKwkJYlVzZVNob3J0U2xvdFRpbWUgPSBUUlVFOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJaWYgKGJVc2VTaG9ydFNsb3RUaW1lKQorCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfU0xPVF9JTlVTRUQpOworCWVsc2UKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfU0xPVF9JTlVTRUQpOworCisJU2xvdFRpbWUgPSAoYlVzZVNob3J0U2xvdFRpbWUpPyA5IDogMjA7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJLy8gZm9yY2UgdXNpbmcgc2hvcnQgU0xPVCB0aW1lIGZvciBGQUUgdG8gZGVtbyBwZXJmb3JtYW5jZSB3aGVuIFR4QnVyc3QgaXMgT04KKwkJaWYgKCgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gRkFMU0UpICYmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpKSkKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCXx8ICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gVFJVRSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPT0gQkFfTk9UVVNFKSkKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCSkKKwkJeworCQkJLy8gSW4gdGhpcyBjYXNlLCB3ZSB3aWxsIHRoaW5rIGl0IGlzIGRvaW5nIFdpLUZpIHRlc3QKKwkJCS8vIEFuZCB3ZSB3aWxsIG5vdCBzZXQgdG8gc2hvcnQgc2xvdCB3aGVuIGJFbmFibGVUeEJ1cnN0IGlzIFRSVUUuCisJCX0KKwkJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QpCisJCQlTbG90VGltZSA9IDk7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8KKwkvLyBGb3Igc29tZSByZWFzb25zLCBhbHdheXMgc2V0IGl0IHRvIHNob3J0IHNsb3QgdGltZS4KKwkvLworCS8vIFRvRG86IFNob3VsZCBjb25zaWRlciBjYXBhYmlsaXR5IHdpdGggMTFCCisJLy8KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJaWYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKQorCQkJU2xvdFRpbWUgPSAyMDsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIEJLT0ZGX1NMT1RfQ0ZHLCAmUmVnVmFsdWUpOworCVJlZ1ZhbHVlID0gUmVnVmFsdWUgJiAweEZGRkZGRjAwOworCisJUmVnVmFsdWUgfD0gU2xvdFRpbWU7CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBCS09GRl9TTE9UX0NGRywgUmVnVmFsdWUpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlBZGQgU2hhcmVkIGtleSBpbmZvcm1hdGlvbiBpbnRvIEFTSUMuCisJCVVwZGF0ZSBzaGFyZWQga2V5LCBUeE1pYyBhbmQgUnhNaWMgdG8gQXNpYyBTaGFyZWQga2V5IHRhYmxlCisJCVVwZGF0ZSBpdHMgY2lwaGVyQWxnIHRvIEFzaWMgU2hhcmVkIGtleSBNb2RlLgorCisgICAgUmV0dXJuOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQXNpY0FkZFNoYXJlZEtleUVudHJ5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSCQkgQnNzSW5kZXgsCisJSU4gVUNIQVIJCSBLZXlJZHgsCisJSU4gVUNIQVIJCSBDaXBoZXJBbGcsCisJSU4gUFVDSEFSCQkgcEtleSwKKwlJTiBQVUNIQVIJCSBwVHhNaWMsCisJSU4gUFVDSEFSCQkgcFJ4TWljKQoreworCVVMT05HIG9mZnNldDsgLy8sIGNzcjA7CisJU0hBUkVES0VZX01PREVfU1RSVUMgY3NyMTsKKyNpZmRlZiBSVDI4NjAKKwlJTlQgICBpOworI2VuZGlmIC8vIFJUMjg2MCAvLworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY0FkZFNoYXJlZEtleUVudHJ5IEJzc0luZGV4PSVkLCBLZXlJZHg9JWRcbiIsIEJzc0luZGV4LEtleUlkeCkpOworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBc2ljQWRkU2hhcmVkS2V5RW50cnk6ICVzIGtleSAjJWRcbiIsIENpcGhlck5hbWVbQ2lwaGVyQWxnXSwgQnNzSW5kZXgqNCArIEtleUlkeCkpOworCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIgCUtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCXBLZXlbMF0scEtleVsxXSxwS2V5WzJdLHBLZXlbM10scEtleVs0XSxwS2V5WzVdLHBLZXlbNl0scEtleVs3XSxwS2V5WzhdLHBLZXlbOV0scEtleVsxMF0scEtleVsxMV0scEtleVsxMl0scEtleVsxM10scEtleVsxNF0scEtleVsxNV0pKTsKKwlpZiAocFJ4TWljKQorCXsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiAJUnggTUlDIEtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCXBSeE1pY1swXSxwUnhNaWNbMV0scFJ4TWljWzJdLHBSeE1pY1szXSxwUnhNaWNbNF0scFJ4TWljWzVdLHBSeE1pY1s2XSxwUnhNaWNbN10pKTsKKwl9CisJaWYgKHBUeE1pYykKKwl7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIgCVR4IE1JQyBLZXkgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQlwVHhNaWNbMF0scFR4TWljWzFdLHBUeE1pY1syXSxwVHhNaWNbM10scFR4TWljWzRdLHBUeE1pY1s1XSxwVHhNaWNbNl0scFR4TWljWzddKSk7CisJfQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vCisJLy8gZmlsbCBrZXkgbWF0ZXJpYWwgLSBrZXkgKyBUWCBNSUMgKyBSWCBNSUMKKwkvLworI2lmZGVmIFJUMjg2MAorCW9mZnNldCA9IFNIQVJFRF9LRVlfVEFCTEVfQkFTRSArICg0KkJzc0luZGV4ICsgS2V5SWR4KSpIV19LRVlfRU5UUllfU0laRTsKKwlmb3IgKGk9MDsgaTxNQVhfTEVOX09GX1NIQVJFX0tFWTsgaSsrKQorCXsKKwkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwS2V5W2ldKTsKKwl9CisKKwlvZmZzZXQgKz0gTUFYX0xFTl9PRl9TSEFSRV9LRVk7CisJaWYgKHBUeE1pYykKKwl7CisJCWZvciAoaT0wOyBpPDg7IGkrKykKKwkJeworCQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwVHhNaWNbaV0pOworCQl9CisJfQorCisJb2Zmc2V0ICs9IDg7CisJaWYgKHBSeE1pYykKKwl7CisJCWZvciAoaT0wOyBpPDg7IGkrKykKKwkJeworCQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwUnhNaWNbaV0pOworCQl9CisJfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisKKwkvLworCS8vIFVwZGF0ZSBjaXBoZXIgYWxnb3JpdGhtLiBXU1RBIGFsd2F5cyB1c2UgQlNTMAorCS8vCisJUlRNUF9JT19SRUFEMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSs0KihCc3NJbmRleC8yKSwgJmNzcjEud29yZCk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSZWFkOiBTSEFSRURfS0VZX01PREVfQkFTRSBhdCB0aGlzIEJzc1slZF0gS2V5SWR4WyVkXT0gMHgleCBcbiIsIEJzc0luZGV4LEtleUlkeCwgY3NyMS53b3JkKSk7CisJaWYgKChCc3NJbmRleCUyKSA9PSAwKQorCXsKKwkJaWYgKEtleUlkeCA9PSAwKQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCisJCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQllbHNlIGlmIChLZXlJZHggPT0gMikKKwkJCWNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCWVsc2UKKwkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJfQorCWVsc2UKKwl7CisJCWlmIChLZXlJZHggPT0gMCkKKwkJCWNzcjEuZmllbGQuQnNzMUtleTBDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCWVsc2UgaWYgKEtleUlkeCA9PSAxKQorCQkJY3NyMS5maWVsZC5Cc3MxS2V5MUNpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJZWxzZSBpZiAoS2V5SWR4ID09IDIpCisJCQljc3IxLmZpZWxkLkJzczFLZXkyQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQllbHNlCisJCQljc3IxLmZpZWxkLkJzczFLZXkzQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCX0KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIldyaXRlOiBTSEFSRURfS0VZX01PREVfQkFTRSBhdCB0aGlzIEJzc1slZF0gPSAweCV4IFxuIiwgQnNzSW5kZXgsIGNzcjEud29yZCkpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFKzQqKEJzc0luZGV4LzIpLCBjc3IxLndvcmQpOworCit9CisKKy8vCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRCBBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIJCSBCc3NJbmRleCwKKwlJTiBVQ0hBUgkJIEtleUlkeCkKK3sKKwkvL1VMT05HIFNlY0NzcjA7CisJU0hBUkVES0VZX01PREVfU1RSVUMgY3NyMTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5OiAjJWQgXG4iLCBCc3NJbmRleCo0ICsgS2V5SWR4KSk7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFKzQqKEJzc0luZGV4LzIpLCAmY3NyMS53b3JkKTsKKwlpZiAoKEJzc0luZGV4JTIpID09IDApCisJeworCQlpZiAoS2V5SWR4ID09IDApCisJCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gMDsKKwkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCisJCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gMDsKKwkJZWxzZSBpZiAoS2V5SWR4ID09IDIpCisJCQljc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID0gMDsKKwkJZWxzZQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9IDA7CisJfQorCWVsc2UKKwl7CisJCWlmIChLZXlJZHggPT0gMCkKKwkJCWNzcjEuZmllbGQuQnNzMUtleTBDaXBoZXJBbGcgPSAwOworCQllbHNlIGlmIChLZXlJZHggPT0gMSkKKwkJCWNzcjEuZmllbGQuQnNzMUtleTFDaXBoZXJBbGcgPSAwOworCQllbHNlIGlmIChLZXlJZHggPT0gMikKKwkJCWNzcjEuZmllbGQuQnNzMUtleTJDaXBoZXJBbGcgPSAwOworCQllbHNlCisJCQljc3IxLmZpZWxkLkJzczFLZXkzQ2lwaGVyQWxnID0gMDsKKwl9CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJXcml0ZTogU0hBUkVEX0tFWV9NT0RFX0JBU0UgYXQgdGhpcyBCc3NbJWRdID0gMHgleCBcbiIsIEJzc0luZGV4LCBjc3IxLndvcmQpKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSs0KihCc3NJbmRleC8yKSwgY3NyMS53b3JkKTsKKwlBU1NFUlQoQnNzSW5kZXggPCA0KTsKKwlBU1NFUlQoS2V5SWR4IDwgNCk7CisKK30KKworCitWT0lEIEFzaWNVcGRhdGVXQ0lEQXR0cmlidXRlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVAkJV0NJRCwKKwlJTiBVQ0hBUgkJQnNzSW5kZXgsCisJSU4gVUNIQVIgICAgICAgIENpcGhlckFsZywKKwlJTiBCT09MRUFOCQliVXNlUGFpcmV3aXNlS2V5VGFibGUpCit7CisJVUxPTkcgICBXQ0lEQXR0cmkgPSAwLCBvZmZzZXQ7CisKKwkvLworCS8vIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZS4KKwkvLyBPbmx5IFR4S2V5IGNvdWxkIHVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZS4KKwkvLworCW9mZnNldCA9IE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsgKFdDSUQgKiBIV19XQ0lEX0FUVFJJX1NJWkUpOworCVdDSURBdHRyaSA9IChCc3NJbmRleCA8PCA0KSB8IChDaXBoZXJBbGcgPDwgMSkgfCAoYlVzZVBhaXJld2lzZUtleVRhYmxlKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIFdDSURBdHRyaSk7Cit9CisKK1ZPSUQgQXNpY1VwZGF0ZVdDSURJVkVJVigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQJCVdDSUQsCisJSU4gVUxPTkcgICAgICAgIHVJViwKKwlJTiBVTE9ORyAgICAgICAgdUVJVikKK3sKKwlVTE9ORwlvZmZzZXQ7CisKKwlvZmZzZXQgPSBNQUNfSVZFSVZfVEFCTEVfQkFTRSArIChXQ0lEICogSFdfSVZFSVZfRU5UUllfU0laRSk7CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIHVJVik7CisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0ICsgNCwgdUVJVik7Cit9CisKK1ZPSUQgQXNpY1VwZGF0ZVJ4V0NJRFRhYmxlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVAkJV0NJRCwKKwlJTiBQVUNIQVIgICAgICAgIHBBZGRyKQoreworCVVMT05HIG9mZnNldDsKKwlVTE9ORyBBZGRyOworCisJb2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArIChXQ0lEICogSFdfV0NJRF9FTlRSWV9TSVpFKTsKKwlBZGRyID0gcEFkZHJbMF0gKyAocEFkZHJbMV0gPDwgOCkgKyhwQWRkclsyXSA8PCAxNikgKyhwQWRkclszXSA8PCAyNCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBBZGRyKTsKKwlBZGRyID0gcEFkZHJbNF0gKyAocEFkZHJbNV0gPDwgOCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0ICsgNCwgQWRkcik7Cit9CisKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBDaXBoZXIgS2V5LCBDaXBoZXIgYWxnb3JpdGhtLCBJVi9FSVYgdG8gQXNpYworCisgICAgQXJndW1lbnRzOgorICAgICAgICBwQWQgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgICAgIFdDSUQgICAgICAgICAgICAgICAgICAgIFdDSUQgRW50cnkgbnVtYmVyLgorICAgICAgICBCc3NJbmRleCAgICAgICAgICAgICAgICBCU1NJRCBpbmRleCwgc3RhdGlvbiBvciBub25lIG11bHRpcGxlIEJTU0lEIHN1cHBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyB2YWx1ZSBzaG91bGQgYmUgMC4KKyAgICAgICAgS2V5SWR4ICAgICAgICAgICAgICAgICAgVGhpcyBLZXlJZHggd2lsbCBzZXQgdG8gSVYncyBLZXlJRCBpZiBiVHhLZXkgZW5hYmxlZAorICAgICAgICBwQ2lwaGVyS2V5ICAgICAgICAgICAgICBQb2ludGVyIHRvIENpcGhlciBLZXkuCisgICAgICAgIGJVc2VQYWlyZXdpc2VLZXlUYWJsZSAgIFRSVUUgbWVhbnMgc2F2ZWQgdGhlIGtleSBpbiBTaGFyZWRLZXkgdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSBQYWlyZXdpc2VLZXkgdGFibGUKKyAgICAgICAgYlR4S2V5ICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgdHJhbnNtaXQga2V5IGlmIGVuYWJsZWQuCisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIE5vbmUKKworICAgIE5vdGU6CisgICAgICAgIFRoaXMgcm91dGluZSB3aWxsIHNldCB0aGUgcmVsYXRpdmUga2V5IHN0dWZmIHRvIEFzaWMgaW5jbHVkaW5nIFdDSUQgYXR0cmlidXRlLAorICAgICAgICBDaXBoZXIgS2V5LCBDaXBoZXIgYWxnb3JpdGhtIGFuZCBJVi9FSVYuCisKKyAgICAgICAgSVYvRUlWIHdpbGwgYmUgdXBkYXRlIGlmIHRoaXMgQ2lwaGVyS2V5IGlzIHRoZSB0cmFuc21pc3Npb24ga2V5IGJlY2F1c2UKKyAgICAgICAgQVNJQyB3aWxsIGJhc2Ugb24gSVYncyBLZXlJRCB2YWx1ZSB0byBzZWxlY3QgQ2lwaGVyIEtleS4KKworICAgICAgICBJZiBiVHhLZXkgc2V0cyB0byBGQUxTRSwgdGhpcyBpcyBub3QgdGhlIFRYIGtleSwgYnV0IGl0IGNvdWxkIGJlCisgICAgICAgIFJYIGtleQorCisgICAgCUZvciBBUCBtb2RlIGJUeEtleSBtdXN0IGJlIGFsd2F5cyBzZXQgdG8gVFJVRS4KKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEFzaWNBZGRLZXlFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQJCVdDSUQsCisJSU4gVUNIQVIJCUJzc0luZGV4LAorCUlOIFVDSEFSCQlLZXlJZHgsCisJSU4gUENJUEhFUl9LRVkJcENpcGhlcktleSwKKwlJTiBCT09MRUFOCQliVXNlUGFpcmV3aXNlS2V5VGFibGUsCisJSU4gQk9PTEVBTgkJYlR4S2V5KQoreworCVVMT05HCW9mZnNldDsKKwlVQ0hBUglJVjQgPSAwOworCVBVQ0hBUgkJcEtleSA9IHBDaXBoZXJLZXktPktleTsKKwlQVUNIQVIJCXBUeE1pYyA9IHBDaXBoZXJLZXktPlR4TWljOworCVBVQ0hBUgkJcFJ4TWljID0gcENpcGhlcktleS0+UnhNaWM7CisJUFVDSEFSCQlwVHh0c2MgPSBwQ2lwaGVyS2V5LT5UeFRzYzsKKwlVQ0hBUgkJQ2lwaGVyQWxnID0gcENpcGhlcktleS0+Q2lwaGVyQWxnOworCVNIQVJFREtFWV9NT0RFX1NUUlVDIGNzcjE7CisjaWZkZWYgUlQyODYwCisJVUNIQVIJCWk7CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gQXNpY0FkZEtleUVudHJ5XG4iKSk7CisJLy8KKwkvLyAxLikgZGVjaWRlIGtleSB0YWJsZSBvZmZzZXQKKwkvLworCWlmIChiVXNlUGFpcmV3aXNlS2V5VGFibGUpCisJCW9mZnNldCA9IFBBSVJXSVNFX0tFWV9UQUJMRV9CQVNFICsgKFdDSUQgKiBIV19LRVlfRU5UUllfU0laRSk7CisJZWxzZQorCQlvZmZzZXQgPSBTSEFSRURfS0VZX1RBQkxFX0JBU0UgKyAoNCAqIEJzc0luZGV4ICsgS2V5SWR4KSAqIEhXX0tFWV9FTlRSWV9TSVpFOworCisJLy8KKwkvLyAyLikgU2V0IEtleSB0byBBc2ljCisJLy8KKwkvL2ZvciAoaSA9IDA7IGkgPCBLZXlMZW47IGkrKykKKyNpZmRlZiBSVDI4NjAKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9QRUVSX0tFWTsgaSsrKQorCXsKKwkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwS2V5W2ldKTsKKwl9CisJb2Zmc2V0ICs9IE1BWF9MRU5fT0ZfUEVFUl9LRVk7CisKKwkvLworCS8vIDMuKSBTZXQgTUlDIGtleSBpZiBhdmFpbGFibGUKKwkvLworCWlmIChwVHhNaWMpCisJeworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQl7CisJCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIGksIHBUeE1pY1tpXSk7CisJCX0KKwl9CisJb2Zmc2V0ICs9IExFTl9US0lQX1RYTUlDSzsKKworCWlmIChwUnhNaWMpCisJeworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQl7CisJCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIGksIHBSeE1pY1tpXSk7CisJCX0KKwl9CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKworCS8vCisJLy8gNC4pIE1vZGlmeSBJVi9FSVYgaWYgbmVlZHMKKwkvLyAgICAgVGhpcyB3aWxsIGZvcmNlIEFzaWMgdG8gdXNlIHRoaXMga2V5IElEIGJ5IHNldHRpbmcgSVYuCisJLy8KKwlpZiAoYlR4S2V5KQorCXsKKyNpZmRlZiBSVDI4NjAKKwkJb2Zmc2V0ID0gTUFDX0lWRUlWX1RBQkxFX0JBU0UgKyAoV0NJRCAqIEhXX0lWRUlWX0VOVFJZX1NJWkUpOworCQkvLworCQkvLyBXcml0ZSBJVgorCQkvLworCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCwgcFR4dHNjWzFdKTsKKwkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyAxLCAoKHBUeHRzY1sxXSB8IDB4MjApICYgMHg3ZikpOworCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIDIsIHBUeHRzY1swXSk7CisKKwkJSVY0ID0gKEtleUlkeCA8PCA2KTsKKwkJaWYgKChDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApIHx8IChDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVBfTk9fTUlDKSB8fChDaXBoZXJBbGcgPT0gQ0lQSEVSX0FFUykpCisJCQlJVjQgfD0gMHgyMDsgIC8vIHR1cm4gb24gZXh0ZW5zaW9uIGJpdCBtZWFucyBFSVYgZXhpc3RlbmNlCisKKwkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyAzLCBJVjQpOworCisJCS8vCisJCS8vIFdyaXRlIEVJVgorCQkvLworCQlvZmZzZXQgKz0gNDsKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJeworCQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwVHh0c2NbaSArIDJdKTsKKwkJfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisJCUFzaWNVcGRhdGVXQ0lEQXR0cmlidXRlKHBBZCwgV0NJRCwgQnNzSW5kZXgsIENpcGhlckFsZywgYlVzZVBhaXJld2lzZUtleVRhYmxlKTsKKwl9CisKKwlpZiAoIWJVc2VQYWlyZXdpc2VLZXlUYWJsZSkKKwl7CisJCS8vCisJCS8vIE9ubHkgdXBkYXRlIHRoZSBzaGFyZWQga2V5IHNlY3VyaXR5IG1vZGUKKwkJLy8KKwkJUlRNUF9JT19SRUFEMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSArIDQgKiAoQnNzSW5kZXggLyAyKSwgJmNzcjEud29yZCk7CisJCWlmICgoQnNzSW5kZXggJSAyKSA9PSAwKQorCQl7CisJCQlpZiAoS2V5SWR4ID09IDApCisJCQkJY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJCWVsc2UgaWYgKEtleUlkeCA9PSAxKQorCQkJCWNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCQllbHNlIGlmIChLZXlJZHggPT0gMikKKwkJCQljc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQkJZWxzZQorCQkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoS2V5SWR4ID09IDApCisJCQkJY3NyMS5maWVsZC5Cc3MxS2V5MENpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJCWVsc2UgaWYgKEtleUlkeCA9PSAxKQorCQkJCWNzcjEuZmllbGQuQnNzMUtleTFDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCQllbHNlIGlmIChLZXlJZHggPT0gMikKKwkJCQljc3IxLmZpZWxkLkJzczFLZXkyQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQkJZWxzZQorCQkJCWNzcjEuZmllbGQuQnNzMUtleTNDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCX0KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UgKyA0ICogKEJzc0luZGV4IC8gMiksIGNzcjEud29yZCk7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IEFzaWNBZGRLZXlFbnRyeVxuIikpOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUFkZCBQYWlyLXdpc2Uga2V5IG1hdGVyaWFsIGludG8gQVNJQy4KKwkJVXBkYXRlIHBhaXJ3aXNlIGtleSwgVHhNaWMgYW5kIFJ4TWljIHRvIEFzaWMgUGFpci13aXNlIGtleSB0YWJsZQorCisgICAgUmV0dXJuOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQXNpY0FkZFBhaXJ3aXNlS2V5RW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSICAgICAgICBwQWRkciwKKwlJTiBVQ0hBUgkJV0NJRCwKKwlJTiBDSVBIRVJfS0VZCQkgKnBDaXBoZXJLZXkpCit7CisJSU5UIGk7CisJVUxPTkcgCQlvZmZzZXQ7CisJUFVDSEFSCQkgcEtleSA9IHBDaXBoZXJLZXktPktleTsKKwlQVUNIQVIJCSBwVHhNaWMgPSBwQ2lwaGVyS2V5LT5UeE1pYzsKKwlQVUNIQVIJCSBwUnhNaWMgPSBwQ2lwaGVyS2V5LT5SeE1pYzsKKyNpZmRlZiBEQkcKKwlVQ0hBUgkJQ2lwaGVyQWxnID0gcENpcGhlcktleS0+Q2lwaGVyQWxnOworI2VuZGlmIC8vIERCRyAvLworCisJLy8gRUtFWQorCW9mZnNldCA9IFBBSVJXSVNFX0tFWV9UQUJMRV9CQVNFICsgKFdDSUQgKiBIV19LRVlfRU5UUllfU0laRSk7CisjaWZkZWYgUlQyODYwCisJZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9QRUVSX0tFWTsgaSsrKQorCXsKKwkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwS2V5W2ldKTsKKwl9CisjZW5kaWYgLy8gUlQyODYwIC8vCisJZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9QRUVSX0tFWTsgaSs9NCkKKwl7CisJCVVJTlQzMiBWYWx1ZTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBvZmZzZXQgKyBpLCAmVmFsdWUpOworCX0KKworCW9mZnNldCArPSBNQVhfTEVOX09GX1BFRVJfS0VZOworCisJLy8gIE1JQyBLRVkKKwlpZiAocFR4TWljKQorCXsKKyNpZmRlZiBSVDI4NjAKKwkJZm9yIChpPTA7IGk8ODsgaSsrKQorCQl7CisJCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCtpLCBwVHhNaWNbaV0pOworCQl9CisjZW5kaWYgLy8gUlQyODYwIC8vCisJfQorCW9mZnNldCArPSA4OworCWlmIChwUnhNaWMpCisJeworI2lmZGVmIFJUMjg2MAorCQlmb3IgKGk9MDsgaTw4OyBpKyspCisJCXsKKwkJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0K2ksIHBSeE1pY1tpXSk7CisJCX0KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFzaWNBZGRQYWlyd2lzZUtleUVudHJ5OiBXQ0lEICMlZCBBbGc9JXNcbiIsV0NJRCwgQ2lwaGVyTmFtZVtDaXBoZXJBbGddKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIJS2V5ID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJcEtleVswXSxwS2V5WzFdLHBLZXlbMl0scEtleVszXSxwS2V5WzRdLHBLZXlbNV0scEtleVs2XSxwS2V5WzddLHBLZXlbOF0scEtleVs5XSxwS2V5WzEwXSxwS2V5WzExXSxwS2V5WzEyXSxwS2V5WzEzXSxwS2V5WzE0XSxwS2V5WzE1XSkpOworCWlmIChwUnhNaWMpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIJUnggTUlDIEtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCXBSeE1pY1swXSxwUnhNaWNbMV0scFJ4TWljWzJdLHBSeE1pY1szXSxwUnhNaWNbNF0scFJ4TWljWzVdLHBSeE1pY1s2XSxwUnhNaWNbN10pKTsKKwl9CisJaWYgKHBUeE1pYykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIglUeCBNSUMgS2V5ID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJcFR4TWljWzBdLHBUeE1pY1sxXSxwVHhNaWNbMl0scFR4TWljWzNdLHBUeE1pY1s0XSxwVHhNaWNbNV0scFR4TWljWzZdLHBUeE1pY1s3XSkpOworCX0KK30KKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVJlbW92ZSBQYWlyLXdpc2Uga2V5IG1hdGVyaWFsIGZyb20gQVNJQy4KKworICAgIFJldHVybjoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSCQkgQnNzSWR4LAorCUlOIFVDSEFSCQkgV2NpZCkKK3sKKwlVTE9ORwkJV0NJREF0dHJpOworCVVTSE9SVAkJb2Zmc2V0OworCisJLy8gcmUtc2V0IHRoZSBlbnRyeSdzIFdDSUQgYXR0cmlidXRlIGFzIE9QRU4tTk9ORS4KKwlvZmZzZXQgPSBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSArIChXY2lkICogSFdfV0NJRF9BVFRSSV9TSVpFKTsKKwlXQ0lEQXR0cmkgPSAoQnNzSWR4PDw0KSB8IFBBSVJXSVNFS0VZVEFCTEU7CisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBXQ0lEQXR0cmkpOworfQorCitCT09MRUFOIEFzaWNTZW5kQ29tbWFuZFRvTWN1KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSCQkgQ29tbWFuZCwKKwlJTiBVQ0hBUgkJIFRva2VuLAorCUlOIFVDSEFSCQkgQXJnMCwKKwlJTiBVQ0hBUgkJIEFyZzEpCit7CisJSE9TVF9DTURfQ1NSX1NUUlVDCUgyTUNtZDsKKwlIMk1fTUFJTEJPWF9TVFJVQwlIMk1NYWlsYm94OworCVVMT05HCQkJCWkgPSAwOworI2lmZGVmIFJUMjg2MAorI2lmZGVmIFJBTElOS19BVEUKKwlzdGF0aWMgVUlOVDMyIGogPSAwOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwlkbworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBIMk1fTUFJTEJPWF9DU1IsICZIMk1NYWlsYm94LndvcmQpOworCQlpZiAoSDJNTWFpbGJveC5maWVsZC5Pd25lciA9PSAwKQorCQkJYnJlYWs7CisKKwkJUlRNUHVzZWNEZWxheSgyKTsKKwl9IHdoaWxlKGkrKyA8IDEwMCk7CisKKwlpZiAoaSA+PSAxMDApCisJeworI2lmZGVmIFJUMjg2MAorI2lmZGVmIFJBTElOS19BVEUKKwkJaWYgKHBBZC0+YXRlLmJGV0xvYWRpbmcgPT0gVFJVRSkKKwkJeworCQkJLyogcmVsb2FkaW5nIGZpcm13YXJlIHdoZW4gcmVjZWl2ZWQgaXdwcml2IGNtZCAiQVRFPUFURVNUT1AiICovCisJCQlpZiAoaiA+IDApCisJCQl7CisJCQkJaWYgKGogJSA2NCAhPSAwKQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiIyIpKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiXG4iKSk7CisJCQkJfQorCQkJCSsrajsKKwkJCX0KKwkJCWVsc2UgaWYgKGogPT0gMCkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJMb2FkaW5nIGZpcm13YXJlLiBQbGVhc2Ugd2FpdCBmb3IgYSBtb21lbnQuLi5cbiIpKTsKKwkJCQkrK2o7CisJCQl9CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwkJeworCQlEQkdQUklOVF9FUlIoKCJIMk1fTUFJTEJPWCBzdGlsbCBob2xkIGJ5IE1DVS4gY29tbWFuZCBmYWlsXG4iKSk7CisJCX0KKwkJcmV0dXJuIEZBTFNFOworCX0KKworI2lmZGVmIFJUMjg2MAorI2lmZGVmIFJBTElOS19BVEUKKwllbHNlIGlmIChwQWQtPmF0ZS5iRldMb2FkaW5nID09IFRSVUUpCisJeworCQkvKiByZWxvYWRpbmcgb2YgZmlybXdhcmUgaXMgY29tcGxldGVkICovCisJCXBBZC0+YXRlLmJGV0xvYWRpbmcgPSBGQUxTRTsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiXG4iKSk7CisJCWogPSAwOworCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisjZW5kaWYgLy8gUlQyODYwIC8vCisKKwlIMk1NYWlsYm94LmZpZWxkLk93bmVyCSAgPSAxOwkgICAvLyBwYXNzIG93bmVyc2hpcCB0byBNQ1UKKwlIMk1NYWlsYm94LmZpZWxkLkNtZFRva2VuID0gVG9rZW47CisJSDJNTWFpbGJveC5maWVsZC5IaWdoQnl0ZSA9IEFyZzE7CisJSDJNTWFpbGJveC5maWVsZC5Mb3dCeXRlICA9IEFyZzA7CisJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX01BSUxCT1hfQ1NSLCBIMk1NYWlsYm94LndvcmQpOworCisJSDJNQ21kLndvcmQgCQkJICA9IDA7CisJSDJNQ21kLmZpZWxkLkhvc3RDb21tYW5kICA9IENvbW1hbmQ7CisJUlRNUF9JT19XUklURTMyKHBBZCwgSE9TVF9DTURfQ1NSLCBIMk1DbWQud29yZCk7CisKKwlpZiAoQ29tbWFuZCAhPSAweDgwKQorCXsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworI2lmZGVmIFJUMjg2MAorQk9PTEVBTiBBc2ljQ2hlY2tDb21tYW5PaygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUgkJIENvbW1hbmQpCit7CisJVUlOVDMyCUNtZFN0YXR1cyA9IDAsIENJRCA9IDAsIGk7CisJVUlOVDMyCVRoaXNDSURNYXNrID0gMDsKKworCWkgPSAwOworCWRvCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIEgyTV9NQUlMQk9YX0NJRCwgJkNJRCk7CisJCS8vIEZpbmQgd2hlcmUgdGhlIGNvbW1hbmQgaXMuIEJlY2F1c2UgdGhpcyBpcyByYW5kb21seSBzcGVjaWZpZWQgYnkgZmlybXdhcmUuCisJCWlmICgoQ0lEICYgQ0lEME1BU0spID09IENvbW1hbmQpCisJCXsKKwkJCVRoaXNDSURNYXNrID0gQ0lEME1BU0s7CisJCQlicmVhazsKKwkJfQorCQllbHNlIGlmICgoKChDSUQgJiBDSUQxTUFTSyk+PjgpICYgMHhmZikgPT0gQ29tbWFuZCkKKwkJeworCQkJVGhpc0NJRE1hc2sgPSBDSUQxTUFTSzsKKwkJCWJyZWFrOworCQl9CisJCWVsc2UgaWYgKCgoKENJRCAmIENJRDJNQVNLKT4+MTYpICYgMHhmZikgPT0gQ29tbWFuZCkKKwkJeworCQkJVGhpc0NJRE1hc2sgPSBDSUQyTUFTSzsKKwkJCWJyZWFrOworCQl9CisJCWVsc2UgaWYgKCgoKENJRCAmIENJRDNNQVNLKT4+MjQpICYgMHhmZikgPT0gQ29tbWFuZCkKKwkJeworCQkJVGhpc0NJRE1hc2sgPSBDSUQzTUFTSzsKKwkJCWJyZWFrOworCQl9CisKKwkJUlRNUHVzZWNEZWxheSgxMDApOworCQlpKys7CisJfXdoaWxlIChpIDwgMjAwKTsKKworCS8vIEdldCBDb21tYW5kU3RhdHVzIFZhbHVlCisJUlRNUF9JT19SRUFEMzIocEFkLCBIMk1fTUFJTEJPWF9TVEFUVVMsICZDbWRTdGF0dXMpOworCisJLy8gVGhpcyBjb21tYW5kJ3Mgc3RhdHVzIGlzIGF0IHRoZSBzYW1lIHBvc2l0aW9uIGFzIGNvbW1hbmQuIFNvIEFORCBjb21tYW5kIHBvc2l0aW9uJ3MgYml0bWFzayB0byByZWFkIHN0YXR1cy4KKwlpZiAoaSA8IDIwMCkKKwl7CisJCS8vIElmIFN0YXR1cyBpcyAxLCB0aGUgY29tYW1uZCBpcyBzdWNjZXNzLgorCQlpZiAoKChDbWRTdGF0dXMgJiBUaGlzQ0lETWFzaykgPT0gMHgxKSB8fCAoKENtZFN0YXR1cyAmIFRoaXNDSURNYXNrKSA9PSAweDEwMCkKKwkJCXx8ICgoQ21kU3RhdHVzICYgVGhpc0NJRE1hc2spID09IDB4MTAwMDApIHx8ICgoQ21kU3RhdHVzICYgVGhpc0NJRE1hc2spID09IDB4MTAwMDAwMCkpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBBc2ljQ2hlY2tDb21tYW5PayBDSUQgPSAweCV4LCBDbWRTdGF0dXM9IDB4JXggXG4iLCBDSUQsIENtZFN0YXR1cykpOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX01BSUxCT1hfU1RBVFVTLCAweGZmZmZmZmZmKTsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX0NJRCwgMHhmZmZmZmZmZik7CisJCQlyZXR1cm4gVFJVRTsKKwkJfQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gQXNpY0NoZWNrQ29tbWFuRmFpbDEgQ0lEID0gMHgleCwgQ21kU3RhdHVzPSAweCV4IFxuIiwgQ0lELCBDbWRTdGF0dXMpKTsKKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IEFzaWNDaGVja0NvbW1hbkZhaWwyIFRpbWVvdXQgQ29tbWFuZCA9ICVkLCBDbWRTdGF0dXM9IDB4JXggXG4iLCBDb21tYW5kLCBDbWRTdGF0dXMpKTsKKwl9CisJLy8gQ2xlYXIgQ29tbWFuZCBhbmQgU3RhdHVzLgorCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX1NUQVRVUywgMHhmZmZmZmZmZik7CisJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX01BSUxCT1hfQ0lELCAweGZmZmZmZmZmKTsKKworCXJldHVybiBGQUxTRTsKK30KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVZlcmlmeSB0aGUgc3VwcG9ydCByYXRlIGZvciBkaWZmZXJlbnQgUEhZIHR5cGUKKworCUFyZ3VtZW50czoKKwkJcEFkIAkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBDaGVja1JhdGVzKAorCUlOCQlQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBPVVQJVUNIQVIJCQlTdXBSYXRlW10sCisJSU4gT1VUCVVDSEFSCQkJKlN1cFJhdGVMZW4pCit7CisJVUNIQVIJUmF0ZUlkeCwgaSwgajsKKwlVQ0hBUglOZXdSYXRlWzEyXSwgTmV3UmF0ZUxlbjsKKworCU5ld1JhdGVMZW4gPSAwOworCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikKKwkJUmF0ZUlkeCA9IDQ7CisJZWxzZQorCQlSYXRlSWR4ID0gMTI7CisKKwkvLyBDaGVjayBmb3Igc3VwcG9ydCByYXRlcyBleGNsdWRlIGJhc2ljIHJhdGUgYml0CisJZm9yIChpID0gMDsgaSA8ICpTdXBSYXRlTGVuOyBpKyspCisJCWZvciAoaiA9IDA7IGogPCBSYXRlSWR4OyBqKyspCisJCQlpZiAoKFN1cFJhdGVbaV0gJiAweDdmKSA9PSBSYXRlSWRUbzUwMEticHNbal0pCisJCQkJTmV3UmF0ZVtOZXdSYXRlTGVuKytdID0gU3VwUmF0ZVtpXTsKKworCSpTdXBSYXRlTGVuID0gTmV3UmF0ZUxlbjsKKwlOZGlzTW92ZU1lbW9yeShTdXBSYXRlLCBOZXdSYXRlLCBOZXdSYXRlTGVuKTsKK30KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIERPVDExX05fU1VQUE9SVAorQk9PTEVBTiBSVE1QQ2hlY2tDaGFubmVsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSCQlDZW50cmFsQ2hhbm5lbCwKKwlJTiBVQ0hBUgkJQ2hhbm5lbCkKK3sKKwlVQ0hBUgkJazsKKwlVQ0hBUgkJVXBwZXJDaGFubmVsID0gMCwgTG93ZXJDaGFubmVsID0gMDsKKwlVQ0hBUgkJTm9FZmZlY3RDaGFubmVsaW5MaXN0ID0gMDsKKworCS8vIEZpbmQgdXBwZXIgYW5kIGxvd2VyIGNoYW5uZWwgYWNjb3JkaW5nIHRvIDQwTUh6IGN1cnJlbnQgb3BlcmF0aW9uLgorCWlmIChDZW50cmFsQ2hhbm5lbCA8IENoYW5uZWwpCisJeworCQlVcHBlckNoYW5uZWwgPSBDaGFubmVsOworCQlpZiAoQ2VudHJhbENoYW5uZWwgPiAyKQorCQkJTG93ZXJDaGFubmVsID0gQ2VudHJhbENoYW5uZWwgLSAyOworCQllbHNlCisJCQlyZXR1cm4gRkFMU0U7CisJfQorCWVsc2UgaWYgKENlbnRyYWxDaGFubmVsID4gQ2hhbm5lbCkKKwl7CisJCVVwcGVyQ2hhbm5lbCA9IENlbnRyYWxDaGFubmVsICsgMjsKKwkJTG93ZXJDaGFubmVsID0gQ2hhbm5lbDsKKwl9CisKKwlmb3IgKGsgPSAwO2sgPCBwQWQtPkNoYW5uZWxMaXN0TnVtO2srKykKKwl7CisJCWlmIChwQWQtPkNoYW5uZWxMaXN0W2tdLkNoYW5uZWwgPT0gVXBwZXJDaGFubmVsKQorCQl7CisJCQlOb0VmZmVjdENoYW5uZWxpbkxpc3QgKys7CisJCX0KKwkJaWYgKHBBZC0+Q2hhbm5lbExpc3Rba10uQ2hhbm5lbCA9PSBMb3dlckNoYW5uZWwpCisJCXsKKwkJCU5vRWZmZWN0Q2hhbm5lbGluTGlzdCArKzsKKwkJfQorCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiVG90YWwgQ2hhbm5lbCBpbiBDaGFubmVsIExpc3QgPSBbJWRdXG4iLCBOb0VmZmVjdENoYW5uZWxpbkxpc3QpKTsKKwlpZiAoTm9FZmZlY3RDaGFubmVsaW5MaXN0ID09IDIpCisJCXJldHVybiBUUlVFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJVmVyaWZ5IHRoZSBzdXBwb3J0IHJhdGUgZm9yIEhUIHBoeSB0eXBlCisKKwlBcmd1bWVudHM6CisJCXBBZCAJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlGQUxTRSBpZiBwQWQtPkNvbW1vbkNmZy5TdXBwb3J0ZWRIdFBoeSBkb2Vzbid0IGFjY2VwdCB0aGUgcEh0Q2FwYWJpbGl0eS4gIChBUCBNb2RlKQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gCVJUTVBDaGVja0h0KAorCUlOCVBSVE1QX0FEQVBURVIJCQlwQWQsCisJSU4JVUNIQVIJCQkJCVdjaWQsCisJSU4gCUhUX0NBUEFCSUxJVFlfSUUJCSpwSHRDYXBhYmlsaXR5LAorCUlOIAlBRERfSFRfSU5GT19JRQkJCSpwQWRkSHRJbmZvKQoreworCWlmIChXY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCQlyZXR1cm4gRkFMU0U7CisKKwkvLyBJZiB1c2UgQU1TRFUsIHNldCBmbGFnLgorCWlmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUpCisJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sIGZDTElFTlRfU1RBVFVTX0FNU0RVX0lOVVNFRCk7CisJLy8gU2F2ZSBQZWVyIENhcGFiaWxpdHkKKwlpZiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3IyMCkKKwkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXSwgZkNMSUVOVF9TVEFUVVNfU0dJMjBfQ0FQQUJMRSk7CisJaWYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5TaG9ydEdJZm9yNDApCisJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sIGZDTElFTlRfU1RBVFVTX1NHSTQwX0NBUEFCTEUpOworCWlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uVHhTVEJDKQorCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBmQ0xJRU5UX1NUQVRVU19UeFNUQkNfQ0FQQUJMRSk7CisJaWYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5SeFNUQkMpCisJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sIGZDTElFTlRfU1RBVFVTX1J4U1RCQ19DQVBBQkxFKTsKKwlpZiAocEFkLT5Db21tb25DZmcuYlJkZyAmJiBwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8uUkRHU3VwcG9ydCkKKwl7CisJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKTsKKwl9CisKKwlpZiAoV2NpZCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCXsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5NcGR1RGVuc2l0eSA9IHBIdENhcGFiaWxpdHktPkh0Q2FwUGFybS5NcGR1RGVuc2l0eTsKKwl9CisKKwkvLyBXaWxsIGNoZWNrIENoYW5uZWxXaWR0aCBmb3IgTUNTU2V0WzRdIGJlbG93CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbNF0gPSAweDE7CisgICAgc3dpdGNoIChwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSkKKwl7CisJCWNhc2UgMToKKwkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzBdID0gMHhmZjsKKwkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzFdID0gMHgwMDsKKyAgICAgICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzJdID0gMHgwMDsKKyAgICAgICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzNdID0gMHgwMDsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFswXSA9IDB4ZmY7CisJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9IDB4ZmY7CisgICAgICAgICAgICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFsyXSA9IDB4MDA7CisgICAgICAgICAgICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFszXSA9IDB4MDA7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAweGZmOworCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAweGZmOworICAgICAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMl0gPSAweGZmOworICAgICAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbM10gPSAweDAwOworCQkJYnJlYWs7CisJfQorCisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID0gcEFkZEh0SW5mby0+QWRkSHRJbmZvLlJlY29tV2lkdGggJiBwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUENoZWNrSHQ6OiBIdENhcEluZm8uQ2hhbm5lbFdpZHRoPSVkLCBSZWNvbVdpZHRoPSVkLCBEZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoPSVkLCBCVzQwTUF2YWlsRm9yQS9HPSVkLyVkLCBQaHlNb2RlPSVkIFxuIiwKKwkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoLCBwQWRkSHRJbmZvLT5BZGRIdEluZm8uUmVjb21XaWR0aCwgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCwKKwkJcEFkLT5OaWNDb25maWcyLmZpZWxkLkJXNDBNQXZhaWxGb3JBLCBwQWQtPk5pY0NvbmZpZzIuZmllbGQuQlc0ME1BdmFpbEZvckcsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpKTsKKworCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkdGID0gIHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5HRiAmcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkdGOworCisJLy8gU2VuZCBBc3NvYyBSZXEgd2l0aCBteSBIVCBjYXBhYmlsaXR5LgorCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZSA9ICBwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplOworCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QcyA9ICBwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWltb1BzOworCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCA9ICAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCkgJiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3IyMCk7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwID0gIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjQwKSAmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjQwKTsKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5UeFNUQkMgPSAgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMpJihwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uUnhTVEJDKTsKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5SeFNUQkMgPSAgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5SeFNUQkMpJihwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uVHhTVEJDKTsKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NYXhSQW1wZHVGYWN0b3IgPSBwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWF4UkFtcGR1RmFjdG9yOworICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5ID0gcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eTsKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDID0gcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlBsdXNIVEM7CisJcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5IVENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlBsdXNIVEMgPSBwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8uUGx1c0hUQzsKKwlpZiAocEFkLT5Db21tb25DZmcuYlJkZykKKwl7CisJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlJER1N1cHBvcnQgPSBwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8uUkRHU3VwcG9ydDsKKyAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQyA9IDE7CisJfQorCisgICAgaWYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV18yMCkKKyAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbNF0gPSAweDA7ICAvLyBCVzIwIGNhbid0IHRyYW5zbWl0IE1DUzMyCisKKwlDT1BZX0FQX0hUU0VUVElOR1NfRlJPTV9CRUFDT04ocEFkLCBwSHRDYXBhYmlsaXR5KTsKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVZlcmlmeSB0aGUgc3VwcG9ydCByYXRlIGZvciBkaWZmZXJlbnQgUEhZIHR5cGUKKworCUFyZ3VtZW50czoKKwkJcEFkIAkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBVcGRhdGVNbG1lUmF0ZSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlVQ0hBUglNaW5pbXVtUmF0ZTsKKwlVQ0hBUglQcm9wZXJNbG1lUmF0ZTsgLy89IFJBVEVfNTQ7CisJVUNIQVIJaSwgaiwgUmF0ZUlkeCA9IDEyOyAvLzEsIDIsIDUuNSwgMTEsIDYsIDksIDEyLCAxOCwgMjQsIDM2LCA0OCwgNTQKKwlCT09MRUFOCWJNYXRjaCA9IEZBTFNFOworCisJc3dpdGNoIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKQorCXsKKwkJY2FzZSBQSFlfMTFCOgorCQkJUHJvcGVyTWxtZVJhdGUgPSBSQVRFXzExOworCQkJTWluaW11bVJhdGUgPSBSQVRFXzE7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfMTFCR19NSVhFRDoKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJY2FzZSBQSFlfMTFBQkdOX01JWEVEOgorCQljYXNlIFBIWV8xMUJHTl9NSVhFRDoKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCWlmICgocEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4gPT0gNCkgJiYKKwkJCQkocEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gPT0gMCkpCisJCQkJLy8gQiBvbmx5IEFQCisJCQkJUHJvcGVyTWxtZVJhdGUgPSBSQVRFXzExOworCQkJZWxzZQorCQkJCVByb3Blck1sbWVSYXRlID0gUkFURV8yNDsKKworCQkJaWYgKHBBZC0+TWxtZUF1eC5DaGFubmVsIDw9IDE0KQorCQkJCU1pbmltdW1SYXRlID0gUkFURV8xOworCQkJZWxzZQorCQkJCU1pbmltdW1SYXRlID0gUkFURV82OworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExQToKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJY2FzZSBQSFlfMTFOXzJfNEc6CS8vIHJ0Mjg2MCBuZWVkIHRvIGNoZWNrIG1sbWVyYXRlIGZvciA4MDIuMTFuCisJCWNhc2UgUEhZXzExR05fTUlYRUQ6CisJCWNhc2UgUEhZXzExQUdOX01JWEVEOgorCQljYXNlIFBIWV8xMUFOX01JWEVEOgorCQljYXNlIFBIWV8xMU5fNUc6CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQlQcm9wZXJNbG1lUmF0ZSA9IFJBVEVfMjQ7CisJCQlNaW5pbXVtUmF0ZSA9IFJBVEVfNjsKKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMUFCR19NSVhFRDoKKwkJCVByb3Blck1sbWVSYXRlID0gUkFURV8yNDsKKwkJCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA8PSAxNCkKKwkJCSAgIE1pbmltdW1SYXRlID0gUkFURV8xOworCQkJZWxzZQorCQkJCU1pbmltdW1SYXRlID0gUkFURV82OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6IC8vIGVycm9yCisJCQlQcm9wZXJNbG1lUmF0ZSA9IFJBVEVfMTsKKwkJCU1pbmltdW1SYXRlID0gUkFURV8xOworCQkJYnJlYWs7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuOyBpKyspCisJeworCQlmb3IgKGogPSAwOyBqIDwgUmF0ZUlkeDsgaisrKQorCQl7CisJCQlpZiAoKHBBZC0+TWxtZUF1eC5TdXBSYXRlW2ldICYgMHg3ZikgPT0gUmF0ZUlkVG81MDBLYnBzW2pdKQorCQkJeworCQkJCWlmIChqID09IFByb3Blck1sbWVSYXRlKQorCQkJCXsKKwkJCQkJYk1hdGNoID0gVFJVRTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKGJNYXRjaCkKKwkJCWJyZWFrOworCX0KKworCWlmIChiTWF0Y2ggPT0gRkFMU0UpCisJeworCQlmb3IgKGkgPSAwOyBpIDwgcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW47IGkrKykKKwkJeworCQkJZm9yIChqID0gMDsgaiA8IFJhdGVJZHg7IGorKykKKwkJCXsKKwkJCQlpZiAoKHBBZC0+TWxtZUF1eC5FeHRSYXRlW2ldICYgMHg3ZikgPT0gUmF0ZUlkVG81MDBLYnBzW2pdKQorCQkJCXsKKwkJCQkJaWYgKGogPT0gUHJvcGVyTWxtZVJhdGUpCisJCQkJCXsKKwkJCQkJCWJNYXRjaCA9IFRSVUU7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJaWYgKGJNYXRjaCkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChiTWF0Y2ggPT0gRkFMU0UpCisJeworCQlQcm9wZXJNbG1lUmF0ZSA9IE1pbmltdW1SYXRlOworCX0KKworCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gTWluaW11bVJhdGU7CisJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFByb3Blck1sbWVSYXRlOworCWlmIChwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA+PSBSQVRFXzYpCisJeworCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1MwTWNhc3RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07CisJfQorCWVsc2UKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZTsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1MwTWNhc3RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1MwTWNhc3RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBVcGRhdGVNbG1lUmF0ZSA9PT4gICBNbG1lVHJhbnNtaXQgPSAweCV4ICBcbiIgLCBwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQud29yZCkpOworfQorCitDSEFSIFJUTVBNYXhSc3NpKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIENIQVIJCQkJUnNzaTAsCisJSU4gQ0hBUgkJCQlSc3NpMSwKKwlJTiBDSEFSCQkJCVJzc2kyKQoreworCUNIQVIJbGFyZ2VyID0gLTEyNzsKKworCWlmICgocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKSAmJiAoUnNzaTAgIT0gMCkpCisJeworCQlsYXJnZXIgPSBSc3NpMDsKKwl9CisKKwlpZiAoKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMikgJiYgKFJzc2kxICE9IDApKQorCXsKKwkJbGFyZ2VyID0gbWF4KFJzc2kwLCBSc3NpMSk7CisJfQorCisJaWYgKChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDMpICYmIChSc3NpMiAhPSAwKSkKKwl7CisJCWxhcmdlciA9IG1heChsYXJnZXIsIFJzc2kyKTsKKwl9CisKKwlpZiAobGFyZ2VyID09IC0xMjcpCisJCWxhcmdlciA9IDA7CisKKwlyZXR1cm4gbGFyZ2VyOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgICAgIFBlcmlvZGljIGV2YWx1YXRlIGFudGVubmEgbGluayBzdGF0dXMKKworICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkICAgICAgICAgLSBBZGFwdGVyIHBvaW50ZXIKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgTm9uZQorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBBc2ljRXZhbHVhdGVSeEFudCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlVQ0hBUglCQlBSMyA9IDA7CisKKyNpZmRlZiBSQUxJTktfQVRFCisJaWYgKEFURV9PTihwQWQpKQorCQlyZXR1cm47CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUwl8CisJCQkJCQkJCWZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUwl8CisJCQkJCQkJCWZSVE1QX0FEQVBURVJfUkFESU9fT0ZGCQkJfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QJCXwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisJCQlyZXR1cm47CisKKwkJaWYgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkKKwkJCXJldHVybjsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCQlBSMyk7CisJQkJQUjMgJj0gKH4weDE4KTsKKwlpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDMpCisJeworCQlCQlBSMyB8PSAoMHgxMCk7CisJfQorCWVsc2UgaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKQorCXsKKwkJQkJQUjMgfD0gKDB4OCk7CisJfQorCWVsc2UgaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQorCXsKKwkJQkJQUjMgfD0gKDB4MCk7CisJfQorCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJCUFIzKTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBSVDI4NjAKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorICAgIAlwQWQtPlN0YUNmZy5CQlBSMyA9IEJCUFIzOworI2VuZGlmIC8vIFJUMjg2MCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkKKwkJKQorCXsKKwkJVUxPTkcJVHhUb3RhbENudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArCisJCQkJCQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKworCQkJCQkJCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50OworCisJCWlmIChUeFRvdGFsQ250ID4gNTApCisJCXsKKwkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlJ4QW50RXZhbFRpbWVyLCAyMCk7CisJCQlwQWQtPk1sbWUuYkxvd1Rocm91Z2hwdXQgPSBGQUxTRTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlJ4QW50RXZhbFRpbWVyLCAzMDApOworCQkJcEFkLT5NbG1lLmJMb3dUaHJvdWdocHV0ID0gVFJVRTsKKwkJfQorCX0KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBBZnRlciBldmFsdWF0aW9uLCBjaGVjayBhbnRlbm5hIGxpbmsgc3RhdHVzCisKKyAgICBBcmd1bWVudHM6CisgICAgICAgIHBBZCAgICAgICAgIC0gQWRhcHRlciBwb2ludGVyCisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIE5vbmUKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQXNpY1J4QW50RXZhbFRpbWVvdXQoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCVJUTVBfQURBUFRFUgkqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlVQ0hBUgkJCUJCUFIzID0gMDsKKwlDSEFSCQkJbGFyZ2VyID0gLTEyNywgcnNzaTAsIHJzc2kxLCByc3NpMjsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIFJBTElOS19BVEUKKwlpZiAoQVRFX09OKHBBZCkpCisJCXJldHVybjsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKQl8fAorCQkJUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpCQl8fAorCQkJUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikJCQl8fAorCQkJUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQkJcmV0dXJuOworCisJCWlmIChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpCisJCQlyZXR1cm47CisKKworCQkvLyBpZiB0aGUgdHJhZmZpYyBpcyBsb3csIHVzZSBhdmVyYWdlIHJzc2kgYXMgdGhlIGNyaXRlcmlhCisJCWlmIChwQWQtPk1sbWUuYkxvd1Rocm91Z2hwdXQgPT0gVFJVRSkKKwkJeworCQkJcnNzaTAgPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMDsKKwkJCXJzc2kxID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTE7CisJCQlyc3NpMiA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyOworCQl9CisJCWVsc2UKKwkJeworCQkJcnNzaTAgPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwOworCQkJcnNzaTEgPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxOworCQkJcnNzaTIgPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyOworCQl9CisKKwkJaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKQorCQl7CisJCQlsYXJnZXIgPSBtYXgocnNzaTAsIHJzc2kxKTsKKworCQkJaWYgKGxhcmdlciA+IChyc3NpMiArIDIwKSkKKwkJCQlwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9IDI7CisJCQllbHNlCisJCQkJcEFkLT5NbG1lLlJlYWxSeFBhdGggPSAzOworCQl9CisJCWVsc2UgaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKQorCQl7CisJCQlpZiAocnNzaTAgPiAocnNzaTEgKyAyMCkpCisJCQkJcEFkLT5NbG1lLlJlYWxSeFBhdGggPSAxOworCQkJZWxzZQorCQkJCXBBZC0+TWxtZS5SZWFsUnhQYXRoID0gMjsKKwkJfQorCisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJCUFIzKTsKKwkJQkJQUjMgJj0gKH4weDE4KTsKKwkJaWYocEFkLT5NbG1lLlJlYWxSeFBhdGggPT0gMykKKwkJeworCQkJQkJQUjMgfD0gKDB4MTApOworCQl9CisJCWVsc2UgaWYocEFkLT5NbG1lLlJlYWxSeFBhdGggPT0gMikKKwkJeworCQkJQkJQUjMgfD0gKDB4OCk7CisJCX0KKwkJZWxzZSBpZihwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9PSAxKQorCQl7CisJCQlCQlBSMyB8PSAoMHgwKTsKKwkJfQorCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCQlBSMyk7CisjaWZkZWYgUlQyODYwCisgICAgcEFkLT5TdGFDZmcuQkJQUjMgPSBCQlBSMzsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwl9CisKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworfQorCisKKworVk9JRCBBUFNEUGVyaW9kaWNFeGVjKAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKwlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisKKwlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwkJcmV0dXJuOworCisJcEFkLT5Db21tb25DZmcuVHJpZ2dlclRpbWVyQ291bnQrKzsKKworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgICAgIFNldC9yZXNldCBNQUMgcmVnaXN0ZXJzIGFjY29yZGluZyB0byBiUGlnZ3lCYWNrIHBhcmFtZXRlcgorCisgICAgQXJndW1lbnRzOgorICAgICAgICBwQWQgICAgICAgICAtIEFkYXB0ZXIgcG9pbnRlcgorICAgICAgICBiUGlnZ3lCYWNrICAtIEVuYWJsZSAvIERpc2FibGUgUGlnZ3ktQmFjaworCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOb25lCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBTZXRQaWdneUJhY2soCisgICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisgICAgSU4gQk9PTEVBTiAgICAgICAgICBiUGlnZ3lCYWNrKQoreworCVRYX0xJTktfQ0ZHX1NUUlVDICBUeExpbmtDZmc7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0xJTktfQ0ZHLCAmVHhMaW5rQ2ZnLndvcmQpOworCisJVHhMaW5rQ2ZnLmZpZWxkLlR4Q0ZBY2tFbiA9IGJQaWdneUJhY2s7CisJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfTElOS19DRkcsIFR4TGlua0NmZy53b3JkKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBjaGVjayBpZiB0aGlzIGVudHJ5IG5lZWQgdG8gc3dpdGNoIHJhdGUgYXV0b21hdGljYWxseQorCisgICAgQXJndW1lbnRzOgorICAgICAgICBwQWQKKyAgICAgICAgcEVudHJ5CisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIFRVUkUKKyAgICAgICAgRkFMU0UKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gUlRNUENoZWNrRW50cnlFbmFibGVBdXRvUmF0ZVN3aXRjaCgKKwlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwlJTiBQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSkKK3sKKwlCT09MRUFOCQlyZXN1bHQgPSBUUlVFOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJLy8gb25seSBhc3NvY2lhdGVkIFNUQSBjb3VudHMKKwkJaWYgKHBFbnRyeSAmJiAocEVudHJ5LT5WYWxpZEFzQ0xJKSAmJiAocEVudHJ5LT5Tc3QgPT0gU1NUX0FTU09DKSkKKwkJeworCQkJcmVzdWx0ID0gcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2g7CisJCX0KKwkJZWxzZQorCQkJcmVzdWx0ID0gRkFMU0U7CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJaWYgKHBFbnRyeSAmJiAocEVudHJ5LT5WYWxpZEFzRGxzKSkKKwkJCXJlc3VsdCA9IHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisKKwlyZXR1cm4gcmVzdWx0OworfQorCisKK0JPT0xFQU4gUlRNUEF1dG9SYXRlU3dpdGNoQ2hlY2soCisJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQpCit7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJaWYgKHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoKQorCQkJcmV0dXJuIFRSVUU7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCXJldHVybiBGQUxTRTsKK30KKworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgICAgIGNoZWNrIGlmIHRoaXMgZW50cnkgbmVlZCB0byBmaXggdHggbGVnYWN5IHJhdGUKKworICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkCisgICAgICAgIHBFbnRyeQorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBUVVJFCisgICAgICAgIEZBTFNFCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitVQ0hBUiBSVE1QU3RhRml4ZWRUeE1vZGUoCisJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJSU4gUE1BQ19UQUJMRV9FTlRSWQlwRW50cnkpCit7CisJVUNIQVIJdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9IVDsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCXR4X21vZGUgPSAoVUNIQVIpcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlyZXR1cm4gdHhfbW9kZTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBPdmVyd3JpdGUgSFQgVHggTW9kZSBieSBGaXhlZCBMZWdlbmN5IFR4IE1vZGUsIGlmIHNwZWNpZmllZC4KKworICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkCisgICAgICAgIHBFbnRyeQorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBUVVJFCisgICAgICAgIEZBTFNFCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBVcGRhdGVMZWdhY3lUeFNldHRpbmcoCisJCVVDSEFSCQkJCWZpeGVkX3R4X21vZGUsCisJCVBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5KQoreworCUhUVFJBTlNNSVRfU0VUVElORyBUcmFuc21pdFNldHRpbmc7CisKKwlpZiAoZml4ZWRfdHhfbW9kZSA9PSBGSVhFRF9UWE1PREVfSFQpCisJCXJldHVybjsKKworCVRyYW5zbWl0U2V0dGluZy53b3JkID0gMDsKKworCVRyYW5zbWl0U2V0dGluZy5maWVsZC5NT0RFID0gcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERTsKKwlUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTOworCisJaWYgKGZpeGVkX3R4X21vZGUgPT0gRklYRURfVFhNT0RFX0NDSykKKwl7CisJCVRyYW5zbWl0U2V0dGluZy5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCS8vIENDSyBtb2RlIGFsbG93IE1DUyAwfjMKKwkJaWYgKFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPiBNQ1NfMykKKwkJCVRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMzsKKwl9CisJZWxzZQorCXsKKwkJVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCS8vIE9GRE0gbW9kZSBhbGxvdyBNQ1MgMH43CisJCWlmIChUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID4gTUNTXzcpCisJCQlUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzc7CisJfQorCisJaWYgKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPj0gVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1PREUpCisJeworCQlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gVHJhbnNtaXRTZXR0aW5nLndvcmQ7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBVcGRhdGVMZWdhY3lUeFNldHRpbmcgOiB3Y2lkLSVkLCBNT0RFPSVzLCBNQ1M9JWQgXG4iLAorCQkJCXBFbnRyeS0+QWlkLCBHZXRQaHlNb2RlKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUpLCBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MpKTsKKwl9Cit9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJZHluYW1pYyB0dW5lIEJCUCBSNjYgdG8gZmluZCBhIGJhbGFuY2UgYmV0d2VlbiBzZW5zaWJpbGl0eSBhbmQKKwkJbm9pc2UgaXNvbGF0aW9uCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY1N0YUJicFR1bmluZygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlVQ0hBUglPcmlnUjY2VmFsdWUgPSAwLCBSNjY7Ly8sIFI2NlVwcGVyQm91bmQgPSAweDMwLCBSNjZMb3dlckJvdW5kID0gMHgzMDsKKwlDSEFSCVJzc2k7CisKKwkvLyAyODYwQyBkaWQgbm90IHN1cHBvcnQgRmFzZSBDQ0EsIHRoZXJlZm9yZSBjYW4ndCB0dW5lCisJaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKQorCQlyZXR1cm47CisKKwkvLworCS8vIHdvcmsgYXMgYSBTVEEKKwkvLworCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkgIC8vIG5vIFI2NiB0dW5pbmcgd2hlbiBTQ0FOTklORworCQlyZXR1cm47CisKKwlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCisJCSYmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkKKwkJCSkKKwkJJiYgIShPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQorI2lmZGVmIFJUMjg2MAorCQkmJiAocEFkLT5iUENJY2xrT2ZmID09IEZBTFNFKQorI2VuZGlmIC8vIFJUMjg2MCAvLworCQkpCisJeworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCAmT3JpZ1I2NlZhbHVlKTsKKwkJUjY2ID0gT3JpZ1I2NlZhbHVlOworCisJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID4gMSkKKwkJCVJzc2kgPSAocEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCArIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTEpID4+IDE7CisJCWVsc2UKKwkJCVJzc2kgPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwOworCisJCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpCisJCXsJLy9CRyBiYW5kCisJCQl7CisJCQkJaWYgKFJzc2kgPiBSU1NJX0ZPUl9NSURfTE9XX1NFTlNJQklMSVRZKQorCQkJCXsKKwkJCQkJUjY2ID0gKDB4MkUgKyBHRVRfTE5BX0dBSU4ocEFkKSkgKyAweDEwOworCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikKKwkJCQkJeworCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJUjY2ID0gMHgyRSArIEdFVF9MTkFfR0FJTihwQWQpOworCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikKKwkJCQkJeworCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CS8vQSBiYW5kCisJCQlpZiAocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzIwKQorCQkJeworCQkJCWlmIChSc3NpID4gUlNTSV9GT1JfTUlEX0xPV19TRU5TSUJJTElUWSkKKwkJCQl7CisJCQkJCVI2NiA9IDB4MzIgKyAoR0VUX0xOQV9HQUlOKHBBZCkqNSkvMyArIDB4MTA7CisJCQkJCWlmIChPcmlnUjY2VmFsdWUgIT0gUjY2KQorCQkJCQl7CisJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSNjYgPSAweDMyICsgKEdFVF9MTkFfR0FJTihwQWQpKjUpLzM7CisJCQkJCWlmIChPcmlnUjY2VmFsdWUgIT0gUjY2KQorCQkJCQl7CisJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAoUnNzaSA+IFJTU0lfRk9SX01JRF9MT1dfU0VOU0lCSUxJVFkpCisJCQkJeworCQkJCQlSNjYgPSAweDNBICsgKEdFVF9MTkFfR0FJTihwQWQpKjUpLzMgKyAweDEwOworCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikKKwkJCQkJeworCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJUjY2ID0gMHgzQSArIChHRVRfTE5BX0dBSU4ocEFkKSo1KS8zOworCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikKKwkJCQkJeworCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCisJfQorfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCitWT0lEIFJUTVBTZXRBR0NJbml0VmFsdWUoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVUNIQVIJCQlCYW5kV2lkdGgpCit7CisJVUNIQVIJUjY2ID0gMHgzMDsKKworCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpCisJewkvLyBCRyBiYW5kCisJCVI2NiA9IDB4MkUgKyBHRVRfTE5BX0dBSU4ocEFkKTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7CisJfQorCWVsc2UKKwl7CS8vQSBiYW5kCisJCWlmIChCYW5kV2lkdGggPT0gQldfMjApCisJCXsKKwkJCVI2NiA9IChVQ0hBUikoMHgzMiArIChHRVRfTE5BX0dBSU4ocEFkKSo1KS8zKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQl9CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWVsc2UKKwkJeworCQkJUjY2ID0gKFVDSEFSKSgweDNBICsgKEdFVF9MTkFfR0FJTihwQWQpKjUpLzMpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7CisJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwl9CisKK30KKworVk9JRCBBc2ljVHVybk9mZlJGQ2xrKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVDSEFSCQlDaGFubmVsKQoreworCisJLy8gUkYgUjIgYml0IDE4ID0gMAorCVVJTlQzMgkJCVIxID0gMCwgUjIgPSAwLCBSMyA9IDA7CisJVUNIQVIJCQlpbmRleDsKKwlSVE1QX1JGX1JFR1MJKlJGUmVnVGFibGU7CisKKwlSRlJlZ1RhYmxlID0gUkYyODUwUmVnVGFibGU7CisKKwlzd2l0Y2ggKHBBZC0+UmZJY1R5cGUpCisJeworCQljYXNlIFJGSUNfMjgyMDoKKwkJY2FzZSBSRklDXzI4NTA6CisJCWNhc2UgUkZJQ18yNzIwOgorCQljYXNlIFJGSUNfMjc1MDoKKworCQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNX09GXzI4NTBfQ0hOTDsgaW5kZXgrKykKKwkJCXsKKwkJCQlpZiAoQ2hhbm5lbCA9PSBSRlJlZ1RhYmxlW2luZGV4XS5DaGFubmVsKQorCQkJCXsKKwkJCQkJUjEgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMSAmIDB4ZmZmZmRmZmY7CisJCQkJCVIyID0gUkZSZWdUYWJsZVtpbmRleF0uUjIgJiAweGZmZmJmZmZmOworCQkJCQlSMyA9IFJGUmVnVGFibGVbaW5kZXhdLlIzICYgMHhmZmYzZmZmZjsKKworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMSk7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIyKTsKKworCQkJCQkvLyBQcm9ncmFtIFIxYjEzIHRvIDEsIFIzL2IxOCwxOSB0byAwLCBSMmIxOCB0byAwLgorCQkJCQkvLyBTZXQgUkYgUjIgYml0MTg9MCwgUjMgYml0WzE4OjE5XT0wCisJCQkJCS8vaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBGQUxTRSkKKwkJCQkJaWYgKDEpCisJCQkJCXsKKwkJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIzKTsKKworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY1R1cm5PZmZSRkNsayMlZChSRj0lZCwgKSAsIFIyPTB4JTA4eCwgIFIzID0gMHglMDh4IFxuIiwKKwkJCQkJCQlDaGFubmVsLCBwQWQtPlJmSWNUeXBlLCBSMiwgUjMpKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljVHVybk9mZlJGQ2xrIyVkKFJGPSVkLCApICwgUjI9MHglMDh4IFxuIiwKKwkJCQkJCQlDaGFubmVsLCBwQWQtPlJmSWNUeXBlLCBSMikpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorfQorCisKK1ZPSUQgQXNpY1R1cm5PblJGQ2xrKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVDSEFSCQkJQ2hhbm5lbCkKK3sKKworCS8vIFJGIFIyIGJpdCAxOCA9IDAKKwlVSU5UMzIJCQlSMSA9IDAsIFIyID0gMCwgUjMgPSAwOworCVVDSEFSCQkJaW5kZXg7CisJUlRNUF9SRl9SRUdTCSpSRlJlZ1RhYmxlOworCisJUkZSZWdUYWJsZSA9IFJGMjg1MFJlZ1RhYmxlOworCisJc3dpdGNoIChwQWQtPlJmSWNUeXBlKQorCXsKKwkJY2FzZSBSRklDXzI4MjA6CisJCWNhc2UgUkZJQ18yODUwOgorCQljYXNlIFJGSUNfMjcyMDoKKwkJY2FzZSBSRklDXzI3NTA6CisKKwkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9PRl8yODUwX0NITkw7IGluZGV4KyspCisJCQl7CisJCQkJaWYgKENoYW5uZWwgPT0gUkZSZWdUYWJsZVtpbmRleF0uQ2hhbm5lbCkKKwkJCQl7CisJCQkJCVIzID0gcEFkLT5MYXRjaFJmUmVncy5SMzsKKwkJCQkJUjMgJj0gMHhmZmYzZmZmZjsKKwkJCQkJUjMgfD0gMHgwMDA4MDAwMDsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjMpOworCisJCQkJCVIxID0gUkZSZWdUYWJsZVtpbmRleF0uUjE7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIxKTsKKworCQkJCQlSMiA9IFJGUmVnVGFibGVbaW5kZXhdLlIyOworCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKQorCQkJCQl7CisJCQkJCQlSMiB8PSAweDQwMDA7CS8vIElmIFRYcGF0aCBpcyAxLCBiaXQgMTQgPSAxOworCQkJCQl9CisKKwkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMikKKwkJCQkJeworCQkJCQkJUjIgfD0gMHg0MDsJLy8gd3JpdGUgMSB0byBvZmYgUnhwYXRoLgorCQkJCQl9CisJCQkJCWVsc2UgaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKKwkJCQkJeworCQkJCQkJUjIgfD0gMHgyMDA0MDsJLy8gd3JpdGUgMSB0byBvZmYgUnhQYXRoCisJCQkJCX0KKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjIpOworCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljVHVybk9uUkZDbGsjJWQoUkY9JWQsICkgLCBSMj0weCUwOHhcbiIsCisJCUNoYW5uZWwsCisJCXBBZC0+UmZJY1R5cGUsCisJCVIyKSk7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL25ldGlmX2Jsb2NrLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9uZXRpZl9ibG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZjdkMDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9uZXRpZl9ibG9jay5jCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisjaW5jbHVkZSAibmV0aWZfYmxvY2suaCIKKworc3RhdGljIE5FVElGX0VOVFJZIGZyZWVOZXRJZkVudHJ5UG9vbFtGUkVFX05FVElGX1BPT0xfU0laRV07CitzdGF0aWMgTElTVF9IRUFERVIgZnJlZU5ldElmRW50cnlMaXN0OworCit2b2lkIGluaXRibG9ja1F1ZXVlVGFiKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCWludCBpOworCisJaW5pdExpc3QoJmZyZWVOZXRJZkVudHJ5TGlzdCk7CisJZm9yIChpID0gMDsgaSA8IEZSRUVfTkVUSUZfUE9PTF9TSVpFOyBpKyspCisJCWluc2VydFRhaWxMaXN0KCZmcmVlTmV0SWZFbnRyeUxpc3QsIChQTElTVF9FTlRSWSkmZnJlZU5ldElmRW50cnlQb29sW2ldKTsKKworCWZvciAoaT0wOyBpIDwgTlVNX09GX1RYX1JJTkc7IGkrKykKKwkJaW5pdExpc3QoJnBBZC0+YmxvY2tRdWV1ZVRhYltpXS5OZXRJZkxpc3QpOworCisJcmV0dXJuOworfQorCitCT09MRUFOIGJsb2NrTmV0SWYoCisJSU4gUEJMT0NLX1FVRVVFX0VOVFJZIHBCbG9ja1F1ZXVlRW50cnksCisJSU4gUE5FVF9ERVYgcE5ldERldikKK3sKKwlQTkVUSUZfRU5UUlkgcE5ldElmRW50cnkgPSBOVUxMOworCisJaWYgKChwTmV0SWZFbnRyeSA9IChQTkVUSUZfRU5UUlkpcmVtb3ZlSGVhZExpc3QoJmZyZWVOZXRJZkVudHJ5TGlzdCkpICE9IE5VTEwpCisJeworCQluZXRpZl9zdG9wX3F1ZXVlKHBOZXREZXYpOworCQlwTmV0SWZFbnRyeS0+cE5ldERldiA9IHBOZXREZXY7CisJCWluc2VydFRhaWxMaXN0KCZwQmxvY2tRdWV1ZUVudHJ5LT5OZXRJZkxpc3QsIChQTElTVF9FTlRSWSlwTmV0SWZFbnRyeSk7CisKKwkJcEJsb2NrUXVldWVFbnRyeS0+U3dUeFF1ZXVlQmxvY2tGbGFnID0gVFJVRTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgibmV0aWZfc3RvcF9xdWV1ZSglcylcbiIsIHBOZXREZXYtPm5hbWUpKTsKKwl9CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7CisKKwlyZXR1cm4gVFJVRTsKK30KKworVk9JRCByZWxlYXNlTmV0SWYoCisJSU4gUEJMT0NLX1FVRVVFX0VOVFJZIHBCbG9ja1F1ZXVlRW50cnkpCit7CisJUE5FVElGX0VOVFJZIHBOZXRJZkVudHJ5ID0gTlVMTDsKKwlQTElTVF9IRUFERVIgcE5ldElmTGlzdCA9ICZwQmxvY2tRdWV1ZUVudHJ5LT5OZXRJZkxpc3Q7CisKKwl3aGlsZSgocE5ldElmRW50cnkgPSAoUE5FVElGX0VOVFJZKXJlbW92ZUhlYWRMaXN0KHBOZXRJZkxpc3QpKSAhPSAgTlVMTCkKKwl7CisJCVBORVRfREVWIHBOZXREZXYgPSBwTmV0SWZFbnRyeS0+cE5ldERldjsKKwkJbmV0aWZfd2FrZV9xdWV1ZShwTmV0RGV2KTsKKwkJaW5zZXJ0VGFpbExpc3QoJmZyZWVOZXRJZkVudHJ5TGlzdCwgKFBMSVNUX0VOVFJZKXBOZXRJZkVudHJ5KTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJuZXRpZl93YWtlX3F1ZXVlKCVzKVxuIiwgcE5ldERldi0+bmFtZSkpOworCX0KKwlwQmxvY2tRdWV1ZUVudHJ5LT5Td1R4UXVldWVCbG9ja0ZsYWcgPSBGQUxTRTsKKwlyZXR1cm47Cit9CisKKworVk9JRCBTdG9wTmV0SWZRdWV1ZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiBRdWVJZHgsCisJSU4gUE5ESVNfUEFDS0VUIHBQYWNrZXQpCit7CisJUE5FVF9ERVYgTmV0RGV2ID0gTlVMTDsKKwlVQ0hBUiBJZklkeCA9IDA7CisJQk9PTEVBTiB2YWxpZCA9IEZBTFNFOworCisjaWZkZWYgQVBDTElfU1VQUE9SVAorCWlmIChSVE1QX0dFVF9QQUNLRVRfTkVUX0RFVklDRShwUGFja2V0KSA+PSBNSU5fTkVUX0RFVklDRV9GT1JfQVBDTEkpCisJeworCQlJZklkeCA9IChSVE1QX0dFVF9QQUNLRVRfTkVUX0RFVklDRShwUGFja2V0KSAtIE1JTl9ORVRfREVWSUNFX0ZPUl9BUENMSSkgJSBNQVhfQVBDTElfTlVNOworCQlOZXREZXYgPSBwQWQtPkFwQ2ZnLkFwQ2xpVGFiW0lmSWR4XS5kZXY7CisJfQorCWVsc2UKKyNlbmRpZiAvLyBBUENMSV9TVVBQT1JUIC8vCisjaWZkZWYgV0RTX1NVUFBPUlQKKwlpZiAoUlRNUF9HRVRfUEFDS0VUX05FVF9ERVZJQ0UocFBhY2tldCkgPj0gTUlOX05FVF9ERVZJQ0VfRk9SX1dEUykKKwl7CisJCUlmSWR4ID0gKFJUTVBfR0VUX1BBQ0tFVF9ORVRfREVWSUNFKHBQYWNrZXQpIC0gTUlOX05FVF9ERVZJQ0VfRk9SX1dEUykgJSBNQVhfV0RTX0VOVFJZOworCQlOZXREZXYgPSBwQWQtPldkc1RhYi5XZHNFbnRyeVtJZklkeF0uZGV2OworCX0KKwllbHNlCisjZW5kaWYgLy8gV0RTX1NVUFBPUlQgLy8KKwl7CisjaWZkZWYgTUJTU19TVVBQT1JUCisJCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApCisJCXsKKwkJCUlmSWR4ID0gKFJUTVBfR0VUX1BBQ0tFVF9ORVRfREVWSUNFKHBQYWNrZXQpIC0gTUlOX05FVF9ERVZJQ0VfRk9SX01CU1NJRCkgJSBNQVhfTUJTU0lEX05VTTsKKwkJCU5ldERldiA9IHBBZC0+QXBDZmcuTUJTU0lEW0lmSWR4XS5NU1NJRERldjsKKwkJfQorCQllbHNlCisJCXsKKwkJCUlmSWR4ID0gTUFJTl9NQlNTSUQ7CisJCQlOZXREZXYgPSBwQWQtPm5ldF9kZXY7CisJCX0KKyNlbHNlCisJCUlmSWR4ID0gTUFJTl9NQlNTSUQ7CisJCU5ldERldiA9IHBBZC0+bmV0X2RldjsKKyNlbmRpZgorCX0KKworCS8vIFdNTSBzdXBwb3J0IDQgc29mdHdhcmUgcXVldWVzLgorCS8vIE9uZSBzb2Z0d2FyZSBxdWV1ZSBmdWxsIGRvZXNuJ3QgbWVhbiBkZXZpY2UgaGF2ZSBubyBjYXBiaWxpdHkgdG8gdHJhbnNtaXQgcGFja2V0LgorCS8vIFNvIGRpc2FibGUgYmxvY2sgTmV0LUlmIHF1ZXVlIGZ1bmN0aW9uIHdoaWxlIFdNTSBlbmFibGUuCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJdmFsaWQgPSAocEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUgPT0gVFJVRSkgPyBGQUxTRSA6IFRSVUU7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlpZiAodmFsaWQpCisJCWJsb2NrTmV0SWYoJnBBZC0+YmxvY2tRdWV1ZVRhYltRdWVJZHhdLCBOZXREZXYpOworCXJldHVybjsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vbmV0aWZfYmxvY2suaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL25ldGlmX2Jsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU1MTUxYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL25ldGlmX2Jsb2NrLmgKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2lmbmRlZiBfX05FVF9JRl9CTE9DS19IX18KKyNkZWZpbmUgX19ORVRfSUZfQkxPQ0tfSF9fCisKKy8vI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgImxpbmtfbGlzdC5oIgorI2luY2x1ZGUgInJ0bXAuaCIKKworI2RlZmluZSBGUkVFX05FVElGX1BPT0xfU0laRSAzMgorCit0eXBlZGVmIHN0cnVjdCBfTkVUSUZfRU5UUlkKK3sKKwlzdHJ1Y3QgX05FVElGX0VOVFJZICpwTmV4dDsKKwlQTkVUX0RFViBwTmV0RGV2OworfSBORVRJRl9FTlRSWSwgKlBORVRJRl9FTlRSWTsKKwordm9pZCBpbml0YmxvY2tRdWV1ZVRhYigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK0JPT0xFQU4gYmxvY2tOZXRJZigKKwlJTiBQQkxPQ0tfUVVFVUVfRU5UUlkgcEJsb2NrUXVldWVFbnRyeSwKKwlJTiBQTkVUX0RFViBwTmV0RGV2KTsKKworVk9JRCByZWxlYXNlTmV0SWYoCisJSU4gUEJMT0NLX1FVRVVFX0VOVFJZIHBCbG9ja1F1ZXVlRW50cnkpOworCitWT0lEIFN0b3BOZXRJZlF1ZXVlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSIFF1ZUlkeCwKKwlJTiBQTkRJU19QQUNLRVQgcFBhY2tldCk7CisjZW5kaWYgLy8gX19ORVRfSUZfQkxPQ0tfSF9fCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfaW5pdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRtcF9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYzZjJjNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfaW5pdC5jCkBAIC0wLDAgKzEsMzc0NCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlydG1wX2luaXQuYworCisJQWJzdHJhY3Q6CisJTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVBhdWwgTGluICAgIDIwMDItMDgtMDEgICAgY3JlYXRlZAorICAgIEpvaG4gQ2hhbmcgIDIwMDQtMDgtMjAgICAgUlQyNTYxLzI2NjEgdXNlIHNjYXR0ZXItZ2F0aGVyIHNjaGVtZQorICAgIEphbiBMZWUgIDIwMDYtMDktMTUgICAgUlQyODYwLiBDaGFuZ2UgZm9yIDgwMi4xMW4gLCBFRVBST00sIExlZCwgQkEsIEhULgorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKyNpbmNsdWRlIAkiZmlybXdhcmUuaCIKKyNpbmNsdWRlIDxsaW51eC9iaXRyZXYuaD4KKworVUNIQVIgICAgQklUOFtdID0gezB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODB9OworVUxPTkcgICAgQklUMzJbXSA9IHsweDAwMDAwMDAxLCAweDAwMDAwMDAyLCAweDAwMDAwMDA0LCAweDAwMDAwMDA4LAorCQkJCQkweDAwMDAwMDEwLCAweDAwMDAwMDIwLCAweDAwMDAwMDQwLCAweDAwMDAwMDgwLAorCQkJCQkweDAwMDAwMTAwLCAweDAwMDAwMjAwLCAweDAwMDAwNDAwLCAweDAwMDAwODAwLAorCQkJCQkweDAwMDAxMDAwLCAweDAwMDAyMDAwLCAweDAwMDA0MDAwLCAweDAwMDA4MDAwLAorCQkJCQkweDAwMDEwMDAwLCAweDAwMDIwMDAwLCAweDAwMDQwMDAwLCAweDAwMDgwMDAwLAorCQkJCQkweDAwMTAwMDAwLCAweDAwMjAwMDAwLCAweDAwNDAwMDAwLCAweDAwODAwMDAwLAorCQkJCQkweDAxMDAwMDAwLCAweDAyMDAwMDAwLCAweDA0MDAwMDAwLCAweDA4MDAwMDAwLAorCQkJCQkweDEwMDAwMDAwLCAweDIwMDAwMDAwLCAweDQwMDAwMDAwLCAweDgwMDAwMDAwfTsKKworY2hhciogICBDaXBoZXJOYW1lW10gPSB7Im5vbmUiLCJ3ZXA2NCIsIndlcDEyOCIsIlRLSVAiLCJBRVMiLCJDS0lQNjQiLCJDS0lQMTI4In07CisKK2NvbnN0IHVuc2lnbmVkIHNob3J0IGNjaXR0XzE2VGFibGVbXSA9IHsKKwkweDAwMDAsIDB4MTAyMSwgMHgyMDQyLCAweDMwNjMsIDB4NDA4NCwgMHg1MEE1LCAweDYwQzYsIDB4NzBFNywKKwkweDgxMDgsIDB4OTEyOSwgMHhBMTRBLCAweEIxNkIsIDB4QzE4QywgMHhEMUFELCAweEUxQ0UsIDB4RjFFRiwKKwkweDEyMzEsIDB4MDIxMCwgMHgzMjczLCAweDIyNTIsIDB4NTJCNSwgMHg0Mjk0LCAweDcyRjcsIDB4NjJENiwKKwkweDkzMzksIDB4ODMxOCwgMHhCMzdCLCAweEEzNUEsIDB4RDNCRCwgMHhDMzlDLCAweEYzRkYsIDB4RTNERSwKKwkweDI0NjIsIDB4MzQ0MywgMHgwNDIwLCAweDE0MDEsIDB4NjRFNiwgMHg3NEM3LCAweDQ0QTQsIDB4NTQ4NSwKKwkweEE1NkEsIDB4QjU0QiwgMHg4NTI4LCAweDk1MDksIDB4RTVFRSwgMHhGNUNGLCAweEM1QUMsIDB4RDU4RCwKKwkweDM2NTMsIDB4MjY3MiwgMHgxNjExLCAweDA2MzAsIDB4NzZENywgMHg2NkY2LCAweDU2OTUsIDB4NDZCNCwKKwkweEI3NUIsIDB4QTc3QSwgMHg5NzE5LCAweDg3MzgsIDB4RjdERiwgMHhFN0ZFLCAweEQ3OUQsIDB4QzdCQywKKwkweDQ4QzQsIDB4NThFNSwgMHg2ODg2LCAweDc4QTcsIDB4MDg0MCwgMHgxODYxLCAweDI4MDIsIDB4MzgyMywKKwkweEM5Q0MsIDB4RDlFRCwgMHhFOThFLCAweEY5QUYsIDB4ODk0OCwgMHg5OTY5LCAweEE5MEEsIDB4QjkyQiwKKwkweDVBRjUsIDB4NEFENCwgMHg3QUI3LCAweDZBOTYsIDB4MUE3MSwgMHgwQTUwLCAweDNBMzMsIDB4MkExMiwKKwkweERCRkQsIDB4Q0JEQywgMHhGQkJGLCAweEVCOUUsIDB4OUI3OSwgMHg4QjU4LCAweEJCM0IsIDB4QUIxQSwKKwkweDZDQTYsIDB4N0M4NywgMHg0Q0U0LCAweDVDQzUsIDB4MkMyMiwgMHgzQzAzLCAweDBDNjAsIDB4MUM0MSwKKwkweEVEQUUsIDB4RkQ4RiwgMHhDREVDLCAweEREQ0QsIDB4QUQyQSwgMHhCRDBCLCAweDhENjgsIDB4OUQ0OSwKKwkweDdFOTcsIDB4NkVCNiwgMHg1RUQ1LCAweDRFRjQsIDB4M0UxMywgMHgyRTMyLCAweDFFNTEsIDB4MEU3MCwKKwkweEZGOUYsIDB4RUZCRSwgMHhERkRELCAweENGRkMsIDB4QkYxQiwgMHhBRjNBLCAweDlGNTksIDB4OEY3OCwKKwkweDkxODgsIDB4ODFBOSwgMHhCMUNBLCAweEExRUIsIDB4RDEwQywgMHhDMTJELCAweEYxNEUsIDB4RTE2RiwKKwkweDEwODAsIDB4MDBBMSwgMHgzMEMyLCAweDIwRTMsIDB4NTAwNCwgMHg0MDI1LCAweDcwNDYsIDB4NjA2NywKKwkweDgzQjksIDB4OTM5OCwgMHhBM0ZCLCAweEIzREEsIDB4QzMzRCwgMHhEMzFDLCAweEUzN0YsIDB4RjM1RSwKKwkweDAyQjEsIDB4MTI5MCwgMHgyMkYzLCAweDMyRDIsIDB4NDIzNSwgMHg1MjE0LCAweDYyNzcsIDB4NzI1NiwKKwkweEI1RUEsIDB4QTVDQiwgMHg5NUE4LCAweDg1ODksIDB4RjU2RSwgMHhFNTRGLCAweEQ1MkMsIDB4QzUwRCwKKwkweDM0RTIsIDB4MjRDMywgMHgxNEEwLCAweDA0ODEsIDB4NzQ2NiwgMHg2NDQ3LCAweDU0MjQsIDB4NDQwNSwKKwkweEE3REIsIDB4QjdGQSwgMHg4Nzk5LCAweDk3QjgsIDB4RTc1RiwgMHhGNzdFLCAweEM3MUQsIDB4RDczQywKKwkweDI2RDMsIDB4MzZGMiwgMHgwNjkxLCAweDE2QjAsIDB4NjY1NywgMHg3Njc2LCAweDQ2MTUsIDB4NTYzNCwKKwkweEQ5NEMsIDB4Qzk2RCwgMHhGOTBFLCAweEU5MkYsIDB4OTlDOCwgMHg4OUU5LCAweEI5OEEsIDB4QTlBQiwKKwkweDU4NDQsIDB4NDg2NSwgMHg3ODA2LCAweDY4MjcsIDB4MThDMCwgMHgwOEUxLCAweDM4ODIsIDB4MjhBMywKKwkweENCN0QsIDB4REI1QywgMHhFQjNGLCAweEZCMUUsIDB4OEJGOSwgMHg5QkQ4LCAweEFCQkIsIDB4QkI5QSwKKwkweDRBNzUsIDB4NUE1NCwgMHg2QTM3LCAweDdBMTYsIDB4MEFGMSwgMHgxQUQwLCAweDJBQjMsIDB4M0E5MiwKKwkweEZEMkUsIDB4RUQwRiwgMHhERDZDLCAweENENEQsIDB4QkRBQSwgMHhBRDhCLCAweDlERTgsIDB4OERDOSwKKwkweDdDMjYsIDB4NkMwNywgMHg1QzY0LCAweDRDNDUsIDB4M0NBMiwgMHgyQzgzLCAweDFDRTAsIDB4MENDMSwKKwkweEVGMUYsIDB4RkYzRSwgMHhDRjVELCAweERGN0MsIDB4QUY5QiwgMHhCRkJBLCAweDhGRDksIDB4OUZGOCwKKwkweDZFMTcsIDB4N0UzNiwgMHg0RTU1LCAweDVFNzQsIDB4MkU5MywgMHgzRUIyLCAweDBFRDEsIDB4MUVGMAorfTsKKyNkZWZpbmUgQnl0ZUNSQzE2KHYsIGNyYykgXAorCSh1bnNpZ25lZCBzaG9ydCkoKGNyYyA8PCA4KSBeICBjY2l0dF8xNlRhYmxlWygoY3JjID4+IDgpIF4gKHYpKSAmIDI1NV0pCisKKy8vCisvLyBCQlAgcmVnaXN0ZXIgaW5pdGlhbGl6YXRpb24gc2V0CisvLworUkVHX1BBSVIgICBCQlBSZWdUYWJsZVtdID0geworCXtCQlBfUjY1LAkJMHgyQ30sCQkvLyBmaXggcnNzaSBpc3N1ZQorCXtCQlBfUjY2LAkJMHgzOH0sCS8vIEFsc28gc2V0IHRoaXMgZGVmYXVsdCB2YWx1ZSB0byBwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUgYXQgaW5pdGlhbAorCXtCQlBfUjY5LAkJMHgxMn0sCisJe0JCUF9SNzAsCQkweGF9LAkvLyBCQlBfUjcwIHdpbGwgY2hhbmdlIHRvIDB4OCBpbiBBcFN0YXJ0VXAgYW5kIExpbmtVcCBmb3IgcnQyODYwQywgb3RoZXJ3aXNlIHZhbHVlIGlzIDB4YQorCXtCQlBfUjczLAkJMHgxMH0sCisJe0JCUF9SODEsCQkweDM3fSwKKwl7QkJQX1I4MiwJCTB4NjJ9LAorCXtCQlBfUjgzLAkJMHg2QX0sCisJe0JCUF9SODQsCQkweDk5fSwJLy8gMHgxOSBpcyBmb3IgcnQyODYwRSBhbmQgYWZ0ZXIuIFRoaXMgaXMgZm9yIGV4dGVuc2lvbiBjaGFubmVsIG92ZXJsYXBwaW5nIElPVC4gMHg5OSBpcyBmb3IgcnQyODYwRCBhbmQgYmVmb3JlCisJe0JCUF9SODYsCQkweDAwfSwJLy8gbWlkZGxlIHJhbmdlIGlzc3VlLCBSb3J5IEAyMDA4LTAxLTI4CisJe0JCUF9SOTEsCQkweDA0fSwJLy8gbWlkZGxlIHJhbmdlIGlzc3VlLCBSb3J5IEAyMDA4LTAxLTI4CisJe0JCUF9SOTIsCQkweDAwfSwJLy8gbWlkZGxlIHJhbmdlIGlzc3VlLCBSb3J5IEAyMDA4LTAxLTI4CisJe0JCUF9SMTAzLCAgCTB4MDB9LCAJLy8gbmVhciByYW5nZSBoaWdoLXBvd2VyIGlzc3VlLCByZXF1ZXN0ZWQgZnJvbSBHYXJ5IEAyMDA4LTA1MjgKKwl7QkJQX1IxMDUsCQkweDA1fSwJLy8gMHgwNSBpcyBmb3IgcnQyODYwRSB0byB0dXJuIG9uIEZFUSBjb250cm9sLiBJdCBpcyBzYWZlIGZvciBydDI4NjBEIGFuZCBiZWZvcmUsIGJlY2F1c2UgQml0IDc6MiBhcmUgcmVzZXJ2ZWQgaW4gcnQyODYwRCBhbmQgYmVmb3JlLgorfTsKKyNkZWZpbmUJTlVNX0JCUF9SRUdfUEFSTVMJKHNpemVvZihCQlBSZWdUYWJsZSkgLyBzaXplb2YoUkVHX1BBSVIpKQorCisvLworLy8gUkYgcmVnaXN0ZXIgaW5pdGlhbGl6YXRpb24gc2V0CisvLworCisvLworLy8gQVNJQyByZWdpc3RlciBpbml0aWFsaXphdGlvbiBzZXRzCisvLworCitSVE1QX1JFR19QQUlSCU1BQ1JlZ1RhYmxlW10gPQl7CisjaWYgZGVmaW5lZChIV19CRUFDT05fT0ZGU0VUKSAmJiAoSFdfQkVBQ09OX09GRlNFVCA9PSAweDIwMCkKKwl7QkNOX09GRlNFVDAsCQkJMHhmOGYwZThlMH0sIC8qIDB4MzgwMChlMCksIDB4M0EwMChlOCksIDB4M0MwMChmMCksIDB4M0UwMChmOCksIDUxMkIgZm9yIGVhY2ggYmVhY29uICovCisJe0JDTl9PRkZTRVQxLAkJCTB4NmY3N2QwYzh9LCAvKiAweDMyMDAoYzgpLCAweDM0MDAoZDApLCAweDFEQzAoNzcpLCAweDFCQzAoNmYpLCA1MTJCIGZvciBlYWNoIGJlYWNvbiAqLworI2VsaWYgZGVmaW5lZChIV19CRUFDT05fT0ZGU0VUKSAmJiAoSFdfQkVBQ09OX09GRlNFVCA9PSAweDEwMCkKKwl7QkNOX09GRlNFVDAsCQkJMHhlY2U4ZTRlMH0sIC8qIDB4MzgwMCwgMHgzQTAwLCAweDNDMDAsIDB4M0UwMCwgNTEyQiBmb3IgZWFjaCBiZWFjb24gKi8KKwl7QkNOX09GRlNFVDEsCQkJMHhmY2Y4ZjRmMH0sIC8qIDB4MzgwMCwgMHgzQTAwLCAweDNDMDAsIDB4M0UwMCwgNTEyQiBmb3IgZWFjaCBiZWFjb24gKi8KKyNlbHNlCisgICAgI2Vycm9yIFlvdSBtdXN0IHJlLWNhbGN1bGF0ZSBuZXcgdmFsdWUgZm9yIEJDTl9PRkZTRVQwICYgQkNOX09GRlNFVDEgaW4gTUFDUmVnVGFibGVbXSEhIQorI2VuZGlmIC8vIEhXX0JFQUNPTl9PRkZTRVQgLy8KKworCXtMRUdBQ1lfQkFTSUNfUkFURSwJCTB4MDAwMDAxM2Z9LCAvLyAgQmFzaWMgcmF0ZSBzZXQgYml0bWFwCisJe0hUX0JBU0lDX1JBVEUsCQkweDAwMDA4MDAzfSwgLy8gQmFzaWMgSFQgcmF0ZSBzZXQgLCAyME0sIE1DUz0zLCBNTS4gRm9ybWF0IGlzIHRoZSBzYW1lIGFzIGluIFRYV0kuCisJe01BQ19TWVNfQ1RSTCwJCTB4MDB9LCAvLyAweDEwMDQsICwgZGVmYXVsdCBEaXNhYmxlIFJYCisJe1JYX0ZJTFRSX0NGRywJCTB4MTdmOTd9LCAvLzB4MTQwMCAgLCBSWCBmaWx0ZXIgY29udHJvbCwKKwl7QktPRkZfU0xPVF9DRkcsCTB4MjA5fSwgLy8gZGVmYXVsdCBzZXQgc2hvcnQgc2xvdCB0aW1lLCBDQ19ERUxBWV9USU1FIHNob3VsZCBiZSAyCisJe1RYX1NXX0NGRzAsCQkweDB9LCAJCS8vIEdhcnksMjAwOC0wNS0yMSBmb3IgQ1dDIHRlc3QKKwl7VFhfU1dfQ0ZHMSwJCTB4ODA2MDZ9LCAvLyBHYXJ5LDIwMDYtMDgtMjMKKwl7VFhfTElOS19DRkcsCQkweDEwMjB9LAkJLy8gR2FyeSwyMDA2LTA4LTIzCisJe1RYX1RJTUVPVVRfQ0ZHLAkweDAwMGEyMDkwfSwJLy8gQ0NLIGhhcyBzb21lIHByb2JsZW0uIFNvIGluY3JlYXNlIHRpbWllb3V0IHZhbHVlLiAyMDA2LTEwLTA5Ly8gTUFydmVrIFJUICwgTW9kaWZ5IGZvciAyODYwRSAsMjAwNy0wOC0wMQorCXtNQVhfTEVOX0NGRywJCU1BWF9BR0dSRUdBVElPTl9TSVpFIHwgMHgwMDAwMTAwMH0sCS8vIDB4MzAxOCwgTUFYIGZyYW1lIGxlbmd0aC4gTWF4IFBTRFUgPSAxNmtieXRlcy4KKwl7TEVEX0NGRywJCTB4N2YwMzFlNDZ9LCAvLyBHYXJ5LCAyMDA2LTA4LTIzCisJe1BCRl9NQVhfUENOVCwJCQkweDFGM0ZCRjlGfSwgCS8vMHgxRjNmN2Y5Zn0sCQkvL0phbiwgMjAwNi8wNC8yMAorCXtUWF9SVFlfQ0ZHLAkJCTB4NDdkMDFmMGZ9LAkvLyBKYW4sIDIwMDYvMTEvMTYsIFNldCBUeFdJLT5BQ0sgPTAgaW4gUHJvYmUgUnNwIE1vZGlmeSBmb3IgMjg2MEUgLDIwMDctMDgtMDMKKwl7QVVUT19SU1BfQ0ZHLAkJCTB4MDAwMDAwMTN9LAkvLyBJbml0aWFsIEF1dG9fUmVzcG9uZGVyLCBiZWNhdXNlIFFBIHdpbGwgdHVybiBvZmYgQXV0by1SZXNwb25kZXIKKwl7Q0NLX1BST1RfQ0ZHLAkJCTB4MDU3NDAwMDMgLyoweDAxNzQwMDAzKi99LAkvLyBJbml0aWFsIEF1dG9fUmVzcG9uZGVyLCBiZWNhdXNlIFFBIHdpbGwgdHVybiBvZmYgQXV0by1SZXNwb25kZXIuIEFuZCBSVFMgdGhyZXNob2xkIGlzIGVuYWJsZWQuCisJe09GRE1fUFJPVF9DRkcsCQkJMHgwNTc0MDAwMyAvKjB4MDE3NDAwMDMqL30sCS8vIEluaXRpYWwgQXV0b19SZXNwb25kZXIsIGJlY2F1c2UgUUEgd2lsbCB0dXJuIG9mZiBBdXRvLVJlc3BvbmRlci4gQW5kIFJUUyB0aHJlc2hvbGQgaXMgZW5hYmxlZC4KKwl7R0YyMF9QUk9UX0NGRywJCQkweDAxNzQ0MDA0fSwgICAgLy8gc2V0IDE5OjE4IC0tPiBTaG9ydCBOQVYgZm9yIE1JTU8gUFMKKwl7R0Y0MF9QUk9UX0NGRywJCQkweDAzRjQ0MDg0fSwKKwl7TU0yMF9QUk9UX0NGRywJCQkweDAxNzQ0MDA0fSwKKyNpZmRlZiBSVDI4NjAKKwl7TU00MF9QUk9UX0NGRywJCQkweDAzRjU0MDg0fSwKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwl7VFhPUF9DVFJMX0NGRywJCQkweDAwMDA1ODNmLCAvKjB4MDAwMDI0M2YqLyAvKjB4MDAwMDI0YmYqL30sCS8vRXh0ZW5zaW9uIGNoYW5uZWwgYmFja29mZi4KKwl7VFhfUlRTX0NGRywJCQkweDAwMDkyYjIwfSwKKwl7RVhQX0FDS19USU1FLAkJCTB4MDAyNDAwY2F9LAkvLyBkZWZhdWx0IHZhbHVlCisJe1RYT1BfSExEUl9FVCwgCQkJMHgwMDAwMDAwMn0sCisKKwkvKiBKZXJyeSBjb21tZW50cyAyMDA4LzAxLzE2OiB3ZSB1c2UgU0lGUyA9IDEwdXMgaW4gQ0NLIGRlZmF1bHRseSwgYnV0IGl0IHNlZW1zIHRoYXQgMTB1cworCQlpcyB0b28gc21hbGwgZm9yIElOVEVMIDIyMDBiZyBjYXJkLCBzbyBpbiBNQlNTIG1vZGUsIHRoZSBkZWx0YSB0aW1lIGJldHdlZW4gYmVhY29uMAorCQlhbmQgYmVhY29uMSBpcyBTSUZTICgxMHVzKSwgc28gaWYgSU5URUwgMjIwMGJnIGNhcmQgY29ubmVjdHMgdG8gQlNTMCwgdGhlIHBpbmcKKwkJd2lsbCBhbHdheXMgbG9zdC4gU28gd2UgY2hhbmdlIHRoZSBTSUZTIG9mIENDSyBmcm9tIDEwdXMgdG8gMTZ1cy4gKi8KKwl7WElGU19USU1FX0NGRywJCQkweDMzYTQxMDEwfSwKKwl7UFdSX1BJTl9DRkcsCQkJMHgwMDAwMDAwM30sCS8vIHBhdGNoIGZvciAyODgwLUUKK307CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorUlRNUF9SRUdfUEFJUglTVEFNQUNSZWdUYWJsZVtdID0JeworCXtXTU1fQUlGU05fQ0ZHLAkJMHgwMDAwMjI3M30sCisJe1dNTV9DV01JTl9DRkcsCTB4MDAwMDIzNDR9LAorCXtXTU1fQ1dNQVhfQ0ZHLAkweDAwMDAzNGFhfSwKK307CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNkZWZpbmUJTlVNX01BQ19SRUdfUEFSTVMJCShzaXplb2YoTUFDUmVnVGFibGUpIC8gc2l6ZW9mKFJUTVBfUkVHX1BBSVIpKQorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2RlZmluZQlOVU1fU1RBX01BQ19SRUdfUEFSTVMJKHNpemVvZihTVEFNQUNSZWdUYWJsZSkgLyBzaXplb2YoUlRNUF9SRUdfUEFJUikpCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworLy8gTmV3IDhrIGJ5dGUgZmlybXdhcmUgc2l6ZSBmb3IgUlQzMDcxL1JUMzA3MgorI2RlZmluZSBGSVJNV0FSRUlNQUdFX01BWF9MRU5HVEgJMHgyMDAwCisjZGVmaW5lIEZJUk1XQVJFSU1BR0VfTEVOR1RICQkoc2l6ZW9mIChGaXJtd2FyZUltYWdlKSAvIHNpemVvZihVQ0hBUikpCisjZGVmaW5lIEZJUk1XQVJFX01BSk9SX1ZFUlNJT04JMAorCisjZGVmaW5lIEZJUk1XQVJFSU1BR0VWMV9MRU5HVEgJMHgxMDAwCisjZGVmaW5lIEZJUk1XQVJFSU1BR0VWMl9MRU5HVEgJMHgxMDAwCisKKyNpZmRlZiBSVDI4NjAKKyNkZWZpbmUgRklSTVdBUkVfTUlOT1JfVkVSU0lPTgkyCisjZW5kaWYgLy8gUlQyODYwIC8vCisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUFsbG9jYXRlIFJUTVBfQURBUFRFUiBkYXRhIGJsb2NrIGFuZCBkbyBzb21lIGluaXRpYWxpemF0aW9uCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTkRJU19TVEFUVVNfU1VDQ0VTUworCQlORElTX1NUQVRVU19GQUlMVVJFCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTCVJUTVBBbGxvY0FkYXB0ZXJCbG9jaygKKwlJTiAgUFZPSUQJaGFuZGxlLAorCU9VVAlQUlRNUF9BREFQVEVSCSpwcEFkYXB0ZXIpCit7CisJUFJUTVBfQURBUFRFUglwQWQ7CisJTkRJU19TVEFUVVMJCVN0YXR1czsKKwlJTlQgCQkJaW5kZXg7CisJVUNIQVIJCQkqcEJlYWNvbkJ1ZiA9IE5VTEw7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gUlRNUEFsbG9jQWRhcHRlckJsb2NrXG4iKSk7CisKKwkqcHBBZGFwdGVyID0gTlVMTDsKKworCWRvCisJeworCQkvLyBBbGxvY2F0ZSBSVE1QX0FEQVBURVIgbWVtb3J5IGJsb2NrCisJCXBCZWFjb25CdWYgPSBrbWFsbG9jKE1BWF9CRUFDT05fU0laRSwgTUVNX0FMTE9DX0ZMQUcpOworCQlpZiAocEJlYWNvbkJ1ZiA9PSBOVUxMKQorCQl7CisJCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSAtIEJlYWNvbkJ1ZiFcbiIpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJU3RhdHVzID0gQWRhcHRlckJsb2NrQWxsb2NhdGVNZW1vcnkoaGFuZGxlLCAoUFZPSUQgKikmcEFkKTsKKwkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQlEQkdQUklOVF9FUlIoKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IC0gQURBUFRFUlxuIikpOworCQkJYnJlYWs7CisJCX0KKwkJcEFkLT5CZWFjb25CdWYgPSBwQmVhY29uQnVmOworCQlwcmludGsoIlxuXG49PT0gcEFkID0gJXAsIHNpemUgPSAlZCA9PT1cblxuIiwgcEFkLCAoVUlOVDMyKXNpemVvZihSVE1QX0FEQVBURVIpKTsKKworCisJCS8vIEluaXQgc3BpbiBsb2NrcworCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5NZ210UmluZ0xvY2spOworI2lmZGVmIFJUMjg2MAorCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5SeFJpbmdMb2NrKTsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCQlmb3IgKGluZGV4ID0wIDsgaW5kZXggPCBOVU1fT0ZfVFhfUklORzsgaW5kZXgrKykKKwkJeworCQkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+VHhTd1F1ZXVlTG9ja1tpbmRleF0pOworCQkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+RGVRdWV1ZUxvY2tbaW5kZXhdKTsKKwkJCXBBZC0+RGVRdWV1ZVJ1bm5pbmdbaW5kZXhdID0gRkFMU0U7CisJCX0KKworCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5pcnFfbG9jayk7CisKKwl9IHdoaWxlIChGQUxTRSk7CisKKwlpZiAoKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSAmJiAocEJlYWNvbkJ1ZikpCisJCWtmcmVlKHBCZWFjb25CdWYpOworCisJKnBwQWRhcHRlciA9IHBBZDsKKworCURCR1BSSU5UX1MoU3RhdHVzLCAoIjwtLSBSVE1QQWxsb2NBZGFwdGVyQmxvY2ssIFN0YXR1cz0leFxuIiwgU3RhdHVzKSk7CisJcmV0dXJuIFN0YXR1czsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJlYWQgaW5pdGlhbCBUeCBwb3dlciBwZXIgTUNTIGFuZCBCVyBmcm9tIEVFUFJPTQorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFJlYWRUeFB3clBlclJhdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJVUxPTkcJCWRhdGEsIEFkYXRhLCBHZGF0YTsKKwlVU0hPUlQJCWksIHZhbHVlLCB2YWx1ZTI7CisJSU5UCQkJQXB3cmRlbHRhLCBHcHdyZGVsdGE7CisJVUNIQVIJCXQxLHQyLHQzLHQ0OworCUJPT0xFQU4JCWJWYWxpZCwgYkFwd3JkZWx0YU1pbnVzID0gVFJVRSwgYkdwd3JkZWx0YU1pbnVzID0gVFJVRTsKKworCS8vCisJLy8gR2V0IHBvd2VyIGRlbHRhIGZvciAyME1IeiBhbmQgNDBNSHouCisJLy8KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUeHBvd2VyIHBlciBSYXRlXG4iKSk7CisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9ERUxUQSwgdmFsdWUyKTsKKwlBcHdyZGVsdGEgPSAwOworCUdwd3JkZWx0YSA9IDA7CisKKwlpZiAoKHZhbHVlMiAmIDB4ZmYpICE9IDB4ZmYpCisJeworCQlpZiAoKHZhbHVlMiAmIDB4ODApKQorCQkJR3B3cmRlbHRhID0gKHZhbHVlMiYweGYpOworCisJCWlmICgodmFsdWUyICYgMHg0MCkpCisJCQliR3B3cmRlbHRhTWludXMgPSBGQUxTRTsKKwkJZWxzZQorCQkJYkdwd3JkZWx0YU1pbnVzID0gVFJVRTsKKwl9CisJaWYgKCh2YWx1ZTIgJiAweGZmMDApICE9IDB4ZmYwMCkKKwl7CisJCWlmICgodmFsdWUyICYgMHg4MDAwKSkKKwkJCUFwd3JkZWx0YSA9ICgodmFsdWUyJjB4ZjAwKT4+OCk7CisKKwkJaWYgKCh2YWx1ZTIgJiAweDQwMDApKQorCQkJYkFwd3JkZWx0YU1pbnVzID0gRkFMU0U7CisJCWVsc2UKKwkJCWJBcHdyZGVsdGFNaW51cyA9IFRSVUU7CisJfQorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkdwd3JkZWx0YSA9ICV4LCBBcHdyZGVsdGEgPSAleCAuXG4iLCBHcHdyZGVsdGEsIEFwd3JkZWx0YSkpOworCisJLy8KKwkvLyBHZXQgVHhwb3dlciBwZXIgTUNTIGZvciAyME1IeiBpbiAyLjRHLgorCS8vCisJZm9yIChpPTA7IGk8NTsgaSsrKQorCXsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfMl80RyArIGkqNCwgdmFsdWUpOworCQlkYXRhID0gdmFsdWU7CisJCWlmIChiQXB3cmRlbHRhTWludXMgPT0gRkFMU0UpCisJCXsKKwkJCXQxID0gKHZhbHVlJjB4ZikrKEFwd3JkZWx0YSk7CisJCQlpZiAodDEgPiAweGYpCisJCQkJdDEgPSAweGY7CisJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhBcHdyZGVsdGEpOworCQkJaWYgKHQyID4gMHhmKQorCQkJCXQyID0gMHhmOworCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEFwd3JkZWx0YSk7CisJCQlpZiAodDMgPiAweGYpCisJCQkJdDMgPSAweGY7CisJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhBcHdyZGVsdGEpOworCQkJaWYgKHQ0ID4gMHhmKQorCQkJCXQ0ID0gMHhmOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKCh2YWx1ZSYweGYpID4gQXB3cmRlbHRhKQorCQkJCXQxID0gKHZhbHVlJjB4ZiktKEFwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDEgPSAwOworCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gQXB3cmRlbHRhKQorCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEFwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDIgPSAwOworCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEFwd3JkZWx0YSkKKwkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oQXB3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0MyA9IDA7CisJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBBcHdyZGVsdGEpCisJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oQXB3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0NCA9IDA7CisJCX0KKwkJQWRhdGEgPSB0MSArICh0Mjw8NCkgKyAodDM8PDgpICsgKHQ0PDwxMik7CisJCWlmIChiR3B3cmRlbHRhTWludXMgPT0gRkFMU0UpCisJCXsKKwkJCXQxID0gKHZhbHVlJjB4ZikrKEdwd3JkZWx0YSk7CisJCQlpZiAodDEgPiAweGYpCisJCQkJdDEgPSAweGY7CisJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhHcHdyZGVsdGEpOworCQkJaWYgKHQyID4gMHhmKQorCQkJCXQyID0gMHhmOworCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEdwd3JkZWx0YSk7CisJCQlpZiAodDMgPiAweGYpCisJCQkJdDMgPSAweGY7CisJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhHcHdyZGVsdGEpOworCQkJaWYgKHQ0ID4gMHhmKQorCQkJCXQ0ID0gMHhmOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKCh2YWx1ZSYweGYpID4gR3B3cmRlbHRhKQorCQkJCXQxID0gKHZhbHVlJjB4ZiktKEdwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDEgPSAwOworCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gR3B3cmRlbHRhKQorCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEdwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDIgPSAwOworCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEdwd3JkZWx0YSkKKwkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oR3B3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0MyA9IDA7CisJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBHcHdyZGVsdGEpCisJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oR3B3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0NCA9IDA7CisJCX0KKwkJR2RhdGEgPSB0MSArICh0Mjw8NCkgKyAodDM8PDgpICsgKHQ0PDwxMik7CisKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfMl80RyArIGkqNCArIDIsIHZhbHVlKTsKKwkJaWYgKGJBcHdyZGVsdGFNaW51cyA9PSBGQUxTRSkKKwkJeworCQkJdDEgPSAodmFsdWUmMHhmKSsoQXB3cmRlbHRhKTsKKwkJCWlmICh0MSA+IDB4ZikKKwkJCQl0MSA9IDB4ZjsKKwkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCkrKEFwd3JkZWx0YSk7CisJCQlpZiAodDIgPiAweGYpCisJCQkJdDIgPSAweGY7CisJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KSsoQXB3cmRlbHRhKTsKKwkJCWlmICh0MyA+IDB4ZikKKwkJCQl0MyA9IDB4ZjsKKwkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMikrKEFwd3JkZWx0YSk7CisJCQlpZiAodDQgPiAweGYpCisJCQkJdDQgPSAweGY7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoKHZhbHVlJjB4ZikgPiBBcHdyZGVsdGEpCisJCQkJdDEgPSAodmFsdWUmMHhmKS0oQXB3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0MSA9IDA7CisJCQlpZiAoKCh2YWx1ZSYweGYwKT4+NCkgPiBBcHdyZGVsdGEpCisJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oQXB3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0MiA9IDA7CisJCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gQXB3cmRlbHRhKQorCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpLShBcHdyZGVsdGEpOworCQkJZWxzZQorCQkJCXQzID0gMDsKKwkJCWlmICgoKHZhbHVlJjB4ZjAwMCk+PjEyKSA+IEFwd3JkZWx0YSkKKwkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpLShBcHdyZGVsdGEpOworCQkJZWxzZQorCQkJCXQ0ID0gMDsKKwkJfQorCQlBZGF0YSB8PSAoKHQxPDwxNikgKyAodDI8PDIwKSArICh0Mzw8MjQpICsgKHQ0PDwyOCkpOworCQlpZiAoYkdwd3JkZWx0YU1pbnVzID09IEZBTFNFKQorCQl7CisJCQl0MSA9ICh2YWx1ZSYweGYpKyhHcHdyZGVsdGEpOworCQkJaWYgKHQxID4gMHhmKQorCQkJCXQxID0gMHhmOworCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoR3B3cmRlbHRhKTsKKwkJCWlmICh0MiA+IDB4ZikKKwkJCQl0MiA9IDB4ZjsKKwkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhHcHdyZGVsdGEpOworCQkJaWYgKHQzID4gMHhmKQorCQkJCXQzID0gMHhmOworCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoR3B3cmRlbHRhKTsKKwkJCWlmICh0NCA+IDB4ZikKKwkJCQl0NCA9IDB4ZjsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmICgodmFsdWUmMHhmKSA+IEdwd3JkZWx0YSkKKwkJCQl0MSA9ICh2YWx1ZSYweGYpLShHcHdyZGVsdGEpOworCQkJZWxzZQorCQkJCXQxID0gMDsKKwkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEdwd3JkZWx0YSkKKwkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShHcHdyZGVsdGEpOworCQkJZWxzZQorCQkJCXQyID0gMDsKKwkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBHcHdyZGVsdGEpCisJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEdwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDMgPSAwOworCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gR3B3cmRlbHRhKQorCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEdwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDQgPSAwOworCQl9CisJCUdkYXRhIHw9ICgodDE8PDE2KSArICh0Mjw8MjApICsgKHQzPDwyNCkgKyAodDQ8PDI4KSk7CisJCWRhdGEgfD0gKHZhbHVlPDwxNik7CisKKwkJcEFkLT5UeDIwTVB3ckNmZ0FCYW5kW2ldID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kW2ldID0gQWRhdGE7CisJCXBBZC0+VHgyME1Qd3JDZmdHQmFuZFtpXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFtpXSA9IEdkYXRhOworCisJCWlmIChkYXRhICE9IDB4ZmZmZmZmZmYpCisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QV1JfQ0ZHXzAgKyBpKjQsIGRhdGEpOworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiMjBNSHogQlcsIDIuNEcgYmFuZC0lbHgsICBBZGF0YSA9ICVseCwgIEdkYXRhID0gJWx4IFxuIiwgZGF0YSwgQWRhdGEsIEdkYXRhKSk7CisJfQorCisJLy8KKwkvLyBDaGVjayB0aGlzIGJsb2NrIGlzIHZhbGlkIGZvciA0ME1IeiBpbiAyLjRHLiBJZiBpbnZhbGlkLCB1c2UgcGFyYW1ldGVyIGZvciAyME1IeiBpbiAyLjRHCisJLy8KKwliVmFsaWQgPSBUUlVFOworCWZvciAoaT0wOyBpPDY7IGkrKykKKwl7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzQwTUhaXzJfNEcgKyAyICsgaSoyLCB2YWx1ZSk7CisJCWlmICgoKHZhbHVlICYgMHgwMEZGKSA9PSAweDAwRkYpIHx8ICgodmFsdWUgJiAweEZGMDApID09IDB4RkYwMCkpCisJCXsKKwkJCWJWYWxpZCA9IEZBTFNFOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvLworCS8vIEdldCBUeHBvd2VyIHBlciBNQ1MgZm9yIDQwTUh6IGluIDIuNEcuCisJLy8KKwlpZiAoYlZhbGlkKQorCXsKKwkJZm9yIChpPTA7IGk8NDsgaSsrKQorCQl7CisJCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0JZUkFURV80ME1IWl8yXzRHICsgaSo0LCB2YWx1ZSk7CisJCQlpZiAoYkdwd3JkZWx0YU1pbnVzID09IEZBTFNFKQorCQkJeworCQkJCXQxID0gKHZhbHVlJjB4ZikrKEdwd3JkZWx0YSk7CisJCQkJaWYgKHQxID4gMHhmKQorCQkJCQl0MSA9IDB4ZjsKKwkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhHcHdyZGVsdGEpOworCQkJCWlmICh0MiA+IDB4ZikKKwkJCQkJdDIgPSAweGY7CisJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEdwd3JkZWx0YSk7CisJCQkJaWYgKHQzID4gMHhmKQorCQkJCQl0MyA9IDB4ZjsKKwkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhHcHdyZGVsdGEpOworCQkJCWlmICh0NCA+IDB4ZikKKwkJCQkJdDQgPSAweGY7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKCh2YWx1ZSYweGYpID4gR3B3cmRlbHRhKQorCQkJCQl0MSA9ICh2YWx1ZSYweGYpLShHcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDEgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEdwd3JkZWx0YSkKKwkJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oR3B3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQyID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gR3B3cmRlbHRhKQorCQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oR3B3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQzID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBHcHdyZGVsdGEpCisJCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEdwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0NCA9IDA7CisJCQl9CisJCQlHZGF0YSA9IHQxICsgKHQyPDw0KSArICh0Mzw8OCkgKyAodDQ8PDEyKTsKKworCQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfNDBNSFpfMl80RyArIGkqNCArIDIsIHZhbHVlKTsKKwkJCWlmIChiR3B3cmRlbHRhTWludXMgPT0gRkFMU0UpCisJCQl7CisJCQkJdDEgPSAodmFsdWUmMHhmKSsoR3B3cmRlbHRhKTsKKwkJCQlpZiAodDEgPiAweGYpCisJCQkJCXQxID0gMHhmOworCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCkrKEdwd3JkZWx0YSk7CisJCQkJaWYgKHQyID4gMHhmKQorCQkJCQl0MiA9IDB4ZjsKKwkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KSsoR3B3cmRlbHRhKTsKKwkJCQlpZiAodDMgPiAweGYpCisJCQkJCXQzID0gMHhmOworCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMikrKEdwd3JkZWx0YSk7CisJCQkJaWYgKHQ0ID4gMHhmKQorCQkJCQl0NCA9IDB4ZjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAoKHZhbHVlJjB4ZikgPiBHcHdyZGVsdGEpCisJCQkJCXQxID0gKHZhbHVlJjB4ZiktKEdwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MSA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gR3B3cmRlbHRhKQorCQkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShHcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDIgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBHcHdyZGVsdGEpCisJCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpLShHcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDMgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjAwMCk+PjEyKSA+IEdwd3JkZWx0YSkKKwkJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oR3B3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQ0ID0gMDsKKwkJCX0KKwkJCUdkYXRhIHw9ICgodDE8PDE2KSArICh0Mjw8MjApICsgKHQzPDwyNCkgKyAodDQ8PDI4KSk7CisKKwkJCWlmIChpID09IDApCisJCQkJcEFkLT5UeDQwTVB3ckNmZ0dCYW5kW2krMV0gPSAocEFkLT5UeDQwTVB3ckNmZ0dCYW5kW2krMV0gJiAweDAwMDBGRkZGKSB8IChHZGF0YSAmIDB4RkZGRjAwMDApOworCQkJZWxzZQorCQkJCXBBZC0+VHg0ME1Qd3JDZmdHQmFuZFtpKzFdID0gR2RhdGE7CisKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCI0ME1IeiBCVywgMi40RyBiYW5kLCBHZGF0YSA9ICVseCBcbiIsIEdkYXRhKSk7CisJCX0KKwl9CisKKwkvLworCS8vIENoZWNrIHRoaXMgYmxvY2sgaXMgdmFsaWQgZm9yIDIwTUh6IGluIDVHLiBJZiBpbnZhbGlkLCB1c2UgcGFyYW1ldGVyIGZvciAyME1IeiBpbiAyLjRHCisJLy8KKwliVmFsaWQgPSBUUlVFOworCWZvciAoaT0wOyBpPDg7IGkrKykKKwl7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzIwTUhaXzVHICsgMiArIGkqMiwgdmFsdWUpOworCQlpZiAoKCh2YWx1ZSAmIDB4MDBGRikgPT0gMHgwMEZGKSB8fCAoKHZhbHVlICYgMHhGRjAwKSA9PSAweEZGMDApKQorCQl7CisJCQliVmFsaWQgPSBGQUxTRTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLy8KKwkvLyBHZXQgVHhwb3dlciBwZXIgTUNTIGZvciAyME1IeiBpbiA1Ry4KKwkvLworCWlmIChiVmFsaWQpCisJeworCQlmb3IgKGk9MDsgaTw1OyBpKyspCisJCXsKKwkJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzIwTUhaXzVHICsgaSo0LCB2YWx1ZSk7CisJCQlpZiAoYkFwd3JkZWx0YU1pbnVzID09IEZBTFNFKQorCQkJeworCQkJCXQxID0gKHZhbHVlJjB4ZikrKEFwd3JkZWx0YSk7CisJCQkJaWYgKHQxID4gMHhmKQorCQkJCQl0MSA9IDB4ZjsKKwkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MiA+IDB4ZikKKwkJCQkJdDIgPSAweGY7CisJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEFwd3JkZWx0YSk7CisJCQkJaWYgKHQzID4gMHhmKQorCQkJCQl0MyA9IDB4ZjsKKwkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0NCA+IDB4ZikKKwkJCQkJdDQgPSAweGY7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKCh2YWx1ZSYweGYpID4gQXB3cmRlbHRhKQorCQkJCQl0MSA9ICh2YWx1ZSYweGYpLShBcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDEgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEFwd3JkZWx0YSkKKwkJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQyID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gQXB3cmRlbHRhKQorCQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQzID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBBcHdyZGVsdGEpCisJCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0NCA9IDA7CisJCQl9CisJCQlBZGF0YSA9IHQxICsgKHQyPDw0KSArICh0Mzw8OCkgKyAodDQ8PDEyKTsKKworCQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfNUcgKyBpKjQgKyAyLCB2YWx1ZSk7CisJCQlpZiAoYkFwd3JkZWx0YU1pbnVzID09IEZBTFNFKQorCQkJeworCQkJCXQxID0gKHZhbHVlJjB4ZikrKEFwd3JkZWx0YSk7CisJCQkJaWYgKHQxID4gMHhmKQorCQkJCQl0MSA9IDB4ZjsKKwkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MiA+IDB4ZikKKwkJCQkJdDIgPSAweGY7CisJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEFwd3JkZWx0YSk7CisJCQkJaWYgKHQzID4gMHhmKQorCQkJCQl0MyA9IDB4ZjsKKwkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0NCA+IDB4ZikKKwkJCQkJdDQgPSAweGY7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKCh2YWx1ZSYweGYpID4gQXB3cmRlbHRhKQorCQkJCQl0MSA9ICh2YWx1ZSYweGYpLShBcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDEgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEFwd3JkZWx0YSkKKwkJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQyID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gQXB3cmRlbHRhKQorCQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQzID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBBcHdyZGVsdGEpCisJCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0NCA9IDA7CisJCQl9CisJCQlBZGF0YSB8PSAoKHQxPDwxNikgKyAodDI8PDIwKSArICh0Mzw8MjQpICsgKHQ0PDwyOCkpOworCisJCQlpZiAoaSA9PSAwKQorCQkJCXBBZC0+VHgyME1Qd3JDZmdBQmFuZFtpXSA9IChwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbaV0gJiAweDAwMDBGRkZGKSB8IChBZGF0YSAmIDB4RkZGRjAwMDApOworCQkJZWxzZQorCQkJCXBBZC0+VHgyME1Qd3JDZmdBQmFuZFtpXSA9IEFkYXRhOworCisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiMjBNSHogQlcsIDVHSHogYmFuZCwgQWRhdGEgPSAlbHggXG4iLCBBZGF0YSkpOworCQl9CisJfQorCisJLy8KKwkvLyBDaGVjayB0aGlzIGJsb2NrIGlzIHZhbGlkIGZvciA0ME1IeiBpbiA1Ry4gSWYgaW52YWxpZCwgdXNlIHBhcmFtZXRlciBmb3IgMjBNSHogaW4gMi40RworCS8vCisJYlZhbGlkID0gVFJVRTsKKwlmb3IgKGk9MDsgaTw2OyBpKyspCisJeworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0JZUkFURV80ME1IWl81RyArIDIgKyBpKjIsIHZhbHVlKTsKKwkJaWYgKCgodmFsdWUgJiAweDAwRkYpID09IDB4MDBGRikgfHwgKCh2YWx1ZSAmIDB4RkYwMCkgPT0gMHhGRjAwKSkKKwkJeworCQkJYlZhbGlkID0gRkFMU0U7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8vCisJLy8gR2V0IFR4cG93ZXIgcGVyIE1DUyBmb3IgNDBNSHogaW4gNUcuCisJLy8KKwlpZiAoYlZhbGlkKQorCXsKKwkJZm9yIChpPTA7IGk8NDsgaSsrKQorCQl7CisJCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0JZUkFURV80ME1IWl81RyArIGkqNCwgdmFsdWUpOworCQkJaWYgKGJBcHdyZGVsdGFNaW51cyA9PSBGQUxTRSkKKwkJCXsKKwkJCQl0MSA9ICh2YWx1ZSYweGYpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MSA+IDB4ZikKKwkJCQkJdDEgPSAweGY7CisJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDIgPiAweGYpCisJCQkJCXQyID0gMHhmOworCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MyA+IDB4ZikKKwkJCQkJdDMgPSAweGY7CisJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDQgPiAweGYpCisJCQkJCXQ0ID0gMHhmOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmICgodmFsdWUmMHhmKSA+IEFwd3JkZWx0YSkKKwkJCQkJdDEgPSAodmFsdWUmMHhmKS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQxID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwKT4+NCkgPiBBcHdyZGVsdGEpCisJCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MiA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEFwd3JkZWx0YSkKKwkJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MyA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gQXB3cmRlbHRhKQorCQkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpLShBcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDQgPSAwOworCQkJfQorCQkJQWRhdGEgPSB0MSArICh0Mjw8NCkgKyAodDM8PDgpICsgKHQ0PDwxMik7CisKKwkJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzQwTUhaXzVHICsgaSo0ICsgMiwgdmFsdWUpOworCQkJaWYgKGJBcHdyZGVsdGFNaW51cyA9PSBGQUxTRSkKKwkJCXsKKwkJCQl0MSA9ICh2YWx1ZSYweGYpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MSA+IDB4ZikKKwkJCQkJdDEgPSAweGY7CisJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDIgPiAweGYpCisJCQkJCXQyID0gMHhmOworCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MyA+IDB4ZikKKwkJCQkJdDMgPSAweGY7CisJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDQgPiAweGYpCisJCQkJCXQ0ID0gMHhmOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmICgodmFsdWUmMHhmKSA+IEFwd3JkZWx0YSkKKwkJCQkJdDEgPSAodmFsdWUmMHhmKS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQxID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwKT4+NCkgPiBBcHdyZGVsdGEpCisJCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MiA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEFwd3JkZWx0YSkKKwkJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MyA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gQXB3cmRlbHRhKQorCQkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpLShBcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDQgPSAwOworCQkJfQorCQkJQWRhdGEgfD0gKCh0MTw8MTYpICsgKHQyPDwyMCkgKyAodDM8PDI0KSArICh0NDw8MjgpKTsKKworCQkJaWYgKGkgPT0gMCkKKwkJCQlwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbaSsxXSA9IChwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbaSsxXSAmIDB4MDAwMEZGRkYpIHwgKEFkYXRhICYgMHhGRkZGMDAwMCk7CisJCQllbHNlCisJCQkJcEFkLT5UeDQwTVB3ckNmZ0FCYW5kW2krMV0gPSBBZGF0YTsKKworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIjQwTUh6IEJXLCA1R0h6IGJhbmQsIEFkYXRhID0gJWx4IFxuIiwgQWRhdGEpKTsKKwkJfQorCX0KK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUmVhZCBpbml0aWFsIGNoYW5uZWwgcG93ZXIgcGFyYW1ldGVycyBmcm9tIEVFUFJPTQorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFJlYWRDaGFubmVsUHdyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVVDSEFSCQkJCWksIGNob2Zmc2V0OworCUVFUFJPTV9UWF9QV1JfU1RSVUMJICAgIFBvd2VyOworCUVFUFJPTV9UWF9QV1JfU1RSVUMJICAgIFBvd2VyMjsKKworCS8vIFJlYWQgVHggcG93ZXIgdmFsdWUgZm9yIGFsbCBjaGFubmVscworCS8vIFZhbHVlIGZyb20gMSAtIDB4N2YuIERlZmF1bHQgdmFsdWUgaXMgMjQuCisJLy8gUG93ZXIgdmFsdWUgOiAyLjRHIDB4MDAgKDApIH4gMHgxRiAoMzEpCisJLy8gICAgICAgICAgICAgOiA1LjVHIDB4RjkgKC03KSB+IDB4MEYgKDE1KQorCisJLy8gMC4gMTFiL2csIGNoMSAtIGNoIDE0CisJZm9yIChpID0gMDsgaSA8IDc7IGkrKykKKwl7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0dfVFhfUFdSX09GRlNFVCArIGkgKiAyLCBQb3dlci53b3JkKTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fR19UWDJfUFdSX09GRlNFVCArIGkgKiAyLCBQb3dlcjIud29yZCk7CisJCXBBZC0+VHhQb3dlcltpICogMl0uQ2hhbm5lbCA9IGkgKiAyICsgMTsKKwkJcEFkLT5UeFBvd2VyW2kgKiAyICsgMV0uQ2hhbm5lbCA9IGkgKiAyICsgMjsKKworCQlpZiAoKFBvd2VyLmZpZWxkLkJ5dGUwID4gMzEpIHx8IChQb3dlci5maWVsZC5CeXRlMCA8IDApKQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyXS5Qb3dlciA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCWVsc2UKKwkJCXBBZC0+VHhQb3dlcltpICogMl0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMDsKKworCQlpZiAoKFBvd2VyLmZpZWxkLkJ5dGUxID4gMzEpIHx8IChQb3dlci5maWVsZC5CeXRlMSA8IDApKQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgMV0uUG93ZXIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQllbHNlCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyAxXS5Qb3dlciA9IFBvd2VyLmZpZWxkLkJ5dGUxOworCisJCWlmICgoUG93ZXIyLmZpZWxkLkJ5dGUwID4gMzEpIHx8IChQb3dlcjIuZmllbGQuQnl0ZTAgPCAwKSkKKwkJCXBBZC0+VHhQb3dlcltpICogMl0uUG93ZXIyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJZWxzZQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyXS5Qb3dlcjIgPSBQb3dlcjIuZmllbGQuQnl0ZTA7CisKKwkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTEgPiAzMSkgfHwgKFBvd2VyMi5maWVsZC5CeXRlMSA8IDApKQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgMV0uUG93ZXIyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJZWxzZQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgMV0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUxOworCX0KKworCS8vIDEuIFUtTklJIGxvd2VyL21pZGRsZSBiYW5kOiAzNiwgMzgsIDQwOyA0NCwgNDYsIDQ4OyA1MiwgNTQsIDU2OyA2MCwgNjIsIDY0IChpbmNsdWRpbmcgY2VudHJhbCBmcmVxdWVuY3kgaW4gQlcgNDBNSHopCisJLy8gMS4xIEZpbGwgdXAgY2hhbm5lbAorCWNob2Zmc2V0ID0gMTQ7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwl7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uQ2hhbm5lbAk9IDM2ICsgaSAqIDggKyAwOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uQ2hhbm5lbAk9IDM2ICsgaSAqIDggKyAyOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uQ2hhbm5lbAk9IDM2ICsgaSAqIDggKyA0OworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCX0KKworCS8vIDEuMiBGaWxsIHVwIHBvd2VyCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwl7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFhfUFdSX09GRlNFVCArIGkgKiAyLCBQb3dlci53b3JkKTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fQV9UWDJfUFdSX09GRlNFVCArIGkgKiAyLCBQb3dlcjIud29yZCk7CisKKwkJaWYgKChQb3dlci5maWVsZC5CeXRlMCA8IDE2KSAmJiAoUG93ZXIuZmllbGQuQnl0ZTAgPj0gLTcpKQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAwXS5Qb3dlciA9IFBvd2VyLmZpZWxkLkJ5dGUwOworCisJCWlmICgoUG93ZXIuZmllbGQuQnl0ZTEgPCAxNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUxID49IC03KSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMTsKKworCQlpZiAoKFBvd2VyMi5maWVsZC5CeXRlMCA8IDE2KSAmJiAoUG93ZXIyLmZpZWxkLkJ5dGUwID49IC03KSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUwOworCisJCWlmICgoUG93ZXIyLmZpZWxkLkJ5dGUxIDwgMTYpICYmIChQb3dlcjIuZmllbGQuQnl0ZTEgPj0gLTcpKQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAxXS5Qb3dlcjIgPSBQb3dlcjIuZmllbGQuQnl0ZTE7CisJfQorCisJLy8gMi4gSGlwcGVyTEFOIDIgMTAwLCAxMDIgLDEwNDsgMTA4LCAxMTAsIDExMjsgMTE2LCAxMTgsIDEyMDsgMTI0LCAxMjYsIDEyODsgMTMyLCAxMzQsIDEzNjsgMTQwIChpbmNsdWRpbmcgY2VudHJhbCBmcmVxdWVuY3kgaW4gQlcgNDBNSHopCisJLy8gMi4xIEZpbGwgdXAgY2hhbm5lbAorCWNob2Zmc2V0ID0gMTQgKyAxMjsKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCXsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5DaGFubmVsCT0gMTAwICsgaSAqIDggKyAwOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uQ2hhbm5lbAk9IDEwMCArIGkgKiA4ICsgMjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLkNoYW5uZWwJPSAxMDAgKyBpICogOCArIDQ7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJfQorCXBBZC0+VHhQb3dlclszICogNSArIGNob2Zmc2V0ICsgMF0uQ2hhbm5lbAkJPSAxNDA7CisJcEFkLT5UeFBvd2VyWzMgKiA1ICsgY2hvZmZzZXQgKyAwXS5Qb3dlcgkJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCXBBZC0+VHhQb3dlclszICogNSArIGNob2Zmc2V0ICsgMF0uUG93ZXIyCQk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisKKwkvLyAyLjIgRmlsbCB1cCBwb3dlcgorCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJeworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYX1BXUl9PRkZTRVQgKyAoY2hvZmZzZXQgLSAxNCkgKyBpICogMiwgUG93ZXIud29yZCk7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFgyX1BXUl9PRkZTRVQgKyAoY2hvZmZzZXQgLSAxNCkgKyBpICogMiwgUG93ZXIyLndvcmQpOworCisJCWlmICgoUG93ZXIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUwID49IC03KSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMDsKKworCQlpZiAoKFBvd2VyLmZpZWxkLkJ5dGUxIDwgMTYpICYmIChQb3dlci5maWVsZC5CeXRlMSA+PSAtNykpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDFdLlBvd2VyID0gUG93ZXIuZmllbGQuQnl0ZTE7CisKKwkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyMi5maWVsZC5CeXRlMCA+PSAtNykpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDBdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMDsKKworCQlpZiAoKFBvd2VyMi5maWVsZC5CeXRlMSA8IDE2KSAmJiAoUG93ZXIyLmZpZWxkLkJ5dGUxID49IC03KSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUxOworCX0KKworCS8vIDMuIFUtTklJIHVwcGVyIGJhbmQ6IDE0OSwgMTUxLCAxNTM7IDE1NywgMTU5LCAxNjE7IDE2NSAoaW5jbHVkaW5nIGNlbnRyYWwgZnJlcXVlbmN5IGluIEJXIDQwTUh6KQorCS8vIDMuMSBGaWxsIHVwIGNoYW5uZWwKKwljaG9mZnNldCA9IDE0ICsgMTIgKyAxNjsKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorCXsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5DaGFubmVsCT0gMTQ5ICsgaSAqIDggKyAwOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uQ2hhbm5lbAk9IDE0OSArIGkgKiA4ICsgMjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLkNoYW5uZWwJPSAxNDkgKyBpICogOCArIDQ7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJfQorCXBBZC0+VHhQb3dlclszICogMiArIGNob2Zmc2V0ICsgMF0uQ2hhbm5lbAkJPSAxNjU7CisJcEFkLT5UeFBvd2VyWzMgKiAyICsgY2hvZmZzZXQgKyAwXS5Qb3dlcgkJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCXBBZC0+VHhQb3dlclszICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIyCQk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisKKwkvLyAzLjIgRmlsbCB1cCBwb3dlcgorCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJeworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYX1BXUl9PRkZTRVQgKyAoY2hvZmZzZXQgLSAxNCkgKyBpICogMiwgUG93ZXIud29yZCk7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFgyX1BXUl9PRkZTRVQgKyAoY2hvZmZzZXQgLSAxNCkgKyBpICogMiwgUG93ZXIyLndvcmQpOworCisJCWlmICgoUG93ZXIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUwID49IC03KSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMDsKKworCQlpZiAoKFBvd2VyLmZpZWxkLkJ5dGUxIDwgMTYpICYmIChQb3dlci5maWVsZC5CeXRlMSA+PSAtNykpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDFdLlBvd2VyID0gUG93ZXIuZmllbGQuQnl0ZTE7CisKKwkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyMi5maWVsZC5CeXRlMCA+PSAtNykpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDBdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMDsKKworCQlpZiAoKFBvd2VyMi5maWVsZC5CeXRlMSA8IDE2KSAmJiAoUG93ZXIyLmZpZWxkLkJ5dGUxID49IC03KSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUxOworCX0KKworCS8vIDQuIFByaW50IGFuZCBEZWJ1ZworCWNob2Zmc2V0ID0gMTQgKyAxMiArIDE2ICsgNzsKKworCisjaWYgMAorCS8vIEluaXQgdGhlIDgwMi4xMWogY2hhbm5lbCBudW1iZXIgZm9yIFRYIGNoYW5uZWwgcG93ZXIKKwkvLyAwLiAyME1IegorCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJeworCQlwQWQtPlR4UG93ZXIxMUpbaV0uQ2hhbm5lbCA9IDggKyBpICogNDsKKwkJcEFkLT5UeFBvd2VyMTFKW2ldLkJXID0gQldfMjA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwl7CisJCXBBZC0+VHhQb3dlcjExSltpICsgM10uQ2hhbm5lbCA9IDM0ICsgaSAqIDQ7CisJCXBBZC0+VHhQb3dlcjExSltpICsgM10uQlcgPSBCV18yMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCXsKKwkJcEFkLT5UeFBvd2VyMTFKW2kgKyA3XS5DaGFubmVsID0gMTg0ICsgaSAqIDQ7CisJCXBBZC0+VHhQb3dlcjExSltpICsgN10uQlcgPSBCV18yMDsKKwl9CisKKwkvLyAwLiAxME1IegorCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisJeworCQlwQWQtPlR4UG93ZXIxMUpbaSArIDExXS5DaGFubmVsID0gNyArIGk7CisJCXBBZC0+VHhQb3dlcjExSltpICsgMTFdLkJXID0gQldfMTA7CisJfQorCXBBZC0+VHhQb3dlcjExSlsxM10uQ2hhbm5lbCA9IDExOworCXBBZC0+VHhQb3dlcjExSlsxM10uQlcgPSBCV18xMDsKKworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJeworCQlwQWQtPlR4UG93ZXIxMUpbaSArIDE0XS5DaGFubmVsID0gMTgzICsgaTsKKwkJcEFkLT5UeFBvd2VyMTFKW2kgKyAxNF0uQlc9IEJXXzEwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJeworCQlwQWQtPlR4UG93ZXIxMUpbaSArIDE3XS5DaGFubmVsID0gMTg3ICsgaTsKKwkJcEFkLT5UeFBvd2VyMTFKW2kgKyAxN10uQlcgPSBCV18xMDsKKwl9CisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspCisJeworCQlQb3dlci53b3JkID0gUlRNUF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0phcGFuX1RYX1BXUl9PRkZTRVQgKyBpICogMik7CisJCVBvd2VyMi53b3JkID0gUlRNUF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0phcGFuX1RYMl9QV1JfT0ZGU0VUICsgaSAqIDIpOworCisJCWlmICgoUG93ZXIuZmllbGQuQnl0ZTAgPCAzNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUwID4gLTYpKQorCQkJcEFkLT5UeFBvd2VyMTFKW2kgKiAyXS5Qb3dlciA9IFBvd2VyLmZpZWxkLkJ5dGUwOworCisJCWlmICgoUG93ZXIuZmllbGQuQnl0ZTEgPCAzNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUxID4gLTYpKQorCQkJcEFkLT5UeFBvd2VyMTFKW2kgKiAyICsgMV0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMTsKKworCQlpZiAoKFBvd2VyMi5maWVsZC5CeXRlMCA8IDM2KSAmJiAoUG93ZXIyLmZpZWxkLkJ5dGUwID4gLTYpKQorCQkJcEFkLT5UeFBvd2VyMTFKW2kgKiAyXS5Qb3dlcjIgPSBQb3dlcjIuZmllbGQuQnl0ZTA7CisKKwkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTEgPCAzNikgJiYgKFBvd2VyMi5maWVsZC5CeXRlMSA+IC02KSkKKwkJCXBBZC0+VHhQb3dlcjExSltpICogMiArIDFdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMTsKKwl9CisjZW5kaWYKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJlYWQgdGhlIGZvbGxvd2luZyBmcm9tIHRoZSByZWdpc3RyeQorCQkxLiBBbGwgdGhlIHBhcmFtZXRlcnMKKwkJMi4gTmV0d29ya0FkZHJlcworCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlXcmFwcGVyQ29uZmlndXJhdGlvbkNvbnRleHQJRm9yIHVzZSBieSBOZGlzT3BlbkNvbmZpZ3VyYXRpb24KKworCVJldHVybiBWYWx1ZToKKwkJTkRJU19TVEFUVVNfU1VDQ0VTUworCQlORElTX1NUQVRVU19GQUlMVVJFCisJCU5ESVNfU1RBVFVTX1JFU09VUkNFUworCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUwlOSUNSZWFkUmVnUGFyYW1ldGVycygKKwlJTglQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4JTkRJU19IQU5ETEUJCQlXcmFwcGVyQ29uZmlndXJhdGlvbkNvbnRleHQKKwkpCit7CisJTkRJU19TVEFUVVMJCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCURCR1BSSU5UX1MoU3RhdHVzLCAoIjwtLSBOSUNSZWFkUmVnUGFyYW1ldGVycywgU3RhdHVzPSV4XG4iLCBTdGF0dXMpKTsKKwlyZXR1cm4gU3RhdHVzOworfQorCisKKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUmVhZCBpbml0aWFsIHBhcmFtZXRlcnMgZnJvbSBFRVBST00KKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECU5JQ1JlYWRFRVBST01QYXJhbWV0ZXJzKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCW1hY19hZGRyKQoreworCVVJTlQzMgkJCWRhdGEgPSAwOworCVVTSE9SVAkJCWksIHZhbHVlLCB2YWx1ZTI7CisJVUNIQVIJCQlUbXBQaHk7CisJRUVQUk9NX1RYX1BXUl9TVFJVQwkgICAgUG93ZXI7CisJRUVQUk9NX1ZFUlNJT05fU1RSVUMgICAgVmVyc2lvbjsKKwlFRVBST01fQU5URU5OQV9TVFJVQwlBbnRlbm5hOworCUVFUFJPTV9OSUNfQ09ORklHMl9TVFJVQyAgICBOaWNDb25maWcyOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IE5JQ1JlYWRFRVBST01QYXJhbWV0ZXJzXG4iKSk7CisKKwkvLyBJbml0IEVFUFJPTSBBZGRyZXNzIE51bWJlciwgYmVmb3JlIGFjY2VzcyBFRVBST007IGlmIDkzYzQ2LCBFRVBST01BZGRyZXNzTnVtPTYsIGVsc2UgaWYgOTNjNjYsIEVFUFJPTUFkZHJlc3NOdW09OAorCVJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJmRhdGEpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBFMlBST01fQ1NSID0gMHgleFxuIiwgZGF0YSkpOworCisJaWYoKGRhdGEgJiAweDMwKSA9PSAwKQorCQlwQWQtPkVFUFJPTUFkZHJlc3NOdW0gPSA2OwkJLy8gOTNDNDYKKwllbHNlIGlmKChkYXRhICYgMHgzMCkgPT0gMHgxMCkKKwkJcEFkLT5FRVBST01BZGRyZXNzTnVtID0gODsgICAgIC8vIDkzQzY2CisJZWxzZQorCQlwQWQtPkVFUFJPTUFkZHJlc3NOdW0gPSA4OyAgICAgLy8gOTNDODYKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gRUVQUk9NQWRkcmVzc051bSA9ICVkXG4iLCBwQWQtPkVFUFJPTUFkZHJlc3NOdW0gKSk7CisKKwkvLyBSVDI4NjAgTUFDIG5vIGxvbmdlciBhdXRvIGxvYWQgTUFDIGFkZHJlc3MgZnJvbSBFMlBST00uIERyaXZlciBoYXMgdG8gaW50aWFsaXplCisJLy8gTUFDIGFkZHJlc3MgcmVnaXN0ZXJzIGFjY29yZGluZyB0byBFMlBST00gc2V0dGluZworCWlmIChtYWNfYWRkciA9PSBOVUxMIHx8CisJCXN0cmxlbihtYWNfYWRkcikgIT0gMTcgfHwKKwkJbWFjX2FkZHJbMl0gIT0gJzonICB8fCBtYWNfYWRkcls1XSAhPSAnOicgIHx8IG1hY19hZGRyWzhdICE9ICc6JyB8fAorCQltYWNfYWRkclsxMV0gIT0gJzonIHx8IG1hY19hZGRyWzE0XSAhPSAnOicpCisJeworCQlVU0hPUlQgIEFkZHIwMSxBZGRyMjMsQWRkcjQ1IDsKKworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MDQsIEFkZHIwMSk7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHgwNiwgQWRkcjIzKTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDA4LCBBZGRyNDUpOworCisJCXBBZC0+UGVybWFuZW50QWRkcmVzc1swXSA9IChVQ0hBUikoQWRkcjAxICYgMHhmZik7CisJCXBBZC0+UGVybWFuZW50QWRkcmVzc1sxXSA9IChVQ0hBUikoQWRkcjAxID4+IDgpOworCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMl0gPSAoVUNIQVIpKEFkZHIyMyAmIDB4ZmYpOworCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbM10gPSAoVUNIQVIpKEFkZHIyMyA+PiA4KTsKKwkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzRdID0gKFVDSEFSKShBZGRyNDUgJiAweGZmKTsKKwkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzVdID0gKFVDSEFSKShBZGRyNDUgPj4gOCk7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSW5pdGlhbGl6ZSBNQUMgQWRkcmVzcyBmcm9tIEUyUFJPTSBcbiIpKTsKKwl9CisJZWxzZQorCXsKKwkJSU5UCQlqOworCQlQVUNIQVIJbWFjcHRyOworCisJCW1hY3B0ciA9IG1hY19hZGRyOworCisJCWZvciAoaj0wOyBqPE1BQ19BRERSX0xFTjsgaisrKQorCQl7CisJCQlBdG9IKG1hY3B0ciwgJnBBZC0+UGVybWFuZW50QWRkcmVzc1tqXSwgMSk7CisJCQltYWNwdHI9bWFjcHRyKzM7CisJCX0KKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJbml0aWFsaXplIE1BQyBBZGRyZXNzIGZyb20gbW9kdWxlIHBhcmFtZXRlciBcbiIpKTsKKwl9CisKKworCXsKKwkJLy9tb3JlIGNvbnZlbmluZXQgdG8gdGVzdCBtYnNzaWQsIHNvIGFwJ3MgYnNzaWQgJjB4ZjEKKwkJaWYgKHBBZC0+UGVybWFuZW50QWRkcmVzc1swXSA9PSAweGZmKQorCQkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzBdID0gUmFuZG9tQnl0ZShwQWQpJjB4Zjg7CisKKwkJLy9pZiAocEFkLT5QZXJtYW5lbnRBZGRyZXNzWzVdID09IDB4ZmYpCisJCS8vCXBBZC0+UGVybWFuZW50QWRkcmVzc1s1XSA9IFJhbmRvbUJ5dGUocEFkKSYweGY4OworCisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIkUyUFJPTSBNQUM6ID0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCXBBZC0+UGVybWFuZW50QWRkcmVzc1swXSwgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzFdLAorCQkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzJdLCBwQWQtPlBlcm1hbmVudEFkZHJlc3NbM10sCisJCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbNF0sIHBBZC0+UGVybWFuZW50QWRkcmVzc1s1XSkpOworCQlpZiAocEFkLT5iTG9jYWxBZG1pbk1BQyA9PSBGQUxTRSkKKwkJeworCQkJTUFDX0RXMF9TVFJVQyBjc3IyOworCQkJTUFDX0RXMV9TVFJVQyBjc3IzOworCQkJQ09QWV9NQUNfQUREUihwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPlBlcm1hbmVudEFkZHJlc3MpOworCQkJY3NyMi5maWVsZC5CeXRlMCA9IHBBZC0+Q3VycmVudEFkZHJlc3NbMF07CisJCQljc3IyLmZpZWxkLkJ5dGUxID0gcEFkLT5DdXJyZW50QWRkcmVzc1sxXTsKKwkJCWNzcjIuZmllbGQuQnl0ZTIgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzJdOworCQkJY3NyMi5maWVsZC5CeXRlMyA9IHBBZC0+Q3VycmVudEFkZHJlc3NbM107CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQUREUl9EVzAsIGNzcjIud29yZCk7CisJCQljc3IzLndvcmQgPSAwOworCQkJY3NyMy5maWVsZC5CeXRlNCA9IHBBZC0+Q3VycmVudEFkZHJlc3NbNF07CisJCQljc3IzLmZpZWxkLkJ5dGU1ID0gcEFkLT5DdXJyZW50QWRkcmVzc1s1XTsKKwkJCWNzcjMuZmllbGQuVTJNZU1hc2sgPSAweGZmOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0FERFJfRFcxLCBjc3IzLndvcmQpOworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiRTJQUk9NIE1BQzogPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJCXBBZC0+UGVybWFuZW50QWRkcmVzc1swXSwgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzFdLAorCQkJCXBBZC0+UGVybWFuZW50QWRkcmVzc1syXSwgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzNdLAorCQkJCXBBZC0+UGVybWFuZW50QWRkcmVzc1s0XSwgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzVdKSk7CisJCX0KKwl9CisKKwkvLyBpZiBub3QgcmV0dXJuIGVhcmx5LiBjYXVzZSBmYWlsIGF0IGVtdWxhdGlvbi4KKwkvLyBJbml0IHRoZSBjaGFubmVsIG51bWJlciBmb3IgVFggY2hhbm5lbCBwb3dlcgorCVJUTVBSZWFkQ2hhbm5lbFB3cihwQWQpOworCisJLy8gaWYgRTJQUk9NIHZlcnNpb24gbWlzbWF0Y2ggd2l0aCBkcml2ZXIncyBleHBlY3RhdGlvbiwgdGhlbiBza2lwCisJLy8gYWxsIHN1YnNlcXVlbnQgRTJSUE9NIHJldGlldmFsIGFuZCBzZXQgYSBzeXN0ZW0gZXJyb3IgYml0IHRvIG5vdGlmeSBHVUkKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9WRVJTSU9OX09GRlNFVCwgVmVyc2lvbi53b3JkKTsKKwlwQWQtPkVlcHJvbVZlcnNpb24gPSBWZXJzaW9uLmZpZWxkLlZlcnNpb24gKyBWZXJzaW9uLmZpZWxkLkZhZVJlbGVhc2VOdW1iZXIgKiAyNTY7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRTJQUk9NOiBWZXJzaW9uID0gJWQsIEZBRSByZWxlYXNlICMlZFxuIiwgVmVyc2lvbi5maWVsZC5WZXJzaW9uLCBWZXJzaW9uLmZpZWxkLkZhZVJlbGVhc2VOdW1iZXIpKTsKKworCWlmIChWZXJzaW9uLmZpZWxkLlZlcnNpb24gPiBWQUxJRF9FRVBST01fVkVSU0lPTikKKwl7CisJCURCR1BSSU5UX0VSUigoIkUyUFJPTTogV1JPTkcgVkVSU0lPTiAweCV4LCBzaG91bGQgYmUgJWRcbiIsVmVyc2lvbi5maWVsZC5WZXJzaW9uLCBWQUxJRF9FRVBST01fVkVSU0lPTikpOworCQkvKnBBZC0+U3lzdGVtRXJyb3JCaXRtYXAgfD0gMHgwMDAwMDAwMTsKKworCQkvLyBoYXJkLWNvZGUgZGVmYXVsdCB2YWx1ZSB3aGVuIG5vIHByb3BlciBFMlBST00gaW5zdGFsbGVkCisJCXBBZC0+YkF1dG9UeEFnY0EgPSBGQUxTRTsKKwkJcEFkLT5iQXV0b1R4QWdjRyA9IEZBTFNFOworCisJCS8vIERlZmF1bHQgdGhlIGNoYW5uZWwgcG93ZXIKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fT0ZfQ0hBTk5FTFM7IGkrKykKKwkJCXBBZC0+VHhQb3dlcltpXS5Qb3dlciA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisKKwkJLy8gRGVmYXVsdCB0aGUgY2hhbm5lbCBwb3dlcgorCQlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9PRl8xMUpDSEFOTkVMUzsgaSsrKQorCQkJcEFkLT5UeFBvd2VyMTFKW2ldLlBvd2VyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKworCQlmb3IoaSA9IDA7IGkgPCBOVU1fRUVQUk9NX0JCUF9QQVJNUzsgaSsrKQorCQkJcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbaV0gPSAweGZmZmY7CisJCXJldHVybjsgICovCisJfQorCisJLy8gUmVhZCBCQlAgZGVmYXVsdCB2YWx1ZSBmcm9tIEVFUFJPTSBhbmQgc3RvcmUgdG8gYXJyYXkoRUVQUk9NRGVmYXVsdFZhbHVlKSBpbiBwQWQKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9OSUMxX09GRlNFVCwgdmFsdWUpOworCXBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlWzBdID0gdmFsdWU7CisKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9OSUMyX09GRlNFVCwgdmFsdWUpOworCXBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlWzFdID0gdmFsdWU7CisKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MzgsIHZhbHVlKTsJLy8gQ291bnRyeSBSZWdpb24KKwlwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVsyXSA9IHZhbHVlOworCisJZm9yKGkgPSAwOyBpIDwgODsgaSsrKQorCXsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fQkJQX0JBU0VfT0ZGU0VUICsgaSoyLCB2YWx1ZSk7CisJCXBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlW2krM10gPSB2YWx1ZTsKKwl9CisKKwkvLyBXZSBoYXZlIHRvIHBhcnNlIE5JQyBjb25maWd1cmF0aW9uIDAgYXQgaGVyZS4KKwkvLyBJZiBUU1NJIGRpZCBub3QgaGF2ZSBwcmVsb2FkZWQgdmFsdWUsIGl0IHNob3VsZCByZXNldCB0aGUgVHhBdXRvQWdjIHRvIGZhbHNlCisJLy8gVGhlcmVmb3JlLCB3ZSBoYXZlIHRvIHJlYWQgVHhBdXRvQWdjIGNvbnRyb2wgYmVmb3JlaGFuZC4KKwkvLyBSZWFkIFR4IEFHQyBjb250cm9sIGJpdAorCUFudGVubmEud29yZCA9IHBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlWzBdOworCWlmIChBbnRlbm5hLndvcmQgPT0gMHhGRkZGKQorCXsKKwkJQW50ZW5uYS53b3JkID0gMDsKKwkJQW50ZW5uYS5maWVsZC5SZkljVHlwZSA9IFJGSUNfMjgyMDsKKwkJQW50ZW5uYS5maWVsZC5UeFBhdGggPSAxOworCQlBbnRlbm5hLmZpZWxkLlJ4UGF0aCA9IDI7CisJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiRTJQUk9NIGVycm9yLCBoYXJkIGNvZGUgYXMgMHglMDR4XG4iLCBBbnRlbm5hLndvcmQpKTsKKwl9CisKKwkvLyBDaG9vc2UgdGhlIGRlc2lyZWQgVHgmUnggc3RyZWFtLgorCWlmICgocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID4gQW50ZW5uYS5maWVsZC5UeFBhdGgpKQorCQlwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9IEFudGVubmEuZmllbGQuVHhQYXRoOworCisJaWYgKChwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA9PSAwKSB8fCAocEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPiBBbnRlbm5hLmZpZWxkLlJ4UGF0aCkpCisJeworCQlwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA9IEFudGVubmEuZmllbGQuUnhQYXRoOworCisJCWlmICgocEFkLT5NQUNWZXJzaW9uIDwgUkFMSU5LXzI4ODNfVkVSU0lPTikgJiYKKwkJCShwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA+IDIpKQorCQl7CisJCQkvLyBvbmx5IDIgUnggc3RyZWFtcyBmb3IgUlQyODYwIHNlcmllcworCQkJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSAyOworCQl9CisJfQorCisJLy8gMyozCisJLy8gcmVhZCB2YWx1ZSBmcm9tIEVFUFJPTSBhbmQgc2V0IHRoZW0gdG8gQ1NSMTc0IH4gMTc3IGluIGNoYWluMCB+IGNoYWluMgorCS8vIHlldCBpbXBsZW1lbnQKKwlmb3IoaT0wOyBpPDM7IGkrKykKKwl7CisJfQorCisJTmljQ29uZmlnMi53b3JkID0gcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMV07CisKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCU5pY0NvbmZpZzIud29yZCA9IDA7CisJCWlmICgoTmljQ29uZmlnMi53b3JkICYgMHgwMGZmKSA9PSAweGZmKQorCQl7CisJCQlOaWNDb25maWcyLndvcmQgJj0gMHhmZjAwOworCQl9CisKKwkJaWYgKChOaWNDb25maWcyLndvcmQgPj4gOCkgPT0gMHhmZikKKwkJeworCQkJTmljQ29uZmlnMi53b3JkICY9IDB4MDBmZjsKKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCWlmIChOaWNDb25maWcyLmZpZWxkLkR5bmFtaWNUeEFnY0NvbnRyb2wgPT0gMSkKKwkJcEFkLT5iQXV0b1R4QWdjQSA9IHBBZC0+YkF1dG9UeEFnY0cgPSBUUlVFOworCWVsc2UKKwkJcEFkLT5iQXV0b1R4QWdjQSA9IHBBZC0+YkF1dG9UeEFnY0cgPSBGQUxTRTsKKworCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJOSUNSZWFkRUVQUk9NUGFyYW1ldGVyczogUnhQYXRoID0gJWQsIFR4UGF0aCA9ICVkXG4iLCBBbnRlbm5hLmZpZWxkLlJ4UGF0aCwgQW50ZW5uYS5maWVsZC5UeFBhdGgpKTsKKworCS8vIFNhdmUgdGhlIGFudGVubmEgZm9yIGZ1dHVyZSB1c2UKKwlwQWQtPkFudGVubmEud29yZCA9IEFudGVubmEud29yZDsKKworCS8vCisJLy8gUmVzZXQgUGh5TW9kZSBpZiB3ZSBkb24ndCBzdXBwb3J0IDgwMi4xMWEKKwkvLyBPbmx5IFJGSUNfMjg1MCAmIFJGSUNfMjc1MCBzdXBwb3J0IDgwMi4xMWEKKwkvLworCWlmICgoQW50ZW5uYS5maWVsZC5SZkljVHlwZSAhPSBSRklDXzI4NTApICYmIChBbnRlbm5hLmZpZWxkLlJmSWNUeXBlICE9IFJGSUNfMjc1MCkpCisJeworCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHX01JWEVEKSB8fAorCQkJKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQSkpCisJCQlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gUEhZXzExQkdfTUlYRUQ7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWVsc2UgaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFCR05fTUlYRUQpCXx8CisJCQkJIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFOX01JWEVEKSAJfHwKKwkJCQkgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUdOX01JWEVEKSAJfHwKKwkJCQkgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl81RykpCisJCQlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gUEhZXzExQkdOX01JWEVEOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCX0KKworCS8vIFJlYWQgVFNTSSByZWZlcmVuY2UgYW5kIFRTU0kgYm91bmRhcnkgZm9yIHRlbXBlcmF0dXJlIGNvbXBlbnNhdGlvbi4gVGhpcyBpcyB1Z2x5CisJLy8gMC4gMTFiL2cKKwl7CisJCS8qIHRoZXNlIGFyZSB0ZW1wYXR1cmUgcmVmZXJlbmNlIHZhbHVlICgweDAwIH4gMHhGRSkKKwkJICAgZXg6IDB4MDAgMHgxNSAweDI1IDB4NDUgMHg4OCAweEEwIDB4QjUgMHhEMCAweEYwCisJCSAgIFRzc2lQbHVzQm91bmRhcnlHIFs0XSBbM10gWzJdIFsxXSBbMF0gKHNtYWxsZXIpICsKKwkJICAgVHNzaU1pbnVzQm91bmRhcnlHWzBdIFsxXSBbMl0gWzNdIFs0XSAobGFyZ2VyKSAqLworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4NkUsIFBvd2VyLndvcmQpOworCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1s0XSA9IFBvd2VyLmZpZWxkLkJ5dGUwOworCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1szXSA9IFBvd2VyLmZpZWxkLkJ5dGUxOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4NzAsIFBvd2VyLndvcmQpOworCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1syXSA9IFBvd2VyLmZpZWxkLkJ5dGUwOworCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1sxXSA9IFBvd2VyLmZpZWxkLkJ5dGUxOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4NzIsIFBvd2VyLndvcmQpOworCQlwQWQtPlRzc2lSZWZHICAgPSBQb3dlci5maWVsZC5CeXRlMDsgLyogcmVmZXJlbmNlIHZhbHVlIFswXSAqLworCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzFdID0gUG93ZXIuZmllbGQuQnl0ZTE7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHg3NCwgUG93ZXIud29yZCk7CisJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbMl0gPSBQb3dlci5maWVsZC5CeXRlMDsKKwkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1szXSA9IFBvd2VyLmZpZWxkLkJ5dGUxOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4NzYsIFBvd2VyLndvcmQpOworCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzRdID0gUG93ZXIuZmllbGQuQnl0ZTA7CisJCXBBZC0+VHhBZ2NTdGVwRyA9IFBvd2VyLmZpZWxkLkJ5dGUxOworCQlwQWQtPlR4QWdjQ29tcGVuc2F0ZUcgPSAwOworCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1swXSA9IHBBZC0+VHNzaVJlZkc7CisJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbMF0gID0gcEFkLT5Uc3NpUmVmRzsKKworCQkvLyBEaXNhYmxlIFR4QWdjIGlmIHRoZSBiYXNlZCB2YWx1ZSBpcyBub3QgcmlnaHQKKwkJaWYgKHBBZC0+VHNzaVJlZkcgPT0gMHhmZikKKwkJCXBBZC0+YkF1dG9UeEFnY0cgPSBGQUxTRTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkUyUFJPTTogRyBUc3NpWy00IC4uICs0XSA9ICVkICVkICVkICVkIC0gJWQgLSVkICVkICVkICVkLCBzdGVwPSVkLCB0dW5pbmc9JWRcbiIsCisJCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1s0XSwgcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbM10sIHBBZC0+VHNzaU1pbnVzQm91bmRhcnlHWzJdLCBwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1sxXSwKKwkJCXBBZC0+VHNzaVJlZkcsCisJCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzFdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzJdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzNdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzRdLAorCQkJcEFkLT5UeEFnY1N0ZXBHLCBwQWQtPmJBdXRvVHhBZ2NHKSk7CisJfQorCS8vIDEuIDExYQorCXsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweEQ0LCBQb3dlci53b3JkKTsKKwkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbNF0gPSBQb3dlci5maWVsZC5CeXRlMDsKKwkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbM10gPSBQb3dlci5maWVsZC5CeXRlMTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweEQ2LCBQb3dlci53b3JkKTsKKwkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbMl0gPSBQb3dlci5maWVsZC5CeXRlMDsKKwkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbMV0gPSBQb3dlci5maWVsZC5CeXRlMTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweEQ4LCBQb3dlci53b3JkKTsKKwkJcEFkLT5Uc3NpUmVmQSAgID0gUG93ZXIuZmllbGQuQnl0ZTA7CisJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMV0gPSBQb3dlci5maWVsZC5CeXRlMTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweERBLCBQb3dlci53b3JkKTsKKwkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVsyXSA9IFBvd2VyLmZpZWxkLkJ5dGUwOworCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzNdID0gUG93ZXIuZmllbGQuQnl0ZTE7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHhEQywgUG93ZXIud29yZCk7CisJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbNF0gPSBQb3dlci5maWVsZC5CeXRlMDsKKwkJcEFkLT5UeEFnY1N0ZXBBID0gUG93ZXIuZmllbGQuQnl0ZTE7CisJCXBBZC0+VHhBZ2NDb21wZW5zYXRlQSA9IDA7CisJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzBdID0gcEFkLT5Uc3NpUmVmQTsKKwkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVswXSAgPSBwQWQtPlRzc2lSZWZBOworCisJCS8vIERpc2FibGUgVHhBZ2MgaWYgdGhlIGJhc2VkIHZhbHVlIGlzIG5vdCByaWdodAorCQlpZiAocEFkLT5Uc3NpUmVmQSA9PSAweGZmKQorCQkJcEFkLT5iQXV0b1R4QWdjQSA9IEZBTFNFOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRTJQUk9NOiBBIFRzc2lbLTQgLi4gKzRdID0gJWQgJWQgJWQgJWQgLSAlZCAtJWQgJWQgJWQgJWQsIHN0ZXA9JWQsIHR1bmluZz0lZFxuIiwKKwkJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzRdLCBwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVszXSwgcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbMl0sIHBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzFdLAorCQkJcEFkLT5Uc3NpUmVmQSwKKwkJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMV0sIHBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMl0sIHBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbM10sIHBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbNF0sCisJCQlwQWQtPlR4QWdjU3RlcEEsIHBBZC0+YkF1dG9UeEFnY0EpKTsKKwl9CisJcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSA9IDB4MDsKKworCS8vIFJlYWQgZnJlcXVlbmN5IG9mZnNldCBzZXR0aW5nIGZvciBSRgorCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0ZSRVFfT0ZGU0VULCB2YWx1ZSk7CisJaWYgKCh2YWx1ZSAmIDB4MDBGRikgIT0gMHgwMEZGKQorCQlwQWQtPlJmRnJlcU9mZnNldCA9IChVTE9ORykgKHZhbHVlICYgMHgwMEZGKTsKKwllbHNlCisJCXBBZC0+UmZGcmVxT2Zmc2V0ID0gMDsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJFMlBST006IFJGIEZyZXFPZmZzZXQ9MHglbHggXG4iLCBwQWQtPlJmRnJlcU9mZnNldCkpOworCisJLy9Db3VudHJ5UmVnaW9uIGJ5dGUgb2Zmc2V0ICgzOGgpCisJdmFsdWUgPSBwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVsyXSA+PiA4OwkJLy8gMi40RyBiYW5kCisJdmFsdWUyID0gcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMl0gJiAweDAwRkY7CS8vIDVHIGJhbmQKKworCWlmICgodmFsdWUgPD0gUkVHSU9OX01BWElNVU1fQkdfQkFORCkgJiYgKHZhbHVlMiA8PSBSRUdJT05fTUFYSU1VTV9BX0JBTkQpKQorCXsKKwkJcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiA9ICgoVUNIQVIpIHZhbHVlKSB8IDB4ODA7CisJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCA9ICgoVUNIQVIpIHZhbHVlMikgfCAweDgwOworCQlUbXBQaHkgPSBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlOworCQlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gMHhmZjsKKwkJUlRNUFNldFBoeU1vZGUocEFkLCBUbXBQaHkpOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlTZXRDb21tb25IVChwQWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCX0KKworCS8vCisJLy8gR2V0IFJTU0kgT2Zmc2V0IG9uIEVFUFJPTSAweDlBaCAmIDB4OUNoLgorCS8vIFRoZSB2YWxpZCB2YWx1ZSBhcmUgKC0xMCB+IDEwKQorCS8vCisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fUlNTSV9CR19PRkZTRVQsIHZhbHVlKTsKKwlwQWQtPkJHUnNzaU9mZnNldDAgPSB2YWx1ZSAmIDB4MDBmZjsKKwlwQWQtPkJHUnNzaU9mZnNldDEgPSAodmFsdWUgPj4gOCk7CisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fUlNTSV9CR19PRkZTRVQrMiwgdmFsdWUpOworCXBBZC0+QkdSc3NpT2Zmc2V0MiA9IHZhbHVlICYgMHgwMGZmOworCXBBZC0+QUxOQUdhaW4xID0gKHZhbHVlID4+IDgpOworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0xOQV9PRkZTRVQsIHZhbHVlKTsKKwlwQWQtPkJMTkFHYWluID0gdmFsdWUgJiAweDAwZmY7CisJcEFkLT5BTE5BR2FpbjAgPSAodmFsdWUgPj4gOCk7CisKKwkvLyBWYWxpZGF0ZSAxMWIvZyBSU1NJXzAgb2Zmc2V0LgorCWlmICgocEFkLT5CR1Jzc2lPZmZzZXQwIDwgLTEwKSB8fCAocEFkLT5CR1Jzc2lPZmZzZXQwID4gMTApKQorCQlwQWQtPkJHUnNzaU9mZnNldDAgPSAwOworCisJLy8gVmFsaWRhdGUgMTFiL2cgUlNTSV8xIG9mZnNldC4KKwlpZiAoKHBBZC0+QkdSc3NpT2Zmc2V0MSA8IC0xMCkgfHwgKHBBZC0+QkdSc3NpT2Zmc2V0MSA+IDEwKSkKKwkJcEFkLT5CR1Jzc2lPZmZzZXQxID0gMDsKKworCS8vIFZhbGlkYXRlIDExYi9nIFJTU0lfMiBvZmZzZXQuCisJaWYgKChwQWQtPkJHUnNzaU9mZnNldDIgPCAtMTApIHx8IChwQWQtPkJHUnNzaU9mZnNldDIgPiAxMCkpCisJCXBBZC0+QkdSc3NpT2Zmc2V0MiA9IDA7CisKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9SU1NJX0FfT0ZGU0VULCB2YWx1ZSk7CisJcEFkLT5BUnNzaU9mZnNldDAgPSB2YWx1ZSAmIDB4MDBmZjsKKwlwQWQtPkFSc3NpT2Zmc2V0MSA9ICh2YWx1ZSA+PiA4KTsKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIChFRVBST01fUlNTSV9BX09GRlNFVCsyKSwgdmFsdWUpOworCXBBZC0+QVJzc2lPZmZzZXQyID0gdmFsdWUgJiAweDAwZmY7CisJcEFkLT5BTE5BR2FpbjIgPSAodmFsdWUgPj4gOCk7CisKKwlpZiAoKChVQ0hBUilwQWQtPkFMTkFHYWluMSA9PSAweEZGKSB8fCAocEFkLT5BTE5BR2FpbjEgPT0gMHgwMCkpCisJCXBBZC0+QUxOQUdhaW4xID0gcEFkLT5BTE5BR2FpbjA7CisJaWYgKCgoVUNIQVIpcEFkLT5BTE5BR2FpbjIgPT0gMHhGRikgfHwgKHBBZC0+QUxOQUdhaW4yID09IDB4MDApKQorCQlwQWQtPkFMTkFHYWluMiA9IHBBZC0+QUxOQUdhaW4wOworCisJLy8gVmFsaWRhdGUgMTFhIFJTU0lfMCBvZmZzZXQuCisJaWYgKChwQWQtPkFSc3NpT2Zmc2V0MCA8IC0xMCkgfHwgKHBBZC0+QVJzc2lPZmZzZXQwID4gMTApKQorCQlwQWQtPkFSc3NpT2Zmc2V0MCA9IDA7CisKKwkvLyBWYWxpZGF0ZSAxMWEgUlNTSV8xIG9mZnNldC4KKwlpZiAoKHBBZC0+QVJzc2lPZmZzZXQxIDwgLTEwKSB8fCAocEFkLT5BUnNzaU9mZnNldDEgPiAxMCkpCisJCXBBZC0+QVJzc2lPZmZzZXQxID0gMDsKKworCS8vVmFsaWRhdGUgMTFhIFJTU0lfMiBvZmZzZXQuCisJaWYgKChwQWQtPkFSc3NpT2Zmc2V0MiA8IC0xMCkgfHwgKHBBZC0+QVJzc2lPZmZzZXQyID4gMTApKQorCQlwQWQtPkFSc3NpT2Zmc2V0MiA9IDA7CisKKwkvLworCS8vIEdldCBMRUQgU2V0dGluZy4KKwkvLworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHgzYSwgdmFsdWUpOworCXBBZC0+TGVkQ250bC53b3JkID0gKHZhbHVlJjB4ZmYwMCkgPj4gODsKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9MRUQxX09GRlNFVCwgdmFsdWUpOworCXBBZC0+TGVkMSA9IHZhbHVlOworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0xFRDJfT0ZGU0VULCB2YWx1ZSk7CisJcEFkLT5MZWQyID0gdmFsdWU7CisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTEVEM19PRkZTRVQsIHZhbHVlKTsKKwlwQWQtPkxlZDMgPSB2YWx1ZTsKKworCVJUTVBSZWFkVHhQd3JQZXJSYXRlKHBBZCk7CisKKyNpZmRlZiBTSU5HTEVfU0tVCisJLy9wQWQtPkNvbW1vbkNmZy5EZWZpbmVNYXhUeFB3ciA9IFJUTVBfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9ERUZJTkVfTUFYX1RYUFdSKTsKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9ERUZJTkVfTUFYX1RYUFdSLCBwQWQtPkNvbW1vbkNmZy5EZWZpbmVNYXhUeFB3cik7CisjZW5kaWYgLy8gU0lOR0xFX1NLVSAvLworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tIE5JQ1JlYWRFRVBST01QYXJhbWV0ZXJzXG4iKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlTZXQgZGVmYXVsdCB2YWx1ZSBmcm9tIEVFUFJPTQorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJTklDSW5pdEFzaWNGcm9tRUVQUk9NKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCVVJTlQzMgkJCQkJZGF0YSA9IDA7CisJVUNIQVIJQkJQUjEgPSAwOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCVVTSE9SVAkJCQkJaTsKKwlFRVBST01fQU5URU5OQV9TVFJVQwlBbnRlbm5hOworCUVFUFJPTV9OSUNfQ09ORklHMl9TVFJVQyAgICBOaWNDb25maWcyOworCVVDSEFSCUJCUFIzID0gMDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBOSUNJbml0QXNpY0Zyb21FRVBST01cbiIpKTsKKwlmb3IoaSA9IDM7IGkgPCBOVU1fRUVQUk9NX0JCUF9QQVJNUzsgaSsrKQorCXsKKwkJVUNIQVIgQmJwUmVnSWR4LCBCYnBWYWx1ZTsKKworCQlpZiAoKHBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlW2ldICE9IDB4RkZGRikgJiYgKHBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlW2ldICE9IDApKQorCQl7CisJCQlCYnBSZWdJZHggPSAoVUNIQVIpKHBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlW2ldID4+IDgpOworCQkJQmJwVmFsdWUgID0gKFVDSEFSKShwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpXSAmIDB4ZmYpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJicFJlZ0lkeCwgQmJwVmFsdWUpOworCQl9CisJfQorCisJQW50ZW5uYS53b3JkID0gcEFkLT5BbnRlbm5hLndvcmQ7CisJcEFkLT5NbG1lLlJlYWxSeFBhdGggPSAoVUNIQVIpIEFudGVubmEuZmllbGQuUnhQYXRoOworCXBBZC0+UmZJY1R5cGUgPSAoVUNIQVIpIEFudGVubmEuZmllbGQuUmZJY1R5cGU7CisKKwlOaWNDb25maWcyLndvcmQgPSBwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVsxXTsKKworCisJLy8gU2F2ZSB0aGUgYW50ZW5uYSBmb3IgZnV0dXJlIHVzZQorCXBBZC0+TmljQ29uZmlnMi53b3JkID0gTmljQ29uZmlnMi53b3JkOworCisJLy8KKwkvLyBTZW5kIExFRCBTZXR0aW5nIHRvIE1DVS4KKwkvLworCWlmIChwQWQtPkxlZENudGwud29yZCA9PSAweEZGKQorCXsKKwkJcEFkLT5MZWRDbnRsLndvcmQgPSAweDAxOworCQlwQWQtPkxlZDEgPSAweDU1NTU7CisJCXBBZC0+TGVkMiA9IDB4MjIyMTsKKworI2lmZGVmIFJUMjg2MAorCQlwQWQtPkxlZDMgPSAweEE5Rjg7CisjZW5kaWYgLy8gUlQyODYwIC8vCisJfQorCisJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUyLCAweGZmLCAoVUNIQVIpcEFkLT5MZWQxLCAoVUNIQVIpKHBBZC0+TGVkMSA+PiA4KSk7CisJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUzLCAweGZmLCAoVUNIQVIpcEFkLT5MZWQyLCAoVUNIQVIpKHBBZC0+TGVkMiA+PiA4KSk7CisJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDU0LCAweGZmLCAoVUNIQVIpcEFkLT5MZWQzLCAoVUNIQVIpKHBBZC0+TGVkMyA+PiA4KSk7CisgICAgcEFkLT5MZWRJbmRpY2F0b3JTdHJlZ3RoID0gMHhGRjsKKyAgICBSVE1QU2V0U2lnbmFsTEVEKHBBZCwgLTEwMCk7CS8vIEZvcmNlIHNpZ25hbCBzdHJlbmd0aCBMZWQgdG8gYmUgdHVybmVkIG9mZiwgYmVmb3JlIGxpbmsgdXAKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQkvLyBSZWFkIEhhcmR3YXJlIGNvbnRyb2xsZWQgUmFkaW8gc3RhdGUgZW5hYmxlIGJpdAorCQlpZiAoTmljQ29uZmlnMi5maWVsZC5IYXJkd2FyZVJhZGlvQ29udHJvbCA9PSAxKQorCQl7CisJCQlwQWQtPlN0YUNmZy5iSGFyZHdhcmVSYWRpbyA9IFRSVUU7CisKKwkJCS8vIFJlYWQgR1BJTyBwaW4yIGFzIEhhcmR3YXJlIGNvbnRyb2xsZWQgcmFkaW8gc3RhdGUKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgR1BJT19DVFJMX0NGRywgJmRhdGEpOworCQkJaWYgKChkYXRhICYgMHgwNCkgPT0gMCkKKwkJCXsKKwkJCQlwQWQtPlN0YUNmZy5iSHdSYWRpbyA9IEZBTFNFOworCQkJCXBBZC0+U3RhQ2ZnLmJSYWRpbyA9IEZBTFNFOworCQkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7CisJCQl9CisJCX0KKwkJZWxzZQorCQkJcEFkLT5TdGFDZmcuYkhhcmR3YXJlUmFkaW8gPSBGQUxTRTsKKworCQlpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IEZBTFNFKQorCQl7CisJCQlSVE1QU2V0TEVEKHBBZCwgTEVEX1JBRElPX09GRik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QU2V0TEVEKHBBZCwgTEVEX1JBRElPX09OKTsKKyNpZmRlZiBSVDI4NjAKKwkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMCwgMHhmZiwgMHhmZiwgMHgwMik7CisJCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzEsIFBvd2VyV2FrZUNJRCwgMHgwMCwgMHgwMCk7CisJCQkvLyAyLTEuIHdhaXQgY29tbWFuZCBvay4KKwkJCUFzaWNDaGVja0NvbW1hbk9rKHBBZCwgUG93ZXJXYWtlQ0lEKTsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIFR1cm4gb2ZmIHBhdGNoaW5nIGZvciBjYXJkYnVzIGNvbnRyb2xsZXIKKwlpZiAoTmljQ29uZmlnMi5maWVsZC5DYXJkYnVzQWNjZWxlcmF0aW9uID09IDEpCisJeworCX0KKworCWlmIChOaWNDb25maWcyLmZpZWxkLkR5bmFtaWNUeEFnY0NvbnRyb2wgPT0gMSkKKwkJcEFkLT5iQXV0b1R4QWdjQSA9IHBBZC0+YkF1dG9UeEFnY0cgPSBUUlVFOworCWVsc2UKKwkJcEFkLT5iQXV0b1R4QWdjQSA9IHBBZC0+YkF1dG9UeEFnY0cgPSBGQUxTRTsKKwkvLworCS8vIFNpbmNlIEJCUCBoYXMgYmVlbiBwcm9nYW1lZCwgdG8gbWFrZSBzdXJlIEJCUCBzZXR0aW5nIHdpbGwgYmUKKwkvLyB1cGF0ZSBpbnNpZGUgb2YgQXNpY0FudGVubmFTZWxlY3QsIHNvIHJlc2V0IHRvIFVOS05PV05fQkFORCEhCisJLy8KKwlwQWQtPkNvbW1vbkNmZy5CYW5kU3RhdGUgPSBVTktOT1dOX0JBTkQ7CisKKwlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCQlBSMyk7CisJQkJQUjMgJj0gKH4weDE4KTsKKwlpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDMpCisJeworCQlCQlBSMyB8PSAoMHgxMCk7CisJfQorCWVsc2UgaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKQorCXsKKwkJQkJQUjMgfD0gKDB4OCk7CisJfQorCWVsc2UgaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQorCXsKKwkJQkJQUjMgfD0gKDB4MCk7CisJfQorCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJCUFIzKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQkvLyBIYW5kbGUgdGhlIGRpZmZlcmVuY2Ugd2hlbiAxVAorCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsICZCQlBSMSk7CisJCWlmKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKKwkJeworCQlCQlBSMSAmPSAofjB4MTgpOworCQl9CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsIEJCUFIxKTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJVc2UgSHcgUmFkaW8gQ29udHJvbCBQaW49JWQ7IGlmIHVzZWQgUGluPSVkO1xuIiwgcEFkLT5Db21tb25DZmcuYkhhcmR3YXJlUmFkaW8sIHBBZC0+Q29tbW9uQ2ZnLmJIYXJkd2FyZVJhZGlvKSk7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4UGF0aCA9ICVkLCBSeFBhdGggPSAlZCwgUkZJQz0lZCwgUG9sYXIrTEVEIG1vZGU9JXhcbiIsIHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGgsIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGgsIHBBZC0+UmZJY1R5cGUsIHBBZC0+TGVkQ250bC53b3JkKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tIE5JQ0luaXRBc2ljRnJvbUVFUFJPTVxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJSW5pdGlhbGl6ZSBOSUMgaGFyZHdhcmUKKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUwlOSUNJbml0aWFsaXplQWRhcHRlcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgIEJPT0xFQU4gICAgYkhhcmRSZXNldCkKK3sKKwlORElTX1NUQVRVUyAgICAgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlXUERNQV9HTE9fQ0ZHX1NUUlVDCUdsb0NmZzsKKyNpZmRlZiBSVDI4NjAKKwlVSU5UMzIJCQlWYWx1ZTsKKwlERUxBWV9JTlRfQ0ZHX1NUUlVDCUludENmZzsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwlVTE9ORwlpID0wLCBqPTA7CisJQUNfVFhPUF9DU1IwX1NUUlVDCWNzcjA7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gTklDSW5pdGlhbGl6ZUFkYXB0ZXJcbiIpKTsKKworCS8vIDMuIFNldCBETUEgZ2xvYmFsIGNvbmZpZ3VyYXRpb24gZXhjZXB0IFRYX0RNQV9FTiBhbmQgUlhfRE1BX0VOIGJpdHM6CityZXRyeToKKwlpID0gMDsKKwlkbworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOworCQlpZiAoKEdsb0NmZy5maWVsZC5UeERNQUJ1c3kgPT0gMCkgICYmIChHbG9DZmcuZmllbGQuUnhETUFCdXN5ID09IDApKQorCQkJYnJlYWs7CisKKwkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKwkJaSsrOworCX13aGlsZSAoIGk8MTAwKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gRE1BIG9mZnNldCAweDIwOCA9IDB4JXhcbiIsIEdsb0NmZy53b3JkKSk7CisJR2xvQ2ZnLndvcmQgJj0gMHhmZjA7CisJR2xvQ2ZnLmZpZWxkLkVuVFhXcml0ZUJhY2tERE9ORSA9MTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7CisKKwkvLyBSZWNvcmQgSFcgQmVhY29uIG9mZnNldAorCXBBZC0+QmVhY29uT2Zmc2V0WzBdID0gSFdfQkVBQ09OX0JBU0UwOworCXBBZC0+QmVhY29uT2Zmc2V0WzFdID0gSFdfQkVBQ09OX0JBU0UxOworCXBBZC0+QmVhY29uT2Zmc2V0WzJdID0gSFdfQkVBQ09OX0JBU0UyOworCXBBZC0+QmVhY29uT2Zmc2V0WzNdID0gSFdfQkVBQ09OX0JBU0UzOworCXBBZC0+QmVhY29uT2Zmc2V0WzRdID0gSFdfQkVBQ09OX0JBU0U0OworCXBBZC0+QmVhY29uT2Zmc2V0WzVdID0gSFdfQkVBQ09OX0JBU0U1OworCXBBZC0+QmVhY29uT2Zmc2V0WzZdID0gSFdfQkVBQ09OX0JBU0U2OworCXBBZC0+QmVhY29uT2Zmc2V0WzddID0gSFdfQkVBQ09OX0JBU0U3OworCisJLy8KKwkvLyB3cml0ZSBhbGwgc2hhcmVkIFJpbmcncyBiYXNlIGFkZHJlc3MgaW50byBBU0lDCisJLy8KKworCS8vIGFzaWMgc2ltdWxhdGlvbiBzZXF1ZW5jZSBwdXQgdGhpcyBhaGVhZCBiZWZvcmUgbG9hZGluZyBmaXJtd2FyZS4KKwkvLyBwYmYgaGFyZHdhcmUgcmVzZXQKKyNpZmRlZiBSVDI4NjAKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9SU1RfSURYLCAweDEwMDNmKTsJLy8gMHgxMDAwMCBmb3IgcmVzZXQgcngsIDB4M2YgcmVzZXRzIGFsbCA2IHR4IHJpbmdzLgorCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgMHhlMWYpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgMHhlMDApOworI2VuZGlmIC8vIFJUMjg2MCAvLworCisJLy8gSW5pdGlhbHplIEFTSUMgZm9yIFRYICYgUnggb3BlcmF0aW9uCisJaWYgKE5JQ0luaXRpYWxpemVBc2ljKHBBZCAsIGJIYXJkUmVzZXQpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlpZiAoaisrID09IDApCisJCXsKKwkJCU5JQ0xvYWRGaXJtd2FyZShwQWQpOworCQkJZ290byByZXRyeTsKKwkJfQorCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKworI2lmZGVmIFJUMjg2MAorCS8vIFdyaXRlIEFDX0JLIGJhc2UgYWRkcmVzcyByZWdpc3RlcgorCVZhbHVlID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocEFkLT5UeFJpbmdbUUlEX0FDX0JLXS5DZWxsWzBdLkFsbG9jUGEpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBU0VfUFRSMSwgVmFsdWUpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBUWF9CQVNFX1BUUjEgOiAweCV4XG4iLCBWYWx1ZSkpOworCisJLy8gV3JpdGUgQUNfQkUgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyCisJVmFsdWUgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwQWQtPlR4UmluZ1tRSURfQUNfQkVdLkNlbGxbMF0uQWxsb2NQYSk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFTRV9QVFIwLCBWYWx1ZSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFRYX0JBU0VfUFRSMCA6IDB4JXhcbiIsIFZhbHVlKSk7CisKKwkvLyBXcml0ZSBBQ19WSSBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIKKwlWYWx1ZSA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+VHhSaW5nW1FJRF9BQ19WSV0uQ2VsbFswXS5BbGxvY1BhKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQVNFX1BUUjIsIFZhbHVlKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gVFhfQkFTRV9QVFIyIDogMHgleFxuIiwgVmFsdWUpKTsKKworCS8vIFdyaXRlIEFDX1ZPIGJhc2UgYWRkcmVzcyByZWdpc3RlcgorCVZhbHVlID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocEFkLT5UeFJpbmdbUUlEX0FDX1ZPXS5DZWxsWzBdLkFsbG9jUGEpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBU0VfUFRSMywgVmFsdWUpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBUWF9CQVNFX1BUUjMgOiAweCV4XG4iLCBWYWx1ZSkpOworCisJLy8gV3JpdGUgSENDQSBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIKKwkgIFZhbHVlID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocEFkLT5UeFJpbmdbUUlEX0hDQ0FdLkNlbGxbMF0uQWxsb2NQYSk7CisJICBSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQVNFX1BUUjQsIFZhbHVlKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gVFhfQkFTRV9QVFI0IDogMHgleFxuIiwgVmFsdWUpKTsKKworCS8vIFdyaXRlIE1HTVRfQkFTRV9DU1IgcmVnaXN0ZXIKKwlWYWx1ZSA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+TWdtdFJpbmcuQ2VsbFswXS5BbGxvY1BhKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQVNFX1BUUjUsIFZhbHVlKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gVFhfQkFTRV9QVFI1IDogMHgleFxuIiwgVmFsdWUpKTsKKworCS8vIFdyaXRlIFJYX0JBU0VfQ1NSIHJlZ2lzdGVyCisJVmFsdWUgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwQWQtPlJ4UmluZy5DZWxsWzBdLkFsbG9jUGEpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0JBU0VfUFRSLCBWYWx1ZSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFJYX0JBU0VfUFRSIDogMHgleFxuIiwgVmFsdWUpKTsKKworCS8vIEluaXQgUlggUmluZyBpbmRleCBwb2ludGVyCisJcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHggPSAwOworCXBBZC0+UnhSaW5nLlJ4Q3B1SWR4ID0gUlhfUklOR19TSVpFLTE7CisJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfQ1JYX0lEWCwgcEFkLT5SeFJpbmcuUnhDcHVJZHgpOworCisJLy8gSW5pdCBUWCByaW5ncyBpbmRleCBwb2ludGVyCisJeworCQlmb3IgKGk9MDsgaTxOVU1fT0ZfVFhfUklORzsgaSsrKQorCQl7CisJCQlwQWQtPlR4UmluZ1tpXS5UeFN3RnJlZUlkeCA9IDA7CisJCQlwQWQtPlR4UmluZ1tpXS5UeENwdUlkeCA9IDA7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCAoVFhfQ1RYX0lEWDAgKyBpICogMHgxMCkgLCAgcEFkLT5UeFJpbmdbaV0uVHhDcHVJZHgpOworCQl9CisJfQorCisJLy8gaW5pdCBNR01UIHJpbmcgaW5kZXggcG9pbnRlcgorCXBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggPSAwOworCXBBZC0+TWdtdFJpbmcuVHhDcHVJZHggPSAwOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX01HTVRDVFhfSURYLCAgcEFkLT5NZ210UmluZy5UeENwdUlkeCk7CisKKwkvLworCS8vIHNldCBlYWNoIFJpbmcncyBTSVpFICBpbnRvIEFTSUMuIERlc2NyaXB0b3IgU2l6ZSBpcyBmaXhlZCBieSBkZXNpZ24uCisJLy8KKworCS8vIFdyaXRlIFRYX1JJTkdfQ1NSMCByZWdpc3RlcgorCVZhbHVlID0gVFhfUklOR19TSVpFOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX01BWF9DTlQwLCBWYWx1ZSk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfTUFYX0NOVDEsIFZhbHVlKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9NQVhfQ05UMiwgVmFsdWUpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX01BWF9DTlQzLCBWYWx1ZSk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfTUFYX0NOVDQsIFZhbHVlKTsKKwlWYWx1ZSA9IE1HTVRfUklOR19TSVpFOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX01HTVRNQVhfQ05ULCBWYWx1ZSk7CisKKwkvLyBXcml0ZSBSWF9SSU5HX0NTUiByZWdpc3RlcgorCVZhbHVlID0gUlhfUklOR19TSVpFOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX01BWF9DTlQsIFZhbHVlKTsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCisJLy8gV01NIHBhcmFtZXRlcgorCWNzcjAud29yZCA9IDA7CisJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX1RYT1AwX0NGRywgY3NyMC53b3JkKTsKKwlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCKQorCXsKKwkJY3NyMC5maWVsZC5BYzBUeG9wID0gMTkyOwkvLyBBQ19WSTogMTkyKjMydXMgfj0gNm1zCisJCWNzcjAuZmllbGQuQWMxVHhvcCA9IDk2OwkvLyBBQ19WTzogOTYqMzJ1cyAgfj0gM21zCisJfQorCWVsc2UKKwl7CisJCWNzcjAuZmllbGQuQWMwVHhvcCA9IDk2OwkvLyBBQ19WSTogOTYqMzJ1cyB+PSAzbXMKKwkJY3NyMC5maWVsZC5BYzFUeG9wID0gNDg7CS8vIEFDX1ZPOiA0OCozMnVzIH49IDEuNW1zCisJfQorCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9UWE9QMV9DRkcsIGNzcjAud29yZCk7CisKKworI2lmZGVmIFJUMjg2MAorCS8vIDMuIFNldCBETUEgZ2xvYmFsIGNvbmZpZ3VyYXRpb24gZXhjZXB0IFRYX0RNQV9FTiBhbmQgUlhfRE1BX0VOIGJpdHM6CisJaSA9IDA7CisJZG8KKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsKKwkJaWYgKChHbG9DZmcuZmllbGQuVHhETUFCdXN5ID09IDApICAmJiAoR2xvQ2ZnLmZpZWxkLlJ4RE1BQnVzeSA9PSAwKSkKKwkJCWJyZWFrOworCisJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJCWkrKzsKKwl9d2hpbGUgKCBpIDwgMTAwKTsKKworCUdsb0NmZy53b3JkICY9IDB4ZmYwOworCUdsb0NmZy5maWVsZC5FblRYV3JpdGVCYWNrRERPTkUgPTE7CisJUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfR0xPX0NGRywgR2xvQ2ZnLndvcmQpOworCisJSW50Q2ZnLndvcmQgPSAwOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIERFTEFZX0lOVF9DRkcsIEludENmZy53b3JkKTsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCisJLy8gcmVzZXQgYWN0aW9uCisJLy8gTG9hZCBmaXJtd2FyZQorCS8vICBTdGF0dXMgPSBOSUNMb2FkRmlybXdhcmUocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBOSUNJbml0aWFsaXplQWRhcHRlclxuIikpOworCXJldHVybiBTdGF0dXM7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlJbml0aWFsaXplIEFTSUMKKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUwlOSUNJbml0aWFsaXplQXNpYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgQk9PTEVBTgkJYkhhcmRSZXNldCkKK3sKKwlVTE9ORwkJCUluZGV4ID0gMDsKKwlVQ0hBUgkJCVIwID0gMHhmZjsKKwlVSU5UMzIJCQlNYWNDc3IxMiA9IDAsIENvdW50ZXIgPSAwOworCVVTSE9SVAkJCUtleUlkeDsKKwlJTlQJCQkJaSxhcGlkeDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBOSUNJbml0aWFsaXplQXNpY1xuIikpOworCisjaWZkZWYgUlQyODYwCisJaWYgKGJIYXJkUmVzZXQgPT0gVFJVRSkKKwl7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHgzKTsKKwl9CisJZWxzZQorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4MSk7CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4MCk7CisJLy8gSW5pdGlhbGl6ZSBNQUMgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQorCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IE5VTV9NQUNfUkVHX1BBUk1TOyBJbmRleCsrKQorCXsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDUmVnVGFibGVbSW5kZXhdLlJlZ2lzdGVyLCBNQUNSZWdUYWJsZVtJbmRleF0uVmFsdWUpOworCX0KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IE5VTV9TVEFfTUFDX1JFR19QQVJNUzsgSW5kZXgrKykKKwkJeworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgU1RBTUFDUmVnVGFibGVbSW5kZXhdLlJlZ2lzdGVyLCBTVEFNQUNSZWdUYWJsZVtJbmRleF0uVmFsdWUpOworCQl9CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworI2VuZGlmIC8vIFJUMjg2MCAvLworCisKKwkvLworCS8vIEJlZm9yZSBwcm9ncmFtIEJCUCwgd2UgbmVlZCB0byB3YWl0IEJCUC9SRiBnZXQgd2FrZSB1cC4KKwkvLworCUluZGV4ID0gMDsKKwlkbworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1RBVFVTX0NGRywgJk1hY0NzcjEyKTsKKworCQlpZiAoKE1hY0NzcjEyICYgMHgwMykgPT0gMCkJLy8gaWYgQkIuUkYgaXMgc3RhYmxlCisJCQlicmVhazsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGVjayBNQUNfU1RBVFVTX0NGRyAgPSBCdXN5ID0gJXhcbiIsIE1hY0NzcjEyKSk7CisJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJfSB3aGlsZSAoSW5kZXgrKyA8IDEwMCk7CisKKyAgICAvLyBUaGUgY29tbWFuZHMgdG8gZmlybXdhcmUgc2hvdWxkIGJlIGFmdGVyIHRoZXNlIGNvbW1hbmRzLCB0aGVzZSBjb21tYW5kcyB3aWxsIGluaXQgZmlybXdhcmUKKwkvLyBQQ0kgYW5kIFVTQiBhcmUgbm90IHRoZSBzYW1lIGJlY2F1c2UgUENJIGRyaXZlciBuZWVkcyB0byB3YWl0IGZvciBQQ0kgYnVzIHJlYWR5CisJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX0JCUF9BR0VOVCwgMCk7CS8vIGluaXRpYWxpemUgQkJQIFIvVyBhY2Nlc3MgYWdlbnQKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9DU1IsIDApOworCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisKKwkvLyBSZWFkIEJCUCByZWdpc3RlciwgbWFrZSBzdXJlIEJCUCBpcyB1cCBhbmQgcnVubmluZyBiZWZvcmUgd3JpdGUgbmV3IGRhdGEKKwlJbmRleCA9IDA7CisJZG8KKwl7CisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMCwgJlIwKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkJQIHZlcnNpb24gPSAleFxuIiwgUjApKTsKKwl9IHdoaWxlICgoKytJbmRleCA8IDIwKSAmJiAoKFIwID09IDB4ZmYpIHx8IChSMCA9PSAweDAwKSkpOworCS8vQVNTRVJUKEluZGV4IDwgMjApOyAvL3RoaXMgd2lsbCBjYXVzZSBCU09EIG9uIENoZWNrLWJ1aWxkIGRyaXZlcgorCisJaWYgKChSMCA9PSAweGZmKSB8fCAoUjAgPT0gMHgwMCkpCisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCisJLy8gSW5pdGlhbGl6ZSBCQlAgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQorCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IE5VTV9CQlBfUkVHX1BBUk1TOyBJbmRleCsrKQorCXsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUFJlZ1RhYmxlW0luZGV4XS5SZWdpc3RlciwgQkJQUmVnVGFibGVbSW5kZXhdLlZhbHVlKTsKKwl9CisKKwkvLyBmb3IgcnQyODYwRSBhbmQgYWZ0ZXIsIGluaXQgQkJQX1I4NCB3aXRoIDB4MTkuIFRoaXMgaXMgZm9yIGV4dGVuc2lvbiBjaGFubmVsIG92ZXJsYXBwaW5nIElPVC4KKwlpZiAoKHBBZC0+TUFDVmVyc2lvbiYweGZmZmYpICE9IDB4MDEwMSkKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODQsIDB4MTkpOworCisKKwlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCisJeworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgMHgxNik7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjczLCAweDEyKTsKKyAgICB9CisKKwlpZiAocEFkLT5NQUNWZXJzaW9uID49IFJBTElOS18yODgwRV9WRVJTSU9OICYmIHBBZC0+TUFDVmVyc2lvbiA8IFJBTElOS18zMDcwX1ZFUlNJT04pIC8vIDMqMworCXsKKwkJLy8gZW5sYXJnZSBNQVhfTEVOX0NGRworCQlVSU5UMzIgY3NyOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BWF9MRU5fQ0ZHLCAmY3NyKTsKKwkJY3NyICY9IDB4RkZGOworCQljc3IgfD0gMHgyMDAwOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQVhfTEVOX0NGRywgY3NyKTsKKwl9CisKKworCS8vIEFkZCByYWRpbyBvZmYgY29udHJvbAorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IEZBTFNFKQorCQl7CisvLwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBXUl9QSU5fQ0ZHLCAweDAwMDAxODE4KTsKKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQgUmFkaW8gT2ZmXG4iKSk7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLyBDbGVhciByYXcgY291bnRlcnMKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX1NUQV9DTlQwLCAmQ291bnRlcik7CisJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9TVEFfQ05UMSwgJkNvdW50ZXIpOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfU1RBX0NOVDIsICZDb3VudGVyKTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQwLCAmQ291bnRlcik7CisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMSwgJkNvdW50ZXIpOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDIsICZDb3VudGVyKTsKKworCS8vIEFTSUMgd2lsbCBrZWVwIGdhcmJhZ2UgdmFsdWUgYWZ0ZXIgYm9vdAorCS8vIENsZWFyIGFsbCBzZWFyZWQga2V5IHRhYmxlIHdoZW4gaW5pdGlhbAorCS8vIFRoaXMgcm91dGluZSBjYW4gYmUgaWdub3JlZCBpbiByYWRpby1PTi9PRkYgb3BlcmF0aW9uLgorCWlmIChiSGFyZFJlc2V0KQorCXsKKwkJZm9yIChLZXlJZHggPSAwOyBLZXlJZHggPCA0OyBLZXlJZHgrKykKKwkJeworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UgKyA0KktleUlkeCwgMCk7CisJCX0KKworCQkvLyBDbGVhciBhbGwgcGFpcndpc2Uga2V5IHRhYmxlIHdoZW4gaW5pdGlhbAorCQlmb3IgKEtleUlkeCA9IDA7IEtleUlkeCA8IDI1NjsgS2V5SWR4KyspCisJCXsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsgKEtleUlkeCAqIEhXX1dDSURfQVRUUklfU0laRSksIDEpOworCQl9CisJfQorCisKKwkvLyBJdCBpc24ndCBuZWNlc3NhcnkgdG8gY2xlYXIgdGhpcyBzcGFjZSB3aGVuIG5vdCBoYXJkIHJlc2V0LgorCWlmIChiSGFyZFJlc2V0ID09IFRSVUUpCisJeworCQkvLyBjbGVhciBhbGwgb24tY2hpcCBCRUFDT04gZnJhbWUgc3BhY2UKKwkJZm9yIChhcGlkeCA9IDA7IGFwaWR4IDwgSFdfQkVBQ09OX01BWF9DT1VOVDsgYXBpZHgrKykKKwkJeworCQkJZm9yIChpID0gMDsgaSA8IEhXX0JFQUNPTl9PRkZTRVQ+PjI7IGkrPTQpCisJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgcEFkLT5CZWFjb25PZmZzZXRbYXBpZHhdICsgaSwgMHgwMCk7CisJCX0KKwl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJLy8gZm9yIHJ0Mjg2MEUgYW5kIGFmdGVyLCBpbml0IFRYT1BfQ1RSTF9DRkcgd2l0aCAweDU4M2YuIFRoaXMgaXMgZm9yIGV4dGVuc2lvbiBjaGFubmVsIG92ZXJsYXBwaW5nIElPVC4KKwkJaWYgKChwQWQtPk1BQ1ZlcnNpb24mMHhmZmZmKSAhPSAweDAxMDEpCisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWE9QX0NUUkxfQ0ZHLCAweDU4M2YpOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBOSUNJbml0aWFsaXplQXNpY1xuIikpOworCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUmVzZXQgTklDIEFzaWNzCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwlOb3RlOgorCQlSZXNldCBOSUMgdG8gaW5pdGlhbCBzdGF0ZSBBUyBJUyBzeXN0ZW0gYm9vdCB1cCB0aW1lLgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlOSUNJc3N1ZVJlc2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVVJTlQzMglWYWx1ZSA9IDA7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IE5JQ0lzc3VlUmVzZXRcbiIpKTsKKworCS8vIERpc2FibGUgUngsIHJlZ2lzdGVyIHZhbHVlIHN1cHBvc2VkIHdpbGwgcmVtYWluIGFmdGVyIHJlc2V0CisJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJVmFsdWUgJj0gKDB4ZmZmZmZmZjMpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCisJLy8gSXNzdWUgcmVzZXQgYW5kIGNsZWFyIGZyb20gcmVzZXQgc3RhdGUKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4MDMpOyAvLyAyMDA0LTA5LTE3IGNoYW5nZSBmcm9tIDB4MDEKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4MDApOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tIE5JQ0lzc3VlUmVzZXRcbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNoZWNrIEFTSUMgcmVnaXN0ZXJzIGFuZCBmaW5kIGFueSByZWFzb24gdGhlIHN5c3RlbSBtaWdodCBoYW5nCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTglOSUNDaGVja0ZvckhhbmcoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJcmV0dXJuIChGQUxTRSk7Cit9CisKK1ZPSUQgTklDVXBkYXRlRmlmb1N0YUNvdW50ZXJzKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVRYX1NUQV9GSUZPX1NUUlVDCVN0YUZpZm87CisJTUFDX1RBQkxFX0VOVFJZCQkqcEVudHJ5OworCVVDSEFSCQkJCWkgPSAwOworCVVDSEFSCQkJcGlkID0gMCwgd2NpZCA9IDA7CisJQ0hBUgkJCQlyZVRyeTsKKwlVQ0hBUgkJCQlzdWNjTUNTOworCisjaWZkZWYgUkFMSU5LX0FURQorCS8qIE5vdGhpbmcgdG8gZG8gaW4gQVRFIG1vZGUgKi8KKwlpZiAoQVRFX09OKHBBZCkpCisJCXJldHVybjsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKwkJZG8KKwkJeworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfRklGTywgJlN0YUZpZm8ud29yZCk7CisKKwkJCWlmIChTdGFGaWZvLmZpZWxkLmJWYWxpZCA9PSAwKQorCQkJCWJyZWFrOworCisJCQl3Y2lkID0gKFVDSEFSKVN0YUZpZm8uZmllbGQud2NpZDsKKworCisJCS8qIGlnbm9yZSBOb0FDSyBhbmQgTUdNVCBmcmFtZSB1c2UgMHhGRiBhcyBXQ0lEICovCisJCQlpZiAoKFN0YUZpZm8uZmllbGQuVHhBY2tSZXF1aXJlZCA9PSAwKSB8fCAod2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkpCisJCQl7CisJCQkJaSsrOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKiBQSUQgc3RvcmUgVHggTUNTIFJhdGUgKi8KKwkJCXBpZCA9IChVQ0hBUilTdGFGaWZvLmZpZWxkLlBpZFR5cGU7CisKKwkJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3djaWRdOworCisJCQlwRW50cnktPkRlYnVnRklGT0NvdW50Kys7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCWlmIChTdGFGaWZvLmZpZWxkLlR4QkYpIC8vIDMqMworCQkJCXBFbnRyeS0+VHhCRkNvdW50Kys7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKyNpZmRlZiBVQVBTRF9BUF9TVVBQT1JUCisJCQlVQVBTRF9TUF9BVUVfSGFuZGxlKHBBZCwgcEVudHJ5LCBTdGFGaWZvLmZpZWxkLlR4U3VjY2Vzcyk7CisjZW5kaWYgLy8gVUFQU0RfQVBfU1VQUE9SVCAvLworCisJCQlpZiAoIVN0YUZpZm8uZmllbGQuVHhTdWNjZXNzKQorCQkJeworCQkJCXBFbnRyeS0+RklGT0NvdW50Kys7CisJCQkJcEVudHJ5LT5PbmVTZWNUeEZhaWxDb3VudCsrOworCisJCQkJaWYgKHBFbnRyeS0+RklGT0NvdW50ID49IDEpCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIjIikpOworI2lmIDAKKwkJCQkJU2VuZFJlZnJlc2hCQVIocEFkLCBwRW50cnkpOworCQkJCQlwRW50cnktPk5vQkFEYXRhQ291bnREb3duID0gNjQ7CisjZWxzZQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCQlwRW50cnktPk5vQkFEYXRhQ291bnREb3duID0gNjQ7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJCQkJaWYocEVudHJ5LT5Qc01vZGUgPT0gUFdSX0FDVElWRSkKKwkJCQkJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCQkJaW50IHRpZDsKKwkJCQkJCWZvciAodGlkPTA7IHRpZDxOVU1fT0ZfVElEOyB0aWQrKykKKwkJCQkJCXsKKwkJCQkJCQlCQU9yaVNlc3Npb25UZWFyRG93bihwQWQsIHBFbnRyeS0+QWlkLCAgdGlkLCBGQUxTRSwgRkFMU0UpOworCQkJCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCQkJCQkvLyBVcGRhdGUgdGhlIGNvbnRpbnVvdXMgdHJhbnNtaXNzaW9uIGNvdW50ZXIgZXhjZXB0IFBTIG1vZGUKKwkJCQkJCXBFbnRyeS0+Q29udGludWVUeEZhaWxDbnQrKzsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCS8vIENsZWFyIHRoZSBGSUZPQ291bnQgd2hlbiBzdGEgaW4gUG93ZXIgU2F2ZSBtb2RlLiBCYXNpY2FsbHkgd2UgYXNzdW1lCisJCQkJCQkvLyAgICAgdGhpcyB0eCBlcnJvciBoYXBwZW5lZCBkdWUgdG8gc3RhIGp1c3QgZ28gdG8gc2xlZXAuCisJCQkJCQlwRW50cnktPkZJRk9Db3VudCA9IDA7CisJCQkJCQlwRW50cnktPkNvbnRpbnVlVHhGYWlsQ250ID0gMDsKKwkJCQkJfQorI2VuZGlmCisJCQkJCS8vcEVudHJ5LT5GSUZPQ291bnQgPSAwOworCQkJCX0KKwkJCQkvL3BFbnRyeS0+YlNlbmRCQVIgPSBUUlVFOworCQkJfQorCQkJZWxzZQorCQkJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCWlmICgocEVudHJ5LT5Qc01vZGUgIT0gUFdSX1NBVkUpICYmIChwRW50cnktPk5vQkFEYXRhQ291bnREb3duID4gMCkpCisJCQkJeworCQkJCQlwRW50cnktPk5vQkFEYXRhQ291bnREb3duLS07CisJCQkJCWlmIChwRW50cnktPk5vQkFEYXRhQ291bnREb3duPT0wKQorCQkJCQl7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJAXG4iKSk7CisJCQkJCX0KKwkJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkJcEVudHJ5LT5GSUZPQ291bnQgPSAwOworCQkJCXBFbnRyeS0+T25lU2VjVHhOb1JldHJ5T2tDb3VudCsrOworCQkJCS8vIHVwZGF0ZSBOb0RhdGFJZGxlQ291bnQgd2hlbiBzdWNlc3NmdWwgc2VuZCBwYWNrZXQgdG8gU1RBLgorCQkJCXBFbnRyeS0+Tm9EYXRhSWRsZUNvdW50ID0gMDsKKwkJCQlwRW50cnktPkNvbnRpbnVlVHhGYWlsQ250ID0gMDsKKwkJCX0KKworCQkJc3VjY01DUyA9IFN0YUZpZm8uZmllbGQuU3VjY2Vzc1JhdGUgJiAweDdGOworCisJCQlyZVRyeSA9IHBpZCAtIHN1Y2NNQ1M7CisKKwkJCWlmIChTdGFGaWZvLmZpZWxkLlR4U3VjY2VzcykKKwkJCXsKKwkJCQlwRW50cnktPlRYTUNTRXhwZWN0ZWRbcGlkXSsrOworCQkJCWlmIChwaWQgPT0gc3VjY01DUykKKwkJCQl7CisJCQkJCXBFbnRyeS0+VFhNQ1NTdWNjZXNzZnVsW3BpZF0rKzsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcEVudHJ5LT5UWE1DU0F1dG9GYWxsQmFja1twaWRdW3N1Y2NNQ1NdKys7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXBFbnRyeS0+VFhNQ1NGYWlsZWRbcGlkXSsrOworCQkJfQorCisJCQlpZiAocmVUcnkgPiAwKQorCQkJeworCQkJCWlmICgocGlkID49IDEyKSAmJiBzdWNjTUNTIDw9NykKKwkJCQl7CisJCQkJCXJlVHJ5IC09IDQ7CisJCQkJfQorCQkJCXBFbnRyeS0+T25lU2VjVHhSZXRyeU9rQ291bnQgKz0gcmVUcnk7CisJCQl9CisKKwkJCWkrKzsKKwkJCS8vIEFTSUMgc3RvcmUgMTYgc3RhY2sKKwkJfSB3aGlsZSAoIGkgPCAoMipUWF9SSU5HX1NJWkUpICk7CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJlYWQgc3RhdGlzdGljYWwgY291bnRlcnMgZnJvbSBoYXJkd2FyZSByZWdpc3RlcnMgYW5kIHJlY29yZCB0aGVtCisJCWluIHNvZnR3YXJlIHZhcmlhYmxlcyBmb3IgbGF0ZXIgb24gcXVlcnkKKworCUFyZ3VtZW50czoKKwkJcEFkCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBOSUNVcGRhdGVSYXdDb3VudGVycygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlVSU5UMzIJT2xkVmFsdWU7CisJUlhfU1RBX0NOVDBfU1RSVUMJIFJ4U3RhQ250MDsKKwlSWF9TVEFfQ05UMV9TVFJVQyAgIFJ4U3RhQ250MTsKKwlSWF9TVEFfQ05UMl9TVFJVQyAgIFJ4U3RhQ250MjsKKwlUWF9TVEFfQ05UMF9TVFJVQyAJIFR4U3RhQ250MDsKKwlUWF9TVEFfQ05UMV9TVFJVQwkgU3RhVHgxOworCVRYX1NUQV9DTlQyX1NUUlVDCSBTdGFUeDI7CisJVFhfQUdHX0NOVF9TVFJVQwlUeEFnZ0NudDsKKwlUWF9BR0dfQ05UMF9TVFJVQwlUeEFnZ0NudDA7CisJVFhfQUdHX0NOVDFfU1RSVUMJVHhBZ2dDbnQxOworCVRYX0FHR19DTlQyX1NUUlVDCVR4QWdnQ250MjsKKwlUWF9BR0dfQ05UM19TVFJVQwlUeEFnZ0NudDM7CisJVFhfQUdHX0NOVDRfU1RSVUMJVHhBZ2dDbnQ0OworCVRYX0FHR19DTlQ1X1NUUlVDCVR4QWdnQ250NTsKKwlUWF9BR0dfQ05UNl9TVFJVQwlUeEFnZ0NudDY7CisJVFhfQUdHX0NOVDdfU1RSVUMJVHhBZ2dDbnQ3OworCisJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9TVEFfQ05UMCwgJlJ4U3RhQ250MC53b3JkKTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX1NUQV9DTlQyLCAmUnhTdGFDbnQyLndvcmQpOworCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX1NUQV9DTlQxLCAmUnhTdGFDbnQxLndvcmQpOworCSAgICAvLyBVcGRhdGUgUlggUExDUCBlcnJvciBjb3VudGVyCisJICAgIHBBZC0+UHJpdmF0ZUluZm8uUGh5UnhFcnJDbnQgKz0gUnhTdGFDbnQxLmZpZWxkLlBsY3BFcnI7CisJCS8vIFVwZGF0ZSBGYWxzZSBDQ0EgY291bnRlcgorCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0ZhbHNlQ0NBQ250ICs9IFJ4U3RhQ250MS5maWVsZC5GYWxzZUNjYTsKKwl9CisKKwkvLyBVcGRhdGUgRkNTIGNvdW50ZXJzCisJT2xkVmFsdWU9IHBBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQudS5Mb3dQYXJ0OworCXBBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQudS5Mb3dQYXJ0ICs9IChSeFN0YUNudDAuZmllbGQuQ3JjRXJyKTsgLy8gPj4gNyk7CisJaWYgKHBBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQudS5Mb3dQYXJ0IDwgT2xkVmFsdWUpCisJCXBBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQudS5IaWdoUGFydCsrOworCisJLy8gQWRkIEZDUyBlcnJvciBjb3VudCB0byBwcml2YXRlIGNvdW50ZXJzCisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeEZjc0VyckNudCArPSBSeFN0YUNudDAuZmllbGQuQ3JjRXJyOworCU9sZFZhbHVlID0gcEFkLT5SYWxpbmtDb3VudGVycy5SZWFsRmNzRXJyQ291bnQudS5Mb3dQYXJ0OworCXBBZC0+UmFsaW5rQ291bnRlcnMuUmVhbEZjc0VyckNvdW50LnUuTG93UGFydCArPSBSeFN0YUNudDAuZmllbGQuQ3JjRXJyOworCWlmIChwQWQtPlJhbGlua0NvdW50ZXJzLlJlYWxGY3NFcnJDb3VudC51Lkxvd1BhcnQgPCBPbGRWYWx1ZSkKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5SZWFsRmNzRXJyQ291bnQudS5IaWdoUGFydCsrOworCisJLy8gVXBkYXRlIER1cGxpY2F0ZSBSY3YgY2hlY2sKKwlwQWQtPlJhbGlua0NvdW50ZXJzLkR1cGxpY2F0ZVJjdiArPSBSeFN0YUNudDIuZmllbGQuUnhEdXBsaUNvdW50OworCXBBZC0+V2xhbkNvdW50ZXJzLkZyYW1lRHVwbGljYXRlQ291bnQudS5Mb3dQYXJ0ICs9IFJ4U3RhQ250Mi5maWVsZC5SeER1cGxpQ291bnQ7CisJLy8gVXBkYXRlIFJYIE92ZXJmbG93IGNvdW50ZXIKKwlwQWQtPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyICs9IChSeFN0YUNudDIuZmllbGQuUnhGaWZvT3ZlcmZsb3dDb3VudCk7CisKKwlpZiAoIXBBZC0+YlVwZGF0ZUJjbkNudERvbmUpCisJeworCS8vIFVwZGF0ZSBCRUFDT04gc2VudCBjb3VudAorCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDAsICZUeFN0YUNudDAud29yZCk7CisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMSwgJlN0YVR4MS53b3JkKTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQyLCAmU3RhVHgyLndvcmQpOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjQmVhY29uU2VudENudCArPSBUeFN0YUNudDAuZmllbGQuVHhCZWFjb25Db3VudDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ICs9IFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICs9IFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudCArPSBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7CisJcEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LnUuTG93UGFydCArPSBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOworCXBBZC0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQudS5Mb3dQYXJ0ICs9IFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7CisJcEFkLT5XbGFuQ291bnRlcnMuRmFpbGVkQ291bnQudS5Mb3dQYXJ0ICs9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKwl9CisKKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQUdHX0NOVCwgJlR4QWdnQ250LndvcmQpOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQwLCAmVHhBZ2dDbnQwLndvcmQpOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQxLCAmVHhBZ2dDbnQxLndvcmQpOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQyLCAmVHhBZ2dDbnQyLndvcmQpOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQzLCAmVHhBZ2dDbnQzLndvcmQpOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQ0LCAmVHhBZ2dDbnQ0LndvcmQpOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQ1LCAmVHhBZ2dDbnQ1LndvcmQpOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQ2LCAmVHhBZ2dDbnQ2LndvcmQpOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQ3LCAmVHhBZ2dDbnQ3LndvcmQpOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnQ291bnQgKz0gVHhBZ2dDbnQuZmllbGQuQWdnVHhDb3VudDsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeE5vbkFnZ0NvdW50ICs9IFR4QWdnQ250LmZpZWxkLk5vbkFnZ1R4Q291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxTVBEVUNvdW50ICs9IFR4QWdnQ250MC5maWVsZC5BZ2dTaXplMUNvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMk1QRFVDb3VudCArPSBUeEFnZ0NudDAuZmllbGQuQWdnU2l6ZTJDb3VudDsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnM01QRFVDb3VudCArPSBUeEFnZ0NudDEuZmllbGQuQWdnU2l6ZTNDb3VudDsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzRNUERVQ291bnQgKz0gVHhBZ2dDbnQxLmZpZWxkLkFnZ1NpemU0Q291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2c1TVBEVUNvdW50ICs9IFR4QWdnQ250Mi5maWVsZC5BZ2dTaXplNUNvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnNk1QRFVDb3VudCArPSBUeEFnZ0NudDIuZmllbGQuQWdnU2l6ZTZDb3VudDsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnN01QRFVDb3VudCArPSBUeEFnZ0NudDMuZmllbGQuQWdnU2l6ZTdDb3VudDsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzhNUERVQ291bnQgKz0gVHhBZ2dDbnQzLmZpZWxkLkFnZ1NpemU4Q291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2c5TVBEVUNvdW50ICs9IFR4QWdnQ250NC5maWVsZC5BZ2dTaXplOUNvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMTBNUERVQ291bnQgKz0gVHhBZ2dDbnQ0LmZpZWxkLkFnZ1NpemUxMENvdW50OworCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxMU1QRFVDb3VudCArPSBUeEFnZ0NudDUuZmllbGQuQWdnU2l6ZTExQ291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxMk1QRFVDb3VudCArPSBUeEFnZ0NudDUuZmllbGQuQWdnU2l6ZTEyQ291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxM01QRFVDb3VudCArPSBUeEFnZ0NudDYuZmllbGQuQWdnU2l6ZTEzQ291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxNE1QRFVDb3VudCArPSBUeEFnZ0NudDYuZmllbGQuQWdnU2l6ZTE0Q291bnQ7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzE1TVBEVUNvdW50ICs9IFR4QWdnQ250Ny5maWVsZC5BZ2dTaXplMTVDb3VudDsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzE2TVBEVUNvdW50ICs9IFR4QWdnQ250Ny5maWVsZC5BZ2dTaXplMTZDb3VudDsKKworCQkvLyBDYWxjdWxhdGUgdGhlIHRyYW5zbWl0dGVkIEEtTVBEVSBjb3VudAorCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gVHhBZ2dDbnQwLmZpZWxkLkFnZ1NpemUxQ291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQwLmZpZWxkLkFnZ1NpemUyQ291bnQgLyAyKTsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250MS5maWVsZC5BZ2dTaXplM0NvdW50IC8gMyk7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQxLmZpZWxkLkFnZ1NpemU0Q291bnQgLyA0KTsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250Mi5maWVsZC5BZ2dTaXplNUNvdW50IC8gNSk7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQyLmZpZWxkLkFnZ1NpemU2Q291bnQgLyA2KTsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250My5maWVsZC5BZ2dTaXplN0NvdW50IC8gNyk7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQzLmZpZWxkLkFnZ1NpemU4Q291bnQgLyA4KTsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250NC5maWVsZC5BZ2dTaXplOUNvdW50IC8gOSk7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQ0LmZpZWxkLkFnZ1NpemUxMENvdW50IC8gMTApOworCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQ1LmZpZWxkLkFnZ1NpemUxMUNvdW50IC8gMTEpOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250NS5maWVsZC5BZ2dTaXplMTJDb3VudCAvIDEyKTsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250Ni5maWVsZC5BZ2dTaXplMTNDb3VudCAvIDEzKTsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDYuZmllbGQuQWdnU2l6ZTE0Q291bnQgLyAxNCk7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDcuZmllbGQuQWdnU2l6ZTE1Q291bnQgLyAxNSk7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQ3LmZpZWxkLkFnZ1NpemUxNkNvdW50IC8gMTYpOworCX0KKworI2lmZGVmIERCR19ESUFHTk9TRQorCXsKKwkJUnRtcERpYWdTdHJ1Y3QJKnBEaWFnOworCQlDT1VOVEVSX1JBTElOSwkqcFJhbGlua0NvdW50ZXJzOworCQlVQ0hBUgkJCUFycmF5Q3VySWR4LCBpOworCisJCXBEaWFnID0gJnBBZC0+RGlhZ1N0cnVjdDsKKwkJcFJhbGlua0NvdW50ZXJzID0gJnBBZC0+UmFsaW5rQ291bnRlcnM7CisJCUFycmF5Q3VySWR4ID0gcERpYWctPkFycmF5Q3VySWR4OworCisJCWlmIChwRGlhZy0+aW5pdGVkID09IDApCisJCXsKKwkJCU5kaXNaZXJvTWVtb3J5KHBEaWFnLCBzaXplb2Yoc3RydWN0IF9SdG1wRGlhZ1N0cmN1dF8pKTsKKwkJCXBEaWFnLT5BcnJheVN0YXJ0SWR4ID0gcERpYWctPkFycmF5Q3VySWR4ID0gMDsKKwkJCXBEaWFnLT5pbml0ZWQgPSAxOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gVHgKKwkJCXBEaWFnLT5UeEZhaWxDbnRbQXJyYXlDdXJJZHhdID0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OworCQkJcERpYWctPlR4QWdnQ250W0FycmF5Q3VySWR4XSA9IFR4QWdnQ250LmZpZWxkLkFnZ1R4Q291bnQ7CisJCQlwRGlhZy0+VHhOb25BZ2dDbnRbQXJyYXlDdXJJZHhdID0gVHhBZ2dDbnQuZmllbGQuTm9uQWdnVHhDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVswXSA9IFR4QWdnQ250MC5maWVsZC5BZ2dTaXplMUNvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzFdID0gVHhBZ2dDbnQwLmZpZWxkLkFnZ1NpemUyQ291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bMl0gPSBUeEFnZ0NudDEuZmllbGQuQWdnU2l6ZTNDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVszXSA9IFR4QWdnQ250MS5maWVsZC5BZ2dTaXplNENvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzRdID0gVHhBZ2dDbnQyLmZpZWxkLkFnZ1NpemU1Q291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bNV0gPSBUeEFnZ0NudDIuZmllbGQuQWdnU2l6ZTZDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVs2XSA9IFR4QWdnQ250My5maWVsZC5BZ2dTaXplN0NvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzddID0gVHhBZ2dDbnQzLmZpZWxkLkFnZ1NpemU4Q291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bOF0gPSBUeEFnZ0NudDQuZmllbGQuQWdnU2l6ZTlDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVs5XSA9IFR4QWdnQ250NC5maWVsZC5BZ2dTaXplMTBDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVsxMF0gPSBUeEFnZ0NudDUuZmllbGQuQWdnU2l6ZTExQ291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bMTFdID0gVHhBZ2dDbnQ1LmZpZWxkLkFnZ1NpemUxMkNvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzEyXSA9IFR4QWdnQ250Ni5maWVsZC5BZ2dTaXplMTNDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVsxM10gPSBUeEFnZ0NudDYuZmllbGQuQWdnU2l6ZTE0Q291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bMTRdID0gVHhBZ2dDbnQ3LmZpZWxkLkFnZ1NpemUxNUNvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzE1XSA9IFR4QWdnQ250Ny5maWVsZC5BZ2dTaXplMTZDb3VudDsKKworCQkJcERpYWctPlJ4Q3JjRXJyQ250W0FycmF5Q3VySWR4XSA9IFJ4U3RhQ250MC5maWVsZC5DcmNFcnI7CisKKwkJCUlOQ19SSU5HX0lOREVYKHBEaWFnLT5BcnJheUN1cklkeCwgIERJQUdOT1NFX1RJTUUpOworCQkJQXJyYXlDdXJJZHggPSBwRGlhZy0+QXJyYXlDdXJJZHg7CisJCQlmb3IgKGkgPTA7IGkgPCA5OyBpKyspCisJCQl7CisJCQkJcERpYWctPlR4RGVzY0NudFtBcnJheUN1cklkeF1baV09IDA7CisJCQkJcERpYWctPlR4U1dRdWVDbnRbQXJyYXlDdXJJZHhdW2ldID0wOworCQkJCXBEaWFnLT5UeE1jc0NudFtBcnJheUN1cklkeF1baV0gPSAwOworCQkJCXBEaWFnLT5SeE1jc0NudFtBcnJheUN1cklkeF1baV0gPSAwOworCQkJfQorCQkJcERpYWctPlR4RGF0YUNudFtBcnJheUN1cklkeF0gPSAwOworCQkJcERpYWctPlR4RmFpbENudFtBcnJheUN1cklkeF0gPSAwOworCQkJcERpYWctPlJ4RGF0YUNudFtBcnJheUN1cklkeF0gPSAwOworCQkJcERpYWctPlJ4Q3JjRXJyQ250W0FycmF5Q3VySWR4XSAgPSAwOworCQkJZm9yIChpID0gOTsgaSA8IDI0OyBpKyspIC8vIDMqMworCQkJeworCQkJCXBEaWFnLT5UeERlc2NDbnRbQXJyYXlDdXJJZHhdW2ldID0gMDsKKwkJCQlwRGlhZy0+VHhNY3NDbnRbQXJyYXlDdXJJZHhdW2ldID0gMDsKKwkJCQlwRGlhZy0+UnhNY3NDbnRbQXJyYXlDdXJJZHhdW2ldID0gMDsKK30KKworCQkJaWYgKHBEaWFnLT5BcnJheUN1cklkeCA9PSBwRGlhZy0+QXJyYXlTdGFydElkeCkKKwkJCQlJTkNfUklOR19JTkRFWChwRGlhZy0+QXJyYXlTdGFydElkeCwgIERJQUdOT1NFX1RJTUUpOworCQl9CisKKwl9CisjZW5kaWYgLy8gREJHX0RJQUdOT1NFIC8vCisKKworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlSZXNldCBOSUMgZnJvbSBlcnJvcgorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKwkJUmVzZXQgTklDIGZyb20gZXJyb3Igc3RhdGUKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJTklDUmVzZXRGcm9tRXJyb3IoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJLy8gUmVzZXQgQkJQIChhY2NvcmRpbmcgdG8gYWxleCwgcmVzZXQgQVNJQyB3aWxsIGZvcmNlIHJlc2V0IEJCUAorCS8vIFRoZXJlZm9yZSwgc2tpcCB0aGUgcmVzZXQgQkJQCisJLy8gUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0NTUjEsIDB4Mik7CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4MSk7CisJLy8gUmVtb3ZlIEFTSUMgZnJvbSByZXNldCBzdGF0ZQorCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHgwKTsKKworCU5JQ0luaXRpYWxpemVBZGFwdGVyKHBBZCwgRkFMU0UpOworCU5JQ0luaXRBc2ljRnJvbUVFUFJPTShwQWQpOworCisJLy8gU3dpdGNoIHRvIGN1cnJlbnQgY2hhbm5lbCwgc2luY2UgZHVyaW5nIHJlc2V0IHByb2Nlc3MsIHRoZSBjb25uZWN0aW9uIHNob3VsZCByZW1haW5zIG9uLgorCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKKwlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQllcmFzZSA4MDUxIGZpcm13YXJlIGltYWdlIGluIE1BQyBBU0lDCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBOSUNFcmFzZUZpcm13YXJlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVVMT05HIGk7CisKKwlmb3IoaT0wOyBpPE1BWF9GSVJNV0FSRV9JTUFHRV9TSVpFOyBpKz00KQorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBGSVJNV0FSRV9JTUFHRV9CQVNFICsgaSwgMCk7CisKK30vKiBFbmQgb2YgTklDRXJhc2VGaXJtd2FyZSAqLworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJTG9hZCA4MDUxIGZpcm13YXJlIFJUMjU2MS5CSU4gZmlsZSBpbnRvIE1BQyBBU0lDCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX1NVQ0NFU1MgICAgICAgICBmaXJtd2FyZSBpbWFnZSBsb2FkIG9rCisJCU5ESVNfU1RBVFVTX0ZBSUxVUkUgICAgICAgICBpbWFnZSBub3QgZm91bmQKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUyBOSUNMb2FkRmlybXdhcmUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisjaWZkZWYgQklOX0lOX0ZJTEUKKyNkZWZpbmUgTklDTEZfREVGQVVMVF9VU0UoKQlcCisJZmxnX2RlZmF1bHRfZmlybV91c2UgPSBUUlVFOyBcCisJcHJpbnRrKCIlcyAtIFVzZSBkZWZhdWx0IGZpcm13YXJlIVxuIiwgX19mdW5jX18pOworCisJTkRJU19TVEFUVVMJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJUFVDSEFSCQkJc3JjOworCXN0cnVjdCBmaWxlCQkqc3JjZjsKKwlJTlQgCQkJcmV0dmFsLCBvcmdmc3VpZCwgb3JnZnNnaWQsIGk7CisgICAJbW1fc2VnbWVudF90CW9yZ2ZzOworCVBVQ0hBUgkJCXBGaXJtd2FyZUltYWdlOworCVVJTlQJCQlGaWxlTGVuZ3RoID0gMDsKKwlVSU5UMzIJCQlNYWNSZWc7CisJVUxPTkcJCQlJbmRleDsKKwlVTE9ORwkJCWZpcm07CisJQk9PTEVBTgkJCWZsZ19kZWZhdWx0X2Zpcm1fdXNlID0gRkFMU0U7CisKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gJXNcbiIsIF9fZnVuY19fKSk7CisKKwkvKiBpbml0ICovCisJcEZpcm13YXJlSW1hZ2UgPSBOVUxMOworCXNyYyA9IFJUTVBfRklSTVdBUkVfRklMRV9OQU1FOworCisJLyogc2F2ZSB1aWQgYW5kIGdpZCB1c2VkIGZvciBmaWxlc3lzdGVtIGFjY2Vzcy4KKwkgICBzZXQgdXNlciBhbmQgZ3JvdXAgdG8gMCAocm9vdCkgKi8KKwlvcmdmc3VpZCA9IGN1cnJlbnQtPmZzdWlkOworCW9yZ2ZzZ2lkID0gY3VycmVudC0+ZnNnaWQ7CisJY3VycmVudC0+ZnN1aWQgPSBjdXJyZW50LT5mc2dpZCA9IDA7CisgICAgb3JnZnMgPSBnZXRfZnMoKTsKKyAgICBzZXRfZnMoS0VSTkVMX0RTKTsKKworCXBBZC0+RmlybXdhcmVWZXJzaW9uID0gKEZJUk1XQVJFX01BSk9SX1ZFUlNJT04gPDwgOCkgKyBcCisJCQkJCQkgICBGSVJNV0FSRV9NSU5PUl9WRVJTSU9OOworCisKKwkvKiBhbGxvY2F0ZSBmaXJtd2FyZSBidWZmZXIgKi8KKyAgICBwRmlybXdhcmVJbWFnZSA9IGttYWxsb2MoTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKKyAgICBpZiAocEZpcm13YXJlSW1hZ2UgPT0gTlVMTCkKKwl7CisJCS8qIGFsbG9jYXRlIGZhaWwsIHVzZSBkZWZhdWx0IGZpcm13YXJlIGFycmF5IGluIGZpcm13YXJlLmggKi8KKwkJcHJpbnRrKCIlcyAtIEFsbG9jYXRlIG1lbW9yeSBmYWlsIVxuIiwgX19mdW5jX18pOworCQlOSUNMRl9ERUZBVUxUX1VTRSgpOworICAgIH0KKwllbHNlCisJeworCQkvKiBhbGxvY2F0ZSBvayEgemVybyB0aGUgZmlybXdhcmUgYnVmZmVyICovCisJCW1lbXNldChwRmlybXdhcmVJbWFnZSwgMHgwMCwgTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUpOworCX0gLyogRW5kIG9mIGlmICovCisKKworCS8qIGlmIG9rLCByZWFkIGZpcm13YXJlIGZpbGUgZnJvbSAqLmJpbiBmaWxlICovCisJaWYgKGZsZ19kZWZhdWx0X2Zpcm1fdXNlID09IEZBTFNFKQorCXsKKwkJZG8KKwkJeworCQkJLyogb3BlbiB0aGUgYmluIGZpbGUgKi8KKwkJCXNyY2YgPSBmaWxwX29wZW4oc3JjLCBPX1JET05MWSwgMCk7CisKKwkJCWlmIChJU19FUlIoc3JjZikpCisJCQl7CisJCQkJcHJpbnRrKCIlcyAtIEVycm9yICVsZCBvcGVuaW5nICVzXG4iLAorCQkJCQkgICBfX2Z1bmNfXywgLVBUUl9FUlIoc3JjZiksIHNyYyk7CisJCQkJTklDTEZfREVGQVVMVF9VU0UoKTsKKwkJCQlicmVhazsKKwkJCX0gLyogRW5kIG9mIGlmICovCisKKwkJCS8qIHRoZSBvYmplY3QgbXVzdCBoYXZlIGEgcmVhZCBtZXRob2QgKi8KKwkJCWlmICgoc3JjZi0+Zl9vcCA9PSBOVUxMKSB8fCAoc3JjZi0+Zl9vcC0+cmVhZCA9PSBOVUxMKSkKKwkJCXsKKwkJCQlwcmludGsoIiVzIC0gJXMgZG9lcyBub3QgaGF2ZSBhIHdyaXRlIG1ldGhvZFxuIiwgX19mdW5jX18sIHNyYyk7CisJCQkJTklDTEZfREVGQVVMVF9VU0UoKTsKKwkJCQlicmVhazsKKwkJCX0gLyogRW5kIG9mIGlmICovCisKKwkJCS8qIHJlYWQgdGhlIGZpcm13YXJlIGZyb20gdGhlIGZpbGUgKi5iaW4gKi8KKwkJCUZpbGVMZW5ndGggPSBzcmNmLT5mX29wLT5yZWFkKHNyY2YsCisJCQkJCQkJCQkJICBwRmlybXdhcmVJbWFnZSwKKwkJCQkJCQkJCQkgIE1BWF9GSVJNV0FSRV9JTUFHRV9TSVpFLAorCQkJCQkJCQkJCSAgJnNyY2YtPmZfcG9zKTsKKworCQkJaWYgKEZpbGVMZW5ndGggIT0gTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUpCisJCQl7CisJCQkJcHJpbnRrKCIlczogZXJyb3IgZmlsZSBsZW5ndGggKD0lZCkgaW4gUlQyODYwQVAuQklOXG4iLAorCQkJCQkgICBfX2Z1bmNfXywgRmlsZUxlbmd0aCk7CisJCQkJTklDTEZfREVGQVVMVF9VU0UoKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlQVUNIQVIgcHRyID0gcEZpcm13YXJlSW1hZ2U7CisJCQkJVVNIT1JUIGNyYyA9IDB4ZmZmZjsKKworCisJCQkJLyogY2FsY3VsYXRlIGZpcm13YXJlIENSQyAqLworCQkJCWZvcihpPTA7IGk8KE1BWF9GSVJNV0FSRV9JTUFHRV9TSVpFLTIpOyBpKyssIHB0cisrKQorCQkJCQljcmMgPSBCeXRlQ1JDMTYoYml0cmV2OCgqcHRyKSwgY3JjKTsKKwkJCQkvKiBFbmQgb2YgZm9yICovCisKKwkJCQlpZiAoKHBGaXJtd2FyZUltYWdlW01BWF9GSVJNV0FSRV9JTUFHRV9TSVpFLTJdICE9IFwKKwkJCQkJCQkJKFVDSEFSKWJpdHJldjgoKFVDSEFSKShjcmM+PjgpKSkgfHwKKwkJCQkJKHBGaXJtd2FyZUltYWdlW01BWF9GSVJNV0FSRV9JTUFHRV9TSVpFLTFdICE9IFwKKwkJCQkJCQkJKFVDSEFSKWJpdHJldjgoKFVDSEFSKWNyYykpKQorCQkJCXsKKwkJCQkJLyogQ1JDIGZhaWwgKi8KKwkJCQkJcHJpbnRrKCIlczogQ1JDID0gMHglMDJ4IDB4JTAyeCAiCisJCQkJCQkgICAiZXJyb3IsIHNob3VsZCBiZSAweCUwMnggMHglMDJ4XG4iLAorCQkJCQkJICAgX19mdW5jX18sCisJCQkJCQkgICBwRmlybXdhcmVJbWFnZVtNQVhfRklSTVdBUkVfSU1BR0VfU0laRS0yXSwKKwkJCQkJCSAgIHBGaXJtd2FyZUltYWdlW01BWF9GSVJNV0FSRV9JTUFHRV9TSVpFLTFdLAorCQkJCQkJICAgKFVDSEFSKShjcmM+PjgpLCAoVUNIQVIpKGNyYykpOworCQkJCQlOSUNMRl9ERUZBVUxUX1VTRSgpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJLyogZmlybXdhcmUgaXMgb2sgKi8KKwkJCQkJcEFkLT5GaXJtd2FyZVZlcnNpb24gPSBcCisJCQkJCQkocEZpcm13YXJlSW1hZ2VbTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUtNF0gPDwgOCkgKworCQkJCQkJcEZpcm13YXJlSW1hZ2VbTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUtM107CisKKwkJCQkJLyogY2hlY2sgaWYgZmlybXdhcmUgdmVyc2lvbiBvZiB0aGUgZmlsZSBpcyB0b28gb2xkICovCisJCQkJCWlmICgocEFkLT5GaXJtd2FyZVZlcnNpb24pIDwgXAorCQkJCQkJCQkJCQkoKEZJUk1XQVJFX01BSk9SX1ZFUlNJT04gPDwgOCkgKworCQkJCQkJCQkJICAJIAkgRklSTVdBUkVfTUlOT1JfVkVSU0lPTikpCisJCQkJCXsKKwkJCQkJCXByaW50aygiJXM6IGZpcm13YXJlIHZlcnNpb24gdG9vIG9sZCFcbiIsIF9fZnVuY19fKTsKKwkJCQkJCU5JQ0xGX0RFRkFVTFRfVVNFKCk7CisJCQkJCQlicmVhazsKKwkJCQkJfSAvKiBFbmQgb2YgaWYgKi8KKwkJCQl9IC8qIEVuZCBvZiBpZiAqLworCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkgKCJOSUNMb2FkRmlybXdhcmU6IENSQyBvaywgdmVyPSVkLiVkXG4iLAorCQkJCQkJICBwRmlybXdhcmVJbWFnZVtNQVhfRklSTVdBUkVfSU1BR0VfU0laRS00XSwKKwkJCQkJCSAgcEZpcm13YXJlSW1hZ2VbTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUtM10pKTsKKwkJCX0gLyogRW5kIG9mIGlmIChGaWxlTGVuZ3RoID09IE1BWF9GSVJNV0FSRV9JTUFHRV9TSVpFKSAqLworCQkJYnJlYWs7CisJCX0gd2hpbGUoVFJVRSk7CisKKwkJLyogY2xvc2UgZmlybXdhcmUgZmlsZSAqLworCQlpZiAoSVNfRVJSKHNyY2YpKQorCQkJOworCQllbHNlCisJCXsKKwkJCXJldHZhbCA9IGZpbHBfY2xvc2Uoc3JjZiwgTlVMTCk7CisJCQlpZiAocmV0dmFsKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkJICgiLS0+IEVycm9yICVkIGNsb3NpbmcgJXNcbiIsIC1yZXR2YWwsIHNyYykpOworCQkJfSAvKiBFbmQgb2YgaWYgKi8KKwkJfSAvKiBFbmQgb2YgaWYgKi8KKwl9IC8qIEVuZCBvZiBpZiAqLworCisKKwkvKiB3cml0ZSBmaXJtd2FyZSB0byBBU0lDICovCisJaWYgKGZsZ19kZWZhdWx0X2Zpcm1fdXNlID09IFRSVUUpCisJeworCQkvKiB1c2UgZGVmYXVsdCBmaW1ld2FyZSwgZnJlZSBhbGxvY2F0ZWQgYnVmZmVyICovCisJCWlmIChwRmlybXdhcmVJbWFnZSAhPSBOVUxMKQorCQkJa2ZyZWUocEZpcm13YXJlSW1hZ2UpOworCQkvKiBFbmQgb2YgaWYgKi8KKworCQkvKiB1c2UgZGVmYXVsdCAqLmJpbiBhcnJheSAqLworCQlwRmlybXdhcmVJbWFnZSA9IEZpcm13YXJlSW1hZ2U7CisJCUZpbGVMZW5ndGggPSBzaXplb2YoRmlybXdhcmVJbWFnZSk7CisJfSAvKiBFbmQgb2YgaWYgKi8KKworCS8qIGVuYWJsZSBIb3N0IHByb2dyYW0gcmFtIHdyaXRlIHNlbGVjdGlvbiAqLworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgMHgxMDAwMCk7CisKKwlmb3IoaT0wOyBpPEZpbGVMZW5ndGg7IGkrPTQpCisJeworCQlmaXJtID0gcEZpcm13YXJlSW1hZ2VbaV0gKworCQkJICAgKHBGaXJtd2FyZUltYWdlW2krM10gPDwgMjQpICsKKwkJCSAgIChwRmlybXdhcmVJbWFnZVtpKzJdIDw8IDE2KSArCisJCQkgICAocEZpcm13YXJlSW1hZ2VbaSsxXSA8PCA4KTsKKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBGSVJNV0FSRV9JTUFHRV9CQVNFICsgaSwgZmlybSk7CisJfSAvKiBFbmQgb2YgZm9yICovCisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfU1lTX0NUUkwsIDB4MDAwMDApOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgMHgwMDAwMSk7CisKKwkvKiBpbml0aWFsaXplIEJCUCBSL1cgYWNjZXNzIGFnZW50ICovCisJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX0JCUF9BR0VOVCwgMCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX01BSUxCT1hfQ1NSLCAwKTsKKworCWlmIChmbGdfZGVmYXVsdF9maXJtX3VzZSA9PSBGQUxTRSkKKwl7CisJCS8qIHVzZSBmaWxlIGZpcm13YXJlLCBmcmVlIGFsbG9jYXRlZCBidWZmZXIgKi8KKwkJaWYgKHBGaXJtd2FyZUltYWdlICE9IE5VTEwpCisJCQlrZnJlZShwRmlybXdhcmVJbWFnZSk7CisJCS8qIEVuZCBvZiBpZiAqLworCX0gLyogRW5kIG9mIGlmICovCisKKwlzZXRfZnMob3JnZnMpOworCWN1cnJlbnQtPmZzdWlkID0gb3JnZnN1aWQ7CisJY3VycmVudC0+ZnNnaWQgPSBvcmdmc2dpZDsKKyNlbHNlCisKKwlORElTX1NUQVRVUwkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlQVUNIQVIJCQlwRmlybXdhcmVJbWFnZTsKKwlVTE9ORwkJCUZpbGVMZW5ndGgsIEluZGV4OworCS8vVUxPTkcJCQlmaXJtOworCVVJTlQzMgkJCU1hY1JlZyA9IDA7CisKKwlwRmlybXdhcmVJbWFnZSA9IEZpcm13YXJlSW1hZ2U7CisJRmlsZUxlbmd0aCA9IHNpemVvZihGaXJtd2FyZUltYWdlKTsKKwlSVDI4WFhfV1JJVEVfRklSTVdBUkUocEFkLCBwRmlybXdhcmVJbWFnZSwgRmlsZUxlbmd0aCk7CisjZW5kaWYKKworCS8qIGNoZWNrIGlmIE1DVSBpcyByZWFkeSAqLworCUluZGV4ID0gMDsKKwlkbworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBQQkZfU1lTX0NUUkwsICZNYWNSZWcpOworCisJCWlmIChNYWNSZWcgJiAweDgwKQorCQkJYnJlYWs7CisKKwkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKwl9IHdoaWxlIChJbmRleCsrIDwgMTAwMCk7CisKKyAgICBpZiAoSW5kZXggPj0gMTAwMCkKKwl7CisJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIk5JQ0xvYWRGaXJtd2FyZTogTUNVIGlzIG5vdCByZWFkeVxuXG5cbiIpKTsKKwl9IC8qIEVuZCBvZiBpZiAqLworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCI8PT09ICVzIChzdGF0dXM9JWQpXG4iLCBfX2Z1bmNfXywgU3RhdHVzKSk7CisgICAgcmV0dXJuIFN0YXR1czsKK30gLyogRW5kIG9mIE5JQ0xvYWRGaXJtd2FyZSAqLworCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlMb2FkIFR4IHJhdGUgc3dpdGNoaW5nIHBhcmFtZXRlcnMKKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTkRJU19TVEFUVVNfU1VDQ0VTUyAgICAgICAgIGZpcm13YXJlIGltYWdlIGxvYWQgb2sKKwkJTkRJU19TVEFUVVNfRkFJTFVSRSAgICAgICAgIGltYWdlIG5vdCBmb3VuZAorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCVJhdGUgVGFibGUgRm9ybWF0OgorCQkxLiAoQjA6IFZhbGlkIEl0ZW0gbnVtYmVyKSAoQjE6SW5pdGlhbCBpdGVtIGZyb20gemVybykKKwkJMi4gSXRlbSBOdW1iZXIoRGVjKSAgICAgIE1vZGUoSGV4KSAgICAgQ3VycmVudCBNQ1MoRGVjKSAgICBUcmFpblVwKERlYykgICAgVHJhaW5Eb3duKERlYykKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTIE5JQ0xvYWRSYXRlU3dpdGNoaW5nUGFyYW1zKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJaWYgIHBTcmMxIGFsbCB6ZXJvIHdpdGggbGVuZ3RoIExlbmd0aCwgcmV0dXJuIDAuCisJCUlmIG5vdCBhbGwgemVybywgcmV0dXJuIDEKKworCUFyZ3VtZW50czoKKwkJcFNyYzEKKworCVJldHVybiBWYWx1ZToKKwkJMToJCQlub3QgYWxsIHplcm8KKwkJMDoJCQlhbGwgemVybworCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVUxPTkcJUlRNUE5vdEFsbFplcm8oCisJSU4JUFZPSUQJcFNyYzEsCisJSU4JVUxPTkcJTGVuZ3RoKQoreworCVBVQ0hBUglwTWVtMTsKKwlVTE9ORwlJbmRleCA9IDA7CisKKwlwTWVtMSA9IChQVUNIQVIpIHBTcmMxOworCisJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTGVuZ3RoOyBJbmRleCsrKQorCXsKKwkJaWYgKHBNZW0xW0luZGV4XSAhPSAweDApCisJCXsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKEluZGV4ID09IExlbmd0aCkKKwl7CisJCXJldHVybiAoMCk7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiAoMSk7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ29tcGFyZSB0d28gbWVtb3J5IGJsb2NrCisKKwlBcmd1bWVudHM6CisJCXBTcmMxCQlQb2ludGVyIHRvIGZpcnN0IG1lbW9yeSBhZGRyZXNzCisJCXBTcmMyCQlQb2ludGVyIHRvIHNlY29uZCBtZW1vcnkgYWRkcmVzcworCisJUmV0dXJuIFZhbHVlOgorCQkwOgkJCW1lbW9yeSBpcyBlcXVhbAorCQkxOgkJCXBTcmMxIG1lbW9yeSBpcyBsYXJnZXIKKwkJMjoJCQlwU3JjMiBtZW1vcnkgaXMgbGFyZ2VyCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitVTE9ORwlSVE1QQ29tcGFyZU1lbW9yeSgKKwlJTglQVk9JRAlwU3JjMSwKKwlJTglQVk9JRAlwU3JjMiwKKwlJTglVTE9ORwlMZW5ndGgpCit7CisJUFVDSEFSCXBNZW0xOworCVBVQ0hBUglwTWVtMjsKKwlVTE9ORwlJbmRleCA9IDA7CisKKwlwTWVtMSA9IChQVUNIQVIpIHBTcmMxOworCXBNZW0yID0gKFBVQ0hBUikgcFNyYzI7CisKKwlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBMZW5ndGg7IEluZGV4KyspCisJeworCQlpZiAocE1lbTFbSW5kZXhdID4gcE1lbTJbSW5kZXhdKQorCQkJcmV0dXJuICgxKTsKKwkJZWxzZSBpZiAocE1lbTFbSW5kZXhdIDwgcE1lbTJbSW5kZXhdKQorCQkJcmV0dXJuICgyKTsKKwl9CisKKwkvLyBFcXVhbAorCXJldHVybiAoMCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlaZXJvIG91dCBtZW1vcnkgYmxvY2sKKworCUFyZ3VtZW50czoKKwkJcFNyYzEJCVBvaW50ZXIgdG8gbWVtb3J5IGFkZHJlc3MKKwkJTGVuZ3RoCQlTaXplCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QWmVyb01lbW9yeSgKKwlJTglQVk9JRAlwU3JjLAorCUlOCVVMT05HCUxlbmd0aCkKK3sKKwlQVUNIQVIJcE1lbTsKKwlVTE9ORwlJbmRleCA9IDA7CisKKwlwTWVtID0gKFBVQ0hBUikgcFNyYzsKKworCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IExlbmd0aDsgSW5kZXgrKykKKwl7CisJCXBNZW1bSW5kZXhdID0gMHgwMDsKKwl9Cit9CisKK1ZPSUQJUlRNUEZpbGxNZW1vcnkoCisJSU4JUFZPSUQJcFNyYywKKwlJTglVTE9ORwlMZW5ndGgsCisJSU4JVUNIQVIJRmlsbCkKK3sKKwlQVUNIQVIJcE1lbTsKKwlVTE9ORwlJbmRleCA9IDA7CisKKwlwTWVtID0gKFBVQ0hBUikgcFNyYzsKKworCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IExlbmd0aDsgSW5kZXgrKykKKwl7CisJCXBNZW1bSW5kZXhdID0gRmlsbDsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDb3B5IGRhdGEgZnJvbSBtZW1vcnkgYmxvY2sgMSB0byBtZW1vcnkgYmxvY2sgMgorCisJQXJndW1lbnRzOgorCQlwRGVzdAkJUG9pbnRlciB0byBkZXN0aW5hdGlvbiBtZW1vcnkgYWRkcmVzcworCQlwU3JjCQlQb2ludGVyIHRvIHNvdXJjZSBtZW1vcnkgYWRkcmVzcworCQlMZW5ndGgJCUNvcHkgc2l6ZQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUE1vdmVNZW1vcnkoCisJT1VUCVBWT0lECXBEZXN0LAorCUlOCVBWT0lECXBTcmMsCisJSU4JVUxPTkcJTGVuZ3RoKQoreworCVBVQ0hBUglwTWVtMTsKKwlQVUNIQVIJcE1lbTI7CisJVUlOVAlJbmRleDsKKworCUFTU0VSVCgoTGVuZ3RoPT0wKSB8fCAocERlc3QgJiYgcFNyYykpOworCisJcE1lbTEgPSAoUFVDSEFSKSBwRGVzdDsKKwlwTWVtMiA9IChQVUNIQVIpIHBTcmM7CisKKwlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBMZW5ndGg7IEluZGV4KyspCisJeworCQlwTWVtMVtJbmRleF0gPSBwTWVtMltJbmRleF07CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJSW5pdGlhbGl6ZSBwb3J0IGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlVc2VyQ2ZnSW5pdCgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCkKK3sKKyAgICBVSU5UIGtleV9pbmRleCwgYnNzX2luZGV4OworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFVzZXJDZmdJbml0XG4iKSk7CisKKwkvLworCS8vICBwYXJ0IEkuIGludGlhbGl6ZSBjb21tb24gY29uZmlndXJhdGlvbgorCS8vCisKKwlmb3Ioa2V5X2luZGV4PTA7IGtleV9pbmRleDxTSEFSRV9LRVlfTlVNOyBrZXlfaW5kZXgrKykKKwl7CisJCWZvcihic3NfaW5kZXggPSAwOyBic3NfaW5kZXggPCBNQVhfTUJTU0lEX05VTTsgYnNzX2luZGV4KyspCisJCXsKKwkJCXBBZC0+U2hhcmVkS2V5W2Jzc19pbmRleF1ba2V5X2luZGV4XS5LZXlMZW4gPSAwOworCQkJcEFkLT5TaGFyZWRLZXlbYnNzX2luZGV4XVtrZXlfaW5kZXhdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQl9CisJfQorCisJcEFkLT5BbnRlbm5hLndvcmQgPSAwOworCXBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzIwOworCisJcEFkLT5MZWRDbnRsLndvcmQgPSAwOworI2lmZGVmIFJUMjg2MAorCXBBZC0+TGVkSW5kaWNhdG9yU3RyZWd0aCA9IDA7CisJcEFkLT5STG5rQ3RybE9mZnNldCA9IDA7CisJcEFkLT5Ib3N0TG5rQ3RybE9mZnNldCA9IDA7CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKwlwQWQtPmJBdXRvVHhBZ2NBID0gRkFMU0U7CQkJLy8gRGVmYXVsdCBpcyBPRkYKKwlwQWQtPmJBdXRvVHhBZ2NHID0gRkFMU0U7CQkJLy8gRGVmYXVsdCBpcyBPRkYKKwlwQWQtPlJmSWNUeXBlID0gUkZJQ18yODIwOworCisJLy8gSW5pdCB0aW1lciBmb3IgcmVzZXQgY29tcGxldGUgZXZlbnQKKwlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IDE7CisJcEFkLT5iRm9yY2VQcmludFRYID0gRkFMU0U7CisJcEFkLT5iRm9yY2VQcmludFJYID0gRkFMU0U7CisJcEFkLT5iU3RhRmlmb1Rlc3QgPSBGQUxTRTsKKwlwQWQtPmJQcm90ZWN0aW9uVGVzdCA9IEZBTFNFOworCXBBZC0+YkhDQ0FUZXN0ID0gRkFMU0U7CisJcEFkLT5iR2VuT25lSENDQSA9IEZBTFNFOworCXBBZC0+Q29tbW9uQ2ZnLkRzaWZzID0gMTA7ICAgICAgLy8gaW4gdW5pdHMgb2YgdXNlYworCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXIgPSAxMDA7IC8vbVcKKwlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IDB4ZmZmZmZmZmY7IC8vIEFVVE8KKwlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdCA9IDB4ZmZmZmZmZmY7IC8vIEFVVE8KKwlwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUnQ4MDJfMTFQcmVhbWJsZUF1dG87IC8vIHVzZSBMb25nIHByZWFtYmxlIG9uIFRYIGJ5IGRlZmF1dAorCXBBZC0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBGQUxTRTsKKwlwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPSAyMzQ3OworCXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gMjM0NjsKKwlwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSAwOyAgICAvLyAwOiBBVVRPCisJcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBUUlVFOyAvLzA7CisJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IDB4ZmY7ICAgICAvLyB1bmtub3duCisJcEFkLT5Db21tb25DZmcuQmFuZFN0YXRlID0gVU5LTk9XTl9CQU5EOworCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNTUGVyaW9kID0gMTA7CisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ1NDb3VudCA9IDA7CisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlID0gUkRfTk9STUFMX01PREU7CisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ2hNb3ZpbmdUaW1lID0gNjU7CisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuTG9uZ1B1bHNlUmFkYXJUaCA9IDM7CisJcEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlID0gRkFMU0U7CisJcEFkLT5Db21tb25DZmcuYk5lZWRTZW5kVHJpZ2dlckZyYW1lID0gRkFMU0U7CisJcEFkLT5Db21tb25DZmcuVHJpZ2dlclRpbWVyQ291bnQgPSAwOworCXBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUgPSBGQUxTRTsKKwlwQWQtPkNvbW1vbkNmZy5iQ291bnRyeUZsYWcgPSBGQUxTRTsKKwlwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9IDA7CisJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSAwOworCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+QmVhY29uVHhXSSwgc2l6ZW9mKHBBZC0+QmVhY29uVHhXSSkpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSkpOworCXBBZC0+SFRDRW5hYmxlID0gRkFMU0U7CisJcEFkLT5iQnJvYWRDb21IVCA9IEZBTFNFOworCXBBZC0+Q29tbW9uQ2ZnLmJSZGcgPSBGQUxTRTsKKworI2lmZGVmIERPVDExTl9EUkFGVDMKKwlwQWQtPkNvbW1vbkNmZy5Eb3QxMU9Cc3NTY2FuUGFzc2l2ZUR3ZWxsID0gZG90MTFPQlNTU2NhblBhc3NpdmVEd2VsbDsJLy8gVW5pdCA6IFRVLiA1fjEwMDAKKwlwQWQtPkNvbW1vbkNmZy5Eb3QxMU9Cc3NTY2FuQWN0aXZlRHdlbGwgPSBkb3QxMU9CU1NTY2FuQWN0aXZlRHdlbGw7CS8vIFVuaXQgOiBUVS4gMTB+MTAwMAorCXBBZC0+Q29tbW9uQ2ZnLkRvdDExQnNzV2lkdGhUcmlnZ2VyU2NhbkludCA9IGRvdDExQlNTV2lkdGhUcmlnZ2VyU2NhbkludGVydmFsOwkvLyBVbml0IDogU2Vjb25kCisJcEFkLT5Db21tb25DZmcuRG90MTFPQnNzU2NhblBhc3NpdmVUb3RhbFBlckNoYW5uZWwgPSBkb3QxMU9CU1NTY2FuUGFzc2l2ZVRvdGFsUGVyQ2hhbm5lbDsJLy8gVW5pdCA6IFRVLiAyMDB+MTAwMDAKKwlwQWQtPkNvbW1vbkNmZy5Eb3QxMU9Cc3NTY2FuQWN0aXZlVG90YWxQZXJDaGFubmVsID0gZG90MTFPQlNTU2NhbkFjdGl2ZVRvdGFsUGVyQ2hhbm5lbDsJLy8gVW5pdCA6IFRVLiAyMH4xMDAwMAorCXBBZC0+Q29tbW9uQ2ZnLkRvdDExQnNzV2lkdGhDaGFuVHJhbkRlbGF5RmFjdG9yID0gZG90MTFCU1NXaWR0aENoYW5uZWxUcmFuc2FjdGlvbkRlbGF5RmFjdG9yOworCXBBZC0+Q29tbW9uQ2ZnLkRvdDExT0Jzc1NjYW5BY3Rpdml0eVRocmUgPSBkb3QxMUJTU1NjYW5BY3Rpdml0eVRocmVzaG9sZDsJLy8gVW5pdCA6IHBlcmNlbnRhZ2UKKwlwQWQtPkNvbW1vbkNmZy5Eb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheSA9IChwQWQtPkNvbW1vbkNmZy5Eb3QxMUJzc1dpZHRoVHJpZ2dlclNjYW5JbnQgKiBwQWQtPkNvbW1vbkNmZy5Eb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheUZhY3Rvcik7CisjZW5kaWYgIC8vIERPVDExTl9EUkFGVDMgLy8KKworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8sIHNpemVvZihwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8pKTsKKwlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSBNTVBTX0VOQUJMRTsKKwlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkgPSAwOworCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPSBJTU1FRF9CQTsKKwlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gNjQ7IC8vMzI7CisJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlR4QkFXaW5MaW1pdCA9IDY0OyAvLzMyOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBVc2VyQ2ZnSW5pdC4gQkFDYXBhYmlsaXR5ID0gMHgleFxuIiwgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LndvcmQpKTsKKworCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBGQUxTRTsKKwlCQVRhYmxlSW5pdChwQWQsICZwQWQtPkJBVGFibGUpOworCisJcEFkLT5Db21tb25DZmcuYkV4dENoYW5uZWxTd2l0Y2hBbm5vdW5jZW1lbnQgPSAxOworCXBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QgPSAxOworCXBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUgPSBUUlVFOworCXBBZC0+Q29tbW9uQ2ZnLmJCQURlY2xpbmUgPSBGQUxTRTsKKwlwQWQtPkNvbW1vbkNmZy5iRGlzYWJsZVJlb3JkZXJpbmcgPSBGQUxTRTsKKworCXBBZC0+Q29tbW9uQ2ZnLlR4QkFTaXplID0gNzsKKworCXBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS53b3JkID0gcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LndvcmQ7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkvL3BBZC0+Q29tbW9uQ2ZnLkhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOworCS8vcEFkLT5Db21tb25DZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyA9IE1DU19BVVRPOworCS8vcEFkLT5Db21tb25DZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7CisJLy9wQWQtPkNvbW1vbkNmZy5IVFBoeU1vZGUuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKKwlwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPSBSQVRFXzY7CisKKwlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gTUNTX1JBVEVfNjsKKwlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuQlcgPSBCV18yMDsKKwlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKworCXBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA9IDEwMDsgICAgIC8vIGluIG1TZWMKKworCS8vCisJLy8gcGFydCBJSS4gaW50aWFsaXplIFNUQSBzcGVjaWZpYyBjb25maWd1cmF0aW9uCisJLy8KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJUlhfRklMVEVSX1NFVF9GTEFHKHBBZCwgZlJYX0ZJTFRFUl9BQ0NFUFRfRElSRUNUKTsKKwkJUlhfRklMVEVSX0NMRUFSX0ZMQUcocEFkLCBmUlhfRklMVEVSX0FDQ0VQVF9NVUxUSUNBU1QpOworCQlSWF9GSUxURVJfU0VUX0ZMQUcocEFkLCBmUlhfRklMVEVSX0FDQ0VQVF9CUk9BRENBU1QpOworCQlSWF9GSUxURVJfU0VUX0ZMQUcocEFkLCBmUlhfRklMVEVSX0FDQ0VQVF9BTExfTVVMVElDQVNUKTsKKworCQlwQWQtPlN0YUNmZy5Qc20gPSBQV1JfQUNUSVZFOworCisJCXBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkOworCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZDsKKwkJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkOworCQlwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyID0gRkFMU0U7CisJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IDA7CisKKwkJLy8gODAyLjF4IHBvcnQgY29udHJvbAorCQlwQWQtPlN0YUNmZy5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXI4MDIxeFdFUDsKKwkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisJCXBBZC0+U3RhQ2ZnLkxhc3RNaWNFcnJvclRpbWUgPSAwOworCQlwQWQtPlN0YUNmZy5NaWNFcnJDbnQgICAgICAgID0gMDsKKwkJcEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgICAgICA9IEZBTFNFOworCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSAgICAgICAgID0gU1NfTk9UVVNFOworCisJCXBBZC0+Q29tbW9uQ2ZnLk5kaXNSYWRpb1N0YXRlT2ZmID0gRkFMU0U7CQkvLyBOZXcgdG8gc3VwcG9ydCBtaWNyb3NvZnQgZGlzYWJsZSByYWRpbyB3aXRoIE9JRCBjb21tYW5kCisKKwkJcEFkLT5TdGFDZmcuUnNzaVRyaWdnZXIgPSAwOworCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5TdGFDZmcuUnNzaVNhbXBsZSwgc2l6ZW9mKFJTU0lfU0FNUExFKSk7CisJCXBBZC0+U3RhQ2ZnLlJzc2lUcmlnZ2VyTW9kZSA9IFJTU0lfVFJJR0dFUkVEX1VQT05fQkVMT1dfVEhSRVNIT0xEOworCQlwQWQtPlN0YUNmZy5BdGltV2luID0gMDsKKwkJcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gMzsvL2RlZmF1bHQgbGlzdGVuIGNvdW50OworCQlwQWQtPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0lORlJBOyAgLy8gQlNTX0lORlJBIG9yIEJTU19BREhPQyBvciBCU1NfTU9OSVRPUgorCQlwQWQtPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7CisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpOworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19XQUtFVVBfTk9XKTsKKworCQlwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IFRSVUU7CisJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTX0FVVE87CisJfQorCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCXBBZC0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlID0gUnQ4MDJfMTFfRF9Ob25lOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIGdsb2JhbCB2YXJpYWJsZXMgbVhYWFggdXNlZCBpbiBNQUMgcHJvdG9jb2wgc3RhdGUgbWFjaGluZXMKKwlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKKwlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19BREhPQ19PTik7CisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfSU5GUkFfT04pOworCisJLy8gUEhZIHNwZWNpZmljYXRpb24KKwlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gUEhZXzExQkdfTUlYRUQ7CQkvLyBkZWZhdWx0IFBIWSBtb2RlCisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsgIC8vIENDSyB1c2UgTE9ORyBwcmVhbWJsZQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCS8vIHVzZXIgZGVzaXJlZCBwb3dlciBtb2RlCisJCXBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNOworCQlwQWQtPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVDQU07CisJCXBBZC0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPSBGQUxTRTsKKworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkvLyBDQ1ggdjEuMCByZWxlYXRlZCBpbml0IHZhbHVlCisJCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5TdGFDZmcuTGVhcEF1dGhUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKExlYXBBdXRoVGltZW91dCksIHBBZCwgRkFMU0UpOworCQlwQWQtPlN0YUNmZy5MZWFwQXV0aE1vZGUgPSBDSVNDT19BdXRoTW9kZUxFQVBOb25lOworCQlwQWQtPlN0YUNmZy5iQ2tpcE9uID0gRkFMU0U7CisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisKKwkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMpLCBwQWQsIEZBTFNFKTsKKwkJcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nID0gRkFMU0U7CisKKwkJLy8gUGF0Y2ggZm9yIE5kdGVzdAorCQlwQWQtPlN0YUNmZy5TY2FuQ250ID0gMDsKKworCQkvLyBDQ1ggMi4wIGNvbnRyb2wgZmxhZyBpbml0CisJCXBBZC0+U3RhQ2ZnLkNDWEVuYWJsZSA9IEZBTFNFOworCQlwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlID0gTVNSTl9UWVBFX1VOVVNFRDsKKwkJcEFkLT5TdGFDZmcuQ0NYUW9zRUNXTWluCT0gNDsKKwkJcEFkLT5TdGFDZmcuQ0NYUW9zRUNXTWF4CT0gMTA7CisKKwkJcEFkLT5TdGFDZmcuYkh3UmFkaW8gID0gVFJVRTsgLy8gRGVmYXVsdCBIYXJkd2FyZSBSYWRpbyBzdGF0dXMgaXMgT24KKwkJcEFkLT5TdGFDZmcuYlN3UmFkaW8gID0gVFJVRTsgLy8gRGVmYXVsdCBTb2Z0d2FyZSBSYWRpbyBzdGF0dXMgaXMgT24KKwkJcEFkLT5TdGFDZmcuYlJhZGlvICAgID0gVFJVRTsgLy8gYkh3UmFkaW8gJiYgYlN3UmFkaW8KKwkJcEFkLT5TdGFDZmcuYkhhcmR3YXJlUmFkaW8gPSBGQUxTRTsJCS8vIERlZmF1bHQgaXMgT0ZGCisJCXBBZC0+U3RhQ2ZnLmJTaG93SGlkZGVuU1NJRCA9IEZBTFNFOwkJLy8gRGVmYXVsdCBubyBzaG93CisKKwkJLy8gTml0cm8gbW9kZSBjb250cm9sCisJCXBBZC0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID0gVFJVRTsKKworCQkvLyBTYXZlIHRoZSBpbml0IHRpbWUgYXMgbGFzdCBzY2FuIHRpbWUsIHRoZSBzeXN0ZW0gc2hvdWxkIGRvIHNjYW4gYWZ0ZXIgMiBzZWNvbmRzLgorCQkvLyBUaGlzIHBhdGNoIGlzIGZvciBkcml2ZXIgd2FrZSB1cCBmcm9tIHN0YW5kYnkgbW9kZSwgc3lzdGVtIHdpbGwgZG8gc2NhbiByaWdodCBhd2F5LgorCQlwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgPSAwOworCQlOZGlzWmVyb01lbW9yeShwQWQtPm5pY2tuYW1lLCBJV19FU1NJRF9NQVhfU0laRSsxKTsKKwkJc3ByaW50ZihwQWQtPm5pY2tuYW1lLCAiJXMiLCBTVEFfTklDX0RFVklDRV9OQU1FKTsKKwkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPlN0YUNmZy5XcGFEaXNhc3NvY0FuZEJsb2NrQXNzb2NUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKFdwYURpc2Fzc29jQXBBbmRCbG9ja0Fzc29jKSwgcEFkLCBGQUxTRSk7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQlwQWQtPlN0YUNmZy5JRUVFODAyMVggPSBGQUxTRTsKKwkJcEFkLT5TdGFDZmcuSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMgPSBGQUxTRTsKKwkJcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRTsKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQlwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSBXUEFfU1VQUExJQ0FOVF9FTkFCTEU7CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLyBEZWZhdWx0IGZvciBleHRyYSBpbmZvcm1hdGlvbiBpcyBub3QgdmFsaWQKKwlwQWQtPkV4dHJhSW5mbyA9IEVYVFJBX0lORk9fQ0xFQVI7CisKKwkvLyBEZWZhdWx0IENvbmZpZyBjaGFuZ2UgZmxhZworCXBBZC0+YkNvbmZpZ0NoYW5nZWQgPSBGQUxTRTsKKworCS8vCisJLy8gcGFydCBJSUkuIEFQIGNvbmZpZ3VyYXRpb25zCisJLy8KKworCisJLy8KKwkvLyBwYXJ0IElWLiBvdGhlcnMKKwkvLworCS8vIGR5bmFtaWMgQkJQIFI2NjpzZW5zaWJpdHkgdHVuaW5nIHRvIG92ZXJjb21lIGJhY2tncm91bmQgbm9pc2UKKwlwQWQtPkJicFR1bmluZy5iRW5hYmxlICAgICAgICAgICAgICAgID0gVFJVRTsKKwlwQWQtPkJicFR1bmluZy5GYWxzZUNjYUxvd2VyVGhyZXNob2xkID0gMTAwOworCXBBZC0+QmJwVHVuaW5nLkZhbHNlQ2NhVXBwZXJUaHJlc2hvbGQgPSA1MTI7CisJcEFkLT5CYnBUdW5pbmcuUjY2RGVsdGEgICAgICAgICAgICAgICA9IDQ7CisJcEFkLT5NbG1lLmJFbmFibGVBdXRvQW50ZW5uYUNoZWNrID0gVFJVRTsKKworCS8vCisJLy8gQWxzbyBpbml0aWFsIFI2NkN1cnJlbnRWYWx1ZSwgUlRVU0JSZXN1bWVNc2R1VHJhbnNtaXNzaW9uIG1pZ2h0IHVzZSB0aGlzIHZhbHVlLgorCS8vIGlmIG5vdCBpbml0aWFsIHRoaXMgdmFsdWUsIHRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgMC4KKwkvLworCXBBZC0+QmJwVHVuaW5nLlI2NkN1cnJlbnRWYWx1ZSA9IDB4Mzg7CisKKwlwQWQtPkJicDk0ID0gQkJQUjk0X0RFRkFVTFQ7CisJcEFkLT5CYnBGb3JDQ0sgPSBGQUxTRTsKKworCS8vIGluaXRpYWxpemUgTUFDIHRhYmxlIGFuZCBhbGxvY2F0ZSBzcGluIGxvY2sKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5NYWNUYWIsIHNpemVvZihNQUNfVEFCTEUpKTsKKwlJbml0aWFsaXplUXVldWVIZWFkZXIoJnBBZC0+TWFjVGFiLk1jYXN0UHNRdWV1ZSk7CisJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisKKyNpZmRlZiBSQUxJTktfQVRFCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+YXRlLCBzaXplb2YoQVRFX0lORk8pKTsKKwlwQWQtPmF0ZS5Nb2RlID0gQVRFX1NUT1A7CisJcEFkLT5hdGUuVHhDb3VudCA9IDIwMDsvKiB0byBleGNlZWQgVFhfUklOR19TSVpFIC4uLiAqLworCXBBZC0+YXRlLlR4TGVuZ3RoID0gMTAyNDsKKwlwQWQtPmF0ZS5UeFdJLlNob3J0R0kgPSAwOy8vIExPTkcgR0kgOiA4MDAgbnMKKwlwQWQtPmF0ZS5UeFdJLlBIWU1PREUgPSBNT0RFX0NDSzsKKwlwQWQtPmF0ZS5UeFdJLk1DUyA9IDM7CisJcEFkLT5hdGUuVHhXSS5CVyA9IEJXXzIwOworCXBBZC0+YXRlLkNoYW5uZWwgPSAxOworCXBBZC0+YXRlLlFJRCA9IFFJRF9BQ19CRTsKKwlwQWQtPmF0ZS5BZGRyMVswXSA9IDB4MDA7CisJcEFkLT5hdGUuQWRkcjFbMV0gPSAweDExOworCXBBZC0+YXRlLkFkZHIxWzJdID0gMHgyMjsKKwlwQWQtPmF0ZS5BZGRyMVszXSA9IDB4QUE7CisJcEFkLT5hdGUuQWRkcjFbNF0gPSAweEJCOworCXBBZC0+YXRlLkFkZHIxWzVdID0gMHhDQzsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPmF0ZS5BZGRyMiwgcEFkLT5hdGUuQWRkcjEsIEVUSF9MRU5HVEhfT0ZfQUREUkVTUyk7CisJTmRpc01vdmVNZW1vcnkocEFkLT5hdGUuQWRkcjMsIHBBZC0+YXRlLkFkZHIxLCBFVEhfTEVOR1RIX09GX0FERFJFU1MpOworCXBBZC0+YXRlLmJSeEZlciA9IDA7CisJcEFkLT5hdGUuYlFBVHhTdGFydCA9IEZBTFNFOworCXBBZC0+YXRlLmJRQVJ4U3RhcnQgPSBGQUxTRTsKKyNpZmRlZiBSVDI4NjAKKwlwQWQtPmF0ZS5iRldMb2FkaW5nID0gRkFMU0U7CisjZW5kaWYgLy8gUlQyODYwIC8vCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwkvL3BBZC0+YXRlLlJlcGVhdCA9IDA7CisJcEFkLT5hdGUuVHhTdGF0dXMgPSAwOworCXBBZC0+YXRlLkF0ZVBpZCA9IFRIUkVBRF9QSURfSU5JVF9WQUxVRTsKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCisJcEFkLT5Db21tb25DZmcuYldpRmlUZXN0ID0gRkFMU0U7CisjaWZkZWYgUlQyODYwCisgICAgcEFkLT5iUENJY2xrT2ZmID0gRkFMU0U7CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBVc2VyQ2ZnSW5pdFxuIikpOworfQorCisvLyBJUlFMID0gUEFTU0lWRV9MRVZFTAorVUNIQVIgQnRvSChjaGFyIGNoKQoreworCWlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSByZXR1cm4gKGNoIC0gJzAnKTsgICAgICAgIC8vIEhhbmRsZSBudW1lcmFscworCWlmIChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKSByZXR1cm4gKGNoIC0gJ0EnICsgMHhBKTsgIC8vIEhhbmRsZSBjYXBpdG9sIGhleCBkaWdpdHMKKwlpZiAoY2ggPj0gJ2EnICYmIGNoIDw9ICdmJykgcmV0dXJuIChjaCAtICdhJyArIDB4QSk7ICAvLyBIYW5kbGUgc21hbGwgaGV4IGRpZ2l0cworCXJldHVybigyNTUpOworfQorCisvLworLy8gIEZVTkNUSU9OOiBBdG9IKGNoYXIgKiwgVUNIQVIgKiwgaW50KQorLy8KKy8vICBQVVJQT1NFOiAgQ29udmVydHMgYXNjaWkgc3RyaW5nIHRvIG5ldHdvcmsgb3JkZXIgaGV4CisvLworLy8gIFBBUkFNRVRFUlM6CisvLyAgICBzcmMgICAgLSBwb2ludGVyIHRvIGlucHV0IGFzY2lpIHN0cmluZworLy8gICAgZGVzdCAgIC0gcG9pbnRlciB0byBvdXRwdXQgaGV4CisvLyAgICBkZXN0bGVuIC0gc2l6ZSBvZiBkZXN0CisvLworLy8gIENPTU1FTlRTOgorLy8KKy8vICAgIDIgYXNjaWkgYnl0ZXMgbWFrZSBhIGhleCBieXRlIHNvIG11c3QgcHV0IDFzdCBhc2NpaSBieXRlIG9mIHBhaXIKKy8vICAgIGludG8gdXBwZXIgbmliYmxlIGFuZCAybmQgYXNjaWkgYnl0ZSBvZiBwYWlyIGludG8gbG93ZXIgbmliYmxlLgorLy8KKy8vIElSUUwgPSBQQVNTSVZFX0xFVkVMCisKK3ZvaWQgQXRvSChjaGFyICogc3JjLCBVQ0hBUiAqIGRlc3QsIGludCBkZXN0bGVuKQoreworCWNoYXIgKiBzcmNwdHI7CisJUFVDSEFSIGRlc3RUZW1wOworCisJc3JjcHRyID0gc3JjOworCWRlc3RUZW1wID0gKFBVQ0hBUikgZGVzdDsKKworCXdoaWxlKGRlc3RsZW4tLSkKKwl7CisJCSpkZXN0VGVtcCA9IEJ0b0goKnNyY3B0cisrKSA8PCA0OyAgICAvLyBQdXQgMXN0IGFzY2lpIGJ5dGUgaW4gdXBwZXIgbmliYmxlLgorCQkqZGVzdFRlbXAgKz0gQnRvSCgqc3JjcHRyKyspOyAgICAgIC8vIEFkZCAybmQgYXNjaWkgYnl0ZSB0byBhYm92ZS4KKwkJZGVzdFRlbXArKzsKKwl9Cit9CisKK1ZPSUQJUlRNUFBhdGNoTWFjQmJwQnVnKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVVMT05HCUluZGV4OworCisJLy8gSW5pdGlhbGl6ZSBCQlAgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQorCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IE5VTV9CQlBfUkVHX1BBUk1TOyBJbmRleCsrKQorCXsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUFJlZ1RhYmxlW0luZGV4XS5SZWdpc3RlciwgKFVDSEFSKUJCUFJlZ1RhYmxlW0luZGV4XS5WYWx1ZSk7CisJfQorCisJLy8gSW5pdGlhbGl6ZSBSRiByZWdpc3RlciB0byBkZWZhdWx0IHZhbHVlCisJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisKKwkvLyBSZS1pbml0IEJCUCByZWdpc3RlciBmcm9tIEVFUFJPTSB2YWx1ZQorCU5JQ0luaXRBc2ljRnJvbUVFUFJPTShwQWQpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJSW5pdCB0aW1lciBvYmplY3RzCisKKwlBcmd1bWVudHM6CisJCXBBZAkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcFRpbWVyCQkJCVRpbWVyIHN0cnVjdHVyZQorCQlwVGltZXJGdW5jCQkJRnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRpbWVyIGV4cGlyZWQKKwkJUmVwZWF0CQkJCVR1cmUgZm9yIHBlcmlvZCB0aW1lcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QSW5pdFRpbWVyKAorCUlOCVBSVE1QX0FEQVBURVIJCQlwQWQsCisJSU4JUFJBTElOS19USU1FUl9TVFJVQ1QJcFRpbWVyLAorCUlOCVBWT0lECQkJCQlwVGltZXJGdW5jLAorCUlOCVBWT0lECQkJCQlwRGF0YSwKKwlJTglCT09MRUFOCQkJCQlSZXBlYXQpCit7CisJLy8KKwkvLyBTZXQgVmFsaWQgdG8gVFJVRSBmb3IgbGF0ZXIgdXNlZC4KKwkvLyBJdCB3aWxsIGNyYXNoIGlmIHdlIGNhbmNlbCBhIHRpbWVyIG9yIHNldCBhIHRpbWVyCisJLy8gdGhhdCB3ZSBoYXZlbid0IGluaXRpYWxpemUgYmVmb3JlLgorCS8vCisJcFRpbWVyLT5WYWxpZCAgICAgID0gVFJVRTsKKworCXBUaW1lci0+UGVyaW9kaWNUeXBlID0gUmVwZWF0OworCXBUaW1lci0+U3RhdGUgICAgICA9IEZBTFNFOworCXBUaW1lci0+Y29va2llID0gKFVMT05HKSBwRGF0YTsKKworCisJUlRNUF9PU19Jbml0X1RpbWVyKHBBZCwJJnBUaW1lci0+VGltZXJPYmosCXBUaW1lckZ1bmMsIChQVk9JRCkgcFRpbWVyKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUluaXQgdGltZXIgb2JqZWN0cworCisJQXJndW1lbnRzOgorCQlwVGltZXIJCQkJVGltZXIgc3RydWN0dXJlCisJCVZhbHVlCQkJCVRpbWVyIHZhbHVlIGluIG1pbGxpc2Vjb25kcworCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCQlUbyB1c2UgdGhpcyByb3V0aW5lLCBtdXN0IGNhbGwgUlRNUEluaXRUaW1lciBiZWZvcmUuCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBTZXRUaW1lcigKKwlJTglQUkFMSU5LX1RJTUVSX1NUUlVDVAlwVGltZXIsCisJSU4JVUxPTkcJCQkJCVZhbHVlKQoreworCWlmIChwVGltZXItPlZhbGlkKQorCXsKKwkJcFRpbWVyLT5UaW1lclZhbHVlID0gVmFsdWU7CisJCXBUaW1lci0+U3RhdGUgICAgICA9IEZBTFNFOworCQlpZiAocFRpbWVyLT5QZXJpb2RpY1R5cGUgPT0gVFJVRSkKKwkJeworCQkJcFRpbWVyLT5SZXBlYXQgPSBUUlVFOworCQkJUlRNUF9TZXRQZXJpb2RpY1RpbWVyKCZwVGltZXItPlRpbWVyT2JqLCBWYWx1ZSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwVGltZXItPlJlcGVhdCA9IEZBTFNFOworCQkJUlRNUF9PU19BZGRfVGltZXIoJnBUaW1lci0+VGltZXJPYmosIFZhbHVlKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlEQkdQUklOVF9FUlIoKCJSVE1QU2V0VGltZXIgZmFpbGVkLCBUaW1lciBoYXNuJ3QgYmVlbiBpbml0aWFsaXplIVxuIikpOworCX0KK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJSW5pdCB0aW1lciBvYmplY3RzCisKKwlBcmd1bWVudHM6CisJCXBUaW1lcgkJCQlUaW1lciBzdHJ1Y3R1cmUKKwkJVmFsdWUJCQkJVGltZXIgdmFsdWUgaW4gbWlsbGlzZWNvbmRzCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisJCVRvIHVzZSB0aGlzIHJvdXRpbmUsIG11c3QgY2FsbCBSVE1QSW5pdFRpbWVyIGJlZm9yZS4KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUE1vZFRpbWVyKAorCUlOCVBSQUxJTktfVElNRVJfU1RSVUNUCXBUaW1lciwKKwlJTglVTE9ORwkJCQkJVmFsdWUpCit7CisJQk9PTEVBTglDYW5jZWw7CisKKwlpZiAocFRpbWVyLT5WYWxpZCkKKwl7CisJCXBUaW1lci0+VGltZXJWYWx1ZSA9IFZhbHVlOworCQlwVGltZXItPlN0YXRlICAgICAgPSBGQUxTRTsKKwkJaWYgKHBUaW1lci0+UGVyaW9kaWNUeXBlID09IFRSVUUpCisJCXsKKwkJCVJUTVBDYW5jZWxUaW1lcihwVGltZXIsICZDYW5jZWwpOworCQkJUlRNUFNldFRpbWVyKHBUaW1lciwgVmFsdWUpOworCQl9CisJCWVsc2UKKwkJeworCQkJUlRNUF9PU19Nb2RfVGltZXIoJnBUaW1lci0+VGltZXJPYmosIFZhbHVlKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlEQkdQUklOVF9FUlIoKCJSVE1QTW9kVGltZXIgZmFpbGVkLCBUaW1lciBoYXNuJ3QgYmVlbiBpbml0aWFsaXplIVxuIikpOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNhbmNlbCB0aW1lciBvYmplY3RzCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCQkxLikgVG8gdXNlIHRoaXMgcm91dGluZSwgbXVzdCBjYWxsIFJUTVBJbml0VGltZXIgYmVmb3JlLgorCQkyLikgUmVzZXQgTklDIHRvIGluaXRpYWwgc3RhdGUgQVMgSVMgc3lzdGVtIGJvb3QgdXAgdGltZS4KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUENhbmNlbFRpbWVyKAorCUlOCVBSQUxJTktfVElNRVJfU1RSVUNUCXBUaW1lciwKKwlPVVQJQk9PTEVBTgkJCQkJKnBDYW5jZWxsZWQpCit7CisJaWYgKHBUaW1lci0+VmFsaWQpCisJeworCQlpZiAocFRpbWVyLT5TdGF0ZSA9PSBGQUxTRSkKKwkJCXBUaW1lci0+UmVwZWF0ID0gRkFMU0U7CisJCQlSVE1QX09TX0RlbF9UaW1lcigmcFRpbWVyLT5UaW1lck9iaiwgcENhbmNlbGxlZCk7CisKKwkJaWYgKCpwQ2FuY2VsbGVkID09IFRSVUUpCisJCQlwVGltZXItPlN0YXRlID0gVFJVRTsKKworCX0KKwllbHNlCisJeworCQkvLworCQkvLyBOZGlzTUNhbmNlbFRpbWVyIGp1c3QgY2FuY2VkIHRoZSB0aW1lciBhbmQgbm90IG1lYW4gcmVsZWFzZSB0aGUgdGltZXIuCisJCS8vIEFuZCBkb24ndCBzZXQgdGhlICJWYWxpZCIgdG8gRmFsc2UuIFNvIHRoYXQgd2UgY2FuIHVzZSB0aGlzIHRpbWVyIGFnYWluLgorCQkvLworCQlEQkdQUklOVF9FUlIoKCJSVE1QQ2FuY2VsVGltZXIgZmFpbGVkLCBUaW1lciBoYXNuJ3QgYmVlbiBpbml0aWFsaXplIVxuIikpOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVNldCBMRUQgU3RhdHVzCisKKwlBcmd1bWVudHM6CisJCXBBZAkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJU3RhdHVzCQkJCQlMRUQgU3RhdHVzCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QU2V0TEVEKAorCUlOIFBSVE1QX0FEQVBURVIgCXBBZCwKKwlJTiBVQ0hBUgkJCVN0YXR1cykKK3sKKwkvL1VMT05HCQkJZGF0YTsKKwlVQ0hBUgkJCUhpZ2hCeXRlID0gMDsKKwlVQ0hBUgkJCUxvd0J5dGU7CisKKy8vIEluIEFURSBtb2RlIG9mIFJUMjg2MCBBUC9TVEEsIHdlIGhhdmUgZXJhc2VkIDgwNTEgZmlybXdhcmUuCisvLyBTbyBMRUQgbW9kZSBpcyBub3Qgc3VwcG9ydGVkIHdoZW4gQVRFIGlzIHJ1bm5pbmcuCisjaWZkZWYgUkFMSU5LX0FURQorCWlmIChBVEVfT04ocEFkKSkKKwkJcmV0dXJuOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCUxvd0J5dGUgPSBwQWQtPkxlZENudGwuZmllbGQuTGVkTW9kZSYweDdmOworCXN3aXRjaCAoU3RhdHVzKQorCXsKKwkJY2FzZSBMRURfTElOS19ET1dOOgorCQkJSGlnaEJ5dGUgPSAweDIwOworCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7CisJCQlwQWQtPkxlZEluZGljYXRvclN0cmVndGggPSAwOworCQkJYnJlYWs7CisJCWNhc2UgTEVEX0xJTktfVVA6CisJCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQorCQkJCUhpZ2hCeXRlID0gMHhhMDsKKwkJCWVsc2UKKwkJCQlIaWdoQnl0ZSA9IDB4NjA7CisJCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKKwkJCWJyZWFrOworCQljYXNlIExFRF9SQURJT19PTjoKKwkJCUhpZ2hCeXRlID0gMHgyMDsKKwkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MCwgMHhmZiwgTG93Qnl0ZSwgSGlnaEJ5dGUpOworCQkJYnJlYWs7CisJCWNhc2UgTEVEX0hBTFQ6CisJCQlMb3dCeXRlID0gMDsgLy8gRHJpdmVyIHNldHMgTUFDIHJlZ2lzdGVyIGFuZCBNQUMgY29udHJvbHMgTEVECisJCWNhc2UgTEVEX1JBRElPX09GRjoKKwkJCUhpZ2hCeXRlID0gMDsKKwkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MCwgMHhmZiwgTG93Qnl0ZSwgSGlnaEJ5dGUpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgTEVEX1dQUzoKKwkJCUhpZ2hCeXRlID0gMHgxMDsKKwkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MCwgMHhmZiwgTG93Qnl0ZSwgSGlnaEJ5dGUpOworCQkJYnJlYWs7CisJCWNhc2UgTEVEX09OX1NJVEVfU1VSVkVZOgorCQkJSGlnaEJ5dGUgPSAweDA4OworCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7CisJCQlicmVhazsKKwkJY2FzZSBMRURfUE9XRVJfVVA6CisJCQlIaWdoQnl0ZSA9IDB4MDQ7CisJCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJSVE1QU2V0TEVEOjpVbmtub3duIFN0YXR1cyAlZFxuIiwgU3RhdHVzKSk7CisJCQlicmVhazsKKwl9CisKKyAgICAvLworCS8vIEtlZXAgTEVEIHN0YXR1cyBmb3IgTEVEIFNpdGVTdXJ2ZXkgbW9kZS4KKwkvLyBBZnRlciBTaXRlU3VydmV5LCB3ZSB3aWxsIHNldCB0aGUgTEVEIG1vZGUgdG8gcHJldmlvdXMgc3RhdHVzLgorCS8vCisJaWYgKChTdGF0dXMgIT0gTEVEX09OX1NJVEVfU1VSVkVZKSAmJiAoU3RhdHVzICE9IExFRF9QT1dFUl9VUCkpCisJCXBBZC0+TGVkU3RhdHVzID0gU3RhdHVzOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNldExFRDo6TW9kZT0lZCxIaWdoQnl0ZT0weCUwMngsTG93Qnl0ZT0weCUwMnhcbiIsIHBBZC0+TGVkQ250bC5maWVsZC5MZWRNb2RlLCBIaWdoQnl0ZSwgTG93Qnl0ZSkpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJU2V0IExFRCBTaWduYWwgU3RyZWd0aAorCisJQXJndW1lbnRzOgorCQlwQWQJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCURibQkJCQkJCVNpZ25hbCBTdHJlZ3RoCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwlOb3RlOgorCQlDYW4gYmUgcnVuIG9uIGFueSBJUlFMIGxldmVsLgorCisJCUFjY29yZGluZyB0byBNaWNyb3NvZnQgWmVybyBDb25maWcgV2lyZWxlc3MgU2lnbmFsIFN0cmVndGggZGVmaW5pdGlvbiBhcyBiZWxvd3MuCisJCTw9IC05MCAgTm8gU2lnbmFsCisJCTw9IC04MSAgVmVyeSBMb3cKKwkJPD0gLTcxICBMb3cKKwkJPD0gLTY3ICBHb29kCisJCTw9IC01NyAgVmVyeSBHb29kCisJCSA+IC01NyAgRXhjZWxsZW50CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QU2V0U2lnbmFsTEVEKAorCUlOIFBSVE1QX0FEQVBURVIgCXBBZCwKKwlJTiBORElTXzgwMl8xMV9SU1NJIERibSkKK3sKKwlVQ0hBUgkJbkxlZCA9IDA7CisKKwkvLworCS8vIGlmIG5vdCBTaWduYWwgU3RyZWd0aCwgdGhlbiBkbyBub3RoaW5nLgorCS8vCisJaWYgKHBBZC0+TGVkQ250bC5maWVsZC5MZWRNb2RlICE9IExFRF9NT0RFX1NJR05BTF9TVFJFR1RIKQorCXsKKwkJcmV0dXJuOworCX0KKworCWlmIChEYm0gPD0gLTkwKQorCQluTGVkID0gMDsKKwllbHNlIGlmIChEYm0gPD0gLTgxKQorCQluTGVkID0gMTsKKwllbHNlIGlmIChEYm0gPD0gLTcxKQorCQluTGVkID0gMzsKKwllbHNlIGlmIChEYm0gPD0gLTY3KQorCQluTGVkID0gNzsKKwllbHNlIGlmIChEYm0gPD0gLTU3KQorCQluTGVkID0gMTU7CisJZWxzZQorCQluTGVkID0gMzE7CisKKwkvLworCS8vIFVwZGF0ZSBTaWduYWwgU3RyZWd0aCB0byBmaXJtd2FyZSBpZiBjaGFuZ2VkLgorCS8vCisJaWYgKHBBZC0+TGVkSW5kaWNhdG9yU3RyZWd0aCAhPSBuTGVkKQorCXsKKwkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUxLCAweGZmLCBuTGVkLCBwQWQtPkxlZENudGwuZmllbGQuUG9sYXJpdHkpOworCQlwQWQtPkxlZEluZGljYXRvclN0cmVndGggPSBuTGVkOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUVuYWJsZSBSWAorCisJQXJndW1lbnRzOgorCQlwQWQJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPD0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisJCUJlZm9yZSBFbmFibGUgUlgsIG1ha2Ugc3VyZSB5b3UgaGF2ZSBlbmFibGVkIEludGVycnVwdC4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBFbmFibGVSeFR4KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKQoreworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBSVE1QRW5hYmxlUnhUeFxuIikpOworCisJLy8gRW5hYmxlIFJ4IERNQS4KKwlSVDI4WFhETUFFbmFibGUocEFkKTsKKworCS8vIGVuYWJsZSBSWCBvZiBNQUMgYmxvY2sKKwlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX0FQKQorCXsKKwkJVUlOVDMyIHJ4X2ZpbHRlcl9mbGFnID0gQVBOT1JNQUw7CisKKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9GSUxUUl9DRkcsIHJ4X2ZpbHRlcl9mbGFnKTsgICAgIC8vIGVuYWJsZSBSWCBvZiBETUEgYmxvY2sKKwl9CisJZWxzZQorCXsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfRklMVFJfQ0ZHLCBTVEFOT1JNQUwpOyAgICAgLy8gU3RhaW9uIG5vdCBkcm9wIGNvbnRyb2wgZnJhbWUgd2lsbCBmYWlsIFdpRmkgQ2VydGlmaWNhdGlvbi4KKwl9CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4Yyk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IFJUTVBFbmFibGVSeFR4XG4iKSk7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRtcF90a2lwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydG1wX3RraXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODdlYTNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRtcF90a2lwLmMKQEAgLTAsMCArMSwxNjA3IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXJ0bXBfdGtpcC5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJUGF1bCBXdQkJMDItMjUtMDIJCUluaXRpYWwKKyovCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworLy8gUm90YXRpb24gZnVuY3Rpb25zIG9uIDMyIGJpdCB2YWx1ZXMKKyNkZWZpbmUgUk9MMzIoIEEsIG4gKSBcCisJKCAoKEEpIDw8IChuKSkgfCAoICgoQSk+PigzMi0obikpKSAmICggKDFVTCA8PCAobikpIC0gMSApICkgKQorI2RlZmluZSBST1IzMiggQSwgbiApIFJPTDMyKCAoQSksIDMyLShuKSApCisKK1VJTlQgVGtpcF9TYm94X0xvd2VyWzI1Nl0gPQoreworCTB4QTUsMHg4NCwweDk5LDB4OEQsMHgwRCwweEJELDB4QjEsMHg1NCwKKwkweDUwLDB4MDMsMHhBOSwweDdELDB4MTksMHg2MiwweEU2LDB4OUEsCisJMHg0NSwweDlELDB4NDAsMHg4NywweDE1LDB4RUIsMHhDOSwweDBCLAorCTB4RUMsMHg2NywweEZELDB4RUEsMHhCRiwweEY3LDB4OTYsMHg1QiwKKwkweEMyLDB4MUMsMHhBRSwweDZBLDB4NUEsMHg0MSwweDAyLDB4NEYsCisJMHg1QywweEY0LDB4MzQsMHgwOCwweDkzLDB4NzMsMHg1MywweDNGLAorCTB4MEMsMHg1MiwweDY1LDB4NUUsMHgyOCwweEExLDB4MEYsMHhCNSwKKwkweDA5LDB4MzYsMHg5QiwweDNELDB4MjYsMHg2OSwweENELDB4OUYsCisJMHgxQiwweDlFLDB4NzQsMHgyRSwweDJELDB4QjIsMHhFRSwweEZCLAorCTB4RjYsMHg0RCwweDYxLDB4Q0UsMHg3QiwweDNFLDB4NzEsMHg5NywKKwkweEY1LDB4NjgsMHgwMCwweDJDLDB4NjAsMHgxRiwweEM4LDB4RUQsCisJMHhCRSwweDQ2LDB4RDksMHg0QiwweERFLDB4RDQsMHhFOCwweDRBLAorCTB4NkIsMHgyQSwweEU1LDB4MTYsMHhDNSwweEQ3LDB4NTUsMHg5NCwKKwkweENGLDB4MTAsMHgwNiwweDgxLDB4RjAsMHg0NCwweEJBLDB4RTMsCisJMHhGMywweEZFLDB4QzAsMHg4QSwweEFELDB4QkMsMHg0OCwweDA0LAorCTB4REYsMHhDMSwweDc1LDB4NjMsMHgzMCwweDFBLDB4MEUsMHg2RCwKKwkweDRDLDB4MTQsMHgzNSwweDJGLDB4RTEsMHhBMiwweENDLDB4MzksCisJMHg1NywweEYyLDB4ODIsMHg0NywweEFDLDB4RTcsMHgyQiwweDk1LAorCTB4QTAsMHg5OCwweEQxLDB4N0YsMHg2NiwweDdFLDB4QUIsMHg4MywKKwkweENBLDB4MjksMHhEMywweDNDLDB4NzksMHhFMiwweDFELDB4NzYsCisJMHgzQiwweDU2LDB4NEUsMHgxRSwweERCLDB4MEEsMHg2QywweEU0LAorCTB4NUQsMHg2RSwweEVGLDB4QTYsMHhBOCwweEE0LDB4MzcsMHg4QiwKKwkweDMyLDB4NDMsMHg1OSwweEI3LDB4OEMsMHg2NCwweEQyLDB4RTAsCisJMHhCNCwweEZBLDB4MDcsMHgyNSwweEFGLDB4OEUsMHhFOSwweDE4LAorCTB4RDUsMHg4OCwweDZGLDB4NzIsMHgyNCwweEYxLDB4QzcsMHg1MSwKKwkweDIzLDB4N0MsMHg5QywweDIxLDB4REQsMHhEQywweDg2LDB4ODUsCisJMHg5MCwweDQyLDB4QzQsMHhBQSwweEQ4LDB4MDUsMHgwMSwweDEyLAorCTB4QTMsMHg1RiwweEY5LDB4RDAsMHg5MSwweDU4LDB4MjcsMHhCOSwKKwkweDM4LDB4MTMsMHhCMywweDMzLDB4QkIsMHg3MCwweDg5LDB4QTcsCisJMHhCNiwweDIyLDB4OTIsMHgyMCwweDQ5LDB4RkYsMHg3OCwweDdBLAorCTB4OEYsMHhGOCwweDgwLDB4MTcsMHhEQSwweDMxLDB4QzYsMHhCOCwKKwkweEMzLDB4QjAsMHg3NywweDExLDB4Q0IsMHhGQywweEQ2LDB4M0EKK307CisKK1VJTlQgVGtpcF9TYm94X1VwcGVyWzI1Nl0gPQoreworCTB4QzYsMHhGOCwweEVFLDB4RjYsMHhGRiwweEQ2LDB4REUsMHg5MSwKKwkweDYwLDB4MDIsMHhDRSwweDU2LDB4RTcsMHhCNSwweDRELDB4RUMsCisJMHg4RiwweDFGLDB4ODksMHhGQSwweEVGLDB4QjIsMHg4RSwweEZCLAorCTB4NDEsMHhCMywweDVGLDB4NDUsMHgyMywweDUzLDB4RTQsMHg5QiwKKwkweDc1LDB4RTEsMHgzRCwweDRDLDB4NkMsMHg3RSwweEY1LDB4ODMsCisJMHg2OCwweDUxLDB4RDEsMHhGOSwweEUyLDB4QUIsMHg2MiwweDJBLAorCTB4MDgsMHg5NSwweDQ2LDB4OUQsMHgzMCwweDM3LDB4MEEsMHgyRiwKKwkweDBFLDB4MjQsMHgxQiwweERGLDB4Q0QsMHg0RSwweDdGLDB4RUEsCisJMHgxMiwweDFELDB4NTgsMHgzNCwweDM2LDB4REMsMHhCNCwweDVCLAorCTB4QTQsMHg3NiwweEI3LDB4N0QsMHg1MiwweERELDB4NUUsMHgxMywKKwkweEE2LDB4QjksMHgwMCwweEMxLDB4NDAsMHhFMywweDc5LDB4QjYsCisJMHhENCwweDhELDB4NjcsMHg3MiwweDk0LDB4OTgsMHhCMCwweDg1LAorCTB4QkIsMHhDNSwweDRGLDB4RUQsMHg4NiwweDlBLDB4NjYsMHgxMSwKKwkweDhBLDB4RTksMHgwNCwweEZFLDB4QTAsMHg3OCwweDI1LDB4NEIsCisJMHhBMiwweDVELDB4ODAsMHgwNSwweDNGLDB4MjEsMHg3MCwweEYxLAorCTB4NjMsMHg3NywweEFGLDB4NDIsMHgyMCwweEU1LDB4RkQsMHhCRiwKKwkweDgxLDB4MTgsMHgyNiwweEMzLDB4QkUsMHgzNSwweDg4LDB4MkUsCisJMHg5MywweDU1LDB4RkMsMHg3QSwweEM4LDB4QkEsMHgzMiwweEU2LAorCTB4QzAsMHgxOSwweDlFLDB4QTMsMHg0NCwweDU0LDB4M0IsMHgwQiwKKwkweDhDLDB4QzcsMHg2QiwweDI4LDB4QTcsMHhCQywweDE2LDB4QUQsCisJMHhEQiwweDY0LDB4NzQsMHgxNCwweDkyLDB4MEMsMHg0OCwweEI4LAorCTB4OUYsMHhCRCwweDQzLDB4QzQsMHgzOSwweDMxLDB4RDMsMHhGMiwKKwkweEQ1LDB4OEIsMHg2RSwweERBLDB4MDEsMHhCMSwweDlDLDB4NDksCisJMHhEOCwweEFDLDB4RjMsMHhDRiwweENBLDB4RjQsMHg0NywweDEwLAorCTB4NkYsMHhGMCwweDRBLDB4NUMsMHgzOCwweDU3LDB4NzMsMHg5NywKKwkweENCLDB4QTEsMHhFOCwweDNFLDB4OTYsMHg2MSwweDBELDB4MEYsCisJMHhFMCwweDdDLDB4NzEsMHhDQywweDkwLDB4MDYsMHhGNywweDFDLAorCTB4QzIsMHg2QSwweEFFLDB4NjksMHgxNywweDk5LDB4M0EsMHgyNywKKwkweEQ5LDB4RUIsMHgyQiwweDIyLDB4RDIsMHhBOSwweDA3LDB4MzMsCisJMHgyRCwweDNDLDB4MTUsMHhDOSwweDg3LDB4QUEsMHg1MCwweEE1LAorCTB4MDMsMHg1OSwweDA5LDB4MUEsMHg2NSwweEQ3LDB4ODQsMHhEMCwKKwkweDgyLDB4MjksMHg1QSwweDFFLDB4N0IsMHhBOCwweDZELDB4MkMKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKiBTQk9YIFRhYmxlICoqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworVUNIQVIgU2JveFRhYmxlWzI1Nl0gPQoreworCTB4NjMsIDB4N2MsIDB4NzcsIDB4N2IsIDB4ZjIsIDB4NmIsIDB4NmYsIDB4YzUsCisJMHgzMCwgMHgwMSwgMHg2NywgMHgyYiwgMHhmZSwgMHhkNywgMHhhYiwgMHg3NiwKKwkweGNhLCAweDgyLCAweGM5LCAweDdkLCAweGZhLCAweDU5LCAweDQ3LCAweGYwLAorCTB4YWQsIDB4ZDQsIDB4YTIsIDB4YWYsIDB4OWMsIDB4YTQsIDB4NzIsIDB4YzAsCisJMHhiNywgMHhmZCwgMHg5MywgMHgyNiwgMHgzNiwgMHgzZiwgMHhmNywgMHhjYywKKwkweDM0LCAweGE1LCAweGU1LCAweGYxLCAweDcxLCAweGQ4LCAweDMxLCAweDE1LAorCTB4MDQsIDB4YzcsIDB4MjMsIDB4YzMsIDB4MTgsIDB4OTYsIDB4MDUsIDB4OWEsCisJMHgwNywgMHgxMiwgMHg4MCwgMHhlMiwgMHhlYiwgMHgyNywgMHhiMiwgMHg3NSwKKwkweDA5LCAweDgzLCAweDJjLCAweDFhLCAweDFiLCAweDZlLCAweDVhLCAweGEwLAorCTB4NTIsIDB4M2IsIDB4ZDYsIDB4YjMsIDB4MjksIDB4ZTMsIDB4MmYsIDB4ODQsCisJMHg1MywgMHhkMSwgMHgwMCwgMHhlZCwgMHgyMCwgMHhmYywgMHhiMSwgMHg1YiwKKwkweDZhLCAweGNiLCAweGJlLCAweDM5LCAweDRhLCAweDRjLCAweDU4LCAweGNmLAorCTB4ZDAsIDB4ZWYsIDB4YWEsIDB4ZmIsIDB4NDMsIDB4NGQsIDB4MzMsIDB4ODUsCisJMHg0NSwgMHhmOSwgMHgwMiwgMHg3ZiwgMHg1MCwgMHgzYywgMHg5ZiwgMHhhOCwKKwkweDUxLCAweGEzLCAweDQwLCAweDhmLCAweDkyLCAweDlkLCAweDM4LCAweGY1LAorCTB4YmMsIDB4YjYsIDB4ZGEsIDB4MjEsIDB4MTAsIDB4ZmYsIDB4ZjMsIDB4ZDIsCisJMHhjZCwgMHgwYywgMHgxMywgMHhlYywgMHg1ZiwgMHg5NywgMHg0NCwgMHgxNywKKwkweGM0LCAweGE3LCAweDdlLCAweDNkLCAweDY0LCAweDVkLCAweDE5LCAweDczLAorCTB4NjAsIDB4ODEsIDB4NGYsIDB4ZGMsIDB4MjIsIDB4MmEsIDB4OTAsIDB4ODgsCisJMHg0NiwgMHhlZSwgMHhiOCwgMHgxNCwgMHhkZSwgMHg1ZSwgMHgwYiwgMHhkYiwKKwkweGUwLCAweDMyLCAweDNhLCAweDBhLCAweDQ5LCAweDA2LCAweDI0LCAweDVjLAorCTB4YzIsIDB4ZDMsIDB4YWMsIDB4NjIsIDB4OTEsIDB4OTUsIDB4ZTQsIDB4NzksCisJMHhlNywgMHhjOCwgMHgzNywgMHg2ZCwgMHg4ZCwgMHhkNSwgMHg0ZSwgMHhhOSwKKwkweDZjLCAweDU2LCAweGY0LCAweGVhLCAweDY1LCAweDdhLCAweGFlLCAweDA4LAorCTB4YmEsIDB4NzgsIDB4MjUsIDB4MmUsIDB4MWMsIDB4YTYsIDB4YjQsIDB4YzYsCisJMHhlOCwgMHhkZCwgMHg3NCwgMHgxZiwgMHg0YiwgMHhiZCwgMHg4YiwgMHg4YSwKKwkweDcwLCAweDNlLCAweGI1LCAweDY2LCAweDQ4LCAweDAzLCAweGY2LCAweDBlLAorCTB4NjEsIDB4MzUsIDB4NTcsIDB4YjksIDB4ODYsIDB4YzEsIDB4MWQsIDB4OWUsCisJMHhlMSwgMHhmOCwgMHg5OCwgMHgxMSwgMHg2OSwgMHhkOSwgMHg4ZSwgMHg5NCwKKwkweDliLCAweDFlLCAweDg3LCAweGU5LCAweGNlLCAweDU1LCAweDI4LCAweGRmLAorCTB4OGMsIDB4YTEsIDB4ODksIDB4MGQsIDB4YmYsIDB4ZTYsIDB4NDIsIDB4NjgsCisJMHg0MSwgMHg5OSwgMHgyZCwgMHgwZiwgMHhiMCwgMHg1NCwgMHhiYiwgMHgxNgorfTsKKworVk9JRCB4b3JfMzIoCisJSU4gIFBVQ0hBUiAgICAgICAgICAgICAgYSwKKwlJTiAgUFVDSEFSICAgICAgICAgICAgICBiLAorCU9VVCBQVUNIQVIgICAgICAgICAgICAgIG91dCk7CisKK1ZPSUQgeG9yXzEyOCgKKwlJTiAgUFVDSEFSICAgICAgICAgICAgICBhLAorCUlOICBQVUNIQVIgICAgICAgICAgICAgIGIsCisJT1VUIFBVQ0hBUiAgICAgICAgICAgICAgb3V0KTsKKworVk9JRCBuZXh0X2tleSgKKwlJTiAgUFVDSEFSICAgICAgICAgICAgICBrZXksCisJSU4gIElOVCAgICAgICAgICAgICAgICAgcm91bmQpOworCitWT0lEIGJ5dGVfc3ViKAorCUlOICBQVUNIQVIgICAgICAgICAgICAgIGluLAorCU9VVCBQVUNIQVIgICAgICAgICAgICAgIG91dCk7CisKK1ZPSUQgc2hpZnRfcm93KAorCUlOICBQVUNIQVIgICAgICAgICAgICAgIGluLAorCU9VVCBQVUNIQVIgICAgICAgICAgICAgIG91dCk7CisKK1ZPSUQgbWl4X2NvbHVtbigKKwlJTiAgUFVDSEFSICAgICAgICAgICAgICBpbiwKKwlPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOworCitVQ0hBUiBSVE1QQ2tpcFNib3goCisJSU4gIFVDSEFSICAgICAgICAgICAgICAgYSk7CisvLworLy8gRXhwYW5kZWQgSVYgZm9yIFRLSVAgZnVuY3Rpb24uCisvLwordHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9JVl9DT05UUk9MXworeworCXVuaW9uIFBBQ0tFRAorCXsKKwkJc3RydWN0IFBBQ0tFRAorCQl7CisJCQlVQ0hBUgkJcmMwOworCQkJVUNIQVIJCXJjMTsKKwkJCVVDSEFSCQlyYzI7CisKKwkJCXVuaW9uIFBBQ0tFRAorCQkJeworCQkJCXN0cnVjdCBQQUNLRUQKKwkJCQl7CisjaWZkZWYgUlRfQklHX0VORElBTgorCQkJCQlVQ0hBUglLZXlJRDoyOworCQkJCQlVQ0hBUglFeHRJVjoxOworCQkJCQlVQ0hBUglSc3ZkOjU7CisjZWxzZQorCQkJCQlVQ0hBUglSc3ZkOjU7CisJCQkJCVVDSEFSCUV4dElWOjE7CisJCQkJCVVDSEFSCUtleUlEOjI7CisjZW5kaWYKKwkJCQl9CWZpZWxkOworCQkJCVVDSEFSCQlCeXRlOworCQkJfQlDT05UUk9MOworCQl9CWZpZWxkOworCisJCVVMT05HCXdvcmQ7CisJfQlJVjE2OworCisJVUxPTkcJSVYzMjsKK30JVEtJUF9JViwgKlBUS0lQX0lWOworCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDb252ZXJ0IGZyb20gVUNIQVJbXSB0byBVTE9ORyBpbiBhIHBvcnRhYmxlIHdheQorCisJQXJndW1lbnRzOgorICAgICAgcE1JQ0tleQkJcG9pbnRlciB0byBNSUMgS2V5CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitVTE9ORwlSVE1QVGtpcEdldFVJbnQzMigKKwlJTglQVUNIQVIJcE1JQ0tleSkKK3sKKwlVTE9ORwlyZXMgPSAwOworCUlOVAkJaTsKKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJeworCQlyZXMgfD0gKCpwTUlDS2V5KyspIDw8ICg4ICogaSk7CisJfQorCisJcmV0dXJuIHJlczsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNvbnZlcnQgZnJvbSBVTE9ORyB0byBVQ0hBUltdIGluIGEgcG9ydGFibGUgd2F5CisKKwlBcmd1bWVudHM6CisgICAgICBwRHN0CQkJcG9pbnRlciB0byBkZXN0aW5hdGlvbiBmb3IgY29udmVydCBVTE9ORyB0byBVQ0hBUltdCisgICAgICB2YWwJCQl0aGUgdmFsdWUgZm9yIGNvbnZlcnQKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QVGtpcFB1dFVJbnQzMigKKwlJTiBPVVQJUFVDSEFSCQlwRHN0LAorCUlOCQlVTE9ORwkJdmFsKQoreworCUlOVCBpOworCisJZm9yKGkgPSAwOyBpIDwgNDsgaSsrKQorCXsKKwkJKnBEc3QrKyA9IChVQ0hBUikgKHZhbCAmIDB4ZmYpOworCQl2YWwgPj49IDg7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJU2V0IHRoZSBNSUMgS2V5LgorCisJQXJndW1lbnRzOgorICAgICAgcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgICBwTUlDS2V5CQlwb2ludGVyIHRvIE1JQyBLZXkKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QVGtpcFNldE1JQ0tleSgKKwlJTglQVEtJUF9LRVlfSU5GTwlwVGtpcCwKKwlJTglQVUNIQVIJCQlwTUlDS2V5KQoreworCS8vIFNldCB0aGUga2V5CisJcFRraXAtPkswID0gUlRNUFRraXBHZXRVSW50MzIocE1JQ0tleSk7CisJcFRraXAtPksxID0gUlRNUFRraXBHZXRVSW50MzIocE1JQ0tleSArIDQpOworCS8vIGFuZCByZXNldCB0aGUgbWVzc2FnZQorCXBUa2lwLT5MID0gcFRraXAtPkswOworCXBUa2lwLT5SID0gcFRraXAtPksxOworCXBUa2lwLT5uQnl0ZXNJbk0gPSAwOworCXBUa2lwLT5NID0gMDsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNhbGN1bGF0ZSB0aGUgTUlDIFZhbHVlLgorCisJQXJndW1lbnRzOgorICAgICAgcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgICB1Q2hhcgkJCUFwcGVuZCB0aGlzIHVDaGFyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFRraXBBcHBlbmRCeXRlKAorCUlOCVBUS0lQX0tFWV9JTkZPCXBUa2lwLAorCUlOCVVDSEFSIAkJCXVDaGFyKQoreworCS8vIEFwcGVuZCB0aGUgYnl0ZSB0byBvdXIgd29yZC1zaXplZCBidWZmZXIKKwlwVGtpcC0+TSB8PSAodUNoYXIgPDwgKDgqIHBUa2lwLT5uQnl0ZXNJbk0pKTsKKwlwVGtpcC0+bkJ5dGVzSW5NKys7CisJLy8gUHJvY2VzcyB0aGUgd29yZCBpZiBpdCBpcyBmdWxsLgorCWlmKCBwVGtpcC0+bkJ5dGVzSW5NID49IDQgKQorCXsKKwkJcFRraXAtPkwgXj0gcFRraXAtPk07CisJCXBUa2lwLT5SIF49IFJPTDMyKCBwVGtpcC0+TCwgMTcgKTsKKwkJcFRraXAtPkwgKz0gcFRraXAtPlI7CisJCXBUa2lwLT5SIF49ICgocFRraXAtPkwgJiAweGZmMDBmZjAwKSA+PiA4KSB8ICgocFRraXAtPkwgJiAweDAwZmYwMGZmKSA8PCA4KTsKKwkJcFRraXAtPkwgKz0gcFRraXAtPlI7CisJCXBUa2lwLT5SIF49IFJPTDMyKCBwVGtpcC0+TCwgMyApOworCQlwVGtpcC0+TCArPSBwVGtpcC0+UjsKKwkJcFRraXAtPlIgXj0gUk9SMzIoIHBUa2lwLT5MLCAyICk7CisJCXBUa2lwLT5MICs9IHBUa2lwLT5SOworCQkvLyBDbGVhciB0aGUgYnVmZmVyCisJCXBUa2lwLT5NID0gMDsKKwkJcFRraXAtPm5CeXRlc0luTSA9IDA7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJQ2FsY3VsYXRlIHRoZSBNSUMgVmFsdWUuCisKKwlBcmd1bWVudHM6CisgICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKyAgICAgIHBTcmMJCQlQb2ludGVyIHRvIHNvdXJjZSBkYXRhIGZvciBDYWxjdWxhdGUgTUlDIFZhbHVlCisgICAgICBMZW4JCQlJbmRpY2F0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgZGF0YQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBUa2lwQXBwZW5kKAorCUlOCVBUS0lQX0tFWV9JTkZPCXBUa2lwLAorCUlOCVBVQ0hBUgkJCXBTcmMsCisJSU4JVUlOVAkJCW5CeXRlcykKK3sKKwkvLyBUaGlzIGlzIHNpbXBsZQorCXdoaWxlKG5CeXRlcyA+IDApCisJeworCQlSVE1QVGtpcEFwcGVuZEJ5dGUocFRraXAsICpwU3JjKyspOworCQluQnl0ZXMtLTsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlHZXQgdGhlIE1JQyBWYWx1ZS4KKworCUFyZ3VtZW50czoKKyAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisJCXRoZSBNSUMgVmFsdWUgaXMgc3RvcmUgaW4gcEFkLT5Qcml2YXRlSW5mby5NSUMKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBUa2lwR2V0TUlDKAorCUlOCVBUS0lQX0tFWV9JTkZPCXBUa2lwKQoreworCS8vIEFwcGVuZCB0aGUgbWluaW11bSBwYWRkaW5nCisJUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAweDVhICk7CisJUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAwICk7CisJUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAwICk7CisJUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAwICk7CisJUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAwICk7CisJLy8gYW5kIHRoZW4gemVyb2VzIHVudGlsIHRoZSBsZW5ndGggaXMgYSBtdWx0aXBsZSBvZiA0CisJd2hpbGUoIHBUa2lwLT5uQnl0ZXNJbk0gIT0gMCApCisJeworCQlSVE1QVGtpcEFwcGVuZEJ5dGUocFRraXAsIDAgKTsKKwl9CisJLy8gVGhlIGFwcGVuZEJ5dGUgZnVuY3Rpb24gaGFzIGFscmVhZHkgY29tcHV0ZWQgdGhlIHJlc3VsdC4KKwlSVE1QVGtpcFB1dFVJbnQzMihwVGtpcC0+TUlDLCBwVGtpcC0+TCk7CisJUlRNUFRraXBQdXRVSW50MzIocFRraXAtPk1JQyArIDQsIHBUa2lwLT5SKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUluaXQgVGtpcCBmdW5jdGlvbi4KKworCUFyZ3VtZW50czoKKyAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwVEtleSAgICAgICBQb2ludGVyIHRvIHRoZSBUZW1wb3JhbCBLZXkgKFRLKSwgVEsgc2hhbGwgYmUgMTI4Yml0cy4KKwkJS2V5SWQJCVRLIEtleSBJRAorCQlwVEEJCQlQb2ludGVyIHRvIHRyYW5zbWl0dGVyIGFkZHJlc3MKKwkJcE1JQ0tleQkJcG9pbnRlciB0byBNSUMgS2V5CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUEluaXRUa2lwRW5naW5lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBLZXksCisJSU4JVUNIQVIJCQlLZXlJZCwKKwlJTglQVUNIQVIJCQlwVEEsCisJSU4JUFVDSEFSCQkJcE1JQ0tleSwKKwlJTglQVUNIQVIJCQlwVFNDLAorCU9VVAlQVUxPTkcJCQlwSVYxNiwKKwlPVVQJUFVMT05HCQkJcElWMzIpCit7CisJVEtJUF9JVgl0a2lwSXY7CisKKwkvLyBQcmVwYXJlIDggYnl0ZXMgVEtJUCBlbmNhcHN1bGF0aW9uIGZvciBNUERVCisJTmRpc1plcm9NZW1vcnkoJnRraXBJdiwgc2l6ZW9mKFRLSVBfSVYpKTsKKwl0a2lwSXYuSVYxNi5maWVsZC5yYzAgPSAqKHBUU0MgKyAxKTsKKwl0a2lwSXYuSVYxNi5maWVsZC5yYzEgPSAodGtpcEl2LklWMTYuZmllbGQucmMwIHwgMHgyMCkgJiAweDdmOworCXRraXBJdi5JVjE2LmZpZWxkLnJjMiA9ICpwVFNDOworCXRraXBJdi5JVjE2LmZpZWxkLkNPTlRST0wuZmllbGQuRXh0SVYgPSAxOyAgLy8gMDogbm9uLWV4dGVuZGVkIElWLCAxOiBhbiBleHRlbmRlZCBJVgorCXRraXBJdi5JVjE2LmZpZWxkLkNPTlRST0wuZmllbGQuS2V5SUQgPSBLZXlJZDsKKwlOZGlzTW92ZU1lbW9yeSgmdGtpcEl2LklWMzIsIChwVFNDICsgMiksIDQpOyAgIC8vIENvcHkgSVYKKworCSpwSVYxNiA9IHRraXBJdi5JVjE2LndvcmQ7CisJKnBJVjMyID0gdGtpcEl2LklWMzI7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlJbml0IE1JQyBWYWx1ZSBjYWxjdWxhdGlvbiBmdW5jdGlvbiB3aGljaCBpbmNsdWRlIHNldCBNSUMga2V5ICYKKwkJY2FsY3VsYXRlIGZpcnN0IDE2IGJ5dGVzIChEQSArIFNBICsgcHJpb3JpdHkgKyAgMCkKKworCUFyZ3VtZW50czoKKyAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwVEtleSAgICAgICBQb2ludGVyIHRvIHRoZSBUZW1wb3JhbCBLZXkgKFRLKSwgVEsgc2hhbGwgYmUgMTI4Yml0cy4KKwkJcERBCQkJUG9pbnRlciB0byBEQSBhZGRyZXNzCisJCXBTQQkJCVBvaW50ZXIgdG8gU0EgYWRkcmVzcworCQlwTUlDS2V5CQlwb2ludGVyIHRvIE1JQyBLZXkKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUEluaXRNSUNFbmdpbmUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcEtleSwKKwlJTglQVUNIQVIJCQlwREEsCisJSU4JUFVDSEFSCQkJcFNBLAorCUlOICBVQ0hBUiAgICAgICAgICAgVXNlclByaW9yaXR5LAorCUlOCVBVQ0hBUgkJCXBNSUNLZXkpCit7CisJVUxPTkcgUHJpb3JpdHkgPSBVc2VyUHJpb3JpdHk7CisKKwkvLyBJbml0IE1JQyB2YWx1ZSBjYWxjdWxhdGlvbgorCVJUTVBUa2lwU2V0TUlDS2V5KCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwTUlDS2V5KTsKKwkvLyBEQQorCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwREEsIE1BQ19BRERSX0xFTik7CisJLy8gU0EKKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcFNBLCBNQUNfQUREUl9MRU4pOworCS8vIFByaW9yaXR5ICsgMyBieXRlcyBvZiAwCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uVHgsIChQVUNIQVIpJlByaW9yaXR5LCA0KTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNvbXBhcmUgTUlDIHZhbHVlIG9mIHJlY2VpdmVkIE1TRFUKKworCUFyZ3VtZW50czoKKwkJcEFkCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgcmVjZWl2ZWQgUGxhaW4gdGV4dCBkYXRhCisJCXBEQQkJCVBvaW50ZXIgdG8gREEgYWRkcmVzcworCQlwU0EJCQlQb2ludGVyIHRvIFNBIGFkZHJlc3MKKwkJcE1JQ0tleQkJcG9pbnRlciB0byBNSUMgS2V5CisJCUxlbiAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIHJlY2VpdmVkIHBsYWluIHRleHQgZGF0YSBleGNsdWRlIE1JQyB2YWx1ZQorCisJUmV0dXJuIFZhbHVlOgorCQlUUlVFICAgICAgICBNSUMgdmFsdWUgbWF0Y2hlZAorCQlGQUxTRSAgICAgICBNSUMgdmFsdWUgbWlzbWF0Y2hlZAorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTglSVE1QVGtpcENvbXBhcmVNSUNWYWx1ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwU3JjLAorCUlOCVBVQ0hBUgkJCXBEQSwKKwlJTglQVUNIQVIJCQlwU0EsCisJSU4JUFVDSEFSCQkJcE1JQ0tleSwKKwlJTglVQ0hBUgkJCVVzZXJQcmlvcml0eSwKKwlJTglVSU5UCQkJTGVuKQoreworCVVDSEFSCU9sZE1pY1s4XTsKKwlVTE9ORwlQcmlvcml0eSA9IFVzZXJQcmlvcml0eTsKKworCS8vIEluaXQgTUlDIHZhbHVlIGNhbGN1bGF0aW9uCisJUlRNUFRraXBTZXRNSUNLZXkoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBNSUNLZXkpOworCS8vIERBCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBEQSwgTUFDX0FERFJfTEVOKTsKKwkvLyBTQQorCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwU0EsIE1BQ19BRERSX0xFTik7CisJLy8gUHJpb3JpdHkgKyAzIGJ5dGVzIG9mIDAKKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgKFBVQ0hBUikmUHJpb3JpdHksIDQpOworCisJLy8gQ2FsY3VsYXRlIE1JQyB2YWx1ZSBmcm9tIHBsYWluIHRleHQgZGF0YQorCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwU3JjLCBMZW4pOworCisJLy8gR2V0IE1JQyB2YWx1ZGUgZnJvbSByZWNlaXZlZCBmcmFtZQorCU5kaXNNb3ZlTWVtb3J5KE9sZE1pYywgcFNyYyArIExlbiwgOCk7CisKKwkvLyBHZXQgTUlDIHZhbHVlIGZyb20gZGVjcnlwdGVkIHBsYWluIGRhdGEKKwlSVE1QVGtpcEdldE1JQygmcEFkLT5Qcml2YXRlSW5mby5SeCk7CisKKwkvLyBNb3ZlIE1JQyB2YWx1ZSBmcm9tIE1TRFUsIHRoaXMgc3RlcHMgc2hvdWxkIG1vdmUgdG8gZGF0YSBwYXRoLgorCS8vIFNpbmNlIHRoZSBNSUMgdmFsdWUgbWlnaHQgY3Jvc3MgTVBEVXMuCisJaWYoIU5kaXNFcXVhbE1lbW9yeShwQWQtPlByaXZhdGVJbmZvLlJ4Lk1JQywgT2xkTWljLCA4KSkKKwl7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJSVE1QVGtpcENvbXBhcmVNSUNWYWx1ZSgpOiBUS0lQIE1JQyBFcnJvciAhXG4iKSk7ICAvL01JQyBlcnJvci4KKworCisJCXJldHVybiAoRkFMU0UpOworCX0KKwlyZXR1cm4gKFRSVUUpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJQ29tcGFyZSBNSUMgdmFsdWUgb2YgcmVjZWl2ZWQgTVNEVQorCisJQXJndW1lbnRzOgorCQlwQWQJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwTExDCQlMTEMgaGVhZGVyCisJCXBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIHJlY2VpdmVkIFBsYWluIHRleHQgZGF0YQorCQlwREEJCQlQb2ludGVyIHRvIERBIGFkZHJlc3MKKwkJcFNBCQkJUG9pbnRlciB0byBTQSBhZGRyZXNzCisJCXBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQorCQlMZW4gICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSByZWNlaXZlZCBwbGFpbiB0ZXh0IGRhdGEgZXhjbHVkZSBNSUMgdmFsdWUKKworCVJldHVybiBWYWx1ZToKKwkJVFJVRSAgICAgICAgTUlDIHZhbHVlIG1hdGNoZWQKKwkJRkFMU0UgICAgICAgTUlDIHZhbHVlIG1pc21hdGNoZWQKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4JUlRNUFRraXBDb21wYXJlTUlDVmFsdWVXaXRoTExDKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBMTEMsCisJSU4JUFVDSEFSCQkJcFNyYywKKwlJTglQVUNIQVIJCQlwREEsCisJSU4JUFVDSEFSCQkJcFNBLAorCUlOCVBVQ0hBUgkJCXBNSUNLZXksCisJSU4JVUlOVAkJCUxlbikKK3sKKwlVQ0hBUglPbGRNaWNbOF07CisJVUxPTkcJUHJpb3JpdHkgPSAwOworCisJLy8gSW5pdCBNSUMgdmFsdWUgY2FsY3VsYXRpb24KKwlSVE1QVGtpcFNldE1JQ0tleSgmcEFkLT5Qcml2YXRlSW5mby5SeCwgcE1JQ0tleSk7CisJLy8gREEKKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgcERBLCBNQUNfQUREUl9MRU4pOworCS8vIFNBCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBTQSwgTUFDX0FERFJfTEVOKTsKKwkvLyBQcmlvcml0eSArIDMgYnl0ZXMgb2YgMAorCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCAoUFVDSEFSKSZQcmlvcml0eSwgNCk7CisKKwkvLyBTdGFydCB3aXRoIExMQyBoZWFkZXIKKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgcExMQywgOCk7CisKKwkvLyBDYWxjdWxhdGUgTUlDIHZhbHVlIGZyb20gcGxhaW4gdGV4dCBkYXRhCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBTcmMsIExlbik7CisKKwkvLyBHZXQgTUlDIHZhbHVkZSBmcm9tIHJlY2VpdmVkIGZyYW1lCisJTmRpc01vdmVNZW1vcnkoT2xkTWljLCBwU3JjICsgTGVuLCA4KTsKKworCS8vIEdldCBNSUMgdmFsdWUgZnJvbSBkZWNyeXB0ZWQgcGxhaW4gZGF0YQorCVJUTVBUa2lwR2V0TUlDKCZwQWQtPlByaXZhdGVJbmZvLlJ4KTsKKworCS8vIE1vdmUgTUlDIHZhbHVlIGZyb20gTVNEVSwgdGhpcyBzdGVwcyBzaG91bGQgbW92ZSB0byBkYXRhIHBhdGguCisJLy8gU2luY2UgdGhlIE1JQyB2YWx1ZSBtaWdodCBjcm9zcyBNUERVcy4KKwlpZighTmRpc0VxdWFsTWVtb3J5KHBBZC0+UHJpdmF0ZUluZm8uUnguTUlDLCBPbGRNaWMsIDgpKQorCXsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBUa2lwQ29tcGFyZU1JQ1ZhbHVlV2l0aExMQygpOiBUS0lQIE1JQyBFcnJvciAhXG4iKSk7ICAvL01JQyBlcnJvci4KKworCisJCXJldHVybiAoRkFMU0UpOworCX0KKwlyZXR1cm4gKFRSVUUpOworfQorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNvcHkgZnJhbWUgZnJvbSB3YWl0aW5nIHF1ZXVlIGludG8gcmVsYXRpdmUgcmluZyBidWZmZXIgYW5kIHNldAorCWFwcHJvcHJpYXRlIEFTSUMgcmVnaXN0ZXIgdG8ga2ljayBoYXJkd2FyZSB0cmFuc21pdCBmdW5jdGlvbgorCisJQXJndW1lbnRzOgorCQlwQWQJCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKwkJUE5ESVNfUEFDS0VUCVBvaW50ZXIgdG8gTmRpcyBQYWNrZXQgZm9yIE1JQyBjYWxjdWxhdGlvbgorCQlwRW5jYXAJCQlQb2ludGVyIHRvIExMQyBlbmNhcCBkYXRhCisJCUxlbkVuY2FwCQlUb3RhbCBlbmNhcCBsZW5ndGgsIG1pZ2h0IGJlIDAgd2hpY2ggaW5kaWNhdGVzIG5vIGVuY2FwCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUENhbGN1bGF0ZU1JQ1ZhbHVlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAorCUlOCVBVQ0hBUgkJCXBFbmNhcCwKKwlJTglQQ0lQSEVSX0tFWQkJcEtleSwKKwlJTglVQ0hBUgkJCWFwaWR4KQoreworCVBBQ0tFVF9JTkZPCQlQYWNrZXRJbmZvOworCVBVQ0hBUgkJCXBTcmNCdWZWQTsKKwlVSU5UCQkJU3JjQnVmTGVuOworCVBVQ0hBUgkJCXBTcmM7CisgICAgVUNIQVIgICAgICAgICAgIFVzZXJQcmlvcml0eTsKKwlVQ0hBUgkJCXZsYW5fb2Zmc2V0ID0gMDsKKworCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBQYWNrZXQsICZQYWNrZXRJbmZvLCAmcFNyY0J1ZlZBLCAmU3JjQnVmTGVuKTsKKworCVVzZXJQcmlvcml0eSA9IFJUTVBfR0VUX1BBQ0tFVF9VUChwUGFja2V0KTsKKwlwU3JjID0gcFNyY0J1ZlZBOworCisJLy8gZGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSB2bGFuIHBhY2tldAorCWlmICgoKCoocFNyYyArIDEyKSA8PCA4KSArICoocFNyYyArIDEzKSkgPT0gMHg4MTAwKQorCQl2bGFuX29mZnNldCA9IDQ7CisKKwl7CisJCVJUTVBJbml0TUlDRW5naW5lKAorCQkJcEFkLAorCQkJcEtleS0+S2V5LAorCQkJcFNyYywKKwkJCXBTcmMgKyA2LAorCQkJVXNlclByaW9yaXR5LAorCQkJcEtleS0+VHhNaWMpOworCX0KKworCisJaWYgKHBFbmNhcCAhPSBOVUxMKQorCXsKKwkJLy8gTExDIGVuY2Fwc3VsYXRpb24KKwkJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uVHgsIHBFbmNhcCwgNik7CisJCS8vIFByb3RvY29sIFR5cGUKKwkJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uVHgsIHBTcmMgKyAxMiArIHZsYW5fb2Zmc2V0LCAyKTsKKwl9CisJU3JjQnVmTGVuIC09ICgxNCArIHZsYW5fb2Zmc2V0KTsKKwlwU3JjICs9ICgxNCArIHZsYW5fb2Zmc2V0KTsKKwlkbworCXsKKwkJaWYgKFNyY0J1ZkxlbiA+IDApCisJCXsKKwkJCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwU3JjLCBTcmNCdWZMZW4pOworCQl9CisKKwkJYnJlYWs7CS8vIE5vIG5lZWQgaGFuZGxlIG5leHQgcGFja2V0CisKKwl9CXdoaWxlIChUUlVFKTsJCS8vIEVuZCBvZiBjb3B5aW5nIHBheWxvYWQKKworCS8vIENvbXB1dGUgdGhlIGZpbmFsIE1JQyBWYWx1ZQorCVJUTVBUa2lwR2V0TUlDKCZwQWQtPlByaXZhdGVJbmZvLlR4KTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogdGtpcF9zYm94KCkJCQkJCQkJCQkJCQkJCQkJKi8KKy8qIFJldHVybnMgYSAxNiBiaXQgdmFsdWUgZnJvbSBhIDY0SyBlbnRyeSB0YWJsZS4gVGhlIFRhYmxlICovCisvKiBpcyBzeW50aGVzaXplZCBmcm9tIHR3byAyNTYgZW50cnkgYnl0ZSB3aWRlIHRhYmxlcy4JCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitVSU5UIHRraXBfc2JveChVSU5UIGluZGV4KQoreworCVVJTlQgaW5kZXhfbG93OworCVVJTlQgaW5kZXhfaGlnaDsKKwlVSU5UIGxlZnQsIHJpZ2h0OworCisJaW5kZXhfbG93ID0gKGluZGV4ICUgMjU2KTsKKwlpbmRleF9oaWdoID0gKChpbmRleCA+PiA4KSAlIDI1Nik7CisKKwlsZWZ0ID0gVGtpcF9TYm94X0xvd2VyW2luZGV4X2xvd10gKyAoVGtpcF9TYm94X1VwcGVyW2luZGV4X2xvd10gKiAyNTYpOworCXJpZ2h0ID0gVGtpcF9TYm94X1VwcGVyW2luZGV4X2hpZ2hdICsgKFRraXBfU2JveF9Mb3dlcltpbmRleF9oaWdoXSAqIDI1Nik7CisKKwlyZXR1cm4gKGxlZnQgXiByaWdodCk7Cit9CisKK1VJTlQgcm90cjEoVUlOVCBhKQoreworCXVuc2lnbmVkIGludCBiOworCisJaWYgKChhICYgMHgwMSkgPT0gMHgwMSkKKwl7CisJCWIgPSAoYSA+PiAxKSB8IDB4ODAwMDsKKwl9CisJZWxzZQorCXsKKwkJYiA9IChhID4+IDEpICYgMHg3ZmZmOworCX0KKwliID0gYiAlIDY1NTM2OworCXJldHVybiBiOworfQorCitWT0lEIFJUTVBUa2lwTWl4S2V5KAorCVVDSEFSICprZXksCisJVUNIQVIgKnRhLAorCVVMT05HIHBubCwgLyogTGVhc3Qgc2lnbmlmaWNhbnQgMTYgYml0cyBvZiBQTiAqLworCVVMT05HIHBuaCwgLyogTW9zdCBzaWduaWZpY2FudCAzMiBiaXRzIG9mIFBOICovCisJVUNIQVIgKnJjNGtleSwKKwlVSU5UICpwMWspCit7CisKKwlVSU5UIHRzYzA7CisJVUlOVCB0c2MxOworCVVJTlQgdHNjMjsKKworCVVJTlQgcHBrMDsKKwlVSU5UIHBwazE7CisJVUlOVCBwcGsyOworCVVJTlQgcHBrMzsKKwlVSU5UIHBwazQ7CisJVUlOVCBwcGs1OworCisJSU5UIGk7CisJSU5UIGo7CisKKwl0c2MwID0gKHVuc2lnbmVkIGludCkoKHBuaCA+PiAxNikgJSA2NTUzNik7IC8qIG1zYiAqLworCXRzYzEgPSAodW5zaWduZWQgaW50KShwbmggJSA2NTUzNik7CisJdHNjMiA9ICh1bnNpZ25lZCBpbnQpKHBubCAlIDY1NTM2KTsgLyogbHNiICovCisKKwkvKiBQaGFzZSAxLCBzdGVwIDEgKi8KKwlwMWtbMF0gPSB0c2MxOworCXAxa1sxXSA9IHRzYzA7CisJcDFrWzJdID0gKFVJTlQpKHRhWzBdICsgKHRhWzFdKjI1NikpOworCXAxa1szXSA9IChVSU5UKSh0YVsyXSArICh0YVszXSoyNTYpKTsKKwlwMWtbNF0gPSAoVUlOVCkodGFbNF0gKyAodGFbNV0qMjU2KSk7CisKKwkvKiBQaGFzZSAxLCBzdGVwIDIgKi8KKwlmb3IgKGk9MDsgaTw4OyBpKyspCisJeworCQlqID0gMiooaSAmIDEpOworCQlwMWtbMF0gPSAocDFrWzBdICsgdGtpcF9zYm94KCAocDFrWzRdIF4gKCgyNTYqa2V5WzEral0pICsga2V5W2pdKSkgJSA2NTUzNiApKSAlIDY1NTM2OworCQlwMWtbMV0gPSAocDFrWzFdICsgdGtpcF9zYm94KCAocDFrWzBdIF4gKCgyNTYqa2V5WzUral0pICsga2V5WzQral0pKSAlIDY1NTM2ICkpICUgNjU1MzY7CisJCXAxa1syXSA9IChwMWtbMl0gKyB0a2lwX3Nib3goIChwMWtbMV0gXiAoKDI1NiprZXlbOStqXSkgKyBrZXlbOCtqXSkpICUgNjU1MzYgKSkgJSA2NTUzNjsKKwkJcDFrWzNdID0gKHAxa1szXSArIHRraXBfc2JveCggKHAxa1syXSBeICgoMjU2KmtleVsxMytqXSkgKyBrZXlbMTIral0pKSAlIDY1NTM2ICkpICUgNjU1MzY7CisJCXAxa1s0XSA9IChwMWtbNF0gKyB0a2lwX3Nib3goIChwMWtbM10gXiAoKCgyNTYqa2V5WzEral0pICsga2V5W2pdKSkpICUgNjU1MzYgKSkgJSA2NTUzNjsKKwkJcDFrWzRdID0gKHAxa1s0XSArIGkpICUgNjU1MzY7CisJfQorCisJLyogUGhhc2UgMiwgU3RlcCAxICovCisJcHBrMCA9IHAxa1swXTsKKwlwcGsxID0gcDFrWzFdOworCXBwazIgPSBwMWtbMl07CisJcHBrMyA9IHAxa1szXTsKKwlwcGs0ID0gcDFrWzRdOworCXBwazUgPSAocDFrWzRdICsgdHNjMikgJSA2NTUzNjsKKworCS8qIFBoYXNlMiwgU3RlcCAyICovCisJcHBrMCA9IHBwazAgKyB0a2lwX3Nib3goIChwcGs1IF4gKCgyNTYqa2V5WzFdKSArIGtleVswXSkpICUgNjU1MzYpOworCXBwazEgPSBwcGsxICsgdGtpcF9zYm94KCAocHBrMCBeICgoMjU2KmtleVszXSkgKyBrZXlbMl0pKSAlIDY1NTM2KTsKKwlwcGsyID0gcHBrMiArIHRraXBfc2JveCggKHBwazEgXiAoKDI1NiprZXlbNV0pICsga2V5WzRdKSkgJSA2NTUzNik7CisJcHBrMyA9IHBwazMgKyB0a2lwX3Nib3goIChwcGsyIF4gKCgyNTYqa2V5WzddKSArIGtleVs2XSkpICUgNjU1MzYpOworCXBwazQgPSBwcGs0ICsgdGtpcF9zYm94KCAocHBrMyBeICgoMjU2KmtleVs5XSkgKyBrZXlbOF0pKSAlIDY1NTM2KTsKKwlwcGs1ID0gcHBrNSArIHRraXBfc2JveCggKHBwazQgXiAoKDI1NiprZXlbMTFdKSArIGtleVsxMF0pKSAlIDY1NTM2KTsKKworCXBwazAgPSBwcGswICsgcm90cjEocHBrNSBeICgoMjU2KmtleVsxM10pICsga2V5WzEyXSkpOworCXBwazEgPSBwcGsxICsgcm90cjEocHBrMCBeICgoMjU2KmtleVsxNV0pICsga2V5WzE0XSkpOworCXBwazIgPSBwcGsyICsgcm90cjEocHBrMSk7CisJcHBrMyA9IHBwazMgKyByb3RyMShwcGsyKTsKKwlwcGs0ID0gcHBrNCArIHJvdHIxKHBwazMpOworCXBwazUgPSBwcGs1ICsgcm90cjEocHBrNCk7CisKKwkvKiBQaGFzZSAyLCBTdGVwIDMgKi8KKyAgICAvKiBQaGFzZSAyLCBTdGVwIDMgKi8KKworCXRzYzAgPSAodW5zaWduZWQgaW50KSgocG5oID4+IDE2KSAlIDY1NTM2KTsgLyogbXNiICovCisJdHNjMSA9ICh1bnNpZ25lZCBpbnQpKHBuaCAlIDY1NTM2KTsKKwl0c2MyID0gKHVuc2lnbmVkIGludCkocG5sICUgNjU1MzYpOyAvKiBsc2IgKi8KKworCXJjNGtleVswXSA9ICh0c2MyID4+IDgpICUgMjU2OworCXJjNGtleVsxXSA9ICgoKHRzYzIgPj4gOCkgJSAyNTYpIHwgMHgyMCkgJiAweDdmOworCXJjNGtleVsyXSA9IHRzYzIgJSAyNTY7CisJcmM0a2V5WzNdID0gKChwcGs1IF4gKCgyNTYqa2V5WzFdKSArIGtleVswXSkpID4+IDEpICUgMjU2OworCisJcmM0a2V5WzRdID0gcHBrMCAlIDI1NjsKKwlyYzRrZXlbNV0gPSAocHBrMCA+PiA4KSAlIDI1NjsKKworCXJjNGtleVs2XSA9IHBwazEgJSAyNTY7CisJcmM0a2V5WzddID0gKHBwazEgPj4gOCkgJSAyNTY7CisKKwlyYzRrZXlbOF0gPSBwcGsyICUgMjU2OworCXJjNGtleVs5XSA9IChwcGsyID4+IDgpICUgMjU2OworCisJcmM0a2V5WzEwXSA9IHBwazMgJSAyNTY7CisJcmM0a2V5WzExXSA9IChwcGszID4+IDgpICUgMjU2OworCisJcmM0a2V5WzEyXSA9IHBwazQgJSAyNTY7CisJcmM0a2V5WzEzXSA9IChwcGs0ID4+IDgpICUgMjU2OworCisJcmM0a2V5WzE0XSA9IHBwazUgJSAyNTY7CisJcmM0a2V5WzE1XSA9IChwcGs1ID4+IDgpICUgMjU2OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBjb25zdHJ1Y3RfbWljX2hlYWRlcjEoKSAgICAgICAgICAgICAgICAgICAgICAqLworLyogQnVpbGRzIHRoZSBmaXJzdCBNSUMgaGVhZGVyIGJsb2NrIGZyb20gICAgICAgKi8KKy8qIGhlYWRlciBmaWVsZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGNvbnN0cnVjdF9taWNfaGVhZGVyMSgKKwl1bnNpZ25lZCBjaGFyICptaWNfaGVhZGVyMSwKKwlpbnQgaGVhZGVyX2xlbmd0aCwKKwl1bnNpZ25lZCBjaGFyICptcGR1KQoreworCW1pY19oZWFkZXIxWzBdID0gKHVuc2lnbmVkIGNoYXIpKChoZWFkZXJfbGVuZ3RoIC0gMikgLyAyNTYpOworCW1pY19oZWFkZXIxWzFdID0gKHVuc2lnbmVkIGNoYXIpKChoZWFkZXJfbGVuZ3RoIC0gMikgJSAyNTYpOworCW1pY19oZWFkZXIxWzJdID0gbXBkdVswXSAmIDB4Y2Y7ICAgIC8qIE11dGUgQ0YgcG9sbCAmIENGIGFjayBiaXRzICovCisJbWljX2hlYWRlcjFbM10gPSBtcGR1WzFdICYgMHhjNzsgICAgLyogTXV0ZSByZXRyeSwgbW9yZSBkYXRhIGFuZCBwd3IgbWd0IGJpdHMgKi8KKwltaWNfaGVhZGVyMVs0XSA9IG1wZHVbNF07ICAgICAgIC8qIEExICovCisJbWljX2hlYWRlcjFbNV0gPSBtcGR1WzVdOworCW1pY19oZWFkZXIxWzZdID0gbXBkdVs2XTsKKwltaWNfaGVhZGVyMVs3XSA9IG1wZHVbN107CisJbWljX2hlYWRlcjFbOF0gPSBtcGR1WzhdOworCW1pY19oZWFkZXIxWzldID0gbXBkdVs5XTsKKwltaWNfaGVhZGVyMVsxMF0gPSBtcGR1WzEwXTsgICAgIC8qIEEyICovCisJbWljX2hlYWRlcjFbMTFdID0gbXBkdVsxMV07CisJbWljX2hlYWRlcjFbMTJdID0gbXBkdVsxMl07CisJbWljX2hlYWRlcjFbMTNdID0gbXBkdVsxM107CisJbWljX2hlYWRlcjFbMTRdID0gbXBkdVsxNF07CisJbWljX2hlYWRlcjFbMTVdID0gbXBkdVsxNV07Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBjb25zdHJ1Y3RfbWljX2hlYWRlcjIoKSAgICAgICAgICAgICAgICAgICAgICAqLworLyogQnVpbGRzIHRoZSBsYXN0IE1JQyBoZWFkZXIgYmxvY2sgZnJvbSAgICAgICAgKi8KKy8qIGhlYWRlciBmaWVsZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGNvbnN0cnVjdF9taWNfaGVhZGVyMigKKwl1bnNpZ25lZCBjaGFyICptaWNfaGVhZGVyMiwKKwl1bnNpZ25lZCBjaGFyICptcGR1LAorCWludCBhNF9leGlzdHMsCisJaW50IHFjX2V4aXN0cykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGk8MTY7IGkrKykgbWljX2hlYWRlcjJbaV09MHgwMDsKKworCW1pY19oZWFkZXIyWzBdID0gbXBkdVsxNl07ICAgIC8qIEEzICovCisJbWljX2hlYWRlcjJbMV0gPSBtcGR1WzE3XTsKKwltaWNfaGVhZGVyMlsyXSA9IG1wZHVbMThdOworCW1pY19oZWFkZXIyWzNdID0gbXBkdVsxOV07CisJbWljX2hlYWRlcjJbNF0gPSBtcGR1WzIwXTsKKwltaWNfaGVhZGVyMls1XSA9IG1wZHVbMjFdOworCisJLy8gSW4gU2VxdWVuY2UgQ29udHJvbCBmaWVsZCwgbXV0ZSBzZXF1ZW5jZSBudW1lciBiaXRzICgxMi1iaXQpCisJbWljX2hlYWRlcjJbNl0gPSBtcGR1WzIyXSAmIDB4MGY7ICAgLyogU0MgKi8KKwltaWNfaGVhZGVyMls3XSA9IDB4MDA7IC8qIG1wZHVbMjNdOyAqLworCisJaWYgKCghcWNfZXhpc3RzKSAmIGE0X2V4aXN0cykKKwl7CisJCWZvciAoaT0wO2k8NjtpKyspIG1pY19oZWFkZXIyWzgraV0gPSBtcGR1WzI0K2ldOyAgIC8qIEE0ICovCisKKwl9CisKKwlpZiAocWNfZXhpc3RzICYmICghYTRfZXhpc3RzKSkKKwl7CisJCW1pY19oZWFkZXIyWzhdID0gbXBkdVsyNF0gJiAweDBmOyAvKiBtdXRlIGJpdHMgMTUgLSA0ICovCisJCW1pY19oZWFkZXIyWzldID0gbXBkdVsyNV0gJiAweDAwOworCX0KKworCWlmIChxY19leGlzdHMgJiYgYTRfZXhpc3RzKQorCXsKKwkJZm9yIChpPTA7aTw2O2krKykgbWljX2hlYWRlcjJbOCtpXSA9IG1wZHVbMjQraV07ICAgLyogQTQgKi8KKworCQltaWNfaGVhZGVyMlsxNF0gPSBtcGR1WzMwXSAmIDB4MGY7CisJCW1pY19oZWFkZXIyWzE1XSA9IG1wZHVbMzFdICYgMHgwMDsKKwl9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGNvbnN0cnVjdF9taWNfaXYoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBCdWlsZHMgdGhlIE1JQyBJViBmcm9tIGhlYWRlciBmaWVsZHMgYW5kIFBOICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBjb25zdHJ1Y3RfbWljX2l2KAorCXVuc2lnbmVkIGNoYXIgKm1pY19pdiwKKwlpbnQgcWNfZXhpc3RzLAorCWludCBhNF9leGlzdHMsCisJdW5zaWduZWQgY2hhciAqbXBkdSwKKwl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW5ndGgsCisJdW5zaWduZWQgY2hhciAqcG5fdmVjdG9yKQoreworCWludCBpOworCisJbWljX2l2WzBdID0gMHg1OTsKKwlpZiAocWNfZXhpc3RzICYmIGE0X2V4aXN0cykKKwkJbWljX2l2WzFdID0gbXBkdVszMF0gJiAweDBmOyAgICAvKiBRb1NfVEMgICAgICAgICAgICovCisJaWYgKHFjX2V4aXN0cyAmJiAhYTRfZXhpc3RzKQorCQltaWNfaXZbMV0gPSBtcGR1WzI0XSAmIDB4MGY7ICAgLyogbXV0ZSBiaXRzIDctNCAgICAqLworCWlmICghcWNfZXhpc3RzKQorCQltaWNfaXZbMV0gPSAweDAwOworCWZvciAoaSA9IDI7IGkgPCA4OyBpKyspCisJCW1pY19pdltpXSA9IG1wZHVbaSArIDhdOyAgICAgICAgICAgICAgICAgICAgLyogbWljX2l2WzI6N10gPSBBMlswOjVdID0gbXBkdVsxMDoxNV0gKi8KKyNpZmRlZiBDT05TSVNURU5UX1BOX09SREVSCisJCWZvciAoaSA9IDg7IGkgPCAxNDsgaSsrKQorCQkJbWljX2l2W2ldID0gcG5fdmVjdG9yW2kgLSA4XTsgICAgICAgICAgIC8qIG1pY19pdls4OjEzXSA9IFBOWzA6NV0gKi8KKyNlbHNlCisJCWZvciAoaSA9IDg7IGkgPCAxNDsgaSsrKQorCQkJbWljX2l2W2ldID0gcG5fdmVjdG9yWzEzIC0gaV07ICAgICAgICAgIC8qIG1pY19pdls4OjEzXSA9IFBOWzU6MF0gKi8KKyNlbmRpZgorCWkgPSAocGF5bG9hZF9sZW5ndGggLyAyNTYpOworCWkgPSAocGF5bG9hZF9sZW5ndGggJSAyNTYpOworCW1pY19pdlsxNF0gPSAodW5zaWduZWQgY2hhcikgKHBheWxvYWRfbGVuZ3RoIC8gMjU2KTsKKwltaWNfaXZbMTVdID0gKHVuc2lnbmVkIGNoYXIpIChwYXlsb2FkX2xlbmd0aCAlIDI1Nik7CisKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBiaXR3aXNlX3hvcigpICAgICAgICAgICAgICAgICAgICAqLworLyogQSAxMjggYml0LCBiaXR3aXNlIGV4Y2x1c2l2ZSBvciAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgYml0d2lzZV94b3IodW5zaWduZWQgY2hhciAqaW5hLCB1bnNpZ25lZCBjaGFyICppbmIsIHVuc2lnbmVkIGNoYXIgKm91dCkKK3sKKwlpbnQgaTsKKwlmb3IgKGk9MDsgaTwxNjsgaSsrKQorCXsKKwkJb3V0W2ldID0gaW5hW2ldIF4gaW5iW2ldOworCX0KK30KKworCit2b2lkIGFlczEyOGsxMjhkKHVuc2lnbmVkIGNoYXIgKmtleSwgdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgY2hhciAqY2lwaGVydGV4dCkKK3sKKwlpbnQgcm91bmQ7CisJaW50IGk7CisJdW5zaWduZWQgY2hhciBpbnRlcm1lZGlhdGVhWzE2XTsKKwl1bnNpZ25lZCBjaGFyIGludGVybWVkaWF0ZWJbMTZdOworCXVuc2lnbmVkIGNoYXIgcm91bmRfa2V5WzE2XTsKKworCWZvcihpPTA7IGk8MTY7IGkrKykgcm91bmRfa2V5W2ldID0ga2V5W2ldOworCisJZm9yIChyb3VuZCA9IDA7IHJvdW5kIDwgMTE7IHJvdW5kKyspCisJeworCQlpZiAocm91bmQgPT0gMCkKKwkJeworCQkJeG9yXzEyOChyb3VuZF9rZXksIGRhdGEsIGNpcGhlcnRleHQpOworCQkJbmV4dF9rZXkocm91bmRfa2V5LCByb3VuZCk7CisJCX0KKwkJZWxzZSBpZiAocm91bmQgPT0gMTApCisJCXsKKwkJCWJ5dGVfc3ViKGNpcGhlcnRleHQsIGludGVybWVkaWF0ZWEpOworCQkJc2hpZnRfcm93KGludGVybWVkaWF0ZWEsIGludGVybWVkaWF0ZWIpOworCQkJeG9yXzEyOChpbnRlcm1lZGlhdGViLCByb3VuZF9rZXksIGNpcGhlcnRleHQpOworCQl9CisJCWVsc2UgICAgLyogMSAtIDkgKi8KKwkJeworCQkJYnl0ZV9zdWIoY2lwaGVydGV4dCwgaW50ZXJtZWRpYXRlYSk7CisJCQlzaGlmdF9yb3coaW50ZXJtZWRpYXRlYSwgaW50ZXJtZWRpYXRlYik7CisJCQltaXhfY29sdW1uKCZpbnRlcm1lZGlhdGViWzBdLCAmaW50ZXJtZWRpYXRlYVswXSk7CisJCQltaXhfY29sdW1uKCZpbnRlcm1lZGlhdGViWzRdLCAmaW50ZXJtZWRpYXRlYVs0XSk7CisJCQltaXhfY29sdW1uKCZpbnRlcm1lZGlhdGViWzhdLCAmaW50ZXJtZWRpYXRlYVs4XSk7CisJCQltaXhfY29sdW1uKCZpbnRlcm1lZGlhdGViWzEyXSwgJmludGVybWVkaWF0ZWFbMTJdKTsKKwkJCXhvcl8xMjgoaW50ZXJtZWRpYXRlYSwgcm91bmRfa2V5LCBjaXBoZXJ0ZXh0KTsKKwkJCW5leHRfa2V5KHJvdW5kX2tleSwgcm91bmQpOworCQl9CisJfQorCit9CisKK3ZvaWQgY29uc3RydWN0X2N0cl9wcmVsb2FkKAorCXVuc2lnbmVkIGNoYXIgKmN0cl9wcmVsb2FkLAorCWludCBhNF9leGlzdHMsCisJaW50IHFjX2V4aXN0cywKKwl1bnNpZ25lZCBjaGFyICptcGR1LAorCXVuc2lnbmVkIGNoYXIgKnBuX3ZlY3RvciwKKwlpbnQgYykKK3sKKworCWludCBpID0gMDsKKwlmb3IgKGk9MDsgaTwxNjsgaSsrKSBjdHJfcHJlbG9hZFtpXSA9IDB4MDA7CisJaSA9IDA7CisKKwljdHJfcHJlbG9hZFswXSA9IDB4MDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZsYWcgKi8KKwlpZiAocWNfZXhpc3RzICYmIGE0X2V4aXN0cykgY3RyX3ByZWxvYWRbMV0gPSBtcGR1WzMwXSAmIDB4MGY7ICAgLyogUW9DX0NvbnRyb2wgICovCisJaWYgKHFjX2V4aXN0cyAmJiAhYTRfZXhpc3RzKSBjdHJfcHJlbG9hZFsxXSA9IG1wZHVbMjRdICYgMHgwZjsKKworCWZvciAoaSA9IDI7IGkgPCA4OyBpKyspCisJCWN0cl9wcmVsb2FkW2ldID0gbXBkdVtpICsgOF07ICAgICAgICAgICAgICAgICAgICAgICAvKiBjdHJfcHJlbG9hZFsyOjddID0gQTJbMDo1XSA9IG1wZHVbMTA6MTVdICovCisjaWZkZWYgQ09OU0lTVEVOVF9QTl9PUkRFUgorCSAgZm9yIChpID0gODsgaSA8IDE0OyBpKyspCisJCQljdHJfcHJlbG9hZFtpXSA9ICAgIHBuX3ZlY3RvcltpIC0gOF07ICAgICAgICAgICAvKiBjdHJfcHJlbG9hZFs4OjEzXSA9IFBOWzA6NV0gKi8KKyNlbHNlCisJICBmb3IgKGkgPSA4OyBpIDwgMTQ7IGkrKykKKwkJCWN0cl9wcmVsb2FkW2ldID0gICAgcG5fdmVjdG9yWzEzIC0gaV07ICAgICAgICAgIC8qIGN0cl9wcmVsb2FkWzg6MTNdID0gUE5bNTowXSAqLworI2VuZGlmCisJY3RyX3ByZWxvYWRbMTRdID0gICh1bnNpZ25lZCBjaGFyKSAoYyAvIDI1Nik7IC8vIEN0cgorCWN0cl9wcmVsb2FkWzE1XSA9ICAodW5zaWduZWQgY2hhcikgKGMgJSAyNTYpOworCit9CisKKworLy8KKy8vIFRSVUU6IFN1Y2Nlc3MhCisvLyBGQUxTRTogRGVjcnlwdCBFcnJvciEKKy8vCitCT09MRUFOIFJUTVBTb2Z0RGVjcnlwdFRLSVAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSCXBEYXRhLAorCUlOIFVMT05HCURhdGFCeXRlQ250LAorCUlOIFVDSEFSICAgIFVzZXJQcmlvcml0eSwKKwlJTiBQQ0lQSEVSX0tFWQlwV3BhS2V5KQoreworCVVDSEFSCQkJS2V5SUQ7CisJVUlOVAkJCUhlYWRlckxlbjsKKyAgICBVQ0hBUgkJCWZjMDsKKwlVQ0hBUgkJCWZjMTsKKwlVU0hPUlQJCQlmYzsKKwlVSU5UCQkJZnJhbWVfdHlwZTsKKwlVSU5UCQkJZnJhbWVfc3VidHlwZTsKKyAgICBVSU5UCQkJZnJvbV9kczsKKyAgICBVSU5UCQkJdG9fZHM7CisJSU5UCQkJCWE0X2V4aXN0czsKKwlJTlQJCQkJcWNfZXhpc3RzOworCVVTSE9SVAkJCWR1cmF0aW9uOworCVVTSE9SVAkJCXNlcV9jb250cm9sOworCVVTSE9SVAkJCXFvc19jb250cm9sOworCVVDSEFSCQkJVEFbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUgkJCURBW01BQ19BRERSX0xFTl07CisJVUNIQVIJCQlTQVtNQUNfQUREUl9MRU5dOworCVVDSEFSCQkJUkM0S2V5WzE2XTsKKwlVSU5UCQkJcDFrWzVdOyAvL2ZvciBtaXhfa2V5OworCVVMT05HCQkJcG5sOy8qIExlYXN0IHNpZ25pZmljYW50IDE2IGJpdHMgb2YgUE4gKi8KKwlVTE9ORwkJCXBuaDsvKiBNb3N0IHNpZ25pZmljYW50IDMyIGJpdHMgb2YgUE4gKi8KKwlVSU5UCQkJbnVtX2Jsb2NrczsKKwlVSU5UCQkJcGF5bG9hZF9yZW1haW5kZXI7CisJQVJDRk9VUkNPTlRFWFQgCUFyY0ZvdXJDb250ZXh0OworCVVJTlQJCQljcmMzMiA9IDA7CisJVUlOVAkJCXRyYWlsZmNzID0gMDsKKwlVQ0hBUgkJCU1JQ1s4XTsKKwlVQ0hBUgkJCVRyYWlsTUlDWzhdOworCisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIChQVUNIQVIpcERhdGEsIERJUl9SRUFELCBGQUxTRSk7CisjZW5kaWYKKworCWZjMCA9ICpwRGF0YTsKKwlmYzEgPSAqKHBEYXRhICsgMSk7CisKKwlmYyA9ICooKFBVU0hPUlQpcERhdGEpOworCisJZnJhbWVfdHlwZSA9ICgoZmMwID4+IDIpICYgMHgwMyk7CisJZnJhbWVfc3VidHlwZSA9ICgoZmMwID4+IDQpICYgMHgwZik7CisKKyAgICBmcm9tX2RzID0gKGZjMSAmIDB4MikgPj4gMTsKKyAgICB0b19kcyA9IChmYzEgJiAweDEpOworCisgICAgYTRfZXhpc3RzID0gKGZyb21fZHMgJiB0b19kcyk7CisgICAgcWNfZXhpc3RzID0gKChmcmFtZV9zdWJ0eXBlID09IDB4MDgpIHx8ICAgIC8qIEFzc3VtZWQgUW9TIHN1YnR5cGVzICovCisgICAgICAgICAgICAgICAgICAoZnJhbWVfc3VidHlwZSA9PSAweDA5KSB8fCAgIC8qIExpa2VseSB0byBjaGFuZ2UuICAgICovCisgICAgICAgICAgICAgICAgICAoZnJhbWVfc3VidHlwZSA9PSAweDBhKSB8fAorICAgICAgICAgICAgICAgICAgKGZyYW1lX3N1YnR5cGUgPT0gMHgwYikKKyAgICAgICAgICAgICAgICAgKTsKKworCUhlYWRlckxlbiA9IDI0OworCWlmIChhNF9leGlzdHMpCisJCUhlYWRlckxlbiArPSA2OworCisJS2V5SUQgPSAqKChQVUNIQVIpKHBEYXRhKyBIZWFkZXJMZW4gKyAzKSk7CisJS2V5SUQgPSBLZXlJRCA+PiA2OworCisJaWYgKHBXcGFLZXlbS2V5SURdLktleUxlbiA9PSAwKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNvZnREZWNyeXB0VEtJUCBmYWlsZWQhKEtleUlEWyVkXSBMZW5ndGggY2FuIG5vdCBiZSAwKVxuIiwgS2V5SUQpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWR1cmF0aW9uID0gKigoUFVTSE9SVCkocERhdGErMikpOworCisJc2VxX2NvbnRyb2wgPSAqKChQVVNIT1JUKShwRGF0YSsyMikpOworCisJaWYgKHFjX2V4aXN0cykKKwl7CisJCWlmIChhNF9leGlzdHMpCisJCXsKKwkJCXFvc19jb250cm9sID0gKigoUFVTSE9SVCkocERhdGErMzApKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXFvc19jb250cm9sID0gKigoUFVTSE9SVCkocERhdGErMjQpKTsKKwkJfQorCX0KKworCWlmICh0b19kcyA9PSAwICYmIGZyb21fZHMgPT0gMSkKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KERBLCBwRGF0YSs0LCBNQUNfQUREUl9MRU4pOworCQlOZGlzTW92ZU1lbW9yeShTQSwgcERhdGErMTYsIE1BQ19BRERSX0xFTik7CisJCU5kaXNNb3ZlTWVtb3J5KFRBLCBwRGF0YSsxMCwgTUFDX0FERFJfTEVOKTsgIC8vQlNTSUQKKwl9CisJZWxzZSBpZiAodG9fZHMgPT0gMCAmJiBmcm9tX2RzID09IDAgKQorCXsKKwkJTmRpc01vdmVNZW1vcnkoVEEsIHBEYXRhKzEwLCBNQUNfQUREUl9MRU4pOworCQlOZGlzTW92ZU1lbW9yeShEQSwgcERhdGErNCwgTUFDX0FERFJfTEVOKTsKKwkJTmRpc01vdmVNZW1vcnkoU0EsIHBEYXRhKzEwLCBNQUNfQUREUl9MRU4pOworCX0KKwllbHNlIGlmICh0b19kcyA9PSAxICYmIGZyb21fZHMgPT0gMCkKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KFNBLCBwRGF0YSsxMCwgTUFDX0FERFJfTEVOKTsKKwkJTmRpc01vdmVNZW1vcnkoVEEsIHBEYXRhKzEwLCBNQUNfQUREUl9MRU4pOworCQlOZGlzTW92ZU1lbW9yeShEQSwgcERhdGErMTYsIE1BQ19BRERSX0xFTik7CisJfQorCWVsc2UgaWYgKHRvX2RzID09IDEgJiYgZnJvbV9kcyA9PSAxKQorCXsKKwkJTmRpc01vdmVNZW1vcnkoVEEsIHBEYXRhKzEwLCBNQUNfQUREUl9MRU4pOworCQlOZGlzTW92ZU1lbW9yeShEQSwgcERhdGErMTYsIE1BQ19BRERSX0xFTik7CisJCU5kaXNNb3ZlTWVtb3J5KFNBLCBwRGF0YSsyMiwgTUFDX0FERFJfTEVOKTsKKwl9CisKKwludW1fYmxvY2tzID0gKERhdGFCeXRlQ250IC0gMTYpIC8gMTY7CisJcGF5bG9hZF9yZW1haW5kZXIgPSAoRGF0YUJ5dGVDbnQgLSAxNikgJSAxNjsKKworCXBubCA9ICgqKHBEYXRhICsgSGVhZGVyTGVuKSkgKiAyNTYgKyAqKHBEYXRhICsgSGVhZGVyTGVuICsgMik7CisJcG5oID0gKigoUFVMT05HKShwRGF0YSArIEhlYWRlckxlbiArIDQpKTsKKwlwbmggPSBjcHUybGUzMihwbmgpOworCVJUTVBUa2lwTWl4S2V5KHBXcGFLZXlbS2V5SURdLktleSwgVEEsIHBubCwgcG5oLCBSQzRLZXksIHAxayk7CisKKwlBUkNGT1VSX0lOSVQoJkFyY0ZvdXJDb250ZXh0LCBSQzRLZXksIDE2KTsKKworCUFSQ0ZPVVJfREVDUllQVCgmQXJjRm91ckNvbnRleHQsIHBEYXRhICsgSGVhZGVyTGVuLCBwRGF0YSArIEhlYWRlckxlbiArIDgsIERhdGFCeXRlQ250IC0gSGVhZGVyTGVuIC0gOCk7CisJTmRpc01vdmVNZW1vcnkoJnRyYWlsZmNzLCBwRGF0YSArIERhdGFCeXRlQ250IC0gOCAtIDQsIDQpOworCWNyYzMyID0gUlRNUF9DQUxDX0ZDUzMyKFBQUElOSVRGQ1MzMiwgcERhdGEgKyBIZWFkZXJMZW4sIERhdGFCeXRlQ250IC0gSGVhZGVyTGVuIC0gOCAtIDQpOyAgLy9Ta2lwIElWK0VJViA4IGJ5dGVzICYgU2tpcCBsYXN0IDQgYnl0ZXMoRkNTKS4KKwljcmMzMiBePSAweGZmZmZmZmZmOyAgICAgICAgICAgICAvKiBjb21wbGVtZW50ICovCisKKyAgICBpZihjcmMzMiAhPSBjcHUybGUzMih0cmFpbGZjcykpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU29mdERlY3J5cHRUS0lQLCBXRVAgRGF0YSBJQ1YgRXJyb3IgIVxuIikpOwkgLy9JQ1YgZXJyb3IuCisKKwkJcmV0dXJuIChGQUxTRSk7CisJfQorCisJTmRpc01vdmVNZW1vcnkoVHJhaWxNSUMsIHBEYXRhICsgRGF0YUJ5dGVDbnQgLSA4IC0gOCAtIDQsIDgpOworCVJUTVBJbml0TUlDRW5naW5lKHBBZCwgcFdwYUtleVtLZXlJRF0uS2V5LCBEQSwgU0EsIFVzZXJQcmlvcml0eSwgcFdwYUtleVtLZXlJRF0uUnhNaWMpOworCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwRGF0YSArIEhlYWRlckxlbiwgRGF0YUJ5dGVDbnQgLSBIZWFkZXJMZW4gLSA4IC0gMTIpOworCVJUTVBUa2lwR2V0TUlDKCZwQWQtPlByaXZhdGVJbmZvLlR4KTsKKwlOZGlzTW92ZU1lbW9yeShNSUMsIHBBZC0+UHJpdmF0ZUluZm8uVHguTUlDLCA4KTsKKworCWlmICghTmRpc0VxdWFsTWVtb3J5KE1JQywgVHJhaWxNSUMsIDgpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRNUFNvZnREZWNyeXB0VEtJUCwgV0VQIERhdGEgTUlDIEVycm9yICFcbiIpKTsJIC8vTUlDIGVycm9yLgorCQlyZXR1cm4gKEZBTFNFKTsKKwl9CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUilwRGF0YSwgRElSX1JFQUQsIEZBTFNFKTsKKyNlbmRpZgorCXJldHVybiBUUlVFOworfQorCisKKworCitCT09MRUFOIFJUTVBTb2Z0RGVjcnlwdEFFUygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIJcERhdGEsCisJSU4gVUxPTkcJRGF0YUJ5dGVDbnQsCisJSU4gUENJUEhFUl9LRVkJcFdwYUtleSkKK3sKKwlVQ0hBUgkJCUtleUlEOworCVVJTlQJCQlIZWFkZXJMZW47CisJVUNIQVIJCQlQTls2XTsKKwlVSU5UCQkJcGF5bG9hZF9sZW47CisJVUlOVAkJCW51bV9ibG9ja3M7CisJVUlOVAkJCXBheWxvYWRfcmVtYWluZGVyOworCVVTSE9SVAkJCWZjOworCVVDSEFSCQkJZmMwOworCVVDSEFSCQkJZmMxOworCVVJTlQJCQlmcmFtZV90eXBlOworCVVJTlQJCQlmcmFtZV9zdWJ0eXBlOworCVVJTlQJCQlmcm9tX2RzOworCVVJTlQJCQl0b19kczsKKwlJTlQJCQkJYTRfZXhpc3RzOworCUlOVAkJCQlxY19leGlzdHM7CisJVUNIQVIJCQlhZXNfb3V0WzE2XTsKKwlpbnQgCQkJcGF5bG9hZF9pbmRleDsKKwlVSU5UIAkJCWk7CisJVUNIQVIgCQkJY3RyX3ByZWxvYWRbMTZdOworCVVDSEFSIAkJCWNoYWluX2J1ZmZlclsxNl07CisJVUNIQVIgCQkJcGFkZGVkX2J1ZmZlclsxNl07CisJVUNIQVIgCQkJbWljX2l2WzE2XTsKKwlVQ0hBUiAJCQltaWNfaGVhZGVyMVsxNl07CisJVUNIQVIgCQkJbWljX2hlYWRlcjJbMTZdOworCVVDSEFSCQkJTUlDWzhdOworCVVDSEFSCQkJVHJhaWxNSUNbOF07CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUilwRGF0YSwgRElSX1JFQUQsIEZBTFNFKTsKKyNlbmRpZgorCisJZmMwID0gKnBEYXRhOworCWZjMSA9ICoocERhdGEgKyAxKTsKKworCWZjID0gKigoUFVTSE9SVClwRGF0YSk7CisKKwlmcmFtZV90eXBlID0gKChmYzAgPj4gMikgJiAweDAzKTsKKwlmcmFtZV9zdWJ0eXBlID0gKChmYzAgPj4gNCkgJiAweDBmKTsKKworCWZyb21fZHMgPSAoZmMxICYgMHgyKSA+PiAxOworCXRvX2RzID0gKGZjMSAmIDB4MSk7CisKKwlhNF9leGlzdHMgPSAoZnJvbV9kcyAmIHRvX2RzKTsKKwlxY19leGlzdHMgPSAoKGZyYW1lX3N1YnR5cGUgPT0gMHgwOCkgfHwgICAgLyogQXNzdW1lZCBRb1Mgc3VidHlwZXMgKi8KKwkJCQkgIChmcmFtZV9zdWJ0eXBlID09IDB4MDkpIHx8ICAgLyogTGlrZWx5IHRvIGNoYW5nZS4gICAgKi8KKwkJCQkgIChmcmFtZV9zdWJ0eXBlID09IDB4MGEpIHx8CisJCQkJICAoZnJhbWVfc3VidHlwZSA9PSAweDBiKQorCQkJCSApOworCisJSGVhZGVyTGVuID0gMjQ7CisJaWYgKGE0X2V4aXN0cykKKwkJSGVhZGVyTGVuICs9IDY7CisKKwlLZXlJRCA9ICooKFBVQ0hBUikocERhdGErIEhlYWRlckxlbiArIDMpKTsKKwlLZXlJRCA9IEtleUlEID4+IDY7CisKKwlpZiAocFdwYUtleVtLZXlJRF0uS2V5TGVuID09IDApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU29mdERlY3J5cHRBRVMgZmFpbGVkIShLZXlJRFslZF0gTGVuZ3RoIGNhbiBub3QgYmUgMClcbiIsIEtleUlEKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlQTlswXSA9ICoocERhdGErIEhlYWRlckxlbik7CisJUE5bMV0gPSAqKHBEYXRhKyBIZWFkZXJMZW4gKyAxKTsKKwlQTlsyXSA9ICoocERhdGErIEhlYWRlckxlbiArIDQpOworCVBOWzNdID0gKihwRGF0YSsgSGVhZGVyTGVuICsgNSk7CisJUE5bNF0gPSAqKHBEYXRhKyBIZWFkZXJMZW4gKyA2KTsKKwlQTls1XSA9ICoocERhdGErIEhlYWRlckxlbiArIDcpOworCisJcGF5bG9hZF9sZW4gPSBEYXRhQnl0ZUNudCAtIEhlYWRlckxlbiAtIDggLSA4OwkvLyA4IGJ5dGVzIGZvciBDQ01QIGhlYWRlciAsIDggYnl0ZXMgZm9yIE1JQworCXBheWxvYWRfcmVtYWluZGVyID0gKHBheWxvYWRfbGVuKSAlIDE2OworCW51bV9ibG9ja3MgPSAocGF5bG9hZF9sZW4pIC8gMTY7CisKKworCisJLy8gRmluZCBzdGFydCBvZiBwYXlsb2FkCisJcGF5bG9hZF9pbmRleCA9IEhlYWRlckxlbiArIDg7IC8vSVYrRUlWCisKKwlmb3IgKGk9MDsgaTwgbnVtX2Jsb2NrczsgaSsrKQorCXsKKwkJY29uc3RydWN0X2N0cl9wcmVsb2FkKGN0cl9wcmVsb2FkLAorCQkJCQkJCQlhNF9leGlzdHMsCisJCQkJCQkJCXFjX2V4aXN0cywKKwkJCQkJCQkJcERhdGEsCisJCQkJCQkJCVBOLAorCQkJCQkJCQlpKzEgKTsKKworCQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKKworCQliaXR3aXNlX3hvcihhZXNfb3V0LCBwRGF0YSArIHBheWxvYWRfaW5kZXgsIGNoYWluX2J1ZmZlcik7CisJCU5kaXNNb3ZlTWVtb3J5KHBEYXRhICsgcGF5bG9hZF9pbmRleCAtIDgsIGNoYWluX2J1ZmZlciwgMTYpOworCQlwYXlsb2FkX2luZGV4ICs9IDE2OworCX0KKworCS8vCisJLy8gSWYgdGhlcmUgaXMgYSBzaG9ydCBmaW5hbCBibG9jaywgdGhlbiBwYWQgaXQKKwkvLyBlbmNyeXB0IGl0IGFuZCBjb3B5IHRoZSB1bnBhZGRlZCBwYXJ0IGJhY2sKKwkvLworCWlmIChwYXlsb2FkX3JlbWFpbmRlciA+IDApCisJeworCQljb25zdHJ1Y3RfY3RyX3ByZWxvYWQoY3RyX3ByZWxvYWQsCisJCQkJCQkJCWE0X2V4aXN0cywKKwkJCQkJCQkJcWNfZXhpc3RzLAorCQkJCQkJCQlwRGF0YSwKKwkJCQkJCQkJUE4sCisJCQkJCQkJCW51bV9ibG9ja3MgKyAxKTsKKworCQlOZGlzWmVyb01lbW9yeShwYWRkZWRfYnVmZmVyLCAxNik7CisJCU5kaXNNb3ZlTWVtb3J5KHBhZGRlZF9idWZmZXIsIHBEYXRhICsgcGF5bG9hZF9pbmRleCwgcGF5bG9hZF9yZW1haW5kZXIpOworCisJCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgY3RyX3ByZWxvYWQsIGFlc19vdXQpOworCisJCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBhZGRlZF9idWZmZXIsIGNoYWluX2J1ZmZlcik7CisJCU5kaXNNb3ZlTWVtb3J5KHBEYXRhICsgcGF5bG9hZF9pbmRleCAtIDgsIGNoYWluX2J1ZmZlciwgcGF5bG9hZF9yZW1haW5kZXIpOworCQlwYXlsb2FkX2luZGV4ICs9IHBheWxvYWRfcmVtYWluZGVyOworCX0KKworCS8vCisJLy8gRGVzY3J5cHQgdGhlIE1JQworCS8vCisJY29uc3RydWN0X2N0cl9wcmVsb2FkKGN0cl9wcmVsb2FkLAorCQkJCQkJCWE0X2V4aXN0cywKKwkJCQkJCQlxY19leGlzdHMsCisJCQkJCQkJcERhdGEsCisJCQkJCQkJUE4sCisJCQkJCQkJMCk7CisJTmRpc1plcm9NZW1vcnkocGFkZGVkX2J1ZmZlciwgMTYpOworCU5kaXNNb3ZlTWVtb3J5KHBhZGRlZF9idWZmZXIsIHBEYXRhICsgcGF5bG9hZF9pbmRleCwgOCk7CisKKwlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKKworCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBhZGRlZF9idWZmZXIsIGNoYWluX2J1ZmZlcik7CisKKwlOZGlzTW92ZU1lbW9yeShUcmFpbE1JQywgY2hhaW5fYnVmZmVyLCA4KTsKKworCS8vCisJLy8gQ2FsY3VsYXRlIE1JQworCS8vCisKKwkvL0ZvcmNlIHRoZSBwcm90ZWN0ZWQgZnJhbWUgYml0IG9uCisJKihwRGF0YSArIDEpID0gKihwRGF0YSArIDEpIHwgMHg0MDsKKworCS8vIEZpbmQgc3RhcnQgb2YgcGF5bG9hZAorCS8vIEJlY2F1c2UgdGhlIENDTVAgaGVhZGVyIGhhcyBiZWVuIHJlbW92ZWQKKwlwYXlsb2FkX2luZGV4ID0gSGVhZGVyTGVuOworCisJY29uc3RydWN0X21pY19pdigKKwkJCQkJbWljX2l2LAorCQkJCQlxY19leGlzdHMsCisJCQkJCWE0X2V4aXN0cywKKwkJCQkJcERhdGEsCisJCQkJCXBheWxvYWRfbGVuLAorCQkJCQlQTik7CisKKwljb25zdHJ1Y3RfbWljX2hlYWRlcjEoCisJCQkJCQltaWNfaGVhZGVyMSwKKwkJCQkJCUhlYWRlckxlbiwKKwkJCQkJCXBEYXRhKTsKKworCWNvbnN0cnVjdF9taWNfaGVhZGVyMigKKwkJCQkJCW1pY19oZWFkZXIyLAorCQkJCQkJcERhdGEsCisJCQkJCQlhNF9leGlzdHMsCisJCQkJCQlxY19leGlzdHMpOworCisJYWVzMTI4azEyOGQocFdwYUtleVtLZXlJRF0uS2V5LCBtaWNfaXYsIGFlc19vdXQpOworCWJpdHdpc2VfeG9yKGFlc19vdXQsIG1pY19oZWFkZXIxLCBjaGFpbl9idWZmZXIpOworCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgY2hhaW5fYnVmZmVyLCBhZXNfb3V0KTsKKwliaXR3aXNlX3hvcihhZXNfb3V0LCBtaWNfaGVhZGVyMiwgY2hhaW5fYnVmZmVyKTsKKwlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGNoYWluX2J1ZmZlciwgYWVzX291dCk7CisKKwkvLyBpdGVyYXRlIHRocm91Z2ggZWFjaCAxNiBieXRlIHBheWxvYWQgYmxvY2sKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2Jsb2NrczsgaSsrKQorCXsKKwkJYml0d2lzZV94b3IoYWVzX291dCwgcERhdGEgKyBwYXlsb2FkX2luZGV4LCBjaGFpbl9idWZmZXIpOworCQlwYXlsb2FkX2luZGV4ICs9IDE2OworCQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGNoYWluX2J1ZmZlciwgYWVzX291dCk7CisJfQorCisJLy8gQWRkIG9uIHRoZSBmaW5hbCBwYXlsb2FkIGJsb2NrIGlmIGl0IG5lZWRzIHBhZGRpbmcKKwlpZiAocGF5bG9hZF9yZW1haW5kZXIgPiAwKQorCXsKKwkJTmRpc1plcm9NZW1vcnkocGFkZGVkX2J1ZmZlciwgMTYpOworCQlOZGlzTW92ZU1lbW9yeShwYWRkZWRfYnVmZmVyLCBwRGF0YSArIHBheWxvYWRfaW5kZXgsIHBheWxvYWRfcmVtYWluZGVyKTsKKworCQliaXR3aXNlX3hvcihhZXNfb3V0LCBwYWRkZWRfYnVmZmVyLCBjaGFpbl9idWZmZXIpOworCQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGNoYWluX2J1ZmZlciwgYWVzX291dCk7CisJfQorCS8vIGFlc19vdXQgY29udGFpbnMgcGFkZGVkIG1pYywgZGlzY2FyZCBtb3N0IHNpZ25pZmljYW50CisJLy8gOCBieXRlcyB0byBnZW5lcmF0ZSA2NCBiaXQgTUlDCisJZm9yIChpID0gMCA7IGkgPCA4OyBpKyspIE1JQ1tpXSA9IGFlc19vdXRbaV07CisKKwlpZiAoIU5kaXNFcXVhbE1lbW9yeShNSUMsIFRyYWlsTUlDLCA4KSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBTb2Z0RGVjcnlwdEFFUywgTUlDIEVycm9yICFcbiIpKTsJIC8vTUlDIGVycm9yLgorCQlyZXR1cm4gRkFMU0U7CisJfQorCisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIChQVUNIQVIpcERhdGEsIERJUl9SRUFELCBGQUxTRSk7CisjZW5kaWYKKworCXJldHVybiBUUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGFlczEyOGsxMjhkKCkgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUGVyZm9ybXMgYSAxMjggYml0IEFFUyBlbmNyeXB0IHdpdGggICovCisvKiAxMjggYml0IGRhdGEuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworVk9JRCB4b3JfMTI4KAorCUlOICBQVUNIQVIgIGEsCisJSU4gIFBVQ0hBUiAgYiwKKwlPVVQgUFVDSEFSICBvdXQpCit7CisJSU5UIGk7CisKKwlmb3IgKGk9MDtpPDE2OyBpKyspCisJeworCQlvdXRbaV0gPSBhW2ldIF4gYltpXTsKKwl9Cit9CisKK1ZPSUQgbmV4dF9rZXkoCisJSU4gIFBVQ0hBUiAga2V5LAorCUlOICBJTlQgICAgIHJvdW5kKQoreworCVVDSEFSICAgICAgIHJjb247CisJVUNIQVIgICAgICAgc2JveF9rZXlbNF07CisJVUNIQVIgICAgICAgcmNvbl90YWJsZVsxMl0gPQorCXsKKwkJMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwKKwkJMHgxYiwgMHgzNiwgMHgzNiwgMHgzNgorCX07CisKKwlzYm94X2tleVswXSA9IFJUTVBDa2lwU2JveChrZXlbMTNdKTsKKwlzYm94X2tleVsxXSA9IFJUTVBDa2lwU2JveChrZXlbMTRdKTsKKwlzYm94X2tleVsyXSA9IFJUTVBDa2lwU2JveChrZXlbMTVdKTsKKwlzYm94X2tleVszXSA9IFJUTVBDa2lwU2JveChrZXlbMTJdKTsKKworCXJjb24gPSByY29uX3RhYmxlW3JvdW5kXTsKKworCXhvcl8zMigma2V5WzBdLCBzYm94X2tleSwgJmtleVswXSk7CisJa2V5WzBdID0ga2V5WzBdIF4gcmNvbjsKKworCXhvcl8zMigma2V5WzRdLCAma2V5WzBdLCAma2V5WzRdKTsKKwl4b3JfMzIoJmtleVs4XSwgJmtleVs0XSwgJmtleVs4XSk7CisJeG9yXzMyKCZrZXlbMTJdLCAma2V5WzhdLCAma2V5WzEyXSk7Cit9CisKK1ZPSUQgeG9yXzMyKAorCUlOICBQVUNIQVIgIGEsCisJSU4gIFBVQ0hBUiAgYiwKKwlPVVQgUFVDSEFSICBvdXQpCit7CisJSU5UIGk7CisKKwlmb3IgKGk9MDtpPDQ7IGkrKykKKwl7CisJCW91dFtpXSA9IGFbaV0gXiBiW2ldOworCX0KK30KKworVk9JRCBieXRlX3N1YigKKwlJTiAgUFVDSEFSICBpbiwKKwlPVVQgUFVDSEFSICBvdXQpCit7CisJSU5UIGk7CisKKwlmb3IgKGk9MDsgaTwgMTY7IGkrKykKKwl7CisJCW91dFtpXSA9IFJUTVBDa2lwU2JveChpbltpXSk7CisJfQorfQorCitVQ0hBUiBSVE1QQ2tpcFNib3goCisJSU4gIFVDSEFSICAgYSkKK3sKKwlyZXR1cm4gU2JveFRhYmxlWyhpbnQpYV07Cit9CisKK1ZPSUQgc2hpZnRfcm93KAorCUlOICBQVUNIQVIgIGluLAorCU9VVCBQVUNIQVIgIG91dCkKK3sKKwlvdXRbMF0gPSAgaW5bMF07CisJb3V0WzFdID0gIGluWzVdOworCW91dFsyXSA9ICBpblsxMF07CisJb3V0WzNdID0gIGluWzE1XTsKKwlvdXRbNF0gPSAgaW5bNF07CisJb3V0WzVdID0gIGluWzldOworCW91dFs2XSA9ICBpblsxNF07CisJb3V0WzddID0gIGluWzNdOworCW91dFs4XSA9ICBpbls4XTsKKwlvdXRbOV0gPSAgaW5bMTNdOworCW91dFsxMF0gPSBpblsyXTsKKwlvdXRbMTFdID0gaW5bN107CisJb3V0WzEyXSA9IGluWzEyXTsKKwlvdXRbMTNdID0gaW5bMV07CisJb3V0WzE0XSA9IGluWzZdOworCW91dFsxNV0gPSBpblsxMV07Cit9CisKK1ZPSUQgbWl4X2NvbHVtbigKKwlJTiAgUFVDSEFSICBpbiwKKwlPVVQgUFVDSEFSICBvdXQpCit7CisJSU5UICAgICAgICAgaTsKKwlVQ0hBUiAgICAgICBhZGQxYls0XTsKKwlVQ0hBUiAgICAgICBhZGQxYmY3WzRdOworCVVDSEFSICAgICAgIHJvdGxbNF07CisJVUNIQVIgICAgICAgc3dhcF9oYWxmc1s0XTsKKwlVQ0hBUiAgICAgICBhbmRmN1s0XTsKKwlVQ0hBUiAgICAgICByb3RyWzRdOworCVVDSEFSICAgICAgIHRlbXBbNF07CisJVUNIQVIgICAgICAgdGVtcGJbNF07CisKKwlmb3IgKGk9MCA7IGk8NDsgaSsrKQorCXsKKwkJaWYgKChpbltpXSAmIDB4ODApPT0gMHg4MCkKKwkJCWFkZDFiW2ldID0gMHgxYjsKKwkJZWxzZQorCQkJYWRkMWJbaV0gPSAweDAwOworCX0KKworCXN3YXBfaGFsZnNbMF0gPSBpblsyXTsgICAgLyogU3dhcCBoYWxmcyAqLworCXN3YXBfaGFsZnNbMV0gPSBpblszXTsKKwlzd2FwX2hhbGZzWzJdID0gaW5bMF07CisJc3dhcF9oYWxmc1szXSA9IGluWzFdOworCisJcm90bFswXSA9IGluWzNdOyAgICAgICAgLyogUm90YXRlIGxlZnQgOCBiaXRzICovCisJcm90bFsxXSA9IGluWzBdOworCXJvdGxbMl0gPSBpblsxXTsKKwlyb3RsWzNdID0gaW5bMl07CisKKwlhbmRmN1swXSA9IGluWzBdICYgMHg3ZjsKKwlhbmRmN1sxXSA9IGluWzFdICYgMHg3ZjsKKwlhbmRmN1syXSA9IGluWzJdICYgMHg3ZjsKKwlhbmRmN1szXSA9IGluWzNdICYgMHg3ZjsKKworCWZvciAoaSA9IDM7IGk+MDsgaS0tKSAgICAvKiBsb2dpY2FsIHNoaWZ0IGxlZnQgMSBiaXQgKi8KKwl7CisJCWFuZGY3W2ldID0gYW5kZjdbaV0gPDwgMTsKKwkJaWYgKChhbmRmN1tpLTFdICYgMHg4MCkgPT0gMHg4MCkKKwkJeworCQkJYW5kZjdbaV0gPSAoYW5kZjdbaV0gfCAweDAxKTsKKwkJfQorCX0KKwlhbmRmN1swXSA9IGFuZGY3WzBdIDw8IDE7CisJYW5kZjdbMF0gPSBhbmRmN1swXSAmIDB4ZmU7CisKKwl4b3JfMzIoYWRkMWIsIGFuZGY3LCBhZGQxYmY3KTsKKworCXhvcl8zMihpbiwgYWRkMWJmNywgcm90cik7CisKKwl0ZW1wWzBdID0gcm90clswXTsgICAgICAgICAvKiBSb3RhdGUgcmlnaHQgOCBiaXRzICovCisJcm90clswXSA9IHJvdHJbMV07CisJcm90clsxXSA9IHJvdHJbMl07CisJcm90clsyXSA9IHJvdHJbM107CisJcm90clszXSA9IHRlbXBbMF07CisKKwl4b3JfMzIoYWRkMWJmNywgcm90ciwgdGVtcCk7CisJeG9yXzMyKHN3YXBfaGFsZnMsIHJvdGwsdGVtcGIpOworCXhvcl8zMih0ZW1wLCB0ZW1wYiwgb3V0KTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRtcF93ZXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfd2VwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZlMjZjMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfd2VwLmMKQEAgLTAsMCArMSw0OTkgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJcnRtcF93ZXAuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVBhdWwgV3UJCTEwLTI4LTAyCQlJbml0aWFsCisqLworCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKK1VJTlQgRkNTVEFCXzMyWzI1Nl0gPQoreworCTB4MDAwMDAwMDAsIDB4NzcwNzMwOTYsIDB4ZWUwZTYxMmMsIDB4OTkwOTUxYmEsCisJMHgwNzZkYzQxOSwgMHg3MDZhZjQ4ZiwgMHhlOTYzYTUzNSwgMHg5ZTY0OTVhMywKKwkweDBlZGI4ODMyLCAweDc5ZGNiOGE0LCAweGUwZDVlOTFlLCAweDk3ZDJkOTg4LAorCTB4MDliNjRjMmIsIDB4N2ViMTdjYmQsIDB4ZTdiODJkMDcsIDB4OTBiZjFkOTEsCisJMHgxZGI3MTA2NCwgMHg2YWIwMjBmMiwgMHhmM2I5NzE0OCwgMHg4NGJlNDFkZSwKKwkweDFhZGFkNDdkLCAweDZkZGRlNGViLCAweGY0ZDRiNTUxLCAweDgzZDM4NWM3LAorCTB4MTM2Yzk4NTYsIDB4NjQ2YmE4YzAsIDB4ZmQ2MmY5N2EsIDB4OGE2NWM5ZWMsCisJMHgxNDAxNWM0ZiwgMHg2MzA2NmNkOSwgMHhmYTBmM2Q2MywgMHg4ZDA4MGRmNSwKKwkweDNiNmUyMGM4LCAweDRjNjkxMDVlLCAweGQ1NjA0MWU0LCAweGEyNjc3MTcyLAorCTB4M2MwM2U0ZDEsIDB4NGIwNGQ0NDcsIDB4ZDIwZDg1ZmQsIDB4YTUwYWI1NmIsCisJMHgzNWI1YThmYSwgMHg0MmIyOTg2YywgMHhkYmJiYzlkNiwgMHhhY2JjZjk0MCwKKwkweDMyZDg2Y2UzLCAweDQ1ZGY1Yzc1LCAweGRjZDYwZGNmLCAweGFiZDEzZDU5LAorCTB4MjZkOTMwYWMsIDB4NTFkZTAwM2EsIDB4YzhkNzUxODAsIDB4YmZkMDYxMTYsCisJMHgyMWI0ZjRiNSwgMHg1NmIzYzQyMywgMHhjZmJhOTU5OSwgMHhiOGJkYTUwZiwKKwkweDI4MDJiODllLCAweDVmMDU4ODA4LCAweGM2MGNkOWIyLCAweGIxMGJlOTI0LAorCTB4MmY2ZjdjODcsIDB4NTg2ODRjMTEsIDB4YzE2MTFkYWIsIDB4YjY2NjJkM2QsCisJMHg3NmRjNDE5MCwgMHgwMWRiNzEwNiwgMHg5OGQyMjBiYywgMHhlZmQ1MTAyYSwKKwkweDcxYjE4NTg5LCAweDA2YjZiNTFmLCAweDlmYmZlNGE1LCAweGU4YjhkNDMzLAorCTB4NzgwN2M5YTIsIDB4MGYwMGY5MzQsIDB4OTYwOWE4OGUsIDB4ZTEwZTk4MTgsCisJMHg3ZjZhMGRiYiwgMHgwODZkM2QyZCwgMHg5MTY0NmM5NywgMHhlNjYzNWMwMSwKKwkweDZiNmI1MWY0LCAweDFjNmM2MTYyLCAweDg1NjUzMGQ4LCAweGYyNjIwMDRlLAorCTB4NmMwNjk1ZWQsIDB4MWIwMWE1N2IsIDB4ODIwOGY0YzEsIDB4ZjUwZmM0NTcsCisJMHg2NWIwZDljNiwgMHgxMmI3ZTk1MCwgMHg4YmJlYjhlYSwgMHhmY2I5ODg3YywKKwkweDYyZGQxZGRmLCAweDE1ZGEyZDQ5LCAweDhjZDM3Y2YzLCAweGZiZDQ0YzY1LAorCTB4NGRiMjYxNTgsIDB4M2FiNTUxY2UsIDB4YTNiYzAwNzQsIDB4ZDRiYjMwZTIsCisJMHg0YWRmYTU0MSwgMHgzZGQ4OTVkNywgMHhhNGQxYzQ2ZCwgMHhkM2Q2ZjRmYiwKKwkweDQzNjllOTZhLCAweDM0NmVkOWZjLCAweGFkNjc4ODQ2LCAweGRhNjBiOGQwLAorCTB4NDQwNDJkNzMsIDB4MzMwMzFkZTUsIDB4YWEwYTRjNWYsIDB4ZGQwZDdjYzksCisJMHg1MDA1NzEzYywgMHgyNzAyNDFhYSwgMHhiZTBiMTAxMCwgMHhjOTBjMjA4NiwKKwkweDU3NjhiNTI1LCAweDIwNmY4NWIzLCAweGI5NjZkNDA5LCAweGNlNjFlNDlmLAorCTB4NWVkZWY5MGUsIDB4MjlkOWM5OTgsIDB4YjBkMDk4MjIsIDB4YzdkN2E4YjQsCisJMHg1OWIzM2QxNywgMHgyZWI0MGQ4MSwgMHhiN2JkNWMzYiwgMHhjMGJhNmNhZCwKKwkweGVkYjg4MzIwLCAweDlhYmZiM2I2LCAweDAzYjZlMjBjLCAweDc0YjFkMjlhLAorCTB4ZWFkNTQ3MzksIDB4OWRkMjc3YWYsIDB4MDRkYjI2MTUsIDB4NzNkYzE2ODMsCisJMHhlMzYzMGIxMiwgMHg5NDY0M2I4NCwgMHgwZDZkNmEzZSwgMHg3YTZhNWFhOCwKKwkweGU0MGVjZjBiLCAweDkzMDlmZjlkLCAweDBhMDBhZTI3LCAweDdkMDc5ZWIxLAorCTB4ZjAwZjkzNDQsIDB4ODcwOGEzZDIsIDB4MWUwMWYyNjgsIDB4NjkwNmMyZmUsCisJMHhmNzYyNTc1ZCwgMHg4MDY1NjdjYiwgMHgxOTZjMzY3MSwgMHg2ZTZiMDZlNywKKwkweGZlZDQxYjc2LCAweDg5ZDMyYmUwLCAweDEwZGE3YTVhLCAweDY3ZGQ0YWNjLAorCTB4ZjliOWRmNmYsIDB4OGViZWVmZjksIDB4MTdiN2JlNDMsIDB4NjBiMDhlZDUsCisJMHhkNmQ2YTNlOCwgMHhhMWQxOTM3ZSwgMHgzOGQ4YzJjNCwgMHg0ZmRmZjI1MiwKKwkweGQxYmI2N2YxLCAweGE2YmM1NzY3LCAweDNmYjUwNmRkLCAweDQ4YjIzNjRiLAorCTB4ZDgwZDJiZGEsIDB4YWYwYTFiNGMsIDB4MzYwMzRhZjYsIDB4NDEwNDdhNjAsCisJMHhkZjYwZWZjMywgMHhhODY3ZGY1NSwgMHgzMTZlOGVlZiwgMHg0NjY5YmU3OSwKKwkweGNiNjFiMzhjLCAweGJjNjY4MzFhLCAweDI1NmZkMmEwLCAweDUyNjhlMjM2LAorCTB4Y2MwYzc3OTUsIDB4YmIwYjQ3MDMsIDB4MjIwMjE2YjksIDB4NTUwNTI2MmYsCisJMHhjNWJhM2JiZSwgMHhiMmJkMGIyOCwgMHgyYmI0NWE5MiwgMHg1Y2IzNmEwNCwKKwkweGMyZDdmZmE3LCAweGI1ZDBjZjMxLCAweDJjZDk5ZThiLCAweDViZGVhZTFkLAorCTB4OWI2NGMyYjAsIDB4ZWM2M2YyMjYsIDB4NzU2YWEzOWMsIDB4MDI2ZDkzMGEsCisJMHg5YzA5MDZhOSwgMHhlYjBlMzYzZiwgMHg3MjA3Njc4NSwgMHgwNTAwNTcxMywKKwkweDk1YmY0YTgyLCAweGUyYjg3YTE0LCAweDdiYjEyYmFlLCAweDBjYjYxYjM4LAorCTB4OTJkMjhlOWIsIDB4ZTVkNWJlMGQsIDB4N2NkY2VmYjcsIDB4MGJkYmRmMjEsCisJMHg4NmQzZDJkNCwgMHhmMWQ0ZTI0MiwgMHg2OGRkYjNmOCwgMHgxZmRhODM2ZSwKKwkweDgxYmUxNmNkLCAweGY2YjkyNjViLCAweDZmYjA3N2UxLCAweDE4Yjc0Nzc3LAorCTB4ODgwODVhZTYsIDB4ZmYwZjZhNzAsIDB4NjYwNjNiY2EsIDB4MTEwMTBiNWMsCisJMHg4ZjY1OWVmZiwgMHhmODYyYWU2OSwgMHg2MTZiZmZkMywgMHgxNjZjY2Y0NSwKKwkweGEwMGFlMjc4LCAweGQ3MGRkMmVlLCAweDRlMDQ4MzU0LCAweDM5MDNiM2MyLAorCTB4YTc2NzI2NjEsIDB4ZDA2MDE2ZjcsIDB4NDk2OTQ3NGQsIDB4M2U2ZTc3ZGIsCisJMHhhZWQxNmE0YSwgMHhkOWQ2NWFkYywgMHg0MGRmMGI2NiwgMHgzN2Q4M2JmMCwKKwkweGE5YmNhZTUzLCAweGRlYmI5ZWM1LCAweDQ3YjJjZjdmLCAweDMwYjVmZmU5LAorCTB4YmRiZGYyMWMsIDB4Y2FiYWMyOGEsIDB4NTNiMzkzMzAsIDB4MjRiNGEzYTYsCisJMHhiYWQwMzYwNSwgMHhjZGQ3MDY5MywgMHg1NGRlNTcyOSwgMHgyM2Q5NjdiZiwKKwkweGIzNjY3YTJlLCAweGM0NjE0YWI4LCAweDVkNjgxYjAyLCAweDJhNmYyYjk0LAorCTB4YjQwYmJlMzcsIDB4YzMwYzhlYTEsIDB4NWEwNWRmMWIsIDB4MmQwMmVmOGQKK307CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlJbml0IFdFUCBmdW5jdGlvbi4KKworCUFyZ3VtZW50czoKKyAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwS2V5ICAgICAgICBQb2ludGVyIHRvIHRoZSBXRVAgS0VZCisJCUtleUlkCQkgICBXRVAgS2V5IElECisJCUtleUxlbiAgICAgIHRoZSBsZW5ndGggb2YgV0VQIEtFWQorCQlwRGVzdCAgICAgICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiB3aGljaCBFbmNyeXB0aW9uIGRhdGEgd2lsbCBzdG9yZSBpbi4KKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QSW5pdFdlcEVuZ2luZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwS2V5LAorCUlOCVVDSEFSCQkJS2V5SWQsCisJSU4JVUNIQVIJCQlLZXlMZW4sCisJSU4gT1VUCVBVQ0hBUgkJcERlc3QpCit7CisJVUlOVCBpOworCVVDSEFSICAgV0VQS0VZW10gPSB7CisJCS8vSVYKKwkJMHgwMCwgMHgxMSwgMHgyMiwKKwkJLy9XRVAgS0VZCisJCTB4MDAsIDB4MTEsIDB4MjIsIDB4MzMsIDB4NDQsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0MKKwl9OworCisJcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiA9IFBQUElOSVRGQ1MzMjsgICAvL0luaXQgY3JjMzIuCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyAgICBpZiAocEFkLT5TdGFDZmcuYkNraXBPbiAmJiAocEFkLT5TdGFDZmcuQ2tpcEZsYWcgJiAweDEwKSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCisgICAgeworICAgICAgICBBUkNGT1VSX0lOSVQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgcEtleSwgS2V5TGVuKTsgIC8vSU5JVCBTQk9YLCBLRVlMRU4rMyhJVikKKyAgICAgICAgTmRpc01vdmVNZW1vcnkocERlc3QsIHBLZXksIDMpOyAgLy9BcHBlbmQgSW5pdCBWZWN0b3IKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworICAgIHsKKwkJTmRpc01vdmVNZW1vcnkoV0VQS0VZICsgMywgcEtleSwgS2V5TGVuKTsKKworICAgICAgICBmb3IoaSA9IDA7IGkgPCAzOyBpKyspCisJCQlXRVBLRVlbaV0gPSBSYW5kb21CeXRlKHBBZCk7ICAgLy9DYWxsIG1sbWUgUmFuZG9tQnl0ZSgpIGZ1bmN0aW9uLgorCQlBUkNGT1VSX0lOSVQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgV0VQS0VZLCBLZXlMZW4gKyAzKTsgIC8vSU5JVCBTQk9YLCBLRVlMRU4rMyhJVikKKworCQlOZGlzTW92ZU1lbW9yeShwRGVzdCwgV0VQS0VZLCAzKTsgIC8vQXBwZW5kIEluaXQgVmVjdG9yCisgICAgfQorCSoocERlc3QrMykgPSAoS2V5SWQgPDwgNik7ICAgICAgIC8vQXBwZW5kIEtFWUlECisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUVuY3J5cHQgdHJhbnNpbWl0dGVkIGRhdGEKKworCUFyZ3VtZW50czoKKyAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorICAgICAgcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgdHJhbnNpbWl0dGVkIHNvdXJjZSBkYXRhIHRoYXQgd2lsbCBiZSBlbmNyeXB0CisgICAgICBwRGVzdCAgICAgICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiB3aGVyZSBlbnRyeXB0aW9uIGRhdGEgd2lsbCBiZSBzdG9yZSBpbi4KKyAgICAgIExlbgkJCUluZGljYXRlIHRoZSBsZW5ndGggb2YgdGhlIHNvdXJjZSBkYXRhCisKKwlSZXR1cm4gVmFsdWU6CisgICAgICBOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBFbmNyeXB0RGF0YSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwU3JjLAorCUlOCVBVQ0hBUgkJCXBEZXN0LAorCUlOCVVJTlQJCQlMZW4pCit7CisJcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiA9IFJUTVBfQ0FMQ19GQ1MzMihwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyLCBwU3JjLCBMZW4pOworCUFSQ0ZPVVJfRU5DUllQVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBwRGVzdCwgcFNyYywgTGVuKTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJRGVjcnlwdCByZWNlaXZlZCBXRVAgZGF0YQorCisJQXJndW1lbnRzOgorCQlwQWRhcHRlcgkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSByZWNlaXZlZCBkYXRhCisJCUxlbiAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIHJlY2VpdmVkIGRhdGEKKworCVJldHVybiBWYWx1ZToKKwkJVFJVRSAgICAgICAgRGVjcnlwdCBXRVAgZGF0YSBzdWNjZXNzCisJCUZBTFNFICAgICAgIERlY3J5cHQgV0VQIGRhdGEgZmFpbGVkCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTglSVE1QU29mdERlY3J5cHRXRVAoCisJSU4gUFJUTVBfQURBUFRFUiAJcEFkLAorCUlOIFBVQ0hBUgkJCXBEYXRhLAorCUlOIFVMT05HCQkJRGF0YUJ5dGVDbnQsCisJSU4gUENJUEhFUl9LRVkJCXBHcm91cEtleSkKK3sKKwlVSU5UCXRyYWlsZmNzOworCVVJTlQgICAgY3JjMzI7CisJVUNIQVIJS2V5SWR4OworCVVDSEFSICAgV0VQS0VZW10gPSB7CisJCS8vSVYKKwkJMHgwMCwgMHgxMSwgMHgyMiwKKwkJLy9XRVAgS0VZCisJCTB4MDAsIDB4MTEsIDB4MjIsIDB4MzMsIDB4NDQsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0MKKwl9OworCVVDSEFSIAkqcFBheWxvYWQgPSAoVUNIQVIgKilwRGF0YSArIExFTkdUSF84MDJfMTE7CisJVUxPTkcJcGF5bG9hZF9sZW4gPSBEYXRhQnl0ZUNudCAtIExFTkdUSF84MDJfMTE7CisKKwlOZGlzTW92ZU1lbW9yeShXRVBLRVksIHBQYXlsb2FkLCAzKTsgICAgLy9HZXQgV0VQIElWCisKKwlLZXlJZHggPSAoKihwUGF5bG9hZCArIDMpICYgMHhjMCkgPj4gNjsKKwlpZiAocEdyb3VwS2V5W0tleUlkeF0uS2V5TGVuID09IDApCisJCXJldHVybiAoRkFMU0UpOworCisJTmRpc01vdmVNZW1vcnkoV0VQS0VZICsgMywgcEdyb3VwS2V5W0tleUlkeF0uS2V5LCBwR3JvdXBLZXlbS2V5SWR4XS5LZXlMZW4pOworCUFSQ0ZPVVJfSU5JVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBXRVBLRVksIHBHcm91cEtleVtLZXlJZHhdLktleUxlbiArIDMpOworCUFSQ0ZPVVJfREVDUllQVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBwUGF5bG9hZCwgcFBheWxvYWQgKyA0LCBwYXlsb2FkX2xlbiAtIDQpOworCU5kaXNNb3ZlTWVtb3J5KCZ0cmFpbGZjcywgcFBheWxvYWQgKyBwYXlsb2FkX2xlbiAtIDgsIDQpOworCWNyYzMyID0gUlRNUF9DQUxDX0ZDUzMyKFBQUElOSVRGQ1MzMiwgcFBheWxvYWQsIHBheWxvYWRfbGVuIC0gOCk7ICAvL1NraXAgbGFzdCA0IGJ5dGVzKEZDUykuCisJY3JjMzIgXj0gMHhmZmZmZmZmZjsgICAgICAgICAgICAgLyogY29tcGxlbWVudCAqLworCisgICAgaWYoY3JjMzIgIT0gY3B1MmxlMzIodHJhaWxmY3MpKQorICAgIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISBXRVAgRGF0YSBDUkMgRXJyb3IgIVxuIikpOwkgLy9DUkMgZXJyb3IuCisJCXJldHVybiAoRkFMU0UpOworCX0KKwlyZXR1cm4gKFRSVUUpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJVGhlIFN0cmVhbSBDaXBoZXIgRW5jcnlwdGlvbiBBbGdvcml0aG0gIkFSQ0ZPVVIiIGluaXRpYWxpemUKKworCUFyZ3VtZW50czoKKwkgICBDdHggICAgICAgICBQb2ludGVyIHRvIEFSQ0ZPVVIgQ09OVEVYVCAoU0JPWCkKKwkJcEtleSAgICAgICAgUG9pbnRlciB0byB0aGUgV0VQIEtFWQorCQlLZXlMZW4gICAgICBJbmRpY2F0ZSB0aGUgbGVuZ3RoIGZvIHRoZSBXRVAgS0VZCisKKwlSZXR1cm4gVmFsdWU6CisJICAgTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlBUkNGT1VSX0lOSVQoCisJSU4JUEFSQ0ZPVVJDT05URVhUCUN0eCwKKwlJTglQVUNIQVIJCQlwS2V5LAorCUlOCVVJTlQJCQlLZXlMZW4pCit7CisJVUNIQVIJdCwgdTsKKwlVSU5UCWtleWluZGV4OworCVVJTlQJc3RhdGVpbmRleDsKKwlQVUNIQVIJc3RhdGU7CisJVUlOVAljb3VudGVyOworCisJc3RhdGUgPSBDdHgtPlNUQVRFOworCUN0eC0+WCA9IDA7CisJQ3R4LT5ZID0gMDsKKwlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgMjU2OyBjb3VudGVyKyspCisJCXN0YXRlW2NvdW50ZXJdID0gKFVDSEFSKWNvdW50ZXI7CisJa2V5aW5kZXggPSAwOworCXN0YXRlaW5kZXggPSAwOworCWZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCAyNTY7IGNvdW50ZXIrKykKKwl7CisJCXQgPSBzdGF0ZVtjb3VudGVyXTsKKwkJc3RhdGVpbmRleCA9IChzdGF0ZWluZGV4ICsgcEtleVtrZXlpbmRleF0gKyB0KSAmIDB4ZmY7CisJCXUgPSBzdGF0ZVtzdGF0ZWluZGV4XTsKKwkJc3RhdGVbc3RhdGVpbmRleF0gPSB0OworCQlzdGF0ZVtjb3VudGVyXSA9IHU7CisJCWlmICgrK2tleWluZGV4ID49IEtleUxlbikKKwkJCWtleWluZGV4ID0gMDsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlHZXQgYnl0ZXMgZnJvbSBBUkNGT1VSIENPTlRFWFQgKFMtQk9YKQorCisJQXJndW1lbnRzOgorCSAgIEN0eCAgICAgICAgIFBvaW50ZXIgdG8gQVJDRk9VUiBDT05URVhUIChTQk9YKQorCisJUmV0dXJuIFZhbHVlOgorCSAgIFVDSEFSICAtIHRoZSB2YWx1ZSBvZiB0aGUgQVJDRk9VUiBDT05URVhUIChTLUJPWCkKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitVQ0hBUglBUkNGT1VSX0JZVEUoCisJSU4JUEFSQ0ZPVVJDT05URVhUCQlDdHgpCit7CisgIFVJTlQgeDsKKyAgVUlOVCB5OworICBVQ0hBUiBzeCwgc3k7CisgIFBVQ0hBUiBzdGF0ZTsKKworICBzdGF0ZSA9IEN0eC0+U1RBVEU7CisgIHggPSAoQ3R4LT5YICsgMSkgJiAweGZmOworICBzeCA9IHN0YXRlW3hdOworICB5ID0gKHN4ICsgQ3R4LT5ZKSAmIDB4ZmY7CisgIHN5ID0gc3RhdGVbeV07CisgIEN0eC0+WCA9IHg7CisgIEN0eC0+WSA9IHk7CisgIHN0YXRlW3ldID0gc3g7CisgIHN0YXRlW3hdID0gc3k7CisKKyAgcmV0dXJuKHN0YXRlWyhzeCArIHN5KSAmIDB4ZmZdKTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJVGhlIFN0cmVhbSBDaXBoZXIgRGVjcnlwdGlvbiBBbGdvcml0aG0KKworCUFyZ3VtZW50czoKKwkJQ3R4ICAgICAgICAgUG9pbnRlciB0byBBUkNGT1VSIENPTlRFWFQgKFNCT1gpCisJCXBEZXN0CQkJUG9pbnRlciB0byB0aGUgRGVzdGluYXRpb24KKwkJcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgU291cmNlIGRhdGEKKwkJTGVuICAgICAgICAgSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgU291cmNlIGRhdGEKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQVJDRk9VUl9ERUNSWVBUKAorCUlOCVBBUkNGT1VSQ09OVEVYVAlDdHgsCisJSU4JUFVDSEFSCQkJcERlc3QsCisJSU4JUFVDSEFSCQkJcFNyYywKKwlJTglVSU5UCQkJTGVuKQoreworCVVJTlQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBMZW47IGkrKykKKwkJcERlc3RbaV0gPSBwU3JjW2ldIF4gQVJDRk9VUl9CWVRFKEN0eCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlUaGUgU3RyZWFtIENpcGhlciBFbmNyeXB0aW9uIEFsZ29yaXRobQorCisJQXJndW1lbnRzOgorCQlDdHggICAgICAgICBQb2ludGVyIHRvIEFSQ0ZPVVIgQ09OVEVYVCAoU0JPWCkKKwkJcERlc3QJCQlQb2ludGVyIHRvIHRoZSBEZXN0aW5hdGlvbgorCQlwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSBTb3VyY2UgZGF0YQorCQlMZW4gICAgICAgICBJbmRpY2F0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBTb3VyY2UgZHRhCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQVJDRk9VUl9FTkNSWVBUKAorCUlOCVBBUkNGT1VSQ09OVEVYVAlDdHgsCisJSU4JUFVDSEFSCQkJcERlc3QsCisJSU4JUFVDSEFSCQkJcFNyYywKKwlJTglVSU5UCQkJTGVuKQoreworCVVJTlQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBMZW47IGkrKykKKwkJcERlc3RbaV0gPSBwU3JjW2ldIF4gQVJDRk9VUl9CWVRFKEN0eCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlUaGUgU3RyZWFtIENpcGhlciBFbmNyeXB0aW9uIEFsZ29yaXRobSB3aGljaCBjb25mb3JtIHRvIHRoZSBzcGVjaWFsIHJlcXVpcmVtZW50IHRvIGVuY3J5cHQgIEdUSy4KKworCUFyZ3VtZW50czoKKwkJQ3R4ICAgICAgICAgUG9pbnRlciB0byBBUkNGT1VSIENPTlRFWFQgKFNCT1gpCisJCXBEZXN0CQkJUG9pbnRlciB0byB0aGUgRGVzdGluYXRpb24KKwkJcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgU291cmNlIGRhdGEKKwkJTGVuICAgICAgICAgSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgU291cmNlIGR0YQorCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKK1ZPSUQJV1BBQVJDRk9VUl9FTkNSWVBUKAorCUlOCVBBUkNGT1VSQ09OVEVYVAlDdHgsCisJSU4JUFVDSEFSCQkJcERlc3QsCisJSU4JUFVDSEFSCQkJcFNyYywKKwlJTglVSU5UCQkJTGVuKQoreworCVVJTlQgaTsKKyAgICAgICAgLy9kaXNjYXJkIGZpcnN0IDI1NiBieXRlcworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICAgICAgICAgIEFSQ0ZPVVJfQllURShDdHgpOworCisJZm9yIChpID0gMDsgaSA8IExlbjsgaSsrKQorCQlwRGVzdFtpXSA9IHBTcmNbaV0gXiBBUkNGT1VSX0JZVEUoQ3R4KTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJQ2FsY3VsYXRlIGEgbmV3IEZDUyBnaXZlbiB0aGUgY3VycmVudCBGQ1MgYW5kIHRoZSBuZXcgZGF0YS4KKworCUFyZ3VtZW50czoKKwkJRmNzCSAgICAgIHRoZSBvcmlnaW5hbCBGQ1MgdmFsdWUKKwkJQ3AgICAgICAgICAgcG9pbnRlciB0byB0aGUgZGF0YSB3aGljaCB3aWxsIGJlIGNhbGN1bGF0ZSB0aGUgRkNTCisJCUxlbiAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEKKworCVJldHVybiBWYWx1ZToKKwkJVUlOVCAtIEZDUyAzMiBiaXRzCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitVSU5UCVJUTVBfQ0FMQ19GQ1MzMigKKwlJTglVSU5UCUZjcywKKwlJTglQVUNIQVIJQ3AsCisJSU4JSU5UCQlMZW4pCit7CisJd2hpbGUgKExlbi0tKQorCSAgIEZjcyA9ICgoKEZjcykgPj4gOCkgXiBGQ1NUQUJfMzJbKChGY3MpIF4gKCpDcCsrKSkgJiAweGZmXSk7CisKKwlyZXR1cm4gKEZjcyk7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUdldCBsYXN0IEZDUyBhbmQgZW5jcnlwdCBpdCB0byB0aGUgZGVzdGluYXRpb24KKworCUFyZ3VtZW50czoKKwkJcERlc3QJCQlQb2ludGVyIHRvIHRoZSBEZXN0aW5hdGlvbgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QU2V0SUNWKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUglwRGVzdCkKK3sKKwlwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyIF49IDB4ZmZmZmZmZmY7ICAgICAgICAgICAgIC8qIGNvbXBsZW1lbnQgKi8KKwlwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyID0gY3B1MmxlMzIocEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMik7CisKKwlBUkNGT1VSX0VOQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgcERlc3QsIChQVUNIQVIpICZwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyLCA0KTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vc3BlY3RydW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3NwZWN0cnVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI2NWE2ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3NwZWN0cnVtLmMKQEAgLTAsMCArMSwxODc3IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCisgICAgTW9kdWxlIE5hbWU6CisJYWN0aW9uLmMKKworICAgIEFic3RyYWN0OgorICAgIEhhbmRsZSBhc3NvY2lhdGlvbiByZWxhdGVkIHJlcXVlc3RzIGVpdGhlciBmcm9tIFdTVEEgb3IgZnJvbSBsb2NhbCBNTE1FCisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJRm9uY2hpIFd1ICAgIDIwMDgJICAJICAgY3JlYXRlZCBmb3IgODAyLjExaAorICovCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKyNpbmNsdWRlICJhY3Rpb24uaCIKKworVk9JRCBNZWFzdXJlUmVxVGFiSW5pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOworCisJcEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWIgPSBrbWFsbG9jKHNpemVvZihNRUFTVVJFX1JFUV9UQUIpLCBHRlBfQVRPTUlDKTsKKwlpZiAocEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWIpCisJCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiLCBzaXplb2YoTUVBU1VSRV9SRVFfVEFCKSk7CisJZWxzZQorCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyBGYWlsIHRvIGFsbG9jIG1lbW9yeSBmb3IgcEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWIuXG4iLCBfX2Z1bmNfXykpOworCisJcmV0dXJuOworfQorCitWT0lEIE1lYXN1cmVSZXFUYWJFeGl0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCU5kaXNGcmVlU3BpbkxvY2socEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOworCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiKQorCQlrZnJlZShwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYik7CisJcEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWIgPSBOVUxMOworCisJcmV0dXJuOworfQorCitzdGF0aWMgUE1FQVNVUkVfUkVRX0VOVFJZIE1lYXN1cmVSZXFMb29rVXAoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVUlOVDgJCQlEaWFsb2dUb2tlbikKK3sKKwlVSU5UIEhhc2hJZHg7CisJUE1FQVNVUkVfUkVRX1RBQiBwVGFiID0gcEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWI7CisJUE1FQVNVUkVfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEw7CisJUE1FQVNVUkVfUkVRX0VOVFJZIHBQcmV2RW50cnkgPSBOVUxMOworCisJaWYgKHBUYWIgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwTWVhc3VyZVJlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19mdW5jX18pKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJUlRNUF9TRU1fTE9DSygmcEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOworCisJSGFzaElkeCA9IE1RX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgoRGlhbG9nVG9rZW4pOworCXBFbnRyeSA9IHBUYWItPkhhc2hbSGFzaElkeF07CisKKwl3aGlsZSAocEVudHJ5KQorCXsKKwkJaWYgKHBFbnRyeS0+RGlhbG9nVG9rZW4gPT0gRGlhbG9nVG9rZW4pCisJCQlicmVhazsKKwkJZWxzZQorCQl7CisJCQlwUHJldkVudHJ5ID0gcEVudHJ5OworCQkJcEVudHJ5ID0gcEVudHJ5LT5wTmV4dDsKKwkJfQorCX0KKworCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOworCisJcmV0dXJuIHBFbnRyeTsKK30KKworc3RhdGljIFBNRUFTVVJFX1JFUV9FTlRSWSBNZWFzdXJlUmVxSW5zZXJ0KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVJTlQ4CQkJRGlhbG9nVG9rZW4pCit7CisJSU5UIGk7CisJVUxPTkcgSGFzaElkeDsKKwlQTUVBU1VSRV9SRVFfVEFCIHBUYWIgPSBwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYjsKKwlQTUVBU1VSRV9SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTCwgcEN1cnJFbnRyeTsKKwlVTE9ORyBOb3c7CisKKwlpZihwVGFiID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcE1lYXN1cmVSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fZnVuY19fKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCXBFbnRyeSA9IE1lYXN1cmVSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbik7CisJaWYgKHBFbnRyeSA9PSBOVUxMKQorCXsKKwkJUlRNUF9TRU1fTE9DSygmcEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX01FQVNVUkVfUkVRX1RBQl9TSVpFOyBpKyspCisJCXsKKwkJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7CisJCQlwRW50cnkgPSAmcFRhYi0+Q29udGVudFtpXTsKKworCQkJaWYgKChwRW50cnktPlZhbGlkID09IFRSVUUpCisJCQkJJiYgUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdywgKHVuc2lnbmVkIGxvbmcpKHBFbnRyeS0+bGFzdFRpbWUgKyBNUV9SRVFfQUdFX09VVCkpKQorCQkJeworCQkJCVBNRUFTVVJFX1JFUV9FTlRSWSBwUHJldkVudHJ5ID0gTlVMTDsKKwkJCQlVTE9ORyBIYXNoSWR4ID0gTVFfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChwRW50cnktPkRpYWxvZ1Rva2VuKTsKKwkJCQlQTUVBU1VSRV9SRVFfRU5UUlkgcFByb2JlRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOworCisJCQkJLy8gdXBkYXRlIEhhc2ggbGlzdAorCQkJCWRvCisJCQkJeworCQkJCQlpZiAocFByb2JlRW50cnkgPT0gcEVudHJ5KQorCQkJCQl7CisJCQkJCQlpZiAocFByZXZFbnRyeSA9PSBOVUxMKQorCQkJCQkJeworCQkJCQkJCXBUYWItPkhhc2hbSGFzaElkeF0gPSBwRW50cnktPnBOZXh0OworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCXBQcmV2RW50cnktPnBOZXh0ID0gcEVudHJ5LT5wTmV4dDsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJcFByZXZFbnRyeSA9IHBQcm9iZUVudHJ5OworCQkJCQlwUHJvYmVFbnRyeSA9IHBQcm9iZUVudHJ5LT5wTmV4dDsKKwkJCQl9IHdoaWxlIChwUHJvYmVFbnRyeSk7CisKKwkJCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihNRUFTVVJFX1JFUV9FTlRSWSkpOworCQkJCXBUYWItPlNpemUtLTsKKworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAocEVudHJ5LT5WYWxpZCA9PSBGQUxTRSkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChpIDwgTUFYX01FQVNVUkVfUkVRX1RBQl9TSVpFKQorCQl7CisJCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOworCQkJcEVudHJ5LT5sYXN0VGltZSA9IE5vdzsKKwkJCXBFbnRyeS0+VmFsaWQgPSBUUlVFOworCQkJcEVudHJ5LT5EaWFsb2dUb2tlbiA9IERpYWxvZ1Rva2VuOworCQkJcFRhYi0+U2l6ZSsrOworCQl9CisJCWVsc2UKKwkJeworCQkJcEVudHJ5ID0gTlVMTDsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwTWVhc3VyZVJlcVRhYiB0YWIgZnVsbC5cbiIsIF9fZnVuY19fKSk7CisJCX0KKworCQkvLyBhZGQgdGhpcyBOZWlnaGJvciBlbnRyeSBpbnRvIEhBU0ggdGFibGUKKwkJaWYgKHBFbnRyeSkKKwkJeworCQkJSGFzaElkeCA9IE1RX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgoRGlhbG9nVG9rZW4pOworCQkJaWYgKHBUYWItPkhhc2hbSGFzaElkeF0gPT0gTlVMTCkKKwkJCXsKKwkJCQlwVGFiLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5OworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXBDdXJyRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOworCQkJCXdoaWxlIChwQ3VyckVudHJ5LT5wTmV4dCAhPSBOVUxMKQorCQkJCQlwQ3VyckVudHJ5ID0gcEN1cnJFbnRyeS0+cE5leHQ7CisJCQkJcEN1cnJFbnRyeS0+cE5leHQgPSBwRW50cnk7CisJCQl9CisJCX0KKworCQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+Q29tbW9uQ2ZnLk1lYXN1cmVSZXFUYWJMb2NrKTsKKwl9CisKKwlyZXR1cm4gcEVudHJ5OworfQorCitzdGF0aWMgVk9JRCBNZWFzdXJlUmVxRGVsZXRlKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVJTlQ4CQkJRGlhbG9nVG9rZW4pCit7CisJUE1FQVNVUkVfUkVRX1RBQiBwVGFiID0gcEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWI7CisJUE1FQVNVUkVfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEw7CisKKwlpZihwVGFiID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcE1lYXN1cmVSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fZnVuY19fKSk7CisJCXJldHVybjsKKwl9CisKKwkvLyBpZiBlbXB0eSwgcmV0dXJuCisJaWYgKHBUYWItPlNpemUgPT0gMCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoInBNZWFzdXJlUmVxVGFiIGVtcHR5LlxuIikpOworCQlyZXR1cm47CisJfQorCisJcEVudHJ5ID0gTWVhc3VyZVJlcUxvb2tVcChwQWQsIERpYWxvZ1Rva2VuKTsKKwlpZiAocEVudHJ5ICE9IE5VTEwpCisJeworCQlQTUVBU1VSRV9SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7CisJCVVMT05HIEhhc2hJZHggPSBNUV9ESUFMT0dUT0tFTl9IQVNIX0lOREVYKHBFbnRyeS0+RGlhbG9nVG9rZW4pOworCQlQTUVBU1VSRV9SRVFfRU5UUlkgcFByb2JlRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOworCisJCVJUTVBfU0VNX0xPQ0soJnBBZC0+Q29tbW9uQ2ZnLk1lYXN1cmVSZXFUYWJMb2NrKTsKKwkJLy8gdXBkYXRlIEhhc2ggbGlzdAorCQlkbworCQl7CisJCQlpZiAocFByb2JlRW50cnkgPT0gcEVudHJ5KQorCQkJeworCQkJCWlmIChwUHJldkVudHJ5ID09IE5VTEwpCisJCQkJeworCQkJCQlwVGFiLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5LT5wTmV4dDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcFByZXZFbnRyeS0+cE5leHQgPSBwRW50cnktPnBOZXh0OworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKworCQkJcFByZXZFbnRyeSA9IHBQcm9iZUVudHJ5OworCQkJcFByb2JlRW50cnkgPSBwUHJvYmVFbnRyeS0+cE5leHQ7CisJCX0gd2hpbGUgKHBQcm9iZUVudHJ5KTsKKworCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihNRUFTVVJFX1JFUV9FTlRSWSkpOworCQlwVGFiLT5TaXplLS07CisKKwkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPkNvbW1vbkNmZy5NZWFzdXJlUmVxVGFiTG9jayk7CisJfQorCisJcmV0dXJuOworfQorCitWT0lEIFRwY1JlcVRhYkluaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOworCisJcEFkLT5Db21tb25DZmcucFRwY1JlcVRhYiA9IGttYWxsb2Moc2l6ZW9mKFRQQ19SRVFfVEFCKSwgR0ZQX0FUT01JQyk7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWIpCisJCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWIsIHNpemVvZihUUENfUkVRX1RBQikpOworCWVsc2UKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgRmFpbCB0byBhbGxvYyBtZW1vcnkgZm9yIHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWIuXG4iLCBfX2Z1bmNfXykpOworCisJcmV0dXJuOworfQorCitWT0lEIFRwY1JlcVRhYkV4aXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTmRpc0ZyZWVTcGluTG9jayhwQWQtPkNvbW1vbkNmZy5UcGNSZXFUYWJMb2NrKTsKKworCWlmIChwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiKQorCQlrZnJlZShwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiKTsKKwlwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiID0gTlVMTDsKKworCXJldHVybjsKK30KKworc3RhdGljIFBUUENfUkVRX0VOVFJZIFRwY1JlcUxvb2tVcCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVSU5UOAkJCURpYWxvZ1Rva2VuKQoreworCVVJTlQgSGFzaElkeDsKKwlQVFBDX1JFUV9UQUIgcFRhYiA9IHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWI7CisJUFRQQ19SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTDsKKwlQVFBDX1JFUV9FTlRSWSBwUHJldkVudHJ5ID0gTlVMTDsKKworCWlmIChwVGFiID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcFRwY1JlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19mdW5jX18pKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJUlRNUF9TRU1fTE9DSygmcEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7CisKKwlIYXNoSWR4ID0gVFBDX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgoRGlhbG9nVG9rZW4pOworCXBFbnRyeSA9IHBUYWItPkhhc2hbSGFzaElkeF07CisKKwl3aGlsZSAocEVudHJ5KQorCXsKKwkJaWYgKHBFbnRyeS0+RGlhbG9nVG9rZW4gPT0gRGlhbG9nVG9rZW4pCisJCQlicmVhazsKKwkJZWxzZQorCQl7CisJCQlwUHJldkVudHJ5ID0gcEVudHJ5OworCQkJcEVudHJ5ID0gcEVudHJ5LT5wTmV4dDsKKwkJfQorCX0KKworCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7CisKKwlyZXR1cm4gcEVudHJ5OworfQorCisKK3N0YXRpYyBQVFBDX1JFUV9FTlRSWSBUcGNSZXFJbnNlcnQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVUlOVDgJCQlEaWFsb2dUb2tlbikKK3sKKwlJTlQgaTsKKwlVTE9ORyBIYXNoSWR4OworCVBUUENfUkVRX1RBQiBwVGFiID0gcEFkLT5Db21tb25DZmcucFRwY1JlcVRhYjsKKwlQVFBDX1JFUV9FTlRSWSBwRW50cnkgPSBOVUxMLCBwQ3VyckVudHJ5OworCVVMT05HIE5vdzsKKworCWlmKHBUYWIgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwVHBjUmVxVGFiIGRvZXNuJ3QgZXhpc3QuXG4iLCBfX2Z1bmNfXykpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwRW50cnkgPSBUcGNSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbik7CisJaWYgKHBFbnRyeSA9PSBOVUxMKQorCXsKKwkJUlRNUF9TRU1fTE9DSygmcEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfVFBDX1JFUV9UQUJfU0laRTsgaSsrKQorCQl7CisJCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOworCQkJcEVudHJ5ID0gJnBUYWItPkNvbnRlbnRbaV07CisKKwkJCWlmICgocEVudHJ5LT5WYWxpZCA9PSBUUlVFKQorCQkJCSYmIFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3csICh1bnNpZ25lZCBsb25nKShwRW50cnktPmxhc3RUaW1lICsgVFBDX1JFUV9BR0VfT1VUKSkpCisJCQl7CisJCQkJUFRQQ19SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7CisJCQkJVUxPTkcgSGFzaElkeCA9IFRQQ19ESUFMT0dUT0tFTl9IQVNIX0lOREVYKHBFbnRyeS0+RGlhbG9nVG9rZW4pOworCQkJCVBUUENfUkVRX0VOVFJZIHBQcm9iZUVudHJ5ID0gcFRhYi0+SGFzaFtIYXNoSWR4XTsKKworCQkJCS8vIHVwZGF0ZSBIYXNoIGxpc3QKKwkJCQlkbworCQkJCXsKKwkJCQkJaWYgKHBQcm9iZUVudHJ5ID09IHBFbnRyeSkKKwkJCQkJeworCQkJCQkJaWYgKHBQcmV2RW50cnkgPT0gTlVMTCkKKwkJCQkJCXsKKwkJCQkJCQlwVGFiLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5LT5wTmV4dDsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlwUHJldkVudHJ5LT5wTmV4dCA9IHBFbnRyeS0+cE5leHQ7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCXBQcmV2RW50cnkgPSBwUHJvYmVFbnRyeTsKKwkJCQkJcFByb2JlRW50cnkgPSBwUHJvYmVFbnRyeS0+cE5leHQ7CisJCQkJfSB3aGlsZSAocFByb2JlRW50cnkpOworCisJCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2YoVFBDX1JFUV9FTlRSWSkpOworCQkJCXBUYWItPlNpemUtLTsKKworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAocEVudHJ5LT5WYWxpZCA9PSBGQUxTRSkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChpIDwgTUFYX1RQQ19SRVFfVEFCX1NJWkUpCisJCXsKKwkJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7CisJCQlwRW50cnktPmxhc3RUaW1lID0gTm93OworCQkJcEVudHJ5LT5WYWxpZCA9IFRSVUU7CisJCQlwRW50cnktPkRpYWxvZ1Rva2VuID0gRGlhbG9nVG9rZW47CisJCQlwVGFiLT5TaXplKys7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwRW50cnkgPSBOVUxMOworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBUcGNSZXFUYWIgdGFiIGZ1bGwuXG4iLCBfX2Z1bmNfXykpOworCQl9CisKKwkJLy8gYWRkIHRoaXMgTmVpZ2hib3IgZW50cnkgaW50byBIQVNIIHRhYmxlCisJCWlmIChwRW50cnkpCisJCXsKKwkJCUhhc2hJZHggPSBUUENfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChEaWFsb2dUb2tlbik7CisJCQlpZiAocFRhYi0+SGFzaFtIYXNoSWR4XSA9PSBOVUxMKQorCQkJeworCQkJCXBUYWItPkhhc2hbSGFzaElkeF0gPSBwRW50cnk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcEN1cnJFbnRyeSA9IHBUYWItPkhhc2hbSGFzaElkeF07CisJCQkJd2hpbGUgKHBDdXJyRW50cnktPnBOZXh0ICE9IE5VTEwpCisJCQkJCXBDdXJyRW50cnkgPSBwQ3VyckVudHJ5LT5wTmV4dDsKKwkJCQlwQ3VyckVudHJ5LT5wTmV4dCA9IHBFbnRyeTsKKwkJCX0KKwkJfQorCisJCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7CisJfQorCisJcmV0dXJuIHBFbnRyeTsKK30KKworc3RhdGljIFZPSUQgVHBjUmVxRGVsZXRlKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVJTlQ4CQkJRGlhbG9nVG9rZW4pCit7CisJUFRQQ19SRVFfVEFCIHBUYWIgPSBwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiOworCVBUUENfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEw7CisKKwlpZihwVGFiID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcFRwY1JlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19mdW5jX18pKTsKKwkJcmV0dXJuOworCX0KKworCS8vIGlmIGVtcHR5LCByZXR1cm4KKwlpZiAocFRhYi0+U2l6ZSA9PSAwKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgicFRwY1JlcVRhYiBlbXB0eS5cbiIpKTsKKwkJcmV0dXJuOworCX0KKworCXBFbnRyeSA9IFRwY1JlcUxvb2tVcChwQWQsIERpYWxvZ1Rva2VuKTsKKwlpZiAocEVudHJ5ICE9IE5VTEwpCisJeworCQlQVFBDX1JFUV9FTlRSWSBwUHJldkVudHJ5ID0gTlVMTDsKKwkJVUxPTkcgSGFzaElkeCA9IFRQQ19ESUFMT0dUT0tFTl9IQVNIX0lOREVYKHBFbnRyeS0+RGlhbG9nVG9rZW4pOworCQlQVFBDX1JFUV9FTlRSWSBwUHJvYmVFbnRyeSA9IHBUYWItPkhhc2hbSGFzaElkeF07CisKKwkJUlRNUF9TRU1fTE9DSygmcEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7CisJCS8vIHVwZGF0ZSBIYXNoIGxpc3QKKwkJZG8KKwkJeworCQkJaWYgKHBQcm9iZUVudHJ5ID09IHBFbnRyeSkKKwkJCXsKKwkJCQlpZiAocFByZXZFbnRyeSA9PSBOVUxMKQorCQkJCXsKKwkJCQkJcFRhYi0+SGFzaFtIYXNoSWR4XSA9IHBFbnRyeS0+cE5leHQ7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXBQcmV2RW50cnktPnBOZXh0ID0gcEVudHJ5LT5wTmV4dDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXBQcmV2RW50cnkgPSBwUHJvYmVFbnRyeTsKKwkJCXBQcm9iZUVudHJ5ID0gcFByb2JlRW50cnktPnBOZXh0OworCQl9IHdoaWxlIChwUHJvYmVFbnRyeSk7CisKKwkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2YoVFBDX1JFUV9FTlRSWSkpOworCQlwVGFiLT5TaXplLS07CisKKwkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPkNvbW1vbkNmZy5UcGNSZXFUYWJMb2NrKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJR2V0IEN1cnJlbnQgVGltZVMgdGFtcC4KKworCVBhcmFtZXRyczoKKworCVJldHVybgk6IEN1cnJlbnQgVGltZSBTdGFtcC4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitzdGF0aWMgVUlOVDY0IEdldEN1cnJlbnRUaW1lU3RhbXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJLy8gZ2V0IGN1cnJlbnQgdGltZSBzdGFtcC4KKwlyZXR1cm4gMDsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlHZXQgQ3VycmVudCBUcmFuc21pdCBQb3dlci4KKworCVBhcmFtZXRyczoKKworCVJldHVybgk6IEN1cnJlbnQgVGltZSBTdGFtcC4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitzdGF0aWMgVUlOVDggR2V0Q3VyVHhQd3IoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUlOVDggV2NpZCkKK3sKKwlyZXR1cm4gMTY7IC8qIDE2IGRCbSAqLworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUluc2VydCBEaWFsb2cgVG9rZW4gaW50byBmcmFtZS4KKworCVBhcmFtZXRyczoKKwkJMS4gZnJhbWUgYnVmZmVyIHBvaW50ZXIuCisJCTIuIGZyYW1lIGxlbmd0aC4KKwkJMy4gRGlhbG9nIHRva2VuLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitzdGF0aWMgVk9JRCBJbnNlcnREaWFsb2dUb2tlbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKKwlPVVQgUFVMT05HIHBGcmFtZUxlbiwKKwlJTiBVSU5UOCBEaWFsb2dUb2tlbikKK3sKKwlVTE9ORyBUZW1wTGVuOworCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiwJJlRlbXBMZW4sCisJCQkJCTEsCQkJCSZEaWFsb2dUb2tlbiwKKwkJCQkJRU5EX09GX0FSR1MpOworCisJKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOworCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUluc2VydCBUUEMgUmVxdWVzdCBJRSBpbnRvIGZyYW1lLgorCisJUGFyYW1ldHJzOgorCQkxLiBmcmFtZSBidWZmZXIgcG9pbnRlci4KKwkJMi4gZnJhbWUgbGVuZ3RoLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisgc3RhdGljIFZPSUQgSW5zZXJ0VHBjUmVxSUUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJT1VUIFBVQ0hBUiBwRnJhbWVCdWYsCisJT1VUIFBVTE9ORyBwRnJhbWVMZW4pCit7CisJVUxPTkcgVGVtcExlbjsKKwlVTE9ORyBMZW4gPSAwOworCVVJTlQ4IEVsZW1lbnRJRCA9IElFX1RQQ19SRVFVRVNUOworCisJTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmLAkJCQkJJlRlbXBMZW4sCisJCQkJCQkxLAkJCQkJCQkmRWxlbWVudElELAorCQkJCQkJMSwJCQkJCQkJJkxlbiwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKworCSpwRnJhbWVMZW4gPSAqcEZyYW1lTGVuICsgVGVtcExlbjsKKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlJbnNlcnQgVFBDIFJlcG9ydCBJRSBpbnRvIGZyYW1lLgorCisJUGFyYW1ldHJzOgorCQkxLiBmcmFtZSBidWZmZXIgcG9pbnRlci4KKwkJMi4gZnJhbWUgbGVuZ3RoLgorCQkzLiBUcmFuc21pdCBQb3dlci4KKwkJNC4gTGluayBNYXJnaW4uCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKyBzdGF0aWMgVk9JRCBJbnNlcnRUcGNSZXBvcnRJRSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKKwlPVVQgUFVMT05HIHBGcmFtZUxlbiwKKwlJTiBVSU5UOCBUeFB3ciwKKwlJTiBVSU5UOCBMaW5rTWFyZ2luKQoreworCVVMT05HIFRlbXBMZW47CisJVUxPTkcgTGVuID0gc2l6ZW9mKFRQQ19SRVBPUlRfSU5GTyk7CisJVUlOVDggRWxlbWVudElEID0gSUVfVFBDX1JFUE9SVDsKKwlUUENfUkVQT1JUX0lORk8gVHBjUmVwb3J0SUU7CisKKwlUcGNSZXBvcnRJRS5UeFB3ciA9IFR4UHdyOworCVRwY1JlcG9ydElFLkxpbmtNYXJnaW4gPSBMaW5rTWFyZ2luOworCisJTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmLAkJCQkJJlRlbXBMZW4sCisJCQkJCQkxLAkJCQkJCQkmRWxlbWVudElELAorCQkJCQkJMSwJCQkJCQkJJkxlbiwKKwkJCQkJCUxlbiwJCQkJCQkmVHBjUmVwb3J0SUUsCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisKKwkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47CisKKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlJbnNlcnQgQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IElFIGludG8gZnJhbWUuCisKKwlQYXJhbWV0cnM6CisJCTEuIGZyYW1lIGJ1ZmZlciBwb2ludGVyLgorCQkyLiBmcmFtZSBsZW5ndGguCisJCTMuIGNoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCBtb2RlLgorCQk0LiBuZXcgc2VsZWN0ZWQgY2hhbm5lbC4KKwkJNS4gY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IGNvdW50LgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitzdGF0aWMgVk9JRCBJbnNlcnRDaFN3QW5uSUUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJT1VUIFBVQ0hBUiBwRnJhbWVCdWYsCisJT1VUIFBVTE9ORyBwRnJhbWVMZW4sCisJSU4gVUlOVDggQ2hTd01vZGUsCisJSU4gVUlOVDggTmV3Q2hhbm5lbCwKKwlJTiBVSU5UOCBDaFN3Q250KQoreworCVVMT05HIFRlbXBMZW47CisJVUxPTkcgTGVuID0gc2l6ZW9mKENIX1NXX0FOTl9JTkZPKTsKKwlVSU5UOCBFbGVtZW50SUQgPSBJRV9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlQ7CisJQ0hfU1dfQU5OX0lORk8gQ2hTd0FubklFOworCisJQ2hTd0FubklFLkNoU3dNb2RlID0gQ2hTd01vZGU7CisJQ2hTd0FubklFLkNoYW5uZWwgPSBOZXdDaGFubmVsOworCUNoU3dBbm5JRS5DaFN3Q250ID0gQ2hTd0NudDsKKworCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiwJCQkJJlRlbXBMZW4sCisJCQkJCQkxLAkJCQkJCSZFbGVtZW50SUQsCisJCQkJCQkxLAkJCQkJCSZMZW4sCisJCQkJCQlMZW4sCQkJCQkmQ2hTd0FubklFLAorCQkJCQkJRU5EX09GX0FSR1MpOworCisJKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOworCisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJSW5zZXJ0IE1lYXN1cmUgUmVxdWVzdCBJRSBpbnRvIGZyYW1lLgorCisJUGFyYW1ldHJzOgorCQkxLiBmcmFtZSBidWZmZXIgcG9pbnRlci4KKwkJMi4gZnJhbWUgbGVuZ3RoLgorCQkzLiBNZWFzdXJlIFRva2VuLgorCQk0LiBNZWFzdXJlIFJlcXVlc3QgTW9kZS4KKwkJNS4gTWVhc3VyZSBSZXF1ZXN0IFR5cGUuCisJCTYuIE1lYXN1cmUgQ2hhbm5lbC4KKwkJNy4gTWVhc3VyZSBTdGFydCB0aW1lLgorCQk4LiBNZWFzdXJlIER1cmF0aW9uLgorCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBWT0lEIEluc2VydE1lYXN1cmVSZXFJRSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKKwlPVVQgUFVMT05HIHBGcmFtZUxlbiwKKwlJTiBQTUVBU1VSRV9SRVFfSU5GTyBwTWVhc3VyZVJlcUlFKQoreworCVVMT05HIFRlbXBMZW47CisJVUlOVDggTGVuID0gc2l6ZW9mKE1FQVNVUkVfUkVRX0lORk8pOworCVVJTlQ4IEVsZW1lbnRJRCA9IElFX01FQVNVUkVNRU5UX1JFUVVFU1Q7CisKKwlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYsCQkJCQkmVGVtcExlbiwKKwkJCQkJCTEsCQkJCQkJCSZFbGVtZW50SUQsCisJCQkJCQkxLAkJCQkJCQkmTGVuLAorCQkJCQkJTGVuLAkJCQkJCXBNZWFzdXJlUmVxSUUsCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisKKwkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47CisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJSW5zZXJ0IE1lYXN1cmUgUmVwb3J0IElFIGludG8gZnJhbWUuCisKKwlQYXJhbWV0cnM6CisJCTEuIGZyYW1lIGJ1ZmZlciBwb2ludGVyLgorCQkyLiBmcmFtZSBsZW5ndGguCisJCTMuIE1lYXN1cmUgVG9rZW4uCisJCTQuIE1lYXN1cmUgUmVxdWVzdCBNb2RlLgorCQk1LiBNZWFzdXJlIFJlcXVlc3QgVHlwZS4KKwkJNi4gTGVuZ3RoIG9mIFJlcG9ydCBJbmZvbWF0aW9uCisJCTcuIFBvaW50ZXIgb2YgUmVwb3J0IEluZm9tYXRpb24gQnVmZmVyLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitzdGF0aWMgVk9JRCBJbnNlcnRNZWFzdXJlUmVwb3J0SUUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJT1VUIFBVQ0hBUiBwRnJhbWVCdWYsCisJT1VUIFBVTE9ORyBwRnJhbWVMZW4sCisJSU4gUE1FQVNVUkVfUkVQT1JUX0lORk8gcE1lYXN1cmVSZXBvcnRJRSwKKwlJTiBVSU5UOCBSZXBvcnRMbmZvTGVuLAorCUlOIFBVSU5UOCBwUmVwb3J0SW5mbykKK3sKKwlVTE9ORyBUZW1wTGVuOworCVVMT05HIExlbjsKKwlVSU5UOCBFbGVtZW50SUQgPSBJRV9NRUFTVVJFTUVOVF9SRVBPUlQ7CisKKwlMZW4gPSBzaXplb2YoTUVBU1VSRV9SRVBPUlRfSU5GTykgKyBSZXBvcnRMbmZvTGVuOworCisJTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmLAkJCQkJJlRlbXBMZW4sCisJCQkJCQkxLAkJCQkJCQkmRWxlbWVudElELAorCQkJCQkJMSwJCQkJCQkJJkxlbiwKKwkJCQkJCUxlbiwJCQkJCQlwTWVhc3VyZVJlcG9ydElFLAorCQkJCQkJRU5EX09GX0FSR1MpOworCisJKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOworCisJaWYgKChSZXBvcnRMbmZvTGVuID4gMCkgJiYgKHBSZXBvcnRJbmZvICE9IE5VTEwpKQorCXsKKwkJTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmICsgKnBGcmFtZUxlbiwJCSZUZW1wTGVuLAorCQkJCQkJCVJlcG9ydExuZm9MZW4sCQkJCXBSZXBvcnRJbmZvLAorCQkJCQkJCUVORF9PRl9BUkdTKTsKKworCQkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47CisJfQorCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlQcmVwYXJlIE1lYXN1cmVtZW50IHJlcXVlc3QgYWN0aW9uIGZyYW1lIGFuZCBlbnF1ZXVlIGl0IGludG8KKwkJbWFuYWdlbWVudCBxdWV1ZSB3YWl0aW5nIGZvciB0cmFuc21pdGlvbi4KKworCVBhcmFtZXRyczoKKwkJMS4gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZS4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBFbnF1ZXVlTWVhc3VyZW1lbnRSZXEoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBVSU5UOCBNZWFzdXJlVG9rZW4sCisJSU4gVUlOVDggTWVhc3VyZVJlcU1vZGUsCisJSU4gVUlOVDggTWVhc3VyZVJlcVR5cGUsCisJSU4gVUlOVDggTWVhc3VyZUNoLAorCUlOIFVJTlQxNiBNZWFzdXJlRHVyYXRpb24pCit7CisJUFVDSEFSIHBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTIE5TdGF0dXM7CisJVUxPTkcgRnJhbWVMZW47CisJSEVBREVSXzgwMl8xMSBBY3RIZHI7CisJTUVBU1VSRV9SRVFfSU5GTyBNZWFzdXJlUmVxSUU7CisJVUlOVDggUm1SZXFEYWlsb2dUb2tlbiA9IFJhbmRvbUJ5dGUocEFkKTsKKwlVSU5UNjQgTWVhc3VyZVN0YXJ0VGltZSA9IEdldEN1cnJlbnRUaW1lU3RhbXAocEFkKTsKKworCS8vIGJ1aWxkIGFjdGlvbiBmcmFtZSBoZWFkZXIuCisJTWd0TWFjSGVhZGVySW5pdChwQWQsICZBY3RIZHIsIFNVQlRZUEVfQUNUSU9OLCAwLCBwREEsCisJCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIsIF9fZnVuY19fKSk7CisJCXJldHVybjsKKwl9CisJTmRpc01vdmVNZW1vcnkocE91dEJ1ZmZlciwgKFBDSEFSKSZBY3RIZHIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJRnJhbWVMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisKKwlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIENBVEVHT1JZX1NQRUNUUlVNLCBTUEVDX01SUSk7CisKKwkvLyBmaWxsIERpYWxvZyBUb2tlbgorCUluc2VydERpYWxvZ1Rva2VuKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgTWVhc3VyZVRva2VuKTsKKworCS8vIHByZXBhcmUgTWVhc3VyZW1lbnQgSUUuCisJTmRpc1plcm9NZW1vcnkoJk1lYXN1cmVSZXFJRSwgc2l6ZW9mKE1FQVNVUkVfUkVRX0lORk8pKTsKKwlNZWFzdXJlUmVxSUUuVG9rZW4gPSBSbVJlcURhaWxvZ1Rva2VuOworCU1lYXN1cmVSZXFJRS5SZXFNb2RlLndvcmQgPSBNZWFzdXJlUmVxTW9kZTsKKwlNZWFzdXJlUmVxSUUuUmVxVHlwZSA9IE1lYXN1cmVSZXFUeXBlOworCU1lYXN1cmVSZXFJRS5NZWFzdXJlUmVxLkNoTnVtID0gTWVhc3VyZUNoOworCU1lYXN1cmVSZXFJRS5NZWFzdXJlUmVxLk1lYXN1cmVTdGFydFRpbWUgPSBjcHUybGU2NChNZWFzdXJlU3RhcnRUaW1lKTsKKwlNZWFzdXJlUmVxSUUuTWVhc3VyZVJlcS5NZWFzdXJlRHVyYXRpb24gPSBjcHUybGUxNihNZWFzdXJlRHVyYXRpb24pOworCUluc2VydE1lYXN1cmVSZXFJRShwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sICZNZWFzdXJlUmVxSUUpOworCisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVByZXBhcmUgTWVhc3VyZW1lbnQgcmVwb3J0IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCisJCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCisKKwlQYXJhbWV0cnM6CisJCTEuIHRoZSBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyBvZiB0aGUgZnJhbWUuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgRW5xdWV1ZU1lYXN1cmVtZW50UmVwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBwREEsCisJSU4gVUlOVDggRGlhbG9nVG9rZW4sCisJSU4gVUlOVDggTWVhc3VyZVRva2VuLAorCUlOIFVJTlQ4IE1lYXN1cmVSZXFNb2RlLAorCUlOIFVJTlQ4IE1lYXN1cmVSZXFUeXBlLAorCUlOIFVJTlQ4IFJlcG9ydEluZm9MZW4sCisJSU4gUFVJTlQ4IHBSZXBvcnRJbmZvKQoreworCVBVQ0hBUiBwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUyBOU3RhdHVzOworCVVMT05HIEZyYW1lTGVuOworCUhFQURFUl84MDJfMTEgQWN0SGRyOworCU1FQVNVUkVfUkVQT1JUX0lORk8gTWVhc3VyZVJlcElFOworCisJLy8gYnVpbGQgYWN0aW9uIGZyYW1lIGhlYWRlci4KKwlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkFjdEhkciwgU1VCVFlQRV9BQ1RJT04sIDAsIHBEQSwKKwkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MpOworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19mdW5jX18pKTsKKwkJcmV0dXJuOworCX0KKwlOZGlzTW92ZU1lbW9yeShwT3V0QnVmZmVyLCAoUENIQVIpJkFjdEhkciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwlGcmFtZUxlbiA9IHNpemVvZihIRUFERVJfODAyXzExKTsKKworCUluc2VydEFjdEZpZWxkKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgQ0FURUdPUllfU1BFQ1RSVU0sIFNQRUNfTVJQKTsKKworCS8vIGZpbGwgRGlhbG9nIFRva2VuCisJSW5zZXJ0RGlhbG9nVG9rZW4ocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBEaWFsb2dUb2tlbik7CisKKwkvLyBwcmVwYXJlIE1lYXN1cmVtZW50IElFLgorCU5kaXNaZXJvTWVtb3J5KCZNZWFzdXJlUmVwSUUsIHNpemVvZihNRUFTVVJFX1JFUE9SVF9JTkZPKSk7CisJTWVhc3VyZVJlcElFLlRva2VuID0gTWVhc3VyZVRva2VuOworCU1lYXN1cmVSZXBJRS5SZXBvcnRNb2RlLndvcmQgPSBNZWFzdXJlUmVxTW9kZTsKKwlNZWFzdXJlUmVwSUUuUmVwb3J0VHlwZSA9IE1lYXN1cmVSZXFUeXBlOworCUluc2VydE1lYXN1cmVSZXBvcnRJRShwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sICZNZWFzdXJlUmVwSUUsIFJlcG9ydEluZm9MZW4sIHBSZXBvcnRJbmZvKTsKKworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlQcmVwYXJlIFRQQyBSZXF1ZXN0IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCisJCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCisKKwlQYXJhbWV0cnM6CisJCTEuIHRoZSBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyBvZiB0aGUgZnJhbWUuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgRW5xdWV1ZVRQQ1JlcSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcERBLAorCUlOIFVDSEFSIERpYWxvZ1Rva2VuKQoreworCVBVQ0hBUiBwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUyBOU3RhdHVzOworCVVMT05HIEZyYW1lTGVuOworCisJSEVBREVSXzgwMl8xMSBBY3RIZHI7CisKKwkvLyBidWlsZCBhY3Rpb24gZnJhbWUgaGVhZGVyLgorCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQWN0SGRyLCBTVUJUWVBFX0FDVElPTiwgMCwgcERBLAorCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcyk7CisKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcygpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iLCBfX2Z1bmNfXykpOworCQlyZXR1cm47CisJfQorCU5kaXNNb3ZlTWVtb3J5KHBPdXRCdWZmZXIsIChQQ0hBUikmQWN0SGRyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCUZyYW1lTGVuID0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCisJSW5zZXJ0QWN0RmllbGQocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBDQVRFR09SWV9TUEVDVFJVTSwgU1BFQ19UUENSUSk7CisKKwkvLyBmaWxsIERpYWxvZyBUb2tlbgorCUluc2VydERpYWxvZ1Rva2VuKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgRGlhbG9nVG9rZW4pOworCisJLy8gSW5zZXJ0IFRQQyBSZXF1ZXN0IElFLgorCUluc2VydFRwY1JlcUlFKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbik7CisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBUUEMgUmVwb3J0IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCisJCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCisKKwlQYXJhbWV0cnM6CisJCTEuIHRoZSBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyBvZiB0aGUgZnJhbWUuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgRW5xdWV1ZVRQQ1JlcCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcERBLAorCUlOIFVJTlQ4IERpYWxvZ1Rva2VuLAorCUlOIFVJTlQ4IFR4UHdyLAorCUlOIFVJTlQ4IExpbmtNYXJnaW4pCit7CisJUFVDSEFSIHBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTIE5TdGF0dXM7CisJVUxPTkcgRnJhbWVMZW47CisKKwlIRUFERVJfODAyXzExIEFjdEhkcjsKKworCS8vIGJ1aWxkIGFjdGlvbiBmcmFtZSBoZWFkZXIuCisJTWd0TWFjSGVhZGVySW5pdChwQWQsICZBY3RIZHIsIFNVQlRZUEVfQUNUSU9OLCAwLCBwREEsCisJCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIsIF9fZnVuY19fKSk7CisJCXJldHVybjsKKwl9CisJTmRpc01vdmVNZW1vcnkocE91dEJ1ZmZlciwgKFBDSEFSKSZBY3RIZHIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJRnJhbWVMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisKKwlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIENBVEVHT1JZX1NQRUNUUlVNLCBTUEVDX1RQQ1JQKTsKKworCS8vIGZpbGwgRGlhbG9nIFRva2VuCisJSW5zZXJ0RGlhbG9nVG9rZW4ocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBEaWFsb2dUb2tlbik7CisKKwkvLyBJbnNlcnQgVFBDIFJlcXVlc3QgSUUuCisJSW5zZXJ0VHBjUmVwb3J0SUUocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBUeFB3ciwgTGlua01hcmdpbik7CisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQgYWN0aW9uIGZyYW1lIGFuZCBlbnF1ZXVlIGl0IGludG8KKwkJbWFuYWdlbWVudCBxdWV1ZSB3YWl0aW5nIGZvciB0cmFuc21pdGlvbi4KKworCVBhcmFtZXRyczoKKwkJMS4gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZS4KKwkJMi4gQ2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IG1vZGUuCisJCTIuIGEgTmV3IHNlbGVjdGVkIGNoYW5uZWwuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgRW5xdWV1ZUNoU3dBbm4oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBVSU5UOCBDaFN3TW9kZSwKKwlJTiBVSU5UOCBOZXdDaCkKK3sKKwlQVUNIQVIgcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMgTlN0YXR1czsKKwlVTE9ORyBGcmFtZUxlbjsKKworCUhFQURFUl84MDJfMTEgQWN0SGRyOworCisJLy8gYnVpbGQgYWN0aW9uIGZyYW1lIGhlYWRlci4KKwlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkFjdEhkciwgU1VCVFlQRV9BQ1RJT04sIDAsIHBEQSwKKwkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MpOworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19mdW5jX18pKTsKKwkJcmV0dXJuOworCX0KKwlOZGlzTW92ZU1lbW9yeShwT3V0QnVmZmVyLCAoUENIQVIpJkFjdEhkciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwlGcmFtZUxlbiA9IHNpemVvZihIRUFERVJfODAyXzExKTsKKworCUluc2VydEFjdEZpZWxkKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgQ0FURUdPUllfU1BFQ1RSVU0sIFNQRUNfQ0hBTk5FTF9TV0lUQ0gpOworCisJSW5zZXJ0Q2hTd0FubklFKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgQ2hTd01vZGUsIE5ld0NoLCAwKTsKKworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCXJldHVybjsKK30KKworc3RhdGljIEJPT0xFQU4gRGZzUmVxdWlyZW1lbnRDaGVjaygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVSU5UOCBDaGFubmVsKQoreworCUJPT0xFQU4gUmVzdWx0ID0gRkFMU0U7CisJSU5UIGk7CisKKwlkbworCXsKKwkJLy8gY2hlY2sgREZTIHByb2NlZHVyZSBpcyBydW5uaW5nLgorCQkvLyBtYWtlIHN1cmUgREZTIHByb2NlZHVyZSB3b24ndCBzdGFydCB0d2ljZS4KKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSAhPSBSRF9OT1JNQUxfTU9ERSkKKwkJeworCQkJUmVzdWx0ID0gRkFMU0U7CisJCQlicmVhazsKKwkJfQorCisJCS8vIGNoZWNrIHRoZSBuZXcgY2hhbm5lbCBjYXJyaWVkIGZyb20gQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtbmV0IGlzIHZhbGlkLgorCQlmb3IgKGk9MDsgaTxwQWQtPkNoYW5uZWxMaXN0TnVtOyBpKyspCisJCXsKKwkJCWlmICgoQ2hhbm5lbCA9PSBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwpCisJCQkJJiYocEFkLT5DaGFubmVsTGlzdFtpXS5SZW1haW5pbmdUaW1lRm9yVXNlID09IDApKQorCQkJeworCQkJCS8vIGZvdW5kIHJhZGFyIHNpZ25hbCBpbiB0aGUgY2hhbm5lbC4gdGhlIGNoYW5uZWwgY2FuJ3QgdXNlIGF0IGxlYXN0IGZvciAzMCBtaW51dGVzLgorCQkJCXBBZC0+Q2hhbm5lbExpc3RbaV0uUmVtYWluaW5nVGltZUZvclVzZSA9IDE4MDA7Ly8zMCBtaW4gPSAxODAwIHNlYworCQkJCVJlc3VsdCA9IFRSVUU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IHdoaWxlKEZBTFNFKTsKKworCXJldHVybiBSZXN1bHQ7Cit9CisKK1ZPSUQgTm90aWZ5Q2hTd0FublRvUGVlckFQcygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcFJBLAorCUlOIFBVQ0hBUiBwVEEsCisJSU4gVUlOVDggQ2hTd01vZGUsCisJSU4gVUlOVDggQ2hhbm5lbCkKK3sKKyNpZmRlZiBXRFNfU1VQUE9SVAorCWlmICghKChwUkFbMF0gJiAweGZmKSA9PSAweGZmKSkgLy8gaXMgcFJBIGEgYnJvYWRjYXNlIGFkZHJlc3MuCisJeworCQlJTlQgaTsKKwkJLy8gaW5mbyBuZWlnaGJvciBBUHMgdGhhdCBSYWRhciBzaWduYWwgZm91bmQgdGhyb2doIFdEUyBsaW5rLgorCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1dEU19FTlRSWTsgaSsrKQorCQl7CisJCQlpZiAoVmFsaWRXZHNFbnRyeShwQWQsIGkpKQorCQkJeworCQkJCVBVQ0hBUiBwREEgPSBwQWQtPldkc1RhYi5XZHNFbnRyeVtpXS5QZWVyV2RzQWRkcjsKKworCQkJCS8vIERBIGVxdWFsIHRvIFNBLiBoYXZlIG5vIG5lY2Vzc2FyeSBvcmlnbmFsIEFQIHdoaWNoIGZvdW5kIFJhZGFyIHNpZ25hbC4KKwkJCQlpZiAoTUFDX0FERFJfRVFVQUwocFRBLCBwREEpKQorCQkJCQljb250aW51ZTsKKworCQkJCS8vIHNlbmQgQ2hhbm5lbCBTd2l0Y2ggQWN0aW9uIGZyYW1lIHRvIGluZm8gTmVpZ2hicm8gQVBzLgorCQkJCUVucXVldWVDaFN3QW5uKHBBZCwgcERBLCBDaFN3TW9kZSwgQ2hhbm5lbCk7CisJCQl9CisJCX0KKwl9CisjZW5kaWYgLy8gV0RTX1NVUFBPUlQgLy8KK30KKworc3RhdGljIFZPSUQgU3RhcnRERlNQcm9jZWR1cmUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgQ2hhbm5lbCwKKwlJTiBVSU5UOCBDaFN3TW9kZSkKK3sKKwkvLyBzdGFydCBERlMgcHJvY2VkdXJlCisJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IENoYW5uZWw7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJTl9DaGFubmVsQ2hlY2socEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgPSBSRF9TV0lUQ0hJTkdfTU9ERTsKKwlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5DU0NvdW50ID0gMDsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQgYWN0aW9uIGZyYW1lIHNhbml0eSBjaGVjay4KKworCVBhcmFtZXRyczoKKwkJMS4gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisJCTIuIG1lc3NhZ2UgbGVuZ3RoLgorCQkzLiBDaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgaW5mb21hdGlvbiBidWZmZXIuCisKKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKgorICBDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQgSUUuCisgICstLS0tKy0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsKKyAgfCBJRCB8IExlbiB8Q2ggU3cgTW9kZSB8IE5ldyBDaCBOdW0gfCBDaCBTdyBDbnQgfAorICArLS0tLSstLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rCisgICAgMSAgICAxICAgICAgICAxICAgICAgICAgICAxICAgICAgICAgICAgMQorKi8KK3N0YXRpYyBCT09MRUFOIFBlZXJDaFN3QW5uU2FuaXR5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFZPSUQgKnBNc2csCisJSU4gVUxPTkcgTXNnTGVuLAorCU9VVCBQQ0hfU1dfQU5OX0lORk8gcENoU3dBbm5JbmZvKQoreworCVBGUkFNRV84MDJfMTEgRnIgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOworCVBVQ0hBUiBwRnJhbWVQdHIgPSBGci0+T2N0ZXQ7CisJQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKKwlQRUlEX1NUUlVDVCBlaWRfcHRyOworCisJLy8gc2tpcCA4MDIuMTEgaGVhZGVyLgorCU1zZ0xlbiAtPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisKKwkvLyBza2lwIGNhdGVnb3J5IGFuZCBhY3Rpb24gY29kZS4KKwlwRnJhbWVQdHIgKz0gMjsKKwlNc2dMZW4gLT0gMjsKKworCWlmIChwQ2hTd0FubkluZm8gPT0gTlVMTCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpcEZyYW1lUHRyOworCXdoaWxlICgoKFVDSEFSKillaWRfcHRyICsgZWlkX3B0ci0+TGVuICsgMSkgPCAoKFBVQ0hBUilwRnJhbWVQdHIgKyBNc2dMZW4pKQorCXsKKwkJc3dpdGNoKGVpZF9wdHItPkVpZCkKKwkJeworCQkJY2FzZSBJRV9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlQ6CisJCQkJTmRpc01vdmVNZW1vcnkoJnBDaFN3QW5uSW5mby0+Q2hTd01vZGUsIGVpZF9wdHItPk9jdGV0LCAxKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcENoU3dBbm5JbmZvLT5DaGFubmVsLCBlaWRfcHRyLT5PY3RldCArIDEsIDEpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQ2hTd0FubkluZm8tPkNoU3dDbnQsIGVpZF9wdHItPk9jdGV0ICsgMiwgMSk7CisKKwkJCQlyZXN1bHQgPSBUUlVFOworICAgICAgICAgICAgICAgIGJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisJCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopZWlkX3B0ciArIDIgKyBlaWRfcHRyLT5MZW4pOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJTWVhc3VyZW1lbnQgcmVxdWVzdCBhY3Rpb24gZnJhbWUgc2FuaXR5IGNoZWNrLgorCisJUGFyYW1ldHJzOgorCQkxLiBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKKwkJMi4gbWVzc2FnZSBsZW5ndGguCisJCTMuIE1lYXN1cmVtZW50IHJlcXVlc3QgaW5mb21hdGlvbiBidWZmZXIuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBCT09MRUFOIFBlZXJNZWFzdXJlUmVxU2FuaXR5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFZPSUQgKnBNc2csCisJSU4gVUxPTkcgTXNnTGVuLAorCU9VVCBQVUlOVDggcERpYWxvZ1Rva2VuLAorCU9VVCBQTUVBU1VSRV9SRVFfSU5GTyBwTWVhc3VyZVJlcUluZm8pCit7CisJUEZSQU1FXzgwMl8xMSBGciA9IChQRlJBTUVfODAyXzExKXBNc2c7CisJUFVDSEFSIHBGcmFtZVB0ciA9IEZyLT5PY3RldDsKKwlCT09MRUFOIHJlc3VsdCA9IEZBTFNFOworCVBFSURfU1RSVUNUIGVpZF9wdHI7CisJUFVDSEFSIHB0cjsKKwlVSU5UNjQgTWVhc3VyZVN0YXJ0VGltZTsKKwlVSU5UMTYgTWVhc3VyZUR1cmF0aW9uOworCisJLy8gc2tpcCA4MDIuMTEgaGVhZGVyLgorCU1zZ0xlbiAtPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisKKwkvLyBza2lwIGNhdGVnb3J5IGFuZCBhY3Rpb24gY29kZS4KKwlwRnJhbWVQdHIgKz0gMjsKKwlNc2dMZW4gLT0gMjsKKworCWlmIChwTWVhc3VyZVJlcUluZm8gPT0gTlVMTCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCU5kaXNNb3ZlTWVtb3J5KHBEaWFsb2dUb2tlbiwgcEZyYW1lUHRyLCAxKTsKKwlwRnJhbWVQdHIgKz0gMTsKKwlNc2dMZW4gLT0gMTsKKworCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpcEZyYW1lUHRyOworCXdoaWxlICgoKFVDSEFSKillaWRfcHRyICsgZWlkX3B0ci0+TGVuICsgMSkgPCAoKFBVQ0hBUilwRnJhbWVQdHIgKyBNc2dMZW4pKQorCXsKKwkJc3dpdGNoKGVpZF9wdHItPkVpZCkKKwkJeworCQkJY2FzZSBJRV9NRUFTVVJFTUVOVF9SRVFVRVNUOgorCQkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcUluZm8tPlRva2VuLCBlaWRfcHRyLT5PY3RldCwgMSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBNZWFzdXJlUmVxSW5mby0+UmVxTW9kZS53b3JkLCBlaWRfcHRyLT5PY3RldCArIDEsIDEpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcUluZm8tPlJlcVR5cGUsIGVpZF9wdHItPk9jdGV0ICsgMiwgMSk7CisJCQkJcHRyID0gZWlkX3B0ci0+T2N0ZXQgKyAzOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcUluZm8tPk1lYXN1cmVSZXEuQ2hOdW0sIHB0ciwgMSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJk1lYXN1cmVTdGFydFRpbWUsIHB0ciArIDEsIDgpOworCQkJCXBNZWFzdXJlUmVxSW5mby0+TWVhc3VyZVJlcS5NZWFzdXJlU3RhcnRUaW1lID0gU1dBUDY0KE1lYXN1cmVTdGFydFRpbWUpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZNZWFzdXJlRHVyYXRpb24sIHB0ciArIDksIDIpOworCQkJCXBNZWFzdXJlUmVxSW5mby0+TWVhc3VyZVJlcS5NZWFzdXJlRHVyYXRpb24gPSBTV0FQMTYoTWVhc3VyZUR1cmF0aW9uKTsKKworCQkJCXJlc3VsdCA9IFRSVUU7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KKwkJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKillaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlNZWFzdXJlbWVudCByZXBvcnQgYWN0aW9uIGZyYW1lIHNhbml0eSBjaGVjay4KKworCVBhcmFtZXRyczoKKwkJMS4gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisJCTIuIG1lc3NhZ2UgbGVuZ3RoLgorCQkzLiBNZWFzdXJlbWVudCByZXBvcnQgaW5mb21hdGlvbiBidWZmZXIuCisJCTQuIGJhc2ljIHJlcG9ydCBpbmZvbWF0aW9uIGJ1ZmZlci4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKgorICBNZWFzdXJlbWVudCBSZXBvcnQgSUUuCisgICstLS0tKy0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICB8IElEIHwgTGVuIHwgVG9rZW4gfCBSZXBvcnQgTW9kZSB8IE1lYXN1cmUgVHlwZSB8IE1lYXN1cmUgUmVwb3J0IHwKKyAgKy0tLS0rLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgICAgMSAgICAgMSAgICAgIDEgICAgICAgICAgMSAgICAgICAgICAgICAxICAgICAgICAgICAgdmFyaWFibGUKKworICBCYXNpYyBSZXBvcnQuCisgICstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLSsKKyAgfCBDaCBOdW0gfCBTdGFydCBUaW1lIHwgRHVyYXRpb24gfCBNYXAgfAorICArLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0rCisgICAgICAxICAgICAgICAgIDggICAgICAgICAgIDIgICAgICAgIDEKKworICBNYXAgRmllbGQgQml0IEZvcm1hdC4KKyAgKy0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKKyAgfCBCc3MgfCBPRkRNIFByZWFtYmxlIHwgVW5pZGVudGlmaWVkIHNpZ25hbCB8IFJhZGFyIHwgVW5tZWFzdXJlZCB8IFJlc2VydmVkIHwKKyAgKy0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKKyAgICAgMCAgICAgICAgICAxICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgMyAgICAgICAgIDQgICAgICAgICAgNS03CisqLworc3RhdGljIEJPT0xFQU4gUGVlck1lYXN1cmVSZXBvcnRTYW5pdHkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVk9JRCAqcE1zZywKKwlJTiBVTE9ORyBNc2dMZW4sCisJT1VUIFBVSU5UOCBwRGlhbG9nVG9rZW4sCisJT1VUIFBNRUFTVVJFX1JFUE9SVF9JTkZPIHBNZWFzdXJlUmVwb3J0SW5mbywKKwlPVVQgUFVJTlQ4IHBSZXBvcnRCdWYpCit7CisJUEZSQU1FXzgwMl8xMSBGciA9IChQRlJBTUVfODAyXzExKXBNc2c7CisJUFVDSEFSIHBGcmFtZVB0ciA9IEZyLT5PY3RldDsKKwlCT09MRUFOIHJlc3VsdCA9IEZBTFNFOworCVBFSURfU1RSVUNUIGVpZF9wdHI7CisJUFVDSEFSIHB0cjsKKworCS8vIHNraXAgODAyLjExIGhlYWRlci4KKwlNc2dMZW4gLT0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCisJLy8gc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuCisJcEZyYW1lUHRyICs9IDI7CisJTXNnTGVuIC09IDI7CisKKwlpZiAocE1lYXN1cmVSZXBvcnRJbmZvID09IE5VTEwpCisJCXJldHVybiByZXN1bHQ7CisKKwlOZGlzTW92ZU1lbW9yeShwRGlhbG9nVG9rZW4sIHBGcmFtZVB0ciwgMSk7CisJcEZyYW1lUHRyICs9IDE7CisJTXNnTGVuIC09IDE7CisKKwllaWRfcHRyID0gKFBFSURfU1RSVUNUKXBGcmFtZVB0cjsKKwl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChQVUNIQVIpcEZyYW1lUHRyICsgTXNnTGVuKSkKKwl7CisJCXN3aXRjaChlaWRfcHRyLT5FaWQpCisJCXsKKwkJCWNhc2UgSUVfTUVBU1VSRU1FTlRfUkVQT1JUOgorCQkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcG9ydEluZm8tPlRva2VuLCBlaWRfcHRyLT5PY3RldCwgMSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBNZWFzdXJlUmVwb3J0SW5mby0+UmVwb3J0TW9kZSwgZWlkX3B0ci0+T2N0ZXQgKyAxLCAxKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXBvcnRJbmZvLT5SZXBvcnRUeXBlLCBlaWRfcHRyLT5PY3RldCArIDIsIDEpOworCQkJCWlmIChwTWVhc3VyZVJlcG9ydEluZm8tPlJlcG9ydFR5cGUgPT0gUk1fQkFTSUMpCisJCQkJeworCQkJCQlQTUVBU1VSRV9CQVNJQ19SRVBPUlQgcFJlcG9ydCA9IChQTUVBU1VSRV9CQVNJQ19SRVBPUlQpcFJlcG9ydEJ1ZjsKKwkJCQkJcHRyID0gZWlkX3B0ci0+T2N0ZXQgKyAzOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+Q2hOdW0sIHB0ciwgMSk7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlU3RhcnRUaW1lLCBwdHIgKyAxLCA4KTsKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPk1lYXN1cmVEdXJhdGlvbiwgcHRyICsgOSwgMik7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NYXAsIHB0ciArIDExLCAxKTsKKworCQkJCX0KKwkJCQllbHNlIGlmIChwTWVhc3VyZVJlcG9ydEluZm8tPlJlcG9ydFR5cGUgPT0gUk1fQ0NBKQorCQkJCXsKKwkJCQkJUE1FQVNVUkVfQ0NBX1JFUE9SVCBwUmVwb3J0ID0gKFBNRUFTVVJFX0NDQV9SRVBPUlQpcFJlcG9ydEJ1ZjsKKwkJCQkJcHRyID0gZWlkX3B0ci0+T2N0ZXQgKyAzOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+Q2hOdW0sIHB0ciwgMSk7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlU3RhcnRUaW1lLCBwdHIgKyAxLCA4KTsKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPk1lYXN1cmVEdXJhdGlvbiwgcHRyICsgOSwgMik7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5DQ0FfQnVzeV9GcmFjdGlvbiwgcHRyICsgMTEsIDEpOworCisJCQkJfQorCQkJCWVsc2UgaWYgKHBNZWFzdXJlUmVwb3J0SW5mby0+UmVwb3J0VHlwZSA9PSBSTV9SUElfSElTVE9HUkFNKQorCQkJCXsKKwkJCQkJUE1FQVNVUkVfUlBJX1JFUE9SVCBwUmVwb3J0ID0gKFBNRUFTVVJFX1JQSV9SRVBPUlQpcFJlcG9ydEJ1ZjsKKwkJCQkJcHRyID0gZWlkX3B0ci0+T2N0ZXQgKyAzOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+Q2hOdW0sIHB0ciwgMSk7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlU3RhcnRUaW1lLCBwdHIgKyAxLCA4KTsKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPk1lYXN1cmVEdXJhdGlvbiwgcHRyICsgOSwgMik7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5SUElfRGVuc2l0eSwgcHRyICsgMTEsIDgpOworCQkJCX0KKwkJCQlyZXN1bHQgPSBUUlVFOworICAgICAgICAgICAgICAgIGJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisJCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopZWlkX3B0ciArIDIgKyBlaWRfcHRyLT5MZW4pOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVFBDIFJlcXVlc3QgYWN0aW9uIGZyYW1lIHNhbml0eSBjaGVjay4KKworCVBhcmFtZXRyczoKKwkJMS4gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisJCTIuIG1lc3NhZ2UgbGVuZ3RoLgorCQkzLiBEaWFsb2cgVG9rZW4uCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBCT09MRUFOIFBlZXJUcGNSZXFTYW5pdHkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVk9JRCAqcE1zZywKKwlJTiBVTE9ORyBNc2dMZW4sCisJT1VUIFBVSU5UOCBwRGlhbG9nVG9rZW4pCit7CisJUEZSQU1FXzgwMl8xMSBGciA9IChQRlJBTUVfODAyXzExKXBNc2c7CisJUFVDSEFSIHBGcmFtZVB0ciA9IEZyLT5PY3RldDsKKwlCT09MRUFOIHJlc3VsdCA9IEZBTFNFOworCVBFSURfU1RSVUNUIGVpZF9wdHI7CisKKwlNc2dMZW4gLT0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCisJLy8gc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuCisJcEZyYW1lUHRyICs9IDI7CisJTXNnTGVuIC09IDI7CisKKwlpZiAocERpYWxvZ1Rva2VuID09IE5VTEwpCisJCXJldHVybiByZXN1bHQ7CisKKwlOZGlzTW92ZU1lbW9yeShwRGlhbG9nVG9rZW4sIHBGcmFtZVB0ciwgMSk7CisJcEZyYW1lUHRyICs9IDE7CisJTXNnTGVuIC09IDE7CisKKwllaWRfcHRyID0gKFBFSURfU1RSVUNUKXBGcmFtZVB0cjsKKwl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChQVUNIQVIpcEZyYW1lUHRyICsgTXNnTGVuKSkKKwl7CisJCXN3aXRjaChlaWRfcHRyLT5FaWQpCisJCXsKKwkJCWNhc2UgSUVfVFBDX1JFUVVFU1Q6CisJCQkJcmVzdWx0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJfQorCQllaWRfcHRyID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKWVpZF9wdHIgKyAyICsgZWlkX3B0ci0+TGVuKTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRQQyBSZXBvcnQgYWN0aW9uIGZyYW1lIHNhbml0eSBjaGVjay4KKworCVBhcmFtZXRyczoKKwkJMS4gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisJCTIuIG1lc3NhZ2UgbGVuZ3RoLgorCQkzLiBEaWFsb2cgVG9rZW4uCisJCTQuIFRQQyBSZXBvcnQgSUUuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBCT09MRUFOIFBlZXJUcGNSZXBTYW5pdHkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVk9JRCAqcE1zZywKKwlJTiBVTE9ORyBNc2dMZW4sCisJT1VUIFBVSU5UOCBwRGlhbG9nVG9rZW4sCisJT1VUIFBUUENfUkVQT1JUX0lORk8gcFRwY1JlcEluZm8pCit7CisJUEZSQU1FXzgwMl8xMSBGciA9IChQRlJBTUVfODAyXzExKXBNc2c7CisJUFVDSEFSIHBGcmFtZVB0ciA9IEZyLT5PY3RldDsKKwlCT09MRUFOIHJlc3VsdCA9IEZBTFNFOworCVBFSURfU1RSVUNUIGVpZF9wdHI7CisKKwlNc2dMZW4gLT0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCisJLy8gc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuCisJcEZyYW1lUHRyICs9IDI7CisJTXNnTGVuIC09IDI7CisKKwlpZiAocERpYWxvZ1Rva2VuID09IE5VTEwpCisJCXJldHVybiByZXN1bHQ7CisKKwlOZGlzTW92ZU1lbW9yeShwRGlhbG9nVG9rZW4sIHBGcmFtZVB0ciwgMSk7CisJcEZyYW1lUHRyICs9IDE7CisJTXNnTGVuIC09IDE7CisKKwllaWRfcHRyID0gKFBFSURfU1RSVUNUKXBGcmFtZVB0cjsKKwl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChQVUNIQVIpcEZyYW1lUHRyICsgTXNnTGVuKSkKKwl7CisJCXN3aXRjaChlaWRfcHRyLT5FaWQpCisJCXsKKwkJCWNhc2UgSUVfVFBDX1JFUE9SVDoKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcFRwY1JlcEluZm8tPlR4UHdyLCBlaWRfcHRyLT5PY3RldCwgMSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBUcGNSZXBJbmZvLT5MaW5rTWFyZ2luLCBlaWRfcHRyLT5PY3RldCArIDEsIDEpOworCQkJCXJlc3VsdCA9IFRSVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KKwkJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKillaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQgYWN0aW9uIGZyYW1lIGhhbmRsZXIuCisKKwlQYXJhbWV0cnM6CisJCUVsbWUgLSBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworc3RhdGljIFZPSUQgUGVlckNoU3dBbm5BY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCUNIX1NXX0FOTl9JTkZPIENoU3dBbm5JbmZvOworCVBGUkFNRV84MDJfMTEgcEZyID0gKFBGUkFNRV84MDJfMTEpRWxlbS0+TXNnOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCVVDSEFSIGluZGV4ID0gMCwgQ2hhbm5lbCA9IDAsIE5ld0NoYW5uZWwgPSAwOworCVVMT05HIEJzc2lkeCA9IDA7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlOZGlzWmVyb01lbW9yeSgmQ2hTd0FubkluZm8sIHNpemVvZihDSF9TV19BTk5fSU5GTykpOworCWlmICghIFBlZXJDaFN3QW5uU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZDaFN3QW5uSW5mbykpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJbnZhbGlkIENoYW5uZWwgU3dpdGNoIEFjdGlvbiBGcmFtZS5cbiIpKTsKKwkJcmV0dXJuOworCX0KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCisJeworCQlCc3NpZHggPSBCc3NUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBwRnItPkhkci5BZGRyMywgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCWlmIChCc3NpZHggPT0gQlNTX05PVF9GT1VORCkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckNoU3dBbm5BY3Rpb24gLSBCc3NpZHggaXMgbm90IGZvdW5kXG4iKSk7CisJCQlyZXR1cm47CisJCX0KKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJcbioqKipCc3NpZHggaXMgJWQsIENoYW5uZWwgPSAlZFxuIiwgaW5kZXgsIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLkNoYW5uZWwpKTsKKwkJaGV4X2R1bXAoIlNTSUQiLHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLkJzc2lkICw2KTsKKworCQlDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKKwkJTmV3Q2hhbm5lbCA9IENoU3dBbm5JbmZvLkNoYW5uZWw7CisKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJiAoTmV3Q2hhbm5lbCAhPSAwKSAmJiAoQ2hhbm5lbCAhPSBOZXdDaGFubmVsKSkKKwkJeworCQkJLy8gU3dpdGNoaW5nIHRvIGNoYW5uZWwgMSBjYW4gcHJldmVudCBmcm9tIHJlc2Nhbm5pbmcgdGhlIGN1cnJlbnQgY2hhbm5lbCBpbW1lZGlhdGVseSAoYnkgYXV0byByZWNvbm5lY3Rpb24pLgorCQkJLy8gSW4gYWRkaXRpb24sIGNsZWFyIHRoZSBNTE1FIHF1ZXVlIGFuZCB0aGUgc2NhbiB0YWJsZSB0byBkaXNjYXJkIHRoZSBSWCBwYWNrZXRzIGFuZCBwcmV2aW91cyBzY2FubmluZyByZXN1bHRzLgorCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCAxLCBGQUxTRSk7CisJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCAxKTsKKwkJICAgIExpbmtEb3duKHBBZCwgRkFMU0UpOworCQkJTWxtZVF1ZXVlSW5pdCgmcEFkLT5NbG1lLlF1ZXVlKTsKKwkJCUJzc1RhYmxlSW5pdCgmcEFkLT5TY2FuVGFiKTsKKwkJICAgIFJUTVB1c2VjRGVsYXkoMTAwMDAwMCk7CQkvLyB1c2UgZGVsYXkgdG8gcHJldmVudCBTVEEgZG8gcmVhc3NvYworCisJCQkvLyBjaGFubmVsIHNhbml0eSBjaGVjaworCQkJZm9yIChpbmRleCA9IDAgOyBpbmRleCA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGluZGV4KyspCisJCQl7CisJCQkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLkNoYW5uZWwgPT0gTmV3Q2hhbm5lbCkKKwkJCQl7CisJCQkJCXBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLkNoYW5uZWwgPSBOZXdDaGFubmVsOworCQkJCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsID0gTmV3Q2hhbm5lbDsKKwkJCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCImJiYmJiYmJiYmJiYmJiYmUGVlckNoU3dBbm5BY3Rpb24gLSBTVEEgcmVjZWl2ZSBjaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgSUUgKE5ldyBDaGFubmVsID0lZClcbiIsIE5ld0NoYW5uZWwpKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlpZiAoaW5kZXggPj0gcEFkLT5DaGFubmVsTGlzdE51bSkKKwkJCXsKKwkJCQlEQkdQUklOVF9FUlIoKCImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJlBlZXJDaFN3QW5uQWN0aW9uKGNhbiBub3QgZmluZCBOZXcgQ2hhbm5lbD0lZCBpbiBDaGFubmVsTGlzdFslZF1cbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+Q2hhbm5lbExpc3ROdW0pKTsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCXJldHVybjsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCU1lYXN1cmVtZW50IFJlcXVlc3QgYWN0aW9uIGZyYW1lIGhhbmRsZXIuCisKKwlQYXJhbWV0cnM6CisJCUVsbWUgLSBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworc3RhdGljIFZPSUQgUGVlck1lYXN1cmVSZXFBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVBGUkFNRV84MDJfMTEgcEZyID0gKFBGUkFNRV84MDJfMTEpRWxlbS0+TXNnOworCVVJTlQ4IERpYWxvZ1Rva2VuOworCU1FQVNVUkVfUkVRX0lORk8gTWVhc3VyZVJlcUluZm87CisJTUVBU1VSRV9SRVBPUlRfTU9ERSBSZXBvcnRNb2RlOworCisJaWYoUGVlck1lYXN1cmVSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgJkRpYWxvZ1Rva2VuLCAmTWVhc3VyZVJlcUluZm8pKQorCXsKKwkJUmVwb3J0TW9kZS53b3JkID0gMDsKKwkJUmVwb3J0TW9kZS5maWVsZC5JbmNhcGFibGUgPSAxOworCQlFbnF1ZXVlTWVhc3VyZW1lbnRSZXAocEFkLCBwRnItPkhkci5BZGRyMiwgRGlhbG9nVG9rZW4sIE1lYXN1cmVSZXFJbmZvLlRva2VuLCBSZXBvcnRNb2RlLndvcmQsIE1lYXN1cmVSZXFJbmZvLlJlcVR5cGUsIDAsIE5VTEwpOworCX0KKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlNZWFzdXJlbWVudCBSZXBvcnQgYWN0aW9uIGZyYW1lIGhhbmRsZXIuCisKKwlQYXJhbWV0cnM6CisJCUVsbWUgLSBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworc3RhdGljIFZPSUQgUGVlck1lYXN1cmVSZXBvcnRBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCU1FQVNVUkVfUkVQT1JUX0lORk8gTWVhc3VyZVJlcG9ydEluZm87CisJUEZSQU1FXzgwMl8xMSBwRnIgPSAoUEZSQU1FXzgwMl8xMSlFbGVtLT5Nc2c7CisJVUlOVDggRGlhbG9nVG9rZW47CisJUFVJTlQ4IHBNZWFzdXJlUmVwb3J0SW5mbzsKKworLy8JaWYgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIICE9IFRSVUUpCisvLwkJcmV0dXJuOworCisJaWYgKChwTWVhc3VyZVJlcG9ydEluZm8gPSBrbWFsbG9jKHNpemVvZihNRUFTVVJFX1JQSV9SRVBPUlQpLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIHVuYWJsZSB0byBhbGxvYyBtZW1vcnkgZm9yIG1lYXN1cmUgcmVwb3J0IGJ1ZmZlciAoc2l6ZT0lZCkuXG4iLCBfX2Z1bmNfXywgc2l6ZW9mKE1FQVNVUkVfUlBJX1JFUE9SVCkpKTsKKwkJcmV0dXJuOworCX0KKworCU5kaXNaZXJvTWVtb3J5KCZNZWFzdXJlUmVwb3J0SW5mbywgc2l6ZW9mKE1FQVNVUkVfUkVQT1JUX0lORk8pKTsKKwlOZGlzWmVyb01lbW9yeShwTWVhc3VyZVJlcG9ydEluZm8sIHNpemVvZihNRUFTVVJFX1JQSV9SRVBPUlQpKTsKKwlpZiAoUGVlck1lYXN1cmVSZXBvcnRTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgJkRpYWxvZ1Rva2VuLCAmTWVhc3VyZVJlcG9ydEluZm8sIHBNZWFzdXJlUmVwb3J0SW5mbykpCisJeworCQlkbyB7CisJCQlQTUVBU1VSRV9SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTDsKKworCQkJLy8gTm90IGEgYXV0b25vbW91cyBtZWFzdXJlIHJlcG9ydC4KKwkJCS8vIGNoZWNrIHRoZSBkaWFsb2cgdG9rZW4gZmllbGQuIGRyb3AgaXQgaWYgdGhlIGRpYWxvZyB0b2tlbiBkb2Vzbid0IG1hdGNoLgorCQkJaWYgKChEaWFsb2dUb2tlbiAhPSAwKQorCQkJCSYmICgocEVudHJ5ID0gTWVhc3VyZVJlcUxvb2tVcChwQWQsIERpYWxvZ1Rva2VuKSkgPT0gTlVMTCkpCisJCQkJYnJlYWs7CisKKwkJCWlmIChwRW50cnkgIT0gTlVMTCkKKwkJCQlNZWFzdXJlUmVxRGVsZXRlKHBBZCwgcEVudHJ5LT5EaWFsb2dUb2tlbik7CisKKwkJCWlmIChNZWFzdXJlUmVwb3J0SW5mby5SZXBvcnRUeXBlID09IFJNX0JBU0lDKQorCQkJeworCQkJCVBNRUFTVVJFX0JBU0lDX1JFUE9SVCBwQmFzaWNSZXBvcnQgPSAoUE1FQVNVUkVfQkFTSUNfUkVQT1JUKXBNZWFzdXJlUmVwb3J0SW5mbzsKKwkJCQlpZiAoKHBCYXNpY1JlcG9ydC0+TWFwLmZpZWxkLlJhZGFyKQorCQkJCQkmJiAoRGZzUmVxdWlyZW1lbnRDaGVjayhwQWQsIHBCYXNpY1JlcG9ydC0+Q2hOdW0pID09IFRSVUUpKQorCQkJCXsKKwkJCQkJTm90aWZ5Q2hTd0FublRvUGVlckFQcyhwQWQsIHBGci0+SGRyLkFkZHIxLCBwRnItPkhkci5BZGRyMiwgMSwgcEJhc2ljUmVwb3J0LT5DaE51bSk7CisJCQkJCVN0YXJ0REZTUHJvY2VkdXJlKHBBZCwgcEJhc2ljUmVwb3J0LT5DaE51bSwgMSk7CisJCQkJfQorCQkJfQorCQl9IHdoaWxlIChGQUxTRSk7CisJfQorCWVsc2UKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSW52YWxpZCBNZWFzdXJlbWVudCBSZXBvcnQgRnJhbWUuXG4iKSk7CisKKwlrZnJlZShwTWVhc3VyZVJlcG9ydEluZm8pOworCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRQQyBSZXF1ZXN0IGFjdGlvbiBmcmFtZSBoYW5kbGVyLgorCisJUGFyYW1ldHJzOgorCQlFbG1lIC0gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBWT0lEIFBlZXJUcGNSZXFBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVBGUkFNRV84MDJfMTEgcEZyID0gKFBGUkFNRV84MDJfMTEpRWxlbS0+TXNnOworCVBVQ0hBUiBwRnJhbWVQdHIgPSBwRnItPk9jdGV0OworCVVJTlQ4IERpYWxvZ1Rva2VuOworCVVJTlQ4IFR4UHdyID0gR2V0Q3VyVHhQd3IocEFkLCBFbGVtLT5XY2lkKTsKKwlVSU5UOCBMaW5rTWFyZ2luID0gMDsKKwlDSEFSIFJlYWxSc3NpOworCisJLy8gbGluayBtYXJnaW46IFJhdGlvIG9mIHRoZSByZWNlaXZlZCBzaWduYWwgcG93ZXIgdG8gdGhlIG1pbmltdW0gZGVzaXJlZCBieSB0aGUgc3RhdGlvbiAoU1RBKS4gVGhlCisJLy8JCQkJU1RBIG1heSBpbmNvcnBvcmF0ZSByYXRlIGluZm9ybWF0aW9uIGFuZCBjaGFubmVsIGNvbmRpdGlvbnMsIGluY2x1ZGluZyBpbnRlcmZlcmVuY2UsIGludG8gaXRzIGNvbXB1dGF0aW9uCisJLy8JCQkJb2YgbGluayBtYXJnaW4uCisKKwlSZWFsUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kwLCBSU1NJXzApLAorCQkJCQkJCQlDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTEsIFJTU0lfMSksCisJCQkJCQkJCUNvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMiwgUlNTSV8yKSk7CisKKwkvLyBza2lwIENhdGVnb3J5IGFuZCBhY3Rpb24gY29kZS4KKwlwRnJhbWVQdHIgKz0gMjsKKworCS8vIERpYWxvZyB0b2tlbi4KKwlOZGlzTW92ZU1lbW9yeSgmRGlhbG9nVG9rZW4sIHBGcmFtZVB0ciwgMSk7CisKKwlMaW5rTWFyZ2luID0gKFJlYWxSc3NpIC8gTUlOX1JDVl9QV1IpOworCWlmIChQZWVyVHBjUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZEaWFsb2dUb2tlbikpCisJCUVucXVldWVUUENSZXAocEFkLCBwRnItPkhkci5BZGRyMiwgRGlhbG9nVG9rZW4sIFR4UHdyLCBMaW5rTWFyZ2luKTsKKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUUEMgUmVwb3J0IGFjdGlvbiBmcmFtZSBoYW5kbGVyLgorCisJUGFyYW1ldHJzOgorCQlFbG1lIC0gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBWT0lEIFBlZXJUcGNSZXBBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVJTlQ4IERpYWxvZ1Rva2VuOworCVRQQ19SRVBPUlRfSU5GTyBUcGNSZXBJbmZvOworCVBUUENfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEw7CisKKwlOZGlzWmVyb01lbW9yeSgmVHBjUmVwSW5mbywgc2l6ZW9mKFRQQ19SRVBPUlRfSU5GTykpOworCWlmIChQZWVyVHBjUmVwU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZEaWFsb2dUb2tlbiwgJlRwY1JlcEluZm8pKQorCXsKKwkJaWYgKChwRW50cnkgPSBUcGNSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbikpICE9IE5VTEwpCisJCXsKKwkJCVRwY1JlcURlbGV0ZShwQWQsIHBFbnRyeS0+RGlhbG9nVG9rZW4pOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6IERpYWxvZ1Rva2VuPSV4LCBUeFB3cj0lZCwgTGlua01hcmdpbj0lZFxuIiwKKwkJCQlfX2Z1bmNfXywgRGlhbG9nVG9rZW4sIFRwY1JlcEluZm8uVHhQd3IsIFRwY1JlcEluZm8uTGlua01hcmdpbikpOworCQl9CisJfQorCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVNwZWN0cnVuIGFjdGlvbiBmcmFtZXMgSGFuZGxlciBzdWNoIGFzIGNoYW5uZWwgc3dpdGNoIGFubm91Y2VtZW50LAorCQltZWFzdXJlbWVudCByZXBvcnQsIG1lYXN1cmVtZW50IHJlcXVlc3QgYWN0aW9ucyBmcmFtZXMuCisKKwlQYXJhbWV0cnM6CisJCUVsbWUgLSBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyU3BlY3RydW1BY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCisJVUNIQVIJQWN0aW9uID0gRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMV07CisKKwlpZiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggIT0gVFJVRSkKKwkJcmV0dXJuOworCisJc3dpdGNoKEFjdGlvbikKKwl7CisJCWNhc2UgU1BFQ19NUlE6CisJCQkvLyBjdXJyZW50IHJ0Mjg2MCB1bmFibGUgZG8gc3VjaCBtZWFzdXJlIHNwZWNpZmllZCBpbiBNZWFzdXJlbWVudCBSZXF1ZXN0LgorCQkJLy8gcmVqZWN0IGFsbCBtZWFzdXJlbWVudCByZXF1ZXN0LgorCQkJUGVlck1lYXN1cmVSZXFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU1BFQ19NUlA6CisJCQlQZWVyTWVhc3VyZVJlcG9ydEFjdGlvbihwQWQsIEVsZW0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBTUEVDX1RQQ1JROgorCQkJUGVlclRwY1JlcUFjdGlvbihwQWQsIEVsZW0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBTUEVDX1RQQ1JQOgorCQkJUGVlclRwY1JlcEFjdGlvbihwQWQsIEVsZW0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBTUEVDX0NIQU5ORUxfU1dJVENIOgoreworI2lmZGVmIERPVDExTl9EUkFGVDMKKwkJCQlTRUNfQ0hBX09GRlNFVF9JRQlTZWNvbmRhcnk7CisJCQkJQ0hBX1NXSVRDSF9BTk5PVU5DRV9JRQlDaGFubmVsU3dpdGNoOworCisJCQkJLy8gODAyLjExaCBvbmx5IGhhcyBDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQgSUUuCisJCQkJUlRNUE1vdmVNZW1vcnkoJkNoYW5uZWxTd2l0Y2gsICZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSs0XSwgc2l6ZW9mIChDSEFfU1dJVENIX0FOTk9VTkNFX0lFKSk7CisKKwkJCQkvLyA4MDIuMTFuIEQzLjAzIGFkZHMgc2Vjb25kYXJ5IGNoYW5uZWwgb2Zmc2V0IGVsZW1lbnQgaW4gdGhlIGVuZC4KKwkJCQlpZiAoRWxlbS0+TXNnTGVuID09ICAoTEVOR1RIXzgwMl8xMSArIDIgKyBzaXplb2YgKENIQV9TV0lUQ0hfQU5OT1VOQ0VfSUUpICsgc2l6ZW9mIChTRUNfQ0hBX09GRlNFVF9JRSkpKQorCQkJCXsKKwkJCQkJUlRNUE1vdmVNZW1vcnkoJlNlY29uZGFyeSwgJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzldLCBzaXplb2YgKFNFQ19DSEFfT0ZGU0VUX0lFKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVNlY29uZGFyeS5TZWNvbmRhcnlDaGFubmVsT2Zmc2V0ID0gMDsKKwkJCQl9CisKKwkJCQlpZiAoKEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdID09IElFX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVCkgJiYgKEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzNdID09IDMpKQorCQkJCXsKKwkJCQkJQ2hhbm5lbFN3aXRjaEFjdGlvbihwQWQsIEVsZW0tPldjaWQsIENoYW5uZWxTd2l0Y2guTmV3Q2hhbm5lbCwgU2Vjb25kYXJ5LlNlY29uZGFyeUNoYW5uZWxPZmZzZXQpOworCQkJCX0KKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCit9CisJCQlQZWVyQ2hTd0FubkFjdGlvbihwQWQsIEVsZW0pOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlQYXJhbWV0cnM6CisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0lOVCBTZXRfTWVhc3VyZVJlcV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVSU5UIEFpZCA9IDE7CisJVUlOVCBBcmdJZHg7CisJUFVDSEFSIHRoaXNDaGFyOworCisJTUVBU1VSRV9SRVFfTU9ERSBNZWFzdXJlUmVxTW9kZTsKKwlVSU5UOCBNZWFzdXJlUmVxVG9rZW4gPSBSYW5kb21CeXRlKHBBZCk7CisJVUlOVDggTWVhc3VyZVJlcVR5cGUgPSBSTV9CQVNJQzsKKwlVSU5UOCBNZWFzdXJlQ2ggPSAxOworCisJQXJnSWR4ID0gMTsKKwl3aGlsZSAoKHRoaXNDaGFyID0gc3Ryc2VwKChjaGFyICoqKSZhcmcsICItIikpICE9IE5VTEwpCisJeworCQlzd2l0Y2goQXJnSWR4KQorCQl7CisJCQljYXNlIDE6CS8vIEFpZC4KKwkJCQlBaWQgPSBzaW1wbGVfc3RydG9sKHRoaXNDaGFyLCAwLCAxNik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMjogLy8gTWVhc3VyZW1lbnQgUmVxdWVzdCBUeXBlLgorCQkJCU1lYXN1cmVSZXFUeXBlID0gc2ltcGxlX3N0cnRvbCh0aGlzQ2hhciwgMCwgMTYpOworCQkJCWlmIChNZWFzdXJlUmVxVHlwZSA+IDMpCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogdW5rbm93IE1lYXN1cmVSZXFUeXBlKCVkKVxuIiwgX19mdW5jX18sIE1lYXN1cmVSZXFUeXBlKSk7CisJCQkJCXJldHVybiBUUlVFOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSAzOiAvLyBNZWFzdXJlbWVudCBjaGFubmVsLgorCQkJCU1lYXN1cmVDaCA9IHNpbXBsZV9zdHJ0b2wodGhpc0NoYXIsIDAsIDE2KTsKKwkJCQlicmVhazsKKwkJfQorCQlBcmdJZHgrKzsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6QWlkID0gJWQsIE1lYXN1cmVSZXFUeXBlPSVkIE1lYXN1cmVDaD0lZFxuIiwgX19mdW5jX18sIEFpZCwgTWVhc3VyZVJlcVR5cGUsIE1lYXN1cmVDaCkpOworCWlmICghVkFMSURfV0NJRChBaWQpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHVua25vdyBzdGEgb2YgQWlkKCVkKVxuIiwgX19mdW5jX18sIEFpZCkpOworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlNZWFzdXJlUmVxTW9kZS53b3JkID0gMDsKKwlNZWFzdXJlUmVxTW9kZS5maWVsZC5FbmFibGUgPSAxOworCisJTWVhc3VyZVJlcUluc2VydChwQWQsIE1lYXN1cmVSZXFUb2tlbik7CisKKwlFbnF1ZXVlTWVhc3VyZW1lbnRSZXEocEFkLCBwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uQWRkciwKKwkJTWVhc3VyZVJlcVRva2VuLCBNZWFzdXJlUmVxTW9kZS53b3JkLCBNZWFzdXJlUmVxVHlwZSwgTWVhc3VyZUNoLCAyMDAwKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQgU2V0X1RwY1JlcV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVSU5UIEFpZDsKKworCVVJTlQ4IFRwY1JlcVRva2VuID0gUmFuZG9tQnl0ZShwQWQpOworCisJQWlkID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDE2KTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpBaWQgPSAlZFxuIiwgX19mdW5jX18sIEFpZCkpOworCWlmICghVkFMSURfV0NJRChBaWQpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHVua25vdyBzdGEgb2YgQWlkKCVkKVxuIiwgX19mdW5jX18sIEFpZCkpOworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlUcGNSZXFJbnNlcnQocEFkLCBUcGNSZXFUb2tlbik7CisKKwlFbnF1ZXVlVFBDUmVxKHBBZCwgcEFkLT5NYWNUYWIuQ29udGVudFtBaWRdLkFkZHIsIFRwY1JlcVRva2VuKTsKKworCXJldHVybiBUUlVFOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbmZpZy5tayBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1N2Q3YmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbmZpZy5tawpAQCAtMCwwICsxLDI0NSBAQAorIyBTdXBwb3J0IEFURSBmdW5jdGlvbgorSEFTX0FURT1uCisKKyMgU3VwcG9ydCAyOHh4IFFBIEFURSBmdW5jdGlvbgorSEFTXzI4eHhfUUE9bgorCisjIFN1cHBvcnQgV3BhX1N1cHBsaWNhbnQKK0hBU19XUEFfU1VQUExJQ0FOVD1uCisKKyMgU3VwcG9ydCBOYXRpdmUgV3BhU3VwcGxpY2FudCBmb3IgTmV0d29yayBNYWdhbmdlcgorSEFTX05BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUPW4KKworI1N1cHBvcnQgTmV0IGludGVyZmFjZSBibG9jayB3aGlsZSBUeC1TdyBxdWV1ZSBmdWxsCitIQVNfQkxPQ0tfTkVUX0lGPW4KKworI1N1cHBvcnQgREZTIGZ1bmN0aW9uCitIQVNfREZTX1NVUFBPUlQ9bgorCisjU3VwcG9ydCBDYXJyaWVyLVNlbnNlIGZ1bmN0aW9uCitIQVNfQ1NfU1VQUE9SVD1uCisKKyNpZmRlZiBNVUxUSV9DQVJECisjIFN1cHBvcnQgZm9yIE11bHRpcGxlIENhcmRzCitIQVNfTUNfU1VQUE9SVD1uCisjZW5kaWYgLy8gTVVMVElfQ0FSRCAvLworCisjU3VwcG9ydCBmb3IgSUVFRTgwMi4xMWUgRExTCitIQVNfUU9TX0RMU19TVVBQT1JUPW4KKworI1N1cHBvcnQgZm9yIEVYVF9DSEFOTkVMCitIQVNfRVhUX0JVSUxEX0NIQU5ORUxfTElTVD1uCisKKyNTdXBwb3J0IGZvciBOZXQtU05NUAorSEFTX1NOTVBfU1VQUE9SVD1uCisKKyNTdXBwb3J0IGZlYXR1cmVzIG9mIFNpbmdsZSBTS1UuCitIQVNfU0lOR0xFX1NLVV9TVVBQT1JUPW4KKworI1N1cHBvcnQgZmVhdHVyZXMgb2YgODAyLjExbgorSEFTX0RPVDExX05fU1VQUE9SVD15CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitDQyA6PSAkKENST1NTX0NPTVBJTEUpZ2NjCitMRCA6PSAkKENST1NTX0NPTVBJTEUpbGQKKworV0ZMQUdTIDo9IC1EQUdHUkVHQVRJT05fU1VQUE9SVCAtRFBJR0dZQkFDS19TVVBQT1JUIC1EV01NX1NVUFBPUlQgIC1ETElOVVggLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXRyaWdyYXBocworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorIyBjb25maWcgZm9yIFNUQSBtb2RlCisKK2lmZXEgKCQoUlQyOHh4X01PREUpLFNUQSkKK1dGTEFHUyArPSAtRENPTkZJR19TVEFfU1VQUE9SVCAtRERCRworCitpZmVxICgkKEhBU19XUEFfU1VQUExJQ0FOVCkseSkKK1dGTEFHUyArPSAtRFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKK2VuZGlmCisKK2lmZXEgKCQoSEFTX05BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUKSx5KQorV0ZMQUdTICs9IC1ETkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKK2VuZGlmCisKK2lmZXEgKCQoSEFTX0FURSkseSkKK1dGTEFHUyArPSAtRFJBTElOS19BVEUKK2lmZXEgKCQoSEFTXzI4eHhfUUEpLHkpCitXRkxBR1MgKz0gLURSQUxJTktfMjh4eF9RQQorZW5kaWYKK2VuZGlmCisKK2lmZXEgKCQoSEFTX1NOTVBfU1VQUE9SVCkseSkKK1dGTEFHUyArPSAtRFNOTVBfU1VQUE9SVAorZW5kaWYKKworaWZlcSAoJChIQVNfUU9TX0RMU19TVVBQT1JUKSx5KQorV0ZMQUdTICs9IC1EUU9TX0RMU19TVVBQT1JUCitlbmRpZgorCitpZmVxICgkKEhBU19ET1QxMV9OX1NVUFBPUlQpLHkpCitXRkxBR1MgKz0gLURET1QxMV9OX1NVUFBPUlQKK2VuZGlmCisKK2lmZXEgKCQoSEFTX0NTX1NVUFBPUlQpLHkpCitXRkxBR1MgKz0gLURDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCitlbmRpZgorCitpZmVxICgkKEhBU19TSU5HTEVfU0tVX1NVUFBPUlQpLHkpCitXRkxBR1MgKz0gLURTSU5HTEVfU0tVCitlbmRpZgorCitlbmRpZgorIyBlbmRpZiBvZiBpZmVxICgkKFJUMjh4eF9NT0RFKSxTVEEpCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjCisjIENvbW1vbiBjb21waWxlciBmbGFnCisjCisKKworaWZlcSAoJChIQVNfRVhUX0JVSUxEX0NIQU5ORUxfTElTVCkseSkKK1dGTEFHUyArPSAtREVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKK2VuZGlmCisKK2lmZXEgKCQoQ0hJUFNFVCksMjg2MCkKK1dGTEFHUyArPS1EUlQyODYwCitlbmRpZgorCitpZmVxICgkKENISVBTRVQpLDI4NzApCitXRkxBR1MgKz0tRFJUMjg3MAorZW5kaWYKKworaWZlcSAoJChQTEFURk9STSksNVZUKQorI1dGTEFHUyArPSAtRENPTkZJR181VlRfRU5IQU5DRQorZW5kaWYKKworaWZlcSAoJChIQVNfQkxPQ0tfTkVUX0lGKSx5KQorV0ZMQUdTICs9IC1EQkxPQ0tfTkVUX0lGCitlbmRpZgorCitpZmVxICgkKEhBU19ERlNfU1VQUE9SVCkseSkKK1dGTEFHUyArPSAtRERGU19TVVBQT1JUCitlbmRpZgorCisjaWZkZWYgTVVMVElfQ0FSRAoraWZlcSAoJChIQVNfTUNfU1VQUE9SVCkseSkKK1dGTEFHUyArPSAtRE1VTFRJUExFX0NBUkRfU1VQUE9SVAorZW5kaWYKKyNlbmRpZiAvLyBNVUxUSV9DQVJEIC8vCisKK2lmZXEgKCQoSEFTX0xMVEQpLHkpCitXRkxBR1MgKz0gLURMTFREX1NVUFBPUlQKK2VuZGlmCisKK2lmZXEgKCQoUExBVEZPUk0pLElYUCkKK1dGTEFHUyArPSAtRFJUX0JJR19FTkRJQU4KK2VuZGlmCisKK2lmZXEgKCQoUExBVEZPUk0pLElLQU5PU19WMTYwKQorV0ZMQUdTICs9IC1EUlRfQklHX0VORElBTiAtRElLQU5PU19WWF8xWDAKK2VuZGlmCisKK2lmZXEgKCQoUExBVEZPUk0pLElLQU5PU19WMTgwKQorV0ZMQUdTICs9IC1EUlRfQklHX0VORElBTiAtRElLQU5PU19WWF8xWDAKK2VuZGlmCisKK2lmZXEgKCQoUExBVEZPUk0pLElORl9UV0lOUEFTUykKK1dGTEFHUyArPSAtRFJUX0JJR19FTkRJQU4gLURJTkZfVFdJTlBBU1MKK2VuZGlmCisKK2lmZXEgKCQoUExBVEZPUk0pLElORl9EQU5VQkUpCitXRkxBR1MgKz0gLURJTkZfREFOVUJFIC1EUlRfQklHX0VORElBTgorZW5kaWYKKworaWZlcSAoJChQTEFURk9STSksQ0FWTV9PQ1RFT04pCitXRkxBR1MgKz0gLURSVF9CSUdfRU5ESUFOCitlbmRpZgorCitpZmVxICgkKFBMQVRGT1JNKSxCUkNNXzYzNTgpCitXRkxBR1MgKz0gLURSVF9CSUdfRU5ESUFOCitlbmRpZgorCitpZmVxICgkKFBMQVRGT1JNKSxJTkZfQU1BWk9OX1NFKQorI1dGTEFHUyArPSAtRFJUX0JJR19FTkRJQU4gLURJTkZfQU1BWk9OX1NFIC1EQkdfRlRfU1VQUE9SVAorV0ZMQUdTICs9IC1EUlRfQklHX0VORElBTiAtRElORl9BTUFaT05fU0UKK2VuZGlmCisKKyNrZXJuZWwgYnVpbGQgb3B0aW9ucyBmb3IgMi40CisjIG1vdmUgdG8gTWFrZWZpbGUgb3V0c2lkZSBMSU5VWF9TUkMgOj0gL29wdC9zdGFyL2tlcm5lbC9saW51eC0yLjQuMjctc3RhcgorCitpZmVxICgkKFBMQVRGT1JNKSxTVEFSKQorQ0ZMQUdTIDo9IC1EX19LRVJORUxfXyAtSSQoTElOVVhfU1JDKS9pbmNsdWRlIC1JJChSVDI4eHhfRElSKS9pbmNsdWRlIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby10cmlncmFwaHMgLU8yIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1mbm8tY29tbW9uIC1VYXJtIC1mbm8tY29tbW9uIC1waXBlIC1tYXBjcy0zMiAtRF9fTElOVVhfQVJNX0FSQ0hfXz00IC1tYXJjaD1hcm12NCAgLW1zaG9ydC1sb2FkLWJ5dGVzIC1tc29mdC1mbG9hdCAtVWFybSAtRE1PRFVMRSAtRE1PRFZFUlNJT05TIC1pbmNsdWRlICQoTElOVVhfU1JDKS9pbmNsdWRlL2xpbnV4L21vZHZlcnNpb25zLmggJChXRkxBR1MpCisKK2V4cG9ydCBDRkxBR1MKK2VuZGlmCisKK2lmZXEgKCQoUExBVEZPUk0pLFNJR01BKQorQ0ZMQUdTIDo9IC1EX19LRVJORUxfXyAtSSQoUlQyOHh4X0RJUikvaW5jbHVkZSAtSSQoTElOVVhfU1JDKS9pbmNsdWRlIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUvYXNtL2djYyAtSSQoTElOVVhfU1JDKS9pbmNsdWRlL2FzbS1taXBzL21hY2gtdGFuZ28yIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC10YW5nbzIgLURFTTg2WFhfQ0hJUD1FTTg2WFhfQ0hJUElEX1RBTkdPMiAtREVNODZYWF9SRVZJU0lPTj02IC1JJChMSU5VWF9TUkMpL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1nZW5lcmljIC1JJChSVDI4NjBfRElSKS9pbmNsdWRlIC1XYWxsIC1XdW5kZWYgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXRyaWdyYXBocyAtZm5vLXN0cmljdC1hbGlhc2luZyAtZm5vLWNvbW1vbiAtZmZyZWVzdGFuZGluZyAtTzIgICAgIC1mb21pdC1mcmFtZS1wb2ludGVyIC1HIDAgLW1uby1hYmljYWxscyAtZm5vLXBpYyAtcGlwZSAgLW1hYmk9MzIgLW1hcmNoPW1pcHMzMnIyIC1XYSwtMzIgLVdhLC1tYXJjaD1taXBzMzJyMiAtV2EsLW1pcHMzMnIyIC1XYSwtLXRyYXAgLURNT0RVTEUgJChXRkxBR1MpCisKK2V4cG9ydCBDRkxBR1MKK2VuZGlmCisKK2lmZXEgKCQoUExBVEZPUk0pLFNJR01BXzg2MjIpCitDRkxBR1MgOj0gLURfX0tFUk5FTF9fIC1JJChDUk9TU19DT01QSUxFX0lOQ0xVREUpL2luY2x1ZGUgLUkkKExJTlVYX1NSQykvaW5jbHVkZSAtSSQoUlQyOHh4X0RJUikvaW5jbHVkZSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdHJpZ3JhcGhzIC1PMiAtZm5vLXN0cmljdC1hbGlhc2luZyAtZm5vLWNvbW1vbiAtZm5vLWNvbW1vbiAtcGlwZSAtZm5vLWJ1aWx0aW4gLURfX2xpbnV4X18gLUROT19NTSAtbWFwY3MtMzIgLW1hcmNoPWFybXY0IC1tdHVuZT1hcm03dGRtaSAtbXNvZnQtZmxvYXQgLURNT0RVTEUgLW1zaG9ydC1sb2FkLWJ5dGVzIC1ub3N0ZGluYyAtaXdpdGhwcmVmaXggLURNT0RVTEUgJChXRkxBR1MpCitleHBvcnQgQ0ZMQUdTCitlbmRpZgorCitpZmVxICgkKFBMQVRGT1JNKSw1VlQpCitDRkxBR1MgOj0gLURfX0tFUk5FTF9fIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUgLUkkKFJUMjh4eF9ESVIpL2luY2x1ZGUgLW1saXR0bGUtZW5kaWFuIC1XYWxsIC1XdW5kZWYgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXRyaWdyYXBocyAtZm5vLXN0cmljdC1hbGlhc2luZyAtZm5vLWNvbW1vbiAtTzMgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1tYXBjcyAtbW5vLXNjaGVkLXByb2xvZyAtbWFiaT1hcGNzLWdudSAtbW5vLXRodW1iLWludGVyd29yayAtRF9fTElOVVhfQVJNX0FSQ0hfXz01IC1tYXJjaD1hcm12NXRlIC1tdHVuZT1hcm05MjZlai1zIC0tcGFyYW0gbWF4LWlubGluZS1pbnNucy1zaW5nbGU9NDAwMDAgIC1VYXJtIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50IC1Xbm8tcG9pbnRlci1zaWduIC1ETU9EVUxFICQoV0ZMQUdTKQorCitleHBvcnQgQ0ZMQUdTCitlbmRpZgorCitpZmVxICgkKFBMQVRGT1JNKSxJS0FOT1NfVjE2MCkKK0NGTEFHUyA6PSAtRF9fS0VSTkVMX18gLUkkKExJTlVYX1NSQykvaW5jbHVkZSAtSSQoTElOVVhfU1JDKS9pbmNsdWRlL2FzbS9nY2MgLUkkKExJTlVYX1NSQykvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXRhbmdvMiAtSSQoTElOVVhfU1JDKS9pbmNsdWRlL2FzbS1taXBzL21hY2gtdGFuZ28yIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1nZW5lcmljIC1JJChSVDI4eHhfRElSKS9pbmNsdWRlIC1XYWxsIC1XdW5kZWYgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXRyaWdyYXBocyAtZm5vLXN0cmljdC1hbGlhc2luZyAtZm5vLWNvbW1vbiAtZmZyZWVzdGFuZGluZyAtTzIgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLUcgMCAtbW5vLWFiaWNhbGxzIC1mbm8tcGljIC1waXBlIC1tYXJjaD1seDQxODkgLVdhLCAtRE1PRFVMRSAkKFdGTEFHUykKK2V4cG9ydCBDRkxBR1MKK2VuZGlmCisKK2lmZXEgKCQoUExBVEZPUk0pLElLQU5PU19WMTgwKQorQ0ZMQUdTIDo9IC1EX19LRVJORUxfXyAtSSQoTElOVVhfU1JDKS9pbmNsdWRlIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUvYXNtL2djYyAtSSQoTElOVVhfU1JDKS9pbmNsdWRlL2FzbS1taXBzL21hY2gtdGFuZ28yIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC10YW5nbzIgLUkkKExJTlVYX1NSQykvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWdlbmVyaWMgLUkkKFJUMjh4eF9ESVIpL2luY2x1ZGUgLVdhbGwgLVd1bmRlZiAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdHJpZ3JhcGhzIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1mbm8tY29tbW9uIC1mZnJlZXN0YW5kaW5nIC1PMiAtZm9taXQtZnJhbWUtcG9pbnRlciAtRyAwIC1tbm8tYWJpY2FsbHMgLWZuby1waWMgLXBpcGUgLW1pcHMzMnIyIC1XYSwgLURNT0RVTEUgJChXRkxBR1MpCitleHBvcnQgQ0ZMQUdTCitlbmRpZgorCitpZmVxICgkKFBMQVRGT1JNKSxJTkZfVFdJTlBBU1MpCitDRkxBR1MgOj0gLURfX0tFUk5FTF9fIC1ETU9EVUxFIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUgLUkkKFJUMjh4eF9ESVIpL2luY2x1ZGUgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXRyaWdyYXBocyAtTzIgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZuby1jb21tb24gLUcgMCAtbW5vLWFiaWNhbGxzIC1mbm8tcGljIC1tYXJjaD00a2MgLW1pcHMzMiAtV2EsLS10cmFwIC1waXBlIC1tbG9uZy1jYWxscyAkKFdGTEFHUykKK2V4cG9ydCBDRkxBR1MKK2VuZGlmCisKK2lmZXEgKCQoUExBVEZPUk0pLElORl9EQU5VQkUpCitDRkxBR1MgOj0gLUkkKFJUMjh4eF9ESVIpL2luY2x1ZGUgJChXRkxBR1MpIC1XdW5kZWYgLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZuby1jb21tb24gLWZmcmVlc3RhbmRpbmcgLU9zIC1mb21pdC1mcmFtZS1wb2ludGVyIC1HIDAgLW1uby1hYmljYWxscyAtZm5vLXBpYyAtcGlwZSAtbXNvZnQtZmxvYXQgIC1tYWJpPTMyIC1tYXJjaD1taXBzMzIgLVdhLC0zMiAtV2EsLW1hcmNoPW1pcHMzMiAtV2EsLW1pcHMzMiAtV2EsLS10cmFwIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1nZW5lcmljCitleHBvcnQgQ0ZMQUdTCitlbmRpZgorCitpZmVxICgkKFBMQVRGT1JNKSxCUkNNXzYzNTgpCitDRkxBR1MgOj0gJChXRkxBR1MpIC1JJChSVDI4eHhfRElSKS9pbmNsdWRlIC1ub3N0ZGluYyAtaXdpdGhwcmVmaXggaW5jbHVkZSAtRF9fS0VSTkVMX18gLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXRyaWdyYXBocyAtZm5vLXN0cmljdC1hbGlhc2luZyAtZm5vLWNvbW1vbiAtSSAkKExJTlVYX1NSQykvaW5jbHVkZS9hc20vZ2NjIC1HIDAgLW1uby1hYmljYWxscyAtZm5vLXBpYyAtcGlwZSAgLWZpbmxpbmUtbGltaXQ9MTAwMDAwIC1tYWJpPTMyIC1tYXJjaD1taXBzMzIgLVdhLC0zMiAtV2EsLW1hcmNoPW1pcHMzMiAtV2EsLW1pcHMzMiAtV2EsLS10cmFwIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1iY205NjN4eCAtSSQoTElOVVhfU1JDKS9pbmNsdWRlL2FzbS1taXBzL21hY2gtZ2VuZXJpYyAgLU9zIC1mb21pdC1mcmFtZS1wb2ludGVyIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtRE1PRFVMRSAtbWxvbmctY2FsbHMKK2V4cG9ydCBDRkxBR1MKK2VuZGlmCisKK2lmZXEgKCQoUExBVEZPUk0pLFBDKQorICAgIGlmbmVxICgsJChmaW5kc3RyaW5nIDIuNCwkKExJTlVYX1NSQykpKQorCSMgTGludXggMi40CisJQ0ZMQUdTIDo9IC1EX19LRVJORUxfXyAtSSQoTElOVVhfU1JDKS9pbmNsdWRlIC1JJChSVDI4eHhfRElSKS9pbmNsdWRlIC1PMiAtZm9taXQtZnJhbWUtcG9pbnRlciAtZm5vLXN0cmljdC1hbGlhc2luZyAtZm5vLWNvbW1vbiAtcGlwZSAtbXByZWZlcnJlZC1zdGFjay1ib3VuZGFyeT0yIC1tYXJjaD1pNjg2IC1ETU9EVUxFIC1ETU9EVkVSU0lPTlMgLWluY2x1ZGUgJChMSU5VWF9TUkMpL2luY2x1ZGUvbGludXgvbW9kdmVyc2lvbnMuaCAkKFdGTEFHUykKKwlleHBvcnQgQ0ZMQUdTCisgICAgZWxzZQorCSMgTGludXggMi42CisJRVhUUkFfQ0ZMQUdTIDo9ICQoV0ZMQUdTKSAtSSQoUlQyOHh4X0RJUikvaW5jbHVkZQorICAgIGVuZGlmCitlbmRpZgorCitpZmVxICgkKFBMQVRGT1JNKSxJWFApCisgICAgICAgIEVYVFJBX0NGTEFHUyA6PSAtdiAkKFdGTEFHUykgLUkkKFJUMjh4eF9ESVIpL2luY2x1ZGUgLW1iaWctZW5kaWFuCitlbmRpZgorCitpZmVxICgkKFBMQVRGT1JNKSxDQVZNX09DVEVPTikKKwlFWFRSQV9DRkxBR1MgOj0gJChXRkxBR1MpIC1JJChSVDI4eHhfRElSKS9pbmNsdWRlIFwKKwkJCQkgICAgLW1hYmk9NjQgJChXRkxBR1MpCitleHBvcnQgQ0ZMQUdTCitlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2Rmcy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9kZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTJhNjM1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9kZnMuaApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICBkZnMuaAorCisgICAgQWJzdHJhY3Q6CisgICAgU3VwcG9ydCBERlMgZnVuY3Rpb24uCisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICBXaGVuICAgICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEZvbmNoaSAgICAwMy0xMi0yMDA3ICAgICAgY3JlYXRlZAorKi8KKworI2RlZmluZSBSQURBUl9QVUxTRSAxCisjZGVmaW5lIFJBREFSX1dJRFRIIDIKKworI2RlZmluZSBXSURUSF9SRF9JRExFIDAKKyNkZWZpbmUgV0lEVEhfUkRfQ0hFQ0sgMQorCisKK1ZPSUQgQmJwUmFkYXJEZXRlY3Rpb25TdGFydCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgQmJwUmFkYXJEZXRlY3Rpb25TdG9wKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBSYWRhckRldGVjdGlvblN0YXJ0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIEJPT0xFQU4gQ1RTX1Byb3RlY3QsCisJSU4gVUlOVDggQ1RTUGVyaW9kKTsKKworVk9JRCBSYWRhckRldGVjdGlvblN0b3AoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIFJhZGFyRGV0ZWN0UGVyaW9kaWMoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCisKK0JPT0xFQU4gUmFkYXJDaGFubmVsQ2hlY2soCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVUNIQVIJCQlDaCk7CisKK1VMT05HIEphcFJhZGFyVHlwZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1VMT05HIFJUTVBCYnBSZWFkUmFkYXJEdXJhdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCk7CisKK1VMT05HIFJUTVBSZWFkUmFkYXJEdXJhdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgUlRNUENsZWFuUmFkYXJEdXJhdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgUlRNUFByZXBhcmVSRENUU0ZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBEQSwKKwlJTglVTE9ORwkJCUR1cmF0aW9uLAorCUlOICBVQ0hBUiAgICAgICAgICAgUlRTUmF0ZSwKKwlJTiAgVUxPTkcgICAgICAgICAgIENUU0Jhc2VBZGRyLAorCUlOICBVQ0hBUgkJCUZyYW1lR2FwKTsKKworVk9JRCBSVE1QUHJlcGFyZVJhZGFyRGV0ZWN0UGFyYW1zKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworCitJTlQgU2V0X0NoTW92aW5nVGltZV9Qcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBhcmcpOworCitJTlQgU2V0X0xvbmdQdWxzZVJhZGFyVGhfUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgYXJnKTsKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2xlYXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvbGVhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MThjMWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2xlYXAuaApAQCAtMCwwICsxLDIxNSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlsZWFwLmgKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlOYW1lCQlEYXRlCQkJTW9kaWZpY2F0aW9uIGxvZ3MKKyovCisjaWZuZGVmIF9fTEVBUF9IX18KKyNkZWZpbmUgX19MRUFQX0hfXworCisvLyBNZXNzYWdlcyBmb3IgQXNzb2NpYXRlIHN0YXRlIG1hY2hpbmUKKyNkZWZpbmUgTEVBUF9NQUNISU5FX0JBU0UgICAgICAgICAgICAgICAgICAgMzAKKworI2RlZmluZSBMRUFQX01TR19SRVFVRVNUX0lERU5USVRZICAgICAgICAgICAzMQorI2RlZmluZSBMRUFQX01TR19SRVFVRVNUX0xFQVAgICAgICAgICAgICAgICAzMgorI2RlZmluZSBMRUFQX01TR19TVUNDRVNTICAgICAgICAgICAgICAgICAgICAzMworI2RlZmluZSBMRUFQX01TR19GQUlMRUQgICAgICAgICAgICAgICAgICAgICAzNAorI2RlZmluZSBMRUFQX01TR19SRVNQT05TRV9MRUFQICAgICAgICAgICAgICAzNQorI2RlZmluZSBMRUFQX01TR19FQVBPTEtFWSAgICAgICAgICAgICAgICAgICAzNgorI2RlZmluZSBMRUFQX01TR19VTktOT1dOICAgICAgICAgICAgICAgICAgICAzNworI2RlZmluZSBMRUFQX01TRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOAorLy8hIGFzc29jIHN0YXRlLW1hY2hpbmUgc3RhdGVzCisjZGVmaW5lIExFQVBfSURMRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTEVBUF9XQUlUX0lERU5USVRZX1JFUVVFU1QgICAgICAgICAgMQorI2RlZmluZSBMRUFQX1dBSVRfQ0hBTkxMRU5HRV9SRVFVRVNUICAgICAgICAyCisjZGVmaW5lIExFQVBfV0FJVF9TVUNDRVNTICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgTEVBUF9XQUlUX0NIQU5MTEVOR0VfUkVTUE9OU0UgICAgICAgNAorI2RlZmluZSBMRUFQX1dBSVRfRUFQT0xLRVkgICAgICAgICAgICAgICAgICA1CisKKyNkZWZpbmUgTEVBUF9SRUFTT05fSU5WQUxJRF9BVVRIICAgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIExFQVBfUkVBU09OX0FVVEhfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBMRUFQX1JFQVNPTl9DSEFMTEVOR0VfRlJPTV9BUF9GQUlMRUQgICAgICAgIDB4MDMKKyNkZWZpbmUgTEVBUF9SRUFTT05fQ0hBTExFTkdFX1RPX0FQX0ZBSUxFRCAgICAgICAgICAweDA0CisKKyNkZWZpbmUgQ0lTQ09fQXV0aE1vZGVMRUFQICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwCisjZGVmaW5lIENJU0NPX0F1dGhNb2RlTEVBUE5vbmUgICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBMRUFQX0FVVEhfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwMDAwCisjZGVmaW5lIExFQVBfQ0hBTExFTkdFX1JFU1BPTlNFX0xFTkdUSCAgICAgICAgICAgICAgMjQKKyNkZWZpbmUgTEVBUF9DSEFMTEVOR0VfUkVRVUVTVF9MRU5HVEggICAgICAgICAgICAgICA4CisKK3R5cGVkZWYgc3RydWN0IF9MRUFQX0VBUE9MX0hFQURFUl8geworICAgIFVDSEFSICAgICAgIFZlcnNpb247CisgICAgVUNIQVIgICAgICAgVHlwZTsKKyAgICBVQ0hBUiAgICAgICBMZW5ndGhbMl07Cit9IExFQVBfRUFQT0xfSEVBREVSLCAqUExFQVBfRUFQT0xfSEVBREVSOworCit0eXBlZGVmIHN0cnVjdCBfTEVBUF9FQVBPTF9QQUNLRVRfIHsKKyAgICBVQ0hBUiAgICAgICBDb2RlOworICAgIFVDSEFSICAgICAgIElkZW50aWZpZXI7CisgICAgVUNIQVIgICAgICAgTGVuZ3RoWzJdOworICAgIFVDSEFSICAgICAgIFR5cGU7Cit9IExFQVBfRUFQT0xfUEFDS0VULCAqUExFQVBfRUFQT0xfUEFDS0VUOworCit0eXBlZGVmIHN0cnVjdCBfTEVBUF9FQVBfQ09OVEVOVFNfIHsKKyAgICBVQ0hBUiAgICAgICBWZXJzaW9uOworICAgIFVDSEFSICAgICAgIFJlc2VydmVkOworICAgIFVDSEFSICAgICAgIExlbmd0aDsKK30gTEVBUF9FQVBfQ09OVEVOVFMsICpQTEVBUF9FQVBfQ09OVEVOVFM7CisKKy8qKiogRUFQT0wga2V5ICoqKi8KK3R5cGVkZWYgc3RydWN0IF9FQVBPTF9LRVlfSEVBREVSXyB7CisgICAgVUNIQVIgICAgICAgVHlwZTsKKyAgICBVQ0hBUiAgICAgICBMZW5ndGhbMl07CisgICAgVUNIQVIgICAgICAgQ291bnRlcls4XTsKKyAgICBVQ0hBUiAgICAgICBJVlsxNl07CisgICAgVUNIQVIgICAgICAgSW5kZXg7CisgICAgVUNIQVIgICAgICAgU2lnbmF0dXJlWzE2XTsKK30gRUFQT0xfS0VZX0hFQURFUiwgKlBFQVBPTF9LRVlfSEVBREVSOworCitCT09MRUFOIExlYXBNc2dUeXBlU3Vic3QoCisgICAgSU4gIFVDSEFSICAgRUFQVHlwZSwKKyAgICBPVVQgVUxPTkcgICAqTXNnVHlwZSk7CisKK1ZPSUQgTGVhcE1hY2hpbmVQZXJmb3JtQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorICAgIElOIFNUQVRFX01BQ0hJTkUgICAgKlMsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICAqRWxlbSk7CisKK1ZPSUQgTGVhcE1hY0hlYWRlckluaXQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICAgICAgcEFkLAorICAgIElOICBPVVQgUEhFQURFUl84MDJfMTEgIHBIZHI4MDIxMSwKKyAgICBJTiAgVUNIQVIgICAgICAgICAgICAgICB3ZXAsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgcEFkZHIzKTsKKworVk9JRCBMZWFwU3RhcnRBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICAqRWxlbSk7CisKK1ZPSUQgTGVhcElkZW50aXR5QWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAgKkVsZW0pOworCitWT0lEIExlYXBQZWVyQ2hhbGxlbmdlQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAgKkVsZW0pOworCitWT0lEIEhhc2hQd2QoCisgICAgSU4gIFBVQ0hBUiAgcHdkLAorICAgIElOICBJTlQgICAgIHB3ZGxlbiwKKyAgICBPVVQgUFVDSEFSICBoYXNoKTsKKworVk9JRCBQZWVyQ2hhbGxlbmdlUmVzcG9uc2UoCisgICAgSU4gIFBVQ0hBUiAgc3pDaGFsbGVuZ2UsCisgICAgSU4gIFBVQ0hBUiAgc21iUGFzc3dkLAorICAgIE9VVCBQVUNIQVIgIHN6UmVzcG9uc2UpOworCitWT0lEIFBhcml0eUtleSgKKyAgICBPVVQgUFVDSEFSICBzek91dCwKKyAgICBJTiAgUFVDSEFSICBzekluKTsKKworVk9JRCBEZXNLZXkoCisgICAgT1VUIFVMT05HICAga1sxNl1bMl0sCisgICAgSU4gIFBVQ0hBUiAga2V5LAorICAgIElOICBJTlQgICAgIGRlY3J5cHQpOworCitWT0lEIERlcygKKyAgICBJTiAgVUxPTkcgICBrc1sxNl1bMl0sCisgICAgT1VUIFVDSEFSICAgYmxvY2tbOF0pOworCitWT0lEIERlc0VuY3J5cHQoCisgICAgSU4gIFBVQ0hBUiAgc3pDbGVhciwKKyAgICBJTiAgUFVDSEFSICBzektleSwKKyAgICBPVVQgUFVDSEFSICBzek91dCk7CisKK1ZPSUQgTGVhcE5ldHdvcmtDaGFsbGVuZ2VBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICAqRWxlbSk7CisKK1ZPSUQgTGVhcE5ldHdvcmtDaGFsbGVuZ2VSZXNwb25zZSgKKyAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKTsKKworVk9JRCBIYXNocHdkSGFzaCgKKyAgICBJTiAgUFVDSEFSICBoYXNoLAorICAgIElOICBQVUNIQVIgIGhhc2hoYXNoKTsKKworVk9JRCBQcm9jZXNzU2Vzc2lvbktleSgKKyAgICBPVVQgUFVDSEFSICBTZXNzaW9uS2V5LAorICAgIElOICBQVUNIQVIgIGhhc2gyLAorICAgIElOICBQVUNIQVIgIENoYWxsZW5nZVRvUmFkaXVzLAorICAgIElOICBQVUNIQVIgIENoYWxsZW5nZVJlc3BvbnNlRnJvbVJhZGl1cywKKyAgICBJTiAgUFVDSEFSICBDaGFsbGVuZ2VGcm9tUmFkaXVzLAorICAgIElOICBQVUNIQVIgIENoYWxsZW5nZVJlc3BvbnNlVG9SYWRpdXMpOworCitWT0lEIExlYXBFYXBvbEtleUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKTsKKworVk9JRCBSb2d1ZUFwVGFibGVJbml0KAorICAgIElOIFJPR1VFQVBfVEFCTEUgICAgKlRhYik7CisKK1VMT05HIFJvZ3VlQXBUYWJsZVNlYXJjaCgKKyAgICBJTiBST0dVRUFQX1RBQkxFICAgICpUYWIsCisgICAgSU4gUFVDSEFSICAgICAgICAgICBwQWRkcik7CisKK1ZPSUQgUm9ndWVBcEVudHJ5U2V0KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIE9VVCBST0dVRUFQX0VOVFJZICAgKnBSb2d1ZUFwLAorICAgIElOIFBVQ0hBUiAgICAgICAgICAgcEFkZHIsCisgICAgSU4gVUNIQVIgICAgICAgICAgICBGYWlsZUNvZGUpOworCitVTE9ORyBSb2d1ZUFwVGFibGVTZXRFbnRyeSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBPVVQgUk9HVUVBUF9UQUJMRSAgKlRhYiwKKyAgICBJTiBQVUNIQVIgICAgICAgICAgIHBBZGRyLAorICAgIElOIFVDSEFSICAgICAgICAgICAgRmFpbGVDb2RlKTsKKworVk9JRCBSb2d1ZUFwVGFibGVEZWxldGVFbnRyeSgKKyAgICBJTiBPVVQgUk9HVUVBUF9UQUJMRSAqVGFiLAorICAgIElOIFBVQ0hBUiAgICAgICAgICBwQWRkcik7CisKK1ZPSUQgTGVhcEF1dGhUaW1lb3V0KAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKyAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgTGVhcFNlbmRSb2d1ZUFQUmVwb3J0KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworQk9PTEVBTiBDQ0tNQXNzb2NSc3BTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisgICAgSU4gVk9JRCAgICAgICAgICAgICAqTXNnLAorICAgIElOIFVMT05HICAgICAgICAgICAgTXNnTGVuKTsKKworI2VuZGlmICAvLyBfX0xFQVBfSF9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2xpbmtfbGlzdC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9saW5rX2xpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjUyMTEzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9saW5rX2xpc3QuaApAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2lmbmRlZiBfX0xJTktfTElTVF9IX18KKyNkZWZpbmUgX19MSU5LX0xJU1RfSF9fCisKK3R5cGVkZWYgc3RydWN0IF9MSVNUX0VOVFJZCit7CisJc3RydWN0IF9MSVNUX0VOVFJZICpwTmV4dDsKK30gTElTVF9FTlRSWSwgKlBMSVNUX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCBfTElTVF9IRUFEUgoreworCVBMSVNUX0VOVFJZIHBIZWFkOworCVBMSVNUX0VOVFJZIHBUYWlsOworCVVDSEFSIHNpemU7Cit9IExJU1RfSEVBREVSLCAqUExJU1RfSEVBREVSOworCitzdGF0aWMgaW5saW5lIFZPSUQgaW5pdExpc3QoCisJSU4gUExJU1RfSEVBREVSIHBMaXN0KQoreworCXBMaXN0LT5wSGVhZCA9IHBMaXN0LT5wVGFpbCA9IE5VTEw7CisJcExpc3QtPnNpemUgPSAwOworCXJldHVybjsKK30KKworc3RhdGljIGlubGluZSBWT0lEIGluc2VydFRhaWxMaXN0KAorCUlOIFBMSVNUX0hFQURFUiBwTGlzdCwKKwlJTiBQTElTVF9FTlRSWSBwRW50cnkpCit7CisJcEVudHJ5LT5wTmV4dCA9IE5VTEw7CisJaWYgKHBMaXN0LT5wVGFpbCkKKwkJcExpc3QtPnBUYWlsLT5wTmV4dCA9IHBFbnRyeTsKKwllbHNlCisJCXBMaXN0LT5wSGVhZCA9IHBFbnRyeTsKKwlwTGlzdC0+cFRhaWwgPSBwRW50cnk7CisJcExpc3QtPnNpemUrKzsKKworCXJldHVybjsKK30KKworc3RhdGljIGlubGluZSBQTElTVF9FTlRSWSByZW1vdmVIZWFkTGlzdCgKKwlJTiBQTElTVF9IRUFERVIgcExpc3QpCit7CisJUExJU1RfRU5UUlkgcE5leHQ7CisJUExJU1RfRU5UUlkgcEVudHJ5OworCisJcEVudHJ5ID0gcExpc3QtPnBIZWFkOworCWlmIChwTGlzdC0+cEhlYWQgIT0gTlVMTCkKKwl7CisJCXBOZXh0ID0gcExpc3QtPnBIZWFkLT5wTmV4dDsKKwkJcExpc3QtPnBIZWFkID0gcE5leHQ7CisJCWlmIChwTmV4dCA9PSBOVUxMKQorCQkJcExpc3QtPnBUYWlsID0gTlVMTDsKKwkJcExpc3QtPnNpemUtLTsKKwl9CisJcmV0dXJuIHBFbnRyeTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ2V0TGlzdFNpemUoCisJSU4gUExJU1RfSEVBREVSIHBMaXN0KQoreworCXJldHVybiBwTGlzdC0+c2l6ZTsKK30KKworc3RhdGljIGlubGluZSBQTElTVF9FTlRSWSBkZWxFbnRyeUxpc3QoCisJSU4gUExJU1RfSEVBREVSIHBMaXN0LAorCUlOIFBMSVNUX0VOVFJZIHBFbnRyeSkKK3sKKwlQTElTVF9FTlRSWSBwQ3VyRW50cnk7CisJUExJU1RfRU5UUlkgcFBydkVudHJ5OworCisJaWYocExpc3QtPnBIZWFkID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJaWYocEVudHJ5ID09IHBMaXN0LT5wSGVhZCkKKwl7CisJCXBDdXJFbnRyeSA9IHBMaXN0LT5wSGVhZDsKKwkJcExpc3QtPnBIZWFkID0gcEN1ckVudHJ5LT5wTmV4dDsKKworCQlpZihwTGlzdC0+cEhlYWQgPT0gTlVMTCkKKwkJCXBMaXN0LT5wVGFpbCA9IE5VTEw7CisKKwkJcExpc3QtPnNpemUtLTsKKwkJcmV0dXJuIHBDdXJFbnRyeTsKKwl9CisKKwlwUHJ2RW50cnkgPSBwTGlzdC0+cEhlYWQ7CisJcEN1ckVudHJ5ID0gcFBydkVudHJ5LT5wTmV4dDsKKwl3aGlsZShwQ3VyRW50cnkgIT0gTlVMTCkKKwl7CisJCWlmIChwRW50cnkgPT0gcEN1ckVudHJ5KQorCQl7CisJCQlwUHJ2RW50cnktPnBOZXh0ID0gcEN1ckVudHJ5LT5wTmV4dDsKKworCQkJaWYocEVudHJ5ID09IHBMaXN0LT5wVGFpbCkKKwkJCQlwTGlzdC0+cFRhaWwgPSBwUHJ2RW50cnk7CisKKwkJCXBMaXN0LT5zaXplLS07CisJCQlicmVhazsKKwkJfQorCQlwUHJ2RW50cnkgPSBwQ3VyRW50cnk7CisJCXBDdXJFbnRyeSA9IHBQcnZFbnRyeS0+cE5leHQ7CisJfQorCisJcmV0dXJuIHBDdXJFbnRyeTsKK30KKworI2VuZGlmIC8vIF9fX0xJTktfTElTVF9IX18gLy8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9tZDQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvbWQ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFlNWI1MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvbWQ0LmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2lmbmRlZiBfX01ENF9IX18KKyNkZWZpbmUgX19NRDRfSF9fCisKKy8qIE1ENCBjb250ZXh0LiAqLwordHlwZWRlZglzdHJ1Y3QJX01ENF9DVFhfCXsKKwlVTE9ORwlzdGF0ZVs0XTsgICAgICAgIC8qIHN0YXRlIChBQkNEKSAqLworCVVMT05HCWNvdW50WzJdOyAgICAgICAgLyogbnVtYmVyIG9mIGJpdHMsIG1vZHVsbyAyXjY0IChsc2IgZmlyc3QpICovCisJVUNIQVIJYnVmZmVyWzY0XTsgICAgICAvKiBpbnB1dCBidWZmZXIgKi8KK30JTUQ0X0NUWDsKKworVk9JRCBNRDRJbml0IChNRDRfQ1RYICopOworVk9JRCBNRDRVcGRhdGUgKE1ENF9DVFggKiwgUFVDSEFSLCBVSU5UKTsKK1ZPSUQgTUQ0RmluYWwgKFVDSEFSIFsxNl0sIE1ENF9DVFggKik7CisKKyNlbmRpZiAvL19fTUQ0X0hfXwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvbWQ1LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL21kNS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NWRiMTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL21kNS5oCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCW1kNS5oCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCisJamFuCQkJMTAtMjgtMDMJCUluaXRpYWwKKwlSaXRhICAgIAkxMS0yMy0wNAkJTW9kaWZ5IE1ENSBhbmQgU0hBLTEKKyovCisKKyNpZm5kZWYJdWludDgKKyNkZWZpbmUJdWludDggIHVuc2lnbmVkCWNoYXIKKyNlbmRpZgorCisjaWZuZGVmCXVpbnQzMgorI2RlZmluZQl1aW50MzIgdW5zaWduZWQJbG9uZyBpbnQKKyNlbmRpZgorCisKKyNpZm5kZWYJX19NRDVfSF9fCisjZGVmaW5lCV9fTUQ1X0hfXworCisjZGVmaW5lIE1ENV9NQUNfTEVOIDE2CisKK3R5cGVkZWYgc3RydWN0IF9NRDVfQ1RYIHsKKyAgICBVSU5UMzIgICBCdWZbNF07ICAgICAgICAgICAgIC8vIGJ1ZmZlcnMgb2YgZm91ciBzdGF0ZXMKKwlVQ0hBUiAgIElucHV0WzY0XTsgICAgICAgICAgLy8gaW5wdXQgbWVzc2FnZQorCVVJTlQzMiAgIExlbkluQml0Q291bnRbMl07ICAgLy8gbGVuZ3RoIGNvdW50ZXIgZm9yIGlucHV0IG1lc3NhZ2UsIDAgdXAgdG8gNjQgYml0cworfSAgIE1ENV9DVFg7CisKK1ZPSUQgTUQ1SW5pdChNRDVfQ1RYICpwQ3R4KTsKK1ZPSUQgTUQ1VXBkYXRlKE1ENV9DVFggKnBDdHgsIFVDSEFSICpwRGF0YSwgVUlOVDMyIExlbkluQnl0ZXMpOworVk9JRCBNRDVGaW5hbChVQ0hBUiBEaWdlc3RbMTZdLCBNRDVfQ1RYICpwQ3R4KTsKK1ZPSUQgTUQ1VHJhbnNmb3JtKFVJTlQzMiBCdWZbNF0sIFVJTlQzMiBNZXNbMTZdKTsKKwordm9pZCBtZDVfbWFjKHU4ICprZXksIHNpemVfdCBrZXlfbGVuLCB1OCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuLCB1OCAqbWFjKTsKK3ZvaWQgaG1hY19tZDUodTggKmtleSwgc2l6ZV90IGtleV9sZW4sIHU4ICpkYXRhLCBzaXplX3QgZGF0YV9sZW4sIHU4ICptYWMpOworCisvLworLy8gU0hBIGNvbnRleHQKKy8vCit0eXBlZGVmCXN0cnVjdCBfU0hBX0NUWAoreworCVVJTlQzMiAgIEJ1Zls1XTsgICAgICAgICAgICAgLy8gYnVmZmVycyBvZiBmaXZlIHN0YXRlcworCVVDSEFSICAgSW5wdXRbODBdOyAgICAgICAgICAvLyBpbnB1dCBtZXNzYWdlCisJVUlOVDMyICAgTGVuSW5CaXRDb3VudFsyXTsgICAvLyBsZW5ndGggY291bnRlciBmb3IgaW5wdXQgbWVzc2FnZSwgMCB1cCB0byA2NCBiaXRzCisKK30JU0hBX0NUWDsKKworVk9JRCBTSEFJbml0KFNIQV9DVFggKnBDdHgpOworVUNIQVIgU0hBVXBkYXRlKFNIQV9DVFggKnBDdHgsIFVDSEFSICpwRGF0YSwgVUlOVDMyIExlbkluQnl0ZXMpOworVk9JRCBTSEFGaW5hbChTSEFfQ1RYICpwQ3R4LCBVQ0hBUiBEaWdlc3RbMjBdKTsKK1ZPSUQgU0hBVHJhbnNmb3JtKFVJTlQzMiBCdWZbNV0sIFVJTlQzMiBNZXNbMjBdKTsKKworI2RlZmluZSBTSEFfRElHRVNUX0xFTiAyMAorI2VuZGlmIC8vIF9fTUQ1X0hfXworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZglfQUVTX0gKKyNkZWZpbmUJX0FFU19ICisKK3R5cGVkZWYJc3RydWN0Cit7CisJdWludDMyIGVya1s2NF07CQkvKiBlbmNyeXB0aW9uIHJvdW5kCWtleXMgKi8KKwl1aW50MzIgZHJrWzY0XTsJCS8qIGRlY3J5cHRpb24gcm91bmQJa2V5cyAqLworCWludAlucjsJCQkJLyogbnVtYmVyIG9mIHJvdW5kcwkqLworfQorYWVzX2NvbnRleHQ7CisKK2ludAkgcnRtcF9hZXNfc2V0X2tleSggYWVzX2NvbnRleHQgKmN0eCwJdWludDggKmtleSwJaW50CW5iaXRzICk7Cit2b2lkIHJ0bXBfYWVzX2VuY3J5cHQoIGFlc19jb250ZXh0ICpjdHgsCXVpbnQ4IGlucHV0WzE2XSwgdWludDggb3V0cHV0WzE2XSApOwordm9pZCBydG1wX2Flc19kZWNyeXB0KCBhZXNfY29udGV4dCAqY3R4LAl1aW50OCBpbnB1dFsxNl0sIHVpbnQ4IG91dHB1dFsxNl0gKTsKKwordm9pZCBGKGNoYXIgKnBhc3N3b3JkLCB1bnNpZ25lZCBjaGFyICpzc2lkLCBpbnQgc3NpZGxlbmd0aCwgaW50IGl0ZXJhdGlvbnMsIGludCBjb3VudCwgdW5zaWduZWQgY2hhciAqb3V0cHV0KTsKK2ludCBQYXNzd29yZEhhc2goY2hhciAqcGFzc3dvcmQsIHVuc2lnbmVkIGNoYXIgKnNzaWQsIGludCBzc2lkbGVuZ3RoLCB1bnNpZ25lZCBjaGFyICpvdXRwdXQpOworCisjZW5kaWYgLyogYWVzLmgJKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9tbG1lLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL21sbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2I2MTY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9tbG1lLmgKQEAgLTAsMCArMSwxNDQ3IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCW1sbWUuaAorCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUpvaG4gQ2hhbmcJMjAwMy0wOC0yOAkJQ3JlYXRlZAorCUpvaG4gQ2hhbmcgIDIwMDQtMDktMDYgICAgICBtb2RpZmllZCBmb3IgUlQyNjAwCisKKyovCisjaWZuZGVmIF9fTUxNRV9IX18KKyNkZWZpbmUgX19NTE1FX0hfXworCisvLyBtYXhpbXVtIHN1cHBvcnRlZCBjYXBhYmlsaXR5IGluZm9ybWF0aW9uIC0KKy8vIEVTUywgSUJTUywgUHJpdmFjeSwgU2hvcnQgUHJlYW1ibGUsIFNwZWN0cnVtIG1nbXQsIFNob3J0IFNsb3QKKyNkZWZpbmUgU1VQUE9SVEVEX0NBUEFCSUxJVFlfSU5GTyAgIDB4MDUzMworCisjZGVmaW5lIEVORF9PRl9BUkdTICAgICAgICAgICAgICAgICAtMQorI2RlZmluZSBMRlNSX01BU0sgICAgICAgICAgICAgICAgICAgMHg4MDAwMDA1NworI2RlZmluZSBNTE1FX1RBU0tfRVhFQ19JTlRWICAgICAgICAgMTAwLyoyMDAqLyAgICAgICAvLworI2RlZmluZSBMRUFEX1RJTUUgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBNTE1FX1RBU0tfRVhFQ19NVUxUSVBMRSAgICAgICAxMCAgLyo1Ki8gICAgICAgLy8gTUxNRV9UQVNLX0VYRUNfTVVMVElQTEUgKiBNTE1FX1RBU0tfRVhFQ19JTlRWID0gMSBzZWMKKyNkZWZpbmUgUkVPUkRFUl9FWEVDX0lOVFYgICAgICAgICAJMTAwICAgICAgIC8vIDAuMSBzZWMKKworLy8gVGhlIGRlZmluaXRpb24gb2YgUmFkYXIgZGV0ZWN0aW9uIGR1cmF0aW9uIHJlZ2lvbgorI2RlZmluZSBDRQkJMAorI2RlZmluZSBGQ0MJCTEKKyNkZWZpbmUgSkFQCQkyCisjZGVmaW5lIEpBUF9XNTMJMworI2RlZmluZSBKQVBfVzU2CTQKKyNkZWZpbmUgTUFYX1JEX1JFR0lPTiA1CisKKyNpZmRlZglORElTNTFfTUlOSVBPUlQKKyNkZWZpbmUgQkVBQ09OX0xPU1RfVElNRSAgICAgICAgICAgIDQwMDAgICAgICAgLy8gMjA0OCBtc2VjID0gMiBzZWMKKyNlbHNlCisjZGVmaW5lIEJFQUNPTl9MT1NUX1RJTUUgICAgICAgICAgICA0ICogT1NfSFogICAgLy8gMjA0OCBtc2VjID0gMiBzZWMKKyNlbmRpZgorCisjZGVmaW5lIERMU19USU1FT1VUICAgICAgICAgICAgICAgICAxMjAwICAgICAgLy8gdW5pdDogbXNlYworI2RlZmluZSBBVVRIX1RJTUVPVVQgICAgICAgICAgICAgICAgMzAwICAgICAgIC8vIHVuaXQ6IG1zZWMKKyNkZWZpbmUgQVNTT0NfVElNRU9VVCAgICAgICAgICAgICAgIDMwMCAgICAgICAvLyB1bml0OiBtc2VjCisjZGVmaW5lIEpPSU5fVElNRU9VVCAgICAgICAgICAgICAgICAyICogT1NfSFogICAgICAvLyB1bml0OiBtc2VjCisjZGVmaW5lIFNIT1JUX0NIQU5ORUxfVElNRSAgICAgICAgICA5MCAgICAgICAgLy8gdW5pdDogbXNlYworI2RlZmluZSBNSU5fQ0hBTk5FTF9USU1FICAgICAgICAgICAgMTEwICAgICAgICAvLyB1bml0OiBtc2VjLCBmb3IgZHVhbCBiYW5kIHNjYW4KKyNkZWZpbmUgTUFYX0NIQU5ORUxfVElNRSAgICAgICAgICAgIDE0MCAgICAgICAvLyB1bml0OiBtc2VjLCBmb3Igc2luZ2xlIGJhbmQgc2NhbgorI2RlZmluZQlGQVNUX0FDVElWRV9TQ0FOX1RJTUUJICAgIDMwIAkJICAvLyBBY3RpdmUgc2NhbiB3YWl0aW5nIGZvciBwcm9iZSByZXNwb25zZSB0aW1lCisjZGVmaW5lIENXX01JTl9JTl9CSVRTICAgICAgICAgICAgICA0ICAgICAgICAgLy8gYWN0dWFsIEN3TWluID0gMl5DV19NSU5fSU5fQklUUyAtIDEKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZuZGVmIENPTkZJR19BUF9TVVBQT1JUCisjZGVmaW5lIENXX01BWF9JTl9CSVRTICAgICAgICAgICAgICAxMCAgICAgICAgLy8gYWN0dWFsIEN3TWF4ID0gMl5DV19NQVhfSU5fQklUUyAtIDEKKyNlbmRpZgorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQKK2V4dGVybiBVSU5UMzIgQ1dfTUFYX0lOX0JJVFM7CisjZW5kaWYgLy8gQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQgLy8KKworLy8gTm90ZTogUlNTSV9UT19EQk1fT0ZGU0VUIGhhcyBiZWVuIGNoYW5nZWQgdG8gdmFyaWFibGUgZm9yIG5ldyBSRiAoMjAwNC0wNzIwKS4KKy8vIFNIb3VsZCBub3QgcmVmZXIgdG8gdGhpcyBjb25zdGFudCBhbnltb3JlCisvLyNkZWZpbmUgUlNTSV9UT19EQk1fT0ZGU0VUICAgICAgICAgIDEyMCAvLyBmb3IgUlQyNTMwIFJTU0ktMTE1ID0gZEJtCisjZGVmaW5lIFJTU0lfRk9SX01JRF9UWF9QT1dFUiAgICAgICAtNTUgIC8vIC01NSBkYiBpcyBjb25zaWRlcmVkIG1pZC1kaXN0YW5jZQorI2RlZmluZSBSU1NJX0ZPUl9MT1dfVFhfUE9XRVIgICAgICAgLTQ1ICAvLyAtNDUgZGIgaXMgY29uc2lkZXJlZCB2ZXJ5IHNob3J0IGRpc3RhbmNlIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsaWdpYmxlIHRvIHVzZSBhIGxvd2VyIFRYIHBvd2VyCisjZGVmaW5lIFJTU0lfRk9SX0xPV0VTVF9UWF9QT1dFUiAgICAtMzAKKy8vI2RlZmluZSBNSURfVFhfUE9XRVJfREVMVEEgICAgICAgICAgMCAgIC8vIDAgZGIgZnJvbSBmdWxsIFRYIHBvd2VyIHVwb24gbWlkLWRpc3RhbmNlIHRvIEFQCisjZGVmaW5lIExPV19UWF9QT1dFUl9ERUxUQSAgICAgICAgICA2ICAgIC8vIC0zIGRiIGZyb20gZnVsbCBUWCBwb3dlciB1cG9uIHZlcnkgc2hvcnQgZGlzdGFuY2UuIDEgZ3JhZGUgaXMgMC41IGRiCisjZGVmaW5lIExPV0VTVF9UWF9QT1dFUl9ERUxUQSAgICAgICAxNiAgIC8vIC04IGRiIGZyb20gZnVsbCBUWCBwb3dlciB1cG9uIHNob3J0ZXN0IGRpc3RhbmNlLiAxIGdyYWRlIGlzIDAuNSBkYgorCisjZGVmaW5lIFJTU0lfVFJJR0dFUkVEX1VQT05fQkVMT1dfVEhSRVNIT0xEICAgICAwCisjZGVmaW5lIFJTU0lfVFJJR0dFUkVEX1VQT05fRVhDQ0VFRF9USFJFU0hPTEQgICAxCisjZGVmaW5lIFJTU0lfVEhSRVNIT0xEX0ZPUl9ST0FNSU5HICAgICAgICAgICAgICAyNQorI2RlZmluZSBSU1NJX0RFTFRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNQorCisvLyBDaGFubmVsIFF1YWxpdHkgSW5kaWNhdGlvbgorI2RlZmluZSBDUUlfSVNfR09PRChjcWkpICAgICAgICAgICAgKChjcWkpID49IDUwKQorLy8jZGVmaW5lIENRSV9JU19GQUlSKGNxaSkgICAgICAgICAgKCgoY3FpKSA+PSAyMCkgJiYgKChjcWkpIDwgNTApKQorI2RlZmluZSBDUUlfSVNfUE9PUihjcWkpICAgICAgICAgICAgKGNxaSA8IDUwKSAgLy8oKChjcWkpID49IDUpICYmICgoY3FpKSA8IDIwKSkKKyNkZWZpbmUgQ1FJX0lTX0JBRChjcWkpICAgICAgICAgICAgIChjcWkgPCA1KQorI2RlZmluZSBDUUlfSVNfREVBRChjcWkpICAgICAgICAgICAgKGNxaSA9PSAwKQorCisvLyB3ZWlnaHRpbmcgZmFjdG9yIHRvIGNhbGN1bGF0ZSBDaGFubmVsIHF1YWxpdHksIHRvdGFsIHNob3VsZCBiZSAxMDAlCisjZGVmaW5lIFJTU0lfV0VJR0hUSU5HICAgICAgICAgICAgICAgICAgIDUwCisjZGVmaW5lIFRYX1dFSUdIVElORyAgICAgICAgICAgICAgICAgICAgIDMwCisjZGVmaW5lIFJYX1dFSUdIVElORyAgICAgICAgICAgICAgICAgICAgIDIwCisKKyNkZWZpbmUgQlNTX05PVF9GT1VORCAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRgorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNkZWZpbmUgTUFYX0xFTl9PRl9NTE1FX1FVRVVFICAgICAgICAgICAgNDAgLy8xMAorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjZGVmaW5lIFNDQU5fUEFTU0lWRSAgICAgICAgICAgICAgICAgICAgIDE4CQkvLyBzY2FuIHdpdGggbm8gcHJvYmUgcmVxdWVzdCwgb25seSB3YWl0IGJlYWNvbiBhbmQgcHJvYmUgcmVzcG9uc2UKKyNkZWZpbmUgU0NBTl9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgMTkJCS8vIHNjYW4gd2l0aCBwcm9iZSByZXF1ZXN0LCBhbmQgd2FpdCBiZWFjb24gYW5kIHByb2JlIHJlc3BvbnNlCisjZGVmaW5lCVNDQU5fQ0lTQ09fUEFTU0lWRQkJCQkgMjAJCS8vIFNpbmdsZSBjaGFubmVsIHBhc3NpdmUgc2NhbgorI2RlZmluZQlTQ0FOX0NJU0NPX0FDVElWRQkJCQkgMjEJCS8vIFNpbmdsZSBjaGFubmVsIGFjdGl2ZSBzY2FuCisjZGVmaW5lCVNDQU5fQ0lTQ09fTk9JU0UJCQkJIDIyCQkvLyBTaW5nbGUgY2hhbm5lbCBwYXNzaXZlIHNjYW4gZm9yIG5vaXNlIGhpc3RvZ3JhbSBjb2xsZWN0aW9uCisjZGVmaW5lCVNDQU5fQ0lTQ09fQ0hBTk5FTF9MT0FECQkJIDIzCQkvLyBTaW5nbGUgY2hhbm5lbCBwYXNzaXZlIHNjYW4gZm9yIGNoYW5uZWwgbG9hZCBjb2xsZWN0aW9uCisjZGVmaW5lIEZBU1RfU0NBTl9BQ1RJVkUgICAgICAgICAgICAgICAgIDI0CQkvLyBzY2FuIHdpdGggcHJvYmUgcmVxdWVzdCwgYW5kIHdhaXQgYmVhY29uIGFuZCBwcm9iZSByZXNwb25zZQorCisjaWZkZWYgRE9UMTFOX0RSQUZUMworI2RlZmluZSBTQ0FOXzIwNDBfQlNTX0NPRVhJU1QgICAgICAgICAgICAgICAgICAyNgorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKworI2RlZmluZSBNQUNfQUREUl9JU19HUk9VUChBZGRyKSAgICAgICAoKChBZGRyWzBdKSAmIDB4MDEpKQorI2RlZmluZSBNQUNfQUREUl9IQVNIKEFkZHIpICAgICAgICAgICAgKEFkZHJbMF0gXiBBZGRyWzFdIF4gQWRkclsyXSBeIEFkZHJbM10gXiBBZGRyWzRdIF4gQWRkcls1XSkKKyNkZWZpbmUgTUFDX0FERFJfSEFTSF9JTkRFWChBZGRyKSAgICAgIChNQUNfQUREUl9IQVNIKEFkZHIpICUgSEFTSF9UQUJMRV9TSVpFKQorI2RlZmluZSBUSURfTUFDX0hBU0goQWRkcixUSUQpICAgICAgICAgICAgKFRJRF5BZGRyWzBdIF4gQWRkclsxXSBeIEFkZHJbMl0gXiBBZGRyWzNdIF4gQWRkcls0XSBeIEFkZHJbNV0pCisjZGVmaW5lIFRJRF9NQUNfSEFTSF9JTkRFWChBZGRyLFRJRCkgICAgICAoVElEX01BQ19IQVNIKEFkZHIsVElEKSAlIEhBU0hfVEFCTEVfU0laRSkKKworLy8gTEVEIENvbnRyb2wKKy8vIGFzc29pYXRpb24gT04uIG9uZSBMRUQgT04uIGFub3RoZXIgYmxpbmtpbmcgd2hlbiBUWCwgT0ZGIHdoZW4gaWRsZQorLy8gbm8gYXNzb2NpYXRpb24sIGJvdGggTEVEIG9mZgorI2RlZmluZSBBU0lDX0xFRF9BQ1RfT04ocEFkKSAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0NTUjE0LCAweDAwMDMxZTQ2KQorI2RlZmluZSBBU0lDX0xFRF9BQ1RfT0ZGKHBBZCkgICAgICAgUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0NTUjE0LCAweDAwMDAxZTQ2KQorCisvLyBiaXQgZGVmaW5pdGlvbiBvZiB0aGUgMi1ieXRlIHBCRUFDT04tPkNhcGFiaWxpdHkgZmllbGQKKyNkZWZpbmUgQ0FQX0lTX0VTU19PTih4KSAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDAwMDEpICE9IDApCisjZGVmaW5lIENBUF9JU19JQlNTX09OKHgpICAgICAgICAgICAgICAgICgoKHgpICYgMHgwMDAyKSAhPSAwKQorI2RlZmluZSBDQVBfSVNfQ0ZfUE9MTEFCTEVfT04oeCkgICAgICAgICAoKCh4KSAmIDB4MDAwNCkgIT0gMCkKKyNkZWZpbmUgQ0FQX0lTX0NGX1BPTExfUkVRX09OKHgpICAgICAgICAgKCgoeCkgJiAweDAwMDgpICE9IDApCisjZGVmaW5lIENBUF9JU19QUklWQUNZX09OKHgpICAgICAgICAgICAgICgoKHgpICYgMHgwMDEwKSAhPSAwKQorI2RlZmluZSBDQVBfSVNfU0hPUlRfUFJFQU1CTEVfT04oeCkgICAgICAoKCh4KSAmIDB4MDAyMCkgIT0gMCkKKyNkZWZpbmUgQ0FQX0lTX1BCQ0NfT04oeCkgICAgICAgICAgICAgICAgKCgoeCkgJiAweDAwNDApICE9IDApCisjZGVmaW5lIENBUF9JU19BR0lMSVRZX09OKHgpICAgICAgICAgICAgICgoKHgpICYgMHgwMDgwKSAhPSAwKQorI2RlZmluZSBDQVBfSVNfU1BFQ1RSVU1fTUdNVCh4KSAgICAgICAgICAoKCh4KSAmIDB4MDEwMCkgIT0gMCkgIC8vIDgwMi4xMWUgZDkKKyNkZWZpbmUgQ0FQX0lTX1FPUyh4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDAyMDApICE9IDApICAvLyA4MDIuMTFlIGQ5CisjZGVmaW5lIENBUF9JU19TSE9SVF9TTE9UKHgpICAgICAgICAgICAgICgoKHgpICYgMHgwNDAwKSAhPSAwKQorI2RlZmluZSBDQVBfSVNfQVBTRCh4KSAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MDgwMCkgIT0gMCkgIC8vIDgwMi4xMWUgZDkKKyNkZWZpbmUgQ0FQX0lTX0lNTUVEX0JBKHgpICAgICAgICAgICAgICAgKCgoeCkgJiAweDEwMDApICE9IDApICAvLyA4MDIuMTFlIGQ5CisjZGVmaW5lIENBUF9JU19EU1NTX09GRE0oeCkgICAgICAgICAgICAgICgoKHgpICYgMHgyMDAwKSAhPSAwKQorI2RlZmluZSBDQVBfSVNfREVMQVlfQkEoeCkgICAgICAgICAgICAgICAoKCh4KSAmIDB4NDAwMCkgIT0gMCkgIC8vIDgwMi4xMWUgZDkKKworI2RlZmluZSBDQVBfR0VORVJBVEUoZXNzLGlic3MscHJpdixzX3ByZSxzX3Nsb3Qsc3BlY3RydW0pICAoKChlc3MpID8gMHgwMDAxIDogMHgwMDAwKSB8ICgoaWJzcykgPyAweDAwMDIgOiAweDAwMDApIHwgKChwcml2KSA/IDB4MDAxMCA6IDB4MDAwMCkgfCAoKHNfcHJlKSA/IDB4MDAyMCA6IDB4MDAwMCkgfCAoKHNfc2xvdCkgPyAweDA0MDAgOiAweDAwMDApIHwgKChzcGVjdHJ1bSkgPyAweDAxMDAgOiAweDAwMDApKQorCisjZGVmaW5lIEVSUF9JU19OT05fRVJQX1BSRVNFTlQoeCkgICAgICAgICgoKHgpICYgMHgwMSkgIT0gMCkgICAgLy8gODAyLjExZworI2RlZmluZSBFUlBfSVNfVVNFX1BST1RFQ1RJT04oeCkgICAgICAgICAoKCh4KSAmIDB4MDIpICE9IDApICAgIC8vIDgwMi4xMWcKKyNkZWZpbmUgRVJQX0lTX1VTRV9CQVJLRVJfUFJFQU1CTEUoeCkgICAgKCgoeCkgJiAweDA0KSAhPSAwKSAgICAvLyA4MDIuMTFnCisKKyNkZWZpbmUgRFJTX1RYX1FVQUxJVFlfV09SU1RfQk9VTkQgICAgICAgOC8vIDMgIC8vIGp1c3QgdGVzdCBieSBnYXJ5CisjZGVmaW5lIERSU19QRU5BTFRZICAgICAgICAgICAgICAgICAgICAgIDgKKworI2RlZmluZSBCQV9OT1RVU0UgCTIKKy8vQkEgUG9saWN5IHN1YmZpbGVkIHZhbHVlIGluIEFEREJBIGZyYW1lCisjZGVmaW5lIElNTUVEX0JBIAkxCisjZGVmaW5lIERFTEFZX0JBCTAKKworLy8gQkEgSW5pdGlhdG9yIHN1YmZpZWxkIGluIERFTEJBIGZyYW1lCisjZGVmaW5lIE9SSUdJTkFUT1IJMQorI2RlZmluZSBSRUNJUElFTlQJMAorCisvLyBBRERCQSBTdGF0dXMgQ29kZQorI2RlZmluZSBBRERCQV9SRVNVTFRDT0RFX1NVQ0NFU1MJCQkJCTAKKyNkZWZpbmUgQUREQkFfUkVTVUxUQ09ERV9SRUZVU0VECQkJCQkzNworI2RlZmluZSBBRERCQV9SRVNVTFRDT0RFX0lOVkFMSURfUEFSQU1FVEVSUwkJCTM4CisKKy8vIERFTEJBIFJlYXNvbiBDb2RlCisjZGVmaW5lIERFTEJBX1JFQVNPTkNPREVfUVNUQV9MRUFWSU5HCQkJCTM2CisjZGVmaW5lIERFTEJBX1JFQVNPTkNPREVfRU5EX0JBCQkJCQkJMzcKKyNkZWZpbmUgREVMQkFfUkVBU09OQ09ERV9VTktOT1dOX0JBCQkJCQkzOAorI2RlZmluZSBERUxCQV9SRUFTT05DT0RFX1RJTUVPVVQJCQkJCTM5CisKKy8vIHJlc2V0IGFsbCBPbmVTZWNUeCBjb3VudGVycworI2RlZmluZSBSRVNFVF9PTkVfU0VDX1RYX0NOVChfX3BFbnRyeSkgXAoraWYgKCgoX19wRW50cnkpKSAhPSBOVUxMKSBcCit7IFwKKwkoX19wRW50cnkpLT5PbmVTZWNUeFJldHJ5T2tDb3VudCA9IDA7IFwKKwkoX19wRW50cnkpLT5PbmVTZWNUeEZhaWxDb3VudCA9IDA7IFwKKwkoX19wRW50cnkpLT5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ID0gMDsgXAorfQorCisvLworLy8gODAyLjExIGZyYW1lIGZvcm1hdHMKKy8vCisvLyAgSFQgQ2FwYWJpbGl0eSBJTkZPIGZpZWxkIGluIEhUIENhcCBJRSAuCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVU0hPUlQJTFNJR1R4b3BQcm9TdXA6MTsKKwlVU0hPUlQJRm9ydHlfTWh6X0ludG9sZXJhbnQ6MTsKKwlVU0hPUlQJUFNNUDoxOworCVVTSE9SVAlDQ0ttb2RlaW40MDoxOworCVVTSE9SVAlBTXNkdVNpemU6MTsKKwlVU0hPUlQJRGVsYXllZEJBOjE7CS8vcnQyODYwYyBub3Qgc3VwcG9ydAorCVVTSE9SVAlSeFNUQkM6MjsKKwlVU0hPUlQJVHhTVEJDOjE7CisJVVNIT1JUCVNob3J0R0lmb3I0MDoxOwkvL2ZvcjQwTUh6CisJVVNIT1JUCVNob3J0R0lmb3IyMDoxOworCVVTSE9SVAlHRjoxOwkvL2dyZWVuIGZpZWxkCisJVVNIT1JUCU1pbW9QczoyOy8vbW9taSBwb3dlciBzYWZlCisJVVNIT1JUCUNoYW5uZWxXaWR0aDoxOworCVVTSE9SVAlBZHZDb2Rpbmc6MTsKKyNlbHNlCisJVVNIT1JUCUFkdkNvZGluZzoxOworCVVTSE9SVAlDaGFubmVsV2lkdGg6MTsKKwlVU0hPUlQJTWltb1BzOjI7Ly9tb21pIHBvd2VyIHNhZmUKKwlVU0hPUlQJR0Y6MTsJLy9ncmVlbiBmaWVsZAorCVVTSE9SVAlTaG9ydEdJZm9yMjA6MTsKKwlVU0hPUlQJU2hvcnRHSWZvcjQwOjE7CS8vZm9yNDBNSHoKKwlVU0hPUlQJVHhTVEJDOjE7CisJVVNIT1JUCVJ4U1RCQzoyOworCVVTSE9SVAlEZWxheWVkQkE6MTsJLy9ydDI4NjBjIG5vdCBzdXBwb3J0CisJVVNIT1JUCUFNc2R1U2l6ZToxOwkvLyBvbmx5IHN1cHBvcnQgYXMgemVybworCVVTSE9SVAlDQ0ttb2RlaW40MDoxOworCVVTSE9SVAlQU01QOjE7CisJVVNIT1JUCUZvcnR5X01oel9JbnRvbGVyYW50OjE7CisJVVNIT1JUCUxTSUdUeG9wUHJvU3VwOjE7CisjZW5kaWYJLyogIVJUX0JJR19FTkRJQU4gKi8KK30gSFRfQ0FQX0lORk8sICpQSFRfQ0FQX0lORk87CisKKy8vICBIVCBDYXBhYmlsaXR5IElORk8gZmllbGQgaW4gSFQgQ2FwIElFIC4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCXJzdjozOy8vbW9taSBwb3dlciBzYWZlCisJVUNIQVIJTXBkdURlbnNpdHk6MzsKKwlVQ0hBUglNYXhSQW1wZHVGYWN0b3I6MjsKKyNlbHNlCisJVUNIQVIJTWF4UkFtcGR1RmFjdG9yOjI7CisJVUNIQVIJTXBkdURlbnNpdHk6MzsKKwlVQ0hBUglyc3Y6MzsvL21vbWkgcG93ZXIgc2FmZQorI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCit9IEhUX0NBUF9QQVJNLCAqUEhUX0NBUF9QQVJNOworCisvLyAgSFQgQ2FwYWJpbGl0eSBJTkZPIGZpZWxkIGluIEhUIENhcCBJRSAuCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworCVVDSEFSCU1DU1NldFsxMF07CisJVUNIQVIJU3VwUmF0ZVsyXTsgIC8vIHVuaXQgOiAxTWJwcworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVQ0hBUglyc3Y6MzsKKwlVQ0hBUglNcGR1RGVuc2l0eToxOworCVVDSEFSCVR4U3RyZWFtOjI7CisJVUNIQVIJVHhSeE5vdEVxdWFsOjE7CisJVUNIQVIJVHhNQ1NTZXREZWZpbmVkOjE7CisjZWxzZQorCVVDSEFSCVR4TUNTU2V0RGVmaW5lZDoxOworCVVDSEFSCVR4UnhOb3RFcXVhbDoxOworCVVDSEFSCVR4U3RyZWFtOjI7CisJVUNIQVIJTXBkdURlbnNpdHk6MTsKKwlVQ0hBUglyc3Y6MzsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisJVUNIQVIJcnN2M1szXTsKK30gSFRfTUNTX1NFVCwgKlBIVF9NQ1NfU0VUOworCisvLyAgSFQgQ2FwYWJpbGl0eSBJTkZPIGZpZWxkIGluIEhUIENhcCBJRSAuCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVU0hPUlQJcnN2Mjo0OworCVVTSE9SVAlSREdTdXBwb3J0OjE7CS8vcmV2ZXJzZSBEaXJlY3Rpb24gR3JhbnQgIHN1cHBvcnQKKwlVU0hPUlQJUGx1c0hUQzoxOwkvLytIVEMgY29udHJvbCBmaWVsZCBzdXBwb3J0CisJVVNIT1JUCU1DU0ZlZWRiYWNrOjI7CS8vMDpubyBNQ1MgZmVlZGJhY2ssIDI6dW5zb2xpY2l0ZWQgTUNTIGZlZWRiYWNrLCAzOkZ1bGwgTUNTIGZlZWRiYWNrLCAgMTpyc3YuCisJVVNIT1JUCXJzdjo1Oy8vbW9taSBwb3dlciBzYWZlCisJVVNIT1JUCVRyYW5UaW1lOjI7CisJVVNIT1JUCVBjbzoxOworI2Vsc2UKKwlVU0hPUlQJUGNvOjE7CisJVVNIT1JUCVRyYW5UaW1lOjI7CisJVVNIT1JUCXJzdjo1Oy8vbW9taSBwb3dlciBzYWZlCisJVVNIT1JUCU1DU0ZlZWRiYWNrOjI7CS8vMDpubyBNQ1MgZmVlZGJhY2ssIDI6dW5zb2xpY2l0ZWQgTUNTIGZlZWRiYWNrLCAzOkZ1bGwgTUNTIGZlZWRiYWNrLCAgMTpyc3YuCisJVVNIT1JUCVBsdXNIVEM6MTsJLy8rSFRDIGNvbnRyb2wgZmllbGQgc3VwcG9ydAorCVVTSE9SVAlSREdTdXBwb3J0OjE7CS8vcmV2ZXJzZSBEaXJlY3Rpb24gR3JhbnQgIHN1cHBvcnQKKwlVU0hPUlQJcnN2Mjo0OworI2VuZGlmIC8qIFJUX0JJR19FTkRJQU4gKi8KK30gRVhUX0hUX0NBUF9JTkZPLCAqUEVYVF9IVF9DQVBfSU5GTzsKKworLy8gIEhUIEJlYW1mb3JtaW5nIGZpZWxkIGluIEhUIENhcCBJRSAuCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0hUX0JGX0NBUHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVUxPTkcJcnN2OjM7CisJVUxPTkcJQ2hhbkVzdGltYXRpb246MjsKKwlVTE9ORwlDU0lSb3dCRlN1cDoyOworCVVMT05HCUNvbVN0ZWVyQkZBbnRTdXA6MjsKKwlVTE9ORwlOb0NvbVN0ZWVyQkZBbnRTdXA6MjsKKwlVTE9ORwlDU0lCRkFudFN1cDoyOworCVVMT05HCU1pbkdyb3VwaW5nOjI7CisJVUxPTkcJRXhwQ29tQkY6MjsKKwlVTE9ORwlFeHBOb0NvbUJGOjI7CisJVUxPTkcJRXhwQ1NJRmJrOjI7CisJVUxPTkcJRXhwQ29tU3RlZXJDYXBhYmxlOjE7CisJVUxPTkcJRXhwTm9Db21TdGVlckNhcGFibGU6MTsKKwlVTE9ORwlFeHBDU0lDYXBhYmxlOjE7CisJVUxPTkcJQ2FsaWJyYXRpb246MjsKKwlVTE9ORwlJbXBUeEJGQ2FwYWJsZToxOworCVVMT05HCVR4TkRQQ2FwYWJsZToxOworCVVMT05HCVJ4TkRQQ2FwYWJsZToxOworCVVMT05HCVR4U291bmRDYXBhYmxlOjE7CisJVUxPTkcJUnhTb3VuZENhcGFibGU6MTsKKwlVTE9ORwlUeEJGUmVjQ2FwYWJsZToxOworI2Vsc2UKKwlVTE9ORwlUeEJGUmVjQ2FwYWJsZToxOworCVVMT05HCVJ4U291bmRDYXBhYmxlOjE7CisJVUxPTkcJVHhTb3VuZENhcGFibGU6MTsKKwlVTE9ORwlSeE5EUENhcGFibGU6MTsKKwlVTE9ORwlUeE5EUENhcGFibGU6MTsKKwlVTE9ORwlJbXBUeEJGQ2FwYWJsZToxOworCVVMT05HCUNhbGlicmF0aW9uOjI7CisJVUxPTkcJRXhwQ1NJQ2FwYWJsZToxOworCVVMT05HCUV4cE5vQ29tU3RlZXJDYXBhYmxlOjE7CisJVUxPTkcJRXhwQ29tU3RlZXJDYXBhYmxlOjE7CisJVUxPTkcJRXhwQ1NJRmJrOjI7CisJVUxPTkcJRXhwTm9Db21CRjoyOworCVVMT05HCUV4cENvbUJGOjI7CisJVUxPTkcJTWluR3JvdXBpbmc6MjsKKwlVTE9ORwlDU0lCRkFudFN1cDoyOworCVVMT05HCU5vQ29tU3RlZXJCRkFudFN1cDoyOworCVVMT05HCUNvbVN0ZWVyQkZBbnRTdXA6MjsKKwlVTE9ORwlDU0lSb3dCRlN1cDoyOworCVVMT05HCUNoYW5Fc3RpbWF0aW9uOjI7CisJVUxPTkcJcnN2OjM7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworfSBIVF9CRl9DQVAsICpQSFRfQkZfQ0FQOworCisvLyAgSFQgYW50ZW5uYSBzZWxlY3Rpb24gZmllbGQgaW4gSFQgQ2FwIElFIC4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfSFRfQVNfQ0FQeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVQ0hBUglyc3Y6MTsKKwlVQ0hBUglUeFNvdW5kUFBEVToxOworCVVDSEFSCVJ4QVNlbDoxOworCVVDSEFSCUFudEluZEZiazoxOworCVVDSEFSCUV4cENTSUZiazoxOworCVVDSEFSCUFudEluZEZia1R4QVNFTDoxOworCVVDSEFSCUV4cENTSUZia1R4QVNFTDoxOworCVVDSEFSCUFudFNlbGVjdDoxOworI2Vsc2UKKwlVQ0hBUglBbnRTZWxlY3Q6MTsKKwlVQ0hBUglFeHBDU0lGYmtUeEFTRUw6MTsKKwlVQ0hBUglBbnRJbmRGYmtUeEFTRUw6MTsKKwlVQ0hBUglFeHBDU0lGYms6MTsKKwlVQ0hBUglBbnRJbmRGYms6MTsKKwlVQ0hBUglSeEFTZWw6MTsKKwlVQ0hBUglUeFNvdW5kUFBEVToxOworCVVDSEFSCXJzdjoxOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KK30gSFRfQVNfQ0FQLCAqUEhUX0FTX0NBUDsKKworLy8gRHJhZnQgMS4wIHNldCBJRSBsZW5ndGggMjYsIGJ1dCBpcyBleHRlbnNpYmxlLi4KKyNkZWZpbmUgU0laRV9IVF9DQVBfSUUJCTI2CisvLyBUaGUgc3RydWN0dXJlIGZvciBIVCBDYXBhYmlsaXR5IElFLgordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9IVF9DQVBBQklMSVRZX0lFeworCUhUX0NBUF9JTkZPCQlIdENhcEluZm87CisJSFRfQ0FQX1BBUk0JCUh0Q2FwUGFybTsKKy8vCUhUX01DU19TRVQJCUh0TUNTU2V0OworCVVDSEFSCQkJTUNTU2V0WzE2XTsKKwlFWFRfSFRfQ0FQX0lORk8JRXh0SHRDYXBJbmZvOworCUhUX0JGX0NBUAkJVHhCRkNhcDsJLy8gYmVhbWZvcm1pbmcgY2FwLiBydDI4NjBjIG5vdCBzdXBwb3J0IGJlYW1mb3JtaW5nLgorCUhUX0FTX0NBUAkJQVNDYXA7CS8vYW50ZW5uYSBzZWxlY3Rpb24uCit9IEhUX0NBUEFCSUxJVFlfSUUsICpQSFRfQ0FQQUJJTElUWV9JRTsKKworCisvLyA4MDIuMTFuIGRyYWZ0MyByZWxhdGVkIHN0cnVjdHVyZSBkZWZpbml0aW9ucy4KKy8vIDcuMy4yLjYwCisjZGVmaW5lIGRvdDExT0JTU1NjYW5QYXNzaXZlRHdlbGwJCQkJCQkJMjAJLy8gaW4gVFUuIG1pbiBhbW91bnQgb2YgdGltZSB0aGF0IHRoZSBTVEEgY29udGlub3VzbHkgc2NhbnMgZWFjaCBjaGFubmVsIHdoZW4gcGVyZm9ybWluZyBhbiBhY3RpdmUgT0JTUyBzY2FuLgorI2RlZmluZSBkb3QxMU9CU1NTY2FuQWN0aXZlRHdlbGwJCQkJCQkJMTAJLy8gaW4gVFUubWluIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIFNUQSBjb250aW5vdXNseSBzY2FucyBlYWNoIGNoYW5uZWwgd2hlbiBwZXJmb3JtaW5nIGFuIHBhc3NpdmUgT0JTUyBzY2FuLgorI2RlZmluZSBkb3QxMUJTU1dpZHRoVHJpZ2dlclNjYW5JbnRlcnZhbAkJCQkJMzAwICAvLyBpbiBzZWMuIG1heCBpbnRlcnZhbCBiZXR3ZWVuIHNjYW4gb3BlcmF0aW9ucyB0byBiZSBwZXJmb3JtZWQgdG8gZGV0ZWN0IEJTUyBjaGFubmVsIHdpZHRoIHRyaWdnZXIgZXZlbnRzLgorI2RlZmluZSBkb3QxMU9CU1NTY2FuUGFzc2l2ZVRvdGFsUGVyQ2hhbm5lbAkJCQkJMjAwCS8vIGluIFRVLiBtaW4gdG90YWwgYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgU1RBIHNjYW5zIGVhY2ggY2hhbm5lbCB3aGVuIHBlcmZvcm1pbmcgYSBwYXNzaXZlIE9CU1Mgc2Nhbi4KKyNkZWZpbmUgZG90MTFPQlNTU2NhbkFjdGl2ZVRvdGFsUGVyQ2hhbm5lbAkJCQkJMjAJLy9pbiBUVS4gbWluIHRvdGFsIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIFNUQSBzY2FucyBlYWNoIGNoYW5uZWwgd2hlbiBwZXJmb3JtaW5nIGEgYWN0aXZlIE9CU1Mgc2NhbgorI2RlZmluZSBkb3QxMUJTU1dpZHRoQ2hhbm5lbFRyYW5zYWN0aW9uRGVsYXlGYWN0b3IJCQk1CS8vIG1pbiByYXRpbyBiZXR3ZWVuIHRoZSBkZWxheSB0aW1lIGluIHBlcmZvcm1pbmcgYSBzd2l0Y2ggZnJvbSAyME1IeiBCU1MgdG8gMjAvNDAgQlNTIG9wZXJhdGlvbiBhbmQgdGhlIG1heGltYQorCQkJCQkJCQkJCQkJCQkJCS8vCWludGVydmFsIGJldHdlZW4gb3ZlcmxhcHBpbmcgQlNTIHNjYW4gb3BlcmF0aW9ucy4KKyNkZWZpbmUgZG90MTFCU1NTY2FuQWN0aXZpdHlUaHJlc2hvbGQJCQkJCQkyNQkvLyBpbiAlJSwgbWF4IHRvdGFsIHRpbWUgdGhhdCBhIFNUQSBtYXkgYmUgYWN0aXZlIG9uIHRoZSBtZWRpdW0gZHVyaW5nIGEgcGVyaW9kIG9mCisJCQkJCQkJCQkJCQkJCQkJLy8JKGRvdDExQlNTV2lkdGhDaGFubmVsVHJhbnNhY3Rpb25EZWxheUZhY3RvciAqIGRvdDExQlNTV2lkdGhUcmlnZ2VyU2NhbkludGVydmFsKSBzZWNvbmRzIHdpdGhvdXQKKwkJCQkJCQkJCQkJCQkJCQkvLwliZWluZyBvYmxpZ2F0ZWQgdG8gcGVyZm9ybSBPQlNTIFNjYW4gb3BlcmF0aW9ucy4gZGVmYXVsdCBpcyAyNSg9PSAwLjI1JSkKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9PVkVSTEFQX0JTU19TQ0FOX0lFeworCVVTSE9SVAkJU2NhblBhc3NpdmVEd2VsbDsKKwlVU0hPUlQJCVNjYW5BY3RpdmVEd2VsbDsKKwlVU0hPUlQJCVRyaWdnZXJTY2FuSW50OwkJCQkvLyBUcmlnZ2VyIHNjYW4gaW50ZXJ2YWwKKwlVU0hPUlQJCVBhc3NpdmVUYWxQZXJDaGFubmVsOwkJLy8gcGFzc2l2ZSB0b3RhbCBwZXIgY2hhbm5lbAorCVVTSE9SVAkJQWN0aXZlVGFsUGVyQ2hhbm5lbDsJCS8vIGFjdGl2ZSB0b3RhbCBwZXIgY2hhbm5lbAorCVVTSE9SVAkJRGVsYXlGYWN0b3I7CQkJCS8vIEJTUyB3aWR0aCBjaGFubmVsIHRyYW5zaXRpb24gZGVsYXkgZmFjdG9yCisJVVNIT1JUCQlTY2FuQWN0VGhyZTsJCQkJLy8gU2NhbiBBY3Rpdml0eSB0aHJlc2hvbGQKK31PVkVSTEFQX0JTU19TQ0FOX0lFLCAqUE9WRVJMQVBfQlNTX1NDQU5fSUU7CisKKworLy8gIDcuMy4yLjU2LiAyMC80MCBDb2V4aXN0ZW5jZSBlbGVtZW50IHVzZWQgaW4gIEVsZW1lbnQgSUQgPSA3MiA9IElFXzIwNDBfQlNTX0NPRVhJU1QKK3R5cGVkZWYgdW5pb24gUEFDS0VEIF9CU1NfMjA0MF9DT0VYSVNUX0lFeworIHN0cnVjdCBQQUNLRUQgeworICNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVUNIQVIJcnN2OjU7CisJVUNIQVIJQlNTMjBXaWR0aFJlcToxOworCVVDSEFSCUludG9sZXJhbnQ0MDoxOworCVVDSEFSCUluZm9SZXE6MTsKKyAjZWxzZQorCVVDSEFSCUluZm9SZXE6MTsKKwlVQ0hBUglJbnRvbGVyYW50NDA6MTsJCQkvLyBJbnRlci1CU1MuIHNldCAxIHdoZW4gcHJvaGliaXRzIGEgcmVjZWl2aW5nIEJTUyBmcm9tIG9wZXJhdGluZyBhcyBhIDIwLzQwIE1oeiBCU1MuCisJVUNIQVIJQlNTMjBXaWR0aFJlcToxOwkJLy8gSW50cmEtQlNTIHNldCAxIHdoZW4gcHJvaGliaXRzIGEgcmVjZWl2aW5nIEFQIGZyb20gb3BlcmF0aW5nIGl0cyBCU1MgYXMgYSAyMC80ME1IeiBCU1MuCisJVUNIQVIJcnN2OjU7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworICAgIH0gZmllbGQ7CisgVUNIQVIgICB3b3JkOworfSBCU1NfMjA0MF9DT0VYSVNUX0lFLCAqUEJTU18yMDQwX0NPRVhJU1RfSUU7CisKKwordHlwZWRlZiBzdHJ1Y3QgIF9UUklHR0VSX0VWRU5UQXsKKwlCT09MRUFOCQkJYlZhbGlkOworCVVDSEFSCUJTU0lEWzZdOworCVVDSEFSCVJlZ0NsYXNzOwkvLyBSZWd1bGF0b3J5IENsYXNzCisJVVNIT1JUCUNoYW5uZWw7CisJVUxPTkcJQ0RDb3VudGVyOyAgIC8vIE1haW50YWluIGEgc2VwZXJhdGUgY291bnQgZG93biBjb3VudGVyIGZvciBlYWNoIEV2ZW50IEEuCit9IFRSSUdHRVJfRVZFTlRBLCAqUFRSSUdHRVJfRVZFTlRBOworCisvLyAyMC80MCB0cmlnZ2VyIGV2ZW50IHRhYmxlCisvLyBJZiBvbmUgRXZlbnQgQSBkZWxldGUgb3IgY3JlYXRlZCwgb3IgaWYgRXZlbnQgQiBpcyBkZXRlY3RlZCBvciBub3QgZGV0ZWN0ZWQsIFNUQSBzaG91bGQgc2VuZCAyMDQwQlNTQ29leGlzdGVuY2UgdG8gQVAuCisjZGVmaW5lIE1BWF9UUklHR0VSX0VWRU5UCQk2NAordHlwZWRlZiBzdHJ1Y3QgIF9UUklHR0VSX0VWRU5UX1RBQnsKKwlVQ0hBUglFdmVudEFObzsKKwlUUklHR0VSX0VWRU5UQQlFdmVudEFbTUFYX1RSSUdHRVJfRVZFTlRdOworCVVMT05HCQkJRXZlbnRCQ291bnREb3duOwkvLyBDb3VudCBkb3duIGNvdW50ZXIgZm9yIEV2ZW50IEIuCit9IFRSSUdHRVJfRVZFTlRfVEFCLCAqUFRSSUdHRVJfRVZFTlRfVEFCOworCisvLyA3LjMuMjcgMjAvNDAgQnNzIENvZXhpc3RlbmNlIE1nbXQgY2FwYWJpbGl0eSB1c2VkIGluIGV4dGVuZGVkIGNhcGFiaWxpdGllcyBpbmZvcm1hdGlvbiBJRSggSUQgPSAxMjcgPSBJRV9FWFRfQ0FQQUJJTElUWSkuCisvLwlUaGlzIGlzIHRoZSBmaXJzdCBvY3RldCBhbmQgd2FzIGRlZmluZWQgaW4gODAyLjExbiBEMy4wMyBhbmQgODAyLjExeUQ5LjAKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRVhUX0NBUF9JTkZPX0VMRU1FTlR7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCXJzdjI6NTsKKwlVQ0hBUglFeHRlbmRDaGFubmVsU3dpdGNoOjE7CisJVUNIQVIJcnN2OjE7CisJVUNIQVIJQnNzQ29leGlzdE1nbXRTdXBwb3J0OjE7CisjZWxzZQorCVVDSEFSCUJzc0NvZXhpc3RNZ210U3VwcG9ydDoxOworCVVDSEFSCXJzdjoxOworCVVDSEFSCUV4dGVuZENoYW5uZWxTd2l0Y2g6MTsKKwlVQ0hBUglyc3YyOjU7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworfUVYVF9DQVBfSU5GT19FTEVNRU5ULCAqUEVYVF9DQVBfSU5GT19FTEVNRU5UOworCisKKy8vIDgwMi4xMW4gNy4zLjIuNjEKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfQlNTXzIwNDBfQ09FWElTVF9FTEVNRU5UeworCVVDSEFSCQkJCQlFbGVtZW50SUQ7CQkvLyBJRCA9IElFXzIwNDBfQlNTX0NPRVhJU1QgPSA3MgorCVVDSEFSCQkJCQlMZW47CisJQlNTXzIwNDBfQ09FWElTVF9JRQkJQnNzQ29leGlzdEllOworfUJTU18yMDQwX0NPRVhJU1RfRUxFTUVOVCwgKlBCU1NfMjA0MF9DT0VYSVNUX0VMRU1FTlQ7CisKKworLy84MDIuMTFuIDcuMy4yLjU5Cit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0JTU18yMDQwX0lOVE9MRVJBTlRfQ0hfUkVQT1JUeworCVVDSEFSCQkJCUVsZW1lbnRJRDsJCS8vIElEID0gSUVfMjA0MF9CU1NfSU5UT0xFUkFOVF9SRVBPUlQgPSA3MworCVVDSEFSCQkJCUxlbjsKKwlVQ0hBUgkJCQlSZWd1bGF0b3J5Q2xhc3M7CisJVUNIQVIJCQkJQ2hMaXN0WzBdOworfUJTU18yMDQwX0lOVE9MRVJBTlRfQ0hfUkVQT1JULCAqUEJTU18yMDQwX0lOVE9MRVJBTlRfQ0hfUkVQT1JUOworCisKKy8vIFRoZSBzdHJ1Y3R1cmUgZm9yIGNoYW5uZWwgc3dpdGNoIGFubm91Y2VtZW50IElFLiBUaGlzIGlzIGluIDgwMi4xMW4gRDMuMDMKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfQ0hBX1NXSVRDSF9BTk5PVU5DRV9JRXsKKwlVQ0hBUgkJCVN3aXRjaE1vZGU7CS8vY2hhbm5lbCBzd2l0Y2ggbW9kZQorCVVDSEFSCQkJTmV3Q2hhbm5lbDsJLy8KKwlVQ0hBUgkJCVN3aXRjaENvdW50OwkvLworfSBDSEFfU1dJVENIX0FOTk9VTkNFX0lFLCAqUENIQV9TV0lUQ0hfQU5OT1VOQ0VfSUU7CisKKworLy8gVGhlIHN0cnVjdHVyZSBmb3IgY2hhbm5lbCBzd2l0Y2ggYW5ub3VjZW1lbnQgSUUuIFRoaXMgaXMgaW4gODAyLjExbiBEMy4wMwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9TRUNfQ0hBX09GRlNFVF9JRXsKKwlVQ0hBUgkJCVNlY29uZGFyeUNoYW5uZWxPZmZzZXQ7CSAvLyAxOiBTZWNvbmRhcnkgYWJvdmUsIDM6IFNlY29uZGFyeSBiZWxvdywgMDogbm8gU2Vjb25kYXJ5Cit9IFNFQ19DSEFfT0ZGU0VUX0lFLCAqUFNFQ19DSEFfT0ZGU0VUX0lFOworCisKKy8vIFRoaXMgc3RydWN0dXJlIGlzIGV4dHJhY3RlZCBmcm9tIHN0cnVjdCBSVF9IVF9DQVBBQklMSVRZCit0eXBlZGVmIHN0cnVjdCB7CisJQk9PTEVBTgkJCWJIdEVuYWJsZTsJIC8vIElmIHdlIHNob3VsZCB1c2UgaHQgcmF0ZS4KKwlCT09MRUFOCQkJYlByZU5IdDsJIC8vIElmIHdlIHNob3VsZCB1c2UgaHQgcmF0ZS4KKwkvL1N1YnN0cmFjdCBmcm9tIEhUIENhcGFiaWxpdHkgSUUKKwlVQ0hBUgkJCU1DU1NldFsxNl07CS8vb25seSBzdXBvb3J0IE1DUz0wLTE1LDMyICwKK30gUlRfSFRfUEhZX0lORk8sICpQUlRfSFRfUEhZX0lORk87CisKKy8vVGhpcyBzdHJ1Y3R1cmUgc3Vic3RyYWN0cyByYWxpbmsgc3VwcG9ydHMgZnJvbSBhbGwgODAyLjExbi1yZWxhdGVkIGZlYXR1cmVzLgorLy9GZWF0dXJlcyBub3QgbGlzdGVkIGhlcmUgYnV0IGNvbnRhaW5lZCBpbiA4MDIuMTFuIHNwZWMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gcnQyODYwLgordHlwZWRlZiBzdHJ1Y3QgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVU0hPUlQJcnN2OjU7CisJVVNIT1JUCUFtc2R1U2l6ZToxOwkvLyBNYXggcmVjZWl2aW5nIEEtTVNEVSBzaXplCisJVVNIT1JUCUFtc2R1RW5hYmxlOjE7CS8vIEVuYWJsZSB0byB0cmFuc21pdCBBLU1TRFUuIFN1Z2dlc3QgZGlzYWJsZS4gV2Ugc2hvdWxkIHVzZSBBLU1QRFUgdG8gZ2FpbiBiZXN0IGJlbmlmaXQgb2YgODAyLjExbgorCVVTSE9SVAlSeFNUQkM6MjsJLy8gMiBiaXRzCisJVVNIT1JUCVR4U1RCQzoxOworCVVTSE9SVAlTaG9ydEdJZm9yNDA6MTsJLy9mb3I0ME1IegorCVVTSE9SVAlTaG9ydEdJZm9yMjA6MTsKKwlVU0hPUlQJR0Y6MTsJLy9ncmVlbiBmaWVsZAorCVVTSE9SVAlNaW1vUHM6MjsvL21pbW8gcG93ZXIgc2FmZSBNTVBTXworCVVTSE9SVAlDaGFubmVsV2lkdGg6MTsKKyNlbHNlCisJVVNIT1JUCUNoYW5uZWxXaWR0aDoxOworCVVTSE9SVAlNaW1vUHM6MjsvL21pbW8gcG93ZXIgc2FmZSBNTVBTXworCVVTSE9SVAlHRjoxOwkvL2dyZWVuIGZpZWxkCisJVVNIT1JUCVNob3J0R0lmb3IyMDoxOworCVVTSE9SVAlTaG9ydEdJZm9yNDA6MTsJLy9mb3I0ME1IegorCVVTSE9SVAlUeFNUQkM6MTsKKwlVU0hPUlQJUnhTVEJDOjI7CS8vIDIgYml0cworCVVTSE9SVAlBbXNkdUVuYWJsZToxOwkvLyBFbmFibGUgdG8gdHJhbnNtaXQgQS1NU0RVLiBTdWdnZXN0IGRpc2FibGUuIFdlIHNob3VsZCB1c2UgQS1NUERVIHRvIGdhaW4gYmVzdCBiZW5pZml0IG9mIDgwMi4xMW4KKwlVU0hPUlQJQW1zZHVTaXplOjE7CS8vIE1heCByZWNlaXZpbmcgQS1NU0RVIHNpemUKKwlVU0hPUlQJcnN2OjU7CisjZW5kaWYKKworCS8vU3Vic3RyYWN0IGZyb20gQWRkaW9udCBIVCBJTkZPIElFCisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCVJlY29tV2lkdGg6MTsKKwlVQ0hBUglFeHRDaGFuT2Zmc2V0OjI7CS8vIFBsZWFzZSBub3QgdGhlIGRpZmZlcmVuY2Ugd2l0aCBmb2xsb3dpbmcgCVVDSEFSCU5ld0V4dENoYW5uZWxPZmZzZXQ7IGZyb20gODAyLjExbgorCVVDSEFSCU1wZHVEZW5zaXR5OjM7CisJVUNIQVIJTWF4UkFtcGR1RmFjdG9yOjI7CisjZWxzZQorCVVDSEFSCU1heFJBbXBkdUZhY3RvcjoyOworCVVDSEFSCU1wZHVEZW5zaXR5OjM7CisJVUNIQVIJRXh0Q2hhbk9mZnNldDoyOwkvLyBQbGVhc2Ugbm90IHRoZSBkaWZmZXJlbmNlIHdpdGggZm9sbG93aW5nIAlVQ0hBUglOZXdFeHRDaGFubmVsT2Zmc2V0OyBmcm9tIDgwMi4xMW4KKwlVQ0hBUglSZWNvbVdpZHRoOjE7CisjZW5kaWYKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVU0hPUlQJcnN2MjoxMTsKKwlVU0hPUlQJT0JTU19Ob25IVEV4aXN0OjE7CisJVVNIT1JUCXJzdjM6MTsKKwlVU0hPUlQJTm9uR2ZQcmVzZW50OjE7CisJVVNIT1JUCU9wZXJhaW9uTW9kZToyOworI2Vsc2UKKwlVU0hPUlQJT3BlcmFpb25Nb2RlOjI7CisJVVNIT1JUCU5vbkdmUHJlc2VudDoxOworCVVTSE9SVAlyc3YzOjE7CisJVVNIT1JUCU9CU1NfTm9uSFRFeGlzdDoxOworCVVTSE9SVAlyc3YyOjExOworI2VuZGlmCisKKwkvLyBOZXcgRXh0ZW5zaW9uIENoYW5uZWwgT2Zmc2V0IElFCisJVUNIQVIJTmV3RXh0Q2hhbm5lbE9mZnNldDsKKwkvLyBFeHRlbnNpb24gQ2FwYWJpbGl0eSBJRSA9IDEyNworCVVDSEFSCUJTU0NvZXhpc3QyMDQwOworfSBSVF9IVF9DQVBBQklMSVRZLCAqUFJUX0hUX0NBUEFCSUxJVFk7CisKKy8vICAgZmllbGQgaW4gQWRkdGlvbmFsIEhUIEluZm9ybWF0aW9uIElFIC4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCVNlckludGVyR3JhbnU6MzsKKwlVQ0hBUglTX1BTTVBTdXA6MTsKKwlVQ0hBUglSaWZzTW9kZToxOworCVVDSEFSCVJlY29tV2lkdGg6MTsKKwlVQ0hBUglFeHRDaGFuT2Zmc2V0OjI7CisjZWxzZQorCVVDSEFSCUV4dENoYW5PZmZzZXQ6MjsKKwlVQ0hBUglSZWNvbVdpZHRoOjE7CisJVUNIQVIJUmlmc01vZGU6MTsKKwlVQ0hBUglTX1BTTVBTdXA6MTsJIC8vSW5kaWNhdGUgc3VwcG9ydCBmb3Igc2NoZWR1bGVkIFBTTVAKKwlVQ0hBUglTZXJJbnRlckdyYW51OjM7CSAvL3NlcnZpY2UgaW50ZXJ2YWwgZ3JhbnVsYXJpdHkKKyNlbmRpZgorfSBBRERfSFRJTkZPLCAqUEFERF9IVElORk87CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVVNIT1JUCXJzdjI6MTE7CisJVVNIT1JUCU9CU1NfTm9uSFRFeGlzdDoxOworCVVTSE9SVAlyc3Y6MTsKKwlVU0hPUlQJTm9uR2ZQcmVzZW50OjE7CisJVVNIT1JUCU9wZXJhaW9uTW9kZToyOworI2Vsc2UKKwlVU0hPUlQJT3BlcmFpb25Nb2RlOjI7CisJVVNIT1JUCU5vbkdmUHJlc2VudDoxOworCVVTSE9SVAlyc3Y6MTsKKwlVU0hPUlQJT0JTU19Ob25IVEV4aXN0OjE7CisJVVNIT1JUCXJzdjI6MTE7CisjZW5kaWYKK30gQUREX0hUSU5GTzIsICpQQUREX0hUSU5GTzI7CisKKworLy8gVE9ETzogTmVlZCBzeW5jIHdpdGggc3BlYyBhYm91dCB0aGUgZGVmaW5pdGlvbiBvZiBTdGJjTWNzLiBJbiBEcmFmdCAzLjAzLCBpdCdzIHJlc2VydmVkLgordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVU0hPUlQJcnN2OjQ7CisJVVNIT1JUCVBjb1BoYXNlOjE7CisJVVNIT1JUCVBjb0FjdGl2ZToxOworCVVTSE9SVAlMc2lnVHhvcFByb3Q6MTsKKwlVU0hPUlQJU1RCQ0JlYWNvbjoxOworCVVTSE9SVAlEdWFsQ1RTUHJvdGVjdDoxOworCVVTSE9SVAlEdWFsQmVhY29uOjE7CisJVVNIT1JUCVN0YmNNY3M6NjsKKyNlbHNlCisJVVNIT1JUCVN0YmNNY3M6NjsKKwlVU0hPUlQJRHVhbEJlYWNvbjoxOworCVVTSE9SVAlEdWFsQ1RTUHJvdGVjdDoxOworCVVTSE9SVAlTVEJDQmVhY29uOjE7CisJVVNIT1JUCUxzaWdUeG9wUHJvdDoxOwkvLyBMLVNJRyBUWE9QIHByb3RlY3Rpb24gZnVsbCBzdXBwb3J0CisJVVNIT1JUCVBjb0FjdGl2ZToxOworCVVTSE9SVAlQY29QaGFzZToxOworCVVTSE9SVAlyc3Y6NDsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCit9IEFERF9IVElORk8zLCAqUEFERF9IVElORk8zOworCisjZGVmaW5lIFNJWkVfQUREX0hUX0lORk9fSUUJCTIyCit0eXBlZGVmIHN0cnVjdCAgUEFDS0VEeworCVVDSEFSCQkJCUNvbnRyb2xDaGFuOworCUFERF9IVElORk8JCQlBZGRIdEluZm87CisJQUREX0hUSU5GTzIJCQlBZGRIdEluZm8yOworCUFERF9IVElORk8zCQkJQWRkSHRJbmZvMzsKKwlVQ0hBUgkJCQlNQ1NTZXRbMTZdOwkJLy8gQmFzaWMgTUNTIHNldAorfSBBRERfSFRfSU5GT19JRSwgKlBBRERfSFRfSU5GT19JRTsKKwordHlwZWRlZiBzdHJ1Y3QgIFBBQ0tFRHsKKwlVQ0hBUgkJCQlOZXdFeHRDaGFuT2Zmc2V0OworfSBORVdfRVhUX0NIQU5fSUUsICpQTkVXX0VYVF9DSEFOX0lFOworCisKKy8vIDQtYnl0ZSBIVEMgZmllbGQuICBtYXliZSBpbmNsdWRlZCBpbiBhbnkgZnJhbWUgZXhjZXB0IG5vbi1RT1MgZGF0YSBmcmFtZS4gIFRoZSBPcmRlciBiaXQgbXVzdCBzZXQgMS4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorICAgIFVJTlQzMgkJUkRHOjE7CS8vUkRHIC8gTW9yZSBQUERVCisgICAgVUlOVDMyCQlBQ0NvbnN0cmFpbnQ6MTsJLy9mZWVkYmFjayByZXF1ZXN0CisgICAgVUlOVDMyCQlyc3Y6NTsgIC8vY2FsaWJyYXRpb24gc2VxdWVuY2UKKyAgICBVSU5UMzIJCVpMRkFubm91Y2U6MTsJLy8gWkxGIGFubm91bmNlbWVudAorICAgIFVJTlQzMgkJQ1NJU1RFRVJJTkc6MjsJLy9DU0kvIFNURUVSSU5HCisgICAgVUlOVDMyCQlGQktSZXE6MjsJLy9mZWVkYmFjayByZXF1ZXN0CisgICAgVUlOVDMyCQlDYWxTZXE6MjsgIC8vY2FsaWJyYXRpb24gc2VxdWVuY2UKKyAgICBVSU5UMzIJCUNhbFBvczoyOwkvLyBjYWxpYnJhdGlvbiBwb3NpdGlvbgorICAgIFVJTlQzMgkJTUZCb3JBU0M6NzsJLy9MaW5rIGFkYXB0YXRpb24gZmVlZGJhY2sgY29udGFpbmluZyByZWNvbW1lbmRlZCBNQ1MuIDB4N2YgZm9yIG5vIGZlZWRiYWNrIG9yIG5vdCBhdmFpbGFibGUKKyAgICBVSU5UMzIJCU1GUzozOwkvL1NFVCB0byB0aGUgcmVjZWl2ZWQgdmFsdWUgb2YgTVJTLiAweDExMSBmb3IgdW5zb2xpY2l0ZWQgTUZCLgorICAgIFVJTlQzMgkJTVJTb3JBU0k6MzsJLy8gTVJRIFNlcXVlbmNlIGlkZW50aWZpZXIuIHVuY2hhbmdlZCBkdXJpbmcgZW50aXJlIHByb2NlZHVyZS4gMHgwMDAtMHgxMTAuCisgICAgVUlOVDMyCQlNUlE6MTsJLy9NQ1MgZmVlZGJhY2suIFJlcXVlc3QgZm9yIGEgTUNTIGZlZWRiYWNrCisgICAgVUlOVDMyCQlUUlE6MTsJLy9zb3VuZGluZyByZXF1ZXN0CisgICAgVUlOVDMyCQlNQToxOwkvL21hbmFnZW1lbnQgYWN0aW9uIHBheWxvYWQgZXhpc3QgaW4gKFFvUyBOdWxsK0hUQykKKyNlbHNlCisgICAgVUlOVDMyCQlNQToxOwkvL21hbmFnZW1lbnQgYWN0aW9uIHBheWxvYWQgZXhpc3QgaW4gKFFvUyBOdWxsK0hUQykKKyAgICBVSU5UMzIJCVRSUToxOwkvL3NvdW5kaW5nIHJlcXVlc3QKKyAgICBVSU5UMzIJCU1SUToxOwkvL01DUyBmZWVkYmFjay4gUmVxdWVzdCBmb3IgYSBNQ1MgZmVlZGJhY2sKKyAgICBVSU5UMzIJCU1SU29yQVNJOjM7CS8vIE1SUSBTZXF1ZW5jZSBpZGVudGlmaWVyLiB1bmNoYW5nZWQgZHVyaW5nIGVudGlyZSBwcm9jZWR1cmUuIDB4MDAwLTB4MTEwLgorICAgIFVJTlQzMgkJTUZTOjM7CS8vU0VUIHRvIHRoZSByZWNlaXZlZCB2YWx1ZSBvZiBNUlMuIDB4MTExIGZvciB1bnNvbGljaXRlZCBNRkIuCisgICAgVUlOVDMyCQlNRkJvckFTQzo3OwkvL0xpbmsgYWRhcHRhdGlvbiBmZWVkYmFjayBjb250YWluaW5nIHJlY29tbWVuZGVkIE1DUy4gMHg3ZiBmb3Igbm8gZmVlZGJhY2sgb3Igbm90IGF2YWlsYWJsZQorICAgIFVJTlQzMgkJQ2FsUG9zOjI7CS8vIGNhbGlicmF0aW9uIHBvc2l0aW9uCisgICAgVUlOVDMyCQlDYWxTZXE6MjsgIC8vY2FsaWJyYXRpb24gc2VxdWVuY2UKKyAgICBVSU5UMzIJCUZCS1JlcToyOwkvL2ZlZWRiYWNrIHJlcXVlc3QKKyAgICBVSU5UMzIJCUNTSVNURUVSSU5HOjI7CS8vQ1NJLyBTVEVFUklORworICAgIFVJTlQzMgkJWkxGQW5ub3VjZToxOwkvLyBaTEYgYW5ub3VuY2VtZW50CisgICAgVUlOVDMyCQlyc3Y6NTsgIC8vY2FsaWJyYXRpb24gc2VxdWVuY2UKKyAgICBVSU5UMzIJCUFDQ29uc3RyYWludDoxOwkvL2ZlZWRiYWNrIHJlcXVlc3QKKyAgICBVSU5UMzIJCVJERzoxOwkvL1JERyAvIE1vcmUgUFBEVQorI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCit9IEhUX0NPTlRST0wsICpQSFRfQ09OVFJPTDsKKworLy8gMi1ieXRlIFFPUyBDT05UUk9MIGZpZWxkCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBVU0hPUlQgICAgICBUeG9wX1F1ZXVlU2l6ZTo4OworICAgIFVTSE9SVCAgICAgIEFNc2R1UHJlc2VudDoxOworICAgIFVTSE9SVCAgICAgIEFja1BvbGljeToyOyAgLy8wOiBub3JtYWwgQUNLIDE6Tm8gQUNLIDI6c2NoZWR1bGVkIHVuZGVyIE1UQkEvUFNNUCAgMzogQkEKKyAgICBVU0hPUlQgICAgICBFT1NQOjE7CisgICAgVVNIT1JUICAgICAgVElEOjQ7CisjZWxzZQorICAgIFVTSE9SVCAgICAgIFRJRDo0OworICAgIFVTSE9SVCAgICAgIEVPU1A6MTsKKyAgICBVU0hPUlQgICAgICBBY2tQb2xpY3k6MjsgIC8vMDogbm9ybWFsIEFDSyAxOk5vIEFDSyAyOnNjaGVkdWxlZCB1bmRlciBNVEJBL1BTTVAgIDM6IEJBCisgICAgVVNIT1JUICAgICAgQU1zZHVQcmVzZW50OjE7CisgICAgVVNIT1JUICAgICAgVHhvcF9RdWV1ZVNpemU6ODsKKyNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLworfSBRT1NfQ09OVFJPTCwgKlBRT1NfQ09OVFJPTDsKKworLy8gMi1ieXRlIEZyYW1lIGNvbnRyb2wgZmllbGQKK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVTSE9SVAkJT3JkZXI6MTsJCQkvLyBTdHJpY3Qgb3JkZXIgZXhwZWN0ZWQKKwlVU0hPUlQJCVdlcDoxOwkJCQkvLyBXZXAgZGF0YQorCVVTSE9SVAkJTW9yZURhdGE6MTsJCQkvLyBNb3JlIGRhdGEgYml0CisJVVNIT1JUCQlQd3JNZ210OjE7CQkJLy8gUG93ZXIgbWFuYWdlbWVudCBiaXQKKwlVU0hPUlQJCVJldHJ5OjE7CQkJLy8gUmV0cnkgc3RhdHVzIGJpdAorCVVTSE9SVAkJTW9yZUZyYWc6MTsJCQkvLyBNb3JlIGZyYWdtZW50IGJpdAorCVVTSE9SVAkJRnJEczoxOwkJCQkvLyBGcm9tIERTIGluZGljYXRpb24KKwlVU0hPUlQJCVRvRHM6MTsJCQkJLy8gVG8gRFMgaW5kaWNhdGlvbgorCVVTSE9SVAkJU3ViVHlwZTo0OwkJCS8vIE1TRFUgc3VidHlwZQorCVVTSE9SVAkJVHlwZToyOwkJCQkvLyBNU0RVIHR5cGUKKwlVU0hPUlQJCVZlcjoyOwkJCQkvLyBQcm90b2NvbCB2ZXJzaW9uCisjZWxzZQorCVVTSE9SVAkJVmVyOjI7CQkJCS8vIFByb3RvY29sIHZlcnNpb24KKwlVU0hPUlQJCVR5cGU6MjsJCQkJLy8gTVNEVSB0eXBlCisJVVNIT1JUCQlTdWJUeXBlOjQ7CQkJLy8gTVNEVSBzdWJ0eXBlCisJVVNIT1JUCQlUb0RzOjE7CQkJCS8vIFRvIERTIGluZGljYXRpb24KKwlVU0hPUlQJCUZyRHM6MTsJCQkJLy8gRnJvbSBEUyBpbmRpY2F0aW9uCisJVVNIT1JUCQlNb3JlRnJhZzoxOwkJCS8vIE1vcmUgZnJhZ21lbnQgYml0CisJVVNIT1JUCQlSZXRyeToxOwkJCS8vIFJldHJ5IHN0YXR1cyBiaXQKKwlVU0hPUlQJCVB3ck1nbXQ6MTsJCQkvLyBQb3dlciBtYW5hZ2VtZW50IGJpdAorCVVTSE9SVAkJTW9yZURhdGE6MTsJCQkvLyBNb3JlIGRhdGEgYml0CisJVVNIT1JUCQlXZXA6MTsJCQkJLy8gV2VwIGRhdGEKKwlVU0hPUlQJCU9yZGVyOjE7CQkJLy8gU3RyaWN0IG9yZGVyIGV4cGVjdGVkCisjZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KK30gRlJBTUVfQ09OVFJPTCwgKlBGUkFNRV9DT05UUk9MOworCit0eXBlZGVmCXN0cnVjdAlQQUNLRUQgX0hFQURFUl84MDJfMTEJeworICAgIEZSQU1FX0NPTlRST0wgICBGQzsKKyAgICBVU0hPUlQgICAgICAgICAgRHVyYXRpb247CisgICAgVUNIQVIgICAgICAgICAgIEFkZHIxW01BQ19BRERSX0xFTl07CisgICAgVUNIQVIgICAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07CisJVUNIQVIJCQlBZGRyM1tNQUNfQUREUl9MRU5dOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVU0hPUlQJCQlTZXF1ZW5jZToxMjsKKwlVU0hPUlQJCQlGcmFnOjQ7CisjZWxzZQorCVVTSE9SVAkJCUZyYWc6NDsKKwlVU0hPUlQJCQlTZXF1ZW5jZToxMjsKKyNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLworCVVDSEFSCQkJT2N0ZXRbMF07Cit9CUhFQURFUl84MDJfMTEsICpQSEVBREVSXzgwMl8xMTsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV84MDJfMTEgeworICAgIEhFQURFUl84MDJfMTEgICBIZHI7CisgICAgVUNIQVIgICAgICAgICAgICBPY3RldFsxXTsKK30gICBGUkFNRV84MDJfMTEsICpQRlJBTUVfODAyXzExOworCisvLyBRb1NOdWxsIGVtYmVkZGluZyBvZiBtYW5hZ2VtZW50IGFjdGlvbi4gV2hlbiBIVCBDb250cm9sIE1BIGZpZWxkIHNldCB0byAxLgordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9NQV9CT0RZIHsKKyAgICBVQ0hBUiAgICAgICAgICAgIENhdGVnb3J5OworICAgIFVDSEFSICAgICAgICAgICAgQWN0aW9uOworICAgIFVDSEFSICAgICAgICAgICAgT2N0ZXRbMV07Cit9ICAgTUFfQk9EWSwgKlBNQV9CT0RZOworCit0eXBlZGVmCXN0cnVjdAlQQUNLRUQgX0hFQURFUl84MDJfMwl7CisgICAgVUNIQVIgICAgICAgICAgIERBQWRkcjFbTUFDX0FERFJfTEVOXTsKKyAgICBVQ0hBUiAgICAgICAgICAgU0FBZGRyMltNQUNfQUREUl9MRU5dOworICAgIFVDSEFSICAgICAgICAgICBPY3RldFsyXTsKK30JSEVBREVSXzgwMl8zLCAqUEhFQURFUl84MDJfMzsKKy8vLy9CbG9jayBBQ0sgcmVsYXRlZCBmb3JtYXQKKy8vIDItYnl0ZSBCQSBQYXJhbWV0ZXIgIGZpZWxkICBpbiAJREVMQkEgZnJhbWVzIHRvIHRlcm1pbmF0ZSBhbiBhbHJlYWR5IHNldCB1cCBiQQordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBVU0hPUlQgICAgICBUSUQ6NDsJLy8gdmFsdWUgb2YgVEMgb3MgVFMKKyAgICBVU0hPUlQgICAgICBJbml0aWF0b3I6MTsJLy8gMTogb3JpZ2luYXRvciAgICAwOnJlY2lwaWVudAorICAgIFVTSE9SVCAgICAgIFJzdjoxMTsJLy8gYWx3YXlzIHNldCB0byAwCisjZWxzZQorICAgIFVTSE9SVCAgICAgIFJzdjoxMTsJLy8gYWx3YXlzIHNldCB0byAwCisgICAgVVNIT1JUICAgICAgSW5pdGlhdG9yOjE7CS8vIDE6IG9yaWdpbmF0b3IgICAgMDpyZWNpcGllbnQKKyAgICBVU0hPUlQgICAgICBUSUQ6NDsJLy8gdmFsdWUgb2YgVEMgb3MgVFMKKyNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLworfSBERUxCQV9QQVJNLCAqUERFTEJBX1BBUk07CisKKy8vIDItYnl0ZSBCQSBQYXJhbWV0ZXIgU2V0IGZpZWxkICBpbiBBRERCQSBmcmFtZXMgdG8gc2lnbmFsIHBhcm0gZm9yIHNldHRpbmcgdXAgYSBCQQordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgVVNIT1JUICAgICAgQnVmU2l6ZToxMDsJLy8gbnVtYmVyIG9mIGJ1ZmZlIG9mIHNpemUgMjMwNCBvY3RldHNyCisgICAgVVNIT1JUICAgICAgVElEOjQ7CS8vIHZhbHVlIG9mIFRDIG9zIFRTCisgICAgVVNIT1JUICAgICAgQkFQb2xpY3k6MTsJLy8gMTogaW1tZWRpYXRlbHkgQkEgICAgMDpkZWxheWVkIEJBCisgICAgVVNIT1JUICAgICAgQU1TRFVTdXBwb3J0ZWQ6MTsJLy8gMDogbm90IHBlcm1pdHRlZAkJMTogcGVybWl0dGVkCisjZWxzZQorICAgIFVTSE9SVCAgICAgIEFNU0RVU3VwcG9ydGVkOjE7CS8vIDA6IG5vdCBwZXJtaXR0ZWQJCTE6IHBlcm1pdHRlZAorICAgIFVTSE9SVCAgICAgIEJBUG9saWN5OjE7CS8vIDE6IGltbWVkaWF0ZWx5IEJBICAgIDA6ZGVsYXllZCBCQQorICAgIFVTSE9SVCAgICAgIFRJRDo0OwkvLyB2YWx1ZSBvZiBUQyBvcyBUUworICAgIFVTSE9SVCAgICAgIEJ1ZlNpemU6MTA7CS8vIG51bWJlciBvZiBidWZmZSBvZiBzaXplIDIzMDQgb2N0ZXRzcgorI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCit9IEJBX1BBUk0sICpQQkFfUEFSTTsKKworLy8gMi1ieXRlIEJBIFN0YXJ0aW5nIFNlcSBDT05UUk9MIGZpZWxkCit0eXBlZGVmIHVuaW9uIFBBQ0tFRCB7CisgICAgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorICAgIFVTSE9SVCAgICAgIFN0YXJ0U2VxOjEyOyAgIC8vIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgMXN0IE1TRFUgZm9yIHdoaWNoIHRoaXMgQkFSIGlzIHNlbnQKKwlVU0hPUlQgICAgICBGcmFnTnVtOjQ7CS8vIGFsd2F5cyBzZXQgdG8gMAorI2Vsc2UKKyAgICBVU0hPUlQgICAgICBGcmFnTnVtOjQ7CS8vIGFsd2F5cyBzZXQgdG8gMAorCVVTSE9SVCAgICAgIFN0YXJ0U2VxOjEyOyAgIC8vIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgMXN0IE1TRFUgZm9yIHdoaWNoIHRoaXMgQkFSIGlzIHNlbnQKKyNlbmRpZiAvKiBSVF9CSUdfRU5ESUFOICovCisgICAgfSAgIGZpZWxkOworICAgIFVTSE9SVCAgICAgICAgICAgd29yZDsKK30gQkFTRVFfQ09OVFJPTCwgKlBCQVNFUV9DT05UUk9MOworCisvL0JBQ29udHJvbCBhbmQgQkFSQ29udHJvbCBhcmUgdGhlIHNhbWUKKy8vIDItYnl0ZSBCQSBDT05UUk9MIGZpZWxkIGluIEJBIGZyYW1lCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBVU0hPUlQgICAgICBUSUQ6NDsKKyAgICBVU0hPUlQgICAgICBSc3Y6OTsKKyAgICBVU0hPUlQgICAgICBDb21wcmVzc2VkOjE7CisgICAgVVNIT1JUICAgICAgTVRJRDoxOwkJLy9FV0MgVjEuMjQKKyAgICBVU0hPUlQgICAgICBBQ0tQb2xpY3k6MTsgLy8gb25seSByZWxhdGVkIHRvIE4tRGVsYXllZCBCQS4gQnV0IG5vdCBzdXBwb3J0IGluIFJUMjg2MGIuIDA6Tm9ybWFsQUNLICAxOk5vIEFDSworI2Vsc2UKKyAgICBVU0hPUlQgICAgICBBQ0tQb2xpY3k6MTsgLy8gb25seSByZWxhdGVkIHRvIE4tRGVsYXllZCBCQS4gQnV0IG5vdCBzdXBwb3J0IGluIFJUMjg2MGIuIDA6Tm9ybWFsQUNLICAxOk5vIEFDSworICAgIFVTSE9SVCAgICAgIE1USUQ6MTsJCS8vRVdDIFYxLjI0CisgICAgVVNIT1JUICAgICAgQ29tcHJlc3NlZDoxOworICAgIFVTSE9SVCAgICAgIFJzdjo5OworICAgIFVTSE9SVCAgICAgIFRJRDo0OworI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCit9IEJBX0NPTlRST0wsICpQQkFfQ09OVFJPTDsKKworLy8gMi1ieXRlIEJBUiBDT05UUk9MIGZpZWxkIGluIEJBUiBmcmFtZQordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgVVNIT1JUICAgICAgVElEOjQ7CisgICAgVVNIT1JUICAgICAgUnN2MTo5OworICAgIFVTSE9SVCAgICAgIENvbXByZXNzZWQ6MTsKKyAgICBVU0hPUlQgICAgICBNVElEOjE7CQkvL2lmIHRoaXMgYml0MSwgdXNlICBGUkFNRV9NVEJBX1JFUSwgIGlmIDAsIHVzZSBGUkFNRV9CQV9SRVEKKyAgICBVU0hPUlQgICAgICBBQ0tQb2xpY3k6MTsKKyNlbHNlCisgICAgVVNIT1JUICAgICAgQUNLUG9saWN5OjE7IC8vIDA6bm9ybWFsIGFjaywgIDE6bm8gYWNrLgorICAgIFVTSE9SVCAgICAgIE1USUQ6MTsJCS8vaWYgdGhpcyBiaXQxLCB1c2UgIEZSQU1FX01UQkFfUkVRLCAgaWYgMCwgdXNlIEZSQU1FX0JBX1JFUQorICAgIFVTSE9SVCAgICAgIENvbXByZXNzZWQ6MTsKKyAgICBVU0hPUlQgICAgICBSc3YxOjk7CisgICAgVVNIT1JUICAgICAgVElEOjQ7CisjZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KK30gQkFSX0NPTlRST0wsICpQQkFSX0NPTlRST0w7CisKKy8vIEJBUkNvbnRyb2wgaW4gTVRCQVIgZnJhbWUKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorICAgIFVTSE9SVCAgICAgIE51bVRJRDo0OworICAgIFVTSE9SVCAgICAgIFJzdjE6OTsKKyAgICBVU0hPUlQgICAgICBDb21wcmVzc2VkOjE7CisgICAgVVNIT1JUICAgICAgTVRJRDoxOworICAgIFVTSE9SVCAgICAgIEFDS1BvbGljeToxOworI2Vsc2UKKyAgICBVU0hPUlQgICAgICBBQ0tQb2xpY3k6MTsKKyAgICBVU0hPUlQgICAgICBNVElEOjE7CisgICAgVVNIT1JUICAgICAgQ29tcHJlc3NlZDoxOworICAgIFVTSE9SVCAgICAgIFJzdjE6OTsKKyAgICBVU0hPUlQgICAgICBOdW1USUQ6NDsKKyNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLworfSBNVEJBUl9DT05UUk9MLCAqUE1UQkFSX0NPTlRST0w7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorICAgIFVTSE9SVCAgICAgIFRJRDo0OworICAgIFVTSE9SVCAgICAgIFJzdjE6MTI7CisjZWxzZQorICAgIFVTSE9SVCAgICAgIFJzdjE6MTI7CisgICAgVVNIT1JUICAgICAgVElEOjQ7CisjZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KK30gUEVSX1RJRF9JTkZPLCAqUFBFUl9USURfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgeworCVBFUl9USURfSU5GTyAgICAgIFBlclRJRDsKKwlCQVNFUV9DT05UUk9MIAkgQkFTdGFydGluZ1NlcTsKK30gRUFDSF9USUQsICpQRUFDSF9USUQ7CisKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9QU1BPTExfRlJBTUUgeworICAgIEZSQU1FX0NPTlRST0wgICBGQzsKKyAgICBVU0hPUlQgICAgICAgICAgQWlkOworICAgIFVDSEFSICAgICAgICAgICBCc3NpZFtNQUNfQUREUl9MRU5dOworICAgIFVDSEFSICAgICAgICAgICBUYVtNQUNfQUREUl9MRU5dOworfSAgIFBTUE9MTF9GUkFNRSwgKlBQU1BPTExfRlJBTUU7CisKK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCBfUlRTX0ZSQU1FCXsKKyAgICBGUkFNRV9DT05UUk9MICAgRkM7CisgICAgVVNIT1JUICAgICAgICAgIER1cmF0aW9uOworICAgIFVDSEFSICAgICAgICAgICBBZGRyMVtNQUNfQUREUl9MRU5dOworICAgIFVDSEFSICAgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworfVJUU19GUkFNRSwgKlBSVFNfRlJBTUU7CisKKy8vIEJBUkVRIEFORCBNVEJBUkVRIGhhdmUgdGhlIHNhbWUgc3VidHlwZSBCQVIsIDgwMi4xMW4gQkFSIHVzZSBjb21wcmVzc2VkIGJpdG1hcC4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfQkFfUkVRIHsKKwlGUkFNRV9DT05UUk9MICAgRkM7CisJVVNIT1JUICAgICAgICAgIER1cmF0aW9uOworCVVDSEFSICAgICAgICAgICBBZGRyMVtNQUNfQUREUl9MRU5dOworCVVDSEFSICAgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworCUJBUl9DT05UUk9MICBCQVJDb250cm9sOworCUJBU0VRX0NPTlRST0wgCSBCQVN0YXJ0aW5nU2VxOworfSAgIEZSQU1FX0JBX1JFUSwgKlBGUkFNRV9CQV9SRVE7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfTVRCQV9SRVEgeworCUZSQU1FX0NPTlRST0wgICBGQzsKKwlVU0hPUlQgICAgICAgICAgRHVyYXRpb247CisJVUNIQVIgICAgICAgICAgIEFkZHIxW01BQ19BRERSX0xFTl07CisJVUNIQVIgICAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07CisJTVRCQVJfQ09OVFJPTCAgTVRCQVJDb250cm9sOworCVBFUl9USURfSU5GTwlQZXJUSURJbmZvOworCUJBU0VRX0NPTlRST0wgCSBCQVN0YXJ0aW5nU2VxOworfSAgIEZSQU1FX01UQkFfUkVRLCAqUEZSQU1FX01UQkFfUkVROworCisvLyBDb21wcmVzc2VkIGZvcm1hdCBpcyBtYW5kYW50b3J5IGluIEhUIFNUQQordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9NVEJBIHsKKwlGUkFNRV9DT05UUk9MICAgRkM7CisJVVNIT1JUICAgICAgICAgIER1cmF0aW9uOworCVVDSEFSICAgICAgICAgICBBZGRyMVtNQUNfQUREUl9MRU5dOworCVVDSEFSICAgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworCUJBX0NPTlRST0wgIEJBQ29udHJvbDsKKwlCQVNFUV9DT05UUk9MIAkgQkFTdGFydGluZ1NlcTsKKwlVQ0hBUgkJQml0TWFwWzhdOworfSAgIEZSQU1FX01UQkEsICpQRlJBTUVfTVRCQTsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9QU01QX0FDVElPTiB7CisJSEVBREVSXzgwMl8xMSAgIEhkcjsKKwlVQ0hBUglDYXRlZ29yeTsKKwlVQ0hBUglBY3Rpb247CisJVUNIQVIJUHNtcDsJLy8gNy4zLjEuMjUKK30gICBGUkFNRV9QU01QX0FDVElPTiwgKlBGUkFNRV9QU01QX0FDVElPTjsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9BQ1RJT05fSERSIHsKKwlIRUFERVJfODAyXzExICAgSGRyOworCVVDSEFSCUNhdGVnb3J5OworCVVDSEFSCUFjdGlvbjsKK30gICBGUkFNRV9BQ1RJT05fSERSLCAqUEZSQU1FX0FDVElPTl9IRFI7CisKKy8vQWN0aW9uIEZyYW1lCisvL0FjdGlvbiBGcmFtZSAgQ2F0ZWdvcnk6U3BlY3RydW0sICBBY3Rpb246Q2hhbm5lbCBTd2l0Y2guIDcuMy4yLjIwCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0NIQU5fU1dJVENIX0FOTk9VTkNFIHsKKwlVQ0hBUgkJCQkJRWxlbWVudElEOwkvLyBJRCA9IElFX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVCA9IDM3CisJVUNIQVIJCQkJCUxlbjsKKwlDSEFfU1dJVENIX0FOTk9VTkNFX0lFCUNTQW5ub3VuY2VJZTsKK30gICBDSEFOX1NXSVRDSF9BTk5PVU5DRSwgKlBDSEFOX1NXSVRDSF9BTk5PVU5DRTsKKworCisvLzgwMi4xMW4gOiA3LjMuMi4yMGEKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfU0VDT05EX0NIQU5fT0ZGU0VUIHsKKwlVQ0hBUgkJCQlFbGVtZW50SUQ7CQkvLyBJRCA9IElFX1NFQ09OREFSWV9DSF9PRkZTRVQgPSA2MgorCVVDSEFSCQkJCUxlbjsKKwlTRUNfQ0hBX09GRlNFVF9JRQlTZWNDaE9mZnNldEllOworfSAgIFNFQ09ORF9DSEFOX09GRlNFVCwgKlBTRUNPTkRfQ0hBTl9PRkZTRVQ7CisKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9TUEVUUlVNX0NTIHsKKwlIRUFERVJfODAyXzExICAgSGRyOworCVVDSEFSCUNhdGVnb3J5OworCVVDSEFSCUFjdGlvbjsKKwlDSEFOX1NXSVRDSF9BTk5PVU5DRQlDU0Fubm91bmNlOworCVNFQ09ORF9DSEFOX09GRlNFVAkJU2Vjb25kQ2hhbm5lbDsKK30gICBGUkFNRV9TUEVUUlVNX0NTLCAqUEZSQU1FX1NQRVRSVU1fQ1M7CisKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9BRERCQV9SRVEgeworCUhFQURFUl84MDJfMTEgICBIZHI7CisJVUNIQVIJQ2F0ZWdvcnk7CisJVUNIQVIJQWN0aW9uOworCVVDSEFSCVRva2VuOwkvLyAxCisJQkFfUEFSTQkJQmFQYXJtOwkgICAgICAvLyAgMiAtIDEwCisJVVNIT1JUCQlUaW1lT3V0VmFsdWU7CS8vIDAgLSAwCisJQkFTRVFfQ09OVFJPTAlCYVN0YXJ0U2VxOyAvLyAwLTAKK30gICBGUkFNRV9BRERCQV9SRVEsICpQRlJBTUVfQUREQkFfUkVROworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX0FEREJBX1JTUCB7CisJSEVBREVSXzgwMl8xMSAgIEhkcjsKKwlVQ0hBUglDYXRlZ29yeTsKKwlVQ0hBUglBY3Rpb247CisJVUNIQVIJVG9rZW47CisJVVNIT1JUCVN0YXR1c0NvZGU7CisJQkFfUEFSTQkJQmFQYXJtOyAvLzAgLSAyCisJVVNIT1JUCQlUaW1lT3V0VmFsdWU7Cit9ICAgRlJBTUVfQUREQkFfUlNQLCAqUEZSQU1FX0FEREJBX1JTUDsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9ERUxCQV9SRVEgeworCUhFQURFUl84MDJfMTEgICBIZHI7CisJVUNIQVIJQ2F0ZWdvcnk7CisJVUNIQVIJQWN0aW9uOworCURFTEJBX1BBUk0JCURlbGJhUGFybTsKKwlVU0hPUlQJUmVhc29uQ29kZTsKK30gICBGUkFNRV9ERUxCQV9SRVEsICpQRlJBTUVfREVMQkFfUkVROworCisKKy8vNy4yLjEuNwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9CQVIgeworCUZSQU1FX0NPTlRST0wgICBGQzsKKwlVU0hPUlQgICAgICAgICAgRHVyYXRpb247CisJVUNIQVIgICAgICAgICAgIEFkZHIxW01BQ19BRERSX0xFTl07CisJVUNIQVIgICAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07CisJQkFSX0NPTlRST0wJCUJhckNvbnRyb2w7CisJQkFTRVFfQ09OVFJPTAlTdGFydGluZ1NlcTsKK30gICBGUkFNRV9CQVIsICpQRlJBTUVfQkFSOworCisvLzcuMi4xLjcKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfQkEgeworCUZSQU1FX0NPTlRST0wgICBGQzsKKwlVU0hPUlQgICAgICAgICAgRHVyYXRpb247CisJVUNIQVIgICAgICAgICAgIEFkZHIxW01BQ19BRERSX0xFTl07CisJVUNIQVIgICAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07CisJQkFSX0NPTlRST0wJCUJhckNvbnRyb2w7CisJQkFTRVFfQ09OVFJPTAlTdGFydGluZ1NlcTsKKwlVQ0hBUgkJYml0bWFza1s4XTsKK30gICBGUkFNRV9CQSwgKlBGUkFNRV9CQTsKKworCisvLyBSYWRpbyBNZWFzdWVtZW50IFJlcXVlc3QgRnJhbWUgRm9ybWF0Cit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX1JNX1JFUV9BQ1RJT04geworCUhFQURFUl84MDJfMTEgICBIZHI7CisJVUNIQVIJQ2F0ZWdvcnk7CisJVUNIQVIJQWN0aW9uOworCVVDSEFSCVRva2VuOworCVVTSE9SVAlSZXBldGl0aW9uOworCVVDSEFSICAgZGF0YVswXTsKK30gICBGUkFNRV9STV9SRVFfQUNUSU9OLCAqUEZSQU1FX1JNX1JFUV9BQ1RJT047CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisJVUNIQVIJCUlEOworCVVDSEFSCQlMZW5ndGg7CisJVUNIQVIJCUNoYW5uZWxTd2l0Y2hNb2RlOworCVVDSEFSCQlOZXdSZWdDbGFzczsKKwlVQ0hBUgkJTmV3Q2hhbm5lbE51bTsKKwlVQ0hBUgkJQ2hhbm5lbFN3aXRjaENvdW50OworfSBIVF9FWFRfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UX0lFLCAqUEhUX0VYVF9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlRfSUU7CisKKworLy8KKy8vIF9MaW1pdCBtdXN0IGJlIHRoZSAyKipuIC0gMQorLy8gX1NFUTEgLCBfU0VRMiBtdXN0IGJlIHdpdGhpbiAwIH4gX0xpbWl0CisvLworI2RlZmluZSBTRVFfU1RFUE9ORShfU0VRMSwgX1NFUTIsIF9MaW1pdCkJKChfU0VRMSA9PSAoKF9TRVEyKzEpICYgX0xpbWl0KSkpCisjZGVmaW5lIFNFUV9TTUFMTEVSKF9TRVExLCBfU0VRMiwgX0xpbWl0KQkoKChfU0VRMS1fU0VRMikgJiAoKF9MaW1pdCsxKT4+MSkpKQorI2RlZmluZSBTRVFfTEFSR0VSKF9TRVExLCBfU0VRMiwgX0xpbWl0KQkoKF9TRVExICE9IF9TRVEyKSAmJiAhKCgoX1NFUTEtX1NFUTIpICYgKChfTGltaXQrMSk+PjEpKSkpCisjZGVmaW5lIFNFUV9XSVRISU5fV0lOKF9TRVExLCBfU0VRMiwgX1dJTiwgX0xpbWl0KSAoU0VRX0xBUkdFUihfU0VRMSwgX1NFUTIsIF9MaW1pdCkgJiYgIFwKKwkJCQkJCQkJCQkJCVNFUV9TTUFMTEVSKF9TRVExLCAoKF9TRVEyK19XSU4rMSkmX0xpbWl0KSwgX0xpbWl0KSkKKworLy8KKy8vIENvbnRlbnRpb24tZnJlZSBwYXJhbWV0ZXIgKHdpdGhvdXQgSUQgYW5kIExlbmd0aCkKKy8vCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworICAgIEJPT0xFQU4gICAgIGJWYWxpZDsgICAgICAgICAvLyAxOiB2YXJpYWJsZSBjb250YWlucyB2YWxpZCB2YWx1ZQorICAgIFVDSEFSICAgICAgIENmcENvdW50OworICAgIFVDSEFSICAgICAgIENmcFBlcmlvZDsKKyAgICBVU0hPUlQgICAgICBDZnBNYXhEdXJhdGlvbjsKKyAgICBVU0hPUlQgICAgICBDZnBEdXJSZW1haW5pbmc7Cit9IENGX1BBUk0sICpQQ0ZfUEFSTTsKKwordHlwZWRlZglzdHJ1Y3QJX0NJUEhFUl9TVUlURQl7CisJTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJUGFpckNpcGhlcjsJCS8vIFVuaWNhc3QgY2lwaGVyIDEsIHRoaXMgb25lIGhhcyBtb3JlIHNlY3VyZWQgY2lwaGVyIHN1aXRlCisJTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJUGFpckNpcGhlckF1eDsJLy8gVW5pY2FzdCBjaXBoZXIgMiBpZiBBUCBhbm5vdW5jZSB0d28gdW5pY2FzdCBjaXBoZXIgc3VpdGUKKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwlHcm91cENpcGhlcjsJLy8gR3JvdXAgY2lwaGVyCisJVVNIT1JUCQkJCQkJCVJzbkNhcGFiaWxpdHk7CS8vIFJTTiBjYXBhYmlsaXR5IGZyb20gYmVhY29uCisJQk9PTEVBTgkJCQkJCQliTWl4TW9kZTsJCS8vIEluZGljYXRlIFBhaXIgJiBHcm91cCBjaXBoZXIgbWlnaHQgYmUgZGlmZmVyZW50Cit9CUNJUEhFUl9TVUlURSwgKlBDSVBIRVJfU1VJVEU7CisKKy8vIEVEQ0EgY29uZmlndXJhdGlvbiBmcm9tIEFQJ3MgQkVBQ09OL1Byb2JlUnNwCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQk9PTEVBTiAgICAgYlZhbGlkOyAgICAgICAgIC8vIDE6IHZhcmlhYmxlIGNvbnRhaW5zIHZhbGlkIHZhbHVlCisgICAgQk9PTEVBTiAgICAgYkFkZDsgICAgICAgICAvLyAxOiB2YXJpYWJsZSBjb250YWlucyB2YWxpZCB2YWx1ZQorICAgIEJPT0xFQU4gICAgIGJRQWNrOworICAgIEJPT0xFQU4gICAgIGJRdWV1ZVJlcXVlc3Q7CisgICAgQk9PTEVBTiAgICAgYlR4b3BSZXF1ZXN0OworICAgIEJPT0xFQU4gICAgIGJBUFNEQ2FwYWJsZTsKKy8vICBCT09MRUFOICAgICBiTW9yZURhdGFBY2s7CisgICAgVUNIQVIgICAgICAgRWRjYVVwZGF0ZUNvdW50OworICAgIFVDSEFSICAgICAgIEFpZnNuWzRdOyAgICAgICAvLyAwOkFDX0JLLCAxOkFDX0JFLCAyOkFDX1ZJLCAzOkFDX1ZPCisgICAgVUNIQVIgICAgICAgQ3dtaW5bNF07CisgICAgVUNIQVIgICAgICAgQ3dtYXhbNF07CisgICAgVVNIT1JUICAgICAgVHhvcFs0XTsgICAgICAvLyBpbiB1bml0IG9mIDMyLXVzCisgICAgQk9PTEVBTiAgICAgYkFDTVs0XTsgICAgICAvLyAxOiBBZG1pc3Npb24gQ29udHJvbCBvZiBBQ19CSyBpcyBtYW5kYXR0b3J5Cit9IEVEQ0FfUEFSTSwgKlBFRENBX1BBUk07CisKKy8vIFFCU1MgTE9BRCBpbmZvcm1hdGlvbiBmcm9tIFFBUCdzIEJFQUNPTi9Qcm9iZVJzcAordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJPT0xFQU4gICAgIGJWYWxpZDsgICAgICAgICAgICAgICAgICAgICAvLyAxOiB2YXJpYWJsZSBjb250YWlucyB2YWxpZCB2YWx1ZQorICAgIFVTSE9SVCAgICAgIFN0YU51bTsKKyAgICBVQ0hBUiAgICAgICBDaGFubmVsVXRpbGl6YXRpb247CisgICAgVVNIT1JUICAgICAgUmVtYWluaW5nQWRtaXNzaW9uQ29udHJvbDsgIC8vIGluIHVuaXQgb2YgMzItdXMKK30gUUJTU19MT0FEX1BBUk0sICpQUUJTU19MT0FEX1BBUk07CisKKy8vIFFCU1MgSW5mbyBmaWVsZCBpbiBRU1RBJ3MgYXNzb2MgcmVxCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVQ0hBUgkJUnN2MjoxOworCVVDSEFSCQlNYXhTUExlbmd0aDoyOworCVVDSEFSCQlSc3YxOjE7CisJVUNIQVIJCVVBUFNEX0FDX0JFOjE7CisJVUNIQVIJCVVBUFNEX0FDX0JLOjE7CisJVUNIQVIJCVVBUFNEX0FDX1ZJOjE7CisJVUNIQVIJCVVBUFNEX0FDX1ZPOjE7CisjZWxzZQorICAgIFVDSEFSCQlVQVBTRF9BQ19WTzoxOworCVVDSEFSCQlVQVBTRF9BQ19WSToxOworCVVDSEFSCQlVQVBTRF9BQ19CSzoxOworCVVDSEFSCQlVQVBTRF9BQ19CRToxOworCVVDSEFSCQlSc3YxOjE7CisJVUNIQVIJCU1heFNQTGVuZ3RoOjI7CisJVUNIQVIJCVJzdjI6MTsKKyNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLworfSBRQlNTX1NUQV9JTkZPX1BBUk0sICpQUUJTU19TVEFfSU5GT19QQVJNOworCisvLyBRQlNTIEluZm8gZmllbGQgaW4gUUFQJ3MgQmVhY29uL1Byb2JlUnNwCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVQ0hBUgkJVUFQU0Q6MTsKKwlVQ0hBUgkJUnN2OjM7CisgICAgVUNIQVIJCVBhcmFtU2V0Q291bnQ6NDsKKyNlbHNlCisgICAgVUNIQVIJCVBhcmFtU2V0Q291bnQ6NDsKKwlVQ0hBUgkJUnN2OjM7CisJVUNIQVIJCVVBUFNEOjE7CisjZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KK30gUUJTU19BUF9JTkZPX1BBUk0sICpQUUJTU19BUF9JTkZPX1BBUk07CisKKy8vIFFPUyBDYXBhYmlsaXR5IHJlcG9ydGVkIGluIFFBUCdzIEJFQUNPTi9Qcm9iZVJzcAorLy8gUU9TIENhcGFiaWxpdHkgc2VudCBvdXQgaW4gUVNUQSdzIEFzc29jaWF0ZVJlcS9SZUFzc29jaWF0ZVJlcQordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJPT0xFQU4gICAgIGJWYWxpZDsgICAgICAgICAgICAgICAgICAgICAvLyAxOiB2YXJpYWJsZSBjb250YWlucyB2YWxpZCB2YWx1ZQorICAgIEJPT0xFQU4gICAgIGJRQWNrOworICAgIEJPT0xFQU4gICAgIGJRdWV1ZVJlcXVlc3Q7CisgICAgQk9PTEVBTiAgICAgYlR4b3BSZXF1ZXN0OworLy8gIEJPT0xFQU4gICAgIGJNb3JlRGF0YUFjazsKKyAgICBVQ0hBUiAgICAgICBFZGNhVXBkYXRlQ291bnQ7Cit9IFFPU19DQVBBQklMSVRZX1BBUk0sICpQUU9TX0NBUEFCSUxJVFlfUEFSTTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVDSEFSICAgICAgIElFTGVuOworICAgIFVDSEFSICAgICAgIElFW01BWF9DVVNUT01fTEVOXTsKK30gV1BBX0lFXzsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUNIQVIgICBCc3NpZFtNQUNfQUREUl9MRU5dOworICAgIFVDSEFSICAgQ2hhbm5lbDsKKwlVQ0hBUiAgIENlbnRyYWxDaGFubmVsOwkvL1N0b3JlIHRoZSB3aWRlLWJhbmQgY2VudHJhbCBjaGFubmVsIGZvciA0ME1Iei4gIC51c2VkIGluIDQwTUh6IEFQLiBPciB0aGlzIGlzIHRoZSBzYW1lIGFzIENoYW5uZWwuCisgICAgVUNIQVIgICBCc3NUeXBlOworICAgIFVTSE9SVCAgQXRpbVdpbjsKKyAgICBVU0hPUlQgIEJlYWNvblBlcmlvZDsKKworICAgIFVDSEFSICAgU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisgICAgVUNIQVIgICBTdXBSYXRlTGVuOworICAgIFVDSEFSICAgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisgICAgVUNIQVIgICBFeHRSYXRlTGVuOworCUhUX0NBUEFCSUxJVFlfSUUgSHRDYXBhYmlsaXR5OworCVVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuOworCUFERF9IVF9JTkZPX0lFIEFkZEh0SW5mbzsJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCisJVUNIQVIJCQlBZGRIdEluZm9MZW47CisJVUNIQVIJCQlOZXdFeHRDaGFuT2Zmc2V0OworCUNIQVIgICAgUnNzaTsKKyAgICBVQ0hBUiAgIFByaXZhY3k7CQkJLy8gSW5kaWNhdGUgc2VjdXJpdHkgZnVuY3Rpb24gT04vT0ZGLiBEb24ndCBtZXNzIHVwIHdpdGggYXV0aCBtb2RlLgorCVVDSEFSCUhpZGRlbjsKKworICAgIFVTSE9SVCAgRHRpbVBlcmlvZDsKKyAgICBVU0hPUlQgIENhcGFiaWxpdHlJbmZvOworCisgICAgVVNIT1JUICBDZnBDb3VudDsKKyAgICBVU0hPUlQgIENmcFBlcmlvZDsKKyAgICBVU0hPUlQgIENmcE1heER1cmF0aW9uOworICAgIFVTSE9SVCAgQ2ZwRHVyUmVtYWluaW5nOworICAgIFVDSEFSICAgU3NpZExlbjsKKyAgICBDSEFSICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKKworICAgIFVMT05HICAgTGFzdEJlYWNvblJ4VGltZTsgLy8gT1MncyB0aW1lc3RhbXAKKworCUJPT0xFQU4JYlNFUzsKKworCS8vIE5ldyBmb3IgV1BBMgorCUNJUEhFUl9TVUlURQkJCQkJV1BBOwkJCS8vIEFQIGFubm91bmNlZCBXUEEgY2lwaGVyIHN1aXRlCisJQ0lQSEVSX1NVSVRFCQkJCQlXUEEyOwkJCS8vIEFQIGFubm91bmNlZCBXUEEyIGNpcGhlciBzdWl0ZQorCisJLy8gTmV3IGZvciBtaWNyb3NvZnQgV1BBIHN1cHBvcnQKKwlORElTXzgwMl8xMV9GSVhFRF9JRXMJRml4SUVzOworCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUJQXV0aE1vZGVBdXg7CS8vIEFkZGl0aW9uIG1vZGUgZm9yIFdQQTIgLyBXUEEgY2FwYWJsZSBBUAorCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUJQXV0aE1vZGU7CisJTkRJU184MDJfMTFfV0VQX1NUQVRVUwlXZXBTdGF0dXM7CQkJCS8vIFVuaWNhc3QgRW5jcnlwdGlvbiBBbGdvcml0aG0gZXh0cmFjdCBmcm9tIFZBUl9JRQorCVVTSE9SVAkJCQkJVmFySUVMZW47CQkJCS8vIExlbmd0aCBvZiBuZXh0IFZJRSBpbmNsdWRlIEVJRCAmIExlbmd0aAorCVVDSEFSCQkJCQlWYXJJRXNbTUFYX1ZJRV9MRU5dOworCisJLy8gQ0NYIENraXAgaW5mb3JtYXRpb24KKyAgICBVQ0hBUiAgIENraXBGbGFnOworCisJLy8gQ0NYIDIgVFNGCisJVUNIQVIJUFRTRls0XTsJCS8vIFBhcmVudCBUU0YKKwlVQ0hBUglUVFNGWzhdOwkJLy8gVGFyZ2V0IFRTRgorCisgICAgLy8gODAyLjExZSBkOSwgYW5kIFdNTQorCUVEQ0FfUEFSTSAgICAgICAgICAgRWRjYVBhcm07CisJUU9TX0NBUEFCSUxJVFlfUEFSTSBRb3NDYXBhYmlsaXR5OworCVFCU1NfTE9BRF9QQVJNICAgICAgUWJzc0xvYWQ7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisgICAgV1BBX0lFXyAgICAgV3BhSUU7CisgICAgV1BBX0lFXyAgICAgUnNuSUU7CisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCVVDSEFSCQlDb3VudHJ5U3RyaW5nWzNdOworCUJPT0xFQU4JCWJIYXNDb3VudHJ5SUU7CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworfSBCU1NfRU5UUlksICpQQlNTX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUNIQVIgICAgICAgICAgIEJzc05yOworICAgIFVDSEFSICAgICAgICAgICBCc3NPdmVybGFwTnI7CisgICAgQlNTX0VOVFJZICAgICAgIEJzc0VudHJ5W01BWF9MRU5fT0ZfQlNTX1RBQkxFXTsKK30gQlNTX1RBQkxFLCAqUEJTU19UQUJMRTsKKworCit0eXBlZGVmIHN0cnVjdCBfTUxNRV9RVUVVRV9FTEVNIHsKKyAgICBVTE9ORyAgICAgICAgICAgICBNYWNoaW5lOworICAgIFVMT05HICAgICAgICAgICAgIE1zZ1R5cGU7CisgICAgVUxPTkcgICAgICAgICAgICAgTXNnTGVuOworICAgIFVDSEFSICAgICAgICAgICAgIE1zZ1tNR01UX0RNQV9CVUZGRVJfU0laRV07CisgICAgTEFSR0VfSU5URUdFUiAgICAgVGltZVN0YW1wOworICAgIFVDSEFSICAgICAgICAgICAgIFJzc2kwOworICAgIFVDSEFSICAgICAgICAgICAgIFJzc2kxOworICAgIFVDSEFSICAgICAgICAgICAgIFJzc2kyOworICAgIFVDSEFSICAgICAgICAgICAgIFNpZ25hbDsKKyAgICBVQ0hBUiAgICAgICAgICAgICBDaGFubmVsOworICAgIFVDSEFSICAgICAgICAgICAgIFdjaWQ7CisgICAgQk9PTEVBTiAgICAgICAgICAgT2NjdXBpZWQ7Cit9IE1MTUVfUVVFVUVfRUxFTSwgKlBNTE1FX1FVRVVFX0VMRU07CisKK3R5cGVkZWYgc3RydWN0IF9NTE1FX1FVRVVFIHsKKyAgICBVTE9ORyAgICAgICAgICAgICBOdW07CisgICAgVUxPTkcgICAgICAgICAgICAgSGVhZDsKKyAgICBVTE9ORyAgICAgICAgICAgICBUYWlsOworICAgIE5ESVNfU1BJTl9MT0NLICAgTG9jazsKKyAgICBNTE1FX1FVRVVFX0VMRU0gIEVudHJ5W01BWF9MRU5fT0ZfTUxNRV9RVUVVRV07Cit9IE1MTUVfUVVFVUUsICpQTUxNRV9RVUVVRTsKKwordHlwZWRlZiBWT0lEICgqU1RBVEVfTUFDSElORV9GVU5DKShWT0lEICpBZGFwdG9yLCBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCit0eXBlZGVmIHN0cnVjdCBfU1RBVEVfTUFDSElORSB7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJTdGF0ZTsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yTXNnOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyclN0YXRlOworICAgIFNUQVRFX01BQ0hJTkVfRlVOQyAgICAgICAgICAgICAqVHJhbnNGdW5jOworfSBTVEFURV9NQUNISU5FLCAqUFNUQVRFX01BQ0hJTkU7CisKKworLy8gTUxNRSBBVVggZGF0YSBzdHJ1Y3R1cmUgdGhhdCBob2xkIHRlbXBvcmFybGl5IHNldHRpbmdzIGR1cmluZyBhIGNvbm5lY3Rpb24gYXR0ZW1wdC4KKy8vIE9uY2UgdGhpcyBhdHRlbXAgc3VjY2VlZHMsIGFsbCBzZXR0aW5ncyB3aWxsIGJlIGNvcHkgdG8gcEFkLT5TdGFBY3RpdmUuCisvLyBBIGNvbm5lY3Rpb24gYXR0ZW1wdCAodXNlciBzZXQgT0lELCByb2FtaW5nLCBDQ1ggZmFzdCByb2FtaW5nLC4uKSBjb25zaXN0cyBvZgorLy8gc2V2ZXJhbCBzdGVwcyAoSk9JTiwgQVVUSCwgQVNTT0Mgb3IgUkVBU1NPQykgYW5kIG1heSBmYWlsIGF0IGFueSBzdGVwLiBXZSBwdXJwb3NlbHkKKy8vIHNlcGFyYXRlIHRoaXMgdW5kZXItdHJpYWwgc2V0dGluZ3MgYXdheSBmcm9tIHBBZC0+U3RhQWN0aXZlIHNvIHRoYXQgb25jZQorLy8gdGhpcyBuZXcgYXR0ZW1wdCBmYWlsZWQsIGRyaXZlciBjYW4gYXV0by1yZWNvdmVyIGJhY2sgdG8gdGhlIGFjdGl2ZSBzZXR0aW5ncy4KK3R5cGVkZWYgc3RydWN0IF9NTE1FX0FVWCB7CisgICAgVUNIQVIgICAgICAgICAgICAgICBCc3NUeXBlOworICAgIFVDSEFSICAgICAgICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOworICAgIFVDSEFSICAgICAgICAgICAgICAgU3NpZExlbjsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIEJzc2lkW01BQ19BRERSX0xFTl07CisJVUNIQVIJCQkJQXV0b1JlY29ubmVjdFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKKwlVQ0hBUgkJCQlBdXRvUmVjb25uZWN0U3NpZExlbjsKKyAgICBVU0hPUlQgICAgICAgICAgICAgIEFsZzsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIFNjYW5UeXBlOworICAgIFVDSEFSICAgICAgICAgICAgICAgQ2hhbm5lbDsKKwlVQ0hBUiAgICAgICAgICAgICAgIENlbnRyYWxDaGFubmVsOworICAgIFVTSE9SVCAgICAgICAgICAgICAgQWlkOworICAgIFVTSE9SVCAgICAgICAgICAgICAgQ2FwYWJpbGl0eUluZm87CisgICAgVVNIT1JUICAgICAgICAgICAgICBCZWFjb25QZXJpb2Q7CisgICAgVVNIT1JUICAgICAgICAgICAgICBDZnBNYXhEdXJhdGlvbjsKKyAgICBVU0hPUlQgICAgICAgICAgICAgIENmcFBlcmlvZDsKKyAgICBVU0hPUlQgICAgICAgICAgICAgIEF0aW1XaW47CisKKwkvLyBDb3B5IHN1cHBvcnRlZCByYXRlIGZyb20gZGVzaXJlZCBBUCdzIGJlYWNvbi4gV2UgYXJlIHRyeWluZyB0byBtYXRjaAorCS8vIEFQJ3Mgc3VwcG9ydGVkIGFuZCBleHRlbmRlZCByYXRlIHNldHRpbmdzLgorCVVDSEFSCQkgICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSCQkgICAgICAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSCQkgICAgICAgIFN1cFJhdGVMZW47CisJVUNIQVIJCSAgICAgICAgRXh0UmF0ZUxlbjsKKwlIVF9DQVBBQklMSVRZX0lFCQlIdENhcGFiaWxpdHk7CisJVUNIQVIJCSAgICAgICAgCUh0Q2FwYWJpbGl0eUxlbjsKKwlBRERfSFRfSU5GT19JRQkJQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKwlVQ0hBUgkJCU5ld0V4dENoYW5uZWxPZmZzZXQ7CisJLy9SVF9IVF9DQVBBQklMSVRZCVN1cHBvcnRlZEh0UGh5OworCisgICAgLy8gbmV3IGZvciBRT1MKKyAgICBRT1NfQ0FQQUJJTElUWV9QQVJNIEFQUW9zQ2FwYWJpbGl0eTsgICAgLy8gUU9TIGNhcGFiaWxpdHkgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAorICAgIEVEQ0FfUEFSTSAgICAgICAgICAgQVBFZGNhUGFybTsgICAgICAgICAvLyBFRENBIHBhcmFtZXRlcnMgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAorICAgIFFCU1NfTE9BRF9QQVJNICAgICAgQVBRYnNzTG9hZDsgICAgICAgICAvLyBRQlNTIGxvYWQgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAorCisgICAgLy8gbmV3IHRvIGtlZXAgUmFsaW5rIHNwZWNpZmljIGZlYXR1cmUKKyAgICBVTE9ORyAgICAgICAgICAgICAgIEFQUmFsaW5rSWU7CisKKyAgICBCU1NfVEFCTEUgICAgICAgICAgIFNzaWRCc3NUYWI7ICAgICAvLyBBUCBsaXN0IGZvciB0aGUgc2FtZSBTU0lECisgICAgQlNTX1RBQkxFICAgICAgICAgICBSb2FtVGFiOyAgICAgICAgLy8gQVAgbGlzdCBlbGlnaWJsZSBmb3Igcm9hbWluZworICAgIFVMT05HICAgICAgICAgICAgICAgQnNzSWR4OworICAgIFVMT05HICAgICAgICAgICAgICAgUm9hbUlkeDsKKworCUJPT0xFQU4JCQkJQ3VyclJlcUlzRnJvbU5kaXM7CisKKyAgICBSQUxJTktfVElNRVJfU1RSVUNUIEJlYWNvblRpbWVyLCBTY2FuVGltZXI7CisgICAgUkFMSU5LX1RJTUVSX1NUUlVDVCBBdXRoVGltZXI7CisgICAgUkFMSU5LX1RJTUVSX1NUUlVDVCBBc3NvY1RpbWVyLCBSZWFzc29jVGltZXIsIERpc2Fzc29jVGltZXI7Cit9IE1MTUVfQVVYLCAqUE1MTUVfQVVYOworCit0eXBlZGVmIHN0cnVjdCBfTUxNRV9BRERCQV9SRVFfU1RSVUNUeworCVVDSEFSICAgV2NpZDsJLy8KKwlVQ0hBUiAgIHBBZGRyW01BQ19BRERSX0xFTl07CisJVUNIQVIgICBCYUJ1ZlNpemU7CisJVVNIT1JUCVRpbWVPdXRWYWx1ZTsKKwlVQ0hBUiAgIFRJRDsKKwlVQ0hBUiAgIFRva2VuOworCVVTSE9SVAlCYVN0YXJ0U2VxOworfSBNTE1FX0FEREJBX1JFUV9TVFJVQ1QsICpQTUxNRV9BRERCQV9SRVFfU1RSVUNUOworCisKK3R5cGVkZWYgc3RydWN0IF9NTE1FX0RFTEJBX1JFUV9TVFJVQ1R7CisJVUNIQVIgICBXY2lkOwkvLworCVVDSEFSICAgICBBZGRyW01BQ19BRERSX0xFTl07CisJVUNIQVIgICBUSUQ7CisJVUNIQVIJSW5pdGlhdG9yOworfSBNTE1FX0RFTEJBX1JFUV9TVFJVQ1QsICpQTUxNRV9ERUxCQV9SRVFfU1RSVUNUOworCisvLyBhc3NvYyBzdHJ1Y3QgaXMgZXF1YWwgdG8gcmVhc3NvYwordHlwZWRlZiBzdHJ1Y3QgX01MTUVfQVNTT0NfUkVRX1NUUlVDVHsKKyAgICBVQ0hBUiAgICAgQWRkcltNQUNfQUREUl9MRU5dOworICAgIFVTSE9SVCAgICBDYXBhYmlsaXR5SW5mbzsKKyAgICBVU0hPUlQgICAgTGlzdGVuSW50djsKKyAgICBVTE9ORyAgICAgVGltZW91dDsKK30gTUxNRV9BU1NPQ19SRVFfU1RSVUNULCAqUE1MTUVfQVNTT0NfUkVRX1NUUlVDVCwgTUxNRV9SRUFTU09DX1JFUV9TVFJVQ1QsICpQTUxNRV9SRUFTU09DX1JFUV9TVFJVQ1Q7CisKK3R5cGVkZWYgc3RydWN0IF9NTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1R7CisgICAgVUNIQVIgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKKyAgICBVU0hPUlQgICAgUmVhc29uOworfSBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QsICpQTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUOworCit0eXBlZGVmIHN0cnVjdCBfTUxNRV9BVVRIX1JFUV9TVFJVQ1QgeworICAgIFVDSEFSICAgICAgICBBZGRyW01BQ19BRERSX0xFTl07CisgICAgVVNIT1JUICAgICAgIEFsZzsKKyAgICBVTE9ORyAgICAgICAgVGltZW91dDsKK30gTUxNRV9BVVRIX1JFUV9TVFJVQ1QsICpQTUxNRV9BVVRIX1JFUV9TVFJVQ1Q7CisKK3R5cGVkZWYgc3RydWN0IF9NTE1FX0RFQVVUSF9SRVFfU1RSVUNUIHsKKyAgICBVQ0hBUiAgICAgICAgQWRkcltNQUNfQUREUl9MRU5dOworICAgIFVTSE9SVCAgICAgICBSZWFzb247Cit9IE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QsICpQTUxNRV9ERUFVVEhfUkVRX1NUUlVDVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVMT05HICAgICAgQnNzSWR4OworfSBNTE1FX0pPSU5fUkVRX1NUUlVDVDsKKwordHlwZWRlZiBzdHJ1Y3QgX01MTUVfU0NBTl9SRVFfU1RSVUNUIHsKKyAgICBVQ0hBUiAgICAgIEJzc2lkW01BQ19BRERSX0xFTl07CisgICAgVUNIQVIgICAgICBCc3NUeXBlOworICAgIFVDSEFSICAgICAgU2NhblR5cGU7CisgICAgVUNIQVIgICAgICBTc2lkTGVuOworICAgIENIQVIgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOworfSBNTE1FX1NDQU5fUkVRX1NUUlVDVCwgKlBNTE1FX1NDQU5fUkVRX1NUUlVDVDsKKwordHlwZWRlZiBzdHJ1Y3QgX01MTUVfU1RBUlRfUkVRX1NUUlVDVCB7CisgICAgQ0hBUiAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOworICAgIFVDSEFSICAgICAgIFNzaWRMZW47Cit9IE1MTUVfU1RBUlRfUkVRX1NUUlVDVCwgKlBNTE1FX1NUQVJUX1JFUV9TVFJVQ1Q7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKy8vIHN0cnVjdHVyZSBmb3IgRExTCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0RMUyB7CisJVVNIT1JUCQkJCQkJVGltZU91dDsJCS8vIFVzZSB0byB0aW1lIG91dCB3aGlsZSBzbGllbmNlLCB1bml0OiBzZWNvbmQgLCBzZXQgYnkgVUkKKwlVU0hPUlQJCQkJCQlDb3VudERvd25UaW1lcjsJLy8gVXNlIHRvIHRpbWUgb3V0IHdoaWxlIHNsaWVuY2UsdW5pdDogc2Vjb25kICwgdXNlZCBieSBkcml2ZXIgb25seQorCU5ESVNfODAyXzExX01BQ19BRERSRVNTCQlNYWNBZGRyOwkJLy8gc2V0IGJ5IFVJCisJVUNIQVIJCQkJCQlTdGF0dXM7CQkJLy8gMDogbm9uZSAsIDE6IHdhaXQgU1RBa2V5LCAyOiBmaW5pc2ggRExTIHNldHVwICwgc2V0IGJ5IGRyaXZlciBvbmx5CisJQk9PTEVBTgkJCQkJCVZhbGlkOwkJCS8vIDE6IHZhbGlkICwgMDogaW52YWxpZCAsIHNldCBieSBVSSwgdXNlIHRvIHNldHVwIG9yIHRlYXIgZG93biBETFMgbGluaworCVJBTElOS19USU1FUl9TVFJVQ1QJCQlUaW1lcjsJCQkvLyBVc2UgdG8gdGltZSBvdXQgd2hpbGUgaGFuZHNoYWtlCisJVVNIT1JUCQkJCQkJU2VxdWVuY2U7CisJVVNIT1JUCQkJCQkJTWFjVGFiTWF0Y2hXQ0lEOwkvLyBBU0lDCisJQk9PTEVBTgkJCQkJCWJIVENhcDsKKwlQVk9JRAkJCQkJCXBBZDsKK30gUlRfODAyXzExX0RMUywgKlBSVF84MDJfMTFfRExTOworCit0eXBlZGVmIHN0cnVjdCBfTUxNRV9ETFNfUkVRX1NUUlVDVCB7CisgICAgUFJUXzgwMl8xMV9ETFMJcERMUzsKKyAgICBVU0hPUlQJCQlSZWFzb247Cit9IE1MTUVfRExTX1JFUV9TVFJVQ1QsICpQTUxNRV9ETFNfUkVRX1NUUlVDVDsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKKyAgICBVQ0hBUiAgIEVpZDsKKyAgICBVQ0hBUiAgIExlbjsKKyAgICBDSEFSICAgT2N0ZXRbMV07Cit9IEVJRF9TVFJVQ1QsKlBFSURfU1RSVUNULCBCRUFDT05fRUlEX1NUUlVDVCwgKlBCRUFDT05fRUlEX1NUUlVDVDsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SVE1QX1RYX1JBVEVfU1dJVENICit7CisJVUNIQVIgICBJdGVtTm87CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCVJzdjI6MjsKKwlVQ0hBUglNb2RlOjI7CisJVUNIQVIJUnN2MToxOworCVVDSEFSCUJXOjE7CisJVUNIQVIJU2hvcnRHSToxOworCVVDSEFSCVNUQkM6MTsKKyNlbHNlCisJVUNIQVIJU1RCQzoxOworCVVDSEFSCVNob3J0R0k6MTsKKwlVQ0hBUglCVzoxOworCVVDSEFSCVJzdjE6MTsKKwlVQ0hBUglNb2RlOjI7CisJVUNIQVIJUnN2MjoyOworI2VuZGlmCisJVUNIQVIgICBDdXJyTUNTOworCVVDSEFSICAgVHJhaW5VcDsKKwlVQ0hBUiAgIFRyYWluRG93bjsKK30gUlJUTVBfVFhfUkFURV9TV0lUQ0gsICpQUlRNUF9UWF9SQVRFX1NXSVRDSDsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gQVAgbWxtZS5oID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgVEJUVF9QUkVMT0FEX1RJTUUgICAgICAgMzg0ICAgICAgICAvLyB1c2VjLiBMb21nUHJlYW1ibGUgKyAyNC1ieXRlIGF0IDFNYnBzCisjZGVmaW5lIERFRkFVTFRfRFRJTV9QRVJJT0QgICAgIDEKKworI2RlZmluZSBNQUNfVEFCTEVfQUdFT1VUX1RJTUUJCQkzMDAJCQkvLyB1bml0OiBzZWMKKyNkZWZpbmUgTUFDX1RBQkxFX0FTU09DX1RJTUVPVVQJCQk1CQkJLy8gdW5pdDogc2VjCisjZGVmaW5lIE1BQ19UQUJMRV9GVUxMKFRhYikJCQkJKChUYWIpLnNpemUgPT0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisKKy8vIEFQIHNoYWxsIGRyb3AgdGhlIHN0YSBpZiBjb250aW5lIFR4IGZhaWwgY291bnQgcmVhY2ggaXQuCisjZGVmaW5lIE1BQ19FTlRSWV9MSUZFX0NIRUNLX0NOVAkJMjAJCQkvLyBwYWNrZXQgY250LgorCisvLyBWYWx1ZSBkb21haW4gb2YgcE1hY0VudHJ5LT5Tc3QKK3R5cGVkZWYgZW51bSBfU3N0IHsKKyAgICBTU1RfTk9UX0FVVEgsICAgLy8gMDogZXF1aXZhbGVudCB0byBJRUVFIDgwMi4xMS8xOTk5IHN0YXRlIDEKKyAgICBTU1RfQVVUSCwgICAgICAgLy8gMTogZXF1aXZhbGVudCB0byBJRUVFIDgwMi4xMS8xOTk5IHN0YXRlIDIKKyAgICBTU1RfQVNTT0MgICAgICAgLy8gMjogZXF1aXZhbGVudCB0byBJRUVFIDgwMi4xMS8xOTk5IHN0YXRlIDMKK30gU1NUOworCisvLyB2YWx1ZSBkb21haW4gb2YgcE1hY0VudHJ5LT5BdXRoU3RhdGUKK3R5cGVkZWYgZW51bSBfQXV0aFN0YXRlIHsKKyAgICBBU19OT1RfQVVUSCwKKyAgICBBU19BVVRIX09QRU4sICAgICAgIC8vIFNUQSBoYXMgYmVlbiBhdXRoZW50aWNhdGVkIHVzaW5nIE9QRU4gU1lTVEVNCisgICAgQVNfQVVUSF9LRVksICAgICAgICAvLyBTVEEgaGFzIGJlZW4gYXV0aGVudGljYXRlZCB1c2luZyBTSEFSRUQgS0VZCisgICAgQVNfQVVUSEVOVElDQVRJTkcgICAvLyBTVEEgaXMgd2FpdGluZyBmb3IgQVVUSCBzZXEjMyB1c2luZyBTSEFSRUQgS0VZCit9IEFVVEhfU1RBVEU7CisKKy8vZm9yLXdwYSB2YWx1ZSBkb21haW4gb2YgcE1hY0VudHJ5LT5XcGFTdGF0ZSAgODAyLjFpIEQzICAgcC4xMTQKK3R5cGVkZWYgZW51bSBfQXBXcGFTdGF0ZSB7CisgICAgQVNfTk9UVVNFLCAgICAgICAgICAgICAgLy8gMAorICAgIEFTX0RJU0NPTk5FQ1QsICAgICAgICAgIC8vIDEKKyAgICBBU19ESVNDT05ORUNURUQsICAgICAgICAvLyAyCisgICAgQVNfSU5JVElBTElaRSwgICAgICAgICAgLy8gMworICAgIEFTX0FVVEhFTlRJQ0FUSU9OLCAgICAgIC8vIDQKKyAgICBBU19BVVRIRU5USUNBVElPTjIsICAgICAvLyA1CisgICAgQVNfSU5JVFBNSywgICAgICAgICAgICAgLy8gNgorICAgIEFTX0lOSVRQU0ssICAgICAgICAgICAgIC8vIDcKKyAgICBBU19QVEtTVEFSVCwgICAgICAgICAgICAvLyA4CisgICAgQVNfUFRLSU5JVF9ORUdPVElBVElORywgLy8gOQorICAgIEFTX1BUS0lOSVRET05FLCAgICAgICAgIC8vIDEwCisgICAgQVNfVVBEQVRFS0VZUywgICAgICAgICAgLy8gMTEKKyAgICBBU19JTlRFR1JJVFlfRkFJTFVSRSwgICAvLyAxMgorICAgIEFTX0tFWVVQREFURSwgICAgICAgICAgIC8vIDEzCit9IEFQX1dQQV9TVEFURTsKKworLy8gZm9yLXdwYSB2YWx1ZSBkb21haW4gb2YgcE1hY0VudHJ5LT5XcGFTdGF0ZSAgODAyLjFpIEQzICAgcC4xMTQKK3R5cGVkZWYgZW51bSBfR1RLU3RhdGUgeworICAgIFJFS0VZX05FR09USUFUSU5HLAorICAgIFJFS0VZX0VTVEFCTElTSEVELAorICAgIEtFWUVSUk9SLAorfSBHVEtfU1RBVEU7CisKKy8vICBmb3Itd3BhICB2YWx1ZSBkb21haW4gb2YgcE1hY0VudHJ5LT5XcGFTdGF0ZSAgODAyLjFpIEQzICAgcC4xMTQKK3R5cGVkZWYgZW51bSBfV3BhR1RLU3RhdGUgeworICAgIFNFVEtFWVMsCisgICAgU0VUS0VZU19ET05FLAorfSBXUEFfR1RLX1NUQVRFOworLy8gPT09PT09PT09PT09PT09PT09PT09PSBlbmQgb2YgQVAgbWxtZS5oID09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisjZW5kaWYJLy8gTUxNRV9IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvb2lkLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL29pZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZjkxYjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL29pZC5oCkBAIC0wLDAgKzEsOTk1IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCW9pZC5oCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCisqLworI2lmbmRlZiBfT0lEX0hfCisjZGVmaW5lIF9PSURfSF8KKworCisjZGVmaW5lIFRSVUUJCQkJMQorI2RlZmluZSBGQUxTRQkJCQkwCisvLworLy8gSUVFRSA4MDIuMTEgU3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnMKKy8vCisjZGVmaW5lIE1BWF9UWF9QT1dFUl9MRVZFTCAgICAgICAgICAgICAgMTAwICAgLyogbVcgKi8KKyNkZWZpbmUgTUFYX1JTU0lfVFJJR0dFUiAgICAgICAgICAgICAgICAtMTAgICAgLyogZEJtICovCisjZGVmaW5lIE1JTl9SU1NJX1RSSUdHRVIgICAgICAgICAgICAgICAgLTIwMCAgIC8qIGRCbSAqLworI2RlZmluZSBNQVhfRlJBR19USFJFU0hPTEQgICAgICAgICAgICAgIDIzNDYgIC8qIGJ5dGUgY291bnQgKi8KKyNkZWZpbmUgTUlOX0ZSQUdfVEhSRVNIT0xEICAgICAgICAgICAgICAyNTYgICAvKiBieXRlIGNvdW50ICovCisjZGVmaW5lIE1BWF9SVFNfVEhSRVNIT0xEICAgICAgICAgICAgICAgMjM0NyAgLyogYnl0ZSBjb3VudCAqLworCisvLyBuZXcgdHlwZXMgZm9yIE1lZGlhIFNwZWNpZmljIEluZGljYXRpb25zCisvLyBFeHRlbnNpb24gY2hhbm5lbCBvZmZzZXQKKyNkZWZpbmUgRVhUQ0hBX05PTkUJCQkwCisjZGVmaW5lIEVYVENIQV9BQk9WRQkJMHgxCisjZGVmaW5lIEVYVENIQV9CRUxPVwkJMHgzCisKKy8vIEJXCisjZGVmaW5lIEJBTkRfV0lEVEhfMjAJCTAKKyNkZWZpbmUgQkFORF9XSURUSF80MAkJMQorI2RlZmluZSBCQU5EX1dJRFRIX0JPVEgJCTIKKyNkZWZpbmUgQkFORF9XSURUSF8xMAkJMwkvLyA4MDIuMTFqIGhhcyAxME1Iei4gVGhpcyBkZWZpbml0aW9uIGlzIGZvciBpbnRlcm5hbCB1c2FnZS4gZG9lc24ndCBmaWxsIGluIHRoZSBJRSBvciBvdGhlciBmaWVsZC4KKy8vIFNIT1JUR0kKKyNkZWZpbmUgR0FQX0lOVEVSVkFMXzQwMAkxCS8vIG9ubHkgc3VwcG9ydCBpbiBIVCBtb2RlCisjZGVmaW5lIEdBUF9JTlRFUlZBTF84MDAJMAorI2RlZmluZSBHQVBfSU5URVJWQUxfQk9USAkyCisKKyNkZWZpbmUgTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQJCQkxCisjZGVmaW5lIE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkCQkwCisKKyNkZWZpbmUgTkRJU184MDJfMTFfTEVOR1RIX1NTSUQgICAgICAgICAzMgorI2RlZmluZSBORElTXzgwMl8xMV9MRU5HVEhfUkFURVMgICAgICAgIDgKKyNkZWZpbmUgTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTX0VYICAgICAxNgorI2RlZmluZSBNQUNfQUREUl9MRU5HVEggICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgTUFYX05VTV9PRl9DSFMJCQkJCTQ5IC8vIDE0IGNoYW5uZWxzIEAyLjRHICsgIDEyQFVOSUkgKyA0IEBNTUFDICsgMTEgQEhpcGVyTEFOMiArIDcgQEphcGFuICsgMSBhcyBOVUxMIHRlcm1pbmF0aW9uYworI2RlZmluZSBNQVhfTlVNQkVSX09GX0VWRU5UCQkJCTEwICAvLyBlbnRyeSAjIGluIEVWRU5UIHRhYmxlCisjZGVmaW5lIE1BWF9OVU1CRVJfT0ZfTUFDCQkJCTMyIC8vIGlmIE1BWF9NQlNTSURfTlVNIGlzIDgsIHRoaXMgdmFsdWUgY2FuJ3QgYmUgbGFyZ2VyIHRoYW4gMjExCisjZGVmaW5lIE1BWF9OVU1CRVJfT0ZfQUNMCQkJCTY0CisjZGVmaW5lIE1BWF9MRU5HVEhfT0ZfU1VQUE9SVF9SQVRFUwkJMTIgICAgLy8gMSwgMiwgNS41LCAxMSwgNiwgOSwgMTIsIDE4LCAyNCwgMzYsIDQ4LCA1NAorI2RlZmluZSBNQVhfTlVNQkVSX09GX0RMU19FTlRSWQkJCTQKKworI2lmbmRlZiBVTkRFUl9DRQorCisjZGVmaW5lIE9JRF9HRU5fTUFDSElORV9OQU1FICAgICAgICAgICAgICAgMHgwMDAxMDIxQQorCisjaWZkZWYgUkFMSU5LX0FURQorI2RlZmluZSBSVF9RVUVSWV9BVEVfVFhET05FX0NPVU5UCQkJMHgwNDAxCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworI2RlZmluZSBSVF9RVUVSWV9TSUdOQUxfQ09OVEVYVAkJCQkweDA0MDIKKyNkZWZpbmUgUlRfU0VUX0lBUFBfUElEICAgICAgICAgICAgICAgICAJMHgwNDA0CisjZGVmaW5lIFJUX1NFVF9BUERfUElECQkJCQkJMHgwNDA1CisjZGVmaW5lIFJUX1NFVF9ERUxfTUFDX0VOVFJZCQkJCTB4MDQwNgorCisvLworLy8gSUVFRSA4MDIuMTEgT0lEcworLy8KKyNkZWZpbmUJT0lEX0dFVF9TRVRfVE9HR0xFCQkJMHg4MDAwCisKKyNkZWZpbmUJT0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVTX1NVUFBPUlRFRAkJCTB4MDEwMworI2RlZmluZQlPSURfODAyXzExX05FVFdPUktfVFlQRV9JTl9VU0UJCQkJMHgwMTA0CisjZGVmaW5lCU9JRF84MDJfMTFfUlNTSV9UUklHR0VSCQkJCQkJMHgwMTA3CisjZGVmaW5lCVJUX09JRF84MDJfMTFfUlNTSQkJCQkJCQkweDAxMDggLy9ydDI4NjAJb25seSAsIGthdGh5CisjZGVmaW5lCVJUX09JRF84MDJfMTFfUlNTSV8xCQkJCQkJMHgwMTA5IC8vcnQyODYwCW9ubHkgLCBrYXRoeQorI2RlZmluZQlSVF9PSURfODAyXzExX1JTU0lfMgkJCQkJCTB4MDEwQSAvL3J0Mjg2MAlvbmx5ICwga2F0aHkKKyNkZWZpbmUJT0lEXzgwMl8xMV9OVU1CRVJfT0ZfQU5URU5OQVMJCQkJMHgwMTBCCisjZGVmaW5lCU9JRF84MDJfMTFfUlhfQU5URU5OQV9TRUxFQ1RFRAkJCQkweDAxMEMKKyNkZWZpbmUJT0lEXzgwMl8xMV9UWF9BTlRFTk5BX1NFTEVDVEVECQkJCTB4MDEwRAorI2RlZmluZQlPSURfODAyXzExX1NVUFBPUlRFRF9SQVRFUwkJCQkJMHgwMTBFCisjZGVmaW5lCU9JRF84MDJfMTFfQUREX1dFUAkJCQkJCQkweDAxMTIKKyNkZWZpbmUJT0lEXzgwMl8xMV9SRU1PVkVfV0VQCQkJCQkJMHgwMTEzCisjZGVmaW5lCU9JRF84MDJfMTFfRElTQVNTT0NJQVRFCQkJCQkJMHgwMTE0CisjZGVmaW5lCU9JRF84MDJfMTFfUFJJVkFDWV9GSUxURVIJCQkJCTB4MDExOAorI2RlZmluZQlPSURfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OCQkJMHgwMTFFCisjZGVmaW5lCU9JRF84MDJfMTFfVEVTVAkJCQkJCQkJMHgwMTFGCisjZGVmaW5lCVJUX09JRF84MDJfMTFfQ09VTlRSWV9SRUdJT04JCQkJMHgwNTA3CisjZGVmaW5lCU9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOCQkJCQkweDA1MDgKKyNkZWZpbmUJT0lEXzgwMl8xMV9TU0lECQkJCQkJCQkweDA1MDkKKyNkZWZpbmUJT0lEXzgwMl8xMV9CU1NJRAkJCQkJCQkweDA1MEEKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9SQURJTwkJCQkJCQkweDA1MEIKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9QSFlfTU9ERQkJCQkJCTB4MDUwQworI2RlZmluZQlSVF9PSURfODAyXzExX1NUQV9DT05GSUcJCQkJCTB4MDUwRAorI2RlZmluZQlPSURfODAyXzExX0RFU0lSRURfUkFURVMJCQkJCTB4MDUwRQorI2RlZmluZQlSVF9PSURfODAyXzExX1BSRUFNQkxFCQkJCQkJMHgwNTBGCisjZGVmaW5lCU9JRF84MDJfMTFfV0VQX1NUQVRVUwkJCQkJCTB4MDUxMAorI2RlZmluZQlPSURfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUJCQkJMHgwNTExCisjZGVmaW5lCU9JRF84MDJfMTFfSU5GUkFTVFJVQ1RVUkVfTU9ERQkJCQkweDA1MTIKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9SRVNFVF9DT1VOVEVSUwkJCQkweDA1MTMKKyNkZWZpbmUJT0lEXzgwMl8xMV9SVFNfVEhSRVNIT0xECQkJCQkweDA1MTQKKyNkZWZpbmUJT0lEXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRAkJCTB4MDUxNQorI2RlZmluZQlPSURfODAyXzExX1BPV0VSX01PREUJCQkJCQkweDA1MTYKKyNkZWZpbmUJT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTAkJCQkJMHgwNTE3CisjZGVmaW5lCVJUX09JRF84MDJfMTFfQUREX1dQQQkJCQkJCTB4MDUxOAorI2RlZmluZQlPSURfODAyXzExX1JFTU9WRV9LRVkJCQkJCQkweDA1MTkKKyNkZWZpbmUJT0lEXzgwMl8xMV9BRERfS0VZCQkJCQkJCTB4MDUyMAorI2RlZmluZQlPSURfODAyXzExX0NPTkZJR1VSQVRJT04JCQkJCTB4MDUyMQorI2RlZmluZQlPSURfODAyXzExX1RYX1BBQ0tFVF9CVVJTVAkJCQkJMHgwNTIyCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfTk9JU0VfTEVWRUwJCQkJMHgwNTIzCisjZGVmaW5lCVJUX09JRF84MDJfMTFfRVhUUkFfSU5GTwkJCQkJMHgwNTI0CisjaWZkZWYJREJHCisjZGVmaW5lCVJUX09JRF84MDJfMTFfSEFSRFdBUkVfUkVHSVNURVIJCQkJMHgwNTI1CisjZW5kaWYKKyNkZWZpbmUgT0lEXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUyAgICAgICAgICAgIE9JRF84MDJfMTFfV0VQX1NUQVRVUworI2RlZmluZSBPSURfODAyXzExX0RFQVVUSEVOVElDQVRJT04gICAgICAgICAgICAgICAgIDB4MDUyNgorI2RlZmluZSBPSURfODAyXzExX0RST1BfVU5FTkNSWVBURUQgICAgICAgICAgICAgICAgIDB4MDUyNworI2RlZmluZSBPSURfODAyXzExX01JQ19GQUlMVVJFX1JFUE9SVF9GUkFNRSAgICAgICAgIDB4MDUyOAorCisvLyBGb3IgODAyLjF4IGRhZW1pbiB1c2luZyB0byByZXF1aXJlIGN1cnJlbnQgZHJpdmVyIGNvbmZpZ3VyYXRpb24KKyNkZWZpbmUgT0lEXzgwMl8xMV9SQURJVVNfUVVFUllfU0VUVElORwkJCQkweDA1NDAKKworI2RlZmluZQlSVF9PSURfREVWSUNFX05BTUUJCQkJCQkJMHgwNjA3CisjZGVmaW5lCVJUX09JRF9WRVJTSU9OX0lORk8JCQkJCQkJMHgwNjA4CisjZGVmaW5lCU9JRF84MDJfMTFfQlNTSURfTElTVAkJCQkJCTB4MDYwOQorI2RlZmluZQlPSURfODAyXzNfQ1VSUkVOVF9BRERSRVNTCQkJCQkweDA2MEEKKyNkZWZpbmUJT0lEX0dFTl9NRURJQV9DT05ORUNUX1NUQVRVUwkJCQkweDA2MEIKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9MSU5LX1NUQVRVUwkJCQkweDA2MEMKKyNkZWZpbmUJT0lEXzgwMl8xMV9SU1NJCQkJCQkJCQkweDA2MEQKKyNkZWZpbmUJT0lEXzgwMl8xMV9TVEFUSVNUSUNTCQkJCQkJMHgwNjBFCisjZGVmaW5lCU9JRF9HRU5fUkNWX09LCQkJCQkJCQkweDA2MEYKKyNkZWZpbmUJT0lEX0dFTl9SQ1ZfTk9fQlVGRkVSCQkJCQkJMHgwNjEwCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfRUVQUk9NX1ZFUlNJT04JCQkweDA2MTEKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9GSVJNV0FSRV9WRVJTSU9OCQkweDA2MTIKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9MQVNUX1JYX1JBVEUJCQkweDA2MTMKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTF8xCQkJCTB4MDYxNAorI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX1BJRFZJRAkJCQkJMHgwNjE1CisvL2ZvciBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjZGVmaW5lIE9JRF9TRVRfQ09VTlRFUk1FQVNVUkVTICAgICAgICAgICAgICAgICAgICAgMHgwNjE2CisjZGVmaW5lIE9JRF84MDJfMTFfU0VUX0lFRUU4MDIxWCAgICAgICAgICAgICAgICAgICAgMHgwNjE3CisjZGVmaW5lIE9JRF84MDJfMTFfU0VUX0lFRUU4MDIxWF9SRVFVSVJFX0tFWSAgICAgICAgMHgwNjE4CisjZGVmaW5lIE9JRF84MDJfMTFfUE1LSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjIwCisjZGVmaW5lIFJUX09JRF9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUICAgICAgICAgICAgICAgMHgwNjIxCisjZGVmaW5lIFJUX09JRF9XRV9WRVJTSU9OX0NPTVBJTEVEICAgICAgICAgICAgICAgICAgMHgwNjIyCisjZGVmaW5lIFJUX09JRF9ORVdfRFJJVkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjIzCisKKworLy9ydDI4NjAgLCBrYXRoeQorI2RlZmluZQlSVF9PSURfODAyXzExX1NOUl8wCQkJCQkJCTB4MDYzMAorI2RlZmluZQlSVF9PSURfODAyXzExX1NOUl8xCQkJCQkJCTB4MDYzMQorI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfVFhfUkFURQkJCTB4MDYzMgorI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0hUX1BIWU1PREUJCQkJMHgwNjMzCisjZGVmaW5lCVJUX09JRF84MDJfMTFfU0VUX0hUX1BIWU1PREUJCQkJMHgwNjM0CisjZGVmaW5lCU9JRF84MDJfMTFfUkVMT0FEX0RFRkFVTFRTCQkJCQkweDA2MzUKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9BUFNEX1NFVFRJTkcJCQkweDA2MzYKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TRVRfQVBTRF9TRVRUSU5HCQkJCTB4MDYzNworI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0FQU0RfUFNNCQkJCTB4MDYzOAorI2RlZmluZQlSVF9PSURfODAyXzExX1NFVF9BUFNEX1BTTQkJCQkJMHgwNjM5CisjZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfRExTCQkJCQkJMHgwNjNBCisjZGVmaW5lCVJUX09JRF84MDJfMTFfU0VUX0RMUwkJCQkJCTB4MDYzQgorI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0RMU19QQVJBTQkJCQkweDA2M0MKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TRVRfRExTX1BBUkFNCQkJCQkweDA2M0QKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9RVUVSWV9XTU0gICAgICAgICAgICAgIAkJMHgwNjNFCisjZGVmaW5lIFJUX09JRF84MDJfMTFfU0VUX1dNTSAgICAgIAkJCQkJMHgwNjNGCisjZGVmaW5lIFJUX09JRF84MDJfMTFfUVVFUllfSU1NRV9CQV9DQVAJCQkJMHgwNjQwCisjZGVmaW5lIFJUX09JRF84MDJfMTFfU0VUX0lNTUVfQkFfQ0FQCQkJCTB4MDY0MQorI2RlZmluZSBSVF9PSURfODAyXzExX1FVRVJZX0JBVEFCTEUJCQkJCTB4MDY0MgorI2RlZmluZSBSVF9PSURfODAyXzExX0FERF9JTU1FX0JBCQkJCQkweDA2NDMKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9URUFSX0lNTUVfQkEJCQkJCTB4MDY0NAorI2RlZmluZSBSVF9PSURfRFJJVkVSX0RFVklDRV9OQU1FICAgICAgICAgICAgICAgICAgIDB4MDY0NQorI2RlZmluZSBSVF9PSURfODAyXzExX1FVRVJZX0RBVF9IVF9QSFlNT0RFICAgICAgICAgIDB4MDY0NgorI2RlZmluZSBSVF9PSURfUVVFUllfTVVMVElQTEVfQ0FSRF9TVVBQT1JUICAgICAgICAgIDB4MDY0NworCisvLyBSYWxpbmsgZGVmaW5lZCBPSURzCisvLyBEZW5uaXMgTGVlIG1vdmUgdG8gcGxhdGZvcm0gc3BlY2lmaWMKKworI2RlZmluZQlSVF9PSURfODAyXzExX0JTU0lECQkJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0JTU0lEKQorI2RlZmluZQlSVF9PSURfODAyXzExX1NTSUQJCQkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfU1NJRCkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfSU5GUkFTVFJVQ1RVUkVfTU9ERSkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9BRERfV0VQCQkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfQUREX1dFUCkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9BRERfS0VZCQkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfQUREX0tFWSkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9SRU1PVkVfV0VQCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9SRU1PVkVfV0VQKQorI2RlZmluZQlSVF9PSURfODAyXzExX1JFTU9WRV9LRVkJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1JFTU9WRV9LRVkpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfRElTQVNTT0NJQVRFCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9ESVNBU1NPQ0lBVEUpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUFJJVkFDWV9GSUxURVIJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfUFJJVkFDWV9GSUxURVIpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTikKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9XRVBfU1RBVFVTCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9XRVBfU1RBVFVTKQorI2RlZmluZQlSVF9PSURfODAyXzExX1JFTE9BRF9ERUZBVUxUUwkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9SRUxPQURfREVGQVVMVFMpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfTkVUV09SS19UWVBFX0lOX1VTRQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX05FVFdPUktfVFlQRV9JTl9VU0UpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUwJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUwpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUlNTSV9UUklHR0VSCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9SU1NJX1RSSUdHRVIpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUlRTX1RIUkVTSE9MRAkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRCkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9SWF9BTlRFTk5BX1NFTEVDVEVECSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfUlhfQU5URU5OQV9TRUxFQ1RFRCkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9UWF9BTlRFTk5BX1NFTEVDVEVECSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfVFhfQU5URU5OQV9TRUxFQ1RFRCkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TVVBQT1JURURfUkFURVMJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfU1VQUE9SVEVEX1JBVEVTKQorI2RlZmluZQlSVF9PSURfODAyXzExX0RFU0lSRURfUkFURVMJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0RFU0lSRURfUkFURVMpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfQ09ORklHVVJBVElPTgkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfQ09ORklHVVJBVElPTikKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9QT1dFUl9NT0RFCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9QT1dFUl9NT0RFKQorCit0eXBlZGVmIGVudW0gX05ESVNfODAyXzExX1NUQVRVU19UWVBFCit7CisgICAgTmRpczgwMl8xMVN0YXR1c1R5cGVfQXV0aGVudGljYXRpb24sCisgICAgTmRpczgwMl8xMVN0YXR1c1R5cGVfTWVkaWFTdHJlYW1Nb2RlLAorICAgIE5kaXM4MDJfMTFTdGF0dXNUeXBlX1BNS0lEX0NhbmRpZGF0ZUxpc3QsCisgICAgTmRpczgwMl8xMVN0YXR1c1R5cGVNYXggICAgLy8gbm90IGEgcmVhbCB0eXBlLCBkZWZpbmVkIGFzIGFuIHVwcGVyIGJvdW5kCit9IE5ESVNfODAyXzExX1NUQVRVU19UWVBFLCAqUE5ESVNfODAyXzExX1NUQVRVU19UWVBFOworCit0eXBlZGVmIFVDSEFSICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1NbNl07CisKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9TVEFUVVNfSU5ESUNBVElPTgoreworICAgIE5ESVNfODAyXzExX1NUQVRVU19UWVBFIFN0YXR1c1R5cGU7Cit9IE5ESVNfODAyXzExX1NUQVRVU19JTkRJQ0FUSU9OLCAqUE5ESVNfODAyXzExX1NUQVRVU19JTkRJQ0FUSU9OOworCisvLyBtYXNrIGZvciBhdXRoZW50aWNhdGlvbi9pbnRlZ3JpdHkgZmllbGRzCisjZGVmaW5lIE5ESVNfODAyXzExX0FVVEhfUkVRVUVTVF9BVVRIX0ZJRUxEUyAgICAgICAgMHgwZgorCisjZGVmaW5lIE5ESVNfODAyXzExX0FVVEhfUkVRVUVTVF9SRUFVVEggICAgICAgICAgICAgMHgwMQorI2RlZmluZSBORElTXzgwMl8xMV9BVVRIX1JFUVVFU1RfS0VZVVBEQVRFICAgICAgICAgIDB4MDIKKyNkZWZpbmUgTkRJU184MDJfMTFfQVVUSF9SRVFVRVNUX1BBSVJXSVNFX0VSUk9SICAgICAweDA2CisjZGVmaW5lIE5ESVNfODAyXzExX0FVVEhfUkVRVUVTVF9HUk9VUF9FUlJPUiAgICAgICAgMHgwRQorCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fUkVRVUVTVAoreworICAgIFVMT05HIExlbmd0aDsgICAgICAgICAgICAvLyBMZW5ndGggb2Ygc3RydWN0dXJlCisgICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgQnNzaWQ7CisgICAgVUxPTkcgRmxhZ3M7Cit9IE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX1JFUVVFU1QsICpQTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fUkVRVUVTVDsKKworLy9BZGRlZCBuZXcgdHlwZXMgZm9yIFBNS0lEIENhbmRpZGF0ZSBsaXN0cy4KK3R5cGVkZWYgc3RydWN0IF9QTUtJRF9DQU5ESURBVEUgeworICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTIEJTU0lEOworICAgIFVMT05HIEZsYWdzOworfSBQTUtJRF9DQU5ESURBVEUsICpQUE1LSURfQ0FORElEQVRFOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfUE1LSURfQ0FORElEQVRFX0xJU1QKK3sKKyAgICBVTE9ORyBWZXJzaW9uOyAgICAgICAvLyBWZXJzaW9uIG9mIHRoZSBzdHJ1Y3R1cmUKKyAgICBVTE9ORyBOdW1DYW5kaWRhdGVzOyAvLyBOby4gb2YgcG1raWQgY2FuZGlkYXRlcworICAgIFBNS0lEX0NBTkRJREFURSBDYW5kaWRhdGVMaXN0WzFdOworfSBORElTXzgwMl8xMV9QTUtJRF9DQU5ESURBVEVfTElTVCwgKlBORElTXzgwMl8xMV9QTUtJRF9DQU5ESURBVEVfTElTVDsKKworLy9GbGFncyBmb3IgUE1LSUQgQ2FuZGlkYXRlIGxpc3Qgc3RydWN0dXJlCisjZGVmaW5lIE5ESVNfODAyXzExX1BNS0lEX0NBTkRJREFURV9QUkVBVVRIX0VOQUJMRUQJMHgwMQorCisvLyBBZGRlZCBuZXcgdHlwZXMgZm9yIE9GRE0gNUcgYW5kIDIuNEcKK3R5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfTkVUV09SS19UWVBFCit7CisgICBOZGlzODAyXzExRkgsCisgICBOZGlzODAyXzExRFMsCisgICAgTmRpczgwMl8xMU9GRE01LAorICAgIE5kaXM4MDJfMTFPRkRNNV9OLAorICAgIE5kaXM4MDJfMTFPRkRNMjQsCisgICAgTmRpczgwMl8xMU9GRE0yNF9OLAorICAgTmRpczgwMl8xMUF1dG9tb2RlLAorICAgIE5kaXM4MDJfMTFOZXR3b3JrVHlwZU1heCAgICAvLyBub3QgYSByZWFsIHR5cGUsIGRlZmluZWQgYXMgYW4gdXBwZXIgYm91bmQKK30gTkRJU184MDJfMTFfTkVUV09SS19UWVBFLCAqUE5ESVNfODAyXzExX05FVFdPUktfVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX05FVFdPUktfVFlQRV9MSVNUCit7CisgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyT2ZJdGVtczsgIC8vIGluIGxpc3QgYmVsb3csIGF0IGxlYXN0IDEKKyAgIE5ESVNfODAyXzExX05FVFdPUktfVFlQRSAgICBOZXR3b3JrVHlwZSBbMV07Cit9IE5ESVNfODAyXzExX05FVFdPUktfVFlQRV9MSVNULCAqUE5ESVNfODAyXzExX05FVFdPUktfVFlQRV9MSVNUOworCit0eXBlZGVmIGVudW0gX05ESVNfODAyXzExX1BPV0VSX01PREUKK3sKKyAgICBOZGlzODAyXzExUG93ZXJNb2RlQ0FNLAorICAgIE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQLAorICAgIE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUCwKKyAgICBOZGlzODAyXzExUG93ZXJNb2RlTGVnYWN5X1BTUCwKKyAgICBOZGlzODAyXzExUG93ZXJNb2RlTWF4ICAgICAgLy8gbm90IGEgcmVhbCBtb2RlLCBkZWZpbmVkIGFzIGFuIHVwcGVyIGJvdW5kCit9IE5ESVNfODAyXzExX1BPV0VSX01PREUsICpQTkRJU184MDJfMTFfUE9XRVJfTU9ERTsKKwordHlwZWRlZiBVTE9ORyAgIE5ESVNfODAyXzExX1RYX1BPV0VSX0xFVkVMOyAvLyBpbiBtaWxsaXdhdHRzCisKKy8vCisvLyBSZWNlaXZlZCBTaWduYWwgU3RyZW5ndGggSW5kaWNhdGlvbgorLy8KK3R5cGVkZWYgTE9ORyAgICBORElTXzgwMl8xMV9SU1NJOyAgICAgICAgICAgLy8gaW4gZEJtCisKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OX0ZICit7CisgICBVTE9ORyAgICAgICAgICAgTGVuZ3RoOyAgICAgICAgICAgIC8vIExlbmd0aCBvZiBzdHJ1Y3R1cmUKKyAgIFVMT05HICAgICAgICAgICBIb3BQYXR0ZXJuOyAgICAgICAgLy8gQXMgZGVmaW5lZCBieSA4MDIuMTEsIE1TQiBzZXQKKyAgIFVMT05HICAgICAgICAgICBIb3BTZXQ7ICAgICAgICAgICAgLy8gdG8gb25lIGlmIG5vbi04MDIuMTEKKyAgIFVMT05HICAgICAgICAgICBEd2VsbFRpbWU7ICAgICAgICAgLy8gdW5pdHMgYXJlIEt1c2VjCit9IE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT05fRkgsICpQTkRJU184MDJfMTFfQ09ORklHVVJBVElPTl9GSDsKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0NPTkZJR1VSQVRJT04KK3sKKyAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoOyAgICAgICAgICAgICAvLyBMZW5ndGggb2Ygc3RydWN0dXJlCisgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJlYWNvblBlcmlvZDsgICAgICAgLy8gdW5pdHMgYXJlIEt1c2VjCisgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUSU1XaW5kb3c7ICAgICAgICAgLy8gdW5pdHMgYXJlIEt1c2VjCisgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIERTQ29uZmlnOyAgICAgICAgICAgLy8gRnJlcXVlbmN5LCB1bml0cyBhcmUga0h6CisgICBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OX0ZIICAgIEZIQ29uZmlnOworfSBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OLCAqUE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT047CisKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9TVEFUSVNUSUNTCit7CisgICBVTE9ORyAgICAgICAgICAgTGVuZ3RoOyAgICAgICAgICAgICAvLyBMZW5ndGggb2Ygc3RydWN0dXJlCisgICBMQVJHRV9JTlRFR0VSICAgVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50OworICAgTEFSR0VfSU5URUdFUiAgIE11bHRpY2FzdFRyYW5zbWl0dGVkRnJhbWVDb3VudDsKKyAgIExBUkdFX0lOVEVHRVIgICBGYWlsZWRDb3VudDsKKyAgIExBUkdFX0lOVEVHRVIgICBSZXRyeUNvdW50OworICAgTEFSR0VfSU5URUdFUiAgIE11bHRpcGxlUmV0cnlDb3VudDsKKyAgIExBUkdFX0lOVEVHRVIgICBSVFNTdWNjZXNzQ291bnQ7CisgICBMQVJHRV9JTlRFR0VSICAgUlRTRmFpbHVyZUNvdW50OworICAgTEFSR0VfSU5URUdFUiAgIEFDS0ZhaWx1cmVDb3VudDsKKyAgIExBUkdFX0lOVEVHRVIgICBGcmFtZUR1cGxpY2F0ZUNvdW50OworICAgTEFSR0VfSU5URUdFUiAgIFJlY2VpdmVkRnJhZ21lbnRDb3VudDsKKyAgIExBUkdFX0lOVEVHRVIgICBNdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQ7CisgICBMQVJHRV9JTlRFR0VSICAgRkNTRXJyb3JDb3VudDsKKyAgIExBUkdFX0lOVEVHRVIgICBUS0lQTG9jYWxNSUNGYWlsdXJlczsKKyAgIExBUkdFX0lOVEVHRVIgICBUS0lQUmVtb3RlTUlDRXJyb3JzOworICAgTEFSR0VfSU5URUdFUiAgIFRLSVBJQ1ZFcnJvcnM7CisgICBMQVJHRV9JTlRFR0VSICAgVEtJUENvdW50ZXJNZWFzdXJlc0ludm9rZWQ7CisgICBMQVJHRV9JTlRFR0VSICAgVEtJUFJlcGxheXM7CisgICBMQVJHRV9JTlRFR0VSICAgQ0NNUEZvcm1hdEVycm9yczsKKyAgIExBUkdFX0lOVEVHRVIgICBDQ01QUmVwbGF5czsKKyAgIExBUkdFX0lOVEVHRVIgICBDQ01QRGVjcnlwdEVycm9yczsKKyAgIExBUkdFX0lOVEVHRVIgICBGb3VyV2F5SGFuZHNoYWtlRmFpbHVyZXM7Cit9IE5ESVNfODAyXzExX1NUQVRJU1RJQ1MsICpQTkRJU184MDJfMTFfU1RBVElTVElDUzsKKwordHlwZWRlZiAgVUxPTkcgIE5ESVNfODAyXzExX0tFWV9JTkRFWDsKK3R5cGVkZWYgVUxPTkdMT05HICAgTkRJU184MDJfMTFfS0VZX1JTQzsKKworI2RlZmluZSBNQVhfUkFESVVTX1NSVl9OVU0JCQkyCSAgLy8gODAyLjF4IGZhaWxvdmVyIG51bWJlcgorCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JBRElVU19TUlZfSU5GTyB7CisJVUlOVDMyCQkJcmFkaXVzX2lwOworCVVJTlQzMgkJCXJhZGl1c19wb3J0OworCVVDSEFSCQkJcmFkaXVzX2tleVs2NF07CisJVUNIQVIJCQlyYWRpdXNfa2V5X2xlbjsKK30gUkFESVVTX1NSVl9JTkZPLCAqUFJBRElVU19TUlZfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SQURJVVNfS0VZX0lORk8KK3sKKwlVQ0hBUgkJCXJhZGl1c19zcnZfbnVtOworCVJBRElVU19TUlZfSU5GTwlyYWRpdXNfc3J2X2luZm9bTUFYX1JBRElVU19TUlZfTlVNXTsKKwlVQ0hBUgkJCWllZWU4MDIxeFdFUDsJCSAvLyBkeW5hbWljIFdFUAorICAgIFVDSEFSICAgICAgICAgICBrZXlfaW5kZXg7CisgICAgVUNIQVIgICAgICAgICAgIGtleV9sZW5ndGg7ICAgICAgICAgIC8vIGxlbmd0aCBvZiBrZXkgaW4gYnl0ZXMKKyAgICBVQ0hBUiAgICAgICAgICAga2V5X21hdGVyaWFsWzEzXTsKK30gUkFESVVTX0tFWV9JTkZPLCAqUFJBRElVU19LRVlfSU5GTzsKKworLy8gSXQncyB1c2VkIGJ5IDgwMi4xeCBkYWVtb24gdG8gcmVxdWlyZSByZWxhdGl2ZSBjb25maWd1cmF0aW9uCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JBRElVU19DT05GCit7CisgICAgVUlOVDMyICAgICAgICAgIExlbmd0aDsgICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlCisgICAgVUNIQVIJCQltYnNzX251bTsJCQkvLyBpbmRpY2F0ZSBtdWx0aXBsZSBCU1MgbnVtYmVyCisJVUlOVDMyCQkJb3duX2lwX2FkZHI7CisJVUlOVDMyCQkJcmV0cnlfaW50ZXJ2YWw7CisJVUlOVDMyCQkJc2Vzc2lvbl90aW1lb3V0X2ludGVydmFsOworCVVDSEFSCQkJRUFQaWZuYW1lW0lGTkFNU0laXTsKKwlVQ0hBUgkJCUVBUGlmbmFtZV9sZW47CisJVUNIQVIgCQkJUHJlQXV0aGlmbmFtZVtJRk5BTVNJWl07CisJVUNIQVIJCQlQcmVBdXRoaWZuYW1lX2xlbjsKKwlSQURJVVNfS0VZX0lORk8JUmFkaXVzSW5mb1s4LypNQVhfTUJTU0lEX05VTSovXTsKK30gUkFESVVTX0NPTkYsICpQUkFESVVTX0NPTkY7CisKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisvLyBLZXkgbWFwcGluZyBrZXlzIHJlcXVpcmUgYSBCU1NJRAordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0tFWQoreworICAgIFVJTlQgICAgICAgICAgIExlbmd0aDsgICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlCisgICAgVUlOVCAgICAgICAgICAgS2V5SW5kZXg7CisgICAgVUlOVCAgICAgICAgICAgS2V5TGVuZ3RoOyAgICAgICAgICAvLyBsZW5ndGggb2Yga2V5IGluIGJ5dGVzCisgICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgQlNTSUQ7CisgICAgTkRJU184MDJfMTFfS0VZX1JTQyBLZXlSU0M7CisgICAgVUNIQVIgICAgICAgICAgIEtleU1hdGVyaWFsWzFdOyAgICAgLy8gdmFyaWFibGUgbGVuZ3RoIGRlcGVuZGluZyBvbiBhYm92ZSBmaWVsZAorfSBORElTXzgwMl8xMV9LRVksICpQTkRJU184MDJfMTFfS0VZOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfUkVNT1ZFX0tFWQoreworICAgIFVJTlQgICAgICAgICAgIExlbmd0aDsgICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlCisgICAgVUlOVCAgICAgICAgICAgS2V5SW5kZXg7CisgICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgQlNTSUQ7Cit9IE5ESVNfODAyXzExX1JFTU9WRV9LRVksICpQTkRJU184MDJfMTFfUkVNT1ZFX0tFWTsKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX1dFUAoreworICAgVUlOVCAgICAgTGVuZ3RoOyAgICAgICAgLy8gTGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlCisgICBVSU5UICAgICBLZXlJbmRleDsgICAgICAgICAgIC8vIDAgaXMgdGhlIHBlci1jbGllbnQga2V5LCAxLU4gYXJlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdsb2JhbCBrZXlzCisgICBVSU5UICAgICBLZXlMZW5ndGg7ICAgICAvLyBsZW5ndGggb2Yga2V5IGluIGJ5dGVzCisgICBVQ0hBUiAgICAgS2V5TWF0ZXJpYWxbMV07Ly8gdmFyaWFibGUgbGVuZ3RoIGRlcGVuZGluZyBvbiBhYm92ZSBmaWVsZAorfSBORElTXzgwMl8xMV9XRVAsICpQTkRJU184MDJfMTFfV0VQOworCisKK3R5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRQoreworICAgTmRpczgwMl8xMUlCU1MsCisgICBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmUsCisgICBOZGlzODAyXzExQXV0b1Vua25vd24sCisgICBOZGlzODAyXzExTW9uaXRvciwKKyAgIE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZU1heCAgICAgLy8gTm90IGEgcmVhbCB2YWx1ZSwgZGVmaW5lZCBhcyB1cHBlciBib3VuZAorfSBORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFLCAqUE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkU7CisKKy8vIEFkZCBuZXcgYXV0aGVudGljYXRpb24gbW9kZXMKK3R5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERQoreworICAgTmRpczgwMl8xMUF1dGhNb2RlT3BlbiwKKyAgIE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCwKKyAgIE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gsCisgICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBLAorICAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSywKKyAgICBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lLAorICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBMiwKKyAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0ssCisgICAJTmRpczgwMl8xMUF1dGhNb2RlV1BBMVdQQTIsCisJTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0ssCisgICBOZGlzODAyXzExQXV0aE1vZGVNYXggICAgICAgICAgIC8vIE5vdCBhIHJlYWwgbW9kZSwgZGVmaW5lZCBhcyB1cHBlciBib3VuZAorfSBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFLCAqUE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREU7CisKK3R5cGVkZWYgVUNIQVIgICBORElTXzgwMl8xMV9SQVRFU1tORElTXzgwMl8xMV9MRU5HVEhfUkFURVNdOyAgICAgICAgLy8gU2V0IG9mIDggZGF0YSByYXRlcwordHlwZWRlZiBVQ0hBUiAgIE5ESVNfODAyXzExX1JBVEVTX0VYW05ESVNfODAyXzExX0xFTkdUSF9SQVRFU19FWF07ICAvLyBTZXQgb2YgMTYgZGF0YSByYXRlcworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX05ESVNfODAyXzExX1NTSUQKK3sKKyAgICBVSU5UICAgU3NpZExlbmd0aDsgICAgICAgICAvLyBsZW5ndGggb2YgU1NJRCBmaWVsZCBiZWxvdywgaW4gYnl0ZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgY2FuIGJlIHplcm8uCisgICAgVUNIQVIgICBTc2lkW05ESVNfODAyXzExX0xFTkdUSF9TU0lEXTsgICAgICAgICAgIC8vIFNTSUQgaW5mb3JtYXRpb24gZmllbGQKK30gTkRJU184MDJfMTFfU1NJRCwgKlBORElTXzgwMl8xMV9TU0lEOworCisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTkRJU19XTEFOX0JTU0lECit7CisgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZW5ndGg7ICAgICAvLyBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUKKyAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTICAgICAgICAgICAgIE1hY0FkZHJlc3M7IC8vIEJTU0lECisgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZFsyXTsKKyAgIE5ESVNfODAyXzExX1NTSUQgICAgICAgICAgICAgICAgICAgIFNzaWQ7ICAgICAgIC8vIFNTSUQKKyAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaXZhY3k7ICAgIC8vIFdFUCBlbmNyeXB0aW9uIHJlcXVpcmVtZW50CisgICBORElTXzgwMl8xMV9SU1NJICAgICAgICAgICAgICAgICAgICBSc3NpOyAgICAgICAvLyByZWNlaXZlIHNpZ25hbCBzdHJlbmd0aCBpbiBkQm0KKyAgIE5ESVNfODAyXzExX05FVFdPUktfVFlQRSAgICAgICAgICAgIE5ldHdvcmtUeXBlSW5Vc2U7CisgICBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OICAgICAgICAgICBDb25maWd1cmF0aW9uOworICAgTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSAgSW5mcmFzdHJ1Y3R1cmVNb2RlOworICAgTkRJU184MDJfMTFfUkFURVMgICAgICAgICAgICAgICAgICAgU3VwcG9ydGVkUmF0ZXM7Cit9IE5ESVNfV0xBTl9CU1NJRCwgKlBORElTX1dMQU5fQlNTSUQ7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTkRJU184MDJfMTFfQlNTSURfTElTVAoreworICAgVUlOVCAgICAgICAgICAgTnVtYmVyT2ZJdGVtczsgICAgICAvLyBpbiBsaXN0IGJlbG93LCBhdCBsZWFzdCAxCisgICBORElTX1dMQU5fQlNTSUQgQnNzaWRbMV07Cit9IE5ESVNfODAyXzExX0JTU0lEX0xJU1QsICpQTkRJU184MDJfMTFfQlNTSURfTElTVDsKKworLy8gQWRkZWQgQ2FwYWJpbGl0aWVzLCBJRUxlbmd0aCBhbmQgSUVzIGZvciBlYWNoIEJTU0lECit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX05ESVNfV0xBTl9CU1NJRF9FWAoreworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlbmd0aDsgICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlCisgICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgICAgICAgICAgICAgTWFjQWRkcmVzczsgICAgICAgICAvLyBCU1NJRAorICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkWzJdOworICAgIE5ESVNfODAyXzExX1NTSUQgICAgICAgICAgICAgICAgICAgIFNzaWQ7ICAgICAgICAgICAgICAgLy8gU1NJRAorICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaXZhY3k7ICAgICAgICAgICAgLy8gV0VQIGVuY3J5cHRpb24gcmVxdWlyZW1lbnQKKyAgICBORElTXzgwMl8xMV9SU1NJICAgICAgICAgICAgICAgICAgICBSc3NpOyAgICAgICAgICAgICAgIC8vIHJlY2VpdmUgc2lnbmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdHJlbmd0aCBpbiBkQm0KKyAgICBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgICAgICAgICAgICBOZXR3b3JrVHlwZUluVXNlOworICAgIE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04gICAgICAgICAgIENvbmZpZ3VyYXRpb247CisgICAgTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSAgSW5mcmFzdHJ1Y3R1cmVNb2RlOworICAgIE5ESVNfODAyXzExX1JBVEVTX0VYICAgICAgICAgICAgICAgIFN1cHBvcnRlZFJhdGVzOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFTGVuZ3RoOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFc1sxXTsKK30gTkRJU19XTEFOX0JTU0lEX0VYLCAqUE5ESVNfV0xBTl9CU1NJRF9FWDsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9ORElTXzgwMl8xMV9CU1NJRF9MSVNUX0VYCit7CisgICAgVUlOVCAgICAgICAgICAgICAgICAgICBOdW1iZXJPZkl0ZW1zOyAgICAgIC8vIGluIGxpc3QgYmVsb3csIGF0IGxlYXN0IDEKKyAgICBORElTX1dMQU5fQlNTSURfRVggICAgICBCc3NpZFsxXTsKK30gTkRJU184MDJfMTFfQlNTSURfTElTVF9FWCwgKlBORElTXzgwMl8xMV9CU1NJRF9MSVNUX0VYOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX05ESVNfODAyXzExX0ZJWEVEX0lFcworeworICAgIFVDSEFSIFRpbWVzdGFtcFs4XTsKKyAgICBVU0hPUlQgQmVhY29uSW50ZXJ2YWw7CisgICAgVVNIT1JUIENhcGFiaWxpdGllczsKK30gTkRJU184MDJfMTFfRklYRURfSUVzLCAqUE5ESVNfODAyXzExX0ZJWEVEX0lFczsKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX1ZBUklBQkxFX0lFcworeworICAgIFVDSEFSIEVsZW1lbnRJRDsKKyAgICBVQ0hBUiBMZW5ndGg7ICAgIC8vIE51bWJlciBvZiBieXRlcyBpbiBkYXRhIGZpZWxkCisgICAgVUNIQVIgZGF0YVsxXTsKK30gTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzLCAqUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFczsKKwordHlwZWRlZiAgVUxPTkcgICBORElTXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRDsKKwordHlwZWRlZiAgVUxPTkcgICBORElTXzgwMl8xMV9SVFNfVEhSRVNIT0xEOworCit0eXBlZGVmICBVTE9ORyAgIE5ESVNfODAyXzExX0FOVEVOTkE7CisKK3R5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfUFJJVkFDWV9GSUxURVIKK3sKKyAgIE5kaXM4MDJfMTFQcml2RmlsdGVyQWNjZXB0QWxsLAorICAgTmRpczgwMl8xMVByaXZGaWx0ZXI4MDIxeFdFUAorfSBORElTXzgwMl8xMV9QUklWQUNZX0ZJTFRFUiwgKlBORElTXzgwMl8xMV9QUklWQUNZX0ZJTFRFUjsKKworLy8gQWRkZWQgbmV3IGVuY3J5cHRpb24gdHlwZXMKKy8vIEFsc28gYWxpYXNlZCB0eXBlZGVmIHRvIG5ldyBuYW1lCit0eXBlZGVmIGVudW0gX05ESVNfODAyXzExX1dFUF9TVEFUVVMKK3sKKyAgIE5kaXM4MDJfMTFXRVBFbmFibGVkLAorICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQgPSBOZGlzODAyXzExV0VQRW5hYmxlZCwKKyAgIE5kaXM4MDJfMTFXRVBEaXNhYmxlZCwKKyAgICBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkID0gTmRpczgwMl8xMVdFUERpc2FibGVkLAorICAgTmRpczgwMl8xMVdFUEtleUFic2VudCwKKyAgICBOZGlzODAyXzExRW5jcnlwdGlvbjFLZXlBYnNlbnQgPSBOZGlzODAyXzExV0VQS2V5QWJzZW50LAorICAgTmRpczgwMl8xMVdFUE5vdFN1cHBvcnRlZCwKKyAgICBOZGlzODAyXzExRW5jcnlwdGlvbk5vdFN1cHBvcnRlZCA9IE5kaXM4MDJfMTFXRVBOb3RTdXBwb3J0ZWQsCisgICAgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCwKKyAgICBOZGlzODAyXzExRW5jcnlwdGlvbjJLZXlBYnNlbnQsCisgICAgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCwKKyAgICBOZGlzODAyXzExRW5jcnlwdGlvbjNLZXlBYnNlbnQsCisgICAgTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZCwJLy8gVEtJUCBvciBBRVMgbWl4CisgICAgTmRpczgwMl8xMUVuY3J5cHRpb240S2V5QWJzZW50LAorfSBORElTXzgwMl8xMV9XRVBfU1RBVFVTLCAqUE5ESVNfODAyXzExX1dFUF9TVEFUVVMsCisgIE5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTLCAqUE5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTOworCit0eXBlZGVmIGVudW0gX05ESVNfODAyXzExX1JFTE9BRF9ERUZBVUxUUworeworICAgTmRpczgwMl8xMVJlbG9hZFdFUEtleXMKK30gTkRJU184MDJfMTFfUkVMT0FEX0RFRkFVTFRTLCAqUE5ESVNfODAyXzExX1JFTE9BRF9ERUZBVUxUUzsKKworI2RlZmluZSBORElTXzgwMl8xMV9BSV9SRVFGSV9DQVBBQklMSVRJRVMgICAgICAxCisjZGVmaW5lIE5ESVNfODAyXzExX0FJX1JFUUZJX0xJU1RFTklOVEVSVkFMICAgIDIKKyNkZWZpbmUgTkRJU184MDJfMTFfQUlfUkVRRklfQ1VSUkVOVEFQQUREUkVTUyAgNAorCisjZGVmaW5lIE5ESVNfODAyXzExX0FJX1JFU0ZJX0NBUEFCSUxJVElFUyAgICAgIDEKKyNkZWZpbmUgTkRJU184MDJfMTFfQUlfUkVTRklfU1RBVFVTQ09ERSAgICAgICAgMgorI2RlZmluZSBORElTXzgwMl8xMV9BSV9SRVNGSV9BU1NPQ0lBVElPTklEICAgICA0CisKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9BSV9SRVFGSQoreworICAgIFVTSE9SVCBDYXBhYmlsaXRpZXM7CisgICAgVVNIT1JUIExpc3RlbkludGVydmFsOworICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTICBDdXJyZW50QVBBZGRyZXNzOworfSBORElTXzgwMl8xMV9BSV9SRVFGSSwgKlBORElTXzgwMl8xMV9BSV9SRVFGSTsKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0FJX1JFU0ZJCit7CisgICAgVVNIT1JUIENhcGFiaWxpdGllczsKKyAgICBVU0hPUlQgU3RhdHVzQ29kZTsKKyAgICBVU0hPUlQgQXNzb2NpYXRpb25JZDsKK30gTkRJU184MDJfMTFfQUlfUkVTRkksICpQTkRJU184MDJfMTFfQUlfUkVTRkk7CisKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTgoreworICAgIFVMT05HICAgICAgICAgICAgICAgICAgIExlbmd0aDsKKyAgICBVU0hPUlQgICAgICAgICAgICAgICAgICBBdmFpbGFibGVSZXF1ZXN0Rml4ZWRJRXM7CisgICAgTkRJU184MDJfMTFfQUlfUkVRRkkgICAgUmVxdWVzdEZpeGVkSUVzOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgIFJlcXVlc3RJRUxlbmd0aDsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICBPZmZzZXRSZXF1ZXN0SUVzOworICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgIEF2YWlsYWJsZVJlc3BvbnNlRml4ZWRJRXM7CisgICAgTkRJU184MDJfMTFfQUlfUkVTRkkgICAgUmVzcG9uc2VGaXhlZElFczsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICBSZXNwb25zZUlFTGVuZ3RoOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgIE9mZnNldFJlc3BvbnNlSUVzOworfSBORElTXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTiwgKlBORElTXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTjsKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX0VWRU5UCit7CisgICAgTkRJU184MDJfMTFfU1RBVFVTX0lORElDQVRJT04gICAgICAgU3RhdHVzOworICAgIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX1JFUVVFU1QgIFJlcXVlc3RbMV07Cit9IE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX0VWRU5ULCAqUE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX0VWRU5UOworCisvLyA4MDIuMTEgTWVkaWEgc3RyZWFtIGNvbnN0cmFpbnRzLCBhc3NvY2lhdGVkIHdpdGggT0lEXzgwMl8xMV9NRURJQV9TVFJFQU1fTU9ERQordHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9NRURJQV9TVFJFQU1fTU9ERQoreworICAgIE5kaXM4MDJfMTFNZWRpYVN0cmVhbU9mZiwKKyAgICBOZGlzODAyXzExTWVkaWFTdHJlYW1PbiwKK30gTkRJU184MDJfMTFfTUVESUFfU1RSRUFNX01PREUsICpQTkRJU184MDJfMTFfTUVESUFfU1RSRUFNX01PREU7CisKKy8vIFBNS0lEIFN0cnVjdHVyZXMKK3R5cGVkZWYgVUNIQVIgICBORElTXzgwMl8xMV9QTUtJRF9WQUxVRVsxNl07CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK3R5cGVkZWYgc3RydWN0IF9CU1NJRF9JTkZPCit7CisgICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgQlNTSUQ7CisgICAgTkRJU184MDJfMTFfUE1LSURfVkFMVUUgUE1LSUQ7Cit9IEJTU0lEX0lORk8sICpQQlNTSURfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX1BNS0lECit7CisgICAgVUlOVCAgICBMZW5ndGg7CisgICAgVUlOVCAgICBCU1NJREluZm9Db3VudDsKKyAgICBCU1NJRF9JTkZPIEJTU0lESW5mb1sxXTsKK30gTkRJU184MDJfMTFfUE1LSUQsICpQTkRJU184MDJfMTFfUE1LSUQ7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX0VOQ1JZUFRJT04KK3sKKyAgICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFIEF1dGhNb2RlU3VwcG9ydGVkOworICAgIE5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTIEVuY3J5cHRTdGF0dXNTdXBwb3J0ZWQ7Cit9IE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX0VOQ1JZUFRJT04sICpQTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fRU5DUllQVElPTjsKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0NBUEFCSUxJVFkKK3sKKyAgICAgVUxPTkcgTGVuZ3RoOworICAgICBVTE9ORyBWZXJzaW9uOworICAgICBVTE9ORyBOb09mUE1LSURzOworICAgICBVTE9ORyBOb09mQXV0aEVuY3J5cHRQYWlyc1N1cHBvcnRlZDsKKyAgICAgTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fRU5DUllQVElPTiBBdXRoZW50aWNhdGlvbkVuY3J5cHRpb25TdXBwb3J0ZWRbMV07Cit9IE5ESVNfODAyXzExX0NBUEFCSUxJVFksICpQTkRJU184MDJfMTFfQ0FQQUJJTElUWTsKKworLy8jZW5kaWYgLy9vZiBXSU4gMmsKKyNlbmRpZiAvL1VOREVSX0NFCisKKyNpZiBXSVJFTEVTU19FWFQgPD0gMTEKKyNpZm5kZWYgU0lPQ0RFVlBSSVZBVEUKKyNkZWZpbmUgU0lPQ0RFVlBSSVZBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCRTAKKyNlbmRpZgorI2RlZmluZSBTSU9DSVdGSVJTVFBSSVYJCQkJCQkJCVNJT0NERVZQUklWQVRFCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2RlZmluZSBSVFBSSVZfSU9DVExfU0VUCQkJCQkJCShTSU9DSVdGSVJTVFBSSVYgKyAweDAyKQorCisjaWZkZWYgREJHCisjZGVmaW5lIFJUUFJJVl9JT0NUTF9CQlAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNJT0NJV0ZJUlNUUFJJViArIDB4MDMpCisjZGVmaW5lIFJUUFJJVl9JT0NUTF9NQUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNJT0NJV0ZJUlNUUFJJViArIDB4MDUpCisjZGVmaW5lIFJUUFJJVl9JT0NUTF9FMlAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNJT0NJV0ZJUlNUUFJJViArIDB4MDcpCisjZW5kaWYKKworI2lmZGVmIFJBTElOS19BVEUKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorI2RlZmluZSBSVFBSSVZfSU9DVExfQVRFCQkJCQkJCShTSU9DSVdGSVJTVFBSSVYgKyAweDA4KQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisjZGVmaW5lIFJUUFJJVl9JT0NUTF9TVEFUSVNUSUNTICAgICAgICAgICAgICAgICAgICAgKFNJT0NJV0ZJUlNUUFJJViArIDB4MDkpCisjZGVmaW5lIFJUUFJJVl9JT0NUTF9BRERfUE1LSURfQ0FDSEUgICAgICAgICAgICAgICAgKFNJT0NJV0ZJUlNUUFJJViArIDB4MEEpCisjZGVmaW5lIFJUUFJJVl9JT0NUTF9SQURJVVNfREFUQSAgICAgICAgICAgICAgICAgICAgKFNJT0NJV0ZJUlNUUFJJViArIDB4MEMpCisjZGVmaW5lIFJUUFJJVl9JT0NUTF9HU0lURVNVUlZFWQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MEQpCisjZGVmaW5lIFJUX1BSSVZfSU9DVEwJCQkJCQkJCShTSU9DSVdGSVJTVFBSSVYgKyAweDBFKSAvLyBTeW5jLiB3aXRoIFJUNjEgKGZvciB3cGFfc3VwcGxpY2FudCkKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX0dFVF9NQUNfVEFCTEUJCQkJCShTSU9DSVdGSVJTVFBSSVYgKyAweDBGKQorCisjZGVmaW5lIFJUUFJJVl9JT0NUTF9TSE9XCQkJCQkJCShTSU9DSVdGSVJTVFBSSVYgKyAweDExKQorZW51bSB7CisgICAgU0hPV19DT05OX1NUQVRVUyA9IDQsCisgICAgU0hPV19EUlZJRVJfVkVSSU9OID0gNSwKKyAgICBTSE9XX0JBX0lORk8gPSA2LAorCVNIT1dfREVTQ19JTkZPID0gNywKKyAgICBSQUlPX09GRiA9IDEwLAorICAgIFJBSU9fT04gPSAxMSwKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwlTSE9XX0RMU19FTlRSWV9JTkZPID0gMTksCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJU0hPV19DRkdfVkFMVUUgPSAyMCwKK307CisKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIFNOTVBfU1VQUE9SVAorLy9TTk1QIGllZWUgODAyZG90MTEsIGthdGh5ICwgMjAwOF8wMjIwCisvLyBkb3QxMXJlcygzKQorI2RlZmluZSBSVF9PSURfODAyXzExX01BTlVGQUNUVVJFUk9VSQkJCTB4MDcwMAorI2RlZmluZSBSVF9PSURfODAyXzExX01BTlVGQUNUVVJFUk5BTUUJCQkweDA3MDEKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9SRVNPVVJDRVRZUEVJRE5BTUUJCTB4MDcwMgorCisvLyBkb3QxMXNtdCgxKQorI2RlZmluZSBSVF9PSURfODAyXzExX1BSSVZBQ1lPUFRJT05JTVBMRU1FTlRFRAkweDA3MDMKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9QT1dFUk1BTkFHRU1FTlRNT0RFCQkweDA3MDQKKyNkZWZpbmUgT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZVkFMVUUJCQkweDA3MDUgLy8gcmVhZCAsIHdyaXRlCisjZGVmaW5lIE9JRF84MDJfMTFfV0VQREVGQVVMVEtFWUlECQkJCTB4MDcwNgorI2RlZmluZSBSVF9PSURfODAyXzExX1dFUEtFWU1BUFBJTkdMRU5HVEgJCTB4MDcwNworI2RlZmluZSBPSURfODAyXzExX1NIT1JUUkVUUllMSU1JVAkJCQkweDA3MDgKKyNkZWZpbmUgT0lEXzgwMl8xMV9MT05HUkVUUllMSU1JVAkJCQkweDA3MDkKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9QUk9EVUNUSUQJCQkJCTB4MDcxMAorI2RlZmluZSBSVF9PSURfODAyXzExX01BTlVGQUNUVVJFSUQJCQkJMHgwNzExCisKKy8vIC8vZG90MTFQaHkoNCkKKyNkZWZpbmUgT0lEXzgwMl8xMV9DVVJSRU5UQ0hBTk5FTAkJCQkweDA3MTIKKworLy9kb3QxMW1hYworI2RlZmluZSBSVF9PSURfODAyXzExX01BQ19BRERSRVNTCQkJCTB4MDcxMworI2VuZGlmIC8vIFNOTVBfU1VQUE9SVCAvLworCisjZGVmaW5lIE9JRF84MDJfMTFfQlVJTERfQ0hBTk5FTF9FWAkJCQkweDA3MTQKKyNkZWZpbmUgT0lEXzgwMl8xMV9HRVRfQ0hfTElTVAkJCQkJMHgwNzE1CisjZGVmaW5lIE9JRF84MDJfMTFfR0VUX0NPVU5UUllfQ09ERQkJCQkweDA3MTYKKyNkZWZpbmUgT0lEXzgwMl8xMV9HRVRfQ0hBTk5FTF9HRU9HUkFQSFkJCTB4MDcxNworCisjaWZkZWYgTExURF9TVVBQT1JUCisvLyBmb3IgY29uc2lzdGVuY3kgd2l0aCBSVDYxCisjZGVmaW5lIFJUX09JRF9HRVRfUEhZX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgMHg3NjEKKyNlbmRpZiAvLyBMTFREX1NVUFBPUlQgLy8KKworLy8gTmV3IGZvciBNZWV0aW5nSG91c2UgQXBpIHN1cHBvcnQKKyNkZWZpbmUgT0lEX01IXzgwMl8xWF9TVVBQT1JURUQgICAgICAgICAgICAgICAweEZGRURDMTAwCisKKy8vIE1JTU8gVHggcGFyYW1ldGVyLCBTaG9ydEdJLCBNQ1MsIFNUQkMsIGV0Yy4gIHRoZXNlIGFyZSBmaWVsZHMgaW4gVFhXSS4gRG9uJ3QgY2hhbmdlIHRoaXMgZGVmaW5pdGlvbiEhIQordHlwZWRlZiB1bmlvbiAgX0hUVFJBTlNNSVRfU0VUVElORyB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCXN0cnVjdAl7CisJVVNIT1JUCQlNT0RFOjI7CS8vIFVzZSBkZWZpbml0aW9uIE1PREVfeHh4LgorCVVTSE9SVAkJVHhCRjoxOworCVVTSE9SVAkJcnN2OjI7CisJVVNIT1JUCQlTVEJDOjI7CS8vU1BBQ0UKKwlVU0hPUlQJCVNob3J0R0k6MTsKKwlVU0hPUlQJCUJXOjE7CS8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6CisJVVNIT1JUICAgCU1DUzo3OyAgICAgICAgICAgICAgICAgLy8gTUNTCisJfQlmaWVsZDsKKyNlbHNlCisJc3RydWN0CXsKKwlVU0hPUlQgICAJTUNTOjc7ICAgICAgICAgICAgICAgICAvLyBNQ1MKKwlVU0hPUlQJCUJXOjE7CS8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6CisJVVNIT1JUCQlTaG9ydEdJOjE7CisJVVNIT1JUCQlTVEJDOjI7CS8vU1BBQ0UKKwlVU0hPUlQJCXJzdjoyOworCVVTSE9SVAkJVHhCRjoxOworCVVTSE9SVAkJTU9ERToyOwkvLyBVc2UgZGVmaW5pdGlvbiBNT0RFX3h4eC4KKwl9CWZpZWxkOworI2VuZGlmCisJVVNIT1JUCQl3b3JkOworIH0gSFRUUkFOU01JVF9TRVRUSU5HLCAqUEhUVFJBTlNNSVRfU0VUVElORzsKKwordHlwZWRlZiBlbnVtIF9SVF84MDJfMTFfUFJFQU1CTEUgeworICAgIFJ0ODAyXzExUHJlYW1ibGVMb25nLAorICAgIFJ0ODAyXzExUHJlYW1ibGVTaG9ydCwKKyAgICBSdDgwMl8xMVByZWFtYmxlQXV0bworfSBSVF84MDJfMTFfUFJFQU1CTEUsICpQUlRfODAyXzExX1BSRUFNQkxFOworCisvLyBPbmx5IGZvciBTVEEsIG5lZWQgdG8gc3luYyB3aXRoIEFQCisvLyAyMDA1LTAzLTA4IG1hdGNoIGN1cnJlbnQgUmFDb25maWcuCit0eXBlZGVmIGVudW0gX1JUXzgwMl8xMV9QSFlfTU9ERSB7CisJUEhZXzExQkdfTUlYRUQgPSAwLAorCVBIWV8xMUIsCisJUEhZXzExQSwKKwlQSFlfMTFBQkdfTUlYRUQsCisJUEhZXzExRywKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlQSFlfMTFBQkdOX01JWEVELAkvLyBib3RoIGJhbmQgICA1CisJUEhZXzExTl8yXzRHLAkJLy8gMTFuLW9ubHkgd2l0aCAyLjRHIGJhbmQgICAJNgorCVBIWV8xMUdOX01JWEVELAkvLyAyLjRHIGJhbmQgICAgICA3CisJUEhZXzExQU5fTUlYRUQsCS8vIDVHICBiYW5kICAgICAgIDgKKwlQSFlfMTFCR05fTUlYRUQsCS8vIGlmIGNoZWNrIDgwMi4xMWIuICAgICAgOQorCVBIWV8xMUFHTl9NSVhFRCwJLy8gaWYgY2hlY2sgODAyLjExYi4gICAgICAxMAorCVBIWV8xMU5fNUcsCQkJLy8gMTFuLW9ubHkgd2l0aCA1RyBiYW5kCQkxMQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworfSBSVF84MDJfMTFfUEhZX01PREU7CisKKy8vIHB1dCBhbGwgcHJvcHJpZXRlcnkgZm9yLXF1ZXJ5IG9iamVjdHMgaGVyZSB0byByZWR1Y2UgIyBvZiBRdWVyeV9PSUQKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfTElOS19TVEFUVVMgeworICAgIFVMT05HICAgQ3VyclR4UmF0ZTsgICAgICAgICAvLyBpbiB1bml0cyBvZiAwLjVNYnBzCisgICAgVUxPTkcgICBDaGFubmVsUXVhbGl0eTsgICAgIC8vIDAuLjEwMCAlCisgICAgVUxPTkcgICBUeEJ5dGVDb3VudDsgICAgICAgIC8vIGJvdGggb2sgYW5kIGZhaWwKKyAgICBVTE9ORyAgIFJ4Qnl0ZUNvdW50OyAgICAgICAgLy8gYm90aCBvayBhbmQgZmFpbAorICAgIFVMT05HCUNlbnRyYWxDaGFubmVsOwkJLy8gNDBNSHogY2VudHJhbCBjaGFubmVsIG51bWJlcgorfSBSVF84MDJfMTFfTElOS19TVEFUVVMsICpQUlRfODAyXzExX0xJTktfU1RBVFVTOworCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0VWRU5UX0xPRyB7CisgICAgTEFSR0VfSU5URUdFUiAgIFN5c3RlbVRpbWU7ICAvLyB0aW1lc3RhbW1wIHZpYSBOZGlzR2V0Q3VycmVudFN5c3RlbVRpbWUoKQorICAgIFVDSEFSICAgICAgICAgICBBZGRyW01BQ19BRERSX0xFTkdUSF07CisgICAgVVNIT1JUICAgICAgICAgIEV2ZW50OyAgICAgICAvLyBFVkVOVF94eHgKK30gUlRfODAyXzExX0VWRU5UX0xPRywgKlBSVF84MDJfMTFfRVZFTlRfTE9HOworCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0VWRU5UX1RBQkxFIHsKKyAgICBVTE9ORyAgICAgICBOdW07CisgICAgVUxPTkcgICAgICAgUnN2OyAgICAgLy8gdG8gYWxpZ24gTG9nW10gYXQgTEFSR0VfSU5FR0VSIGJvdW5kYXJ5CisgICAgUlRfODAyXzExX0VWRU5UX0xPRyAgIExvZ1tNQVhfTlVNQkVSX09GX0VWRU5UXTsKK30gUlRfODAyXzExX0VWRU5UX1RBQkxFLCBQUlRfODAyXzExX0VWRU5UX1RBQkxFOworCisvLyBNSU1PIFR4IHBhcmFtZXRlciwgU2hvcnRHSSwgTUNTLCBTVEJDLCBldGMuICB0aGVzZSBhcmUgZmllbGRzIGluIFRYV0kuIERvbid0IGNoYW5nZSB0aGlzIGRlZmluaXRpb24hISEKK3R5cGVkZWYgdW5pb24gIF9NQUNIVFRSQU5TTUlUX1NFVFRJTkcgeworCXN0cnVjdAl7CisJVVNIT1JUICAgCU1DUzo3OyAgICAgICAgICAgICAgICAgLy8gTUNTCisJVVNIT1JUCQlCVzoxOwkvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegorCVVTSE9SVAkJU2hvcnRHSToxOworCVVTSE9SVAkJU1RCQzoyOwkvL1NQQUNFCisJVVNIT1JUCQlyc3Y6MzsKKwlVU0hPUlQJCU1PREU6MjsJLy8gVXNlIGRlZmluaXRpb24gTU9ERV94eHguCisJfQlmaWVsZDsKKwlVU0hPUlQJCXdvcmQ7CisgfSBNQUNIVFRSQU5TTUlUX1NFVFRJTkcsICpQTUFDSFRUUkFOU01JVF9TRVRUSU5HOworCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX01BQ19FTlRSWSB7CisgICAgVUNIQVIgICAgICAgQWRkcltNQUNfQUREUl9MRU5HVEhdOworICAgIFVDSEFSICAgICAgIEFpZDsKKyAgICBVQ0hBUiAgICAgICBQc207ICAgICAvLyAwOlBXUl9BQ1RJVkUsIDE6UFdSX1NBVkUKKyAgICBVQ0hBUgkJTWltb1BzOyAgLy8gMDpNTVBTX1NUQVRJQywgMTpNTVBTX0RZTkFNSUMsIDM6TU1QU19FbmFibGVkCisgICAgQ0hBUgkJQXZnUnNzaTA7CisJQ0hBUgkJQXZnUnNzaTE7CisJQ0hBUgkJQXZnUnNzaTI7CisJVUlOVDMyCQlDb25uZWN0ZWRUaW1lOworICAgIE1BQ0hUVFJBTlNNSVRfU0VUVElORwlUeFJhdGU7Cit9IFJUXzgwMl8xMV9NQUNfRU5UUlksICpQUlRfODAyXzExX01BQ19FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9NQUNfVEFCTEUgeworICAgIFVMT05HICAgICAgIE51bTsKKyAgICBSVF84MDJfMTFfTUFDX0VOVFJZIEVudHJ5W01BWF9OVU1CRVJfT0ZfTUFDXTsKK30gUlRfODAyXzExX01BQ19UQUJMRSwgKlBSVF84MDJfMTFfTUFDX1RBQkxFOworCisvLyBzdHJ1Y3R1cmUgZm9yIHF1ZXJ5L3NldCBoYXJkd2FyZSByZWdpc3RlciAtIE1BQywgQkJQLCBSRiByZWdpc3RlcgordHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9IQVJEV0FSRV9SRUdJU1RFUiB7CisgICAgVUxPTkcgICBIYXJkd2FyZVR5cGU7ICAgICAgIC8vIDA6TUFDLCAxOkJCUCwgMjpSRiByZWdpc3RlciwgMzpFRVBST00KKyAgICBVTE9ORyAgIE9mZnNldDsgICAgICAgICAgICAgLy8gUS9TIHJlZ2lzdGVyIG9mZnNldCBhZGRyCisgICAgVUxPTkcgICBEYXRhOyAgICAgICAgICAgICAgIC8vIFIvVyBkYXRhIGJ1ZmZlcgorfSBSVF84MDJfMTFfSEFSRFdBUkVfUkVHSVNURVIsICpQUlRfODAyXzExX0hBUkRXQVJFX1JFR0lTVEVSOworCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0FQX0NPTkZJRyB7CisgICAgVUxPTkcgICBFbmFibGVUeEJ1cnN0OyAgICAgIC8vIDAtZGlzYWJsZSwgMS1lbmFibGUKKyAgICBVTE9ORyAgIEVuYWJsZVR1cmJvUmF0ZTsgICAgLy8gMC1kaXNhYmxlLCAxLWVuYWJsZSA3Mi8xMDBtYnBzIHR1cmJvIHJhdGUKKyAgICBVTE9ORyAgIElzb2xhdGVJbnRlclN0YVRyYWZmaWM7ICAgICAvLyAwLWRpc2FibGUsIDEtZW5hYmxlIGlzb2xhdGlvbgorICAgIFVMT05HICAgSGlkZVNzaWQ7ICAgICAgICAgICAvLyAwLWRpc2FibGUsIDEtZW5hYmxlIGhpZGluZworICAgIFVMT05HICAgVXNlQkdQcm90ZWN0aW9uOyAgICAvLyAwLUFVVE8sIDEtYWx3YXlzIE9OLCAyLWFsd2F5cyBPRkYKKyAgICBVTE9ORyAgIFVzZVNob3J0U2xvdFRpbWU7ICAgLy8gMC1ubyB1c2UsIDEtdXNlIDktdXMgc2hvcnQgc2xvdCB0aW1lCisgICAgVUxPTkcgICBSc3YxOyAgICAgICAgICAgICAgIC8vIG11c3QgYmUgMAorICAgIFVMT05HICAgU3lzdGVtRXJyb3JCaXRtYXA7ICAvLyBpZ25vcmUgdXBvbiBTRVQsIHJldHVybiBzeXN0ZW0gZXJyb3IgdXBvbiBRVUVSWQorfSBSVF84MDJfMTFfQVBfQ09ORklHLCAqUFJUXzgwMl8xMV9BUF9DT05GSUc7CisKKy8vIHN0cnVjdHVyZSB0byBxdWVyeS9zZXQgU1RBX0NPTkZJRwordHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9TVEFfQ09ORklHIHsKKyAgICBVTE9ORyAgIEVuYWJsZVR4QnVyc3Q7ICAgICAgLy8gMC1kaXNhYmxlLCAxLWVuYWJsZQorICAgIFVMT05HICAgRW5hYmxlVHVyYm9SYXRlOyAgICAvLyAwLWRpc2FibGUsIDEtZW5hYmxlIDcyLzEwMG1icHMgdHVyYm8gcmF0ZQorICAgIFVMT05HICAgVXNlQkdQcm90ZWN0aW9uOyAgICAvLyAwLUFVVE8sIDEtYWx3YXlzIE9OLCAyLWFsd2F5cyBPRkYKKyAgICBVTE9ORyAgIFVzZVNob3J0U2xvdFRpbWU7ICAgLy8gMC1ubyB1c2UsIDEtdXNlIDktdXMgc2hvcnQgc2xvdCB0aW1lIHdoZW4gYXBwbGljYWJsZQorICAgIFVMT05HICAgQWRob2NNb2RlOyAJCQkvLyAwLTExYiByYXRlcyBvbmx5IChXSUZJIHNwZWMpLCAxIC0gYi9nIG1peGVkLCAyIC0gZyBvbmx5CisgICAgVUxPTkcgICBId1JhZGlvU3RhdHVzOyAgICAgIC8vIDAtT0ZGLCAxLU9OLCBkZWZhdWx0IGlzIDEsIFJlYWQtT25seQorICAgIFVMT05HICAgUnN2MTsgICAgICAgICAgICAgICAvLyBtdXN0IGJlIDAKKyAgICBVTE9ORyAgIFN5c3RlbUVycm9yQml0bWFwOyAgLy8gaWdub3JlIHVwb24gU0VULCByZXR1cm4gc3lzdGVtIGVycm9yIHVwb24gUVVFUlkKK30gUlRfODAyXzExX1NUQV9DT05GSUcsICpQUlRfODAyXzExX1NUQV9DT05GSUc7CisKKy8vCisvLyAgRm9yIE9JRCBRdWVyeSBvciBTZXQgYWJvdXQgQkEgc3RydWN0dXJlCisvLwordHlwZWRlZglzdHJ1Y3QJX09JRF9CQUNBUF9TVFJVQwl7CisJCVVDSEFSCQlSeEJBV2luTGltaXQ7CisJCVVDSEFSCQlUeEJBV2luTGltaXQ7CisJCVVDSEFSCQlQb2xpY3k7CS8vIDA6IERFTEFZX0JBIDE6SU1NRURfQkEgICgvL0JBIFBvbGljeSBzdWJmaWxlZCB2YWx1ZSBpbiBBRERCQSBmcmFtZSkgICAyOkJBLW5vdCB1c2UuIG90aGVyIHZhbHVlIGludmFsaWQKKwkJVUNIQVIJCU1wZHVEZW5zaXR5OwkvLyAwOiBERUxBWV9CQSAxOklNTUVEX0JBICAoLy9CQSBQb2xpY3kgc3ViZmlsZWQgdmFsdWUgaW4gQUREQkEgZnJhbWUpICAgMjpCQS1ub3QgdXNlLiBvdGhlciB2YWx1ZSBpbnZhbGlkCisJCVVDSEFSICAgICAgIAlBbXNkdUVuYWJsZTsJLy9FbmFibGUgQU1TRFUgdHJhbnNtaXNzdGlvbgorCQlVQ0hBUiAgICAgICAJQW1zZHVTaXplOwkvLyAwOjM4MzksIDE6NzkzNSBieXRlcy4gVUlOVCAgTVNEVVNpemVUb0J5dGVzW10JPSB7IDM4MzksIDc5MzV9OworCQlVQ0hBUiAgICAgICAJTU1QU21vZGU7CS8vIE1JTU8gcG93ZXIgc2F2ZSBtb3JlLCAwOnN0YXRpYywgMTpkeW5hbWljLCAyOnJzdiwgMzptaW1vIGVuYWJsZQorCQlCT09MRUFOCQlBdXRvQkE7CS8vIEF1dG8gQkEgd2lsbCBhdXRvbWF0aWNhbGx5Cit9IE9JRF9CQUNBUF9TVFJVQywgKlBPSURfQkFDQVBfU1RSVUM7CisKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfQUNMX0VOVFJZIHsKKyAgICBVQ0hBUiAgIEFkZHJbTUFDX0FERFJfTEVOR1RIXTsKKyAgICBVU0hPUlQgIFJzdjsKK30gUlRfODAyXzExX0FDTF9FTlRSWSwgKlBSVF84MDJfMTFfQUNMX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JUXzgwMl8xMV9BQ0wgeworICAgIFVMT05HICAgUG9saWN5OyAgICAgICAgICAgICAvLyAwLWRpc2FibGUsIDEtcG9zaXRpdmUgbGlzdCwgMi1uZWdhdGl2ZSBsaXN0CisgICAgVUxPTkcgICBOdW07CisgICAgUlRfODAyXzExX0FDTF9FTlRSWSBFbnRyeVtNQVhfTlVNQkVSX09GX0FDTF07Cit9IFJUXzgwMl8xMV9BQ0wsICpQUlRfODAyXzExX0FDTDsKKwordHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9XRFMgeworICAgIFVMT05HCQkJCQkJTnVtOworICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTCQlFbnRyeVsyNC8qTUFYX05VTV9PRl9XRFNfTElOSyovXTsKKwlVTE9ORwkJCQkJCUtleUxlbmd0aDsKKwlVQ0hBUgkJCQkJCUtleU1hdGVyaWFsWzMyXTsKK30gUlRfODAyXzExX1dEUywgKlBSVF84MDJfMTFfV0RTOworCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX1RYX1JBVEVTXyB7CisgICAgVUNIQVIgICAgICAgU3VwUmF0ZUxlbjsKKyAgICBVQ0hBUiAgICAgICBTdXBSYXRlW01BWF9MRU5HVEhfT0ZfU1VQUE9SVF9SQVRFU107CisgICAgVUNIQVIgICAgICAgRXh0UmF0ZUxlbjsKKyAgICBVQ0hBUiAgICAgICBFeHRSYXRlW01BWF9MRU5HVEhfT0ZfU1VQUE9SVF9SQVRFU107Cit9IFJUXzgwMl8xMV9UWF9SQVRFUywgKlBSVF84MDJfMTFfVFhfUkFURVM7CisKKworLy8gRGVmaW5pdGlvbiBvZiBleHRyYSBpbmZvcm1hdGlvbiBjb2RlCisjZGVmaW5lCUdFTkVSQUxfTElOS19VUAkJCTB4MAkJCS8vIExpbmsgaXMgVXAKKyNkZWZpbmUJR0VORVJBTF9MSU5LX0RPV04JCTB4MQkJCS8vIExpbmsgaXMgRG93bgorI2RlZmluZQlIV19SQURJT19PRkYJCQkweDIJCQkvLyBIYXJkd2FyZSByYWRpbyBvZmYKKyNkZWZpbmUJU1dfUkFESU9fT0ZGCQkJMHgzCQkJLy8gU29mdHdhcmUgcmFkaW8gb2ZmCisjZGVmaW5lCUFVVEhfRkFJTAkJCQkweDQJCQkvLyBPcGVuIGF1dGhlbnRpY2F0aW9uIGZhaWwKKyNkZWZpbmUJQVVUSF9GQUlMX0tFWVMJCQkweDUJCQkvLyBTaGFyZWQgYXV0aGVudGljYXRpb24gZmFpbAorI2RlZmluZQlBU1NPQ19GQUlMCQkJCTB4NgkJCS8vIEFzc29jaWF0aW9uIGZhaWxlZAorI2RlZmluZQlFQVBfTUlDX0ZBSUxVUkUJCQkweDcJCQkvLyBEZWF1dGhlbmNhdGlvbiBiZWNhdXNlIE1JQyBmYWlsdXJlCisjZGVmaW5lCUVBUF80V0FZX1RJTUVPVVQJCTB4OAkJCS8vIERlYXV0aGVuY2F0aW9uIG9uIDQtd2F5IGhhbmRzaGFrZSB0aW1lb3V0CisjZGVmaW5lCUVBUF9HUk9VUF9LRVlfVElNRU9VVAkweDkJCQkvLyBEZWF1dGhlbmNhdGlvbiBvbiBncm91cCBrZXkgaGFuZHNoYWtlIHRpbWVvdXQKKyNkZWZpbmUJRUFQX1NVQ0NFU1MJCQkJMHhhCQkJLy8gRUFQIHN1Y2NlZWQKKyNkZWZpbmUJREVURUNUX1JBREFSX1NJR05BTAkJMHhiICAgICAgICAgLy8gUmFkYXIgc2lnbmFsIG9jY3VyIGluIGN1cnJlbnQgY2hhbm5lbAorI2RlZmluZSBFWFRSQV9JTkZPX01BWAkJCTB4YgkJCS8vIEluZGljYXRlIExhc3QgT0lECisKKyNkZWZpbmUgRVhUUkFfSU5GT19DTEVBUgkJMHhmZmZmZmZmZgorCisvLyBUaGlzIGlzIE9JRCBzZXR0aW5nIHN0cnVjdHVyZS4gU28gb25seSBHRiBvciBNTSBhcyBNb2RlLiBUaGlzIGlzIHZhbGlkIHdoZW4gb3VyIHdpcmVsc3MgbW9kZSBoYXMgODAyLjExbiBpbiB1c2UuCit0eXBlZGVmIHN0cnVjdCB7CisJUlRfODAyXzExX1BIWV9NT0RFCQlQaHlNb2RlOyAJLy8KKwlVQ0hBUgkJVHJhbnNtaXRObzsKKwlVQ0hBUgkJSHRNb2RlOyAJLy9IVE1PREVfR0Ygb3IgSFRNT0RFX01NCisJVUNIQVIJCUV4dE9mZnNldDsJLy9leHRlbnNpb24gY2hhbm5lbCBhYm92ZSBvciBiZWxvdworCVVDSEFSCQlNQ1M7CisJVUNIQVIgICAJQlc7CisJVUNIQVIJCVNUQkM7CisJVUNIQVIJCVNIT1JUR0k7CisJVUNIQVIJCXJzdjsKK30gT0lEX1NFVF9IVF9QSFlNT0RFLCAqUE9JRF9TRVRfSFRfUEhZTU9ERTsKKworI2lmZGVmIExMVERfU1VQUE9SVAordHlwZWRlZiBzdHJ1Y3QgX1JUX0xMVERfQVNTT0lDQVRJT05fRU5UUlkgeworICAgIFVDSEFSICAgICAgICAgICBBZGRyW0VUSF9MRU5HVEhfT0ZfQUREUkVTU107CisgICAgdW5zaWduZWQgc2hvcnQgIE1PUjsgICAgICAgIC8vIG1heGltdW0gb3BlcmF0aW9uYWwgcmF0ZQorICAgIFVDSEFSICAgICAgICAgICBwaHlNb2RlOworfSBSVF9MTFREX0FTU09JQ0FUSU9OX0VOVFJZLCAqUFJUX0xMVERfQVNTT0lDQVRJT05fRU5UUlk7CisKK3R5cGVkZWYgc3RydWN0IF9SVF9MTFREX0FTU09JQ0FUSU9OX1RBQkxFIHsKKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgTnVtOworICAgIFJUX0xMVERfQVNTT0lDQVRJT05fRU5UUlkgICBFbnRyeVtNQVhfTlVNQkVSX09GX01BQ107Cit9IFJUX0xMVERfQVNTT0lDQVRJT05fVEFCTEUsICpQUlRfTExURF9BU1NPSUNBVElPTl9UQUJMRTsKKyNlbmRpZiAvLyBMTFREX1NVUFBPUlQgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorLy9ydDI4NjAsIGthdGh5IDIwMDctMDExOAorLy8gc3RydWN0dXJlIGZvciBETFMKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfRExTX1VJIHsKKwlVU0hPUlQJCQkJCQlUaW1lT3V0OwkJLy8gdW5pdDogc2Vjb25kICwgc2V0IGJ5IFVJCisJVVNIT1JUCQkJCQkJQ291bnREb3duVGltZXI7CS8vIHVuaXQ6IHNlY29uZCAsIHVzZWQgYnkgZHJpdmVyIG9ubHkKKwlORElTXzgwMl8xMV9NQUNfQUREUkVTUwkJTWFjQWRkcjsJCS8vIHNldCBieSBVSQorCVVDSEFSCQkJCQkJU3RhdHVzOwkJCS8vIDA6IG5vbmUgLCAxOiB3YWl0IFNUQWtleSwgMjogZmluaXNoIERMUyBzZXR1cCAsIHNldCBieSBkcml2ZXIgb25seQorCUJPT0xFQU4JCQkJCQlWYWxpZDsJCQkvLyAxOiB2YWxpZCAsIDA6IGludmFsaWQgLCBzZXQgYnkgVUksIHVzZSB0byBzZXR1cCBvciB0ZWFyIGRvd24gRExTIGxpbmsKK30gUlRfODAyXzExX0RMU19VSSwgKlBSVF84MDJfMTFfRExTX1VJOworCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0RMU19JTkZPIHsKKwlSVF84MDJfMTFfRExTX1VJCUVudHJ5W01BWF9OVU1CRVJfT0ZfRExTX0VOVFJZXTsKKwlVQ0hBUgkJCQludW07Cit9IFJUXzgwMl8xMV9ETFNfSU5GTywgKlBSVF84MDJfMTFfRExTX0lORk87CisKK3R5cGVkZWYgZW51bSBfUlRfODAyXzExX0RMU19NT0RFIHsKKyAgICBETFNfTk9ORSwKKyAgICBETFNfV0FJVF9LRVksCisgICAgRExTX0ZJTklTSAorfSBSVF84MDJfMTFfRExTX01PREU7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjZGVmaW5lCVJUX0FTU09DX0VWRU5UX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAxCisjZGVmaW5lCVJUX0RJU0FTU09DX0VWRU5UX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgMHgwMTAyCisjZGVmaW5lCVJUX1JFUUlFX0VWRU5UX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAzCisjZGVmaW5lCVJUX1JFU1BJRV9FVkVOVF9GTEFHICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTA0CisjZGVmaW5lCVJUX0FTU09DSU5GT19FVkVOVF9GTEFHICAgICAgICAgICAgICAgICAgICAgMHgwMTA1CisjZGVmaW5lIFJUX1BNS0lEQ0FORF9GTEFHICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTA2CisjZGVmaW5lIFJUX0lOVEVSRkFDRV9ET1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTA3CisjZGVmaW5lIFJUX0lOVEVSRkFDRV9VUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTA4CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNkZWZpbmUgTUFYX0NVU1RPTV9MRU4gMTI4CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK3R5cGVkZWYgZW51bSBfUlRfODAyXzExX0RfQ0xJRU5UX01PREUKK3sKKyAgIFJ0ODAyXzExX0RfTm9uZSwKKyAgIFJ0ODAyXzExX0RfRmxleGlibGUsCisgICBSdDgwMl8xMV9EX1N0cmljdCwKK30gUlRfODAyXzExX0RfQ0xJRU5UX01PREUsICpQUlRfODAyXzExX0RfQ0xJRU5UX01PREU7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK3R5cGVkZWYgc3RydWN0IF9SVF9DSEFOTkVMX0xJU1RfSU5GTworeworCVVDSEFSIENoYW5uZWxMaXN0W01BWF9OVU1fT0ZfQ0hTXTsgICAvLyBsaXN0IGFsbCBzdXBwb3J0ZWQgY2hhbm5lbHMgZm9yIHNpdGUgc3VydmV5CisJVUNIQVIgQ2hhbm5lbExpc3ROdW07IC8vIG51bWJlciBvZiBjaGFubmVsIGluIENoYW5uZWxMaXN0W10KK30gUlRfQ0hBTk5FTF9MSVNUX0lORk8sICpQUlRfQ0hBTk5FTF9MSVNUX0lORk87CisKKworI2VuZGlmIC8vIF9PSURfSF8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydDI4NjAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnQyODYwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE3MjAxOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnQyODYwLmgKQEAgLTAsMCArMSwzNDkgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpZm5kZWYgX19SVDI4NjBfSF9fCisjZGVmaW5lIF9fUlQyODYwX0hfXworCisjZGVmaW5lIFJUMjh4eF9DSElQX05BTUUJIlJUMjg2MCIKKworI2RlZmluZSBUWElORk9fU0laRSAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVFhQQURESU5HX1NJWkUgICAgICAJICAwCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIEVFUFJPTSBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIFJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgb2Zmc2V0LCB2YXIpCQlcCisJdmFyID0gUlRNUF9FRVBST01fUkVBRDE2KHBBZCwgb2Zmc2V0KQorCisjZGVmaW5lIFJUMjh4eF9FRVBST01fV1JJVEUxNihwQWQsIG9mZnNldCwgdmFyKQkJXAorCVJUTVBfRUVQUk9NX1dSSVRFMTYocEFkLCBvZmZzZXQsIHZhcikKKworLyogLS0tLS0tLS0tLS0tLS0tLS0gVEFTSy9USFJFQUQgUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBSVDI4WFhfVEFTS19USFJFQURfSU5JVChwQWQsIFN0YXR1cykJCVwKKwlpbml0X3RocmVhZF90YXNrKHBBZCk7IE5JQ0luaXRUeFJ4UmluZ0FuZEJhY2tsb2dRdWV1ZShwQWQpOwlcCisJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKworLyogZnVuY3Rpb24gZGVjbGFyYXRpb25zICovCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorI2RlZmluZSBJUlFfSEFORExFX1RZUEUgIGlycXJldHVybl90CisjZWxzZQorI2RlZmluZSBJUlFfSEFORExFX1RZUEUgIHZvaWQKKyNlbmRpZgorCitJUlFfSEFORExFX1RZUEUKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwxOSkpCitydDI4NjBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSk7CisjZWxzZQorcnQyODYwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLSBGcmltd2FyZSBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIFJUMjhYWF9XUklURV9GSVJNV0FSRShfcEFkLCBfcEZ3SW1hZ2UsIF9Gd0xlbikJCQkJXAorCWRvewkJCQkJCQkJCQkJCQkJCQlcCisJCVVMT05HCV9pLCBfZmlybTsJCQkJCQkJCQkJCVwKKwkJUlRNUF9JT19XUklURTMyKF9wQWQsIFBCRl9TWVNfQ1RSTCwgMHgxMDAwMCk7CQkJCVwKKwkJCQkJCQkJCQkJCQkJCQkJXAorCQlmb3IoX2k9MDsgX2k8X0Z3TGVuOyBfaSs9NCkJCQkJCQkJCQlcCisJCXsJCQkJCQkJCQkJCQkJCQlcCisJCQlfZmlybSA9IF9wRndJbWFnZVtfaV0gKwkJCQkJCQkJCVwKKwkJCSAgIChfcEZ3SW1hZ2VbX2krM10gPDwgMjQpICsJCQkJCQkJXAorCQkJICAgKF9wRndJbWFnZVtfaSsyXSA8PCAxNikgKwkJCQkJCQlcCisJCQkgICAoX3BGd0ltYWdlW19pKzFdIDw8IDgpOwkJCQkJCQkJXAorCQkJUlRNUF9JT19XUklURTMyKF9wQWQsIEZJUk1XQVJFX0lNQUdFX0JBU0UgKyBfaSwgX2Zpcm0pOwlcCisJCX0JCQkJCQkJCQkJCQkJCQlcCisJCVJUTVBfSU9fV1JJVEUzMihfcEFkLCBQQkZfU1lTX0NUUkwsIDB4MDAwMDApOwkJCQlcCisJCVJUTVBfSU9fV1JJVEUzMihfcEFkLCBQQkZfU1lTX0NUUkwsIDB4MDAwMDEpOwkJCQlcCisJCQkJCQkJCQkJCQkJCQkJCVwKKwkJLyogaW5pdGlhbGl6ZSBCQlAgUi9XIGFjY2VzcyBhZ2VudCAqLwkJCQkJCVwKKwkJUlRNUF9JT19XUklURTMyKF9wQWQsIEgyTV9CQlBfQUdFTlQsIDApOwkJCQkJXAorCQlSVE1QX0lPX1dSSVRFMzIoX3BBZCwgSDJNX01BSUxCT1hfQ1NSLCAwKTsJCQkJCVwKKwl9d2hpbGUoMCkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0gVFggUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBSVDI4WFhfU1RBUlRfREVRVUVVRShwQWQsIFF1ZUlkeCwgaXJxRmxhZ3MpCQlkb3t9d2hpbGUoMCkKKyNkZWZpbmUgUlQyOFhYX1NUT1BfREVRVUVVRShwQWQsIFF1ZUlkeCwgaXJxRmxhZ3MpCQlkb3t9d2hpbGUoMCkKKworCisjZGVmaW5lIFJUMjhYWF9IQVNfRU5PVUdIX0ZSRUVfREVTQyhwQWQsIHBUeEJsaywgZnJlZU51bSwgcFBhY2tldCkgXAorCQkoKGZyZWVOdW0pID49IChVTE9ORykocFR4QmxrLT5Ub3RhbEZyYWdOdW0gKyBSVE1QX0dFVF9QQUNLRVRfRlJBR01FTlRTKHBQYWNrZXQpICsgMykpIC8qIHJvdWdoIGVzdGltYXRlIHdlIHdpbGwgdXNlIDMgbW9yZSBkZXNjcmlwdG9yLiAqLworI2RlZmluZSBSVDI4WFhfUkVMRUFTRV9ERVNDX1JFU09VUkNFKHBBZCwgUXVlSWR4KQkJCQkJXAorCQlkb3t9d2hpbGUoMCkKKworI2RlZmluZSBORUVEX1FVRVVFX0JBQ0tfRk9SX0FHRyhwQWQsIFF1ZUlkeCwgZnJlZU51bSwgX1R4RnJhbWVUeXBlKSBcCisJCSgoKGZyZWVOdW0gIT0gKFRYX1JJTkdfU0laRS0xKSkgJiYgKHBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0uTnVtYmVyID09IDApKSB8fCAoZnJlZU51bTwzKSkKKwkJLy8oKChmcmVlTnVtKSAhPSAoVFhfUklOR19TSVpFLTEpKSAmJiAocEFkLT5UeFN3UXVldWVbUXVlSWR4XS5OdW1iZXIgPT0gMSAvKjAqLykpCisKKworI2RlZmluZSBIQUxfS2lja091dE1nbXRUeChfcEFkLCBfUXVlSWR4LCBfcFBhY2tldCwgX3BTcmNCdWZWQSwgX1NyY0J1ZkxlbikJXAorCQkJUnRtcFBDSU1nbXRLaWNrT3V0KF9wQWQsIF9RdWVJZHgsIF9wUGFja2V0LCBfcFNyY0J1ZlZBLCBfU3JjQnVmTGVuKQorCisjZGVmaW5lIFJUTVBfUEtUX1RBSUxfUEFERElORyAwCisKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9ORUVEX1NUT1BfVFgJMAorCisjZGVmaW5lIEhBTF9Xcml0ZVN1YlR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGJJc0xhc3QsIHBGcmVlTnVtYmVyKQlcCisJCS8qIFJ0bXBQQ0lfV3JpdGVTdWJUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBiSXNMYXN0LCBwRnJlZU51bWJlcikqLworCisjZGVmaW5lIEhBTF9Xcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssYklzTGFzdCwgcEZyZWVOdW1iZXIpCVwKKwkJCVJ0bXBQQ0lfV3JpdGVTaW5nbGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBiSXNMYXN0LCBwRnJlZU51bWJlcikKKworI2RlZmluZSBIQUxfV3JpdGVGcmFnVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhZ051bSwgcEZyZWVOdW1iZXIpIFwKKwkJCVJ0bXBQQ0lfV3JpdGVGcmFnVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhZ051bSwgcEZyZWVOdW1iZXIpCisKKyNkZWZpbmUgSEFMX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLGZyYW1lTnVtLCBwRnJlZU51bWJlcikJXAorCQkJUnRtcFBDSV9Xcml0ZU11bHRpVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhbWVOdW0sIHBGcmVlTnVtYmVyKQorCisjZGVmaW5lIEhBTF9GaW5hbFdyaXRlVHhSZXNvdXJjZShfcEFkLCBfcFR4QmxrLCBfVG90YWxNUERVU2l6ZSwgX0ZpcnN0VHhJZHgpCVwKKwkJCVJ0bXBQQ0lfRmluYWxXcml0ZVR4UmVzb3VyY2UoX3BBZCwgX3BUeEJsaywgX1RvdGFsTVBEVVNpemUsIF9GaXJzdFR4SWR4KQorCisjZGVmaW5lIEhBTF9MYXN0VHhJZHgoX3BBZCwgX1F1ZUlkeCxfTGFzdFR4SWR4KSBcCisJCQkvKlJ0bXBQQ0lEYXRhTGFzdFR4SWR4KF9wQWQsIF9RdWVJZHgsX0xhc3RUeElkeCkqLworCisjZGVmaW5lIEhBTF9LaWNrT3V0VHgoX3BBZCwgX3BUeEJsaywgX1F1ZUlkeCkJXAorCQkJUlRNUF9JT19XUklURTMyKChfcEFkKSwgVFhfQ1RYX0lEWDArKChfUXVlSWR4KSoweDEwKSwgKF9wQWQpLT5UeFJpbmdbKF9RdWVJZHgpXS5UeENwdUlkeCkKKy8qCQkJUnRtcFBDSURhdGFLaWNrT3V0KF9wQWQsIF9wVHhCbGssIF9RdWVJZHgpKi8KKworI2RlZmluZSBIQUxfS2lja091dE51bGxGcmFtZVR4KF9wQWQsIF9RdWVJZHgsIF9wTnVsbEZyYW1lLCBfZnJhbWVMZW4pCVwKKwkJCU1pbmlwb3J0TU1SZXF1ZXN0KF9wQWQsIF9RdWVJZHgsIF9wTnVsbEZyYW1lLCBfZnJhbWVMZW4pCisKKyNkZWZpbmUgR0VUX1RYUklOR19GUkVFTk8oX3BBZCwgX1F1ZUlkeCkgXAorCShfcEFkLT5UeFJpbmdbX1F1ZUlkeF0uVHhTd0ZyZWVJZHggPiBfcEFkLT5UeFJpbmdbX1F1ZUlkeF0uVHhDcHVJZHgpCT8gXAorCQkJKF9wQWQtPlR4UmluZ1tfUXVlSWR4XS5UeFN3RnJlZUlkeCAtIF9wQWQtPlR4UmluZ1tfUXVlSWR4XS5UeENwdUlkeCAtIDEpIFwKKwkJCSA6CVwKKwkJCShfcEFkLT5UeFJpbmdbX1F1ZUlkeF0uVHhTd0ZyZWVJZHggKyBUWF9SSU5HX1NJWkUgLSBfcEFkLT5UeFJpbmdbX1F1ZUlkeF0uVHhDcHVJZHggLSAxKTsKKworCisjZGVmaW5lIEdFVF9NR01UUklOR19GUkVFTk8oX3BBZCkgXAorCShfcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA+IF9wQWQtPk1nbXRSaW5nLlR4Q3B1SWR4KQk/IFwKKwkJCShfcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCAtIF9wQWQtPk1nbXRSaW5nLlR4Q3B1SWR4IC0gMSkgXAorCQkJIDoJXAorCQkJKF9wQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ICsgTUdNVF9SSU5HX1NJWkUgLSBfcEFkLT5NZ210UmluZy5UeENwdUlkeCAtIDEpOworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIFJYIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLy8gbm8gdXNlCisjZGVmaW5lIFJUMjhYWF9SQ1ZfUEtUX0dFVF9JTklUKHBBZCkKKyNkZWZpbmUgUlQyOFhYX1JWX0FfQlVGX0VORAorLy8jZGVmaW5lIFJUMjhYWF9SVl9BTExfQlVGX0VORAorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIEFTSUMgUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLworLy8gbm8gdXNlCisjZGVmaW5lIFJUMjhYWF9ETUFfUE9TVF9XUklURShwQWQpCisKKy8vIHJlc2V0IE1BQyBvZiBhIHN0YXRpb24gZW50cnkgdG8gMHgwMDAwMDAwMDAwMDAKKyNkZWZpbmUgUlQyOFhYX1NUQV9FTlRSWV9NQUNfUkVTRVQocEFkLCBXY2lkKQkJCQkJCVwKKwlBc2ljRGVsV2NpZFRhYihwQWQsIFdjaWQpOworCisvLyBhZGQgdGhpcyBlbnRyeSBpbnRvIEFTSUMgUlggV0NJRCBzZWFyY2ggdGFibGUKKyNkZWZpbmUgUlQyOFhYX1NUQV9FTlRSWV9BREQocEFkLCBwRW50cnkpCQkJCQkJCVwKKwlBc2ljVXBkYXRlUnhXQ0lEVGFibGUocEFkLCBwRW50cnktPkFpZCwgcEVudHJ5LT5BZGRyKTsKKworLy8gcmVtb3ZlIFBhaXItd2lzZSBrZXkgbWF0ZXJpYWwgZnJvbSBBU0lDCisjZGVmaW5lIFJUMjhYWF9TVEFfRU5UUllfS0VZX0RFTChwQWQsIEJzc0lkeCwgV2NpZCkJCQkJCVwKKwlBc2ljUmVtb3ZlUGFpcndpc2VLZXlFbnRyeShwQWQsIEJzc0lkeCwgKFVDSEFSKVdjaWQpOworCisvLyBhZGQgQ2xpZW50IHNlY3VyaXR5IGluZm9ybWF0aW9uIGludG8gQVNJQyBXQ0lEIHRhYmxlIGFuZCBJVkVJViB0YWJsZQorI2RlZmluZSBSVDI4WFhfU1RBX1NFQ1VSSVRZX0lORk9fQUREKHBBZCwgYXBpZHgsIEtleUlELCBwRW50cnkpCQlcCisJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIGFwaWR4LCBLZXlJRCwgCQkJCQlcCisJCQkJCQkJcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlEXS5DaXBoZXJBbGcsIHBFbnRyeSk7CisKKyNkZWZpbmUgUlQyOFhYX1NFQ1VSSVRZX0tFWV9BREQocEFkLCBhcGlkeCwgS2V5SUQsIHBFbnRyeSkJCQkJXAorCXsJLyogdXBkYXRlIHBhaXJ3aXNlIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUgKi8JXAorCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLCBhcGlkeCwgS2V5SUQsCQkJCQkJXAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SURdLkNpcGhlckFsZywJCVwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlEXS5LZXksCQkJCVwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlEXS5UeE1pYywJCQlcCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJRF0uUnhNaWMpOwkJCVwKKwkJLyogdXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlICovCQkJXAorCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgYXBpZHgsIEtleUlELAkJCQkJXAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SURdLkNpcGhlckFsZywJCVwKKwkJCQkJCSAgcEVudHJ5KTsgfQorCisKKy8vIEluc2VydCB0aGUgQkEgYml0bWFwIHRvIEFTSUMgZm9yIHRoZSBXY2lkIGVudHJ5CisjZGVmaW5lIFJUMjhYWF9BRERfQkFfU0VTU0lPTl9UT19BU0lDKF9wQWQsIF9BaWQsIF9USUQpCQkJCQlcCisJCWRvewkJCQkJCQkJCQkJCQkJCQlcCisJCQlVSU5UMzIJX1ZhbHVlID0gMCwgX09mZnNldDsJCQkJCQkJCQlcCisJCQlfT2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArIChfQWlkKSAqIEhXX1dDSURfRU5UUllfU0laRSArIDQ7CVwKKwkJCVJUTVBfSU9fUkVBRDMyKChfcEFkKSwgX09mZnNldCwgJl9WYWx1ZSk7CQkJCQlcCisJCQlfVmFsdWUgfD0gKDB4MTAwMDA8PChfVElEKSk7CQkJCQkJCQlcCisJCQlSVE1QX0lPX1dSSVRFMzIoKF9wQWQpLCBfT2Zmc2V0LCBfVmFsdWUpOwkJCQkJXAorCQl9d2hpbGUoMCkKKworCisvLyBSZW1vdmUgdGhlIEJBIGJpdG1hcCBmcm9tIEFTSUMgZm9yIHRoZSBXY2lkIGVudHJ5CisvLwkJYml0bWFwIGZpZWxkIHN0YXJ0cyBhdCAweDEwMDAwIGluIEFTSUMgV0NJRCB0YWJsZQorI2RlZmluZSBSVDI4WFhfREVMX0JBX1NFU1NJT05fRlJPTV9BU0lDKF9wQWQsIF9XY2lkLCBfVElEKQkJCQlcCisJCWRvewkJCQkJCQkJCQkJCQkJCQlcCisJCQlVSU5UMzIJX1ZhbHVlID0gMCwgX09mZnNldDsJCQkJCQkJCQlcCisJCQlfT2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArIChfV2NpZCkgKiBIV19XQ0lEX0VOVFJZX1NJWkUgKyA0OwlcCisJCQlSVE1QX0lPX1JFQUQzMigoX3BBZCksIF9PZmZzZXQsICZfVmFsdWUpOwkJCQkJXAorCQkJX1ZhbHVlICY9ICh+KDB4MTAwMDAgPDwgKF9USUQpKSk7CQkJCQkJCVwKKwkJCVJUTVBfSU9fV1JJVEUzMigoX3BBZCksIF9PZmZzZXQsIF9WYWx1ZSk7CQkJXAorCQl9d2hpbGUoMCkKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLSBQQ0kvVVNCIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBSVDI4WFhfSEFORExFX0RFVl9BU1NJR04oaGFuZGxlLCBkZXZfcCkJCQkJXAorCSgoUE9TX0NPT0tJRSloYW5kbGUpLT5wY2lfZGV2ID0gZGV2X3A7CisKKy8vIHNldCBkcml2ZXIgZGF0YQorI2RlZmluZSBSVDI4WFhfRFJWREFUQV9TRVQoX2EpCQkJcGNpX3NldF9kcnZkYXRhKF9hLCBuZXRfZGV2KTsKKworI2RlZmluZSBSVDI4WFhfVU5NQVAoKQkJCQkJCQkJCQlcCit7CWlmIChuZXRfZGV2LT5iYXNlX2FkZHIpCXsJCQkJCQkJCVwKKwkJaW91bm1hcCgodm9pZCAqKShuZXRfZGV2LT5iYXNlX2FkZHIpKTsJCQkJXAorCQlyZWxlYXNlX21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KGRldl9wLCAwKSwJXAorCQkJCQkJCXBjaV9yZXNvdXJjZV9sZW4oZGV2X3AsIDApKTsgfQlcCisJaWYgKG5ldF9kZXYtPmlycSkgcGNpX3JlbGVhc2VfcmVnaW9ucyhkZXZfcCk7IH0KKworI2lmZGVmIFBDSV9NU0lfU1VQUE9SVAorI2RlZmluZSBSVE1QX01TSV9FTkFCTEUoX3BBZCkgXAoreyAJUE9TX0NPT0tJRSBfcE9iaiA9IChQT1NfQ09PS0lFKShfcEFkLT5PU19Db29raWUpOyBcCisJKF9wQWQpLT5IYXZlTXNpID0JcGNpX2VuYWJsZV9tc2koX3BPYmotPnBjaV9kZXYpID09IDAgPyBUUlVFIDogRkFMU0U7IH0KKworI2RlZmluZSBSVE1QX01TSV9ESVNBQkxFKF9wQWQpIFwKK3sgCVBPU19DT09LSUUgX3BPYmogPSAoUE9TX0NPT0tJRSkoX3BBZC0+T1NfQ29va2llKTsgXAorCWlmIChfcEFkLT5IYXZlTXNpID09IFRSVUUpIFwKKwkJcGNpX2Rpc2FibGVfbXNpKF9wT2JqLT5wY2lfZGV2KTsgXAorCV9wQWQtPkhhdmVNc2kgPSBGQUxTRTsJfQorI2Vsc2UKKyNkZWZpbmUgUlRNUF9NU0lfRU5BQkxFKF9wQWQpCisjZGVmaW5lIFJUTVBfTVNJX0RJU0FCTEUoX3BBZCkKKyNlbmRpZiAvLyBQQ0lfTVNJX1NVUFBPUlQgLy8KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjQpCisjZGVmaW5lIFNBX1NISVJRIElSUUZfU0hBUkVECisjZW5kaWYKKworI2RlZmluZSBSVDI4WFhfSVJRX1JFUVVFU1QobmV0X2RldikJCQkJCQkJXAorewlQUlRNUF9BREFQVEVSIF9wQWQgPSAoUFJUTVBfQURBUFRFUikoKG5ldF9kZXYpLT5tbF9wcml2KTsJXAorCVBPU19DT09LSUUgX3BPYmogPSAoUE9TX0NPT0tJRSkoX3BBZC0+T1NfQ29va2llKTsJCVwKKwlSVE1QX01TSV9FTkFCTEUoX3BBZCk7CQkJCQkJCQkJXAorCWlmICgocmV0dmFsID0gcmVxdWVzdF9pcnEoX3BPYmotPnBjaV9kZXYtPmlycSwgCQlcCisJCQkJCQkJcnQyODYwX2ludGVycnVwdCwgU0FfU0hJUlEsCQlcCisJCQkJCQkJKG5ldF9kZXYpLT5uYW1lLCAobmV0X2RldikpKSkgewlcCisJCXByaW50aygiUlQyODYwOiByZXF1ZXN0X2lycSAgRVJST1IoJWQpXG4iLCByZXR2YWwpOwlcCisJcmV0dXJuIHJldHZhbDsgfSB9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisjZGVmaW5lIFJUMjhYWF9JUlFfUkVMRUFTRShuZXRfZGV2KQkJCQkJCQkJXAorewlQUlRNUF9BREFQVEVSIF9wQWQgPSAoUFJUTVBfQURBUFRFUikoKG5ldF9kZXYpLT5tbF9wcml2KTsJCVwKKwlQT1NfQ09PS0lFIF9wT2JqID0gKFBPU19DT09LSUUpKF9wQWQtPk9TX0Nvb2tpZSk7CQkJXAorCXN5bmNocm9uaXplX2lycShfcE9iai0+cGNpX2Rldi0+aXJxKTsJCQkJCQlcCisJZnJlZV9pcnEoX3BPYmotPnBjaV9kZXYtPmlycSwgKG5ldF9kZXYpKTsJCQkJCVwKKwlSVE1QX01TSV9ESVNBQkxFKF9wQWQpOyB9CisjZWxzZQorI2RlZmluZSBSVDI4WFhfSVJRX1JFTEVBU0UobmV0X2RldikJCQkJCQkJCVwKK3sJUFJUTVBfQURBUFRFUiBfcEFkID0gKFBSVE1QX0FEQVBURVIpKChuZXRfZGV2KS0+cHJpdik7CQlcCisJUE9TX0NPT0tJRSBfcE9iaiA9IChQT1NfQ09PS0lFKShfcEFkLT5PU19Db29raWUpOwkJCVwKKwlmcmVlX2lycShfcE9iai0+cGNpX2Rldi0+aXJxLCAobmV0X2RldikpOwkJCQkJXAorCVJUTVBfTVNJX0RJU0FCTEUoX3BBZCk7IH0KKyNlbmRpZgorCisjZGVmaW5lIFJUMjhYWF9JUlFfSU5JVChwQWQpCQkJCQkJCQkJCVwKKwl7CXBBZC0+aW50X2VuYWJsZV9yZWcgPSAoKERFTEFZSU5UTUFTSykgfAkJCQkJCVwKKwkJCQkJCQkoUnhJTlR8VHhEYXRhSW50fFR4TWdtdEludCkpICYgfigweDAzKTsJXAorCQlwQWQtPmludF9kaXNhYmxlX21hc2sgPSAwOwkJCQkJCQkJCVwKKwkJcEFkLT5pbnRfcGVuZGluZyA9IDA7IH0KKworI2RlZmluZSBSVDI4WFhfSVJRX0VOQUJMRShwQWQpCQkJCQkJCQkJXAorCXsJLyogY2xlYXIgZ2FyYmFnZSBpbnRzICovCQkJCQkJCQlcCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9TT1VSQ0VfQ1NSLCAweGZmZmZmZmZmKTsJCVwKKwkJTklDRW5hYmxlSW50ZXJydXB0KHBBZCk7IH0KKworI2RlZmluZSBSVDI4WFhfUFVUX0RFVklDRShkZXZfcCkKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLSBNTE1FIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgUlQyOFhYX01MTUVfSEFORExFUihwQWQpCQkJTWxtZUhhbmRsZXIocEFkKQorCisjZGVmaW5lIFJUMjhYWF9NTE1FX1BSRV9TQU5JVFlfQ0hFQ0socEFkKQorCisjZGVmaW5lIFJUMjhYWF9NTE1FX1NUQV9RVUlDS19SU1BfV0FLRV9VUChwQWQpCVwKKwlSVE1QU2V0VGltZXIoJnBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyLCAxMDApOworCisjZGVmaW5lIFJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkKQlcCisJCU1sbWVSZXN0YXJ0U3RhdGVNYWNoaW5lKHBBZCkKKworI2RlZmluZSBSVDI4WFhfSEFORExFX0NPVU5URVJfTUVBU1VSRShfcEFkLCBfcEVudHJ5KQkJXAorCQlIYW5kbGVDb3VudGVyTWVhc3VyZShfcEFkLCBfcEVudHJ5KQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLSBQb3dlciBTYXZlIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgUlQyOFhYX1BTX1BPTExfRU5RVUVVRShwQWQpCQkJCUVucXVldWVQc1BvbGwocEFkKQorCisvLworLy8gRGV2aWNlIElEICYgVmVuZG9yIElELCB0aGVzZSB2YWx1ZXMgc2hvdWxkIG1hdGNoIEVFUFJPTSB2YWx1ZQorLy8KKyNkZWZpbmUgTklDMjg2MF9QQ0lfREVWSUNFX0lEICAgMHgwNjAxCisjZGVmaW5lIE5JQzI4NjBfUENJZV9ERVZJQ0VfSUQgIDB4MDY4MQorI2RlZmluZSBOSUMyNzYwX1BDSV9ERVZJQ0VfSUQgICAweDA3MDEJCS8vIDFULzJSIENhcmRidXMgPz8/CisjZGVmaW5lIE5JQzI3OTBfUENJZV9ERVZJQ0VfSUQgIDB4MDc4MQkgICAgLy8gMVQvMlIgbWluaUNhcmQKKworI2RlZmluZSBOSUNfUENJX1ZFTkRPUl9JRCAgICAgICAweDE4MTQKKworI2RlZmluZSBWRU5fQVdUX1BDSWVfREVWSUNFX0lECTB4MTA1OQorI2RlZmluZSBWRU5fQVdUX1BDSV9WRU5ET1JfSUQJMHgxQTNCCisKKy8vIEZvciBSVE1QUENJZVBvd2VyTGlua0N0cmxSZXN0b3JlICgpIGZ1bmN0aW9uCisjZGVmaW5lIFJFU1RPUkVfSEFMVAkJICAgIDEKKyNkZWZpbmUgUkVTVE9SRV9XQUtFVVAJCSAgICAyCisjZGVmaW5lIFJFU1RPUkVfQ0xPU0UgICAgICAgICAgIDMKKworI2RlZmluZSBQb3dlclNhZmVDSUQJCTEKKyNkZWZpbmUgUG93ZXJSYWRpb09mZkNJRAkJMgorI2RlZmluZSBQb3dlcldha2VDSUQJCTMKKyNkZWZpbmUgQ0lEME1BU0sJCTB4MDAwMDAwZmYKKyNkZWZpbmUgQ0lEMU1BU0sJCTB4MDAwMGZmMDAKKyNkZWZpbmUgQ0lEMk1BU0sJCTB4MDBmZjAwMDAKKyNkZWZpbmUgQ0lEM01BU0sJCTB4ZmYwMDAwMDAKKworI2RlZmluZSBQQ0lfUkVHX1JFQURfV09SRChwY2lfZGV2LCBvZmZzZXQsIENvbmZpZ3VyYXRpb24pICAgXAorICAgIGlmIChwY2lfcmVhZF9jb25maWdfd29yZChwY2lfZGV2LCBvZmZzZXQsICZyZWcxNikgPT0gMCkgICAgIFwKKyAgICAgICAgQ29uZmlndXJhdGlvbiA9IGxlMmNwdTE2KHJlZzE2KTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBDb25maWd1cmF0aW9uID0gMDsKKworI2RlZmluZSBQQ0lfUkVHX1dJUlRFX1dPUkQocGNpX2Rldiwgb2Zmc2V0LCBDb25maWd1cmF0aW9uKSAgXAorICAgIHJlZzE2ID0gY3B1MmxlMTYoQ29uZmlndXJhdGlvbik7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHBjaV93cml0ZV9jb25maWdfd29yZChwY2lfZGV2LCBvZmZzZXQsIHJlZzE2KTsgICAgICAgICAgXAorCisjZGVmaW5lIFJUMjhYWF9TVEFfRk9SQ0VfV0FLRVVQKHBBZCwgYkZyb21UeCkgXAorICAgIFJUMjh4eFBjaVN0YUFzaWNGb3JjZVdha2V1cChwQWQsIGJGcm9tVHgpOworCisjZGVmaW5lIFJUMjhYWF9TVEFfU0xFRVBfVEhFTl9BVVRPX1dBS0VVUChwQWQsIFRidHROdW1Ub05leHRXYWtlVXApIFwKKyAgICBSVDI4eHhQY2lTdGFBc2ljU2xlZXBUaGVuQXV0b1dha2V1cChwQWQsIFRidHROdW1Ub05leHRXYWtlVXApOworCisjZGVmaW5lIFJUMjhYWF9NTE1FX1JBRElPX09OKHBBZCkgXAorICAgIFJUMjh4eFBjaU1sbWVSYWRpb09uKHBBZCk7CisKKyNkZWZpbmUgUlQyOFhYX01MTUVfUkFESU9fT0ZGKHBBZCkgXAorICAgIFJUMjh4eFBjaU1sbWVSYWRpb09GRihwQWQpOworCisjZW5kaWYgLy9fX1JUMjg2MF9IX18KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydDI4eHguaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnQyOHh4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYyMzA0MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnQyOHh4LmgKQEAgLTAsMCArMSwyNzE0IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXJ0Mjh4eC5oCisKKwlBYnN0cmFjdDoKKwlSVDI4eHggQVNJQyByZWxhdGVkIGRlZmluaXRpb24gJiBzdHJ1Y3R1cmVzCisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCSAgV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgSmFuIExlZSAgICAgICAgICAgSmFuLTMtMjAwNiAgICAgY3JlYXRlZCBmb3IgUlQyODYwYworKi8KKworI2lmbmRlZglfX1JUMjhYWF9IX18KKyNkZWZpbmUJX19SVDI4WFhfSF9fCisKKworLy8KKy8vIFBDSSByZWdpc3RlcnMgLSBiYXNlIGFkZHJlc3MgMHgwMDAwCisvLworI2RlZmluZSBQQ0lfQ0ZHCQkJMHgwMDAwCisjZGVmaW5lIFBDSV9FRUNUUkwJCQkweDAwMDQKKyNkZWZpbmUgUENJX01DVUNUUkwJCQkweDAwMDgKKworLy8KKy8vIFNDSC9ETUEgcmVnaXN0ZXJzIC0gYmFzZSBhZGRyZXNzIDB4MDIwMAorLy8KKy8vIElOVF9TT1VSQ0VfQ1NSOiBJbnRlcnJ1cHQgc291cmNlIHJlZ2lzdGVyLiBXcml0ZSBvbmUgdG8gY2xlYXIgY29ycmVzcG9uZGluZyBiaXQKKy8vCisjZGVmaW5lIERNQV9DU1IwICAgICAgMHgyMDAKKyNkZWZpbmUgSU5UX1NPVVJDRV9DU1IgICAgICAweDIwMAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0lOVF9TT1VSQ0VfQ1NSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIgICAgICAgCToxNDsKKwkJVUlOVDMyICAgICAgIAlUeENvaGVyZW50OjE7CisJCVVJTlQzMiAgICAgICAJUnhDb2hlcmVudDoxOworCQlVSU5UMzIgICAgICAgCUdQVGltZXI6MTsKKwkJVUlOVDMyICAgICAgIAlBdXRvV2FrZXVwOjE7Ly9iaXQxNAorCQlVSU5UMzIgICAgICAgCVRYRmlmb1N0YXR1c0ludDoxOy8vRklGTyBTdGF0aXN0aWNzIGlzIGZ1bGwsIHN3IHNob3VsZCByZWFkIDB4MTcxYworCQlVSU5UMzIgICAgICAgCVByZVRCVFQ6MTsKKwkJVUlOVDMyICAgICAgIAlUQlRUSW50OjE7CisJCVVJTlQzMiAgICAgICAJUnhUeENvaGVyZW50OjE7CisJCVVJTlQzMiAgICAgICAJTUNVQ29tbWFuZElOVDoxOworCQlVSU5UMzIgICAgICAgCU1nbXREbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJSGNjYURtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlBYzNEbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJQWMyRG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUFjMURtYURvbmU6MTsKKwkJVUlOVDMyCQlBYzBEbWFEb25lOjE7CisJCVVJTlQzMgkJUnhEb25lOjE7CisJCVVJTlQzMgkJVHhEZWxheUlOVDoxOwkvL2RlbGF5ZWQgaW50ZXJydXB0LCBub3QgaW50ZXJydXB0IHVudGlsIHNldmVyYWwgaW50IG9yIHRpbWUgbGltaXQgaGl0CisJCVVJTlQzMgkJUnhEZWxheUlOVDoxOyAvL2RlYWx5ZWQgaW50ZXJydXB0CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlJTlRfU09VUkNFX0NTUl9TVFJVQywgKlBJTlRfU09VUkNFX0NTUl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9JTlRfU09VUkNFX0NTUl9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlSeERlbGF5SU5UOjE7CisJCVVJTlQzMgkJVHhEZWxheUlOVDoxOworCQlVSU5UMzIJCVJ4RG9uZToxOworCQlVSU5UMzIJCUFjMERtYURvbmU6MTsvLzQKKwkJVUlOVDMyICAgICAgIAlBYzFEbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJQWMyRG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUFjM0RtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlIY2NhRG1hRG9uZToxOyAvLyBiaXQ3CisJCVVJTlQzMiAgICAgICAJTWdtdERtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlNQ1VDb21tYW5kSU5UOjE7Ly9iaXQgOQorCQlVSU5UMzIgICAgICAgCVJ4VHhDb2hlcmVudDoxOworCQlVSU5UMzIgICAgICAgCVRCVFRJbnQ6MTsKKwkJVUlOVDMyICAgICAgIAlQcmVUQlRUOjE7CisJCVVJTlQzMiAgICAgICAJVFhGaWZvU3RhdHVzSW50OjE7Ly9GSUZPIFN0YXRpc3RpY3MgaXMgZnVsbCwgc3cgc2hvdWxkIHJlYWQgMHgxNzFjCisJCVVJTlQzMiAgICAgICAJQXV0b1dha2V1cDoxOy8vYml0MTQKKwkJVUlOVDMyICAgICAgIAlHUFRpbWVyOjE7CisJCVVJTlQzMiAgICAgICAJUnhDb2hlcmVudDoxOy8vYml0MTYKKwkJVUlOVDMyICAgICAgIAlUeENvaGVyZW50OjE7CisJCVVJTlQzMiAgICAgICAJOjE0OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30gSU5UX1NPVVJDRV9DU1JfU1RSVUMsICpQSU5UX1NPVVJDRV9DU1JfU1RSVUM7CisjZW5kaWYKKworLy8KKy8vIElOVF9NQVNLX0NTUjogICBJbnRlcnJ1cHQgTUFTSyByZWdpc3Rlci4gICAxOiB0aGUgaW50ZXJydXB0IGlzIG1hc2sgT0ZGCisvLworI2RlZmluZSBJTlRfTUFTS19DU1IgICAgICAgIDB4MjA0CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfSU5UX01BU0tfQ1NSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIgICAgICAgCVR4Q29oZXJlbnQ6MTsKKwkJVUlOVDMyICAgICAgIAlSeENvaGVyZW50OjE7CisJCVVJTlQzMiAgICAgICAJOjIwOworCQlVSU5UMzIgICAgICAgCU1DVUNvbW1hbmRJTlQ6MTsKKwkJVUlOVDMyICAgICAgIAlNZ210RG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUhjY2FEbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJQWMzRG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUFjMkRtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlBYzFEbWFEb25lOjE7CisJCVVJTlQzMgkJQWMwRG1hRG9uZToxOworCQlVSU5UMzIJCVJ4RG9uZToxOworCQlVSU5UMzIJCVR4RGVsYXk6MTsKKwkJVUlOVDMyCQlSWERlbGF5X0lOVF9NU0s6MTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9SU5UX01BU0tfQ1NSX1NUUlVDLCAqUElOVF9NQVNLX0NTUl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9JTlRfTUFTS19DU1JfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJUlhEZWxheV9JTlRfTVNLOjE7CisJCVVJTlQzMgkJVHhEZWxheToxOworCQlVSU5UMzIJCVJ4RG9uZToxOworCQlVSU5UMzIJCUFjMERtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlBYzFEbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJQWMyRG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUFjM0RtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlIY2NhRG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCU1nbXREbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJTUNVQ29tbWFuZElOVDoxOworCQlVSU5UMzIgICAgICAgCToyMDsKKwkJVUlOVDMyICAgICAgIAlSeENvaGVyZW50OjE7CisJCVVJTlQzMiAgICAgICAJVHhDb2hlcmVudDoxOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30gSU5UX01BU0tfQ1NSX1NUUlVDLCAqUElOVF9NQVNLX0NTUl9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBXUERNQV9HTE9fQ0ZHIAkweDIwOAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1dQRE1BX0dMT19DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMiAgICAgICAJSERSX1NFR19MRU46MTY7CisJCVVJTlQzMiAgICAgICAJUlhIZHJTY2F0ZXI6ODsKKwkJVUlOVDMyICAgICAgIAlCaWdFbmRpYW46MTsKKwkJVUlOVDMyICAgICAgIAlFblRYV3JpdGVCYWNrRERPTkU6MTsKKwkJVUlOVDMyICAgICAgIAlXUERNQUJ1cnN0U0laRToyOworCQlVSU5UMzIJCVJ4RE1BQnVzeToxOworCQlVSU5UMzIJCUVuYWJsZVJ4RE1BOjE7CisJCVVJTlQzMgkJVHhETUFCdXN5OjE7CisJCVVJTlQzMgkJRW5hYmxlVHhETUE6MTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9V1BETUFfR0xPX0NGR19TVFJVQywgKlBXUERNQV9HTE9fQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1dQRE1BX0dMT19DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJRW5hYmxlVHhETUE6MTsKKwkJVUlOVDMyCQlUeERNQUJ1c3k6MTsKKwkJVUlOVDMyCQlFbmFibGVSeERNQToxOworCQlVSU5UMzIJCVJ4RE1BQnVzeToxOworCQlVSU5UMzIgICAgICAgCVdQRE1BQnVyc3RTSVpFOjI7CisJCVVJTlQzMiAgICAgICAJRW5UWFdyaXRlQmFja0RET05FOjE7CisJCVVJTlQzMiAgICAgICAJQmlnRW5kaWFuOjE7CisJCVVJTlQzMiAgICAgICAJUlhIZHJTY2F0ZXI6ODsKKwkJVUlOVDMyICAgICAgIAlIRFJfU0VHX0xFTjoxNjsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9IFdQRE1BX0dMT19DRkdfU1RSVUMsICpQV1BETUFfR0xPX0NGR19TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBXUERNQV9SU1RfSURYIAkweDIwYworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1dQRE1BX1JTVF9JRFhfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMiAgICAgICAJOjE1OworCQlVSU5UMzIgICAgICAgCVJTVF9EUlhfSURYMDoxOworCQlVSU5UMzIgICAgICAgCXJzdjoxMDsKKwkJVUlOVDMyICAgICAgIAlSU1RfRFRYX0lEWDU6MTsKKwkJVUlOVDMyICAgICAgIAlSU1RfRFRYX0lEWDQ6MTsKKwkJVUlOVDMyCQlSU1RfRFRYX0lEWDM6MTsKKwkJVUlOVDMyCQlSU1RfRFRYX0lEWDI6MTsKKwkJVUlOVDMyCQlSU1RfRFRYX0lEWDE6MTsKKwkJVUlOVDMyCQlSU1RfRFRYX0lEWDA6MTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9V1BETUFfUlNUX0lEWF9TVFJVQywgKlBXUERNQV9SU1RfSURYX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1dQRE1BX1JTVF9JRFhfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJUlNUX0RUWF9JRFgwOjE7CisJCVVJTlQzMgkJUlNUX0RUWF9JRFgxOjE7CisJCVVJTlQzMgkJUlNUX0RUWF9JRFgyOjE7CisJCVVJTlQzMgkJUlNUX0RUWF9JRFgzOjE7CisJCVVJTlQzMiAgICAgICAJUlNUX0RUWF9JRFg0OjE7CisJCVVJTlQzMiAgICAgICAJUlNUX0RUWF9JRFg1OjE7CisJCVVJTlQzMiAgICAgICAJcnN2OjEwOworCQlVSU5UMzIgICAgICAgCVJTVF9EUlhfSURYMDoxOworCQlVSU5UMzIgICAgICAgCToxNTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9IFdQRE1BX1JTVF9JRFhfU1RSVUMsICpQV1BETUFfUlNUX0lEWF9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBERUxBWV9JTlRfQ0ZHICAweDAyMTAKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9ERUxBWV9JTlRfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIgICAgICAgCVRYRExZX0lOVF9FTjoxOworCQlVSU5UMzIgICAgICAgCVRYTUFYX1BJTlQ6NzsKKwkJVUlOVDMyICAgICAgIAlUWE1BWF9QVElNRTo4OworCQlVSU5UMzIgICAgICAgCVJYRExZX0lOVF9FTjoxOworCQlVSU5UMzIgICAgICAgCVJYTUFYX1BJTlQ6NzsKKwkJVUlOVDMyCQlSWE1BWF9QVElNRTo4OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK31ERUxBWV9JTlRfQ0ZHX1NUUlVDLCAqUERFTEFZX0lOVF9DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfREVMQVlfSU5UX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlSWE1BWF9QVElNRTo4OworCQlVSU5UMzIgICAgICAgCVJYTUFYX1BJTlQ6NzsKKwkJVUlOVDMyICAgICAgIAlSWERMWV9JTlRfRU46MTsKKwkJVUlOVDMyICAgICAgIAlUWE1BWF9QVElNRTo4OworCQlVSU5UMzIgICAgICAgCVRYTUFYX1BJTlQ6NzsKKwkJVUlOVDMyICAgICAgIAlUWERMWV9JTlRfRU46MTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9IERFTEFZX0lOVF9DRkdfU1RSVUMsICpQREVMQVlfSU5UX0NGR19TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBXTU1fQUlGU05fQ0ZHICAgMHgwMjE0CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfQUlGU05fQ1NSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICBSc3Y6MTY7CisJICAgIFVJTlQzMiAgIEFpZnNuMzo0OyAgICAgICAvLyBmb3IgQUNfVk8KKwkgICAgVUlOVDMyICAgQWlmc24yOjQ7ICAgICAgIC8vIGZvciBBQ19WSQorCSAgICBVSU5UMzIgICBBaWZzbjE6NDsgICAgICAgLy8gZm9yIEFDX0JLCisJICAgIFVJTlQzMiAgIEFpZnNuMDo0OyAgICAgICAvLyBmb3IgQUNfQkUKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUFJRlNOX0NTUl9TVFJVQywgKlBBSUZTTl9DU1JfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfQUlGU05fQ1NSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICBBaWZzbjA6NDsgICAgICAgLy8gZm9yIEFDX0JFCisJICAgIFVJTlQzMiAgIEFpZnNuMTo0OyAgICAgICAvLyBmb3IgQUNfQksKKwkgICAgVUlOVDMyICAgQWlmc24yOjQ7ICAgICAgIC8vIGZvciBBQ19WSQorCSAgICBVSU5UMzIgICBBaWZzbjM6NDsgICAgICAgLy8gZm9yIEFDX1ZPCisJICAgIFVJTlQzMiAgIFJzdjoxNjsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUFJRlNOX0NTUl9TVFJVQywgKlBBSUZTTl9DU1JfU1RSVUM7CisjZW5kaWYKKy8vCisvLyBDV01JTl9DU1I6IENXbWluIGZvciBlYWNoIEVEQ0EgQUMKKy8vCisjZGVmaW5lIFdNTV9DV01JTl9DRkcgICAweDAyMTgKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9DV01JTl9DU1JfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgIFJzdjoxNjsKKwkgICAgVUlOVDMyICAgQ3dtaW4zOjQ7ICAgICAgIC8vIGZvciBBQ19WTworCSAgICBVSU5UMzIgICBDd21pbjI6NDsgICAgICAgLy8gZm9yIEFDX1ZJCisJICAgIFVJTlQzMiAgIEN3bWluMTo0OyAgICAgICAvLyBmb3IgQUNfQksKKwkgICAgVUlOVDMyICAgQ3dtaW4wOjQ7ICAgICAgIC8vIGZvciBBQ19CRQorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQ1dNSU5fQ1NSX1NUUlVDLCAqUENXTUlOX0NTUl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9DV01JTl9DU1JfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgIEN3bWluMDo0OyAgICAgICAvLyBmb3IgQUNfQkUKKwkgICAgVUlOVDMyICAgQ3dtaW4xOjQ7ICAgICAgIC8vIGZvciBBQ19CSworCSAgICBVSU5UMzIgICBDd21pbjI6NDsgICAgICAgLy8gZm9yIEFDX1ZJCisJICAgIFVJTlQzMiAgIEN3bWluMzo0OyAgICAgICAvLyBmb3IgQUNfVk8KKwkgICAgVUlOVDMyICAgUnN2OjE2OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQ1dNSU5fQ1NSX1NUUlVDLCAqUENXTUlOX0NTUl9TVFJVQzsKKyNlbmRpZgorCisvLworLy8gQ1dNQVhfQ1NSOiBDV21pbiBmb3IgZWFjaCBFRENBIEFDCisvLworI2RlZmluZSBXTU1fQ1dNQVhfQ0ZHICAgMHgwMjFjCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfQ1dNQVhfQ1NSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICBSc3Y6MTY7CisJICAgIFVJTlQzMiAgIEN3bWF4Mzo0OyAgICAgICAvLyBmb3IgQUNfVk8KKwkgICAgVUlOVDMyICAgQ3dtYXgyOjQ7ICAgICAgIC8vIGZvciBBQ19WSQorCSAgICBVSU5UMzIgICBDd21heDE6NDsgICAgICAgLy8gZm9yIEFDX0JLCisJICAgIFVJTlQzMiAgIEN3bWF4MDo0OyAgICAgICAvLyBmb3IgQUNfQkUKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUNXTUFYX0NTUl9TVFJVQywgKlBDV01BWF9DU1JfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfQ1dNQVhfQ1NSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICBDd21heDA6NDsgICAgICAgLy8gZm9yIEFDX0JFCisJICAgIFVJTlQzMiAgIEN3bWF4MTo0OyAgICAgICAvLyBmb3IgQUNfQksKKwkgICAgVUlOVDMyICAgQ3dtYXgyOjQ7ICAgICAgIC8vIGZvciBBQ19WSQorCSAgICBVSU5UMzIgICBDd21heDM6NDsgICAgICAgLy8gZm9yIEFDX1ZPCisJICAgIFVJTlQzMiAgIFJzdjoxNjsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUNXTUFYX0NTUl9TVFJVQywgKlBDV01BWF9DU1JfU1RSVUM7CisjZW5kaWYKKworCisvLworLy8gQUNfVFhPUF9DU1IwOiBBQ19CSy9BQ19CRSBUWE9QIHJlZ2lzdGVyCisvLworI2RlZmluZSBXTU1fVFhPUDBfQ0ZHICAgIDB4MDIyMAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0FDX1RYT1BfQ1NSMF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBYzFUeG9wOyAgICAgICAgLy8gZm9yIEFDX0JFLCBpbiB1bml0IG9mIDMydXMKKwkgICAgVVNIT1JUICBBYzBUeG9wOyAgICAgICAgLy8gZm9yIEFDX0JLLCBpbiB1bml0IG9mIDMydXMKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUFDX1RYT1BfQ1NSMF9TVFJVQywgKlBBQ19UWE9QX0NTUjBfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfQUNfVFhPUF9DU1IwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFjMFR4b3A7ICAgICAgICAvLyBmb3IgQUNfQkssIGluIHVuaXQgb2YgMzJ1cworCSAgICBVU0hPUlQgIEFjMVR4b3A7ICAgICAgICAvLyBmb3IgQUNfQkUsIGluIHVuaXQgb2YgMzJ1cworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQUNfVFhPUF9DU1IwX1NUUlVDLCAqUEFDX1RYT1BfQ1NSMF9TVFJVQzsKKyNlbmRpZgorCisvLworLy8gQUNfVFhPUF9DU1IxOiBBQ19WTy9BQ19WSSBUWE9QIHJlZ2lzdGVyCisvLworI2RlZmluZSBXTU1fVFhPUDFfQ0ZHICAgIDB4MDIyNAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0FDX1RYT1BfQ1NSMV9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBYzNUeG9wOyAgICAgICAgLy8gZm9yIEFDX1ZPLCBpbiB1bml0IG9mIDMydXMKKwkgICAgVVNIT1JUICBBYzJUeG9wOyAgICAgICAgLy8gZm9yIEFDX1ZJLCBpbiB1bml0IG9mIDMydXMKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUFDX1RYT1BfQ1NSMV9TVFJVQywgKlBBQ19UWE9QX0NTUjFfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfQUNfVFhPUF9DU1IxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFjMlR4b3A7ICAgICAgICAvLyBmb3IgQUNfVkksIGluIHVuaXQgb2YgMzJ1cworCSAgICBVU0hPUlQgIEFjM1R4b3A7ICAgICAgICAvLyBmb3IgQUNfVk8sIGluIHVuaXQgb2YgMzJ1cworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQUNfVFhPUF9DU1IxX1NUUlVDLCAqUEFDX1RYT1BfQ1NSMV9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBSSU5HUkVHX0RJRkYJCQkweDEwCisjZGVmaW5lIEdQSU9fQ1RSTF9DRkcgICAgMHgwMjI4CS8vTUFDX0NTUjEzCisjZGVmaW5lIE1DVV9DTURfQ0ZHICAgIDB4MDIyYworI2RlZmluZSBUWF9CQVNFX1BUUjAgICAgIDB4MDIzMAkvL0FDX0JLIGJhc2UgYWRkcmVzcworI2RlZmluZSBUWF9NQVhfQ05UMCAgICAgIDB4MDIzNAorI2RlZmluZSBUWF9DVFhfSURYMCAgICAgICAweDAyMzgKKyNkZWZpbmUgVFhfRFRYX0lEWDAgICAgICAweDAyM2MKKyNkZWZpbmUgVFhfQkFTRV9QVFIxICAgICAweDAyNDAgCS8vQUNfQkUgYmFzZSBhZGRyZXNzCisjZGVmaW5lIFRYX01BWF9DTlQxICAgICAgMHgwMjQ0CisjZGVmaW5lIFRYX0NUWF9JRFgxICAgICAgIDB4MDI0OAorI2RlZmluZSBUWF9EVFhfSURYMSAgICAgIDB4MDI0YworI2RlZmluZSBUWF9CQVNFX1BUUjIgICAgIDB4MDI1MCAJLy9BQ19WSSBiYXNlIGFkZHJlc3MKKyNkZWZpbmUgVFhfTUFYX0NOVDIgICAgICAweDAyNTQKKyNkZWZpbmUgVFhfQ1RYX0lEWDIgICAgICAgMHgwMjU4CisjZGVmaW5lIFRYX0RUWF9JRFgyICAgICAgMHgwMjVjCisjZGVmaW5lIFRYX0JBU0VfUFRSMyAgICAgMHgwMjYwIAkvL0FDX1ZPIGJhc2UgYWRkcmVzcworI2RlZmluZSBUWF9NQVhfQ05UMyAgICAgIDB4MDI2NAorI2RlZmluZSBUWF9DVFhfSURYMyAgICAgICAweDAyNjgKKyNkZWZpbmUgVFhfRFRYX0lEWDMgICAgICAweDAyNmMKKyNkZWZpbmUgVFhfQkFTRV9QVFI0ICAgICAweDAyNzAgCS8vSENDQSBiYXNlIGFkZHJlc3MKKyNkZWZpbmUgVFhfTUFYX0NOVDQgICAgICAweDAyNzQKKyNkZWZpbmUgVFhfQ1RYX0lEWDQgICAgICAgMHgwMjc4CisjZGVmaW5lIFRYX0RUWF9JRFg0ICAgICAgMHgwMjdjCisjZGVmaW5lIFRYX0JBU0VfUFRSNSAgICAgMHgwMjgwIAkvL01HTVQgYmFzZSBhZGRyZXNzCisjZGVmaW5lICBUWF9NQVhfQ05UNSAgICAgMHgwMjg0CisjZGVmaW5lIFRYX0NUWF9JRFg1ICAgICAgIDB4MDI4OAorI2RlZmluZSBUWF9EVFhfSURYNSAgICAgIDB4MDI4YworI2RlZmluZSBUWF9NR01UTUFYX0NOVCAgICAgIFRYX01BWF9DTlQ1CisjZGVmaW5lIFRYX01HTVRDVFhfSURYICAgICAgIFRYX0NUWF9JRFg1CisjZGVmaW5lIFRYX01HTVREVFhfSURYICAgICAgVFhfRFRYX0lEWDUKKyNkZWZpbmUgUlhfQkFTRV9QVFIgICAgIDB4MDI5MCAJLy9SWCBiYXNlIGFkZHJlc3MKKyNkZWZpbmUgUlhfTUFYX0NOVCAgICAgIDB4MDI5NAorI2RlZmluZSBSWF9DUlhfSURYICAgICAgIDB4MDI5OAorI2RlZmluZSBSWF9EUlhfSURYICAgICAgMHgwMjljCisjZGVmaW5lIFVTQl9ETUFfQ0ZHICAgICAgMHgwMmEwCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVVNCX0RNQV9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgVHhCdXN5OjE7ICAgCS8vVVNCIERNQSBUWCBGU00gYnVzeSAuIGRlYnVnIG9ubHkKKwkgICAgVUlOVDMyICBSeEJ1c3k6MTsgICAgICAgIC8vVVNCIERNQSBSWCBGU00gYnVzeSAuIGRlYnVnIG9ubHkKKwkgICAgVUlOVDMyICBFcG91dFZhbGlkOjY7ICAgICAgICAvL09VVCBlbmRwb2ludCBkYXRhIHZhbGlkLiBkZWJ1ZyBvbmx5CisJICAgIFVJTlQzMiAgVHhCdWxrRW46MTsgICAgICAgIC8vRW5hYmxlIFVTQiBETUEgVHgKKwkgICAgVUlOVDMyICBSeEJ1bGtFbjoxOyAgICAgICAgLy9FbmFibGUgVVNCIERNQSBSeAorCSAgICBVSU5UMzIgIFJ4QnVsa0FnZ0VuOjE7ICAgICAgICAvL0VuYWJsZSBSeCBCdWxrIEFnZ3JlZ2F0aW9uCisJICAgIFVJTlQzMiAgVHhvcEhhbHQ6MTsgICAgICAgIC8vSGFsdCBUWE9QIGNvdW50IGRvd24gd2hlbiBUWCBidWZmZXIgaXMgZnVsbC4KKwkgICAgVUlOVDMyICBUeENsZWFyOjE7ICAgICAgICAvL0NsZWFyIFVTQiBETUEgVFggcGF0aAorCSAgICBVSU5UMzIgIHJzdjoyOworCSAgICBVSU5UMzIgIHBoeWNsZWFyOjE7ICAgICAgICAJCS8vcGh5IHdhdGNoIGRvZyBlbmFibGUuIHdyaXRlIDEKKwkgICAgVUlOVDMyICBSeEJ1bGtBZ2dMbXQ6ODsgICAgICAgIC8vUnggQnVsayBBZ2dyZWdhdGlvbiBMaW1pdCAgaW4gdW5pdCBvZiAxMDI0IGJ5dGVzCisJICAgIFVJTlQzMiAgUnhCdWxrQWdnVE91dDo4OyAgICAgICAgLy9SeCBCdWxrIEFnZ3JlZ2F0aW9uIFRpbWVPdXQgIGluIHVuaXQgb2YgMzNucworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVVNCX0RNQV9DRkdfU1RSVUMsICpQVVNCX0RNQV9DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVVNCX0RNQV9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgUnhCdWxrQWdnVE91dDo4OyAgICAgICAgLy9SeCBCdWxrIEFnZ3JlZ2F0aW9uIFRpbWVPdXQgIGluIHVuaXQgb2YgMzNucworCSAgICBVSU5UMzIgIFJ4QnVsa0FnZ0xtdDo4OyAgICAgICAgLy9SeCBCdWxrIEFnZ3JlZ2F0aW9uIExpbWl0ICBpbiB1bml0IG9mIDI1NiBieXRlcworCSAgICBVSU5UMzIgIHBoeWNsZWFyOjE7ICAgICAgICAJCS8vcGh5IHdhdGNoIGRvZyBlbmFibGUuIHdyaXRlIDEKKwkgICAgVUlOVDMyICByc3Y6MjsKKwkgICAgVUlOVDMyICBUeENsZWFyOjE7ICAgICAgICAvL0NsZWFyIFVTQiBETUEgVFggcGF0aAorCSAgICBVSU5UMzIgIFR4b3BIYWx0OjE7ICAgICAgICAvL0hhbHQgVFhPUCBjb3VudCBkb3duIHdoZW4gVFggYnVmZmVyIGlzIGZ1bGwuCisJICAgIFVJTlQzMiAgUnhCdWxrQWdnRW46MTsgICAgICAgIC8vRW5hYmxlIFJ4IEJ1bGsgQWdncmVnYXRpb24KKwkgICAgVUlOVDMyICBSeEJ1bGtFbjoxOyAgICAgICAgLy9FbmFibGUgVVNCIERNQSBSeAorCSAgICBVSU5UMzIgIFR4QnVsa0VuOjE7ICAgICAgICAvL0VuYWJsZSBVU0IgRE1BIFR4CisJICAgIFVJTlQzMiAgRXBvdXRWYWxpZDo2OyAgICAgICAgLy9PVVQgZW5kcG9pbnQgZGF0YSB2YWxpZAorCSAgICBVSU5UMzIgIFJ4QnVzeToxOyAgICAgICAgLy9VU0IgRE1BIFJYIEZTTSBidXN5CisJICAgIFVJTlQzMiAgVHhCdXN5OjE7ICAgCS8vVVNCIERNQSBUWCBGU00gYnVzeQorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVVNCX0RNQV9DRkdfU1RSVUMsICpQVVNCX0RNQV9DRkdfU1RSVUM7CisjZW5kaWYKKworLy8KKy8vICAzICBQQkYgIHJlZ2lzdGVycworLy8KKy8vCisvLyBNb3N0IGFyZSBmb3IgZGVidWcuIERyaXZlciBkb2Vzbid0IHRvdWNoIFBCRiByZWdpc3Rlci4KKyNkZWZpbmUgCVBCRl9TWVNfQ1RSTCAJIDB4MDQwMAorI2RlZmluZSAgICAgUEJGX0NGRyAgICAgICAgICAgICAgICAgMHgwNDA4CisjZGVmaW5lIAlQQkZfTUFYX1BDTlQgCSAweDA0MEMKKyNkZWZpbmUgCVBCRl9DVFJMCSAJMHgwNDEwCisjZGVmaW5lIAlQQkZfSU5UX1NUQQkgMHgwNDE0CisjZGVmaW5lIAlQQkZfSU5UX0VOQQkgMHgwNDE4CisjZGVmaW5lIAlUWFJYUV9QQ05UICAJIDB4MDQzOAorI2RlZmluZSAJUEJGX0RCRyAJIAkgMHgwNDNjCisjZGVmaW5lICAgICBQQkZfQ0FQX0NUUkwgICAgIDB4MDQ0MAorCisvLworLy8gIDQgIE1BQyAgcmVnaXN0ZXJzCisvLworLy8KKy8vICA0LjEgTUFDIFNZU1RFTSAgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKG9mZnNldDoweDEwMDApCisvLworI2RlZmluZSBNQUNfQ1NSMCAgICAgICAgICAgIDB4MTAwMAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0FTSUNfVkVSX0lEX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFTSUNWZXI7ICAgICAgICAvLyB2ZXJzaW9uIDogMjg2MAorCSAgICBVU0hPUlQgIEFTSUNSZXY7ICAgICAgICAvLyByZXZlcnNpb24gIDogMAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQVNJQ19WRVJfSURfU1RSVUMsICpQQVNJQ19WRVJfSURfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfQVNJQ19WRVJfSURfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQVNJQ1JldjsgICAgICAgIC8vIHJldmVyc2lvbiAgOiAwCisJICAgIFVTSE9SVCAgQVNJQ1ZlcjsgICAgICAgIC8vIHZlcnNpb24gOiAyODYwCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlBU0lDX1ZFUl9JRF9TVFJVQywgKlBBU0lDX1ZFUl9JRF9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBNQUNfU1lTX0NUUkwgICAgICAgICAgICAweDEwMDQJCS8vTUFDX0NTUjEKKyNkZWZpbmUgTUFDX0FERFJfRFcwICAgICAgICAgICAgCQkweDEwMDgJCS8vIE1BQyBBRERSIERXMAorI2RlZmluZSBNQUNfQUREUl9EVzEgICAgICAgICAgIAkJIDB4MTAwYwkJLy8gTUFDIEFERFIgRFcxCisvLworLy8gTUFDX0NTUjI6IFNUQSBNQUMgcmVnaXN0ZXIgMAorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9NQUNfRFcwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUgkJQnl0ZTM7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDMKKwkJVUNIQVIJCUJ5dGUyOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAyCisJCVVDSEFSCQlCeXRlMTsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMQorCQlVQ0hBUgkJQnl0ZTA7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDAKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CU1BQ19EVzBfU1RSVUMsICpQTUFDX0RXMF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9NQUNfRFcwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUgkJQnl0ZTA7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDAKKwkJVUNIQVIJCUJ5dGUxOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAxCisJCVVDSEFSCQlCeXRlMjsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMgorCQlVQ0hBUgkJQnl0ZTM7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDMKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CU1BQ19EVzBfU1RSVUMsICpQTUFDX0RXMF9TVFJVQzsKKyNlbmRpZgorCisvLworLy8gTUFDX0NTUjM6IFNUQSBNQUMgcmVnaXN0ZXIgMQorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9NQUNfRFcxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUgkJUnN2ZDE7CisJCVVDSEFSCQlVMk1lTWFzazsKKwkJVUNIQVIJCUJ5dGU1OwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSA1CisJCVVDSEFSCQlCeXRlNDsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgNAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTUFDX0RXMV9TVFJVQywgKlBNQUNfRFcxX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX01BQ19EVzFfU1RSVUMJeworCXN0cnVjdAl7CisJCVVDSEFSCQlCeXRlNDsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgNAorCQlVQ0hBUgkJQnl0ZTU7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDUKKwkJVUNIQVIJCVUyTWVNYXNrOworCQlVQ0hBUgkJUnN2ZDE7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlNQUNfRFcxX1NUUlVDLCAqUE1BQ19EVzFfU1RSVUM7CisjZW5kaWYKKworI2RlZmluZSBNQUNfQlNTSURfRFcwICAgICAgICAgICAgCQkweDEwMTAJCS8vIE1BQyBCU1NJRCBEVzAKKyNkZWZpbmUgTUFDX0JTU0lEX0RXMSAgICAgICAgICAgIAkJMHgxMDE0CQkvLyBNQUMgQlNTSUQgRFcxCisKKy8vCisvLyBNQUNfQ1NSNTogQlNTSUQgcmVnaXN0ZXIgMQorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9NQUNfQ1NSNV9TVFJVQwl7CisJc3RydWN0CXsKKwkJVVNIT1JUCQlSc3ZkOjExOworCQlVU0hPUlQJCU1Cc3NCY25OdW06MzsKKwkJVVNIT1JUCQlCc3NJZE1vZGU6MjsgLy8gMDogb25lIEJTU0lELCAxMDogNCBCU1NJRCwgIDAxOiAyIEJTU0lEICwgMTE6IDhCU1NJRAorCQlVQ0hBUgkJQnl0ZTU7CQkgLy8gQlNTSUQgYnl0ZSA1CisJCVVDSEFSCQlCeXRlNDsJCSAvLyBCU1NJRCBieXRlIDQKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CU1BQ19DU1I1X1NUUlVDLCAqUE1BQ19DU1I1X1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX01BQ19DU1I1X1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUgkJQnl0ZTQ7CQkgLy8gQlNTSUQgYnl0ZSA0CisJCVVDSEFSCQlCeXRlNTsJCSAvLyBCU1NJRCBieXRlIDUKKwkJVVNIT1JUICAgICAgCUJzc0lkTWFzazoyOyAvLyAwOiBvbmUgQlNTSUQsIDEwOiA0IEJTU0lELCAgMDE6IDIgQlNTSUQgLCAxMTogOEJTU0lECisJCVVTSE9SVAkJTUJzc0Jjbk51bTozOworCQlVU0hPUlQJCVJzdmQ6MTE7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlNQUNfQ1NSNV9TVFJVQywgKlBNQUNfQ1NSNV9TVFJVQzsKKyNlbmRpZgorCisjZGVmaW5lIE1BWF9MRU5fQ0ZHICAgICAgICAgICAgICAweDEwMTgJCS8vIHJ0Mjg2MGIgbWF4IDE2ayBieXRlcy4gYml0MTI6MTMgTWF4aW11bSBQU0RVIGxlbmd0aCAocG93ZXIgZmFjdG9yKSAwOjJeMTMsIDE6Ml4xNCwgMjoyXjE1LCAzOjJeMTYKKyNkZWZpbmUgQkJQX0NTUl9DRkcgICAgICAgICAgICAJCTB4MTAxYwkJLy8KKy8vCisvLyBCQlBfQ1NSX0NGRzogQkJQIHNlcmlhbCBjb250cm9sIHJlZ2lzdGVyCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0JCUF9DU1JfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCToxMjsKKwkJVUlOVDMyCQlCQlBfUldfTU9ERToxOwkJLy8gMDogdXNlIHNlcmlhbCBtb2RlICAxOnBhcmFsbGVsCisJCVVJTlQzMgkJQkJQX1BBUl9EVVI6MTsJCSAgICAvLyAwOiA0IE1BQyBjbG9jayBjeWNsZXMgIDE6IDggTUFDIGNsb2NrIGN5Y2xlcworCQlVSU5UMzIJCUJ1c3k6MTsJCQkJLy8gMTogQVNJQyBpcyBidXN5IGV4ZWN1dGUgQkJQIHByb2dyYW1taW5nLgorCQlVSU5UMzIJCWZSZWFkOjE7CQkgICAgLy8gMDogV3JpdGUJQkJQLCAxOglSZWFkIEJCUAorCQlVSU5UMzIJCVJlZ051bTo4OwkJCS8vIFNlbGVjdGVkCUJCUAlyZWdpc3RlcgorCQlVSU5UMzIJCVZhbHVlOjg7CQkJLy8gUmVnaXN0ZXIJdmFsdWUgdG8gcHJvZ3JhbSBpbnRvIEJCUAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQkJQX0NTUl9DRkdfU1RSVUMsICpQQkJQX0NTUl9DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfQkJQX0NTUl9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJVmFsdWU6ODsJCQkvLyBSZWdpc3Rlcgl2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQCisJCVVJTlQzMgkJUmVnTnVtOjg7CQkJLy8gU2VsZWN0ZWQJQkJQCXJlZ2lzdGVyCisJCVVJTlQzMgkJZlJlYWQ6MTsJCSAgICAvLyAwOiBXcml0ZQlCQlAsIDE6CVJlYWQgQkJQCisJCVVJTlQzMgkJQnVzeToxOwkJCQkvLyAxOiBBU0lDIGlzIGJ1c3kgZXhlY3V0ZSBCQlAgcHJvZ3JhbW1pbmcuCisJCVVJTlQzMgkJQkJQX1BBUl9EVVI6MTsJCSAgICAgLy8gMDogNCBNQUMgY2xvY2sgY3ljbGVzICAxOiA4IE1BQyBjbG9jayBjeWNsZXMKKwkJVUlOVDMyCQlCQlBfUldfTU9ERToxOwkJLy8gMDogdXNlIHNlcmlhbCBtb2RlICAxOnBhcmFsbGVsCisJCVVJTlQzMgkJOjEyOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQkJQX0NTUl9DRkdfU1RSVUMsICpQQkJQX0NTUl9DRkdfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgUkZfQ1NSX0NGRzAgICAgICAgICAgICAJCTB4MTAyMAorLy8KKy8vIFJGX0NTUl9DRkc6IFJGIGNvbnRyb2wgcmVnaXN0ZXIKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfUkZfQ1NSX0NGRzBfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJQnVzeToxOwkJICAgIC8vIDA6IGlkbGUgMTogOGJ1c3kKKwkJVUlOVDMyCQlTZWw6MTsJCQkJLy8gMDpSRl9MRTAgYWN0aXZhdGUgIDE6UkZfTEUxIGFjdGl2YXRlCisJCVVJTlQzMgkJU3RhbmRieU1vZGU6MTsJCSAgICAvLyAwOiBoaWdoIHdoZW4gc3RhbmQgYnkgMToJbG93IHdoZW4gc3RhbmRieQorCQlVSU5UMzIJCWJpdHdpZHRoOjU7CQkJLy8gU2VsZWN0ZWQJQkJQCXJlZ2lzdGVyCisJCVVJTlQzMgkJUmVnSWRBbmRDb250ZW50OjI0OwkJCS8vIFJlZ2lzdGVyCXZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJGX0NTUl9DRkcwX1NUUlVDLCAqUFJGX0NTUl9DRkcwX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1JGX0NTUl9DRkcwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVJlZ0lkQW5kQ29udGVudDoyNDsJCQkvLyBSZWdpc3Rlcgl2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQCisJCVVJTlQzMgkJYml0d2lkdGg6NTsJCQkvLyBTZWxlY3RlZAlCQlAJcmVnaXN0ZXIKKwkJVUlOVDMyCQlTdGFuZGJ5TW9kZToxOwkJICAgIC8vIDA6IGhpZ2ggd2hlbiBzdGFuZCBieSAxOglsb3cgd2hlbiBzdGFuZGJ5CisJCVVJTlQzMgkJU2VsOjE7CQkJCS8vIDA6UkZfTEUwIGFjdGl2YXRlICAxOlJGX0xFMSBhY3RpdmF0ZQorCQlVSU5UMzIJCUJ1c3k6MTsJCSAgICAvLyAwOiBpZGxlIDE6IDhidXN5CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlSRl9DU1JfQ0ZHMF9TVFJVQywgKlBSRl9DU1JfQ0ZHMF9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBSRl9DU1JfQ0ZHMSAgICAgICAgICAgCQkweDEwMjQKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHMV9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlyc3Y6NzsJCSAgICAvLyAwOiBpZGxlIDE6IDhidXN5CisJCVVJTlQzMgkJUkZHYXA6NTsJCQkvLyBHYXAgYmV0d2VlbiBCQl9DT05UUk9MX1JGIGFuZCBSRl9MRS4gMDogMyBzeXN0ZW0gY2xvY2sgY3ljbGUgKDM3LjV1c2VjKSAxOiA1IHN5c3RlbSBjbG9jayBjeWNsZSAoNjIuNXVzZWMpCisJCVVJTlQzMgkJUmVnSWRBbmRDb250ZW50OjI0OwkJCS8vIFJlZ2lzdGVyCXZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJGX0NTUl9DRkcxX1NUUlVDLCAqUFJGX0NTUl9DRkcxX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1JGX0NTUl9DRkcxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVJlZ0lkQW5kQ29udGVudDoyNDsJCQkvLyBSZWdpc3Rlcgl2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQCisJCVVJTlQzMgkJUkZHYXA6NTsJCQkvLyBHYXAgYmV0d2VlbiBCQl9DT05UUk9MX1JGIGFuZCBSRl9MRS4gMDogMyBzeXN0ZW0gY2xvY2sgY3ljbGUgKDM3LjV1c2VjKSAxOiA1IHN5c3RlbSBjbG9jayBjeWNsZSAoNjIuNXVzZWMpCisJCVVJTlQzMgkJcnN2Ojc7CQkgICAgLy8gMDogaWRsZSAxOiA4YnVzeQorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUkZfQ1NSX0NGRzFfU1RSVUMsICpQUkZfQ1NSX0NGRzFfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgUkZfQ1NSX0NGRzIgICAgICAgICAgIAkJMHgxMDI4CQkvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1JGX0NTUl9DRkcyX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCXJzdjo4OwkJICAgIC8vIDA6IGlkbGUgMTogOGJ1c3kKKwkJVUlOVDMyCQlSZWdJZEFuZENvbnRlbnQ6MjQ7CQkJLy8gUmVnaXN0ZXIJdmFsdWUgdG8gcHJvZ3JhbSBpbnRvIEJCUAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUkZfQ1NSX0NGRzJfU1RSVUMsICpQUkZfQ1NSX0NGRzJfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUkZfQ1NSX0NGRzJfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJUmVnSWRBbmRDb250ZW50OjI0OwkJCS8vIFJlZ2lzdGVyCXZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAKKwkJVUlOVDMyCQlyc3Y6ODsJCSAgICAvLyAwOiBpZGxlIDE6IDhidXN5CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlSRl9DU1JfQ0ZHMl9TVFJVQywgKlBSRl9DU1JfQ0ZHMl9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBMRURfQ0ZHICAgICAgICAgICAJCTB4MTAyYwkJLy8gIE1BQ19DU1IxNAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0xFRF9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJOjE7CisJCVVJTlQzMgkJTGVkUG9sYXI6MTsJCQkvLyBMZWQgUG9sYXJpdHkuICAwOiBhY3RpdmUgbG93MTogYWN0aXZlIGhpZ2gKKwkJVUlOVDMyCQlZTGVkTW9kZToyOwkJCS8vIHllbGxvdyBMZWQgTW9kZQorCQlVSU5UMzIJCUdMZWRNb2RlOjI7CQkJLy8gZ3JlZW4gTGVkIE1vZGUKKwkJVUlOVDMyCQlSTGVkTW9kZToyOwkJCS8vIHJlZCBMZWQgTW9kZSAgICAwOiBvZmYxOiBibGlua2luZyB1cG9uIFRYMjogcGVyaW9kaWMgc2xvdyBibGlua2luZzM6IGFsd2F5cyBvbgorCQlVSU5UMzIJCXJzdjoyOworCQlVSU5UMzIJCVNsb3dCbGlua1BlcmlvZDo2OwkJCS8vIHNsb3cgYmxpbmtpbmcgcGVyaW9kLiB1bml0OjFtcworCQlVSU5UMzIJCU9mZlBlcmlvZDo4OwkJCS8vIGJsaW5raW5nIG9mZiBwZXJpb2QgdW5pdCAxbXMKKwkJVUlOVDMyCQlPblBlcmlvZDo4OwkJCS8vIGJsaW5raW5nIG9uIHBlcmlvZCB1bml0IDFtcworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTEVEX0NGR19TVFJVQywgKlBMRURfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0xFRF9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJT25QZXJpb2Q6ODsJCQkvLyBibGlua2luZyBvbiBwZXJpb2QgdW5pdCAxbXMKKwkJVUlOVDMyCQlPZmZQZXJpb2Q6ODsJCQkvLyBibGlua2luZyBvZmYgcGVyaW9kIHVuaXQgMW1zCisJCVVJTlQzMgkJU2xvd0JsaW5rUGVyaW9kOjY7CQkJLy8gc2xvdyBibGlua2luZyBwZXJpb2QuIHVuaXQ6MW1zCisJCVVJTlQzMgkJcnN2OjI7CisJCVVJTlQzMgkJUkxlZE1vZGU6MjsJCQkvLyByZWQgTGVkIE1vZGUgICAgMDogb2ZmMTogYmxpbmtpbmcgdXBvbiBUWDI6IHBlcmlvZGljIHNsb3cgYmxpbmtpbmczOiBhbHdheXMgb24KKwkJVUlOVDMyCQlHTGVkTW9kZToyOwkJCS8vIGdyZWVuIExlZCBNb2RlCisJCVVJTlQzMgkJWUxlZE1vZGU6MjsJCQkvLyB5ZWxsb3cgTGVkIE1vZGUKKwkJVUlOVDMyCQlMZWRQb2xhcjoxOwkJCS8vIExlZCBQb2xhcml0eS4gIDA6IGFjdGl2ZSBsb3cxOiBhY3RpdmUgaGlnaAorCQlVSU5UMzIJCToxOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTEVEX0NGR19TVFJVQywgKlBMRURfQ0ZHX1NUUlVDOworI2VuZGlmCisvLworLy8gIDQuMiBNQUMgVElNSU5HICBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAob2Zmc2V0OjB4MTEwMCkKKy8vCisjZGVmaW5lIFhJRlNfVElNRV9DRkcgICAgICAgICAgICAgMHgxMTAwCQkgLy8gTUFDX0NTUjggIE1BQ19DU1I5CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfSUZTX1NMT1RfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgIHJzdjoyOworCSAgICBVSU5UMzIgIEJCUnhlbmRFbmFibGU6MTsgICAgICAgIC8vICByZWZlcmVuY2UgUlhFTkQgc2lnbmFsIHRvIGJlZ2luIFhJRlMgZGVmZXIKKwkgICAgVUlOVDMyICBFSUZTOjk7ICAgICAgICAvLyAgdW5pdCAxdXMKKwkgICAgVUlOVDMyICBPZmRtWGlmc1RpbWU6NDsgICAgICAgIC8vT0ZETSBTSUZTLiB1bml0IDF1cy4gQXBwbGllZCBhZnRlciBPRkRNIFJYIHdoZW4gTUFDIGRvZXNuJ3QgcmVmZXJlbmNlIEJCUCBzaWduYWwgQkJSWEVORAorCSAgICBVSU5UMzIgIE9mZG1TaWZzVGltZTo4OyAgICAgICAgLy8gIHVuaXQgMXVzLiBBcHBsaWVkIGFmdGVyIE9GRE0gUlgvVFgKKwkgICAgVUlOVDMyICBDY2ttU2lmc1RpbWU6ODsgICAgICAgIC8vICB1bml0IDF1cy4gQXBwbGllZCBhZnRlciBDQ0sgUlgvVFgKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUlGU19TTE9UX0NGR19TVFJVQywgKlBJRlNfU0xPVF9DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfSUZTX1NMT1RfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgIENja21TaWZzVGltZTo4OyAgICAgICAgLy8gIHVuaXQgMXVzLiBBcHBsaWVkIGFmdGVyIENDSyBSWC9UWAorCSAgICBVSU5UMzIgIE9mZG1TaWZzVGltZTo4OyAgICAgICAgLy8gIHVuaXQgMXVzLiBBcHBsaWVkIGFmdGVyIE9GRE0gUlgvVFgKKwkgICAgVUlOVDMyICBPZmRtWGlmc1RpbWU6NDsgICAgICAgIC8vT0ZETSBTSUZTLiB1bml0IDF1cy4gQXBwbGllZCBhZnRlciBPRkRNIFJYIHdoZW4gTUFDIGRvZXNuJ3QgcmVmZXJlbmNlIEJCUCBzaWduYWwgQkJSWEVORAorCSAgICBVSU5UMzIgIEVJRlM6OTsgICAgICAgIC8vICB1bml0IDF1cworCSAgICBVSU5UMzIgIEJCUnhlbmRFbmFibGU6MTsgICAgICAgIC8vICByZWZlcmVuY2UgUlhFTkQgc2lnbmFsIHRvIGJlZ2luIFhJRlMgZGVmZXIKKwkgICAgVUlOVDMyICByc3Y6MjsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUlGU19TTE9UX0NGR19TVFJVQywgKlBJRlNfU0xPVF9DRkdfU1RSVUM7CisjZW5kaWYKKworI2RlZmluZSBCS09GRl9TTE9UX0NGRyAgICAgICAgICAgICAweDExMDQJCSAvLyAgbWFjX2NzcjkgbGFzdCA4IGJpdHMKKyNkZWZpbmUgTkFWX1RJTUVfQ0ZHICAgICAgICAgICAgIDB4MTEwOAkJIC8vIE5BViAgKE1BQ19DU1IxNSkKKyNkZWZpbmUgQ0hfVElNRV9DRkcgICAgICAgICAgICAgMHgxMTBDCQkgCS8vIENvdW50IGFzIGNoYW5uZWwgYnVzeQorI2RlZmluZSBQQkZfTElGRV9USU1FUiAgICAgICAgICAgICAweDExMTAJCSAvL1RYL1JYIE1QRFUgdGltZXN0YW1wIHRpbWVyIChmcmVlIHJ1bilVbml0OiAxdXMKKyNkZWZpbmUgQkNOX1RJTUVfQ0ZHICAgICAgICAgICAgIDB4MTExNAkJIC8vIFRYUlhfQ1NSOQorCisjZGVmaW5lIEJDTl9PRkZTRVQwCQkJCTB4MDQyQworI2RlZmluZSBCQ05fT0ZGU0VUMQkJCQkweDA0MzAKKworLy8KKy8vIEJDTl9USU1FX0NGRyA6IFN5bmNocm9uaXphdGlvbiBjb250cm9sIHJlZ2lzdGVyCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0JDTl9USU1FX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlUeFRpbWVzdGFtcENvbXBlbnNhdGU6ODsKKyAgICAgICAgVUlOVDMyICAgICAgIDozOworCQlVSU5UMzIJCWJCZWFjb25HZW46MTsJCS8vIEVuYWJsZSBiZWFjb24gZ2VuZXJhdG9yCisgICAgICAgIFVJTlQzMiAgICAgICBiVEJUVEVuYWJsZToxOworCQlVSU5UMzIJCVRzZlN5bmNNb2RlOjI7CQkvLyBFbmFibGUgVFNGIHN5bmMsIDAwOiBkaXNhYmxlLCAwMTogaW5mcmEgbW9kZSwgMTA6IGFkLWhvYyBtb2RlCisJCVVJTlQzMgkJYlRzZlRpY2tpbmc6MTsJCS8vIEVuYWJsZSBUU0YgYXV0byBjb3VudGluZworCQlVSU5UMzIgICAgICAgQmVhY29uSW50ZXJ2YWw6MTY7ICAvLyBpbiB1bml0IG9mIDEvMTYgVFUKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUJDTl9USU1FX0NGR19TVFJVQywgKlBCQ05fVElNRV9DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfQkNOX1RJTUVfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIgICAgICAgQmVhY29uSW50ZXJ2YWw6MTY7ICAvLyBpbiB1bml0IG9mIDEvMTYgVFUKKwkJVUlOVDMyCQliVHNmVGlja2luZzoxOwkJLy8gRW5hYmxlIFRTRiBhdXRvIGNvdW50aW5nCisJCVVJTlQzMgkJVHNmU3luY01vZGU6MjsJCS8vIEVuYWJsZSBUU0Ygc3luYywgMDA6IGRpc2FibGUsIDAxOiBpbmZyYSBtb2RlLCAxMDogYWQtaG9jIG1vZGUKKyAgICAgICAgVUlOVDMyICAgICAgIGJUQlRURW5hYmxlOjE7CisJCVVJTlQzMgkJYkJlYWNvbkdlbjoxOwkJLy8gRW5hYmxlIGJlYWNvbiBnZW5lcmF0b3IKKyAgICAgICAgVUlOVDMyICAgICAgIDozOworCQlVSU5UMzIJCVR4VGltZXN0YW1wQ29tcGVuc2F0ZTo4OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQkNOX1RJTUVfQ0ZHX1NUUlVDLCAqUEJDTl9USU1FX0NGR19TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBUQlRUX1NZTkNfQ0ZHICAgICAgICAgICAgMHgxMTE4ICAJCS8vIHR4cnhfY3NyMTAKKyNkZWZpbmUgVFNGX1RJTUVSX0RXMCAgICAgICAgICAgICAweDExMUMgIAkJLy8gTG9jYWwgVFNGIHRpbWVyIGxzYiAzMiBiaXRzLiBSZWFkLW9ubHkKKyNkZWZpbmUgVFNGX1RJTUVSX0RXMSAgICAgICAgICAgICAweDExMjAgIAkJLy8gbXNiIDMyIGJpdHMuIFJlYWQtb25seS4KKyNkZWZpbmUgVEJUVF9USU1FUiAgICAgICAgICAgICAJMHgxMTI0ICAJCS8vIFRJbWVyIHJlbWFpbnMgdGlsbCBuZXh0IFRCVFQuIFJlYWQtb25seS4gIFRYUlhfQ1NSMTQKKyNkZWZpbmUgSU5UX1RJTUVSX0NGRyAgICAgICAgICAgICAgCTB4MTEyOCAgCQkvLworI2RlZmluZSBJTlRfVElNRVJfRU4gICAgICAgICAgICAgCTB4MTEyYyAgCQkvLyAgR1AtdGltZXIgYW5kIHByZS10YnR0IEludCBlbmFibGUKKyNkZWZpbmUgQ0hfSURMRV9TVEEgICAgICAgICAgICAgIAkweDExMzAgIAkJLy8gIGNoYW5uZWwgaWRsZSB0aW1lCisjZGVmaW5lIENIX0JVU1lfU1RBICAgICAgICAgICAgICAJMHgxMTM0ICAJCS8vICBjaGFubmxlIGJ1c3kgdGltZQorLy8KKy8vICA0LjIgTUFDIFBPV0VSICBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAob2Zmc2V0OjB4MTIwMCkKKy8vCisjZGVmaW5lIE1BQ19TVEFUVVNfQ0ZHICAgICAgICAgICAgIDB4MTIwMAkJIC8vIG9sZCBNQUNfQ1NSMTIKKyNkZWZpbmUgUFdSX1BJTl9DRkcgICAgICAgICAgICAgMHgxMjA0CQkgLy8gb2xkIE1BQ19DU1IxMgorI2RlZmluZSBBVVRPX1dBS0VVUF9DRkcgICAgICAgICAgICAgMHgxMjA4CQkgLy8gb2xkIE1BQ19DU1IxMAorLy8KKy8vIEFVVE9fV0FLRVVQX0NGRzogTWFudWFsIHBvd2VyIGNvbnRyb2wgLyBzdGF0dXMgcmVnaXN0ZXIKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfQVVUT19XQUtFVVBfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJOjE2OworCQlVSU5UMzIJCUVuYWJsZUF1dG9XYWtldXA6MTsJLy8gMDpzbGVlcCwgMTphd2FrZQorCQlVSU5UMzIgICAgICAgTnVtb2ZTbGVlcGluZ1RidHQ6NzsgICAgICAgICAgLy8gRm9yY2VXYWtlIGhhcyBoaWdoIHByaXZpbGVnZSB0aGFuIFB1dFRvU2xlZXAgd2hlbiBib3RoIHNldAorCQlVSU5UMzIgICAgICAgQXV0b0xlYWRUaW1lOjg7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlBVVRPX1dBS0VVUF9TVFJVQywgKlBBVVRPX1dBS0VVUF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9BVVRPX1dBS0VVUF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyICAgICAgIEF1dG9MZWFkVGltZTo4OworCQlVSU5UMzIgICAgICAgTnVtb2ZTbGVlcGluZ1RidHQ6NzsgICAgICAgICAgLy8gRm9yY2VXYWtlIGhhcyBoaWdoIHByaXZpbGVnZSB0aGFuIFB1dFRvU2xlZXAgd2hlbiBib3RoIHNldAorCQlVSU5UMzIJCUVuYWJsZUF1dG9XYWtldXA6MTsJLy8gMDpzbGVlcCwgMTphd2FrZQorCQlVSU5UMzIJCToxNjsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUFVVE9fV0FLRVVQX1NUUlVDLCAqUEFVVE9fV0FLRVVQX1NUUlVDOworI2VuZGlmCisvLworLy8gIDQuMyBNQUMgVFggIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIChvZmZzZXQ6MHgxMzAwKQorLy8KKworI2RlZmluZSBFRENBX0FDMF9DRkcJMHgxMzAwCQkvL0FDX1RYT1BfQ1NSMCAweDM0NzQKKyNkZWZpbmUgRURDQV9BQzFfQ0ZHCTB4MTMwNAorI2RlZmluZSBFRENBX0FDMl9DRkcJMHgxMzA4CisjZGVmaW5lIEVEQ0FfQUMzX0NGRwkweDEzMGMKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9FRENBX0FDX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICA6MTI7ICAgICAgICAvLworCSAgICBVSU5UMzIgIEN3bWF4OjQ7ICAgICAgICAvL3VuaXQgcG93ZXIgb2YgMgorCSAgICBVSU5UMzIgIEN3bWluOjQ7ICAgICAgICAvLworCSAgICBVSU5UMzIgIEFpZnNuOjQ7ICAgICAgICAvLyAjIG9mIHNsb3QgdGltZQorCSAgICBVSU5UMzIgIEFjVHhvcDo4OyAgICAgICAgLy8gIGluIHVuaXQgb2YgMzJ1cworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JRURDQV9BQ19DRkdfU1RSVUMsICpQRURDQV9BQ19DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfRURDQV9BQ19DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgQWNUeG9wOjg7ICAgICAgICAvLyAgaW4gdW5pdCBvZiAzMnVzCisJICAgIFVJTlQzMiAgQWlmc246NDsgICAgICAgIC8vICMgb2Ygc2xvdCB0aW1lCisJICAgIFVJTlQzMiAgQ3dtaW46NDsgICAgICAgIC8vCisJICAgIFVJTlQzMiAgQ3dtYXg6NDsgICAgICAgIC8vdW5pdCBwb3dlciBvZiAyCisJICAgIFVJTlQzMiAgOjEyOyAgICAgICAvLworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JRURDQV9BQ19DRkdfU1RSVUMsICpQRURDQV9BQ19DRkdfU1RSVUM7CisjZW5kaWYKKworI2RlZmluZSBFRENBX1RJRF9BQ19NQVAJMHgxMzEwCisjZGVmaW5lIFRYX1BXUl9DRkdfMAkweDEzMTQKKyNkZWZpbmUgVFhfUFdSX0NGR18xCTB4MTMxOAorI2RlZmluZSBUWF9QV1JfQ0ZHXzIJMHgxMzFDCisjZGVmaW5lIFRYX1BXUl9DRkdfMwkweDEzMjAKKyNkZWZpbmUgVFhfUFdSX0NGR180CTB4MTMyNAorI2RlZmluZSBUWF9QSU5fQ0ZHCQkweDEzMjgKKyNkZWZpbmUgVFhfQkFORF9DRkcJMHgxMzJjCQkvLyAweDEgdXNlIHVwcGVyIDIwTUh6LiAwIGp1c2UgbG93ZXIgMjBNSHoKKyNkZWZpbmUgVFhfU1dfQ0ZHMAkJMHgxMzMwCisjZGVmaW5lIFRYX1NXX0NGRzEJCTB4MTMzNAorI2RlZmluZSBUWF9TV19DRkcyCQkweDEzMzgKKyNkZWZpbmUgVFhPUF9USFJFU19DRkcJCTB4MTMzYworI2RlZmluZSBUWE9QX0NUUkxfQ0ZHCQkweDEzNDAKKyNkZWZpbmUgVFhfUlRTX0NGRwkJMHgxMzQ0CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9UWF9SVFNfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgcnN2Ojc7CisJICAgIFVJTlQzMiAgICAgICBSdHNGYmtFbjoxOyAgICAvLyBlbmFibGUgcnRzIHJhdGUgZmFsbGJhY2sKKwkgICAgVUlOVDMyICAgICAgIFJ0c1RocmVzOjE2OyAgICAvLyB1bml0OmJ5dGUKKwkgICAgVUlOVDMyICAgICAgIEF1dG9SdHNSZXRyeUxpbWl0Ojg7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9SVFNfQ0ZHX1NUUlVDLCAqUFRYX1JUU19DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfUlRTX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIEF1dG9SdHNSZXRyeUxpbWl0Ojg7CisJICAgIFVJTlQzMiAgICAgICBSdHNUaHJlczoxNjsgICAgLy8gdW5pdDpieXRlCisJICAgIFVJTlQzMiAgICAgICBSdHNGYmtFbjoxOyAgICAvLyBlbmFibGUgcnRzIHJhdGUgZmFsbGJhY2sKKwkgICAgVUlOVDMyICAgICAgIHJzdjo3OyAgICAgLy8gMTogSFQgbm9uLVNUQkMgY29udHJvbCBmcmFtZSBlbmFibGUKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1JUU19DRkdfU1RSVUMsICpQVFhfUlRTX0NGR19TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBUWF9USU1FT1VUX0NGRwkweDEzNDgKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9UWF9USU1FT1VUX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIHJzdjI6ODsKKwkgICAgVUlOVDMyICAgICAgIFR4b3BUaW1lb3V0Ojg7CS8vVFhPUCB0aW1lb3V0IHZhbHVlIGZvciBUWE9QIHRydW5jYXRpb24uICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IChTTE9UX1RJTUUpID4gKFRYX09QX1RJTUVPVVQpID4gKFJYX0FDS19USU1FT1VUKQorCSAgICBVSU5UMzIgICAgICAgUnhBY2tUaW1lb3V0Ojg7CS8vIHVuaXQ6c2xvdC4gVXNlZCBmb3IgVFggcHJlY2VkdXJlCisJICAgIFVJTlQzMiAgICAgICBNcGR1TGlmZVRpbWU6NDsgICAgLy8gIGV4cGlyYXRpb24gdGltZSA9IDJeKDkrTVBEVSBMSUZFIFRJTUUpICB1cworCSAgICBVSU5UMzIgICAgICAgcnN2OjQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9USU1FT1VUX0NGR19TVFJVQywgKlBUWF9USU1FT1VUX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9UWF9USU1FT1VUX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIHJzdjo0OworCSAgICBVSU5UMzIgICAgICAgTXBkdUxpZmVUaW1lOjQ7ICAgIC8vICBleHBpcmF0aW9uIHRpbWUgPSAyXig5K01QRFUgTElGRSBUSU1FKSAgdXMKKwkgICAgVUlOVDMyICAgICAgIFJ4QWNrVGltZW91dDo4OwkvLyB1bml0OnNsb3QuIFVzZWQgZm9yIFRYIHByZWNlZHVyZQorCSAgICBVSU5UMzIgICAgICAgVHhvcFRpbWVvdXQ6ODsJLy9UWE9QIHRpbWVvdXQgdmFsdWUgZm9yIFRYT1AgdHJ1bmNhdGlvbi4gIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgKFNMT1RfVElNRSkgPiAoVFhfT1BfVElNRU9VVCkgPiAoUlhfQUNLX1RJTUVPVVQpCisJICAgIFVJTlQzMiAgICAgICByc3YyOjg7ICAgICAvLyAxOiBIVCBub24tU1RCQyBjb250cm9sIGZyYW1lIGVuYWJsZQorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfVElNRU9VVF9DRkdfU1RSVUMsICpQVFhfVElNRU9VVF9DRkdfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgVFhfUlRZX0NGRwkweDEzNGMKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uIFBBQ0tFRCBfVFhfUlRZX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIHJzdjoxOworCSAgICBVSU5UMzIgICAgICAgVHhhdXRvRkJFbmFibGU6MTsgICAgLy8gVHggcmV0cnkgUEhZIHJhdGUgYXV0byBmYWxsYmFjayBlbmFibGUKKwkgICAgVUlOVDMyICAgICAgIEFnZ1J0eU1vZGU6MTsJLy8gQWdncmVnYXRlIE1QRFUgcmV0cnkgbW9kZS4gIDA6ZXhwaXJlZCBieSByZXRyeSBsaW1pdCwgMTogZXhwaXJlZCBieSBtcGR1IGxpZmUgdGltZXIKKwkgICAgVUlOVDMyICAgICAgIE5vbkFnZ1J0eU1vZGU6MTsJLy8gTm9uLUFnZ3JlZ2F0ZSBNUERVIHJldHJ5IG1vZGUuICAwOmV4cGlyZWQgYnkgcmV0cnkgbGltaXQsIDE6IGV4cGlyZWQgYnkgbXBkdSBsaWZlIHRpbWVyCisJICAgIFVJTlQzMiAgICAgICBMb25nUnR5VGhyZToxMjsJLy8gTG9uZyByZXRyeSB0aHJlc2hvb2xkCisJICAgIFVJTlQzMiAgICAgICBMb25nUnR5TGltaXQ6ODsJLy9sb25nIHJldHJ5IGxpbWl0CisJICAgIFVJTlQzMiAgICAgICBTaG9ydFJ0eUxpbWl0Ojg7CS8vICBzaG9ydCByZXRyeSBsaW1pdAorCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9SVFlfQ0ZHX1NUUlVDLCAqUFRYX1JUWV9DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbiBQQUNLRUQgX1RYX1JUWV9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICBTaG9ydFJ0eUxpbWl0Ojg7CS8vICBzaG9ydCByZXRyeSBsaW1pdAorCSAgICBVSU5UMzIgICAgICAgTG9uZ1J0eUxpbWl0Ojg7CS8vbG9uZyByZXRyeSBsaW1pdAorCSAgICBVSU5UMzIgICAgICAgTG9uZ1J0eVRocmU6MTI7CS8vIExvbmcgcmV0cnkgdGhyZXNob29sZAorCSAgICBVSU5UMzIgICAgICAgTm9uQWdnUnR5TW9kZToxOwkvLyBOb24tQWdncmVnYXRlIE1QRFUgcmV0cnkgbW9kZS4gIDA6ZXhwaXJlZCBieSByZXRyeSBsaW1pdCwgMTogZXhwaXJlZCBieSBtcGR1IGxpZmUgdGltZXIKKwkgICAgVUlOVDMyICAgICAgIEFnZ1J0eU1vZGU6MTsJLy8gQWdncmVnYXRlIE1QRFUgcmV0cnkgbW9kZS4gIDA6ZXhwaXJlZCBieSByZXRyeSBsaW1pdCwgMTogZXhwaXJlZCBieSBtcGR1IGxpZmUgdGltZXIKKwkgICAgVUlOVDMyICAgICAgIFR4YXV0b0ZCRW5hYmxlOjE7ICAgIC8vIFR4IHJldHJ5IFBIWSByYXRlIGF1dG8gZmFsbGJhY2sgZW5hYmxlCisJICAgIFVJTlQzMiAgICAgICByc3Y6MTsgICAgIC8vIDE6IEhUIG5vbi1TVEJDIGNvbnRyb2wgZnJhbWUgZW5hYmxlCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9SVFlfQ0ZHX1NUUlVDLCAqUFRYX1JUWV9DRkdfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgVFhfTElOS19DRkcJMHgxMzUwCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglQQUNLRUQgX1RYX0xJTktfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QgUEFDS0VEIHsKKwkgICAgVUlOVDMyICAgICAgIFJlbW90TUZTOjg7CS8vcmVtb3RlIE1DUyBmZWVkYmFjayBzZXF1ZW5jZSBudW1iZXIKKwkgICAgVUlOVDMyICAgICAgIFJlbW90TUZCOjg7ICAgIC8vICByZW1vdGUgTUNTIGZlZWRiYWNrCisJICAgIFVJTlQzMiAgICAgICByc3Y6MzsJLy8KKwkgICAgVUlOVDMyICAgICAgIFR4Q0ZBY2tFbjoxOwkvLyAgIFBpZ2d5YmFjayBDRi1BQ0sgZW5hYmxlCisJICAgIFVJTlQzMiAgICAgICBUeFJER0VuOjE7CS8vIFJERyBUWCBlbmFibGUKKwkgICAgVUlOVDMyICAgICAgIFR4TVJRRW46MTsJLy8gIE1DUyByZXF1ZXN0IFRYIGVuYWJsZQorCSAgICBVSU5UMzIgICAgICAgUmVtb3RlVU1GU0VuYWJsZToxOwkvLyAgcmVtb3RlIHVuc29saWNpdCAgTUZCIGVuYWJsZS4gIDA6IG5vdCBhcHBseSByZW1vdGUgcmVtb3RlIHVuc29saWNpdCAoTUZTPTcpCisJICAgIFVJTlQzMiAgICAgICBNRkJFbmFibGU6MTsJLy8gIFRYIGFwcGx5IHJlbW90ZSBNRkIgMTplbmFibGUKKwkgICAgVUlOVDMyICAgICAgIFJlbW90ZU1GQkxpZmVUaW1lOjg7CS8vcmVtb3RlIE1GQiBsaWZlIHRpbWUuIHVuaXQgOiAzMnVzCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9MSU5LX0NGR19TVFJVQywgKlBUWF9MSU5LX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCVBBQ0tFRCBfVFhfTElOS19DRkdfU1RSVUMJeworCXN0cnVjdCBQQUNLRUQgeworCSAgICBVSU5UMzIgICAgICAgUmVtb3RlTUZCTGlmZVRpbWU6ODsJLy9yZW1vdGUgTUZCIGxpZmUgdGltZS4gdW5pdCA6IDMydXMKKwkgICAgVUlOVDMyICAgICAgIE1GQkVuYWJsZToxOwkvLyAgVFggYXBwbHkgcmVtb3RlIE1GQiAxOmVuYWJsZQorCSAgICBVSU5UMzIgICAgICAgUmVtb3RlVU1GU0VuYWJsZToxOwkvLyAgcmVtb3RlIHVuc29saWNpdCAgTUZCIGVuYWJsZS4gIDA6IG5vdCBhcHBseSByZW1vdGUgcmVtb3RlIHVuc29saWNpdCAoTUZTPTcpCisJICAgIFVJTlQzMiAgICAgICBUeE1SUUVuOjE7CS8vICBNQ1MgcmVxdWVzdCBUWCBlbmFibGUKKwkgICAgVUlOVDMyICAgICAgIFR4UkRHRW46MTsJLy8gUkRHIFRYIGVuYWJsZQorCSAgICBVSU5UMzIgICAgICAgVHhDRkFja0VuOjE7CS8vICAgUGlnZ3liYWNrIENGLUFDSyBlbmFibGUKKwkgICAgVUlOVDMyICAgICAgIHJzdjozOwkvLworCSAgICBVSU5UMzIgICAgICAgUmVtb3RNRkI6ODsgICAgLy8gIHJlbW90ZSBNQ1MgZmVlZGJhY2sKKwkgICAgVUlOVDMyICAgICAgIFJlbW90TUZTOjg7CS8vcmVtb3RlIE1DUyBmZWVkYmFjayBzZXF1ZW5jZSBudW1iZXIKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0xJTktfQ0ZHX1NUUlVDLCAqUFRYX0xJTktfQ0ZHX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIEhUX0ZCS19DRkcwCTB4MTM1NAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24gUEFDS0VEIF9IVF9GQktfQ0ZHMF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTN0ZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1M2RkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzVGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTNEZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MzRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzJGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMUZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MwRkJLOjQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlIVF9GQktfQ0ZHMF9TVFJVQywgKlBIVF9GQktfQ0ZHMF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uIFBBQ0tFRCBfSFRfRkJLX0NGRzBfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzBGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMUZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MyRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzNGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTNEZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1M1RkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzZGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTN0ZCSzo0OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JSFRfRkJLX0NGRzBfU1RSVUMsICpQSFRfRkJLX0NGRzBfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgSFRfRkJLX0NGRzEJMHgxMzU4CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfSFRfRkJLX0NGRzFfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzE1RkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzE0RkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzEzRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzEyRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzExRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzEwRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzlGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTOEZCSzo0OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JSFRfRkJLX0NGRzFfU1RSVUMsICpQSFRfRkJLX0NGRzFfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfSFRfRkJLX0NGRzFfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzhGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTOUZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxMEZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxMUZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxMkZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxM0ZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxNEZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxNUZCSzo0OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JSFRfRkJLX0NGRzFfU1RSVUMsICpQSFRfRkJLX0NGRzFfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgTEdfRkJLX0NGRzAJMHgxMzVjCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfTEdfRkJLX0NGRzBfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTN0ZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgNgorCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzZGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDUKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1M1RkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyA0CisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTNEZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMworCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzNGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDIKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MyRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAxCisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTMUZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMAorCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzBGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDAKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUxHX0ZCS19DRkcwX1NUUlVDLCAqUExHX0ZCS19DRkcwX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0xHX0ZCS19DRkcwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzBGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDAKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MxRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTMkZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMQorCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzNGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDIKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1M0RkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAzCisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTNUZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgNAorCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzZGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDUKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1M3RkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyA2CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlMR19GQktfQ0ZHMF9TVFJVQywgKlBMR19GQktfQ0ZHMF9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBMR19GQktfQ0ZHMQkJMHgxMzYwCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfTEdfRkJLX0NGRzFfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICByc3Y6MTY7CisJICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MzRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAyCisJICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MyRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAxCisJICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MxRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCisJICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MwRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlMR19GQktfQ0ZHMV9TVFJVQywgKlBMR19GQktfQ0ZHMV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9MR19GQktfQ0ZHMV9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIENDS01DUzBGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDAKKwkgICAgVUlOVDMyICAgICAgIENDS01DUzFGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDAKKwkgICAgVUlOVDMyICAgICAgIENDS01DUzJGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDEKKwkgICAgVUlOVDMyICAgICAgIENDS01DUzNGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDIKKwkgICAgVUlOVDMyICAgICAgIHJzdjoxNjsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUxHX0ZCS19DRkcxX1NUUlVDLCAqUExHX0ZCS19DRkcxX1NUUlVDOworI2VuZGlmCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy89PT09PT09PT09PT09PT09IFByb3RlY3Rpb24gUGFyYW1hdGVyPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2RlZmluZSBDQ0tfUFJPVF9DRkcJMHgxMzY0CQkvL0NDSyBQcm90ZWN0aW9uCisjZGVmaW5lIEFTSUNfU0hPUlROQVYJCTEKKyNkZWZpbmUgQVNJQ19MT05HTkFWCQkyCisjZGVmaW5lIEFTSUNfUlRTCQkxCisjZGVmaW5lIEFTSUNfQ1RTCQkyCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfUFJPVF9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICByc3Y6NTsKKwkgICAgVUlOVDMyICAgICAgIFJUU1RoRW46MTsJLy9SVFMgdGhyZXNob2xkIGVuYWJsZSBvbiBDQ0sgVFgKKwkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd0dGNDA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KKwkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd0dGMjA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KKwkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd01NNDA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KKwkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd01NMjA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuIDA6ZGlzYWxsb3cuCisJICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dPZmRtOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCisJICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dDY2s6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KKwkgICAgVUlOVDMyICAgICAgIFByb3RlY3ROYXY6MjsJLy9UWE9QIHByb3RlY3Rpb24gdHlwZSBmb3IgQ0NLIFRYLiAwOk5vbmUsIDE6U2hvcnROQVZwcm90ZWN0LCAgMjpMb25nTkFWUHJvdGVjdCwgMzpyc3YKKwkgICAgVUlOVDMyICAgICAgIFByb3RlY3RDdHJsOjI7CS8vUHJvdGVjdGlvbiBjb250cm9sIGZyYW1lIHR5cGUgZm9yIENDSyBUWC4gMTpSVFMvQ1RTLCAyOkNUUy10by1zZWxmLCAwOk5vbmUsIDM6cnN2CisJICAgIFVJTlQzMiAgICAgICBQcm90ZWN0UmF0ZToxNjsJLy9Qcm90ZWN0aW9uIGNvbnRyb2wgZnJhbWUgcmF0ZSBmb3IgQ0NLIFRYKFJUUy9DVFMvQ0ZFbmQpLgorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUFJPVF9DRkdfU1RSVUMsICpQUFJPVF9DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUFJPVF9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICBQcm90ZWN0UmF0ZToxNjsJLy9Qcm90ZWN0aW9uIGNvbnRyb2wgZnJhbWUgcmF0ZSBmb3IgQ0NLIFRYKFJUUy9DVFMvQ0ZFbmQpLgorCSAgICBVSU5UMzIgICAgICAgUHJvdGVjdEN0cmw6MjsJLy9Qcm90ZWN0aW9uIGNvbnRyb2wgZnJhbWUgdHlwZSBmb3IgQ0NLIFRYLiAxOlJUUy9DVFMsIDI6Q1RTLXRvLXNlbGYsIDA6Tm9uZSwgMzpyc3YKKwkgICAgVUlOVDMyICAgICAgIFByb3RlY3ROYXY6MjsJLy9UWE9QIHByb3RlY3Rpb24gdHlwZSBmb3IgQ0NLIFRYLiAwOk5vbmUsIDE6U2hvcnROQVZwcm90ZWN0LCAgMjpMb25nTkFWUHJvdGVjdCwgMzpyc3YKKwkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd0NjazoxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LgorCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93T2ZkbToxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LgorCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93TU0yMDoxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4gMDpkaXNhbGxvdy4KKwkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd01NNDA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KKwkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd0dGMjA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KKwkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd0dGNDA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KKwkgICAgVUlOVDMyICAgICAgIFJUU1RoRW46MTsJLy9SVFMgdGhyZXNob2xkIGVuYWJsZSBvbiBDQ0sgVFgKKwkgICAgVUlOVDMyICAgICAgIHJzdjo1OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUFJPVF9DRkdfU1RSVUMsICpQUFJPVF9DRkdfU1RSVUM7CisjZW5kaWYKKworI2RlZmluZSBPRkRNX1BST1RfQ0ZHCTB4MTM2OAkJLy9PRkRNIFByb3RlY3Rpb24KKyNkZWZpbmUgTU0yMF9QUk9UX0NGRwkweDEzNkMJCS8vTU0yMCBQcm90ZWN0aW9uCisjZGVmaW5lIE1NNDBfUFJPVF9DRkcJMHgxMzcwCQkvL01NNDAgUHJvdGVjdGlvbgorI2RlZmluZSBHRjIwX1BST1RfQ0ZHCTB4MTM3NAkJLy9HRjIwIFByb3RlY3Rpb24KKyNkZWZpbmUgR0Y0MF9QUk9UX0NGRwkweDEzNzgJCS8vR1I0MCBQcm90ZWN0aW9uCisjZGVmaW5lIEVYUF9DVFNfVElNRQkweDEzN0MJCS8vCisjZGVmaW5lIEVYUF9BQ0tfVElNRQkweDEzODAJCS8vCisKKy8vCisvLyAgNC40IE1BQyBSWCBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAob2Zmc2V0OjB4MTQwMCkKKy8vCisjZGVmaW5lIFJYX0ZJTFRSX0NGRwkweDE0MDAJCQkvL1RYUlhfQ1NSMAorI2RlZmluZSBBVVRPX1JTUF9DRkcJMHgxNDA0CQkJLy9UWFJYX0NTUjQKKy8vCisvLyBUWFJYX0NTUjQ6IEF1dG8tUmVzcG9uZGVyLworLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmIHVuaW9uIF9BVVRPX1JTUF9DRkdfU1RSVUMgeworIHN0cnVjdCB7CisgICAgIFVJTlQzMiAgICAgICAgOjI0OworICAgICBVSU5UMzIgICAgICAgQWNrQ3RzUHNtQml0OjE7ICAgLy8gUG93ZXIgYml0IHZhbHVlIGluIGNvbnJ0cm9sIGZyYW1lCisgICAgIFVJTlQzMiAgICAgICBEdWFsQ1RTRW46MTsgICAvLyBQb3dlciBiaXQgdmFsdWUgaW4gY29ucnRyb2wgZnJhbWUKKyAgICAgVUlOVDMyICAgICAgIHJzdjoxOyAgIC8vIFBvd2VyIGJpdCB2YWx1ZSBpbiBjb25ydHJvbCBmcmFtZQorICAgICBVSU5UMzIgICAgICAgQXV0b1Jlc3BvbmRlclByZWFtYmxlOjE7ICAgIC8vIDA6bG9uZywgMTpzaG9ydCBwcmVhbWJsZQorICAgICBVSU5UMzIgICAgICAgQ1RTNDBNUmVmOjE7ICAvLyBSZXNwb25zZSBDVFMgNDBNSHogZHVwbGljYXRlIG1vZGUKKyAgICAgVUlOVDMyICAgICAgIENUUzQwTU1vZGU6MTsgIC8vIFJlc3BvbnNlIENUUyA0ME1IeiBkdXBsaWNhdGUgbW9kZQorICAgICBVSU5UMzIgICAgICAgQkFDQWNrUG9saWN5RW5hYmxlOjE7ICAgIC8vIDA6bG9uZywgMTpzaG9ydCBwcmVhbWJsZQorICAgICBVSU5UMzIgICAgICAgQXV0b1Jlc3BvbmRlckVuYWJsZToxOworIH0gZmllbGQ7CisgVUlOVDMyICAgd29yZDsKK30gQVVUT19SU1BfQ0ZHX1NUUlVDLCAqUEFVVE9fUlNQX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmIHVuaW9uIF9BVVRPX1JTUF9DRkdfU1RSVUMgeworIHN0cnVjdCB7CisgICAgIFVJTlQzMiAgICAgICBBdXRvUmVzcG9uZGVyRW5hYmxlOjE7CisgICAgIFVJTlQzMiAgICAgICBCQUNBY2tQb2xpY3lFbmFibGU6MTsgICAgLy8gMDpsb25nLCAxOnNob3J0IHByZWFtYmxlCisgICAgIFVJTlQzMiAgICAgICBDVFM0ME1Nb2RlOjE7ICAvLyBSZXNwb25zZSBDVFMgNDBNSHogZHVwbGljYXRlIG1vZGUKKyAgICAgVUlOVDMyICAgICAgIENUUzQwTVJlZjoxOyAgLy8gUmVzcG9uc2UgQ1RTIDQwTUh6IGR1cGxpY2F0ZSBtb2RlCisgICAgIFVJTlQzMiAgICAgICBBdXRvUmVzcG9uZGVyUHJlYW1ibGU6MTsgICAgLy8gMDpsb25nLCAxOnNob3J0IHByZWFtYmxlCisgICAgIFVJTlQzMiAgICAgICByc3Y6MTsgICAvLyBQb3dlciBiaXQgdmFsdWUgaW4gY29ucnRyb2wgZnJhbWUKKyAgICAgVUlOVDMyICAgICAgIER1YWxDVFNFbjoxOyAgIC8vIFBvd2VyIGJpdCB2YWx1ZSBpbiBjb25ydHJvbCBmcmFtZQorICAgICBVSU5UMzIgICAgICAgQWNrQ3RzUHNtQml0OjE7ICAgLy8gUG93ZXIgYml0IHZhbHVlIGluIGNvbnJ0cm9sIGZyYW1lCisgICAgIFVJTlQzMiAgICAgICAgOjI0OworIH0gZmllbGQ7CisgVUlOVDMyICAgd29yZDsKK30gQVVUT19SU1BfQ0ZHX1NUUlVDLCAqUEFVVE9fUlNQX0NGR19TVFJVQzsKKyNlbmRpZgorCisjZGVmaW5lIExFR0FDWV9CQVNJQ19SQVRFCTB4MTQwOAkvLyAgVFhSWF9DU1I1ICAgICAgICAgICAweDMwNTQKKyNkZWZpbmUgSFRfQkFTSUNfUkFURQkJMHgxNDBjCisjZGVmaW5lIEhUX0NUUkxfQ0ZHCQkweDE0MTAKKyNkZWZpbmUgU0lGU19DT1NUX0NGRwkJMHgxNDE0CisjZGVmaW5lIFJYX1BBUlNFUl9DRkcJCTB4MTQxOAkvL1NldCBOQVYgZm9yIGFsbCByZWNlaXZlZCBmcmFtZXMKKworLy8KKy8vICA0LjUgTUFDIFNlY3VyaXR5IGNvbmZpZ3VyYXRpb24gKG9mZnNldDoweDE1MDApCisvLworI2RlZmluZSBUWF9TRUNfQ05UMAkJMHgxNTAwCQkvLworI2RlZmluZSBSWF9TRUNfQ05UMAkJMHgxNTA0CQkvLworI2RlZmluZSBDQ01QX0ZDX01VVEUJCTB4MTUwOAkJLy8KKy8vCisvLyAgNC42IEhDQ0EvUFNNUCAob2Zmc2V0OjB4MTYwMCkKKy8vCisjZGVmaW5lIFRYT1BfSExEUl9BRERSMAkJMHgxNjAwCisjZGVmaW5lIFRYT1BfSExEUl9BRERSMQkJMHgxNjA0CisjZGVmaW5lIFRYT1BfSExEUl9FVAkJMHgxNjA4CisjZGVmaW5lIFFPU19DRlBPTExfUkFfRFcwCQkweDE2MGMKKyNkZWZpbmUgUU9TX0NGUE9MTF9BMV9EVzEJCTB4MTYxMAorI2RlZmluZSBRT1NfQ0ZQT0xMX1FDCQkweDE2MTQKKy8vCisvLyAgNC43IE1BQyBTdGF0aXN0aXMgcmVnaXN0ZXJzIChvZmZzZXQ6MHgxNzAwKQorLy8KKyNkZWZpbmUgUlhfU1RBX0NOVDAJCTB4MTcwMAkJLy8KKyNkZWZpbmUgUlhfU1RBX0NOVDEJCTB4MTcwNAkJLy8KKyNkZWZpbmUgUlhfU1RBX0NOVDIJCTB4MTcwOAkJLy8KKworLy8KKy8vIFJYX1NUQV9DTlQwX1NUUlVDOiBSWCBQTENQIGVycm9yIGNvdW50ICYgUlggQ1JDIGVycm9yIGNvdW50CisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1JYX1NUQV9DTlQwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIFBoeUVycjsKKwkgICAgVVNIT1JUICBDcmNFcnI7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlSWF9TVEFfQ05UMF9TVFJVQywgKlBSWF9TVEFfQ05UMF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9SWF9TVEFfQ05UMF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBDcmNFcnI7CisJICAgIFVTSE9SVCAgUGh5RXJyOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUlhfU1RBX0NOVDBfU1RSVUMsICpQUlhfU1RBX0NOVDBfU1RSVUM7CisjZW5kaWYKKworLy8KKy8vIFJYX1NUQV9DTlQxX1NUUlVDOiBSWCBGYWxzZSBDQ0EgY291bnQgJiBSWCBMT05HIGZyYW1lIGNvdW50CisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1JYX1NUQV9DTlQxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIFBsY3BFcnI7CisJICAgIFVTSE9SVCAgRmFsc2VDY2E7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlSWF9TVEFfQ05UMV9TVFJVQywgKlBSWF9TVEFfQ05UMV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9SWF9TVEFfQ05UMV9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBGYWxzZUNjYTsKKwkgICAgVVNIT1JUICBQbGNwRXJyOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUlhfU1RBX0NOVDFfU1RSVUMsICpQUlhfU1RBX0NOVDFfU1RSVUM7CisjZW5kaWYKKworLy8KKy8vIFJYX1NUQV9DTlQyX1NUUlVDOgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9SWF9TVEFfQ05UMl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBSeEZpZm9PdmVyZmxvd0NvdW50OworCSAgICBVU0hPUlQgIFJ4RHVwbGlDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJYX1NUQV9DTlQyX1NUUlVDLCAqUFJYX1NUQV9DTlQyX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1JYX1NUQV9DTlQyX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIFJ4RHVwbGlDb3VudDsKKwkgICAgVVNIT1JUICBSeEZpZm9PdmVyZmxvd0NvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUlhfU1RBX0NOVDJfU1RSVUMsICpQUlhfU1RBX0NOVDJfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgVFhfU1RBX0NOVDAJCTB4MTcwQwkJLy8KKy8vCisvLyBTVEFfQ1NSMzogVFggQmVhY29uIGNvdW50CisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1RYX1NUQV9DTlQwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIFR4QmVhY29uQ291bnQ7CisJICAgIFVTSE9SVCAgVHhGYWlsQ291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9TVEFfQ05UMF9TVFJVQywgKlBUWF9TVEFfQ05UMF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9UWF9TVEFfQ05UMF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBUeEZhaWxDb3VudDsKKwkgICAgVVNIT1JUICBUeEJlYWNvbkNvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfU1RBX0NOVDBfU1RSVUMsICpQVFhfU1RBX0NOVDBfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgVFhfU1RBX0NOVDEJCTB4MTcxMAkJLy8KKy8vCisvLyBUWF9TVEFfQ05UMTogVFggdHggY291bnQKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfU1RBX0NOVDFfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgVHhSZXRyYW5zbWl0OworCSAgICBVU0hPUlQgIFR4U3VjY2VzczsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1NUQV9DTlQxX1NUUlVDLCAqUFRYX1NUQV9DTlQxX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1RYX1NUQV9DTlQxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIFR4U3VjY2VzczsKKwkgICAgVVNIT1JUICBUeFJldHJhbnNtaXQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9TVEFfQ05UMV9TVFJVQywgKlBUWF9TVEFfQ05UMV9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBUWF9TVEFfQ05UMgkJMHgxNzE0CQkvLworLy8KKy8vIFRYX1NUQV9DTlQyOiBUWCB0eCBjb3VudAorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9UWF9TVEFfQ05UMl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBUeFVuZGVyRmxvd0NvdW50OworCSAgICBVU0hPUlQgIFR4WmVyb0xlbkNvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfU1RBX0NOVDJfU1RSVUMsICpQVFhfU1RBX0NOVDJfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfU1RBX0NOVDJfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgVHhaZXJvTGVuQ291bnQ7CisJICAgIFVTSE9SVCAgVHhVbmRlckZsb3dDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1NUQV9DTlQyX1NUUlVDLCAqUFRYX1NUQV9DTlQyX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFRYX1NUQV9GSUZPCQkweDE3MTgJCS8vCisvLworLy8gVFhfU1RBX0ZJRk9fU1RSVUM6IFRYIFJlc3VsdCBmb3Igc3BlY2lmaWMgUElEIHN0YXR1cyBmaWZvIHJlZ2lzdGVyCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24gUEFDS0VEIF9UWF9TVEFfRklGT19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlSZXNlcnZlOjI7CisJCVVJTlQzMgkJVHhCRjoxOyAvLyAzKjMKKwkJVUlOVDMyCQlTdWNjZXNzUmF0ZToxMzsJLy9pbmNsdWRlIE1DUywgbW9kZSAsc2hvcnRHSSwgQlcgc2V0dGluZ1NhbWUgZm9ybWF0IGFzIFRYV0kgV29yZCAwIEJpdCAzMS0xNi4KKy8vCQlVSU5UMzIJCVN1Y2Nlc3NSYXRlOjE2OwkvL2luY2x1ZGUgTUNTLCBtb2RlICxzaG9ydEdJLCBCVyBzZXR0aW5nU2FtZSBmb3JtYXQgYXMgVFhXSSBXb3JkIDAgQml0IDMxLTE2LgorCQlVSU5UMzIJCXdjaWQ6ODsJCS8vd2lyZWxlc3MgY2xpZW50IGluZGV4CisJCVVJTlQzMiAgICAgICAJVHhBY2tSZXF1aXJlZDoxOyAgICAvLyBhY2sgcmVxdWlyZWQKKwkJVUlOVDMyICAgICAgIAlUeEFnZ3JlOjE7ICAgIC8vIFR4IGlzIGFnZ3JlZ2F0ZWQKKwkJVUlOVDMyICAgICAgIAlUeFN1Y2Nlc3M6MTsgICAvLyBUeCBzdWNjZXNzLiB3aGV0aGVyIHN1Y2Nlc3Mgb3Igbm90CisJCVVJTlQzMiAgICAgICAJUGlkVHlwZTo0OworCQlVSU5UMzIgICAgICAgCWJWYWxpZDoxOyAgIC8vIDE6VGhpcyByZWdpc3RlciBjb250YWlucyBhIHZhbGlkIFRYIHJlc3VsdAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfU1RBX0ZJRk9fU1RSVUMsICpQVFhfU1RBX0ZJRk9fU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbiBQQUNLRUQgX1RYX1NUQV9GSUZPX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIgICAgICAgCWJWYWxpZDoxOyAgIC8vIDE6VGhpcyByZWdpc3RlciBjb250YWlucyBhIHZhbGlkIFRYIHJlc3VsdAorCQlVSU5UMzIgICAgICAgCVBpZFR5cGU6NDsKKwkJVUlOVDMyICAgICAgIAlUeFN1Y2Nlc3M6MTsgICAvLyBUeCBObyByZXRyeSBzdWNjZXNzCisJCVVJTlQzMiAgICAgICAJVHhBZ2dyZToxOyAgICAvLyBUeCBSZXRyeSBTdWNjZXNzCisJCVVJTlQzMiAgICAgICAJVHhBY2tSZXF1aXJlZDoxOyAgICAvLyBUeCBmYWlsCisJCVVJTlQzMgkJd2NpZDo4OwkJLy93aXJlbGVzcyBjbGllbnQgaW5kZXgKKy8vCQlVSU5UMzIJCVN1Y2Nlc3NSYXRlOjE2OwkvL2luY2x1ZGUgTUNTLCBtb2RlICxzaG9ydEdJLCBCVyBzZXR0aW5nU2FtZSBmb3JtYXQgYXMgVFhXSSBXb3JkIDAgQml0IDMxLTE2LgorCQlVSU5UMzIJCVN1Y2Nlc3NSYXRlOjEzOwkvL2luY2x1ZGUgTUNTLCBtb2RlICxzaG9ydEdJLCBCVyBzZXR0aW5nU2FtZSBmb3JtYXQgYXMgVFhXSSBXb3JkIDAgQml0IDMxLTE2LgorCQlVSU5UMzIJCVR4QkY6MTsKKwkJVUlOVDMyCQlSZXNlcnZlOjI7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9TVEFfRklGT19TVFJVQywgKlBUWF9TVEFfRklGT19TVFJVQzsKKyNlbmRpZgorLy8gRGVidWcgY291bnRlcgorI2RlZmluZSBUWF9BR0dfQ05UCTB4MTcxYworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlRfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnVHhDb3VudDsKKwkgICAgVVNIT1JUICBOb25BZ2dUeENvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVF9TVFJVQywgKlBUWF9BR0dfQ05UX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlRfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgTm9uQWdnVHhDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dUeENvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVF9TVFJVQywgKlBUWF9BR0dfQ05UX1NUUlVDOworI2VuZGlmCisvLyBEZWJ1ZyBjb3VudGVyCisjZGVmaW5lIFRYX0FHR19DTlQwCTB4MTcyMAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1NpemUyQ291bnQ7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTFDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlQwX1NUUlVDLCAqUFRYX0FHR19DTlQwX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1NpemUxQ291bnQ7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTJDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlQwX1NUUlVDLCAqUFRYX0FHR19DTlQwX1NUUlVDOworI2VuZGlmCisvLyBEZWJ1ZyBjb3VudGVyCisjZGVmaW5lIFRYX0FHR19DTlQxCTB4MTcyNAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1NpemU0Q291bnQ7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTNDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlQxX1NUUlVDLCAqUFRYX0FHR19DTlQxX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1NpemUzQ291bnQ7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTRDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlQxX1NUUlVDLCAqUFRYX0FHR19DTlQxX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFRYX0FHR19DTlQyCTB4MTcyOAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQyX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1NpemU2Q291bnQ7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTVDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlQyX1NUUlVDLCAqUFRYX0FHR19DTlQyX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQyX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1NpemU1Q291bnQ7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTZDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlQyX1NUUlVDLCAqUFRYX0FHR19DTlQyX1NUUlVDOworI2VuZGlmCisvLyBEZWJ1ZyBjb3VudGVyCisjZGVmaW5lIFRYX0FHR19DTlQzCTB4MTcyYworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQzX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1NpemU4Q291bnQ7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTdDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlQzX1NUUlVDLCAqUFRYX0FHR19DTlQzX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQzX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1NpemU3Q291bnQ7CisJICAgIFVTSE9SVCAgQWdnU2l6ZThDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlQzX1NUUlVDLCAqUFRYX0FHR19DTlQzX1NUUlVDOworI2VuZGlmCisvLyBEZWJ1ZyBjb3VudGVyCisjZGVmaW5lIFRYX0FHR19DTlQ0CTB4MTczMAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQ0X1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1NpemUxMENvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemU5Q291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UNF9TVFJVQywgKlBUWF9BR0dfQ05UNF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UNF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplOUNvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemUxMENvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDRfU1RSVUMsICpQVFhfQUdHX0NOVDRfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgVFhfQUdHX0NOVDUJMHgxNzM0CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDVfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTEyQ291bnQ7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTExQ291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UNV9TVFJVQywgKlBUWF9BR0dfQ05UNV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UNV9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplMTFDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplMTJDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlQ1X1NUUlVDLCAqUFRYX0FHR19DTlQ1X1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFRYX0FHR19DTlQ2CQkweDE3MzgKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UNl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplMTRDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplMTNDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlQ2X1NUUlVDLCAqUFRYX0FHR19DTlQ2X1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQ2X1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1NpemUxM0NvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemUxNENvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDZfU1RSVUMsICpQVFhfQUdHX0NOVDZfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgVFhfQUdHX0NOVDcJCTB4MTczYworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQ3X1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1NpemUxNkNvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemUxNUNvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDdfU1RSVUMsICpQVFhfQUdHX0NOVDdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTE1Q291bnQ7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTE2Q291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UN19TVFJVQywgKlBUWF9BR0dfQ05UN19TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBNUERVX0RFTlNJVFlfQ05UCQkweDE3NDAKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9NUERVX0RFTl9DTlRfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgUlhaZXJvRGVsQ291bnQ7CS8vUlggemVybyBsZW5ndGggZGVsaW1pdGVyIGNvdW50CisJICAgIFVTSE9SVCAgVFhaZXJvRGVsQ291bnQ7CS8vVFggemVybyBsZW5ndGggZGVsaW1pdGVyIGNvdW50CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlNUERVX0RFTl9DTlRfU1RSVUMsICpQTVBEVV9ERU5fQ05UX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX01QRFVfREVOX0NOVF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBUWFplcm9EZWxDb3VudDsJLy9UWCB6ZXJvIGxlbmd0aCBkZWxpbWl0ZXIgY291bnQKKwkgICAgVVNIT1JUICBSWFplcm9EZWxDb3VudDsJLy9SWCB6ZXJvIGxlbmd0aCBkZWxpbWl0ZXIgY291bnQKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CU1QRFVfREVOX0NOVF9TVFJVQywgKlBNUERVX0RFTl9DTlRfU1RSVUM7CisjZW5kaWYKKy8vCisvLyBUWFJYIGNvbnRyb2wgcmVnaXN0ZXJzIC0gYmFzZSBhZGRyZXNzIDB4MzAwMAorLy8KKy8vIHJ0Mjg2MGIgIFVOS05PV04gcmVnIHVzZSBSL08gUmVnIEFkZHIgMHg3N2QwIGZpcnN0Li4KKyNkZWZpbmUgVFhSWF9DU1IxICAgICAgICAgICAweDc3ZDAKKworLy8KKy8vIFNlY3VyaXR5IGtleSB0YWJsZSBtZW1vcnksIGJhc2UgYWRkcmVzcyA9IDB4MTAwMAorLy8KKyNkZWZpbmUgTUFDX1dDSURfQkFTRQkJMHgxODAwIC8vOC1ieXRlcyh1c2Ugb25seSA2LWJ5dGVzKSAqIDI1NiBlbnRyeSA9CisjZGVmaW5lIEhXX1dDSURfRU5UUllfU0laRSAgIDgKKyNkZWZpbmUgUEFJUldJU0VfS0VZX1RBQkxFX0JBU0UgICAgIDB4NDAwMCAgICAgIC8vIDMyLWJ5dGUgKiAyNTYtZW50cnkgPSAgLWJ5dGUKKyNkZWZpbmUgSFdfS0VZX0VOVFJZX1NJWkUgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgUEFJUldJU0VfSVZFSVZfVEFCTEVfQkFTRSAgICAgMHg2MDAwICAgICAgLy8gOC1ieXRlICogMjU2LWVudHJ5ID0gIC1ieXRlCisjZGVmaW5lIE1BQ19JVkVJVl9UQUJMRV9CQVNFICAgICAweDYwMDAgICAgICAvLyA4LWJ5dGUgKiAyNTYtZW50cnkgPSAgLWJ5dGUKKyNkZWZpbmUgSFdfSVZFSVZfRU5UUllfU0laRSAgIDgKKyNkZWZpbmUgTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgICAgIDB4NjgwMCAgICAgIC8vIDQtYnl0ZSAqIDI1Ni1lbnRyeSA9ICAtYnl0ZQorI2RlZmluZSBIV19XQ0lEX0FUVFJJX1NJWkUgICA0CisjZGVmaW5lIFdDSURfUkVTRVJWRUQgICAgICAgICAgCQkweDZiZmMKKyNkZWZpbmUgU0hBUkVEX0tFWV9UQUJMRV9CQVNFICAgICAgIDB4NmMwMCAgICAgIC8vIDMyLWJ5dGUgKiAxNi1lbnRyeSA9IDUxMi1ieXRlCisjZGVmaW5lIFNIQVJFRF9LRVlfTU9ERV9CQVNFICAgICAgIDB4NzAwMCAgICAgIC8vIDMyLWJ5dGUgKiAxNi1lbnRyeSA9IDUxMi1ieXRlCisjZGVmaW5lIEhXX1NIQVJFRF9LRVlfTU9ERV9TSVpFICAgNAorI2RlZmluZSBTSEFSRURLRVlUQUJMRQkJCTAKKyNkZWZpbmUgUEFJUldJU0VLRVlUQUJMRQkJCTEKKworCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfU0hBUkVES0VZX01PREVfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMiAgICAgICA6MTsKKwkJVUlOVDMyICAgICAgIEJzczFLZXkzQ2lwaGVyQWxnOjM7CisJCVVJTlQzMiAgICAgICA6MTsKKwkJVUlOVDMyICAgICAgIEJzczFLZXkyQ2lwaGVyQWxnOjM7CisJCVVJTlQzMiAgICAgICA6MTsKKwkJVUlOVDMyICAgICAgIEJzczFLZXkxQ2lwaGVyQWxnOjM7CisJCVVJTlQzMiAgICAgICA6MTsKKwkJVUlOVDMyICAgICAgIEJzczFLZXkwQ2lwaGVyQWxnOjM7CisJCVVJTlQzMiAgICAgICA6MTsKKwkJVUlOVDMyICAgICAgIEJzczBLZXkzQ2lwaGVyQWxnOjM7CisJCVVJTlQzMiAgICAgICA6MTsKKwkJVUlOVDMyICAgICAgIEJzczBLZXkyQ2lwaGVyQWxnOjM7CisJCVVJTlQzMiAgICAgICA6MTsKKwkJVUlOVDMyICAgICAgIEJzczBLZXkxQ2lwaGVyQWxnOjM7CisJCVVJTlQzMiAgICAgICA6MTsKKwkJVUlOVDMyICAgICAgIEJzczBLZXkwQ2lwaGVyQWxnOjM7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlTSEFSRURLRVlfTU9ERV9TVFJVQywgKlBTSEFSRURLRVlfTU9ERV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9TSEFSRURLRVlfTU9ERV9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyICAgICAgIEJzczBLZXkwQ2lwaGVyQWxnOjM7CisJCVVJTlQzMiAgICAgICA6MTsKKwkJVUlOVDMyICAgICAgIEJzczBLZXkxQ2lwaGVyQWxnOjM7CisJCVVJTlQzMiAgICAgICA6MTsKKwkJVUlOVDMyICAgICAgIEJzczBLZXkyQ2lwaGVyQWxnOjM7CisJCVVJTlQzMiAgICAgICA6MTsKKwkJVUlOVDMyICAgICAgIEJzczBLZXkzQ2lwaGVyQWxnOjM7CisJCVVJTlQzMiAgICAgICA6MTsKKwkJVUlOVDMyICAgICAgIEJzczFLZXkwQ2lwaGVyQWxnOjM7CisJCVVJTlQzMiAgICAgICA6MTsKKwkJVUlOVDMyICAgICAgIEJzczFLZXkxQ2lwaGVyQWxnOjM7CisJCVVJTlQzMiAgICAgICA6MTsKKwkJVUlOVDMyICAgICAgIEJzczFLZXkyQ2lwaGVyQWxnOjM7CisJCVVJTlQzMiAgICAgICA6MTsKKwkJVUlOVDMyICAgICAgIEJzczFLZXkzQ2lwaGVyQWxnOjM7CisJCVVJTlQzMiAgICAgICA6MTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVNIQVJFREtFWV9NT0RFX1NUUlVDLCAqUFNIQVJFREtFWV9NT0RFX1NUUlVDOworI2VuZGlmCisvLyA2NC1lbnRyeSBmb3IgcGFpcndpc2Uga2V5IHRhYmxlCit0eXBlZGVmIHN0cnVjdCBfSFdfV0NJRF9FTlRSWSB7ICAvLyA4LWJ5dGUgcGVyIGVudHJ5CisgICAgVUNIQVIgICBBZGRyZXNzWzZdOworICAgIFVDSEFSICAgUnN2WzJdOworfSBIV19XQ0lEX0VOVFJZLCBQSFdfV0NJRF9FTlRSWTsKKworCisKKy8vCisvLyBPdGhlciBvbi1jaGlwIHNoYXJlZCBtZW1vcnkgc3BhY2UsIGJhc2UgPSAweDIwMDAKKy8vCisKKy8vIENJUyBzcGFjZSAtIGJhc2UgYWRkcmVzcyA9IDB4MjAwMAorI2RlZmluZSBIV19DSVNfQkFTRSAgICAgICAgICAgICAweDIwMDAKKworLy8gQ2Fycmllci1zZW5zZSBDVFMgZnJhbWUgYmFzZSBhZGRyZXNzLiBJdCdzIHdoZXJlIG1hYyBzdG9yZXMgY2Fycmllci1zZW5zZSBmcmFtZSBmb3IgY2Fycmllci1zZW5zZSBmdW5jdGlvbi4KKyNkZWZpbmUgSFdfQ1NfQ1RTX0JBU0UJCQkweDc3MDAKKy8vIERGUyBDVFMgZnJhbWUgYmFzZSBhZGRyZXNzLiBJdCdzIHdoZXJlIG1hYyBzdG9yZXMgQ1RTIGZyYW1lIGZvciBERlMuCisjZGVmaW5lIEhXX0RGU19DVFNfQkFTRQkJCTB4Nzc4MAorI2RlZmluZSBIV19DVFNfRlJBTUVfU0laRQkJMHg4MAorCisvLyAyMDA0LTExLTA4IGpvaG4gLSBzaW5jZSBOVUxMIGZyYW1lIHdvbid0IGJlIHRoYXQgbG9uZyAoMjU2IGJ5dGUpLiBXZSBzdGVhbCAxNiB0YWlsIGJ5dGVzCisvLyB0byBzYXZlIGRlYnVnZ2luZyBzZXR0aW5ncworI2RlZmluZSBIV19ERUJVR19TRVRUSU5HX0JBU0UgICAweDc3ZjAgIC8vIDB4NzdmMH4weDc3ZmYgdG90YWwgMTYgYnl0ZXMKKyNkZWZpbmUgSFdfREVCVUdfU0VUVElOR19CQVNFMiAgIDB4Nzc3MCAgLy8gMHg3N2YwfjB4NzdmZiB0b3RhbCAxNiBieXRlcworCisvLyBJbiBvcmRlciB0byBzdXBwb3J0IG1heGltdW0gOCBNQlNTIGFuZCBpdHMgbWF4aW11bSBsZW5ndGggaXMgNTEyIGZvciBlYWNoIGJlYWNvbgorLy8gVGhyZWUgc2VjdGlvbiBkaXNjb250aW51ZSBtZW1vcnkgc2VnbWVudHMgd2lsbCBiZSB1c2VkLgorLy8gMS4gVGhlIG9yaWdpbmFsIHJlZ2lvbiBmb3IgQkNOIDB+MworLy8gMi4gRXh0cmFjdCBtZW1vcnkgZnJvbSBGQ0UgdGFibGUgZm9yIEJDTiA0fjUKKy8vIDMuIEV4dHJhY3QgbWVtb3J5IGZyb20gUGFpci13aXNlIGtleSB0YWJsZSBmb3IgQkNOIDZ+NworLy8JICBJdCBvY2N1cGllZCB0aG9zZSBtZW1vcnkgb2Ygd2NpZCAyMzh+MjUzIGZvciBCQ04gNgorLy8JCQkJCQkgICAgICBhbmQgd2NpZCAyMjJ+MjM3IGZvciBCQ04gNworI2RlZmluZSBIV19CRUFDT05fTUFYX1NJWkUgICAgICAweDEwMDAgLyogdW5pdDogYnl0ZSAqLworI2RlZmluZSBIV19CRUFDT05fQkFTRTAgICAgICAgICAweDc4MDAKKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0UxICAgICAgICAgMHg3QTAwCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFMiAgICAgICAgIDB4N0MwMAorI2RlZmluZSBIV19CRUFDT05fQkFTRTMgICAgICAgICAweDdFMDAKKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0U0ICAgICAgICAgMHg3MjAwCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFNSAgICAgICAgIDB4NzQwMAorI2RlZmluZSBIV19CRUFDT05fQkFTRTYgICAgICAgICAweDVEQzAKKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0U3ICAgICAgICAgMHg1QkMwCisKKyNkZWZpbmUgSFdfQkVBQ09OX01BWF9DT1VOVCAgICAgOAorI2RlZmluZSBIV19CRUFDT05fT0ZGU0VUCQkweDAyMDAKKyNkZWZpbmUgSFdfQkVBQ09OX0NPTlRFTlRfTEVOCShIV19CRUFDT05fT0ZGU0VUIC0gVFhXSV9TSVpFKQorCisvLyBIT1NULU1DVSBzaGFyZWQgbWVtb3J5IC0gYmFzZSBhZGRyZXNzID0gMHgyMTAwCisjZGVmaW5lIEhPU1RfQ01EX0NTUgkJMHg0MDQKKyNkZWZpbmUgSDJNX01BSUxCT1hfQ1NSICAgICAgICAgMHg3MDEwCisjZGVmaW5lIEgyTV9NQUlMQk9YX0NJRCAgICAgICAgIDB4NzAxNAorI2RlZmluZSBIMk1fTUFJTEJPWF9TVEFUVVMgICAgICAweDcwMWMKKyNkZWZpbmUgSDJNX0lOVF9TUkMgICAgICAgICAgICAgMHg3MDI0CisjZGVmaW5lIEgyTV9CQlBfQUdFTlQgICAgICAgICAgIDB4NzAyOAorI2RlZmluZSBNMkhfQ01EX0RPTkVfQ1NSICAgICAgICAweDAwMGMKKyNkZWZpbmUgTUNVX1RYT1BfQVJSQVlfQkFTRSAgICAgMHgwMDBjICAgLy8gVE9ETzogdG8gYmUgcHJvdmlkZWQgYnkgQWxiZXJ0CisjZGVmaW5lIE1DVV9UWE9QX0VOVFJZX1NJWkUgICAgIDMyICAgICAgIC8vIFRPRE86IHRvIGJlIHByb3ZpZGVkIGJ5IEFsYmVydAorI2RlZmluZSBNQVhfTlVNX09GX1RYT1BfRU5UUlkgICAxNiAgICAgICAvLyBUT0RPOiBtdXN0IGJlIHNhbWUgd2l0aCA4MDUxIGZpcm13YXJlCisjZGVmaW5lIE1DVV9NQk9YX1ZFUlNJT04gICAgICAgIDB4MDEgICAgIC8vIFRPRE86IHRvIGJlIGNvbmZpcm1lZCBieSBBbGJlcnQKKyNkZWZpbmUgTUNVX01CT1hfVkVSU0lPTl9PRkZTRVQgNSAgICAgICAgLy8gVE9ETzogdG8gYmUgcHJvdmlkZWQgYnkgQWxiZXJ0CisKKy8vCisvLyBIb3N0IERNQSByZWdpc3RlcnMgLSBiYXNlIGFkZHJlc3MgMHgyMDAgLiAgVFgwLTM9RURDQVFpZDAtMywgVFg0PUhDQ0EsIFRYNT1NR01ULAorLy8KKy8vCisvLyAgRE1BIFJJTkcgREVTQ1JJUFRPUgorLy8KKyNkZWZpbmUgRTJQUk9NX0NTUiAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgSU9fQ05UTF9DU1IgICAgICAgICAweDc3ZDAKKworI2lmZGVmIFJUMjg2MAorLy8gODA1MSBmaXJtd2FyZSBpbWFnZSBmb3IgUlQyODYwIC0gYmFzZSBhZGRyZXNzID0gMHg0MDAwCisjZGVmaW5lIEZJUk1XQVJFX0lNQUdFX0JBU0UgICAgIDB4MjAwMAorI2RlZmluZSBNQVhfRklSTVdBUkVfSU1BR0VfU0laRSAweDIwMDAgICAgLy8gOGtieXRlCisjZW5kaWYgLy8gUlQyODYwIC8vCisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gVHggLwlSeCAvIE1nbXQgcmluZyBkZXNjcmlwdG9yIGRlZmluaXRpb24KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gdGhlIGZvbGxvd2luZyBQSUQgdmFsdWVzIGFyZSB1c2VkIHRvIG1hcmsgb3V0Z29pbmcgZnJhbWUgdHlwZSBpbiBUWEQtPlBJRCBzbyB0aGF0CisvLyBwcm9wZXIgVFggc3RhdGlzdGljcyBjYW4gYmUgY29sbGVjdGVkIGJhc2VkIG9uIHRoZXNlIGNhdGVnb3JpZXMKKy8vIGIzLTIgb2YgUElEIGZpZWxkIC0KKyNkZWZpbmUgUElEX01HTVQJCQkweDA1CisjZGVmaW5lIFBJRF9CRUFDT04JCQkweDBjCisjZGVmaW5lIFBJRF9EQVRBX05PUk1BTFVDQVNUCSAJMHgwMgorI2RlZmluZSBQSURfREFUQV9BTVBEVQkgCTB4MDQKKyNkZWZpbmUgUElEX0RBVEFfTk9fQUNLICAgIAkweDA4CisjZGVmaW5lIFBJRF9EQVRBX05PVF9OT1JNX0FDSwkgCTB4MDMKKy8vIHZhbHVlIGRvbWFpbiBvZiBwVHhELT5Ib3N0UUlkICg0LWJpdDogMH4xNSkKKyNkZWZpbmUgUUlEX0FDX0JLICAgICAgICAgICAgICAgMSAgIC8vIG1lZXQgQUNJIGRlZmluaXRpb24gaW4gODAyLjExZQorI2RlZmluZSBRSURfQUNfQkUgICAgICAgICAgICAgICAwICAgLy8gbWVldCBBQ0kgZGVmaW5pdGlvbiBpbiA4MDIuMTFlCisjZGVmaW5lIFFJRF9BQ19WSSAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgUUlEX0FDX1ZPICAgICAgICAgICAgICAgMworI2RlZmluZSBRSURfSENDQSAgICAgICAgICAgICAgICA0CisjZGVmaW5lIE5VTV9PRl9UWF9SSU5HICAgICAgICAgIDUKKyNkZWZpbmUgUUlEX01HTVQgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgUUlEX1JYICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgUUlEX09USEVSICAgICAgICAgICAgICAgMTUKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEJCUCAmIFJGCWRlZmluaXRpb24KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZQlCVVNZCQkgICAgICAgICAgICAgICAgMQorI2RlZmluZQlJRExFCQkgICAgICAgICAgICAgICAgMAorCisjZGVmaW5lCVJGX1IwMAkJCQkJICAgIDAKKyNkZWZpbmUJUkZfUjAxCQkJCQkgICAgMQorI2RlZmluZQlSRl9SMDIJCQkJCSAgICAyCisjZGVmaW5lCVJGX1IwMwkJCQkJICAgIDMKKyNkZWZpbmUJUkZfUjA0CQkJCQkgICAgNAorI2RlZmluZQlSRl9SMDUJCQkJCSAgICA1CisjZGVmaW5lCVJGX1IwNgkJCQkJICAgIDYKKyNkZWZpbmUJUkZfUjA3CQkJCQkgICAgNworI2RlZmluZQlSRl9SMDgJCQkJCSAgICA4CisjZGVmaW5lCVJGX1IwOQkJCQkJICAgIDkKKyNkZWZpbmUJUkZfUjEwCQkJCQkgICAgMTAKKyNkZWZpbmUJUkZfUjExCQkJCQkgICAgMTEKKyNkZWZpbmUJUkZfUjEyCQkJCQkgICAgMTIKKyNkZWZpbmUJUkZfUjEzCQkJCQkgICAgMTMKKyNkZWZpbmUJUkZfUjE0CQkJCQkgICAgMTQKKyNkZWZpbmUJUkZfUjE1CQkJCQkgICAgMTUKKyNkZWZpbmUJUkZfUjE2CQkJCQkgICAgMTYKKyNkZWZpbmUJUkZfUjE3CQkJCQkgICAgMTcKKyNkZWZpbmUJUkZfUjE4CQkJCQkgICAgMTgKKyNkZWZpbmUJUkZfUjE5CQkJCQkgICAgMTkKKyNkZWZpbmUJUkZfUjIwCQkJCQkgICAgMjAKKyNkZWZpbmUJUkZfUjIxCQkJCQkgICAgMjEKKyNkZWZpbmUJUkZfUjIyCQkJCQkgICAgMjIKKyNkZWZpbmUJUkZfUjIzCQkJCQkgICAgMjMKKyNkZWZpbmUJUkZfUjI0CQkJCQkgICAgMjQKKyNkZWZpbmUJUkZfUjI1CQkJCQkgICAgMjUKKyNkZWZpbmUJUkZfUjI2CQkJCQkgICAgMjYKKyNkZWZpbmUJUkZfUjI3CQkJCQkgICAgMjcKKyNkZWZpbmUJUkZfUjI4CQkJCQkgICAgMjgKKyNkZWZpbmUJUkZfUjI5CQkJCQkgICAgMjkKKyNkZWZpbmUJUkZfUjMwCQkJCQkgICAgMzAKKyNkZWZpbmUJUkZfUjMxCQkJCQkgICAgMzEKKworI2RlZmluZQlCQlBfUjAJCQkJCSAgICAwICAvLyB2ZXJzaW9uCisjZGVmaW5lCUJCUF9SMQkJCQkgICAgICAgIDEgIC8vIFRTU0kKKyNkZWZpbmUJQkJQX1IyICAgICAgICAgIAkJCTIgIC8vIFRYIGNvbmZpZ3VyZQorI2RlZmluZSBCQlBfUjMgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBCQlBfUjQgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBCQlBfUjUgICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBCQlBfUjYgICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZQlCQlBfUjE0CQkJICAgICAgICAgICAgMTQgLy8gUlggY29uZmlndXJlCisjZGVmaW5lIEJCUF9SMTYgICAgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBCQlBfUjE3ICAgICAgICAgICAgICAgICAgICAgMTcgLy8gUlggc2Vuc2liaWxpdHkKKyNkZWZpbmUgQkJQX1IxOCAgICAgICAgICAgICAgICAgICAgIDE4CisjZGVmaW5lIEJCUF9SMjEgICAgICAgICAgICAgICAgICAgICAyMQorI2RlZmluZSBCQlBfUjIyICAgICAgICAgICAgICAgICAgICAgMjIKKyNkZWZpbmUgQkJQX1IyNCAgICAgICAgICAgICAgICAgICAgIDI0CisjZGVmaW5lIEJCUF9SMjUgICAgICAgICAgICAgICAgICAgICAyNQorI2RlZmluZSBCQlBfUjQ5ICAgICAgICAgICAgICAgICAgICAgNDkgLy9UU1NJCisjZGVmaW5lIEJCUF9SNTAgICAgICAgICAgICAgICAgICAgICA1MAorI2RlZmluZSBCQlBfUjUxICAgICAgICAgICAgICAgICAgICAgNTEKKyNkZWZpbmUgQkJQX1I1MiAgICAgICAgICAgICAgICAgICAgIDUyCisjZGVmaW5lIEJCUF9SNTUgICAgICAgICAgICAgICAgICAgICA1NQorI2RlZmluZSBCQlBfUjYyICAgICAgICAgICAgICAgICAgICAgNjIgLy8gUnggU1EwIFRocmVzaG9sZCBISUdICisjZGVmaW5lIEJCUF9SNjMgICAgICAgICAgICAgICAgICAgICA2MworI2RlZmluZSBCQlBfUjY0ICAgICAgICAgICAgICAgICAgICAgNjQKKyNkZWZpbmUgQkJQX1I2NSAgICAgICAgICAgICAgICAgICAgIDY1CisjZGVmaW5lIEJCUF9SNjYgICAgICAgICAgICAgICAgICAgICA2NgorI2RlZmluZSBCQlBfUjY3ICAgICAgICAgICAgICAgICAgICAgNjcKKyNkZWZpbmUgQkJQX1I2OCAgICAgICAgICAgICAgICAgICAgIDY4CisjZGVmaW5lIEJCUF9SNjkgICAgICAgICAgICAgICAgICAgICA2OQorI2RlZmluZSBCQlBfUjcwICAgICAgICAgICAgICAgICAgICAgNzAgLy8gUnggQUdDIFNRIENDSyBYY29yciB0aHJlc2hvbGQKKyNkZWZpbmUgQkJQX1I3MyAgICAgICAgICAgICAgICAgICAgIDczCisjZGVmaW5lIEJCUF9SNzUJCQkJCQk3NQorI2RlZmluZSBCQlBfUjc3ICAgICAgICAgICAgICAgICAgICAgNzcKKyNkZWZpbmUgQkJQX1I4MSAgICAgICAgICAgICAgICAgICAgIDgxCisjZGVmaW5lIEJCUF9SODIgICAgICAgICAgICAgICAgICAgICA4MgorI2RlZmluZSBCQlBfUjgzICAgICAgICAgICAgICAgICAgICAgODMKKyNkZWZpbmUgQkJQX1I4NCAgICAgICAgICAgICAgICAgICAgIDg0CisjZGVmaW5lIEJCUF9SODYJCQkJCQk4NgorI2RlZmluZSBCQlBfUjkxCQkJCQkJOTEKKyNkZWZpbmUgQkJQX1I5MgkJCQkJCTkyCisjZGVmaW5lIEJCUF9SOTQgICAgICAgICAgICAgICAgICAgICA5NCAvLyBUeCBHYWluIENvbnRyb2wKKyNkZWZpbmUgQkJQX1IxMDMgICAgICAgICAgICAgICAgICAgIDEwMworI2RlZmluZSBCQlBfUjEwNSAgICAgICAgICAgICAgICAgICAgMTA1CisjZGVmaW5lIEJCUF9SMTEzICAgICAgICAgICAgICAgICAgICAxMTMKKyNkZWZpbmUgQkJQX1IxMTQgICAgICAgICAgICAgICAgICAgIDExNAorI2RlZmluZSBCQlBfUjExNSAgICAgICAgICAgICAgICAgICAgMTE1CisjZGVmaW5lIEJCUF9SMTE2ICAgICAgICAgICAgICAgICAgICAxMTYKKyNkZWZpbmUgQkJQX1IxMTcgICAgICAgICAgICAgICAgICAgIDExNworI2RlZmluZSBCQlBfUjExOCAgICAgICAgICAgICAgICAgICAgMTE4CisjZGVmaW5lIEJCUF9SMTE5ICAgICAgICAgICAgICAgICAgICAxMTkKKyNkZWZpbmUgQkJQX1IxMjAgICAgICAgICAgICAgICAgICAgIDEyMAorI2RlZmluZSBCQlBfUjEyMSAgICAgICAgICAgICAgICAgICAgMTIxCisjZGVmaW5lIEJCUF9SMTIyICAgICAgICAgICAgICAgICAgICAxMjIKKyNkZWZpbmUgQkJQX1IxMjMgICAgICAgICAgICAgICAgICAgIDEyMworCisKKyNkZWZpbmUgQkJQUjk0X0RFRkFVTFQgICAgICAgICAgICAgIDB4MDYgLy8gQWRkIDEgdmFsdWUgd2lsbCBnYWluIDFkYgorCisjZGVmaW5lIFJTU0lfRk9SX1ZFUllfTE9XX1NFTlNJQklMSVRZIC0zNQorI2RlZmluZSBSU1NJX0ZPUl9MT1dfU0VOU0lCSUxJVFkgICAgICAtNTgKKyNkZWZpbmUgUlNTSV9GT1JfTUlEX0xPV19TRU5TSUJJTElUWSAgLTgwCisjZGVmaW5lIFJTU0lfRk9SX01JRF9TRU5TSUJJTElUWSAgICAgIC05MAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVFUFJPTSBkZWZpbml0aW9uCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRUVETyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgRUVESSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgRUVDUyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgRUVTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgRUVSTCAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAKKworI2RlZmluZSBFRVBST01fV1JJVEVfT1BDT0RFICAgICAgICAgMHgwNQorI2RlZmluZSBFRVBST01fUkVBRF9PUENPREUgICAgICAgICAgMHgwNgorI2RlZmluZSBFRVBST01fRVdEU19PUENPREUgICAgICAgICAgMHgxMAorI2RlZmluZSBFRVBST01fRVdFTl9PUENPREUgICAgICAgICAgMHgxMworCisjZGVmaW5lCU5VTV9FRVBST01fQkJQX1BBUk1TCQkxOQkJCS8vIEluY2x1ZGUgTklDIENvbmZpZyAwLCAxLCBDUiwgVFggQUxDIHN0ZXAsIEJCUHMKKyNkZWZpbmUJTlVNX0VFUFJPTV9UWF9HX1BBUk1TCQk3CisjZGVmaW5lCUVFUFJPTV9OSUMxX09GRlNFVCAgICAgICAgICAweDM0CQkvLyBUaGUgYWRkcmVzcyBpcyBmcm9tIE5JQyBjb25maWcgMCwgbm90IEJCUCByZWdpc3RlciBJRAorI2RlZmluZQlFRVBST01fTklDMl9PRkZTRVQgICAgICAgICAgMHgzNgkJLy8gVGhlIGFkZHJlc3MgaXMgZnJvbSBOSUMgY29uZmlnIDAsIG5vdCBCQlAgcmVnaXN0ZXIgSUQKKyNkZWZpbmUJRUVQUk9NX0JCUF9CQVNFX09GRlNFVAkJMHhmMAkJLy8gVGhlIGFkZHJlc3MgaXMgZnJvbSBOSUMgY29uZmlnIDAsIG5vdCBCQlAgcmVnaXN0ZXIgSUQKKyNkZWZpbmUJRUVQUk9NX0dfVFhfUFdSX09GRlNFVAkJMHg1MgorI2RlZmluZQlFRVBST01fR19UWDJfUFdSX09GRlNFVAkJMHg2MAorI2RlZmluZSBFRVBST01fTEVEMV9PRkZTRVQJCQkweDNjCisjZGVmaW5lIEVFUFJPTV9MRUQyX09GRlNFVAkJCTB4M2UKKyNkZWZpbmUgRUVQUk9NX0xFRDNfT0ZGU0VUCQkJMHg0MAorI2RlZmluZSBFRVBST01fTE5BX09GRlNFVAkJCTB4NDQKKyNkZWZpbmUgRUVQUk9NX1JTU0lfQkdfT0ZGU0VUCQkweDQ2CisjZGVmaW5lIEVFUFJPTV9SU1NJX0FfT0ZGU0VUCQkweDRhCisjZGVmaW5lIEVFUFJPTV9ERUZJTkVfTUFYX1RYUFdSCQkweDRlCisjZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0JZUkFURV8yME1IWl8yXzRHCTB4ZGUJLy8gMjBNSFogMi40RyB0eCBwb3dlci4KKyNkZWZpbmUgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzQwTUhaXzJfNEcJMHhlZQkvLyA0ME1IWiAyLjRHIHR4IHBvd2VyLgorI2RlZmluZSBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfNUcJCTB4ZmEJLy8gMjBNSFogNUcgdHggcG93ZXIuCisjZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0JZUkFURV80ME1IWl81RwkJMHgxMGEJLy8gNDBNSFogNUcgdHggcG93ZXIuCisjZGVmaW5lIEVFUFJPTV9BX1RYX1BXUl9PRkZTRVQgICAgICAweDc4CisjZGVmaW5lIEVFUFJPTV9BX1RYMl9QV1JfT0ZGU0VUICAgICAgMHhhNgorI2RlZmluZSBFRVBST01fVkVSU0lPTl9PRkZTRVQgICAgICAgMHgwMgorI2RlZmluZQlFRVBST01fRlJFUV9PRkZTRVQJCQkweDNhCisjZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0JZUkFURSAJMHhkZQkvLyAyME1IWiBwb3dlci4KKyNkZWZpbmUgRUVQUk9NX1RYUE9XRVJfREVMVEEJCTB4NTAJLy8gMjBNSFogQU5EIDQwIE1IWiB1c2UgZGlmZmVyZW50IHBvd2VyLiBUaGlzIGlzIGRlbHRhIGluIDQwTUhaLgorI2RlZmluZSBWQUxJRF9FRVBST01fVkVSU0lPTiAgICAgICAgMQorCisvLyBQYWlyS2V5TW9kZSBkZWZpbml0aW9uCisjZGVmaW5lIFBLTU9ERV9OT05FICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFBLTU9ERV9XRVA2NCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFBLTU9ERV9XRVAxMjggICAgICAgICAgICAgICAyCisjZGVmaW5lIFBLTU9ERV9US0lQICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFBLTU9ERV9BRVMgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFBLTU9ERV9DS0lQNjQgICAgICAgICAgICAgICA1CisjZGVmaW5lIFBLTU9ERV9DS0lQMTI4ICAgICAgICAgICAgICA2CisjZGVmaW5lIFBLTU9ERV9US0lQX05PX01JQyAgICAgICAgICA3ICAgICAgIC8vIE1JQyBhcHBlbmRlZCBieSBkcml2ZXI6IG5vdCBhIHZhbGlkIHZhbHVlIGluIGhhcmR3YXJlIGtleSB0YWJsZQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFdDSUQgIGZvcm1hdAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLzcuMQlXQ0lEICBFTlRSWSAgZm9ybWF0ICA6IDhieXRlcwordHlwZWRlZglzdHJ1Y3QJX1dDSURfRU5UUllfU1RSVUMgeworCVVDSEFSCQlSWEJBQml0bWFwNzsgICAgLy8gYml0MCBmb3IgVElEOCwgYml0NyBmb3IgVElEIDE1CisJVUNIQVIJCVJYQkFCaXRtYXAwOyAgICAvLyBiaXQwIGZvciBUSUQwLCBiaXQ3IGZvciBUSUQgNworCVVDSEFSCQlNQUNbNl07CS8vIDAgZm9yIHNoYXJlZCBrZXkgdGFibGUuICAxIGZvciBwYWlyd2lzZSBrZXkgdGFibGUKK30JV0NJRF9FTlRSWV9TVFJVQywgKlBXQ0lEX0VOVFJZX1NUUlVDOworCisvLzguMS4xCVNFQ1VSSVRZICBLRVkgIGZvcm1hdCAgOiA4RFcKKy8vIDMyLWJ5dGUgcGVyIGVudHJ5LCB0b3RhbCAxNi1lbnRyeSBmb3Igc2hhcmVkIGtleSB0YWJsZSwgNjQtZW50cnkgZm9yIHBhaXJ3aXNlIGtleSB0YWJsZQordHlwZWRlZiBzdHJ1Y3QgX0hXX0tFWV9FTlRSWSB7ICAgICAgICAgIC8vIDMyLWJ5dGUgcGVyIGVudHJ5CisgICAgVUNIQVIgICBLZXlbMTZdOworICAgIFVDSEFSICAgVHhNaWNbOF07CisgICAgVUNIQVIgICBSeE1pY1s4XTsKK30gSFdfS0VZX0VOVFJZLCAqUEhXX0tFWV9FTlRSWTsKKworLy84LjEuMglJVi9FSVYgIGZvcm1hdCAgOiAyRFcKKworLy84LjEuMwlSWCBhdHRyaWJ1dGUgZW50cnkgZm9ybWF0ICA6IDFEVworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJc3RydWN0CV9NQUNfQVRUUklCVVRFX1NUUlVDIHsKKwlVSU5UMzIJCXJzdjoyMjsKKwlVSU5UMzIJCVJYV0lVREY6MzsKKwlVSU5UMzIJCUJTU0lESWR4OjM7IC8vbXVsdGlwbGVCU1MgaW5kZXggZm9yIHRoZSBXQ0lECisJVUlOVDMyCQlQYWlyS2V5TW9kZTozOworCVVJTlQzMgkJS2V5VGFiOjE7CS8vIDAgZm9yIHNoYXJlZCBrZXkgdGFibGUuICAxIGZvciBwYWlyd2lzZSBrZXkgdGFibGUKK30JTUFDX0FUVFJJQlVURV9TVFJVQywgKlBNQUNfQVRUUklCVVRFX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJc3RydWN0CV9NQUNfQVRUUklCVVRFX1NUUlVDIHsKKwlVSU5UMzIJCUtleVRhYjoxOwkvLyAwIGZvciBzaGFyZWQga2V5IHRhYmxlLiAgMSBmb3IgcGFpcndpc2Uga2V5IHRhYmxlCisJVUlOVDMyCQlQYWlyS2V5TW9kZTozOworCVVJTlQzMgkJQlNTSURJZHg6MzsgLy9tdWx0aXBsZUJTUyBpbmRleCBmb3IgdGhlIFdDSUQKKwlVSU5UMzIJCVJYV0lVREY6MzsKKwlVSU5UMzIJCXJzdjoyMjsKK30JTUFDX0FUVFJJQlVURV9TVFJVQywgKlBNQUNfQVRUUklCVVRFX1NUUlVDOworI2VuZGlmCisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBUWCAvIFJYIHJpbmcgZGVzY3JpcHRvciBmb3JtYXQKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyB0aGUgZmlyc3QgMjQtYnl0ZSBpbiBUWEQgaXMgY2FsbGVkIFRYSU5GTyBhbmQgd2lsbCBiZSBETUFlZCB0byBNQUMgYmxvY2sgdGhyb3VnaCBUWEZJRk8uCisvLyBNQUMgYmxvY2sgdXNlIHRoaXMgVFhJTkZPIHRvIGNvbnRyb2wgdGhlIHRyYW5zbWlzc2lvbiBiZWhhdmlvciBvZiB0aGlzIGZyYW1lLgorI2RlZmluZSBGSUZPX01HTVQgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgRklGT19IQ0NBICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEZJRk9fRURDQSAgICAgICAgICAgICAgICAgMgorCisvLworLy8gVFggZGVzY3JpcHRvciBmb3JtYXQsIFR4CXJpbmcsIE1nbXQgUmluZworLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXN0cnVjdAlQQUNLRUQgX1RYRF9TVFJVQyB7CisJLy8gV29yZCAwCisJVUlOVDMyCQlTRFB0cjA7CisJLy8gV29yZCAxCisJVUlOVDMyCQlETUFET05FOjE7CisJVUlOVDMyCQlMYXN0U2VjMDoxOworCVVJTlQzMgkJU0RMZW4wOjE0OworCVVJTlQzMgkJQnVyc3Q6MTsKKwlVSU5UMzIJCUxhc3RTZWMxOjE7CisJVUlOVDMyCQlTRExlbjE6MTQ7CisJLy8gV29yZCAyCisJVUlOVDMyCQlTRFB0cjE7CisJLy8gV29yZCAzCisJVUlOVDMyCQlJQ086MTsKKwlVSU5UMzIJCVVDTzoxOworCVVJTlQzMgkJVENPOjE7CisJVUlOVDMyCQlyc3Y6MjsKKwlVSU5UMzIJCVFTRUw6MjsJLy8gc2VsZWN0IG9uLWNoaXAgRklGTyBJRCBmb3IgMm5kLXN0YWdlIG91dHB1dCBzY2hlZHVsZXIuMDpNR01ULCAxOkhDQ0EgMjpFRENBCisJVUlOVDMyCQlXSVY6MTsJLy8gV2lyZWxlc3MgSW5mbyBWYWxpZC4gMSBpZiBEcml2ZXIgYWxyZWFkeSBmaWxsIFdJLCAgbyBpZiBETUEgbmVlZHMgdG8gY29weSBXSSB0byBjb3JyZWN0cG9zaXRpb24KKwlVSU5UMzIJCXJzdjI6MjQ7Cit9CVRYRF9TVFJVQywgKlBUWERfU1RSVUM7CisjZWxzZQordHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9UWERfU1RSVUMgeworCS8vIFdvcmQJMAorCVVJTlQzMgkJU0RQdHIwOworCS8vIFdvcmQJMQorCVVJTlQzMgkJU0RMZW4xOjE0OworCVVJTlQzMgkJTGFzdFNlYzE6MTsKKwlVSU5UMzIJCUJ1cnN0OjE7CisJVUlOVDMyCQlTRExlbjA6MTQ7CisJVUlOVDMyCQlMYXN0U2VjMDoxOworCVVJTlQzMgkJRE1BRE9ORToxOworCS8vV29yZDIKKwlVSU5UMzIJCVNEUHRyMTsKKwkvL1dvcmQzCisJVUlOVDMyCQlyc3YyOjI0OworCVVJTlQzMgkJV0lWOjE7CS8vIFdpcmVsZXNzIEluZm8gVmFsaWQuIDEgaWYgRHJpdmVyIGFscmVhZHkgZmlsbCBXSSwgIG8gaWYgRE1BIG5lZWRzIHRvIGNvcHkgV0kgdG8gY29ycmVjdHBvc2l0aW9uCisJVUlOVDMyCQlRU0VMOjI7CS8vIHNlbGVjdCBvbi1jaGlwIEZJRk8gSUQgZm9yIDJuZC1zdGFnZSBvdXRwdXQgc2NoZWR1bGVyLjA6TUdNVCwgMTpIQ0NBIDI6RURDQQorCVVJTlQzMgkJcnN2OjI7CisJVUlOVDMyCQlUQ086MTsJLy8KKwlVSU5UMzIJCVVDTzoxOwkvLworCVVJTlQzMgkJSUNPOjE7CS8vCit9CVRYRF9TVFJVQywgKlBUWERfU1RSVUM7CisjZW5kaWYKKworCisvLworLy8gVFhEIFdpcmVsZXNzIEluZm9ybWF0aW9uIGZvcm1hdCBmb3IgVHggcmluZyBhbmQgTWdtdCBSaW5nCisvLworLy90eG9wIDogZm9yIHR4b3AgbW9kZQorLy8gMDp0eG9wIGZvciB0aGUgTVBEVSBmcmFtZSB3aWxsIGJlIGhhbmRsZXMgYnkgQVNJQyBieSByZWdpc3RlcgorLy8gMS8yLzM6dGhlIE1QRFUgZnJhbWUgaXMgc2VuZCBhZnRlciBQSUZTL2JhY2tvZmYvU0lGUworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCBfVFhXSV9TVFJVQyB7CisJLy8gV29yZCAwCisJVUlOVDMyCQlQSFlNT0RFOjI7CisJVUlOVDMyCQlUeEJGOjE7CS8vIDMqMworCVVJTlQzMgkJcnN2MjoxOworCVVJTlQzMgkJSWZzOjE7CS8vCisJVUlOVDMyCQlTVEJDOjI7CS8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6CisJVUlOVDMyCQlTaG9ydEdJOjE7CisJVUlOVDMyCQlCVzoxOwkvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegorCVVJTlQzMgkJTUNTOjc7CisKKwlVSU5UMzIJCXJzdjo2OworCVVJTlQzMgkJdHhvcDoyOwkvL3R4IGJhY2sgb2ZmIG1vZGUgMDpIVCBUWE9QIHJ1bGUgLCAxOlBJRlMgVFggLDI6QmFja29mZiwgMzpzaWZzIG9ubHkgd2hlbiBwcmV2aW91cyBmcmFtZSBleGNoYW5nZSBpcyBzdWNjZXNzZnVsLgorCVVJTlQzMgkJTXBkdURlbnNpdHk6MzsKKwlVSU5UMzIJCUFNUERVOjE7CisKKwlVSU5UMzIJCVRTOjE7CisJVUlOVDMyCQlDRkFDSzoxOworCVVJTlQzMgkJTUlNT3BzOjE7CS8vIHRoZSByZW1vdGUgcGVlciBpcyBpbiBkeW5hbWljIE1JTU8tUFMgbW9kZQorCVVJTlQzMgkJRlJBRzoxOwkJLy8gMSB0byBpbmZvcm0gVEtJUCBlbmdpbmUgdGhpcyBpcyBhIGZyYWdtZW50LgorCS8vIFdvcmQgMQorCVVJTlQzMgkJUGFja2V0SWQ6NDsKKwlVSU5UMzIJCU1QRFV0b3RhbEJ5dGVDb3VudDoxMjsKKwlVSU5UMzIJCVdpcmVsZXNzQ2xpSUQ6ODsKKwlVSU5UMzIJCUJBV2luU2l6ZTo2OworCVVJTlQzMgkJTlNFUToxOworCVVJTlQzMgkJQUNLOjE7CisJLy8gV29yZCAyCisJVUlOVDMyCQlJVjsKKwkvLyBXb3JkIDMKKwlVSU5UMzIJCUVJVjsKK30JVFhXSV9TVFJVQywgKlBUWFdJX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCBfVFhXSV9TVFJVQyB7CisJLy8gV29yZAkwCisJVUlOVDMyCQlGUkFHOjE7CQkvLyAxIHRvIGluZm9ybSBUS0lQIGVuZ2luZSB0aGlzIGlzIGEgZnJhZ21lbnQuCisJVUlOVDMyCQlNSU1PcHM6MTsJLy8gdGhlIHJlbW90ZSBwZWVyIGlzIGluIGR5bmFtaWMgTUlNTy1QUyBtb2RlCisJVUlOVDMyCQlDRkFDSzoxOworCVVJTlQzMgkJVFM6MTsKKworCVVJTlQzMgkJQU1QRFU6MTsKKwlVSU5UMzIJCU1wZHVEZW5zaXR5OjM7CisJVUlOVDMyCQl0eG9wOjI7CS8vRk9SICJUSElTIiBmcmFtZS4gMDpIVCBUWE9QIHJ1bGUgLCAxOlBJRlMgVFggLDI6QmFja29mZiwgMzpzaWZzIG9ubHkgd2hlbiBwcmV2aW91cyBmcmFtZSBleGNoYW5nZSBpcyBzdWNjZXNzZnVsLgorCVVJTlQzMgkJcnN2OjY7CisKKwlVSU5UMzIJCU1DUzo3OworCVVJTlQzMgkJQlc6MTsJLy9jaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHoKKwlVSU5UMzIJCVNob3J0R0k6MTsKKwlVSU5UMzIJCVNUQkM6MjsJLy8gMTogU1RCQyBzdXBwb3J0IE1DUyA9MC03LCAgIDIsMyA6IFJFU0VSVkUKKwlVSU5UMzIJCUlmczoxOwkvLworCVVJTlQzMgkJcnN2MjoxOworCVVJTlQzMgkJVHhCRjoxOwkvLyAzKjMKKwlVSU5UMzIJCVBIWU1PREU6MjsKKwkvLyBXb3JkCTEKKwlVSU5UMzIJCUFDSzoxOworCVVJTlQzMgkJTlNFUToxOworCVVJTlQzMgkJQkFXaW5TaXplOjY7CisJVUlOVDMyCQlXaXJlbGVzc0NsaUlEOjg7CisJVUlOVDMyCQlNUERVdG90YWxCeXRlQ291bnQ6MTI7CisJVUlOVDMyCQlQYWNrZXRJZDo0OworCS8vV29yZDIKKwlVSU5UMzIJCUlWOworCS8vV29yZDMKKwlVSU5UMzIJCUVJVjsKK30JVFhXSV9TVFJVQywgKlBUWFdJX1NUUlVDOworI2VuZGlmCisvLworLy8gUnggZGVzY3JpcHRvciBmb3JtYXQsIFJ4CVJpbmcKKy8vCisjaWZkZWYgUlQyODYwCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9SWERfU1RSVUMJeworCS8vIFdvcmQgMAorCVVJTlQzMgkJU0RQMDsKKwkvLyBXb3JkIDEKKwlVSU5UMzIJCURET05FOjE7CisJVUlOVDMyCQlMUzA6MTsKKwlVSU5UMzIJCVNETDA6MTQ7CisJVUlOVDMyCQlSc3Y6MjsKKwlVSU5UMzIJCVNETDE6MTQ7CisJLy8gV29yZCAyCisJVUlOVDMyCQlTRFAxOworCS8vIFdvcmQgMworCVVJTlQzMgkJUnN2MToxMzsKKwlVSU5UMzIJCVBsY3BSc3NpbDoxOy8vIFRvIGJlIG1vdmVkCisJVUlOVDMyCQlQbGNwU2lnbmFsOjE7CQkvLyBUbyBiZSBtb3ZlZAorCVVJTlQzMgkJRGVjcnlwdGVkOjE7CS8vIHRoaXMgZnJhbWUgaXMgYmVpbmcgZGVjcnlwdGVkLgorCVVJTlQzMgkJQU1QRFU6MTsKKwlVSU5UMzIJCUwyUEFEOjE7CisJVUlOVDMyCQlSU1NJOjE7CisJVUlOVDMyCQlIVEM6MTsKKwlVSU5UMzIJCUFNU0RVOjE7CQkvLyByeCB3aXRoIDgwMi4zIGhlYWRlciwgbm90IDgwMi4xMSBoZWFkZXIuIG9ic29sZXRlLgorCVVJTlQzMgkJQ2lwaGVyRXJyOjI7ICAgICAgICAvLyAwOiBkZWNyeXB0aW9uIG9rYXksIDE6SUNWIGVycm9yLCAyOk1JQyBlcnJvciwgMzpLRVkgbm90IHZhbGlkCisJVUlOVDMyCQlDcmM6MTsgICAgICAgICAgICAgIC8vIDE6IENSQyBlcnJvcgorCVVJTlQzMgkJTXlCc3M6MTsgIAkvLyAxOiB0aGlzIGZyYW1lIGJlbG9uZ3MgdG8gdGhlIHNhbWUgQlNTSUQKKwlVSU5UMzIJCUJjYXN0OjE7ICAgICAgICAgICAgLy8gMTogdGhpcyBpcyBhIGJyb2FkY2FzdCBmcmFtZQorCVVJTlQzMgkJTWNhc3Q6MTsgICAgICAgICAgICAvLyAxOiB0aGlzIGlzIGEgbXVsdGljYXN0IGZyYW1lCisJVUlOVDMyCQlVMk06MTsgICAgICAgICAgICAgIC8vIDE6IHRoaXMgUlggZnJhbWUgaXMgdW5pY2FzdCB0byBtZQorCVVJTlQzMgkJRlJBRzoxOworCVVJTlQzMgkJTlVMTERBVEE6MTsKKwlVSU5UMzIJCURBVEE6MTsKKwlVSU5UMzIJCUJBOjE7CisKK30JUlhEX1NUUlVDLCAqUFJYRF9TVFJVQywgUlQyOFhYX1JYRF9TVFJVQywgKlBSVDI4WFhfUlhEX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCBfUlhEX1NUUlVDCXsKKwkvLyBXb3JkCTAKKwlVSU5UMzIJCVNEUDA7CisJLy8gV29yZAkxCisJVUlOVDMyCQlTREwxOjE0OworCVVJTlQzMgkJUnN2OjI7CisJVUlOVDMyCQlTREwwOjE0OworCVVJTlQzMgkJTFMwOjE7CisJVUlOVDMyCQlERE9ORToxOworCS8vIFdvcmQJMgorCVVJTlQzMgkJU0RQMTsKKwkvLyBXb3JkCTMKKwlVSU5UMzIJCUJBOjE7CisJVUlOVDMyCQlEQVRBOjE7CisJVUlOVDMyCQlOVUxMREFUQToxOworCVVJTlQzMgkJRlJBRzoxOworCVVJTlQzMgkJVTJNOjE7ICAgICAgICAgICAgICAvLyAxOiB0aGlzIFJYIGZyYW1lIGlzIHVuaWNhc3QgdG8gbWUKKwlVSU5UMzIJCU1jYXN0OjE7ICAgICAgICAgICAgLy8gMTogdGhpcyBpcyBhIG11bHRpY2FzdCBmcmFtZQorCVVJTlQzMgkJQmNhc3Q6MTsgICAgICAgICAgICAvLyAxOiB0aGlzIGlzIGEgYnJvYWRjYXN0IGZyYW1lCisJVUlOVDMyCQlNeUJzczoxOyAgCS8vIDE6IHRoaXMgZnJhbWUgYmVsb25ncyB0byB0aGUgc2FtZSBCU1NJRAorCVVJTlQzMgkJQ3JjOjE7ICAgICAgICAgICAgICAvLyAxOiBDUkMgZXJyb3IKKwlVSU5UMzIJCUNpcGhlckVycjoyOyAgICAgICAgLy8gMDogZGVjcnlwdGlvbiBva2F5LCAxOklDViBlcnJvciwgMjpNSUMgZXJyb3IsIDM6S0VZIG5vdCB2YWxpZAorCVVJTlQzMgkJQU1TRFU6MTsJCS8vIHJ4IHdpdGggODAyLjMgaGVhZGVyLCBub3QgODAyLjExIGhlYWRlci4KKwlVSU5UMzIJCUhUQzoxOworCVVJTlQzMgkJUlNTSToxOworCVVJTlQzMgkJTDJQQUQ6MTsKKwlVSU5UMzIJCUFNUERVOjE7CisJVUlOVDMyCQlEZWNyeXB0ZWQ6MTsJLy8gdGhpcyBmcmFtZSBpcyBiZWluZyBkZWNyeXB0ZWQuCisJVUlOVDMyCQlQbGNwU2lnbmFsOjE7CQkvLyBUbyBiZSBtb3ZlZAorCVVJTlQzMgkJUGxjcFJzc2lsOjE7Ly8gVG8gYmUgbW92ZWQKKwlVSU5UMzIJCVJzdjE6MTM7Cit9CVJYRF9TVFJVQywgKlBSWERfU1RSVUMsIFJUMjhYWF9SWERfU1RSVUMsICpQUlQyOFhYX1JYRF9TVFJVQzsKKyNlbmRpZgorI2VuZGlmIC8vIFJUMjg2MCAvLworLy8KKy8vIFJYV0kgd2lyZWxlc3MgaW5mb3JtYXRpb24gZm9ybWF0LCBpbiBQQkYuIGludmlzaWJsZSBpbiBkcml2ZXIuCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCBfUlhXSV9TVFJVQyB7CisJLy8gV29yZCAwCisJVUlOVDMyCQlUSUQ6NDsKKwlVSU5UMzIJCU1QRFV0b3RhbEJ5dGVDb3VudDoxMjsKKwlVSU5UMzIJCVVERjozOworCVVJTlQzMgkJQlNTSUQ6MzsKKwlVSU5UMzIJCUtleUluZGV4OjI7CisJVUlOVDMyCQlXaXJlbGVzc0NsaUlEOjg7CisJLy8gV29yZCAxCisJVUlOVDMyCQlQSFlNT0RFOjI7ICAgICAgICAgICAgICAvLyAxOiB0aGlzIFJYIGZyYW1lIGlzIHVuaWNhc3QgdG8gbWUKKwlVSU5UMzIJCXJzdjozOworCVVJTlQzMgkJU1RCQzoyOworCVVJTlQzMgkJU2hvcnRHSToxOworCVVJTlQzMgkJQlc6MTsKKwlVSU5UMzIJCU1DUzo3OworCVVJTlQzMgkJU0VRVUVOQ0U6MTI7CisJVUlOVDMyCQlGUkFHOjQ7CisJLy8gV29yZCAyCisJVUlOVDMyCQlyc3YxOjg7CisJVUlOVDMyCQlSU1NJMjo4OworCVVJTlQzMgkJUlNTSTE6ODsKKwlVSU5UMzIJCVJTU0kwOjg7CisJLy8gV29yZCAzCisJVUlOVDMyCQlyc3YyOjE2OworCVVJTlQzMgkJU05SMTo4OworCVVJTlQzMgkJU05SMDo4OworfQlSWFdJX1NUUlVDLCAqUFJYV0lfU1RSVUM7CisjZWxzZQordHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9SWFdJX1NUUlVDIHsKKwkvLyBXb3JkCTAKKwlVSU5UMzIJCVdpcmVsZXNzQ2xpSUQ6ODsKKwlVSU5UMzIJCUtleUluZGV4OjI7CisJVUlOVDMyCQlCU1NJRDozOworCVVJTlQzMgkJVURGOjM7CisJVUlOVDMyCQlNUERVdG90YWxCeXRlQ291bnQ6MTI7CisJVUlOVDMyCQlUSUQ6NDsKKwkvLyBXb3JkCTEKKwlVSU5UMzIJCUZSQUc6NDsKKwlVSU5UMzIJCVNFUVVFTkNFOjEyOworCVVJTlQzMgkJTUNTOjc7CisJVUlOVDMyCQlCVzoxOworCVVJTlQzMgkJU2hvcnRHSToxOworCVVJTlQzMgkJU1RCQzoyOworCVVJTlQzMgkJcnN2OjM7CisJVUlOVDMyCQlQSFlNT0RFOjI7ICAgICAgICAgICAgICAvLyAxOiB0aGlzIFJYIGZyYW1lIGlzIHVuaWNhc3QgdG8gbWUKKwkvL1dvcmQyCisJVUlOVDMyCQlSU1NJMDo4OworCVVJTlQzMgkJUlNTSTE6ODsKKwlVSU5UMzIJCVJTU0kyOjg7CisJVUlOVDMyCQlyc3YxOjg7CisJLy9Xb3JkMworCVVJTlQzMgkJU05SMDo4OworCVVJTlQzMgkJU05SMTo4OworCVVJTlQzMgkJcnN2MjoxNjsKK30JUlhXSV9TVFJVQywgKlBSWFdJX1NUUlVDOworI2VuZGlmCisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBIT1NULU1DVSBjb21tdW5pY2F0aW9uIGRhdGEgc3RydWN0dXJlCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8KKy8vIEgyTV9NQUlMQk9YX0NTUjogSG9zdC10by1NQ1UgTWFpbGJveAorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmIHVuaW9uICBfSDJNX01BSUxCT1hfU1RSVUMgeworICAgIHN0cnVjdCB7CisgICAgICAgIFVJTlQzMiAgICAgICBPd25lcjo4OworICAgICAgICBVSU5UMzIgICAgICAgQ21kVG9rZW46ODsgICAgLy8gMHhmZiB0ZWxscyBNQ1Ugbm90IHRvIHJlcG9ydCBDbWREb25lSW50IGFmdGVyIGV4Y3V0aW5nIHRoZSBjb21tYW5kCisgICAgICAgIFVJTlQzMiAgICAgICBIaWdoQnl0ZTo4OworICAgICAgICBVSU5UMzIgICAgICAgTG93Qnl0ZTo4OworICAgIH0gICBmaWVsZDsKKyAgICBVSU5UMzIgICAgICAgICAgIHdvcmQ7Cit9IEgyTV9NQUlMQk9YX1NUUlVDLCAqUEgyTV9NQUlMQk9YX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYgdW5pb24gIF9IMk1fTUFJTEJPWF9TVFJVQyB7CisgICAgc3RydWN0IHsKKyAgICAgICAgVUlOVDMyICAgICAgIExvd0J5dGU6ODsKKyAgICAgICAgVUlOVDMyICAgICAgIEhpZ2hCeXRlOjg7CisgICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjo4OworICAgICAgICBVSU5UMzIgICAgICAgT3duZXI6ODsKKyAgICB9ICAgZmllbGQ7CisgICAgVUlOVDMyICAgICAgICAgICB3b3JkOworfSBIMk1fTUFJTEJPWF9TVFJVQywgKlBIMk1fTUFJTEJPWF9TVFJVQzsKKyNlbmRpZgorCisvLworLy8gTTJIX0NNRF9ET05FX0NTUjogTUNVLXRvLUhvc3QgY29tbWFuZCBjb21wbGV0ZSBpbmRpY2F0aW9uCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYgdW5pb24gX00ySF9DTURfRE9ORV9TVFJVQyB7CisgICAgc3RydWN0ICB7CisgICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjM7CisgICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjI7CisgICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjE7CisgICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjA7CisgICAgfSBmaWVsZDsKKyAgICBVSU5UMzIgICAgICAgICAgIHdvcmQ7Cit9IE0ySF9DTURfRE9ORV9TVFJVQywgKlBNMkhfQ01EX0RPTkVfU1RSVUM7CisjZWxzZQordHlwZWRlZiB1bmlvbiBfTTJIX0NNRF9ET05FX1NUUlVDIHsKKyAgICBzdHJ1Y3QgIHsKKyAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMDsKKyAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMTsKKyAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMjsKKyAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMzsKKyAgICB9IGZpZWxkOworICAgIFVJTlQzMiAgICAgICAgICAgd29yZDsKK30gTTJIX0NNRF9ET05FX1NUUlVDLCAqUE0ySF9DTURfRE9ORV9TVFJVQzsKKyNlbmRpZgorCisKKworLy8KKy8vIE1DVV9MRURDUzogTUNVIExFRCBDb250cm9sIFNldHRpbmcuCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYgdW5pb24gIF9NQ1VfTEVEQ1NfU1RSVUMgeworCXN0cnVjdAl7CisJCVVDSEFSCQlQb2xhcml0eToxOworCQlVQ0hBUgkJTGVkTW9kZTo3OworCX0gZmllbGQ7CisJVUNIQVIJCQkJd29yZDsKK30gTUNVX0xFRENTX1NUUlVDLCAqUE1DVV9MRURDU19TVFJVQzsKKyNlbHNlCit0eXBlZGVmIHVuaW9uICBfTUNVX0xFRENTX1NUUlVDIHsKKwlzdHJ1Y3QJeworCQlVQ0hBUgkJTGVkTW9kZTo3OworCQlVQ0hBUgkJUG9sYXJpdHk6MTsKKwl9IGZpZWxkOworCVVDSEFSCQkJd29yZDsKK30gTUNVX0xFRENTX1NUUlVDLCAqUE1DVV9MRURDU19TVFJVQzsKKyNlbmRpZgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBSZWdpc3RlciBmb3JtYXQKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKworLy9OQVZfVElNRV9DRkcgOk5BVgorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX05BVl9USU1FX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVVNIT1JUCQlyc3Y6NjsKKwkJVVNIT1JUCQlaZXJvU2lmczoxOyAgICAgICAgICAgICAgIC8vIEFwcGxpZWQgemVybyBTSUZTIHRpbWVyIGFmdGVyIE9GRE0gUlggMDogZGlzYWJsZQorCQlVU0hPUlQJCUVpZnM6OTsgICAgICAgICAgICAgICAvLyBpbiB1bml0IG9mIDEtdXMKKwkJVUNIQVIgICAgICAgU2xvdFRpbWU7ICAgIC8vIGluIHVuaXQgb2YgMS11cworCQlVQ0hBUgkJU2lmczsgICAgICAgICAgICAgICAvLyBpbiB1bml0IG9mIDEtdXMKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CU5BVl9USU1FX0NGR19TVFJVQywgKlBOQVZfVElNRV9DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfTkFWX1RJTUVfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUgkJU2lmczsgICAgICAgICAgICAgICAvLyBpbiB1bml0IG9mIDEtdXMKKwkJVUNIQVIgICAgICAgU2xvdFRpbWU7ICAgIC8vIGluIHVuaXQgb2YgMS11cworCQlVU0hPUlQJCUVpZnM6OTsgICAgICAgICAgICAgICAvLyBpbiB1bml0IG9mIDEtdXMKKwkJVVNIT1JUCQlaZXJvU2lmczoxOyAgICAgICAgICAgICAgIC8vIEFwcGxpZWQgemVybyBTSUZTIHRpbWVyIGFmdGVyIE9GRE0gUlggMDogZGlzYWJsZQorCQlVU0hPUlQJCXJzdjo2OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTkFWX1RJTUVfQ0ZHX1NUUlVDLCAqUE5BVl9USU1FX0NGR19TVFJVQzsKKyNlbmRpZgorCisKKworCisKKy8vCisvLyBSWF9GSUxUUl9DRkc6ICAvUlggY29uZmlndXJhdGlvbiByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCVJYX0ZJTFRSX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQk6MTU7CisJCVVJTlQzMiAgICAgICBEcm9wUnN2Q250bFR5cGU6MTsKKworICAgICAgICAJVUlOVDMyICAgICAgIAlEcm9wQkFSOjE7ICAgICAgIC8vCisJCVVJTlQzMgkJRHJvcEJBOjE7CQkvLworCQlVSU5UMzIJCURyb3BQc1BvbGw6MTsJCS8vIERyb3AgUHMtUG9sbAorCQlVSU5UMzIJCURyb3BSdHM6MTsJCS8vIERyb3AgUHMtUG9sbAorCisJCVVJTlQzMgkJRHJvcEN0czoxOwkJLy8gRHJvcCBQcy1Qb2xsCisJCVVJTlQzMgkJRHJvcEFjazoxOwkJLy8gRHJvcCBQcy1Qb2xsCisJCVVJTlQzMgkJRHJvcENGRW5kOjE7CQkvLyBEcm9wIFBzLVBvbGwKKwkJVUlOVDMyCQlEcm9wQ0ZFbmRBY2s6MTsJCS8vIERyb3AgUHMtUG9sbAorCisJCVVJTlQzMgkJRHJvcER1cGxpY2F0ZToxOwkJLy8gRHJvcCBkdXBsaWNhdGUgZnJhbWUKKwkJVUlOVDMyCQlEcm9wQmNhc3Q6MTsJCS8vIERyb3AgYnJvYWRjYXN0IGZyYW1lcworCQlVSU5UMzIJCURyb3BNY2FzdDoxOwkJLy8gRHJvcCBtdWx0aWNhc3QgZnJhbWVzCisJCVVJTlQzMgkJRHJvcFZlckVycjoxOwkgICAgLy8gRHJvcCB2ZXJzaW9uIGVycm9yIGZyYW1lCisKKwkJVUlOVDMyCQlEcm9wTm90TXlCU1NJRDoxOwkJCS8vIERyb3AgZnJhbSBUb0RzIGJpdCBpcyB0cnVlCisJCVVJTlQzMgkJRHJvcE5vdFRvTWU6MTsJCS8vIERyb3Agbm90IHRvIG1lIHVuaWNhc3QgZnJhbWUKKwkJVUlOVDMyCQlEcm9wUGh5RXJyOjE7CQkvLyBEcm9wIHBoeXNpY2FsIGVycm9yCisJCVVJTlQzMgkJRHJvcENSQ0VycjoxOwkJLy8gRHJvcCBDUkMgZXJyb3IKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJYX0ZJTFRSX0NGR19TVFJVQywgKlBSWF9GSUxUUl9DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUlhfRklMVFJfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCURyb3BDUkNFcnI6MTsJCS8vIERyb3AgQ1JDIGVycm9yCisJCVVJTlQzMgkJRHJvcFBoeUVycjoxOwkJLy8gRHJvcCBwaHlzaWNhbCBlcnJvcgorCQlVSU5UMzIJCURyb3BOb3RUb01lOjE7CQkvLyBEcm9wIG5vdCB0byBtZSB1bmljYXN0IGZyYW1lCisJCVVJTlQzMgkJRHJvcE5vdE15QlNTSUQ6MTsJCQkvLyBEcm9wIGZyYW0gVG9EcyBiaXQgaXMgdHJ1ZQorCisJCVVJTlQzMgkJRHJvcFZlckVycjoxOwkgICAgLy8gRHJvcCB2ZXJzaW9uIGVycm9yIGZyYW1lCisJCVVJTlQzMgkJRHJvcE1jYXN0OjE7CQkvLyBEcm9wIG11bHRpY2FzdCBmcmFtZXMKKwkJVUlOVDMyCQlEcm9wQmNhc3Q6MTsJCS8vIERyb3AgYnJvYWRjYXN0IGZyYW1lcworCQlVSU5UMzIJCURyb3BEdXBsaWNhdGU6MTsJCS8vIERyb3AgZHVwbGljYXRlIGZyYW1lCisKKwkJVUlOVDMyCQlEcm9wQ0ZFbmRBY2s6MTsJCS8vIERyb3AgUHMtUG9sbAorCQlVSU5UMzIJCURyb3BDRkVuZDoxOwkJLy8gRHJvcCBQcy1Qb2xsCisJCVVJTlQzMgkJRHJvcEFjazoxOwkJLy8gRHJvcCBQcy1Qb2xsCisJCVVJTlQzMgkJRHJvcEN0czoxOwkJLy8gRHJvcCBQcy1Qb2xsCisKKwkJVUlOVDMyCQlEcm9wUnRzOjE7CQkvLyBEcm9wIFBzLVBvbGwKKwkJVUlOVDMyCQlEcm9wUHNQb2xsOjE7CQkvLyBEcm9wIFBzLVBvbGwKKwkJVUlOVDMyCQlEcm9wQkE6MTsJCS8vCisgICAgICAgIAlVSU5UMzIgICAgICAgCURyb3BCQVI6MTsgICAgICAgLy8KKworCQlVSU5UMzIgICAgICAgCURyb3BSc3ZDbnRsVHlwZToxOworCQlVSU5UMzIJCToxNTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJYX0ZJTFRSX0NGR19TVFJVQywgKlBSWF9GSUxUUl9DRkdfU1RSVUM7CisjZW5kaWYKKworCisKKworLy8KKy8vIFBIWV9DU1I0OiBSRiBzZXJpYWwgY29udHJvbCByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9QSFlfQ1NSNF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlCdXN5OjE7CQkJCS8vIDE6IEFTSUMgaXMgYnVzeSBleGVjdXRlIFJGIHByb2dyYW1taW5nLgorCQlVSU5UMzIJCVBMTF9MRDoxOwkJCS8vIFJGIFBMTF9MRCBzdGF0dXMKKwkJVUlOVDMyCQlJRlNlbGVjdDoxOwkJCS8vIDE6IHNlbGVjdCBJRgl0byBwcm9ncmFtLAkwOiBzZWxlY3QgUkYgdG8JcHJvZ3JhbQorCQlVSU5UMzIJCU51bWJlck9mQml0czo1OwkJLy8gTnVtYmVyIG9mIGJpdHMgdXNlZCBpbiBSRlJlZ1ZhbHVlIChJOjIwLAlSRk1EOjIyKQorCQlVSU5UMzIJCVJGUmVnVmFsdWU6MjQ7CQkvLyBSZWdpc3Rlcgl2YWx1ZSAoaW5jbHVkZSByZWdpc3RlcglpZCkJc2VyaWFsIG91dCB0byBSRi9JRgljaGlwLgorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUEhZX0NTUjRfU1RSVUMsICpQUEhZX0NTUjRfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUEhZX0NTUjRfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJUkZSZWdWYWx1ZToyNDsJCS8vIFJlZ2lzdGVyCXZhbHVlIChpbmNsdWRlIHJlZ2lzdGVyCWlkKQlzZXJpYWwgb3V0IHRvIFJGL0lGCWNoaXAuCisJCVVJTlQzMgkJTnVtYmVyT2ZCaXRzOjU7CQkvLyBOdW1iZXIgb2YgYml0cyB1c2VkIGluIFJGUmVnVmFsdWUgKEk6MjAsCVJGTUQ6MjIpCisJCVVJTlQzMgkJSUZTZWxlY3Q6MTsJCQkvLyAxOiBzZWxlY3QgSUYJdG8gcHJvZ3JhbSwJMDogc2VsZWN0IFJGIHRvCXByb2dyYW0KKwkJVUlOVDMyCQlQTExfTEQ6MTsJCQkvLyBSRiBQTExfTEQgc3RhdHVzCisJCVVJTlQzMgkJQnVzeToxOwkJCQkvLyAxOiBBU0lDIGlzIGJ1c3kgZXhlY3V0ZSBSRiBwcm9ncmFtbWluZy4KKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVBIWV9DU1I0X1NUUlVDLCAqUFBIWV9DU1I0X1NUUlVDOworI2VuZGlmCisKKworLy8KKy8vIFNFQ19DU1I1OiBzaGFyZWQga2V5IHRhYmxlIHNlY3VyaXR5IG1vZGUgcmVnaXN0ZXIKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfU0VDX0NTUjVfU1RSVUMJeworCXN0cnVjdAl7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkzQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkyQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkxQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkwQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkzQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkyQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkxQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkwQ2lwaGVyQWxnOjM7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlTRUNfQ1NSNV9TVFJVQywgKlBTRUNfQ1NSNV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9TRUNfQ1NSNV9TVFJVQwl7CisJc3RydWN0CXsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkwQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkxQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkyQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkzQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkwQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkxQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkyQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkzQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVNFQ19DU1I1X1NUUlVDLCAqUFNFQ19DU1I1X1NUUlVDOworI2VuZGlmCisKKworLy8KKy8vIEhPU1RfQ01EX0NTUjogRm9yIEhPU1QgdG8gaW50ZXJydXB0IGVtYmVkZGVkIHByb2Nlc3NvcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9IT1NUX0NNRF9DU1JfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgIFJzdjoyNDsKKwkgICAgVUlOVDMyICAgSG9zdENvbW1hbmQ6ODsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUhPU1RfQ01EX0NTUl9TVFJVQywgKlBIT1NUX0NNRF9DU1JfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfSE9TVF9DTURfQ1NSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICBIb3N0Q29tbWFuZDo4OworCSAgICBVSU5UMzIgICBSc3Y6MjQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlIT1NUX0NNRF9DU1JfU1RSVUMsICpQSE9TVF9DTURfQ1NSX1NUUlVDOworI2VuZGlmCisKKworLy8KKy8vIEFJRlNOX0NTUjogQUlGU04gZm9yIGVhY2ggRURDQSBBQworLy8KKworCisKKy8vCisvLyBFMlBST01fQ1NSOiBFRVBST00gY29udHJvbCByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9FMlBST01fQ1NSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVJzdmQ6MjU7CisJCVVJTlQzMiAgICAgICBMb2FkU3RhdHVzOjE7ICAgLy8gMTpsb2FkaW5nLCAwOmRvbmUKKwkJVUlOVDMyCQlUeXBlOjE7CQkJLy8gMTogOTNDNDYsIDA6OTNDNjYKKwkJVUlOVDMyCQlFZXByb21ETzoxOworCQlVSU5UMzIJCUVlcHJvbURJOjE7CisJCVVJTlQzMgkJRWVwcm9tQ1M6MTsKKwkJVUlOVDMyCQlFZXByb21TSzoxOworCQlVSU5UMzIJCVJlbG9hZDoxOwkJLy8gUmVsb2FkIEVFUFJPTSBjb250ZW50LCB3cml0ZSBvbmUgdG8gcmVsb2FkLCBzZWxmLWNsZWFyZWQuCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlFMlBST01fQ1NSX1NUUlVDLCAqUEUyUFJPTV9DU1JfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfRTJQUk9NX0NTUl9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlSZWxvYWQ6MTsJCS8vIFJlbG9hZCBFRVBST00gY29udGVudCwgd3JpdGUgb25lIHRvIHJlbG9hZCwgc2VsZi1jbGVhcmVkLgorCQlVSU5UMzIJCUVlcHJvbVNLOjE7CisJCVVJTlQzMgkJRWVwcm9tQ1M6MTsKKwkJVUlOVDMyCQlFZXByb21ESToxOworCQlVSU5UMzIJCUVlcHJvbURPOjE7CisJCVVJTlQzMgkJVHlwZToxOwkJCS8vIDE6IDkzQzQ2LCAwOjkzQzY2CisJCVVJTlQzMiAgICAgICBMb2FkU3RhdHVzOjE7ICAgLy8gMTpsb2FkaW5nLCAwOmRvbmUKKwkJVUlOVDMyCQlSc3ZkOjI1OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JRTJQUk9NX0NTUl9TVFJVQywgKlBFMlBST01fQ1NSX1NUUlVDOworI2VuZGlmCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEUyUFJPTSBkYXRhIGxheW91dAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLworLy8gRUVQUk9NIGFudGVubmEgc2VsZWN0IGZvcm1hdAorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9FRVBST01fQU5URU5OQV9TVFJVQwl7CisJc3RydWN0CXsKKwkJVVNIT1JUICAgICAgUnN2OjQ7CisJCVVTSE9SVCAgICAgIFJmSWNUeXBlOjQ7ICAgICAgICAgICAgIC8vIHNlZSBFMlBST00gZG9jdW1lbnQKKwkJVVNIT1JUCQlUeFBhdGg6NDsJLy8gMTogMVQsIDI6IDJUCisJCVVTSE9SVAkJUnhQYXRoOjQ7CS8vIDE6IDFSLCAyOiAyUiwgMzogM1IKKwl9CWZpZWxkOworCVVTSE9SVAkJCXdvcmQ7Cit9CUVFUFJPTV9BTlRFTk5BX1NUUlVDLCAqUEVFUFJPTV9BTlRFTk5BX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0VFUFJPTV9BTlRFTk5BX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVU0hPUlQJCVJ4UGF0aDo0OwkvLyAxOiAxUiwgMjogMlIsIDM6IDNSCisJCVVTSE9SVAkJVHhQYXRoOjQ7CS8vIDE6IDFULCAyOiAyVAorCQlVU0hPUlQgICAgICBSZkljVHlwZTo0OyAgICAgICAgICAgICAvLyBzZWUgRTJQUk9NIGRvY3VtZW50CisJCVVTSE9SVCAgICAgIFJzdjo0OworCX0JZmllbGQ7CisJVVNIT1JUCQkJd29yZDsKK30JRUVQUk9NX0FOVEVOTkFfU1RSVUMsICpQRUVQUk9NX0FOVEVOTkFfU1RSVUM7CisjZW5kaWYKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24gX0VFUFJPTV9OSUNfQ0lORklHMl9TVFJVQwl7CisJc3RydWN0CXsKKyAgICAgICAgVVNIT1JUCQlSc3YyOjY7CQkJCQkvLyBtdXN0IGJlIDAKKwkJVVNIT1JUCQlCVzQwTUF2YWlsRm9yQToxOwkJCS8vIDA6ZW5hYmxlLCAxOmRpc2FibGUKKwkJVVNIT1JUCQlCVzQwTUF2YWlsRm9yRzoxOwkJCS8vIDA6ZW5hYmxlLCAxOmRpc2FibGUKKwkJVVNIT1JUCQlFbmFibGVXUFNQQkM6MTsgICAgICAgICAgICAgICAgIC8vIFdQUyBQQkMgQ29udHJvbCBiaXQKKwkJVVNIT1JUCQlCVzQwTVNpZGViYW5kRm9yQToxOworCQlVU0hPUlQJCUJXNDBNU2lkZWJhbmRGb3JHOjE7CisJCVVTSE9SVAkJQ2FyZGJ1c0FjY2VsZXJhdGlvbjoxOwkvLyAhISEgTk9URTogMCAtIGVuYWJsZSwgMSAtIGRpc2FibGUKKwkJVVNIT1JUCQlFeHRlcm5hbExOQUZvckE6MTsJCQkvLyBleHRlcm5hbCBMTkEgZW5hYmxlIGZvciA1RworCQlVU0hPUlQJCUV4dGVybmFsTE5BRm9yRzoxOwkJCS8vIGV4dGVybmFsIExOQSBlbmFibGUgZm9yIDIuNEcKKwkJVVNIT1JUCQlEeW5hbWljVHhBZ2NDb250cm9sOjE7CQkJLy8KKwkJVVNIT1JUCQlIYXJkd2FyZVJhZGlvQ29udHJvbDoxOwkvLyBXaGV0aGVyIFJGIGlzIGNvbnRyb2xsZWQgYnkgZHJpdmVyIG9yIEhXLiAxOmVuYWJsZSBodyBjb250cm9sLCAwOmRpc2FibGUKKwl9CWZpZWxkOworCVVTSE9SVAkJCXdvcmQ7Cit9CUVFUFJPTV9OSUNfQ09ORklHMl9TVFJVQywgKlBFRVBST01fTklDX0NPTkZJRzJfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbiBfRUVQUk9NX05JQ19DSU5GSUcyX1NUUlVDCXsKKwlzdHJ1Y3QgeworCQlVU0hPUlQJCUhhcmR3YXJlUmFkaW9Db250cm9sOjE7CS8vIDE6ZW5hYmxlLCAwOmRpc2FibGUKKwkJVVNIT1JUCQlEeW5hbWljVHhBZ2NDb250cm9sOjE7CQkJLy8KKwkJVVNIT1JUCQlFeHRlcm5hbExOQUZvckc6MTsJCQkJLy8KKwkJVVNIT1JUCQlFeHRlcm5hbExOQUZvckE6MTsJCQkvLyBleHRlcm5hbCBMTkEgZW5hYmxlIGZvciAyLjRHCisJCVVTSE9SVAkJQ2FyZGJ1c0FjY2VsZXJhdGlvbjoxOwkvLyAhISEgTk9URTogMCAtIGVuYWJsZSwgMSAtIGRpc2FibGUKKwkJVVNIT1JUCQlCVzQwTVNpZGViYW5kRm9yRzoxOworCQlVU0hPUlQJCUJXNDBNU2lkZWJhbmRGb3JBOjE7CisJCVVTSE9SVAkJRW5hYmxlV1BTUEJDOjE7ICAgICAgICAgICAgICAgICAvLyBXUFMgUEJDIENvbnRyb2wgYml0CisJCVVTSE9SVAkJQlc0ME1BdmFpbEZvckc6MTsJCQkvLyAwOmVuYWJsZSwgMTpkaXNhYmxlCisJCVVTSE9SVAkJQlc0ME1BdmFpbEZvckE6MTsJCQkvLyAwOmVuYWJsZSwgMTpkaXNhYmxlCisJCVVTSE9SVAkJUnN2Mjo2OyAgICAgICAgICAgICAgICAgLy8gbXVzdCBiZSAwCisJfQlmaWVsZDsKKwlVU0hPUlQJCQl3b3JkOworfQlFRVBST01fTklDX0NPTkZJRzJfU1RSVUMsICpQRUVQUk9NX05JQ19DT05GSUcyX1NUUlVDOworI2VuZGlmCisKKy8vCisvLyBUWF9QV1IgVmFsdWUgdmFsaWQgcmFuZ2UgMHhGQSgtNikgfiAweDI0KDM2KQorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9FRVBST01fVFhfUFdSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlDSEFSCUJ5dGUxOwkJCQkvLyBIaWdoIEJ5dGUKKwkJQ0hBUglCeXRlMDsJCQkJLy8gTG93IEJ5dGUKKwl9CWZpZWxkOworCVVTSE9SVAl3b3JkOworfQlFRVBST01fVFhfUFdSX1NUUlVDLCAqUEVFUFJPTV9UWF9QV1JfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfRUVQUk9NX1RYX1BXUl9TVFJVQwl7CisJc3RydWN0CXsKKwkJQ0hBUglCeXRlMDsJCQkJLy8gTG93IEJ5dGUKKwkJQ0hBUglCeXRlMTsJCQkJLy8gSGlnaCBCeXRlCisJfQlmaWVsZDsKKwlVU0hPUlQJd29yZDsKK30JRUVQUk9NX1RYX1BXUl9TVFJVQywgKlBFRVBST01fVFhfUFdSX1NUUlVDOworI2VuZGlmCisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9FRVBST01fVkVSU0lPTl9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUNIQVIJVmVyc2lvbjsJCQkvLyBIaWdoIEJ5dGUKKwkJVUNIQVIJRmFlUmVsZWFzZU51bWJlcjsJLy8gTG93IEJ5dGUKKwl9CWZpZWxkOworCVVTSE9SVAl3b3JkOworfQlFRVBST01fVkVSU0lPTl9TVFJVQywgKlBFRVBST01fVkVSU0lPTl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9FRVBST01fVkVSU0lPTl9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUNIQVIJRmFlUmVsZWFzZU51bWJlcjsJLy8gTG93IEJ5dGUKKwkJVUNIQVIJVmVyc2lvbjsJCQkvLyBIaWdoIEJ5dGUKKwl9CWZpZWxkOworCVVTSE9SVAl3b3JkOworfQlFRVBST01fVkVSU0lPTl9TVFJVQywgKlBFRVBST01fVkVSU0lPTl9TVFJVQzsKKyNlbmRpZgorCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfRUVQUk9NX0xFRF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVVNIT1JUCVJzdmQ6MzsJCQkJLy8gUmVzZXJ2ZWQKKwkJVVNIT1JUCUxlZE1vZGU6NTsJCQkvLyBMZWQgbW9kZS4KKwkJVVNIT1JUCVBvbGFyaXR5R1BJT180OjE7CS8vIFBvbGFyaXR5IEdQSU8jNCBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlHUElPXzM6MTsJLy8gUG9sYXJpdHkgR1BJTyMzIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eUdQSU9fMjoxOwkvLyBQb2xhcml0eSBHUElPIzIgc2V0dGluZy4KKwkJVVNIT1JUCVBvbGFyaXR5R1BJT18xOjE7CS8vIFBvbGFyaXR5IEdQSU8jMSBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlHUElPXzA6MTsJLy8gUG9sYXJpdHkgR1BJTyMwIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eUFDVDoxOwkJLy8gUG9sYXJpdHkgQUNUIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eVJEWV9BOjE7CQkvLyBQb2xhcml0eSBSRFlfQSBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlSRFlfRzoxOwkJLy8gUG9sYXJpdHkgUkRZX0cgc2V0dGluZy4KKwl9CWZpZWxkOworCVVTSE9SVAl3b3JkOworfQlFRVBST01fTEVEX1NUUlVDLCAqUEVFUFJPTV9MRURfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfRUVQUk9NX0xFRF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVVNIT1JUCVBvbGFyaXR5UkRZX0c6MTsJCS8vIFBvbGFyaXR5IFJEWV9HIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eVJEWV9BOjE7CQkvLyBQb2xhcml0eSBSRFlfQSBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlBQ1Q6MTsJCS8vIFBvbGFyaXR5IEFDVCBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlHUElPXzA6MTsJLy8gUG9sYXJpdHkgR1BJTyMwIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eUdQSU9fMToxOwkvLyBQb2xhcml0eSBHUElPIzEgc2V0dGluZy4KKwkJVVNIT1JUCVBvbGFyaXR5R1BJT18yOjE7CS8vIFBvbGFyaXR5IEdQSU8jMiBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlHUElPXzM6MTsJLy8gUG9sYXJpdHkgR1BJTyMzIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eUdQSU9fNDoxOwkvLyBQb2xhcml0eSBHUElPIzQgc2V0dGluZy4KKwkJVVNIT1JUCUxlZE1vZGU6NTsJCQkvLyBMZWQgbW9kZS4KKwkJVVNIT1JUCVJzdmQ6MzsJCQkJLy8gUmVzZXJ2ZWQKKwl9CWZpZWxkOworCVVTSE9SVAl3b3JkOworfQlFRVBST01fTEVEX1NUUlVDLCAqUEVFUFJPTV9MRURfU1RSVUM7CisjZW5kaWYKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0VFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUglUeFBvd2VyRW5hYmxlOjE7Ly8gRW5hYmxlCisJCVVDSEFSCVR5cGU6MTsJCQkvLyAxOiBwbHVzIHRoZSBkZWx0YSB2YWx1ZSwgMDogbWludXMgdGhlIGRlbHRhIHZhbHVlCisJCVVDSEFSCURlbHRhVmFsdWU6NjsJLy8gVHggUG93ZXIgZGFsdGEgdmFsdWUgKE1BWD00KQorCX0JZmllbGQ7CisJVUNIQVIJdmFsdWU7Cit9CUVFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDLCAqUEVFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0VFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUglEZWx0YVZhbHVlOjY7CS8vIFR4IFBvd2VyIGRhbHRhIHZhbHVlIChNQVg9NCkKKwkJVUNIQVIJVHlwZToxOwkJCS8vIDE6IHBsdXMgdGhlIGRlbHRhIHZhbHVlLCAwOiBtaW51cyB0aGUgZGVsdGEgdmFsdWUKKwkJVUNIQVIJVHhQb3dlckVuYWJsZToxOy8vIEVuYWJsZQorCX0JZmllbGQ7CisJVUNIQVIJdmFsdWU7Cit9CUVFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDLCAqUEVFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDOworI2VuZGlmCisKKy8vCisvLyBRT1NfQ1NSMDogVFhPUCBob2xkZXIgYWRkcmVzczAgcmVnaXN0ZXIKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfUU9TX0NTUjBfU1RSVUMJeworCXN0cnVjdAl7CisJCVVDSEFSCQlCeXRlMzsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMworCQlVQ0hBUgkJQnl0ZTI7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDIKKwkJVUNIQVIJCUJ5dGUxOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAxCisJCVVDSEFSCQlCeXRlMDsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUU9TX0NTUjBfU1RSVUMsICpQUU9TX0NTUjBfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUU9TX0NTUjBfU1RSVUMJeworCXN0cnVjdAl7CisJCVVDSEFSCQlCeXRlMDsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMAorCQlVQ0hBUgkJQnl0ZTE7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDEKKwkJVUNIQVIJCUJ5dGUyOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAyCisJCVVDSEFSCQlCeXRlMzsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUU9TX0NTUjBfU1RSVUMsICpQUU9TX0NTUjBfU1RSVUM7CisjZW5kaWYKKworLy8KKy8vIFFPU19DU1IxOiBUWE9QIGhvbGRlciBhZGRyZXNzMSByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9RT1NfQ1NSMV9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUNIQVIJCVJzdmQxOworCQlVQ0hBUgkJUnN2ZDA7CisJCVVDSEFSCQlCeXRlNTsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgNQorCQlVQ0hBUgkJQnl0ZTQ7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDQKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVFPU19DU1IxX1NUUlVDLCAqUFFPU19DU1IxX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1FPU19DU1IxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUgkJQnl0ZTQ7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDQKKwkJVUNIQVIJCUJ5dGU1OwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSA1CisJCVVDSEFSCQlSc3ZkMDsKKwkJVUNIQVIJCVJzdmQxOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUU9TX0NTUjFfU1RSVUMsICpQUU9TX0NTUjFfU1RSVUM7CisjZW5kaWYKKworI2RlZmluZQlSRl9DU1JfQ0ZHCTB4NTAwCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfUkZfQ1NSX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVAlSc3ZkMToxNDsJCQkJLy8gUmVzZXJ2ZWQKKwkJVUlOVAlSRl9DU1JfS0lDSzoxOwkJCS8vIGtpY2sgUkYgcmVnaXN0ZXIgcmVhZC93cml0ZQorCQlVSU5UCVJGX0NTUl9XUjoxOwkJCS8vIDA6IHJlYWQgIDE6IHdyaXRlCisJCVVJTlQJUnN2ZDI6MzsJCQkJLy8gUmVzZXJ2ZWQKKwkJVUlOVAlURVNUQ1NSX1JGQUNDX1JFR05VTTo1OwkvLyBSRiByZWdpc3RlciBJRAorCQlVSU5UCVJGX0NTUl9EQVRBOjg7CQkJLy8gREFUQQorCX0JZmllbGQ7CisJVUlOVAl3b3JkOworfQlSRl9DU1JfQ0ZHX1NUUlVDLCAqUFJGX0NTUl9DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUkZfQ1NSX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVAlSRl9DU1JfREFUQTo4OwkJCS8vIERBVEEKKwkJVUlOVAlURVNUQ1NSX1JGQUNDX1JFR05VTTo1OwkvLyBSRiByZWdpc3RlciBJRAorCQlVSU5UCVJzdmQyOjM7CQkJCS8vIFJlc2VydmVkCisJCVVJTlQJUkZfQ1NSX1dSOjE7CQkJLy8gMDogcmVhZCAgMTogd3JpdGUKKwkJVUlOVAlSRl9DU1JfS0lDSzoxOwkJCS8vIGtpY2sgUkYgcmVnaXN0ZXIgcmVhZC93cml0ZQorCQlVSU5UCVJzdmQxOjE0OwkJCQkvLyBSZXNlcnZlZAorCX0JZmllbGQ7CisJVUlOVAl3b3JkOworfQlSRl9DU1JfQ0ZHX1NUUlVDLCAqUFJGX0NTUl9DRkdfU1RSVUM7CisjZW5kaWYKKworI2VuZGlmCS8vIF9fUlQyOFhYX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9hdGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMzMTZlYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfYXRlLmMKQEAgLTAsMCArMSw2MDI1IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaW5jbHVkZSAicnRfY29uZmlnLmgiCisKKyNpZmRlZiBSQUxJTktfQVRFCitVQ0hBUiBUZW1wbGF0ZUZyYW1lWzI0XSA9IHsweDA4LyogRGF0YSB0eXBlICovLDB4MDAsMHgwMCwweDAwLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4MDAsMHhBQSwweEJCLDB4MTIsMHgzNCwweDU2LDB4MDAsMHgxMSwweDIyLDB4QUEsMHhCQiwweENDLDB4MDAsMHgwMH07CS8vIDgwMi4xMSBNQUMgSGVhZGVyLCBUeXBlOkRhdGEsIExlbmd0aDoyNGJ5dGVzCitleHRlcm4gUlRNUF9SRl9SRUdTIFJGMjg1MFJlZ1RhYmxlW107CitleHRlcm4gVUNIQVIgTlVNX09GXzI4NTBfQ0hOTDsKKworc3RhdGljIENIQVIgQ0NLUmF0ZVRhYmxlW10gPSB7MCwgMSwgMiwgMywgOCwgOSwgMTAsIDExLCAtMX07IC8qIENDSyBNb2RlLiAqLworc3RhdGljIENIQVIgT0ZETVJhdGVUYWJsZVtdID0gezAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIC0xfTsgLyogT0ZETSBNb2RlLiAqLworc3RhdGljIENIQVIgSFRNSVhSYXRlVGFibGVbXSA9IHswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAtMX07IC8qIEhUIE1peCBNb2RlLiAqLworCitzdGF0aWMgSU5UIFR4RG1hQnVzeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK3N0YXRpYyBJTlQgUnhEbWFCdXN5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworc3RhdGljIFZPSUQgUnRtcERtYUVuYWJsZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBJTlQgRW5hYmxlKTsKKworc3RhdGljIFZPSUQgQmJwU29mdFJlc2V0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworc3RhdGljIFZPSUQgUnRtcFJmSW9Xcml0ZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK3N0YXRpYyBJTlQgQVRFU2V0VXBGcmFtZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVSU5UMzIgVHhJZHgpOworCitzdGF0aWMgSU5UIEFURVR4UHdySGFuZGxlcigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBjaGFyIGluZGV4KTsKKworc3RhdGljIElOVCBBVEVDbWRIYW5kbGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK3N0YXRpYyBpbnQgQ2hlY2tNQ1NWYWxpZCgKKwlJTiBVQ0hBUiBNb2RlLAorCUlOIFVDSEFSIE1jcyk7CisKKyNpZmRlZiBSVDI4NjAKK3N0YXRpYyBWT0lEIEFURVdyaXRlVHhXSSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVFhXSV9TVFJVQyAJcE91dFR4V0ksCisJSU4JQk9PTEVBTgkJCUZSQUcsCisJSU4JQk9PTEVBTgkJCUNGQUNLLAorCUlOCUJPT0xFQU4JCQlJbnNUaW1lc3RhbXAsCisJSU4JQk9PTEVBTiAJCUFNUERVLAorCUlOCUJPT0xFQU4gCQlBY2ssCisJSU4JQk9PTEVBTiAJCU5TZXEsCQkvLyBIVyBuZXcgYSBzZXF1ZW5jZS4KKwlJTglVQ0hBUgkJCUJBU2l6ZSwKKwlJTglVQ0hBUgkJCVdDSUQsCisJSU4JVUxPTkcJCQlMZW5ndGgsCisJSU4JVUNIQVIgCQkJUElELAorCUlOCVVDSEFSCQkJVElELAorCUlOCVVDSEFSCQkJVHhSYXRlLAorCUlOCVVDSEFSCQkJVHhvcG1vZGUsCisJSU4JQk9PTEVBTgkJCUNmQWNrLAorCUlOCUhUVFJBTlNNSVRfU0VUVElORwkqcFRyYW5zbWl0KTsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCitzdGF0aWMgVk9JRCBTZXRKYXBhbkZpbHRlcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PWVuZCBvZiBwcm90b3R5cGU9PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2lmZGVmIFJUMjg2MAorc3RhdGljIElOVCBUeERtYUJ1c3koCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJSU5UIHJlc3VsdDsKKwlXUERNQV9HTE9fQ0ZHX1NUUlVDIEdsb0NmZzsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsJLy8gZGlzYWJsZSBETUEKKwlpZiAoR2xvQ2ZnLmZpZWxkLlR4RE1BQnVzeSkKKwkJcmVzdWx0ID0gMTsKKwllbHNlCisJCXJlc3VsdCA9IDA7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgSU5UIFJ4RG1hQnVzeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlJTlQgcmVzdWx0OworCVdQRE1BX0dMT19DRkdfU1RSVUMgR2xvQ2ZnOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOwkvLyBkaXNhYmxlIERNQQorCWlmIChHbG9DZmcuZmllbGQuUnhETUFCdXN5KQorCQlyZXN1bHQgPSAxOworCWVsc2UKKwkJcmVzdWx0ID0gMDsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBWT0lEIFJ0bXBEbWFFbmFibGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gSU5UIEVuYWJsZSkKK3sKKwlCT09MRUFOIHZhbHVlOworCVVMT05HIFdhaXRDbnQ7CisJV1BETUFfR0xPX0NGR19TVFJVQyBHbG9DZmc7CisKKwl2YWx1ZSA9IEVuYWJsZSA+IDAgPyAxIDogMDsKKworCS8vIGNoZWNrIERNQSBpcyBpbiBidXN5IG1vZGUuCisJV2FpdENudCA9IDA7CisJd2hpbGUgKFR4RG1hQnVzeShwQWQpIHx8IFJ4RG1hQnVzeShwQWQpKQorCXsKKwkJUlRNUHVzZWNEZWxheSgxMCk7CisJCWlmIChXYWl0Q250KysgPiAxMDApCisJCQlicmVhazsKKwl9CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZHbG9DZmcud29yZCk7CS8vIGRpc2FibGUgRE1BCisJR2xvQ2ZnLmZpZWxkLkVuYWJsZVR4RE1BID0gdmFsdWU7CisJR2xvQ2ZnLmZpZWxkLkVuYWJsZVJ4RE1BID0gdmFsdWU7CisJUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfR0xPX0NGRywgR2xvQ2ZnLndvcmQpOwkvLyBhYm9ydCBhbGwgVFggcmluZ3MKKwlSVE1QdXNlY0RlbGF5KDUwMDApOworCisJcmV0dXJuOworfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisKK3N0YXRpYyBWT0lEIEJicFNvZnRSZXNldCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlVQ0hBUiBCYnBEYXRhID0gMDsKKworCS8vIFNvZnQgcmVzZXQsIHNldCBCQlAgUjIxIGJpdDA9MS0+MAorCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyMSwgJkJicERhdGEpOworCUJicERhdGEgfD0gMHgwMDAwMDAwMTsgLy9zZXQgYml0MD0xCisJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMSwgQmJwRGF0YSk7CisKKwlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjEsICZCYnBEYXRhKTsKKwlCYnBEYXRhICY9IH4oMHgwMDAwMDAwMSk7IC8vc2V0IGJpdDA9MAorCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjEsIEJicERhdGEpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgVk9JRCBSdG1wUmZJb1dyaXRlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCS8vIFNldCBSRiB2YWx1ZSAxJ3Mgc2V0IFIzW2JpdDJdID0gWzBdCisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMSk7CisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMik7CisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgJiAofjB4MDQpKSk7CisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SNCk7CisKKwlSVE1QdXNlY0RlbGF5KDIwMCk7CisKKwkvLyBTZXQgUkYgdmFsdWUgMidzIHNldCBSM1tiaXQyXSA9IFsxXQorCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjEpOworCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjIpOworCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIChwQWQtPkxhdGNoUmZSZWdzLlIzIHwgMHgwNCkpOworCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpOworCisJUlRNUHVzZWNEZWxheSgyMDApOworCisJLy8gU2V0IFJGIHZhbHVlIDMncyBzZXQgUjNbYml0Ml0gPSBbMF0KKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIxKTsKKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIyKTsKKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCAocEFkLT5MYXRjaFJmUmVncy5SMyAmICh+MHgwNCkpKTsKKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlI0KTsKKworCXJldHVybjsKK30KKworc3RhdGljIGludCBDaGVja01DU1ZhbGlkKAorCVVDSEFSIE1vZGUsCisJVUNIQVIgTWNzKQoreworCWludCBpOworCVBDSEFSIHBSYXRlVGFiOworCisJc3dpdGNoKE1vZGUpCisJeworCQljYXNlIDA6CisJCQlwUmF0ZVRhYiA9IENDS1JhdGVUYWJsZTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlwUmF0ZVRhYiA9IE9GRE1SYXRlVGFibGU7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQljYXNlIDM6CisJCQlwUmF0ZVRhYiA9IEhUTUlYUmF0ZVRhYmxlOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJ1bnJlY29nbml6YWJsZSBUeCBNb2RlICVkXG4iLCBNb2RlKSk7CisJCQlyZXR1cm4gLTE7CisJCQlicmVhazsKKwl9CisKKwlpID0gMDsKKwl3aGlsZShwUmF0ZVRhYltpXSAhPSAtMSkKKwl7CisJCWlmIChwUmF0ZVRhYltpXSA9PSBNY3MpCisJCQlyZXR1cm4gMDsKKwkJaSsrOworCX0KKworCXJldHVybiAtMTsKK30KKworI2lmIDEKK3N0YXRpYyBJTlQgQVRFVHhQd3JIYW5kbGVyKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIGNoYXIgaW5kZXgpCit7CisJVUxPTkcgUjsKKwlDSEFSIFR4UG93ZXI7CisJVUNIQVIgQmJwOTQgPSAwOworCUJPT0xFQU4gYlBvd2VyUmVkdWNlID0gRkFMU0U7CisKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCWlmICgocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKSB8fCAocEFkLT5hdGUuYlFBUnhTdGFydCA9PSBUUlVFKSkKKwl7CisJCS8qIFdoZW4gUUEgaXMgdXNlZCBmb3IgVHgsIHBBZC0+YXRlLlR4UG93ZXIwLzEgYW5kIHJlYWwgdHggcG93ZXIKKwkJKiogYXJlIG5vdCBzeW5jaHJvbml6ZWQuCisJCSovCisvKgorCQlwQWQtPmF0ZS5UeFBvd2VyMCA9IHBBZC0+TGF0Y2hSZlJlZ3MueHh4OworCQlwQWQtPmF0ZS5UeFBvd2VyMSA9IHBBZC0+TGF0Y2hSZlJlZ3MueHh4OworKi8KKwkJcmV0dXJuIDA7CisJfQorCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCXsKKwkJVHhQb3dlciA9IGluZGV4ID09IDAgPyBwQWQtPmF0ZS5UeFBvd2VyMCA6IHBBZC0+YXRlLlR4UG93ZXIxOworCisJCWlmIChwQWQtPmF0ZS5DaGFubmVsIDw9IDE0KQorCQl7CisJCQlpZiAoVHhQb3dlciA+IDMxKQorCQkJeworCQkJCS8vCisJCQkJLy8gUjMsIFI0IGNhbid0IGxhcmdlIHRoYW4gMzEgKDB4MjQpLCAzMSB+IDM2IHVzZWQgYnkgQkJQIDk0CisJCQkJLy8KKwkJCQlSID0gMzE7CisJCQkJaWYgKFR4UG93ZXIgPD0gMzYpCisJCQkJCUJicDk0ID0gQkJQUjk0X0RFRkFVTFQgKyAoVUNIQVIpKFR4UG93ZXIgLSAzMSk7CisJCQl9CisJCQllbHNlIGlmIChUeFBvd2VyIDwgMCkKKwkJCXsKKwkJCQkvLworCQkJCS8vIFIzLCBSNCBjYW4ndCBsZXNzIHRoYW4gMCwgLTEgfiAtNiB1c2VkIGJ5IEJCUCA5NAorCQkJCS8vCisJCQkJUiA9IDA7CisJCQkJaWYgKFR4UG93ZXIgPj0gLTYpCisJCQkJCUJicDk0ID0gQkJQUjk0X0RFRkFVTFQgKyBUeFBvd2VyOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIDAgfiAzMQorCQkJCVIgPSAoVUxPTkcpIFR4UG93ZXI7CisJCQkJQmJwOTQgPSBCQlBSOTRfREVGQVVMVDsKKwkJCX0KKworCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgKFR4UG93ZXI9JWQsIFI9JWxkLCBCQlBfUjk0PSVkKVxuIiwgX19mdW5jX18sIFR4UG93ZXIsIFIsIEJicDk0KSk7CisJCX0KKwkJZWxzZS8vIDUuNSBHSHoKKwkJeworCQkJaWYgKFR4UG93ZXIgPiAxNSkKKwkJCXsKKwkJCQkvLworCQkJCS8vIFIzLCBSNCBjYW4ndCBsYXJnZSB0aGFuIDE1ICgweDBGKQorCQkJCS8vCisJCQkJUiA9IDE1OworCQkJfQorCQkJZWxzZSBpZiAoVHhQb3dlciA8IDApCisJCQl7CisJCQkJLy8KKwkJCQkvLyBSMywgUjQgY2FuJ3QgbGVzcyB0aGFuIDAKKwkJCQkvLworCQkJCS8vIC0xIH4gLTcKKwkJCQlBU1NFUlQoKFR4UG93ZXIgPj0gLTcpKTsKKwkJCQlSID0gKFVMT05HKShUeFBvd2VyICsgNyk7CisJCQkJYlBvd2VyUmVkdWNlID0gVFJVRTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyAwIH4gMTUKKwkJCQlSID0gKFVMT05HKSBUeFBvd2VyOworCQkJfQorCisJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAoVHhQb3dlcj0lZCwgUj0lbHUpXG4iLCBfX2Z1bmNfXywgVHhQb3dlciwgUikpOworCQl9CisKKwkJaWYgKHBBZC0+YXRlLkNoYW5uZWwgPD0gMTQpCisJCXsKKwkJCWlmIChpbmRleCA9PSAwKQorCQkJeworCQkJCVIgPSBSIDw8IDk7CQkvLyBzaGlmdCBUWCBwb3dlciBjb250cm9sIHRvIGNvcnJlY3QgUkYoUjMpIHJlZ2lzdGVyIGJpdCBwb3NpdGlvbgorCQkJCVIgfD0gKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgJiAweGZmZmZjMWZmKTsKKwkJCQlwQWQtPkxhdGNoUmZSZWdzLlIzID0gUjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlSID0gUiA8PCA2OwkJLy8gc2hpZnQgVFggcG93ZXIgY29udHJvbCB0byBjb3JyZWN0IFJGKFI0KSByZWdpc3RlciBiaXQgcG9zaXRpb24KKwkJCQlSIHw9IChwQWQtPkxhdGNoUmZSZWdzLlI0ICYgMHhmZmZmZjgzZik7CisJCQkJcEFkLT5MYXRjaFJmUmVncy5SNCA9IFI7CisJCQl9CisJCX0KKwkJZWxzZS8vIDUuNUdIegorCQl7CisJCQlpZiAoYlBvd2VyUmVkdWNlID09IEZBTFNFKQorCQkJeworCQkJCWlmIChpbmRleCA9PSAwKQorCQkJCXsKKwkJCQkJUiA9IChSIDw8IDEwKSB8ICgxIDw8IDkpOwkJLy8gc2hpZnQgVFggcG93ZXIgY29udHJvbCB0byBjb3JyZWN0IFJGKFIzKSByZWdpc3RlciBiaXQgcG9zaXRpb24KKwkJCQkJUiB8PSAocEFkLT5MYXRjaFJmUmVncy5SMyAmIDB4ZmZmZmMxZmYpOworCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIzID0gUjsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJUiA9IChSIDw8IDcpIHwgKDEgPDwgNik7CQkvLyBzaGlmdCBUWCBwb3dlciBjb250cm9sIHRvIGNvcnJlY3QgUkYoUjQpIHJlZ2lzdGVyIGJpdCBwb3NpdGlvbgorCQkJCQlSIHw9IChwQWQtPkxhdGNoUmZSZWdzLlI0ICYgMHhmZmZmZjgzZik7CisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgPSBSOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAoaW5kZXggPT0gMCkKKwkJCQl7CisJCQkJCVIgPSAoUiA8PCAxMCk7CQkvLyBzaGlmdCBUWCBwb3dlciBjb250cm9sIHRvIGNvcnJlY3QgUkYoUjMpIHJlZ2lzdGVyIGJpdCBwb3NpdGlvbgorCQkJCQlSIHw9IChwQWQtPkxhdGNoUmZSZWdzLlIzICYgMHhmZmZmYzFmZik7CisKKwkJCQkJLyogQ2xlYXIgYml0IDkgb2YgUjMgdG8gcmVkdWNlIDdkQi4gKi8KKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5SMyA9IChSICYgKH4oMSA8PCA5KSkpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSID0gKFIgPDwgNyk7CQkvLyBzaGlmdCBUWCBwb3dlciBjb250cm9sIHRvIGNvcnJlY3QgUkYoUjQpIHJlZ2lzdGVyIGJpdCBwb3NpdGlvbgorCQkJCQlSIHw9IChwQWQtPkxhdGNoUmZSZWdzLlI0ICYgMHhmZmZmZjgzZik7CisKKwkJCQkJLyogQ2xlYXIgYml0IDYgb2YgUjQgdG8gcmVkdWNlIDdkQi4gKi8KKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5SNCA9IChSICYgKH4oMSA8PCA2KSkpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCVJ0bXBSZklvV3JpdGUocEFkKTsKKworCQlyZXR1cm4gMDsKKwl9Cit9CisjZWxzZS8vIDEgLy8KK3N0YXRpYyBJTlQgQVRFVHhQd3JIYW5kbGVyKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIGNoYXIgaW5kZXgpCit7CisJVUxPTkcgUjsKKwlDSEFSIFR4UG93ZXI7CisJVUNIQVIgQmJwOTQgPSAwOworCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwlpZiAoKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkgfHwgKHBBZC0+YXRlLmJRQVJ4U3RhcnQgPT0gVFJVRSkpCisJeworCQkvLyBUT0RPOiBob3cgdG8gZ2V0IGN1cnJlbnQgVHhQb3dlcjAvMSBmcm9tIHBBZC0+TGF0Y2hSZlJlZ3MgPworCQkvKiBXaGVuIFFBIGlzIHVzZWQgZm9yIFR4LCBwQWQtPmF0ZS5UeFBvd2VyMC8xIGFuZCByZWFsIHR4IHBvd2VyCisJCSoqIGFyZSBub3Qgc3luY2hyb25pemVkLgorCQkqLworLyoKKwkJcEFkLT5hdGUuVHhQb3dlcjAgPSBwQWQtPkxhdGNoUmZSZWdzLnh4eDsKKwkJcEFkLT5hdGUuVHhQb3dlcjEgPSBwQWQtPkxhdGNoUmZSZWdzLnh4eDsKKyovCisJCXJldHVybiAwOworCX0KKwllbHNlCisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKwl7CisJCVR4UG93ZXIgPSBpbmRleCA9PSAwID8gcEFkLT5hdGUuVHhQb3dlcjAgOiBwQWQtPmF0ZS5UeFBvd2VyMTsKKworCWlmIChUeFBvd2VyID4gMzEpCisJeworCQkvLworCQkvLyBSMywgUjQgY2FuJ3QgbGFyZ2UgdGhhbiAzNiAoMHgyNCksIDMxIH4gMzYgdXNlZCBieSBCQlAgOTQKKwkJLy8KKwkJUiA9IDMxOworCQlpZiAoVHhQb3dlciA8PSAzNikKKwkJCUJicDk0ID0gQkJQUjk0X0RFRkFVTFQgKyAoVUNIQVIpKFR4UG93ZXIgLSAzMSk7CisJfQorCWVsc2UgaWYgKFR4UG93ZXIgPCAwKQorCXsKKwkJLy8KKwkJLy8gUjMsIFI0IGNhbid0IGxlc3MgdGhhbiAwLCAtMSB+IC02IHVzZWQgYnkgQkJQIDk0CisJCS8vCisJCVIgPSAwOworCQlpZiAoVHhQb3dlciA+PSAtNikKKwkJCUJicDk0ID0gQkJQUjk0X0RFRkFVTFQgKyBUeFBvd2VyOworCX0KKwllbHNlCisJeworCQkvLyAwIH4gMzEKKwkJUiA9IChVTE9ORykgVHhQb3dlcjsKKwkJQmJwOTQgPSBCQlBSOTRfREVGQVVMVDsKKwl9CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAoVHhQb3dlcj0lZCwgUjM9JWxkLCBCQlBfUjk0PSVkKVxuIiwgX19mdW5jX18sIFR4UG93ZXIsIFIsIEJicDk0KSk7CisKKwkJaWYgKHBBZC0+YXRlLkNoYW5uZWwgPD0gMTQpCisJCXsKKwlpZiAoaW5kZXggPT0gMCkKKwl7CisJCVIgPSBSIDw8IDk7CQkvLyBzaGlmdCBUWCBwb3dlciBjb250cm9sIHRvIGNvcnJlY3QgUkYoUjMpIHJlZ2lzdGVyIGJpdCBwb3NpdGlvbgorCQlSIHw9IChwQWQtPkxhdGNoUmZSZWdzLlIzICYgMHhmZmZmYzFmZik7CisJCXBBZC0+TGF0Y2hSZlJlZ3MuUjMgPSBSOworCX0KKwllbHNlCisJeworCQlSID0gUiA8PCA2OwkJLy8gc2hpZnQgVFggcG93ZXIgY29udHJvbCB0byBjb3JyZWN0IFJGKFI0KSByZWdpc3RlciBiaXQgcG9zaXRpb24KKwkJUiB8PSAocEFkLT5MYXRjaFJmUmVncy5SNCAmIDB4ZmZmZmY4M2YpOworCQlwQWQtPkxhdGNoUmZSZWdzLlI0ID0gUjsKKwl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoaW5kZXggPT0gMCkKKwkJCXsKKwkJCQlSID0gKFIgPDwgMTApIHwgKDEgPDwgOSk7CQkvLyBzaGlmdCBUWCBwb3dlciBjb250cm9sIHRvIGNvcnJlY3QgUkYoUjMpIHJlZ2lzdGVyIGJpdCBwb3NpdGlvbgorCQkJCVIgfD0gKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgJiAweGZmZmZjMWZmKTsKKwkJCQlwQWQtPkxhdGNoUmZSZWdzLlIzID0gUjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlSID0gKFIgPDwgNykgfCAoMSA8PCA2KTsJCS8vIHNoaWZ0IFRYIHBvd2VyIGNvbnRyb2wgdG8gY29ycmVjdCBSRihSNCkgcmVnaXN0ZXIgYml0IHBvc2l0aW9uCisJCQkJUiB8PSAocEFkLT5MYXRjaFJmUmVncy5SNCAmIDB4ZmZmZmY4M2YpOworCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgPSBSOworCQkJfQorCQl9CisKKwlSdG1wUmZJb1dyaXRlKHBBZCk7CisKKwlyZXR1cm4gMDsKKwl9Cit9CisjZW5kaWYgLy8gMSAvLworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIG9wZXJhdGlvbiBtb2RlIHRvCisgICAgICAgIDAuIEFURVNUQVJUICA9IFN0YXJ0IEFURSBNb2RlCisgICAgICAgIDEuIEFURVNUT1AgICA9IFN0b3AgQVRFIE1vZGUKKyAgICAgICAgMi4gVFhDT05UICAgID0gQ29udGludW91cyBUcmFuc21pdAorICAgICAgICAzLiBUWENBUlIgICAgPSBUcmFuc21pdCBDYXJyaWVyCisgICAgICAgIDQuIFRYRlJBTUUgICA9IFRyYW5zbWl0IEZyYW1lcworICAgICAgICA1LiBSWEZSQU1FICAgPSBSZWNlaXZlIEZyYW1lcworI2lmZGVmIFJBTElOS18yOHh4X1FBCisgICAgICAgIDYuIFRYU1RPUCAgICA9IFN0b3AgQW55IFR5cGUgb2YgVHJhbnNtaXRpb24KKyAgICAgICAgNy4gUlhTVE9QICAgID0gU3RvcCBSZWNlaXZpbmcgRnJhbWVzCisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKyNpZmRlZiBSVDI4NjAKK3N0YXRpYyBJTlQJQVRFQ21kSGFuZGxlcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUlOVDMyCQkJVmFsdWUgPSAwOworCVVDSEFSCQkJQmJwRGF0YTsKKwlVSU5UMzIJCQlNYWNEYXRhID0gMDsKKwlQVFhEX1NUUlVDCQlwVHhEOworCUlOVAkJCQlpbmRleDsKKwlVSU5UCQkJaT0wLCBhdGVtb2RlOworCVBSWERfU1RSVUMJCXBSeEQ7CisJUFJUTVBfVFhfUklORyAJcFR4UmluZyA9ICZwQWQtPlR4UmluZ1tRSURfQUNfQkVdOworI2lmbmRlZiBVQ09TCisJTkRJU19TVEFUVVMJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisjZW5kaWYgLy8gVUNPUyAvLworI2lmZGVmCVJUX0JJR19FTkRJQU4KKyAgICBQVFhEX1NUUlVDICAgICAgcERlc3RUeEQ7CisgICAgVFhEX1NUUlVDICAgICAgIFR4RDsKKyNlbmRpZgorCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gQVRFQ21kSGFuZGxlcigpXG4iKSk7CisKKwlBVEVBc2ljU3dpdGNoQ2hhbm5lbChwQWQpOworCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+YXRlLkNoYW5uZWwpOworCisJUlRNUHVzZWNEZWxheSg1MDAwKTsKKworCS8vIHJlYWQgTUFDX1NZU19DVFJMIGFuZCBiYWNrdXAgTUFDX1NZU19DVFJMIHZhbHVlLgorCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmTWFjRGF0YSk7CisKKwkvLyBEZWZhdWx0IHZhbHVlIGluIEJCUCBSMjIgaXMgMHgwLgorCUJicERhdGEgPSAwOworCisJLy8gY2xlYW4gYml0NCB0byBzdG9wIGNvbnRpbnVvdXMgVHggcHJvZHVjdGlvbiB0ZXN0LgorCU1hY0RhdGEgJj0gMHhGRkZGRkZFRjsKKworCWlmICghc3RyY21wKGFyZywgIkFURVNUQVJUIikpIAkJLy9FbnRlciBBVEUgbW9kZSBhbmQgc2V0IFR4L1J4IElkbGUKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURTogQVRFU1RBUlRcbiIpKTsKKworI2lmbmRlZiBVQ09TCisJCS8vIGNoZWNrIGlmIHdlIGhhdmUgcmVtb3ZlZCB0aGUgZmlybXdhcmUKKwkJaWYgKCEoQVRFX09OKHBBZCkpKQorCQl7CisJCQlOSUNFcmFzZUZpcm13YXJlKHBBZCk7CisJCX0KKyNlbmRpZiAvLyAhVUNPUyAvLworCQlhdGVtb2RlID0gcEFkLT5hdGUuTW9kZTsKKwkJcEFkLT5hdGUuTW9kZSA9IEFURV9TVEFSVDsKKy8vCQlwQWQtPmF0ZS5UeERvbmVDb3VudCA9IHBBZC0+YXRlLlR4Q291bnQ7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7CisKKwkJaWYgKGF0ZW1vZGUgJiBBVEVfVFhDQVJSKQorCQl7CisJCQkvLyBObyBDYXJyaWVyIFRlc3Qgc2V0IEJCUCBSMjIgYml0Nz0wLCBiaXQ2PTAsIGJpdFs1fjBdPTB4MAorCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCAmQmJwRGF0YSk7CisJCQlCYnBEYXRhICY9IDB4RkZGRkZGMDA7IC8vY2xlYXIgYml0NywgYml0NiwgYml0WzV+MF0KKwkJICAgIEFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsIEJicERhdGEpOworCQl9CisJCWVsc2UgaWYgKGF0ZW1vZGUgJiBBVEVfVFhDQVJSU1VQUCkKKwkJeworCQkJLy8gTm8gQ29udC4gVFggc2V0IEJCUCBSMjIgYml0Nz0wCisJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsICZCYnBEYXRhKTsKKwkJCUJicERhdGEgJj0gfigxIDw8IDcpOyAvL3NldCBiaXQ3PTAKKwkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsIEJicERhdGEpOworCisJCQkvLyBObyBDYXJyaWVyIFN1cHByZXNzaW9uIHNldCBCQlAgUjI0IGJpdDA9MAorCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjI0LCAmQmJwRGF0YSk7CisJCQlCYnBEYXRhICY9IDB4RkZGRkZGRkU7IC8vY2xlYXIgYml0MAorCQkgICAgQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyNCwgQmJwRGF0YSk7CisJCX0KKwkJLy8gV2Ugc2hvdWxkIGZyZWUgc29tZSByZXNvdXJjZSB3aGljaCB3YXMgYWxsb2NhdGVkIHdoZW4gQVRFX1RYRlJBTUUgLCBBVEVfU1RPUCwgYW5kIEFURV9UWENPTlQuCisJCWVsc2UgaWYgKChhdGVtb2RlICYgQVRFX1RYRlJBTUUpIHx8IChhdGVtb2RlID09IEFURV9TVE9QKSkKKwkJeworCQkJUFJUTVBfVFhfUklORyBwVHhSaW5nID0gJnBBZC0+VHhSaW5nW1FJRF9BQ19CRV07CisKKwkJCWlmIChhdGVtb2RlICYgQVRFX1RYQ09OVCkKKwkJCXsKKwkJCQkvLyBObyBDb250LiBUWCBzZXQgQkJQIFIyMiBiaXQ3PTAKKwkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsICZCYnBEYXRhKTsKKwkJCQlCYnBEYXRhICY9IH4oMSA8PCA3KTsgLy9zZXQgYml0Nz0wCisJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisJCQl9CisJCQkvLyBBYm9ydCBUeCwgUnggRE1BLgorCQkJUnRtcERtYUVuYWJsZShwQWQsIDApOworCQkJZm9yIChpPTA7IGk8VFhfUklOR19TSVpFOyBpKyspCisJCQl7CisJCQkJUE5ESVNfUEFDS0VUICBwUGFja2V0OworCisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKwkJCSAgICBwVHhEID0gKFBUWERfU1RSVUMpcEFkLT5UeFJpbmdbUUlEX0FDX0JFXS5DZWxsW2ldLkFsbG9jVmE7CisjZWxzZQorICAgICAgICAJCXBEZXN0VHhEID0gKFBUWERfU1RSVUMpcEFkLT5UeFJpbmdbUUlEX0FDX0JFXS5DZWxsW2ldLkFsbG9jVmE7CisgICAgICAgIAkJVHhEID0gKnBEZXN0VHhEOworICAgICAgICAJCXBUeEQgPSAmVHhEOworICAgICAgICAJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworI2VuZGlmCisJCQkJcFR4RC0+RE1BRE9ORSA9IDA7CisJCQkJcFBhY2tldCA9IHBUeFJpbmctPkNlbGxbaV0ucE5kaXNQYWNrZXQ7CisJCQkJaWYgKHBQYWNrZXQpCisJCQkJeworCQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIwLCBwVHhELT5TRExlbjAsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisJCQkJfQorCQkJCS8vQWx3YXlzIGFzc2lnbiBwTmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCisJCQkJcFR4UmluZy0+Q2VsbFtpXS5wTmRpc1BhY2tldCA9IE5VTEw7CisKKwkJCQlwUGFja2V0ID0gcFR4UmluZy0+Q2VsbFtpXS5wTmV4dE5kaXNQYWNrZXQ7CisJCQkJaWYgKHBQYWNrZXQpCisJCQkJeworCQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCBwVHhELT5TRExlbjEsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisJCQkJfQorCQkJCS8vQWx3YXlzIGFzc2lnbiBwTmV4dE5kaXNQYWNrZXQgYXMgTlVMTCBhZnRlciBjbGVhcgorCQkJCXBUeFJpbmctPkNlbGxbaV0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisJCQkJV3JpdGVCYWNrVG9EZXNjcmlwdG9yKChQVUNIQVIpcERlc3RUeEQsIChQVUNIQVIpcFR4RCwgRkFMU0UsIFRZUEVfVFhEKTsKKyNlbmRpZgorCQkJfQorCQkJLy8gU3RhcnQgVHgsIFJYIERNQQorCQkJUnRtcERtYUVuYWJsZShwQWQsIDEpOworCQl9CisJCS8vIHJlc2V0IFJ4IHN0YXRpc3RpY3MuCisJCXBBZC0+YXRlLkxhc3RTTlIwID0gMDsKKwkJcEFkLT5hdGUuTGFzdFNOUjEgPSAwOworCQlwQWQtPmF0ZS5MYXN0UnNzaTAgPSAwOworCQlwQWQtPmF0ZS5MYXN0UnNzaTEgPSAwOworCQlwQWQtPmF0ZS5MYXN0UnNzaTIgPSAwOworCQlwQWQtPmF0ZS5BdmdSc3NpMCA9IDA7CisJCXBBZC0+YXRlLkF2Z1Jzc2kxID0gMDsKKwkJcEFkLT5hdGUuQXZnUnNzaTIgPSAwOworCQlwQWQtPmF0ZS5BdmdSc3NpMFg4ID0gMDsKKwkJcEFkLT5hdGUuQXZnUnNzaTFYOCA9IDA7CisJCXBBZC0+YXRlLkF2Z1Jzc2kyWDggPSAwOworCQlwQWQtPmF0ZS5OdW1PZkF2Z1Jzc2lTYW1wbGUgPSAwOworCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwkJLy8gVHggZnJhbWUKKwkJcEFkLT5hdGUuYlFBVHhTdGFydCA9IEZBTFNFOworCQlwQWQtPmF0ZS5iUUFSeFN0YXJ0ID0gRkFMU0U7CisJCXBBZC0+YXRlLnNlcSA9IDA7CisKKwkJLy8gY291bnRlcnMKKwkJcEFkLT5hdGUuVTJNID0gMDsKKwkJcEFkLT5hdGUuT3RoZXJEYXRhID0gMDsKKwkJcEFkLT5hdGUuQmVhY29uID0gMDsKKwkJcEFkLT5hdGUuT3RoZXJDb3VudCA9IDA7CisJCXBBZC0+YXRlLlR4QWMwID0gMDsKKwkJcEFkLT5hdGUuVHhBYzEgPSAwOworCQlwQWQtPmF0ZS5UeEFjMiA9IDA7CisJCXBBZC0+YXRlLlR4QWMzID0gMDsKKwkJcEFkLT5hdGUuVHhIQ0NBID0gMDsKKwkJcEFkLT5hdGUuVHhNZ210ID0gMDsKKwkJcEFkLT5hdGUuUlNTSTAgPSAwOworCQlwQWQtPmF0ZS5SU1NJMSA9IDA7CisJCXBBZC0+YXRlLlJTU0kyID0gMDsKKwkJcEFkLT5hdGUuU05SMCA9IDA7CisJCXBBZC0+YXRlLlNOUjEgPSAwOworCisJCS8vIGNvbnRyb2wKKwkJcEFkLT5hdGUuVHhEb25lQ291bnQgPSAwOworCQlwQWQtPmF0ZS5UeFN0YXR1cyA9IDA7IC8vIHRhc2sgVHggc3RhdHVzIC8vIDAgLS0+IHRhc2sgaXMgaWRsZSwgMSAtLT4gdGFzayBpcyBydW5uaW5nCisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKworCQkvLyBTb2Z0IHJlc2V0IEJCUC4KKwkJQmJwU29mdFJlc2V0KHBBZCk7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkvLworCQkvLyBMaW5rRG93bigpIGhhcyAiQXNpY0Rpc2FibGVTeW5jKCk7IiBhbmQgIlJUTVBfQkJQX0lPX1IvVzhfQllfUkVHX0lEKCk7IiBpbnNpZGUuCisJCS8vCisvLyAgICAgIExpbmtEb3duKHBBZCwgRkFMU0UpOworLy8JCUFzaWNFbmFibGVCc3NTeW5jKHBBZCk7CisjaWZuZGVmIFVDT1MKKwkJbmV0aWZfc3RvcF9xdWV1ZShwQWQtPm5ldF9kZXYpOworI2VuZGlmIC8vICFVQ09TIC8vCisJCS8vCisJCS8vIElmIHdlIHNraXAgIkxpbmtEb3duKCkiLCB3ZSBzaG91bGQgZGlzYWJsZSBwcm90ZWN0aW9uCisJCS8vIHRvIHByZXZlbnQgZnJvbSBzZW5kaW5nIG91dCBSVFMgb3IgQ1RTLXRvLXNlbGYuCisJCS8vCisJCUFURURpc2FibGVBc2ljUHJvdGVjdChwQWQpOworCQlSVE1QU3RhdGlvblN0b3AocEFkKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkvKiBEaXNhYmxlIFR4ICovCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQlWYWx1ZSAmPSB+KDEgPDwgMik7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCisJCS8qIERpc2FibGUgUnggKi8KKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlICY9IH4oMSA8PCAzKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisJfQorCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiQVRFU1RPUCIpKQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFOiBBVEVTVE9QXG4iKSk7CisKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7IC8vIHJlY292ZXIgdGhlIE1BQ19TWVNfQ1RSTCByZWdpc3RlciBiYWNrLgorCisJCS8vIERpc2FibGUgVHgsIFJ4CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQlWYWx1ZSAmPSAoMHhmZmZmZmZmMyk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCisJCS8vIEFib3J0IFR4LCBSWCBETUEuCisJCVJ0bXBEbWFFbmFibGUocEFkLCAwKTsKKworI2lmbmRlZiBVQ09TCisJCXBBZC0+YXRlLmJGV0xvYWRpbmcgPSBUUlVFOworCQlTdGF0dXMgPSBOSUNMb2FkRmlybXdhcmUocEFkKTsKKwkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJOSUNMb2FkRmlybXdhcmUgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsIFN0YXR1cykpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisjZW5kaWYgLy8gIVVDT1MgLy8KKwkJcEFkLT5hdGUuTW9kZSA9IEFURV9TVE9QOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJLy8KKwkJLy8gRXZlbiB0aGUgZmlybXdhcmUgaGFzIGJlZW4gbG9hZGVkLAorCQkvLyB3ZSBzdGlsbCBjb3VsZCB1c2UgQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQoKS4KKwkJLy8gQnV0IHRoaXMgaXMgbm90IHN1Z2dlc3RlZC4KKwkJLy8KKwkJQmJwU29mdFJlc2V0KHBBZCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJTklDRGlzYWJsZUludGVycnVwdChwQWQpOworCisJCU5JQ0luaXRpYWxpemVBZGFwdGVyKHBBZCwgVFJVRSk7CisKKworCQkvLyBSZWluaXRpYWxpemUgUnggUmluZyBiZWZvcmUgUnggRE1BIGlzIGVuYWJsZWQuCisJCS8vIFRoZSBuaWdodG1hcmUgb2YgPj4+UnhDb2hlcmVudDw8PCB3YXMgZ29uZSAhCisJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFJYX1JJTkdfU0laRTsgaW5kZXgrKykKKwkJeworCQkJcFJ4RCA9IChQUlhEX1NUUlVDKSBwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5BbGxvY1ZhOworCQkJcFJ4RC0+RERPTkUgPSAwOworCQl9CisKKwkJLy8gV2Ugc2hvdWxkIHJlYWQgRUVQUk9NIGZvciBhbGwgY2FzZXMuCisJCU5JQ1JlYWRFRVBST01QYXJhbWV0ZXJzKHBBZCwgTlVMTCk7CisJCU5JQ0luaXRBc2ljRnJvbUVFUFJPTShwQWQpOworCisJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOworCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKworCQkvLworCQkvLyBFbmFibGUgSW50ZXJydXB0CisJCS8vCisKKwkJLy8KKwkJLy8gVGhlc2Ugc3RlcHMgYXJlIG9ubHkgZm9yIEFQQXV0b1NlbGVjdENoYW5uZWwoKS4KKwkJLy8KKyNpZiAwCisJCS8vcEFkLT5iU3RhRmlmb1Rlc3QgPSBUUlVFOworCQlwQWQtPmludF9lbmFibGVfcmVnID0gKChERUxBWUlOVE1BU0spICB8IChSeElOVHxUeERhdGFJbnR8VHhNZ210SW50KSkgJiB+KDB4MDMpOworCQlwQWQtPmludF9kaXNhYmxlX21hc2sgPSAwOworCQlwQWQtPmludF9wZW5kaW5nID0gMDsKKyNlbmRpZgorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBJTlRfU09VUkNFX0NTUiwgMHhmZmZmZmZmZik7ICAvLyBjbGVhciBnYXJiYWdlIGludGVycnVwdHMKKwkJTklDRW5hYmxlSW50ZXJydXB0KHBBZCk7CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwkJLyogcmVzdG9yZSBSWF9GSUxUUl9DRkcgKi8KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJLyogcmVzdG9yZSBSWF9GSUxUUl9DRkcgZHVlIHRvIHRoYXQgUUEgbWF5YmUgc2V0IGl0IHRvIDB4MyAqLworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9GSUxUUl9DRkcsIFNUQU5PUk1BTCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisJCS8vIEVuYWJsZSBUeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgfD0gKDEgPDwgMik7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCisJCS8vIEVuYWJsZSBUeCwgUnggRE1BLgorCQlSdG1wRG1hRW5hYmxlKHBBZCwgMSk7CisKKwkJLy8gRW5hYmxlIFJ4CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQlWYWx1ZSB8PSAoMSA8PCAzKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlSVE1QU3RhdGlvblN0YXJ0KHBBZCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisjaWZuZGVmIFVDT1MKKwkJbmV0aWZfc3RhcnRfcXVldWUocEFkLT5uZXRfZGV2KTsKKyNlbmRpZiAvLyAhVUNPUyAvLworCX0KKwllbHNlIGlmICghc3RyY21wKGFyZywgIlRYQ0FSUiIpKQkvLyBUeCBDYXJyaWVyCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVEU6IFRYQ0FSUlxuIikpOworCQlwQWQtPmF0ZS5Nb2RlIHw9IEFURV9UWENBUlI7CisKKwkJLy8gUUEgaGFzIGRvbmUgdGhlIGZvbGxvd2luZyBzdGVwcyBpZiBpdCBpcyB1c2VkLgorCQlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBGQUxTRSkKKwkJeworCQkJLy8gU29mdCByZXNldCBCQlAuCisJCQlCYnBTb2Z0UmVzZXQocEFkKTsKKworCQkJLy8gQ2FycmllciBUZXN0IHNldCBCQlAgUjIyIGJpdDc9MSwgYml0Nj0xLCBiaXRbNX4wXT0weDAxCisJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsICZCYnBEYXRhKTsKKwkJCUJicERhdGEgJj0gMHhGRkZGRkYwMDsgLy9jbGVhciBiaXQ3LCBiaXQ2LCBiaXRbNX4wXQorCQkJQmJwRGF0YSB8PSAweDAwMDAwMEMxOyAvL3NldCBiaXQ3PTEsIGJpdDY9MSwgYml0WzV+MF09MHgwMQorCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisKKwkJCS8vIHNldCBNQUNfU1lTX0NUUkwoMHgxMDA0KSBDb250aW51b3VzIFR4IFByb2R1Y3Rpb24gVGVzdCAoYml0NCkgPSAxCisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJCVZhbHVlID0gVmFsdWUgfCAweDAwMDAwMDEwOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisJCX0KKwl9CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICJUWENPTlQiKSkJLy8gVHggQ29udGludWUKKwl7CisJCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpCisJCXsKKwkJCS8qIHNldCBNQUNfU1lTX0NUUkwoMHgxMDA0KSBiaXQ0KENvbnRpbnVvdXMgVHggUHJvZHVjdGlvbiBUZXN0KQorCQkJICAgYW5kIGJpdDIoTUFDIFRYIGVuYWJsZSkgYmFjayB0byB6ZXJvLiAqLworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZNYWNEYXRhKTsKKwkJCU1hY0RhdGEgJj0gMHhGRkZGRkZFQjsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7CisKKwkJCS8vIHNldCBCQlAgUjIyIGJpdDc9MAorCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCAmQmJwRGF0YSk7CisJCQlCYnBEYXRhICY9IDB4RkZGRkZGN0Y7IC8vc2V0IGJpdDc9MAorCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisJCX0KKworCQkvKiBmb3IgVHhDb250IG1vZGUuCisJCSoqIFN0ZXAgMTogU2VuZCA1MCBwYWNrZXRzIGZpcnN0IHRoZW4gd2FpdCBmb3IgYSBtb21lbnQuCisJCSoqIFN0ZXAgMjogU2VuZCBtb3JlIDUwIHBhY2tldCB0aGVuIHN0YXJ0IGNvbnRpbnVlIG1vZGUuCisJCSovCisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURTogVFhDT05UXG4iKSk7CisJCS8vIFN0ZXAgMTogc2VuZCA1MCBwYWNrZXRzIGZpcnN0LgorCQlwQWQtPmF0ZS5Nb2RlIHw9IEFURV9UWENPTlQ7CisJCXBBZC0+YXRlLlR4Q291bnQgPSA1MDsKKyAgICAgICAgICAgICAgICAvKiBEbyBpdCBhZnRlciBUeC9SeCBETUEgaXMgYWJvcnRlZC4gKi8KKy8vCQlwQWQtPmF0ZS5UeERvbmVDb3VudCA9IDA7CisKKwkJLy8gU29mdCByZXNldCBCQlAuCisJCUJicFNvZnRSZXNldChwQWQpOworCisJCS8vIEFib3J0IFR4LCBSWCBETUEuCisJCVJ0bXBEbWFFbmFibGUocEFkLCAwKTsKKworCQkvLyBGaXggY2FuJ3Qgc21vb3RoIGtpY2sKKwkJeworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYMCArIFFJRF9BQ19CRSAqIDB4MTAsICAmcFR4UmluZy0+VHhEbWFJZHgpOworCQkJcFR4UmluZy0+VHhTd0ZyZWVJZHggPSBwVHhSaW5nLT5UeERtYUlkeDsKKwkJCXBUeFJpbmctPlR4Q3B1SWR4ID0gcFR4UmluZy0+VHhEbWFJZHg7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DVFhfSURYMCArIFFJRF9BQ19CRSAqIDB4MTAsIHBUeFJpbmctPlR4Q3B1SWR4KTsKKwkJfQorCisJCXBBZC0+YXRlLlR4RG9uZUNvdW50ID0gMDsKKworCQkvKiBPbmx5IG5lZWRlZCBpZiB3ZSBoYXZlIHRvIHNlbmQgc29tZSBub3JtYWwgZnJhbWVzLiAqLworCQlTZXRKYXBhbkZpbHRlcihwQWQpOworCisJCWZvciAoaSA9IDA7IChpIDwgVFhfUklOR19TSVpFLTEpICYmIChpIDwgcEFkLT5hdGUuVHhDb3VudCk7IGkrKykKKwkJeworCQkJUE5ESVNfUEFDS0VUIHBQYWNrZXQ7CisJCQlVSU5UMzIgVHhJZHggPSBwVHhSaW5nLT5UeENwdUlkeDsKKworI2lmbmRlZiBSVF9CSUdfRU5ESUFOCisJCQlwVHhEID0gKFBUWERfU1RSVUMpcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKKyNlbHNlCisJCQlwRGVzdFR4RCA9IChQVFhEX1NUUlVDKXBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7CisJCQlUeEQgPSAqcERlc3RUeEQ7CisJCQlwVHhEID0gJlR4RDsKKwkJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworI2VuZGlmCisJCQkvLyBDbGVhbiBjdXJyZW50IGNlbGwuCisJCQlwUGFja2V0ID0gcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5kaXNQYWNrZXQ7CisJCQlpZiAocFBhY2tldCkKKwkJCXsKKwkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIwLCBwVHhELT5TRExlbjAsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJCX0KKwkJCS8vQWx3YXlzIGFzc2lnbiBwTmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCisJCQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmRpc1BhY2tldCA9IE5VTEw7CisKKwkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQ7CisJCQlpZiAocFBhY2tldCkKKwkJCXsKKwkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCBwVHhELT5TRExlbjEsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJCX0KKwkJCS8vQWx3YXlzIGFzc2lnbiBwTmV4dE5kaXNQYWNrZXQgYXMgTlVMTCBhZnRlciBjbGVhcgorCQkJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworCQkJV3JpdGVCYWNrVG9EZXNjcmlwdG9yKChQVUNIQVIpcERlc3RUeEQsIChQVUNIQVIpcFR4RCwgRkFMU0UsIFRZUEVfVFhEKTsKKyNlbmRpZgorCisJCQlpZiAoQVRFU2V0VXBGcmFtZShwQWQsIFR4SWR4KSAhPSAwKQorCQkJCWJyZWFrOworCisJCQlJTkNfUklOR19JTkRFWChwVHhSaW5nLT5UeENwdUlkeCwgVFhfUklOR19TSVpFKTsKKwkJfQorCisgICAgICAgICAgICAgICAgLy8gU2V0dXAgZnJhbWUgZm9ybWF0LgorCQlBVEVTZXRVcEZyYW1lKHBBZCwgcFR4UmluZy0+VHhDcHVJZHgpOworCisJCS8vIFN0YXJ0IFR4LCBSWCBETUEuCisJCVJ0bXBEbWFFbmFibGUocEFkLCAxKTsKKworCQkvLyBFbmFibGUgVHgKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlIHw9ICgxIDw8IDIpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKworCQkvLyBEaXNhYmxlIFJ4CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQlWYWx1ZSAmPSB+KDEgPDwgMyk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwkJaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKKwkJeworCQkJcEFkLT5hdGUuVHhTdGF0dXMgPSAxOworCQkJLy9wQWQtPmF0ZS5SZXBlYXQgPSAwOworCQl9CisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKworCQkvLyBraWNrIFR4LVJpbmcuCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0NUWF9JRFgwICsgUUlEX0FDX0JFICogUklOR1JFR19ESUZGLCBwQWQtPlR4UmluZ1tRSURfQUNfQkVdLlR4Q3B1SWR4KTsKKworCQlSVE1QdXNlY0RlbGF5KDUwMDApOworCisKKwkJLy8gU3RlcCAyOiBzZW5kIG1vcmUgNTAgcGFja2V0cyB0aGVuIHN0YXJ0IGNvbnRpbnVlIG1vZGUuCisJCS8vIEFib3J0IFR4LCBSWCBETUEuCisJCVJ0bXBEbWFFbmFibGUocEFkLCAwKTsKKworCQkvLyBDb250LiBUWCBzZXQgQkJQIFIyMiBiaXQ3PTEKKwkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCAmQmJwRGF0YSk7CisJCUJicERhdGEgfD0gMHgwMDAwMDA4MDsgLy9zZXQgYml0Nz0xCisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsIEJicERhdGEpOworCisJCXBBZC0+YXRlLlR4Q291bnQgPSA1MDsKKworCQkvLyBGaXggY2FuJ3Qgc21vb3RoIGtpY2sKKwkJeworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYMCArIFFJRF9BQ19CRSAqIDB4MTAsICAmcFR4UmluZy0+VHhEbWFJZHgpOworCQkJcFR4UmluZy0+VHhTd0ZyZWVJZHggPSBwVHhSaW5nLT5UeERtYUlkeDsKKwkJCXBUeFJpbmctPlR4Q3B1SWR4ID0gcFR4UmluZy0+VHhEbWFJZHg7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DVFhfSURYMCArIFFJRF9BQ19CRSAqIDB4MTAsIHBUeFJpbmctPlR4Q3B1SWR4KTsKKwkJfQorCisJCXBBZC0+YXRlLlR4RG9uZUNvdW50ID0gMDsKKworCQlTZXRKYXBhbkZpbHRlcihwQWQpOworCisJCWZvciAoaSA9IDA7IChpIDwgVFhfUklOR19TSVpFLTEpICYmIChpIDwgcEFkLT5hdGUuVHhDb3VudCk7IGkrKykKKwkJeworCQkJUE5ESVNfUEFDS0VUIHBQYWNrZXQ7CisJCQlVSU5UMzIgVHhJZHggPSBwVHhSaW5nLT5UeENwdUlkeDsKKworI2lmbmRlZiBSVF9CSUdfRU5ESUFOCisJCQlwVHhEID0gKFBUWERfU1RSVUMpcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKKyNlbHNlCisJCQlwRGVzdFR4RCA9IChQVFhEX1NUUlVDKXBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7CisJCQlUeEQgPSAqcERlc3RUeEQ7CisJCQlwVHhEID0gJlR4RDsKKwkJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworI2VuZGlmCisJCQkvLyBjbGVhbiBjdXJyZW50IGNlbGwuCisJCQlwUGFja2V0ID0gcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5kaXNQYWNrZXQ7CisJCQlpZiAocFBhY2tldCkKKwkJCXsKKwkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIwLCBwVHhELT5TRExlbjAsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJCX0KKwkJCS8vQWx3YXlzIGFzc2lnbiBwTmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCisJCQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmRpc1BhY2tldCA9IE5VTEw7CisKKwkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQ7CisJCQlpZiAocFBhY2tldCkKKwkJCXsKKwkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCBwVHhELT5TRExlbjEsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJCX0KKwkJCS8vQWx3YXlzIGFzc2lnbiBwTmV4dE5kaXNQYWNrZXQgYXMgTlVMTCBhZnRlciBjbGVhcgorCQkJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworCQkJV3JpdGVCYWNrVG9EZXNjcmlwdG9yKChQVUNIQVIpcERlc3RUeEQsIChQVUNIQVIpcFR4RCwgRkFMU0UsIFRZUEVfVFhEKTsKKyNlbmRpZgorCisJCQlpZiAoQVRFU2V0VXBGcmFtZShwQWQsIFR4SWR4KSAhPSAwKQorCQkJCWJyZWFrOworCisJCQlJTkNfUklOR19JTkRFWChwVHhSaW5nLT5UeENwdUlkeCwgVFhfUklOR19TSVpFKTsKKwkJfQorCisJCUFURVNldFVwRnJhbWUocEFkLCBwVHhSaW5nLT5UeENwdUlkeCk7CisKKwkJLy8gU3RhcnQgVHgsIFJYIERNQS4KKwkJUnRtcERtYUVuYWJsZShwQWQsIDEpOworCisJCS8vIEVuYWJsZSBUeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgfD0gKDEgPDwgMik7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCisJCS8vIERpc2FibGUgUngKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlICY9IH4oMSA8PCAzKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCQlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKQorCQl7CisJCQlwQWQtPmF0ZS5UeFN0YXR1cyA9IDE7CisJCQkvL3BBZC0+YXRlLlJlcGVhdCA9IDA7CisJCX0KKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCisJCS8vIGtpY2sgVHgtUmluZy4KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQ1RYX0lEWDAgKyBRSURfQUNfQkUgKiBSSU5HUkVHX0RJRkYsIHBBZC0+VHhSaW5nW1FJRF9BQ19CRV0uVHhDcHVJZHgpOworCisJCVJUTVB1c2VjRGVsYXkoNTAwKTsKKworCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJk1hY0RhdGEpOworCQlNYWNEYXRhIHw9IDB4MDAwMDAwMTA7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7CisJfQorCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiVFhGUkFNRSIpKSAvLyBUeCBGcmFtZXMKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURTogVFhGUkFNRShDb3VudD0lZClcbiIsIHBBZC0+YXRlLlR4Q291bnQpKTsKKwkJcEFkLT5hdGUuTW9kZSB8PSBBVEVfVFhGUkFNRTsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisKKwkJLy8gU29mdCByZXNldCBCQlAuCisJCUJicFNvZnRSZXNldChwQWQpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIE1hY0RhdGEpOworCisJCS8vIEFib3J0IFR4LCBSWCBETUEuCisJCVJ0bXBEbWFFbmFibGUocEFkLCAwKTsKKworCQkvLyBGaXggY2FuJ3Qgc21vb3RoIGtpY2sKKwkJeworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYMCArIFFJRF9BQ19CRSAqIDB4MTAsICAmcFR4UmluZy0+VHhEbWFJZHgpOworCQkJcFR4UmluZy0+VHhTd0ZyZWVJZHggPSBwVHhSaW5nLT5UeERtYUlkeDsKKwkJCXBUeFJpbmctPlR4Q3B1SWR4ID0gcFR4UmluZy0+VHhEbWFJZHg7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DVFhfSURYMCArIFFJRF9BQ19CRSAqIDB4MTAsIHBUeFJpbmctPlR4Q3B1SWR4KTsKKwkJfQorCisJCXBBZC0+YXRlLlR4RG9uZUNvdW50ID0gMDsKKworCQlTZXRKYXBhbkZpbHRlcihwQWQpOworCisJCWZvciAoaSA9IDA7IChpIDwgVFhfUklOR19TSVpFLTEpICYmIChpIDwgcEFkLT5hdGUuVHhDb3VudCk7IGkrKykKKwkJeworCQkJUE5ESVNfUEFDS0VUIHBQYWNrZXQ7CisJCQlVSU5UMzIgVHhJZHggPSBwVHhSaW5nLT5UeENwdUlkeDsKKworI2lmbmRlZiBSVF9CSUdfRU5ESUFOCisJCQlwVHhEID0gKFBUWERfU1RSVUMpcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKKyNlbHNlCisJCQlwRGVzdFR4RCA9IChQVFhEX1NUUlVDKXBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7CisJCQlUeEQgPSAqcERlc3RUeEQ7CisJCQlwVHhEID0gJlR4RDsKKwkJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworI2VuZGlmCisJCQkvLyBDbGVhbiBjdXJyZW50IGNlbGwuCisJCQlwUGFja2V0ID0gcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5kaXNQYWNrZXQ7CisJCQlpZiAocFBhY2tldCkKKwkJCXsKKwkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIwLCBwVHhELT5TRExlbjAsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJCX0KKwkJCS8vQWx3YXlzIGFzc2lnbiBwTmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCisJCQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmRpc1BhY2tldCA9IE5VTEw7CisKKwkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQ7CisJCQlpZiAocFBhY2tldCkKKwkJCXsKKwkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCBwVHhELT5TRExlbjEsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJCX0KKwkJCS8vQWx3YXlzIGFzc2lnbiBwTmV4dE5kaXNQYWNrZXQgYXMgTlVMTCBhZnRlciBjbGVhcgorCQkJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworCQkJV3JpdGVCYWNrVG9EZXNjcmlwdG9yKChQVUNIQVIpcERlc3RUeEQsIChQVUNIQVIpcFR4RCwgRkFMU0UsIFRZUEVfVFhEKTsKKyNlbmRpZgorCisJCQlpZiAoQVRFU2V0VXBGcmFtZShwQWQsIFR4SWR4KSAhPSAwKQorCQkJCWJyZWFrOworCisJCQlJTkNfUklOR19JTkRFWChwVHhSaW5nLT5UeENwdUlkeCwgVFhfUklOR19TSVpFKTsKKworCQl9CisKKwkJQVRFU2V0VXBGcmFtZShwQWQsIHBUeFJpbmctPlR4Q3B1SWR4KTsKKworCQkvLyBTdGFydCBUeCwgUnggRE1BLgorCQlSdG1wRG1hRW5hYmxlKHBBZCwgMSk7CisKKwkJLy8gRW5hYmxlIFR4CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQlWYWx1ZSB8PSAoMSA8PCAyKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwkJLy8gYWRkIHRoaXMgZm9yIExvb3BCYWNrIG1vZGUKKwkJaWYgKHBBZC0+YXRlLmJRQVJ4U3RhcnQgPT0gRkFMU0UpCisJCXsKKwkJCS8vIERpc2FibGUgUngKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQkJVmFsdWUgJj0gfigxIDw8IDMpOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisJCX0KKworCQlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKQorCQl7CisJCQlwQWQtPmF0ZS5UeFN0YXR1cyA9IDE7CisJCQkvL3BBZC0+YXRlLlJlcGVhdCA9IDA7CisJCX0KKyNlbHNlCisJCS8vIERpc2FibGUgUngKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlICY9IH4oMSA8PCAzKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0RUWF9JRFgwICsgUUlEX0FDX0JFICogUklOR1JFR19ESUZGLCAmcEFkLT5UeFJpbmdbUUlEX0FDX0JFXS5UeERtYUlkeCk7CisJCS8vIGtpY2sgVHgtUmluZy4KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQ1RYX0lEWDAgKyBRSURfQUNfQkUgKiBSSU5HUkVHX0RJRkYsIHBBZC0+VHhSaW5nW1FJRF9BQ19CRV0uVHhDcHVJZHgpOworCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuS2lja1R4Q291bnQrKzsKKwl9CisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwllbHNlIGlmICghc3RyY21wKGFyZywgIlRYU1RPUCIpKQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFOiBUWFNUT1BcbiIpKTsKKwkJYXRlbW9kZSA9IHBBZC0+YXRlLk1vZGU7CisJCXBBZC0+YXRlLk1vZGUgJj0gQVRFX1RYU1RPUDsKKwkJcEFkLT5hdGUuYlFBVHhTdGFydCA9IEZBTFNFOworLy8JCXBBZC0+YXRlLlR4RG9uZUNvdW50ID0gcEFkLT5hdGUuVHhDb3VudDsKKworCQlpZiAoYXRlbW9kZSAmIEFURV9UWENBUlIpCisJCXsKKwkJCS8vIE5vIENhcnJpZXIgVGVzdCBzZXQgQkJQIFIyMiBiaXQ3PTAsIGJpdDY9MCwgYml0WzV+MF09MHgwCisJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsICZCYnBEYXRhKTsKKwkJCUJicERhdGEgJj0gMHhGRkZGRkYwMDsgLy9jbGVhciBiaXQ3LCBiaXQ2LCBiaXRbNX4wXQorCQkgICAgQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisJCX0KKwkJZWxzZSBpZiAoYXRlbW9kZSAmIEFURV9UWENBUlJTVVBQKQorCQl7CisJCQkvLyBObyBDb250LiBUWCBzZXQgQkJQIFIyMiBiaXQ3PTAKKwkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgJkJicERhdGEpOworCQkJQmJwRGF0YSAmPSB+KDEgPDwgNyk7IC8vc2V0IGJpdDc9MAorCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisKKwkJCS8vIE5vIENhcnJpZXIgU3VwcHJlc3Npb24gc2V0IEJCUCBSMjQgYml0MD0wCisJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjQsICZCYnBEYXRhKTsKKwkJCUJicERhdGEgJj0gMHhGRkZGRkZGRTsgLy9jbGVhciBiaXQwCisJCSAgICBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjI0LCBCYnBEYXRhKTsKKwkJfQorCQkvLyBXZSBzaG91bGQgZnJlZSBzb21lIHJlc291cmNlIHdoaWNoIGFsbG9jYXRlIHdoZW4gQVRFX1RYRlJBTUUgLCBBVEVfU1RPUCwgYW5kIEFURV9UWENPTlQuCisJCWVsc2UgaWYgKChhdGVtb2RlICYgQVRFX1RYRlJBTUUpIHx8IChhdGVtb2RlID09IEFURV9TVE9QKSkKKwkJeworCisJCQlQUlRNUF9UWF9SSU5HIHBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbUUlEX0FDX0JFXTsKKworCQkJaWYgKGF0ZW1vZGUgJiBBVEVfVFhDT05UKQorCQkJeworCQkJCS8vIE5vIENvbnQuIFRYIHNldCBCQlAgUjIyIGJpdDc9MAorCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgJkJicERhdGEpOworCQkJCUJicERhdGEgJj0gfigxIDw8IDcpOyAvL3NldCBiaXQ3PTAKKwkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKKwkJCX0KKworCQkJLy8gQWJvcnQgVHgsIFJ4IERNQS4KKwkJCVJ0bXBEbWFFbmFibGUocEFkLCAwKTsKKwkJCWZvciAoaT0wOyBpPFRYX1JJTkdfU0laRTsgaSsrKQorCQkJeworCQkJCVBORElTX1BBQ0tFVCAgcFBhY2tldDsKKworI2lmbmRlZiBSVF9CSUdfRU5ESUFOCisJCQkgICAgcFR4RCA9IChQVFhEX1NUUlVDKXBBZC0+VHhSaW5nW1FJRF9BQ19CRV0uQ2VsbFtpXS5BbGxvY1ZhOworI2Vsc2UKKyAgICAgICAgCQlwRGVzdFR4RCA9IChQVFhEX1NUUlVDKXBBZC0+VHhSaW5nW1FJRF9BQ19CRV0uQ2VsbFtpXS5BbGxvY1ZhOworICAgICAgICAJCVR4RCA9ICpwRGVzdFR4RDsKKyAgICAgICAgCQlwVHhEID0gJlR4RDsKKyAgICAgICAgCQlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKKyNlbmRpZgorCQkJCXBUeEQtPkRNQURPTkUgPSAwOworCQkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW2ldLnBOZGlzUGFja2V0OworCQkJCWlmIChwUGFja2V0KQorCQkJCXsKKwkJCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMCwgcFR4RC0+U0RMZW4wLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkJCX0KKwkJCQkvL0Fsd2F5cyBhc3NpZ24gcE5kaXNQYWNrZXQgYXMgTlVMTCBhZnRlciBjbGVhcgorCQkJCXBUeFJpbmctPkNlbGxbaV0ucE5kaXNQYWNrZXQgPSBOVUxMOworCisJCQkJcFBhY2tldCA9IHBUeFJpbmctPkNlbGxbaV0ucE5leHROZGlzUGFja2V0OworCQkJCWlmIChwUGFja2V0KQorCQkJCXsKKwkJCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMSwgcFR4RC0+U0RMZW4xLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkJCX0KKwkJCQkvL0Fsd2F5cyBhc3NpZ24gcE5leHROZGlzUGFja2V0IGFzIE5VTEwgYWZ0ZXIgY2xlYXIKKwkJCQlwVHhSaW5nLT5DZWxsW2ldLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7CisjaWZkZWYgUlRfQklHX0VORElBTgorCQkJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOworCQkJCVdyaXRlQmFja1RvRGVzY3JpcHRvcigoUFVDSEFSKXBEZXN0VHhELCAoUFVDSEFSKXBUeEQsIEZBTFNFLCBUWVBFX1RYRCk7CisjZW5kaWYKKwkJCX0KKwkJCS8vIEVuYWJsZSBUeCwgUnggRE1BCisJCQlSdG1wRG1hRW5hYmxlKHBBZCwgMSk7CisKKwkJfQorCisJCS8vIGNvbnRyb2wKKy8vCQlwQWQtPmF0ZS5UeERvbmVDb3VudCA9IDA7CisJCXBBZC0+YXRlLlR4U3RhdHVzID0gMDsgLy8gdGFzayBUeCBzdGF0dXMgLy8gMCAtLT4gdGFzayBpcyBpZGxlLCAxIC0tPiB0YXNrIGlzIHJ1bm5pbmcKKworCQkvLyBTb2Z0IHJlc2V0IEJCUC4KKwkJQmJwU29mdFJlc2V0KHBBZCk7CisKKwkJLy8gRGlzYWJsZSBUeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gfigxIDw8IDIpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKwl9CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICJSWFNUT1AiKSkKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURTogUlhTVE9QXG4iKSk7CisJCWF0ZW1vZGUgPSBwQWQtPmF0ZS5Nb2RlOworCQlwQWQtPmF0ZS5Nb2RlICY9IEFURV9SWFNUT1A7CisJCXBBZC0+YXRlLmJRQVJ4U3RhcnQgPSBGQUxTRTsKKy8vCQlwQWQtPmF0ZS5UeERvbmVDb3VudCA9IHBBZC0+YXRlLlR4Q291bnQ7CisKKwkJaWYgKGF0ZW1vZGUgJiBBVEVfVFhDQVJSKQorCQl7CisJCQk7CisJCX0KKwkJZWxzZSBpZiAoYXRlbW9kZSAmIEFURV9UWENBUlJTVVBQKQorCQl7CisJCQk7CisJCX0KKworCQkvLyBXZSBzaG91bGQgZnJlZSBzb21lIHJlc291cmNlIHdoaWNoIHdhcyBhbGxvY2F0ZWQgd2hlbiBBVEVfVFhGUkFNRSAsIEFURV9TVE9QLCBhbmQgQVRFX1RYQ09OVC4KKwkJZWxzZSBpZiAoKGF0ZW1vZGUgJiBBVEVfVFhGUkFNRSkgfHwgKGF0ZW1vZGUgPT0gQVRFX1NUT1ApKQorCQl7CisJCQlpZiAoYXRlbW9kZSAmIEFURV9UWENPTlQpCisJCQl7CisJCQkJOworCQkJfQorCQl9CisKKwkJLy8gY29udHJvbAorLy8JCXBBZC0+YXRlLlR4RG9uZUNvdW50ID0gMDsKKy8vCQlwQWQtPmF0ZS5UeFN0YXR1cyA9IDA7IC8vIHRhc2sgVHggc3RhdHVzIC8vIDAgLS0+IHRhc2sgaXMgaWRsZSwgMSAtLT4gdGFzayBpcyBydW5uaW5nCisKKwkJLy8gU29mdCByZXNldCBCQlAuCisJCUJicFNvZnRSZXNldChwQWQpOworCisJCS8vIERpc2FibGUgUngKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlICY9IH4oMSA8PCAzKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisJfQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICJSWEZSQU1FIikpIC8vIFJ4IEZyYW1lcworCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFOiBSWEZSQU1FXG4iKSk7CisKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7CisKKwkJcEFkLT5hdGUuTW9kZSB8PSBBVEVfUlhGUkFNRTsKKworCQkvLyBEaXNhYmxlIFR4IG9mIE1BQyBibG9jay4KKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlICY9IH4oMSA8PCAyKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKwkJLy8gRW5hYmxlIFJ4IG9mIE1BQyBibG9jay4KKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlIHw9ICgxIDw8IDMpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKwl9CisJZWxzZQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFOiBJbnZhbGlkIGFyZyFcbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlSVE1QdXNlY0RlbGF5KDUwMDApOworCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PSBBVEVDbWRIYW5kbGVyKClcbiIpKTsKKworCXJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIFJUMjg2MCAvLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT1FbmQgb2YgUlQyODYwPT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PVN0YXJ0IG9mIFJUMjg3MD09PT09PT09PT09PT09PT09PT09PT0qLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworCitJTlQJU2V0X0FURV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlpZiAoQVRFQ21kSGFuZGxlcihwQWQsIGFyZykpCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfUHJvYyBTdWNjZXNzXG4iKSk7CisKKworCQlyZXR1cm4gVFJVRTsKKwl9CisJZWxzZQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1Byb2MgRmFpbGVkXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBBRERSMT1EQSBmb3IgVHhGcmFtZShBUCAgOiBUbyBEUyA9IDAgOyBGcm9tIERTID0gMSkKKyAgICAgICAgb3IKKyAgICAgICAgU2V0IEFURSBBRERSMz1EQSBmb3IgVHhGcmFtZShTVEEgOiBUbyBEUyA9IDEgOyBGcm9tIERTID0gMCkKKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfREFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJQ0hBUgkJCQkqdmFsdWU7CisJSU5UCQkJCQlpOworCisJaWYoc3RybGVuKGFyZykgIT0gMTcpICAvL01hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNworCQlyZXR1cm4gRkFMU0U7CisKKyAgICBmb3IgKGk9MCwgdmFsdWUgPSByc3RydG9rKGFyZywgIjoiKTsgdmFsdWU7IHZhbHVlID0gcnN0cnRvayhOVUxMLCAiOiIpKQorCXsKKwkJaWYoKHN0cmxlbih2YWx1ZSkgIT0gMikgfHwgKCFpc3hkaWdpdCgqdmFsdWUpKSB8fCAoIWlzeGRpZ2l0KCoodmFsdWUrMSkpKSApCisJCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUF0b0godmFsdWUsICZwQWQtPmF0ZS5BZGRyM1tpKytdLCAxKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl9CisKKwlpZihpICE9IDYpCisJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZAorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX0RBX1Byb2MgKERBID0gJTJYOiUyWDolMlg6JTJYOiUyWDolMlgpXG4iLCBwQWQtPmF0ZS5BZGRyM1swXSwKKwkJcEFkLT5hdGUuQWRkcjNbMV0sIHBBZC0+YXRlLkFkZHIzWzJdLCBwQWQtPmF0ZS5BZGRyM1szXSwgcEFkLT5hdGUuQWRkcjNbNF0sIHBBZC0+YXRlLkFkZHIzWzVdKSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfREFfUHJvYyBTdWNjZXNzXG4iKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIEFERFIzPVNBIGZvciBUeEZyYW1lKEFQICA6IFRvIERTID0gMCA7IEZyb20gRFMgPSAxKQorICAgICAgICBvcgorICAgICAgICBTZXQgQVRFIEFERFIyPVNBIGZvciBUeEZyYW1lKFNUQSA6IFRvIERTID0gMSA7IEZyb20gRFMgPSAwKQorCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9TQV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlDSEFSCQkJCSp2YWx1ZTsKKwlJTlQJCQkJCWk7CisKKwlpZihzdHJsZW4oYXJnKSAhPSAxNykgIC8vTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgMDE6MDI6MDM6MDQ6MDU6MDYgbGVuZ3RoIDE3CisJCXJldHVybiBGQUxTRTsKKworICAgIGZvciAoaT0wLCB2YWx1ZSA9IHJzdHJ0b2soYXJnLCAiOiIpOyB2YWx1ZTsgdmFsdWUgPSByc3RydG9rKE5VTEwsICI6IikpCisJeworCQlpZigoc3RybGVuKHZhbHVlKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCp2YWx1ZSkpIHx8ICghaXN4ZGlnaXQoKih2YWx1ZSsxKSkpICkKKwkJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZAorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJQXRvSCh2YWx1ZSwgJnBBZC0+YXRlLkFkZHIyW2krK10sIDEpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KKworCWlmKGkgIT0gNikKKwkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfU0FfUHJvYyAoU0EgPSAlMlg6JTJYOiUyWDolMlg6JTJYOiUyWClcbiIsIHBBZC0+YXRlLkFkZHIyWzBdLAorCQlwQWQtPmF0ZS5BZGRyMlsxXSwgcEFkLT5hdGUuQWRkcjJbMl0sIHBBZC0+YXRlLkFkZHIyWzNdLCBwQWQtPmF0ZS5BZGRyMls0XSwgcEFkLT5hdGUuQWRkcjJbNV0pKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9TQV9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgQUREUjI9QlNTSUQgZm9yIFR4RnJhbWUoQVAgIDogVG8gRFMgPSAwIDsgRnJvbSBEUyA9IDEpCisgICAgICAgIG9yCisgICAgICAgIFNldCBBVEUgQUREUjE9QlNTSUQgZm9yIFR4RnJhbWUoU1RBIDogVG8gRFMgPSAxIDsgRnJvbSBEUyA9IDApCisKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQVRFX0JTU0lEX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCUNIQVIJCQkJKnZhbHVlOworCUlOVAkJCQkJaTsKKworCWlmKHN0cmxlbihhcmcpICE9IDE3KSAgLy9NYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcKKwkJcmV0dXJuIEZBTFNFOworCisgICAgZm9yIChpPTAsIHZhbHVlID0gcnN0cnRvayhhcmcsICI6Iik7IHZhbHVlOyB2YWx1ZSA9IHJzdHJ0b2soTlVMTCwgIjoiKSkKKwl7CisJCWlmKChzdHJsZW4odmFsdWUpICE9IDIpIHx8ICghaXN4ZGlnaXQoKnZhbHVlKSkgfHwgKCFpc3hkaWdpdCgqKHZhbHVlKzEpKSkgKQorCQkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlBdG9IKHZhbHVlLCAmcEFkLT5hdGUuQWRkcjFbaSsrXSwgMSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfQorCisJaWYoaSAhPSA2KQorCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9CU1NJRF9Qcm9jIChCU1NJRCA9ICUyWDolMlg6JTJYOiUyWDolMlg6JTJYKVxuIiwJcEFkLT5hdGUuQWRkcjFbMF0sCisJCXBBZC0+YXRlLkFkZHIxWzFdLCBwQWQtPmF0ZS5BZGRyMVsyXSwgcEFkLT5hdGUuQWRkcjFbM10sIHBBZC0+YXRlLkFkZHIxWzRdLCBwQWQtPmF0ZS5BZGRyMVs1XSkpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX0JTU0lEX1Byb2MgU3VjY2Vzc1xuIikpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBUeCBDaGFubmVsCisKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQVRFX0NIQU5ORUxfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUNIQVIgY2hhbm5lbDsKKworCWNoYW5uZWwgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKChjaGFubmVsIDwgMSkgfHwgKGNoYW5uZWwgPiAyMTYpKS8vIHRvIGFsbG93IEEgYmFuZCBjaGFubmVsIDogKChjaGFubmVsIDwgMSkgfHwgKGNoYW5uZWwgPiAxNCkpCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX0NIQU5ORUxfUHJvYzo6T3V0IG9mIHJhbmdlLCBpdCBzaG91bGQgYmUgaW4gcmFuZ2Ugb2YgMX4xNC5cbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlwQWQtPmF0ZS5DaGFubmVsID0gY2hhbm5lbDsKKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfQ0hBTk5FTF9Qcm9jIChBVEUgQ2hhbm5lbCA9ICVkKVxuIiwgcEFkLT5hdGUuQ2hhbm5lbCkpOworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9DSEFOTkVMX1Byb2MgU3VjY2Vzc1xuIikpOworCisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIFR4IFBvd2VyMAorCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9UWF9QT1dFUjBfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJQ0hBUiBUeFBvd2VyOworCisJVHhQb3dlciA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAocEFkLT5hdGUuQ2hhbm5lbCA8PSAxNCkKKwl7CisJCWlmICgoVHhQb3dlciA+IDMxKSB8fCAoVHhQb3dlciA8IDApKQorCQl7CisJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX1BPV0VSMF9Qcm9jOjpPdXQgb2YgcmFuZ2UgKFZhbHVlPSVkKVxuIiwgVHhQb3dlcikpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJfQorCWVsc2UvLyA1LjVHSHoKKwl7CisJCWlmICgoVHhQb3dlciA+IDE1KSB8fCAoVHhQb3dlciA8IC03KSkKKwkJeworCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9UWF9QT1dFUjBfUHJvYzo6T3V0IG9mIHJhbmdlIChWYWx1ZT0lZClcbiIsIFR4UG93ZXIpKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCX0KKworCXBBZC0+YXRlLlR4UG93ZXIwID0gVHhQb3dlcjsKKwlBVEVUeFB3ckhhbmRsZXIocEFkLCAwKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfVFhfUE9XRVIwX1Byb2MgU3VjY2Vzc1xuIikpOworCisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIFR4IFBvd2VyMQorCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9UWF9QT1dFUjFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJQ0hBUiBUeFBvd2VyOworCisJVHhQb3dlciA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAocEFkLT5hdGUuQ2hhbm5lbCA8PSAxNCkKKwl7CisJaWYgKChUeFBvd2VyID4gMzEpIHx8IChUeFBvd2VyIDwgMCkpCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX1BPV0VSMV9Qcm9jOjpPdXQgb2YgcmFuZ2UgKFZhbHVlPSVkKVxuIiwgVHhQb3dlcikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCX0KKwllbHNlCisJeworCQlpZiAoKFR4UG93ZXIgPiAxNSkgfHwgKFR4UG93ZXIgPCAtNykpCisJCXsKKwkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfUE9XRVIxX1Byb2M6Ok91dCBvZiByYW5nZSAoVmFsdWU9JWQpXG4iLCBUeFBvd2VyKSk7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwl9CisKKwlwQWQtPmF0ZS5UeFBvd2VyMSA9IFR4UG93ZXI7CisJQVRFVHhQd3JIYW5kbGVyKHBBZCwgMSk7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1RYX1BPV0VSMV9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBUeCBBbnRlbm5hCisKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQVRFX1RYX0FudGVubmFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJQ0hBUiB2YWx1ZTsKKworCXZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmICgodmFsdWUgPiAyKSB8fCAodmFsdWUgPCAwKSkKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfQW50ZW5uYV9Qcm9jOjpPdXQgb2YgcmFuZ2UgKFZhbHVlPSVkKVxuIiwgdmFsdWUpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXBBZC0+YXRlLlR4QW50ZW5uYVNlbCA9IHZhbHVlOworCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9UWF9BbnRlbm5hX1Byb2MgKEFudGVubmEgPSAlZClcbiIsIHBBZC0+YXRlLlR4QW50ZW5uYVNlbCkpOworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUmFsaW5rOiBTZXRfQVRFX1RYX0FudGVubmFfUHJvYyBTdWNjZXNzXG4iKSk7CisKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgUnggQW50ZW5uYQorCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9SWF9BbnRlbm5hX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCUNIQVIgdmFsdWU7CisKKwl2YWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoKHZhbHVlID4gMykgfHwgKHZhbHVlIDwgMCkpCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1JYX0FudGVubmFfUHJvYzo6T3V0IG9mIHJhbmdlIChWYWx1ZT0lZClcbiIsIHZhbHVlKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlwQWQtPmF0ZS5SeEFudGVubmFTZWwgPSB2YWx1ZTsKKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfUlhfQW50ZW5uYV9Qcm9jIChBbnRlbm5hID0gJWQpXG4iLCBwQWQtPmF0ZS5SeEFudGVubmFTZWwpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfUlhfQW50ZW5uYV9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBSRiBmcmVxdWVuY2Ugb2Zmc2V0CisKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQVRFX1RYX0ZSRVFPRkZTRVRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUNIQVIgUkZGcmVxT2Zmc2V0OworCVVMT05HIFI0OworCisJUkZGcmVxT2Zmc2V0ID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmKFJGRnJlcU9mZnNldCA+PSA2NCkKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfRlJFUU9GRlNFVF9Qcm9jOjpPdXQgb2YgcmFuZ2UsIGl0IHNob3VsZCBiZSBpbiByYW5nZSBvZiAwfjYzLlxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJcEFkLT5hdGUuUkZGcmVxT2Zmc2V0ID0gUkZGcmVxT2Zmc2V0OworCVI0ID0gcEFkLT5hdGUuUkZGcmVxT2Zmc2V0IDw8IDE1OwkJLy8gc2hpZnQgVFggcG93ZXIgY29udHJvbCB0byBjb3JyZWN0IFJGIHJlZ2lzdGVyIGJpdCBwb3NpdGlvbgorCVI0IHw9IChwQWQtPkxhdGNoUmZSZWdzLlI0ICYgKCh+MHgwMDFmODAwMCkpKTsKKwlwQWQtPkxhdGNoUmZSZWdzLlI0ID0gUjQ7CisKKwlSdG1wUmZJb1dyaXRlKHBBZCk7CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1RYX0ZSRVFPRkZTRVRfUHJvYyAoUkZGcmVxT2Zmc2V0ID0gJWQpXG4iLCBwQWQtPmF0ZS5SRkZyZXFPZmZzZXQpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfVFhfRlJFUU9GRlNFVF9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBSRiBCVworCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9UWF9CV19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlpbnQgaTsKKwlVQ0hBUiB2YWx1ZSA9IDA7CisJVUNIQVIgQkJQQ3VycmVudEJXOworCisJQkJQQ3VycmVudEJXID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmKEJCUEN1cnJlbnRCVyA9PSAwKQorCQlwQWQtPmF0ZS5UeFdJLkJXID0gQldfMjA7CisJZWxzZQorCQlwQWQtPmF0ZS5UeFdJLkJXID0gQldfNDA7CisKKwlpZihwQWQtPmF0ZS5UeFdJLkJXID09IEJXXzIwKQorCXsKKwkJaWYocEFkLT5hdGUuQ2hhbm5lbCA8PSAxNCkKKwkJeworIAkJZm9yIChpPTA7IGk8NTsgaSsrKQorIAkJeworCQkJCWlmIChwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbaV0gIT0gMHhmZmZmZmZmZikKKwkJCQl7CisJCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BXUl9DRkdfMCArIGkqNCwgcEFkLT5UeDIwTVB3ckNmZ0dCYW5kW2ldKTsKKwkJCQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlmb3IgKGk9MDsgaTw1OyBpKyspCisJCQl7CisJCQkJaWYgKHBBZC0+VHgyME1Qd3JDZmdBQmFuZFtpXSAhPSAweGZmZmZmZmZmKQorIAkJCXsKKwkJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUFdSX0NGR18wICsgaSo0LCBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbaV0pOworIAkJCQlSVE1QdXNlY0RlbGF5KDUwMDApOworIAkJCX0KKyAJCX0KKwkJfQorCisJCS8vU2V0IEJCUCBSNCBiaXRbNDozXT0wOjAKKyAJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmdmFsdWUpOworIAkJdmFsdWUgJj0gKH4weDE4KTsKKyAJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgdmFsdWUpOworCisgIAkJLy9TZXQgQkJQIFI2Nj0weDNDCisgCQl2YWx1ZSA9IDB4M0M7CisgCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCB2YWx1ZSk7CisJCS8vU2V0IEJCUCBSNjg9MHgwQgorCQkvL3RvIGltcHJvdmUgUnggc2Vuc2l0aXZpdHkuCisJCXZhbHVlID0gMHgwQjsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OCwgdmFsdWUpOworCQkvL1NldCBCQlAgUjY5PTB4MTYKKwkJdmFsdWUgPSAweDE2OworIAkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgdmFsdWUpOworCQkvL1NldCBCQlAgUjcwPTB4MDgKKwkJdmFsdWUgPSAweDA4OworIAkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgdmFsdWUpOworCQkvL1NldCBCQlAgUjczPTB4MTEKKwkJdmFsdWUgPSAweDExOworIAkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MywgdmFsdWUpOworCisJICAgIC8vIElmIENoYW5uZWw9MTQsIEJhbmR3aWR0aD0yME0gYW5kIE1vZGU9Q0NLLCBTZXQgQkJQIFI0IGJpdDU9MQorCSAgICAvLyAoSmFwYW4gZmlsdGVyIGNvZWZmaWNpZW50cykKKwkgICAgLy8gVGhpcyBzZWdtZW50IG9mIGNvZGUgd2lsbCBvbmx5IHdvcmtzIHdoZW4gQVRFVFhNT0RFIGFuZCBBVEVDSEFOTkVMCisJICAgIC8vIHdlcmUgc2V0IHRvIE1PREVfQ0NLIGFuZCAxNCByZXNwZWN0aXZlbHkgYmVmb3JlIEFURVRYQlcgaXMgc2V0IHRvIDAuCisJICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCWlmIChwQWQtPmF0ZS5DaGFubmVsID09IDE0KQorCQl7CisJCQlpbnQgVHhNb2RlID0gcEFkLT5hdGUuVHhXSS5QSFlNT0RFOworCQkJaWYgKFR4TW9kZSA9PSBNT0RFX0NDSykKKwkJCXsKKwkJCQkvLyB3aGVuIENoYW5uZWw9PTE0ICYmIE1vZGU9PUNDSyAmJiBCYW5kV2lkdGg9PTIwTSwgQkJQIFI0IGJpdDU9MQorIAkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJnZhbHVlKTsKKwkJCQl2YWx1ZSB8PSAweDIwOyAvL3NldCBiaXQ1PTEKKyAJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCB2YWx1ZSk7CisJCQl9CisJCX0KKworCSAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkvLyBJZiBiYW5kd2lkdGggIT0gNDBNLCBSRiBSZWc0IGJpdCAyMSA9IDAuCisJCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgJj0gfjB4MDAyMDAwMDA7CisJCVJ0bXBSZklvV3JpdGUocEFkKTsKKwl9CisJZWxzZSBpZihwQWQtPmF0ZS5UeFdJLkJXID09IEJXXzQwKQorCXsKKwkJaWYocEFkLT5hdGUuQ2hhbm5lbCA8PSAxNCkKKwkJeworCQkJZm9yIChpPTA7IGk8NTsgaSsrKQorCQkJeworCQkJCWlmIChwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbaV0gIT0gMHhmZmZmZmZmZikKKwkJCQl7CisJCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BXUl9DRkdfMCArIGkqNCwgcEFkLT5UeDQwTVB3ckNmZ0dCYW5kW2ldKTsKKwkJCQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlmb3IgKGk9MDsgaTw1OyBpKyspCisJCQl7CisJCQkJaWYgKHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFtpXSAhPSAweGZmZmZmZmZmKQorCQkJCXsKKwkJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUFdSX0NGR18wICsgaSo0LCBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbaV0pOworCQkJCQlSVE1QdXNlY0RlbGF5KDUwMDApOworCQkJCX0KKwkJCX0KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCWlmICgocEFkLT5hdGUuVHhXSS5QSFlNT0RFID49IE1PREVfSFRNSVgpICYmIChwQWQtPmF0ZS5UeFdJLk1DUyA9PSA3KSkKKwkJCXsKKyAgICAJCQl2YWx1ZSA9IDB4Mjg7CisgICAgCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NywgdmFsdWUpOworCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQl9CisKKwkJLy9TZXQgQkJQIFI0IGJpdFs0OjNdPTE6MAorCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJnZhbHVlKTsKKwkJdmFsdWUgJj0gKH4weDE4KTsKKwkJdmFsdWUgfD0gMHgxMDsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCB2YWx1ZSk7CisKKwkJLy9TZXQgQkJQIFI2Nj0weDNDCisJCXZhbHVlID0gMHgzQzsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgdmFsdWUpOworCQkvL1NldCBCQlAgUjY4PTB4MEMKKwkJLy90byBpbXByb3ZlIFJ4IHNlbnNpdGl2aXR5LgorCQl2YWx1ZSA9IDB4MEM7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjgsIHZhbHVlKTsKKwkJLy9TZXQgQkJQIFI2OT0weDFBCisJCXZhbHVlID0gMHgxQTsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgdmFsdWUpOworCQkvL1NldCBCQlAgUjcwPTB4MEEKKwkJdmFsdWUgPSAweDBBOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCB2YWx1ZSk7CisJCS8vU2V0IEJCUCBSNzM9MHgxNgorCQl2YWx1ZSA9IDB4MTY7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzMsIHZhbHVlKTsKKworCQkvLyBJZiBiYW5kd2lkdGggPSA0ME0sIHNldCBSRiBSZWc0IGJpdCAyMSA9IDEuCisJCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgfD0gMHgwMDIwMDAwMDsKKwkJUnRtcFJmSW9Xcml0ZShwQWQpOworCX0KKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfVFhfQldfUHJvYyAoQkJQQ3VycmVudEJXID0gJWQpXG4iLCBwQWQtPmF0ZS5UeFdJLkJXKSk7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1RYX0JXX1Byb2MgU3VjY2Vzc1xuIikpOworCisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIFR4IGZyYW1lIGxlbmd0aAorCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9UWF9MRU5HVEhfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJcEFkLT5hdGUuVHhMZW5ndGggPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYoKHBBZC0+YXRlLlR4TGVuZ3RoIDwgMjQpIHx8IChwQWQtPmF0ZS5UeExlbmd0aCA+IChNQVhfRlJBTUVfU0laRSAtIDM0LyogPT0gMjMxMiAqLykpKQorCXsKKwkJcEFkLT5hdGUuVHhMZW5ndGggPSAoTUFYX0ZSQU1FX1NJWkUgLSAzNC8qID09IDIzMTIgKi8pOworCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX0xFTkdUSF9Qcm9jOjpPdXQgb2YgcmFuZ2UsIGl0IHNob3VsZCBiZSBpbiByYW5nZSBvZiAyNH4lZC5cbiIsIChNQVhfRlJBTUVfU0laRSAtIDM0LyogPT0gMjMxMiAqLykpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfVFhfTEVOR1RIX1Byb2MgKFR4TGVuZ3RoID0gJWQpXG4iLCBwQWQtPmF0ZS5UeExlbmd0aCkpOworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9UWF9MRU5HVEhfUHJvYyBTdWNjZXNzXG4iKSk7CisKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgVHggZnJhbWUgY291bnQKKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfVFhfQ09VTlRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJcEFkLT5hdGUuVHhDb3VudCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1RYX0NPVU5UX1Byb2MgKFR4Q291bnQgPSAlZClcbiIsIHBBZC0+YXRlLlR4Q291bnQpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfVFhfQ09VTlRfUHJvYyBTdWNjZXNzXG4iKSk7CisKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgVHggZnJhbWUgTUNTCisKKyAgICAgICAgUmV0dXJuOgorICAgICAgICAJVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfVFhfTUNTX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVDSEFSIE1DUzsKKwlpbnQgcmVzdWx0OworCisJTUNTID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKwlyZXN1bHQgPSBDaGVja01DU1ZhbGlkKHBBZC0+YXRlLlR4V0kuUEhZTU9ERSwgTUNTKTsKKworCWlmIChyZXN1bHQgIT0gLTEpCisJeworCQlwQWQtPmF0ZS5UeFdJLk1DUyA9IChVQ0hBUilNQ1M7CisJfQorCWVsc2UKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfTUNTX1Byb2M6Ok91dCBvZiByYW5nZSwgcmVmZXIgdG8gcmF0ZSB0YWJsZS5cbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfVFhfTUNTX1Byb2MgKE1DUyA9ICVkKVxuIiwgcEFkLT5hdGUuVHhXSS5NQ1MpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfVFhfTUNTX1Byb2MgU3VjY2Vzc1xuIikpOworCisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIFR4IGZyYW1lIE1vZGUKKyAgICAgICAgMDogTU9ERV9DQ0sKKyAgICAgICAgMTogTU9ERV9PRkRNCisgICAgICAgIDI6IE1PREVfSFRNSVgKKyAgICAgICAgMzogTU9ERV9IVEdSRUVORklFTEQKKworICAgICAgICBSZXR1cm46CisgICAgICAgIAlUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9UWF9NT0RFX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCXBBZC0+YXRlLlR4V0kuUEhZTU9ERSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZihwQWQtPmF0ZS5UeFdJLlBIWU1PREUgPiAzKQorCXsKKwkJcEFkLT5hdGUuVHhXSS5QSFlNT0RFID0gMDsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9UWF9NT0RFX1Byb2M6Ok91dCBvZiByYW5nZS4gaXQgc2hvdWxkIGJlIGluIHJhbmdlIG9mIDB+M1xuIikpOworCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIwOiBDQ0ssIDE6IE9GRE0sIDI6IEhUX01JWCwgMzogSFRfR1JFRU5fRklFTEQuXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1RYX01PREVfUHJvYyAoVHhNb2RlID0gJWQpXG4iLCBwQWQtPmF0ZS5UeFdJLlBIWU1PREUpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfVFhfTU9ERV9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBUeCBmcmFtZSBHSQorCisgICAgICAgIFJldHVybjoKKyAgICAgICAgCVRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQVRFX1RYX0dJX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCXBBZC0+YXRlLlR4V0kuU2hvcnRHSSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZihwQWQtPmF0ZS5UeFdJLlNob3J0R0kgPiAxKQorCXsKKwkJcEFkLT5hdGUuVHhXSS5TaG9ydEdJID0gMDsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9UWF9HSV9Qcm9jOjpPdXQgb2YgcmFuZ2VcbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfVFhfR0lfUHJvYyAoR0kgPSAlZClcbiIsIHBBZC0+YXRlLlR4V0kuU2hvcnRHSSkpOworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9UWF9HSV9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitJTlQJU2V0X0FURV9SWF9GRVJfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJcEFkLT5hdGUuYlJ4RmVyID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChwQWQtPmF0ZS5iUnhGZXIgPT0gMSkKKwl7CisJCXBBZC0+YXRlLlJ4Q250UGVyU2VjID0gMDsKKwkJcEFkLT5hdGUuUnhUb3RhbENudCA9IDA7CisJfQorCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9SWF9GRVJfUHJvYyAoYlJ4RmVyID0gJWQpXG4iLCBwQWQtPmF0ZS5iUnhGZXIpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfUlhfRkVSX1Byb2MgU3VjY2Vzc1xuIikpOworCisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UIFNldF9BVEVfUmVhZF9SRl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlhdGVfcHJpbnQoS0VSTl9FTUVSRyAiUjEgPSAlbHhcbiIsIHBBZC0+TGF0Y2hSZlJlZ3MuUjEpOworCWF0ZV9wcmludChLRVJOX0VNRVJHICJSMiA9ICVseFxuIiwgcEFkLT5MYXRjaFJmUmVncy5SMik7CisJYXRlX3ByaW50KEtFUk5fRU1FUkcgIlIzID0gJWx4XG4iLCBwQWQtPkxhdGNoUmZSZWdzLlIzKTsKKwlhdGVfcHJpbnQoS0VSTl9FTUVSRyAiUjQgPSAlbHhcbiIsIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVCBTZXRfQVRFX1dyaXRlX1JGMV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVSU5UMzIgdmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTYpOworCisJcEFkLT5MYXRjaFJmUmVncy5SMSA9IHZhbHVlOworCVJ0bXBSZklvV3JpdGUocEFkKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQgU2V0X0FURV9Xcml0ZV9SRjJfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUlOVDMyIHZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDE2KTsKKworCXBBZC0+TGF0Y2hSZlJlZ3MuUjIgPSB2YWx1ZTsKKwlSdG1wUmZJb1dyaXRlKHBBZCk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UIFNldF9BVEVfV3JpdGVfUkYzX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVJTlQzMiB2YWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxNik7CisKKwlwQWQtPkxhdGNoUmZSZWdzLlIzID0gdmFsdWU7CisJUnRtcFJmSW9Xcml0ZShwQWQpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVCBTZXRfQVRFX1dyaXRlX1JGNF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVSU5UMzIgdmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTYpOworCisJcEFkLT5MYXRjaFJmUmVncy5SNCA9IHZhbHVlOworCVJ0bXBSZklvV3JpdGUocEFkKTsKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIExvYWQgYW5kIFdyaXRlIEVFUFJPTSBmcm9tIGEgYmluYXJ5IGZpbGUgcHJlcGFyZWQgaW4gYWR2YW5jZS4KKworICAgICAgICBSZXR1cm46CisgICAgICAgIAlUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisjaWZuZGVmIFVDT1MKK0lOVCBTZXRfQVRFX0xvYWRfRTJQX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCUJPT0xFQU4JCSAgICByZXQgPSBGQUxTRTsKKwlQVUNIQVIJCQlzcmMgPSBFRVBST01fQklOX0ZJTEVfTkFNRTsKKwlzdHJ1Y3QgZmlsZQkJKnNyY2Y7CisJSU5UMzIgCQkJcmV0dmFsLCBvcmdmc3VpZCwgb3JnZnNnaWQ7CisgICAJbW1fc2VnbWVudF90CW9yZ2ZzOworCVVTSE9SVCAJCQlXcml0ZUVFUFJPTVsoRUVQUk9NX1NJWkUvMildOworCVVJTlQzMgkJCUZpbGVMZW5ndGggPSAwOworCVVJTlQzMiAJCQl2YWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCI9PT0+ICVzICh2YWx1ZT0lZClcblxuIiwgX19mdW5jX18sIHZhbHVlKSk7CisKKwlpZiAodmFsdWUgPiAwKQorCXsKKwkJLyogemVybyB0aGUgZTJwIGJ1ZmZlciAqLworCQlOZGlzWmVyb01lbW9yeSgoUFVDSEFSKVdyaXRlRUVQUk9NLCBFRVBST01fU0laRSk7CisKKwkJLyogc2F2ZSB1aWQgYW5kIGdpZCB1c2VkIGZvciBmaWxlc3lzdGVtIGFjY2Vzcy4KKwkgICAgKiogc2V0IHVzZXIgYW5kIGdyb3VwIHRvIDAgKHJvb3QpCisJICAgICovCisJCW9yZ2ZzdWlkID0gY3VycmVudC0+ZnN1aWQ7CisJCW9yZ2ZzZ2lkID0gY3VycmVudC0+ZnNnaWQ7CisJCS8qIGFzIHJvb3QgKi8KKwkJY3VycmVudC0+ZnN1aWQgPSBjdXJyZW50LT5mc2dpZCA9IDA7CisgICAgCW9yZ2ZzID0gZ2V0X2ZzKCk7CisgICAgCXNldF9mcyhLRVJORUxfRFMpOworCisJCWRvCisJCXsKKwkJCS8qIG9wZW4gdGhlIGJpbiBmaWxlICovCisJCQlzcmNmID0gZmlscF9vcGVuKHNyYywgT19SRE9OTFksIDApOworCisJCQlpZiAoSVNfRVJSKHNyY2YpKQorCQkJeworCQkJCWF0ZV9wcmludCgiJXMgLSBFcnJvciAlbGQgb3BlbmluZyAlc1xuIiwgX19mdW5jX18sIC1QVFJfRVJSKHNyY2YpLCBzcmMpOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiB0aGUgb2JqZWN0IG11c3QgaGF2ZSBhIHJlYWQgbWV0aG9kICovCisJCQlpZiAoKHNyY2YtPmZfb3AgPT0gTlVMTCkgfHwgKHNyY2YtPmZfb3AtPnJlYWQgPT0gTlVMTCkpCisJCQl7CisJCQkJYXRlX3ByaW50KCIlcyAtICVzIGRvZXMgbm90IGhhdmUgYSByZWFkIG1ldGhvZFxuIiwgX19mdW5jX18sIHNyYyk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIHJlYWQgdGhlIGZpcm13YXJlIGZyb20gdGhlIGZpbGUgKi5iaW4gKi8KKwkJCUZpbGVMZW5ndGggPSBzcmNmLT5mX29wLT5yZWFkKHNyY2YsCisJCQkJCQkJCQkJICAoUFVDSEFSKVdyaXRlRUVQUk9NLAorCQkJCQkJCQkJCSAgRUVQUk9NX1NJWkUsCisJCQkJCQkJCQkJICAmc3JjZi0+Zl9wb3MpOworCisJCQlpZiAoRmlsZUxlbmd0aCAhPSBFRVBST01fU0laRSkKKwkJCXsKKwkJCQlhdGVfcHJpbnQoIiVzOiBlcnJvciBmaWxlIGxlbmd0aCAoPSVkKSBpbiBlMnAuYmluXG4iLAorCQkJCQkgICBfX2Z1bmNfXywgRmlsZUxlbmd0aCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLyogd3JpdGUgdGhlIGNvbnRlbnQgb2YgLmJpbiBmaWxlIHRvIEVFUFJPTSAqLworCQkJCXJ0X2VlX3dyaXRlX2FsbChwQWQsIFdyaXRlRUVQUk9NKTsKKwkJCQlyZXQgPSBUUlVFOworCQkJfQorCQkJYnJlYWs7CisJCX0gd2hpbGUoVFJVRSk7CisKKwkJLyogY2xvc2UgZmlybXdhcmUgZmlsZSAqLworCQlpZiAoSVNfRVJSKHNyY2YpKQorCQl7CisJCQkJOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dmFsID0gZmlscF9jbG9zZShzcmNmLCBOVUxMKTsKKwkJCWlmIChyZXR2YWwpCisJCQl7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiLS0+IEVycm9yICVkIGNsb3NpbmcgJXNcbiIsIC1yZXR2YWwsIHNyYykpOworCisJCQl9CisJCX0KKworCQkvKiByZXN0b3JlICovCisJCXNldF9mcyhvcmdmcyk7CisJCWN1cnJlbnQtPmZzdWlkID0gb3JnZnN1aWQ7CisJCWN1cnJlbnQtPmZzZ2lkID0gb3JnZnNnaWQ7CisJfQorICAgIEFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIjw9PT0gJXMgKHJldD0lZClcbiIsIF9fZnVuY19fLCByZXQpKTsKKworICAgIHJldHVybiByZXQ7CisKK30KKyNlbHNlCitJTlQgU2V0X0FURV9Mb2FkX0UyUF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVU0hPUlQgCQkJV3JpdGVFRVBST01bKEVFUFJPTV9TSVpFLzIpXTsKKwlzdHJ1Y3QgaXdyZXEJKndycSA9IChzdHJ1Y3QgaXdyZXEgKilhcmc7CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+ICVzICh3cnEtPnUuZGF0YS5sZW5ndGggPSAlZClcblxuIiwgX19mdW5jX18sIHdycS0+dS5kYXRhLmxlbmd0aCkpOworCisJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBFRVBST01fU0laRSkKKwl7CisJCWF0ZV9wcmludCgiJXM6IGVycm9yIGxlbmd0aCAoPSVkKSBmcm9tIGhvc3RcbiIsCisJCQkgICBfX2Z1bmNfXywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwllbHNlLyogKHdycS0+dS5kYXRhLmxlbmd0aCA9PSBFRVBST01fU0laRSkgKi8KKwl7CisJCS8qIHplcm8gdGhlIGUycCBidWZmZXIgKi8KKwkJTmRpc1plcm9NZW1vcnkoKFBVQ0hBUilXcml0ZUVFUFJPTSwgRUVQUk9NX1NJWkUpOworCisJCS8qIGZpbGwgdGhlIGxvY2FsIGJ1ZmZlciAqLworCQlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKVdyaXRlRUVQUk9NLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJCWRvCisJCXsKKwkJCQkvKiB3cml0ZSB0aGUgY29udGVudCBvZiAuYmluIGZpbGUgdG8gRUVQUk9NICovCisJCQkJcnRfZWVfd3JpdGVfYWxsKHBBZCwgV3JpdGVFRVBST00pOworCisJCX0gd2hpbGUoRkFMU0UpOworCQl9CisKKyAgICBBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09ICVzXG4iLCBfX2Z1bmNfXykpOworCisgICAgcmV0dXJuIFRSVUU7CisKK30KKyNlbmRpZiAvLyAhVUNPUyAvLworCitJTlQgU2V0X0FURV9SZWFkX0UyUF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVU0hPUlQgYnVmZmVyW0VFUFJPTV9TSVpFLzJdOworCVVTSE9SVCAqcDsKKwlpbnQgaTsKKworCXJ0X2VlX3JlYWRfYWxsKHBBZCwgKFVTSE9SVCAqKWJ1ZmZlcik7CisJcCA9IGJ1ZmZlcjsKKwlmb3IgKGkgPSAwOyBpIDwgKEVFUFJPTV9TSVpFLzIpOyBpKyspCisJeworCQlhdGVfcHJpbnQoIiU0LjR4ICIsICpwKTsKKwkJaWYgKCgoaSsxKSAlIDE2KSA9PSAwKQorCQkJYXRlX3ByaW50KCJcbiIpOworCQlwKys7CisJfQorCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X0FURV9TaG93X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCWF0ZV9wcmludCgiTW9kZT0lZFxuIiwgcEFkLT5hdGUuTW9kZSk7CisJYXRlX3ByaW50KCJUeFBvd2VyMD0lZFxuIiwgcEFkLT5hdGUuVHhQb3dlcjApOworCWF0ZV9wcmludCgiVHhQb3dlcjE9JWRcbiIsIHBBZC0+YXRlLlR4UG93ZXIxKTsKKwlhdGVfcHJpbnQoIlR4QW50ZW5uYVNlbD0lZFxuIiwgcEFkLT5hdGUuVHhBbnRlbm5hU2VsKTsKKwlhdGVfcHJpbnQoIlJ4QW50ZW5uYVNlbD0lZFxuIiwgcEFkLT5hdGUuUnhBbnRlbm5hU2VsKTsKKwlhdGVfcHJpbnQoIkJCUEN1cnJlbnRCVz0lZFxuIiwgcEFkLT5hdGUuVHhXSS5CVyk7CisJYXRlX3ByaW50KCJHST0lZFxuIiwgcEFkLT5hdGUuVHhXSS5TaG9ydEdJKTsKKwlhdGVfcHJpbnQoIk1DUz0lZFxuIiwgcEFkLT5hdGUuVHhXSS5NQ1MpOworCWF0ZV9wcmludCgiVHhNb2RlPSVkXG4iLCBwQWQtPmF0ZS5UeFdJLlBIWU1PREUpOworCWF0ZV9wcmludCgiQWRkcjE9JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCXBBZC0+YXRlLkFkZHIxWzBdLCBwQWQtPmF0ZS5BZGRyMVsxXSwgcEFkLT5hdGUuQWRkcjFbMl0sIHBBZC0+YXRlLkFkZHIxWzNdLCBwQWQtPmF0ZS5BZGRyMVs0XSwgcEFkLT5hdGUuQWRkcjFbNV0pOworCWF0ZV9wcmludCgiQWRkcjI9JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCXBBZC0+YXRlLkFkZHIyWzBdLCBwQWQtPmF0ZS5BZGRyMlsxXSwgcEFkLT5hdGUuQWRkcjJbMl0sIHBBZC0+YXRlLkFkZHIyWzNdLCBwQWQtPmF0ZS5BZGRyMls0XSwgcEFkLT5hdGUuQWRkcjJbNV0pOworCWF0ZV9wcmludCgiQWRkcjM9JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCXBBZC0+YXRlLkFkZHIzWzBdLCBwQWQtPmF0ZS5BZGRyM1sxXSwgcEFkLT5hdGUuQWRkcjNbMl0sIHBBZC0+YXRlLkFkZHIzWzNdLCBwQWQtPmF0ZS5BZGRyM1s0XSwgcEFkLT5hdGUuQWRkcjNbNV0pOworCWF0ZV9wcmludCgiQ2hhbm5lbD0lZFxuIiwgcEFkLT5hdGUuQ2hhbm5lbCk7CisJYXRlX3ByaW50KCJUeExlbmd0aD0lZFxuIiwgcEFkLT5hdGUuVHhMZW5ndGgpOworCWF0ZV9wcmludCgiVHhDb3VudD0ldVxuIiwgcEFkLT5hdGUuVHhDb3VudCk7CisJYXRlX3ByaW50KCJSRkZyZXFPZmZzZXQ9JWRcbiIsIHBBZC0+YXRlLlJGRnJlcU9mZnNldCk7CisJYXRlX3ByaW50KEtFUk5fRU1FUkcgIlNldF9BVEVfU2hvd19Qcm9jIFN1Y2Nlc3NcbiIpOworCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X0FURV9IZWxwX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCWF0ZV9wcmludCgiQVRFPUFURVNUQVJULCBBVEVTVE9QLCBUWENPTlQsIFRYQ0FSUiwgVFhGUkFNRSwgUlhGUkFNRVxuIik7CisJYXRlX3ByaW50KCJBVEVEQVxuIik7CisJYXRlX3ByaW50KCJBVEVTQVxuIik7CisJYXRlX3ByaW50KCJBVEVCU1NJRFxuIik7CisJYXRlX3ByaW50KCJBVEVDSEFOTkVMLCByYW5nZTowfjE0KHVubGVzcyBBIGJhbmQgISlcbiIpOworCWF0ZV9wcmludCgiQVRFVFhQT1cwLCBzZXQgcG93ZXIgbGV2ZWwgb2YgYW50ZW5uYSAxLlxuIik7CisJYXRlX3ByaW50KCJBVEVUWFBPVzEsIHNldCBwb3dlciBsZXZlbCBvZiBhbnRlbm5hIDIuXG4iKTsKKwlhdGVfcHJpbnQoIkFURVRYQU5ULCBzZXQgVFggYW50ZW5uYS4gMDphbGwsIDE6YW50ZW5uYSBvbmUsIDI6YW50ZW5uYSB0d28uXG4iKTsKKwlhdGVfcHJpbnQoIkFURVJYQU5ULCBzZXQgUlggYW50ZW5uYS4wOmFsbCwgMTphbnRlbm5hIG9uZSwgMjphbnRlbm5hIHR3bywgMzphbnRlbm5hIHRocmVlLlxuIik7CisJYXRlX3ByaW50KCJBVEVUWEZSRVFPRkZTRVQsIHNldCBmcmVxdWVuY3kgb2Zmc2V0LCByYW5nZSAwfjYzXG4iKTsKKwlhdGVfcHJpbnQoIkFURVRYQlcsIHNldCBCYW5kV2lkdGgsIDA6MjBNSHosIDE6NDBNSHouXG4iKTsKKwlhdGVfcHJpbnQoIkFURVRYTEVOLCBzZXQgRnJhbWUgbGVuZ3RoLCByYW5nZSAyNH4lZFxuIiwgKE1BWF9GUkFNRV9TSVpFIC0gMzQvKiA9PSAyMzEyICovKSk7CisJYXRlX3ByaW50KCJBVEVUWENOVCwgc2V0IGhvdyBtYW55IGZyYW1lIGdvaW5nIHRvIHRyYW5zbWl0LlxuIik7CisJYXRlX3ByaW50KCJBVEVUWE1DUywgc2V0IE1DUywgcmVmZXJlbmNlIHRvIHJhdGUgdGFibGUuXG4iKTsKKwlhdGVfcHJpbnQoIkFURVRYTU9ERSwgc2V0IE1vZGUgMDpDQ0ssIDE6T0ZETSwgMjpIVC1NaXgsIDM6R3JlZW5GaWVsZCwgcmVmZXJlbmNlIHRvIHJhdGUgdGFibGUuXG4iKTsKKwlhdGVfcHJpbnQoIkFURVRYR0ksIHNldCBHSSBpbnRlcnZhbCwgMDpMb25nLCAxOlNob3J0XG4iKTsKKwlhdGVfcHJpbnQoIkFURVJYRkVSLCAwOmRpc2FibGUgUnggRnJhbWUgZXJyb3IgcmF0ZS4gMTplbmFibGUgUnggRnJhbWUgZXJyb3IgcmF0ZS5cbiIpOworCWF0ZV9wcmludCgiQVRFUlJGLCBzaG93IGFsbCBSRiByZWdpc3RlcnMuXG4iKTsKKwlhdGVfcHJpbnQoIkFURVdSRjEsIHNldCBSRjEgcmVnaXN0ZXIuXG4iKTsKKwlhdGVfcHJpbnQoIkFURVdSRjIsIHNldCBSRjIgcmVnaXN0ZXIuXG4iKTsKKwlhdGVfcHJpbnQoIkFURVdSRjMsIHNldCBSRjMgcmVnaXN0ZXIuXG4iKTsKKwlhdGVfcHJpbnQoIkFURVdSRjQsIHNldCBSRjQgcmVnaXN0ZXIuXG4iKTsKKwlhdGVfcHJpbnQoIkFURUxERTJQLCBsb2FkIEVFUFJPTSBmcm9tIC5iaW4gZmlsZS5cbiIpOworCWF0ZV9wcmludCgiQVRFUkUyUCwgZGlzcGxheSBhbGwgRUVQUk9NIGNvbnRlbnQuXG4iKTsKKwlhdGVfcHJpbnQoIkFURVNIT1csIGRpc3BsYXkgYWxsIHBhcmFtZXRlcnMgb2YgQVRFLlxuIik7CisJYXRlX3ByaW50KCJBVEVIRUxQLCBvbmxpbmUgaGVscC5cbiIpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUFzaWNTd2l0Y2hDaGFubmVsKCkgZGVkaWNhdGVkIGZvciBBVEUuCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQVRFQXNpY1N3aXRjaENoYW5uZWwoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUlOVDMyIFIyID0gMCwgUjMgPSBERUZBVUxUX1JGX1RYX1BPV0VSLCBSNCA9IDAsIFZhbHVlID0gMDsKKwlDSEFSIFR4UHdlciA9IDAsIFR4UHdlcjIgPSAwOworCVVDSEFSIGluZGV4LCBCYnBWYWx1ZSA9IDAsIFI2NiA9IDB4MzA7CisJUlRNUF9SRl9SRUdTICpSRlJlZ1RhYmxlOworCVVDSEFSIENoYW5uZWw7CisKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCWlmICgocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKSB8fCAocEFkLT5hdGUuYlFBUnhTdGFydCA9PSBUUlVFKSkKKwl7CisJCWlmIChwQWQtPmF0ZS5DaGFubmVsICE9IHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCkKKwkJeworCQkJcEFkLT5hdGUuQ2hhbm5lbCA9IHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbDsKKwkJfQorCQlyZXR1cm47CisJfQorCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCUNoYW5uZWwgPSBwQWQtPmF0ZS5DaGFubmVsOworCisJLy8gU2VsZWN0IGFudGVubmEKKwlBc2ljQW50ZW5uYVNlbGVjdChwQWQsIENoYW5uZWwpOworCisJLy8gZmlsbCBUeCBwb3dlciB2YWx1ZQorCVR4UHdlciA9IHBBZC0+YXRlLlR4UG93ZXIwOworCVR4UHdlcjIgPSBwQWQtPmF0ZS5UeFBvd2VyMTsKKworCVJGUmVnVGFibGUgPSBSRjI4NTBSZWdUYWJsZTsKKworCXN3aXRjaCAocEFkLT5SZkljVHlwZSkKKwl7CisJCS8qIEJ1dCBvbmx5IDI4NTAgYW5kIDI3NTAgc3VwcG9ydCA1LjVHSHogYmFuZC4uLiAqLworCQljYXNlIFJGSUNfMjgyMDoKKwkJY2FzZSBSRklDXzI4NTA6CisJCWNhc2UgUkZJQ18yNzIwOgorCQljYXNlIFJGSUNfMjc1MDoKKworCQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNX09GXzI4NTBfQ0hOTDsgaW5kZXgrKykKKwkJCXsKKwkJCQlpZiAoQ2hhbm5lbCA9PSBSRlJlZ1RhYmxlW2luZGV4XS5DaGFubmVsKQorCQkJCXsKKwkJCQkJUjIgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMjsKKwkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKKwkJCQkJeworCQkJCQkJUjIgfD0gMHg0MDAwOwkvLyBJZiBUWHBhdGggaXMgMSwgYml0IDE0ID0gMTsKKwkJCQkJfQorCisJCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpCisJCQkJCXsKKwkJCQkJCXN3aXRjaCAocEFkLT5hdGUuUnhBbnRlbm5hU2VsKQorCQkJCQkJeworCQkJCQkJCWNhc2UgMToKKwkJCQkJCQkJUjIgfD0gMHgyMDA0MDsKKwkJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCYnBWYWx1ZSk7CisJCQkJCQkJCUJicFZhbHVlICY9IDB4RTQ7CisJCQkJCQkJCUJicFZhbHVlIHw9IDB4MDA7CisJCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQmJwVmFsdWUpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDI6CisJCQkJCQkJCVIyIHw9IDB4MTAwNDA7CisJCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQmJwVmFsdWUpOworCQkJCQkJCQlCYnBWYWx1ZSAmPSAweEU0OworCQkJCQkJCQlCYnBWYWx1ZSB8PSAweDAxOworCQkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJicFZhbHVlKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJUjIgfD0gMHg0MDsKKwkJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCYnBWYWx1ZSk7CisJCQkJCQkJCUJicFZhbHVlICY9IDB4RTQ7CisJCQkJCQkJCS8qIE9ubHkgZW5hYmxlIHR3byBBbnRlbm5hIHRvIHJlY2VpdmUuICovCisJCQkJCQkJCUJicFZhbHVlIHw9IDB4MDg7CisJCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQmJwVmFsdWUpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlIGlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCisJCQkJCXsKKwkJCQkJCVIyIHw9IDB4MjAwNDA7CS8vIHdyaXRlIDEgdG8gb2ZmIFJ4UGF0aAorCQkJCQl9CisKKwkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikKKwkJCQkJeworCQkJCQkJaWYgKHBBZC0+YXRlLlR4QW50ZW5uYVNlbCA9PSAxKQorCQkJCQkJeworCQkJCQkJCVIyIHw9IDB4NDAwMDsJLy8gSWYgVFggQW50ZW5uYSBzZWxlY3QgaXMgMSAsIGJpdCAxNCA9IDE7IERpc2FibGUgQW50IDIKKwkJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgJkJicFZhbHVlKTsKKwkJCQkJCQlCYnBWYWx1ZSAmPSAweEU3OwkJLy8xMTEwMDExMUIKKwkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsIEJicFZhbHVlKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgaWYgKHBBZC0+YXRlLlR4QW50ZW5uYVNlbCA9PSAyKQorCQkJCQkJeworCQkJCQkJCVIyIHw9IDB4ODAwMDsJLy8gSWYgVFggQW50ZW5uYSBzZWxlY3QgaXMgMiAsIGJpdCAxNSA9IDE7IERpc2FibGUgQW50IDEKKwkJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgJkJicFZhbHVlKTsKKwkJCQkJCQlCYnBWYWx1ZSAmPSAweEU3OworCQkJCQkJCUJicFZhbHVlIHw9IDB4MDg7CisJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBCYnBWYWx1ZSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsICZCYnBWYWx1ZSk7CisJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNzsKKwkJCQkJCQlCYnBWYWx1ZSB8PSAweDEwOworCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgQmJwVmFsdWUpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDMpCisJCQkJCXsKKwkJCQkJCXN3aXRjaCAocEFkLT5hdGUuUnhBbnRlbm5hU2VsKQorCQkJCQkJeworCQkJCQkJCWNhc2UgMToKKwkJCQkJCQkJUjIgfD0gMHgyMDA0MDsKKwkJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCYnBWYWx1ZSk7CisJCQkJCQkJCUJicFZhbHVlICY9IDB4RTQ7CisJCQkJCQkJCUJicFZhbHVlIHw9IDB4MDA7CisJCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQmJwVmFsdWUpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDI6CisJCQkJCQkJCVIyIHw9IDB4MTAwNDA7CisJCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQmJwVmFsdWUpOworCQkJCQkJCQlCYnBWYWx1ZSAmPSAweEU0OworCQkJCQkJCQlCYnBWYWx1ZSB8PSAweDAxOworCQkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJicFZhbHVlKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAzOgorCQkJCQkJCQlSMiB8PSAweDMwMDAwOworCQkJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJicFZhbHVlKTsKKwkJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNDsKKwkJCQkJCQkJQmJwVmFsdWUgfD0gMHgwMjsKKwkJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCYnBWYWx1ZSk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQmJwVmFsdWUpOworCQkJCQkJCQlCYnBWYWx1ZSAmPSAweEU0OworCQkJCQkJCQlCYnBWYWx1ZSB8PSAweDEwOworCQkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJicFZhbHVlKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlpZiAoQ2hhbm5lbCA+IDE0KQorCQkJCQl7CisJCQkJCQkvLyBpbml0aWFsaXplIFIzLCBSNAorCQkJCQkJUjMgPSAoUkZSZWdUYWJsZVtpbmRleF0uUjMgJiAweGZmZmZjMWZmKTsKKwkJCQkJCVI0ID0gKFJGUmVnVGFibGVbaW5kZXhdLlI0ICYgKH4weDAwMWY4N2MwKSkgfCAocEFkLT5hdGUuUkZGcmVxT2Zmc2V0IDw8IDE1KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWNjb3JkaW5nIHRoZSBSb3J5J3Mgc3VnZ2VzdGlvbiB0byBzb2x2ZSB0aGUgbWlkZGxlIHJhbmdlIGlzc3VlLgorCQkJCQkJLy8gNS41RyBiYW5kIHBvd2VyIHJhbmdlOiAweEY5fjBYMEYsIFRYMCBSZWczIGJpdDkvVFgxIFJlZzQgYml0Nj0iMCIgbWVhbnMgdGhlIFRYIHBvd2VyIHJlZHVjZSA3ZEIKKwkJCQkJCS8vIFIzCisJCQkJCQlpZiAoKFR4UHdlciA+PSAtNykgJiYgKFR4UHdlciA8IDApKQorCQkJCQkJeworCQkJCQkJCVR4UHdlciA9ICg3K1R4UHdlcik7CisJCQkJCQkJVHhQd2VyID0gKFR4UHdlciA+IDB4RikgPyAoMHhGKSA6IChUeFB3ZXIpOworCQkJCQkJCVIzIHw9IChUeFB3ZXIgPDwgMTApOworCQkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURUFzaWNTd2l0Y2hDaGFubmVsOiBUeFB3ZXI9JWQgXG4iLCBUeFB3ZXIpKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlUeFB3ZXIgPSAoVHhQd2VyID4gMHhGKSA/ICgweEYpIDogKFR4UHdlcik7CisJCQkJCQkJUjMgfD0gKFR4UHdlciA8PCAxMCkgfCAoMSA8PCA5KTsKKwkJCQkJCX0KKworCQkJCQkJLy8gUjQKKwkJCQkJCWlmICgoVHhQd2VyMiA+PSAtNykgJiYgKFR4UHdlcjIgPCAwKSkKKwkJCQkJCXsKKwkJCQkJCQlUeFB3ZXIyID0gKDcrVHhQd2VyMik7CisJCQkJCQkJVHhQd2VyMiA9IChUeFB3ZXIyID4gMHhGKSA/ICgweEYpIDogKFR4UHdlcjIpOworCQkJCQkJCVI0IHw9IChUeFB3ZXIyIDw8IDcpOworCQkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURUFzaWNTd2l0Y2hDaGFubmVsOiBUeFB3ZXIyPSVkIFxuIiwgVHhQd2VyMikpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCVR4UHdlcjIgPSAoVHhQd2VyMiA+IDB4RikgPyAoMHhGKSA6IChUeFB3ZXIyKTsKKwkJCQkJCQlSNCB8PSAoVHhQd2VyMiA8PCA3KSB8ICgxIDw8IDYpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJUjMgPSAoUkZSZWdUYWJsZVtpbmRleF0uUjMgJiAweGZmZmZjMWZmKSB8IChUeFB3ZXIgPDwgOSk7IC8vIHNldCBUWCBwb3dlcjAKKwkJCQkJCVI0ID0gKFJGUmVnVGFibGVbaW5kZXhdLlI0ICYgKH4weDAwMWY4N2MwKSkgfCAocEFkLT5hdGUuUkZGcmVxT2Zmc2V0IDw8IDE1KSB8IChUeFB3ZXIyIDw8Nik7Ly8gU2V0IGZyZXEgb2Zmc2V0ICYgVHhQd3IxCisJCQkJCX0KKworCQkJCQkvLyBCYXNlZCBvbiBCQlAgY3VycmVudCBtb2RlIGJlZm9yZSBjaGFuZ2luZyBSRiBjaGFubmVsLgorCQkJCQlpZiAocEFkLT5hdGUuVHhXSS5CVyA9PSBCV180MCkKKwkJCQkJeworCQkJCQkJUjQgfD0weDIwMDAwMDsKKwkJCQkJfQorCisJCQkJCS8vIFVwZGF0ZSB2YXJpYWJsZXMKKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5DaGFubmVsID0gQ2hhbm5lbDsKKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5SMSA9IFJGUmVnVGFibGVbaW5kZXhdLlIxOworCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIyID0gUjI7CisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjMgPSBSMzsKKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5SNCA9IFI0OworCisJCQkJCVJ0bXBSZklvV3JpdGUocEFkKTsKKworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJLy8gQ2hhbmdlIEJCUCBzZXR0aW5nIGR1cmluZyBzd2l0Y2ggZnJvbSBhLT5nLCBnLT5hCisJaWYgKENoYW5uZWwgPD0gMTQpCisJeworCSAgICBVTE9ORwlUeFBpbkNmZyA9IDB4MDAwNTBGMEE7Ly8gMjAwNy4xMC4wOSBieSBCcmlhbiA6IDB4MDAwNTA1MEEgPT0+IDB4MDAwNTBGMEEKKworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjYyLCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjMsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NCwgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCisJCS8qIEZvciAxVC8yUiBjaGlwIG9ubHkuLi4gKi8KKwkgICAgaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5FeHRlcm5hbExOQUZvckcpCisJICAgIHsKKwkgICAgICAgIEFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODIsIDB4NjIpOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCSAgICAgICAgQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MiwgMHg4NCk7CisJICAgIH0KKworICAgICAgICAvLyBBY2NvcmRpbmcgdGhlIFJvcnkncyBzdWdnZXN0aW9uIHRvIHNvbHZlIHRoZSBtaWRkbGUgcmFuZ2UgaXNzdWUuCisJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I4NiwgJkJicFZhbHVlKTsKKwkJQVNTRVJUKChCYnBWYWx1ZSA9PSAweDAwKSk7CisJCWlmICgoQmJwVmFsdWUgIT0gMHgwMCkpCisJCXsKKwkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODYsIDB4MDApOworCQl9CisKKwkJLy8gNS41R0h6IGJhbmQgc2VsZWN0aW9uIFBJTiwgYml0MSBhbmQgYml0MiBhcmUgY29tcGxlbWVudAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmVmFsdWUpOworCQlWYWx1ZSAmPSAofjB4Nik7CisJCVZhbHVlIHw9ICgweDA0KTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIFZhbHVlKTsKKworICAgICAgICAvLyBUdXJuIG9mZiB1bnVzZWQgUEEgb3IgTE5BIHdoZW4gb25seSAxVCBvciAxUi4KKwkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKKwkJeworCQkJVHhQaW5DZmcgJj0gMHhGRkZGRkZGMzsKKwkJfQorCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQorCQl7CisJCQlUeFBpbkNmZyAmPSAweEZGRkZGM0ZGOworCQl9CisKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUElOX0NGRywgVHhQaW5DZmcpOworCX0KKwllbHNlCisJeworCSAgICBVTE9ORwlUeFBpbkNmZyA9IDB4MDAwNTBGMDU7Ly8yMDA3LjEwLjA5IGJ5IEJyaWFuIDogMHgwMDA1MDUwNSA9PT4gMHgwMDA1MEYwNQorCisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjIsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2MywgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY0LCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODIsIDB4RjIpOworCisgICAgICAgIC8vIEFjY29yZGluZyB0aGUgUm9yeSdzIHN1Z2dlc3Rpb24gdG8gc29sdmUgdGhlIG1pZGRsZSByYW5nZSBpc3N1ZS4KKwkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjg2LCAmQmJwVmFsdWUpOworCQlBU1NFUlQoKEJicFZhbHVlID09IDB4MDApKTsKKwkJaWYgKChCYnBWYWx1ZSAhPSAweDAwKSkKKwkJeworCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4NiwgMHgwMCk7CisJCX0KKwkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjkxLCAmQmJwVmFsdWUpOworCQlBU1NFUlQoKEJicFZhbHVlID09IDB4MDQpKTsKKworCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SOTIsICZCYnBWYWx1ZSk7CisJCUFTU0VSVCgoQmJwVmFsdWUgPT0gMHgwMCkpOworCisJCS8vIDUuNUdIeiBiYW5kIHNlbGVjdGlvbiBQSU4sIGJpdDEgYW5kIGJpdDIgYXJlIGNvbXBsZW1lbnQKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJlZhbHVlKTsKKwkJVmFsdWUgJj0gKH4weDYpOworCQlWYWx1ZSB8PSAoMHgwMik7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7CisKKyAgICAgICAgLy8gVHVybiBvZmYgdW51c2VkIFBBIG9yIExOQSB3aGVuIG9ubHkgMVQgb3IgMVIuCisJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCisJCXsKKwkJCVR4UGluQ2ZnICY9IDB4RkZGRkZGRjM7CisJICAgIH0KKwkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKKwkJeworCQkJVHhQaW5DZmcgJj0gMHhGRkZGRjNGRjsKKwkJfQorCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BJTl9DRkcsIFR4UGluQ2ZnKTsKKwl9CisKKyAgICAvLyBSNjYgc2hvdWxkIGJlIHNldCBhY2NvcmRpbmcgdG8gQ2hhbm5lbCBhbmQgdXNlIDIwTUh6IHdoZW4gc2Nhbm5pbmcKKwlpZiAoQ2hhbm5lbCA8PSAxNCkKKwl7CisJCS8vIEJHIGJhbmQKKwkJUjY2ID0gMHgyRSArIEdFVF9MTkFfR0FJTihwQWQpOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCX0KKwllbHNlCisJeworCQkvLyA1LjUgR0h6IGJhbmQKKwkJaWYgKHBBZC0+YXRlLlR4V0kuQlcgPT0gQldfMjApCisJCXsKKwkJCVI2NiA9IChVQ0hBUikoMHgzMiArIChHRVRfTE5BX0dBSU4ocEFkKSo1KS8zKTsKKyAgICAJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlSNjYgPSAoVUNIQVIpKDB4M0EgKyAoR0VUX0xOQV9HQUlOKHBBZCkqNSkvMyk7CisJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQl9CisJfQorCisJLy8KKwkvLyBPbiAxMUEsIFdlIHNob3VsZCBkZWxheSBhbmQgd2FpdCBSRi9CQlAgdG8gYmUgc3RhYmxlCisJLy8gYW5kIHRoZSBhcHByb3ByaWF0ZSB0aW1lIHNob3VsZCBiZSAxMDAwIG1pY3JvIHNlY29uZHMKKwkvLyAyMDA1LzA2LzA1IC0gT24gMTFHLCBXZSBhbHNvIG5lZWQgdGhpcyBkZWxheSB0aW1lLiBPdGhlcndpc2UgaXQncyBkaWZmaWN1bHQgdG8gcGFzcyB0aGUgV0hRTC4KKwkvLworCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisKKwlpZiAoQ2hhbm5lbCA+IDE0KQorCXsKKwkJLy8gV2hlbiA1LjVHSHogYmFuZCB0aGUgTFNCIG9mIFR4UHdyIHdpbGwgYmUgdXNlZCB0byByZWR1Y2VkIDdkQiBvciBub3QuCisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN3aXRjaENoYW5uZWwjJWQoUkY9JWQsICVkVCkgdG8gLCBSMT0weCUwOGx4LCBSMj0weCUwOGx4LCBSMz0weCUwOGx4LCBSND0weCUwOGx4XG4iLAorCQkJCQkJCQkgIENoYW5uZWwsCisJCQkJCQkJCSAgcEFkLT5SZkljVHlwZSwKKwkJCQkJCQkJICBwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoLAorCQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjEsCisJCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMiwKKwkJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlIzLAorCQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpKTsKKwl9CisJZWxzZQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3dpdGNoQ2hhbm5lbCMlZChSRj0lZCwgUHdyMD0ldSwgUHdyMT0ldSwgJWRUKSB0byAsIFIxPTB4JTA4bHgsIFIyPTB4JTA4bHgsIFIzPTB4JTA4bHgsIFI0PTB4JTA4bHhcbiIsCisJCQkJCQkJCSAgQ2hhbm5lbCwKKwkJCQkJCQkJICBwQWQtPlJmSWNUeXBlLAorCQkJCQkJCQkgIChSMyAmIDB4MDAwMDNlMDApID4+IDksCisJCQkJCQkJCSAgKFI0ICYgMHgwMDAwMDdjMCkgPj4gNiwKKwkJCQkJCQkJICBwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoLAorCQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjEsCisJCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMiwKKwkJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlIzLAorCQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpKTsKKyAgICB9Cit9CisKKy8vCisvLyBJbiBmYWN0LCBubyBvbmUgd2lsbCBjYWxsIHRoaXMgcm91dGluZSBzbyBmYXIgIQorLy8KKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJR2l2ZXMgQ0NLIFRYIHJhdGUgMiBtb3JlIGRCIFRYIHBvd2VyLgorCQlUaGlzIHJvdXRpbmUgd29ya3Mgb25seSBpbiBBVEUgbW9kZS4KKworCQljYWxjdWxhdGUgZGVzaXJlZCBUeCBwb3dlciBpbiBSRiBSMy5UeDB+NSwJc2hvdWxkIGNvbnNpZGVyIC0KKwkJMC4gaWYgY3VycmVudCByYWRpbyBpcyBhIG5vaXN5IGVudmlyb25tZW50IChwQWQtPkRyc0NvdW50ZXJzLmZOb2lzeUVudmlyb25tZW50KQorCQkxLiBUeFBvd2VyUGVyY2VudGFnZQorCQkyLiBhdXRvIGNhbGlicmF0aW9uIGJhc2VkIG9uIFRTU0kgZmVlZGJhY2sKKwkJMy4gZXh0cmEgMiBkYiBmb3IgQ0NLCisJCTQuIC0xMCBkYiB1cG9uIHZlcnktc2hvcnQgZGlzdGFuY2UgKEF2Z1JTU0kgPj0gLTQwZGIpIHRvIEFQCisKKwlOT1RFOiBTaW5jZSB0aGlzIHJvdXRpbmUgcmVxdWlyZXMgdGhlIHZhbHVlIG9mIChwQWQtPkRyc0NvdW50ZXJzLmZOb2lzeUVudmlyb25tZW50KSwKKwkJaXQgc2hvdWxkIGJlIGNhbGxlZCBBRlRFUiBNbG1lRHluYW1pY1R4UmF0ZVN3aXRjaGluZygpCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBVEVBc2ljQWRqdXN0VHhQb3dlcigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlJTlQJCQlpLCBqOworCUNIQVIJCURlbHRhUHdyID0gMDsKKwlCT09MRUFOCQliQXV0b1R4QWdjID0gRkFMU0U7CisJVUNIQVIJCVRzc2lSZWYsICpwVHNzaU1pbnVzQm91bmRhcnksICpwVHNzaVBsdXNCb3VuZGFyeSwgVHhBZ2NTdGVwOworCVVDSEFSCQlCYnBSNDkgPSAwLCBpZHg7CisJUENIQVIJCXBUeEFnY0NvbXBlbnNhdGU7CisJVUxPTkcJCVR4UHdyWzVdOworCUNIQVIJCVZhbHVlOworCisJLyogbm8gb25lIGNhbGxzIHRoaXMgcHJvY2VkdXJlIHNvIGZhciAqLworCWlmIChwQWQtPmF0ZS5UeFdJLkJXID09IEJXXzQwKQorCXsKKwkJaWYgKHBBZC0+YXRlLkNoYW5uZWwgPiAxNCkKKwkJeworCQkJVHhQd3JbMF0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbMF07CisJCQlUeFB3clsxXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFsxXTsKKwkJCVR4UHdyWzJdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzJdOworCQkJVHhQd3JbM10gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbM107CisJCQlUeFB3cls0XSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFs0XTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVR4UHdyWzBdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzBdOworCQkJVHhQd3JbMV0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbMV07CisJCQlUeFB3clsyXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFsyXTsKKwkJCVR4UHdyWzNdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzNdOworCQkJVHhQd3JbNF0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbNF07CisJCX0KKwl9CisJZWxzZQorCXsKKwkJaWYgKHBBZC0+YXRlLkNoYW5uZWwgPiAxNCkKKwkJeworCQkJVHhQd3JbMF0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbMF07CisJCQlUeFB3clsxXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFsxXTsKKwkJCVR4UHdyWzJdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzJdOworCQkJVHhQd3JbM10gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbM107CisJCQlUeFB3cls0XSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFs0XTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVR4UHdyWzBdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzBdOworCQkJVHhQd3JbMV0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbMV07CisJCQlUeFB3clsyXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFsyXTsKKwkJCVR4UHdyWzNdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzNdOworCQkJVHhQd3JbNF0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbNF07CisJCX0KKwl9CisKKwkvLyBUWCBwb3dlciBjb21wZW5zYXRpb24gZm9yIHRlbXBlcmF0dXJlIHZhcmlhdGlvbiBiYXNlZCBvbiBUU1NJLgorCS8vIERvIGl0IHBlciA0IHNlY29uZHMuCisJaWYgKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgNCA9PSAwKQorCXsKKwkJaWYgKHBBZC0+YXRlLkNoYW5uZWwgPD0gMTQpCisJCXsKKwkJCS8qIGJnIGNoYW5uZWwgKi8KKwkJCWJBdXRvVHhBZ2MgICAgICAgICA9IHBBZC0+YkF1dG9UeEFnY0c7CisJCQlUc3NpUmVmICAgICAgICAgICAgPSBwQWQtPlRzc2lSZWZHOworCQkJcFRzc2lNaW51c0JvdW5kYXJ5ID0gJnBBZC0+VHNzaU1pbnVzQm91bmRhcnlHWzBdOworCQkJcFRzc2lQbHVzQm91bmRhcnkgID0gJnBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbMF07CisJCQlUeEFnY1N0ZXAgICAgICAgICAgPSBwQWQtPlR4QWdjU3RlcEc7CisJCQlwVHhBZ2NDb21wZW5zYXRlICAgPSAmcEFkLT5UeEFnY0NvbXBlbnNhdGVHOworCQl9CisJCWVsc2UKKwkJeworCQkJLyogYSBjaGFubmVsICovCisJCQliQXV0b1R4QWdjICAgICAgICAgPSBwQWQtPmJBdXRvVHhBZ2NBOworCQkJVHNzaVJlZiAgICAgICAgICAgID0gcEFkLT5Uc3NpUmVmQTsKKwkJCXBUc3NpTWludXNCb3VuZGFyeSA9ICZwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVswXTsKKwkJCXBUc3NpUGx1c0JvdW5kYXJ5ICA9ICZwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzBdOworCQkJVHhBZ2NTdGVwICAgICAgICAgID0gcEFkLT5UeEFnY1N0ZXBBOworCQkJcFR4QWdjQ29tcGVuc2F0ZSAgID0gJnBBZC0+VHhBZ2NDb21wZW5zYXRlQTsKKwkJfQorCisJCWlmIChiQXV0b1R4QWdjKQorCQl7CisJCQkvKiBCYnBSNDkgaXMgdW5zaWduZWQgY2hhciAqLworCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQ5LCAmQmJwUjQ5KTsKKworCQkJLyogKHApIFRzc2lQbHVzQm91bmRhcnlHWzBdID0gMCA9IChtKSBUc3NpTWludXNCb3VuZGFyeUdbMF0gKi8KKwkJCS8qIGNvbXBlbnNhdGU6ICs0ICAgICArMyAgICsyICAgKzEgICAgMCAgIC0xICAgLTIgICAtMyAgIC00ICogc3RlcHMgKi8KKwkJCS8qIHN0ZXAgdmFsdWUgaXMgZGVmaW5lZCBpbiBwQWQtPlR4QWdjU3RlcEcgZm9yIHR4IHBvd2VyIHZhbHVlICovCisKKwkJCS8qIFs0XSsxK1s0XSAgIHA0ICAgICBwMyAgIHAyICAgcDEgICBvMSAgIG0xICAgbTIgICBtMyAgIG00ICovCisJCQkvKiBleDogICAgICAgICAweDAwIDB4MTUgMHgyNSAweDQ1IDB4ODggMHhBMCAweEI1IDB4RDAgMHhGMAorCQkJICAgYWJvdmUgdmFsdWUgYXJlIGV4YW1pbmVkIGluIG1hc3MgZmFjdG9yeSBwcm9kdWN0aW9uICovCisJCQkvKiAgICAgICAgICAgICBbNF0gICAgWzNdICBbMl0gIFsxXSAgWzBdICBbMV0gIFsyXSAgWzNdICBbNF0gKi8KKworCQkJLyogcGx1cyBpcyAweDEwIH4gMHg0MCwgbWludXMgaXMgMHg2MCB+IDB4OTAgKi8KKwkJCS8qIGlmIHZhbHVlIGlzIGJldHdlZW4gcDEgfiBvMSBvciBvMSB+IHMxLCBubyBuZWVkIHRvIGFkanVzdCB0eCBwb3dlciAqLworCQkJLyogaWYgdmFsdWUgaXMgMHg2NSwgdHggcG93ZXIgd2lsbCBiZSAtPSBUeEFnY1N0ZXAqKDItMSkgKi8KKworCQkJaWYgKEJicFI0OSA+IHBUc3NpTWludXNCb3VuZGFyeVsxXSkKKwkJCXsKKwkJCQkvLyBSZWFkaW5nIGlzIGxhcmdlciB0aGFuIHRoZSByZWZlcmVuY2UgdmFsdWUuCisJCQkJLy8gQ2hlY2sgZm9yIGhvdyBsYXJnZSB3ZSBuZWVkIHRvIGRlY3JlYXNlIHRoZSBUeCBwb3dlci4KKwkJCQlmb3IgKGlkeCA9IDE7IGlkeCA8IDU7IGlkeCsrKQorCQkJCXsKKwkJCQkJaWYgKEJicFI0OSA8PSBwVHNzaU1pbnVzQm91bmRhcnlbaWR4XSkgIC8vIEZvdW5kIHRoZSByYW5nZQorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8vIFRoZSBpbmRleCBpcyB0aGUgc3RlcCB3ZSBzaG91bGQgZGVjcmVhc2UsIGlkeCA9IDAgbWVhbnMgdGhlcmUgaXMgbm90aGluZyB0byBjb21wZW5zYXRlCisvLwkJCQlpZiAoUjMgPiAoVUxPTkcpIChUeEFnY1N0ZXAgKiAoaWR4LTEpKSkKKwkJCQkJKnBUeEFnY0NvbXBlbnNhdGUgPSAtKFR4QWdjU3RlcCAqIChpZHgtMSkpOworLy8JCQkJZWxzZQorLy8JCQkJCSpwVHhBZ2NDb21wZW5zYXRlID0gLSgoVUNIQVIpUjMpOworCisJCQkJRGVsdGFQd3IgKz0gKCpwVHhBZ2NDb21wZW5zYXRlKTsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLSBUeCBQb3dlciwgQkJQIFIxPSV4LCBUc3NpUmVmPSV4LCBUeEFnY1N0ZXA9JXgsIHN0ZXAgPSAtJWRcbiIsCisJCQkJCUJicFI0OSwgVHNzaVJlZiwgVHhBZ2NTdGVwLCBpZHgtMSkpOworCQkJfQorCQkJZWxzZSBpZiAoQmJwUjQ5IDwgcFRzc2lQbHVzQm91bmRhcnlbMV0pCisJCQl7CisJCQkJLy8gUmVhZGluZyBpcyBzbWFsbGVyIHRoYW4gdGhlIHJlZmVyZW5jZSB2YWx1ZQorCQkJCS8vIGNoZWNrIGZvciBob3cgbGFyZ2Ugd2UgbmVlZCB0byBpbmNyZWFzZSB0aGUgVHggcG93ZXIKKwkJCQlmb3IgKGlkeCA9IDE7IGlkeCA8IDU7IGlkeCsrKQorCQkJCXsKKwkJCQkJaWYgKEJicFI0OSA+PSBwVHNzaVBsdXNCb3VuZGFyeVtpZHhdKSAgIC8vIEZvdW5kIHRoZSByYW5nZQorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8vIFRoZSBpbmRleCBpcyB0aGUgc3RlcCB3ZSBzaG91bGQgaW5jcmVhc2UsIGlkeCA9IDAgbWVhbnMgdGhlcmUgaXMgbm90aGluZyB0byBjb21wZW5zYXRlCisJCQkJKnBUeEFnY0NvbXBlbnNhdGUgPSBUeEFnY1N0ZXAgKiAoaWR4LTEpOworCQkJCURlbHRhUHdyICs9ICgqcFR4QWdjQ29tcGVuc2F0ZSk7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiKysgVHggUG93ZXIsIEJCUCBSMT0leCwgVHNzaVJlZj0leCwgVHhBZ2NTdGVwPSV4LCBzdGVwID0gKyVkXG4iLAorCQkJCQlCYnBSNDksIFRzc2lSZWYsIFR4QWdjU3RlcCwgaWR4LTEpKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkqcFR4QWdjQ29tcGVuc2F0ZSA9IDA7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiICAgVHggUG93ZXIsIEJCUCBSMT0leCwgVHNzaVJlZj0leCwgVHhBZ2NTdGVwPSV4LCBzdGVwID0gKyVkXG4iLAorCQkJCQlCYnBSNDksIFRzc2lSZWYsIFR4QWdjU3RlcCwgMCkpOworCQkJfQorCQl9CisJfQorCWVsc2UKKwl7CisJCWlmIChwQWQtPmF0ZS5DaGFubmVsIDw9IDE0KQorCQl7CisJCQliQXV0b1R4QWdjICAgICAgICAgPSBwQWQtPmJBdXRvVHhBZ2NHOworCQkJcFR4QWdjQ29tcGVuc2F0ZSAgID0gJnBBZC0+VHhBZ2NDb21wZW5zYXRlRzsKKwkJfQorCQllbHNlCisJCXsKKwkJCWJBdXRvVHhBZ2MgICAgICAgICA9IHBBZC0+YkF1dG9UeEFnY0E7CisJCQlwVHhBZ2NDb21wZW5zYXRlICAgPSAmcEFkLT5UeEFnY0NvbXBlbnNhdGVBOworCQl9CisKKwkJaWYgKGJBdXRvVHhBZ2MpCisJCQlEZWx0YVB3ciArPSAoKnBUeEFnY0NvbXBlbnNhdGUpOworCX0KKworCS8qIGNhbGN1bGF0ZSBkZWx0YSBwb3dlciBiYXNlZCBvbiB0aGUgcGVyY2VudGFnZSBzcGVjaWZpZWQgZnJvbSBVSSAqLworCS8vIEUyUFJPTSBzZXR0aW5nIGlzIGNhbGlicmF0ZWQgZm9yIG1heGltdW0gVFggcG93ZXIgKGkuZS4gMTAwJSkKKwkvLyBXZSBsb3dlciBUWCBwb3dlciBoZXJlIGFjY29yZGluZyB0byB0aGUgcGVyY2VudGFnZSBzcGVjaWZpZWQgZnJvbSBVSQorCWlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9PSAweGZmZmZmZmZmKSAgICAgICAvLyBBVVRPIFRYIFBPV0VSIGNvbnRyb2wKKwkJOworCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gOTApICAvLyA5MSB+IDEwMCUgJiBBVVRPLCB0cmVhdCBhcyAxMDAlIGluIHRlcm1zIG9mIG1XCisJCTsKKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDYwKSAgLy8gNjEgfiA5MCUsIHRyZWF0IGFzIDc1JSBpbiB0ZXJtcyBvZiBtVworCXsKKwkJRGVsdGFQd3IgLT0gMTsKKwl9CisJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiAzMCkgIC8vIDMxIH4gNjAlLCB0cmVhdCBhcyA1MCUgaW4gdGVybXMgb2YgbVcKKwl7CisJCURlbHRhUHdyIC09IDM7CisJfQorCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gMTUpICAvLyAxNiB+IDMwJSwgdHJlYXQgYXMgMjUlIGluIHRlcm1zIG9mIG1XCisJeworCQlEZWx0YVB3ciAtPSA2OworCX0KKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDkpICAgLy8gMTAgfiAxNSUsIHRyZWF0IGFzIDEyLjUlIGluIHRlcm1zIG9mIG1XCisJeworCQlEZWx0YVB3ciAtPSA5OworCX0KKwllbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAgfiA5ICUsIHRyZWF0IGFzIE1JTih+MyUpIGluIHRlcm1zIG9mIG1XCisJeworCQlEZWx0YVB3ciAtPSAxMjsKKwl9CisKKwkvKiByZXNldCBkaWZmZXJlbnQgbmV3IHR4IHBvd2VyIGZvciBkaWZmZXJlbnQgVFggcmF0ZSAqLworCWZvcihpPTA7IGk8NTsgaSsrKQorCXsKKwkJaWYgKFR4UHdyW2ldICE9IDB4ZmZmZmZmZmYpCisJCXsKKwkJCWZvciAoaj0wOyBqPDg7IGorKykKKwkJCXsKKwkJCQlWYWx1ZSA9IChDSEFSKSgoVHhQd3JbaV0gPj4gaio0KSAmIDB4MEYpOyAvKiAwIH4gMTUgKi8KKworCQkJCWlmICgoVmFsdWUgKyBEZWx0YVB3cikgPCAwKQorCQkJCXsKKwkJCQkJVmFsdWUgPSAwOyAvKiBtaW4gKi8KKwkJCQl9CisJCQkJZWxzZSBpZiAoKFZhbHVlICsgRGVsdGFQd3IpID4gMHhGKQorCQkJCXsKKwkJCQkJVmFsdWUgPSAweEY7IC8qIG1heCAqLworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlWYWx1ZSArPSBEZWx0YVB3cjsgLyogdGVtcGVyYXR1cmUgY29tcGVuc2F0aW9uICovCisJCQkJfQorCisJCQkJLyogZmlsbCBuZXcgdmFsdWUgdG8gQ1NSIG9mZnNldCAqLworCQkJCVR4UHdyW2ldID0gKFR4UHdyW2ldICYgfigweDAwMDAwMDBGIDw8IGoqNCkpIHwgKFZhbHVlIDw8IGoqNCk7CisJCQl9CisKKwkJCS8qIHdyaXRlIHR4IHBvd2VyIHZhbHVlIHRvIENTUiAqLworCQkJLyogVFhfUFdSX0NGR18wICg4IHR4IHJhdGUpIGZvcglUWCBwb3dlciBmb3IgT0ZETSAxMk0vMThNCisJCQkJCQkJCQkJCVRYIHBvd2VyIGZvciBPRkRNIDZNLzlNCisJCQkJCQkJCQkJCVRYIHBvd2VyIGZvciBDQ0s1LjVNLzExTQorCQkJCQkJCQkJCQlUWCBwb3dlciBmb3IgQ0NLMU0vMk0gKi8KKwkJCS8qIFRYX1BXUl9DRkdfMSB+IFRYX1BXUl9DRkdfNCAqLworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUFdSX0NGR18wICsgaSo0LCBUeFB3cltpXSk7CisKKworCQl9CisJfQorCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJV3JpdGUgVHhXSSBmb3IgQVRFIG1vZGUuCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisjaWZkZWYgUlQyODYwCitzdGF0aWMgVk9JRCBBVEVXcml0ZVR4V0koCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFRYV0lfU1RSVUMgCXBPdXRUeFdJLAorCUlOCUJPT0xFQU4JCQlGUkFHLAorCUlOCUJPT0xFQU4JCQlDRkFDSywKKwlJTglCT09MRUFOCQkJSW5zVGltZXN0YW1wLAorCUlOCUJPT0xFQU4gCQlBTVBEVSwKKwlJTglCT09MRUFOIAkJQWNrLAorCUlOCUJPT0xFQU4gCQlOU2VxLAkJLy8gSFcgbmV3IGEgc2VxdWVuY2UuCisJSU4JVUNIQVIJCQlCQVNpemUsCisJSU4JVUNIQVIJCQlXQ0lELAorCUlOCVVMT05HCQkJTGVuZ3RoLAorCUlOCVVDSEFSIAkJCVBJRCwKKwlJTglVQ0hBUgkJCVRJRCwKKwlJTglVQ0hBUgkJCVR4UmF0ZSwKKwlJTglVQ0hBUgkJCVR4b3Btb2RlLAorCUlOCUJPT0xFQU4JCQlDZkFjaywKKwlJTglIVFRSQU5TTUlUX1NFVFRJTkcJKnBUcmFuc21pdCkKK3sKKwlUWFdJX1NUUlVDIAkJVHhXSTsKKwlQVFhXSV9TVFJVQyAJcFR4V0k7CisKKwkvLworCS8vIEFsd2F5cyB1c2UgTG9uZyBwcmVhbWJsZSBiZWZvcmUgdmVyaWZpYXRpb24gc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcyB3ZWxsLgorCS8vIFRvZG86IHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUgaWYgc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcworCS8vCisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsKKwlOZGlzWmVyb01lbW9yeSgmVHhXSSwgVFhXSV9TSVpFKTsKKwlwVHhXSSA9ICZUeFdJOworCisJcFR4V0ktPkZSQUc9IEZSQUc7CisKKwlwVHhXSS0+Q0ZBQ0sgPSBDRkFDSzsKKwlwVHhXSS0+VFM9IEluc1RpbWVzdGFtcDsKKwlwVHhXSS0+QU1QRFUgPSBBTVBEVTsKKwlwVHhXSS0+QUNLID0gQWNrOworCXBUeFdJLT50eG9wPSBUeG9wbW9kZTsKKworCXBUeFdJLT5OU0VRID0gTlNlcTsKKwkvLyBKb2huIHR1bmUgdGhlIHBlcmZvcm1hY2Ugd2l0aCBJbnRlbCBDbGllbnQgaW4gMjAgTUh6IHBlcmZvcm1hbmNlCisJaWYoIEJBU2l6ZSA+NyApCisJCUJBU2l6ZSA9NzsKKworCXBUeFdJLT5CQVdpblNpemUgPSBCQVNpemU7CisJcFR4V0ktPldpcmVsZXNzQ2xpSUQgPSBXQ0lEOworCXBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPSBMZW5ndGg7CisJcFR4V0ktPlBhY2tldElkID0gUElEOworCisJLy8gSWYgQ0NLIG9yIE9GRE0sIEJXIG11c3QgYmUgMjAKKwlwVHhXSS0+QlcgPSAocFRyYW5zbWl0LT5maWVsZC5NT0RFIDw9IE1PREVfT0ZETSkgPyAoQldfMjApIDogKHBUcmFuc21pdC0+ZmllbGQuQlcpOworCXBUeFdJLT5TaG9ydEdJID0gcFRyYW5zbWl0LT5maWVsZC5TaG9ydEdJOworCXBUeFdJLT5TVEJDID0gcFRyYW5zbWl0LT5maWVsZC5TVEJDOworCisJcFR4V0ktPk1DUyA9IHBUcmFuc21pdC0+ZmllbGQuTUNTOworCXBUeFdJLT5QSFlNT0RFID0gcFRyYW5zbWl0LT5maWVsZC5NT0RFOworCXBUeFdJLT5DRkFDSyA9IENmQWNrOworCXBUeFdJLT5NSU1PcHMgPSAwOworCXBUeFdJLT5NcGR1RGVuc2l0eSA9IDA7CisKKwlwVHhXSS0+UGFja2V0SWQgPSBwVHhXSS0+TUNTOworCU5kaXNNb3ZlTWVtb3J5KHBPdXRUeFdJLCAmVHhXSSwgc2l6ZW9mKFRYV0lfU1RSVUMpKTsKKworICAgICAgICByZXR1cm47Cit9CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlEaXNhYmxlIHByb3RlY3Rpb24gZm9yIEFURS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEFURURpc2FibGVBc2ljUHJvdGVjdCgKKwlJTgkJUFJUTVBfQURBUFRFUglwQWQpCit7CisJUFJPVF9DRkdfU1RSVUMJUHJvdENmZywgUHJvdENmZzQ7CisJVUlOVDMyIFByb3RlY3RbNl07CisJVVNIT1JUCQkJb2Zmc2V0OworCVVDSEFSCQkJaTsKKwlVSU5UMzIgTWFjUmVnID0gMDsKKworCS8vIENvbmZpZyBBU0lDIFJUUyB0aHJlc2hvbGQgcmVnaXN0ZXIKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1JUU19DRkcsICZNYWNSZWcpOworCU1hY1JlZyAmPSAweEZGMDAwMEZGOworCU1hY1JlZyB8PSAocEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkIDw8IDgpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1JUU19DRkcsIE1hY1JlZyk7CisKKwkvLyBJbml0aWFsIGNvbW1vbiBwcm90ZWN0aW9uIHNldHRpbmdzCisJUlRNUFplcm9NZW1vcnkoUHJvdGVjdCwgc2l6ZW9mKFByb3RlY3QpKTsKKwlQcm90Q2ZnNC53b3JkID0gMDsKKwlQcm90Q2ZnLndvcmQgPSAwOworCVByb3RDZmcuZmllbGQuVHhvcEFsbG93R0Y0MCA9IDE7CisJUHJvdENmZy5maWVsZC5UeG9wQWxsb3dHRjIwID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd01NNDAgPSAxOworCVByb3RDZmcuZmllbGQuVHhvcEFsbG93TU0yMCA9IDE7CisJUHJvdENmZy5maWVsZC5UeG9wQWxsb3dPZmRtID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd0NjayA9IDE7CisJUHJvdENmZy5maWVsZC5SVFNUaEVuID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOworCisJLy8gSGFuZGxlIGxlZ2FjeShCL0cpIHByb3RlY3Rpb24KKwlQcm90Q2ZnLmZpZWxkLlByb3RlY3RSYXRlID0gcEFkLT5Db21tb25DZmcuUnRzUmF0ZTsKKwlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gMDsKKwlQcm90ZWN0WzBdID0gUHJvdENmZy53b3JkOworCVByb3RlY3RbMV0gPSBQcm90Q2ZnLndvcmQ7CisKKwkvLyBOTyBQUk9URUNUCisJLy8gMS5BbGwgU1RBcyBpbiB0aGUgQlNTIGFyZSAyMC80MCBNSHogSFQKKwkvLyAyLiBpbiBhaSAyMC80ME1IeiBCU1MKKwkvLyAzLiBhbGwgU1RBcyBhcmUgMjBNSHogaW4gYSAyME1IeiBCU1MKKwkvLyBQdXJlIEhULiBubyBwcm90ZWN0aW9uLgorCisJLy8gTU0yMF9QUk9UX0NGRworCS8vCVJlc2VydmVkICgzMToyNykKKwkvLyAJUFJPVF9UWE9QKDI1OjIwKSAtLSAwMTAxMTEKKwkvLwlQUk9UX05BVigxOToxOCkgIC0tIDAxIChTaG9ydCBOQVYgcHJvdGVjdGlvbikKKwkvLyAgUFJPVF9DVFJMKDE3OjE2KSAtLSAwMCAoTm9uZSkKKwkvLyAJUFJPVF9SQVRFKDE1OjApICAtLSAweDQwMDQgKE9GRE0gMjRNKQorCVByb3RlY3RbMl0gPSAweDAxNzQ0MDA0OworCisJLy8gTU00MF9QUk9UX0NGRworCS8vCVJlc2VydmVkICgzMToyNykKKwkvLyAJUFJPVF9UWE9QKDI1OjIwKSAtLSAxMTExMTEKKwkvLwlQUk9UX05BVigxOToxOCkgIC0tIDAxIChTaG9ydCBOQVYgcHJvdGVjdGlvbikKKwkvLyAgUFJPVF9DVFJMKDE3OjE2KSAtLSAwMCAoTm9uZSkKKwkvLyAJUFJPVF9SQVRFKDE1OjApICAtLSAweDQwODQgKGR1cGxpY2F0ZSBPRkRNIDI0TSkKKwlQcm90ZWN0WzNdID0gMHgwM2Y0NDA4NDsKKworCS8vIENGMjBfUFJPVF9DRkcKKwkvLwlSZXNlcnZlZCAoMzE6MjcpCisJLy8gCVBST1RfVFhPUCgyNToyMCkgLS0gMDEwMTExCisJLy8JUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pCisJLy8gIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpCisJLy8gCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDA0IChPRkRNIDI0TSkKKwlQcm90ZWN0WzRdID0gMHgwMTc0NDAwNDsKKworCS8vIENGNDBfUFJPVF9DRkcKKwkvLwlSZXNlcnZlZCAoMzE6MjcpCisJLy8gCVBST1RfVFhPUCgyNToyMCkgLS0gMTExMTExCisJLy8JUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pCisJLy8gIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpCisJLy8gCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDg0IChkdXBsaWNhdGUgT0ZETSAyNE0pCisJUHJvdGVjdFs1XSA9IDB4MDNmNDQwODQ7CisKKwlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJSVFNMb25nUHJvdE9uID0gRkFMU0U7CisKKwlvZmZzZXQgPSBDQ0tfUFJPVF9DRkc7CisJZm9yIChpID0gMDtpIDwgNjtpKyspCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCArIGkqNCwgUHJvdGVjdFtpXSk7CisKK30KKworCisvKiBUaGVyZSBhcmUgdHdvIHdheXMgdG8gY29udmVydCBSc3NpICovCisjaWYgMQorLy8KKy8vIFRoZSB3YXkgdXNlZCB3aXRoIEdFVF9MTkFfR0FJTigpLgorLy8KK0NIQVIgQVRFQ29udmVydFRvUnNzaSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglDSEFSCVJzc2ksCisJSU4gIFVDSEFSICAgUnNzaU51bWJlcikKK3sKKwlVQ0hBUglSc3NpT2Zmc2V0LCBMTkFHYWluOworCisJLy8gUnNzaSBlcXVhbHMgdG8gemVybyBzaG91bGQgYmUgYW4gaW52YWxpZCB2YWx1ZQorCWlmIChSc3NpID09IDApCisJCXJldHVybiAtOTk7CisKKwlMTkFHYWluID0gR0VUX0xOQV9HQUlOKHBBZCk7CisJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA+IDE0KQorCXsKKwkJaWYgKFJzc2lOdW1iZXIgPT0gMCkKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkFSc3NpT2Zmc2V0MDsKKwkJZWxzZSBpZiAoUnNzaU51bWJlciA9PSAxKQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QVJzc2lPZmZzZXQxOworCQllbHNlCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5BUnNzaU9mZnNldDI7CisJfQorCWVsc2UKKwl7CisJCWlmIChSc3NpTnVtYmVyID09IDApCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5CR1Jzc2lPZmZzZXQwOworCQllbHNlIGlmIChSc3NpTnVtYmVyID09IDEpCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5CR1Jzc2lPZmZzZXQxOworCQllbHNlCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5CR1Jzc2lPZmZzZXQyOworCX0KKworCXJldHVybiAoLTEyIC0gUnNzaU9mZnNldCAtIExOQUdhaW4gLSBSc3NpKTsKK30KKyNlbHNlCisvLworLy8gVGhlIHdheSBvcmlnaW5hbGx5IHVzZWQgaW4gQVRFIG9mIHJ0Mjg2MGFwLgorLy8KK0NIQVIgQVRFQ29udmVydFRvUnNzaSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglDSEFSCQkJUnNzaSwKKwlJTiAgVUNIQVIgICBSc3NpTnVtYmVyKQoreworCVVDSEFSCVJzc2lPZmZzZXQsIExOQUdhaW47CisKKwkvLyBSc3NpIGVxdWFscyB0byB6ZXJvIHNob3VsZCBiZSBhbiBpbnZhbGlkIHZhbHVlCisJaWYgKFJzc2kgPT0gMCkKKwkJcmV0dXJuIC05OTsKKworICAgIGlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkKKyAgICB7CisgICAgICAgIExOQUdhaW4gPSBwQWQtPkFMTkFHYWluOworICAgICAgICBpZiAoUnNzaU51bWJlciA9PSAwKQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QVJzc2lPZmZzZXQwOworCQllbHNlIGlmIChSc3NpTnVtYmVyID09IDEpCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5BUnNzaU9mZnNldDE7CisJCWVsc2UKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkFSc3NpT2Zmc2V0MjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgTE5BR2FpbiA9IHBBZC0+QkxOQUdhaW47CisgICAgICAgIGlmIChSc3NpTnVtYmVyID09IDApCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5CR1Jzc2lPZmZzZXQwOworCQllbHNlIGlmIChSc3NpTnVtYmVyID09IDEpCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5CR1Jzc2lPZmZzZXQxOworCQllbHNlCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5CR1Jzc2lPZmZzZXQyOworICAgIH0KKworICAgIHJldHVybiAoLTMyIC0gUnNzaU9mZnNldCArIExOQUdhaW4gLSBSc3NpKTsKK30KKyNlbmRpZiAvKiBlbmQgb2YgI2lmIDEgKi8KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVNldCBKYXBhbiBmaWx0ZXIgY29lZmZpY2llbnRzIGlmIG5lZWRlZC4KKwlOb3RlOgorCQlUaGlzIHJvdXRpbmUgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4KKwkJZW50ZXJpbmcgVFhGUkFNRSBtb2RlIG9yIFRYQ09OVCBtb2RlLgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIFZPSUQgU2V0SmFwYW5GaWx0ZXIoCisJSU4JCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVVDSEFSCQkJQmJwRGF0YSA9IDA7CisKKwkvLworCS8vIElmIENoYW5uZWw9MTQgYW5kIEJhbmR3aWR0aD0yME0gYW5kIE1vZGU9Q0NLLCBzZXQgQkJQIFI0IGJpdDU9MQorCS8vIChKYXBhbiBUeCBmaWx0ZXIgY29lZmZpY2llbnRzKXdoZW4gKFRYRlJBTUUgb3IgVFhDT05UKS4KKwkvLworCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQmJwRGF0YSk7CisKKyAgICBpZiAoKHBBZC0+YXRlLlR4V0kuUEhZTU9ERSA9PSBNT0RFX0NDSykgJiYgKHBBZC0+YXRlLkNoYW5uZWwgPT0gMTQpICYmIChwQWQtPmF0ZS5UeFdJLkJXID09IEJXXzIwKSkKKyAgICB7CisgICAgICAgIEJicERhdGEgfD0gMHgyMDsgICAgLy8gdHVybiBvbgorICAgICAgICBBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRKYXBhbkZpbHRlciEhIVxuIikpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCQlCYnBEYXRhICY9IDB4ZGY7ICAgIC8vIHR1cm4gb2ZmCisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNsZWFySmFwYW5GaWx0ZXIhISFcbiIpKTsKKyAgICB9CisKKwlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJicERhdGEpOworfQorCitWT0lEIEFURVNhbXBsZVJzc2koCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gUFJYV0lfU1RSVUMJCXBSeFdJKQoreworCS8qIFRoZXJlIGFyZSB0d28gd2F5cyB0byBjb2xsZWN0IFJTU0kuICovCisjaWYgMQorCS8vcEFkLT5MYXN0UnhSYXRlID0gKFVTSE9SVCkoKHBSeFdJLT5NQ1MpICsgKHBSeFdJLT5CVyA8PDcpICsgKHBSeFdJLT5TaG9ydEdJIDw8OCkrIChwUnhXSS0+UEhZTU9ERSA8PDE0KSkgOworCWlmIChwUnhXSS0+UlNTSTAgIT0gMCkKKwl7CisJCXBBZC0+YXRlLkxhc3RSc3NpMAk9IEFURUNvbnZlcnRUb1Jzc2kocEFkLCAoQ0hBUikgcFJ4V0ktPlJTU0kwLCBSU1NJXzApOworCQlwQWQtPmF0ZS5BdmdSc3NpMFg4CT0gKHBBZC0+YXRlLkF2Z1Jzc2kwWDggLSBwQWQtPmF0ZS5BdmdSc3NpMCkgKyBwQWQtPmF0ZS5MYXN0UnNzaTA7CisJCXBBZC0+YXRlLkF2Z1Jzc2kwICAJPSBwQWQtPmF0ZS5BdmdSc3NpMFg4ID4+IDM7CisJfQorCWlmIChwUnhXSS0+UlNTSTEgIT0gMCkKKwl7CisJCXBBZC0+YXRlLkxhc3RSc3NpMQk9IEFURUNvbnZlcnRUb1Jzc2kocEFkLCAoQ0hBUikgcFJ4V0ktPlJTU0kxLCBSU1NJXzEpOworCQlwQWQtPmF0ZS5BdmdSc3NpMVg4CT0gKHBBZC0+YXRlLkF2Z1Jzc2kxWDggLSBwQWQtPmF0ZS5BdmdSc3NpMSkgKyBwQWQtPmF0ZS5MYXN0UnNzaTE7CisJCXBBZC0+YXRlLkF2Z1Jzc2kxCT0gcEFkLT5hdGUuQXZnUnNzaTFYOCA+PiAzOworCX0KKwlpZiAocFJ4V0ktPlJTU0kyICE9IDApCisJeworCQlwQWQtPmF0ZS5MYXN0UnNzaTIJPSBBVEVDb252ZXJ0VG9Sc3NpKHBBZCwgKENIQVIpIHBSeFdJLT5SU1NJMiwgUlNTSV8yKTsKKwkJcEFkLT5hdGUuQXZnUnNzaTJYOAk9IChwQWQtPmF0ZS5BdmdSc3NpMlg4IC0gcEFkLT5hdGUuQXZnUnNzaTIpICsgcEFkLT5hdGUuTGFzdFJzc2kyOworCQlwQWQtPmF0ZS5BdmdSc3NpMgk9IHBBZC0+YXRlLkF2Z1Jzc2kyWDggPj4gMzsKKwl9CisKKwlwQWQtPmF0ZS5MYXN0U05SMCA9IChDSEFSKShwUnhXSS0+U05SMCk7Ly8gQ0hBUiA9PT4gVUNIQVIgPworCXBBZC0+YXRlLkxhc3RTTlIxID0gKENIQVIpKHBSeFdJLT5TTlIxKTsvLyBDSEFSID09PiBVQ0hBUiA/CisKKwlwQWQtPmF0ZS5OdW1PZkF2Z1Jzc2lTYW1wbGUgKys7CisjZWxzZQorCXBBZC0+YXRlLkxhc3RTTlIwID0gKENIQVIpKHBSeFdJLT5TTlIwKTsKKwlwQWQtPmF0ZS5MYXN0U05SMSA9IChDSEFSKShwUnhXSS0+U05SMSk7CisJcEFkLT5hdGUuUnhDbnRQZXJTZWMrKzsKKwlwQWQtPmF0ZS5MYXN0UnNzaTAgPSBBVEVDb252ZXJ0VG9Sc3NpKHBBZCwgKENIQVIpIHBSeFdJLT5SU1NJMCwgUlNTSV8wKTsKKwlwQWQtPmF0ZS5MYXN0UnNzaTEgPSBBVEVDb252ZXJ0VG9Sc3NpKHBBZCwgKENIQVIpIHBSeFdJLT5SU1NJMSwgUlNTSV8xKTsKKwlwQWQtPmF0ZS5MYXN0UnNzaTIgPSBBVEVDb252ZXJ0VG9Sc3NpKHBBZCwgKENIQVIpIHBSeFdJLT5SU1NJMiwgUlNTSV8yKTsKKwlwQWQtPmF0ZS5BdmdSc3NpMFg4ID0gKHBBZC0+YXRlLkF2Z1Jzc2kwWDggLSBwQWQtPmF0ZS5BdmdSc3NpMCkgKyBwQWQtPmF0ZS5MYXN0UnNzaTA7CisJcEFkLT5hdGUuQXZnUnNzaTAgPSBwQWQtPmF0ZS5BdmdSc3NpMFg4ID4+IDM7CisJcEFkLT5hdGUuQXZnUnNzaTFYOCA9IChwQWQtPmF0ZS5BdmdSc3NpMVg4IC0gcEFkLT5hdGUuQXZnUnNzaTEpICsgcEFkLT5hdGUuTGFzdFJzc2kxOworCXBBZC0+YXRlLkF2Z1Jzc2kxID0gcEFkLT5hdGUuQXZnUnNzaTFYOCA+PiAzOworCXBBZC0+YXRlLkF2Z1Jzc2kyWDggPSAocEFkLT5hdGUuQXZnUnNzaTJYOCAtIHBBZC0+YXRlLkF2Z1Jzc2kyKSArIHBBZC0+YXRlLkxhc3RSc3NpMjsKKwlwQWQtPmF0ZS5BdmdSc3NpMiA9IHBBZC0+YXRlLkF2Z1Jzc2kyWDggPj4gMzsKKwlwQWQtPmF0ZS5OdW1PZkF2Z1Jzc2lTYW1wbGUgKys7CisjZW5kaWYKK30KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorVk9JRCBSVE1QU3RhdGlvblN0b3AoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpCit7CisvLwlCT09MRUFOICAgICAgIENhbmNlbGxlZDsKKworICAgIEFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBSVE1QU3RhdGlvblN0b3BcbiIpKTsKKworI2lmIDAKKwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5Bc3NvY1RpbWVyLCAgICAgICZDYW5jZWxsZWQpOworCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlJlYXNzb2NUaW1lciwgICAgJkNhbmNlbGxlZCk7CisJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguRGlzYXNzb2NUaW1lciwgICAmQ2FuY2VsbGVkKTsKKwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsICAgICAgICZDYW5jZWxsZWQpOworCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLCAgICAgJkNhbmNlbGxlZCk7CisJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCAgICAgICAmQ2FuY2VsbGVkKTsKKyNlbmRpZgorCS8vIEZvciByeCBzdGF0aXN0aWNzLCB3ZSBuZWVkIHRvIGtlZXAgdGhpcyB0aW1lciBydW5uaW5nLgorLy8JUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUGVyaW9kaWNUaW1lciwgICAgICAmQ2FuY2VsbGVkKTsKKworICAgIEFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBSVE1QU3RhdGlvblN0b3BcbiIpKTsKK30KKworVk9JRCBSVE1QU3RhdGlvblN0YXJ0KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKQoreworICAgIEFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBSVE1QU3RhdGlvblN0YXJ0XG4iKSk7CisjaWZkZWYgUlQyODYwCisJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKwkvLworCS8vIFdlIGRpZCBub3QgY2FuY2VsIHRoaXMgdGltZXIgd2hlbiBlbnRlcmluZyBBVEUgbW9kZS4KKwkvLworLy8JUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUGVyaW9kaWNUaW1lciwgTUxNRV9UQVNLX0VYRUNfSU5UVik7CisjZW5kaWYgLy8gUlQyODYwIC8vCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IFJUTVBTdGF0aW9uU3RhcnRcbiIpKTsKK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlTZXR1cCBGcmFtZSBmb3JtYXQuCisJTk9URToKKwkJVGhpcyByb3V0aW5lIHNob3VsZCBvbmx5IGJlIHVzZWQgaW4gQVRFIG1vZGUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworI2lmZGVmIFJUMjg2MAorc3RhdGljIElOVCBBVEVTZXRVcEZyYW1lKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVJTlQzMiBUeElkeCkKK3sKKwlVSU5UIGo7CisJUFRYRF9TVFJVQyBwVHhEOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBQVFhEX1NUUlVDICAgICAgcERlc3RUeEQ7CisgICAgVFhEX1NUUlVDICAgICAgIFR4RDsKKyNlbmRpZgorCVBORElTX1BBQ0tFVCBwUGFja2V0OworCVBVQ0hBUiBwRGVzdDsKKwlQVk9JRCBBbGxvY1ZhOworCU5ESVNfUEhZU0lDQUxfQUREUkVTUyBBbGxvY1BhOworCUhUVFJBTlNNSVRfU0VUVElORwlUeEhUUGh5TW9kZTsKKworCVBSVE1QX1RYX1JJTkcgcFR4UmluZyA9ICZwQWQtPlR4UmluZ1tRSURfQUNfQkVdOworCVBUWFdJX1NUUlVDIHBUeFdJID0gKFBUWFdJX1NUUlVDKSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NWYTsKKwlQVUNIQVIgcERNQUhlYWRlckJ1ZlZBID0gKFBVQ0hBUikgcFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jVmE7CisKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCVBIRUFERVJfODAyXzExCXBIZWFkZXI4MDIxMTsKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCisJaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKKwl7CisJCS8vIGFsd2F5cyB1c2UgUUlEX0FDX0JFIGFuZCBGSUZPX0VEQ0EKKworCQkvLyBmaWxsIFR4V0kKKwkJVHhIVFBoeU1vZGUuZmllbGQuQlcgPSBwQWQtPmF0ZS5UeFdJLkJXOworCQlUeEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gcEFkLT5hdGUuVHhXSS5TaG9ydEdJOworCQlUeEhUUGh5TW9kZS5maWVsZC5TVEJDID0gMDsKKwkJVHhIVFBoeU1vZGUuZmllbGQuTUNTID0gcEFkLT5hdGUuVHhXSS5NQ1M7CisJCVR4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBwQWQtPmF0ZS5UeFdJLlBIWU1PREU7CisJCUFURVdyaXRlVHhXSShwQWQsIHBUeFdJLCBwQWQtPmF0ZS5UeFdJLkZSQUcsIHBBZC0+YXRlLlR4V0kuQ0ZBQ0ssIHBBZC0+YXRlLlR4V0kuVFMsICBwQWQtPmF0ZS5UeFdJLkFNUERVLCBwQWQtPmF0ZS5UeFdJLkFDSywgcEFkLT5hdGUuVHhXSS5OU0VRLAorCQkJcEFkLT5hdGUuVHhXSS5CQVdpblNpemUsIDAsIHBBZC0+YXRlLlR4V0kuTVBEVXRvdGFsQnl0ZUNvdW50LCBwQWQtPmF0ZS5UeFdJLlBhY2tldElkLCAwLCAwLCBwQWQtPmF0ZS5UeFdJLnR4b3AvKklGU19IVFRYT1AqLywgcEFkLT5hdGUuVHhXSS5DRkFDSy8qRkFMU0UqLywgJlR4SFRQaHlNb2RlKTsKKwl9CisJZWxzZQorCXsKKwkJVHhIVFBoeU1vZGUuZmllbGQuQlcgPSBwQWQtPmF0ZS5UeFdJLkJXOworCQlUeEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gcEFkLT5hdGUuVHhXSS5TaG9ydEdJOworCQlUeEhUUGh5TW9kZS5maWVsZC5TVEJDID0gMDsKKwkJVHhIVFBoeU1vZGUuZmllbGQuTUNTID0gcEFkLT5hdGUuVHhXSS5NQ1M7CisJCVR4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBwQWQtPmF0ZS5UeFdJLlBIWU1PREU7CisJCUFURVdyaXRlVHhXSShwQWQsIHBUeFdJLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCAgRkFMU0UsIEZBTFNFLCBGQUxTRSwKKwkJCTQsIDAsIHBBZC0+YXRlLlR4TGVuZ3RoLCAwLCAwLCAwLCBJRlNfSFRUWE9QLCBGQUxTRSwgJlR4SFRQaHlNb2RlKTsKKwl9CisKKwkvLyBmaWxsIDgwMi4xMSBoZWFkZXIuCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKQorCXsKKwkJTmRpc01vdmVNZW1vcnkocERNQUhlYWRlckJ1ZlZBK1RYV0lfU0laRSwgcEFkLT5hdGUuSGVhZGVyLCBwQWQtPmF0ZS5ITGVuKTsKKwl9CisJZWxzZQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisJeworCQlOZGlzTW92ZU1lbW9yeShwRE1BSGVhZGVyQnVmVkErVFhXSV9TSVpFLCBUZW1wbGF0ZUZyYW1lLCBMRU5HVEhfODAyXzExKTsKKwkJTmRpc01vdmVNZW1vcnkocERNQUhlYWRlckJ1ZlZBK1RYV0lfU0laRSs0LCBwQWQtPmF0ZS5BZGRyMSwgRVRIX0xFTkdUSF9PRl9BRERSRVNTKTsKKwkJTmRpc01vdmVNZW1vcnkocERNQUhlYWRlckJ1ZlZBK1RYV0lfU0laRSsxMCwgcEFkLT5hdGUuQWRkcjIsIEVUSF9MRU5HVEhfT0ZfQUREUkVTUyk7CisJCU5kaXNNb3ZlTWVtb3J5KHBETUFIZWFkZXJCdWZWQStUWFdJX1NJWkUrMTYsIHBBZC0+YXRlLkFkZHIzLCBFVEhfTEVOR1RIX09GX0FERFJFU1MpOworCX0KKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoKChQVUNIQVIpcERNQUhlYWRlckJ1ZlZBKStUWFdJX1NJWkUpLCBESVJfUkVBRCwgRkFMU0UpOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKworCS8qIGFsbG9jIGJ1ZmZlciBmb3IgcGF5bG9hZCAqLworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKKwl7CisJCS8qIFdoeSBub3QgdXNlIFJUTVBfQWxsb2NhdGVUeFBhY2tldEJ1ZmZlcigpIGluc3RlYWQgb2YgUlRNUF9BbGxvY2F0ZVJ4UGFja2V0QnVmZmVyKCk/ICovCisJCXBQYWNrZXQgPSBSVE1QX0FsbG9jYXRlUnhQYWNrZXRCdWZmZXIocEFkLCBwQWQtPmF0ZS5ETGVuICsgMHgxMDAsIEZBTFNFLCAmQWxsb2NWYSwgJkFsbG9jUGEpOworCX0KKwllbHNlCisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKwl7CisJCS8qIFdoeSBub3QgdXNlIFJUTVBfQWxsb2NhdGVUeFBhY2tldEJ1ZmZlcigpIGluc3RlYWQgb2YgUlRNUF9BbGxvY2F0ZVJ4UGFja2V0QnVmZmVyKCk/ICovCisJCXBQYWNrZXQgPSBSVE1QX0FsbG9jYXRlUnhQYWNrZXRCdWZmZXIocEFkLCBwQWQtPmF0ZS5UeExlbmd0aCwgRkFMU0UsICZBbGxvY1ZhLCAmQWxsb2NQYSk7CisJfQorCisJaWYgKHBQYWNrZXQgPT0gTlVMTCkKKwl7CisJCXBBZC0+YXRlLlR4Q291bnQgPSAwOworCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyBmYWlsIHRvIGFsbG9jIHBhY2tldCBzcGFjZS5cbiIsIF9fZnVuY19fKSk7CisJCXJldHVybiAtMTsKKwl9CisJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0ID0gcFBhY2tldDsKKworCXBEZXN0ID0gKFBVQ0hBUikgQWxsb2NWYTsKKworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKKwl7CisJCVJUUEtUX1RPX09TUEtUKHBQYWNrZXQpLT5sZW4gPSBwQWQtPmF0ZS5ETGVuOworCX0KKwllbHNlCisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKwl7CisJCVJUUEtUX1RPX09TUEtUKHBQYWNrZXQpLT5sZW4gPSBwQWQtPmF0ZS5UeExlbmd0aCAtIExFTkdUSF84MDJfMTE7CisJfQorCisJLy8gUHJlcGFyZSBmcmFtZSBwYXlsb2FkCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKQorCXsKKwkJLy8gY29weSBwYXR0ZXJuCisJCWlmICgocEFkLT5hdGUuUExlbiAhPSAwKSkKKwkJeworCQkJaW50IGo7CisKKwkJCWZvciAoaiA9IDA7IGogPCBwQWQtPmF0ZS5ETGVuOyBqKz1wQWQtPmF0ZS5QTGVuKQorCQkJeworCQkJCW1lbWNweShSVFBLVF9UT19PU1BLVChwUGFja2V0KS0+ZGF0YSArIGosIHBBZC0+YXRlLlBhdHRlcm4sIHBBZC0+YXRlLlBMZW4pOworCQkJfQorCQl9CisJfQorCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCXsKKwkJZm9yKGogPSAwOyBqIDwgUlRQS1RfVE9fT1NQS1QocFBhY2tldCktPmxlbjsgaisrKQorCQkJcERlc3Rbal0gPSAweEE1OworCX0KKworCS8vCisJLy8gYnVpbGQgVHggRGVzY3JpcHRvcgorCS8vCisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKwlwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7CisjZWxzZQorICAgIHBEZXN0VHhEICA9IChQVFhEX1NUUlVDKXBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7CisgICAgVHhEID0gKnBEZXN0VHhEOworICAgIHBUeEQgPSAmVHhEOworI2VuZGlmIC8vICFSVF9CSUdfRU5ESUFOIC8vCisKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpCisJeworCQkvLyBwcmVwYXJlIFR4RAorCQlOZGlzWmVyb01lbW9yeShwVHhELCBUWERfU0laRSk7CisJCVJUTVBXcml0ZVR4RGVzY3JpcHRvcihwQWQsIHBUeEQsIEZBTFNFLCBGSUZPX0VEQ0EpOworCQkvLyBidWlsZCBUWCBERVNDCisJCXBUeEQtPlNEUHRyMCA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBUeFJpbmctPkNlbGxbVHhJZHhdLkRtYUJ1Zi5BbGxvY1BhKTsKKwkJcFR4RC0+U0RMZW4wID0gVFhXSV9TSVpFICsgcEFkLT5hdGUuSExlbjsKKwkJcFR4RC0+TGFzdFNlYzAgPSAwOworCQlwVHhELT5TRFB0cjEgPSBBbGxvY1BhOworCQlwVHhELT5TRExlbjEgPSBSVFBLVF9UT19PU1BLVChwUGFja2V0KS0+bGVuOworCQlwVHhELT5MYXN0U2VjMSA9IDE7CisKKwkJcERlc3QgPSAoUFVDSEFSKXBUeFdJOworCQlwRGVzdCArPSBUWFdJX1NJWkU7CisJCXBIZWFkZXI4MDIxMSA9IChQSEVBREVSXzgwMl8xMSlwRGVzdDsKKworCQkvLyBtb2RpZnkgc2VxdWVuY2UgbnVtYmVyLi4uLgorCQlpZiAocEFkLT5hdGUuVHhEb25lQ291bnQgPT0gMCkKKwkJeworCQkJcEFkLT5hdGUuc2VxID0gcEhlYWRlcjgwMjExLT5TZXF1ZW5jZTsKKwkJfQorCQllbHNlCisJCQlwSGVhZGVyODAyMTEtPlNlcXVlbmNlID0gKytwQWQtPmF0ZS5zZXE7CisJfQorCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCXsKKwkJTmRpc1plcm9NZW1vcnkocFR4RCwgVFhEX1NJWkUpOworCQlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBGQUxTRSwgRklGT19FRENBKTsKKwkJLy8gYnVpbGQgVFggREVTQworCQlwVHhELT5TRFB0cjAgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyAocFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jUGEpOworCQlwVHhELT5TRExlbjAgPSBUWFdJX1NJWkUgKyBMRU5HVEhfODAyXzExOworCQlwVHhELT5MYXN0U2VjMCA9IDA7CisJCXBUeEQtPlNEUHRyMSA9IEFsbG9jUGE7CisJCXBUeEQtPlNETGVuMSA9IFJUUEtUX1RPX09TUEtUKHBQYWNrZXQpLT5sZW47CisJCXBUeEQtPkxhc3RTZWMxID0gMTsKKwl9CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUFdJRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4V0ksIFRZUEVfVFhXSSk7CisJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKCgoUFVDSEFSKXBETUFIZWFkZXJCdWZWQSkrVFhXSV9TSVpFKSwgRElSX1dSSVRFLCBGQUxTRSk7CisgICAgUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7CisgICAgV3JpdGVCYWNrVG9EZXNjcmlwdG9yKChQVUNIQVIpcERlc3RUeEQsIChQVUNIQVIpcFR4RCwgRkFMU0UsIFRZUEVfVFhEKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisJcmV0dXJuIDA7Cit9CisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PUVuZCBvZiBSVDI4NjA9PT09PT09PT09PT09PT09PT09PT09PSovCisjZW5kaWYgLy8gUlQyODYwIC8vCisKKworVk9JRCBydF9lZV9yZWFkX2FsbChQUlRNUF9BREFQVEVSIHBBZCwgVVNIT1JUICpEYXRhKQoreworCVVTSE9SVCBpOworCVVTSE9SVCB2YWx1ZTsKKworCWZvciAoaSA9IDAgOyBpIDwgRUVQUk9NX1NJWkUvMiA7ICkKKwl7CisJCS8qICJ2YWx1ZSIgaXMgZXhwZWNpYWxseSBmb3Igc29tZSBjb21waWxlcnMuLi4gKi8KKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBpKjIsIHZhbHVlKTsKKwkJRGF0YVtpXSA9IHZhbHVlOworCQlpKys7CisJfQorfQorCitWT0lEIHJ0X2VlX3dyaXRlX2FsbChQUlRNUF9BREFQVEVSIHBBZCwgVVNIT1JUICpEYXRhKQoreworCVVTSE9SVCBpOworCVVTSE9SVCB2YWx1ZTsKKworCWZvciAoaSA9IDAgOyBpIDwgRUVQUk9NX1NJWkUvMiA7ICkKKwl7CisJCS8qICJ2YWx1ZSIgaXMgZXhwZWNpYWxseSBmb3Igc29tZSBjb21waWxlcnMuLi4gKi8KKwkJdmFsdWUgPSBEYXRhW2ldOworCQlSVDI4eHhfRUVQUk9NX1dSSVRFMTYocEFkLCBpKjIsIHZhbHVlKTsKKwkJaSArKzsKKwl9Cit9CisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKK1ZPSUQgQVRFX1FBX1N0YXRpc3RpY3MoCisJSU4gUFJUTVBfQURBUFRFUgkJCXBBZCwKKwlJTiBQUlhXSV9TVFJVQwkJCQlwUnhXSSwKKwlJTiBQUlQyOFhYX1JYRF9TVFJVQwkJcFJ4RCwKKwlJTiBQSEVBREVSXzgwMl8xMQkJCXBIZWFkZXIpCit7CisJLy8gdXBkYXRlIGNvdW50ZXIgZmlyc3QKKwlpZiAocEhlYWRlciAhPSBOVUxMKQorCXsKKwkJaWYgKHBIZWFkZXItPkZDLlR5cGUgPT0gQlRZUEVfREFUQSkKKwkJeworCQkJaWYgKHBSeEQtPlUyTSkKKwkJCQlwQWQtPmF0ZS5VMk0rKzsKKwkJCWVsc2UKKwkJCQlwQWQtPmF0ZS5PdGhlckRhdGErKzsKKwkJfQorCQllbHNlIGlmIChwSGVhZGVyLT5GQy5UeXBlID09IEJUWVBFX01HTVQpCisJCXsKKwkJCWlmIChwSGVhZGVyLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfQkVBQ09OKQorCQkJCXBBZC0+YXRlLkJlYWNvbisrOworCQkJZWxzZQorCQkJCXBBZC0+YXRlLk90aGVyQ291bnQrKzsKKwkJfQorCQllbHNlIGlmIChwSGVhZGVyLT5GQy5UeXBlID09IEJUWVBFX0NOVEwpCisJCXsKKwkJCXBBZC0+YXRlLk90aGVyQ291bnQrKzsKKwkJfQorCX0KKwlwQWQtPmF0ZS5SU1NJMCA9IHBSeFdJLT5SU1NJMDsKKwlwQWQtPmF0ZS5SU1NJMSA9IHBSeFdJLT5SU1NJMTsKKwlwQWQtPmF0ZS5SU1NJMiA9IHBSeFdJLT5SU1NJMjsKKwlwQWQtPmF0ZS5TTlIwID0gcFJ4V0ktPlNOUjA7CisJcEFkLT5hdGUuU05SMSA9IHBSeFdJLT5TTlIxOworfQorCisvKiBjb21tYW5kIGlkIHdpdGggQ21kIFR5cGUgPT0gMHgwMDA4KGZvciAyOHh4KS8weDAwMDUoZm9yIGlOSUMpICovCisjZGVmaW5lIFJBQ0ZHX0NNRF9SRl9XUklURV9BTEwJCTB4MDAwMAorI2RlZmluZSBSQUNGR19DTURfRTJQUk9NX1JFQUQxNgkJMHgwMDAxCisjZGVmaW5lIFJBQ0ZHX0NNRF9FMlBST01fV1JJVEUxNgkweDAwMDIKKyNkZWZpbmUgUkFDRkdfQ01EX0UyUFJPTV9SRUFEX0FMTAkweDAwMDMKKyNkZWZpbmUgUkFDRkdfQ01EX0UyUFJPTV9XUklURV9BTEwJMHgwMDA0CisjZGVmaW5lIFJBQ0ZHX0NNRF9JT19SRUFECQkJMHgwMDA1CisjZGVmaW5lIFJBQ0ZHX0NNRF9JT19XUklURQkJCTB4MDAwNgorI2RlZmluZSBSQUNGR19DTURfSU9fUkVBRF9CVUxLCQkweDAwMDcKKyNkZWZpbmUgUkFDRkdfQ01EX0JCUF9SRUFEOAkJCTB4MDAwOAorI2RlZmluZSBSQUNGR19DTURfQkJQX1dSSVRFOAkJMHgwMDA5CisjZGVmaW5lIFJBQ0ZHX0NNRF9CQlBfUkVBRF9BTEwJCTB4MDAwYQorI2RlZmluZSBSQUNGR19DTURfR0VUX0NPVU5URVIJCTB4MDAwYgorI2RlZmluZSBSQUNGR19DTURfQ0xFQVJfQ09VTlRFUgkJMHgwMDBjCisKKyNkZWZpbmUgUkFDRkdfQ01EX1JTVjEJCQkJMHgwMDBkCisjZGVmaW5lIFJBQ0ZHX0NNRF9SU1YyCQkJCTB4MDAwZQorI2RlZmluZSBSQUNGR19DTURfUlNWMwkJCQkweDAwMGYKKworI2RlZmluZSBSQUNGR19DTURfVFhfU1RBUlQJCQkweDAwMTAKKyNkZWZpbmUgUkFDRkdfQ01EX0dFVF9UWF9TVEFUVVMJCTB4MDAxMQorI2RlZmluZSBSQUNGR19DTURfVFhfU1RPUAkJCTB4MDAxMgorI2RlZmluZSBSQUNGR19DTURfUlhfU1RBUlQJCQkweDAwMTMKKyNkZWZpbmUgUkFDRkdfQ01EX1JYX1NUT1AJCQkweDAwMTQKKyNkZWZpbmUgUkFDRkdfQ01EX0dFVF9OT0lTRV9MRVZFTAkweDAwMTUKKworI2RlZmluZSBSQUNGR19DTURfQVRFX1NUQVJUCQkJMHgwMDgwCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU1RPUAkJCTB4MDA4MQorCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ0FSUklFUgkJMHgwMTAwCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ09OVAkJCTB4MDEwMQorI2RlZmluZSBSQUNGR19DTURfQVRFX1NUQVJUX1RYX0ZSQU1FCQkweDAxMDIKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfQlcJICAgICAgICAgICAgMHgwMTAzCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMAkgICAgICAgIDB4MDEwNAorI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9UWF9QT1dFUjEJCQkweDAxMDUKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfRlJFUV9PRkZTRVQJCTB4MDEwNgorI2RlZmluZSBSQUNGR19DTURfQVRFX0dFVF9TVEFUSVNUSUNTCQkweDAxMDcKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9SRVNFVF9DT1VOVEVSCQkJMHgwMTA4CisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VMX1RYX0FOVEVOTkEJCTB4MDEwOQorI2RlZmluZSBSQUNGR19DTURfQVRFX1NFTF9SWF9BTlRFTk5BCQkweDAxMGEKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfUFJFQU1CTEUJCQkweDAxMGIKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfQ0hBTk5FTAkJCTB4MDEwYworI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9BRERSMQkJCQkweDAxMGQKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfQUREUjIJCQkJMHgwMTBlCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIzCQkJCTB4MDEwZgorI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9SQVRFCQkJCTB4MDExMAorI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9MRU4JCTB4MDExMQorI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9DT1VOVAkweDAxMTIKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TVEFSVF9SWF9GUkFNRQkJMHgwMTEzCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfRTJQUk9NX1JFQURfQlVMSwkweDAxMTQKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9FMlBST01fV1JJVEVfQlVMSwkweDAxMTUKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9JT19XUklURV9CVUxLCQkweDAxMTYKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9CQlBfUkVBRF9CVUxLCQkweDAxMTcKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9CQlBfV1JJVEVfQlVMSwkweDAxMTgKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9SRl9SRUFEX0JVTEsJCTB4MDExOQorI2RlZmluZSBSQUNGR19DTURfQVRFX1JGX1dSSVRFX0JVTEsJCTB4MDExYQorCisKKworI2RlZmluZSBBMkhleChfWCwgX3ApIAkJCQlcCit7CQkJCQkJCQkJXAorCVVDSEFSICpwOwkJCQkJCVwKKwlfWCA9IDA7CQkJCQkJCVwKKwlwID0gX3A7CQkJCQkJCVwKKwl3aGlsZSAoKCgqcCA+PSAnYScpICYmICgqcCA8PSAnZicpKSB8fCAoKCpwID49ICdBJykgJiYgKCpwIDw9ICdGJykpIHx8ICgoKnAgPj0gJzAnKSAmJiAoKnAgPD0gJzknKSkpCQlcCisJewkJCQkJCQkJCQkJCVwKKwkJaWYgKCgqcCA+PSAnYScpICYmICgqcCA8PSAnZicpKQkJCQlcCisJCQlfWCA9IF9YICogMTYgKyAqcCAtIDg3OwkJCQkJXAorCQllbHNlIGlmICgoKnAgPj0gJ0EnKSAmJiAoKnAgPD0gJ0YnKSkJCVwKKwkJCV9YID0gX1ggKiAxNiArICpwIC0gNTU7CQkJCQlcCisJCWVsc2UgaWYgKCgqcCA+PSAnMCcpICYmICgqcCA8PSAnOScpKQkJXAorCQkJX1ggPSBfWCAqIDE2ICsgKnAgLSA0ODsJCQkJCVwKKwkJcCsrOwkJCQkJCQkJCQlcCisJfQkJCQkJCQkJCQkJCVwKK30KKworCitzdGF0aWMgVk9JRCBtZW1jcHlfZXhsKFBSVE1QX0FEQVBURVIgcEFkLCBVQ0hBUiAqZHN0LCBVQ0hBUiAqc3JjLCBVTE9ORyBsZW4pOworc3RhdGljIFZPSUQgbWVtY3B5X2V4cyhQUlRNUF9BREFQVEVSIHBBZCwgVUNIQVIgKmRzdCwgVUNIQVIgKnNyYywgVUxPTkcgbGVuKTsKK3N0YXRpYyBWT0lEIFJUTVBfSU9fUkVBRF9CVUxLKFBSVE1QX0FEQVBURVIgcEFkLCBVQ0hBUiAqZHN0LCBVQ0hBUiAqc3JjLCBVSU5UMzIgbGVuKTsKKworI2lmZGVmIFVDT1MKK2ludCBhdGVfY29weV90b191c2VyKAorCUlOIFBVQ0hBUiBwYXlsb2FkLAorCUlOIFBVQ0hBUiBtc2csCisJSU4gSU5UICAgIGxlbikKK3sKKwltZW1tb3ZlKHBheWxvYWQsIG1zZywgbGVuKTsKKwlyZXR1cm4gMDsKK30KKworI3VuZGVmCWNvcHlfdG9fdXNlcgorI2RlZmluZSBjb3B5X3RvX3VzZXIoeCx5LHopIGF0ZV9jb3B5X3RvX3VzZXIoKFBVQ0hBUil4LCAoUFVDSEFSKXksIHopCisjZW5kaWYgLy8gVUNPUyAvLworCisjZGVmaW5lCUxFTl9PRl9BUkcgMTYKKworVk9JRCBSdG1wRG9BdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglzdHJ1Y3QgaXdyZXEJKndycSkKK3sKKwl1bnNpZ25lZCBzaG9ydCBDb21tYW5kX0lkOworCXN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZzsKKwlJTlQJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKworCisKKwlpZigocFJhQ2ZnID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGF0ZV9yYWNmZ2hkciksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCXsKKwkJU3RhdHVzID0gLUVJTlZBTDsKKwkJcmV0dXJuOworCX0KKworCU5kaXNaZXJvTWVtb3J5KHBSYUNmZywgc2l6ZW9mKHN0cnVjdCBhdGVfcmFjZmdoZHIpKTsKKworICAgIGlmIChjb3B5X2Zyb21fdXNlcigoUFVDSEFSKXBSYUNmZywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKwl7CisJCVN0YXR1cyA9IC1FRkFVTFQ7CisJCWtmcmVlKHBSYUNmZyk7CisJCXJldHVybjsKKwl9CisKKworCUNvbW1hbmRfSWQgPSBudG9ocyhwUmFDZmctPmNvbW1hbmRfaWQpOworCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJcbiVzOiBDb21tYW5kX0lkID0gMHglMDR4ICFcbiIsIF9fZnVuY19fLCBDb21tYW5kX0lkKSk7CisKKwlzd2l0Y2ggKENvbW1hbmRfSWQpCisJeworIAkJLy8gV2Ugd2lsbCBnZXQgdGhpcyBjb21tYW5kIHdoZW4gUUEgc3RhcnRzLgorCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU1RBUlQ6CisJCQl7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NUQVJUXG4iKSk7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrIGFzIHNvb24gYXMgd2UgY2FuIHRvIGF2b2lkIFFBIHRpbWVvdXQuCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgid3JxLT51LmRhdGEubGVuZ3RoID0gJWRcbiIsIHdycS0+dS5kYXRhLmxlbmd0aCkpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TVEFSVFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NUQVJUIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJBVEVTVEFSVCIpOworCQkJfQorCQkJYnJlYWs7CisKKyAJCS8vIFdlIHdpbGwgZ2V0IHRoaXMgY29tbWFuZCBlaXRoZXIgUUEgaXMgY2xvc2VkIG9yIGF0ZWQgaXMga2lsbGVkIGJ5IHVzZXIuCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TVE9QOgorCQkJeworI2lmbmRlZiBVQ09TCisJCQkJSU5UMzIgcmV0OworI2VuZGlmIC8vICFVQ09TIC8vCisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU1RPUFxuIikpOworCisJCQkJLy8gRGlzdGluZ3Vpc2ggdGhpcyBjb21tYW5kIGNhbWUgZnJvbSBRQSh2aWEgYXRlZCkKKwkJCQkvLyBvciBhdGUgZGFlbW9uIGFjY29yZGluZyB0byB0aGUgZXhpc3RlbmNlIG9mIHBpZCBpbiBwYXlsb2FkLgorCQkJCS8vIE5vIG5lZWQgdG8gcHJlcGFyZSBmZWVkYmFjayBpZiB0aGlzIGNtZCBjYW1lIGRpcmVjdGx5IGZyb20gYXRlIGRhZW1vbi4KKwkJCQlwUmFDZmctPmxlbmd0aCA9IG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworCQkJCWlmIChwUmFDZmctPmxlbmd0aCA9PSBzaXplb2YocEFkYXB0ZXItPmF0ZS5BdGVQaWQpKQorCQkJCXsKKwkJCQkJLy8gVGhpcyBjb21tYW5kIGNhbWUgZnJvbSBRQS4KKwkJCQkJLy8gR2V0IHRoZSBwaWQgb2YgQVRFIGRhZW1vbi4KKwkJCQkJbWVtY3B5KChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLkF0ZVBpZCwKKwkJCQkJCSgmcFJhQ2ZnLT5kYXRhWzBdKSAtIDIvKiA9PSAmKHBSYUNmZy0+c3RhdHVzKSAqLywKKwkJCQkJCXNpemVvZihwQWRhcHRlci0+YXRlLkF0ZVBpZCkpOworCisJCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sgYXMgc29vbiBhcyB3ZSBjYW4gdG8gYXZvaWQgUUEgdGltZW91dC4KKwkJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKworCQkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ3cnEtPnUuZGF0YS5sZW5ndGggPSAlZFxuIiwgd3JxLT51LmRhdGEubGVuZ3RoKSk7CisKKwkgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisJICAgICAgICAgICAgCXsKKwkgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NUT1BcbiIpKTsKKwkgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisJICAgICAgICAgICAgCX0KKworCQkJCQkvLworCQkJCQkvLyBraWxsIEFURSBkYWVtb24gd2hlbiBsZWF2aW5nIEFURSBtb2RlLgorCQkJCQkvLyBXZSBtdXN0IGtpbGwgQVRFIGRhZW1vbiBmaXJzdCBiZWZvcmUgc2V0dGluZyBBVEVTVE9QLAorCQkJCQkvLyBvciBNaWNyb3NvZnQgd2lsbCByZXBvcnQgc3RoLiB3cm9uZy4KKyNpZm5kZWYgVUNPUworCQkJCQlyZXQgPSBLSUxMX1RIUkVBRF9QSUQocEFkYXB0ZXItPmF0ZS5BdGVQaWQsIFNJR1RFUk0sIDEpOworCQkJCQlpZiAocmV0KQorCQkJCQl7CisJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogdW5hYmxlIHRvIHNpZ25hbCB0aHJlYWRcbiIsIHBBZGFwdGVyLT5uZXRfZGV2LT5uYW1lKSk7CisJCQkJCX0KKyNlbmRpZiAvLyAhVUNPUyAvLworCQkJCX0KKworCQkJCS8vIEFQIG1pZ2h0IGhhdmUgaW4gQVRFX1NUT1AgbW9kZSBkdWUgdG8gY21kIGZyb20gUUEuCisJCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQkJeworCQkJCQkvLyBTb21lb25lIGhhcyBraWxsZWQgYXRlIGRhZW1vbiB3aGlsZSBRQSBHVUkgaXMgc3RpbGwgb3Blbi4KKwkJCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiQVRFU1RPUCIpOworCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVBfU1RBUlQgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfUkZfV1JJVEVfQUxMOgorCQkJeworCQkJCVVJTlQzMiBSMSwgUjIsIFIzLCBSNDsKKwkJCQlVU0hPUlQgY2hhbm5lbDsKKworCQkJCW1lbWNweSgmUjEsIHBSYUNmZy0+ZGF0YS0yLCA0KTsKKwkJCQltZW1jcHkoJlIyLCBwUmFDZmctPmRhdGErMiwgNCk7CisJCQkJbWVtY3B5KCZSMywgcFJhQ2ZnLT5kYXRhKzYsIDQpOworCQkJCW1lbWNweSgmUjQsIHBSYUNmZy0+ZGF0YSsxMCwgNCk7CisJCQkJbWVtY3B5KCZjaGFubmVsLCBwUmFDZmctPmRhdGErMTQsIDIpOworCisJCQkJcEFkYXB0ZXItPkxhdGNoUmZSZWdzLlIxID0gbnRvaGwoUjEpOworCQkJCXBBZGFwdGVyLT5MYXRjaFJmUmVncy5SMiA9IG50b2hsKFIyKTsKKwkJCQlwQWRhcHRlci0+TGF0Y2hSZlJlZ3MuUjMgPSBudG9obChSMyk7CisJCQkJcEFkYXB0ZXItPkxhdGNoUmZSZWdzLlI0ID0gbnRvaGwoUjQpOworCQkJCXBBZGFwdGVyLT5MYXRjaFJmUmVncy5DaGFubmVsID0gbnRvaHMoY2hhbm5lbCk7CisKKwkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkYXB0ZXIsIHBBZGFwdGVyLT5MYXRjaFJmUmVncy5SMSk7CisJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZGFwdGVyLCBwQWRhcHRlci0+TGF0Y2hSZlJlZ3MuUjIpOworCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWRhcHRlciwgcEFkYXB0ZXItPkxhdGNoUmZSZWdzLlIzKTsKKwkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkYXB0ZXIsIHBBZGFwdGVyLT5MYXRjaFJmUmVncy5SNCk7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgid3JxLT51LmRhdGEubGVuZ3RoID0gJWRcbiIsIHdycS0+dS5kYXRhLmxlbmd0aCkpOworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9SRl9XUklURV9BTExcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX1JGX1dSSVRFX0FMTCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisgICAgICAgICAgICBicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9FMlBST01fUkVBRDE2OgorCQkJeworCQkJCVVTSE9SVAlvZmZzZXQsIHZhbHVlLCB0bXA7CisKKwkJCQlvZmZzZXQgPSBudG9ocyhwUmFDZmctPnN0YXR1cyk7CisJCQkJLyogInRtcCIgaXMgZXhwZWNpYWxseSBmb3Igc29tZSBjb21waWxlcnMuLi4gKi8KKwkJCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWRhcHRlciwgb2Zmc2V0LCB0bXApOworCQkJCXZhbHVlID0gdG1wOworCQkJCXZhbHVlID0gaHRvbnModmFsdWUpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJFRVBST00gUmVhZCBvZmZzZXQgPSAweCUwNHgsIHZhbHVlID0gMHglMDR4XG4iLCBvZmZzZXQsIHZhbHVlKSk7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucyg0KTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCW1lbWNweShwUmFDZmctPmRhdGEsICZ2YWx1ZSwgMik7CisKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJzaXplb2Yoc3RydWN0IGF0ZV9yYWNmZ2hkcikgPSAlZFxuIiwgc2l6ZW9mKHN0cnVjdCBhdGVfcmFjZmdoZHIpKSk7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgid3JxLT51LmRhdGEubGVuZ3RoID0gJWRcbiIsIHdycS0+dS5kYXRhLmxlbmd0aCkpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0UyUFJPTV9SRUFEMTZcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0UyUFJPTV9SRUFEMTYgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorICAgICAgICAgICAJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfRTJQUk9NX1dSSVRFMTY6CisJCQl7CisJCQkJVVNIT1JUCW9mZnNldCwgdmFsdWU7CisKKwkJCQlvZmZzZXQgPSBudG9ocyhwUmFDZmctPnN0YXR1cyk7CisJCQkJbWVtY3B5KCZ2YWx1ZSwgcFJhQ2ZnLT5kYXRhLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKwkJCQlSVDI4eHhfRUVQUk9NX1dSSVRFMTYocEFkYXB0ZXIsIG9mZnNldCwgdmFsdWUpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfRTJQUk9NX1dSSVRFMTZcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0UyUFJPTV9XUklURTE2IGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0UyUFJPTV9SRUFEX0FMTDoKKwkJCXsKKwkJCQlVU0hPUlQgYnVmZmVyW0VFUFJPTV9TSVpFLzJdOworCisJCQkJcnRfZWVfcmVhZF9hbGwocEFkYXB0ZXIsKFVTSE9SVCAqKWJ1ZmZlcik7CisJCQkJbWVtY3B5X2V4cyhwQWRhcHRlciwgcFJhQ2ZnLT5kYXRhLCAoVUNIQVIgKilidWZmZXIsIEVFUFJPTV9TSVpFKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIrRUVQUk9NX1NJWkUpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0UyUFJPTV9SRUFEX0FMTFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfRTJQUk9NX1JFQURfQUxMIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0UyUFJPTV9XUklURV9BTEw6CisJCQl7CisJCQkJVVNIT1JUIGJ1ZmZlcltFRVBST01fU0laRS8yXTsKKworCQkJCU5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKWJ1ZmZlciwgRUVQUk9NX1NJWkUpOworCQkJCW1lbWNweV9leHMocEFkYXB0ZXIsIChVQ0hBUiAqKWJ1ZmZlciwgKFVDSEFSICopJnBSYUNmZy0+c3RhdHVzLCBFRVBST01fU0laRSk7CisJCQkJcnRfZWVfd3JpdGVfYWxsKHBBZGFwdGVyLChVU0hPUlQgKilidWZmZXIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfRTJQUk9NX1dSSVRFX0FMTFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSQUNGR19DTURfRTJQUk9NX1dSSVRFX0FMTCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0lPX1JFQUQ6CisJCQl7CisJCQkJVUlOVDMyCW9mZnNldDsKKwkJCQlVSU5UMzIJdmFsdWU7CisKKwkJCQltZW1jcHkoJm9mZnNldCwgJnBSYUNmZy0+c3RhdHVzLCA0KTsKKwkJCQlvZmZzZXQgPSBudG9obChvZmZzZXQpOworCisJCQkJLy8gV2UgZG8gbm90IG5lZWQgdGhlIGJhc2UgYWRkcmVzcy4KKwkJCQkvLyBTbyBqdXN0IGV4dHJhY3QgdGhlIG9mZnNldCBvdXQuCisJCQkJb2Zmc2V0ICY9IDB4MDAwMEZGRkY7CisJCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIG9mZnNldCwgJnZhbHVlKTsKKwkJCQl2YWx1ZSA9IGh0b25sKHZhbHVlKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDYpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJbWVtY3B5KHBSYUNmZy0+ZGF0YSwgJnZhbHVlLCA0KTsKKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9JT19SRUFEXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9JT19SRUFEIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0lPX1dSSVRFOgorCQkJeworCQkJCVVJTlQzMglvZmZzZXQsIHZhbHVlOworCisJCQkJbWVtY3B5KCZvZmZzZXQsIHBSYUNmZy0+ZGF0YS0yLCA0KTsKKwkJCQltZW1jcHkoJnZhbHVlLCBwUmFDZmctPmRhdGErMiwgNCk7CisKKwkJCQlvZmZzZXQgPSBudG9obChvZmZzZXQpOworCisJCQkJLy8gV2UgZG8gbm90IG5lZWQgdGhlIGJhc2UgYWRkcmVzcy4KKwkJCQkvLyBTbyBqdXN0IGV4dHJhY3Qgb3V0IHRoZSBvZmZzZXQuCisJCQkJb2Zmc2V0ICY9IDB4MDAwMEZGRkY7CisJCQkJdmFsdWUgPSBudG9obCh2YWx1ZSk7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfSU9fV1JJVEU6IG9mZnNldCA9ICV4LCB2YWx1ZSA9ICV4XG4iLCBvZmZzZXQsIHZhbHVlKSk7CisJCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBvZmZzZXQsIHZhbHVlKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0lPX1dSSVRFXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9JT19XUklURSBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9JT19SRUFEX0JVTEs6CisJCQl7CisJCQkJVUlOVDMyCW9mZnNldDsKKwkJCQlVU0hPUlQJbGVuOworCisJCQkJbWVtY3B5KCZvZmZzZXQsICZwUmFDZmctPnN0YXR1cywgNCk7CisJCQkJb2Zmc2V0ID0gbnRvaGwob2Zmc2V0KTsKKworCQkJCS8vIFdlIGRvIG5vdCBuZWVkIHRoZSBiYXNlIGFkZHJlc3MuCisJCQkJLy8gU28ganVzdCBleHRyYWN0IHRoZSBvZmZzZXQuCisJCQkJb2Zmc2V0ICY9IDB4MDAwMEZGRkY7CisJCQkJbWVtY3B5KCZsZW4sIHBSYUNmZy0+ZGF0YSsyLCAyKTsKKwkJCQlsZW4gPSBudG9ocyhsZW4pOworCisJCQkJaWYgKGxlbiA+IDM3MSkKKwkJCQl7CisJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgibGVuIGlzIHRvbyBsYXJnZSwgbWFrZSBpdCBzbWFsbGVyXG4iKSk7CisJCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMSk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCVJUTVBfSU9fUkVBRF9CVUxLKHBBZGFwdGVyLCBwUmFDZmctPmRhdGEsIChVQ0hBUiAqKW9mZnNldCwgbGVuKjQpOy8vIHVuaXQgaW4gZm91ciBieXRlcworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMitsZW4qNCk7Ly8gdW5pdCBpbiBmb3VyIGJ5dGVzCisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfSU9fUkVBRF9CVUxLXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9JT19SRUFEX0JVTEsgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQkJQX1JFQUQ4OgorCQkJeworCQkJCVVTSE9SVAlvZmZzZXQ7CisJCQkJVUNIQVIJdmFsdWU7CisKKwkJCQl2YWx1ZSA9IDA7CisJCQkJb2Zmc2V0ID0gbnRvaHMocFJhQ2ZnLT5zdGF0dXMpOworCisJCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQkJeworCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgb2Zmc2V0LCAgJnZhbHVlKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBvZmZzZXQsICAmdmFsdWUpOworCQkJCX0KKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygzKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXBSYUNmZy0+ZGF0YVswXSA9IHZhbHVlOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQlAgdmFsdWUgPSAleFxuIiwgdmFsdWUpKTsKKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9CQlBfUkVBRDhcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0JCUF9SRUFEOCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBSQUNGR19DTURfQkJQX1dSSVRFODoKKwkJCXsKKwkJCQlVU0hPUlQJb2Zmc2V0OworCQkJCVVDSEFSCXZhbHVlOworCisJCQkJb2Zmc2V0ID0gbnRvaHMocFJhQ2ZnLT5zdGF0dXMpOworCQkJCW1lbWNweSgmdmFsdWUsIHBSYUNmZy0+ZGF0YSwgMSk7CisKKwkJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCQl7CisJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgb2Zmc2V0LCAgdmFsdWUpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBvZmZzZXQsICB2YWx1ZSk7CisJCQkJfQorCisJCQkJaWYgKChvZmZzZXQgPT0gQkJQX1IxKSB8fCAob2Zmc2V0ID09IEJCUF9SMykpCisJCQkJeworCQkJCQlTeW5jVHhSeENvbmZpZyhwQWRhcHRlciwgb2Zmc2V0LCB2YWx1ZSk7CisJCQkJfQorCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQkJQX1dSSVRFOFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQkJQX1dSSVRFOCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9CQlBfUkVBRF9BTEw6CisJCQl7CisJCQkJVVNIT1JUIGo7CisKKwkJCQlmb3IgKGogPSAwOyBqIDwgMTM3OyBqKyspCisJCQkJeworCQkJCQlwUmFDZmctPmRhdGFbal0gPSAwOworCisJCQkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJCQl7CisJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgaiwgICZwUmFDZmctPmRhdGFbal0pOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBqLCAgJnBSYUNmZy0+ZGF0YVtqXSk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKzEzNyk7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9CQlBfUkVBRF9BTExcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0JCUF9SRUFEX0FMTCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisKKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9FMlBST01fUkVBRF9CVUxLOgorCQl7CisJCQlVU0hPUlQgb2Zmc2V0OworCQkJVVNIT1JUIGxlbjsKKwkJCVVTSE9SVCBidWZmZXJbRUVQUk9NX1NJWkUvMl07CisKKwkJCW9mZnNldCA9IG50b2hzKHBSYUNmZy0+c3RhdHVzKTsKKwkJCW1lbWNweSgmbGVuLCBwUmFDZmctPmRhdGEsIDIpOworCQkJbGVuID0gbnRvaHMobGVuKTsKKworCQkJcnRfZWVfcmVhZF9hbGwocEFkYXB0ZXIsKFVTSE9SVCAqKWJ1ZmZlcik7CisJCQlpZiAob2Zmc2V0ICsgbGVuIDw9IEVFUFJPTV9TSVpFKQorCQkJCW1lbWNweV9leHMocEFkYXB0ZXIsIHBSYUNmZy0+ZGF0YSwgKFVDSEFSICopYnVmZmVyK29mZnNldCwgbGVuKTsKKwkJCWVsc2UKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJleGNlZWQgRUVQUk9NIHNpemVcbiIpKTsKKworCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyK2xlbik7CisJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICBpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9FMlBST01fUkVBRF9CVUxLXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKwkJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX0UyUFJPTV9SRUFEX0JVTEsgaXMgZG9uZSAhXG4iKSk7CisJCQl9CisKKwkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX0UyUFJPTV9XUklURV9CVUxLOgorCQl7CisJCQlVU0hPUlQgb2Zmc2V0OworCQkJVVNIT1JUIGxlbjsKKwkJCVVTSE9SVCBidWZmZXJbRUVQUk9NX1NJWkUvMl07CisKKwkJCW9mZnNldCA9IG50b2hzKHBSYUNmZy0+c3RhdHVzKTsKKwkJCW1lbWNweSgmbGVuLCBwUmFDZmctPmRhdGEsIDIpOworCQkJbGVuID0gbnRvaHMobGVuKTsKKworCQkJcnRfZWVfcmVhZF9hbGwocEFkYXB0ZXIsKFVTSE9SVCAqKWJ1ZmZlcik7CisJCQltZW1jcHlfZXhzKHBBZGFwdGVyLCAoVUNIQVIgKilidWZmZXIgKyBvZmZzZXQsIChVQ0hBUiAqKXBSYUNmZy0+ZGF0YSArIDIsIGxlbik7CisJCQlydF9lZV93cml0ZV9hbGwocEFkYXB0ZXIsKFVTSE9SVCAqKWJ1ZmZlcik7CisKKwkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX0UyUFJPTV9XUklURV9CVUxLXG4iKSk7CisgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKwkJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSQUNGR19DTURfQVRFX0UyUFJPTV9XUklURV9CVUxLIGlzIGRvbmUgIVxuIikpOworCQkJfQorCisJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9JT19XUklURV9CVUxLOgorCQl7CisJCQlVSU5UMzIgb2Zmc2V0LCBpLCB2YWx1ZTsKKwkJCVVTSE9SVCBsZW47CisKKwkJCW1lbWNweSgmb2Zmc2V0LCAmcFJhQ2ZnLT5zdGF0dXMsIDQpOworCQkJb2Zmc2V0ID0gbnRvaGwob2Zmc2V0KTsKKwkJCW1lbWNweSgmbGVuLCBwUmFDZmctPmRhdGErMiwgMik7CisJCQlsZW4gPSBudG9ocyhsZW4pOworCisJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpCisJCQl7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgKFVDSEFSICopJnZhbHVlLCBwUmFDZmctPmRhdGErNCtpLCA0KTsKKwkJCQlwcmludGsoIldyaXRlICV4ICV4XG4iLCBvZmZzZXQgKyBpLCB2YWx1ZSk7CisJCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCAob2Zmc2V0ICtpKSAmIDB4ZmZmZiwgdmFsdWUpOworCQkJfQorCisJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisgICAgICAgICAgICBpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9JT19XUklURV9CVUxLXG4iKSk7CisgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKwkJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSQUNGR19DTURfQVRFX0lPX1dSSVRFX0JVTEsgaXMgZG9uZSAhXG4iKSk7CisJCQl9CisKKwkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX0JCUF9SRUFEX0JVTEs6CisJCXsKKwkJCVVTSE9SVCBvZmZzZXQ7CisJCQlVU0hPUlQgbGVuOworCQkJVVNIT1JUIGo7CisKKwkJCW9mZnNldCA9IG50b2hzKHBSYUNmZy0+c3RhdHVzKTsKKwkJCW1lbWNweSgmbGVuLCBwUmFDZmctPmRhdGEsIDIpOworCQkJbGVuID0gbnRvaHMobGVuKTsKKworCisJCQlmb3IgKGogPSBvZmZzZXQ7IGogPCAob2Zmc2V0K2xlbik7IGorKykKKwkJCXsKKwkJCQlwUmFDZmctPmRhdGFbaiAtIG9mZnNldF0gPSAwOworCisJCQkJaWYgKHBBZGFwdGVyLT5hdGUuTW9kZSA9PSBBVEVfU1RPUCkKKwkJCQl7CisJCQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgaiwgICZwUmFDZmctPmRhdGFbaiAtIG9mZnNldF0pOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgaiwgICZwUmFDZmctPmRhdGFbaiAtIG9mZnNldF0pOworCQkJCX0KKwkJCX0KKworCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyK2xlbik7CisJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfQkJQX1JFQURfQlVMS1xuIikpOworICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisJCQllbHNlCisJCQl7CisgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9CQlBfUkVBRF9CVUxLIGlzIGRvbmUgIVxuIikpOworCQkJfQorCisJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9CQlBfV1JJVEVfQlVMSzoKKwkJeworCQkJVVNIT1JUIG9mZnNldDsKKwkJCVVTSE9SVCBsZW47CisJCQlVU0hPUlQgajsKKwkJCVVDSEFSICp2YWx1ZTsKKworCQkJb2Zmc2V0ID0gbnRvaHMocFJhQ2ZnLT5zdGF0dXMpOworCQkJbWVtY3B5KCZsZW4sIHBSYUNmZy0+ZGF0YSwgMik7CisJCQlsZW4gPSBudG9ocyhsZW4pOworCisJCQlmb3IgKGogPSBvZmZzZXQ7IGogPCAob2Zmc2V0K2xlbik7IGorKykKKwkJCXsKKwkJCQl2YWx1ZSA9IHBSYUNmZy0+ZGF0YSArIDIgKyAoaiAtIG9mZnNldCk7CisJCQkJaWYgKHBBZGFwdGVyLT5hdGUuTW9kZSA9PSBBVEVfU1RPUCkKKwkJCQl7CisJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGosICAqdmFsdWUpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGosICAqdmFsdWUpOworCQkJCX0KKwkJCX0KKworCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICBpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9CQlBfV1JJVEVfQlVMS1xuIikpOworICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisJCQllbHNlCisJCQl7CisgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9CQlBfV1JJVEVfQlVMSyBpcyBkb25lICFcbiIpKTsKKwkJCX0KKwkJfQorCQkJYnJlYWs7CisKKyNpZmRlZiBDT05GSUdfUkFMSU5LX1JUMzA1MgorCQljYXNlIFJBQ0ZHX0NNRF9BVEVfUkZfUkVBRF9CVUxLOgorCQl7CisJCQlVU0hPUlQgb2Zmc2V0OworCQkJVVNIT1JUIGxlbjsKKwkJCVVTSE9SVCBqOworCisJCQlvZmZzZXQgPSBudG9ocyhwUmFDZmctPnN0YXR1cyk7CisJCQltZW1jcHkoJmxlbiwgcFJhQ2ZnLT5kYXRhLCAyKTsKKwkJCWxlbiA9IG50b2hzKGxlbik7CisKKwkJCWZvciAoaiA9IG9mZnNldDsgaiA8IChvZmZzZXQrbGVuKTsgaisrKQorCQkJeworCQkJCXBSYUNmZy0+ZGF0YVtqIC0gb2Zmc2V0XSA9IDA7CisJCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkYXB0ZXIsIGosICAmcFJhQ2ZnLT5kYXRhW2ogLSBvZmZzZXRdKTsKKwkJCX0KKworCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyK2xlbik7CisJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfUkZfUkVBRF9CVUxLXG4iKSk7CisgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKwkJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1JGX1JFQURfQlVMSyBpcyBkb25lICFcbiIpKTsKKwkJCX0KKworCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfUkZfV1JJVEVfQlVMSzoKKwkJeworCQkJVVNIT1JUIG9mZnNldDsKKwkJCVVTSE9SVCBsZW47CisJCQlVU0hPUlQgajsKKwkJCVVDSEFSICp2YWx1ZTsKKworCQkJb2Zmc2V0ID0gbnRvaHMocFJhQ2ZnLT5zdGF0dXMpOworCQkJbWVtY3B5KCZsZW4sIHBSYUNmZy0+ZGF0YSwgMik7CisJCQlsZW4gPSBudG9ocyhsZW4pOworCisJCQlmb3IgKGogPSBvZmZzZXQ7IGogPCAob2Zmc2V0K2xlbik7IGorKykKKwkJCXsKKwkJCQl2YWx1ZSA9IHBSYUNmZy0+ZGF0YSArIDIgKyAoaiAtIG9mZnNldCk7CisJCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZGFwdGVyLCBqLCAgKnZhbHVlKTsKKwkJCX0KKworCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICBpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9SRl9XUklURV9CVUxLXG4iKSk7CisgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKwkJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1JGX1dSSVRFX0JVTEsgaXMgZG9uZSAhXG4iKSk7CisJCQl9CisKKwkJfQorCQkJYnJlYWs7CisjZW5kaWYKKworCisJCWNhc2UgUkFDRkdfQ01EX0dFVF9OT0lTRV9MRVZFTDoKKwkJCXsKKwkJCQlVQ0hBUgljaGFubmVsOworCQkJCUlOVDMyICAgYnVmZmVyWzNdWzEwXTsvKiAzIDogUnhQYXRoIDsgMTAgOiBuby4gb2YgcGVyIHJzc2kgc2FtcGxlcyAqLworCisJCQkJY2hhbm5lbCA9IChudG9ocyhwUmFDZmctPnN0YXR1cykgJiAweDAwRkYpOworCQkJCUNhbE5vaXNlTGV2ZWwocEFkYXB0ZXIsIGNoYW5uZWwsIGJ1ZmZlcik7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgKFVDSEFSICopcFJhQ2ZnLT5kYXRhLCAoVUNIQVIgKikmKGJ1ZmZlclswXVswXSksIChzaXplb2YoSU5UMzIpKjMqMTApKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIgKyAoc2l6ZW9mKElOVDMyKSozKjEwKSk7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfR0VUX05PSVNFX0xFVkVMXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9HRVRfTk9JU0VfTEVWRUwgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfR0VUX0NPVU5URVI6CisJCQl7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVswXSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuVTJNLCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzRdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5PdGhlckRhdGEsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbOF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLkJlYWNvbiwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVsxMl0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLk90aGVyQ291bnQsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMTZdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5UeEFjMCwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVsyMF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlR4QWMxLCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzI0XSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuVHhBYzIsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMjhdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5UeEFjMywgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVszMl0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlR4SENDQSwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVszNl0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlR4TWdtdCwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs0MF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlJTU0kwLCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzQ0XSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuUlNTSTEsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNDhdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5SU1NJMiwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs1Ml0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlNOUjAsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNTZdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5TTlIxLCA0KTsKKworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMis2MCk7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfR0VUX0NPVU5URVJcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0dFVF9DT1VOVEVSIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0NMRUFSX0NPVU5URVI6CisJCQl7CisJCQkJcEFkYXB0ZXItPmF0ZS5VMk0gPSAwOworCQkJCXBBZGFwdGVyLT5hdGUuT3RoZXJEYXRhID0gMDsKKwkJCQlwQWRhcHRlci0+YXRlLkJlYWNvbiA9IDA7CisJCQkJcEFkYXB0ZXItPmF0ZS5PdGhlckNvdW50ID0gMDsKKwkJCQlwQWRhcHRlci0+YXRlLlR4QWMwID0gMDsKKwkJCQlwQWRhcHRlci0+YXRlLlR4QWMxID0gMDsKKwkJCQlwQWRhcHRlci0+YXRlLlR4QWMyID0gMDsKKwkJCQlwQWRhcHRlci0+YXRlLlR4QWMzID0gMDsKKwkJCQlwQWRhcHRlci0+YXRlLlR4SENDQSA9IDA7CisJCQkJcEFkYXB0ZXItPmF0ZS5UeE1nbXQgPSAwOworCQkJCXBBZGFwdGVyLT5hdGUuVHhEb25lQ291bnQgPSAwOworCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0NMRUFSX0NPVU5URVJcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0NMRUFSX0NPVU5URVIgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9UWF9TVEFSVDoKKwkJCXsKKwkJCQlVU0hPUlQgKnA7CisJCQkJVVNIT1JUCWVyciA9IDE7CisJCQkJVUNIQVIgICBCYnAyMlZhbHVlID0gMCwgQmJwMjRWYWx1ZSA9IDA7CisKKwkJCQlpZiAoKHBBZGFwdGVyLT5hdGUuVHhTdGF0dXMgIT0gMCkgJiYgKHBBZGFwdGVyLT5hdGUuTW9kZSAmIEFURV9UWEZSQU1FKSkKKwkJCQl7CisJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQXRlIFR4IGlzIGFscmVhZHkgcnVubmluZywgdG8gcnVuIG5leHQgVHgsIHlvdSBtdXN0IHN0b3AgaXQgZmlyc3RcbiIpKTsKKwkJCQkJZXJyID0gMjsKKwkJCQkJZ290byBUWF9TVEFSVF9FUlJPUjsKKwkJCQl9CisJCQkJZWxzZSBpZiAoKHBBZGFwdGVyLT5hdGUuVHhTdGF0dXMgIT0gMCkgJiYgIShwQWRhcHRlci0+YXRlLk1vZGUgJiBBVEVfVFhGUkFNRSkpCisJCQkJeworCQkJCQlpbnQgaSA9IDA7CisKKwkJCQkJd2hpbGUgKChpKysgPCAxMCkgJiYgKHBBZGFwdGVyLT5hdGUuVHhTdGF0dXMgIT0gMCkpCisJCQkJCXsKKwkJCQkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisJCQkJCX0KKworCQkJCQkvLyBmb3JjZSBpdCB0byBzdG9wCisJCQkJCXBBZGFwdGVyLT5hdGUuVHhTdGF0dXMgPSAwOworCQkJCQlwQWRhcHRlci0+YXRlLlR4RG9uZUNvdW50ID0gMDsKKwkJCQkJLy9wQWRhcHRlci0+YXRlLlJlcGVhdCA9IDA7CisJCQkJCXBBZGFwdGVyLT5hdGUuYlFBVHhTdGFydCA9IEZBTFNFOworCQkJCX0KKworCQkJCS8vIElmIHBSYUNmZy0+bGVuZ3RoID09IDAsIHRoaXMgIlJBQ0ZHX0NNRF9UWF9TVEFSVCIgaXMgZm9yIENhcnJpZXIgdGVzdCBvciBDYXJyaWVyIFN1cHByZXNzaW9uLgorCQkJCWlmIChudG9ocyhwUmFDZmctPmxlbmd0aCkgIT0gMCkKKwkJCQl7CisJCQkJCS8vIEdldCBmcmFtZSBpbmZvCisKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZGFwdGVyLT5hdGUuVHhXSSwgcFJhQ2ZnLT5kYXRhICsgMiwgMTYpOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCQkJUlRNUFdJRW5kaWFuQ2hhbmdlKChQVUNIQVIpJnBBZGFwdGVyLT5hdGUuVHhXSSwgVFlQRV9UWFdJKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZGFwdGVyLT5hdGUuVHhDb3VudCwgcFJhQ2ZnLT5kYXRhICsgMTgsIDQpOworCQkJCQlwQWRhcHRlci0+YXRlLlR4Q291bnQgPSBudG9obChwQWRhcHRlci0+YXRlLlR4Q291bnQpOworCisJCQkJCXAgPSAoVVNIT1JUICopKCZwUmFDZmctPmRhdGFbMjJdKTsKKwkJCQkJLy9wID0gcFJhQ2ZnLT5kYXRhICsgMjI7CisJCQkJCS8vIGFsd2F5cyB1c2UgUUlEX0FDX0JFCisJCQkJCXBBZGFwdGVyLT5hdGUuUUlEID0gMDsKKwkJCQkJcCA9IChVU0hPUlQgKikoJnBSYUNmZy0+ZGF0YVsyNF0pOworCQkJCQkvL3AgPSBwUmFDZmctPmRhdGEgKyAyNDsKKwkJCQkJcEFkYXB0ZXItPmF0ZS5ITGVuID0gbnRvaHMoKnApOworCisJCQkJCWlmIChwQWRhcHRlci0+YXRlLkhMZW4gPiAzMikKKwkJCQkJeworCQkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJwQWRhcHRlci0+YXRlLkhMZW4gPiAzMlxuIikpOworCQkJCQkJZXJyID0gMzsKKwkJCQkJCWdvdG8gVFhfU1RBUlRfRVJST1I7CisJCQkJCX0KKworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPmF0ZS5IZWFkZXIsIHBSYUNmZy0+ZGF0YSArIDI2LCBwQWRhcHRlci0+YXRlLkhMZW4pOworCisKKwkJCQkJcEFkYXB0ZXItPmF0ZS5QTGVuID0gbnRvaHMocFJhQ2ZnLT5sZW5ndGgpIC0gKHBBZGFwdGVyLT5hdGUuSExlbiArIDI4KTsKKworCQkJCQlpZiAocEFkYXB0ZXItPmF0ZS5QTGVuID4gMzIpCisJCQkJCXsKKwkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgicEFkYXB0ZXItPmF0ZS5QTGVuID4gMzJcbiIpKTsKKwkJCQkJCWVyciA9IDQ7CisJCQkJCQlnb3RvIFRYX1NUQVJUX0VSUk9SOworCQkJCQl9CisKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZGFwdGVyLT5hdGUuUGF0dGVybiwgcFJhQ2ZnLT5kYXRhICsgMjYgKyBwQWRhcHRlci0+YXRlLkhMZW4sIHBBZGFwdGVyLT5hdGUuUExlbik7CisJCQkJCXBBZGFwdGVyLT5hdGUuRExlbiA9IHBBZGFwdGVyLT5hdGUuVHhXSS5NUERVdG90YWxCeXRlQ291bnQgLSBwQWRhcHRlci0+YXRlLkhMZW47CisJCQkJfQorCisJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SMjIsICZCYnAyMlZhbHVlKTsKKworCQkJCXN3aXRjaCAoQmJwMjJWYWx1ZSkKKwkJCQl7CisJCQkJCWNhc2UgQkJQMjJfVFhGUkFNRToKKwkJCQkJCXsKKwkJCQkJCQlpZiAocEFkYXB0ZXItPmF0ZS5UeENvdW50ID09IDApCisJCQkJCQkJeworI2lmZGVmIFJUMjg2MAorCQkJCQkJCQlwQWRhcHRlci0+YXRlLlR4Q291bnQgPSAweEZGRkZGRkZGOworI2VuZGlmIC8vIFJUMjg2MCAvLworCQkJCQkJCX0KKwkJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNUQVJUIFRYRlJBTUVcbiIpKTsKKwkJCQkJCQlwQWRhcHRlci0+YXRlLmJRQVR4U3RhcnQgPSBUUlVFOworCQkJCQkJCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIlRYRlJBTUUiKTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgQkJQMjJfVFhDT05UX09SX0NBUlJTVVBQOgorCQkJCQkJeworCQkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkJQMjJfVFhDT05UX09SX0NBUlJTVVBQXG4iKSk7CisJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIDI0LCAmQmJwMjRWYWx1ZSk7CisKKwkJCQkJCQlzd2l0Y2ggKEJicDI0VmFsdWUpCisJCQkJCQkJeworCQkJCQkJCQljYXNlIEJCUDI0X1RYQ09OVDoKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNUQVJUIFRYQ09OVFxuIikpOworCQkJCQkJCQkJCXBBZGFwdGVyLT5hdGUuYlFBVHhTdGFydCA9IFRSVUU7CisJCQkJCQkJCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiVFhDT05UIik7CisJCQkJCQkJCQl9CisJCQkJCQkJCQlicmVhazsKKworCQkJCQkJCQljYXNlIEJCUDI0X0NBUlJTVVBQOgorCQkJCQkJCQkJeworCQkJCQkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU1RBUlQgVFhDQVJSU1VQUFxuIikpOworCQkJCQkJCQkJCXBBZGFwdGVyLT5hdGUuYlFBVHhTdGFydCA9IFRSVUU7CisJCQkJCQkJCQkJcEFkYXB0ZXItPmF0ZS5Nb2RlIHw9IEFURV9UWENBUlJTVVBQOworCQkJCQkJCQkJfQorCQkJCQkJCQkJYnJlYWs7CisKKwkJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlVua25vd24gU3RhcnQgVFggc3VidHlwZSAhIikpOworCQkJCQkJCQkJfQorCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBCQlAyMl9UWENBUlI6CisJCQkJCQl7CisJCQkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTVEFSVCBUWENBUlJcbiIpKTsKKwkJCQkJCQlwQWRhcHRlci0+YXRlLmJRQVR4U3RhcnQgPSBUUlVFOworCQkJCQkJCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIlRYQ0FSUiIpOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCXsKKwkJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlVua25vd24gU3RhcnQgVFggc3VidHlwZSAhIikpOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJaWYgKHBBZGFwdGVyLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKQorCQkJCXsKKwkJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCisJCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisJICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorCSAgICAgICAgICAgIAl7CisJICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSB3YXMgZmFpbGVkIGluIGNhc2UgUkFDRkdfQ01EX1RYX1NUQVJUXG4iKSk7CisJICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworCSAgICAgICAgICAgIAl9CisJCQkJCWVsc2UKKwkJCQkJeworCSAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX1RYX1NUQVJUIGlzIGRvbmUgIVxuIikpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKworVFhfU1RBUlRfRVJST1I6CisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucyhlcnIpOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9UWF9TVEFSVFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJmZWVkYmFjayBvZiBUWF9TVEFSVF9FUlJPUiBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9HRVRfVFhfU1RBVFVTOgorCQkJeworCQkJCVVJTlQzMiBjb3VudDsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDYpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJY291bnQgPSBodG9ubChwQWRhcHRlci0+YXRlLlR4RG9uZUNvdW50KTsKKwkJCQlOZGlzTW92ZU1lbW9yeShwUmFDZmctPmRhdGEsICZjb3VudCwgNCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0dFVF9UWF9TVEFUVVNcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0dFVF9UWF9TVEFUVVMgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfVFhfU1RPUDoKKwkJCXsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9UWF9TVE9QXG4iKSk7CisKKwkJCQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJUWFNUT1AiKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX1RYX1NUT1BcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX1RYX1NUT1AgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfUlhfU1RBUlQ6CisJCQl7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfUlhfU1RBUlRcbiIpKTsKKworCQkJCXBBZGFwdGVyLT5hdGUuYlFBUnhTdGFydCA9IFRSVUU7CisJCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiUlhGUkFNRSIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfUlhfU1RBUlRcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX1JYX1NUQVJUIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX1JYX1NUT1A6CisJCQl7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfUlhfU1RPUFxuIikpOworCisJCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiUlhTVE9QIik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9SWF9TVE9QXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9SWF9TVE9QIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCS8qIFRoZSBmb2xsb3dpbmcgY2FzZXMgYXJlIGZvciBuZXcgQVRFIEdVSShub3QgUUEpLiAqLworCQkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwkJY2FzZSBSQUNGR19DTURfQVRFX1NUQVJUX1RYX0NBUlJJRVI6CisJCQl7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NUQVJUX1RYX0NBUlJJRVJcbiIpKTsKKworCQkJCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIlRYQ0FSUiIpOworCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgid3JxLT51LmRhdGEubGVuZ3RoID0gJWRcbiIsIHdycS0+dS5kYXRhLmxlbmd0aCkpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DQVJSSUVSXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ0FSUklFUiBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ09OVDoKKwkJCXsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ09OVFxuIikpOworCisJCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiVFhDT05UIik7CisKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ3cnEtPnUuZGF0YS5sZW5ndGggPSAlZFxuIiwgd3JxLT51LmRhdGEubGVuZ3RoKSk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NUQVJUX1RYX0NPTlRcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DT05UIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9GUkFNRToKKwkJCXsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfRlJBTUVcbiIpKTsKKworCQkJCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIlRYRlJBTUUiKTsKKworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIndycS0+dS5kYXRhLmxlbmd0aCA9ICVkXG4iLCB3cnEtPnUuZGF0YS5sZW5ndGgpKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfRlJBTUVcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9GUkFNRSBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX0JXOgorCQkJeworCQkJCVNIT1JUICAgIHZhbHVlID0gMDsKKwkJCQlVQ0hBUiAgICBzdHJbTEVOX09GX0FSR107CisKKwkJCQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9CV1xuIikpOworCisJCQkJbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKwkJCQlzcHJpbnRmKChQQ0hBUilzdHIsICIlZCIsIHZhbHVlKTsKKworCQkJCVNldF9BVEVfVFhfQldfUHJvYyhwQWRhcHRlciwgc3RyKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TRVRfQldcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRVRfQlcgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9UWF9QT1dFUjA6CisJCQl7CisJCQkJU0hPUlQgICAgdmFsdWUgPSAwOworCQkJCVVDSEFSICAgIHN0cltMRU5fT0ZfQVJHXTsKKworCQkJCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMFxuIikpOworCisJCQkJbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKwkJCQlzcHJpbnRmKChQQ0hBUilzdHIsICIlZCIsIHZhbHVlKTsKKwkJCQlTZXRfQVRFX1RYX1BPV0VSMF9Qcm9jKHBBZGFwdGVyLCBzdHIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFVF9UWF9QT1dFUjBcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIwIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIxOgorCQkJeworCQkJCVNIT1JUICAgIHZhbHVlID0gMDsKKwkJCQlVQ0hBUiAgICBzdHJbTEVOX09GX0FSR107CisKKwkJCQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9UWF9QT1dFUjFcbiIpKTsKKworCQkJCW1lbWNweSgoUFVDSEFSKSZ2YWx1ZSwgKFBVQ0hBUikmKHBSYUNmZy0+c3RhdHVzKSwgMik7CisJCQkJdmFsdWUgPSBudG9ocyh2YWx1ZSk7CisJCQkJc3ByaW50ZigoUENIQVIpc3RyLCAiJWQiLCB2YWx1ZSk7CisJCQkJU2V0X0FURV9UWF9QT1dFUjFfUHJvYyhwQWRhcHRlciwgc3RyKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIxXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMSBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX0ZSRVFfT0ZGU0VUOgorCQkJeworCQkJCVNIT1JUICAgIHZhbHVlID0gMDsKKwkJCQlVQ0hBUiAgICBzdHJbTEVOX09GX0FSR107CisKKwkJCQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9GUkVRX09GRlNFVFxuIikpOworCisJCQkJbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKwkJCQlzcHJpbnRmKChQQ0hBUilzdHIsICIlZCIsIHZhbHVlKTsKKwkJCQlTZXRfQVRFX1RYX0ZSRVFPRkZTRVRfUHJvYyhwQWRhcHRlciwgc3RyKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TRVRfRlJFUV9PRkZTRVRcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRVRfRlJFUV9PRkZTRVQgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX0dFVF9TVEFUSVNUSUNTOgorCQkJeworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9HRVRfU1RBVElTVElDU1xuIikpOworCisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVswXSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuVHhEb25lQ291bnQsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQudS5Mb3dQYXJ0LCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzhdLCAoVUNIQVIgKikmcEFkYXB0ZXItPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC51Lkxvd1BhcnQsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMTJdLCAoVUNIQVIgKikmcEFkYXB0ZXItPldsYW5Db3VudGVycy5SVFNTdWNjZXNzQ291bnQudS5Mb3dQYXJ0LCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzE2XSwgKFVDSEFSICopJnBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUlRTRmFpbHVyZUNvdW50LnUuTG93UGFydCwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVsyMF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJlY2VpdmVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVsyNF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQudS5Mb3dQYXJ0LCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzI4XSwgKFVDSEFSICopJnBBZGFwdGVyLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlciwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVszMl0sIChVQ0hBUiAqKSZwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkZyYW1lRHVwbGljYXRlQ291bnQudS5Mb3dQYXJ0LCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzM2XSwgKFVDSEFSICopJnBBZGFwdGVyLT5SYWxpbmtDb3VudGVycy5PbmVTZWNGYWxzZUNDQUNudCwgNCk7CisKKwkJCQlpZiAocEFkYXB0ZXItPmF0ZS5SeEFudGVubmFTZWwgPT0gMCkKKwkJCQl7CisJCQkJCUlOVDMyIFJTU0kwID0gMDsKKwkJCQkJSU5UMzIgUlNTSTEgPSAwOworCQkJCQlJTlQzMiBSU1NJMiA9IDA7CisKKwkJCQkJUlNTSTAgPSAoSU5UMzIpKHBBZGFwdGVyLT5hdGUuTGFzdFJzc2kwIC0gcEFkYXB0ZXItPkJicFJzc2lUb0RibURlbHRhKTsKKwkJCQkJUlNTSTEgPSAoSU5UMzIpKHBBZGFwdGVyLT5hdGUuTGFzdFJzc2kxIC0gcEFkYXB0ZXItPkJicFJzc2lUb0RibURlbHRhKTsKKwkJCQkJUlNTSTIgPSAoSU5UMzIpKHBBZGFwdGVyLT5hdGUuTGFzdFJzc2kyIC0gcEFkYXB0ZXItPkJicFJzc2lUb0RibURlbHRhKTsKKwkJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs0MF0sIChVQ0hBUiAqKSZSU1NJMCwgNCk7CisJCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNDRdLCAoVUNIQVIgKikmUlNTSTEsIDQpOworCQkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzQ4XSwgKFVDSEFSICopJlJTU0kyLCA0KTsKKwkJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKzUyKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJSU5UMzIgUlNTSTAgPSAwOworCisJCQkJCVJTU0kwID0gKElOVDMyKShwQWRhcHRlci0+YXRlLkxhc3RSc3NpMCAtIHBBZGFwdGVyLT5CYnBSc3NpVG9EYm1EZWx0YSk7CisJCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNDBdLCAoVUNIQVIgKikmUlNTSTAsIDQpOworCQkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIrNDQpOworCQkJCX0KKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfR0VUX1NUQVRJU1RJQ1NcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9HRVRfU1RBVElTVElDUyBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfUkVTRVRfQ09VTlRFUjoKKwkJCXsKKwkJCQlTSE9SVCAgICB2YWx1ZSA9IDE7CisJCQkJVUNIQVIgICAgc3RyW0xFTl9PRl9BUkddOworCisJCQkJTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9SRVNFVF9DT1VOVEVSXG4iKSk7CisKKwkJCQlzcHJpbnRmKChQQ0hBUilzdHIsICIlZCIsIHZhbHVlKTsKKwkJCQlTZXRfUmVzZXRTdGF0Q291bnRlcl9Qcm9jKHBBZGFwdGVyLCBzdHIpOworCisJCQkJcEFkYXB0ZXItPmF0ZS5UeERvbmVDb3VudCA9IDA7CisKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1JFU0VUX0NPVU5URVJcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9SRVNFVF9DT1VOVEVSIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKworCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFTF9UWF9BTlRFTk5BOgorCQkJeworCQkJCVNIT1JUICAgIHZhbHVlID0gMDsKKwkJCQlVQ0hBUiAgICBzdHJbTEVOX09GX0FSR107CisKKwkJCQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFTF9UWF9BTlRFTk5BXG4iKSk7CisKKwkJCQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOworCQkJCXZhbHVlID0gbnRvaHModmFsdWUpOworCQkJCXNwcmludGYoKFBDSEFSKXN0ciwgIiVkIiwgdmFsdWUpOworCQkJCVNldF9BVEVfVFhfQW50ZW5uYV9Qcm9jKHBBZGFwdGVyLCBzdHIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFTF9UWF9BTlRFTk5BXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU0VMX1RYX0FOVEVOTkEgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFTF9SWF9BTlRFTk5BOgorCQkJeworCQkJCVNIT1JUICAgIHZhbHVlID0gMDsKKwkJCQlVQ0hBUiAgICBzdHJbTEVOX09GX0FSR107CisKKwkJCQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFTF9SWF9BTlRFTk5BXG4iKSk7CisKKwkJCQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOworCQkJCXZhbHVlID0gbnRvaHModmFsdWUpOworCQkJCXNwcmludGYoKFBDSEFSKXN0ciwgIiVkIiwgdmFsdWUpOworCQkJCVNldF9BVEVfUlhfQW50ZW5uYV9Qcm9jKHBBZGFwdGVyLCBzdHIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFTF9SWF9BTlRFTk5BXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU0VMX1JYX0FOVEVOTkEgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9QUkVBTUJMRToKKwkJCXsKKwkJCQlTSE9SVCAgICB2YWx1ZSA9IDA7CisJCQkJVUNIQVIgICAgc3RyW0xFTl9PRl9BUkddOworCisJCQkJTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfUFJFQU1CTEVcbiIpKTsKKworCQkJCW1lbWNweSgoUFVDSEFSKSZ2YWx1ZSwgKFBVQ0hBUikmKHBSYUNmZy0+c3RhdHVzKSwgMik7CisJCQkJdmFsdWUgPSBudG9ocyh2YWx1ZSk7CisJCQkJc3ByaW50ZigoUENIQVIpc3RyLCAiJWQiLCB2YWx1ZSk7CisJCQkJU2V0X0FURV9UWF9NT0RFX1Byb2MocEFkYXB0ZXIsIHN0cik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX1BSRUFNQkxFXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU0VUX1BSRUFNQkxFIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfQ0hBTk5FTDoKKwkJCXsKKwkJCQlTSE9SVCAgICB2YWx1ZSA9IDA7CisJCQkJVUNIQVIgICAgc3RyW0xFTl9PRl9BUkddOworCisJCQkJTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfQ0hBTk5FTFxuIikpOworCisJCQkJbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKwkJCQlzcHJpbnRmKChQQ0hBUilzdHIsICIlZCIsIHZhbHVlKTsKKwkJCQlTZXRfQVRFX0NIQU5ORUxfUHJvYyhwQWRhcHRlciwgc3RyKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TRVRfQ0hBTk5FTFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NFVF9DSEFOTkVMIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfQUREUjE6CisJCQl7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9BRERSMVxuIikpOworCisJCQkJLy8gQWRkciBpcyBhbiBhcnJheSBvZiBVQ0hBUiwKKwkJCQkvLyBzbyBubyBuZWVkIHRvIHBlcmZvcm0gZW5kaWFuIHN3YXAuCisJCQkJbWVtY3B5KHBBZGFwdGVyLT5hdGUuQWRkcjEsIChQVUNIQVIpKHBSYUNmZy0+ZGF0YSAtIDIpLCBNQUNfQUREUl9MRU4pOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFVF9BRERSMVxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NFVF9BRERSMSBpcyBkb25lICFcbiAoQUREUjEgPSAlMlg6JTJYOiUyWDolMlg6JTJYOiUyWClcbiIsIHBBZGFwdGVyLT5hdGUuQWRkcjFbMF0sCisJCQkJCQlwQWRhcHRlci0+YXRlLkFkZHIxWzFdLCBwQWRhcHRlci0+YXRlLkFkZHIxWzJdLCBwQWRhcHRlci0+YXRlLkFkZHIxWzNdLCBwQWRhcHRlci0+YXRlLkFkZHIxWzRdLCBwQWRhcHRlci0+YXRlLkFkZHIxWzVdKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9BRERSMjoKKwkJCXsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIyXG4iKSk7CisKKwkJCQkvLyBBZGRyIGlzIGFuIGFycmF5IG9mIFVDSEFSLAorCQkJCS8vIHNvIG5vIG5lZWQgdG8gcGVyZm9ybSBlbmRpYW4gc3dhcC4KKwkJCQltZW1jcHkocEFkYXB0ZXItPmF0ZS5BZGRyMiwgKFBVQ0hBUikocFJhQ2ZnLT5kYXRhIC0gMiksIE1BQ19BRERSX0xFTik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIyXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIyIGlzIGRvbmUgIVxuIChBRERSMiA9ICUyWDolMlg6JTJYOiUyWDolMlg6JTJYKVxuIiwgcEFkYXB0ZXItPmF0ZS5BZGRyMlswXSwKKwkJCQkJCXBBZGFwdGVyLT5hdGUuQWRkcjJbMV0sIHBBZGFwdGVyLT5hdGUuQWRkcjJbMl0sIHBBZGFwdGVyLT5hdGUuQWRkcjJbM10sIHBBZGFwdGVyLT5hdGUuQWRkcjJbNF0sIHBBZGFwdGVyLT5hdGUuQWRkcjJbNV0pKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIzOgorCQkJeworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfQUREUjNcbiIpKTsKKworCQkJCS8vIEFkZHIgaXMgYW4gYXJyYXkgb2YgVUNIQVIsCisJCQkJLy8gc28gbm8gbmVlZCB0byBwZXJmb3JtIGVuZGlhbiBzd2FwLgorCQkJCW1lbWNweShwQWRhcHRlci0+YXRlLkFkZHIzLCAoUFVDSEFSKShwUmFDZmctPmRhdGEgLSAyKSwgTUFDX0FERFJfTEVOKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TRVRfQUREUjNcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRVRfQUREUjMgaXMgZG9uZSAhXG4gKEFERFIzID0gJTJYOiUyWDolMlg6JTJYOiUyWDolMlgpXG4iLCBwQWRhcHRlci0+YXRlLkFkZHIzWzBdLAorCQkJCQkJcEFkYXB0ZXItPmF0ZS5BZGRyM1sxXSwgcEFkYXB0ZXItPmF0ZS5BZGRyM1syXSwgcEFkYXB0ZXItPmF0ZS5BZGRyM1szXSwgcEFkYXB0ZXItPmF0ZS5BZGRyM1s0XSwgcEFkYXB0ZXItPmF0ZS5BZGRyM1s1XSkpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfUkFURToKKwkJCXsKKwkJCQlTSE9SVCAgICB2YWx1ZSA9IDA7CisJCQkJVUNIQVIgICAgc3RyW0xFTl9PRl9BUkddOworCisJCQkJTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfUkFURVxuIikpOworCisJCQkJbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKwkJCQlzcHJpbnRmKChQQ0hBUilzdHIsICIlZCIsIHZhbHVlKTsKKwkJCQlTZXRfQVRFX1RYX01DU19Qcm9jKHBBZGFwdGVyLCBzdHIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFVF9SQVRFXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU0VUX1JBVEUgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9MRU46CisJCQl7CisJCQkJU0hPUlQgICAgdmFsdWUgPSAwOworCQkJCVVDSEFSICAgIHN0cltMRU5fT0ZfQVJHXTsKKworCQkJCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0xFTlxuIikpOworCisJCQkJbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKwkJCQlzcHJpbnRmKChQQ0hBUilzdHIsICIlZCIsIHZhbHVlKTsKKwkJCQlTZXRfQVRFX1RYX0xFTkdUSF9Qcm9jKHBBZGFwdGVyLCBzdHIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9MRU5cbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRVRfVFhfRlJBTUVfTEVOIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfVFhfRlJBTUVfQ09VTlQ6CisJCQl7CisJCQkJVVNIT1JUICAgIHZhbHVlID0gMDsKKwkJCQlVQ0hBUiAgICBzdHJbTEVOX09GX0FSR107CisKKwkJCQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9DT1VOVFxuIikpOworCisJCQkJbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKyNpZmRlZiBSVDI4NjAKKwkJCQkvKiBUWF9GUkFNRV9DT1VOVCA9PSAwIG1lYW5zIHR4IGluZmluaXRlbHkgKi8KKwkJCQlpZiAodmFsdWUgPT0gMCkKKwkJCQl7CisJCQkJCS8qIFVzZSBUeENvdW50ID0gMHhGRkZGRkZGRiB0byBhcHByb3hpbWF0ZSB0aGUgaW5maW5pdHkuICovCisJCQkJCXBBZGFwdGVyLT5hdGUuVHhDb3VudCA9IDB4RkZGRkZGRkY7CisJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfVFhfQ09VTlRfUHJvYyAoVHhDb3VudCA9ICVkKVxuIiwgcEFkYXB0ZXItPmF0ZS5UeENvdW50KSk7CisJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9UWF9DT1VOVF9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJCQkJfQorCQkJCWVsc2UKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwkJCQl7CisJCQkJCXNwcmludGYoKFBDSEFSKXN0ciwgIiVkIiwgdmFsdWUpOworCQkJCQlTZXRfQVRFX1RYX0NPVU5UX1Byb2MocEFkYXB0ZXIsIHN0cik7CisJCQkJfQorCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9DT1VOVFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9DT1VOVCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU1RBUlRfUlhfRlJBTUU6CisJCQl7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfUlhfU1RBUlRcbiIpKTsKKworCQkJCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIlJYRlJBTUUiKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX1JYX1NUQVJUXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9SWF9TVEFSVCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKyAgICBBU1NFUlQocFJhQ2ZnICE9IE5VTEwpOworICAgIGlmIChwUmFDZmcgIT0gTlVMTCkKKyAgICB7CisgICAga2ZyZWUocFJhQ2ZnKTsKKyAgICB9CisJcmV0dXJuOworfQorCitWT0lEIEJ1YmJsZVNvcnQoSU5UMzIgbiwgSU5UMzIgYVtdKQoreworCUlOVDMyIGssIGosIHRlbXA7CisKKwlmb3IgKGsgPSBuLTE7ICBrPjA7ICBrLS0pCisJeworCQlmb3IgKGogPSAwOyBqPGs7IGorKykKKwkJeworCQkJaWYoYVtqXSA+IGFbaisxXSkKKwkJCXsKKwkJCQl0ZW1wID0gYVtqXTsKKwkJCQlhW2pdPWFbaisxXTsKKwkJCQlhW2orMV09dGVtcDsKKwkJCX0KKwkJfQorCX0KK30KKworVk9JRCBDYWxOb2lzZUxldmVsKFBSVE1QX0FEQVBURVIgcEFkLCBVQ0hBUiBjaGFubmVsLCBJTlQzMiBSU1NJWzNdWzEwXSkKK3sKKwlJTlQzMgkJUlNTSTAsIFJTU0kxLCBSU1NJMjsKKyAJQ0hBUgkJUnNzaTBPZmZzZXQsIFJzc2kxT2Zmc2V0LCBSc3NpMk9mZnNldDsKKwlVQ0hBUgkJQmJwUjUwUnNzaTAgPSAwLCBCYnBSNTFSc3NpMSA9IDAsIEJicFI1MlJzc2kyID0gMDsKKwlVQ0hBUgkJT3JnX0JCUDY2dmFsdWUgPSAwLCBPcmdfQkJQNjl2YWx1ZSA9IDAsIE9yZ19CQlA3MHZhbHVlID0gMCwgZGF0YSA9IDA7CisJVVNIT1JUCQlMTkFfR2FpbiA9IDA7CisJSU5UMzIgICAgICAgaiA9IDA7CisJVUNIQVIJCU9yZ19DaGFubmVsID0gcEFkLT5hdGUuQ2hhbm5lbDsKKwlVU0hPUlQJICAgIEdhaW5WYWx1ZSA9IDAsIE9mZnNldFZhbHVlID0gMDsKKworCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgJk9yZ19CQlA2NnZhbHVlKTsKKwlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksICZPcmdfQkJQNjl2YWx1ZSk7CisJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCAmT3JnX0JCUDcwdmFsdWUpOworCisJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJLy8gUmVhZCB0aGUgdmFsdWUgb2YgTE5BIGdhaW4gYW5kIFJzc2kgb2Zmc2V0CisJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTE5BX09GRlNFVCwgR2FpblZhbHVlKTsKKworCS8vIGZvciBOb2lzZSBMZXZlbAorCWlmIChjaGFubmVsIDw9IDE0KQorCXsKKwkJTE5BX0dhaW4gPSBHYWluVmFsdWUgJiAweDAwRkY7CisKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fUlNTSV9CR19PRkZTRVQsIE9mZnNldFZhbHVlKTsKKwkJUnNzaTBPZmZzZXQgPSBPZmZzZXRWYWx1ZSAmIDB4MDBGRjsKKwkJUnNzaTFPZmZzZXQgPSAoT2Zmc2V0VmFsdWUgJiAweEZGMDApID4+IDg7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgKEVFUFJPTV9SU1NJX0JHX09GRlNFVCArIDIpLyogMHg0OCAqLywgT2Zmc2V0VmFsdWUpOworCQlSc3NpMk9mZnNldCA9IE9mZnNldFZhbHVlICYgMHgwMEZGOworCX0KKwllbHNlCisJeworCQlMTkFfR2FpbiA9IChHYWluVmFsdWUgJiAweEZGMDApID4+IDg7CisKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fUlNTSV9BX09GRlNFVCwgT2Zmc2V0VmFsdWUpOworCQlSc3NpME9mZnNldCA9IE9mZnNldFZhbHVlICYgMHgwMEZGOworCQlSc3NpMU9mZnNldCA9IChPZmZzZXRWYWx1ZSAmIDB4RkYwMCkgPj4gODsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAoRUVQUk9NX1JTU0lfQV9PRkZTRVQgKyAyKS8qIDB4NEMgKi8sIE9mZnNldFZhbHVlKTsKKwkJUnNzaTJPZmZzZXQgPSBPZmZzZXRWYWx1ZSAmIDB4MDBGRjsKKwl9CisJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJeworCQlwQWQtPmF0ZS5DaGFubmVsID0gY2hhbm5lbDsKKwkJQVRFQXNpY1N3aXRjaENoYW5uZWwocEFkKTsKKwkJbWRlbGF5KDUpOworCisJCWRhdGEgPSAweDEwOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBkYXRhKTsKKwkJZGF0YSA9IDB4NDA7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIGRhdGEpOworCQlkYXRhID0gMHg0MDsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgZGF0YSk7CisJCW1kZWxheSg1KTsKKworCQkvLyBTdGFydCBSeAorCQlwQWQtPmF0ZS5iUUFSeFN0YXJ0ID0gVFJVRTsKKwkJU2V0X0FURV9Qcm9jKHBBZCwgIlJYRlJBTUUiKTsKKworCQltZGVsYXkoNSk7CisKKwkJZm9yIChqID0gMDsgaiA8IDEwOyBqKyspCisJCXsKKwkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I1MCwgJkJicFI1MFJzc2kwKTsKKwkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I1MSwgJkJicFI1MVJzc2kxKTsKKwkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I1MiwgJkJicFI1MlJzc2kyKTsKKworCQkJbWRlbGF5KDEwKTsKKworCQkJLy8gQ2FsY3VsYXRlIFJTU0kgMAorCQkJaWYgKEJicFI1MFJzc2kwID09IDApCisJCQl7CisJCQkJUlNTSTAgPSAtMTAwOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCVJTU0kwID0gKElOVDMyKSgtMTIgLSBCYnBSNTBSc3NpMCAtIExOQV9HYWluIC0gUnNzaTBPZmZzZXQpOworCQkJfQorCQkJUlNTSVswXVtqXSA9IFJTU0kwOworCisJCQlpZiAoIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMiApIC8vIDJSCisJCQl7CisJCQkJLy8gQ2FsY3VsYXRlIFJTU0kgMQorCQkJCWlmIChCYnBSNTFSc3NpMSA9PSAwKQorCQkJCXsKKwkJCQkJUlNTSTEgPSAtMTAwOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSU1NJMSA9IChJTlQzMikoLTEyIC0gQmJwUjUxUnNzaTEgLSBMTkFfR2FpbiAtIFJzc2kxT2Zmc2V0KTsKKwkJCQl9CisJCQkJUlNTSVsxXVtqXSA9IFJTU0kxOworCQkJfQorCisJCQlpZiAoIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMyApIC8vIDNSCisJCQl7CisJCQkJLy8gQ2FsY3VsYXRlIFJTU0kgMgorCQkJCWlmIChCYnBSNTJSc3NpMiA9PSAwKQorCQkJCQlSU1NJMiA9IC0xMDA7CisJCQkJZWxzZQorCQkJCQlSU1NJMiA9IChJTlQzMikoLTEyIC0gQmJwUjUyUnNzaTIgLSBMTkFfR2FpbiAtIFJzc2kyT2Zmc2V0KTsKKworCQkJCVJTU0lbMl1bal0gPSBSU1NJMjsKKwkJCX0KKwkJfQorCisJCS8vIFN0b3AgUngKKwkJU2V0X0FURV9Qcm9jKHBBZCwgIlJYU1RPUCIpOworCisJCW1kZWxheSg1KTsKKworI2lmIDAvLyBEZWJ1ZyBNZXNzYWdlLi4uLi4uLi4uLi4uLi4uLgorCQlhdGVfcHJpbnQoIlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CisJCWF0ZV9wcmludCgiTm9pc2UgTGV2ZWw6IENoYW5uZWwgJWRcbiIsIGNoYW5uZWwpOworCQlhdGVfcHJpbnQoIlJTU0kwID0gJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWRcbiIsCisJCQlSU1NJWzBdWzBdLCBSU1NJWzBdWzFdLCBSU1NJWzBdWzJdLAorCQkJUlNTSVswXVszXSwgUlNTSVswXVs0XSwgUlNTSVswXVs1XSwKKwkJCVJTU0lbMF1bNl0sIFJTU0lbMF1bN10sIFJTU0lbMF1bOF0sCisJCQlSU1NJWzBdWzldKTsKKwkJaWYgKCBwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID49IDIgKSAvLyAyUgorCQl7CisJCQlhdGVfcHJpbnQoIlJTU0kxID0gJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWRcbiIsCisJCQkJUlNTSVsxXVswXSwgUlNTSVsxXVsxXSwgUlNTSVsxXVsyXSwKKwkJCQlSU1NJWzFdWzNdLCBSU1NJWzFdWzRdLCBSU1NJWzFdWzVdLAorCQkJCVJTU0lbMV1bNl0sIFJTU0lbMV1bN10sIFJTU0lbMV1bOF0sCisJCQkJUlNTSVsxXVs5XSk7CisJCX0KKwkJaWYgKCBwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID49IDMgKSAvLyAzUgorCQl7CisJCQlhdGVfcHJpbnQoIlJTU0kyID0gJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWRcbiIsCisJCQkJUlNTSVsyXVswXSwgUlNTSVsyXVsxXSwgUlNTSVsyXVsyXSwKKwkJCQlSU1NJWzJdWzNdLCBSU1NJWzJdWzRdLCBSU1NJWzJdWzVdLAorCQkJCVJTU0lbMl1bNl0sIFJTU0lbMl1bN10sIFJTU0lbMl1bOF0sCisJCQkJUlNTSVsyXVs5XSk7CisJCX0KKyNlbmRpZiAvLyAwIC8vCisJCUJ1YmJsZVNvcnQoMTAsIFJTU0lbMF0pOwkvLyAxUgorCisJCWlmICggcEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+PSAyICkgLy8gMlIKKwkJeworCQkJQnViYmxlU29ydCgxMCwgUlNTSVsxXSk7CisJCX0KKworCQlpZiAoIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMyApIC8vIDNSCisJCXsKKwkJCUJ1YmJsZVNvcnQoMTAsIFJTU0lbMl0pOworCQl9CisKKyNpZiAwLy8gRGVidWcgTWVzc2FnZS4uLi4uLi4uLi4uLi4uLi4KKwkJYXRlX3ByaW50KCJcbkFmdGVyIFNvcnRpbmcuLi4uQ2hhbm5lbCAlZFxuIiwgY2hhbm5lbCk7CisJCWF0ZV9wcmludCgiUlNTSTAgPSAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZFxuIiwKKwkJCVJTU0lbMF1bMF0sIFJTU0lbMF1bMV0sIFJTU0lbMF1bMl0sCisJCQlSU1NJWzBdWzNdLCBSU1NJWzBdWzRdLCBSU1NJWzBdWzVdLAorCQkJUlNTSVswXVs2XSwgUlNTSVswXVs3XSwgUlNTSVswXVs4XSwKKwkJCVJTU0lbMF1bOV0pOworCQlpZiAoIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMiApIC8vIDJSCisJCXsKKwkJCWF0ZV9wcmludCgiUlNTSTEgPSAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZFxuIiwKKwkJCQlSU1NJWzFdWzBdLCBSU1NJWzFdWzFdLCBSU1NJWzFdWzJdLAorCQkJCVJTU0lbMV1bM10sIFJTU0lbMV1bNF0sIFJTU0lbMV1bNV0sCisJCQkJUlNTSVsxXVs2XSwgUlNTSVsxXVs3XSwgUlNTSVsxXVs4XSwKKwkJCQlSU1NJWzFdWzldKTsKKwkJfQorCQlpZiAoIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMyApIC8vIDNSCisJCXsKKwkJCWF0ZV9wcmludCgiUlNTSTIgPSAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZFxuIiwKKwkJCQlSU1NJWzJdWzBdLCBSU1NJWzJdWzFdLCBSU1NJWzJdWzJdLAorCQkJCVJTU0lbMl1bM10sIFJTU0lbMl1bNF0sIFJTU0lbMl1bNV0sCisJCQkJUlNTSVsyXVs2XSwgUlNTSVsyXVs3XSwgUlNTSVsyXVs4XSwKKwkJCQlSU1NJWzJdWzldKTsKKwkJfQorCQlhdGVfcHJpbnQoIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOworI2VuZGlmIC8vIDAgLy8KKwl9CisKKwlwQWQtPmF0ZS5DaGFubmVsID0gT3JnX0NoYW5uZWw7CisJQVRFQXNpY1N3aXRjaENoYW5uZWwocEFkKTsKKworCS8vIFJlc3RvcmUgb3JpZ2luYWwgdmFsdWUKKyAgICBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBPcmdfQkJQNjZ2YWx1ZSk7CisgICAgQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgT3JnX0JCUDY5dmFsdWUpOworICAgIEFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsIE9yZ19CQlA3MHZhbHVlKTsKKworCXJldHVybjsKK30KKworQk9PTEVBTiBTeW5jVHhSeENvbmZpZyhQUlRNUF9BREFQVEVSIHBBZCwgVVNIT1JUIG9mZnNldCwgVUNIQVIgdmFsdWUpCit7CisJVUNIQVIgdG1wID0gMCwgYmJwX2RhdGEgPSAwOworCisJaWYgKEFURV9PTihwQWQpKQorCXsKKwkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBvZmZzZXQsICZiYnBfZGF0YSk7CisJfQorCWVsc2UKKwl7CisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIG9mZnNldCwgJmJicF9kYXRhKTsKKwl9CisKKwkvKiBjb25maXJtIGFnYWluICovCisJQVNTRVJUKGJicF9kYXRhID09IHZhbHVlKTsKKworCXN3aXRjaChvZmZzZXQpCisJeworCQljYXNlIEJCUF9SMToKKwkJCS8qIE5lZWQgdG8gc3luYy4gdHggY29uZmlndXJhdGlvbiB3aXRoIGxlZ2FjeSBBVEUuICovCisJCQl0bXAgPSAoYmJwX2RhdGEgJiAoKDEgPDwgNCkgfCAoMSA8PCAzKSkvKiAweDE4ICovKSA+PiAzOworCQkgICAgc3dpdGNoKHRtcCkKKwkJICAgIHsKKwkJCQkvKiBUaGUgQkJQIFIxIGJpdFs0OjNdID0gMiA6OiBCb3RoIERBQ3Mgd2lsbCBiZSB1c2VkIGJ5IFFBLiAqLworCQkgICAgICAgIGNhc2UgMjoKKwkJCQkJLyogQWxsICovCisJCQkJCXBBZC0+YXRlLlR4QW50ZW5uYVNlbCA9IDA7CisJCSAgICAgICAgICAgIGJyZWFrOworCQkJCS8qIFRoZSBCQlAgUjEgYml0WzQ6M10gPSAwIDo6IERBQyAwIHdpbGwgYmUgdXNlZCBieSBRQS4gKi8KKwkJICAgICAgICBjYXNlIDA6CisJCQkJCS8qIEFudGVubmEgb25lICovCisJCQkJCXBBZC0+YXRlLlR4QW50ZW5uYVNlbCA9IDE7CisJCSAgICAgICAgICAgIGJyZWFrOworCQkJCS8qIFRoZSBCQlAgUjEgYml0WzQ6M10gPSAxIDo6IERBQyAxIHdpbGwgYmUgdXNlZCBieSBRQS4gKi8KKwkJICAgICAgICBjYXNlIDE6CisJCQkJCS8qIEFudGVubmEgdHdvICovCisJCQkJCXBBZC0+YXRlLlR4QW50ZW5uYVNlbCA9IDI7CisJCSAgICAgICAgICAgIGJyZWFrOworCQkgICAgICAgIGRlZmF1bHQ6CisJCSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIC0tIFN0aC4gd3JvbmchICA6IHJldHVybiBGQUxTRTsgXG4iLCBfX2Z1bmNfXykpOworCQkgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisJCSAgICB9CisJCQlicmVhazsvKiBjYXNlIEJCUF9SMSAqLworCisJCWNhc2UgQkJQX1IzOgorCQkJLyogTmVlZCB0byBzeW5jLiByeCBjb25maWd1cmF0aW9uIHdpdGggbGVnYWN5IEFURS4gKi8KKwkJCXRtcCA9IChiYnBfZGF0YSAmICgoMSA8PCAxKSB8ICgxIDw8IDApKS8qIDB4MDMgKi8pOworCQkgICAgc3dpdGNoKHRtcCkKKwkJICAgIHsKKwkJCQkvKiBUaGUgQkJQIFIzIGJpdFsxOjBdID0gMyA6OiBBbGwgQURDcyB3aWxsIGJlIHVzZWQgYnkgUUEuICovCisJCSAgICAgICAgY2FzZSAzOgorCQkJCQkvKiBBbGwgKi8KKwkJCQkJcEFkLT5hdGUuUnhBbnRlbm5hU2VsID0gMDsKKwkJICAgICAgICAgICAgYnJlYWs7CisJCQkJLyogVGhlIEJCUCBSMyBiaXRbMTowXSA9IDAgOjogQURDIDAgd2lsbCBiZSB1c2VkIGJ5IFFBLCAqLworCQkJCS8qIHVubGVzcyB0aGUgQkJQIFIzIGJpdFs0OjNdID0gMiAqLworCQkgICAgICAgIGNhc2UgMDoKKwkJCQkJLyogQW50ZW5uYSBvbmUgKi8KKwkJCQkJcEFkLT5hdGUuUnhBbnRlbm5hU2VsID0gMTsKKwkJCQkJdG1wID0gKChiYnBfZGF0YSAmICgoMSA8PCA0KSB8ICgxIDw8IDMpKS8qIDB4MDMgKi8pID4+IDMpOworCQkJCQlpZiAodG1wID09IDIpLy8gM1IKKwkJCQkJeworCQkJCQkJLyogRGVmYXVsdCA6IEFsbCBBRENzIHdpbGwgYmUgdXNlZCBieSBRQSAqLworCQkJCQkJcEFkLT5hdGUuUnhBbnRlbm5hU2VsID0gMDsKKwkJCQkJfQorCQkgICAgICAgICAgICBicmVhazsKKwkJCQkvKiBUaGUgQkJQIFIzIGJpdFsxOjBdID0gMSA6OiBBREMgMSB3aWxsIGJlIHVzZWQgYnkgUUEuICovCisJCSAgICAgICAgY2FzZSAxOgorCQkJCQkvKiBBbnRlbm5hIHR3byAqLworCQkJCQlwQWQtPmF0ZS5SeEFudGVubmFTZWwgPSAyOworCQkgICAgICAgICAgICBicmVhazsKKwkJCQkvKiBUaGUgQkJQIFIzIGJpdFsxOjBdID0gMiA6OiBBREMgMiB3aWxsIGJlIHVzZWQgYnkgUUEuICovCisJCSAgICAgICAgY2FzZSAyOgorCQkJCQkvKiBBbnRlbm5hIHRocmVlICovCisJCQkJCXBBZC0+YXRlLlJ4QW50ZW5uYVNlbCA9IDM7CisJCSAgICAgICAgICAgIGJyZWFrOworCQkgICAgICAgIGRlZmF1bHQ6CisJCSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIC0tIEltcG9zc2libGUhICA6IHJldHVybiBGQUxTRTsgXG4iLCBfX2Z1bmNfXykpOworCQkgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisJCSAgICB9CisJCQlicmVhazsvKiBjYXNlIEJCUF9SMyAqLworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyAtLSBTdGguIHdyb25nISAgOiByZXR1cm4gRkFMU0U7IFxuIiwgX19mdW5jX18pKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworCX0KKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIFZPSUQgbWVtY3B5X2V4bChQUlRNUF9BREFQVEVSIHBBZCwgVUNIQVIgKmRzdCwgVUNIQVIgKnNyYywgVUxPTkcgbGVuKQoreworCVVMT05HIGksIFZhbHVlID0gMDsKKwlVTE9ORyAqcERzdCwgKnBTcmM7CisJVUNIQVIgKnA4OworCisJcDggPSBzcmM7CisJcERzdCA9IChVTE9ORyAqKSBkc3Q7CisJcFNyYyA9IChVTE9ORyAqKSBzcmM7CisKKwlmb3IgKGkgPSAwIDsgaSA8IChsZW4vNCk7IGkrKykKKwl7CisJCS8qIEZvciBhbGlnbm1lbnQgaXNzdWUsIHdlIG5lZWQgYSB2YXJpYWJsZSAiVmFsdWUiLiAqLworCQltZW1tb3ZlKCZWYWx1ZSwgcFNyYywgNCk7CisJCVZhbHVlID0gaHRvbmwoVmFsdWUpOworCQltZW1tb3ZlKHBEc3QsICZWYWx1ZSwgNCk7CisJCXBEc3QrKzsKKwkJcFNyYysrOworCX0KKwlpZiAoKGxlbiAlIDQpICE9IDApCisJeworCQkvKiB3aXNoIHRoYXQgaXQgd2lsbCBuZXZlciByZWFjaCBoZXJlICovCisJCW1lbW1vdmUoJlZhbHVlLCBwU3JjLCAobGVuICUgNCkpOworCQlWYWx1ZSA9IGh0b25sKFZhbHVlKTsKKwkJbWVtbW92ZShwRHN0LCAmVmFsdWUsIChsZW4gJSA0KSk7CisJfQorfQorCitzdGF0aWMgVk9JRCBtZW1jcHlfZXhzKFBSVE1QX0FEQVBURVIgcEFkLCBVQ0hBUiAqZHN0LCBVQ0hBUiAqc3JjLCBVTE9ORyBsZW4pCit7CisJVUxPTkcgaTsKKwlVQ0hBUiAqcERzdCwgKnBTcmM7CisKKwlwRHN0ID0gZHN0OworCXBTcmMgPSBzcmM7CisKKwlmb3IgKGkgPSAwOyBpIDwgKGxlbi8yKTsgaSsrKQorCXsKKwkJbWVtbW92ZShwRHN0LCBwU3JjLCAyKTsKKwkJKigoVVNIT1JUICopcERzdCkgPSBodG9ucygqKChVU0hPUlQgKilwRHN0KSk7CisJCXBEc3QrPTI7CisJCXBTcmMrPTI7CisJfQorCisJaWYgKChsZW4gJSAyKSAhPSAwKQorCXsKKwkJbWVtbW92ZShwRHN0LCBwU3JjLCAxKTsKKwl9Cit9CisKK3N0YXRpYyBWT0lEIFJUTVBfSU9fUkVBRF9CVUxLKFBSVE1QX0FEQVBURVIgcEFkLCBVQ0hBUiAqZHN0LCBVQ0hBUiAqc3JjLCBVSU5UMzIgbGVuKQoreworCVVJTlQzMiBpLCBWYWx1ZTsKKwlVSU5UMzIgKnBEc3QsICpwU3JjOworCisJcERzdCA9IChVSU5UMzIgKikgZHN0OworCXBTcmMgPSAoVUlOVDMyICopIHNyYzsKKworCWZvciAoaSA9IDAgOyBpIDwgKGxlbi80KTsgaSsrKQorCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCAoVUxPTkcpcFNyYywgJlZhbHVlKTsKKwkJVmFsdWUgPSBodG9ubChWYWx1ZSk7CisJCW1lbW1vdmUocERzdCwgJlZhbHVlLCA0KTsKKwkJcERzdCsrOworCQlwU3JjKys7CisJfQorCXJldHVybjsKK30KKworLy8gVE9ETzoKKyNpZiAwCisvKiBUaGVzZSB3b3JrIG9ubHkgd2hlbiBSQUxJTktfQVRFIGlzIGRlZmluZWQgKi8KK0lOVCBTZXRfVHhTdGFydF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyB2YWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJVUNIQVIgYnVmZmVyWzI2XSA9IHsweDg4LCAweDAyLCAweDJjLCAweDAwLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDAwLCAweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDAwLCAweDU1LCAweDQ0LCAweDMzLCAweDIyLCAweDExLCAweGMwLCAweDIyLCAweDAwLCAweDAwfTsKKwlQT1NfQ09PS0lFIHBPYmo7CisKKwlpZiAocEFkLT5hdGUuVHhTdGF0dXMgIT0gMCkKKwkJcmV0dXJuIEZBTFNFOworCisJcEFkLT5hdGUuVHhJbmZvID0gMHgwNDAwMDAwMDsKKwliemVybygmcEFkLT5hdGUuVHhXSSwgc2l6ZW9mKFRYV0lfU1RSVUMpKTsKKwlwQWQtPmF0ZS5UeFdJLlBIWU1PREUgPSAwOy8vIE1PREVfQ0NLCisJcEFkLT5hdGUuVHhXSS5NUERVdG90YWxCeXRlQ291bnQgPSAxMjI2OworCXBBZC0+YXRlLlR4V0kuTUNTID0gMzsKKwkvL3BBZC0+YXRlLk1vZGUgPSBBVEVfU1RBUlQ7CisJcEFkLT5hdGUuTW9kZSB8PSBBVEVfVFhGUkFNRTsKKwlwQWQtPmF0ZS5UeENvdW50ID0gdmFsdWU7CisJcEFkLT5hdGUuUUlEID0gMDsKKwlwQWQtPmF0ZS5ITGVuID0gMjY7CisJcEFkLT5hdGUuUExlbiA9IDA7CisJcEFkLT5hdGUuRExlbiA9IDEyMDA7CisJbWVtY3B5KHBBZC0+YXRlLkhlYWRlciwgYnVmZmVyLCAyNik7CisJcEFkLT5hdGUuYlFBVHhTdGFydCA9IFRSVUU7CisJLy9wT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCS8vdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+QXRlVHhUYXNrKTsKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAgLyogZW5kIG9mICNpZiAwICovCisKK0lOVCBTZXRfVHhTdG9wX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU2V0X1R4U3RvcF9Qcm9jXG4iKSk7CisKKwlpZiAoU2V0X0FURV9Qcm9jKHBBZCwgIlRYU1RPUCIpKQorCXsKKwlyZXR1cm4gVFJVRTsKK30KKwllbHNlCisJeworCQlyZXR1cm4gRkFMU0U7CisJfQorfQorCitJTlQgU2V0X1J4U3RvcF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNldF9SeFN0b3BfUHJvY1xuIikpOworCisJaWYgKFNldF9BVEVfUHJvYyhwQWQsICJSWFNUT1AiKSkKKwl7CisJcmV0dXJuIFRSVUU7Cit9CisJZWxzZQorCXsKKwkJcmV0dXJuIEZBTFNFOworCX0KK30KKworI2lmIDAKK0lOVCBTZXRfRUVXcml0ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVU0hPUlQgb2Zmc2V0ID0gMCwgdmFsdWU7CisJUFVDSEFSIHAyID0gYXJnOworCisJd2hpbGUoKCpwMiAhPSAnOicpICYmICgqcDIgIT0gJ1wwJykpCisJeworCQlwMisrOworCX0KKworCWlmICgqcDIgPT0gJzonKQorCXsKKwkJQTJIZXgob2Zmc2V0LCBhcmcpOworCQlBMkhleCh2YWx1ZSwgcDIrIDEpOworCX0KKwllbHNlCisJeworCQlBMkhleCh2YWx1ZSwgYXJnKTsKKwl9CisKKwlpZiAob2Zmc2V0ID49IEVFUFJPTV9TSVpFKQorCXsKKwkJYXRlX3ByaW50KCJPZmZzZXQgY2FuIG5vdCBleGNlZWQgRUVQUk9NX1NJWkUoID09IDB4JTA0eClcbiIsIEVFUFJPTV9TSVpFKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCVJUTVBfRUVQUk9NX1dSSVRFMTYocEFkLCBvZmZzZXQsIHZhbHVlKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQgU2V0X0JCUFJlYWRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUNIQVIgdmFsdWUgPSAwLCBvZmZzZXQ7CisKKwlBMkhleChvZmZzZXQsIGFyZyk7CisKKwlpZiAoQVRFX09OKHBBZCkpCisJeworCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIG9mZnNldCwgICZ2YWx1ZSk7CisJfQorCWVsc2UKKwl7CisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIG9mZnNldCwgICZ2YWx1ZSk7CisJfQorCisJYXRlX3ByaW50KCIleFxuIiwgdmFsdWUpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKworSU5UIFNldF9CQlBXcml0ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVU0hPUlQgb2Zmc2V0ID0gMDsKKwlQVUNIQVIgcDIgPSBhcmc7CisJVUNIQVIgdmFsdWU7CisKKwl3aGlsZSgoKnAyICE9ICc6JykgJiYgKCpwMiAhPSAnXDAnKSkKKwl7CisJCXAyKys7CisJfQorCisJaWYgKCpwMiA9PSAnOicpCisJeworCQlBMkhleChvZmZzZXQsIGFyZyk7CisJCUEySGV4KHZhbHVlLCBwMisgMSk7CisJfQorCWVsc2UKKwl7CisJCUEySGV4KHZhbHVlLCBhcmcpOworCX0KKworCWlmIChBVEVfT04ocEFkKSkKKwl7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIG9mZnNldCwgIHZhbHVlKTsKKwl9CisJZWxzZQorCXsKKwkJUlROUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIG9mZnNldCwgIHZhbHVlKTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UIFNldF9SRldyaXRlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVBVQ0hBUiBwMiwgcDMsIHA0OworCVVMT05HIFIxLCBSMiwgUjMsIFI0OworCisJcDIgPSBhcmc7CisKKwl3aGlsZSgoKnAyICE9ICc6JykgJiYgKCpwMiAhPSAnXDAnKSkKKwl7CisJCXAyKys7CisJfQorCisJaWYgKCpwMiAhPSAnOicpCisJCXJldHVybiBGQUxTRTsKKworCXAzID0gcDIgKyAxOworCisJd2hpbGUoKCpwMyAhPSAnOicpICYmICgqcDMgIT0gJ1wwJykpCisJeworCQlwMysrOworCX0KKworCWlmICgqcDMgIT0gJzonKQorCQlyZXR1cm4gRkFMU0U7CisKKwlwNCA9IHAzICsgMTsKKworCXdoaWxlKCgqcDQgIT0gJzonKSAmJiAoKnA0ICE9ICdcMCcpKQorCXsKKwkJcDQrKzsKKwl9CisKKwlpZiAoKnA0ICE9ICc6JykKKwkJcmV0dXJuIEZBTFNFOworCisKKwlBMkhleChSMSwgYXJnKTsKKwlBMkhleChSMiwgcDIgKyAxKTsKKwlBMkhleChSMywgcDMgKyAxKTsKKwlBMkhleChSNCwgcDQgKyAxKTsKKworCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIxKTsKKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMik7CisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjMpOworCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFI0KTsKKworCXJldHVybiBUUlVFOworfQorI2VuZGlmICAvLyBlbmQgb2YgI2lmIDAgLy8KKyNlbmRpZgkvLyBSQUxJTktfMjh4eF9RQSAvLworCisjZW5kaWYJLy8gUkFMSU5LX0FURSAvLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2F0ZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9hdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGFhNzBkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9hdGUuaApAQCAtMCwwICsxLDM1MyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2lmbmRlZiBfX0FURV9IX18KKyNkZWZpbmUgX19BVEVfSF9fCisKKyNpZm5kZWYgVUNPUworI2RlZmluZSBhdGVfcHJpbnQgcHJpbnRrCisjZGVmaW5lIEFURURCR1BSSU5UIERCR1BSSU5UCisjaWZkZWYgUlQyODYwCisjZGVmaW5lIEVFUFJPTV9TSVpFCQkJCQkJCQkweDIwMAorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2RlZmluZSBFRVBST01fQklOX0ZJTEVfTkFNRSAgIi9ldGMvV2lyZWxlc3MvUlQyODYwU1RBL2UycC5iaW4iCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisjZW5kaWYgLy8gUlQyODYwIC8vCisKKyNlbHNlIC8vICFVQ09TIC8vCisjZGVmaW5lIGZBVEVfTE9BRF9FRVBST00JCQkJCQkweDBDNDMKKyNpZmRlZiBDT05GSUdfUFJJTlRLCitleHRlcm4gSU5UIENvbnNvbGVSZXNwb25zZShJTiBQVUNIQVIgYnVmZik7CitleHRlcm4gaW50ICgqcmVtb3RlX2Rpc3BsYXkpKGNoYXIgKik7CitleHRlcm4gdm9pZCBwdXRzIChjb25zdCBjaGFyICpzKTsKKworLyogc3BlY2lmaWNseSBkZWZpbmVkIHRvIHJlZGlyZWN0IGFuZCBzaG93IGF0ZS1yZWxhdGVkIG1lc3NhZ2VzIHRvIGhvc3QuICovCisvKiBUcnkgdG8gZGVmaW5lIGF0ZV9wcmludCBhcyBhIG1hY3JvLiAqLworI2RlZmluZSBhdGVfcHJpbnQoZm10LCBhcmdzLi4uKSAgICAgICAgICAgICAgICAgXAorZG97ICAgaW50ICgqb3JnX3JlbW90ZV9kaXNwbGF5KShjaGFyICopID0gTlVMTDsgICBcCisJb3JnX3JlbW90ZV9kaXNwbGF5ID0gcmVtb3RlX2Rpc3BsYXk7XAorCS8qIFNhdmUgb3JpZ2luYWwgInJlbW90ZV9kaXNwbGF5IiAqL1wKKwlyZW1vdGVfZGlzcGxheSA9IChpbnQgKCopKGNoYXIgKikpQ29uc29sZVJlc3BvbnNlOyAgICAgICAgICAgXAorCXByaW50ayhmbXQsICMjIGFyZ3MpOyAgICAgICAgICAgICAgICAgICAgICAgXAorCS8qIFJlc3RvcmUgdGhlIHJlbW90ZV9kaXNwbGF5IGZ1bmN0aW9uIHBvaW50ZXIgKi8gICAgICAgIFwKKwlyZW1vdGVfZGlzcGxheSA9IG9yZ19yZW1vdGVfZGlzcGxheTsgfXdoaWxlKDApCisKKyNkZWZpbmUgQVRFREJHUFJJTlQoTGV2ZWwsIEZtdCkgICAgCVwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKExldmVsKSA8PSBSVERlYnVnTGV2ZWwpICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhdGVfcHJpbnQgRm10OwkJCQkJXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2VuZGlmIC8vIENPTkZJR19QUklOVEsgLy8KKyNlbmRpZiAvLyAhVUNPUyAvLworCisjZGVmaW5lIEFURV9PTihfcCkgICAgICAgICAgICAgICgoKF9wKS0+YXRlLk1vZGUpICE9IEFURV9TVE9QKQorCisvKiBSVDI4ODBfaU5JQyB3aWxsIGRlZmluZSAiUlQyODYwIi4gKi8KKyNpZmRlZiBSVDI4NjAKKyNkZWZpbmUgQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQoX0EsIF9JLCBfcFYpICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCQlBfQ1NSX0NGR19TVFJVQyAgQmJwQ3NyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCAgICAgICAgICAgICBpLCBrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpPTA7IGk8TUFYX0JVU1lfQ09VTlQ7IGkrKykgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBSVE1QX0lPX1JFQUQzMihfQSwgQkJQX0NTUl9DRkcsICZCYnBDc3Iud29yZCk7ICAgICBcCisgICAgICAgIGlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLndvcmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuZlJlYWQgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci5maWVsZC5CQlBfUldfTU9ERSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLmZpZWxkLkJ1c3kgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuUmVnTnVtID0gX0k7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFJUTVBfSU9fV1JJVEUzMihfQSwgQkJQX0NTUl9DRkcsIEJicENzci53b3JkKTsgICAgIFwKKyAgICAgICAgZm9yIChrPTA7IGs8TUFYX0JVU1lfQ09VTlQ7IGsrKykgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBSVE1QX0lPX1JFQUQzMihfQSwgQkJQX0NTUl9DRkcsICZCYnBDc3Iud29yZCk7IFwKKyAgICAgICAgICAgIGlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBJRExFKSAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChCYnBDc3IuZmllbGQuQnVzeSA9PSBJRExFKSAmJiAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKEJicENzci5maWVsZC5SZWdOdW0gPT0gX0kpKSAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICooX3BWKSA9IChVQ0hBUilCYnBDc3IuZmllbGQuVmFsdWU7ICAgICAgICAgXAorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQkJQIHJlYWQgUiVkIGZhaWxcbiIsIF9JKSk7ICAgICAgXAorICAgICAgICAqKF9wVikgPSAoX0EpLT5CYnBXcml0ZUxhdGNoW19JXTsgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQoX0EsIF9JLCBfVikgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEJCUF9DU1JfQ0ZHX1NUUlVDICBCYnBDc3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50ICAgICAgICAgICAgIEJ1c3lDbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKEJ1c3lDbnQ9MDsgQnVzeUNudDxNQVhfQlVTWV9DT1VOVDsgQnVzeUNudCsrKSAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFJUTVBfSU9fUkVBRDMyKF9BLCBCQlBfQ1NSX0NGRywgJkJicENzci53b3JkKTsgICAgIFwKKyAgICAgICAgaWYgKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci53b3JkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLmZpZWxkLmZSZWFkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuQkJQX1JXX01PREUgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci5maWVsZC5CdXN5ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLmZpZWxkLlZhbHVlID0gX1Y7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuUmVnTnVtID0gX0k7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFJUTVBfSU9fV1JJVEUzMihfQSwgQkJQX0NTUl9DRkcsIEJicENzci53b3JkKTsgICAgIFwKKyAgICAgICAgKF9BKS0+QmJwV3JpdGVMYXRjaFtfSV0gPSBfVjsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoQnVzeUNudCA9PSBNQVhfQlVTWV9DT1VOVCkgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkJCUCB3cml0ZSBSJWQgZmFpbFxuIiwgX0kpKTsgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisvKiBSVDI4ODBfaU5JQyB3aWxsIGRlZmluZSBSVDI4NjAuICovCisjaWZkZWYgUlQyODYwCisjZGVmaW5lIEVFUFJPTV9TSVpFCQkJCQkJCQkweDIwMAorLyogaU5JQyBoYXMgaXRzIG93biBFRVBST01fQklOX0ZJTEVfTkFNRSAqLworI2lmbmRlZiBVQ09TCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZGVmaW5lIEVFUFJPTV9CSU5fRklMRV9OQU1FICAiL2V0Yy9XaXJlbGVzcy9SVDI4NjBTVEEvZTJwLmJpbiIKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyAhVUNPUyAvLworI2VuZGlmIC8vIFJUMjg2MCAvLworCisKKworVk9JRCBydF9lZV9yZWFkX2FsbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlPVVQgVVNIT1JUICpEYXRhKTsKKworCitWT0lEIHJ0X2VlX3dyaXRlX2FsbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVVNIT1JUICpEYXRhKTsKKworSU5UIFNldF9BVEVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9EQV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQVRFX1NBX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfQlNTSURfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9DSEFOTkVMX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfVFhfUE9XRVIwX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfVFhfUE9XRVIxX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfVFhfQW50ZW5uYV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQVRFX1JYX0FudGVubmFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9UWF9GUkVRT0ZGU0VUX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfVFhfQldfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9UWF9MRU5HVEhfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9UWF9DT1VOVF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQVRFX1RYX01DU19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQVRFX1RYX01PREVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9UWF9HSV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKKworSU5UCVNldF9BVEVfUlhfRkVSX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9BVEVfUmVhZF9SRl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQVRFX1dyaXRlX1JGMV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQVRFX1dyaXRlX1JGMl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQVRFX1dyaXRlX1JGM19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQVRFX1dyaXRlX1JGNF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQVRFX0xvYWRfRTJQX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9BVEVfUmVhZF9FMlBfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9TaG93X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfSGVscF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKKyNpZmRlZiBSQUxJTktfQVRFCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKK1ZPSUQgQVRFX1FBX1N0YXRpc3RpY3MoCisJSU4gUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOIFBSWFdJX1NUUlVDCQkJcFJ4V0ksCisJSU4gUFJUMjhYWF9SWERfU1RSVUMgICAgcDI4eHhSeEQsCisJSU4gUEhFQURFUl84MDJfMTEJCXBIZWFkZXIpOworCitWT0lEIFJ0bXBEb0F0ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCXN0cnVjdCBpd3JlcQkqd3JxKTsKKworVk9JRCBCdWJibGVTb3J0KAorCUlOICBJTlQzMiBuLAorCUlOICBJTlQzMiBhW10pOworCitWT0lEIENhbE5vaXNlTGV2ZWwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKwlJTiAgVUNIQVIgICAgICAgICAgIGNoYW5uZWwsCisJT1VUIElOVDMyICAgICAgICAgICBidWZmZXJbM11bMTBdKTsKKworQk9PTEVBTiBTeW5jVHhSeENvbmZpZygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCVVTSE9SVAkJCW9mZnNldCwKKwlJTglVQ0hBUgkJCXZhbHVlKTsKKworI2lmIDAKK0lOVCBTZXRfVHhTdGFydF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisjZW5kaWYgIC8vIDAgLy8KKworSU5UIFNldF9UeFN0b3BfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X1J4U3RvcF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKKyNpZiAwCitJTlQgU2V0X0VFUmVhZF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfRUVXcml0ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQkJQUmVhZF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQkJQV3JpdGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X1JGV3JpdGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworI2VuZGlmIC8vIGVuZCBvZiAjaWYgMCAvLworI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCitWT0lEIEFURUFzaWNTd2l0Y2hDaGFubmVsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBBVEVBc2ljQWRqdXN0VHhQb3dlcigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgQVRFRGlzYWJsZUFzaWNQcm90ZWN0KAorCUlOCQlQUlRNUF9BREFQVEVSCXBBZCk7CisKK0NIQVIgQVRFQ29udmVydFRvUnNzaSgKKwlJTiBQUlRNUF9BREFQVEVSICBwQWQsCisJSU4gQ0hBUgkJCQlSc3NpLAorCUlOIFVDSEFSICAgIFJzc2lOdW1iZXIpOworCitWT0lEIEFURVNhbXBsZVJzc2koCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gUFJYV0lfU1RSVUMJCXBSeFdJKTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitWT0lEIFJUTVBTdGF0aW9uU3RvcCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgUlRNUFN0YXRpb25TdGFydCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisjZW5kaWYgLy8gX19BVEVfSF9fIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2NvbmZpZy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWU3YTQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9jb25maWcuaApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlydF9jb25maWcuaAorCisJQWJzdHJhY3Q6CisJQ2VudHJhbCBoZWFkZXIgZmlsZSB0byBtYWludGFpbiBhbGwgaW5jbHVkZSBmaWxlcyBmb3IgYWxsIE5ESVMKKwltaW5pcG9ydCBkcml2ZXIgcm91dGluZXMuCisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVBhdWwgTGluICAgIDA4LTAxLTIwMDIgICAgY3JlYXRlZAorCisqLworI2lmbmRlZglfX1JUX0NPTkZJR19IX18KKyNkZWZpbmUJX19SVF9DT05GSUdfSF9fCisKKyNpbmNsdWRlICAgICJydG1wX3R5cGUuaCIKKyNpZmRlZiBVQ09TCisjaW5jbHVkZSAiaW5jbHVkZXMuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgCSJydF91Y29zLmgiCisjZW5kaWYKKworI2lmZGVmIExJTlVYCisjaW5jbHVkZQkicnRfbGludXguaCIKKyNlbmRpZgorI2luY2x1ZGUgICAgInJ0bXBfZGVmLmgiCisjaW5jbHVkZSAgICAicnQyOHh4LmgiCisKKyNpZmRlZiBSVDI4NjAKKyNpbmNsdWRlCSJydDI4NjAuaCIKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCisjaW5jbHVkZSAgICAib2lkLmgiCisjaW5jbHVkZSAgICAibWxtZS5oIgorI2luY2x1ZGUgICAgIndwYS5oIgorI2luY2x1ZGUgICAgIm1kNS5oIgorI2luY2x1ZGUgICAgInJ0bXAuaCIKKyNpbmNsdWRlCSJhcC5oIgorI2luY2x1ZGUJImRmcy5oIgorI2luY2x1ZGUJImNobGlzdC5oIgorI2luY2x1ZGUJInNwZWN0cnVtLmgiCisKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKyNpbmNsdWRlICAgICJsZWFwLmgiCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisKKyNpZmRlZiBCTE9DS19ORVRfSUYKKyNpbmNsdWRlICJuZXRpZl9ibG9jay5oIgorI2VuZGlmIC8vIEJMT0NLX05FVF9JRiAvLworCisjaWZkZWYgSUdNUF9TTk9PUF9TVVBQT1JUCisjaW5jbHVkZSAiaWdtcF9zbm9vcC5oIgorI2VuZGlmIC8vIElHTVBfU05PT1BfU1VQUE9SVCAvLworCisjaWZkZWYgUkFMSU5LX0FURQorI2luY2x1ZGUgInJ0X2F0ZS5oIgorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNlcnJvciAiQnVpbGQgZm9yIGJlaW5nIGNvbnRyb2xsZWQgYnkgTmV0d29ya01hbmFnZXIgb3Igd2V4dCwgcGxlYXNlIHNldCBIQVNfV1BBX1NVUFBMSUNBTlQ9eSBhbmQgSEFTX05BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUPXkiCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIElLQU5PU19WWF8xWDAKKyNpbmNsdWRlCSJ2cl9pa2Fucy5oIgorI2VuZGlmIC8vIElLQU5PU19WWF8xWDAgLy8KKworI2VuZGlmCS8vIF9fUlRfQ09ORklHX0hfXworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2xpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2xpbnV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE0NTAwOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbGludXguYwpAQCAtMCwwICsxLDEwNTQgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpbmNsdWRlICJydF9jb25maWcuaCIKKworVUxPTkcJUlREZWJ1Z0xldmVsID0gUlRfREVCVUdfRVJST1I7CisKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKE1sbWVQZXJpb2RpY0V4ZWMpOworQlVJTERfVElNRVJfRlVOQ1RJT04oQXNpY1J4QW50RXZhbFRpbWVvdXQpOworQlVJTERfVElNRVJfRlVOQ1RJT04oQVBTRFBlcmlvZGljRXhlYyk7CitCVUlMRF9USU1FUl9GVU5DVElPTihBc2ljUmZUdW5pbmdFeGVjKTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitCVUlMRF9USU1FUl9GVU5DVElPTihCZWFjb25UaW1lb3V0KTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKFNjYW5UaW1lb3V0KTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKEF1dGhUaW1lb3V0KTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKEFzc29jVGltZW91dCk7CitCVUlMRF9USU1FUl9GVU5DVElPTihSZWFzc29jVGltZW91dCk7CitCVUlMRF9USU1FUl9GVU5DVElPTihEaXNhc3NvY1RpbWVvdXQpOworQlVJTERfVElNRVJfRlVOQ1RJT04oTGlua0Rvd25FeGVjKTsKKyNpZmRlZiBMRUFQX1NVUFBPUlQKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKExlYXBBdXRoVGltZW91dCk7CisjZW5kaWYKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMpOworQlVJTERfVElNRVJfRlVOQ1RJT04oV3BhRGlzYXNzb2NBcEFuZEJsb2NrQXNzb2MpOworI2lmZGVmIFJUMjg2MAorQlVJTERfVElNRVJfRlVOQ1RJT04oUHNQb2xsV2FrZUV4ZWMpOworQlVJTERfVElNRVJfRlVOQ1RJT04oUmFkaW9PbkV4ZWMpOworI2VuZGlmIC8vIFJUMjg2MCAvLworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorQlVJTERfVElNRVJfRlVOQ1RJT04oRGxzVGltZW91dEFjdGlvbik7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKy8vIGZvciB3aXJlbGVzcyBzeXN0ZW0gZXZlbnQgbWVzc2FnZQorY2hhciBjb25zdCAqcFdpcmVsZXNzU3lzRXZlbnRUZXh0W0lXX1NZU19FVkVOVF9UWVBFX05VTV0gPSB7CisJLy8gc3lzdGVtIHN0YXR1cyBldmVudAorICAgICJoYWQgYXNzb2NpYXRlZCBzdWNjZXNzZnVsbHkiLAkJCQkJCQkvKiBJV19BU1NPQ19FVkVOVF9GTEFHICovCisgICAgImhhZCBkaXNhc3NvY2lhdGVkIiwJCQkJCQkJCQkvKiBJV19ESVNBU1NPQ19FVkVOVF9GTEFHICovCisgICAgImhhZCBkZWF1dGhlbnRpY2F0ZWQiLAkJCQkJCQkJCS8qIElXX0RFQVVUSF9FVkVOVF9GTEFHICovCisgICAgImhhZCBiZWVuIGFnZWQtb3V0IGFuZCBkaXNhc3NvY2lhdGVkIiwJCQkJCS8qIElXX0FHRU9VVF9FVkVOVF9GTEFHICovCisgICAgIm9jY3VycmVkIENvdW50ZXJNZWFzdXJlcyBhdHRhY2siLAkJCQkJCS8qIElXX0NPVU5URVJfTUVBU1VSRVNfRVZFTlRfRkxBRyAqLworICAgICJvY2N1cnJlZCByZXBsYXkgY291bnRlciBkaWZmZXJlbnQgaW4gS2V5IEhhbmRzaGFraW5nIiwJLyogSVdfUkVQTEFZX0NPVU5URVJfRElGRl9FVkVOVF9GTEFHICovCisgICAgIm9jY3VycmVkIFJTTklFIGRpZmZlcmVudCBpbiBLZXkgSGFuZHNoYWtpbmciLAkJCS8qIElXX1JTTklFX0RJRkZfRVZFTlRfRkxBRyAqLworICAgICJvY2N1cnJlZCBNSUMgZGlmZmVyZW50IGluIEtleSBIYW5kc2hha2luZyIsCQkJLyogSVdfTUlDX0RJRkZfRVZFTlRfRkxBRyAqLworICAgICJvY2N1cnJlZCBJQ1YgZXJyb3IgaW4gUlgiLAkJCQkJCQkJLyogSVdfSUNWX0VSUk9SX0VWRU5UX0ZMQUcgKi8KKyAgICAib2NjdXJyZWQgTUlDIGVycm9yIGluIFJYIiwJCQkJCQkJCS8qIElXX01JQ19FUlJPUl9FVkVOVF9GTEFHICovCisJIkdyb3VwIEtleSBIYW5kc2hha2luZyB0aW1lb3V0IiwJCQkJCQkvKiBJV19HUk9VUF9IU19USU1FT1VUX0VWRU5UX0ZMQUcgKi8KKwkiUGFpcndpc2UgS2V5IEhhbmRzaGFraW5nIHRpbWVvdXQiLAkJCQkJCS8qIElXX1BBSVJXSVNFX0hTX1RJTUVPVVRfRVZFTlRfRkxBRyAqLworCSJSU04gSUUgc2FuaXR5IGNoZWNrIGZhaWx1cmUiLAkJCQkJCQkvKiBJV19SU05JRV9TQU5JVFlfRkFJTF9FVkVOVF9GTEFHICovCisJInNldCBrZXkgZG9uZSBpbiBXUEEvV1BBUFNLIiwJCQkJCQkJLyogSVdfU0VUX0tFWV9ET05FX1dQQTFfRVZFTlRfRkxBRyAqLworCSJzZXQga2V5IGRvbmUgaW4gV1BBMi9XUEEyUFNLIiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogSVdfU0VUX0tFWV9ET05FX1dQQTJfRVZFTlRfRkxBRyAqLworCSJjb25uZWN0cyB3aXRoIG91ciB3aXJlbGVzcyBjbGllbnQiLCAgICAgICAgICAgICAgICAgICAgLyogSVdfU1RBX0xJTktVUF9FVkVOVF9GTEFHICovCisJImRpc2Nvbm5lY3RzIHdpdGggb3VyIHdpcmVsZXNzIGNsaWVudCIsICAgICAgICAgICAgICAgICAvKiBJV19TVEFfTElOS0RPV05fRVZFTlRfRkxBRyAqLworCSJzY2FuIGNvbXBsZXRlZCIJCQkJCQkJCQkJLyogSVdfU0NBTl9DT01QTEVURURfRVZFTlRfRkxBRyAqLworCSJzY2FuIHRlcm1pbmF0ZSEhIEJ1c3khISBFbnF1ZXVlIGZhaWwhISIJCQkJLyogSVdfU0NBTl9FTlFVRVVFX0ZBSUxfRVZFTlRfRkxBRyAqLworCX07CisKKy8vIGZvciB3aXJlbGVzcyBJRFNfc3Bvb2ZfYXR0YWNrIGV2ZW50IG1lc3NhZ2UKK2NoYXIgY29uc3QgKnBXaXJlbGVzc1Nwb29mRXZlbnRUZXh0W0lXX1NQT09GX0VWRU5UX1RZUEVfTlVNXSA9IHsKKyAgICAiZGV0ZWN0ZWQgY29uZmxpY3QgU1NJRCIsCQkJCQkJCQkvKiBJV19DT05GTElDVF9TU0lEX0VWRU5UX0ZMQUcgKi8KKyAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBhc3NvY2lhdGlvbiByZXNwb25zZSIsCQkJCS8qIElXX1NQT09GX0FTU09DX1JFU1BfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBzcG9vZmVkIHJlYXNzb2NpYXRpb24gcmVzcG9uc2VzIiwJCQkJLyogSVdfU1BPT0ZfUkVBU1NPQ19SRVNQX0VWRU5UX0ZMQUcgKi8KKyAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBwcm9iZSByZXNwb25zZSIsCQkJCQkJLyogSVdfU1BPT0ZfUFJPQkVfUkVTUF9FVkVOVF9GTEFHICovCisgICAgImRldGVjdGVkIHNwb29mZWQgYmVhY29uIiwJCQkJCQkJCS8qIElXX1NQT09GX0JFQUNPTl9FVkVOVF9GTEFHICovCisgICAgImRldGVjdGVkIHNwb29mZWQgZGlzYXNzb2NpYXRpb24iLAkJCQkJCS8qIElXX1NQT09GX0RJU0FTU09DX0VWRU5UX0ZMQUcgKi8KKyAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBhdXRoZW50aWNhdGlvbiIsCQkJCQkJLyogSVdfU1BPT0ZfQVVUSF9FVkVOVF9GTEFHICovCisgICAgImRldGVjdGVkIHNwb29mZWQgZGVhdXRoZW50aWNhdGlvbiIsCQkJCQkvKiBJV19TUE9PRl9ERUFVVEhfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBzcG9vZmVkIHVua25vd24gbWFuYWdlbWVudCBmcmFtZSIsCQkJLyogSVdfU1BPT0ZfVU5LTk9XTl9NR01UX0VWRU5UX0ZMQUcgKi8KKwkiZGV0ZWN0ZWQgcmVwbGF5IGF0dGFjayIJCQkJCQkJCS8qIElXX1JFUExBWV9BVFRBQ0tfRVZFTlRfRkxBRyAqLworCX07CisKKy8vIGZvciB3aXJlbGVzcyBJRFNfZmxvb2RpbmdfYXR0YWNrIGV2ZW50IG1lc3NhZ2UKK2NoYXIgY29uc3QgKnBXaXJlbGVzc0Zsb29kRXZlbnRUZXh0W0lXX0ZMT09EX0VWRU5UX1RZUEVfTlVNXSA9IHsKKwkiZGV0ZWN0ZWQgYXV0aGVudGljYXRpb24gZmxvb2RpbmciLAkJCQkJCS8qIElXX0ZMT09EX0FVVEhfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBhc3NvY2lhdGlvbiByZXF1ZXN0IGZsb29kaW5nIiwJCQkJLyogSVdfRkxPT0RfQVNTT0NfUkVRX0VWRU5UX0ZMQUcgKi8KKyAgICAiZGV0ZWN0ZWQgcmVhc3NvY2lhdGlvbiByZXF1ZXN0IGZsb29kaW5nIiwJCQkJLyogSVdfRkxPT0RfUkVBU1NPQ19SRVFfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBwcm9iZSByZXF1ZXN0IGZsb29kaW5nIiwJCQkJCQkvKiBJV19GTE9PRF9QUk9CRV9SRVFfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBkaXNhc3NvY2lhdGlvbiBmbG9vZGluZyIsCQkJCQkJLyogSVdfRkxPT0RfRElTQVNTT0NfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBkZWF1dGhlbnRpY2F0aW9uIGZsb29kaW5nIiwJCQkJCS8qIElXX0ZMT09EX0RFQVVUSF9FVkVOVF9GTEFHICovCisgICAgImRldGVjdGVkIDgwMi4xeCBlYXAtcmVxdWVzdCBmbG9vZGluZyIJCQkJCS8qIElXX0ZMT09EX0VBUF9SRVFfRVZFTlRfRkxBRyAqLworCX07CisKKy8qIHRpbWVvdXQgLS0gbXMgKi8KK1ZPSUQgUlRNUF9TZXRQZXJpb2RpY1RpbWVyKAorCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIgKnBUaW1lciwKKwlJTgl1bnNpZ25lZCBsb25nIHRpbWVvdXQpCit7CisJdGltZW91dCA9ICgodGltZW91dCpIWikgLyAxMDAwKTsKKwlwVGltZXItPmV4cGlyZXMgPSBqaWZmaWVzICsgdGltZW91dDsKKwlhZGRfdGltZXIocFRpbWVyKTsKK30KKworLyogY29udmVydCBOZGlzTUluaXRpYWxpemVUaW1lciAtLT4gUlRNUF9PU19Jbml0X1RpbWVyICovCitWT0lEIFJUTVBfT1NfSW5pdF9UaW1lcigKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglORElTX01JTklQT1JUX1RJTUVSICpwVGltZXIsCisJSU4JVElNRVJfRlVOQ1RJT04gZnVuY3Rpb24sCisJSU4JUFZPSUQgZGF0YSkKK3sKKwlpbml0X3RpbWVyKHBUaW1lcik7CisgICAgcFRpbWVyLT5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGF0YTsKKyAgICBwVGltZXItPmZ1bmN0aW9uID0gZnVuY3Rpb247Cit9CisKKworVk9JRCBSVE1QX09TX0FkZF9UaW1lcigKKwlJTglORElTX01JTklQT1JUX1RJTUVSCQkqcFRpbWVyLAorCUlOCXVuc2lnbmVkIGxvbmcgdGltZW91dCkKK3sKKwlpZiAodGltZXJfcGVuZGluZyhwVGltZXIpKQorCQlyZXR1cm47CisKKwl0aW1lb3V0ID0gKCh0aW1lb3V0KkhaKSAvIDEwMDApOworCXBUaW1lci0+ZXhwaXJlcyA9IGppZmZpZXMgKyB0aW1lb3V0OworCWFkZF90aW1lcihwVGltZXIpOworfQorCitWT0lEIFJUTVBfT1NfTW9kX1RpbWVyKAorCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIJCSpwVGltZXIsCisJSU4JdW5zaWduZWQgbG9uZyB0aW1lb3V0KQoreworCXRpbWVvdXQgPSAoKHRpbWVvdXQqSFopIC8gMTAwMCk7CisJbW9kX3RpbWVyKHBUaW1lciwgamlmZmllcyArIHRpbWVvdXQpOworfQorCitWT0lEIFJUTVBfT1NfRGVsX1RpbWVyKAorCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIJCSpwVGltZXIsCisJT1VUCUJPT0xFQU4JCQkJCSpwQ2FuY2VsbGVkKQoreworCWlmICh0aW1lcl9wZW5kaW5nKHBUaW1lcikpCisJeworCQkqcENhbmNlbGxlZCA9IGRlbF90aW1lcl9zeW5jKHBUaW1lcik7CisJfQorCWVsc2UKKwl7CisJCSpwQ2FuY2VsbGVkID0gVFJVRTsKKwl9CisKK30KKworVk9JRCBSVE1QX09TX1JlbGVhc2VfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVBRVUVVRV9FTlRSWSAgcEVudHJ5KQoreworCS8vUlRNUEZyZWVOZGlzUGFja2V0KHBBZCwgKHN0cnVjdCBza19idWZmICopcEVudHJ5KTsKK30KKworLy8gVW5pZnkgYWxsIGRlbGF5IHJvdXRpbmUgYnkgdXNpbmcgdWRlbGF5CitWT0lEIFJUTVB1c2VjRGVsYXkoCisJSU4JVUxPTkcJdXNlYykKK3sKKwlVTE9ORwlpOworCisJZm9yIChpID0gMDsgaSA8ICh1c2VjIC8gNTApOyBpKyspCisJCXVkZWxheSg1MCk7CisKKwlpZiAodXNlYyAlIDUwKQorCQl1ZGVsYXkodXNlYyAlIDUwKTsKK30KKwordm9pZCBSVE1QX0dldEN1cnJlbnRTeXN0ZW1UaW1lKExBUkdFX0lOVEVHRVIgKnRpbWUpCit7CisJdGltZS0+dS5Mb3dQYXJ0ID0gamlmZmllczsKK30KKworLy8gcEFkIE1VU1QgYWxsb3cgdG8gYmUgTlVMTAorTkRJU19TVEFUVVMgb3NfYWxsb2NfbWVtKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCU9VVAlQVUNIQVIgKm1lbSwKKwlJTglVTE9ORyAgc2l6ZSkKK3sKKwkqbWVtID0gKFBVQ0hBUikga21hbGxvYyhzaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAoKm1lbSkKKwkJcmV0dXJuIChORElTX1NUQVRVU19TVUNDRVNTKTsKKwllbHNlCisJCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7Cit9CisKKy8vIHBBZCBNVVNUIGFsbG93IHRvIGJlIE5VTEwKK05ESVNfU1RBVFVTIG9zX2ZyZWVfbWVtKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVBVQ0hBUiBtZW0pCit7CisKKwlBU1NFUlQobWVtKTsKKwlrZnJlZShtZW0pOworCXJldHVybiAoTkRJU19TVEFUVVNfU1VDQ0VTUyk7Cit9CisKKworUE5ESVNfUEFDS0VUIFJUTVBfQWxsb2NhdGVGcmFnUGFja2V0QnVmZmVyKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVMT05HCUxlbmd0aCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OworCisJcGt0ID0gZGV2X2FsbG9jX3NrYihMZW5ndGgpOworCisJaWYgKHBrdCA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY2FuJ3QgYWxsb2NhdGUgZnJhZyByeCAlbGQgc2l6ZSBwYWNrZXRcbiIsTGVuZ3RoKSk7CisJfQorCisJaWYgKHBrdCkKKwl7CisJCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UoT1NQS1RfVE9fUlRQS1QocGt0KSwgUEtUU1JDX05ESVMpOworCX0KKworCXJldHVybiAoUE5ESVNfUEFDS0VUKSBwa3Q7Cit9CisKKworUE5ESVNfUEFDS0VUIFJUTVBfQWxsb2NhdGVUeFBhY2tldEJ1ZmZlcigKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVTE9ORwlMZW5ndGgsCisJSU4JQk9PTEVBTglDYWNoZWQsCisJT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OworCisJcGt0ID0gZGV2X2FsbG9jX3NrYihMZW5ndGgpOworCisJaWYgKHBrdCA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY2FuJ3QgYWxsb2NhdGUgdHggJWxkIHNpemUgcGFja2V0XG4iLExlbmd0aCkpOworCX0KKworCWlmIChwa3QpCisJeworCQlSVE1QX1NFVF9QQUNLRVRfU09VUkNFKE9TUEtUX1RPX1JUUEtUKHBrdCksIFBLVFNSQ19ORElTKTsKKwkJKlZpcnR1YWxBZGRyZXNzID0gKFBWT0lEKSBwa3QtPmRhdGE7CisJfQorCWVsc2UKKwl7CisJCSpWaXJ0dWFsQWRkcmVzcyA9IChQVk9JRCkgTlVMTDsKKwl9CisKKwlyZXR1cm4gKFBORElTX1BBQ0tFVCkgcGt0OworfQorCisKK1ZPSUQgYnVpbGRfdHhfcGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAorCUlOCVBVQ0hBUglwRnJhbWUsCisJSU4JVUxPTkcJRnJhbWVMZW4pCit7CisKKwlzdHJ1Y3Qgc2tfYnVmZgkqcFR4UGt0OworCisJQVNTRVJUKHBQYWNrZXQpOworCXBUeFBrdCA9IFJUUEtUX1RPX09TUEtUKHBQYWNrZXQpOworCisJTmRpc01vdmVNZW1vcnkoc2tiX3B1dChwVHhQa3QsIEZyYW1lTGVuKSwgcEZyYW1lLCBGcmFtZUxlbik7Cit9CisKK1ZPSUQJUlRNUEZyZWVBZGFwdGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworICAgIFBPU19DT09LSUUgb3NfY29va2llOworCWludCBpbmRleDsKKworCW9zX2Nvb2tpZT0oUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKKworCWtmcmVlKHBBZC0+QmVhY29uQnVmKTsKKworCisJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5NZ210UmluZ0xvY2spOworCisjaWZkZWYgUlQyODYwCisJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5SeFJpbmdMb2NrKTsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCWZvciAoaW5kZXggPTAgOyBpbmRleCA8IE5VTV9PRl9UWF9SSU5HOyBpbmRleCsrKQorCXsKKyAgICAJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5UeFN3UXVldWVMb2NrW2luZGV4XSk7CisJCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+RGVRdWV1ZUxvY2tbaW5kZXhdKTsKKwkJcEFkLT5EZVF1ZXVlUnVubmluZ1tpbmRleF0gPSBGQUxTRTsKKwl9CisKKwlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPmlycV9sb2NrKTsKKworCXZmcmVlKHBBZCk7IC8vIHBjaV9mcmVlX2NvbnNpc3RlbnQob3NfY29va2llLT5wY2lfZGV2LHNpemVvZihSVE1QX0FEQVBURVIpLHBBZCxvc19jb29raWUtPnBBZF9wYSk7CisJa2ZyZWUob3NfY29va2llKTsKK30KKworQk9PTEVBTiBPU19OZWVkX0Nsb25lX1BhY2tldCh2b2lkKQoreworCXJldHVybiAoRkFMU0UpOworfQorCisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCWNsb25lIGFuIGlucHV0IE5ESVMgUEFDS0VUIHRvIGFub3RoZXIgb25lLiBUaGUgbmV3IGludGVybmFsbHkgY3JlYXRlZCBORElTIFBBQ0tFVAorCQltdXN0IGhhdmUgb25seSBvbmUgTkRJUyBCVUZGRVIKKwkJcmV0dXJuIC0gYnl0ZSBjb3BpZWQuIDAgbWVhbnMgY2FuJ3QgY3JlYXRlIE5ESVMgUEFDS0VUCisJCU5PVEU6IGludGVybmFsbHkgY3JlYXRlZCBORElTX1BBQ0tFVCBzaG91bGQgYmUgZGVzdHJveWVkIGJ5IFJUTVBGcmVlTmRpc1BhY2tldAorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcEluc0FNU0RVSGRyCUVXQyBBLU1TRFUgZm9ybWF0IGhhcyBleHRyYSAxNC1ieXRlcyBoZWFkZXIuIGlmIFRSVUUsIGluc2VydCB0aGlzIDE0LWJ5dGUgaGRyIGluIGZyb250IG9mIE1TRFUuCisJCSpwU3JjVG90YWxMZW4JCQlyZXR1cm4gdG90YWwgcGFja2V0IGxlbmd0aC4gVGhpcyBsZW5naHQgaXMgY2FsY3VsYXRlZCB3aXRoIDgwMi4zIGZvcm1hdCBwYWNrZXQuCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX1NVQ0NFU1MKKwkJTkRJU19TVEFUVVNfRkFJTFVSRQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTIFJUTVBDbG9uZU5kaXNQYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JQk9PTEVBTgkJCXBJbnNBTVNEVUhkciwKKwlJTglQTkRJU19QQUNLRVQJcEluUGFja2V0LAorCU9VVCBQTkRJU19QQUNLRVQgICAqcHBPdXRQYWNrZXQpCit7CisKKwlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OworCisJQVNTRVJUKHBJblBhY2tldCk7CisJQVNTRVJUKHBwT3V0UGFja2V0KTsKKworCS8vIDEuIEFsbG9jYXRlIGEgcGFja2V0CisJcGt0ID0gZGV2X2FsbG9jX3NrYigyMDQ4KTsKKworCWlmIChwa3QgPT0gTlVMTCkKKwl7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworIAlza2JfcHV0KHBrdCwgR0VUX09TX1BLVF9MRU4ocEluUGFja2V0KSk7CisJTmRpc01vdmVNZW1vcnkocGt0LT5kYXRhLCBHRVRfT1NfUEtUX0RBVEFQVFIocEluUGFja2V0KSwgR0VUX09TX1BLVF9MRU4ocEluUGFja2V0KSk7CisJKnBwT3V0UGFja2V0ID0gT1NQS1RfVE9fUlRQS1QocGt0KTsKKworCisJUlRNUF9TRVRfUEFDS0VUX1NPVVJDRShPU1BLVF9UT19SVFBLVChwa3QpLCBQS1RTUkNfTkRJUyk7CisKKwlwcmludGsoIiMjI0Nsb25lIyMjXG4iKTsKKworCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworfQorCisKKy8vIHRoZSBhbGxvY2F0ZWQgTkRJUyBQQUNLRVQgbXVzdCBiZSBmcmVlZCB2aWEgUlRNUEZyZWVOZGlzUGFja2V0KCkKK05ESVNfU1RBVFVTIFJUTVBBbGxvY2F0ZU5kaXNQYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUIFBORElTX1BBQ0tFVCAgICpwcFBhY2tldCwKKwlJTglQVUNIQVIJCQlwSGVhZGVyLAorCUlOCVVJTlQJCQlIZWFkZXJMZW4sCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUlOVAkJCURhdGFMZW4pCit7CisJUE5ESVNfUEFDS0VUCXBQYWNrZXQ7CisJQVNTRVJUKHBEYXRhKTsKKwlBU1NFUlQoRGF0YUxlbik7CisKKwkvLyAxLiBBbGxvY2F0ZSBhIHBhY2tldAorCXBQYWNrZXQgPSAoUE5ESVNfUEFDS0VUICopIGRldl9hbGxvY19za2IoSGVhZGVyTGVuICsgRGF0YUxlbiArIFRYUEFERElOR19TSVpFKTsKKwlpZiAocFBhY2tldCA9PSBOVUxMKQorIAl7CisJCSpwcFBhY2tldCA9IE5VTEw7CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJSVE1QQWxsb2NhdGVOZGlzUGFja2V0IEZhaWxcblxuIik7CisjZW5kaWYKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJLy8gMi4gY2xvbmUgdGhlIGZyYW1lIGNvbnRlbnQKKwlpZiAoSGVhZGVyTGVuID4gMCkKKwkJTmRpc01vdmVNZW1vcnkoR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpLCBwSGVhZGVyLCBIZWFkZXJMZW4pOworCWlmIChEYXRhTGVuID4gMCkKKwkJTmRpc01vdmVNZW1vcnkoR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpICsgSGVhZGVyTGVuLCBwRGF0YSwgRGF0YUxlbik7CisKKwkvLyAzLiB1cGRhdGUgbGVuZ3RoIG9mIHBhY2tldAorIAlza2JfcHV0KEdFVF9PU19QS1RfVFlQRShwUGFja2V0KSwgSGVhZGVyTGVuK0RhdGFMZW4pOworCisJUlRNUF9TRVRfUEFDS0VUX1NPVVJDRShwUGFja2V0LCBQS1RTUkNfTkRJUyk7CisvLwlwcmludGsoIiVzIDogcFBhY2tldCA9ICVwLCBsZW4gPSAlZFxuIiwgX19mdW5jX18sIHBQYWNrZXQsIEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpKTsKKwkqcHBQYWNrZXQgPSBwUGFja2V0OworCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworfQorCisvKgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVzY3JpcHRpb246CisJVGhpcyByb3V0aW5lIGZyZWVzIGEgbWluaXBvcnQgaW50ZXJuYWxseSBhbGxvY2F0ZWQgTkRJU19QQUNLRVQgYW5kIGl0cworCWNvcnJlc3BvbmRpbmcgTkRJU19CVUZGRVIgYW5kIGFsbG9jYXRlZCBtZW1vcnkuCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUEZyZWVOZGlzUGFja2V0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBORElTX1BBQ0tFVCAgcFBhY2tldCkKK3sKKwlkZXZfa2ZyZWVfc2tiX2FueShSVFBLVF9UT19PU1BLVChwUGFja2V0KSk7Cit9CisKKworLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCisvLyBOT1RFOiB3ZSBkbyBoYXZlIGFuIGFzc3VtcHRpb24gaGVyZSwgdGhhdCBCeXRlMCBhbmQgQnl0ZTEgYWx3YXlzIHJlYXNpZCBhdCB0aGUgc2FtZQorLy8JCQkgc2NhdHRlciBnYXRoZXIgYnVmZmVyCitORElTX1NUQVRVUyBTbmlmZjJCeXRlc0Zyb21OZGlzQnVmZmVyKAorCUlOCVBORElTX0JVRkZFUglwRmlyc3RCdWZmZXIsCisJSU4JVUNIQVIJCQlEZXNpcmVkT2Zmc2V0LAorCU9VVCBQVUNIQVIJCQlwQnl0ZTAsCisJT1VUIFBVQ0hBUgkJCXBCeXRlMSkKK3sKKyAgICAqcEJ5dGUwID0gKihQVUNIQVIpKHBGaXJzdEJ1ZmZlciArIERlc2lyZWRPZmZzZXQpOworICAgICpwQnl0ZTEgPSAqKFBVQ0hBUikocEZpcnN0QnVmZmVyICsgRGVzaXJlZE9mZnNldCArIDEpOworCisJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKwordm9pZCBSVE1QX1F1ZXJ5UGFja2V0SW5mbygKKwlJTiAgUE5ESVNfUEFDS0VUIHBQYWNrZXQsCisJT1VUIFBBQ0tFVF9JTkZPICAqcFBhY2tldEluZm8sCisJT1VUIFBVQ0hBUgkJICpwU3JjQnVmVkEsCisJT1VUCVVJTlQJCSAqcFNyY0J1ZkxlbikKK3sKKwlwUGFja2V0SW5mby0+QnVmZmVyQ291bnQgPSAxOworCXBQYWNrZXRJbmZvLT5wRmlyc3RCdWZmZXIgPSBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CisJcFBhY2tldEluZm8tPlBoeXNpY2FsQnVmZmVyQ291bnQgPSAxOworCXBQYWNrZXRJbmZvLT5Ub3RhbFBhY2tldExlbmd0aCA9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOworCisJKnBTcmNCdWZWQSA9IEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKKwkqcFNyY0J1ZkxlbiA9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOworfQorCit2b2lkIFJUTVBfUXVlcnlOZXh0UGFja2V0SW5mbygKKwlJTiAgUE5ESVNfUEFDS0VUICpwcFBhY2tldCwKKwlPVVQgUEFDS0VUX0lORk8gICpwUGFja2V0SW5mbywKKwlPVVQgUFVDSEFSCQkgKnBTcmNCdWZWQSwKKwlPVVQJVUlOVAkJICpwU3JjQnVmTGVuKQoreworCVBORElTX1BBQ0tFVCBwUGFja2V0ID0gTlVMTDsKKworCWlmICgqcHBQYWNrZXQpCisJCXBQYWNrZXQgPSBHRVRfT1NfUEtUX05FWFQoKnBwUGFja2V0KTsKKworCWlmIChwUGFja2V0KQorCXsKKwkJcFBhY2tldEluZm8tPkJ1ZmZlckNvdW50ID0gMTsKKwkJcFBhY2tldEluZm8tPnBGaXJzdEJ1ZmZlciA9IEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKKwkJcFBhY2tldEluZm8tPlBoeXNpY2FsQnVmZmVyQ291bnQgPSAxOworCQlwUGFja2V0SW5mby0+VG90YWxQYWNrZXRMZW5ndGggPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKKworCQkqcFNyY0J1ZlZBID0gR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOworCQkqcFNyY0J1ZkxlbiA9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOworCQkqcHBQYWNrZXQgPSBHRVRfT1NfUEtUX05FWFQocFBhY2tldCk7CisJfQorCWVsc2UKKwl7CisJCXBQYWNrZXRJbmZvLT5CdWZmZXJDb3VudCA9IDA7CisJCXBQYWNrZXRJbmZvLT5wRmlyc3RCdWZmZXIgPSBOVUxMOworCQlwUGFja2V0SW5mby0+UGh5c2ljYWxCdWZmZXJDb3VudCA9IDA7CisJCXBQYWNrZXRJbmZvLT5Ub3RhbFBhY2tldExlbmd0aCA9IDA7CisKKwkJKnBTcmNCdWZWQSA9IE5VTEw7CisJCSpwU3JjQnVmTGVuID0gMDsKKwkJKnBwUGFja2V0ID0gTlVMTDsKKwl9Cit9CisKKy8vIG5vdCB5ZXQgc3VwcG9ydCBNQlNTCitQTkVUX0RFViBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKyAgICBQTkVUX0RFViBkZXZfcCA9IE5VTEw7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJZGV2X3AgPSBwQWQtPm5ldF9kZXY7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJQVNTRVJUKGRldl9wKTsKKwlyZXR1cm4gZGV2X3A7IC8qIHJldHVybiBvbmUgb2YgTUJTUyAqLworfQorCitQTkRJU19QQUNLRVQgRHVwbGljYXRlUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJc3RydWN0IHNrX2J1ZmYJKnNrYjsKKwlQTkRJU19QQUNLRVQJcFJldFBhY2tldCA9IE5VTEw7CisJVVNIT1JUCQkJRGF0YVNpemU7CisJVUNIQVIJCQkqcERhdGE7CisKKwlEYXRhU2l6ZSA9IChVU0hPUlQpIEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOworCXBEYXRhID0gKFBVQ0hBUikgR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOworCisKKwlza2IgPSBza2JfY2xvbmUoUlRQS1RfVE9fT1NQS1QocFBhY2tldCksIE1FTV9BTExPQ19GTEFHKTsKKwlpZiAoc2tiKQorCXsKKwkJc2tiLT5kZXYgPSBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBGcm9tV2hpY2hCU1NJRCk7CisJCXBSZXRQYWNrZXQgPSBPU1BLVF9UT19SVFBLVChza2IpOworCX0KKworCXJldHVybiBwUmV0UGFja2V0OworCit9CisKK1BORElTX1BBQ0tFVCBkdXBsaWNhdGVfcGt0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBIZWFkZXI4MDJfMywKKyAgICBJTiAgVUlOVCAgICAgICAgICAgIEhkckxlbiwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVTE9ORwkJCURhdGFTaXplLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJc3RydWN0IHNrX2J1ZmYJKnNrYjsKKwlQTkRJU19QQUNLRVQJcFBhY2tldCA9IE5VTEw7CisKKworCWlmICgoc2tiID0gX19kZXZfYWxsb2Nfc2tiKEhkckxlbiArIERhdGFTaXplICsgMiwgTUVNX0FMTE9DX0ZMQUcpKSAhPSBOVUxMKQorCXsKKwkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKKwkJTmRpc01vdmVNZW1vcnkoc2tiLT50YWlsLCBwSGVhZGVyODAyXzMsIEhkckxlbik7CisJCXNrYl9wdXQoc2tiLCBIZHJMZW4pOworCQlOZGlzTW92ZU1lbW9yeShza2ItPnRhaWwsIHBEYXRhLCBEYXRhU2l6ZSk7CisJCXNrYl9wdXQoc2tiLCBEYXRhU2l6ZSk7CisJCXNrYi0+ZGV2ID0gZ2V0X25ldGRldl9mcm9tX2Jzc2lkKHBBZCwgRnJvbVdoaWNoQlNTSUQpOworCQlwUGFja2V0ID0gT1NQS1RfVE9fUlRQS1Qoc2tiKTsKKwl9CisKKwlyZXR1cm4gcFBhY2tldDsKK30KKworCisjZGVmaW5lIFRLSVBfVFhfTUlDX1NJWkUJCTgKK1BORElTX1BBQ0tFVCBkdXBsaWNhdGVfcGt0X3dpdGhfVEtJUF9NSUMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCit7CisJc3RydWN0IHNrX2J1ZmYJKnNrYiwgKm5ld3NrYjsKKworCisJc2tiID0gUlRQS1RfVE9fT1NQS1QocFBhY2tldCk7CisJaWYgKHNrYl90YWlscm9vbShza2IpIDwgVEtJUF9UWF9NSUNfU0laRSkKKwl7CisJCS8vIGFsbG9jIGEgbmV3IHNrYiBhbmQgY29weSB0aGUgcGFja2V0CisJCW5ld3NrYiA9IHNrYl9jb3B5X2V4cGFuZChza2IsIHNrYl9oZWFkcm9vbShza2IpLCBUS0lQX1RYX01JQ19TSVpFLCBHRlBfQVRPTUlDKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJaWYgKG5ld3NrYiA9PSBOVUxMKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFeHRlbmQgVHguTUlDIGZvciBwYWNrZXQgZmFpbGVkISwgZHJvcHBpbmcgcGFja2V0IVxuIikpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJc2tiID0gbmV3c2tiOworCX0KKworCXJldHVybiBPU1BLVF9UT19SVFBLVChza2IpOworfQorCisKKworCitQTkRJU19QQUNLRVQgQ2xvbmVQYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEYXRhU2l6ZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZgkqcFJ4UGt0OworCXN0cnVjdCBza19idWZmCSpwQ2xvbmVkUGt0OworCisJQVNTRVJUKHBQYWNrZXQpOworCXBSeFBrdCA9IFJUUEtUX1RPX09TUEtUKHBQYWNrZXQpOworCisJLy8gY2xvbmUgdGhlIHBhY2tldAorCXBDbG9uZWRQa3QgPSBza2JfY2xvbmUocFJ4UGt0LCBNRU1fQUxMT0NfRkxBRyk7CisKKwlpZiAocENsb25lZFBrdCkKKwl7CisgICAgCS8vIHNldCB0aGUgY29ycmVjdCBkYXRhcHRyIGFuZCBkYXRhIGxlbgorICAgIAlwQ2xvbmVkUGt0LT5kZXYgPSBwUnhQa3QtPmRldjsKKyAgICAJcENsb25lZFBrdC0+ZGF0YSA9IHBEYXRhOworICAgIAlwQ2xvbmVkUGt0LT5sZW4gPSBEYXRhU2l6ZTsKKyAgICAJcENsb25lZFBrdC0+dGFpbCA9IHBDbG9uZWRQa3QtPmRhdGEgKyBwQ2xvbmVkUGt0LT5sZW47CisJCUFTU0VSVChEYXRhU2l6ZSA8IDE1MzApOworCX0KKwlyZXR1cm4gcENsb25lZFBrdDsKK30KKworLy8KKy8vIGNoYW5nZSBPUyBwYWNrZXQgRGF0YVB0ciBhbmQgRGF0YUxlbgorLy8KK3ZvaWQgIHVwZGF0ZV9vc19wYWNrZXRfaW5mbygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOICBVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQoreworCXN0cnVjdCBza19idWZmCSpwT1NQa3Q7CisKKwlBU1NFUlQocFJ4QmxrLT5wUnhQYWNrZXQpOworCXBPU1BrdCA9IFJUUEtUX1RPX09TUEtUKHBSeEJsay0+cFJ4UGFja2V0KTsKKworCXBPU1BrdC0+ZGV2ID0gZ2V0X25ldGRldl9mcm9tX2Jzc2lkKHBBZCwgRnJvbVdoaWNoQlNTSUQpOworCXBPU1BrdC0+ZGF0YSA9IHBSeEJsay0+cERhdGE7CisJcE9TUGt0LT5sZW4gPSBwUnhCbGstPkRhdGFTaXplOworCXBPU1BrdC0+dGFpbCA9IHBPU1BrdC0+ZGF0YSArIHBPU1BrdC0+bGVuOworfQorCisKK3ZvaWQgd2xhbl84MDJfMTFfdG9fODAyXzNfcGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JUFVDSEFSCQkJcEhlYWRlcjgwMl8zLAorCUlOICBVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQoreworCXN0cnVjdCBza19idWZmCSpwT1NQa3Q7CisKKwlBU1NFUlQocFJ4QmxrLT5wUnhQYWNrZXQpOworCUFTU0VSVChwSGVhZGVyODAyXzMpOworCisJcE9TUGt0ID0gUlRQS1RfVE9fT1NQS1QocFJ4QmxrLT5wUnhQYWNrZXQpOworCisJcE9TUGt0LT5kZXYgPSBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBGcm9tV2hpY2hCU1NJRCk7CisJcE9TUGt0LT5kYXRhID0gcFJ4QmxrLT5wRGF0YTsKKwlwT1NQa3QtPmxlbiA9IHBSeEJsay0+RGF0YVNpemU7CisJcE9TUGt0LT50YWlsID0gcE9TUGt0LT5kYXRhICsgcE9TUGt0LT5sZW47CisKKwkvLworCS8vIGNvcHkgODAyLjMgaGVhZGVyCisJLy8KKwkvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJTmRpc01vdmVNZW1vcnkoc2tiX3B1c2gocE9TUGt0LCBMRU5HVEhfODAyXzMpLCBwSGVhZGVyODAyXzMsIExFTkdUSF84MDJfMyk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfQorCisKKwordm9pZCBhbm5vdW5jZV84MDJfM19wYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCit7CisKKwlzdHJ1Y3Qgc2tfYnVmZgkqcFJ4UGt0OworCisJQVNTRVJUKHBQYWNrZXQpOworCisJcFJ4UGt0ID0gUlRQS1RfVE9fT1NQS1QocFBhY2tldCk7CisKKyAgICAvKiBQdXNoIHVwIHRoZSBwcm90b2NvbCBzdGFjayAqLworI2lmZGVmIElLQU5PU19WWF8xWDAKKwlJS0FOT1NfRGF0YUZyYW1lUngocEFkLCBwUnhQa3QtPmRldiwgcFJ4UGt0LCBwUnhQa3QtPmxlbik7CisjZWxzZQorCXBSeFBrdC0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhwUnhQa3QsIHBSeFBrdC0+ZGV2KTsKKworCW5ldGlmX3J4KHBSeFBrdCk7CisjZW5kaWYgLy8gSUtBTk9TX1ZYXzFYMCAvLworfQorCisKK1BSVE1QX1NDQVRURVJfR0FUSEVSX0xJU1QKK3J0X2dldF9zZ19saXN0X2Zyb21fcGFja2V0KFBORElTX1BBQ0tFVCBwUGFja2V0LCBSVE1QX1NDQVRURVJfR0FUSEVSX0xJU1QgKnNnKQoreworCXNnLT5OdW1iZXJPZkVsZW1lbnRzID0gMTsKKwlzZy0+RWxlbWVudHNbMF0uQWRkcmVzcyA9ICBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CisJc2ctPkVsZW1lbnRzWzBdLkxlbmd0aCA9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOworCXJldHVybiAoc2cpOworfQorCit2b2lkIGhleF9kdW1wKGNoYXIgKnN0ciwgdW5zaWduZWQgY2hhciAqcFNyY0J1ZlZBLCB1bnNpZ25lZCBpbnQgU3JjQnVmTGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnB0OworCWludCB4OworCisJaWYgKFJURGVidWdMZXZlbCA8IFJUX0RFQlVHX1RSQUNFKQorCQlyZXR1cm47CisKKwlwdCA9IHBTcmNCdWZWQTsKKwlwcmludGsoIiVzOiAlcCwgbGVuID0gJWRcbiIsc3RyLCAgcFNyY0J1ZlZBLCBTcmNCdWZMZW4pOworCWZvciAoeD0wOyB4PFNyY0J1ZkxlbjsgeCsrKQorCXsKKwkJaWYgKHggJSAxNiA9PSAwKQorCQkJcHJpbnRrKCIweCUwNHggOiAiLCB4KTsKKwkJcHJpbnRrKCIlMDJ4ICIsICgodW5zaWduZWQgY2hhcilwdFt4XSkpOworCQlpZiAoeCUxNiA9PSAxNSkgcHJpbnRrKCJcbiIpOworCX0KKwlwcmludGsoIlxuIik7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlTZW5kIGxvZyBtZXNzYWdlIHRocm91Z2ggd2lyZWxlc3MgZXZlbnQKKworCQlTdXBwb3J0IHN0YW5kYXJkIGl3X2V2ZW50IHdpdGggSVdFVkNVU1RPTS4gSXQgaXMgdXNlZCBiZWxvdy4KKworCQlpd3JlcV9kYXRhLmRhdGEuZmxhZ3MgaXMgdXNlZCB0byBzdG9yZSBldmVudF9mbGFnIHRoYXQgaXMgZGVmaW5lZCBieSB1c2VyLgorCQlpd3JlcV9kYXRhLmRhdGEubGVuZ3RoIGlzIHRoZSBsZW5ndGggb2YgdGhlIGV2ZW50IGxvZy4KKworCQlUaGUgZm9ybWF0IG9mIHRoZSBldmVudCBsb2cgaXMgY29tcG9zZWQgb2YgdGhlIGVudHJ5J3MgTUFDIGFkZHJlc3MgYW5kCisJCXRoZSBkZXNpcmVkIGxvZyBtZXNzYWdlIChyZWZlciB0byBwV2lyZWxlc3NFdmVudFRleHQpLgorCisJCQlleDogMTE6MjI6MzM6NDQ6NTU6NjYgaGFzIGFzc29jaWF0ZWQgc3VjY2Vzc2Z1bGx5CisKKwkJcC5zLiBUaGUgcmVxdWlyZW1lbnQgb2YgV2lyZWxlc3MgRXh0ZW5zaW9uIGlzIHYxNSBvciBuZXdlci4KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUFNlbmRXaXJlbGVzc0V2ZW50KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVTSE9SVAkJCUV2ZW50X2ZsYWcsCisJSU4JUFVDSEFSIAkJCXBBZGRyLAorCUlOCVVDSEFSCQkJQnNzSWR4LAorCUlOCUNIQVIJCQlSc3NpKQoreworI2lmIFdJUkVMRVNTX0VYVCA+PSAxNQorCisJdW5pb24gCWl3cmVxX2RhdGEgICAgICB3cnF1OworCVBVQ0hBUiAJcEJ1ZiA9IE5VTEwsIHBCdWZQdHIgPSBOVUxMOworCVVTSE9SVAlldmVudCwgdHlwZSwgQnVmTGVuOworCVVDSEFSCWV2ZW50X3RhYmxlX2xlbiA9IDA7CisKKwl0eXBlID0gRXZlbnRfZmxhZyAmIDB4RkYwMDsKKwlldmVudCA9IEV2ZW50X2ZsYWcgJiAweDAwRkY7CisKKwlzd2l0Y2ggKHR5cGUpCisJeworCQljYXNlIElXX1NZU19FVkVOVF9GTEFHX1NUQVJUOgorCQkJZXZlbnRfdGFibGVfbGVuID0gSVdfU1lTX0VWRU5UX1RZUEVfTlVNOworCQkJYnJlYWs7CisKKwkJY2FzZSBJV19TUE9PRl9FVkVOVF9GTEFHX1NUQVJUOgorCQkJZXZlbnRfdGFibGVfbGVuID0gSVdfU1BPT0ZfRVZFTlRfVFlQRV9OVU07CisJCQlicmVhazsKKworCQljYXNlIElXX0ZMT09EX0VWRU5UX0ZMQUdfU1RBUlQ6CisJCQlldmVudF90YWJsZV9sZW4gPSBJV19GTE9PRF9FVkVOVF9UWVBFX05VTTsKKwkJCWJyZWFrOworCX0KKworCWlmIChldmVudF90YWJsZV9sZW4gPT0gMCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogVGhlIHR5cGUoJTB4MDJ4KSBpcyBub3QgdmFsaWQuXG4iLCBfX2Z1bmNfXywgdHlwZSkpOworCQlyZXR1cm47CisJfQorCisJaWYgKGV2ZW50ID49IGV2ZW50X3RhYmxlX2xlbikKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogVGhlIGV2ZW50KCUweDAyeCkgaXMgbm90IHZhbGlkLlxuIiwgX19mdW5jX18sIGV2ZW50KSk7CisJCXJldHVybjsKKwl9CisKKwkvL0FsbG9jYXRlIG1lbW9yeSBhbmQgY29weSB0aGUgbXNnLgorCWlmKChwQnVmID0ga21hbGxvYyhJV19DVVNUT01fTUFYX0xFTiwgR0ZQX0FUT01JQykpICE9IE5VTEwpCisJeworCQkvL1ByZXBhcmUgdGhlIHBheWxvYWQKKwkJbWVtc2V0KHBCdWYsIDAsIElXX0NVU1RPTV9NQVhfTEVOKTsKKworCQlwQnVmUHRyID0gcEJ1ZjsKKworCQlpZiAocEFkZHIpCisJCQlwQnVmUHRyICs9IHNwcmludGYocEJ1ZlB0ciwgIihSVDI4NjApIFNUQSglMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCkgIiwgUFJJTlRfTUFDKHBBZGRyKSk7CisJCWVsc2UgaWYgKEJzc0lkeCA8IE1BWF9NQlNTSURfTlVNKQorCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIoUlQyODYwKSBCU1MocmElZCkgIiwgQnNzSWR4KTsKKwkJZWxzZQorCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIoUlQyODYwKSAiKTsKKworCQlpZiAodHlwZSA9PSBJV19TWVNfRVZFTlRfRkxBR19TVEFSVCkKKwkJCXBCdWZQdHIgKz0gc3ByaW50ZihwQnVmUHRyLCAiJXMiLCBwV2lyZWxlc3NTeXNFdmVudFRleHRbZXZlbnRdKTsKKwkJZWxzZSBpZiAodHlwZSA9PSBJV19TUE9PRl9FVkVOVF9GTEFHX1NUQVJUKQorCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIlcyAoUlNTST0lZCkiLCBwV2lyZWxlc3NTcG9vZkV2ZW50VGV4dFtldmVudF0sIFJzc2kpOworCQllbHNlIGlmICh0eXBlID09IElXX0ZMT09EX0VWRU5UX0ZMQUdfU1RBUlQpCisJCQlwQnVmUHRyICs9IHNwcmludGYocEJ1ZlB0ciwgIiVzIiwgcFdpcmVsZXNzRmxvb2RFdmVudFRleHRbZXZlbnRdKTsKKwkJZWxzZQorCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIlcyIsICJ1bmtub3duIGV2ZW50Iik7CisKKwkJcEJ1ZlB0cltwQnVmUHRyIC0gcEJ1Zl0gPSAnXDAnOworCQlCdWZMZW4gPSBwQnVmUHRyIC0gcEJ1ZjsKKworCQltZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisJICAgIHdycXUuZGF0YS5mbGFncyA9IEV2ZW50X2ZsYWc7CisJCXdycXUuZGF0YS5sZW5ndGggPSBCdWZMZW47CisKKwkJLy9zZW5kIHdpcmVsZXNzIGV2ZW50CisJICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgcEJ1Zik7CisKKwkJLy9EQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyA6ICVzXG4iLCBfX2Z1bmNfXywgcEJ1ZikpOworCisJCWtmcmVlKHBCdWYpOworCX0KKwllbHNlCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciB3aXJlbGVzcyBldmVudC5cbiIsIF9fZnVuY19fKSk7CisjZWxzZQorCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogVGhlIFdpcmVsZXNzIEV4dGVuc2lvbiBNVVNUIGJlIHYxNSBvciBuZXdlci5cbiIsIF9fZnVuY19fKSk7CisjZW5kaWYgIC8qIFdJUkVMRVNTX0VYVCA+PSAxNSAqLworfQorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK3ZvaWQgc2VuZF9tb25pdG9yX3BhY2tldHMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaykKK3sKKyAgICBzdHJ1Y3Qgc2tfYnVmZgkqcE9TUGt0OworICAgIHdsYW5fbmdfcHJpc20yX2hlYWRlciAqcGg7CisgICAgaW50IHJhdGVfaW5kZXggPSAwOworICAgIFVTSE9SVCBoZWFkZXJfbGVuID0gMDsKKyAgICBVQ0hBUiB0ZW1wX2hlYWRlcls0MF0gPSB7MH07CisKKyAgICB1X2ludDMyX3QgcmFsaW5rcmF0ZVsyNTZdID0gezIsNCwxMSwyMiwgMTIsMTgsMjQsMzYsNDgsNzIsOTYsICAxMDgsICAgMTA5LCAxMTAsIDExMSwgMTEyLCAxMywgMjYsIDM5LCA1Miw3OCwxMDQsIDExNywgMTMwLCAyNiwgNTIsIDc4LDEwNCwgMTU2LCAyMDgsIDIzNCwgMjYwLCAyNywgNTQsODEsMTA4LDE2MiwgMjE2LCAyNDMsIDI3MCwgLy8gTGFzdCAzOAorCTU0LCAxMDgsIDE2MiwgMjE2LCAzMjQsIDQzMiwgNDg2LCA1NDAsICAxNCwgMjksIDQzLCA1NywgODcsIDExNSwgMTMwLCAxNDQsIDI5LCA1OSw4NywxMTUsIDE3MywgMjMwLDI2MCwgMjg4LCAzMCwgNjAsOTAsMTIwLDE4MCwyNDAsMjcwLDMwMCw2MCwxMjAsMTgwLDI0MCwzNjAsNDgwLDU0MCw2MDAsIDAsMSwyLDMsNCw1LDYsNyw4LDksMTAsCisJMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsNDEsNDIsNDMsNDQsNDUsNDYsNDcsNDgsNDksNTAsNTEsNTIsNTMsNTQsNTUsNTYsNTcsNTgsNTksNjAsNjEsNjIsNjMsNjQsNjUsNjYsNjcsNjgsNjksNzAsNzEsNzIsNzMsNzQsNzUsNzYsNzcsNzgsNzksODB9OworCisKKyAgICBBU1NFUlQocFJ4QmxrLT5wUnhQYWNrZXQpOworICAgIGlmIChwUnhCbGstPkRhdGFTaXplIDwgMTApCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFNpemUgaXMgdG9vIHNtYWxsISAoJWQpXG4iLCBfX2Z1bmNfXywgcFJ4QmxrLT5EYXRhU2l6ZSkpOworCQlnb3RvIGVycl9mcmVlX3NrX2J1ZmY7CisgICAgfQorCisgICAgaWYgKHBSeEJsay0+RGF0YVNpemUgKyBzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKSA+IFJYX0JVRkZFUl9BR0dSRVNJWkUpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFNpemUgaXMgdG9vIGxhcmdlISAoJWQpXG4iLCBfX2Z1bmNfXywgcFJ4QmxrLT5EYXRhU2l6ZSArIHNpemVvZih3bGFuX25nX3ByaXNtMl9oZWFkZXIpKSk7CisJCWdvdG8gZXJyX2ZyZWVfc2tfYnVmZjsKKyAgICB9CisKKyAgICBwT1NQa3QgPSBSVFBLVF9UT19PU1BLVChwUnhCbGstPnBSeFBhY2tldCk7CisJcE9TUGt0LT5kZXYgPSBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBCU1MwKTsKKyAgICBpZiAocFJ4QmxrLT5wSGVhZGVyLT5GQy5UeXBlID09IEJUWVBFX0RBVEEpCisgICAgeworICAgICAgICBwUnhCbGstPkRhdGFTaXplIC09IExFTkdUSF84MDJfMTE7CisgICAgICAgIGlmICgocFJ4QmxrLT5wSGVhZGVyLT5GQy5Ub0RzID09IDEpICYmCisgICAgICAgICAgICAocFJ4QmxrLT5wSGVhZGVyLT5GQy5GckRzID09IDEpKQorICAgICAgICAgICAgaGVhZGVyX2xlbiA9IExFTkdUSF84MDJfMTFfV0lUSF9BRERSNDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaGVhZGVyX2xlbiA9IExFTkdUSF84MDJfMTE7CisKKyAgICAgICAgLy8gUU9TCisgICAgCWlmIChwUnhCbGstPnBIZWFkZXItPkZDLlN1YlR5cGUgJiAweDA4KQorICAgIAl7CisgICAgCSAgICBoZWFkZXJfbGVuICs9IDI7CisgICAgCQkvLyBEYXRhIHNraXAgUU9TIGNvbnRvcmwgZmllbGQKKyAgICAJCXBSeEJsay0+RGF0YVNpemUgLT0yOworICAgIAl9CisKKyAgICAJLy8gT3JkZXIgYml0OiBBLVJhbGluayBvciBIVEMrCisgICAgCWlmIChwUnhCbGstPnBIZWFkZXItPkZDLk9yZGVyKQorICAgIAl7CisgICAgCSAgICBoZWFkZXJfbGVuICs9IDQ7CisJCQkvLyBEYXRhIHNraXAgSFRDIGNvbnRvcmwgZmllbGQKKwkJCXBSeEJsay0+RGF0YVNpemUgLT0gNDsKKyAgICAJfQorCisgICAgICAgIC8vIENvcHkgSGVhZGVyCisgICAgICAgIGlmIChoZWFkZXJfbGVuIDw9IDQwKQorICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkodGVtcF9oZWFkZXIsIHBSeEJsay0+cERhdGEsIGhlYWRlcl9sZW4pOworCisgICAgICAgIC8vIHNraXAgSFcgcGFkZGluZworICAgIAlpZiAocFJ4QmxrLT5SeEQuTDJQQUQpCisgICAgCSAgICBwUnhCbGstPnBEYXRhICs9IChoZWFkZXJfbGVuICsgMik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBSeEJsay0+cERhdGEgKz0gaGVhZGVyX2xlbjsKKyAgICB9IC8vZW5kIGlmCisKKworCWlmIChwUnhCbGstPkRhdGFTaXplIDwgcE9TUGt0LT5sZW4pIHsKKyAgICAgICAgc2tiX3RyaW0ocE9TUGt0LHBSeEJsay0+RGF0YVNpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNrYl9wdXQocE9TUGt0LChwUnhCbGstPkRhdGFTaXplIC0gcE9TUGt0LT5sZW4pKTsKKyAgICB9IC8vZW5kIGlmCisKKyAgICBpZiAoKHBSeEJsay0+cERhdGEgLSBwT1NQa3QtPmRhdGEpID4gMCkgeworCSAgICBza2JfcHV0KHBPU1BrdCwocFJ4QmxrLT5wRGF0YSAtIHBPU1BrdC0+ZGF0YSkpOworCSAgICBza2JfcHVsbChwT1NQa3QsKHBSeEJsay0+cERhdGEgLSBwT1NQa3QtPmRhdGEpKTsKKyAgICB9IC8vZW5kIGlmCisKKyAgICBpZiAoc2tiX2hlYWRyb29tKHBPU1BrdCkgPCAoc2l6ZW9mKHdsYW5fbmdfcHJpc20yX2hlYWRlcikrIGhlYWRlcl9sZW4pKSB7CisgICAgICAgIGlmIChwc2tiX2V4cGFuZF9oZWFkKHBPU1BrdCwgKHNpemVvZih3bGFuX25nX3ByaXNtMl9oZWFkZXIpICsgaGVhZGVyX2xlbiksIDAsIEdGUF9BVE9NSUMpKSB7CisJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFJlYWxsb2NhdGUgaGVhZGVyIHNpemUgb2Ygc2tfYnVmZiBmYWlsIVxuIiwgX19mdW5jX18pKTsKKwkJCWdvdG8gZXJyX2ZyZWVfc2tfYnVmZjsKKwkgICAgfSAvL2VuZCBpZgorICAgIH0gLy9lbmQgaWYKKworICAgIGlmIChoZWFkZXJfbGVuID4gMCkKKyAgICAgICAgTmRpc01vdmVNZW1vcnkoc2tiX3B1c2gocE9TUGt0LCBoZWFkZXJfbGVuKSwgdGVtcF9oZWFkZXIsIGhlYWRlcl9sZW4pOworCisgICAgcGggPSAod2xhbl9uZ19wcmlzbTJfaGVhZGVyICopIHNrYl9wdXNoKHBPU1BrdCwgc2l6ZW9mKHdsYW5fbmdfcHJpc20yX2hlYWRlcikpOworCU5kaXNaZXJvTWVtb3J5KHBoLCBzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKSk7CisKKyAgICBwaC0+bXNnY29kZQkJICAgID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybTsKKwlwaC0+bXNnbGVuCQkgICAgPSBzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKTsKKwlzdHJjcHkocGgtPmRldm5hbWUsIHBBZC0+bmV0X2Rldi0+bmFtZSk7CisKKyAgICBwaC0+aG9zdHRpbWUuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9ob3N0dGltZTsKKwlwaC0+aG9zdHRpbWUuc3RhdHVzID0gMDsKKwlwaC0+aG9zdHRpbWUubGVuID0gNDsKKwlwaC0+aG9zdHRpbWUuZGF0YSA9IGppZmZpZXM7CisKKwlwaC0+bWFjdGltZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX21hY3RpbWU7CisJcGgtPm1hY3RpbWUuc3RhdHVzID0gMDsKKwlwaC0+bWFjdGltZS5sZW4gPSAwOworCXBoLT5tYWN0aW1lLmRhdGEgPSAwOworCisgICAgcGgtPmlzdHguZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9pc3R4OworCXBoLT5pc3R4LnN0YXR1cyA9IDA7CisJcGgtPmlzdHgubGVuID0gMDsKKwlwaC0+aXN0eC5kYXRhID0gMDsKKworICAgIHBoLT5jaGFubmVsLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fY2hhbm5lbDsKKwlwaC0+Y2hhbm5lbC5zdGF0dXMgPSAwOworCXBoLT5jaGFubmVsLmxlbiA9IDQ7CisKKyAgICBwaC0+Y2hhbm5lbC5kYXRhID0gKHVfaW50MzJfdClwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCisgICAgcGgtPnJzc2kuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9yc3NpOworCXBoLT5yc3NpLnN0YXR1cyA9IDA7CisJcGgtPnJzc2kubGVuID0gNDsKKyAgICBwaC0+cnNzaS5kYXRhID0gKHVfaW50MzJfdClSVE1QTWF4UnNzaShwQWQsIENvbnZlcnRUb1Jzc2kocEFkLCBwUnhCbGstPnBSeFdJLT5SU1NJMCwgUlNTSV8wKSwgQ29udmVydFRvUnNzaShwQWQsIHBSeEJsay0+cFJ4V0ktPlJTU0kxLCBSU1NJXzEpLCBDb252ZXJ0VG9Sc3NpKHBBZCwgcFJ4QmxrLT5wUnhXSS0+UlNTSTIsIFJTU0lfMikpOzsKKworCXBoLT5zaWduYWwuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9zaWduYWw7CisJcGgtPnNpZ25hbC5zdGF0dXMgPSAwOworCXBoLT5zaWduYWwubGVuID0gNDsKKwlwaC0+c2lnbmFsLmRhdGEgPSAwOyAvL3Jzc2kgKyBub2lzZTsKKworCXBoLT5ub2lzZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX25vaXNlOworCXBoLT5ub2lzZS5zdGF0dXMgPSAwOworCXBoLT5ub2lzZS5sZW4gPSA0OworCXBoLT5ub2lzZS5kYXRhID0gMDsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgIGlmIChwUnhCbGstPnBSeFdJLT5QSFlNT0RFID49IE1PREVfSFRNSVgpCisgICAgeworICAgIAlyYXRlX2luZGV4ID0gMTYgKyAoKFVDSEFSKXBSeEJsay0+cFJ4V0ktPkJXICoxNikgKyAoKFVDSEFSKXBSeEJsay0+cFJ4V0ktPlNob3J0R0kgKjMyKSArICgoVUNIQVIpcFJ4QmxrLT5wUnhXSS0+TUNTKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCWlmIChwUnhCbGstPnBSeFdJLT5QSFlNT0RFID09IE1PREVfT0ZETSkKKyAgICAJcmF0ZV9pbmRleCA9IChVQ0hBUikocFJ4QmxrLT5wUnhXSS0+TUNTKSArIDQ7CisgICAgZWxzZQorICAgIAlyYXRlX2luZGV4ID0gKFVDSEFSKShwUnhCbGstPnBSeFdJLT5NQ1MpOworICAgIGlmIChyYXRlX2luZGV4IDwgMCkKKyAgICAgICAgcmF0ZV9pbmRleCA9IDA7CisgICAgaWYgKHJhdGVfaW5kZXggPiAyNTUpCisgICAgICAgIHJhdGVfaW5kZXggPSAyNTU7CisKKwlwaC0+cmF0ZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3JhdGU7CisJcGgtPnJhdGUuc3RhdHVzID0gMDsKKwlwaC0+cmF0ZS5sZW4gPSA0OworICAgIHBoLT5yYXRlLmRhdGEgPSByYWxpbmtyYXRlW3JhdGVfaW5kZXhdOworCisJcGgtPmZybWxlbi5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2ZybWxlbjsKKyAgICBwaC0+ZnJtbGVuLnN0YXR1cyA9IDA7CisJcGgtPmZybWxlbi5sZW4gPSA0OworCXBoLT5mcm1sZW4uZGF0YQk9ICh1X2ludDMyX3QpcFJ4QmxrLT5EYXRhU2l6ZTsKKworCisgICAgcE9TUGt0LT5wa3RfdHlwZSA9IFBBQ0tFVF9PVEhFUkhPU1Q7CisgICAgcE9TUGt0LT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHBPU1BrdCwgcE9TUGt0LT5kZXYpOworICAgIHBPU1BrdC0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKyAgICBuZXRpZl9yeChwT1NQa3QpOworCisgICAgcmV0dXJuOworCitlcnJfZnJlZV9za19idWZmOgorCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJcmV0dXJuOworCit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwordm9pZCBydG1wX29zX3RocmVhZF9pbml0KFBVQ0hBUiBwVGhyZWFkTmFtZSwgUFZPSUQgcE5vdGlmeSkKK3sKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwlkYWVtb25pemUocFRocmVhZE5hbWUgLyoiJXMiLHBBZC0+bmV0X2Rldi0+bmFtZSovKTsKKworCWFsbG93X3NpZ25hbChTSUdURVJNKTsKKwlhbGxvd19zaWduYWwoU0lHS0lMTCk7CisJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CisjZWxzZQorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkYWVtb25pemUoKTsKKwlyZXBhcmVudF90b19pbml0KCk7CisJc3RyY3B5KGN1cnJlbnQtPmNvbW0sIHBUaHJlYWROYW1lKTsKKworCXNpZ2luaXRzZXRpbnYoJmN1cnJlbnQtPmJsb2NrZWQsIHNpZ21hc2soU0lHVEVSTSkgfCBzaWdtYXNrKFNJR0tJTEwpKTsKKworCS8qIEFsbG93IGludGVyY2VwdGlvbiBvZiBTSUdLSUxMIG9ubHkKKwkgKiBEb24ndCBhbGxvdyBvdGhlciBzaWduYWxzIHRvIGludGVycnVwdCB0aGUgdHJhbnNtaXNzaW9uICovCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw0LDIyKQorCXNwaW5fbG9ja19pcnFzYXZlKCZjdXJyZW50LT5zaWdtYXNrX2xvY2ssIGZsYWdzKTsKKwlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOworCXJlY2FsY19zaWdwZW5kaW5nKGN1cnJlbnQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN1cnJlbnQtPnNpZ21hc2tfbG9jaywgZmxhZ3MpOworI2VuZGlmCisjZW5kaWYKKworICAgIC8qIHNpZ25hbCB0aGF0IHdlJ3ZlIHN0YXJ0ZWQgdGhlIHRocmVhZCAqLworCWNvbXBsZXRlKHBOb3RpZnkpOworCit9CisKK3ZvaWQgUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCXsKKwkJaWYgKHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID09IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkKQorCQl7CisJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TVEFfTElOS1VQX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TVEFfTElOS0RPV05fRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKwkJfQorCX0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9saW51eC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9saW51eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZDU4ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2xpbnV4LmgKQEAgLTAsMCArMSw5MjYgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgUHJvZ3JhbTogICAgcnRfbGludXguYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQ3JlYXRlZDogICAgNC8yMS8yMDA2IDE6MTc6MzggUE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQXV0aG9yOiAgICAgV3UgWGktS3VuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQ29tbWVudHM6ICAgYGRlc2NyaXB0aW9uYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEhpc3Rvcnk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFJldmlzaW9uIDEuMSA0LzIxLzIwMDYgMToxNzozOCBQTSAgeHNpa3VuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEluaXRpYWwgcmV2aXNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInJ0bXBfdHlwZS5oIgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworCisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorCisvLyBsb2FkIGZpcm13YXJlCisjZGVmaW5lIF9fS0VSTkVMX1NZU0NBTExTX18KKyNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisKKyNkZWZpbmUgTUVNX0FMTE9DX0ZMQUcgICAgICAoR0ZQX0FUT01JQykgLy8oR0ZQX0RNQSB8IEdGUF9BVE9NSUMpCisKKyNpZm5kZWYgSUZOQU1TSVoKKyNkZWZpbmUgSUZOQU1TSVogMTYKKyNlbmRpZgorCisvLyNkZWZpbmUgQ09ORklHX0NLSVBfU1VQUE9SVAorCisjdW5kZWYgX19pbmxpbmUKKyNkZWZpbmUgX19pbmxpbmUJICAgc3RhdGljIGlubGluZQorCit0eXBlZGVmIGludCAoKkhBUkRfU1RBUlRfWE1JVF9GVU5DKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CisKKy8vIGFkZCBieSBrYXRoeQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUlQyODYwCisjZGVmaW5lIFNUQV9QUk9GSUxFX1BBVEgJCQkiL2V0Yy9XaXJlbGVzcy9SVDI4NjBTVEEvUlQyODYwU1RBLmRhdCIKKyNkZWZpbmUgU1RBX1JUTVBfRklSTVdBUkVfRklMRV9OQU1FICIvZXRjL1dpcmVsZXNzL1JUMjg2MFNUQS9SVDI4NjBTVEEuYmluIgorI2RlZmluZSBTVEFfTklDX0RFVklDRV9OQU1FCQkJIlJUMjg2MFNUQSIKKyNkZWZpbmUgU1RBX0RSSVZFUl9WRVJTSU9OCQkJIjEuOC4wLjAiCisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisjZGVmaW5lIENBUkRfSU5GT19QQVRICQkJIi9ldGMvV2lyZWxlc3MvUlQyODYwU1RBL1JUMjg2MFNUQUNhcmQuZGF0IgorI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFJUMjg2MCAvLworCisKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIFJUMjg2MAorI2lmbmRlZiBQQ0lfREVWSUNFCisjZGVmaW5lIFBDSV9ERVZJQ0UodmVuZCxkZXYpIFwKKwkudmVuZG9yID0gKHZlbmQpLCAuZGV2aWNlID0gKGRldiksIFwKKwkuc3VidmVuZG9yID0gUENJX0FOWV9JRCwgLnN1YmRldmljZSA9IFBDSV9BTllfSUQKKyNlbmRpZiAvLyBQQ0lfREVWSUNFIC8vCisjZW5kaWYgLy8gUlQyODYwIC8vCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisKKyNkZWZpbmUgUlRNUF9USU1FX0FGVEVSKGEsYikJCVwKKwkodHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsICh1bnNpZ25lZCBsb25nKWEpICYmIFwKKwkgdHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsICh1bnNpZ25lZCBsb25nKWIpICYmIFwKKwkgKChsb25nKShiKSAtIChsb25nKShhKSA8IDApKQorCisjZGVmaW5lIFJUTVBfVElNRV9BRlRFUl9FUShhLGIpCVwKKwkodHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsICh1bnNpZ25lZCBsb25nKWEpICYmIFwKKwkgdHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsICh1bnNpZ25lZCBsb25nKWIpICYmIFwKKwkgKChsb25nKShhKSAtIChsb25nKShiKSA+PSAwKSkKKyNkZWZpbmUgUlRNUF9USU1FX0JFRk9SRShhLGIpCVJUTVBfVElNRV9BRlRFUl9FUShiLGEpCisjZWxzZQorI2RlZmluZSBSVE1QX1RJTUVfQUZURVIoYSxiKSB0aW1lX2FmdGVyKGEsIGIpCisjZW5kaWYKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKyNkZWZpbmUgUlRfTU9EX0lOQ19VU0VfQ09VTlQoKSBcCisJaWYgKCF0cnlfbW9kdWxlX2dldChUSElTX01PRFVMRSkpIFwKKwl7IFwKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IGNhbm5vdCByZXNlcnZlIG1vZHVsZVxuIiwgX19mdW5jX18pKTsgXAorCQlyZXR1cm4gLTE7IFwKKwl9CisKKyNkZWZpbmUgUlRfTU9EX0RFQ19VU0VfQ09VTlQoKSBtb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKKyNlbHNlCisjZGVmaW5lIFJUX01PRF9JTkNfVVNFX0NPVU5UKCkJTU9EX0lOQ19VU0VfQ09VTlQ7CisjZGVmaW5lIFJUX01PRF9ERUNfVVNFX0NPVU5UKCkgTU9EX0RFQ19VU0VfQ09VTlQ7CisjZW5kaWYKKworI2RlZmluZSBPU19IWgkJCUhaCisKKyNkZWZpbmUgRVRIX0xFTkdUSF9PRl9BRERSRVNTCTYKKworI2RlZmluZSBJTgorI2RlZmluZSBPVVQKKworI2RlZmluZSBORElTX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UCisjZGVmaW5lIE5ESVNfU1RBVFVTX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIE5ESVNfU1RBVFVTX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQQkJCQkweDAyCisjZGVmaW5lIE5ESVNfU1RBVFVTX1JFU09VUkNFUyAgICAgICAgICAgICAgICAgICAweDAzCisKKyNkZWZpbmUgTUlOX05FVF9ERVZJQ0VfRk9SX0FJRAkJCTB4MDAJCS8vMHgwMH4weDNmCisjZGVmaW5lIE1JTl9ORVRfREVWSUNFX0ZPUl9NQlNTSUQJCTB4MDAJCS8vMHgwMCwweDEwLDB4MjAsMHgzMAorI2RlZmluZSBNSU5fTkVUX0RFVklDRV9GT1JfV0RTCQkJMHgxMAkJLy8weDQwLDB4NTAsMHg2MCwweDcwCisjZGVmaW5lIE1JTl9ORVRfREVWSUNFX0ZPUl9BUENMSQkJMHgyMAorI2RlZmluZSBNSU5fTkVUX0RFVklDRV9GT1JfTUVTSAkJCTB4MzAKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNkZWZpbmUgTUlOX05FVF9ERVZJQ0VfRk9SX0RMUwkJCTB4NDAKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZGVmaW5lIE5ESVNfUEFDS0VUX1RZUEVfRElSRUNURUQJCTAKKyNkZWZpbmUgTkRJU19QQUNLRVRfVFlQRV9NVUxUSUNBU1QJCTEKKyNkZWZpbmUgTkRJU19QQUNLRVRfVFlQRV9CUk9BRENBU1QJCTIKKyNkZWZpbmUgTkRJU19QQUNLRVRfVFlQRV9BTExfTVVMVElDQVNUCTMKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpCit0eXBlZGVmCXN0cnVjdCBwaWQgKglUSFJFQURfUElEOworI2RlZmluZQlUSFJFQURfUElEX0lOSVRfVkFMVUUJTlVMTAorI2RlZmluZQlHRVRfUElEKF92KQlmaW5kX2dldF9waWQoX3YpCisjZGVmaW5lCUdFVF9QSURfTlVNQkVSKF92KQlwaWRfbnIoX3YpCisjZGVmaW5lIENIRUNLX1BJRF9MRUdBTElUWShfcGlkKQlpZiAocGlkX25yKF9waWQpID49IDApCisjZGVmaW5lIEtJTExfVEhSRUFEX1BJRChfQSwgX0IsIF9DKQlraWxsX3BpZChfQSwgX0IsIF9DKQorI2Vsc2UKK3R5cGVkZWYJcGlkX3QJVEhSRUFEX1BJRDsKKyNkZWZpbmUJVEhSRUFEX1BJRF9JTklUX1ZBTFVFCS0xCisjZGVmaW5lCUdFVF9QSUQoX3YpCV92CisjZGVmaW5lCUdFVF9QSURfTlVNQkVSKF92KQlfdgorI2RlZmluZSBDSEVDS19QSURfTEVHQUxJVFkoX3BpZCkJaWYgKF9waWQgPj0gMCkKKyNkZWZpbmUgS0lMTF9USFJFQURfUElEKF9BLCBfQiwgX0MpCWtpbGxfcHJvYyhfQSwgX0IsIF9DKQorI2VuZGlmCisKK3N0cnVjdCBvc19sb2NrICB7CisJc3BpbmxvY2tfdAkJbG9jazsKKwl1bnNpZ25lZCBsb25nICAJZmxhZ3M7Cit9OworCisKK3N0cnVjdCBvc19jb29raWUgeworI2lmZGVmIFJUMjg2MAorCXN0cnVjdCBwY2lfZGV2IAkJCSpwY2lfZGV2OworCXN0cnVjdCBwY2lfZGV2IAkJCSpwYXJlbnRfcGNpX2RldjsKKwlkbWFfYWRkcl90CQkgIAkJcEFkX3BhOworI2VuZGlmIC8vIFJUMjg2MCAvLworCisKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgCXJ4X2RvbmVfdGFzazsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgCW1nbXRfZG1hX2RvbmVfdGFzazsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgCWFjMF9kbWFfZG9uZV90YXNrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAJYWMxX2RtYV9kb25lX3Rhc2s7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IAlhYzJfZG1hX2RvbmVfdGFzazsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgCWFjM19kbWFfZG9uZV90YXNrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAJaGNjYV9kbWFfZG9uZV90YXNrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAl0YnR0X3Rhc2s7CisjaWZkZWYgUlQyODYwCisJc3RydWN0IHRhc2tsZXRfc3RydWN0CWZpZm9fc3RhdGlzdGljX2Z1bGxfdGFzazsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCisJdW5zaWduZWQgbG9uZwkJCWFwZF9waWQ7IC8vODAyLjF4IGRhZW1vbiBwaWQKKwlJTlQJCQkJCQlpb2N0bF9pZl90eXBlOworCUlOVCAJCQkJCWlvY3RsX2lmOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1ZJUlRVQUxfQURBUFRFUgoreworCXN0cnVjdCBuZXRfZGV2aWNlCQkqUnRtcERldjsKKwlzdHJ1Y3QgbmV0X2RldmljZQkJKlZpcnR1YWxEZXY7Cit9IFZJUlRVQUxfQURBUFRFUiwgUFZJUlRVQUxfQURBUFRFUjsKKworI3VuZGVmICBBU1NFUlQKKyNkZWZpbmUgQVNTRVJUKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCEoeCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HIF9fRklMRV9fICI6JWQgYXNzZXJ0ICIgI3ggImZhaWxlZFxuIiwgX19MSU5FX18pOyAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKwordHlwZWRlZiBzdHJ1Y3Qgb3NfY29va2llCSogUE9TX0NPT0tJRTsKK3R5cGVkZWYgc3RydWN0IHBjaV9kZXYgCQkqIFBQQ0lfREVWOwordHlwZWRlZiBzdHJ1Y3QgbmV0X2RldmljZQkqIFBORVRfREVWOwordHlwZWRlZiB2b2lkCQkJCSogUE5ESVNfUEFDS0VUOwordHlwZWRlZiBjaGFyCQkJCU5ESVNfUEFDS0VUOwordHlwZWRlZiBQTkRJU19QQUNLRVQJCSogUFBORElTX1BBQ0tFVDsKK3R5cGVkZWYJZG1hX2FkZHJfdAkJCU5ESVNfUEhZU0lDQUxfQUREUkVTUzsKK3R5cGVkZWYJZG1hX2FkZHJfdAkJCSogUE5ESVNfUEhZU0lDQUxfQUREUkVTUzsKK3R5cGVkZWYgc3BpbmxvY2tfdAkJCU5ESVNfU1BJTl9MT0NLOwordHlwZWRlZiBzdHJ1Y3QgdGltZXJfbGlzdAlORElTX01JTklQT1JUX1RJTUVSOwordHlwZWRlZiB2b2lkCQkJCSogTkRJU19IQU5ETEU7Cit0eXBlZGVmIGNoYXIgCQkJCSogUE5ESVNfQlVGRkVSOworCisKKwordm9pZCBoZXhfZHVtcChjaGFyICpzdHIsIHVuc2lnbmVkIGNoYXIgKnBTcmNCdWZWQSwgdW5zaWduZWQgaW50IFNyY0J1Zkxlbik7CisKK2RtYV9hZGRyX3QgbGludXhfcGNpX21hcF9zaW5nbGUodm9pZCAqaGFuZGxlLCB2b2lkICpwdHIsIHNpemVfdCBzaXplLCBpbnQgc2RfaWR4LCBpbnQgZGlyZWN0aW9uKTsKK3ZvaWQgbGludXhfcGNpX3VubWFwX3NpbmdsZSh2b2lkICpoYW5kbGUsIGRtYV9hZGRyX3QgZG1hX2FkZHIsIHNpemVfdCBzaXplLCBpbnQgZGlyZWN0aW9uKTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBNT1ZFIFRPIHJ0bXAuaCA/CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBQS1RTUkNfTkRJUyAgICAgICAgICAgICAweDdmCisjZGVmaW5lIFBLVFNSQ19EUklWRVIgICAgICAgICAgIDB4MGYKKyNkZWZpbmUgUFJJTlRfTUFDKGFkZHIpCVwKKwlhZGRyWzBdLCBhZGRyWzFdLCBhZGRyWzJdLCBhZGRyWzNdLCBhZGRyWzRdLCBhZGRyWzVdCisKKworI2RlZmluZSBSVDI4NjBfUENJX0RFVklDRV9JRAkJMHgwNjAxCisKKyNpZmRlZiBSVDI4NjAKKyNkZWZpbmUgUENJX01BUF9TSU5HTEUoX2hhbmRsZSwgX3B0ciwgX3NpemUsIF9zZF9pZHgsIF9kaXIpIFwKKwlsaW51eF9wY2lfbWFwX3NpbmdsZShfaGFuZGxlLCBfcHRyLCBfc2l6ZSwgX3NkX2lkeCwgX2RpcikKKworI2RlZmluZSBQQ0lfVU5NQVBfU0lOR0xFKF9oYW5kbGUsIF9wdHIsIF9zaXplLCBfZGlyKSBcCisJbGludXhfcGNpX3VubWFwX3NpbmdsZShfaGFuZGxlLCBfcHRyLCBfc2l6ZSwgX2RpcikKKworI2RlZmluZSBQQ0lfQUxMT0NfQ09OU0lTVEVOVChfcGNpX2RldiwgX3NpemUsIF9wdHIpIFwKKwlwY2lfYWxsb2NfY29uc2lzdGVudChfcGNpX2RldiwgX3NpemUsIF9wdHIpCisKKyNkZWZpbmUgUENJX0ZSRUVfQ09OU0lTVEVOVChfcGNpX2RldiwgX3NpemUsIF92aXJ0dWFsX2FkZHIsIF9waHlzaWNhbF9hZGRyKSBcCisJcGNpX2ZyZWVfY29uc2lzdGVudChfcGNpX2RldiwgX3NpemUsIF92aXJ0dWFsX2FkZHIsIF9waHlzaWNhbF9hZGRyKQorCisjZGVmaW5lIERFVl9BTExPQ19TS0IoX2xlbmd0aCkgXAorCWRldl9hbGxvY19za2IoX2xlbmd0aCkKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCisKKyNkZWZpbmUgQkVBQ09OX0ZSQU1FX0RNQV9DQUNIRV9XQkFDSyhfcHRyLCBfc2l6ZSkJXAorCWRtYV9jYWNoZV93YmFjayhfcHRyLCBfc2l6ZSkKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCisjZGVmaW5lIE5kaXNNSW5kaWNhdGVTdGF0dXMoX3csIF94LCBfeSwgX3opCisKKwordHlwZWRlZiBzdHJ1Y3QgdGltZXJfbGlzdAlSVE1QX09TX1RJTUVSOworCisKKwordHlwZWRlZiBzdHJ1Y3QgIF9SQUxJTktfVElNRVJfU1RSVUNUICAgIHsKKyAgICBSVE1QX09TX1RJTUVSCQlUaW1lck9iajsgICAgICAgLy8gTmRpcyBUaW1lciBvYmplY3QKKwlCT09MRUFOCQkJCVZhbGlkOwkJCS8vIFNldCB0byBUcnVlIHdoZW4gY2FsbCBSVE1QSW5pdFRpbWVyCisgICAgQk9PTEVBTiAgICAgICAgICAgICBTdGF0ZTsgICAgICAgICAgLy8gVHJ1ZSBpZiB0aW1lciBjYW5jZWxsZWQKKyAgICBCT09MRUFOCSAgICAgIAkJUGVyaW9kaWNUeXBlOwkvLyBUcnVlIGlmIHRpbWVyIGlzIHBlcmlvZGljIHRpbWVyCisgICAgQk9PTEVBTiAgICAgICAgICAgICBSZXBlYXQ7ICAgICAgICAgLy8gVHJ1ZSBpZiBwZXJpb2RpYyB0aW1lcgorICAgIFVMT05HICAgICAgICAgICAgICAgVGltZXJWYWx1ZTsgICAgIC8vIFRpbWVyIHZhbHVlIGluIG1pbGxpc2Vjb25kcworCVVMT05HCQkJCWNvb2tpZTsJCQkvLyBvcyBzcGVjaWZpYyBvYmplY3QKK30gICBSQUxJTktfVElNRVJfU1RSVUNULCAqUFJBTElOS19USU1FUl9TVFJVQ1Q7CisKKworCisKKy8vI2RlZmluZSBEQkcJMQorCisvLworLy8gIE1BQ1JPIGZvciBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KKy8vCisKKyNpZmRlZiBEQkcKK2V4dGVybiBVTE9ORyAgICBSVERlYnVnTGV2ZWw7CisKKyNkZWZpbmUgREJHUFJJTlRfUkFXKExldmVsLCBGbXQpICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoTGV2ZWwgPD0gUlREZWJ1Z0xldmVsKSAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcHJpbnRrIEZtdDsgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgREJHUFJJTlQoTGV2ZWwsIEZtdCkgICAgREJHUFJJTlRfUkFXKExldmVsLCBGbXQpCisKKworI2RlZmluZSBEQkdQUklOVF9FUlIoRm10KSAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHByaW50aygiRVJST1IhISEgIik7ICAgICAgICAgIFwKKyAgICBwcmludGsgRm10OyAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBEQkdQUklOVF9TKFN0YXR1cywgRm10KQkJXAorewkJCQkJCQkJCVwKKwlwcmludGsgRm10OwkJCQkJXAorfQorCisKKyNlbHNlCisjZGVmaW5lIERCR1BSSU5UKExldmVsLCBGbXQpCisjZGVmaW5lIERCR1BSSU5UX1JBVyhMZXZlbCwgRm10KQorI2RlZmluZSBEQkdQUklOVF9TKFN0YXR1cywgRm10KQorI2RlZmluZSBEQkdQUklOVF9FUlIoRm10KQorI2VuZGlmCisKKworLy8KKy8vICBzcGluX2xvY2sgZW5oYW5jZWQgZm9yIE5lc3RlZCBzcGluIGxvY2sKKy8vCisjZGVmaW5lIE5kaXNBbGxvY2F0ZVNwaW5Mb2NrKF9fbG9jaykgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNwaW5fbG9ja19pbml0KChzcGlubG9ja190ICopKF9fbG9jaykpOyAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBOZGlzRnJlZVNwaW5Mb2NrKGxvY2spICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSBSVE1QX1NFTV9MT0NLKF9fbG9jaykJCQkJCVwKK3sJCQkJCQkJCQkJCQlcCisJc3Bpbl9sb2NrX2JoKChzcGlubG9ja190ICopKF9fbG9jaykpOwkJCQlcCit9CisKKyNkZWZpbmUgUlRNUF9TRU1fVU5MT0NLKF9fbG9jaykJCQkJCVwKK3sJCQkJCQkJCQkJCQlcCisJc3Bpbl91bmxvY2tfYmgoKHNwaW5sb2NrX3QgKikoX19sb2NrKSk7CQkJCVwKK30KKworLy8gc2FtcGxlLCB1c2Ugc2VtYXBob3JlIGxvY2sgdG8gcmVwbGFjZSBJUlEgbG9jaywgMjAwNy8xMS8xNQorI2RlZmluZSBSVE1QX0lSUV9MT0NLKF9fbG9jaywgX19pcnFmbGFncykJCQlcCit7CQkJCQkJCQkJCQkJCVwKKwlfX2lycWZsYWdzID0gMDsJCQkJCQkJCQlcCisJc3Bpbl9sb2NrX2JoKChzcGlubG9ja190ICopKF9fbG9jaykpOwkJCVwKKwlwQWQtPmlycV9kaXNhYmxlZCB8PSAxOyBcCit9CisKKyNkZWZpbmUgUlRNUF9JUlFfVU5MT0NLKF9fbG9jaywgX19pcnFmbGFnKQkJCVwKK3sJCQkJCQkJCQkJCQkJXAorCXBBZC0+aXJxX2Rpc2FibGVkICY9IDA7IFwKKwlzcGluX3VubG9ja19iaCgoc3BpbmxvY2tfdCAqKShfX2xvY2spKTsJCQlcCit9CisKKyNkZWZpbmUgUlRNUF9JTlRfTE9DSyhfX2xvY2ssIF9faXJxZmxhZ3MpCQkJXAorewkJCQkJCQkJCQkJCQlcCisJc3Bpbl9sb2NrX2lycXNhdmUoKHNwaW5sb2NrX3QgKilfX2xvY2ssIF9faXJxZmxhZ3MpOwlcCit9CisKKyNkZWZpbmUgUlRNUF9JTlRfVU5MT0NLKF9fbG9jaywgX19pcnFmbGFnKQkJCVwKK3sJCQkJCQkJCQkJCQkJXAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoKHNwaW5sb2NrX3QgKikoX19sb2NrKSwgKCh1bnNpZ25lZCBsb25nKV9faXJxZmxhZykpOwlcCit9CisKKyNpZmRlZiBSVDI4NjAKKyNpZiBkZWZpbmVkKElORl9UV0lOUEFTUykgfHwgZGVmaW5lZChJTkZfREFOVUJFKSB8fCBkZWZpbmVkKElLQU5PU19WWF8xWDApCisvL1BhdGNoIGZvciBBU0lDIHR1cnN0IHJlYWQvd3JpdGUgYnVnLCBuZWVkcyB0byByZW1vdmUgYWZ0ZXIgbWV0ZWwgZml4CisjZGVmaW5lIFJUTVBfSU9fUkVBRDMyKF9BLCBfUiwgX3BWKQkJCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJCVwKKyAgICBpZiAoKF9BKS0+YlBDSWNsa09mZiA9PSBGQUxTRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoKl9wViA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgTUFDX0NTUjApKSk7CQlcCisJKCpfcFYgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUikpKSk7CQkJXAorCSgqX3BWID0gU1dBUDMyKCooKFVJTlQzMiAqKShfcFYpKSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNkZWZpbmUgUlRNUF9JT19SRUFEOChfQSwgX1IsIF9wVikJCQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJCQlcCisJKCpfcFYgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIE1BQ19DU1IwKSkpOwkJXAorCSgqX3BWID0gcmVhZGIoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IpKSkpOwkJCVwKK30KKyNkZWZpbmUgUlRNUF9JT19XUklURTMyKF9BLCBfUiwgX1YpCQkJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCQkJXAorICAgIGlmICgoX0EpLT5iUENJY2xrT2ZmID09IEZBTFNFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCVVJTlQzMglfVmFsOwkJCQkJCQkJCQkJCQlcCisJX1ZhbCA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgTUFDX0NTUjApKTsJCVwKKwlfVmFsID0gU1dBUDMyKF9WKTsJCQkJCQkJCQkJCQlcCisJd3JpdGVsKF9WYWwsICh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpOwkJCVwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNkZWZpbmUgUlRNUF9JT19XUklURTgoX0EsIF9SLCBfVikJCQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJCQlcCisJVUlOVAlWYWw7CQkJCQkJCQkJCQkJCVwKKwlWYWwgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIE1BQ19DU1IwKSk7CQlcCisJd3JpdGViKChfViksIChQVUNIQVIpKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpOwkJCVwKK30KKyNkZWZpbmUgUlRNUF9JT19XUklURTE2KF9BLCBfUiwgX1YpCQkJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCQkJXAorCVVJTlQJVmFsOwkJCQkJCQkJCQkJCQlcCisJVmFsID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpOwkJXAorCXdyaXRldyhTV0FQMTYoKF9WKSksIChQVVNIT1JUKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUikpKTsJXAorfQorI2Vsc2UKKy8vUGF0Y2ggZm9yIEFTSUMgdHVyc3QgcmVhZC93cml0ZSBidWcsIG5lZWRzIHRvIHJlbW92ZSBhZnRlciBtZXRlbCBmaXgKKyNkZWZpbmUgUlRNUF9JT19SRUFEMzIoX0EsIF9SLCBfcFYpCQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJCVwKKyAgICBpZiAoKF9BKS0+YlBDSWNsa09mZiA9PSBGQUxTRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCSgqX3BWID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpKTsJCVwKKwkJKCpfcFYgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUikpKSk7CQkJXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZQkJCQkJCQkJCQkJCQkJCVwKKwkJKl9wViA9IDA7CQkJCQkJCQkJCQkJCVwKK30KKyNkZWZpbmUgUlRNUF9JT19SRUFEOChfQSwgX1IsIF9wVikJCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJXAorCSgqX3BWID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpKTsJCQlcCisJKCpfcFYgPSByZWFkYigodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUikpKSk7CQkJCVwKK30KKyNkZWZpbmUgUlRNUF9JT19XUklURTMyKF9BLCBfUiwgX1YpCQkJCQkJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCQkJCQkJXAorICAgIGlmICgoX0EpLT5iUENJY2xrT2ZmID09IEZBTFNFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlVSU5UCVZhbDsJCQkJCQkJCQkJCQkJCQkJXAorCVZhbCA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgTUFDX0NTUjApKTsJCQlcCisJd3JpdGVsKF9WLCAodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUikpKTsJCQkJCQkJCVwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2lmIGRlZmluZWQoQlJDTV82MzU4KQorI2RlZmluZSBSVE1QX0lPX1dSSVRFOChfQSwgX1IsIF9WKSAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgIFwKKwlVTE9ORyBWYWw7ICAgICAgICAgICAgICAgIFwKKwlVQ0hBUiBfaTsgICAgICAgICAgICAgICAgXAorCV9pID0gKF9SICYgMHgzKTsgICAgICAgICAgICAgXAorCVZhbCA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SIC0gX2kpKSk7ICAgXAorCVZhbCA9IFZhbCAmICh+KDB4MDAwMDAwZmYgPDwgKChfaSkqOCkpKTsgICAgICAgICBcCisJVmFsID0gVmFsIHwgKChVTE9ORylfViA8PCAoKF9pKSo4KSk7ICAgICAgICAgXAorCXdyaXRlbCgoVmFsKSwgKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IgLSBfaSkpKTsgICAgXAorfQorI2Vsc2UKKyNkZWZpbmUgUlRNUF9JT19XUklURTgoX0EsIF9SLCBfVikJCQkJCQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJVUlOVAlWYWw7CQkJCQkJCQkJCQkJCQkJCVwKKwlWYWwgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIE1BQ19DU1IwKSk7CQkJXAorCXdyaXRlYigoX1YpLCAoUFVDSEFSKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUikpKTsJCVwKK30KKyNlbmRpZgorI2RlZmluZSBSVE1QX0lPX1dSSVRFMTYoX0EsIF9SLCBfVikJCQkJCQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJVUlOVAlWYWw7CQkJCQkJCQkJCQkJCQkJCVwKKwlWYWwgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIE1BQ19DU1IwKSk7CQkJXAorCXdyaXRldygoX1YpLCAoUFVTSE9SVCkoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IpKSk7CVwKK30KKyNlbmRpZgorI2VuZGlmIC8vIFJUMjg2MCAvLworCisKKyNpZm5kZWYgd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQKKyNkZWZpbmUgX193YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh3cSwgY29uZGl0aW9uLCByZXQpIFwKK2RvIHsgXAorICAgICAgICB3YWl0X3F1ZXVlX3QgX193YWl0OyBcCisgICAgICAgIGluaXRfd2FpdHF1ZXVlX2VudHJ5KCZfX3dhaXQsIGN1cnJlbnQpOyBcCisgICAgICAgIGFkZF93YWl0X3F1ZXVlKCZ3cSwgJl9fd2FpdCk7IFwKKyAgICAgICAgZm9yICg7OykgeyBcCisgICAgICAgICAgICAgICAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsgXAorICAgICAgICAgICAgICAgIGlmIChjb25kaXRpb24pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyBcCisgICAgICAgICAgICAgICAgaWYgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBzY2hlZHVsZV90aW1lb3V0KHJldCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmV0KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyBcCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgXAorICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIHJldCA9IC1FUkVTVEFSVFNZUzsgXAorICAgICAgICAgICAgICAgIGJyZWFrOyBcCisgICAgICAgIH0gXAorICAgICAgICBjdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsgXAorICAgICAgICByZW1vdmVfd2FpdF9xdWV1ZSgmd3EsICZfX3dhaXQpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHdxLCBjb25kaXRpb24sIHRpbWVvdXQpIFwKKyh7IFwKKyAgICAgICAgbG9uZyBfX3JldCA9IHRpbWVvdXQ7IFwKKyAgICAgICAgaWYgKCEoY29uZGl0aW9uKSkgXAorICAgICAgICAgICAgICAgIF9fd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQod3EsIGNvbmRpdGlvbiwgX19yZXQpOyBcCisgICAgICAgIF9fcmV0OyBcCit9KQorI2VuZGlmCisjZGVmaW5lIE9ORV9USUNLIDEKKyNkZWZpbmUgT1NfV0FJVChfdGltZSkgXAorewlpbnQgX2k7IFwKKwlsb25nIF9sb29wID0gKChfdGltZSkvKDEwMDAvT1NfSFopKSA+IDAgPyAoKF90aW1lKS8oMTAwMC9PU19IWikpIDogMTtcCisJd2FpdF9xdWV1ZV9oZWFkX3QgX3dhaXQ7IFwKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZfd2FpdCk7IFwKKwlmb3IgKF9pPTA7IF9pPChfbG9vcCk7IF9pKyspIFwKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoX3dhaXQsIDAsIE9ORV9USUNLKTsgfQorCisKKy8qIE1vZGlmaWVkIGJ5IFd1IFhpLUt1biA0LzIxLzIwMDYgKi8KK3R5cGVkZWYgdm9pZCAoKlRJTUVSX0ZVTkNUSU9OKSh1bnNpZ25lZCBsb25nKTsKKworI2RlZmluZSBDT1BZX01BQ19BRERSKEFkZHIxLCBBZGRyMikgICAgICAgICAgICAgbWVtY3B5KChBZGRyMSksIChBZGRyMiksIE1BQ19BRERSX0xFTikKKworI2RlZmluZSBNbG1lQWxsb2NhdGVNZW1vcnkoX3BBZCwgX3BwVkEpIG9zX2FsbG9jX21lbShfcEFkLCBfcHBWQSwgTUdNVF9ETUFfQlVGRkVSX1NJWkUpCisjZGVmaW5lIE1sbWVGcmVlTWVtb3J5KF9wQWQsIF9wVkEpICAgICBvc19mcmVlX21lbShfcEFkLCBfcFZBKQorCisjaWZkZWYgUlQyODYwCisjZGVmaW5lIEJVSUxEX1RJTUVSX0ZVTkNUSU9OKF9mdW5jKQkJCQkJCQkJCQkJCVwKK3ZvaWQgbGludXhfIyNfZnVuYyh1bnNpZ25lZCBsb25nIGRhdGEpCQkJCQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJUFJBTElOS19USU1FUl9TVFJVQ1QJcFRpbWVyID0gKFBSQUxJTktfVElNRVJfU1RSVUNUKSBkYXRhOwkJCQlcCisJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwlfZnVuYyhOVUxMLCAoUFZPSUQpIHBUaW1lci0+Y29va2llLCBOVUxMLCBwVGltZXIpOyAJCQkJCQkJXAorCWlmIChwVGltZXItPlJlcGVhdCkJCQkJCQkJCQkJCQkJCQlcCisJCVJUTVBfT1NfQWRkX1RpbWVyKCZwVGltZXItPlRpbWVyT2JqLCBwVGltZXItPlRpbWVyVmFsdWUpOwkJCQlcCit9CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKworCisjZGVmaW5lIERFQ0xBUkVfVElNRVJfRlVOQ1RJT04oX2Z1bmMpCQkJXAordm9pZCBsaW51eF8jI19mdW5jKHVuc2lnbmVkIGxvbmcgZGF0YSkKKworI2RlZmluZSBHRVRfVElNRVJfRlVOQ1RJT04oX2Z1bmMpCQkJCVwKKwkJbGludXhfIyNfZnVuYworCitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKE1sbWVQZXJpb2RpY0V4ZWMpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihNbG1lUnNzaVJlcG9ydEV4ZWMpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihBc2ljUnhBbnRFdmFsVGltZW91dCk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKEFQU0RQZXJpb2RpY0V4ZWMpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihBc2ljUmZUdW5pbmdFeGVjKTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKEJlYWNvblRpbWVvdXQpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihTY2FuVGltZW91dCk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKEF1dGhUaW1lb3V0KTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oQXNzb2NUaW1lb3V0KTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oUmVhc3NvY1RpbWVvdXQpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihEaXNhc3NvY1RpbWVvdXQpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihMaW5rRG93bkV4ZWMpOworI2lmZGVmIExFQVBfU1VQUE9SVAorREVDTEFSRV9USU1FUl9GVU5DVElPTihMZWFwQXV0aFRpbWVvdXQpOworI2VuZGlmCitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihXcGFEaXNhc3NvY0FwQW5kQmxvY2tBc3NvYyk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKFBzUG9sbFdha2VFeGVjKTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oUmFkaW9PbkV4ZWMpOworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKERsc1RpbWVvdXRBY3Rpb24pOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCit2b2lkIFJUTVBfR2V0Q3VycmVudFN5c3RlbVRpbWUoTEFSR0VfSU5URUdFUiAqdGltZSk7CisKKworLyoKKyAqIHBhY2tldCBoZWxwZXIKKyAqIAktIGNvbnZlcnQgaW50ZXJuYWwgcnQgcGFja2V0IHRvIG9zIHBhY2tldCBvcgorICogICAgICAgICAgICAgb3MgcGFja2V0IHRvIHJ0IHBhY2tldAorICovCisjZGVmaW5lIFJUUEtUX1RPX09TUEtUKF9wKQkJKChzdHJ1Y3Qgc2tfYnVmZiAqKShfcCkpCisjZGVmaW5lIE9TUEtUX1RPX1JUUEtUKF9wKQkJKChQTkRJU19QQUNLRVQpKF9wKSkKKworI2RlZmluZSBHRVRfT1NfUEtUX0RBVEFQVFIoX3BrdCkgXAorCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCktPmRhdGEpCisKKyNkZWZpbmUgR0VUX09TX1BLVF9MRU4oX3BrdCkgXAorCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCktPmxlbikKKworI2RlZmluZSBHRVRfT1NfUEtUX0RBVEFUQUlMKF9wa3QpIFwKKwkJKFJUUEtUX1RPX09TUEtUKF9wa3QpLT50YWlsKQorCisjZGVmaW5lIEdFVF9PU19QS1RfSEVBRChfcGt0KSBcCisJCShSVFBLVF9UT19PU1BLVChfcGt0KS0+aGVhZCkKKworI2RlZmluZSBHRVRfT1NfUEtUX0VORChfcGt0KSBcCisJCShSVFBLVF9UT19PU1BLVChfcGt0KS0+ZW5kKQorCisjZGVmaW5lIEdFVF9PU19QS1RfTkVUREVWKF9wa3QpIFwKKwkJKFJUUEtUX1RPX09TUEtUKF9wa3QpLT5kZXYpCisKKyNkZWZpbmUgR0VUX09TX1BLVF9UWVBFKF9wa3QpIFwKKwkJKFJUUEtUX1RPX09TUEtUKF9wa3QpKQorCisjZGVmaW5lIEdFVF9PU19QS1RfTkVYVChfcGt0KSBcCisJCShSVFBLVF9UT19PU1BLVChfcGt0KS0+bmV4dCkKKworCisjZGVmaW5lIE9TX05UT0hTKF9WYWwpIFwKKwkJKG50b2hzKF9WYWwpKQorI2RlZmluZSBPU19IVE9OUyhfVmFsKSBcCisJCShodG9ucyhfVmFsKSkKKyNkZWZpbmUgT1NfTlRPSEwoX1ZhbCkgXAorCQkobnRvaGwoX1ZhbCkpCisjZGVmaW5lIE9TX0hUT05MKF9WYWwpIFwKKwkJKGh0b25sKF9WYWwpKQorCisvKiBzdGF0aXN0aWNzIGNvdW50ZXIgKi8KKyNkZWZpbmUgU1RBVFNfSU5DX1JYX1BBQ0tFVFMoX3BBZCwgX2RldikKKyNkZWZpbmUgU1RBVFNfSU5DX1RYX1BBQ0tFVFMoX3BBZCwgX2RldikKKworI2RlZmluZSBTVEFUU19JTkNfUlhfQllURVNTKF9wQWQsIF9kZXYsIGxlbikKKyNkZWZpbmUgU1RBVFNfSU5DX1RYX0JZVEVTUyhfcEFkLCBfZGV2LCBsZW4pCisKKyNkZWZpbmUgU1RBVFNfSU5DX1JYX0VSUk9SUyhfcEFkLCBfZGV2KQorI2RlZmluZSBTVEFUU19JTkNfVFhfRVJST1JTKF9wQWQsIF9kZXYpCisKKyNkZWZpbmUgU1RBVFNfSU5DX1JYX0RST1BQRUQoX3BBZCwgX2RldikKKyNkZWZpbmUgU1RBVFNfSU5DX1RYX0RST1BQRUQoX3BBZCwgX2RldikKKworCisjZGVmaW5lIENCX09GRiAgMTAKKworCisvLyAgIGNoZWNrIERESyBORElTX1BBQ0tFVCBkYXRhIHN0cnVjdHVyZSBhbmQgZmluZCBvdXQgb25seSBNaW5pcG9ydFJlc2VydmVkRXhbMC4uN10gY2FuIGJlIHVzZWQgYnkgb3VyIGRyaXZlciB3aXRob3V0CisvLyAgIGFtYmlndWl0eS4gRmllbGRzIGFmdGVyIHBQYWNrZXQtPk1pbmlwb3J0UmVzZXJ2ZWRFeFs4XSBtYXkgYmUgdXNlZCBieSBvdGhlciB3cmFwcGVyIGxheWVyIHRodXMgY3Jhc2hlcyB0aGUgZHJpdmVyCisvLworCisvLyBVc2VyIFByaW9yaXR5CisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9VUChfcCwgX3ByaW8pCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzBdID0gX3ByaW8pCisjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9VUChfcCkJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRiswXSkKKworLy8gRnJhZ21lbnQgIworI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfRlJBR01FTlRTKF9wLCBfbnVtKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzFdID0gX251bSkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0ZSQUdNRU5UUyhfcCkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMV0pCisKKy8vIDB4MCB+MHg3ZjogVFggdG8gQVAncyBvd24gQlNTIHdoaWNoIGhhcyB0aGUgc3BlY2lmaWVkIEFJRC4gaWYgQUlEPjEyNywgc2V0IGJpdCA3IGluIFJUTVBfU0VUX1BBQ0tFVF9FTUFDVEFCIHRvby4KKy8vKHRoaXMgdmFsdWUgYWxzbyBhcyBNQUMob24tY2hpcCBXQ0lEKSB0YWJsZSBpbmRleCkKKy8vIDB4ODB+MHhmZjogVFggdG8gYSBXRFMgbGluay4gYjB+NjogV0RTIGluZGV4CisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9XQ0lEKF9wLCBfd2RzaWR4KQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzJdID0gX3dkc2lkeCkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX1dDSUQoX3ApICAgICAgICAgIAkJKChVQ0hBUikoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMl0pKQorCisvLyAweGZmOiBQS1RTUkNfTkRJUywgb3RoZXJzOiBsb2NhbCBUWCBidWZmZXIgaW5kZXguIFRoaXMgdmFsdWUgYWZmZWN0cyBob3cgdG8gYSBwYWNrZXQKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX1NPVVJDRShfcCwgX3BrdHNyYykJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRiszXSA9IF9wa3RzcmMpCisjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9TT1VSQ0UoX3ApICAgICAgIAkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzNdKQorCisvLyBSVFMvQ1RTLXRvLXNlbGYgcHJvdGVjdGlvbiBtZXRob2QKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX1JUUyhfcCwgX251bSkgICAgICAJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis0XSA9IF9udW0pCisjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9SVFMoX3ApICAgICAgICAgIAkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzRdKQorLy8gc2VlIFJUTVBfUyhHKUVUX1BBQ0tFVF9FTUFDVEFCCisKKy8vIFRYIHJhdGUgaW5kZXgKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX1RYUkFURShfcCwgX3JhdGUpCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrNV0gPSBfcmF0ZSkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX1RYUkFURShfcCkJCSAgCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrNV0pCisKKy8vIEZyb20gd2hpY2ggSW50ZXJmYWNlCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9JRihfcCwgX2lmZHgpCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrNl0gPSBfaWZkeCkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0lGKF9wKQkJICAJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis2XSkKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX05FVF9ERVZJQ0VfTUJTU0lEKF9wLCBfYnNzKQkJUlRNUF9TRVRfUEFDS0VUX0lGKChfcCksIChfYnNzKSkKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX05FVF9ERVZJQ0VfV0RTKF9wLCBfYnNzKQkJUlRNUF9TRVRfUEFDS0VUX0lGKChfcCksICgoX2JzcykgKyBNSU5fTkVUX0RFVklDRV9GT1JfV0RTKSkKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX05FVF9ERVZJQ0VfQVBDTEkoX3AsIF9pZHgpICAgCVJUTVBfU0VUX1BBQ0tFVF9JRigoX3ApLCAoKF9pZHgpICsgTUlOX05FVF9ERVZJQ0VfRk9SX0FQQ0xJKSkKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX05FVF9ERVZJQ0VfTUVTSChfcCwgX2lkeCkgICAJUlRNUF9TRVRfUEFDS0VUX0lGKChfcCksICgoX2lkeCkgKyBNSU5fTkVUX0RFVklDRV9GT1JfTUVTSCkpCisjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9ORVRfREVWSUNFX01CU1NJRChfcCkJCQlSVE1QX0dFVF9QQUNLRVRfSUYoKF9wKSkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX05FVF9ERVZJQ0UoX3ApCQkJCQlSVE1QX0dFVF9QQUNLRVRfSUYoKF9wKSkKKworI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfTU9SRURBVEEoX3AsIF9tb3JlYml0KQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzddID0gX21vcmViaXQpCisjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9NT1JFREFUQShfcCkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzddKQorCisKKyNpZiAwCisvLyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX0RIQ1AoX3AsIF9mbGcpICAgCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gPSBfZmxnKQorLy8jZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9ESENQKF9wKSAgICAgICAgIAkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKQorI2Vsc2UKKy8vCisvLwlTZXBjaWZpYyBQYWtjZXQgVHlwZSBkZWZpbml0aW9uCisvLworI2RlZmluZSBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19DQl9PRkZTRVQJMTEKKworI2RlZmluZSBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19ESENQCQkweDAxCisjZGVmaW5lIFJUTVBfUEFDS0VUX1NQRUNJRklDX0VBUE9MCQkweDAyCisjZGVmaW5lIFJUTVBfUEFDS0VUX1NQRUNJRklDX0lQVjQJCTB4MDQKKyNkZWZpbmUgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfV0FJCQkweDA4CisjZGVmaW5lIFJUTVBfUEFDS0VUX1NQRUNJRklDX1ZMQU4JCTB4MTAKKyNkZWZpbmUgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfTExDU05BUAkweDIwCisKKy8vU3BlY2lmaWMKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX1NQRUNJRklDKF9wLCBfZmxnKQkgICAJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSA9IF9mbGcpCisKKy8vREhDUAorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfREhDUChfcCwgX2ZsZykgICAJCQkJCQkJCQkJCQkJXAorCQkJZG97CQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJaWYgKF9mbGcpCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pIHw9IChSVE1QX1BBQ0tFVF9TUEVDSUZJQ19ESENQKTsJCVwKKwkJCQllbHNlCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKSAmPSAoIVJUTVBfUEFDS0VUX1NQRUNJRklDX0RIQ1ApOwlcCisJCQl9d2hpbGUoMCkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0RIQ1AoX3ApCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdICYgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfREhDUCkKKworLy9FQVBPTAorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfRUFQT0woX3AsIF9mbGcpICAgCQkJCQkJCQkJCQkJCVwKKwkJCWRvewkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCWlmIChfZmxnKQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKSB8PSAoUlRNUF9QQUNLRVRfU1BFQ0lGSUNfRUFQT0wpOwkJXAorCQkJCWVsc2UJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pICY9ICghUlRNUF9QQUNLRVRfU1BFQ0lGSUNfRUFQT0wpOwlcCisJCQl9d2hpbGUoMCkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0VBUE9MKF9wKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSAmIFJUTVBfUEFDS0VUX1NQRUNJRklDX0VBUE9MKQorCisvL1dBSQorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfV0FJKF9wLCBfZmxnKSAgIAkJCQkJCQkJCQkJCQlcCisJCQlkb3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQlpZiAoX2ZsZykJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgfD0gKFJUTVBfUEFDS0VUX1NQRUNJRklDX1dBSSk7CQlcCisJCQkJZWxzZQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgJj0gKCFSVE1QX1BBQ0tFVF9TUEVDSUZJQ19XQUkpOwlcCisJCQl9d2hpbGUoMCkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX1dBSShfcCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gJiBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19XQUkpCisKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0xPV1JBVEUoX3ApCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdICYgKFJUTVBfUEFDS0VUX1NQRUNJRklDX0VBUE9MIHwgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfREhDUCB8IFJUTVBfUEFDS0VUX1NQRUNJRklDX1dBSSkpCisKKy8vVkxBTgorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfVkxBTihfcCwgX2ZsZykgICAJCQkJCQkJCQkJCQkJXAorCQkJZG97CQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJaWYgKF9mbGcpCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pIHw9IChSVE1QX1BBQ0tFVF9TUEVDSUZJQ19WTEFOKTsJCVwKKwkJCQllbHNlCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKSAmPSAoIVJUTVBfUEFDS0VUX1NQRUNJRklDX1ZMQU4pOwlcCisJCQl9d2hpbGUoMCkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX1ZMQU4oX3ApCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdICYgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfVkxBTikKKworLy9MTEMvU05BUAorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfTExDU05BUChfcCwgX2ZsZykgICAJCQkJCQkJCQkJCQkJXAorCQkJZG97CQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJaWYgKF9mbGcpCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pIHw9IChSVE1QX1BBQ0tFVF9TUEVDSUZJQ19MTENTTkFQKTsJCVwKKwkJCQllbHNlCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKSAmPSAoIVJUTVBfUEFDS0VUX1NQRUNJRklDX0xMQ1NOQVApOwkJXAorCQkJfXdoaWxlKDApCisKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0xMQ1NOQVAoX3ApCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdICYgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfTExDU05BUCkKKworLy8gSVAKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX0lQVjQoX3AsIF9mbGcpCQkJCQkJCQkJCQkJCQlcCisJCQlkb3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQlpZiAoX2ZsZykJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgfD0gKFJUTVBfUEFDS0VUX1NQRUNJRklDX0lQVjQpOwkJXAorCQkJCWVsc2UJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pICY9ICghUlRNUF9QQUNLRVRfU1BFQ0lGSUNfSVBWNCk7CVwKKwkJCX13aGlsZSgwKQorCisjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9JUFY0KF9wKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSAmIFJUTVBfUEFDS0VUX1NQRUNJRklDX0lQVjQpCisKKyNlbmRpZgorCisKKy8vIElmIHRoaXMgZmxhZyBpcyBzZXQsIGl0IGluZGljYXRlcyB0aGF0IHRoaXMgRUFQb0wgZnJhbWUgTVVTVCBiZSBjbGVhci4KKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX0NMRUFSX0VBUF9GUkFNRShfcCwgX2ZsZykgICAoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTJdID0gX2ZsZykKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0NMRUFSX0VBUF9GUkFNRShfcCkgICAgICAgICAoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTJdKQorCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF81VlQoX3AsIF9mbGcpICAgKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzIyXSA9IF9mbGcpCisjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF81VlQoX3ApICAgICAgICAgKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzIyXSkKKworI2lmZGVmIENPTkZJR181VlRfRU5IQU5DRQorI2RlZmluZSBCUklER0VfVEFHIDB4MzU1NjQyNTIgICAgLy8gZGVwZW5kcyBvbiA1VlQgZGVmaW5lIGluIGJyX2lucHV0LmMKKyNlbmRpZgorCisKKyNkZWZpbmUgTkRJU19TRVRfUEFDS0VUX1NUQVRVUyhfcCwgX3N0YXR1cykKKworCisjZGVmaW5lIEdFVF9TR19MSVNUX0ZST01fUEFDS0VUKF9wLCBfc2MpCVwKKyAgICBydF9nZXRfc2dfbGlzdF9mcm9tX3BhY2tldChfcCwgX3NjKQorCisjZGVmaW5lIE5kaXNNb3ZlTWVtb3J5KERlc3RpbmF0aW9uLCBTb3VyY2UsIExlbmd0aCkgbWVtbW92ZShEZXN0aW5hdGlvbiwgU291cmNlLCBMZW5ndGgpCisjZGVmaW5lIE5kaXNaZXJvTWVtb3J5KERlc3RpbmF0aW9uLCBMZW5ndGgpICAgICAgICAgbWVtc2V0KERlc3RpbmF0aW9uLCAwLCBMZW5ndGgpCisjZGVmaW5lIE5kaXNGaWxsTWVtb3J5KERlc3RpbmF0aW9uLCBMZW5ndGgsIEZpbGwpICAgbWVtc2V0KERlc3RpbmF0aW9uLCBGaWxsLCBMZW5ndGgpCisjZGVmaW5lIE5kaXNFcXVhbE1lbW9yeShTb3VyY2UxLCBTb3VyY2UyLCBMZW5ndGgpICAgKCFtZW1jbXAoU291cmNlMSwgU291cmNlMiwgTGVuZ3RoKSkKKyNkZWZpbmUgUlRNUEVxdWFsTWVtb3J5KFNvdXJjZTEsIFNvdXJjZTIsIExlbmd0aCkJKCFtZW1jbXAoU291cmNlMSwgU291cmNlMiwgTGVuZ3RoKSkKKworCisjZGVmaW5lIFJUTVBfSU5DX1JFRihfQSkJCTAKKyNkZWZpbmUgUlRNUF9ERUNfUkVGKF9BKQkJMAorI2RlZmluZSBSVE1QX0dFVF9SRUYoX0EpCQkwCisKKworCisvKgorICogVUxPTkcKKyAqIFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KAorICogICBJTiBORElTX1BIWVNJQ0FMX0FERFJFU1MgIFBoeXNpY2FsQWRkcmVzcyk7CisgKi8KKyNkZWZpbmUgUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3coUGh5c2ljYWxBZGRyZXNzKQkJKFBoeXNpY2FsQWRkcmVzcykKKworLyoKKyAqIFVMT05HCisgKiBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2goCisgKiAgIElOIE5ESVNfUEhZU0lDQUxfQUREUkVTUyAgUGh5c2ljYWxBZGRyZXNzKTsKKyAqLworI2RlZmluZSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2goUGh5c2ljYWxBZGRyZXNzKQkJKDApCisKKy8qCisgKiBWT0lECisgKiBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdygKKyAqICAgSU4gTkRJU19QSFlTSUNBTF9BRERSRVNTICBQaHlzaWNhbEFkZHJlc3MsCisgKiAgIElOIFVMT05HICBWYWx1ZSk7CisgKi8KKyNkZWZpbmUgUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NMb3coUGh5c2ljYWxBZGRyZXNzLCBWYWx1ZSkJXAorCQkJUGh5c2ljYWxBZGRyZXNzID0gVmFsdWU7CisKKy8qCisgKiBWT0lECisgKiBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0hpZ2goCisgKiAgIElOIE5ESVNfUEhZU0lDQUxfQUREUkVTUyAgUGh5c2ljYWxBZGRyZXNzLAorICogICBJTiBVTE9ORyAgVmFsdWUpOworICovCisjZGVmaW5lIFJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaChQaHlzaWNhbEFkZHJlc3MsIFZhbHVlKQorCisKKy8vQ09OVEFJTklOR19SRUNPUkQocEVudHJ5LCBORElTX1BBQ0tFVCwgTWluaXBvcnRSZXNlcnZlZEV4KTsKKyNkZWZpbmUgUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBFbnRyeSkgXAorCShQTkRJU19QQUNLRVQpKHBFbnRyeSkKKworI2RlZmluZSBQQUNLRVRfVE9fUVVFVUVfRU5UUlkocFBhY2tldCkgXAorCShQUVVFVUVfRU5UUlkpKHBQYWNrZXQpCisKKworI2lmbmRlZiBDT05UQUlOSU5HX1JFQ09SRAorI2RlZmluZSBDT05UQUlOSU5HX1JFQ09SRChhZGRyZXNzLCB0eXBlLCBmaWVsZCkJCQlcCisoKHR5cGUgKikoKFBDSEFSKShhZGRyZXNzKSAtIG9mZnNldG9mKHR5cGUsIGZpZWxkKSkpCisjZW5kaWYKKworCisjZGVmaW5lIFJFTEVBU0VfTkRJU19QQUNLRVQoX3BBZCwgX3BQYWNrZXQsIF9TdGF0dXMpICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFJUTVBGcmVlTmRpc1BhY2tldChfcEFkLCBfcFBhY2tldCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSBTV0lUQ0hfUGh5QUIoX3BBQSwgX3BCQikgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBVTE9ORwlBQUJhc2VQYUhpZ2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVMT05HCUFBQmFzZVBhTG93OyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBVTE9ORwlCQkJhc2VQYUhpZ2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVMT05HCUJCQmFzZVBhTG93OyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCQkJhc2VQYUhpZ2ggPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2goX3BCQik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCQkJhc2VQYUxvdyA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KF9wQkIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQUFCYXNlUGFIaWdoID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NIaWdoKF9wQUEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQUFCYXNlUGFMb3cgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhfcEFBKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaChfcEFBLCBCQkJhc2VQYUhpZ2gpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NMb3coX3BBQSwgQkJCYXNlUGFMb3cpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NIaWdoKF9wQkIsIEFBQmFzZVBhSGlnaCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdyhfcEJCLCBBQUJhc2VQYUxvdyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIE5kaXNXcml0ZUVycm9yTG9nRW50cnkoX2EsIF9iLCBfYywgX2QpCisjZGVmaW5lIE5kaXNNQWxsb2NhdGVNYXBSZWdpc3RlcnMoX2EsIF9iLCBfYywgX2QsIF9lKQkJTkRJU19TVEFUVVNfU1VDQ0VTUworCisKKyNkZWZpbmUgTmRpc0FjcXVpcmVTcGluTG9jawkJUlRNUF9TRU1fTE9DSworI2RlZmluZSBOZGlzUmVsZWFzZVNwaW5Mb2NrCQlSVE1QX1NFTV9VTkxPQ0sKKworc3RhdGljIGlubGluZSB2b2lkIE5kaXNHZXRTeXN0ZW1VcFRpbWUoVUxPTkcgKnRpbWUpCit7CisJKnRpbWUgPSBqaWZmaWVzOworfQorCisvL3BQYWNrZXQgPSBDT05UQUlOSU5HX1JFQ09SRChwRW50cnksIE5ESVNfUEFDS0VULCBNaW5pcG9ydFJlc2VydmVkRXgpOworI2RlZmluZSBRVUVVRV9FTlRSWV9UT19QS1QocEVudHJ5KSBcCisJCSgoUE5ESVNfUEFDS0VUKSAocEVudHJ5KSkKKworaW50IHJ0Mjh4eF9wYWNrZXRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworCisKK3ZvaWQgcnRtcF9vc190aHJlYWRfaW5pdChQVUNIQVIgcFRocmVhZE5hbWUsIFBWT0lEIHBOb3RpZnkpOworCisjaWZkZWYgUlQyODYwCisjaWYgIWRlZmluZWQoUENJX0NBUF9JRF9FWFApCisjZGVmaW5lIFBDSV9DQVBfSURfRVhQCQkJICAgIDB4MTAKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUENJX0VYUF9MTktDVEwpCisjZGVmaW5lIFBDSV9FWFBfTE5LQ1RMCQkJICAgIDB4MTAKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUENJX0NMQVNTX0JSSURHRV9QQ0kpCisjZGVmaW5lIFBDSV9DTEFTU19CUklER0VfUENJCQkweDA2MDQKKyNlbmRpZgorCisjZGVmaW5lIFBDSUJVU19JTlRFTF9WRU5ET1IgICAgICAgICAweDgwODYKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X21haW5fZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X21haW5fZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg3M2M0NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbWFpbl9kZXYuYwpAQCAtMCwwICsxLDE2ODYgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgcnRfbWFpbl9kZXYuYworCisgICAgQWJzdHJhY3Q6CisgICAgQ3JlYXRlIGFuZCByZWdpc3RlciBuZXR3b3JrIGludGVyZmFjZS4KKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVNhbXBsZQkJTWFyLzIxLzA3CQlNZXJnZSBSVDI4NzAgYW5kIFJUMjg2MCBkcml2ZXJzLgorKi8KKworI2luY2x1ZGUgInJ0X2NvbmZpZy5oIgorCisjZGVmaW5lIEZPUlRZX01IWl9JTlRPTEVSQU5UX0lOVEVSVkFMCSg2MCoxMDAwKSAvLyAxIG1pbgorCisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisvLyByZWNvcmQgd2hldGhlciB0aGUgY2FyZCBpbiB0aGUgY2FyZCBsaXN0IGlzIHVzZWQgaW4gdGhlIGNhcmQgZmlsZQorVUlOVDggIE1DX0NhcmRVc2VkW01BWF9OVU1fT0ZfTVVMVElQTEVfQ0FSRF07CisvLyByZWNvcmQgdXNlZCBjYXJkIG1hYyBhZGRyZXNzIGluIHRoZSBjYXJkIGxpc3QKK3N0YXRpYyBVSU5UOCAgTUNfQ2FyZE1hY1tNQVhfTlVNX09GX01VTFRJUExFX0NBUkRdWzZdOworI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLworCisjaWZkZWYgQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQKK1VJTlQzMiBDV19NQVhfSU5fQklUUzsKKyNlbmRpZiAvLyBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVCAvLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcml2YXRlIFZhcmlhYmxlcyBVc2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvL3N0YXRpYyBSQUxJTktfVElNRVJfU1RSVUNUICAgICBQZXJpb2RpY1RpbWVyOworCitjaGFyICptYWMgPSAiIjsJCSAgIC8vIGRlZmF1bHQgMDA6MDA6MDA6MDA6MDA6MDAKK2NoYXIgKmhvc3RuYW1lID0gIiI7CQkgICAvLyBkZWZhdWx0IENNUEMKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPD0gS0VSTkVMX1ZFUlNJT04oMiw2LDEyKQorTU9EVUxFX1BBUk0gKG1hYywgInMiKTsKKyNlbHNlCittb2R1bGVfcGFyYW0gKG1hYywgY2hhcnAsIDApOworI2VuZGlmCitNT0RVTEVfUEFSTV9ERVNDIChtYWMsICJydDI4eHg6IHdpcmVsZXNzIG1hYyBhZGRyIik7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJvdG90eXBlcyBvZiBGdW5jdGlvbnMgVXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIERPVDExX05fU1VQUE9SVAorZXh0ZXJuIEJPT0xFQU4gYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9pbml0KFBSVE1QX0FEQVBURVIgcEFkLCBpbnQgbnVtKTsKK2V4dGVybiB2b2lkIGJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfcmVsZWFzZShQUlRNUF9BREFQVEVSIHBBZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCitleHRlcm4gTkRJU19TVEFUVVMgTklDTG9hZFJhdGVTd2l0Y2hpbmdQYXJhbXMoSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCisjaWZkZWYgUlQyODYwCitleHRlcm4gdm9pZCBpbml0X3RocmVhZF90YXNrKFBSVE1QX0FEQVBURVIgcEFkKTsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworLy8gcHVibGljIGZ1bmN0aW9uIHByb3RvdHlwZQorSU5UIF9fZGV2aW5pdCBydDI4eHhfcHJvYmUoSU4gdm9pZCAqX2Rldl9wLCBJTiB2b2lkICpfZGV2X2lkX3AsCisJCQkJCQkJSU4gVUlOVCBhcmdjLCBPVVQgUFJUTVBfQURBUFRFUiAqcHBBZCk7CisKKy8vIHByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlCitzdGF0aWMgaW50IHJ0Mjh4eF9pbml0KElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKK0lOVCBydDI4eHhfc2VuZF9wYWNrZXRzKElOIHN0cnVjdCBza19idWZmICpza2JfcCwgSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDw9IDB4MjA0MDIJLy8gUmVkIEhhdCA3LjEKK3N0cnVjdCBuZXRfZGV2aWNlICphbGxvY19uZXRkZXYoCisJaW50IHNpemVvZl9wcml2LAorCWNvbnN0IGNoYXIgKm1hc2ssCisJdm9pZCAoKnNldHVwKShzdHJ1Y3QgbmV0X2RldmljZSAqKSk7CisjZW5kaWYgLy8gTElOVVhfVkVSU0lPTl9DT0RFIC8vCisKK3N0YXRpYyB2b2lkIENmZ0luaXRIb29rKFBSVE1QX0FEQVBURVIgcEFkKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorZXh0ZXJuCWNvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZiBydDI4eHhfaXdfaGFuZGxlcl9kZWY7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVAorZXh0ZXJuCWNvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZiBydDI4eHhfYXBfaXdfaGFuZGxlcl9kZWY7CisjZW5kaWYgLy8gQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQgLy8KKworI2lmIFdJUkVMRVNTX0VYVCA+PSAxMgorLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuIHF1ZXJ5IC9wcm9jCitzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqcnQyOHh4X2dldF93aXJlbGVzc19zdGF0cygKKyAgICBJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CisjZW5kaWYKKworc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKlJUMjh4eF9nZXRfZXRoZXJfc3RhdHMoCisgICAgSU4gIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBDbG9zZSByYXh4IGludGVyZmFjZS4KKworQXJndW1lbnRzOgorCSpuZXRfZGV2CQkJdGhlIHJheHggaW50ZXJmYWNlIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorICAgIDAJCQkJCU9wZW4gT0sKKwlvdGhlcndpc2UJCQlPcGVuIEZhaWwKKworTm90ZToKKwkxLiBpZiBvcGVuIGZhaWwsIGtlcm5lbCB3aWxsIG5vdCBjYWxsIHRoZSBjbG9zZSBmdW5jdGlvbi4KKwkyLiBGcmVlIG1lbW9yeSBmb3IKKwkJKDEpIE1sbWUgTWVtb3J5IEhhbmRsZXI6CQlNbG1lSGFsdCgpCisJCSgyKSBUWCAmIFJYOgkJCQkJUlRNUEZyZWVUeFJ4UmluZ01lbW9yeSgpCisJCSgzKSBCQSBSZW9yZGVyaW5nOiAJCQkJYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9yZWxlYXNlKCkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK2ludCBNYWluVmlydHVhbElGX2Nsb3NlKElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworICAgIFJUTVBfQURBUFRFUiAqcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKworCS8vIFNhbml0eSBjaGVjayBmb3IgcEFkCisJaWYgKHBBZCA9PSBOVUxMKQorCQlyZXR1cm4gMDsgLy8gY2xvc2Ugb2sKKworCW5ldGlmX2NhcnJpZXJfb2ZmKHBBZC0+bmV0X2Rldik7CisJbmV0aWZfc3RvcF9xdWV1ZShwQWQtPm5ldF9kZXYpOworCisKKwlWSVJUVUFMX0lGX0RPV04ocEFkKTsKKworCVJUX01PRF9ERUNfVVNFX0NPVU5UKCk7CisKKwlyZXR1cm4gMDsgLy8gY2xvc2Ugb2sKK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBPcGVuIHJheHggaW50ZXJmYWNlLgorCitBcmd1bWVudHM6CisJKm5ldF9kZXYJCQl0aGUgcmF4eCBpbnRlcmZhY2UgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisgICAgMAkJCQkJT3BlbiBPSworCW90aGVyd2lzZQkJCU9wZW4gRmFpbAorCitOb3RlOgorCTEuIGlmIG9wZW4gZmFpbCwga2VybmVsIHdpbGwgbm90IGNhbGwgdGhlIGNsb3NlIGZ1bmN0aW9uLgorCTIuIEZyZWUgbWVtb3J5IGZvcgorCQkoMSkgTWxtZSBNZW1vcnkgSGFuZGxlcjoJCU1sbWVIYWx0KCkKKwkJKDIpIFRYICYgUlg6CQkJCQlSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KCkKKwkJKDMpIEJBIFJlb3JkZXJpbmc6IAkJCQliYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2UoKQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IE1haW5WaXJ0dWFsSUZfb3BlbihJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKyAgICBSVE1QX0FEQVBURVIgKnBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisKKwkvLyBTYW5pdHkgY2hlY2sgZm9yIHBBZAorCWlmIChwQWQgPT0gTlVMTCkKKwkJcmV0dXJuIDA7IC8vIGNsb3NlIG9rCisKKwlpZiAoVklSVFVBTF9JRl9VUChwQWQpICE9IDApCisJCXJldHVybiAtMTsKKworCS8vIGluY3JlYXNlIE1PRFVMRSB1c2UgY291bnQKKwlSVF9NT0RfSU5DX1VTRV9DT1VOVCgpOworCisJbmV0aWZfc3RhcnRfcXVldWUobmV0X2Rldik7CisJbmV0aWZfY2Fycmllcl9vbihuZXRfZGV2KTsKKwluZXRpZl93YWtlX3F1ZXVlKG5ldF9kZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgQ2xvc2UgcmF4eCBpbnRlcmZhY2UuCisKK0FyZ3VtZW50czoKKwkqbmV0X2RldgkJCXRoZSByYXh4IGludGVyZmFjZSBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKyAgICAwCQkJCQlPcGVuIE9LCisJb3RoZXJ3aXNlCQkJT3BlbiBGYWlsCisKK05vdGU6CisJMS4gaWYgb3BlbiBmYWlsLCBrZXJuZWwgd2lsbCBub3QgY2FsbCB0aGUgY2xvc2UgZnVuY3Rpb24uCisJMi4gRnJlZSBtZW1vcnkgZm9yCisJCSgxKSBNbG1lIE1lbW9yeSBIYW5kbGVyOgkJTWxtZUhhbHQoKQorCQkoMikgVFggJiBSWDoJCQkJCVJUTVBGcmVlVHhSeFJpbmdNZW1vcnkoKQorCQkoMykgQkEgUmVvcmRlcmluZzogCQkJCWJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfcmVsZWFzZSgpCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitpbnQgcnQyOHh4X2Nsb3NlKElOIFBORVRfREVWIGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqIG5ldF9kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXY7CisgICAgUlRNUF9BREFQVEVSCSpwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCUJPT0xFQU4gCQlDYW5jZWxsZWQgPSBGQUxTRTsKKwlVSU5UMzIJCQlpID0gMDsKKworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBydDI4eHhfY2xvc2VcbiIpKTsKKworCS8vIFNhbml0eSBjaGVjayBmb3IgcEFkCisJaWYgKHBBZCA9PSBOVUxMKQorCQlyZXR1cm4gMDsgLy8gY2xvc2Ugb2sKKworCisjaWZkZWYgV0RTX1NVUFBPUlQKKwlXZHNEb3duKHBBZCk7CisjZW5kaWYgLy8gV0RTX1NVUFBPUlQgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworI2lmZGVmIFJUMjg2MAorCQlSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKHBBZCwgUkVTVE9SRV9DTE9TRSk7CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKwkJLy8gSWYgZGlydmVyIGRvZXNuJ3Qgd2FrZSB1cCBmaXJtd2FyZSBoZXJlLAorCQkvLyBOSUNMb2FkRmlybXdhcmUgd2lsbCBoYW5nIGZvcmV2ZXIgd2hlbiBpbnRlcmZhY2UgaXMgdXAgYWdhaW4uCisJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQorICAgICAgICB7CisJCSAgICBBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKKyAgICAgICAgfQorCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCS8vIHNlbmQgRExTLVRFQVJfRE9XTiBtZXNzYWdlLAorCQlpZiAocEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJCXsKKwkJCVVDSEFSIGk7CisKKwkJCS8vIHRlYXIgZG93biBsb2NhbCBkbHMgdGFibGUgZW50cnkKKwkJCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkrKykKKwkJCXsKKwkJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSkKKwkJCQl7CisJCQkJCVJUTVBTZW5kRExTVGVhckRvd25GcmFtZShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQl9CisJCQl9CisKKwkJCS8vIHRlYXIgZG93biBwZWVyIGRscyB0YWJsZSBlbnRyeQorCQkJZm9yIChpPU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwkJCXsKKwkJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSkKKwkJCQl7CisJCQkJCVJUTVBTZW5kRExTVGVhckRvd25GcmFtZShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfTk9ORTsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQl9CisJCQl9CisJCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisJCX0KKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCQlpZiAoSU5GUkFfT04ocEFkKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKQorCQl7CisJCQlNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QJRGlzUmVxOworCQkJTUxNRV9RVUVVRV9FTEVNICpNc2dFbGVtID0gKE1MTUVfUVVFVUVfRUxFTSAqKSBrbWFsbG9jKHNpemVvZihNTE1FX1FVRVVFX0VMRU0pLCBNRU1fQUxMT0NfRkxBRyk7CisKKwkJCUNPUFlfTUFDX0FERFIoRGlzUmVxLkFkZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCURpc1JlcS5SZWFzb24gPSAgUkVBU09OX0RFQVVUSF9TVEFfTEVBVklORzsKKworCQkJTXNnRWxlbS0+TWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7CisJCQlNc2dFbGVtLT5Nc2dUeXBlID0gTVQyX01MTUVfRElTQVNTT0NfUkVROworCQkJTXNnRWxlbS0+TXNnTGVuID0gc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCk7CisJCQlOZGlzTW92ZU1lbW9yeShNc2dFbGVtLT5Nc2csICZEaXNSZXEsIHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpKTsKKworCQkJLy8gUHJldmVudCB0byBjb25uZWN0IEFQIGFnYWluIGluIFNUQU1sbWVQZXJpb2RpY0V4ZWMKKwkJCXBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7CisJCQlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7CisKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0RJU0FTU09DOworCQkJTWxtZURpc2Fzc29jUmVxQWN0aW9uKHBBZCwgTXNnRWxlbSk7CisJCQlrZnJlZShNc2dFbGVtKTsKKworCQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKwkJfQorCisKKyNpZmRlZiBDQ1hfU1VQUE9SVAorCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkxlYXBBdXRoVGltZXIsICZDYW5jZWxsZWQpOworI2VuZGlmCisKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lciwgJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuV3BhRGlzYXNzb2NBbmRCbG9ja0Fzc29jVGltZXIsICZDYW5jZWxsZWQpOworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2lmbmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQl7CisJCQl1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisJCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IHRvIHdwYV9zdXBwbGljYW50IGZvciBpbmZyb21pbmcgaW50ZXJmYWNlIGRvd24uCisJCQltZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisJCQl3cnF1LmRhdGEuZmxhZ3MgPSBSVF9JTlRFUkZBQ0VfRE9XTjsKKwkJCXdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgTlVMTCk7CisJCX0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCQlNbG1lUmFkaW9PZmYocEFkKTsKKyNpZmRlZiBSVDI4NjAKKwkJcEFkLT5iUENJY2xrT2ZmID0gRkFMU0U7CisjZW5kaWYgLy8gUlQyODYwIC8vCisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7CisKKwlmb3IgKGkgPSAwIDsgaSA8IE5VTV9PRl9UWF9SSU5HOyBpKyspCisJeworCQl3aGlsZSAocEFkLT5EZVF1ZXVlUnVubmluZ1tpXSA9PSBUUlVFKQorCQl7CisJCQlwcmludGsoIldhaXRpbmcgZm9yIFR4UXVldWVbJWRdIGRvbmUuLi4uLi4uLi4uXG4iLCBpKTsKKwkJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJCX0KKwl9CisKKwkvLyBTdG9wIE1sbWUgc3RhdGUgbWFjaGluZQorCU1sbWVIYWx0KHBBZCk7CisKKwkvLyBDbG9zZSBrZXJuZWwgdGhyZWFkcyBvciB0YXNrbGV0cworCWtpbGxfdGhyZWFkX3Rhc2socEFkKTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCU1hY1RhYmxlUmVzZXQocEFkKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworCU1lYXN1cmVSZXFUYWJFeGl0KHBBZCk7CisJVHBjUmVxVGFiRXhpdChwQWQpOworCisKKyNpZmRlZiBSVDI4NjAKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9BQ1RJVkUpKQorCXsKKwkJTklDRGlzYWJsZUludGVycnVwdChwQWQpOworCX0KKworCS8vIERpc2FibGUgUngsIHJlZ2lzdGVyIHZhbHVlIHN1cHBvc2VkIHdpbGwgcmVtYWluIGFmdGVyIHJlc2V0CisJTklDSXNzdWVSZXNldChwQWQpOworCisJLy8gRnJlZSBJUlEKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKwkJLy8gRGVyZWdpc3RlciBpbnRlcnJ1cHQgZnVuY3Rpb24KKwkJUlQyOFhYX0lSUV9SRUxFQVNFKG5ldF9kZXYpCisJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSk7CisJfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisKKwkvLyBGcmVlIFJpbmcgb3IgVVNCIGJ1ZmZlcnMKKwlSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KHBBZCk7CisKKwlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJLy8gRnJlZSBCQSByZW9yZGVyIHJlc291cmNlCisJYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9yZWxlYXNlKHBBZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKworCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfU1RBUlRfVVApOworCisJcmV0dXJuIDA7IC8vIGNsb3NlIG9rCit9IC8qIEVuZCBvZiBydDI4eHhfY2xvc2UgKi8KKworc3RhdGljIGludCBydDI4eHhfaW5pdChJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlQUlRNUF9BREFQVEVSIAkJCXBBZCA9IChQUlRNUF9BREFQVEVSKW5ldF9kZXYtPm1sX3ByaXY7CisJVUlOVAkJCQkJaW5kZXg7CisJVUNIQVIJCQkJCVRtcFBoeTsKKwlORElTX1NUQVRVUwkJCQlTdGF0dXM7CisJVUlOVDMyIAkJTWFjQ3NyMCA9IDA7CisKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCS8vIEFsbG9jYXRlIEJBIFJlb3JkZXJpbmcgbWVtb3J5CisJYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9pbml0KHBBZCwgTUFYX1JFT1JERVJJTkdfTVBEVV9OVU0pOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJLy8gTWFrZSBzdXJlIE1BQyBnZXRzIHJlYWR5LgorCWluZGV4ID0gMDsKKwlkbworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfQ1NSMCwgJk1hY0NzcjApOworCQlwQWQtPk1BQ1ZlcnNpb24gPSBNYWNDc3IwOworCisJCWlmICgocEFkLT5NQUNWZXJzaW9uICE9IDB4MDApICYmIChwQWQtPk1BQ1ZlcnNpb24gIT0gMHhGRkZGRkZGRikpCisJCQlicmVhazsKKworCQlSVE1QdXNlY0RlbGF5KDEwKTsKKwl9IHdoaWxlIChpbmRleCsrIDwgMTAwKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1BQ19DU1IwICBbIFZlcjpSZXY9MHglMDh4XVxuIiwgcEFkLT5NQUNWZXJzaW9uKSk7CisKKwkvLyBEaXNhYmxlIERNQQorCVJUMjhYWERNQURpc2FibGUocEFkKTsKKworCisJLy8gTG9hZCA4MDUxIGZpcm13YXJlCisJU3RhdHVzID0gTklDTG9hZEZpcm13YXJlKHBBZCk7CisJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlRfRVJSKCgiTklDTG9hZEZpcm13YXJlIGZhaWxlZCwgU3RhdHVzWz0weCUwOHhdXG4iLCBTdGF0dXMpKTsKKwkJZ290byBlcnIxOworCX0KKworCU5JQ0xvYWRSYXRlU3dpdGNoaW5nUGFyYW1zKHBBZCk7CisKKwkvLyBEaXNhYmxlIGludGVycnVwdHMgaGVyZSB3aGljaCBpcyBhcyBzb29uIGFzIHBvc3NpYmxlCisJLy8gVGhpcyBzdGF0ZW1lbnQgc2hvdWxkIG5ldmVyIGJlIHRydWUuIFdlIG1pZ2h0IGNvbnNpZGVyIHRvIHJlbW92ZSBpdCBsYXRlcgorI2lmZGVmIFJUMjg2MAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0FDVElWRSkpCisJeworCQlOSUNEaXNhYmxlSW50ZXJydXB0KHBBZCk7CisJfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisJU3RhdHVzID0gUlRNUEFsbG9jVHhSeFJpbmdNZW1vcnkocEFkKTsKKwlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVF9FUlIoKCJSVE1QQWxsb2NETUFNZW1vcnkgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsIFN0YXR1cykpOworCQlnb3RvIGVycjE7CisJfQorCisJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSk7CisKKwkvLyBpbml0aWFsaXplIE1MTUUKKwkvLworCisJU3RhdHVzID0gTWxtZUluaXQocEFkKTsKKwlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVF9FUlIoKCJNbG1lSW5pdCBmYWlsZWQsIFN0YXR1c1s9MHglMDh4XVxuIiwgU3RhdHVzKSk7CisJCWdvdG8gZXJyMjsKKwl9CisKKwkvLyBJbml0aWFsaXplIHBBZC0+U3RhQ2ZnLCBwQWQtPkFwQ2ZnLCBwQWQtPkNvbW1vbkNmZyB0byBtYW51ZmFjdHVyZSBkZWZhdWx0CisJLy8KKwlVc2VyQ2ZnSW5pdChwQWQpOworCisKKwlSVDI4WFhfVEFTS19USFJFQURfSU5JVChwQWQsIFN0YXR1cyk7CisJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQlnb3RvIGVycjE7CisKKwlDZmdJbml0SG9vayhwQWQpOworCisKKyNpZmRlZiBCTE9DS19ORVRfSUYKKwlpbml0YmxvY2tRdWV1ZVRhYihwQWQpOworI2VuZGlmIC8vIEJMT0NLX05FVF9JRiAvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlNZWFzdXJlUmVxVGFiSW5pdChwQWQpOworCVRwY1JlcVRhYkluaXQocEFkKTsKKworCS8vCisJLy8gSW5pdCB0aGUgaGFyZHdhcmUsIHdlIG5lZWQgdG8gaW5pdCBhc2ljIGJlZm9yZSByZWFkIHJlZ2lzdHJ5LCBvdGhlcndpc2UgbWFjIHJlZ2lzdGVyIHdpbGwgYmUgcmVzZXQKKwkvLworCVN0YXR1cyA9IE5JQ0luaXRpYWxpemVBZGFwdGVyKHBBZCwgVFJVRSk7CisJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlRfRVJSKCgiTklDSW5pdGlhbGl6ZUFkYXB0ZXIgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsIFN0YXR1cykpOworCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCWdvdG8gZXJyMzsKKwl9CisKKwkvLyBSZWFkIHBhcmFtZXRlcnMgZnJvbSBDb25maWcgRmlsZQorCVN0YXR1cyA9IFJUTVBSZWFkUGFyYW1ldGVyc0hvb2socEFkKTsKKworCXByaW50aygiMS4gUGh5IE1vZGUgPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSk7CisJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlRfRVJSKCgiTklDUmVhZFJlZ1BhcmFtZXRlcnMgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsU3RhdHVzKSk7CisJCWdvdG8gZXJyNDsKKwl9CisKKworCisgICAJLy9Jbml0IEJhIENhcGFiaWxpdHkgcGFyYW1ldGVycy4KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTXBkdURlbnNpdHkgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5OworCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdUVuYWJsZSA9IChVU0hPUlQpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1RW5hYmxlOworCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemUgPSAoVVNIT1JUKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdVNpemU7CisJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QcyA9IChVU0hPUlQpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlOworCS8vIFVQZGF0YSB0byBIVCBJRQorCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGU7CisJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemUgPSAoVVNIT1JUKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdVNpemU7CisJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlwcmludGsoIjIuIFBoeSBNb2RlID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpOworCisJLy8gV2Ugc2hvdWxkIHJlYWQgRUVQUk9NIGZvciBhbGwgY2FzZXMuICBydDI4NjBiCisJTklDUmVhZEVFUFJPTVBhcmFtZXRlcnMocEFkLCBtYWMpOworCisJcHJpbnRrKCIzLiBQaHkgTW9kZSA9ICVkXG4iLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKTsKKworCU5JQ0luaXRBc2ljRnJvbUVFUFJPTShwQWQpOyAvL3J0Mjg2MGIKKworCS8vIFNldCBQSFkgdG8gYXBwcm9wcmlhdGUgbW9kZQorCVRtcFBoeSA9IHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGU7CisJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IDB4ZmY7CisJUlRNUFNldFBoeU1vZGUocEFkLCBUbXBQaHkpOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCVNldENvbW1vbkhUKHBBZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkvLyBObyB2YWxpZCBjaGFubmVscy4KKwlpZiAocEFkLT5DaGFubmVsTGlzdE51bSA9PSAwKQorCXsKKwkJcHJpbnRrKCJXcm9uZyBjb25maWd1cmF0aW9uLiBObyB2YWxpZCBjaGFubmVsIGZvdW5kLiBDaGVjayBcIkNvbnRyeUNvZGVcIiBhbmQgXCJDaGFubmVsR2VvZ3JhcGh5XCIgc2V0dGluZy5cbiIpOworCQlnb3RvIGVycjQ7CisJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJcHJpbnRrKCJNQ1MgU2V0ID0gJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLCBwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzBdLAorICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzFdLCBwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzJdLAorICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzNdLCBwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzRdKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2lmZGVmIElLQU5PU19WWF8xWDAKKwlWUl9JS0FOT1NfRlBfSW5pdChwQWQtPkFwQ2ZnLkJzc2lkTnVtLCBwQWQtPlBlcm1hbmVudEFkZHJlc3MpOworI2VuZGlmIC8vIElLQU5PU19WWF8xWDAgLy8KKworCQkvLworCS8vIEluaXRpYWxpemUgUkYgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQorCS8vCisJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisKKwkvLyA4MDUxIGZpcm13YXJlIHJlcXVpcmUgdGhlIHNpZ25hbCBkdXJpbmcgYm9vdGluZyB0aW1lLgorCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg3MiwgMHhGRiwgMHgwMCwgMHgwMCk7CisKKwlpZiAocEFkICYmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykpCisJeworCQkvLworCQkvLyBVbmRvIGV2ZXJ5dGhpbmcgaWYgaXQgZmFpbGVkCisJCS8vCisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJCXsKKwkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSk7CisJCX0KKwl9CisJZWxzZSBpZiAocEFkKQorCXsKKwkJLy8gTWljcm9zb2Z0IEhDVCByZXF1aXJlIGRyaXZlciBzZW5kIGEgZGlzY29ubmVjdCBldmVudCBhZnRlciBkcml2ZXIgaW5pdGlhbGl6YXRpb24uCisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX01FRElBX1NUQVRFX0NIQU5HRSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQiFcbiIpKTsKKworCisJfS8vIGVuZCBvZiBlbHNlCisKKworCURCR1BSSU5UX1MoU3RhdHVzLCAoIjw9PT09IFJUTVBJbml0aWFsaXplLCBTdGF0dXM9JXhcbiIsIFN0YXR1cykpOworCisJcmV0dXJuIFRSVUU7CisKKworZXJyNDoKK2VycjM6CisJTWxtZUhhbHQocEFkKTsKK2VycjI6CisJUlRNUEZyZWVUeFJ4UmluZ01lbW9yeShwQWQpOworZXJyMToKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCW9zX2ZyZWVfbWVtKHBBZCwgcEFkLT5tcGR1X2Jsa19wb29sLm1lbSk7IC8vIGZyZWUgQkEgcG9vbAorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCVJUMjhYWF9JUlFfUkVMRUFTRShuZXRfZGV2KTsKKworCS8vIHNoYWxsIG5vdCBzZXQgbWxfcHJpdiB0byBOVUxMIGhlcmUgYmVjYXVzZSB0aGUgbWxfcHJpdiBkaWRuJ3QgYmVlbiBmcmVlIHlldC4KKwkvL25ldF9kZXYtPm1sX3ByaXYgPSAwOworI2lmZGVmIElORl9BTUFaT05fU0UKK2VycjA6CisjZW5kaWYgLy8gSU5GX0FNQVpPTl9TRSAvLworCXByaW50aygiISEhICVzIEluaXRpYWxpemVkIGZhaWwgISEhXG4iLCBSVDI4eHhfQ0hJUF9OQU1FKTsKKwlyZXR1cm4gRkFMU0U7Cit9IC8qIEVuZCBvZiBydDI4eHhfaW5pdCAqLworCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgT3BlbiByYXh4IGludGVyZmFjZS4KKworQXJndW1lbnRzOgorCSpuZXRfZGV2CQkJdGhlIHJheHggaW50ZXJmYWNlIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorICAgIDAJCQkJCU9wZW4gT0sKKwlvdGhlcndpc2UJCQlPcGVuIEZhaWwKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK2ludCBydDI4eHhfb3BlbihJTiBQTkVUX0RFViBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKiBuZXRfZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2OworCVBSVE1QX0FEQVBURVIgcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKwlpbnQgcmV0dmFsID0gMDsKKyAJUE9TX0NPT0tJRSBwT2JqOworCisKKwkvLyBTYW5pdHkgY2hlY2sgZm9yIHBBZAorCWlmIChwQWQgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5tbF9wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLTE7CisJfQorCisjaWZkZWYgQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQKKwlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX0FQKQorCXsKKwkJQ1dfTUFYX0lOX0JJVFMgPSA2OworCX0KKwllbHNlIGlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorCXsKKwkJQ1dfTUFYX0lOX0JJVFMgPSAxMDsKKwl9CisKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTIKKwlpZiAobmV0X2Rldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApCisJCQluZXRfZGV2LT53aXJlbGVzc19oYW5kbGVycyA9IChzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgKikgJnJ0Mjh4eF9hcF9pd19oYW5kbGVyX2RlZjsKKwkJZWxzZSBpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKKwkJCW5ldF9kZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gKHN0cnVjdCBpd19oYW5kbGVyX2RlZiAqKSAmcnQyOHh4X2l3X2hhbmRsZXJfZGVmOworCX0KKyNlbmRpZiAvLyBXSVJFTEVTU19FWFQgPj0gMTIgLy8KKyNlbmRpZiAvLyBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVCAvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUlQyODYwCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisgICAgCS8vIElmIGRpcnZlciBkb2Vzbid0IHdha2UgdXAgZmlybXdhcmUgaGVyZSwKKyAgICAJLy8gTklDTG9hZEZpcm13YXJlIHdpbGwgaGFuZyBmb3JldmVyIHdoZW4gaW50ZXJmYWNlIGlzIHVwIGFnYWluLgorICAgIAkvLyBSVDI4NjAgUENJCisgICAgCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpICYmCisgICAgICAgIAlPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSkpCisgICAgCXsKKyAgICAgICAgCUFVVE9fV0FLRVVQX1NUUlVDIEF1dG9XYWtldXBDZmc7CisJCQlBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKKyAgICAgICAgCUF1dG9XYWtldXBDZmcud29yZCA9IDA7CisJICAgIAlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7CisgICAgICAgIAlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKKyAgICAJfQorCX0KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIEluaXQKKyAJcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOworCisJLy8gcmVzZXQgQWRhcHRlciBmbGFncworCVJUTVBfQ0xFQVJfRkxBR1MocEFkKTsKKworCS8vIFJlcXVlc3QgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBmb3IgUENJIGRldmljZQorCS8vIHJlZ2lzdGVyIHRoZSBpbnRlcnJ1cHQgcm91dGluZSB3aXRoIHRoZSBvcworCVJUMjhYWF9JUlFfUkVRVUVTVChuZXRfZGV2KTsKKworCisJLy8gSW5pdCBCc3NUYWIgJiBDaGFubmVsSW5mbyB0YWJibGVzIGZvciBhdXRvIGNoYW5uZWwgc2VsZWN0LgorCisKKwkvLyBDaGlwICYgb3RoZXIgaW5pdAorCWlmIChydDI4eHhfaW5pdChuZXRfZGV2KSA9PSBGQUxTRSkKKwkJZ290byBlcnI7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuZGV2X25hbWUsIDE2KTsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuZGV2X25hbWUsIG5ldF9kZXYtPm5hbWUsIHN0cmxlbihuZXRfZGV2LT5uYW1lKSk7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8gU2V0IHVwIHRoZSBNYWMgYWRkcmVzcworCU5kaXNNb3ZlTWVtb3J5KG5ldF9kZXYtPmRldl9hZGRyLCAodm9pZCAqKSBwQWQtPkN1cnJlbnRBZGRyZXNzLCA2KTsKKworCS8vIEluaXQgSVJRIHBhcmFtZXRlcnMKKwlSVDI4WFhfSVJRX0lOSVQocEFkKTsKKworCS8vIFZhcmlvdXMgQVAgZnVuY3Rpb24gaW5pdAorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2lmbmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQl7CisJCQl1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisJCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IHRvIHdwYV9zdXBwbGljYW50IGZvciBpbmZyb21pbmcgaW50ZXJmYWNlIGRvd24uCisJCQltZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisJCQl3cnF1LmRhdGEuZmxhZ3MgPSBSVF9JTlRFUkZBQ0VfVVA7CisJCQl3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkNVU1RPTSwgJndycXUsIE5VTEwpOworCQl9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLyBFbmFibGUgSW50ZXJydXB0CisJUlQyOFhYX0lSUV9FTkFCTEUocEFkKTsKKworCS8vIE5vdyBFbmFibGUgUnhUeAorCVJUTVBFbmFibGVSeFR4KHBBZCk7CisJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfU1RBUlRfVVApOworCisJeworCVVJTlQzMiByZWcgPSAwOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgMHgxMzAwLCAmcmVnKTsgIC8vIGNsZWFyIGdhcmJhZ2UgaW50ZXJydXB0cworCXByaW50aygiMHgxMzAwID0gJTA4eFxuIiwgcmVnKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBSVDI4NjAKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorICAgICAgICBSVE1QSW5pdFBDSWVMaW5rQ3RybFZhbHVlKHBBZCk7CisjZW5kaWYgLy8gUlQyODYwIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlyZXR1cm4gKHJldHZhbCk7CisKK2VycjoKKwlyZXR1cm4gKC0xKTsKK30gLyogRW5kIG9mIHJ0Mjh4eF9vcGVuICovCisKKworLyogTXVzdCBub3QgYmUgY2FsbGVkIGZvciBtZGV2IGFuZCBhcGRldiAqLworc3RhdGljIE5ESVNfU1RBVFVTIHJ0X2llZWU4MDIxMV9pZl9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlORElTX1NUQVRVUyBTdGF0dXM7CisJSU5UICAgICBpPTA7CisJQ0hBUiAgICBzbG90X25hbWVbSUZOQU1TSVpdOworCXN0cnVjdCBuZXRfZGV2aWNlICAgKmRldmljZTsKKworCisJLy9ldGhlcl9zZXR1cChkZXYpOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gcnQyOHh4X3NlbmRfcGFja2V0czsKKworI2lmZGVmIElLQU5PU19WWF8xWDAKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IElLQU5PU19EYXRhRnJhbWVzVHg7CisjZW5kaWYgLy8gSUtBTk9TX1ZYXzFYMCAvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWYgV0lSRUxFU1NfRVhUID49IDEyCisJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCisJeworCQlkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gJnJ0Mjh4eF9pd19oYW5kbGVyX2RlZjsKKwl9CisjZW5kaWYgLy9XSVJFTEVTU19FWFQgPj0gMTIKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUCisjaWYgV0lSRUxFU1NfRVhUID49IDEyCisJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkKKwl7CisJCWRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAmcnQyOHh4X2FwX2l3X2hhbmRsZXJfZGVmOworCX0KKyNlbmRpZiAvL1dJUkVMRVNTX0VYVCA+PSAxMgorI2VuZGlmIC8vIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUIC8vCisKKyNpZiBXSVJFTEVTU19FWFQgPCAyMQorCQlkZXYtPmdldF93aXJlbGVzc19zdGF0cyA9IHJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHM7CisjZW5kaWYKKwlkZXYtPmdldF9zdGF0cyA9IFJUMjh4eF9nZXRfZXRoZXJfc3RhdHM7CisJZGV2LT5vcGVuID0gTWFpblZpcnR1YWxJRl9vcGVuOyAvL3J0Mjh4eF9vcGVuOworCWRldi0+c3RvcCA9IE1haW5WaXJ0dWFsSUZfY2xvc2U7IC8vcnQyOHh4X2Nsb3NlOworCWRldi0+cHJpdl9mbGFncyA9IElOVF9NQUlOOworCWRldi0+ZG9faW9jdGwgPSBydDI4eHhfaW9jdGw7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkKKyAgICBkZXYtPnZhbGlkYXRlX2FkZHIgPSBOVUxMOworI2VuZGlmCisJLy8gZmluZCBhdmFpbGFibGUgZGV2aWNlIG5hbWUKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCXsKKyNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKKwkJaWYgKHBBZC0+TUNfUm93SUQgPj0gMCkKKwkJCXNwcmludGYoc2xvdF9uYW1lLCAicmElMDJkXyVkIiwgcEFkLT5NQ19Sb3dJRCwgaSk7CisJCWVsc2UKKyNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KKwkJc3ByaW50ZihzbG90X25hbWUsICJyYSVkIiwgaSk7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI2KQorICAgICAgICBkZXZpY2UgPSBkZXZfZ2V0X2J5X25hbWUoZGV2X25ldChkZXYpLCBzbG90X25hbWUpOworI2Vsc2UKKyAgICAgICAgZGV2aWNlID0gZGV2X2dldF9ieV9uYW1lKGRldi0+bmRfbmV0LCBzbG90X25hbWUpOworI2VuZGlmCisjZWxzZQorCQlkZXZpY2UgPSBkZXZfZ2V0X2J5X25hbWUoc2xvdF9uYW1lKTsKKyNlbmRpZgorCQlpZiAoZGV2aWNlICE9IE5VTEwpIGRldl9wdXQoZGV2aWNlKTsKKyNlbHNlCisJCWZvciAoZGV2aWNlID0gZGV2X2Jhc2U7IGRldmljZSAhPSBOVUxMOyBkZXZpY2UgPSBkZXZpY2UtPm5leHQpCisJCXsKKwkJCWlmIChzdHJuY21wKGRldmljZS0+bmFtZSwgc2xvdF9uYW1lLCA0KSA9PSAwKQorCQkJCWJyZWFrOworCQl9CisjZW5kaWYKKwkJaWYoZGV2aWNlID09IE5VTEwpCisJCQlicmVhazsKKwl9CisKKwlpZihpID09IDgpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJObyBhdmFpbGFibGUgc2xvdCBuYW1lXG4iKSk7CisJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCWVsc2UKKwl7CisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisJCWlmIChwQWQtPk1DX1Jvd0lEID49IDApCisJICAgICAgICBzcHJpbnRmKGRldi0+bmFtZSwgInJhJTAyZF8lZCIsIHBBZC0+TUNfUm93SUQsIGkpOworCQllbHNlCisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisJCXNwcmludGYoZGV2LT5uYW1lLCAicmElZCIsIGkpOworCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCX0KKworCXJldHVybiBTdGF0dXM7CisKK30KKworCisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIEdldCBjYXJkIHByb2ZpbGUgcGF0aC4KKworQXJndW1lbnRzOgorICAgIHBBZAorCitSZXR1cm4gVmFsdWU6CisgICAgVFJVRQkJLSBGaW5kIGEgY2FyZCBwcm9maWxlCisJRkFMU0UJCS0gdXNlIGRlZmF1bHQgcHJvZmlsZQorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworZXh0ZXJuIElOVCBSVE1QR2V0S2V5UGFyYW1ldGVyKAorICAgIElOICBQQ0hBUiAgIGtleSwKKyAgICBPVVQgUENIQVIgICBkZXN0LAorICAgIElOICBJTlQgICAgIGRlc3RzaXplLAorICAgIElOICBQQ0hBUiAgIGJ1ZmZlcik7CisKK0JPT0xFQU4gUlRNUF9DYXJkSW5mb1JlYWQoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQpCit7CisjZGVmaW5lIE1DX1NFTEVDVF9DQVJESUQJCTAJLyogdXNlIENBUkQgSUQgKDAgfiAzMSkgdG8gaWRlbnRpZnkgZGlmZmVyZW50IGNhcmRzICovCisjZGVmaW5lIE1DX1NFTEVDVF9NQUMJCQkxCS8qIHVzZSBDQVJEIE1BQyB0byBpZGVudGlmeSBkaWZmZXJlbnQgY2FyZHMgKi8KKyNkZWZpbmUgTUNfU0VMRUNUX0NBUkRUWVBFCQkyCS8qIHVzZSBDQVJEIHR5cGUgKGFiZ24gb3IgYmduKSB0byBpZGVudGlmeSBkaWZmZXJlbnQgY2FyZHMgKi8KKworI2RlZmluZSBMRVRURVJfQ0FTRV9UUkFOU0xBVEUodHh0X3AsIGNhcmRfaWQpCQkJXAorCXsJVUlOVDMyIF9sZW47IGNoYXIgX2NoYXI7CQkJCQkJXAorCQlmb3IoX2xlbj0wOyBfbGVuPHN0cmxlbihjYXJkX2lkKTsgX2xlbisrKSB7CQlcCisJCQlfY2hhciA9ICoodHh0X3AgKyBfbGVuKTsJCQkJCVwKKwkJCWlmICgoJ0EnIDw9IF9jaGFyKSAmJiAoX2NoYXIgPD0gJ1onKSkJCVwKKwkJCQkqKHR4dF9wK19sZW4pID0gJ2EnKyhfY2hhci0nQScpOwkJXAorCQl9IH0KKworCXN0cnVjdCBmaWxlICpzcmNmOworCUlOVCByZXR2YWwsIG9yZ2ZzdWlkLCBvcmdmc2dpZDsKKyAgIAltbV9zZWdtZW50X3Qgb3JnZnM7CisJQ0hBUiAqYnVmZmVyLCAqdG1wYnVmLCBjYXJkX2lkX2J1ZlszMF0sIFJGSUNfd29yZFszMF07CisJQk9PTEVBTiBmbGdfbWF0Y2hfb2sgPSBGQUxTRTsKKwlJTlQzMiBjYXJkX3NlbGVjdF9tZXRob2Q7CisJSU5UMzIgY2FyZF9mcmVlX2lkLCBjYXJkX25vdXNlX2lkLCBjYXJkX3NhbWVfbWFjX2lkLCBjYXJkX21hdGNoX2lkOworCUVFUFJPTV9BTlRFTk5BX1NUUlVDIGFudGVubmE7CisJVVNIT1JUIGFkZHIwMSwgYWRkcjIzLCBhZGRyNDU7CisJVUlOVDggbWFjWzZdOworCVVJTlQzMiBkYXRhLCBjYXJkX2luZGV4OworCVVDSEFSICpzdGFydF9wdHI7CisKKworCS8vIGluaXQKKwlidWZmZXIgPSBrbWFsbG9jKE1BWF9JTklfQlVGRkVSX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKKwlpZiAoYnVmZmVyID09IE5VTEwpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworCXRtcGJ1ZiA9IGttYWxsb2MoTUFYX1BBUkFNX0JVRkZFUl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7CisJaWYodG1wYnVmID09IE5VTEwpCisJeworCQlrZnJlZShidWZmZXIpOworICAgICAgICByZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKwlvcmdmc3VpZCA9IGN1cnJlbnQtPmZzdWlkOworCW9yZ2ZzZ2lkID0gY3VycmVudC0+ZnNnaWQ7CisJY3VycmVudC0+ZnN1aWQgPSBjdXJyZW50LT5mc2dpZCA9IDA7CisgICAgb3JnZnMgPSBnZXRfZnMoKTsKKyAgICBzZXRfZnMoS0VSTkVMX0RTKTsKKworCS8vIGdldCBSRiBJQyB0eXBlCisJUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmZGF0YSk7CisKKwlpZiAoKGRhdGEgJiAweDMwKSA9PSAwKQorCQlwQWQtPkVFUFJPTUFkZHJlc3NOdW0gPSA2OwkvLyA5M0M0NgorCWVsc2UgaWYgKChkYXRhICYgMHgzMCkgPT0gMHgxMCkKKwkJcEFkLT5FRVBST01BZGRyZXNzTnVtID0gODsJLy8gOTNDNjYKKwllbHNlCisJCXBBZC0+RUVQUk9NQWRkcmVzc051bSA9IDg7CS8vIDkzQzg2CisKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9OSUMxX09GRlNFVCwgYW50ZW5uYS53b3JkKTsKKworCWlmICgoYW50ZW5uYS5maWVsZC5SZkljVHlwZSA9PSBSRklDXzI4NTApIHx8CisJCShhbnRlbm5hLmZpZWxkLlJmSWNUeXBlID09IFJGSUNfMjc1MCkpCisJeworCQkvKiBBQkdOIGNhcmQgKi8KKwkJc3RyY3B5KFJGSUNfd29yZCwgImFiZ24iKTsKKwl9CisJZWxzZQorCXsKKwkJLyogQkdOIGNhcmQgKi8KKwkJc3RyY3B5KFJGSUNfd29yZCwgImJnbiIpOworCX0KKworCS8vIGdldCBNQUMgYWRkcmVzcworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHgwNCwgYWRkcjAxKTsKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MDYsIGFkZHIyMyk7CisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDA4LCBhZGRyNDUpOworCisJbWFjWzBdID0gKFVDSEFSKShhZGRyMDEgJiAweGZmKTsKKwltYWNbMV0gPSAoVUNIQVIpKGFkZHIwMSA+PiA4KTsKKwltYWNbMl0gPSAoVUNIQVIpKGFkZHIyMyAmIDB4ZmYpOworCW1hY1szXSA9IChVQ0hBUikoYWRkcjIzID4+IDgpOworCW1hY1s0XSA9IChVQ0hBUikoYWRkcjQ1ICYgMHhmZik7CisJbWFjWzVdID0gKFVDSEFSKShhZGRyNDUgPj4gOCk7CisKKwkvLyBvcGVuIGNhcmQgaW5mb3JtYXRpb24gZmlsZQorCXNyY2YgPSBmaWxwX29wZW4oQ0FSRF9JTkZPX1BBVEgsIE9fUkRPTkxZLCAwKTsKKwlpZiAoSVNfRVJSKHNyY2YpKQorCXsKKwkJLyogY2FyZCBpbmZvcm1hdGlvbiBmaWxlIGRvZXMgbm90IGV4aXN0ICovCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkoIi0tPiBFcnJvciAlbGQgb3BlbmluZyAlc1xuIiwgLVBUUl9FUlIoc3JjZiksIENBUkRfSU5GT19QQVRIKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAoc3JjZi0+Zl9vcCAmJiBzcmNmLT5mX29wLT5yZWFkKQorCXsKKwkJLyogY2FyZCBpbmZvcm1hdGlvbiBmaWxlIGV4aXN0cyBzbyByZWFkaW5nIHRoZSBjYXJkIGluZm9ybWF0aW9uICovCisJCW1lbXNldChidWZmZXIsIDB4MDAsIE1BWF9JTklfQlVGRkVSX1NJWkUpOworCQlyZXR2YWwgPSBzcmNmLT5mX29wLT5yZWFkKHNyY2YsIGJ1ZmZlciwgTUFYX0lOSV9CVUZGRVJfU0laRSwgJnNyY2YtPmZfcG9zKTsKKwkJaWYgKHJldHZhbCA8IDApCisJCXsKKwkJCS8qIHJlYWQgZmFpbCAqLworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkoIi0tPiBSZWFkICVzIGVycm9yICVkXG4iLCBDQVJEX0lORk9fUEFUSCwgLXJldHZhbCkpOworCQl9CisJCWVsc2UKKwkJeworCQkJLyogZ2V0IGNhcmQgc2VsZWN0aW9uIG1ldGhvZCAqLworCQkJbWVtc2V0KHRtcGJ1ZiwgMHgwMCwgTUFYX1BBUkFNX0JVRkZFUl9TSVpFKTsKKwkJCWNhcmRfc2VsZWN0X21ldGhvZCA9IE1DX1NFTEVDVF9DQVJEVFlQRTsgLy8gZGVmYXVsdAorCisJCQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiU0VMRUNUIiwgdG1wYnVmLCAyNTYsIGJ1ZmZlcikpCisJCQl7CisJCQkJaWYgKHN0cmNtcCh0bXBidWYsICJDQVJESUQiKSA9PSAwKQorCQkJCQljYXJkX3NlbGVjdF9tZXRob2QgPSBNQ19TRUxFQ1RfQ0FSRElEOworCQkJCWVsc2UgaWYgKHN0cmNtcCh0bXBidWYsICJNQUMiKSA9PSAwKQorCQkJCQljYXJkX3NlbGVjdF9tZXRob2QgPSBNQ19TRUxFQ1RfTUFDOworCQkJCWVsc2UgaWYgKHN0cmNtcCh0bXBidWYsICJDQVJEVFlQRSIpID09IDApCisJCQkJCWNhcmRfc2VsZWN0X21ldGhvZCA9IE1DX1NFTEVDVF9DQVJEVFlQRTsKKwkJCX0KKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSgiTUM+IENhcmQgU2VsZWN0aW9uID0gJWRcbiIsIGNhcmRfc2VsZWN0X21ldGhvZCkpOworCisJCQkvLyBpbml0CisJCQljYXJkX2ZyZWVfaWQgPSAtMTsKKwkJCWNhcmRfbm91c2VfaWQgPSAtMTsKKwkJCWNhcmRfc2FtZV9tYWNfaWQgPSAtMTsKKwkJCWNhcmRfbWF0Y2hfaWQgPSAtMTsKKworCQkJLy8gc2VhcmNoIGN1cnJlbnQgY2FyZCBpbmZvcm1hdGlvbiByZWNvcmRzCisJCQlmb3IoY2FyZF9pbmRleD0wOworCQkJCWNhcmRfaW5kZXg8TUFYX05VTV9PRl9NVUxUSVBMRV9DQVJEOworCQkJCWNhcmRfaW5kZXgrKykKKwkJCXsKKwkJCQlpZiAoKCooVUlOVDMyICopJk1DX0NhcmRNYWNbY2FyZF9pbmRleF1bMF0gPT0gMCkgJiYKKwkJCQkJKCooVUlOVDE2ICopJk1DX0NhcmRNYWNbY2FyZF9pbmRleF1bNF0gPT0gMCkpCisJCQkJeworCQkJCQkvLyBNQUMgaXMgYWxsLTAgc28gdGhlIGVudHJ5IGlzIGF2YWlsYWJsZQorCQkJCQlNQ19DYXJkVXNlZFtjYXJkX2luZGV4XSA9IDA7CisKKwkJCQkJaWYgKGNhcmRfZnJlZV9pZCA8IDApCisJCQkJCQljYXJkX2ZyZWVfaWQgPSBjYXJkX2luZGV4OyAvLyAxc3QgZnJlZSBlbnRyeQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlpZiAobWVtY21wKE1DX0NhcmRNYWNbY2FyZF9pbmRleF0sIG1hYywgNikgPT0gMCkKKwkJCQkJeworCQkJCQkJLy8gd2UgZmluZCB0aGUgZW50cnkgd2l0aCBzYW1lIE1BQworCQkJCQkJaWYgKGNhcmRfc2FtZV9tYWNfaWQgPCAwKQorCQkJCQkJCWNhcmRfc2FtZV9tYWNfaWQgPSBjYXJkX2luZGV4OyAvLyAxc3Qgc2FtZSBlbnRyeQorCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJLy8gTUFDIGlzIG5vdCBhbGwtMCBidXQgdXNlZCBmbGFnID09IDAKKwkJCQkJCWlmICgoTUNfQ2FyZFVzZWRbY2FyZF9pbmRleF0gPT0gMCkgJiYKKwkJCQkJCQkoY2FyZF9ub3VzZV9pZCA8IDApKQorCQkJCQkJeworCQkJCQkJCWNhcmRfbm91c2VfaWQgPSBjYXJkX2luZGV4OyAvLyAxc3QgYXZhaWxhYmxlIGVudHJ5CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkoIk1DPiBGcmVlID0gJWQsIFNhbWUgPSAlZCwgTk9VU0UgPSAlZFxuIiwKKwkJCQkJY2FyZF9mcmVlX2lkLCBjYXJkX3NhbWVfbWFjX2lkLCBjYXJkX25vdXNlX2lkKSk7CisKKwkJCWlmICgoY2FyZF9zYW1lX21hY19pZCA+PSAwKSAmJgorCQkJCSgoY2FyZF9zZWxlY3RfbWV0aG9kID09IE1DX1NFTEVDVF9DQVJESUQpIHx8CisJCQkJKGNhcmRfc2VsZWN0X21ldGhvZCA9PSBNQ19TRUxFQ1RfQ0FSRFRZUEUpKSkKKwkJCXsKKwkJCQkvLyBzYW1lIE1BQyBlbnRyeSBpcyBmb3VuZAorCQkJCWNhcmRfbWF0Y2hfaWQgPSBjYXJkX3NhbWVfbWFjX2lkOworCisJCQkJaWYgKGNhcmRfc2VsZWN0X21ldGhvZCA9PSBNQ19TRUxFQ1RfQ0FSRFRZUEUpCisJCQkJeworCQkJCQkvLyBmb3IgQ0FSRFRZUEUKKwkJCQkJc3ByaW50ZihjYXJkX2lkX2J1ZiwgIiUwMmRDQVJEVFlQRSVzIiwKKwkJCQkJCQljYXJkX21hdGNoX2lkLCBSRklDX3dvcmQpOworCisJCQkJCWlmICgoc3RhcnRfcHRyPXJ0c3Ryc3RydW5jYXNlY21wKGJ1ZmZlciwgY2FyZF9pZF9idWYpKSAhPSBOVUxMKQorCQkJCQl7CisJCQkJCQkvLyB3ZSBmb3VuZCB0aGUgY2FyZCBJRAorCQkJCQkJTEVUVEVSX0NBU0VfVFJBTlNMQVRFKHN0YXJ0X3B0ciwgY2FyZF9pZF9idWYpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIHRoZSBjYXJkIGlzIDFzdCBwbHVnLWluLCB0cnkgdG8gZmluZCB0aGUgbWF0Y2ggY2FyZCBwcm9maWxlCisJCQkJc3dpdGNoKGNhcmRfc2VsZWN0X21ldGhvZCkKKwkJCQl7CisJCQkJCWNhc2UgTUNfU0VMRUNUX0NBUkRJRDogLy8gQ0FSRElECisJCQkJCWRlZmF1bHQ6CisJCQkJCQlpZiAoY2FyZF9mcmVlX2lkID49IDApCisJCQkJCQkJY2FyZF9tYXRjaF9pZCA9IGNhcmRfZnJlZV9pZDsKKwkJCQkJCWVsc2UKKwkJCQkJCQljYXJkX21hdGNoX2lkID0gY2FyZF9ub3VzZV9pZDsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgTUNfU0VMRUNUX01BQzogLy8gTUFDCisJCQkJCQlzcHJpbnRmKGNhcmRfaWRfYnVmLCAiTUFDJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLAorCQkJCQkJCQltYWNbMF0sIG1hY1sxXSwgbWFjWzJdLAorCQkJCQkJCQltYWNbM10sIG1hY1s0XSwgbWFjWzVdKTsKKworCQkJCQkJLyogdHJ5IHRvIGZpbmQgdGhlIGtleSB3b3JkIGluIHRoZSBjYXJkIGZpbGUgKi8KKwkJCQkJCWlmICgoc3RhcnRfcHRyPXJ0c3Ryc3RydW5jYXNlY21wKGJ1ZmZlciwgY2FyZF9pZF9idWYpKSAhPSBOVUxMKQorCQkJCQkJeworCQkJCQkJCUxFVFRFUl9DQVNFX1RSQU5TTEFURShzdGFydF9wdHIsIGNhcmRfaWRfYnVmKTsKKworCQkJCQkJCS8qIGdldCB0aGUgcm93IElEICgyIEFTQ0lJIGNoYXJhY3RlcnMpICovCisJCQkJCQkJc3RhcnRfcHRyIC09IDI7CisJCQkJCQkJY2FyZF9pZF9idWZbMF0gPSAqKHN0YXJ0X3B0cik7CisJCQkJCQkJY2FyZF9pZF9idWZbMV0gPSAqKHN0YXJ0X3B0cisxKTsKKwkJCQkJCQljYXJkX2lkX2J1ZlsyXSA9IDB4MDA7CisKKwkJCQkJCQljYXJkX21hdGNoX2lkID0gc2ltcGxlX3N0cnRvbChjYXJkX2lkX2J1ZiwgMCwgMTApOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBNQ19TRUxFQ1RfQ0FSRFRZUEU6IC8vIENBUkRUWVBFCisJCQkJCQljYXJkX25vdXNlX2lkID0gLTE7CisKKwkJCQkJCWZvcihjYXJkX2luZGV4PTA7CisJCQkJCQkJY2FyZF9pbmRleDxNQVhfTlVNX09GX01VTFRJUExFX0NBUkQ7CisJCQkJCQkJY2FyZF9pbmRleCsrKQorCQkJCQkJeworCQkJCQkJCXNwcmludGYoY2FyZF9pZF9idWYsICIlMDJkQ0FSRFRZUEUlcyIsCisJCQkJCQkJCQljYXJkX2luZGV4LCBSRklDX3dvcmQpOworCisJCQkJCQkJaWYgKChzdGFydF9wdHI9cnRzdHJzdHJ1bmNhc2VjbXAoYnVmZmVyLAorCQkJCQkJCQkJCQkJCQljYXJkX2lkX2J1ZikpICE9IE5VTEwpCisJCQkJCQkJeworCQkJCQkJCQlMRVRURVJfQ0FTRV9UUkFOU0xBVEUoc3RhcnRfcHRyLCBjYXJkX2lkX2J1Zik7CisKKwkJCQkJCQkJaWYgKE1DX0NhcmRVc2VkW2NhcmRfaW5kZXhdID09IDApCisJCQkJCQkJCXsKKwkJCQkJCQkJCS8qIGN1cnJlbnQgdGhlIGNhcmQgcHJvZmlsZSBpcyBub3QgdXNlZCAqLworCQkJCQkJCQkJaWYgKCgqKFVJTlQzMiAqKSZNQ19DYXJkTWFjW2NhcmRfaW5kZXhdWzBdID09IDApICYmCisJCQkJCQkJCQkJKCooVUlOVDE2ICopJk1DX0NhcmRNYWNbY2FyZF9pbmRleF1bNF0gPT0gMCkpCisJCQkJCQkJCQl7CisJCQkJCQkJCQkJLy8gZmluZCBpdCBhbmQgbm8gcHJldmlvdXMgY2FyZCB1c2UgaXQKKwkJCQkJCQkJCQljYXJkX21hdGNoX2lkID0gY2FyZF9pbmRleDsKKwkJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWVsc2UKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQkvLyBldmVyIGEgY2FyZCB1c2UgaXQKKwkJCQkJCQkJCQlpZiAoY2FyZF9ub3VzZV9pZCA8IDApCisJCQkJCQkJCQkJCWNhcmRfbm91c2VfaWQgPSBjYXJkX2luZGV4OworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCisJCQkJCQkvLyBpZiBub3QgZmluZCBhIGZyZWUgb25lLCB1c2UgdGhlIGF2YWlsYWJsZSBvbmUKKwkJCQkJCWlmIChjYXJkX21hdGNoX2lkIDwgMCkKKwkJCQkJCQljYXJkX21hdGNoX2lkID0gY2FyZF9ub3VzZV9pZDsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGNhcmRfbWF0Y2hfaWQgPj0gMCkKKwkJCXsKKwkJCQkvLyBtYWtlIHVwIHNlYXJjaCBrZXl3b3JkCisJCQkJc3dpdGNoKGNhcmRfc2VsZWN0X21ldGhvZCkKKwkJCQl7CisJCQkJCWNhc2UgTUNfU0VMRUNUX0NBUkRJRDogLy8gQ0FSRElECisJCQkJCQlzcHJpbnRmKGNhcmRfaWRfYnVmLCAiJTAyZENBUkRJRCIsIGNhcmRfbWF0Y2hfaWQpOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBNQ19TRUxFQ1RfTUFDOiAvLyBNQUMKKwkJCQkJCXNwcmludGYoY2FyZF9pZF9idWYsCisJCQkJCQkJCSIlMDJkbWFjJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLAorCQkJCQkJCQljYXJkX21hdGNoX2lkLAorCQkJCQkJCQltYWNbMF0sIG1hY1sxXSwgbWFjWzJdLAorCQkJCQkJCQltYWNbM10sIG1hY1s0XSwgbWFjWzVdKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgTUNfU0VMRUNUX0NBUkRUWVBFOiAvLyBDQVJEVFlQRQorCQkJCQlkZWZhdWx0OgorCQkJCQkJc3ByaW50ZihjYXJkX2lkX2J1ZiwgIiUwMmRjYXJkdHlwZSVzIiwKKwkJCQkJCQkJY2FyZF9tYXRjaF9pZCwgUkZJQ193b3JkKTsKKwkJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNlYXJjaCBLZXl3b3JkID0gJXNcbiIsIGNhcmRfaWRfYnVmKSk7CisKKwkJCQkvLyByZWFkIGNhcmQgZmlsZSBwYXRoCisJCQkJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoY2FyZF9pZF9idWYsIHRtcGJ1ZiwgMjU2LCBidWZmZXIpKQorCQkJCXsKKwkJCQkJaWYgKHN0cmxlbih0bXBidWYpIDwgc2l6ZW9mKHBBZC0+TUNfRmlsZU5hbWUpKQorCQkJCQl7CisJCQkJCQkvLyBiYWNrdXAgY2FyZCBpbmZvcm1hdGlvbgorCQkJCQkJcEFkLT5NQ19Sb3dJRCA9IGNhcmRfbWF0Y2hfaWQ7IC8qIGJhc2UgMCAqLworCQkJCQkJTUNfQ2FyZFVzZWRbY2FyZF9tYXRjaF9pZF0gPSAxOworCQkJCQkJbWVtY3B5KE1DX0NhcmRNYWNbY2FyZF9tYXRjaF9pZF0sIG1hYywgc2l6ZW9mKG1hYykpOworCisJCQkJCQkvLyBiYWNrdXAgY2FyZCBmaWxlIHBhdGgKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TUNfRmlsZU5hbWUsIHRtcGJ1ZiAsIHN0cmxlbih0bXBidWYpKTsKKwkJCQkJCXBBZC0+TUNfRmlsZU5hbWVbc3RybGVuKHRtcGJ1ZildID0gJ1wwJzsKKwkJCQkJCWZsZ19tYXRjaF9vayA9IFRSVUU7CisKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJCQkoIkNhcmQgUHJvZmlsZSBOYW1lID0gJXNcbiIsIHBBZC0+TUNfRmlsZU5hbWUpKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkJCQkoIkNhcmQgUHJvZmlsZSBOYW1lIGxlbmd0aCB0b28gbGFyZ2UhXG4iKSk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJCQkJKCJDYW4gbm90IGZpbmQgc2VhcmNoIGtleSB3b3JkIGluIGNhcmQuZGF0IVxuIikpOworCQkJCX0KKworCQkJCWlmICgoZmxnX21hdGNoX29rICE9IFRSVUUpICYmCisJCQkJCShjYXJkX21hdGNoX2lkIDwgTUFYX05VTV9PRl9NVUxUSVBMRV9DQVJEKSkKKwkJCQl7CisJCQkJCU1DX0NhcmRVc2VkW2NhcmRfbWF0Y2hfaWRdID0gMDsKKwkJCQkJbWVtc2V0KE1DX0NhcmRNYWNbY2FyZF9tYXRjaF9pZF0sIDAsIHNpemVvZihtYWMpKTsKKwkJCQl9CisJCQl9IC8vIGlmIChjYXJkX21hdGNoX2lkID49IDApCisJCX0KKwl9CisKKwkvLyBjbG9zZSBmaWxlCisJcmV0dmFsID0gZmlscF9jbG9zZShzcmNmLCBOVUxMKTsKKwlzZXRfZnMob3JnZnMpOworCWN1cnJlbnQtPmZzdWlkID0gb3JnZnN1aWQ7CisJY3VycmVudC0+ZnNnaWQgPSBvcmdmc2dpZDsKKwlrZnJlZShidWZmZXIpOworCWtmcmVlKHRtcGJ1Zik7CisJcmV0dXJuIGZsZ19tYXRjaF9vazsKK30KKyNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIFByb2JlIFJUMjhYWCBjaGlwc2V0LgorCitBcmd1bWVudHM6CisgICAgX2Rldl9wCQkJCVBvaW50IHRvIHRoZSBQQ0kgb3IgVVNCIGRldmljZQorCV9kZXZfaWRfcAkJCVBvaW50IHRvIHRoZSBQQ0kgb3IgVVNCIGRldmljZSBJRAorCitSZXR1cm4gVmFsdWU6CisgICAgMAkJCQkJUHJvYmUgT0sKKwktRU5PREVWCQkJCVByb2JlIEZhaWwKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBfX2RldmluaXQgICBydDI4eHhfcHJvYmUoCisgICAgSU4gIHZvaWQgKl9kZXZfcCwKKyAgICBJTiAgdm9pZCAqX2Rldl9pZF9wLAorCUlOICBVSU5UIGFyZ2MsCisJT1VUIFBSVE1QX0FEQVBURVIgKnBwQWQpCit7CisgICAgc3RydWN0ICBuZXRfZGV2aWNlCSpuZXRfZGV2OworICAgIFBSVE1QX0FEQVBURVIgICAgICAgcEFkID0gKFBSVE1QX0FEQVBURVIpIE5VTEw7CisgICAgSU5UICAgICAgICAgICAgICAgICBzdGF0dXM7CisJUFZPSUQJCQkJaGFuZGxlOworI2lmZGVmIFJUMjg2MAorCXN0cnVjdCBwY2lfZGV2ICpkZXZfcCA9IChzdHJ1Y3QgcGNpX2RldiAqKV9kZXZfcDsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1RBIERyaXZlciB2ZXJzaW9uLSVzXG4iLCBTVEFfRFJJVkVSX1ZFUlNJT04pKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8PSAweDIwNDAyICAgICAgIC8vIFJlZCBIYXQgNy4xCisgICAgbmV0X2RldiA9IGFsbG9jX25ldGRldihzaXplb2YoUFJUTVBfQURBUFRFUiksICJldGglZCIsIGV0aGVyX3NldHVwKTsKKyNlbHNlCisgICAgbmV0X2RldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihQUlRNUF9BREFQVEVSKSk7CisjZW5kaWYKKyAgICBpZiAobmV0X2RldiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJhbGxvY19uZXRkZXYgZmFpbGVkXG4iKTsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMTUpCisJCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworI2VuZGlmIC8vTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDE1KQorI2Vsc2UKKwkJTU9EX0RFQ19VU0VfQ09VTlQ7CisjZW5kaWYKKyAgICAgICAgZ290byBlcnJfb3V0OworICAgIH0KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkKKyAgICBTRVRfTU9EVUxFX09XTkVSKG5ldF9kZXYpOworI2VuZGlmCisKKwluZXRpZl9zdG9wX3F1ZXVlKG5ldF9kZXYpOworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisvKiBmb3Igc3VwcG9ydGluZyBOZXR3b3JrIE1hbmFnZXIgKi8KKy8qIFNldCB0aGUgc3lzZnMgcGh5c2ljYWwgZGV2aWNlIHJlZmVyZW5jZSBmb3IgdGhlIG5ldHdvcmsgbG9naWNhbCBkZXZpY2UKKyAqIGlmIHNldCBwcmlvciB0byByZWdpc3RyYXRpb24gd2lsbCBjYXVzZSBhIHN5bWxpbmsgZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkpCisgICAgU0VUX05FVERFVl9ERVYobmV0X2RldiwgJihkZXZfcC0+ZGV2KSk7CisjZW5kaWYKKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisJLy8gQWxsb2NhdGUgUlRNUF9BREFQVEVSIG1pbmlwb3J0IGFkYXB0ZXIgc3RydWN0dXJlCisJaGFuZGxlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG9zX2Nvb2tpZSksIEdGUF9LRVJORUwpOworCVJUMjhYWF9IQU5ETEVfREVWX0FTU0lHTihoYW5kbGUsIGRldl9wKTsKKworCXN0YXR1cyA9IFJUTVBBbGxvY0FkYXB0ZXJCbG9jayhoYW5kbGUsICZwQWQpOworCWlmIChzdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJZ290byBlcnJfb3V0X2ZyZWVfbmV0ZGV2OworCisJbmV0X2Rldi0+bWxfcHJpdiA9IChQVk9JRClwQWQ7CisgICAgcEFkLT5uZXRfZGV2ID0gbmV0X2RldjsgLy8gbXVzdCBiZSBiZWZvcmUgUlQyOFhYTmV0RGV2SW5pdCgpCisKKwlSVDI4WFhOZXREZXZJbml0KF9kZXZfcCwgbmV0X2RldiwgcEFkKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorICAgIHBBZC0+U3RhQ2ZnLk9yaURldlR5cGUgPSBuZXRfZGV2LT50eXBlOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8gUG9zdCBjb25maWcKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwlpZiAoUlQyOFhYUHJvYmVQb3N0Q29uZmlnKF9kZXZfcCwgcEFkLCBhcmdjKSA9PSBGQUxTRSkKKwkJZ290byBlcnJfb3V0X3VubWFwOworI2Vsc2UKKwlpZiAoUlQyOFhYUHJvYmVQb3N0Q29uZmlnKF9kZXZfcCwgcEFkLCAwKSA9PSBGQUxTRSkKKwkJZ290byBlcnJfb3V0X3VubWFwOworI2VuZGlmIC8vIExJTlVYX1ZFUlNJT05fQ09ERSAvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJcEFkLT5PcE1vZGUgPSBPUE1PREVfU1RBOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKKyNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKKwkvLyBmaW5kIGl0cyBwcm9maWxlIHBhdGgKKwlwQWQtPk1DX1Jvd0lEID0gLTE7IC8vIHVzZSBkZWZhdWx0IHByb2ZpbGUgcGF0aAorCVJUTVBfQ2FyZEluZm9SZWFkKHBBZCk7CisKKwlpZiAocEFkLT5NQ19Sb3dJRCA9PSAtMSkKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJc3RyY3B5KHBBZC0+TUNfRmlsZU5hbWUsIFNUQV9QUk9GSUxFX1BBVEgpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkoIk1DPiBST1cgPSAlZCwgUEFUSCA9ICVzXG4iLCBwQWQtPk1DX1Jvd0lELCBwQWQtPk1DX0ZpbGVOYW1lKSk7CisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisKKwkvLyBzYW1wbGUgbW92ZQorCWlmIChydF9pZWVlODAyMTFfaWZfc2V0dXAobmV0X2RldiwgcEFkKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQlnb3RvIGVycl9vdXRfdW5tYXA7CisKKyAgICAvLyBSZWdpc3RlciB0aGlzIGRldmljZQorICAgIHN0YXR1cyA9IHJlZ2lzdGVyX25ldGRldihuZXRfZGV2KTsKKyAgICBpZiAoc3RhdHVzKQorICAgICAgICBnb3RvIGVycl9vdXRfdW5tYXA7CisKKyAgICAvLyBTZXQgZHJpdmVyIGRhdGEKKwlSVDI4WFhfRFJWREFUQV9TRVQoX2Rldl9wKTsKKworCSpwcEFkID0gcEFkOworICAgIHJldHVybiAwOyAvLyBwcm9iZSBvaworCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRVJST1IgSEFORExFIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworZXJyX291dF91bm1hcDoKKwlSVE1QRnJlZUFkYXB0ZXIocEFkKTsKKwlSVDI4WFhfVU5NQVAoKTsKKworZXJyX291dF9mcmVlX25ldGRldjoKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisgICAgZnJlZV9uZXRkZXYobmV0X2Rldik7CisjZWxzZQorCWtmcmVlKG5ldF9kZXYpOworI2VuZGlmCisKK2Vycl9vdXQ6CisJUlQyOFhYX1BVVF9ERVZJQ0UoZGV2X3ApOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJcmV0dXJuIChMT05HKU5VTEw7CisjZWxzZQorICAgIHJldHVybiAtRU5PREVWOyAvKiBwcm9iZSBmYWlsICovCisjZW5kaWYgLy8gTElOVVhfVkVSU0lPTl9DT0RFIC8vCit9IC8qIEVuZCBvZiBydDI4eHhfcHJvYmUgKi8KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIFRoZSBlbnRyeSBwb2ludCBmb3IgTGludXgga2VybmVsIHNlbnQgcGFja2V0IHRvIG91ciBkcml2ZXIuCisKK0FyZ3VtZW50czoKKyAgICBza19idWZmICpza2IJCXRoZSBwb2ludGVyIHJlZmVyIHRvIGEgc2tfYnVmZmVyLgorCitSZXR1cm4gVmFsdWU6CisgICAgMAorCitOb3RlOgorCVRoaXMgZnVuY3Rpb24gaXMgdGhlIGVudHJ5IHBvaW50IG9mIFR4IFBhdGggZm9yIE9zIGRlbGl2ZXJ5IHBhY2tldCB0bworCW91ciBkcml2ZXIuIFlvdSBvbmx5IGNhbiBwdXQgT1MtZGVwZW5lZCAmIFNUQS9BUCBjb21tb24gaGFuZGxlIHByb2NlZHVyZXMKKwlpbiBoZXJlLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IHJ0Mjh4eF9wYWNrZXRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gc2tiLT5kZXY7CisJUFJUTVBfQURBUFRFUiBwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCWludCBzdGF0dXMgPSAwOworCVBORElTX1BBQ0tFVCBwUGFja2V0ID0gKFBORElTX1BBQ0tFVCkgc2tiOworCisJLyogUlQyODcwU1RBIGRvZXMgdGhpcyBpbiBSVE1QU2VuZFBhY2tldHMoKSAqLworI2lmZGVmIFJBTElOS19BVEUKKwlpZiAoQVRFX09OKHBBZCkpCisJeworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfUkVTT1VSQ0VTKTsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQkvLyBEcm9wIHNlbmQgcmVxdWVzdCBzaW5jZSB3ZSBhcmUgaW4gbW9uaXRvciBtb2RlCisJCWlmIChNT05JVE9SX09OKHBBZCkpCisJCXsKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworICAgICAgICAvLyBFYXBvbFN0YXJ0IHNpemUgaXMgMTgKKwlpZiAoc2tiLT5sZW4gPCAxNCkKKwl7CisJCS8vcHJpbnRrKCJiYWQgcGFja2V0IHNpemU6ICVkXG4iLCBwa3QtPmxlbik7CisJCWhleF9kdW1wKCJiYWQgcGFja2V0Iiwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJZ290byBkb25lOworCX0KKworCVJUTVBfU0VUX1BBQ0tFVF81VlQocFBhY2tldCwgMCk7CisjaWZkZWYgQ09ORklHXzVWVF9FTkhBTkNFCisgICAgaWYgKCooaW50Kikoc2tiLT5jYikgPT0gQlJJREdFX1RBRykgeworCQlSVE1QX1NFVF9QQUNLRVRfNVZUKHBQYWNrZXQsIDEpOworICAgIH0KKyNlbmRpZgorCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCisJCVNUQVNlbmRQYWNrZXRzKChORElTX0hBTkRMRSlwQWQsIChQUE5ESVNfUEFDS0VUKSAmcFBhY2tldCwgMSk7CisJfQorCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlzdGF0dXMgPSAwOworZG9uZToKKworCXJldHVybiBzdGF0dXM7Cit9CisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBTZW5kIGEgcGFja2V0IHRvIFdMQU4uCisKK0FyZ3VtZW50czoKKyAgICBza2JfcCAgICAgICAgICAgcG9pbnRzIHRvIG91ciBhZGFwdGVyCisgICAgZGV2X3AgICAgICAgICAgIHdoaWNoIFdMQU4gbmV0d29yayBpbnRlcmZhY2UKKworUmV0dXJuIFZhbHVlOgorICAgIDA6IHRyYW5zbWl0IHN1Y2Nlc3NmdWxseQorICAgIG90aGVyd2lzZTogdHJhbnNtaXQgZmFpbAorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIHJ0Mjh4eF9zZW5kX3BhY2tldHMoCisJSU4gc3RydWN0IHNrX2J1ZmYgCQkqc2tiX3AsCisJSU4gc3RydWN0IG5ldF9kZXZpY2UgCSpuZXRfZGV2KQoreworICAgIFJUTVBfQURBUFRFUiAqcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKwlpZiAoIShuZXRfZGV2LT5mbGFncyAmIElGRl9VUCkpCisJeworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgKFBORElTX1BBQ0tFVClza2JfcCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybiAwOworCX0KKworCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpJnNrYl9wLT5jYltDQl9PRkZdLCAxNSk7CisJUlRNUF9TRVRfUEFDS0VUX05FVF9ERVZJQ0VfTUJTU0lEKHNrYl9wLCBNQUlOX01CU1NJRCk7CisKKwlyZXR1cm4gcnQyOHh4X3BhY2tldF94bWl0KHNrYl9wKTsKKworfSAvKiBFbmQgb2YgTUJTU19WaXJ0dWFsSUZfUGFja2V0U2VuZCAqLworCisKKworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDw9IDB4MjA0MDIJLy8gUmVkIEhhdCA3LjEKK3N0cnVjdCBuZXRfZGV2aWNlICphbGxvY19uZXRkZXYoCisJaW50IHNpemVvZl9wcml2LAorCWNvbnN0IGNoYXIgKm1hc2ssCisJdm9pZCAoKnNldHVwKShzdHJ1Y3QgbmV0X2RldmljZSAqKSkKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZQkqZGV2OworICAgIElOVAkJCQkJYWxsb2Nfc2l6ZTsKKworCisgICAgLyogZW5zdXJlIDMyLWJ5dGUgYWxpZ25tZW50IG9mIHRoZSBwcml2YXRlIGFyZWEgKi8KKyAgICBhbGxvY19zaXplID0gc2l6ZW9mICgqZGV2KSArIHNpemVvZl9wcml2ICsgMzE7CisKKyAgICBkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikga21hbGxvYyhhbGxvY19zaXplLCBHRlBfS0VSTkVMKTsKKyAgICBpZiAoZGV2ID09IE5VTEwpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkoImFsbG9jX25ldGRldjogVW5hYmxlIHRvIGFsbG9jYXRlIGRldmljZSBtZW1vcnkuXG4iKSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIG1lbXNldChkZXYsIDAsIGFsbG9jX3NpemUpOworCisgICAgaWYgKHNpemVvZl9wcml2KQorICAgICAgICBkZXYtPnByaXYgPSAodm9pZCAqKSAoKChsb25nKShkZXYgKyAxKSArIDMxKSAmIH4zMSk7CisKKyAgICBzZXR1cChkZXYpOworICAgIHN0cmNweShkZXYtPm5hbWUsIG1hc2spOworCisgICAgcmV0dXJuIGRldjsKK30KKyNlbmRpZiAvLyBMSU5VWF9WRVJTSU9OX0NPREUgLy8KKworCit2b2lkIENmZ0luaXRIb29rKFBSVE1QX0FEQVBURVIgcEFkKQoreworCXBBZC0+YkJyb2FkQ29tSFQgPSBUUlVFOworfSAvKiBFbmQgb2YgQ2ZnSW5pdEhvb2sgKi8KKworCisjaWYgV0lSRUxFU1NfRVhUID49IDEyCisvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW4gcXVlcnkgL3Byb2MKK3N0cnVjdCBpd19zdGF0aXN0aWNzICpydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzKAorICAgIElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworCVBSVE1QX0FEQVBURVIgcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnQyOHh4X2dldF93aXJlbGVzc19zdGF0cyAtLS0+XG4iKSk7CisKKwlwQWQtPml3X3N0YXRzLnN0YXR1cyA9IDA7IC8vIFN0YXR1cyAtIGRldmljZSBkZXBlbmRlbnQgZm9yIG5vdworCisJLy8gbGluayBxdWFsaXR5CisJcEFkLT5pd19zdGF0cy5xdWFsLnF1YWwgPSAoKHBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSAqIDEyKS8xMCArIDEwKTsKKwlpZihwQWQtPml3X3N0YXRzLnF1YWwucXVhbCA+IDEwMCkKKwkJcEFkLT5pd19zdGF0cy5xdWFsLnF1YWwgPSAxMDA7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKKwkJcEFkLT5pd19zdGF0cy5xdWFsLmxldmVsID0gUlRNUE1heFJzc2kocEFkLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCXBBZC0+aXdfc3RhdHMucXVhbC5ub2lzZSA9IHBBZC0+QmJwV3JpdGVMYXRjaFs2Nl07IC8vIG5vaXNlIGxldmVsIChkQm0pCisKKwlwQWQtPml3X3N0YXRzLnF1YWwubm9pc2UgKz0gMjU2IC0gMTQzOworCXBBZC0+aXdfc3RhdHMucXVhbC51cGRhdGVkID0gMTsgICAgIC8vIEZsYWdzIHRvIGtub3cgaWYgdXBkYXRlZAorI2lmZGVmIElXX1FVQUxfREJNCisJcEFkLT5pd19zdGF0cy5xdWFsLnVwZGF0ZWQgfD0gSVdfUVVBTF9EQk07CS8vIExldmVsICsgTm9pc2UgYXJlIGRCbQorI2VuZGlmIC8vIElXX1FVQUxfREJNIC8vCisKKwlwQWQtPml3X3N0YXRzLmRpc2NhcmQubndpZCA9IDA7ICAgICAvLyBSeCA6IFdyb25nIG53aWQvZXNzaWQKKwlwQWQtPml3X3N0YXRzLm1pc3MuYmVhY29uID0gMDsgICAgICAvLyBNaXNzZWQgYmVhY29ucy9zdXBlcmZyYW1lCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0tIHJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHNcbiIpKTsKKwlyZXR1cm4gJnBBZC0+aXdfc3RhdHM7Cit9IC8qIEVuZCBvZiBydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzICovCisjZW5kaWYgLy8gV0lSRUxFU1NfRVhUIC8vCisKKworCit2b2lkIHRidHRfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisjZGVmaW5lIE1BWF9UWF9JTl9UQlRUCQkoMTYpCisKK30KKworSU5UIHJ0Mjh4eF9pb2N0bCgKKwlJTglzdHJ1Y3QgbmV0X2RldmljZQkqbmV0X2RldiwKKwlJTglPVVQJc3RydWN0IGlmcmVxCSpycSwKKwlJTglJTlQJCQkJCWNtZCkKK3sKKwlWSVJUVUFMX0FEQVBURVIJKnBWaXJ0dWFsQWQgPSBOVUxMOworCVJUTVBfQURBUFRFUgkqcEFkID0gTlVMTDsKKwlJTlQJCQkJcmV0ID0gMDsKKworCWlmIChuZXRfZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisJCXBBZCA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPm1sX3ByaXY7CisJfQorCisJaWYgKHBBZCA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPm1sX3ByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJcmV0ID0gcnQyOHh4X3N0YV9pb2N0bChuZXRfZGV2LCBycSwgY21kKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICAgICAgcmV0dXJuIGV0aGVybmV0IHN0YXRpc3RpY3MgY291bnRlcgorCisgICAgQXJndW1lbnRzOgorICAgICAgICBuZXRfZGV2ICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBuZXRfZGV2aWNlCisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIG5ldF9kZXZpY2Vfc3RhdHMqCisKKyAgICBOb3RlOgorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKlJUMjh4eF9nZXRfZXRoZXJfc3RhdHMoCisgICAgSU4gIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworICAgIFJUTVBfQURBUFRFUiAqcEFkID0gTlVMTDsKKworCWlmIChuZXRfZGV2KQorCQlwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCisJaWYgKHBBZCkKKwl7CisKKwkJcEFkLT5zdGF0cy5yeF9wYWNrZXRzID0gcEFkLT5XbGFuQ291bnRlcnMuUmVjZWl2ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0OworCQlwQWQtPnN0YXRzLnR4X3BhY2tldHMgPSBwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQ7CisKKwkJcEFkLT5zdGF0cy5yeF9ieXRlcyA9IHBBZC0+UmFsaW5rQ291bnRlcnMuUmVjZWl2ZWRCeXRlQ291bnQ7CisJCXBBZC0+c3RhdHMudHhfYnl0ZXMgPSBwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQnl0ZUNvdW50OworCisJCXBBZC0+c3RhdHMucnhfZXJyb3JzID0gcEFkLT5Db3VudGVyczgwMjMuUnhFcnJvcnM7CisJCXBBZC0+c3RhdHMudHhfZXJyb3JzID0gcEFkLT5Db3VudGVyczgwMjMuVHhFcnJvcnM7CisKKwkJcEFkLT5zdGF0cy5yeF9kcm9wcGVkID0gMDsKKwkJcEFkLT5zdGF0cy50eF9kcm9wcGVkID0gMDsKKworCSAgICBwQWQtPnN0YXRzLm11bHRpY2FzdCA9IHBBZC0+V2xhbkNvdW50ZXJzLk11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudC5RdWFkUGFydDsgICAvLyBtdWx0aWNhc3QgcGFja2V0cyByZWNlaXZlZAorCSAgICBwQWQtPnN0YXRzLmNvbGxpc2lvbnMgPSBwQWQtPkNvdW50ZXJzODAyMy5PbmVDb2xsaXNpb24gKyBwQWQtPkNvdW50ZXJzODAyMy5Nb3JlQ29sbGlzaW9uczsgIC8vIENvbGxpc2lvbiBwYWNrZXRzCisKKwkgICAgcEFkLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzID0gMDsKKwkgICAgcEFkLT5zdGF0cy5yeF9vdmVyX2Vycm9ycyA9IHBBZC0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXI7ICAgICAgICAgICAgICAgICAgIC8vIHJlY2VpdmVyIHJpbmcgYnVmZiBvdmVyZmxvdworCSAgICBwQWQtPnN0YXRzLnJ4X2NyY19lcnJvcnMgPSAwOy8vcEFkLT5XbGFuQ291bnRlcnMuRkNTRXJyb3JDb3VudDsgICAgIC8vIHJlY3ZlZCBwa3Qgd2l0aCBjcmMgZXJyb3IKKwkgICAgcEFkLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMgPSBwQWQtPkNvdW50ZXJzODAyMy5SY3ZBbGlnbm1lbnRFcnJvcnM7ICAgICAgICAgIC8vIHJlY3YnZCBmcmFtZSBhbGlnbm1lbnQgZXJyb3IKKwkgICAgcEFkLT5zdGF0cy5yeF9maWZvX2Vycm9ycyA9IHBBZC0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXI7ICAgICAgICAgICAgICAgICAgIC8vIHJlY3YnciBmaWZvIG92ZXJydW4KKwkgICAgcEFkLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY2VpdmVyIG1pc3NlZCBwYWNrZXQKKworCSAgICAvLyBkZXRhaWxlZCB0eF9lcnJvcnMKKwkgICAgcEFkLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycyA9IDA7CisJICAgIHBBZC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMgPSAwOworCSAgICBwQWQtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzID0gMDsKKwkgICAgcEFkLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzID0gMDsKKwkgICAgcEFkLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzID0gMDsKKworCSAgICAvLyBmb3IgY3NsaXAgZXRjCisJICAgIHBBZC0+c3RhdHMucnhfY29tcHJlc3NlZCA9IDA7CisJICAgIHBBZC0+c3RhdHMudHhfY29tcHJlc3NlZCA9IDA7CisKKwkJcmV0dXJuICZwQWQtPnN0YXRzOworCX0KKwllbHNlCisgICAgCXJldHVybiBOVUxMOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X3Byb2ZpbGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfcHJvZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNmEzY2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X3Byb2ZpbGUuYwpAQCAtMCwwICsxLDE5ODEgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpbmNsdWRlICJydF9jb25maWcuaCIKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorc3RhdGljIHZvaWQgSFRQYXJhbWV0ZXJzSG9vaygKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglDSEFSCQkgICpwVmFsdWVTdHIsCisJSU4JQ0hBUgkJICAqcElucHV0KTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2RlZmluZSBFVEhfTUFDX0FERFJfU1RSX0xFTiAxNyAgLy8gaW4gZm9ybWF0IG9mIHh4Onh4Onh4Onh4Onh4Onh4CisKKy8vIFdlIGFzc3VtZSB0aGUgczEgaXMgYSBzdGluZywgczIgaXMgYSBtZW1vcnkgc3BhY2Ugd2l0aCA2IGJ5dGVzLiBhbmQgY29udGVudCBvZiBzMSB3aWxsIGJlIGNoYW5nZWQuCitCT09MRUFOIHJ0c3RybWFjdG9oZXgoY2hhciAqczEsIGNoYXIgKnMyKQoreworCWludCBpID0gMDsKKwljaGFyICpwdG9rUyA9IHMxLCAqcHRva0UgPSBzMTsKKworCWlmIChzdHJsZW4oczEpICE9IEVUSF9NQUNfQUREUl9TVFJfTEVOKQorCQlyZXR1cm4gRkFMU0U7CisKKwl3aGlsZSgoKnB0b2tTKSAhPSAnXDAnKQorCXsKKwkJaWYoKHB0b2tFID0gc3RyY2hyKHB0b2tTLCAnOicpKSAhPSBOVUxMKQorCQkJKnB0b2tFKysgPSAnXDAnOworCQlpZiAoKHN0cmxlbihwdG9rUykgIT0gMikgfHwgKCFpc3hkaWdpdCgqcHRva1MpKSB8fCAoIWlzeGRpZ2l0KCoocHRva1MrMSkpKSkKKwkJCWJyZWFrOyAvLyBmYWlsCisJCUF0b0gocHRva1MsICZzMltpKytdLCAxKTsKKwkJcHRva1MgPSBwdG9rRTsKKwkJaWYgKGkgPT0gNikKKwkJCWJyZWFrOyAvLyBwYXJzaW5nIGZpbmlzaGVkCisJfQorCisJcmV0dXJuICggaSA9PSA2ID8gVFJVRSA6IEZBTFNFKTsKKworfQorCisKKy8vIHdlIGFzc3VtZSB0aGUgczEgYW5kIHMyIGJvdGggYXJlIHN0cmluZ3MuCitCT09MRUFOIHJ0c3RyY2FzZWNtcChjaGFyICpzMSwgY2hhciAqczIpCit7CisJY2hhciAqcDEgPSBzMSwgKnAyID0gczI7CisKKwlpZiAoc3RybGVuKHMxKSAhPSBzdHJsZW4oczIpKQorCQlyZXR1cm4gRkFMU0U7CisKKwl3aGlsZSgqcDEgIT0gJ1wwJykKKwl7CisJCWlmKCgqcDEgIT0gKnAyKSAmJiAoKCpwMSBeICpwMikgIT0gMHgyMCkpCisJCQlyZXR1cm4gRkFMU0U7CisJCXAxKys7CisJCXAyKys7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKKy8vIHdlIGFzc3VtZSB0aGUgczEgKGJ1ZmZlcikgYW5kIHMyIChrZXkpIGJvdGggYXJlIHN0cmluZ3MuCitjaGFyICogcnRzdHJzdHJ1bmNhc2VjbXAoY2hhciAqIHMxLCBjaGFyICogczIpCit7CisJSU5UIGwxLCBsMiwgaTsKKwljaGFyIHRlbXAxLCB0ZW1wMjsKKworCWwyID0gc3RybGVuKHMyKTsKKwlpZiAoIWwyKQorCQlyZXR1cm4gKGNoYXIgKikgczE7CisKKwlsMSA9IHN0cmxlbihzMSk7CisKKwl3aGlsZSAobDEgPj0gbDIpCisJeworCQlsMS0tOworCisJCWZvcihpPTA7IGk8bDI7IGkrKykKKwkJeworCQkJdGVtcDEgPSAqKHMxK2kpOworCQkJdGVtcDIgPSAqKHMyK2kpOworCisJCQlpZiAoKCdhJyA8PSB0ZW1wMSkgJiYgKHRlbXAxIDw9ICd6JykpCisJCQkJdGVtcDEgPSAnQScrKHRlbXAxLSdhJyk7CisJCQlpZiAoKCdhJyA8PSB0ZW1wMikgJiYgKHRlbXAyIDw9ICd6JykpCisJCQkJdGVtcDIgPSAnQScrKHRlbXAyLSdhJyk7CisKKwkJCWlmICh0ZW1wMSAhPSB0ZW1wMikKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChpID09IGwyKQorCQkJcmV0dXJuIChjaGFyICopIHMxOworCisJCXMxKys7CisJfQorCisJcmV0dXJuIE5VTEw7IC8vIG5vdCBmb3VuZAorfQorCisvL2FkZCBieSBrYXRoeQorCisgLyoqCisgICogc3Ryc3RyIC0gRmluZCB0aGUgZmlyc3Qgc3Vic3RyaW5nIGluIGEgJU5VTCB0ZXJtaW5hdGVkIHN0cmluZworICAqIEBzMTogVGhlIHN0cmluZyB0byBiZSBzZWFyY2hlZAorICAqIEBzMjogVGhlIHN0cmluZyB0byBzZWFyY2ggZm9yCisgICovCitjaGFyICogcnRzdHJzdHIoY29uc3QgY2hhciAqIHMxLGNvbnN0IGNoYXIgKiBzMikKK3sKKwlJTlQgbDEsIGwyOworCisJbDIgPSBzdHJsZW4oczIpOworCWlmICghbDIpCisJCXJldHVybiAoY2hhciAqKSBzMTsKKworCWwxID0gc3RybGVuKHMxKTsKKworCXdoaWxlIChsMSA+PSBsMikKKwl7CisJCWwxLS07CisJCWlmICghbWVtY21wKHMxLHMyLGwyKSkKKwkJCXJldHVybiAoY2hhciAqKSBzMTsKKwkJczErKzsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiByc3RydG9rIC0gU3BsaXQgYSBzdHJpbmcgaW50byB0b2tlbnMKKyAqIEBzOiBUaGUgc3RyaW5nIHRvIGJlIHNlYXJjaGVkCisgKiBAY3Q6IFRoZSBjaGFyYWN0ZXJzIHRvIHNlYXJjaCBmb3IKKyAqICogV0FSTklORzogc3RydG9rIGlzIGRlcHJlY2F0ZWQsIHVzZSBzdHJzZXAgaW5zdGVhZC4gSG93ZXZlciBzdHJzZXAgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBvbGQgYXJjaGl0ZWN0dXJlLgorICovCitjaGFyICogX19yc3RydG9rOworY2hhciAqIHJzdHJ0b2soY2hhciAqIHMsY29uc3QgY2hhciAqIGN0KQoreworCWNoYXIgKnNiZWdpbiwgKnNlbmQ7CisKKwlzYmVnaW4gID0gcyA/IHMgOiBfX3JzdHJ0b2s7CisJaWYgKCFzYmVnaW4pCisJeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzYmVnaW4gKz0gc3Ryc3BuKHNiZWdpbixjdCk7CisJaWYgKCpzYmVnaW4gPT0gJ1wwJykKKwl7CisJCV9fcnN0cnRvayA9IE5VTEw7CisJCXJldHVybiggTlVMTCApOworCX0KKworCXNlbmQgPSBzdHJwYnJrKCBzYmVnaW4sIGN0KTsKKwlpZiAoc2VuZCAmJiAqc2VuZCAhPSAnXDAnKQorCQkqc2VuZCsrID0gJ1wwJzsKKworCV9fcnN0cnRvayA9IHNlbmQ7CisKKwlyZXR1cm4gKHNiZWdpbik7Cit9CisKKy8qKgorICogZGVsaW1pdGNudCAtIHJldHVybiB0aGUgY291bnQgb2YgYSBnaXZlbiBkZWxpbWl0ZXIgaW4gYSBnaXZlbiBzdHJpbmcuCisgKiBAczogVGhlIHN0cmluZyB0byBiZSBzZWFyY2hlZC4KKyAqIEBjdDogVGhlIGRlbGltaXRlciB0byBzZWFyY2ggZm9yLgorICogTm90aWNlIDogV2Ugc3VwcG9zZSB0aGUgZGVsaW1pdGVyIGlzIGEgc2luZ2xlLWNoYXIgc3RyaW5nKGZvciBleGFtcGxlIDogIjsiKS4KKyAqLworSU5UIGRlbGltaXRjbnQoY2hhciAqIHMsY29uc3QgY2hhciAqIGN0KQoreworCUlOVCBjb3VudCA9IDA7CisJLyogcG9pbnQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSAqLworCWNvbnN0IGNoYXIgKnRva2VuID0gczsKKworCWZvciAoIDs7ICkKKwl7CisJCXRva2VuID0gc3RycGJyayh0b2tlbiwgY3QpOyAvKiBzZWFyY2ggZm9yIGRlbGltaXRlcnMgKi8KKworICAgICAgICBpZiAoIHRva2VuID09IE5VTEwgKQorCQl7CisJCQkvKiBhZHZhbmNlZCB0byB0aGUgdGVybWluYXRpbmcgbnVsbCBjaGFyYWN0ZXIgKi8KKwkJCWJyZWFrOworCQl9CisJCS8qIHNraXAgdGhlIGRlbGltaXRlciAqLworCSAgICArK3Rva2VuOworCisJCS8qCisJCSAqIFByaW50IHRoZSBmb3VuZCB0ZXh0OiB1c2UgbGVuIHdpdGggJS4qcyB0byBzcGVjaWZ5IGZpZWxkIHdpZHRoLgorCQkgKi8KKworCQkvKiBhY2N1bXVsYXRlIGRlbGltaXRlciBjb3VudCAqLworCSAgICArK2NvdW50OworCX0KKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qCisgICogY29udmVydHMgdGhlIEludGVybmV0IGhvc3QgYWRkcmVzcyBmcm9tIHRoZSBzdGFuZGFyZCBudW1iZXJzLWFuZC1kb3RzIG5vdGF0aW9uCisgICogaW50byBiaW5hcnkgZGF0YS4KKyAgKiByZXR1cm5zIG5vbnplcm8gaWYgdGhlIGFkZHJlc3MgaXMgdmFsaWQsIHplcm8gaWYgbm90LgorICAqLworaW50IHJ0aW5ldF9hdG9uKGNvbnN0IGNoYXIgKmNwLCB1bnNpZ25lZCBpbnQgKmFkZHIpCit7CisJdW5zaWduZWQgaW50IAl2YWw7CisJaW50ICAgICAgICAgCWJhc2UsIG47CisJY2hhciAgICAgICAgCWM7CisJdW5zaWduZWQgaW50ICAgIHBhcnRzWzRdOworCXVuc2lnbmVkIGludCAgICAqcHAgPSBwYXJ0czsKKworCWZvciAoOzspCisgICAgeworICAgICAgICAgLyoKKyAgICAgICAgICAqIENvbGxlY3QgbnVtYmVyIHVwIHRvIGBgLicnLgorICAgICAgICAgICogVmFsdWVzIGFyZSBzcGVjaWZpZWQgYXMgZm9yIEM6CisgICAgICAgICAgKgkweD1oZXgsIDA9b2N0YWwsIG90aGVyPWRlY2ltYWwuCisgICAgICAgICAgKi8KKyAgICAgICAgIHZhbCA9IDA7CisgICAgICAgICBiYXNlID0gMTA7CisgICAgICAgICBpZiAoKmNwID09ICcwJykKKyAgICAgICAgIHsKKyAgICAgICAgICAgICBpZiAoKisrY3AgPT0gJ3gnIHx8ICpjcCA9PSAnWCcpCisgICAgICAgICAgICAgICAgIGJhc2UgPSAxNiwgY3ArKzsKKyAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgIGJhc2UgPSA4OworICAgICAgICAgfQorICAgICAgICAgd2hpbGUgKChjID0gKmNwKSAhPSAnXDAnKQorICAgICAgICAgeworICAgICAgICAgICAgIGlmIChpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSBjKSkKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIHZhbCA9ICh2YWwgKiBiYXNlKSArIChjIC0gJzAnKTsKKyAgICAgICAgICAgICAgICAgY3ArKzsKKyAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGlmIChiYXNlID09IDE2ICYmIGlzeGRpZ2l0KCh1bnNpZ25lZCBjaGFyKSBjKSkKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIHZhbCA9ICh2YWwgPDwgNCkgKworICAgICAgICAgICAgICAgICAgICAgKGMgKyAxMCAtIChpc2xvd2VyKCh1bnNpZ25lZCBjaGFyKSBjKSA/ICdhJyA6ICdBJykpOworICAgICAgICAgICAgICAgICBjcCsrOworICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICAgICBpZiAoKmNwID09ICcuJykKKyAgICAgICAgIHsKKyAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAqIEludGVybmV0IGZvcm1hdDogYS5iLmMuZCBhLmIuYyAgICh3aXRoIGMgdHJlYXRlZCBhcyAxNi1iaXRzKQorICAgICAgICAgICAgICAqIGEuYiAgICAgKHdpdGggYiB0cmVhdGVkIGFzIDI0IGJpdHMpCisgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgaWYgKHBwID49IHBhcnRzICsgMyB8fCB2YWwgPiAweGZmKQorICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAqcHArKyA9IHZhbCwgY3ArKzsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgfQorCisgICAgIC8qCisgICAgICAqIENoZWNrIGZvciB0cmFpbGluZyBqdW5rLgorICAgICAgKi8KKyAgICAgd2hpbGUgKCpjcCkKKyAgICAgICAgIGlmICghaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKmNwKyspKQorICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgIC8qCisgICAgICAqIENvbmNvY3QgdGhlIGFkZHJlc3MgYWNjb3JkaW5nIHRvIHRoZSBudW1iZXIgb2YgcGFydHMgc3BlY2lmaWVkLgorICAgICAgKi8KKyAgICAgbiA9IHBwIC0gcGFydHMgKyAxOworICAgICBzd2l0Y2ggKG4pCisgICAgIHsKKworICAgICAgICAgY2FzZSAxOiAgICAgICAgIC8qIGEgLS0gMzIgYml0cyAqLworICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIDI6ICAgICAgICAgLyogYS5iIC0tIDguMjQgYml0cyAqLworICAgICAgICAgICAgIGlmICh2YWwgPiAweGZmZmZmZikKKyAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgdmFsIHw9IHBhcnRzWzBdIDw8IDI0OworICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIDM6ICAgICAgICAgLyogYS5iLmMgLS0gOC44LjE2IGJpdHMgKi8KKyAgICAgICAgICAgICBpZiAodmFsID4gMHhmZmZmKQorICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICB2YWwgfD0gKHBhcnRzWzBdIDw8IDI0KSB8IChwYXJ0c1sxXSA8PCAxNik7CisgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGNhc2UgNDogICAgICAgICAvKiBhLmIuYy5kIC0tIDguOC44LjggYml0cyAqLworICAgICAgICAgICAgIGlmICh2YWwgPiAweGZmKQorICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICB2YWwgfD0gKHBhcnRzWzBdIDw8IDI0KSB8IChwYXJ0c1sxXSA8PCAxNikgfCAocGFydHNbMl0gPDwgOCk7CisgICAgICAgICAgICAgYnJlYWs7CisgICAgIH0KKworICAgICAqYWRkciA9IGh0b25sKHZhbCk7CisgICAgIHJldHVybiAxOworCit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBGaW5kIGtleSBzZWN0aW9uIGZvciBHZXQga2V5IHBhcmFtZXRlci4KKworICAgIEFyZ3VtZW50czoKKyAgICAgICAgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byBzdGFydCBmaW5kIHRoZSBrZXkgc2VjdGlvbgorICAgICAgICBzZWN0aW9uICAgICAgICAgICAgICAgICAgICAgdGhlIGtleSBvZiB0aGUgc2VjaW9uIHRvIGJlIGZpbmQKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgIEZhaWwKKyAgICAgICAgT3RoZXJzICAgICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitQVUNIQVIgIFJUTVBGaW5kU2VjdGlvbigKKyAgICBJTiAgUENIQVIgICBidWZmZXIpCit7CisgICAgQ0hBUiB0ZW1wX2J1ZlszMl07CisgICAgUFVDSEFSICBwdHI7CisKKyAgICBzdHJjcHkodGVtcF9idWYsICJEZWZhdWx0Iik7CisKKyAgICBpZigocHRyID0gcnRzdHJzdHIoYnVmZmVyLCB0ZW1wX2J1ZikpICE9IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gKHB0citzdHJsZW4oIlxuIikpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgICAgIEdldCBrZXkgcGFyYW1ldGVyLgorCisgICAgQXJndW1lbnRzOgorICAgICAgICBrZXkgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBrZXkgc3RyaW5nCisgICAgICAgIGRlc3QgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGRlc3RpbmF0aW9uCisgICAgICAgIGRlc3RzaXplICAgICAgICAgICAgICAgICAgICBUaGUgZGF0YXNpemUgb2YgdGhlIGRlc3RpbmF0aW9uCisgICAgICAgIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gc3RhcnQgZmluZCB0aGUga2V5CisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIFRSVUUgICAgICAgICAgICAgICAgICAgICAgICBTdWNjZXNzCisgICAgICAgIEZBTFNFICAgICAgICAgICAgICAgICAgICAgICBGYWlsCisKKyAgICBOb3RlOgorICAgICAgICBUaGlzIHJvdXRpbmUgZ2V0IHRoZSB2YWx1ZSB3aXRoIHRoZSBtYXRjaGVkIGtleSAoY2FzZSBjYXNlLXNlbnNpdGl2ZSkKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgUlRNUEdldEtleVBhcmFtZXRlcigKKyAgICBJTiAgUENIQVIgICBrZXksCisgICAgT1VUIFBDSEFSICAgZGVzdCwKKyAgICBJTiAgSU5UICAgICBkZXN0c2l6ZSwKKyAgICBJTiAgUENIQVIgICBidWZmZXIpCit7CisgICAgVUNIQVIgKnRlbXBfYnVmMSA9IE5VTEw7CisgICAgVUNIQVIgKnRlbXBfYnVmMiA9IE5VTEw7CisgICAgQ0hBUiAqc3RhcnRfcHRyOworICAgIENIQVIgKmVuZF9wdHI7CisgICAgQ0hBUiAqcHRyOworICAgIENIQVIgKm9mZnNldCA9IDA7CisgICAgSU5UICBsZW47CisKKwkvL3RlbXBfYnVmMSA9IGttYWxsb2MoTUFYX1BBUkFNX0JVRkZFUl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7CisJb3NfYWxsb2NfbWVtKE5VTEwsICZ0ZW1wX2J1ZjEsIE1BWF9QQVJBTV9CVUZGRVJfU0laRSk7CisKKwlpZih0ZW1wX2J1ZjEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisKKwkvL3RlbXBfYnVmMiA9IGttYWxsb2MoTUFYX1BBUkFNX0JVRkZFUl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7CisJb3NfYWxsb2NfbWVtKE5VTEwsICZ0ZW1wX2J1ZjIsIE1BWF9QQVJBTV9CVUZGRVJfU0laRSk7CisJaWYodGVtcF9idWYyID09IE5VTEwpCisJeworCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKwl9CisKKyAgICAvL2ZpbmQgc2VjdGlvbgorICAgIGlmKChvZmZzZXQgPSBSVE1QRmluZFNlY3Rpb24oYnVmZmVyKSkgPT0gTlVMTCkKKyAgICB7CisgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKworICAgIHN0cmNweSh0ZW1wX2J1ZjEsICJcbiIpOworICAgIHN0cmNhdCh0ZW1wX2J1ZjEsIGtleSk7CisgICAgc3RyY2F0KHRlbXBfYnVmMSwgIj0iKTsKKworICAgIC8vc2VhcmNoIGtleQorICAgIGlmKChzdGFydF9wdHI9cnRzdHJzdHIob2Zmc2V0LCB0ZW1wX2J1ZjEpKT09TlVMTCkKKyAgICB7CisJCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKworICAgIHN0YXJ0X3B0cis9c3RybGVuKCJcbiIpOworICAgIGlmKChlbmRfcHRyPXJ0c3Ryc3RyKHN0YXJ0X3B0ciwgIlxuIikpPT1OVUxMKQorICAgICAgIGVuZF9wdHI9c3RhcnRfcHRyK3N0cmxlbihzdGFydF9wdHIpOworCisgICAgaWYgKGVuZF9wdHI8c3RhcnRfcHRyKQorICAgIHsKKwkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorCisgICAgTmRpc01vdmVNZW1vcnkodGVtcF9idWYyLCBzdGFydF9wdHIsIGVuZF9wdHItc3RhcnRfcHRyKTsKKyAgICB0ZW1wX2J1ZjJbZW5kX3B0ci1zdGFydF9wdHJdPSdcMCc7CisgICAgbGVuID0gc3RybGVuKHRlbXBfYnVmMik7CisgICAgc3RyY3B5KHRlbXBfYnVmMSwgdGVtcF9idWYyKTsKKyAgICBpZigoc3RhcnRfcHRyPXJ0c3Ryc3RyKHRlbXBfYnVmMSwgIj0iKSkgPT0gTlVMTCkKKyAgICB7CisJCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKworICAgIHN0cmNweSh0ZW1wX2J1ZjIsIHN0YXJ0X3B0cisxKTsKKyAgICBwdHIgPSB0ZW1wX2J1ZjI7CisgICAgLy90cmltIHNwYWNlIG9yIHRhYgorICAgIHdoaWxlKCpwdHIgIT0gMHgwMCkKKyAgICB7CisgICAgICAgIGlmKCAoKnB0ciA9PSAnICcpIHx8ICgqcHRyID09ICdcdCcpICkKKyAgICAgICAgICAgIHB0cisrOworICAgICAgICBlbHNlCisgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGxlbiA9IHN0cmxlbihwdHIpOworICAgIG1lbXNldChkZXN0LCAweDAwLCBkZXN0c2l6ZSk7CisgICAgc3RybmNweShkZXN0LCBwdHIsIGxlbiA+PSBkZXN0c2l6ZSA/ICBkZXN0c2l6ZTogbGVuKTsKKworCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgICAgIEdldCBrZXkgcGFyYW1ldGVyLgorCisgICAgQXJndW1lbnRzOgorICAgICAgICBrZXkgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBrZXkgc3RyaW5nCisgICAgICAgIGRlc3QgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGRlc3RpbmF0aW9uCisgICAgICAgIGRlc3RzaXplICAgICAgICAgICAgICAgICAgICBUaGUgZGF0YXNpemUgb2YgdGhlIGRlc3RpbmF0aW9uCisgICAgICAgIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gc3RhcnQgZmluZCB0aGUga2V5CisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIFRSVUUgICAgICAgICAgICAgICAgICAgICAgICBTdWNjZXNzCisgICAgICAgIEZBTFNFICAgICAgICAgICAgICAgICAgICAgICBGYWlsCisKKyAgICBOb3RlOgorICAgICAgICBUaGlzIHJvdXRpbmUgZ2V0IHRoZSB2YWx1ZSB3aXRoIHRoZSBtYXRjaGVkIGtleSAoY2FzZSBjYXNlLXNlbnNpdGl2ZSkuCisgICAgICAgIEl0IGlzIGNhbGxlZCBmb3IgcGFyc2luZyBTU0lEIGFuZCBhbnkga2V5IHN0cmluZy4KKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgUlRNUEdldENyaXRpY2FsUGFyYW1ldGVyKAorICAgIElOICBQQ0hBUiAgIGtleSwKKyAgICBPVVQgUENIQVIgICBkZXN0LAorICAgIElOICBJTlQgICAgIGRlc3RzaXplLAorICAgIElOICBQQ0hBUiAgIGJ1ZmZlcikKK3sKKyAgICBVQ0hBUiAqdGVtcF9idWYxID0gTlVMTDsKKyAgICBVQ0hBUiAqdGVtcF9idWYyID0gTlVMTDsKKyAgICBDSEFSICpzdGFydF9wdHI7CisgICAgQ0hBUiAqZW5kX3B0cjsKKyAgICBDSEFSICpwdHI7CisgICAgQ0hBUiAqb2Zmc2V0ID0gMDsKKyAgICBJTlQgIGxlbjsKKworCS8vdGVtcF9idWYxID0ga21hbGxvYyhNQVhfUEFSQU1fQlVGRkVSX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKKwlvc19hbGxvY19tZW0oTlVMTCwgJnRlbXBfYnVmMSwgTUFYX1BBUkFNX0JVRkZFUl9TSVpFKTsKKworCWlmKHRlbXBfYnVmMSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gKEZBTFNFKTsKKworCS8vdGVtcF9idWYyID0ga21hbGxvYyhNQVhfUEFSQU1fQlVGRkVSX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKKwlvc19hbGxvY19tZW0oTlVMTCwgJnRlbXBfYnVmMiwgTUFYX1BBUkFNX0JVRkZFUl9TSVpFKTsKKwlpZih0ZW1wX2J1ZjIgPT0gTlVMTCkKKwl7CisJCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworCX0KKworICAgIC8vZmluZCBzZWN0aW9uCisgICAgaWYoKG9mZnNldCA9IFJUTVBGaW5kU2VjdGlvbihidWZmZXIpKSA9PSBOVUxMKQorICAgIHsKKyAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorCisgICAgc3RyY3B5KHRlbXBfYnVmMSwgIlxuIik7CisgICAgc3RyY2F0KHRlbXBfYnVmMSwga2V5KTsKKyAgICBzdHJjYXQodGVtcF9idWYxLCAiPSIpOworCisgICAgLy9zZWFyY2gga2V5CisgICAgaWYoKHN0YXJ0X3B0cj1ydHN0cnN0cihvZmZzZXQsIHRlbXBfYnVmMSkpPT1OVUxMKQorICAgIHsKKwkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorCisgICAgc3RhcnRfcHRyKz1zdHJsZW4oIlxuIik7CisgICAgaWYoKGVuZF9wdHI9cnRzdHJzdHIoc3RhcnRfcHRyLCAiXG4iKSk9PU5VTEwpCisgICAgICAgZW5kX3B0cj1zdGFydF9wdHIrc3RybGVuKHN0YXJ0X3B0cik7CisKKyAgICBpZiAoZW5kX3B0cjxzdGFydF9wdHIpCisgICAgeworCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICB9CisKKyAgICBOZGlzTW92ZU1lbW9yeSh0ZW1wX2J1ZjIsIHN0YXJ0X3B0ciwgZW5kX3B0ci1zdGFydF9wdHIpOworICAgIHRlbXBfYnVmMltlbmRfcHRyLXN0YXJ0X3B0cl09J1wwJzsKKyAgICBsZW4gPSBzdHJsZW4odGVtcF9idWYyKTsKKyAgICBzdHJjcHkodGVtcF9idWYxLCB0ZW1wX2J1ZjIpOworICAgIGlmKChzdGFydF9wdHI9cnRzdHJzdHIodGVtcF9idWYxLCAiPSIpKSA9PSBOVUxMKQorICAgIHsKKwkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorCisgICAgc3RyY3B5KHRlbXBfYnVmMiwgc3RhcnRfcHRyKzEpOworICAgIHB0ciA9IHRlbXBfYnVmMjsKKworICAgIC8vdHJpbSB0YWIKKyAgICAvKiBXZSBjYW5ub3QgdHJpbSBzcGFjZSgnICcpIGZvciBTU0lEIGFuZCBrZXkgc3RyaW5nLiAqLworICAgIHdoaWxlKCpwdHIgIT0gMHgwMCkKKyAgICB7CisgICAgICAgIC8vaWYoICgqcHRyID09ICcgJykgfHwgKCpwdHIgPT0gJ1x0JykgKQorICAgICAgICBpZiggKCpwdHIgPT0gJ1x0JykgKQorICAgICAgICAgICAgcHRyKys7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgbGVuID0gc3RybGVuKHB0cik7CisgICAgbWVtc2V0KGRlc3QsIDB4MDAsIGRlc3RzaXplKTsKKyAgICBzdHJuY3B5KGRlc3QsIHB0ciwgbGVuID49IGRlc3RzaXplID8gIGRlc3RzaXplOiBsZW4pOworCisJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICBvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICAgICAgR2V0IG11bHRpcGxlIGtleSBwYXJhbWV0ZXIuCisKKyAgICBBcmd1bWVudHM6CisgICAgICAgIGtleSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGtleSBzdHJpbmcKKyAgICAgICAgZGVzdCAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gZGVzdGluYXRpb24KKyAgICAgICAgZGVzdHNpemUgICAgICAgICAgICAgICAgICAgIFRoZSBkYXRhc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24KKyAgICAgICAgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byBzdGFydCBmaW5kIHRoZSBrZXkKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgVFJVRSAgICAgICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MKKyAgICAgICAgRkFMU0UgICAgICAgICAgICAgICAgICAgICAgIEZhaWwKKworICAgIE5vdGU6CisgICAgICAgIFRoaXMgcm91dGluZSBnZXQgdGhlIHZhbHVlIHdpdGggdGhlIG1hdGNoZWQga2V5IChjYXNlIGNhc2Utc2Vuc2l0aXZlKQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBSVE1QR2V0S2V5UGFyYW1ldGVyV2l0aE9mZnNldCgKKyAgICBJTiAgUENIQVIgICBrZXksCisgICAgT1VUIFBDSEFSICAgZGVzdCwKKyAgICBPVVQJVVNIT1JUCSplbmRfb2Zmc2V0LAorICAgIElOICBJTlQgICAgIGRlc3RzaXplLAorICAgIElOICBQQ0hBUiAgIGJ1ZmZlciwKKyAgICBJTglCT09MRUFOCWJUcmltU3BhY2UpCit7CisgICAgVUNIQVIgKnRlbXBfYnVmMSA9IE5VTEw7CisgICAgVUNIQVIgKnRlbXBfYnVmMiA9IE5VTEw7CisgICAgQ0hBUiAqc3RhcnRfcHRyOworICAgIENIQVIgKmVuZF9wdHI7CisgICAgQ0hBUiAqcHRyOworICAgIENIQVIgKm9mZnNldCA9IDA7CisgICAgSU5UICBsZW47CisKKwlpZiAoKmVuZF9vZmZzZXQgPj0gTUFYX0lOSV9CVUZGRVJfU0laRSkKKwkJcmV0dXJuIChGQUxTRSk7CisKKwlvc19hbGxvY19tZW0oTlVMTCwgJnRlbXBfYnVmMSwgTUFYX1BBUkFNX0JVRkZFUl9TSVpFKTsKKworCWlmKHRlbXBfYnVmMSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gKEZBTFNFKTsKKworCW9zX2FsbG9jX21lbShOVUxMLCAmdGVtcF9idWYyLCBNQVhfUEFSQU1fQlVGRkVSX1NJWkUpOworCWlmKHRlbXBfYnVmMiA9PSBOVUxMKQorCXsKKwkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisJfQorCisgICAgLy9maW5kIHNlY3Rpb24KKwlpZigqZW5kX29mZnNldCA9PSAwKQorICAgIHsKKwkJaWYgKChvZmZzZXQgPSBSVE1QRmluZFNlY3Rpb24oYnVmZmVyKSkgPT0gTlVMTCkKKwkJeworCQkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKwkgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgCSAgICByZXR1cm4gKEZBTFNFKTsKKwkJfQorICAgIH0KKwllbHNlCisJCW9mZnNldCA9IGJ1ZmZlciArICgqZW5kX29mZnNldCk7CisKKyAgICBzdHJjcHkodGVtcF9idWYxLCAiXG4iKTsKKyAgICBzdHJjYXQodGVtcF9idWYxLCBrZXkpOworICAgIHN0cmNhdCh0ZW1wX2J1ZjEsICI9Iik7CisKKyAgICAvL3NlYXJjaCBrZXkKKyAgICBpZigoc3RhcnRfcHRyPXJ0c3Ryc3RyKG9mZnNldCwgdGVtcF9idWYxKSk9PU5VTEwpCisgICAgeworCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICB9CisKKyAgICBzdGFydF9wdHIrPXN0cmxlbigiXG4iKTsKKyAgICBpZigoZW5kX3B0cj1ydHN0cnN0cihzdGFydF9wdHIsICJcbiIpKT09TlVMTCkKKyAgICAgICBlbmRfcHRyPXN0YXJ0X3B0citzdHJsZW4oc3RhcnRfcHRyKTsKKworICAgIGlmIChlbmRfcHRyPHN0YXJ0X3B0cikKKyAgICB7CisJCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKworCSplbmRfb2Zmc2V0ID0gZW5kX3B0ciAtIGJ1ZmZlcjsKKworICAgIE5kaXNNb3ZlTWVtb3J5KHRlbXBfYnVmMiwgc3RhcnRfcHRyLCBlbmRfcHRyLXN0YXJ0X3B0cik7CisgICAgdGVtcF9idWYyW2VuZF9wdHItc3RhcnRfcHRyXT0nXDAnOworICAgIGxlbiA9IHN0cmxlbih0ZW1wX2J1ZjIpOworICAgIHN0cmNweSh0ZW1wX2J1ZjEsIHRlbXBfYnVmMik7CisgICAgaWYoKHN0YXJ0X3B0cj1ydHN0cnN0cih0ZW1wX2J1ZjEsICI9IikpID09IE5VTEwpCisgICAgeworCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICB9CisKKyAgICBzdHJjcHkodGVtcF9idWYyLCBzdGFydF9wdHIrMSk7CisgICAgcHRyID0gdGVtcF9idWYyOworICAgIC8vdHJpbSBzcGFjZSBvciB0YWIKKyAgICB3aGlsZSgqcHRyICE9IDB4MDApCisgICAgeworICAgICAgICBpZigoYlRyaW1TcGFjZSAmJiAoKnB0ciA9PSAnICcpKSB8fCAoKnB0ciA9PSAnXHQnKSApCisgICAgICAgICAgICBwdHIrKzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBsZW4gPSBzdHJsZW4ocHRyKTsKKyAgICBtZW1zZXQoZGVzdCwgMHgwMCwgZGVzdHNpemUpOworICAgIHN0cm5jcHkoZGVzdCwgcHRyLCBsZW4gPj0gZGVzdHNpemUgPyAgZGVzdHNpemU6IGxlbik7CisKKwlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgIG9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworc3RhdGljIGludCBydG1wX3BhcnNlX2tleV9idWZmZXJfZnJvbV9maWxlKElOICBQUlRNUF9BREFQVEVSIHBBZCxJTiAgY2hhciAqYnVmZmVyLElOICBVTE9ORyBLZXlUeXBlLElOICBJTlQgQlNTSWR4LElOICBJTlQgS2V5SWR4KQoreworCVBVQ0hBUgkJa2V5YnVmZjsKKwlJTlQJCQlpID0gQlNTSWR4LCBpZHggPSBLZXlJZHg7CisJVUxPTkcJCUtleUxlbjsKKwlVQ0hBUgkJQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCisJa2V5YnVmZiA9IGJ1ZmZlcjsKKwlLZXlMZW4gPSBzdHJsZW4oa2V5YnVmZik7CisKKwlpZiAoS2V5VHlwZSA9PSAxKQorCXsvL0FzY2lpCisJCWlmKCAoS2V5TGVuID09IDUpIHx8IChLZXlMZW4gPT0gMTMpKQorCQl7CisJCQlwQWQtPlNoYXJlZEtleVtpXVtpZHhdLktleUxlbiA9IEtleUxlbjsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W2ldW2lkeF0uS2V5LCBrZXlidWZmLCBLZXlMZW4pOworCQkJaWYgKEtleUxlbiA9PSA1KQorCQkJCUNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJCWVsc2UKKwkJCQlDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCQkJcEFkLT5TaGFyZWRLZXlbaV1baWR4XS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkkvRihyYSVkKSBLZXklZFN0cj0lcyBhbmQgdHlwZT0lc1xuIiwgaSwgaWR4KzEsIGtleWJ1ZmYsIChLZXlUeXBlID09IDApID8gIkhleCI6IkFzY2lpIikpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJZWxzZQorCQl7Ly9JbnZhbGlkIGtleSBsZW5ndGgKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIktleSVkU3RyIGlzIEludmFsaWQga2V5IGxlbmd0aCEgS2V5TGVuID0gJWxkIVxuIiwgaWR4KzEsIEtleUxlbikpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJZWxzZQorCXsvL0hleCB0eXBlCisJCWlmKCAoS2V5TGVuID09IDEwKSB8fCAoS2V5TGVuID09IDI2KSkKKwkJeworCQkJcEFkLT5TaGFyZWRLZXlbaV1baWR4XS5LZXlMZW4gPSBLZXlMZW4gLyAyOworCQkJQXRvSChrZXlidWZmLCBwQWQtPlNoYXJlZEtleVtpXVtpZHhdLktleSwgS2V5TGVuIC8gMik7CisJCQlpZiAoS2V5TGVuID09IDEwKQorCQkJCUNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJCWVsc2UKKwkJCQlDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCQkJcEFkLT5TaGFyZWRLZXlbaV1baWR4XS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkkvRihyYSVkKSBLZXklZFN0cj0lcyBhbmQgdHlwZT0lc1xuIiwgaSwgaWR4KzEsIGtleWJ1ZmYsIChLZXlUeXBlID09IDApID8gIkhleCI6IkFzY2lpIikpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJZWxzZQorCQl7Ly9JbnZhbGlkIGtleSBsZW5ndGgKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkkvRihyYSVkKSBLZXklZFN0ciBpcyBJbnZhbGlkIGtleSBsZW5ndGghIEtleUxlbiA9ICVsZCFcbiIsIGksIGlkeCsxLCBLZXlMZW4pKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorfQorc3RhdGljIHZvaWQgcnRtcF9yZWFkX2tleV9wYXJtc19mcm9tX2ZpbGUoSU4gIFBSVE1QX0FEQVBURVIgcEFkLCBjaGFyICp0bXBidWYsIGNoYXIgKmJ1ZmZlcikKK3sKKwljaGFyCQl0b2tfc3RyWzE2XTsKKwlQVUNIQVIJCW1hY3B0cjsKKwlJTlQJCQlpID0gMCwgaWR4OworCVVMT05HCQlLZXlUeXBlW01BWF9NQlNTSURfTlVNXTsKKwlVTE9ORwkJS2V5SWR4OworCisJTmRpc1plcm9NZW1vcnkoS2V5VHlwZSwgTUFYX01CU1NJRF9OVU0pOworCisJLy9EZWZhdWx0S2V5SUQKKwlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJEZWZhdWx0S2V5SUQiLCB0bXBidWYsIDI1LCBidWZmZXIpKQorCXsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQlLZXlJZHggPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCQkJaWYoKEtleUlkeCA+PSAxICkgJiYgKEtleUlkeCA8PSA0KSkKKwkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAoVUNIQVIpIChLZXlJZHggLSAxKTsKKwkJCWVsc2UKKwkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAwOworCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEZWZhdWx0S2V5SUQoMH4zKT0lZFxuIiwgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkKSk7CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl9CisKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgNDsgaWR4KyspCisJeworCQlzcHJpbnRmKHRva19zdHIsICJLZXklZFR5cGUiLCBpZHggKyAxKTsKKwkJLy9LZXkxVHlwZQorCQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcih0b2tfc3RyLCB0bXBidWYsIDEyOCwgYnVmZmVyKSkKKwkJeworCQkgICAgZm9yIChpID0gMCwgbWFjcHRyID0gcnN0cnRvayh0bXBidWYsIjsiKTsgbWFjcHRyOyBtYWNwdHIgPSByc3RydG9rKE5VTEwsIjsiKSwgaSsrKQorCQkgICAgeworCQkJICAgIEtleVR5cGVbaV0gPSBzaW1wbGVfc3RydG9sKG1hY3B0ciwgMCwgMTApOworCQkgICAgfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJeworCQkJCXNwcmludGYodG9rX3N0ciwgIktleSVkU3RyIiwgaWR4ICsgMSk7CisJCQkJaWYgKFJUTVBHZXRDcml0aWNhbFBhcmFtZXRlcih0b2tfc3RyLCB0bXBidWYsIDEyOCwgYnVmZmVyKSkKKwkJCQl7CisJCQkJCXJ0bXBfcGFyc2Vfa2V5X2J1ZmZlcl9mcm9tX2ZpbGUocEFkLCB0bXBidWYsIEtleVR5cGVbQlNTMF0sIEJTUzAsIGlkeCk7CisJCQkJfQorCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQl9CisJfQorfQorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK3N0YXRpYyB2b2lkIHJ0bXBfcmVhZF9zdGFfd21tX3Bhcm1zX2Zyb21fZmlsZShJTiAgUFJUTVBfQURBUFRFUiBwQWQsIGNoYXIgKnRtcGJ1ZiwgY2hhciAqYnVmZmVyKQoreworCVBVQ0hBUgkJCQkJbWFjcHRyOworCUlOVAkJCQkJCWk9MDsKKwlCT09MRUFOCQkJCQliV21tRW5hYmxlID0gRkFMU0U7CisKKwkvL1dtbUNhcGFibGUKKwlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJXbW1DYXBhYmxlIiwgdG1wYnVmLCAzMiwgYnVmZmVyKSkKKwl7CisJCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkgLy9FbmFibGUKKwkJeworCQkJcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUgPSBUUlVFOworCQkJYldtbUVuYWJsZSA9IFRSVUU7CisJCX0KKwkJZWxzZSAvL0Rpc2FibGUKKwkJeworCQkJcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUgPSBGQUxTRTsKKwkJfQorCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldtbUNhcGFibGU9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKSk7CisJfQorCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJLy9ETFNDYXBhYmxlCisJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiRExTQ2FwYWJsZSIsIHRtcGJ1ZiwgMzIsIGJ1ZmZlcikpCisJeworCQlpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApICE9IDApICAvL0VuYWJsZQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSA9IFRSVUU7CisJCX0KKwkJZWxzZSAvL0Rpc2FibGUKKwkJeworCQkJcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUgPSBGQUxTRTsKKwkJfQorCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImJETFNDYXBhYmxlPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkpOworCX0KKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCS8vQWNrUG9saWN5IGZvciBBQ19CSywgQUNfQkUsIEFDX1ZJLCBBQ19WTworCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkFja1BvbGljeSIsIHRtcGJ1ZiwgMzIsIGJ1ZmZlcikpCisJeworCQlmb3IgKGkgPSAwLCBtYWNwdHIgPSByc3RydG9rKHRtcGJ1ZiwiOyIpOyBtYWNwdHI7IG1hY3B0ciA9IHJzdHJ0b2soTlVMTCwiOyIpLCBpKyspCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkFja1BvbGljeVtpXSA9IChVQ0hBUilzaW1wbGVfc3RydG9sKG1hY3B0ciwgMCwgMTApOworCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBY2tQb2xpY3lbJWRdPSVkXG4iLCBpLCBwQWQtPkNvbW1vbkNmZy5BY2tQb2xpY3lbaV0pKTsKKwkJfQorCX0KKworCWlmIChiV21tRW5hYmxlKQorCXsKKwkJLy9BUFNEQ2FwYWJsZQorCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJBUFNEQ2FwYWJsZSIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCXsKKwkJCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkgIC8vRW5hYmxlCisJCQkJcEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlID0gVFJVRTsKKwkJCWVsc2UKKwkJCQlwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgPSBGQUxTRTsKKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVBTRENhcGFibGU9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSkpOworCQl9CisKKwkJLy9BUFNEQUMgZm9yIEFDX0JFLCBBQ19CSywgQUNfVkksIEFDX1ZPCisJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkFQU0RBQyIsIHRtcGJ1ZiwgMzIsIGJ1ZmZlcikpCisJCXsKKwkJCUJPT0xFQU4gYXBzZF9hY1s0XTsKKworCQkJZm9yIChpID0gMCwgbWFjcHRyID0gcnN0cnRvayh0bXBidWYsIjsiKTsgbWFjcHRyOyBtYWNwdHIgPSByc3RydG9rKE5VTEwsIjsiKSwgaSsrKQorCQkJeworCQkJCWFwc2RfYWNbaV0gPSAoQk9PTEVBTilzaW1wbGVfc3RydG9sKG1hY3B0ciwgMCwgMTApOworCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVBTREFDJWQgICVkXG4iLCBpLCAgYXBzZF9hY1tpXSkpOworCQkJfQorCisJCQlwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JFID0gYXBzZF9hY1swXTsKKwkJCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQksgPSBhcHNkX2FjWzFdOworCQkJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WSSA9IGFwc2RfYWNbMl07CisJCQlwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZPID0gYXBzZF9hY1szXTsKKwkJfQorCX0KKworfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKK05ESVNfU1RBVFVTCVJUTVBSZWFkUGFyYW1ldGVyc0hvb2soCisJSU4JUFJUTVBfQURBUFRFUiBwQWQpCit7CisJUFVDSEFSCQkJCQlzcmMgPSBOVUxMOworCXN0cnVjdCBmaWxlCQkJCSpzcmNmOworCUlOVCAJCQkJCXJldHZhbCwgb3JnZnN1aWQsIG9yZ2ZzZ2lkOworICAgCW1tX3NlZ21lbnRfdAkJCW9yZ2ZzOworCUNIQVIJCQkJCSpidWZmZXI7CisJQ0hBUgkJCQkJKnRtcGJ1ZjsKKwlVTE9ORwkJCQkJUnRzVGhyZXNoOworCVVMT05HCQkJCQlGcmFnVGhyZXNoOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCVVDSEFSCSAgICAgICAgICAgICAgICBrZXlNYXRlcmlhbFs0MF07CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworCVBVQ0hBUgkJCQkJbWFjcHRyOworCUlOVAkJCQkJCWkgPSAwOworCisJYnVmZmVyID0ga21hbGxvYyhNQVhfSU5JX0JVRkZFUl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7CisJaWYoYnVmZmVyID09IE5VTEwpCisgICAgICAgIHJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCisJdG1wYnVmID0ga21hbGxvYyhNQVhfUEFSQU1fQlVGRkVSX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKKwlpZih0bXBidWYgPT0gTlVMTCkKKwl7CisJCWtmcmVlKGJ1ZmZlcik7CisgICAgICAgIHJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXNyYyA9IFNUQV9QUk9GSUxFX1BBVEg7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisJc3JjID0gcEFkLT5NQ19GaWxlTmFtZTsKKyNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KKworCS8vIFNhdmUgdWlkIGFuZCBnaWQgdXNlZCBmb3IgZmlsZXN5c3RlbSBhY2Nlc3MuCisJLy8gU2V0IHVzZXIgYW5kIGdyb3VwIHRvIDAgKHJvb3QpCisJb3JnZnN1aWQgPSBjdXJyZW50X2ZzdWlkKCk7CisJb3JnZnNnaWQgPSBjdXJyZW50X2ZzZ2lkKCk7CisJLyogSG0sIGNhbid0IHJlYWxseSBkbyB0aGlzIG5pY2VseSBhbnltb3JlLCBzbyByZWx5IG9uIHRoZXNlIGZpbGVzCisJICogYmVpbmcgc2V0IHRvIHRoZSBwcm9wZXIgcGVybWlzc2lvbiB0byByZWFkIHRoZW0uLi4gKi8KKwkvKiBjdXJyZW50LT5jcmVkLT5mc3VpZCA9IGN1cnJlbnQtPmNyZWQtPmZzZ2lkID0gMDsgKi8KKyAgICBvcmdmcyA9IGdldF9mcygpOworICAgIHNldF9mcyhLRVJORUxfRFMpOworCisJaWYgKHNyYyAmJiAqc3JjKQorCXsKKwkJc3JjZiA9IGZpbHBfb3BlbihzcmMsIE9fUkRPTkxZLCAwKTsKKwkJaWYgKElTX0VSUihzcmNmKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiLS0+IEVycm9yICVsZCBvcGVuaW5nICVzXG4iLCAtUFRSX0VSUihzcmNmKSxzcmMpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIFRoZSBvYmplY3QgbXVzdCBoYXZlIGEgcmVhZCBtZXRob2QKKwkJCWlmIChzcmNmLT5mX29wICYmIHNyY2YtPmZfb3AtPnJlYWQpCisJCQl7CisJCQkJbWVtc2V0KGJ1ZmZlciwgMHgwMCwgTUFYX0lOSV9CVUZGRVJfU0laRSk7CisJCQkJcmV0dmFsPXNyY2YtPmZfb3AtPnJlYWQoc3JjZiwgYnVmZmVyLCBNQVhfSU5JX0JVRkZFUl9TSVpFLCAmc3JjZi0+Zl9wb3MpOworCQkJCWlmIChyZXR2YWwgPCAwKQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFJlYWQgJXMgZXJyb3IgJWRcbiIsIHNyYywgLXJldHZhbCkpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQkvLyBzZXQgZmlsZSBwYXJhbWV0ZXIgdG8gcG9ydGNmZworCQkJCQkvL0NvdW50cnlSZWdpb24KKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQ291bnRyeVJlZ2lvbiIsIHRtcGJ1ZiwgMjUsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gPSAoVUNIQVIpIHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDb3VudHJ5UmVnaW9uPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uKSk7CisJCQkJCX0KKwkJCQkJLy9Db3VudHJ5UmVnaW9uQUJhbmQKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQ291bnRyeVJlZ2lvbkFCYW5kIiwgdG1wYnVmLCAyNSwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkJcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kPSAoVUNIQVIpIHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDb3VudHJ5UmVnaW9uQUJhbmQ9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCkpOworCQkJCQl9CisJCQkJCS8vQ291bnRyeUNvZGUKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQ291bnRyeUNvZGUiLCB0bXBidWYsIDI1LCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZSwgdG1wYnVmICwgMik7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCQkJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5TdGFPcmlDb3VudHJ5Q29kZSwgdG1wYnVmICwgMik7CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJCQkJaWYgKHN0cmxlbihwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZSkgIT0gMCkKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iQ291bnRyeUZsYWcgPSBUUlVFOworCQkJCQkJfQorCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ291bnRyeUNvZGU9JXNcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlKSk7CisJCQkJCX0KKwkJCQkJLy9DaGFubmVsR2VvZ3JhcGh5CisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkNoYW5uZWxHZW9ncmFwaHkiLCB0bXBidWYsIDI1LCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlVQ0hBUiBHZW9ncmFwaHkgPSAoVUNIQVIpIHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7CisJCQkJCQlpZiAoR2VvZ3JhcGh5IDw9IEJPVEgpCisJCQkJCQl7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5ID0gR2VvZ3JhcGh5OworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlWzJdID0KKwkJCQkJCQkJKHBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSA9PSBCT1RIKSA/ICcgJyA6ICgocEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5ID09IElET1IpID8gJ0knIDogJ08nKTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQkJCXBBZC0+U3RhQ2ZnLlN0YU9yaUdlb2dyYXBoeSA9IHBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeTsKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hhbm5lbEdlb2dyYXBoeT0lZFxuIiwgcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5KSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPSBCT1RIOworCQkJCQkJcEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGVbMl0gPSAnICc7CisJCQkJCX0KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJCXsKKwkJCQkJCS8vU1NJRAorCQkJCQkJaWYgKFJUTVBHZXRDcml0aWNhbFBhcmFtZXRlcigiU1NJRCIsIHRtcGJ1ZiwgMjU2LCBidWZmZXIpKQorCQkJCQkJeworCQkJCQkJCWlmIChzdHJsZW4odG1wYnVmKSA8PSAzMikKKwkJCQkJCQl7CisJCQkgCQkJCQlwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuID0gKFVDSEFSKSBzdHJsZW4odG1wYnVmKTsKKwkJCQkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcuU3NpZCwgTkRJU184MDJfMTFfTEVOR1RIX1NTSUQpOworCQkJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPkNvbW1vbkNmZy5Tc2lkLCB0bXBidWYsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pOworCQkJCQkJCQlwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4gPSBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuOworCQkJCQkJCQlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIE5ESVNfODAyXzExX0xFTkdUSF9TU0lEKTsKKwkJCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCB0bXBidWYsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7CisJCQkJCQkJCXBBZC0+TWxtZUF1eC5Tc2lkTGVuID0gcEFkLT5Db21tb25DZmcuU3NpZExlbjsKKwkJCQkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIE5ESVNfODAyXzExX0xFTkdUSF9TU0lEKTsKKwkJCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIHRtcGJ1ZiwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOworCQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6KFNTSUQ9JXMpXG4iLCBfX2Z1bmNfXywgdG1wYnVmKSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQkJeworCQkJCQkJLy9OZXR3b3JrVHlwZQorCQkJCQkJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIk5ldHdvcmtUeXBlIiwgdG1wYnVmLCAyNSwgYnVmZmVyKSkKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKKwkJCQkJCQlpZiAoc3RyY21wKHRtcGJ1ZiwgIkFkaG9jIikgPT0gMCkKKwkJCQkJCQkJcEFkLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19BREhPQzsKKwkJCQkJCQllbHNlIC8vRGVmYXVsdCBJbmZyYXN0cnVjdHVyZSBtb2RlCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfSU5GUkE7CisJCQkJCQkJLy8gUmVzZXQgUmFsaW5rIHN1cHBsaWNhbnQgdG8gbm90IHVzZSwgaXQgd2lsbCBiZSBzZXQgdG8gc3RhcnQgd2hlbiBVSSBzZXQgUE1LIGtleQorCQkJCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjooTmV0d29ya1R5cGU9JWQpXG4iLCBfX2Z1bmNfXywgcEFkLT5TdGFDZmcuQnNzVHlwZSkpOworCQkJCQkJfQorCQkJCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQkJCS8vQ2hhbm5lbAorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJDaGFubmVsIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IChVQ0hBUikgc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNoYW5uZWw9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJCQkJfQorCQkJCQkvL1dpcmVsZXNzTW9kZQorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJXaXJlbGVzc01vZGUiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlpbnQgdmFsdWUgID0gMCwgbWF4UGh5TW9kZSA9IFBIWV8xMUc7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQkJCW1heFBoeU1vZGUgPSBQSFlfMTFOXzVHOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCQkJCQl2YWx1ZSA9IHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7CisKKwkJCQkJCWlmICh2YWx1ZSA8PSBtYXhQaHlNb2RlKQorCQkJCQkJeworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSB2YWx1ZTsKKwkJCQkJCX0KKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBoeU1vZGU9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpKTsKKwkJCQkJfQorICAgICAgICAgICAgICAgICAgICAvL0Jhc2ljUmF0ZQorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJCYXNpY1JhdGUiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlwQWQtPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXAgPSAoVUxPTkcpIHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCYXNpY1JhdGU9JWxkXG4iLCBwQWQtPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXApKTsKKwkJCQkJfQorCQkJCQkvL0JlYWNvblBlcmlvZAorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJCZWFjb25QZXJpb2QiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPSAoVVNIT1JUKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQmVhY29uUGVyaW9kPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QpKTsKKwkJCQkJfQorICAgICAgICAgICAgICAgICAgICAvL1R4UG93ZXIKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiVHhQb3dlciIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gKFVMT05HKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdCA9IHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhQb3dlcj0lbGRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlKSk7CisJCQkJCX0KKwkJCQkJLy9CR1Byb3RlY3Rpb24KKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQkdQcm90ZWN0aW9uIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkJc3dpdGNoIChzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApKQorCQkJCQkJeworCQkJCQkJCWNhc2UgMTogLy9BbHdheXMgT24KKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAyOiAvL0Fsd2F5cyBPRkYKKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMjsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAwOiAvL0FVVE8KKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSAwOworCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJHUHJvdGVjdGlvbj0lbGRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbikpOworCQkJCQl9CisJCQkJCS8vT0xCQ0RldGVjdGlvbgorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJEaXNhYmxlT0xCQyIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCXN3aXRjaCAoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSkKKwkJCQkJCXsKKwkJCQkJCQljYXNlIDE6IC8vZGlzYWJsZSBPTEJDIERldGVjdGlvbgorCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5EaXNhYmxlT0xCQ0RldGVjdCA9IDE7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMDogLy9lbmFibGUgT0xCQyBEZXRlY3Rpb24KKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuRGlzYWJsZU9MQkNEZXRlY3QgPSAwOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5EaXNhYmxlT0xCQ0RldGVjdD0gMDsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJPTEJDRGV0ZWN0aW9uPSVsZFxuIiwgcEFkLT5Db21tb25DZmcuRGlzYWJsZU9MQkNEZXRlY3QpKTsKKwkJCQkJfQorCQkJCQkvL1R4UHJlYW1ibGUKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiVHhQcmVhbWJsZSIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCXN3aXRjaCAoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSkKKwkJCQkJCXsKKwkJCQkJCQljYXNlIFJ0ODAyXzExUHJlYW1ibGVTaG9ydDoKKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFJ0ODAyXzExUHJlYW1ibGVTaG9ydDsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSBSdDgwMl8xMVByZWFtYmxlTG9uZzoKKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUnQ4MDJfMTFQcmVhbWJsZUxvbmc7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhQcmVhbWJsZT0lbGRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUpKTsKKwkJCQkJfQorCQkJCQkvL1JUU1RocmVzaG9sZAorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJSVFNUaHJlc2hvbGQiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlSdHNUaHJlc2ggPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCQkJCQkJaWYoIChSdHNUaHJlc2ggPj0gMSkgJiYgKFJ0c1RocmVzaCA8PSBNQVhfUlRTX1RIUkVTSE9MRCkgKQorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCAgPSAoVVNIT1JUKVJ0c1RocmVzaDsKKwkJCQkJCWVsc2UKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPSBNQVhfUlRTX1RIUkVTSE9MRDsKKworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRTVGhyZXNob2xkPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQpKTsKKwkJCQkJfQorCQkJCQkvL0ZyYWdUaHJlc2hvbGQKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiRnJhZ1RocmVzaG9sZCIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCUZyYWdUaHJlc2ggPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCQkJCQkJcEFkLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9IEZBTFNFOworCisJCQkJCQlpZiAoRnJhZ1RocmVzaCA+IE1BWF9GUkFHX1RIUkVTSE9MRCB8fCBGcmFnVGhyZXNoIDwgTUlOX0ZSQUdfVEhSRVNIT0xEKQorCQkJCQkJeyAvL2lsbGVnYWwgRnJhZ1RocmVzaCBzbyB3ZSBzZXQgaXQgdG8gZGVmYXVsdAorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gTUFYX0ZSQUdfVEhSRVNIT0xEOworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBUUlVFOworCQkJCQkJfQorCQkJCQkJZWxzZSBpZiAoRnJhZ1RocmVzaCAlIDIgPT0gMSkKKwkJCQkJCXsKKwkJCQkJCQkvLyBUaGUgbGVuZ3RoIG9mIGVhY2ggZnJhZ21lbnQgc2hhbGwgYWx3YXlzIGJlIGFuIGV2ZW4gbnVtYmVyIG9mIG9jdGV0cywgZXhjZXB0IGZvciB0aGUgbGFzdCBmcmFnbWVudAorCQkJCQkJCS8vIG9mIGFuIE1TRFUgb3IgTU1QRFUsIHdoaWNoIG1heSBiZSBlaXRoZXIgYW4gZXZlbiBvciBhbiBvZGQgbnVtYmVyIG9mIG9jdGV0cy4KKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IChVU0hPUlQpKEZyYWdUaHJlc2ggLSAxKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IChVU0hPUlQpRnJhZ1RocmVzaDsKKwkJCQkJCX0KKwkJCQkJCS8vcEFkLT5Db21tb25DZmcuQWxsb3dGcmFnU2l6ZSA9IChwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCkgLSBMRU5HVEhfODAyXzExIC0gTEVOR1RIX0NSQzsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkZyYWdUaHJlc2hvbGQ9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkKSk7CisJCQkJCX0KKwkJCQkJLy9UeEJ1cnN0CisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlR4QnVyc3QiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApICE9IDApICAvL0VuYWJsZQorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ID0gVFJVRTsKKwkJCQkJCWVsc2UgLy9EaXNhYmxlCisJCQkJCQkJcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBGQUxTRTsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4QnVyc3Q9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0KSk7CisJCQkJCX0KKworI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKKwkJCQkJLy9Qa3RBZ2dyZWdhdGUKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiUGt0QWdncmVnYXRlIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkJaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKSAgLy9FbmFibGUKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID0gVFJVRTsKKwkJCQkJCWVsc2UgLy9EaXNhYmxlCisJCQkJCQkJcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSA9IEZBTFNFOworI2lmZGVmIFBJR0dZQkFDS19TVVBQT1JUCisJCQkJCQlwQWQtPkNvbW1vbkNmZy5iUGlnZ3lCYWNrQ2FwYWJsZSA9IHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGU7CisjZW5kaWYgLy8gUElHR1lCQUNLX1NVUFBPUlQgLy8KKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBrdEFnZ3JlZ2F0ZT0lZFxuIiwgcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSkpOworCQkJCQl9CisjZWxzZQorCQkJCQlwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID0gRkFMU0U7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJQaWdneUJhY2tDYXBhYmxlID0gRkFMU0U7CisjZW5kaWYgLy8gQUdHUkVHQVRJT05fU1VQUE9SVCAvLworCisJCQkJCS8vIFdtbUNhcGFibGUKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQkJcnRtcF9yZWFkX3N0YV93bW1fcGFybXNfZnJvbV9maWxlKHBBZCwgdG1wYnVmLCBidWZmZXIpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCQkJCS8vU2hvcnRTbG90CisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlNob3J0U2xvdCIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkgIC8vRW5hYmxlCisJCQkJCQkJcEFkLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUgPSBUUlVFOworCQkJCQkJZWxzZSAvL0Rpc2FibGUKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSA9IEZBTFNFOworCisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTaG9ydFNsb3Q9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lKSk7CisJCQkJCX0KKwkJCQkJLy9JRUVFODAyMTFICisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIklFRUU4MDIxMUgiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCSAgICBmb3IgKGkgPSAwLCBtYWNwdHIgPSByc3RydG9rKHRtcGJ1ZiwiOyIpOyBtYWNwdHI7IG1hY3B0ciA9IHJzdHJ0b2soTlVMTCwiOyIpLCBpKyspCisJCQkJCSAgICB7CisgICAgCQkJCQkJaWYoc2ltcGxlX3N0cnRvbChtYWNwdHIsIDAsIDEwKSAhPSAwKSAgLy9FbmFibGUKKyAgICAJCQkJCQkJcEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPSBUUlVFOworICAgIAkJCQkJCWVsc2UgLy9EaXNhYmxlCisgICAgCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID0gRkFMU0U7CisKKyAgICAJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRUVFODAyMTFIPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCkpOworCQkJCQkgICAgfQorCQkJCQl9CisJCQkJCS8vQ1NQZXJpb2QKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQ1NQZXJpb2QiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCSAgICBpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApICE9IDApCisJCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ1NQZXJpb2QgPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCQkJCQkJZWxzZQorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNTUGVyaW9kID0gMDsKKworICAgCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ1NQZXJpb2Q9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNTUGVyaW9kKSk7CisJCQkJCX0KKworCQkJCQkvL1JEUmVnaW9uCisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlJEUmVnaW9uIiwgdG1wYnVmLCAxMjgsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCWlmICgoc3RybmNtcCh0bXBidWYsICJKQVBfVzUzIiwgNykgPT0gMCkgfHwgKHN0cm5jbXAodG1wYnVmLCAiamFwX3c1MyIsIDcpID09IDApKQorCQkJCQkJeworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uID0gSkFQX1c1MzsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSA9IDE1OworCQkJCQkJfQorCQkJCQkJZWxzZSBpZiAoKHN0cm5jbXAodG1wYnVmLCAiSkFQX1c1NiIsIDcpID09IDApIHx8IChzdHJuY21wKHRtcGJ1ZiwgImphcF93NTYiLCA3KSA9PSAwKSkKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9IEpBUF9XNTY7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgPSAxMzsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgaWYgKChzdHJuY21wKHRtcGJ1ZiwgIkpBUCIsIDMpID09IDApIHx8IChzdHJuY21wKHRtcGJ1ZiwgImphcCIsIDMpID09IDApKQorCQkJCQkJeworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uID0gSkFQOworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkRmc1Nlc3Npb25UaW1lID0gNTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgIGlmICgoc3RybmNtcCh0bXBidWYsICJGQ0MiLCAzKSA9PSAwKSB8fCAoc3RybmNtcCh0bXBidWYsICJmY2MiLCAzKSA9PSAwKSkKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9IEZDQzsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSA9IDU7CisJCQkJCQl9CisJCQkJCQllbHNlIGlmICgoc3RybmNtcCh0bXBidWYsICJDRSIsIDIpID09IDApIHx8IChzdHJuY21wKHRtcGJ1ZiwgImNlIiwgMikgPT0gMCkpCisJCQkJCQl7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24gPSBDRTsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSA9IDEzOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uID0gQ0U7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgPSAxMzsKKwkJCQkJCX0KKworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkRSZWdpb249JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uKSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9IENFOworCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgPSAxMzsKKwkJCQkJfQorCisJCQkJCS8vV2lyZWxlc3NFdmVudAorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJXaXJlbGVzc0V2ZW50IiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworI2lmIFdJUkVMRVNTX0VYVCA+PSAxNQorCQkJCQkgICAgaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKQorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50ID0gc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCA9IDA7CS8vIGRpc2FibGUKKyNlbHNlCisJCQkJCQlwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCA9IDA7CS8vIGRpc2FibGUKKyNlbmRpZgorICAgCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV2lyZWxlc3NFdmVudD0lZFxuIiwgcEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpKTsKKwkJCQkJfQorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJXaUZpVGVzdCIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJICAgIGlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iV2lGaVRlc3Q9IHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7CisJCQkJCQllbHNlCisJCQkJCQkJcEFkLT5Db21tb25DZmcuYldpRmlUZXN0ID0gMDsJLy8gZGlzYWJsZQorCisgICAJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXaUZpVGVzdD0lZFxuIiwgcEFkLT5Db21tb25DZmcuYldpRmlUZXN0KSk7CisJCQkJCX0KKwkJCQkJLy9BdXRoTW9kZQorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJBdXRoTW9kZSIsIHRtcGJ1ZiwgMTI4LCBidWZmZXIpKQorCQkJCQl7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQkJeworCQkJCQkJCWlmICgoc3RyY21wKHRtcGJ1ZiwgIldFUEFVVE8iKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIndlcGF1dG8iKSA9PSAwKSkKKwkJCQkJCQkgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoOworCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiU0hBUkVEIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJzaGFyZWQiKSA9PSAwKSkKKwkJCQkJCQkgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQ7CisJCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJXUEFQU0siKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIndwYXBzayIpID09IDApKQorCQkJCQkJCSAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzsKKwkJCQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIldQQU5PTkUiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIndwYW5vbmUiKSA9PSAwKSkKKwkJCQkJCQkgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOworCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiV1BBMlBTSyIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAid3BhMnBzayIpID09IDApKQorCQkJCQkJCSAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiV1BBIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJ3cGEiKSA9PSAwKSkKKwkJCQkJCQkgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEE7CisJCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJXUEEyIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJ3cGEyIikgPT0gMCkpCisJCQkJCQkJICAgIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMjsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjooRW5jcnlwVHlwZT0lZClcbiIsIF9fZnVuY19fLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMpKTsKKwkJCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCQkJfQorCQkJCQkvL0VuY3J5cFR5cGUKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiRW5jcnlwVHlwZSIsIHRtcGJ1ZiwgMTI4LCBidWZmZXIpKQorCQkJCQl7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJCQl7CisJCQkJCQkJaWYgKChzdHJjbXAodG1wYnVmLCAiV0VQIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJ3ZXAiKSA9PSAwKSkKKwkJCQkJCQkJcEFkLT5TdGFDZmcuV2VwU3RhdHVzCT0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisJCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJUS0lQIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJ0a2lwIikgPT0gMCkpCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLldlcFN0YXR1cwk9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJBRVMiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgImFlcyIpID09IDApKQorCQkJCQkJCQlwQWQtPlN0YUNmZy5XZXBTdGF0dXMJPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworCQkJCQkJCWVsc2UKKwkJCQkJCQkJcEFkLT5TdGFDZmcuV2VwU3RhdHVzCT0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCisJCQkJCQkJLy8gVXBkYXRlIGFsbCB3ZXBzdGF0dXMgcmVsYXRlZAorCQkJCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIJCT0gcEFkLT5TdGFDZmcuV2VwU3RhdHVzOworCQkJCQkJCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyIAk9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKKwkJCQkJCQlwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzIAk9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKKwkJCQkJCQlwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyIAkJPSBGQUxTRTsKKworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjooRW5jcnlwVHlwZT0lZClcbiIsIF9fZnVuY19fLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMpKTsKKwkJCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCQkJfQorCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQl7CisJCQkJCQlpZihSVE1QR2V0Q3JpdGljYWxQYXJhbWV0ZXIoIldQQVBTSyIsIHRtcGJ1ZiwgNTEyLCBidWZmZXIpKQorCQkJCQkJeworCQkJCQkJCWludCAgICAgZXJyPTA7CisKKwkJCQkJCQl0bXBidWZbc3RybGVuKHRtcGJ1ZildID0gJ1wwJzsgLy8gbWFrZSBTVEEgY2FuIHByb2Nlc3MgLiReJiBmb3IgV1BBUFNLIGlucHV0CisKKwkJCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgJiYKKwkJCQkJCQkJKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spICYmCisJCQkJCQkJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorCQkJCQkJCQkpCisJCQkJCQkJeworCQkJCQkJCQllcnIgPSAxOworCQkJCQkJCX0KKwkJCQkJCQllbHNlIGlmICgoc3RybGVuKHRtcGJ1ZikgPj0gOCkgJiYgKHN0cmxlbih0bXBidWYpIDwgNjQpKQorCQkJCQkJCXsKKwkJCQkJCQkJUGFzc3dvcmRIYXNoKChjaGFyICopdG1wYnVmLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLCBrZXlNYXRlcmlhbCk7CisJCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlBNSywga2V5TWF0ZXJpYWwsIDMyKTsKKworCQkJCQkJCX0KKwkJCQkJCQllbHNlIGlmIChzdHJsZW4odG1wYnVmKSA9PSA2NCkKKwkJCQkJCQl7CisJCQkJCQkJCUF0b0godG1wYnVmLCBrZXlNYXRlcmlhbCwgMzIpOworCQkJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5QTUssIGtleU1hdGVyaWFsLCAzMik7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCWVyciA9IDE7CisJCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOjooV1BBUFNLIGtleS1zdHJpbmcgcmVxdWlyZWQgOCB+IDY0IGNoYXJhY3RlcnMhKVxuIiwgX19mdW5jX18pKTsKKwkJCQkJCQl9CisKKwkJCQkJCQlpZiAoZXJyID09IDApCisJICAgICAgICAgICAgICAgICAgICAgICAgCQkJeworCSAgICAgICAgICAgICAgICAgICAgICAgIAkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKKwkJCQkJCQkJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKKwkJCQkJCQkJeworCQkJCQkJCQkJLy8gU3RhcnQgU1RBIHN1cHBsaWNhbnQgc3RhdGUgbWFjaGluZQorCQkJCQkJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19TVEFSVDsKKwkJCQkJCQkJfQorCQkJCQkJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorCQkJCQkJCQl7CisJCQkJCQkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX05PVFVTRTsKKwkJCQkJCQkJfQorCisJCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjooV1BBUFNLPSVzKVxuIiwgX19mdW5jX18sIHRtcGJ1ZikpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCQkJCS8vRGVmYXVsdEtleUlELCBLZXlUeXBlLCBLZXlTdHIKKwkJCQkJcnRtcF9yZWFkX2tleV9wYXJtc19mcm9tX2ZpbGUocEFkLCB0bXBidWYsIGJ1ZmZlcik7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQkJSFRQYXJhbWV0ZXJzSG9vayhwQWQsIHRtcGJ1ZiwgYnVmZmVyKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVAorCQkJCQkJLy9DYXJyaWVyRGV0ZWN0CisJCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJDYXJyaWVyRGV0ZWN0IiwgdG1wYnVmLCAxMjgsIGJ1ZmZlcikpCisJCQkJCQl7CisJCQkJCQkJaWYgKChzdHJuY21wKHRtcGJ1ZiwgIjAiLCAxKSA9PSAwKSkKKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPSBGQUxTRTsKKwkJCQkJCQllbHNlIGlmICgoc3RybmNtcCh0bXBidWYsICIxIiwgMSkgPT0gMCkpCisJCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID0gVFJVRTsKKwkJCQkJCQllbHNlCisJCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID0gRkFMU0U7CisKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDYXJyaWVyRGV0ZWN0LkVuYWJsZT0lZFxuIiwgcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUpKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9IEZBTFNFOworI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQl7CisJCQkJCQkvL1BTTW9kZQorCQkJCQkJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlBTTW9kZSIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCQl7CisJCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0lORlJBKQorCQkJCQkJCXsKKwkJCQkJCQkJaWYgKChzdHJjbXAodG1wYnVmLCAiTUFYX1BTUCIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAibWF4X3BzcCIpID09IDApKQorCQkJCQkJCQl7CisJCQkJCQkJCQkvLyBkbyBOT1QgdHVybiBvbiBQU00gYml0IGhlcmUsIHdhaXQgdW50aWwgTWxtZUNoZWNrRm9yUHNtQ2hhbmdlKCkKKwkJCQkJCQkJCS8vIHRvIGV4Y2x1ZGUgY2VydGFpbiBzaXR1YXRpb25zLgorCQkJCQkJCQkJLy8JICAgTWxtZVNldFBzbShwQWQsIFBXUl9TQVZFKTsKKwkJCQkJCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOworCQkJCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCisJCQkJCQkJCQkJcEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQOworCQkJCQkJCQkJcEFkLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlTUFYX1BTUDsKKwkJCQkJCQkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCA9IDU7CisJCQkJCQkJCX0KKwkJCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJGYXN0X1BTUCIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAiZmFzdF9wc3AiKSA9PSAwKQorCQkJCQkJCQkJfHwgKHN0cmNtcCh0bXBidWYsICJGQVNUX1BTUCIpID09IDApKQorCQkJCQkJCQl7CisJCQkJCQkJCQkvLyBkbyBOT1QgdHVybiBvbiBQU00gYml0IGhlcmUsIHdhaXQgdW50aWwgTWxtZUNoZWNrRm9yUHNtQ2hhbmdlKCkKKwkJCQkJCQkJCS8vIHRvIGV4Y2x1ZGUgY2VydGFpbiBzaXR1YXRpb25zLgorCQkJCQkJCQkJLy8JICAgTWxtZVNldFBzbUJpdChwQWQsIFBXUl9TQVZFKTsKKwkJCQkJCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOworCQkJCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCisJCQkJCQkJCQkJcEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUDsKKwkJCQkJCQkJCXBBZC0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQOworCQkJCQkJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gMzsKKwkJCQkJCQkJfQorCQkJCQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIkxlZ2FjeV9QU1AiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgImxlZ2FjeV9wc3AiKSA9PSAwKQorCQkJCQkJCQkJfHwgKHN0cmNtcCh0bXBidWYsICJMRUdBQ1lfUFNQIikgPT0gMCkpCisJCQkJCQkJCXsKKwkJCQkJCQkJCS8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tGb3JQc21DaGFuZ2UoKQorCQkJCQkJCQkJLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCisJCQkJCQkJCQkvLwkgICBNbG1lU2V0UHNtQml0KHBBZCwgUFdSX1NBVkUpOworCQkJCQkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7CisJCQkJCQkJCQlpZiAocEFkLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKKwkJCQkJCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1A7CisJCQkJCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQOworCQkJCQkJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gMzsKKwkJCQkJCQkJfQorCQkJCQkJCQllbHNlCisJCQkJCQkJCXsgLy9EZWZhdWx0IE5kaXM4MDJfMTFQb3dlck1vZGVDQU0KKwkJCQkJCQkJCS8vIGNsZWFyIFBTTSBiaXQgaW1tZWRpYXRlbHkKKwkJCQkJCQkJCU1sbWVTZXRQc21CaXQocEFkLCBQV1JfQUNUSVZFKTsKKwkJCQkJCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOworCQkJCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCisJCQkJCQkJCQkJcEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVDQU07CisJCQkJCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVDQU07CisJCQkJCQkJCX0KKwkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUFNNb2RlPSVsZFxuIiwgcEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSkpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCS8vIEZhc3RSb2FtaW5nCisJCQkJCQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiRmFzdFJvYW1pbmciLCB0bXBidWYsIDMyLCBidWZmZXIpKQorCQkJCQkJeworCQkJCQkJCWlmIChzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApID09IDApCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLmJGYXN0Um9hbWluZyA9IEZBTFNFOworCQkJCQkJCWVsc2UKKwkJCQkJCQkJcEFkLT5TdGFDZmcuYkZhc3RSb2FtaW5nID0gVFJVRTsKKworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkZhc3RSb2FtaW5nPSVkXG4iLCBwQWQtPlN0YUNmZy5iRmFzdFJvYW1pbmcpKTsKKwkJCQkJCX0KKwkJCQkJCS8vIFJvYW1UaHJlc2hvbGQKKwkJCQkJCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJSb2FtVGhyZXNob2xkIiwgdG1wYnVmLCAzMiwgYnVmZmVyKSkKKwkJCQkJCXsKKwkJCQkJCQlsb25nIGxJbmZvID0gc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKKworCQkJCQkJCWlmIChsSW5mbyA+IDkwIHx8IGxJbmZvIDwgNjApCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLmRCbVRvUm9hbSA9IC03MDsKKwkJCQkJCQllbHNlCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLmRCbVRvUm9hbSA9IChDSEFSKSgtMSkqbEluZm87CisKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSb2FtVGhyZXNob2xkPSVkICBkQm1cbiIsIHBBZC0+U3RhQ2ZnLmRCbVRvUm9hbSkpOworCQkJCQkJfQorCisJCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJUR25XaWZpVGVzdCIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCQl7CisJCQkJCQkJaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSA9PSAwKQorCQkJCQkJCQlwQWQtPlN0YUNmZy5iVEduV2lmaVRlc3QgPSBGQUxTRTsKKwkJCQkJCQllbHNlCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCA9IFRSVUU7CisJCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRHbldpZmlUZXN0PSVkXG4iLCBwQWQtPlN0YUNmZy5iVEduV2lmaVRlc3QpKTsKKwkJCQkJCX0KKwkJCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiAlcyBkb2VzIG5vdCBoYXZlIGEgd3JpdGUgbWV0aG9kXG4iLCBzcmMpKTsKKwkJCX0KKworCQkJcmV0dmFsPWZpbHBfY2xvc2Uoc3JjZixOVUxMKTsKKworCQkJaWYgKHJldHZhbCkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gRXJyb3IgJWQgY2xvc2luZyAlc1xuIiwgLXJldHZhbCwgc3JjKSk7CisJCQl9CisJCX0KKwl9CisKKwlzZXRfZnMob3JnZnMpOworCisjaWYgMAorCWN1cnJlbnQtPmNyZWQtPmZzdWlkID0gb3JnZnN1aWQ7CisJY3VycmVudC0+Y3JlZC0+ZnNnaWQgPSBvcmdmc2dpZDsKKyNlbmRpZgorCisJa2ZyZWUoYnVmZmVyKTsKKwlrZnJlZSh0bXBidWYpOworCisJcmV0dXJuIChORElTX1NUQVRVU19TVUNDRVNTKTsKK30KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorc3RhdGljIHZvaWQJSFRQYXJhbWV0ZXJzSG9vaygKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglDSEFSCQkgICpwVmFsdWVTdHIsCisJSU4JQ0hBUgkJICAqcElucHV0KQoreworCisJSU5UIFZhbHVlOworCisgICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX1BST1RFQ1QiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorICAgIHsKKyAgICAgICAgVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworICAgICAgICBpZiAoVmFsdWUgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYkhUUHJvdGVjdCA9IEZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYkhUUHJvdGVjdCA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IFByb3RlY3Rpb24gID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlIikpOworICAgIH0KKworICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9NSU1PUFNFbmFibGUiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorICAgIHsKKyAgICAgICAgVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworICAgICAgICBpZiAoVmFsdWUgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYk1JTU9QU0VuYWJsZSA9IEZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYk1JTU9QU0VuYWJsZSA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IE1JTU9QU0VuYWJsZSAgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUiKSk7CisgICAgfQorCisKKyAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfTUlNT1BTTW9kZSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisgICAgeworICAgICAgICBWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisgICAgICAgIGlmIChWYWx1ZSA+IE1NUFNfRU5BQkxFKQorICAgICAgICB7CisJCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSBNTVBTX0VOQUJMRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vVE9ETzogYWRkIG1pbW8gcG93ZXIgc2F2aW5nIG1lY2hhbmlzbQorICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gTU1QU19FTkFCTEU7CisJCQkvL3BBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSA9IFZhbHVlOworICAgICAgICB9CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBNSU1PUFMgTW9kZSAgPSAlZFxuIiwgVmFsdWUpKTsKKyAgICB9CisKKyAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfQkFEZWNsaW5lIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKyAgICB7CisgICAgICAgIFZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKyAgICAgICAgaWYgKFZhbHVlID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJCQURlY2xpbmUgPSBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJCQURlY2xpbmUgPSBUUlVFOworICAgICAgICB9CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBCQSBEZWNsaW5lICA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSIpKTsKKyAgICB9CisKKworICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9EaXNhYmxlUmVvcmRlcmluZyIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisgICAgeworICAgICAgICBWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisgICAgICAgIGlmIChWYWx1ZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iRGlzYWJsZVJlb3JkZXJpbmcgPSBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJEaXNhYmxlUmVvcmRlcmluZyA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IERpc2FibGVSZW9yZGVyaW5nICA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSIpKTsKKyAgICB9CisKKyAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfQXV0b0JBIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKyAgICB7CisgICAgICAgIFZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKyAgICAgICAgaWYgKFZhbHVlID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBUUlVFOworICAgICAgICB9CisgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBOworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogQXV0byBCQSAgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUiKSk7CisgICAgfQorCisJLy8gVHhfK0hUQyBmcmFtZQorICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9IVEMiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorCXsKKwkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworCQlpZiAoVmFsdWUgPT0gMCkKKwkJeworCQkJcEFkLT5IVENFbmFibGUgPSBGQUxTRTsKKwkJfQorCQllbHNlCisJCXsKKyAgICAgICAgICAgIAkJcEFkLT5IVENFbmFibGUgPSBUUlVFOworCQl9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBUeCArSFRDIGZyYW1lID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlIikpOworCX0KKworCS8vIEVuYWJsZSBIVCBMaW5rIEFkYXB0YXRpb24gQ29udHJvbAorCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9MaW5rQWRhcHQiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorCXsKKwkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworCQlpZiAoVmFsdWUgPT0gMCkKKwkJeworCQkJcEFkLT5iTGlua0FkYXB0ID0gRkFMU0U7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwQWQtPkhUQ0VuYWJsZSA9IFRSVUU7CisJCQlwQWQtPmJMaW5rQWRhcHQgPSBUUlVFOworCQl9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBMaW5rIEFkYXB0YXRpb24gQ29udHJvbCA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSgrSFRDKSIpKTsKKwl9CisKKwkvLyBSZXZlcnNlIERpcmVjdGlvbiBNZWNoYW5pc20KKyAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfUkRHIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKwl7CisJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKwkJaWYgKFZhbHVlID09IDApCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLmJSZGcgPSBGQUxTRTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBBZC0+SFRDRW5hYmxlID0gVFJVRTsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJSZGcgPSBUUlVFOworCQl9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBSREcgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUoK0hUQykiKSk7CisJfQorCisKKworCisJLy8gVHggQS1NU1VEID8KKyAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfQU1TRFUiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorCXsKKwkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworCQlpZiAoVmFsdWUgPT0gMCkKKwkJeworCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1RW5hYmxlID0gRkFMU0U7CisJCX0KKwkJZWxzZQorCQl7CisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGUgPSBUUlVFOworCQl9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBUeCBBLU1TRFUgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUiKSk7CisJfQorCisJLy8gTVBEVSBEZW5zaXR5CisgICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX01wZHVEZW5zaXR5IiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKwl7CisJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKwkJaWYgKFZhbHVlIDw9NyAmJiBWYWx1ZSA+PSAwKQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkgPSBWYWx1ZTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBNUERVIERlbnNpdHkgPSAlZFxuIiwgVmFsdWUpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eSA9IDQ7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogTVBEVSBEZW5zaXR5ID0gJWQgKERlZmF1bHQpXG4iLCA0KSk7CisJCX0KKwl9CisKKwkvLyBNYXggUnggQkEgV2luZG93IFNpemUKKyAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfQkFXaW5TaXplIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKwl7CisJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKworCQlpZiAoVmFsdWUgPj0xICYmIFZhbHVlIDw9IDY0KQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gVmFsdWU7CisJCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gVmFsdWU7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogQkEgV2luZHcgU2l6ZSA9ICVkXG4iLCBWYWx1ZSkpOworCQl9CisJCWVsc2UKKwkJeworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IDY0OworCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IDY0OworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IEJBIFdpbmR3IFNpemUgPSA2NCAoRGVmdWFsdClcbiIpKTsKKwkJfQorCisJfQorCisJLy8gR3VhcmQgSW50ZXJ2YWwKKwlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfR0kiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorCXsKKwkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworCisJCWlmIChWYWx1ZSA9PSBHSV80MDApCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJID0gR0lfNDAwOworCQl9CisJCWVsc2UKKwkJeworCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7CisJCX0KKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogR3VhcmQgSW50ZXJ2YWwgPSAlc1xuIiwgKFZhbHVlPT1HSV80MDApID8gIjQwMCIgOiAiODAwIiApKTsKKwl9CisKKwkvLyBIVCBPcGVyYXRpb24gTW9kZSA6IE1peGVkIE1vZGUgLCBHcmVlbiBGaWVsZAorCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9PcE1vZGUiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorCXsKKwkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworCisJCWlmIChWYWx1ZSA9PSBIVE1PREVfR0YpCisJCXsKKworCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERSAgPSBIVE1PREVfR0Y7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFICA9IEhUTU9ERV9NTTsKKwkJfQorCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBPcGVyYXRlIE1vZGUgPSAlc1xuIiwgKFZhbHVlPT1IVE1PREVfR0YpID8gIkdyZWVuIEZpZWxkIiA6ICJNaXhlZCBNb2RlIiApKTsKKwl9CisKKwkvLyBGaXhlZCBUeCBtb2RlIDogQ0NLLCBPRkRNCisJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkZpeGVkVHhNb2RlIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKwl7CisJCVVDSEFSCWZpeF90eF9tb2RlOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCWZpeF90eF9tb2RlID0gRklYRURfVFhNT0RFX0hUOworCisJCQlpZiAoc3RyY21wKHBWYWx1ZVN0ciwgIk9GRE0iKSA9PSAwIHx8IHN0cmNtcChwVmFsdWVTdHIsICJvZmRtIikgPT0gMCkKKwkJCXsKKwkJCQlmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9PRkRNOworCQkJfQorCQkJZWxzZSBpZiAoc3RyY21wKHBWYWx1ZVN0ciwgIkNDSyIpID09IDAgfHwgc3RyY21wKHBWYWx1ZVN0ciwgImNjayIpID09IDApCisJCQl7CisJCSAgICAgICAgZml4X3R4X21vZGUgPSBGSVhFRF9UWE1PREVfQ0NLOworCQkJfQorCQkJZWxzZSBpZiAoc3RyY21wKHBWYWx1ZVN0ciwgIkhUIikgPT0gMCB8fCBzdHJjbXAocFZhbHVlU3RyLCAiaHQiKSA9PSAwKQorCQkJeworCQkgICAgICAgIGZpeF90eF9tb2RlID0gRklYRURfVFhNT0RFX0hUOworCQl9CisJCWVsc2UKKwkJeworCQkJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKwkJCQkvLyAxIDogQ0NLCisJCQkJLy8gMiA6IE9GRE0KKwkJCQkvLyBvdGhlcndpc2UgOiBIVAorCQkJCWlmIChWYWx1ZSA9PSBGSVhFRF9UWE1PREVfQ0NLIHx8IFZhbHVlID09IEZJWEVEX1RYTU9ERV9PRkRNKQorCQkJCQlmaXhfdHhfbW9kZSA9IFZhbHVlOworCQkJCWVsc2UKKwkJCQkJZml4X3R4X21vZGUgPSBGSVhFRF9UWE1PREVfSFQ7CisJCX0KKworCQkJcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSA9IGZpeF90eF9tb2RlOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRml4ZWQgVHggTW9kZSA9ICVkXG4iLCBmaXhfdHhfbW9kZSkpOworCisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl9CisKKworCS8vIENoYW5uZWwgV2lkdGgKKwlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfQlciLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorCXsKKwkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworCisJCWlmIChWYWx1ZSA9PSBCV180MCkKKwkJeworCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzQwOworCQl9CisJCWVsc2UKKwkJeworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzIwOworCQl9CisKKyNpZmRlZiBNQ0FTVF9SQVRFX1NQRUNJRklDCisJCXBBZC0+Q29tbW9uQ2ZnLk1DYXN0UGh5TW9kZS5maWVsZC5CVyA9IHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVzsKKyNlbmRpZiAvLyBNQ0FTVF9SQVRFX1NQRUNJRklDIC8vCisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IENoYW5uZWwgV2lkdGggPSAlc1xuIiwgKFZhbHVlPT1CV180MCkgPyAiNDAgTUh6IiA6ICIyMCBNSHoiICkpOworCX0KKworCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9FWFRDSEEiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorCXsKKwkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworCisJCWlmIChWYWx1ZSA9PSAwKQorCQl7CisKKwkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgID0gRVhUQ0hBX0JFTE9XOworCQl9CisJCWVsc2UKKwkJeworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9BQk9WRTsKKwkJfQorCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBFeHQgQ2hhbm5lbCA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkJFTE9XIiA6ICJBQk9WRSIgKSk7CisJfQorCisJLy8gTVNDCisJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX01DUyIsIHBWYWx1ZVN0ciwgNTAsIHBJbnB1dCkpCisJeworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKworCQkJaWYgKChWYWx1ZSA+PSAwICYmIFZhbHVlIDw9IDIzKSB8fCAoVmFsdWUgPT0gMzIpKSAvLyAzKjMKKwkJeworCQkJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICA9IFZhbHVlOworCQkJCXBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gRkFMU0U7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IE1DUyA9ICVkXG4iLCBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUykpOworCQl9CisJCWVsc2UKKwkJeworCQkJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICA9IE1DU19BVVRPOworCQkJCXBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gVFJVRTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogTUNTID0gQVVUT1xuIikpOworCQl9CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KKworCS8vIFNUQkMKKyAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfU1RCQyIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisJeworCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisJCWlmIChWYWx1ZSA9PSBTVEJDX1VTRSkKKwkJeworCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkMgPSBTVEJDX1VTRTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDID0gU1RCQ19OT05FOworCQl9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBTVEJDID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDKSk7CisJfQorCisJLy8gNDBfTWh6X0ludG9sZXJhbnQKKwlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfNDBNSFpfSU5UT0xFUkFOVCIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisJeworCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisJCWlmIChWYWx1ZSA9PSAwKQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5iRm9ydHlfTWh6X0ludG9sZXJhbnQgPSBGQUxTRTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLmJGb3J0eV9NaHpfSW50b2xlcmFudCA9IFRSVUU7CisJCX0KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IDQwTUhaIElOVE9MRVJBTlQgPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuYkZvcnR5X01oel9JbnRvbGVyYW50KSk7CisJfQorCS8vSFRfVHhTdHJlYW0KKwlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9UeFN0cmVhbSIsIHBWYWx1ZVN0ciwgMTAsIHBJbnB1dCkpCisJeworCQlzd2l0Y2ggKHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCkpCisJCXsKKwkJCWNhc2UgMToKKwkJCQlwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJcEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPSAyOworCQkJCWJyZWFrOworCQkJY2FzZSAzOiAvLyAzKjMKKwkJCWRlZmF1bHQ6CisJCQkJcEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPSAzOworCisJCQkJaWYgKHBBZC0+TUFDVmVyc2lvbiA8IFJBTElOS18yODgzX1ZFUlNJT04pCisJCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID0gMjsgLy8gb25seSAyIHR4IHN0cmVhbXMgZm9yIFJUMjg2MCBzZXJpZXMKKwkJCQlicmVhazsKKwkJfQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogVHggU3RyZWFtID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtKSk7CisJfQorCS8vSFRfUnhTdHJlYW0KKwlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9SeFN0cmVhbSIsIHBWYWx1ZVN0ciwgMTAsIHBJbnB1dCkpCisJeworCQlzd2l0Y2ggKHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCkpCisJCXsKKwkJCWNhc2UgMToKKwkJCQlwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSAyOworCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJZGVmYXVsdDoKKwkJCQlwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA9IDM7CisKKwkJCQlpZiAocEFkLT5NQUNWZXJzaW9uIDwgUkFMSU5LXzI4ODNfVkVSU0lPTikKKwkJCQkJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSAyOyAvLyBvbmx5IDIgcnggc3RyZWFtcyBmb3IgUlQyODYwIHNlcmllcworCQkJCWJyZWFrOworCQl9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBSeCBTdHJlYW0gPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuUnhTdHJlYW0pKTsKKwl9CisKK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTE5NTQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wLmgKQEAgLTAsMCArMSw3MTc3IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorICAgIHJ0bXAuaAorCisgICAgQWJzdHJhY3Q6CisgICAgTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFBhdWwgTGluICAgIDIwMDItMDgtMDEgICAgY3JlYXRlZAorICAgIEphbWVzIFRhbiAgIDIwMDItMDktMDYgICAgbW9kaWZpZWQgKFJldmlzZSBOVENSZWdUYWJsZSkKKyAgICBKb2huIENoYW5nICAyMDA0LTA5LTA2ICAgIG1vZGlmaWVkIGZvciBSVDI2MDAKKyovCisjaWZuZGVmIF9fUlRNUF9IX18KKyNkZWZpbmUgX19SVE1QX0hfXworCisjaW5jbHVkZSAibGlua19saXN0LmgiCisjaW5jbHVkZSAic3BlY3RydW1fZGVmLmgiCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2luY2x1ZGUgImFpcm9uZXQuaCIKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworLy8jZGVmaW5lIERCR19ESUFHTk9TRQkJMQorCisjaWYgZGVmaW5lZChDT05GSUdfQVBfU1VQUE9SVCkgJiYgZGVmaW5lZChDT05GSUdfU1RBX1NVUFBPUlQpCisjZGVmaW5lIElGX0RFVl9DT05GSUdfT1BNT0RFX09OX0FQKF9wQWQpCWlmKF9wQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApCisjZGVmaW5lIElGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShfcEFkKQlpZihfcEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKKyNlbHNlCisjZGVmaW5lIElGX0RFVl9DT05GSUdfT1BNT0RFX09OX0FQKF9wQWQpCisjZGVmaW5lIElGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShfcEFkKQorI2VuZGlmCisKKyNkZWZpbmUgVklSVFVBTF9JRl9JTkMoX19wQWQpICgoX19wQWQpLT5WaXJ0dWFsSWZDbnQrKykKKyNkZWZpbmUgVklSVFVBTF9JRl9ERUMoX19wQWQpICgoX19wQWQpLT5WaXJ0dWFsSWZDbnQtLSkKKyNkZWZpbmUgVklSVFVBTF9JRl9OVU0oX19wQWQpICgoX19wQWQpLT5WaXJ0dWFsSWZDbnQpCisKKworCisvLworLy8gIE5ESVMgVmVyc2lvbiBkZWZpbml0aW9ucworLy8KKyNpZmRlZiAgTkRJUzUwX01JTklQT1JUCisjZGVmaW5lIFJUTVBfTkRJU19NQUpPUl9WRVJTSU9OICAgICA1CisjZGVmaW5lIFJUTVBfTkRJU19NSU5PUl9WRVJTSU9OICAgICAwCisjZW5kaWYKKworI2lmZGVmICBORElTNTFfTUlOSVBPUlQKKyNkZWZpbmUgUlRNUF9ORElTX01BSk9SX1ZFUlNJT04gICAgIDUKKyNkZWZpbmUgUlRNUF9ORElTX01JTk9SX1ZFUlNJT04gICAgIDEKKyNlbmRpZgorCitleHRlcm4gIGNoYXIgICAgTklDX1ZFTkRPUl9ERVNDW107CitleHRlcm4gIGludCAgICAgTklDX1ZFTkRPUl9ERVNDX0xFTjsKKworZXh0ZXJuICB1bnNpZ25lZCBjaGFyICAgU05BUF9BSVJPTkVUW107CitleHRlcm4gIHVuc2lnbmVkIGNoYXIgICBDaXBoZXJTdWl0ZUNpc2NvQ0NLTVtdOworZXh0ZXJuICB1bnNpZ25lZCBjaGFyICAgQ2lwaGVyU3VpdGVDaXNjb0NDS01MZW47CitleHRlcm4JdW5zaWduZWQgY2hhcglDaXBoZXJTdWl0ZUNpc2NvQ0NLTTI0W107CitleHRlcm4JdW5zaWduZWQgY2hhcglDaXBoZXJTdWl0ZUNpc2NvQ0NLTTI0TGVuOworZXh0ZXJuICB1bnNpZ25lZCBjaGFyICAgQ2lwaGVyU3VpdGVDQ1hUa2lwW107CitleHRlcm4gIHVuc2lnbmVkIGNoYXIgICBDaXBoZXJTdWl0ZUNDWFRraXBMZW47CitleHRlcm4gIHVuc2lnbmVkIGNoYXIgICBDSVNDT19PVUlbXTsKK2V4dGVybiAgVUNIQVIJQmFTaXplQXJyYXlbNF07CisKK2V4dGVybiBVQ0hBUiBCUk9BRENBU1RfQUREUltNQUNfQUREUl9MRU5dOworZXh0ZXJuIFVDSEFSIE1VTFRJQ0FTVF9BRERSW01BQ19BRERSX0xFTl07CitleHRlcm4gVUNIQVIgWkVST19NQUNfQUREUltNQUNfQUREUl9MRU5dOworZXh0ZXJuIFVMT05HIEJJVDMyWzMyXTsKK2V4dGVybiBVQ0hBUiBCSVQ4WzhdOworZXh0ZXJuIGNoYXIqIENpcGhlck5hbWVbXTsKK2V4dGVybiBjaGFyKiBNQ1NUb01icHNbXTsKK2V4dGVybiBVQ0hBUgkgUnh3aU1DU1RvT2ZkbVJhdGVbMTJdOworZXh0ZXJuIFVDSEFSIFNOQVBfODAyXzFIWzZdOworZXh0ZXJuIFVDSEFSIFNOQVBfQlJJREdFX1RVTk5FTFs2XTsKK2V4dGVybiBVQ0hBUiBTTkFQX0FJUk9ORVRbOF07CitleHRlcm4gVUNIQVIgQ0tJUF9MTENfU05BUFs4XTsKK2V4dGVybiBVQ0hBUiBFQVBPTF9MTENfU05BUFs4XTsKK2V4dGVybiBVQ0hBUiBFQVBPTFsyXTsKK2V4dGVybiBVQ0hBUiBJUFhbMl07CitleHRlcm4gVUNIQVIgQVBQTEVfVEFMS1syXTsKK2V4dGVybiBVQ0hBUiBSYXRlSWRUb1BsY3BTaWduYWxbMTJdOyAvLyBzZWUgSUVFRTgwMi4xMWEtMTk5OSBwLjE0CitleHRlcm4gVUNIQVIJIE9mZG1SYXRlVG9SeHdpTUNTW107CitleHRlcm4gVUNIQVIgT2ZkbVNpZ25hbFRvUmF0ZUlkWzE2XSA7CitleHRlcm4gVUNIQVIgZGVmYXVsdF9jd21pbls0XTsKK2V4dGVybiBVQ0hBUiBkZWZhdWx0X2N3bWF4WzRdOworZXh0ZXJuIFVDSEFSIGRlZmF1bHRfc3RhX2FpZnNuWzRdOworZXh0ZXJuIFVDSEFSIE1hcFVzZXJQcmlvcml0eVRvQWNjZXNzQ2F0ZWdvcnlbOF07CisKK2V4dGVybiBVU0hPUlQgUmF0ZVVwUEVSW107CitleHRlcm4gVVNIT1JUIFJhdGVEb3duUEVSW107CitleHRlcm4gVUNIQVIgIFBoeTExQk5leHRSYXRlRG93bndhcmRbXTsKK2V4dGVybiBVQ0hBUiAgUGh5MTFCTmV4dFJhdGVVcHdhcmRbXTsKK2V4dGVybiBVQ0hBUiAgUGh5MTFCR05leHRSYXRlRG93bndhcmRbXTsKK2V4dGVybiBVQ0hBUiAgUGh5MTFCR05leHRSYXRlVXB3YXJkW107CitleHRlcm4gVUNIQVIgIFBoeTExQU5leHRSYXRlRG93bndhcmRbXTsKK2V4dGVybiBVQ0hBUiAgUGh5MTFBTmV4dFJhdGVVcHdhcmRbXTsKK2V4dGVybiBDSEFSICAgUnNzaVNhZmVMZXZlbEZvclR4UmF0ZVtdOworZXh0ZXJuIFVDSEFSICBSYXRlSWRUb01icHNbXTsKK2V4dGVybiBVU0hPUlQgUmF0ZUlkVG81MDBLYnBzW107CisKK2V4dGVybiBVQ0hBUiAgQ2lwaGVyU3VpdGVXcGFOb25lVGtpcFtdOworZXh0ZXJuIFVDSEFSICBDaXBoZXJTdWl0ZVdwYU5vbmVUa2lwTGVuOworCitleHRlcm4gVUNIQVIgIENpcGhlclN1aXRlV3BhTm9uZUFlc1tdOworZXh0ZXJuIFVDSEFSICBDaXBoZXJTdWl0ZVdwYU5vbmVBZXNMZW47CisKK2V4dGVybiBVQ0hBUiAgU3NpZEllOworZXh0ZXJuIFVDSEFSICBTdXBSYXRlSWU7CitleHRlcm4gVUNIQVIgIEV4dFJhdGVJZTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorZXh0ZXJuIFVDSEFSICBIdENhcEllOworZXh0ZXJuIFVDSEFSICBBZGRIdEluZm9JZTsKK2V4dGVybiBVQ0hBUiAgTmV3RXh0Q2hhbkllOworI2lmZGVmIERPVDExTl9EUkFGVDMKK2V4dGVybiBVQ0hBUiAgRXh0SHRDYXBJZTsKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK2V4dGVybiBVQ0hBUiAgRXJwSWU7CitleHRlcm4gVUNIQVIgIERzSWU7CitleHRlcm4gVUNIQVIgIFRpbUllOworZXh0ZXJuIFVDSEFSICBXcGFJZTsKK2V4dGVybiBVQ0hBUiAgV3BhMkllOworZXh0ZXJuIFVDSEFSICBJYnNzSWU7CitleHRlcm4gVUNIQVIgIENjeDJJZTsKKworZXh0ZXJuIFVDSEFSICBXUEFfT1VJW107CitleHRlcm4gVUNIQVIgIFJTTl9PVUlbXTsKK2V4dGVybiBVQ0hBUiAgV01FX0lORk9fRUxFTVtdOworZXh0ZXJuIFVDSEFSICBXTUVfUEFSTV9FTEVNW107CitleHRlcm4gVUNIQVIgIENjeDJRb3NJbmZvW107CitleHRlcm4gVUNIQVIgIENjeDJJZUluZm9bXTsKK2V4dGVybiBVQ0hBUiAgUkFMSU5LX09VSVtdOworZXh0ZXJuIFVDSEFSICBQb3dlckNvbnN0cmFpbnRJRVtdOworCisKK2V4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlW107CitleHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExQltdOworZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGUxMUdbXTsKK2V4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFCR1tdOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitleHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExQkdOMVNbXTsKK2V4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFCR04yU1tdOworZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGUxMUJHTjJTRm9yQUJhbmRbXTsKK2V4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFOMVNbXTsKK2V4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFOMlNbXTsKK2V4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZFtdOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitleHRlcm4gVUNIQVIgIFBSRV9OX0hUX09VSVtdOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjZGVmaW5lCU1BWFNFUQkJKDB4RkZGKQorCisjaWZkZWYgUkFMSU5LX0FURQordHlwZWRlZglzdHJ1Y3QgX0FURV9JTkZPIHsKKwlVQ0hBUglNb2RlOworCUNIQVIJVHhQb3dlcjA7CisJQ0hBUglUeFBvd2VyMTsKKwlDSEFSICAgIFR4QW50ZW5uYVNlbDsKKwlDSEFSICAgIFJ4QW50ZW5uYVNlbDsKKwlUWFdJX1NUUlVDICBUeFdJOyAJICAvLyBUWFdJCisJVVNIT1JUCVFJRDsKKwlVQ0hBUglBZGRyMVtNQUNfQUREUl9MRU5dOworCVVDSEFSCUFkZHIyW01BQ19BRERSX0xFTl07CisJVUNIQVIJQWRkcjNbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUglDaGFubmVsOworCVVJTlQzMglUeExlbmd0aDsKKwlVSU5UMzIJVHhDb3VudDsKKwlVSU5UMzIJVHhEb25lQ291bnQ7IC8vIFR4IERNQSBEb25lCisJVUlOVDMyCVJGRnJlcU9mZnNldDsKKwlCT09MRUFOCWJSeEZlcjsKKwlCT09MRUFOCWJRQVR4U3RhcnQ7IC8vIEhhdmUgY29tcGlsZWQgUUEgaW4gYW5kIHVzZSBpdCB0byBBVEUgdHguCisJQk9PTEVBTgliUUFSeFN0YXJ0OwkvLyBIYXZlIGNvbXBpbGVkIFFBIGluIGFuZCB1c2UgaXQgdG8gQVRFIHJ4LgorI2lmZGVmIFJUMjg2MAorCUJPT0xFQU4JYkZXTG9hZGluZzsJLy8gUmVsb2FkIGZpcm13YXJlIHdoZW4gQVRFIGlzIGRvbmUuCisjZW5kaWYgLy8gUlQyODYwIC8vCisJVUlOVDMyCVJ4VG90YWxDbnQ7CisJVUlOVDMyCVJ4Q250UGVyU2VjOworCisJQ0hBUglMYXN0U05SMDsgICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBTTlIKKwlDSEFSICAgIExhc3RTTlIxOyAgICAgICAgICAgICAvLyBsYXN0IHJlY2VpdmVkIFNOUiBmb3IgMm5kICBhbnRlbm5hCisJQ0hBUiAgICBMYXN0UnNzaTA7ICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBSU1NJCisJQ0hBUiAgICBMYXN0UnNzaTE7ICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBSU1NJIGZvciAybmQgIGFudGVubmEKKwlDSEFSICAgIExhc3RSc3NpMjsgICAgICAgICAgICAvLyBsYXN0IHJlY2VpdmVkIFJTU0kgZm9yIDNyZCAgYW50ZW5uYQorCUNIQVIgICAgQXZnUnNzaTA7ICAgICAgICAgICAgIC8vIGxhc3QgOCBmcmFtZXMnIGF2ZXJhZ2UgUlNTSQorCUNIQVIgICAgQXZnUnNzaTE7ICAgICAgICAgICAgIC8vIGxhc3QgOCBmcmFtZXMnIGF2ZXJhZ2UgUlNTSQorCUNIQVIgICAgQXZnUnNzaTI7ICAgICAgICAgICAgIC8vIGxhc3QgOCBmcmFtZXMnIGF2ZXJhZ2UgUlNTSQorCVNIT1JUICAgQXZnUnNzaTBYODsgICAgICAgICAgIC8vIHN1bSBvZiBsYXN0IDggZnJhbWVzJyBSU1NJCisJU0hPUlQgICBBdmdSc3NpMVg4OyAgICAgICAgICAgLy8gc3VtIG9mIGxhc3QgOCBmcmFtZXMnIFJTU0kKKwlTSE9SVCAgIEF2Z1Jzc2kyWDg7ICAgICAgICAgICAvLyBzdW0gb2YgbGFzdCA4IGZyYW1lcycgUlNTSQorCisJVUlOVDMyCU51bU9mQXZnUnNzaVNhbXBsZTsKKworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJLy8gVHggZnJhbWUKKwlVU0hPUlQJCUhMZW47IC8vIEhlYWRlciBMZW5ndGgKKwlVU0hPUlQJCVBMZW47IC8vIFBhdHRlcm4gTGVuZ3RoCisJVUNIQVIgCQlIZWFkZXJbMzJdOyAvLyBIZWFkZXIgYnVmZmVyCisJVUNIQVIJCVBhdHRlcm5bMzJdOyAvLyBQYXR0ZXJuIGJ1ZmZlcgorCVVTSE9SVAkJRExlbjsgLy8gRGF0YSBMZW5ndGgKKwlVU0hPUlQJCXNlcTsKKwlVSU5UMzIJCUNJRDsKKwlUSFJFQURfUElEIAkJQXRlUGlkOworCS8vIGNvdW50ZXJzCisJVUlOVDMyCQlVMk07CisJVUlOVDMyCQlPdGhlckRhdGE7CisJVUlOVDMyCQlCZWFjb247CisJVUlOVDMyCQlPdGhlckNvdW50OworCVVJTlQzMgkJVHhBYzA7CisJVUlOVDMyCQlUeEFjMTsKKwlVSU5UMzIJCVR4QWMyOworCVVJTlQzMgkJVHhBYzM7CisJVUlOVDMyCQlUeEhDQ0E7CisJVUlOVDMyCQlUeE1nbXQ7CisJVUlOVDMyCQlSU1NJMDsKKwlVSU5UMzIJCVJTU0kxOworCVVJTlQzMgkJUlNTSTI7CisJVUlOVDMyCQlTTlIwOworCVVJTlQzMgkJU05SMTsKKwkvLyBjb250cm9sCisJLy9VSU5UMzIJCVJlcGVhdDsgLy8gVHggQ3B1IGNvdW50CisJVUNIQVIJCVR4U3RhdHVzOyAvLyB0YXNrIFR4IHN0YXR1cyAvLyAwIC0tPiB0YXNrIGlzIGlkbGUsIDEgLS0+IHRhc2sgaXMgcnVubmluZworI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCit9CUFURV9JTkZPLCAqUEFURV9JTkZPOworCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKK3N0cnVjdCBhdGVfcmFjZmdoZHIgeworIAlVSU5UMzIJCW1hZ2ljX25vOworCVVTSE9SVAkJY29tbWFuZF90eXBlOworCVVTSE9SVAkJY29tbWFuZF9pZDsKKwlVU0hPUlQJCWxlbmd0aDsKKwlVU0hPUlQJCXNlcXVlbmNlOworCVVTSE9SVAkJc3RhdHVzOworCVVDSEFSCQlkYXRhWzIwNDZdOworfSAgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK3N0cnVjdCByZW9yZGVyaW5nX21wZHUKK3sKKwlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1CSpuZXh0OworCVBORElTX1BBQ0tFVAkJCXBQYWNrZXQ7CQkvKiBjb3ZlcnRlZCB0byA4MDIuMyBmcmFtZSAqLworCWludAkJCQkJCVNlcXVlbmNlOwkJLyogc2VxdWVuY2UgbnVtYmVyIG9mIE1QRFUgKi8KKwlCT09MRUFOCQkJCQliQU1TRFU7Cit9OworCitzdHJ1Y3QgcmVvcmRlcmluZ19saXN0Cit7CisJc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbmV4dDsKKwlpbnQgCXFsZW47Cit9OworCitzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1X3Bvb2wKK3sKKwlQVk9JRAkJCQkJbWVtOworCU5ESVNfU1BJTl9MT0NLCQkJbG9jazsKKwlzdHJ1Y3QgcmVvcmRlcmluZ19saXN0IAlmcmVlbGlzdDsKK307CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK3R5cGVkZWYgc3RydWN0IAlfUlNTSV9TQU1QTEUgeworCUNIQVIJCQlMYXN0UnNzaTA7ICAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgUlNTSQorCUNIQVIJCQlMYXN0UnNzaTE7ICAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgUlNTSQorCUNIQVIJCQlMYXN0UnNzaTI7ICAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgUlNTSQorCUNIQVIJCQlBdmdSc3NpMDsKKwlDSEFSCQkJQXZnUnNzaTE7CisJQ0hBUgkJCUF2Z1Jzc2kyOworCVNIT1JUCQkJQXZnUnNzaTBYODsKKwlTSE9SVAkJCUF2Z1Jzc2kxWDg7CisJU0hPUlQJCQlBdmdSc3NpMlg4OworfSBSU1NJX1NBTVBMRTsKKworLy8KKy8vICBRdWV1ZSBzdHJ1Y3R1cmUgYW5kIG1hY3JvcworLy8KK3R5cGVkZWYgc3RydWN0ICBfUVVFVUVfRU5UUlkgICAgeworCXN0cnVjdCBfUVVFVUVfRU5UUlkgICAgICpOZXh0OworfSAgIFFVRVVFX0VOVFJZLCAqUFFVRVVFX0VOVFJZOworCisvLyBRdWV1ZSBzdHJ1Y3R1cmUKK3R5cGVkZWYgc3RydWN0ICBfUVVFVUVfSEVBREVSICAgeworCVBRVUVVRV9FTlRSWSAgICBIZWFkOworCVBRVUVVRV9FTlRSWSAgICBUYWlsOworCVVMT05HICAgICAgICAgICBOdW1iZXI7Cit9ICAgUVVFVUVfSEVBREVSLCAqUFFVRVVFX0hFQURFUjsKKworI2RlZmluZSBJbml0aWFsaXplUXVldWVIZWFkZXIoUXVldWVIZWFkZXIpICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoUXVldWVIZWFkZXIpLT5IZWFkID0gKFF1ZXVlSGVhZGVyKS0+VGFpbCA9IE5VTEw7ICAgXAorCShRdWV1ZUhlYWRlciktPk51bWJlciA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgUmVtb3ZlSGVhZFF1ZXVlKFF1ZXVlSGVhZGVyKSAgICAgICAgICAgICAgICBcCisoUXVldWVIZWFkZXIpLT5IZWFkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlQUVVFVUVfRU5UUlkgcE5leHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJaWYgKChRdWV1ZUhlYWRlciktPkhlYWQgIT0gTlVMTCkJCQkJXAorCXsJCQkJCQkJCQkJCQlcCisJCXBOZXh0ID0gKFF1ZXVlSGVhZGVyKS0+SGVhZC0+TmV4dDsgICAgICAgICAgXAorCQkoUXVldWVIZWFkZXIpLT5IZWFkID0gcE5leHQ7ICAgICAgICAgICAgICAgIFwKKwkJaWYgKHBOZXh0ID09IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkoUXVldWVIZWFkZXIpLT5UYWlsID0gTlVMTDsgICAgICAgICAgICAgXAorCQkoUXVldWVIZWFkZXIpLT5OdW1iZXItLTsgICAgICAgICAgICAgICAgICAgIFwKKwl9CQkJCQkJCQkJCQkJXAorfQorCisjZGVmaW5lIEluc2VydEhlYWRRdWV1ZShRdWV1ZUhlYWRlciwgUXVldWVFbnRyeSkgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCSgoUFFVRVVFX0VOVFJZKVF1ZXVlRW50cnkpLT5OZXh0ID0gKFF1ZXVlSGVhZGVyKS0+SGVhZDsgXAorCQkoUXVldWVIZWFkZXIpLT5IZWFkID0gKFBRVUVVRV9FTlRSWSkoUXVldWVFbnRyeSk7ICAgICAgIFwKKwkJaWYgKChRdWV1ZUhlYWRlciktPlRhaWwgPT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkoUXVldWVIZWFkZXIpLT5UYWlsID0gKFBRVUVVRV9FTlRSWSkoUXVldWVFbnRyeSk7ICAgXAorCQkoUXVldWVIZWFkZXIpLT5OdW1iZXIrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBJbnNlcnRUYWlsUXVldWUoUXVldWVIZWFkZXIsIFF1ZXVlRW50cnkpICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKChQUVVFVUVfRU5UUlkpUXVldWVFbnRyeSktPk5leHQgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgXAorCWlmICgoUXVldWVIZWFkZXIpLT5UYWlsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJKFF1ZXVlSGVhZGVyKS0+VGFpbC0+TmV4dCA9IChQUVVFVUVfRU5UUlkpKFF1ZXVlRW50cnkpOyBcCisJZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkoUXVldWVIZWFkZXIpLT5IZWFkID0gKFBRVUVVRV9FTlRSWSkoUXVldWVFbnRyeSk7ICAgICAgIFwKKwkoUXVldWVIZWFkZXIpLT5UYWlsID0gKFBRVUVVRV9FTlRSWSkoUXVldWVFbnRyeSk7ICAgICAgICAgICBcCisJKFF1ZXVlSGVhZGVyKS0+TnVtYmVyKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLworLy8gIE1hY3JvcyBmb3IgZmxhZyBhbmQgcmVmIGNvdW50IG9wZXJhdGlvbnMKKy8vCisjZGVmaW5lIFJUTVBfU0VUX0ZMQUcoX00sIF9GKSAgICAgICAoKF9NKS0+RmxhZ3MgfD0gKF9GKSkKKyNkZWZpbmUgUlRNUF9DTEVBUl9GTEFHKF9NLCBfRikgICAgICgoX00pLT5GbGFncyAmPSB+KF9GKSkKKyNkZWZpbmUgUlRNUF9DTEVBUl9GTEFHUyhfTSkgICAgICAgICgoX00pLT5GbGFncyA9IDApCisjZGVmaW5lIFJUTVBfVEVTVF9GTEFHKF9NLCBfRikgICAgICAoKChfTSktPkZsYWdzICYgKF9GKSkgIT0gMCkKKyNkZWZpbmUgUlRNUF9URVNUX0ZMQUdTKF9NLCBfRikgICAgICgoKF9NKS0+RmxhZ3MgJiAoX0YpKSA9PSAoX0YpKQorCisjZGVmaW5lIE9QU1RBVFVTX1NFVF9GTEFHKF9wQWQsIF9GKSAgICAgKChfcEFkKS0+Q29tbW9uQ2ZnLk9wU3RhdHVzRmxhZ3MgfD0gKF9GKSkKKyNkZWZpbmUgT1BTVEFUVVNfQ0xFQVJfRkxBRyhfcEFkLCBfRikgICAoKF9wQWQpLT5Db21tb25DZmcuT3BTdGF0dXNGbGFncyAmPSB+KF9GKSkKKyNkZWZpbmUgT1BTVEFUVVNfVEVTVF9GTEFHKF9wQWQsIF9GKSAgICAoKChfcEFkKS0+Q29tbW9uQ2ZnLk9wU3RhdHVzRmxhZ3MgJiAoX0YpKSAhPSAwKQorCisjZGVmaW5lIENMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoX3BFbnRyeSxfRikgICAgICAoKF9wRW50cnkpLT5DbGllbnRTdGF0dXNGbGFncyB8PSAoX0YpKQorI2RlZmluZSBDTElFTlRfU1RBVFVTX0NMRUFSX0ZMQUcoX3BFbnRyeSxfRikgICAgKChfcEVudHJ5KS0+Q2xpZW50U3RhdHVzRmxhZ3MgJj0gfihfRikpCisjZGVmaW5lIENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKF9wRW50cnksX0YpICAgICAoKChfcEVudHJ5KS0+Q2xpZW50U3RhdHVzRmxhZ3MgJiAoX0YpKSAhPSAwKQorCisjZGVmaW5lIFJYX0ZJTFRFUl9TRVRfRkxBRyhfcEFkLCBfRikgICAgKChfcEFkKS0+Q29tbW9uQ2ZnLlBhY2tldEZpbHRlciB8PSAoX0YpKQorI2RlZmluZSBSWF9GSUxURVJfQ0xFQVJfRkxBRyhfcEFkLCBfRikgICgoX3BBZCktPkNvbW1vbkNmZy5QYWNrZXRGaWx0ZXIgJj0gfihfRikpCisjZGVmaW5lIFJYX0ZJTFRFUl9URVNUX0ZMQUcoX3BBZCwgX0YpICAgKCgoX3BBZCktPkNvbW1vbkNmZy5QYWNrZXRGaWx0ZXIgJiAoX0YpKSAhPSAwKQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZGVmaW5lIFNUQV9OT19TRUNVUklUWV9PTihfcCkgICAgICAgICAgKF9wLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQpCisjZGVmaW5lIFNUQV9XRVBfT04oX3ApICAgICAgICAgICAgICAgICAgKF9wLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpCisjZGVmaW5lIFNUQV9US0lQX09OKF9wKSAgICAgICAgICAgICAgICAgKF9wLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisjZGVmaW5lIFNUQV9BRVNfT04oX3ApICAgICAgICAgICAgICAgICAgKF9wLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisKKyNkZWZpbmUgU1RBX1RHTl9XSUZJX09OKF9wKSAgICAgICAgICAgICAoX3AtPlN0YUNmZy5iVEduV2lmaVRlc3QgPT0gVFJVRSkKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2RlZmluZSBDS0lQX0tQX09OKF9wKQkJCQkoKCgoX3ApLT5TdGFDZmcuQ2tpcEZsYWcpICYgMHgxMCkgJiYgKChfcCktPlN0YUNmZy5iQ2tpcENtaWNPbiA9PSBUUlVFKSkKKyNkZWZpbmUgQ0tJUF9DTUlDX09OKF9wKQkJCSgoKChfcCktPlN0YUNmZy5Da2lwRmxhZykgJiAweDA4KSAmJiAoKF9wKS0+U3RhQ2ZnLmJDa2lwQ21pY09uID09IFRSVUUpKQorCisKKyNkZWZpbmUgSU5DX1JJTkdfSU5ERVgoX2lkeCwgX1JpbmdTaXplKSAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChfaWR4KSA9IChfaWR4KzEpICUgKF9SaW5nU2l6ZSk7ICAgICAgIFwKK30KKworI2RlZmluZSBJU19SVDMwNzAoX3BBZCkJCQkJKCgoX3BBZCktPk1BQ1ZlcnNpb24gJiAweGZmZmYwMDAwKSA9PSAweDMwNzAwMDAwKQorCisjZGVmaW5lIFJJTkdfUEFDS0VUX0lOSVQoX1R4UmluZywgX2lkeCkgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfVHhSaW5nLT5DZWxsW19pZHhdLnBOZGlzUGFja2V0ID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX1R4UmluZy0+Q2VsbFtfaWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBUWERUX0lOSVQoX1R4RCkgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlOZGlzWmVyb01lbW9yeShfVHhELCBUWERfU0laRSk7CVwKKwlfVHhELT5ETUFET05FID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vU2V0IGxhc3QgZGF0YSBzZWdtZW50CisjZGVmaW5lIFJJTkdfU0VUX0xBU1REUyhfVHhELCBfSXNTRDApICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKF9Jc1NEMCkge19UeEQtPkxhc3RTZWMwID0gMTt9ICAgICBcCisgICAgZWxzZSB7X1R4RC0+TGFzdFNlYzEgPSAxO30gICAgIFwKK30KKworLy8gSW5jcmVhc2UgVHhUc2MgdmFsdWUgZm9yIG5leHQgdHJhbnNtaXNzaW9uCisvLyBUT0RPOgorLy8gV2hlbiBpPT02LCBtZWFucyBUU0MgaGFzIGRvbmUgb25lIGZ1bGwgY3ljbGUsIGRvIHJlLWtleWluZyBzdHVmZiBmb2xsb3cgc3BlY3MKKy8vIFNob3VsZCBzZW5kIGEgc3BlY2lhbCBldmVudCBtaWNyb3NvZnQgZGVmaW5lZCB0byByZXF1ZXN0IHJlLWtleQorI2RlZmluZSBJTkNfVFhfVFNDKF90c2MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaT0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdoaWxlICgrK190c2NbaV0gPT0gMHgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaSsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoaSA9PSA2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisvLyBTdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuTUNTU2V0IGlzIGNvcGllZCBmcm9tIEFQIGJlYWNvbi4gIERvbid0IG5lZWQgdG8gdXBkYXRlIGhlcmUuCisjZGVmaW5lIENPUFlfSFRTRVRUSU5HU19GUk9NX01MTUVfQVVYX1RPX0FDVElWRV9DRkcoX3BBZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5DaGFubmVsV2lkdGggPSBfcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoOyAgICAgIFwKKwlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuTWltb1BzID0gX3BBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QczsgICAgICBcCisJX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LkdGID0gX3BBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkdGOyAgICAgIFwKKwlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuU2hvcnRHSWZvcjIwID0gX3BBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMDsgICAgICBcCisJX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LlNob3J0R0lmb3I0MCA9IF9wQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yNDA7ICAgICAgXAorCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5UeFNUQkMgPSBfcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uVHhTVEJDOyAgICAgIFwKKwlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuUnhTVEJDID0gX3BBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQzsgICAgICBcCisJX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LkV4dENoYW5PZmZzZXQgPSBfcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldDsgICAgICBcCisJX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LlJlY29tV2lkdGggPSBfcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8uUmVjb21XaWR0aDsgICAgICBcCisJX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5Lk9wZXJhaW9uTW9kZSA9IF9wQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlOyAgICAgIFwKKwlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuTm9uR2ZQcmVzZW50ID0gX3BBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQ7ICAgICAgXAorCU5kaXNNb3ZlTWVtb3J5KChfcEFkKS0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRDYXBhYmlsaXR5Lk1DU1NldCwgKF9wQWQpLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXQsIHNpemVvZihVQ0hBUikgKiAxNik7XAorfQorCisjZGVmaW5lIENPUFlfQVBfSFRTRVRUSU5HU19GUk9NX0JFQUNPTihfcEFkLCBfcEh0Q2FwYWJpbGl0eSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCV9wQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFNc2R1U2l6ZSA9IChVQ0hBUikoX3BIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5BTXNkdVNpemUpOwlcCisJX3BBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTW1wc01vZGU9IChVQ0hBUikoX3BIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5NaW1vUHMpOwlcCisJX3BBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTWF4UkFtcGR1RmFjdG9yID0gKFVDSEFSKShfcEh0Q2FwYWJpbGl0eS0+SHRDYXBQYXJtLk1heFJBbXBkdUZhY3Rvcik7CVwKK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworLy8KKy8vIE1BQ1JPIGZvciAzMi1iaXQgUENJIHJlZ2lzdGVyIHJlYWQgLyB3cml0ZQorLy8KKy8vIFVzYWdlIDogUlRNUF9JT19SRUFEMzIoCisvLyAgICAgICAgICAgICAgUFJUTVBfQURBUFRFUiBwQWQsCisvLyAgICAgICAgICAgICAgVUxPTkcgUmVnaXN0ZXJfT2Zmc2V0LAorLy8gICAgICAgICAgICAgIFBVTE9ORyAgcFZhbHVlKQorLy8KKy8vICAgICAgICAgUlRNUF9JT19XUklURTMyKAorLy8gICAgICAgICAgICAgIFBSVE1QX0FEQVBURVIgcEFkLAorLy8gICAgICAgICAgICAgIFVMT05HIFJlZ2lzdGVyX09mZnNldCwKKy8vICAgICAgICAgICAgICBVTE9ORyBWYWx1ZSkKKy8vCisKKy8vCisvLyBCQlAgJiBSRiBhcmUgdXNpbmcgaW5kaXJlY3QgYWNjZXNzLiBCZWZvcmUgd3JpdGUgYW55IHZhbHVlIGludG8gaXQuCisvLyBXZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGVyZSBpcyBubyBvdXRzdGFuZGluZyBjb21tYW5kIHBlbmRpbmcgdmlhIGNoZWNraW5nIGJ1c3kgYml0LgorLy8KKyNkZWZpbmUgTUFYX0JVU1lfQ09VTlQgIDEwMCAgICAgICAgIC8vIE51bWJlciBvZiByZXRyeSBiZWZvcmUgZmFpbGluZyBhY2Nlc3MgQkJQICYgUkYgaW5kaXJlY3QgcmVnaXN0ZXIKKy8vCisjaWZkZWYgUlQyODYwCisjZGVmaW5lIFJUTVBfUkZfSU9fV1JJVEUzMihfQSwgX1YpICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQSFlfQ1NSNF9TVFJVQyAgVmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVUxPTkcgICAgICAgICAgIEJ1c3lDbnQgPSAwOyAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoX0EpLT5iUENJY2xrT2ZmKSAJICAgICAgICAgICAgICAgIFwKKyAgICB7CQkJCQkJCQkJCQkJXAorICAgICAgICByZXR1cm47CQkJCQkJCQkJCVwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBSVE1QX0lPX1JFQUQzMihfQSwgUkZfQ1NSX0NGRzAsICZWYWx1ZS53b3JkKTsgIFwKKyAgICAgICAgaWYgKFZhbHVlLmZpZWxkLkJ1c3kgPT0gSURMRSkgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCdXN5Q250Kys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgd2hpbGUgKEJ1c3lDbnQgPCBNQVhfQlVTWV9DT1VOVCk7ICAgICAgICAgICBcCisgICAgaWYgKEJ1c3lDbnQgPCBNQVhfQlVTWV9DT1VOVCkgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUlRNUF9JT19XUklURTMyKF9BLCBSRl9DU1JfQ0ZHMCwgX1YpOyAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIEJCUF9JT19SRUFEOF9CWV9SRUdfSUQoX0EsIF9JLCBfcFYpICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCQlBfQ1NSX0NGR19TVFJVQyAgQmJwQ3NyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCAgICAgICAgICAgICBpLCBrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpPTA7IGk8TUFYX0JVU1lfQ09VTlQ7IGkrKykgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBSVE1QX0lPX1JFQUQzMihfQSwgQkJQX0NTUl9DRkcsICZCYnBDc3Iud29yZCk7ICAgICBcCisgICAgICAgIGlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLndvcmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuZlJlYWQgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci5maWVsZC5CQlBfUldfTU9ERSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLmZpZWxkLkJ1c3kgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuUmVnTnVtID0gX0k7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFJUTVBfSU9fV1JJVEUzMihfQSwgQkJQX0NTUl9DRkcsIEJicENzci53b3JkKTsgICAgIFwKKyAgICAgICAgZm9yIChrPTA7IGs8TUFYX0JVU1lfQ09VTlQ7IGsrKykgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBSVE1QX0lPX1JFQUQzMihfQSwgQkJQX0NTUl9DRkcsICZCYnBDc3Iud29yZCk7IFwKKyAgICAgICAgICAgIGlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBJRExFKSAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChCYnBDc3IuZmllbGQuQnVzeSA9PSBJRExFKSAmJiAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKEJicENzci5maWVsZC5SZWdOdW0gPT0gX0kpKSAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICooX3BWKSA9IChVQ0hBUilCYnBDc3IuZmllbGQuVmFsdWU7ICAgICAgICAgXAorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgREJHUFJJTlRfRVJSKCgiREZTIEJCUCByZWFkIFIlZCBmYWlsXG4iLCBfSSkpOyAgICAgIFwKKyAgICAgICAgKihfcFYpID0gKF9BKS0+QmJwV3JpdGVMYXRjaFtfSV07ICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vI2RlZmluZSBSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQoX0EsIF9JLCBfcFYpICAgIHt9CisvLyBSZWFkIEJCUCByZWdpc3RlciBieSByZWdpc3RlcidzIElELiBHZW5lcmF0ZSBQRVIgdG8gdGVzdCBCQQorI2RlZmluZSBSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQoX0EsIF9JLCBfcFYpICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCQlBfQ1NSX0NGR19TVFJVQyAgQmJwQ3NyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCAgICAgICAgICAgICBpLCBrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChfQSktPmJQQ0ljbGtPZmYgPT0gRkFMU0UpICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpPTA7IGk8TUFYX0JVU1lfQ09VTlQ7IGkrKykgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlSVE1QX0lPX1JFQUQzMihfQSwgSDJNX0JCUF9BR0VOVCwgJkJicENzci53b3JkKTsJCQkJXAorICAgICAgICBpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci53b3JkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLmZpZWxkLmZSZWFkID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuQkJQX1JXX01PREUgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci5maWVsZC5CdXN5ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLmZpZWxkLlJlZ051bSA9IF9JOyAgICAgICAgICAgICAgICAgICAgICAgXAorCQlSVE1QX0lPX1dSSVRFMzIoX0EsIEgyTV9CQlBfQUdFTlQsIEJicENzci53b3JkKTsJCQkJXAorCQlBc2ljU2VuZENvbW1hbmRUb01jdShfQSwgMHg4MCwgMHhmZiwgMHgwLCAweDApOwkJCQkJXAorCQlSVE1QdXNlY0RlbGF5KDEwMDApOwkJCQkJCQlcCisgICAgICAgIGZvciAoaz0wOyBrPE1BWF9CVVNZX0NPVU5UOyBrKyspICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJUlRNUF9JT19SRUFEMzIoX0EsIEgyTV9CQlBfQUdFTlQsICZCYnBDc3Iud29yZCk7CQkJXAorICAgICAgICAgICAgaWYgKEJicENzci5maWVsZC5CdXN5ID09IElETEUpICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKEJicENzci5maWVsZC5CdXN5ID09IElETEUpICYmICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoQmJwQ3NyLmZpZWxkLlJlZ051bSA9PSBfSSkpICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKihfcFYpID0gKFVDSEFSKUJicENzci5maWVsZC5WYWx1ZTsgICAgICAgICBcCisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlEQkdQUklOVF9FUlIoKCJCQlAgcmVhZCBSJWQ9MHgleCBmYWlsXG4iLCBfSSwgQmJwQ3NyLndvcmQpKTsJXAorICAgICAgICAqKF9wVikgPSAoX0EpLT5CYnBXcml0ZUxhdGNoW19JXTsgICAgICAgICAgICAgICBcCisJCVJUTVBfSU9fUkVBRDMyKF9BLCBIMk1fQkJQX0FHRU5ULCAmQmJwQ3NyLndvcmQpOwkJCQlcCisJCUJicENzci5maWVsZC5CdXN5ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJUlRNUF9JT19XUklURTMyKF9BLCBIMk1fQkJQX0FHRU5ULCBCYnBDc3Iud29yZCk7CQkJCVwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIEJCUF9JT19XUklURThfQllfUkVHX0lEKF9BLCBfSSwgX1YpICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCQlBfQ1NSX0NGR19TVFJVQyAgQmJwQ3NyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCAgICAgICAgICAgICBCdXN5Q250OyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChCdXN5Q250PTA7IEJ1c3lDbnQ8TUFYX0JVU1lfQ09VTlQ7IEJ1c3lDbnQrKykgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBSVE1QX0lPX1JFQUQzMihfQSwgQkJQX0NTUl9DRkcsICZCYnBDc3Iud29yZCk7ICAgICBcCisgICAgICAgIGlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3Iud29yZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci5maWVsZC5mUmVhZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLmZpZWxkLkJCUF9SV19NT0RFID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuQnVzeSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci5maWVsZC5WYWx1ZSA9IF9WOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLmZpZWxkLlJlZ051bSA9IF9JOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBSVE1QX0lPX1dSSVRFMzIoX0EsIEJCUF9DU1JfQ0ZHLCBCYnBDc3Iud29yZCk7ICAgICBcCisgICAgICAgIChfQSktPkJicFdyaXRlTGF0Y2hbX0ldID0gX1Y7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKEJ1c3lDbnQgPT0gTUFYX0JVU1lfQ09VTlQpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBEQkdQUklOVF9FUlIoKCJCQlAgd3JpdGUgUiVkIGZhaWxcbiIsIF9JKSk7ICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8gV3JpdGUgQkJQIHJlZ2lzdGVyIGJ5IHJlZ2lzdGVyJ3MgSUQgJiB2YWx1ZQorI2RlZmluZSBSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKF9BLCBfSSwgX1YpICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCQlBfQ1NSX0NGR19TVFJVQyAgQmJwQ3NyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCAgICAgICAgICAgICBCdXN5Q250OyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChfQSktPmJQQ0ljbGtPZmYgPT0gRkFMU0UpICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChCdXN5Q250PTA7IEJ1c3lDbnQ8TUFYX0JVU1lfQ09VTlQ7IEJ1c3lDbnQrKykgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlSVE1QX0lPX1JFQUQzMihfQSwgSDJNX0JCUF9BR0VOVCwgJkJicENzci53b3JkKTsJCQkJXAorICAgICAgICBpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLndvcmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuZlJlYWQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci5maWVsZC5CQlBfUldfTU9ERSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQmJwQ3NyLmZpZWxkLkJ1c3kgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCYnBDc3IuZmllbGQuVmFsdWUgPSBfVjsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJicENzci5maWVsZC5SZWdOdW0gPSBfSTsgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJUlRNUF9JT19XUklURTMyKF9BLCBIMk1fQkJQX0FHRU5ULCBCYnBDc3Iud29yZCk7CQkJCVwKKwkJQXNpY1NlbmRDb21tYW5kVG9NY3UoX0EsIDB4ODAsIDB4ZmYsIDB4MCwgMHgwKTsJCQkJCVwKKyAgICAgICAgICAgIGlmIChfQS0+T3BNb2RlID09IE9QTU9ERV9BUCkgICAgICAgICAgICAgICAgICAgIFwKKwkJUlRNUHVzZWNEZWxheSgxMDAwKTsJCQkJCQkJXAorICAgICAgICAoX0EpLT5CYnBXcml0ZUxhdGNoW19JXSA9IF9WOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChCdXN5Q250ID09IE1BWF9CVVNZX0NPVU5UKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJREJHUFJJTlRfRVJSKCgiQkJQIHdyaXRlIFIlZD0weCV4IGZhaWxcbiIsIF9JLCBCYnBDc3Iud29yZCkpOwlcCisJCVJUTVBfSU9fUkVBRDMyKF9BLCBIMk1fQkJQX0FHRU5ULCAmQmJwQ3NyLndvcmQpOwkJCQlcCisJCUJicENzci5maWVsZC5CdXN5ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJUlRNUF9JT19XUklURTMyKF9BLCBIMk1fQkJQX0FHRU5ULCBCYnBDc3Iud29yZCk7CQkJCVwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKworI2RlZmluZSAgICAgTUFQX0NIQU5ORUxfSURfVE9fS0haKGNoLCBraHopICB7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN3aXRjaCAoY2gpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDE6ICAgICBraHogPSAyNDEyMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDI6ICAgICBraHogPSAyNDE3MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDM6ICAgICBraHogPSAyNDIyMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6ICAgICBraHogPSAyNDI3MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU6ICAgICBraHogPSAyNDMyMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDY6ICAgICBraHogPSAyNDM3MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDc6ICAgICBraHogPSAyNDQyMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDg6ICAgICBraHogPSAyNDQ3MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDk6ICAgICBraHogPSAyNDUyMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOiAgICBraHogPSAyNDU3MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDExOiAgICBraHogPSAyNDYyMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOiAgICBraHogPSAyNDY3MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOiAgICBraHogPSAyNDcyMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OiAgICBraHogPSAyNDg0MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDM2OiAgLyogVU5JSSAqLyAga2h6ID0gNTE4MDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDogIC8qIFVOSUkgKi8gIGtoeiA9IDUyMDAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDQ6ICAvKiBVTklJICovICBraHogPSA1MjIwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDQ4OiAgLyogVU5JSSAqLyAga2h6ID0gNTI0MDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MjogIC8qIFVOSUkgKi8gIGtoeiA9IDUyNjAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTY6ICAvKiBVTklJICovICBraHogPSA1MjgwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDYwOiAgLyogVU5JSSAqLyAga2h6ID0gNTMwMDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA2NDogIC8qIFVOSUkgKi8gIGtoeiA9IDUzMjAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ5OiAvKiBVTklJICovICBraHogPSA1NzQ1MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDE1MzogLyogVU5JSSAqLyAga2h6ID0gNTc2NTAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTc6IC8qIFVOSUkgKi8gIGtoeiA9IDU3ODUwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTYxOiAvKiBVTklJICovICBraHogPSA1ODA1MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDE2NTogLyogVU5JSSAqLyAga2h6ID0gNTgyNTAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDA6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTUwMDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDQ6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTUyMDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDg6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTU0MDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTI6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTU2MDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTY6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTU4MDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjA6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTYwMDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjQ6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTYyMDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjg6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTY0MDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzI6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTY2MDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzY6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTY4MDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDA6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTcwMDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzNDogIC8qIEphcGFuIE1NQUMgKi8gICBraHogPSA1MTcwMDAwOyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzODogIC8qIEphcGFuIE1NQUMgKi8gICBraHogPSA1MTkwMDAwOyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0MjogIC8qIEphcGFuIE1NQUMgKi8gICBraHogPSA1MjEwMDAwOyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0NjogIC8qIEphcGFuIE1NQUMgKi8gICBraHogPSA1MjMwMDAwOyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxODQ6IC8qIEphcGFuICovICAga2h6ID0gNDkyMDAwMDsgICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg4OiAvKiBKYXBhbiAqLyAgIGtoeiA9IDQ5NDAwMDA7ICAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDE5MjogLyogSmFwYW4gKi8gICBraHogPSA0OTYwMDAwOyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOTY6IC8qIEphcGFuICovICAga2h6ID0gNDk4MDAwMDsgICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjA4OiAvKiBKYXBhbiwgbWVhbnMgSjA4ICovICAga2h6ID0gNTA0MDAwMDsgICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjEyOiAvKiBKYXBhbiwgbWVhbnMgSjEyICovICAga2h6ID0gNTA2MDAwMDsgICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjE2OiAvKiBKYXBhbiwgbWVhbnMgSjE2ICovICAga2h6ID0gNTA4MDAwMDsgICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICAgIGtoeiA9IDI0MTIwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9CisKKyNkZWZpbmUgICAgIE1BUF9LSFpfVE9fQ0hBTk5FTF9JRChraHosIGNoKSAgeyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGtoeikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDEyMDAwOiAgICBjaCA9IDE7ICAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDE3MDAwOiAgICBjaCA9IDI7ICAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDIyMDAwOiAgICBjaCA9IDM7ICAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDI3MDAwOiAgICBjaCA9IDQ7ICAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDMyMDAwOiAgICBjaCA9IDU7ICAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDM3MDAwOiAgICBjaCA9IDY7ICAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDQyMDAwOiAgICBjaCA9IDc7ICAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDQ3MDAwOiAgICBjaCA9IDg7ICAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDUyMDAwOiAgICBjaCA9IDk7ICAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDU3MDAwOiAgICBjaCA9IDEwOyAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDYyMDAwOiAgICBjaCA9IDExOyAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDY3MDAwOiAgICBjaCA9IDEyOyAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDcyMDAwOiAgICBjaCA9IDEzOyAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDg0MDAwOiAgICBjaCA9IDE0OyAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MTgwMDAwOiAgICBjaCA9IDM2OyAgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTIwMDAwMDogICAgY2ggPSA0MDsgIC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDUyMjAwMDA6ICAgIGNoID0gNDQ7ICAvKiBVTklJICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MjQwMDAwOiAgICBjaCA9IDQ4OyAgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTI2MDAwMDogICAgY2ggPSA1MjsgIC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDUyODAwMDA6ICAgIGNoID0gNTY7ICAvKiBVTklJICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MzAwMDAwOiAgICBjaCA9IDYwOyAgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTMyMDAwMDogICAgY2ggPSA2NDsgIC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU3NDUwMDA6ICAgIGNoID0gMTQ5OyAvKiBVTklJICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1NzY1MDAwOiAgICBjaCA9IDE1MzsgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTc4NTAwMDogICAgY2ggPSAxNTc7IC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU4MDUwMDA6ICAgIGNoID0gMTYxOyAvKiBVTklJICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1ODI1MDAwOiAgICBjaCA9IDE2NTsgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTUwMDAwMDogICAgY2ggPSAxMDA7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTUyMDAwMDogICAgY2ggPSAxMDQ7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTU0MDAwMDogICAgY2ggPSAxMDg7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTU2MDAwMDogICAgY2ggPSAxMTI7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTU4MDAwMDogICAgY2ggPSAxMTY7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTYwMDAwMDogICAgY2ggPSAxMjA7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTYyMDAwMDogICAgY2ggPSAxMjQ7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTY0MDAwMDogICAgY2ggPSAxMjg7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTY2MDAwMDogICAgY2ggPSAxMzI7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTY4MDAwMDogICAgY2ggPSAxMzY7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTcwMDAwMDogICAgY2ggPSAxNDA7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTE3MDAwMDogICAgY2ggPSAzNDsgIC8qIEphcGFuIE1NQUMgKi8gICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTE5MDAwMDogICAgY2ggPSAzODsgIC8qIEphcGFuIE1NQUMgKi8gICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTIxMDAwMDogICAgY2ggPSA0MjsgIC8qIEphcGFuIE1NQUMgKi8gICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTIzMDAwMDogICAgY2ggPSA0NjsgIC8qIEphcGFuIE1NQUMgKi8gICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDkyMDAwMDogICAgY2ggPSAxODQ7IC8qIEphcGFuICovICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDk0MDAwMDogICAgY2ggPSAxODg7IC8qIEphcGFuICovICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDk2MDAwMDogICAgY2ggPSAxOTI7IC8qIEphcGFuICovICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDk4MDAwMDogICAgY2ggPSAxOTY7IC8qIEphcGFuICovICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTA0MDAwMDogICAgY2ggPSAyMDg7IC8qIEphcGFuLCBtZWFucyBKMDggKi8gIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MDYwMDAwOiAgICBjaCA9IDIxMjsgLyogSmFwYW4sIG1lYW5zIEoxMiAqLyAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDUwODAwMDA6ICAgIGNoID0gMjE2OyAvKiBKYXBhbiwgbWVhbnMgSjE2ICovICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgY2ggPSAxOyAgICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9CisKKy8vCisvLyBDb21tb24gZnJhZ21lbnQgbGlzdCBzdHJ1Y3R1cmUgLSAgSWRlbnRpY2FsIHRvIHRoZSBzY2F0dGVyIGdhdGhlciBmcmFnIGxpc3Qgc3RydWN0dXJlCisvLworI2RlZmluZSBOSUNfTUFYX1BIWVNfQlVGX0NPVU5UICAgICAgICAgICAgICA4CisKK3R5cGVkZWYgc3RydWN0IF9SVE1QX1NDQVRURVJfR0FUSEVSX0VMRU1FTlQgeworICAgIFBWT0lECQlBZGRyZXNzOworICAgIFVMT05HCQlMZW5ndGg7CisgICAgUFVMT05HCQlSZXNlcnZlZDsKK30gUlRNUF9TQ0FUVEVSX0dBVEhFUl9FTEVNRU5ULCAqUFJUTVBfU0NBVFRFUl9HQVRIRVJfRUxFTUVOVDsKKworCit0eXBlZGVmIHN0cnVjdCBfUlRNUF9TQ0FUVEVSX0dBVEhFUl9MSVNUIHsKKyAgICBVTE9ORyAgTnVtYmVyT2ZFbGVtZW50czsKKyAgICBQVUxPTkcgUmVzZXJ2ZWQ7CisgICAgUlRNUF9TQ0FUVEVSX0dBVEhFUl9FTEVNRU5UIEVsZW1lbnRzW05JQ19NQVhfUEhZU19CVUZfQ09VTlRdOworfSBSVE1QX1NDQVRURVJfR0FUSEVSX0xJU1QsICpQUlRNUF9TQ0FUVEVSX0dBVEhFUl9MSVNUOworCisvLworLy8gIFNvbWUgdXRpbGl0eSBtYWNyb3MKKy8vCisjaWZuZGVmIG1pbgorI2RlZmluZSBtaW4oX2EsIF9iKSAgICAgKCgoX2EpIDwgKF9iKSkgPyAoX2EpIDogKF9iKSkKKyNlbmRpZgorCisjaWZuZGVmIG1heAorI2RlZmluZSBtYXgoX2EsIF9iKSAgICAgKCgoX2EpID4gKF9iKSkgPyAoX2EpIDogKF9iKSkKKyNlbmRpZgorCisjZGVmaW5lIEdFVF9MTkFfR0FJTihfcEFkKQkoKF9wQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpID8gKF9wQWQtPkJMTkFHYWluKSA6ICgoX3BBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSA2NCkgPyAoX3BBZC0+QUxOQUdhaW4wKSA6ICgoX3BBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxMjgpID8gKF9wQWQtPkFMTkFHYWluMSkgOiAoX3BBZC0+QUxOQUdhaW4yKSkpKQorCisjZGVmaW5lIElOQ19DT1VOVEVSNjQoVmFsKSAgICAgICAgICAoVmFsLlF1YWRQYXJ0KyspCisKKyNkZWZpbmUgSU5GUkFfT04oX3ApICAgICAgICAgICAgICAgIChPUFNUQVRVU19URVNUX0ZMQUcoX3AsIGZPUF9TVEFUVVNfSU5GUkFfT04pKQorI2RlZmluZSBBREhPQ19PTihfcCkgICAgICAgICAgICAgICAgKE9QU1RBVFVTX1RFU1RfRkxBRyhfcCwgZk9QX1NUQVRVU19BREhPQ19PTikpCisjZGVmaW5lIE1PTklUT1JfT04oX3ApICAgICAgICAgICAgICAoKChfcCktPlN0YUNmZy5Cc3NUeXBlKSA9PSBCU1NfTU9OSVRPUikKKyNkZWZpbmUgSURMRV9PTihfcCkgICAgICAgICAgICAgICAgICghSU5GUkFfT04oX3ApICYmICFBREhPQ19PTihfcCkpCisKKy8vIENoZWNrIExFQVAgJiBDQ0tNIGZsYWdzCisjZGVmaW5lIExFQVBfT04oX3ApICAgICAgICAgICAgICAgICAoKChfcCktPlN0YUNmZy5MZWFwQXV0aE1vZGUpID09IENJU0NPX0F1dGhNb2RlTEVBUCkKKyNkZWZpbmUgTEVBUF9DQ0tNX09OKF9wKSAgICAgICAgICAgICgoKChfcCktPlN0YUNmZy5MZWFwQXV0aE1vZGUpID09IENJU0NPX0F1dGhNb2RlTEVBUCkgJiYgKChfcCktPlN0YUNmZy5MZWFwQXV0aEluZm8uQ0NLTSA9PSBUUlVFKSkKKworLy8gaWYgb3JnaW5hbCBFdGhlcm5ldCBmcmFtZSBjb250YWlucyBubyBMTEMvU05BUCwgdGhlbiBhbiBleHRyYSBMTEMvU05BUCBlbmNhcCBpcyByZXF1aXJlZAorI2RlZmluZSBFWFRSQV9MTENTTkFQX0VOQ0FQX0ZST01fUEtUX1NUQVJUKF9wQnVmVkEsIF9wRXh0cmFMbGNTbmFwRW5jYXApCQlcCit7CQkJCQkJCQkJCQkJCQkJCVwKKwlpZiAoKCgqKF9wQnVmVkEgKyAxMikgPDwgOCkgKyAqKF9wQnVmVkEgKyAxMykpID4gMTUwMCkJCVwKKwl7CQkJCQkJCQkJCQkJCQkJXAorCQlfcEV4dHJhTGxjU25hcEVuY2FwID0gU05BUF84MDJfMUg7CQkJCQkJXAorCQlpZiAoTmRpc0VxdWFsTWVtb3J5KElQWCwgX3BCdWZWQSArIDEyLCAyKSB8fCAJCQlcCisJCQlOZGlzRXF1YWxNZW1vcnkoQVBQTEVfVEFMSywgX3BCdWZWQSArIDEyLCAyKSkJCVwKKwkJewkJCQkJCQkJCQkJCQkJXAorCQkJX3BFeHRyYUxsY1NuYXBFbmNhcCA9IFNOQVBfQlJJREdFX1RVTk5FTDsJCQlcCisJCX0JCQkJCQkJCQkJCQkJCVwKKwl9CQkJCQkJCQkJCQkJCQkJXAorCWVsc2UJCQkJCQkJCQkJCQkJCVwKKwl7CQkJCQkJCQkJCQkJCQkJXAorCQlfcEV4dHJhTGxjU25hcEVuY2FwID0gTlVMTDsJCQkJCQkJCVwKKwl9CQkJCQkJCQkJCQkJCQkJXAorfQorCisvLyBOZXcgRGVmaW5lIGZvciBuZXcgVHggUGF0aC4KKyNkZWZpbmUgRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9PRkZTRVQoX3BCdWZWQSwgX3BFeHRyYUxsY1NuYXBFbmNhcCkJXAorewkJCQkJCQkJCQkJCQkJCQlcCisJaWYgKCgoKihfcEJ1ZlZBKSA8PCA4KSArICooX3BCdWZWQSArIDEpKSA+IDE1MDApCQkJXAorCXsJCQkJCQkJCQkJCQkJCQlcCisJCV9wRXh0cmFMbGNTbmFwRW5jYXAgPSBTTkFQXzgwMl8xSDsJCQkJCQlcCisJCWlmIChOZGlzRXF1YWxNZW1vcnkoSVBYLCBfcEJ1ZlZBLCAyKSB8fCAJCQkJXAorCQkJTmRpc0VxdWFsTWVtb3J5KEFQUExFX1RBTEssIF9wQnVmVkEsIDIpKQkJCVwKKwkJewkJCQkJCQkJCQkJCQkJXAorCQkJX3BFeHRyYUxsY1NuYXBFbmNhcCA9IFNOQVBfQlJJREdFX1RVTk5FTDsJCQlcCisJCX0JCQkJCQkJCQkJCQkJCVwKKwl9CQkJCQkJCQkJCQkJCQkJXAorCWVsc2UJCQkJCQkJCQkJCQkJCVwKKwl7CQkJCQkJCQkJCQkJCQkJXAorCQlfcEV4dHJhTGxjU25hcEVuY2FwID0gTlVMTDsJCQkJCQkJCVwKKwl9CQkJCQkJCQkJCQkJCQkJXAorfQorCisKKyNkZWZpbmUgTUFLRV84MDJfM19IRUFERVIoX3AsIF9wTWFjMSwgX3BNYWMyLCBfcFR5cGUpICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBOZGlzTW92ZU1lbW9yeShfcCwgX3BNYWMxLCBNQUNfQUREUl9MRU4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBOZGlzTW92ZU1lbW9yeSgoX3AgKyBNQUNfQUREUl9MRU4pLCBfcE1hYzIsIE1BQ19BRERSX0xFTik7ICAgICAgICAgIFwKKyAgICBOZGlzTW92ZU1lbW9yeSgoX3AgKyBNQUNfQUREUl9MRU4gKiAyKSwgX3BUeXBlLCBMRU5HVEhfODAyXzNfVFlQRSk7IFwKK30KKworLy8gaWYgcERhdGEgaGFzIG5vIExMQy9TTkFQIChuZWl0aGVyIFJGQzEwNDIgbm9yIEJyaWRnZSB0dW5uZWwpLCBrZWVwIGl0IHRoYXQgd2F5LgorLy8gZWxzZSBpZiB0aGUgcmVjZWl2ZWQgZnJhbWUgaXMgTExDL1NOQVAtZW5jYXBlZCBJUFggb3IgQVBQTEVUQUxLLCBwcmVzZXJ2ZSB0aGUgTExDL1NOQVAgZmllbGQKKy8vIGVsc2UgcmVtb3ZlIHRoZSBMTEMvU05BUCBmaWVsZCBmcm9tIHRoZSByZXN1bHQgRXRoZXJuZXQgZnJhbWUKKy8vIFBhdGNoIGZvciBXSFFMIG9ubHksIHdoaWNoIGRpZCBub3QgdHVybiBvbiBOZXRiaW9zIGJ1dCB1c2UgSVBYIHdpdGhpbiBpdHMgcGF5bG9hZAorLy8gTm90ZToKKy8vICAgICBfcERhdGEgJiBfRGF0YVNpemUgbWF5IGJlIGFsdGVyZWQgKHJlbW92ZSA4LWJ5dGUgTExDL1NOQVApIGJ5IHRoaXMgTUFDUk8KKy8vICAgICBfcFJlbW92ZWRMTENTTkFQOiBwb2ludGVyIHRvIHJlbW92ZWQgTExDL1NOQVA7IE5VTEwgaXMgbm90IHJlbW92ZWQKKyNkZWZpbmUgQ09OVkVSVF9UT184MDJfMyhfcDgwMjNoZHIsIF9wREEsIF9wU0EsIF9wRGF0YSwgX0RhdGFTaXplLCBfcFJlbW92ZWRMTENTTkFQKSAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjaGFyIExMQ19MZW5bMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfcFJlbW92ZWRMTENTTkFQID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KFNOQVBfODAyXzFILCBfcERhdGEsIDYpICB8fCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTmRpc0VxdWFsTWVtb3J5KFNOQVBfQlJJREdFX1RVTk5FTCwgX3BEYXRhLCA2KSkgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUFVDSEFSIHBQcm90byA9IF9wRGF0YSArIDY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChOZGlzRXF1YWxNZW1vcnkoSVBYLCBwUHJvdG8sIDIpIHx8IE5kaXNFcXVhbE1lbW9yeShBUFBMRV9UQUxLLCBwUHJvdG8sIDIpKSAmJiAgXAorICAgICAgICAgICAgTmRpc0VxdWFsTWVtb3J5KFNOQVBfODAyXzFILCBfcERhdGEsIDYpKSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTExDX0xlblswXSA9IChVQ0hBUikoX0RhdGFTaXplIC8gMjU2KTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTExDX0xlblsxXSA9IChVQ0hBUikoX0RhdGFTaXplICUgMjU2KTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTUFLRV84MDJfM19IRUFERVIoX3A4MDIzaGRyLCBfcERBLCBfcFNBLCBMTENfTGVuKTsgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTUFLRV84MDJfM19IRUFERVIoX3A4MDIzaGRyLCBfcERBLCBfcFNBLCBwUHJvdG8pOyAgICAgICAgICAgXAorICAgICAgICAgICAgX3BSZW1vdmVkTExDU05BUCA9IF9wRGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX0RhdGFTaXplIC09IExFTkdUSF84MDJfMV9IOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX3BEYXRhICs9IExFTkdUSF84MDJfMV9IOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBMTENfTGVuWzBdID0gKFVDSEFSKShfRGF0YVNpemUgLyAyNTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBMTENfTGVuWzFdID0gKFVDSEFSKShfRGF0YVNpemUgJSAyNTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNQUtFXzgwMl8zX0hFQURFUihfcDgwMjNoZHIsIF9wREEsIF9wU0EsIExMQ19MZW4pOyAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIFNXSVRDSF9BQiggX3BBQSwgX3BCQikgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQVk9JRCBwQ0M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwQ0MgPSBfcEJCOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX3BCQiA9IF9wQUE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfcEFBID0gcENDOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIEVucXVldWUgdGhpcyBmcmFtZSB0byBNTE1FIGVuZ2luZQorLy8gV2UgbmVlZCB0byBlbnF1ZXVlIHRoZSB3aG9sZSBmcmFtZSBiZWNhdXNlIE1MTUUgbmVlZCB0byBwYXNzIGRhdGEgdHlwZQorLy8gaW5mb3JtYXRpb24gZnJvbSA4MDIuMTEgaGVhZGVyCisjaWZkZWYgUlQyODYwCisjZGVmaW5lIFJFUE9SVF9NR01UX0ZSQU1FX1RPX01MTUUoX3BBZCwgV2NpZCwgX3BGcmFtZSwgX0ZyYW1lU2l6ZSwgX1Jzc2kwLCBfUnNzaTEsIF9Sc3NpMiwgX1BsY3BTaWduYWwpICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVJTlQzMiBIaWdoMzJUU0YsIExvdzMyVFNGOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUlRNUF9JT19SRUFEMzIoX3BBZCwgVFNGX1RJTUVSX0RXMSwgJkhpZ2gzMlRTRik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFJUTVBfSU9fUkVBRDMyKF9wQWQsIFRTRl9USU1FUl9EVzAsICZMb3czMlRTRik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNbG1lRW5xdWV1ZUZvclJlY3YoX3BBZCwgV2NpZCwgSGlnaDMyVFNGLCBMb3czMlRTRiwgKFVDSEFSKV9Sc3NpMCwgKFVDSEFSKV9Sc3NpMSwoVUNIQVIpX1Jzc2kyLF9GcmFtZVNpemUsIF9wRnJhbWUsIChVQ0hBUilfUGxjcFNpZ25hbCk7ICAgXAorfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisjZGVmaW5lIE5ESVNfUVVFUllfQlVGRkVSKF9OZGlzQnVmLCBfcHBWQSwgX3BCdWZMZW4pICAgICAgICAgICAgICAgICAgICBcCisgICAgTmRpc1F1ZXJ5QnVmZmVyKF9OZGlzQnVmLCBfcHBWQSwgX3BCdWZMZW4pCisKKyNkZWZpbmUgTUFDX0FERFJfRVFVQUwocEFkZHIxLHBBZGRyMikgICAgICAgICAgIFJUTVBFcXVhbE1lbW9yeSgoUFZPSUQpKHBBZGRyMSksIChQVk9JRCkocEFkZHIyKSwgTUFDX0FERFJfTEVOKQorI2RlZmluZSBTU0lEX0VRVUFMKHNzaWQxLCBsZW4xLCBzc2lkMiwgbGVuMikgICAgKChsZW4xPT1sZW4yKSAmJiAoUlRNUEVxdWFsTWVtb3J5KHNzaWQxLCBzc2lkMiwgbGVuMSkpKQorCisvLworLy8gQ2hlY2sgaWYgaXQgaXMgSmFwYW4gVzUzKGNoNTIsNTYsNjAsNjQpIGNoYW5uZWwuCisvLworI2RlZmluZSBKYXBhbkNoYW5uZWxDaGVjayhjaGFubmVsKSAgKChjaGFubmVsID09IDUyKSB8fCAoY2hhbm5lbCA9PSA1NikgfHwgKGNoYW5uZWwgPT0gNjApIHx8IChjaGFubmVsID09IDY0KSkKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2RlZmluZSBTVEFfUE9SVF9TRUNVUkVEKF9wQWQpIFwKK3sgXAorCV9wQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOyBcCisJTmRpc0FjcXVpcmVTcGluTG9jaygmX3BBZC0+TWFjVGFiTG9jayk7IFwKKwlfcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5Qb3J0U2VjdXJlZCA9IF9wQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZDsgXAorCU5kaXNSZWxlYXNlU3BpbkxvY2soJl9wQWQtPk1hY1RhYkxvY2spOyBcCit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworLy8KKy8vIFJlZ2lzdGVyIHNldCBwYWlyIGZvciBpbml0aWFsemF0aW9uIHJlZ2lzdGVyIHNldCBkZWZpbml0aW9uCisvLwordHlwZWRlZiBzdHJ1Y3QgIF9SVE1QX1JFR19QQUlSCit7CisJVUxPTkcgICBSZWdpc3RlcjsKKwlVTE9ORyAgIFZhbHVlOworfSBSVE1QX1JFR19QQUlSLCAqUFJUTVBfUkVHX1BBSVI7CisKK3R5cGVkZWYgc3RydWN0ICBfUkVHX1BBSVIKK3sKKwlVQ0hBUiAgIFJlZ2lzdGVyOworCVVDSEFSICAgVmFsdWU7Cit9IFJFR19QQUlSLCAqUFJFR19QQUlSOworCisvLworLy8gUmVnaXN0ZXIgc2V0IHBhaXIgZm9yIGluaXRpYWx6YXRpb24gcmVnaXN0ZXIgc2V0IGRlZmluaXRpb24KKy8vCit0eXBlZGVmIHN0cnVjdCAgX1JUTVBfUkZfUkVHUworeworCVVDSEFSICAgQ2hhbm5lbDsKKwlVTE9ORyAgIFIxOworCVVMT05HICAgUjI7CisJVUxPTkcgICBSMzsKKwlVTE9ORyAgIFI0OworfSBSVE1QX1JGX1JFR1MsICpQUlRNUF9SRl9SRUdTOworCit0eXBlZGVmIHN0cnVjdCBfRlJFUVVFTkNZX0lURU0geworCVVDSEFSCUNoYW5uZWw7CisJVUNIQVIJTjsKKwlVQ0hBUglSOworCVVDSEFSCUs7Cit9IEZSRVFVRU5DWV9JVEVNLCAqUEZSRVFVRU5DWV9JVEVNOworCisvLworLy8gIERhdGEgYnVmZmVyIGZvciBETUEgb3BlcmF0aW9uLCB0aGUgYnVmZmVyIG11c3QgYmUgY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnkKKy8vICBCb3RoIERNQSB0byAvIGZyb20gQ1BVIHVzZSB0aGUgc2FtZSBzdHJ1Y3R1cmUuCisvLwordHlwZWRlZiBzdHJ1Y3QgIF9SVE1QX0RNQUJVRgoreworCVVMT05HICAgICAgICAgICAgICAgICAgIEFsbG9jU2l6ZTsKKwlQVk9JRCAgICAgICAgICAgICAgICAgICBBbGxvY1ZhOyAgICAgICAgICAgIC8vIFR4QnVmIHZpcnR1YWwgYWRkcmVzcworCU5ESVNfUEhZU0lDQUxfQUREUkVTUyAgIEFsbG9jUGE7ICAgICAgICAgICAgLy8gVHhCdWYgcGh5c2ljYWwgYWRkcmVzcworfSBSVE1QX0RNQUJVRiwgKlBSVE1QX0RNQUJVRjsKKworCit0eXBlZGVmCXVuaW9uCV9IRUFERVJfODAyXzExX1NFUXsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgc3RydWN0IHsKKyAgIAlVU0hPUlQJCQlTZXF1ZW5jZToxMjsKKwlVU0hPUlQJCQlGcmFnOjQ7CisgICAgfSAgIGZpZWxkOworI2Vsc2UKKyAgICBzdHJ1Y3QgeworCVVTSE9SVAkJCUZyYWc6NDsKKwlVU0hPUlQJCQlTZXF1ZW5jZToxMjsKKyAgICB9ICAgZmllbGQ7CisjZW5kaWYKKyAgICBVU0hPUlQgICAgICAgICAgIHZhbHVlOworfQlIRUFERVJfODAyXzExX1NFUSwgKlBIRUFERVJfODAyXzExX1NFUTsKKworLy8KKy8vICBEYXRhIGJ1ZmZlciBmb3IgRE1BIG9wZXJhdGlvbiwgdGhlIGJ1ZmZlciBtdXN0IGJlIGNvbnRpZ3VvdXMgcGh5c2ljYWwgbWVtb3J5CisvLyAgQm90aCBETUEgdG8gLyBmcm9tIENQVSB1c2UgdGhlIHNhbWUgc3RydWN0dXJlLgorLy8KK3R5cGVkZWYgc3RydWN0ICBfUlRNUF9SRU9SREVSQlVGCit7CisJQk9PTEVBTgkJCUlzRnVsbDsKKwlQVk9JRCAgICAgICAgICAgICAgICAgICBBbGxvY1ZhOyAgICAgICAgICAgIC8vIFR4QnVmIHZpcnR1YWwgYWRkcmVzcworCVVDSEFSCQkJSGVhZGVyODAyXzNbMTRdOworCUhFQURFUl84MDJfMTFfU0VRCQkJU2VxdWVuY2U7CS8vc3VwcG9ydCBjb21wcmVzc2VkIGJpdG1hcCBCQSwgc28gbm8gY29uc2lkZXIgZnJhZ21lbnQgaW4gQkEKKwlVQ0hBUiAJCURhdGFPZmZzZXQ7CisJVVNIT1JUIAkJRGF0YXNpemU7CisJVUxPTkcgICAgICAgICAgICAgICAgICAgQWxsb2NTaXplOworI2lmZGVmIFJUMjg2MAorCU5ESVNfUEhZU0lDQUxfQUREUkVTUyAgIEFsbG9jUGE7ICAgICAgICAgICAgLy8gVHhCdWYgcGh5c2ljYWwgYWRkcmVzcworI2VuZGlmIC8vIFJUMjg2MCAvLworfSAgIFJUTVBfUkVPUkRFUkJVRiwgKlBSVE1QX1JFT1JERVJCVUY7CisKKy8vCisvLyBDb250cm9sIGJsb2NrIChEZXNjcmlwdG9yKSBmb3IgYWxsIHJpbmcgZGVzY3JpcHRvciBETUEgb3BlcmF0aW9uLCBidWZmZXIgbXVzdCBiZQorLy8gY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnkuIE5ESVNfUEFDS0VUIHN0b3JlZCB0aGUgYmluZGluZyBSeCBwYWNrZXQgZGVzY3JpcHRvcgorLy8gd2hpY2ggd29uJ3QgYmUgcmVsZWFzZWQsIGRyaXZlciBoYXMgdG8gd2FpdCB1bnRpbCB1cHBlciBsYXllciByZXR1cm4gdGhlIHBhY2tldAorLy8gYmVmb3JlIGdpdmVpbmcgdXAgdGhpcyByeCByaW5nIGRlc2NyaXB0b3IgdG8gQVNJQy4gTkRJU19CVUZGRVIgaXMgYXNzb2NhaXRlZCBwYWlyCisvLyB0byBkZXNjcmliZSB0aGUgcGFja2V0IGJ1ZmZlci4gRm9yIFR4LCBORElTX1BBQ0tFVCBzdG9yZWQgdGhlIHR4IHBhY2tldCBkZXNjcmlwdG9yCisvLyB3aGljaCBkcml2ZXIgc2hvdWxkIEFDSyB1cHBlciBsYXllciB3aGVuIHRoZSB0eCBpcyBwaHlzaWNhbGx5IGRvbmUgb3IgZmFpbGVkLgorLy8KK3R5cGVkZWYgc3RydWN0IF9SVE1QX0RNQUNCCit7CisJVUxPTkcgICAgICAgICAgICAgICAgICAgQWxsb2NTaXplOyAgICAgICAgICAvLyBDb250cm9sIGJsb2NrIHNpemUKKwlQVk9JRCAgICAgICAgICAgICAgICAgICBBbGxvY1ZhOyAgICAgICAgICAgIC8vIENvbnRyb2wgYmxvY2sgdmlydHVhbCBhZGRyZXNzCisJTkRJU19QSFlTSUNBTF9BRERSRVNTICAgQWxsb2NQYTsgICAgICAgICAgICAvLyBDb250cm9sIGJsb2NrIHBoeXNpY2FsIGFkZHJlc3MKKwlQTkRJU19QQUNLRVQgcE5kaXNQYWNrZXQ7CisJUE5ESVNfUEFDS0VUIHBOZXh0TmRpc1BhY2tldDsKKworCVJUTVBfRE1BQlVGICAgICAgICAgICAgIERtYUJ1ZjsgICAgICAgICAgICAgLy8gQXNzb2NpYXRlZCBETUEgYnVmZmVyIHN0cnVjdHVyZQorfSBSVE1QX0RNQUNCLCAqUFJUTVBfRE1BQ0I7CisKK3R5cGVkZWYgc3RydWN0IF9SVE1QX1RYX0JVRgoreworCVBRVUVVRV9FTlRSWSAgICBOZXh0OworCVVDSEFSICAgICAgICAgICBJbmRleDsKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBBbGxvY1NpemU7ICAgICAgICAgIC8vIENvbnRyb2wgYmxvY2sgc2l6ZQorCVBWT0lEICAgICAgICAgICAgICAgICAgIEFsbG9jVmE7ICAgICAgICAgICAgLy8gQ29udHJvbCBibG9jayB2aXJ0dWFsIGFkZHJlc3MKKwlORElTX1BIWVNJQ0FMX0FERFJFU1MgICBBbGxvY1BhOyAgICAgICAgICAgIC8vIENvbnRyb2wgYmxvY2sgcGh5c2ljYWwgYWRkcmVzcworfSBSVE1QX1RYQlVGLCAqUFJUTVBfVFhCVUY7CisKK3R5cGVkZWYgc3RydWN0IF9SVE1QX1JYX0JVRgoreworCUJPT0xFQU4gICAgICAgICAgIEluVXNlOworCVVMT05HICAgICAgICAgICAJQnlCYVJlY0luZGV4OworCVJUTVBfUkVPUkRFUkJVRglNQVBfUlhCdWZbTUFYX1JYX1JFT1JERVJCVUZdOworfSBSVE1QX1JYQlVGLCAqUFJUTVBfUlhCVUY7Cit0eXBlZGVmIHN0cnVjdCBfUlRNUF9UWF9SSU5HCit7CisJUlRNUF9ETUFDQiAgQ2VsbFtUWF9SSU5HX1NJWkVdOworCVVJTlQzMgkJVHhDcHVJZHg7CisJVUlOVDMyCQlUeERtYUlkeDsKKwlVSU5UMzIJCVR4U3dGcmVlSWR4OyAJLy8gc29mdHdhcmUgbmV4dCBmcmVlIHR4IGluZGV4Cit9IFJUTVBfVFhfUklORywgKlBSVE1QX1RYX1JJTkc7CisKK3R5cGVkZWYgc3RydWN0IF9SVE1QX1JYX1JJTkcKK3sKKwlSVE1QX0RNQUNCICBDZWxsW1JYX1JJTkdfU0laRV07CisJVUlOVDMyCQlSeENwdUlkeDsKKwlVSU5UMzIJCVJ4RG1hSWR4OworCUlOVDMyCQlSeFN3UmVhZElkeDsgCS8vIHNvZnR3YXJlIG5leHQgcmVhZCBpbmRleAorfSBSVE1QX1JYX1JJTkcsICpQUlRNUF9SWF9SSU5HOworCit0eXBlZGVmIHN0cnVjdCBfUlRNUF9NR01UX1JJTkcKK3sKKwlSVE1QX0RNQUNCICBDZWxsW01HTVRfUklOR19TSVpFXTsKKwlVSU5UMzIJCVR4Q3B1SWR4OworCVVJTlQzMgkJVHhEbWFJZHg7CisJVUlOVDMyCQlUeFN3RnJlZUlkeDsgLy8gc29mdHdhcmUgbmV4dCBmcmVlIHR4IGluZGV4Cit9IFJUTVBfTUdNVF9SSU5HLCAqUFJUTVBfTUdNVF9SSU5HOworCisvLworLy8gIFN0YXRpc3RpYyBjb3VudGVyIHN0cnVjdHVyZQorLy8KK3R5cGVkZWYgc3RydWN0IF9DT1VOVEVSXzgwMl8zCit7CisJLy8gR2VuZXJhbCBTdGF0cworCVVMT05HICAgICAgIEdvb2RUcmFuc21pdHM7CisJVUxPTkcgICAgICAgR29vZFJlY2VpdmVzOworCVVMT05HICAgICAgIFR4RXJyb3JzOworCVVMT05HICAgICAgIFJ4RXJyb3JzOworCVVMT05HICAgICAgIFJ4Tm9CdWZmZXI7CisKKwkvLyBFdGhlcm5ldCBTdGF0cworCVVMT05HICAgICAgIFJjdkFsaWdubWVudEVycm9yczsKKwlVTE9ORyAgICAgICBPbmVDb2xsaXNpb247CisJVUxPTkcgICAgICAgTW9yZUNvbGxpc2lvbnM7CisKK30gQ09VTlRFUl84MDJfMywgKlBDT1VOVEVSXzgwMl8zOworCit0eXBlZGVmIHN0cnVjdCBfQ09VTlRFUl84MDJfMTEgeworCVVMT05HICAgICAgICAgICBMZW5ndGg7CisJTEFSR0VfSU5URUdFUiAgIExhc3RUcmFuc21pdHRlZEZyYWdtZW50Q291bnQ7CisJTEFSR0VfSU5URUdFUiAgIFRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgTXVsdGljYXN0VHJhbnNtaXR0ZWRGcmFtZUNvdW50OworCUxBUkdFX0lOVEVHRVIgICBGYWlsZWRDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgUmV0cnlDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgTXVsdGlwbGVSZXRyeUNvdW50OworCUxBUkdFX0lOVEVHRVIgICBSVFNTdWNjZXNzQ291bnQ7CisJTEFSR0VfSU5URUdFUiAgIFJUU0ZhaWx1cmVDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgQUNLRmFpbHVyZUNvdW50OworCUxBUkdFX0lOVEVHRVIgICBGcmFtZUR1cGxpY2F0ZUNvdW50OworCUxBUkdFX0lOVEVHRVIgICBSZWNlaXZlZEZyYWdtZW50Q291bnQ7CisJTEFSR0VfSU5URUdFUiAgIE11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgRkNTRXJyb3JDb3VudDsKK30gQ09VTlRFUl84MDJfMTEsICpQQ09VTlRFUl84MDJfMTE7CisKK3R5cGVkZWYgc3RydWN0IF9DT1VOVEVSX1JBTElOSyB7CisJVUxPTkcgICAgICAgICAgIFRyYW5zbWl0dGVkQnl0ZUNvdW50OyAgIC8vIGJvdGggc3VjY2Vzc2Z1bCBhbmQgZmFpbHVyZSwgdXNlZCB0byBjYWxjdWxhdGUgVFggdGhyb3VnaHB1dAorCVVMT05HICAgICAgICAgICBSZWNlaXZlZEJ5dGVDb3VudDsgICAgICAvLyBib3RoIENSQyBva2F5IGFuZCBDUkMgZXJyb3IsIHVzZWQgdG8gY2FsY3VsYXRlIFJYIHRocm91Z2hwdXQKKwlVTE9ORyAgICAgICAgICAgQmVlbkRpc2Fzc29jaWF0ZWRDb3VudDsKKwlVTE9ORyAgICAgICAgICAgQmFkQ1FJQXV0b1JlY292ZXJ5Q291bnQ7CisJVUxPTkcgICAgICAgICAgIFBvb3JDUUlSb2FtaW5nQ291bnQ7CisJVUxPTkcgICAgICAgICAgIE1nbXRSaW5nRnVsbENvdW50OworCVVMT05HICAgICAgICAgICBSeENvdW50U2luY2VMYXN0TlVMTDsKKwlVTE9ORyAgICAgICAgICAgUnhDb3VudDsKKwlVTE9ORyAgICAgICAgICAgUnhSaW5nRXJyQ291bnQ7CisJVUxPTkcgICAgICAgICAgIEtpY2tUeENvdW50OworCVVMT05HICAgICAgICAgICBUeFJpbmdFcnJDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgUmVhbEZjc0VyckNvdW50OworCVVMT05HICAgICAgICAgICBQZW5kaW5nTmRpc1BhY2tldENvdW50OworCisJVUxPTkcgICAgICAgICAgIE9uZVNlY09zVHhDb3VudFtOVU1fT0ZfVFhfUklOR107CisJVUxPTkcgICAgICAgICAgIE9uZVNlY0RtYURvbmVDb3VudFtOVU1fT0ZfVFhfUklOR107CisJVUlOVDMyICAgICAgICAgIE9uZVNlY1R4RG9uZUNvdW50OworCVVMT05HICAgICAgICAgICBPbmVTZWNSeENvdW50OworCVVJTlQzMiAgICAgICAgICBPbmVTZWNUeEFnZ3JlZ2F0aW9uQ291bnQ7CisJVUlOVDMyICAgICAgICAgIE9uZVNlY1J4QWdncmVnYXRpb25Db3VudDsKKworCVVJTlQzMiAgIAkJT25lU2VjRnJhbWVEdXBsaWNhdGVDb3VudDsKKworCisJVUlOVDMyICAgICAgICAgIE9uZVNlY1R4Tm9SZXRyeU9rQ291bnQ7CisJVUlOVDMyICAgICAgICAgIE9uZVNlY1R4UmV0cnlPa0NvdW50OworCVVJTlQzMiAgICAgICAgICBPbmVTZWNUeEZhaWxDb3VudDsKKwlVSU5UMzIgICAgICAgICAgT25lU2VjRmFsc2VDQ0FDbnQ7ICAgICAgLy8gQ0NBIGVycm9yIGNvdW50LCBmb3IgZGVidWcgcHVycG9zZSwgbWlnaHQgbW92ZSB0byBnbG9iYWwgY291bnRlcgorCVVJTlQzMiAgICAgICAgICBPbmVTZWNSeE9rQ250OyAgICAgICAgICAvLyBSWCB3aXRob3V0IGVycm9yCisJVUlOVDMyICAgICAgICAgIE9uZVNlY1J4T2tEYXRhQ250OyAgICAgIC8vIHVuaWNhc3QtdG8tbWUgREFUQSBmcmFtZSBjb3VudAorCVVJTlQzMiAgICAgICAgICBPbmVTZWNSeEZjc0VyckNudDsgICAgICAvLyBDUkMgZXJyb3IKKwlVSU5UMzIgICAgICAgICAgT25lU2VjQmVhY29uU2VudENudDsKKwlVSU5UMzIgICAgICAgICAgTGFzdE9uZVNlY1RvdGFsVHhDb3VudDsgLy8gT25lU2VjVHhOb1JldHJ5T2tDb3VudCArIE9uZVNlY1R4UmV0cnlPa0NvdW50ICsgT25lU2VjVHhGYWlsQ291bnQKKwlVSU5UMzIgICAgICAgICAgTGFzdE9uZVNlY1J4T2tEYXRhQ250OyAgLy8gT25lU2VjUnhPa0RhdGFDbnQKKwlVTE9ORwkJRHVwbGljYXRlUmN2OworCVVMT05HCQlUeEFnZ0NvdW50OworCVVMT05HCQlUeE5vbkFnZ0NvdW50OworCVVMT05HCQlUeEFnZzFNUERVQ291bnQ7CisJVUxPTkcJCVR4QWdnMk1QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2czTVBEVUNvdW50OworCVVMT05HCQlUeEFnZzRNUERVQ291bnQ7CisJVUxPTkcJCVR4QWdnNU1QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2c2TVBEVUNvdW50OworCVVMT05HCQlUeEFnZzdNUERVQ291bnQ7CisJVUxPTkcJCVR4QWdnOE1QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2c5TVBEVUNvdW50OworCVVMT05HCQlUeEFnZzEwTVBEVUNvdW50OworCVVMT05HCQlUeEFnZzExTVBEVUNvdW50OworCVVMT05HCQlUeEFnZzEyTVBEVUNvdW50OworCVVMT05HCQlUeEFnZzEzTVBEVUNvdW50OworCVVMT05HCQlUeEFnZzE0TVBEVUNvdW50OworCVVMT05HCQlUeEFnZzE1TVBEVUNvdW50OworCVVMT05HCQlUeEFnZzE2TVBEVUNvdW50OworCisJTEFSR0VfSU5URUdFUiAgICAgICBUcmFuc21pdHRlZE9jdGV0c0luQU1TRFU7CisJTEFSR0VfSU5URUdFUiAgICAgICBUcmFuc21pdHRlZEFNU0RVQ291bnQ7CisJTEFSR0VfSU5URUdFUiAgICAgICBSZWNlaXZlZE9jdGVzSW5BTVNEVUNvdW50OworCUxBUkdFX0lOVEVHRVIgICAgICAgUmVjZWl2ZWRBTVNEVUNvdW50OworCUxBUkdFX0lOVEVHRVIgICAgICAgVHJhbnNtaXR0ZWRBTVBEVUNvdW50OworCUxBUkdFX0lOVEVHRVIgICAgICAgVHJhbnNtaXR0ZWRNUERVc0luQU1QRFVDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgICAgIFRyYW5zbWl0dGVkT2N0ZXRzSW5BTVBEVUNvdW50OworCUxBUkdFX0lOVEVHRVIgICAgICAgTVBEVUluUmVjZWl2ZWRBTVBEVUNvdW50OworfSBDT1VOVEVSX1JBTElOSywgKlBDT1VOVEVSX1JBTElOSzsKKwordHlwZWRlZiBzdHJ1Y3QgX1BJRF9DT1VOVEVSIHsKKwlVTE9ORyAgICAgICAgICAgVHhBY2tSZXF1aXJlZENvdW50OyAgICAgIC8vIENSQyBlcnJvcgorCVVMT05HICAgICAgICAgICBUeEFnZ3JlQ291bnQ7CisJVUxPTkcgICAgICAgICAgIFR4U3VjY2Vzc0NvdW50OyAvLyBPbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsgT25lU2VjVHhSZXRyeU9rQ291bnQgKyBPbmVTZWNUeEZhaWxDb3VudAorCVVMT05HCQlMYXN0U3VjY2Vzc1JhdGU7Cit9IFBJRF9DT1VOVEVSLCAqUFBJRF9DT1VOVEVSOworCit0eXBlZGVmIHN0cnVjdCBfQ09VTlRFUl9EUlMgeworCS8vIHRvIHJlY29yZCB0aGUgZWFjaCBUWCByYXRlJ3MgcXVhbGl0eS4gMCBpcyBiZXN0LCB0aGUgYmlnZ2VyIHRoZSB3b3JzZS4KKwlVU0hPUlQgICAgICAgICAgVHhRdWFsaXR5W01BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIXTsKKwlVQ0hBUiAgICAgICAgICAgUEVSW01BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIXTsKKwlVQ0hBUiAgICAgICAgICAgVHhSYXRlVXBQZW5hbHR5OyAgICAgIC8vIGV4dHJhICMgb2Ygc2Vjb25kIHBlbmFsdHkgZHVlIHRvIGxhc3QgdW5zdGFibGUgY29uZGl0aW9uCisJVUxPTkcgICAgICAgICAgIEN1cnJUeFJhdGVTdGFibGVUaW1lOyAvLyAjIG9mIHNlY29uZCBpbiBjdXJyZW50IFRYIHJhdGUKKwlCT09MRUFOICAgICAgICAgZk5vaXN5RW52aXJvbm1lbnQ7CisJQk9PTEVBTiAgICAgICAgIGZMYXN0U2VjQWNjb3JkaW5nUlNTSTsKKwlVQ0hBUiAgICAgICAgICAgTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbjsgLy8gMDogbm8gY2hhbmdlLCAxOnJhdGUgVVAsIDI6cmF0ZSBkb3duCisJVUNIQVIJCQlMYXN0VGltZVR4UmF0ZUNoYW5nZUFjdGlvbjsgLy9LZWVwIGxhc3QgdGltZSB2YWx1ZSBvZiBMYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uCisJVUxPTkcJCQlMYXN0VHhPa0NvdW50OworfSBDT1VOVEVSX0RSUywgKlBDT1VOVEVSX0RSUzsKKworLy8KKy8vICBBcmNmb3VyIFN0cnVjdHVyZSBBZGRlZCBieSBQYXVsV3UKKy8vCit0eXBlZGVmIHN0cnVjdCAgX0FSQ0ZPVVIKK3sKKwlVSU5UICAgICAgICAgICAgWDsKKwlVSU5UICAgICAgICAgICAgWTsKKwlVQ0hBUiAgICAgICAgICAgU1RBVEVbMjU2XTsKK30gQVJDRk9VUkNPTlRFWFQsICpQQVJDRk9VUkNPTlRFWFQ7CisKKy8vIE1JTU8gVHggcGFyYW1ldGVyLCBTaG9ydEdJLCBNQ1MsIFNUQkMsIGV0Yy4gIHRoZXNlIGFyZSBmaWVsZHMgaW4gVFhXSSB0b28uIGp1c3QgY29weSB0byBUWFdJLgordHlwZWRlZiBzdHJ1Y3QgIF9SRUNFSVZFX1NFVFRJTkcgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVU0hPUlQJCU1JTU86MTsKKwlVU0hPUlQJCU9GRE06MTsKKwlVU0hPUlQJCXJzdjozOworCVVTSE9SVAkJU1RCQzoyOwkvL1NQQUNFCisJVVNIT1JUCQlTaG9ydEdJOjE7CisJVVNIT1JUCQlNb2RlOjI7CS8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6CisJVVNIT1JUICAgCU51bU9mUlg6MjsgICAgICAgICAgICAgICAgIC8vIE1JTU8uIFdFIEhBVkUgM1IKKyNlbHNlCisJVVNIT1JUICAgCU51bU9mUlg6MjsgICAgICAgICAgICAgICAgIC8vIE1JTU8uIFdFIEhBVkUgM1IKKwlVU0hPUlQJCU1vZGU6MjsJLy9jaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHoKKwlVU0hPUlQJCVNob3J0R0k6MTsKKwlVU0hPUlQJCVNUQkM6MjsJLy9TUEFDRQorCVVTSE9SVAkJcnN2OjM7CisJVVNIT1JUCQlPRkRNOjE7CisJVVNIT1JUCQlNSU1POjE7CisjZW5kaWYKKyB9IFJFQ0VJVkVfU0VUVElORywgKlBSRUNFSVZFX1NFVFRJTkc7CisKKy8vIFNoYXJlZCBrZXkgZGF0YSBzdHJ1Y3R1cmUKK3R5cGVkZWYgc3RydWN0ICBfV0VQX0tFWSB7CisJVUNIQVIgICBLZXlMZW47ICAgICAgICAgICAgICAgICAgICAgLy8gS2V5IGxlbmd0aCBmb3IgZWFjaCBrZXksIDA6IGVudHJ5IGlzIGludmFsaWQKKwlVQ0hBUiAgIEtleVtNQVhfTEVOX09GX0tFWV07ICAgICAgICAvLyByaWdodCBub3cgd2UgaW1wbGVtZW50IDQga2V5cywgMTI4IGJpdHMgbWF4Cit9IFdFUF9LRVksICpQV0VQX0tFWTsKKwordHlwZWRlZiBzdHJ1Y3QgX0NJUEhFUl9LRVkgeworCVVDSEFSICAgS2V5WzE2XTsgICAgICAgICAgICAvLyByaWdodCBub3cgd2UgaW1wbGVtZW50IDQga2V5cywgMTI4IGJpdHMgbWF4CisJVUNIQVIgICBSeE1pY1s4XTsJCQkvLyBtYWtlIGFsaWdubWVudAorCVVDSEFSICAgVHhNaWNbOF07CisJVUNIQVIgICBUeFRzY1s2XTsgICAgICAgICAgIC8vIDQ4Yml0IFRTQyB2YWx1ZQorCVVDSEFSICAgUnhUc2NbNl07ICAgICAgICAgICAvLyA0OGJpdCBUU0MgdmFsdWUKKwlVQ0hBUiAgIENpcGhlckFsZzsgICAgICAgICAgLy8gMC1ub25lLCAxOldFUDY0LCAyOldFUDEyOCwgMzpUS0lQLCA0OkFFUywgNTpDS0lQNjQsIDY6Q0tJUDEyOAorCVVDSEFSICAgS2V5TGVuOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCVVDSEFSICAgQnNzSWRbNl07CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisgICAgICAgICAgICAvLyBLZXkgbGVuZ3RoIGZvciBlYWNoIGtleSwgMDogZW50cnkgaXMgaW52YWxpZAorCVVDSEFSICAgVHlwZTsgICAgICAgICAgICAgICAvLyBJbmRpY2F0ZSBQYWlyd2lzZS9Hcm91cCB3aGVuIHJlcG9ydGluZyBNSUMgZXJyb3IKK30gQ0lQSEVSX0tFWSwgKlBDSVBIRVJfS0VZOworCit0eXBlZGVmIHN0cnVjdCBfQkJQX1RVTklOR19TVFJVQ1QgeworCUJPT0xFQU4gICAgIEVuYWJsZTsKKwlVQ0hBUiAgICAgICBGYWxzZUNjYUNvdW50VXBwZXJCb3VuZDsgIC8vIDEwMCBwZXIgc2VjCisJVUNIQVIgICAgICAgRmFsc2VDY2FDb3VudExvd2VyQm91bmQ7ICAvLyAxMCBwZXIgc2VjCisJVUNIQVIgICAgICAgUjE3TG93ZXJCb3VuZDsgICAgICAgICAgICAvLyBzcGVjaWZpZWQgaW4gRTJQUk9NCisJVUNIQVIgICAgICAgUjE3VXBwZXJCb3VuZDsgICAgICAgICAgICAvLyAweDY4IGFjY29yZGluZyB0byBEYXZpZCBUdW5nCisJVUNIQVIgICAgICAgQ3VycmVudFIxN1ZhbHVlOworfSBCQlBfVFVOSU5HLCAqUEJCUF9UVU5JTkc7CisKK3R5cGVkZWYgc3RydWN0IF9TT0ZUX1JYX0FOVF9ESVZFUlNJVFlfU1RSVUNUIHsKKwlVQ0hBUiAgICAgRXZhbHVhdGVQZXJpb2Q7CQkgLy8gMDpub3QgZXZhbHV0ZSBzdGF0dXMsIDE6IGV2YWx1YXRlIHN0YXR1cywgMjogc3dpdGNoaW5nIHN0YXR1cworCVVDSEFSICAgICBQYWlyMVByaW1hcnlSeEFudDsgICAgIC8vIDA6QW50LUUxLCAxOkFudC1FMgorCVVDSEFSICAgICBQYWlyMVNlY29uZGFyeVJ4QW50OyAgIC8vIDA6QW50LUUxLCAxOkFudC1FMgorCVVDSEFSICAgICBQYWlyMlByaW1hcnlSeEFudDsgICAgIC8vIDA6QW50LUUzLCAxOkFudC1FNAorCVVDSEFSICAgICBQYWlyMlNlY29uZGFyeVJ4QW50OyAgIC8vIDA6QW50LUUzLCAxOkFudC1FNAorCVNIT1JUICAgICBQYWlyMUF2Z1Jzc2lbMl07ICAgICAgIC8vIEF2Z1Jzc2lbMF06RTEsIEF2Z1Jzc2lbMV06RTIKKwlTSE9SVCAgICAgUGFpcjJBdmdSc3NpWzJdOyAgICAgICAvLyBBdmdSc3NpWzBdOkUzLCBBdmdSc3NpWzFdOkU0CisJU0hPUlQgICAgIFBhaXIxTGFzdEF2Z1Jzc2k7ICAgICAgLy8KKwlTSE9SVCAgICAgUGFpcjJMYXN0QXZnUnNzaTsgICAgICAvLworCVVMT05HICAgICBSY3ZQa3ROdW1XaGVuRXZhbHVhdGU7CisJQk9PTEVBTiAgIEZpcnN0UGt0QXJyaXZlZFdoZW5FdmFsdWF0ZTsKKwlSQUxJTktfVElNRVJfU1RSVUNUICAgIFJ4QW50RGl2ZXJzaXR5VGltZXI7Cit9IFNPRlRfUlhfQU5UX0RJVkVSU0lUWSwgKlBTT0ZUX1JYX0FOVF9ESVZFUlNJVFk7CisKK3R5cGVkZWYgc3RydWN0IF9MRUFQX0FVVEhfSU5GTyB7CisJQk9PTEVBTiAgICAgICAgIEVuYWJsZWQ7ICAgICAgICAvL1R1cmU6IEVuYWJsZSBMRUFQIEF1dGhlbnRpY2F0aW9uCisJQk9PTEVBTiAgICAgICAgIENDS007ICAgICAgICAgICAvL1R1cmU6IFVzZSBGYXN0IFJlYXV0aGVudGljYXRpb24gd2l0aCBDQ0tNCisJVUNIQVIgICAgICAgICAgIFJlc2VydmVbMl07CisJVUNIQVIgICAgICAgICAgIFVzZXJOYW1lWzI1Nl07ICAvL0xFQVAsIFVzZXIgbmFtZQorCVVMT05HICAgICAgICAgICBVc2VyTmFtZUxlbjsKKwlVQ0hBUiAgICAgICAgICAgUGFzc3dvcmRbMjU2XTsgIC8vTEVBUCwgVXNlciBQYXNzd29yZAorCVVMT05HICAgICAgICAgICBQYXNzd29yZExlbjsKK30gTEVBUF9BVVRIX0lORk8sICpQTEVBUF9BVVRIX0lORk87CisKK3R5cGVkZWYgc3RydWN0IHsKKwlVQ0hBUiAgICAgICAgQWRkcltNQUNfQUREUl9MRU5dOworCVVDSEFSICAgICAgICBFcnJvckNvZGVbMl07ICAvLzAwIDAxLUludmFsaWQgYXV0aGVudGljYXRpb24gdHlwZQorCQkJCQkJCQkvLzAwIDAyLUF1dGhlbnRpY2F0aW9uIHRpbWVvdXQKKwkJCQkJCQkJLy8wMCAwMy1DaGFsbGVuZ2UgZnJvbSBBUCBmYWlsZWQKKwkJCQkJCQkJLy8wMCAwNC1DaGFsbGVuZ2UgdG8gQVAgZmFpbGVkCisJQk9PTEVBTiAgICAgIFJlcG9ydGVkOworfSBST0dVRUFQX0VOVFJZLCAqUFJPR1VFQVBfRU5UUlk7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlVQ0hBUiAgICAgICAgICAgICAgIFJvZ3VlQXBOcjsKKwlST0dVRUFQX0VOVFJZICAgICAgIFJvZ3VlQXBFbnRyeVtNQVhfTEVOX09GX0JTU19UQUJMRV07Cit9IFJPR1VFQVBfVEFCTEUsICpQUk9HVUVBUF9UQUJMRTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUJPT0xFQU4gICAgIEVuYWJsZTsKKwlVQ0hBUiAgICAgICBEZWx0YTsKKwlCT09MRUFOICAgICBQbHVzU2lnbjsKK30gQ0NLX1RYX1BPV0VSX0NBTElCUkFURSwgKlBDQ0tfVFhfUE9XRVJfQ0FMSUJSQVRFOworCisvLworLy8gUmVjZWl2ZSBUdXBsZSBDYWNoZSBGb3JtYXQKKy8vCit0eXBlZGVmIHN0cnVjdCAgX1RVUExFX0NBQ0hFICAgIHsKKwlCT09MRUFOICAgICAgICAgVmFsaWQ7CisJVUNIQVIgICAgICAgICAgIE1hY0FkZHJlc3NbTUFDX0FERFJfTEVOXTsKKwlVU0hPUlQgICAgICAgICAgU2VxdWVuY2U7CisJVVNIT1JUICAgICAgICAgIEZyYWc7Cit9IFRVUExFX0NBQ0hFLCAqUFRVUExFX0NBQ0hFOworCisvLworLy8gRnJhZ21lbnQgRnJhbWUgc3RydWN0dXJlCisvLwordHlwZWRlZiBzdHJ1Y3QgIF9GUkFHTUVOVF9GUkFNRSB7CisJUE5ESVNfUEFDS0VUICAgIHBGcmFnUGFja2V0OworCVVMT05HICAgICAgIFJ4U2l6ZTsKKwlVU0hPUlQgICAgICBTZXF1ZW5jZTsKKwlVU0hPUlQgICAgICBMYXN0RnJhZzsKKwlVTE9ORyAgICAgICBGbGFnczsgICAgICAgICAgLy8gU29tZSBleHRyYSBmcmFtZSBpbmZvcm1hdGlvbi4gYml0IDA6IExMQyBwcmVzZW50ZWQKK30gRlJBR01FTlRfRlJBTUUsICpQRlJBR01FTlRfRlJBTUU7CisKKworLy8KKy8vIFBhY2tldCBpbmZvcm1hdGlvbiBmb3IgTmRpc1F1ZXJ5UGFja2V0CisvLwordHlwZWRlZiBzdHJ1Y3QgIF9QQUNLRVRfSU5GTyAgICB7CisJVUlOVCAgICAgICAgICAgIFBoeXNpY2FsQnVmZmVyQ291bnQ7ICAgIC8vIFBoeXNpY2FsIGJyZWFrcyBvZiBidWZmZXIgZGVzY3JpcG9yIGNoYWluZWQKKwlVSU5UICAgICAgICAgICAgQnVmZmVyQ291bnQgOyAgICAgICAgICAgLy8gTnVtYmVyIG9mIEJ1ZmZlciBkZXNjcmlwdG9yIGNoYWluZWQKKwlVSU5UICAgICAgICAgICAgVG90YWxQYWNrZXRMZW5ndGggOyAgICAgLy8gU2VsZiBleHBsYWluZWQKKwlQTkRJU19CVUZGRVIgICAgcEZpcnN0QnVmZmVyOyAgICAgICAgICAgLy8gUG9pbnRlciB0byBmaXJzdCBidWZmZXIgZGVzY3JpcHRvcgorfSBQQUNLRVRfSU5GTywgKlBQQUNLRVRfSU5GTzsKKworLy8KKy8vIFRraXAgS2V5IHN0cnVjdHVyZSB3aGljaCBSQzQga2V5ICYgTUlDIGNhbGN1bGF0aW9uCisvLwordHlwZWRlZiBzdHJ1Y3QgIF9US0lQX0tFWV9JTkZPICB7CisJVUlOVCAgICAgICAgbkJ5dGVzSW5NOyAgLy8gIyBieXRlcyBpbiBNIGZvciBNSUNLRVkKKwlVTE9ORyAgICAgICBJVjE2OworCVVMT05HICAgICAgIElWMzI7CisJVUxPTkcgICAgICAgSzA7ICAgICAgICAgLy8gZm9yIE1JQ0tFWSBMb3cKKwlVTE9ORyAgICAgICBLMTsgICAgICAgICAvLyBmb3IgTUlDS0VZIEhpZworCVVMT05HICAgICAgIEw7ICAgICAgICAgIC8vIEN1cnJlbnQgc3RhdGUgZm9yIE1JQ0tFWQorCVVMT05HICAgICAgIFI7ICAgICAgICAgIC8vIEN1cnJlbnQgc3RhdGUgZm9yIE1JQ0tFWQorCVVMT05HICAgICAgIE07ICAgICAgICAgIC8vIE1lc3NhZ2UgYWNjdW11bGF0b3IgZm9yIE1JQ0tFWQorCVVDSEFSICAgICAgIFJDNEtFWVsxNl07CisJVUNIQVIgICAgICAgTUlDWzhdOworfSBUS0lQX0tFWV9JTkZPLCAqUFRLSVBfS0VZX0lORk87CisKKy8vCisvLyBQcml2YXRlIC8gTWlzYyBkYXRhLCBjb3VudGVycyBmb3IgZHJpdmVyIGludGVybmFsIHVzZQorLy8KK3R5cGVkZWYgc3RydWN0ICBfX1BSSVZBVEVfU1RSVUMgeworCVVJTlQgICAgICAgU3lzdGVtUmVzZXRDbnQ7ICAgICAgICAgLy8gU3lzdGVtIHJlc2V0IGNvdW50ZXIKKwlVSU5UICAgICAgIFR4UmluZ0Z1bGxDbnQ7ICAgICAgICAgIC8vIFR4IHJpbmcgZnVsbCBvY2N1cnJhbmNlIG51bWJlcgorCVVJTlQgICAgICAgUGh5UnhFcnJDbnQ7ICAgICAgICAgICAgLy8gUEhZIFJ4IGVycm9yIGNvdW50LCBmb3IgZGVidWcgcHVycG9zZSwgbWlnaHQgbW92ZSB0byBnbG9iYWwgY291bnRlcgorCS8vIFZhcmlhYmxlcyBmb3IgV0VQIGVuY3J5cHRpb24gLyBkZWNyeXB0aW9uIGluIHJ0bXBfd2VwLmMKKwlVSU5UICAgICAgIEZDU0NSQzMyOworCUFSQ0ZPVVJDT05URVhUICBXRVBDT05URVhUOworCS8vIFRraXAgc3R1ZmYKKwlUS0lQX0tFWV9JTkZPICAgVHg7CisJVEtJUF9LRVlfSU5GTyAgIFJ4OworfSBQUklWQVRFX1NUUlVDLCAqUFBSSVZBVEVfU1RSVUM7CisKKy8vIHN0cnVjdHVyZSB0byB0dW5lIEJCUCBSNjYgKEJCUCBUVU5JTkcpCit0eXBlZGVmIHN0cnVjdCBfQkJQX1I2Nl9UVU5JTkcgeworCUJPT0xFQU4gICAgIGJFbmFibGU7CisJVVNIT1JUICAgICAgRmFsc2VDY2FMb3dlclRocmVzaG9sZDsgIC8vIGRlZmF1bHQgMTAwCisJVVNIT1JUICAgICAgRmFsc2VDY2FVcHBlclRocmVzaG9sZDsgIC8vIGRlZmF1bHQgNTEyCisJVUNIQVIgICAgICAgUjY2RGVsdGE7CisJVUNIQVIgICAgICAgUjY2Q3VycmVudFZhbHVlOworCUJPT0xFQU4JCVI2Nkxvd2VyVXBwZXJTZWxlY3Q7IC8vQmVmb3JlIExpbmtVcCwgVXNlZCBMb3dlckJvdW5kIG9yIFVwcGVyQm91bmQgYXMgUjY2IHZhbHVlLgorfSBCQlBfUjY2X1RVTklORywgKlBCQlBfUjY2X1RVTklORzsKKworLy8gc3RydWN0dXJlIHRvIHN0b3JlIGNoYW5uZWwgVFggcG93ZXIKK3R5cGVkZWYgc3RydWN0IF9DSEFOTkVMX1RYX1BPV0VSIHsKKwlVU0hPUlQgICAgIFJlbWFpbmluZ1RpbWVGb3JVc2U7CQkvL3VuaXQ6IHNlYworCVVDSEFSICAgICAgQ2hhbm5lbDsKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJQk9PTEVBTiAgICAgICBiRWZmZWN0ZWRDaGFubmVsOwkvLyBGb3IgQlcgNDAgb3BlcmF0aW5nIGluIDIuNEdIeiAsIHRoZSAiZWZmZWN0ZWQgY2hhbm5lbCIgaXMgdGhlIGNoYW5uZWwgdGhhdCBpcyBjb3ZlcmVkIGluIDQwTWh6LgorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKwlDSEFSICAgICAgIFBvd2VyOworCUNIQVIgICAgICAgUG93ZXIyOworCVVDSEFSICAgICAgTWF4VHhQd3I7CisJVUNIQVIgICAgICBEZnNSZXE7Cit9IENIQU5ORUxfVFhfUE9XRVIsICpQQ0hBTk5FTF9UWF9QT1dFUjsKKworLy8gc3RydWN0dXJlIHRvIHN0b3JlIDgwMi4xMWogY2hhbm5lbCBUWCBwb3dlcgordHlwZWRlZiBzdHJ1Y3QgX0NIQU5ORUxfMTFKX1RYX1BPV0VSIHsKKwlVQ0hBUiAgICAgIENoYW5uZWw7CisJVUNIQVIgICAgICBCVzsJLy8gQldfMTAgb3IgQldfMjAKKwlDSEFSICAgICAgIFBvd2VyOworCUNIQVIgICAgICAgUG93ZXIyOworCVVTSE9SVCAgICAgUmVtYWluaW5nVGltZUZvclVzZTsJCS8vdW5pdDogc2VjCit9IENIQU5ORUxfMTFKX1RYX1BPV0VSLCAqUENIQU5ORUxfMTFKX1RYX1BPV0VSOworCit0eXBlZGVmIGVudW0gX0FCR0JBTkRfU1RBVEVfIHsKKwlVTktOT1dOX0JBTkQsCisJQkdfQkFORCwKKwlBX0JBTkQsCit9IEFCR0JBTkRfU1RBVEU7CisKK3R5cGVkZWYgc3RydWN0IF9NTE1FX1NUUlVDVCB7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJLy8gU1RBIHN0YXRlIG1hY2hpbmVzCisJU1RBVEVfTUFDSElORSAgICAgICAgICAgQ250bE1hY2hpbmU7CisJU1RBVEVfTUFDSElORSAgICAgICAgICAgQXNzb2NNYWNoaW5lOworCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIEF1dGhNYWNoaW5lOworCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIEF1dGhSc3BNYWNoaW5lOworCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIFN5bmNNYWNoaW5lOworCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIFdwYVBza01hY2hpbmU7CisJU1RBVEVfTUFDSElORSAgICAgICAgICAgTGVhcE1hY2hpbmU7CisJU1RBVEVfTUFDSElORSAgICAgICAgICAgQWlyb25ldE1hY2hpbmU7CisJU1RBVEVfTUFDSElORV9GVU5DICAgICAgQXNzb2NGdW5jW0FTU09DX0ZVTkNfU0laRV07CisJU1RBVEVfTUFDSElORV9GVU5DICAgICAgQXV0aEZ1bmNbQVVUSF9GVU5DX1NJWkVdOworCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIEF1dGhSc3BGdW5jW0FVVEhfUlNQX0ZVTkNfU0laRV07CisJU1RBVEVfTUFDSElORV9GVU5DICAgICAgU3luY0Z1bmNbU1lOQ19GVU5DX1NJWkVdOworCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIFdwYVBza0Z1bmNbV1BBX1BTS19GVU5DX1NJWkVdOworCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIEFpcm9uZXRGdW5jW0FJUk9ORVRfRlVOQ19TSVpFXTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlTVEFURV9NQUNISU5FX0ZVTkMgICAgICBBY3RGdW5jW0FDVF9GVU5DX1NJWkVdOworCS8vIEFjdGlvbgorCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIEFjdE1hY2hpbmU7CisKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCVNUQVRFX01BQ0hJTkUJCQlEbHNNYWNoaW5lOworCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIERsc0Z1bmNbRExTX0ZVTkNfU0laRV07CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKworCisKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBDaGFubmVsUXVhbGl0eTsgIC8vIDAuLjEwMCwgQ2hhbm5lbCBRdWFsaXR5IEluZGljYXRpb24gZm9yIFJvYW1pbmcKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBOb3czMjsgICAgICAgICAgIC8vIGxhdGNoIHRoZSB2YWx1ZSBvZiBOZGlzR2V0U3lzdGVtVXBUaW1lKCkKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBMYXN0U2VuZE5VTExwc21UaW1lOworCisJQk9PTEVBTiAgICAgICAgICAgICAgICAgYlJ1bm5pbmc7CisJTkRJU19TUElOX0xPQ0sgICAgICAgICAgVGFza0xvY2s7CisJTUxNRV9RVUVVRSAgICAgICAgICAgICAgUXVldWU7CisKKwlVSU5UICAgICAgICAgICAgICAgICAgICBTaGlmdFJlZzsKKworCVJBTElOS19USU1FUl9TVFJVQ1QgICAgIFBlcmlvZGljVGltZXI7CisJUkFMSU5LX1RJTUVSX1NUUlVDVCAgICAgQVBTRFBlcmlvZGljVGltZXI7CisJUkFMSU5LX1RJTUVSX1NUUlVDVCAgICAgTGlua0Rvd25UaW1lcjsKKwlSQUxJTktfVElNRVJfU1RSVUNUICAgICBMaW5rVXBUaW1lcjsKKyNpZmRlZiBSVDI4NjAKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICBiUHNQb2xsVGltZXJSdW5uaW5nOworICAgIFJBTElOS19USU1FUl9TVFJVQ1QgICAgIFBzUG9sbFRpbWVyOworCVJBTElOS19USU1FUl9TVFJVQ1QgICAgIFJhZGlvT25PZmZUaW1lcjsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwlVTE9ORyAgICAgICAgICAgICAgICAgICBQZXJpb2RpY1JvdW5kOworCVVMT05HICAgICAgICAgICAgICAgICAgIE9uZVNlY1BlcmlvZGljUm91bmQ7CisKKwlVQ0hBUgkJCQkJUmVhbFJ4UGF0aDsKKwlCT09MRUFOCQkJCQliTG93VGhyb3VnaHB1dDsKKwlCT09MRUFOCQkJCQliRW5hYmxlQXV0b0FudGVubmFDaGVjazsKKwlSQUxJTktfVElNRVJfU1RSVUNUCQlSeEFudEV2YWxUaW1lcjsKKworCit9IE1MTUVfU1RSVUNULCAqUE1MTUVfU1RSVUNUOworCisvLyBzdHJ1Y3R1cmUgZm9yIHJhZGFyIGRldGVjdGlvbiBhbmQgY2hhbm5lbCBzd2l0Y2gKK3R5cGVkZWYgc3RydWN0IF9SQURBUl9ERVRFQ1RfU1RSVUNUIHsKKwlVQ0hBUgkJQ1NDb3VudDsJCQkvL0NoYW5uZWwgc3dpdGNoIGNvdW50ZXIKKwlVQ0hBUgkJQ1NQZXJpb2Q7CQkJLy9DaGFubmVsIHN3aXRjaCBwZXJpb2QgKGJlYWNvbiBjb3VudCkKKwlVQ0hBUgkJUkRDb3VudDsJCQkvL1JhZGFyIGRldGVjdGlvbiBjb3VudGVyCisJVUNIQVIJCVJETW9kZTsJCQkJLy9SYWRhciBEZXRlY3Rpb24gbW9kZQorCVVDSEFSCQlSRER1clJlZ2lvbjsJCS8vUmFkYXIgZGV0ZWN0aW9uIGR1cmF0aW9uIHJlZ2lvbgorCVVDSEFSCQlCQlBSMTY7CisJVUNIQVIJCUJCUFIxNzsKKwlVQ0hBUgkJQkJQUjE4OworCVVDSEFSCQlCQlBSMjE7CisJVUNIQVIJCUJCUFIyMjsKKwlVQ0hBUgkJQkJQUjY0OworCVVMT05HCQlJblNlcnZpY2VNb25pdG9yQ291bnQ7IC8vIHVuaXQ6IHNlYworCVVJTlQ4CQlEZnNTZXNzaW9uVGltZTsKKwlCT09MRUFOCQliRmFzdERmczsKKwlVSU5UOAkJQ2hNb3ZpbmdUaW1lOworCVVJTlQ4CQlMb25nUHVsc2VSYWRhclRoOworfSBSQURBUl9ERVRFQ1RfU1RSVUNULCAqUFJBREFSX0RFVEVDVF9TVFJVQ1Q7CisKKyNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCit0eXBlZGVmIGVudW0gQ0RfU1RBVEVfbgoreworCUNEX05PUk1BTCwKKwlDRF9TSUxFTkNFLAorCUNEX01BWF9TVEFURQorfSBDRF9TVEFURTsKKwordHlwZWRlZiBzdHJ1Y3QgQ0FSUklFUl9ERVRFQ1RJT05fcworeworCUJPT0xFQU4JCQkJCUVuYWJsZTsKKwlVSU5UOAkJCQkJQ0RTZXNzaW9uVGltZTsKKwlVSU5UOAkJCQkJQ0RQZXJpb2Q7CisJQ0RfU1RBVEUJCQkJQ0RfU3RhdGU7Cit9IENBUlJJRVJfREVURUNUSU9OLCAqUENBUlJJRVJfREVURUNUSU9OOworI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKwordHlwZWRlZiBlbnVtIF9SRUNfQkxPQ0tBQ0tfU1RBVFVTCit7CisgICAgUmVjaXBpZW50X05PTkU9MCwKKwlSZWNpcGllbnRfVVNFRCwKKwlSZWNpcGllbnRfSGFuZGxlUmVzLAorICAgIFJlY2lwaWVudF9BY2NlcHQKK30gUkVDX0JMT0NLQUNLX1NUQVRVUywgKlBSRUNfQkxPQ0tBQ0tfU1RBVFVTOworCit0eXBlZGVmIGVudW0gX09SSV9CTE9DS0FDS19TVEFUVVMKK3sKKyAgICBPcmlnaW5hdG9yX05PTkU9MCwKKwlPcmlnaW5hdG9yX1VTRUQsCisgICAgT3JpZ2luYXRvcl9XYWl0UmVzLAorICAgIE9yaWdpbmF0b3JfRG9uZQorfSBPUklfQkxPQ0tBQ0tfU1RBVFVTLCAqUE9SSV9CTE9DS0FDS19TVEFUVVM7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK3R5cGVkZWYgc3RydWN0IF9CQV9PUklfRU5UUll7CisJVUNIQVIgICBXY2lkOworCVVDSEFSICAgVElEOworCVVDSEFSICAgQkFXaW5TaXplOworCVVDSEFSICAgVG9rZW47CisvLyBTZXF1ZW5jZSBpcyB0byBmaWxsIGV2ZXJ5IG91dGdvaW5nIFFvUyBEQVRBIGZyYW1lJ3Mgc2VxdWVuY2UgZmllbGQgaW4gODAyLjExIGhlYWRlci4KKwlVU0hPUlQJU2VxdWVuY2U7CisJVVNIT1JUCVRpbWVPdXRWYWx1ZTsKKwlPUklfQkxPQ0tBQ0tfU1RBVFVTICBPUklfQkFfU3RhdHVzOworCVJBTElOS19USU1FUl9TVFJVQ1QgT1JJQkFUaW1lcjsKKwlQVk9JRAlwQWRhcHRlcjsKK30gQkFfT1JJX0VOVFJZLCAqUEJBX09SSV9FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgX0JBX1JFQ19FTlRSWSB7CisJVUNIQVIgICBXY2lkOworCVVDSEFSICAgVElEOworCVVDSEFSICAgQkFXaW5TaXplOwkvLyA3LjMuMS4xNC4gZWFjaCBidWZmZXIgaXMgY2FwYWJsZSBvZiBob2xkaW5nIGEgbWF4IEFNU0RVIG9yIE1TRFUuCisJVVNIT1JUCQlMYXN0SW5kU2VxOworCVVTSE9SVAkJVGltZU91dFZhbHVlOworCVJBTElOS19USU1FUl9TVFJVQ1QgUkVDQkFUaW1lcjsKKwlVTE9ORwkJTGFzdEluZFNlcUF0VGltZXI7CisJVUxPTkcJCW5Ecm9wUGFja2V0OworCVVMT05HCQlyY3ZTZXE7CisJUkVDX0JMT0NLQUNLX1NUQVRVUyAgUkVDX0JBX1N0YXR1czsKKwlORElTX1NQSU5fTE9DSyAgICAgICAgICBSeFJlUmluZ0xvY2s7ICAgICAgICAgICAgICAgICAvLyBSeCBSaW5nIHNwaW5sb2NrCisJUFZPSUQJcEFkYXB0ZXI7CisJc3RydWN0IHJlb3JkZXJpbmdfbGlzdAlsaXN0OworfSBCQV9SRUNfRU5UUlksICpQQkFfUkVDX0VOVFJZOworCisKK3R5cGVkZWYgc3RydWN0IHsKKwlVTE9ORwkJbnVtQXNSZWNpcGllbnQ7CQkvLyBJIGFtIHJlY2lwaWVudCBvZiBudW1Bc1JlY2lwaWVudCBjbGllbnRzLiBUaGVzZSBjbGllbnQgYXJlIGluIHRoZSBCQVJlY0VudHJ5W10KKwlVTE9ORwkJbnVtQXNPcmlnaW5hdG9yOwkvLyBJIGFtIG9yaWdpbmF0b3Igb2YgCW51bUFzT3JpZ2luYXRvciBjbGllbnRzLiBUaGVzZSBjbGllbnRzIGFyZSBpbiB0aGUgQkFPcmlFbnRyeVtdCisJQkFfT1JJX0VOVFJZICAgICAgIEJBT3JpRW50cnlbTUFYX0xFTl9PRl9CQV9PUklfVEFCTEVdOworCUJBX1JFQ19FTlRSWSAgICAgICBCQVJlY0VudHJ5W01BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFXTsKK30gQkFfVEFCTEUsICpQQkFfVEFCTEU7CisKKy8vRm9yIFF1cmV5QkFUYWJsZU9JRCB1c2U7Cit0eXBlZGVmIHN0cnVjdCAgUEFDS0VEIF9PSURfQkFfUkVDX0VOVFJZeworCVVDSEFSICAgTUFDQWRkcltNQUNfQUREUl9MRU5dOworCVVDSEFSICAgQmFCaXRtYXA7ICAgLy8gaWYgKEJhQml0bWFwJigxPDxUSUQpKSwgdGhpcyBzZXNzaW9uIHdpdGh7TUFDQWRkciwgVElEfWV4aXN0cywgc28gcmVhZCBCdWZTaXplW1RJRF0gZm9yIEJ1ZmZlclNpemUKKwlVQ0hBUiAgIHJzdjsKKwlVQ0hBUiAgIEJ1ZlNpemVbOF07CisJUkVDX0JMT0NLQUNLX1NUQVRVUwlSRUNfQkFfU3RhdHVzWzhdOworfSBPSURfQkFfUkVDX0VOVFJZLCAqUE9JRF9CQV9SRUNfRU5UUlk7CisKKy8vRm9yIFF1cmV5QkFUYWJsZU9JRCB1c2U7Cit0eXBlZGVmIHN0cnVjdCAgUEFDS0VEIF9PSURfQkFfT1JJX0VOVFJZeworCVVDSEFSICAgTUFDQWRkcltNQUNfQUREUl9MRU5dOworCVVDSEFSICAgQmFCaXRtYXA7ICAvLyBpZiAoQmFCaXRtYXAmKDE8PFRJRCkpLCB0aGlzIHNlc3Npb24gd2l0aHtNQUNBZGRyLCBUSUR9ZXhpc3RzLCBzbyByZWFkIEJ1ZlNpemVbVElEXSBmb3IgQnVmZmVyU2l6ZSwgcmVhZCBPUklfQkFfU3RhdHVzW1RJRF0gZm9yIHN0YXR1cworCVVDSEFSICAgcnN2OworCVVDSEFSICAgQnVmU2l6ZVs4XTsKKwlPUklfQkxPQ0tBQ0tfU1RBVFVTICBPUklfQkFfU3RhdHVzWzhdOworfSBPSURfQkFfT1JJX0VOVFJZLCAqUE9JRF9CQV9PUklfRU5UUlk7CisKK3R5cGVkZWYgc3RydWN0IF9RVUVSWUJBX1RBQkxFeworCU9JRF9CQV9PUklfRU5UUlkgICAgICAgQkFPcmlFbnRyeVszMl07CisJT0lEX0JBX1JFQ19FTlRSWSAgICAgICBCQVJlY0VudHJ5WzMyXTsKKwlVQ0hBUiAgIE9yaU51bTsvLyBOdW1iZXIgb2YgYmVsb3cgQkFPcmlFbnRyeQorCVVDSEFSICAgUmVjTnVtOy8vIE51bWJlciBvZiBiZWxvdyBCQVJlY0VudHJ5Cit9IFFVRVJZQkFfVEFCTEUsICpQUVVFUllCQV9UQUJMRTsKKwordHlwZWRlZgl1bmlvbglfQkFDQVBfU1RSVUMJeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlzdHJ1Y3QJeworCQlVSU5UMzIgICAgIDo0OworCQlVSU5UMzIgICAgIGIyMDQwQ29leGlzdFNjYW5TdXA6MTsJCS8vQXMgU3RhLCBzdXBwb3J0IGRvIDIwNDAgY29leGlzdGVuY2Ugc2NhbiBmb3IgQVAuIEFzIEFwLCBzdXBwb3J0IG1vbml0b3IgdHJpZ2dlciBldmVudCB0byBjaGVjayBpZiBjYW4gdXNlIEJXIDQwTUh6LgorCQlVSU5UMzIgICAgIGJIdEFkaG9jOjE7CQkJLy8gYWRob2MgY2FuIHVzZSBodCByYXRlLgorCQlVSU5UMzIgICAgIE1NUFNtb2RlOjI7CS8vIE1JTU8gcG93ZXIgc2F2ZSBtb3JlLCAwOnN0YXRpYywgMTpkeW5hbWljLCAyOnJzdiwgMzptaW1vIGVuYWJsZQorCQlVSU5UMzIgICAgIEFtc2R1U2l6ZToxOwkvLyAwOjM4MzksIDE6NzkzNSBieXRlcy4gVUlOVCAgTVNEVVNpemVUb0J5dGVzW10JPSB7IDM4MzksIDc5MzV9OworCQlVSU5UMzIgICAgIEFtc2R1RW5hYmxlOjE7CS8vRW5hYmxlIEFNU0RVIHRyYW5zbWlzc3Rpb24KKwkJVUlOVDMyCQlNcGR1RGVuc2l0eTozOworCQlVSU5UMzIJCVBvbGljeToyOwkvLyAwOiBERUxBWV9CQSAxOklNTUVEX0JBICAoLy9CQSBQb2xpY3kgc3ViZmlsZWQgdmFsdWUgaW4gQUREQkEgZnJhbWUpICAgMjpCQS1ub3QgdXNlCisJCVVJTlQzMgkJQXV0b0JBOjE7CS8vIGF1dG9tYXRpY2FsbHkgQkEKKwkJVUlOVDMyCQlUeEJBV2luTGltaXQ6ODsKKwkJVUlOVDMyCQlSeEJBV2luTGltaXQ6ODsKKwl9CWZpZWxkOworI2Vsc2UKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVJ4QkFXaW5MaW1pdDo4OworCQlVSU5UMzIJCVR4QkFXaW5MaW1pdDo4OworCQlVSU5UMzIJCUF1dG9CQToxOwkvLyBhdXRvbWF0aWNhbGx5IEJBCisJCVVJTlQzMgkJUG9saWN5OjI7CS8vIDA6IERFTEFZX0JBIDE6SU1NRURfQkEgICgvL0JBIFBvbGljeSBzdWJmaWxlZCB2YWx1ZSBpbiBBRERCQSBmcmFtZSkgICAyOkJBLW5vdCB1c2UKKwkJVUlOVDMyCQlNcGR1RGVuc2l0eTozOworCQlVSU5UMzIgICAgICAgCUFtc2R1RW5hYmxlOjE7CS8vRW5hYmxlIEFNU0RVIHRyYW5zbWlzc3Rpb24KKwkJVUlOVDMyICAgICAgIAlBbXNkdVNpemU6MTsJLy8gMDozODM5LCAxOjc5MzUgYnl0ZXMuIFVJTlQgIE1TRFVTaXplVG9CeXRlc1tdCT0geyAzODM5LCA3OTM1fTsKKwkJVUlOVDMyICAgICAgIAlNTVBTbW9kZToyOwkvLyBNSU1PIHBvd2VyIHNhdmUgbW9yZSwgMDpzdGF0aWMsIDE6ZHluYW1pYywgMjpyc3YsIDM6bWltbyBlbmFibGUKKwkJVUlOVDMyICAgICAgIAliSHRBZGhvYzoxOwkJCS8vIGFkaG9jIGNhbiB1c2UgaHQgcmF0ZS4KKwkJVUlOVDMyICAgICAgIAliMjA0MENvZXhpc3RTY2FuU3VwOjE7CQkvL0FzIFN0YSwgc3VwcG9ydCBkbyAyMDQwIGNvZXhpc3RlbmNlIHNjYW4gZm9yIEFQLiBBcyBBcCwgc3VwcG9ydCBtb25pdG9yIHRyaWdnZXIgZXZlbnQgdG8gY2hlY2sgaWYgY2FuIHVzZSBCVyA0ME1Iei4KKwkJVUlOVDMyICAgICAgIAk6NDsKKwl9CWZpZWxkOworI2VuZGlmCisJVUlOVDMyCQkJd29yZDsKK30gQkFDQVBfU1RSVUMsICpQQkFDQVBfU1RSVUM7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKy8vVGhpcyBzdHJ1Y3R1cmUgaXMgZm9yIGFsbCA4MDIuMTFuIGNhcmQgSW50ZXJPcHRpYmlsaXR5VGVzdCBhY3Rpb24uIFJlc2V0IGFsbCBOdW0gZXZlcnkgbiBzZWNvbmQuICAoRGV0YWlscyBzZWUgTUxNRVBlcmlvZGljKQordHlwZWRlZglzdHJ1Y3QJX0lPVF9TVFJVQwl7CisJVUNIQVIJCQlUaHJlc2hvbGRbMl07CisJVUNIQVIJCQlSZW9yZGVyVGltZU91dE51bVtNQVhfTEVOX09GX0JBX1JFQ19UQUJMRV07CS8vIGNvbXBhcmUgd2l0aCB0aHJlc2hvbGRbMF0KKwlVQ0hBUgkJCVJlZnJlc2hOdW1bTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEVdOwkvLyBjb21wYXJlIHdpdGggdGhyZXNob2xkWzFdCisJVUxPTkcJCQlPbmVTZWNJbldpbmRvd0NvdW50OworCVVMT05HCQkJT25lU2VjRnJhbWVEdXBsaWNhdGVDb3VudDsKKwlVTE9ORwkJCU9uZVNlY091dFdpbmRvd0NvdW50OworCVVDSEFSCQkJRGVsT3JpQWN0OworCVVDSEFSCQkJRGVsUmVjQWN0OworCVVDSEFSCQkJUlRTU2hvcnRQcm90OworCVVDSEFSCQkJUlRTTG9uZ1Byb3Q7CisJQk9PTEVBTgkJCWJSVFNMb25nUHJvdE9uOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUJPT0xFQU4JCQliTGFzdEF0aGVyb3M7CisgICAgQk9PTEVBTgkJCWJDdXJyZW50QXRoZXJvczsKKyAgICBCT09MRUFOICAgICAgICAgYk5vd0F0aGVyb3NCdXJzdE9uOworCUJPT0xFQU4JCQliTmV4dERpc2FibGVSeEJBOworICAgIEJPT0xFQU4JCQliVG9nZ2xlOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworfSBJT1RfU1RSVUMsICpQSU9UX1NUUlVDOworCisvLyBUaGlzIGlzIHRoZSByZWdpc3RyeSBzZXR0aW5nIGZvciA4MDIuMTFuIHRyYW5zbWl0IHNldHRpbmcuICBVc2VkIGluIGFkdmFuY2VkIHBhZ2UuCit0eXBlZGVmIHVuaW9uIF9SRUdfVFJBTlNNSVRfU0VUVElORyB7CisjaWZkZWYgUlRfQklHX0VORElBTgorIHN0cnVjdCB7CisgICAgICAgICBVSU5UMzIgIHJzdjoxMzsKKwkJIFVJTlQzMiAgRVhUQ0hBOjI7CisJCSBVSU5UMzIgIEhUTU9ERToxOworCQkgVUlOVDMyICBUUkFOU05POjI7CisJCSBVSU5UMzIgIFNUQkM6MTsgLy9TUEFDRQorCQkgVUlOVDMyICBTaG9ydEdJOjE7CisJCSBVSU5UMzIgIEJXOjE7IC8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6CisJCSBVSU5UMzIgIFR4QkY6MTsgLy8gMyozCisJCSBVSU5UMzIgIHJzdjA6MTA7CisgICAgfSBmaWVsZDsKKyNlbHNlCisgc3RydWN0IHsKKwkJIFVJTlQzMiAgcnN2MDoxMDsKKwkJIFVJTlQzMiAgVHhCRjoxOworICAgICAgICAgVUlOVDMyICBCVzoxOyAvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegorICAgICAgICAgVUlOVDMyICBTaG9ydEdJOjE7CisgICAgICAgICBVSU5UMzIgIFNUQkM6MTsgLy9TUEFDRQorICAgICAgICAgVUlOVDMyICBUUkFOU05POjI7CisgICAgICAgICBVSU5UMzIgIEhUTU9ERToxOworICAgICAgICAgVUlOVDMyICBFWFRDSEE6MjsKKyAgICAgICAgIFVJTlQzMiAgcnN2OjEzOworICAgIH0gZmllbGQ7CisjZW5kaWYKKyBVSU5UMzIgICB3b3JkOworfSBSRUdfVFJBTlNNSVRfU0VUVElORywgKlBSRUdfVFJBTlNNSVRfU0VUVElORzsKKwordHlwZWRlZiB1bmlvbiAgX0RFU0lSRURfVFJBTlNNSVRfU0VUVElORyB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCXN0cnVjdAl7CisJCQlVU0hPUlQJCXJzdjozOworCQkJVVNIT1JUCQlGaXhlZFR4TW9kZToyOwkJCS8vIElmIE1DUyBpc24ndCBBVVRPLCBmaXggcmF0ZSBpbiBDQ0ssIE9GRE0gb3IgSFQgbW9kZS4KKwkJCVVTSE9SVAkJUGh5TW9kZTo0OworCQkJVVNIT1JUICAgCU1DUzo3OyAgICAgICAgICAgICAgICAgLy8gTUNTCisJfQlmaWVsZDsKKyNlbHNlCisJc3RydWN0CXsKKwkJCVVTSE9SVCAgIAlNQ1M6NzsgICAgICAgICAgICAgICAgIAkvLyBNQ1MKKwkJCVVTSE9SVAkJUGh5TW9kZTo0OworCQkJVVNIT1JUCSAJRml4ZWRUeE1vZGU6MjsJCQkvLyBJZiBNQ1MgaXNuJ3QgQVVUTywgZml4IHJhdGUgaW4gQ0NLLCBPRkRNIG9yIEhUIG1vZGUuCisJCQlVU0hPUlQJCXJzdjozOworCX0JZmllbGQ7CisjZW5kaWYKKwlVU0hPUlQJCXdvcmQ7CisgfSBERVNJUkVEX1RSQU5TTUlUX1NFVFRJTkcsICpQREVTSVJFRF9UUkFOU01JVF9TRVRUSU5HOworCit0eXBlZGVmIHN0cnVjdCB7CisJQk9PTEVBTgkJSXNSZWNpcGllbnQ7CisJVUNIQVIgICBNQUNBZGRyW01BQ19BRERSX0xFTl07CisJVUNIQVIgICBUSUQ7CisJVUNIQVIgICBuTVNEVTsKKwlVU0hPUlQgICBUaW1lT3V0OworCUJPT0xFQU4gYkFsbFRpZDsgIC8vIElmIFRydWUsIGRlbGV0ZSBhbGwgVElEIGZvciBCQSBzZXNzaW9ucyB3aXRoIHRoaXMgTUFDYWRkci4KK30gT0lEX0FERF9CQV9FTlRSWSwgKlBPSURfQUREX0JBX0VOVFJZOworCisvLworLy8gTXVsdGlwbGUgU1NJRCBzdHJ1Y3R1cmUKKy8vCisjZGVmaW5lIFdMQU5fTUFYX05VTV9PRl9USU0JCQkoKE1BWF9MRU5fT0ZfTUFDX1RBQkxFID4+IDMpICsgMSkgLyogLzggKyAxICovCisjZGVmaW5lIFdMQU5fQ1RfVElNX0JDTUNfT0ZGU0VUCQkwIC8qIHVuaXQ6IDMyQiAqLworCisvKiBjbGVhciBiY21jIFRJTSBiaXQgKi8KKyNkZWZpbmUgV0xBTl9NUl9USU1fQkNNQ19DTEVBUihhcGlkeCkgXAorCXBBZC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5UaW1CaXRtYXBzW1dMQU5fQ1RfVElNX0JDTUNfT0ZGU0VUXSAmPSB+QklUOFswXTsKKworLyogc2V0IGJjbWMgVElNIGJpdCAqLworI2RlZmluZSBXTEFOX01SX1RJTV9CQ01DX1NFVChhcGlkeCkgXAorCXBBZC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5UaW1CaXRtYXBzW1dMQU5fQ1RfVElNX0JDTUNfT0ZGU0VUXSB8PSBCSVQ4WzBdOworCisvKiBjbGVhciBhIHN0YXRpb24gUFMgVElNIGJpdCAqLworI2RlZmluZSBXTEFOX01SX1RJTV9CSVRfQ0xFQVIoYWRfcCwgYXBpZHgsIHdjaWQpIFwKKwl7CVVDSEFSIHRpbV9vZmZzZXQgPSB3Y2lkID4+IDM7IFwKKwkJVUNIQVIgYml0X29mZnNldCA9IHdjaWQgJiAweDc7IFwKKwkJYWRfcC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5UaW1CaXRtYXBzW3RpbV9vZmZzZXRdICY9ICh+QklUOFtiaXRfb2Zmc2V0XSk7IH0KKworLyogc2V0IGEgc3RhdGlvbiBQUyBUSU0gYml0ICovCisjZGVmaW5lIFdMQU5fTVJfVElNX0JJVF9TRVQoYWRfcCwgYXBpZHgsIHdjaWQpIFwKKwl7CVVDSEFSIHRpbV9vZmZzZXQgPSB3Y2lkID4+IDM7IFwKKwkJVUNIQVIgYml0X29mZnNldCA9IHdjaWQgJiAweDc7IFwKKwkJYWRfcC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5UaW1CaXRtYXBzW3RpbV9vZmZzZXRdIHw9IEJJVDhbYml0X29mZnNldF07IH0KKworCit0eXBlZGVmIHN0cnVjdCBfTVVMVElTU0lEX1NUUlVDVCB7CisJVUNIQVIJCQkJCQkJCUJzc2lkW01BQ19BRERSX0xFTl07CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3NpZExlbjsKKyAgICBDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07CisgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwYWJpbGl0eUluZm87CisKKyAgICBQTkVUX0RFViAgICAgICAgICAgICAgICAgICAJCQlNU1NJRERldjsKKworCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgICAgIEF1dGhNb2RlOworCU5ESVNfODAyXzExX1dFUF9TVEFUVVMgICAgICAgICAgICAgIFdlcFN0YXR1czsKKwlORElTXzgwMl8xMV9XRVBfU1RBVFVTCQkJCUdyb3VwS2V5V2VwU3RhdHVzOworCVdQQV9NSVhfUEFJUl9DSVBIRVIJCQkJCVdwYU1peFBhaXJDaXBoZXI7CisKKwlVTE9ORwkJCQkJCQkJVHhDb3VudDsKKwlVTE9ORwkJCQkJCQkJUnhDb3VudDsKKwlVTE9ORwkJCQkJCQkJUmVjZWl2ZWRCeXRlQ291bnQ7CisJVUxPTkcJCQkJCQkJCVRyYW5zbWl0dGVkQnl0ZUNvdW50OworCVVMT05HCQkJCQkJCQlSeEVycm9yQ291bnQ7CisJVUxPTkcJCQkJCQkJCVJ4RHJvcENvdW50OworCisJSFRUUkFOU01JVF9TRVRUSU5HCQkJCQlIVFBoeU1vZGUsIE1heEhUUGh5TW9kZSwgTWluSFRQaHlNb2RlOy8vIEZvciB0cmFuc21pdCBwaHkgc2V0dGluZyBpbiBUWFdJLgorCVJUX0hUX1BIWV9JTkZPCQkJCQkJRGVzaXJlZEh0UGh5SW5mbzsKKwlERVNJUkVEX1RSQU5TTUlUX1NFVFRJTkcgICAgICAgIAlEZXNpcmVkVHJhbnNtaXRTZXR0aW5nOyAvLyBEZXNpcmVkIHRyYW5zbWl0IHNldHRpbmcuIHRoaXMgaXMgZm9yIHJlYWRpbmcgcmVnaXN0cnkgc2V0dGluZyBvbmx5LiBub3QgdXNlZnVsLgorCUJPT0xFQU4JCQkJCQkJCWJBdXRvVHhSYXRlU3dpdGNoOworCisJVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdEtleUlkOworCisJVUNIQVIJCQkJCQkJCVR4UmF0ZTsgICAgICAgLy8gUkFURV8xLCBSQVRFXzIsIFJBVEVfNV81LCBSQVRFXzExLCAuLi4KKwlVQ0hBUiAgICAgCQkJCQkJCURlc2lyZWRSYXRlc1tNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107Ly8gT0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTCisJVUNIQVIJCQkJCQkJCURlc2lyZWRSYXRlc0luZGV4OworCVVDSEFSICAgICAJCQkJCQkJTWF4VHhSYXRlOyAgICAgICAgICAgIC8vIFJBVEVfMSwgUkFURV8yLCBSQVRFXzVfNSwgUkFURV8xMQorCisJVUNIQVIJCQkJCQkJCVRpbUJpdG1hcHNbV0xBTl9NQVhfTlVNX09GX1RJTV07CisKKyAgICAvLyBXUEEKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTUtbMzJdOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNS1szMl07CisJVUNIQVIJCQkJCQkJCUdUS1szMl07CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTgwMjFYOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZUF1dGg7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR05vbmNlWzMyXTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0U2VjdXJlZDsKKyAgICBORElTXzgwMl8xMV9QUklWQUNZX0ZJTFRFUiAgICAgICAgICBQcml2YWN5RmlsdGVyOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBTkNsYXNzM0RhdGE7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNvbGF0ZUludGVyU3RhVHJhZmZpYzsKKworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJTTklFX0xlblsyXTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSU05fSUVbMl1bTUFYX0xFTl9PRl9SU05JRV07CisKKworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgIAkJCVRpbUlFTG9jYXRpb25JbkJlYWNvbjsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAJCQlDYXBhYmlsaXR5SW5mb0xvY2F0aW9uSW5CZWFjb247CisgICAgLy8gb3V0Z29pbmcgQkVBQ09OIGZyYW1lIGJ1ZmZlciBhbmQgY29ycmVzcG9uZGluZyBUWFdJCisJLy8gUFRYV0lfU1RSVUMgICAgICAgICAgICAgICAgICAgICAgICAgICBCZWFjb25UeFdJOyAvLworICAgIENIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJlYWNvbkJ1ZltNQVhfQkVBQ09OX1NJWkVdOyAvLyBOT1RFOiBCZWFjb25CdWYgc2hvdWxkIGJlIDQtYnl0ZSBhbGlnbmVkCisKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSGlkZVNzaWQ7CisJVUlOVDE2CQkJCQkJCQlTdGF0aW9uS2VlcEFsaXZlVGltZTsgLy8gdW5pdDogc2Vjb25kCisKKyAgICBVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWTEFOX1ZJRDsKKyAgICBVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWTEFOX1ByaW9yaXR5OworCisgICAgUlRfODAyXzExX0FDTAkJCQkJCUFjY2Vzc0NvbnRyb2xMaXN0OworCisJLy8gRURDQSBRb3MKKyAgICBCT09MRUFOCQkJCQkJCQliV21tQ2FwYWJsZTsJLy8gMDpkaXNhYmxlIFdNTSwgMTplbmFibGUgV01NCisgICAgQk9PTEVBTgkJCQkJCQkJYkRMU0NhcGFibGU7CS8vIDA6ZGlzYWJsZSBETFMsIDE6ZW5hYmxlIERMUworCisJVUNIQVIgICAgICAgICAgIAkJCQkJRGxzUFRLWzY0XTsJCS8vIER1ZSB0byB3aW5kb3dzIGRpcnZlciBjb3VudCBvbiBtZWV0aW5naG91c2UgdG8gaGFuZGxlIDQtd2F5IHNoYWtlCisKKwkvLyBGb3IgODAyLjF4IGRhZW1vbiBzZXR0aW5nIHBlciBCU1MKKwlVQ0hBUgkJCQkJCQkJcmFkaXVzX3Nydl9udW07CisJUkFESVVTX1NSVl9JTkZPCQkJCQkJcmFkaXVzX3Nydl9pbmZvW01BWF9SQURJVVNfU1JWX05VTV07CisKKyNpZmRlZiBSVEw4NjVYX1NPQworCXVuc2lnbmVkIGludAkJCQkJCW15bGlua2lkOworI2VuZGlmCisKKworCVVJTlQzMgkJCQkJUmN2ZENvbmZsaWN0U3NpZENvdW50OworCVVJTlQzMgkJCQkJUmN2ZFNwb29mZWRBc3NvY1Jlc3BDb3VudDsKKwlVSU5UMzIJCQkJCVJjdmRTcG9vZmVkUmVhc3NvY1Jlc3BDb3VudDsKKwlVSU5UMzIJCQkJCVJjdmRTcG9vZmVkUHJvYmVSZXNwQ291bnQ7CisJVUlOVDMyCQkJCQlSY3ZkU3Bvb2ZlZEJlYWNvbkNvdW50OworCVVJTlQzMgkJCQkJUmN2ZFNwb29mZWREaXNhc3NvY0NvdW50OworCVVJTlQzMgkJCQkJUmN2ZFNwb29mZWRBdXRoQ291bnQ7CisJVUlOVDMyCQkJCQlSY3ZkU3Bvb2ZlZERlYXV0aENvdW50OworCVVJTlQzMgkJCQkJUmN2ZFNwb29mZWRVbmtub3duTWdtdENvdW50OworCVVJTlQzMgkJCQkJUmN2ZFJlcGxheUF0dGFja0NvdW50OworCisJQ0hBUgkJCQkJUnNzaU9mUmN2ZENvbmZsaWN0U3NpZDsKKwlDSEFSCQkJCQlSc3NpT2ZSY3ZkU3Bvb2ZlZEFzc29jUmVzcDsKKwlDSEFSCQkJCQlSc3NpT2ZSY3ZkU3Bvb2ZlZFJlYXNzb2NSZXNwOworCUNIQVIJCQkJCVJzc2lPZlJjdmRTcG9vZmVkUHJvYmVSZXNwOworCUNIQVIJCQkJCVJzc2lPZlJjdmRTcG9vZmVkQmVhY29uOworCUNIQVIJCQkJCVJzc2lPZlJjdmRTcG9vZmVkRGlzYXNzb2M7CisJQ0hBUgkJCQkJUnNzaU9mUmN2ZFNwb29mZWRBdXRoOworCUNIQVIJCQkJCVJzc2lPZlJjdmRTcG9vZmVkRGVhdXRoOworCUNIQVIJCQkJCVJzc2lPZlJjdmRTcG9vZmVkVW5rbm93bk1nbXQ7CisJQ0hBUgkJCQkJUnNzaU9mUmN2ZFJlcGxheUF0dGFjazsKKworCUJPT0xFQU4JCQkJCWJCY25TbnRSZXE7CisJVUNIQVIJCQkJCUJjbkJ1ZklkeDsKK30gTVVMVElTU0lEX1NUUlVDVCwgKlBNVUxUSVNTSURfU1RSVUNUOworCisKKworI2lmZGVmIERPVDExTl9EUkFGVDMKK3R5cGVkZWYgZW51bSBfQlNTMjA0MENPRVhJU1RfRkxBR3sKKwlCU1NfMjA0MF9DT0VYSVNUX0RJU0FCTEUgPSAwLAorCUJTU18yMDQwX0NPRVhJU1RfVElNRVJfRklSRUQgID0gMSwKKwlCU1NfMjA0MF9DT0VYSVNUX0lORk9fU1lOQyA9IDIsCisJQlNTXzIwNDBfQ09FWElTVF9JTkZPX05PVElGWSA9IDQsCit9QlNTMjA0MENPRVhJU1RfRkxBRzsKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisKKy8vIGNvbmZpZ3VyYXRpb24gY29tbW9uIHRvIE9QTU9ERV9BUCBhcyB3ZWxsIGFzIE9QTU9ERV9TVEEKK3R5cGVkZWYgc3RydWN0IF9DT01NT05fQ09ORklHIHsKKworCUJPT0xFQU4JCWJDb3VudHJ5RmxhZzsKKwlVQ0hBUgkJQ291bnRyeUNvZGVbM107CisJVUNIQVIJCUdlb2dyYXBoeTsKKwlVQ0hBUiAgICAgICBDb3VudHJ5UmVnaW9uOyAgICAgIC8vIEVudW0gb2YgY291bnRyeSByZWdpb24sIDA6RkNDLCAxOklDLCAyOkVUU0ksIDM6U1BBSU4sIDQ6RnJhbmNlLCA1Ok1LSywgNjpNS0sxLCA3OklzcmFlbAorCVVDSEFSICAgICAgIENvdW50cnlSZWdpb25Gb3JBQmFuZDsJLy8gRW51bSBvZiBjb3VudHJ5IHJlZ2lvbiBmb3IgQSBiYW5kCisJVUNIQVIgICAgICAgUGh5TW9kZTsgICAgICAgICAgICAvLyBQSFlfMTFBLCBQSFlfMTFCLCBQSFlfMTFCR19NSVhFRCwgUEhZX0FCR19NSVhFRAorCVVTSE9SVCAgICAgIERzaWZzOyAgICAgICAgICAgICAgLy8gaW4gdW5pdHMgb2YgdXNlYworCVVMT05HICAgICAgIFBhY2tldEZpbHRlcjsgICAgICAgLy8gUGFja2V0IGZpbHRlciBmb3IgcmVjZWl2aW5nCisKKwlDSEFSICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07IC8vIE5PVCBOVUxMLXRlcm1pbmF0ZWQKKwlVQ0hBUiAgICAgICBTc2lkTGVuOyAgICAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgc3NpZCBsZW5ndGggaW4gdXNlZAorCVVDSEFSICAgICAgIExhc3RTc2lkTGVuOyAgICAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgc3NpZCBsZW5ndGggaW4gdXNlZAorCUNIQVIgICAgICAgIExhc3RTc2lkW01BWF9MRU5fT0ZfU1NJRF07IC8vIE5PVCBOVUxMLXRlcm1pbmF0ZWQKKwlVQ0hBUgkJTGFzdEJzc2lkW01BQ19BRERSX0xFTl07CisKKwlVQ0hBUiAgICAgICBCc3NpZFtNQUNfQUREUl9MRU5dOworCVVTSE9SVCAgICAgIEJlYWNvblBlcmlvZDsKKwlVQ0hBUiAgICAgICBDaGFubmVsOworCVVDSEFSICAgICAgIENlbnRyYWxDaGFubmVsOyAgICAJLy8gQ2VudHJhbCBDaGFubmVsIHdoZW4gdXNpbmcgNDBNSHogaXMgaW5kaWNhdGluZy4gbm90IHJlYWwgY2hhbm5lbC4KKworCVVDSEFSICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSICAgICAgIFN1cFJhdGVMZW47CisJVUNIQVIgICAgICAgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJVUNIQVIgICAgICAgRXh0UmF0ZUxlbjsKKwlVQ0hBUiAgICAgICBEZXNpcmVSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsgICAgICAvLyBPSURfODAyXzExX0RFU0lSRURfUkFURVMKKwlVQ0hBUiAgICAgICBNYXhEZXNpcmVkUmF0ZTsKKwlVQ0hBUiAgICAgICBFeHBlY3RlZEFDS1JhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCisJVUxPTkcgICAgICAgQmFzaWNSYXRlQml0bWFwOyAgICAgICAgLy8gYmFja3VwIGJhc2ljIHJhdGViaXRtYXAKKworCUJPT0xFQU4JCWJBUFNEQ2FwYWJsZTsKKwlCT09MRUFOCQliSW5TZXJ2aWNlUGVyaW9kOworCUJPT0xFQU4JCWJBUFNEQUNfQkU7CisJQk9PTEVBTgkJYkFQU0RBQ19CSzsKKwlCT09MRUFOCQliQVBTREFDX1ZJOworCUJPT0xFQU4JCWJBUFNEQUNfVk87CisJQk9PTEVBTgkJYk5lZWRTZW5kVHJpZ2dlckZyYW1lOworCUJPT0xFQU4JCWJBUFNERm9yY2VQb3dlclNhdmU7CS8vIEZvcmNlIHBvd2VyIHNhdmUgbW9kZSwgc2hvdWxkIG9ubHkgdXNlIGluIEFQU0QtU1RBVVQKKwlVTE9ORwkJVHJpZ2dlclRpbWVyQ291bnQ7CisJVUNIQVIJCU1heFNQTGVuZ3RoOworCVVDSEFSCQlCQlBDdXJyZW50Qlc7CS8vIEJXXzEwLCAJQldfMjAsIEJXXzQwCisJUkVHX1RSQU5TTUlUX1NFVFRJTkcgICAgICAgIFJlZ1RyYW5zbWl0U2V0dGluZzsgLy9yZWdpc3RyeSB0cmFuc21pdCBzZXR0aW5nLiB0aGlzIGlzIGZvciByZWFkaW5nIHJlZ2lzdHJ5IHNldHRpbmcgb25seS4gbm90IHVzZWZ1bC4KKwlVQ0hBUiAgICAgICBUeFJhdGU7ICAgICAgICAgICAgICAgICAvLyBTYW1lIHZhbHVlIHRvIGZpbGwgaW4gVFhELiBUeFJhdGUgaXMgNi1iaXQKKwlVQ0hBUiAgICAgICBNYXhUeFJhdGU7ICAgICAgICAgICAgICAvLyBSQVRFXzEsIFJBVEVfMiwgUkFURV81XzUsIFJBVEVfMTEKKwlVQ0hBUiAgICAgICBUeFJhdGVJbmRleDsgICAgICAgICAgICAvLyBUeCByYXRlIGluZGV4IGluIFJhdGVTd2l0Y2hUYWJsZQorCVVDSEFSICAgICAgIFR4UmF0ZVRhYmxlU2l6ZTsgICAgICAgIC8vIFZhbGlkIFR4IHJhdGUgdGFibGUgc2l6ZSBpbiBSYXRlU3dpdGNoVGFibGUKKwlVQ0hBUiAgICAgICBNaW5UeFJhdGU7ICAgICAgICAgICAgICAvLyBSQVRFXzEsIFJBVEVfMiwgUkFURV81XzUsIFJBVEVfMTEKKwlVQ0hBUiAgICAgICBSdHNSYXRlOyAgICAgICAgICAgICAgICAvLyBSQVRFX3h4eAorCUhUVFJBTlNNSVRfU0VUVElORwlNbG1lVHJhbnNtaXQ7ICAgLy8gTUdNVCBmcmFtZSBQSFkgcmF0ZSBzZXR0aW5nIHdoZW4gb3BlcmF0aW4gYXQgSHQgcmF0ZS4KKwlVQ0hBUiAgICAgICBNbG1lUmF0ZTsgICAgICAgICAgICAgICAvLyBSQVRFX3h4eCwgdXNlZCB0byBzZW5kIE1MTUUgZnJhbWVzCisJVUNIQVIgICAgICAgQmFzaWNNbG1lUmF0ZTsgICAgICAgICAgLy8gRGVmYXVsdCBSYXRlIGZvciBzZW5kaW5nIE1MTUUgZnJhbWVzCisKKwlVU0hPUlQgICAgICBSdHNUaHJlc2hvbGQ7ICAgICAgICAgICAvLyBpbiB1bml0IG9mIEJZVEUKKwlVU0hPUlQgICAgICBGcmFnbWVudFRocmVzaG9sZDsgICAgICAvLyBpbiB1bml0IG9mIEJZVEUKKworCVVDSEFSICAgICAgIFR4UG93ZXI7ICAgICAgICAgICAgICAgIC8vIGluIHVuaXQgb2YgbVcKKwlVTE9ORyAgICAgICBUeFBvd2VyUGVyY2VudGFnZTsgICAgICAvLyAwfjEwMCAlCisJVUxPTkcgICAgICAgVHhQb3dlckRlZmF1bHQ7ICAgICAgICAgLy8ga2VlcCBmb3IgVHhQb3dlclBlcmNlbnRhZ2UKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCUJBQ0FQX1NUUlVDICAgICAgICBCQUNhcGFiaWxpdHk7IC8vICAgTk8gVVNFID0gMFhGRiAgOyAgSU1NRURfQkEgPTEgIDsgIERFTEFZX0JBPTAKKwlCQUNBUF9TVFJVQyAgICAgICAgUkVHQkFDYXBhYmlsaXR5OyAvLyAgIE5PIFVTRSA9IDBYRkYgIDsgIElNTUVEX0JBID0xICA7ICBERUxBWV9CQT0wCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJSU9UX1NUUlVDCQlJT1Rlc3RQYXJtOwkvLyA4MDIuMTFuIEludGVyT3BiaWxpdHkgVGVzdCBQYXJhbWV0ZXI7CisJVUxPTkcgICAgICAgVHhQcmVhbWJsZTsgICAgICAgICAgICAgLy8gUnQ4MDJfMTFQcmVhbWJsZUxvbmcsIFJ0ODAyXzExUHJlYW1ibGVTaG9ydCwgUnQ4MDJfMTFQcmVhbWJsZUF1dG8KKwlCT09MRUFOICAgICBiVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50OyAgICAgLy8gTWljcm9zb2Z0IHVzZSAwIGFzIGRpc2FibGUKKwlVTE9ORyAgICAgICBVc2VCR1Byb3RlY3Rpb247ICAgICAgICAvLyAwOiBhdXRvLCAxOiBhbHdheXMgdXNlLCAyOiBhbHdheXMgbm90IHVzZQorCUJPT0xFQU4gICAgIGJVc2VTaG9ydFNsb3RUaW1lOyAgICAgIC8vIDA6IGRpc2FibGUsIDEgLSB1c2Ugc2hvcnQgc2xvdCAoOXVzKQorCUJPT0xFQU4gICAgIGJFbmFibGVUeEJ1cnN0OyAgICAgICAgIC8vIDE6IGVuYmxlIFRYIFBBQ0tFVCBCVVJTVCwgMDogZGlzYWJsZSBUWCBQQUNLRVQgQlVSU1QKKwlCT09MRUFOICAgICBiQWdncmVnYXRpb25DYXBhYmxlOyAgICAgIC8vIDE6IGVuYWJsZSBUWCBhZ2dyZWdhdGlvbiB3aGVuIHRoZSBwZWVyIHN1cHBvcnRzIGl0CisJQk9PTEVBTiAgICAgYlBpZ2d5QmFja0NhcGFibGU7CQkvLyAxOiBlbmFibGUgVFggcGlnZ3ktYmFjayBhY2NvcmRpbmcgTUFDJ3MgdmVyc2lvbgorCUJPT0xFQU4gICAgIGJJRUVFODAyMTFIOwkJCS8vIDE6IGVuYWJsZSBJRUVFODAyLjExaCBzcGVjLgorCVVMT05HCQlEaXNhYmxlT0xCQ0RldGVjdDsJCS8vIDA6IGVuYWJsZSBPTEJDIGRldGVjdDsgMSBkaXNhYmxlIE9MQkMgZGV0ZWN0CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlCT09MRUFOCQkJCWJSZGc7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJQk9PTEVBTiAgICAgICAgICAgICBiV21tQ2FwYWJsZTsgICAgICAgIC8vIDA6ZGlzYWJsZSBXTU0sIDE6ZW5hYmxlIFdNTQorCVFPU19DQVBBQklMSVRZX1BBUk0gQVBRb3NDYXBhYmlsaXR5OyAgICAvLyBRT1MgY2FwYWJpbGl0eSBvZiB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQCisJRURDQV9QQVJNICAgICAgICAgICBBUEVkY2FQYXJtOyAgICAgICAgIC8vIEVEQ0EgcGFyYW1ldGVycyBvZiB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQCisJUUJTU19MT0FEX1BBUk0gICAgICBBUFFic3NMb2FkOyAgICAgICAgIC8vIFFCU1MgbG9hZCBvZiB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQCisJVUNIQVIgICAgICAgICAgICAgICBBY2tQb2xpY3lbNF07ICAgICAgIC8vIEFDSyBwb2xpY3kgb2YgdGhlIHNwZWNpZmllZCBBQy4gc2VlIEFDS194eHgKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlCT09MRUFOCQkJCWJETFNDYXBhYmxlOwkJLy8gMDpkaXNhYmxlIERMUywgMTplbmFibGUgRExTCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJLy8gYSBiaXRtYXAgb2YgQk9PTEVBTiBmbGFncy4gZWFjaCBiaXQgcmVwcmVzZW50IGFuIG9wZXJhdGlvbiBzdGF0dXMgb2YgYSBwYXJ0aWN1bGFyCisJLy8gQk9PTEVBTiBjb250cm9sLCBlaXRoZXIgT04gb3IgT0ZGLiBUaGVzZSBmbGFncyBzaG91bGQgYWx3YXlzIGJlIGFjY2Vzc2VkIHZpYQorCS8vIE9QU1RBVFVTX1RFU1RfRkxBRygpLCBPUFNUQVRVU19TRVRfRkxBRygpLCBPUF9TVEFUVVNfQ0xFQVJfRkxBRygpIG1hY3Jvcy4KKwkvLyBzZWUgZk9QX1NUQVRVU194eHggaW4gUlRNUF9ERUYuQyBmb3IgZGV0YWlsIGJpdCBkZWZpbml0aW9uCisJVUxPTkcgICAgICAgICAgICAgICBPcFN0YXR1c0ZsYWdzOworCisJQk9PTEVBTgkJCQlOZGlzUmFkaW9TdGF0ZU9mZjsgLy9Gb3IgSENUIDEyLjAsIHNldCB0aGlzIGZsYWcgdG8gVFJVRSBpbnN0ZWFkIG9mIGNhbGxlZCBNbG1lUmFkaW9PZmYuCisJQUJHQkFORF9TVEFURQkJQmFuZFN0YXRlOwkJLy8gRm9yIHNldHRpbmcgQkJQIHVzZWQgb24gQi9HIG9yIEEgbW9kZS4KKworCS8vIElFRUU4MDIuMTFILS1ERlMuCisJUkFEQVJfREVURUNUX1NUUlVDVAlSYWRhckRldGVjdDsKKworI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKKwlDQVJSSUVSX0RFVEVDVElPTgkJQ2FycmllckRldGVjdDsKKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkvLyBIVAorCVVDSEFSCQkJQkFTaXplOwkJLy8gVVNlciBkZXNpcmVkIEJBV2luZG93U2l6ZS4gU2hvdWxkIG5vdCBleGNlZWQgb3VyIG1heCBjYXBhYmlsaXR5CisJLy9SVF9IVF9DQVBBQklMSVRZCVN1cHBvcnRlZEh0UGh5OworCVJUX0hUX0NBUEFCSUxJVFkJRGVzaXJlZEh0UGh5OworCUhUX0NBUEFCSUxJVFlfSUUJCUh0Q2FwYWJpbGl0eTsKKwlBRERfSFRfSU5GT19JRQkJQWRkSFRJbmZvOwkvLyBVc2VmdWwgYXMgQVAuCisJLy9UaGlzIElFIGlzIHVzZWQgd2l0aCBjaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgZWxlbWVudCB3aGVuIGNoYW5naW5nIHRvIGEgbmV3IDQwTUh6LgorCS8vVGhpcyBJRSBpcyBpbmNsdWRlZCBpbiBjaGFubmVsIHN3aXRjaCBhbW1vdW5jZW1lbnQgZnJhbWVzIDcuNC4xLjUsIGJlYWNvbnMsIHByb2JlIFJzcC4KKwlORVdfRVhUX0NIQU5fSUUJTmV3RXh0Q2hhbk9mZnNldDsJLy83LjMuMi4yMEEsIDEgaWYgZXh0ZW5zaW9uIGNoYW5uZWwgaXMgYWJvdmUgdGhlIGNvbnRyb2wgY2hhbm5lbCwgMyBpZiBiZWxvdywgMCBpZiBub3QgcHJlc2VudAorCisjaWZkZWYgRE9UMTFOX0RSQUZUMworCVVDSEFSCQkJCQlCc3MyMDQwQ29leGlzdEZsYWc7CQkvLyBiaXQgMDogYkJzc0NvZXhpc3RUaW1lclJ1bm5pbmcsIGJpdCAxOiBOZWVkU3luY0FkZEh0SW5mby4KKwlSQUxJTktfVElNRVJfU1RSVUNUCUJzczIwNDBDb2V4aXN0VGltZXI7CisKKwkvL1RoaXMgSUUgaXMgdXNlZCBmb3IgMjAvNDAgQlNTIENvZXhpc3RlbmNlLgorCUJTU18yMDQwX0NPRVhJU1RfSUUJCUJTUzIwNDBDb2V4aXN0SW5mbzsKKwkvLyA9PT09PT0gMTFuIEQzLjAgPT09PT09PT09PT09PT09PT09PT09PT0+CisJVVNIT1JUCQkJCQlEb3QxMU9Cc3NTY2FuUGFzc2l2ZUR3ZWxsOwkJCQkvLyBVbml0IDogVFUuIDV+MTAwMAorCVVTSE9SVAkJCQkJRG90MTFPQnNzU2NhbkFjdGl2ZUR3ZWxsOwkJCQkvLyBVbml0IDogVFUuIDEwfjEwMDAKKwlVU0hPUlQJCQkJCURvdDExQnNzV2lkdGhUcmlnZ2VyU2NhbkludDsJCQkvLyBVbml0IDogU2Vjb25kCisJVVNIT1JUCQkJCQlEb3QxMU9Cc3NTY2FuUGFzc2l2ZVRvdGFsUGVyQ2hhbm5lbDsJLy8gVW5pdCA6IFRVLiAyMDB+MTAwMDAKKwlVU0hPUlQJCQkJCURvdDExT0Jzc1NjYW5BY3RpdmVUb3RhbFBlckNoYW5uZWw7CS8vIFVuaXQgOiBUVS4gMjB+MTAwMDAKKwlVU0hPUlQJCQkJCURvdDExQnNzV2lkdGhDaGFuVHJhbkRlbGF5RmFjdG9yOworCVVTSE9SVAkJCQkJRG90MTFPQnNzU2NhbkFjdGl2aXR5VGhyZTsJCQkJLy8gVW5pdCA6IHBlcmNlbnRhZ2UKKworCVVMT05HCQkJCQlEb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheTsJCQkvLyBtdWx0aXBsZSBvZiAoRG90MTFCc3NXaWR0aFRyaWdnZXJTY2FuSW50ICogRG90MTFCc3NXaWR0aENoYW5UcmFuRGVsYXlGYWN0b3IpCisJVUxPTkcJCQkJCUNvdW50RG93bkN0cjsJLy8gQ291bnREb3duIENvdW50ZXIgZnJvbSAoRG90MTFCc3NXaWR0aFRyaWdnZXJTY2FuSW50ICogRG90MTFCc3NXaWR0aENoYW5UcmFuRGVsYXlGYWN0b3IpCisKKwlORElTX1NQSU5fTE9DSyAgICAgICAgICBUcmlnZ2VyRXZlbnRUYWJMb2NrOworCUJTU18yMDQwX0NPRVhJU1RfSUUJCUxhc3RCU1NDb2V4aXN0MjA0MDsKKwlCU1NfMjA0MF9DT0VYSVNUX0lFCQlCU1NDb2V4aXN0MjA0MDsKKwlUUklHR0VSX0VWRU5UX1RBQgkJVHJpZ2dlckV2ZW50VGFiOworCVVDSEFSCQkJCQlDaGFubmVsTGlzdElkeDsKKwkvLyA8PT09PT09IDExbiBEMy4wID09PT09PT09PT09PT09PT09PT09PT09CisJQk9PTEVBTgkJCQkJYk92ZXJsYXBTY2FubmluZzsKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICBiSFRQcm90ZWN0OworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgIGJNSU1PUFNFbmFibGU7CisgICAgQk9PTEVBTgkJCQkJYkJBRGVjbGluZTsKKwlCT09MRUFOCQkJCQliRGlzYWJsZVJlb3JkZXJpbmc7CisJQk9PTEVBTgkJCQkJYkZvcnR5X01oel9JbnRvbGVyYW50OworCUJPT0xFQU4JCQkJCWJFeHRDaGFubmVsU3dpdGNoQW5ub3VuY2VtZW50OworCUJPT0xFQU4JCQkJCWJSY3ZCU1NXaWR0aFRyaWdnZXJFdmVudHM7CisJVUxPTkcJCQkJCUxhc3RSY3ZCU1NXaWR0aFRyaWdnZXJFdmVudHNUaW1lOworCisJVUNIQVIJCQkJCVR4QkFTaXplOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJLy8gRW5hYmxlIHdpcmVsZXNzIGV2ZW50CisJQk9PTEVBTgkJCQliV2lyZWxlc3NFdmVudDsKKwlCT09MRUFOCQkJCWJXaUZpVGVzdDsJCQkJLy8gRW5hYmxlIHRoaXMgcGFyYW1ldGVyIGZvciBXaUZpIHRlc3QKKworCS8vIFR4ICYgUnggU3RyZWFtIG51bWJlciBzZWxlY3Rpb24KKwlVQ0hBUgkJCQlUeFN0cmVhbTsKKwlVQ0hBUgkJCQlSeFN0cmVhbTsKKworCS8vIHRyYW5zbWl0IHBoeSBtb2RlLCB0cmFzbWl0IHJhdGUgZm9yIE11bHRpY2FzdC4KKyNpZmRlZiBNQ0FTVF9SQVRFX1NQRUNJRklDCisJVUNIQVIJCQkJTWNhc3RUcmFuc21pdE1jczsKKwlVQ0hBUgkJCQlNY2FzdFRyYW5zbWl0UGh5TW9kZTsKKyNlbmRpZiAvLyBNQ0FTVF9SQVRFX1NQRUNJRklDIC8vCisKKwlCT09MRUFOICAgICAJCWJIYXJkd2FyZVJhZGlvOyAgICAgLy8gSGFyZHdhcmUgY29udHJvbGxlZCBSYWRpbyBlbmFibGVkCisKKworCisgCU5ESVNfU1BJTl9MT0NLCQkJTWVhc3VyZVJlcVRhYkxvY2s7CisJUE1FQVNVUkVfUkVRX1RBQgkJcE1lYXN1cmVSZXFUYWI7CisKKwlORElTX1NQSU5fTE9DSwkJCVRwY1JlcVRhYkxvY2s7CisJUFRQQ19SRVFfVEFCCQkJcFRwY1JlcVRhYjsKKworCS8vIHRyYW5zbWl0IHBoeSBtb2RlLCB0cmFzbWl0IHJhdGUgZm9yIE11bHRpY2FzdC4KKyNpZmRlZiBNQ0FTVF9SQVRFX1NQRUNJRklDCisJSFRUUkFOU01JVF9TRVRUSU5HCQlNQ2FzdFBoeU1vZGU7CisjZW5kaWYgLy8gTUNBU1RfUkFURV9TUEVDSUZJQyAvLworCisjaWZkZWYgU0lOR0xFX1NLVQorCVVJTlQxNgkJCQkJRGVmaW5lTWF4VHhQd3I7CisjZW5kaWYgLy8gU0lOR0xFX1NLVSAvLworCisKK30gQ09NTU9OX0NPTkZJRywgKlBDT01NT05fQ09ORklHOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKy8qIE1vZGlmaWVkIGJ5IFd1IFhpLUt1biA0LzIxLzIwMDYgKi8KKy8vIFNUQSBjb25maWd1cmF0aW9uIGFuZCBzdGF0dXMKK3R5cGVkZWYgc3RydWN0IF9TVEFfQURNSU5fQ09ORklHIHsKKwkvLyBHUk9VUCAxIC0KKwkvLyAgIFVzZXIgY29uZmlndXJhdGlvbiBsb2FkZWQgZnJvbSBSZWdpc3RyeSwgRTJQUk9NIG9yIE9JRF94eHguIFRoZXNlIHNldHRpbmdzIGRlc2NyaWJlCisJLy8gICB0aGUgdXNlciBpbnRlbmRlZCBjb25maWd1cmF0aW9uLCBidXQgbm90IG5lY2Vzc2FyeSBmdWxseSBlcXVhbCB0byB0aGUgZmluYWwKKwkvLyAgIHNldHRpbmdzIGluIEFDVElWRSBCU1MgYWZ0ZXIgbmVnb3RpYXRpb24vY29tcHJvbWl6ZSB3aXRoIHRoZSBCU1MgaG9sZGVyIChlaXRoZXIKKwkvLyAgIEFQIG9yIElCU1MgaG9sZGVyKS4KKwkvLyAgIE9uY2UgaW5pdGlhbGl6ZWQsIHVzZXIgY29uZmlndXJhdGlvbiBjYW4gb25seSBiZSBjaGFuZ2VkIHZpYSBPSURfeHh4CisJVUNIQVIgICAgICAgQnNzVHlwZTsgICAgICAgICAgICAgIC8vIEJTU19JTkZSQSBvciBCU1NfQURIT0MKKwlVU0hPUlQgICAgICBBdGltV2luOyAgICAgICAgICAvLyB1c2VkIHdoZW4gc3RhcnRpbmcgYSBuZXcgSUJTUworCisJLy8gR1JPVVAgMiAtCisJLy8gICBVc2VyIGNvbmZpZ3VyYXRpb24gbG9hZGVkIGZyb20gUmVnaXN0cnksIEUyUFJPTSBvciBPSURfeHh4LiBUaGVzZSBzZXR0aW5ncyBkZXNjcmliZQorCS8vICAgdGhlIHVzZXIgaW50ZW5kZWQgY29uZmlndXJhdGlvbiwgYW5kIHNob3VsZCBiZSBhbHdheXMgYXBwbGllZCB0byB0aGUgZmluYWwKKwkvLyAgIHNldHRpbmdzIGluIEFDVElWRSBCU1Mgd2l0aG91dCBjb21wcm9taXNpbmcgd2l0aCB0aGUgQlNTIGhvbGRlci4KKwkvLyAgIE9uY2UgaW5pdGlhbGl6ZWQsIHVzZXIgY29uZmlndXJhdGlvbiBjYW4gb25seSBiZSBjaGFuZ2VkIHZpYSBPSURfeHh4CisJVUNIQVIgICAgICAgUnNzaVRyaWdnZXI7CisJVUNIQVIgICAgICAgUnNzaVRyaWdnZXJNb2RlOyAgICAgIC8vIFJTU0lfVFJJR0dFUkVEX1VQT05fQkVMT1dfVEhSRVNIT0xEIG9yIFJTU0lfVFJJR0dFUkVEX1VQT05fRVhDQ0VFRF9USFJFU0hPTEQKKwlVU0hPUlQgICAgICBEZWZhdWx0TGlzdGVuQ291bnQ7ICAgLy8gZGVmYXVsdCBsaXN0ZW4gY291bnQ7CisJVUxPTkcgICAgICAgV2luZG93c1Bvd2VyTW9kZTsgICAgICAgICAgIC8vIFBvd2VyIG1vZGUgZm9yIEFDIHBvd2VyCisJVUxPTkcgICAgICAgV2luZG93c0JhdHRlcnlQb3dlck1vZGU7ICAgIC8vIFBvd2VyIG1vZGUgZm9yIGJhdHRlcnkgaWYgZXhpc3RzCisJQk9PTEVBTiAgICAgYldpbmRvd3NBQ0NBTUVuYWJsZTsgICAgICAgIC8vIEVuYWJsZSBDQU0gcG93ZXIgbW9kZSB3aGVuIEFDIG9uCisJQk9PTEVBTiAgICAgYkF1dG9SZWNvbm5lY3Q7ICAgICAgICAgLy8gU2V0IHRvIFRSVUUgd2hlbiBzZXR0aW5nIE9JRF84MDJfMTFfU1NJRCB3aXRoIG5vIG1hdGNoaW5nIEJTU0lECisJVUxPTkcgICAgICAgV2luZG93c1Bvd2VyUHJvZmlsZTsgICAgLy8gV2luZG93cyBwb3dlciBwcm9maWxlLCBmb3IgTkRJUzUuMSBQblAKKworCS8vIE1JQjppZWVlODAyZG90MTEuZG90MTFzbXQoMSkuZG90MTFTdGF0aW9uQ29uZmlnVGFibGUoMSkKKwlVU0hPUlQgICAgICBQc207ICAgICAgICAgICAgICAgICAgLy8gcG93ZXIgbWFuYWdlbWVudCBtb2RlICAgKFBXUl9BQ1RJVkV8UFdSX1NBVkUpCisJVVNIT1JUICAgICAgRGlzYXNzb2NSZWFzb247CisJVUNIQVIgICAgICAgRGlzYXNzb2NTdGFbTUFDX0FERFJfTEVOXTsKKwlVU0hPUlQgICAgICBEZWF1dGhSZWFzb247CisJVUNIQVIgICAgICAgRGVhdXRoU3RhW01BQ19BRERSX0xFTl07CisJVVNIT1JUICAgICAgQXV0aEZhaWxSZWFzb247CisJVUNIQVIgICAgICAgQXV0aEZhaWxTdGFbTUFDX0FERFJfTEVOXTsKKworCU5ESVNfODAyXzExX1BSSVZBQ1lfRklMVEVSICAgICAgICAgIFByaXZhY3lGaWx0ZXI7ICAvLyBQcml2YWN5RmlsdGVyIGVudW0gZm9yIDgwMi4xWAorCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgICAgIEF1dGhNb2RlOyAgICAgICAvLyBUaGlzIHNob3VsZCBtYXRjaCB0byB3aGF0ZXZlciBtaWNyb3NvZnQgZGVmaW5lZAorCU5ESVNfODAyXzExX1dFUF9TVEFUVVMgICAgICAgICAgICAgIFdlcFN0YXR1czsKKwlORElTXzgwMl8xMV9XRVBfU1RBVFVTCQkJCU9yaWdXZXBTdGF0dXM7CS8vIE9yaWdpbmFsIHdlcCBzdGF0dXMgc2V0IGZyb20gT0lECisKKwkvLyBBZGQgdG8gc3VwcG9ydCBkaWZmZXJlbnQgY2lwaGVyIHN1aXRlIGZvciBXUEEyL1dQQSBtb2RlCisJTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJCUdyb3VwQ2lwaGVyOwkJLy8gTXVsdGljYXN0IGNpcGhlciBzdWl0ZQorCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCQlQYWlyQ2lwaGVyOwkJCS8vIFVuaWNhc3QgY2lwaGVyIHN1aXRlCisJQk9PTEVBTgkJCQkJCQkJYk1peENpcGhlcjsJCQkvLyBJbmRpY2F0ZSBjdXJyZW50IFBhaXIgJiBHcm91cCB1c2UgZGlmZmVyZW50IGNpcGhlciBzdWl0ZXMKKwlVU0hPUlQJCQkJCQkJCVJzbkNhcGFiaWxpdHk7CisKKwlORElTXzgwMl8xMV9XRVBfU1RBVFVTICAgICAgICAgICAgICBHcm91cEtleVdlcFN0YXR1czsKKworCVVDSEFSCQlQTUtbMzJdOyAgICAgICAgICAgICAgICAvLyBXUEEgUFNLIG1vZGUgUE1LCisJVUNIQVIgICAgICAgUFRLWzY0XTsgICAgICAgICAgICAgICAgLy8gV1BBIFBTSyBtb2RlIFBUSworCVVDSEFSCQlHVEtbMzJdOwkJCQkvLyBHVEsgZnJvbSBhdXRoZW50aWNhdG9yCisJQlNTSURfSU5GTwlTYXZlZFBNS1tQTUtJRF9OT107CisJVUlOVAkJU2F2ZWRQTUtOdW07CQkJLy8gU2F2ZWQgUE1LSUQgbnVtYmVyCisKKwlVQ0hBUgkJRGVmYXVsdEtleUlkOworCisKKwkvLyBXUEEgODAyLjF4IHBvcnQgY29udHJvbCwgV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQsIFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRAorCVVDSEFSICAgICAgIFBvcnRTZWN1cmVkOworCisJLy8gRm9yIFdQQSBjb3VudGVybWVhc3VyZXMKKwlVTE9ORyAgICAgICBMYXN0TWljRXJyb3JUaW1lOyAgIC8vIHJlY29yZCBsYXN0IE1JQyBlcnJvciB0aW1lCisJVUxPTkcgICAgICAgTWljRXJyQ250OyAgICAgICAgICAvLyBTaG91bGQgYmUgMCwgMSwgMiwgdGhlbiByZXNldCB0byB6ZXJvIChhZnRlciBkaXNhc3NvaWNpYXRpb24pLgorCUJPT0xFQU4gICAgIGJCbG9ja0Fzc29jOyAgICAgICAgLy8gQmxvY2sgYXNzb2NpYXRlIGF0dGVtcHQgZm9yIDYwIHNlY29uZHMgYWZ0ZXIgY291bnRlciBtZWFzdXJlIG9jY3VycmVkLgorCS8vIEZvciBXUEEtUFNLIHN1cHBsaWNhbnQgc3RhdGUKKwlXUEFfU1RBVEUgICBXcGFTdGF0ZTsgICAgICAgICAgIC8vIERlZmF1bHQgaXMgU1NfTk9UVVNFIGFuZCBoYW5kbGVkIGJ5IG1pY3Jvc29mdCA4MDIuMXgKKwlVQ0hBUiAgICAgICBSZXBsYXlDb3VudGVyWzhdOworCVVDSEFSICAgICAgIEFOb25jZVszMl07ICAgICAgICAgLy8gQU5vbmNlIGZvciBXUEEtUFNLIGZyb20gYXVyaGVudGljYXRvcgorCVVDSEFSICAgICAgIFNOb25jZVszMl07ICAgICAgICAgLy8gU05vbmNlIGZvciBXUEEtUFNLCisKKwlVQ0hBUiAgICAgICBMYXN0U05SMDsgICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBCRUFDT04ncyBTTlIKKwlVQ0hBUiAgICAgICBMYXN0U05SMTsgICAgICAgICAgICAvLyBsYXN0IHJlY2VpdmVkIEJFQUNPTidzIFNOUiBmb3IgMm5kICBhbnRlbm5hCisJUlNTSV9TQU1QTEUgUnNzaVNhbXBsZTsKKwlVTE9ORyAgICAgICBOdW1PZkF2Z1Jzc2lTYW1wbGU7CisKKwlVTE9ORyAgICAgICBMYXN0QmVhY29uUnhUaW1lOyAgICAgLy8gT1MncyB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgQkVBQ09OIFJYIHRpbWUKKwlVTE9ORyAgICAgICBMYXN0MTFiQmVhY29uUnhUaW1lOyAgLy8gT1MncyB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgMTFCIEJFQUNPTiBSWCB0aW1lCisJVUxPTkcJCUxhc3QxMWdCZWFjb25SeFRpbWU7CS8vIE9TJ3MgdGltZXN0YW1wIG9mIHRoZSBsYXN0IDExRyBCRUFDT04gUlggdGltZQorCVVMT05HCQlMYXN0MjBOQmVhY29uUnhUaW1lOwkvLyBPUydzIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCAyME1IeiBOIEJFQUNPTiBSWCB0aW1lCisKKwlVTE9ORyAgICAgICBMYXN0U2NhblRpbWU7ICAgICAgIC8vIFJlY29yZCBsYXN0IHNjYW4gdGltZSBmb3IgaXNzdWUgQlNTSURfU0NBTl9MSVNUCisJVUxPTkcgICAgICAgU2NhbkNudDsgICAgICAgICAgICAvLyBTY2FuIGNvdW50cyBzaW5jZSBtb3N0IHJlY2VudCBTU0lELCBCU1NJRCwgU0NBTiBPSUQgcmVxdWVzdAorCUJPT0xFQU4gICAgIGJTd1JhZGlvOyAgICAgICAgICAgLy8gU29mdHdhcmUgY29udHJvbGxlZCBSYWRpbyBPbi9PZmYsIFRSVUU6IE9uCisJQk9PTEVBTiAgICAgYkh3UmFkaW87ICAgICAgICAgICAvLyBIYXJkd2FyZSBjb250cm9sbGVkIFJhZGlvIE9uL09mZiwgVFJVRTogT24KKwlCT09MRUFOICAgICBiUmFkaW87ICAgICAgICAgICAgIC8vIFJhZGlvIHN0YXRlLCBBbmQgb2YgU3cgJiBIdyByYWRpbyBzdGF0ZQorCUJPT0xFQU4gICAgIGJIYXJkd2FyZVJhZGlvOyAgICAgLy8gSGFyZHdhcmUgY29udHJvbGxlZCBSYWRpbyBlbmFibGVkCisJQk9PTEVBTiAgICAgYlNob3dIaWRkZW5TU0lEOyAgICAvLyBTaG93IGFsbCBrbm93biBTU0lEIGluIFNTSUQgbGlzdCBnZXQgb3BlcmF0aW9uCisKKyAgICBCT09MRUFOCQlBZGhvY0JPbmx5Sm9pbmVkOwkvLyBJbmRpY2F0ZSBBZGhvYyBCIEpvaW4uCisgICAgQk9PTEVBTgkJQWRob2NCR0pvaW5lZDsJCS8vIEluZGljYXRlIEFkaG9jIEIvRyBKb2luLgorICAgIEJPT0xFQU4JCUFkaG9jMjBOSm9pbmVkOwkJLy8gSW5kaWNhdGUgQWRob2MgMjBNSHogTiBKb2luLgorCisJLy8gTmV3IGZvciBXUEEsIHdpbmRvd3Mgd2FudCB1cyB0byB0byBrZWVwIGFzc29jaWF0aW9uIGluZm9ybWF0aW9uIGFuZAorCS8vIEZpeGVkIElFcyBmcm9tIGxhc3QgYXNzb2NpYXRpb24gcmVzcG9uc2UKKwlORElTXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTiAgICAgQXNzb2NJbmZvOworCVVTSE9SVCAgICAgICBSZXFWYXJJRUxlbjsgICAgICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIG5leHQgVklFIGluY2x1ZGUgRUlEICYgTGVuZ3RoCisJVUNIQVIgICAgICAgUmVxVmFySUVzW01BWF9WSUVfTEVOXTsJCS8vIFRoZSBjb250ZW50IHNhdmVkIGhlcmUgc2hvdWxkIGJlIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgorCVVTSE9SVCAgICAgICBSZXNWYXJJRUxlbjsgICAgICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIG5leHQgVklFIGluY2x1ZGUgRUlEICYgTGVuZ3RoCisJVUNIQVIgICAgICAgUmVzVmFySUVzW01BWF9WSUVfTEVOXTsKKworCVVDSEFSICAgICAgIFJTTklFX0xlbjsKKwlVQ0hBUiAgICAgICBSU05fSUVbTUFYX0xFTl9PRl9SU05JRV07CS8vIFRoZSBjb250ZW50IHNhdmVkIGhlcmUgc2hvdWxkIGJlIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgorCisJLy8gTmV3IHZhcmlhYmxlcyB1c2VkIGZvciBDQ1ggMS4wCisJQk9PTEVBTiAgICAgICAgICAgICBiQ2tpcE9uOworCUJPT0xFQU4gICAgICAgICAgICAgYkNraXBDbWljT247CisJVUNIQVIgICAgICAgICAgICAgICBDa2lwRmxhZzsKKwlVQ0hBUiAgICAgICAgICAgICAgIEdJVlszXTsgIC8vZm9yIENDWCBpdgorCVVDSEFSICAgICAgICAgICAgICAgUnhTRVFbNF07CisJVUNIQVIgICAgICAgICAgICAgICBUeFNFUVs0XTsKKwlVQ0hBUiAgICAgICAgICAgICAgIENLSVBNSUNbNF07CisJVUNIQVIgICAgICAgICAgICAgICBMZWFwQXV0aE1vZGU7CisJTEVBUF9BVVRIX0lORk8gICAgICBMZWFwQXV0aEluZm87CisJVUNIQVIgICAgICAgICAgICAgICBIYXNoUHdkWzE2XTsKKwlVQ0hBUiAgICAgICAgICAgICAgIE5ldHdvcmtDaGFsbGVuZ2VbOF07CisJVUNIQVIgICAgICAgICAgICAgICBOZXR3b3JrQ2hhbGxlbmdlUmVzcG9uc2VbMjRdOworCVVDSEFSICAgICAgICAgICAgICAgUGVlckNoYWxsZW5nZVs4XTsKKworCVVDSEFSICAgICAgICAgICAgICAgUGVlckNoYWxsZW5nZVJlc3BvbnNlWzI0XTsKKwlVQ0hBUiAgICAgICAgICAgICAgIFNlc3Npb25LZXlbMTZdOyAvL05ldHdvcmsgc2Vzc2lvbiBrZXlzIChOU0spCisJUkFMSU5LX1RJTUVSX1NUUlVDVCBMZWFwQXV0aFRpbWVyOworCVJPR1VFQVBfVEFCTEUgICAgICAgUm9ndWVBcFRhYjsgICAvL0Npc2NvIENDWDEgUm9ndWUgQVAgRGV0ZWN0aW9uCisKKwkvLyBOZXcgY29udHJvbCBmbGFncyBmb3IgQ0NYCisJQ0NYX0NPTlRST0wgICAgICAgICBDQ1hDb250cm9sOyAgICAgICAgICAgICAgICAgLy8gTWFzdGVyIGFkbWluaXN0cmF0aW9uIHN0YXRlCisJQk9PTEVBTiAgICAgICAgICAgICBDQ1hFbmFibGU7ICAgICAgICAgICAgICAgICAgLy8gQWN0dWFsIENDWCBzdGF0ZQorCVVDSEFSICAgICAgICAgICAgICAgQ0NYU2NhbkNoYW5uZWw7ICAgICAgICAgICAgIC8vIFNlbGVjdGVkIGNoYW5uZWwgZm9yIENDWCBiZWFjb24gcmVxdWVzdAorCVVTSE9SVCAgICAgICAgICAgICAgQ0NYU2NhblRpbWU7ICAgICAgICAgICAgICAgIC8vIFRpbWUgb3V0IHRvIHdhaXQgZm9yIGJlYWNvbiBhbmQgcHJvYmUgcmVzcG9uc2UKKwlVQ0hBUiAgICAgICAgICAgICAgIENDWFJlcVR5cGU7ICAgICAgICAgICAgICAgICAvLyBDdXJyZW50IHByb2Nlc3NpbmcgQ0NYIHJlcXVlc3QgdHlwZQorCUJTU19UQUJMRSAgICAgICAgICAgQ0NYQnNzVGFiOyAgICAgICAgICAgICAgICAgIC8vIEJTUyBUYWJsZQorCVVDSEFSICAgICAgICAgICAgICAgRnJhbWVSZXBvcnRCdWZbMjA0OF07ICAgICAgIC8vIEJ1ZmZlciBmb3IgY3JlYXRpbmcgZnJhbWUgcmVwb3J0CisJVVNIT1JUICAgICAgICAgICAgICBGcmFtZVJlcG9ydExlbjsgICAgICAgICAgICAgLy8gQ3VycmVudCBGcmFtZSByZXBvcnQgbGVuZ3RoCisJVUxPTkcgICAgICAgICAgICAgICBDTEJ1c3lCeXRlczsgICAgICAgICAgICAgICAgLy8gU2F2ZSB0aGUgdG90YWwgYnl0ZXMgcmVjZWl2ZWQgZHVybmluZyBjaGFubmVsIGxvYWQgc2NhbiB0aW1lCisJVVNIT1JUICAgICAgICAgICAgICBSUElEZW5zaXR5WzhdOyAgICAgICAgICAgICAgLy8gQXJyYXkgZm9yIFJQSSBkZW5zaXR5IGNvbGxlY3Rpb24KKwkvLyBTdGFydCBhZGRyZXNzIG9mIGVhY2ggQlNTIHRhYmxlIHdpdGhpbiBGcmFtZVJlcG9ydEJ1ZgorCS8vIEl0J3MgaW1wb3J0YW50IHRvIHVwZGF0ZSB0aGUgUnhQb3dlciBvZiB0aGUgY29ycmVzcG9uZGluZyBCc3MKKwlVU0hPUlQgICAgICAgICAgICAgIEJzc1JlcG9ydE9mZnNldFtNQVhfTEVOX09GX0JTU19UQUJMRV07CisJVVNIT1JUICAgICAgICAgICAgICBCZWFjb25Ub2tlbjsgICAgICAgICAgICAgICAgLy8gVG9rZW4gZm9yIGJlYWNvbiByZXBvcnQKKwlVTE9ORyAgICAgICAgICAgICAgIExhc3RCc3NJbmRleDsgICAgICAgICAgICAgICAvLyBNb3N0IGN1cnJlbnQgcmVwb3J0ZWQgQnNzIGluZGV4CisJUk1fUkVRVUVTVF9BQ1RJT04gICBNZWFzdXJlbWVudFJlcXVlc3RbMTZdOyAgICAgLy8gU2F2ZWQgbWVhc3VyZW1lbnQgcmVxdWVzdAorCVVDSEFSICAgICAgICAgICAgICAgUk1SZXFDbnQ7ICAgICAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBtZWFzdXJlbWVudCByZXF1ZXN0IHNhdmVkLgorCVVDSEFSICAgICAgICAgICAgICAgQ3VycmVudFJNUmVxSWR4OyAgICAgICAgICAgIC8vIE51bWJlciBvZiBtZWFzdXJlbWVudCByZXF1ZXN0IHNhdmVkLgorCUJPT0xFQU4gICAgICAgICAgICAgUGFyYWxsZWxSZXE7ICAgICAgICAgICAgICAgIC8vIFBhcmFsbGVsIG1lYXN1cmVtZW50LCBvbmx5IG9uZSByZXF1ZXN0IHBlcmZvcm1lZCwKKwkJCQkJCQkJCQkJCQkvLyBJdCBtdXN0IGJlIHRoZSBzYW1lIGNoYW5uZWwgd2l0aCBtYXhpbXVtIGR1cmF0aW9uCisJVVNIT1JUICAgICAgICAgICAgICBQYXJhbGxlbER1cmF0aW9uOyAgICAgICAgICAgLy8gTWF4aW11bSBkdXJhdGlvbiBmb3IgcGFyYWxsZWwgbWVhc3VyZW1lbnQKKwlVQ0hBUiAgICAgICAgICAgICAgIFBhcmFsbGVsQ2hhbm5lbDsgICAgICAgICAgICAvLyBPbmx5IG9uZSBjaGFubmVsIHdpdGggcGFyYWxsZWwgbWVhc3VyZW1lbnQKKwlVU0hPUlQgICAgICAgICAgICAgIElBUFBUb2tlbjsgICAgICAgICAgICAgICAgICAvLyBJQVBQIGRpYWxvZyB0b2tlbgorCVVDSEFSICAgICAgICAgICAgICAgQ0NYUW9zRUNXTWluOyAgICAgICAgICAgICAgIC8vIENpc2NvIFFPUyBFQ1dNaW4gZm9yIEFDIDAKKwlVQ0hBUiAgICAgICAgICAgICAgIENDWFFvc0VDV01heDsgICAgICAgICAgICAgICAvLyBDaXNjbyBRT1MgRUNXTWF4IGZvciBBQyAwCisJLy8gSGFjayBmb3IgY2hhbm5lbCBsb2FkIGFuZCBub2lzZSBoaXN0b2dyYW0gcGFyYW1ldGVycworCVVDSEFSICAgICAgICAgICAgICAgTkhGYWN0b3I7ICAgICAgICAgICAgICAgICAgIC8vIFBhcmFtZXRlciBmb3IgTm9pc2UgaGlzdG9ncmFtCisJVUNIQVIgICAgICAgICAgICAgICBDTEZhY3RvcjsgICAgICAgICAgICAgICAgICAgLy8gUGFyYW1ldGVyIGZvciBjaGFubmVsIGxvYWQKKworCVVDSEFSICAgICAgICAgICAgICAgS1JLWzE2XTsgICAgICAgIC8vS2V5IFJlZnJlc2ggS2V5LgorCVVDSEFSICAgICAgICAgICAgICAgQlRLWzMyXTsgICAgICAgIC8vQmFzZSBUcmFuc2llbnQgS2V5CisJQk9PTEVBTiAgICAgICAgICAgICBDQ0tNTGlua1VwRmxhZzsKKwlVTE9ORyAgICAgICAgICAgICAgIENDS01STjsgICAgLy8oUmUpQXNzb2NpYXRpb24gcmVxdWVzdCBudW1iZXIuCisJTEFSR0VfSU5URUdFUiAgICAgICBDQ0tNQmVhY29uQXRKb2luVGltZVN0YW1wOyAgLy9UU0YgdGltZXIgZm9yIFJlLWFzc29jYWl0ZSB0byB0aGUgbmV3IEFQCisJVUNIQVIgICAgICAgICAgICAgICBBaXJvbmV0Q2VsbFBvd2VyTGltaXQ7ICAgICAgLy9pbiBkQm0KKwlVQ0hBUiAgICAgICAgICAgICAgIEFpcm9uZXRJUEFkZHJlc3NbNF07ICAgICAgICAvL2VnLiAxOTIuMTY4LjEuMQorCUJPT0xFQU4gICAgICAgICAgICAgQ0NYQWRqYWNlbnRBUFJlcG9ydEZsYWc7ICAgIC8vZmxhZyBmb3IgZGV0ZXJtaW5pbmcgcmVwb3J0IEFzc29jIExvc3QgdGltZQorCUNIQVIgICAgICAgICAgICAgICAgQ0NYQWRqYWNlbnRBUFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsgLy9BZGphY2VudCBBUCdzIFNTSUQgcmVwb3J0CisJVUNIQVIgICAgICAgICAgICAgICBDQ1hBZGphY2VudEFQU3NpZExlbjsgICAgICAgICAgICAgICAvLyB0aGUgYWN0dWFsIHNzaWQgbGVuZ3RoIGluIHVzZWQKKwlVQ0hBUiAgICAgICAgICAgICAgIENDWEFkamFjZW50QVBCc3NpZFtNQUNfQUREUl9MRU5dOyAgICAgICAgIC8vQWRqYWNlbnQgQVAncyBCU1NJRCByZXBvcnQKKwlVU0hPUlQgICAgICAgICAgICAgIENDWEFkamFjZW50QVBDaGFubmVsOworCVVMT05HICAgICAgICAgICAgICAgQ0NYQWRqYWNlbnRBUExpbmtEb3duVGltZTsgIC8vZm9yIFNwZWMgUzMyLgorCisJUkFMSU5LX1RJTUVSX1NUUlVDVAlTdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lcjsKKwlCT09MRUFOCQkJCVN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyUnVubmluZzsKKworCVVDSEFSICAgICAgICAgICAJRHRpbUNvdW50OyAgICAgIC8vIDAuLiBEdGltUGVyaW9kLTEKKwlVQ0hBUiAgICAgICAgICAgCUR0aW1QZXJpb2Q7ICAgICAvLyBkZWZhdWx0ID0gMworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJUlRfODAyXzExX0RMUwkJRExTRW50cnlbTUFYX05VTV9PRl9ETFNfRU5UUlldOworCVVDSEFSCQkJCURsc1JlcGxheUNvdW50ZXJbOF07CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIFRoaXMgaXMgb25seSBmb3IgV0hRTCB0ZXN0LgorCUJPT0xFQU4JCQkJV2hxbFRlc3Q7CisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgUkFMSU5LX1RJTUVSX1NUUlVDVCBXcGFEaXNhc3NvY0FuZEJsb2NrQXNzb2NUaW1lcjsKKyAgICAvLyBGYXN0IFJvYW1pbmcKKwlCT09MRUFOCQkgICAgICAgIGJGYXN0Um9hbWluZzsgICAgICAgLy8gMDpkaXNhYmxlIGZhc3Qgcm9hbWluZywgMTplbmFibGUgZmFzdCByb2FtaW5nCisJQ0hBUgkJICAgICAgICBkQm1Ub1JvYW07ICAgICAgICAgIC8vIHRoZSBjb25kaXRpb24gdG8gcm9hbSB3aGVuIHJlY2VpdmluZyBSc3NpIGxlc3MgdGhhbiB0aGlzIHZhbHVlLiBJdCdzIG5lZ2F0aXZlIHZhbHVlLgorCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIEJPT0xFQU4gICAgICAgICAgICAgSUVFRTgwMjFYOworICAgIEJPT0xFQU4gICAgICAgICAgICAgSUVFRTgwMjF4X3JlcXVpcmVkX2tleXM7CisgICAgQ0lQSEVSX0tFWQkgICAgICAgIERlc2lyZVNoYXJlZEtleVs0XTsJLy8gUmVjb3JkIHVzZXIgZGVzaXJlZCBXRVAga2V5cworICAgIFVDSEFSICAgICAgICAgICAgICAgRGVzaXJlU2hhcmVkS2V5SWQ7CisKKyAgICAvLyAwOiBkcml2ZXIgaWdub3JlcyB3cGFfc3VwcGxpY2FudAorICAgIC8vIDE6IHdwYV9zdXBwbGljYW50IGluaXRpYXRlcyBzY2FubmluZyBhbmQgQVAgc2VsZWN0aW9uCisgICAgLy8gMjogZHJpdmVyIHRha2VzIGNhcmUgb2Ygc2Nhbm5pbmcsIEFQIHNlbGVjdGlvbiwgYW5kIElFRUUgODAyLjExIGFzc29jaWF0aW9uIHBhcmFtZXRlcnMKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIFdwYVN1cHBsaWNhbnRVUDsKKwlVQ0hBUgkJCQlXcGFTdXBwbGljYW50U2NhbkNvdW50OworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworICAgIENIQVIgICAgICAgICAgICAgICAgZGV2X25hbWVbMTZdOworICAgIFVTSE9SVCAgICAgICAgICAgICAgT3JpRGV2VHlwZTsKKworICAgIEJPT0xFQU4gICAgICAgICAgICAgYlRHbldpZmlUZXN0OworCUJPT0xFQU4JCQkgICAgYlNjYW5SZXFJc0Zyb21XZWJVSTsKKworCUhUVFJBTlNNSVRfU0VUVElORwkJCQlIVFBoeU1vZGUsIE1heEhUUGh5TW9kZSwgTWluSFRQaHlNb2RlOy8vIEZvciB0cmFuc21pdCBwaHkgc2V0dGluZyBpbiBUWFdJLgorCURFU0lSRURfVFJBTlNNSVRfU0VUVElORyAgICAgICAJRGVzaXJlZFRyYW5zbWl0U2V0dGluZzsKKwlSVF9IVF9QSFlfSU5GTwkJCQkJRGVzaXJlZEh0UGh5SW5mbzsKKwlCT09MRUFOCQkJCQkJCWJBdXRvVHhSYXRlU3dpdGNoOworCisjaWZkZWYgUlQyODYwCisgICAgVUNIQVIgICAgICAgQkJQUjM7CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJVUNIQVIJCQkJSUVFRTgwMjExZENsaWVudE1vZGU7CisJVUNIQVIJCQkJU3RhT3JpQ291bnRyeUNvZGVbM107CisJVUNIQVIJCQkJU3RhT3JpR2VvZ3JhcGh5OworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KK30gU1RBX0FETUlOX0NPTkZJRywgKlBTVEFfQURNSU5fQ09ORklHOworCisvLyBUaGlzIGRhdGEgc3RydWN0dXJlIGtlZXAgdGhlIGN1cnJlbnQgYWN0aXZlIEJTUy9JQlNTJ3MgY29uZmlndXJhdGlvbiB0aGF0IHRoaXMgU1RBCisvLyBoYWQgYWdyZWVkIHVwb24gam9pbmluZyB0aGUgbmV0d29yay4gV2hpY2ggbWVhbnMgdGhlc2UgcGFyYW1ldGVycyBhcmUgdXN1YWxseSBkZWNpZGVkCisvLyBieSB0aGUgQlNTL0lCU1MgY3JlYXRvciBpbnN0ZWFkIG9mIHVzZXIgY29uZmlndXJhdGlvbi4gRGF0YSBpbiB0aGlzIGRhdGEgc3RydWN0dXJyZQorLy8gaXMgdmFsaWQgb25seSB3aGVuIGVpdGhlciBBREhPQ19PTihwQWQpIG9yIElORlJBX09OKHBBZCkgaXMgVFJVRS4KKy8vIE5vcm1hbGx5LCBhZnRlciBTQ0FOIG9yIGZhaWxlZCByb2FtaW5nIGF0dGVtcHRzLCB3ZSBuZWVkIHRvIHJlY292ZXIgYmFjayB0bworLy8gdGhlIGN1cnJlbnQgYWN0aXZlIHNldHRpbmdzLgordHlwZWRlZiBzdHJ1Y3QgX1NUQV9BQ1RJVkVfQ09ORklHIHsKKwlVU0hPUlQgICAgICBBaWQ7CisJVVNIT1JUICAgICAgQXRpbVdpbjsgICAgICAgICAgICAgICAgLy8gaW4ga3VzZWM7IElCU1MgcGFyYW1ldGVyIHNldCBlbGVtZW50CisJVVNIT1JUICAgICAgQ2FwYWJpbGl0eUluZm87CisJVVNIT1JUICAgICAgQ2ZwTWF4RHVyYXRpb247CisJVVNIT1JUICAgICAgQ2ZwUGVyaW9kOworCisJLy8gQ29weSBzdXBwb3J0ZWQgcmF0ZSBmcm9tIGRlc2lyZWQgQVAncyBiZWFjb24uIFdlIGFyZSB0cnlpbmcgdG8gbWF0Y2gKKwkvLyBBUCdzIHN1cHBvcnRlZCBhbmQgZXh0ZW5kZWQgcmF0ZSBzZXR0aW5ncy4KKwlVQ0hBUiAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwlVQ0hBUiAgICAgICBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwlVQ0hBUiAgICAgICBTdXBSYXRlTGVuOworCVVDSEFSICAgICAgIEV4dFJhdGVMZW47CisJLy8gQ29weSBzdXBwb3J0ZWQgaHQgZnJvbSBkZXNpcmVkIEFQJ3MgYmVhY29uLiBXZSBhcmUgdHJ5aW5nIHRvIG1hdGNoCisJUlRfSFRfUEhZX0lORk8JCVN1cHBvcnRlZFBoeUluZm87CisJUlRfSFRfQ0FQQUJJTElUWQlTdXBwb3J0ZWRIdFBoeTsKK30gU1RBX0FDVElWRV9DT05GSUcsICpQU1RBX0FDVElWRV9DT05GSUc7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKy8vIC0tLS0tLS0tLS0tIHN0YXJ0IG9mIEFQIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBVVRILVJTUCBTdGF0ZSBNYWNoaW5lIEF1eCBkYXRhIHN0cnVjdHVyZQordHlwZWRlZiBzdHJ1Y3QgX0FQX01MTUVfQVVYIHsKKwlVQ0hBUiAgICAgICAgICAgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKKwlVU0hPUlQgICAgICAgICAgICAgIEFsZzsKKwlDSEFSICAgICAgICAgICAgICAgIENoYWxsZW5nZVtDSVBIRVJfVEVYVF9MRU5dOworfSBBUF9NTE1FX0FVWCwgKlBBUF9NTE1FX0FVWDsKKworLy8gc3RydWN0dXJlIHRvIGRlZmluZSBXUEEgR3JvdXAgS2V5IFJla2V5IEludGVydmFsCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JUXzgwMl8xMV9XUEFfUkVLRVkgeworCVVMT05HIFJlS2V5TWV0aG9kOyAgICAgICAgICAvLyBtZWNoYW5pc20gZm9yIHJla2V5aW5nOiAwOmRpc2FibGUsIDE6IHRpbWUtYmFzZWQsIDI6IHBhY2tldC1iYXNlZAorCVVMT05HIFJlS2V5SW50ZXJ2YWw7ICAgICAgICAvLyB0aW1lLWJhc2VkOiBzZWNvbmRzLCBwYWNrZXQtYmFzZWQ6IGtpbG8tcGFja2V0cworfSBSVF9XUEFfUkVLRVksKlBSVF9XUEFfUkVLRVksIFJUXzgwMl8xMV9XUEFfUkVLRVksICpQUlRfODAyXzExX1dQQV9SRUtFWTsKKwordHlwZWRlZiBzdHJ1Y3QgX01BQ19UQUJMRV9FTlRSWSB7CisJLy9DaG9vc2UgMSBmcm9tIFZhbGlkQXNXRFMgYW5kIFZhbGlkQXNDTEkgIHRvIHZhbGlkaXplLgorCUJPT0xFQU4JCVZhbGlkQXNDTEk7CQkvLyBTdGEgbW9kZSwgc2V0IHRoaXMgVFJVRSBhZnRlciBMaW5rdXAsdG9vLgorCUJPT0xFQU4JCVZhbGlkQXNXRFM7CS8vIFRoaXMgaXMgV0RTIEVudHJ5LiBvbmx5IGZvciBBUCBtb2RlLgorCUJPT0xFQU4JCVZhbGlkQXNBcENsaTsgICAvL1RoaXMgaXMgYSBBUC1DbGllbnQgZW50cnksIG9ubHkgZm9yIEFQIG1vZGUgd2hpY2ggZW5hYmxlIEFQLUNsaWVudCBmdW5jdGlvbnMuCisJQk9PTEVBTgkJVmFsaWRBc01lc2g7CisJQk9PTEVBTgkJVmFsaWRBc0RsczsJLy8gVGhpcyBpcyBETFMgRW50cnkuIG9ubHkgZm9yIFNUQSBtb2RlLgorCUJPT0xFQU4JCWlzQ2FjaGVkOworCUJPT0xFQU4JCWJJQW1CYWRBdGhlcm9zOwkvLyBGbGFnIGlmIHRoaXMgaXMgQXRoZXJvcyBjaGlwIHRoYXQgaGFzIElPVCBwcm9ibGVtLiAgV2UgbmVlZCB0byB0dXJuIG9uIFJUUy9DVFMgcHJvdGVjdGlvbi4KKworCVVDSEFSICAgICAgICAgCUVucXVldWVFYXBvbFN0YXJ0VGltZXJSdW5uaW5nOyAgLy8gRW5xdWV1ZSBFQVBvTC1TdGFydCBmb3IgdHJpZ2dlcmluZyBFQVAgU00KKwkvL2phbiBmb3Igd3BhCisJLy8gcmVjb3JkIHdoaWNoIGVudHJ5IHJldm9rZSBNSUMgRmFpbHVyZSAsIGlmIGl0IGxlYXZlcyB0aGUgQlNTIGl0c2VsZiwgQVAgd29uJ3QgdXBkYXRlIGFNSUNGYWlsVGltZSBNSUIKKwlVQ0hBUiAgICAgICAgICAgQ01UaW1lclJ1bm5pbmc7CisJVUNIQVIgICAgICAgICAgIGFwaWR4OwkJCS8vIE1CU1MgbnVtYmVyCisJVUNIQVIgICAgICAgICAgIFJTTklFX0xlbjsKKwlVQ0hBUiAgICAgICAgICAgUlNOX0lFW01BWF9MRU5fT0ZfUlNOSUVdOworCVVDSEFSICAgICAgICAgICBBTm9uY2VbTEVOX0tFWV9ERVNDX05PTkNFXTsKKwlVQ0hBUiAgICAgICAgICAgUl9Db3VudGVyW0xFTl9LRVlfREVTQ19SRVBMQVldOworCVVDSEFSICAgICAgICAgICBQVEtbNjRdOworCVVDSEFSICAgICAgICAgICBSZVRyeUNvdW50ZXI7CisJUkFMSU5LX1RJTUVSX1NUUlVDVCAgICAgICAgICAgICAgICAgUmV0cnlUaW1lcjsKKwlSQUxJTktfVElNRVJfU1RSVUNUCQkJCQlFbnF1ZXVlU3RhcnRGb3JQU0tUaW1lcjsJLy8gQSB0aW1lciB3aGljaCBlbnF1ZXVlIEVBUG9MLVN0YXJ0IGZvciB0cmlnZ2VyaW5nIFBTSyBTTQorCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgICAgIEF1dGhNb2RlOyAgIC8vIFRoaXMgc2hvdWxkIG1hdGNoIHRvIHdoYXRldmVyIG1pY3Jvc29mdCBkZWZpbmVkCisJTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgV2VwU3RhdHVzOworCUFQX1dQQV9TVEFURSAgICBXcGFTdGF0ZTsKKwlHVEtfU1RBVEUgICAgICAgR1RLU3RhdGU7CisJVVNIT1JUICAgICAgICAgIFBvcnRTZWN1cmVkOworCU5ESVNfODAyXzExX1BSSVZBQ1lfRklMVEVSICBQcml2YWN5RmlsdGVyOyAgICAgIC8vIFByaXZhY3lGaWx0ZXIgZW51bSBmb3IgODAyLjFYCisJQ0lQSEVSX0tFWSAgICAgIFBhaXJ3aXNlS2V5OworCVBWT0lEICAgICAgICAgICBwQWQ7CisgICAgSU5UCQkJCVBNS0lEX0NhY2hlSWR4OworICAgIFVDSEFSCQkJUE1LSURbTEVOX1BNS0lEXTsKKworCisJVUNIQVIgICAgICAgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUiAgICAgICAgICAgUHNNb2RlOworCVNTVCAgICAgICAgICAgICBTc3Q7CisJQVVUSF9TVEFURSAgICAgIEF1dGhTdGF0ZTsgLy8gZm9yIFNIQVJFRCBLRVkgYXV0aGVudGljYXRpb24gc3RhdGUgbWFjaGluZSB1c2VkIG9ubHkKKwlCT09MRUFOCQkJSXNSZWFzc29jU3RhOwkvLyBJbmRpY2F0ZSB3aGV0aGVyIHRoaXMgaXMgYSByZWFzc29jaWF0aW9uIHByb2NlZHVyZQorCVVTSE9SVCAgICAgICAgICBBaWQ7CisJVVNIT1JUICAgICAgICAgIENhcGFiaWxpdHlJbmZvOworCVVDSEFSICAgICAgICAgICBMYXN0UnNzaTsKKwlVTE9ORyAgICAgICAgICAgTm9EYXRhSWRsZUNvdW50OworCVVJTlQxNgkJCVN0YXRpb25LZWVwQWxpdmVDb3VudDsgLy8gdW5pdDogc2Vjb25kCisJVUxPTkcgICAgICAgICAgIFBzUUlkbGVDb3VudDsKKwlRVUVVRV9IRUFERVIgICAgUHNRdWV1ZTsKKworCVVJTlQzMgkJCVN0YUNvbm5lY3RUaW1lOwkJLy8gdGhlIGxpdmUgdGltZSBvZiB0aGlzIHN0YXRpb24gc2luY2UgYXNzb2NpYXRlZCB3aXRoIEFQCisKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCUJPT0xFQU4JCQliU2VuZEJBUjsKKwlVU0hPUlQJCQlOb0JBRGF0YUNvdW50RG93bjsKKworCVVJTlQzMiAgIAkJQ2FjaGVkQnVmWzE2XTsJCS8vIFVJTlQgKDQgYnl0ZXMpIGZvciBhbGlnbm1lbnQKKwlVSU5UCQkJVHhCRkNvdW50OyAvLyAzKjMKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwlVSU5UCQkJRklGT0NvdW50OworCVVJTlQJCQlEZWJ1Z0ZJRk9Db3VudDsKKwlVSU5UCQkJRGVidWdUeENvdW50OworICAgIEJPT0xFQU4JCQliRGxzSW5pdDsKKworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vV0RTIGVudHJ5IG5lZWRzIHRoZXNlCisvLyBydDI4NjAgYWRkIHRoaXMuIGlmIFZhbGlkQXNXRFM9PVRSVUUsIE1hdGNoV0RTVGFiSWR4IGlzIHRoZSBpbmRleCBpbiBXZHNUYWIuTWFjVGFiCisJVUlOVAkJCU1hdGNoV0RTVGFiSWR4OworCVVDSEFSICAgICAgICAgICBNYXhTdXBwb3J0ZWRSYXRlOworCVVDSEFSICAgICAgICAgICBDdXJyVHhSYXRlOworCVVDSEFSICAgICAgICAgICBDdXJyVHhSYXRlSW5kZXg7CisJLy8gdG8gcmVjb3JkIHRoZSBlYWNoIFRYIHJhdGUncyBxdWFsaXR5LiAwIGlzIGJlc3QsIHRoZSBiaWdnZXIgdGhlIHdvcnNlLgorCVVTSE9SVCAgICAgICAgICBUeFF1YWxpdHlbTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0hdOworCVVJTlQzMgkJCU9uZVNlY1R4Tm9SZXRyeU9rQ291bnQ7CisJVUlOVDMyICAgICAgICAgIE9uZVNlY1R4UmV0cnlPa0NvdW50OworCVVJTlQzMiAgICAgICAgICBPbmVTZWNUeEZhaWxDb3VudDsKKwlVSU5UMzIJCQlDb250aW51ZVR4RmFpbENudDsKKwlVSU5UMzIgICAgICAgICAgQ3VyclR4UmF0ZVN0YWJsZVRpbWU7IC8vICMgb2Ygc2Vjb25kIGluIGN1cnJlbnQgVFggcmF0ZQorCVVDSEFSICAgICAgICAgICBUeFJhdGVVcFBlbmFsdHk7ICAgICAgLy8gZXh0cmEgIyBvZiBzZWNvbmQgcGVuYWx0eSBkdWUgdG8gbGFzdCB1bnN0YWJsZSBjb25kaXRpb24KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCVVJTlQJCQlNYXRjaERsc0VudHJ5SWR4OyAvLyBpbmRpY2F0ZSB0aGUgaW5kZXggaW4gcEFkLT5TdGFDZmcuRExTRW50cnkKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCUJPT0xFQU4gICAgICAgICBmTm9pc3lFbnZpcm9ubWVudDsKKwlCT09MRUFOCQkJZkxhc3RTZWNBY2NvcmRpbmdSU1NJOworCVVDSEFSICAgICAgICAgICBMYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uOyAvLyAwOiBubyBjaGFuZ2UsIDE6cmF0ZSBVUCwgMjpyYXRlIGRvd24KKwlDSEFSCQkJTGFzdFRpbWVUeFJhdGVDaGFuZ2VBY3Rpb247IC8vS2VlcCBsYXN0IHRpbWUgdmFsdWUgb2YgTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbgorCVVMT05HCQkJTGFzdFR4T2tDb3VudDsKKwlVQ0hBUiAgICAgICAgICAgUEVSW01BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIXTsKKworCS8vIGEgYml0bWFwIG9mIEJPT0xFQU4gZmxhZ3MuIGVhY2ggYml0IHJlcHJlc2VudCBhbiBvcGVyYXRpb24gc3RhdHVzIG9mIGEgcGFydGljdWxhcgorCS8vIEJPT0xFQU4gY29udHJvbCwgZWl0aGVyIE9OIG9yIE9GRi4gVGhlc2UgZmxhZ3Mgc2hvdWxkIGFsd2F5cyBiZSBhY2Nlc3NlZCB2aWEKKwkvLyBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRygpLCBDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCksIENMSUVOVF9TVEFUVVNfQ0xFQVJfRkxBRygpIG1hY3Jvcy4KKwkvLyBzZWUgZk9QX1NUQVRVU194eHggaW4gUlRNUF9ERUYuQyBmb3IgZGV0YWlsIGJpdCBkZWZpbml0aW9uLiBmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQKKwlVTE9ORyAgICAgICAgICAgQ2xpZW50U3RhdHVzRmxhZ3M7CisKKwkvLyBUT0RPOiBTaGFsbCB3ZSBtb3ZlIHRoYXQgdG8gRE9UMTFfTl9TVVBQT1JUPz8/CisJSFRUUkFOU01JVF9TRVRUSU5HCUhUUGh5TW9kZSwgTWF4SFRQaHlNb2RlLCBNaW5IVFBoeU1vZGU7Ly8gRm9yIHRyYW5zbWl0IHBoeSBzZXR0aW5nIGluIFRYV0kuCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkvLyBIVCBFV0MgTUlNTy1OIHVzZWQgcGFyYW1ldGVycworCVVTSE9SVAkJUlhCQWJpdG1hcDsJLy8gZmlsbCB0byBvbi1jaGlwICBSWFdJX0JBX0JJVE1BU0sgaW4gOC4xLjNSWCBhdHRyaWJ1dGUgZW50cnkgZm9ybWF0CisJVVNIT1JUCQlUWEJBYml0bWFwOwkvLyBUaGlzIGJpdG1hcCBhcyBvcmlnaW5hdG9yLCBvbmx5IGtlZXAgaW4gc29mdHdhcmUgdXNlZCB0byBtYXJrIEFNUERVIGJpdCBpbiBUWFdJCisJVVNIT1JUCQlUWEF1dG9CQWJpdG1hcDsKKwlVU0hPUlQJCUJBRGVjbGluZUJpdG1hcDsKKwlVU0hPUlQJCUJBUmVjV2NpZEFycmF5W05VTV9PRl9USURdOwkvLyBUaGUgbWFwcGluZyB3Y2lkIG9mIHJlY2lwaWVudCBzZXNzaW9uLiBpZiBSWEJBYml0bWFwIGJpdCBpcyBtYXNrZWQKKwlVU0hPUlQJCUJBT3JpV2NpZEFycmF5W05VTV9PRl9USURdOyAvLyBUaGUgbWFwcGluZyB3Y2lkIG9mIG9yaWdpbmF0b3Igc2Vzc2lvbi4gaWYgVFhCQWJpdG1hcCBiaXQgaXMgbWFza2VkCisJVVNIT1JUCQlCQU9yaVNlcXVlbmNlW05VTV9PRl9USURdOyAvLyBUaGUgbWFwcGluZyB3Y2lkIG9mIG9yaWdpbmF0b3Igc2Vzc2lvbi4gaWYgVFhCQWJpdG1hcCBiaXQgaXMgbWFza2VkCisKKwkvLyA4MDIuMTFuIGZlYXR1cmVzLgorCVVDSEFSCQlNcGR1RGVuc2l0eTsKKwlVQ0hBUgkJTWF4UkFtcGR1RmFjdG9yOworCVVDSEFSCQlBTXNkdVNpemU7CisJVUNIQVIJCU1tcHNNb2RlOwkvLyBNSU1PIHBvd2VyIHNhdmUgbW9yZS4KKworCUhUX0NBUEFCSUxJVFlfSUUJCUhUQ2FwYWJpbGl0eTsKKworI2lmZGVmIERPVDExTl9EUkFGVDMKKwlVQ0hBUgkJQlNTMjA0MENvZXhpc3RlbmNlTWdtdFN1cHBvcnQ7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJQk9PTEVBTgkJYkF1dG9UeFJhdGVTd2l0Y2g7CisKKwlVQ0hBUiAgICAgICBSYXRlTGVuOworCXN0cnVjdCBfTUFDX1RBQkxFX0VOVFJZICpwTmV4dDsKKyAgICBVU0hPUlQgICAgICBUeFNlcVtOVU1fT0ZfVElEXTsKKwlVU0hPUlQJCU5vblFvc0RhdGFTZXE7CisKKwlSU1NJX1NBTVBMRQlSc3NpU2FtcGxlOworCisJVUlOVDMyCQkJVFhNQ1NFeHBlY3RlZFsxNl07CisJVUlOVDMyCQkJVFhNQ1NTdWNjZXNzZnVsWzE2XTsKKwlVSU5UMzIJCQlUWE1DU0ZhaWxlZFsxNl07CisJVUlOVDMyCQkJVFhNQ1NBdXRvRmFsbEJhY2tbMTZdWzE2XTsKK30gTUFDX1RBQkxFX0VOVFJZLCAqUE1BQ19UQUJMRV9FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgX01BQ19UQUJMRSB7CisJVVNIT1JUCQkJU2l6ZTsKKwlNQUNfVEFCTEVfRU5UUlkgKkhhc2hbSEFTSF9UQUJMRV9TSVpFXTsKKwlNQUNfVEFCTEVfRU5UUlkgQ29udGVudFtNQVhfTEVOX09GX01BQ19UQUJMRV07CisJUVVFVUVfSEVBREVSICAgIE1jYXN0UHNRdWV1ZTsKKwlVTE9ORyAgICAgICAgICAgUHNRSWRsZUNvdW50OworCUJPT0xFQU4gICAgICAgICBmQW55U3RhdGlvbkluUHNtOworCUJPT0xFQU4gICAgICAgICBmQW55U3RhdGlvbkJhZEF0aGVyb3M7CS8vIENoZWNrIGlmIGFueSBTdGF0aW9uIGlzIGF0aGVyb3MgODAyLjExbiBDaGlwLiAgV2UgbmVlZCB0byB1c2UgUlRTL0NUUyB3aXRoIEF0aGVyb3MgODAyLC4xMW4gY2hpcC4KKwlCT09MRUFOCQkJZkFueVR4T1BGb3JjZURpc2FibGU7CS8vIENoZWNrIGlmIGl0IGlzIG5lY2Vzc2FyeSB0byBkaXNhYmxlIEJFIFR4T1AKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlCT09MRUFOICAgICAgICAgZkFueVN0YXRpb25Jc0xlZ2FjeTsJLy8gQ2hlY2sgaWYgSSB1c2UgbGVnYWN5IHJhdGUgdG8gdHJhbnNtaXQgdG8gbXkgQlNTIFN0YXRpb24vCisJQk9PTEVBTiAgICAgICAgIGZBbnlTdGF0aW9uTm9uR0Y7CQkvLyBDaGVjayBpZiBhbnkgU3RhdGlvbiBjYW4ndCBzdXBwb3J0IEdGLgorCUJPT0xFQU4gICAgICAgICBmQW55U3RhdGlvbjIwT25seTsJCS8vIENoZWNrIGlmIGFueSBTdGF0aW9uIGNhbid0IHN1cHBvcnQgR0YuCisJQk9PTEVBTgkJCWZBbnlTdGF0aW9uTUlNT1BTRHluYW1pYzsgLy8gQ2hlY2sgaWYgYW55IFN0YXRpb24gaXMgTUlNTyBEeW5hbWljCisJQk9PTEVBTiAgICAgICAgIGZBbnlCQVNlc3Npb247ICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgQkEgc2Vzc2lvbi4gIEZvcmNlIHR1cm4gb24gUlRTL0NUUworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworfSBNQUNfVEFCTEUsICpQTUFDX1RBQkxFOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisjZGVmaW5lIElTX0hUX1NUQShfcE1hY0VudHJ5KQlcCisJKF9wTWFjRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID49IE1PREVfSFRNSVgpCisKKyNkZWZpbmUgSVNfSFRfUkFURShfcE1hY0VudHJ5KQlcCisJKF9wTWFjRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID49IE1PREVfSFRNSVgpCisKKyNkZWZpbmUgUEVFUl9JU19IVF9SQVRFKF9wTWFjRW50cnkpCVwKKwkoX3BNYWNFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwordHlwZWRlZiBzdHJ1Y3QgX1dEU19FTlRSWSB7CisJQk9PTEVBTiAgICAgICAgIFZhbGlkOworCVVDSEFSICAgICAgICAgICBBZGRyW01BQ19BRERSX0xFTl07CisJVUxPTkcgICAgICAgICAgIE5vRGF0YUlkbGVDb3VudDsKKwlzdHJ1Y3QgX1dEU19FTlRSWSAqcE5leHQ7Cit9IFdEU19FTlRSWSwgKlBXRFNfRU5UUlk7CisKK3R5cGVkZWYgc3RydWN0ICBfV0RTX1RBQkxFX0VOVFJZIHsKKwlVU0hPUlQJCQlTaXplOworCVVDSEFSICAgICAgICAgICBXZHNBZGRyW01BQ19BRERSX0xFTl07CisJV0RTX0VOVFJZICAgICAgICpIYXNoW0hBU0hfVEFCTEVfU0laRV07CisJV0RTX0VOVFJZICAgICAgIENvbnRlbnRbTUFYX0xFTl9PRl9NQUNfVEFCTEVdOworCVVDSEFSICAgICAgICAgICBNYXhTdXBwb3J0ZWRSYXRlOworCVVDSEFSICAgICAgICAgICBDdXJyVHhSYXRlOworCVVTSE9SVCAgICAgICAgICBUeFF1YWxpdHlbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVTSE9SVCAgICAgICAgICBPbmVTZWNUeE9rQ291bnQ7CisJVVNIT1JUICAgICAgICAgIE9uZVNlY1R4UmV0cnlPa0NvdW50OworCVVTSE9SVCAgICAgICAgICBPbmVTZWNUeEZhaWxDb3VudDsKKwlVTE9ORyAgICAgICAgICAgQ3VyclR4UmF0ZVN0YWJsZVRpbWU7IC8vICMgb2Ygc2Vjb25kIGluIGN1cnJlbnQgVFggcmF0ZQorCVVDSEFSICAgICAgICAgICBUeFJhdGVVcFBlbmFsdHk7ICAgICAgLy8gZXh0cmEgIyBvZiBzZWNvbmQgcGVuYWx0eSBkdWUgdG8gbGFzdCB1bnN0YWJsZSBjb25kaXRpb24KK30gV0RTX1RBQkxFX0VOVFJZLCAqUFdEU19UQUJMRV9FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9XRFNfRU5UUlkgeworCVBORVRfREVWCQkJZGV2OworCVVDSEFSCQkJCVZhbGlkOworCVVDSEFSCQkJCVBoeU1vZGU7CisJVUNIQVIJCQkJUGVlcldkc0FkZHJbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUgkJCQlNYWNUYWJNYXRjaFdDSUQ7CS8vIEFTSUMKKwlORElTXzgwMl8xMV9XRVBfU1RBVFVTICBXZXBTdGF0dXM7CisJVUNIQVIJCQkJCUtleUlkeDsKKwlDSVBIRVJfS0VZICAgICAgICAgIAlXZHNLZXk7CisJSFRUUkFOU01JVF9TRVRUSU5HCQkJCUhUUGh5TW9kZSwgTWF4SFRQaHlNb2RlLCBNaW5IVFBoeU1vZGU7CisJUlRfSFRfUEhZX0lORk8JCQkJCURlc2lyZWRIdFBoeUluZm87CisJQk9PTEVBTgkJCQkJCQliQXV0b1R4UmF0ZVN3aXRjaDsKKwlERVNJUkVEX1RSQU5TTUlUX1NFVFRJTkcgICAgICAgCURlc2lyZWRUcmFuc21pdFNldHRpbmc7IC8vIERlc2lyZWQgdHJhbnNtaXQgc2V0dGluZy4KK30gUlRfODAyXzExX1dEU19FTlRSWSwgKlBSVF84MDJfMTFfV0RTX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCBfV0RTX1RBQkxFIHsKKwlVQ0hBUiAgICAgICAgICAgICAgIE1vZGU7CisJVUxPTkcgICAgICAgICAgICAgICBTaXplOworCVJUXzgwMl8xMV9XRFNfRU5UUlkJV2RzRW50cnlbTUFYX1dEU19FTlRSWV07Cit9IFdEU19UQUJMRSwgKlBXRFNfVEFCTEU7CisKK3R5cGVkZWYgc3RydWN0IF9BUENMSV9TVFJVQ1QgeworCVBORVRfREVWCQkJCWRldjsKKyNpZmRlZiBSVEw4NjVYX1NPQworCXVuc2lnbmVkIGludCAgICAgICAgICAgIG15bGlua2lkOworI2VuZGlmCisJQk9PTEVBTiAgICAgICAgICAgICAgICAgRW5hYmxlOwkvLyBTZXQgaXQgYXMgMSBpZiB0aGUgYXBjbGkgaW50ZXJmYWNlIHdhcyBjb25maWd1cmVkIHRvICIxIiAgb3IgYnkgaXdwcml2IGNtZCAiQXBDbGlFbmFibGUiCisJQk9PTEVBTiAgICAgICAgICAgICAgICAgVmFsaWQ7CS8vIFNldCBpdCBhcyAxIGlmIHRoZSBhcGNsaSBpbnRlcmZhY2UgYXNzb2NpYXRlZCBzdWNjZXNzIHRvIHJlbW90ZSBBUC4KKwlVQ0hBUgkJCQkJTWFjVGFiV0NJRDsJLy9XQ0lEIHZhbHVlLCB3aGljaCBwb2ludCB0byB0aGUgZW50cnkgb2YgQVNJQyBNYWMgdGFibGUuCisJVUNIQVIgICAgICAgICAgICAgICAgICAgU3NpZExlbjsKKwlDSEFSICAgICAgICAgICAgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07CisKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBDZmdTc2lkTGVuOworCUNIQVIgICAgICAgICAgICAgICAgICAgIENmZ1NzaWRbTUFYX0xFTl9PRl9TU0lEXTsKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBDZmdBcENsaUJzc2lkW0VUSF9MRU5HVEhfT0ZfQUREUkVTU107CisJVUNIQVIgICAgICAgICAgICAgICAgICAgQ3VycmVudEFkZHJlc3NbRVRIX0xFTkdUSF9PRl9BRERSRVNTXTsKKworCVVMT05HICAgICAgICAgICAgICAgICAgIEFwQ2xpUmN2QmVhY29uVGltZTsKKworCVVMT05HICAgICAgICAgICAgICAgICAgIEN0cmxDdXJyU3RhdGU7CisJVUxPTkcgICAgICAgICAgICAgICAgICAgU3luY0N1cnJTdGF0ZTsKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBBdXRoQ3VyclN0YXRlOworCVVMT05HICAgICAgICAgICAgICAgICAgIEFzc29jQ3VyclN0YXRlOworCVVMT05HCQkJCQlXcGFQc2tDdXJyU3RhdGU7CisKKwlVU0hPUlQgICAgICAgICAgICAgICAgICBBdXRoUmVxQ250OworCVVTSE9SVCAgICAgICAgICAgICAgICAgIEFzc29jUmVxQ250OworCisJVUxPTkcgICAgICAgICAgICAgICAgICAgQ2xpZW50U3RhdHVzRmxhZ3M7CisJVUNIQVIgICAgICAgICAgICAgICAgICAgTXBkdURlbnNpdHk7CisKKwlORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFICAgICBBdXRoTW9kZTsgICAvLyBUaGlzIHNob3VsZCBtYXRjaCB0byB3aGF0ZXZlciBtaWNyb3NvZnQgZGVmaW5lZAorCU5ESVNfODAyXzExX1dFUF9TVEFUVVMgICAgICAgICAgICAgIFdlcFN0YXR1czsKKworCS8vIEFkZCB0byBzdXBwb3J0IGRpZmZlcmVudCBjaXBoZXIgc3VpdGUgZm9yIFdQQTIvV1BBIG1vZGUKKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwkJR3JvdXBDaXBoZXI7CQkvLyBNdWx0aWNhc3QgY2lwaGVyIHN1aXRlCisJTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJCVBhaXJDaXBoZXI7CQkJLy8gVW5pY2FzdCBjaXBoZXIgc3VpdGUKKwlCT09MRUFOCQkJCQkJCQliTWl4Q2lwaGVyOwkJCS8vIEluZGljYXRlIGN1cnJlbnQgUGFpciAmIEdyb3VwIHVzZSBkaWZmZXJlbnQgY2lwaGVyIHN1aXRlcworCVVTSE9SVAkJCQkJCQkJUnNuQ2FwYWJpbGl0eTsKKworCVVDSEFSCQlQU0tbMTAwXTsJCQkJLy8gcmVzZXJ2ZSBQU0sga2V5IG1hdGVyaWFsCisJVUNIQVIgICAgICAgUFNLTGVuOworCVVDSEFSICAgICAgIFBNS1szMl07ICAgICAgICAgICAgICAgIC8vIFdQQSBQU0sgbW9kZSBQTUsKKwlVQ0hBUgkJR1RLWzMyXTsJCQkJLy8gR1RLIGZyb20gYXV0aGVudGljYXRvcgorCisJQ0lQSEVSX0tFWSAgICAgIFNoYXJlZEtleVtTSEFSRV9LRVlfTlVNXTsKKwlVQ0hBUiAgICAgICAgICAgRGVmYXVsdEtleUlkOworCisJLy8gc3RvcmUgUlNOX0lFIGJ1aWx0IGJ5IGRyaXZlcgorCVVDSEFSCQlSU05fSUVbTUFYX0xFTl9PRl9SU05JRV07ICAvLyBUaGUgY29udGVudCBzYXZlZCBoZXJlIHNob3VsZCBiZSBjb252ZXJ0IHRvIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgorCVVDSEFSCQlSU05JRV9MZW47CisKKwkvLyBGb3IgV1BBIGNvdW50ZXJtZWFzdXJlcworCVVMT05HICAgICAgIExhc3RNaWNFcnJvclRpbWU7ICAgLy8gcmVjb3JkIGxhc3QgTUlDIGVycm9yIHRpbWUKKwlCT09MRUFOICAgICAgICAgICAgICAgICBiQmxvY2tBc3NvYzsgLy8gQmxvY2sgYXNzb2NpYXRlIGF0dGVtcHQgZm9yIDYwIHNlY29uZHMgYWZ0ZXIgY291bnRlciBtZWFzdXJlIG9jY3VycmVkLgorCisJLy8gRm9yIFdQQS1QU0sgc3VwcGxpY2FudCBzdGF0ZQorCVVDSEFSICAgICAgIAlTTm9uY2VbMzJdOyAgICAgICAgIC8vIFNOb25jZSBmb3IgV1BBLVBTSworCVVDSEFSCQkJR05vbmNlWzMyXTsJCQkvLyBHTm9uY2UgZm9yIFdQQS1QU0sgZnJvbSBhdXRoZW50aWNhdG9yCisKKyNpZmRlZiBXU0NfQVBfU1VQUE9SVAorCVdTQ19DVFJMCSAgICAgICAgICAgV3NjQ29udHJvbDsKKyNlbmRpZiAvLyBXU0NfQVBfU1VQUE9SVCAvLworCisJSFRUUkFOU01JVF9TRVRUSU5HCQkJCUhUUGh5TW9kZSwgTWF4SFRQaHlNb2RlLCBNaW5IVFBoeU1vZGU7CisJUlRfSFRfUEhZX0lORk8JCQkJCURlc2lyZWRIdFBoeUluZm87CisJQk9PTEVBTgkJCQkJCQliQXV0b1R4UmF0ZVN3aXRjaDsKKwlERVNJUkVEX1RSQU5TTUlUX1NFVFRJTkcgICAgICAgCURlc2lyZWRUcmFuc21pdFNldHRpbmc7IC8vIERlc2lyZWQgdHJhbnNtaXQgc2V0dGluZy4KK30gQVBDTElfU1RSVUNULCAqUEFQQ0xJX1NUUlVDVDsKKworLy8gLS0tLS0tLS0tLS0gZW5kIG9mIEFQIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIEJMT0NLX05FVF9JRgordHlwZWRlZiBzdHJ1Y3QgX0JMT0NLX1FVRVVFX0VOVFJZCit7CisJQk9PTEVBTiBTd1R4UXVldWVCbG9ja0ZsYWc7CisJTElTVF9IRUFERVIgTmV0SWZMaXN0OworfSBCTE9DS19RVUVVRV9FTlRSWSwgKlBCTE9DS19RVUVVRV9FTlRSWTsKKyNlbmRpZiAvLyBCTE9DS19ORVRfSUYgLy8KKworc3RydWN0IHdpZmljb25mCit7CisJQk9PTEVBTgliU2hvcnRHSTsKKwlCT09MRUFOIGJHcmVlbkZpZWxkOworfTsKKworCisKKwordHlwZWRlZiBzdHJ1Y3QgX0lORl9QQ0lfQ09ORklHCit7CisJUFVDSEFSICAgICAgICAgICAgICAgICAgQ1NSQmFzZUFkZHJlc3M7ICAgICAvLyBQQ0kgTU1JTyBCYXNlIEFkZHJlc3MsIGFsbCBhY2Nlc3Mgd2lsbCB1c2UKK31JTkZfUENJX0NPTkZJRzsKKwordHlwZWRlZiBzdHJ1Y3QgX0lORl9VU0JfQ09ORklHCit7CisJVUlOVCAgICAgICAgICAgICAgICBCdWxrSW5FcEFkZHI7CQkvLyBidWxrLWluIGVuZHBvaW50IGFkZHJlc3MKKwlVSU5UICAgICAgICAgICAgICAgIEJ1bGtPdXRFcEFkZHJbNl07CS8vIGJ1bGstb3V0IGVuZHBvaW50IGFkZHJlc3MKKworfUlORl9VU0JfQ09ORklHOworCisjaWZkZWYgSUtBTk9TX1ZYXzFYMAorCXR5cGVkZWYgdm9pZCAoKklrYW5vc1dsYW5UeENiRnVuY1ApKHZvaWQgKiwgdm9pZCAqKTsKKworCXN0cnVjdCBJS0FOT1NfVFhfSU5GTworCXsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwkJSWthbm9zV2xhblR4Q2JGdW5jUCAqZnA7CisJfTsKKyNlbmRpZiAvLyBJS0FOT1NfVlhfMVgwIC8vCisKKyNpZmRlZiBOSU5URU5ET19BUAordHlwZWRlZiBzdHJ1Y3QgX05JTkRPX0NUUkxfQkxPQ0sgeworCisJUlRfTklOVEVORE9fVEFCTEUJRFNfVEFCTEU7CisKKyNpZmRlZiBDSElQMjVYWAorCXNwaW5sb2NrX3QJCQlOSU5URU5ET19UQUJMRV9Mb2NrOworI2Vsc2UKKwlORElTX1NQSU5fTE9DSwkJTklOVEVORE9fVEFCTEVfTG9jazsKKyNlbmRpZiAvLyBDSElQMjVYWCAvLworCisJVUNIQVIJCQkJTklOVEVORE9fVVBfQlVGRkVSWzUxMl07CisJVUNIQVIJCQkJTG9jYWxfS2V5SWR4OworCUNJUEhFUl9LRVkJCQlMb2NhbF9TaGFyZWRLZXk7CisJVUNIQVIJCQkJTG9jYWxfYkhpZGVTc2lkOworCVVDSEFSCQkJCUxvY2FsX0F1dGhNb2RlOworCVVDSEFSCQkJCUxvY2FsX1dlcFN0YXR1czsKKwlVU0hPUlQJCQkJTG9jYWxfQ2FwYWJpbGl0eUluZm87Cit9IE5JTkRPX0NUUkxfQkxPQ0s7CisjZW5kaWYgLy8gTklOVEVORE9fQVAgLy8KKworCisjaWZkZWYgREJHX0RJQUdOT1NFCisjZGVmaW5lIERJQUdOT1NFX1RJTUUJMTAgICAvLyAxMCBzZWMKK3R5cGVkZWYgc3RydWN0IF9SdG1wRGlhZ1N0cmN1dF8KK3sJLy8gRGlhZ25vc2lzIFJlbGF0ZWQgZWxlbWVudAorCXVuc2lnbmVkIGNoYXIJCWluaXRlZDsKKwl1bnNpZ25lZCBjaGFyIAlxSWR4OworCXVuc2lnbmVkIGNoYXIgCUFycmF5U3RhcnRJZHg7CisJdW5zaWduZWQgY2hhcgkJQXJyYXlDdXJJZHg7CisJLy8gVHggUmVsYXRlZCBDb3VudAorCVVTSE9SVAkJCVR4RGF0YUNudFtESUFHTk9TRV9USU1FXTsKKwlVU0hPUlQJCQlUeEZhaWxDbnRbRElBR05PU0VfVElNRV07CisJVVNIT1JUCQkJVHhEZXNjQ250W0RJQUdOT1NFX1RJTUVdWzI0XTsgLy8gMyozCS8vIFR4RGVzYyBxdWV1ZSBsZW5ndGggaW4gc2NhbGUgb2YgMH4xNCwgPj0xNQorCVVTSE9SVAkJCVR4TWNzQ250W0RJQUdOT1NFX1RJTUVdWzI0XTsgLy8gMyozCisJVVNIT1JUCQkJVHhTV1F1ZUNudFtESUFHTk9TRV9USU1FXVs5XTsJCS8vIFR4U3dRdWV1ZSBsZW5ndGggaW4gc2NhbGUgb2YgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgPj04CisKKwlVU0hPUlQJCQlUeEFnZ0NudFtESUFHTk9TRV9USU1FXTsKKwlVU0hPUlQJCQlUeE5vbkFnZ0NudFtESUFHTk9TRV9USU1FXTsKKwlVU0hPUlQJCQlUeEFNUERVQ250W0RJQUdOT1NFX1RJTUVdWzI0XTsgLy8gMyozIC8vIDEwIHNlYywgVHhETUEgQVBNRFUgQWdncmVnYXRpb24gY291bnQgaW4gcmFuZ2UgZnJvbSAwIHRvIDE1LCBpbiBzZXRwIG9mIDEuCisJVVNIT1JUCQkJVHhSYWxpbmtDbnRbRElBR05PU0VfVElNRV07CQkJLy8gVHhSYWxpbmsgQWdncmVnYXRpb24gQ291bnQgaW4gMSBzZWMgc2NhbGUuCisJVVNIT1JUCQkJVHhBTVNEVUNudFtESUFHTk9TRV9USU1FXTsJCQkvLyBUeEFNU1VEIEFnZ3JlZ2F0aW9uIENvdW50IGluIDEgc2VjIHNjYWxlLgorCisJLy8gUnggUmVsYXRlZCBDb3VudAorCVVTSE9SVAkJCVJ4RGF0YUNudFtESUFHTk9TRV9USU1FXTsJCQkvLyBSeCBUb3RhbCBEYXRhIGNvdW50LgorCVVTSE9SVAkJCVJ4Q3JjRXJyQ250W0RJQUdOT1NFX1RJTUVdOworCVVTSE9SVAkJCVJ4TWNzQ250W0RJQUdOT1NFX1RJTUVdWzI0XTsgLy8gMyozCit9UnRtcERpYWdTdHJ1Y3Q7CisjZW5kaWYgLy8gREJHX0RJQUdOT1NFIC8vCisKKworLy8KKy8vICBUaGUgbWluaXBvcnQgYWRhcHRlciBzdHJ1Y3R1cmUKKy8vCit0eXBlZGVmIHN0cnVjdCBfUlRNUF9BREFQVEVSCit7CisJUFZPSUQJCQkJCU9TX0Nvb2tpZTsJLy8gc2F2ZSBzcGVjaWZpYyBzdHJ1Y3R1cmUgcmVsYXRpdmUgdG8gT1MKKwlQTkVUX0RFVgkJCQluZXRfZGV2OworCVVMT05HCQkJCQlWaXJ0dWFsSWZDbnQ7CisKKyNpZmRlZiBSVDI4NjAKKyAgICBVU0hPUlQJCSAgICAgICAgICAgIExua0N0cmxCaXRNYXNrOworICAgIFVTSE9SVAkJICAgICAgICAgICAgUkxua0N0cmxDb25maWd1cmF0aW9uOworICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgIFJMbmtDdHJsT2Zmc2V0OworICAgIFVTSE9SVAkJICAgICAgICAgICAgSG9zdExua0N0cmxDb25maWd1cmF0aW9uOworICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgIEhvc3RMbmtDdHJsT2Zmc2V0OworCVVTSE9SVAkJICAgICAgICAgICAgUENJZVBvd2VyU2F2ZUxldmVsOworICAgCUJPT0xFQU4JCQkJCWJQQ0ljbGtPZmY7CQkJCQkJLy8gZmxhZyB0aGF0IGluZGljYXRlIGlmIHRoZSBQSUNFIHBvd2VyIHN0YXR1cyBpbiBDb25maWd1cmF0aW9uIFNQYWNlLi4KKwlCT09MRUFOCQkJCQliUENJY2xrT2ZmRGlzYWJsZVR4OwkJCS8vCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICBQQ0kgcmVsYXRlZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCVBVQ0hBUiAgICAgICAgICAgICAgICAgIENTUkJhc2VBZGRyZXNzOyAgICAgLy8gUENJIE1NSU8gQmFzZSBBZGRyZXNzLCBhbGwgYWNjZXNzIHdpbGwgdXNlCisKKwlVSU5UCQkJCQlpbnRfZW5hYmxlX3JlZzsKKwlVSU5UCQkJCQlpbnRfZGlzYWJsZV9tYXNrOworCVVJTlQJCQkJCWludF9wZW5kaW5nOworCisKKwlSVE1QX0RNQUJVRiAgICAgICAgICAgICBUeEJ1ZlNwYWNlW05VTV9PRl9UWF9SSU5HXTsgLy8gU2hhcmVkIG1lbW9yeSBvZiBhbGwgMXN0IHByZS1hbGxvY2F0ZWQgVHhCdWYgYXNzb2NpYXRlZCB3aXRoIGVhY2ggVFhECisJUlRNUF9ETUFCVUYgICAgICAgICAgICAgUnhEZXNjUmluZzsgICAgICAgICAgICAgICAgIC8vIFNoYXJlZCBtZW1vcnkgZm9yIFJYIGRlc2NyaXB0b3JzCisJUlRNUF9ETUFCVUYgICAgICAgICAgICAgVHhEZXNjUmluZ1tOVU1fT0ZfVFhfUklOR107IAkvLyBTaGFyZWQgbWVtb3J5IGZvciBUeCBkZXNjcmlwdG9ycworCVJUTVBfVFhfUklORyAgICAgICAgICAgIFR4UmluZ1tOVU1fT0ZfVFhfUklOR107ICAgICAJLy8gQUMwfjQgKyBIQ0NBCisjZW5kaWYgLy8gUlQyODYwIC8vCisKKworCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIGlycV9sb2NrOworCVVDSEFSICAgICAgICAgICAgICAgICAgIGlycV9kaXNhYmxlZDsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvKiAgICAgIEJvdGggUENJL1VTQiByZWxhdGVkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICBUeCByZWxhdGVkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJQk9PTEVBTiAgICAgICAgICAgICAgICAgRGVRdWV1ZVJ1bm5pbmdbTlVNX09GX1RYX1JJTkddOyAgLy8gZm9yIGVuc3VyaW5nIFJUVVNCRGVRdWV1ZVBhY2tldCBnZXQgY2FsbCBvbmNlCisJTkRJU19TUElOX0xPQ0sgICAgICAgICAgRGVRdWV1ZUxvY2tbTlVNX09GX1RYX1JJTkddOworCisKKwkvLyByZXNvdXJjZSBmb3Igc29mdHdhcmUgYmFja2xvZyBxdWV1ZXMKKwlRVUVVRV9IRUFERVIgICAgICAgICAgICBUeFN3UXVldWVbTlVNX09GX1RYX1JJTkddOyAgLy8gNCBBQyArIDEgSENDQQorCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIFR4U3dRdWV1ZUxvY2tbTlVNX09GX1RYX1JJTkddOwkvLyBUeFN3UXVldWUgc3BpbmxvY2sKKworCVJUTVBfRE1BQlVGICAgICAgICAgICAgIE1nbXREZXNjUmluZzsgICAgICAgICAgICAgICAJLy8gU2hhcmVkIG1lbW9yeSBmb3IgTUdNVCBkZXNjcmlwdG9ycworCVJUTVBfTUdNVF9SSU5HICAgICAgICAgIE1nbXRSaW5nOworCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIE1nbXRSaW5nTG9jazsgICAgICAgICAgICAgICAJLy8gUHJpbyBSaW5nIHNwaW5sb2NrCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICBSeCByZWxhdGVkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBSVDI4NjAKKwlSVE1QX1JYX1JJTkcgICAgICAgICAgICBSeFJpbmc7CisJTkRJU19TUElOX0xPQ0sgICAgICAgICAgUnhSaW5nTG9jazsgICAgICAgICAgICAgICAgIC8vIFJ4IFJpbmcgc3BpbmxvY2sKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgQVNJQyByZWxhdGVkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlVSU5UMzIgICAgICAgICAgICAgICAJTUFDVmVyc2lvbjsgICAgICAJLy8gTUFDIHZlcnNpb24uIFJlY29yZCBydDI4NjBDKDB4Mjg2MDAxMDApIG9yIHJ0Mjg2MEQgKDB4Mjg2MDAxMDEpLi4KKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIEUyUFJPTQorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVVMT05HICAgICAgICAgICAgICAgICAgIEVlcHJvbVZlcnNpb247ICAgICAgICAgIC8vIGJ5dGUgMDogdmVyc2lvbiwgYnl0ZSAxOiByZXZpc2lvbiwgYnl0ZSAyfjM6IHVudXNlZAorCVVDSEFSICAgICAgICAgICAgICAgICAgIEVFUFJPTUFkZHJlc3NOdW07ICAgICAgIC8vIDkzYzQ2PTYgIDkzYzY2PTgKKwlVU0hPUlQgICAgICAgICAgICAgICAgICBFRVBST01EZWZhdWx0VmFsdWVbTlVNX0VFUFJPTV9CQlBfUEFSTVNdOworCVVMT05HICAgICAgICAgICAgICAgICAgIEZpcm13YXJlVmVyc2lvbjsgICAgICAgIC8vIGJ5dGUgMDogTWlub3IgdmVyc2lvbiwgYnl0ZSAxOiBNYWpvciB2ZXJzaW9uLCBvdGhlcndpc2UgdW51c2VkLgorCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gQkJQIENvbnRyb2wKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBCYnBXcml0ZUxhdGNoWzE0MF07ICAgICAvLyByZWNvcmQgbGFzdCBCQlAgcmVnaXN0ZXIgdmFsdWUgd3JpdHRlbiB2aWEgQkJQX0lPX1dSSVRFL0JCUF9JT19XUklURV9WWV9SRUdfSUQKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBCYnBSc3NpVG9EYm1EZWx0YTsKKwlCQlBfUjY2X1RVTklORyAgICAgICAgICBCYnBUdW5pbmc7CisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gUkZJQyBjb250cm9sCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVVDSEFSICAgICAgICAgICAgICAgICAgIFJmSWNUeXBlOyAgICAgICAvLyBSRklDX3h4eAorCVVMT05HICAgICAgICAgICAgICAgICAgIFJmRnJlcU9mZnNldDsgICAvLyBGcmVxdWVuY3kgb2Zmc2V0IGZvciBjaGFubmVsIHN3aXRjaGluZworCVJUTVBfUkZfUkVHUyAgICAgICAgICAgIExhdGNoUmZSZWdzOyAgICAvLyBsYXRjaCB0aCBsYXRlc3QgUkYgcHJvZ3JhbW1pbmcgdmFsdWUgc2luY2UgUkYgSUMgZG9lc24ndCBzdXBwb3J0IFJFQUQKKworCUVFUFJPTV9BTlRFTk5BX1NUUlVDICAgIEFudGVubmE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbmNlIEFOdGVubmEgZGVmaW5pdGlvbiBpcyBkaWZmZXJlbnQgZm9yIGEgJiBnLiBXZSBuZWVkIHRvIHNhdmUgaXQgZm9yIGZ1dHVyZSByZWZlcmVuY2UuCisJRUVQUk9NX05JQ19DT05GSUcyX1NUUlVDICAgIE5pY0NvbmZpZzI7CisKKwkvLyBUaGlzIHNvZnQgUnggQW50ZW5uYSBEaXZlcnNpdHkgbWVjaGFuaXNtIGlzIHVzZWQgb25seSB3aGVuIHVzZXIgc2V0CisJLy8gUlggQW50ZW5uYSA9IERJVkVSU0lUWSBPTgorCVNPRlRfUlhfQU5UX0RJVkVSU0lUWSAgIFJ4QW50OworCisJVUNIQVIgICAgICAgICAgICAgICAgICAgUkZQcm9nU2VxOworCUNIQU5ORUxfVFhfUE9XRVIgICAgICAgIFR4UG93ZXJbTUFYX05VTV9PRl9DSEFOTkVMU107ICAgICAgIC8vIFN0b3JlIFR4IHBvd2VyIHZhbHVlIGZvciBhbGwgY2hhbm5lbHMuCisJQ0hBTk5FTF9UWF9QT1dFUiAgICAgICAgQ2hhbm5lbExpc3RbTUFYX05VTV9PRl9DSEFOTkVMU107ICAgLy8gbGlzdCBhbGwgc3VwcG9ydGVkIGNoYW5uZWxzIGZvciBzaXRlIHN1cnZleQorCUNIQU5ORUxfMTFKX1RYX1BPV0VSICAgIFR4UG93ZXIxMUpbTUFYX05VTV9PRl8xMUpDSEFOTkVMU107ICAgICAgIC8vIDgwMi4xMWogY2hhbm5lbCBhbmQgYncKKwlDSEFOTkVMXzExSl9UWF9QT1dFUiAgICBDaGFubmVsTGlzdDExSltNQVhfTlVNX09GXzExSkNIQU5ORUxTXTsgICAvLyBsaXN0IGFsbCBzdXBwb3J0ZWQgY2hhbm5lbHMgZm9yIHNpdGUgc3VydmV5CisKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBDaGFubmVsTGlzdE51bTsgICAgICAgICAgICAgICAgICAgICAvLyBudW1iZXIgb2YgY2hhbm5lbCBpbiBDaGFubmVsTGlzdFtdCisJVUNIQVIJCQkJCUJicDk0OworCUJPT0xFQU4JCQkJCUJicEZvckNDSzsKKwlVTE9ORwkJVHgyME1Qd3JDZmdBQmFuZFs1XTsKKwlVTE9ORwkJVHgyME1Qd3JDZmdHQmFuZFs1XTsKKwlVTE9ORwkJVHg0ME1Qd3JDZmdBQmFuZFs1XTsKKwlVTE9ORwkJVHg0ME1Qd3JDZmdHQmFuZFs1XTsKKworCUJPT0xFQU4gICAgIGJBdXRvVHhBZ2NBOyAgICAgICAgICAgICAgICAvLyBFbmFibGUgZHJpdmVyIGF1dG8gVHggQWdjIGNvbnRyb2wKKwlVQ0hBUgkgICAgVHNzaVJlZkE7CQkJCQkvLyBTdG9yZSBUc3NpIHJlZmVyZW5jZSB2YWx1ZSBhcyAyNSB0ZW1wZXJhdHVyZS4KKwlVQ0hBUgkgICAgVHNzaVBsdXNCb3VuZGFyeUFbNV07CQkvLyBUc3NpIGJvdW5kYXJ5IGZvciBpbmNyZWFzZSBUeCBwb3dlciB0byBjb21wZW5zYXRlLgorCVVDSEFSCSAgICBUc3NpTWludXNCb3VuZGFyeUFbNV07CQkvLyBUc3NpIGJvdW5kYXJ5IGZvciBkZWNyZWFzZSBUeCBwb3dlciB0byBjb21wZW5zYXRlLgorCVVDSEFSCSAgICBUeEFnY1N0ZXBBOwkJCQkJLy8gU3RvcmUgVHggVFNTSSBkZWx0YSBpbmNyZW1lbnQgLyBkZWNyZW1lbnQgdmFsdWUKKwlDSEFSCQlUeEFnY0NvbXBlbnNhdGVBOwkJCS8vIFN0b3JlIHRoZSBjb21wZW5zYXRpb24gKFR4QWdjU3RlcCAqIChpZHgtMSkpCisKKwlCT09MRUFOICAgICBiQXV0b1R4QWdjRzsgICAgICAgICAgICAgICAgLy8gRW5hYmxlIGRyaXZlciBhdXRvIFR4IEFnYyBjb250cm9sCisJVUNIQVIJICAgIFRzc2lSZWZHOwkJCQkJLy8gU3RvcmUgVHNzaSByZWZlcmVuY2UgdmFsdWUgYXMgMjUgdGVtcGVyYXR1cmUuCisJVUNIQVIJICAgIFRzc2lQbHVzQm91bmRhcnlHWzVdOwkJLy8gVHNzaSBib3VuZGFyeSBmb3IgaW5jcmVhc2UgVHggcG93ZXIgdG8gY29tcGVuc2F0ZS4KKwlVQ0hBUgkgICAgVHNzaU1pbnVzQm91bmRhcnlHWzVdOwkJLy8gVHNzaSBib3VuZGFyeSBmb3IgZGVjcmVhc2UgVHggcG93ZXIgdG8gY29tcGVuc2F0ZS4KKwlVQ0hBUgkgICAgVHhBZ2NTdGVwRzsJCQkJCS8vIFN0b3JlIFR4IFRTU0kgZGVsdGEgaW5jcmVtZW50IC8gZGVjcmVtZW50IHZhbHVlCisJQ0hBUgkJVHhBZ2NDb21wZW5zYXRlRzsJCQkvLyBTdG9yZSB0aGUgY29tcGVuc2F0aW9uIChUeEFnY1N0ZXAgKiAoaWR4LTEpKQorCisJLy8rKytGb3IgUlQyODcwLCB0aGUgcGFyYW1ldGVyZXMgaXMgc3RhcnQgZnJvbSBCR1Jzc2lPZmZzZXQxIH4gQkdSc3NpT2Zmc2V0MworCUNIQVIJCUJHUnNzaU9mZnNldDA7CQkJCS8vIFN0b3JlIEIvRyBSU1NJIzAgT2Zmc2V0IHZhbHVlIG9uIEVFUFJPTSAweDQ2aAorCUNIQVIJCUJHUnNzaU9mZnNldDE7CQkJCS8vIFN0b3JlIEIvRyBSU1NJIzEgT2Zmc2V0IHZhbHVlCisJQ0hBUgkJQkdSc3NpT2Zmc2V0MjsJCQkJLy8gU3RvcmUgQi9HIFJTU0kjMiBPZmZzZXQgdmFsdWUKKwkvLy0tLQorCisJLy8rKytGb3IgUlQyODcwLCB0aGUgcGFyYW1ldGVyZXMgaXMgc3RhcnQgZnJvbSBBUnNzaU9mZnNldDEgfiBBUnNzaU9mZnNldDMKKwlDSEFSCQlBUnNzaU9mZnNldDA7CQkJCS8vIFN0b3JlIEEgUlNTSSMwIE9mZnNldCB2YWx1ZSBvbiBFRVBST00gMHg0QWgKKwlDSEFSCQlBUnNzaU9mZnNldDE7CQkJCS8vIFN0b3JlIEEgUlNTSSMxIE9mZnNldCB2YWx1ZQorCUNIQVIJCUFSc3NpT2Zmc2V0MjsJCQkJLy8gU3RvcmUgQSBSU1NJIzIgT2Zmc2V0IHZhbHVlCisJLy8tLS0KKworCUNIQVIJCUJMTkFHYWluOwkJCQkJLy8gU3RvcmUgQi9HIGV4dGVybmFsIExOQSMwIHZhbHVlIG9uIEVFUFJPTSAweDQ0aAorCUNIQVIJCUFMTkFHYWluMDsJCQkJCS8vIFN0b3JlIEEgZXh0ZXJuYWwgTE5BIzAgdmFsdWUgZm9yIGNoMzZ+NjQKKwlDSEFSCQlBTE5BR2FpbjE7CQkJCQkvLyBTdG9yZSBBIGV4dGVybmFsIExOQSMxIHZhbHVlIGZvciBjaDEwMH4xMjgKKwlDSEFSCQlBTE5BR2FpbjI7CQkJCQkvLyBTdG9yZSBBIGV4dGVybmFsIExOQSMyIHZhbHVlIGZvciBjaDEzMn4xNjUKKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBMRUQgY29udHJvbAorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlNQ1VfTEVEQ1NfU1RSVUMJCUxlZENudGw7CisJVVNIT1JUCQkJCUxlZDE7CS8vIHJlYWQgZnJvbSBFRVBST00gMHgzYworCVVTSE9SVAkJCQlMZWQyOwkvLyBFRVBST00gMHgzZQorCVVTSE9SVAkJCQlMZWQzOwkvLyBFRVBST00gMHg0MAorCVVDSEFSCQkJCUxlZEluZGljYXRvclN0cmVndGg7CisJVUNIQVIJCQkJUnNzaVNpbmdhbHN0cmVuZ3RoT2ZmZXQ7CisgICAgQk9PTEVBTgkJCQliTGVkT25TY2FubmluZzsKKwlVQ0hBUgkJCQlMZWRTdGF0dXM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgODAyLjExIHJlbGF0ZWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvLyBvdXRnb2luZyBCRUFDT04gZnJhbWUgYnVmZmVyIGFuZCBjb3JyZXNwb25kaW5nIFRYRAorCVRYV0lfU1RSVUMgICAgICAgICAgICAgIAlCZWFjb25UeFdJOworCVBVQ0hBUgkJCQkJCUJlYWNvbkJ1ZjsKKwlVU0hPUlQJCQkJCQlCZWFjb25PZmZzZXRbSFdfQkVBQ09OX01BWF9DT1VOVF07CisKKwkvLyBwcmUtYnVpbGQgUFMtUE9MTCBhbmQgTlVMTCBmcmFtZSB1cG9uIGxpbmsgdXAuIGZvciBlZmZpY2llbmN5IHB1cnBvc2UuCisJUFNQT0xMX0ZSQU1FICAgICAgICAgICAgCVBzUG9sbEZyYW1lOworCUhFQURFUl84MDJfMTEgICAgICAgICAgIAlOdWxsRnJhbWU7CisKKy8vPT09PT09PT09QVA9PT09PT09PT09PQorCisKKy8vPT09PT09PVNUQT09PT09PT09PT09CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisvKiBNb2RpZmllZCBieSBXdSBYaS1LdW4gNC8yMS8yMDA2ICovCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBTVEEgc3BlY2lmaWMgY29uZmlndXJhdGlvbiAmIG9wZXJhdGlvbiBzdGF0dXMKKwkvLyB1c2VkIG9ubHkgd2hlbiBwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlTVEFfQURNSU5fQ09ORklHICAgICAgICBTdGFDZmc7ICAgICAgICAgICAvLyB1c2VyIGRlc2lyZWQgc2V0dGluZ3MKKwlTVEFfQUNUSVZFX0NPTkZJRyAgICAgICBTdGFBY3RpdmU7ICAgICAgICAgLy8gdmFsaWQgb25seSB3aGVuIEFESE9DX09OKHBBZCkgfHwgSU5GUkFfT04ocEFkKQorCUNIQVIgICAgICAgICAgICAgICAgICAgIG5pY2tuYW1lW0lXX0VTU0lEX01BWF9TSVpFKzFdOyAvLyBuaWNrbmFtZSwgb25seSB1c2VkIGluIHRoZSBpd2NvbmZpZyBpL2YKKwlORElTX01FRElBX1NUQVRFICAgICAgICBQcmVNZWRpYVN0YXRlOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisvLz09PT09PT1Db21tb249PT09PT09PT09PQorCS8vIE9QIG1vZGU6IGVpdGhlciBBUCBvciBTVEEKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBPcE1vZGU7ICAgICAgICAgICAgICAgICAgICAgLy8gT1BNT0RFX1NUQSwgT1BNT0RFX0FQCisKKwlORElTX01FRElBX1NUQVRFICAgICAgICBJbmRpY2F0ZU1lZGlhU3RhdGU7CQkJLy8gQmFzZSBvbiBJbmRpY2F0aW9uIHN0YXRlLCBkZWZhdWx0IGlzIE5kaXNNZWRpYVN0YXRlRGlzQ29ubmVjdGVkCisKKwkvLyBNQVQgcmVsYXRlZCBwYXJhbWV0ZXJzCisKKwkvLyBjb25maWd1cmF0aW9uOiByZWFkIGZyb20gUmVnaXN0cnkgJiBFMlBST00KKwlCT09MRUFOICAgICAgICAgICAgICAgICBiTG9jYWxBZG1pbk1BQzsgICAgICAgICAgICAgLy8gVXNlIHVzZXIgY2hhbmdlZCBNQUMKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBQZXJtYW5lbnRBZGRyZXNzW01BQ19BRERSX0xFTl07ICAgIC8vIEZhY3RvcnkgZGVmYXVsdCBNQUMgYWRkcmVzcworCVVDSEFSICAgICAgICAgICAgICAgICAgIEN1cnJlbnRBZGRyZXNzW01BQ19BRERSX0xFTl07ICAgICAgLy8gVXNlciBjaGFuZ2VkIE1BQyBhZGRyZXNzCisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBjb21tb24gY29uZmlndXJhdGlvbiB0byBib3RoIE9QTU9ERV9TVEEgYW5kIE9QTU9ERV9BUAorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUNPTU1PTl9DT05GSUcgICAgICAgICAgIENvbW1vbkNmZzsKKwlNTE1FX1NUUlVDVCAgICAgICAgICAgICBNbG1lOworCisJLy8gQVAgbmVlZHMgdGhvc2UgdmFpYWJsZXMgZm9yIHNpdGUgc3VydmV5IGZlYXR1cmUuCisJTUxNRV9BVVggICAgICAgICAgICAgICAgTWxtZUF1eDsgICAgICAgICAgIC8vIHRlbXBvcmFyeSBzZXR0aW5ncyB1c2VkIGR1cmluZyBNTE1FIHN0YXRlIG1hY2hpbmUKKwlCU1NfVEFCTEUgICAgICAgICAgICAgICBTY2FuVGFiOyAgICAgICAgICAgLy8gc3RvcmUgdGhlIGxhdGVzdCBTQ0FOIHJlc3VsdAorCisJLy9BYm91dCBNYWNUYWIsIHRoZSBzdGEgZHJpdmVyIHdpbGwgdXNlICMwIGFuZCAjMSBmb3IgbXVsdGljYXN0IGFuZCBBUC4KKwlNQUNfVEFCTEUgICAgICAgICAgICAgICAgIE1hY1RhYjsgICAgIC8vIEFTSUMgb24tY2hpcCBXQ0lEIGVudHJ5IHRhYmxlLiAgQXQgVFgsIEFTSUMgYWx3YXlzIHVzZSBrZXkgYWNjb3JkaW5nIHRvIHRoaXMgb24tY2hpcCB0YWJsZS4KKwlORElTX1NQSU5fTE9DSyAgICAgICAgICBNYWNUYWJMb2NrOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJQkFfVEFCTEUJCQlCQVRhYmxlOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIEJBVGFiTG9jazsKKwlSQUxJTktfVElNRVJfU1RSVUNUIFJFQ0JBVGltZXI7CisKKwkvLyBlbmNyeXB0aW9uL2RlY3J5cHRpb24gS0VZIHRhYmxlcworCUNJUEhFUl9LRVkgICAgICAgICAgICAgIFNoYXJlZEtleVtNQVhfTUJTU0lEX05VTV1bNF07IC8vIFNUQSBhbHdheXMgdXNlIFNoYXJlZEtleVtCU1MwXVswLi4zXQorCisJCS8vIFJYIHJlLWFzc2VtYmx5IGJ1ZmZlciBmb3IgZnJhZ21lbnRhdGlvbgorCUZSQUdNRU5UX0ZSQU1FICAgICAgICAgIEZyYWdGcmFtZTsgICAgICAgICAgICAgICAgICAvLyBGcmFtZSBzdG9yYWdlIGZvciBmcmFnbWVudCBmcmFtZQorCisJLy8gdmFyaW91cyBDb3VudGVycworCUNPVU5URVJfODAyXzMgICAgICAgICAgIENvdW50ZXJzODAyMzsgICAgICAgICAgICAgICAvLyA4MDIuMyBjb3VudGVycworCUNPVU5URVJfODAyXzExICAgICAgICAgIFdsYW5Db3VudGVyczsgICAgICAgICAgICAgICAvLyA4MDIuMTEgTUlCIGNvdW50ZXJzCisJQ09VTlRFUl9SQUxJTksgICAgICAgICAgUmFsaW5rQ291bnRlcnM7ICAgICAgICAgICAgIC8vIFJhbGluayBwcm9wcmlldHkgY291bnRlcnMKKwlDT1VOVEVSX0RSUyAgICAgICAgICAgICBEcnNDb3VudGVyczsgICAgICAgICAgICAgICAgLy8gY291bnRlcnMgZm9yIER5bmFtaWMgVFggUmF0ZSBTd2l0Y2hpbmcKKwlQUklWQVRFX1NUUlVDICAgICAgICAgICBQcml2YXRlSW5mbzsgICAgICAgICAgICAgICAgLy8gUHJpdmF0ZSBpbmZvcm1hdGlvbiAmIGNvdW50ZXJzCisKKwkvLyBmbGFncywgc2VlIGZSVE1QX0FEQVBURVJfeHh4IGZsYWdzCisJVUxPTkcgICAgICAgICAgICAgICAgICAgRmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcHJlc2VudCBjdXJyZW50IGRldmljZSBzdGF0dXMKKworCS8vIGN1cnJlbnQgVFggc2VxdWVuY2UgIworCVVTSE9SVCAgICAgICAgICAgICAgICAgIFNlcXVlbmNlOworCisjaWZkZWYgVU5ERVJfQ0UKKwlORElTX0hBTkRMRSAgICAgICAgICAgICBoR2lJU1I7CisjZW5kaWYKKworCisJLy8gQ29udHJvbCBkaXNjb25uZWN0IC8gY29ubmVjdCBldmVudCBnZW5lcmF0aW9uCisJLy8rKytEaWRuJ3QgdXNlZCBhbnltb3JlCisJVUxPTkcgICAgICAgICAgICAgICAgICAgTGlua0Rvd25UaW1lOworCS8vLS0tCisJVUxPTkcgICAgICAgICAgICAgICAgICAgTGFzdFJ4UmF0ZTsKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBMYXN0VHhSYXRlOworCS8vKysrVXNlZCBvbmx5IGZvciBTdGF0aW9uCisJQk9PTEVBTiAgICAgICAgICAgICAgICAgYkNvbmZpZ0NoYW5nZWQ7ICAgICAgICAgLy8gQ29uZmlnIENoYW5nZSBmbGFnIGZvciB0aGUgc2FtZSBTU0lEIHNldHRpbmcKKwkvLy0tLQorCisJVUxPTkcgICAgICAgICAgICAgICAgICAgRXh0cmFJbmZvOyAgICAgICAgICAgICAgLy8gRXh0cmEgaW5mb3JtYXRpb24gZm9yIGRpc3BsYXlpbmcgc3RhdHVzCisJVUxPTkcgICAgICAgICAgICAgICAgICAgU3lzdGVtRXJyb3JCaXRtYXA7ICAgICAgLy8gYjA6IEUyUFJPTSB2ZXJzaW9uIGVycm9yCisKKwkvLysrK0RpZG4ndCB1c2VkIGFueW1vcmUKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBNYWNJY1ZlcnNpb247ICAgICAgICAgICAvLyBNQUMvQkJQIHNlcmlhbCBpbnRlcmZhY2UgaXNzdWUgc29sdmVkIGFmdGVyIHZlci5ECisJLy8tLS0KKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIFN5c3RlbSBldmVudCBsb2cKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlSVF84MDJfMTFfRVZFTlRfVEFCTEUgICBFdmVudFRhYjsKKworCisJQk9PTEVBTgkJSFRDRW5hYmxlOworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCS8qICAgICAgU3RhdGlzdGljIHJlbGF0ZWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwlCT09MRUFOCQkJCQkJYlVwZGF0ZUJjbkNudERvbmU7CisJVUxPTkcJCQkJCQl3YXRjaERvZ01hY0RlYWRsb2NrOwkvLyBwcmV2ZW50IE1BQy9CQlAgaW50byBkZWFkbG9jayBjb25kaXRpb24KKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gREVCVUcgcGFyYW1lcnRzCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUJPT0xFQU4JCWJCYW5BbGxCYVNldHVwOworCUJPT0xFQU4JCWJQcm9taXNjdW91czsKKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBydDI4NjBjIGVtdWxhdGlvbi11c2UgUGFyYW1ldGVycworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlVTE9ORwkJcnRzYWNjdVszMF07CisJVUxPTkcJCWN0c2FjY3VbMzBdOworCVVMT05HCQljZmVuZGFjY3VbMzBdOworCVVMT05HCQliYWNvbnRlbnRbMTZdOworCVVMT05HCQlyeGludFtSWF9SSU5HX1NJWkUrMV07CisJVUNIQVIJCXJjdmJhWzYwXTsKKwlCT09MRUFOCQliTGlua0FkYXB0OworCUJPT0xFQU4JCWJGb3JjZVByaW50VFg7CisJQk9PTEVBTgkJYkZvcmNlUHJpbnRSWDsKKwlCT09MRUFOCQliRGlzYWJsZXNjYW5uaW5nOwkJLy9kZWZpbmVkIGluIFJUMjg3MCBVU0IKKwlCT09MRUFOCQliU3RhRmlmb1Rlc3Q7CisJQk9PTEVBTgkJYlByb3RlY3Rpb25UZXN0OworCUJPT0xFQU4JCWJIQ0NBVGVzdDsKKwlCT09MRUFOCQliR2VuT25lSENDQTsKKwlCT09MRUFOCQliQnJvYWRDb21IVDsKKwkvLysrK0ZvbGxvd2luZyBhZGQgZnJvbSBSVDI4NzAgVVNCLgorCVVMT05HCQlCdWxrT3V0UmVxOworCVVMT05HCQlCdWxrT3V0Q29tcGxldGU7CisJVUxPTkcJCUJ1bGtPdXRDb21wbGV0ZU90aGVyOworCVVMT05HCQlCdWxrT3V0Q29tcGxldGVDYW5jZWw7CS8vIHNlZW1zIG5vdCB1c2Ugbm93PworCVVMT05HCQlCdWxrSW5SZXE7CisJVUxPTkcJCUJ1bGtJbkNvbXBsZXRlOworCVVMT05HCQlCdWxrSW5Db21wbGV0ZUZhaWw7CisJLy8tLS0KKworICAgIHN0cnVjdCB3aWZpY29uZgkJCVdJRkl0ZXN0YmVkOworCisjaWZkZWYgUkFMSU5LX0FURQorCUFURV9JTkZPCQkJCWF0ZTsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1X3Bvb2wgbXBkdV9ibGtfcG9vbDsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCVVMT05HCQkJCQlPbmVTZWNvbmRub25CRXBhY2tldHM7CQkvLyByZWNvcmQgbm9uIEJFIHBhY2tldHMgcGVyIHNlY29uZAorCisjaWYgV0lSRUxFU1NfRVhUID49IDEyCisgICAgc3RydWN0IGl3X3N0YXRpc3RpY3MgICAgaXdfc3RhdHM7CisjZW5kaWYKKworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCXN0YXRzOworCisjaWZkZWYgQkxPQ0tfTkVUX0lGCisJQkxPQ0tfUVVFVUVfRU5UUlkJCWJsb2NrUXVldWVUYWJbTlVNX09GX1RYX1JJTkddOworI2VuZGlmIC8vIEJMT0NLX05FVF9JRiAvLworCisKKworI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAorCUlOVDMyCQkJCQlNQ19Sb3dJRDsKKwlVQ0hBUgkJCQkJTUNfRmlsZU5hbWVbMjU2XTsKKyNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KKworCVVMT05HCQkJCQlUYnR0VGlja0NvdW50OworI2lmZGVmIFBDSV9NU0lfU1VQUE9SVAorCUJPT0xFQU4JCQkJCUhhdmVNc2k7CisjZW5kaWYgLy8gUENJX01TSV9TVVBQT1JUIC8vCisKKworCVVDSEFSCQkJCQlpc19vbjsKKworI2RlZmluZSBUSU1FX0JBU0UJCQkoMTAwMDAwMC9PU19IWikKKyNkZWZpbmUgVElNRV9PTkVfU0VDT05ECQkoMTAwMDAwMC9USU1FX0JBU0UpCisJVUNIQVIJCQkJCWZsZ19iZV9hZGp1c3Q7CisJVUxPTkcJCQkJCWJlX2FkanVzdF9sYXN0X3RpbWU7CisKKyNpZmRlZiBOSU5URU5ET19BUAorCU5JTkRPX0NUUkxfQkxPQ0sJCW5pbmRvX2N0cmxfYmxvY2s7CisjZW5kaWYgLy8gTklOVEVORE9fQVAgLy8KKworCisjaWZkZWYgSUtBTk9TX1ZYXzFYMAorCXN0cnVjdCBJS0FOT1NfVFhfSU5GTwlJa2Fub3NUeEluZm87CisJc3RydWN0IElLQU5PU19UWF9JTkZPCUlrYW5vc1J4SW5mb1tNQVhfTUJTU0lEX05VTSArIE1BWF9XRFNfRU5UUlkgKyBNQVhfQVBDTElfTlVNICsgTUFYX01FU0hfTlVNXTsKKyNlbmRpZiAvLyBJS0FOT1NfVlhfMVgwIC8vCisKKworI2lmZGVmIERCR19ESUFHTk9TRQorCVJ0bXBEaWFnU3RydWN0CURpYWdTdHJ1Y3Q7CisjZW5kaWYgLy8gREJHX0RJQUdOT1NFIC8vCisKKworCVVJTlQ4CQkJCQlQTV9GbGdTdXNwZW5kOworfSBSVE1QX0FEQVBURVIsICpQUlRNUF9BREFQVEVSOworCisvLworLy8gQ2lzY28gSUFQUCBmb3JtYXQKKy8vCit0eXBlZGVmIHN0cnVjdCAgX0NJU0NPX0lBUFBfQ09OVEVOVF8KK3sKKwlVU0hPUlQgICAgIExlbmd0aDsgICAgICAgIC8vSUFQUCBMZW5ndGgKKwlVQ0hBUiAgICAgIE1lc3NhZ2VUeXBlOyAgICAgIC8vSUFQUCB0eXBlCisJVUNIQVIgICAgICBGdW5jdGlvbkNvZGU7ICAgICAvL0lBUFAgZnVuY3Rpb24gdHlwZQorCVVDSEFSICAgICAgRGVzdGluYWlvbk1BQ1tNQUNfQUREUl9MRU5dOworCVVDSEFSICAgICAgU291cmNlTUFDW01BQ19BRERSX0xFTl07CisJVVNIT1JUICAgICBUYWc7ICAgICAgICAgICAvL1RhZyhlbGVtZW50IElFKSAtIEFkamFjZW50IEFQIHJlcG9ydAorCVVTSE9SVCAgICAgVGFnTGVuZ3RoOyAgICAgLy9MZW5ndGggb2YgZWxlbWVudCBub3QgaW5jbHVkaW5nIDQgYnl0ZSBoZWFkZXIKKwlVQ0hBUiAgICAgIE9VSVs0XTsgICAgICAgICAgIC8vMHgwMCwgMHg0MCwgMHg5NiwgMHgwMAorCVVDSEFSICAgICAgUHJldmlvdXNBUFtNQUNfQUREUl9MRU5dOyAgICAgICAvL01BQyBBZGRyZXNzIG9mIGFjY2VzcyBwb2ludAorCVVTSE9SVCAgICAgQ2hhbm5lbDsKKwlVU0hPUlQgICAgIFNzaWRMZW47CisJVUNIQVIgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07CisJVVNIT1JUICAgICBTZWNvbmRzOyAgICAgICAgICAvL1NlY29uZHMgdGhhdCB0aGUgY2xpZW50IGhhcyBiZWVuIGRpc2Fzc29jaWF0ZWQuCit9IENJU0NPX0lBUFBfQ09OVEVOVCwgKlBDSVNDT19JQVBQX0NPTlRFTlQ7CisKKyNkZWZpbmUgREVMQVlJTlRNQVNLCQkweDAwMDNmZmZiCisjZGVmaW5lIElOVE1BU0sJCQkJMHgwMDAzZmZmYgorI2RlZmluZSBJbmRNYXNrCQkJCTB4MDAwM2ZmZmMKKyNkZWZpbmUgUnhJTlQJCQkJMHgwMDAwMDAwNQkvLyBEZWxheWVkIFJ4IG9yIGluZGl2aSByeAorI2RlZmluZSBUeERhdGFJbnQJCQkweDAwMDAwMGZhCS8vIERlbGF5ZWQgVHggb3IgaW5kaXZpIHR4CisjZGVmaW5lIFR4TWdtdEludAkJCTB4MDAwMDAxMDIJLy8gRGVsYXllZCBUeCBvciBpbmRpdmkgdHgKKyNkZWZpbmUgVHhDb2hlcmVudAkJCTB4MDAwMjAwMDAJLy8gdHggY29oZXJlbnQKKyNkZWZpbmUgUnhDb2hlcmVudAkJCTB4MDAwMTAwMDAJLy8gcnggY29oZXJlbnQKKyNkZWZpbmUgTWN1Q29tbWFuZAkJCTB4MDAwMDAyMDAJLy8gbWN1CisjZGVmaW5lIFByZVRCVFRJbnQJCQkweDAwMDAxMDAwCS8vIFByZS1UQlRUIGludGVycnVwdAorI2RlZmluZSBUQlRUSW50CQkJCTB4MDAwMDA4MDAJCS8vIFRCVFQgaW50ZXJydXB0CisjZGVmaW5lIEdQVGltZU91dEludAkJCTB4MDAwMDgwMDAJCS8vIEdQdGltZW91dCBpbnRlcnJ1cHQKKyNkZWZpbmUgQXV0b1dha2V1cEludAkJMHgwMDAwNDAwMAkJLy8gQXV0b1dha2V1cEludCBpbnRlcnJ1cHQKKyNkZWZpbmUgRmlmb1N0YUZ1bGxJbnQJCQkweDAwMDAyMDAwCS8vICBmaWZvIHN0YXRpc3RpY3MgZnVsbCBpbnRlcnJ1cHQKKworCit0eXBlZGVmIHN0cnVjdCBfUlhfQkxLXworeworCVJUMjhYWF9SWERfU1RSVUMJUnhEOworCVBSWFdJX1NUUlVDCQkJcFJ4V0k7CisJUEhFQURFUl84MDJfMTEJCXBIZWFkZXI7CisJUE5ESVNfUEFDS0VUCQlwUnhQYWNrZXQ7CisJVUNIQVIJCQkJKnBEYXRhOworCVVTSE9SVAkJCQlEYXRhU2l6ZTsKKwlVU0hPUlQJCQkJRmxhZ3M7CisJVUNIQVIJCQkJVXNlclByaW9yaXR5OwkvLyBmb3IgY2FsY3VsYXRlIFRLSVAgTUlDIHVzaW5nCit9IFJYX0JMSzsKKworCisjZGVmaW5lIFJYX0JMS19TRVRfRkxBRyhfcFJ4QmxrLCBfZmxhZykJCShfcFJ4QmxrLT5GbGFncyB8PSBfZmxhZykKKyNkZWZpbmUgUlhfQkxLX1RFU1RfRkxBRyhfcFJ4QmxrLCBfZmxhZykJKF9wUnhCbGstPkZsYWdzICYgX2ZsYWcpCisjZGVmaW5lIFJYX0JMS19DTEVBUl9GTEFHKF9wUnhCbGssIF9mbGFnKQkoX3BSeEJsay0+RmxhZ3MgJj0gfihfZmxhZykpCisKKworI2RlZmluZSBmUlhfV0RTCQkJMHgwMDAxCisjZGVmaW5lIGZSWF9BTVNEVSAgICAgICAweDAwMDIKKyNkZWZpbmUgZlJYX0FSQUxJTksgICAgIDB4MDAwNAorI2RlZmluZSBmUlhfSFRDICAgICAgICAgMHgwMDA4CisjZGVmaW5lIGZSWF9QQUQgICAgICAgICAweDAwMTAKKyNkZWZpbmUgZlJYX0FNUERVICAgICAgIDB4MDAyMAorI2RlZmluZSBmUlhfUU9TCQkJMHgwMDQwCisjZGVmaW5lIGZSWF9JTkZSQQkJMHgwMDgwCisjZGVmaW5lIGZSWF9FQVAJCQkweDAxMDAKKyNkZWZpbmUgZlJYX01FU0gJCTB4MDIwMAorI2RlZmluZSBmUlhfQVBDTEkJCTB4MDQwMAorI2RlZmluZSBmUlhfRExTCQkJMHgwODAwCisjZGVmaW5lIGZSWF9XUEkJCQkweDEwMDAKKworI2RlZmluZSBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFECTE0CisjZGVmaW5lIExFTkdUSF9BUkFMSU5LX1NVQkZSQU1FSEVBRAkxNAorI2RlZmluZSBMRU5HVEhfQVJBTElOS19IRUFERVJfRklFTEQJIDIKKworI2RlZmluZSBUWF9VTktPV05fRlJBTUUJCQkweDAwCisjZGVmaW5lIFRYX01DQVNUX0ZSQU1FCQkJMHgwMQorI2RlZmluZSBUWF9MRUdBQ1lfRlJBTUUJCQkweDAyCisjZGVmaW5lIFRYX0FNUERVX0ZSQU1FCQkJMHgwNAorI2RlZmluZSBUWF9BTVNEVV9GUkFNRQkJCTB4MDgKKyNkZWZpbmUgVFhfUkFMSU5LX0ZSQU1FCQkJMHgxMAorI2RlZmluZSBUWF9GUkFHX0ZSQU1FCQkJMHgyMAorCisKKy8vCUN1cnJlbnRseSB0aGUgc2l6ZW9mKFRYX0JMSykgaXMgMTQ4IGJ5dGVzLgordHlwZWRlZiBzdHJ1Y3QgX1RYX0JMS18KK3sKKwlVQ0hBUgkJCQlRdWVJZHg7CisJVUNIQVIJCQkJVHhGcmFtZVR5cGU7CQkJCS8vIEluZGljYXRlIHRoZSBUcmFuc21pc3Npb24gdHlwZSBvZiB0aGUgYWxsIGZyYW1lcyBpbiBvbmUgYmF0Y2gKKwlVQ0hBUgkJCQlUb3RhbEZyYW1lTnVtOwkJCQkvLyBUb3RhbCBmcmFtZSBudW1iZXIgd2FudCB0byBzZW5kLW91dCBpbiBvbmUgYmF0Y2gKKwlVU0hPUlQJCQkJVG90YWxGcmFnTnVtOwkJCQkvLyBUb3RhbCBmcmFtZSBmcmFnbWVudHMgcmVxdWlyZWQgaW4gb25lIGJhdGNoCisJVVNIT1JUCQkJCVRvdGFsRnJhbWVMZW47CQkJCS8vIFRvdGFsIGxlbmd0aCBvZiBhbGwgZnJhbWVzIHdhbnQgdG8gc2VuZC1vdXQgaW4gb25lIGJhdGNoCisKKwlRVUVVRV9IRUFERVIJCVR4UGFja2V0TGlzdDsKKwlNQUNfVEFCTEVfRU5UUlkJCSpwTWFjRW50cnk7CQkJCQkvLyBOVUxMOiBwYWNrZXQgd2l0aCA4MDIuMTEgUkEgZmllbGQgaXMgbXVsdGljYXN0L2Jyb2FkY2FzdCBhZGRyZXNzCisJSFRUUkFOU01JVF9TRVRUSU5HCSpwVHJhbnNtaXQ7CisKKwkvLyBGb2xsb3dpbmcgc3RydWN0dXJlIHVzZWQgZm9yIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgYSBzcGVjaWZpYyBwYWNrZXQuCisJUE5ESVNfUEFDS0VUCQlwUGFja2V0OworCVBVQ0hBUgkJCQlwU3JjQnVmSGVhZGVyOwkJCQkvLyBSZWZlcmVuY2UgdG8gdGhlIGhlYWQgb2Ygc2tfYnVmZi0+ZGF0YQorCVBVQ0hBUgkJCQlwU3JjQnVmRGF0YTsJCQkJLy8gUmVmZXJlbmNlIHRvIHRoZSBza19idWZmLT5kYXRhLCB3aWxsIGNoYW5nZWQgZGVwZW5kcyBvbiBoYW5sZGluZyBwcm9ncmVzc3MKKwlVSU5UCQkJCVNyY0J1ZkxlbjsJCQkJCS8vIExlbmd0aCBvZiBwYWNrZXQgcGF5bG9hZCB3aGljaCBub3QgaW5jbHVkaW5nIExheWVyIDIgaGVhZGVyCisJUFVDSEFSCQkJCXBFeHRyYUxsY1NuYXBFbmNhcDsJCQkvLyBOVUxMIG1lYW5zIG5vIGV4dHJhIExMQy9TTkFQIGlzIHJlcXVpcmVkCisJVUNIQVIJCQkJSGVhZGVyQnVmWzgwXTsJCQkJLy8gVGVtcEJ1ZmZlciBmb3IgVFhfSU5GTyArIFRYX1dJICsgODAyLjExIEhlYWRlciArIHBhZGRpbmcgKyBBTVNEVSBTdWJIZWFkZXIgKyBMTEMvU05BUAorCVVDSEFSCQkJCU1wZHVIZWFkZXJMZW47CQkJCS8vIDgwMi4xMSBoZWFkZXIgbGVuZ3RoIE5PVCBpbmNsdWRpbmcgdGhlIHBhZGRpbmcKKwlVQ0hBUgkJCQlIZHJQYWRMZW47CQkJCQkvLyByZWNvcmRpbmcgSGVhZGVyIFBhZGRpbmcgTGVuZ3RoOworCVVDSEFSCQkJCWFwaWR4OwkJCQkJCS8vIFRoZSBpbnRlcmZhY2UgYXNzb2NpYXRlZCB0byB0aGlzIHBhY2tldAorCVVDSEFSCQkJCVdjaWQ7CQkJCQkJLy8gVGhlIE1BQyBlbnRyeSBhc3NvY2lhdGVkIHRvIHRoaXMgcGFja2V0CisJVUNIQVIJCQkJVXNlclByaW9yaXR5OwkJCQkvLyBwcmlvcml0eSBjbGFzcyBvZiBwYWNrZXQKKwlVQ0hBUgkJCQlGcmFtZUdhcDsJCQkJCS8vIHdoYXQga2luZCBvZiBJRlMgdGhpcyBwYWNrZXQgdXNlCisJVUNIQVIJCQkJTXBkdVJlcU51bTsJCQkJCS8vIG51bWJlciBvZiBmcmFnbWVudHMgb2YgdGhpcyBmcmFtZQorCVVDSEFSCQkJCVR4UmF0ZTsJCQkJCQkvLyBUT0RPOiBPYnNvbGV0ZWQ/IFNob3VsZCBjaGFuZ2UgdG8gTUNTPworCVVDSEFSCQkJCUNpcGhlckFsZzsJCQkJCS8vIGNpcGhlciBhbG9ncml0aG0KKwlQQ0lQSEVSX0tFWQkJCXBLZXk7CisKKworCisJVVNIT1JUCQkJCUZsYWdzOwkJCQkJCS8vU2VlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBmb3IgZGV0YWlsLgorCisJLy9ZT1UgU0hPVUxEIE5PVCBUT1VDSCBJVCEgRm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIHVzZWQgZm9yIGhhcmR3YXJlLWRlcGVuZGVkIGxheWVyLgorCVVMT05HCQkJCVByaXY7CQkJCQkJLy8gSGFyZHdhcmUgc3BlY2lmaWMgdmFsdWUgc2F2ZWQgaW4gaGVyZS4KK30gVFhfQkxLLCAqUFRYX0JMSzsKKworCisjZGVmaW5lIGZUWF9iUnRzUmVxdWlyZWQJCTB4MDAwMQkvLyBJbmRpY2F0ZSBpZiBuZWVkIHNlbmQgUlRTIGZyYW1lIGZvciBwcm90ZWN0aW9uLiBOb3QgdXNlZCBpbiBSVDI4NjAvUlQyODcwLgorI2RlZmluZSBmVFhfYkFja1JlcXVpcmVkICAgICAgIAkweDAwMDIJLy8gdGhlIHBhY2tldCBuZWVkIGFjayByZXNwb25zZQorI2RlZmluZSBmVFhfYlBpZ2d5QmFjayAgICAgCQkweDAwMDQJLy8gTGVnYWN5IGRldmljZSB1c2UgUGlnZ2JhY2sgb3Igbm90CisjZGVmaW5lIGZUWF9iSFRSYXRlICAgICAgICAgCTB4MDAwOAkvLyBhbGxvdyB0byB1c2UgSFQgcmF0ZQorI2RlZmluZSBmVFhfYkZvcmNlTm9uUW9TICAgICAgIAkweDAwMTAJLy8gZm9yY2UgdG8gdHJhbnNtaXQgZnJhbWUgd2l0aG91dCBXTU0tUW9TIGluIEhUIG1vZGUKKyNkZWZpbmUgZlRYX2JBbGxvd0ZyYWcgICAgICAgCTB4MDAyMAkvLyBhbGxvdyB0byBmcmFnbWVudCB0aGUgcGFja2V0LCBBLU1QRFUsIEEtTVNEVSwgQS1SYWxpbmsgaXMgbm90IGFsbG93ZWQgdG8gZnJhZ21lbnQKKyNkZWZpbmUgZlRYX2JNb3JlRGF0YQkJCTB4MDA0MAkvLyB0aGVyZSBhcmUgbW9yZSBkYXRhIHBhY2tldHMgaW4gUG93ZXJTYXZlIFF1ZXVlCisjZGVmaW5lIGZUWF9iV01NCQkJCTB4MDA4MAkvLyBRT1MgRGF0YQorCisjZGVmaW5lIGZUWF9iQ2xlYXJFQVBGcmFtZQkJMHgwMTAwCisKKyNkZWZpbmUgVFhfQkxLX0FTU0lHTl9GTEFHKF9wVHhCbGssIF9mbGFnLCB2YWx1ZSkJXAorCQlkbyB7CQkJCQkJCQkJCVwKKwkJCWlmICh2YWx1ZSkgCQkJCQkJCQlcCisJCQkJKF9wVHhCbGstPkZsYWdzIHw9IF9mbGFnKSAJCQlcCisJCQllbHNlIAkJCQkJCQkJCVwKKwkJCQkoX3BUeEJsay0+RmxhZ3MgJj0gfihfZmxhZykpCQlcCisJCX13aGlsZSgwKQorCisjZGVmaW5lIFRYX0JMS19TRVRfRkxBRyhfcFR4QmxrLCBfZmxhZykJCShfcFR4QmxrLT5GbGFncyB8PSBfZmxhZykKKyNkZWZpbmUgVFhfQkxLX1RFU1RfRkxBRyhfcFR4QmxrLCBfZmxhZykJKCgoX3BUeEJsay0+RmxhZ3MgJiBfZmxhZykgPT0gX2ZsYWcpID8gMSA6IDApCisjZGVmaW5lIFRYX0JMS19DTEVBUl9GTEFHKF9wVHhCbGssIF9mbGFnKQkoX3BUeEJsay0+RmxhZ3MgJj0gfihfZmxhZykpCisKKworCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisjaWZkZWYgUlQyODYwCisvLworLy8gRW5hYmxlICYgRGlzYWJsZSBOSUMgaW50ZXJydXB0IHZpYSB3cml0aW5nIGludGVycnVwdCBtYXNrIHJlZ2lzdGVyCisvLyBTaW5jZSBpdCB1c2UgQURBUFRFUiBzdHJ1Y3R1cmUsIGl0IGhhdmUgdG8gYmUgcHV0IGFmdGVyIHN0cnVjdHVyZSBkZWZpbml0aW9uLgorLy8KK19faW5saW5lICAgIFZPSUQgICAgTklDRGlzYWJsZUludGVycnVwdCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCkKK3sKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBJTlRfTUFTS19DU1IsIDB4MCk7ICAgICAvLyAwOiBkaXNhYmxlCisJLy9SVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfSU5UX0VOQSwgMHgwKTsJIAkvLyAweDQxOCBpcyBmb3IgZmlybXdhcmUgLiBTVyBkb2Vzbid0IGhhbmRsZSBoZXJlLgorCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0FDVElWRSk7Cit9CisKK19faW5saW5lICAgIFZPSUQgICAgTklDRW5hYmxlSW50ZXJydXB0KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKQoreworCS8vCisJLy8gRmxhZyAiZk9QX1NUQVRVU19ET1pFIiBPbiwgbWVhbnMgQVNJQyBwdXQgdG8gc2xlZXAsIGVsc2UgbWVhbnMgQVNJQyBXYWtlVXAKKwkvLyBUbyBwcmV2ZW50IFN5c3RlbSBoYW5nLCB3ZSBzaG91bGQgZW5hbGJlIHRoZSBpbnRlcnJ1cHQgd2hlbgorCS8vIEFTSUMgaXMgYWxyZWFkeSBXYWtlIFVwLgorCS8vCisgICAgLy8gUlQyNjYxID0+IHdoZW4gQVNJQyBpcyBzbGVlcGluZywgTUFDIHJlZ2lzdGVyIGNhbm5vdCBiZSByZWFkIGFuZCB3cml0dGVuLgorCS8vIFJUMjg2MCA9PiB3aGVuIEFTSUMgaXMgc2xlZXBpbmcsIE1BQyByZWdpc3RlciBjYW4gYmUgcmVhZCBhbmQgd3JpdHRlbi4KKwkvL2lmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKwl7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9NQVNLX0NTUiwgcEFkLT5pbnRfZW5hYmxlX3JlZyAvKkRFTEFZSU5UTUFTSyovKTsgICAgIC8vIDE6ZW5hYmxlCisJfQorCS8vZWxzZQorCS8vCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImZPUF9TVEFUVVNfRE9aRSAhXG4iKSk7CisKKwkvL1JUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9JTlRfRU5BLCAweDAwMDAwMDMwKTsgLy8gMSA6IGVuYWJsZQorCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9BQ1RJVkUpOworfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisjaWZkZWYgUlRfQklHX0VORElBTgorc3RhdGljIGlubGluZSBWT0lECVdyaXRlQmFja1RvRGVzY3JpcHRvcigKKwlJTiAgUFVDSEFSCQkJRGVzdCwKKyAJSU4JUFVDSEFSCQkJU3JjLAorICAgIElOICBCT09MRUFOCQkJRG9FbmNyeXB0LAorCUlOICBVTE9ORyAgICAgICAgICAgRGVzY3JpcHRvclR5cGUpCit7CisJVUlOVDMyICpwMSwgKnAyOworCisJcDEgPSAoKFVJTlQzMiAqKURlc3QpOworCXAyID0gKChVSU5UMzIgKilTcmMpOworCisJKnAxID0gKnAyOworCSoocDErMikgPSAqKHAyKzIpOworCSoocDErMykgPSAqKHAyKzMpOworCSoocDErMSkgPSAqKHAyKzEpOyAvLyBXb3JkIDE7IHRoaXMgbXVzdCBiZSB3cml0dGVuIGJhY2sgbGFzdAorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJRW5kaWFuIGNvbnZlcnNpb24gb2YgVHgvUnggZGVzY3JpcHRvciAuCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwRGF0YQkJCVBvaW50ZXIgdG8gVHgvUnggZGVzY3JpcHRvcgorCQlEZXNjcmlwdG9yVHlwZQlEaXJlY3Rpb24gb2YgdGhlIGZyYW1lCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisJCUNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHJlYWQgb3IgdXBkYXRlIGRlc2NyaXB0b3IKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgaW5saW5lIFZPSUQJUlRNUFdJRW5kaWFuQ2hhbmdlKAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVMT05HCQkJRGVzY3JpcHRvclR5cGUpCit7CisJaW50IHNpemU7CisJaW50IGk7CisKKwlzaXplID0gKChEZXNjcmlwdG9yVHlwZSA9PSBUWVBFX1RYV0kpID8gVFhXSV9TSVpFIDogUlhXSV9TSVpFKTsKKworCWlmKERlc2NyaXB0b3JUeXBlID09IFRZUEVfVFhXSSkKKwl7CisJCSooKFVJTlQzMiAqKShwRGF0YSkpID0gU1dBUDMyKCooKFVJTlQzMiAqKShwRGF0YSkpKTsJCS8vIEJ5dGUgMH4zCisJCSooKFVJTlQzMiAqKShwRGF0YSArIDQpKSA9IFNXQVAzMigqKChVSU5UMzIgKikocERhdGErNCkpKTsJLy8gQnl0ZSA0fjcKKwl9CisJZWxzZQorCXsKKwkJZm9yKGk9MDsgaSA8IHNpemUvNCA7IGkrKykKKwkJCSooKChVSU5UMzIgKilwRGF0YSkgK2kpID0gU1dBUDMyKCooKChVSU5UMzIgKilwRGF0YSkraSkpOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUVuZGlhbiBjb252ZXJzaW9uIG9mIFR4L1J4IGRlc2NyaXB0b3IgLgorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcERhdGEJCQlQb2ludGVyIHRvIFR4L1J4IGRlc2NyaXB0b3IKKwkJRGVzY3JpcHRvclR5cGUJRGlyZWN0aW9uIG9mIHRoZSBmcmFtZQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCQlDYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiByZWFkIG9yIHVwZGF0ZSBkZXNjcmlwdG9yCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworI2lmZGVmIFJUMjg2MAorc3RhdGljIGlubGluZSBWT0lECVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVMT05HCQkJRGVzY3JpcHRvclR5cGUpCit7CisJKigoVUlOVDMyICopKHBEYXRhKSkgPSBTV0FQMzIoKigoVUlOVDMyICopKHBEYXRhKSkpOwkJLy8gQnl0ZSAwfjMKKwkqKChVSU5UMzIgKikocERhdGEgKyA4KSkgPSBTV0FQMzIoKigoVUlOVDMyICopKHBEYXRhKzgpKSk7CS8vIEJ5dGUgOH4xMQorCSooKFVJTlQzMiAqKShwRGF0YSArMTIpKSA9IFNXQVAzMigqKChVSU5UMzIgKikocERhdGEgKyAxMikpKTsJLy8gQnl0ZSAxMn4xNQorCSooKFVJTlQzMiAqKShwRGF0YSArIDQpKSA9IFNXQVAzMigqKChVSU5UMzIgKikocERhdGEgKyA0KSkpOwkJCQkvLyBCeXRlIDR+NywgdGhpcyBtdXN0IGJlIHN3YXBwZWQgbGFzdAorfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJRW5kaWFuIGNvbnZlcnNpb24gb2YgYWxsIGtpbmRzIG9mIDgwMi4xMSBmcmFtZXMgLgorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcERhdGEJCQlQb2ludGVyIHRvIHRoZSA4MDIuMTEgZnJhbWUgc3RydWN0dXJlCisJCURpciAJCQlEaXJlY3Rpb24gb2YgdGhlIGZyYW1lCisJCUZyb21SeERvbmVJbnQJQ2FsbGVyIGlzIGZyb20gUnhEb25lIGludGVycnVwdAorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCQlDYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiByZWFkIG9yIHVwZGF0ZSBidWZmZXIgZGF0YQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBpbmxpbmUgVk9JRAlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEaXIsCisJSU4JQk9PTEVBTiAJCUZyb21SeERvbmVJbnQpCit7CisJUEhFQURFUl84MDJfMTEgcEZyYW1lOworCVBVQ0hBUglwTWFjSGRyOworCisJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gRnJhbWUgQ29udHJvbCBmaWVsZAorCWlmKERpciA9PSBESVJfUkVBRCkKKwl7CisJCSooVVNIT1JUICopcERhdGEgPSBTV0FQMTYoKihVU0hPUlQgKilwRGF0YSk7CisJfQorCisJcEZyYW1lID0gKFBIRUFERVJfODAyXzExKSBwRGF0YTsKKwlwTWFjSGRyID0gKFBVQ0hBUikgcEZyYW1lOworCisJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gRHVyYXRpb24vSUQgZmllbGQKKwkqKFVTSE9SVCAqKShwTWFjSGRyICsgMikgPSBTV0FQMTYoKihVU0hPUlQgKikocE1hY0hkciArIDIpKTsKKworCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIFNlcXVlbmNlIENvbnRyb2wgZmllbGQKKwkqKFVTSE9SVCAqKShwTWFjSGRyICsgMjIpID0gU1dBUDE2KCooVVNIT1JUICopKHBNYWNIZHIgKyAyMikpOworCisJaWYocEZyYW1lLT5GQy5UeXBlID09IEJUWVBFX01HTVQpCisJeworCQlzd2l0Y2gocEZyYW1lLT5GQy5TdWJUeXBlKQorCQl7CisJCQljYXNlIFNVQlRZUEVfQVNTT0NfUkVROgorCQkJY2FzZSBTVUJUWVBFX1JFQVNTT0NfUkVROgorCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIENhcGFiaWxpdHlJbmZvIGZpZWxkCisJCQkJcE1hY0hkciArPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisJCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7CisKKwkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBMaXN0ZW4gSW50ZXJ2YWwgZmllbGQKKwkJCQlwTWFjSGRyICs9IDI7CisJCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU1VCVFlQRV9BU1NPQ19SU1A6CisJCQljYXNlIFNVQlRZUEVfUkVBU1NPQ19SU1A6CisJCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gQ2FwYWJpbGl0eUluZm8gZmllbGQKKwkJCQlwTWFjSGRyICs9IHNpemVvZihIRUFERVJfODAyXzExKTsKKwkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKKworCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIFN0YXR1cyBDb2RlIGZpZWxkCisJCQkJcE1hY0hkciArPSAyOworCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOworCisJCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gQUlEIGZpZWxkCisJCQkJcE1hY0hkciArPSAyOworCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOworCQkJCWJyZWFrOworCisJCQljYXNlIFNVQlRZUEVfQVVUSDoKKwkJCQkvLyBJZiBmcm9tIEFQSGFuZGxlUnhEb25lSW50ZXJydXB0IHJvdXRpbmUsIGl0IGlzIHN0aWxsIGEgZW5jcnlwdCBmb3JtYXQuCisJCQkJLy8gVGhlIGNvbnZlcnRpb24gaXMgZGVsYXllZCB0byBSVE1QSGFuZGxlRGVjcnlwdGlvbkRvbmVJbnRlcnJ1cHQuCisJCQkJaWYoIUZyb21SeERvbmVJbnQgJiYgcEZyYW1lLT5GQy5XZXAgPT0gMSkKKwkJCQkJYnJlYWs7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gQXV0aCBBbGcgTm8uIGZpZWxkCisJCQkJCXBNYWNIZHIgKz0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCQkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKKworCQkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBBdXRoIFNlcSBOby4gZmllbGQKKwkJCQkJcE1hY0hkciArPSAyOworCQkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKKworCQkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBTdGF0dXMgQ29kZSBmaWVsZAorCQkJCQlwTWFjSGRyICs9IDI7CisJCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSBTVUJUWVBFX0JFQUNPTjoKKwkJCWNhc2UgU1VCVFlQRV9QUk9CRV9SU1A6CisJCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gQmVhY29uSW50ZXJ2YWwgZmllbGQKKwkJCQlwTWFjSGRyICs9IChzaXplb2YoSEVBREVSXzgwMl8xMSkgKyBUSU1FU1RBTVBfTEVOKTsKKwkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKKworCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIENhcGFiaWxpdHlJbmZvIGZpZWxkCisJCQkJcE1hY0hkciArPSBzaXplb2YoVVNIT1JUKTsKKwkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTVUJUWVBFX0RFQVVUSDoKKwkJCWNhc2UgU1VCVFlQRV9ESVNBU1NPQzoKKwkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBSZWFzb24gY29kZSBmaWVsZAorCQkJCXBNYWNIZHIgKz0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOworCQkJCWJyZWFrOworCQl9CisJfQorCWVsc2UgaWYoIHBGcmFtZS0+RkMuVHlwZSA9PSBCVFlQRV9EQVRBICkKKwl7CisJfQorCWVsc2UgaWYocEZyYW1lLT5GQy5UeXBlID09IEJUWVBFX0NOVEwpCisJeworCQlzd2l0Y2gocEZyYW1lLT5GQy5TdWJUeXBlKQorCQl7CisJCQljYXNlIFNVQlRZUEVfQkxPQ0tfQUNLX1JFUToKKwkJCQl7CisJCQkJCVBGUkFNRV9CQV9SRVEgcEJBUmVxID0gKFBGUkFNRV9CQV9SRVEpcEZyYW1lOworCQkJCQkqKFVTSE9SVCAqKSgmcEJBUmVxLT5CQVJDb250cm9sKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmcEJBUmVxLT5CQVJDb250cm9sKSk7CisJCQkJCXBCQVJlcS0+QkFTdGFydGluZ1NlcS53b3JkID0gU1dBUDE2KHBCQVJlcS0+QkFTdGFydGluZ1NlcS53b3JkKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFNVQlRZUEVfQkxPQ0tfQUNLOgorCQkJCS8vIEZvciBCbG9jayBBY2sgcGFja2V0LCB0aGUgSFRfQ09OVFJPTCBmaWVsZCBpcyBpbiB0aGUgc2FtZSBvZmZzZXQgd2l0aCBBZGRyMworCQkJCSooVUlOVDMyICopKCZwRnJhbWUtPkFkZHIzWzBdKSA9IFNXQVAzMigqKFVJTlQzMiAqKSgmcEZyYW1lLT5BZGRyM1swXSkpOworCQkJCWJyZWFrOworCisJCQljYXNlIFNVQlRZUEVfQUNLOgorCQkJCS8vRm9yIEFDSyBwYWNrZXQsIHRoZSBIVF9DT05UUk9MIGZpZWxkIGlzIGluIHRoZSBzYW1lIG9mZnNldCB3aXRoIEFkZHIyCisJCQkJKihVSU5UMzIgKikoJnBGcmFtZS0+QWRkcjJbMF0pPQlTV0FQMzIoKihVSU5UMzIgKikoJnBGcmFtZS0+QWRkcjJbMF0pKTsKKwkJCQlicmVhazsKKwkJfQorCX0KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkludmFsaWQgRnJhbWUgVHlwZSEhIVxuIikpOworCX0KKworCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIEZyYW1lIENvbnRyb2wKKwlpZihEaXIgPT0gRElSX1dSSVRFKQorCXsKKwkJKihVU0hPUlQgKilwRGF0YSA9IFNXQVAxNigqKFVTSE9SVCAqKXBEYXRhKTsKKwl9Cit9CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCisKK3N0YXRpYyBpbmxpbmUgVk9JRCBDb252ZXJ0TXVsdGljYXN0SVAyTUFDKAorCUlOIFBVQ0hBUiBwSXBBZGRyLAorCUlOIFBVQ0hBUiAqcHBNYWNBZGRyLAorCUlOIFVJTlQxNiBQcm90b1R5cGUpCit7CisJaWYgKHBJcEFkZHIgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKHBwTWFjQWRkciA9PSBOVUxMIHx8ICpwcE1hY0FkZHIgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJc3dpdGNoIChQcm90b1R5cGUpCisJeworCQljYXNlIEVUSF9QX0lQVjY6CisvLwkJCW1lbXNldCgqcHBNYWNBZGRyLCAwLCBFVEhfTEVOR1RIX09GX0FERFJFU1MpOworCQkJKigqcHBNYWNBZGRyKSA9IDB4MzM7CisJCQkqKCpwcE1hY0FkZHIgKyAxKSA9IDB4MzM7CisJCQkqKCpwcE1hY0FkZHIgKyAyKSA9IHBJcEFkZHJbMTJdOworCQkJKigqcHBNYWNBZGRyICsgMykgPSBwSXBBZGRyWzEzXTsKKwkJCSooKnBwTWFjQWRkciArIDQpID0gcElwQWRkclsxNF07CisJCQkqKCpwcE1hY0FkZHIgKyA1KSA9IHBJcEFkZHJbMTVdOworCQkJYnJlYWs7CisKKwkJY2FzZSBFVEhfUF9JUDoKKwkJZGVmYXVsdDoKKy8vCQkJbWVtc2V0KCpwcE1hY0FkZHIsIDAsIEVUSF9MRU5HVEhfT0ZfQUREUkVTUyk7CisJCQkqKCpwcE1hY0FkZHIpID0gMHgwMTsKKwkJCSooKnBwTWFjQWRkciArIDEpID0gMHgwMDsKKwkJCSooKnBwTWFjQWRkciArIDIpID0gMHg1ZTsKKwkJCSooKnBwTWFjQWRkciArIDMpID0gcElwQWRkclsxXSAmIDB4N2Y7CisJCQkqKCpwcE1hY0FkZHIgKyA0KSA9IHBJcEFkZHJbMl07CisJCQkqKCpwcE1hY0FkZHIgKyA1KSA9IHBJcEFkZHJbM107CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm47Cit9CisKK0JPT0xFQU4gUlRNUENoZWNrRm9ySGFuZygKKwlJTiAgTkRJU19IQU5ETEUgTWluaXBvcnRBZGFwdGVyQ29udGV4dAorCSk7CisKK1ZPSUQgIFJUTVBIYWx0KAorCUlOICBORElTX0hBTkRMRSBNaW5pcG9ydEFkYXB0ZXJDb250ZXh0CisJKTsKKworLy8KKy8vICBQcml2YXRlIHJvdXRpbmVzIGluIHJ0bXBfaW5pdC5jCisvLworTkRJU19TVEFUVVMgUlRNUEFsbG9jQWRhcHRlckJsb2NrKAorCUlOIFBWT0lECQkJaGFuZGxlLAorCU9VVCBQUlRNUF9BREFQVEVSICAgKnBwQWRhcHRlcgorCSk7CisKK05ESVNfU1RBVFVTIFJUTVBBbGxvY1R4UnhSaW5nTWVtb3J5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkCisJKTsKKworTkRJU19TVEFUVVMgUlRNUEZpbmRBZGFwdGVyKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBORElTX0hBTkRMRSAgICAgV3JhcHBlckNvbmZpZ3VyYXRpb25Db250ZXh0CisJKTsKKworTkRJU19TVEFUVVMJUlRNUFJlYWRQYXJhbWV0ZXJzSG9vaygKKwlJTglQUlRNUF9BREFQVEVSIHBBZAorCSk7CisKK1ZPSUQgUlRNUEZyZWVBZGFwdGVyKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkCisJKTsKKworTkRJU19TVEFUVVMgTklDUmVhZFJlZ1BhcmFtZXRlcnMoCisJSU4gIFBSVE1QX0FEQVBURVIgICAgICAgcEFkLAorCUlOICBORElTX0hBTkRMRSAgICAgICAgIFdyYXBwZXJDb25maWd1cmF0aW9uQ29udGV4dAorCSk7CisKKworVk9JRCBOSUNSZWFkRUVQUk9NUGFyYW1ldGVycygKKwlJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQsCisJSU4JUFVDSEFSCQkJCW1hY19hZGRyKTsKKworVk9JRCBOSUNJbml0QXNpY0Zyb21FRVBST00oCisJSU4gIFBSVE1QX0FEQVBURVIgICAgICAgcEFkKTsKKworVk9JRCBOSUNJbml0VHhSeFJpbmdBbmRCYWNrbG9nUXVldWUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitORElTX1NUQVRVUyBOSUNJbml0aWFsaXplQWRhcHRlcigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgIEJPT0xFQU4gICAgYkhhcmRSZXNldCk7CisKK05ESVNfU1RBVFVTIE5JQ0luaXRpYWxpemVBc2ljKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBCT09MRUFOCQliSGFyZFJlc2V0KTsKKworVk9JRCBOSUNJc3N1ZVJlc2V0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBSVE1QUmluZ0NsZWFuVXAoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSICAgICAgICAgICBSaW5nVHlwZSk7CisKK1ZPSUQgUnhUZXN0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworTkRJU19TVEFUVVMgRGJnU2VuZFBhY2tldCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQpOworCitWT0lEIFVzZXJDZmdJbml0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBOSUNSZXNldEZyb21FcnJvcigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgTklDRXJhc2VGaXJtd2FyZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK05ESVNfU1RBVFVTIE5JQ0xvYWRGaXJtd2FyZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK05ESVNfU1RBVFVTIE5JQ0xvYWRSYXRlU3dpdGNoaW5nUGFyYW1zKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworQk9PTEVBTiBOSUNDaGVja0ZvckhhbmcoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIE5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgTklDVXBkYXRlUmF3Q291bnRlcnMoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitVTE9ORwlSVE1QTm90QWxsWmVybygKKwlJTglQVk9JRAlwU3JjMSwKKwlJTglVTE9ORwlMZW5ndGgpOworCitWT0lEIFJUTVBaZXJvTWVtb3J5KAorCUlOICBQVk9JRCAgIHBTcmMsCisJSU4gIFVMT05HICAgTGVuZ3RoKTsKKworVUxPTkcgUlRNUENvbXBhcmVNZW1vcnkoCisJSU4gIFBWT0lEICAgcFNyYzEsCisJSU4gIFBWT0lEICAgcFNyYzIsCisJSU4gIFVMT05HICAgTGVuZ3RoKTsKKworVk9JRCBSVE1QTW92ZU1lbW9yeSgKKwlPVVQgUFZPSUQgICBwRGVzdCwKKwlJTiAgUFZPSUQgICBwU3JjLAorCUlOICBVTE9ORyAgIExlbmd0aCk7CisKK1ZPSUQgQXRvSCgKKwljaGFyCSpzcmMsCisJVUNIQVIJKmRlc3QsCisJaW50CQlkZXN0bGVuKTsKKworVUNIQVIgQnRvSCgKKwljaGFyIGNoKTsKKworVk9JRCBSVE1QUGF0Y2hNYWNCYnBCdWcoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIFJUTVBQYXRjaENhcmRCdXMoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlcik7CisKK1ZPSUQgUlRNUFBhdGNoUmFsaW5rQ2FyZEJ1cygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCVVMT05HCQkJQnVzKTsKKworVUxPTkcgUlRNUFJlYWRDQkNvbmZpZygKKwlJTglVTE9ORwlCdXMsCisJSU4JVUxPTkcJU2xvdCwKKwlJTglVTE9ORwlGdW5jLAorCUlOCVVMT05HCU9mZnNldCk7CisKK1ZPSUQgUlRNUFdyaXRlQ0JDb25maWcoCisJSU4JVUxPTkcJQnVzLAorCUlOCVVMT05HCVNsb3QsCisJSU4JVUxPTkcJRnVuYywKKwlJTglVTE9ORwlPZmZzZXQsCisJSU4JVUxPTkcJVmFsdWUpOworCitWT0lEIFJUTVBJbml0VGltZXIoCisJSU4gIFBSVE1QX0FEQVBURVIgICAgICAgICAgIHBBZCwKKwlJTiAgUFJBTElOS19USU1FUl9TVFJVQ1QgICAgcFRpbWVyLAorCUlOICBQVk9JRCAgICAgICAgICAgICAgICAgICBwVGltZXJGdW5jLAorCUlOCVBWT0lECQkJCQlwRGF0YSwKKwlJTiAgQk9PTEVBTiAgICAgICAgICAgICAgICAgUmVwZWF0KTsKKworVk9JRCBSVE1QU2V0VGltZXIoCisJSU4gIFBSQUxJTktfVElNRVJfU1RSVUNUICAgIHBUaW1lciwKKwlJTiAgVUxPTkcgICAgICAgICAgICAgICAgICAgVmFsdWUpOworCisKK1ZPSUQgUlRNUE1vZFRpbWVyKAorCUlOCVBSQUxJTktfVElNRVJfU1RSVUNUCXBUaW1lciwKKwlJTglVTE9ORwkJCQkJVmFsdWUpOworCitWT0lEIFJUTVBDYW5jZWxUaW1lcigKKwlJTiAgUFJBTElOS19USU1FUl9TVFJVQ1QgICAgcFRpbWVyLAorCU9VVCBCT09MRUFOICAgICAgICAgICAgICAgICAqcENhbmNlbGxlZCk7CisKK1ZPSUQgUlRNUFNldExFRCgKKwlJTiBQUlRNUF9BREFQVEVSIAlwQWQsCisJSU4gVUNIQVIJCQlTdGF0dXMpOworCitWT0lEIFJUTVBTZXRTaWduYWxMRUQoCisJSU4gUFJUTVBfQURBUFRFUiAJcEFkLAorCUlOIE5ESVNfODAyXzExX1JTU0kgRGJtKTsKKworVk9JRCBSVE1QRW5hYmxlUnhUeCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCk7CisKKy8vCisvLyBwcm90b3R5cGUgaW4gYWN0aW9uLmMKKy8vCitWT0lEIEFjdGlvblN0YXRlTWFjaGluZUluaXQoCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCisgICAgSU4gIFNUQVRFX01BQ0hJTkUgKlMsCisgICAgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKKworVk9JRCBNbG1lQUREQkFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBNbG1lREVMQkFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBNbG1lRExTQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgTWxtZUludmFsaWRBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBNbG1lUU9TQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQgUGVlckFkZEJBUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckFkZEJBUnNwQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckRlbEJBQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckJBQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK1ZPSUQgU2VuZFBTTVBBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVUNIQVIJCQlXY2lkLAorCUlOIFVDSEFSCQkJUHNtcCk7CisKKworI2lmZGVmIERPVDExTl9EUkFGVDMKK1ZPSUQgU2VuZEJTUzIwNDBDb2V4aXN0TWdtdEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUglXY2lkLAorCUlOCVVDSEFSCWFwaWR4LAorCUlOCVVDSEFSCUluZm9SZXEpOworCitWT0lEIFNlbmROb3RpZnlCV0FjdGlvbkZyYW1lKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSICBXY2lkLAorCUlOIFVDSEFSIGFwaWR4KTsKKworQk9PTEVBTiBDaGFubmVsU3dpdGNoU2FuaXR5Q2hlY2soCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gICAgVUNIQVIgIFdjaWQsCisJSU4gICAgVUNIQVIgIE5ld0NoYW5uZWwsCisJSU4gICAgVUNIQVIgIFNlY29uZGFyeSk7CisKK1ZPSUQgQ2hhbm5lbFN3aXRjaEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgICBVQ0hBUiAgV2NpZCwKKwlJTiAgICBVQ0hBUiAgQ2hhbm5lbCwKKwlJTiAgICBVQ0hBUiAgU2Vjb25kYXJ5KTsKKworVUxPTkcgQnVpbGRJbnRvbGVyYW50Q2hhbm5lbFJlcCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgICBQVUNIQVIgIHBEZXN0KTsKKworVk9JRCBVcGRhdGUyMDQwQ29leGlzdEZyYW1lQW5kTm90aWZ5KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICAgIFVDSEFSICBXY2lkLAorCUlOCUJPT0xFQU4JYkFkZEludG9sZXJhbnRDaGEpOworCitWT0lEIFNlbmQyMDQwQ29leGlzdEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgICBVQ0hBUiAgV2NpZCwKKwlJTglCT09MRUFOCWJBZGRJbnRvbGVyYW50Q2hhKTsKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisKK1ZPSUQgUGVlclJNQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlclB1YmxpY0FjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitWT0lEIFN0YVB1YmxpY0FjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiBCc3MyMDQwQ29leGlzdCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworVk9JRCBQZWVyQlNTVHJhbkFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitWT0lEIFBlZXJIVEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitWT0lEIFBlZXJRT1NBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorVk9JRCBQZWVyRExTQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKK1ZPSUQgRGxzUGFybUZpbGwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gT1VUIE1MTUVfRExTX1JFUV9TVFJVQ1QgKnBEbHNSZXEsCisJSU4gUFJUXzgwMl8xMV9ETFMgcERscywKKwlJTiBVU0hPUlQgcmVhc29uKTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVk9JRCBSRUNCQVRpbWVyVGltZW91dCgKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisgICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIE9SSUJBVGltZXJUaW1lb3V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBTZW5kUmVmcmVzaEJBUigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK1ZPSUQgQWN0SGVhZGVySW5pdCgKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiBPVVQgUEhFQURFUl84MDJfMTEgcEhkcjgwMjExLAorICAgIElOIFBVQ0hBUiBBZGRyMSwKKyAgICBJTiBQVUNIQVIgQWRkcjIsCisgICAgSU4gUFVDSEFSIEFkZHIzKTsKKworVk9JRCBCYXJIZWFkZXJJbml0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOIE9VVCBQRlJBTUVfQkFSIHBDbnRsQmFyLAorCUlOIFBVQ0hBUiBwREEsCisJSU4gUFVDSEFSIHBTQSk7CisKK1ZPSUQgSW5zZXJ0QWN0RmllbGQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJT1VUIFBVQ0hBUiBwRnJhbWVCdWYsCisJT1VUIFBVTE9ORyBwRnJhbWVMZW4sCisJSU4gVUlOVDggQ2F0ZWdvcnksCisJSU4gVUlOVDggQWN0Q29kZSk7CisKK0JPT0xFQU4gUW9zQkFEYXRhUGFyc2UoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gQk9PTEVBTiBiQU1TRFUsCisJSU4gUFVDSEFSIHA4MDIzSGVhZGVyLAorCUlOIFVDSEFSCVdDSUQsCisJSU4gVUNIQVIJVElELAorCUlOIFVTSE9SVCBTZXF1ZW5jZSwKKwlJTiBVQ0hBUiBEYXRhT2Zmc2V0LAorCUlOIFVTSE9SVCBEYXRhc2l6ZSwKKwlJTiBVSU5UICAgQ3VyUnhJbmRleCk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK0JPT0xFQU4gQ250bEVucXVldWVGb3JSZWN2KAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVMT05HIFdjaWQsCisgICAgSU4gVUxPTkcgTXNnTGVuLAorCUlOIFBGUkFNRV9CQV9SRVEgcE1zZyk7CisKK1ZPSUQgQmFBdXRvTWFuU3dpdGNoKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBIVElPVENoZWNrKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICAgIFVDSEFSICAgICBCYXRSZWNJZHgpOworCisvLworLy8gUHJpdmF0ZSByb3V0aW5lcyBpbiBydG1wX2RhdGEuYworLy8KK0JPT0xFQU4gUlRNUEhhbmRsZVJ4RG9uZUludGVycnVwdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgUlRNUEhhbmRsZVR4RG9uZUludGVycnVwdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK0JPT0xFQU4gUlRNUEhhbmRsZVR4UmluZ0RtYURvbmVJbnRlcnJ1cHQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIElOVF9TT1VSQ0VfQ1NSX1NUUlVDIFR4UmluZ0JpdG1hcCk7CisKK1ZPSUQgUlRNUEhhbmRsZU1nbXRSaW5nRG1hRG9uZUludGVycnVwdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgUlRNUEhhbmRsZVRCVFRJbnRlcnJ1cHQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIFJUTVBIYW5kbGVQcmVUQlRUSW50ZXJydXB0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKwordm9pZCBSVE1QSGFuZGxlVHdha2V1cEludGVycnVwdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQJUlRNUEhhbmRsZVJ4Q29oZXJlbnRJbnRlcnJ1cHQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitCT09MRUFOIFR4RnJhbWVJc0FnZ3JlZ2F0aWJsZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBQcmV2QWRkcjEsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwODAyM2hkcik7CisKK0JPT0xFQU4gUGVlcklzQWdncmVPbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgVUxPTkcgICAgICAgICAgVHhSYXRlLAorICAgIElOICBQTUFDX1RBQkxFX0VOVFJZIHBNYWNFbnRyeSk7CisKK05ESVNfU1RBVFVTIFNuaWZmMkJ5dGVzRnJvbU5kaXNCdWZmZXIoCisJSU4gIFBORElTX0JVRkZFUiAgICBwRmlyc3RCdWZmZXIsCisJSU4gIFVDSEFSICAgICAgICAgICBEZXNpcmVkT2Zmc2V0LAorCU9VVCBQVUNIQVIgICAgICAgICAgcEJ5dGUwLAorCU9VVCBQVUNIQVIgICAgICAgICAgcEJ5dGUxKTsKKworTkRJU19TVEFUVVMgU1RBU2VuZFBhY2tldCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQpOworCitWT0lEIFNUQVNlbmRQYWNrZXRzKAorCUlOICBORElTX0hBTkRMRSAgICAgTWluaXBvcnRBZGFwdGVyQ29udGV4dCwKKwlJTiAgUFBORElTX1BBQ0tFVCAgIHBwUGFja2V0QXJyYXksCisJSU4gIFVJTlQgICAgICAgICAgICBOdW1iZXJPZlBhY2tldHMpOworCitWT0lEIFJUTVBEZVF1ZXVlUGFja2V0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgCUlOCUJPT0xFQU4JCQliSW50Q29udGV4dCwKKwlJTiAgVUNIQVIJCQlRdWVJZHgsCisJSU4JVUNIQVIJCQlNYXhfVHhfUGFja2V0cyk7CisKK05ESVNfU1RBVFVTCVJUTVBIYXJkVHJhbnNtaXQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gUE5ESVNfUEFDS0VUCQlwUGFja2V0LAorCUlOICBVQ0hBUgkJCVF1ZUlkeCwKKwlPVVQJUFVMT05HCQkJcEZyZWVUWERMZWZ0KTsKKworTkRJU19TVEFUVVMJU1RBSGFyZFRyYW5zbWl0KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFRYX0JMSwkJCSpwVHhCbGssCisJSU4gIFVDSEFSCQkJUXVlSWR4KTsKKworVk9JRCBTVEFSeEVBUE9MRnJhbWVJbmRpY2F0ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCitORElTX1NUQVRVUyBSVE1QRnJlZVRYRFJlcXVlc3QoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSICAgICAgICAgICBSaW5nVHlwZSwKKwlJTiAgVUNIQVIgICAgICAgICAgIE51bWJlclJlcXVpcmVkLAorCUlOIAlQVUNIQVIgICAgICAgICAgRnJlZU51bWJlcklzKTsKKworTkRJU19TVEFUVVMgTWxtZUhhcmRUcmFuc21pdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIJUXVlSWR4LAorCUlOICBQTkRJU19QQUNLRVQgICAgcFBhY2tldCk7CisKK05ESVNfU1RBVFVTIE1sbWVIYXJkVHJhbnNtaXRNZ210UmluZygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIJUXVlSWR4LAorCUlOICBQTkRJU19QQUNLRVQgICAgcFBhY2tldCk7CisKK05ESVNfU1RBVFVTIE1sbWVIYXJkVHJhbnNtaXRUeFJpbmcoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSCVF1ZUlkeCwKKwlJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQpOworCitVU0hPUlQgIFJUTVBDYWxjRHVyYXRpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSICAgICAgICAgICBSYXRlLAorCUlOICBVTE9ORyAgICAgICAgICAgU2l6ZSk7CisKK1ZPSUQgUlRNUFdyaXRlVHhXSSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVFhXSV9TVFJVQwkJcFR4V0ksCisJSU4gIEJPT0xFQU4gICAgCQlGUkFHLAorCUlOICBCT09MRUFOICAgIAkJQ0ZBQ0ssCisJSU4gIEJPT0xFQU4gICAgCQlJbnNUaW1lc3RhbXAsCisJSU4JQk9PTEVBTgkJCUFNUERVLAorCUlOCUJPT0xFQU4JCQlBY2ssCisJSU4JQk9PTEVBTgkJCU5TZXEsCQkvLyBIVyBuZXcgYSBzZXF1ZW5jZS4KKwlJTglVQ0hBUgkJCUJBU2l6ZSwKKwlJTglVQ0hBUgkJCVdDSUQsCisJSU4JVUxPTkcJCQlMZW5ndGgsCisJSU4gIFVDSEFSICAgICAgCQlQSUQsCisJSU4JVUNIQVIJCQlUSUQsCisJSU4JVUNIQVIJCQlUeFJhdGUsCisJSU4JVUNIQVIJCQlUeG9wbW9kZSwKKwlJTglCT09MRUFOCQkJQ2ZBY2ssCisJSU4JSFRUUkFOU01JVF9TRVRUSU5HCSpwVHJhbnNtaXQpOworCisKK1ZPSUQgUlRNUFdyaXRlVHhXSV9EYXRhKAorCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTglPVVQgUFRYV0lfU1RSVUMJCXBUeFdJLAorCUlOCVRYX0JMSwkJCQkqcFR4QmxrKTsKKworCitWT0lEIFJUTVBXcml0ZVR4V0lfQ2FjaGUoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCU9VVCBQVFhXSV9TVFJVQwkJcFR4V0ksCisJSU4JVFhfQkxLCQkJCSpwVHhCbGspOworCitWT0lEIFJUTVBXcml0ZVR4RGVzY3JpcHRvcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVFhEX1NUUlVDCQlwVHhELAorCUlOCUJPT0xFQU4JCQliV0lWLAorCUlOCVVDSEFSCQkJUVNFTCk7CisKK1ZPSUQgUlRNUFN1c3BlbmRNc2R1VHJhbnNtaXNzaW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBSVE1QUmVzdW1lTXNkdVRyYW5zbWlzc2lvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK05ESVNfU1RBVFVTIE1pbmlwb3J0TU1SZXF1ZXN0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCVVDSEFSCQkJUXVlSWR4LAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOICBVSU5UICAgICAgICAgICAgTGVuZ3RoKTsKKworVk9JRCBSVE1QU2VuZE51bGxGcmFtZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIgICAgICAgICAgIFR4UmF0ZSwKKwlJTglCT09MRUFOCQkJYlFvc051bGwpOworCitWT0lEIFJUTVBTZW5kRGlzYXNzb2NpYXRpb25GcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgUlRNUFNlbmRSVFNGcmFtZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEQSwKKwlJTgl1bnNpZ25lZCBpbnQJTmV4dE1wZHVTaXplLAorCUlOICBVQ0hBUiAgICAgICAgICAgVHhSYXRlLAorCUlOICBVQ0hBUiAgICAgICAgICAgUlRTUmF0ZSwKKwlJTiAgVVNIT1JUICAgICAgICAgIEFja0R1cmF0aW9uLAorCUlOICBVQ0hBUiAgICAgICAgICAgUXVlSWR4LAorCUlOICBVQ0hBUgkJCUZyYW1lR2FwKTsKKworCitORElTX1NUQVRVUyBSVE1QQXBwbHlQYWNrZXRGaWx0ZXIoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBSVDI4WFhfUlhEX1NUUlVDICAgICAgcFJ4RCwKKwlJTiAgUEhFQURFUl84MDJfMTEgIHBIZWFkZXIpOworCitQUVVFVUVfSEVBREVSICAgUlRNUENoZWNrVHhTd1F1ZXVlKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCU9VVCBVQ0hBUiAgICAgICAgICAgKlF1ZUlkeCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK1ZPSUQgUlRNUFJlcG9ydE1pY0Vycm9yKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQQ0lQSEVSX0tFWSAgICAgcFdwYUtleSk7CisKK1ZPSUQJV3BhTWljRmFpbHVyZVJlcG9ydEZyYW1lKAorCUlOICBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgICBXcGFEaXNhc3NvY0FwQW5kQmxvY2tBc3NvYygKKyAgICBJTiAgUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOICBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisgICAgSU4gIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKyAgICBJTiAgUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworTkRJU19TVEFUVVMgUlRNUENsb25lTmRpc1BhY2tldCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTglCT09MRUFOICAgIHBJbnNBTVNEVUhkciwKKwlJTiAgUE5ESVNfUEFDS0VUICAgIHBJblBhY2tldCwKKwlPVVQgUE5ESVNfUEFDS0VUICAgKnBwT3V0UGFja2V0KTsKKworTkRJU19TVEFUVVMgUlRNUEFsbG9jYXRlTmRpc1BhY2tldCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUE5ESVNfUEFDS0VUICAgICpwUGFja2V0LAorCUlOICBQVUNIQVIgICAgICAgICAgcEhlYWRlciwKKwlJTiAgVUlOVCAgICAgICAgICAgIEhlYWRlckxlbiwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEYXRhLAorCUlOICBVSU5UICAgICAgICAgICAgRGF0YUxlbik7CisKK1ZPSUQgUlRNUEZyZWVOZGlzUGFja2V0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQTkRJU19QQUNLRVQgICAgcFBhY2tldCk7CisKK0JPT0xFQU4gUlRNUEZyZWVUWERVcG9uVHhEbWFEb25lKAorCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCUlOIFVDSEFSICAgICAgICAgICAgUXVlSWR4KTsKKworQk9PTEVBTiBSVE1QQ2hlY2tESENQRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpOworCisKK0JPT0xFQU4gUlRNUENoZWNrRXRoZXJUeXBlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KTsKKworCitWT0lEIFJUTVBDY2tCYnBUdW5pbmcoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUlOVAkJCVR4UmF0ZSk7CisKKy8vCisvLyBQcml2YXRlIHJvdXRpbmVzIGluIHJ0bXBfd2VwLmMKKy8vCitWT0lEIFJUTVBJbml0V2VwRW5naW5lKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcEtleSwKKwlJTiAgVUNIQVIgICAgICAgICAgIEtleUlkLAorCUlOICBVQ0hBUiAgICAgICAgICAgS2V5TGVuLAorCUlOICBQVUNIQVIgICAgICAgICAgcERlc3QpOworCitWT0lEIFJUTVBFbmNyeXB0RGF0YSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBTcmMsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRGVzdCwKKwlJTiAgVUlOVCAgICAgICAgICAgIExlbik7CisKK0JPT0xFQU4JUlRNUERlY3J5cHREYXRhKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4JUFVDSEFSCQkJcFNyYywKKwlJTglVSU5UCQkJTGVuLAorCUlOCVVJTlQJCQlpZHgpOworCitCT09MRUFOCVJUTVBTb2Z0RGVjcnlwdFdFUCgKKwlJTiBQUlRNUF9BREFQVEVSIAlwQWQsCisJSU4gUFVDSEFSCQkJcERhdGEsCisJSU4gVUxPTkcJCQlEYXRhQnl0ZUNudCwKKwlJTiBQQ0lQSEVSX0tFWQkJcEdyb3VwS2V5KTsKKworVk9JRCBSVE1QU2V0SUNWKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcERlc3QpOworCitWT0lEIEFSQ0ZPVVJfSU5JVCgKKwlJTiAgUEFSQ0ZPVVJDT05URVhUIEN0eCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBLZXksCisJSU4gIFVJTlQgICAgICAgICAgICBLZXlMZW4pOworCitVQ0hBUiAgIEFSQ0ZPVVJfQllURSgKKwlJTiAgUEFSQ0ZPVVJDT05URVhUICAgICBDdHgpOworCitWT0lEIEFSQ0ZPVVJfREVDUllQVCgKKwlJTiAgUEFSQ0ZPVVJDT05URVhUIEN0eCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEZXN0LAorCUlOICBQVUNIQVIgICAgICAgICAgcFNyYywKKwlJTiAgVUlOVCAgICAgICAgICAgIExlbik7CisKK1ZPSUQgQVJDRk9VUl9FTkNSWVBUKAorCUlOICBQQVJDRk9VUkNPTlRFWFQgQ3R4LAorCUlOICBQVUNIQVIgICAgICAgICAgcERlc3QsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwU3JjLAorCUlOICBVSU5UICAgICAgICAgICAgTGVuKTsKKworVk9JRCBXUEFBUkNGT1VSX0VOQ1JZUFQoCisJSU4gIFBBUkNGT1VSQ09OVEVYVCBDdHgsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRGVzdCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBTcmMsCisJSU4gIFVJTlQgICAgICAgICAgICBMZW4pOworCitVSU5UIFJUTVBfQ0FMQ19GQ1MzMigKKwlJTiAgVUlOVCAgIEZjcywKKwlJTiAgUFVDSEFSICBDcCwKKwlJTiAgSU5UICAgICBMZW4pOworCisvLworLy8gTUxNRSByb3V0aW5lcworLy8KKworLy8gQXNpYy9SRi9CQlAgcmVsYXRlZCBmdW5jdGlvbnMKKworVk9JRCBBc2ljQWRqdXN0VHhQb3dlcigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgCUFzaWNVcGRhdGVQcm90ZWN0KAorCUlOCQlQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAJCVVTSE9SVAkJCU9wZXJhaW9uTW9kZSwKKwlJTiAJCVVDSEFSCQkJU2V0TWFzaywKKwlJTgkJQk9PTEVBTgkJCWJEaXNhYmxlQkdQcm90ZWN0LAorCUlOCQlCT09MRUFOCQkJYk5vbkdGRXhpc3QpOworCitWT0lEIEFzaWNTd2l0Y2hDaGFubmVsKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCVVDSEFSCQkJQ2hhbm5lbCwKKwlJTglCT09MRUFOCQkJYlNjYW4pOworCitWT0lEIEFzaWNMb2NrQ2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiBDaGFubmVsKSA7CisKK1ZPSUQgQXNpY0FudGVubmFTZWxlY3QoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSICAgICAgICAgICBDaGFubmVsKTsKKworVk9JRCBBc2ljQW50ZW5uYVNldHRpbmcoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JQUJHQkFORF9TVEFURQlCYW5kU3RhdGUpOworCitWT0lEIEFzaWNSZlR1bmluZ0V4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorVk9JRCBBc2ljU2xlZXBUaGVuQXV0b1dha2V1cCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVVNIT1JUIFRidHROdW1Ub05leHRXYWtlVXApOworCitWT0lEIEFzaWNGb3JjZVNsZWVwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBBc2ljRm9yY2VXYWtldXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gQk9PTEVBTiAgICBiRnJvbVR4KTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworVk9JRCBBc2ljU2V0QnNzaWQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiBwQnNzaWQpOworCitWT0lEIEFzaWNTZXRNY2FzdFdDKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBBc2ljRGVsV2NpZFRhYigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUglXY2lkKTsKKworVk9JRCBBc2ljRW5hYmxlUkRHKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBBc2ljRGlzYWJsZVJERygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgQXNpY0Rpc2FibGVTeW5jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBBc2ljRW5hYmxlQnNzU3luYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgQXNpY0VuYWJsZUlic3NTeW5jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBBc2ljU2V0RWRjYVBhcm0oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUEVEQ0FfUEFSTSAgICBwRWRjYVBhcm0pOworCitWT0lEIEFzaWNTZXRTbG90VGltZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBCT09MRUFOIGJVc2VTaG9ydFNsb3RUaW1lKTsKKworVk9JRCBBc2ljQWRkU2hhcmVkS2V5RW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgICAgICAgICBCc3NJbmRleCwKKwlJTiBVQ0hBUiAgICAgICAgIEtleUlkeCwKKwlJTiBVQ0hBUiAgICAgICAgIENpcGhlckFsZywKKwlJTiBQVUNIQVIgICAgICAgIHBLZXksCisJSU4gUFVDSEFSICAgICAgICBwVHhNaWMsCisJSU4gUFVDSEFSICAgICAgICBwUnhNaWMpOworCitWT0lEIEFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiAgICAgICAgIEJzc0luZGV4LAorCUlOIFVDSEFSICAgICAgICAgS2V5SWR4KTsKKworVk9JRCBBc2ljVXBkYXRlV0NJREF0dHJpYnV0ZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQJCVdDSUQsCisJSU4gVUNIQVIJCUJzc0luZGV4LAorCUlOIFVDSEFSICAgICAgICBDaXBoZXJBbGcsCisJSU4gQk9PTEVBTgkJYlVzZVBhaXJld2lzZUtleVRhYmxlKTsKKworVk9JRCBBc2ljVXBkYXRlV0NJRElWRUlWKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVAkJV0NJRCwKKwlJTiBVTE9ORyAgICAgICAgdUlWLAorCUlOIFVMT05HICAgICAgICB1RUlWKTsKKworVk9JRCBBc2ljVXBkYXRlUnhXQ0lEVGFibGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUCQlXQ0lELAorCUlOIFBVQ0hBUiAgICAgICAgcEFkZHIpOworCitWT0lEIEFzaWNBZGRLZXlFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQJCVdDSUQsCisJSU4gVUNIQVIJCUJzc0luZGV4LAorCUlOIFVDSEFSCQlLZXlJZHgsCisJSU4gUENJUEhFUl9LRVkJcENpcGhlcktleSwKKwlJTiBCT09MRUFOCQliVXNlUGFpcmV3aXNlS2V5VGFibGUsCisJSU4gQk9PTEVBTgkJYlR4S2V5KTsKKworVk9JRCBBc2ljQWRkUGFpcndpc2VLZXlFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgICAgICAgIHBBZGRyLAorCUlOIFVDSEFSCQlXQ0lELAorCUlOIENJUEhFUl9LRVkJCSAqcENpcGhlcktleSk7CisKK1ZPSUQgQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiAgcEFkLAorCUlOIFVDSEFSCQkgQnNzSWR4LAorCUlOIFVDSEFSCQkgV2NpZCk7CisKK0JPT0xFQU4gQXNpY1NlbmRDb21tYW5kVG9NY3UoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgICAgICAgICBDb21tYW5kLAorCUlOIFVDSEFSICAgICAgICAgVG9rZW4sCisJSU4gVUNIQVIgICAgICAgICBBcmcwLAorCUlOIFVDSEFSICAgICAgICAgQXJnMSk7CisKKyNpZmRlZiBSVDI4NjAKK0JPT0xFQU4gQXNpY0NoZWNrQ29tbWFuT2soCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIJCSBDb21tYW5kKTsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworVk9JRCBNYWNBZGRyUmFuZG9tQnNzaWQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJT1VUIFBVQ0hBUiBwQWRkcik7CisKK1ZPSUQgTWd0TWFjSGVhZGVySW5pdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgICAgcEFkLAorCUlOIE9VVCBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCisJSU4gVUNIQVIgU3ViVHlwZSwKKwlJTiBVQ0hBUiBUb0RzLAorCUlOIFBVQ0hBUiBwREEsCisJSU4gUFVDSEFSIHBCc3NpZCk7CisKK1ZPSUQgTWxtZVJhZGlvT2ZmKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBNbG1lUmFkaW9PbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKKworVk9JRCBCc3NUYWJsZUluaXQoCisJSU4gQlNTX1RBQkxFICpUYWIpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitWT0lEIEJBVGFibGVJbml0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIEJBX1RBQkxFICpUYWIpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitVTE9ORyBCc3NUYWJsZVNlYXJjaCgKKwlJTiBCU1NfVEFCTEUgKlRhYiwKKwlJTiBQVUNIQVIgcEJzc2lkLAorCUlOIFVDSEFSIENoYW5uZWwpOworCitVTE9ORyBCc3NTc2lkVGFibGVTZWFyY2goCisJSU4gQlNTX1RBQkxFICpUYWIsCisJSU4gUFVDSEFSICAgIHBCc3NpZCwKKwlJTiBQVUNIQVIgICAgcFNzaWQsCisJSU4gVUNIQVIgICAgIFNzaWRMZW4sCisJSU4gVUNIQVIgICAgIENoYW5uZWwpOworCitVTE9ORyBCc3NUYWJsZVNlYXJjaFdpdGhTU0lEKAorCUlOIEJTU19UQUJMRSAqVGFiLAorCUlOIFBVQ0hBUiAgICBCc3NpZCwKKwlJTiBQVUNIQVIgICAgcFNzaWQsCisJSU4gVUNIQVIgICAgIFNzaWRMZW4sCisJSU4gVUNIQVIgICAgIENoYW5uZWwpOworCitWT0lEIEJzc1RhYmxlRGVsZXRlRW50cnkoCisJSU4gT1VUICBQQlNTX1RBQkxFIHBUYWIsCisJSU4gICAgICBQVUNIQVIgcEJzc2lkLAorCUlOICAgICAgVUNIQVIgQ2hhbm5lbCk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQgQkFUYWJsZURlbGV0ZU9SSUVudHJ5KAorCUlOIE9VVAlQUlRNUF9BREFQVEVSIHBBZCwKKwlJTgkJQkFfT1JJX0VOVFJZCSpwQkFPUklFbnRyeSk7CisKK1ZPSUQgQkFUYWJsZURlbGV0ZVJFQ0VudHJ5KAorCUlOIE9VVAlQUlRNUF9BREFQVEVSIHBBZCwKKwlJTgkJQkFfUkVDX0VOVFJZCSpwQkFSRUNFbnRyeSk7CisKK1ZPSUQgQkFUYWJsZVRlYXJPUklFbnRyeSgKKwlJTiBPVVQJUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JCVVDSEFSIFRJRCwKKwlJTgkJVUNIQVIgV2NpZCwKKwlJTgkJQk9PTEVBTiBiRm9yY2VEZWxldGUsCisJSU4JCUJPT0xFQU4gQUxMKTsKKworVk9JRCBCQVRhYmxlVGVhclJFQ0VudHJ5KAorCUlOIE9VVAlQUlRNUF9BREFQVEVSIHBBZCwKKwlJTgkJVUNIQVIgVElELAorCUlOCQlVQ0hBUiBXQ0lELAorCUlOCQlCT09MRUFOIEFMTCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK1ZPSUQgIEJzc0VudHJ5U2V0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCU9VVCBQQlNTX0VOVFJZIHBCc3MsCisJSU4gUFVDSEFSIHBCc3NpZCwKKwlJTiBDSEFSIFNzaWRbXSwKKwlJTiBVQ0hBUiBTc2lkTGVuLAorCUlOIFVDSEFSIEJzc1R5cGUsCisJSU4gVVNIT1JUIEJlYWNvblBlcmlvZCwKKwlJTiBQQ0ZfUEFSTSBDZlBhcm0sCisJSU4gVVNIT1JUIEF0aW1XaW4sCisJSU4gVVNIT1JUIENhcGFiaWxpdHlJbmZvLAorCUlOIFVDSEFSIFN1cFJhdGVbXSwKKwlJTiBVQ0hBUiBTdXBSYXRlTGVuLAorCUlOIFVDSEFSIEV4dFJhdGVbXSwKKwlJTiBVQ0hBUiBFeHRSYXRlTGVuLAorCUlOIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCisJSU4gQUREX0hUX0lORk9fSUUgKnBBZGRIdEluZm8sCS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQorCUlOIFVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuLAorCUlOIFVDSEFSCQkJQWRkSHRJbmZvTGVuLAorCUlOIFVDSEFSCQkJTmV3RXh0Q2hhbk9mZnNldCwKKwlJTiBVQ0hBUiBDaGFubmVsLAorCUlOIENIQVIgUnNzaSwKKwlJTiBMQVJHRV9JTlRFR0VSIFRpbWVTdGFtcCwKKwlJTiBVQ0hBUiBDa2lwRmxhZywKKwlJTiBQRURDQV9QQVJNIHBFZGNhUGFybSwKKwlJTiBQUU9TX0NBUEFCSUxJVFlfUEFSTSBwUW9zQ2FwYWJpbGl0eSwKKwlJTiBQUUJTU19MT0FEX1BBUk0gcFFic3NMb2FkLAorCUlOIFVTSE9SVCBMZW5ndGhWSUUsCisJSU4gUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcyBwVklFKTsKKworVUxPTkcgIEJzc1RhYmxlU2V0RW50cnkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJT1VUIFBCU1NfVEFCTEUgcFRhYiwKKwlJTiBQVUNIQVIgcEJzc2lkLAorCUlOIENIQVIgU3NpZFtdLAorCUlOIFVDSEFSIFNzaWRMZW4sCisJSU4gVUNIQVIgQnNzVHlwZSwKKwlJTiBVU0hPUlQgQmVhY29uUGVyaW9kLAorCUlOIENGX1BBUk0gKkNmUGFybSwKKwlJTiBVU0hPUlQgQXRpbVdpbiwKKwlJTiBVU0hPUlQgQ2FwYWJpbGl0eUluZm8sCisJSU4gVUNIQVIgU3VwUmF0ZVtdLAorCUlOIFVDSEFSIFN1cFJhdGVMZW4sCisJSU4gVUNIQVIgRXh0UmF0ZVtdLAorCUlOIFVDSEFSIEV4dFJhdGVMZW4sCisJSU4gSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKKwlJTiBBRERfSFRfSU5GT19JRSAqcEFkZEh0SW5mbywJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCisJSU4gVUNIQVIJCQlIdENhcGFiaWxpdHlMZW4sCisJSU4gVUNIQVIJCQlBZGRIdEluZm9MZW4sCisJSU4gVUNIQVIJCQlOZXdFeHRDaGFuT2Zmc2V0LAorCUlOIFVDSEFSIENoYW5uZWwsCisJSU4gQ0hBUiBSc3NpLAorCUlOIExBUkdFX0lOVEVHRVIgVGltZVN0YW1wLAorCUlOIFVDSEFSIENraXBGbGFnLAorCUlOIFBFRENBX1BBUk0gcEVkY2FQYXJtLAorCUlOIFBRT1NfQ0FQQUJJTElUWV9QQVJNIHBRb3NDYXBhYmlsaXR5LAorCUlOIFBRQlNTX0xPQURfUEFSTSBwUWJzc0xvYWQsCisJSU4gVVNIT1JUIExlbmd0aFZJRSwKKwlJTiBQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzIHBWSUUpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitWT0lEIEJBVGFibGVJbnNlcnRFbnRyeSgKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVU0hPUlQgQWlkLAorICAgIElOIFVTSE9SVAkJVGltZU91dFZhbHVlLAorCUlOIFVTSE9SVAkJU3RhcnRpbmdTZXEsCisgICAgSU4gVUNIQVIgVElELAorCUlOIFVDSEFSIEJBV2luU2l6ZSwKKwlJTiBVQ0hBUiBPcmlnaW5hdG9yU3RhdHVzLAorICAgIElOIEJPT0xFQU4gSXNSZWNpcGllbnQpOworCisjaWZkZWYgRE9UMTFOX0RSQUZUMworVk9JRCBCc3MyMDQwQ29leGlzdFRpbWVPdXQoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworCitWT0lEICBUcmlFdmVudEluaXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitVTE9ORyBUcmlFdmVudFRhYmxlU2V0RW50cnkoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUIFRSSUdHRVJfRVZFTlRfVEFCICpUYWIsCisJSU4gUFVDSEFSIHBCc3NpZCwKKwlJTiBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAorCUlOIFVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuLAorCUlOIFVDSEFSCQkJUmVnQ2xhc3MsCisJSU4gVUNIQVIgQ2hhbm5lbE5vKTsKKworVk9JRCBUcmlFdmVudENvdW50ZXJNYWludGVuYW5jZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitWT0lEIEJzc1RhYmxlU3NpZFNvcnQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJT1VUIEJTU19UQUJMRSAqT3V0VGFiLAorCUlOICBDSEFSIFNzaWRbXSwKKwlJTiAgVUNIQVIgU3NpZExlbik7CisKK1ZPSUQgIEJzc1RhYmxlU29ydEJ5UnNzaSgKKwlJTiBPVVQgQlNTX1RBQkxFICpPdXRUYWIpOworCitWT0lEIEJzc0NpcGhlclBhcnNlKAorCUlOIE9VVCAgUEJTU19FTlRSWSAgcEJzcyk7CisKK05ESVNfU1RBVFVTICBNbG1lUXVldWVJbml0KAorCUlOIE1MTUVfUVVFVUUgKlF1ZXVlKTsKKworVk9JRCAgTWxtZVF1ZXVlRGVzdHJveSgKKwlJTiBNTE1FX1FVRVVFICpRdWV1ZSk7CisKK0JPT0xFQU4gTWxtZUVucXVldWUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUxPTkcgTWFjaGluZSwKKwlJTiBVTE9ORyBNc2dUeXBlLAorCUlOIFVMT05HIE1zZ0xlbiwKKwlJTiBWT0lEICpNc2cpOworCitCT09MRUFOIE1sbWVFbnF1ZXVlRm9yUmVjdigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiBVTE9ORyBXY2lkLAorCUlOIFVMT05HIFRpbWVTdGFtcEhpZ2gsCisJSU4gVUxPTkcgVGltZVN0YW1wTG93LAorCUlOIFVDSEFSIFJzc2kwLAorCUlOIFVDSEFSIFJzc2kxLAorCUlOIFVDSEFSIFJzc2kyLAorCUlOIFVMT05HIE1zZ0xlbiwKKwlJTiBQVk9JRCBNc2csCisJSU4gVUNIQVIgU2lnbmFsKTsKKworCitCT09MRUFOIE1sbWVEZXF1ZXVlKAorCUlOIE1MTUVfUVVFVUUgKlF1ZXVlLAorCU9VVCBNTE1FX1FVRVVFX0VMRU0gKipFbGVtKTsKKworVk9JRCAgICBNbG1lUmVzdGFydFN0YXRlTWFjaGluZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK0JPT0xFQU4gIE1sbWVRdWV1ZUVtcHR5KAorCUlOIE1MTUVfUVVFVUUgKlF1ZXVlKTsKKworQk9PTEVBTiAgTWxtZVF1ZXVlRnVsbCgKKwlJTiBNTE1FX1FVRVVFICpRdWV1ZSk7CisKK0JPT0xFQU4gIE1zZ1R5cGVTdWJzdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQRlJBTUVfODAyXzExIHBGcmFtZSwKKwlPVVQgSU5UICpNYWNoaW5lLAorCU9VVCBJTlQgKk1zZ1R5cGUpOworCitWT0lEIFN0YXRlTWFjaGluZUluaXQoCisJSU4gU1RBVEVfTUFDSElORSAqU20sCisJSU4gU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10sCisJSU4gVUxPTkcgU3ROciwKKwlJTiBVTE9ORyBNc2dOciwKKwlJTiBTVEFURV9NQUNISU5FX0ZVTkMgRGVmRnVuYywKKwlJTiBVTE9ORyBJbml0U3RhdGUsCisJSU4gVUxPTkcgQmFzZSk7CisKK1ZPSUQgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKAorCUlOIFNUQVRFX01BQ0hJTkUgKlMsCisJSU4gVUxPTkcgU3QsCisJVUxPTkcgTXNnLAorCUlOIFNUQVRFX01BQ0hJTkVfRlVOQyBGKTsKKworVk9JRCBTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOIFNUQVRFX01BQ0hJTkUgKlMsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBEcm9wKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQXNzb2NTdGF0ZU1hY2hpbmVJbml0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBTVEFURV9NQUNISU5FICpTbSwKKwlPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCitWT0lEIFJlYXNzb2NUaW1lb3V0KAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgQXNzb2NUaW1lb3V0KAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgRGlzYXNzb2NUaW1lb3V0KAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVk9JRCBNbG1lRGlzYXNzb2NSZXFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgTWxtZUFzc29jUmVxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIE1sbWVSZWFzc29jUmVxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIE1sbWVEaXNhc3NvY1JlcUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyQXNzb2NSc3BBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlclJlYXNzb2NSc3BBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckRpc2Fzc29jQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIERpc2Fzc29jVGltZW91dEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBc3NvY1RpbWVvdXRBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgIFJlYXNzb2NUaW1lb3V0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICBDbHMzZXJyQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgcEFkZHIpOworCitWT0lEIFN3aXRjaEJldHdlZW5XZXBBbmRDa2lwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCAgSW52YWxpZFN0YXRlV2hlbkFzc29jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICBJbnZhbGlkU3RhdGVXaGVuUmVhc3NvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2NpYXRlKAorCUlOICBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworCitWT0lEICBDb21wb3NlUHNQb2xsKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCAgQ29tcG9zZU51bGxGcmFtZSgKKwlJTiAgUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEICBBc3NvY1Bvc3RQcm9jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgcEFkZHIyLAorCUlOICBVU0hPUlQgQ2FwYWJpbGl0eUluZm8sCisJSU4gIFVTSE9SVCBBaWQsCisJSU4gIFVDSEFSIFN1cFJhdGVbXSwKKwlJTiAgVUNIQVIgU3VwUmF0ZUxlbiwKKwlJTiAgVUNIQVIgRXh0UmF0ZVtdLAorCUlOICBVQ0hBUiBFeHRSYXRlTGVuLAorCUlOIFBFRENBX1BBUk0gcEVkY2FQYXJtLAorCUlOIEhUX0NBUEFCSUxJVFlfSUUJCSpwSHRDYXBhYmlsaXR5LAorCUlOICBVQ0hBUiBIdENhcGFiaWxpdHlMZW4sCisJSU4gQUREX0hUX0lORk9fSUUJCSpwQWRkSHRJbmZvKTsKKworVk9JRCBBdXRoU3RhdGVNYWNoaW5lSW5pdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiBQU1RBVEVfTUFDSElORSBzbSwKKwlPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCitWT0lEIEF1dGhUaW1lb3V0KAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgTWxtZUF1dGhSZXFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckF1dGhSc3BBdFNlcTJBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckF1dGhSc3BBdFNlcTRBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQXV0aFRpbWVvdXRBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQ2xzMmVyckFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSIHBBZGRyKTsKKworVk9JRCBNbG1lRGVhdXRoUmVxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEludmFsaWRTdGF0ZVdoZW5BdXRoKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitWT0lEIEF1dGhSc3BTdGF0ZU1hY2hpbmVJbml0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQU1RBVEVfTUFDSElORSBTbSwKKwlJTiAgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCitWT0lEIFBlZXJEZWF1dGhBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyQXV0aFNpbXBsZVJzcEdlbkFuZFNlbmQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBIRUFERVJfODAyXzExICBwSGRyODAyMTEsCisJSU4gIFVTSE9SVCBBbGcsCisJSU4gIFVTSE9SVCBTZXEsCisJSU4gIFVTSE9SVCBSZWFzb24sCisJSU4gIFVTSE9SVCBTdGF0dXMpOworCisvLworLy8gUHJpdmF0ZSByb3V0aW5lcyBpbiBkbHMuYworLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAordm9pZCBEbHNTdGF0ZU1hY2hpbmVJbml0KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFNUQVRFX01BQ0hJTkUgKlNtLAorICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CisKK1ZPSUQgTWxtZURsc1JlcUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJEbHNSZXFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUglwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNCSpFbGVtKTsKKworVk9JRCBQZWVyRGxzUnNwQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIJcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTQkqRWxlbSk7CisKK1ZPSUQgTWxtZURsc1RlYXJEb3duQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckRsc1RlYXJEb3duQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIJcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTQkqRWxlbSk7CisKK1ZPSUQgUlRNUENoZWNrRExTVGltZU91dCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCk7CisKK0JPT0xFQU4gUlRNUFJjdkZyYW1lRExTQ2hlY2soCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gUEhFQURFUl84MDJfMTEJcEhlYWRlciwKKwlJTiBVTE9ORwkJCUxlbiwKKwlJTiBQUlQyOFhYX1JYRF9TVFJVQwlwUnhEKTsKKworSU5UCVJUTVBDaGVja0RMU0ZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcERBKTsKKworVk9JRCBSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwREEpOworCitORElTX1NUQVRVUyBSVE1QU2VuZFNUQUtleVJlcXVlc3QoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcERBKTsKKworTkRJU19TVEFUVVMgUlRNUFNlbmRTVEFLZXlIYW5kU2hha2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcERBKTsKKworVk9JRCBEbHNUaW1lb3V0QWN0aW9uKAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK0JPT0xFQU4gTWxtZURsc1JlcVNhbml0eSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQUlRfODAyXzExX0RMUyAqcERMUywKKyAgICBPVVQgUFVTSE9SVCBwUmVhc29uKTsKKworSU5UIFNldF9EbHNFbnRyeUluZm9fRGlzcGxheV9Qcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBhcmcpOworCitNQUNfVEFCTEVfRU5UUlkgKk1hY1RhYmxlSW5zZXJ0RGxzRW50cnkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUglwQWRkciwKKwlJTiAgVUlOVAlEbHNFbnRyeUlkeCk7CisKK0JPT0xFQU4gTWFjVGFibGVEZWxldGVEbHNFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQgd2NpZCwKKwlJTiBQVUNIQVIgcEFkZHIpOworCitNQUNfVEFCTEVfRU5UUlkgKkRsc0VudHJ5VGFibGVMb29rdXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSCXBBZGRyLAorCUlOIEJPT0xFQU4JYlJlc2V0SWRlbENvdW50KTsKKworTUFDX1RBQkxFX0VOVFJZICpEbHNFbnRyeVRhYmxlTG9va3VwQnlXY2lkKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSCXdjaWQsCisJSU4gUFVDSEFSCXBBZGRyLAorCUlOIEJPT0xFQU4JYlJlc2V0SWRlbENvdW50KTsKKworSU5UCVNldF9EbHNBZGRFbnRyeV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfRGxzVGVhckRvd25FbnRyeV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKK0JPT0xFQU4gUGVlckRsc1JlcVNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcERBLAorICAgIE9VVCBQVUNIQVIgcFNBLAorICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKKyAgICBPVVQgVVNIT1JUICpwRGxzVGltZW91dCwKKyAgICBPVVQgVUNIQVIgKnBSYXRlc0xlbiwKKyAgICBPVVQgVUNIQVIgUmF0ZXNbXSwKKyAgICBPVVQgVUNIQVIgKnBIdENhcGFiaWxpdHlMZW4sCisgICAgT1VUIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHkpOworCitCT09MRUFOIFBlZXJEbHNSc3BTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBEQSwKKyAgICBPVVQgUFVDSEFSIHBTQSwKKyAgICBPVVQgVVNIT1JUICpwQ2FwYWJpbGl0eUluZm8sCisgICAgT1VUIFVTSE9SVCAqcFN0YXR1cywKKyAgICBPVVQgVUNIQVIgKnBSYXRlc0xlbiwKKyAgICBPVVQgVUNIQVIgUmF0ZXNbXSwKKyAgICBPVVQgVUNIQVIgKnBIdENhcGFiaWxpdHlMZW4sCisgICAgT1VUIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHkpOworCitCT09MRUFOIFBlZXJEbHNUZWFyRG93blNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcERBLAorICAgIE9VVCBQVUNIQVIgcFNBLAorICAgIE9VVCBVU0hPUlQgKnBSZWFzb24pOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVk9JRCBTeW5jU3RhdGVNYWNoaW5lSW5pdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgU1RBVEVfTUFDSElORSAqU20sCisJT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKKworVk9JRCBCZWFjb25UaW1lb3V0KAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgU2NhblRpbWVvdXQoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBNbG1lU2NhblJlcUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBJbnZhbGlkU3RhdGVXaGVuU2NhbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBJbnZhbGlkU3RhdGVXaGVuSm9pbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBJbnZhbGlkU3RhdGVXaGVuU3RhcnQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckJlYWNvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBFbnF1ZXVlUHJvYmVSZXF1ZXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworQk9PTEVBTiBTY2FuUnVubmluZygKKwkJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitWT0lEIE1sbWVDbnRsSW5pdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgU1RBVEVfTUFDSElORSAqUywKKwlPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCitWT0lEIE1sbWVDbnRsTWFjaGluZVBlcmZvcm1BY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFNUQVRFX01BQ0hJTkUgKlMsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQ250bElkbGVQcm9jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIENudGxPaWRTY2FuUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQ250bE9pZFNzaWRQcm9jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKiBFbGVtKTsKKworVk9JRCBDbnRsT2lkUlRCc3NpZFByb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqIEVsZW0pOworCitWT0lEIENudGxNbG1lUm9hbWluZ1Byb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqIEVsZW0pOworCitWT0lEIENudGxXYWl0RGlzYXNzb2NQcm9jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIENudGxXYWl0Sm9pblByb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQ250bFdhaXRSZWFzc29jUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBDbnRsV2FpdFN0YXJ0UHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBDbnRsV2FpdEF1dGhQcm9jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIENudGxXYWl0QXV0aFByb2MyKAorCUlOICBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBDbnRsV2FpdEFzc29jUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorVk9JRCBDbnRsT2lkRExTU2V0dXBQcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKK1ZPSUQgTGlua1VwKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUiBCc3NUeXBlKTsKKworVk9JRCBMaW5rRG93bigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgQk9PTEVBTiAgICAgICAgIElzUmVxRnJvbUFQKTsKKworVk9JRCBJdGVyYXRlT25Cc3NUYWIoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIEl0ZXJhdGVPbkJzc1RhYjIoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOzsKKworVk9JRCBKb2luUGFybUZpbGwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE9VVCBNTE1FX0pPSU5fUkVRX1NUUlVDVCAqSm9pblJlcSwKKwlJTiAgVUxPTkcgQnNzSWR4KTsKKworVk9JRCBBc3NvY1Bhcm1GaWxsKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOIE9VVCBNTE1FX0FTU09DX1JFUV9TVFJVQ1QgKkFzc29jUmVxLAorCUlOICBQVUNIQVIgcEFkZHIsCisJSU4gIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKKwlJTiAgVUxPTkcgVGltZW91dCwKKwlJTiAgVVNIT1JUIExpc3RlbkludHYpOworCitWT0lEIFNjYW5QYXJtRmlsbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgT1VUIE1MTUVfU0NBTl9SRVFfU1RSVUNUICpTY2FuUmVxLAorCUlOICBDSEFSIFNzaWRbXSwKKwlJTiAgVUNIQVIgU3NpZExlbiwKKwlJTiAgVUNIQVIgQnNzVHlwZSwKKwlJTiAgVUNIQVIgU2NhblR5cGUpOworCitWT0lEIERpc2Fzc29jUGFybUZpbGwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE9VVCBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QgKkRpc2Fzc29jUmVxLAorCUlOICBQVUNIQVIgcEFkZHIsCisJSU4gIFVTSE9SVCBSZWFzb24pOworCitWT0lEIFN0YXJ0UGFybUZpbGwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE9VVCBNTE1FX1NUQVJUX1JFUV9TVFJVQ1QgKlN0YXJ0UmVxLAorCUlOICBDSEFSIFNzaWRbXSwKKwlJTiAgVUNIQVIgU3NpZExlbik7CisKK1ZPSUQgQXV0aFBhcm1GaWxsKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBPVVQgTUxNRV9BVVRIX1JFUV9TVFJVQ1QgKkF1dGhSZXEsCisJSU4gIFBVQ0hBUiBwQWRkciwKKwlJTiAgVVNIT1JUIEFsZyk7CisKK1ZPSUQgRW5xdWV1ZVBzUG9sbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgRW5xdWV1ZUJlYWNvbkZyYW1lKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBNbG1lSm9pblJlcUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBNbG1lU2NhblJlcUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBNbG1lU3RhcnRSZXFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgU2NhblRpbWVvdXRBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQmVhY29uVGltZW91dEF0Sm9pbkFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyQmVhY29uQXRTY2FuQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJCZWFjb25BdEpvaW5BY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckJlYWNvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyUHJvYmVSZXFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFNjYW5OZXh0Q2hhbm5lbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1VMT05HIE1ha2VJYnNzQmVhY29uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBDQ1hBZGphY2VudEFQUmVwb3J0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworQk9PTEVBTiBNbG1lU2NhblJlcVNhbml0eSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVk9JRCAqTXNnLAorCUlOICBVTE9ORyBNc2dMZW4sCisJT1VUIFVDSEFSICpCc3NUeXBlLAorCU9VVCBDSEFSIHNzaWRbXSwKKwlPVVQgVUNIQVIgKlNzaWRMZW4sCisJT1VUIFVDSEFSICpTY2FuVHlwZSk7CisKK0JPT0xFQU4gUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBWT0lEICpNc2csCisJSU4gIFVMT05HIE1zZ0xlbiwKKwlJTiAgVUNIQVIgTXNnQ2hhbm5lbCwKKwlPVVQgUFVDSEFSIHBBZGRyMiwKKwlPVVQgUFVDSEFSIHBCc3NpZCwKKwlPVVQgQ0hBUiBTc2lkW10sCisJT1VUIFVDSEFSICpwU3NpZExlbiwKKwlPVVQgVUNIQVIgKnBCc3NUeXBlLAorCU9VVCBVU0hPUlQgKnBCZWFjb25QZXJpb2QsCisJT1VUIFVDSEFSICpwQ2hhbm5lbCwKKwlPVVQgVUNIQVIgKnBOZXdDaGFubmVsLAorCU9VVCBMQVJHRV9JTlRFR0VSICpwVGltZXN0YW1wLAorCU9VVCBDRl9QQVJNICpwQ2ZQYXJtLAorCU9VVCBVU0hPUlQgKnBBdGltV2luLAorCU9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKKwlPVVQgVUNIQVIgKnBFcnAsCisJT1VUIFVDSEFSICpwRHRpbUNvdW50LAorCU9VVCBVQ0hBUiAqcER0aW1QZXJpb2QsCisJT1VUIFVDSEFSICpwQmNhc3RGbGFnLAorCU9VVCBVQ0hBUiAqcE1lc3NhZ2VUb01lLAorCU9VVCBVQ0hBUiBTdXBSYXRlW10sCisJT1VUIFVDSEFSICpwU3VwUmF0ZUxlbiwKKwlPVVQgVUNIQVIgRXh0UmF0ZVtdLAorCU9VVCBVQ0hBUiAqcEV4dFJhdGVMZW4sCisJT1VUCVVDSEFSICpwQ2tpcEZsYWcsCisJT1VUCVVDSEFSICpwQWlyb25ldENlbGxQb3dlckxpbWl0LAorCU9VVCBQRURDQV9QQVJNICAgICAgIHBFZGNhUGFybSwKKwlPVVQgUFFCU1NfTE9BRF9QQVJNICBwUWJzc0xvYWQsCisJT1VUIFBRT1NfQ0FQQUJJTElUWV9QQVJNIHBRb3NDYXBhYmlsaXR5LAorCU9VVCBVTE9ORyAqcFJhbGlua0llLAorCU9VVCBVQ0hBUgkJICpwSHRDYXBhYmlsaXR5TGVuLAorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCU9VVCBVQ0hBUgkJICpwUHJlTkh0Q2FwYWJpbGl0eUxlbiwKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlPVVQgSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKKwlPVVQgVUNIQVIJCSAqQWRkSHRJbmZvTGVuLAorCU9VVCBBRERfSFRfSU5GT19JRSAqQWRkSHRJbmZvLAorCU9VVCBVQ0hBUiAqTmV3RXh0Q2hhbm5lbCwKKwlPVVQgVVNIT1JUICpMZW5ndGhWSUUsCisJT1VUIFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMgcFZJRSk7CisKK0JPT0xFQU4gUGVlckFkZEJBUmVxQWN0aW9uU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKnBNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorCU9VVCBQVUNIQVIgcEFkZHIyKTsKKworQk9PTEVBTiBQZWVyQWRkQkFSc3BBY3Rpb25TYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqcE1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4pOworCitCT09MRUFOIFBlZXJEZWxCQUFjdGlvblNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBVQ0hBUiBXY2lkLAorICAgIElOIFZPSUQgKnBNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuKTsKKworQk9PTEVBTiBNbG1lQXNzb2NSZXFTYW5pdHkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFZPSUQgKk1zZywKKwlJTiAgVUxPTkcgTXNnTGVuLAorCU9VVCBQVUNIQVIgcEFwQWRkciwKKwlPVVQgVVNIT1JUICpDYXBhYmlsaXR5SW5mbywKKwlPVVQgVUxPTkcgKlRpbWVvdXQsCisJT1VUIFVTSE9SVCAqTGlzdGVuSW50dik7CisKK0JPT0xFQU4gTWxtZUF1dGhSZXFTYW5pdHkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFZPSUQgKk1zZywKKwlJTiAgVUxPTkcgTXNnTGVuLAorCU9VVCBQVUNIQVIgcEFkZHIsCisJT1VUIFVMT05HICpUaW1lb3V0LAorCU9VVCBVU0hPUlQgKkFsZyk7CisKK0JPT0xFQU4gTWxtZVN0YXJ0UmVxU2FuaXR5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBWT0lEICpNc2csCisJSU4gIFVMT05HIE1zZ0xlbiwKKwlPVVQgQ0hBUiBTc2lkW10sCisJT1VUIFVDSEFSICpTc2lkbGVuKTsKKworQk9PTEVBTiBQZWVyQXV0aFNhbml0eSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVk9JRCAqTXNnLAorCUlOICBVTE9ORyBNc2dMZW4sCisJT1VUIFBVQ0hBUiBwQWRkciwKKwlPVVQgVVNIT1JUICpBbGcsCisJT1VUIFVTSE9SVCAqU2VxLAorCU9VVCBVU0hPUlQgKlN0YXR1cywKKwlPVVQgQ0hBUiBDaGxnVGV4dFtdKTsKKworQk9PTEVBTiBQZWVyQXNzb2NSc3BTYW5pdHkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gVk9JRCAqcE1zZywKKwlJTiAgVUxPTkcgTXNnTGVuLAorCU9VVCBQVUNIQVIgcEFkZHIyLAorCU9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKKwlPVVQgVVNIT1JUICpwU3RhdHVzLAorCU9VVCBVU0hPUlQgKnBBaWQsCisJT1VUIFVDSEFSIFN1cFJhdGVbXSwKKwlPVVQgVUNIQVIgKnBTdXBSYXRlTGVuLAorCU9VVCBVQ0hBUiBFeHRSYXRlW10sCisJT1VUIFVDSEFSICpwRXh0UmF0ZUxlbiwKKyAgICBPVVQgSFRfQ0FQQUJJTElUWV9JRQkJKnBIdENhcGFiaWxpdHksCisgICAgT1VUIEFERF9IVF9JTkZPX0lFCQkqcEFkZEh0SW5mbywJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCisgICAgT1VUIFVDSEFSCQkJKnBIdENhcGFiaWxpdHlMZW4sCisgICAgT1VUIFVDSEFSCQkJKnBBZGRIdEluZm9MZW4sCisgICAgT1VUIFVDSEFSCQkJKnBOZXdFeHRDaGFubmVsT2Zmc2V0LAorCU9VVCBQRURDQV9QQVJNIHBFZGNhUGFybSwKKwlPVVQgVUNIQVIgKnBDa2lwRmxhZyk7CisKK0JPT0xFQU4gUGVlckRpc2Fzc29jU2FuaXR5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBWT0lEICpNc2csCisJSU4gIFVMT05HIE1zZ0xlbiwKKwlPVVQgUFVDSEFSIHBBZGRyMiwKKwlPVVQgVVNIT1JUICpSZWFzb24pOworCitCT09MRUFOIFBlZXJXcGFNZXNzYWdlU2FuaXR5KAorICAgIElOIAlQUlRNUF9BREFQVEVSIAkJcEFkLAorICAgIElOIAlQRUFQT0xfUEFDS0VUIAkJcE1zZywKKyAgICBJTiAJVUxPTkcgCQkJCU1zZ0xlbiwKKyAgICBJTiAJVUNIQVIJCQkJTXNnVHlwZSwKKyAgICBJTiAJTUFDX1RBQkxFX0VOVFJZICAJKnBFbnRyeSk7CisKK0JPT0xFQU4gUGVlckRlYXV0aFNhbml0eSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVk9JRCAqTXNnLAorCUlOICBVTE9ORyBNc2dMZW4sCisJT1VUIFBVQ0hBUiBwQWRkcjIsCisJT1VUIFVTSE9SVCAqUmVhc29uKTsKKworQk9PTEVBTiBQZWVyUHJvYmVSZXFTYW5pdHkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFZPSUQgKk1zZywKKwlJTiAgVUxPTkcgTXNnTGVuLAorCU9VVCBQVUNIQVIgcEFkZHIyLAorCU9VVCBDSEFSIFNzaWRbXSwKKwlPVVQgVUNIQVIgKnBTc2lkTGVuKTsKKworQk9PTEVBTiBHZXRUaW1CaXQoCisJSU4gIENIQVIgKlB0ciwKKwlJTiAgVVNIT1JUIEFpZCwKKwlPVVQgVUNIQVIgKlRpbUxlbiwKKwlPVVQgVUNIQVIgKkJjYXN0RmxhZywKKwlPVVQgVUNIQVIgKkR0aW1Db3VudCwKKwlPVVQgVUNIQVIgKkR0aW1QZXJpb2QsCisJT1VUIFVDSEFSICpNZXNzYWdlVG9NZSk7CisKK1VDSEFSIENoYW5uZWxTYW5pdHkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgY2hhbm5lbCk7CisKK05ESVNfODAyXzExX05FVFdPUktfVFlQRSBOZXR3b3JrVHlwZUluVXNlU2FuaXR5KAorCUlOIFBCU1NfRU5UUlkgcEJzcyk7CisKK0JPT0xFQU4gTWxtZURlbEJBUmVxU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4pOworCitCT09MRUFOIE1sbWVBZGRCQVJlcVNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcEFkZHIyKTsKKworVUxPTkcgTWFrZU91dGdvaW5nRnJhbWUoCisJT1VUIENIQVIgKkJ1ZmZlciwKKwlPVVQgVUxPTkcgKkxlbmd0aCwgLi4uKTsKKworVk9JRCAgTGZzckluaXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVMT05HIFNlZWQpOworCitVQ0hBUiBSYW5kb21CeXRlKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBBc2ljVXBkYXRlQXV0b0ZhbGxCYWNrVGFibGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcFR4UmF0ZSk7CisKK1ZPSUQgIE1sbWVQZXJpb2RpY0V4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBMaW5rRG93bkV4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBMaW5rVXBFeGVjKAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgU1RBTWxtZVBlcmlvZGljRXhlYygKKwlQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgTWxtZUF1dG9TY2FuKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworQk9PTEVBTiBNbG1lVmFsaWRhdGVTU0lEKAorCUlOIFBVQ0hBUiBwU3NpZCwKKwlJTiBVQ0hBUiAgU3NpZExlbik7CisKK1ZPSUQgTWxtZUNoZWNrRm9yUm9hbWluZygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVTE9ORyAgICBOb3czMik7CisKK1ZPSUQgTWxtZUNoZWNrRm9yRmFzdFJvYW1pbmcoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVMT05HICAgICAgICAgICBOb3cpOworCitWT0lEIE1sbWVEeW5hbWljVHhSYXRlU3dpdGNoaW5nKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBNbG1lU2V0VHhSYXRlKAorCUlOIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiBQTUFDX1RBQkxFX0VOVFJZCQlwRW50cnksCisJSU4gUFJUTVBfVFhfUkFURV9TV0lUQ0gJcFR4UmF0ZSk7CisKK1ZPSUQgTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKAorCUlOIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiBQTUFDX1RBQkxFX0VOVFJZCQlwRW50cnksCisJSU4gUFVDSEFSCQkJCSpwcFRhYmxlLAorCUlOIFBVQ0hBUgkJCQlwVGFibGVTaXplLAorCUlOIFBVQ0hBUgkJCQlwSW5pdFR4UmF0ZUlkeCk7CisKK1ZPSUQgTWxtZUNhbGN1bGF0ZUNoYW5uZWxRdWFsaXR5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVMT05HIE5vdyk7CisKK1ZPSUQgTWxtZUNoZWNrUHNtQ2hhbmdlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVMT05HICAgIE5vdzMyKTsKKworVk9JRCBNbG1lU2V0UHNtQml0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVCBwc20pOworCitWT0lEIE1sbWVTZXRUeFByZWFtYmxlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVCBUeFByZWFtYmxlKTsKKworVk9JRCBVcGRhdGVCYXNpY1JhdGVCaXRtYXAoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIE1sbWVVcGRhdGVUeFJhdGVzKAorCUlOIFBSVE1QX0FEQVBURVIgCXBBZCwKKwlJTiAJQk9PTEVBTgkJIAliTGlua1VwLAorCUlOCVVDSEFSCQkJYXBpZHgpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitWT0lEIE1sbWVVcGRhdGVIdFR4UmF0ZXMoCisJSU4gUFJUTVBfQURBUFRFUiAJCXBBZCwKKwlJTglVQ0hBUgkJCQlhcGlkeCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK1ZPSUQgICAgUlRNUENoZWNrUmF0ZXMoCisJSU4gICAgICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOIE9VVCAgVUNIQVIgICAgICAgICAgIFN1cFJhdGVbXSwKKwlJTiBPVVQgIFVDSEFSICAgICAgICAgICAqU3VwUmF0ZUxlbik7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK0JPT0xFQU4gUlRNUENoZWNrQ2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUgkJQ2VudHJhbENoYW5uZWwsCisJSU4gVUNIQVIJCUNoYW5uZWwpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCitCT09MRUFOIAlSVE1QQ2hlY2tIdCgKKwlJTgkJUFJUTVBfQURBUFRFUglwQWQsCisJSU4JCVVDSEFSCVdjaWQsCisJSU4gT1VUCUhUX0NBUEFCSUxJVFlfSUUJCQkqcEh0Q2FwYWJpbGl0eSwKKwlJTiBPVVQJQUREX0hUX0lORk9fSUUJCQkqcEFkZEh0SW5mbyk7CisKK1ZPSUQgU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwRXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIEFzaWNCYnBUdW5pbmcxKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBBc2ljQmJwVHVuaW5nMigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgUlRNUFVwZGF0ZU1sbWVSYXRlKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworQ0hBUiBSVE1QTWF4UnNzaSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBDSEFSCQkJCVJzc2kwLAorCUlOIENIQVIJCQkJUnNzaTEsCisJSU4gQ0hBUgkJCQlSc3NpMik7CisKK1ZPSUQgQXNpY0V2YWx1YXRlUnhBbnQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIEFzaWNSeEFudEV2YWxUaW1lb3V0KAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgQVBTRFBlcmlvZGljRXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitCT09MRUFOIFJUTVBDaGVja0VudHJ5RW5hYmxlQXV0b1JhdGVTd2l0Y2goCisJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJSU4gUE1BQ19UQUJMRV9FTlRSWQlwRW50cnkpOworCitVQ0hBUiBSVE1QU3RhRml4ZWRUeE1vZGUoCisJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJSU4gUE1BQ19UQUJMRV9FTlRSWQlwRW50cnkpOworCitWT0lEIFJUTVBVcGRhdGVMZWdhY3lUeFNldHRpbmcoCisJCVVDSEFSCQkJCWZpeGVkX3R4X21vZGUsCisJCVBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5KTsKKworQk9PTEVBTiBSVE1QQXV0b1JhdGVTd2l0Y2hDaGVjaygKKwlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCk7CisKK05ESVNfU1RBVFVTIE1sbWVJbml0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBNbG1lSGFuZGxlcigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgTWxtZUhhbHQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIE1sbWVSZXNldFJhbGlua0NvdW50ZXJzKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBCdWlsZENoYW5uZWxMaXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVUNIQVIgRmlyc3RDaGFubmVsKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVUNIQVIgTmV4dENoYW5uZWwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSIGNoYW5uZWwpOworCitWT0lEIENoYW5nZVRvQ2VsbFBvd2VyTGltaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgICAgICAgICBBaXJvbmV0Q2VsbFBvd2VyTGltaXQpOworCitWT0lEIFJhaXNlQ2xvY2soCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVJTlQzMiAqeCk7CisKK1ZPSUQgTG93ZXJDbG9jaygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUlOVDMyICp4KTsKKworVVNIT1JUIFNoaWZ0SW5CaXRzKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBTaGlmdE91dEJpdHMoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVTSE9SVCBkYXRhLAorCUlOICBVU0hPUlQgY291bnQpOworCitWT0lEIEVFcHJvbUNsZWFudXAoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIEVXRFMoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIEVXRU4oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitVU0hPUlQgUlRNUF9FRVBST01fUkVBRDE2KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVU0hPUlQgT2Zmc2V0KTsKKworVk9JRCBSVE1QX0VFUFJPTV9XUklURTE2KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVU0hPUlQgT2Zmc2V0LAorCUlOICBVU0hPUlQgRGF0YSk7CisKKy8vCisvLyBQcm90b3R5cGVzIG9mIGZ1bmN0aW9uIGRlZmluaXRpb24gaW4gcnRtcF90a2lwLmMKKy8vCitWT0lEICAgIFJUTVBJbml0VGtpcEVuZ2luZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBUS2V5LAorCUlOICBVQ0hBUiAgICAgICAgICAgS2V5SWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwVEEsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwTUlDS2V5LAorCUlOICBQVUNIQVIgICAgICAgICAgcFRTQywKKwlPVVQgUFVMT05HICAgICAgICAgIHBJVjE2LAorCU9VVCBQVUxPTkcgICAgICAgICAgcElWMzIpOworCitWT0lEICAgIFJUTVBJbml0TUlDRW5naW5lKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcEtleSwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEQSwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBTQSwKKwlJTiAgVUNIQVIgICAgICAgICAgIFVzZXJQcmlvcml0eSwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBNSUNLZXkpOworCitCT09MRUFOIFJUTVBUa2lwQ29tcGFyZU1JQ1ZhbHVlKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcFNyYywKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEQSwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBTQSwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBNSUNLZXksCisJSU4JVUNIQVIJCQlVc2VyUHJpb3JpdHksCisJSU4gIFVJTlQgICAgICAgICAgICBMZW4pOworCitWT0lEICAgIFJUTVBDYWxjdWxhdGVNSUNWYWx1ZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRW5jYXAsCisJSU4gIFBDSVBIRVJfS0VZICAgICBwS2V5LAorCUlOCVVDSEFSCQkJYXBpZHgpOworCitCT09MRUFOIFJUTVBUa2lwQ29tcGFyZU1JQ1ZhbHVlV2l0aExMQygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBMTEMsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwU3JjLAorCUlOICBQVUNIQVIgICAgICAgICAgcERBLAorCUlOICBQVUNIQVIgICAgICAgICAgcFNBLAorCUlOICBQVUNIQVIgICAgICAgICAgcE1JQ0tleSwKKwlJTiAgVUlOVCAgICAgICAgICAgIExlbik7CisKK1ZPSUQgICAgUlRNUFRraXBBcHBlbmRCeXRlKAorCUlOICBQVEtJUF9LRVlfSU5GTyAgcFRraXAsCisJSU4gIFVDSEFSICAgICAgICAgICB1Q2hhcik7CisKK1ZPSUQgICAgUlRNUFRraXBBcHBlbmQoCisJSU4gIFBUS0lQX0tFWV9JTkZPICBwVGtpcCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBTcmMsCisJSU4gIFVJTlQgICAgICAgICAgICBuQnl0ZXMpOworCitWT0lEICAgIFJUTVBUa2lwR2V0TUlDKAorCUlOICBQVEtJUF9LRVlfSU5GTyAgcFRraXApOworCitCT09MRUFOIFJUTVBTb2Z0RGVjcnlwdFRLSVAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSCXBEYXRhLAorCUlOIFVMT05HCURhdGFCeXRlQ250LAorCUlOIFVDSEFSICAgIFVzZXJQcmlvcml0eSwKKwlJTiBQQ0lQSEVSX0tFWQlwV3BhS2V5KTsKKworQk9PTEVBTiBSVE1QU29mdERlY3J5cHRBRVMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSCXBEYXRhLAorCUlOIFVMT05HCURhdGFCeXRlQ250LAorCUlOIFBDSVBIRVJfS0VZCXBXcGFLZXkpOworCisvLworLy8gUHJvdG90eXBlcyBvZiBmdW5jdGlvbiBkZWZpbml0aW9uIGluIGNtbV9pbmZvLmMKKy8vCitORElTX1NUQVRVUyBSVE1QV1BBUmVtb3ZlS2V5UHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFZPSUQgICAgICAgICAgIHBCdWYpOworCitWT0lEICAgIFJUTVBXUEFSZW1vdmVBbGxLZXlzKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworQk9PTEVBTiBSVE1QQ2hlY2tTdHJQcmludEFibGUoCisgICAgSU4gIENIQVIgKnBJblB1dFN0ciwKKyAgICBJTiAgVUNIQVIgc3RyTGVuKTsKKworVk9JRCAgICBSVE1QU2V0UGh5TW9kZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUxPTkcgcGh5bW9kZSk7CisKK1ZPSUQJUlRNUFVwZGF0ZUhUSUUoCisJSU4JUlRfSFRfQ0FQQUJJTElUWQkqcFJ0SHQsCisJSU4JCVVDSEFSCQkJCSpwTWNzU2V0LAorCU9VVAkJSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKKwlPVVQJCUFERF9IVF9JTkZPX0lFCQkqcEFkZEh0SW5mbyk7CisKK1ZPSUQJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUJzc0lkeCwKKwlJTiAJVUNIQVIJCSAJS2V5SWR4LAorCUlOIAlVQ0hBUgkJIAlDaXBoZXJBbGcsCisJSU4gCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5KTsKKworQ0hBUiAqR2V0RW5jcnlwdFR5cGUoCisJQ0hBUiBlbmMpOworCitDSEFSICpHZXRBdXRoTW9kZSgKKwlDSEFSIGF1dGgpOworCitWT0lEIFJUTVBJb2N0bEdldFNpdGVTdXJ2ZXkoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglzdHJ1Y3QgaXdyZXEJKndycSk7CisKK1ZPSUQgUlRNUElvY3RsR2V0TWFjVGFibGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gc3RydWN0IGl3cmVxICp3cnEpOworCitWT0lEIFJUTVBJbmRpY2F0ZVdQQTJTdGF0dXMoCisJSU4gIFBSVE1QX0FEQVBURVIgIHBBZGFwdGVyKTsKKworVk9JRAlSVE1QT1BNb2RlU3dpdGNoaW5nKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorVk9JRCAgICBSVE1QQWRkQlNTSURDaXBoZXIoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4JVUNIQVIJQWlkLAorICAgIElOICBQTkRJU184MDJfMTFfS0VZICAgIHBLZXksCisgICAgSU4gIFVDSEFSICAgQ2lwaGVyQWxnKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVk9JRAlSVE1QU2V0SFQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JT0lEX1NFVF9IVF9QSFlNT0RFICpwSFRQaHlNb2RlKTsKKworVk9JRAlSVE1QU2V0SW5kaXZpZHVhbEhUKAorCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTglVQ0hBUgkJCQlhcGlkeCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK1ZPSUQgUlRNUFNlbmRXaXJlbGVzc0V2ZW50KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVTSE9SVAkJCUV2ZW50X2ZsYWcsCisJSU4JUFVDSEFSIAkJCXBBZGRyLAorCUlOICBVQ0hBUgkJCUJzc0lkeCwKKwlJTglDSEFSCQkJUnNzaSk7CisKK1ZPSUQJTklDVXBkYXRlQ250bENvdW50ZXJzKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBIRUFERVJfODAyXzExCXBIZWFkZXIsCisJSU4gICAgVUNIQVIJCQlTdWJUeXBlLAorCUlOCVBSWFdJX1NUUlVDIAlwUnhXSSk7CisvLworLy8gcHJvdG90eXBlIGluIHdwYS5jCisvLworQk9PTEVBTiBXcGFNc2dUeXBlU3Vic3QoCisJSU4gIFVDSEFSICAgRUFQVHlwZSwKKwlPVVQgSU5UCQkqTXNnVHlwZSk7CisKK1ZPSUQgV3BhUHNrU3RhdGVNYWNoaW5lSW5pdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQsCisJSU4gIFNUQVRFX01BQ0hJTkUgICAgICAgKlMsCisJT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKKworVk9JRCBXcGFFQVBPTEtleUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgICBXcGFQYWlyTXNnMUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgICBXcGFQYWlyTXNnM0FjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgICBXcGFHcm91cE1zZzFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgICAgV3BhTWFjSGVhZGVySW5pdCgKKwlJTiAgICAgIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gT1VUICBQSEVBREVSXzgwMl8xMSAgcEhkcjgwMjExLAorCUlOICAgICAgVUNIQVIgICAgICAgICAgIHdlcCwKKwlJTiAgICAgIFBVQ0hBUiAgICAgICAgICBwQWRkcjEpOworCitWT0lEICAgIFdwYTJQYWlyTXNnMUFjdGlvbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgICBXcGEyUGFpck1zZzNBY3Rpb24oCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK0JPT0xFQU4gUGFyc2VLZXlEYXRhKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgcEtleURhdGEsCisgICAgSU4gIFVDSEFSICAgICAgICAgICBLZXlEYXRhTGVuLAorCUlOCVVDSEFSCQkJYlBhaXJld2lzZSk7CisKK1ZPSUQgICAgUlRNUFRvV2lyZWxlc3NTdGEoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwSGVhZGVyODAyXzMsCisgICAgSU4gIFVJTlQgICAgICAgICAgICBIZHJMZW4sCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRGF0YSwKKyAgICBJTiAgVUlOVCAgICAgICAgICAgIERhdGFMZW4sCisgICAgSU4JQk9PTEVBTgkJCWlzNHdheUZyYW1lKTsKKworVk9JRCAgICBITUFDX1NIQTEoCisJSU4gIFVDSEFSICAgKnRleHQsCisJSU4gIFVJTlQgICAgdGV4dF9sZW4sCisJSU4gIFVDSEFSICAgKmtleSwKKwlJTiAgVUlOVCAgICBrZXlfbGVuLAorCUlOICBVQ0hBUiAgICpkaWdlc3QpOworCitWT0lEICAgIFBSRigKKwlJTiAgVUNIQVIgICAqa2V5LAorCUlOICBJTlQgICAgIGtleV9sZW4sCisJSU4gIFVDSEFSICAgKnByZWZpeCwKKwlJTiAgSU5UICAgICBwcmVmaXhfbGVuLAorCUlOICBVQ0hBUiAgICpkYXRhLAorCUlOICBJTlQgICAgIGRhdGFfbGVuLAorCU9VVCBVQ0hBUiAgICpvdXRwdXQsCisJSU4gIElOVCAgICAgbGVuKTsKKworVk9JRCAgICBDQ0tNUFJGKAorCUlOICBVQ0hBUiAgICprZXksCisJSU4gIElOVCAgICAga2V5X2xlbiwKKwlJTiAgVUNIQVIgICAqZGF0YSwKKwlJTiAgSU5UICAgICBkYXRhX2xlbiwKKwlPVVQgVUNIQVIgICAqb3V0cHV0LAorCUlOICBJTlQgICAgIGxlbik7CisKK1ZPSUQgV3BhQ291bnRQVEsoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSICAgKlBNSywKKwlJTiAgVUNIQVIgICAqQU5vbmNlLAorCUlOICBVQ0hBUiAgICpBQSwKKwlJTiAgVUNIQVIgICAqU05vbmNlLAorCUlOICBVQ0hBUiAgICpTQSwKKwlPVVQgVUNIQVIgICAqb3V0cHV0LAorCUlOICBVSU5UICAgIGxlbik7CisKK1ZPSUQgICAgR2VuUmFuZG9tKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCVVDSEFSCQkJKm1hY0FkZHIsCisJT1VUCVVDSEFSCQkJKnJhbmRvbSk7CisKKy8vCisvLyBwcm90b3R5cGUgaW4gYWlyb25ldC5jCisvLworVk9JRCAgICBBaXJvbmV0U3RhdGVNYWNoaW5lSW5pdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQsCisJSU4gIFNUQVRFX01BQ0hJTkUgICAgICAgKlMsCisJT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyAgVHJhbnNbXSk7CisKK1ZPSUQgICAgQWlyb25ldE1zZ0FjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgICBBaXJvbmV0UmVxdWVzdEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgICBDaGFubmVsTG9hZFJlcXVlc3RBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSICAgICAgICAgICBJbmRleCk7CisKK1ZPSUQgICAgTm9pc2VIaXN0UmVxdWVzdEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIgICAgICAgICAgIEluZGV4KTsKKworVk9JRCAgICBCZWFjb25SZXF1ZXN0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUiAgICAgICAgICAgSW5kZXgpOworCitWT0lEICAgIEFpcm9uZXRSZXBvcnRBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgICAgQ2hhbm5lbExvYWRSZXBvcnRBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSICAgICAgICAgICBJbmRleCk7CisKK1ZPSUQgICAgTm9pc2VIaXN0UmVwb3J0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUiAgICAgICAgICAgSW5kZXgpOworCitWT0lEICAgIEFpcm9uZXRGaW5hbFJlcG9ydEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgICAgQmVhY29uUmVwb3J0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUiAgICAgICAgICAgSW5kZXgpOworCitWT0lEICAgIEFpcm9uZXRBZGRCZWFjb25SZXBvcnQoCisJSU4gIFBSVE1QX0FEQVBURVIgICAgICAgcEFkLAorCUlOICBVTE9ORyAgICAgICAgICAgICAgIEluZGV4LAorCUlOICBQTUxNRV9RVUVVRV9FTEVNICAgIHBFbGVtKTsKKworVk9JRCAgICBBaXJvbmV0Q3JlYXRlQmVhY29uUmVwb3J0RnJvbUJzc1RhYmxlKAorCUlOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCk7CisKK1ZPSUQgICAgREJHUFJJTlRfVFhfUklORygKKwlJTiBQUlRNUF9BREFQVEVSICBwQWQsCisJSU4gVUNIQVIgICAgICAgICAgUXVlSWR4KTsKKworVk9JRCBEQkdQUklOVF9SWF9SSU5HKAorCUlOIFBSVE1QX0FEQVBURVIgIHBBZCk7CisKK0NIQVIgICAgQ29udmVydFRvUnNzaSgKKwlJTiBQUlRNUF9BREFQVEVSICBwQWQsCisJSU4gQ0hBUgkJCQlSc3NpLAorCUlOIFVDSEFSICAgIFJzc2lOdW1iZXIpOworCisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCitWT0lEIEJ1aWxkRWZmZWN0ZWRDaGFubmVsTGlzdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCisKK1ZPSUQgQVBBc2ljRXZhbHVhdGVSeEFudCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCk7CisKKworVk9JRCBBUEFzaWNSeEFudEV2YWxUaW1lb3V0KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworLy8KKy8vIGZ1bmN0aW9uIHByb3RvdHlwZSBpbiBjbW1fd3BhLmMKKy8vCitCT09MRUFOIFJUTVBDaGVja1dQQWZyYW1lKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5LAorCUlOIFBVQ0hBUiAJCQlwRGF0YSwKKwlJTiBVTE9ORyAJCQlEYXRhQnl0ZUNvdW50LAorCUlOIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCitWT0lEIEFFU19HVEtfS0VZX1VOV1JBUCgKKwlJTiAgVUNIQVIgICAqa2V5LAorCU9VVCBVQ0hBUiAgICpwbGFpbnRleHQsCisJSU4JVUNIQVIJY19sZW4sCisJSU4gIFVDSEFSICAgKmNpcGhlcnRleHQpOworCitCT09MRUFOIFJUTVBDaGVja1JTTklFKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcERhdGEsCisJSU4gIFVDSEFSICAgICAgICAgICBEYXRhTGVuLAorCUlOICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSwKKwlPVVQJVUNIQVIJCQkqT2Zmc2V0KTsKKworQk9PTEVBTiBSVE1QUGFyc2VFYXBvbEtleURhdGEoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwS2V5RGF0YSwKKwlJTiAgVUNIQVIgICAgICAgICAgIEtleURhdGFMZW4sCisJSU4JVUNIQVIJCQlHcm91cEtleUluZGV4LAorCUlOCVVDSEFSCQkJTXNnVHlwZSwKKwlJTglCT09MRUFOCQkJYldQQTIsCisJSU4gIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5KTsKKworVk9JRAlDb25zdHJ1Y3RFYXBvbE1zZygKKwlJTiAJUFJUTVBfQURBUFRFUiAgICAJcEFkLAorICAgIElOIAlVQ0hBUgkJCQlQZWVyQXV0aE1vZGUsCisgICAgSU4gCVVDSEFSCQkJCVBlZXJXZXBTdGF0dXMsCisgICAgSU4gCVVDSEFSCQkJCU15R3JvdXBLZXlXZXBTdGF0dXMsCisgICAgSU4gCVVDSEFSCQkJCU1zZ1R5cGUsCisgICAgSU4JVUNIQVIJCQkJRGVmYXVsdEtleUlkeCwKKyAgICBJTiAJVUNIQVIJCQkJKlJlcGxheUNvdW50ZXIsCisJSU4gCVVDSEFSCQkJCSpLZXlOb25jZSwKKwlJTglVQ0hBUgkJCQkqVHhSU0MsCisJSU4JVUNIQVIJCQkJKlBUSywKKwlJTglVQ0hBUgkJCQkqR1RLLAorCUlOCVVDSEFSCQkJCSpSU05JRSwKKwlJTglVQ0hBUgkJCQlSU05JRV9MZW4sCisgICAgT1VUIFBFQVBPTF9QQUNLRVQgICAgICAgcE1zZyk7CisKK1ZPSUQJQ2FsY3VsYXRlTUlDKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJUGVlcldlcFN0YXR1cywKKwlJTglVQ0hBUgkJCSpQVEssCisJT1VUIFBFQVBPTF9QQUNLRVQgICBwTXNnKTsKKworTkRJU19TVEFUVVMJUlRNUFNvZnREZWNyeXB0QnJvYWRDYXN0RGF0YSgKKwlJTglQUlRNUF9BREFQVEVSCQkJCQlwQWQsCisJSU4JUlhfQkxLCQkJCQkJCSpwUnhCbGssCisJSU4gIE5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTIAlHcm91cENpcGhlciwKKwlJTiAgUENJUEhFUl9LRVkJCQkJCQlwU2hhcmRfa2V5KTsKKworVk9JRAlDb25zdHJ1Y3RFYXBvbEtleURhdGEoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlQZWVyQXV0aE1vZGUsCisJSU4JVUNIQVIJCQlQZWVyV2VwU3RhdHVzLAorCUlOCVVDSEFSCQkJR3JvdXBLZXlXZXBTdGF0dXMsCisJSU4gCVVDSEFSCQkJTXNnVHlwZSwKKwlJTglVQ0hBUgkJCURlZmF1bHRLZXlJZHgsCisJSU4JQk9PTEVBTgkJCWJXUEEyQ2FwYWJsZSwKKwlJTglVQ0hBUgkJCSpQVEssCisJSU4JVUNIQVIJCQkqR1RLLAorCUlOCVVDSEFSCQkJKlJTTklFLAorCUlOCVVDSEFSCQkJUlNOSUVfTEVOLAorCU9VVCBQRUFQT0xfUEFDS0VUICAgcE1zZyk7CisKK1ZPSUQgUlRNUE1ha2VSU05JRSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUlOVCAgICAgICAgICAgIEF1dGhNb2RlLAorCUlOICBVSU5UICAgICAgICAgICAgV2VwU3RhdHVzLAorCUlOCVVDSEFSCQkJYXBpZHgpOworCisvLworLy8gZnVuY3Rpb24gcHJvdG90eXBlIGluIGFwX3dwYS5jCisvLworCitCT09MRUFOIEFQV3BhTXNnVHlwZVN1YnN0KAorCUlOIFVDSEFSICAgIEVBUFR5cGUsCisJT1VUIElOVCAqTXNnVHlwZSkgOworCitNQUNfVEFCTEVfRU5UUlkgKlBBQ0lucXVpcnkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVMT05HICAgICAgICAgICBXY2lkKTsKKworQk9PTEVBTiBSVE1QQ2hlY2tNY2FzdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQRUlEX1NUUlVDVCAgICAgIGVpZF9wdHIsCisJSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5KTsKKworQk9PTEVBTiBSVE1QQ2hlY2tVY2FzdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQRUlEX1NUUlVDVCAgICAgIGVpZF9wdHIsCisJSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5KTsKKworQk9PTEVBTiBSVE1QQ2hlY2tBVVRIKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBFSURfU1RSVUNUICAgICAgZWlkX3B0ciwKKwlJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnkpOworCitWT0lEIFdQQVN0YXJ0NFdheUhTKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSwKKwlJTglVTE9ORwkJCVRpbWVJbnRlcnZhbCk7CisKK1ZPSUQgV1BBU3RhcnQyV2F5R3JvdXBIUygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnkpOworCitWT0lEIEFQV3BhRUFQUGFja2V0QWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQVBXcGFFQVBPTFN0YXJ0QWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQVBXcGFFQVBPTExvZ29mZkFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFQV3BhRUFQT0xLZXlBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBUFdwYUVBUE9MQVNGQWxlcnRBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKTsKKworVk9JRCBIYW5kbGVDb3VudGVyTWVhc3VyZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnkpOworCitWT0lEIFBlZXJQYWlyTXNnMkFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnksCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyUGFpck1zZzRBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5LAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQ01UaW1lckV4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBXUEFSZXRyeUV4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBFbnF1ZXVlU3RhcnRGb3JQU0tFeGVjKAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKyAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgUlRNUEhhbmRsZVNUQUtleSgKKyAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZGFwdGVyLAorICAgIElOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKTsKKworVk9JRCBQZWVyR3JvdXBNc2cyQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwlJTiAgUE1BQ19UQUJMRV9FTlRSWSBwRW50cnksCisJSU4gIFZPSUQgICAgICAgICAgICAgKk1zZywKKwlJTiAgVUlOVCAgICAgICAgICAgICBNc2dMZW4pOworCitWT0lEIFBhaXJEaXNBc3NvY0FjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgICBwQWQsCisJSU4gIFBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5LAorCUlOICBVU0hPUlQgICAgICAgICAgIFJlYXNvbik7CisKK1ZPSUQgTWxtZURlQXV0aEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgICBwQWQsCisJSU4gIFBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5LAorCUlOICBVU0hPUlQgICAgICAgICAgIFJlYXNvbik7CisKK1ZPSUQgR1JFS0VZUGVyaW9kaWNFeGVjKAorCUlOICBQVk9JRCAgIFN5c3RlbVNwZWNpZmljMSwKKwlJTiAgUFZPSUQgICBGdW5jdGlvbkNvbnRleHQsCisJSU4gIFBWT0lEICAgU3lzdGVtU3BlY2lmaWMyLAorCUlOICBQVk9JRCAgIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgQ291bnRHVEsoCisJSU4gIFVDSEFSICAgKlBNSywKKwlJTiAgVUNIQVIgICAqR05vbmNlLAorCUlOICBVQ0hBUiAgICpBQSwKKwlPVVQgVUNIQVIgICAqb3V0cHV0LAorCUlOICBVSU5UICAgIGxlbik7CisKK1ZPSUQgICAgR2V0U21hbGwoCisJSU4gIFBWT0lEICAgcFNyYzEsCisJSU4gIFBWT0lEICAgcFNyYzIsCisJT1VUIFBVQ0hBUiAgb3V0LAorCUlOICBVTE9ORyAgIExlbmd0aCk7CisKK1ZPSUQgICAgR2V0TGFyZ2UoCisJSU4gIFBWT0lEICAgcFNyYzEsCisJSU4gIFBWT0lEICAgcFNyYzIsCisJT1VUIFBVQ0hBUiAgb3V0LAorCUlOICBVTE9ORyAgIExlbmd0aCk7CisKK1ZPSUQgQVBHZW5SYW5kb20oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJT1VUIFVDSEFSICAgICAgICpyYW5kb20pOworCitWT0lEIEFFU19HVEtfS0VZX1dSQVAoCisJSU4gVUNIQVIgKmtleSwKKwlJTiBVQ0hBUiAqcGxhaW50ZXh0LAorCUlOIFVDSEFSIHBfbGVuLAorCU9VVCBVQ0hBUiAqY2lwaGVydGV4dCk7CisKK1ZPSUQgICAgV3BhU2VuZCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgcFBhY2tldCwKKyAgICBJTiAgVUxPTkcgICAgICAgICAgIExlbik7CisKK1ZPSUQgICAgQVBUb1dpcmVsZXNzU3RhKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBIZWFkZXI4MDJfMywKKwlJTiAgVUlOVCAgICAgICAgICAgIEhkckxlbiwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEYXRhLAorCUlOICBVSU5UICAgICAgICAgICAgRGF0YUxlbiwKKyAgICBJTglCT09MRUFOCQkJYkNsZWFyRnJhbWUpOworCitWT0lEIFJUTVBBZGRQTUtJRENhY2hlKAorCUlOICBQUlRNUF9BREFQVEVSICAgCQlwQWQsCisJSU4JSU5UCQkJCQkJYXBpZHgsCisJSU4JUFVDSEFSCQkJCXBBZGRyLAorCUlOCVVDSEFSCQkJCQkqUE1LSUQsCisJSU4JVUNIQVIJCQkJCSpQTUspOworCitJTlQgUlRNUFNlYXJjaFBNS0lEQ2FjaGUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4JSU5UCQkJCWFwaWR4LAorCUlOCVBVQ0hBUgkJcEFkZHIpOworCitWT0lEIFJUTVBEZWxldGVQTUtJRENhY2hlKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCUlOVAkJCQlhcGlkeCwKKwlJTiAgSU5UCQkJCWlkeCk7CisKK1ZPSUQgUlRNUE1haW50YWluUE1LSURDYWNoZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQJUlRNUFNlbmRUcmlnZ2VyRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFZPSUQJCQlwQnVmZmVyLAorCUlOCVVMT05HCQkJTGVuZ3RoLAorCUlOICBVQ0hBUiAgICAgICAgICAgVHhSYXRlLAorCUlOCUJPT0xFQU4JCQliUW9zTnVsbCk7CisKKworLyogdGltZW91dCAtLSBtcyAqLworVk9JRCBSVE1QX1NldFBlcmlvZGljVGltZXIoCisJSU4JTkRJU19NSU5JUE9SVF9USU1FUiAqcFRpbWVyLAorCUlOCXVuc2lnbmVkIGxvbmcgdGltZW91dCk7CisKK1ZPSUQgUlRNUF9PU19Jbml0X1RpbWVyKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIgKnBUaW1lciwKKwlJTglUSU1FUl9GVU5DVElPTiBmdW5jdGlvbiwKKwlJTglQVk9JRCBkYXRhKTsKKworVk9JRCBSVE1QX09TX0FkZF9UaW1lcigKKwlJTglORElTX01JTklQT1JUX1RJTUVSCSpwVGltZXIsCisJSU4JdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKKworVk9JRCBSVE1QX09TX01vZF9UaW1lcigKKwlJTglORElTX01JTklQT1JUX1RJTUVSCSpwVGltZXIsCisJSU4JdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKKworCitWT0lEIFJUTVBfT1NfRGVsX1RpbWVyKAorCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIJKnBUaW1lciwKKwlPVVQJQk9PTEVBTgkJCQkgKnBDYW5jZWxsZWQpOworCisKK1ZPSUQgUlRNUF9PU19SZWxlYXNlX1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglQUVVFVUVfRU5UUlkgIHBFbnRyeSk7CisKK1ZPSUQgUlRNUHVzZWNEZWxheSgKKwlJTglVTE9ORwl1c2VjKTsKKworTkRJU19TVEFUVVMgb3NfYWxsb2NfbWVtKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCU9VVAlQVUNIQVIgKm1lbSwKKwlJTglVTE9ORyAgc2l6ZSk7CisKK05ESVNfU1RBVFVTIG9zX2ZyZWVfbWVtKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVBVQ0hBUiBtZW0pOworCisKK3ZvaWQgUlRNUF9BbGxvY2F0ZVNoYXJlZE1lbW9yeSgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVTE9ORwlMZW5ndGgsCisJSU4JQk9PTEVBTglDYWNoZWQsCisJT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKKwlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpOworCitWT0lEIFJUTVBGcmVlVHhSeFJpbmdNZW1vcnkoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitORElTX1NUQVRVUyBBZGFwdGVyQmxvY2tBbGxvY2F0ZU1lbW9yeSgKKwlJTiBQVk9JRAloYW5kbGUsCisJT1VUCVBWT0lECSpwcEFkKTsKKwordm9pZCBSVE1QX0FsbG9jYXRlVHhEZXNjTWVtb3J5KAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVJTlQJSW5kZXgsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCUJPT0xFQU4JQ2FjaGVkLAorCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCisJT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKTsKKwordm9pZCBSVE1QX0FsbG9jYXRlRmlyc3RUeEJ1ZmZlcigKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVSU5UCUluZGV4LAorCUlOCVVMT05HCUxlbmd0aCwKKwlJTglCT09MRUFOCUNhY2hlZCwKKwlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAorCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcyk7CisKK3ZvaWQgUlRNUF9BbGxvY2F0ZU1nbXREZXNjTWVtb3J5KAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVMT05HCUxlbmd0aCwKKwlJTglCT09MRUFOCUNhY2hlZCwKKwlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAorCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcyk7CisKK3ZvaWQgUlRNUF9BbGxvY2F0ZVJ4RGVzY01lbW9yeSgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVTE9ORwlMZW5ndGgsCisJSU4JQk9PTEVBTglDYWNoZWQsCisJT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKKwlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpOworCitQTkRJU19QQUNLRVQgUlRNUF9BbGxvY2F0ZVJ4UGFja2V0QnVmZmVyKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVMT05HCUxlbmd0aCwKKwlJTglCT09MRUFOCUNhY2hlZCwKKwlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAorCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcyk7CisKK1BORElTX1BBQ0tFVCBSVE1QX0FsbG9jYXRlVHhQYWNrZXRCdWZmZXIoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCUJPT0xFQU4JQ2FjaGVkLAorCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MpOworCitQTkRJU19QQUNLRVQgUlRNUF9BbGxvY2F0ZUZyYWdQYWNrZXRCdWZmZXIoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUxPTkcJTGVuZ3RoKTsKKwordm9pZCBSVE1QX1F1ZXJ5UGFja2V0SW5mbygKKwlJTiAgUE5ESVNfUEFDS0VUIHBQYWNrZXQsCisJT1VUIFBBQ0tFVF9JTkZPICAqcFBhY2tldEluZm8sCisJT1VUIFBVQ0hBUgkJICpwU3JjQnVmVkEsCisJT1VUCVVJTlQJCSAqcFNyY0J1Zkxlbik7CisKK3ZvaWQgUlRNUF9RdWVyeU5leHRQYWNrZXRJbmZvKAorCUlOICBQTkRJU19QQUNLRVQgKnBwUGFja2V0LAorCU9VVCBQQUNLRVRfSU5GTyAgKnBQYWNrZXRJbmZvLAorCU9VVCBQVUNIQVIJCSAqcFNyY0J1ZlZBLAorCU9VVAlVSU5UCQkgKnBTcmNCdWZMZW4pOworCisKK0JPT0xFQU4gUlRNUF9GaWxsVHhCbGtJbmZvKAorCUlOIFJUTVBfQURBUFRFUiAqcEFkLAorCUlOIFRYX0JMSyAqcFR4QmxrKTsKKworCitQUlRNUF9TQ0FUVEVSX0dBVEhFUl9MSVNUCitydF9nZXRfc2dfbGlzdF9mcm9tX3BhY2tldChQTkRJU19QQUNLRVQgcFBhY2tldCwgUlRNUF9TQ0FUVEVSX0dBVEhFUl9MSVNUICpzZyk7CisKKworIHZvaWQgYW5ub3VuY2VfODAyXzNfcGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KTsKKworCitVSU5UIEJBX1Jlb3JkZXJfQU1TRFVfQW5ubm91bmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KTsKKworCitVSU5UIEhhbmRsZV9BTVNEVV9QYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEYXRhU2l6ZSwKKwlJTiAgVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKKwordm9pZCBjb252ZXJ0XzgwMl8xMV90b184MDJfM19wYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCisJSU4JUFVDSEFSCQkJcDgwMjNoZHIsCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEYXRhU2l6ZSwKKwlJTiAgVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKKworUE5FVF9ERVYgZ2V0X25ldGRldl9mcm9tX2Jzc2lkKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCisKK1BORElTX1BBQ0tFVCBkdXBsaWNhdGVfcGt0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBIZWFkZXI4MDJfMywKKyAgICBJTiAgVUlOVCAgICAgICAgICAgIEhkckxlbiwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVTE9ORwkJCURhdGFTaXplLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCisKK1BORElTX1BBQ0tFVCBkdXBsaWNhdGVfcGt0X3dpdGhfVEtJUF9NSUMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBPbGRQa3QpOworCitQTkRJU19QQUNLRVQgZHVwbGljYXRlX3BrdF93aXRoX1ZMQU4oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcEhlYWRlcjgwMl8zLAorICAgIElOICBVSU5UICAgICAgICAgICAgSGRyTGVuLAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVMT05HCQkJRGF0YVNpemUsCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKK1BORElTX1BBQ0tFVCBkdXBsaWNhdGVfcGt0X3dpdGhfV1BJKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAorCUlOCVVJTlQzMgkJCWV4dF9oZWFkX2xlbiwKKwlJTglVSU5UMzIJCQlleHRfdGFpbF9sZW4pOworCitVQ0hBUiBWTEFOXzgwMjNfSGVhZGVyX0NvcHkoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcEhlYWRlcjgwMl8zLAorCUlOCVVJTlQgICAgICAgICAgICBIZHJMZW4sCisJT1VUIFBVQ0hBUgkJCXBEYXRhLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCit2b2lkIGJhX2ZsdXNoX3Jlb3JkZXJpbmdfdGltZW91dF9tcGR1cygKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBQQkFfUkVDX0VOVFJZCXBCQUVudHJ5LAorCUlOIFVMT05HCQkJTm93MzIpOworCisKK1ZPSUQgQkFPcmlTZXNzaW9uU2V0VXAoCisJCQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwkJCUlOIE1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAorCQkJSU4gVUNIQVIJCQlUSUQsCisJCQlJTiBVU0hPUlQJCQlUaW1lT3V0LAorCQkJSU4gVUxPTkcJCQlEZWxheVRpbWUsCisJCQlJTiBCT09MRUFOCQlpc0ZvcmNlZCk7CisKK1ZPSUQgQkFTZXNzaW9uVGVhckRvd25BTEwoCisJSU4gT1VUCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCQlVQ0hBUiBXY2lkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworQk9PTEVBTiBPU19OZWVkX0Nsb25lX1BhY2tldCh2b2lkKTsKKworCitWT0lEIGJ1aWxkX3R4X3BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKKwlJTglQVUNIQVIJcEZyYW1lLAorCUlOCVVMT05HCUZyYW1lTGVuKTsKKworCitWT0lEIEJBT3JpU2Vzc2lvblRlYXJEb3duKAorCUlOIE9VVAlQUlRNUF9BREFQVEVSCXBBZCwKKwlJTgkJVUNIQVIJCQlXY2lkLAorCUlOCQlVQ0hBUgkJCVRJRCwKKwlJTgkJQk9PTEVBTgkJCWJQYXNzaXZlLAorCUlOCQlCT09MRUFOCQkJYkZvcmNlU2VuZCk7CisKK1ZPSUQgQkFSZWNTZXNzaW9uVGVhckRvd24oCisJSU4gT1VUCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCQlVQ0hBUgkJCVdjaWQsCisJSU4JCVVDSEFSCQkJVElELAorCUlOCQlCT09MRUFOCQkJYlBhc3NpdmUpOworCitCT09MRUFOIGJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfaW5pdChQUlRNUF9BREFQVEVSIHBBZCwgaW50IG51bSk7Cit2b2lkIGJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfcmVsZWFzZShQUlRNUF9BREFQVEVSIHBBZCk7CisKK1VMT05HIEF1dG9DaEJzc0luc2VydEVudHJ5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBwQnNzaWQsCisJSU4gQ0hBUiBTc2lkW10sCisJSU4gVUNIQVIgU3NpZExlbiwKKwlJTiBVQ0hBUiBDaGFubmVsTm8sCisJSU4gQ0hBUiBSc3NpKTsKKwordm9pZCBBdXRvQ2hCc3NUYWJsZUluaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCit2b2lkIENoYW5uZWxJbmZvSW5pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK3ZvaWQgQXV0b0NoQnNzVGFibGVEZXN0cm95KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKwordm9pZCBDaGFubmVsSW5mb0Rlc3Ryb3koCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitVQ0hBUiBOZXdfQXBBdXRvU2VsZWN0Q2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK0JPT0xFQU4gcnRzdHJtYWN0b2hleCgKKwlJTiBjaGFyICpzMSwKKwlJTiBjaGFyICpzMik7CisKK0JPT0xFQU4gcnRzdHJjYXNlY21wKAorCUlOIGNoYXIgKnMxLAorCUlOIGNoYXIgKnMyKTsKKworY2hhciAqcnRzdHJzdHJ1bmNhc2VjbXAoCisJSU4gY2hhciAqczEsCisJSU4gY2hhciAqczIpOworCitjaGFyICAgICpydHN0cnN0cigKKwlJTgljb25zdCBjaGFyICogczEsCisJSU4JY29uc3QgY2hhciAqIHMyKTsKKworY2hhciAqcnN0cnRvaygKKwlJTiBjaGFyICogcywKKwlJTiBjb25zdCBjaGFyICogY3QpOworCitpbnQgcnRpbmV0X2F0b24oCisJY29uc3QgY2hhciAqY3AsCisJdW5zaWduZWQgaW50ICphZGRyKTsKKworLy8vLy8vLy8vLyBjb21tb24gaW9jdGwgZnVuY3Rpb25zIC8vLy8vLy8vLy8KK0lOVCBTZXRfRHJpdmVyVmVyc2lvbl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQ291bnRyeVJlZ2lvbl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9XaXJlbGVzc01vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0NoYW5uZWxfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X1Nob3J0U2xvdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfVHhQb3dlcl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQkdQcm90ZWN0aW9uX1Byb2MoCisJSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiAgUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9UeFByZWFtYmxlX1Byb2MoCisJSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiAgUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9SVFNUaHJlc2hvbGRfUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOICBQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0ZyYWdUaHJlc2hvbGRfUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOICBQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X1R4QnVyc3RfUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOICBQVUNIQVIJCQlhcmcpOworCisjaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAorSU5UCVNldF9Qa3RBZ2dyZWdhdGVfUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOICBQVUNIQVIJCQlhcmcpOworI2VuZGlmCisKK0lOVAlTZXRfSUVFRTgwMjExSF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKKyNpZmRlZiBEQkcKK0lOVAlTZXRfRGVidWdfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworI2VuZGlmCisKK0lOVAlTaG93X0Rlc2NJbmZvX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9SZXNldFN0YXRDb3VudGVyX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorSU5UCVNldF9CQVNldHVwX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9CQURlY2xpbmVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0JBT3JpVGVhckRvd25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0JBUmVjVGVhckRvd25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0QndfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0TWNzX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdEdpX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdE9wTW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRTdGJjX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdEh0Y19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRFeHRjaGFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0TXBkdURlbnNpdHlfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0QmFXaW5TaXplX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdFJkZ19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRMaW5rQWRhcHRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0QW1zZHVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0QXV0b0JhX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdFByb3RlY3RfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0TWltb1BzX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworCitJTlQJU2V0X0ZvcmNlU2hvcnRHSV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfRm9yY2VHRl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRDb21tb25IVCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK0lOVAlTZXRfU2VuZFBTTVBBY3Rpb25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0TUlNT1BTbW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKKworSU5UCVNldF9IdFR4QkFTaXplX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKy8vRGxzICwJa2F0aHkKK1ZPSUQgUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBEQSk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKy8vQmxvY2sgQUNLCitWT0lEIFF1ZXJ5QkFUQUJMRSgKKwlJTiAgUFJUTVBfQURBUFRFUiBwQWQsCisJT1VUIFBRVUVSWUJBX1RBQkxFIHBCQVQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorSU5UCSAgICBXcGFDaGVja0VhcENvZGUoCisJSU4gIFBSVE1QX0FEQVBURVIgICAJcEFkLAorCUlOICBQVUNIQVIJCQkJcEZyYW1lLAorCUlOICBVU0hPUlQJCQkJRnJhbWVMZW4sCisJSU4gIFVTSE9SVAkJCQlPZmZTZXQpOworCitWT0lEICAgIFdwYVNlbmRNaWNGYWlsdXJlVG9XcGFTdXBwbGljYW50KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCwKKyAgICBJTiAgQk9PTEVBTiAgICAgICAgICAgICBiVW5pY2FzdCk7CisKK1ZPSUQgICAgU2VuZEFzc29jSUVzVG9XcGFTdXBwbGljYW50KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCk7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKK2ludCB3ZXh0X25vdGlmeV9ldmVudF9hc3NvYygKKwlJTiAgUlRNUF9BREFQVEVSICpwQWQpOworI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQgSGFuZGxlX0JTU19XaWR0aF9UcmlnZ2VyX0V2ZW50cygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK3ZvaWQgYnVpbGRfZXh0X2NoYW5uZWxfc3dpdGNoX2llKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIEhUX0VYVF9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlRfSUUgKnBJRSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKworQk9PTEVBTiBBUFJ4RG9uZUludGVycnVwdEhhbmRsZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK0JPT0xFQU4gU1RBUnhEb25lSW50ZXJydXB0SGFuZGxlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCUJPT0xFQU4JCQlhcmdjKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorLy8gQU1QRFUgcGFja2V0IGluZGljYXRpb24KK1ZPSUQgSW5kaWNhdGVfQU1QRFVfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKKy8vIEFNU0RVIHBhY2tldCBpbmRpY2F0aW9uCitWT0lEIEluZGljYXRlX0FNU0RVX1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisvLyBOb3JtYWwgbGVnYWN5IFJ4IHBhY2tldCBpbmRpY2F0aW9uCitWT0lEIEluZGljYXRlX0xlZ2FjeV9QYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworVk9JRCBJbmRpY2F0ZV9FQVBPTF9QYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKwordm9pZCAgdXBkYXRlX29zX3BhY2tldF9pbmZvKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKK3ZvaWQgd2xhbl84MDJfMTFfdG9fODAyXzNfcGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JUFVDSEFSCQkJcEhlYWRlcjgwMl8zLAorCUlOICBVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworVUlOVCBkZWFnZ3JlZ2F0ZV9BTVNEVV9hbm5vdW5jZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlQTkRJU19QQUNLRVQJCXBQYWNrZXQsCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEYXRhU2l6ZSk7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorLy8gcmVtb3ZlIExMQyBhbmQgZ2V0IDgwMl8zIEhlYWRlcgorI2RlZmluZSAgUlRNUF84MDJfMTFfUkVNT1ZFX0xMQ19BTkRfQ09OVkVSVF9UT184MDJfMyhfcFJ4QmxrLCBfcEhlYWRlcjgwMl8zKQlcCit7CQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJUFVDSEFSIF9wUmVtb3ZlZExMQ1NOQVAgPSBOVUxMLCBfcERBLCBfcFNBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCWlmIChSWF9CTEtfVEVTVF9GTEFHKF9wUnhCbGssIGZSWF9NRVNIKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJX3BEQSA9IF9wUnhCbGstPnBIZWFkZXItPkFkZHIzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlfcFNBID0gKFBVQ0hBUilfcFJ4QmxrLT5wSGVhZGVyICsgc2l6ZW9mKEhFQURFUl84MDJfMTEpOyAgICAgICAgICAgICAgICBcCisJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwllbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCWlmIChSWF9CTEtfVEVTVF9GTEFHKF9wUnhCbGssIGZSWF9JTkZSQSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKwkJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJX3BEQSA9IF9wUnhCbGstPnBIZWFkZXItPkFkZHIxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCWlmIChSWF9CTEtfVEVTVF9GTEFHKF9wUnhCbGssIGZSWF9ETFMpKQkJCQkJCQkJCVwKKwkJCV9wU0EgPSBfcFJ4QmxrLT5wSGVhZGVyLT5BZGRyMjsJCQkJCQkJCQkJXAorCQllbHNlCQkJCQkJCQkJCQkJCQkJCQlcCisJCQlfcFNBID0gX3BSeEJsay0+cEhlYWRlci0+QWRkcjM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQllbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCV9wREEgPSBfcFJ4QmxrLT5wSGVhZGVyLT5BZGRyMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJX3BTQSA9IF9wUnhCbGstPnBIZWFkZXItPkFkZHIyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJQ09OVkVSVF9UT184MDJfMyhfcEhlYWRlcjgwMl8zLCBfcERBLCBfcFNBLCBfcFJ4QmxrLT5wRGF0YSwgCQkJCVwKKwkJX3BSeEJsay0+RGF0YVNpemUsIF9wUmVtb3ZlZExMQ1NOQVApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKK0JPT0xFQU4gQVBGb3dhcmRXaXJlbGVzc1N0YVRvV2lyZWxlc3NTdGEoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCisJSU4JVUxPTkcJCQlGcm9tV2hpY2hCU1NJRCk7CisKK1ZPSUQgQW5ub3VuY2Vfb3JfRm9yd2FyZF84MDJfM19QYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKK1ZPSUQgU3RhX0Fubm91bmNlX29yX0ZvcndhcmRfODAyXzNfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNkZWZpbmUgQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQoX3BBZCwgX3BQYWNrZXQsIF9Gcm9tV2hpY2hCU1MpXAorCQkJU3RhX0Fubm91bmNlX29yX0ZvcndhcmRfODAyXzNfUGFja2V0KF9wQWQsIF9wUGFja2V0LCBfRnJvbVdoaWNoQlNTKTsKKwkJCS8vYW5ub3VuY2VfODAyXzNfcGFja2V0KF9wQWQsIF9wUGFja2V0KTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCitQTkRJU19QQUNLRVQgRHVwbGljYXRlUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCisKK1BORElTX1BBQ0tFVCBDbG9uZVBhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVTE9ORwkJCURhdGFTaXplKTsKKworCisvLyBOb3JtYWwsIEFNUERVIG9yIEFNU0RVCitWT0lEIENtbVJ4bm9uUmFsaW5rRnJhbWVJbmRpY2F0ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCitWT0lEIENtbVJ4UmFsaW5rRnJhbWVJbmRpY2F0ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCitWT0lEIFVwZGF0ZV9Sc3NpX1NhbXBsZSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBSU1NJX1NBTVBMRQkJKnBSc3NpLAorCUlOIFBSWFdJX1NUUlVDCQlwUnhXSSk7CisKK1BORElTX1BBQ0tFVCBHZXRQYWNrZXRGcm9tUnhSaW5nKAorCUlOCQlQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJCVBSVDI4WFhfUlhEX1NUUlVDCQlwU2F2ZVJ4RCwKKwlPVVQJCUJPT0xFQU4JCQkqcGJSZXNjaGVkdWxlLAorCUlOIE9VVAlVSU5UMzIJCQkqcFJ4UGVuZGluZyk7CisKK1BORElTX1BBQ0tFVCBSVE1QRGVGcmFnbWVudERhdGFGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisKKworCisKKyNpZmRlZiBTTk1QX1NVUFBPUlQKKy8vZm9yIHNubXAgLCBrYXRoeQordHlwZWRlZiBzdHJ1Y3QgX0RlZmF1bHRLZXlJZHhWYWx1ZQoreworCVVDSEFSCUtleUlkeDsKKwlVQ0hBUglWYWx1ZVsxNl07Cit9IERlZmF1bHRLZXlJZHhWYWx1ZSwgKlBEZWZhdWx0S2V5SWR4VmFsdWU7CisjZW5kaWYKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitlbnVtIHsKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtCQk9IDB4MDAwMDAwNDQsCisJRElEbXNnX2xueGluZF93bGFuc25pZmZybV9ob3N0dGltZQk9IDB4MDAwMTAwNDQsCisJRElEbXNnX2xueGluZF93bGFuc25pZmZybV9tYWN0aW1lCT0gMHgwMDAyMDA0NCwKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2NoYW5uZWwJPSAweDAwMDMwMDQ0LAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fcnNzaQkJPSAweDAwMDQwMDQ0LAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fc3EJCT0gMHgwMDA1MDA0NCwKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3NpZ25hbAk9IDB4MDAwNjAwNDQsCisJRElEbXNnX2xueGluZF93bGFuc25pZmZybV9ub2lzZQkJPSAweDAwMDcwMDQ0LAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fcmF0ZQkJPSAweDAwMDgwMDQ0LAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1faXN0eAkJPSAweDAwMDkwMDQ0LAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fZnJtbGVuCT0gMHgwMDBBMDA0NAorfTsKK2VudW0geworCVA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfbm9fdmFsdWUJPSAweDAwCit9OworZW51bSB7CisJUDgwMjExRU5VTV90cnV0aF9mYWxzZQkJCT0gMHgwMCwKKwlQODAyMTFFTlVNX3RydXRoX3RydWUJCQk9IDB4MDEKK307CisKKy8qIERlZmluaXRpb24gZnJvbSBtYWR3aWZpICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIFVJTlQzMiBkaWQ7CisgICAgICAgIFVJTlQxNiBzdGF0dXM7CisgICAgICAgIFVJTlQxNiBsZW47CisgICAgICAgIFVJTlQzMiBkYXRhOworfSBwODAyMTFpdGVtX3VpbnQzMl90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIFVJTlQzMiBtc2djb2RlOworICAgICAgICBVSU5UMzIgbXNnbGVuOworI2RlZmluZSBXTEFOX0RFVk5BTUVMRU5fTUFYIDE2CisgICAgICAgIFVJTlQ4IGRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF07CisgICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3QgaG9zdHRpbWU7CisgICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3QgbWFjdGltZTsKKyAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCBjaGFubmVsOworICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IHJzc2k7CisgICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3Qgc3E7CisgICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3Qgc2lnbmFsOworICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IG5vaXNlOworICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IHJhdGU7CisgICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3QgaXN0eDsKKyAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCBmcm1sZW47Cit9IHdsYW5fbmdfcHJpc20yX2hlYWRlcjsKKworLyogVGhlIHJhZGlvIGNhcHR1cmUgaGVhZGVyIHByZWNlZGVzIHRoZSA4MDIuMTEgaGVhZGVyLiAqLwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9pZWVlODAyMTFfcmFkaW90YXBfaGVhZGVyIHsKKyAgICBVSU5UOAlpdF92ZXJzaW9uOwkvKiBWZXJzaW9uIDAuIE9ubHkgaW5jcmVhc2VzCisJCQkJICogZm9yIGRyYXN0aWMgY2hhbmdlcywKKwkJCQkgKiBpbnRyb2R1Y3Rpb24gb2YgY29tcGF0aWJsZQorCQkJCSAqIG5ldyBmaWVsZHMgZG9lcyBub3QgY291bnQuCisJCQkJICovCisgICAgVUlOVDgJaXRfcGFkOworICAgIFVJTlQxNiAgICAgaXRfbGVuOyAgICAgICAgIC8qIGxlbmd0aCBvZiB0aGUgd2hvbGUKKwkJCQkgKiBoZWFkZXIgaW4gYnl0ZXMsIGluY2x1ZGluZworCQkJCSAqIGl0X3ZlcnNpb24sIGl0X3BhZCwKKwkJCQkgKiBpdF9sZW4sIGFuZCBkYXRhIGZpZWxkcy4KKwkJCQkgKi8KKyAgICBVSU5UMzIgICBpdF9wcmVzZW50OwkvKiBBIGJpdG1hcCB0ZWxsaW5nIHdoaWNoCisJCQkJCSAqIGZpZWxkcyBhcmUgcHJlc2VudC4gU2V0IGJpdCAzMQorCQkJCQkgKiAoMHg4MDAwMDAwMCkgdG8gZXh0ZW5kIHRoZQorCQkJCQkgKiBiaXRtYXAgYnkgYW5vdGhlciAzMiBiaXRzLgorCQkJCQkgKiBBZGRpdGlvbmFsIGV4dGVuc2lvbnMgYXJlIG1hZGUKKwkJCQkJICogYnkgc2V0dGluZyBiaXQgMzEuCisJCQkJCSAqLworfWllZWU4MDIxMV9yYWRpb3RhcF9oZWFkZXIgOworCitlbnVtIGllZWU4MDIxMV9yYWRpb3RhcF90eXBlIHsKKyAgICBJRUVFODAyMTFfUkFESU9UQVBfVFNGVCA9IDAsCisgICAgSUVFRTgwMjExX1JBRElPVEFQX0ZMQUdTID0gMSwKKyAgICBJRUVFODAyMTFfUkFESU9UQVBfUkFURSA9IDIsCisgICAgSUVFRTgwMjExX1JBRElPVEFQX0NIQU5ORUwgPSAzLAorICAgIElFRUU4MDIxMV9SQURJT1RBUF9GSFNTID0gNCwKKyAgICBJRUVFODAyMTFfUkFESU9UQVBfREJNX0FOVFNJR05BTCA9IDUsCisgICAgSUVFRTgwMjExX1JBRElPVEFQX0RCTV9BTlROT0lTRSA9IDYsCisgICAgSUVFRTgwMjExX1JBRElPVEFQX0xPQ0tfUVVBTElUWSA9IDcsCisgICAgSUVFRTgwMjExX1JBRElPVEFQX1RYX0FUVEVOVUFUSU9OID0gOCwKKyAgICBJRUVFODAyMTFfUkFESU9UQVBfREJfVFhfQVRURU5VQVRJT04gPSA5LAorICAgIElFRUU4MDIxMV9SQURJT1RBUF9EQk1fVFhfUE9XRVIgPSAxMCwKKyAgICBJRUVFODAyMTFfUkFESU9UQVBfQU5URU5OQSA9IDExLAorICAgIElFRUU4MDIxMV9SQURJT1RBUF9EQl9BTlRTSUdOQUwgPSAxMiwKKyAgICBJRUVFODAyMTFfUkFESU9UQVBfREJfQU5UTk9JU0UgPSAxMworfTsKKworI2RlZmluZSBXTEFOX1JBRElPVEFQX1BSRVNFTlQgKAkJCVwKKwkoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfVFNGVCkJfAlcCisJKDEgPDwgSUVFRTgwMjExX1JBRElPVEFQX0ZMQUdTKSB8CVwKKwkoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfUkFURSkgIHwgCVwKKwkgMCkKKwordHlwZWRlZiBzdHJ1Y3QgX3dsYW5fcmFkaW90YXBfaGVhZGVyIHsKKwlpZWVlODAyMTFfcmFkaW90YXBfaGVhZGVyIHd0X2loZHI7CisJSU5UNjQgd3RfdHNmdDsKKwlVSU5UOCB3dF9mbGFnczsKKwlVSU5UOCB3dF9yYXRlOworfSB3bGFuX3JhZGlvdGFwX2hlYWRlcjsKKy8qIERlZmluaXRpb24gZnJvbSBtYWR3aWZpICovCisKK3ZvaWQgc2VuZF9tb25pdG9yX3BhY2tldHMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsayk7CisKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTIKKy8vIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbiBxdWVyeSAvcHJvYworc3RydWN0IGl3X3N0YXRpc3RpY3MgKnJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMoCisgICAgSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOworI2VuZGlmCisKK1ZPSUQgICAgUlRNUFNldERlc2lyZWRSYXRlcygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBMT05HICAgICAgICAgICAgUmF0ZXMpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCitJTlQJU2V0X0ZpeGVkVHhNb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworI2lmZGVmIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUCitJTlQJU2V0X09wTW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisjZW5kaWYgLy8gQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQgLy8KKworc3RhdGljIGlubGluZSBjaGFyKiBHZXRQaHlNb2RlKAorCWludCBNb2RlKQoreworCXN3aXRjaChNb2RlKQorCXsKKwkJY2FzZSBNT0RFX0NDSzoKKwkJCXJldHVybiAiQ0NLIjsKKworCQljYXNlIE1PREVfT0ZETToKKwkJCXJldHVybiAiT0ZETSI7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgTU9ERV9IVE1JWDoKKwkJCXJldHVybiAiSFRNSVgiOworCisJCWNhc2UgTU9ERV9IVEdSRUVORklFTEQ6CisJCQlyZXR1cm4gIkdSRUVOIjsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJZGVmYXVsdDoKKwkJCXJldHVybiAiTi9BIjsKKwl9Cit9CisKKworc3RhdGljIGlubGluZSBjaGFyKiBHZXRCVygKKwlpbnQgQlcpCit7CisJc3dpdGNoKEJXKQorCXsKKwkJY2FzZSBCV18xMDoKKwkJCXJldHVybiAiMTBNIjsKKworCQljYXNlIEJXXzIwOgorCQkJcmV0dXJuICIyME0iOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQljYXNlIEJXXzQwOgorCQkJcmV0dXJuICI0ME0iOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQlkZWZhdWx0OgorCQkJcmV0dXJuICJOL0EiOworCX0KK30KKworCitWT0lEIFJUMjh4eFRocmVhZFRlcm1pbmF0ZSgKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCk7CisKK0JPT0xFQU4gUlQyOFhYQ2hpcHNldENoZWNrKAorCUlOIHZvaWQgKl9kZXZfcCk7CisKK0JPT0xFQU4gUlQyOFhYTmV0RGV2SW5pdCgKKwlJTiB2b2lkIAkJCQkqX2Rldl9wLAorCUlOIHN0cnVjdCAgbmV0X2RldmljZQkqbmV0X2RldiwKKwlJTiBSVE1QX0FEQVBURVIgCQkqcEFkKTsKKworQk9PTEVBTiBSVDI4WFhQcm9iZVBvc3RDb25maWcoCisJSU4gdm9pZCAJCQkJKl9kZXZfcCwKKwlJTiBSVE1QX0FEQVBURVIgCQkqcEFkLAorCUlOIElOVDMyCQkJCWFyZ2MpOworCitWT0lEIFJUMjhYWERNQURpc2FibGUoCisJSU4gUlRNUF9BREFQVEVSIAkJKnBBZCk7CisKK1ZPSUQgUlQyOFhYRE1BRW5hYmxlKAorCUlOIFJUTVBfQURBUFRFUiAJCSpwQWQpOworCitWT0lEIFJUMjh4eF9VcGRhdGVCZWFjb25Ub0FzaWMoCisJSU4gUlRNUF9BREFQVEVSICogcEFkLAorCUlOIElOVCBhcGlkeCwKKwlJTiBVTE9ORyBCZWFjb25MZW4sCisJSU4gVUxPTkcgVXBkYXRlUG9zKTsKKworSU5UIHJ0Mjh4eF9pb2N0bCgKKwlJTglzdHJ1Y3QgbmV0X2RldmljZQkqbmV0X2RldiwKKwlJTglPVVQJc3RydWN0IGlmcmVxCSpycSwKKwlJTglJTlQJCQljbWQpOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK0lOVCBydDI4eHhfc3RhX2lvY3RsKAorCUlOCXN0cnVjdCBuZXRfZGV2aWNlCSpuZXRfZGV2LAorCUlOCU9VVAlzdHJ1Y3QgaWZyZXEJKnJxLAorCUlOCUlOVAkJCWNtZCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK0JPT0xFQU4gUlQyOFhYU2VjdXJpdHlLZXlBZGQoCisJSU4JCVBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTgkJVUxPTkcJCQkJYXBpZHgsCisJSU4JCVVMT05HCQkJCUtleUlkeCwKKwlJTgkJTUFDX1RBQkxFX0VOVFJZIAkqcEVudHJ5KTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworUE5ESVNfUEFDS0VUIEdldFBhY2tldEZyb21SeFJpbmcoCisJSU4JCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAkJUFJUMjhYWF9SWERfU1RSVUMJcFNhdmVSeEQsCisJT1VUCQlCT09MRUFOCQkJKnBiUmVzY2hlZHVsZSwKKwlJTiBPVVQJVUlOVDMyCQkJKnBSeFBlbmRpbmcpOworCisKK3ZvaWQga2lsbF90aHJlYWRfdGFzayhQUlRNUF9BREFQVEVSIHBBZCk7CisKK3ZvaWQgdGJ0dF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CisKKyNpZmRlZiBSVDI4NjAKKy8vCisvLyBGdW5jdGlvbiBQcm90b3R5cGUgaW4gY21tX2RhdGFfMjg2MC5jCisvLworVVNIT1JUIFJ0bXBQQ0lfV3JpdGVUeFJlc291cmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGssCisJSU4JQk9PTEVBTgkJCWJJc0xhc3QsCisJT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKTsKKworVVNIT1JUIFJ0bXBQQ0lfV3JpdGVTaW5nbGVUeFJlc291cmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGssCisJSU4JQk9PTEVBTgkJCWJJc0xhc3QsCisJT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKTsKKworVVNIT1JUIFJ0bXBQQ0lfV3JpdGVNdWx0aVR4UmVzb3VyY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaywKKwlJTglVQ0hBUgkJCWZyYW1lTnVtLAorCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcik7CisKK1VTSE9SVAlSdG1wUENJX1dyaXRlRnJhZ1R4UmVzb3VyY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaywKKwlJTglVQ0hBUgkJCWZyYWdOdW0sCisJT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKTsKKworVVNIT1JUIFJ0bXBQQ0lfV3JpdGVTdWJUeFJlc291cmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGssCisJSU4JQk9PTEVBTgkJCWJJc0xhc3QsCisJT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKTsKKworVk9JRCBSdG1wUENJX0ZpbmFsV3JpdGVUeFJlc291cmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGssCisJSU4JVVNIT1JUCQkJdG90YWxNUERVU2l6ZSwKKwlJTglVU0hPUlQJCQlGaXJzdFR4SWR4KTsKKworVk9JRCBSdG1wUENJRGF0YUxhc3RUeElkeCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCVF1ZUlkeCwKKwlJTglVU0hPUlQJCQlMYXN0VHhJZHgpOworCitWT0lEIFJ0bXBQQ0lEYXRhS2lja091dCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrLAorCUlOCVVDSEFSCQkJUXVlSWR4KTsKKworCitpbnQgUnRtcFBDSU1nbXRLaWNrT3V0KAorCUlOIFJUTVBfQURBUFRFUiAJKnBBZCwKKwlJTiBVQ0hBUiAJCQlRdWVJZHgsCisJSU4gUE5ESVNfUEFDS0VUCQlwUGFja2V0LAorCUlOIFBVQ0hBUgkJCXBTcmNCdWZWQSwKKwlJTiBVSU5UIAkJCVNyY0J1Zkxlbik7CisKKworTkRJU19TVEFUVVMgUlRNUENoZWNrUnhFcnJvcigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUEhFQURFUl84MDJfMTEgIHBIZWFkZXIsCisJSU4JUFJYV0lfU1RSVUMJcFJ4V0ksCisJSU4gIFBSVDI4WFhfUlhEX1NUUlVDICAgICAgcFJ4RCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK1ZPSUQgUlRNUEluaXRQQ0llTGlua0N0cmxWYWx1ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgUlRNUEZpbmRIb3N0UENJRGV2KAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICAgVUNIQVIJCUxldmVsKTsKKworVk9JRCBSVE1QUENJZUxpbmtDdHJsU2V0dGluZygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAJVVNIT1JUCQlNYXgpOworCitWT0lEIFJUMjh4eFBjaUFzaWNSYWRpb09mZigKKwlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwlJTiBVQ0hBUiAgICAgICAgICAgIExldmVsLAorCUlOIFVTSE9SVCAgICAgICAgICAgVGJ0dE51bVRvTmV4dFdha2VVcCk7CisKK0JPT0xFQU4gUlQyOHh4UGNpQXNpY1JhZGlvT24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgICAgIExldmVsKTsKKworVk9JRCBSVDI4eHhQY2lTdGFBc2ljRm9yY2VXYWtldXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gQk9PTEVBTiAgICAgICBiRnJvbVR4KTsKKworVk9JRCBSVDI4eHhQY2lTdGFBc2ljU2xlZXBUaGVuQXV0b1dha2V1cCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQgVGJ0dE51bVRvTmV4dFdha2VVcCk7CisKK1ZPSUQgUHNQb2xsV2FrZUV4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCAgUmFkaW9PbkV4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworVk9JRCBSVDI4eHhQY2lNbG1lUmFkaW9PbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgUlQyOHh4UGNpTWxtZVJhZGlvT0ZGKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworVk9JRCBBc2ljVHVybk9mZlJGQ2xrKAorCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCUlOCVVDSEFSICAgICAgICAgICBDaGFubmVsKTsKKworVk9JRCBBc2ljVHVybk9uUkZDbGsoCisJSU4gUFJUTVBfQURBUFRFUiAJcEFkLAorCUlOCVVDSEFSCQkJQ2hhbm5lbCk7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitWT0lEIFFCU1NfTG9hZEluaXQoCisgCUlOCQlSVE1QX0FEQVBURVIJKnBBZCk7CisKK1VJTlQzMiBRQlNTX0xvYWRFbGVtZW50QXBwZW5kKAorIAlJTgkJUlRNUF9BREFQVEVSCSpwQWQsCisJT1VUCQlVSU5UOAkJCSpidWZfcCk7CisKK1ZPSUQgUUJTU19Mb2FkVXBkYXRlKAorIAlJTgkJUlRNUF9BREFQVEVSCSpwQWQpOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK0lOVCBSVE1QU2hvd0NmZ1ZhbHVlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBOYW1lLAorCUlOCVBVQ0hBUgkJCXBCdWYpOworCitQQ0hBUiAgIFJUTVBHZXRSYWxpbmtBdXRoTW9kZVN0cigKKyAgICBJTiAgTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSBhdXRoTW9kZSk7CisKK1BDSEFSICAgUlRNUEdldFJhbGlua0VuY3J5TW9kZVN0cigKKyAgICBJTiAgVVNIT1JUIGVuY3J5TW9kZSk7CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitWT0lEIEFzaWNTdGFCYnBUdW5pbmcoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCit2b2lkIFJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBSZVN5bmNCZWFjb25UaW1lKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBSVE1QU2V0QUdDSW5pdFZhbHVlKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVDSEFSCQkJQmFuZFdpZHRoKTsKKworaW50IHJ0Mjh4eF9jbG9zZShJTiBQTkVUX0RFViBkZXYpOworaW50IHJ0Mjh4eF9vcGVuKElOIFBORVRfREVWIGRldik7CisKK19faW5saW5lIElOVCBWSVJUVUFMX0lGX1VQKFBSVE1QX0FEQVBURVIgcEFkKQoreworZXh0ZXJuIFZPSUQgTWVzaE1ha2VCZWFjb24oSU4gUFJUTVBfQURBUFRFUiBwQWQsIElOIFVDSEFSIGlkeCk7CitleHRlcm4gVk9JRCBNZXNoVXBkYXRlQmVhY29uRnJhbWUoSU4gUFJUTVBfQURBUFRFUiBwQWQsIElOIFVDSEFSIGlkeCk7CisKKwlpZiAoVklSVFVBTF9JRl9OVU0ocEFkKSA9PSAwKQorCXsKKwkJaWYgKHJ0Mjh4eF9vcGVuKHBBZC0+bmV0X2RldikgIT0gMCkKKwkJCXJldHVybiAtMTsKKwl9CisJZWxzZQorCXsKKwl9CisJVklSVFVBTF9JRl9JTkMocEFkKTsKKwlyZXR1cm4gMDsKK30KKworX19pbmxpbmUgVk9JRCBWSVJUVUFMX0lGX0RPV04oUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVklSVFVBTF9JRl9ERUMocEFkKTsKKwlpZiAoVklSVFVBTF9JRl9OVU0ocEFkKSA9PSAwKQorCQlydDI4eHhfY2xvc2UocEFkLT5uZXRfZGV2KTsKKwlyZXR1cm47Cit9CisKKworI2VuZGlmICAvLyBfX1JUTVBfSF9fCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF9ja2lwbWljLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfY2tpcG1pYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZDk0OWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfY2tpcG1pYy5oCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXJ0bXBfY2tpcG1pYy5oCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCisqLworI2lmbmRlZglfX1JUTVBfQ0tJUE1JQ19IX18KKyNkZWZpbmUJX19SVE1QX0NLSVBNSUNfSF9fCisKK3R5cGVkZWYJc3RydWN0CV9NSUNfQ09OVEVYVAl7CisJLyogLS0tIE1NSCBjb250ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJVUNIQVIJCUNLWzE2XTsJCQkJLyogdGhlIGtleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJVUNIQVIJCWNvZWZmaWNpZW50WzE2XTsJLyogY3VycmVudCBhZXMgY291bnRlciBtb2RlIGNvZWZmaWNpZW50cyAgICAgICovCisJVUxPTkdMT05HCWFjY3VtOwkJCQkvKiBhY2N1bXVsYXRlZCBtaWMsIHJlZHVjZWQgdG8gdTMyIGluIGZpbmFsKCkgKi8KKwlVSU5UCQlwb3NpdGlvbjsJCQkvKiBjdXJyZW50IHBvc2l0aW9uIChieXRlIG9mZnNldCkgaW4gbWVzc2FnZSAgKi8KKwlVQ0hBUgkJcGFydFs0XTsJCQkvKiBmb3IgY29udmVyc2lvbiBvZiBtZXNzYWdlIHRvIHUzMiBmb3IgbW1oICAgKi8KK30JTUlDX0NPTlRFWFQsICpQTUlDX0NPTlRFWFQ7CisKK1ZPSUQJQ0tJUF9rZXlfcGVybXV0ZSgKKwlPVVQJVUNIQVIJKlBLLAkJCS8qIG91dHB1dCBwZXJtdXRlZCBrZXkgKi8KKwlJTglVQ0hBUgkqQ0ssCQkJLyogaW5wdXQgQ0tJUCBrZXkgKi8KKwlJTglVQ0hBUgl0b0RzRnJvbURzLAkJLyogaW5wdXQgdG9Ecy9Gcm9tRHMgYml0cyAqLworCUlOCVVDSEFSCSpwaXYpOwkJCS8qIGlucHV0IHBvaW50ZXIgdG8gSVYgKi8KKworVk9JRAlSVE1QQ2tpcE1pY0luaXQoCisJSU4JUE1JQ19DT05URVhUCQlwQ29udGV4dCwKKwlJTglQVUNIQVIJCQkJQ0spOworCitWT0lEIFJUTVBNaWNVcGRhdGUoCisgICAgSU4gIFBNSUNfQ09OVEVYVCAgICAgICAgcENvbnRleHQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgcE9jdGV0cywKKyAgICBJTiAgSU5UICAgICAgICAgICAgICAgICBsZW4pOworCitVTE9ORyBSVE1QTWljR2V0Q29lZmZpY2llbnQoCisgICAgSU4gIFBNSUNfQ09OVEVYVCAgICAgICAgIHBDb250ZXh0KTsKKworVk9JRCB4b3JfMTI4KAorICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIGEsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgYiwKKyAgICBPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOworCitVQ0hBUiBSVE1QQ2tpcFNib3goCisgICAgSU4gIFVDSEFSICAgICAgICAgICAgICAgYSk7CisKK1ZPSUQgeG9yXzMyKAorICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIGEsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgYiwKKyAgICBPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOworCitWT0lEIG5leHRfa2V5KAorICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIGtleSwKKyAgICBJTiAgSU5UICAgICAgICAgICAgICAgICByb3VuZCk7CisKK1ZPSUQgYnl0ZV9zdWIoCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgaW4sCisgICAgT1VUIFBVQ0hBUiAgICAgICAgICAgICAgb3V0KTsKKworVk9JRCBzaGlmdF9yb3coCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgaW4sCisgICAgT1VUIFBVQ0hBUiAgICAgICAgICAgICAgb3V0KTsKKworVk9JRCBtaXhfY29sdW1uKAorICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIGluLAorICAgIE9VVCBQVUNIQVIgICAgICAgICAgICAgIG91dCk7CisKK1ZPSUQgUlRNUEFlc0VuY3J5cHQoCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAga2V5LAorICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIGRhdGEsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgY2lwaGVydGV4dCk7CisKK1ZPSUQgUlRNUE1pY0ZpbmFsKAorICAgIElOICBQTUlDX0NPTlRFWFQgICAgICAgIHBDb250ZXh0LAorICAgIE9VVCBVQ0hBUiAgICAgICAgICAgICAgIGRpZ2VzdFs0XSk7CisKK1ZPSUQgUlRNUENraXBJbnNlcnRDTUlDKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIE9VVCBQVUNIQVIgICAgICAgICAgcE1JQywKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIHA4MDIxMWhkciwKKyAgICBJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQsCisgICAgSU4gIFBDSVBIRVJfS0VZICAgICBwS2V5LAorICAgIElOICBQVUNIQVIgICAgICAgICAgbWljX3NuYXApOworCisjZW5kaWYgLy9fX1JUTVBfQ0tJUE1JQ19IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF9kZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF9kZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTk4MjE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX2RlZi5oCkBAIC0wLDAgKzEsMTU4OCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICBydG1wX2RlZi5oCisKKyAgICBBYnN0cmFjdDoKKyAgICBNaW5pcG9ydCByZWxhdGVkIGRlZmluaXRpb24gaGVhZGVyCisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFBhdWwgTGluICAgIDA4LTAxLTIwMDIgICAgY3JlYXRlZAorICAgIEpvaG4gQ2hhbmcgIDA4LTA1LTIwMDMgICAgYWRkIGRlZmluaXRpb24gZm9yIDExZyAmIG90aGVyIGRyYWZ0cworKi8KKyNpZm5kZWYgX19SVE1QX0RFRl9IX18KKyNkZWZpbmUgX19SVE1QX0RFRl9IX18KKworI2luY2x1ZGUgIm9pZC5oIgorCisvLworLy8gIERlYnVnIGluZm9ybWF0aW9uIHZlcmJvc2l0eTogbG93ZXIgdmFsdWVzIGluZGljYXRlIGhpZ2hlciB1cmdlbmN5CisvLworI2RlZmluZSBSVF9ERUJVR19PRkYgICAgICAgIDAKKyNkZWZpbmUgUlRfREVCVUdfRVJST1IgICAgICAxCisjZGVmaW5lIFJUX0RFQlVHX1dBUk4gICAgICAgMgorI2RlZmluZSBSVF9ERUJVR19UUkFDRSAgICAgIDMKKyNkZWZpbmUgUlRfREVCVUdfSU5GTyAgICAgICA0CisjZGVmaW5lIFJUX0RFQlVHX0xPVUQgICAgICAgNQorCisjZGVmaW5lIE5JQ19UQUcgICAgICAgICAgICAgKChVTE9ORyknMDY4MicpCisjZGVmaW5lIE5JQ19EQkdfU1RSSU5HICAgICAgKCIqKlJUMjh4eCoqIikKKworI2lmZGVmIFNOTVBfU1VQUE9SVAorLy8gZm9yIHNubXAKKy8vIHRvIGdldCBtYW51ZmFjdHVyZXIgT1VJLCBrYXRoeSwgMjAwOF8wMjIwCisjZGVmaW5lIE1hbnVmYWN0dXJlck9VSV9MRU4JCQkzCisjZGVmaW5lIE1hbnVmYWN0dXJlck5BTUUJCQkoIlJhbGluayBUZWNobm9sb2d5IENvbXBhbnkuIikKKyNkZWZpbmUJUmVzb3VyY2VUeXBlSWROYW1lCQkJKCJSYWxpbmtfSUQiKQorI2VuZGlmCisKKworI2RlZmluZSBSQUxJTktfMjg4M19WRVJTSU9OCQkoKFVJTlQzMikweDI4ODMwMzAwKQorI2RlZmluZSBSQUxJTktfMjg4MEVfVkVSU0lPTgkoKFVJTlQzMikweDI4NzIwMjAwKQorI2RlZmluZSBSQUxJTktfMzA3MF9WRVJTSU9OCQkoKFVJTlQzMikweDMwNzAwMjAwKQorCisvLworLy8gTkRJUyB2ZXJzaW9uIGluIHVzZSBieSB0aGUgTklDIGRyaXZlci4KKy8vIFRoZSBoaWdoIGJ5dGUgaXMgdGhlIG1ham9yIHZlcnNpb24uIFRoZSBsb3cgYnl0ZSBpcyB0aGUgbWlub3IgdmVyc2lvbi4KKy8vCisjaWZkZWYgIE5ESVM1MV9NSU5JUE9SVAorI2RlZmluZSBOSUNfRFJJVkVSX1ZFUlNJT04gICAgICAweDA1MDEKKyNlbHNlCisjZGVmaW5lIE5JQ19EUklWRVJfVkVSU0lPTiAgICAgIDB4MDUwMAorI2VuZGlmCisKKy8vCisvLyBORElTIG1lZGlhIHR5cGUsIGN1cnJlbnQgaXMgZXRoZXJuZXQsIGNoYW5nZSBpZiBuYXRpdmUgd2lyZWxlc3Mgc3VwcG9ydGVkCisvLworI2RlZmluZSBOSUNfTUVESUFfVFlQRSAgICAgICAgICBOZGlzTWVkaXVtODAyXzMKKyNkZWZpbmUgTklDX1BDSV9IRFJfTEVOR1RIICAgICAgMHhlMgorI2RlZmluZSBOSUNfTUFYX1BBQ0tFVF9TSVpFICAgICAyMzA0CisjZGVmaW5lIE5JQ19IRUFERVJfU0laRSAgICAgICAgIDE0CisjZGVmaW5lIE1BWF9NQVBfUkVHSVNURVJTX05FRURFRCAzMgorI2RlZmluZSBNSU5fTUFQX1JFR0lTVEVSU19ORUVERUQgMiAgIC8vVG9kbzogc2hvdWxkIGNvbnNpZGVyIGZyYWdtZW50IGlzc3VlLgorCisvLworLy8gaW50ZXJmYWNlIHR5cGUsIHdlIHVzZSBQQ0kKKy8vCisjZGVmaW5lIE5JQ19JTlRFUkZBQ0VfVFlQRSAgICAgIE5kaXNJbnRlcmZhY2VQY2kKKyNkZWZpbmUgTklDX0lOVEVSUlVQVF9NT0RFICAgICAgTmRpc0ludGVycnVwdExldmVsU2Vuc2l0aXZlCisKKy8vCisvLyBidWZmZXIgc2l6ZSBwYXNzZWQgaW4gTmRpc01RdWVyeUFkYXB0ZXJSZXNvdXJjZXMKKy8vIFdlIHNob3VsZCBvbmx5IG5lZWQgdGhyZWUgYWRhcHRlciByZXNvdXJjZXMgKElPLCBpbnRlcnJ1cHQgYW5kIG1lbW9yeSksCisvLyBTb21lIGRldmljZXMgZ2V0IGV4dHJhIHJlc291cmNlcywgc28gaGF2ZSByb29tIGZvciAxMCByZXNvdXJjZXMKKy8vICAgICAgICAgICAgICAgICAgICBVRl9TSVpFICAgKHNpemVvZihORElTX1JFU09VUkNFX0xJU1QpICsgKDEwKnNpemVvZihDTV9QQVJUSUFMX1JFU09VUkNFX0RFU0NSSVBUT1IpKSkKKworCisjZGVmaW5lIE5JQ19SRVNPVVJDRV9CLy8KKy8vIElPIHNwYWNlIGxlbmd0aAorLy8KKyNkZWZpbmUgTklDX01BUF9JT1NQQUNFX0xFTkdUSCAgc2l6ZW9mKENTUl9TVFJVQykKKworI2RlZmluZSBNQVhfUlhfUEtUX0xFTgkxNTIwCisKKy8vCisvLyBFbnRyeSBudW1iZXIgZm9yIGVhY2ggRE1BIGRlc2NyaXB0b3IgcmluZworLy8KKworI2lmZGVmIFJUMjg2MAorI2RlZmluZSBUWF9SSU5HX1NJWkUgICAgICAgICAgICA2NCAvLzY0CisjZGVmaW5lIE1HTVRfUklOR19TSVpFICAgICAgICAgIDEyOAorI2RlZmluZSBSWF9SSU5HX1NJWkUgICAgICAgICAgICAxMjggLy82NAorI2RlZmluZSBNQVhfVFhfUFJPQ0VTUyAgICAgICAgICBUWF9SSU5HX1NJWkUgLy84CisjZGVmaW5lIE1BWF9ETUFfRE9ORV9QUk9DRVNTICAgIFRYX1JJTkdfU0laRQorI2RlZmluZSBNQVhfVFhfRE9ORV9QUk9DRVNTICAgICBUWF9SSU5HX1NJWkUgLy84CisjZGVmaW5lIExPQ0FMX1RYQlVGX1NJWkUgICAgICAgIDIKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisvLyBNQzogTXVsdHBsZSBDYXJkcworI2RlZmluZSBNQVhfTlVNX09GX01VTFRJUExFX0NBUkQJCTMyCisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisKKyNkZWZpbmUgTUFYX1JYX1BST0NFU1MgICAgICAgICAgMTI4IC8vNjQgLy8zMgorI2RlZmluZSBOVU1fT0ZfTE9DQUxfVFhCVUYgICAgICAyCisjZGVmaW5lIFRYRF9TSVpFICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFRYV0lfU0laRSAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFJYRF9TSVpFICAgICAgICAgICAgICAgCTE2CisjZGVmaW5lIFJYV0lfU0laRSAgICAgICAgICAgICAJMTYKKy8vIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgODAyLjExIEhlYWRlciBTaXplICsgQU1TRFUgc3ViIGZyYW1lIGhlYWRlcgorI2RlZmluZSBUWF9ETUFfMVNUX0JVRkZFUl9TSVpFICA5NiAgICAvLyBvbmx5IHRoZSAxc3QgcGh5c2ljYWwgYnVmZmVyIGlzIHByZS1hbGxvY2F0ZWQKKyNkZWZpbmUgTUdNVF9ETUFfQlVGRkVSX1NJWkUgICAgMTUzNiAvLzIwNDgKKyNkZWZpbmUgUlhfQlVGRkVSX0FHR1JFU0laRSAgICAgMzg0MCAvLzM5MDQgLy8zOTY4IC8vNDA5NiAvLzIwNDggLy80MDk2CisjZGVmaW5lIFJYX0JVRkZFUl9OT1JNU0laRSAgICAgIDM4NDAgLy8zOTA0IC8vMzk2OCAvLzQwOTYgLy8yMDQ4IC8vNDA5NgorI2RlZmluZSBUWF9CVUZGRVJfTk9STVNJWkUJCVJYX0JVRkZFUl9OT1JNU0laRQorI2RlZmluZSBNQVhfRlJBTUVfU0laRSAgICAgICAgICAyMzQ2ICAgICAgICAgICAgICAgICAgICAvLyBNYXhpbXVtIDgwMi4xMSBmcmFtZSBzaXplCisjZGVmaW5lIE1BWF9BR0dSRUdBVElPTl9TSVpFICAgIDM4NDAgLy8zOTA0IC8vMzk2OCAvLzQwOTYKKyNkZWZpbmUgTUFYX05VTV9PRl9UVVBMRV9DQUNIRSAgMgorI2RlZmluZSBNQVhfTUNBU1RfTElTVF9TSVpFICAgICAzMgorI2RlZmluZSBNQVhfTEVOX09GX1ZFTkRPUl9ERVNDICA2NAorLy8jZGVmaW5lIE1BWF9TSVpFX09GX01DQVNUX1BTUSAgIChOVU1fT0ZfTE9DQUxfVFhCVUYgPj4gMikgLy8gQVAgd29uJ3Qgc3BlbmQgbW9yZSB0aGFuIDEvNCBvZiB0b3RhbCBidWZmZXJzIG9uIE0vQkNBU1QgUFNRCisjZGVmaW5lIE1BWF9TSVpFX09GX01DQVNUX1BTUSAgICAgICAgICAgICAgIDMyCisKKyNkZWZpbmUgTUFYX1JYX1BST0NFU1NfQ05UCShSWF9SSU5HX1NJWkUpCisKKworI2RlZmluZSBNQVhfUEFDS0VUU19JTl9RVUVVRQkJCQkoNTEyKSAvLyg1MTIpICAgIC8vIHRvIHBhc3MgV01NIEE1LVdQQVBTSworI2RlZmluZSBNQVhfUEFDS0VUU19JTl9NQ0FTVF9QU19RVUVVRQkJMzIKKyNkZWZpbmUgTUFYX1BBQ0tFVFNfSU5fUFNfUVVFVUUJCQkJMTI4CS8vMzIKKyNkZWZpbmUgV01NX05VTV9PRl9BQyAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogQUMwLCBBQzEsIEFDMiwgYW5kIEFDMyAqLworCisKKworLy8gUnhGaWx0ZXIKKyNkZWZpbmUgU1RBTk9STUFMCSAweDE3Zjk3CisjZGVmaW5lIEFQTk9STUFMCSAweDE1Zjk3CisvLworLy8gIFJUTVBfQURBUFRFUiBmbGFncworLy8KKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9NQVBfUkVHSVNURVIgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfSEFSRFdBUkVfRVJST1IgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9TQ0FUVEVSX0dBVEhFUiAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBmUlRNUF9BREFQVEVSX1NFTkRfUEFDS0VUX0VSUk9SICAgICAweDAwMDAwMDEwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfTUxNRV9SRVNFVF9JTl9QUk9HUkVTUyAweDAwMDAwMDIwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfVFhfUklOR19BTExPQ0FURUQgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9SRU1PVkVfSU5fUFJPR1JFU1MgICAgMHgwMDAwMDQwMAorI2RlZmluZSBmUlRNUF9BREFQVEVSX01JTU9SQVRFX0lOVVNFRCAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfUlhfUklOR19BTExPQ0FURUQgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfQUNUSVZFICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTICAweDAwMDA0MDAwCisjZGVmaW5lCWZSVE1QX0FEQVBURVJfUkVBU1NPQ19JTl9QUk9HUkVTUwkweDAwMDA4MDAwCisjZGVmaW5lCWZSVE1QX0FEQVBURVJfTUVESUFfU1RBVEVfUEVORElORwkweDAwMDEwMDAwCisjZGVmaW5lCWZSVE1QX0FEQVBURVJfUkFESU9fT0ZGCQkJCTB4MDAwMjAwMDAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUCQkJMHgwMDA0MDAwMAorI2RlZmluZQlmUlRNUF9BREFQVEVSX0JVTEtJTl9SRVNFVAkJCTB4MDAwODAwMDAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9SREdfQUNUSVZFCQkJMHgwMDEwMDAwMAorI2RlZmluZSBmUlRNUF9BREFQVEVSX0RZTkFNSUNfQkVfVFhPUF9BQ1RJVkUgMHgwMDIwMDAwMAorI2RlZmluZSBmUlRNUF9BREFQVEVSX1NDQU5fMjA0MCAJCQkweDA0MDAwMDAwCisjZGVmaW5lCWZSVE1QX0FEQVBURVJfUkFESU9fTUVBU1VSRU1FTlQJCTB4MDgwMDAwMDAKKworI2RlZmluZSBmUlRNUF9BREFQVEVSX1NUQVJUX1VQICAgICAgICAgCQkweDEwMDAwMDAwCS8vRGV2aXZlIGFscmVhZHkgaW5pdGlhbGl6ZWQgYW5kIGVuYWJsZWQgVHgvUnguCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfTUVESUFfU1RBVEVfQ0hBTkdFICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRiAgICAgICAgMHg0MDAwMDAwMAorCisvLworLy8gIFNUQSBvcGVyYXRpb24gc3RhdHVzIGZsYWdzCisvLworI2RlZmluZSBmT1BfU1RBVFVTX0lORlJBX09OICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIGZPUF9TVEFUVVNfQURIT0NfT04gICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgZk9QX1NUQVRVU19CR19QUk9URUNUSU9OX0lOVVNFRCAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBmT1BfU1RBVFVTX1NIT1JUX1NMT1RfSU5VU0VEICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0gICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCAgICAweDAwMDAwMDgwCisjZGVmaW5lIGZPUF9TVEFUVVNfV01NX0lOVVNFRCAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBmT1BfU1RBVFVTX0RPWkUgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwICAvLyBkZWJ1ZyBwdXJwb3NlCisjZGVmaW5lIGZPUF9TVEFUVVNfUElHR1lCQUNLX0lOVVNFRCAgICAgICAgIDB4MDAwMDA4MDAgIC8vIHBpZ2d5LWJhY2ssIGFuZCBhZ2dyZWdhdGlvbgorI2RlZmluZSBmT1BfU1RBVFVTX0FQU0RfSU5VU0VECQkJCTB4MDAwMDEwMDAKKyNkZWZpbmUgZk9QX1NUQVRVU19UWF9BTVNEVV9JTlVTRUQJCQkweDAwMDAyMDAwCisjZGVmaW5lIGZPUF9TVEFUVVNfTUFYX1JFVFJZX0VOQUJMRUQJCTB4MDAwMDQwMDAKKyNkZWZpbmUgZk9QX1NUQVRVU19XQUtFVVBfTk9XICAgICAgICAgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSAgICAgICAweDAwMDIwMDAwCisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisjZGVmaW5lIGZPUF9TVEFUVVNfU0NBTl8yMDQwICAgICAgICAgICAgICAgCSAgICAweDAwMDQwMDAwCisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCisjZGVmaW5lIENDS1NFVFBST1RFQ1QJCTB4MQorI2RlZmluZSBPRkRNU0VUUFJPVEVDVAkJMHgyCisjZGVmaW5lIE1NMjBTRVRQUk9URUNUCQkweDQKKyNkZWZpbmUgTU00MFNFVFBST1RFQ1QJCTB4OAorI2RlZmluZSBHRjIwU0VUUFJPVEVDVAkJMHgxMAorI2RlZmluZSBHUjQwU0VUUFJPVEVDVAkJMHgyMAorI2RlZmluZSBBTExOX1NFVFBST1RFQ1QJCShHUjQwU0VUUFJPVEVDVCB8IEdGMjBTRVRQUk9URUNUIHwgTU00MFNFVFBST1RFQ1QgfCBNTTIwU0VUUFJPVEVDVCkKKworLy8KKy8vICBBUCdzIGNsaWVudCB0YWJsZSBvcGVyYXRpb24gc3RhdHVzIGZsYWdzCisvLworI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSAgICAgICAgICAweDAwMDAwMDAxICAvLyBDTElFTlQgY2FuIHBhcnNlIFFPUyBEQVRBIGZyYW1lCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX0FHR1JFR0FUSU9OX0NBUEFCTEUgIDB4MDAwMDAwMDIgIC8vIENMSUVOVCBjYW4gcmVjZWl2ZSBSYWxpbmsncyBwcm9wcmlldGFyeSBUWCBhZ2dyZWdhdGlvbiBmcmFtZQorI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19QSUdHWUJBQ0tfQ0FQQUJMRSAgICAweDAwMDAwMDA0ICAvLyBDTElFTlQgc3VwcG9ydCBwaWdneS1iYWNrCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX0FNU0RVX0lOVVNFRAkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfU0dJMjBfQ0FQQUJMRQkJMHgwMDAwMDAxMAorI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19TR0k0MF9DQVBBQkxFCQkweDAwMDAwMDIwCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX1R4U1RCQ19DQVBBQkxFCQkweDAwMDAwMDQwCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX1J4U1RCQ19DQVBBQkxFCQkweDAwMDAwMDgwCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX0hUQ19DQVBBQkxFCQkJMHgwMDAwMDEwMAorI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRQkJCTB4MDAwMDAyMDAKKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfTUNTRkVFREJBQ0tfQ0FQQUJMRSAgMHgwMDAwMDQwMAorI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19BUFNEX0NBUEFCTEUgICAgICAgICAweDAwMDAwODAwICAvKiBVQVBTRCBTVEFUSU9OICovCisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX0JTU0NPRVhJU1RfQ0FQQUJMRQkweDAwMDAxMDAwCisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX1JBTElOS19DSElQU0VUCQkweDAwMTAwMDAwCisvLworLy8gIFNUQSBjb25maWd1cmF0aW9uIGZsYWdzCisvLworCisvLyA4MDIuMTFuIE9wZXJhdGluZyBNb2RlIERlZmluaXRpb24uIDAtMyBhbHNvIHVzZWQgaW4gQVNJQ1VQZGF0ZVByb3RlY3Qgc3dpdGNoIGNhc2UKKyNkZWZpbmUgSFRfTk9fUFJPVEVDVAkwCisjZGVmaW5lIEhUX0xFR0FDWV9QUk9URUNUCTEKKyNkZWZpbmUgSFRfNDBfUFJPVEVDVAkyCisjZGVmaW5lIEhUXzIwNDBfUFJPVEVDVAkzCisjZGVmaW5lIEhUX1JUU0NUU182TQk3CisvL2ZvbGxvd2luZyBpcyBvdXIgb3duIGRlZmluaXRpb24gaW4gb3JkZXIgdG8gdHVybiBvbiBvdXIgQVNJQyBwcm90ZWN0aW9uIHJlZ2lzdGVyIGluIElORlJBU1RSVUNUVVJFLgorI2RlZmluZSBIVF9BVEhFUk9TCTgJLy8gcnQyODYwYyBoYXMgcHJvYmxlbSB3aXRoIGF0aGVyb3MgY2hpcC4gd2UgbmVlZCB0byB0dXJuIG9uIFJUUy9DVFMgLgorI2RlZmluZSBIVF9GT1JDRVJUU0NUUwk5CS8vIEZvcmNlIHR1cm4gb24gUlRTL0NUUyBmaXJzdC4gdGhlbiBnbyB0byBldmFsdWF0ZSBpZiB0aGlzIGZvcmNlIFJUUyBpcyBuZWNlc3NhcnkuCisKKy8vCisvLyBSWCBQYWNrZXQgRmlsdGVyIGNvbnRyb2wgZmxhZ3MuIEFwcGx5IG9uIHBBZC0+UGFja2V0RmlsdGVyCisvLworI2RlZmluZSBmUlhfRklMVEVSX0FDQ0VQVF9ESVJFQ1QgICAgICAgICAgICBORElTX1BBQ0tFVF9UWVBFX0RJUkVDVEVECisjZGVmaW5lIGZSWF9GSUxURVJfQUNDRVBUX01VTFRJQ0FTVCAgICAgICAgIE5ESVNfUEFDS0VUX1RZUEVfTVVMVElDQVNUCisjZGVmaW5lIGZSWF9GSUxURVJfQUNDRVBUX0JST0FEQ0FTVCAgICAgICAgIE5ESVNfUEFDS0VUX1RZUEVfQlJPQURDQVNUCisjZGVmaW5lIGZSWF9GSUxURVJfQUNDRVBUX0FMTF9NVUxUSUNBU1QgICAgIE5ESVNfUEFDS0VUX1RZUEVfQUxMX01VTFRJQ0FTVAorCisvLworLy8gRXJyb3IgY29kZSBzZWN0aW9uCisvLworLy8gTkRJU19FUlJPUl9DT0RFX0FEQVBURVJfTk9UX0ZPVU5ECisjZGVmaW5lIEVSUkxPR19SRUFEX1BDSV9TTE9UX0ZBSUxFRCAgICAgMHgwMDAwMDEwMUwKKyNkZWZpbmUgRVJSTE9HX1dSSVRFX1BDSV9TTE9UX0ZBSUxFRCAgICAweDAwMDAwMTAyTAorI2RlZmluZSBFUlJMT0dfVkVORE9SX0RFVklDRV9OT01BVENIICAgIDB4MDAwMDAxMDNMCisKKy8vIE5ESVNfRVJST1JfQ09ERV9BREFQVEVSX0RJU0FCTEVECisjZGVmaW5lIEVSUkxPR19CVVNfTUFTVEVSX0RJU0FCTEVEICAgICAgMHgwMDAwMDIwMUwKKworLy8gTkRJU19FUlJPUl9DT0RFX1VOU1VQUE9SVEVEX0NPTkZJR1VSQVRJT04KKyNkZWZpbmUgRVJSTE9HX0lOVkFMSURfU1BFRURfRFVQTEVYICAgICAweDAwMDAwMzAxTAorI2RlZmluZSBFUlJMT0dfU0VUX1NFQ09OREFSWV9GQUlMRUQgICAgIDB4MDAwMDAzMDJMCisKKy8vIE5ESVNfRVJST1JfQ09ERV9PVVRfT0ZfUkVTT1VSQ0VTCisjZGVmaW5lIEVSUkxPR19PVVRfT0ZfTUVNT1JZICAgICAgICAgICAgMHgwMDAwMDQwMUwKKyNkZWZpbmUgRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZICAgICAweDAwMDAwNDAyTAorI2RlZmluZSBFUlJMT0dfT1VUX09GX01BUF9SRUdJU1RFUlMgICAgIDB4MDAwMDA0MDNMCisjZGVmaW5lIEVSUkxPR19PVVRfT0ZfQlVGRkVSX1BPT0wgICAgICAgMHgwMDAwMDQwNEwKKyNkZWZpbmUgRVJSTE9HX09VVF9PRl9ORElTX0JVRkZFUiAgICAgICAweDAwMDAwNDA1TAorI2RlZmluZSBFUlJMT0dfT1VUX09GX1BBQ0tFVF9QT09MICAgICAgIDB4MDAwMDA0MDZMCisjZGVmaW5lIEVSUkxPR19PVVRfT0ZfTkRJU19QQUNLRVQgICAgICAgMHgwMDAwMDQwN0wKKyNkZWZpbmUgRVJSTE9HX09VVF9PRl9MT09LQVNJREVfTUVNT1JZICAweDAwMDAwNDA4TAorCisvLyBORElTX0VSUk9SX0NPREVfSEFSRFdBUkVfRkFJTFVSRQorI2RlZmluZSBFUlJMT0dfU0VMRlRFU1RfRkFJTEVEICAgICAgICAgIDB4MDAwMDA1MDFMCisjZGVmaW5lIEVSUkxPR19JTklUSUFMSVpFX0FEQVBURVIgICAgICAgMHgwMDAwMDUwMkwKKyNkZWZpbmUgRVJSTE9HX1JFTU9WRV9NSU5JUE9SVCAgICAgICAgICAweDAwMDAwNTAzTAorCisvLyBORElTX0VSUk9SX0NPREVfUkVTT1VSQ0VfQ09ORkxJQ1QKKyNkZWZpbmUgRVJSTE9HX01BUF9JT19TUEFDRSAgICAgICAgICAgICAweDAwMDAwNjAxTAorI2RlZmluZSBFUlJMT0dfUVVFUllfQURBUFRFUl9SRVNPVVJDRVMgIDB4MDAwMDA2MDJMCisjZGVmaW5lIEVSUkxPR19OT19JT19SRVNPVVJDRSAgICAgICAgICAgMHgwMDAwMDYwM0wKKyNkZWZpbmUgRVJSTE9HX05PX0lOVEVSUlVQVF9SRVNPVVJDRSAgICAweDAwMDAwNjA0TAorI2RlZmluZSBFUlJMT0dfTk9fTUVNT1JZX1JFU09VUkNFICAgICAgIDB4MDAwMDA2MDVMCisKKworLy8gV0RTIGRlZmluaXRpb24KKyNkZWZpbmUJTUFYX1dEU19FTlRSWSAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgV0RTX1BBSVJXSVNFX0tFWV9PRkZTRVQgICAgIDYwICAgIC8vIFdEUyBsaW5rcyB1c2VzIHBhaXJ3aXNlIGtleSM2MCB+IDYzIGluIEFTSUMgcGFpcndpc2Uga2V5IHRhYmxlCisKKyNkZWZpbmUJV0RTX0RJU0FCTEVfTU9ERSAgICAgICAgICAgIDAKKyNkZWZpbmUJV0RTX1JFU1RSSUNUX01PREUgICAgICAgICAgIDEKKyNkZWZpbmUJV0RTX0JSSURHRV9NT0RFICAgICAgICAgICAgIDIKKyNkZWZpbmUJV0RTX1JFUEVBVEVSX01PREUgICAgICAgICAgIDMKKyNkZWZpbmUJV0RTX0xBWllfTU9ERSAgICAgICAgICAgICAgIDQKKworCisjZGVmaW5lIE1BWF9NRVNIX05VTQkJCQkwCisKKyNkZWZpbmUgTUFYX0FQQ0xJX05VTQkJCQkwCisjaWZkZWYgQVBDTElfU1VQUE9SVAorI3VuZGVmCU1BWF9BUENMSV9OVU0KKyNkZWZpbmUgTUFYX0FQQ0xJX05VTQkJCQkxCisjZW5kaWYgLy8gQVBDTElfU1VQUE9SVCAvLworCisjZGVmaW5lIE1BWF9NQlNTSURfTlVNCQkJCTEKKyNpZmRlZiBNQlNTX1NVUFBPUlQKKyN1bmRlZglNQVhfTUJTU0lEX05VTQorI2RlZmluZSBNQVhfTUJTU0lEX05VTQkJCQkoOCAtIE1BWF9NRVNIX05VTSAtIE1BWF9BUENMSV9OVU0pCisjZW5kaWYgLy8gTUJTU19TVVBQT1JUIC8vCisKKy8qIHNhbml0eSBjaGVjayBmb3IgYXBpZHggKi8KKyNkZWZpbmUgTUJTU19NUl9BUElEWF9TQU5JVFlfQ0hFQ0soYXBpZHgpIFwKKyAgICB7IGlmIChhcGlkeCA+IE1BWF9NQlNTSURfTlVNKSB7IFwKKyAgICAgICAgICBwcmludGsoIiVzPiBFcnJvciEgYXBpZHggPSAlZCA+IE1BWF9NQlNTSURfTlVNIVxuIiwgX19mdW5jX18sIGFwaWR4KTsgXAorCSAgYXBpZHggPSBNQUlOX01CU1NJRDsgfSB9CisKKyNkZWZpbmUgVkFMSURfV0NJRChfd2NpZCkJKChfd2NpZCkgPiAwICYmIChfd2NpZCkgPCBNQVhfTEVOX09GX01BQ19UQUJMRSApCisKKyNkZWZpbmUgTUFJTl9NQlNTSUQgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgRklSU1RfTUJTU0lEICAgICAgICAgICAgICAgIDEKKworCisjZGVmaW5lIE1BWF9CRUFDT05fU0laRQkJCQk1MTIKKy8vIElmIHRoZSBNQVhfTUJTU0lEX05VTSBpcyBsYXJnZXIgdGhhbiA2LAorLy8gaXQgc2hhbGwgcmVzZXJ2ZSBzb21lIFdDSUQgc3BhY2Uod2NpZCAyMjJ+MjUzKSBmb3IgYmVhY29uIGZyYW1lcy4KKy8vIC0JdGhlc2Ugd2NpZCAyMzh+MjUzIGFyZSByZXNlcnZlZCBmb3IgYmVhY29uIzYocmE2KS4KKy8vIC0JdGhlc2Ugd2NpZCAyMjJ+MjM3IGFyZSByZXNlcnZlZCBmb3IgYmVhY29uIzcocmE3KS4KKyNpZiBkZWZpbmVkKE1BWF9NQlNTSURfTlVNKSAmJiAoTUFYX01CU1NJRF9OVU0gPT0gOCkKKyNkZWZpbmUgSFdfUkVTRVJWRURfV0NJRAkyMjIKKyNlbGlmIGRlZmluZWQoTUFYX01CU1NJRF9OVU0pICYmIChNQVhfTUJTU0lEX05VTSA9PSA3KQorI2RlZmluZSBIV19SRVNFUlZFRF9XQ0lECTIzOAorI2Vsc2UKKyNkZWZpbmUgSFdfUkVTRVJWRURfV0NJRAkyNTUKKyNlbmRpZgorCisvLyBUaGVuIGRlZGljYXRlIHdjaWQgb2YgREZTIGFuZCBDYXJyaWVyLVNlbnNlLgorI2RlZmluZSBERlNfQ1RTX1dDSUQgCQkoSFdfUkVTRVJWRURfV0NJRCAtIDEpCisjZGVmaW5lIENTX0NUU19XQ0lEIAkJKEhXX1JFU0VSVkVEX1dDSUQgLSAyKQorI2RlZmluZSBMQVNUX1NQRUNJRklDX1dDSUQJKEhXX1JFU0VSVkVEX1dDSUQgLSAyKQorCisvLyBJZiBNQVhfTUJTU0lEX05VTSBpcyA4LCB0aGUgbWF4aW11bSBhdmFpbGFibGUgd2NpZCBmb3IgdGhlIGFzc29jaWF0ZWQgU1RBIGlzIDIxMS4KKy8vIElmIE1BWF9NQlNTSURfTlVNIGlzIDcsIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSB3Y2lkIGZvciB0aGUgYXNzb2NpYXRlZCBTVEEgaXMgMjI4LgorI2RlZmluZSBNQVhfQVZBSUxBQkxFX0NMSUVOVF9XQ0lECShMQVNUX1NQRUNJRklDX1dDSUQgLSBNQVhfTUJTU0lEX05VTSAtIDEpCisKKy8vIFRYIG5lZWQgV0NJRCB0byBmaW5kIENpcGhlciBLZXkKKy8vIHRoZXNlIHdjaWQgMjEyIH4gMjE5IGFyZSByZXNlcnZlZCBmb3IgYmMvbWMgcGFja2V0cyBpZiBNQVhfTUJTU0lEX05VTSBpcyA4LgorI2RlZmluZSBHRVRfR3JvdXBLZXlfV0NJRChfX3djaWQsIF9fYnNzaWR4KSBcCisJewkJCQkJCQkJCQlcCisJCV9fd2NpZCA9IExBU1RfU1BFQ0lGSUNfV0NJRCAtIChNQVhfTUJTU0lEX05VTSkgKyBfX2Jzc2lkeDsJXAorCX0KKworI2RlZmluZSBJc0dyb3VwS2V5V0NJRChfX3djaWQpICgoKF9fd2NpZCkgPCBMQVNUX1NQRUNJRklDX1dDSUQpICYmICgoX193Y2lkKSA+PSAoTEFTVF9TUEVDSUZJQ19XQ0lEIC0gKE1BWF9NQlNTSURfTlVNKSkpKQorCisKKy8vIGRlZmluaXRpb24gdG8gc3VwcG9ydCBtdWx0aXBsZSBCU1NJRAorI2RlZmluZSBCU1MwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQlNTMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEJTUzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBCU1MzICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQlNTNCAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIEJTUzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBCU1M2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgQlNTNyAgICAgICAgICAgICAgICAgICAgICAgICAgICA3CisKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIExlbmd0aCBkZWZpbml0aW9ucworI2RlZmluZSBQRUVSX0tFWV9OTyAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTUFDX0FERFJfTEVOICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFRJTUVTVEFNUF9MRU4gICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyAgICAgIE1BWF9MRU5HVEhfT0ZfU1VQUE9SVF9SQVRFUyAvLyAxLCAyLCA1LjUsIDExLCA2LCA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0CisjZGVmaW5lIE1BWF9MRU5fT0ZfS0VZICAgICAgICAgICAgICAgICAgMzIgICAgICAvLyAzMiBvY3RldHMgPT0gMjU2IGJpdHMsIFJlZGVmaW5lIGZvciBXUEEKKyNkZWZpbmUgTUFYX05VTV9PRl9DSEFOTkVMUyAgICAgICAgICAgICBNQVhfTlVNX09GX0NIUyAgICAgIC8vIDE0IGNoYW5uZWxzIEAyLjRHICsgIDEyQFVOSUkgKyA0IEBNTUFDICsgMTEgQEhpcGVyTEFOMiArIDcgQEphcGFuICsgMSBhcyBOVUxMIHRlcm1pbmF0aW9uCisjZGVmaW5lIE1BWF9OVU1fT0ZfMTFKQ0hBTk5FTFMgICAgICAgICAgICAgMjAgICAgICAvLyAxNCBjaGFubmVscyBAMi40RyArICAxMkBVTklJICsgNCBATU1BQyArIDExIEBIaXBlckxBTjIgKyA3IEBKYXBhbiArIDEgYXMgTlVMTCB0ZXJtaW5hdGlvbgorI2RlZmluZSBNQVhfTEVOX09GX1NTSUQgICAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIENJUEhFUl9URVhUX0xFTiAgICAgICAgICAgICAgICAgMTI4CisjZGVmaW5lIEhBU0hfVEFCTEVfU0laRSAgICAgICAgICAgICAgICAgMjU2CisjZGVmaW5lIE1BWF9WSUVfTEVOICAgICAgICAgICAgICAgICAgICAgMTAyNCAgIC8vIE5ldyBmb3IgV1BBIGNpcGhlciBzdWl0ZSB2YXJpYWJsZSBJRSBzaXplcy4KKyNkZWZpbmUgTUFYX1NVUFBPUlRfTUNTICAgICAgICAgICAgIDMyCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBBU0lDIFdDSUQgVGFibGUgZGVmaW5pdGlvbi4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIEJTU0lEX1dDSUQJCTEJLy8gaW4gaW5mcmEgbW9kZSwgYWx3YXlzIHB1dCBic3NpZCB3aXRoIHRoaXMgV0NJRAorI2RlZmluZSBNQ0FTVF9XQ0lECTB4MAorI2RlZmluZSBCU1MwTWNhc3RfV0NJRAkweDAKKyNkZWZpbmUgQlNTMU1jYXN0X1dDSUQJMHhmOAorI2RlZmluZSBCU1MyTWNhc3RfV0NJRAkweGY5CisjZGVmaW5lIEJTUzNNY2FzdF9XQ0lECTB4ZmEKKyNkZWZpbmUgQlNTNE1jYXN0X1dDSUQJMHhmYgorI2RlZmluZSBCU1M1TWNhc3RfV0NJRAkweGZjCisjZGVmaW5lIEJTUzZNY2FzdF9XQ0lECTB4ZmQKKyNkZWZpbmUgQlNTN01jYXN0X1dDSUQJMHhmZQorI2RlZmluZSBSRVNFUlZFRF9XQ0lECQkweGZmCisKKyNkZWZpbmUgTUFYX05VTV9PRl9BQ0xfTElTVAkJCQlNQVhfTlVNQkVSX09GX0FDTAorCisjZGVmaW5lIE1BWF9MRU5fT0ZfTUFDX1RBQkxFICAgICAgICAgICAgTUFYX05VTUJFUl9PRl9NQUMgLy8gaWYgTUFYX01CU1NJRF9OVU0gaXMgOCwgdGhpcyB2YWx1ZSBjYW4ndCBiZSBsYXJnZXIgdGhhbiAyMTEKKworI2lmIE1BWF9MRU5fT0ZfTUFDX1RBQkxFPk1BWF9BVkFJTEFCTEVfQ0xJRU5UX1dDSUQKKyNlcnJvciBNQVhfTEVOX09GX01BQ19UQUJMRSBjYW4gbm90IGJlIGxhcmdlciB0aGFuIE1BWF9BVkFJTEFCTEVfQ0xJRU5UX1dDSUQhISEhCisjZW5kaWYKKworI2RlZmluZSBNQVhfTlVNX09GX1dEU19MSU5LX1BFUkJTU0lECSAgICAgICAgICAgIDMKKyNkZWZpbmUgTUFYX05VTV9PRl9XRFNfTElOSwkgICAgICAgICAgICAoTUFYX05VTV9PRl9XRFNfTElOS19QRVJCU1NJRCpNQVhfTUJTU0lEX05VTSkKKyNkZWZpbmUgTUFYX05VTV9PRl9FVkVOVCAgICAgICAgICAgICAgICBNQVhfTlVNQkVSX09GX0VWRU5UCisjZGVmaW5lIFdEU19MSU5LX1NUQVJUX1dDSUQJCQkJKE1BWF9MRU5fT0ZfTUFDX1RBQkxFLTEpCisKKyNkZWZpbmUgTlVNX09GX1RJRAkJCTgKKyNkZWZpbmUgTUFYX0FJRF9CQSAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBNQVhfTEVOX09GX0JBX1JFQ19UQUJMRSAgICAgICAgICAoKE5VTV9PRl9USUQgKiBNQVhfTEVOX09GX01BQ19UQUJMRSkvMikvLyAgIChOVU1fT0ZfVElEKk1BWF9BSURfQkEgKyAzMikJIC8vQmxvY2sgQUNLIHJlY2lwaWVudAorI2RlZmluZSBNQVhfTEVOX09GX0JBX09SSV9UQUJMRSAgICAgICAgICAoKE5VTV9PRl9USUQgKiBNQVhfTEVOX09GX01BQ19UQUJMRSkvMikvLyAgIChOVU1fT0ZfVElEKk1BWF9BSURfQkEgKyAzMikgICAvLyBCbG9jayBBQ0sgb3JpZ2luYXRvcgorI2RlZmluZSBNQVhfTEVOX09GX0JTU19UQUJMRSAgICAgICAgICAgICA2NAorI2RlZmluZSBNQVhfUkVPUkRFUklOR19NUERVX05VTQkJCSA1MTIKKworLy8ga2V5IHJlbGF0ZWQgZGVmaW5pdGlvbnMKKyNkZWZpbmUgU0hBUkVfS0VZX05VTSAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIE1BWF9MRU5fT0ZfU0hBUkVfS0VZICAgICAgICAgICAgMTYgICAgLy8gYnl0ZSBjb3VudAorI2RlZmluZSBNQVhfTEVOX09GX1BFRVJfS0VZICAgICAgICAgICAgIDE2ICAgIC8vIGJ5dGUgY291bnQKKyNkZWZpbmUgUEFJUldJU0VfS0VZX05VTSAgICAgICAgICAgICAgICA2NCAgICAvLyBpbiBNQUMgQVNJQyBwYWlyd2lzZSBrZXkgdGFibGUKKyNkZWZpbmUgR1JPVVBfS0VZX05VTSAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFBNS19MRU4gICAgICAgICAgICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgV0RTX1BBSVJXSVNFX0tFWV9PRkZTRVQgICAgICAgICA2MCAgICAvLyBXRFMgbGlua3MgdXNlcyBwYWlyd2lzZSBrZXkjNjAgfiA2MyBpbiBBU0lDIHBhaXJ3aXNlIGtleSB0YWJsZQorI2RlZmluZQlQTUtJRF9OTyAgICAgICAgICAgICAgICAgICAgICAgIDQgICAgIC8vIE51bWJlciBvZiBQTUtJRCBzYXZlZCBzdXBwb3J0ZWQKKyNkZWZpbmUgTUFYX0xFTl9PRl9NTE1FX0JVRkZFUiAgICAgICAgICAyMDQ4CisKKy8vIHBvd2VyIHN0YXR1cyByZWxhdGVkIGRlZmluaXRpb25zCisjZGVmaW5lIFBXUl9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQV1JfU0FWRSAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUFdSX01NUFMgICAgICAgICAgICAgICAgICAgICAgICAyCQkJLy9NSU1PIHBvd2VyIHNhdmUKKworLy8gQXV0aCBhbmQgQXNzb2MgbW9kZSByZWxhdGVkIGRlZmluaXRpb25zCisjZGVmaW5lIEFVVEhfTU9ERV9PUEVOICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBBVVRIX01PREVfS0VZICAgICAgICAgICAgICAgICAgIDB4MDEKKworLy8gQlNTIFR5cGUgZGVmaW5pdGlvbnMKKyNkZWZpbmUgQlNTX0FESE9DICAgICAgICAgICAgICAgICAgICAgICAwICAvLyA9IE5kaXM4MDJfMTFJQlNTCisjZGVmaW5lIEJTU19JTkZSQSAgICAgICAgICAgICAgICAgICAgICAgMSAgLy8gPSBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmUKKyNkZWZpbmUgQlNTX0FOWSAgICAgICAgICAgICAgICAgICAgICAgICAyICAvLyA9IE5kaXM4MDJfMTFBdXRvVW5rbm93bgorI2RlZmluZSBCU1NfTU9OSVRPUgkJCSAgICAgICAgICAgIDMgIC8vID0gTmRpczgwMl8xMU1vbml0b3IKKworCisvLyBSZWFzb24gY29kZSBkZWZpbml0aW9ucworI2RlZmluZSBSRUFTT05fUkVTRVJWRUQgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUkVBU09OX1VOU1BFQ0lGWSAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFJFQVNPTl9OT19MT05HRVJfVkFMSUQgICAgICAgICAgMgorI2RlZmluZSBSRUFTT05fREVBVVRIX1NUQV9MRUFWSU5HICAgICAgIDMKKyNkZWZpbmUgUkVBU09OX0RJU0FTU09DX0lOQUNUSVZFICAgICAgICA0CisjZGVmaW5lIFJFQVNPTl9ESVNBU1NQQ19BUF9VTkFCTEUgICAgICAgNQorI2RlZmluZSBSRUFTT05fQ0xTMkVSUiAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgUkVBU09OX0NMUzNFUlIgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORyAgICAgOAorI2RlZmluZSBSRUFTT05fU1RBX1JFUV9BU1NPQ19OT1RfQVVUSCAgIDkKKyNkZWZpbmUgUkVBU09OX0lOVkFMSURfSUUgICAgICAgICAgICAgICAxMworI2RlZmluZSBSRUFTT05fTUlDX0ZBSUxVUkUgICAgICAgICAgICAgIDE0CisjZGVmaW5lIFJFQVNPTl80X1dBWV9USU1FT1VUICAgICAgICAgICAgMTUKKyNkZWZpbmUgUkVBU09OX0dST1VQX0tFWV9IU19USU1FT1VUICAgICAxNgorI2RlZmluZSBSRUFTT05fSUVfRElGRkVSRU5UICAgICAgICAgICAgIDE3CisjZGVmaW5lIFJFQVNPTl9NQ0lQSEVSX05PVF9WQUxJRCAgICAgICAgMTgKKyNkZWZpbmUgUkVBU09OX1VDSVBIRVJfTk9UX1ZBTElEICAgICAgICAxOQorI2RlZmluZSBSRUFTT05fQUtNUF9OT1RfVkFMSUQgICAgICAgICAgIDIwCisjZGVmaW5lIFJFQVNPTl9VTlNVUFBPUlRfUlNORV9WRVIgICAgICAgMjEKKyNkZWZpbmUgUkVBU09OX0lOVkFMSURfUlNORV9DQVAgICAgICAgICAyMgorI2RlZmluZSBSRUFTT05fODAyMVhfQVVUSF9GQUlMICAgICAgICAgIDIzCisjZGVmaW5lIFJFQVNPTl9DSVBIRVJfU1VJVEVfUkVKRUNURUQgICAgMjQKKyNkZWZpbmUgUkVBU09OX0RFQ0xJTkVEICAgICAgICAgICAgICAgICAzNworCisjZGVmaW5lIFJFQVNPTl9RT1NfVU5TUEVDSUZZICAgICAgICAgICAgICAzMgorI2RlZmluZSBSRUFTT05fUU9TX0xBQ0tfQkFORFdJRFRIICAgICAgICAgMzMKKyNkZWZpbmUgUkVBU09OX1BPT1JfQ0hBTk5FTF9DT05ESVRJT04gICAgIDM0CisjZGVmaW5lIFJFQVNPTl9RT1NfT1VUU0lERV9UWE9QX0xJTUlUSU9OICAzNQorI2RlZmluZSBSRUFTT05fUU9TX1FTVEFfTEVBVklOR19RQlNTICAgICAgMzYKKyNkZWZpbmUgUkVBU09OX1FPU19VTldBTlRFRF9NRUNIQU5JU00gICAgIDM3CisjZGVmaW5lIFJFQVNPTl9RT1NfTUVDSF9TRVRVUF9SRVFVSVJFRCAgICAzOAorI2RlZmluZSBSRUFTT05fUU9TX1JFUVVFU1RfVElNRU9VVCAgICAgICAgMzkKKyNkZWZpbmUgUkVBU09OX1FPU19DSVBIRVJfTk9UX1NVUFBPUlQgICAgIDQ1CisKKy8vIFN0YXR1cyBjb2RlIGRlZmluaXRpb25zCisjZGVmaW5lIE1MTUVfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNTE1FX1VOU1BFQ0lGWV9GQUlMICAgICAgICAgICAgIDEKKyNkZWZpbmUgTUxNRV9DQU5OT1RfU1VQUE9SVF9DQVAgICAgICAgICAxMAorI2RlZmluZSBNTE1FX1JFQVNTT0NfREVOWV9BU1NPQ19FWElTVCAgIDExCisjZGVmaW5lIE1MTUVfQVNTT0NfREVOWV9PVVRfU0NPUEUgICAgICAgMTIKKyNkZWZpbmUgTUxNRV9BTEdfTk9UX1NVUFBPUlQgICAgICAgICAgICAxMworI2RlZmluZSBNTE1FX1NFUV9OUl9PVVRfT0ZfU0VRVUVOQ0UgICAgIDE0CisjZGVmaW5lIE1MTUVfUkVKX0NIQUxMRU5HRV9GQUlMVVJFICAgICAgMTUKKyNkZWZpbmUgTUxNRV9SRUpfVElNRU9VVCAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIE1MTUVfQVNTT0NfUkVKX1VOQUJMRV9IQU5ETEVfU1RBICAxNworI2RlZmluZSBNTE1FX0FTU09DX1JFSl9EQVRBX1JBVEUgICAgICAgICAgMTgKKworI2RlZmluZSBNTE1FX0FTU09DX1JFSl9OT19FWFRfUkFURSAgICAgICAgMjIKKyNkZWZpbmUgTUxNRV9BU1NPQ19SRUpfTk9fRVhUX1JBVEVfUEJDQyAgIDIzCisjZGVmaW5lIE1MTUVfQVNTT0NfUkVKX05PX0NDS19PRkRNICAgICAgICAyNAorCisjZGVmaW5lIE1MTUVfUU9TX1VOU1BFQ0lGWSAgICAgICAgICAgICAgICAzMgorI2RlZmluZSBNTE1FX1JFUVVFU1RfREVDTElORUQgICAgICAgICAgICAgMzcKKyNkZWZpbmUgTUxNRV9SRVFVRVNUX1dJVEhfSU5WQUxJRF9QQVJBTSAgIDM4CisjZGVmaW5lIE1MTUVfRExTX05PVF9BTExPV19JTl9RQlNTICAgICAgICA0OAorI2RlZmluZSBNTE1FX0RFU1RfU1RBX05PVF9JTl9RQlNTICAgICAgICAgNDkKKyNkZWZpbmUgTUxNRV9ERVNUX1NUQV9JU19OT1RfQV9RU1RBICAgICAgIDUwCisKKyNkZWZpbmUgTUxNRV9JTlZBTElEX0ZPUk1BVCAgICAgICAgICAgICAweDUxCisjZGVmaW5lIE1MTUVfRkFJTF9OT19SRVNPVVJDRSAgICAgICAgICAgMHg1MgorI2RlZmluZSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUICAgICAgIDB4NTMKKyNkZWZpbmUgTUxNRV9NQUNfVEFCTEVfRkFJTCAgICAgICAgICAgICAweDU0CisKKy8vIElFIGNvZGUKKyNkZWZpbmUgSUVfU1NJRCAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElFX1NVUFBfUkFURVMgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJRV9GSF9QQVJNICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgSUVfRFNfUEFSTSAgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIElFX0NGX1BBUk0gICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBJRV9USU0gICAgICAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgSUVfSUJTU19QQVJNICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIElFX0NPVU5UUlkgICAgICAgICAgICAgICAgICAgICAgNyAgICAgLy8gODAyLjExZAorI2RlZmluZSBJRV84MDJfMTFEX1JFUVVFU1QgICAgICAgICAgICAgIDEwICAgIC8vIDgwMi4xMWQKKyNkZWZpbmUgSUVfUUJTU19MT0FEICAgICAgICAgICAgICAgICAgICAxMSAgICAvLyA4MDIuMTFlIGQ5CisjZGVmaW5lIElFX0VEQ0FfUEFSQU1FVEVSICAgICAgICAgICAgICAgMTIgICAgLy8gODAyLjExZSBkOQorI2RlZmluZSBJRV9UU1BFQyAgICAgICAgICAgICAgICAgICAgICAgIDEzICAgIC8vIDgwMi4xMWUgZDkKKyNkZWZpbmUgSUVfVENMQVMgICAgICAgICAgICAgICAgICAgICAgICAxNCAgICAvLyA4MDIuMTFlIGQ5CisjZGVmaW5lIElFX1NDSEVEVUxFICAgICAgICAgICAgICAgICAgICAgMTUgICAgLy8gODAyLjExZSBkOQorI2RlZmluZSBJRV9DSEFMTEVOR0VfVEVYVCAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIElFX1BPV0VSX0NPTlNUUkFJTlQgICAgICAgICAgICAgMzIgICAgLy8gODAyLjExaCBkMy4zCisjZGVmaW5lIElFX1BPV0VSX0NBUEFCSUxJVFkgICAgICAgICAgICAgMzMgICAgLy8gODAyLjExaCBkMy4zCisjZGVmaW5lIElFX1RQQ19SRVFVRVNUICAgICAgICAgICAgICAgICAgMzQgICAgLy8gODAyLjExaCBkMy4zCisjZGVmaW5lIElFX1RQQ19SRVBPUlQgICAgICAgICAgICAgICAgICAgMzUgICAgLy8gODAyLjExaCBkMy4zCisjZGVmaW5lIElFX1NVUFBfQ0hBTk5FTFMgICAgICAgICAgICAgICAgMzYgICAgLy8gODAyLjExaCBkMy4zCisjZGVmaW5lIElFX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVCAgMzcgICAgLy8gODAyLjExaCBkMy4zCisjZGVmaW5lIElFX01FQVNVUkVNRU5UX1JFUVVFU1QgICAgICAgICAgMzggICAgLy8gODAyLjExaCBkMy4zCisjZGVmaW5lIElFX01FQVNVUkVNRU5UX1JFUE9SVCAgICAgICAgICAgMzkgICAgLy8gODAyLjExaCBkMy4zCisjZGVmaW5lIElFX1FVSUVUICAgICAgICAgICAgICAgICAgICAgICAgNDAgICAgLy8gODAyLjExaCBkMy4zCisjZGVmaW5lIElFX0lCU1NfREZTICAgICAgICAgICAgICAgICAgICAgNDEgICAgLy8gODAyLjExaCBkMy4zCisjZGVmaW5lIElFX0VSUCAgICAgICAgICAgICAgICAgICAgICAgICAgNDIgICAgLy8gODAyLjExZworI2RlZmluZSBJRV9UU19ERUxBWSAgICAgICAgICAgICAgICAgICAgIDQzICAgIC8vIDgwMi4xMWUgZDkKKyNkZWZpbmUgSUVfVENMQVNfUFJPQ0VTU0lORyAgICAgICAgICAgICA0NCAgICAvLyA4MDIuMTFlIGQ5CisjZGVmaW5lIElFX1FPU19DQVBBQklMSVRZICAgICAgICAgICAgICAgNDYgICAgLy8gODAyLjExZSBkNgorI2RlZmluZSBJRV9IVF9DQVAgICAgICAgICAgICAgICAgICAgICAgIDQ1ICAgIC8vIDgwMi4xMW4gZDEuIEhUIENBUEFCSUxJVFkuIEVMRU1FTlQgSUQgVEJECisjZGVmaW5lIElFX0FQX0NIQU5ORUxfUkVQT1JUCQkJNTEgICAgLy8gODAyLjExayBkNgorI2RlZmluZSBJRV9IVF9DQVAyICAgICAgICAgICAgICAgICAgICAgICAgIDUyICAgIC8vIDgwMi4xMW4gZDEuIEhUIENBUEFCSUxJVFkuIEVMRU1FTlQgSUQgVEJECisjZGVmaW5lIElFX1JTTiAgICAgICAgICAgICAgICAgICAgICAgICAgNDggICAgLy8gODAyLjExaSBkMy4wCisjZGVmaW5lIElFX1dQQTIgICAgICAgICAgICAgICAgICAgICAgICAgNDggICAgLy8gV1BBMgorI2RlZmluZSBJRV9FWFRfU1VQUF9SQVRFUyAgICAgICAgICAgICAgIDUwICAgIC8vIDgwMi4xMWcKKyNkZWZpbmUgSUVfU1VQUF9SRUdfQ0xBU1MgICAgICAgICAgICAgICA1OSAgICAvLyA4MDIuMTF5LiBTdXBwb3J0ZWQgcmVndWxhdG9yeSBjbGFzc2VzLgorI2RlZmluZSBJRV9FWFRfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UCTYwCS8vIDgwMi4xMW4KKyNkZWZpbmUgSUVfQUREX0hUICAgICAgICAgICAgICAgICAgICAgICAgIDYxICAgIC8vIDgwMi4xMW4gZDEuIEFERElUSU9OQUwgSFQgQ0FQQUJJTElUWS4gRUxFTUVOVCBJRCBUQkQKKyNkZWZpbmUgSUVfQUREX0hUMiAgICAgICAgICAgICAgICAgICAgICAgIDUzICAgIC8vIDgwMi4xMW4gZDEuIEFERElUSU9OQUwgSFQgQ0FQQUJJTElUWS4gRUxFTUVOVCBJRCBUQkQKKworCisvLyBGb3IgODAyLjExbiBEMy4wMworLy8jZGVmaW5lIElFX05FV19FWFRfQ0hBX09GRlNFVCAgICAgICAgICAgICA2MiAgICAvLyA4MDIuMTFuIGQxLiBOZXcgZXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0IGVsZW1ldAorI2RlZmluZSBJRV9TRUNPTkRBUllfQ0hfT0ZGU0VUCQk2MgkvLyA4MDIuMTFuIEQzLjAzCVNlY29uZGFyeSBDaGFubmVsIE9mZnNldCBlbGVtZW50CisjZGVmaW5lIElFXzIwNDBfQlNTX0NPRVhJU1QgICAgICAgICAgICAgICA3MiAgICAvLyA4MDIuMTFuIEQzLjAuMworI2RlZmluZSBJRV8yMDQwX0JTU19JTlRPTEVSQU5UX1JFUE9SVCAgICAgNzMgICAgLy8gODAyLjExbiBEMy4wMworI2RlZmluZSBJRV9PVkVSTEFQQlNTX1NDQU5fUEFSTSAgICAgICAgICAgNzQgICAgLy8gODAyLjExbiBEMy4wMworI2RlZmluZSBJRV9FWFRfQ0FQQUJJTElUWSAgICAgICAgICAgICAgICAxMjcgICAvLyA4MDIuMTFuIEQzLjAzCisKKworI2RlZmluZSBJRV9XUEEgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMSAgIC8vIFdQQQorI2RlZmluZSBJRV9WRU5ET1JfU1BFQ0lGSUMgICAgICAgICAgICAgIDIyMSAgIC8vIFdpZmkgV01NIChXTUUpCisKKyNkZWZpbmUgT1VJX0JST0FEQ09NX0hUICAgICAgICAgICAgICA1MSAgIC8vCisjZGVmaW5lIE9VSV9CUk9BRENPTV9IVEFERCAgICAgICAgICAgICAgNTIgICAvLworI2RlZmluZSBPVUlfUFJFTl9IVF9DQVAgICAgICAgICAgICAgIDUxICAgLy8KKyNkZWZpbmUgT1VJX1BSRU5fQUREX0hUICAgICAgICAgICAgICA1MiAgIC8vCisKKy8vIENDWCBpbmZvcm1hdGlvbgorI2RlZmluZSBJRV9BSVJPTkVUX0NLSVAgICAgICAgICAgICAgICAgIDEzMyAgIC8vIENDWDEuMCBJRCA4NUggZm9yIENLSVAKKyNkZWZpbmUgSUVfQVBfVFhfUE9XRVIgICAgICAgICAgICAgICAgICAxNTAgICAvLyBDQ1ggMi4wIGZvciBBUCB0cmFuc21pdCBwb3dlcgorI2RlZmluZSBJRV9NRUFTVVJFTUVOVF9DQVBBQklMSVRZICAgICAgIDIyMSAgIC8vIENDWCAyLjAKKyNkZWZpbmUgSUVfQ0NYX1YyICAgICAgICAgICAgICAgICAgICAgICAyMjEKKyNkZWZpbmUgSUVfQUlST05FVF9JUEFERFJFU1MgICAgICAgICAgICAxNDkgICAvLyBDQ1ggSUQgOTVIIGZvciBJUCBBZGRyZXNzCisjZGVmaW5lIElFX0FJUk9ORVRfQ0NLTVJFQVNTT0MgICAgICAgICAgMTU2ICAgLy8gQ0NYIElEIDlDSCBmb3IgQ0NLTSBSZWFzc29jaWF0aW9uIFJlcXVlc3QgZWxlbWVudAorI2RlZmluZSBDS0lQX05FR09USUFUSU9OX0xFTkdUSCAgICAgICAgIDMwCisjZGVmaW5lIEFJUk9ORVRfSVBBRERSRVNTX0xFTkdUSCAgICAgICAgMTAKKyNkZWZpbmUgQUlST05FVF9DQ0tNUkVBU1NPQ19MRU5HVEggICAgICAyNAorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gTUxNRSBzdGF0ZSBtYWNoaW5lIGRlZmluaXRpb24KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIFNUQSBNTE1FIHN0YXRlIG1haGNpbmVzCisjZGVmaW5lIEFTU09DX1NUQVRFX01BQ0hJTkUgICAgICAgICAgICAgMQorI2RlZmluZSBBVVRIX1NUQVRFX01BQ0hJTkUgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQVVUSF9SU1BfU1RBVEVfTUFDSElORSAgICAgICAgICAzCisjZGVmaW5lIFNZTkNfU1RBVEVfTUFDSElORSAgICAgICAgICAgICAgNAorI2RlZmluZSBNTE1FX0NOVExfU1RBVEVfTUFDSElORSAgICAgICAgIDUKKyNkZWZpbmUgV1BBX1BTS19TVEFURV9NQUNISU5FICAgICAgICAgICA2CisjZGVmaW5lIExFQVBfU1RBVEVfTUFDSElORSAgICAgICAgICAgICAgNworI2RlZmluZSBBSVJPTkVUX1NUQVRFX01BQ0hJTkUgICAgICAgICAgIDgKKyNkZWZpbmUgQUNUSU9OX1NUQVRFX01BQ0hJTkUgICAgICAgICAgIDkKKworLy8gQVAgTUxNRSBzdGF0ZSBtYWNoaW5lcworI2RlZmluZSBBUF9BU1NPQ19TVEFURV9NQUNISU5FICAgICAgICAgIDExCisjZGVmaW5lIEFQX0FVVEhfU1RBVEVfTUFDSElORSAgICAgICAgICAgMTIKKyNkZWZpbmUgQVBfQVVUSF9SU1BfU1RBVEVfTUFDSElORSAgICAgICAxMworI2RlZmluZSBBUF9TWU5DX1NUQVRFX01BQ0hJTkUgICAgICAgICAgIDE0CisjZGVmaW5lIEFQX0NOVExfU1RBVEVfTUFDSElORSAgICAgICAgICAgMTUKKyNkZWZpbmUgQVBfV1BBX1NUQVRFX01BQ0hJTkUgICAgICAgICAgICAxNgorCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisjZGVmaW5lIERMU19TVEFURV9NQUNISU5FICAgICAgICAgICAgICAgMjYKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworLy8KKy8vIFNUQSdzIENPTlRST0wvQ09OTkVDVCBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgQ05UTF9JRExFICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENOVExfV0FJVF9ESVNBU1NPQyAgICAgICAgICAgICAgMQorI2RlZmluZSBDTlRMX1dBSVRfSk9JTiAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQ05UTF9XQUlUX1JFQVNTT0MgICAgICAgICAgICAgICAzCisjZGVmaW5lIENOVExfV0FJVF9TVEFSVCAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBDTlRMX1dBSVRfQVVUSCAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgQ05UTF9XQUlUX0FTU09DICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIENOVExfV0FJVF9BVVRIMiAgICAgICAgICAgICAgICAgNworI2RlZmluZSBDTlRMX1dBSVRfT0lEX0xJU1RfU0NBTiAgICAgICAgIDgKKyNkZWZpbmUgQ05UTF9XQUlUX09JRF9ESVNBU1NPQyAgICAgICAgICA5CisKKyNkZWZpbmUgTVQyX0FTU09DX0NPTkYgICAgICAgICAgICAgICAgICAzNAorI2RlZmluZSBNVDJfQVVUSF9DT05GICAgICAgICAgICAgICAgICAgIDM1CisjZGVmaW5lIE1UMl9ERUFVVEhfQ09ORiAgICAgICAgICAgICAgICAgMzYKKyNkZWZpbmUgTVQyX0RJU0FTU09DX0NPTkYgICAgICAgICAgICAgICAzNworI2RlZmluZSBNVDJfUkVBU1NPQ19DT05GICAgICAgICAgICAgICAgIDM4CisjZGVmaW5lIE1UMl9QV1JfTUdNVF9DT05GICAgICAgICAgICAgICAgMzkKKyNkZWZpbmUgTVQyX0pPSU5fQ09ORiAgICAgICAgICAgICAgICAgICA0MAorI2RlZmluZSBNVDJfU0NBTl9DT05GICAgICAgICAgICAgICAgICAgIDQxCisjZGVmaW5lIE1UMl9TVEFSVF9DT05GICAgICAgICAgICAgICAgICAgNDIKKyNkZWZpbmUgTVQyX0dFVF9DT05GICAgICAgICAgICAgICAgICAgICA0MworI2RlZmluZSBNVDJfU0VUX0NPTkYgICAgICAgICAgICAgICAgICAgIDQ0CisjZGVmaW5lIE1UMl9SRVNFVF9DT05GICAgICAgICAgICAgICAgICAgNDUKKyNkZWZpbmUgTVQyX01MTUVfUk9BTUlOR19SRVEgICAgICAgICAgICA1MgorCisjZGVmaW5lIENOVExfRlVOQ19TSVpFICAgICAgICAgICAgICAgICAgMQorCisvLworLy8gU1RBJ3MgQVNTT0Mgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIEFTU09DX0lETEUgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBU1NPQ19XQUlUX1JTUCAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUkVBU1NPQ19XQUlUX1JTUCAgICAgICAgICAgICAgICAyCisjZGVmaW5lIERJU0FTU09DX1dBSVRfUlNQICAgICAgICAgICAgICAgMworI2RlZmluZSBNQVhfQVNTT0NfU1RBVEUgICAgICAgICAgICAgICAgIDQKKworI2RlZmluZSBBU1NPQ19NQUNISU5FX0JBU0UgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTVQyX01MTUVfQVNTT0NfUkVRICAgICAgICAgICAgICAwCisjZGVmaW5lIE1UMl9NTE1FX1JFQVNTT0NfUkVRICAgICAgICAgICAgMQorI2RlZmluZSBNVDJfTUxNRV9ESVNBU1NPQ19SRVEgICAgICAgICAgIDIKKyNkZWZpbmUgTVQyX1BFRVJfRElTQVNTT0NfUkVRICAgICAgICAgICAzCisjZGVmaW5lIE1UMl9QRUVSX0FTU09DX1JFUSAgICAgICAgICAgICAgNAorI2RlZmluZSBNVDJfUEVFUl9BU1NPQ19SU1AgICAgICAgICAgICAgIDUKKyNkZWZpbmUgTVQyX1BFRVJfUkVBU1NPQ19SRVEgICAgICAgICAgICA2CisjZGVmaW5lIE1UMl9QRUVSX1JFQVNTT0NfUlNQICAgICAgICAgICAgNworI2RlZmluZSBNVDJfRElTQVNTT0NfVElNRU9VVCAgICAgICAgICAgIDgKKyNkZWZpbmUgTVQyX0FTU09DX1RJTUVPVVQgICAgICAgICAgICAgICA5CisjZGVmaW5lIE1UMl9SRUFTU09DX1RJTUVPVVQgICAgICAgICAgICAgMTAKKyNkZWZpbmUgTUFYX0FTU09DX01TRyAgICAgICAgICAgICAgICAgICAxMQorCisjZGVmaW5lIEFTU09DX0ZVTkNfU0laRSAgICAgICAgICAgICAgICAgKE1BWF9BU1NPQ19TVEFURSAqIE1BWF9BU1NPQ19NU0cpCisKKy8vCisvLyBBQ1Qgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIEFDVF9JRExFICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTUFYX0FDVF9TVEFURSAgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIEFDVF9NQUNISU5FX0JBU0UgICAgICAgICAgICAgIDAKKworLy9UaG9zZSBQRUVSX3h4X0NBVEUgbnVtYmVyIGlzIGJhc2VkIG9uIHJlYWwgQ2F0ZWdhcnkgdmFsdWUgaW4gSUVFRSBzcGVjLiBQbGVhc2UgZG9uJ2VzIG1vZGlmeSBpdCBieSB5b3VyIHNlbGYuCisvL0NhdGVnb3J5CisjZGVmaW5lIE1UMl9QRUVSX1NQRUNUUlVNX0NBVEUgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTVQyX1BFRVJfUU9TX0NBVEUgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTVQyX1BFRVJfRExTX0NBVEUgICAgICAgICAgICAgMgorI2RlZmluZSBNVDJfUEVFUl9CQV9DQVRFICAgICAgICAgICAgIDMKKyNkZWZpbmUgTVQyX1BFRVJfUFVCTElDX0NBVEUgICAgICAgICAgICAgNAorI2RlZmluZSBNVDJfUEVFUl9STV9DQVRFICAgICAgICAgICAgIDUKKyNkZWZpbmUgTVQyX1BFRVJfSFRfQ0FURSAgICAgICAgICAgICA3CS8vCTcuNC43CisjZGVmaW5lIE1BWF9QRUVSX0NBVEVfTVNHICAgICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgTVQyX01MTUVfQUREX0JBX0NBVEUgICAgICAgICAgICAgOAorI2RlZmluZSBNVDJfTUxNRV9PUklfREVMQkFfQ0FURSAgICAgICAgICAgICA5CisjZGVmaW5lIE1UMl9NTE1FX1JFQ19ERUxCQV9DQVRFICAgICAgICAgICAgIDEwCisjZGVmaW5lIE1UMl9NTE1FX1FPU19DQVRFICAgICAgICAgICAgICAxMQorI2RlZmluZSBNVDJfTUxNRV9ETFNfQ0FURSAgICAgICAgICAgICAxMgorI2RlZmluZSBNVDJfQUNUX0lOVkFMSUQgICAgICAgICAgICAgMTMKKyNkZWZpbmUgTUFYX0FDVF9NU0cgICAgICAgICAgICAgICAgICAgMTQKKworLy9DYXRlZ29yeSBmaWVsZAorI2RlZmluZSBDQVRFR09SWV9TUEVDVFJVTQkJMAorI2RlZmluZSBDQVRFR09SWV9RT1MJCQkxCisjZGVmaW5lIENBVEVHT1JZX0RMUwkJCTIKKyNkZWZpbmUgQ0FURUdPUllfQkEJCQkzCisjZGVmaW5lIENBVEVHT1JZX1BVQkxJQwkJNAorI2RlZmluZSBDQVRFR09SWV9STQkJCTUKKyNkZWZpbmUgQ0FURUdPUllfSFQJCQk3CisKKworLy8gRExTIEFjdGlvbiBmcmFtZSBkZWZpbml0aW9uCisjZGVmaW5lIEFDVElPTl9ETFNfUkVRVUVTVAkJCTAKKyNkZWZpbmUgQUNUSU9OX0RMU19SRVNQT05TRQkJCTEKKyNkZWZpbmUgQUNUSU9OX0RMU19URUFSRE9XTgkJCTIKKworLy9TcGVjdHJ1bSAgQWN0aW9uIGZpZWxkIHZhbHVlIDgwMi4xMWggNy40LjEKKyNkZWZpbmUgU1BFQ19NUlEJMAkvLyBSZXF1ZXN0CisjZGVmaW5lIFNQRUNfTVJQCTEJLy9SZXBvcnQKKyNkZWZpbmUgU1BFQ19UUENSUQkyCisjZGVmaW5lIFNQRUNfVFBDUlAJMworI2RlZmluZSBTUEVDX0NIQU5ORUxfU1dJVENICTQKKworCisvL0JBICBBY3Rpb24gZmllbGQgdmFsdWUKKyNkZWZpbmUgQUREQkFfUkVRCTAKKyNkZWZpbmUgQUREQkFfUkVTUAkxCisjZGVmaW5lIERFTEJBICAgMgorCisvL1B1YmxpYydzICBBY3Rpb24gZmllbGQgdmFsdWUgaW4gUHVibGljIENhdGVnb3J5LiAgU29tZSBpbiA4MDIuMTF5IGFuZCBzb21lIGluIDExbgorI2RlZmluZSBBQ1RJT05fQlNTXzIwNDBfQ09FWElTVAkJCQkwCS8vIDExbgorI2RlZmluZSBBQ1RJT05fRFNFX0VOQUJMRU1FTlQJCQkJCTEJLy8gMTF5IEQ5LjAKKyNkZWZpbmUgQUNUSU9OX0RTRV9ERUVOQUJMRU1FTlQJCQkJMgkvLyAxMXkgRDkuMAorI2RlZmluZSBBQ1RJT05fRFNFX1JFR19MT0NBVElPTl9BTk5PVU5DRQkzCS8vIDExeSBEOS4wCisjZGVmaW5lIEFDVElPTl9FWFRfQ0hfU1dJVENIX0FOTk9VTkNFCQk0CS8vIDExeSBEOS4wCisjZGVmaW5lIEFDVElPTl9EU0VfTUVBU1VSRU1FTlRfUkVRCQkJNQkvLyAxMXkgRDkuMAorI2RlZmluZSBBQ1RJT05fRFNFX01FQVNVUkVNRU5UX1JFUE9SVAkJNgkvLyAxMXkgRDkuMAorI2RlZmluZSBBQ1RJT05fTUVBU1VSRU1FTlRfUElMT1RfQUNUSU9OCQk3ICAJLy8gMTF5IEQ5LjAKKyNkZWZpbmUgQUNUSU9OX0RTRV9QT1dFUl9DT05TVFJBSU5UCQkJOAkvLyAxMXkgRDkuMAorCisKKy8vSFQgIEFjdGlvbiBmaWVsZCB2YWx1ZQorI2RlZmluZSBOT1RJRllfQldfQUNUSU9OCQkJCTAKKyNkZWZpbmUgU01QU19BQ1RJT04JCQkJCQkxCisjZGVmaW5lIFBTTVBfQUNUSU9OICAgCQkJCQkyCisjZGVmaW5lIFNFVFBDT19BQ1RJT04JCQkJCTMKKyNkZWZpbmUgTUlNT19DSEFfTUVBU1VSRV9BQ1RJT04JCQk0CisjZGVmaW5lIE1JTU9fTl9CRUFDT05GT1JNCQkJCTUKKyNkZWZpbmUgTUlNT19CRUFDT05GT1JNCQkJCQk2CisjZGVmaW5lIEFOVEVOTkFfU0VMRUNUCQkJCQk3CisjZGVmaW5lIEhUX0lORk9fRVhDSEFOR0UJCQkJOAorCisjZGVmaW5lIEFDVF9GVU5DX1NJWkUgICAgICAgICAgICAgICAgIChNQVhfQUNUX1NUQVRFICogTUFYX0FDVF9NU0cpCisvLworLy8gU1RBJ3MgQVVUSEVOVElDQVRJT04gc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldnZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCisvLworI2RlZmluZSBBVVRIX1JFUV9JRExFICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVVUSF9XQUlUX1NFUTIgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEFVVEhfV0FJVF9TRVE0ICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBNQVhfQVVUSF9TVEFURSAgICAgICAgICAgICAgICAgIDMKKworI2RlZmluZSBBVVRIX01BQ0hJTkVfQkFTRSAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTVQyX01MTUVfQVVUSF9SRVEgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1UMl9QRUVSX0FVVEhfRVZFTiAgICAgICAgICAgICAgMQorI2RlZmluZSBNVDJfQVVUSF9USU1FT1VUICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTUFYX0FVVEhfTVNHICAgICAgICAgICAgICAgICAgICAzCisKKyNkZWZpbmUgQVVUSF9GVU5DX1NJWkUgICAgICAgICAgICAgICAgICAoTUFYX0FVVEhfU1RBVEUgKiBNQVhfQVVUSF9NU0cpCisKKy8vCisvLyBTVEEncyBBVVRIX1JTUCBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgQVVUSF9SU1BfSURMRSAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFVVEhfUlNQX1dBSVRfQ0hBTCAgICAgICAgICAgICAgMQorI2RlZmluZSBNQVhfQVVUSF9SU1BfU1RBVEUgICAgICAgICAgICAgIDIKKworI2RlZmluZSBBVVRIX1JTUF9NQUNISU5FX0JBU0UgICAgICAgICAgIDAKKyNkZWZpbmUgTVQyX0FVVEhfQ0hBTExFTkdFX1RJTUVPVVQgICAgICAwCisjZGVmaW5lIE1UMl9QRUVSX0FVVEhfT0REICAgICAgICAgICAgICAgMQorI2RlZmluZSBNVDJfUEVFUl9ERUFVVEggICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTUFYX0FVVEhfUlNQX01TRyAgICAgICAgICAgICAgICAzCisKKyNkZWZpbmUgQVVUSF9SU1BfRlVOQ19TSVpFICAgICAgICAgICAgICAoTUFYX0FVVEhfUlNQX1NUQVRFICogTUFYX0FVVEhfUlNQX01TRykKKworLy8KKy8vIFNUQSdzIFNZTkMgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIFNZTkNfSURMRSAgICAgICAgICAgICAgICAgICAgICAgMCAgLy8gbWVyZ2UgTk9fQlNTLElCU1NfSURMRSxJQlNTX0FDVElWRSBhbmQgQlNTIGluIHRvIDEgc3RhdGUKKyNkZWZpbmUgSk9JTl9XQUlUX0JFQUNPTiAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFNDQU5fTElTVEVOICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBNQVhfU1lOQ19TVEFURSAgICAgICAgICAgICAgICAgIDMKKworI2RlZmluZSBTWU5DX01BQ0hJTkVfQkFTRSAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTVQyX01MTUVfU0NBTl9SRVEgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1UMl9NTE1FX0pPSU5fUkVRICAgICAgICAgICAgICAgMQorI2RlZmluZSBNVDJfTUxNRV9TVEFSVF9SRVEgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTVQyX1BFRVJfQkVBQ09OICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIE1UMl9QRUVSX1BST0JFX1JTUCAgICAgICAgICAgICAgNAorI2RlZmluZSBNVDJfUEVFUl9BVElNICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgTVQyX1NDQU5fVElNRU9VVCAgICAgICAgICAgICAgICA2CisjZGVmaW5lIE1UMl9CRUFDT05fVElNRU9VVCAgICAgICAgICAgICAgNworI2RlZmluZSBNVDJfQVRJTV9USU1FT1VUICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgTVQyX1BFRVJfUFJPQkVfUkVRICAgICAgICAgICAgICA5CisjZGVmaW5lIE1BWF9TWU5DX01TRyAgICAgICAgICAgICAgICAgICAgMTAKKworI2RlZmluZSBTWU5DX0ZVTkNfU0laRSAgICAgICAgICAgICAgICAgIChNQVhfU1lOQ19TVEFURSAqIE1BWF9TWU5DX01TRykKKworLy9NZXNzYWdlcyBmb3IgdGhlIERMUyBzdGF0ZSBtYWNoaW5lCisjZGVmaW5lIERMU19JRExFCQkJCQkJMAorI2RlZmluZSBNQVhfRExTX1NUQVRFCQkJCQkxCisKKyNkZWZpbmUgRExTX01BQ0hJTkVfQkFTRQkJCQkwCisjZGVmaW5lIE1UMl9NTE1FX0RMU19SRVEJCQkgICAgMAorI2RlZmluZSBNVDJfUEVFUl9ETFNfUkVRCQkJICAgIDEKKyNkZWZpbmUgTVQyX1BFRVJfRExTX1JTUAkJCSAgICAyCisjZGVmaW5lIE1UMl9NTE1FX0RMU19URUFSX0RPV04JCSAgICAzCisjZGVmaW5lIE1UMl9QRUVSX0RMU19URUFSX0RPV04JCSAgICA0CisjZGVmaW5lIE1BWF9ETFNfTVNHCQkJCSAgICAgICAgNQorCisjZGVmaW5lIERMU19GVU5DX1NJWkUJCQkJCShNQVhfRExTX1NUQVRFICogTUFYX0RMU19NU0cpCisKKy8vCisvLyBTVEEncyBXUEEtUFNLIFN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCisvLworI2RlZmluZSBXUEFfUFNLX0lETEUJCQkJCTAKKyNkZWZpbmUgTUFYX1dQQV9QU0tfU1RBVEUJCQkJMQorCisjZGVmaW5lIFdQQV9NQUNISU5FX0JBU0UgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNVDJfRUFQUGFja2V0ICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTVQyX0VBUE9MU3RhcnQgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1UMl9FQVBPTExvZ29mZiAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBNVDJfRUFQT0xLZXkgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgTVQyX0VBUE9MQVNGQWxlcnQgICAgICAgICAgICAgICA0CisjZGVmaW5lIE1BWF9XUEFfUFNLX01TRyAgICAgICAgICAgICAgICAgNQorCisjZGVmaW5lCVdQQV9QU0tfRlVOQ19TSVpFCQkJCShNQVhfV1BBX1BTS19TVEFURSAqIE1BWF9XUEFfUFNLX01TRykKKworLy8KKy8vIFNUQSdzIENJU0NPLUFJUk9ORVQgU3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIEFJUk9ORVRfSURMRQkJCQkJMAorI2RlZmluZQlBSVJPTkVUX1NDQU5OSU5HCQkJCTEKKyNkZWZpbmUgTUFYX0FJUk9ORVRfU1RBVEUJCQkJMgorCisjZGVmaW5lIEFJUk9ORVRfTUFDSElORV9CQVNFCQkgICAgMAorI2RlZmluZSBNVDJfQUlST05FVF9NU0cJCQkJICAgIDAKKyNkZWZpbmUgTVQyX0FJUk9ORVRfU0NBTl9SRVEJCSAgICAxCisjZGVmaW5lIE1UMl9BSVJPTkVUX1NDQU5fRE9ORQkJICAgIDIKKyNkZWZpbmUgTUFYX0FJUk9ORVRfTVNHCQkJCSAgICAzCisKKyNkZWZpbmUJQUlST05FVF9GVU5DX1NJWkUJCQkJKE1BWF9BSVJPTkVUX1NUQVRFICogTUFYX0FJUk9ORVRfTVNHKQorCisvLworLy8gQVAncyBDT05UUk9ML0NPTk5FQ1Qgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIEFQX0NOVExfRlVOQ19TSVpFICAgICAgICAgICAgICAgMQorCisvLworLy8gQVAncyBBU1NPQyBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgQVBfQVNTT0NfSURMRSAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFQX01BWF9BU1NPQ19TVEFURSAgICAgICAgICAgICAgMQorCisjZGVmaW5lIEFQX0FTU09DX01BQ0hJTkVfQkFTRSAgICAgICAgICAgMAorI2RlZmluZSBBUE1UMl9NTE1FX0RJU0FTU09DX1JFUSAgICAgICAgIDAKKyNkZWZpbmUgQVBNVDJfUEVFUl9ESVNBU1NPQ19SRVEgICAgICAgICAxCisjZGVmaW5lIEFQTVQyX1BFRVJfQVNTT0NfUkVRICAgICAgICAgICAgMgorI2RlZmluZSBBUE1UMl9QRUVSX1JFQVNTT0NfUkVRICAgICAgICAgIDMKKyNkZWZpbmUgQVBNVDJfQ0xTM0VSUiAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIEFQX01BWF9BU1NPQ19NU0cgICAgICAgICAgICAgICAgNQorCisjZGVmaW5lIEFQX0FTU09DX0ZVTkNfU0laRSAgICAgICAgICAgICAgKEFQX01BWF9BU1NPQ19TVEFURSAqIEFQX01BWF9BU1NPQ19NU0cpCisKKy8vCisvLyBBUCdzIEFVVEhFTlRJQ0FUSU9OIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCisvLworI2RlZmluZSBBUF9BVVRIX1JFUV9JRExFICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBfTUFYX0FVVEhfU1RBVEUgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgQVBfQVVUSF9NQUNISU5FX0JBU0UgICAgICAgICAgICAwCisjZGVmaW5lIEFQTVQyX01MTUVfREVBVVRIX1JFUSAgICAgICAgICAgMAorI2RlZmluZSBBUE1UMl9DTFMyRVJSICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQVBfTUFYX0FVVEhfTVNHICAgICAgICAgICAgICAgICAyCisKKyNkZWZpbmUgQVBfQVVUSF9GVU5DX1NJWkUgICAgICAgICAgICAgICAoQVBfTUFYX0FVVEhfU1RBVEUgKiBBUF9NQVhfQVVUSF9NU0cpCisKKy8vCisvLyBBUCdzIEFVVEgtUlNQIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCisvLworI2RlZmluZSBBUF9BVVRIX1JTUF9JRExFICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBfTUFYX0FVVEhfUlNQX1NUQVRFICAgICAgICAgICAxCisKKyNkZWZpbmUgQVBfQVVUSF9SU1BfTUFDSElORV9CQVNFICAgICAgICAwCisjZGVmaW5lIEFQTVQyX0FVVEhfQ0hBTExFTkdFX1RJTUVPVVQgICAgMAorI2RlZmluZSBBUE1UMl9QRUVSX0FVVEhfT0REICAgICAgICAgICAgIDEKKyNkZWZpbmUgQVBNVDJfUEVFUl9ERUFVVEggICAgICAgICAgICAgICAyCisjZGVmaW5lIEFQX01BWF9BVVRIX1JTUF9NU0cgICAgICAgICAgICAgMworCisjZGVmaW5lIEFQX0FVVEhfUlNQX0ZVTkNfU0laRSAgICAgICAgICAgKEFQX01BWF9BVVRIX1JTUF9TVEFURSAqIEFQX01BWF9BVVRIX1JTUF9NU0cpCisKKy8vCisvLyBBUCdzIFNZTkMgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIEFQX1NZTkNfSURMRSAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUF9TQ0FOX0xJU1RFTgkJCQkJMQorI2RlZmluZSBBUF9NQVhfU1lOQ19TVEFURSAgICAgICAgICAgICAgIDIKKworI2RlZmluZSBBUF9TWU5DX01BQ0hJTkVfQkFTRSAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBNVDJfUEVFUl9QUk9CRV9SRVEgICAgICAgICAgICAwCisjZGVmaW5lIEFQTVQyX1BFRVJfQkVBQ09OICAgICAgICAgICAgICAgMQorI2RlZmluZSBBUE1UMl9NTE1FX1NDQU5fUkVRCQkJCTIKKyNkZWZpbmUgQVBNVDJfUEVFUl9QUk9CRV9SU1AJCQkzCisjZGVmaW5lIEFQTVQyX1NDQU5fVElNRU9VVAkJCQk0CisjZGVmaW5lIEFQTVQyX01MTUVfU0NBTl9DTkNMCQkJNQorI2RlZmluZSBBUF9NQVhfU1lOQ19NU0cgICAgICAgICAgICAgICAgIDYKKworI2RlZmluZSBBUF9TWU5DX0ZVTkNfU0laRSAgICAgICAgICAgICAgIChBUF9NQVhfU1lOQ19TVEFURSAqIEFQX01BWF9TWU5DX01TRykKKworLy8KKy8vIEFQJ3MgV1BBIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCisvLworI2RlZmluZSBBUF9XUEFfUFRLICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBfTUFYX1dQQV9QVEtfU1RBVEUgICAgICAgICAgICAxCisKKyNkZWZpbmUgQVBfV1BBX01BQ0hJTkVfQkFTRSAgICAgICAgICAgICAwCisjZGVmaW5lIEFQTVQyX0VBUFBhY2tldCAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUE1UMl9FQVBPTFN0YXJ0ICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQVBNVDJfRUFQT0xMb2dvZmYgICAgICAgICAgICAgICAyCisjZGVmaW5lIEFQTVQyX0VBUE9MS2V5ICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBBUE1UMl9FQVBPTEFTRkFsZXJ0ICAgICAgICAgICAgIDQKKyNkZWZpbmUgQVBfTUFYX1dQQV9NU0cgICAgICAgICAgICAgICAgICA1CisKKyNkZWZpbmUgQVBfV1BBX0ZVTkNfU0laRSAgICAgICAgICAgICAgICAoQVBfTUFYX1dQQV9QVEtfU1RBVEUgKiBBUF9NQVhfV1BBX01TRykKKworI2lmZGVmIEFQQ0xJX1NVUFBPUlQKKy8vQXBDbGkgYXV0aGVudGljYXRpb24gc3RhdGUgbWFjaGluZQorI2RlZmluZSBBUENMSV9BVVRIX1JFUV9JRExFICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBDTElfQVVUSF9XQUlUX1NFUTIgICAgICAgICAgICAgICAxCisjZGVmaW5lIEFQQ0xJX0FVVEhfV0FJVF9TRVE0ICAgICAgICAgICAgICAgMgorI2RlZmluZSBBUENMSV9NQVhfQVVUSF9TVEFURSAgICAgICAgICAgICAgIDMKKworI2RlZmluZSBBUENMSV9BVVRIX01BQ0hJTkVfQkFTRSAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBDTElfTVQyX01MTUVfQVVUSF9SRVEgICAgICAgICAgICAwCisjZGVmaW5lIEFQQ0xJX01UMl9NTE1FX0RFQVVUSF9SRVEgICAgICAgICAgMQorI2RlZmluZSBBUENMSV9NVDJfUEVFUl9BVVRIX0VWRU4gICAgICAgICAgIDIKKyNkZWZpbmUgQVBDTElfTVQyX1BFRVJfREVBVVRIICAgICAgICAgICAgICAzCisjZGVmaW5lIEFQQ0xJX01UMl9BVVRIX1RJTUVPVVQgICAgICAgICAgICAgNAorI2RlZmluZSBBUENMSV9NQVhfQVVUSF9NU0cgICAgICAgICAgICAgICAgIDUKKworI2RlZmluZSBBUENMSV9BVVRIX0ZVTkNfU0laRSAgICAgICAgICAgICAgIChBUENMSV9NQVhfQVVUSF9TVEFURSAqIEFQQ0xJX01BWF9BVVRIX01TRykKKworLy9BcENsaSBhc3NvY2lhdGlvbiBzdGF0ZSBtYWNoaW5lCisjZGVmaW5lIEFQQ0xJX0FTU09DX0lETEUgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUENMSV9BU1NPQ19XQUlUX1JTUCAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQVBDTElfTUFYX0FTU09DX1NUQVRFICAgICAgICAgICAgICAyCisKKyNkZWZpbmUgQVBDTElfQVNTT0NfTUFDSElORV9CQVNFICAgICAgICAgICAwCisjZGVmaW5lIEFQQ0xJX01UMl9NTE1FX0FTU09DX1JFUSAgICAgICAgICAgMAorI2RlZmluZSBBUENMSV9NVDJfTUxNRV9ESVNBU1NPQ19SRVEgICAgICAgIDEKKyNkZWZpbmUgQVBDTElfTVQyX1BFRVJfRElTQVNTT0NfUkVRICAgICAgICAyCisjZGVmaW5lIEFQQ0xJX01UMl9QRUVSX0FTU09DX1JTUCAgICAgICAgICAgMworI2RlZmluZSBBUENMSV9NVDJfQVNTT0NfVElNRU9VVCAgICAgICAgICAgIDQKKyNkZWZpbmUgQVBDTElfTUFYX0FTU09DX01TRyAgICAgICAgICAgICAgICA1CisKKyNkZWZpbmUgQVBDTElfQVNTT0NfRlVOQ19TSVpFICAgICAgICAgICAgICAoQVBDTElfTUFYX0FTU09DX1NUQVRFICogQVBDTElfTUFYX0FTU09DX01TRykKKworLy9BcENsaSBzeW5jIHN0YXRlIG1hY2hpbmUKKyNkZWZpbmUgQVBDTElfU1lOQ19JRExFICAgICAgICAgICAgICAgICAgIDAgIC8vIG1lcmdlIE5PX0JTUyxJQlNTX0lETEUsSUJTU19BQ1RJVkUgYW5kIEJTUyBpbiB0byAxIHN0YXRlCisjZGVmaW5lIEFQQ0xJX0pPSU5fV0FJVF9QUk9CRV9SU1AgICAgICAgICAxCisjZGVmaW5lIEFQQ0xJX01BWF9TWU5DX1NUQVRFICAgICAgICAgICAgICAyCisKKyNkZWZpbmUgQVBDTElfU1lOQ19NQUNISU5FX0JBU0UgICAgICAgICAgIDAKKyNkZWZpbmUgQVBDTElfTVQyX01MTUVfUFJPQkVfUkVRICAgICAgICAgIDAKKyNkZWZpbmUgQVBDTElfTVQyX1BFRVJfUFJPQkVfUlNQICAgICAgICAgIDEKKyNkZWZpbmUgQVBDTElfTVQyX1BST0JFX1RJTUVPVVQgICAgICAgICAgIDIKKyNkZWZpbmUgQVBDTElfTUFYX1NZTkNfTVNHICAgICAgICAgICAgICAgIDMKKworI2RlZmluZSBBUENMSV9TWU5DX0ZVTkNfU0laRSAgICAgICAgICAgICAgKEFQQ0xJX01BWF9TWU5DX1NUQVRFICogQVBDTElfTUFYX1NZTkNfTVNHKQorCisvL0FwQ2xpIGN0cmwgc3RhdGUgbWFjaGluZQorI2RlZmluZSBBUENMSV9DVFJMX0RJU0NPTk5FQ1RFRCAgICAgICAgICAgMCAgLy8gbWVyZ2UgTk9fQlNTLElCU1NfSURMRSxJQlNTX0FDVElWRSBhbmQgQlNTIGluIHRvIDEgc3RhdGUKKyNkZWZpbmUgQVBDTElfQ1RSTF9QUk9CRSAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQVBDTElfQ1RSTF9BVVRIICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQVBDTElfQ1RSTF9BVVRIXzIgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQVBDTElfQ1RSTF9BU1NPQyAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgQVBDTElfQ1RSTF9ERUFTU09DICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgQVBDTElfQ1RSTF9DT05ORUNURUQgICAgICAgICAgICAgIDYKKyNkZWZpbmUgQVBDTElfTUFYX0NUUkxfU1RBVEUgICAgICAgICAgICAgIDcKKworI2RlZmluZSBBUENMSV9DVFJMX01BQ0hJTkVfQkFTRSAgICAgICAgICAgMAorI2RlZmluZSBBUENMSV9DVFJMX0pPSU5fUkVRICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUENMSV9DVFJMX1BST0JFX1JTUCAgICAgICAgICAgICAgMQorI2RlZmluZSBBUENMSV9DVFJMX0FVVEhfUlNQICAgICAgICAgICAgICAgMgorI2RlZmluZSBBUENMSV9DVFJMX0RJU0NPTk5FQ1RfUkVRICAgICAgICAgMworI2RlZmluZSBBUENMSV9DVFJMX1BFRVJfRElTQ09OTkVDVF9SRVEgICAgNAorI2RlZmluZSBBUENMSV9DVFJMX0FTU09DX1JTUCAgICAgICAgICAgICAgNQorI2RlZmluZSBBUENMSV9DVFJMX0RFQVNTT0NfUlNQICAgICAgICAgICAgNgorI2RlZmluZSBBUENMSV9DVFJMX0pPSU5fUkVRX1RJTUVPVVQgICAgICAgNworI2RlZmluZSBBUENMSV9DVFJMX0FVVEhfUkVRX1RJTUVPVVQgICAgICAgOAorI2RlZmluZSBBUENMSV9DVFJMX0FTU09DX1JFUV9USU1FT1VUICAgICAgOQorI2RlZmluZSBBUENMSV9NQVhfQ1RSTF9NU0cgICAgICAgICAgICAgICAgMTAKKworI2RlZmluZSBBUENMSV9DVFJMX0ZVTkNfU0laRSAgICAgICAgICAgICAgKEFQQ0xJX01BWF9DVFJMX1NUQVRFICogQVBDTElfTUFYX0NUUkxfTVNHKQorCisjZW5kaWYJLy8gQVBDTElfU1VQUE9SVCAvLworCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIHZhbHVlIGRvbWFpbiBvZiA4MDIuMTEgaGVhZGVyIEZDLlR5dGUsIHdoaWNoIGlzIGIzLi5iMiBvZiB0aGUgMXN0LWJ5dGUgb2YgTUFDIGhlYWRlcgorI2RlZmluZSBCVFlQRV9NR01UICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBCVFlQRV9DTlRMICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBCVFlQRV9EQVRBICAgICAgICAgICAgICAgICAgMgorCisvLyB2YWx1ZSBkb21haW4gb2YgODAyLjExIE1HTVQgZnJhbWUncyBGQy5zdWJ0eXBlLCB3aGljaCBpcyBiNy4uNCBvZiB0aGUgMXN0LWJ5dGUgb2YgTUFDIGhlYWRlcgorI2RlZmluZSBTVUJUWVBFX0FTU09DX1JFUSAgICAgICAgICAgMAorI2RlZmluZSBTVUJUWVBFX0FTU09DX1JTUCAgICAgICAgICAgMQorI2RlZmluZSBTVUJUWVBFX1JFQVNTT0NfUkVRICAgICAgICAgMgorI2RlZmluZSBTVUJUWVBFX1JFQVNTT0NfUlNQICAgICAgICAgMworI2RlZmluZSBTVUJUWVBFX1BST0JFX1JFUSAgICAgICAgICAgNAorI2RlZmluZSBTVUJUWVBFX1BST0JFX1JTUCAgICAgICAgICAgNQorI2RlZmluZSBTVUJUWVBFX0JFQUNPTiAgICAgICAgICAgICAgOAorI2RlZmluZSBTVUJUWVBFX0FUSU0gICAgICAgICAgICAgICAgOQorI2RlZmluZSBTVUJUWVBFX0RJU0FTU09DICAgICAgICAgICAgMTAKKyNkZWZpbmUgU1VCVFlQRV9BVVRIICAgICAgICAgICAgICAgIDExCisjZGVmaW5lIFNVQlRZUEVfREVBVVRIICAgICAgICAgICAgICAxMgorI2RlZmluZSBTVUJUWVBFX0FDVElPTiAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgU1VCVFlQRV9BQ1RJT05fTk9fQUNLICAgICAgICAgICAgICAxNAorCisvLyB2YWx1ZSBkb21haW4gb2YgODAyLjExIENOVEwgZnJhbWUncyBGQy5zdWJ0eXBlLCB3aGljaCBpcyBiNy4uNCBvZiB0aGUgMXN0LWJ5dGUgb2YgTUFDIGhlYWRlcgorI2RlZmluZSBTVUJUWVBFX1dSQVBQRVIgICAgICAgCTcKKyNkZWZpbmUgU1VCVFlQRV9CTE9DS19BQ0tfUkVRICAgICAgIDgKKyNkZWZpbmUgU1VCVFlQRV9CTE9DS19BQ0sgICAgICAgICAgIDkKKyNkZWZpbmUgU1VCVFlQRV9QU19QT0xMICAgICAgICAgICAgIDEwCisjZGVmaW5lIFNVQlRZUEVfUlRTICAgICAgICAgICAgICAgICAxMQorI2RlZmluZSBTVUJUWVBFX0NUUyAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgU1VCVFlQRV9BQ0sgICAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIFNVQlRZUEVfQ0ZFTkQgICAgICAgICAgICAgICAxNAorI2RlZmluZSBTVUJUWVBFX0NGRU5EX0NGQUNLICAgICAgICAgMTUKKworLy8gdmFsdWUgZG9tYWluIG9mIDgwMi4xMSBEQVRBIGZyYW1lJ3MgRkMuc3VidHlwZSwgd2hpY2ggaXMgYjcuLjQgb2YgdGhlIDFzdC1ieXRlIG9mIE1BQyBoZWFkZXIKKyNkZWZpbmUgU1VCVFlQRV9EQVRBICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU1VCVFlQRV9EQVRBX0NGQUNLICAgICAgICAgIDEKKyNkZWZpbmUgU1VCVFlQRV9EQVRBX0NGUE9MTCAgICAgICAgIDIKKyNkZWZpbmUgU1VCVFlQRV9EQVRBX0NGQUNLX0NGUE9MTCAgIDMKKyNkZWZpbmUgU1VCVFlQRV9OVUxMX0ZVTkMgICAgICAgICAgIDQKKyNkZWZpbmUgU1VCVFlQRV9DRkFDSyAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgU1VCVFlQRV9DRlBPTEwgICAgICAgICAgICAgIDYKKyNkZWZpbmUgU1VCVFlQRV9DRkFDS19DRlBPTEwgICAgICAgIDcKKyNkZWZpbmUgU1VCVFlQRV9RREFUQSAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgU1VCVFlQRV9RREFUQV9DRkFDSyAgICAgICAgIDkKKyNkZWZpbmUgU1VCVFlQRV9RREFUQV9DRlBPTEwgICAgICAgIDEwCisjZGVmaW5lIFNVQlRZUEVfUURBVEFfQ0ZBQ0tfQ0ZQT0xMICAxMQorI2RlZmluZSBTVUJUWVBFX1FPU19OVUxMICAgICAgICAgICAgMTIKKyNkZWZpbmUgU1VCVFlQRV9RT1NfQ0ZBQ0sgICAgICAgICAgIDEzCisjZGVmaW5lIFNVQlRZUEVfUU9TX0NGUE9MTCAgICAgICAgICAxNAorI2RlZmluZSBTVUJUWVBFX1FPU19DRkFDS19DRlBPTEwgICAgMTUKKworLy8gQUNLIHBvbGljeSBvZiBRT1MgQ29udHJvbCBmaWVsZCBiaXQgNjo1CisjZGVmaW5lIE5PUk1BTF9BQ0sgICAgICAgICAgICAgICAgICAweDAwICAvLyBiNjo1ID0gMDAKKyNkZWZpbmUgTk9fQUNLICAgICAgICAgICAgICAgICAgICAgIDB4MjAgIC8vIGI2OjUgPSAwMQorI2RlZmluZSBOT19FWFBMSUNJVF9BQ0sgICAgICAgICAgICAgMHg0MCAgLy8gYjY6NSA9IDEwCisjZGVmaW5lIEJMT0NLX0FDSyAgICAgICAgICAgICAgICAgICAweDYwICAvLyBiNjo1ID0gMTEKKworLy8KKy8vIHJ0bXBfZGF0YS5jIHVzZSB0aGVzZSBkZWZpbml0aW9uCisvLworI2RlZmluZSBMRU5HVEhfODAyXzExICAgICAgICAgICAgICAgMjQKKyNkZWZpbmUgTEVOR1RIXzgwMl8xMV9BTkRfSCAgICAgICAgIDMwCisjZGVmaW5lIExFTkdUSF84MDJfMTFfQ1JDX0ggICAgICAgICAzNAorI2RlZmluZSBMRU5HVEhfODAyXzExX0NSQyAgICAgICAgICAgMjgKKyNkZWZpbmUgTEVOR1RIXzgwMl8xMV9XSVRIX0FERFI0ICAgIDMwCisjZGVmaW5lIExFTkdUSF84MDJfMyAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBMRU5HVEhfODAyXzNfVFlQRSAgICAgICAgICAgMgorI2RlZmluZSBMRU5HVEhfODAyXzFfSCAgICAgICAgICAgICAgOAorI2RlZmluZSBMRU5HVEhfRUFQT0xfSCAgICAgICAgICAgICAgNAorI2RlZmluZSBMRU5HVEhfV01NUU9TX0gJCQkJMgorI2RlZmluZSBMRU5HVEhfQ1JDICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBNQVhfU0VRX05VTUJFUiAgICAgICAgICAgICAgMHgwZmZmCisjZGVmaW5lIExFTkdUSF84MDJfM19OT19UWVBFCQkxMgorI2RlZmluZSBMRU5HVEhfODAyXzFRCQkJCTQgLyogVkxBTiByZWxhdGVkICovCisKKy8vIFNUQV9DU1I0LmZpZWxkLlR4UmVzdWx0CisjZGVmaW5lIFRYX1JFU1VMVF9TVUNDRVNTICAgICAgICAgICAwCisjZGVmaW5lIFRYX1JFU1VMVF9aRVJPX0xFTkdUSCAgICAgICAxCisjZGVmaW5lIFRYX1JFU1VMVF9VTkRFUl9SVU4gICAgICAgICAyCisjZGVmaW5lIFRYX1JFU1VMVF9PSFlfRVJST1IgICAgICAgICA0CisjZGVmaW5lIFRYX1JFU1VMVF9SRVRSWV9GQUlMICAgICAgICA2CisKKy8vIEFsbCBQSFkgcmF0ZSBzdW1tYXJ5IGluIFRYRAorLy8gUHJlYW1ibGUgTU9ERSBpbiBUeEQKKyNkZWZpbmUgTU9ERV9DQ0sJMAorI2RlZmluZSBNT0RFX09GRE0gICAxCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisjZGVmaW5lIE1PREVfSFRNSVgJMgorI2RlZmluZSBNT0RFX0hUR1JFRU5GSUVMRAkzCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisvLyBNQ1MgZm9yIENDSy4gIEJXLlNHSS5TVEJDIGFyZSByZXNlcnZlZAorI2RlZmluZSBNQ1NfTE9OR1BfUkFURV8xICAgICAgICAgICAgICAgICAgICAgIDAJIC8vIGxvbmcgcHJlYW1ibGUgQ0NLIDFNYnBzCisjZGVmaW5lIE1DU19MT05HUF9SQVRFXzIgICAgICAgICAgICAgICAgICAgICAgMQkvLyBsb25nIHByZWFtYmxlIENDSyAxTWJwcworI2RlZmluZSBNQ1NfTE9OR1BfUkFURV81XzUgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTUNTX0xPTkdQX1JBVEVfMTEgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIE1DU19TSE9SVFBfUkFURV8xICAgICAgICAgICAgICAgICAgICAgIDQJIC8vIGxvbmcgcHJlYW1ibGUgQ0NLIDFNYnBzLiBzaG9ydCBpcyBmb3JiaWRkZW4gaW4gMU1icHMKKyNkZWZpbmUgTUNTX1NIT1JUUF9SQVRFXzIgICAgICAgICAgICAgICAgICAgICAgNQkvLyBzaG9ydCBwcmVhbWJsZSBDQ0sgMk1icHMKKyNkZWZpbmUgTUNTX1NIT1JUUF9SQVRFXzVfNSAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBNQ1NfU0hPUlRQX1JBVEVfMTEgICAgICAgICAgICAgICAgICAgICA3CisvLyBUbyBzZW5kIGR1cGxpY2F0ZSBsZWdhY3kgT0ZETS4gc2V0IEJXPUJXXzQwLiAgU0dJLlNUQkMgYXJlIHJlc2VydmVkCisjZGVmaW5lIE1DU19SQVRFXzYgICAgICAgICAgICAgICAgICAgICAgMCAgIC8vIGxlZ2FjeSBPRkRNCisjZGVmaW5lIE1DU19SQVRFXzkgICAgICAgICAgICAgICAgICAgICAgMSAgIC8vIE9GRE0KKyNkZWZpbmUgTUNTX1JBVEVfMTIgICAgICAgICAgICAgICAgICAgICAyICAgLy8gT0ZETQorI2RlZmluZSBNQ1NfUkFURV8xOCAgICAgICAgICAgICAgICAgICAgIDMgICAvLyBPRkRNCisjZGVmaW5lIE1DU19SQVRFXzI0ICAgICAgICAgICAgICAgICAgICAgNCAgLy8gT0ZETQorI2RlZmluZSBNQ1NfUkFURV8zNiAgICAgICAgICAgICAgICAgICAgIDUgICAvLyBPRkRNCisjZGVmaW5lIE1DU19SQVRFXzQ4ICAgICAgICAgICAgICAgICAgICAgNiAgLy8gT0ZETQorI2RlZmluZSBNQ1NfUkFURV81NCAgICAgICAgICAgICAgICAgICAgIDcgLy8gT0ZETQorLy8gSFQKKyNkZWZpbmUgTUNTXzAJCTAJLy8gMVMKKyNkZWZpbmUgTUNTXzEJCTEKKyNkZWZpbmUgTUNTXzIJCTIKKyNkZWZpbmUgTUNTXzMJCTMKKyNkZWZpbmUgTUNTXzQJCTQKKyNkZWZpbmUgTUNTXzUJCTUKKyNkZWZpbmUgTUNTXzYJCTYKKyNkZWZpbmUgTUNTXzcJCTcKKyNkZWZpbmUgTUNTXzgJCTgJLy8gMlMKKyNkZWZpbmUgTUNTXzkJCTkKKyNkZWZpbmUgTUNTXzEwCQkxMAorI2RlZmluZSBNQ1NfMTEJCTExCisjZGVmaW5lIE1DU18xMgkJMTIKKyNkZWZpbmUgTUNTXzEzCQkxMworI2RlZmluZSBNQ1NfMTQJCTE0CisjZGVmaW5lIE1DU18xNQkJMTUKKyNkZWZpbmUgTUNTXzE2CQkxNgkvLyAzKjMKKyNkZWZpbmUgTUNTXzE3CQkxNworI2RlZmluZSBNQ1NfMTgJCTE4CisjZGVmaW5lIE1DU18xOQkJMTkKKyNkZWZpbmUgTUNTXzIwCQkyMAorI2RlZmluZSBNQ1NfMjEJCTIxCisjZGVmaW5lIE1DU18yMgkJMjIKKyNkZWZpbmUgTUNTXzIzCQkyMworI2RlZmluZSBNQ1NfMzIJCTMyCisjZGVmaW5lIE1DU19BVVRPCQkzMworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisvLyBPSURfSFRQSFlNT0RFCisvLyBNT0RFCisjZGVmaW5lIEhUTU9ERV9NTQkwCisjZGVmaW5lIEhUTU9ERV9HRgkxCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKy8vIEZpeGVkIFR4IE1PREUgLSBIVCwgQ0NLIG9yIE9GRE0KKyNkZWZpbmUgRklYRURfVFhNT0RFX0hUCQkwCisjZGVmaW5lIEZJWEVEX1RYTU9ERV9DQ0sJMQorI2RlZmluZSBGSVhFRF9UWE1PREVfT0ZETSAJMgorLy8gQlcKKyNkZWZpbmUgQldfMjAJCUJBTkRfV0lEVEhfMjAKKyNkZWZpbmUgQldfNDAJCUJBTkRfV0lEVEhfNDAKKyNkZWZpbmUgQldfQk9USAkJQkFORF9XSURUSF9CT1RICisjZGVmaW5lIEJXXzEwCQlCQU5EX1dJRFRIXzEwCS8vIDgwMi4xMWogaGFzIDEwTUh6LiBUaGlzIGRlZmluaXRpb24gaXMgZm9yIGludGVybmFsIHVzYWdlLiBkb2Vzbid0IGZpbGwgaW4gdGhlIElFIG9yIG90aGVyIGZpZWxkLgorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisvLyBTSE9SVEdJCisjZGVmaW5lIEdJXzQwMAkJR0FQX0lOVEVSVkFMXzQwMAkvLyBvbmx5IHN1cHBvcnQgaW4gSFQgbW9kZQorI2RlZmluZSBHSV9CT1RICQlHQVBfSU5URVJWQUxfQk9USAorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworI2RlZmluZSBHSV84MDAJCUdBUF9JTlRFUlZBTF84MDAKKy8vIFNUQkMKKyNkZWZpbmUgU1RCQ19OT05FCTAKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyNkZWZpbmUgU1RCQ19VU0UJMQkvLyBsaW1pdGVkIHVzZSBpbiBydDI4NjBiIHBoeQorI2RlZmluZSBSWFNUQkNfT05FCTEJLy8gcnggc3VwcG9ydCBvZiBvbmUgc3BhdGlhbCBzdHJlYW0KKyNkZWZpbmUgUlhTVEJDX1RXTwkyCS8vIHJ4IHN1cHBvcnQgb2YgMSBhbmQgMiBzcGF0aWFsIHN0cmVhbQorI2RlZmluZSBSWFNUQkNfVEhSCTMJLy8gcnggc3VwcG9ydCBvZiAxfjMgc3BhdGlhbCBzdHJlYW0KKy8vIE1DUyBGRUVEQkFDSworI2RlZmluZSBNQ1NGQktfTk9ORQkwICAvLyBub3Qgc3VwcG9ydCBtY3MgZmVlZGJhY2sgLworI2RlZmluZSBNQ1NGQktfUlNWCTEJLy8gcmVzZXJ2ZWQKKyNkZWZpbmUgTUNTRkJLX1VOU09MSUNJVAkyCS8vIG9ubHkgc3VwcG9ydCB1bnNvbGljdCBtY3MgZmVlZGJhY2sKKyNkZWZpbmUgTUNTRkJLX01SUQkzCS8vIHJlc3BvbnNlIHRvIGJvdGggTVJRIGFuZCB1bnNvbGljdCBtY3MgZmVlZGJhY2sKKworLy8gTUlNTyBwb3dlciBzYWZlCisjZGVmaW5lCU1NUFNfU1RBVElDCTAKKyNkZWZpbmUJTU1QU19EWU5BTUlDCQkxCisjZGVmaW5lICAgTU1QU19SU1YJCTIKKyNkZWZpbmUgTU1QU19FTkFCTEUJCTMKKworCisvLyBBLU1TRFUgc2l6ZQorI2RlZmluZQlBTVNEVV8wCTAKKyNkZWZpbmUJQU1TRFVfMQkJMQorCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKy8vIE1DUyB1c2UgNyBiaXRzCisjZGVmaW5lIFRYUkFURU1JTU8JCTB4ODAKKyNkZWZpbmUgVFhSQVRFTUNTCQkweDdGCisjZGVmaW5lIFRYUkFURU9GRE0JCTB4N0YKKyNkZWZpbmUgUkFURV8xICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUkFURV8yICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUkFURV81XzUgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgUkFURV8xMSAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgUkFURV82ICAgICAgICAgICAgICAgICAgICAgIDQgICAvLyBPRkRNCisjZGVmaW5lIFJBVEVfOSAgICAgICAgICAgICAgICAgICAgICA1ICAgLy8gT0ZETQorI2RlZmluZSBSQVRFXzEyICAgICAgICAgICAgICAgICAgICAgNiAgIC8vIE9GRE0KKyNkZWZpbmUgUkFURV8xOCAgICAgICAgICAgICAgICAgICAgIDcgICAvLyBPRkRNCisjZGVmaW5lIFJBVEVfMjQgICAgICAgICAgICAgICAgICAgICA4ICAgLy8gT0ZETQorI2RlZmluZSBSQVRFXzM2ICAgICAgICAgICAgICAgICAgICAgOSAgIC8vIE9GRE0KKyNkZWZpbmUgUkFURV80OCAgICAgICAgICAgICAgICAgICAgIDEwICAvLyBPRkRNCisjZGVmaW5lIFJBVEVfNTQgICAgICAgICAgICAgICAgICAgICAxMSAgLy8gT0ZETQorI2RlZmluZSBSQVRFX0ZJUlNUX09GRE1fUkFURSAgICAgICAgUkFURV82CisjZGVmaW5lIFJBVEVfTEFTVF9PRkRNX1JBVEUgICAgICAgIAlSQVRFXzU0CisjZGVmaW5lIFJBVEVfNl81ICAgICAgICAgICAgICAgICAgICAxMiAgLy8gSFQgbWl4CisjZGVmaW5lIFJBVEVfMTMgICAgICAgICAgICAgICAgICAgICAxMyAgLy8gSFQgbWl4CisjZGVmaW5lIFJBVEVfMTlfNSAgICAgICAgICAgICAgICAgICAxNCAgLy8gSFQgbWl4CisjZGVmaW5lIFJBVEVfMjYgICAgICAgICAgICAgICAgICAgICAxNSAgLy8gSFQgbWl4CisjZGVmaW5lIFJBVEVfMzkgICAgICAgICAgICAgICAgICAgICAxNiAgLy8gSFQgbWl4CisjZGVmaW5lIFJBVEVfNTIgICAgICAgICAgICAgICAgICAgICAxNyAgLy8gSFQgbWl4CisjZGVmaW5lIFJBVEVfNThfNSAgICAgICAgICAgICAgICAgICAxOCAgLy8gSFQgbWl4CisjZGVmaW5lIFJBVEVfNjUgICAgICAgICAgICAgICAgICAgICAxOSAgLy8gSFQgbWl4CisjZGVmaW5lIFJBVEVfNzggICAgICAgICAgICAgICAgICAgICAyMCAgLy8gSFQgbWl4CisjZGVmaW5lIFJBVEVfMTA0ICAgICAgICAgICAgICAgICAgICAyMSAgLy8gSFQgbWl4CisjZGVmaW5lIFJBVEVfMTE3ICAgICAgICAgICAgICAgICAgICAyMiAgLy8gSFQgbWl4CisjZGVmaW5lIFJBVEVfMTMwICAgICAgICAgICAgICAgICAgICAyMyAgLy8gSFQgbWl4CisvLyNkZWZpbmUgUkFURV9BVVRPX1NXSVRDSCAgICAgICAgICAgIDI1NSAvLyBmb3IgU3RhQ2ZnLkZpeGVkVHhSYXRlIG9ubHkKKyNkZWZpbmUgSFRSQVRFXzAgICAgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgUkFURV9GSVJTVF9NTV9SQVRFICAgICAgICBIVFJBVEVfMAorI2RlZmluZSBSQVRFX0ZJUlNUX0hUX1JBVEUgICAgICAgIEhUUkFURV8wCisjZGVmaW5lIFJBVEVfTEFTVF9IVF9SQVRFICAgICAgICBIVFJBVEVfMAorCisvLyBwVHhXSS0+dHhvcAorI2RlZmluZSBJRlNfSFRUWE9QICAgICAgICAgICAgICAgICAwCS8vIFRoZSB0eG9wIHdpbGwgYmUgaGFuZGxlcyBieSBBU0lDLgorI2RlZmluZSBJRlNfUElGUyAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJRlNfU0lGUyAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBJRlNfQkFDS09GRiAgICAgICAgICAgICAgICAgMworCisvLyBwVHhELT5SZXRyeU1vZGUKKyNkZWZpbmUgTE9OR19SRVRSWSAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgU0hPUlRfUkVUUlkgICAgICAgICAgICAgICAgIDAKKworLy8gQ291bnRyeSBSZWdpb24gZGVmaW5pdGlvbgorI2RlZmluZSBSRUdJT05fTUlOSU1VTV9CR19CQU5EICAgICAgICAgICAgMAorI2RlZmluZSBSRUdJT05fMF9CR19CQU5EICAgICAgICAgICAgICAgICAgMCAgICAgICAvLyAxLTExCisjZGVmaW5lIFJFR0lPTl8xX0JHX0JBTkQgICAgICAgICAgICAgICAgICAxICAgICAgIC8vIDEtMTMKKyNkZWZpbmUgUkVHSU9OXzJfQkdfQkFORCAgICAgICAgICAgICAgICAgIDIgICAgICAgLy8gMTAtMTEKKyNkZWZpbmUgUkVHSU9OXzNfQkdfQkFORCAgICAgICAgICAgICAgICAgIDMgICAgICAgLy8gMTAtMTMKKyNkZWZpbmUgUkVHSU9OXzRfQkdfQkFORCAgICAgICAgICAgICAgICAgIDQgICAgICAgLy8gMTQKKyNkZWZpbmUgUkVHSU9OXzVfQkdfQkFORCAgICAgICAgICAgICAgICAgIDUgICAgICAgLy8gMS0xNAorI2RlZmluZSBSRUdJT05fNl9CR19CQU5EICAgICAgICAgICAgICAgICAgNiAgICAgICAvLyAzLTkKKyNkZWZpbmUgUkVHSU9OXzdfQkdfQkFORCAgICAgICAgICAgICAgICAgIDcgICAgICAgLy8gNS0xMworI2RlZmluZSBSRUdJT05fMzFfQkdfQkFORCAgICAgICAgICAgICAgICAgMzEgICAgICAgLy8gNS0xMworI2RlZmluZSBSRUdJT05fTUFYSU1VTV9CR19CQU5EICAgICAgICAgICAgNworCisjZGVmaW5lIFJFR0lPTl9NSU5JTVVNX0FfQkFORCAgICAgICAgICAgICAwCisjZGVmaW5lIFJFR0lPTl8wX0FfQkFORCAgICAgICAgICAgICAgICAgICAwICAgICAgIC8vIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUKKyNkZWZpbmUgUkVHSU9OXzFfQV9CQU5EICAgICAgICAgICAgICAgICAgIDEgICAgICAgLy8gMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MAorI2RlZmluZSBSRUdJT05fMl9BX0JBTkQgICAgICAgICAgICAgICAgICAgMiAgICAgICAvLyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQKKyNkZWZpbmUgUkVHSU9OXzNfQV9CQU5EICAgICAgICAgICAgICAgICAgIDMgICAgICAgLy8gNTIsIDU2LCA2MCwgNjQsIDE0OSwgMTUzLCAxNTcsIDE2MQorI2RlZmluZSBSRUdJT05fNF9BX0JBTkQgICAgICAgICAgICAgICAgICAgNCAgICAgICAvLyAxNDksIDE1MywgMTU3LCAxNjEsIDE2NQorI2RlZmluZSBSRUdJT05fNV9BX0JBTkQgICAgICAgICAgICAgICAgICAgNSAgICAgICAvLyAxNDksIDE1MywgMTU3LCAxNjEKKyNkZWZpbmUgUkVHSU9OXzZfQV9CQU5EICAgICAgICAgICAgICAgICAgIDYgICAgICAgLy8gMzYsIDQwLCA0NCwgNDgKKyNkZWZpbmUgUkVHSU9OXzdfQV9CQU5EICAgICAgICAgICAgICAgICAgIDcgICAgICAgLy8gMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUKKyNkZWZpbmUgUkVHSU9OXzhfQV9CQU5EICAgICAgICAgICAgICAgICAgIDggICAgICAgLy8gNTIsIDU2LCA2MCwgNjQKKyNkZWZpbmUgUkVHSU9OXzlfQV9CQU5EICAgICAgICAgICAgICAgICAgIDkgICAgICAgLy8gMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTMyLCAxMzYsIDE0MCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUKKyNkZWZpbmUgUkVHSU9OXzEwX0FfQkFORCAgICAgICAgICAgICAgICAgIDEwCSAgLy8gMzYsIDQwLCA0NCwgNDgsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1CisjZGVmaW5lIFJFR0lPTl8xMV9BX0JBTkQgICAgICAgICAgICAgICAgICAxMQkgIC8vIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTQ5LCAxNTMsIDE1NywgMTYxCisjZGVmaW5lIFJFR0lPTl9NQVhJTVVNX0FfQkFORCAgICAgICAgICAgICAxMQorCisvLyBwVHhELT5DaXBoZXJBbGcKKyNkZWZpbmUgQ0lQSEVSX05PTkUgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ0lQSEVSX1dFUDY0ICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ0lQSEVSX1dFUDEyOCAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQ0lQSEVSX1RLSVAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQ0lQSEVSX0FFUyAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgQ0lQSEVSX0NLSVA2NCAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgQ0lQSEVSX0NLSVAxMjggICAgICAgICAgICAgIDYKKyNkZWZpbmUgQ0lQSEVSX1RLSVBfTk9fTUlDICAgICAgICAgIDcgICAgICAgLy8gTUlDIGFwcGVuZGVkIGJ5IGRyaXZlcjogbm90IGEgdmFsaWQgdmFsdWUgaW4gaGFyZHdhcmUga2V5IHRhYmxlCisjZGVmaW5lIENJUEhFUl9TTVM0CQkJCQk4CisKKy8vIHZhbHVlIGRvbWFpbiBvZiBwQWQtPlJmSWNUeXBlCisjZGVmaW5lIFJGSUNfMjgyMCAgICAgICAgICAgICAgICAgICAxICAgICAgIC8vIDIuNEcgMlQzUgorI2RlZmluZSBSRklDXzI4NTAgICAgICAgICAgICAgICAgICAgMiAgICAgICAvLyAyLjRHLzVHIDJUM1IKKyNkZWZpbmUgUkZJQ18yNzIwICAgICAgICAgICAgICAgICAgIDMgICAgICAgLy8gMi40RyAxVDJSCisjZGVmaW5lIFJGSUNfMjc1MCAgICAgICAgICAgICAgICAgICA0ICAgICAgIC8vIDIuNEcvNUcgMVQyUgorI2RlZmluZSBSRklDXzMwMjAgICAgICAgICAgICAgICAgICAgNSAgICAgICAvLyAyLjRHIDFUMVIKKyNkZWZpbmUgUkZJQ18yMDIwICAgICAgICAgICAgICAgICAgIDYgICAgICAgLy8gMi40RyBCL0cKKworLy8gTEVEIFN0YXR1cy4KKyNkZWZpbmUgTEVEX0xJTktfRE9XTiAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTEVEX0xJTktfVVAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTEVEX1JBRElPX09GRiAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTEVEX1JBRElPX09OICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgTEVEX0hBTFQgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTEVEX1dQUyAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgTEVEX09OX1NJVEVfU1VSVkVZICAgICAgICAgIDYKKyNkZWZpbmUgTEVEX1BPV0VSX1VQICAgICAgICAgICAgICAgIDcKKworLy8gdmFsdWUgZG9tYWluIG9mIHBBZC0+TGVkQ250bC5MZWRNb2RlIGFuZCBFMlBST00KKyNkZWZpbmUgTEVEX01PREVfREVGQVVMVCAgICAgICAgICAgIDAKKyNkZWZpbmUgTEVEX01PREVfVFdPX0xFRAkJCTEKKyNkZWZpbmUgTEVEX01PREVfU0lHTkFMX1NUUkVHVEgJCTggIC8vIEVFUFJPTSBkZWZpbmUgPTgKKworLy8gUkM0IGluaXQgdmFsdWUsIHVzZWQgZnJvIFdFUCAmIFRLSVAKKyNkZWZpbmUgUFBQSU5JVEZDUzMyICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYgICAvKiBJbml0aWFsIEZDUyB2YWx1ZSAqLworCisvLyB2YWx1ZSBkb21haW4gb2YgcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQuIDgwMi4xWCBjb250cm9sbGVkIHBvcnQgZGVmaW5pdGlvbgorI2RlZmluZSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCAgICAgMQorI2RlZmluZSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQgMgorCisjZGVmaW5lIFBBSVJXSVNFX0tFWSAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdST1VQX0tFWSAgICAgICAgICAgICAgICAgICAyCisKKy8vZGVmaW5pdGlvbiBvZiBEUlMKKyNkZWZpbmUgTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gJMzIKKworCisvLyBwcmUtYWxsb2NhdGVkIGZyZWUgTkRJUyBQQUNLRVQvQlVGRkVSIHBvbGwgZm9yIGludGVybmFsIHVzYWdlCisjZGVmaW5lIE1BWF9OVU1fT0ZfRlJFRV9ORElTX1BBQ0tFVCAxMjgKKworLy9CbG9jayBBQ0sKKyNkZWZpbmUgTUFYX1RYX1JFT1JERVJCVUYgICA2NAorI2RlZmluZSBNQVhfUlhfUkVPUkRFUkJVRiAgIDY0CisjZGVmaW5lIERFRkFVTFRfVFhfVElNRU9VVCAgIDMwCisjZGVmaW5lIERFRkFVTFRfUlhfVElNRU9VVCAgIDMwCisKKy8vIGRlZmluaXRpb24gb2YgUmVjaXBpZW50IG9yIE9yaWdpbmF0b3IKKyNkZWZpbmUgSV9SRUNJUElFTlQgICAgICAgICAgICAgICAgICBUUlVFCisjZGVmaW5lIElfT1JJR0lOQVRPUiAgICAgICAgICAgICAgICAgICBGQUxTRQorCisjZGVmaW5lIERFRkFVTFRfQkJQX1RYX1BPV0VSICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfUkZfVFhfUE9XRVIgICAgICAgICA1CisKKyNkZWZpbmUgTUFYX0lOSV9CVUZGRVJfU0laRQkJCTQwOTYKKyNkZWZpbmUgTUFYX1BBUkFNX0JVRkZFUl9TSVpFCQkoMjA0OCkgLy8gZW5vdWdoIGZvciBBQ0wgKDE4KjY0KQorCQkJCQkJCQkJCQkvLzE4IDogdGhlIGxlbmd0aCBvZiBNYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAiMDE6MDI6MDM6MDQ6MDU6MDY7IikKKwkJCQkJCQkJCQkJLy82NCA6IE1BWF9OVU1fT0ZfQUNMX0xJU1QKKy8vIGRlZmluaXRpb24gb2YgcEFkLT5PcE1vZGUKKyNkZWZpbmUgT1BNT0RFX1NUQSAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgT1BNT0RFX0FQICAgICAgICAgICAgICAgICAgIDEKKy8vI2RlZmluZSBPUE1PREVfTDNfQlJHICAgICAgICAgICAgICAgMiAgICAgICAvLyBhcyBBUCBhbmQgU1RBIGF0IHRoZSBzYW1lIHRpbWUKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyNkZWZpbmUgRElSX1JFQUQgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgRElSX1dSSVRFICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVFlQRV9UWEQgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVFlQRV9SWEQgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVFlQRV9UWElORk8JCQkJCTAKKyNkZWZpbmUgVFlQRV9SWElORk8JCQkJCTEKKyNkZWZpbmUgVFlQRV9UWFdJCQkJCQkwCisjZGVmaW5lIFRZUEVfUlhXSQkJCQkJMQorI2VuZGlmCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT0gQVAgcnRtcF9kZWYuaCA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIHZhbHVlIGRvbWFpbiBmb3IgcEFkLT5FdmVudFRhYi5Mb2dbXS5FdmVudAorI2RlZmluZSBFVkVOVF9SRVNFVF9BQ0NFU1NfUE9JTlQgICAgMCAvLyBMb2cgPSAiaGg6bW06c3MgICBSZXN0YXJ0IEFjY2VzcyBQb2ludCIKKyNkZWZpbmUgRVZFTlRfQVNTT0NJQVRFRCAgICAgICAgICAgIDEgLy8gTG9nID0gImhoOm1tOnNzICAgU1RBIDAwOjAxOjAyOjAzOjA0OjA1IGFzc29jaWF0ZWQiCisjZGVmaW5lIEVWRU5UX0RJU0FTU09DSUFURUQgICAgICAgICAyIC8vIExvZyA9ICJoaDptbTpzcyAgIFNUQSAwMDowMTowMjowMzowNDowNSBsZWZ0IHRoaXMgQlNTIgorI2RlZmluZSBFVkVOVF9BR0VEX09VVCAgICAgICAgICAgICAgMyAvLyBMb2cgPSAiaGg6bW06c3MgICBTVEEgMDA6MDE6MDI6MDM6MDQ6MDUgd2FzIGFnZWQtb3V0IGFuZCByZW1vdmVkIGZyb20gdGhpcyBCU1MiCisjZGVmaW5lIEVWRU5UX0NPVU5URVJfTSAgICAgICAgICAgICA0CisjZGVmaW5lIEVWRU5UX0lOVkFMSURfUFNLICAgICAgICAgICA1CisjZGVmaW5lIEVWRU5UX01BWF9FVkVOVF9UWVBFICAgICAgICA2CisvLyA9PT09IGVuZCBvZiBBUCBydG1wX2RlZi5oID09PT09PT09PT09PQorCisvLyBkZWZpbml0aW9uIFJTU0kgTnVtYmVyCisjZGVmaW5lIFJTU0lfMAkJCQkJMAorI2RlZmluZSBSU1NJXzEJCQkJCTEKKyNkZWZpbmUgUlNTSV8yCQkJCQkyCisKKy8vIGRlZmluaXRpb24gb2YgcmFkYXIgZGV0ZWN0aW9uCisjZGVmaW5lIFJEX05PUk1BTF9NT0RFCQkJCTAJLy8gTm90IGZvdW5kIHJhZGFyIHNpZ25hbAorI2RlZmluZSBSRF9TV0lUQ0hJTkdfTU9ERQkJCTEJLy8gRm91bmQgcmFkYXIgc2lnbmFsLCBhbmQgZG9pbmcgY2hhbm5lbCBzd2l0Y2gKKyNkZWZpbmUgUkRfU0lMRU5DRV9NT0RFCQkJCTIJLy8gQWZ0ZXIgY2hhbm5lbCBzd2l0Y2gsIG5lZWQgdG8gYmUgc2lsZW5jZSBhIHdoaWxlIHRvIGVuc3VyZSByYWRhciBub3QgZm91bmQKKworLy9Ecml2ZXIgZGVmaW5lZCBjaWQgZm9yIG1hcHBpbmcgc3RhdHVzIGFuZCBjb21tYW5kLgorI2RlZmluZSAgU0xFRVBDSUQJMHgxMQorI2RlZmluZSAgV0FLRUNJRAkweDIyCisjZGVmaW5lICBRVUVSWVBPV0VSQ0lECTB4MzMKKyNkZWZpbmUgIE9XTkVSTUNVCTB4MQorI2RlZmluZSAgT1dORVJDUFUJMHgwCisKKy8vIE1CU1NJRCBkZWZpbml0aW9uCisjZGVmaW5lIEVOVFJZX05PVF9GT1VORCAgICAgICAgICAgICAweEZGCisKKworLyogQWZ0ZXIgTGludXggMi42LjksCisgKiBWTEFOIG1vZHVsZSB1c2UgUHJpdmF0ZSAoZnJvbSB1c2VyKSBpbnRlcmZhY2UgZmxhZ3MgKG5ldGRldmljZS0+cHJpdl9mbGFncykuCisgKiAjZGVmaW5lIElGRl84MDJfMVFfVkxBTiAweDEgICAgICAgICAtLSAgICA4MDIuMVEgVkxBTiBkZXZpY2UuICBpbiBpZi5oCisgKiByZWYgdG8gaXBfc2Fib3RhZ2Vfb3V0KCkgWyBvdXQtPnByaXZfZmxhZ3MgJiBJRkZfODAyXzFRX1ZMQU4gXSBpbiBicl9uZXRmaWx0ZXIuYworICoKKyAqIEZvciB0aGlzIHJlYXNvbiwgd2UgTVVTVCB1c2UgRVZFTiB2YWx1ZSBpbiBwcml2X2ZsYWdzCisgKi8KKyNkZWZpbmUgSU5UX01BSU4gICAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBJTlRfTUJTU0lEICAgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIElOVF9XRFMgICAgICAgICAgICAgICAgICAgICAweDAzMDAKKyNkZWZpbmUgSU5UX0FQQ0xJICAgICAgICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBJTlRfTUVTSCAgICAgICAgICAgICAgICAgICAJMHgwNTAwCisKKy8vIFVzZSBiaXRtYXAgdG8gYWxsb3cgY29leGlzdCBvZiBBVEVfVFhGUkFNRSBhbmQgQVRFX1JYRlJBTUUoaS5lLix0byBzdXBwb3J0IExvb3BCYWNrIG1vZGUpCisjaWZkZWYgUkFMSU5LX0FURQorI2RlZmluZQlBVEVfU1RBUlQgICAgICAgICAgICAgICAgICAgMHgwMCAgIC8vIFN0YXJ0IEFURQorI2RlZmluZQlBVEVfU1RPUCAgICAgICAgICAgICAgICAgICAgMHg4MCAgIC8vIFN0b3AgQVRFCisjZGVmaW5lCUFURV9UWENPTlQgICAgICAgICAgICAgICAgICAweDA1ICAgLy8gQ29udGludW91cyBUcmFuc21pdAorI2RlZmluZQlBVEVfVFhDQVJSICAgICAgICAgICAgICAgICAgMHgwOSAgIC8vIFRyYW5zbWl0IENhcnJpZXIKKyNkZWZpbmUJQVRFX1RYQ0FSUlNVUFAgICAgICAgICAgICAgIDB4MTEgICAvLyBUcmFuc21pdCBDYXJyaWVyIFN1cHByZXNzaW9uCisjZGVmaW5lCUFURV9UWEZSQU1FICAgICAgICAgICAgICAgICAweDAxICAgLy8gVHJhbnNtaXQgRnJhbWVzCisjZGVmaW5lCUFURV9SWEZSQU1FICAgICAgICAgICAgICAgICAweDAyICAgLy8gUmVjZWl2ZSBGcmFtZXMKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorI2RlZmluZSBBVEVfVFhTVE9QICAgICAgICAgICAgICAgICAgMHhlMiAgIC8vIFN0b3AgVHJhbnNtaXRpb24oaS5lLiwgVFhDT05ULCBUWENBUlIsIFRYQ0FSUlNVUFAsIGFuZCBUWEZSQU1FKQorI2RlZmluZSBBVEVfUlhTVE9QCQkJCQkweGZkICAgLy8gU3RvcCByZWNlaXZpbmcgRnJhbWVzCisjZGVmaW5lCUJCUDIyX1RYRlJBTUUgICAgIAkJCTB4MDAgICAvLyBUcmFuc21pdCBGcmFtZXMKKyNkZWZpbmUJQkJQMjJfVFhDT05UX09SX0NBUlJTVVBQICAgIDB4ODAgICAvLyBDb250aW51b3VzIFRyYW5zbWl0IG9yIENhcnJpZXIgU3VwcHJlc3Npb24KKyNkZWZpbmUJQkJQMjJfVFhDQVJSICAgICAgICAgICAgICAgIDB4YzEgICAvLyBUcmFuc21pdCBDYXJyaWVyCisjZGVmaW5lCUJCUDI0X1RYQ09OVCAgICAgICAgICAgICAgICAweDAwICAgLy8gQ29udGludW91cyBUcmFuc21pdAorI2RlZmluZQlCQlAyNF9DQVJSU1VQUCAgICAgICAgICAgICAgMHgwMSAgIC8vIENhcnJpZXIgU3VwcHJlc3Npb24KKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworLy8gV0VQIEtleSBUWVBFCisjZGVmaW5lIFdFUF9IRVhBREVDSU1BTF9UWVBFICAgIDAKKyNkZWZpbmUgV0VQX0FTQ0lJX1RZUEUgICAgICAgICAgMQorCisKKworLy8gV0lSRUxFU1MgRVZFTlRTIGRlZmluaXRpb24KKy8qIE1heCBudW1iZXIgb2YgY2hhciBpbiBjdXN0b20gZXZlbnQsIHJlZmVyIHRvIHdpcmVsZXNzX3Rvb2xzLjI4L3dpcmVsZXNzLjIwLmggKi8KKyNkZWZpbmUgSVdfQ1VTVE9NX01BWF9MRU4JCQkJICAJCQkyNTUJLyogSW4gYnl0ZXMgKi8KKworLy8gRm9yIHN5c3RlbSBldmVudCAtIHN0YXJ0CisjZGVmaW5lCUlXX1NZU19FVkVOVF9GTEFHX1NUQVJUICAgICAgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lCUlXX0FTU09DX0VWRU5UX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lCUlXX0RJU0FTU09DX0VWRU5UX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgMHgwMjAxCisjZGVmaW5lCUlXX0RFQVVUSF9FVkVOVF9GTEFHICAgICAgICAgICAgICAgICAgICAgIAkweDAyMDIKKyNkZWZpbmUJSVdfQUdFT1VUX0VWRU5UX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgCTB4MDIwMworI2RlZmluZQlJV19DT1VOVEVSX01FQVNVUkVTX0VWRU5UX0ZMQUcgICAgICAgICAgICAgIDB4MDIwNAorI2RlZmluZQlJV19SRVBMQVlfQ09VTlRFUl9ESUZGX0VWRU5UX0ZMQUcgICAgICAgICAgIDB4MDIwNQorI2RlZmluZQlJV19SU05JRV9ESUZGX0VWRU5UX0ZMQUcgICAgICAgICAgIAkJCTB4MDIwNgorI2RlZmluZQlJV19NSUNfRElGRl9FVkVOVF9GTEFHICAgICAgICAgICAJCQkweDAyMDcKKyNkZWZpbmUgSVdfSUNWX0VSUk9SX0VWRU5UX0ZMQUcJCQkJCQkweDAyMDgKKyNkZWZpbmUgSVdfTUlDX0VSUk9SX0VWRU5UX0ZMQUcJCQkJCQkweDAyMDkKKyNkZWZpbmUgSVdfR1JPVVBfSFNfVElNRU9VVF9FVkVOVF9GTEFHCQkJCTB4MDIwQQorI2RlZmluZQlJV19QQUlSV0lTRV9IU19USU1FT1VUX0VWRU5UX0ZMQUcJCQkweDAyMEIKKyNkZWZpbmUgSVdfUlNOSUVfU0FOSVRZX0ZBSUxfRVZFTlRfRkxBRwkJCQkweDAyMEMKKyNkZWZpbmUgSVdfU0VUX0tFWV9ET05FX1dQQTFfRVZFTlRfRkxBRwkJCQkweDAyMEQKKyNkZWZpbmUgSVdfU0VUX0tFWV9ET05FX1dQQTJfRVZFTlRfRkxBRwkJCQkweDAyMEUKKyNkZWZpbmUgSVdfU1RBX0xJTktVUF9FVkVOVF9GTEFHCQkJCQkweDAyMEYKKyNkZWZpbmUgSVdfU1RBX0xJTktET1dOX0VWRU5UX0ZMQUcJCQkJCTB4MDIxMAorI2RlZmluZSBJV19TQ0FOX0NPTVBMRVRFRF9FVkVOVF9GTEFHCQkJCTB4MDIxMQorI2RlZmluZSBJV19TQ0FOX0VOUVVFVUVfRkFJTF9FVkVOVF9GTEFHCQkJCTB4MDIxMgorLy8gaWYgYWRkIG5ldyBzeXN0ZW0gZXZlbnQgZmxhZywgcGxlYXNlIHVwYWR0ZSB0aGUgSVdfU1lTX0VWRU5UX0ZMQUdfRU5ECisjZGVmaW5lCUlXX1NZU19FVkVOVF9GTEFHX0VORCAgICAgICAgICAgICAgICAgICAgICAgMHgwMjEyCisjZGVmaW5lCUlXX1NZU19FVkVOVF9UWVBFX05VTQkJCQkJCShJV19TWVNfRVZFTlRfRkxBR19FTkQgLSBJV19TWVNfRVZFTlRfRkxBR19TVEFSVCArIDEpCisvLyBGb3Igc3lzdGVtIGV2ZW50IC0gZW5kCisKKy8vIEZvciBzcG9vZiBhdHRhY2sgZXZlbnQgLSBzdGFydAorI2RlZmluZQlJV19TUE9PRl9FVkVOVF9GTEFHX1NUQVJUICAgICAgICAgICAgICAgICAgIDB4MDMwMAorI2RlZmluZSBJV19DT05GTElDVF9TU0lEX0VWRU5UX0ZMQUcJCQkJCTB4MDMwMAorI2RlZmluZSBJV19TUE9PRl9BU1NPQ19SRVNQX0VWRU5UX0ZMQUcJCQkJMHgwMzAxCisjZGVmaW5lIElXX1NQT09GX1JFQVNTT0NfUkVTUF9FVkVOVF9GTEFHCQkJMHgwMzAyCisjZGVmaW5lIElXX1NQT09GX1BST0JFX1JFU1BfRVZFTlRfRkxBRwkJCQkweDAzMDMKKyNkZWZpbmUgSVdfU1BPT0ZfQkVBQ09OX0VWRU5UX0ZMQUcJCQkJCTB4MDMwNAorI2RlZmluZSBJV19TUE9PRl9ESVNBU1NPQ19FVkVOVF9GTEFHCQkJCTB4MDMwNQorI2RlZmluZSBJV19TUE9PRl9BVVRIX0VWRU5UX0ZMQUcJCQkJCTB4MDMwNgorI2RlZmluZSBJV19TUE9PRl9ERUFVVEhfRVZFTlRfRkxBRwkJCQkJMHgwMzA3CisjZGVmaW5lIElXX1NQT09GX1VOS05PV05fTUdNVF9FVkVOVF9GTEFHCQkJMHgwMzA4CisjZGVmaW5lIElXX1JFUExBWV9BVFRBQ0tfRVZFTlRfRkxBRwkJCQkJMHgwMzA5CisvLyBpZiBhZGQgbmV3IHNwb29mIGF0dGFjayBldmVudCBmbGFnLCBwbGVhc2UgdXBhZHRlIHRoZSBJV19TUE9PRl9FVkVOVF9GTEFHX0VORAorI2RlZmluZQlJV19TUE9PRl9FVkVOVF9GTEFHX0VORCAgICAgICAgICAgICAgICAgICAgIDB4MDMwOQorI2RlZmluZQlJV19TUE9PRl9FVkVOVF9UWVBFX05VTQkJCQkJCShJV19TUE9PRl9FVkVOVF9GTEFHX0VORCAtIElXX1NQT09GX0VWRU5UX0ZMQUdfU1RBUlQgKyAxKQorLy8gRm9yIHNwb29mIGF0dGFjayBldmVudCAtIGVuZAorCisvLyBGb3IgZmxvb2RpbmcgYXR0YWNrIGV2ZW50IC0gc3RhcnQKKyNkZWZpbmUJSVdfRkxPT0RfRVZFTlRfRkxBR19TVEFSVCAgICAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgSVdfRkxPT0RfQVVUSF9FVkVOVF9GTEFHCQkJCQkweDA0MDAKKyNkZWZpbmUgSVdfRkxPT0RfQVNTT0NfUkVRX0VWRU5UX0ZMQUcJCQkJMHgwNDAxCisjZGVmaW5lIElXX0ZMT09EX1JFQVNTT0NfUkVRX0VWRU5UX0ZMQUcJCQkJMHgwNDAyCisjZGVmaW5lIElXX0ZMT09EX1BST0JFX1JFUV9FVkVOVF9GTEFHCQkJCTB4MDQwMworI2RlZmluZSBJV19GTE9PRF9ESVNBU1NPQ19FVkVOVF9GTEFHCQkJCTB4MDQwNAorI2RlZmluZSBJV19GTE9PRF9ERUFVVEhfRVZFTlRfRkxBRwkJCQkJMHgwNDA1CisjZGVmaW5lIElXX0ZMT09EX0VBUF9SRVFfRVZFTlRfRkxBRwkJCQkJMHgwNDA2CisvLyBpZiBhZGQgbmV3IGZsb29kaW5nIGF0dGFjayBldmVudCBmbGFnLCBwbGVhc2UgdXBhZHRlIHRoZSBJV19GTE9PRF9FVkVOVF9GTEFHX0VORAorI2RlZmluZQlJV19GTE9PRF9FVkVOVF9GTEFHX0VORCAgICAgICAgICAgICAgICAgICAJMHgwNDA2CisjZGVmaW5lCUlXX0ZMT09EX0VWRU5UX1RZUEVfTlVNCQkJCQkJKElXX0ZMT09EX0VWRU5UX0ZMQUdfRU5EIC0gSVdfRkxPT0RfRVZFTlRfRkxBR19TVEFSVCArIDEpCisvLyBGb3IgZmxvb2RpbmcgYXR0YWNrIC0gZW5kCisKKy8vIEVuZCAtIFdJUkVMRVNTIEVWRU5UUyBkZWZpbml0aW9uCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKy8vIGRlZmluaXRpb24gZm9yIERMUywga2F0aHkKKyNkZWZpbmUJTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWSAgIDEKKyNkZWZpbmUJTUFYX05VTV9PRl9ETFNfRU5UUlkgICAgICAgIE1BWF9OVU1CRVJfT0ZfRExTX0VOVFJZCisKKy8vQmxvY2sgQUNLICwgcnQyODYwLCBrYXRoeQorI2RlZmluZSBNQVhfVFhfUkVPUkRFUkJVRgkJNjQKKyNkZWZpbmUgTUFYX1JYX1JFT1JERVJCVUYJCTY0CisjZGVmaW5lIERFRkFVTFRfVFhfVElNRU9VVAkJMzAKKyNkZWZpbmUgREVGQVVMVF9SWF9USU1FT1VUCQkzMAorI2lmbmRlZiBDT05GSUdfQVBfU1VQUE9SVAorI2RlZmluZSBNQVhfQkFSRUNJX1NFU1NJT04JCTgKKyNlbmRpZgorCisjaWZuZGVmIElXX0VTU0lEX01BWF9TSVpFCisvKiBNYXhpbXVtIHNpemUgb2YgdGhlIEVTU0lEIGFuZCBwQWQtPm5pY2tuYW1lIHN0cmluZ3MgKi8KKyNkZWZpbmUgSVdfRVNTSURfTUFYX1NJWkUgICAJCTMyCisjZW5kaWYKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIE1DQVNUX1JBVEVfU1BFQ0lGSUMKKyNkZWZpbmUgTUNBU1RfRElTQUJMRQkwCisjZGVmaW5lIE1DQVNUX0NDSwkJMQorI2RlZmluZSBNQ0FTVF9PRkRNCQkyCisjZGVmaW5lIE1DQVNUX0hUTUlYCQkzCisjZW5kaWYgLy8gTUNBU1RfUkFURV9TUEVDSUZJQyAvLworCisvLyBGb3IgQXNpY1JhZGlvT2ZmL0FzaWNSYWRpb09uIGZ1bmN0aW9uCisjZGVmaW5lIERPVDExUE9XRVJTQVZFCQkwCisjZGVmaW5lIEdVSVJBRElPX09GRgkJMQorI2RlZmluZSBSVE1QX0hBTFQJCSAgICAyCisjZGVmaW5lIEdVSV9JRExFX1BPV0VSX1NBVkUJCTMKKy8vIC0tCisKKworLy8gZGVmaW5pdGlvbiBmb3IgV3BhU3VwcG9ydCBmbGFnCisjZGVmaW5lIFdQQV9TVVBQTElDQU5UX0RJU0FCTEUJCQkJMAorI2RlZmluZSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUJCQkJMQorI2RlZmluZQlXUEFfU1VQUExJQ0FOVF9FTkFCTEVfV0lUSF9XRUJfVUkJMgorCisvLyBFbmRpYW4gYnl0ZSBzd2FwcGluZyBjb2RlcworI2RlZmluZSBTV0FQMTYoeCkgXAorICAgICgoVUlOVDE2KSggXAorICAgICgoKFVJTlQxNikoeCkgJiAoVUlOVDE2KSAweDAwZmZVKSA8PCA4KSB8IFwKKyAgICAoKChVSU5UMTYpKHgpICYgKFVJTlQxNikgMHhmZjAwVSkgPj4gOCkgKSkKKworI2RlZmluZSBTV0FQMzIoeCkgXAorICAgICgoVUlOVDMyKSggXAorICAgICgoKFVJTlQzMikoeCkgJiAoVUlOVDMyKSAweDAwMDAwMGZmVUwpIDw8IDI0KSB8IFwKKyAgICAoKChVSU5UMzIpKHgpICYgKFVJTlQzMikgMHgwMDAwZmYwMFVMKSA8PCAgOCkgfCBcCisgICAgKCgoVUlOVDMyKSh4KSAmIChVSU5UMzIpIDB4MDBmZjAwMDBVTCkgPj4gIDgpIHwgXAorICAgICgoKFVJTlQzMikoeCkgJiAoVUlOVDMyKSAweGZmMDAwMDAwVUwpID4+IDI0KSApKQorCisjZGVmaW5lIFNXQVA2NCh4KSBcCisgICAgKChVSU5UNjQpKCBcCisgICAgKFVJTlQ2NCkoKChVSU5UNjQpKHgpICYgKFVJTlQ2NCkgMHgwMDAwMDAwMDAwMDAwMGZmVUxMKSA8PCA1NikgfCBcCisgICAgKFVJTlQ2NCkoKChVSU5UNjQpKHgpICYgKFVJTlQ2NCkgMHgwMDAwMDAwMDAwMDBmZjAwVUxMKSA8PCA0MCkgfCBcCisgICAgKFVJTlQ2NCkoKChVSU5UNjQpKHgpICYgKFVJTlQ2NCkgMHgwMDAwMDAwMDAwZmYwMDAwVUxMKSA8PCAyNCkgfCBcCisgICAgKFVJTlQ2NCkoKChVSU5UNjQpKHgpICYgKFVJTlQ2NCkgMHgwMDAwMDAwMGZmMDAwMDAwVUxMKSA8PCAgOCkgfCBcCisgICAgKFVJTlQ2NCkoKChVSU5UNjQpKHgpICYgKFVJTlQ2NCkgMHgwMDAwMDBmZjAwMDAwMDAwVUxMKSA+PiAgOCkgfCBcCisgICAgKFVJTlQ2NCkoKChVSU5UNjQpKHgpICYgKFVJTlQ2NCkgMHgwMDAwZmYwMDAwMDAwMDAwVUxMKSA+PiAyNCkgfCBcCisgICAgKFVJTlQ2NCkoKChVSU5UNjQpKHgpICYgKFVJTlQ2NCkgMHgwMGZmMDAwMDAwMDAwMDAwVUxMKSA+PiA0MCkgfCBcCisgICAgKFVJTlQ2NCkoKChVSU5UNjQpKHgpICYgKFVJTlQ2NCkgMHhmZjAwMDAwMDAwMDAwMDAwVUxMKSA+PiA1NikgKSkKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKworI2RlZmluZSBjcHUybGU2NCh4KSBTV0FQNjQoKHgpKQorI2RlZmluZSBsZTJjcHU2NCh4KSBTV0FQNjQoKHgpKQorI2RlZmluZSBjcHUybGUzMih4KSBTV0FQMzIoKHgpKQorI2RlZmluZSBsZTJjcHUzMih4KSBTV0FQMzIoKHgpKQorI2RlZmluZSBjcHUybGUxNih4KSBTV0FQMTYoKHgpKQorI2RlZmluZSBsZTJjcHUxNih4KSBTV0FQMTYoKHgpKQorI2RlZmluZSBjcHUyYmU2NCh4KSAoKFVJTlQ2NCkoeCkpCisjZGVmaW5lIGJlMmNwdTY0KHgpICgoVUlOVDY0KSh4KSkKKyNkZWZpbmUgY3B1MmJlMzIoeCkgKChVSU5UMzIpKHgpKQorI2RlZmluZSBiZTJjcHUzMih4KSAoKFVJTlQzMikoeCkpCisjZGVmaW5lIGNwdTJiZTE2KHgpICgoVUlOVDE2KSh4KSkKKyNkZWZpbmUgYmUyY3B1MTYoeCkgKChVSU5UMTYpKHgpKQorCisjZWxzZSAgIC8vIExpdHRsZV9FbmRpYW4KKworI2RlZmluZSBjcHUybGU2NCh4KSAoKFVJTlQ2NCkoeCkpCisjZGVmaW5lIGxlMmNwdTY0KHgpICgoVUlOVDY0KSh4KSkKKyNkZWZpbmUgY3B1MmxlMzIoeCkgKChVSU5UMzIpKHgpKQorI2RlZmluZSBsZTJjcHUzMih4KSAoKFVJTlQzMikoeCkpCisjZGVmaW5lIGNwdTJsZTE2KHgpICgoVUlOVDE2KSh4KSkKKyNkZWZpbmUgbGUyY3B1MTYoeCkgKChVSU5UMTYpKHgpKQorI2RlZmluZSBjcHUyYmU2NCh4KSBTV0FQNjQoKHgpKQorI2RlZmluZSBiZTJjcHU2NCh4KSBTV0FQNjQoKHgpKQorI2RlZmluZSBjcHUyYmUzMih4KSBTV0FQMzIoKHgpKQorI2RlZmluZSBiZTJjcHUzMih4KSBTV0FQMzIoKHgpKQorI2RlZmluZSBjcHUyYmUxNih4KSBTV0FQMTYoKHgpKQorI2RlZmluZSBiZTJjcHUxNih4KSBTV0FQMTYoKHgpKQorCisjZW5kaWYgIC8vIFJUX0JJR19FTkRJQU4KKworI2VuZGlmICAvLyBfX1JUTVBfREVGX0hfXworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF90eXBlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfdHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZDdkZjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfdHlwZS5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgcnRtcF90eXBlLmgKKworICAgIEFic3RyYWN0OgorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgTmFtZSAgICAgICAgRGF0ZSAgICAgICAgICAgIE1vZGlmaWNhdGlvbiBsb2dzCisgICAgUGF1bCBMaW4gICAgMS0yLTIwMDQKKyovCisjaWZuZGVmIF9fUlRNUF9UWVBFX0hfXworI2RlZmluZSBfX1JUTVBfVFlQRV9IX18KKworI2RlZmluZSBQQUNLRUQgIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKQorCisvLyBQdXQgcGxhdGZvcm0gZGVwZW5kZW50IGRlY2xhcmF0aW9uIGhlcmUKKy8vIEZvciBleGFtcGxlLCBsaW51eCB0eXBlIGRlZmluaXRpb24KK3R5cGVkZWYgdW5zaWduZWQgY2hhcgkJVUlOVDg7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CQlVSU5UMTY7Cit0eXBlZGVmIHVuc2lnbmVkIGludAkJVUlOVDMyOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcJVUlOVDY0OwordHlwZWRlZiBpbnQJCQkJCUlOVDMyOwordHlwZWRlZiBsb25nIGxvbmcgCQkJSU5UNjQ7CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAqCQkJUFVJTlQ4OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAqCQlQVUlOVDE2OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgKgkJCVBVSU5UMzI7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyAqCVBVSU5UNjQ7Cit0eXBlZGVmIGludAkqCQkJCQlQSU5UMzI7Cit0eXBlZGVmIGxvbmcgbG9uZyAqIAkJCVBJTlQ2NDsKKwordHlwZWRlZiBzaWduZWQgY2hhcgkJCUNIQVI7Cit0eXBlZGVmIHNpZ25lZCBzaG9ydAkJU0hPUlQ7Cit0eXBlZGVmIHNpZ25lZCBpbnQJCQlJTlQ7Cit0eXBlZGVmIHNpZ25lZCBsb25nCQkJTE9ORzsKK3R5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZwlMT05HTE9ORzsKKworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIJCVVDSEFSOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAkJVVNIT1JUOwordHlwZWRlZiB1bnNpZ25lZCBpbnQJCVVJTlQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcJCVVMT05HOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcJVUxPTkdMT05HOworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIJCUJPT0xFQU47Cit0eXBlZGVmIHZvaWQJCQkJVk9JRDsKKwordHlwZWRlZiBWT0lEICoJCQkJUFZPSUQ7Cit0eXBlZGVmIENIQVIgKgkJCQlQQ0hBUjsKK3R5cGVkZWYgVUNIQVIgKiAJCQlQVUNIQVI7Cit0eXBlZGVmIFVTSE9SVCAqCQkJUFVTSE9SVDsKK3R5cGVkZWYgTE9ORyAqCQkJCVBMT05HOwordHlwZWRlZiBVTE9ORyAqCQkJCVBVTE9ORzsKK3R5cGVkZWYgVUlOVCAqCQkJCVBVSU5UOworCit0eXBlZGVmIHVuc2lnbmVkIGludAlORElTX01FRElBX1NUQVRFOworCit0eXBlZGVmIHVuaW9uIF9MQVJHRV9JTlRFR0VSIHsKKyAgICBzdHJ1Y3QgeworICAgICAgICBVSU5UIExvd1BhcnQ7CisgICAgICAgIElOVDMyIEhpZ2hQYXJ0OworICAgIH0gdTsKKyAgICBJTlQ2NCBRdWFkUGFydDsKK30gTEFSR0VfSU5URUdFUjsKKworI2VuZGlmICAvLyBfX1JUTVBfVFlQRV9IX18KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zcGVjdHJ1bS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zcGVjdHJ1bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZjI1ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3NwZWN0cnVtLmgKQEAgLTAsMCArMSwzMjIgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2lmbmRlZiBfX1NQRUNUUlVNX0hfXworI2RlZmluZSBfX1NQRUNUUlVNX0hfXworCisjaW5jbHVkZSAicnRtcF90eXBlLmgiCisjaW5jbHVkZSAic3BlY3RydW1fZGVmLmgiCisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfVFBDX1JFUE9SVF9JTkZPCit7CisJVUlOVDggVHhQd3I7CisJVUlOVDggTGlua01hcmdpbjsKK30gVFBDX1JFUE9SVF9JTkZPLCAqUFRQQ19SRVBPUlRfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9DSF9TV19BTk5fSU5GTworeworCVVJTlQ4IENoU3dNb2RlOworCVVJTlQ4IENoYW5uZWw7CisJVUlOVDggQ2hTd0NudDsKK30gQ0hfU1dfQU5OX0lORk8sICpQQ0hfU1dfQU5OX0lORk87CisKK3R5cGVkZWYgdW5pb24gUEFDS0VEIF9NRUFTVVJFX1JFUV9NT0RFCit7CisjaWZkZWYgUlRfQklHX0VORElBTgorCXN0cnVjdCBQQUNLRUQKKwl7CisJCVVJTlQ4IFJldjE6NDsKKwkJVUlOVDggUmVwb3J0OjE7CisJCVVJTlQ4IFJlcXVlc3Q6MTsKKwkJVUlOVDggRW5hYmxlOjE7CisJCVVJTlQ4IFJldjA6MTsKKwl9IGZpZWxkOworI2Vsc2UKKwlzdHJ1Y3QgUEFDS0VECisJeworCQlVSU5UOCBSZXYwOjE7CisJCVVJTlQ4IEVuYWJsZToxOworCQlVSU5UOCBSZXF1ZXN0OjE7CisJCVVJTlQ4IFJlcG9ydDoxOworCQlVSU5UOCBSZXYxOjQ7CisJfSBmaWVsZDsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisJVUlOVDggd29yZDsKK30gTUVBU1VSRV9SRVFfTU9ERSwgKlBNRUFTVVJFX1JFUV9NT0RFOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX01FQVNVUkVfUkVRCit7CisJVUlOVDggQ2hOdW07CisJVUlOVDY0IE1lYXN1cmVTdGFydFRpbWU7CisJVUlOVDE2IE1lYXN1cmVEdXJhdGlvbjsKK30gTUVBU1VSRV9SRVEsICpQTUVBU1VSRV9SRVE7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTUVBU1VSRV9SRVFfSU5GTworeworCVVJTlQ4IFRva2VuOworCU1FQVNVUkVfUkVRX01PREUgUmVxTW9kZTsKKwlVSU5UOCBSZXFUeXBlOworCU1FQVNVUkVfUkVRIE1lYXN1cmVSZXE7Cit9IE1FQVNVUkVfUkVRX0lORk8sICpQTUVBU1VSRV9SRVFfSU5GTzsKKwordHlwZWRlZiB1bmlvbiBQQUNLRUQgX01FQVNVUkVfQkFTSUNfUkVQT1JUX01BUAoreworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlzdHJ1Y3QgUEFDS0VECisJeworCQlVSU5UOCBSZXY6MzsKKwkJVUlOVDggVW5tZWFzdXJlOjE7CisJCVVJTlQ4IFJhZGFyOjE7CisJCVVJTlQ4IFVuaWRlbnRpZmllZFNpZ25hbDoxOworCQlVSU5UOCBPZmRtUHJlYW1ibGU6MTsKKwkJVUlOVDggQlNTOjE7CisJfSBmaWVsZDsKKyNlbHNlCisJc3RydWN0IFBBQ0tFRAorCXsKKwkJVUlOVDggQlNTOjE7CisJCVVJTlQ4IE9mZG1QcmVhbWJsZToxOworCQlVSU5UOCBVbmlkZW50aWZpZWRTaWduYWw6MTsKKwkJVUlOVDggUmFkYXI6MTsKKwkJVUlOVDggVW5tZWFzdXJlOjE7CisJCVVJTlQ4IFJldjozOworCX0gZmllbGQ7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCVVJTlQ4IHdvcmQ7Cit9IE1FQVNVUkVfQkFTSUNfUkVQT1JUX01BUCwgKlBNRUFTVVJFX0JBU0lDX1JFUE9SVF9NQVA7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTUVBU1VSRV9CQVNJQ19SRVBPUlQKK3sKKwlVSU5UOCBDaE51bTsKKwlVSU5UNjQgTWVhc3VyZVN0YXJ0VGltZTsKKwlVSU5UMTYgTWVhc3VyZUR1cmF0aW9uOworCU1FQVNVUkVfQkFTSUNfUkVQT1JUX01BUCBNYXA7Cit9IE1FQVNVUkVfQkFTSUNfUkVQT1JULCAqUE1FQVNVUkVfQkFTSUNfUkVQT1JUOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX01FQVNVUkVfQ0NBX1JFUE9SVAoreworCVVJTlQ4IENoTnVtOworCVVJTlQ2NCBNZWFzdXJlU3RhcnRUaW1lOworCVVJTlQxNiBNZWFzdXJlRHVyYXRpb247CisJVUlOVDggQ0NBX0J1c3lfRnJhY3Rpb247Cit9IE1FQVNVUkVfQ0NBX1JFUE9SVCwgKlBNRUFTVVJFX0NDQV9SRVBPUlQ7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTUVBU1VSRV9SUElfUkVQT1JUCit7CisJVUlOVDggQ2hOdW07CisJVUlOVDY0IE1lYXN1cmVTdGFydFRpbWU7CisJVUlOVDE2IE1lYXN1cmVEdXJhdGlvbjsKKwlVSU5UOCBSUElfRGVuc2l0eVs4XTsKK30gTUVBU1VSRV9SUElfUkVQT1JULCAqUE1FQVNVUkVfUlBJX1JFUE9SVDsKKwordHlwZWRlZiB1bmlvbiBQQUNLRUQgX01FQVNVUkVfUkVQT1JUX01PREUKK3sKKwlzdHJ1Y3QgUEFDS0VECisJeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJVUlOVDggUmV2OjU7CisJCVVJTlQ4IFJlZnVzZWQ6MTsKKwkJVUlOVDggSW5jYXBhYmxlOjE7CisJCVVJTlQ4IExhdGU6MTsKKyNlbHNlCisJCVVJTlQ4IExhdGU6MTsKKwkJVUlOVDggSW5jYXBhYmxlOjE7CisJCVVJTlQ4IFJlZnVzZWQ6MTsKKwkJVUlOVDggUmV2OjU7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCX0gZmllbGQ7CisJVUlOVDggd29yZDsKK30gTUVBU1VSRV9SRVBPUlRfTU9ERSwgKlBNRUFTVVJFX1JFUE9SVF9NT0RFOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX01FQVNVUkVfUkVQT1JUX0lORk8KK3sKKwlVSU5UOCBUb2tlbjsKKwlNRUFTVVJFX1JFUE9SVF9NT0RFIFJlcG9ydE1vZGU7CisJVUlOVDggUmVwb3J0VHlwZTsKKwlVSU5UOCBPY3RlY3RbMF07Cit9IE1FQVNVUkVfUkVQT1JUX0lORk8sICpQTUVBU1VSRV9SRVBPUlRfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9RVUlFVF9JTkZPCit7CisJVUlOVDggUXVpZXRDbnQ7CisJVUlOVDggUXVpZXRQZXJpb2Q7CisJVUlOVDggUXVpZXREdXJhdGlvbjsKKwlVSU5UOCBRdWlldE9mZnNldDsKK30gUVVJRVRfSU5GTywgKlBRVUlFVF9JTkZPOworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVByZXBhcmUgTWVhc3VyZW1lbnQgcmVxdWVzdCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bworCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCisJUGFyYW1ldHJzOgorCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEVucXVldWVNZWFzdXJlbWVudFJlcSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcERBLAorCUlOIFVJTlQ4IE1lYXN1cmVUb2tlbiwKKwlJTiBVSU5UOCBNZWFzdXJlUmVxTW9kZSwKKwlJTiBVSU5UOCBNZWFzdXJlUmVxVHlwZSwKKwlJTiBVSU5UOCBNZWFzdXJlQ2gsCisJSU4gVUlOVDE2IE1lYXN1cmVEdXJhdGlvbik7CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBNZWFzdXJlbWVudCByZXBvcnQgYWN0aW9uIGZyYW1lIGFuZCBlbnF1ZXVlIGl0IGludG8KKwkJbWFuYWdlbWVudCBxdWV1ZSB3YWl0aW5nIGZvciB0cmFuc21pdGlvbi4KKworCVBhcmFtZXRyczoKKwkJMS4gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZS4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBFbnF1ZXVlTWVhc3VyZW1lbnRSZXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBVSU5UOCBEaWFsb2dUb2tlbiwKKwlJTiBVSU5UOCBNZWFzdXJlVG9rZW4sCisJSU4gVUlOVDggTWVhc3VyZVJlcU1vZGUsCisJSU4gVUlOVDggTWVhc3VyZVJlcVR5cGUsCisJSU4gVUlOVDggUmVwb3J0SW5mb0xlbiwKKwlJTiBQVUlOVDggcFJlcG9ydEluZm8pOworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVByZXBhcmUgVFBDIFJlcXVlc3QgYWN0aW9uIGZyYW1lIGFuZCBlbnF1ZXVlIGl0IGludG8KKwkJbWFuYWdlbWVudCBxdWV1ZSB3YWl0aW5nIGZvciB0cmFuc21pdGlvbi4KKworCVBhcmFtZXRyczoKKwkJMS4gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZS4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBFbnF1ZXVlVFBDUmVxKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBwREEsCisJSU4gVUNIQVIgRGlhbG9nVG9rZW4pOworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVByZXBhcmUgVFBDIFJlcG9ydCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bworCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCisJUGFyYW1ldHJzOgorCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEVucXVldWVUUENSZXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBVSU5UOCBEaWFsb2dUb2tlbiwKKwlJTiBVSU5UOCBUeFB3ciwKKwlJTiBVSU5UOCBMaW5rTWFyZ2luKTsKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlQcmVwYXJlIENoYW5uZWwgU3dpdGNoIEFubm91bmNlbWVudCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bworCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCisJUGFyYW1ldHJzOgorCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgorCQkyLiBDaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgbW9kZS4KKwkJMi4gYSBOZXcgc2VsZWN0ZWQgY2hhbm5lbC4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBFbnF1ZXVlQ2hTd0FubigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcERBLAorCUlOIFVJTlQ4IENoU3dNb2RlLAorCUlOIFVJTlQ4IE5ld0NoKTsKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlTcGVjdHJ1biBhY3Rpb24gZnJhbWVzIEhhbmRsZXIgc3VjaCBhcyBjaGFubmVsIHN3aXRjaCBhbm5vdWNlbWVudCwKKwkJbWVhc3VyZW1lbnQgcmVwb3J0LCBtZWFzdXJlbWVudCByZXF1ZXN0IGFjdGlvbnMgZnJhbWVzLgorCisJUGFyYW1ldHJzOgorCQlFbG1lIC0gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUGVlclNwZWN0cnVtQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCVBhcmFtZXRyczoKKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworSU5UIFNldF9NZWFzdXJlUmVxX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9UcGNSZXFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitWT0lEIE1lYXN1cmVSZXFUYWJJbml0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBNZWFzdXJlUmVxVGFiRXhpdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgVHBjUmVxVGFiSW5pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgVHBjUmVxVGFiRXhpdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgTm90aWZ5Q2hTd0FublRvUGVlckFQcygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcFJBLAorCUlOIFBVQ0hBUiBwVEEsCisJSU4gVUlOVDggQ2hTd01vZGUsCisJSU4gVUlOVDggQ2hhbm5lbCk7CisjZW5kaWYgLy8gX19TUEVDVFJVTV9IX18gLy8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zcGVjdHJ1bV9kZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3BlY3RydW1fZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNhNDgxNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3BlY3RydW1fZGVmLmgKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKwlzcGVjdHJ1bV9kZWYuaAorCisgICAgQWJzdHJhY3Q6CisgICAgSGFuZGxlIGFzc29jaWF0aW9uIHJlbGF0ZWQgcmVxdWVzdHMgZWl0aGVyIGZyb20gV1NUQSBvciBmcm9tIGxvY2FsIE1MTUUKKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlGb25jaGkgV3UgICAgMjAwOAkgIAkgICBjcmVhdGVkIGZvciA4MDIuMTFoCisgKi8KKworI2lmbmRlZiBfX1NQRUNUUlVNX0RFRl9IX18KKyNkZWZpbmUgX19TUEVDVFJVTV9ERUZfSF9fCisKKyNkZWZpbmUgTUFYX01FQVNVUkVfUkVRX1RBQl9TSVpFCQkzCisjZGVmaW5lIE1BWF9IQVNIX01FQVNVUkVfUkVRX1RBQl9TSVpFCU1BWF9NRUFTVVJFX1JFUV9UQUJfU0laRQorCisjZGVmaW5lIE1BWF9UUENfUkVRX1RBQl9TSVpFCQkJMworI2RlZmluZSBNQVhfSEFTSF9UUENfUkVRX1RBQl9TSVpFCQlNQVhfVFBDX1JFUV9UQUJfU0laRQorCisjZGVmaW5lIE1JTl9SQ1ZfUFdSCQkJCTEwMAkJLyogTmVnYXRpdmUgdmFsdWUgKChkQm0pICovCisKKyNkZWZpbmUgUk1fVFBDX1JFUQkJCQkwCisjZGVmaW5lIFJNX01FQVNVUkVfUkVRCQkJMQorCisjZGVmaW5lIFJNX0JBU0lDCQkJCTAKKyNkZWZpbmUgUk1fQ0NBCQkJCQkxCisjZGVmaW5lIFJNX1JQSV9ISVNUT0dSQU0JCTIKKworI2RlZmluZSBUUENfUkVRX0FHRV9PVVQJCQk1MDAJCS8qIG1zICovCisjZGVmaW5lIE1RX1JFUV9BR0VfT1VUCQkJNTAwCQkvKiBtcyAqLworCisjZGVmaW5lIFRQQ19ESUFMT0dUT0tFTl9IQVNIX0lOREVYKF9EaWFsb2dUb2tlbikJKChfRGlhbG9nVG9rZW4pICUgTUFYX0hBU0hfVFBDX1JFUV9UQUJfU0laRSkKKyNkZWZpbmUgTVFfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChfRGlhbG9nVG9rZW4pCQkoKF9EaWFsb2dUb2tlbikgJSBNQVhfTUVBU1VSRV9SRVFfVEFCX1NJWkUpCisKK3R5cGVkZWYgc3RydWN0IF9NRUFTVVJFX1JFUV9FTlRSWQoreworCXN0cnVjdCBfTUVBU1VSRV9SRVFfRU5UUlkgKnBOZXh0OworCVVMT05HIGxhc3RUaW1lOworCUJPT0xFQU4JVmFsaWQ7CisJVUlOVDggRGlhbG9nVG9rZW47CisJVUlOVDggTWVhc3VyZURpYWxvZ1Rva2VuWzNdOwkvLyAwOmJhc2ljIG1lYXN1cmUsIDE6IENDQSBtZWFzdXJlLCAyOiBSUElfSGlzdG9ncmFtIG1lYXN1cmUuCit9IE1FQVNVUkVfUkVRX0VOVFJZLCAqUE1FQVNVUkVfUkVRX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCBfTUVBU1VSRV9SRVFfVEFCCit7CisJVUNIQVIgU2l6ZTsKKwlQTUVBU1VSRV9SRVFfRU5UUlkgSGFzaFtNQVhfSEFTSF9NRUFTVVJFX1JFUV9UQUJfU0laRV07CisJTUVBU1VSRV9SRVFfRU5UUlkgQ29udGVudFtNQVhfTUVBU1VSRV9SRVFfVEFCX1NJWkVdOworfSBNRUFTVVJFX1JFUV9UQUIsICpQTUVBU1VSRV9SRVFfVEFCOworCit0eXBlZGVmIHN0cnVjdCBfVFBDX1JFUV9FTlRSWQoreworCXN0cnVjdCBfVFBDX1JFUV9FTlRSWSAqcE5leHQ7CisJVUxPTkcgbGFzdFRpbWU7CisJQk9PTEVBTiBWYWxpZDsKKwlVSU5UOCBEaWFsb2dUb2tlbjsKK30gVFBDX1JFUV9FTlRSWSwgKlBUUENfUkVRX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCBfVFBDX1JFUV9UQUIKK3sKKwlVQ0hBUiBTaXplOworCVBUUENfUkVRX0VOVFJZIEhhc2hbTUFYX0hBU0hfVFBDX1JFUV9UQUJfU0laRV07CisJVFBDX1JFUV9FTlRSWSBDb250ZW50W01BWF9UUENfUkVRX1RBQl9TSVpFXTsKK30gVFBDX1JFUV9UQUIsICpQVFBDX1JFUV9UQUI7CisKKyNlbmRpZiAvLyBfX1NQRUNUUlVNX0RFRl9IX18gLy8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYWlyb25ldC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYWlyb25ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZjRhMTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9haXJvbmV0LmMKQEAgLTAsMCArMSwxMzEyIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCWFpcm9uZXQuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVBhdWwgTGluCTA0LTA2LTE1CQlJbml0aWFsCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCWFzc29jaWF0aW9uCXN0YXRlIG1hY2hpbmUgaW5pdCwJaW5jbHVkaW5nIHN0YXRlCXRyYW5zaXRpb24gYW5kIHRpbWVyIGluaXQKKwlQYXJhbWV0ZXJzOgorCQlTIC0JcG9pbnRlcgl0byB0aGUgYXNzb2NpYXRpb24gc3RhdGUgbWFjaGluZQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQJQWlyb25ldFN0YXRlTWFjaGluZUluaXQoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCVNUQVRFX01BQ0hJTkUJCSpTLAorCU9VVAlTVEFURV9NQUNISU5FX0ZVTkMJVHJhbnNbXSkKK3sKKwlTdGF0ZU1hY2hpbmVJbml0KFMsCVRyYW5zLCBNQVhfQUlST05FVF9TVEFURSwgTUFYX0FJUk9ORVRfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIEFJUk9ORVRfSURMRSwgQUlST05FVF9NQUNISU5FX0JBU0UpOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBSVJPTkVUX0lETEUsIE1UMl9BSVJPTkVUX01TRywgKFNUQVRFX01BQ0hJTkVfRlVOQylBaXJvbmV0TXNnQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUlST05FVF9JRExFLCBNVDJfQUlST05FVF9TQ0FOX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylBaXJvbmV0UmVxdWVzdEFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFJUk9ORVRfU0NBTk5JTkcsIE1UMl9BSVJPTkVUX1NDQU5fRE9ORSwgKFNUQVRFX01BQ0hJTkVfRlVOQylBaXJvbmV0UmVwb3J0QWN0aW9uKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIGlzCXN0YXRlIG1hY2hpbmUgZnVuY3Rpb24uCisJCVdoZW4gcmVjZWl2aW5nIEVBUE9MIHBhY2tldHMgd2hpY2ggaXMgIGZvciA4MDIuMXgga2V5IG1hbmFnZW1lbnQuCisJCVVzZQlib3RoIGluCVdQQSwgYW5kIFdQQVBTSwljYXNlLgorCQlJbiB0aGlzCWZ1bmN0aW9uLCBmdXJ0aGVyIGRpc3BhdGNoIHRvIGRpZmZlcmVudAlmdW5jdGlvbnMgYWNjb3JkaW5nCXRvIHRoZSByZWNlaXZlZAlwYWNrZXQuCSAzIGNhdGVnb3JpZXMgYXJlIDoKKwkJICAxLiAgbm9ybWFsIDQtd2F5IHBhaXJ3aXNla2V5IGFuZCAyLXdheSBncm91cGtleSBoYW5kc2hha2UKKwkJICAyLiAgTUlDIGVycm9yCShDb3VudGVybWVhc3VyZXMgYXR0YWNrKSAgcmVwb3J0IHBhY2tldAlmcm9tIFNUQS4KKwkJICAzLiAgUmVxdWVzdCBmb3IgcGFpcndpc2UvZ3JvdXAga2V5IHVwZGF0ZQlmcm9tIFNUQQorCVJldHVybjoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQWlyb25ldE1zZ0FjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglNTE1FX1FVRVVFX0VMRU0JKkVsZW0pCit7CisJVVNIT1JUCQkJCQkJCUxlbmd0aDsKKwlVQ0hBUgkJCQkJCQlJbmRleCwgaTsKKwlQVUNIQVIJCQkJCQkJcERhdGE7CisJUEFJUk9ORVRfUk1fUkVRVUVTVF9GUkFNRQkJcFJNUmVxOworCVBSTV9SRVFVRVNUX0FDVElPTgkJCQlwUmVxRWxlbTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tLS0tPiBBaXJvbmV0TXNnQWN0aW9uXG4iKSk7CisKKwkvLyAwLiBHZXQgQWlyb25ldCBJQVBQIGhlYWRlciBmaXJzdAorCXBSTVJlcSA9IChQQUlST05FVF9STV9SRVFVRVNUX0ZSQU1FKSAmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTFdOworCXBEYXRhICA9IChQVUNIQVIpICZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMV07CisKKwkvLyAxLiBDaGFuZ2UgZW5kaWFuIGZvcm1hdCBmb3JtIG5ldHdvcmsgdG8gbGl0dGxlIGVuZGlhbgorCUxlbmd0aCA9IGJlMmNwdTE2KHBSTVJlcS0+SUFQUC5MZW5ndGgpOworCisJLy8gMi4wIFNhbml0eSBjaGVjaywgdGhpcyBzaG91bGQgb25seSBoYXBwZW4gd2hlbiBDQ1ggMi4wIHN1cHBvcnQgaXMgZW5hYmxlZAorCWlmIChwQWQtPlN0YUNmZy5DQ1hFbmFibGUgIT0gVFJVRSkKKwkJcmV0dXJuOworCisJLy8gMi4xIFJhZGlvIG1lYXN1cmVtZW50IG11c3QgYmUgb24KKwlpZiAocEFkLT5TdGFDZmcuQ0NYQ29udHJvbC5maWVsZC5STUVuYWJsZSAhPSAxKQorCQlyZXR1cm47CisKKwkvLyAyLjIuIERlYnVnIHByaW50IGFsbCBiaXQgaW5mb3JtYXRpb24KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJQVBQIElEICYgTGVuZ3RoICVkXG4iLCBMZW5ndGgpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJQVBQIFR5cGUgJXhcbiIsIHBSTVJlcS0+SUFQUC5UeXBlKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUFQUCBTdWJUeXBlICV4XG4iLCBwUk1SZXEtPklBUFAuU3ViVHlwZSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklBUFAgRGlhbG9nIFRva2VuICV4XG4iLCBwUk1SZXEtPklBUFAuVG9rZW4pKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJQVBQIEFjdGl2YXRpb24gRGVsYXkgJXhcbiIsIHBSTVJlcS0+RGVsYXkpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJQVBQIE1lYXN1cmVtZW50IE9mZnNldCAleFxuIiwgcFJNUmVxLT5PZmZzZXQpKTsKKworCS8vIDMuIENoZWNrIElBUFAgZnJhbWUgdHlwZSwgaXQgbXVzdCBiZSAweDMyIGZvciBDaXNjbyBBaXJvbmV0IGV4dGVuc2lvbgorCWlmIChwUk1SZXEtPklBUFAuVHlwZSAhPSBBSVJPTkVUX0lBUFBfVFlQRSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIldyb25nIElBUFAgdHlwZSBmb3IgQ2lzY28gQWlyb25ldCBleHRlbnNpb25cbiIpKTsKKwkJcmV0dXJuOworCX0KKworCS8vIDQuIENoZWNrIElBUFAgZnJhbWUgc3VidHlwZSwgaXQgbXVzdCBiZSAweDAxIGZvciBDaXNjbyBBaXJvbmV0IGV4dGVuc2lvbiByZXF1ZXN0LgorCS8vICAgIFNpbmNlIHdlIGFyZSBhY3RpbmcgYXMgY2xpZW50IG9ubHksIHdlIHdpbGwgZGlzcmVnYXJkcyByZXBseSBzdWJ0eXBlLgorCWlmIChwUk1SZXEtPklBUFAuU3ViVHlwZSAhPSBBSVJPTkVUX0lBUFBfU1VCVFlQRV9SRVFVRVNUKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiV3JvbmcgSUFQUCBzdWJ0eXBlIGZvciBDaXNjbyBBaXJvbmV0IGV4dGVuc2lvblxuIikpOworCQlyZXR1cm47CisJfQorCisJLy8gNS4gVmVyaWZ5IERlc3RpbmF0aW9uIE1BQyBhbmQgU291cmNlIE1BQywgYm90aCBzaG91bGQgYmUgYWxsIHplcm9zLgorCWlmICghIE1BQ19BRERSX0VRVUFMKHBSTVJlcS0+SUFQUC5EQSwgWkVST19NQUNfQUREUikpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJXcm9uZyBJQVBQIERBIGZvciBDaXNjbyBBaXJvbmV0IGV4dGVuc2lvbiwgaXQncyBub3QgWmVyb1xuIikpOworCQlyZXR1cm47CisJfQorCisJaWYgKCEgTUFDX0FERFJfRVFVQUwocFJNUmVxLT5JQVBQLlNBLCBaRVJPX01BQ19BRERSKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIldyb25nIElBUFAgU0EgZm9yIENpc2NvIEFpcm9uZXQgZXh0ZW5zaW9uLCBpdCdzIG5vdCBaZXJvXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwkvLyA2LiBSZWluaXQgYWxsIHJlcG9ydCByZWxhdGVkIGZpZWxkcworCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0QnVmLCAyMDQ4KTsKKwlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5Cc3NSZXBvcnRPZmZzZXQsIHNpemVvZihVU0hPUlQpICogTUFYX0xFTl9PRl9CU1NfVEFCTEUpOworCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdCwgc2l6ZW9mKFJNX1JFUVVFU1RfQUNUSU9OKSAqIDQpOworCisJLy8gNy4gUG9pbnQgdG8gdGhlIHN0YXJ0IG9mIGZpcnN0IGVsZW1lbnQgcmVwb3J0IGVsZW1lbnQKKwlwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbiAgID0gTEVOR1RIXzgwMl8xMSArIHNpemVvZihBSVJPTkVUX0lBUFBfSEVBREVSKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGUiBsZW4gPSAlZFxuIiwgcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4pKTsKKwlwQWQtPlN0YUNmZy5MYXN0QnNzSW5kZXggICAgID0gMHhmZjsKKwlwQWQtPlN0YUNmZy5STVJlcUNudCAgICAgICAgID0gMDsKKwlwQWQtPlN0YUNmZy5QYXJhbGxlbFJlcSAgICAgID0gRkFMU0U7CisJcEFkLT5TdGFDZmcuUGFyYWxsZWxEdXJhdGlvbiA9IDA7CisJcEFkLT5TdGFDZmcuUGFyYWxsZWxDaGFubmVsICA9IDA7CisJcEFkLT5TdGFDZmcuSUFQUFRva2VuICAgICAgICA9IHBSTVJlcS0+SUFQUC5Ub2tlbjsKKwlwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHggID0gMDsKKwlwQWQtPlN0YUNmZy5DTEJ1c3lCeXRlcyAgICAgID0gMDsKKwkvLyBSZXNldCB0aGUgc3RhdGlzdGljcworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbaV0gPSAwOworCisJSW5kZXggPSAwOworCisJLy8gOC4gU2F2ZSBkaWFsb2cgdG9rZW4gZm9yIHJlcG9ydAorCXBBZC0+U3RhQ2ZnLklBUFBUb2tlbiA9IHBSTVJlcS0+SUFQUC5Ub2tlbjsKKworCS8vIFNhdmUgQWN0aXZhdGlvbiBkZWxheSAmIG1lYXN1cmVtZW50IG9mZnNldCwgTm90IHJlYWxseSBuZWVkZWQKKworCS8vIDkuIFBvaW50IHRvIHRoZSBmaXJzdCByZXF1ZXN0IGVsZW1lbnQKKwlwRGF0YSArPSBzaXplb2YoQUlST05FVF9STV9SRVFVRVNUX0ZSQU1FKTsKKwkvLyAgICBMZW5ndGggc2hvdWxkIGV4Y2x1ZGUgdGhlIENJU0NPIEFpcm9uZXQgU05BUCBoZWFkZXIKKwlMZW5ndGggLT0gKHNpemVvZihBSVJPTkVUX1JNX1JFUVVFU1RfRlJBTUUpIC0gTEVOR1RIXzgwMl8xX0gpOworCisJLy8gMTAuIFN0YXJ0IFBhcnNpbmcgdGhlIE1lYXN1cmVtZW50IGVsZW1lbnRzLgorCS8vICAgIEJlIGNhcmVmdWwgYWJvdXQgbXVsdGlwbGUgTVIgZWxlbWVudHMgd2l0aGluIG9uZSBmcmFtZXMuCisJd2hpbGUgKExlbmd0aCA+IDApCisJeworCQlwUmVxRWxlbSA9IChQUk1fUkVRVUVTVF9BQ1RJT04pIHBEYXRhOworCQlzd2l0Y2ggKHBSZXFFbGVtLT5SZXFFbGVtLkVpZCkKKwkJeworCQkJY2FzZSBJRV9NRUFTVVJFTUVOVF9SRVFVRVNUOgorCQkJCS8vIEZyb20gdGhlIGV4YW1wbGUsIGl0IHNlZW1zIHdlIG9ubHkgbmVlZCB0byBzdXBwb3J0IG9uZSByZXF1ZXN0IGluIG9uZSBmcmFtZQorCQkJCS8vIFRoZXJlIGlzIG5vIG11bHRpcGxlIHJlcXVlc3QgaW4gb25lIGZyYW1lLgorCQkJCS8vIEJlc2lkZXMsIGxvb2tzIGxpa2Ugd2UgbmVlZCB0byB0YWtlIGNhcmUgdGhlIG1lYXN1cmVtZW50IHJlcXVlc3Qgb25seS4KKwkJCQkvLyBUaGUgbWVhc3VyZW1lbnQgcmVxdWVzdCBpcyBhbHdheXMgNCBieXRlcy4KKworCQkJCS8vIFN0YXJ0IHBhcnNpbmcgdGhpcyB0eXBlIG9mIHJlcXVlc3QuCisJCQkJLy8gMC4gRWlkIGlzIElFX01FQVNVUkVNRU5UX1JFUVVFU1QKKwkJCQkvLyAxLiBMZW5ndGggZGlkbid0IGluY2x1ZGUgRWlkIGFuZCBMZW5ndGggZmllbGQsIGl0IGFsd2F5cyBiZSA4LgorCQkJCS8vIDIuIE1lYXN1cmVtZW50IFRva2VuLCB3ZSBubmVkIHRvIHNhdmUgaXQgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHJlcG9ydC4KKwkJCQkvLyAzLiBNZWFzdXJlbWVudCBNb2RlLCBBbHRob3VnaCB0aGVyZSBhcmUgZGVmaW5pdGlvbnMsIGJ1dCB3ZSBkaW4ndCBzZWUgdmFsdWUgb3RoZXIgdGhhbgorCQkJCS8vICAgIDAgZnJvbSB0ZXN0IHNwZWNzIGV4YW1wbGVzLgorCQkJCS8vIDQuIE1lYXN1cmVtZW50IFR5cGUsIHRoaXMgaXMgd2hhdCB3ZSBuZWVkIHRvIGRvLgorCQkJCXN3aXRjaCAocFJlcUVsZW0tPlJlcUVsZW0uVHlwZSkKKwkJCQl7CisJCQkJCWNhc2UgTVNSTl9UWVBFX0NIQU5ORUxfTE9BRF9SRVE6CisJCQkJCWNhc2UgTVNSTl9UWVBFX05PSVNFX0hJU1RfUkVROgorCQkJCQljYXNlIE1TUk5fVFlQRV9CRUFDT05fUkVROgorCQkJCQkJLy8gQ2hlY2sgdGhlIEVuYWJsZSBub24tc2VydmluZyBjaGFubmVsIG1lYXN1cmVtZW50IGNvbnRyb2wKKwkJCQkJCWlmIChwQWQtPlN0YUNmZy5DQ1hDb250cm9sLmZpZWxkLkRDUk1FbmFibGUgPT0gMCkKKwkJCQkJCXsKKwkJCQkJCQkvLyBDaGVjayBjaGFubmVsIGJlZm9yZSBlbnF1ZXVlIHRoZSBhY3Rpb24KKwkJCQkJCQlpZiAocFJlcUVsZW0tPk1lYXN1cmVtZW50LkNoYW5uZWwgIT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJLy8gSWYgb2ZmIGNoYW5uZWwgbWVhc3VyZW1lbnQsIGNoZWNrIHRoZSBUVSBkdXJhdGlvbiBsaW1pdAorCQkJCQkJCWlmIChwUmVxRWxlbS0+TWVhc3VyZW1lbnQuQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQkJCQkJCQlpZiAocFJlcUVsZW0tPk1lYXN1cmVtZW50LkR1cmF0aW9uID4gcEFkLT5TdGFDZmcuQ0NYQ29udHJvbC5maWVsZC5UdUxpbWl0KQorCQkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisKKwkJCQkJCS8vIFNhdmUgcmVxdWVzdHMgYW5kIGV4ZWN1dGUgYWN0aW9ucyBsYXRlcgorCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF0sIHBSZXFFbGVtLCBzaXplb2YoUk1fUkVRVUVTVF9BQ1RJT04pKTsKKwkJCQkJCUluZGV4ICs9IDE7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIE1TUk5fVFlQRV9GUkFNRV9SRVE6CisJCQkJCQkvLyBTaW5jZSBpdCdzIG9wdGlvbiwgd2Ugd2lsbCBzdXBwb3J0IGxhdGVyCisJCQkJCQkvLyBGcmFtZVJlcXVlc3RBY3Rpb24ocEFkLCBwRGF0YSk7CisJCQkJCQlicmVhazsKKworCQkJCQlkZWZhdWx0OgorCQkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gUG9pbnQgdG8gbmV4dCBNZWFzdXJlbWVudCByZXF1ZXN0CisJCQkJcERhdGEgICs9IHNpemVvZihSTV9SRVFVRVNUX0FDVElPTik7CisJCQkJTGVuZ3RoIC09IHNpemVvZihSTV9SRVFVRVNUX0FDVElPTik7CisJCQkJYnJlYWs7CisKKwkJCS8vIFdlIGFjY2VwdCByZXF1ZXN0IG9ubHksIGFsbCBvdGhlcnMgYXJlIGRyb3BwZWQKKwkJCWNhc2UgSUVfTUVBU1VSRU1FTlRfUkVQT1JUOgorCQkJY2FzZSBJRV9BUF9UWF9QT1dFUjoKKwkJCWNhc2UgSUVfTUVBU1VSRU1FTlRfQ0FQQUJJTElUWToKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuOworCQl9CisJfQorCisJLy8gMTEuIFVwZGF0ZSBzb21lIGZsYWdzIGFuZCBpbmRleAorCXBBZC0+U3RhQ2ZnLlJNUmVxQ250ID0gSW5kZXg7CisKKwlpZiAoSW5kZXgpCisJeworCQlNbG1lRW5xdWV1ZShwQWQsIEFJUk9ORVRfU1RBVEVfTUFDSElORSwgTVQyX0FJUk9ORVRfU0NBTl9SRVEsIDAsIE5VTEwpOworCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tLS0tIEFpcm9uZXRNc2dBY3Rpb25cbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFpcm9uZXRSZXF1ZXN0QWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1MTUVfUVVFVUVfRUxFTQkqRWxlbSkKK3sKKwlQUk1fUkVRVUVTVF9BQ1RJT04JcFJlcTsKKworCS8vIDEuIFBvaW50IHRvIG5leHQgcmVxdWVzdCBlbGVtZW50CisJcFJlcSA9IChQUk1fUkVRVUVTVF9BQ1RJT04pICZwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4XTsKKworCS8vIDIuIFBhcnNlIG1lYXN1cmVtZW50IHR5cGUgYW5kIGNhbGwgYXBwcm9wcmlhdGUgZnVuY3Rpb25zCisJaWYgKHBSZXEtPlJlcUVsZW0uVHlwZSA9PSBNU1JOX1RZUEVfQ0hBTk5FTF9MT0FEX1JFUSkKKwkJLy8gQ2hhbm5lbCBMb2FkIG1lYXN1cmVtZW50IHJlcXVlc3QKKwkJQ2hhbm5lbExvYWRSZXF1ZXN0QWN0aW9uKHBBZCwgcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4KTsKKwllbHNlIGlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX05PSVNFX0hJU1RfUkVRKQorCQkvLyBOb2lzZSBIaXN0b2dyYW0gbWVhc3VyZW1lbnQgcmVxdWVzdAorCQlOb2lzZUhpc3RSZXF1ZXN0QWN0aW9uKHBBZCwgcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4KTsKKwllbHNlIGlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX0JFQUNPTl9SRVEpCisJCS8vIEJlYWNvbiBtZWFzdXJlbWVudCByZXF1ZXN0CisJCUJlYWNvblJlcXVlc3RBY3Rpb24ocEFkLCBwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHgpOworCWVsc2UKKwkJLy8gVW5rbm93bi4gRG8gbm90aGluZyBhbmQgcmV0dXJuLCB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4KKwkJcmV0dXJuOworCisJLy8gMy4gUGVlayBpbnRvIHRoZSBuZXh0IHJlcXVlc3QsIGlmIGl0J3MgcGFyYWxsZWwsIHdlIHdpbGwgdXBkYXRlIHRoZSBzY2FuIHRpbWUgdG8gdGhlIGxhcmdlc3Qgb25lCisJaWYgKChwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHggKyAxKSA8IHBBZC0+U3RhQ2ZnLlJNUmVxQ250KQorCXsKKwkJcFJlcSA9IChQUk1fUkVRVUVTVF9BQ1RJT04pICZwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4ICsgMV07CisJCS8vIENoZWNrIGZvciBwYXJhbGxlbCBiaXQKKwkJaWYgKChwUmVxLT5SZXFFbGVtLk1vZGUgJiAweDAxKSAmJiAocFJlcS0+TWVhc3VyZW1lbnQuQ2hhbm5lbCA9PSBwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCkpCisJCXsKKwkJCS8vIFVwZGF0ZSBwYXJhbGxlbCBtb2RlIHJlcXVlc3QgaW5mb3JtYXRpb24KKwkJCXBBZC0+U3RhQ2ZnLlBhcmFsbGVsUmVxID0gVFJVRTsKKwkJCXBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lID0gKChwUmVxLT5NZWFzdXJlbWVudC5EdXJhdGlvbiA+IHBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lKSA/CisJCQkocFJlcS0+TWVhc3VyZW1lbnQuRHVyYXRpb24pIDogKHBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lKSk7CisJCX0KKwl9CisKKwkvLyA0LiBDYWxsIFJUMjhYWF9NTE1FX0hBTkRMRVIgdG8gZXhlY3V0ZSB0aGUgcmVxdWVzdCBtbG1lIGNvbW1hbmRzLCBTY2FuIHJlcXVlc3QgaXMgdGhlIG9ubHkgb25lIHVzZWQKKwlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBjaGFubmVsIGxvYWQgcmVwb3J0IGFjdGlvbiwgc3BlY2lhbCBzY2FuIG9wZXJhdGlvbiBhZGRlZAorCQl0byBzdXBwb3J0CisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCXBEYXRhCQlTdGFydCBmcm9tIGVsZW1lbnQgSUQKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQ2hhbm5lbExvYWRSZXF1ZXN0QWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJSW5kZXgpCit7CisJUFJNX1JFUVVFU1RfQUNUSU9OCQkJCXBSZXE7CisJTUxNRV9TQ0FOX1JFUV9TVFJVQ1QJCQlTY2FuUmVxOworCVVDSEFSCQkJCQkJCVplcm9Tc2lkWzMyXTsKKwlORElTX1NUQVRVUwkJCQkJCU5TdGF0dXM7CisJUFVDSEFSCQkJCQkJCXBPdXRCdWZmZXIgPSBOVUxMOworCVBIRUFERVJfODAyXzExCQkJCQlwTnVsbEZyYW1lOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hhbm5lbExvYWRSZXF1ZXN0QWN0aW9uIC0tLS0tPlxuIikpOworCisJcFJlcSA9IChQUk1fUkVRVUVTVF9BQ1RJT04pICZwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdOworCU5kaXNaZXJvTWVtb3J5KFplcm9Tc2lkLCAzMik7CisKKwkvLyBQcmVwYXJlIGZvciBzcGVjaWFsIHNjYW4gcmVxdWVzdAorCS8vIFRoZSBzY2FuIGRlZmluaXRpb24gaXMgZGlmZmVyZW50IHdpdGggb3VyIEFjdGl2ZSwgUGFzc2l2ZSBzY2FuIGRlZmluaXRpb24uCisJLy8gRm9yIENDWDIsIEFjdGl2ZSBtZWFucyBzZW5kIG91dCBwcm9iZSByZXF1ZXN0IHdpdGggYnJvYWRjYXN0IEJTU0lELgorCS8vIFBhc3NpdmUgbWVhbnMgbm8gcHJvYmUgcmVxdWVzdCBzZW50LCBvbmx5IGxpc3RlbiB0byB0aGUgYmVhY29ucy4KKwkvLyBUaGUgY2hhbm5lbCBzY2FubmVkIGlzIGZpeGVkIGFzIHNwZWNpZmllZCwgbm8gbmVlZCB0byBzY2FuIGFsbCBjaGFubmVscy4KKwkvLyBUaGUgc2NhbiB3YWl0IHRpbWUgaXMgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0IHRvby4KKwkvLyBQYXNzaXZlIHNjYW4gTW9kZQorCisJLy8gQ29udHJvbCBzdGF0ZSBtYWNoaW5lIGlzIG5vdCBpZGxlLCByZWplY3QgdGhlIHJlcXVlc3QKKwlpZiAoKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKSAmJiAoSW5kZXggPT0gMCkpCisJCXJldHVybjsKKworCS8vIEZpbGwgb3V0IHN0dWZmIGZvciBzY2FuIHJlcXVlc3QKKwlTY2FuUGFybUZpbGwocEFkLCAmU2NhblJlcSwgWmVyb1NzaWQsIDAsIEJTU19BTlksIFNDQU5fQ0lTQ09fQ0hBTk5FTF9MT0FEKTsKKwlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsIHNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKKwlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47CisKKwkvLyBSZXNldCBzb21lIGludGVybmFsIGNvbnRyb2wgZmxhZ3MgdG8gbWFrZSBzdXJlIHRoaXMgc2NhbiB3b3Jrcy4KKwlCc3NUYWJsZUluaXQoJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYik7CisJcEFkLT5TdGFDZmcuU2NhbkNudCAgICAgICAgPSAwOworCXBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsID0gcFJlcS0+TWVhc3VyZW1lbnQuQ2hhbm5lbDsKKwlwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSAgICA9IHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRHVyYXRpb24gJWQsIENoYW5uZWwgJWQhXG4iLCBwUmVxLT5NZWFzdXJlbWVudC5EdXJhdGlvbiwgcFJlcS0+TWVhc3VyZW1lbnQuQ2hhbm5lbCkpOworCisJLy8gSWYgaXQncyBub24gc2VydmluZyBjaGFubmVsIHNjYW4sIHNlbmQgb3V0IGEgbnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24uCisJaWYgKHBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJeworCQkvLyBVc2UgTUxNRSBlbnF1ZXVlIG1ldGhvZAorCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwkJaWYgKE5TdGF0dXMJIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCXJldHVybjsKKworCQlwTnVsbEZyYW1lID0gKFBIRUFERVJfODAyXzExKSBwT3V0QnVmZmVyOzsKKwkJLy8gTWFrZSB0aGUgcG93ZXIgc2F2ZSBOdWxsIGZyYW1lIHdpdGggUFNNIGJpdCBvbgorCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgcE51bGxGcmFtZSwgU1VCVFlQRV9OVUxMX0ZVTkMsIDEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCXBOdWxsRnJhbWUtPkR1cmF0aW9uIAk9IDA7CisJCXBOdWxsRnJhbWUtPkZDLlR5cGUgCT0gQlRZUEVfREFUQTsKKwkJcE51bGxGcmFtZS0+RkMuUHdyTWdtdAk9IFBXUl9TQVZFOworCisJCS8vIFNlbmQgdXNpbmcgcHJpb3JpdHkgcXVldWUKKwkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZW5kIFBTTSBEYXRhIGZyYW1lIGZvciBvZmYgY2hhbm5lbCBSTVxuIikpOworCQlSVE1QdXNlY0RlbGF5KDUwMDApOworCX0KKworCXBBZC0+U3RhQ2ZnLkNDWFJlcVR5cGUgICAgID0gTVNSTl9UWVBFX0NIQU5ORUxfTE9BRF9SRVE7CisJcEFkLT5TdGFDZmcuQ0xCdXN5Qnl0ZXMgICAgPSAwOworCS8vIEVuYWJsZSBSeCB3aXRoIHByb21pc2N1b3VzIHJlY2VwdGlvbgorCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0ZJTFRSX0NGRywgMHgxMDEwKTsKKworCS8vIFNldCBjaGFubmVsIGxvYWQgbWVhc3VyZW1lbnQgZmxhZworCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX01FQVNVUkVNRU5UKTsKKworCXBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZS5DdXJyU3RhdGUgPSBBSVJPTkVUX1NDQU5OSU5HOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hhbm5lbExvYWRSZXF1ZXN0QWN0aW9uIDwtLS0tLVxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBub2lzZSBoaXN0b2dyYW0gcmVwb3J0IGFjdGlvbiwgc3BlY2lhbCBzY2FuIG9wZXJhdGlvbiBhZGRlZAorCQl0byBzdXBwb3J0CisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCXBEYXRhCQlTdGFydCBmcm9tIGVsZW1lbnQgSUQKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJTm9pc2VIaXN0UmVxdWVzdEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUluZGV4KQoreworCVBSTV9SRVFVRVNUX0FDVElPTgkJCQlwUmVxOworCU1MTUVfU0NBTl9SRVFfU1RSVUNUCQkJU2NhblJlcTsKKwlVQ0hBUgkJCQkJCQlaZXJvU3NpZFszMl0sIGk7CisJTkRJU19TVEFUVVMJCQkJCQlOU3RhdHVzOworCVBVQ0hBUgkJCQkJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlQSEVBREVSXzgwMl8xMQkJCQkJcE51bGxGcmFtZTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5vaXNlSGlzdFJlcXVlc3RBY3Rpb24gLS0tLS0+XG4iKSk7CisKKwlwUmVxID0gKFBSTV9SRVFVRVNUX0FDVElPTikgJnBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF07CisJTmRpc1plcm9NZW1vcnkoWmVyb1NzaWQsIDMyKTsKKworCS8vIFByZXBhcmUgZm9yIHNwZWNpYWwgc2NhbiByZXF1ZXN0CisJLy8gVGhlIHNjYW4gZGVmaW5pdGlvbiBpcyBkaWZmZXJlbnQgd2l0aCBvdXIgQWN0aXZlLCBQYXNzaXZlIHNjYW4gZGVmaW5pdGlvbi4KKwkvLyBGb3IgQ0NYMiwgQWN0aXZlIG1lYW5zIHNlbmQgb3V0IHByb2JlIHJlcXVlc3Qgd2l0aCBicm9hZGNhc3QgQlNTSUQuCisJLy8gUGFzc2l2ZSBtZWFucyBubyBwcm9iZSByZXF1ZXN0IHNlbnQsIG9ubHkgbGlzdGVuIHRvIHRoZSBiZWFjb25zLgorCS8vIFRoZSBjaGFubmVsIHNjYW5uZWQgaXMgZml4ZWQgYXMgc3BlY2lmaWVkLCBubyBuZWVkIHRvIHNjYW4gYWxsIGNoYW5uZWxzLgorCS8vIFRoZSBzY2FuIHdhaXQgdGltZSBpcyBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QgdG9vLgorCS8vIFBhc3NpdmUgc2NhbiBNb2RlCisKKwkvLyBDb250cm9sIHN0YXRlIG1hY2hpbmUgaXMgbm90IGlkbGUsIHJlamVjdCB0aGUgcmVxdWVzdAorCWlmICgocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpICYmIChJbmRleCA9PSAwKSkKKwkJcmV0dXJuOworCisJLy8gRmlsbCBvdXQgc3R1ZmYgZm9yIHNjYW4gcmVxdWVzdAorCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCBaZXJvU3NpZCwgMCwgQlNTX0FOWSwgU0NBTl9DSVNDT19OT0lTRSk7CisJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NDQU5fUkVRLCBzaXplb2YoTUxNRV9TQ0FOX1JFUV9TVFJVQ1QpLCAmU2NhblJlcSk7CisJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOworCisJLy8gUmVzZXQgc29tZSBpbnRlcm5hbCBjb250cm9sIGZsYWdzIHRvIG1ha2Ugc3VyZSB0aGlzIHNjYW4gd29ya3MuCisJQnNzVGFibGVJbml0KCZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIpOworCXBBZC0+U3RhQ2ZnLlNjYW5DbnQgICAgICAgID0gMDsKKwlwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCA9IHBSZXEtPk1lYXN1cmVtZW50LkNoYW5uZWw7CisJcEFkLT5TdGFDZmcuQ0NYU2NhblRpbWUgICAgPSBwUmVxLT5NZWFzdXJlbWVudC5EdXJhdGlvbjsKKwlwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlICAgICA9IE1TUk5fVFlQRV9OT0lTRV9ISVNUX1JFUTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkR1cmF0aW9uICVkLCBDaGFubmVsICVkIVxuIiwgcFJlcS0+TWVhc3VyZW1lbnQuRHVyYXRpb24sIHBSZXEtPk1lYXN1cmVtZW50LkNoYW5uZWwpKTsKKworCS8vIElmIGl0J3Mgbm9uIHNlcnZpbmcgY2hhbm5lbCBzY2FuLCBzZW5kIG91dCBhIG51bGwgZnJhbWUgd2l0aCBQU00gYml0IG9uLgorCWlmIChwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCXsKKwkJLy8gVXNlIE1MTUUgZW5xdWV1ZSBtZXRob2QKKwkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCWlmIChOU3RhdHVzCSE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQlyZXR1cm47CisKKwkJcE51bGxGcmFtZSA9IChQSEVBREVSXzgwMl8xMSkgcE91dEJ1ZmZlcjsKKwkJLy8gTWFrZSB0aGUgcG93ZXIgc2F2ZSBOdWxsIGZyYW1lIHdpdGggUFNNIGJpdCBvbgorCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgcE51bGxGcmFtZSwgU1VCVFlQRV9OVUxMX0ZVTkMsIDEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCXBOdWxsRnJhbWUtPkR1cmF0aW9uIAk9IDA7CisJCXBOdWxsRnJhbWUtPkZDLlR5cGUgIAk9IEJUWVBFX0RBVEE7CisJCXBOdWxsRnJhbWUtPkZDLlB3ck1nbXQJPSBQV1JfU0FWRTsKKworCQkvLyBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCisJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2VuZCBQU00gRGF0YSBmcmFtZSBmb3Igb2ZmIGNoYW5uZWwgUk1cbiIpKTsKKwkJUlRNUHVzZWNEZWxheSg1MDAwKTsKKwl9CisKKwkvLyBSZXNldCB0aGUgc3RhdGlzdGljcworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbaV0gPSAwOworCisJLy8gRW5hYmxlIFJ4IHdpdGggcHJvbWlzY3VvdXMgcmVjZXB0aW9uCisJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfRklMVFJfQ0ZHLCAweDEwMTApOworCisJLy8gU2V0IGNoYW5uZWwgbG9hZCBtZWFzdXJlbWVudCBmbGFnCisJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fTUVBU1VSRU1FTlQpOworCisJcEFkLT5NbG1lLkFpcm9uZXRNYWNoaW5lLkN1cnJTdGF0ZSA9IEFJUk9ORVRfU0NBTk5JTkc7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOb2lzZUhpc3RSZXF1ZXN0QWN0aW9uIDwtLS0tLVxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBCZWFjb24gcmVwb3J0IGFjdGlvbiwgc3BlY2lhbCBzY2FuIG9wZXJhdGlvbiBhZGRlZAorCQl0byBzdXBwb3J0CisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCXBEYXRhCQlTdGFydCBmcm9tIGVsZW1lbnQgSUQKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQmVhY29uUmVxdWVzdEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUluZGV4KQoreworCVBSTV9SRVFVRVNUX0FDVElPTgkJCQlwUmVxOworCU5ESVNfU1RBVFVTCQkJCQkJTlN0YXR1czsKKwlQVUNIQVIJCQkJCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisJUEhFQURFUl84MDJfMTEJCQkJCXBOdWxsRnJhbWU7CisJTUxNRV9TQ0FOX1JFUV9TVFJVQ1QJCQlTY2FuUmVxOworCVVDSEFSCQkJCQkJCVplcm9Tc2lkWzMyXTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJlYWNvblJlcXVlc3RBY3Rpb24gLS0tLS0+XG4iKSk7CisKKwlwUmVxID0gKFBSTV9SRVFVRVNUX0FDVElPTikgJnBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF07CisJTmRpc1plcm9NZW1vcnkoWmVyb1NzaWQsIDMyKTsKKworCS8vIFByZXBhcmUgZm9yIHNwZWNpYWwgc2NhbiByZXF1ZXN0CisJLy8gVGhlIHNjYW4gZGVmaW5pdGlvbiBpcyBkaWZmZXJlbnQgd2l0aCBvdXIgQWN0aXZlLCBQYXNzaXZlIHNjYW4gZGVmaW5pdGlvbi4KKwkvLyBGb3IgQ0NYMiwgQWN0aXZlIG1lYW5zIHNlbmQgb3V0IHByb2JlIHJlcXVlc3Qgd2l0aCBicm9hZGNhc3QgQlNTSUQuCisJLy8gUGFzc2l2ZSBtZWFucyBubyBwcm9iZSByZXF1ZXN0IHNlbnQsIG9ubHkgbGlzdGVuIHRvIHRoZSBiZWFjb25zLgorCS8vIFRoZSBjaGFubmVsIHNjYW5uZWQgaXMgZml4ZWQgYXMgc3BlY2lmaWVkLCBubyBuZWVkIHRvIHNjYW4gYWxsIGNoYW5uZWxzLgorCS8vIFRoZSBzY2FuIHdhaXQgdGltZSBpcyBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QgdG9vLgorCWlmIChwUmVxLT5NZWFzdXJlbWVudC5TY2FuTW9kZSA9PSBNU1JOX1NDQU5fTU9ERV9QQVNTSVZFKQorCXsKKwkJLy8gUGFzc2l2ZSBzY2FuIE1vZGUKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGFzc2l2ZSBTY2FuIE1vZGUhXG4iKSk7CisKKwkJLy8gQ29udHJvbCBzdGF0ZSBtYWNoaW5lIGlzIG5vdCBpZGxlLCByZWplY3QgdGhlIHJlcXVlc3QKKwkJaWYgKChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkgJiYgKEluZGV4ID09IDApKQorCQkJcmV0dXJuOworCisJCS8vIEZpbGwgb3V0IHN0dWZmIGZvciBzY2FuIHJlcXVlc3QKKwkJU2NhblBhcm1GaWxsKHBBZCwgJlNjYW5SZXEsIFplcm9Tc2lkLCAwLCBCU1NfQU5ZLCBTQ0FOX0NJU0NPX1BBU1NJVkUpOworCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsIHNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOworCisJCS8vIFJlc2V0IHNvbWUgaW50ZXJuYWwgY29udHJvbCBmbGFncyB0byBtYWtlIHN1cmUgdGhpcyBzY2FuIHdvcmtzLgorCQlCc3NUYWJsZUluaXQoJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYik7CisJCXBBZC0+U3RhQ2ZnLlNjYW5DbnQgICAgICAgID0gMDsKKwkJcEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWwgPSBwUmVxLT5NZWFzdXJlbWVudC5DaGFubmVsOworCQlwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSAgICA9IHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uOworCQlwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlICAgICA9IE1TUk5fVFlQRV9CRUFDT05fUkVROworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEdXJhdGlvbiAlZCFcbiIsIHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uKSk7CisKKwkJLy8gSWYgaXQncyBub24gc2VydmluZyBjaGFubmVsIHNjYW4sIHNlbmQgb3V0IGEgbnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24uCisJCWlmIChwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQl7CisJCQkvLyBVc2UgTUxNRSBlbnF1ZXVlIG1ldGhvZAorCQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCQlpZiAoTlN0YXR1cwkhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCXJldHVybjsKKworCQkJcE51bGxGcmFtZSA9IChQSEVBREVSXzgwMl8xMSkgcE91dEJ1ZmZlcjsKKwkJCS8vIE1ha2UgdGhlIHBvd2VyIHNhdmUgTnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24KKwkJCU1ndE1hY0hlYWRlckluaXQocEFkLCBwTnVsbEZyYW1lLCBTVUJUWVBFX05VTExfRlVOQywgMSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCXBOdWxsRnJhbWUtPkR1cmF0aW9uIAk9IDA7CisJCQlwTnVsbEZyYW1lLT5GQy5UeXBlICAgICA9IEJUWVBFX0RBVEE7CisJCQlwTnVsbEZyYW1lLT5GQy5Qd3JNZ210ICA9IFBXUl9TQVZFOworCisJCQkvLyBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCisJCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2VuZCBQU00gRGF0YSBmcmFtZSBmb3Igb2ZmIGNoYW5uZWwgUk1cbiIpKTsKKwkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisJCX0KKworCQlwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUuQ3VyclN0YXRlID0gQUlST05FVF9TQ0FOTklORzsKKwl9CisJZWxzZSBpZiAocFJlcS0+TWVhc3VyZW1lbnQuU2Nhbk1vZGUgPT0gTVNSTl9TQ0FOX01PREVfQUNUSVZFKQorCXsKKwkJLy8gQWN0aXZlIHNjYW4gTW9kZQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBY3RpdmUgU2NhbiBNb2RlIVxuIikpOworCisJCS8vIENvbnRyb2wgc3RhdGUgbWFjaGluZSBpcyBub3QgaWRsZSwgcmVqZWN0IHRoZSByZXF1ZXN0CisJCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKKwkJCXJldHVybjsKKworCQkvLyBGaWxsIG91dCBzdHVmZiBmb3Igc2NhbiByZXF1ZXN0CisJCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCBaZXJvU3NpZCwgMCwgQlNTX0FOWSwgU0NBTl9DSVNDT19BQ1RJVkUpOworCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsIHNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOworCisJCS8vIFJlc2V0IHNvbWUgaW50ZXJuYWwgY29udHJvbCBmbGFncyB0byBtYWtlIHN1cmUgdGhpcyBzY2FuIHdvcmtzLgorCQlCc3NUYWJsZUluaXQoJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYik7CisJCXBBZC0+U3RhQ2ZnLlNjYW5DbnQgICAgICAgID0gMDsKKwkJcEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWwgPSBwUmVxLT5NZWFzdXJlbWVudC5DaGFubmVsOworCQlwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSAgICA9IHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uOworCQlwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlICAgICA9IE1TUk5fVFlQRV9CRUFDT05fUkVROworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEdXJhdGlvbiAlZCFcbiIsIHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uKSk7CisKKwkJLy8gSWYgaXQncyBub24gc2VydmluZyBjaGFubmVsIHNjYW4sIHNlbmQgb3V0IGEgbnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24uCisJCWlmIChwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQl7CisJCQkvLyBVc2UgTUxNRSBlbnF1ZXVlIG1ldGhvZAorCQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCQlpZiAoTlN0YXR1cwkhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCXJldHVybjsKKworCQkJcE51bGxGcmFtZSA9IChQSEVBREVSXzgwMl8xMSkgcE91dEJ1ZmZlcjsKKwkJCS8vIE1ha2UgdGhlIHBvd2VyIHNhdmUgTnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24KKwkJCU1ndE1hY0hlYWRlckluaXQocEFkLCBwTnVsbEZyYW1lLCBTVUJUWVBFX05VTExfRlVOQywgMSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCXBOdWxsRnJhbWUtPkR1cmF0aW9uIAk9IDA7CisJCQlwTnVsbEZyYW1lLT5GQy5UeXBlICAgICA9IEJUWVBFX0RBVEE7CisJCQlwTnVsbEZyYW1lLT5GQy5Qd3JNZ210ICA9IFBXUl9TQVZFOworCisJCQkvLyBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCisJCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2VuZCBQU00gRGF0YSBmcmFtZSBmb3Igb2ZmIGNoYW5uZWwgUk1cbiIpKTsKKwkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisJCX0KKworCQlwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUuQ3VyclN0YXRlID0gQUlST05FVF9TQ0FOTklORzsKKwl9CisJZWxzZSBpZiAocFJlcS0+TWVhc3VyZW1lbnQuU2Nhbk1vZGUgPT0gTVNSTl9TQ0FOX01PREVfQkVBQ09OX1RBQkxFKQorCXsKKwkJLy8gQmVhY29uIHJlcG9ydCBNb2RlLCByZXBvcnQgYWxsIHRoZSBBUFMgaW4gY3VycmVudCBic3MgdGFibGUKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQmVhY29uIFJlcG9ydCBNb2RlIVxuIikpOworCisJCS8vIENvcHkgY3VycmVudCBCU1MgdGFibGUgdG8gQ0NYIHRhYmxlLCB3ZSBjYW4gb21pdCB0aGlzIHN0ZXAgbGF0ZXIgb24uCisJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIsICZwQWQtPlNjYW5UYWIsIHNpemVvZihCU1NfVEFCTEUpKTsKKworCQkvLyBDcmVhdGUgYmVhY29uIHJlcG9ydCBmcm9tIEJzcyB0YWJsZQorCQlBaXJvbmV0Q3JlYXRlQmVhY29uUmVwb3J0RnJvbUJzc1RhYmxlKHBBZCk7CisKKwkJLy8gU2V0IHN0YXRlIHRvIHNjYW5uaW5nCisJCXBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZS5DdXJyU3RhdGUgPSBBSVJPTkVUX1NDQU5OSU5HOworCisJCS8vIEVucXVldWUgcmVwb3J0IHJlcXVlc3QKKwkJLy8gQ2lzY28gc2NhbiByZXF1ZXN0IGlzIGZpbmlzaGVkLCBwcmVwYXJlIGJlYWNvbiByZXBvcnQKKwkJTWxtZUVucXVldWUocEFkLCBBSVJPTkVUX1NUQVRFX01BQ0hJTkUsIE1UMl9BSVJPTkVUX1NDQU5fRE9ORSwgMCwgTlVMTCk7CisJfQorCWVsc2UKKwl7CisJCS8vIFdyb25nIHNjYW4gTW9kZQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcm9uZyBTY2FuIE1vZGUhXG4iKSk7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQmVhY29uUmVxdWVzdEFjdGlvbiA8LS0tLS1cbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFpcm9uZXRSZXBvcnRBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTUxNRV9RVUVVRV9FTEVNCSpFbGVtKQoreworCVBSTV9SRVFVRVNUX0FDVElPTglwUmVxOworCVVMT05HCQkJCU5vdzMyOworCisgICAgTmRpc0dldFN5c3RlbVVwVGltZSgmTm93MzIpOworCXBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWUgPSBOb3czMjsKKworCXBSZXEgPSAoUFJNX1JFUVVFU1RfQUNUSU9OKSAmcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W3BBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeF07CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBaXJvbmV0UmVwb3J0QWN0aW9uIC0tLS0tPlxuIikpOworCisJLy8gMS4gUGFyc2UgbWVhc3VyZW1lbnQgdHlwZSBhbmQgY2FsbCBhcHByb3ByaWF0ZSBmdW5jdGlvbnMKKwlpZiAocFJlcS0+UmVxRWxlbS5UeXBlID09IE1TUk5fVFlQRV9DSEFOTkVMX0xPQURfUkVRKQorCQkvLyBDaGFubmVsIExvYWQgbWVhc3VyZW1lbnQgcmVxdWVzdAorCQlDaGFubmVsTG9hZFJlcG9ydEFjdGlvbihwQWQsIHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCk7CisJZWxzZSBpZiAocFJlcS0+UmVxRWxlbS5UeXBlID09IE1TUk5fVFlQRV9OT0lTRV9ISVNUX1JFUSkKKwkJLy8gTm9pc2UgSGlzdG9ncmFtIG1lYXN1cmVtZW50IHJlcXVlc3QKKwkJTm9pc2VIaXN0UmVwb3J0QWN0aW9uKHBBZCwgcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4KTsKKwllbHNlIGlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX0JFQUNPTl9SRVEpCisJCS8vIEJlYWNvbiBtZWFzdXJlbWVudCByZXF1ZXN0CisJCUJlYWNvblJlcG9ydEFjdGlvbihwQWQsIHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCk7CisJZWxzZQorCQkvLyBVbmtub3duLiBEbyBub3RoaW5nIGFuZCByZXR1cm4KKwkJOworCisJLy8gMi4gUG9pbnQgdG8gdGhlIGNvcnJlY3QgaW5kZXggb2YgYWN0aW9uIGVsZW1lbnQsIHN0YXJ0IGZyb20gMAorCXBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCsrOworCisJLy8gMy4gQ2hlY2sgZm9yIHBhcmFsbGVsIGFjdGlvbnMKKwlpZiAocEFkLT5TdGFDZmcuUGFyYWxsZWxSZXEgPT0gVFJVRSkKKwl7CisJCXBSZXEgPSAoUFJNX1JFUVVFU1RfQUNUSU9OKSAmcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W3BBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeF07CisKKwkJLy8gUHJvY2VzcyBuZXh0IGFjdGlvbiByaWdodCBhd2F5CisJCWlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX0NIQU5ORUxfTE9BRF9SRVEpCisJCQkvLyBDaGFubmVsIExvYWQgbWVhc3VyZW1lbnQgcmVxdWVzdAorCQkJQ2hhbm5lbExvYWRSZXBvcnRBY3Rpb24ocEFkLCBwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHgpOworCQllbHNlIGlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX05PSVNFX0hJU1RfUkVRKQorCQkJLy8gTm9pc2UgSGlzdG9ncmFtIG1lYXN1cmVtZW50IHJlcXVlc3QKKwkJCU5vaXNlSGlzdFJlcG9ydEFjdGlvbihwQWQsIHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCk7CisKKwkJcEFkLT5TdGFDZmcuUGFyYWxsZWxSZXEgPSBGQUxTRTsKKwkJcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4Kys7CisJfQorCisJaWYgKHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCA+PSBwQWQtPlN0YUNmZy5STVJlcUNudCkKKwl7CisJCS8vIDQuIFRoZXJlIGlzIG5vIG1vcmUgdW5wcm9jZXNzZWQgbWVhc3VyZW1lbnQgcmVxdWVzdCwgZ28gZm9yIHRyYW5zbWl0IHRoaXMgcmVwb3J0CisJCUFpcm9uZXRGaW5hbFJlcG9ydEFjdGlvbihwQWQpOworCQlwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUuQ3VyclN0YXRlID0gQUlST05FVF9JRExFOworCX0KKwllbHNlCisJeworCQlwUmVxID0gKFBSTV9SRVFVRVNUX0FDVElPTikgJnBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHhdOworCisJCWlmIChwUmVxLT5NZWFzdXJlbWVudC5DaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJCXsKKwkJCVJUTVB1c2VjRGVsYXkoMTAwMDAwKTsKKwkJfQorCisJCS8vIDUuIFRoZXJlIGFyZSBtb3JlIHJlcXVlc3RzIHRvIGJlIG1lYXN1cmUKKwkJTWxtZUVucXVldWUocEFkLCBBSVJPTkVUX1NUQVRFX01BQ0hJTkUsIE1UMl9BSVJPTkVUX1NDQU5fUkVRLCAwLCBOVUxMKTsKKwkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFpcm9uZXRSZXBvcnRBY3Rpb24gPC0tLS0tXG4iKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlBaXJvbmV0RmluYWxSZXBvcnRBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJUFVDSEFSCQkJCQlwRGVzdDsKKwlQQUlST05FVF9JQVBQX0hFQURFUglwSUFQUDsKKwlQSEVBREVSXzgwMl8xMQkJCXBIZWFkZXI7CisJVUNIQVIJCQkJCUFja1JhdGUgPSBSQVRFXzI7CisJVVNIT1JUCQkJCQlBY2tEdXJhdGlvbiA9IDA7CisJTkRJU19TVEFUVVMJCQkJTlN0YXR1czsKKwlQVUNIQVIJCQkJCXBPdXRCdWZmZXIgPSBOVUxMOworCVVMT05HCQkJCQlGcmFtZUxlbiA9IDA7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBaXJvbmV0RmluYWxSZXBvcnRBY3Rpb24gLS0tLS0+XG4iKSk7CisKKwkvLyAwLiBTZXQgdXAgdGhlIGZyYW1lIHBvaW50ZXIsIEZyYW1lIHdhcyBpbml0ZWQgYXQgdGhlIGVuZCBvZiBtZXNzYWdlIGFjdGlvbgorCXBEZXN0ID0gJnBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0QnVmW0xFTkdUSF84MDJfMTFdOworCisJLy8gMS4gVXBkYXRlIHJlcG9ydCBJQVBQIGZpZWxkcworCXBJQVBQID0gKFBBSVJPTkVUX0lBUFBfSEVBREVSKSBwRGVzdDsKKworCS8vIDIuIENvcHkgQ2lzY28gU05BUCBoZWFkZXIKKwlOZGlzTW92ZU1lbW9yeShwSUFQUC0+Q2lzY29TbmFwSGVhZGVyLCBTTkFQX0FJUk9ORVQsIExFTkdUSF84MDJfMV9IKTsKKworCS8vIDMuIG5ldHdvcmsgb3JkZXIgZm9yIHRoaXMgMTZiaXQgbGVuZ3RoCisJcElBUFAtPkxlbmd0aCAgPSBjcHUyYmUxNihwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbiAtIExFTkdUSF84MDJfMTEgLSBMRU5HVEhfODAyXzFfSCk7CisKKwkvLyAzLjEgc2FuaXR5IGNoZWNrIHRoZSByZXBvcnQgbGVuZ3RoLCBpZ25vcmUgaXQgaWYgdGhlcmUgaXMgbm90aGluZyB0byByZXBvcnQKKwlpZiAoYmUyY3B1MTYocElBUFAtPkxlbmd0aCkgPD0gMTgpCisJCXJldHVybjsKKworCS8vIDQuIFR5cGUgbXVzdCBiZSAweDMyCisJcElBUFAtPlR5cGUgICAgPSBBSVJPTkVUX0lBUFBfVFlQRTsKKworCS8vIDUuIFN1YlR5cGUgZm9yIHJlcG9ydCBtdXN0IGJlIDB4ODEKKwlwSUFQUC0+U3ViVHlwZSA9IEFJUk9ORVRfSUFQUF9TVUJUWVBFX1JFUE9SVDsKKworCS8vIDYuIERBIGlzIG5vdCB1c2VkIGFuZCBtdXN0IGJlIHplcm8sIGFsdGhvdWdoIHRoZSB3aG9sZSBmcmFtZSB3YXMgY2xlYXJlZCBhdCB0aGUgc3RhcnQgb2YgZnVuY3Rpb24KKwkvLyAgICBXZSB3aWxsIGRvIGl0IGFnYWluIGhlcmUuIFdlIGNhbiB1c2UgQlNTSUQgaW5zdGVhZAorCUNPUFlfTUFDX0FERFIocElBUFAtPkRBLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisKKwkvLyA3LiBTQSBpcyB0aGUgY2xpZW50IHJlcG9ydGluZyB3aGljaCBtdXN0IGJlIG91ciBNQUMKKwlDT1BZX01BQ19BRERSKHBJQVBQLT5TQSwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisKKwkvLyA4LiBDb3B5IHRoZSBzYXZlZCBkaWFsb2cgdG9rZW4KKwlwSUFQUC0+VG9rZW4gPSBwQWQtPlN0YUNmZy5JQVBQVG9rZW47CisKKwkvLyA5LiBNYWtlIHRoZSBSZXBvcnQgZnJhbWUgODAyLjExIGhlYWRlcgorCS8vICAgIFJldXNlIGZ1bmN0aW9uIGluIHdwYS5jCisJcEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkgcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRCdWY7CisJcEFkLT5TZXF1ZW5jZSArKzsKKwlXcGFNYWNIZWFkZXJJbml0KHBBZCwgcEhlYWRlciwgMCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCisJLy8gQUNLIHNpemUJaXMgMTQgaW5jbHVkZSBDUkMsIGFuZCBpdHMgcmF0ZQlpcyBiYXNlZCBvbiByZWFsIHRpbWUgaW5mb3JtYXRpb24KKwlBY2tSYXRlICAgICA9IHBBZC0+Q29tbW9uQ2ZnLkV4cGVjdGVkQUNLUmF0ZVtwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07CisJQWNrRHVyYXRpb24gPSBSVE1QQ2FsY0R1cmF0aW9uKHBBZCwgQWNrUmF0ZSwgMTQpOworCXBIZWFkZXItPkR1cmF0aW9uID0gcEFkLT5Db21tb25DZmcuRHNpZnMgKyBBY2tEdXJhdGlvbjsKKworCS8vIFVzZSBNTE1FIGVucXVldWUgbWV0aG9kCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZiAoTlN0YXR1cwkhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQlyZXR1cm47CisKKwkvLyAxMC4gUHJlcGFyZSByZXBvcnQgZnJhbWUgd2l0aCBkeW5hbWljIG91dGJ1ZmZlci4gSnVzdCBzaW1wbHkgY29weSBldmVyeXRoaW5nLgorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgICAgICAgICAmRnJhbWVMZW4sCisJICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4sIHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0QnVmLAorCQkgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKworCS8vIDExLiBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCXBBZC0+U3RhQ2ZnLkNDWFJlcVR5cGUgPSBNU1JOX1RZUEVfVU5VU0VEOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQWlyb25ldEZpbmFsUmVwb3J0QWN0aW9uIDwtLS0tLVxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQ2hhbm5lbExvYWRSZXBvcnRBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlJbmRleCkKK3sKKwlQTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQJcFJlcG9ydDsKKwlQQ0hBTk5FTF9MT0FEX1JFUE9SVAkJcExvYWQ7CisJUFVDSEFSCQkJCQkJcERlc3Q7CisJVUNIQVIJCQkJCQlDQ0FCdXN5RnJhY3Rpb247CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGFubmVsTG9hZFJlcG9ydEFjdGlvbiAtLS0tLT5cbiIpKTsKKworCS8vIERpc2FibGUgUnggd2l0aCBwcm9taXNjdW91cyByZWNlcHRpb24sIG1ha2UgaXQgYmFjayB0byBub3JtYWwKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9GSUxUUl9DRkcsIFNUQU5PUk1BTCk7IC8vIFN0YWlvbiBub3QgZHJvcCBjb250cm9sIGZyYW1lIHdpbGwgZmFpbCBXaUZpIENlcnRpZmljYXRpb24uCisKKwkvLyAwLiBTZXR1cCBwb2ludGVyIGZvciBwcm9jZXNzaW5nIGJlYWNvbiAmIHByb2JlIHJlc3BvbnNlCisJcERlc3QgPSAoUFVDSEFSKSAmcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRCdWZbcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW5dOworCXBSZXBvcnQgPSAoUE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKSBwRGVzdDsKKworCS8vIDEuIEZpbGwgTWVhc3VyZW1lbnQgcmVwb3J0IGVsZW1lbnQgZmllbGQuCisJcFJlcG9ydC0+RWlkICAgID0gSUVfTUVBU1VSRU1FTlRfUkVQT1JUOworCS8vIEZpeGVkIExlbmd0aCBhdCA5LCBub3QgaW5jbHVkZSBFaWQgYW5kIGxlbmd0aCBmaWVsZHMKKwlwUmVwb3J0LT5MZW5ndGggPSA5OworCXBSZXBvcnQtPlRva2VuICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF0uUmVxRWxlbS5Ub2tlbjsKKwlwUmVwb3J0LT5Nb2RlICAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdLlJlcUVsZW0uTW9kZTsKKwlwUmVwb3J0LT5UeXBlICAgPSBNU1JOX1RZUEVfQ0hBTk5FTF9MT0FEX1JFUTsKKworCS8vIDIuIEZpbGwgY2hhbm5lbCByZXBvcnQgbWVhc3VyZW1lbnQgZGF0YQorCXBEZXN0ICs9IHNpemVvZihNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCk7CisJcExvYWQgID0gKFBDSEFOTkVMX0xPQURfUkVQT1JUKSBwRGVzdDsKKwlwTG9hZC0+Q2hhbm5lbCAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdLk1lYXN1cmVtZW50LkNoYW5uZWw7CisJcExvYWQtPlNwYXJlICAgID0gMDsKKwlwTG9hZC0+RHVyYXRpb24gPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdLk1lYXN1cmVtZW50LkR1cmF0aW9uOworCisJLy8gMy4gQ2FsY3VsYXRlIHRoZSBDQ0EgQnVzeSBGcmFjdGlvbgorCS8vICAgIChCeXRlcyArIEFDSyBzaXplKSAqIDggLyBUeCBzcGVlZCAqIDI1NSAvIDEwMDAgLyBtZWFzdXJlbWVudCBkdXJhdGlvbiwgdXNlIDI0IHVzIFR4IHNwZWVkCisJLy8gICAgID0gIChCeXRlcyArIEFDSykgLyAxMiAvIGR1cmF0aW9uCisJLy8gICAgIDkgaXMgdGhlIGdvb2QgdmFsdWUgZm9yIHBBZC0+U3RhQ2ZnLkNMRmFjdG9yCisJLy8gQ0NBQnVzeUZyYWN0aW9uID0gKFVDSEFSKSAocEFkLT5TdGFDZmcuQ0xCdXN5Qnl0ZXMgLyA5IC8gcExvYWQtPkR1cmF0aW9uKTsKKwlDQ0FCdXN5RnJhY3Rpb24gPSAoVUNIQVIpIChwQWQtPlN0YUNmZy5DTEJ1c3lCeXRlcyAvIHBBZC0+U3RhQ2ZnLkNMRmFjdG9yIC8gcExvYWQtPkR1cmF0aW9uKTsKKwlpZiAoQ0NBQnVzeUZyYWN0aW9uIDwgMTApCisJCQlDQ0FCdXN5RnJhY3Rpb24gPSAoVUNIQVIpIChwQWQtPlN0YUNmZy5DTEJ1c3lCeXRlcyAvIDMgLyBwTG9hZC0+RHVyYXRpb24pICsgMTsKKworCXBMb2FkLT5DQ0FCdXN5ID0gQ0NBQnVzeUZyYWN0aW9uOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNMQnVzeUJ5dGUgJWxkLCBEdXJhdGlvbiAlZCwgUmVzdWx0LCAlZFxuIiwgcEFkLT5TdGFDZmcuQ0xCdXN5Qnl0ZXMsIHBMb2FkLT5EdXJhdGlvbiwgQ0NBQnVzeUZyYWN0aW9uKSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGcmFtZVJlcG9ydExlbiAlZFxuIiwgcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4pKTsKKwlwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbiArPSAoc2l6ZW9mKE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKSArIHNpemVvZihDSEFOTkVMX0xPQURfUkVQT1JUKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRnJhbWVSZXBvcnRMZW4gJWRcbiIsIHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuKSk7CisKKwkvLyA0LiBDbGVhciBjaGFubmVsIGxvYWQgbWVhc3VyZW1lbnQgZmxhZworCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fTUVBU1VSRU1FTlQpOworCisJLy8gNS4gcmVzZXQgdG8gaWRsZSBzdGF0ZQorCXBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZS5DdXJyU3RhdGUgPSBBSVJPTkVUX0lETEU7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGFubmVsTG9hZFJlcG9ydEFjdGlvbiA8LS0tLS1cbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECU5vaXNlSGlzdFJlcG9ydEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUluZGV4KQoreworCVBNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVAlwUmVwb3J0OworCVBOT0lTRV9ISVNUX1JFUE9SVAkJCXBOb2lzZTsKKwlQVUNIQVIJCQkJCQlwRGVzdDsKKwlVQ0hBUgkJCQkJCWksTm9pc2VDbnQ7CisJVVNIT1JUCQkJCQkJVG90YWxSUElDbnQsIFRvdGFsUlBJU3VtOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTm9pc2VIaXN0UmVwb3J0QWN0aW9uIC0tLS0tPlxuIikpOworCisJLy8gMC4gRGlzYWJsZSBSeCB3aXRoIHByb21pc2N1b3VzIHJlY2VwdGlvbiwgbWFrZSBpdCBiYWNrIHRvIG5vcm1hbAorCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0ZJTFRSX0NGRywgU1RBTk9STUFMKTsgLy8gU3RhaW9uIG5vdCBkcm9wIGNvbnRyb2wgZnJhbWUgd2lsbCBmYWlsIFdpRmkgQ2VydGlmaWNhdGlvbi4KKwkvLyAxLiBTZXR1cCBwb2ludGVyIGZvciBwcm9jZXNzaW5nIGJlYWNvbiAmIHByb2JlIHJlc3BvbnNlCisJcERlc3QgPSAoUFVDSEFSKSAmcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRCdWZbcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW5dOworCXBSZXBvcnQgPSAoUE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKSBwRGVzdDsKKworCS8vIDIuIEZpbGwgTWVhc3VyZW1lbnQgcmVwb3J0IGVsZW1lbnQgZmllbGQuCisJcFJlcG9ydC0+RWlkICAgID0gSUVfTUVBU1VSRU1FTlRfUkVQT1JUOworCS8vIEZpeGVkIExlbmd0aCBhdCAxNiwgbm90IGluY2x1ZGUgRWlkIGFuZCBsZW5ndGggZmllbGRzCisJcFJlcG9ydC0+TGVuZ3RoID0gMTY7CisJcFJlcG9ydC0+VG9rZW4gID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W0luZGV4XS5SZXFFbGVtLlRva2VuOworCXBSZXBvcnQtPk1vZGUgICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF0uUmVxRWxlbS5Nb2RlOworCXBSZXBvcnQtPlR5cGUgICA9IE1TUk5fVFlQRV9OT0lTRV9ISVNUX1JFUTsKKworCS8vIDMuIEZpbGwgbm9pc2UgaGlzdG9ncmFtIHJlcG9ydCBtZWFzdXJlbWVudCBkYXRhCisJcERlc3QgKz0gc2l6ZW9mKE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKTsKKwlwTm9pc2UgID0gKFBOT0lTRV9ISVNUX1JFUE9SVCkgcERlc3Q7CisJcE5vaXNlLT5DaGFubmVsICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF0uTWVhc3VyZW1lbnQuQ2hhbm5lbDsKKwlwTm9pc2UtPlNwYXJlICAgID0gMDsKKwlwTm9pc2UtPkR1cmF0aW9uID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W0luZGV4XS5NZWFzdXJlbWVudC5EdXJhdGlvbjsKKwkvLyA0LiBGaWxsIE5vaXNlIGhpc3RvZ3JhbSwgdGhlIHRvdGFsIFJQSSBjb3VudHMgc2hvdWxkIGJlIDAuNCAqIFRVCisJLy8gICAgV2UgZXN0aW1hdGUgNDAwMCBub3JtYWwgcGFja2V0cyByZWNlaXZlZCBkdXJuaW5nIDEwIHNlY29uZHMgdGVzdC4KKwkvLyAgICBBZGp1c3QgaXQgaWYgcmVxdWlyZWQuCisJLy8gMyBpcyBhIGdvb2QgdmFsdWUgZm9yIHBBZC0+U3RhQ2ZnLk5IRmFjdG9yCisJLy8gVG90YWxSUElDbnQgPSBwTm9pc2UtPkR1cmF0aW9uICogMyAvIDEwOworCVRvdGFsUlBJQ250ID0gcE5vaXNlLT5EdXJhdGlvbiAqIHBBZC0+U3RhQ2ZnLk5IRmFjdG9yIC8gMTA7CisJVG90YWxSUElTdW0gPSAwOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwl7CisJCVRvdGFsUlBJU3VtICs9IHBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbaV07CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJQSSAlZCBDb251dHMgJWRcbiIsIGksIHBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbaV0pKTsKKwl9CisKKwkvLyBEb3VibGUgY2hlY2sgaWYgdGhlIGNvdW50ZXIgaXMgbGFyZ2VyIHRoYW4gb3VyIGV4cGVjdGF0aW9uLgorCS8vIFdlIHdpbGwgcmVwbGFjZSBpdCB3aXRoIHRoZSB0b3RhbCBudW1iZXIgcGx1cyBhIGZyYWN0aW9uLgorCWlmIChUb3RhbFJQSVN1bSA+IFRvdGFsUlBJQ250KQorCQlUb3RhbFJQSUNudCA9IFRvdGFsUlBJU3VtICsgcE5vaXNlLT5EdXJhdGlvbiAvIDIwOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVG90YWwgUlBJIENvbnV0cyAlZFxuIiwgVG90YWxSUElDbnQpKTsKKworCS8vIDUuIEluaXRpYWxpemUgbm9pc2UgY291bnQgZm9yIHRoZSB0b3RhbCBzdW1tYXRpb24gb2YgMHhmZgorCU5vaXNlQ250ID0gMDsKKwlmb3IgKGkgPSAxOyBpIDwgODsgaSsrKQorCXsKKwkJcE5vaXNlLT5EZW5zaXR5W2ldID0gKFVDSEFSKSAocEFkLT5TdGFDZmcuUlBJRGVuc2l0eVtpXSAqIDI1NSAvIFRvdGFsUlBJQ250KTsKKwkJaWYgKChwTm9pc2UtPkRlbnNpdHlbaV0gPT0gMCkgJiYgKHBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbaV0gIT0gMCkpCisJCQlwTm9pc2UtPkRlbnNpdHlbaV0rKzsKKwkJTm9pc2VDbnQgKz0gcE5vaXNlLT5EZW5zaXR5W2ldOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZXBvcnRlZCBSUElbJWRdICA9IDB4JTAyeFxuIiwgaSwgcE5vaXNlLT5EZW5zaXR5W2ldKSk7CisJfQorCisJLy8gNi4gUlBJWzBdIHJlcHJlc2VudHMgdGhlIHJlc3Qgb2YgY291bnRzCisJcE5vaXNlLT5EZW5zaXR5WzBdID0gMHhmZiAtIE5vaXNlQ250OworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlcG9ydGVkIFJQSVswXSAgPSAweCUwMnhcbiIsIHBOb2lzZS0+RGVuc2l0eVswXSkpOworCisJcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4gKz0gKHNpemVvZihNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCkgKyBzaXplb2YoTk9JU0VfSElTVF9SRVBPUlQpKTsKKworCS8vIDcuIENsZWFyIGNoYW5uZWwgbG9hZCBtZWFzdXJlbWVudCBmbGFnCisJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19NRUFTVVJFTUVOVCk7CisKKwkvLyA4LiByZXNldCB0byBpZGxlIHN0YXRlCisJcEFkLT5NbG1lLkFpcm9uZXRNYWNoaW5lLkN1cnJTdGF0ZSA9IEFJUk9ORVRfSURMRTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5vaXNlSGlzdFJlcG9ydEFjdGlvbiA8LS0tLS1cbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVByZXBhcmUgQmVhY29uIHJlcG9ydCBhY3Rpb24sCisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUJlYWNvblJlcG9ydEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUluZGV4KQoreworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJlYWNvblJlcG9ydEFjdGlvbiAtLS0tLT5cbiIpKTsKKworCS8vIExvb2tzIGxpa2Ugd2UgZG9uJ3QgaGF2ZSBhbnl0aGluZyB0aGluZyBuZWVkIHRvIGRvIGhlcmUuCisJLy8gQWxsIG1lYXN1cmVtZW50IHJlcG9ydCBhbHJlYWR5IGZpbmlzaGVkIGluIEFkZEJlYWNvblJlcG9ydAorCS8vIFRoZSBsZW5ndGggaXMgaW4gdGhlIEZyYW1lUmVwb3J0TGVuCisKKwkvLyByZXNldCBCZWFjb24gaW5kZXggZm9yIG5leHQgYmVhY29uIHJlcXVlc3QKKwlwQWQtPlN0YUNmZy5MYXN0QnNzSW5kZXggPSAweGZmOworCisJLy8gcmVzZXQgdG8gaWRsZSBzdGF0ZQorCXBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZS5DdXJyU3RhdGUgPSBBSVJPTkVUX0lETEU7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCZWFjb25SZXBvcnRBY3Rpb24gPC0tLS0tXG4iKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCQlJbmRleAkJQ3VycmVudCBCU1NJRCBpbiBDQ1hCc3N0YWIgZW50cnkgaW5kZXgKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFpcm9uZXRBZGRCZWFjb25SZXBvcnQoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCVVMT05HCQkJCUluZGV4LAorCUlOCVBNTE1FX1FVRVVFX0VMRU0JcEVsZW0pCit7CisJUFZPSUQJCQkJCQlwTXNnOworCVBVQ0hBUgkJCQkJCXBTcmMsIHBEZXN0OworCVVDSEFSCQkJCQkJUmVxSWR4OworCVVMT05HCQkJCQkJTXNnTGVuOworCVVTSE9SVAkJCQkJCUxlbmd0aDsKKwlQRlJBTUVfODAyXzExCQkJCXBGcmFtZTsKKwlQTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQJcFJlcG9ydDsKKwlQRUlEX1NUUlVDVAkJCSAgICAgICAgcEVpZDsKKwlQQkVBQ09OX1JFUE9SVAkJCQlwQmVhY29uUmVwb3J0OworCVBCU1NfRU5UUlkJCQkJCXBCc3M7CisKKwkvLyAwLiBTZXR1cCBwb2ludGVyIGZvciBwcm9jZXNzaW5nIGJlYWNvbiAmIHByb2JlIHJlc3BvbnNlCisJcE1zZyAgID0gcEVsZW0tPk1zZzsKKwlNc2dMZW4gPSBwRWxlbS0+TXNnTGVuOworCXBGcmFtZSA9IChQRlJBTUVfODAyXzExKSBwTXNnOworCXBTcmMgICA9IHBGcmFtZS0+T2N0ZXQ7CQkJCS8vIFN0YXJ0IGZyb20gQVAgVFNGCisJcEJzcyAgID0gKFBCU1NfRU5UUlkpICZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIuQnNzRW50cnlbSW5kZXhdOworCVJlcUlkeCA9IHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeDsKKworCS8vIDEgQ2hlY2sgdGhlIEluZGV4LCBpZiB3ZSBhbHJlYWR5IGNyZWF0ZSB0aGlzIGVudHJ5LCBvbmx5IHVwZGF0ZSB0aGUgYXZlcmFnZSBSU1NJCisJaWYgKChJbmRleCA8PSBwQWQtPlN0YUNmZy5MYXN0QnNzSW5kZXgpICYmIChwQWQtPlN0YUNmZy5MYXN0QnNzSW5kZXggIT0gMHhmZikpCisJeworCQlwRGVzdCAgPSAoUFVDSEFSKSAmcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRCdWZbcEFkLT5TdGFDZmcuQnNzUmVwb3J0T2Zmc2V0W0luZGV4XV07CisJCS8vIFBvaW50IHRvIGJzcyByZXBvcnQgaW5mb3JtYXRpb24KKwkJcERlc3QgKz0gc2l6ZW9mKE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKTsKKwkJcEJlYWNvblJlcG9ydCA9IChQQkVBQ09OX1JFUE9SVCkgcERlc3Q7CisKKwkJLy8gVXBkYXRlIFJ4IHBvd2VyLCBpbiBkQm0KKwkJLy8gR2V0IHRoZSBvcmlnaW5hbCBSU1NJIHJlYWRiYWNrIGZyb20gQkJQCisJCXBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgKz0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YTsKKwkJLy8gQXZlcmFnZSB0aGUgUnNzaSByZWFkaW5nCisJCXBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgID0gKHBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgKyBwQnNzLT5Sc3NpKSAvIDI7CisJCS8vIEdldCB0byBkQm0gZm9ybWF0CisJCXBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgLT0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCc3NpZCAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAiLAorCQkJcEJzcy0+QnNzaWRbMF0sIHBCc3MtPkJzc2lkWzFdLCBwQnNzLT5Cc3NpZFsyXSwKKwkJCXBCc3MtPkJzc2lkWzNdLCBwQnNzLT5Cc3NpZFs0XSwgcEJzcy0+QnNzaWRbNV0pKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUnhQb3dlclslbGRdIFJzc2kgJWQsIEF2ZyBSc3NpICVkXG4iLCBJbmRleCwgKHBCc3MtPlJzc2kgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSwgcEJlYWNvblJlcG9ydC0+UnhQb3dlciAtIDI1NikpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGcmFtZVJlcG9ydExlbiA9ICVkXG4iLCBwQWQtPlN0YUNmZy5Cc3NSZXBvcnRPZmZzZXRbSW5kZXhdKSk7CisKKwkJLy8gVXBkYXRlIG90aGVyIGluZm9ybWF0aW9uIGhlcmUKKworCQkvLyBEb25lCisJCXJldHVybjsKKwl9CisKKwkvLyAyLiBVcGRhdGUgcmVwb3J0ZWQgSW5kZXgKKwlwQWQtPlN0YUNmZy5MYXN0QnNzSW5kZXggPSBJbmRleDsKKworCS8vIDMuIFNldHVwIHRoZSBidWZmZXIgYWRkcmVzcyBmb3IgY29weWluZyB0aGlzIEJTU0lEIGludG8gcmVwb3J0aW5nIGZyYW1lCisJLy8gICAgVGhlIG9mZnNldCBzaG91bGQgc3RhcnQgYWZ0ZXIgODAyLjExIGhlYWRlciBhbmQgcmVwb3J0IGZyYW1lIGhlYWRlci4KKwlwRGVzdCA9IChQVUNIQVIpICZwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydEJ1ZltwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbl07CisKKwkvLyA0LiBTYXZlIHRoZSBzdGFydCBvZmZzZXQgb2YgZWFjaCBCc3MgaW4gcmVwb3J0IGZyYW1lCisJcEFkLT5TdGFDZmcuQnNzUmVwb3J0T2Zmc2V0W0luZGV4XSA9IHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuOworCisJLy8gNS4gRmlsbCBNZWFzdXJlbWVudCByZXBvcnQgZmllbGRzCisJcFJlcG9ydCA9IChQTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpIHBEZXN0OworCXBSZXBvcnQtPkVpZCA9IElFX01FQVNVUkVNRU5UX1JFUE9SVDsKKwlwUmVwb3J0LT5MZW5ndGggPSAwOworCXBSZXBvcnQtPlRva2VuICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtSZXFJZHhdLlJlcUVsZW0uVG9rZW47CisJcFJlcG9ydC0+TW9kZSAgID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W1JlcUlkeF0uUmVxRWxlbS5Nb2RlOworCXBSZXBvcnQtPlR5cGUgICA9IE1TUk5fVFlQRV9CRUFDT05fUkVROworCUxlbmd0aCAgICAgICAgICA9IHNpemVvZihNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCk7CisJcERlc3QgICAgICAgICAgKz0gc2l6ZW9mKE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKTsKKworCS8vIDYuIFN0YXJ0IHRoZWJlYWNvbiByZXBvcnQgZm9ybWF0CisJcEJlYWNvblJlcG9ydCA9IChQQkVBQ09OX1JFUE9SVCkgcERlc3Q7CisJcERlc3QgICAgICAgICs9IHNpemVvZihCRUFDT05fUkVQT1JUKTsKKwlMZW5ndGggICAgICAgKz0gc2l6ZW9mKEJFQUNPTl9SRVBPUlQpOworCisJLy8gNy4gQ29weSBDaGFubmVsIG51bWJlcgorCXBCZWFjb25SZXBvcnQtPkNoYW5uZWwgICAgICAgID0gcEJzcy0+Q2hhbm5lbDsKKwlwQmVhY29uUmVwb3J0LT5TcGFyZSAgICAgICAgICA9IDA7CisJcEJlYWNvblJlcG9ydC0+RHVyYXRpb24gICAgICAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbUmVxSWR4XS5NZWFzdXJlbWVudC5EdXJhdGlvbjsKKwlwQmVhY29uUmVwb3J0LT5QaHlUeXBlICAgICAgICA9ICgocEJzcy0+U3VwUmF0ZUxlbitwQnNzLT5FeHRSYXRlTGVuID4gNCkgPyBQSFlfRVJQIDogUEhZX0RTUyk7CisJLy8gOC4gUnggcG93ZXIsIGluIGRCbQorCXBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgICAgICAgID0gcEJzcy0+UnNzaSAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGE7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCc3NpZCAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAiLAorCQlwQnNzLT5Cc3NpZFswXSwgcEJzcy0+QnNzaWRbMV0sIHBCc3MtPkJzc2lkWzJdLAorCQlwQnNzLT5Cc3NpZFszXSwgcEJzcy0+QnNzaWRbNF0sIHBCc3MtPkJzc2lkWzVdKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUnhQb3dlclslbGRdLCBSc3NpICVkXG4iLCBJbmRleCwgcEJlYWNvblJlcG9ydC0+UnhQb3dlciAtIDI1NikpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkZyYW1lUmVwb3J0TGVuID0gJWRcbiIsIHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuKSk7CisKKwlwQmVhY29uUmVwb3J0LT5CZWFjb25JbnRlcnZhbCA9IHBCc3MtPkJlYWNvblBlcmlvZDsKKwlDT1BZX01BQ19BRERSKHBCZWFjb25SZXBvcnQtPkJTU0lELCBwRnJhbWUtPkhkci5BZGRyMyk7CisJTmRpc01vdmVNZW1vcnkocEJlYWNvblJlcG9ydC0+UGFyZW50VFNGLCBwU3JjLCA0KTsKKwlOZGlzTW92ZU1lbW9yeShwQmVhY29uUmVwb3J0LT5UYXJnZXRUU0YsICZwRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7CisJTmRpc01vdmVNZW1vcnkoJnBCZWFjb25SZXBvcnQtPlRhcmdldFRTRls0XSwgJnBFbGVtLT5UaW1lU3RhbXAudS5IaWdoUGFydCwgNCk7CisKKwkvLyA5LiBTa2lwIHRoZSBiZWFjb24gZnJhbWUgYW5kIG9mZnNldCB0byBzdGFydCBvZiBjYXBhYmlsaXR5aW5mbyBzaW5jZSB3ZSBhbHJlYWR5IHByb2Nlc3NlZCBjYXBhYmlsaXR5aW5mbworCXBTcmMgKz0gKFRJTUVTVEFNUF9MRU4gKyAyKTsKKwlwQmVhY29uUmVwb3J0LT5DYXBhYmlsaXR5SW5mbyA9ICooVVNIT1JUICopcFNyYzsKKworCS8vIDEwLiBQb2ludCB0byBzdGFydCBvZiBlbGVtZW50IElECisJcFNyYyArPSAyOworCXBFaWQgPSAoUEVJRF9TVFJVQ1QpIHBTcmM7CisKKwkvLyAxMS4gU3RhcnQgcHJvY2VzcyBhbGwgdmFyaWFibGUgRWlkIG9heWxvYWQgYW5kIGFkZCB0aGUgYXBwcm9wcmlhdGUgdG8gdGhlIGZyYW1lIHJlcG9ydAorCXdoaWxlICgoKFBVQ0hBUikgcEVpZCArIHBFaWQtPkxlbiArIDEpIDwgKChQVUNIQVIpIHBGcmFtZSArIE1zZ0xlbikpCisJeworCQkvLyBPbmx5IGxpbWl0ZWQgRUlEIGFyZSByZXF1aXJlZCB0byByZXBvcnQgZm9yIENDWCAyLiBJdCBpbmNsdWRlcyBTU0lELCBTdXBwb3J0ZWQgcmF0ZSwKKwkJLy8gRkggcGFyYW1lbnRlciBzZXQsIERTIHBhcmFtZXRlciBzZXQsIENGIHBhcmFtZXRlciBzZXQsIElCU1MgcGFyYW1ldGVyIHNldCwKKwkJLy8gVElNIChyZXBvcnQgZmlyc3QgNCBieXRlcyBvbmx5LCByYWRpbyBtZWFzdXJlbWVudCBjYXBhYmlsaXR5CisJCXN3aXRjaCAocEVpZC0+RWlkKQorCQl7CisJCQljYXNlIElFX1NTSUQ6CisJCQljYXNlIElFX1NVUFBfUkFURVM6CisJCQljYXNlIElFX0ZIX1BBUk06CisJCQljYXNlIElFX0RTX1BBUk06CisJCQljYXNlIElFX0NGX1BBUk06CisJCQljYXNlIElFX0lCU1NfUEFSTToKKwkJCQlOZGlzTW92ZU1lbW9yeShwRGVzdCwgcEVpZCwgcEVpZC0+TGVuICsgMik7CisJCQkJcERlc3QgICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJCQlMZW5ndGggKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCWJyZWFrOworCisJCQljYXNlIElFX01FQVNVUkVNRU5UX0NBUEFCSUxJVFk6CisJCQkJLy8gU2luY2UgdGhpcyBJRSBpcyBkdXBsaWNhdGVkIHdpdGggV1BBIHNlY3VyaXR5IElFLCB3ZSBoYXMgdG8gZG8gc2FuaXR5IGNoZWNrIGJlZm9yZQorCQkJCS8vIHJlY29nbml6ZSBpdC4KKwkJCQkvLyAxLiBJdCBhbHNvIGhhcyBmaXhlZCA2IGJ5dGVzIElFIGxlbmd0aC4KKwkJCQlpZiAocEVpZC0+TGVuICE9IDYpCisJCQkJCWJyZWFrOworCQkJCS8vIDIuIENoZWNrIHRoZSBDaXNjbyBBaXJvbmV0IE9VSQorCQkJCWlmIChOZGlzRXF1YWxNZW1vcnkoQ0lTQ09fT1VJLCAocFNyYyArIDIpLCAzKSkKKwkJCQl7CisJCQkJCS8vIE1hdGNoZWQsIHRoaXMgaXMgd2hhdCB3ZSB3YW50CisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBEZXN0LCBwRWlkLCBwRWlkLT5MZW4gKyAyKTsKKwkJCQkJcERlc3QgICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJCQkJTGVuZ3RoICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSUVfVElNOgorCQkJCWlmIChwRWlkLT5MZW4gPiA0KQorCQkJCXsKKwkJCQkJLy8gTWF5IHRydW5jYXRlIGFuZCByZXBvcnQgdGhlIGZpcnN0IDQgYnl0ZXMgb25seSwgd2l0aCB0aGUgZWlkICYgbGVuLCB0b3RhbCBzaG91bGQgYmUgNgorCQkJCQlOZGlzTW92ZU1lbW9yeShwRGVzdCwgcEVpZCwgNik7CisJCQkJCXBEZXN0ICArPSA2OworCQkJCQlMZW5ndGggKz0gNjsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJTmRpc01vdmVNZW1vcnkocERlc3QsIHBFaWQsIHBFaWQtPkxlbiArIDIpOworCQkJCQlwRGVzdCAgKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCQlMZW5ndGggKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJfQorCQkvLyAxMi4gTW92ZSB0byBuZXh0IGVsZW1lbnQgSUQKKwkJcFNyYyArPSAoMiArIHBFaWQtPkxlbik7CisJCXBFaWQgPSAoUEVJRF9TVFJVQ1QpIHBTcmM7CisJfQorCisJLy8gMTMuIFVwZGF0ZSB0aGUgbGVuZ3RoIGluIHRoZSBoZWFkZXIsIG5vdCBpbmNsdWRlIEVJRCBhbmQgbGVuZ3RoCisJcFJlcG9ydC0+TGVuZ3RoID0gTGVuZ3RoIC0gNDsKKworCS8vIDE0LiBVcGRhdGUgdGhlIGZyYW1lIHJlcG9ydCBidWZmZXIgZGF0YSBsZW5ndGgKKwlwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbiArPSBMZW5ndGg7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRlIgbGVuID0gJWRcbiIsIHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCQlJbmRleAkJQ3VycmVudCBCU1NJRCBpbiBDQ1hCc3N0YWIgZW50cnkgaW5kZXgKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFpcm9uZXRDcmVhdGVCZWFjb25SZXBvcnRGcm9tQnNzVGFibGUoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkKQoreworCVBNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVAlwUmVwb3J0OworCVBCRUFDT05fUkVQT1JUCQkJCXBCZWFjb25SZXBvcnQ7CisJVUNIQVIJCQkJCQlJbmRleCwgUmVxSWR4OworCVVTSE9SVAkJCQkJCUxlbmd0aDsKKwlQVUNIQVIJCQkJCQlwRGVzdDsKKwlQQlNTX0VOVFJZCQkJCQlwQnNzOworCisJLy8gMC4gc2V0dXAgYmFzZSBwb2ludGVyCisJUmVxSWR4ID0gcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4OworCisJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgcEFkLT5TdGFDZmcuQ0NYQnNzVGFiLkJzc05yOyBJbmRleCsrKQorCXsKKwkJLy8gMS4gU2V0dXAgdGhlIGJ1ZmZlciBhZGRyZXNzIGZvciBjb3B5aW5nIHRoaXMgQlNTSUQgaW50byByZXBvcnRpbmcgZnJhbWUKKwkJLy8gICAgVGhlIG9mZnNldCBzaG91bGQgc3RhcnQgYWZ0ZXIgODAyLjExIGhlYWRlciBhbmQgcmVwb3J0IGZyYW1lIGhlYWRlci4KKwkJcERlc3QgID0gKFBVQ0hBUikgJnBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0QnVmW3BBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuXTsKKwkJcEJzcyAgID0gKFBCU1NfRU5UUlkpICZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIuQnNzRW50cnlbSW5kZXhdOworCQlMZW5ndGggPSAwOworCisJCS8vIDIuIEZpbGwgTWVhc3VyZW1lbnQgcmVwb3J0IGZpZWxkcworCQlwUmVwb3J0ICAgICAgICAgPSAoUE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKSBwRGVzdDsKKwkJcFJlcG9ydC0+RWlkICAgID0gSUVfTUVBU1VSRU1FTlRfUkVQT1JUOworCQlwUmVwb3J0LT5MZW5ndGggPSAwOworCQlwUmVwb3J0LT5Ub2tlbiAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbUmVxSWR4XS5SZXFFbGVtLlRva2VuOworCQlwUmVwb3J0LT5Nb2RlICAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbUmVxSWR4XS5SZXFFbGVtLk1vZGU7CisJCXBSZXBvcnQtPlR5cGUgICA9IE1TUk5fVFlQRV9CRUFDT05fUkVROworCQlMZW5ndGggICAgICAgICAgPSBzaXplb2YoTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpOworCQlwRGVzdCAgICAgICAgICArPSBzaXplb2YoTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpOworCisJCS8vIDMuIFN0YXJ0IHRoZSBiZWFjb24gcmVwb3J0IGZvcm1hdAorCQlwQmVhY29uUmVwb3J0ID0gKFBCRUFDT05fUkVQT1JUKSBwRGVzdDsKKwkJcERlc3QgICAgICAgICs9IHNpemVvZihCRUFDT05fUkVQT1JUKTsKKwkJTGVuZ3RoICAgICAgICs9IHNpemVvZihCRUFDT05fUkVQT1JUKTsKKworCQkvLyA0LiBDb3B5IENoYW5uZWwgbnVtYmVyCisJCXBCZWFjb25SZXBvcnQtPkNoYW5uZWwgICAgICAgID0gcEJzcy0+Q2hhbm5lbDsKKwkJcEJlYWNvblJlcG9ydC0+U3BhcmUgICAgICAgICAgPSAwOworCQlwQmVhY29uUmVwb3J0LT5EdXJhdGlvbiAgICAgICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtSZXFJZHhdLk1lYXN1cmVtZW50LkR1cmF0aW9uOworCQlwQmVhY29uUmVwb3J0LT5QaHlUeXBlICAgICAgICA9ICgocEJzcy0+U3VwUmF0ZUxlbitwQnNzLT5FeHRSYXRlTGVuID4gNCkgPyBQSFlfRVJQIDogUEhZX0RTUyk7CisJCXBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgICAgICAgID0gcEJzcy0+UnNzaSAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGE7CisJCXBCZWFjb25SZXBvcnQtPkJlYWNvbkludGVydmFsID0gcEJzcy0+QmVhY29uUGVyaW9kOworCQlwQmVhY29uUmVwb3J0LT5DYXBhYmlsaXR5SW5mbyA9IHBCc3MtPkNhcGFiaWxpdHlJbmZvOworCQlDT1BZX01BQ19BRERSKHBCZWFjb25SZXBvcnQtPkJTU0lELCBwQnNzLT5Cc3NpZCk7CisJCU5kaXNNb3ZlTWVtb3J5KHBCZWFjb25SZXBvcnQtPlBhcmVudFRTRiwgcEJzcy0+UFRTRiwgNCk7CisJCU5kaXNNb3ZlTWVtb3J5KHBCZWFjb25SZXBvcnQtPlRhcmdldFRTRiwgcEJzcy0+VFRTRiwgOCk7CisKKwkJLy8gNS4gQ3JlYXRlIFNTSUQKKwkJKnBEZXN0KysgPSAweDAwOworCQkqcERlc3QrKyA9IHBCc3MtPlNzaWRMZW47CisJCU5kaXNNb3ZlTWVtb3J5KHBEZXN0LCBwQnNzLT5Tc2lkLCBwQnNzLT5Tc2lkTGVuKTsKKwkJcERlc3QgICs9IHBCc3MtPlNzaWRMZW47CisJCUxlbmd0aCArPSAoMiArIHBCc3MtPlNzaWRMZW4pOworCisJCS8vIDYuIENyZWF0ZSBTdXBwb3J0UmF0ZXMKKwkJKnBEZXN0KysgPSAweDAxOworCQkqcERlc3QrKyA9IHBCc3MtPlN1cFJhdGVMZW47CisJCU5kaXNNb3ZlTWVtb3J5KHBEZXN0LCBwQnNzLT5TdXBSYXRlLCBwQnNzLT5TdXBSYXRlTGVuKTsKKwkJcERlc3QgICs9IHBCc3MtPlN1cFJhdGVMZW47CisJCUxlbmd0aCArPSAoMiArIHBCc3MtPlN1cFJhdGVMZW4pOworCisJCS8vIDcuIERTIFBhcmFtZXRlcgorCQkqcERlc3QrKyA9IDB4MDM7CisJCSpwRGVzdCsrID0gMTsKKwkJKnBEZXN0KysgPSBwQnNzLT5DaGFubmVsOworCQlMZW5ndGggICs9IDM7CisKKwkJLy8gOC4gSUJTUyBwYXJhbWV0ZXIgaWYgcHJlc2VudHMKKwkJaWYgKHBCc3MtPkJzc1R5cGUgPT0gQlNTX0FESE9DKQorCQl7CisJCQkqcERlc3QrKyA9IDB4MDY7CisJCQkqcERlc3QrKyA9IDI7CisJCQkqKFBVU0hPUlQpIHBEZXN0ID0gcEJzcy0+QXRpbVdpbjsKKwkJCXBEZXN0ICAgKz0gMjsKKwkJCUxlbmd0aCAgKz0gNDsKKwkJfQorCisJCS8vIDkuIFVwZGF0ZSBsZW5ndGggZmllbGQsIG5vdCBpbmNsdWRlIEVJRCBhbmQgbGVuZ3RoCisJCXBSZXBvcnQtPkxlbmd0aCA9IExlbmd0aCAtIDQ7CisKKwkJLy8gMTAuIFVwZGF0ZSB0b3RhbCBmcmFtZSBzaXplCisJCXBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuICs9IExlbmd0aDsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9hc3NvYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYXNzb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmRiNzUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYXNzb2MuYwpAQCAtMCwwICsxLDE4MjYgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJYXNzb2MuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUpvaG4JCTIwMDQtOS0zCQlwb3J0aW5nIGZyb20gUlQyNTAwCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCitVQ0hBUglDaXBoZXJXcGFUZW1wbGF0ZVtdID0geworCQkweGRkLCAJCQkJCS8vIFdQQSBJRQorCQkweDE2LAkJCQkJLy8gTGVuZ3RoCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEsCS8vIG91aQorCQkweDAxLCAweDAwLAkJCQkvLyBWZXJzaW9uCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8vIE11bHRpY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBOdW1iZXIgb2YgdW5pY2FzdAorCQkweDAwLCAweDUwLCAweGYyLCAweDAyLAkvLyB1bmljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMQkvLyBhdXRoZW50aWNhdGlvbgorCQl9OworCitVQ0hBUglDaXBoZXJXcGEyVGVtcGxhdGVbXSA9IHsKKwkJMHgzMCwJCQkJCS8vIFJTTiBJRQorCQkweDE0LAkJCQkJLy8gTGVuZ3RoCisJCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KKwkJMHgwMCwgMHgwZiwgMHhhYywgMHgwMiwJLy8gZ3JvdXAgY2lwaGVyLCBUS0lQCisJCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBwYWlyd2lzZQorCQkweDAwLCAweDBmLCAweGFjLCAweDAyLAkvLyB1bmljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QKKwkJMHgwMCwgMHgwZiwgMHhhYywgMHgwMiwJLy8gYXV0aGVudGljYXRpb24KKwkJMHgwMCwgMHgwMCwJCQkJLy8gUlNOIGNhcGFiaWxpdHkKKwkJfTsKKworVUNIQVIJQ2N4MkllSW5mb1tdID0geyAweDAwLCAweDQwLCAweDk2LCAweDAzLCAweDAyfTsKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlhc3NvY2lhdGlvbiBzdGF0ZSBtYWNoaW5lIGluaXQsIGluY2x1ZGluZyBzdGF0ZSB0cmFuc2l0aW9uIGFuZCB0aW1lciBpbml0CisJUGFyYW1ldGVyczoKKwkJUyAtIHBvaW50ZXIgdG8gdGhlIGFzc29jaWF0aW9uIHN0YXRlIG1hY2hpbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzc29jU3RhdGVNYWNoaW5lSW5pdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgU1RBVEVfTUFDSElORSAqUywKKwlPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCit7CisJU3RhdGVNYWNoaW5lSW5pdChTLCBUcmFucywgTUFYX0FTU09DX1NUQVRFLCBNQVhfQVNTT0NfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIEFTU09DX0lETEUsIEFTU09DX01BQ0hJTkVfQkFTRSk7CisKKwkvLyBmaXJzdCBjb2x1bW4KKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfSURMRSwgTVQyX01MTUVfQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVBc3NvY1JlcUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX0lETEUsIE1UMl9NTE1FX1JFQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVSZWFzc29jUmVxQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfSURMRSwgTVQyX01MTUVfRElTQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVEaXNhc3NvY1JlcUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX0lETEUsIE1UMl9QRUVSX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGlzYXNzb2NBY3Rpb24pOworCisJLy8gc2Vjb25kIGNvbHVtbgorCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5Bc3NvYyk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9SRUFTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuUmVhc3NvYyk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jaWF0ZSk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRpc2Fzc29jQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX0FTU09DX1JTUCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQXNzb2NSc3BBY3Rpb24pOworCS8vCisJLy8gUGF0Y2ggM0NvbSBBUCBNT2RlOjNDUldFNDU0RzcyCisJLy8gV2Ugc2VuZCBBc3NvYyByZXF1ZXN0IGZyYW1lIHRvIHRoaXMgQVAsIGl0IGFsd2F5cyBzZW5kIFJlYXNzb2MgUnNwIG5vdCBBc3NvY2lhdGUgUnNwLgorCS8vCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9SRUFTU09DX1JTUCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQXNzb2NSc3BBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19XQUlUX1JTUCwgTVQyX0FTU09DX1RJTUVPVVQsIChTVEFURV9NQUNISU5FX0ZVTkMpQXNzb2NUaW1lb3V0QWN0aW9uKTsKKworCS8vIHRoaXJkIGNvbHVtbgorCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9BU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkFzc29jKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfUkVBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlblJlYXNzb2MpOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jaWF0ZSk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGlzYXNzb2NBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9SRUFTU09DX1JTUCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyUmVhc3NvY1JzcEFjdGlvbik7CisJLy8KKwkvLyBQYXRjaCwgQVAgZG9lc24ndCBzZW5kIFJlYXNzb2NpYXRlIFJzcCBmcmFtZSB0byBTdGF0aW9uLgorCS8vCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX0FTU09DX1JTUCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyUmVhc3NvY1JzcEFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9SRUFTU09DX1RJTUVPVVQsIChTVEFURV9NQUNISU5FX0ZVTkMpUmVhc3NvY1RpbWVvdXRBY3Rpb24pOworCisJLy8gZm91cnRoIGNvbHVtbgorCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBESVNBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5Bc3NvYyk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIERJU0FTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9SRUFTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuUmVhc3NvYyk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIERJU0FTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jaWF0ZSk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIERJU0FTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRpc2Fzc29jQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgRElTQVNTT0NfV0FJVF9SU1AsIE1UMl9ESVNBU1NPQ19USU1FT1VULCAoU1RBVEVfTUFDSElORV9GVU5DKURpc2Fzc29jVGltZW91dEFjdGlvbik7CisKKwkvLyBpbml0aWFsaXplIHRoZSB0aW1lcgorCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LkFzc29jVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihBc3NvY1RpbWVvdXQpLCBwQWQsIEZBTFNFKTsKKwlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZUF1eC5SZWFzc29jVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihSZWFzc29jVGltZW91dCksIHBBZCwgRkFMU0UpOworCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LkRpc2Fzc29jVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihEaXNhc3NvY1RpbWVvdXQpLCBwQWQsIEZBTFNFKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlBc3NvY2lhdGlvbiB0aW1lb3V0IHByb2NlZHVyZS4gQWZ0ZXIgYXNzb2NpYXRpb24gdGltZW91dCwgdGhpcyBmdW5jdGlvbgorCQl3aWxsIGJlIGNhbGxlZCBhbmQgaXQgd2lsbCBwdXQgYSBtZXNzYWdlIGludG8gdGhlIE1MTUUgcXVldWUKKwlQYXJhbWV0ZXJzOgorCQlTdGFuZGFyZCB0aW1lciBwYXJhbWV0ZXJzCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNzb2NUaW1lb3V0KElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwkJCQkgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCQkJCSBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJCQkJIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKwlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQlyZXR1cm47CisKKwlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9BU1NPQ19USU1FT1VULCAwLCBOVUxMKTsKKwlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUmVhc3NvY2lhdGlvbiB0aW1lb3V0IHByb2NlZHVyZS4gQWZ0ZXIgcmVhc3NvY2lhdGlvbiB0aW1lb3V0LCB0aGlzCisJCWZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFuZCBwdXQgYSBtZXNzYWdlIGludG8gdGhlIE1MTUUgcXVldWUKKwlQYXJhbWV0ZXJzOgorCQlTdGFuZGFyZCB0aW1lciBwYXJhbWV0ZXJzCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUmVhc3NvY1RpbWVvdXQoSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCQkJCQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJCQkJCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwkJCQkJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCVJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCXJldHVybjsKKworCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfVElNRU9VVCwgMCwgTlVMTCk7CisJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCURpc2Fzc29jaWF0aW9uIHRpbWVvdXQgcHJvY2VkdXJlLiBBZnRlciBkaXNhc3NvY2lhdGlvbiB0aW1lb3V0LCB0aGlzCisJCWZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFuZCBwdXQgYSBtZXNzYWdlIGludG8gdGhlIE1MTUUgcXVldWUKKwlQYXJhbWV0ZXJzOgorCQlTdGFuZGFyZCB0aW1lciBwYXJhbWV0ZXJzCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgRGlzYXNzb2NUaW1lb3V0KElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwkJCQkJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCQkJCQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJCQkJCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKwlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQlyZXR1cm47CisKKwlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9ESVNBU1NPQ19USU1FT1VULCAwLCBOVUxMKTsKKwlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJbWxtZSBhc3NvYyByZXEgaGFuZGxpbmcgcHJvY2VkdXJlCisJUGFyYW1ldGVyczoKKwkJQWRhcHRlciAtIEFkYXB0ZXIgcG9pbnRlcgorCQlFbGVtIC0gTUxNRSBRdWV1ZSBFbGVtZW50CisJUHJlOgorCQl0aGUgc3RhdGlvbiBoYXMgYmVlbiBhdXRoZW50aWNhdGVkIGFuZCB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbiB0aGUgY29uZmlnCisJCQktIyBTU0lECisJCQktIyBzdXBwb3J0ZWQgcmF0ZXMgYW5kIHRoZWlyIGxlbmd0aAorCQkJLSMgbGlzdGVuIGludGVydmFsIChBZGFwdGVyLT5TdGFDZmcuZGVmYXVsdF9saXN0ZW5fY291bnQpCisJCQktIyBUcmFuc21pdCBwb3dlciAgKEFkYXB0ZXItPlN0YUNmZy50eF9wb3dlcikKKwlQb3N0ICA6CisJCS0jIEFuIGFzc29jaWF0aW9uIHJlcXVlc3QgZnJhbWUgaXMgZ2VuZXJhdGVkIGFuZCBzZW50IHRvIHRoZSBhaXIKKwkJLSMgQXNzb2NpYXRpb24gdGltZXIgc3RhcnRzCisJCS0jIEFzc29jaWF0aW9uIHN0YXRlIC0+IEFTU09DX1dBSVRfUlNQCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZUFzc29jUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUgkJCUFwQWRkcls2XTsKKwlIRUFERVJfODAyXzExCUFzc29jSGRyOworCVVDSEFSCQkJQ2N4MkxlbiA9IDU7CisJVUNIQVIJCQlXbWVJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDB4MDcsIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDB9OworCVVTSE9SVAkJCUxpc3RlbkludHY7CisJVUxPTkcJCQlUaW1lb3V0OworCVVTSE9SVAkJCUNhcGFiaWxpdHlJbmZvOworCUJPT0xFQU4JCQlUaW1lckNhbmNlbGxlZDsKKwlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUwkJTlN0YXR1czsKKwlVTE9ORwkJCUZyYW1lTGVuID0gMDsKKwlVTE9ORwkJCXRtcDsKKwlVU0hPUlQJCQlWYXJJZXNPZmZzZXQ7CisJVUNIQVIJCQlDa2lwRmxhZzsKKwlVQ0hBUgkJCUNraXBOZWdvdGlhdGlvbkJ1ZmZlcltDS0lQX05FR09USUFUSU9OX0xFTkdUSF07CisJVUNIQVIJCQlBaXJvbmV0Q2tpcEllID0gSUVfQUlST05FVF9DS0lQOworCVVDSEFSCQkJQWlyb25ldENraXBMZW4gPSBDS0lQX05FR09USUFUSU9OX0xFTkdUSDsKKwlVQ0hBUgkJCUFpcm9uZXRJUEFkZHJlc3NJRSA9IElFX0FJUk9ORVRfSVBBRERSRVNTOworCVVDSEFSCQkJQWlyb25ldElQQWRkcmVzc0xlbiA9IEFJUk9ORVRfSVBBRERSRVNTX0xFTkdUSDsKKwlVQ0hBUgkJCUFpcm9uZXRJUEFkZHJlc3NCdWZmZXJbQUlST05FVF9JUEFERFJFU1NfTEVOR1RIXSA9IHsweDAwLCAweDQwLCAweDk2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwfTsKKwlVU0hPUlQJCQlTdGF0dXM7CisKKwkvLyBCbG9jayBhbGwgYXV0aGVudGljYXRpb24gcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QKKwlpZiAocEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPT0gVFJVRSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gQmxvY2sgQXNzb2MgcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QhXG4iKSk7CisJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOworCX0KKwkvLyBjaGVjayBzYW5pdHkgZmlyc3QKKwllbHNlIGlmIChNbG1lQXNzb2NSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQXBBZGRyLCAmQ2FwYWJpbGl0eUluZm8sICZUaW1lb3V0LCAmTGlzdGVuSW50dikpCisJeworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5Bc3NvY1RpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQlDT1BZX01BQ19BRERSKHBBZC0+TWxtZUF1eC5Cc3NpZCwgQXBBZGRyKTsKKworCQkvLyBHZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOworCQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFTU09DIC0gTWxtZUFzc29jUmVxQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJCVN0YXR1cyA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIEFkZCBieSBKYW1lcyAwMy8wNi8yNworCQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uTGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OKTsKKwkJLy8gQXNzb2NpYXRpb24gZG9uJ3QgbmVlZCB0byByZXBvcnQgTUFDIGFkZHJlc3MKKwkJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLkF2YWlsYWJsZVJlcXVlc3RGaXhlZElFcyA9CisJCQlORElTXzgwMl8xMV9BSV9SRVFGSV9DQVBBQklMSVRJRVMgfCBORElTXzgwMl8xMV9BSV9SRVFGSV9MSVNURU5JTlRFUlZBTDsKKwkJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLlJlcXVlc3RGaXhlZElFcy5DYXBhYmlsaXRpZXMgPSBDYXBhYmlsaXR5SW5mbzsKKwkJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLlJlcXVlc3RGaXhlZElFcy5MaXN0ZW5JbnRlcnZhbCA9IExpc3RlbkludHY7CisJCS8vIE9ubHkgcmVhc3NvY2lhdGUgbmVlZCB0aGlzCisJCS8vQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5Bc3NvY0luZm8uUmVxdWVzdEZpeGVkSUVzLkN1cnJlbnRBUEFkZHJlc3MsIEFwQWRkcik7CisJCXBBZC0+U3RhQ2ZnLkFzc29jSW5mby5PZmZzZXRSZXF1ZXN0SUVzID0gc2l6ZW9mKE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OKTsKKworICAgICAgICBOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMsIE1BWF9WSUVfTEVOKTsKKwkJLy8gRmlyc3QgYWRkIFNTSUQKKwkJVmFySWVzT2Zmc2V0ID0gMDsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCAmU3NpZEllLCAxKTsKKwkJVmFySWVzT2Zmc2V0ICs9IDE7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgJnBBZC0+TWxtZUF1eC5Tc2lkTGVuLCAxKTsKKwkJVmFySWVzT2Zmc2V0ICs9IDE7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKKwkJVmFySWVzT2Zmc2V0ICs9IHBBZC0+TWxtZUF1eC5Tc2lkTGVuOworCisJCS8vIFNlY29uZCBhZGQgU3VwcG9ydGVkIHJhdGVzCisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgJlN1cFJhdGVJZSwgMSk7CisJCVZhckllc09mZnNldCArPSAxOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsICZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwgMSk7CisJCVZhckllc09mZnNldCArPSAxOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsIHBBZC0+TWxtZUF1eC5TdXBSYXRlLCBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbik7CisJCVZhckllc09mZnNldCArPSBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbjsKKwkJLy8gRW5kIEFkZCBieSBKYW1lcworCisgICAgICAgIGlmICgocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KSAmJgorICAgICAgICAgICAgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IFRSVUUpKQorICAgICAgICAgICAgQ2FwYWJpbGl0eUluZm8gfD0gMHgwMTAwOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gU2VuZCBBU1NPQyByZXF1ZXN0Li4uXG4iKSk7CisJCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQXNzb2NIZHIsIFNVQlRZUEVfQVNTT0NfUkVRLCAwLCBBcEFkZHIsIEFwQWRkcik7CisKKwkJLy8gQnVpbGQgYmFzaWMgZnJhbWUgZmlyc3QKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAorCQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksCSZBc3NvY0hkciwKKwkJCQkJCSAgMiwJCQkJCQkmQ2FwYWJpbGl0eUluZm8sCisJCQkJCQkgIDIsCQkJCQkJJkxpc3RlbkludHYsCisJCQkJCQkgIDEsCQkJCQkJJlNzaWRJZSwKKwkJCQkJCSAgMSwJCQkJCQkmcEFkLT5NbG1lQXV4LlNzaWRMZW4sCisJCQkJCQkgIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCAJcEFkLT5NbG1lQXV4LlNzaWQsCisJCQkJCQkgIDEsCQkJCQkJJlN1cFJhdGVJZSwKKwkJCQkJCSAgMSwJCQkJCQkmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sCisJCQkJCQkgIHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLCAgcEFkLT5NbG1lQXV4LlN1cFJhdGUsCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKKworCQlpZiAocEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gIT0gMCkKKwkJeworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAmdG1wLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmRXh0UmF0ZUllLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4sCisJCQkJCQkJICBwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiwgIHBBZC0+TWxtZUF1eC5FeHRSYXRlLAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gdG1wOworCQl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJLy8gSFQKKwkJaWYgKChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuID4gMCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCisJCXsKKwkJCVVMT05HIFRtcExlbjsKKwkJCVVDSEFSIEh0TGVuOworCQkJVUNIQVIgQlJPQURDT01bNF0gPSB7MHgwLCAweDkwLCAweDRjLCAweDMzfTsKKwkJCWlmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJQcmVOSHQgPT0gVFJVRSkKKwkJCXsKKwkJCQlIdExlbiA9IFNJWkVfSFRfQ0FQX0lFICsgNDsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcExlbiwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmV3BhSWUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0TGVuLAorCQkJCQkJCSAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCUk9BRENPTVswXSwKKwkJCQkJCQkgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwgICAgICAgICAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQl9CisJCQllbHNlCisJCQl7CisjaWZkZWYgUlRfQklHX0VORElBTgorCQkgICAgICAgIEhUX0NBUEFCSUxJVFlfSUUgSHRDYXBhYmlsaXR5VG1wOworI2VuZGlmCisKKyNpZm5kZWYgUlRfQklHX0VORElBTgorCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wTGVuLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcEllLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJCSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLCAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkoJkh0Q2FwYWJpbGl0eVRtcCwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeSgmSHRDYXBhYmlsaXR5VG1wLCAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbik7CisgICAgICAgIAkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSk7CisgICAgICAgIAkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSk7CisKKyAgICAgICAgCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgJlRtcExlbiwKKyAgICAgICAgCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0Q2FwSWUsCisgICAgICAgIAkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLAorICAgICAgICAJCQkJCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwmSHRDYXBhYmlsaXR5VG1wLAorICAgICAgICAJCQkJCQkJRU5EX09GX0FSR1MpOworI2VuZGlmCisJCQl9CisJCQlGcmFtZUxlbiArPSBUbXBMZW47CisJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkvLyBhZGQgUmFsaW5rIHByb3ByaWV0YXJ5IElFIHRvIGluZm9ybSBBUCB0aGlzIFNUQSBpcyBnb2luZyB0byB1c2UgQUdHUkVHQVRJT04gb3IgUElHR1ktQkFDSytBR0dSRUdBVElPTgorCQkvLyBDYXNlIEk6IChBZ2dyZWdhdGlvbiArIFBpZ2d5LUJhY2spCisJCS8vIDEuIHVzZXIgZW5hYmxlIGFnZ3JlZ2F0aW9uLCBBTkQKKwkJLy8gMi4gTWFjIHN1cHBvcnQgcGlnZ3ktYmFjaworCQkvLyAzLiBBUCBhbm5vdWNlcyBpdCdzIFBJR0dZLUJBQ0srQUdHUkVHQVRJT04tY2FwYWJsZSBpbiBCRUFDT04KKwkJLy8gQ2FzZSBJSTogKEFnZ3JlZ2F0aW9uKQorCQkvLyAxLiB1c2VyIGVuYWJsZSBhZ2dyZWdhdGlvbiwgQU5ECisJCS8vIDIuIEFQIGFubm91Y2VzIGl0J3MgQUdHUkVHQVRJT04tY2FwYWJsZSBpbiBCRUFDT04KKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUpCisJCXsKKwkJCWlmICgocEFkLT5Db21tb25DZmcuYlBpZ2d5QmFja0NhcGFibGUpICYmICgocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgJiAweDAwMDAwMDAzKSA9PSAzKSkKKwkJCXsKKwkJCQlVTE9ORyBUbXBMZW47CisJCQkJVUNIQVIgUmFsaW5rSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDAzLCAweDAwLCAweDAwLCAweDAwfTsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLCAgICAgICAgICAgJlRtcExlbiwKKwkJCQkJCQkJICA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFsaW5rSWUsCisJCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJCX0KKwkJCWVsc2UgaWYgKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICYgMHgwMDAwMDAwMSkKKwkJCXsKKwkJCQlVTE9ORyBUbXBMZW47CisJCQkJVUNIQVIgUmFsaW5rSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDAxLCAweDAwLCAweDAwLCAweDAwfTsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLCAgICAgICAgICAgJlRtcExlbiwKKwkJCQkJCQkJICA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFsaW5rSWUsCisJCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCVVMT05HIFRtcExlbjsKKwkJCVVDSEFSIFJhbGlua0llWzldID0ge0lFX1ZFTkRPUl9TUEVDSUZJQywgNywgMHgwMCwgMHgwYywgMHg0MywgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMH07CisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLAkJICZUbXBMZW4sCisJCQkJCQkJICA5LAkJCQkJCSBSYWxpbmtJZSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJfQorCisJCWlmIChwQWQtPk1sbWVBdXguQVBFZGNhUGFybS5iVmFsaWQpCisJCXsKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgJiYgcEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlKQorCQkJeworCQkJCVFCU1NfU1RBX0lORk9fUEFSTSBRb3NJbmZvOworCisJCQkJTmRpc1plcm9NZW1vcnkoJlFvc0luZm8sIHNpemVvZihRQlNTX1NUQV9JTkZPX1BBUk0pKTsKKwkJCQlRb3NJbmZvLlVBUFNEX0FDX0JFID0gcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CRTsKKwkJCQlRb3NJbmZvLlVBUFNEX0FDX0JLID0gcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CSzsKKwkJCQlRb3NJbmZvLlVBUFNEX0FDX1ZJID0gcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WSTsKKwkJCQlRb3NJbmZvLlVBUFNEX0FDX1ZPID0gcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WTzsKKwkJCQlRb3NJbmZvLk1heFNQTGVuZ3RoID0gcEFkLT5Db21tb25DZmcuTWF4U1BMZW5ndGg7CisJCQkJV21lSWVbOF0gfD0gKihQVUNIQVIpJlFvc0luZm87CisJCQl9CisJCQllbHNlCisJCQl7CisgICAgICAgICAgICAgICAgLy8gVGhlIFBhcmFtZXRlciBTZXQgQ291bnQgaXMgc2V0IHRvIKGnMKGoIGluIHRoZSBhc3NvY2lhdGlvbiByZXF1ZXN0IGZyYW1lcworICAgICAgICAgICAgICAgIC8vIFdtZUllWzhdIHw9IChwQWQtPk1sbWVBdXguQVBFZGNhUGFybS5FZGNhVXBkYXRlQ291bnQgJiAweDBmKTsKKwkJCX0KKworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAmdG1wLAorCQkJCQkJCSAgOSwgICAgICAgICAgICAgICAgICAgICAgICAmV21lSWVbMF0sCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSB0bXA7CisJCX0KKworCQkvLworCQkvLyBMZXQgV1BBKCMyMjEpIEVsZW1lbnQgSUQgb24gdGhlIGVuZCBvZiB0aGlzIGFzc29jaWF0aW9uIGZyYW1lLgorCQkvLyBPdGhlcndpc2Ugc29tZSBBUCB3aWxsIGZhaWwgb24gcGFyc2luZyBFbGVtZW50IElEIGFuZCBzZXQgc3RhdHVzIGZhaWwgb24gQXNzb2MgUnNwLgorCQkvLyBGb3IgZXhhbXBsZTogUHV0IFZlbmRvciBTcGVjaWZpYyBJRSBvbiB0aGUgZnJvbnQgb2YgV1BBIElFLgorCQkvLyBUaGlzIGhhcHBlbnMgb24gQVAgKE1vZGVsIE5vOkxpbmtzeXMgV1JLNTRHKQorCQkvLworCQlpZiAoKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8CisgICAgICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgfHwKKyAgICAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8CisgICAgICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKKwkJCSkKKyAgICAgICAgICAgICkKKwkJeworCQkJVUNIQVIgUlNOSWUgPSBJRV9XUEE7CisKKwkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgfHwKKyAgICAgICAgICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikpCisJCQl7CisJCQkJUlNOSWUgPSBJRV9XUEEyOworCQkJfQorCisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNpZmRlZiBTSU9DU0lXR0VOSUUKKwkJCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gMSkKKyNlbmRpZiAvLyBTSU9DU0lXR0VOSUUgLy8KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgCVJUTVBNYWtlUlNOSUUocEFkLCBwQWQtPlN0YUNmZy5BdXRoTW9kZSwgcEFkLT5TdGFDZmcuV2VwU3RhdHVzLCBCU1MwKTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIFdQQSBQTUsgY2FjaGUgbGlzdAorCQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCisJCQl7CisJCQkgICAgSU5UICAgICBpZHg7CisgICAgICAgICAgICAgICAgQk9PTEVBTiBGb3VuZFBNSyA9IEZBTFNFOworCQkJCS8vIFNlYXJjaCBjaGNoZWQgUE1LSUQsIGFwcGVuZCBpdCBpZiBleGlzdGVkCisJCQkJZm9yIChpZHggPSAwOyBpZHggPCBQTUtJRF9OTzsgaWR4KyspCisJCQkJeworCQkJCQlpZiAoTmRpc0VxdWFsTWVtb3J5KEFwQWRkciwgJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW2lkeF0uQlNTSUQsIDYpKQorCQkJCQl7CisJCQkJCQlGb3VuZFBNSyA9IFRSVUU7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmIChGb3VuZFBNSykKKwkJCQl7CisJCQkJCS8vIFNldCBQTUsgbnVtYmVyCisJCQkJCSooUFVTSE9SVCkgJnBBZC0+U3RhQ2ZnLlJTTl9JRVtwQWQtPlN0YUNmZy5SU05JRV9MZW5dID0gMTsKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlJTTl9JRVtwQWQtPlN0YUNmZy5SU05JRV9MZW4gKyAyXSwgJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW2lkeF0uUE1LSUQsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuUlNOSUVfTGVuICs9IDE4OworCQkJCX0KKwkJCX0KKworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZkZWYgU0lPQ1NJV0dFTklFCisJCQlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IDEpCisJCQl7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAJCSZ0bXAsCisJCSAgICAgICAgICAgICAgICAgICAgICAgIAlwQWQtPlN0YUNmZy5SU05JRV9MZW4sCQkJcEFkLT5TdGFDZmcuUlNOX0lFLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAJRU5EX09GX0FSR1MpOworCQkJfQorCQkJZWxzZQorI2VuZGlmCisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwkJCXsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgIAkJJnRtcCwKKwkJCQkgICAgICAgICAgICAgIAkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUlNOSWUsCisJCSAgICAgICAgICAgICAgICAgICAgICAgIAkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPlN0YUNmZy5SU05JRV9MZW4sCisJCSAgICAgICAgICAgICAgICAgICAgICAgIAlwQWQtPlN0YUNmZy5SU05JRV9MZW4sCQkJcEFkLT5TdGFDZmcuUlNOX0lFLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAJRU5EX09GX0FSR1MpOworCQkJfQorCisJCQlGcmFtZUxlbiArPSB0bXA7CisKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2lmZGVmIFNJT0NTSVdHRU5JRQorCQkJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSAxKQorI2VuZGlmCisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwkJCXsKKwkgICAgICAgICAgICAvLyBBcHBlbmQgVmFyaWFibGUgSUUKKwkgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsICZSU05JZSwgMSk7CisJICAgICAgICAgICAgVmFySWVzT2Zmc2V0ICs9IDE7CisJICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCAmcEFkLT5TdGFDZmcuUlNOSUVfTGVuLCAxKTsKKwkgICAgICAgICAgICBWYXJJZXNPZmZzZXQgKz0gMTsKKwkJCX0KKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgcEFkLT5TdGFDZmcuUlNOX0lFLCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOworCQkJVmFySWVzT2Zmc2V0ICs9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKKworCQkJLy8gU2V0IFZhcmlhYmxlIElFcyBMZW5ndGgKKwkJCXBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuID0gVmFySWVzT2Zmc2V0OworCQl9CisKKwkJLy8gV2UgaGF2ZSB1cGRhdGUgdGhhdCBhdCBQZWVyQmVhY29uQXRKb2luUmVxdWVzdCgpCisJCUNraXBGbGFnID0gcEFkLT5TdGFDZmcuQ2tpcEZsYWc7CisJCWlmIChDa2lwRmxhZyAhPSAwKQorCQl7CisJCQlOZGlzWmVyb01lbW9yeShDa2lwTmVnb3RpYXRpb25CdWZmZXIsIENLSVBfTkVHT1RJQVRJT05fTEVOR1RIKTsKKwkJCUNraXBOZWdvdGlhdGlvbkJ1ZmZlclsyXSA9IDB4NjY7CisJCQkvLyBNYWtlIGl0IHRyeSBLUCAmIE1JQywgc2luY2Ugd2UgaGF2ZSB0byBmb2xsb3cgdGhlIHJlc3VsdCBmcm9tIEFzc29jUnNwCisJCQlDa2lwTmVnb3RpYXRpb25CdWZmZXJbOF0gPSAweDE4OworCQkJQ2tpcE5lZ290aWF0aW9uQnVmZmVyW0NLSVBfTkVHT1RJQVRJT05fTEVOR1RIIC0gMV0gPSAweDIyOworCQkJQ2tpcEZsYWcgPSAweDE4OworCisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sIAkmdG1wLAorCQkJCQkJMSwJCQkJCQkgIAkJJkFpcm9uZXRDa2lwSWUsCisJCQkJCQkxLAkJCQkJCSAgCQkmQWlyb25ldENraXBMZW4sCisJCQkJCQlBaXJvbmV0Q2tpcExlbiwgCQkgIAkJQ2tpcE5lZ290aWF0aW9uQnVmZmVyLAorCQkJCQkJRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gdG1wOworCQl9CisKKwkJLy8gQWRkIENDWCB2MiByZXF1ZXN0IGlmIENDWDIgYWRtaW4gc3RhdGUgaXMgb24KKwkJaWYgKHBBZC0+U3RhQ2ZnLkNDWENvbnRyb2wuZmllbGQuRW5hYmxlID09IDEpCisJCXsKKworCQkJLy8KKwkJCS8vIEFkZCBBaXJvbmV0SVBBZGRyZXNzSUUgZm9yIENpc2NvIENDWCAyLlgKKwkJCS8vIEFkZCBDQ1ggVmVyc2lvbgorCQkJLy8KKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJnRtcCwKKwkJCQkJCTEsCQkJCQkJCSZBaXJvbmV0SVBBZGRyZXNzSUUsCisJCQkJCQkxLAkJCQkJCQkmQWlyb25ldElQQWRkcmVzc0xlbiwKKwkJCQkJCUFpcm9uZXRJUEFkZHJlc3NMZW4sCQlBaXJvbmV0SVBBZGRyZXNzQnVmZmVyLAorCQkJCQkJMSwJCQkJCQkJJkNjeDJJZSwKKwkJCQkJCTEsCQkJCQkJCSZDY3gyTGVuLAorCQkJCQkJQ2N4MkxlbiwJCQkJICAgIENjeDJJZUluZm8sCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSB0bXA7CisKKwkJCS8vCisJCQkvLyBBZGQgQ2lwaGVyU3VpdGUgQ0NLTSBvciBMZWFwVGtpcCBpZiBzZXR0aW5nLgorCQkJLy8KKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJCWlmIChMRUFQX0NDS01fT04ocEFkKSkKKwkJCXsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCSZ0bXAsCisJCQkJCQlDaXBoZXJTdWl0ZUNpc2NvQ0NLTUxlbiwJCUNpcGhlclN1aXRlQ2lzY29DQ0tNLAorCQkJCQkJRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IHRtcDsKKworCQkJCS8vIFRoaXJkIGFkZCBSU04KKwkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsIENpcGhlclN1aXRlQ2lzY29DQ0tNLCBDaXBoZXJTdWl0ZUNpc2NvQ0NLTUxlbik7IC8vU2F2ZSBDaXBoZXJTdWl0ZQorCQkJCVZhckllc09mZnNldCArPSBDaXBoZXJTdWl0ZUNpc2NvQ0NLTUxlbjsKKwkJCX0KKwkJCWVsc2UgaWYgKChwQWQtPlN0YUNmZy5MZWFwQXV0aE1vZGUgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKSAmJiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpKQorCQkJeworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJnRtcCwKKwkJCQkJCUNpcGhlclN1aXRlQ0NYVGtpcExlbiwJICAgIENpcGhlclN1aXRlQ0NYVGtpcCwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKwkJCQlGcmFtZUxlbiArPSB0bXA7CisKKwkJCQkvLyBUaGlyZCBhZGQgUlNOCisJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCBDaXBoZXJTdWl0ZUNDWFRraXAsIENpcGhlclN1aXRlQ0NYVGtpcExlbik7CisJCQkJVmFySWVzT2Zmc2V0ICs9IENpcGhlclN1aXRlQ0NYVGtpcExlbjsKKwkJCX0KKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKworCQkJLy8gQWRkIGJ5IEphbWVzIDAzLzA2LzI3CisJCQkvLyBTZXQgVmFyaWFibGUgSUVzIExlbmd0aAorCQkJcEFkLT5TdGFDZmcuUmVxVmFySUVMZW4gPSBWYXJJZXNPZmZzZXQ7CisJCQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uUmVxdWVzdElFTGVuZ3RoID0gVmFySWVzT2Zmc2V0OworCisJCQkvLyBPZmZzZXRSZXNwb25zZUlFcyBmb2xsb3cgUmVxVmFySUUKKwkJCXBBZC0+U3RhQ2ZnLkFzc29jSW5mby5PZmZzZXRSZXNwb25zZUlFcyA9IHNpemVvZihORElTXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTikgKyBwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbjsKKwkJCS8vIEVuZCBBZGQgYnkgSmFtZXMKKwkJfQorCisKKwkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguQXNzb2NUaW1lciwgVGltZW91dCk7CisJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfV0FJVF9SU1A7CisJfQorCWVsc2UKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQVNTT0MgLSBNbG1lQXNzb2NSZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbGVkLiBCVUchISEhISEgXG4iKSk7CisJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJU3RhdHVzID0gTUxNRV9JTlZBTElEX0ZPUk1BVDsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOworCX0KKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCW1sbWUgcmVhc3NvYyByZXEgaGFuZGxpbmcgcHJvY2VkdXJlCisJUGFyYW1ldGVyczoKKwkJRWxlbSAtCisJUHJlOgorCQktIyBTU0lEICAoQWRhcHRlci0+U3RhQ2ZnLnNzaWRbXSkKKwkJLSMgQlNTSUQgKEFQIGFkZHJlc3MsIEFkYXB0ZXItPlN0YUNmZy5ic3NpZCkKKwkJLSMgU3VwcG9ydGVkIHJhdGVzIChBZGFwdGVyLT5TdGFDZmcuc3VwcG9ydGVkX3JhdGVzW10pCisJCS0jIFN1cHBvcnRlZCByYXRlcyBsZW5ndGggKEFkYXB0ZXItPlN0YUNmZy5zdXBwb3J0ZWRfcmF0ZXNfbGVuKQorCQktIyBUeCBwb3dlciAoQWRhcHRlci0+U3RhQ2ZnLnR4X3Bvd2VyKQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVSZWFzc29jUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUgkJCUFwQWRkcls2XTsKKwlIRUFERVJfODAyXzExCVJlYXNzb2NIZHI7CisJVUNIQVIJCQlDY3gyTGVuID0gNTsKKwlVQ0hBUgkJCVdtZUllWzldID0ge0lFX1ZFTkRPUl9TUEVDSUZJQywgMHgwNywgMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwMH07CisJVVNIT1JUCQkJQ2FwYWJpbGl0eUluZm8sIExpc3RlbkludHY7CisJVUxPTkcJCQlUaW1lb3V0OworCVVMT05HCQkJRnJhbWVMZW4gPSAwOworCUJPT0xFQU4JCQlUaW1lckNhbmNlbGxlZDsKKwlORElTX1NUQVRVUwkJTlN0YXR1czsKKwlVTE9ORwkJCXRtcDsKKwlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKKy8vQ0NYIDIuWAorI2lmZGVmIExFQVBfU1VQUE9SVAorCVVDSEFSCQkJQ2tpcEZsYWc7CisJVUNIQVIJCQlDa2lwTmVnb3RpYXRpb25CdWZmZXJbQ0tJUF9ORUdPVElBVElPTl9MRU5HVEhdOworCVVDSEFSCQkJQWlyb25ldENraXBJZSA9IElFX0FJUk9ORVRfQ0tJUDsKKwlVQ0hBUgkJCUFpcm9uZXRDa2lwTGVuID0gQ0tJUF9ORUdPVElBVElPTl9MRU5HVEg7CisJVUNIQVIJCQlBaXJvbmV0SVBBZGRyZXNzSUUgPSBJRV9BSVJPTkVUX0lQQUREUkVTUzsKKwlVQ0hBUgkJCUFpcm9uZXRJUEFkZHJlc3NMZW4gPSBBSVJPTkVUX0lQQUREUkVTU19MRU5HVEg7CisJVUNIQVIJCQlBaXJvbmV0SVBBZGRyZXNzQnVmZmVyW0FJUk9ORVRfSVBBRERSRVNTX0xFTkdUSF0gPSB7MHgwMCwgMHg0MCwgMHg5NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMH07CisJVUNIQVIJCQlBaXJvbmV0Q0NLTVJlYXNzb2NJRSA9IElFX0FJUk9ORVRfQ0NLTVJFQVNTT0M7CisJVUNIQVIJCQlBaXJvbmV0Q0NLTVJlYXNzb2NMZW4gPSBBSVJPTkVUX0NDS01SRUFTU09DX0xFTkdUSDsKKwlVQ0hBUgkJCUFpcm9uZXRDQ0tNUmVhc3NvY0J1ZmZlcltBSVJPTkVUX0NDS01SRUFTU09DX0xFTkdUSF07CisJVUNIQVIJCQlBaXJvbmV0T1VJW10gPSB7MHgwMCwgMHg0MCwgMHg5NiwgMHgwMH07CisJVUNIQVIJCQlNSUNNTlsxNl07CisJVUNIQVIJCQlDYWxjTWljQnVmZmVyWzgwXTsKKwlVTE9ORwkJCUNhbGNNaWNCdWZmZXJMZW4gPSAwOworI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCVVTSE9SVAkJCVN0YXR1czsKKworCS8vIEJsb2NrIGFsbCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZAorCWlmIChwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyA9PSBUUlVFKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBCbG9jayBSZUFzc29jIHJlcXVlc3QgZHVybmluZyBXUEEgYmxvY2sgcGVyaW9kIVxuIikpOworCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CisJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9SRUFTU09DX0NPTkYsIDIsICZTdGF0dXMpOworCX0KKwkvLyB0aGUgcGFyYW1ldGVycyBhcmUgdGhlIHNhbWUgYXMgdGhlIGFzc29jaWF0aW9uCisJZWxzZSBpZihNbG1lQXNzb2NSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQXBBZGRyLCAmQ2FwYWJpbGl0eUluZm8sICZUaW1lb3V0LCAmTGlzdGVuSW50dikpCisJeworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5SZWFzc29jVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisKKwkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwkJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFTU09DIC0gTWxtZVJlYXNzb2NSZXFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCQkJU3RhdHVzID0gTUxNRV9GQUlMX05PX1JFU09VUkNFOworCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CisJCQlyZXR1cm47CisJCX0KKworCQlDT1BZX01BQ19BRERSKHBBZC0+TWxtZUF1eC5Cc3NpZCwgQXBBZGRyKTsKKworCQkvLyBtYWtlIGZyYW1lLCB1c2UgYnNzaWQgYXMgdGhlIEFQIGFkZHJlc3M/PworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIFNlbmQgUkUtQVNTT0MgcmVxdWVzdC4uLlxuIikpOworCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJlJlYXNzb2NIZHIsIFNVQlRZUEVfUkVBU1NPQ19SRVEsIDAsIEFwQWRkciwgQXBBZGRyKTsKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAmRnJhbWVMZW4sCisJCQkJCQkgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgJlJlYXNzb2NIZHIsCisJCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAgICAgJkNhcGFiaWxpdHlJbmZvLAorCQkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgICAgICZMaXN0ZW5JbnR2LAorCQkJCQkJICBNQUNfQUREUl9MRU4sICAgICAgICAgICAgIEFwQWRkciwKKwkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmU3NpZEllLAorCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPk1sbWVBdXguU3NpZExlbiwKKwkJCQkJCSAgcEFkLT5NbG1lQXV4LlNzaWRMZW4sICAgICBwQWQtPk1sbWVBdXguU3NpZCwKKwkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUllLAorCQkJCQkJICAxLAkJCQkJCSZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwKKwkJCQkJCSAgcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sICBwQWQtPk1sbWVBdXguU3VwUmF0ZSwKKwkJCQkJCSAgRU5EX09GX0FSR1MpOworCisJCWlmIChwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiAhPSAwKQorCQl7CisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAmdG1wLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkV4dFJhdGVJZSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiwKKwkJCQkJCQkgIHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuLAkgICAgcEFkLT5NbG1lQXV4LkV4dFJhdGUsCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSB0bXA7CisJCX0KKworCQlpZiAocEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0uYlZhbGlkKQorCQl7CisJCQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSkKKwkJCXsKKwkJCQlRQlNTX1NUQV9JTkZPX1BBUk0gUW9zSW5mbzsKKworCQkJCU5kaXNaZXJvTWVtb3J5KCZRb3NJbmZvLCBzaXplb2YoUUJTU19TVEFfSU5GT19QQVJNKSk7CisJCQkJUW9zSW5mby5VQVBTRF9BQ19CRSA9IHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkU7CisJCQkJUW9zSW5mby5VQVBTRF9BQ19CSyA9IHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQks7CisJCQkJUW9zSW5mby5VQVBTRF9BQ19WSSA9IHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkk7CisJCQkJUW9zSW5mby5VQVBTRF9BQ19WTyA9IHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk87CisJCQkJUW9zSW5mby5NYXhTUExlbmd0aCA9IHBBZC0+Q29tbW9uQ2ZnLk1heFNQTGVuZ3RoOworCQkJCVdtZUllWzhdIHw9ICooUFVDSEFSKSZRb3NJbmZvOworCQkJfQorCisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICZ0bXAsCisJCQkJCQkJICA5LCAgICAgICAgICAgICAgICAgICAgICAgICZXbWVJZVswXSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCUZyYW1lTGVuICs9IHRtcDsKKwkJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCS8vIEhUCisJCWlmICgocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiA+IDApICYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKQorCQl7CisJCQlVTE9ORyBUbXBMZW47CisJCQlVQ0hBUiBIdExlbjsKKwkJCVVDSEFSIEJST0FEQ09NWzRdID0gezB4MCwgMHg5MCwgMHg0YywgMHgzM307CisJCQlpZiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iUHJlTkh0ID09IFRSVUUpCisJCQl7CisJCQkJSHRMZW4gPSBTSVpFX0hUX0NBUF9JRSArIDQ7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAgICZUbXBMZW4sCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJldwYUllLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdExlbiwKKwkJCQkJCQkgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQlJPQURDT01bMF0sCisJCQkJCQkJIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sICAgICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wTGVuLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcEllLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJCSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLCAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCX0KKwkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCS8vIGFkZCBSYWxpbmsgcHJvcHJpZXRhcnkgSUUgdG8gaW5mb3JtIEFQIHRoaXMgU1RBIGlzIGdvaW5nIHRvIHVzZSBBR0dSRUdBVElPTiBvciBQSUdHWS1CQUNLK0FHR1JFR0FUSU9OCisJCS8vIENhc2UgSTogKEFnZ3JlZ2F0aW9uICsgUGlnZ3ktQmFjaykKKwkJLy8gMS4gdXNlciBlbmFibGUgYWdncmVnYXRpb24sIEFORAorCQkvLyAyLiBNYWMgc3VwcG9ydCBwaWdneS1iYWNrCisJCS8vIDMuIEFQIGFubm91Y2VzIGl0J3MgUElHR1ktQkFDSytBR0dSRUdBVElPTi1jYXBhYmxlIGluIEJFQUNPTgorCQkvLyBDYXNlIElJOiAoQWdncmVnYXRpb24pCisJCS8vIDEuIHVzZXIgZW5hYmxlIGFnZ3JlZ2F0aW9uLCBBTkQKKwkJLy8gMi4gQVAgYW5ub3VjZXMgaXQncyBBR0dSRUdBVElPTi1jYXBhYmxlIGluIEJFQUNPTgorCQlpZiAocEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSkKKwkJeworCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iUGlnZ3lCYWNrQ2FwYWJsZSkgJiYgKChwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAmIDB4MDAwMDAwMDMpID09IDMpKQorCQkJeworCQkJCVVMT05HIFRtcExlbjsKKwkJCQlVQ0hBUiBSYWxpbmtJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDcsIDB4MDAsIDB4MGMsIDB4NDMsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDB9OworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIrRnJhbWVMZW4sICAgICAgICAgICAmVG1wTGVuLAorCQkJCQkJCQkgIDksICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWxpbmtJZSwKKwkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQkJRnJhbWVMZW4gKz0gVG1wTGVuOworCQkJfQorCQkJZWxzZSBpZiAocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgJiAweDAwMDAwMDAxKQorCQkJeworCQkJCVVMT05HIFRtcExlbjsKKwkJCQlVQ0hBUiBSYWxpbmtJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDcsIDB4MDAsIDB4MGMsIDB4NDMsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDB9OworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIrRnJhbWVMZW4sICAgICAgICAgICAmVG1wTGVuLAorCQkJCQkJCQkgIDksICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWxpbmtJZSwKKwkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQkJRnJhbWVMZW4gKz0gVG1wTGVuOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJVUxPTkcgVG1wTGVuOworCQkJVUNIQVIgUmFsaW5rSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDA0LCAweDAwLCAweDAwLCAweDAwfTsKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIrRnJhbWVMZW4sCQkgJlRtcExlbiwKKwkJCQkJCQkgIDksCQkJCQkJIFJhbGlua0llLAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gVG1wTGVuOworCQl9CisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCWlmIChMRUFQX0NDS01fT04ocEFkKSAmJiAocEFkLT5TdGFDZmcuQ0NLTUxpbmtVcEZsYWcgPT0gVFJVRSkpCisJCXsKKwkJCUNraXBGbGFnID0gcEFkLT5TdGFDZmcuQ2tpcEZsYWc7CS8vIFdlIGhhdmUgdXBkYXRlIHRoYXQgYXQgUGVlckJlYWNvbkF0Sm9pblJlcXVlc3QoKQorCQkJaWYgKENraXBGbGFnICE9IDApCisJCQl7CisJCQkJTmRpc1plcm9NZW1vcnkoQ2tpcE5lZ290aWF0aW9uQnVmZmVyLCBDS0lQX05FR09USUFUSU9OX0xFTkdUSCk7CisJCQkJQ2tpcE5lZ290aWF0aW9uQnVmZmVyWzJdID0gMHg2NjsKKwkJCQkvLyBNYWtlIGl0IHRyeSBLUCAmIE1JQywgc2luY2Ugd2UgaGF2ZSB0byBmb2xsb3cgdGhlIHJlc3VsdCBmcm9tIEFzc29jUnNwCisJCQkJQ2tpcE5lZ290aWF0aW9uQnVmZmVyWzhdID0gMHgxODsKKwkJCQlDa2lwTmVnb3RpYXRpb25CdWZmZXJbQ0tJUF9ORUdPVElBVElPTl9MRU5HVEggLSAxXSA9IDB4MjI7CisKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJnRtcCwKKwkJCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFpcm9uZXRDa2lwSWUsCisJCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBaXJvbmV0Q2tpcExlbiwKKwkJCQkJCQkJCUFpcm9uZXRDa2lwTGVuLCAgICAgICAgICAgICAgICAgQ2tpcE5lZ290aWF0aW9uQnVmZmVyLAorCQkJCQkJCQkJRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IHRtcDsKKwkJCX0KKworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAmdG1wLAorCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFpcm9uZXRJUEFkZHJlc3NJRSwKKwkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBaXJvbmV0SVBBZGRyZXNzTGVuLAorCQkJCQkJCUFpcm9uZXRJUEFkZHJlc3NMZW4sICAgICAgICAgICAgQWlyb25ldElQQWRkcmVzc0J1ZmZlciwKKwkJCQkJCQlFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSB0bXA7CisKKwkJCS8vCisJCQkvLyBUaGUgUk4gaXMgaW5jcmVtZW50ZWQgYmVmb3JlIGVhY2ggcmVhc3NvY2lhdGlvbiByZXF1ZXN0LgorCQkJLy8KKwkJCXBBZC0+U3RhQ2ZnLkNDS01STisrOworCQkJLy8KKwkJCS8vIENhbGN1bGF0ZSBNSUMgPSBobWFjLW1kNShrcmssIFNUQS1JRHxCU1NJRHxSU05JRXxUU0Z8Uk4pOworCQkJLy8KKwkJCUNPUFlfTUFDX0FERFIoQ2FsY01pY0J1ZmZlciwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJCQlDYWxjTWljQnVmZmVyTGVuID0gTUFDX0FERFJfTEVOOworCQkJQ09QWV9NQUNfQUREUihDYWxjTWljQnVmZmVyICsgQ2FsY01pY0J1ZmZlckxlbiwgcEFkLT5NbG1lQXV4LkJzc2lkKTsKKwkJCUNhbGNNaWNCdWZmZXJMZW4gKz0gTUFDX0FERFJfTEVOOworCQkJTmRpc01vdmVNZW1vcnkoQ2FsY01pY0J1ZmZlciArIENhbGNNaWNCdWZmZXJMZW4sIENpcGhlclN1aXRlQ2lzY29DQ0tNLCBDaXBoZXJTdWl0ZUNpc2NvQ0NLTUxlbik7CisJCQlDYWxjTWljQnVmZmVyTGVuICs9IENpcGhlclN1aXRlQ2lzY29DQ0tNTGVuOworCQkJTmRpc01vdmVNZW1vcnkoQ2FsY01pY0J1ZmZlciArIENhbGNNaWNCdWZmZXJMZW4sIChQVUNIQVIpICZwQWQtPlN0YUNmZy5DQ0tNQmVhY29uQXRKb2luVGltZVN0YW1wLCBzaXplb2YocEFkLT5TdGFDZmcuQ0NLTUJlYWNvbkF0Sm9pblRpbWVTdGFtcCkpOworCQkJQ2FsY01pY0J1ZmZlckxlbiArPSBzaXplb2YocEFkLT5TdGFDZmcuQ0NLTUJlYWNvbkF0Sm9pblRpbWVTdGFtcCk7CisJCQlOZGlzTW92ZU1lbW9yeShDYWxjTWljQnVmZmVyICsgQ2FsY01pY0J1ZmZlckxlbiwgKFBVQ0hBUikmcEFkLT5TdGFDZmcuQ0NLTVJOLCBzaXplb2YocEFkLT5TdGFDZmcuQ0NLTVJOKSk7CisJCQlDYWxjTWljQnVmZmVyTGVuICs9IHNpemVvZihwQWQtPlN0YUNmZy5DQ0tNUk4pOworCQkJaG1hY19tZDUocEFkLT5TdGFDZmcuS1JLLCBMRU5fRUFQX01JQ0ssIENhbGNNaWNCdWZmZXIsIENhbGNNaWNCdWZmZXJMZW4sIE1JQ01OKTsKKworCQkJLy8KKwkJCS8vIGZpbGwgdXAgQ0NLTSByZWFzc29jaWF0aW9uIHJlcXVlc3QgZWxlbWVudAorCQkJLy8KKwkJCU5kaXNNb3ZlTWVtb3J5KEFpcm9uZXRDQ0tNUmVhc3NvY0J1ZmZlciwgQWlyb25ldE9VSSwgNCk7CisJCQlOZGlzTW92ZU1lbW9yeShBaXJvbmV0Q0NLTVJlYXNzb2NCdWZmZXIgKyA0LCAoUFVDSEFSKSZwQWQtPlN0YUNmZy5DQ0tNQmVhY29uQXRKb2luVGltZVN0YW1wLCA4KTsKKwkJCU5kaXNNb3ZlTWVtb3J5KEFpcm9uZXRDQ0tNUmVhc3NvY0J1ZmZlciArIDEyLCAoUFVDSEFSKSAmcEFkLT5TdGFDZmcuQ0NLTVJOLCA0KTsKKwkJCU5kaXNNb3ZlTWVtb3J5KEFpcm9uZXRDQ0tNUmVhc3NvY0J1ZmZlciArMTYsIE1JQ01OLCA4KTsKKworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAmdG1wLAorCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICZBaXJvbmV0Q0NLTVJlYXNzb2NJRSwKKwkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAmQWlyb25ldENDS01SZWFzc29jTGVuLAorCQkJCQkJCUFpcm9uZXRDQ0tNUmVhc3NvY0xlbiwgIEFpcm9uZXRDQ0tNUmVhc3NvY0J1ZmZlciwKKwkJCQkJCQlFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSB0bXA7CisKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJnRtcCwKKwkJCQkJCQlDaXBoZXJTdWl0ZUNpc2NvQ0NLTUxlbixDaXBoZXJTdWl0ZUNpc2NvQ0NLTSwKKwkJCQkJCQlFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSB0bXA7CisJCX0KKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKworCQkvLyBBZGQgQ0NYIHYyIHJlcXVlc3QgaWYgQ0NYMiBhZG1pbiBzdGF0ZSBpcyBvbgorCQlpZiAocEFkLT5TdGFDZmcuQ0NYQ29udHJvbC5maWVsZC5FbmFibGUgPT0gMSkKKwkJeworCQkJLy8KKwkJCS8vIEFkZCBDQ1ggVmVyc2lvbgorCQkJLy8KKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJnRtcCwKKwkJCQkJCTEsCQkJCQkJCSZDY3gySWUsCisJCQkJCQkxLAkJCQkJCQkmQ2N4MkxlbiwKKwkJCQkJCUNjeDJMZW4sCQkJCSAgICBDY3gySWVJbmZvLAorCQkJCQkJRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gdG1wOworCQl9CisKKwkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLCBUaW1lb3V0KTsgLyogaW4gbVNlYyAqLworCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IFJFQVNTT0NfV0FJVF9SU1A7CisJfQorCWVsc2UKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQVNTT0MgLSBNbG1lUmVhc3NvY1JlcUFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsZWQuIEJVRyEhISEgXG4iKSk7CisJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJU3RhdHVzID0gTUxNRV9JTlZBTElEX0ZPUk1BVDsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVVwcGVyIGxheWVyIGlzc3VlcyBkaXNhc3NvYyByZXF1ZXN0CisJUGFyYW1ldGVyczoKKwkJRWxlbSAtCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lRGlzYXNzb2NSZXFBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QgcERpc2Fzc29jUmVxOworCUhFQURFUl84MDJfMTEgICAgICAgICBEaXNhc3NvY0hkcjsKKwlQSEVBREVSXzgwMl8xMSAgICAgICAgcERpc2Fzc29jSGRyOworCVBVQ0hBUiAgICAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlVTE9ORyAgICAgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOworCU5ESVNfU1RBVFVTICAgICAgICAgICBOU3RhdHVzOworCUJPT0xFQU4gICAgICAgICAgICAgICBUaW1lckNhbmNlbGxlZDsKKwlVTE9ORyAgICAgICAgICAgICAgICAgVGltZW91dCA9IDA7CisJVVNIT1JUICAgICAgICAgICAgICAgIFN0YXR1czsKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCS8vIHNlbmQgRExTLVRFQVJfRE9XTiBtZXNzYWdlLAorCWlmIChwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwl7CisJCVVDSEFSIGk7CisKKwkJLy8gdGVhciBkb3duIGxvY2FsIGRscyB0YWJsZSBlbnRyeQorCQlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCisJCXsKKwkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpKQorCQkJeworCQkJCVJUTVBTZW5kRExTVGVhckRvd25GcmFtZShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQl9CisJCX0KKworCQkvLyB0ZWFyIGRvd24gcGVlciBkbHMgdGFibGUgZW50cnkKKwkJZm9yIChpPU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwkJeworCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkpCisJCQl7CisJCQkJUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX05PTkU7CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCS8vIHNraXAgc2FuaXR5IGNoZWNrCisJcERpc2Fzc29jUmVxID0gKFBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpKEVsZW0tPk1zZyk7CisKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIE1sbWVEaXNhc3NvY1JlcUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWRcbiIpKTsKKwkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCQlTdGF0dXMgPSBNTE1FX0ZBSUxfTk9fUkVTT1VSQ0U7CisJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9ESVNBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwkJcmV0dXJuOworCX0KKworCisKKwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBTZW5kIERJU0FTU09DIHJlcXVlc3RbQlNTSUQ6OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IChSZWFzb249JWQpXG4iLAorCQkJCXBEaXNhc3NvY1JlcS0+QWRkclswXSwgcERpc2Fzc29jUmVxLT5BZGRyWzFdLCBwRGlzYXNzb2NSZXEtPkFkZHJbMl0sCisJCQkJcERpc2Fzc29jUmVxLT5BZGRyWzNdLCBwRGlzYXNzb2NSZXEtPkFkZHJbNF0sIHBEaXNhc3NvY1JlcS0+QWRkcls1XSwgcERpc2Fzc29jUmVxLT5SZWFzb24pKTsKKwlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkRpc2Fzc29jSGRyLCBTVUJUWVBFX0RJU0FTU09DLCAwLCBwRGlzYXNzb2NSZXEtPkFkZHIsIHBEaXNhc3NvY1JlcS0+QWRkcik7CS8vIHBhdGNoIHBlYXAgdHRscyBzd2l0Y2hpbmcgaXNzdWUKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAorCQkJCQkgIHNpemVvZihIRUFERVJfODAyXzExKSwmRGlzYXNzb2NIZHIsCisJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICZwRGlzYXNzb2NSZXEtPlJlYXNvbiwKKwkJCQkJICBFTkRfT0ZfQVJHUyk7CisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisKKwkvLyBUbyBwYXRjaCBJbnN0YW5jZSBhbmQgQnVmZmFsbyhOKSBBUAorCS8vIERyaXZlciBoYXMgdG8gc2VuZCBkZWF1dGggdG8gSW5zdGFuY2UgQVAsIGJ1dCBCdWZmYWxvKE4pIG5lZWRzIHRvIHNlbmQgZGlzYXNzb2MgdG8gcmVzZXQgQXV0aGVudGljYXRvcidzIHN0YXRlIG1hY2hpbmUKKwkvLyBUaGVyZWZvcmUsIHdlIHNlbmQgYm90aCBvZiB0aGVtLgorCXBEaXNhc3NvY0hkciA9IChQSEVBREVSXzgwMl8xMSlwT3V0QnVmZmVyOworCXBEaXNhc3NvY0hkci0+RkMuU3ViVHlwZSA9IFNVQlRZUEVfREVBVVRIOworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCXBBZC0+U3RhQ2ZnLkRpc2Fzc29jUmVhc29uID0gUkVBU09OX0RJU0FTU09DX1NUQV9MRUFWSU5HOworCUNPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuRGlzYXNzb2NTdGEsIHBEaXNhc3NvY1JlcS0+QWRkcik7CisKKwlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLCBUaW1lb3V0KTsgLyogaW4gbVNlYyAqLworCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gRElTQVNTT0NfV0FJVF9SU1A7CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQorCXsKKyAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgICAgICAvL3NlbmQgZGlzYXNzb2NpYXRlIGV2ZW50IHRvIHdwYV9zdXBwbGljYW50CisgICAgICAgIG1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKyAgICAgICAgd3JxdS5kYXRhLmZsYWdzID0gUlRfRElTQVNTT0NfRVZFTlRfRkxBRzsKKyAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBOVUxMKTsKKyAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIHsKKyAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7CisgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKKyAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCXBlZXIgc2VuZHMgYXNzb2MgcnNwIGJhY2sKKwlQYXJhbWV0ZXJzOgorCQlFbG1lIC0gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUGVlckFzc29jUnNwQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgICAgICAgIENhcGFiaWxpdHlJbmZvLCBTdGF0dXMsIEFpZDsKKwlVQ0hBUiAgICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBTdXBSYXRlTGVuOworCVVDSEFSICAgICAgICAgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU10sIEV4dFJhdGVMZW47CisJVUNIQVIgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworCUJPT0xFQU4gICAgICAgVGltZXJDYW5jZWxsZWQ7CisJVUNIQVIgICAgICAgICBDa2lwRmxhZzsKKwlFRENBX1BBUk0gICAgIEVkY2FQYXJtOworCUhUX0NBUEFCSUxJVFlfSUUJCUh0Q2FwYWJpbGl0eTsKKwlBRERfSFRfSU5GT19JRQkJQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKwlVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbjsKKwlVQ0hBUgkJCUFkZEh0SW5mb0xlbjsKKwlVQ0hBUgkJCU5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOworCisJaWYgKFBlZXJBc3NvY1JzcFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgJkNhcGFiaWxpdHlJbmZvLCAmU3RhdHVzLCAmQWlkLCBTdXBSYXRlLCAmU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgJkV4dFJhdGVMZW4sCisJCSZIdENhcGFiaWxpdHksJkFkZEh0SW5mbywgJkh0Q2FwYWJpbGl0eUxlbiwmQWRkSHRJbmZvTGVuLCZOZXdFeHRDaGFubmVsT2Zmc2V0LCAmRWRjYVBhcm0sICZDa2lwRmxhZykpCisJeworCQkvLyBUaGUgZnJhbWUgaXMgZm9yIG1lID8KKwkJaWYoTUFDX0FERFJfRVFVQUwoQWRkcjIsIHBBZC0+TWxtZUF1eC5Cc3NpZCkpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJBc3NvY1JzcEFjdGlvbigpOkFTU09DIC0gcmVjZWl2ZSBBU1NPQ19SU1AgdG8gbWUgKHN0YXR1cz0lZClcbiIsIFN0YXR1cykpOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckFzc29jUnNwQWN0aW9uKCk6TWFjVGFibGUgWyVkXS5BTXNkdVNpemUgPSAlZC4gQ2xpZW50U3RhdHVzRmxhZ3MgPSAweCVseCBcbiIsRWxlbS0+V2NpZCwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BTXNkdVNpemUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQ2xpZW50U3RhdHVzRmxhZ3MpKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkFzc29jVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJCQlpZihTdGF0dXMgPT0gTUxNRV9TVUNDRVNTKQorCQkJeworCQkJCS8vIGdvIHRvIHByb2NlZHVyZSBsaXN0ZWQgb24gcGFnZSAzNzYKKwkJCQlBc3NvY1Bvc3RQcm9jKHBBZCwgQWRkcjIsIENhcGFiaWxpdHlJbmZvLCBBaWQsIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4sCisJCQkJCSZFZGNhUGFybSwgJkh0Q2FwYWJpbGl0eSwgSHRDYXBhYmlsaXR5TGVuLCAmQWRkSHRJbmZvKTsKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNpZm5kZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisKKyAgICAgICAgICAgICAgICAgICAgU2VuZEFzc29jSUVzVG9XcGFTdXBwbGljYW50KHBBZCk7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKyAgICAgICAgICAgICAgICAgICAgd3JxdS5kYXRhLmZsYWdzID0gUlRfQVNTT0NfRVZFTlRfRkxBRzsKKyAgICAgICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBOVUxMKTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgICAgICAgICAgICAgICAgICB3ZXh0X25vdGlmeV9ldmVudF9hc3NvYyhwQWQpOworCisgICAgICAgICAgICAgICAgICAgIG1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBwQWQtPk1sbWVBdXguQnNzaWQsIE1BQ19BRERSX0xFTik7CisgICAgICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKKworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisKKwkJCQlwQWQtPlN0YUNmZy5Da2lwRmxhZyA9IENraXBGbGFnOworCQkJCWlmIChDa2lwRmxhZyAmIDB4MTgpCisJCQkJeworCQkJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5UeFNFUSwgNCk7CisJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlJ4U0VRLCA0KTsKKwkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuQ0tJUE1JQywgNCk7CisJCQkJCXBBZC0+U3RhQ2ZnLkdJVlswXSA9IFJhbmRvbUJ5dGUocEFkKTsKKwkJCQkJcEFkLT5TdGFDZmcuR0lWWzFdID0gUmFuZG9tQnl0ZShwQWQpOworCQkJCQlwQWQtPlN0YUNmZy5HSVZbMl0gPSBSYW5kb21CeXRlKHBBZCk7CisJCQkJCXBBZC0+U3RhQ2ZnLmJDa2lwT24gPSBUUlVFOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8Q0NYPiBwQWQtPlN0YUNmZy5Da2lwRmxhZyA9IDB4JTAyeFxuIiwgcEFkLT5TdGFDZmcuQ2tpcEZsYWcpKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gRmFpbGUgb24gQXNzb2NpYXRpb24sIHdlIG5lZWQgdG8gY2hlY2sgdGhlIHN0YXR1cyBjb2RlCisJCQkJLy8gSXMgdGhhdCBhIFJvZ3VlIEFQPworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJCWlmICgocEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID09IENJU0NPX0F1dGhNb2RlTEVBUCkgJiYgKFN0YXR1cyA9PSBNTE1FX0FMR19OT1RfU1VQUE9SVCkpCisJCQkJeyAvL1Bvc3NpYmx5IFJvZ3VlIEFQCisJCQkJCVJvZ3VlQXBUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+U3RhQ2ZnLlJvZ3VlQXBUYWIsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTEVBUF9SRUFTT05fSU5WQUxJRF9BVVRIKTsKKwkJCQl9CisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCQl9CisJCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBQZWVyQXNzb2NSc3BBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlwZWVyIHNlbmRzIHJlYXNzb2MgcnNwCisJUGFyYW1ldHJzOgorCQlFbGVtIC0gTUxNRSBtZXNzYWdlIGNudGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyUmVhc3NvY1JzcEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUICAgICAgQ2FwYWJpbGl0eUluZm87CisJVVNIT1JUICAgICAgU3RhdHVzOworCVVTSE9SVCAgICAgIEFpZDsKKwlVQ0hBUiAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwgU3VwUmF0ZUxlbjsKKwlVQ0hBUiAgICAgICBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwgRXh0UmF0ZUxlbjsKKwlVQ0hBUiAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworCVVDSEFSICAgICAgIENraXBGbGFnOworCUJPT0xFQU4gICAgIFRpbWVyQ2FuY2VsbGVkOworCUVEQ0FfUEFSTSAgIEVkY2FQYXJtOworCUhUX0NBUEFCSUxJVFlfSUUJCUh0Q2FwYWJpbGl0eTsKKwlBRERfSFRfSU5GT19JRQkJQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKwlVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbjsKKwlVQ0hBUgkJCUFkZEh0SW5mb0xlbjsKKwlVQ0hBUgkJCU5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOworCisJaWYoUGVlckFzc29jUnNwU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIyLCAmQ2FwYWJpbGl0eUluZm8sICZTdGF0dXMsICZBaWQsIFN1cFJhdGUsICZTdXBSYXRlTGVuLCBFeHRSYXRlLCAmRXh0UmF0ZUxlbiwKKwkJCQkJCQkJJkh0Q2FwYWJpbGl0eSwJJkFkZEh0SW5mbywgJkh0Q2FwYWJpbGl0eUxlbiwgJkFkZEh0SW5mb0xlbiwmTmV3RXh0Q2hhbm5lbE9mZnNldCwgJkVkY2FQYXJtLCAmQ2tpcEZsYWcpKQorCXsKKwkJaWYoTUFDX0FERFJfRVFVQUwoQWRkcjIsIHBBZC0+TWxtZUF1eC5Cc3NpZCkpIC8vIFRoZSBmcmFtZSBpcyBmb3IgbWUgPworCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIHJlY2VpdmUgUkVBU1NPQ19SU1AgdG8gbWUgKHN0YXR1cz0lZClcbiIsIFN0YXR1cykpOworCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCisJCQlpZihTdGF0dXMgPT0gTUxNRV9TVUNDRVNTKQorCQkJeworCQkJCS8vIGdvIHRvIHByb2NlZHVyZSBsaXN0ZWQgb24gcGFnZSAzNzYKKwkJCQlBc3NvY1Bvc3RQcm9jKHBBZCwgQWRkcjIsIENhcGFiaWxpdHlJbmZvLCBBaWQsIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4sCisJCQkJCSAmRWRjYVBhcm0sICZIdENhcGFiaWxpdHksIEh0Q2FwYWJpbGl0eUxlbiwgJkFkZEh0SW5mbyk7CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworCisgICAgICAgICAgICAgICAgICAgIFNlbmRBc3NvY0lFc1RvV3BhU3VwcGxpY2FudChwQWQpOworICAgICAgICAgICAgICAgICAgICBtZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisgICAgICAgICAgICAgICAgICAgIHdycXUuZGF0YS5mbGFncyA9IFJUX0FTU09DX0VWRU5UX0ZMQUc7CisgICAgICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgTlVMTCk7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKyAgICAgICAgICAgICAgICAgICAgd2V4dF9ub3RpZnlfZXZlbnRfYXNzb2MocEFkKTsKKworICAgICAgICAgICAgICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweSh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBNQUNfQUREUl9MRU4pOworICAgICAgICAgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCQkJfQorCisJCQkvLworCQkJLy8gQ2lzY28gTGVhcCBDQ0tNIHN1cHBvcnRlZCBSZS1hc3NvY2lhdGlvbi4KKwkJCS8vCisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQlpZiAoTEVBUF9DQ0tNX09OKHBBZCkgJiYgKHBBZC0+U3RhQ2ZnLkNDS01MaW5rVXBGbGFnID09IFRSVUUpKQorCQkJeworCQkJCWlmIChDQ0tNQXNzb2NSc3BTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbikgPT0gVFJVRSkKKwkJCQl7CisJCQkJCXBBZC0+U3RhQ2ZnLkNraXBGbGFnID0gQ2tpcEZsYWc7CisJCQkJCWlmIChDa2lwRmxhZyAmIDB4MTgpCisJCQkJCXsKKwkJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlR4U0VRLCA0KTsKKwkJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlJ4U0VRLCA0KTsKKwkJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLkNLSVBNSUMsIDQpOworCQkJCQkJcEFkLT5TdGFDZmcuR0lWWzBdID0gUmFuZG9tQnl0ZShwQWQpOworCQkJCQkJcEFkLT5TdGFDZmcuR0lWWzFdID0gUmFuZG9tQnl0ZShwQWQpOworCQkJCQkJcEFkLT5TdGFDZmcuR0lWWzJdID0gUmFuZG9tQnl0ZShwQWQpOworCQkJCQkJcEFkLT5TdGFDZmcuYkNraXBPbiA9IFRSVUU7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8Q0NYPiBwQWQtPlN0YUNmZy5Da2lwRmxhZyA9IDB4JTAyeFxuIiwgcEFkLT5TdGFDZmcuQ2tpcEZsYWcpKTsKKwkJCQkJfQorCisJCQkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gQ0NLTUFzc29jUnNwU2FuaXR5KCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCQl7CisJCQkJLy8gQ2tpcEZsYWcgaXMgbm8gdXNlIGZvciByZWFzc29jaWF0ZQorCQkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwkJCX0KKwkJfQorCX0KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIFBlZXJSZWFzc29jUnNwQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKKwl9CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlwcm9jZWR1cmVzIG9uIElFRUUgODAyLjExLzE5OTkgcC4zNzYKKwlQYXJhbWV0cnM6CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNzb2NQb3N0UHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcEFkZHIyLAorCUlOIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKKwlJTiBVU0hPUlQgQWlkLAorCUlOIFVDSEFSIFN1cFJhdGVbXSwKKwlJTiBVQ0hBUiBTdXBSYXRlTGVuLAorCUlOIFVDSEFSIEV4dFJhdGVbXSwKKwlJTiBVQ0hBUiBFeHRSYXRlTGVuLAorCUlOIFBFRENBX1BBUk0gcEVkY2FQYXJtLAorCUlOIEhUX0NBUEFCSUxJVFlfSUUJCSpwSHRDYXBhYmlsaXR5LAorCUlOIFVDSEFSIEh0Q2FwYWJpbGl0eUxlbiwKKwlJTiBBRERfSFRfSU5GT19JRQkJKnBBZGRIdEluZm8pCS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQoreworCVVMT05HIElkeDsKKworCXBBZC0+TWxtZUF1eC5Cc3NUeXBlID0gQlNTX0lORlJBOworCUNPUFlfTUFDX0FERFIocEFkLT5NbG1lQXV4LkJzc2lkLCBwQWRkcjIpOworCXBBZC0+TWxtZUF1eC5BaWQgPSBBaWQ7CisJcEFkLT5NbG1lQXV4LkNhcGFiaWxpdHlJbmZvID0gQ2FwYWJpbGl0eUluZm8gJiBTVVBQT1JURURfQ0FQQUJJTElUWV9JTkZPOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCS8vIFNvbWUgSFQgQVAgbWlnaHQgbG9zdCBXTU0gSUUuIFdlIGFkZCBXTU0gb3Vyc2VsdmVzLiBiZWFjdWFzZSBIVCByZXF1aXJlcyBRb1Mgb24uCisJaWYgKChIdENhcGFiaWxpdHlMZW4gPiAwKSAmJiAocEVkY2FQYXJtLT5iVmFsaWQgPT0gRkFMU0UpKQorCXsKKwkJcEVkY2FQYXJtLT5iVmFsaWQgPSBUUlVFOworCQlwRWRjYVBhcm0tPkFpZnNuWzBdID0gMzsKKwkJcEVkY2FQYXJtLT5BaWZzblsxXSA9IDc7CisJCXBFZGNhUGFybS0+QWlmc25bMl0gPSAyOworCQlwRWRjYVBhcm0tPkFpZnNuWzNdID0gMjsKKworCQlwRWRjYVBhcm0tPkN3bWluWzBdID0gNDsKKwkJcEVkY2FQYXJtLT5Dd21pblsxXSA9IDQ7CisJCXBFZGNhUGFybS0+Q3dtaW5bMl0gPSAzOworCQlwRWRjYVBhcm0tPkN3bWluWzNdID0gMjsKKworCQlwRWRjYVBhcm0tPkN3bWF4WzBdID0gMTA7CisJCXBFZGNhUGFybS0+Q3dtYXhbMV0gPSAxMDsKKwkJcEVkY2FQYXJtLT5Dd21heFsyXSA9IDQ7CisJCXBFZGNhUGFybS0+Q3dtYXhbM10gPSAzOworCisJCXBFZGNhUGFybS0+VHhvcFswXSAgPSAwOworCQlwRWRjYVBhcm0tPlR4b3BbMV0gID0gMDsKKwkJcEVkY2FQYXJtLT5UeG9wWzJdICA9IDk2OworCQlwRWRjYVBhcm0tPlR4b3BbM10gID0gNDg7CisKKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0sIHBFZGNhUGFybSwgc2l6ZW9mKEVEQ0FfUEFSTSkpOworCisJLy8gZmlsdGVyIG91dCB1bi1zdXBwb3J0ZWQgcmF0ZXMKKwlwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiA9IFN1cFJhdGVMZW47CisJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlN1cFJhdGUsIFN1cFJhdGUsIFN1cFJhdGVMZW4pOworCVJUTVBDaGVja1JhdGVzKHBBZCwgcEFkLT5NbG1lQXV4LlN1cFJhdGUsICZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbik7CisKKwkvLyBmaWx0ZXIgb3V0IHVuLXN1cHBvcnRlZCByYXRlcworCXBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuID0gRXh0UmF0ZUxlbjsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguRXh0UmF0ZSwgRXh0UmF0ZSwgRXh0UmF0ZUxlbik7CisJUlRNUENoZWNrUmF0ZXMocEFkLCBwQWQtPk1sbWVBdXguRXh0UmF0ZSwgJnBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmIChIdENhcGFiaWxpdHlMZW4gPiAwKQorCXsKKwkJUlRNUENoZWNrSHQocEFkLCBCU1NJRF9XQ0lELCBwSHRDYXBhYmlsaXR5LCBwQWRkSHRJbmZvKTsKKwl9CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNzb2NQb3N0UHJvYz09PT4gIEFQLkFNc2R1U2l6ZSA9ICVkLiBDbGllbnRTdGF0dXNGbGFncyA9IDB4JWx4IFxuIiwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BTXNkdVNpemUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQ2xpZW50U3RhdHVzRmxhZ3MpKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzc29jUG9zdFByb2M9PT0+ICAgIChNbXBzPSVkLCBBbXNkdVNpemU9JWQsIClcbiIsCisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTW1wc01vZGUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQU1zZHVTaXplKSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkvLyBTZXQgTmV3IFdQQSBpbmZvcm1hdGlvbgorCUlkeCA9IEJzc1RhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIHBBZGRyMiwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpOworCWlmIChJZHggPT0gQlNTX05PVF9GT1VORCkKKwl7CisJCURCR1BSSU5UX0VSUigoIkFTU09DIC0gQ2FuJ3QgZmluZCBCU1MgYWZ0ZXIgcmVjZWl2aW5nIEFzc29jIHJlc3BvbnNlXG4iKSk7CisJfQorCWVsc2UKKwl7CisJCS8vIEluaXQgdmFyaWFibGUKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4gPSAwOworCQlOZGlzWmVyb01lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgTUFYX0xFTl9PRl9SU05JRSk7CisKKwkJLy8gU3RvcmUgYXBwcm9wcmlhdGUgUlNOX0lFIGZvciBXUEEgU00gbmVnb3RpYXRpb24gbGF0ZXIKKwkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpICYmIChwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5WYXJJRUxlbiAhPSAwKSkKKwkJeworCQkJUFVDSEFSICAgICAgICAgICAgICBwVklFOworCQkJVVNIT1JUICAgICAgICAgICAgICBsZW47CisJCQlQRUlEX1NUUlVDVCAgICAgICAgIHBFaWQ7CisKKwkJCXBWSUUgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5WYXJJRXM7CisJCQlsZW4JID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uVmFySUVMZW47CisKKwkJCXdoaWxlIChsZW4gPiAwKQorCQkJeworCQkJCXBFaWQgPSAoUEVJRF9TVFJVQ1QpIHBWSUU7CisJCQkJLy8gRm9yIFdQQS9XUEFQU0sKKwkJCQlpZiAoKHBFaWQtPkVpZCA9PSBJRV9XUEEpICYmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdQQV9PVUksIDQpKQorCQkJCQkmJiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBIHx8IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpCisJCQkJeworCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgcFZJRSwgKHBFaWQtPkxlbiArIDIpKTsKKwkJCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4gPSAocEVpZC0+TGVuICsgMik7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzc29jUG9zdFByb2M9PT0+IFN0b3JlIFJTTl9JRSBmb3IgV1BBIFNNIG5lZ290aWF0aW9uIFxuIikpOworCQkJCX0KKwkJCQkvLyBGb3IgV1BBMi9XUEEyUFNLCisJCQkJZWxzZSBpZiAoKHBFaWQtPkVpZCA9PSBJRV9SU04pICYmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQgKyAyLCBSU05fT1VJLCAzKSkKKwkJCQkJJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIgfHwgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCisJCQkJeworCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgcFZJRSwgKHBFaWQtPkxlbiArIDIpKTsKKwkJCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4gPSAocEVpZC0+TGVuICsgMik7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzc29jUG9zdFByb2M9PT0+IFN0b3JlIFJTTl9JRSBmb3IgV1BBMiBTTSBuZWdvdGlhdGlvbiBcbiIpKTsKKwkJCQl9CisKKwkJCQlwVklFICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJCQlsZW4gIC09IChwRWlkLT5MZW4gKyAyKTsKKwkJCX0KKwkJfQorCisJCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbiA9PSAwKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc3NvY1Bvc3RQcm9jPT09PiBubyBSU05fSUUgXG4iKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQloZXhfZHVtcCgiUlNOX0lFIiwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05fSUUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuKTsKKwkJfQorCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlsZWZ0IHBhcnQgb2YgSUVFRSA4MDIuMTEvMTk5OSBwLjM3NAorCVBhcmFtZXRlcnM6CisJCUVsZW0gLSBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyRGlzYXNzb2NBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlVU0hPUlQgICAgICAgIFJlYXNvbjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gUGVlckRpc2Fzc29jQWN0aW9uKClcbiIpKTsKKwlpZihQZWVyRGlzYXNzb2NTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZSZWFzb24pKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBQZWVyRGlzYXNzb2NBY3Rpb24oKSBSZWFzb24gPSAlZFxuIiwgUmVhc29uKSk7CisJCWlmIChJTkZSQV9PTihwQWQpICYmIE1BQ19BRERSX0VRVUFMKHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBBZGRyMikpCisJCXsKKworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQkJeworCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0RJU0FTU09DX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJCQl9CisKKworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJaWYgKHBBZC0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSA9PSBDSVNDT19BdXRoTW9kZUxFQVApCisJCQl7CisJCQkJLy8gQ2lzY29fTEVBUCBoYXMgc3RhcnQgYSB0aW1lcgorCQkJCS8vIFdlIHNob3VsZCBjYW5jZWwgaXQgaWYgdXNpbmcgTEVBUAorCQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuTGVhcEF1dGhUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJCQkvL0NoZWNrIGlzIGl0IG1hY2ggdGhlIExFQVAgQXV0aGVudGljYXRpb24gZmFpbGVkIGFzIHBvc3NpYmxlIGEgUm9ndWUgQVAKKwkJCQkvL29uIGl0J3MgUG9ydFNlY3VyZWQgbm90IGVxdWFsIHRvIFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEIHdoaWxlIHByb2Nlc3MgdGhlIEFzc29jaWF0aW9uLgorCQkJCWlmICgocEFkLT5NbG1lLkxlYXBNYWNoaW5lLkN1cnJTdGF0ZSAhPSBMRUFQX0lETEUpICYmIChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCAhPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkpCisJCQkJeworCQkJCQlSb2d1ZUFwVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlN0YUNmZy5Sb2d1ZUFwVGFiLCBBZGRyMiwgTEVBUF9SRUFTT05fQVVUSF9USU1FT1VUKTsKKwkJCQl9CisJCQl9CisjZW5kaWYJLy8gTEVBUF9TVVBQT1JUIC8vCisJCQkvLworCQkJLy8gR2V0IEN1cnJlbnQgU3lzdGVtIHRpbWUgYW5kIFR1cm4gb24gQWRqYWNlbnRBUFJlcG9ydAorCQkJLy8KKwkJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJnBBZC0+U3RhQ2ZnLkNDWEFkamFjZW50QVBMaW5rRG93blRpbWUpOworCQkJcEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUFJlcG9ydEZsYWcgPSBUUlVFOworCQkJTGlua0Rvd24ocEFkLCBUUlVFKTsKKwkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNpZm5kZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkKKwkJCXsKKyAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisgICAgICAgICAgICAgICAgLy9zZW5kIGRpc2Fzc29jaWF0ZSBldmVudCB0byB3cGFfc3VwcGxpY2FudAorICAgICAgICAgICAgICAgIG1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKyAgICAgICAgICAgICAgICB3cnF1LmRhdGEuZmxhZ3MgPSBSVF9ESVNBU1NPQ19FVkVOVF9GTEFHOworICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgTlVMTCk7CisgICAgICAgICAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKyAgICAgICAgICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7CisgICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOworICAgICAgICAgICAgfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJCX0KKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBQZWVyRGlzYXNzb2NBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOworCX0KKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCXdoYXQgdGhlIHN0YXRlIG1hY2hpbmUgd2lsbCBkbyBhZnRlciBhc3NvYyB0aW1lb3V0CisJUGFyYW1ldGVyczoKKwkJRWxtZSAtCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNzb2NUaW1lb3V0QWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgIFN0YXR1czsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIEFzc29jVGltZW91dEFjdGlvblxuIikpOworCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwlTdGF0dXMgPSBNTE1FX1JFSl9USU1FT1VUOworCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQl3aGF0IHRoZSBzdGF0ZSBtYWNoaW5lIHdpbGwgZG8gYWZ0ZXIgcmVhc3NvYyB0aW1lb3V0CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUmVhc3NvY1RpbWVvdXRBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCAgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gUmVhc3NvY1RpbWVvdXRBY3Rpb25cbiIpKTsKKwlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJU3RhdHVzID0gTUxNRV9SRUpfVElNRU9VVDsKKwlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQl3aGF0IHRoZSBzdGF0ZSBtYWNoaW5lIHdpbGwgZG8gYWZ0ZXIgZGlzYXNzb2MgdGltZW91dAorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIERpc2Fzc29jVGltZW91dEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUICBTdGF0dXM7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBEaXNhc3NvY1RpbWVvdXRBY3Rpb25cbiIpKTsKKwlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJU3RhdHVzID0gTUxNRV9TVUNDRVNTOworCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9ESVNBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKK30KKworVk9JRCBJbnZhbGlkU3RhdGVXaGVuQXNzb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCAgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gSW52YWxpZFN0YXRlV2hlbkFzc29jKHN0YXRlPSVsZCksIHJlc2V0IEFTU09DIHN0YXRlIG1hY2hpbmVcbiIsCisJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlKSk7CisJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CisJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOworfQorCitWT0lEIEludmFsaWRTdGF0ZVdoZW5SZWFzc29jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gSW52YWxpZFN0YXRlV2hlblJlYXNzb2Moc3RhdGU9JWxkKSwgcmVzZXQgQVNTT0Mgc3RhdGUgbWFjaGluZVxuIiwKKwkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUpKTsKKwlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKKwlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKK30KKworVk9JRCBJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2NpYXRlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jKHN0YXRlPSVsZCksIHJlc2V0IEFTU09DIHN0YXRlIG1hY2hpbmVcbiIsCisJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlKSk7CisJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CisJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0RJU0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCXJpZ2h0IHBhcnQgb2YgSUVFRSA4MDIuMTEvMTk5OSBwYWdlIDM3NAorCU5vdGU6CisJCVRoaXMgZXZlbnQgc2hvdWxkIG5ldmVyIGNhdXNlIEFTU09DIHN0YXRlIG1hY2hpbmUgcGVyZm9ybSBzdGF0ZQorCQl0cmFuc2l0aW9uLCBhbmQgaGFzIG5vIHJlbGF0aW9uc2hpcCB3aXRoIENOVEwgbWFjaGluZS4gU28gd2Ugc2VwYXJhdGUKKwkJdGhpcyByb3V0aW5lIGFzIGEgc2VydmljZSBvdXRzaWRlIG9mIEFTU09DIHN0YXRlIHRyYW5zaXRpb24gdGFibGUuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQ2xzM2VyckFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgICAgICAgIHBBZGRyKQoreworCUhFQURFUl84MDJfMTEgICAgICAgICBEaXNhc3NvY0hkcjsKKwlQSEVBREVSXzgwMl8xMSAgICAgICAgcERpc2Fzc29jSGRyOworCVBVQ0hBUiAgICAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlVTE9ORyAgICAgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOworCU5ESVNfU1RBVFVTICAgICAgICAgICBOU3RhdHVzOworCVVTSE9SVCAgICAgICAgICAgICAgICBSZWFzb24gPSBSRUFTT05fQ0xTM0VSUjsKKworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJcmV0dXJuOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBDbGFzcyAzIEVycm9yLCBTZW5kIERJU0FTU09DIGZyYW1lXG4iKSk7CisJTWd0TWFjSGVhZGVySW5pdChwQWQsICZEaXNhc3NvY0hkciwgU1VCVFlQRV9ESVNBU1NPQywgMCwgcEFkZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsJLy8gcGF0Y2ggcGVhcCB0dGxzIHN3aXRjaGluZyBpc3N1ZQorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCisJCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCZEaXNhc3NvY0hkciwKKwkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgJlJlYXNvbiwKKwkJCQkJICBFTkRfT0ZfQVJHUyk7CisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisKKwkvLyBUbyBwYXRjaCBJbnN0YW5jZSBhbmQgQnVmZmFsbyhOKSBBUAorCS8vIERyaXZlciBoYXMgdG8gc2VuZCBkZWF1dGggdG8gSW5zdGFuY2UgQVAsIGJ1dCBCdWZmYWxvKE4pIG5lZWRzIHRvIHNlbmQgZGlzYXNzb2MgdG8gcmVzZXQgQXV0aGVudGljYXRvcidzIHN0YXRlIG1hY2hpbmUKKwkvLyBUaGVyZWZvcmUsIHdlIHNlbmQgYm90aCBvZiB0aGVtLgorCXBEaXNhc3NvY0hkciA9IChQSEVBREVSXzgwMl8xMSlwT3V0QnVmZmVyOworCXBEaXNhc3NvY0hkci0+RkMuU3ViVHlwZSA9IFNVQlRZUEVfREVBVVRIOworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCXBBZC0+U3RhQ2ZnLkRpc2Fzc29jUmVhc29uID0gUkVBU09OX0NMUzNFUlI7CisJQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5EaXNhc3NvY1N0YSwgcEFkZHIpOworfQorCisgLyoKKwkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkgRGVzY3JpcHRpb246CisJCSBTd2l0Y2ggYmV0d2VlbiBXRVAgYW5kIENLSVAgdXBvbiBuZXcgYXNzb2NpYXRpb24gdXAuCisJIFBhcmFtZXRlcnM6CisKKwkgSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgKi8KK1ZPSUQgU3dpdGNoQmV0d2VlbldlcEFuZENraXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJaW50ICAgICAgICAgICAgaTsKKwlTSEFSRURLRVlfTU9ERV9TVFJVQyAgY3NyMTsKKworCS8vIGlmIEtQIGlzIHJlcXVpcmVkLiBjaGFuZ2UgdGhlIENpcGhlckFsZyBpbiBoYXJkd2FyZSBzaGFyZCBrZXkgdGFibGUgZnJvbSBXRVAKKwkvLyB0byBDS0lQLiBlbHNlIHJlbWFpbiBhcyBXRVAKKwlpZiAocEFkLT5TdGFDZmcuYkNraXBPbiAmJiAocEFkLT5TdGFDZmcuQ2tpcEZsYWcgJiAweDEwKSkKKwl7CisJCS8vIG1vZGlmeSBoYXJkd2FyZSBrZXkgdGFibGUgc28gdGhhdCBNQUMgdXNlIGNvcnJlY3QgYWxnb3JpdGhtIHRvIGRlY3J5cHQgUlgKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSwgJmNzcjEud29yZCk7CisJCWlmIChjc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID09IENJUEhFUl9XRVA2NCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDY0OworCQllbHNlIGlmIChjc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID09IENJUEhFUl9XRVAxMjgpCisJCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gQ0lQSEVSX0NLSVAxMjg7CisKKwkJaWYgKGNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDY0KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IENJUEhFUl9DS0lQNjQ7CisJCWVsc2UgaWYgKGNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDEyOCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDEyODsKKworCQlpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9PSBDSVBIRVJfV0VQNjQpCisJCQljc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID0gQ0lQSEVSX0NLSVA2NDsKKwkJZWxzZSBpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9PSBDSVBIRVJfV0VQMTI4KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9IENJUEhFUl9DS0lQMTI4OworCisJCWlmIChjc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID09IENJUEhFUl9XRVA2NCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDY0OworCQllbHNlIGlmIChjc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID09IENJUEhFUl9XRVAxMjgpCisJCQljc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID0gQ0lQSEVSX0NLSVAxMjg7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFLCBjc3IxLndvcmQpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTd2l0Y2hCZXR3ZWVuV2VwQW5kQ2tpcDogbW9kaWZ5IEJTUzAgY2lwaGVyIHRvICVzXG4iLCBDaXBoZXJOYW1lW2NzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGddKSk7CisKKwkJLy8gbW9kaWZ5IHNvZnR3YXJlIGtleSB0YWJsZSBzbyB0aGF0IGRyaXZlciBjYW4gc3BlY2lmeSBjb3JyZWN0IGFsZ29yaXRobSBpbiBUWEQgdXBvbiBUWAorCQlmb3IgKGk9MDsgaTxTSEFSRV9LRVlfTlVNOyBpKyspCisJCXsKKwkJCWlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDY0KQorCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkNpcGhlckFsZyA9IENJUEhFUl9DS0lQNjQ7CisJCQllbHNlIGlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDEyOCkKKwkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDEyODsKKwkJfQorCX0KKworCS8vIGVsc2UgaWYgS1AgTk9UIGludXNlZC4gY2hhbmdlIHRoZSBDaXBoZXJBbGcgaW4gaGFyZHdhcmUgc2hhcmQga2V5IHRhYmxlIGZyb20gQ0tJUAorCS8vIHRvIFdFUC4KKwllbHNlCisJeworCQkvLyBtb2RpZnkgaGFyZHdhcmUga2V5IHRhYmxlIHNvIHRoYXQgTUFDIHVzZSBjb3JyZWN0IGFsZ29yaXRobSB0byBkZWNyeXB0IFJYCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UsICZjc3IxLndvcmQpOworCQlpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDY0KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJZWxzZSBpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDEyOCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCisJCWlmIChjc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQNjQpCisJCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQllbHNlIGlmIChjc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQMTI4KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisKKwkJaWYgKGNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPT0gQ0lQSEVSX0NLSVA2NCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCWVsc2UgaWYgKGNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPT0gQ0lQSEVSX0NLSVAxMjgpCisJCQljc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKworCQlpZiAoY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDY0KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJZWxzZSBpZiAoY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDEyOCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCisJCS8vIG1vZGlmeSBzb2Z0d2FyZSBrZXkgdGFibGUgc28gdGhhdCBkcml2ZXIgY2FuIHNwZWNpZnkgY29ycmVjdCBhbGdvcml0aG0gaW4gVFhEIHVwb24gVFgKKwkJZm9yIChpPTA7IGk8U0hBUkVfS0VZX05VTTsgaSsrKQorCQl7CisJCQlpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQNjQpCisJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQkJZWxzZSBpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQMTI4KQorCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisJCX0KKworCQkvLworCQkvLyBPbiBXUEEtTk9ORSwgbXVzdCB1cGRhdGUgQ2lwaGVyQWxnLgorCQkvLyBCZWNhdXNlIHRoZSBPSURfODAyXzExX1dFUF9TVEFUVVMgd2FzIGJlZW4gc2V0IGFmdGVyIE9JRF84MDJfMTFfQUREX0tFWQorCQkvLyBhbmQgQ2lwaGVyQWxnIHdpbGwgYmUgQ0lQSEVSX05PTkUgYnkgV2luZG93cyBaZXJvQ29uZmlnLgorCQkvLyBTbyB3ZSBuZWVkIHRvIHVwZGF0ZSBDaXBoZXJBbGcgYWZ0ZXIgY29ubmVjdC4KKwkJLy8KKwkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisJCXsKKwkJCWZvciAoaSA9IDA7IGkgPCBTSEFSRV9LRVlfTlVNOyBpKyspCisJCQl7CisJCQkJaWYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLktleUxlbiAhPSAwKQorCQkJCXsKKwkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQkJCQl7CisJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJCQkJeworCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJCQl9CisJCQl9CisKKwkJCWNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGc7CisJCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bMV0uQ2lwaGVyQWxnOworCQkJY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdWzJdLkNpcGhlckFsZzsKKwkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVszXS5DaXBoZXJBbGc7CisJCX0KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UsIGNzcjEud29yZCk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN3aXRjaEJldHdlZW5XZXBBbmRDa2lwOiBtb2RpZnkgQlNTMCBjaXBoZXIgdG8gJXNcbiIsIENpcGhlck5hbWVbY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZ10pKTsKKwl9Cit9CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCitWT0lEICAgIFNlbmRBc3NvY0lFc1RvV3BhU3VwcGxpY2FudCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiBwQWQpCit7CisgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgIHVuc2lnbmVkIGNoYXIgY3VzdG9tW0lXX0NVU1RPTV9NQVhdID0gezB9OworCisgICAgaWYgKChwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiArIDE3KSA8PSBJV19DVVNUT01fTUFYKQorICAgIHsKKyAgICAgICAgc3ByaW50ZihjdXN0b20sICJBU1NPQ0lORk9fUmVxSUVzPSIpOworCSAgICBOZGlzTW92ZU1lbW9yeShjdXN0b20rMTcsIHBBZC0+U3RhQ2ZnLlJlcVZhcklFcywgcEFkLT5TdGFDZmcuUmVxVmFySUVMZW4pOworCSAgICBtZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisgICAgICAgIHdycXUuZGF0YS5sZW5ndGggPSBwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiArIDE3OworICAgICAgICB3cnF1LmRhdGEuZmxhZ3MgPSBSVF9SRVFJRV9FVkVOVF9GTEFHOworICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkNVU1RPTSwgJndycXUsIGN1c3RvbSk7CisKKyAgICAgICAgbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworICAgICAgICB3cnF1LmRhdGEuZmxhZ3MgPSBSVF9BU1NPQ0lORk9fRVZFTlRfRkxBRzsKKyAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBOVUxMKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiArIDE3ID4gTUFYX0NVU1RPTV9MRU5cbiIpKTsKKworICAgIHJldHVybjsKK30KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCitpbnQgd2V4dF9ub3RpZnlfZXZlbnRfYXNzb2MoCisJSU4gIFJUTVBfQURBUFRFUiAqcEFkKQoreworICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKyAgICBjaGFyIGN1c3RvbVtJV19DVVNUT01fTUFYXSA9IHswfTsKKworI2lmIFdJUkVMRVNTX0VYVCA+IDE3CisgICAgaWYgKHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuIDw9IElXX0NVU1RPTV9NQVgpCisgICAgeworICAgICAgICB3cnF1LmRhdGEubGVuZ3RoID0gcEFkLT5TdGFDZmcuUmVxVmFySUVMZW47CisgICAgICAgIG1lbWNweShjdXN0b20sIHBBZC0+U3RhQ2ZnLlJlcVZhcklFcywgcEFkLT5TdGFDZmcuUmVxVmFySUVMZW4pOworICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkFTU09DUkVRSUUsICZ3cnF1LCBjdXN0b20pOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuID4gTUFYX0NVU1RPTV9MRU5cbiIpKTsKKyNlbHNlCisgICAgaWYgKCgocEFkLT5TdGFDZmcuUmVxVmFySUVMZW4qMikgKyAxNykgPD0gSVdfQ1VTVE9NX01BWCkKKyAgICB7CisgICAgICAgIFVDSEFSICAgaWR4OworICAgICAgICB3cnF1LmRhdGEubGVuZ3RoID0gKHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuKjIpICsgMTc7CisgICAgICAgIHNwcmludGYoY3VzdG9tLCAiQVNTT0NJTkZPKFJlcUlFcz0iKTsKKyAgICAgICAgZm9yIChpZHg9MDsgaWR4PHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuOyBpZHgrKykKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGN1c3RvbSwgIiVzJTAyeCIsIGN1c3RvbSwgcEFkLT5TdGFDZmcuUmVxVmFySUVzW2lkeF0pOworICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkNVU1RPTSwgJndycXUsIGN1c3RvbSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiKHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuKjIpICsgMTcgPiBNQVhfQ1VTVE9NX0xFTlxuIikpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKKworfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2F1dGguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2F1dGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2ZiOGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYXV0aC5jCkBAIC0wLDAgKzEsNDc0IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCWF1dGguYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUpvaG4JCTIwMDQtOS0zCQlwb3J0aW5nIGZyb20gUlQyNTAwCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIGF1dGhlbnRpY2F0ZSBzdGF0ZSBtYWNoaW5lIGluaXQsIGluY2x1ZGluZyBzdGF0ZSB0cmFuc2l0aW9uIGFuZCB0aW1lciBpbml0CisgICAgUGFyYW1ldGVyczoKKyAgICAgICAgU20gLSBwb2ludGVyIHRvIHRoZSBhdXRoIHN0YXRlIG1hY2hpbmUKKyAgICBOb3RlOgorICAgICAgICBUaGUgc3RhdGUgbWFjaGluZSBsb29rcyBsaWtlIHRoaXMKKworICAgICAgICAgICAgICAgICAgICAgICAgQVVUSF9SRVFfSURMRSAgICAgICAgICAgQVVUSF9XQUlUX1NFUTIgICAgICAgICAgICAgICAgICAgQVVUSF9XQUlUX1NFUTQKKyAgICBNVDJfTUxNRV9BVVRIX1JFUSAgIG1sbWVfYXV0aF9yZXFfYWN0aW9uICAgIGludmFsaWRfc3RhdGVfd2hlbl9hdXRoICAgICAgICAgIGludmFsaWRfc3RhdGVfd2hlbl9hdXRoCisgICAgTVQyX1BFRVJfQVVUSF9FVkVOICBkcm9wICAgICAgICAgICAgICAgICAgICBwZWVyX2F1dGhfZXZlbl9hdF9zZXEyX2FjdGlvbiAgICBwZWVyX2F1dGhfZXZlbl9hdF9zZXE0X2FjdGlvbgorICAgIE1UMl9BVVRIX1RJTUVPVVQgICAgRHJvcCAgICAgICAgICAgICAgICAgICAgYXV0aF90aW1lb3V0X2FjdGlvbiAgICAgICAgICAgICAgYXV0aF90aW1lb3V0X2FjdGlvbgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKwordm9pZCBBdXRoU3RhdGVNYWNoaW5lSW5pdCgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBTVEFURV9NQUNISU5FICpTbSwKKyAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCit7CisgICAgU3RhdGVNYWNoaW5lSW5pdChTbSwgVHJhbnMsIE1BWF9BVVRIX1NUQVRFLCBNQVhfQVVUSF9NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpRHJvcCwgQVVUSF9SRVFfSURMRSwgQVVUSF9NQUNISU5FX0JBU0UpOworCisgICAgLy8gdGhlIGZpcnN0IGNvbHVtbgorICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9SRVFfSURMRSwgTVQyX01MTUVfQVVUSF9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZUF1dGhSZXFBY3Rpb24pOworCisgICAgLy8gdGhlIHNlY29uZCBjb2x1bW4KKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfV0FJVF9TRVEyLCBNVDJfTUxNRV9BVVRIX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuQXV0aCk7CisgICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRMiwgTVQyX1BFRVJfQVVUSF9FVkVOLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJBdXRoUnNwQXRTZXEyQWN0aW9uKTsKKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfV0FJVF9TRVEyLCBNVDJfQVVUSF9USU1FT1VULCAoU1RBVEVfTUFDSElORV9GVU5DKUF1dGhUaW1lb3V0QWN0aW9uKTsKKworICAgIC8vIHRoZSB0aGlyZCBjb2x1bW4KKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfV0FJVF9TRVE0LCBNVDJfTUxNRV9BVVRIX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuQXV0aCk7CisgICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRNCwgTVQyX1BFRVJfQVVUSF9FVkVOLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJBdXRoUnNwQXRTZXE0QWN0aW9uKTsKKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfV0FJVF9TRVE0LCBNVDJfQVVUSF9USU1FT1VULCAoU1RBVEVfTUFDSElORV9GVU5DKUF1dGhUaW1lb3V0QWN0aW9uKTsKKworCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKEF1dGhUaW1lb3V0KSwgcEFkLCBGQUxTRSk7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYXQgdGltZXIgdGhyZWFkIHdoZW4gYXV0aCB0aW1lciBleHBpcmVzCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXV0aFRpbWVvdXQoCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworICAgIFJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQVVUSCAtIEF1dGhUaW1lb3V0XG4iKSk7CisKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQlyZXR1cm47CisKKwkvLyBzZW5kIGEgZGUtYXV0aCB0byByZXNldCBBUCdzIHN0YXRlIG1hY2hpbmUgKFBhdGNoIEFQLURpcjYzNSkKKwlpZiAocEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9PSBBVVRIX1dBSVRfU0VRMikKKwkJQ2xzMmVyckFjdGlvbihwQWQsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7CisKKworICAgIE1sbWVFbnF1ZXVlKHBBZCwgQVVUSF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9USU1FT1VULCAwLCBOVUxMKTsKKyAgICBSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7Cit9CisKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVBdXRoUmVxQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKyAgICBVQ0hBUiAgICAgICAgICAgICAgQWRkcls2XTsKKyAgICBVU0hPUlQgICAgICAgICAgICAgQWxnLCBTZXEsIFN0YXR1czsKKyAgICBVTE9ORyAgICAgICAgICAgICAgVGltZW91dDsKKyAgICBIRUFERVJfODAyXzExICAgICAgQXV0aEhkcjsKKyAgICBCT09MRUFOICAgICAgICAgICAgVGltZXJDYW5jZWxsZWQ7CisgICAgTkRJU19TVEFUVVMgICAgICAgIE5TdGF0dXM7CisgICAgUFVDSEFSICAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworICAgIFVMT05HICAgICAgICAgICAgICBGcmFtZUxlbiA9IDA7CisKKwkvLyBCbG9jayBhbGwgYXV0aGVudGljYXRpb24gcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QKKwlpZiAocEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPT0gVFJVRSkKKwl7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBCbG9jayBBdXRoIHJlcXVlc3QgZHVybmluZyBXUEEgYmxvY2sgcGVyaW9kIVxuIikpOworICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKKyAgICAgICAgU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKKyAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7CisJfQorICAgIGVsc2UgaWYoTWxtZUF1dGhSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkciwgJlRpbWVvdXQsICZBbGcpKQorICAgIHsKKyAgICAgICAgLy8gcmVzZXQgdGltZXIKKyAgICAgICAgUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworICAgICAgICBDT1BZX01BQ19BRERSKHBBZC0+TWxtZUF1eC5Cc3NpZCwgQWRkcik7CisgICAgICAgIHBBZC0+TWxtZUF1eC5BbGcgID0gQWxnOworICAgICAgICBTZXEgPSAxOworICAgICAgICBTdGF0dXMgPSBNTE1FX1NVQ0NFU1M7CisKKyAgICAgICAgTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKyAgICAgICAgaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gTWxtZUF1dGhSZXFBY3Rpb24oQWxnOiVkKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkXG4iLCBBbGcpKTsKKyAgICAgICAgICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworICAgICAgICAgICAgU3RhdHVzID0gTUxNRV9GQUlMX05PX1JFU09VUkNFOworICAgICAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gU2VuZCBBVVRIIHJlcXVlc3Qgc2VxIzEgKEFsZz0lZCkuLi5cbiIsIEFsZykpOworICAgICAgICBNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkF1dGhIZHIsIFNVQlRZUEVfQVVUSCwgMCwgQWRkciwgcEFkLT5NbG1lQXV4LkJzc2lkKTsKKyAgICAgICAgTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCZBdXRoSGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgJkFsZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICZTZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAmU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7CisgICAgICAgIE1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworICAgIAlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisgICAgICAgIFJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwgVGltZW91dCk7CisgICAgICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1dBSVRfU0VRMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgREJHUFJJTlRfRVJSKCgiQVVUSCAtIE1sbWVBdXRoUmVxQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxlZFxuIikpOworICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKKyAgICAgICAgU3RhdHVzID0gTUxNRV9JTlZBTElEX0ZPUk1BVDsKKyAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7CisgICAgfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUGVlckF1dGhSc3BBdFNlcTJBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworICAgIFVDSEFSICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKKyAgICBVU0hPUlQgICAgICAgIFNlcSwgU3RhdHVzLCBSZW1vdGVTdGF0dXMsIEFsZzsKKyAgICBVQ0hBUiAgICAgICAgIENobGdUZXh0W0NJUEhFUl9URVhUX0xFTl07CisgICAgVUNIQVIgICAgICAgICBDeXBlckNobGdUZXh0W0NJUEhFUl9URVhUX0xFTiArIDggKyA4XTsKKyAgICBVQ0hBUiAgICAgICAgIEVsZW1lbnRbMl07CisgICAgSEVBREVSXzgwMl8xMSBBdXRoSGRyOworICAgIEJPT0xFQU4gICAgICAgVGltZXJDYW5jZWxsZWQ7CisgICAgUFVDSEFSICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKyAgICBORElTX1NUQVRVUyAgIE5TdGF0dXM7CisgICAgVUxPTkcgICAgICAgICBGcmFtZUxlbiA9IDA7CisgICAgVVNIT1JUICAgICAgICBTdGF0dXMyOworCisgICAgaWYgKFBlZXJBdXRoU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIyLCAmQWxnLCAmU2VxLCAmU3RhdHVzLCBDaGxnVGV4dCkpCisgICAgeworICAgICAgICBpZiAoTUFDX0FERFJfRVFVQUwocEFkLT5NbG1lQXV4LkJzc2lkLCBBZGRyMikgJiYgU2VxID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBSZWNlaXZlIEFVVEhfUlNQIHNlcSMyIHRvIG1lIChBbGc9JWQsIFN0YXR1cz0lZClcbiIsIEFsZywgU3RhdHVzKSk7CisgICAgICAgICAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisKKyAgICAgICAgICAgIGlmIChTdGF0dXMgPT0gTUxNRV9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEF1dGhlbnRpY2F0aW9uIE1vZGUgIkxFQVAiIGhhcyBhbGxvdyBmb3IgQ0NYIDEuWAorICAgICAgICAgICAgICAgIGlmICgocEFkLT5NbG1lQXV4LkFsZyA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQorI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJCQl8fCAocEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID09IENJU0NPX0F1dGhNb2RlTEVBUCkKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKwkJCQkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgcEFkLT5NbG1lLkxlYXBNYWNoaW5lLkN1cnJTdGF0ZSA9IExFQVBfSURMRTsKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIDIuIHNoYXJlZCBrZXksIG5lZWQgdG8gYmUgY2hhbGxlbmdlZAorICAgICAgICAgICAgICAgICAgICBTZXErKzsKKyAgICAgICAgICAgICAgICAgICAgUmVtb3RlU3RhdHVzID0gTUxNRV9TVUNDRVNTOworCisJCQkJCS8vIEdldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisgICAgICAgICAgICAgICAgICAgIE5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIGlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIFBlZXJBdXRoUnNwQXRTZXEyQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzMiA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBTZW5kIEFVVEggcmVxdWVzdCBzZXEjMy4uLlxuIikpOworICAgICAgICAgICAgICAgICAgICBNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkF1dGhIZHIsIFNVQlRZUEVfQVVUSCwgMCwgQWRkcjIsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7CisgICAgICAgICAgICAgICAgICAgIEF1dGhIZHIuRkMuV2VwID0gMTsKKyAgICAgICAgICAgICAgICAgICAgLy8gRW5jcnlwdCBjaGFsbGVuZ2UgdGV4dCAmIGF1dGggaW5mb3JtYXRpb24KKyAgICAgICAgICAgICAgICAgICAgUlRNUEluaXRXZXBFbmdpbmUoCisgICAgICAgICAgICAgICAgICAgIAlwQWQsCisgICAgICAgICAgICAgICAgICAgIAlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwKKyAgICAgICAgICAgICAgICAgICAgCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKKyAgICAgICAgICAgICAgICAgICAgCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuLAorICAgICAgICAgICAgICAgICAgICAJQ3lwZXJDaGxnVGV4dCk7CisKKwkJCQkJQWxnID0gY3B1MmxlMTYoKihVU0hPUlQgKikmQWxnKTsKKwkJCQkJU2VxID0gY3B1MmxlMTYoKihVU0hPUlQgKikmU2VxKTsKKwkJCQkJUmVtb3RlU3RhdHVzPSBjcHUybGUxNigqKFVTSE9SVCAqKSZSZW1vdGVTdGF0dXMpOworCisJCQkJCVJUTVBFbmNyeXB0RGF0YShwQWQsIChQVUNIQVIpICZBbGcsIEN5cGVyQ2hsZ1RleHQgKyA0LCAyKTsKKwkJCQkJUlRNUEVuY3J5cHREYXRhKHBBZCwgKFBVQ0hBUikgJlNlcSwgQ3lwZXJDaGxnVGV4dCArIDYsIDIpOworCQkJCQlSVE1QRW5jcnlwdERhdGEocEFkLCAoUFVDSEFSKSAmUmVtb3RlU3RhdHVzLCBDeXBlckNobGdUZXh0ICsgOCwgMik7CisJCQkJCUVsZW1lbnRbMF0gPSAxNjsKKwkJCQkJRWxlbWVudFsxXSA9IDEyODsKKwkJCQkJUlRNUEVuY3J5cHREYXRhKHBBZCwgRWxlbWVudCwgQ3lwZXJDaGxnVGV4dCArIDEwLCAyKTsKKwkJCQkJUlRNUEVuY3J5cHREYXRhKHBBZCwgQ2hsZ1RleHQsIEN5cGVyQ2hsZ1RleHQgKyAxMiwgMTI4KTsKKwkJCQkJUlRNUFNldElDVihwQWQsIEN5cGVyQ2hsZ1RleHQgKyAxNDApOworICAgICAgICAgICAgICAgICAgICBNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCAgICAmQXV0aEhkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0lQSEVSX1RFWFRfTEVOICsgMTYsICAgICBDeXBlckNobGdUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7CisgICAgICAgICAgICAgICAgICAgIE1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworICAgICAgICAgICAgICAgIAlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisgICAgICAgICAgICAgICAgICAgIFJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwgQVVUSF9USU1FT1VUKTsKKyAgICAgICAgICAgICAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfV0FJVF9TRVE0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKyAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID09IENJU0NPX0F1dGhNb2RlTEVBUCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vSW52YWxpZCBBdXRoZW50aWNhdGlvbiBwb3NzaWJsZSByb2d1ZSBBUAorICAgICAgICAgICAgICAgICAgICAvL0FkZCB0aGlzIEFwIHRvIFJvZ3VlIEFQLgorICAgICAgICAgICAgICAgICAgICBSb2d1ZUFwVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlN0YUNmZy5Sb2d1ZUFwVGFiLCBBZGRyMiwgTEVBUF9SRUFTT05fSU5WQUxJRF9BVVRIKTsKKwkJCQl9CisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuQXV0aEZhaWxSZWFzb24gPSBTdGF0dXM7CisgICAgICAgICAgICAgICAgQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5BdXRoRmFpbFN0YSwgQWRkcjIpOworICAgICAgICAgICAgICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworICAgICAgICAgICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBQZWVyQXV0aFNhbml0eSgpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7CisgICAgfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUGVlckF1dGhSc3BBdFNlcTRBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworICAgIFVDSEFSICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKKyAgICBVU0hPUlQgICAgICAgIEFsZywgU2VxLCBTdGF0dXM7CisgICAgQ0hBUiAgICAgICAgICBDaGxnVGV4dFtDSVBIRVJfVEVYVF9MRU5dOworICAgIEJPT0xFQU4gICAgICAgVGltZXJDYW5jZWxsZWQ7CisKKyAgICBpZihQZWVyQXV0aFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgJkFsZywgJlNlcSwgJlN0YXR1cywgQ2hsZ1RleHQpKQorICAgIHsKKyAgICAgICAgaWYoTUFDX0FERFJfRVFVQUwocEFkLT5NbG1lQXV4LkJzc2lkLCBBZGRyMikgJiYgU2VxID09IDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBSZWNlaXZlIEFVVEhfUlNQIHNlcSM0IHRvIG1lXG4iKSk7CisgICAgICAgICAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisKKyAgICAgICAgICAgIGlmIChTdGF0dXMgIT0gTUxNRV9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkF1dGhGYWlsUmVhc29uID0gU3RhdHVzOworICAgICAgICAgICAgICAgIENPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuQXV0aEZhaWxTdGEsIEFkZHIyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisgICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gUGVlckF1dGhSc3BBdFNlcTRBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOworICAgIH0KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVEZWF1dGhSZXFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworICAgIE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QgKnBJbmZvOworICAgIEhFQURFUl84MDJfMTEgRGVhdXRoSGRyOworICAgIFBVQ0hBUiAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisgICAgTkRJU19TVEFUVVMgICBOU3RhdHVzOworICAgIFVMT05HICAgICAgICAgRnJhbWVMZW4gPSAwOworICAgIFVTSE9SVCAgICAgICAgU3RhdHVzOworCisgICAgcEluZm8gPSAoTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCAqKUVsZW0tPk1zZzsKKworICAgIE5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisgICAgaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBNbG1lRGVhdXRoUmVxQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxcbiIpKTsKKyAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisgICAgICAgIFN0YXR1cyA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKKyAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0RFQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBTZW5kIERFLUFVVEggcmVxdWVzdCAoUmVhc29uPSVkKS4uLlxuIiwgcEluZm8tPlJlYXNvbikpOworICAgIE1ndE1hY0hlYWRlckluaXQocEFkLCAmRGVhdXRoSGRyLCBTVUJUWVBFX0RFQVVUSCwgMCwgcEluZm8tPkFkZHIsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7CisgICAgTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSEVBREVSXzgwMl8xMSksJkRlYXV0aEhkciwKKyAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgJnBJbmZvLT5SZWFzb24sCisgICAgICAgICAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworICAgIE1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKyAgICBwQWQtPlN0YUNmZy5EZWF1dGhSZWFzb24gPSBwSW5mby0+UmVhc29uOworICAgIENPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuRGVhdXRoU3RhLCBwSW5mby0+QWRkcik7CisgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisgICAgU3RhdHVzID0gTUxNRV9TVUNDRVNTOworICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9ERUFVVEhfQ09ORiwgMiwgJlN0YXR1cyk7CisKKwkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIGRlYXV0aGVudGljYXRpb24KKwlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0RFQVVUSF9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXV0aFRpbWVvdXRBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworICAgIFVTSE9SVCBTdGF0dXM7CisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIEF1dGhUaW1lb3V0QWN0aW9uXG4iKSk7CisgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisgICAgU3RhdHVzID0gTUxNRV9SRUpfVElNRU9VVDsKKyAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEludmFsaWRTdGF0ZVdoZW5BdXRoKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKyAgICBVU0hPUlQgU3RhdHVzOworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBJbnZhbGlkU3RhdGVXaGVuQXV0aCAoc3RhdGU9JWxkKSwgcmVzZXQgQVVUSCBzdGF0ZSBtYWNoaW5lXG4iLCBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlKSk7CisgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisgICAgU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKKyAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTb21lIFNUQS9BUAorICAgIE5vdGU6CisgICAgICAgIFRoaXMgYWN0aW9uIHNob3VsZCBuZXZlciB0cmlnZ2VyIEFVVEggc3RhdGUgdHJhbnNpdGlvbiwgdGhlcmVmb3JlIHdlCisgICAgICAgIHNlcGFyYXRlIGl0IGZyb20gQVVUSCBzdGF0ZSBtYWNoaW5lLCBhbmQgbWFrZSBpdCBhcyBhIHN0YW5kYWxvbmUgc2VydmljZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIENsczJlcnJBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gUFVDSEFSIHBBZGRyKQoreworICAgIEhFQURFUl84MDJfMTEgRGVhdXRoSGRyOworICAgIFBVQ0hBUiAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisgICAgTkRJU19TVEFUVVMgICBOU3RhdHVzOworICAgIFVMT05HICAgICAgICAgRnJhbWVMZW4gPSAwOworICAgIFVTSE9SVCAgICAgICAgUmVhc29uID0gUkVBU09OX0NMUzJFUlI7CisKKyAgICBOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorICAgIGlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgIHJldHVybjsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBDbGFzcyAyIGVycm9yLCBTZW5kIERFQVVUSCBmcmFtZS4uLlxuIikpOworICAgIE1ndE1hY0hlYWRlckluaXQocEFkLCAmRGVhdXRoSGRyLCBTVUJUWVBFX0RFQVVUSCwgMCwgcEFkZHIsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7CisgICAgTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSEVBREVSXzgwMl8xMSksJkRlYXV0aEhkciwKKyAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgJlJlYXNvbiwKKyAgICAgICAgICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7CisgICAgTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworICAgIHBBZC0+U3RhQ2ZnLkRlYXV0aFJlYXNvbiA9IFJlYXNvbjsKKyAgICBDT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkRlYXV0aFN0YSwgcEFkZHIpOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2F1dGhfcnNwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9hdXRoX3JzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YWE0YjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9hdXRoX3JzcC5jCkBAIC0wLDAgKzEsMTY3IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCWF1dGhfcnNwLmMKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlKb2huCQkyMDA0LTEwLTEJCWNvcHkgZnJvbSBSVDI1NjAKKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgYXV0aGVudGljYXRpb24gc3RhdGUgbWFjaGluZSBpbml0IHByb2NlZHVyZQorICAgIFBhcmFtZXRlcnM6CisgICAgICAgIFNtIC0gdGhlIHN0YXRlIG1hY2hpbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEF1dGhSc3BTdGF0ZU1hY2hpbmVJbml0KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFBTVEFURV9NQUNISU5FIFNtLAorICAgIElOIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQoreworICAgIFN0YXRlTWFjaGluZUluaXQoU20sIFRyYW5zLCBNQVhfQVVUSF9SU1BfU1RBVEUsIE1BWF9BVVRIX1JTUF9NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpRHJvcCwgQVVUSF9SU1BfSURMRSwgQVVUSF9SU1BfTUFDSElORV9CQVNFKTsKKworICAgIC8vIGNvbHVtbiAxCisgICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1JTUF9JRExFLCBNVDJfUEVFUl9ERUFVVEgsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRlYXV0aEFjdGlvbik7CisKKyAgICAvLyBjb2x1bW4gMgorICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9SU1BfV0FJVF9DSEFMLCBNVDJfUEVFUl9ERUFVVEgsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRlYXV0aEFjdGlvbik7CisKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUGVlckF1dGhTaW1wbGVSc3BHZW5BbmRTZW5kKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFBIRUFERVJfODAyXzExIHBIZHI4MDIxMSwKKyAgICBJTiBVU0hPUlQgQWxnLAorICAgIElOIFVTSE9SVCBTZXEsCisgICAgSU4gVVNIT1JUIFJlYXNvbiwKKyAgICBJTiBVU0hPUlQgU3RhdHVzKQoreworICAgIEhFQURFUl84MDJfMTEgICAgIEF1dGhIZHI7CisgICAgVUxPTkcgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOworICAgIFBVQ0hBUiAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworICAgIE5ESVNfU1RBVFVTICAgICAgIE5TdGF0dXM7CisKKyAgICBpZiAoUmVhc29uICE9IE1MTUVfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXIgQVVUSCBmYWlsLi4uXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKwkvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisgICAgTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsKKyAgICBpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorICAgICAgICByZXR1cm47CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZW5kIEFVVEggcmVzcG9uc2UgKHNlcSMyKS4uLlxuIikpOworICAgIE1ndE1hY0hlYWRlckluaXQocEFkLCAmQXV0aEhkciwgU1VCVFlQRV9BVVRILCAwLCBwSGRyODAyMTEtPkFkZHIyLCBwQWQtPk1sbWVBdXguQnNzaWQpOworICAgIE1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgJkF1dGhIZHIsCisgICAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAmQWxnLAorICAgICAgICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgJlNlcSwKKyAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICZSZWFzb24sCisgICAgICAgICAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworICAgIE1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFBlZXJEZWF1dGhBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gUE1MTUVfUVVFVUVfRUxFTSBFbGVtKQoreworICAgIFVDSEFSICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07CisgICAgVVNIT1JUICAgICAgUmVhc29uOworCisgICAgaWYgKFBlZXJEZWF1dGhTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZSZWFzb24pKQorICAgIHsKKyAgICAgICAgaWYgKElORlJBX09OKHBBZCkgJiYgTUFDX0FERFJfRVFVQUwoQWRkcjIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBVVRIX1JTUCAtIHJlY2VpdmUgREUtQVVUSCBmcm9tIG91ciBBUCAoUmVhc29uPSVkKVxuIiwgUmVhc29uKSk7CisKKworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgICAgICAgICAgICAgIG1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKKyAgICAgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisgICAgICAgICAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCisJCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIGRlYXV0aGVudGljYXRpb24KKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19ERUFVVEhfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKworICAgICAgICAgICAgTGlua0Rvd24ocEFkLCBUUlVFKTsKKworICAgICAgICAgICAgLy8gQXV0aGVudGljYXRpb24gTW9kZSBDaXNjb19MRUFQIGhhcyBzdGFydCBhIHRpbWVyCisgICAgICAgICAgICAvLyBXZSBzaG91bGQgY2FuY2VsIGl0IGlmIHVzaW5nIExFQVAKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKyAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5MZWFwQXV0aE1vZGUgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuTGVhcEF1dGhUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKyAgICAgICAgICAgICAgICAvL0NoZWNrIGlzIGl0IG1hY2ggdGhlIExFQVAgQXV0aGVudGljYXRpb24gZmFpbGVkIGFzIHBvc3NpYmxlIGEgUm9ndWUgQVAKKyAgICAgICAgICAgICAgICAvL29uIGl0J3MgUG9ydFNlY3VyZWQgbm90IGVxdWFsIHRvIFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEIHdoaWxlIHByb2Nlc3MgdGhlIEF1dGhlbnRpY2F0b24uCisgICAgICAgICAgICAgICAgaWYgKChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCAhPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkgJiYgKHBBZC0+TWxtZS5MZWFwTWFjaGluZS5DdXJyU3RhdGUgIT0gTEVBUF9JRExFKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFJvZ3VlQXBUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+U3RhQ2ZnLlJvZ3VlQXBUYWIsIEFkZHIyLCBMRUFQX1JFQVNPTl9BVVRIX1RJTUVPVVQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFVVEhfUlNQIC0gUGVlckRlYXV0aEFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9jb25uZWN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9jb25uZWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZmMjhmOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2Nvbm5lY3QuYwpAQCAtMCwwICsxLDI3NTEgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJY29ubmVjdC5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSm9obgkJCTIwMDQtMDgtMDgJCQlNYWpvciBtb2RpZmljYXRpb24gZnJvbSBSVDI1NjAKKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKK1VDSEFSCUNpcGhlclN1aXRlV3BhTm9uZVRraXBbXSA9IHsKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwJLy8gb3VpCisJCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLy8gTXVsdGljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIE51bWJlciBvZiB1bmljYXN0CisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8vIHVuaWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAorCQkweDAwLCAweDUwLCAweGYyLCAweDAwCS8vIGF1dGhlbnRpY2F0aW9uCisJCX07CitVQ0hBUglDaXBoZXJTdWl0ZVdwYU5vbmVUa2lwTGVuID0gKHNpemVvZihDaXBoZXJTdWl0ZVdwYU5vbmVUa2lwKSAvIHNpemVvZihVQ0hBUikpOworCitVQ0hBUglDaXBoZXJTdWl0ZVdwYU5vbmVBZXNbXSA9IHsKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwJLy8gb3VpCisJCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwNCwJLy8gTXVsdGljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIE51bWJlciBvZiB1bmljYXN0CisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDQsCS8vIHVuaWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAorCQkweDAwLCAweDUwLCAweGYyLCAweDAwCS8vIGF1dGhlbnRpY2F0aW9uCisJCX07CitVQ0hBUglDaXBoZXJTdWl0ZVdwYU5vbmVBZXNMZW4gPSAoc2l6ZW9mKENpcGhlclN1aXRlV3BhTm9uZUFlcykgLyBzaXplb2YoVUNIQVIpKTsKKworLy8gVGhlIGZvbGxvd2luZyBNQUNSTyBpcyBjYWxsZWQgYWZ0ZXIgMS4gc3RhcnRpbmcgYW4gbmV3IElCU1MsIDIuIHN1Y2Nlc2Z1bGx5IEpPSU4gYW4gSUJTUywKKy8vIG9yIDMuIHN1Y2Nlc2Z1bGx5IEFTU09DSUFURSB0byBhIEJTUywgNC4gc3VjY2Vzc2Z1bGx5IFJFX0FTU09DSUFURSB0byBhIEJTUworLy8gQWxsIHNldHRpbmdzIHN1Y2Nlc3NmdWx5IG5lZ290aWF0ZWQgZnVyaW5nIE1MTUUgc3RhdGUgbWFjaGluZXMgYmVjb21lIGZpbmFsIHNldHRpbmdzCisvLyBhbmQgYXJlIGNvcGllZCB0byBwQWQtPlN0YUFjdGl2ZQorI2RlZmluZSBDT1BZX1NFVFRJTkdTX0ZST01fTUxNRV9BVVhfVE9fQUNUSVZFX0NGRyhfcEFkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKF9wQWQpLT5Db21tb25DZmcuU3NpZExlbiA9IChfcEFkKS0+TWxtZUF1eC5Tc2lkTGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCU5kaXNNb3ZlTWVtb3J5KChfcEFkKS0+Q29tbW9uQ2ZnLlNzaWQsIChfcEFkKS0+TWxtZUF1eC5Tc2lkLCAoX3BBZCktPk1sbWVBdXguU3NpZExlbik7IFwKKwlDT1BZX01BQ19BRERSKChfcEFkKS0+Q29tbW9uQ2ZnLkJzc2lkLCAoX3BBZCktPk1sbWVBdXguQnNzaWQpOyAgICAgICAgICAgICAgICAgICAgICBcCisJKF9wQWQpLT5Db21tb25DZmcuQ2hhbm5lbCA9IChfcEFkKS0+TWxtZUF1eC5DaGFubmVsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCShfcEFkKS0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gKF9wQWQpLT5NbG1lQXV4LkNlbnRyYWxDaGFubmVsOyAgICAgICAgICAgICAgICAgIFwKKwkoX3BBZCktPlN0YUFjdGl2ZS5BaWQgPSAoX3BBZCktPk1sbWVBdXguQWlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKF9wQWQpLT5TdGFBY3RpdmUuQXRpbVdpbiA9IChfcEFkKS0+TWxtZUF1eC5BdGltV2luOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCShfcEFkKS0+U3RhQWN0aXZlLkNhcGFiaWxpdHlJbmZvID0gKF9wQWQpLT5NbG1lQXV4LkNhcGFiaWxpdHlJbmZvOyAgICAgICAgICAgICAgICAgIFwKKwkoX3BBZCktPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPSAoX3BBZCktPk1sbWVBdXguQmVhY29uUGVyaW9kOyAgICAgICAgICAgICAgICAgICAgICBcCisJKF9wQWQpLT5TdGFBY3RpdmUuQ2ZwTWF4RHVyYXRpb24gPSAoX3BBZCktPk1sbWVBdXguQ2ZwTWF4RHVyYXRpb247ICAgICAgICAgICAgICAgICAgXAorCShfcEFkKS0+U3RhQWN0aXZlLkNmcFBlcmlvZCA9IChfcEFkKS0+TWxtZUF1eC5DZnBQZXJpb2Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoX3BBZCktPlN0YUFjdGl2ZS5TdXBSYXRlTGVuID0gKF9wQWQpLT5NbG1lQXV4LlN1cFJhdGVMZW47ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJTmRpc01vdmVNZW1vcnkoKF9wQWQpLT5TdGFBY3RpdmUuU3VwUmF0ZSwgKF9wQWQpLT5NbG1lQXV4LlN1cFJhdGUsIChfcEFkKS0+TWxtZUF1eC5TdXBSYXRlTGVuKTtcCisJKF9wQWQpLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiA9IChfcEFkKS0+TWxtZUF1eC5FeHRSYXRlTGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCU5kaXNNb3ZlTWVtb3J5KChfcEFkKS0+U3RhQWN0aXZlLkV4dFJhdGUsIChfcEFkKS0+TWxtZUF1eC5FeHRSYXRlLCAoX3BBZCktPk1sbWVBdXguRXh0UmF0ZUxlbik7XAorCU5kaXNNb3ZlTWVtb3J5KCYoX3BBZCktPkNvbW1vbkNmZy5BUEVkY2FQYXJtLCAmKF9wQWQpLT5NbG1lQXV4LkFQRWRjYVBhcm0sIHNpemVvZihFRENBX1BBUk0pKTtcCisJTmRpc01vdmVNZW1vcnkoJihfcEFkKS0+Q29tbW9uQ2ZnLkFQUW9zQ2FwYWJpbGl0eSwgJihfcEFkKS0+TWxtZUF1eC5BUFFvc0NhcGFiaWxpdHksIHNpemVvZihRT1NfQ0FQQUJJTElUWV9QQVJNKSk7XAorCU5kaXNNb3ZlTWVtb3J5KCYoX3BBZCktPkNvbW1vbkNmZy5BUFFic3NMb2FkLCAmKF9wQWQpLT5NbG1lQXV4LkFQUWJzc0xvYWQsIHNpemVvZihRQlNTX0xPQURfUEFSTSkpO1wKKwlDT1BZX01BQ19BRERSKChfcEFkKS0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgKF9wQWQpLT5NbG1lQXV4LkJzc2lkKTsgICAgICBcCisJKF9wQWQpLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BaWQgPSAoX3BBZCktPk1sbWVBdXguQWlkOyAgICAgICAgICAgICAgICAgICAgICAgXAorCShfcEFkKS0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gKF9wQWQpLT5TdGFDZmcuUGFpckNpcGhlcjtcCisJQ09QWV9NQUNfQUREUigoX3BBZCktPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LkJzc0lkLCAoX3BBZCktPk1sbWVBdXguQnNzaWQpO1wKKwkoX3BBZCktPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJhdGVMZW4gPSAoX3BBZCktPlN0YUFjdGl2ZS5TdXBSYXRlTGVuICsgKF9wQWQpLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbjtcCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgTWxtZUNudGxJbml0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFNUQVRFX01BQ0hJTkUgKlMsCisJT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQoreworCS8vIENvbnRyb2wgc3RhdGUgbWFjaGluZSBkaWZmZXJzIGZyb20gb3RoZXIgc3RhdGUgbWFjaGluZXMsIHRoZSBpbnRlcmZhY2UKKwkvLyBmb2xsb3dzIHRoZSBzdGFuZGFyZCBpbnRlcmZhY2UKKwlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBNbG1lQ250bE1hY2hpbmVQZXJmb3JtQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFNUQVRFX01BQ0hJTkUgKlMsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCXN3aXRjaChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlKQorCXsKKwkJY2FzZSBDTlRMX0lETEU6CisJCQl7CisJCQkJQ250bElkbGVQcm9jKHBBZCwgRWxlbSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBDTlRMX1dBSVRfRElTQVNTT0M6CisJCQlDbnRsV2FpdERpc2Fzc29jUHJvYyhwQWQsIEVsZW0pOworCQkJYnJlYWs7CisJCWNhc2UgQ05UTF9XQUlUX0pPSU46CisJCQlDbnRsV2FpdEpvaW5Qcm9jKHBBZCwgRWxlbSk7CisJCQlicmVhazsKKworCQkvLyBDTlRMX1dBSVRfUkVBU1NPQyBpcyB0aGUgb25seSBzdGF0ZSBpbiBDTlRMIG1hY2hpbmUgdGhhdCBkb2VzCisJCS8vIG5vdCB0cmlnZ2VyZWQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBieSAiUlRNUFNldEluZm9ybWF0aW9uKE9JRF94eHgpIi4KKwkJLy8gVGhlcmVmb3JlIG5vdCBwcm90ZWN0ZWQgYnkgTkRJUydzICJvbmx5IG9uZSBvdXRzdGFuZGluZyBPSUQgcmVxdWVzdCIKKwkJLy8gcnVsZS4gV2hpY2ggbWVhbnMgTkRJUyBtYXkgU0VUIE9JRCBpbiB0aGUgbWlkZGxlIG9mIFJPQU1pbmcgYXR0ZW1wdHMuCisJCS8vIEN1cnJlbnQgYXBwcm9hY2ggaXMgdG8gYmxvY2sgbmV3IFNFVCByZXF1ZXN0IGF0IFJUTVBTZXRJbmZvcm1hdGlvbigpCisJCS8vIHdoZW4gQ250bE1hY2hpbmUuQ3VyclN0YXRlIGlzIG5vdCBDTlRMX0lETEUKKwkJY2FzZSBDTlRMX1dBSVRfUkVBU1NPQzoKKwkJCUNudGxXYWl0UmVhc3NvY1Byb2MocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQ05UTF9XQUlUX1NUQVJUOgorCQkJQ250bFdhaXRTdGFydFByb2MocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCQljYXNlIENOVExfV0FJVF9BVVRIOgorCQkJQ250bFdhaXRBdXRoUHJvYyhwQWQsIEVsZW0pOworCQkJYnJlYWs7CisJCWNhc2UgQ05UTF9XQUlUX0FVVEgyOgorCQkJQ250bFdhaXRBdXRoUHJvYzIocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCQljYXNlIENOVExfV0FJVF9BU1NPQzoKKwkJCUNudGxXYWl0QXNzb2NQcm9jKHBBZCwgRWxlbSk7CisJCQlicmVhazsKKworCQljYXNlIENOVExfV0FJVF9PSURfTElTVF9TQ0FOOgorCQkJaWYoRWxlbS0+TXNnVHlwZSA9PSBNVDJfU0NBTl9DT05GKQorCQkJeworCQkJCS8vIFJlc3VtZSBUeFJpbmcgYWZ0ZXIgU0NBTklORyBjb21wbGV0ZS4gV2UgaG9wZSB0aGUgb3V0LW9mLXNlcnZpY2UgdGltZQorCQkJCS8vIHdvbid0IGJlIHRvbyBsb25nIHRvIGxldCB1cHBlciBsYXllciB0aW1lLW91dCB0aGUgd2FpdGluZyBmcmFtZXMKKwkJCQlSVE1QUmVzdW1lTXNkdVRyYW5zbWlzc2lvbihwQWQpOworCQkJCWlmIChwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlICE9IE1TUk5fVFlQRV9VTlVTRUQpCisJCQkJeworCQkJCQkvLyBDaXNjbyBzY2FuIHJlcXVlc3QgaXMgZmluaXNoZWQsIHByZXBhcmUgYmVhY29uIHJlcG9ydAorCQkJCQlNbG1lRW5xdWV1ZShwQWQsIEFJUk9ORVRfU1RBVEVfTUFDSElORSwgTVQyX0FJUk9ORVRfU0NBTl9ET05FLCAwLCBOVUxMKTsKKwkJCQl9CisJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKworICAgICAgICAgICAgICAgIC8vCisJCQkJLy8gU2V0IExFRCBzdGF0dXMgdG8gcHJldmlvdXMgc3RhdHVzLgorCQkJCS8vCisJCQkJaWYgKHBBZC0+YkxlZE9uU2Nhbm5pbmcpCisJCQkJeworCQkJCQlwQWQtPmJMZWRPblNjYW5uaW5nID0gRkFMU0U7CisJCQkJCVJUTVBTZXRMRUQocEFkLCBwQWQtPkxlZFN0YXR1cyk7CisJCQkJfQorI2lmZGVmIERPVDExTl9EUkFGVDMKKwkJCQkvLyBBUCBzZW50IGEgMjA0MENvZXhpc3RlbmNlIG1nbXQgZnJhbWUsIHRoZW4gc3RhdGlvbiBwZXJmb3JtIGEgc2NhbiwgYW5kIHRoZW4gc2VuZCBiYWNrIHRoZSByZXNwb25lLgorCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC5maWVsZC5JbmZvUmVxID09IDEpCisJCQkJeworCQkJCQlVcGRhdGUyMDQwQ29leGlzdEZyYW1lQW5kTm90aWZ5KHBBZCwgQlNTSURfV0NJRCwgVFJVRSk7CisJCQkJfQorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgQ05UTF9XQUlUX09JRF9ESVNBU1NPQzoKKwkJCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9ESVNBU1NPQ19DT05GKQorCQkJeworCQkJCUxpbmtEb3duKHBBZCwgRkFMU0UpOworCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UX0VSUigoIiFFUlJPUiEgQ05UTCAtIElsbGVnYWwgbWVzc2FnZSB0eXBlKD0lbGQpIiwgRWxlbS0+TXNnVHlwZSkpOworCQkJYnJlYWs7CisJfQorfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIENudGxJZGxlUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUICAgRGlzYXNzb2NSZXE7CisKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpCisJCXJldHVybjsKKworCXN3aXRjaChFbGVtLT5Nc2dUeXBlKQorCXsKKwkJY2FzZSBPSURfODAyXzExX1NTSUQ6CisJCQlDbnRsT2lkU3NpZFByb2MocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9CU1NJRDoKKwkJCUNudGxPaWRSVEJzc2lkUHJvYyhwQWQsRWxlbSk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOOgorCQkJQ250bE9pZFNjYW5Qcm9jKHBBZCxFbGVtKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9ESVNBU1NPQ0lBVEU6CisjaWZkZWYgUkFMSU5LX0FURQorCQkJaWYoQVRFX09OKHBBZCkpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVGhlIGRyaXZlciBpcyBpbiBBVEUgbW9kZSBub3dcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJCQlEaXNhc3NvY1Bhcm1GaWxsKHBBZCwgJkRpc2Fzc29jUmVxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgUkVBU09OX0RJU0FTU09DX1NUQV9MRUFWSU5HKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRElTQVNTT0NfUkVRLCBzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSwgJkRpc2Fzc29jUmVxKTsKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0RJU0FTU09DOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFX1dJVEhfV0VCX1VJKQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgIHsKKyAgICAJCQkvLyBTZXQgdGhlIEF1dG9SZWNvbm5lY3RTc2lkIHRvIHByZXZlbnQgaXQgcmVjb25uZWN0IHRvIG9sZCBTU0lECisgICAgCQkJLy8gU2luY2UgY2FsbGluZyB0aGlzIGluZGljYXRlIHVzZXIgZG9uJ3Qgd2FudCB0byBjb25uZWN0IHRvIHRoYXQgU1NJRCBhbnltb3JlLgorICAgIAkJCXBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7CisgICAgCQkJTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pOworICAgICAgICAgICAgfQorCQkJYnJlYWs7CisKKwkJY2FzZSBNVDJfTUxNRV9ST0FNSU5HX1JFUToKKwkJCUNudGxNbG1lUm9hbWluZ1Byb2MocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9NSUNfRkFJTFVSRV9SRVBPUlRfRlJBTUU6CisgICAgICAgICAgICBXcGFNaWNGYWlsdXJlUmVwb3J0RnJhbWUocEFkLCBFbGVtKTsKKyAgICAgICAgICAgIGJyZWFrOworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfRExTX1BBUkFNOgorCQkJQ250bE9pZERMU1NldHVwUHJvYyhwQWQsIEVsZW0pOworCQkJYnJlYWs7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBJbGxlZ2FsIG1lc3NhZ2UgaW4gQ250bElkbGVQcm9jKE1zZ1R5cGU9JWxkKVxuIixFbGVtLT5Nc2dUeXBlKSk7CisJCQlicmVhazsKKwl9Cit9CisKK1ZPSUQgQ250bE9pZFNjYW5Qcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlNTE1FX1NDQU5fUkVRX1NUUlVDVCAgICAgICBTY2FuUmVxOworCVVMT05HICAgICAgICAgICAgICAgICAgICAgIEJzc0lkeCA9IEJTU19OT1RfRk9VTkQ7CisJQlNTX0VOVFJZICAgICAgICAgICAgICAgICAgQ3VyckJzczsKKworI2lmZGVmIFJBTElOS19BVEUKKy8qIERpc2FibGUgc2Nhbm5pbmcgd2hlbiBBVEUgaXMgcnVubmluZy4gKi8KKwlpZiAoQVRFX09OKHBBZCkpCisJCXJldHVybjsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKworCS8vIHJlY29yZCBjdXJyZW50IEJTUyBpZiBuZXR3b3JrIGlzIGNvbm5lY3RlZC4KKwkvLyAyMDAzLTItMTMgZG8gbm90IGluY2x1ZGUgY3VycmVudCBJQlNTIGlmIHRoaXMgaXMgdGhlIG9ubHkgU1RBIGluIHRoaXMgSUJTUy4KKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQorCXsKKwkJQnNzSWR4ID0gQnNzU3NpZFRhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJaWYgKEJzc0lkeCAhPSBCU1NfTk9UX0ZPVU5EKQorCQl7CisJCQlOZGlzTW92ZU1lbW9yeSgmQ3VyckJzcywgJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJCX0KKwl9CisKKwkvLyBjbGVhbiB1cCBwcmV2aW91cyBTQ0FOIHJlc3VsdCwgYWRkIGN1cnJlbnQgQlNTIGJhY2sgdG8gdGFibGUgaWYgYW55CisJQnNzVGFibGVJbml0KCZwQWQtPlNjYW5UYWIpOworCWlmIChCc3NJZHggIT0gQlNTX05PVF9GT1VORCkKKwl7CisJCS8vIERESyBOb3RlOiBJZiB0aGUgTklDIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgQlNTSUQgYW5kIFNTSUQKKwkJLy8gICAgdGhhdCBhcmUgbm90IGNvbnRhaW5lZCBpbiB0aGUgbGlzdCBvZiBCU1NJRHMgZ2VuZXJhdGVkIGJ5IHRoaXMgc2NhbiwgdGhlCisJCS8vICAgIEJTU0lEIGRlc2NyaXB0aW9uIG9mIHRoZSBjdXJyZW50bHkgYXNzb2NpYXRlZCBCU1NJRCBhbmQgU1NJRCBzaG91bGQgYmUKKwkJLy8gICAgYXBwZW5kZWQgdG8gdGhlIGxpc3Qgb2YgQlNTSURzIGluIHRoZSBOSUMncyBkYXRhYmFzZS4KKwkJLy8gVG8gZW5zdXJlIHRoaXMsIHdlIGFwcGVuZCB0aGlzIEJTUyBhcyB0aGUgZmlyc3QgZW50cnkgaW4gU0NBTiByZXN1bHQKKwkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVswXSwgJkN1cnJCc3MsIHNpemVvZihCU1NfRU5UUlkpKTsKKwkJcEFkLT5TY2FuVGFiLkJzc05yID0gMTsKKwl9CisKKwlTY2FuUGFybUZpbGwocEFkLCAmU2NhblJlcSwgIiIsIDAsIEJTU19BTlksIFNDQU5fQUNUSVZFKTsKKwlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsCisJCXNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKKwlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJQmVmb3JlIGNhbGxpbmcgdGhpcyByb3V0aW5lLCB1c2VyIGRlc2lyZWQgU1NJRCBzaG91bGQgYWxyZWFkeSBiZWVuCisJCXJlY29yZGVkIGluIENvbW1vbkNmZy5Tc2lkW10KKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBDbnRsT2lkU3NpZFByb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICogRWxlbSkKK3sKKwlQTkRJU184MDJfMTFfU1NJRCAgICAgICAgICBwT2lkU3NpZCA9IChORElTXzgwMl8xMV9TU0lEICopRWxlbS0+TXNnOworCU1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCAgIERpc2Fzc29jUmVxOworCVVMT05HCQkJCQkgICBOb3c7CisKKwkvLyBTdGVwIDEuIHJlY29yZCB0aGUgZGVzaXJlZCB1c2VyIHNldHRpbmdzIHRvIE1sbWVBdXgKKwlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgcE9pZFNzaWQtPlNzaWQsIHBPaWRTc2lkLT5Tc2lkTGVuZ3RoKTsKKwlwQWQtPk1sbWVBdXguU3NpZExlbiA9IChVQ0hBUilwT2lkU3NpZC0+U3NpZExlbmd0aDsKKwlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguQnNzaWQsIE1BQ19BRERSX0xFTik7CisJcEFkLT5NbG1lQXV4LkJzc1R5cGUgPSBwQWQtPlN0YUNmZy5Cc3NUeXBlOworCisKKwkvLworCS8vIFVwZGF0ZSBSZWNvbm5lY3QgU3NpZCwgdGhhdCB1c2VyIGRlc2lyZWQgdG8gY29ubmVjdC4KKwkvLworCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbik7CisJcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuID0gcEFkLT5NbG1lQXV4LlNzaWRMZW47CisKKwkvLyBzdGVwIDIuIGZpbmQgYWxsIG1hdGNoaW5nIEJTUyBpbiB0aGUgbGFzdGVzdCBTQ0FOIHJlc3VsdCAoaW5Cc3NUYWIpCisJLy8gICAgJiBsb2cgdGhlbSBpbnRvIE1sbWVBdXguU3NpZEJzc1RhYiBmb3IgbGF0ZXItb24gaXRlcmF0aW9uLiBTb3J0IGJ5IFJTU0kgb3JkZXIKKwlCc3NUYWJsZVNzaWRTb3J0KHBBZCwgJnBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtICVkIEJTUyBvZiAlZCBCU1MgbWF0Y2ggdGhlIGRlc2lyZSAoJWQpU1NJRCAtICVzXG4iLAorCQkJcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIsIHBBZC0+U2NhblRhYi5Cc3NOciwgcEFkLT5NbG1lQXV4LlNzaWRMZW4sIHBBZC0+TWxtZUF1eC5Tc2lkKSk7CisJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKKworCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkgJiYKKwkJKHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4gPT0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbMF0uU3NpZExlbikgJiYKKwkJTmRpc0VxdWFsTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5WzBdLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pICYmCisJCU1BQ19BRERSX0VRVUFMKHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVswXS5Cc3NpZCkpCisJeworCQkvLyBDYXNlIDEuIGFscmVhZHkgY29ubmVjdGVkIHdpdGggYW4gQVAgd2hvIGhhcyB0aGUgZGVzaXJlZCBTU0lECisJCS8vICAgICAgICAgd2l0aCBoaWdoZXN0IFJTU0kKKworCQkvLyBBZGQgY2hlY2tpbmcgTW9kZSAiTEVBUCIgZm9yIENDWCAxLjAKKwkJaWYgKCgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAorCQkJIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8CisJCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8CisJCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQkgfHwgKHBBZC0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSA9PSBDSVNDT19BdXRoTW9kZUxFQVApCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCQkgKSAmJgorCQkJKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkpCisJCXsKKwkJCS8vIGNhc2UgMS4xIEZvciBXUEEsIFdQQS1QU0ssIGlmIHRoZSAxeCBwb3J0IGlzIG5vdCBzZWN1cmVkLCB3ZSBoYXZlIHRvIHJlZG8KKwkJCS8vICAgICAgICAgIGNvbm5lY3Rpb24gcHJvY2VzcworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIGRpc2Fzc29jaWF0ZSB3aXRoIGN1cnJlbnQgQVAuLi5cbiIpKTsKKwkJCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkcpOworCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsCisJCQkJCQlzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSwgJkRpc2Fzc29jUmVxKTsKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfRElTQVNTT0M7CisJCX0KKwkJZWxzZSBpZiAocEFkLT5iQ29uZmlnQ2hhbmdlZCA9PSBUUlVFKQorCQl7CisJCQkvLyBjYXNlIDEuMiBJbXBvcnRhbnQgQ29uZmlnIGhhcyBjaGFuZ2VkLCB3ZSBoYXZlIHRvIHJlY29ubmVjdCB0byB0aGUgc2FtZSBBUAorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIGRpc2Fzc29jaWF0ZSB3aXRoIGN1cnJlbnQgQVAgQmVjYXVzZSBjb25maWcgY2hhbmdlZC4uLlxuIikpOworCQkJRGlzYXNzb2NQYXJtRmlsbChwQWQsICZEaXNhc3NvY1JlcSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORyk7CisJCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwKKwkJCQkJCXNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpLCAmRGlzYXNzb2NSZXEpOworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9ESVNBU1NPQzsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIGNhc2UgMS4zLiBhbHJlYWR5IGNvbm5lY3RlZCB0byB0aGUgU1NJRCB3aXRoIGhpZ2hlc3QgUlNTSS4KKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNudGxPaWRTc2lkUHJvYygpOkNOVEwgLSBhbHJlYWR5IHdpdGggdGhpcyBCU1NJRC4gaWdub3JlIHRoaXMgU0VUX1NTSUQgcmVxdWVzdFxuIikpOworCQkJLy8KKwkJCS8vIChIQ1QgMTIuMSkgMWNfd2xhbl9tZWRpYWV2ZW50cyByZXF1aXJlZAorCQkJLy8gbWVkaWEgY29ubmVjdCBldmVudHMgYXJlIGluZGljYXRlZCB3aGVuIGFzc29jaWF0aW5nIHdpdGggdGhlIHNhbWUgQVAKKwkJCS8vCisJCQlpZiAoSU5GUkFfT04ocEFkKSkKKwkJCXsKKwkJCQkvLworCQkJCS8vIFNpbmNlIE1lZGlhU3RhdGUgYWxyZWFkeSBpcyBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZAorCQkJCS8vIFdlIGp1c3QgaW5kaWNhdGUgdGhlIGNvbm5lY3QgZXZlbnQgYWdhaW4gdG8gbWVldCB0aGUgV0hRTCByZXF1aXJlZC4KKwkJCQkvLworCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisJCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKKyAgICAgICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19VUDsgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24gdG8gbGluayBpcyB1cAorCQkJfQorCisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworCisgICAgICAgICAgICAgICAgbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBNQUNfQUREUl9MRU4pOworICAgICAgICAgICAgICAgIG1lbWNweSh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBNQUNfQUREUl9MRU4pOworICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKKworICAgICAgICAgICAgfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJCX0KKwl9CisJZWxzZSBpZiAoSU5GUkFfT04ocEFkKSkKKwl7CisJCS8vCisJCS8vIEZvciBSVDYxCisJCS8vIFs4ODg4OF0gT0lEXzgwMl8xMV9TU0lEIHNob3VsZCBoYXZlIHJldHVybmVkIE5EVEVTVF9XRVBfQVAyKFJldHVybmVkOiApCisJCS8vIFJUNjEgbWF5IGxvc3QgU1NJRCwgYW5kIG5vdCBjb25uZWN0IHRvIE5EVEVTVF9XRVBfQVAyIGFuZCB3aWxsIGNvbm5lY3QgdG8gTkRURVNUX1dFUF9BUDIgYnkgQXV0b3JlY29ubmVjdAorCQkvLyBCdXQgbWVkaWEgc3RhdHVzIGlzIGNvbm5lY3RlZCwgc28gdGhlIFNTSUQgbm90IHJlcG9ydCBjb3JyZWN0bHkuCisJCS8vCisJCWlmICghU1NJRF9FUVVBTChwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pKQorCQl7CisJCQkvLworCQkJLy8gRGlmZmVyZW50IFNTSUQgbWVhbnMgbm90IFJvYW1pbmcgY2FzZSwgc28gd2UgbGV0IExpbmtEb3duKCkgdG8gSW5kaWNhdGUgYSBkaXNjb25uZWN0IGV2ZW50LgorCQkJLy8KKwkJCXBBZC0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IFRSVUU7CisJCX0KKwkJLy8gY2FzZSAyLiBhY3RpdmUgSU5GUkEgYXNzb2NpYXRpb24gZXhpc3RlbnQKKwkJLy8gICAgcm9hbWluZyBpcyBkb25lIHdpdGhpbiBtaW5pcG9ydCBkcml2ZXIsIG5vdGhpbmcgdG8gZG8gd2l0aCBjb25maWd1cmF0aW9uCisJCS8vICAgIHV0aWxpdHkuIHNvIHVwb24gYSBuZXcgU0VUKE9JRF84MDJfMTFfU1NJRCkgaXMgcmVjZWl2ZWQsIHdlIGp1c3QKKwkJLy8gICAgZGlzYXNzb2NpYXRlIHdpdGggdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUCwKKwkJLy8gICAgdGhlbiBwZXJmb3JtIGEgbmV3IGFzc29jaWF0aW9uIHdpdGggdGhpcyBuZXcgU1NJRCwgbm8gbWF0dGVyIHRoZQorCQkvLyAgICBuZXcvb2xkIFNTSUQgYXJlIHRoZSBzYW1lIG9yIG5vdC4KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIGRpc2Fzc29jaWF0ZSB3aXRoIGN1cnJlbnQgQVAuLi5cbiIpKTsKKwkJRGlzYXNzb2NQYXJtRmlsbChwQWQsICZEaXNhc3NvY1JlcSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORyk7CisJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRElTQVNTT0NfUkVRLAorCQkJCQlzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSwgJkRpc2Fzc29jUmVxKTsKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9ESVNBU1NPQzsKKwl9CisJZWxzZQorCXsKKwkJaWYgKEFESE9DX09OKHBBZCkpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNudGxPaWRTc2lkUHJvYygpOkNOVEwgLSBkcm9wIGN1cnJlbnQgQURIT0NcbiIpKTsKKwkJCUxpbmtEb3duKHBBZCwgRkFMU0UpOworCQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKwkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7CisJCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOworICAgICAgICAgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNudGxPaWRTc2lkUHJvYygpOk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQyFcbiIpKTsKKwkJfQorCisJCWlmICgocEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIgPT0gMCkgJiYKKwkJCShwQWQtPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9PSBUUlVFKSAmJgorCQkJKHBBZC0+TWxtZUF1eC5Cc3NUeXBlID09IEJTU19JTkZSQSkgJiYKKwkJCShNbG1lVmFsaWRhdGVTU0lEKHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbikgPT0gVFJVRSkKKwkJCSkKKwkJeworCQkJTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgICAgICAgU2NhblJlcTsKKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIE5vIG1hdGNoaW5nIEJTUywgc3RhcnQgYSBuZXcgc2NhblxuIikpOworCQkJU2NhblBhcm1GaWxsKHBBZCwgJlNjYW5SZXEsIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbiwgQlNTX0FOWSwgU0NBTl9BQ1RJVkUpOworCQkJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NDQU5fUkVRLCBzaXplb2YoTUxNRV9TQ0FOX1JFUV9TVFJVQ1QpLCAmU2NhblJlcSk7CisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47CisJCQkvLyBSZXNldCBNaXNzZWQgc2NhbiBudW1iZXIKKwkJCXBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSA9IE5vdzsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBBZC0+TWxtZUF1eC5Cc3NJZHggPSAwOworCQkJSXRlcmF0ZU9uQnNzVGFiKHBBZCk7CisJCX0KKwl9Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQ250bE9pZFJUQnNzaWRQcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqIEVsZW0pCit7CisJVUxPTkcgICAgICAgQnNzSWR4OworCVBVQ0hBUiAgICAgIHBPaWRCc3NpZCA9IChQVUNIQVIpRWxlbS0+TXNnOworCU1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCAgICBEaXNhc3NvY1JlcTsKKwlNTE1FX0pPSU5fUkVRX1NUUlVDVCAgICAgICAgSm9pblJlcTsKKworI2lmZGVmIFJBTElOS19BVEUKKy8qIE5vIG5lZWQgdG8gcGVyZm9ybSB0aGlzIHJvdXRpbmUgd2hlbiBBVEUgaXMgcnVubmluZy4gKi8KKwlpZiAoQVRFX09OKHBBZCkpCisJCXJldHVybjsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKwkvLyByZWNvcmQgdXNlciBkZXNpcmVkIHNldHRpbmdzCisJQ09QWV9NQUNfQUREUihwQWQtPk1sbWVBdXguQnNzaWQsIHBPaWRCc3NpZCk7CisJcEFkLT5NbG1lQXV4LkJzc1R5cGUgPSBwQWQtPlN0YUNmZy5Cc3NUeXBlOworCisJLy8KKwkvLyBVcGRhdGUgUmVjb25uZWN0IFNzaWQsIHRoYXQgdXNlciBkZXNpcmVkIHRvIGNvbm5lY3QuCisJLy8KKwlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7CisJcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuID0gcEFkLT5NbG1lQXV4LlNzaWRMZW47CisJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOworCisJLy8gZmluZCB0aGUgZGVzaXJlZCBCU1MgaW4gdGhlIGxhdGVzdCBTQ0FOIHJlc3VsdCB0YWJsZQorCUJzc0lkeCA9IEJzc1RhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIHBPaWRCc3NpZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpOworCWlmIChCc3NJZHggPT0gQlNTX05PVF9GT1VORCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBCU1NJRCBub3QgZm91bmQuIHJlcGx5IE5ESVNfU1RBVFVTX05PVF9BQ0NFUFRFRFxuIikpOworCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworCQlyZXR1cm47CisJfQorCisJLy8gY29weSB0aGUgbWF0Y2hlZCBCU1MgZW50cnkgZnJvbSBTY2FuVGFiIHRvIE1sbWVBdXguU3NpZEJzc1RhYi4gV2h5PworCS8vIEJlY2F1c2Ugd2UgbmVlZCB0aGlzIGVudHJ5IHRvIGJlY29tZSB0aGUgSk9JTiB0YXJnZXQgaW4gbGF0ZXIgb24gU1lOQyBzdGF0ZSBtYWNoaW5lCisJcEFkLT5NbG1lQXV4LkJzc0lkeCA9IDA7CisJcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIgPSAxOworCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVswXSwgJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLCBzaXplb2YoQlNTX0VOVFJZKSk7CisKKwkvLyAyMDAyLTExLTI2IHNraXAgdGhlIGZvbGxvd2luZyBjaGVja2luZy4gaS5lLiBpZiB1c2VyIHdhbnRzIHRvIHJlLWNvbm5lY3QgdG8gc2FtZSBBUAorCS8vICAgd2UganVzdCBmb2xsb3cgbm9ybWFsIHByb2NlZHVyZS4gVGhlIHJlYXNvbiBvZiB1c2VyIGRvaW5nIHRoaXMgbWF5IGJlY2F1c2UgaGUvc2hlIGNoYW5nZWQKKwkvLyAgIEFQIHRvIGFub3RoZXIgY2hhbm5lbCwgYnV0IHdlIHN0aWxsIHJlY2VpdmVkIEJFQUNPTiBmcm9tIGl0IHRodXMgZG9uJ3QgY2xhaW0gTGluayBEb3duLgorCS8vICAgU2luY2UgdXNlciBrbm93cyBoZSdzIGNoYW5nZWQgQVAgY2hhbm5lbCwgaGUnbGwgcmUtY29ubmVjdCBhZ2Fpbi4gQnkgc2tpcHBpbmcgdGhlIGZvbGxvd2luZworCS8vICAgY2hlY2tpbmcsIHdlJ2xsIGRpc2Fzc29jaWF0ZSB0aGVuIHJlLWRvIG5vcm1hbCBhc3NvY2lhdGlvbiB3aXRoIHRoaXMgQVAgYXQgdGhlIG5ldyBjaGFubmVsLgorCS8vIDIwMDMtMS02IFJlLWVuYWJsZSB0aGlzIGZlYXR1cmUgYmFzZWQgb24gbWljcm9zb2Z0IHJlcXVpcmVtZW50IHdoaWNoIHByZWZlciBub3QgdG8gcmUtZG8KKwkvLyAgIGNvbm5lY3Rpb24gd2hlbiBzZXR0aW5nIHRoZSBzYW1lIEJTU0lELgorCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkgJiYKKwkJTUFDX0FERFJfRVFVQUwocEFkLT5Db21tb25DZmcuQnNzaWQsIHBPaWRCc3NpZCkpCisJeworCQkvLyBhbHJlYWR5IGNvbm5lY3RlZCB0byB0aGUgc2FtZSBCU1NJRCwgZ28gYmFjayB0byBpZGxlIHN0YXRlIGRpcmVjdGx5CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBhbHJlYWR5IGluIHRoaXMgQlNTSUQuIGlnbm9yZSB0aGlzIFNFVF9CU1NJRCByZXF1ZXN0XG4iKSk7CisJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisKKyAgICAgICAgICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7CisgICAgICAgICAgICAgICAgbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBwQWQtPk1sbWVBdXguQnNzaWQsIE1BQ19BRERSX0xFTik7CisgICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOworCisgICAgICAgICAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwl9CisJZWxzZQorCXsKKwkJaWYgKElORlJBX09OKHBBZCkpCisJCXsKKwkJCS8vIGRpc2Fzc29jIGZyb20gY3VycmVudCBBUCBmaXJzdAorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIGRpc2Fzc29jaWF0ZSB3aXRoIGN1cnJlbnQgQVAgLi4uXG4iKSk7CisJCQlEaXNhc3NvY1Bhcm1GaWxsKHBBZCwgJkRpc2Fzc29jUmVxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgUkVBU09OX0RJU0FTU09DX1NUQV9MRUFWSU5HKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRElTQVNTT0NfUkVRLAorCQkJCQkJc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCksICZEaXNhc3NvY1JlcSk7CisKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfRElTQVNTT0M7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoQURIT0NfT04ocEFkKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gZHJvcCBjdXJyZW50IEFESE9DXG4iKSk7CisJCQkJTGlua0Rvd24ocEFkLCBGQUxTRSk7CisJCQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKwkJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOworCQkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CisgICAgICAgICAgICAgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJORElTX1NUQVRVU19NRURJQV9ESVNDT05ORUNUIEV2ZW50IEMhXG4iKSk7CisJCQl9CisKKwkJCS8vIENoYW5nZSB0aGUgd2Vwc3RhdHVzIHRvIG9yaWdpbmFsIHdlcHN0YXR1cworCQkJcEFkLT5TdGFDZmcuV2VwU3RhdHVzICAgPSBwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzOworCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciAgPSBwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzOworCQkJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzOworCisJCQkvLyBDaGVjayBjaXBoZXIgc3VpdGUsIEFQIG11c3QgaGF2ZSBtb3JlIHNlY3VyZWQgY2lwaGVyIHRoYW4gc3RhdGlvbiBzZXR0aW5nCisJCQkvLyBTZXQgdGhlIFBhaXJ3aXNlIGFuZCBHcm91cCBjaXBoZXIgdG8gbWF0Y2ggdGhlIGludGVuZGVkIEFQIHNldHRpbmcKKwkJCS8vIFdlIGNhbiBvbmx5IGNvbm5lY3QgdG8gQVAgd2l0aCBsZXNzIHNlY3VyZWQgY2lwaGVyIHNldHRpbmcKKwkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkKKwkJCXsKKwkJCQlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5Hcm91cENpcGhlcjsKKworCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLlBhaXJDaXBoZXIpCisJCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlcjsKKwkJCQllbHNlIGlmIChwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlckF1eCAhPSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCisJCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlckF1eDsKKwkJCQllbHNlCS8vIFRoZXJlIGlzIG5vIFBhaXJDaXBoZXIgQXV4LCBkb3duZ3JhZGUgb3VyIGNhcGFiaWxpdHkgdG8gVEtJUAorCQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKwkJCX0KKwkJCWVsc2UgaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCisJCQl7CisJCQkJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLkdyb3VwQ2lwaGVyOworCisJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlBhaXJDaXBoZXIpCisJCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlBhaXJDaXBoZXI7CisJCQkJZWxzZSBpZiAocEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5QYWlyQ2lwaGVyQXV4ICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKKwkJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlckF1eDsKKwkJCQllbHNlCS8vIFRoZXJlIGlzIG5vIFBhaXJDaXBoZXIgQXV4LCBkb3duZ3JhZGUgb3VyIGNhcGFiaWxpdHkgdG8gVEtJUAorCQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKworCQkJCS8vIFJTTiBjYXBhYmlsaXR5CisJCQkJcEFkLT5TdGFDZmcuUnNuQ2FwYWJpbGl0eSA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUnNuQ2FwYWJpbGl0eTsKKwkJCX0KKworCQkJLy8gU2V0IE1peCBjaXBoZXIgZmxhZworCQkJcEFkLT5TdGFDZmcuYk1peENpcGhlciA9IChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyKSA/IEZBTFNFIDogVFJVRTsKKwkJCWlmIChwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyID09IFRSVUUpCisJCQl7CisJCQkJLy8gSWYgbWl4IGNpcGhlciwgcmUtYnVpbGQgUlNOSUUKKwkJCQlSVE1QTWFrZVJTTklFKHBBZCwgcEFkLT5TdGFDZmcuQXV0aE1vZGUsIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cywgMCk7CisJCQl9CisJCQkvLyBObyBhY3RpdmUgYXNzb2NpYXRpb24sIGpvaW4gdGhlIEJTUyBpbW1lZGlhdGVseQorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIGpvaW5pbmcgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggLi4uXG4iLAorCQkJCXBPaWRCc3NpZFswXSxwT2lkQnNzaWRbMV0scE9pZEJzc2lkWzJdLHBPaWRCc3NpZFszXSxwT2lkQnNzaWRbNF0scE9pZEJzc2lkWzVdKSk7CisKKwkJCUpvaW5QYXJtRmlsbChwQWQsICZKb2luUmVxLCBwQWQtPk1sbWVBdXguQnNzSWR4KTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9KT0lOX1JFUSwgc2l6ZW9mKE1MTUVfSk9JTl9SRVFfU1RSVUNUKSwgJkpvaW5SZXEpOworCisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0pPSU47CisJCX0KKwl9Cit9CisKKy8vIFJvYW1pbmcgaXMgdGhlIG9ubHkgZXh0ZXJuYWwgcmVxdWVzdCB0cmlnZ2VyaW5nIENOVEwgc3RhdGUgbWFjaGluZQorLy8gZGVzcGl0ZSBvZiBvdGhlciAiU0VUIE9JRCIgb3BlcmF0aW9uLiBBbGwgIlNFVCBPSUQiIHJlbGF0ZWQgb2VyYXRpb25zCisvLyBoYXBwZW4gaW4gc2VxdWVuY2UsIGJlY2F1c2Ugbm8gb3RoZXIgU0VUIE9JRCB3aWxsIGJlIHNlbnQgdG8gdGhpcyBkZXZpY2UKKy8vIHVudGlsIHRoZSB0aGUgcHJldmlvdXMgU0VUIG9wZXJhdGlvbiBpcyBjb21wbGV0ZSAoc3VjY2Vzc2Z1bCBvIGZhaWxlZCkuCisvLyBTbywgaG93IGRvIHdlIHF1YXJhbnRlZSB0aGlzIFJPQU1JTkcgcmVxdWVzdCB3b24ndCBjb3JydXB0IG90aGVyICJTRVQgT0lEIj8KKy8vIG9yIGJlZW4gY29ycnVwdGVkIGJ5IG90aGVyICJTRVQgT0lEIj8KKy8vCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQgQ250bE1sbWVSb2FtaW5nUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJLy8gVE9ETzoKKwkvLyBBUCBpbiBkaWZmZXJlbnQgY2hhbm5lbCBtYXkgc2hvdyBsb3dlciBSU1NJIHRoYW4gYWN0dWFsIHZhbHVlPz8KKwkvLyBzaG91bGQgd2UgYWRkIGEgd2VpZ2h0aW5nIGZhY3RvciB0byBjb21wZW5zYXRlIGl0PworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQ05UTCAtIFJvYW1pbmcgaW4gTWxtZUF1eC5Sb2FtVGFiLi4uXG4iKSk7CisKKwlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIsICZwQWQtPk1sbWVBdXguUm9hbVRhYiwgc2l6ZW9mKHBBZC0+TWxtZUF1eC5Sb2FtVGFiKSk7CisJcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIgPSBwQWQtPk1sbWVBdXguUm9hbVRhYi5Cc3NOcjsKKworCUJzc1RhYmxlU29ydEJ5UnNzaSgmcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIpOworCXBBZC0+TWxtZUF1eC5Cc3NJZHggPSAwOworCUl0ZXJhdGVPbkJzc1RhYihwQWQpOworfQorCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBDbnRsT2lkRExTU2V0dXBQcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlQUlRfODAyXzExX0RMUwkJcERMUyA9IChQUlRfODAyXzExX0RMUylFbGVtLT5Nc2c7CisJTUxNRV9ETFNfUkVRX1NUUlVDVAlNbG1lRGxzUmVxOworCUlOVAkJCQkJaTsKKwlVU0hPUlQJCQkJcmVhc29uID0gUkVBU09OX1VOU1BFQ0lGWTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQ05UTCAtIChPSUQgc2V0ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IHdpdGggVmFsaWQ9JWQsIFN0YXR1cz0lZCwgVGltZU91dD0lZCwgQ291bnREb3duVGltZXI9JWQpXG4iLAorCQlwRExTLT5NYWNBZGRyWzBdLCBwRExTLT5NYWNBZGRyWzFdLCBwRExTLT5NYWNBZGRyWzJdLCBwRExTLT5NYWNBZGRyWzNdLCBwRExTLT5NYWNBZGRyWzRdLCBwRExTLT5NYWNBZGRyWzVdLAorCQlwRExTLT5WYWxpZCwgcERMUy0+U3RhdHVzLCBwRExTLT5UaW1lT3V0LCBwRExTLT5Db3VudERvd25UaW1lcikpOworCisJaWYgKCFwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwkJcmV0dXJuOworCisJLy8gRExTIHdpbGwgbm90IGJlIHN1cHBvcnRlZCB3aGVuIEFkaG9jIG1vZGUKKwlpZiAoSU5GUkFfT04ocEFkKSkKKwl7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCQl7CisJCQlpZiAocERMUy0+VmFsaWQgJiYgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSAmJgorCQkJCShwRExTLT5UaW1lT3V0ID09IHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQpICYmIE1BQ19BRERSX0VRVUFMKHBETFMtPk1hY0FkZHIsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQkJeworCQkJCS8vIDEuIFNhbWUgc2V0dGluZywganVzdCBkcm9wIGl0CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJDTlRMIC0gc2V0dGluZyB1bmNoYW5nZWRcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UgaWYgKCFwRExTLT5WYWxpZCAmJiBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpICYmCisJCQkJTUFDX0FERFJfRVFVQUwocERMUy0+TWFjQWRkciwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCQl7CisJCQkJLy8gMi4gRGlzYWJsZSBETFMgbGluayBjYXNlLCBqdXN0IHRlYXIgZG93biBETFMgbGluaworCQkJCXJlYXNvbiA9IFJFQVNPTl9RT1NfVU5XQU5URURfTUVDSEFOSVNNOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCByZWFzb24pOworCQkJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19URUFSX0RPV04sIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQ05UTCAtIHN0YXJ0IHRlYXIgZG93biBwcm9jZWR1cmVcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UgaWYgKChpIDwgTUFYX05VTV9PRl9ETFNfRU5UUlkpICYmIHBETFMtPlZhbGlkICYmICFwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCkKKwkJCXsKKwkJCQkvLyAzLiBFbmFibGUgY2FzZSwgc3RhcnQgRExTIHNldHVwIHByb2NlZHVyZQorCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcERMUywgc2l6ZW9mKFJUXzgwMl8xMV9ETFNfVUkpKTsKKworCQkJCS8vVXBkYXRlIGNvdW50ZG93biB0aW1lcgorCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLkNvdW50RG93blRpbWVyID0gcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dDsKKwkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7CisJCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1JFUSwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJDTlRMIC0gRExTIHNldHVwIGNhc2VcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UgaWYgKChpIDwgTUFYX05VTV9PRl9ETFNfRU5UUlkpICYmIHBETFMtPlZhbGlkICYmIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmCisJCQkJKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSAmJiAhTUFDX0FERFJfRVFVQUwocERMUy0+TWFjQWRkciwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCQl7CisJCQkJLy8gNC4gdXBkYXRlIG1hYyBjYXNlLCB0ZWFyIGRvd24gb2xkIERMUyBhbmQgc2V0dXAgbmV3IERMUworCQkJCXJlYXNvbiA9IFJFQVNPTl9RT1NfVU5XQU5URURfTUVDSEFOSVNNOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCByZWFzb24pOworCQkJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19URUFSX0RPV04sIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcERMUywgc2l6ZW9mKFJUXzgwMl8xMV9ETFNfVUkpKTsKKwkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7CisJCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1JFUSwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJDTlRMIC0gRExTIHRlYXIgZG93biBhbmQgcmVzdGFydCBjYXNlXG4iKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlIGlmIChwRExTLT5WYWxpZCAmJiBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJgorCQkJCU1BQ19BRERSX0VRVUFMKHBETFMtPk1hY0FkZHIsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0ICE9IHBETFMtPlRpbWVPdXQpKQorCQkJeworCQkJCS8vIDUuIHVwZGF0ZSB0aW1lb3V0IGNhc2UsIHN0YXJ0IERMUyBzZXR1cCBwcm9jZWR1cmUgKG5vIHRlYXIgZG93bikKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0CT0gcERMUy0+VGltZU91dDsKKwkJCQkvL1VwZGF0ZSBjb3VudGRvd24gdGltZXIKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5Db3VudERvd25UaW1lciA9IHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQ7CisJCQkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCByZWFzb24pOworCQkJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19SRVEsIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQ05UTCAtIERMUyB1cGRhdGUgdGltZW91dCBjYXNlXG4iKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlIGlmIChwRExTLT5WYWxpZCAmJiBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJgorCQkJCShwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgIT0gRExTX0ZJTklTSCkgJiYgTUFDX0FERFJfRVFVQUwocERMUy0+TWFjQWRkciwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCQl7CisJCQkJLy8gNi4gcmUtc2V0dXAgY2FzZSwgc3RhcnQgRExTIHNldHVwIHByb2NlZHVyZSAobm8gdGVhciBkb3duKQorCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfUkVRLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkNOVEwgLSBETFMgcmV0cnkgc2V0dXAgcHJvY2VkdXJlXG4iKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwoIkNOVEwgLSBETFMgbm90IGNoYW5nZWQgaW4gZW50cnkgLSAlZCAtIFZhbGlkPSVkLCBTdGF0dXM9JWQsIFRpbWVPdXQ9JWRcbiIsCisJCQkJCWksIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQpKTsKKwkJCX0KKwkJfQorCX0KK30KKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQ250bFdhaXREaXNhc3NvY1Byb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCU1MTUVfU1RBUlRfUkVRX1NUUlVDVCAgICAgU3RhcnRSZXE7CisKKwlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfRElTQVNTT0NfQ09ORikKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBEaXMtYXNzb2NpYXRlIHN1Y2Nlc3NmdWxcbiIpKTsKKworCSAgICBpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCXsKKwkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0RJU0FTU09DX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJCX0KKworCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKKworCQkvLyBjYXNlIDEuIG5vIG1hdGNoaW5nIEJTUywgYW5kIHVzZXIgd2FudHMgQURIT0MsIHNvIHdlIGp1c3Qgc3RhcnQgYSBuZXcgb25lCisJCWlmICgocEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnI9PTApICYmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBObyBtYXRjaGluZyBCU1MsIHN0YXJ0IGEgbmV3IEFESE9DIChTc2lkPSVzKS4uLlxuIixwQWQtPk1sbWVBdXguU3NpZCkpOworCQkJU3RhcnRQYXJtRmlsbChwQWQsICZTdGFydFJlcSwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TVEFSVF9SRVEsIHNpemVvZihNTE1FX1NUQVJUX1JFUV9TVFJVQ1QpLCAmU3RhcnRSZXEpOworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9TVEFSVDsKKwkJfQorCQkvLyBjYXNlIDIuIHRyeSBlYWNoIG1hdGNoZWQgQlNTCisJCWVsc2UKKwkJeworCQkJcEFkLT5NbG1lQXV4LkJzc0lkeCA9IDA7CisKKwkJCUl0ZXJhdGVPbkJzc1RhYihwQWQpOworCQl9CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBDbnRsV2FpdEpvaW5Qcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgUmVhc29uOworCU1MTUVfQVVUSF9SRVFfU1RSVUNUICAgICAgICBBdXRoUmVxOworCisJaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX0pPSU5fQ09ORikKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KCZSZWFzb24sIEVsZW0tPk1zZywgc2l6ZW9mKFVTSE9SVCkpOworCQlpZiAoUmVhc29uID09IE1MTUVfU1VDQ0VTUykKKwkJeworCQkJLy8gMS4gam9pbmVkIGFuIElCU1MsIHdlIGFyZSBwcmV0dHkgbXVjaCBkb25lIGhlcmUKKwkJCWlmIChwQWQtPk1sbWVBdXguQnNzVHlwZSA9PSBCU1NfQURIT0MpCisJCQl7CisJCQkgICAgLy8KKwkJCQkvLyA1RyBiYW5kcyBydWxlcyBvZiBKYXBhbjoKKwkJCQkvLyBBZCBob2MgbXVzdCBiZSBkaXNhYmxlZCBpbiBXNTMoY2g1Miw1Niw2MCw2NCkgY2hhbm5lbHMuCisJCQkJLy8KKwkJCQlpZiAoIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJgorICAgICAgICAgICAgICAgICAgICAgIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwkJCQkgICApCisJCQkJeworCQkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQ2hhbm5lbD0lZCwgSm9pbiBhZGhvYyBvbiBXNTMoNTIsNTYsNjAsNjQpIENoYW5uZWxzIGFyZSBub3QgYWNjZXB0ZWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKworCQkJCUxpbmtVcChwQWQsIEJTU19BREhPQyk7CisJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gam9pbiB0aGUgSUJTUyA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IC4uLlxuIiwKKwkJCQlwQWQtPkNvbW1vbkNmZy5Cc3NpZFswXSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFsxXSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFsyXSwKKwkJCQlwQWQtPkNvbW1vbkNmZy5Cc3NpZFszXSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFs0XSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFs1XSkpOworCisgICAgICAgICAgICAgICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKyAgICAgICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19VUDsKKwkJCX0KKwkJCS8vIDIuIGpvaW5lZCBhIG5ldyBJTkZSQSBuZXR3b3JrLCBzdGFydCBmcm9tIGF1dGhlbnRpY2F0aW9uCisJCQllbHNlCisJCQl7CisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQkJLy8gQWRkIEF1dGhNb2RlICJMRUFQIiBmb3IgQ0NYIDEuWAorCQkJCWlmIChwQWQtPlN0YUNmZy5MZWFwQXV0aE1vZGUgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKQorCQkJCXsKKwkJCQkJQXV0aFBhcm1GaWxsKHBBZCwgJkF1dGhSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgQ0lTQ09fQXV0aE1vZGVMRUFQKTsKKwkJCQl9CisJCQkJZWxzZQorI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCQkJCXsKKwkJCQkJLy8gZWl0aGVyIE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCBvciBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoLCB0cnkgc2hhcmVkIGtleSBmaXJzdAorCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkgfHwKKwkJCQkJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoKSkKKwkJCQkJeworCQkJCQkJQXV0aFBhcm1GaWxsKHBBZCwgJkF1dGhSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCUF1dGhQYXJtRmlsbChwQWQsICZBdXRoUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsIE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pOworCQkJCQl9CisJCQkJfQorCQkJCU1sbWVFbnF1ZXVlKHBBZCwgQVVUSF9TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9BVVRIX1JFUSwKKwkJCQkJCQlzaXplb2YoTUxNRV9BVVRIX1JFUV9TVFJVQ1QpLCAmQXV0aFJlcSk7CisKKwkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0FVVEg7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyAzLiBmYWlsZWQsIHRyeSBuZXh0IEJTUworCQkJcEFkLT5NbG1lQXV4LkJzc0lkeCsrOworCQkJSXRlcmF0ZU9uQnNzVGFiKHBBZCk7CisJCX0KKwl9Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQ250bFdhaXRTdGFydFByb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCAgICAgIFJlc3VsdDsKKworCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9TVEFSVF9DT05GKQorCXsKKwkJTmRpc01vdmVNZW1vcnkoJlJlc3VsdCwgRWxlbS0+TXNnLCBzaXplb2YoVVNIT1JUKSk7CisJCWlmIChSZXN1bHQgPT0gTUxNRV9TVUNDRVNTKQorCQl7CisJCSAgICAvLworCQkJLy8gNUcgYmFuZHMgcnVsZXMgb2YgSmFwYW46CisJCQkvLyBBZCBob2MgbXVzdCBiZSBkaXNhYmxlZCBpbiBXNTMoY2g1Miw1Niw2MCw2NCkgY2hhbm5lbHMuCisJCQkvLworCQkJaWYgKCAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkgJiYKKyAgICAgICAgICAgICAgICAgIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwkJCSAgICkKKwkJCXsKKwkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBDaGFubmVsPSVkLCBTdGFydCBhZGhvYyBvbiBXNTMoNTIsNTYsNjAsNjQpIENoYW5uZWxzIGFyZSBub3QgYWNjZXB0ZWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJCQlyZXR1cm47CisJCQl9CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQorCQkJeworCQkJCU5fQ2hhbm5lbENoZWNrKHBBZCk7CisJCQkJU2V0Q29tbW9uSFQocEFkKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbywgJnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbywgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7CisJCQkJUlRNUENoZWNrSHQocEFkLCBCU1NJRF9XQ0lELCAmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LCAmcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvKTsKKwkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9IFRSVUU7CisJCQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdLCAxNik7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdLCAmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFswXSwgMTYpOworCQkJCUNPUFlfSFRTRVRUSU5HU19GUk9NX01MTUVfQVVYX1RPX0FDVElWRV9DRkcocEFkKTsKKworCQkJCWlmICgocEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggID09IEJXXzQwKSAmJgorCQkJCQkocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID09IEVYVENIQV9BQk9WRSkpCisJCQkJeworCQkJCQlwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsICsgMjsKKwkJCQl9CisJCQkJZWxzZSBpZiAoKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoICA9PSBCV180MCkgJiYKKwkJCQkJCSAocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID09IEVYVENIQV9CRUxPVykpCisJCQkJeworCQkJCQlwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsIC0gMjsKKwkJCQl9CisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQl7CisJCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBGQUxTRTsKKwkJCX0KKwkJCUxpbmtVcChwQWQsIEJTU19BREhPQyk7CisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworCQkJLy8gQmVmb3JlIHNlbmQgYmVhY29uLCBkcml2ZXIgbmVlZCBkbyByYWRhciBkZXRlY3Rpb24KKwkJCWlmICgocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0ICkKKwkJCQkmJiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkKKwkJCQkmJiBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKQorCQkJeworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSA9IFJEX1NJTEVOQ0VfTU9ERTsKKwkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRENvdW50ID0gMDsKKyNpZmRlZiBERlNfU1VQUE9SVAorCQkJCUJicFJhZGFyRGV0ZWN0aW9uU3RhcnQocEFkKTsKKyNlbmRpZiAvLyBERlNfU1VQUE9SVCAvLworCQkJfQorCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gc3RhcnQgYSBuZXcgSUJTUyA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IC4uLlxuIiwKKwkJCQlwQWQtPkNvbW1vbkNmZy5Cc3NpZFswXSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFsxXSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFsyXSwKKwkJCQlwQWQtPkNvbW1vbkNmZy5Cc3NpZFszXSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFs0XSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFs1XSkpOworCQl9CisJCWVsc2UKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIFN0YXJ0IElCU1MgZmFpbC4gQlVHISEhISFcbiIpKTsKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJCX0KKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIENudGxXYWl0QXV0aFByb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgUmVhc29uOworCU1MTUVfQVNTT0NfUkVRX1NUUlVDVCAgICAgICAgQXNzb2NSZXE7CisJTUxNRV9BVVRIX1JFUV9TVFJVQ1QgICAgICAgICBBdXRoUmVxOworCisJaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX0FVVEhfQ09ORikKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KCZSZWFzb24sIEVsZW0tPk1zZywgc2l6ZW9mKFVTSE9SVCkpOworCQlpZiAoUmVhc29uID09IE1MTUVfU1VDQ0VTUykKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFVVEggT0tcbiIpKTsKKwkJCUFzc29jUGFybUZpbGwocEFkLCAmQXNzb2NSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgcEFkLT5NbG1lQXV4LkNhcGFiaWxpdHlJbmZvLAorCQkJCQkJICBBU1NPQ19USU1FT1VULCBwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQpOworCisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQkvLworCQkJLy8gQ2lzY28gTGVhcCBDQ0tNIHN1cHBvcnRlZCBSZS1hc3NvY2lhdGlvbi4KKwkJCS8vCisJCQlpZiAoTEVBUF9DQ0tNX09OKHBBZCkgJiYgKHBBZC0+U3RhQ2ZnLkNDS01MaW5rVXBGbGFnID09IFRSVUUpKQorCQkJeworCQkJCS8vaWYgQ0NLTSBpcyB0dXJuIG9uICwgdGhhdCdzIG1lYW4gRmFzdCBSZWF1dGhlbnRpY2F0aW9uCisJCQkJLy9Vc2UgQ0NLTSBSZWFzc29jaWF0aW9uIGluc3RlYWQgb2Ygbm9ybWFsIGFzc29jaWF0aW9uIGZvciBGYXN0IFJvYW1pbmcuCisJCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9SRUFTU09DX1JFUSwKKwkJCQkJCQlzaXplb2YoTUxNRV9BU1NPQ19SRVFfU1RSVUNUKSwgJkFzc29jUmVxKTsKKworCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfUkVBU1NPQzsKKwkJCX0KKwkJCWVsc2UKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKwkJCXsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0FTU09DX1JFUSwKKwkJCQkJCQlzaXplb2YoTUxNRV9BU1NPQ19SRVFfU1RSVUNUKSwgJkFzc29jUmVxKTsKKworCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfQVNTT0M7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBUaGlzIGZhaWwgbWF5IGJlY2F1c2Ugb2YgdGhlIEFQIGFscmVhZHkga2VlcCB1cyBpbiBpdHMgTUFDIHRhYmxlIHdpdGhvdXQKKwkJCS8vIGFnZWluZy1vdXQuIFRoZSBwcmV2aW91cyBhdXRoZW50aWNhdGlvbiBhdHRlbXB0IG11c3QgaGF2ZSBsZXQgaXQgcmVtb3ZlIHVzLgorCQkJLy8gc28gdHJ5IEF1dGhlbnRpY2F0aW9uIGFnYWluIG1heSBoZWxwLiBGb3IgRC1MaW5rIERXTC05MDBBUCsgY29tcGF0aWJpbGl0eS4KKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBVVRIIEZBSUwsIHRyeSBhZ2Fpbi4uLlxuIikpOworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJLy9BZGQgQXV0aE1vZGUgIkxFQVAiIGZvciBDQ1ggMS5YCisJCQlpZiAocEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID09IENJU0NPX0F1dGhNb2RlTEVBUCkKKwkJCXsKKwkJCQlBdXRoUGFybUZpbGwocEFkLCAmQXV0aFJlcSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBDSVNDT19BdXRoTW9kZUxFQVApOworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCQkJeworCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKSB8fAorCQkJCQkocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCkpCisJCQkJeworCQkJCQkvLyBlaXRoZXIgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkIG9yIE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gsIHRyeSBzaGFyZWQga2V5IGZpcnN0CisJCQkJCUF1dGhQYXJtRmlsbChwQWQsICZBdXRoUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsIE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUF1dGhQYXJtRmlsbChwQWQsICZBdXRoUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsIE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pOworCQkJCX0KKwkJCX0KKwkJCU1sbWVFbnF1ZXVlKHBBZCwgQVVUSF9TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9BVVRIX1JFUSwKKwkJCQkJCXNpemVvZihNTE1FX0FVVEhfUkVRX1NUUlVDVCksICZBdXRoUmVxKTsKKworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9BVVRIMjsKKwkJfQorCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQ250bFdhaXRBdXRoUHJvYzIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgUmVhc29uOworCU1MTUVfQVNTT0NfUkVRX1NUUlVDVCAgICAgICAgQXNzb2NSZXE7CisJTUxNRV9BVVRIX1JFUV9TVFJVQ1QgICAgICAgICBBdXRoUmVxOworCisJaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX0FVVEhfQ09ORikKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KCZSZWFzb24sIEVsZW0tPk1zZywgc2l6ZW9mKFVTSE9SVCkpOworCQlpZiAoUmVhc29uID09IE1MTUVfU1VDQ0VTUykKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFVVEggT0tcbiIpKTsKKwkJCUFzc29jUGFybUZpbGwocEFkLCAmQXNzb2NSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgcEFkLT5NbG1lQXV4LkNhcGFiaWxpdHlJbmZvLAorCQkJCQkJICBBU1NPQ19USU1FT1VULCBwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQpOworCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9BU1NPQ19SRVEsCisJCQkJCQlzaXplb2YoTUxNRV9BU1NPQ19SRVFfU1RSVUNUKSwgJkFzc29jUmVxKTsKKworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9BU1NPQzsKKwkJfQorCQllbHNlCisJCXsKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJCS8vIFByb2Nlc3MgTEVBUCBmaXJzdCwgc2luY2UgaXQgdXNlIGRpZmZlcmVudCBjb250cm9sIHZhcmlhYmxlCisJCQkvLyBXZSBkb24ndCB3YW50IHRvIGFmZmVjdCBvdGhlciBwb3ZlbiBvcGVyYXRpb24KKwkJCWlmIChwQWQtPlN0YUNmZy5MZWFwQXV0aE1vZGUgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKQorCQkJeworCQkJCS8vIExFQVAgQXV0aCBub3Qgc3VjY2VzcywgdHJ5IG5leHQgQlNTCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtICpMRUFQKiBBVVRIIEZBSUwsIGdpdmUgdXA7IHRyeSBuZXh0IEJTU1xuIikpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRvdGFsIG1hdGNoIEJTU0lEIFs9JWRdXG4iLCBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOcikpOworCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJCQkJcEFkLT5NbG1lQXV4LkJzc0lkeCsrOworCQkJCUl0ZXJhdGVPbkJzc1RhYihwQWQpOworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoKSAmJgorCQkJCSAocEFkLT5NbG1lQXV4LkFsZyA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBVVRIIEZBSUwsIHRyeSBPUEVOIHN5c3RlbS4uLlxuIikpOworCQkJCUF1dGhQYXJtRmlsbChwQWQsICZBdXRoUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsIE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pOworCQkJCU1sbWVFbnF1ZXVlKHBBZCwgQVVUSF9TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9BVVRIX1JFUSwKKwkJCQkJCQlzaXplb2YoTUxNRV9BVVRIX1JFUV9TVFJVQ1QpLCAmQXV0aFJlcSk7CisKKwkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0FVVEgyOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIG5vdCBzdWNjZXNzLCB0cnkgbmV4dCBCU1MKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQVVUSCBGQUlMLCBnaXZlIHVwOyB0cnkgbmV4dCBCU1NcbiIpKTsKKwkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOyAvLz8/Pz8/Pz8KKwkJCQlwQWQtPk1sbWVBdXguQnNzSWR4Kys7CisJCQkJSXRlcmF0ZU9uQnNzVGFiKHBBZCk7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIENudGxXYWl0QXNzb2NQcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgICAgICBSZWFzb247CisKKwlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfQVNTT0NfQ09ORikKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KCZSZWFzb24sIEVsZW0tPk1zZywgc2l6ZW9mKFVTSE9SVCkpOworCQlpZiAoUmVhc29uID09IE1MTUVfU1VDQ0VTUykKKwkJeworCQkJTGlua1VwKHBBZCwgQlNTX0lORlJBKTsKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQXNzb2NpYXRpb24gc3VjY2Vzc2Z1bCBvbiBCU1MgIyVsZFxuIixwQWQtPk1sbWVBdXguQnNzSWR4KSk7CisKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJCXsKKwkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19BU1NPQ19FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJLy8gbm90IHN1Y2Nlc3MsIHRyeSBuZXh0IEJTUworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFzc29jaWF0aW9uIGZhaWxzIG9uIEJTUyAjJWxkXG4iLHBBZC0+TWxtZUF1eC5Cc3NJZHgpKTsKKwkJCXBBZC0+TWxtZUF1eC5Cc3NJZHgrKzsKKwkJCUl0ZXJhdGVPbkJzc1RhYihwQWQpOworCQl9CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBDbnRsV2FpdFJlYXNzb2NQcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgICAgICBSZXN1bHQ7CisKKwlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfUkVBU1NPQ19DT05GKQorCXsKKwkJTmRpc01vdmVNZW1vcnkoJlJlc3VsdCwgRWxlbS0+TXNnLCBzaXplb2YoVVNIT1JUKSk7CisJCWlmIChSZXN1bHQgPT0gTUxNRV9TVUNDRVNTKQorCQl7CisJCQkvLworCQkJLy8gTkRJUyByZXF1aXJlcyBhIG5ldyBMaW5rIFVQIGluZGljYXRpb24gYnV0IG5vIExpbmsgRG93biBmb3IgUkUtQVNTT0MKKwkJCS8vCisJCQlMaW5rVXAocEFkLCBCU1NfSU5GUkEpOworCisJCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIGFzc29jaWF0aW9uCisJCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfQVNTT0NfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKworCisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQlpZiAoTEVBUF9DQ0tNX09OKHBBZCkpCisJCQl7CisJCQkJU1RBX1BPUlRfU0VDVVJFRChwQWQpOworCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfRklOSVNIOworCQkJfQorI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBSZS1hc3NvY2l0aW9uIHN1Y2Nlc3NmdWwgb24gQlNTICMlbGRcbiIsIHBBZC0+TWxtZUF1eC5Sb2FtSWR4KSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyByZWFzc29jIGZhaWxlZCwgdHJ5IHRvIHBpY2sgbmV4dCBCU1MgaW4gdGhlIEJTUyBUYWJsZQorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIFJlLWFzc29jaXRpb24gZmFpbHMgb24gQlNTICMlbGRcbiIsIHBBZC0+TWxtZUF1eC5Sb2FtSWR4KSk7CisJCQlwQWQtPk1sbWVBdXguUm9hbUlkeCsrOworCQkJSXRlcmF0ZU9uQnNzVGFiMihwQWQpOworCQl9CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBMaW5rVXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgQnNzVHlwZSkKK3sKKwlVTE9ORwlOb3c7CisJVUlOVDMyCURhdGE7CisJQk9PTEVBTglDYW5jZWxsZWQ7CisJVUNIQVIJVmFsdWUgPSAwLCBpZHg7CisJTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSBOVUxMLCAqcEN1cnJFbnRyeTsKKworCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOworCisJLy8KKwkvLyBBU1NPQyAtIERpc2Fzc29jVGltZW91dEFjdGlvbgorCS8vIENOVEwgLSBEaXMtYXNzb2NpYXRlIHN1Y2Nlc3NmdWwKKwkvLyAhISEgTElOSyBET1dOICEhIQorCS8vIFs4ODg4OF0gT0lEXzgwMl8xMV9TU0lEIHNob3VsZCBoYXZlIHJldHVybmVkIE5EVEVTVF9XRVBfQVAyKFJldHVybmVkOiApCisJLy8KKwkvLyBUbyBwcmV2ZW50IERpc2Fzc29jVGltZW91dEFjdGlvbiB0byBjYWxsIExpbmsgZG93biBhZnRlciB3ZSBsaW5rIHVwLAorCS8vIGNhbmNlbCB0aGUgRGlzYXNzb2NUaW1lciBubyBtYXR0ZXIgd2hhdCBpdCBzdGFydCBvciBub3QuCisJLy8KKwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLCAgJkNhbmNlbGxlZCk7CisKKwlDT1BZX1NFVFRJTkdTX0ZST01fTUxNRV9BVVhfVE9fQUNUSVZFX0NGRyhwQWQpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJQ09QWV9IVFNFVFRJTkdTX0ZST01fTUxNRV9BVVhfVE9fQUNUSVZFX0NGRyhwQWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCS8vIEl0J3MgcXVpdGUgZGlmZmljdWx0IHRvIHRlbGwgaWYgYSBuZXdseSBhZGRlZCBLRVkgaXMgV0VQIG9yIENLSVAgdW50aWwgYSBuZXcgQlNTCisJLy8gaXMgZm9ybWVkIChlaXRoZXIgQVNTT0MvUkUtQVNTT0MgZG9uZSBvciBJQlNTIHN0YXJ0ZWQuIExpbmtVUCBzaG91bGQgYmUgYSBzYWZlIHBsYWNlCisJLy8gdG8gZXhhbWluZSBpZiBjaXBoZXIgYWxnb3JpdGhtIHN3aXRjaGluZyBpcyByZXF1aXJlZC4KKwkvL3J0Mjg2MGIuIERvbid0IGtub3cgd2h5IG5lZWQgdGhpcworCVN3aXRjaEJldHdlZW5XZXBBbmRDa2lwKHBBZCk7CisKKyNpZmRlZiBSVDI4NjAKKwkvLyBCZWZvcmUgcG93ZXIgc2F2ZSBiZWZvcmUgbGluayB1cCBmdW5jdGlvbiwgV2Ugd2lsbCBmb3JjZSB1c2UgMVIuCisJLy8gU28gYWZ0ZXIgbGluayB1cCwgY2hlY2sgUnggYW50ZW5uYSAjIGFnYWluLgorCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJlZhbHVlKTsKKwlpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDMpCisJeworCQlWYWx1ZSB8PSAoMHgxMCk7CisJfQorCWVsc2UgaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKQorCXsKKwkJVmFsdWUgfD0gKDB4OCk7CisJfQorCWVsc2UgaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQorCXsKKwkJVmFsdWUgfD0gKDB4MCk7CisJfQorCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIFZhbHVlKTsKKwlwQWQtPlN0YUNmZy5CQlBSMyA9IFZhbHVlOworI2VuZGlmIC8vIFJUMjg2MCAvLworCisJaWYgKEJzc1R5cGUgPT0gQlNTX0FESE9DKQorCXsKKwkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FESE9DX09OKTsKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfSU5GUkFfT04pOworCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLyBSb2dlciBzeW5jIENhcnJpZXIKKwkJLy8gTm8gY2FycmllciBkZXRlY3Rpb24gd2hlbiBhZGhvYworCQkvLyBDYXJyaWVyRGV0ZWN0aW9uU3RvcChwQWQpOworCQlwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkNEX1N0YXRlID0gQ0RfTk9STUFMOworI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISFBZGhvYyBMSU5LIFVQICEhISBcbiIgKSk7CisJfQorCWVsc2UKKwl7CisJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19JTkZSQV9PTik7CisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FESE9DX09OKTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISFJbmZyYSBMSU5LIFVQICEhISBcbiIgKSk7CisJfQorCisJLy8gMyozCisJLy8gcmVzZXQgVHggYmVhbWZvcm1pbmcgYml0CisJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmVmFsdWUpOworCVZhbHVlICY9ICh+MHgwMSk7CisJVmFsdWUgfD0gcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlR4QkY7CisJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgVmFsdWUpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJLy8gQ2hhbmdlIHRvIEFQIGNoYW5uZWwKKyAgICBpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID4gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkgJiYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCisJeworCQkvLyBNdXN0IHVzaW5nIDQwTUh6LgorCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV180MDsKKwkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOworCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmVmFsdWUpOworCQlWYWx1ZSAmPSAofjB4MTgpOworCQlWYWx1ZSB8PSAweDEwOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBWYWx1ZSk7CisKKwkJLy8gIFJYIDogY29udHJvbCBjaGFubmVsIGF0IGxvd2VyCisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJlZhbHVlKTsKKwkJVmFsdWUgJj0gKH4weDIwKTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgVmFsdWUpOworI2lmZGVmIFJUMjg2MAorICAgICAgICBwQWQtPlN0YUNmZy5CQlBSMyA9IFZhbHVlOworI2VuZGlmIC8vIFJUMjg2MCAvLworCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZEYXRhKTsKKwkJRGF0YSAmPSAweGZmZmZmZmZlOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgRGF0YSk7CisKKwkJaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKQorCQl7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgMHgxQSk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgMHgwQSk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MywgMHgxNik7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISFydDI4NjBDICEhISBcbiIgKSk7CisJCX0KKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISE0ME1IeiBMb3dlciBMSU5LIFVQICEhISBDb250cm9sIENoYW5uZWwgYXQgQmVsb3cuIENlbnRyYWwgPSAlZCBcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICkpOworCX0KKwllbHNlIGlmICgocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSAmJiAocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKKyAgICB7CisJICAgIC8vIE11c3QgdXNpbmcgNDBNSHouCisJCXBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzQwOworCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7CisJICAgIEFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZWYWx1ZSk7CisJCVZhbHVlICY9ICh+MHgxOCk7CisJCVZhbHVlIHw9IDB4MTA7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIFZhbHVlKTsKKworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmRGF0YSk7CisJCURhdGEgfD0gMHgxOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgRGF0YSk7CisKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmVmFsdWUpOworCSAgICBWYWx1ZSB8PSAoMHgyMCk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIFZhbHVlKTsKKyNpZmRlZiBSVDI4NjAKKyAgICAgICAgcEFkLT5TdGFDZmcuQkJQUjMgPSBWYWx1ZTsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCQlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCisJCXsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY5LCAweDFBKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCAweDBBKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjczLCAweDE2KTsKKwkJCSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISFydDI4NjBDICEhISBcbiIgKSk7CisJCX0KKworCSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgNDBNSHogVXBwZXIgTElOSyBVUCAhISEgQ29udHJvbCBDaGFubmVsIGF0IFVwcGVyQ2VudHJhbCA9ICVkIFxuIiwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgKSk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyAgICB7CisJICAgIHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzIwOworCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOworCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZWYWx1ZSk7CisJCVZhbHVlICY9ICh+MHgxOCk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIFZhbHVlKTsKKworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmRGF0YSk7CisJCURhdGEgJj0gMHhmZmZmZmZmZTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIERhdGEpOworCisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJlZhbHVlKTsKKwkJVmFsdWUgJj0gKH4weDIwKTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgVmFsdWUpOworI2lmZGVmIFJUMjg2MAorICAgICAgICBwQWQtPlN0YUNmZy5CQlBSMyA9IFZhbHVlOworI2VuZGlmIC8vIFJUMjg2MCAvLworCisJCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKKwkJeworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIDB4MTYpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsIDB4MDgpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzMsIDB4MTEpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhcnQyODYwQyAhISEgXG4iICkpOworCQl9CisKKwkgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIDIwTUh6IExJTksgVVAgISEhIFxuIiApKTsKKyAgICB9CisKKwlSVE1QU2V0QUdDSW5pdFZhbHVlKHBBZCwgcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXKTsKKwkvLworCS8vIFNhdmUgQkJQX1I2NiB2YWx1ZSwgaXQgd2lsbCBiZSB1c2VkIGluIFJUVVNCUmVzdW1lTXNkdVRyYW5zbWlzc2lvbgorCS8vCisJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgJnBBZC0+QmJwVHVuaW5nLlI2NkN1cnJlbnRWYWx1ZSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTElOSyBVUCAhISEgKEJzc1R5cGU9JWQsIEFJRD0lZCwgc3NpZD0lcywgQ2hhbm5lbD0lZCwgQ2VudHJhbENoYW5uZWwgPSAlZClcbiIsCisJCUJzc1R5cGUsIHBBZC0+U3RhQWN0aXZlLkFpZCwgcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMSU5LIFVQICEhISAoRGVuc2l0eSA9JWQsIClcbiIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTXBkdURlbnNpdHkpKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQlBc2ljU2V0QnNzaWQocEFkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisKKwlBc2ljU2V0U2xvdFRpbWUocEFkLCBUUlVFKTsKKwlBc2ljU2V0RWRjYVBhcm0ocEFkLCAmcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybSk7CisKKwkvLyBDYWxsIHRoaXMgZm9yIFJUUyBwcm90ZWN0aW9uZm9yIGxlZ2FjeSByYXRlLCB3ZSB3aWxsIGFsd2F5cyBlbmFibGUgUlRTIHRocmVzaG9sZCwgYnV0IG5vcm1hbGx5IGl0IHdpbGwgbm90IGhpdAorCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgMCwgKE9GRE1TRVRQUk9URUNUIHwgQ0NLU0VUUFJPVEVDVCksIFRSVUUsIEZBTFNFKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gVFJVRSkpCisJeworCQkvLyBVcGRhdGUgSFQgcHJvdGVjdGlvbmZvciBiYXNlZCBvbiBBUCdzIG9wZXJhdGluZyBtb2RlLgorICAgIAlpZiAocEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9PSAxKQorICAgIAl7CisgICAgCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsICBBTExOX1NFVFBST1RFQ1QsIEZBTFNFLCBUUlVFKTsKKyAgICAJfQorICAgIAllbHNlCisgICAJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsICBBTExOX1NFVFBST1RFQ1QsIEZBTFNFLCBGQUxTRSk7CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+RHJzQ291bnRlcnMsIHNpemVvZihDT1VOVEVSX0RSUykpOworCisJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKKwlwQWQtPlN0YUNmZy5MYXN0QmVhY29uUnhUaW1lID0gTm93OyAgIC8vIGxhc3QgUlggdGltZXN0YW1wCisKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgIT0gUnQ4MDJfMTFQcmVhbWJsZUxvbmcpICYmCisJCUNBUF9JU19TSE9SVF9QUkVBTUJMRV9PTihwQWQtPlN0YUFjdGl2ZS5DYXBhYmlsaXR5SW5mbykpCisJeworCQlNbG1lU2V0VHhQcmVhbWJsZShwQWQsIFJ0ODAyXzExUHJlYW1ibGVTaG9ydCk7CisJfQorCisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKTsKKworCWlmIChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgPT0gUkRfU0lMRU5DRV9NT0RFKQorCXsKKyNpZmRlZiBERlNfU1VQUE9SVAorCQlSYWRhckRldGVjdGlvblN0b3AocEFkKTsKKyNlbmRpZiAvLyBERlNfU1VQUE9SVCAvLworCX0KKwlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgPSBSRF9OT1JNQUxfTU9ERTsKKworCWlmIChCc3NUeXBlID09IEJTU19BREhPQykKKwl7CisJCU1ha2VJYnNzQmVhY29uKHBBZCk7CisJCWlmICgocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQorCQkJJiYgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpCisJCQkmJiBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKQorCQl7CisJCQk7IC8vRG8gbm90aGluZworCQl9CisJCWVsc2UKKwkJeworCQkJQXNpY0VuYWJsZUlic3NTeW5jKHBBZCk7CisJCX0KKworCQkvLyBJbiBhZCBob2MgbW9kZSwgdXNlIE1BQyB0YWJsZSBmcm9tIGluZGV4IDEuCisJCS8vIHAucyBBU0lDIHVzZSBhbGwgMHhmZiBhcyB0ZXJtaW5hdGlvbiBvZiBXQ0lEIHRhYmxlIHNlYXJjaC5UbyBwcmV2ZW50IGl0J3MgMHhmZi1mZi1mZi1mZi1mZi1mZiwgV3JpdGUgMCBoZXJlLgorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfV0NJRF9CQVNFLCAweDAwKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgMHgxODA4LCAweDAwKTsKKworCQkvLyBJZiBXRVAgaXMgZW5hYmxlZCwgYWRkIGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIGludG8gQXNpYworCQkvLyBGaWxsIGluIFNoYXJlZCBLZXkgVGFibGUob2Zmc2V0OiAweDZjMDApIGFuZCBTaGFyZWQgS2V5IE1vZGUob2Zmc2V0OiAweDcwMDApCisKKwkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkKKwkJeworCQkJUFVDSEFSCUtleTsKKwkJCVVDSEFSIAlDaXBoZXJBbGc7CisKKwkJCWZvciAoaWR4PTA7IGlkeCA8IFNIQVJFX0tFWV9OVU07IGlkeCsrKQorICAgICAgICAJeworCQkJCUNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uQ2lwaGVyQWxnOworICAgIAkJCUtleSA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5OworCisJCQkJaWYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5TGVuID4gMCkKKwkJCQl7CisJCQkJCS8vIFNldCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyB0byBBc2ljCisgICAgCQkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBLZXksIE5VTEwsIE5VTEwpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChpZHggPT0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkKQorCQkJCQl7CisJCQkJCQkvLyBVcGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlIGZvciB0aGlzIGdyb3VwIGtleSB0YWJsZQorCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBOVUxMKTsKKwkJCQkJfQorCQkJCX0KKworCisJCQl9CisJCX0KKwkJLy8gSWYgV1BBTm9uZSBpcyBlbmFibGVkLCBhZGQga2V5IG1hdGVyaWFsIGFuZCBjaXBoZXJBbGcgaW50byBBc2ljCisJCS8vIEZpbGwgaW4gU2hhcmVkIEtleSBUYWJsZShvZmZzZXQ6IDB4NmMwMCkgYW5kIFNoYXJlZCBLZXkgTW9kZShvZmZzZXQ6IDB4NzAwMCkKKwkJZWxzZSBpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKwkJeworCQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gMDsJLy8gYWx3YXlzIGJlIHplcm8KKworICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworCQkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IExFTl9US0lQX0VLOworCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBwQWQtPlN0YUNmZy5QTUssIExFTl9US0lQX0VLKTsKKworICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKyAgICAgICAgICAgIHsKKyAgICAJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYywgJnBBZC0+U3RhQ2ZnLlBNS1sxNl0sIExFTl9US0lQX1JYTUlDSyk7CisgICAgCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsICZwQWQtPlN0YUNmZy5QTUtbMTZdLCBMRU5fVEtJUF9UWE1JQ0spOworICAgICAgICAgICAgfQorCisJCQkvLyBEZWNpZGUgaXRzIENoaXBlckFsZworCQkJaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKwkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworCQkJZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlVua25vdyBDaXBoZXIgKD0lZCksIHNldCBDaXBoZXIgdG8gQUVTXG4iLCBwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyKSk7CisJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKyAgICAgICAgICAgIH0KKworCQkJLy8gU2V0IGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIHRvIEFzaWMKKwkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCisJCQkJCQkJCSAgQlNTMCwKKwkJCQkJCQkJICAwLAorCQkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKKwkJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksCisJCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsCisJCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMpOworCisgICAgICAgICAgICAvLyBVcGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlIGZvciB0aGlzIGdyb3VwIGtleSB0YWJsZQorCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIDAsIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywgTlVMTCk7CisKKwkJfQorCisJfQorCWVsc2UgLy8gQlNTX0lORlJBCisJeworCQkvLyBDaGVjayB0aGUgbmV3IFNTSUQgd2l0aCBsYXN0IFNTSUQKKwkJd2hpbGUgKENhbmNlbGxlZCA9PSBUUlVFKQorCQl7CisJCQlpZiAocEFkLT5Db21tb25DZmcuTGFzdFNzaWRMZW4gPT0gcEFkLT5Db21tb25DZmcuU3NpZExlbikKKwkJCXsKKwkJCQlpZiAoUlRNUENvbXBhcmVNZW1vcnkocEFkLT5Db21tb25DZmcuTGFzdFNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkxhc3RTc2lkTGVuKSA9PSAwKQorCQkJCXsKKwkJCQkJLy8gTGluayB0byB0aGUgb2xkIG9uZSBubyBsaW5rZG93biBpcyByZXF1aXJlZC4KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJLy8gU2VuZCBsaW5rIGRvd24gZXZlbnQgYmVmb3JlIHNldCB0byBsaW5rIHVwCisJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOworCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKKyAgICAgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX0RPV047CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJORElTX1NUQVRVU19NRURJQV9ESVNDT05ORUNUIEV2ZW50IEFBIVxuIikpOworCQkJYnJlYWs7CisJCX0KKworCQkvLworCQkvLyBPbiBXUEEgbW9kZSwgUmVtb3ZlIEFsbCBLZXlzIGlmIG5vdCBjb25uZWN0IHRvIHRoZSBsYXN0IEJTU0lECisJCS8vIEtleSB3aWxsIGJlIHNldCBhZnRlciA0LXdheSBoYW5kc2hha2UuCisJCS8vCisJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSkKKwkJeworCQkJVUxPTkcgCQlJVjsKKworCQkJLy8gUmVtb3ZlIGFsbCBXUEEga2V5cworCQkJUlRNUFdQQVJlbW92ZUFsbEtleXMocEFkKTsKKwkJCXBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworCQkJcEFkLT5TdGFDZmcuUHJpdmFjeUZpbHRlciA9IE5kaXM4MDJfMTFQcml2RmlsdGVyODAyMXhXRVA7CisKKwkJCS8vIEZpeGVkIGNvbm5lY3Rpb24gZmFpbGVkIHdpdGggUmFuZ2UgTWF4aW1pemVyIC0gNTE1IEFQIChNYXJ2ZWxsIENoaXApIHdoZW4gc2VjdXJpdHkgaXMgV1BBUFNLL1RLSVAKKwkJCS8vIElmIElWIHJlbGF0ZWQgdmFsdWVzIGFyZSB0b28gbGFyZ2UgaW4gR3JvdXBNc2cyLCBBUCB3b3VsZCBpZ25vcmUgdGhpcyBtZXNzYWdlLgorCQkJSVYgPSAwOworCQkJSVYgfD0gKHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA8PCAzMCk7CisJCQlBc2ljVXBkYXRlV0NJRElWRUlWKHBBZCwgQlNTSURfV0NJRCwgSVYsIDApOworCQl9CisJCS8vIE5PVEU6CisJCS8vIHRoZSBkZWNpc2lvbiBvZiB1c2luZyAic2hvcnQgc2xvdCB0aW1lIiBvciBub3QgbWF5IGNoYW5nZSBkeW5hbWljYWxseSBkdWUgdG8KKwkJLy8gbmV3IFNUQSBhc3NvY2lhdGlvbiB0byB0aGUgQVAuIHNvIHdlIGhhdmUgdG8gZGVjaWRlIHRoYXQgdXBvbiBwYXJzaW5nIEJFQUNPTiwgbm90IGhlcmUKKworCQkvLyBOT1RFOgorCQkvLyB0aGUgZGVjaXNpb24gdG8gdXNlICJSVEMvQ1RTIiBvciAiQ1RTLXRvLXNlbGYiIHByb3RlY3Rpb24gb3Igbm90IG1heSBjaGFuZ2UgZHluYW1pY2FsbHkKKwkJLy8gZHVlIHRvIG5ldyBTVEEgYXNzb2NpYXRpb24gdG8gdGhlIEFQLiBzbyB3ZSBoYXZlIHRvIGRlY2lkZSB0aGF0IHVwb24gcGFyc2luZyBCRUFDT04sIG5vdCBoZXJlCisKKwkJQ29tcG9zZVBzUG9sbChwQWQpOworCQlDb21wb3NlTnVsbEZyYW1lKHBBZCk7CisKKwkJCUFzaWNFbmFibGVCc3NTeW5jKHBBZCk7CisKKwkJLy8gQWRkIEJTU0lEIHRvIFdDSUQgc2VhcmNoIHRhYmxlCisJCUFzaWNVcGRhdGVSeFdDSURUYWJsZShwQWQsIEJTU0lEX1dDSUQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKworCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCQkvLyBhZGQgdGhpcyBCU1NJRCBlbnRyeSBpbnRvIEhBU0ggdGFibGUKKwkJeworCQkJVUNIQVIgSGFzaElkeDsKKworCQkJLy9wRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKKwkJCUhhc2hJZHggPSBNQUNfQUREUl9IQVNIX0lOREVYKHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCWlmIChwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdID09IE5VTEwpCisJCQl7CisJCQkJcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XSA9IHBFbnRyeTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlwQ3VyckVudHJ5ID0gcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XTsKKwkJCQl3aGlsZSAocEN1cnJFbnRyeS0+cE5leHQgIT0gTlVMTCkKKwkJCQkJcEN1cnJFbnRyeSA9IHBDdXJyRW50cnktPnBOZXh0OworCQkJCXBDdXJyRW50cnktPnBOZXh0ID0gcEVudHJ5OworCQkJfQorCQl9CisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisKKworCQkvLyBJZiBXRVAgaXMgZW5hYmxlZCwgYWRkIHBhaWV3aXNlIGFuZCBzaGFyZWQga2V5CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICBpZiAoKChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApJiYKKyAgICAgICAgICAgICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKSYmCisgICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKSkgfHwKKyAgICAgICAgICAgICgocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpJiYKKyAgICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkpKQorI2Vsc2UKKwkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJCXsKKwkJCVBVQ0hBUglLZXk7CisJCQlVQ0hBUiAJQ2lwaGVyQWxnOworCisJCQlmb3IgKGlkeD0wOyBpZHggPCBTSEFSRV9LRVlfTlVNOyBpZHgrKykKKyAgICAgICAgCXsKKwkJCQlDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLkNpcGhlckFsZzsKKyAgICAJCQlLZXkgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleTsKKworCQkJCWlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleUxlbiA+IDApCisJCQkJeworCQkJCQkvLyBTZXQga2V5IG1hdGVyaWFsIGFuZCBjaXBoZXJBbGcgdG8gQXNpYworICAgIAkJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCBpZHgsIENpcGhlckFsZywgS2V5LCBOVUxMLCBOVUxMKTsKKworCQkJCQlpZiAoaWR4ID09IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkKKwkJCQkJeworCQkJCQkJLy8gQXNzaWduIGdyb3VwIGtleSBpbmZvCisJCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgQlNTMCwgaWR4LCBDaXBoZXJBbGcsIE5VTEwpOworCisJCQkJCQkvLyBBc3NpZ24gcGFpcndpc2Uga2V5IGluZm8KKwkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBCU1MwLCBpZHgsIENpcGhlckFsZywgcEVudHJ5KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCS8vIG9ubHkgSU5GUkFTVFJVQ1RVUkUgbW9kZSBuZWVkIHRvIGluZGljYXRlIGNvbm5lY3Rpdml0eSBpbW1lZGlhdGVseTsgQURIT0MgbW9kZQorCQkvLyBzaG91bGQgd2FpdCB1bnRpbCBhdCBsZWFzdCAyIGFjdGl2ZSBub2RlcyBpbiB0aGlzIEJTU0lELgorCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKworICAgICAgICAvLyBGb3IgR1VJICsrCisJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA8IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKwkJeworCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKwkJCXBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX1VQOworCQl9CisgICAgICAgIC8vIC0tCisJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CisKKwkJLy8gQWRkIEJTU0lEIGluIG15IE1BQyBUYWJsZS4KKyAgICAgICAgTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKwkJUlRNUE1vdmVNZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BaWQgPSBCU1NJRF9XQ0lEOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLnBBZCA9IHBBZDsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5WYWxpZEFzQ0xJID0gVFJVRTsJLy9BbHRob3VnaCB0aGlzIGlzIGJzc2lkLi5zdGlsbCBzZXQgVmFsaWRBc0NsCisJCXBBZC0+TWFjVGFiLlNpemUgPSAxOwkvLyBpbmZyYSBtb2RlIGFsd2F5cyBzZXQgTUFDdGFiIHNpemUgPTEuCisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uU3N0ID0gU1NUX0FTU09DOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkF1dGhTdGF0ZSA9IFNTVF9BU1NPQzsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5XZXBTdGF0dXMgPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgIE5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExJTksgVVAgISEhICBDbGllbnRTdGF0dXNGbGFncz0lbHgpXG4iLAorCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5DbGllbnRTdGF0dXNGbGFncykpOworCisJCU1sbWVVcGRhdGVUeFJhdGVzKHBBZCwgVFJVRSwgQlNTMCk7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCU1sbWVVcGRhdGVIdFR4UmF0ZXMocEFkLCBCU1MwKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExJTksgVVAgISEgKFN0YUFjdGl2ZS5iSHRFbmFibGUgPSVkLCApXG4iLCBwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSkpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCS8vCisJCS8vIFJlcG9ydCBBZGphY2VudCBBUCByZXBvcnQuCisJCS8vCisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCUNDWEFkamFjZW50QVBSZXBvcnQocEFkKTsKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKworCQlpZiAocEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSkKKwkJeworCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iUGlnZ3lCYWNrQ2FwYWJsZSkgJiYgKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICYgMHgwMDAwMDAwMykgPT0gMykKKwkJCXsKKworCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QSUdHWUJBQ0tfSU5VU0VEKTsKKwkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKTsKKyAgICAgICAgICAgICAgICBSVE1QU2V0UGlnZ3lCYWNrKHBBZCwgVFJVRSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHVybiBvbiBQaWdneS1CYWNrXG4iKSk7CisJCQl9CisJCQllbHNlIGlmIChwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAmIDB4MDAwMDAwMDEpCisJCQl7CisJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCk7CisJCQl9CisJCX0KKworCQlpZiAocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgIT0gMHgwKQorCQl7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlpZiAoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0sIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKSkKKwkJCXsKKwkJCQlBc2ljRW5hYmxlUkRHKHBBZCk7CisJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZDTElFTlRfU1RBVFVTX1JBTElOS19DSElQU0VUKTsKKwkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0sIGZDTElFTlRfU1RBVFVTX1JBTElOS19DSElQU0VUKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmQ0xJRU5UX1NUQVRVU19SQUxJTktfQ0hJUFNFVCk7CisJCQlDTElFTlRfU1RBVFVTX0NMRUFSX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0sIGZDTElFTlRfU1RBVFVTX1JBTElOS19DSElQU0VUKTsKKwkJfQorCX0KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5ESVNfU1RBVFVTX01FRElBX0NPTk5FQ1QgRXZlbnQgQiEuQkFDYXBhYmlsaXR5ID0gJXguIENsaWVudFN0YXR1c0ZsYWdzID0gJWx4XG4iLCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkud29yZCwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5DbGllbnRTdGF0dXNGbGFncykpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJLy8gU2V0IExFRAorCVJUTVBTZXRMRUQocEFkLCBMRURfTElOS19VUCk7CisKKwlwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCA9IDA7CisJcEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgPSAwOworCXBBZC0+YkNvbmZpZ0NoYW5nZWQgPSBGQUxTRTsgICAgICAgIC8vIFJlc2V0IGNvbmZpZyBmbGFnCisJcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfVVA7ICAgLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uIHRvIGxpbmsgaXMgdXAKKworCS8vIFNldCBhc2ljIGF1dG8gZmFsbCBiYWNrCisJeworCQlQVUNIQVIJCQkJCXBUYWJsZTsKKwkJVUNIQVIJCQkJCVRhYmxlU2l6ZSA9IDA7CisKKwkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0sICZwVGFibGUsICZUYWJsZVNpemUsICZwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCk7CisJCUFzaWNVcGRhdGVBdXRvRmFsbEJhY2tUYWJsZShwQWQsIHBUYWJsZSk7CisJfQorCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKyAgICBwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLndvcmQ7CisgICAgcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZCA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS53b3JkOworCWlmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBGQUxTRSkKKwl7CisJCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBGQUxTRTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJaWYgKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9PSAzMikKKwkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7CisKKwkJaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPiBNQ1NfNykgfHwgKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9PSAzMikpCisJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TVEJDID0gU1RCQ19OT05FOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkvLyBJZiB0aGUgbGVnYWN5IG1vZGUgaXMgc2V0LCBvdmVyd3JpdGUgdGhlIHRyYW5zbWl0IHNldHRpbmcgb2YgdGhpcyBlbnRyeS4KKwkJaWYgKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKQorCQkJUlRNUFVwZGF0ZUxlZ2FjeVR4U2V0dGluZygoVUNIQVIpcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSwgcEVudHJ5KTsKKwl9CisJZWxzZQorCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gVFJVRTsKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCisJLy8gIExldCBMaW5rIFN0YXR1cyBQYWdlIGRpc3BsYXkgZmlyc3QgaW5pdGlhbCByYXRlLgorCXBBZC0+TGFzdFR4UmF0ZSA9IChVU0hPUlQpKHBFbnRyeS0+SFRQaHlNb2RlLndvcmQpOworCS8vIFNlbGVjdCBEQUMgYWNjb3JkaW5nIHRvIEhUIG9yIExlZ2FjeQorCWlmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSAhPSAweDAwKQorCXsKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCAmVmFsdWUpOworCQlWYWx1ZSAmPSAofjB4MTgpOworCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKQorCQl7CisJCSAgICBWYWx1ZSB8PSAweDEwOworCQl9CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsIFZhbHVlKTsKKwl9CisJZWxzZQorCXsKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCAmVmFsdWUpOworCQlWYWx1ZSAmPSAofjB4MTgpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBWYWx1ZSk7CisJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IEZBTFNFKQorCXsKKwl9CisJZWxzZSBpZiAocEVudHJ5LT5NYXhSQW1wZHVGYWN0b3IgPT0gMCkKKwl7CisJICAgIC8vIElmIEhUIEFQIGRvZXNuJ3Qgc3VwcG9ydCBNYXhSQW1wZHVGYWN0b3IgPSAxLCB3ZSBuZWVkIHRvIHNldCBtYXggUFNEVSB0byAwLgorCSAgICAvLyBCZWNhdXNlIG91ciBJbml0IHZhbHVlIGlzIDEgYXQgTUFDUmVnVGFibGUuCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BWF9MRU5fQ0ZHLCAweDBmZmYpOworCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCS8vIFBhdGNoIGZvciBNYXJ2ZWwgQVAgdG8gZ2FpbiBoaWdoIHRocm91Z2hwdXQKKwkvLyBOZWVkIHRvIHNldCBhcyBmb2xsb3dpbmcsCisJLy8gMS4gU2V0IHR4b3AgaW4gcmVnaXN0ZXItRURDQV9BQzBfQ0ZHIGFzIDB4NjAKKwkvLyAyLiBTZXQgRW5UWFdyaXRlQmFja0RET05FIGluIHJlZ2lzdGVyLVdQRE1BX0dMT19DRkcgYXMgemVybworCS8vIDMuIFBCRl9NQVhfUENOVCBhcyAweDFGM0ZCRjlGCisJLy8gNC4ga2ljayBwZXIgdHdvIHBhY2tldHMgd2hlbiBkZXF1ZXVlCisJLy8KKwkvLyBUeG9wIGNhbiBvbmx5IGJlIG1vZGlmaWVkIHdoZW4gUkRHIGlzIG9mZiwgV01NIGlzIGRpc2FibGUgYW5kIFR4QnVyc3QgaXMgZW5hYmxlCisJLy8KKwkvLyBpZiAxLiBMZWdhY3kgQVAgV01NIG9uLCAgb3IgMi4gMTFuIEFQLCBBTVBEVSBkaXNhYmxlLiAgRm9yY2UgdHVybiBvZmYgYnVyc3Qgbm8gbWF0dGVyIHdoYXQgYkVuYWJsZVR4QnVyc3QgaXMuCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKCgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gRkFMU0UpICYmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpKSkKKwkJfHwgKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBUUlVFKSAmJiAocEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSA9PSBCQV9OT1RVU0UpKSkKKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgRURDQV9BQzBfQ0ZHLCAmRGF0YSk7CisJCURhdGEgICY9IDB4RkZGRkZGMDA7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgRGF0YSk7CisKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX01BWF9QQ05ULCAweDFGM0Y3RjlGKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhidXJzdCAxXG4iKSk7CisJfQorCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwlpZiAocEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QpCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIEVEQ0FfQUMwX0NGRywgJkRhdGEpOworCQlEYXRhICAmPSAweEZGRkZGRjAwOworCQlEYXRhICB8PSAweDYwOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIERhdGEpOworCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJOb3dBdGhlcm9zQnVyc3RPbiA9IFRSVUU7CisKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX01BWF9QQ05ULCAweDFGM0ZCRjlGKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhidXJzdCAyXG4iKSk7CisJfQorCWVsc2UKKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgRURDQV9BQzBfQ0ZHLCAmRGF0YSk7CisJCURhdGEgICY9IDB4RkZGRkZGMDA7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgRGF0YSk7CisKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX01BWF9QQ05ULCAweDFGM0Y3RjlGKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhidXJzdCAzXG4iKSk7CisJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJLy8gUmUtY2hlY2sgdG8gdHVybiBvbiBUWCBidXJzdCBvciBub3QuCisJaWYgKChwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJMYXN0QXRoZXJvcyA9PSBUUlVFKSAmJiAoKFNUQV9XRVBfT04ocEFkKSl8fChTVEFfVEtJUF9PTihwQWQpKSkpCisJeworCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJOZXh0RGlzYWJsZVJ4QkEgPSBUUlVFOworCQlpZiAocEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QpCisJCXsKKwkJICAgIFVJTlQzMiBNQUNWYWx1ZSA9IDA7CisJCQkvLyBGb3JjZSBkaXNhYmxlICBUWE9QIHZhbHVlIGluIHRoaXMgY2FzZS4gVGhlIHNhbWUgYWN0aW9uIGluIE1MTUVVcGRhdGVQcm90ZWN0IHRvby4KKwkJCS8vIEkgZGlkbid0IGNoYW5nZSBQQkZfTUFYX1BDTlQgc2V0dGluZy4KKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgRURDQV9BQzBfQ0ZHLCAmTUFDVmFsdWUpOworCQkJTUFDVmFsdWUgICY9IDB4RkZGRkZGMDA7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIE1BQ1ZhbHVlKTsKKwkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYk5vd0F0aGVyb3NCdXJzdE9uID0gRkFMU0U7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTmV4dERpc2FibGVSeEJBID0gRkFMU0U7CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTGFzdEF0aGVyb3MgPSBGQUxTRTsKKwlDT1BZX01BQ19BRERSKHBBZC0+Q29tbW9uQ2ZnLkxhc3RCc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhIXBBZC0+Yk5leHREaXNhYmxlUnhCQT0gJWQgXG4iLCBwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJOZXh0RGlzYWJsZVJ4QkEpKTsKKwkvLyBCU1NJRCBhZGQgaW4gb25lIE1BQyBlbnRyeSB0b28uICBCZWNhdXNlIGluIFR4LCBBU0lDIG5lZWQgdG8gY2hlY2sgQ2lwaGVyIGFuZCBJVi9FSVYsIEJBYml0bWFwCisJLy8gUHRoZXIgaW5mb3JtYXRpb24gaW4gTUFDVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0gaXMgbm90IG5lY2Vzc2FyeSBmb3IgZHJpdmVyLgorCS8vIE5vdGU6IEFzIFNUQSwgVGhlIE1BQ1RhYi5Db250ZW50W0JTU0lEX1dDSURdLiBQYWlyd2lzZUtleSBhbmQgU2hhcmVkIEtleSBmb3IgQlNTMCBhcmUgdGhlIHNhbWUuCisKKyAgICBpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzIDw9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKKyAgICB7CisgICAgICAgIHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCXBBZC0+U3RhQ2ZnLlByaXZhY3lGaWx0ZXIgPSBOZGlzODAyXzExUHJpdkZpbHRlckFjY2VwdEFsbDsKKwl9CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZDsKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCisgICAgLy8KKwkvLyBQYXRjaCBBdGhlcm9zIEFQIFRYIHdpbGwgYnJlYWtkb3duIGlzc3VlLgorCS8vIEFQIE1vZGVsOiBETGluayBEV0wtODIwMEFQCisJLy8KKwlpZiAoSU5GUkFfT04ocEFkKSAmJiBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpICYmIFNUQV9US0lQX09OKHBBZCkpCisJeworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9QQVJTRVJfQ0ZHLCAweDAxKTsKKwl9CisJZWxzZQorCXsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfUEFSU0VSX0NGRywgMHgwMCk7CisJfQorCisJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUyk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJaWYgKChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuYjIwNDBDb2V4aXN0U2NhblN1cCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTEpKQorCXsKKwkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NDQU5fMjA0MCk7CisJCUJ1aWxkRWZmZWN0ZWRDaGFubmVsTGlzdChwQWQpOworCX0KKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCURpc2Nvbm5lY3QgY3VycmVudCBCU1NJRAorCisJQXJndW1lbnRzOgorCQlwQWQJCQkJLSBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCUlzUmVxRnJvbUFQCQktIFJlcXVlc3QgZnJvbSBBUAorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisJCVdlIG5lZWQgbW9yZSBpbmZvcm1hdGlvbiB0byBrbm93IGl0J3MgdGhpcyByZXF1c3QgZnJvbSBBUC4KKwkJSWYgeWVzISB3ZSBuZWVkIHRvIGRvIGV4dHJhIGhhbmRsaW5nLCBmb3IgZXhhbXBsZSwgcmVtb3ZlIHRoZSBXUEEga2V5LgorCQlPdGhlcndpc2Ugb24gNC13YXkgaGFuZHNoYWtpbmcgd2lsbCBmYWllZCwgc2luY2UgdGhlIFdQQSBrZXkgZGlkbid0IGJlCisJCXJlbW92ZSB3aGlsZSBhdXRvIHJlY29ubmVjdC4KKwkJRGlzY29ubmVjdCByZXF1ZXN0IGZyb20gQVAsIGl0IG1lYW5zIHdlIHdpbGwgc3RhcnQgYWZyZXNoIDQtd2F5IGhhbmRzaGFraW5nCisJCW9uIFdQQSBtb2RlLgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIExpbmtEb3duKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOICBCT09MRUFOICAgICAgSXNSZXFGcm9tQVApCit7CisJVUNIQVIJCQkgICAgaSwgQnl0ZVZhbHVlID0gMDsKKworCS8vIERvIG5vdGhpbmcgaWYgbW9uaXRvciBtb2RlIGlzIG9uCisJaWYgKE1PTklUT1JfT04ocEFkKSkKKwkJcmV0dXJuOworCisjaWZkZWYgUkFMSU5LX0FURQorCS8vIE5vdGhpbmcgdG8gZG8gaW4gQVRFIG1vZGUuCisJaWYgKEFURV9PTihwQWQpKQorCQlyZXR1cm47CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisgICAgaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCXsKKwkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfU1RBX0xJTktET1dOX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExJTksgRE9XTiAhISFcbiIpKTsKKwlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQpOworCisjaWZkZWYgUlQyODYwCisgICAgaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkKKyAgICB7CisJICAgIEJPT0xFQU4gQ2FuY2VsbGVkOworICAgICAgICBwQWQtPk1sbWUuYlBzUG9sbFRpbWVyUnVubmluZyA9IEZBTFNFOworICAgICAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwJJkNhbmNlbGxlZCk7CisgICAgfQorCisgICAgaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCisgICAgeworICAgICAgICBBVVRPX1dBS0VVUF9TVFJVQyBBdXRvV2FrZXVwQ2ZnOworCQlBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKKyAgICAgICAgQXV0b1dha2V1cENmZy53b3JkID0gMDsKKwkgICAgUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOworICAgICAgICBPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKKyAgICB9CisKKyAgICBwQWQtPmJQQ0ljbGtPZmYgPSBGQUxTRTsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwlpZiAoQURIT0NfT04ocEFkKSkJCS8vIEFkaG9jIG1vZGUgbGluayBkb3duCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTElOSyBET1dOIDEhISFcbiIpKTsKKworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19BREhPQ19PTik7CisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7CisJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CisgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX0RPV047CisJCUJzc1RhYmxlRGVsZXRlRW50cnkoJnBBZC0+U2NhblRhYiwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTWFjVGFiLlNpemU9JWQgISEhXG4iLCBwQWQtPk1hY1RhYi5TaXplKSk7CisJfQorCWVsc2UJCQkJCS8vIEluZnJhIHN0cnVjdHVyZSBtb2RlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTElOSyBET1dOIDIhISFcbiIpKTsKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkvLyBETFMgdGVhciBkb3duIGZyYW1lIG11c3QgYmUgc2VudCBiZWZvcmUgbGluayBkb3duCisJCS8vIHNlbmQgRExTLVRFQVJfRE9XTiBtZXNzYWdlCisJCWlmIChwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwkJeworCQkJLy8gdGVhciBkb3duIGxvY2FsIGRscyB0YWJsZSBlbnRyeQorCQkJZm9yIChpPTA7IGk8TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQorCQkJeworCQkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpKQorCQkJCXsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX05PTkU7CisJCQkJCVJUTVBTZW5kRExTVGVhckRvd25GcmFtZShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQkJCX0KKwkJCX0KKworCQkJLy8gdGVhciBkb3duIHBlZXIgZGxzIHRhYmxlIGVudHJ5CisJCQlmb3IgKGk9TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCQkJeworCQkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09ICBETFNfRklOSVNIKSkKKwkJCQl7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19OT05FOworCQkJCQlSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJCQl9CisJCQl9CisJCX0KKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19JTkZSQV9PTik7CisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisKKwkJLy8gU2F2ZWQgbGFzdCBTU0lEIGZvciBsaW5rdXAgY29tcGFyaXNvbgorCQlwQWQtPkNvbW1vbkNmZy5MYXN0U3NpZExlbiA9IHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW47CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLkxhc3RTc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5MYXN0U3NpZExlbik7CisJCUNPUFlfTUFDX0FERFIocEFkLT5Db21tb25DZmcuTGFzdEJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCWlmIChwQWQtPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPT0gVFJVRSkKKwkJeworCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKKwkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CisgICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVCBFdmVudCBBIVxuIikpOworCQkJcEFkLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gRkFMU0U7CisJCX0KKwkJZWxzZQorCQl7CisgICAgICAgICAgICAvLworCQkJLy8gSWYgZGlzYXNzb2NpYXRpb24gcmVxdWVzdCBpcyBmcm9tIE5ESVMsIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBkZWxldGUgQlNTSUQgZnJvbSBlbnRyeS4KKwkJCS8vIE90aGVyd2lzZSBsb3N0IGJlYWNvbiBvciByZWNlaXZlIERlLUF1dGhlbnRpY2F0aW9uIGZyb20gQVAsCisJCQkvLyB0aGVuIHdlIHNob3VsZCBkZWxldGUgQlNTSUQgZnJvbSBCc3NUYWJsZS4KKwkJCS8vIElmIHdlIGRvbid0IGRlbGV0ZSBmcm9tIGVudHJ5LCByb2FtaW5nIHdpbGwgZmFpbC4KKwkJCS8vCisJCQlCc3NUYWJsZURlbGV0ZUVudHJ5KCZwQWQtPlNjYW5UYWIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJfQorCisJCS8vIHJlc3RvcmUgYmFjayB0byAtCisJCS8vICAgICAgMS4gbG9uZyBzbG90ICgyMCB1cykgb3Igc2hvcnQgc2xvdCAoOSB1cykgdGltZQorCQkvLyAgICAgIDIuIHR1cm4gb24vb2ZmIFJUUy9DVFMgYW5kL29yIENUUy10by1zZWxmIHByb3RlY3Rpb24KKwkJLy8gICAgICAzLiBzaG9ydCBwcmVhbWJsZQorCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19CR19QUk9URUNUSU9OX0lOVVNFRCk7CisKKwkJaWYgKHBBZC0+U3RhQ2ZnLkNDWEFkamFjZW50QVBSZXBvcnRGbGFnID09IFRSVUUpCisJCXsKKwkJCS8vCisJCQkvLyBSZWNvcmQgY3VycmVudCBBUCdzIGluZm9ybWF0aW9uLgorCQkJLy8gZm9yIGxhdGVyIHVzZWQgcmVwb3J0aW5nIEFkamFjZW50IEFQIHJlcG9ydC4KKwkJCS8vCisJCQlwQWQtPlN0YUNmZy5DQ1hBZGphY2VudEFQQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJCQlwQWQtPlN0YUNmZy5DQ1hBZGphY2VudEFQU3NpZExlbiA9IHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW47CisJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5DQ1hBZGphY2VudEFQU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUFNzaWRMZW4pOworCQkJQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5DQ1hBZGphY2VudEFQQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJfQorCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCQkvLyBDb3VudHJ5IElFIG9mIHRoZSBBUCB3aWxsIGJlIGV2YWx1YXRlZCBhbmQgd2lsbCBiZSB1c2VkLgorCQlpZiAocEFkLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUgIT0gUnQ4MDJfMTFfRF9Ob25lKQorCQl7CisJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGVbMF0sICZwQWQtPlN0YUNmZy5TdGFPcmlDb3VudHJ5Q29kZVswXSwgMik7CisJCQlwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPSBwQWQtPlN0YUNmZy5TdGFPcmlHZW9ncmFwaHk7CisJCQlCdWlsZENoYW5uZWxMaXN0RXgocEFkKTsKKwkJfQorI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKworCX0KKworCWZvciAoaT0xOyBpPE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCisJeworCQlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQ0xJID09IFRSVUUpCisJCQlNYWNUYWJsZURlbGV0ZUVudHJ5KHBBZCwgcEFkLT5NYWNUYWIuQ29udGVudFtpXS5BaWQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uQWRkcik7CisJfQorCisJcEFkLT5TdGFDZmcuQ0NYUW9zRUNXTWluCT0gNDsKKwlwQWQtPlN0YUNmZy5DQ1hRb3NFQ1dNYXgJPSAxMDsKKworCUFzaWNTZXRTbG90VGltZShwQWQsIFRSVUUpOyAvL0ZBTFNFKTsKKwlBc2ljU2V0RWRjYVBhcm0ocEFkLCBOVUxMKTsKKworCS8vIFNldCBMRUQKKwlSVE1QU2V0TEVEKHBBZCwgTEVEX0xJTktfRE9XTik7CisgICAgcEFkLT5MZWRJbmRpY2F0b3JTdHJlZ3RoID0gMHhGMDsKKyAgICBSVE1QU2V0U2lnbmFsTEVEKHBBZCwgLTEwMCk7CS8vIEZvcmNlIHNpZ25hbCBzdHJlbmd0aCBMZWQgdG8gYmUgdHVybmVkIG9mZiwgZmlybXdhcmUgaXMgbm90IGRvbmUgaXQuCisKKwkJQXNpY0Rpc2FibGVTeW5jKHBBZCk7CisKKwlwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCA9IDA7CisJcEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgPSAwOworCisJaWYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0lORlJBKQorCXsKKwkJLy8gUmVtb3ZlIFN0YUNmZyBJbmZvcm1hdGlvbiBhZnRlciBsaW5rIGRvd24KKwkJTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcuQnNzaWQsIE1BQ19BRERSX0xFTik7CisJCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7CisJCXBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4gPSAwOworCX0KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbywgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiA9IDA7CisJcEFkLT5NbG1lQXV4Lk5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJLy8gUmVzZXQgV1BBLVBTSyBzdGF0ZS4gT25seSByZXNldCB3aGVuIHN1cHBsaWNhbnQgZW5hYmxlZAorCWlmIChwQWQtPlN0YUNmZy5XcGFTdGF0ZSAhPSBTU19OT1RVU0UpCisJeworCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1NUQVJUOworCQkvLyBDbGVhciBSZXBsYXkgY291bnRlcgorCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCA4KTsKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQlpZiAocEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5EbHNSZXBsYXlDb3VudGVyLCA4KTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwl9CisKKworCS8vCisJLy8gaWYgbGluayBkb3duIGNvbWUgZnJvbSBBUCwgd2UgbmVlZCB0byByZW1vdmUgYWxsIFdQQSBrZXlzIG9uIFdQQSBtb2RlLgorCS8vIG90aGVyd2lzZSB3aWxsIGNhdXNlIDQtd2F5IGhhbmRzaGFraW5nIGZhaWxlZCwgc2luY2UgdGhlIFdQQSBrZXkgbm90IGVtcHR5LgorCS8vCisJaWYgKChJc1JlcUZyb21BUCkgJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkpCisJeworCQkvLyBSZW1vdmUgYWxsIFdQQSBrZXlzCisJCVJUTVBXUEFSZW1vdmVBbGxLZXlzKHBBZCk7CisJfQorCisJLy8gODAyLjF4IHBvcnQgY29udHJvbAorI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkvLyBQcmV2ZW50IGNsZWFyIFBvcnRTZWN1cmVkIGhlcmUgd2l0aCBzdGF0aWMgV0VQCisJLy8gTmV0d29ya01hbmdlciBzZXQgc2VjdXJpdHkgcG9saWN5IGZpcnN0IHRoZW4gc2V0IFNTSUQgdG8gY29ubmVjdCBBUC4KKwlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICYmCisJCShwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpICYmCisJCShwQWQtPlN0YUNmZy5JRUVFODAyMVggPT0gRkFMU0UpKQorCXsKKwkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwl9CisJZWxzZQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwl7CisJCXBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworCQlwQWQtPlN0YUNmZy5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXI4MDIxeFdFUDsKKwl9CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUG9ydFNlY3VyZWQgPSBwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZDsKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCisJcEFkLT5TdGFDZmcuTWljRXJyQ250ID0gMDsKKworCS8vIFR1cm4gb2ZmIENraXAgY29udHJvbCBmbGFnCisJcEFkLT5TdGFDZmcuYkNraXBPbiA9IEZBTFNFOworCXBBZC0+U3RhQ2ZnLkNDWEVuYWJsZSA9IEZBTFNFOworCisgICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKKwkvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24gdG8gbGluayBpcyB1cAorCXBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX0RPV047CisKKyAgICBwQWQtPlN0YUNmZy5BZGhvY0JPbmx5Sm9pbmVkID0gRkFMU0U7CisJcEFkLT5TdGFDZmcuQWRob2NCR0pvaW5lZCA9IEZBTFNFOworCXBBZC0+U3RhQ2ZnLkFkaG9jMjBOSm9pbmVkID0gRkFMU0U7CisgICAgcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBGQUxTRTsKKworCS8vIFJlc2V0IHRoZSBDdXJyZW50IEFQJ3MgSVAgYWRkcmVzcworCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLkFpcm9uZXRJUEFkZHJlc3MsIDQpOworCisJLy8gQ2xlYW4gYXNzb2NpYXRpb24gaW5mb3JtYXRpb24KKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5TdGFDZmcuQXNzb2NJbmZvLCBzaXplb2YoTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04pKTsKKwlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uTGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OKTsKKwlwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiA9IDA7CisJcEFkLT5TdGFDZmcuUmVzVmFySUVMZW4gPSAwOworCisJLy8KKwkvLyBSZXNldCBSU1NJIHZhbHVlIGFmdGVyIGxpbmsgZG93bgorCS8vCisJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCA9IDA7CisJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMFg4ID0gMDsKKwlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxID0gMDsKKwlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxWDggPSAwOworCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTIgPSAwOworCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTJYOCA9IDA7CisKKwkvLyBSZXN0b3JlIE1sbWVSYXRlCisJcEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPSBwQWQtPkNvbW1vbkNmZy5CYXNpY01sbWVSYXRlOworCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBwQWQtPkNvbW1vbkNmZy5CYXNpY01sbWVSYXRlOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJLy8KKwkvLyBBZnRlciBMaW5rIGRvd24sIHJlc2V0IHBpZ2d5LWJhY2sgc2V0dGluZyBpbiBBU0lDLiBEaXNhYmxlIFJERy4KKwkvLworCWlmIChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfNDApCisJeworCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV18yMDsKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQnl0ZVZhbHVlKTsKKwkJQnl0ZVZhbHVlICY9ICh+MHgxOCk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJ5dGVWYWx1ZSk7CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCS8vIFJlc2V0IERBQworCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgJkJ5dGVWYWx1ZSk7CisJQnl0ZVZhbHVlICY9ICh+MHgxOCk7CisJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikKKwl7CisJCUJ5dGVWYWx1ZSB8PSAweDEwOworCX0KKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBCeXRlVmFsdWUpOworCisJUlRNUFNldFBpZ2d5QmFjayhwQWQsRkFMU0UpOworCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BJR0dZQkFDS19JTlVTRUQpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LndvcmQgPSBwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkud29yZDsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCS8vIFJlc3RvcmUgYWxsIHNldHRpbmdzIGluIHRoZSBmb2xsb3dpbmcuCisJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCAwLCAoQUxMTl9TRVRQUk9URUNUfENDS1NFVFBST1RFQ1R8T0ZETVNFVFBST1RFQ1QpLCBUUlVFLCBGQUxTRSk7CisJQXNpY0Rpc2FibGVSREcocEFkKTsKKwlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJDdXJyZW50QXRoZXJvcyA9IEZBTFNFOworCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYk5vd0F0aGVyb3NCdXJzdE9uID0gRkFMU0U7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0NBTl8yMDQwKTsKKwlwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC53b3JkID0gMDsKKwlUcmlFdmVudEluaXQocEFkKTsKKwlmb3IgKGkgPSAwOyBpIDwgKHBBZC0+Q2hhbm5lbExpc3ROdW0gLSAxKTsgaSsrKQorCXsKKwkJcEFkLT5DaGFubmVsTGlzdFtpXS5iRWZmZWN0ZWRDaGFubmVsID0gRkFMU0U7CisJfQorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BWF9MRU5fQ0ZHLCAweDFmZmYpOworCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpOworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2lmbmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApIHsKKwkJdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworCQkvL3NlbmQgZGlzYXNzb2NpYXRlIGV2ZW50IHRvIHdwYV9zdXBwbGljYW50CisJCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKwkJd3JxdS5kYXRhLmZsYWdzID0gUlRfRElTQVNTT0NfRVZFTlRfRkxBRzsKKwkJd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBOVUxMKTsKKwl9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCXsKKwkJdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworCQltZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7CisJCXdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKKwl9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgSXRlcmF0ZU9uQnNzVGFiKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCU1MTUVfU1RBUlRfUkVRX1NUUlVDVCAgIFN0YXJ0UmVxOworCU1MTUVfSk9JTl9SRVFfU1RSVUNUICAgIEpvaW5SZXE7CisJVUxPTkcgICAgICAgICAgICAgICAgICAgQnNzSWR4OworCisJLy8gQ2hhbmdlIHRoZSB3ZXBzdGF0dXMgdG8gb3JpZ2luYWwgd2Vwc3RhdHVzCisJcEFkLT5TdGFDZmcuV2VwU3RhdHVzICAgPSBwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzOworCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgID0gcEFkLT5TdGFDZmcuT3JpZ1dlcFN0YXR1czsKKwlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9IHBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXM7CisKKwlCc3NJZHggPSBwQWQtPk1sbWVBdXguQnNzSWR4OworCWlmIChCc3NJZHggPCBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOcikKKwl7CisJCS8vIENoZWNrIGNpcGhlciBzdWl0ZSwgQVAgbXVzdCBoYXZlIG1vcmUgc2VjdXJlZCBjaXBoZXIgdGhhbiBzdGF0aW9uIHNldHRpbmcKKwkJLy8gU2V0IHRoZSBQYWlyd2lzZSBhbmQgR3JvdXAgY2lwaGVyIHRvIG1hdGNoIHRoZSBpbnRlbmRlZCBBUCBzZXR0aW5nCisJCS8vIFdlIGNhbiBvbmx5IGNvbm5lY3QgdG8gQVAgd2l0aCBsZXNzIHNlY3VyZWQgY2lwaGVyIHNldHRpbmcKKwkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKQorCQl7CisJCQlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLkdyb3VwQ2lwaGVyOworCisJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLlBhaXJDaXBoZXIpCisJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLlBhaXJDaXBoZXI7CisJCQllbHNlIGlmIChwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5QYWlyQ2lwaGVyQXV4ICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKKwkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlckF1eDsKKwkJCWVsc2UJLy8gVGhlcmUgaXMgbm8gUGFpckNpcGhlciBBdXgsIGRvd25ncmFkZSBvdXIgY2FwYWJpbGl0eSB0byBUS0lQCisJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJCX0KKwkJZWxzZSBpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKKwkJeworCQkJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuR3JvdXBDaXBoZXI7CisKKwkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlBhaXJDaXBoZXIpCisJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5QYWlyQ2lwaGVyOworCQkJZWxzZSBpZiAocEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlBhaXJDaXBoZXJBdXggIT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQorCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlckF1eDsKKwkJCWVsc2UJLy8gVGhlcmUgaXMgbm8gUGFpckNpcGhlciBBdXgsIGRvd25ncmFkZSBvdXIgY2FwYWJpbGl0eSB0byBUS0lQCisJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisKKwkJCS8vIFJTTiBjYXBhYmlsaXR5CisJCQlwQWQtPlN0YUNmZy5Sc25DYXBhYmlsaXR5ID0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlJzbkNhcGFiaWxpdHk7CisJCX0KKworCQkvLyBTZXQgTWl4IGNpcGhlciBmbGFnCisJCXBBZC0+U3RhQ2ZnLmJNaXhDaXBoZXIgPSAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBwQWQtPlN0YUNmZy5Hcm91cENpcGhlcikgPyBGQUxTRSA6IFRSVUU7CisJCWlmIChwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyID09IFRSVUUpCisJCXsKKwkJCS8vIElmIG1peCBjaXBoZXIsIHJlLWJ1aWxkIFJTTklFCisJCQlSVE1QTWFrZVJTTklFKHBBZCwgcEFkLT5TdGFDZmcuQXV0aE1vZGUsIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cywgMCk7CisJCX0KKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gaXRlcmF0ZSBCU1MgJWxkIG9mICVkXG4iLCBCc3NJZHgsIHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc05yKSk7CisJCUpvaW5QYXJtRmlsbChwQWQsICZKb2luUmVxLCBCc3NJZHgpOworCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfSk9JTl9SRVEsIHNpemVvZihNTE1FX0pPSU5fUkVRX1NUUlVDVCksCisJCQkJCSZKb2luUmVxKTsKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9KT0lOOworCX0KKwllbHNlIGlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBbGwgQlNTIGZhaWw7IHN0YXJ0IGEgbmV3IEFESE9DIChTc2lkPSVzKS4uLlxuIixwQWQtPk1sbWVBdXguU3NpZCkpOworCQlTdGFydFBhcm1GaWxsKHBBZCwgJlN0YXJ0UmVxLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOworCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU1RBUlRfUkVRLCBzaXplb2YoTUxNRV9TVEFSVF9SRVFfU1RSVUNUKSwgJlN0YXJ0UmVxKTsKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9TVEFSVDsKKwl9CisJZWxzZSAvLyBubyBtb3JlIEJTUworCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFsbCByb2FtaW5nIGZhaWxlZCwgc3RheSBAIGNoICMlZFxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKKwkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJfQorfQorCisvLyBmb3IgcmUtYXNzb2NpYXRpb24gb25seQorLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCitWT0lEIEl0ZXJhdGVPbkJzc1RhYjIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTUxNRV9SRUFTU09DX1JFUV9TVFJVQ1QgUmVhc3NvY1JlcTsKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBCc3NJZHg7CisJQlNTX0VOVFJZICAgICAgICAgICAgICAgKnBCc3M7CisKKwlCc3NJZHggPSBwQWQtPk1sbWVBdXguUm9hbUlkeDsKKwlwQnNzID0gJnBBZC0+TWxtZUF1eC5Sb2FtVGFiLkJzc0VudHJ5W0Jzc0lkeF07CisKKwlpZiAoQnNzSWR4IDwgcEFkLT5NbG1lQXV4LlJvYW1UYWIuQnNzTnIpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gaXRlcmF0ZSBCU1MgJWxkIG9mICVkXG4iLCBCc3NJZHgsIHBBZC0+TWxtZUF1eC5Sb2FtVGFiLkJzc05yKSk7CisKKwkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQnNzLT5DaGFubmVsLCBGQUxTRSk7CisJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBCc3MtPkNoYW5uZWwpOworCisJCS8vIHJlYXNzb2NpYXRlIG1lc3NhZ2UgaGFzIHRoZSBzYW1lIHN0cnVjdHVyZSBhcyBhc3NvY2lhdGUgbWVzc2FnZQorCQlBc3NvY1Bhcm1GaWxsKHBBZCwgJlJlYXNzb2NSZXEsIHBCc3MtPkJzc2lkLCBwQnNzLT5DYXBhYmlsaXR5SW5mbywKKwkJCQkJICBBU1NPQ19USU1FT1VULCBwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQpOworCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1JFQVNTT0NfUkVRLAorCQkJCQlzaXplb2YoTUxNRV9SRUFTU09DX1JFUV9TVFJVQ1QpLCAmUmVhc3NvY1JlcSk7CisKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9SRUFTU09DOworCX0KKwllbHNlIC8vIG5vIG1vcmUgQlNTCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQWxsIGZhc3Qgcm9hbWluZyBmYWlsZWQsIGJhY2sgdG8gY2ggIyVkXG4iLHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgSm9pblBhcm1GaWxsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE9VVCBNTE1FX0pPSU5fUkVRX1NUUlVDVCAqSm9pblJlcSwKKwlJTiBVTE9ORyBCc3NJZHgpCit7CisJSm9pblJlcS0+QnNzSWR4ID0gQnNzSWR4OworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBTY2FuUGFybUZpbGwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gT1VUIE1MTUVfU0NBTl9SRVFfU1RSVUNUICpTY2FuUmVxLAorCUlOIENIQVIgU3NpZFtdLAorCUlOIFVDSEFSIFNzaWRMZW4sCisJSU4gVUNIQVIgQnNzVHlwZSwKKwlJTiBVQ0hBUiBTY2FuVHlwZSkKK3sKKyAgICBOZGlzWmVyb01lbW9yeShTY2FuUmVxLT5Tc2lkLCBNQVhfTEVOX09GX1NTSUQpOworCVNjYW5SZXEtPlNzaWRMZW4gPSBTc2lkTGVuOworCU5kaXNNb3ZlTWVtb3J5KFNjYW5SZXEtPlNzaWQsIFNzaWQsIFNzaWRMZW4pOworCVNjYW5SZXEtPkJzc1R5cGUgPSBCc3NUeXBlOworCVNjYW5SZXEtPlNjYW5UeXBlID0gU2NhblR5cGU7Cit9CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIERsc1Bhcm1GaWxsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE9VVCBNTE1FX0RMU19SRVFfU1RSVUNUICpwRGxzUmVxLAorCUlOIFBSVF84MDJfMTFfRExTIHBEbHMsCisJSU4gVVNIT1JUIHJlYXNvbikKK3sKKwlwRGxzUmVxLT5wRExTID0gcERsczsKKwlwRGxzUmVxLT5SZWFzb24gPSByZWFzb247Cit9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFN0YXJ0UGFybUZpbGwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gT1VUIE1MTUVfU1RBUlRfUkVRX1NUUlVDVCAqU3RhcnRSZXEsCisJSU4gQ0hBUiBTc2lkW10sCisJSU4gVUNIQVIgU3NpZExlbikKK3sKKwlBU1NFUlQoU3NpZExlbiA8PSBNQVhfTEVOX09GX1NTSUQpOworCU5kaXNNb3ZlTWVtb3J5KFN0YXJ0UmVxLT5Tc2lkLCBTc2lkLCBTc2lkTGVuKTsKKwlTdGFydFJlcS0+U3NpZExlbiA9IFNzaWRMZW47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEF1dGhQYXJtRmlsbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBPVVQgTUxNRV9BVVRIX1JFUV9TVFJVQ1QgKkF1dGhSZXEsCisJSU4gUFVDSEFSIHBBZGRyLAorCUlOIFVTSE9SVCBBbGcpCit7CisJQ09QWV9NQUNfQUREUihBdXRoUmVxLT5BZGRyLCBwQWRkcik7CisJQXV0aFJlcS0+QWxnID0gQWxnOworCUF1dGhSZXEtPlRpbWVvdXQgPSBBVVRIX1RJTUVPVVQ7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworI2lmZGVmIFJUMjg2MAorVk9JRCBDb21wb3NlUHNQb2xsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlBzUG9sbEZyYW1lLCBzaXplb2YoUFNQT0xMX0ZSQU1FKSk7CisJcEFkLT5Qc1BvbGxGcmFtZS5GQy5UeXBlID0gQlRZUEVfQ05UTDsKKwlwQWQtPlBzUG9sbEZyYW1lLkZDLlN1YlR5cGUgPSBTVUJUWVBFX1BTX1BPTEw7CisJcEFkLT5Qc1BvbGxGcmFtZS5BaWQgPSBwQWQtPlN0YUFjdGl2ZS5BaWQgfCAweEMwMDA7CisJQ09QWV9NQUNfQUREUihwQWQtPlBzUG9sbEZyYW1lLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJQ09QWV9NQUNfQUREUihwQWQtPlBzUG9sbEZyYW1lLlRhLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKK30KKworLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCitWT0lEIENvbXBvc2VOdWxsRnJhbWUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTmRpc1plcm9NZW1vcnkoJnBBZC0+TnVsbEZyYW1lLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCXBBZC0+TnVsbEZyYW1lLkZDLlR5cGUgPSBCVFlQRV9EQVRBOworCXBBZC0+TnVsbEZyYW1lLkZDLlN1YlR5cGUgPSBTVUJUWVBFX05VTExfRlVOQzsKKwlwQWQtPk51bGxGcmFtZS5GQy5Ub0RzID0gMTsKKwlDT1BZX01BQ19BRERSKHBBZC0+TnVsbEZyYW1lLkFkZHIxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJQ09QWV9NQUNfQUREUihwQWQtPk51bGxGcmFtZS5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJQ09QWV9NQUNfQUREUihwQWQtPk51bGxGcmFtZS5BZGRyMywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisKKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVByZS1idWlsZCBhIEJFQUNPTiBmcmFtZSBpbiB0aGUgc2hhcmVkIG1lbW9yeQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVUxPTkcgTWFrZUlic3NCZWFjb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUNIQVIgICAgICAgICBEc0xlbiA9IDEsIElic3NMZW4gPSAyOworCVVDSEFSICAgICAgICAgTG9jYWxFcnBJZVszXSA9IHtJRV9FUlAsIDEsIDB4MDR9OworCUhFQURFUl84MDJfMTEgQmNuSGRyOworCVVTSE9SVCAgICAgICAgQ2FwYWJpbGl0eUluZm87CisJTEFSR0VfSU5URUdFUiBGYWtlVGltZXN0YW1wOworCVVMT05HICAgICAgICAgRnJhbWVMZW4gPSAwOworCVBUWFdJX1NUUlVDCSAgcFR4V0kgPSAmcEFkLT5CZWFjb25UeFdJOworCUNIQVIgICAgICAgICAqcEJlYWNvbkZyYW1lID0gcEFkLT5CZWFjb25CdWY7CisJQk9PTEVBTiAgICAgICBQcml2YWN5OworCVVDSEFSICAgICAgICAgU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJVUNIQVIgICAgICAgICBTdXBSYXRlTGVuID0gMDsKKwlVQ0hBUiAgICAgICAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSICAgICAgICAgRXh0UmF0ZUxlbiA9IDA7CisJVUNIQVIgICAgICAgICBSU05JZSA9IElFX1dQQTsKKworCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCKSAmJiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA8PSAxNCkpCisJeworCQlTdXBSYXRlWzBdID0gMHg4MjsgLy8gMSBtYnBzCisJCVN1cFJhdGVbMV0gPSAweDg0OyAvLyAyIG1icHMKKwkJU3VwUmF0ZVsyXSA9IDB4OGI7IC8vIDUuNSBtYnBzCisJCVN1cFJhdGVbM10gPSAweDk2OyAvLyAxMSBtYnBzCisJCVN1cFJhdGVMZW4gPSA0OworCQlFeHRSYXRlTGVuID0gMDsKKwl9CisJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQorCXsKKwkJU3VwUmF0ZVswXSAgPSAweDhDOyAgICAvLyA2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCVN1cFJhdGVbMV0gID0gMHgxMjsgICAgLy8gOSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQlTdXBSYXRlWzJdICA9IDB4OTg7ICAgIC8vIDEyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCVN1cFJhdGVbM10gID0gMHgyNDsgICAgLy8gMTggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJU3VwUmF0ZVs0XSAgPSAweGIwOyAgICAvLyAyNCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQorCQlTdXBSYXRlWzVdICA9IDB4NDg7ICAgIC8vIDM2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCVN1cFJhdGVbNl0gID0gMHg2MDsgICAgLy8gNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJU3VwUmF0ZVs3XSAgPSAweDZjOyAgICAvLyA1NCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQlTdXBSYXRlTGVuICA9IDg7CisJCUV4dFJhdGVMZW4gID0gMDsKKworCQkvLworCQkvLyBBbHNvIFVwZGF0ZSBNbG1lUmF0ZSAmIFJ0c1JhdGUgZm9yIEcgb25seSAmIEEgb25seQorCQkvLworCQlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IFJBVEVfNjsKKwkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfNjsKKwkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTUzBNY2FzdF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOworCX0KKwllbHNlCisJeworCQlTdXBSYXRlWzBdID0gMHg4MjsgLy8gMSBtYnBzCisJCVN1cFJhdGVbMV0gPSAweDg0OyAvLyAyIG1icHMKKwkJU3VwUmF0ZVsyXSA9IDB4OGI7IC8vIDUuNSBtYnBzCisJCVN1cFJhdGVbM10gPSAweDk2OyAvLyAxMSBtYnBzCisJCVN1cFJhdGVMZW4gPSA0OworCisJCUV4dFJhdGVbMF0gID0gMHgwQzsgICAgLy8gNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywKKwkJRXh0UmF0ZVsxXSAgPSAweDEyOyAgICAvLyA5IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCUV4dFJhdGVbMl0gID0gMHgxODsgICAgLy8gMTIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsCisJCUV4dFJhdGVbM10gID0gMHgyNDsgICAgLy8gMTggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJRXh0UmF0ZVs0XSAgPSAweDMwOyAgICAvLyAyNCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywKKwkJRXh0UmF0ZVs1XSAgPSAweDQ4OyAgICAvLyAzNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQlFeHRSYXRlWzZdICA9IDB4NjA7ICAgIC8vIDQ4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCUV4dFJhdGVbN10gID0gMHg2YzsgICAgLy8gNTQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJRXh0UmF0ZUxlbiAgPSA4OworCX0KKworCXBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gPSBTdXBSYXRlTGVuOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQWN0aXZlLlN1cFJhdGUsIFN1cFJhdGUsIFN1cFJhdGVMZW4pOworCXBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4gPSBFeHRSYXRlTGVuOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQWN0aXZlLkV4dFJhdGUsIEV4dFJhdGUsIEV4dFJhdGVMZW4pOworCisJLy8gY29tcG9zZSBJQlNTIGJlYWNvbiBmcmFtZQorCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQmNuSGRyLCBTVUJUWVBFX0JFQUNPTiwgMCwgQlJPQURDQVNUX0FERFIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwlQcml2YWN5ID0gKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKSB8fAorCQkJICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpIHx8CisJCQkgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCk7CisJQ2FwYWJpbGl0eUluZm8gPSBDQVBfR0VORVJBVEUoMCwgMSwgUHJpdmFjeSwgKHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZVNob3J0KSwgMCwgMCk7CisKKwlNYWtlT3V0Z29pbmdGcmFtZShwQmVhY29uRnJhbWUsICAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKwkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksICAgICAgICAgICAmQmNuSGRyLAorCQkJCQkgIFRJTUVTVEFNUF9MRU4sICAgICAgICAgICAgICAgICAgICZGYWtlVGltZXN0YW1wLAorCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QsCisJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNhcGFiaWxpdHlJbmZvLAorCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTc2lkSWUsCisJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sCisJCQkJCSAgcEFkLT5Db21tb25DZmcuU3NpZExlbiwgICAgICAgICAgcEFkLT5Db21tb25DZmcuU3NpZCwKKwkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUllLAorCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdXBSYXRlTGVuLAorCQkJCQkgIFN1cFJhdGVMZW4sICAgICAgICAgICAgICAgICAgICAgIFN1cFJhdGUsCisJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRzSWUsCisJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRzTGVuLAorCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5DaGFubmVsLAorCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJYnNzSWUsCisJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJklic3NMZW4sCisJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+U3RhQWN0aXZlLkF0aW1XaW4sCisJCQkJCSAgRU5EX09GX0FSR1MpOworCisJLy8gYWRkIEVSUF9JRSBhbmQgRVhUX1JBRSBJRSBvZiBpbiA4MDIuMTFnCisJaWYgKEV4dFJhdGVMZW4pCisJeworCQlVTE9ORwl0bXA7CisKKwkJTWFrZU91dGdvaW5nRnJhbWUocEJlYWNvbkZyYW1lICsgRnJhbWVMZW4sICAgICAgICAgJnRtcCwKKwkJCQkJCSAgMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxFcnBJZSwKKwkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkV4dFJhdGVJZSwKKwkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkV4dFJhdGVMZW4sCisJCQkJCQkgIEV4dFJhdGVMZW4sICAgICAgICAgICAgICAgICAgICAgIEV4dFJhdGUsCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJRnJhbWVMZW4gKz0gdG1wOworCX0KKworCS8vIElmIGFkaG9jIHNlY3J1aXR5IGlzIHNldCBmb3IgV1BBLU5vbmUsIGFwcGVuZCB0aGUgY2lwaGVyIHN1aXRlIElFCisJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisJeworCQlVTE9ORyB0bXA7CisgICAgICAgIFJUTVBNYWtlUlNOSUUocEFkLCBwQWQtPlN0YUNmZy5BdXRoTW9kZSwgcEFkLT5TdGFDZmcuV2VwU3RhdHVzLCBCU1MwKTsKKworCQlNYWtlT3V0Z29pbmdGcmFtZShwQmVhY29uRnJhbWUgKyBGcmFtZUxlbiwgICAgICAgIAkmdG1wLAorCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkmUlNOSWUsCisJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkmcEFkLT5TdGFDZmcuUlNOSUVfTGVuLAorCQkJCQkJICBwQWQtPlN0YUNmZy5SU05JRV9MZW4sICAgICAgCQlwQWQtPlN0YUNmZy5SU05fSUUsCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJRnJhbWVMZW4gKz0gdG1wOworCX0KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKKwl7CisJCVVMT05HIFRtcExlbjsKKwkJVUNIQVIgSHRMZW4sIEh0TGVuMTsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJSFRfQ0FQQUJJTElUWV9JRSBIdENhcGFiaWxpdHlUbXA7CisJCUFERF9IVF9JTkZPX0lFCWFkZEhUSW5mb1RtcDsKKwkJVVNIT1JUCWIybFRtcCwgYjJsVG1wMjsKKyNlbmRpZgorCisJCS8vIGFkZCBIVCBDYXBhYmlsaXR5IElFCisJCUh0TGVuID0gc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSk7CisJCUh0TGVuMSA9IHNpemVvZihwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8pOworI2lmbmRlZiBSVF9CSUdfRU5ESUFOCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBCZWFjb25GcmFtZStGcmFtZUxlbiwJJlRtcExlbiwKKwkJCQkJCSAgMSwJCQkJCQkmSHRDYXBJZSwKKwkJCQkJCSAgMSwJCQkJCQkmSHRMZW4sCisJCQkJCQkgIEh0TGVuLAkJCQkJJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwKKwkJCQkJCSAgMSwJCQkJCQkmQWRkSHRJbmZvSWUsCisJCQkJCQkgIDEsCQkJCQkJJkh0TGVuMSwKKwkJCQkJCSAgSHRMZW4xLAkJCQkJJnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbywKKwkJCQkJCSAgRU5EX09GX0FSR1MpOworI2Vsc2UKKwkJTmRpc01vdmVNZW1vcnkoJkh0Q2FwYWJpbGl0eVRtcCwgJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwgSHRMZW4pOworCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pKTsKKwkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSk7CisKKwkJTmRpc01vdmVNZW1vcnkoJmFkZEhUSW5mb1RtcCwgJnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbywgSHRMZW4xKTsKKwkJKihVU0hPUlQgKikoJmFkZEhUSW5mb1RtcC5BZGRIdEluZm8yKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmYWRkSFRJbmZvVG1wLkFkZEh0SW5mbzIpKTsKKwkJKihVU0hPUlQgKikoJmFkZEhUSW5mb1RtcC5BZGRIdEluZm8zKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmYWRkSFRJbmZvVG1wLkFkZEh0SW5mbzMpKTsKKworCQlNYWtlT3V0Z29pbmdGcmFtZShwQmVhY29uRnJhbWUrRnJhbWVMZW4sCSZUbXBMZW4sCisJCQkJCQkgIDEsCQkJCQkJJkh0Q2FwSWUsCisJCQkJCQkgIDEsCQkJCQkJJkh0TGVuLAorCQkJCQkJICBIdExlbiwJCQkJCSZIdENhcGFiaWxpdHlUbXAsCisJCQkJCQkgIDEsCQkJCQkJJkFkZEh0SW5mb0llLAorCQkJCQkJICAxLAkJCQkJCSZIdExlbjEsCisJCQkJCQkgIEh0TGVuMSwJCQkJCSZhZGRIVEluZm9UbXAsCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKKyNlbmRpZgorCQlGcmFtZUxlbiArPSBUbXBMZW47CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJLy9iZWFjb24gdXNlIHJlc2VydmVkIFdDSUQgMHhmZgorICAgIGlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCisgICAgeworCVJUTVBXcml0ZVR4V0kocEFkLCBwVHhXSSwgRkFMU0UsIEZBTFNFLCAgVFJVRSwgRkFMU0UsIEZBTFNFLCBUUlVFLCAwLCAweGZmLCBGcmFtZUxlbiwKKwkJUElEX01HTVQsIFBJRF9CRUFDT04sIFJBVEVfMSwgSUZTX0hUVFhPUCwgRkFMU0UsICZwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBTZXQgdG8gdXNlIDFNYnBzIGZvciBBZGhvYyBiZWFjb24uCisJCUhUVFJBTlNNSVRfU0VUVElORyBUcmFuc21pdDsKKyAgICAgICAgVHJhbnNtaXQud29yZCA9IDA7CisgICAgICAgIFJUTVBXcml0ZVR4V0kocEFkLCBwVHhXSSwgRkFMU0UsIEZBTFNFLCAgVFJVRSwgRkFMU0UsIEZBTFNFLCBUUlVFLCAwLCAweGZmLCBGcmFtZUxlbiwKKyAgICAJCVBJRF9NR01ULCBQSURfQkVBQ09OLCBSQVRFXzEsIElGU19IVFRYT1AsIEZBTFNFLCAmVHJhbnNtaXQpOworICAgIH0KKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCBwQmVhY29uRnJhbWUsIERJUl9XUklURSwgRkFMU0UpOworCVJUTVBXSUVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeFdJLCBUWVBFX1RYV0kpOworI2VuZGlmCisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYWtlSWJzc0JlYWNvbiAobGVuPSVsZCksIFN1cFJhdGVMZW49JWQsIEV4dFJhdGVMZW49JWQsIENoYW5uZWw9JWQsIFBoeU1vZGU9JWRcbiIsCisJCQkJCUZyYW1lTGVuLCBTdXBSYXRlTGVuLCBFeHRSYXRlTGVuLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKSk7CisJcmV0dXJuIEZyYW1lTGVuOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2Rscy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvZGxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhmYjI4OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2Rscy5jCkBAIC0wLDAgKzEsMjIwMSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICBkbHMuYworCisgICAgQWJzdHJhY3Q6CisgICAgSGFuZGxlIFdNTS1ETFMgc3RhdGUgbWFjaGluZQorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBSb3J5IENoZW4gICAwMi0xNC0yMDA2CisJQXJ2aW4gVGFpCTA2LTAzLTIwMDgJICBNb2RpZmllZCBmb3IgUlQyOHh4CisgKi8KKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIGRscyBzdGF0ZSBtYWNoaW5lIGluaXQsIGluY2x1ZGluZyBzdGF0ZSB0cmFuc2l0aW9uIGFuZCB0aW1lciBpbml0CisgICAgUGFyYW1ldGVyczoKKyAgICAgICAgU20gLSBwb2ludGVyIHRvIHRoZSBkbHMgc3RhdGUgbWFjaGluZQorICAgIE5vdGU6CisgICAgICAgIFRoZSBzdGF0ZSBtYWNoaW5lIGxvb2tzIGxpa2UgdGhpcworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRExTX0lETEUKKyAgICBNVDJfTUxNRV9ETFNfUkVRVUVTVCAgIE1sbWVEbHNSZXFBY3Rpb24KKyAgICBNVDJfUEVFUl9ETFNfUkVRVUVTVCAgIFBlZXJEbHNSZXFBY3Rpb24KKyAgICBNVDJfUEVFUl9ETFNfUkVTUE9OU0UgIFBlZXJEbHNSc3BBY3Rpb24KKyAgICBNVDJfTUxNRV9ETFNfVEVBUkRPV04gIE1sbWVUZWFyRG93bkFjdGlvbgorICAgIE1UMl9QRUVSX0RMU19URUFSRE9XTiAgUGVlclRlYXJEb3duQWN0aW9uCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLwordm9pZCBEbHNTdGF0ZU1hY2hpbmVJbml0KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFNUQVRFX01BQ0hJTkUgKlNtLAorICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKK3sKKwlVQ0hBUglpOworCisgICAgU3RhdGVNYWNoaW5lSW5pdChTbSwgKFNUQVRFX01BQ0hJTkVfRlVOQyopVHJhbnMsIE1BWF9ETFNfU1RBVEUsIE1BWF9ETFNfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIERMU19JRExFLCBETFNfTUFDSElORV9CQVNFKTsKKworICAgIC8vIHRoZSBmaXJzdCBjb2x1bW4KKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIERMU19JRExFLCBNVDJfTUxNRV9ETFNfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVEbHNSZXFBY3Rpb24pOworICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgRExTX0lETEUsIE1UMl9QRUVSX0RMU19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRsc1JlcUFjdGlvbik7CisgICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBETFNfSURMRSwgTVQyX1BFRVJfRExTX1JTUCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGxzUnNwQWN0aW9uKTsKKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIERMU19JRExFLCBNVDJfTUxNRV9ETFNfVEVBUl9ET1dOLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVEbHNUZWFyRG93bkFjdGlvbik7CisgICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBETFNfSURMRSwgTVQyX1BFRVJfRExTX1RFQVJfRE9XTiwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGxzVGVhckRvd25BY3Rpb24pOworCisJZm9yIChpPTA7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwl7CisJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLnBBZCA9IHBBZDsKKwkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKERsc1RpbWVvdXRBY3Rpb24pLCBwQWQsIEZBTFNFKTsKKwl9Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lRGxzUmVxQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUwkJTlN0YXR1czsKKwlVTE9ORwkJCUZyYW1lTGVuID0gMDsKKwlIRUFERVJfODAyXzExCURsc1JlcUhkcjsKKwlQUlRfODAyXzExX0RMUwlwRExTID0gTlVMTDsKKwlVQ0hBUgkJCUNhdGVnb3J5ID0gQ0FURUdPUllfRExTOworCVVDSEFSCQkJQWN0aW9uID0gQUNUSU9OX0RMU19SRVFVRVNUOworCVVMT05HCQkJdG1wOworCVVTSE9SVAkJCXJlYXNvbjsKKwlVTE9ORwkJCVRpbWVvdXQ7CisJQk9PTEVBTgkJCVRpbWVyQ2FuY2VsbGVkOworCisJaWYoIU1sbWVEbHNSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgJnBETFMsICZyZWFzb24pKQorCQlyZXR1cm47CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIE1sbWVEbHNSZXFBY3Rpb24oKSBcbiIpKTsKKworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiRExTIC0gTWxtZURsc1JlcUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwlBY3RIZWFkZXJJbml0KHBBZCwgJkRsc1JlcUhkciwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKworCS8vIEJ1aWxkIGJhc2ljIGZyYW1lIGZpcnN0CisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAorCQkJCQlzaXplb2YoSEVBREVSXzgwMl8xMSksCQkmRGxzUmVxSGRyLAorCQkJCQkxLAkJCQkJCQkmQ2F0ZWdvcnksCisJCQkJCTEsCQkJCQkJCSZBY3Rpb24sCisJCQkJCTYsCQkJCQkJCSZwRExTLT5NYWNBZGRyLAorCQkJCQk2LAkJCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzLAorCQkJCQkyLAkJCQkJCQkmcEFkLT5TdGFBY3RpdmUuQ2FwYWJpbGl0eUluZm8sCisJCQkJCTIsCQkJCQkJCSZwRExTLT5UaW1lT3V0LAorCQkJCQkxLAkJCQkJCQkmU3VwUmF0ZUllLAorCQkJCQkxLAkJCQkJCQkmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sCisJCQkJCXBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLAlwQWQtPk1sbWVBdXguU3VwUmF0ZSwKKwkJCQkJRU5EX09GX0FSR1MpOworCisJaWYgKHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuICE9IDApCisJeworCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCSZ0bXAsCisJCQkJCQkgIDEsCQkJCQkJJkV4dFJhdGVJZSwKKwkJCQkJCSAgMSwJCQkJCQkmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4sCisJCQkJCQkgIHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuLAlwQWQtPk1sbWVBdXguRXh0UmF0ZSwKKwkJCQkJCSAgRU5EX09GX0FSR1MpOworCQlGcmFtZUxlbiArPSB0bXA7CisJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKQorCXsKKwkJVUNIQVIgSHRMZW47CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJCUhUX0NBUEFCSUxJVFlfSUUgSHRDYXBhYmlsaXR5VG1wOworI2VuZGlmCisKKwkJLy8gYWRkIEhUIENhcGFiaWxpdHkgSUUKKwkJSHRMZW4gPSBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSk7CisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAkmdG1wLAorCQkJCQkJCTEsCQkJCQkJJkh0Q2FwSWUsCisJCQkJCQkJMSwJCQkJCQkmSHRMZW4sCisJCQkJCQkJSHRMZW4sCQkJCQkmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LAorCQkJCQkJCUVORF9PRl9BUkdTKTsKKyNlbHNlCisJCU5kaXNNb3ZlTWVtb3J5KCZIdENhcGFiaWxpdHlUbXAsICZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksIEh0TGVuKTsKKwkJCQkJCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pKTsKKwkJCQkJCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pKTsKKworCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCSZ0bXAsCisJCQkJCQkJMSwJCQkJCQkmSHRDYXBJZSwKKwkJCQkJCQkxLAkJCQkJCSZIdExlbiwKKwkJCQkJCQlIdExlbiwJCQkJCSZIdENhcGFiaWxpdHlUbXAsCisJCQkJCQkJRU5EX09GX0FSR1MpOworI2VuZGlmCisJCUZyYW1lTGVuID0gRnJhbWVMZW4gKyB0bXA7CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJUlRNUENhbmNlbFRpbWVyKCZwRExTLT5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwlUaW1lb3V0ID0gRExTX1RJTUVPVVQ7CisJUlRNUFNldFRpbWVyKCZwRExTLT5UaW1lciwgVGltZW91dCk7CisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyRGxzUmVxQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUwkJTlN0YXR1czsKKwlVTE9ORwkJCUZyYW1lTGVuID0gMDsKKwlVU0hPUlQJCQlTdGF0dXNDb2RlID0gTUxNRV9TVUNDRVNTOworCUhFQURFUl84MDJfMTEJRGxzUnNwSGRyOworCVVDSEFSCQkJQ2F0ZWdvcnkgPSBDQVRFR09SWV9ETFM7CisJVUNIQVIJCQlBY3Rpb24gPSBBQ1RJT05fRExTX1JFU1BPTlNFOworCVVMT05HCQkJdG1wOworCVVTSE9SVAkJCUNhcGFiaWxpdHlJbmZvOworCVVDSEFSCQkJREFbTUFDX0FERFJfTEVOXSwgU0FbTUFDX0FERFJfTEVOXTsKKwlVU0hPUlQJCQlETFNUaW1lT3V0OworCVNIT1JUCQkJaTsKKwlVTE9ORwkJCVRpbWVvdXQ7CisJQk9PTEVBTgkJCVRpbWVyQ2FuY2VsbGVkOworCVBSVF84MDJfMTFfRExTCXBETFMgPSBOVUxMOworCVVDSEFSCQkJTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9IDA7CisgICAgVUNIQVIJCQlTdXBwb3J0ZWRSYXRlc0xlbjsKKyAgICBVQ0hBUgkJCVN1cHBvcnRlZFJhdGVzW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwlVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbjsKKwlIVF9DQVBBQklMSVRZX0lFCUh0Q2FwYWJpbGl0eTsKKworCWlmICghUGVlckRsc1JlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBEQSwgU0EsICZDYXBhYmlsaXR5SW5mbywgJkRMU1RpbWVPdXQsCisJCQkJCQkJJlN1cHBvcnRlZFJhdGVzTGVuLCAmU3VwcG9ydGVkUmF0ZXNbMF0sICZIdENhcGFiaWxpdHlMZW4sICZIdENhcGFiaWxpdHkpKQorCQlyZXR1cm47CisKKyAgICAvLyBzdXBwb3J0ZWQgcmF0ZXMgYXJyYXkgbWF5IG5vdCBiZSBzb3J0ZWQuIHNvcnQgaXQgYW5kIGZpbmQgdGhlIG1heGltdW0gcmF0ZQorICAgIGZvciAoaSA9IDA7IGkgPCBTdXBwb3J0ZWRSYXRlc0xlbjsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPCAoU3VwcG9ydGVkUmF0ZXNbaV0gJiAweDdmKSkKKyAgICAgICAgICAgIE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSBTdXBwb3J0ZWRSYXRlc1tpXSAmIDB4N2Y7CisgICAgfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBQZWVyRGxzUmVxQWN0aW9uKCkgZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwgU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSkpOworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJETFMgLSBQZWVyRGxzUmVxQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghSU5GUkFfT04ocEFkKSkKKwl7CisJCVN0YXR1c0NvZGUgPSBNTE1FX1JFUVVFU1RfREVDTElORUQ7CisJfQorCWVsc2UgaWYgKCFwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSkKKwl7CisJCVN0YXR1c0NvZGUgPSBNTE1FX0RFU1RfU1RBX0lTX05PVF9BX1FTVEE7CisJfQorCWVsc2UgaWYgKCFwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwl7CisJCVN0YXR1c0NvZGUgPSBNTE1FX1JFUVVFU1RfREVDTElORUQ7CisJfQorCWVsc2UKKwl7CisJCS8vIGZpbmQgdGFibGUgdG8gdXBkYXRlIHBhcmFtZXRlcnMKKwkJZm9yIChpID0gKE1BWF9OVU1fT0ZfRExTX0VOVFJZLTEpOyBpID49IDA7IGktLSkKKwkJeworCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIE1BQ19BRERSX0VRVUFMKFNBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJCXsKKwkJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfV0FJVF9LRVk7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX0ZJTklTSDsKKwkJCQl9CisKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TZXF1ZW5jZSA9IDA7CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dCA9IERMU1RpbWVPdXQ7CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgPSBETFNUaW1lT3V0OworCQkJCWlmIChIdENhcGFiaWxpdHlMZW4gIT0gMCkKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uYkhUQ2FwID0gVFJVRTsKKwkJCQllbHNlCisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLmJIVENhcCA9IEZBTFNFOworCQkJCXBETFMgPSAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV07CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvLyBjYW4gbm90IGZpbmQgaW4gdGFibGUsIGNyZWF0ZSBhIG5ldyBvbmUKKwkJaWYgKGkgPCAwKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFBlZXJEbHNSZXFBY3Rpb24oKSBjYW4gbm90IGZpbmQgc2FtZSBlbnRyeSBcbiIpKTsKKwkJCWZvciAoaT0oTUFYX05VTV9PRl9ETFNfRU5UUlkgLSAxKTsgaSA+PSBNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpLS0pCisJCQl7CisJCQkJaWYgKCFwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCkKKwkJCQl7CisJCQkJCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCQkJCQlVQ0hBUiBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsKKworCQkJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorCQkJCQl7CisJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfV0FJVF9LRVk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX0ZJTklTSDsKKwkJCQkJfQorCisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlNlcXVlbmNlID0gMDsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgPSBUUlVFOworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0ID0gRExTVGltZU91dDsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgPSBETFNUaW1lT3V0OworCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyLCBTQSwgTUFDX0FERFJfTEVOKTsKKwkJCQkJaWYgKEh0Q2FwYWJpbGl0eUxlbiAhPSAwKQorCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uYkhUQ2FwID0gVFJVRTsKKwkJCQkJZWxzZQorCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uYkhUQ2FwID0gRkFMU0U7CisJCQkJCXBETFMgPSAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV07CisJCQkJCXBFbnRyeSA9IE1hY1RhYmxlSW5zZXJ0RGxzRW50cnkocEFkLCBTQSwgaSk7CisKKwkJCQkJc3dpdGNoIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzKQorCQkJCQl7CisJCQkJCQljYXNlIDEwODogTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNTQ7ICAgYnJlYWs7CisJCQkJCQljYXNlIDk2OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNDg7ICAgYnJlYWs7CisJCQkJCQljYXNlIDcyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMzY7ICAgYnJlYWs7CisJCQkJCQljYXNlIDQ4OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMjQ7ICAgYnJlYWs7CisJCQkJCQljYXNlIDM2OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTg7ICAgYnJlYWs7CisJCQkJCQljYXNlIDI0OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTI7ICAgYnJlYWs7CisJCQkJCQljYXNlIDE4OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfOTsgICAgYnJlYWs7CisJCQkJCQljYXNlIDEyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNjsgICAgYnJlYWs7CisJCQkJCQljYXNlIDIyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7ICAgYnJlYWs7CisJCQkJCQljYXNlIDExOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNV81OyAgYnJlYWs7CisJCQkJCQljYXNlIDQ6ICAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMjsgICAgYnJlYWs7CisJCQkJCQljYXNlIDI6ICAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTsgICAgYnJlYWs7CisJCQkJCQlkZWZhdWx0OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7ICAgYnJlYWs7CisJCQkJCX0KKworCQkJCQlwRW50cnktPk1heFN1cHBvcnRlZFJhdGUgPSBtaW4ocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlLCBNYXhTdXBwb3J0ZWRSYXRlKTsKKworCQkJCQlpZiAocEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlIDwgUkFURV9GSVJTVF9PRkRNX1JBVEUpCisJCQkJCXsKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOworCQkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07CisJCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKKwkJCQkJfQorCisJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7CisJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQkJcEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID0gMDsKKwkJCQkJcEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID0gMDsKKworCQkJCQkvLyBJZiB0aGlzIEVudHJ5IHN1cHBvcnRzIDgwMi4xMW4sIHVwZ3JhZGUgdG8gSFQgcmF0ZS4KKwkJCQkJaWYgKChIdENhcGFiaWxpdHlMZW4gIT0gMCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCisJCQkJCXsKKwkJCQkJCVVDSEFSCWosIGJpdG1hc2s7IC8vayxiaXRtYXNrOworCQkJCQkJQ0hBUiAgICBpaTsKKworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIkRMUyAtIFBlZXJEbHNSZXFBY3Rpb24oKSBSZWNlaXZlIFBlZXIgSFQgQ2FwYWJsZSBTVEEgZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCQkJCQkJCVNBWzBdLCBTQVsxXSwgU0FbMl0sIFNBWzNdLCBTQVs0XSwgU0FbNV0pKTsKKworCQkJCQkJaWYgKChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkdGKSAmJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkdGKSkKKwkJCQkJCXsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVEdSRUVORklFTEQ7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRNSVg7CisJCQkJCQkJcEFkLT5NYWNUYWIuZkFueVN0YXRpb25Ob25HRiA9IFRSVUU7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID0gMTsKKwkJCQkJCX0KKworCQkJCQkJaWYgKChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGgpKQorCQkJCQkJeworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXPSBCV180MDsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjQwKSYoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yNDApKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yMjApJihIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCkpOworCQkJCQkJCXBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uMjBPbmx5ID0gVFJVRTsKKwkJCQkJCX0KKworCQkJCQkJLy8gZmluZCBtYXggZml4ZWQgcmF0ZQorCQkJCQkJZm9yIChpaT0xNTsgaWk+PTA7IGlpLS0pCisJCQkJCQl7CisJCQkJCQkJaiA9IGlpLzg7CisJCQkJCQkJYml0bWFzayA9ICgxPDwoaWktKGoqOCkpKTsKKwkJCQkJCQlpZiAoIChwQWQtPlN0YUNmZy5EZXNpcmVkSHRQaHlJbmZvLk1DU1NldFtqXSZiaXRtYXNrKSAmJiAoSHRDYXBhYmlsaXR5Lk1DU1NldFtqXSZiaXRtYXNrKSkKKwkJCQkJCQl7CisJCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IGlpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQkJaWYgKGlpPT0wKQorCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKworCisJCQkJCQlpZiAocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgIT0gTUNTX0FVVE8pCisJCQkJCQl7CisKKwkJCQkJCQlwcmludGsoIkBAQCBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gJWRcbiIsCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTKTsKKwkJCQkJCQlpZiAocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPT0gMzIpCisJCQkJCQkJeworCQkJCQkJCQkvLyBGaXggTUNTIGFzIEhUIER1cGxpY2F0ZWQgTW9kZQorCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IDE7CisJCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUTUlYOworCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TVEJDID0gMDsKKwkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IDA7CisJCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IDMyOworCQkJCQkJCX0KKwkJCQkJCQllbHNlIGlmIChwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPiBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTKQorCQkJCQkJCXsKKwkJCQkJCQkJLy8gU1RBIHN1cHBvcnRzIGZpeGVkIE1DUworCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOworCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQyAmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSk7CisJCQkJCQlwRW50cnktPk1wZHVEZW5zaXR5ID0gSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eTsKKwkJCQkJCXBFbnRyeS0+TWF4UkFtcGR1RmFjdG9yID0gSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NYXhSQW1wZHVGYWN0b3I7CisJCQkJCQlwRW50cnktPk1tcHNNb2RlID0gKFVDSEFSKUh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzOworCQkJCQkJcEVudHJ5LT5BTXNkdVNpemUgPSAoVUNIQVIpSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemU7CisJCQkJCQlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZDsKKworCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjIwKQorCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0kyMF9DQVBBQkxFKTsKKwkJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3I0MCkKKwkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJNDBfQ0FQQUJMRSk7CisJCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5UeFNUQkMpCisJCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1R4U1RCQ19DQVBBQkxFKTsKKwkJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQykKKwkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUnhTVEJDX0NBUEFCTEUpOworCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQykKKwkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfSFRDX0NBUEFCTEUpOworCQkJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJSZGcgJiYgSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0KQorCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSk7CisJCQkJCQlpZiAoSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5NQ1NGZWVkYmFjayA9PSAweDAzKQorCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19NQ1NGRUVEQkFDS19DQVBBQkxFKTsKKworCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBFbnRyeS0+SFRDYXBhYmlsaXR5LCAmSHRDYXBhYmlsaXR5LCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOworCQkJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJCQkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IHBFbnRyeS0+TWF4SFRQaHlNb2RlLndvcmQ7CisJCQkJCXBFbnRyeS0+Q3VyclR4UmF0ZSA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKTsKKworCQkJCQlpZiAocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPT0gVFJVRSkKKwkJCQkJeworCQkJCQkJUFVDSEFSIHBUYWJsZTsKKwkJCQkJCVVDSEFSIFRhYmxlU2l6ZSA9IDA7CisKKwkJCQkJCU1sbWVTZWxlY3RUeFJhdGVUYWJsZShwQWQsIHBFbnRyeSwgJnBUYWJsZSwgJlRhYmxlU2l6ZSwgJnBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4KTsKKwkJCQkJCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBUUlVFOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFOworCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKKwkJCQkJCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBGQUxTRTsKKworCQkJCQkJUlRNUFVwZGF0ZUxlZ2FjeVR4U2V0dGluZygoVUNIQVIpcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSwgcEVudHJ5KTsKKwkJCQkJfQorCQkJCQlwRW50cnktPlJhdGVMZW4gPSBTdXBwb3J0ZWRSYXRlc0xlbjsKKworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJU3RhdHVzQ29kZSA9IE1MTUVfU1VDQ0VTUzsKKworCQkvLyBjYW4gbm90IGZpbmQgaW4gdGFibGUsIGNyZWF0ZSBhIG5ldyBvbmUKKwkJaWYgKGkgPCAwKQorCQl7CisJCQlTdGF0dXNDb2RlID0gTUxNRV9RT1NfVU5TUEVDSUZZOworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJETFMgLSBQZWVyRGxzUmVxQWN0aW9uKCkgRExTRW50cnkgdGFibGUgZnVsbChvbmx5IGNhbiBzdXBwb3J0ICVkIERMUyBzZXNzaW9uKSBcbiIsIE1BWF9OVU1fT0ZfRExTX0VOVFJZIC0gTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWSkpOworCQl9CisJCWVsc2UKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBQZWVyRGxzUmVxQWN0aW9uKCkgdXNlIGVudHJ5KCVkKSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCQlpLCBTQVswXSwgU0FbMV0sIFNBWzJdLCBTQVszXSwgU0FbNF0sIFNBWzVdKSk7CisJCX0KKwl9CisKKwlBY3RIZWFkZXJJbml0KHBBZCwgJkRsc1JzcEhkciwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKworCS8vIEJ1aWxkIGJhc2ljIGZyYW1lIGZpcnN0CisJaWYgKFN0YXR1c0NvZGUgPT0gTUxNRV9TVUNDRVNTKQorCXsKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAorCQkJCQkJc2l6ZW9mKEhFQURFUl84MDJfMTEpLAkJJkRsc1JzcEhkciwKKwkJCQkJCTEsCQkJCQkJCSZDYXRlZ29yeSwKKwkJCQkJCTEsCQkJCQkJCSZBY3Rpb24sCisJCQkJCQkyLAkJCQkJCQkmU3RhdHVzQ29kZSwKKwkJCQkJCTYsCQkJCQkJCVNBLAorCQkJCQkJNiwJCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcywKKwkJCQkJCTIsCQkJCQkJCSZwQWQtPlN0YUFjdGl2ZS5DYXBhYmlsaXR5SW5mbywKKwkJCQkJCTEsCQkJCQkJCSZTdXBSYXRlSWUsCisJCQkJCQkxLAkJCQkJCQkmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sCisJCQkJCQlwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwJcEFkLT5NbG1lQXV4LlN1cFJhdGUsCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisKKwkJaWYgKHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuICE9IDApCisJCXsKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwJJnRtcCwKKwkJCQkJCQkgIDEsCQkJCQkJJkV4dFJhdGVJZSwKKwkJCQkJCQkgIDEsCQkJCQkJJnBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuLAorCQkJCQkJCSAgcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4sIAlwQWQtPk1sbWVBdXguRXh0UmF0ZSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCUZyYW1lTGVuICs9IHRtcDsKKwkJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKKwkJeworCQkJVUNIQVIgSHRMZW47CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJCQlIVF9DQVBBQklMSVRZX0lFIEh0Q2FwYWJpbGl0eVRtcDsKKyNlbmRpZgorCisJCQkvLyBhZGQgSFQgQ2FwYWJpbGl0eSBJRQorCQkJSHRMZW4gPSBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSk7CisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwJJnRtcCwKKwkJCQkJCQkJMSwJCQkJCQkmSHRDYXBJZSwKKwkJCQkJCQkJMSwJCQkJCQkmSHRMZW4sCisJCQkJCQkJCUh0TGVuLAkJCQkJJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkJRU5EX09GX0FSR1MpOworI2Vsc2UKKwkJCU5kaXNNb3ZlTWVtb3J5KCZIdENhcGFiaWxpdHlUbXAsICZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksIEh0TGVuKTsKKwkJCQkJCQkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSk7CisJCQkJCQkJCSooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykpOworCisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCSZ0bXAsCisJCQkJCQkJCTEsCQkJCQkJJkh0Q2FwSWUsCisJCQkJCQkJCTEsCQkJCQkJJkh0TGVuLAorCQkJCQkJCQlIdExlbiwJCQkJCSZIdENhcGFiaWxpdHlUbXAsCisJCQkJCQkJCUVORF9PRl9BUkdTKTsKKyNlbmRpZgorCQkJRnJhbWVMZW4gPSBGcmFtZUxlbiArIHRtcDsKKwkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCWlmIChwRExTICYmIChwRExTLT5TdGF0dXMgIT0gRExTX0ZJTklTSCkpCisJCXsKKwkJCVJUTVBDYW5jZWxUaW1lcigmcERMUy0+VGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJCQlUaW1lb3V0ID0gRExTX1RJTUVPVVQ7CisJCQlSVE1QU2V0VGltZXIoJnBETFMtPlRpbWVyLCBUaW1lb3V0KTsKKwkJfQorCX0KKwllbHNlCisJeworCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJCQkmRnJhbWVMZW4sCisJCQkJCQlzaXplb2YoSEVBREVSXzgwMl8xMSksCQkmRGxzUnNwSGRyLAorCQkJCQkJMSwJCQkJCQkJJkNhdGVnb3J5LAorCQkJCQkJMSwJCQkJCQkJJkFjdGlvbiwKKwkJCQkJCTIsCQkJCQkJCSZTdGF0dXNDb2RlLAorCQkJCQkJNiwJCQkJCQkJU0EsCisJCQkJCQk2LAkJCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzLAorCQkJCQkJRU5EX09GX0FSR1MpOworCX0KKworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFBlZXJEbHNSc3BBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVAkJQ2FwYWJpbGl0eUluZm87CisJVUNIQVIJCURBW01BQ19BRERSX0xFTl0sIFNBW01BQ19BRERSX0xFTl07CisJVVNIT1JUCQlTdGF0dXNDb2RlOworCVNIT1JUCQlpOworCUJPT0xFQU4JCVRpbWVyQ2FuY2VsbGVkOworCVVDSEFSCQlNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzID0gMDsKKyAgICBVQ0hBUgkJU3VwcG9ydGVkUmF0ZXNMZW47CisgICAgVUNIQVIJCVN1cHBvcnRlZFJhdGVzW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwlVQ0hBUgkJSHRDYXBhYmlsaXR5TGVuOworCUhUX0NBUEFCSUxJVFlfSUUJSHRDYXBhYmlsaXR5OworCisJaWYgKCFwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwkJcmV0dXJuOworCisJaWYgKCFJTkZSQV9PTihwQWQpKQorCQlyZXR1cm47CisKKwlpZiAoIVBlZXJEbHNSc3BTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgREEsIFNBLCAmQ2FwYWJpbGl0eUluZm8sICZTdGF0dXNDb2RlLAorCQkJCQkJCSZTdXBwb3J0ZWRSYXRlc0xlbiwgJlN1cHBvcnRlZFJhdGVzWzBdLCAmSHRDYXBhYmlsaXR5TGVuLCAmSHRDYXBhYmlsaXR5KSkKKwkJcmV0dXJuOworCisgICAgLy8gc3VwcG9ydGVkIHJhdGVzIGFycmF5IG1heSBub3QgYmUgc29ydGVkLiBzb3J0IGl0IGFuZCBmaW5kIHRoZSBtYXhpbXVtIHJhdGUKKyAgICBmb3IgKGk9MDsgaTxTdXBwb3J0ZWRSYXRlc0xlbjsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPCAoU3VwcG9ydGVkUmF0ZXNbaV0gJiAweDdmKSkKKyAgICAgICAgICAgIE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSBTdXBwb3J0ZWRSYXRlc1tpXSAmIDB4N2Y7CisgICAgfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBQZWVyRGxzUnNwQWN0aW9uKCkgZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCB3aXRoIFN0YXR1c0NvZGU9JWQsIENhcGFiaWxpdHlJbmZvPTB4JXhcbiIsCisJCVNBWzBdLCBTQVsxXSwgU0FbMl0sIFNBWzNdLCBTQVs0XSwgU0FbNV0sIFN0YXR1c0NvZGUsIENhcGFiaWxpdHlJbmZvKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIE1BQ19BRERSX0VRVUFMKFNBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJeworCQkJaWYgKFN0YXR1c0NvZGUgPT0gTUxNRV9TVUNDRVNTKQorCQkJeworCQkJCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCQkJCVVDSEFSIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOworCisJCQkJcEVudHJ5ID0gTWFjVGFibGVJbnNlcnREbHNFbnRyeShwQWQsIFNBLCBpKTsKKworCQkJCXN3aXRjaCAoTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcykKKwkJCQl7CisJCQkJCWNhc2UgMTA4OiBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV81NDsgICBicmVhazsKKwkJCQkJY2FzZSA5NjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzQ4OyAgIGJyZWFrOworCQkJCQljYXNlIDcyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMzY7ICAgYnJlYWs7CisJCQkJCWNhc2UgNDg6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8yNDsgICBicmVhazsKKwkJCQkJY2FzZSAzNjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzE4OyAgIGJyZWFrOworCQkJCQljYXNlIDI0OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTI7ICAgYnJlYWs7CisJCQkJCWNhc2UgMTg6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV85OyAgICBicmVhazsKKwkJCQkJY2FzZSAxMjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzY7ICAgIGJyZWFrOworCQkJCQljYXNlIDIyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7ICAgYnJlYWs7CisJCQkJCWNhc2UgMTE6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV81XzU7ICBicmVhazsKKwkJCQkJY2FzZSA0OiAgIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzI7ICAgIGJyZWFrOworCQkJCQljYXNlIDI6ICAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTsgICAgYnJlYWs7CisJCQkJCWRlZmF1bHQ6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsgICBicmVhazsKKwkJCQl9CisKKwkJCQlwRW50cnktPk1heFN1cHBvcnRlZFJhdGUgPSBtaW4ocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlLCBNYXhTdXBwb3J0ZWRSYXRlKTsKKworCQkJCWlmIChwRW50cnktPk1heFN1cHBvcnRlZFJhdGUgPCBSQVRFX0ZJUlNUX09GRE1fUkFURSkKKwkJCQl7CisJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOworCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07CisJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07CisJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07CisJCQkJfQorCisJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKKwkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJcEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID0gMDsKKwkJCQlwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAwOworCisJCQkJLy8gSWYgdGhpcyBFbnRyeSBzdXBwb3J0cyA4MDIuMTFuLCB1cGdyYWRlIHRvIEhUIHJhdGUuCisJCQkJaWYgKChIdENhcGFiaWxpdHlMZW4gIT0gMCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCisJCQkJeworCQkJCQlVQ0hBUglqLCBiaXRtYXNrOyAvL2ssYml0bWFzazsKKwkJCQkJQ0hBUiAgICBpaTsKKworCQkJCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiRExTIC0gUGVlckRsc1JzcEFjdGlvbiBSZWNlaXZlIFBlZXIgSFQgQ2FwYWJsZSBTVEEgZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCQkJCQkJU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSkpOworCisJCQkJCWlmICgoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5HRikgJiYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRikpCisJCQkJCXsKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUR1JFRU5GSUVMRDsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUTUlYOworCQkJCQkJcEFkLT5NYWNUYWIuZkFueVN0YXRpb25Ob25HRiA9IFRSVUU7CisJCQkJCQlwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPSAxOworCQkJCQl9CisKKwkJCQkJaWYgKChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGgpKQorCQkJCQl7CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVz0gQldfNDA7CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjQwKSYoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yNDApKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjIwKSYoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApKTsKKwkJCQkJCXBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uMjBPbmx5ID0gVFJVRTsKKwkJCQkJfQorCisJCQkJCS8vIGZpbmQgbWF4IGZpeGVkIHJhdGUKKwkJCQkJZm9yIChpaT0xNTsgaWk+PTA7IGlpLS0pCisJCQkJCXsKKwkJCQkJCWogPSBpaS84OworCQkJCQkJYml0bWFzayA9ICgxPDwoaWktKGoqOCkpKTsKKwkJCQkJCWlmICggKHBBZC0+U3RhQ2ZnLkRlc2lyZWRIdFBoeUluZm8uTUNTU2V0W2pdJmJpdG1hc2spICYmIChIdENhcGFiaWxpdHkuTUNTU2V0W2pdJmJpdG1hc2spKQorCQkJCQkJeworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IGlpOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJaWYgKGlpPT0wKQorCQkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICE9IE1DU19BVVRPKQorCQkJCQl7CisJCQkJCQlpZiAocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPT0gMzIpCisJCQkJCQl7CisJCQkJCQkJLy8gRml4IE1DUyBhcyBIVCBEdXBsaWNhdGVkIE1vZGUKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IDE7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRNSVg7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IDA7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IDA7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gMzI7CisJCQkJCQl9CisJCQkJCQllbHNlIGlmIChwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPiBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTKQorCQkJCQkJeworCQkJCQkJCS8vIFNUQSBzdXBwb3J0cyBmaXhlZCBNQ1MKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQyAmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSk7CisJCQkJCXBFbnRyeS0+TXBkdURlbnNpdHkgPSBIdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5OworCQkJCQlwRW50cnktPk1heFJBbXBkdUZhY3RvciA9IEh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTWF4UkFtcGR1RmFjdG9yOworCQkJCQlwRW50cnktPk1tcHNNb2RlID0gKFVDSEFSKUh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzOworCQkJCQlwRW50cnktPkFNc2R1U2l6ZSA9IChVQ0hBUilIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZTsKKwkJCQkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IHBFbnRyeS0+TWF4SFRQaHlNb2RlLndvcmQ7CisKKwkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjIwKQorCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTIwX0NBUEFCTEUpOworCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yNDApCisJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJNDBfQ0FQQUJMRSk7CisJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlR4U1RCQykKKwkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19UeFNUQkNfQ0FQQUJMRSk7CisJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQykKKwkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19SeFNUQkNfQ0FQQUJMRSk7CisJCQkJCWlmIChIdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlBsdXNIVEMpCisJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfSFRDX0NBUEFCTEUpOworCQkJCQlpZiAocEFkLT5Db21tb25DZmcuYlJkZyAmJiBIdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlJER1N1cHBvcnQpCisJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUkRHX0NBUEFCTEUpOworCQkJCQlpZiAoSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5NQ1NGZWVkYmFjayA9PSAweDAzKQorCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX01DU0ZFRURCQUNLX0NBUEFCTEUpOworCisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwRW50cnktPkhUQ2FwYWJpbGl0eSwgJkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKKwkJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IHBFbnRyeS0+TWF4SFRQaHlNb2RlLndvcmQ7CisJCQkJcEVudHJ5LT5DdXJyVHhSYXRlID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOworCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSk7CisKKwkJCQlpZiAocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPT0gVFJVRSkKKwkJCQl7CisJCQkJCVBVQ0hBUiBwVGFibGU7CisJCQkJCVVDSEFSIFRhYmxlU2l6ZSA9IDA7CisKKwkJCQkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgcEVudHJ5LCAmcFRhYmxlLCAmVGFibGVTaXplLCAmcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXgpOworCQkJCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gVFJVRTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFOworCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOworCQkJCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gRkFMU0U7CisKKwkJCQkJUlRNUFVwZGF0ZUxlZ2FjeVR4U2V0dGluZygoVUNIQVIpcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSwgcEVudHJ5KTsKKwkJCQl9CisJCQkJcEVudHJ5LT5SYXRlTGVuID0gU3VwcG9ydGVkUmF0ZXNMZW47CisKKwkJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorCQkJCXsKKwkJCQkJLy8gSWYgc3VwcG9ydCBXUEEgb3IgV1BBMiwgc3RhcnQgU1RBS2V5IGhhbmQgc2hha2UsCisJCQkJCS8vIElmIGZhaWxlZCBoYW5kIHNoYWtlLCBqdXN0IHRlYXIgZG93biBwZWVyIERMUworCQkJCQlpZiAoUlRNUFNlbmRTVEFLZXlSZXF1ZXN0KHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCQkJeworCQkJCQkJTUxNRV9ETFNfUkVRX1NUUlVDVAlNbG1lRGxzUmVxOworCQkJCQkJVVNIT1JUCQkJCXJlYXNvbiA9IFJFQVNPTl9RT1NfQ0lQSEVSX05PVF9TVVBQT1JUOworCisJCQkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7CisJCQkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfVEVBUl9ET1dOLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKKwkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19OT05FOworCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiRExTIC0gUGVlckRsc1JzcEFjdGlvbiBmYWlsZWQgd2hlbiBjYWxsIFJUTVBTZW5kU1RBS2V5UmVxdWVzdCBcbiIpKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19XQUlUX0tFWTsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gd2FpdGluZyBmb3IgU1RBS2V5IGhhbmRzaGFrZSBwcm9jZWR1cmVcbiIpKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfRklOSVNIOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFBlZXJEbHNSc3BBY3Rpb24oKSBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IFN1Y2NlZWQgd2l0aCBXRVAgb3Igbm8gc2VjdXJpdHlcbiIsIFNBWzBdLCBTQVsxXSwgU0FbMl0sIFNBWzNdLCBTQVs0XSwgU0FbNV0pKTsKKwkJCQl9CisKKwkJCQkvL2luaXRpYWxpemUgc2VxIG5vIGZvciBETFMgZnJhbWVzLgorCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlNlcXVlbmNlID0gMDsKKwkJCQlpZiAoSHRDYXBhYmlsaXR5TGVuICE9IDApCisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLmJIVENhcCA9IFRSVUU7CisJCQkJZWxzZQorCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5iSFRDYXAgPSBGQUxTRTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBETFMgc2V0dXAgcHJvY2VkdXJlIGZhaWxlZC4KKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfTk9ORTsKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJETFMgLSBQZWVyRGxzUnNwQWN0aW9uIGZhaWxlZCB3aXRoIFN0YXR1c0NvZGU9JWQgXG4iLCBTdGF0dXNDb2RlKSk7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoaSA+PSBNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBQZWVyRGxzUnNwQWN0aW9uKCkgdXBkYXRlIHRpbWVvdXQgdmFsdWUgXG4iKSk7CisJCWZvciAoaT0oTUFYX05VTV9PRl9ETFNfRU5UUlktMSk7IGk+PU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGktLSkKKwkJeworCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIE1BQ19BRERSX0VRVUFMKFNBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJCXsKKwkJCQlpZiAoU3RhdHVzQ29kZSA9PSBNTE1FX1NVQ0NFU1MpCisJCQkJeworCQkJCQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKwkJCQkJVUNIQVIgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7CisKKwkJCQkJcEVudHJ5ID0gTWFjVGFibGVJbnNlcnREbHNFbnRyeShwQWQsIFNBLCBpKTsKKworCQkJCQlzd2l0Y2ggKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMpCisJCQkJCXsKKwkJCQkJCWNhc2UgMTA4OiBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV81NDsgICBicmVhazsKKwkJCQkJCWNhc2UgOTY6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV80ODsgICBicmVhazsKKwkJCQkJCWNhc2UgNzI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8zNjsgICBicmVhazsKKwkJCQkJCWNhc2UgNDg6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8yNDsgICBicmVhazsKKwkJCQkJCWNhc2UgMzY6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xODsgICBicmVhazsKKwkJCQkJCWNhc2UgMjQ6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMjsgICBicmVhazsKKwkJCQkJCWNhc2UgMTg6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV85OyAgICBicmVhazsKKwkJCQkJCWNhc2UgMTI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV82OyAgICBicmVhazsKKwkJCQkJCWNhc2UgMjI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsgICBicmVhazsKKwkJCQkJCWNhc2UgMTE6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV81XzU7ICBicmVhazsKKwkJCQkJCWNhc2UgNDogICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8yOyAgICBicmVhazsKKwkJCQkJCWNhc2UgMjogICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xOyAgICBicmVhazsKKwkJCQkJCWRlZmF1bHQ6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsgICBicmVhazsKKwkJCQkJfQorCisJCQkJCXBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZSA9IG1pbihwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUsIE1heFN1cHBvcnRlZFJhdGUpOworCisJCQkJCWlmIChwRW50cnktPk1heFN1cHBvcnRlZFJhdGUgPCBSQVRFX0ZJUlNUX09GRE1fUkFURSkKKwkJCQkJeworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOworCQkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOworCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07CisJCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKKwkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOworCQkJCQl9CisKKwkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKKwkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCQlwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAwOworCQkJCQlwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAwOworCisJCQkJCS8vIElmIHRoaXMgRW50cnkgc3VwcG9ydHMgODAyLjExbiwgdXBncmFkZSB0byBIVCByYXRlLgorCQkJCQlpZiAoKEh0Q2FwYWJpbGl0eUxlbiAhPSAwKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKKwkJCQkJeworCQkJCQkJVUNIQVIJaiwgYml0bWFzazsgLy9rLGJpdG1hc2s7CisJCQkJCQlDSEFSICAgIGlpOworCisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiRExTIC0gUGVlckRsc1JzcEFjdGlvbiBSZWNlaXZlIFBlZXIgSFQgQ2FwYWJsZSBTVEEgZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCQkJCQkJCVNBWzBdLCBTQVsxXSwgU0FbMl0sIFNBWzNdLCBTQVs0XSwgU0FbNV0pKTsKKworCQkJCQkJaWYgKChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkdGKSAmJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkdGKSkKKwkJCQkJCXsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVEdSRUVORklFTEQ7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRNSVg7CisJCQkJCQkJcEFkLT5NYWNUYWIuZkFueVN0YXRpb25Ob25HRiA9IFRSVUU7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID0gMTsKKwkJCQkJCX0KKworCQkJCQkJaWYgKChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGgpKQorCQkJCQkJeworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXPSBCV180MDsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjQwKSYoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yNDApKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yMjApJihIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCkpOworCQkJCQkJCXBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uMjBPbmx5ID0gVFJVRTsKKwkJCQkJCX0KKworCQkJCQkJLy8gZmluZCBtYXggZml4ZWQgcmF0ZQorCQkJCQkJZm9yIChpaT0xNTsgaWk+PTA7IGlpLS0pCisJCQkJCQl7CisJCQkJCQkJaiA9IGlpLzg7CisJCQkJCQkJYml0bWFzayA9ICgxPDwoaWktKGoqOCkpKTsKKwkJCQkJCQlpZiAoIChwQWQtPlN0YUNmZy5EZXNpcmVkSHRQaHlJbmZvLk1DU1NldFtqXSZiaXRtYXNrKSAmJiAoSHRDYXBhYmlsaXR5Lk1DU1NldFtqXSZiaXRtYXNrKSkKKwkJCQkJCQl7CisJCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IGlpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQkJaWYgKGlpPT0wKQorCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKworCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICE9IE1DU19BVVRPKQorCQkJCQkJeworCQkJCQkJCXByaW50aygiQEBAIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSAlZFxuIiwKKwkJCQkJCQkJcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MpOworCQkJCQkJCWlmIChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9PSAzMikKKwkJCQkJCQl7CisJCQkJCQkJCS8vIEZpeCBNQ1MgYXMgSFQgRHVwbGljYXRlZCBNb2RlCisJCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXID0gMTsKKwkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRNSVg7CisJCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSAwOworCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gMDsKKwkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gMzI7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UgaWYgKHBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA+IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MpCisJCQkJCQkJeworCQkJCQkJCQkvLyBTVEEgc3VwcG9ydHMgZml4ZWQgTUNTCisJCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisJCQkJCQkJfQorCQkJCQkJfQorCisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TVEJDID0gKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uUnhTVEJDICYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMpKTsKKwkJCQkJCXBFbnRyeS0+TXBkdURlbnNpdHkgPSBIdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5OworCQkJCQkJcEVudHJ5LT5NYXhSQW1wZHVGYWN0b3IgPSBIdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1heFJBbXBkdUZhY3RvcjsKKwkJCQkJCXBFbnRyeS0+TW1wc01vZGUgPSAoVUNIQVIpSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHM7CisJCQkJCQlwRW50cnktPkFNc2R1U2l6ZSA9IChVQ0hBUilIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZTsKKwkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSBwRW50cnktPk1heEhUUGh5TW9kZS53b3JkOworCisJCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApCisJCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTIwX0NBUEFCTEUpOworCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwKQorCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0k0MF9DQVBBQkxFKTsKKwkJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlR4U1RCQykKKwkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfVHhTVEJDX0NBUEFCTEUpOworCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uUnhTVEJDKQorCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19SeFNUQkNfQ0FQQUJMRSk7CisJCQkJCQlpZiAoSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDKQorCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19IVENfQ0FQQUJMRSk7CisJCQkJCQlpZiAocEFkLT5Db21tb25DZmcuYlJkZyAmJiBIdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlJER1N1cHBvcnQpCisJCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKTsKKwkJCQkJCWlmIChIdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLk1DU0ZlZWRiYWNrID09IDB4MDMpCisJCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX01DU0ZFRURCQUNLX0NBUEFCTEUpOworCisJCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEVudHJ5LT5IVENhcGFiaWxpdHksICZIdENhcGFiaWxpdHksIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSk7CisJCQkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkJCQlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZDsKKwkJCQkJcEVudHJ5LT5DdXJyVHhSYXRlID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOworCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpOworCisJCQkJCWlmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBUUlVFKQorCQkJCQl7CisJCQkJCQlQVUNIQVIgcFRhYmxlOworCQkJCQkJVUNIQVIgVGFibGVTaXplID0gMDsKKworCQkJCQkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgcEVudHJ5LCAmcFRhYmxlLCAmVGFibGVTaXplLCAmcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXgpOworCQkJCQkJcEVudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCA9IFRSVUU7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1PREU7CisJCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOworCQkJCQkJcEVudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCA9IEZBTFNFOworCisJCQkJCQlSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nKChVQ0hBUilwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlLCBwRW50cnkpOworCQkJCQl9CisJCQkJCXBFbnRyeS0+UmF0ZUxlbiA9IFN1cHBvcnRlZFJhdGVzTGVuOworCisJCQkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJCQkJCXsKKwkJCQkJCS8vIElmIHN1cHBvcnQgV1BBIG9yIFdQQTIsIHN0YXJ0IFNUQUtleSBoYW5kIHNoYWtlLAorCQkJCQkJLy8gSWYgZmFpbGVkIGhhbmQgc2hha2UsIGp1c3QgdGVhciBkb3duIHBlZXIgRExTCisJCQkJCQlpZiAoUlRNUFNlbmRTVEFLZXlSZXF1ZXN0KHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCQkJCXsKKwkJCQkJCQlNTE1FX0RMU19SRVFfU1RSVUNUCU1sbWVEbHNSZXE7CisJCQkJCQkJVVNIT1JUCQkJCXJlYXNvbiA9IFJFQVNPTl9RT1NfQ0lQSEVSX05PVF9TVVBQT1JUOworCisJCQkJCQkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCByZWFzb24pOworCQkJCQkJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19URUFSX0RPV04sIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOworCQkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19OT05FOworCQkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJETFMgLSBQZWVyRGxzUnNwQWN0aW9uIGZhaWxlZCB3aGVuIGNhbGwgUlRNUFNlbmRTVEFLZXlSZXF1ZXN0IFxuIikpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19XQUlUX0tFWTsKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIHdhaXRpbmcgZm9yIFNUQUtleSBoYW5kc2hha2UgcHJvY2VkdXJlXG4iKSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX0ZJTklTSDsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUGVlckRsc1JzcEFjdGlvbigpIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggU3VjY2VlZCB3aXRoIFdFUCBvciBubyBzZWN1cml0eVxuIiwgU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSkpOworCQkJCQl9CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlNlcXVlbmNlID0gMDsKKwkJCQkJaWYgKEh0Q2FwYWJpbGl0eUxlbiAhPSAwKQorCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uYkhUQ2FwID0gVFJVRTsKKwkJCQkJZWxzZQorCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uYkhUQ2FwID0gRkFMU0U7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8vIERMUyBzZXR1cCBwcm9jZWR1cmUgZmFpbGVkLgorCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfTk9ORTsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJETFMgLSBQZWVyRGxzUnNwQWN0aW9uIGZhaWxlZCB3aXRoIFN0YXR1c0NvZGU9JWQgXG4iLCBTdGF0dXNDb2RlKSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZURsc1RlYXJEb3duQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUwkJTlN0YXR1czsKKwlVTE9ORwkJCUZyYW1lTGVuID0gMDsKKwlVQ0hBUgkJCUNhdGVnb3J5ID0gQ0FURUdPUllfRExTOworCVVDSEFSCQkJQWN0aW9uID0gQUNUSU9OX0RMU19URUFSRE9XTjsKKwlVU0hPUlQJCQlSZWFzb25Db2RlID0gUkVBU09OX1FPU19VTlNQRUNJRlk7CisJSEVBREVSXzgwMl8xMQlEbHNUZWFyRG93bkhkcjsKKwlQUlRfODAyXzExX0RMUwlwRExTOworCUJPT0xFQU4JCQlUaW1lckNhbmNlbGxlZDsKKwlVQ0hBUgkJCWk7CisKKwlpZighTWxtZURsc1JlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmcERMUywgJlJlYXNvbkNvZGUpKQorCQlyZXR1cm47CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIE1sbWVEbHNUZWFyRG93bkFjdGlvbigpIHdpdGggUmVhc29uQ29kZT0lZCBcbiIsIFJlYXNvbkNvZGUpKTsKKworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiRExTIC0gTWxtZURsc1RlYXJEb3duQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCUFjdEhlYWRlckluaXQocEFkLCAmRGxzVGVhckRvd25IZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisKKwkvLyBCdWlsZCBiYXNpYyBmcmFtZSBmaXJzdAorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkJCSZGcmFtZUxlbiwKKwkJCQkJc2l6ZW9mKEhFQURFUl84MDJfMTEpLAkJJkRsc1RlYXJEb3duSGRyLAorCQkJCQkxLAkJCQkJCQkmQ2F0ZWdvcnksCisJCQkJCTEsCQkJCQkJCSZBY3Rpb24sCisJCQkJCTYsCQkJCQkJCSZwRExTLT5NYWNBZGRyLAorCQkJCQk2LAkJCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzLAorCQkJCQkyLAkJCQkJCQkmUmVhc29uQ29kZSwKKwkJCQkJRU5EX09GX0FSR1MpOworCisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCVJUTVBDYW5jZWxUaW1lcigmcERMUy0+VGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisKKwkvLyBSZW1vdmUga2V5IGluIGxvY2FsIGRscyB0YWJsZSBlbnRyeQorCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCisJeworCQlpZiAoTUFDX0FERFJfRVFVQUwocERMUy0+TWFjQWRkciwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCXsKKwkJCU1hY1RhYmxlRGVsZXRlRGxzRW50cnkocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQl9CisJfQorCisJLy8gY2xlYXIgcGVlciBkbHMgdGFibGUgZW50cnkKKwlmb3IgKGkgPSBNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpIDwgTUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwl7CisJCWlmIChNQUNfQUREUl9FUVVBTChwRExTLT5NYWNBZGRyLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJeworCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJCU1hY1RhYmxlRGVsZXRlRGxzRW50cnkocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQl9CisJfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUGVlckRsc1RlYXJEb3duQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUgkJCURBW01BQ19BRERSX0xFTl0sIFNBW01BQ19BRERSX0xFTl07CisJVVNIT1JUCQkJUmVhc29uQ29kZTsKKwlVSU5UCQkJaTsKKwlCT09MRUFOCQkJVGltZXJDYW5jZWxsZWQ7CisKKwlpZiAoIXBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQorCQlyZXR1cm47CisKKwlpZiAoIUlORlJBX09OKHBBZCkpCisJCXJldHVybjsKKworCWlmICghUGVlckRsc1RlYXJEb3duU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIERBLCBTQSwgJlJlYXNvbkNvZGUpKQorCQlyZXR1cm47CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFBlZXJEbHNUZWFyRG93bkFjdGlvbigpIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggd2l0aCBSZWFzb25Db2RlPSVkXG4iLCBTQVswXSwgU0FbMV0sIFNBWzJdLCBTQVszXSwgU0FbNF0sIFNBWzVdLCBSZWFzb25Db2RlKSk7CisKKwkvLyBjbGVhciBsb2NhbCBkbHMgdGFibGUgZW50cnkKKwlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCisJeworCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgTUFDX0FERFJfRVFVQUwoU0EsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQl7CisJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKKwkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQkJLy9Bc2ljRGVsV2NpZFRhYihwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRCk7CisJCQkvL0FzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KHBBZCwgQlNTMCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lEKTsKKwkJCU1hY1RhYmxlRGVsZXRlRGxzRW50cnkocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQl9CisJfQorCisJLy8gY2xlYXIgcGVlciBkbHMgdGFibGUgZW50cnkKKwlmb3IgKGk9TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIE1BQ19BRERSX0VRVUFMKFNBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJeworCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJCS8vQXNpY0RlbFdjaWRUYWIocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQpOworCQkJLy9Bc2ljUmVtb3ZlUGFpcndpc2VLZXlFbnRyeShwQWQsIEJTUzAsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRCk7CisJCQlNYWNUYWJsZURlbGV0ZURsc0VudHJ5KHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lELCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJfQorCX0KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFJUTVBDaGVja0RMU1RpbWVPdXQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpCit7CisJVUxPTkcJCQkJaTsKKwlNTE1FX0RMU19SRVFfU1RSVUNUCU1sbWVEbHNSZXE7CisJVVNIT1JUCQkJCXJlYXNvbiA9IFJFQVNPTl9RT1NfVU5TUEVDSUZZOworCisJaWYgKCEgcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJCXJldHVybjsKKworCWlmICghIElORlJBX09OKHBBZCkpCisJCXJldHVybjsKKworCS8vIElmIHRpbWVvdXQgdmFsdWUgaXMgZXF1YWxlZCB0byB6ZXJvLCBpdCBtZWFucyBhbHdheXMgbm90IGJlIHRpbWVvdXQuCisKKwkvLyB1cGRhdGUgbG9jYWwgZGxzIHRhYmxlIGVudHJ5CisJZm9yIChpPTA7IGk8TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQorCXsKKwkJaWYgKChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCkgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKQorCQkJJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQgIT0gMCkpCisJCXsKKwkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLkNvdW50RG93blRpbWVyIC0tOworCisJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgPT0gMCkKKwkJCXsKKwkJCQlyZWFzb24gPSBSRUFTT05fUU9TX1JFUVVFU1RfVElNRU9VVDsKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOworCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfVEVBUl9ET1dOLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKKwkJCX0KKwkJfQorCX0KKworCS8vIHVwZGF0ZSBwZWVyIGRscyB0YWJsZSBlbnRyeQorCWZvciAoaT1NQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJeworCQlpZiAoKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkKSAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpCisJCQkmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dCAhPSAwKSkKKwkJeworCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgLS07CisKKwkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5Db3VudERvd25UaW1lciA9PSAwKQorCQkJeworCQkJCXJlYXNvbiA9IFJFQVNPTl9RT1NfUkVRVUVTVF9USU1FT1VUOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCByZWFzb24pOworCQkJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19URUFSX0RPV04sIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOworCQkJfQorCQl9CisJfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gUlRNUFJjdkZyYW1lRExTQ2hlY2soCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gUEhFQURFUl84MDJfMTEJcEhlYWRlciwKKwlJTiBVTE9ORwkJCUxlbiwKKwlJTiBQUlQyOFhYX1JYRF9TVFJVQwlwUnhEKQoreworCVVMT05HCQkJaTsKKwlCT09MRUFOCQkJYkZpbmRFbnRyeSA9IEZBTFNFOworCUJPT0xFQU4JCQliU1RBS2V5RnJhbWUgPSBGQUxTRTsKKwlQRUFQT0xfUEFDS0VUCXBFYXA7CisJUFVDSEFSCQkJcFByb3RvLCBwQWRkciA9IE5VTEw7CisJUFVDSEFSCQkJcFNUQUtleSA9IE5VTEw7CisJVUNIQVIJCQlaZXJvUmVwbGF5W0xFTl9LRVlfREVTQ19SRVBMQVldOworCVVDSEFSCQkJTWljWzE2XSwgT2xkTWljWzE2XTsKKwlVQ0hBUgkJCWRpZ2VzdFs4MF07CisJVUNIQVIJCQlEbHNQVEtbODBdOworCVVDSEFSCQkJdGVtcFs2NF07CisJQk9PTEVBTgkJCVRpbWVyQ2FuY2VsbGVkOworCUNJUEhFUl9LRVkJCVBhaXJ3aXNlS2V5OworCisKKwlpZiAoISBwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwkJcmV0dXJuIGJTVEFLZXlGcmFtZTsKKworCWlmICghIElORlJBX09OKHBBZCkpCisJCXJldHVybiBiU1RBS2V5RnJhbWU7CisKKwlpZiAoISAocEhlYWRlci0+RkMuU3ViVHlwZSAmIDB4MDgpKQorCQlyZXR1cm4gYlNUQUtleUZyYW1lOworCisJaWYgKExlbiA8IExFTkdUSF84MDJfMTEgKyA2ICsgMiArIDIpCisJCXJldHVybiBiU1RBS2V5RnJhbWU7CisKKwlwUHJvdG8JPSAoUFVDSEFSKXBIZWFkZXIgKyBMRU5HVEhfODAyXzExICsgMiArIDY7CS8vIFFPUyBDb250cm9sIGZpZWxkICwgMHhBQSAweEFBIDB4QUEgMHgwMCAweDAwIDB4MDAKKwlwQWRkcgk9IHBIZWFkZXItPkFkZHIyOworCisJLy8gTDJQQUQgYml0IG9uIHdpbGwgcGFkIDIgYnl0ZXMgYXQgTExDCisJaWYgKHBSeEQtPkwyUEFEKQorCXsKKwkJcFByb3RvICs9IDI7CisJfQorCisJaWYgKFJUTVBFcXVhbE1lbW9yeShFQVBPTCwgcFByb3RvLCAyKSAmJiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gIE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkpCisJeworCQlwRWFwID0gKFBFQVBPTF9QQUNLRVQpIChwUHJvdG8gKyAyKTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFNuaWZmIExlbj0lbGQsIERhdGFMZW49JWQsIEtleU1pYz0lZCwgSW5zdGFsbD0lZCwgS2V5QWNrPSVkLCBTZWN1cmU9JWQsIEVLRF9ETD0lZCwgRXJyb3I9JWQsIFJlcXVlc3Q9JWRcbiIsIExlbiwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTEVOR1RIXzgwMl8xMSArIDYgKyAyICsgMiArIHNpemVvZihFQVBPTF9QQUNLRVQpIC0gTUFYX0xFTl9PRl9SU05JRSArIDE2KSwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRWFwLT5LZXlEZXNjLktleUluZm8uS2V5TWljLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFYXAtPktleURlc2MuS2V5SW5mby5JbnN0YWxsLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFYXAtPktleURlc2MuS2V5SW5mby5LZXlBY2ssCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLlNlY3VyZSwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRWFwLT5LZXlEZXNjLktleUluZm8uRUtEX0RMLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFYXAtPktleURlc2MuS2V5SW5mby5FcnJvciwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRWFwLT5LZXlEZXNjLktleUluZm8uUmVxdWVzdCkpOworCisJCWlmICgoTGVuID49IChMRU5HVEhfODAyXzExICsgNiArIDIgKyAyICsgc2l6ZW9mKEVBUE9MX1BBQ0tFVCkgLSBNQVhfTEVOX09GX1JTTklFICsgMTYpKSAmJiBwRWFwLT5LZXlEZXNjLktleUluZm8uS2V5TWljCisJCQkmJiBwRWFwLT5LZXlEZXNjLktleUluZm8uSW5zdGFsbCAmJiBwRWFwLT5LZXlEZXNjLktleUluZm8uS2V5QWNrICYmIHBFYXAtPktleURlc2MuS2V5SW5mby5TZWN1cmUKKwkJCSYmIHBFYXAtPktleURlc2MuS2V5SW5mby5FS0RfREwgJiYgIXBFYXAtPktleURlc2MuS2V5SW5mby5FcnJvciAmJiAhcEVhcC0+S2V5RGVzYy5LZXlJbmZvLlJlcXVlc3QpCisJCXsKKwkJCS8vIEZpcnN0IHZhbGlkYXRlIHJlcGxheSBjb3VudGVyLCBvbmx5IGFjY2VwdCBtZXNzYWdlIHdpdGggbGFyZ2VyIHJlcGxheSBjb3VudGVyCisJCQkvLyBMZXQgZXF1YWwgcGFzcywgc29tZSBBUCBzdGFydCB3aXRoIGFsbCB6ZXJvIHJlcGxheSBjb3VudGVyCisJCQlOZGlzWmVyb01lbW9yeShaZXJvUmVwbGF5LCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKwkJCWlmICgoUlRNUENvbXBhcmVNZW1vcnkocEVhcC0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKSAhPSAxKSAmJgorCQkJCShSVE1QQ29tcGFyZU1lbW9yeShwRWFwLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIFplcm9SZXBsYXksIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDApKQorCQkJCXJldHVybiBiU1RBS2V5RnJhbWU7CisKKwkJCS8vUlRNUE1vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgcEVhcC0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKwkJCVJUTVBNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLkRsc1JlcGxheUNvdW50ZXIsIHBFYXAtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFNuaWZmIHJlcGxheSBjb3VudGVyICglMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMngpIExlbj0lbGQsIEtleURhdGFMZW49JWRcbiIsCisJCQkJcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlclswXSwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlclsxXSwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlclsyXSwKKwkJCQlwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzNdLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzRdLAlwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzVdLAorCQkJCXBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbNl0sIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbN10sIExlbiwgcEVhcC0+S2V5RGVzYy5LZXlEYXRhWzFdKSk7CisKKwkJCS8vIHB1dCB0aGVzZSBjb2RlIHNlZ21lbnQgdG8gZ2V0IHRoZSByZXBsYXkgY291bnRlcgorCQkJaWYgKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkKKwkJCQlyZXR1cm4gYlNUQUtleUZyYW1lOworCisJCQkvLyBDaGVjayBNSUMgdmFsdWUKKwkJCS8vIFNhdmUgdGhlIE1JQyBhbmQgcmVwbGFjZSB3aXRoIHplcm8KKwkJCS8vIHVzZSBwcm9wcmlldGFyeSBQVEsKKwkJCU5kaXNaZXJvTWVtb3J5KHRlbXAsIDY0KTsKKwkJCU5kaXNNb3ZlTWVtb3J5KHRlbXAsICJJRUVFODAyLjExIFdJUkVMRVNTIEFDQ0VTUyBQT0lOVCIsIDMyKTsKKwkJCVdwYUNvdW50UFRLKHBBZCwgdGVtcCwgdGVtcCwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHRlbXAsIHBBZC0+Q3VycmVudEFkZHJlc3MsIERsc1BUSywgTEVOX1BUSyk7CisKKwkJCU5kaXNNb3ZlTWVtb3J5KE9sZE1pYywgcEVhcC0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCQkJTmRpc1plcm9NZW1vcnkocEVhcC0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCQkJeworCQkJCS8vIEFFUworCQkJCUhNQUNfU0hBMSgoUFVDSEFSKSBwRWFwLCBwRWFwLT5Cb2R5X0xlblsxXSArIDQsIERsc1BUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworCQkJCU5kaXNNb3ZlTWVtb3J5KE1pYywJZGlnZXN0LAlMRU5fS0VZX0RFU0NfTUlDKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlobWFjX21kNShEbHNQVEssIExFTl9FQVBfTUlDSywgKFBVQ0hBUikgcEVhcCwgcEVhcC0+Qm9keV9MZW5bMV0gKyA0LCBNaWMpOworCQkJfQorCisJCQlpZiAoIU5kaXNFcXVhbE1lbW9yeShPbGRNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQykpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTUlDIERpZmZlcmVudCBpbiBNc2cxIG9mIFNUQUtleSBoYW5kc2hha2UhIFxuIikpOworCQkJCXJldHVybiBiU1RBS2V5RnJhbWU7CisJCQl9CisJCQllbHNlCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTUlDIFZBTElEIGluIE1zZzEgb2YgU1RBS2V5IGhhbmRzaGFrZSEgXG4iKSk7CisjaWYgMQorCQkJaWYgKChwRWFwLT5LZXlEZXNjLktleURhdGFbMF0gPT0gMHhERCkgJiYgKHBFYXAtPktleURlc2MuS2V5RGF0YVsyXSA9PSAweDAwKSAmJiAocEVhcC0+S2V5RGVzYy5LZXlEYXRhWzNdID09IDB4MEMpCisJCQkJJiYgKHBFYXAtPktleURlc2MuS2V5RGF0YVs0XSA9PSAweDQzKSAmJiAocEVhcC0+S2V5RGVzYy5LZXlEYXRhWzVdID09IDB4MDIpKQorCQkJeworCQkJCXBBZGRyCQkJPSBwRWFwLT5LZXlEZXNjLktleURhdGEgKyA4OwkJLy8gVHBlKDEpLCBMZW4oMSksIE9VSSgzKSwgRGF0YVR5cGUoMSksIFJlc2VydmVkKDIpCisJCQkJcFNUQUtleQkJCT0gcEVhcC0+S2V5RGVzYy5LZXlEYXRhICsgMTQ7CS8vIFRwZSgxKSwgTGVuKDEpLCBPVUkoMyksIERhdGFUeXBlKDEpLCBSZXNlcnZlZCgyKSwgU1RBS2V5X01hY19BZGRyKDYpCisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFJlY2VpdmUgU1RBS2V5IE1lc3NhZ2UtMSBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IExlbj0lbGQsIEtleURhdGFMZW49JWRcbiIsCisJCQkJCXBBZGRyWzBdLCBwQWRkclsxXSwgcEFkZHJbMl0sIHBBZGRyWzNdLCBwQWRkcls0XSwgcEFkZHJbNV0sIExlbiwgcEVhcC0+S2V5RGVzYy5LZXlEYXRhWzFdKSk7CisKKwkJCQliU1RBS2V5RnJhbWUgPSBUUlVFOworCQkJfQorI2Vsc2UKKwkJCWlmICgocEVhcC0+S2V5RGVzYy5LZXlEYXRhWzBdID09IDB4REQpICYmIChwRWFwLT5LZXlEZXNjLktleURhdGFbMl0gPT0gMHgwMCkgJiYgKHBFYXAtPktleURlc2MuS2V5RGF0YVszXSA9PSAweDBGKQorCQkJCSYmIChwRWFwLT5LZXlEZXNjLktleURhdGFbNF0gPT0gMHhBQykgJiYgKHBFYXAtPktleURlc2MuS2V5RGF0YVs1XSA9PSAweDAyKSkKKwkJCXsKKwkJCQlwQWRkcgkJCT0gcEVhcC0+S2V5RGVzYy5LZXlEYXRhICsgODsJCS8vIFRwZSgxKSwgTGVuKDEpLCBPVUkoMyksIERhdGFUeXBlKDEpLCBSZXNlcnZlZCgyKQorCQkJCXBTVEFLZXkJCQk9IHBFYXAtPktleURlc2MuS2V5RGF0YSArIDE0OwkvLyBUcGUoMSksIExlbigxKSwgT1VJKDMpLCBEYXRhVHlwZSgxKSwgUmVzZXJ2ZWQoMiksIFNUQUtleV9NYWNfQWRkcig2KQorCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBSZWNlaXZlIFNUQUtleSBNZXNzYWdlLTEgZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBMZW49JWQsIEtleURhdGFMZW49JWRcbiIsCisJCQkJCXBBZGRyWzBdLCBwQWRkclsxXSwgcEFkZHJbMl0sIHBBZGRyWzNdLCBwQWRkcls0XSwgcEFkZHJbNV0sIExlbiwgcEVhcC0+S2V5RGVzYy5LZXlEYXRhWzFdKSk7CisKKwkJCQliU1RBS2V5RnJhbWUgPSBUUlVFOworCQkJfQorI2VuZGlmCisKKwkJfQorCQllbHNlIGlmIChMZW4gPj0gKExFTkdUSF84MDJfMTEgKyA2ICsgMiArIDIgKyBzaXplb2YoRUFQT0xfUEFDS0VUKSAtIE1BWF9MRU5fT0ZfUlNOSUUpKQorCQl7CisjaWYgMAorCQkJUlRNUE1vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgcEVhcC0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworI2VuZGlmCisJCQlSVE1QTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5EbHNSZXBsYXlDb3VudGVyLCBwRWFwLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBTbmlmZiByZXBsYXkgY291bnRlciAyKCUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeCkgTGVuPSVsZCwgS2V5RGF0YUxlbj0lZFxuIiwKKwkJCQlwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzBdLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzFdLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzJdLAorCQkJCXBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbM10sIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbNF0sCXBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbNV0sCisJCQkJcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlcls2XSwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlcls3XSwgTGVuLCBwRWFwLT5LZXlEZXNjLktleURhdGFbMV0pKTsKKworCQl9CisJfQorCisJLy8gSWYgdGltZW91dCB2YWx1ZSBpcyBlcXVhbGVkIHRvIHplcm8sIGl0IG1lYW5zIGFsd2F5cyBub3QgYmUgdGltZW91dC4KKwkvLyB1cGRhdGUgbG9jYWwgZGxzIHRhYmxlIGVudHJ5CisJZm9yIChpPSAwOyBpIDwgTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIE1BQ19BRERSX0VRVUFMKHBBZGRyLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJeworCQkJaWYgKGJTVEFLZXlGcmFtZSkKKwkJCXsKKwkJCQlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeTsKKworCQkJCS8vIFNUQUtleSBmcmFtZSwgYWRkIHBhaXJ3aXNlIGtleSB0YWJsZQorCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19GSU5JU0g7CisJCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKworCQkJCVBhaXJ3aXNlS2V5LktleUxlbiA9IExFTl9US0lQX0VLOworCQkJCU5kaXNNb3ZlTWVtb3J5KFBhaXJ3aXNlS2V5LktleSwgJnBTVEFLZXlbMF0sIExFTl9US0lQX0VLKTsKKwkJCQlOZGlzTW92ZU1lbW9yeShQYWlyd2lzZUtleS5UeE1pYywgJnBTVEFLZXlbMTZdLCBMRU5fVEtJUF9SWE1JQ0spOworCQkJCU5kaXNNb3ZlTWVtb3J5KFBhaXJ3aXNlS2V5LlJ4TWljLCAmcFNUQUtleVsyNF0sIExFTl9US0lQX1RYTUlDSyk7CisKKwkJCQlQYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZzsKKworCQkJCXBFbnRyeSA9IERsc0VudHJ5VGFibGVMb29rdXAocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyLCBUUlVFKTsKKwkJCQkvL0FzaWNBZGRLZXlFbnRyeShwQWQsIChVU0hPUlQpKGkgKyAyKSwgQlNTMCwgMCwgJlBhaXJ3aXNlS2V5LCBUUlVFLCBUUlVFKTsJLy8gcmVzZXJ2ZSAwIGZvciBtdWx0aWNhc3QsIDEgZm9yIHVuaWNhc3QKKwkJCQkvL0FzaWNVcGRhdGVSeFdDSURUYWJsZShwQWQsIChVU0hPUlQpKGkgKyAyKSwgcEFkZHIpOworCQkJCS8vIEFkZCBQYWlyLXdpc2Uga2V5IHRvIEFzaWMKKyNpZmRlZiBSVDI4NjAKKyAgICAgICAgICAgIAlBc2ljQWRkUGFpcndpc2VLZXlFbnRyeShwQWQsCisJCQkJCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkciwKKwkJCQkJCQkJCQkoVUNIQVIpcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lELAorCQkJCQkJCQkJCSZQYWlyd2lzZUtleSk7CisKKwkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKwkJCQkJCQkJCQkgIEJTUzAsCisJCQkJCQkJCQkJICAwLAorCQkJCQkJCQkJCSAgUGFpcndpc2VLZXkuQ2lwaGVyQWxnLAorCQkJCQkJCQkJCSAgcEVudHJ5KTsKKworI2VuZGlmIC8vIFJUMjg2MCAvLworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwRW50cnktPlBhaXJ3aXNlS2V5LCAmUGFpcndpc2VLZXksIHNpemVvZihDSVBIRVJfS0VZKSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBSZWNlaXZlIFNUQUtleSBNZXNzYWdlLTEgKFBlZXIgU1RBIE1BQyBBZGRyZXNzIFNUQUtleSkgXG4iKSk7CisKKwkJCQlSVE1QU2VuZFNUQUtleUhhbmRTaGFrZShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBGaW5pc2ggU1RBS2V5IGhhbmRzaGFrZSBwcm9jZWR1cmUgKEluaXRpYXRvciBzaWRlKVxuIikpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIERhdGEgZnJhbWUsIHVwZGF0ZSB0aW1lb3V0IHZhbHVlCisJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKQorCQkJCXsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgPSBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0OworCQkJCQkvL0FzaWNVcGRhdGVSeFdDSURUYWJsZShwQWQsIChVU0hPUlQpKGkgKyAyKSwgcEFkZHIpOworCQkJCX0KKwkJCX0KKworCQkJYkZpbmRFbnRyeSA9IFRSVUU7CisJCX0KKwl9CisKKwkvLyB1cGRhdGUgcGVlciBkbHMgdGFibGUgZW50cnkKKwlmb3IgKGk9TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIE1BQ19BRERSX0VRVUFMKHBBZGRyLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJeworCQkJaWYgKGJTVEFLZXlGcmFtZSkKKwkJCXsKKwkJCQlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA9IE5VTEw7CisKKwkJCQkvLyBTVEFLZXkgZnJhbWUsIGFkZCBwYWlyd2lzZSBrZXkgdGFibGUsIGFuZCBzZW5kIFNUQWtleSBNc2ctMgorCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19GSU5JU0g7CisJCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKworCQkJCVBhaXJ3aXNlS2V5LktleUxlbiA9IExFTl9US0lQX0VLOworCQkJCU5kaXNNb3ZlTWVtb3J5KFBhaXJ3aXNlS2V5LktleSwgJnBTVEFLZXlbMF0sIExFTl9US0lQX0VLKTsKKwkJCQlOZGlzTW92ZU1lbW9yeShQYWlyd2lzZUtleS5UeE1pYywgJnBTVEFLZXlbMTZdLCBMRU5fVEtJUF9SWE1JQ0spOworCQkJCU5kaXNNb3ZlTWVtb3J5KFBhaXJ3aXNlS2V5LlJ4TWljLCAmcFNUQUtleVsyNF0sIExFTl9US0lQX1RYTUlDSyk7CisKKwkJCQlQYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZzsKKworCQkJCXBFbnRyeSA9IERsc0VudHJ5VGFibGVMb29rdXAocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyLCBUUlVFKTsKKwkJCQkvL0FzaWNBZGRLZXlFbnRyeShwQWQsIChVU0hPUlQpKGkgKyAyKSwgQlNTMCwgMCwgJlBhaXJ3aXNlS2V5LCBUUlVFLCBUUlVFKTsJLy8gcmVzZXJ2ZSAwIGZvciBtdWx0aWNhc3QsIDEgZm9yIHVuaWNhc3QKKwkJCQkvL0FzaWNVcGRhdGVSeFdDSURUYWJsZShwQWQsIChVU0hPUlQpKGkgKyAyKSwgcEFkZHIpOworCQkJCS8vIEFkZCBQYWlyLXdpc2Uga2V5IHRvIEFzaWMKKyNpZmRlZiBSVDI4NjAKKyAgICAgICAgICAgIAlBc2ljQWRkUGFpcndpc2VLZXlFbnRyeShwQWQsCisJCQkJCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkciwKKwkJCQkJCQkJCQkoVUNIQVIpcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lELAorCQkJCQkJCQkJCSZQYWlyd2lzZUtleSk7CisKKwkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKwkJCQkJCQkJCQkgIEJTUzAsCisJCQkJCQkJCQkJICAwLAorCQkJCQkJCQkJCSAgUGFpcndpc2VLZXkuQ2lwaGVyQWxnLAorCQkJCQkJCQkJCSAgcEVudHJ5KTsKKyNlbmRpZiAvLyBSVDI4NjAgLy8KKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEVudHJ5LT5QYWlyd2lzZUtleSwgJlBhaXJ3aXNlS2V5LCBzaXplb2YoQ0lQSEVSX0tFWSkpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUmVjZWl2ZSBTVEFLZXkgTWVzc2FnZS0xIChJbml0aWF0b3IgU1RBIE1BQyBBZGRyZXNzIFNUQUtleSlcbiIpKTsKKworCQkJCS8vIElmIHN1cHBvcnQgV1BBIG9yIFdQQTIsIHN0YXJ0IFNUQUtleSBoYW5kIHNoYWtlLAorCQkJCS8vIElmIGZhaWxlZCBoYW5kIHNoYWtlLCBqdXN0IHRlYXIgZG93biBwZWVyIERMUworCQkJCWlmIChSVE1QU2VuZFNUQUtleUhhbmRTaGFrZShwQWQsIHBBZGRyKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCXsKKwkJCQkJTUxNRV9ETFNfUkVRX1NUUlVDVAlNbG1lRGxzUmVxOworCQkJCQlVU0hPUlQJCQkJcmVhc29uID0gUkVBU09OX1FPU19DSVBIRVJfTk9UX1NVUFBPUlQ7CisKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKKwkJCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1RFQVJfRE9XTiwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gRmluaXNoIFNUQUtleSBoYW5kc2hha2UgcHJvY2VkdXJlIChQZWVyIHNpZGUpXG4iKSk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIERhdGEgZnJhbWUsIHVwZGF0ZSB0aW1lb3V0IHZhbHVlCisJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKQorCQkJCXsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgPSBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0OworCQkJCX0KKwkJCX0KKworCQkJYkZpbmRFbnRyeSA9IFRSVUU7CisJCX0KKwl9CisKKworCXJldHVybiBiU1RBS2V5RnJhbWU7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDaGVjayBpZiB0aGUgZnJhbWUgY2FuIGJlIHNlbnQgdGhyb3VnaCBETFMgZGlyZWN0IGxpbmsgaW50ZXJmYWNlCisKKwlBcmd1bWVudHM6CisJCXBBZAkJUG9pbnRlcgl0byBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCURMUyBlbnRyeSBpbmRleAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlSVE1QQ2hlY2tETFNGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEQSkKK3sKKwlJTlQgcnZhbCA9IC0xOworCUlOVAlpOworCisJaWYgKCFwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwkJcmV0dXJuIHJ2YWw7CisKKwlpZiAoIUlORlJBX09OKHBBZCkpCisJCXJldHVybiBydmFsOworCisJZG97CisJCS8vIGNoZWNrIGxvY2FsIGRscyB0YWJsZSBlbnRyeQorCQlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCisJCXsKKwkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpICYmCisJCQkJTUFDX0FERFJfRVFVQUwocERBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJCXsKKwkJCQlydmFsID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8vIGNoZWNrIHBlZXIgZGxzIHRhYmxlIGVudHJ5CisJCWZvciAoaT1NQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJCXsKKwkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpICYmCisJCQkJTUFDX0FERFJfRVFVQUwocERBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJCXsKKwkJCQlydmFsID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0gd2hpbGUgKEZBTFNFKTsKKworCXJldHVybiBydmFsOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcERBKQoreworCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTCQlOU3RhdHVzOworCUhFQURFUl84MDJfMTEJRGxzVGVhckRvd25IZHI7CisJVUxPTkcJCQlGcmFtZUxlbiA9IDA7CisJVVNIT1JUCQkJUmVhc29uID0gUkVBU09OX1FPU19RU1RBX0xFQVZJTkdfUUJTUzsKKwlVQ0hBUgkJCUNhdGVnb3J5ID0gQ0FURUdPUllfRExTOworCVVDSEFSCQkJQWN0aW9uID0gQUNUSU9OX0RMU19URUFSRE9XTjsKKwlVQ0hBUgkJCWkgPSAwOworCisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykgfHwKKwkJUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKQorCQlyZXR1cm47CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZW5kIERMUyBUZWFyRG93biBGcmFtZSBcbiIpKTsKKworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQVNTT0MgLSBSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQlyZXR1cm47CisJfQorCisJQWN0SGVhZGVySW5pdChwQWQsICZEbHNUZWFyRG93bkhkciwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJCQkmRnJhbWVMZW4sCisJCQkJCXNpemVvZihIRUFERVJfODAyXzExKSwJCSZEbHNUZWFyRG93bkhkciwKKwkJCQkJMSwJCQkJCQkJJkNhdGVnb3J5LAorCQkJCQkxLAkJCQkJCQkmQWN0aW9uLAorCQkJCQk2LAkJCQkJCQlwREEsCisJCQkJCTYsCQkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MsCisJCQkJCTIsCQkJCQkJCSZSZWFzb24sCisJCQkJCUVORF9PRl9BUkdTKTsKKworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwkvLyBSZW1vdmUga2V5IGluIGxvY2FsIGRscyB0YWJsZSBlbnRyeQorCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCisJeworCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKQorCQkJJiYgTUFDX0FERFJfRVFVQUwocERBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJeworCQkJTWFjVGFibGVEZWxldGVEbHNFbnRyeShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCX0KKwl9CisKKwkvLyBSZW1vdmUga2V5IGluIHBlZXIgZGxzIHRhYmxlIGVudHJ5CisJZm9yIChpPU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwl7CisJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpCisJCQkmJiBNQUNfQUREUl9FUVVBTChwREEsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQl7CisJCQlNYWNUYWJsZURlbGV0ZURsc0VudHJ5KHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lELCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJfQorCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNlbmQgRExTIFRlYXJEb3duIEZyYW1lIGFuZCByZW1vdmUga2V5IGluIChpPSVkKSBcbiIsIGkpKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitORElTX1NUQVRVUyBSVE1QU2VuZFNUQUtleVJlcXVlc3QoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcERBKQoreworCVVDSEFSCQkJCUhlYWRlcjgwMl8zWzE0XTsKKwlORElTX1NUQVRVUwkJCU5TdGF0dXM7CisJVUxPTkcJCQkJRnJhbWVMZW4gPSAwOworCUVBUE9MX1BBQ0tFVAkJUGFja2V0OworCVVDSEFSCQkJCU1pY1sxNl07CisJVUNIQVIJCQkJZGlnZXN0WzgwXTsKKwlQVUNIQVIJCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisJUE5ESVNfUEFDS0VUCQlwTmRpc1BhY2tldDsKKwlVQ0hBUgkJCQl0ZW1wWzY0XTsKKwlVQ0hBUgkJCQlEbHNQVEtbODBdOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBSVE1QU2VuZFNUQUtleVJlcXVlc3QoKSB0byAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwgcERBWzBdLCBwREFbMV0sIHBEQVsyXSwgcERBWzNdLCBwREFbNF0sIHBEQVs1XSkpOworCisJcEFkLT5TZXF1ZW5jZSArKzsKKwlNQUtFXzgwMl8zX0hFQURFUihIZWFkZXI4MDJfMywgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIEVBUE9MKTsKKworCS8vIFplcm8gbWVzc2FnZSBib2R5CisJTmRpc1plcm9NZW1vcnkoJlBhY2tldCwgc2l6ZW9mKFBhY2tldCkpOworCVBhY2tldC5Qcm9WZXIgPSBFQVBPTF9WRVI7CisJUGFja2V0LlByb1R5cGUgICAgPSBFQVBPTEtleTsKKwlQYWNrZXQuQm9keV9MZW5bMV0gID0gc2l6ZW9mKEtFWV9ERVNDUklQVEVSKSAtIE1BWF9MRU5fT0ZfUlNOSUUgKyA2ICsgTUFDX0FERFJfTEVOOwkJLy8gZGF0YSBmaWVsZCBjb250YWluIEtERSBhbmRQZWVyIE1BQyBhZGRyZXNzCisKKwkvLyBTVEFLZXkgTWVzc2FnZSBpcyBhcyBFQVBPTC1LZXkoMSwxLDAsMCxHLzAsMCwwLCBNSUMsIDAsUGVlciBNQUMgS0RFKQorCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkKKyAgICB7CisgICAgICAgIFBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEExX0tFWV9ERVNDOworICAgIH0KKyAgICBlbHNlIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQorICAgIHsKKyAgICAgICAgUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTJfS0VZX0RFU0M7CisgICAgfQorCisJLy8gS2V5IGRlc2NyaXB0b3IgdmVyc2lvbgorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9CisJCSgoKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkgfHwgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpKSA/IChERVNDX1RZUEVfQUVTKSA6IChERVNDX1RZUEVfVEtJUCkpOworCisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlNaWMJPSAxOworCVBhY2tldC5LZXlEZXNjLktleUluZm8uU2VjdXJlCT0gMTsKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLlJlcXVlc3QJPSAxOworCisJUGFja2V0LktleURlc2MuS2V5RGF0YUxlblsxXQk9IDEyOworCisJLy8gdXNlIG91ciBvd24gT1VJIHRvIGRpc3Rpbmd1aXNoIHByb3ByaWV0YXJ5IHdpdGggc3RhbmRhcmQuCisJUGFja2V0LktleURlc2MuS2V5RGF0YVswXQkJPSAweEREOworCVBhY2tldC5LZXlEZXNjLktleURhdGFbMV0JCT0gMHgwQTsKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzJdCQk9IDB4MDA7CisJUGFja2V0LktleURlc2MuS2V5RGF0YVszXQkJPSAweDBDOworCVBhY2tldC5LZXlEZXNjLktleURhdGFbNF0JCT0gMHg0MzsKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzVdCQk9IDB4MDM7CisJTmRpc01vdmVNZW1vcnkoJlBhY2tldC5LZXlEZXNjLktleURhdGFbNl0sIHBEQSwgTUFDX0FERFJfTEVOKTsKKworCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBBZC0+U3RhQ2ZnLkRsc1JlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLy8gQWxsb2NhdGUgYnVmZmVyIGZvciB0cmFuc21pdHRpbmcgbWVzc2FnZQorCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CisJaWYgKE5TdGF0dXMJIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJcmV0dXJuIE5TdGF0dXM7CisKKwkvLyBQcmVwYXJlIEVBUE9MIGZyYW1lIGZvciBNSUMgY2FsY3VsYXRpb24KKwkvLyBCZSBjYXJlZnVsLCBvbmx5IEVBUE9MIGZyYW1lIGlzIGNvdW50ZWQgZm9yIE1JQyBjYWxjdWxhdGlvbgorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCisJCSAgICAgICAgICAgICAgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgICAgJlBhY2tldCwKKwkJICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7CisKKwkvLyB1c2UgcHJvcHJpZXRhcnkgUFRLCisJTmRpc1plcm9NZW1vcnkodGVtcCwgNjQpOworCU5kaXNNb3ZlTWVtb3J5KHRlbXAsICJJRUVFODAyLjExIFdJUkVMRVNTIEFDQ0VTUyBQT0lOVCIsIDMyKTsKKwlXcGFDb3VudFBUSyhwQWQsIHRlbXAsIHRlbXAsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCB0ZW1wLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBEbHNQVEssIExFTl9QVEspOworCisJLy8gY2FsY3VsYXRlIE1JQworCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CisJCS8vIEFFUworCQlOZGlzWmVyb01lbW9yeShkaWdlc3QsCXNpemVvZihkaWdlc3QpKTsKKwkJSE1BQ19TSEExKHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBEbHNQVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5TWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKwllbHNlCisJeworCQlOZGlzWmVyb01lbW9yeShNaWMsCXNpemVvZihNaWMpKTsKKwkJaG1hY19tZDUoRGxzUFRLLCBMRU5fRUFQX01JQ0ssIHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBNaWMpOworCQlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisJfQorCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKwkgICAgICAgICAgICAgICAgICBzaXplb2YoSGVhZGVyODAyXzMpLAlIZWFkZXI4MDJfMywKKwkJICAgICAgICAgICAgICBQYWNrZXQuQm9keV9MZW5bMV0gKyA0LAkmUGFja2V0LAorCQkgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKworCU5TdGF0dXMgPSBSVE1QQWxsb2NhdGVOZGlzUGFja2V0KHBBZCwgJnBOZGlzUGFja2V0LCBOVUxMLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJaWYgKE5TdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCVJUTVBfU0VUX1BBQ0tFVF9XQ0lEKHBOZGlzUGFja2V0LCBCU1NJRF9XQ0lEKTsKKwkJU1RBU2VuZFBhY2tldChwQWQsIHBOZGlzUGFja2V0KTsKKwkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKKwl9CisKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNlbmRTVEFLZXlSZXF1ZXN0LSBTZW5kIFNUQUtleSByZXF1ZXN0IChOU3RhdHVzPSV4LCBGcmFtZUxlbj0lbGQpXG4iLCBOU3RhdHVzLCBGcmFtZUxlbikpOworCisJcmV0dXJuIE5TdGF0dXM7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworTkRJU19TVEFUVVMgUlRNUFNlbmRTVEFLZXlIYW5kU2hha2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcERBKQoreworCVVDSEFSCQkJCUhlYWRlcjgwMl8zWzE0XTsKKwlORElTX1NUQVRVUwkJCU5TdGF0dXM7CisJVUxPTkcJCQkJRnJhbWVMZW4gPSAwOworCUVBUE9MX1BBQ0tFVAkJUGFja2V0OworCVVDSEFSCQkJCU1pY1sxNl07CisJVUNIQVIJCQkJZGlnZXN0WzgwXTsKKwlQVUNIQVIJCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisJUE5ESVNfUEFDS0VUCQlwTmRpc1BhY2tldDsKKwlVQ0hBUgkJCQl0ZW1wWzY0XTsKKwlVQ0hBUgkJCQlEbHNQVEtbODBdOwkJCS8vIER1ZSB0byBkaXJ2ZXIgY2FuIG5vdCBnZXQgUFRLLCB1c2UgcHJvcHJpZXRhcnkgUFRLCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFJUTVBTZW5kU1RBS2V5SGFuZFNoYWtlKCkgdG8gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsIHBEQVswXSwgcERBWzFdLCBwREFbMl0sIHBEQVszXSwgcERBWzRdLCBwREFbNV0pKTsKKworCXBBZC0+U2VxdWVuY2UgKys7CisJTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7CisKKwkvLyBaZXJvIG1lc3NhZ2UgYm9keQorCU5kaXNaZXJvTWVtb3J5KCZQYWNrZXQsIHNpemVvZihQYWNrZXQpKTsKKwlQYWNrZXQuUHJvVmVyID0gRUFQT0xfVkVSOworCVBhY2tldC5Qcm9UeXBlICAgID0gRUFQT0xLZXk7CisJUGFja2V0LkJvZHlfTGVuWzFdICA9IHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFICsgNiArIE1BQ19BRERSX0xFTjsJCS8vIGRhdGEgZmllbGQgY29udGFpbiBLREUgYW5kIFBlZXIgTUFDIGFkZHJlc3MKKworCS8vIFNUQUtleSBNZXNzYWdlIGlzIGFzIEVBUE9MLUtleSgxLDEsMCwwLEcvMCwwLDAsIE1JQywgMCxQZWVyIE1BQyBLREUpCisJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKQorICAgIHsKKyAgICAgICAgUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTFfS0VZX0RFU0M7CisgICAgfQorICAgIGVsc2UgaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCisgICAgeworICAgICAgICBQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMl9LRVlfREVTQzsKKyAgICB9CisKKwkvLyBLZXkgZGVzY3JpcHRvciB2ZXJzaW9uCisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0KKwkJKCgocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSB8fCAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpID8gKERFU0NfVFlQRV9BRVMpIDogKERFU0NfVFlQRV9US0lQKSk7CisKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleU1pYwk9IDE7CisJUGFja2V0LktleURlc2MuS2V5SW5mby5TZWN1cmUJPSAxOworCisJUGFja2V0LktleURlc2MuS2V5RGF0YUxlblsxXQk9IDEyOworCisJLy8gdXNlIG91ciBvd24gT1VJIHRvIGRpc3Rpbmd1aXNoIHByb3ByaWV0YXJ5IHdpdGggc3RhbmRhcmQuCisJUGFja2V0LktleURlc2MuS2V5RGF0YVswXQkJPSAweEREOworCVBhY2tldC5LZXlEZXNjLktleURhdGFbMV0JCT0gMHgwQTsKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzJdCQk9IDB4MDA7CisJUGFja2V0LktleURlc2MuS2V5RGF0YVszXQkJPSAweDBDOworCVBhY2tldC5LZXlEZXNjLktleURhdGFbNF0JCT0gMHg0MzsKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzVdCQk9IDB4MDM7CisJTmRpc01vdmVNZW1vcnkoJlBhY2tldC5LZXlEZXNjLktleURhdGFbNl0sIHBEQSwgTUFDX0FERFJfTEVOKTsKKworCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBBZC0+U3RhQ2ZnLkRsc1JlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLy8gQWxsb2NhdGUgYnVmZmVyIGZvciB0cmFuc21pdHRpbmcgbWVzc2FnZQorCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CisJaWYgKE5TdGF0dXMJIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJcmV0dXJuIE5TdGF0dXM7CisKKwkvLyBQcmVwYXJlIEVBUE9MIGZyYW1lIGZvciBNSUMgY2FsY3VsYXRpb24KKwkvLyBCZSBjYXJlZnVsLCBvbmx5IEVBUE9MIGZyYW1lIGlzIGNvdW50ZWQgZm9yIE1JQyBjYWxjdWxhdGlvbgorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCisJCSAgICAgICAgICAgICAgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgICAgJlBhY2tldCwKKwkJICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7CisKKwkvLyB1c2UgcHJvcHJpZXRhcnkgUFRLCisJTmRpc1plcm9NZW1vcnkodGVtcCwgNjQpOworCU5kaXNNb3ZlTWVtb3J5KHRlbXAsICJJRUVFODAyLjExIFdJUkVMRVNTIEFDQ0VTUyBQT0lOVCIsIDMyKTsKKwlXcGFDb3VudFBUSyhwQWQsIHRlbXAsIHRlbXAsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCB0ZW1wLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBEbHNQVEssIExFTl9QVEspOworCisJLy8gY2FsY3VsYXRlIE1JQworCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CisJCS8vIEFFUworCQlOZGlzWmVyb01lbW9yeShkaWdlc3QsCXNpemVvZihkaWdlc3QpKTsKKwkJSE1BQ19TSEExKHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBEbHNQVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5TWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKwllbHNlCisJeworCQlOZGlzWmVyb01lbW9yeShNaWMsCXNpemVvZihNaWMpKTsKKwkJaG1hY19tZDUoRGxzUFRLLCBMRU5fRUFQX01JQ0ssIHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBNaWMpOworCQlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisJfQorCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKwkgICAgICAgICAgICAgICAgICBzaXplb2YoSGVhZGVyODAyXzMpLAlIZWFkZXI4MDJfMywKKwkJICAgICAgICAgICAgICBQYWNrZXQuQm9keV9MZW5bMV0gKyA0LAkmUGFja2V0LAorCQkgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKworCU5TdGF0dXMgPSBSVE1QQWxsb2NhdGVOZGlzUGFja2V0KHBBZCwgJnBOZGlzUGFja2V0LCBOVUxMLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJaWYgKE5TdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCVJUTVBfU0VUX1BBQ0tFVF9XQ0lEKHBOZGlzUGFja2V0LCBCU1NJRF9XQ0lEKTsKKwkJU1RBU2VuZFBhY2tldChwQWQsIHBOZGlzUGFja2V0KTsKKwkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKKwl9CisKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNlbmRTVEFLZXlIYW5kU2hha2UtIFNlbmQgU1RBS2V5IE1lc3NhZ2UtMiAoTlN0YXR1cz0leCwgRnJhbWVMZW49JWxkKVxuIiwgTlN0YXR1cywgRnJhbWVMZW4pKTsKKworCXJldHVybiBOU3RhdHVzOworfQorCitWT0lEIERsc1RpbWVvdXRBY3Rpb24oCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCU1MTUVfRExTX1JFUV9TVFJVQ1QJCU1sbWVEbHNSZXE7CisJVVNIT1JUCQkJCQlyZWFzb247CisJUFJUXzgwMl8xMV9ETFMJCQlwRExTID0gKFBSVF84MDJfMTFfRExTKUZ1bmN0aW9uQ29udGV4dDsKKwlQUlRNUF9BREFQVEVSCQkJcEFkID0gcERMUy0+cEFkOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRGxzVGltZW91dCAtIFRlYXIgZG93biBETFMgbGlua3MgKCUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4KVxuIiwKKwkJcERMUy0+TWFjQWRkclswXSwgcERMUy0+TWFjQWRkclsxXSwgcERMUy0+TWFjQWRkclsyXSwgcERMUy0+TWFjQWRkclszXSwgcERMUy0+TWFjQWRkcls0XSwgcERMUy0+TWFjQWRkcls1XSkpOworCisJaWYgKChwRExTKSAmJiAocERMUy0+VmFsaWQpKQorCXsKKwkJcmVhc29uCQkJPSBSRUFTT05fUU9TX1JFUVVFU1RfVElNRU9VVDsKKwkJcERMUy0+VmFsaWQJCT0gRkFMU0U7CisJCXBETFMtPlN0YXR1cwk9IERMU19OT05FOworCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCBwRExTLCByZWFzb24pOworCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfVEVBUl9ET1dOLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKKwkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCX0KK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0Rlc2NyaXB0aW9uIDogYmVjYXVzZSBETFMgYW5kIENMSSBzaGFyZSB0aGUgc2FtZSBXQ0lEIHRhYmxlIGluIEFTSUMuCitNZXNoIGVudHJ5IGFsc28gaW5zZXJ0IHRvIHBBZC0+TWFjVGFiLmNvbnRlbnRbXS4gIFN1Y2ggaXMgbWFya2VkIGFzIFZhbGlkQXNEbHMgPSBUUlVFLgorQWxzbyBmaWxscyB0aGUgcGFpcndpc2Uga2V5LgorQmVjYXVzZSBmcm9udCBNQVhfQUlEX0JBIGVudHJpZXMgaGF2ZSBkaXJlY3QgbWFwcGluZyB0byBCQUVudHJ5LCB3aGljaCBpcyBvbmx5IHVzZWQgYXMgQ0xJLiBTbyB3ZSBpbnNlcnQgRGxzCitmcm9tIGluZGV4IE1BWF9BSURfQkEuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTUFDX1RBQkxFX0VOVFJZICpNYWNUYWJsZUluc2VydERsc0VudHJ5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIJcEFkZHIsCisJSU4gIFVJTlQJRGxzRW50cnlJZHgpCit7CisJUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgPSBOVUxMOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gTWFjVGFibGVJbnNlcnREbHNFbnRyeVxuIikpOworCS8vIGlmIEZVTEwsIHJldHVybgorCWlmIChwQWQtPk1hY1RhYi5TaXplID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCQlyZXR1cm4gTlVMTDsKKworCWRvCisJeworCQlpZigocEVudHJ5ID0gRGxzRW50cnlUYWJsZUxvb2t1cChwQWQsIHBBZGRyLCBUUlVFKSkgIT0gTlVMTCkKKwkJCWJyZWFrOworCisJCS8vIGFsbG9jYXRlIG9uZSBNQUMgZW50cnkKKwkJcEVudHJ5ID0gTWFjVGFibGVJbnNlcnRFbnRyeShwQWQsIHBBZGRyLCBEbHNFbnRyeUlkeCArIE1JTl9ORVRfREVWSUNFX0ZPUl9ETFMsIFRSVUUpOworCQlpZiAocEVudHJ5KQorCQl7CisJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtEbHNFbnRyeUlkeF0uTWFjVGFiTWF0Y2hXQ0lEID0gcEVudHJ5LT5BaWQ7CisJCQlwRW50cnktPk1hdGNoRGxzRW50cnlJZHggPSBEbHNFbnRyeUlkeDsKKwkJCXBFbnRyeS0+QXV0aE1vZGUgPSBwQWQtPlN0YUNmZy5BdXRoTW9kZTsKKwkJCXBFbnRyeS0+V2VwU3RhdHVzID0gcEFkLT5TdGFDZmcuV2VwU3RhdHVzOworCQkJcEVudHJ5LT5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYWNUYWJsZUluc2VydERsc0VudHJ5IC0gYWxsb2NhdGUgZW50cnkgIyVkLCBUb3RhbD0gJWRcbiIscEVudHJ5LT5BaWQsIHBBZC0+TWFjVGFiLlNpemUpKTsKKworCQkJLy8gSWYgbGVnYWN5IFdFUCBpcyB1c2VkLCBzZXQgcGFpci13aXNlIGNpcGhlckFsZyBpbnRvIFdDSUQgYXR0cmlidXRlIHRhYmxlIGZvciB0aGlzIGVudHJ5CisJCQlpZiAoKHBFbnRyeS0+VmFsaWRBc0RscykgJiYgKHBFbnRyeS0+V2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKSkKKwkJCXsKKwkJCQlVQ0hBUiBLZXlJZHggPSAwOworCQkJCVVDSEFSIENpcGhlckFsZyA9IDA7CisKKwkJCQlLZXlJZHgJPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CisKKwkJCQlDaXBoZXJBbGcgCT0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGc7CisKKwkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKwkJCQkJCQkJCQkJQlNTMCwKKwkJCQkJCQkJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAorCQkJCQkJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZywKKwkJCQkJCQkJCQkJcEVudHJ5KTsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlKEZBTFNFKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT09IE1hY1RhYmxlSW5zZXJ0RGxzRW50cnlcbiIpKTsKKworCXJldHVybiBwRW50cnk7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlEZWxldGUgYWxsIE1lc2ggRW50cnkgaW4gcEFkLT5NYWNUYWIKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIE1hY1RhYmxlRGVsZXRlRGxzRW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUIHdjaWQsCisJSU4gUFVDSEFSIHBBZGRyKQoreworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+IE1hY1RhYmxlRGVsZXRlRGxzRW50cnlcbiIpKTsKKworCWlmICghVkFMSURfV0NJRCh3Y2lkKSkKKwkJcmV0dXJuIEZBTFNFOworCisJTWFjVGFibGVEZWxldGVFbnRyeShwQWQsIHdjaWQsIHBBZGRyKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT09IE1hY1RhYmxlRGVsZXRlRGxzRW50cnlcbiIpKTsKKworCXJldHVybiBUUlVFOworfQorCitNQUNfVEFCTEVfRU5UUlkgKkRsc0VudHJ5VGFibGVMb29rdXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSCXBBZGRyLAorCUlOIEJPT0xFQU4JYlJlc2V0SWRlbENvdW50KQoreworCVVMT05HIEhhc2hJZHg7CisJTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSBOVUxMOworCisJUlRNUF9TRU1fTE9DSygmcEFkLT5NYWNUYWJMb2NrKTsKKwlIYXNoSWR4ID0gTUFDX0FERFJfSEFTSF9JTkRFWChwQWRkcik7CisJcEVudHJ5ID0gcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XTsKKworCXdoaWxlIChwRW50cnkpCisJeworCQlpZiAoKHBFbnRyeS0+VmFsaWRBc0RscyA9PSBUUlVFKQorCQkJJiYgTUFDX0FERFJfRVFVQUwocEVudHJ5LT5BZGRyLCBwQWRkcikpCisJCXsKKwkJCWlmKGJSZXNldElkZWxDb3VudCkKKwkJCQlwRW50cnktPk5vRGF0YUlkbGVDb3VudCA9IDA7CisJCQlicmVhazsKKwkJfQorCQllbHNlCisJCQlwRW50cnkgPSBwRW50cnktPnBOZXh0OworCX0KKworCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5NYWNUYWJMb2NrKTsKKwlyZXR1cm4gcEVudHJ5OworfQorCitNQUNfVEFCTEVfRU5UUlkgKkRsc0VudHJ5VGFibGVMb29rdXBCeVdjaWQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIJd2NpZCwKKwlJTiBQVUNIQVIJcEFkZHIsCisJSU4gQk9PTEVBTgliUmVzZXRJZGVsQ291bnQpCit7CisJVUxPTkcgRExzSW5kZXg7CisJUE1BQ19UQUJMRV9FTlRSWSBwQ3VyRW50cnkgPSBOVUxMOworCVBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5ID0gTlVMTDsKKworCWlmICghVkFMSURfV0NJRCh3Y2lkKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlSVE1QX1NFTV9MT0NLKCZwQWQtPk1hY1RhYkxvY2spOworCisJZG8KKwl7CisJCXBDdXJFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3djaWRdOworCisJCURMc0luZGV4ID0gMHhmZjsKKwkJaWYgKChwQ3VyRW50cnkpICYmIChwQ3VyRW50cnktPlZhbGlkQXNEbHM9PSBUUlVFKSkKKwkJeworCQkJRExzSW5kZXggPSBwQ3VyRW50cnktPk1hdGNoRGxzRW50cnlJZHg7CisJCX0KKworCQlpZiAoRExzSW5kZXggPT0gMHhmZikKKwkJCWJyZWFrOworCisJCWlmIChNQUNfQUREUl9FUVVBTChwQ3VyRW50cnktPkFkZHIsIHBBZGRyKSkKKwkJeworCQkJaWYoYlJlc2V0SWRlbENvdW50KQorCQkJCXBDdXJFbnRyeS0+Tm9EYXRhSWRsZUNvdW50ID0gMDsKKwkJCXBFbnRyeSA9IHBDdXJFbnRyeTsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZShGQUxTRSk7CisKKwlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+TWFjVGFiTG9jayk7CisKKwlyZXR1cm4gcEVudHJ5OworfQorCitJTlQgU2V0X0Rsc0VudHJ5SW5mb19EaXNwbGF5X1Byb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIGFyZykKK3sKKwlJTlQgaTsKKworCXByaW50aygiXG4lLTE5cyUtOHNcbiIsICJNQUMiLCAiVElNRU9VVFxuIik7CisJZm9yIChpPTA7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwl7CisJCWlmICgocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQpICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkpCisJCXsKKwkJCVBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lEXTsKKworCQkJcHJpbnRrKCIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAgIiwKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyWzBdLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyWzFdLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyWzJdLAorCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHJbM10sIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHJbNF0sIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHJbNV0pOworCQkJcHJpbnRrKCIlLThkXG4iLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0KTsKKworCQkJcHJpbnRrKCJcbiIpOworCQkJcHJpbnRrKCJcbiUtMTlzJS00cyUtNHMlLTRzJS00cyUtOHMlLTdzJS03cyUtN3MlLTEwcyUtNnMlLTZzJS02cyUtNnNcbiIsCisJCQkJICAgIk1BQyIsICJBSUQiLCAiQlNTIiwgIlBTTSIsICJXTU0iLCAiTUlNT1BTIiwgIlJTU0kwIiwgIlJTU0kxIiwgIlJTU0kyIiwgIlBoTWQiLCAiQlciLCAiTUNTIiwgIlNHSSIsICJTVEJDIik7CisJCQlwcmludGsoIiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYICAiLAorCQkJCXBFbnRyeS0+QWRkclswXSwgcEVudHJ5LT5BZGRyWzFdLCBwRW50cnktPkFkZHJbMl0sCisJCQkJcEVudHJ5LT5BZGRyWzNdLCBwRW50cnktPkFkZHJbNF0sIHBFbnRyeS0+QWRkcls1XSk7CisJCQlwcmludGsoIiUtNGQiLCAoaW50KXBFbnRyeS0+QWlkKTsKKwkJCXByaW50aygiJS00ZCIsIChpbnQpcEVudHJ5LT5hcGlkeCk7CisJCQlwcmludGsoIiUtNGQiLCAoaW50KXBFbnRyeS0+UHNNb2RlKTsKKwkJCXByaW50aygiJS00ZCIsIChpbnQpQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSkpOworCQkJcHJpbnRrKCIlLThkIiwgKGludClwRW50cnktPk1tcHNNb2RlKTsKKwkJCXByaW50aygiJS03ZCIsIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMCk7CisJCQlwcmludGsoIiUtN2QiLCBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTEpOworCQkJcHJpbnRrKCIlLTdkIiwgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kyKTsKKwkJCXByaW50aygiJS0xMHMiLCBHZXRQaHlNb2RlKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUpKTsKKwkJCXByaW50aygiJS02cyIsIEdldEJXKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLkJXKSk7CisJCQlwcmludGsoIiUtNmQiLCBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MpOworCQkJcHJpbnRrKCIlLTZkIiwgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSk7CisJCQlwcmludGsoIiUtNmQiLCBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TVEJDKTsKKwkJCXByaW50aygiJS0xMGQsICVkLCAlZCUlXG4iLCBwRW50cnktPkRlYnVnRklGT0NvdW50LCBwRW50cnktPkRlYnVnVHhDb3VudCwKKwkJCQkJCShwRW50cnktPkRlYnVnVHhDb3VudCkgPyAoKHBFbnRyeS0+RGVidWdUeENvdW50LXBFbnRyeS0+RGVidWdGSUZPQ291bnQpKjEwMC9wRW50cnktPkRlYnVnVHhDb3VudCkgOiAwKTsKKwkJCXByaW50aygiXG4iKTsKKworCQl9CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfRGxzQWRkRW50cnlfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisgICAgVUNIQVIJbWFjW01BQ19BRERSX0xFTl07CisJVVNIT1JUCVRpbWVvdXQ7CisJY2hhciAqdG9rZW4sIHNlcFZhbHVlW10gPSAiOiIsIERBU0ggPSAnLSc7CisJSU5UIGk7CisgICAgUlRfODAyXzExX0RMUwlEbHM7CisKKyAgICBpZihzdHJsZW4oYXJnKSA8IDE5KSAgLy9NYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcgcGx1cyB0aGUgIi0iIGFuZCB0aW1lb3V0IHZhbHVlIGluIGRlY2ltYWwgZm9ybWF0LgorCQlyZXR1cm4gRkFMU0U7CisKKwl0b2tlbiA9IHN0cmNocihhcmcsIERBU0gpOworCWlmICgodG9rZW4gIT0gTlVMTCkgJiYgKHN0cmxlbih0b2tlbik+MSkpCisJeworCQlUaW1lb3V0ID0gc2ltcGxlX3N0cnRvbCgodG9rZW4rMSksIDAsIDEwKTsKKworCQkqdG9rZW4gPSAnXDAnOworCQlmb3IgKGkgPSAwLCB0b2tlbiA9IHJzdHJ0b2soYXJnLCAmc2VwVmFsdWVbMF0pOyB0b2tlbjsgdG9rZW4gPSByc3RydG9rKE5VTEwsICZzZXBWYWx1ZVswXSksIGkrKykKKwkJeworCQkJaWYoKHN0cmxlbih0b2tlbikgIT0gMikgfHwgKCFpc3hkaWdpdCgqdG9rZW4pKSB8fCAoIWlzeGRpZ2l0KCoodG9rZW4rMSkpKSkKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQlBdG9IKHRva2VuLCAoUFVDSEFSKSgmbWFjW2ldKSwgMSk7CisJCX0KKwkJaWYoaSAhPSA2KQorCQkJcmV0dXJuIEZBTFNFOworCisJICAgIHByaW50aygiXG4lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC0lZCIsIG1hY1swXSwgbWFjWzFdLAorCSAgICAgICAgICAgbWFjWzJdLCBtYWNbM10sIG1hY1s0XSwgbWFjWzVdLCAoaW50KVRpbWVvdXQpOworCisJCU5kaXNaZXJvTWVtb3J5KCZEbHMsIHNpemVvZihSVF84MDJfMTFfRExTKSk7CisJCURscy5UaW1lT3V0ID0gVGltZW91dDsKKwkJQ09QWV9NQUNfQUREUihEbHMuTWFjQWRkciwgbWFjKTsKKwkJRGxzLlZhbGlkID0gMTsKKworCQlNbG1lRW5xdWV1ZShwQWQsCisJCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJCQlSVF9PSURfODAyXzExX1NFVF9ETFNfUEFSQU0sCisJCQkJCXNpemVvZihSVF84MDJfMTFfRExTKSwKKwkJCQkJJkRscyk7CisKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJcmV0dXJuIEZBTFNFOworCit9CisKK0lOVAlTZXRfRGxzVGVhckRvd25FbnRyeV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVQ0hBUgkJCW1hY0FkZHJbTUFDX0FERFJfTEVOXTsKKwlDSEFSCQkJKnZhbHVlOworCUlOVAkJCQlpOworCVJUXzgwMl8xMV9ETFMJRGxzOworCisJaWYoc3RybGVuKGFyZykgIT0gMTcpICAvL01hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNworCQlyZXR1cm4gRkFMU0U7CisKKwlmb3IgKGk9MCwgdmFsdWUgPSByc3RydG9rKGFyZywiOiIpOyB2YWx1ZTsgdmFsdWUgPSByc3RydG9rKE5VTEwsIjoiKSkKKwl7CisJCWlmKChzdHJsZW4odmFsdWUpICE9IDIpIHx8ICghaXN4ZGlnaXQoKnZhbHVlKSkgfHwgKCFpc3hkaWdpdCgqKHZhbHVlKzEpKSkgKQorCQkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkCisKKwkJQXRvSCh2YWx1ZSwgJm1hY0FkZHJbaSsrXSwgMik7CisJfQorCisJcHJpbnRrKCJcbiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiwgbWFjQWRkclswXSwgbWFjQWRkclsxXSwKKwkgICAgICAgICAgIG1hY0FkZHJbMl0sIG1hY0FkZHJbM10sIG1hY0FkZHJbNF0sIG1hY0FkZHJbNV0pOworCisJTmRpc1plcm9NZW1vcnkoJkRscywgc2l6ZW9mKFJUXzgwMl8xMV9ETFMpKTsKKwlDT1BZX01BQ19BRERSKERscy5NYWNBZGRyLCBtYWNBZGRyKTsKKwlEbHMuVmFsaWQgPSAwOworCisJTWxtZUVucXVldWUocEFkLAorCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJCVJUX09JRF84MDJfMTFfU0VUX0RMU19QQVJBTSwKKwkJCQlzaXplb2YoUlRfODAyXzExX0RMUyksCisJCQkJJkRscyk7CisKKwlyZXR1cm4gVFJVRTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvcnRtcF9kYXRhLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9ydG1wX2RhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmFmZjI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvcnRtcF9kYXRhLmMKQEAgLTAsMCArMSwyNjE0IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXJ0bXBfZGF0YS5jCisKKwlBYnN0cmFjdDoKKwlEYXRhIHBhdGggc3Vicm91dGluZXMKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvIAkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSm9obgkJICAgICAgQXVnLzE3LzA0CQltYWpvciBtb2RpZmljYXRpb24gZm9yIFJUMjU2MS8yNjYxCisJSmFuIExlZQkgICAgICBNYXIvMTcvMDYJCW1ham9yIG1vZGlmaWNhdGlvbiBmb3IgUlQyODYwIE5ldyBSaW5nIERlc2lnbgorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworCisKK1ZPSUQgU1RBUnhFQVBPTEZyYW1lSW5kaWNhdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnksCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQoreworCVBSVDI4WFhfUlhEX1NUUlVDCXBSeEQgPSAmKHBSeEJsay0+UnhEKTsKKwlQUlhXSV9TVFJVQwkJcFJ4V0kgPSBwUnhCbGstPnBSeFdJOworCVVDSEFSCQkJKnBUbXBCdWY7CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkKKwl7CisJCS8vIEFsbCBFQVBvTCBmcmFtZXMgaGF2ZSB0byBwYXNzIHRvIHVwcGVyIGxheWVyIChleC4gV1BBX1NVUFBMSUNBTlQgZGFlbW9uKQorCQkvLyBUQkQgOiBwcm9jZXNzIGZyYWdtZW50ZWQgRUFQb2wgZnJhbWVzCisJCXsKKwkJCS8vIEluIDgwMi4xeCBtb2RlLCBpZiB0aGUgcmVjZWl2ZWQgZnJhbWUgaXMgRUFQLVNVQ0NFU1MgcGFja2V0LCB0dXJuIG9uIHRoZSBQb3J0U2VjdXJlZCB2YXJpYWJsZQorCQkJaWYgKCBwQWQtPlN0YUNmZy5JRUVFODAyMVggPT0gVFJVRSAmJgorCQkJCSAoRUFQX0NPREVfU1VDQ0VTUyA9PSBXcGFDaGVja0VhcENvZGUocEFkLCBwUnhCbGstPnBEYXRhLCBwUnhCbGstPkRhdGFTaXplLCBMRU5HVEhfODAyXzFfSCkpKQorCQkJeworCQkJCVBVQ0hBUglLZXk7CisJCQkJVUNIQVIgCUNpcGhlckFsZzsKKwkJCQlpbnQgICAgIGlkeCA9IDA7CisKKwkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVAtU1VDQ0VTUyBQYWNrZXRcbiIpKTsKKwkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZCk7CisKKyAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMgPT0gRkFMU0UpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZHggPSBwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlJZDsKKyAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnID0gcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uQ2lwaGVyQWxnOworCQkJCQlLZXkgPSBwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbaWR4XS5LZXk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtpZHhdLktleUxlbiA+IDApCisgICAgCQkJCXsKKyNpZmRlZiBSVDI4NjAKKwkJCQkJCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07CisKKwkJCQkJCS8vIFNldCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyB0byBBc2ljCisJCQkJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCBpZHgsIENpcGhlckFsZywgS2V5LCBOVUxMLCBOVUxMKTsKKworCQkJCQkJLy8gQXNzaWduIGdyb3VwIGtleSBpbmZvCisJCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgQlNTMCwgaWR4LCBDaXBoZXJBbGcsIE5VTEwpOworCisJCQkJCQkvLyBBc3NpZ24gcGFpcndpc2Uga2V5IGluZm8KKwkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBCU1MwLCBpZHgsIENpcGhlckFsZywgcEVudHJ5KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX1VQOworI2VuZGlmIC8vIFJUMjg2MCAvLworCQkJCQkJLy8gRm9yIFByZXZlbnRpbmcgU2hhcmRLZXkgVGFibGUgaXMgY2xlYXJlZCBieSByZW1vdmUga2V5IHByb2NlZHVyZS4KKyAgICAJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlMZW4gPSBwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbaWR4XS5LZXlMZW47CisJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleSwKKwkJCQkJCQkJCSAgIHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtpZHhdLktleSwKKwkJCQkJCQkJCSAgIHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtpZHhdLktleUxlbik7CisgICAgCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCUluZGljYXRlX0xlZ2FjeV9QYWNrZXQocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwllbHNlCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCXsKKwkJLy8gU3BlY2lhbCBEQVRBIGZyYW1lIHRoYXQgaGFzIHRvIHBhc3MgdG8gTUxNRQorCQkvLwkgMS4gQ2lzY28gQWlyb25ldCBmcmFtZXMgZm9yIENDWDIuIFdlIG5lZWQgcGFzcyBpdCB0byBNTE1FIGZvciBzcGVjaWFsIHByb2Nlc3MKKwkJLy8JIDIuIEVBUE9MIGhhbmRzaGFraW5nIGZyYW1lcyB3aGVuIGRyaXZlciBzdXBwbGljYW50IGVuYWJsZWQsIHBhc3MgdG8gTUxNRSBmb3Igc3BlY2lhbCBwcm9jZXNzCisJCXsKKwkJCXBUbXBCdWYgPSBwUnhCbGstPnBEYXRhIC0gTEVOR1RIXzgwMl8xMTsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBUbXBCdWYsIHBSeEJsay0+cEhlYWRlciwgTEVOR1RIXzgwMl8xMSk7CisJCQlSRVBPUlRfTUdNVF9GUkFNRV9UT19NTE1FKHBBZCwgcFJ4V0ktPldpcmVsZXNzQ2xpSUQsIHBUbXBCdWYsIHBSeEJsay0+RGF0YVNpemUgKyBMRU5HVEhfODAyXzExLCBwUnhXSS0+UlNTSTAsIHBSeFdJLT5SU1NJMSwgcFJ4V0ktPlJTU0kyLCBwUnhELT5QbGNwU2lnbmFsKTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIhISEgcmVwb3J0IEVBUE9ML0FJUk9ORVQgREFUQSB0byBNTE1FIChsZW49JWQpICEhIVxuIiwgcFJ4QmxrLT5EYXRhU2l6ZSkpOworCQl9CisJfQorCisJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwlyZXR1cm47CisKK30KKworVk9JRCBTVEFSeERhdGFGcmFtZUFubm91bmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKworCS8vIG5vbi1FQVAgZnJhbWUKKwlpZiAoIVJUTVBDaGVja1dQQWZyYW1lKHBBZCwgcEVudHJ5LCBwUnhCbGstPnBEYXRhLCBwUnhCbGstPkRhdGFTaXplLCBGcm9tV2hpY2hCU1NJRCkpCisJeworCQl7CisJCQkvLyBkcm9wIGFsbCBub24tRUFQIERBVEEgZnJhbWUgYmVmb3JlCisJCQkvLyB0aGlzIGNsaWVudCdzIFBvcnQtQWNjZXNzLUNvbnRyb2wgaXMgc2VjdXJlZAorCQkJaWYgKHBSeEJsay0+cEhlYWRlci0+RkMuV2VwKQorCQkJeworCQkJCS8vIHVuc3VwcG9ydGVkIGNpcGhlciBzdWl0ZQorCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCkKKwkJCQl7CisJCQkJCS8vIHJlbGVhc2UgcGFja2V0CisJCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gZW5jcnlwdGlvbiBpbi11c2UgYnV0IHJlY2VpdmUgYSBub24tRUFQT0wgY2xlYXIgdGV4dCBmcmFtZSwgZHJvcCBpdAorCQkJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQpICYmCisJCQkJCShwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpKQorCQkJCXsKKwkJCQkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJfQorCQlSWF9CTEtfQ0xFQVJfRkxBRyhwUnhCbGssIGZSWF9FQVApOworCQlpZiAoIVJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfQVJBTElOSykpCisJCXsKKwkJCS8vIE5vcm1hbCBsZWdhY3ksIEFNUERVIG9yIEFNU0RVCisJCQlDbW1SeG5vblJhbGlua0ZyYW1lSW5kaWNhdGUocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gQVJBTElOSworCQkJQ21tUnhSYWxpbmtGcmFtZUluZGljYXRlKHBBZCwgcEVudHJ5LCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwkJfQorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQlSWF9CTEtfQ0xFQVJfRkxBRyhwUnhCbGssIGZSWF9ETFMpOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCX0KKwllbHNlCisJeworCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfRUFQKTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJaWYgKFJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfQU1QRFUpICYmIChwQWQtPkNvbW1vbkNmZy5iRGlzYWJsZVJlb3JkZXJpbmcgPT0gMCkpCisJCXsKKwkJCUluZGljYXRlX0FNUERVX1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCQl9CisJCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJeworCQkJLy8gRGV0ZXJtaW4gdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBFQVAgZnJhbWUKKwkJCS8vICB0byBXUEEgc3RhdGUgbWFjaGluZSBvciB1cHBlciBsYXllcgorCQkJU1RBUnhFQVBPTEZyYW1lSW5kaWNhdGUocEFkLCBwRW50cnksIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCQl9CisJfQorfQorCisKKy8vIEZvciBUS0lQIGZyYW1lLCBjYWxjdWxhdGUgdGhlIE1JQyB2YWx1ZQorQk9PTEVBTiBTVEFDaGVja1RraXBNSUNWYWx1ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrKQoreworCVBIRUFERVJfODAyXzExCXBIZWFkZXIgPSBwUnhCbGstPnBIZWFkZXI7CisJVUNIQVIJCQkqcERhdGEgPSBwUnhCbGstPnBEYXRhOworCVVTSE9SVAkJCURhdGFTaXplID0gcFJ4QmxrLT5EYXRhU2l6ZTsKKwlVQ0hBUgkJCVVzZXJQcmlvcml0eSA9IHBSeEJsay0+VXNlclByaW9yaXR5OworCVBDSVBIRVJfS0VZCQlwV3BhS2V5OworCVVDSEFSCQkJKnBEQSwgKnBTQTsKKworCXBXcGFLZXkgPSAmcEFkLT5TaGFyZWRLZXlbQlNTMF1bcFJ4QmxrLT5wUnhXSS0+S2V5SW5kZXhdOworCisJcERBID0gcEhlYWRlci0+QWRkcjE7CisJaWYgKFJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfSU5GUkEpKQorCXsKKwkJcFNBID0gcEhlYWRlci0+QWRkcjM7CisJfQorCWVsc2UKKwl7CisJCXBTQSA9IHBIZWFkZXItPkFkZHIyOworCX0KKworCWlmIChSVE1QVGtpcENvbXBhcmVNSUNWYWx1ZShwQWQsCisJCQkJCQkJCXBEYXRhLAorCQkJCQkJCQlwREEsCisJCQkJCQkJCXBTQSwKKwkJCQkJCQkJcFdwYUtleS0+UnhNaWMsCisJCQkJCQkJCVVzZXJQcmlvcml0eSwKKwkJCQkJCQkJRGF0YVNpemUpID09IEZBTFNFKQorCXsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiUnggTUlDIFZhbHVlIGVycm9yIDJcbiIpKTsKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkKKwkJeworCQkJV3BhU2VuZE1pY0ZhaWx1cmVUb1dwYVN1cHBsaWNhbnQocEFkLCAocFdwYUtleS0+VHlwZSA9PSBQQUlSV0lTRUtFWSkgPyBUUlVFIDogRkFMU0UpOworCQl9CisJCWVsc2UKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJCXsKKwkJCVJUTVBSZXBvcnRNaWNFcnJvcihwQWQsIHBXcGFLZXkpOworCQl9CisKKwkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXJldHVybiBUUlVFOworfQorCisKKy8vCisvLyBBbGwgUnggcm91dGluZXMgdXNlIFJYX0JMSyBzdHJ1Y3R1cmUgdG8gaGFuZGUgcnggZXZlbnRzCisvLyBJdCBpcyB2ZXJ5IGltcG9ydGFudCB0byBidWlsZCBwUnhCbGsgYXR0cmlidXRlcworLy8gIDEuIHBIZWFkZXIgcG9pbnRlciB0byA4MDIuMTEgSGVhZGVyCisvLyAgMi4gcERhdGEgcG9pbnRlciB0byBwYXlsb2FkIGluY2x1ZGluZyBMTEMgKGp1c3Qgc2tpcCBIZWFkZXIpCisvLyAgMy4gc2V0IHBheWxvYWQgc2l6ZSBpbmNsdWRpbmcgTExDIHRvIERhdGFTaXplCisvLyAgNC4gc2V0IHNvbWUgZmxhZ3Mgd2l0aCBSWF9CTEtfU0VUX0ZMQUcoKQorLy8KK1ZPSUQgU1RBSGFuZGxlUnhEYXRhRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaykKK3sKKwlQUlQyOFhYX1JYRF9TVFJVQwkJCQlwUnhEID0gJihwUnhCbGstPlJ4RCk7CisJUFJYV0lfU1RSVUMJCQkJCQlwUnhXSSA9IHBSeEJsay0+cFJ4V0k7CisJUEhFQURFUl84MDJfMTEJCQkJCXBIZWFkZXIgPSBwUnhCbGstPnBIZWFkZXI7CisJUE5ESVNfUEFDS0VUCQkJCQlwUnhQYWNrZXQgPSBwUnhCbGstPnBSeFBhY2tldDsKKwlCT09MRUFOIAkJCQkJCWJGcmFnbWVudCA9IEZBTFNFOworCU1BQ19UQUJMRV9FTlRSWQkgICAgCQkJKnBFbnRyeSA9IE5VTEw7CisJVUNIQVIJCQkJCQkJRnJvbVdoaWNoQlNTSUQgPSBCU1MwOworCVVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlclByaW9yaXR5ID0gMDsKKworCXsKKwkJLy8gYmVmb3JlIExJTksgVVAsIGFsbCBEQVRBIGZyYW1lcyBhcmUgcmVqZWN0ZWQKKwkJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJCXsKKwkJCS8vIHJlbGVhc2UgcGFja2V0CisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCXJldHVybjsKKwkJfQorCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCS8vaWYgKChwSGVhZGVyLT5GQy5GckRzID09IDApICYmIChwSGVhZGVyLT5GQy5Ub0RzID09IDApKQorCQlpZiAoUlRNUFJjdkZyYW1lRExTQ2hlY2socEFkLCBwSGVhZGVyLCBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50LCBwUnhEKSkKKwkJeworCQkJcmV0dXJuOworCQl9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKwkJLy8gRHJvcCBub3QgbXkgQlNTIGZyYW1lcworCQlpZiAocFJ4RC0+TXlCc3MgPT0gMCkKKwkJeworCQkJeworCQkJCS8vIHJlbGVhc2UgcGFja2V0CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50U2luY2VMYXN0TlVMTCsrOworCQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlICYmIChwSGVhZGVyLT5GQy5TdWJUeXBlICYgMHgwOCkpCisJCXsKKwkJCVVDSEFSICpwRGF0YTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiYkFQU0RDYXBhYmxlXG4iKSk7CisKKwkJCS8vIFFvcyBiaXQgNAorCQkJcERhdGEgPSAoUFVDSEFSKXBIZWFkZXIgKyBMRU5HVEhfODAyXzExOworCQkJaWYgKCgqcERhdGEgPj4gNCkgJiAweDAxKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUnhEb25lLSBSY3YgRU9TUCBmcmFtZSwgZHJpdmVyIG1heSBmYWxsIGludG8gc2xlZXBcbiIpKTsKKwkJCQlwQWQtPkNvbW1vbkNmZy5iSW5TZXJ2aWNlUGVyaW9kID0gRkFMU0U7CisKKwkJCQkvLyBGb3JjZSBkcml2ZXIgdG8gZmFsbCBpbnRvIHNsZWVwIG1vZGUgd2hlbiByY3YgRU9TUCBmcmFtZQorCQkJCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKwkJCQl7CisJCQkJCVVTSE9SVCAgVGJ0dE51bVRvTmV4dFdha2VVcDsKKwkJCQkJVVNIT1JUICBOZXh0RHRpbSA9IHBBZC0+U3RhQ2ZnLkR0aW1QZXJpb2Q7CisJCQkJCVVMT05HICAgTm93OworCisJCQkJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7CisJCQkJCU5leHREdGltIC09IChVU0hPUlQpKE5vdyAtIHBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWUpL3BBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZDsKKworCQkJCQlUYnR0TnVtVG9OZXh0V2FrZVVwID0gcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50OworCQkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pICYmIChUYnR0TnVtVG9OZXh0V2FrZVVwID4gTmV4dER0aW0pKQorCQkJCQkJVGJ0dE51bVRvTmV4dFdha2VVcCA9IE5leHREdGltOworCisJCQkJCU1sbWVTZXRQc21CaXQocEFkLCBQV1JfU0FWRSk7CisJCQkJCS8vIGlmIFdNTS1BUFNEIGlzIGZhaWxlZCwgdHJ5IHRvIGRpc2FibGUgZm9sbG93aW5nIGxpbmUKKwkJCQkJQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAocEFkLCBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmICgocEhlYWRlci0+RkMuTW9yZURhdGEpICYmIChwQWQtPkNvbW1vbkNmZy5iSW5TZXJ2aWNlUGVyaW9kKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNlbmRpbmcgYW5vdGhlciB0cmlnZ2VyIGZyYW1lIHdoZW4gTW9yZSBEYXRhIGJpdCBpcyBzZXQgdG8gMVxuIikpOworCQkJfQorCQl9CisKKwkJLy8gRHJvcCBOVUxMLCBDRi1BQ0sobm8gZGF0YSksIENGLVBPTEwobm8gZGF0YSksIGFuZCBDRi1BQ0srQ0YtUE9MTChubyBkYXRhKSBkYXRhIGZyYW1lCisJCWlmICgocEhlYWRlci0+RkMuU3ViVHlwZSAmIDB4MDQpKSAvLyBiaXQgMiA6IG5vIERBVEEKKwkJeworCQkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJcmV0dXJuOworCQl9CisKKwkgICAgLy8gRHJvcCBub3QgbXkgQlNTIGZyYW1lICh3ZSBjYW4gbm90IG9ubHkgY2hlY2sgdGhlIE15QnNzIGJpdCBpbiBSeEQpCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJICAgIGlmICghcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJICAgIHsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkJaWYgKElORlJBX09OKHBBZCkpCisJCXsKKwkJCS8vIEluZnJhc3RydWN0dXJlIG1vZGUsIGNoZWNrIGFkZHJlc3MgMiBmb3IgQlNTSUQKKwkJCWlmICghUlRNUEVxdWFsTWVtb3J5KCZwSGVhZGVyLT5BZGRyMiwgJnBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCA2KSkKKwkJCXsKKwkJCQkvLyBSZWNlaXZlIGZyYW1lIG5vdCBteSBCU1NJRAorCSAgICAgICAgICAgIC8vIHJlbGVhc2UgcGFja2V0CisJICAgICAgICAgICAgUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCWVsc2UJLy8gQWQtSG9jIG1vZGUgb3IgTm90IGFzc29jaWF0ZWQKKwkJeworCQkJLy8gQWQtSG9jIG1vZGUsIGNoZWNrIGFkZHJlc3MgMyBmb3IgQlNTSUQKKwkJCWlmICghUlRNUEVxdWFsTWVtb3J5KCZwSGVhZGVyLT5BZGRyMywgJnBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCA2KSkKKwkJCXsKKwkJCQkvLyBSZWNlaXZlIGZyYW1lIG5vdCBteSBCU1NJRAorCSAgICAgICAgICAgIC8vIHJlbGVhc2UgcGFja2V0CisJICAgICAgICAgICAgUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJICAgIH0KKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCQkvLworCQkvLyBmaW5kIHBFbnRyeQorCQkvLworCQlpZiAocFJ4V0ktPldpcmVsZXNzQ2xpSUQgPCBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJeworCQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbcFJ4V0ktPldpcmVsZXNzQ2xpSURdOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gMS4gcmVsZWFzZSBwYWNrZXQgaWYgaW5mcmEgbW9kZQorCQkJLy8gMi4gbmV3IGEgcEVudHJ5IGlmIGFkLWhvYyBtb2RlCisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIGluZnJhIG9yIGFkLWhvYworCQlpZiAoSU5GUkFfT04ocEFkKSkKKwkJeworCQkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX0lORlJBKTsKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCWlmICgocEhlYWRlci0+RkMuRnJEcyA9PSAwKSAmJiAocEhlYWRlci0+RkMuVG9EcyA9PSAwKSkKKwkJCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfRExTKTsKKwkJCWVsc2UKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkJCUFTU0VSVChwUnhXSS0+V2lyZWxlc3NDbGlJRCA9PSBCU1NJRF9XQ0lEKTsKKwkJfQorCisJCS8vIGNoZWNrIEF0aGVyb3MgQ2xpZW50CisJCWlmICgocEVudHJ5LT5iSUFtQmFkQXRoZXJvcyA9PSBGQUxTRSkgJiYgIChwUnhELT5BTVBEVSA9PSAxKSAmJiAocEhlYWRlci0+RkMuUmV0cnkgKSkKKwkJeworCQkJcEVudHJ5LT5iSUFtQmFkQXRoZXJvcyA9IFRSVUU7CisJCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJDdXJyZW50QXRoZXJvcyA9IFRSVUU7CisJCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJMYXN0QXRoZXJvcyA9IFRSVUU7CisJCQlpZiAoIVNUQV9BRVNfT04ocEFkKSkKKwkJCXsKKwkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIDgsIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwgRkFMU0UpOworCQkJfQorCQl9CisJfQorCisJcFJ4QmxrLT5wRGF0YSA9IChVQ0hBUiAqKXBIZWFkZXI7CisKKwkvLworCS8vIHVwZGF0ZSBSeEJsay0+cERhdGEsIERhdGFTaXplCisJLy8gODAyLjExIEhlYWRlciwgUU9TLCBIVEMsIEh3IFBhZGRpbmcKKwkvLworCisJLy8gMS4gc2tpcCA4MDIuMTEgSEVBREVSCisJeworCQlwUnhCbGstPnBEYXRhICs9IExFTkdUSF84MDJfMTE7CisJCXBSeEJsay0+RGF0YVNpemUgLT0gTEVOR1RIXzgwMl8xMTsKKwl9CisKKwkvLyAyLiBRT1MKKwlpZiAocEhlYWRlci0+RkMuU3ViVHlwZSAmIDB4MDgpCisJeworCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfUU9TKTsKKwkJVXNlclByaW9yaXR5ID0gKihwUnhCbGstPnBEYXRhKSAmIDB4MGY7CisJCS8vIGJpdCA3IGluIFFvUyBDb250cm9sIGZpZWxkIHNpZ25hbHMgdGhlIEhUIEEtTVNEVSBmb3JtYXQKKwkJaWYgKCgqcFJ4QmxrLT5wRGF0YSkgJiAweDgwKQorCQl7CisJCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfQU1TRFUpOworCQl9CisKKwkJLy8gc2tpcCBRT1MgY29udG9ybCBmaWVsZAorCQlwUnhCbGstPnBEYXRhICs9IDI7CisJCXBSeEJsay0+RGF0YVNpemUgLT0yOworCX0KKwlwUnhCbGstPlVzZXJQcmlvcml0eSA9IFVzZXJQcmlvcml0eTsKKworCS8vIDMuIE9yZGVyIGJpdDogQS1SYWxpbmsgb3IgSFRDKworCWlmIChwSGVhZGVyLT5GQy5PcmRlcikKKwl7CisjaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAorCQlpZiAoKHBSeFdJLT5QSFlNT0RFIDw9IE1PREVfT0ZETSkgJiYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKSkpCisJCXsKKwkJCVJYX0JMS19TRVRfRkxBRyhwUnhCbGssIGZSWF9BUkFMSU5LKTsKKwkJfQorCQllbHNlCisjZW5kaWYKKwkJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX0hUQyk7CisJCQkvLyBza2lwIEhUQyBjb250b3JsIGZpZWxkCisJCQlwUnhCbGstPnBEYXRhICs9IDQ7CisJCQlwUnhCbGstPkRhdGFTaXplIC09IDQ7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCX0KKwl9CisKKwkvLyA0LiBza2lwIEhXIHBhZGRpbmcKKwlpZiAocFJ4RC0+TDJQQUQpCisJeworCQkvLyBqdXN0IG1vdmUgcERhdGEgcG9pbnRlcgorCQkvLyBiZWNhdXNlIERhdGFTaXplIGV4Y2x1ZGluZyBIVyBwYWRkaW5nCisJCVJYX0JMS19TRVRfRkxBRyhwUnhCbGssIGZSWF9QQUQpOworCQlwUnhCbGstPnBEYXRhICs9IDI7CisJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKHBSeEQtPkJBKQorCXsKKwkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX0FNUERVKTsKKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKworCS8vCisJLy8gQ2FzZSBJICBQcm9jZXNzIEJyb2FkY2FzdCAmIE11bHRpY2FzdCBkYXRhIGZyYW1lCisJLy8KKwlpZiAocFJ4RC0+QmNhc3QgfHwgcFJ4RC0+TWNhc3QpCisJeworCQlJTkNfQ09VTlRFUjY0KHBBZC0+V2xhbkNvdW50ZXJzLk11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudCk7CisKKwkJLy8gRHJvcCBNY2FzdC9CY2FzdCBmcmFtZSB3aXRoIGZyYWdtZW50IGJpdCBvbgorCQlpZiAocEhlYWRlci0+RkMuTW9yZUZyYWcpCisJCXsKKwkJCS8vIHJlbGVhc2UgcGFja2V0CisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIEZpbHRlciBvdXQgQmNhc3QgZnJhbWUgd2hpY2ggQVAgcmVsYXllZCBmb3IgdXMKKwkJaWYgKHBIZWFkZXItPkZDLkZyRHMgJiYgTUFDX0FERFJfRVFVQUwocEhlYWRlci0+QWRkcjMsIHBBZC0+Q3VycmVudEFkZHJlc3MpKQorCQl7CisJCQkvLyByZWxlYXNlIHBhY2tldAorCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQlyZXR1cm47CisJCX0KKworCQlJbmRpY2F0ZV9MZWdhY3lfUGFja2V0KHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJCXJldHVybjsKKwl9CisJZWxzZSBpZiAocFJ4RC0+VTJNKQorCXsKKwkJcEFkLT5MYXN0UnhSYXRlID0gKFVTSE9SVCkoKHBSeFdJLT5NQ1MpICsgKHBSeFdJLT5CVyA8PDcpICsgKHBSeFdJLT5TaG9ydEdJIDw8OCkrIChwUnhXSS0+UEhZTU9ERSA8PDE0KSkgOworCisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKyAgICAgICAgaWYgKFJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfRExTKSkKKwkJeworCQkJTUFDX1RBQkxFX0VOVFJZICpwRGxzRW50cnkgPSBOVUxMOworCisJCQlwRGxzRW50cnkgPSBEbHNFbnRyeVRhYmxlTG9va3VwQnlXY2lkKHBBZCwgcFJ4V0ktPldpcmVsZXNzQ2xpSUQsIHBIZWFkZXItPkFkZHIyLCBUUlVFKTsKKwkJCQkJCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICBpZihwRGxzRW50cnkpCisJCQlVcGRhdGVfUnNzaV9TYW1wbGUocEFkLCAmcERsc0VudHJ5LT5Sc3NpU2FtcGxlLCBwUnhXSSk7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQlpZiAoQURIT0NfT04ocEFkKSkKKwkJeworCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwSGVhZGVyLT5BZGRyMik7CisJCQlpZiAocEVudHJ5KQorCQkJCVVwZGF0ZV9Sc3NpX1NhbXBsZShwQWQsICZwRW50cnktPlJzc2lTYW1wbGUsIHBSeFdJKTsKKwkJfQorCisKKwkJVXBkYXRlX1Jzc2lfU2FtcGxlKHBBZCwgJnBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUsIHBSeFdJKTsKKworCQlwQWQtPlN0YUNmZy5MYXN0U05SMCA9IChVQ0hBUikocFJ4V0ktPlNOUjApOworCQlwQWQtPlN0YUNmZy5MYXN0U05SMSA9IChVQ0hBUikocFJ4V0ktPlNOUjEpOworCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhPa0RhdGFDbnQrKzsKKworCisgICAgCWlmICghKChwSGVhZGVyLT5GcmFnID09IDApICYmIChwSGVhZGVyLT5GQy5Nb3JlRnJhZyA9PSAwKSkpCisgICAgCXsKKyAgICAJCS8vIHJlLWFzc2VtYmxlIHRoZSBmcmFnbWVudGVkIHBhY2tldHMKKyAgICAJCS8vIHJldHVybiBjb21wbGV0ZSBmcmFtZSAocFJ4UGFja2V0KSBvciBOVUxMCisgICAgCQliRnJhZ21lbnQgPSBUUlVFOworICAgIAkJcFJ4UGFja2V0ID0gUlRNUERlRnJhZ21lbnREYXRhRnJhbWUocEFkLCBwUnhCbGspOworICAgIAl9CisKKyAgICAJaWYgKHBSeFBhY2tldCkKKyAgICAJeworCQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbcFJ4V0ktPldpcmVsZXNzQ2xpSURdOworCisgICAgCQkvLyBwcm9jZXNzIGNvbXBsZXRlIGZyYW1lCisgICAgCQlpZiAoYkZyYWdtZW50ICYmIChwUnhELT5EZWNyeXB0ZWQpICYmIChwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSkKKyAgICAJCXsKKwkJCQkvLyBNaW51cyBNSUMgbGVuZ3RoCisJCQkJcFJ4QmxrLT5EYXRhU2l6ZSAtPSA4OworCisgICAgCQkJLy8gRm9yIFRLSVAgZnJhbWUsIGNhbGN1bGF0ZSB0aGUgTUlDIHZhbHVlCisgICAgCQkJaWYgKFNUQUNoZWNrVGtpcE1JQ1ZhbHVlKHBBZCwgcEVudHJ5LCBwUnhCbGspID09IEZBTFNFKQorICAgIAkJCXsKKyAgICAJCQkJcmV0dXJuOworICAgIAkJCX0KKyAgICAJCX0KKworICAgIAkJU1RBUnhEYXRhRnJhbWVBbm5vdW5jZShwQWQsIHBFbnRyeSwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJCQlyZXR1cm47CisgICAgCX0KKyAgICAJZWxzZQorICAgIAl7CisgICAgCQkvLyBqdXN0IHJldHVybgorICAgIAkJLy8gYmVjYXVzZSBSVE1QRGVGcmFnbWVudERhdGFGcmFtZSgpIHdpbGwgcmVsZWFzZSByeCBwYWNrZXQsCisgICAgCQkvLyBpZiBwYWNrZXQgaXMgZnJhZ21lbnRlZAorICAgIAkJcmV0dXJuOworICAgIAl9CisJfQorCisJQVNTRVJUKDApOworCS8vIHJlbGVhc2UgcGFja2V0CisJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Cit9CisKK1ZPSUQgU1RBSGFuZGxlUnhNZ210RnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaykKK3sKKwlQUlQyOFhYX1JYRF9TVFJVQwlwUnhEID0gJihwUnhCbGstPlJ4RCk7CisJUFJYV0lfU1RSVUMJCXBSeFdJID0gcFJ4QmxrLT5wUnhXSTsKKwlQSEVBREVSXzgwMl8xMQlwSGVhZGVyID0gcFJ4QmxrLT5wSGVhZGVyOworCVBORElTX1BBQ0tFVAlwUnhQYWNrZXQgPSBwUnhCbGstPnBSeFBhY2tldDsKKworCWRvCisJeworCisJCS8vIFdlIHNob3VsZCBjb2xsZWN0IFJTU0kgbm90IG9ubHkgVTJNIGRhdGEgYnV0IGFsc28gbXkgYmVhY29uCisJCWlmICgocEhlYWRlci0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX0JFQUNPTikgJiYgKE1BQ19BRERSX0VRVUFMKCZwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgJnBIZWFkZXItPkFkZHIyKSkpCisJCXsKKwkJCVVwZGF0ZV9Sc3NpX1NhbXBsZShwQWQsICZwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLCBwUnhXSSk7CisKKwkJCXBBZC0+U3RhQ2ZnLkxhc3RTTlIwID0gKFVDSEFSKShwUnhXSS0+U05SMCk7CisJCQlwQWQtPlN0YUNmZy5MYXN0U05SMSA9IChVQ0hBUikocFJ4V0ktPlNOUjEpOworCQl9CisKKwkJLy8gRmlyc3QgY2hlY2sgdGhlIHNpemUsIGl0IE1VU1Qgbm90IGV4Y2VlZCB0aGUgbWxtZSBxdWV1ZSBzaXplCisJCWlmIChwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID4gTUdNVF9ETUFfQlVGRkVSX1NJWkUpCisJCXsKKwkJCURCR1BSSU5UX0VSUigoIlNUQUhhbmRsZVJ4TWdtdEZyYW1lOiBmcmFtZSB0b28gbGFyZ2UsIHNpemUgPSAlZCBcbiIsIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJUkVQT1JUX01HTVRfRlJBTUVfVE9fTUxNRShwQWQsIHBSeFdJLT5XaXJlbGVzc0NsaUlELCBwSGVhZGVyLCBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50LAorCQkJCQkJCQkJcFJ4V0ktPlJTU0kwLCBwUnhXSS0+UlNTSTEsIHBSeFdJLT5SU1NJMiwgcFJ4RC0+UGxjcFNpZ25hbCk7CisJfSB3aGlsZSAoRkFMU0UpOworCisJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Cit9CisKK1ZPSUQgU1RBSGFuZGxlUnhDb250cm9sRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaykKK3sKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlQUlhXSV9TVFJVQwkJcFJ4V0kgPSBwUnhCbGstPnBSeFdJOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCVBIRUFERVJfODAyXzExCXBIZWFkZXIgPSBwUnhCbGstPnBIZWFkZXI7CisJUE5ESVNfUEFDS0VUCXBSeFBhY2tldCA9IHBSeEJsay0+cFJ4UGFja2V0OworCisJc3dpdGNoIChwSGVhZGVyLT5GQy5TdWJUeXBlKQorCXsKKwkJY2FzZSBTVUJUWVBFX0JMT0NLX0FDS19SRVE6CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQl7CisJCQkJQ250bEVucXVldWVGb3JSZWN2KHBBZCwgcFJ4V0ktPldpcmVsZXNzQ2xpSUQsIChwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50KSwgKFBGUkFNRV9CQV9SRVEpcEhlYWRlcik7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJY2FzZSBTVUJUWVBFX0JMT0NLX0FDSzoKKwkJY2FzZSBTVUJUWVBFX0FDSzoKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlQcm9jZXNzIFJ4RG9uZSBpbnRlcnJ1cHQsIHJ1bm5pbmcgaW4gRFBDIGxldmVsCisKKwlBcmd1bWVudHM6CisJCXBBZCBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKwkJVGhpcyByb3V0aW5lIGhhcyB0byBtYWludGFpbiBSeCByaW5nIHJlYWQgcG9pbnRlci4KKwkJTmVlZCB0byBjb25zaWRlciBRT1MgREFUQSBmb3JtYXQgd2hlbiBjb252ZXJ0aW5nIHRvIDgwMi4zCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBTVEFSeERvbmVJbnRlcnJ1cHRIYW5kbGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JQk9PTEVBTgkJCWFyZ2MpCit7CisJTkRJU19TVEFUVVMJCQlTdGF0dXM7CisJVUlOVDMyCQkJUnhQcm9jZXNzZWQsIFJ4UGVuZGluZzsKKwlCT09MRUFOCQkJYlJlc2NoZWR1bGUgPSBGQUxTRTsKKwlSVDI4WFhfUlhEX1NUUlVDCSpwUnhEOworCVVDSEFSCQkJKnBEYXRhOworCVBSWFdJX1NUUlVDCQlwUnhXSTsKKwlQTkRJU19QQUNLRVQJcFJ4UGFja2V0OworCVBIRUFERVJfODAyXzExCXBIZWFkZXI7CisJUlhfQkxLCQkJUnhDZWxsOworCisJUnhQcm9jZXNzZWQgPSBSeFBlbmRpbmcgPSAwOworCisJLy8gcHJvY2VzcyB3aG9sZSByeCByaW5nCisJd2hpbGUgKDEpCisJeworCisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGIHwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8CisJCQkJCQkJCWZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8CisJCQkJCQkJCWZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkgfHwKKwkJCSFSVE1QX1RFU1RfRkxBRyhwQWQsZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkpCisJCXsKKwkJCWJyZWFrOworCQl9CisKKyNpZmRlZiBSVDI4NjAKKwkJaWYgKFJ4UHJvY2Vzc2VkKysgPiBNQVhfUlhfUFJPQ0VTU19DTlQpCisJCXsKKwkJCS8vIG5lZWQgdG8gcmVzY2hlZHVsZSByeCBoYW5kbGUKKwkJCWJSZXNjaGVkdWxlID0gVFJVRTsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKwkJUnhQcm9jZXNzZWQgKys7IC8vIHRlc3QKKworCQkvLyAxLiBhbGxvY2F0ZSBhIG5ldyBkYXRhIHBhY2tldCBpbnRvIHJ4IHJpbmcgdG8gcmVwbGFjZSByZWNlaXZlZCBwYWNrZXQKKwkJLy8gICAgdGhlbiBwcm9jZXNzaW5nIHRoZSByZWNlaXZlZCBwYWNrZXQKKwkJLy8gMi4gdGhlIGNhbGxlZSBtdXN0IHRha2UgY2hhcmdlIG9mIHJlbGVhc2Ugb2YgcGFja2V0CisJCS8vIDMuIEFzIGZhciBhcyBkcml2ZXIgaXMgY29uY2VybmVkICwKKwkJLy8gICAgdGhlIHJ4IHBhY2tldCBtdXN0CisJCS8vICAgICAgYS4gYmUgaW5kaWNhdGVkIHRvIHVwcGVyIGxheWVyIG9yCisJCS8vICAgICAgYi4gYmUgcmVsZWFzZWQgaWYgaXQgaXMgZGlzY2FyZGVkCisJCXBSeFBhY2tldCA9IEdldFBhY2tldEZyb21SeFJpbmcocEFkLCAmKFJ4Q2VsbC5SeEQpLCAmYlJlc2NoZWR1bGUsICZSeFBlbmRpbmcpOworCQlpZiAocFJ4UGFja2V0ID09IE5VTEwpCisJCXsKKwkJCS8vIG5vIG1vcmUgcGFja2V0IHRvIHByb2Nlc3MKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gZ2V0IHJ4IHJpbmcgZGVzY3JpcHRvcgorCQlwUnhEID0gJihSeENlbGwuUnhEKTsKKwkJLy8gZ2V0IHJ4IGRhdGEgYnVmZmVyCisJCXBEYXRhCT0gR0VUX09TX1BLVF9EQVRBUFRSKHBSeFBhY2tldCk7CisJCXBSeFdJCT0gKFBSWFdJX1NUUlVDKSBwRGF0YTsKKwkJcEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkgKHBEYXRhK1JYV0lfU0laRSkgOworCisjaWZkZWYgUlRfQklHX0VORElBTgorCSAgICBSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKXBIZWFkZXIsIERJUl9SRUFELCBUUlVFKTsKKwkJUlRNUFdJRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFJ4V0ksIFRZUEVfUlhXSSk7CisjZW5kaWYKKworCQkvLyBidWlsZCBSeENlbGwKKwkJUnhDZWxsLnBSeFdJID0gcFJ4V0k7CisJCVJ4Q2VsbC5wSGVhZGVyID0gcEhlYWRlcjsKKwkJUnhDZWxsLnBSeFBhY2tldCA9IHBSeFBhY2tldDsKKwkJUnhDZWxsLnBEYXRhID0gKFVDSEFSICopIHBIZWFkZXI7CisJCVJ4Q2VsbC5EYXRhU2l6ZSA9IHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQ7CisJCVJ4Q2VsbC5GbGFncyA9IDA7CisKKwkJLy8gSW5jcmVhc2UgVG90YWwgcmVjZWl2ZSBieXRlIGNvdW50ZXIgYWZ0ZXIgcmVhbCBkYXRhIHJlY2VpdmVkIG5vIG1hdGVyIGFueSBlcnJvciBvciBub3QKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5SZWNlaXZlZEJ5dGVDb3VudCArPSAgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudDsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50ICsrOworCisJCUlOQ19DT1VOVEVSNjQocEFkLT5XbGFuQ291bnRlcnMuUmVjZWl2ZWRGcmFnbWVudENvdW50KTsKKworCQlpZiAocFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCA8IDE0KQorCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKworICAgICAgICBpZiAoTU9OSVRPUl9PTihwQWQpKQorCQl7CisgICAgICAgICAgICBzZW5kX21vbml0b3JfcGFja2V0cyhwQWQsICZSeENlbGwpOworCQkJYnJlYWs7CisJCX0KKwkJLyogUlQyODcwIGludm9rZXMgU1RBUnhEb25lSW50ZXJydXB0SGFuZGxlKCkgaW4gcnR1c2JfYnVsay5jICovCisjaWZkZWYgUkFMSU5LX0FURQorCQlpZiAoQVRFX09OKHBBZCkpCisJCXsKKwkJCXBBZC0+YXRlLlJ4Q250UGVyU2VjKys7CisJCQlBVEVTYW1wbGVSc3NpKHBBZCwgcFJ4V0kpOworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJCQlpZiAocEFkLT5hdGUuYlFBUnhTdGFydCA9PSBUUlVFKQorCQkJeworCQkJCS8qICgqcFJ4RCkgaGFzIGJlZW4gc3dhcHBlZCBpbiBHZXRQYWNrZXRGcm9tUnhSaW5nKCkgKi8KKwkJCQlBVEVfUUFfU3RhdGlzdGljcyhwQWQsIHBSeFdJLCBwUnhELAlwSGVhZGVyKTsKKwkJCX0KKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisJCQljb250aW51ZTsKKwkJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCQkvLyBDaGVjayBmb3IgYWxsIFJ4RCBlcnJvcnMKKwkJU3RhdHVzID0gUlRNUENoZWNrUnhFcnJvcihwQWQsIHBIZWFkZXIsIHBSeFdJLCBwUnhEKTsKKworCQkvLyBIYW5kbGUgdGhlIHJlY2VpdmVkIGZyYW1lCisJCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJeworCQkJc3dpdGNoIChwSGVhZGVyLT5GQy5UeXBlKQorCQkJeworCQkJCS8vIENBU0UgSSwgcmVjZWl2ZSBhIERBVEEgZnJhbWUKKwkJCQljYXNlIEJUWVBFX0RBVEE6CisJCQkJeworCQkJCQkvLyBwcm9jZXNzIERBVEEgZnJhbWUKKwkJCQkJU1RBSGFuZGxlUnhEYXRhRnJhbWUocEFkLCAmUnhDZWxsKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQkJLy8gQ0FTRSBJSSwgcmVjZWl2ZSBhIE1HTVQgZnJhbWUKKwkJCQljYXNlIEJUWVBFX01HTVQ6CisJCQkJeworCQkJCQlTVEFIYW5kbGVSeE1nbXRGcmFtZShwQWQsICZSeENlbGwpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCQkvLyBDQVNFIElJSS4gcmVjZWl2ZSBhIENOVEwgZnJhbWUKKwkJCQljYXNlIEJUWVBFX0NOVEw6CisJCQkJeworCQkJCQlTVEFIYW5kbGVSeENvbnRyb2xGcmFtZShwQWQsICZSeENlbGwpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCQkvLyBkaXNjYXJkIG90aGVyIHR5cGUKKwkJCQlkZWZhdWx0OgorCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlwQWQtPkNvdW50ZXJzODAyMy5SeEVycm9ycysrOworCQkJLy8gZGlzY2FyZCB0aGlzIGZyYW1lCisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJfQorCX0KKworCXJldHVybiBiUmVzY2hlZHVsZTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QSGFuZGxlVHdha2V1cEludGVycnVwdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlBc2ljRm9yY2VXYWtldXAocEFkLCBGQUxTRSk7Cit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgRWFybHkgY2hlY2tpbmcgYW5kIE9TLWRlcGVuZWQgcGFyc2luZyBmb3IgVHggcGFja2V0IHNlbmQgdG8gb3VyIFNUQSBkcml2ZXIuCisKK0FyZ3VtZW50czoKKyAgICBORElTX0hBTkRMRSAJTWluaXBvcnRBZGFwdGVyQ29udGV4dAlQb2ludGVyIHJlZmVyIHRvIHRoZSBkZXZpY2UgaGFuZGxlLCBpLmUuLCB0aGUgcEFkLgorCVBQTkRJU19QQUNLRVQJcHBQYWNrZXRBcnJheQkJCVRoZSBwYWNrZXQgYXJyYXkgbmVlZCB0byBkbyB0cmFuc21pc3Npb24uCisJVUlOVAkJCU51bWJlck9mUGFja2V0cwkJCU51bWJlciBvZiBwYWNrZXQgaW4gcGFja2V0IGFycmF5LgorCitSZXR1cm4gVmFsdWU6CisJTk9ORQorCitOb3RlOgorCVRoaXMgZnVuY3Rpb24gZG8gZWFybHkgY2hlY2tpbmcgYW5kIGNsYXNzaWZpY2F0aW9uIGZvciBzZW5kLW91dCBwYWNrZXQuCisJWW91IG9ubHkgY2FuIHB1dCBPUy1kZXBlbmVkICYgU1RBIHJlbGF0ZWQgY29kZSBpbiBoZXJlLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBTVEFTZW5kUGFja2V0cygKKwlJTglORElTX0hBTkRMRQkJTWluaXBvcnRBZGFwdGVyQ29udGV4dCwKKwlJTglQUE5ESVNfUEFDS0VUCXBwUGFja2V0QXJyYXksCisJSU4JVUlOVAkJCU51bWJlck9mUGFja2V0cykKK3sKKwlVSU5UCQkJSW5kZXg7CisJUFJUTVBfQURBUFRFUglwQWQgPSAoUFJUTVBfQURBUFRFUikgTWluaXBvcnRBZGFwdGVyQ29udGV4dDsKKwlQTkRJU19QQUNLRVQJcFBhY2tldDsKKwlCT09MRUFOCQkJYWxsb3dUb1NlbmQgPSBGQUxTRTsKKworCisJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTnVtYmVyT2ZQYWNrZXRzOyBJbmRleCsrKQorCXsKKwkJcFBhY2tldCA9IHBwUGFja2V0QXJyYXlbSW5kZXhdOworCisJCWRvCisJCXsKKwkJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpIHx8CisJCQkJUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpIHx8CisJCQkJUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpCisJCQl7CisJCQkJLy8gRHJvcCBzZW5kIHJlcXVlc3Qgc2luY2UgaGFyZHdhcmUgaXMgaW4gcmVzZXQgc3RhdGUKKwkJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlIGlmICghSU5GUkFfT04ocEFkKSAmJiAhQURIT0NfT04ocEFkKSkKKwkJCXsKKwkJCQkvLyBEcm9wIHNlbmQgcmVxdWVzdCBzaW5jZSB0aGVyZSBhcmUgbm8gcGh5c2ljYWwgY29ubmVjdGlvbiB5ZXQKKwkJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gUmVjb3JkIHRoYXQgb3JpZ25hbCBwYWNrZXQgc291cmNlIGlzIGZyb20gTkRJUyBsYXllcixzbyB0aGF0CisJCQkJLy8gbGF0ZXIgb24gZHJpdmVyIGtub3dzIGhvdyB0byByZWxlYXNlIHRoaXMgTkRJUyBQQUNLRVQKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKwkJCQlQVUNIQVIgcFNyY0J1ZlZBID0gR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOworCisJCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwU3JjQnVmVkEpOworCQkJCWlmIChwRW50cnkgJiYgKHBFbnRyeS0+VmFsaWRBc0RscyA9PSBUUlVFKSkKKwkJCQl7CisJCQkJCVJUTVBfU0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQsIHBFbnRyeS0+QWlkKTsKKwkJCQl9CisJCQkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQkJCVJUTVBfU0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQsIDApOyAvLyB0aGlzIGZpZWxkIGlzIHVzZWxlc3Mgd2hlbiBpbiBTVEEgbW9kZQorCQkJCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UocFBhY2tldCwgUEtUU1JDX05ESVMpOworCQkJCU5ESVNfU0VUX1BBQ0tFVF9TVEFUVVMocFBhY2tldCwgTkRJU19TVEFUVVNfUEVORElORyk7CisJCQkJcEFkLT5SYWxpbmtDb3VudGVycy5QZW5kaW5nTmRpc1BhY2tldENvdW50Kys7CisKKwkJCQlhbGxvd1RvU2VuZCA9IFRSVUU7CisJCQl9CisJCX0gd2hpbGUoRkFMU0UpOworCisJCWlmIChhbGxvd1RvU2VuZCA9PSBUUlVFKQorCQkJU1RBU2VuZFBhY2tldChwQWQsIHBQYWNrZXQpOworCQllbHNlCisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJfQorCisJLy8gRGVxdWV1ZSBvdXRnb2luZyBmcmFtZXMgZnJvbSBUeFN3UXVldWVbXSBhbmQgcHJvY2VzcyBpdAorCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7CisKK30KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorCVRoaXMgcm91dGluZSBpcyB1c2VkIHRvIGRvIHBhY2tldCBwYXJzaW5nIGFuZCBjbGFzc2lmaWNhdGlvbiBmb3IgVHggcGFja2V0CisJdG8gU1RBIGRldmljZSwgYW5kIGl0IHdpbGwgZW4tcXVldWUgcGFja2V0cyB0byBvdXIgVHhTd1F1ZXVlIGRlcGVuZHMgb24gQUMKKwljbGFzcy4KKworQXJndW1lbnRzOgorCXBBZCAgICAJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwlwUGFja2V0IAlQb2ludGVyIHRvIHNlbmQgcGFja2V0CisKK1JldHVybiBWYWx1ZToKKwlORElTX1NUQVRVU19TVUNDRVNTCQkJSWYgc3VjY2VzIHRvIHF1ZXVlIHRoZSBwYWNrZXQgaW50byBUeFN3UXVldWUuCisJTkRJU19TVEFUVVNfRkFJTFVSRQkJCUlmIGZhaWxlZCB0byBkbyBlbi1xdWV1ZS4KKworTm90ZToKKwlZb3Ugb25seSBjYW4gcHV0IE9TLWluZGVwZW5lZCAmIFNUQSByZWxhdGVkIGNvZGUgaW4gaGVyZS4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTIFNUQVNlbmRQYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCit7CisJUEFDS0VUX0lORk8gCVBhY2tldEluZm87CisJUFVDSEFSCQkJcFNyY0J1ZlZBOworCVVJTlQJCQlTcmNCdWZMZW47CisJVUlOVAkJCUFsbG93RnJhZ1NpemU7CisJVUNIQVIJCQlOdW1iZXJPZkZyYWc7CisJVUNIQVIJCQlRdWVJZHgsIFVzZXJQcmlvcml0eTsKKwlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9IE5VTEw7CisJdW5zaWduZWQgaW50IAlJcnFGbGFnczsKKwlVQ0hBUgkJCUZsZ0lzSVAgPSAwOworCVVDSEFSCQkJUmF0ZTsKKworCS8vIFByZXBhcmUgcGFja2V0IGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgYnVmZmVyIGRlc2NyaXB0b3IKKwkvLyBjaGFpbmVkIHdpdGhpbiBhIHNpbmdsZSBORElTIHBhY2tldC4KKwlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwUGFja2V0LCAmUGFja2V0SW5mbywgJnBTcmNCdWZWQSwgJlNyY0J1Zkxlbik7CisKKwlpZiAocFNyY0J1ZlZBID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlNUQVNlbmRQYWNrZXQgLS0+IHBTcmNCdWZWQSA9PSBOVUxMICEhIVNyY0J1Zkxlbj0leFxuIixTcmNCdWZMZW4pKTsKKwkJLy8gUmVzb3VyZWNlIGlzIGxvdywgc3lzdGVtIGRpZCBub3QgYWxsb2NhdGUgdmlydHVhbCBhZGRyZXNzCisJCS8vIHJldHVybiBORElTX1NUQVRVU19GQUlMVVJFIGRpcmVjdGx5IHRvIHVwcGVyIGxheWVyCisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisKKwlpZiAoU3JjQnVmTGVuIDwgMTQpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlNUQVNlbmRQYWNrZXQgLS0+IE5kaXMgUGFja2V0IGJ1ZmZlciBlcnJvciAhISFcbiIpKTsKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKworCS8vIEluIEhUIHJhdGUgYWRob2MgbW9kZSwgQS1NUERVIGlzIG9mdGVuIHVzZWQuIFNvIG5lZWQgdG8gbG9va3VwIEJBIFRhYmxlIGFuZCBNQUMgRW50cnkuCisJLy8gTm90ZSBtdWx0aWNhc3QgcGFja2V0cyBpbiBhZGhvYyBhbHNvIHVzZSBCU1NJRF9XQ0lEIGluZGV4LgorCXsKKwkJaWYoSU5GUkFfT04ocEFkKSkKKwkJeworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkJVVNIT1JUCXRtcFdjaWQ7CisKKwkJCXRtcFdjaWQgPSBSVE1QX0dFVF9QQUNLRVRfV0NJRChwUGFja2V0KTsKKwkJCWlmIChWQUxJRF9XQ0lEKHRtcFdjaWQpICYmCisJCQkJKHBBZC0+TWFjVGFiLkNvbnRlbnRbdG1wV2NpZF0uVmFsaWRBc0Rscz09IFRSVUUpKQorCQkJeworCQkJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3RtcFdjaWRdOworCQkJCVJhdGUgPSBwQWQtPk1hY1RhYi5Db250ZW50W3RtcFdjaWRdLkN1cnJUeFJhdGU7CisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCQl7CisJCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKKwkJCVJUTVBfU0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQsIEJTU0lEX1dDSUQpOworCQkJUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZTsKKwkJfQorCQl9CisJCWVsc2UgaWYgKEFESE9DX09OKHBBZCkpCisJCXsKKwkJCWlmICgqcFNyY0J1ZlZBICYgMHgwMSkKKwkJCXsKKwkJCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwUGFja2V0LCBNQ0FTVF9XQ0lEKTsKKwkJCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIHBTcmNCdWZWQSk7CisJCQl9CisJCQlSYXRlID0gcEFkLT5Db21tb25DZmcuVHhSYXRlOworCQl9CisJfQorCisJaWYgKCFwRW50cnkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlNUQVNlbmRQYWNrZXQtPkNhbm5vdCBmaW5kIHBFbnRyeSglMng6JTJ4OiUyeDolMng6JTJ4OiUyeCkgaW4gTWFjVGFiIVxuIiwgUFJJTlRfTUFDKHBTcmNCdWZWQSkpKTsKKwkJLy8gUmVzb3VyZWNlIGlzIGxvdywgc3lzdGVtIGRpZCBub3QgYWxsb2NhdGUgdmlydHVhbCBhZGRyZXNzCisJCS8vIHJldHVybiBORElTX1NUQVRVU19GQUlMVVJFIGRpcmVjdGx5IHRvIHVwcGVyIGxheWVyCisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJaWYgKEFESE9DX09OKHBBZCkKKwkJKQorCXsKKwkJUlRNUF9TRVRfUEFDS0VUX1dDSUQocFBhY2tldCwgKFVDSEFSKXBFbnRyeS0+QWlkKTsKKwl9CisKKwkvLworCS8vIENoZWNrIHRoZSBFdGhlcm5ldCBGcmFtZSB0eXBlIG9mIHRoaXMgcGFja2V0LCBhbmQgc2V0IHRoZSBSVE1QX1NFVF9QQUNLRVRfU1BFQ0lGSUMgZmxhZ3MuCisJLy8JCUhlcmUgd2Ugc2V0IHRoZSBQQUNLRVRfU1BFQ0lGSUMgZmxhZ3MoTExDLCBWTEFOLCBESENQL0FSUCwgRUFQT0wpLgorCVJUTVBDaGVja0V0aGVyVHlwZShwQWQsIHBQYWNrZXQpOworCisKKworCS8vCisJLy8gV1BBIDgwMi4xeCBzZWN1cmVkIHBvcnQgY29udHJvbCAtIGRyb3AgYWxsIG5vbi04MDIuMXggZnJhbWUgYmVmb3JlIHBvcnQgc2VjdXJlZAorCS8vCisJaWYgKCgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAorCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKKwkJIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fAorCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQkgIHx8IChwQWQtPlN0YUNmZy5JRUVFODAyMVggPT0gVFJVRSkKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCSAgfHwgKHBBZC0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSA9PSBDSVNDT19BdXRoTW9kZUxFQVApCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCSAgKQorCQkgICYmICgocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSB8fCAocEFkLT5TdGFDZmcuTWljRXJyQ250ID49IDIpKQorCQkgICYmIChSVE1QX0dFVF9QQUNLRVRfRUFQT0wocFBhY2tldCk9PSBGQUxTRSkKKwkJICApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNUQVNlbmRQYWNrZXQgLS0+IERyb3AgcGFja2V0IGJlZm9yZSBwb3J0IHNlY3VyZWQgISEhXG4iKSk7CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKworCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKworCisJLy8gU1RFUCAxLiBEZWNpZGUgbnVtYmVyIG9mIGZyYWdtZW50cyByZXF1aXJlZCB0byBkZWxpdmVyIHRoaXMgTVNEVS4KKwkvLwkgICBUaGUgZXN0aW1hdGlvbiBoZXJlIGlzIG5vdCB2ZXJ5IGFjY3VyYXRlIGJlY2F1c2UgZGlmZmljdWx0IHRvCisJLy8JICAgdGFrZSBlbmNyeXB0aW9uIG92ZXJoZWFkIGludG8gY29uc2lkZXJhdGlvbiBoZXJlLiBUaGUgcmVzdWx0CisJLy8JICAgIk51bWJlck9mRnJhZyIgaXMgdGhlbiBqdXN0IHVzZWQgdG8gcHJlLWNoZWNrIGlmIGVub3VnaCBmcmVlCisJLy8JICAgVFhEIGFyZSBhdmFpbGFibGUgdG8gaG9sZCB0aGlzIE1TRFUuCisKKworCWlmICgqcFNyY0J1ZlZBICYgMHgwMSkJLy8gZnJhZ21lbnRhdGlvbiBub3QgYWxsb3dlZCBvbiBtdWx0aWNhc3QgJiBicm9hZGNhc3QKKwkJTnVtYmVyT2ZGcmFnID0gMTsKKwllbHNlIGlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCkpCisJCU51bWJlck9mRnJhZyA9IDE7CS8vIEFnZ3JlZ2F0aW9uIG92ZXJ3aGVsbXMgZnJhZ21lbnRhdGlvbgorCWVsc2UgaWYgKENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfQU1TRFVfSU5VU0VEKSkKKwkJTnVtYmVyT2ZGcmFnID0gMTsJLy8gQWdncmVnYXRpb24gb3ZlcndoZWxtcyBmcmFnbWVudGF0aW9uCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJZWxzZSBpZiAoKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFID09IE1PREVfSFRNSVgpIHx8IChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERSA9PSBNT0RFX0hUR1JFRU5GSUVMRCkpCisJCU51bWJlck9mRnJhZyA9IDE7CS8vIE1JTU8gUkFURSBvdmVyd2hlbG1zIGZyYWdtZW50YXRpb24KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwllbHNlCisJeworCQkvLyBUaGUgY2FsY3VsYXRlZCAiTnVtYmVyT2ZGcmFnIiBpcyBhIHJvdWdoIGVzdGltYXRpb24gYmVjYXVzZSBvZiB2YXJpb3VzCisJCS8vIGVuY3J5cHRpb24vZW5jYXBzdWxhdGlvbiBvdmVyaGVhZCBub3QgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uLiBUaGlzIG51bWJlciBpcyBqdXN0CisJCS8vIHVzZWQgdG8gbWFrZSBzdXJlIGVub3VnaCBmcmVlIFRYRCBhcmUgYXZhaWxhYmxlIGJlZm9yZSBmcmFnbWVudGF0aW9uIHRha2VzIHBsYWNlLgorCQkvLyBJbiBjYXNlIHRoZSBhY3R1YWwgcmVxdWlyZWQgbnVtYmVyIG9mIGZyYWdtZW50cyBvZiBhbiBORElTIHBhY2tldAorCQkvLyBleGNjZWVkcyAiTnVtYmVyT2ZGcmFnImNhY3VsYXRlZCBoZXJlIGFuZCBub3QgZW5vdWdoIGZyZWUgVFhEIGF2YWlsYWJsZSwgdGhlCisJCS8vIGxhc3QgZnJhZ21lbnQgKGkuZS4gbGFzdCBNUERVKSB3aWxsIGJlIGRyb3BwZWQgaW4gUlRNUEhhcmRUcmFuc21pdCgpIGR1ZSB0byBvdXQgb2YKKwkJLy8gcmVzb3VyY2UsIGFuZCB0aGUgTkRJUyBwYWNrZXQgd2lsbCBiZSBpbmRpY2F0ZWQgTkRJU19TVEFUVVNfRkFJTFVSRS4gVGhpcyBzaG91bGQKKwkJLy8gcmFyZWx5IGhhcHBlbiBhbmQgdGhlIHBlbmFsdHkgaXMganVzdCBsaWtlIGEgVFggUkVUUlkgZmFpbC4gQWZmb3JkYWJsZS4KKworCQlBbGxvd0ZyYWdTaXplID0gKHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkKSAtIExFTkdUSF84MDJfMTEgLSBMRU5HVEhfQ1JDOworCQlOdW1iZXJPZkZyYWcgPSAoKFBhY2tldEluZm8uVG90YWxQYWNrZXRMZW5ndGggLSBMRU5HVEhfODAyXzMgKyBMRU5HVEhfODAyXzFfSCkgLyBBbGxvd0ZyYWdTaXplKSArIDE7CisJCS8vIFRvIGdldCBhY2N1cmF0ZSBudW1iZXIgb2YgZnJhZ21lbnRhdGlvbiwgTWludXMgMSBpZiB0aGUgc2l6ZSBqdXN0IG1hdGNoIHRvIGFsbG93YWJsZSBmcmFnbWVudCBzaXplCisJCWlmICgoKFBhY2tldEluZm8uVG90YWxQYWNrZXRMZW5ndGggLSBMRU5HVEhfODAyXzMgKyBMRU5HVEhfODAyXzFfSCkgJSBBbGxvd0ZyYWdTaXplKSA9PSAwKQorCQl7CisJCQlOdW1iZXJPZkZyYWctLTsKKwkJfQorCX0KKworCS8vIFNhdmUgZnJhZ21lbnQgbnVtYmVyIHRvIE5kaXMgcGFja2V0IHJlc2VydmVkIGZpZWxkCisJUlRNUF9TRVRfUEFDS0VUX0ZSQUdNRU5UUyhwUGFja2V0LCBOdW1iZXJPZkZyYWcpOworCisKKwkvLyBTVEVQIDIuIENoZWNrIHRoZSByZXF1aXJlbWVudCBvZiBSVFM6CisJLy8JICAgSWYgbXVsdGlwbGUgZnJhZ21lbnQgcmVxdWlyZWQsIFJUUyBpcyByZXF1aXJlZCBvbmx5IGZvciB0aGUgZmlyc3QgZnJhZ21lbnQKKwkvLwkgICBpZiB0aGUgZnJhZ21lbnQgc2l6ZSBsYXJnZSB0aGFuIFJUUyB0aHJlc2hvbGQKKwkvLyAgICAgRm9yIFJUMjh4eCwgTGV0IEFTSUMgc2VuZCBSVFMvQ1RTCisJUlRNUF9TRVRfUEFDS0VUX1JUUyhwUGFja2V0LCAwKTsKKwlSVE1QX1NFVF9QQUNLRVRfVFhSQVRFKHBQYWNrZXQsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSk7CisKKwkvLworCS8vIFNURVAgMy4gVHJhZmZpYyBjbGFzc2lmaWNhdGlvbi4gb3V0Y29tZSA9IDxVc2VyUHJpb3JpdHksIFF1ZUlkeD4KKwkvLworCVVzZXJQcmlvcml0eSA9IDA7CisJUXVlSWR4CQkgPSBRSURfQUNfQkU7CisJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkpCisJeworCQlVU0hPUlQgUHJvdG9jb2w7CisJCVVDSEFSICBMbGNTbmFwTGVuID0gMCwgQnl0ZTAsIEJ5dGUxOworCQlkbworCQl7CisJCQkvLyBnZXQgRXRoZXJuZXQgcHJvdG9jb2wgZmllbGQKKwkJCVByb3RvY29sID0gKFVTSE9SVCkoKHBTcmNCdWZWQVsxMl0gPDwgOCkgKyBwU3JjQnVmVkFbMTNdKTsKKwkJCWlmIChQcm90b2NvbCA8PSAxNTAwKQorCQkJeworCQkJCS8vIGdldCBFdGhlcm5ldCBwcm90b2NvbCBmaWVsZCBmcm9tIExMQy9TTkFQCisJCQkJaWYgKFNuaWZmMkJ5dGVzRnJvbU5kaXNCdWZmZXIoUGFja2V0SW5mby5wRmlyc3RCdWZmZXIsIExFTkdUSF84MDJfMyArIDYsICZCeXRlMCwgJkJ5dGUxKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCQlicmVhazsKKworCQkJCVByb3RvY29sID0gKFVTSE9SVCkoKEJ5dGUwIDw8IDgpICsgQnl0ZTEpOworCQkJCUxsY1NuYXBMZW4gPSA4OworCQkJfQorCisJCQkvLyBhbHdheXMgQUNfQkUgZm9yIG5vbi1JUCBwYWNrZXQKKwkJCWlmIChQcm90b2NvbCAhPSAweDA4MDApCisJCQkJYnJlYWs7CisKKwkJCS8vIGdldCBJUCBoZWFkZXIKKwkJCWlmIChTbmlmZjJCeXRlc0Zyb21OZGlzQnVmZmVyKFBhY2tldEluZm8ucEZpcnN0QnVmZmVyLCBMRU5HVEhfODAyXzMgKyBMbGNTbmFwTGVuLCAmQnl0ZTAsICZCeXRlMSkgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCQlicmVhazsKKworCQkJLy8gcmV0dXJuIEFDX0JFIGlmIHBhY2tldCBpcyBub3QgSVB2NAorCQkJaWYgKChCeXRlMCAmIDB4ZjApICE9IDB4NDApCisJCQkJYnJlYWs7CisKKwkJCUZsZ0lzSVAgPSAxOworCQkJVXNlclByaW9yaXR5ID0gKEJ5dGUxICYgMHhlMCkgPj4gNTsKKwkJCVF1ZUlkeCA9IE1hcFVzZXJQcmlvcml0eVRvQWNjZXNzQ2F0ZWdvcnlbVXNlclByaW9yaXR5XTsKKworCQkJLy8gVE9ETzogaGF2ZSB0byBjaGVjayBBQ00gYml0LiBhcHBseSBUU1BFQyBpZiBBQ00gaXMgT04KKwkJCS8vIFRPRE86IGRvd25ncmFkZSBVUCAmIFF1ZUlkeCBiZWZvcmUgcGFzc2luZyBBQ00KKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJBQ01bUXVlSWR4XSkKKwkJCXsKKwkJCQlVc2VyUHJpb3JpdHkgPSAwOworCQkJCVF1ZUlkeAkJID0gUUlEX0FDX0JFOworCQkJfQorCQl9IHdoaWxlIChGQUxTRSk7CisJfQorCisJUlRNUF9TRVRfUEFDS0VUX1VQKHBQYWNrZXQsIFVzZXJQcmlvcml0eSk7CisKKworCisJLy8gTWFrZSBzdXJlIFNlbmRUeFdhaXQgcXVldWUgcmVzb3VyY2Ugd29uJ3QgYmUgdXNlZCBieSBvdGhlciB0aHJlYWRzCisJUlRNUF9JUlFfTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworCWlmIChwQWQtPlR4U3dRdWV1ZVtRdWVJZHhdLk51bWJlciA+PSBNQVhfUEFDS0VUU19JTl9RVUVVRSkKKwl7CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworI2lmZGVmIEJMT0NLX05FVF9JRgorCQlTdG9wTmV0SWZRdWV1ZShwQWQsIFF1ZUlkeCwgcFBhY2tldCk7CisjZW5kaWYgLy8gQkxPQ0tfTkVUX0lGIC8vCisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKworCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisJZWxzZQorCXsKKwkJSW5zZXJ0VGFpbFF1ZXVlKCZwQWQtPlR4U3dRdWV1ZVtRdWVJZHhdLCBQQUNLRVRfVE9fUVVFVUVfRU5UUlkocFBhY2tldCkpOworCX0KKwlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgIGlmICgocEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9PSBUUlVFKSYmCisgICAgICAgIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBUUlVFKSkKKwl7CisJCWlmICgoKHBFbnRyeS0+VFhCQWJpdG1hcCAmICgxPDxVc2VyUHJpb3JpdHkpKSA9PSAwKSAmJgorICAgICAgICAgICAgKChwRW50cnktPkJBRGVjbGluZUJpdG1hcCAmICgxPDxVc2VyUHJpb3JpdHkpKSA9PSAwKSAmJgorICAgICAgICAgICAgKHBFbnRyeS0+UG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQpCisJCQkgLy8gRm9yIElPVCBjb21wYXRpYmlsaXR5LCBpZgorCQkJIC8vIDEuIEl0IGlzIFJhbGluayBjaGlwIG9yCisJCQkgLy8gMi4gSXQgaXMgT1BFTiBvciBBRVMgbW9kZSwKKwkJCSAvLyB0aGVuIEJBIHNlc3Npb24gY2FuIGJlIGJ1bGl0LgorCQkJICYmICgocEVudHJ5LT5WYWxpZEFzQ0xJICYmIHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICE9IDB4MCkgfHwKKwkJCSAJIChwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQgfHwgcEVudHJ5LT5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpCisJCQkpCisJCXsKKwkJCUJBT3JpU2Vzc2lvblNldFVwKHBBZCwgcEVudHJ5LCAwLCAwLCAxMCwgRkFMU0UpOworCQl9CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNPc1R4Q291bnRbUXVlSWR4XSsrOyAvLyBUT0RPOiBmb3IgZGVidWcgb25seS4gdG8gYmUgcmVtb3ZlZAorCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlUaGlzIHN1YnJvdXRpbmUgd2lsbCBzY2FuIHRocm91Z2ggcmVsZWF0aXZlIHJpbmcgZGVzY3JpcHRvciB0byBmaW5kCisJCW91dCBhdmFsaWFibGUgZnJlZSByaW5nIGRlc2NyaXB0b3IgYW5kIGNvbXBhcmUgd2l0aCByZXF1ZXN0IHNpemUuCisKKwlBcmd1bWVudHM6CisJCXBBZCBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCVF1ZUlkeAkJU2VsZWN0ZWQgVFggUmluZworCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NUQVRVU19GQUlMVVJFIAlOb3QgZW5vdWdoIGZyZWUgZGVzY3JpcHRvcgorCQlORElTX1NUQVRVU19TVUNDRVNTIAlFbm91Z2ggZnJlZSBkZXNjcmlwdG9yCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKyNpZmRlZiBSVDI4NjAKK05ESVNfU1RBVFVTIFJUTVBGcmVlVFhEUmVxdWVzdCgKKwlJTgkJUFJUTVBfQURBUFRFUglwQWQsCisJSU4JCVVDSEFSCQkJUXVlSWR4LAorCUlOCQlVQ0hBUgkJCU51bWJlclJlcXVpcmVkLAorCUlOCQlQVUNIQVIJCQlGcmVlTnVtYmVySXMpCit7CisJVUxPTkcJCUZyZWVOdW1iZXIgPSAwOworCU5ESVNfU1RBVFVTIAlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCisJc3dpdGNoIChRdWVJZHgpCisJeworCQljYXNlIFFJRF9BQ19CSzoKKwkJY2FzZSBRSURfQUNfQkU6CisJCWNhc2UgUUlEX0FDX1ZJOgorCQljYXNlIFFJRF9BQ19WTzoKKwkJY2FzZSBRSURfSENDQToKKwkJCWlmIChwQWQtPlR4UmluZ1tRdWVJZHhdLlR4U3dGcmVlSWR4ID4gcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeCkKKwkJCQlGcmVlTnVtYmVyID0gcEFkLT5UeFJpbmdbUXVlSWR4XS5UeFN3RnJlZUlkeCAtIHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhDcHVJZHggLSAxOworCQkJZWxzZQorCQkJCUZyZWVOdW1iZXIgPSBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4U3dGcmVlSWR4ICsgVFhfUklOR19TSVpFIC0gcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeCAtIDE7CisKKwkJCWlmIChGcmVlTnVtYmVyID49IE51bWJlclJlcXVpcmVkKQorCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCQlicmVhazsKKworCQljYXNlIFFJRF9NR01UOgorCQkJaWYgKHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggPiBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4KQorCQkJCUZyZWVOdW1iZXIgPSBwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4IC0gcEFkLT5NZ210UmluZy5UeENwdUlkeCAtIDE7CisJCQllbHNlCisJCQkJRnJlZU51bWJlciA9IHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggKyBNR01UX1JJTkdfU0laRSAtIHBBZC0+TWdtdFJpbmcuVHhDcHVJZHggLSAxOworCisJCQlpZiAoRnJlZU51bWJlciA+PSBOdW1iZXJSZXF1aXJlZCkKKwkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiUlRNUEZyZWVUWERSZXF1ZXN0OjpJbnZhbGlkIFF1ZUlkeCg9JWQpXG4iLCBRdWVJZHgpKTsKKwkJCWJyZWFrOworCX0KKwkqRnJlZU51bWJlcklzID0gKFVDSEFSKUZyZWVOdW1iZXI7CisKKwlyZXR1cm4gKFN0YXR1cyk7Cit9CisjZW5kaWYgLy8gUlQyODYwIC8vCisKKworCitWT0lEIFJUTVBTZW5kRGlzYXNzb2NpYXRpb25GcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKK30KKworVk9JRAlSVE1QU2VuZE51bGxGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCVR4UmF0ZSwKKwlJTglCT09MRUFOIAkJYlFvc051bGwpCit7CisJVUNIQVIJTnVsbEZyYW1lWzQ4XTsKKwlVTE9ORwlMZW5ndGg7CisJUEhFQURFUl84MDJfMTEJcEhlYWRlcl84MDJfMTE7CisKKworI2lmZGVmIFJBTElOS19BVEUKKwlpZihBVEVfT04ocEFkKSkKKwl7CisJCXJldHVybjsKKwl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisgICAgLy8gV1BBIDgwMi4xeCBzZWN1cmVkIHBvcnQgY29udHJvbAorICAgIGlmICgoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwKKyAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8CisgICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwKKyAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQorI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkJCSAgfHwgKHBBZC0+U3RhQ2ZnLklFRUU4MDIxWCA9PSBUUlVFKQorI2VuZGlmCisgICAgICAgICkgJiYKKyAgICAgICAocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkKKwl7CisJCXJldHVybjsKKwl9CisKKwlOZGlzWmVyb01lbW9yeShOdWxsRnJhbWUsIDQ4KTsKKwlMZW5ndGggPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisKKwlwSGVhZGVyXzgwMl8xMSA9IChQSEVBREVSXzgwMl8xMSkgTnVsbEZyYW1lOworCisJcEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgPSBCVFlQRV9EQVRBOworCXBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID0gU1VCVFlQRV9OVUxMX0ZVTkM7CisJcEhlYWRlcl84MDJfMTEtPkZDLlRvRHMgPSAxOworCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisKKwlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSkKKwl7CisJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7CisJfQorCWVsc2UKKwl7CisJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkgPyAxOiAwOworCX0KKwlwSGVhZGVyXzgwMl8xMS0+RHVyYXRpb24gPSBwQWQtPkNvbW1vbkNmZy5Ec2lmcyArIFJUTVBDYWxjRHVyYXRpb24ocEFkLCBUeFJhdGUsIDE0KTsKKworCXBBZC0+U2VxdWVuY2UrKzsKKwlwSGVhZGVyXzgwMl8xMS0+U2VxdWVuY2UgPSBwQWQtPlNlcXVlbmNlOworCisJLy8gUHJlcGFyZSBRb3NOdWxsIGZ1bmN0aW9uIGZyYW1lCisJaWYgKGJRb3NOdWxsKQorCXsKKwkJcEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPSBTVUJUWVBFX1FPU19OVUxMOworCisJCS8vIGNvcHkgUU9TIGNvbnRyb2wgYnl0ZXMKKwkJTnVsbEZyYW1lW0xlbmd0aF0JPSAgMDsKKwkJTnVsbEZyYW1lW0xlbmd0aCsxXSA9ICAwOworCQlMZW5ndGggKz0gMjsvLyBpZiBwYWQgd2l0aCAyIGJ5dGVzIGZvciBhbGlnbm1lbnQsIEFQU0Qgd2lsbCBmYWlsCisJfQorCisJSEFMX0tpY2tPdXROdWxsRnJhbWVUeChwQWQsIDAsIE51bGxGcmFtZSwgTGVuZ3RoKTsKKworfQorCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQJUlRNUFNlbmRSVFNGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwREEsCisJSU4JdW5zaWduZWQgaW50CU5leHRNcGR1U2l6ZSwKKwlJTglVQ0hBUgkJCVR4UmF0ZSwKKwlJTglVQ0hBUgkJCVJUU1JhdGUsCisJSU4JVVNIT1JUCQkJQWNrRHVyYXRpb24sCisJSU4JVUNIQVIJCQlRdWVJZHgsCisJSU4JVUNIQVIJCQlGcmFtZUdhcCkKK3sKK30KKworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgRklORCBFTkNSWVBUIEtFWSBBTkQgREVDSURFIENJUEhFUiBBTEdPUklUSE0KKy8vCQlGaW5kIHRoZSBXUEEga2V5LCBlaXRoZXIgR3JvdXAgb3IgUGFpcndpc2UgS2V5CisvLwkJTEVBUCArIFRLSVAgYWxzbyB1c2UgV1BBIGtleS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZWNpZGUgV0VQIGJpdCBhbmQgY2lwaGVyIHN1aXRlIHRvIGJlIHVzZWQuIFNhbWUgY2lwaGVyIHN1aXRlIHNob3VsZCBiZSB1c2VkIGZvciB3aG9sZSBmcmFnbWVudCBidXJzdAorLy8gSW4gQ2lzY28gQ0NYIDIuMCBMZWFwIEF1dGhlbnRpY2F0aW9uCisvLwkJICAgV2VwU3RhdHVzIGlzIE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQgYnV0IHRoZSBrZXkgd2lsbCB1c2UgUGFpcndpc2VLZXkKKy8vCQkgICBJbnN0ZWFkIG9mIHRoZSBTaGFyZWRLZXksIFNoYXJlZEtleSBMZW5ndGggbWF5IGJlIFplcm8uCitWT0lEIFNUQUZpbmRDaXBoZXJBbGdvcml0aG0oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaykKK3sKKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwlDaXBoZXI7CQkJCS8vIFRvIGluZGljYXRlIGNpcGhlciB1c2VkIGZvciB0aGlzIHBhY2tldAorCVVDSEFSCQkJCQkJCUNpcGhlckFsZyA9IENJUEhFUl9OT05FOwkJLy8gY2lwaGVyIGFsb2dyaXRobQorCVVDSEFSCQkJCQkJCUtleUlkeCA9IDB4ZmY7CisJUFVDSEFSCQkJCQkJCXBTcmNCdWZWQTsKKwlQQ0lQSEVSX0tFWQkJCQkJCXBLZXkgPSBOVUxMOworCisJcFNyY0J1ZlZBID0gR0VUX09TX1BLVF9EQVRBUFRSKHBUeEJsay0+cFBhY2tldCk7CisKKwl7CisJICAgIC8vIFNlbGVjdCBDaXBoZXIKKwkgICAgaWYgKCgqcFNyY0J1ZlZBICYgMHgwMSkgJiYgKEFESE9DX09OKHBBZCkpKQorCSAgICAgICAgQ2lwaGVyID0gcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXI7IC8vIENpcGhlciBmb3IgTXVsdGljYXN0IG9yIEJyb2FkY2FzdAorCSAgICBlbHNlCisJICAgICAgICBDaXBoZXIgPSBwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyOyAvLyBDaXBoZXIgZm9yIFVuaWNhc3QKKworCQlpZiAoUlRNUF9HRVRfUEFDS0VUX0VBUE9MKHBUeEJsay0+cFBhY2tldCkpCisJCXsKKwkJCUFTU0VSVChwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPD0gQ0lQSEVSX0NLSVAxMjgpOworCisJCQkvLyA0LXdheSBoYW5kc2hha2luZyBmcmFtZSBtdXN0IGJlIGNsZWFyCisJCQlpZiAoIShUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JDbGVhckVBUEZyYW1lKSkgJiYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZykgJiYKKwkJCQkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuKSkKKwkJCXsKKwkJCQlDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGc7CisJCQkJS2V5SWR4ID0gMDsKKwkJCX0KKwkJfQorCQllbHNlIGlmIChDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkKKwkJeworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJaWYgKHBBZC0+U3RhQ2ZnLkNraXBGbGFnICYgMHgxMCkgLy8gQ2lzY28gQ0tJUCBLUCBpcyBvbgorCQkJeworCQkJCWlmIChMRUFQX0NDS01fT04ocEFkKSkKKwkJCQl7CisJCQkJCWlmICgoKCpwU3JjQnVmVkEgJiAweDAxKSAmJiAoQURIT0NfT04ocEFkKSkpKQorCQkJCQkJS2V5SWR4ID0gMTsKKwkJCQkJZWxzZQorCQkJCQkJS2V5SWR4ID0gMDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCQlLZXlJZHggPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CisJCQl9CisJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5Da2lwRmxhZyAmIDB4MDgpIC8vIG9ubHkgQ0tJUCBDTUlDCisJCQkJS2V5SWR4ID0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOworCQkJZWxzZSBpZiAoTEVBUF9DQ0tNX09OKHBBZCkpCisJCQl7CisJCQkJaWYgKCgqcFNyY0J1ZlZBICYgMHgwMSkgJiYgKEFESE9DX09OKHBBZCkpKQorCQkJCQlLZXlJZHggPSAxOworCQkJCWVsc2UKKwkJCQkJS2V5SWR4ID0gMDsKKwkJCX0KKwkJCWVsc2UJLy8gc3RhbmRhcmQgV0VQNjQgb3IgV0VQMTI4CisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCQkJS2V5SWR4ID0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOworCQl9CisJCWVsc2UgaWYgKChDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgfHwKKwkJCQkgKENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkKKwkJeworCQkJaWYgKCgqcFNyY0J1ZlZBICYgMHgwMSkgJiYgKEFESE9DX09OKHBBZCkpKSAvLyBtdWx0aWNhc3QKKwkJCQlLZXlJZHggPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CisJCQllbHNlIGlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4pCisJCQkJS2V5SWR4ID0gMDsKKwkJCWVsc2UKKwkJCQlLZXlJZHggPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CisJCX0KKworCQlpZiAoS2V5SWR4ID09IDB4ZmYpCisJCQlDaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJZWxzZSBpZiAoKENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkKSB8fCAocEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPT0gMCkpCisJCQlDaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJICAgIGVsc2UgaWYgKCBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgJiYKKwkgICAgICAgICAgICAgKENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKSAmJgorCSAgICAgICAgICAgICAocEFkLT5TdGFDZmcuSUVFRTgwMjFYID09IFRSVUUpICYmCisJICAgICAgICAgICAgIChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpKQorCSAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCQllbHNlCisJCXsKKwkJCS8vSGVhZGVyXzgwMl8xMS5GQy5XZXAgPSAxOworCQkJQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGc7CisJCQlwS2V5ID0gJnBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF07CisJCX0KKwl9CisKKwlwVHhCbGstPkNpcGhlckFsZyA9IENpcGhlckFsZzsKKwlwVHhCbGstPnBLZXkgPSBwS2V5OworfQorCisKK1ZPSUQgU1RBQnVpbGRDb21tb244MDJfMTFIZWFkZXIoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFRYX0JMSyAgICAgICAgICAqcFR4QmxrKQoreworCisJSEVBREVSXzgwMl8xMQkqcEhlYWRlcl84MDJfMTE7CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJQk9PTEVBTgliRExTRnJhbWUgPSBGQUxTRTsKKwlJTlQJRGxzRW50cnlJbmRleCA9IDA7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKwkvLworCS8vIE1BS0UgQSBDT01NT04gODAyLjExIEhFQURFUgorCS8vCisKKwkvLyBub3JtYWwgd2xhbiBoZWFkZXIgc2l6ZSA6IDI0IG9jdGV0cworCXBUeEJsay0+TXBkdUhlYWRlckxlbiA9IHNpemVvZihIRUFERVJfODAyXzExKTsKKworCXBIZWFkZXJfODAyXzExID0gKEhFQURFUl84MDJfMTEgKikgJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXTsKKworCU5kaXNaZXJvTWVtb3J5KHBIZWFkZXJfODAyXzExLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCisJcEhlYWRlcl84MDJfMTEtPkZDLkZyRHMgPSAwOworCXBIZWFkZXJfODAyXzExLT5GQy5UeXBlID0gQlRZUEVfREFUQTsKKwlwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9ICgoVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iV01NKSkgPyBTVUJUWVBFX1FEQVRBIDogU1VCVFlQRV9EQVRBKTsKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCWlmIChJTkZSQV9PTihwQWQpKQorCXsKKwkJLy8gQ2hlY2sgaWYgdGhlIGZyYW1lIGNhbiBiZSBzZW50IHRocm91Z2ggRExTIGRpcmVjdCBsaW5rIGludGVyZmFjZQorCQkvLyBJZiBwYWNrZXQgY2FuIGJlIHNlbnQgdGhyb3VnaCBETFMsIHRoZW4gZm9yY2UgYWdncmVnYXRpb24gZGlzYWJsZS4gKEhhcmQgdG8gZGV0ZXJtaW5lIHBlZXIgU1RBJ3MgY2FwYWJpbGl0eSkKKwkJRGxzRW50cnlJbmRleCA9IFJUTVBDaGVja0RMU0ZyYW1lKHBBZCwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyKTsKKwkJaWYgKERsc0VudHJ5SW5kZXggPj0gMCkKKwkJCWJETFNGcmFtZSA9IFRSVUU7CisJCWVsc2UKKwkJCWJETFNGcmFtZSA9IEZBTFNFOworCX0KKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworICAgIGlmIChwVHhCbGstPnBNYWNFbnRyeSkKKwl7CisJCWlmIChUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JGb3JjZU5vblFvUykpCisJCXsKKwkJCXBIZWFkZXJfODAyXzExLT5TZXF1ZW5jZSA9IHBUeEJsay0+cE1hY0VudHJ5LT5Ob25Rb3NEYXRhU2VxOworCQkJcFR4QmxrLT5wTWFjRW50cnktPk5vblFvc0RhdGFTZXEgPSAocFR4QmxrLT5wTWFjRW50cnktPk5vblFvc0RhdGFTZXErMSkgJiBNQVhTRVE7CisJCX0KKwkJZWxzZQorCQl7CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCQlpZiAoYkRMU0ZyYW1lKQorCQkJeworCQkJCXBIZWFkZXJfODAyXzExLT5TZXF1ZW5jZSA9IHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W0Rsc0VudHJ5SW5kZXhdLlNlcXVlbmNlOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W0Rsc0VudHJ5SW5kZXhdLlNlcXVlbmNlID0gKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W0Rsc0VudHJ5SW5kZXhdLlNlcXVlbmNlKzEpICYgTUFYU0VROworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQkJeworICAgIAkgICAgcEhlYWRlcl84MDJfMTEtPlNlcXVlbmNlID0gcFR4QmxrLT5wTWFjRW50cnktPlR4U2VxW3BUeEJsay0+VXNlclByaW9yaXR5XTsKKyAgICAJICAgIHBUeEJsay0+cE1hY0VudHJ5LT5UeFNlcVtwVHhCbGstPlVzZXJQcmlvcml0eV0gPSAocFR4QmxrLT5wTWFjRW50cnktPlR4U2VxW3BUeEJsay0+VXNlclByaW9yaXR5XSsxKSAmIE1BWFNFUTsKKyAgICAJfQorCX0KKwl9CisJZWxzZQorCXsKKwkJcEhlYWRlcl84MDJfMTEtPlNlcXVlbmNlID0gcEFkLT5TZXF1ZW5jZTsKKwkJcEFkLT5TZXF1ZW5jZSA9IChwQWQtPlNlcXVlbmNlKzEpICYgTUFYU0VROyAvLyBuZXh0IHNlcXVlbmNlCisJfQorCisJcEhlYWRlcl84MDJfMTEtPkZyYWcgPSAwOworCisJcEhlYWRlcl84MDJfMTEtPkZDLk1vcmVEYXRhID0gVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iTW9yZURhdGEpOworCisJeworCQlpZiAoSU5GUkFfT04ocEFkKSkKKwkJeworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkJaWYgKGJETFNGcmFtZSkKKwkJCXsKKwkJCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMSwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyKTsKKwkJCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCQlwSGVhZGVyXzgwMl8xMS0+RkMuVG9EcyA9IDA7CisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCQl7CisJCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMSwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjMsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcik7CisJCQlwSGVhZGVyXzgwMl8xMS0+RkMuVG9EcyA9IDE7CisJCX0KKwkJfQorCQllbHNlIGlmIChBREhPQ19PTihwQWQpKQorCQl7CisJCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMSwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyKTsKKwkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKwkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQlwSGVhZGVyXzgwMl8xMS0+RkMuVG9EcyA9IDA7CisJCX0KKwl9CisKKwlpZiAocFR4QmxrLT5DaXBoZXJBbGcgIT0gQ0lQSEVSX05PTkUpCisJCXBIZWFkZXJfODAyXzExLT5GQy5XZXAgPSAxOworCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBTVEVQIDIuIE1BS0UgQSBDT01NT04gODAyLjExIEhFQURFUiBTSEFSRUQgQlkgRU5USVJFIEZSQUdNRU5UIEJVUlNULiBGaWxsIHNlcXVlbmNlIGxhdGVyLgorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpCisgICAgCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7CisJZWxzZQorICAgIAlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpOworfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitWT0lEIFNUQUJ1aWxkQ2FjaGU4MDJfMTFIZWFkZXIoCisJSU4gUlRNUF9BREFQVEVSCQkqcEFkLAorCUlOIFRYX0JMSwkJCSpwVHhCbGssCisJSU4gVUNIQVIJCQkqcEhlYWRlcikKK3sKKwlNQUNfVEFCTEVfRU5UUlkJKnBNYWNFbnRyeTsKKwlQSEVBREVSXzgwMl8xMQlwSGVhZGVyODAyMTE7CisKKwlwSGVhZGVyODAyMTEgPSAoUEhFQURFUl84MDJfMTEpcEhlYWRlcjsKKwlwTWFjRW50cnkgPSBwVHhCbGstPnBNYWNFbnRyeTsKKworCS8vCisJLy8gVXBkYXRlIHRoZSBjYWNoZWQgODAyLjExIEhFQURFUgorCS8vCisKKwkvLyBub3JtYWwgd2xhbiBoZWFkZXIgc2l6ZSA6IDI0IG9jdGV0cworCXBUeEJsay0+TXBkdUhlYWRlckxlbiA9IHNpemVvZihIRUFERVJfODAyXzExKTsKKworCS8vIE1vcmUgQml0CisJcEhlYWRlcjgwMjExLT5GQy5Nb3JlRGF0YSA9IFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYk1vcmVEYXRhKTsKKworCS8vIFNlcXVlbmNlCisJcEhlYWRlcjgwMjExLT5TZXF1ZW5jZSA9IHBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldOworICAgIHBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldID0gKHBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldKzEpICYgTUFYU0VROworCisJeworCQkvLyBDaGVjayBpZiB0aGUgZnJhbWUgY2FuIGJlIHNlbnQgdGhyb3VnaCBETFMgZGlyZWN0IGxpbmsgaW50ZXJmYWNlCisJCS8vIElmIHBhY2tldCBjYW4gYmUgc2VudCB0aHJvdWdoIERMUywgdGhlbiBmb3JjZSBhZ2dyZWdhdGlvbiBkaXNhYmxlLiAoSGFyZCB0byBkZXRlcm1pbmUgcGVlciBTVEEncyBjYXBhYmlsaXR5KQorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQlCT09MRUFOCWJETFNGcmFtZSA9IEZBTFNFOworCQlJTlQJRGxzRW50cnlJbmRleCA9IDA7CisKKwkJRGxzRW50cnlJbmRleCA9IFJUTVBDaGVja0RMU0ZyYW1lKHBBZCwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyKTsKKwkJaWYgKERsc0VudHJ5SW5kZXggPj0gMCkKKwkJCWJETFNGcmFtZSA9IFRSVUU7CisJCWVsc2UKKwkJCWJETFNGcmFtZSA9IEZBTFNFOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisJCS8vIFRoZSBhZGRyMyBvZiBub3JtYWwgcGFja2V0IHNlbmQgZnJvbSBEUyBpcyBEZXN0IE1hYyBhZGRyZXNzLgorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQlpZiAoYkRMU0ZyYW1lKQorCQl7CisJCQlDT1BZX01BQ19BRERSKHBIZWFkZXI4MDIxMS0+QWRkcjEsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcik7CisJCQlDT1BZX01BQ19BRERSKHBIZWFkZXI4MDIxMS0+QWRkcjMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCXBIZWFkZXI4MDIxMS0+RkMuVG9EcyA9IDA7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQlpZiAoQURIT0NfT04ocEFkKSkKKwkJCUNPUFlfTUFDX0FERFIocEhlYWRlcjgwMjExLT5BZGRyMywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQllbHNlCisJCQlDT1BZX01BQ19BRERSKHBIZWFkZXI4MDIxMS0+QWRkcjMsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcik7CisJfQorCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBTVEVQIDIuIE1BS0UgQSBDT01NT04gODAyLjExIEhFQURFUiBTSEFSRUQgQlkgRU5USVJFIEZSQUdNRU5UIEJVUlNULiBGaWxsIHNlcXVlbmNlIGxhdGVyLgorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpCisgICAgCXBIZWFkZXI4MDIxMS0+RkMuUHdyTWdtdCA9IFBXUl9TQVZFOworCWVsc2UKKyAgICAJcEhlYWRlcjgwMjExLT5GQy5Qd3JNZ210ID0gKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSk7Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK3N0YXRpYyBpbmxpbmUgUFVDSEFSIFNUQV9CdWlsZF9BUmFsaW5rX0ZyYW1lX0hlYWRlcigKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCwKKwlJTiBUWF9CTEsJCSpwVHhCbGspCit7CisJUFVDSEFSCQkJcEhlYWRlckJ1ZlB0cjsKKwlIRUFERVJfODAyXzExCSpwSGVhZGVyXzgwMl8xMTsKKwlQTkRJU19QQUNLRVQJcE5leHRQYWNrZXQ7CisJVUlOVDMyCQkJbmV4dEJ1ZkxlbjsKKwlQUVVFVUVfRU5UUlkJcFFFbnRyeTsKKworCVNUQUZpbmRDaXBoZXJBbGdvcml0aG0ocEFkLCBwVHhCbGspOworCVNUQUJ1aWxkQ29tbW9uODAyXzExSGVhZGVyKHBBZCwgcFR4QmxrKTsKKworCisJcEhlYWRlckJ1ZlB0ciA9ICZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRSArIFRYV0lfU0laRV07CisJcEhlYWRlcl84MDJfMTEgPSAoSEVBREVSXzgwMl8xMSAqKSBwSGVhZGVyQnVmUHRyOworCisJLy8gc3RlYWwgIm9yZGVyIiBiaXQgdG8gbWFyayAiYWdncmVnYXRpb24iCisJcEhlYWRlcl84MDJfMTEtPkZDLk9yZGVyID0gMTsKKworCS8vIHNraXAgY29tbW9uIGhlYWRlcgorCXBIZWFkZXJCdWZQdHIgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuOworCisJaWYgKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYldNTSkpCisJeworCQkvLworCQkvLyBidWlsZCBRT1MgQ29udHJvbCBieXRlcworCQkvLworCQkqcEhlYWRlckJ1ZlB0ciA9IChwVHhCbGstPlVzZXJQcmlvcml0eSAmIDB4MEYpOworCisJCSoocEhlYWRlckJ1ZlB0cisxKSA9IDA7CisJCXBIZWFkZXJCdWZQdHIgKz0yOworCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gMjsKKwl9CisKKwkvLyBwYWRkaW5nIGF0IGZyb250IG9mIExMQyBoZWFkZXIuIExMQyBoZWFkZXIgc2hvdWxkIGF0IDQtYnl0ZXMgYWxpZ21lbnQuCisJcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpcEhlYWRlckJ1ZlB0cjsKKwlwSGVhZGVyQnVmUHRyID0gKFBDSEFSKVJPVU5EX1VQKHBIZWFkZXJCdWZQdHIsIDQpOworCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKShwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZHJQYWRMZW4pOworCisJLy8gRm9yIFJBIEFnZ3JlZ2F0aW9uLAorCS8vIHB1dCB0aGUgMm5kIE1TRFUgbGVuZ3RoKGV4dHJhIDItYnl0ZSBmaWVsZCkgYWZ0ZXIgUU9TX0NPTlRST0wgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQKKwlwUUVudHJ5ID0gcFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZDsKKwlwTmV4dFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BLVChwUUVudHJ5KTsKKwluZXh0QnVmTGVuID0gR0VUX09TX1BLVF9MRU4ocE5leHRQYWNrZXQpOworCWlmIChSVE1QX0dFVF9QQUNLRVRfVkxBTihwTmV4dFBhY2tldCkpCisJCW5leHRCdWZMZW4gLT0gTEVOR1RIXzgwMl8xUTsKKworCSpwSGVhZGVyQnVmUHRyID0gKFVDSEFSKW5leHRCdWZMZW4gJiAweGZmOworCSoocEhlYWRlckJ1ZlB0cisxKSA9IChVQ0hBUikobmV4dEJ1ZkxlbiA+PiA4KTsKKworCXBIZWFkZXJCdWZQdHIgKz0gMjsKKwlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gMjsKKworCXJldHVybiBwSGVhZGVyQnVmUHRyOworCit9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK3N0YXRpYyBpbmxpbmUgUFVDSEFSIFNUQV9CdWlsZF9BTVNEVV9GcmFtZV9IZWFkZXIoCisJSU4gUlRNUF9BREFQVEVSICpwQWQsCisJSU4gVFhfQkxLCQkqcFR4QmxrKQoreworCVBVQ0hBUgkJCXBIZWFkZXJCdWZQdHI7Ly8sIHBTYXZlQnVmUHRyOworCUhFQURFUl84MDJfMTEJKnBIZWFkZXJfODAyXzExOworCisKKwlTVEFGaW5kQ2lwaGVyQWxnb3JpdGhtKHBBZCwgcFR4QmxrKTsKKwlTVEFCdWlsZENvbW1vbjgwMl8xMUhlYWRlcihwQWQsIHBUeEJsayk7CisKKwlwSGVhZGVyQnVmUHRyID0gJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXTsKKwlwSGVhZGVyXzgwMl8xMSA9IChIRUFERVJfODAyXzExICopIHBIZWFkZXJCdWZQdHI7CisKKwkvLyBza2lwIGNvbW1vbiBoZWFkZXIKKwlwSGVhZGVyQnVmUHRyICs9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKKworCS8vCisJLy8gYnVpbGQgUU9TIENvbnRyb2wgYnl0ZXMKKwkvLworCSpwSGVhZGVyQnVmUHRyID0gKHBUeEJsay0+VXNlclByaW9yaXR5ICYgMHgwRik7CisKKwkvLworCS8vIEEtTVNEVSBwYWNrZXQKKwkvLworCSpwSGVhZGVyQnVmUHRyIHw9IDB4ODA7CisKKwkqKHBIZWFkZXJCdWZQdHIrMSkgPSAwOworCXBIZWFkZXJCdWZQdHIgKz0yOworCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSAyOworCisJLy9wU2F2ZUJ1ZlB0ciA9IHBIZWFkZXJCdWZQdHI7CisKKwkvLworCS8vIHBhZGRpbmcgYXQgZnJvbnQgb2YgTExDIGhlYWRlcgorCS8vIExMQyBoZWFkZXIgc2hvdWxkIGxvY2F0ZSBhdCA0LW9jdGV0cyBhbGlnbWVudAorCS8vCisJLy8gQEBAIE1wZHVIZWFkZXJMZW4gZXhjbHVkaW5nIHBhZGRpbmcgQEBACisJLy8KKwlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORylwSGVhZGVyQnVmUHRyOworCXBIZWFkZXJCdWZQdHIgPSAoUENIQVIpIFJPVU5EX1VQKHBIZWFkZXJCdWZQdHIsIDQpOworCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKShwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZHJQYWRMZW4pOworCisJcmV0dXJuIHBIZWFkZXJCdWZQdHI7CisKK30KKworCitWT0lEIFNUQV9BTVBEVV9GcmFtZV9UeCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrKQoreworCUhFQURFUl84MDJfMTEJKnBIZWFkZXJfODAyXzExOworCVBVQ0hBUgkJCXBIZWFkZXJCdWZQdHI7CisJVVNIT1JUCQkJRnJlZU51bWJlcjsKKwlNQUNfVEFCTEVfRU5UUlkJKnBNYWNFbnRyeTsKKwlCT09MRUFOCQkJYlZMQU5Qa3Q7CisJUFFVRVVFX0VOVFJZCXBRRW50cnk7CisKKwlBU1NFUlQocFR4QmxrKTsKKworCXdoaWxlKHBUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQpCisJeworCQlwUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7CisJCXBUeEJsay0+cFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKKwkJaWYgKCBSVE1QX0ZpbGxUeEJsa0luZm8ocEFkLCBwVHhCbGspICE9IFRSVUUpCisJCXsKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwVHhCbGstPnBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJY29udGludWU7CisJCX0KKworCQliVkxBTlBrdCA9IChSVE1QX0dFVF9QQUNLRVRfVkxBTihwVHhCbGstPnBQYWNrZXQpID8gVFJVRSA6IEZBTFNFKTsKKworCQlwTWFjRW50cnkgPSBwVHhCbGstPnBNYWNFbnRyeTsKKwkJaWYgKHBNYWNFbnRyeS0+aXNDYWNoZWQpCisJCXsKKwkJCS8vIE5PVEU6IFBsZWFzZSBtYWtlIHN1cmUgdGhlIHNpemUgb2YgcE1hY0VudHJ5LT5DYWNoZWRCdWZbXSBpcyBzbWFsbGVyIHRoYW4gcFR4QmxrLT5IZWFkZXJCdWZbXSEhISEKKwkJCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSwgKFBVQ0hBUikmcE1hY0VudHJ5LT5DYWNoZWRCdWZbMF0sIFRYV0lfU0laRSArIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJCQlwSGVhZGVyQnVmUHRyID0gKFBVQ0hBUikoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXSk7CisJCQlTVEFCdWlsZENhY2hlODAyXzExSGVhZGVyKHBBZCwgcFR4QmxrLCBwSGVhZGVyQnVmUHRyKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVNUQUZpbmRDaXBoZXJBbGdvcml0aG0ocEFkLCBwVHhCbGspOworCQkJU1RBQnVpbGRDb21tb244MDJfMTFIZWFkZXIocEFkLCBwVHhCbGspOworCisJCQlwSGVhZGVyQnVmUHRyID0gJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXTsKKwkJfQorCisKKwkJcEhlYWRlcl84MDJfMTEgPSAoSEVBREVSXzgwMl8xMSAqKSBwSGVhZGVyQnVmUHRyOworCisJCS8vIHNraXAgY29tbW9uIGhlYWRlcgorCQlwSGVhZGVyQnVmUHRyICs9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKKworCQkvLworCQkvLyBidWlsZCBRT1MgQ29udHJvbCBieXRlcworCQkvLworCQkqcEhlYWRlckJ1ZlB0ciA9IChwVHhCbGstPlVzZXJQcmlvcml0eSAmIDB4MEYpOworCQkqKHBIZWFkZXJCdWZQdHIrMSkgPSAwOworCQlwSGVhZGVyQnVmUHRyICs9MjsKKwkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IDI7CisKKwkJLy8KKwkJLy8gYnVpbGQgSFRDKworCQkvLyBIVEMgY29udHJvbCBmaWxlZCBmb2xsb3dpbmcgUW9TIGZpZWxkCisJCS8vCisJCWlmICgocEFkLT5Db21tb25DZmcuYlJkZyA9PSBUUlVFKSAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwVHhCbGstPnBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUkRHX0NBUEFCTEUpKQorCQl7CisJCQlpZiAocE1hY0VudHJ5LT5pc0NhY2hlZCA9PSBGQUxTRSkKKwkJCXsKKwkJCQkvLyBtYXJrIEhUQyBiaXQKKwkJCQlwSGVhZGVyXzgwMl8xMS0+RkMuT3JkZXIgPSAxOworCisJCQkJTmRpc1plcm9NZW1vcnkocEhlYWRlckJ1ZlB0ciwgNCk7CisJCQkJKihwSGVhZGVyQnVmUHRyKzMpIHw9IDB4ODA7CisJCQl9CisJCQlwSGVhZGVyQnVmUHRyICs9IDQ7CisJCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gNDsKKwkJfQorCisJCS8vcFR4QmxrLT5NcGR1SGVhZGVyTGVuID0gcEhlYWRlckJ1ZlB0ciAtIHBUeEJsay0+SGVhZGVyQnVmIC0gVFhXSV9TSVpFIC0gVFhJTkZPX1NJWkU7CisJCUFTU0VSVChwVHhCbGstPk1wZHVIZWFkZXJMZW4gPj0gMjQpOworCisJCS8vIHNraXAgODAyLjMgaGVhZGVyCisJCXBUeEJsay0+cFNyY0J1ZkRhdGEgPSBwVHhCbGstPnBTcmNCdWZIZWFkZXIgKyBMRU5HVEhfODAyXzM7CisJCXBUeEJsay0+U3JjQnVmTGVuICAtPSBMRU5HVEhfODAyXzM7CisKKwkJLy8gc2tpcCB2bGFuIHRhZworCQlpZiAoYlZMQU5Qa3QpCisJCXsKKwkJCXBUeEJsay0+cFNyY0J1ZkRhdGEJKz0gTEVOR1RIXzgwMl8xUTsKKwkJCXBUeEJsay0+U3JjQnVmTGVuCS09IExFTkdUSF84MDJfMVE7CisJCX0KKworCQkvLworCQkvLyBwYWRkaW5nIGF0IGZyb250IG9mIExMQyBoZWFkZXIKKwkJLy8gTExDIGhlYWRlciBzaG91bGQgbG9jYXRlIGF0IDQtb2N0ZXRzIGFsaWdtZW50CisJCS8vCisJCS8vIEBAQCBNcGR1SGVhZGVyTGVuIGV4Y2x1ZGluZyBwYWRkaW5nIEBAQAorCQkvLworCQlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORylwSGVhZGVyQnVmUHRyOworCQlwSGVhZGVyQnVmUHRyID0gKFBDSEFSKSBST1VORF9VUChwSGVhZGVyQnVmUHRyLCA0KTsKKwkJcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpKHBIZWFkZXJCdWZQdHIgLSBwVHhCbGstPkhkclBhZExlbik7CisKKwkJeworCisJCQkvLworCQkJLy8gSW5zZXJ0IExMQy1TTkFQIGVuY2Fwc3VsYXRpb24gLSA4IG9jdGV0cworCQkJLy8KKwkJCUVYVFJBX0xMQ1NOQVBfRU5DQVBfRlJPTV9QS1RfT0ZGU0VUKHBUeEJsay0+cFNyY0J1ZkRhdGEtMiwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApOworCQkJaWYgKHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKQorCQkJeworCQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKKwkJCQlwSGVhZGVyQnVmUHRyICs9IDY7CisJCQkJLy8gZ2V0IDIgb2N0ZXRzIChUeXBlb2ZMZW4pCisJCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmRGF0YS0yLCAyKTsKKwkJCQlwSGVhZGVyQnVmUHRyICs9IDI7CisJCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IExFTkdUSF84MDJfMV9IOworCQkJfQorCisJCX0KKworCQlpZiAocE1hY0VudHJ5LT5pc0NhY2hlZCkKKwkJeworICAgICAgICAgICAgUlRNUFdyaXRlVHhXSV9DYWNoZShwQWQsIChQVFhXSV9TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSksIHBUeEJsayk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QV3JpdGVUeFdJX0RhdGEocEFkLCAoUFRYV0lfU1RSVUMpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0pLCBwVHhCbGspOworCisJCQlOZGlzWmVyb01lbW9yeSgoUFVDSEFSKSgmcE1hY0VudHJ5LT5DYWNoZWRCdWZbMF0pLCBzaXplb2YocE1hY0VudHJ5LT5DYWNoZWRCdWYpKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpKCZwTWFjRW50cnktPkNhY2hlZEJ1ZlswXSksIChQVUNIQVIpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0pLCAocEhlYWRlckJ1ZlB0ciAtIChQVUNIQVIpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0pKSk7CisJCQlwTWFjRW50cnktPmlzQ2FjaGVkID0gVFJVRTsKKwkJfQorCisJCS8vIGNhbGN1bGF0ZSBUcmFuc21pdHRlZCBBTVBEVSBjb3VudCBhbmQgQnl0ZUNvdW50CisJCXsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRNUERVc0luQU1QRFVDb3VudC51Lkxvd1BhcnQgKys7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkT2N0ZXRzSW5BTVBEVUNvdW50LlF1YWRQYXJ0ICs9IHBUeEJsay0+U3JjQnVmTGVuOworCQl9CisKKwkJLy9GcmVlTnVtYmVyID0gR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOworCisJCUhBTF9Xcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIFRSVUUsICZGcmVlTnVtYmVyKTsKKworCQkvLworCQkvLyBLaWNrIG91dCBUeAorCQkvLworCQlIQUxfS2lja091dFR4KHBBZCwgcFR4QmxrLCBwVHhCbGstPlF1ZUlkeCk7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RG9uZUNvdW50Kys7CisJfQorCit9CisKKworVk9JRCBTVEFfQU1TRFVfRnJhbWVfVHgoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaykKK3sKKwlQVUNIQVIJCQlwSGVhZGVyQnVmUHRyOworCVVTSE9SVAkJCUZyZWVOdW1iZXI7CisJVVNIT1JUCQkJc3ViRnJhbWVQYXlsb2FkTGVuID0gMDsJLy8gQU1TRFUgU3ViZnJhbWUgbGVuZ3RoIHdpdGhvdXQgQU1TRFUtSGVhZGVyIC8gUGFkZGluZy4KKwlVU0hPUlQJCQl0b3RhbE1QRFVTaXplPTA7CisJVUNIQVIJCQkqc3ViRnJhbWVIZWFkZXI7CisJVUNIQVIJCQlwYWRkaW5nID0gMDsKKwlVU0hPUlQJCQlGaXJzdFR4ID0gMCwgTGFzdFR4SWR4ID0gMDsKKwlCT09MRUFOCQkJYlZMQU5Qa3Q7CisJaW50IAkJCWZyYW1lTnVtID0gMDsKKwlQUVVFVUVfRU5UUlkJcFFFbnRyeTsKKworCisJQVNTRVJUKHBUeEJsayk7CisKKwlBU1NFUlQoKHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlciA+IDEpKTsKKworCXdoaWxlKHBUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQpCisJeworCQlwUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7CisJCXBUeEJsay0+cFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKKwkJaWYgKFJUTVBfRmlsbFR4QmxrSW5mbyhwQWQsIHBUeEJsaykgIT0gVFJVRSkKKwkJeworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWJWTEFOUGt0ID0gKFJUTVBfR0VUX1BBQ0tFVF9WTEFOKHBUeEJsay0+cFBhY2tldCkgPyBUUlVFIDogRkFMU0UpOworCisJCS8vIHNraXAgODAyLjMgaGVhZGVyCisJCXBUeEJsay0+cFNyY0J1ZkRhdGEgPSBwVHhCbGstPnBTcmNCdWZIZWFkZXIgKyBMRU5HVEhfODAyXzM7CisJCXBUeEJsay0+U3JjQnVmTGVuICAtPSBMRU5HVEhfODAyXzM7CisKKwkJLy8gc2tpcCB2bGFuIHRhZworCQlpZiAoYlZMQU5Qa3QpCisJCXsKKwkJCXBUeEJsay0+cFNyY0J1ZkRhdGEJKz0gTEVOR1RIXzgwMl8xUTsKKwkJCXBUeEJsay0+U3JjQnVmTGVuCS09IExFTkdUSF84MDJfMVE7CisJCX0KKworCQlpZiAoZnJhbWVOdW0gPT0gMCkKKwkJeworCQkJcEhlYWRlckJ1ZlB0ciA9IFNUQV9CdWlsZF9BTVNEVV9GcmFtZV9IZWFkZXIocEFkLCBwVHhCbGspOworCisJCQkvLyBOT1RFOiBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQgd2lsbCBiZSB1cGRhdGVkIGFmdGVyIGZpbmFsIGZyYW1lIHdhcyBoYW5kbGVkLgorCQkJUlRNUFdyaXRlVHhXSV9EYXRhKHBBZCwgKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwgcFR4QmxrKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBIZWFkZXJCdWZQdHIgPSAmcFR4QmxrLT5IZWFkZXJCdWZbMF07CisJCQlwYWRkaW5nID0gUk9VTkRfVVAoTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCArIHN1YkZyYW1lUGF5bG9hZExlbiwgNCkgLSAoTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCArIHN1YkZyYW1lUGF5bG9hZExlbik7CisJCQlOZGlzWmVyb01lbW9yeShwSGVhZGVyQnVmUHRyLCBwYWRkaW5nICsgTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCk7CisJCQlwSGVhZGVyQnVmUHRyICs9IHBhZGRpbmc7CisJCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gPSBwYWRkaW5nOworCQl9CisKKwkJLy8KKwkJLy8gQS1NU0RVIHN1YmZyYW1lCisJCS8vICAgREEoNikrU0EoNikrTGVuZ3RoKDIpICsgTExDL1NOQVAgRW5jYXAKKwkJLy8KKwkJc3ViRnJhbWVIZWFkZXIgPSBwSGVhZGVyQnVmUHRyOworCQlzdWJGcmFtZVBheWxvYWRMZW4gPSBwVHhCbGstPlNyY0J1ZkxlbjsKKworCQlOZGlzTW92ZU1lbW9yeShzdWJGcmFtZUhlYWRlciwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyLCAxMik7CisKKworCQlwSGVhZGVyQnVmUHRyICs9IExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQ7CisJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEOworCisKKwkJLy8KKwkJLy8gSW5zZXJ0IExMQy1TTkFQIGVuY2Fwc3VsYXRpb24gLSA4IG9jdGV0cworCQkvLworCQlFWFRSQV9MTENTTkFQX0VOQ0FQX0ZST01fUEtUX09GRlNFVChwVHhCbGstPnBTcmNCdWZEYXRhLTIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKTsKKworCQlzdWJGcmFtZVBheWxvYWRMZW4gPSBwVHhCbGstPlNyY0J1ZkxlbjsKKworCQlpZiAocFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApCisJCXsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKKwkJCXBIZWFkZXJCdWZQdHIgKz0gNjsKKwkJCS8vIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKQorCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmRGF0YS0yLCAyKTsKKwkJCXBIZWFkZXJCdWZQdHIgKz0gMjsKKwkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSBMRU5HVEhfODAyXzFfSDsKKwkJCXN1YkZyYW1lUGF5bG9hZExlbiArPSBMRU5HVEhfODAyXzFfSDsKKwkJfQorCisJCS8vIHVwZGF0ZSBzdWJGcmFtZSBMZW5ndGggZmllbGQKKwkJc3ViRnJhbWVIZWFkZXJbMTJdID0gKHN1YkZyYW1lUGF5bG9hZExlbiAmIDB4RkYwMCkgPj4gODsKKwkJc3ViRnJhbWVIZWFkZXJbMTNdID0gc3ViRnJhbWVQYXlsb2FkTGVuICYgMHhGRjsKKworCQl0b3RhbE1QRFVTaXplICs9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+U3JjQnVmTGVuOworCisJCWlmIChmcmFtZU51bSA9PTApCisJCQlGaXJzdFR4ID0gSEFMX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFtZU51bSwgJkZyZWVOdW1iZXIpOworCQllbHNlCisJCQlMYXN0VHhJZHggPSBIQUxfV3JpdGVNdWx0aVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYW1lTnVtLCAmRnJlZU51bWJlcik7CisKKwkJZnJhbWVOdW0rKzsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQrKzsKKworCQkvLyBjYWxjdWxhdGUgVHJhbnNtaXR0ZWQgQU1TRFUgQ291bnQgYW5kIEJ5dGVDb3VudAorCQl7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1TRFVDb3VudC51Lkxvd1BhcnQgKys7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkT2N0ZXRzSW5BTVNEVS5RdWFkUGFydCArPSB0b3RhbE1QRFVTaXplOworCQl9CisKKwl9CisKKwlIQUxfRmluYWxXcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIHRvdGFsTVBEVVNpemUsIEZpcnN0VHgpOworCUhBTF9MYXN0VHhJZHgocEFkLCBwVHhCbGstPlF1ZUlkeCwgTGFzdFR4SWR4KTsKKworCS8vCisJLy8gS2ljayBvdXQgVHgKKwkvLworCUhBTF9LaWNrT3V0VHgocEFkLCBwVHhCbGssIHBUeEJsay0+UXVlSWR4KTsKK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBTVEFfTGVnYWN5X0ZyYW1lX1R4KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGspCit7CisJSEVBREVSXzgwMl8xMQkqcEhlYWRlcl84MDJfMTE7CisJUFVDSEFSCQkJcEhlYWRlckJ1ZlB0cjsKKwlVU0hPUlQJCQlGcmVlTnVtYmVyOworCUJPT0xFQU4JCQliVkxBTlBrdDsKKwlQUVVFVUVfRU5UUlkJcFFFbnRyeTsKKworCUFTU0VSVChwVHhCbGspOworCisKKwlwUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7CisJcFR4QmxrLT5wUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBRRW50cnkpOworCWlmIChSVE1QX0ZpbGxUeEJsa0luZm8ocEFkLCBwVHhCbGspICE9IFRSVUUpCisJeworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX01DQVNUX0ZSQU1FKQorCXsKKwkJSU5DX0NPVU5URVI2NChwQWQtPldsYW5Db3VudGVycy5NdWx0aWNhc3RUcmFuc21pdHRlZEZyYW1lQ291bnQpOworCX0KKworCWlmIChSVE1QX0dFVF9QQUNLRVRfUlRTKHBUeEJsay0+cFBhY2tldCkpCisJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iUnRzUmVxdWlyZWQpOworCWVsc2UKKwkJVFhfQkxLX0NMRUFSX0ZMQUcocFR4QmxrLCBmVFhfYlJ0c1JlcXVpcmVkKTsKKworCWJWTEFOUGt0ID0gKFJUTVBfR0VUX1BBQ0tFVF9WTEFOKHBUeEJsay0+cFBhY2tldCkgPyBUUlVFIDogRkFMU0UpOworCisJaWYgKHBUeEJsay0+VHhSYXRlIDwgcEFkLT5Db21tb25DZmcuTWluVHhSYXRlKQorCQlwVHhCbGstPlR4UmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZTsKKworCVNUQUZpbmRDaXBoZXJBbGdvcml0aG0ocEFkLCBwVHhCbGspOworCVNUQUJ1aWxkQ29tbW9uODAyXzExSGVhZGVyKHBBZCwgcFR4QmxrKTsKKworCisJLy8gc2tpcCA4MDIuMyBoZWFkZXIKKwlwVHhCbGstPnBTcmNCdWZEYXRhID0gcFR4QmxrLT5wU3JjQnVmSGVhZGVyICsgTEVOR1RIXzgwMl8zOworCXBUeEJsay0+U3JjQnVmTGVuICAtPSBMRU5HVEhfODAyXzM7CisKKwkvLyBza2lwIHZsYW4gdGFnCisJaWYgKGJWTEFOUGt0KQorCXsKKwkJcFR4QmxrLT5wU3JjQnVmRGF0YQkrPSBMRU5HVEhfODAyXzFROworCQlwVHhCbGstPlNyY0J1ZkxlbgktPSBMRU5HVEhfODAyXzFROworCX0KKworCXBIZWFkZXJCdWZQdHIgPSAmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdOworCXBIZWFkZXJfODAyXzExID0gKEhFQURFUl84MDJfMTEgKikgcEhlYWRlckJ1ZlB0cjsKKworCS8vIHNraXAgY29tbW9uIGhlYWRlcgorCXBIZWFkZXJCdWZQdHIgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuOworCisJaWYgKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYldNTSkpCisJeworCQkvLworCQkvLyBidWlsZCBRT1MgQ29udHJvbCBieXRlcworCQkvLworCQkqcEhlYWRlckJ1ZlB0ciA9IChwVHhCbGstPlVzZXJQcmlvcml0eSAmIDB4MEYpOworCQkqKHBIZWFkZXJCdWZQdHIrMSkgPSAwOworCQlwSGVhZGVyQnVmUHRyICs9MjsKKwkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IDI7CisJfQorCisJLy8gVGhlIHJlbWFpbmluZyBjb250ZW50IG9mIE1QRFUgaGVhZGVyIHNob3VsZCBsb2NhdGUgYXQgNC1vY3RldHMgYWxpZ21lbnQKKwlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORylwSGVhZGVyQnVmUHRyOworCXBIZWFkZXJCdWZQdHIgPSAoUENIQVIpIFJPVU5EX1VQKHBIZWFkZXJCdWZQdHIsIDQpOworCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKShwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZHJQYWRMZW4pOworCisJeworCisJCS8vCisJCS8vIEluc2VydCBMTEMtU05BUCBlbmNhcHN1bGF0aW9uIC0gOCBvY3RldHMKKwkJLy8KKwkJLy8KKyAgIAkJLy8gaWYgb3JpZ2luYWwgRXRoZXJuZXQgZnJhbWUgY29udGFpbnMgbm8gTExDL1NOQVAsCisJCS8vIHRoZW4gYW4gZXh0cmEgTExDL1NOQVAgZW5jYXAgaXMgcmVxdWlyZWQKKwkJLy8KKwkJRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9TVEFSVChwVHhCbGstPnBTcmNCdWZIZWFkZXIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKTsKKwkJaWYgKHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKQorCQl7CisJCQlVQ0hBUiB2bGFuX3NpemU7CisKKwkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKKwkJCXBIZWFkZXJCdWZQdHIgKz0gNjsKKwkJCS8vIHNraXAgdmxhbiB0YWcKKwkJCXZsYW5fc2l6ZSA9ICAoYlZMQU5Qa3QpID8gTEVOR1RIXzgwMl8xUSA6IDA7CisJCQkvLyBnZXQgMiBvY3RldHMgKFR5cGVvZkxlbikKKwkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcisxMit2bGFuX3NpemUsIDIpOworCQkJcEhlYWRlckJ1ZlB0ciArPSAyOworCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IExFTkdUSF84MDJfMV9IOworCQl9CisKKwl9CisKKwkvLworCS8vIHByZXBhcmUgZm9yIFRYV0kKKwkvLyB1c2UgV2NpZCBhcyBLZXkgSW5kZXgKKwkvLworCisJUlRNUFdyaXRlVHhXSV9EYXRhKHBBZCwgKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwgcFR4QmxrKTsKKworCS8vRnJlZU51bWJlciA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKKworCUhBTF9Xcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIFRSVUUsICZGcmVlTnVtYmVyKTsKKworCXBBZC0+UmFsaW5rQ291bnRlcnMuS2lja1R4Q291bnQrKzsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RG9uZUNvdW50Kys7CisKKwkvLworCS8vIEtpY2sgb3V0IFR4CisJLy8KKwlIQUxfS2lja091dFR4KHBBZCwgcFR4QmxrLCBwVHhCbGstPlF1ZUlkeCk7Cit9CisKKworVk9JRCBTVEFfQVJhbGlua19GcmFtZV9UeCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrKQoreworCVBVQ0hBUgkJCXBIZWFkZXJCdWZQdHI7CisJVVNIT1JUCQkJRnJlZU51bWJlcjsKKwlVU0hPUlQJCQl0b3RhbE1QRFVTaXplPTA7CisJVVNIT1JUCQkJRmlyc3RUeCwgTGFzdFR4SWR4OworCWludCAJCQlmcmFtZU51bSA9IDA7CisJQk9PTEVBTgkJCWJWTEFOUGt0OworCVBRVUVVRV9FTlRSWQlwUUVudHJ5OworCisKKwlBU1NFUlQocFR4QmxrKTsKKworCUFTU0VSVCgocFR4QmxrLT5UeFBhY2tldExpc3QuTnVtYmVyPT0gMikpOworCisKKwlGaXJzdFR4ID0gTGFzdFR4SWR4ID0gMDsgIC8vIElzIGl0IG9rIGluaXQgdGhleSBhcyAwPworCXdoaWxlKHBUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQpCisJeworCQlwUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7CisJCXBUeEJsay0+cFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKKworCQlpZiAoUlRNUF9GaWxsVHhCbGtJbmZvKHBBZCwgcFR4QmxrKSAhPSBUUlVFKQorCQl7CisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJYlZMQU5Qa3QgPSAoUlRNUF9HRVRfUEFDS0VUX1ZMQU4ocFR4QmxrLT5wUGFja2V0KSA/IFRSVUUgOiBGQUxTRSk7CisKKwkJLy8gc2tpcCA4MDIuMyBoZWFkZXIKKwkJcFR4QmxrLT5wU3JjQnVmRGF0YSA9IHBUeEJsay0+cFNyY0J1ZkhlYWRlciArIExFTkdUSF84MDJfMzsKKwkJcFR4QmxrLT5TcmNCdWZMZW4gIC09IExFTkdUSF84MDJfMzsKKworCQkvLyBza2lwIHZsYW4gdGFnCisJCWlmIChiVkxBTlBrdCkKKwkJeworCQkJcFR4QmxrLT5wU3JjQnVmRGF0YQkrPSBMRU5HVEhfODAyXzFROworCQkJcFR4QmxrLT5TcmNCdWZMZW4JLT0gTEVOR1RIXzgwMl8xUTsKKwkJfQorCisJCWlmIChmcmFtZU51bSA9PSAwKQorCQl7CS8vIEZvciBmaXJzdCBmcmFtZSwgd2UgbmVlZCB0byBjcmVhdGUgdGhlIDgwMi4xMSBoZWFkZXIgKyBwYWRkaW5nKG9wdGlvbmFsKSArIFJBLUFHRy1MRU4gKyBTTkFQIEhlYWRlcgorCisJCQlwSGVhZGVyQnVmUHRyID0gU1RBX0J1aWxkX0FSYWxpbmtfRnJhbWVfSGVhZGVyKHBBZCwgcFR4QmxrKTsKKworCQkJLy8gSXQncyBvayB3cml0ZSB0aGUgVHhXSSBoZXJlLCBiZWNhdXNlIHRoZSBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQKKwkJCS8vCXdpbGwgYmUgdXBkYXRlZCBhZnRlciBmaW5hbCBmcmFtZSB3YXMgaGFuZGxlZC4KKwkJCVJUTVBXcml0ZVR4V0lfRGF0YShwQWQsIChQVFhXSV9TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSksIHBUeEJsayk7CisKKworCQkJLy8KKwkJCS8vIEluc2VydCBMTEMtU05BUCBlbmNhcHN1bGF0aW9uIC0gOCBvY3RldHMKKwkJCS8vCisJCQlFWFRSQV9MTENTTkFQX0VOQ0FQX0ZST01fUEtUX09GRlNFVChwVHhCbGstPnBTcmNCdWZEYXRhLTIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKTsKKworCQkJaWYgKHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKQorCQkJeworCQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKKwkJCQlwSGVhZGVyQnVmUHRyICs9IDY7CisJCQkJLy8gZ2V0IDIgb2N0ZXRzIChUeXBlb2ZMZW4pCisJCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmRGF0YS0yLCAyKTsKKwkJCQlwSGVhZGVyQnVmUHRyICs9IDI7CisJCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IExFTkdUSF84MDJfMV9IOworCQkJfQorCQl9CisJCWVsc2UKKwkJewkvLyBGb3Igc2Vjb25kIGFnZ3JlZ2F0ZWQgZnJhbWUsIHdlIG5lZWQgY3JlYXRlIHRoZSA4MDIuMyBoZWFkZXIgdG8gaGVhZGVyQnVmLCBiZWNhdXNlIFBDSSB3aWxsIGNvcHkgaXQgdG8gU0RQdHIwLgorCisJCQlwSGVhZGVyQnVmUHRyID0gJnBUeEJsay0+SGVhZGVyQnVmWzBdOworCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuID0gMDsKKworCQkJLy8gQS1SYWxpbmsgc3ViLXNlcXVlbnQgZnJhbWUgaGVhZGVyIGlzIHRoZSBzYW1lIGFzIDgwMi4zIGhlYWRlci4KKwkJCS8vICAgREEoNikrU0EoNikrRnJhbWVUeXBlKDIpCisJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIsIDEyKTsKKwkJCXBIZWFkZXJCdWZQdHIgKz0gMTI7CisJCQkvLyBnZXQgMiBvY3RldHMgKFR5cGVvZkxlbikKKwkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cFNyY0J1ZkRhdGEtMiwgMik7CisJCQlwSGVhZGVyQnVmUHRyICs9IDI7CisJCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gPSBMRU5HVEhfQVJBTElOS19TVUJGUkFNRUhFQUQ7CisJCX0KKworCQl0b3RhbE1QRFVTaXplICs9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+U3JjQnVmTGVuOworCisJCS8vRnJlZU51bWJlciA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKKwkJaWYgKGZyYW1lTnVtID09MCkKKwkJCUZpcnN0VHggPSBIQUxfV3JpdGVNdWx0aVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYW1lTnVtLCAmRnJlZU51bWJlcik7CisJCWVsc2UKKwkJCUxhc3RUeElkeCA9IEhBTF9Xcml0ZU11bHRpVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhbWVOdW0sICZGcmVlTnVtYmVyKTsKKworCQlmcmFtZU51bSsrOworCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhBZ2dyZWdhdGlvbkNvdW50Kys7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuS2lja1R4Q291bnQrKzsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeERvbmVDb3VudCsrOworCisJfQorCisJSEFMX0ZpbmFsV3JpdGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLCB0b3RhbE1QRFVTaXplLCBGaXJzdFR4KTsKKwlIQUxfTGFzdFR4SWR4KHBBZCwgcFR4QmxrLT5RdWVJZHgsIExhc3RUeElkeCk7CisKKwkvLworCS8vIEtpY2sgb3V0IFR4CisJLy8KKwlIQUxfS2lja091dFR4KHBBZCwgcFR4QmxrLCBwVHhCbGstPlF1ZUlkeCk7CisKK30KKworCitWT0lEIFNUQV9GcmFnbWVudF9GcmFtZV9UeCgKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCwKKwlJTiBUWF9CTEsJCSpwVHhCbGspCit7CisJSEVBREVSXzgwMl8xMQkqcEhlYWRlcl84MDJfMTE7CisJUFVDSEFSCQkJcEhlYWRlckJ1ZlB0cjsKKwlVU0hPUlQJCQlGcmVlTnVtYmVyOworCVVDSEFSIAkJCWZyYWdOdW0gPSAwOworCVBBQ0tFVF9JTkZPCQlQYWNrZXRJbmZvOworCVVTSE9SVAkJCUVuY3J5cHRpb25PdmVyaGVhZCA9IDA7CisJVUlOVDMyCQkJRnJlZU1wZHVTaXplLCBTcmNSZW1haW5pbmdCeXRlczsKKwlVU0hPUlQJCQlBY2tEdXJhdGlvbjsKKwlVSU5UIAkJCU5leHRNcGR1U2l6ZTsKKwlCT09MRUFOCQkJYlZMQU5Qa3Q7CisJUFFVRVVFX0VOVFJZCXBRRW50cnk7CisKKworCUFTU0VSVChwVHhCbGspOworCisJcFFFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QpOworCXBUeEJsay0+cFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKKwlpZiAoUlRNUF9GaWxsVHhCbGtJbmZvKHBBZCwgcFR4QmxrKSAhPSBUUlVFKQorCXsKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybjsKKwl9CisKKwlBU1NFUlQoVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iQWxsb3dGcmFnKSk7CisJYlZMQU5Qa3QgPSAoUlRNUF9HRVRfUEFDS0VUX1ZMQU4ocFR4QmxrLT5wUGFja2V0KSA/IFRSVUUgOiBGQUxTRSk7CisKKwlTVEFGaW5kQ2lwaGVyQWxnb3JpdGhtKHBBZCwgcFR4QmxrKTsKKwlTVEFCdWlsZENvbW1vbjgwMl8xMUhlYWRlcihwQWQsIHBUeEJsayk7CisKKwlpZiAocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApCisJeworCQlwVHhCbGstPnBQYWNrZXQgPSBkdXBsaWNhdGVfcGt0X3dpdGhfVEtJUF9NSUMocEFkLCBwVHhCbGstPnBQYWNrZXQpOworCQlpZiAocFR4QmxrLT5wUGFja2V0ID09IE5VTEwpCisJCQlyZXR1cm47CisJCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBUeEJsay0+cFBhY2tldCwgJlBhY2tldEluZm8sICZwVHhCbGstPnBTcmNCdWZIZWFkZXIsICZwVHhCbGstPlNyY0J1Zkxlbik7CisJfQorCisJLy8gc2tpcCA4MDIuMyBoZWFkZXIKKwlwVHhCbGstPnBTcmNCdWZEYXRhID0gcFR4QmxrLT5wU3JjQnVmSGVhZGVyICsgTEVOR1RIXzgwMl8zOworCXBUeEJsay0+U3JjQnVmTGVuICAtPSBMRU5HVEhfODAyXzM7CisKKworCS8vIHNraXAgdmxhbiB0YWcKKwlpZiAoYlZMQU5Qa3QpCisJeworCQlwVHhCbGstPnBTcmNCdWZEYXRhCSs9IExFTkdUSF84MDJfMVE7CisJCXBUeEJsay0+U3JjQnVmTGVuCS09IExFTkdUSF84MDJfMVE7CisJfQorCisJcEhlYWRlckJ1ZlB0ciA9ICZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRSArIFRYV0lfU0laRV07CisJcEhlYWRlcl84MDJfMTEgPSAoSEVBREVSXzgwMl8xMSAqKXBIZWFkZXJCdWZQdHI7CisKKworCS8vIHNraXAgY29tbW9uIGhlYWRlcgorCXBIZWFkZXJCdWZQdHIgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuOworCisJaWYgKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYldNTSkpCisJeworCQkvLworCQkvLyBidWlsZCBRT1MgQ29udHJvbCBieXRlcworCQkvLworCQkqcEhlYWRlckJ1ZlB0ciA9IChwVHhCbGstPlVzZXJQcmlvcml0eSAmIDB4MEYpOworCisJCSoocEhlYWRlckJ1ZlB0cisxKSA9IDA7CisJCXBIZWFkZXJCdWZQdHIgKz0yOworCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gMjsKKwl9CisKKwkvLworCS8vIHBhZGRpbmcgYXQgZnJvbnQgb2YgTExDIGhlYWRlcgorCS8vIExMQyBoZWFkZXIgc2hvdWxkIGxvY2F0ZSBhdCA0LW9jdGV0cyBhbGlnbWVudAorCS8vCisJcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpcEhlYWRlckJ1ZlB0cjsKKwlwSGVhZGVyQnVmUHRyID0gKFBDSEFSKSBST1VORF9VUChwSGVhZGVyQnVmUHRyLCA0KTsKKwlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORykocEhlYWRlckJ1ZlB0ciAtIHBUeEJsay0+SGRyUGFkTGVuKTsKKworCisKKwkvLworCS8vIEluc2VydCBMTEMtU05BUCBlbmNhcHN1bGF0aW9uIC0gOCBvY3RldHMKKwkvLworCS8vCisgICAJLy8gaWYgb3JpZ2luYWwgRXRoZXJuZXQgZnJhbWUgY29udGFpbnMgbm8gTExDL1NOQVAsCisJLy8gdGhlbiBhbiBleHRyYSBMTEMvU05BUCBlbmNhcCBpcyByZXF1aXJlZAorCS8vCisJRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9TVEFSVChwVHhCbGstPnBTcmNCdWZIZWFkZXIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKTsKKwlpZiAocFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApCisJeworCQlVQ0hBUiB2bGFuX3NpemU7CisKKwkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXAsIDYpOworCQlwSGVhZGVyQnVmUHRyICs9IDY7CisJCS8vIHNraXAgdmxhbiB0YWcKKwkJdmxhbl9zaXplID0gIChiVkxBTlBrdCkgPyBMRU5HVEhfODAyXzFRIDogMDsKKwkJLy8gZ2V0IDIgb2N0ZXRzIChUeXBlb2ZMZW4pCisJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcisxMit2bGFuX3NpemUsIDIpOworCQlwSGVhZGVyQnVmUHRyICs9IDI7CisJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSBMRU5HVEhfODAyXzFfSDsKKwl9CisKKworCS8vIElmIFRLSVAgaXMgdXNlZCBhbmQgZnJhZ21lbnRhdGlvbiBpcyByZXF1aXJlZC4gRHJpdmVyIGhhcyB0bworCS8vCWFwcGVuZCBUS0lQIE1JQyBhdCB0YWlsIG9mIHRoZSBzY2F0dGVyIGJ1ZmZlcgorCS8vCU1BQyBBU0lDIHdpbGwgb25seSBwZXJmb3JtIElWL0VJVi9JQ1YgaW5zZXJ0aW9uIGJ1dCBubyBUS0lQIE1JQworCWlmIChwVHhCbGstPkNpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkKKwl7CisKKwkJLy8gTk9URTogRE9OJ1QgcmVmZXIgdGhlIHNrYi0+bGVuIGRpcmVjdGx5IGFmdGVyIGZvbGxvd2luZyBjb3B5LiBCZWNhc3VlIHRoZSBsZW5ndGggaXMgbm90IGFkanVzdAorCQkvLwkJCXRvIGNvcnJlY3QgbGVuZ2h0LCByZWZlciB0byBwVHhCbGstPlNyY0J1ZkxlbiBmb3IgdGhlIHBhY2tldCBsZW5ndGggaW4gZm9sbG93aW5nIHByb2dyZXNzLgorCQlOZGlzTW92ZU1lbW9yeShwVHhCbGstPnBTcmNCdWZEYXRhICsgcFR4QmxrLT5TcmNCdWZMZW4sICZwQWQtPlByaXZhdGVJbmZvLlR4Lk1JQ1swXSwgOCk7CisJCS8vc2tiX3B1dCgoUlRQS1RfVE9fT1NQS1QocFR4QmxrLT5wUGFja2V0KSktPnRhaWwsIDgpOworCQlwVHhCbGstPlNyY0J1ZkxlbiArPSA4OworCQlwVHhCbGstPlRvdGFsRnJhbWVMZW4gKz0gODsKKwkJcFR4QmxrLT5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUF9OT19NSUM7CisJfQorCisJLy8KKwkvLyBjYWxjdWF0ZSB0aGUgb3ZlcmhlYWQgYnl0ZXMgdGhhdCBlbmNyeXB0aW9uIGFsZ29yaXRobSBtYXkgYWRkLiBUaGlzCisJLy8gYWZmZWN0cyB0aGUgY2FsY3VsYXRlIG9mICJkdXJhdGlvbiIgZmllbGQKKwkvLworCWlmICgocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDY0KSB8fCAocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDEyOCkpCisJCUVuY3J5cHRpb25PdmVyaGVhZCA9IDg7IC8vV0VQOiBJVls0XSArIElDVls0XTsKKwllbHNlIGlmIChwVHhCbGstPkNpcGhlckFsZyA9PSBDSVBIRVJfVEtJUF9OT19NSUMpCisJCUVuY3J5cHRpb25PdmVyaGVhZCA9IDEyOy8vVEtJUDogSVZbNF0gKyBFSVZbNF0gKyBJQ1ZbNF0sIE1JQyB3aWxsIGJlIGFkZGVkIHRvIFRvdGFsUGFja2V0TGVuZ3RoCisJZWxzZSBpZiAocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApCisJCUVuY3J5cHRpb25PdmVyaGVhZCA9IDIwOy8vVEtJUDogSVZbNF0gKyBFSVZbNF0gKyBJQ1ZbNF0gKyBNSUNbOF0KKwllbHNlIGlmIChwVHhCbGstPkNpcGhlckFsZyA9PSBDSVBIRVJfQUVTKQorCQlFbmNyeXB0aW9uT3ZlcmhlYWQgPSAxNjsJLy8gQUVTOiBJVls0XSArIEVJVls0XSArIE1JQ1s4XQorCWVsc2UKKwkJRW5jcnlwdGlvbk92ZXJoZWFkID0gMDsKKworCS8vIGRlY2lkZSBob3cgbXVjaCB0aW1lIGFuIEFDSy9DVFMgZnJhbWUgd2lsbCBjb25zdW1lIGluIHRoZSBhaXIKKwlBY2tEdXJhdGlvbiA9IFJUTVBDYWxjRHVyYXRpb24ocEFkLCBwQWQtPkNvbW1vbkNmZy5FeHBlY3RlZEFDS1JhdGVbcFR4QmxrLT5UeFJhdGVdLCAxNCk7CisKKwkvLyBJbml0IHRoZSB0b3RhbCBwYXlsb2FkIGxlbmd0aCBvZiB0aGlzIGZyYW1lLgorCVNyY1JlbWFpbmluZ0J5dGVzID0gcFR4QmxrLT5TcmNCdWZMZW47CisKKwlwVHhCbGstPlRvdGFsRnJhZ051bSA9IDB4ZmY7CisKKwlkbyB7CisKKwkJRnJlZU1wZHVTaXplID0gcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgLSBMRU5HVEhfQ1JDOworCisJCUZyZWVNcGR1U2l6ZSAtPSBwVHhCbGstPk1wZHVIZWFkZXJMZW47CisKKwkJaWYgKFNyY1JlbWFpbmluZ0J5dGVzIDw9IEZyZWVNcGR1U2l6ZSkKKwkJewkvLyB0aGlzIGlzIHRoZSBsYXN0IG9yIG9ubHkgZnJhZ21lbnQKKworCQkJcFR4QmxrLT5TcmNCdWZMZW4gPSBTcmNSZW1haW5pbmdCeXRlczsKKworCQkJcEhlYWRlcl84MDJfMTEtPkZDLk1vcmVGcmFnID0gMDsKKwkJCXBIZWFkZXJfODAyXzExLT5EdXJhdGlvbiA9IHBBZC0+Q29tbW9uQ2ZnLkRzaWZzICsgQWNrRHVyYXRpb247CisKKwkJCS8vIEluZGljYXRlIHRoZSBsb3dlciBsYXllciB0aGF0IHRoaXMncyB0aGUgbGFzdCBmcmFnbWVudC4KKwkJCXBUeEJsay0+VG90YWxGcmFnTnVtID0gZnJhZ051bTsKKwkJfQorCQllbHNlCisJCXsJLy8gbW9yZSBmcmFnbWVudCBpcyByZXF1aXJlZAorCisJCQlwVHhCbGstPlNyY0J1ZkxlbiA9IEZyZWVNcGR1U2l6ZTsKKworCQkJTmV4dE1wZHVTaXplID0gbWluKCgoVUlOVClTcmNSZW1haW5pbmdCeXRlcyAtIHBUeEJsay0+U3JjQnVmTGVuKSwgKChVSU5UKXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkKSk7CisJCQlwSGVhZGVyXzgwMl8xMS0+RkMuTW9yZUZyYWcgPSAxOworCQkJcEhlYWRlcl84MDJfMTEtPkR1cmF0aW9uID0gKDMgKiBwQWQtPkNvbW1vbkNmZy5Ec2lmcykgKyAoMiAqIEFja0R1cmF0aW9uKSArIFJUTVBDYWxjRHVyYXRpb24ocEFkLCBwVHhCbGstPlR4UmF0ZSwgTmV4dE1wZHVTaXplICsgRW5jcnlwdGlvbk92ZXJoZWFkKTsKKwkJfQorCisJCWlmIChmcmFnTnVtID09IDApCisJCQlwVHhCbGstPkZyYW1lR2FwID0gSUZTX0hUVFhPUDsKKwkJZWxzZQorCQkJcFR4QmxrLT5GcmFtZUdhcCA9IElGU19TSUZTOworCisJCVJUTVBXcml0ZVR4V0lfRGF0YShwQWQsIChQVFhXSV9TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSksIHBUeEJsayk7CisKKwkJSEFMX1dyaXRlRnJhZ1R4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYWdOdW0sICZGcmVlTnVtYmVyKTsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQrKzsKKworCQkvLyBVcGRhdGUgdGhlIGZyYW1lIG51bWJlciwgcmVtYWluaW5nIHNpemUgb2YgdGhlIE5ESVMgcGFja2V0IHBheWxvYWQuCisKKwkJLy8gc3BhY2UgZm9yIDgwMi4xMSBoZWFkZXIuCisJCWlmIChmcmFnTnVtID09IDAgJiYgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApCisJCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gLT0gTEVOR1RIXzgwMl8xX0g7CisKKwkJZnJhZ051bSsrOworCQlTcmNSZW1haW5pbmdCeXRlcyAtPSBwVHhCbGstPlNyY0J1ZkxlbjsKKwkJcFR4QmxrLT5wU3JjQnVmRGF0YSArPSBwVHhCbGstPlNyY0J1ZkxlbjsKKworCQlwSGVhZGVyXzgwMl8xMS0+RnJhZysrOwkgLy8gaW5jcmVhc2UgRnJhZyAjCisKKwl9d2hpbGUoU3JjUmVtYWluaW5nQnl0ZXMgPiAwKTsKKworCS8vCisJLy8gS2ljayBvdXQgVHgKKwkvLworCUhBTF9LaWNrT3V0VHgocEFkLCBwVHhCbGssIHBUeEJsay0+UXVlSWR4KTsKK30KKworCisjZGVmaW5lIFJFTEVBU0VfRlJBTUVTX09GX1RYQkxLKF9wQWQsIF9wVHhCbGssIF9wUUVudHJ5LCBfU3RhdHVzKSAJCQkJCQkJCQkJXAorCQl3aGlsZShfcFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZCkJCQkJCQkJCQkJCQkJCVwKKwkJewkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQlfcFFFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZSgmX3BUeEJsay0+VHhQYWNrZXRMaXN0KTsJCQkJCQkJCQlcCisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKF9wQWQsIFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChfcFFFbnRyeSksIF9TdGF0dXMpOwlcCisJCX0KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ29weSBmcmFtZSBmcm9tIHdhaXRpbmcgcXVldWUgaW50byByZWxhdGl2ZSByaW5nIGJ1ZmZlciBhbmQgc2V0CisJYXBwcm9wcmlhdGUgQVNJQyByZWdpc3RlciB0byBraWNrIGhhcmR3YXJlIGVuY3J5cHRpb24gYmVmb3JlIHJlYWxseQorCXNlbnQgb3V0IHRvIGFpci4KKworCUFyZ3VtZW50czoKKwkJcEFkIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCVBORElTX1BBQ0tFVAlQb2ludGVyIHRvIG91dGdvaW5nIE5kaXMgZnJhbWUKKwkJTnVtYmVyT2ZGcmFnCU51bWJlciBvZiBmcmFnbWVudCByZXF1aXJlZAorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUyBTVEFIYXJkVHJhbnNtaXQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVFhfQkxLIAkJCSpwVHhCbGssCisJSU4JVUNIQVIJCQlRdWVJZHgpCit7CisJTkRJU19QQUNLRVQJCSpwUGFja2V0OworCVBRVUVVRV9FTlRSWQlwUUVudHJ5OworCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gU1RFUCAwLiBETyBTQU5JVFkgQ0hFQ0sgQU5EIFNPTUUgRUFSTFkgUFJFUEFSQVRJT04uCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8KKwlBU1NFUlQocFR4QmxrLT5UeFBhY2tldExpc3QuTnVtYmVyKTsKKwlpZiAocFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZCA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgicFR4QmxrLT5Ub3RhbEZyYW1lTnVtID09ICVsZCFcbiIsIHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlcikpOworCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKwlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQpOworCisjaWYgMCAvL2RlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vIFJvZ2VyIHN5bmMgQ2FycmllcgorCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID09IFRSVUUpICYmIChpc0NhcnJpZXJEZXRlY3RFeGlzdChwQWQpID09IFRSVUUpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfSU5GTywoIlNUQUhhcmRUcmFuc21pdCAtLT4gcmFkYXIgZGV0ZWN0IG5vdCBpbiBub3JtYWwgbW9kZSAhISFcbiIpKTsKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBTVEVQIDEuIFdBS0UgVVAgUEhZCisJLy8JCW91dGdvaW5nIGZyYW1lIGFsd2F5cyB3YWtldXAgUEhZIHRvIHByZXZlbnQgZnJhbWUgbG9zdCBhbmQKKwkvLwkJdHVybiBvZmYgUFNNIGJpdCB0byBpbXByb3ZlIHBlcmZvcm1hbmNlCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gbm90IHRvIGNoYW5nZSBQU00gYml0LCBqdXN0IHNlbmQgdGhpcyBmcmFtZSBvdXQ/CisJaWYgKChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpICYmIE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCisJeworCSAgICBEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQXNpY0ZvcmNlV2FrZXVwIEF0IEhhcmRUeFxuIikpOworCQlBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKKwl9CisKKwkvLyBJdCBzaG91bGQgbm90IGNoYW5nZSBQU00gYml0LCB3aGVuIEFQU0QgdHVybiBvbi4KKwlpZiAoKCEocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlKSAmJiAocEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSA9PSBGQUxTRSkpCisJCXx8IChSVE1QX0dFVF9QQUNLRVRfRUFQT0wocFR4QmxrLT5wUGFja2V0KSkKKwkJfHwgKFJUTVBfR0VUX1BBQ0tFVF9XQUkocFR4QmxrLT5wUGFja2V0KSkpCisJeworCQlpZiAoKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkgJiYKKyAgICAgICAgICAgIChwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID09IE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUCkpCisJCQlNbG1lU2V0UHNtQml0KHBBZCwgUFdSX0FDVElWRSk7CisJfQorCisJc3dpdGNoIChwVHhCbGstPlR4RnJhbWVUeXBlKQorCXsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJY2FzZSBUWF9BTVBEVV9GUkFNRToKKwkJCQlTVEFfQU1QRFVfRnJhbWVfVHgocEFkLCBwVHhCbGspOworCQkJYnJlYWs7CisJCWNhc2UgVFhfQU1TRFVfRlJBTUU6CisJCQkJU1RBX0FNU0RVX0ZyYW1lX1R4KHBBZCwgcFR4QmxrKTsKKwkJCWJyZWFrOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQljYXNlIFRYX0xFR0FDWV9GUkFNRToKKwkJCQlTVEFfTGVnYWN5X0ZyYW1lX1R4KHBBZCwgcFR4QmxrKTsKKwkJCWJyZWFrOworCQljYXNlIFRYX01DQVNUX0ZSQU1FOgorCQkJCVNUQV9MZWdhY3lfRnJhbWVfVHgocEFkLCBwVHhCbGspOworCQkJYnJlYWs7CisJCWNhc2UgVFhfUkFMSU5LX0ZSQU1FOgorCQkJCVNUQV9BUmFsaW5rX0ZyYW1lX1R4KHBBZCwgcFR4QmxrKTsKKwkJCWJyZWFrOworCQljYXNlIFRYX0ZSQUdfRlJBTUU6CisJCQkJU1RBX0ZyYWdtZW50X0ZyYW1lX1R4KHBBZCwgcFR4QmxrKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJeworCQkJCS8vIEl0IHNob3VsZCBub3QgaGFwcGVuZWQhCisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2VuZCBhIHBhY2VrdCB3YXMgbm90IGNsYXNzaWZpZWQhISBJdCBzaG91bGQgbm90IGhhcHBlbiFcbiIpKTsKKwkJCQl3aGlsZShwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXIpCisJCQkJeworCQkJCQlwUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7CisJCQkJCXBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocFFFbnRyeSk7CisJCQkJCWlmIChwUGFja2V0KQorCQkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCX0KKworCXJldHVybiAoTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisKK30KKworVUxPTkcgIEhhc2hCeXRlc1BvbHlub21pYWwoVUNIQVIgKnZhbHVlLCB1bnNpZ25lZCBpbnQgbGVuKQoreworICAgdW5zaWduZWQgY2hhciAqd29yZCA9IHZhbHVlOworICAgdW5zaWduZWQgaW50IHJldCA9IDA7CisgICB1bnNpZ25lZCBpbnQgaTsKKworICAgZm9yKGk9MDsgaSA8IGxlbjsgaSsrKQorICAgeworCSAgaW50IG1vZCA9IGkgJSAzMjsKKwkgIHJldCBePSh1bnNpZ25lZCBpbnQpICh3b3JkW2ldKSA8PCBtb2Q7CisJICByZXQgXj0odW5zaWduZWQgaW50KSAod29yZFtpXSkgPj4gKDMyIC0gbW9kKTsKKyAgIH0KKyAgIHJldHVybiByZXQ7Cit9CisKK1ZPSUQgU3RhX0Fubm91bmNlX29yX0ZvcndhcmRfODAyXzNfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJaWYgKFRSVUUKKwkJKQorCXsKKwkJYW5ub3VuY2VfODAyXzNfcGFja2V0KHBBZCwgcFBhY2tldCk7CisJfQorCWVsc2UKKwl7CisJCS8vIHJlbGVhc2UgcGFja2V0CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3Nhbml0eS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvc2FuaXR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM5ODcyNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3Nhbml0eS5jCkBAIC0wLDAgKzEsNDIwIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXNhbml0eS5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSm9obiBDaGFuZyAgMjAwNC0wOS0wMSAgICAgIGFkZCBXTU0gc3VwcG9ydAorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworZXh0ZXJuIFVDSEFSCUNJU0NPX09VSVtdOworCitleHRlcm4gVUNIQVIJV1BBX09VSVtdOworZXh0ZXJuIFVDSEFSCVJTTl9PVUlbXTsKK2V4dGVybiBVQ0hBUglXTUVfSU5GT19FTEVNW107CitleHRlcm4gVUNIQVIJV01FX1BBUk1fRUxFTVtdOworZXh0ZXJuIFVDSEFSCUNjeDJRb3NJbmZvW107CitleHRlcm4gVUNIQVIJUkFMSU5LX09VSVtdOworZXh0ZXJuIFVDSEFSCUJST0FEQ09NX09VSVtdOworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIE1sbWVTdGFydFJlcVNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBDSEFSIFNzaWRbXSwKKyAgICBPVVQgVUNIQVIgKnBTc2lkTGVuKQoreworICAgIE1MTUVfU1RBUlRfUkVRX1NUUlVDVCAqSW5mbzsKKworICAgIEluZm8gPSAoTUxNRV9TVEFSVF9SRVFfU1RSVUNUICopKE1zZyk7CisKKyAgICBpZiAoSW5mby0+U3NpZExlbiA+IE1BWF9MRU5fT0ZfU1NJRCkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTdGFydFJlcVNhbml0eSBmYWlsIC0gd3JvbmcgU1NJRCBsZW5ndGhcbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgICpwU3NpZExlbiA9IEluZm8tPlNzaWRMZW47CisgICAgTmRpc01vdmVNZW1vcnkoU3NpZCwgSW5mby0+U3NpZCwgKnBTc2lkTGVuKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKworICAgIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBQZWVyQXNzb2NSc3BTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqcE1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQWRkcjIsCisgICAgT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAorICAgIE9VVCBVU0hPUlQgKnBTdGF0dXMsCisgICAgT1VUIFVTSE9SVCAqcEFpZCwKKyAgICBPVVQgVUNIQVIgU3VwUmF0ZVtdLAorICAgIE9VVCBVQ0hBUiAqcFN1cFJhdGVMZW4sCisgICAgT1VUIFVDSEFSIEV4dFJhdGVbXSwKKyAgICBPVVQgVUNIQVIgKnBFeHRSYXRlTGVuLAorICAgIE9VVCBIVF9DQVBBQklMSVRZX0lFCQkqcEh0Q2FwYWJpbGl0eSwKKyAgICBPVVQgQUREX0hUX0lORk9fSUUJCSpwQWRkSHRJbmZvLAkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKyAgICBPVVQgVUNIQVIJCQkqcEh0Q2FwYWJpbGl0eUxlbiwKKyAgICBPVVQgVUNIQVIJCQkqcEFkZEh0SW5mb0xlbiwKKyAgICBPVVQgVUNIQVIJCQkqcE5ld0V4dENoYW5uZWxPZmZzZXQsCisgICAgT1VUIFBFRENBX1BBUk0gcEVkY2FQYXJtLAorICAgIE9VVCBVQ0hBUiAqcENraXBGbGFnKQoreworICAgIENIQVIgICAgICAgICAgSWVUeXBlLCAqUHRyOworICAgIFBGUkFNRV84MDJfMTEgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpcE1zZzsKKyAgICBQRUlEX1NUUlVDVCAgIHBFaWQ7CisgICAgVUxPTkcgICAgICAgICBMZW5ndGggPSAwOworCisJKnBOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKKwkqcEh0Q2FwYWJpbGl0eUxlbiA9IDA7CisJKnBBZGRIdEluZm9MZW4gPSAwOworICAgIENPUFlfTUFDX0FERFIocEFkZHIyLCBwRnJhbWUtPkhkci5BZGRyMik7CisgICAgUHRyID0gcEZyYW1lLT5PY3RldDsKKyAgICBMZW5ndGggKz0gTEVOR1RIXzgwMl8xMTsKKworICAgIE5kaXNNb3ZlTWVtb3J5KHBDYXBhYmlsaXR5SW5mbywgJnBGcmFtZS0+T2N0ZXRbMF0sIDIpOworICAgIExlbmd0aCArPSAyOworICAgIE5kaXNNb3ZlTWVtb3J5KHBTdGF0dXMsICAgICAgICAgJnBGcmFtZS0+T2N0ZXRbMl0sIDIpOworICAgIExlbmd0aCArPSAyOworICAgICpwQ2tpcEZsYWcgPSAwOworICAgICpwRXh0UmF0ZUxlbiA9IDA7CisgICAgcEVkY2FQYXJtLT5iVmFsaWQgPSBGQUxTRTsKKworICAgIGlmICgqcFN0YXR1cyAhPSBNTE1FX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiBUUlVFOworCisgICAgTmRpc01vdmVNZW1vcnkocEFpZCwgJnBGcmFtZS0+T2N0ZXRbNF0sIDIpOworICAgIExlbmd0aCArPSAyOworCisgICAgLy8gQWlkIGFscmVhZHkgc3dhcGVkIGJ5dGUgb3JkZXIgaW4gUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKCkgZm9yIGJpZyBlbmRpYW4gcGxhdGZvcm0KKyAgICAqcEFpZCA9ICgqcEFpZCkgJiAweDNmZmY7IC8vIEFJRCBpcyBsb3cgMTQtYml0CisKKyAgICAvLyAtLSBnZXQgc3VwcG9ydGVkIHJhdGVzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIEllVHlwZSA9IHBGcmFtZS0+T2N0ZXRbNl07CisgICAgKnBTdXBSYXRlTGVuID0gcEZyYW1lLT5PY3RldFs3XTsKKyAgICBpZiAoKEllVHlwZSAhPSBJRV9TVVBQX1JBVEVTKSB8fCAoKnBTdXBSYXRlTGVuID4gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckFzc29jUnNwU2FuaXR5IGZhaWwgLSB3cm9uZyBTdXBwb3J0ZWRSYXRlcyBJRVxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgTmRpc01vdmVNZW1vcnkoU3VwUmF0ZSwgJnBGcmFtZS0+T2N0ZXRbOF0sICpwU3VwUmF0ZUxlbik7CisKKyAgICBMZW5ndGggPSBMZW5ndGggKyAyICsgKnBTdXBSYXRlTGVuOworCisgICAgLy8gbWFueSBBUCBpbXBsZW1lbnQgcHJvcHJpZXRhcnkgSUVzIGluIG5vbi1zdGFuZGFyZCBvcmRlciwgd2UnZCBiZXR0ZXIKKyAgICAvLyB0b2xlcmF0ZSBtaXMtb3JkZXJlZCBJRXMgdG8gZ2V0IGJlc3QgY29tcGF0aWJpbGl0eQorICAgIHBFaWQgPSAoUEVJRF9TVFJVQ1QpICZwRnJhbWUtPk9jdGV0WzggKyAoKnBTdXBSYXRlTGVuKV07CisKKyAgICAvLyBnZXQgdmFyaWFibGUgZmllbGRzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIHdoaWxlICgoTGVuZ3RoICsgMiArIHBFaWQtPkxlbikgPD0gTXNnTGVuKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChwRWlkLT5FaWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgSUVfRVhUX1NVUFBfUkFURVM6CisgICAgICAgICAgICAgICAgaWYgKHBFaWQtPkxlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KEV4dFJhdGUsIHBFaWQtPk9jdGV0LCBwRWlkLT5MZW4pOworICAgICAgICAgICAgICAgICAgICAqcEV4dFJhdGVMZW4gPSBwRWlkLT5MZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgY2FzZSBJRV9IVF9DQVA6CisgICAgICAgICAgICBjYXNlIElFX0hUX0NBUDI6CisJCQlpZiAocEVpZC0+TGVuID49IFNJWkVfSFRfQ0FQX0lFKSAgLy9Ob3RlOiBhbGxvdyBleHRlbnNpb24uISEKKwkJCXsKKwkJCQlOZGlzTW92ZU1lbW9yeShwSHRDYXBhYmlsaXR5LCBwRWlkLT5PY3RldCwgU0laRV9IVF9DQVBfSUUpOworCisJCQkJKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSk7CisJCQkJKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSk7CisKKwkJCQkqcEh0Q2FwYWJpbGl0eUxlbiA9IFNJWkVfSFRfQ0FQX0lFOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUGVlckFzc29jUnNwU2FuaXR5IC0gd3JvbmcgSUVfSFRfQ0FQLiBcbiIpKTsKKwkJCX0KKworCQlicmVhazsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICAgICAgICAgIGNhc2UgSUVfQUREX0hUOgorICAgICAgICAgICAgY2FzZSBJRV9BRERfSFQyOgorCQkJaWYgKHBFaWQtPkxlbiA+PSBzaXplb2YoQUREX0hUX0lORk9fSUUpKQorCQkJeworCQkJCS8vIFRoaXMgSUUgYWxsb3dzIGV4dGVuc2lvbiwgYnV0IHdlIGNhbiBpZ25vcmUgZXh0cmEgYnl0ZXMgYmV5b25kIG91ciBrbm93bGVkZ2UgLCBzbyBvbmx5CisJCQkJLy8gY29weSBmaXJzdCBzaXplb2YoQUREX0hUX0lORk9fSUUpCisJCQkJTmRpc01vdmVNZW1vcnkocEFkZEh0SW5mbywgcEVpZC0+T2N0ZXQsIHNpemVvZihBRERfSFRfSU5GT19JRSkpOworCisJCQkJKihVU0hPUlQgKikoJnBBZGRIdEluZm8tPkFkZEh0SW5mbzIpID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBBZGRIdEluZm8tPkFkZEh0SW5mbzIpKTsKKwkJCQkqKFVTSE9SVCAqKSgmcEFkZEh0SW5mby0+QWRkSHRJbmZvMykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEFkZEh0SW5mby0+QWRkSHRJbmZvMykpOworCisJCQkJKnBBZGRIdEluZm9MZW4gPSBTSVpFX0FERF9IVF9JTkZPX0lFOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUGVlckFzc29jUnNwU2FuaXR5IC0gd3JvbmcgSUVfQUREX0hULiBcbiIpKTsKKwkJCX0KKworCQlicmVhazsKKyAgICAgICAgICAgIGNhc2UgSUVfU0VDT05EQVJZX0NIX09GRlNFVDoKKwkJCWlmIChwRWlkLT5MZW4gPT0gMSkKKwkJCXsKKwkJCQkqcE5ld0V4dENoYW5uZWxPZmZzZXQgPSBwRWlkLT5PY3RldFswXTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJBc3NvY1JzcFNhbml0eSAtIHdyb25nIElFX1NFQ09OREFSWV9DSF9PRkZTRVQuIFxuIikpOworCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQlicmVhazsKKyAgICAgICAgICAgIGNhc2UgSUVfQUlST05FVF9DS0lQOgorICAgICAgICAgICAgICAgIC8vIDAuIENoZWNrIEFpcm9uZXQgSUUgbGVuZ3RoLCBpdCBtdXN0IGJlIGxhcmdlciBvciBlcXVhbCB0byAyOAorICAgICAgICAgICAgICAgIC8vICAgIENpc2NvJ3MgQVAgVnhXb3JrIHZlcnNpb24od2lsbCBub3QgYmUgc3VwcG9ydGVkKSB1c2VkIHRoaXMgSUUgbGVuZ3RoIGFzIDI4CisgICAgICAgICAgICAgICAgLy8gICAgQ2lzY28ncyBBUCBJT1MgdmVyc2lvbiB1c2VkIHRoaXMgSUUgbGVuZ3RoIGFzIDMwCisgICAgICAgICAgICAgICAgaWYgKHBFaWQtPkxlbiA8IChDS0lQX05FR09USUFUSU9OX0xFTkdUSCAtIDIpKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgLy8gMS4gQ29weSBDS0lQIGZsYWcgYnl0ZSB0byBidWZmZXIgZm9yIHByb2Nlc3MKKyAgICAgICAgICAgICAgICAqcENraXBGbGFnID0gKihwRWlkLT5PY3RldCArIDgpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIElFX0FJUk9ORVRfSVBBRERSRVNTOgorICAgICAgICAgICAgICAgIGlmIChwRWlkLT5MZW4gIT0gMHgwQSkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIC8vIEdldCBDaXNjbyBBaXJvbmV0IElQIGluZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgQ0lTQ09fT1VJLCAzKSA9PSAxKQorICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5BaXJvbmV0SVBBZGRyZXNzLCBwRWlkLT5PY3RldCArIDQsIDQpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvLyBDQ1gyLCBXTU0gdXNlIHRoZSBzYW1lIElFIHZhbHVlCisgICAgICAgICAgICAvLyBjYXNlIElFX0NDWF9WMjoKKyAgICAgICAgICAgIGNhc2UgSUVfVkVORE9SX1NQRUNJRklDOgorICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBXTUUgUEFSQU1URVIgRUxFTUVOVAorICAgICAgICAgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdNRV9QQVJNX0VMRU0sIDYpICYmIChwRWlkLT5MZW4gPT0gMjQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUFVDSEFSIHB0cjsKKyAgICAgICAgICAgICAgICAgICAgaW50IGk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcGFyc2luZyBFRENBIHBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iVmFsaWQgICAgICAgICAgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJRQWNrICAgICAgICAgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4MTA7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlF1ZXVlUmVxdWVzdCAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHgyMDsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iVHhvcFJlcXVlc3QgICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDQwOworICAgICAgICAgICAgICAgICAgICAvL3BFZGNhUGFybS0+Yk1vcmVEYXRhQWNrICAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHg4MDsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5FZGNhVXBkYXRlQ291bnQgPSBwRWlkLT5PY3RldFs2XSAmIDB4MGY7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFQU0RDYXBhYmxlICAgID0gKHBFaWQtPk9jdGV0WzZdICYgMHg4MCkgPyAxIDogMDsKKyAgICAgICAgICAgICAgICAgICAgcHRyID0gJnBFaWQtPk9jdGV0WzhdOworICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGFjaSA9ICgqcHRyICYgMHg2MCkgPj4gNTsgLy8gYjV+NiBpcyBBQyBJTkRFWAorICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQUNNW2FjaV0gID0gKCgoKnB0cikgJiAweDEwKSA9PSAweDEwKTsgICAvLyBiNSBpcyBBQ00KKyAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+QWlmc25bYWNpXSA9ICgqcHRyKSAmIDB4MGY7ICAgICAgICAgICAgICAgLy8gYjB+MyBpcyBBSUZTTgorICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21pblthY2ldID0gKihwdHIrMSkgJiAweDBmOyAgICAgICAgICAgICAvLyBiMH40IGlzIEN3bWluCisgICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWF4W2FjaV0gPSAqKHB0cisxKSA+PiA0OyAgICAgICAgICAgICAgIC8vIGI1fjggaXMgQ3dtYXgKKyAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+VHhvcFthY2ldICA9ICoocHRyKzIpICsgMjU2ICogKCoocHRyKzMpKTsgLy8gaW4gdW5pdCBvZiAzMi11cworICAgICAgICAgICAgICAgICAgICAgICAgcHRyICs9IDQ7IC8vIHBvaW50IHRvIG5leHQgQUMKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBDQ1ggSUUKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAwLiBDaGVjayB0aGUgc2l6ZSBhbmQgQ0NYIGFkbWluIGNvbnRyb2wKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLkNDWENvbnRyb2wuZmllbGQuRW5hYmxlID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBFaWQtPkxlbiAhPSA1KQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVHVybiBDQ1gyIGlmIG1hdGNoZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgQ2N4MkllSW5mbywgNSkgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkNDWEVuYWJsZSA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQXNzb2NSc3BTYW5pdHkgLSBpZ25vcmUgdW5yZWNvZ25pemVkIEVJRCA9ICVkXG4iLCBwRWlkLT5FaWQpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIExlbmd0aCA9IExlbmd0aCArIDIgKyBwRWlkLT5MZW47CisgICAgICAgIHBFaWQgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopcEVpZCArIDIgKyBwRWlkLT5MZW4pOworICAgIH0KKworICAgIC8vIEZvcmNlIENDWDIgZW5hYmxlIHRvIFRSVUUgZm9yIHRob3NlIEFQIGRpZG4ndCByZXBsYXkgQ0NYIHYyIElFLCB3ZSBzdGlsbCBmb3JjZSBpdCB0byBiZSBvbgorICAgIGlmIChwQWQtPlN0YUNmZy5DQ1hDb250cm9sLmZpZWxkLkVuYWJsZSA9PSAxKQorICAgICAgICBwQWQtPlN0YUNmZy5DQ1hFbmFibGUgPSBUUlVFOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjaworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIFBlZXJQcm9iZVJlcVNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcEFkZHIyLAorICAgIE9VVCBDSEFSIFNzaWRbXSwKKyAgICBPVVQgVUNIQVIgKnBTc2lkTGVuKQoreworICAgIFVDSEFSICAgICAgICAgSWR4OworICAgIFVDSEFSCSAgICAgIFJhdGVMZW47CisgICAgQ0hBUiAgICAgICAgICBJZVR5cGU7CisgICAgUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlNc2c7CisKKyAgICBDT1BZX01BQ19BRERSKHBBZGRyMiwgcEZyYW1lLT5IZHIuQWRkcjIpOworCisgICAgaWYgKChwRnJhbWUtPk9jdGV0WzBdICE9IElFX1NTSUQpIHx8IChwRnJhbWUtPk9jdGV0WzFdID4gTUFYX0xFTl9PRl9TU0lEKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJQcm9iZVJlcVNhbml0eSBmYWlsIC0gd3JvbmcgU1NJRCBJRShUeXBlPSVkLExlbj0lZClcbiIscEZyYW1lLT5PY3RldFswXSxwRnJhbWUtPk9jdGV0WzFdKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAqcFNzaWRMZW4gPSBwRnJhbWUtPk9jdGV0WzFdOworICAgIE5kaXNNb3ZlTWVtb3J5KFNzaWQsICZwRnJhbWUtPk9jdGV0WzJdLCAqcFNzaWRMZW4pOworCisgICAgSWR4ID0gKnBTc2lkTGVuICsgMjsKKworICAgIC8vIC0tIGdldCBzdXBwb3J0ZWQgcmF0ZXMgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisgICAgSWVUeXBlID0gcEZyYW1lLT5PY3RldFtJZHhdOworICAgIFJhdGVMZW4gPSBwRnJhbWUtPk9jdGV0W0lkeCArIDFdOworICAgIGlmIChJZVR5cGUgIT0gSUVfU1VQUF9SQVRFUykKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJQcm9iZVJlcVNhbml0eSBmYWlsIC0gd3JvbmcgU3VwcG9ydFJhdGVzIElFKFR5cGU9JWQsTGVuPSVkKVxuIixwRnJhbWUtPk9jdGV0W0lkeF0scEZyYW1lLT5PY3RldFtJZHgrMV0pKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExRykgJiYgKFJhdGVMZW4gPCA4KSkKKyAgICAgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gR2V0VGltQml0KAorICAgIElOIENIQVIgKlB0ciwKKyAgICBJTiBVU0hPUlQgQWlkLAorICAgIE9VVCBVQ0hBUiAqVGltTGVuLAorICAgIE9VVCBVQ0hBUiAqQmNhc3RGbGFnLAorICAgIE9VVCBVQ0hBUiAqRHRpbUNvdW50LAorICAgIE9VVCBVQ0hBUiAqRHRpbVBlcmlvZCwKKyAgICBPVVQgVUNIQVIgKk1lc3NhZ2VUb01lKQoreworICAgIFVDSEFSICAgICAgICAgIEJpdENudGwsIE4xLCBOMiwgTXlCeXRlLCBNeUJpdDsKKyAgICBDSEFSICAgICAgICAgICpJZHhQdHI7CisKKyAgICBJZHhQdHIgPSBQdHI7CisKKyAgICBJZHhQdHIgKys7CisgICAgKlRpbUxlbiA9ICpJZHhQdHI7CisKKyAgICAvLyBnZXQgRFRJTSBDb3VudCBmcm9tIFRJTSBlbGVtZW50CisgICAgSWR4UHRyICsrOworICAgICpEdGltQ291bnQgPSAqSWR4UHRyOworCisgICAgLy8gZ2V0IERUSU0gUGVyaW9kIGZyb20gVElNIGVsZW1lbnQKKyAgICBJZHhQdHIrKzsKKyAgICAqRHRpbVBlcmlvZCA9ICpJZHhQdHI7CisKKyAgICAvLyBnZXQgQml0bWFwIENvbnRyb2wgZnJvbSBUSU0gZWxlbWVudAorICAgIElkeFB0cisrOworICAgIEJpdENudGwgPSAqSWR4UHRyOworCisgICAgaWYgKCgqRHRpbUNvdW50ID09IDApICYmIChCaXRDbnRsICYgMHgwMSkpCisgICAgICAgICpCY2FzdEZsYWcgPSBUUlVFOworICAgIGVsc2UKKyAgICAgICAgKkJjYXN0RmxhZyA9IEZBTFNFOworCisgICAgLy8gUGFyc2UgUGFydGlhbCBWaXJ0dWFsIEJpdG1hcCBmcm9tIFRJTSBlbGVtZW50CisgICAgTjEgPSBCaXRDbnRsICYgMHhmZTsgICAgLy8gTjEgaXMgdGhlIGZpcnN0IGJpdG1hcCBieXRlIworICAgIE4yID0gKlRpbUxlbiAtIDQgKyBOMTsgIC8vIE4yIGlzIHRoZSBsYXN0IGJpdG1hcCBieXRlIworCisgICAgaWYgKChBaWQgPCAoTjEgPDwgMykpIHx8IChBaWQgPj0gKChOMiArIDEpIDw8IDMpKSkKKyAgICAgICAgKk1lc3NhZ2VUb01lID0gRkFMU0U7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgTXlCeXRlID0gKEFpZCA+PiAzKSAtIE4xOyAgICAgICAgICAgICAgICAgICAgICAgLy8gbXkgYnl0ZSBwb3NpdGlvbiBpbiB0aGUgYml0bWFwIGJ5dGUtc3RyZWFtCisgICAgICAgIE15Qml0ID0gQWlkICUgMTYgLSAoKE15Qnl0ZSAmIDB4MDEpPyA4OjApOworCisgICAgICAgIElkeFB0ciArPSAoTXlCeXRlICsgMSk7CisKKyAgICAgICAgLy9pZiAoKklkeFB0cikKKyAgICAgICAgLy8gICAgREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJUSU0gYml0bWFwID0gMHglMDJ4XG4iLCAqSWR4UHRyKSk7CisKKyAgICAgICAgaWYgKCpJZHhQdHIgJiAoMHgwMSA8PCBNeUJpdCkpCisgICAgICAgICAgICAqTWVzc2FnZVRvTWUgPSBUUlVFOworICAgICAgICBlbHNlCisgICAgICAgICAgICAqTWVzc2FnZVRvTWUgPSBGQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvc3luYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvc3luYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxOTZmODUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9zeW5jLmMKQEAgLTAsMCArMSwxOTU5IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXN5bmMuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUpvaG4gQ2hhbmcJMjAwNC0wOS0wMSAgICAgIG1vZGlmaWVkIGZvciBydDI1NjEvMjY2MQorCUphbiBMZWUJCTIwMDYtMDgtMDEgICAgICBtb2RpZmllZCBmb3IgcnQyODYwIGZvciA4MDIuMTFuCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisjZGVmaW5lIEFDMF9ERUZfVFhPUAkJMAorI2RlZmluZSBBQzFfREVGX1RYT1AJCTAKKyNkZWZpbmUgQUMyX0RFRl9UWE9QCQk5NAorI2RlZmluZSBBQzNfREVGX1RYT1AJCTQ3CisKK1ZPSUQJQWRob2NUdXJuT25Rb3MoCisJSU4gIFBSVE1QX0FEQVBURVIgcEFkKQoreworCS8vIFR1cm4gb24gUU9zIGlmIHVzZSBIVCByYXRlLgorCWlmIChwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJWYWxpZCA9PSBGQUxTRSkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYlZhbGlkID0gVFJVRTsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblswXSA9IDM7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQWlmc25bMV0gPSA3OworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkFpZnNuWzJdID0gMTsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblszXSA9IDE7CisKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21pblswXSA9IDQ7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtaW5bMV0gPSA0OworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWluWzJdID0gMzsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21pblszXSA9IDI7CisKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFswXSA9IDEwOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWF4WzFdID0gNjsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFsyXSA9IDQ7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbM10gPSAzOworCisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFswXSAgPSAwOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbMV0gID0gMDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzJdICA9IEFDMl9ERUZfVFhPUDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzNdICA9IEFDM19ERUZfVFhPUDsKKwl9CisJQXNpY1NldEVkY2FQYXJtKHBBZCwgJnBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0pOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoZSBzeW5jIHN0YXRlIG1hY2hpbmUsCisJUGFyYW1ldGVyczoKKwkJU20gLSBwb2ludGVyIHRvIHRoZSBzdGF0ZSBtYWNoaW5lCisJTm90ZToKKwkJdGhlIHN0YXRlIG1hY2hpbmUgbG9va3MgbGlrZSB0aGUgZm9sbG93aW5nCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFN5bmNTdGF0ZU1hY2hpbmVJbml0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFNUQVRFX01BQ0hJTkUgKlNtLAorCU9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKK3sKKwlTdGF0ZU1hY2hpbmVJbml0KFNtLCBUcmFucywgTUFYX1NZTkNfU1RBVEUsIE1BWF9TWU5DX01TRywgKFNUQVRFX01BQ0hJTkVfRlVOQylEcm9wLCBTWU5DX0lETEUsIFNZTkNfTUFDSElORV9CQVNFKTsKKworCS8vIGNvbHVtbiAxCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTWU5DX0lETEUsIE1UMl9NTE1FX1NDQU5fUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVTY2FuUmVxQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNZTkNfSURMRSwgTVQyX01MTUVfSk9JTl9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZUpvaW5SZXFBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU1lOQ19JRExFLCBNVDJfTUxNRV9TVEFSVF9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZVN0YXJ0UmVxQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNZTkNfSURMRSwgTVQyX1BFRVJfQkVBQ09OLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJCZWFjb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU1lOQ19JRExFLCBNVDJfUEVFUl9QUk9CRV9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlclByb2JlUmVxQWN0aW9uKTsKKworCS8vY29sdW1uIDIKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEpPSU5fV0FJVF9CRUFDT04sIE1UMl9NTE1FX1NDQU5fUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5TY2FuKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEpPSU5fV0FJVF9CRUFDT04sIE1UMl9NTE1FX0pPSU5fUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5Kb2luKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEpPSU5fV0FJVF9CRUFDT04sIE1UMl9NTE1FX1NUQVJUX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuU3RhcnQpOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgSk9JTl9XQUlUX0JFQUNPTiwgTVQyX1BFRVJfQkVBQ09OLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJCZWFjb25BdEpvaW5BY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgSk9JTl9XQUlUX0JFQUNPTiwgTVQyX0JFQUNPTl9USU1FT1VULCAoU1RBVEVfTUFDSElORV9GVU5DKUJlYWNvblRpbWVvdXRBdEpvaW5BY3Rpb24pOworCisJLy8gY29sdW1uIDMKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNDQU5fTElTVEVOLCBNVDJfTUxNRV9TQ0FOX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuU2Nhbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTQ0FOX0xJU1RFTiwgTVQyX01MTUVfSk9JTl9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkpvaW4pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU0NBTl9MSVNURU4sIE1UMl9NTE1FX1NUQVJUX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuU3RhcnQpOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU0NBTl9MSVNURU4sIE1UMl9QRUVSX0JFQUNPTiwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQmVhY29uQXRTY2FuQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNDQU5fTElTVEVOLCBNVDJfUEVFUl9QUk9CRV9SU1AsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckJlYWNvbkF0U2NhbkFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTQ0FOX0xJU1RFTiwgTVQyX1NDQU5fVElNRU9VVCwgKFNUQVRFX01BQ0hJTkVfRlVOQylTY2FuVGltZW91dEFjdGlvbik7CisKKwkvLyB0aW1lciBpbml0CisJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihCZWFjb25UaW1lb3V0KSwgcEFkLCBGQUxTRSk7CisJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oU2NhblRpbWVvdXQpLCBwQWQsIEZBTFNFKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlCZWFjb24gdGltZW91dCBoYW5kbGVyLCBleGVjdXRlZCBpbiB0aW1lciB0aHJlYWQKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBCZWFjb25UaW1lb3V0KAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKwlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNZTkMgLSBCZWFjb25UaW1lb3V0XG4iKSk7CisKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKQorCQlyZXR1cm47CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkKKwkJKQorCXsKKwkJVUNIQVIgICAgICAgIEJCUFZhbHVlID0gMDsKKwkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOworCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKKwkJQkJQVmFsdWUgJj0gKH4weDE4KTsKKwkJQkJQVmFsdWUgfD0gMHgxMDsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gRW5kIG9mIFNDQU4sIHJlc3RvcmUgdG8gNDBNSHogY2hhbm5lbCAlZCwgVG90YWwgQlNTWyUwMmRdXG4iLHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBwQWQtPlNjYW5UYWIuQnNzTnIpKTsKKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX0JFQUNPTl9USU1FT1VULCAwLCBOVUxMKTsKKwlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJU2NhbiB0aW1lb3V0IGhhbmRsZXIsIGV4ZWN1dGVkIGluIHRpbWVyIHRocmVhZAorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFNjYW5UaW1lb3V0KAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKwlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisKKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpCisJCXJldHVybjsKKworCWlmIChNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX1NDQU5fVElNRU9VVCwgMCwgTlVMTCkpCisJeworCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisJfQorCWVsc2UKKwl7CisJCS8vIFRvIHByZXZlbnQgU3luY01hY2hpbmUuQ3VyclN0YXRlIGlzIFNDQU5fTElTVEVOIGZvcmV2ZXIuCisJCXBBZC0+TWxtZUF1eC5DaGFubmVsID0gMDsKKwkJU2Nhbk5leHRDaGFubmVsKHBBZCk7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJeworCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfU0NBTl9FTlFVRVVFX0ZBSUxfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKwkJfQorCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlNTE1FIFNDQU4gcmVxIHN0YXRlIG1hY2hpbmUgcHJvY2VkdXJlCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lU2NhblJlcUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVUNIQVIgICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdLCBTc2lkTGVuLCBTY2FuVHlwZSwgQnNzVHlwZSwgQkJQVmFsdWUgPSAwOworCUJPT0xFQU4gICAgICAgIFRpbWVyQ2FuY2VsbGVkOworCVVMT05HCQkgICBOb3c7CisJVVNIT1JUICAgICAgICAgU3RhdHVzOworCVBIRUFERVJfODAyXzExIHBIZHI4MDIxMTsKKwlQVUNIQVIgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUyAgICBOU3RhdHVzOworCisJLy8gQ2hlY2sgdGhlIHRvdGFsIHNjYW4gdHJpZXMgZm9yIG9uZSBzaW5nbGUgT0lEIGNvbW1hbmQKKwkvLyBJZiB0aGlzIGlzIHRoZSBDQ1ggMi4wIENhc2UsIHNraXAgdGhhdCEKKwlpZiAoICFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfU1RBUlRfVVApKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIE1sbWVTY2FuUmVxQWN0aW9uIGJlZm9yZSBTdGFydHVwXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwkvLyBJbmNyZWFzZSB0aGUgc2NhbiByZXRyeSBjb3VudGVycy4KKwlwQWQtPlN0YUNmZy5TY2FuQ250Kys7CisKKyNpZmRlZiBSVDI4NjAKKyAgICBpZiAoKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkgJiYKKyAgICAgICAgKElETEVfT04ocEFkKSkgJiYKKwkJKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBUUlVFKSAmJgorCQkoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKSkpCisJeworCQlSVDI4eHhQY2lBc2ljUmFkaW9PbihwQWQsIEdVSV9JRExFX1BPV0VSX1NBVkUpOworCX0KKyNlbmRpZiAvLyBSVDI4NjAgLy8KKworCS8vIGZpcnN0IGNoZWNrIHRoZSBwYXJhbWV0ZXIgc2FuaXR5CisJaWYgKE1sbWVTY2FuUmVxU2FuaXR5KHBBZCwKKwkJCQkJCSAgRWxlbS0+TXNnLAorCQkJCQkJICBFbGVtLT5Nc2dMZW4sCisJCQkJCQkgICZCc3NUeXBlLAorCQkJCQkJICBTc2lkLAorCQkJCQkJICAmU3NpZExlbiwKKwkJCQkJCSAgJlNjYW5UeXBlKSkKKwl7CisKKwkJLy8gQ2hlY2sgZm9yIGNoYW5uZWwgbG9hZCBhbmQgbm9pc2UgaGlzdCByZXF1ZXN0CisJCS8vIFN1c3BlbmQgTVNEVSBvbmx5IGF0IHNjYW4gcmVxdWVzdCwgbm90IHRoZSBsYXN0IHR3byBtZW50aW9uZWQKKwkJaWYgKChTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX05PSVNFKSB8fCAoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19DSEFOTkVMX0xPQUQpKQorCQl7CisJCQlpZiAocEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWwgIT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwkJCQlSVE1QU3VzcGVuZE1zZHVUcmFuc21pc3Npb24ocEFkKTsJCQkvLyBTdXNwZW5kIE1TRFUgdHJhbnNtaXNzaW9uIGhlcmUKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIFN1c3BlbmQgTVNEVSB0cmFuc21pc3Npb24gaGVyZQorCQkJUlRNUFN1c3BlbmRNc2R1VHJhbnNtaXNzaW9uKHBBZCk7CisJCX0KKworCQkvLworCQkvLyBUbyBwcmV2ZW50IGRhdGEgbG9zdC4KKwkJLy8gU2VuZCBhbiBOVUxMIGRhdGEgd2l0aCB0dXJuZWQgUFNNIGJpdCBvbiB0byBjdXJyZW50IGFzc29jaWF0ZWQgQVAgYmVmb3JlIFNDQU4gcHJvZ3Jlc3MuCisJCS8vIEFuZCBzaG91bGQgc2VuZCBhbiBOVUxMIGRhdGEgd2l0aCB0dXJuZWQgUFNNIGJpdCBvZmYgdG8gQVAsIHdoZW4gc2NhbiBwcm9ncmVzcyBkb25lCisJCS8vCisJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkgJiYgKElORlJBX09OKHBBZCkpKQorCQl7CisJCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsKKwkJCWlmIChOU3RhdHVzCT09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQl7CisJCQkJcEhkcjgwMjExID0gKFBIRUFERVJfODAyXzExKSBwT3V0QnVmZmVyOworCQkJCU1ndE1hY0hlYWRlckluaXQocEFkLCBwSGRyODAyMTEsIFNVQlRZUEVfTlVMTF9GVU5DLCAxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJCXBIZHI4MDIxMS0+RHVyYXRpb24gPSAwOworCQkJCXBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX0RBVEE7CisJCQkJcEhkcjgwMjExLT5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7CisKKwkJCQkvLyBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCisJCQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTY2FuUmVxQWN0aW9uIC0tIFNlbmQgUFNNIERhdGEgZnJhbWUgZm9yIG9mZiBjaGFubmVsIFJNXG4iKSk7CisJCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJCQlSVE1QdXNlY0RlbGF5KDUwMDApOworCQkJfQorCQl9CisKKwkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKKwkJcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gTm93OworCQkvLyByZXNldCBhbGwgdGhlIHRpbWVycworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5CZWFjb25UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCisJCS8vIHJlY29yZCBkZXNpcmVkIEJTUyBwYXJhbWV0ZXJzCisJCXBBZC0+TWxtZUF1eC5Cc3NUeXBlID0gQnNzVHlwZTsKKwkJcEFkLT5NbG1lQXV4LlNjYW5UeXBlID0gU2NhblR5cGU7CisJCXBBZC0+TWxtZUF1eC5Tc2lkTGVuID0gU3NpZExlbjsKKyAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBTc2lkLCBTc2lkTGVuKTsKKworCQkvLyBzdGFydCBmcm9tIHRoZSBmaXJzdCBjaGFubmVsCisJCXBBZC0+TWxtZUF1eC5DaGFubmVsID0gRmlyc3RDaGFubmVsKHBBZCk7CisKKwkJLy8gQ2hhbmdlIHRoZSBzY2FuIGNoYW5uZWwgd2hlbiBkZWFsaW5nIHdpdGggQ0NYIGJlYWNvbiByZXBvcnQKKwkJaWYgKChTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX1BBU1NJVkUpIHx8IChTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX0FDVElWRSkgfHwKKwkJCShTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX0NIQU5ORUxfTE9BRCkgfHwgKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fTk9JU0UpKQorCQkJcEFkLT5NbG1lQXV4LkNoYW5uZWwgPSBwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbDsKKworCQkvLyBMZXQgQkJQIHJlZ2lzdGVyIGF0IDIwTUh6IHRvIGRvIHNjYW4KKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOworCQlCQlBWYWx1ZSAmPSAofjB4MTgpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBCQlAgUjQgdG8gMjBNSHoubFxuIikpOworCQlTY2FuTmV4dENoYW5uZWwocEFkKTsKKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlRfRVJSKCgiU1lOQyAtIE1sbWVTY2FuUmVxQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKKwkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKKwkJU3RhdHVzID0gTUxNRV9JTlZBTElEX0ZPUk1BVDsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NDQU5fQ09ORiwgMiwgJlN0YXR1cyk7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCU1MTUUgSk9JTiByZXEgc3RhdGUgbWFjaGluZSBwcm9jZWR1cmUKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVKb2luUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUiAgICAgICAgQkJQVmFsdWUgPSAwOworCUJTU19FTlRSWSAgICAqcEJzczsKKwlCT09MRUFOICAgICAgIFRpbWVyQ2FuY2VsbGVkOworCUhFQURFUl84MDJfMTEgSGRyODAyMTE7CisJTkRJU19TVEFUVVMgICBOU3RhdHVzOworCVVMT05HICAgICAgICAgRnJhbWVMZW4gPSAwOworCVBVQ0hBUiAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJUFVDSEFSICAgICAgICBwU3VwUmF0ZSA9IE5VTEw7CisJVUNIQVIgICAgICAgICBTdXBSYXRlTGVuOworCVBVQ0hBUiAgICAgICAgcEV4dFJhdGUgPSBOVUxMOworCVVDSEFSICAgICAgICAgRXh0UmF0ZUxlbjsKKwlVQ0hBUiAgICAgICAgIEFTdXBSYXRlW10gPSB7MHg4QywgMHgxMiwgMHg5OCwgMHgyNCwgMHhiMCwgMHg0OCwgMHg2MCwgMHg2Q307CisJVUNIQVIgICAgICAgICBBU3VwUmF0ZUxlbiA9IHNpemVvZihBU3VwUmF0ZSkvc2l6ZW9mKFVDSEFSKTsKKwlNTE1FX0pPSU5fUkVRX1NUUlVDVCAqcEluZm8gPSAoTUxNRV9KT0lOX1JFUV9TVFJVQ1QgKikoRWxlbS0+TXNnKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBNbG1lSm9pblJlcUFjdGlvbihCU1MgIyVsZClcbiIsIHBJbmZvLT5Cc3NJZHgpKTsKKworI2lmZGVmIFJUMjg2MAorICAgIGlmICgoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpKSAmJgorICAgICAgICAoSURMRV9PTihwQWQpKSAmJgorCQkocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpICYmCisJCShSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpKSkKKwl7CisJCVJUMjh4eFBjaUFzaWNSYWRpb09uKHBBZCwgR1VJX0lETEVfUE9XRVJfU0FWRSk7CisJfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCisJLy8gcmVzZXQgYWxsIHRoZSB0aW1lcnMKKwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisKKwlwQnNzID0gJnBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W3BJbmZvLT5Cc3NJZHhdOworCisJLy8gcmVjb3JkIHRoZSBkZXNpcmVkIFNTSUQgJiBCU1NJRCB3ZSdyZSB3YWl0aW5nIGZvcgorCUNPUFlfTUFDX0FERFIocEFkLT5NbG1lQXV4LkJzc2lkLCBwQnNzLT5Cc3NpZCk7CisKKwkvLyBJZiBBUCdzIFNTSUQgaXMgbm90IGhpZGRlbiwgaXQgaXMgT0sgZm9yIHVwZGF0aW5nIHNzaWQgdG8gTWxtZUF1eCBhZ2Fpbi4KKwlpZiAocEJzcy0+SGlkZGVuID09IDApCisJeworCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgcEJzcy0+U3NpZCwgcEJzcy0+U3NpZExlbik7CisJCXBBZC0+TWxtZUF1eC5Tc2lkTGVuID0gcEJzcy0+U3NpZExlbjsKKwl9CisKKwlwQWQtPk1sbWVBdXguQnNzVHlwZSA9IHBCc3MtPkJzc1R5cGU7CisJcEFkLT5NbG1lQXV4LkNoYW5uZWwgPSBwQnNzLT5DaGFubmVsOworCXBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCA9IHBCc3MtPkNlbnRyYWxDaGFubmVsOworCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCS8vIENvdW50cnkgSUUgb2YgdGhlIEFQIHdpbGwgYmUgZXZhbHVhdGVkIGFuZCB3aWxsIGJlIHVzZWQuCisJaWYgKChwQWQtPlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSAhPSBSdDgwMl8xMV9EX05vbmUpICYmCisJCShwQnNzLT5iSGFzQ291bnRyeUlFID09IFRSVUUpKQorCXsKKwkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlWzBdLCAmcEJzcy0+Q291bnRyeVN0cmluZ1swXSwgMik7CisJCWlmIChwQnNzLT5Db3VudHJ5U3RyaW5nWzJdID09ICdJJykKKwkJCXBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSA9IElET1I7CisJCWVsc2UgaWYgKHBCc3MtPkNvdW50cnlTdHJpbmdbMl0gPT0gJ08nKQorCQkJcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5ID0gT0RPUjsKKwkJZWxzZQorCQkJcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5ID0gQk9USDsKKwkJQnVpbGRDaGFubmVsTGlzdEV4KHBBZCk7CisJfQorI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKworCS8vIExldCBCQlAgcmVnaXN0ZXIgYXQgMjBNSHogdG8gZG8gc2NhbgorCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKKwlCQlBWYWx1ZSAmPSAofjB4MTgpOworCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gQkJQIFI0IHRvIDIwTUh6LmxcbiIpKTsKKworCS8vIHN3aXRjaCBjaGFubmVsIGFuZCB3YWl0aW5nIGZvciBiZWFjb24gdGltZXIKKwlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsLCBGQUxTRSk7CisJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpOworCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLCBKT0lOX1RJTUVPVVQpOworCisgICAgZG8KKwl7CisJCWlmICgoKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpICYmCisgICAgICAgICAgICAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPiAxNCkgJiYKKyAgICAgICAgICAgICBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsKSkKKyNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vIFJvZ2VyIHN5bmMgQ2FycmllcgorICAgICAgICAgICAgIHx8IChwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9PSBUUlVFKQorI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICkKKwkJeworCQkJLy8KKwkJCS8vIFdlIGNhbid0IHNlbmQgYW55IFByb2JlIHJlcXVlc3QgZnJhbWUgdG8gbWVldCA4MDIuMTFoLgorCQkJLy8KKwkJCWlmIChwQnNzLT5IaWRkZW4gPT0gMCkKKwkJCQlicmVhazsKKwkJfQorCisJCS8vCisJCS8vIHNlbmQgcHJvYmUgcmVxdWVzdAorCQkvLworCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOworCQlpZiAoTlN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQlpZiAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPD0gMTQpCisJCQl7CisJCQkJcFN1cFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlOworCQkJCVN1cFJhdGVMZW4gPSBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuOworCQkJCXBFeHRSYXRlID0gcEFkLT5Db21tb25DZmcuRXh0UmF0ZTsKKwkJCQlFeHRSYXRlTGVuID0gcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLworCQkJCS8vIE92ZXJ3cml0ZSBTdXBwb3J0IFJhdGUsIENDSyByYXRlIGFyZSBub3QgYWxsb3dlZAorCQkJCS8vCisJCQkJcFN1cFJhdGUgPSBBU3VwUmF0ZTsKKwkJCQlTdXBSYXRlTGVuID0gQVN1cFJhdGVMZW47CisJCQkJRXh0UmF0ZUxlbiA9IDA7CisJCQl9CisKKwkJCWlmIChwQWQtPk1sbWVBdXguQnNzVHlwZSA9PSBCU1NfSU5GUkEpCisJCQkJTWd0TWFjSGVhZGVySW5pdChwQWQsICZIZHI4MDIxMSwgU1VCVFlQRV9QUk9CRV9SRVEsIDAsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgcEFkLT5NbG1lQXV4LkJzc2lkKTsKKwkJCWVsc2UKKwkJCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkhkcjgwMjExLCBTVUJUWVBFX1BST0JFX1JFUSwgMCwgQlJPQURDQVNUX0FERFIsIEJST0FEQ0FTVF9BRERSKTsKKworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAmRnJhbWVMZW4sCisJCQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksICAgICZIZHI4MDIxMSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRJZSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+TWxtZUF1eC5Tc2lkTGVuLAorCQkJCQkJCSAgcEFkLT5NbG1lQXV4LlNzaWRMZW4sCSAgICBwQWQtPk1sbWVBdXguU3NpZCwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlN1cFJhdGVJZSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlN1cFJhdGVMZW4sCisJCQkJCQkJICBTdXBSYXRlTGVuLCAgICAgICAgICAgICAgIHBTdXBSYXRlLAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCisJCQlpZiAoRXh0UmF0ZUxlbikKKwkJCXsKKwkJCQlVTE9ORyBUbXA7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAgICZUbXAsCisJCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlSWUsCisJCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlTGVuLAorCQkJCQkJCQkgIEV4dFJhdGVMZW4sICAgICAgICAgICAgICAgICAgICAgICBwRXh0UmF0ZSwKKwkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQkJRnJhbWVMZW4gKz0gVG1wOworCQkJfQorCisKKwkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJfQorICAgIH0gd2hpbGUgKEZBTFNFKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBTd2l0Y2ggdG8gY2ggJWQsIFdhaXQgQkVBQ09OIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCXBCc3MtPkNoYW5uZWwsIHBCc3MtPkJzc2lkWzBdLCBwQnNzLT5Cc3NpZFsxXSwgcEJzcy0+QnNzaWRbMl0sIHBCc3MtPkJzc2lkWzNdLCBwQnNzLT5Cc3NpZFs0XSwgcEJzcy0+QnNzaWRbNV0pKTsKKworCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBKT0lOX1dBSVRfQkVBQ09OOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCU1MTUUgU1RBUlQgUmVxdWVzdCBzdGF0ZSBtYWNoaW5lIHByb2NlZHVyZSwgc3RhcnRpbmcgYW4gSUJTUworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZVN0YXJ0UmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUiAgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXSwgU3NpZExlbjsKKwlCT09MRUFOICAgICAgIFRpbWVyQ2FuY2VsbGVkOworCisJLy8gTmV3IGZvciBXUEEgc2VjdXJpdHkgc3VpdGVzCisJVUNIQVIJCQkJCQlWYXJJRVtNQVhfVklFX0xFTl07IAkvLyBUb3RhbCBWSUUgbGVuZ3RoID0gTUFYX1ZJRV9MRU4gLSAtNQorCU5ESVNfODAyXzExX1ZBUklBQkxFX0lFcwkqcFZJRSA9IE5VTEw7CisJTEFSR0VfSU5URUdFUgkJCQlUaW1lU3RhbXA7CisJQk9PTEVBTiBQcml2YWN5OworCVVTSE9SVCBTdGF0dXM7CisKKwkvLyBJbml0IFZhcmlhYmxlIElFIHN0cnVjdHVyZQorCXBWSUUgPSAoUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcykgVmFySUU7CisJcFZJRS0+TGVuZ3RoID0gMDsKKwlUaW1lU3RhbXAudS5Mb3dQYXJ0ICA9IDA7CisJVGltZVN0YW1wLnUuSGlnaFBhcnQgPSAwOworCisJaWYgKE1sbWVTdGFydFJlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBTc2lkLCAmU3NpZExlbikpCisJeworCQkvLyByZXNldCBhbGwgdGhlIHRpbWVycworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCisJCS8vCisJCS8vIFN0YXJ0IGEgbmV3IElCU1MuIEFsbCBJQlNTIHBhcmFtZXRlcnMgYXJlIGRlY2lkZWQgbm93Li4uLgorCQkvLworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lU3RhcnRSZXFBY3Rpb24gLSBTdGFydCBhIG5ldyBJQlNTLiBBbGwgSUJTUyBwYXJhbWV0ZXJzIGFyZSBkZWNpZGVkIG5vdy4uLi4gXG4iKSk7CisJCXBBZC0+TWxtZUF1eC5Cc3NUeXBlICAgICAgICAgICA9IEJTU19BREhPQzsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIFNzaWQsIFNzaWRMZW4pOworCQlwQWQtPk1sbWVBdXguU3NpZExlbiAgICAgICAgICAgPSBTc2lkTGVuOworCisJCS8vIGdlbmVyYXRlIGEgcmFkb20gbnVtYmVyIGFzIEJTU0lECisJCU1hY0FkZHJSYW5kb21Cc3NpZChwQWQsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTdGFydFJlcUFjdGlvbiAtIGdlbmVyYXRlIGEgcmFkb20gbnVtYmVyIGFzIEJTU0lEIFxuIikpOworCisJCVByaXZhY3kgPSAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpIHx8CisJCQkJICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpIHx8CisJCQkJICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpOworCQlwQWQtPk1sbWVBdXguQ2FwYWJpbGl0eUluZm8gICAgPSBDQVBfR0VORVJBVEUoMCwxLFByaXZhY3ksIChwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVTaG9ydCksIDEsIDApOworCQlwQWQtPk1sbWVBdXguQmVhY29uUGVyaW9kICAgICAgPSBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2Q7CisJCXBBZC0+TWxtZUF1eC5BdGltV2luICAgICAgICAgICA9IHBBZC0+U3RhQ2ZnLkF0aW1XaW47CisJCXBBZC0+TWxtZUF1eC5DaGFubmVsICAgICAgICAgICA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisKKwkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKKwkJcEFkLT5NbG1lQXV4LkNlbnRyYWxDaGFubmVsICAgID0gcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWw7CisKKwkJcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW49IHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVMZW47CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5TdXBSYXRlLCBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisJCVJUTVBDaGVja1JhdGVzKHBBZCwgcEFkLT5NbG1lQXV4LlN1cFJhdGUsICZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbik7CisJCXBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuID0gcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbjsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LkV4dFJhdGUsIHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKwkJUlRNUENoZWNrUmF0ZXMocEFkLCBwQWQtPk1sbWVBdXguRXh0UmF0ZSwgJnBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuKTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkKKwkJeworCQkJUlRNUFVwZGF0ZUhUSUUoJnBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeSwgJnBBZC0+U3RhQ2ZnLkRlc2lyZWRIdFBoeUluZm8uTUNTU2V0WzBdLCAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwgJnBBZC0+TWxtZUF1eC5BZGRIdEluZm8pOworCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiA9IHNpemVvZihIVF9DQVBBQklMSVRZX0lFKTsKKwkJCS8vIE5vdCB0dXJuIHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LmJIdEVuYWJsZSA9IFRSVUUgaGVyZS4KKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LmJIdEVuYWJsZSA9IFRSVUVcbiIpKTsKKwkJfQorCQllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCXsKKwkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPSAwOworCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBGQUxTRTsKKwkJfQorCQkvLyB0ZW1wb3JhcmlseSBub3Qgc3VwcG9ydCBRT1MgaW4gSUJTUworCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0sIHNpemVvZihFRENBX1BBUk0pKTsKKwkJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BUFFic3NMb2FkLCBzaXplb2YoUUJTU19MT0FEX1BBUk0pKTsKKwkJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BUFFvc0NhcGFiaWxpdHksIHNpemVvZihRT1NfQ0FQQUJJTElUWV9QQVJNKSk7CisKKwkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCwgRkFMU0UpOworCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCk7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIE1sbWVTdGFydFJlcUFjdGlvbihjaD0gJWQsc3VwIHJhdGVzPSAlZCwgZXh0IHJhdGVzPSVkKVxuIiwKKwkJCXBBZC0+TWxtZUF1eC5DaGFubmVsLCBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwgcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4pKTsKKworCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOworCQlTdGF0dXMgPSBNTE1FX1NVQ0NFU1M7CisJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9TVEFSVF9DT05GLCAyLCAmU3RhdHVzKTsKKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlRfRVJSKCgiU1lOQyAtIE1sbWVTdGFydFJlcUFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsLlxuIikpOworCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOworCQlTdGF0dXMgPSBNTE1FX0lOVkFMSURfRk9STUFUOworCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU1RBUlRfQ09ORiwgMiwgJlN0YXR1cyk7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCXBlZXIgc2VuZHMgYmVhY29uIGJhY2sgd2hlbiBzY2FubmluZworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUGVlckJlYWNvbkF0U2NhbkFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVUNIQVIgICAgICAgICAgIEJzc2lkW01BQ19BRERSX0xFTl0sIEFkZHIyW01BQ19BRERSX0xFTl07CisJVUNIQVIgICAgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXSwgQnNzVHlwZSwgQ2hhbm5lbCwgTmV3Q2hhbm5lbCwKKwkJCQkJU3NpZExlbiwgRHRpbUNvdW50LCBEdGltUGVyaW9kLCBCY2FzdEZsYWcsIE1lc3NhZ2VUb01lOworCUNGX1BBUk0gICAgICAgICBDZlBhcm07CisJVVNIT1JUICAgICAgICAgIEJlYWNvblBlcmlvZCwgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm87CisJUEZSQU1FXzgwMl8xMSAgIHBGcmFtZTsKKwlMQVJHRV9JTlRFR0VSICAgVGltZVN0YW1wOworCVVDSEFSICAgICAgICAgICBFcnA7CisJVUNIQVIgICAgICAgICAJU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU10sIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSCQkgIAlTdXBSYXRlTGVuLCBFeHRSYXRlTGVuOworCVVTSE9SVCAJCQlMZW5WSUU7CisJVUNIQVIJCQlDa2lwRmxhZzsKKwlVQ0hBUgkJCUFpcm9uZXRDZWxsUG93ZXJMaW1pdDsKKwlFRENBX1BBUk0gICAgICAgRWRjYVBhcm07CisJUUJTU19MT0FEX1BBUk0gIFFic3NMb2FkOworCVFPU19DQVBBQklMSVRZX1BBUk0gUW9zQ2FwYWJpbGl0eTsKKwlVTE9ORwkJCQkJCVJhbGlua0llOworCVVDSEFSCQkJCQkJVmFySUVbTUFYX1ZJRV9MRU5dOwkJLy8gVG90YWwgVklFIGxlbmd0aCA9IE1BWF9WSUVfTEVOIC0gLTUKKwlORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMJKnBWSUUgPSBOVUxMOworCUhUX0NBUEFCSUxJVFlfSUUJCUh0Q2FwYWJpbGl0eTsKKwlBRERfSFRfSU5GT19JRQkJQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKwlVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbiA9IDAsIFByZU5IdENhcGFiaWxpdHlMZW4gPSAwOworCVVDSEFSCQkJQWRkSHRJbmZvTGVuOworCVVDSEFSCQkJTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7CisKKwlwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSkgRWxlbS0+TXNnOworCS8vIEluaXQgVmFyaWFibGUgSUUgc3RydWN0dXJlCisJcFZJRSA9IChQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzKSBWYXJJRTsKKwlwVklFLT5MZW5ndGggPSAwOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgIFJUTVBaZXJvTWVtb3J5KCZIdENhcGFiaWxpdHksIHNpemVvZihIdENhcGFiaWxpdHkpKTsKKwlSVE1QWmVyb01lbW9yeSgmQWRkSHRJbmZvLCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCWlmIChQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkocEFkLAorCQkJCQkJCQlFbGVtLT5Nc2csCisJCQkJCQkJCUVsZW0tPk1zZ0xlbiwKKwkJCQkJCQkJRWxlbS0+Q2hhbm5lbCwKKwkJCQkJCQkJQWRkcjIsCisJCQkJCQkJCUJzc2lkLAorCQkJCQkJCQlTc2lkLAorCQkJCQkJCQkmU3NpZExlbiwKKwkJCQkJCQkJJkJzc1R5cGUsCisJCQkJCQkJCSZCZWFjb25QZXJpb2QsCisJCQkJCQkJCSZDaGFubmVsLAorCQkJCQkJCQkmTmV3Q2hhbm5lbCwKKwkJCQkJCQkJJlRpbWVTdGFtcCwKKwkJCQkJCQkJJkNmUGFybSwKKwkJCQkJCQkJJkF0aW1XaW4sCisJCQkJCQkJCSZDYXBhYmlsaXR5SW5mbywKKwkJCQkJCQkJJkVycCwKKwkJCQkJCQkJJkR0aW1Db3VudCwKKwkJCQkJCQkJJkR0aW1QZXJpb2QsCisJCQkJCQkJCSZCY2FzdEZsYWcsCisJCQkJCQkJCSZNZXNzYWdlVG9NZSwKKwkJCQkJCQkJU3VwUmF0ZSwKKwkJCQkJCQkJJlN1cFJhdGVMZW4sCisJCQkJCQkJCUV4dFJhdGUsCisJCQkJCQkJCSZFeHRSYXRlTGVuLAorCQkJCQkJCQkmQ2tpcEZsYWcsCisJCQkJCQkJCSZBaXJvbmV0Q2VsbFBvd2VyTGltaXQsCisJCQkJCQkJCSZFZGNhUGFybSwKKwkJCQkJCQkJJlFic3NMb2FkLAorCQkJCQkJCQkmUW9zQ2FwYWJpbGl0eSwKKwkJCQkJCQkJJlJhbGlua0llLAorCQkJCQkJCQkmSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJCQkmUHJlTkh0Q2FwYWJpbGl0eUxlbiwKKwkJCQkJCQkJJkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkJJkFkZEh0SW5mb0xlbiwKKwkJCQkJCQkJJkFkZEh0SW5mbywKKwkJCQkJCQkJJk5ld0V4dENoYW5uZWxPZmZzZXQsCisJCQkJCQkJCSZMZW5WSUUsCisJCQkJCQkJCXBWSUUpKQorCXsKKwkJVUxPTkcgSWR4OworCQlDSEFSIFJzc2kgPSAwOworCisJCUlkeCA9IEJzc1RhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIEJzc2lkLCBDaGFubmVsKTsKKwkJaWYgKElkeCAhPSBCU1NfTk9UX0ZPVU5EKQorCQkJUnNzaSA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLlJzc2k7CisKKwkJUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kwLCBSU1NJXzApLCBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTEsIFJTU0lfMSksIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMiwgUlNTSV8yKSk7CisKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAoKEh0Q2FwYWJpbGl0eUxlbiA+IDApIHx8IChQcmVOSHRDYXBhYmlsaXR5TGVuID4gMCkpCisJCQlIdENhcGFiaWxpdHlMZW4gPSBTSVpFX0hUX0NBUF9JRTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJaWYgKChwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlICE9IE1TUk5fVFlQRV9VTlVTRUQpICYmIChDaGFubmVsID09IHBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsKSkKKwkJeworCQkJSWR4ID0gQnNzVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIsIEJzc2lkLCBTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsCisJCQkJCQkgJkNmUGFybSwgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsIFN1cFJhdGVMZW4sRXh0UmF0ZSwgRXh0UmF0ZUxlbiwgJkh0Q2FwYWJpbGl0eSwKKwkJCQkJCSAmQWRkSHRJbmZvLCBIdENhcGFiaWxpdHlMZW4sIEFkZEh0SW5mb0xlbiwgTmV3RXh0Q2hhbm5lbE9mZnNldCwgQ2hhbm5lbCwgUnNzaSwgVGltZVN0YW1wLCBDa2lwRmxhZywKKwkJCQkJCSAmRWRjYVBhcm0sICZRb3NDYXBhYmlsaXR5LCAmUWJzc0xvYWQsIExlblZJRSwgcFZJRSk7CisJCQlpZiAoSWR4ICE9IEJTU19OT1RfRk9VTkQpCisJCQl7CisJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuQ0NYQnNzVGFiLkJzc0VudHJ5W0lkeF0uUFRTRiwgJkVsZW0tPk1zZ1syNF0sIDQpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIuQnNzRW50cnlbSWR4XS5UVFNGWzBdLCAmRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYi5Cc3NFbnRyeVtJZHhdLlRUU0ZbNF0sICZFbGVtLT5UaW1lU3RhbXAudS5Mb3dQYXJ0LCA0KTsKKwkJCQlpZiAocEFkLT5TdGFDZmcuQ0NYUmVxVHlwZSA9PSBNU1JOX1RZUEVfQkVBQ09OX1JFUSkKKwkJCQkJQWlyb25ldEFkZEJlYWNvblJlcG9ydChwQWQsIElkeCwgRWxlbSk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlJZHggPSBCc3NUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+U2NhblRhYiwgQnNzaWQsIFNzaWQsIFNzaWRMZW4sIEJzc1R5cGUsIEJlYWNvblBlcmlvZCwKKwkJCQkJCSAgJkNmUGFybSwgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4sICAmSHRDYXBhYmlsaXR5LAorCQkJCQkJICZBZGRIdEluZm8sIEh0Q2FwYWJpbGl0eUxlbiwgQWRkSHRJbmZvTGVuLCBOZXdFeHRDaGFubmVsT2Zmc2V0LCBDaGFubmVsLCBSc3NpLCBUaW1lU3RhbXAsIENraXBGbGFnLAorCQkJCQkJICZFZGNhUGFybSwgJlFvc0NhcGFiaWxpdHksICZRYnNzTG9hZCwgTGVuVklFLCBwVklFKTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJCQlpZiAocEFkLT5DaGFubmVsTGlzdFtwQWQtPkNvbW1vbkNmZy5DaGFubmVsTGlzdElkeF0uYkVmZmVjdGVkQ2hhbm5lbCA9PSBUUlVFKQorCQkJeworCQkJCVVDSEFSCQlSZWdDbGFzczsKKwkJCQlQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkyKHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZSZWdDbGFzcyk7CisJCQkJVHJpRXZlbnRUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYiwgQnNzaWQsICZIdENhcGFiaWxpdHksIEh0Q2FwYWJpbGl0eUxlbiwgUmVnQ2xhc3MsIENoYW5uZWwpOworCQkJfQorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCWlmIChJZHggIT0gQlNTX05PVF9GT1VORCkKKwkJCXsKKwkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5QVFNGLCAmRWxlbS0+TXNnWzI0XSwgNCk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLlRUU0ZbMF0sICZFbGVtLT5UaW1lU3RhbXAudS5Mb3dQYXJ0LCA0KTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uVFRTRls0XSwgJkVsZW0tPlRpbWVTdGFtcC51Lkxvd1BhcnQsIDQpOworCQkJfQorCQl9CisJfQorCS8vIHNhbml0eSBjaGVjayBmYWlsLCBpZ25vcmVkCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJV2hlbiB3YWl0aW5nIGpvaW5pbmcgdGhlIChJKUJTUywgYmVhY29uIHJlY2VpdmVkIGZyb20gZXh0ZXJuYWwKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFBlZXJCZWFjb25BdEpvaW5BY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSICAgICAgICAgQnNzaWRbTUFDX0FERFJfTEVOXSwgQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUiAgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXSwgU3NpZExlbiwgQnNzVHlwZSwgQ2hhbm5lbCwgTWVzc2FnZVRvTWUsCisJCQkJICBEdGltQ291bnQsIER0aW1QZXJpb2QsIEJjYXN0RmxhZywgTmV3Q2hhbm5lbDsKKwlMQVJHRV9JTlRFR0VSIFRpbWVTdGFtcDsKKwlVU0hPUlQgICAgICAgIEJlYWNvblBlcmlvZCwgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm87CisJQ0ZfUEFSTSAgICAgICBDZjsKKwlCT09MRUFOICAgICAgIFRpbWVyQ2FuY2VsbGVkOworCVVDSEFSICAgICAgICAgRXJwOworCVVDSEFSICAgICAgICAgU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU10sIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSCQkgIFN1cFJhdGVMZW4sIEV4dFJhdGVMZW47CisJVUNIQVIgICAgICAgICBDa2lwRmxhZzsKKwlVU0hPUlQgCQkgIExlblZJRTsKKwlVQ0hBUgkJICBBaXJvbmV0Q2VsbFBvd2VyTGltaXQ7CisJRURDQV9QQVJNICAgICAgIEVkY2FQYXJtOworCVFCU1NfTE9BRF9QQVJNICBRYnNzTG9hZDsKKwlRT1NfQ0FQQUJJTElUWV9QQVJNIFFvc0NhcGFiaWxpdHk7CisJVVNIT1JUICAgICAgICBTdGF0dXM7CisJVUNIQVIJCQkJCQlWYXJJRVtNQVhfVklFX0xFTl07CQkvLyBUb3RhbCBWSUUgbGVuZ3RoID0gTUFYX1ZJRV9MRU4gLSAtNQorCU5ESVNfODAyXzExX1ZBUklBQkxFX0lFcwkqcFZJRSA9IE5VTEw7CisJVUxPTkcgICAgICAgICAgIFJhbGlua0llOworCVVMT05HICAgICAgICAgSWR4OworCUhUX0NBUEFCSUxJVFlfSUUJCUh0Q2FwYWJpbGl0eTsKKwlBRERfSFRfSU5GT19JRQkJQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKwlVQ0hBUgkJCQlIdENhcGFiaWxpdHlMZW4gPSAwLCBQcmVOSHRDYXBhYmlsaXR5TGVuID0gMDsKKwlVQ0hBUgkJCUFkZEh0SW5mb0xlbjsKKwlVQ0hBUgkJCU5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCVVDSEFSCQkJQ2VudHJhbENoYW5uZWw7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkvLyBJbml0IFZhcmlhYmxlIElFIHN0cnVjdHVyZQorCXBWSUUgPSAoUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcykgVmFySUU7CisJcFZJRS0+TGVuZ3RoID0gMDsKKyAgICBSVE1QWmVyb01lbW9yeSgmSHRDYXBhYmlsaXR5LCBzaXplb2YoSHRDYXBhYmlsaXR5KSk7CisJUlRNUFplcm9NZW1vcnkoJkFkZEh0SW5mbywgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7CisKKworCWlmIChQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkocEFkLAorCQkJCQkJCQlFbGVtLT5Nc2csCisJCQkJCQkJCUVsZW0tPk1zZ0xlbiwKKwkJCQkJCQkJRWxlbS0+Q2hhbm5lbCwKKwkJCQkJCQkJQWRkcjIsCisJCQkJCQkJCUJzc2lkLAorCQkJCQkJCQlTc2lkLAorCQkJCQkJCQkmU3NpZExlbiwKKwkJCQkJCQkJJkJzc1R5cGUsCisJCQkJCQkJCSZCZWFjb25QZXJpb2QsCisJCQkJCQkJCSZDaGFubmVsLAorCQkJCQkJCQkmTmV3Q2hhbm5lbCwKKwkJCQkJCQkJJlRpbWVTdGFtcCwKKwkJCQkJCQkJJkNmLAorCQkJCQkJCQkmQXRpbVdpbiwKKwkJCQkJCQkJJkNhcGFiaWxpdHlJbmZvLAorCQkJCQkJCQkmRXJwLAorCQkJCQkJCQkmRHRpbUNvdW50LAorCQkJCQkJCQkmRHRpbVBlcmlvZCwKKwkJCQkJCQkJJkJjYXN0RmxhZywKKwkJCQkJCQkJJk1lc3NhZ2VUb01lLAorCQkJCQkJCQlTdXBSYXRlLAorCQkJCQkJCQkmU3VwUmF0ZUxlbiwKKwkJCQkJCQkJRXh0UmF0ZSwKKwkJCQkJCQkJJkV4dFJhdGVMZW4sCisJCQkJCQkJCSZDa2lwRmxhZywKKwkJCQkJCQkJJkFpcm9uZXRDZWxsUG93ZXJMaW1pdCwKKwkJCQkJCQkJJkVkY2FQYXJtLAorCQkJCQkJCQkmUWJzc0xvYWQsCisJCQkJCQkJCSZRb3NDYXBhYmlsaXR5LAorCQkJCQkJCQkmUmFsaW5rSWUsCisJCQkJCQkJCSZIdENhcGFiaWxpdHlMZW4sCisJCQkJCQkJCSZQcmVOSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJCQkmSHRDYXBhYmlsaXR5LAorCQkJCQkJCQkmQWRkSHRJbmZvTGVuLAorCQkJCQkJCQkmQWRkSHRJbmZvLAorCQkJCQkJCQkmTmV3RXh0Q2hhbm5lbE9mZnNldCwKKwkJCQkJCQkJJkxlblZJRSwKKwkJCQkJCQkJcFZJRSkpCisJeworCQkvLyBEaXNxdWFsaWZ5IDExYiBvbmx5IGFkaG9jIHdoZW4gd2UgYXJlIGluIDExZyBvbmx5IGFkaG9jIG1vZGUKKwkJaWYgKChCc3NUeXBlID09IEJTU19BREhPQykgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExRykgJiYgKChTdXBSYXRlTGVuK0V4dFJhdGVMZW4pPCAxMikpCisJCQlyZXR1cm47CisKKwkJLy8gQkVBQ09OIGZyb20gZGVzaXJlZCBCU1MvSUJTUyBmb3VuZC4gV2Ugc2hvdWxkIGJlIGFibGUgdG8gZGVjaWRlIG1vc3QKKwkJLy8gQlNTIHBhcmFtZXRlcnMgaGVyZS4KKwkJLy8gUS4gQnV0IHdoYXQgaGFwcGVuIGlmIHRoaXMgSk9JTiBkb2Vzbid0IGNvbmNsdWRlIGEgc3VjY2Vzc2Z1bCBBU1NPQ0lBVEVJT04/CisJCS8vICAgIERvIHdlIG5lZWQgdG8gcmVjZW92ZXIgYmFjayBhbGwgcGFyYW1ldGVycyBiZWxvbmdpbmcgdG8gcHJldmlvdXMgQlNTPworCQkvLyBBLiBTaG91bGQgYmUgbm90LiBUaGVyZSdzIG5vIGJhY2stZG9vciByZWNvdmVyIHRvIHByZXZpb3VzIEFQLiBJdCBzdGlsbCBuZWVkCisJCS8vICAgIGEgbmV3IEpPSU4tQVVUSC1BU1NPQyBzZXF1ZW5jZS4KKwkJaWYgKE1BQ19BRERSX0VRVUFMKHBBZC0+TWxtZUF1eC5Cc3NpZCwgQnNzaWQpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gcmVjZWl2ZSBkZXNpcmVkIEJFQUNPTiBhdCBKb2luV2FpdEJlYWNvbi4uLiBDaGFubmVsID0gJWRcbiIsIENoYW5uZWwpKTsKKwkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCisJCQkvLyBVcGRhdGUgUlNTSSB0byBwcmV2ZW50IE5vIHNpZ25hbCBkaXNwbGF5IHdoZW4gY2FyZHMgZmlyc3QgaW5pdGlhbGl6ZWQKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwCT0gQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kwLCBSU1NJXzApOworCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEJPSBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTEsIFJTU0lfMSk7CisJCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMgk9IENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMiwgUlNTSV8yKTsKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAJPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMDsKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTBYOAk9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAgPDwgMzsKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTEJPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMTsKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTFYOAk9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTEgPDwgMzsKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTIJPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMjsKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTJYOAk9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTIgPDwgMzsKKworCQkJLy8KKwkJCS8vIFdlIG5lZWQgdG8gY2hlY2sgaWYgU1NJRCBvbmx5IHNldCB0byBhbnksIHRoZW4gd2UgY2FuIHJlY29yZCB0aGUgY3VycmVudCBTU0lELgorCQkJLy8gT3RoZXJ3aXNlIHdpbGwgY2F1c2UgaGlkZGVuIFNTSUQgYXNzb2NpYXRpb24gZmFpbGVkLgorCQkJLy8KKwkJCWlmIChwQWQtPk1sbWVBdXguU3NpZExlbiA9PSAwKQorCQkJeworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBTc2lkLCBTc2lkTGVuKTsKKwkJCQlwQWQtPk1sbWVBdXguU3NpZExlbiA9IFNzaWRMZW47CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJSWR4ID0gQnNzU3NpZFRhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIEJzc2lkLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4sIENoYW5uZWwpOworCisJCQkJaWYgKElkeCAhPSBCU1NfTk9UX0ZPVU5EKQorCQkJCXsKKwkJCQkJLy8KKwkJCQkJLy8gTXVsdGlwbGUgU1NJRCBjYXNlLCB1c2VkIGNvcnJlY3QgQ2FwYWJpbGl0eUluZm8KKwkJCQkJLy8KKwkJCQkJQ2FwYWJpbGl0eUluZm8gPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5DYXBhYmlsaXR5SW5mbzsKKwkJCQl9CisJCQl9CisJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguQnNzaWQsIEJzc2lkLCBNQUNfQUREUl9MRU4pOworCQkJcEFkLT5NbG1lQXV4LkNhcGFiaWxpdHlJbmZvID0gQ2FwYWJpbGl0eUluZm8gJiBTVVBQT1JURURfQ0FQQUJJTElUWV9JTkZPOworCQkJcEFkLT5NbG1lQXV4LkJzc1R5cGUgPSBCc3NUeXBlOworCQkJcEFkLT5NbG1lQXV4LkJlYWNvblBlcmlvZCA9IEJlYWNvblBlcmlvZDsKKwkJCXBBZC0+TWxtZUF1eC5DaGFubmVsID0gQ2hhbm5lbDsKKwkJCXBBZC0+TWxtZUF1eC5BdGltV2luID0gQXRpbVdpbjsKKwkJCXBBZC0+TWxtZUF1eC5DZnBQZXJpb2QgPSBDZi5DZnBQZXJpb2Q7CisJCQlwQWQtPk1sbWVBdXguQ2ZwTWF4RHVyYXRpb24gPSBDZi5DZnBNYXhEdXJhdGlvbjsKKwkJCXBBZC0+TWxtZUF1eC5BUFJhbGlua0llID0gUmFsaW5rSWU7CisKKwkJCS8vIENvcHkgQVAncyBzdXBwb3J0ZWQgcmF0ZSB0byBNbG1lQXV4IGZvciBjcmVhdGluZyBhc3NvaWNhdGlvbiByZXF1ZXN0CisJCQkvLyBBbHNvIGZpbHRlciBvdXQgbm90IHN1cHBvcnRlZCByYXRlCisJCQlwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiA9IFN1cFJhdGVMZW47CisJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3VwUmF0ZSwgU3VwUmF0ZSwgU3VwUmF0ZUxlbik7CisJCQlSVE1QQ2hlY2tSYXRlcyhwQWQsIHBBZC0+TWxtZUF1eC5TdXBSYXRlLCAmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4pOworCQkJcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gPSBFeHRSYXRlTGVuOworCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LkV4dFJhdGUsIEV4dFJhdGUsIEV4dFJhdGVMZW4pOworCQkJUlRNUENoZWNrUmF0ZXMocEFkLCBwQWQtPk1sbWVBdXguRXh0UmF0ZSwgJnBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuKTsKKworICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXQsIDE2KTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCXBBZC0+TWxtZUF1eC5OZXdFeHRDaGFubmVsT2Zmc2V0ID0gTmV3RXh0Q2hhbm5lbE9mZnNldDsKKwkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPSBIdENhcGFiaWxpdHlMZW47CisKKwkJCS8vIGZpbHRlciBvdXQgdW4tc3VwcG9ydGVkIGh0IHJhdGVzCisJCQlpZiAoKChIdENhcGFiaWxpdHlMZW4gPiAwKSB8fCAoUHJlTkh0Q2FwYWJpbGl0eUxlbiA+IDApKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKKwkJCXsKKwkJCQlSVE1QWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwgU0laRV9IVF9DQVBfSUUpOworICAgCQkJCVJUTVBNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguQWRkSHRJbmZvLCAmQWRkSHRJbmZvLCBTSVpFX0FERF9IVF9JTkZPX0lFKTsKKworCQkJCS8vIFN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5NQ1NTZXQgc3RvcmVzIFBlZXIgQVAncyAxMW4gUnggY2FwYWJpbGl0eQorCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0LCBIdENhcGFiaWxpdHkuTUNTU2V0LCAxNik7CisJCQkJcEFkLT5NbG1lQXV4Lk5ld0V4dENoYW5uZWxPZmZzZXQgPSBOZXdFeHRDaGFubmVsT2Zmc2V0OworCQkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPSBTSVpFX0hUX0NBUF9JRTsKKwkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9IFRSVUU7CisJCQkJaWYgKFByZU5IdENhcGFiaWxpdHlMZW4gPiAwKQorCQkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJQcmVOSHQgPSBUUlVFOworCQkJCVJUTVBDaGVja0h0KHBBZCwgQlNTSURfV0NJRCwgJkh0Q2FwYWJpbGl0eSwgJkFkZEh0SW5mbyk7CisJCQkJLy8gQ29weSBBUCBQYXJhbWV0ZXIgdG8gU3RhQWN0aXZlLiAgVGhpcyBpcyBhbHNvIGluIExpbmtVcC4KKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQXRKb2luQWN0aW9uISAoTXBkdURlbnNpdHk9JWQsIE1heFJBbXBkdUZhY3Rvcj0lZCwgQlc9JWQpXG4iLAorCQkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5NcGR1RGVuc2l0eSwgcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuTWF4UkFtcGR1RmFjdG9yLCBIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCkpOworCisJCQkJaWYgKEFkZEh0SW5mb0xlbiA+IDApCisJCQkJeworCQkJCQlDZW50cmFsQ2hhbm5lbCA9IEFkZEh0SW5mby5Db250cm9sQ2hhbjsKKwkJIAkJCS8vIENoZWNrIGFnYWluIHRoZSBCYW5kd2lkdGggY2FwYWJpbGl0eSBvZiB0aGlzIEFQLgorCQkgCQkJaWYgKChBZGRIdEluZm8uQ29udHJvbENoYW4gPiAyKSYmIChBZGRIdEluZm8uQWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0gRVhUQ0hBX0JFTE9XKSAmJiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQorCQkgCQkJeworCQkgCQkJCUNlbnRyYWxDaGFubmVsID0gQWRkSHRJbmZvLkNvbnRyb2xDaGFuIC0gMjsKKwkJIAkJCX0KKwkJIAkJCWVsc2UgaWYgKChBZGRIdEluZm8uQWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0gRVhUQ0hBX0FCT1ZFKSAmJiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQorCQkgCQkJeworCQkgCQkJCUNlbnRyYWxDaGFubmVsID0gQWRkSHRJbmZvLkNvbnRyb2xDaGFuICsgMjsKKwkJIAkJCX0KKworCQkJCQkvLyBDaGVjayBFcnJvciAuCisJCQkJCWlmIChwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwgIT0gQ2VudHJhbENoYW5uZWwpCisJCSAJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUGVlckJlYWNvbkF0Sm9pbkFjdGlvbiBIVD09PT5CZWFjb24gQ2VudHJhbCBDaGFubmVsID0gJWQsIENvbnRyb2wgQ2hhbm5lbCA9ICVkLiBNbG1lYXV4IENlbnRyYWxDaGFubmVsID0gJWRcbiIsIENlbnRyYWxDaGFubmVsLCBBZGRIdEluZm8uQ29udHJvbENoYW4sIHBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCkpOworCisJCSAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQXRKb2luQWN0aW9uIEhUPT09PkNlbnRyYWwgQ2hhbm5lbCA9ICVkLCBDb250cm9sIENoYW5uZWwgPSAlZCwgIC5cbiIsIENlbnRyYWxDaGFubmVsLCBBZGRIdEluZm8uQ29udHJvbENoYW4pKTsKKworCQkJCX0KKworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJeworICAgCQkJCS8vIFRvIHByZXZlbnQgZXJyb3IsIGxldCBsZWdhY3kgQVAgbXVzdCBoYXZlIHNhbWUgQ2VudHJhbENoYW5uZWwgYW5kIENoYW5uZWwuCisJCQkJaWYgKChIdENhcGFiaWxpdHlMZW4gPT0gMCkgJiYgKFByZU5IdENhcGFiaWxpdHlMZW4gPT0gMCkpCisJCQkJCXBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+TWxtZUF1eC5DaGFubmVsOworCisJCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBGQUxTRTsKKwkJCQlSVE1QWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwgU0laRV9IVF9DQVBfSUUpOworCQkJCVJUTVBaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQWRkSHRJbmZvLCBTSVpFX0FERF9IVF9JTkZPX0lFKTsKKwkJCX0KKworCQkJUlRNUFVwZGF0ZU1sbWVSYXRlKHBBZCk7CisKKwkJCS8vIGNvcHkgUU9TIHJlbGF0ZWQgaW5mb3JtYXRpb24KKwkJCWlmICgocEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUpCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkJKQorCQkJeworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBFZGNhUGFybSwgJkVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5BUFFic3NMb2FkLCAmUWJzc0xvYWQsIHNpemVvZihRQlNTX0xPQURfUEFSTSkpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBRb3NDYXBhYmlsaXR5LCAmUW9zQ2FwYWJpbGl0eSwgc2l6ZW9mKFFPU19DQVBBQklMSVRZX1BBUk0pKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0sIHNpemVvZihFRENBX1BBUk0pKTsKKwkJCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFQUWJzc0xvYWQsIHNpemVvZihRQlNTX0xPQURfUEFSTSkpOworCQkJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBRb3NDYXBhYmlsaXR5LCBzaXplb2YoUU9TX0NBUEFCSUxJVFlfUEFSTSkpOworCQkJfQorCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gYWZ0ZXIgSk9JTiwgU3VwUmF0ZUxlbj0lZCwgRXh0UmF0ZUxlbj0lZFxuIiwKKwkJCQkJCQkJCQlwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwgcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4pKTsKKworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJLy8gVXBkYXRlIENraXBGbGFnCisJCQlwQWQtPlN0YUNmZy5Da2lwRmxhZyA9IENraXBGbGFnOworCisJCQkvLyBLZWVwIFRpbWVTdGFtcCBmb3IgUmUtQXNzb2NpYXRpb24gdXNlZC4KKwkJCWlmIChMRUFQX0NDS01fT04ocEFkKSAmJiAocEFkLT5TdGFDZmcuQ0NLTUxpbmtVcEZsYWcgPT0gVFJVRSkpCisJCQkJcEFkLT5TdGFDZmcuQ0NLTUJlYWNvbkF0Sm9pblRpbWVTdGFtcCA9IFRpbWVTdGFtcDsKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKworCQkJaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCAhPSAweEZGKQorCQkJeworCQkJCS8vV2UgbmVlZCB0byBjaGFuZ2Ugb3VyIFR4UG93ZXIgZm9yIENDWCAyLjAgQVAgQ29udHJvbCBvZiBDbGllbnQgVHJhbnNtaXQgUG93ZXIKKwkJCQlDaGFuZ2VUb0NlbGxQb3dlckxpbWl0KHBBZCwgQWlyb25ldENlbGxQb3dlckxpbWl0KTsKKwkJCX0KKwkJCWVsc2UgIC8vVXNlZCB0aGUgZGVmYXVsdCBUWCBQb3dlciBQZXJjZW50YWdlLgorCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQ7CisKKwkJCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CisJCQlTdGF0dXMgPSBNTE1FX1NVQ0NFU1M7CisJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfSk9JTl9DT05GLCAyLCAmU3RhdHVzKTsKKwkJfQorCQkvLyBub3QgdG8gbWUgQkVBQ09OLCBpZ25vcmVkCisJfQorCS8vIHNhbml0eSBjaGVjayBmYWlsLCBpZ25vcmUgdGhpcyBmcmFtZQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCXJlY2VpdmUgQkVBQ09OIGZyb20gcGVlcgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFBlZXJCZWFjb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSICAgICAgICAgQnNzaWRbTUFDX0FERFJfTEVOXSwgQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlDSEFSICAgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKKwlDRl9QQVJNICAgICAgIENmUGFybTsKKwlVQ0hBUiAgICAgICAgIFNzaWRMZW4sIE1lc3NhZ2VUb01lPTAsIEJzc1R5cGUsIENoYW5uZWwsIE5ld0NoYW5uZWwsIGluZGV4PTA7CisJVUNIQVIgICAgICAgICBEdGltQ291bnQ9MCwgRHRpbVBlcmlvZD0wLCBCY2FzdEZsYWc9MDsKKwlVU0hPUlQgICAgICAgIENhcGFiaWxpdHlJbmZvLCBBdGltV2luLCBCZWFjb25QZXJpb2Q7CisJTEFSR0VfSU5URUdFUiBUaW1lU3RhbXA7CisJVVNIT1JUICAgICAgICBUYnR0TnVtVG9OZXh0V2FrZVVwOworCVVDSEFSICAgICAgICAgRXJwOworCVVDSEFSICAgICAgICAgU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU10sIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSCQkgIFN1cFJhdGVMZW4sIEV4dFJhdGVMZW47CisJVUNIQVIJCSAgQ2tpcEZsYWc7CisJVVNIT1JUICAgICAgICBMZW5WSUU7CisJVUNIQVIJCSAgQWlyb25ldENlbGxQb3dlckxpbWl0OworCUVEQ0FfUEFSTSAgICAgICBFZGNhUGFybTsKKwlRQlNTX0xPQURfUEFSTSAgUWJzc0xvYWQ7CisJUU9TX0NBUEFCSUxJVFlfUEFSTSBRb3NDYXBhYmlsaXR5OworCVVMT05HICAgICAgICAgICBSYWxpbmtJZTsKKwkvLyBOZXcgZm9yIFdQQSBzZWN1cml0eSBzdWl0ZXMKKwlVQ0hBUgkJCQkJCVZhcklFW01BWF9WSUVfTEVOXTsJCS8vIFRvdGFsIFZJRSBsZW5ndGggPSBNQVhfVklFX0xFTiAtIC01CisJTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzCSpwVklFID0gTlVMTDsKKwlIVF9DQVBBQklMSVRZX0lFCQlIdENhcGFiaWxpdHk7CisJQUREX0hUX0lORk9fSUUJCUFkZEh0SW5mbzsJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCisJVUNIQVIJCQlIdENhcGFiaWxpdHlMZW4sIFByZU5IdENhcGFiaWxpdHlMZW47CisJVUNIQVIJCQlBZGRIdEluZm9MZW47CisJVUNIQVIJCQlOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKKworCisjaWZkZWYgUkFMSU5LX0FURQorICAgIGlmIChBVEVfT04ocEFkKSkKKyAgICB7CisJCXJldHVybjsKKyAgICB9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisJaWYgKCEoSU5GUkFfT04ocEFkKSB8fCBBREhPQ19PTihwQWQpCisJCSkpCisJCXJldHVybjsKKworCS8vIEluaXQgVmFyaWFibGUgSUUgc3RydWN0dXJlCisJcFZJRSA9IChQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzKSBWYXJJRTsKKwlwVklFLT5MZW5ndGggPSAwOworICAgIFJUTVBaZXJvTWVtb3J5KCZIdENhcGFiaWxpdHksIHNpemVvZihIdENhcGFiaWxpdHkpKTsKKwlSVE1QWmVyb01lbW9yeSgmQWRkSHRJbmZvLCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKKworCWlmIChQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkocEFkLAorCQkJCQkJCQlFbGVtLT5Nc2csCisJCQkJCQkJCUVsZW0tPk1zZ0xlbiwKKwkJCQkJCQkJRWxlbS0+Q2hhbm5lbCwKKwkJCQkJCQkJQWRkcjIsCisJCQkJCQkJCUJzc2lkLAorCQkJCQkJCQlTc2lkLAorCQkJCQkJCQkmU3NpZExlbiwKKwkJCQkJCQkJJkJzc1R5cGUsCisJCQkJCQkJCSZCZWFjb25QZXJpb2QsCisJCQkJCQkJCSZDaGFubmVsLAorCQkJCQkJCQkmTmV3Q2hhbm5lbCwKKwkJCQkJCQkJJlRpbWVTdGFtcCwKKwkJCQkJCQkJJkNmUGFybSwKKwkJCQkJCQkJJkF0aW1XaW4sCisJCQkJCQkJCSZDYXBhYmlsaXR5SW5mbywKKwkJCQkJCQkJJkVycCwKKwkJCQkJCQkJJkR0aW1Db3VudCwKKwkJCQkJCQkJJkR0aW1QZXJpb2QsCisJCQkJCQkJCSZCY2FzdEZsYWcsCisJCQkJCQkJCSZNZXNzYWdlVG9NZSwKKwkJCQkJCQkJU3VwUmF0ZSwKKwkJCQkJCQkJJlN1cFJhdGVMZW4sCisJCQkJCQkJCUV4dFJhdGUsCisJCQkJCQkJCSZFeHRSYXRlTGVuLAorCQkJCQkJCQkmQ2tpcEZsYWcsCisJCQkJCQkJCSZBaXJvbmV0Q2VsbFBvd2VyTGltaXQsCisJCQkJCQkJCSZFZGNhUGFybSwKKwkJCQkJCQkJJlFic3NMb2FkLAorCQkJCQkJCQkmUW9zQ2FwYWJpbGl0eSwKKwkJCQkJCQkJJlJhbGlua0llLAorCQkJCQkJCQkmSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJCQkmUHJlTkh0Q2FwYWJpbGl0eUxlbiwKKwkJCQkJCQkJJkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkJJkFkZEh0SW5mb0xlbiwKKwkJCQkJCQkJJkFkZEh0SW5mbywKKwkJCQkJCQkJJk5ld0V4dENoYW5uZWxPZmZzZXQsCisJCQkJCQkJCSZMZW5WSUUsCisJCQkJCQkJCXBWSUUpKQorCXsKKwkJQk9PTEVBTiBpc19teV9ic3NpZCwgaXNfbXlfc3NpZDsKKwkJVUxPTkcgICBCc3NpZHgsIE5vdzsKKwkJQlNTX0VOVFJZICpwQnNzOworCQlDSEFSCQlSZWFsUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kwLCBSU1NJXzApLCBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTEsIFJTU0lfMSksIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMiwgUlNTSV8yKSk7CisKKwkJaXNfbXlfYnNzaWQgPSBNQUNfQUREUl9FUVVBTChCc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpPyBUUlVFIDogRkFMU0U7CisJCWlzX215X3NzaWQgPSBTU0lEX0VRVUFMKFNzaWQsIFNzaWRMZW4sIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pPyBUUlVFOkZBTFNFOworCisKKwkJLy8gaWdub3JlIEJFQUNPTiBub3QgZm9yIG15IFNTSUQKKwkJaWYgKCghIGlzX215X3NzaWQpICYmICghIGlzX215X2Jzc2lkKSkKKwkJCXJldHVybjsKKworCQkvLyBJdCBtZWFucyBTVEEgd2FpdHMgZGlzYXNzb2MgY29tcGxldGVseSBmcm9tIHRoaXMgQVAsIGlnbm9yZXMgdGhpcyBiZWFjb24uCisJCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfV0FJVF9ESVNBU1NPQykKKwkJCXJldHVybjsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkvLyBDb3B5IENvbnRyb2wgY2hhbm5lbCBmb3IgdGhpcyBCU1NJRC4KKwkJaWYgKEFkZEh0SW5mb0xlbiAhPSAwKQorCQkJQ2hhbm5lbCA9IEFkZEh0SW5mby5Db250cm9sQ2hhbjsKKworCQlpZiAoKEh0Q2FwYWJpbGl0eUxlbiA+IDApIHx8IChQcmVOSHRDYXBhYmlsaXR5TGVuID4gMCkpCisJCQlIdENhcGFiaWxpdHlMZW4gPSBTSVpFX0hUX0NBUF9JRTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkvLworCQkvLyBIb3VzZWtlZXBpbmcgIlNzaWRCc3NUYWIiIHRhYmxlIGZvciBsYXRlci1vbiBST0FNaW5nIHVzYWdlLgorCQkvLworCQlCc3NpZHggPSBCc3NUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBCc3NpZCwgQ2hhbm5lbCk7CisJCWlmIChCc3NpZHggPT0gQlNTX05PVF9GT1VORCkKKwkJeworCQkJLy8gZGlzY292ZXIgbmV3IEFQIG9mIHRoaXMgbmV0d29yaywgY3JlYXRlIEJTUyBlbnRyeQorCQkJQnNzaWR4ID0gQnNzVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlNjYW5UYWIsIEJzc2lkLCBTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsCisJCQkJCQkgJkNmUGFybSwgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4sCisJCQkJCQkmSHRDYXBhYmlsaXR5LCAmQWRkSHRJbmZvLEh0Q2FwYWJpbGl0eUxlbixBZGRIdEluZm9MZW4sTmV3RXh0Q2hhbm5lbE9mZnNldCwgQ2hhbm5lbCwKKwkJCQkJCVJlYWxSc3NpLCBUaW1lU3RhbXAsIENraXBGbGFnLCAmRWRjYVBhcm0sICZRb3NDYXBhYmlsaXR5LAorCQkJCQkJJlFic3NMb2FkLCBMZW5WSUUsIHBWSUUpOworCQkJaWYgKEJzc2lkeCA9PSBCU1NfTk9UX0ZPVU5EKSAvLyByZXR1cm4gaWYgQlNTIHRhYmxlIGZ1bGwKKwkJCQlyZXR1cm47CisKKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLlBUU0YsICZFbGVtLT5Nc2dbMjRdLCA0KTsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5UVFNGWzBdLCAmRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7CisJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uVFRTRls0XSwgJkVsZW0tPlRpbWVTdGFtcC51Lkxvd1BhcnQsIDQpOworCisKKworCQl9CisKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJiAoTmV3Q2hhbm5lbCAhPSAwKSAmJiAoQ2hhbm5lbCAhPSBOZXdDaGFubmVsKSkKKwkJeworCQkJLy8gU3dpdGNoaW5nIHRvIGNoYW5uZWwgMSBjYW4gcHJldmVudCBmcm9tIHJlc2Nhbm5pbmcgdGhlIGN1cnJlbnQgY2hhbm5lbCBpbW1lZGlhdGVseSAoYnkgYXV0byByZWNvbm5lY3Rpb24pLgorCQkJLy8gSW4gYWRkaXRpb24sIGNsZWFyIHRoZSBNTE1FIHF1ZXVlIGFuZCB0aGUgc2NhbiB0YWJsZSB0byBkaXNjYXJkIHRoZSBSWCBwYWNrZXRzIGFuZCBwcmV2aW91cyBzY2FubmluZyByZXN1bHRzLgorCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCAxLCBGQUxTRSk7CisJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCAxKTsKKwkJICAgIExpbmtEb3duKHBBZCwgRkFMU0UpOworCQkJTWxtZVF1ZXVlSW5pdCgmcEFkLT5NbG1lLlF1ZXVlKTsKKwkJCUJzc1RhYmxlSW5pdCgmcEFkLT5TY2FuVGFiKTsKKwkJICAgIFJUTVB1c2VjRGVsYXkoMTAwMDAwMCk7CQkvLyB1c2UgZGVsYXkgdG8gcHJldmVudCBTVEEgZG8gcmVhc3NvYworCisJCQkvLyBjaGFubmVsIHNhbml0eSBjaGVjaworCQkJZm9yIChpbmRleCA9IDAgOyBpbmRleCA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGluZGV4KyspCisJCQl7CisJCQkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLkNoYW5uZWwgPT0gTmV3Q2hhbm5lbCkKKwkJCQl7CisJCQkJCXBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLkNoYW5uZWwgPSBOZXdDaGFubmVsOworCQkJCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsID0gTmV3Q2hhbm5lbDsKKwkJCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uIC0gU1RBIHJlY2VpdmUgY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IElFIChOZXcgQ2hhbm5lbCA9JWQpXG4iLCBOZXdDaGFubmVsKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGluZGV4ID49IHBBZC0+Q2hhbm5lbExpc3ROdW0pCisJCQl7CisJCQkJREJHUFJJTlRfRVJSKCgiUGVlckJlYWNvbihjYW4gbm90IGZpbmQgTmV3IENoYW5uZWw9JWQgaW4gQ2hhbm5lbExpc3RbJWRdXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPkNoYW5uZWxMaXN0TnVtKSk7CisJCQl9CisJCX0KKworCQkvLyBpZiB0aGUgc3NpZCBtYXRjaGVkICYgYnNzaWQgdW5tYXRjaGVkLCB3ZSBzaG91bGQgc2VsZWN0IHRoZSBic3NpZCB3aXRoIGxhcmdlIHZhbHVlLgorCQkvLyBUaGlzIG1pZ2h0IGhhcHBlbmVkIHdoZW4gdHdvIFNUQSBzdGFydCBhdCB0aGUgc2FtZSB0aW1lCisJCWlmICgoISBpc19teV9ic3NpZCkgJiYgQURIT0NfT04ocEFkKSkKKwkJeworCQkJSU5UCWk7CisKKwkJCS8vIEFkZCB0aGUgc2FmZWd1YXJkIGFnYWluc3QgdGhlIG1pc21hdGNoIG9mIGFkaG9jIHdlcCBzdGF0dXMKKwkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uV2VwU3RhdHVzKQorCQkJeworCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy8gY29sbGFwc2UgaW50byB0aGUgQURIT0MgbmV0d29yayB3aGljaCBoYXMgYmlnZ2VyIEJTU0lEIHZhbHVlLgorCQkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCXsKKwkJCQlpZiAoQnNzaWRbaV0gPiBwQWQtPkNvbW1vbkNmZy5Cc3NpZFtpXSkKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBtZXJnZSB0byB0aGUgSUJTUyB3aXRoIGJpZ2dlciBCU1NJRD0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCQkJCUJzc2lkWzBdLCBCc3NpZFsxXSwgQnNzaWRbMl0sIEJzc2lkWzNdLCBCc3NpZFs0XSwgQnNzaWRbNV0pKTsKKwkJCQkJQXNpY0Rpc2FibGVTeW5jKHBBZCk7CisJCQkJCUNPUFlfTUFDX0FERFIocEFkLT5Db21tb25DZmcuQnNzaWQsIEJzc2lkKTsKKwkJCQkJQXNpY1NldEJzc2lkKHBBZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJCQlNYWtlSWJzc0JlYWNvbihwQWQpOyAgICAgICAgLy8gcmUtYnVpbGQgQkVBQ09OIGZyYW1lCisJCQkJCUFzaWNFbmFibGVJYnNzU3luYyhwQWQpOyAgICAvLyBjb3B5IEJFQUNPTiBmcmFtZSB0byBvbi1jaGlwIG1lbW9yeQorCQkJCQlpc19teV9ic3NpZCA9IFRSVUU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQllbHNlIGlmIChCc3NpZFtpXSA8IHBBZC0+Q29tbW9uQ2ZnLkJzc2lkW2ldKQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCisKKwkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKKwkJcEJzcyA9ICZwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XTsKKwkJcEJzcy0+UnNzaSA9IFJlYWxSc3NpOyAgICAgICAvLyBsYXN0ZXN0IFJTU0kKKwkJcEJzcy0+TGFzdEJlYWNvblJ4VGltZSA9IE5vdzsgICAvLyBsYXN0IFJYIHRpbWVzdGFtcAorCisJCS8vCisJCS8vIEJFQUNPTiBmcm9tIG15IEJTU0lEIC0gZWl0aGVyIElCU1Mgb3IgSU5GUkEgbmV0d29yaworCQkvLworCQlpZiAoaXNfbXlfYnNzaWQpCisJCXsKKwkJCVJYV0lfU1RSVUMJUnhXSTsKKworCQkJcEFkLT5TdGFDZmcuRHRpbUNvdW50ID0gRHRpbUNvdW50OworCQkJcEFkLT5TdGFDZmcuRHRpbVBlcmlvZCA9IER0aW1QZXJpb2Q7CisJCQlwQWQtPlN0YUNmZy5MYXN0QmVhY29uUnhUaW1lID0gTm93OworCisKKwkJCVJ4V0kuUlNTSTAgPSBFbGVtLT5Sc3NpMDsKKwkJCVJ4V0kuUlNTSTEgPSBFbGVtLT5Sc3NpMTsKKwkJCVJ4V0kuUlNTSTIgPSBFbGVtLT5Sc3NpMjsKKworCQkJVXBkYXRlX1Jzc2lfU2FtcGxlKHBBZCwgJnBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUsICZSeFdJKTsKKwkJCWlmIChBaXJvbmV0Q2VsbFBvd2VyTGltaXQgIT0gMHhGRikKKwkJCXsKKwkJCQkvLworCQkJCS8vIFdlIGdldCB0aGUgQ2lzY28gKGNjeCkgIlR4UG93ZXIgTGltaXQiIHJlcXVpcmVkCisJCQkJLy8gQ2hhbmdlZCB0byBhcHByb3ByaWF0ZSBUeFBvd2VyIExpbWl0IGZvciBDaXNvIENvbXBhdGlibGUgRXh0ZW5zaW9ucworCQkJCS8vCisJCQkJQ2hhbmdlVG9DZWxsUG93ZXJMaW1pdChwQWQsIEFpcm9uZXRDZWxsUG93ZXJMaW1pdCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8KKwkJCQkvLyBBaXJvbmV0Q2VsbFBvd2VyTGltaXQgZXF1YWwgdG8gMHhGRiBtZWFucyB0aGUgQ2lzY28gKGNjeCkgIlR4UG93ZXIgTGltaXQiIG5vdCBleGlzdC4KKwkJCQkvLyBVc2VkIHRoZSBkZWZhdWx0IFRYIFBvd2VyIFBlcmNlbnRhZ2UsIHRoYXQgc2V0IGZyb20gVUkuCisJCQkJLy8KKwkJCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0OworCQkJfQorCisJCQkvLyBhdCBsZWFzdCBvbmUgMTFiIHBlZXIgam9pbmVkLiBkb3duZ3JhZGUgdGhlIE1heFR4UmF0ZSB0byAxMU1icHMKKwkJCS8vIGFmdGVyIGxhc3QgMTFiIHBlZXIgbGVmdCBmb3Igc2V2ZXJhbCBzZWNvbmRzLCB3ZSdsbCBhdXRvIHN3aXRjaCBiYWNrIHRvIDExRyByYXRlCisJCQkvLyBpbiBNbG1lUGVyaW9kaWNFeGVjKCkKKwkJCWlmIChBREhPQ19PTihwQWQpICYmIChDQVBfSVNfSUJTU19PTihDYXBhYmlsaXR5SW5mbykpKQorCQkJeworCQkJCUJPT0xFQU4JYlJlc3RhcnQ7CisgICAgICAgICAgICAgICAgQk9PTEVBTgliblJlc3RhcnQ7CisKKwkJCQliUmVzdGFydCA9IEZBTFNFOworICAgICAgICAgICAgICAgIGJuUmVzdGFydCA9IEZBTFNFOworCisJCQkJZG8KKwkJCQl7CisJCQkJCWlmICgoU3VwUmF0ZUxlbitFeHRSYXRlTGVuIDw9IDQpICYmIChwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPiBSQVRFXzExKSkKKwkJCQkJeworCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkFkaG9jQk9ubHlKb2luZWQgPT0gRkFMU0UpCisJCQkJCQl7CisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIDExYiBwZWVyIGpvaW5lZC4gZG93bi1ncmFkZSB0byAxMWIgVFggcmF0ZXMgXG4iKSk7CisJCQkJCQkJYlJlc3RhcnQgPSBUUlVFOworCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQWN0aXZlLlN1cFJhdGUsIFN1cFJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKwkJCQkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuID0gU3VwUmF0ZUxlbjsKKwkJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlLCBFeHRSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisJCQkJCQkJcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiA9IEV4dFJhdGVMZW47CisJCQkJCQkJcEFkLT5TdGFDZmcuQWRob2NCT25seUpvaW5lZCA9IFRSVUU7CisJCQkJCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBGQUxTRTsKKwkJCQkJCQlBc2ljU2V0RWRjYVBhcm0ocEFkLCBOVUxMKTsKKwkJCQkJCX0KKworCQkJCQkJLy8gdGhpcyB0aW1lc3RhbXAgaXMgZm9yIE1sbWVQZXJpb2RpY0V4ZWMoKSB0byBjaGVjayBpZiBhbGwgMTFCIHBlZXJzIGhhdmUgbGVmdAorCQkJCQkJcEFkLT5TdGFDZmcuTGFzdDExYkJlYWNvblJ4VGltZSA9IE5vdzsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJCS8vIFVwZGF0ZSBIdCBQaHkuCisJCQkJCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKKwkJCQkJeworCQkJCQkJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkgJiYKKwkJCQkJCQkhcEFkLT5TdGFDZmcuQWRob2NCR0pvaW5lZCAmJgorCQkJCQkJCSFwQWQtPlN0YUNmZy5BZGhvY0JPbmx5Sm9pbmVkKQorCQkJCQkJCUFkaG9jVHVybk9uUW9zKHBBZCk7CisKKwkJCQkJCS8vIEhhbmRsZSByYXRlIHN3aXRjaCBpc3N1ZSB3aGVuIEFkaG9jIG1vZGUKKwkJCQkJCWlmICgoU3VwUmF0ZUxlbitFeHRSYXRlTGVuID49IDgpICYmIChIdENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDApICYmIChIdENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDApKQorCQkJCQkJeworCQkJCQkJCWlmIChwQWQtPlN0YUNmZy5BZGhvY0JHSm9pbmVkID09IEZBTFNFKQorCQkJCQkJCXsKKwkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIDExZyBwZWVyIGpvaW5lZC4gZG93bi1ncmFkZSB0byAxMWcgVFggcmF0ZXMgXG4iKSk7CisJCQkJCQkJCWJSZXN0YXJ0ID0gVFJVRTsKKwkJCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFBY3RpdmUuU3VwUmF0ZSwgU3VwUmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOworCQkJCQkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuID0gU3VwUmF0ZUxlbjsKKwkJCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFBY3RpdmUuRXh0UmF0ZSwgRXh0UmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOworCQkJCQkJCQlwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuID0gRXh0UmF0ZUxlbjsKKwkJCQkJCQkJcEFkLT5TdGFDZmcuQWRob2NCR0pvaW5lZCA9IFRSVUU7CisJCQkJCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID0gRkFMU0U7CisJCQkJCQkJCUFzaWNTZXRFZGNhUGFybShwQWQsIE5VTEwpOworCQkJCQkJCX0KKworCQkJCQkJCS8vIHRoaXMgdGltZXN0YW1wIGlzIGZvciBNbG1lUGVyaW9kaWNFeGVjKCkgdG8gY2hlY2sgaWYgYWxsIDExZyBwZWVycyBoYXZlIGxlZnQKKwkJCQkJCQlwQWQtPlN0YUNmZy5MYXN0MTFnQmVhY29uUnhUaW1lID0gTm93OworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJZWxzZSBpZiAoIXBBZC0+U3RhQ2ZnLkFkaG9jQkdKb2luZWQgJiYKKwkJCQkJCQkJICFwQWQtPlN0YUNmZy5BZGhvY0JPbmx5Sm9pbmVkICYmCisJCQkJCQkJCSAocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwKSAmJgorCQkJCQkJCQkgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzIwKSkKKwkJCQkJCXsKKwkJCQkJCQlpZiAocEFkLT5TdGFDZmcuQWRob2MyME5Kb2luZWQgPT0gRkFMU0UpCisJCQkJCQkJeworCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisKKwkJCQkJCQkJcEFkLT5TdGFDZmcuQWRob2MyME5Kb2luZWQgPSBUUlVFOworCQkJCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwgJkh0Q2FwYWJpbGl0eSwgU0laRV9IVF9DQVBfSUUpOworCQkJCQkJCQlpZiAoQWRkSHRJbmZvTGVuICE9IDApCisJCQkJCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbywgJkFkZEh0SW5mbywgQWRkSHRJbmZvTGVuKTsKKwkJCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXQsIEh0Q2FwYWJpbGl0eS5NQ1NTZXQsIDE2KTsKKworCQkJCQkJCQlSVE1QQ2hlY2tIdChwQWQsIEVsZW0tPldjaWQsICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LCAmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbyk7CisJCQkJCQkJCUNPUFlfSFRTRVRUSU5HU19GUk9NX01MTUVfQVVYX1RPX0FDVElWRV9DRkcocEFkKTsKKwkJCQkJCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBUUlVFOworCQkJCQkJCQliUmVzdGFydCA9IFRSVUU7CisJCQkJCQkJCWJuUmVzdGFydCA9IFRSVUU7CisJCQkJCQkJfQorCQkJCQkJCS8vIHRoaXMgdGltZXN0YW1wIGlzIGZvciBNbG1lUGVyaW9kaWNFeGVjKCkgdG8gY2hlY2sgaWYgYWxsIDIwTUh6IE4gcGVlcnMgaGF2ZSBsZWZ0CisJCQkJCQkJcEFkLT5TdGFDZmcuTGFzdDIwTkJlYWNvblJ4VGltZSA9IE5vdzsKKwkJCQkJCX0KKworCQkJCQl9CisJCQkJCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCQkJeworCQkJCQkJUlRNUFplcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksIFNJWkVfSFRfQ0FQX0lFKTsKKwkJCQkJCVJUTVBaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQWRkSHRJbmZvLCBTSVpFX0FERF9IVF9JTkZPX0lFKTsKKwkJCQkJfQorCQkJCX13aGlsZSAoRkFMU0UpOworCisJCQkJLy8gSWYgcGVlciBBZGhvYyBpcyBsZWdhY3kgbW9kZSwgSSBkb24ndCBuZWVkIHRvIGNhbGwgTWxtZVVwZGF0ZUh0VHhSYXRlcyBubyBtYXR0ZXIgSSBzdXBwb3J0IEhUIG9yIG5vdAorCQkJCWlmICgoYlJlc3RhcnQgPT0gVFJVRSkgJiYgKGJuUmVzdGFydCA9PSBGQUxTRSkpCisJCQkJeworCQkJCQlNbG1lVXBkYXRlVHhSYXRlcyhwQWQsIEZBTFNFLCAwKTsKKwkJCQkJTWFrZUlic3NCZWFjb24ocEFkKTsgICAgICAgIC8vIHJlLWJ1aWxkIEJFQUNPTiBmcmFtZQorCQkJCQlBc2ljRW5hYmxlSWJzc1N5bmMocEFkKTsgICAgLy8gY29weSB0byBvbi1jaGlwIG1lbW9yeQorCQkJCX0KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQllbHNlIGlmICgoYlJlc3RhcnQgPT0gVFJVRSkgJiYgKGJuUmVzdGFydCA9PSBUUlVFKSkKKwkJCQl7CisJCQkJCU1sbWVVcGRhdGVUeFJhdGVzKHBBZCwgRkFMU0UsIEJTUzApOworCQkJCQlNbG1lVXBkYXRlSHRUeFJhdGVzKHBBZCwgQlNTMCk7CisJCQkJCU1ha2VJYnNzQmVhY29uKHBBZCk7ICAgICAgICAvLyByZS1idWlsZCBCRUFDT04gZnJhbWUKKwkJCQkJQXNpY0VuYWJsZUlic3NTeW5jKHBBZCk7ICAgIC8vIGNvcHkgdG8gb24tY2hpcCBtZW1vcnkKKwkJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJCQkvLyBBdCBsZWFzdCBhbm90aGVyIHBlZXIgaW4gdGhpcyBJQlNTLCBkZWNsYXJlIE1lZGlhU3RhdGUgYXMgQ09OTkVDVEVECisJCQkJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJCQkJeworCQkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKworCQkJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworCQkJCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOworCSAgICAgICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19VUDsKKwkJCQkJQXNpY1NldEJzc2lkKHBBZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCisJCQkJCS8vIDIwMDMvMDMvMTIgLSBqb2huCisJCQkJCS8vIE1ha2Ugc3VyZSB0aGlzIGVudHJ5IGluICJTY2FuVGFiIiB0YWJsZSwgdGh1cyBjb21wbGllcyB0byBNaWNyb3NvZnQncyBwb2xpY3kgdGhhdAorCQkJCQkvLyAic2l0ZSBzdXJ2ZXkiIHJlc3VsdCBzaG91bGQgYWx3YXlzIGluY2x1ZGUgdGhlIGN1cnJlbnQgY29ubmVjdGVkIG5ldHdvcmsuCisJCQkJCS8vCisJCQkJCUJzc2lkeCA9IEJzc1RhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIEJzc2lkLCBDaGFubmVsKTsKKwkJCQkJaWYgKEJzc2lkeCA9PSBCU1NfTk9UX0ZPVU5EKQorCQkJCQl7CisJCQkJCQlCc3NpZHggPSBCc3NUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+U2NhblRhYiwgQnNzaWQsIFNzaWQsIFNzaWRMZW4sIEJzc1R5cGUsIEJlYWNvblBlcmlvZCwKKwkJCQkJCQkJCSZDZlBhcm0sIEF0aW1XaW4sIENhcGFiaWxpdHlJbmZvLCBTdXBSYXRlLCBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLCAmSHRDYXBhYmlsaXR5LAorCQkJCQkJCQkJJkFkZEh0SW5mbywgSHRDYXBhYmlsaXR5TGVuLCBBZGRIdEluZm9MZW4sIE5ld0V4dENoYW5uZWxPZmZzZXQsIENoYW5uZWwsIFJlYWxSc3NpLCBUaW1lU3RhbXAsIDAsCisJCQkJCQkJCQkmRWRjYVBhcm0sICZRb3NDYXBhYmlsaXR5LCAmUWJzc0xvYWQsIExlblZJRSwgcFZJRSk7CisJCQkJCX0KKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQURIT0MgIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVELlxuIikpOworCQkJCX0KKworCQkJCS8vIEFkLWhvYyBtb2RlIGlzIHVzaW5nIE1BQyBhZGRyZXNzIGFzIEJBIHNlc3Npb24uIFNvIHdlIG5lZWQgdG8gY29udGludW91c2x5IGZpbmQgbmV3bHkgam9pbmVkIGFkaG9jIHN0YXRpb24gYnkgcmVjZWl2aW5nIGJlYWNvbi4KKwkJCQkvLyBUbyBwcmV2ZW50IGFsd2F5cyBjaGVjayB0aGlzLCB3ZSB1c2Ugd2NpZCA9PSBSRVNFUlZFRF9XQ0lEIHRvIHJlY29nbml6ZSBpdCBhcyBuZXdseSBqb2luZWQgYWRob2Mgc3RhdGlvbi4KKwkJCQlpZiAoQURIT0NfT04ocEFkKSAmJiAoRWxlbS0+V2NpZCA9PSBSRVNFUlZFRF9XQ0lEKSkKKwkJCQl7CisJCQkJCVVDSEFSCWlkeDsKKwkJCQkJTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7CisKKwkJCQkJLy8gbG9vayB1cCB0aGUgZXhpc3RpbmcgdGFibGUKKwkJCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBBZGRyMik7CisJCQkJCWlmIChwRW50cnkgPT0gTlVMTCkKKwkJCQkJeworCQkJCQkJLy8gQW5vdGhlciBhZGhvYyBqb2luaW5nLCBhZGQgdG8gb3VyIE1BQyB0YWJsZS4KKwkJCQkJCXBFbnRyeSA9IE1hY1RhYmxlSW5zZXJ0RW50cnkocEFkLCBBZGRyMiwgQlNTMCwgRkFMU0UpOworCQkJCQkJaWYgKHBFbnRyeSkKKwkJCQkJCXsKKwkJCQkJCQlwRW50cnktPlNzdCA9IFNTVF9BU1NPQzsKKwkJCQkJCQlpZHggPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CisJCQkJCQkJLy8gQWZ0ZXIgSW5zZXJ0RW50cnksIFdyaXRlIHRvIEFTSUMgb24tY2hpcCB0YWJsZS4KKwkJCQkJCQlSVDI4WFhfU1RBX1NFQ1VSSVRZX0lORk9fQUREKHBBZCwgQlNTMCwgaWR4LCBwRW50cnkpOworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFESE9DICV4OiV4OiV4OiV4OiV4OiV4ICBqb2luIGluLkVudHJ5PSVkXG4iLCBBZGRyMlswXSxBZGRyMlsxXSxBZGRyMlsyXSxBZGRyMlszXSxBZGRyMls0XSxBZGRyMls1XSwgcEVudHJ5LT5BaWQpKTsKKworCQkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUud29yZDsKKwkgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSHRDYXBhYmlsaXR5TGVuIDw9IDApCisJICAgICAgICAgICAgICAgICAgICAgICAgeworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TVEJDID0gMDsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuQlcgPSAwOworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gMDsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChTdXBSYXRlTGVuK0V4dFJhdGVMZW4gPD0gNCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpKQorCSAgICAgICAgCQkJCQl7CisJICAgICAgICAJCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJICAgICAgICAJCQkJCX0KKwkgICAgICAgIAkJCQkJZWxzZQorCSAgICAgICAgCQkJCQl7CisJICAgICAgICAJCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCSAgICAgICAgCQkJCQl9CisJCQkJCQkJCU1sbWVVcGRhdGVUeFJhdGVzKHBBZCwgRkFMU0UsIDApOworCSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQkJCQllbHNlCisJCQkJCQkJeworCQkJCQkJCQlNbG1lVXBkYXRlVHhSYXRlcyhwQWQsIEZBTFNFLCAwKTsKKwkJCQkJCQkJTWxtZVVwZGF0ZUh0VHhSYXRlcyhwQWQsIEJTUzApOworCQkJCQkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNpZm5kZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKQorCSAgICAgICAgICAgICAgICAgICAgICAgIHsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbmRBc3NvY0lFc1RvV3BhU3VwcGxpY2FudChwQWQpOworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdycXUuZGF0YS5mbGFncyA9IFJUX0FTU09DX0VWRU5UX0ZMQUc7CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgTlVMTCk7CisJICAgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkgICAgICAgICAgICAgICAgICAgICAgICB7CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2V4dF9ub3RpZnlfZXZlbnRfYXNzb2MocEFkKTsKKworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBNQUNfQUREUl9MRU4pOworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisKKwkgICAgICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJaWYgKElORlJBX09OKHBBZCkpCisJCQl7CisJCQkJQk9PTEVBTiBiVXNlU2hvcnRTbG90LCBiVXNlQkdQcm90ZWN0aW9uOworCisJCQkJLy8gZGVjaWRlIHRvIHVzZS9jaGFuZ2UgdG8gLQorCQkJCS8vICAgICAgMS4gbG9uZyBzbG90ICgyMCB1cykgb3Igc2hvcnQgc2xvdCAoOSB1cykgdGltZQorCQkJCS8vICAgICAgMi4gdHVybiBvbi9vZmYgUlRTL0NUUyBhbmQvb3IgQ1RTLXRvLXNlbGYgcHJvdGVjdGlvbgorCQkJCS8vICAgICAgMy4gc2hvcnQgcHJlYW1ibGUKKworCQkJCS8vYlVzZVNob3J0U2xvdCA9IHBBZC0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lICYmIENBUF9JU19TSE9SVF9TTE9UKENhcGFiaWxpdHlJbmZvKTsKKwkJCQliVXNlU2hvcnRTbG90ID0gQ0FQX0lTX1NIT1JUX1NMT1QoQ2FwYWJpbGl0eUluZm8pOworCQkJCWlmIChiVXNlU2hvcnRTbG90ICE9IE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfU0xPVF9JTlVTRUQpKQorCQkJCQlBc2ljU2V0U2xvdFRpbWUocEFkLCBiVXNlU2hvcnRTbG90KTsKKworCQkJCWJVc2VCR1Byb3RlY3Rpb24gPSAocEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID09IDEpIHx8ICAgIC8vIGFsd2F5cyB1c2UKKwkJCQkJCQkJICAgKChwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPT0gMCkgJiYgRVJQX0lTX1VTRV9QUk9URUNUSU9OKEVycCkpOworCisJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkgLy8gYWx3YXlzIG5vIEJHIHByb3RlY3Rpb24gaW4gQS1iYW5kLiBmYWxzZWx5IGhhcHBlbmVkIHdoZW4gc3dpdGNoaW5nIEEvRyBiYW5kIHRvIGEgZHVhbC1iYW5kIEFQCisJCQkJCWJVc2VCR1Byb3RlY3Rpb24gPSBGQUxTRTsKKworCQkJCWlmIChiVXNlQkdQcm90ZWN0aW9uICE9IE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQpKQorCQkJCXsKKwkJCQkJaWYgKGJVc2VCR1Byb3RlY3Rpb24pCisJCQkJCXsKKwkJCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19CR19QUk9URUNUSU9OX0lOVVNFRCk7CisJCQkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsIChPRkRNU0VUUFJPVEVDVHxDQ0tTRVRQUk9URUNUfEFMTE5fU0VUUFJPVEVDVCksRkFMU0UsKHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPT0gMSkpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQpOworCQkJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCAoT0ZETVNFVFBST1RFQ1R8Q0NLU0VUUFJPVEVDVHxBTExOX1NFVFBST1RFQ1QpLFRSVUUsKHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPT0gMSkpOworCQkJCQl9CisKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJTWU5DIC0gQVAgY2hhbmdlZCBCL0cgcHJvdGVjdGlvbiB0byAlZFxuIiwgYlVzZUJHUHJvdGVjdGlvbikpOworCQkJCX0KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCS8vIGNoZWNrIEh0IHByb3RlY3Rpb24gbW9kZS4gYW5kIGFkaGVyZSB0byB0aGUgTm9uLUdGIGRldmljZSBpbmRpY2F0aW9uIGJ5IEFQLgorCQkJCWlmICgoQWRkSHRJbmZvTGVuICE9IDApICYmCisJCQkJCSgoQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlICE9IHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUpIHx8CisJCQkJCShBZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgIT0gcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCkpKQorCQkJCXsKKwkJCQkJcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9IEFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudDsKKwkJCQkJcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSA9IEFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZTsKKwkJCQkJaWYgKHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPT0gMSkKKwkJCQl7CisJCQkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsIEFMTE5fU0VUUFJPVEVDVCwgRkFMU0UsIFRSVUUpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgQUxMTl9TRVRQUk9URUNULCBGQUxTRSwgRkFMU0UpOworCisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBBUCBjaGFuZ2VkIE4gT3BlcmFpb25Nb2RlIHRvICVkXG4iLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlKSk7CisJCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKSAmJgorCQkJCQlFUlBfSVNfVVNFX0JBUktFUl9QUkVBTUJMRShFcnApKQorCQkJCXsKKwkJCQkJTWxtZVNldFR4UHJlYW1ibGUocEFkLCBSdDgwMl8xMVByZWFtYmxlTG9uZyk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBBUCBmb3JjZWQgdG8gdXNlIExPTkcgcHJlYW1ibGVcbiIpKTsKKwkJCQl9CisKKwkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSAgICAmJgorCQkJCQkoRWRjYVBhcm0uYlZhbGlkID09IFRSVUUpICAgICAgICAgICAgICAgICAgICAgICAgICAmJgorCQkJCQkoRWRjYVBhcm0uRWRjYVVwZGF0ZUNvdW50ICE9IHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uRWRjYVVwZGF0ZUNvdW50KSkKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBBUCBjaGFuZ2UgRURDQSBwYXJhbWV0ZXJzKGZyb20gJWQgdG8gJWQpXG4iLAorCQkJCQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5FZGNhVXBkYXRlQ291bnQsCisJCQkJCQlFZGNhUGFybS5FZGNhVXBkYXRlQ291bnQpKTsKKwkJCQkJQXNpY1NldEVkY2FQYXJtKHBBZCwgJkVkY2FQYXJtKTsKKwkJCQl9CisKKwkJCQkvLyBjb3B5IFFPUyByZWxhdGVkIGluZm9ybWF0aW9uCisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkFQUWJzc0xvYWQsICZRYnNzTG9hZCwgc2l6ZW9mKFFCU1NfTE9BRF9QQVJNKSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkFQUW9zQ2FwYWJpbGl0eSwgJlFvc0NhcGFiaWxpdHksIHNpemVvZihRT1NfQ0FQQUJJTElUWV9QQVJNKSk7CisJCQl9CisKKwkJCS8vIG9ubHkgSU5GUkFTVFJVQ1RVUkUgbW9kZSBzdXBwb3J0IHBvd2VyLXNhdmluZyBmZWF0dXJlCisJCQlpZiAoKElORlJBX09OKHBBZCkgJiYgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkpIHx8IChwQWQtPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlKSkKKwkJCXsKKwkJCQlVQ0hBUiBGcmVlTnVtYmVyOworCQkJCS8vICAxLiBBUCBoYXMgYmFja2xvZ2dlZCB1bmljYXN0LXRvLW1lIGZyYW1lLCBzdGF5IEFXQUtFLCBzZW5kIFBTUE9MTAorCQkJCS8vICAyLiBBUCBoYXMgYmFja2xvZ2dlZCBicm9hZGNhc3QvbXVsdGljYXN0IGZyYW1lIGFuZCB3ZSB3YW50IHRob3NlIGZyYW1lcywgc3RheSBBV0FLRQorCQkJCS8vICAzLiB3ZSBoYXZlIG91dGdvaW5nIGZyYW1lcyBpbiBUeFJpbmcgb3IgTWdtdFJpbmcsIGJldHRlciBzdGF5IEFXQUtFCisJCQkJLy8gIDQuIFBzbSBjaGFuZ2UgdG8gUFdSX1NBVkUsIGJ1dCBBUCBub3QgYmVlbiBpbmZvcm1lZCB5ZXQsIHdlIGJldHRlciBzdGF5IEFXQUtFCisJCQkJLy8gIDUuIG90aGVyd2lzZSwgcHV0IFBIWSBiYWNrIHRvIHNsZWVwIHRvIHNhdmUgYmF0dGVyeS4KKwkJCQlpZiAoTWVzc2FnZVRvTWUpCisJCQkJeworI2lmZGVmIFJUMjg2MAorCQkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpKQorCQkJCQl7CisJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBwQWQtPlN0YUNmZy5CQlBSMyk7CisJCQkJCQkvLyBUdXJuIGNsayB0byA4ME1oei4KKwkJCQkJfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCQkJCQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlICYmCisJCQkJCQlwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JFICYmIHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQksgJiYgcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WSSAmJiBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZPKQorCQkJCQl7CisJCQkJCQlwQWQtPkNvbW1vbkNmZy5iTmVlZFNlbmRUcmlnZ2VyRnJhbWUgPSBUUlVFOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCVJUMjhYWF9QU19QT0xMX0VOUVVFVUUocEFkKTsKKwkJCQl9CisJCQkJZWxzZSBpZiAoQmNhc3RGbGFnICYmIChEdGltQ291bnQgPT0gMCkgJiYgT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pKQorCQkJCXsKKyNpZmRlZiBSVDI4NjAKKwkJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkKKwkJCQkJeworCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgcEFkLT5TdGFDZmcuQkJQUjMpOworCQkJCQl9CisjZW5kaWYgLy8gUlQyODYwIC8vCisJCQkJfQorCQkJCWVsc2UgaWYgKChwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQktdLk51bWJlciAhPSAwKQkJCQkJCQkJCQkJCQl8fAorCQkJCQkJKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CRV0uTnVtYmVyICE9IDApCQkJCQkJCQkJCQkJCQl8fAorCQkJCQkJKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WSV0uTnVtYmVyICE9IDApCQkJCQkJCQkJCQkJCQl8fAorCQkJCQkJKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WT10uTnVtYmVyICE9IDApCQkJCQkJCQkJCQkJCQl8fAorCQkJCQkJKFJUTVBGcmVlVFhEUmVxdWVzdChwQWQsIFFJRF9BQ19CSywgVFhfUklOR19TSVpFIC0gMSwgJkZyZWVOdW1iZXIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCXx8CisJCQkJCQkoUlRNUEZyZWVUWERSZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBUWF9SSU5HX1NJWkUgLSAxLCAmRnJlZU51bWJlcikgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykJfHwKKwkJCQkJCShSVE1QRnJlZVRYRFJlcXVlc3QocEFkLCBRSURfQUNfVkksIFRYX1JJTkdfU0laRSAtIDEsICZGcmVlTnVtYmVyKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQl8fAorCQkJCQkJKFJUTVBGcmVlVFhEUmVxdWVzdChwQWQsIFFJRF9BQ19WTywgVFhfUklOR19TSVpFIC0gMSwgJkZyZWVOdW1iZXIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCXx8CisJCQkJCQkoUlRNUEZyZWVUWERSZXF1ZXN0KHBBZCwgUUlEX01HTVQsIE1HTVRfUklOR19TSVpFIC0gMSwgJkZyZWVOdW1iZXIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpKQorCQkJCXsKKwkJCQkJLy8gVE9ETzogY29uc2lkZXIgc2NoZWR1bGVkIEhDQ0EuIG1pZ2h0IG5vdCBiZSBwcm9wZXIgdG8gdXNlIHRyYWRpdGlvbmFsIERUSU0tYmFzZWQgcG93ZXItc2F2aW5nIHNjaGVtZQorCQkJCQkvLyBjYW4gd2UgY2hlYXQgaGVyZSAoaS5lLiBqdXN0IGNoZWNrIE1HTVQgJiBBQ19CRSkgZm9yIGJldHRlciBwZXJmb3JtYW5jZT8KKyNpZmRlZiBSVDI4NjAKKwkJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkKKwkJCQkJeworCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgcEFkLT5TdGFDZmcuQkJQUjMpOworCQkJCQl9CisjZW5kaWYgLy8gUlQyODYwIC8vCisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVVTSE9SVCBOZXh0RHRpbSA9IER0aW1Db3VudDsKKworCQkJCQlpZiAoTmV4dER0aW0gPT0gMCkKKwkJCQkJCU5leHREdGltID0gRHRpbVBlcmlvZDsKKworCQkJCQlUYnR0TnVtVG9OZXh0V2FrZVVwID0gcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50OworCQkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pICYmIChUYnR0TnVtVG9OZXh0V2FrZVVwID4gTmV4dER0aW0pKQorCQkJCQkJVGJ0dE51bVRvTmV4dFdha2VVcCA9IE5leHREdGltOworCisJCQkJCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKwkJCQkJeworCQkJCQkJQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAocEFkLCBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQkvLyBub3QgbXkgQlNTSUQsIGlnbm9yZSBpdAorCX0KKwkvLyBzYW5pdHkgY2hlY2sgZmFpbCwgaWdub3JlIHRoaXMgZnJhbWUKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlSZWNlaXZlIFBST0JFIFJFUSBmcm9tIHJlbW90ZSBwZWVyIHdoZW4gb3BlcmF0aW5nIGluIElCU1MgbW9kZQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUGVlclByb2JlUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUiAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07CisJQ0hBUiAgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07CisJVUNIQVIgICAgICAgICBTc2lkTGVuOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCVVDSEFSCQkgIEh0TGVuLCBBZGRIdExlbiwgTmV3RXh0TGVuOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCUhFQURFUl84MDJfMTEgUHJvYmVSc3BIZHI7CisJTkRJU19TVEFUVVMgICBOU3RhdHVzOworCVBVQ0hBUiAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJVUxPTkcgICAgICAgICBGcmFtZUxlbiA9IDA7CisJTEFSR0VfSU5URUdFUiBGYWtlVGltZXN0YW1wOworCVVDSEFSICAgICAgICAgRHNMZW4gPSAxLCBJYnNzTGVuID0gMjsKKwlVQ0hBUiAgICAgICAgIExvY2FsRXJwSWVbM10gPSB7SUVfRVJQLCAxLCAwfTsKKwlCT09MRUFOICAgICAgIFByaXZhY3k7CisJVVNIT1JUICAgICAgICBDYXBhYmlsaXR5SW5mbzsKKwlVQ0hBUgkJICBSU05JZSA9IElFX1dQQTsKKworCWlmICghIEFESE9DX09OKHBBZCkpCisJCXJldHVybjsKKworCWlmIChQZWVyUHJvYmVSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsIFNzaWQsICZTc2lkTGVuKSkKKwl7CisJCWlmICgoU3NpZExlbiA9PSAwKSB8fCBTU0lEX0VRVUFMKFNzaWQsIFNzaWRMZW4sIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pKQorCQl7CisJCQkvLyBhbGxvY2F0ZSBhbmQgc2VuZCBvdXQgUHJvYmVSc3AgZnJhbWUKKwkJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCXJldHVybjsKKworCQkJLy9wQWQtPlN0YUNmZy5BdGltV2luID0gMDsgIC8vID8/Pz8/PworCisJCQlQcml2YWN5ID0gKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKSB8fAorCQkJCQkgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgfHwKKwkJCQkJICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpOworCQkJQ2FwYWJpbGl0eUluZm8gPSBDQVBfR0VORVJBVEUoMCwgMSwgUHJpdmFjeSwgKHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZVNob3J0KSwgMCwgMCk7CisKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKwkJCQkJCQkgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgICAgICZQcm9iZVJzcEhkciwKKwkJCQkJCQkgIFRJTUVTVEFNUF9MRU4sICAgICAgICAgICAgICAgICZGYWtlVGltZXN0YW1wLAorCQkJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCwKKwkJCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDYXBhYmlsaXR5SW5mbywKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTc2lkSWUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuU3NpZExlbiwKKwkJCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUllLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4sCisJCQkJCQkJICBwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuLCAgICBwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRzSWUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRHNMZW4sCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJYnNzSWUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSWJzc0xlbiwKKwkJCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPlN0YUFjdGl2ZS5BdGltV2luLAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCisJCQlpZiAocEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbikKKwkJCXsKKwkJCQlVTE9ORyB0bXA7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgJnRtcCwKKwkJCQkJCQkJICAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbEVycEllLAorCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlSWUsCisJCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4sCisJCQkJCQkJCSAgcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiwgICAgJnBBZC0+U3RhQWN0aXZlLkV4dFJhdGUsCisJCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IHRtcDsKKwkJCX0KKworCQkJLy8gSWYgYWRob2Mgc2VjcnVpdHkgaXMgc2V0IGZvciBXUEEtTm9uZSwgYXBwZW5kIHRoZSBjaXBoZXIgc3VpdGUgSUUKKwkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorCQkJeworCQkJCVVMT05HIHRtcDsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAJJnRtcCwKKwkJCQkJCSAgCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUlNOSWUsCisJCQkJCQkgIAkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkmcEFkLT5TdGFDZmcuUlNOSUVfTGVuLAorCQkJCQkJICAJCQlwQWQtPlN0YUNmZy5SU05JRV9MZW4sICAgICAgCXBBZC0+U3RhQ2ZnLlJTTl9JRSwKKwkJCQkJCSAgCQkJRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IHRtcDsKKwkJCX0KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpCisJCQl7CisJCQkJVUxPTkcgVG1wTGVuOworCQkJCVVDSEFSCUJST0FEQ09NWzRdID0gezB4MCwgMHg5MCwgMHg0YywgMHgzM307CisJCQkJSHRMZW4gPSBzaXplb2YocEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5KTsKKwkJCQlBZGRIdExlbiA9IHNpemVvZihwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8pOworCQkJCU5ld0V4dExlbiA9IDE7CisJCQkJLy9OZXcgZXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0IElFIGlzIGluY2x1ZGVkIGluIEJlYWNvbiwgUHJvYmUgUnNwIG9yIGNoYW5uZWwgU3dpdGNoIEFubm91bmNlbWVudCBGcmFtZQorCQkJCWlmIChwQWQtPmJCcm9hZENvbUhUID09IFRSVUUpCisJCQkJeworCQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcExlbiwKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJldwYUllLAorCQkJCQkJCQkgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQlJPQURDT01bMF0sCisJCQkJCQkJCSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLCAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAgICZUbXBMZW4sCisJCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcEllLAorCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRMZW4sCisJCQkJCQkJCSBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSksICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksCisJCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBZGRIdEluZm9JZSwKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFkZEh0TGVuLAorCQkJCQkJCQkgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSwgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbywKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk5ld0V4dENoYW5JZSwKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk5ld0V4dExlbiwKKwkJCQkJCQkJIHNpemVvZihORVdfRVhUX0NIQU5fSUUpLCAgICAgICAgICAmcEFkLT5Db21tb25DZmcuTmV3RXh0Q2hhbk9mZnNldCwKKwkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQkJfQorCQkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJfQorCX0KK30KKworVk9JRCBCZWFjb25UaW1lb3V0QXRKb2luQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBCZWFjb25UaW1lb3V0QXRKb2luQWN0aW9uXG4iKSk7CisJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKKwlTdGF0dXMgPSBNTE1FX1JFSl9USU1FT1VUOworCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9KT0lOX0NPTkYsIDIsICZTdGF0dXMpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVNjYW4gdGltZW91dCBwcm9jZWR1cmUuIGJhc2ljYWxseSBhZGQgY2hhbm5lbCBpbmRleCBieSAxIGFuZCByZXNjYW4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFNjYW5UaW1lb3V0QWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlwQWQtPk1sbWVBdXguQ2hhbm5lbCA9IE5leHRDaGFubmVsKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpOworCisJLy8gT25seSBvbmUgY2hhbm5lbCBzY2FubmVkIGZvciBDSVNDTyBiZWFjb24gcmVxdWVzdAorCWlmICgocEFkLT5NbG1lQXV4LlNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQUNUSVZFKSB8fAorCQkocEFkLT5NbG1lQXV4LlNjYW5UeXBlID09IFNDQU5fQ0lTQ09fUEFTU0lWRSkgfHwKKwkJKHBBZC0+TWxtZUF1eC5TY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX05PSVNFKSB8fAorCQkocEFkLT5NbG1lQXV4LlNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQ0hBTk5FTF9MT0FEKSkKKwkJcEFkLT5NbG1lQXV4LkNoYW5uZWwgPSAwOworCisJLy8gdGhpcyByb3V0aW5lIHdpbGwgc3RvcCBpZiBwQWQtPk1sbWVBdXguQ2hhbm5lbCA9PSAwCisJU2Nhbk5leHRDaGFubmVsKHBBZCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEludmFsaWRTdGF0ZVdoZW5TY2FuKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFZTkMgLSBJbnZhbGlkU3RhdGVXaGVuU2NhbihzdGF0ZT0lbGQpLiBSZXNldCBTWU5DIG1hY2hpbmVcbiIsIHBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUpKTsKKwlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOworCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CisJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NDQU5fQ09ORiwgMiwgJlN0YXR1cyk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEludmFsaWRTdGF0ZVdoZW5Kb2luKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkludmFsaWRTdGF0ZVdoZW5Kb2luKHN0YXRlPSVsZCkuIFJlc2V0IFNZTkMgbWFjaGluZVxuIiwgcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSkpOworCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CisJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKKwlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfSk9JTl9DT05GLCAyLCAmU3RhdHVzKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgSW52YWxpZFN0YXRlV2hlblN0YXJ0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkludmFsaWRTdGF0ZVdoZW5TdGFydChzdGF0ZT0lbGQpLiBSZXNldCBTWU5DIG1hY2hpbmVcbiIsIHBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUpKTsKKwlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOworCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CisJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NUQVJUX0NPTkYsIDIsICZTdGF0dXMpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgRW5xdWV1ZVBzUG9sbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKyNpZmRlZiBSQUxJTktfQVRFCisgICAgaWYgKEFURV9PTihwQWQpKQorICAgIHsKKwkJcmV0dXJuOworICAgIH0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKworCWlmIChwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID09IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQKQorICAgIAlwQWQtPlBzUG9sbEZyYW1lLkZDLlB3ck1nbXQgPSBQV1JfU0FWRTsKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIChQVUNIQVIpJnBBZC0+UHNQb2xsRnJhbWUsIHNpemVvZihQU1BPTExfRlJBTUUpKTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBFbnF1ZXVlUHJvYmVSZXF1ZXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCU5ESVNfU1RBVFVTICAgICBOU3RhdGU7CisJUFVDSEFSICAgICAgICAgIHBPdXRCdWZmZXI7CisJVUxPTkcgICAgICAgICAgIEZyYW1lTGVuID0gMDsKKwlIRUFERVJfODAyXzExICAgSGRyODAyMTE7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJmb3JjZSBvdXQgYSBQcm9iZVJlcXVlc3QgLi4uXG4iKSk7CisKKwlOU3RhdGUgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYgKE5TdGF0ZSA9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJTWd0TWFjSGVhZGVySW5pdChwQWQsICZIZHI4MDIxMSwgU1VCVFlQRV9QUk9CRV9SRVEsIDAsIEJST0FEQ0FTVF9BRERSLCBCUk9BRENBU1RfQUREUik7CisKKwkJLy8gdGhpcyBQcm9iZVJlcXVlc3QgZXhwbGljaXRseSBzcGVjaWZ5IFNTSUQgdG8gcmVkdWNlIHVud2FudGVkIFByb2JlUmVzcG9uc2UKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAgICAgICAmRnJhbWVMZW4sCisJCQkJCQkgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgICAgICAgJkhkcjgwMjExLAorCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTc2lkSWUsCisJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sCisJCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sCQkgIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsCisJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN1cFJhdGVJZSwKKwkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiwKKwkJCQkJCSAgcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiwgICAgICBwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlLAorCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCX0KKworfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisjaWZkZWYgRE9UMTFOX0RSQUZUMworVk9JRCBCdWlsZEVmZmVjdGVkQ2hhbm5lbExpc3QoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUNIQVIJCUVDaGFubmVsWzExXTsKKwlVQ0hBUgkJaSwgaiwgazsKKwlVQ0hBUgkJVXBwZXJDaGFubmVsID0gMCwgTG93ZXJDaGFubmVsID0gMDsKKworCVJUTVBaZXJvTWVtb3J5KEVDaGFubmVsLCAxMSk7CisJaSA9IDA7CisJLy8gRmluZCB1cHBlciBjaGFubmVsIGFuZCBsb3dlciBjaGFubmVsLgorCWlmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA8IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJeworCQlVcHBlckNoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCQlMb3dlckNoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbDsKKwl9CisJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPiBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCXsKKwkJVXBwZXJDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWw7CisJCUxvd2VyQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJfQorCWVsc2UKKwl7CisJCXJldHVybjsKKwl9CisKKwkvLyBSZWNvcmQgY2hhbm5lbHMgdGhhdCBpcyBiZWxvdyBsb3dlciBjaGFubmVsLi4KKwlpZiAoTG93ZXJDaGFubmVsID4gMSkKKwl7CisJCUVDaGFubmVsWzBdID0gTG93ZXJDaGFubmVsIC0gMTsKKwkJaSA9IDE7CisJCWlmIChMb3dlckNoYW5uZWwgPiAyKQorCQl7CisJCQlFQ2hhbm5lbFsxXSA9IExvd2VyQ2hhbm5lbCAtIDI7CisJCQlpID0gMjsKKwkJCWlmIChMb3dlckNoYW5uZWwgPiAzKQorCQkJeworCQkJCUVDaGFubmVsWzJdID0gTG93ZXJDaGFubmVsIC0gMzsKKwkJCQlpID0gMzsKKwkJCX0KKwkJfQorCX0KKwkvLyBSZWNvcmQgY2hhbm5lbHMgdGhhdCBpcyBiZXR3ZWVuICBsb3dlciBjaGFubmVsIGFuZCB1cHBlciBjaGFubmVsLgorCWZvciAoayA9IExvd2VyQ2hhbm5lbDtrIDwgVXBwZXJDaGFubmVsO2srKykKKwl7CisJCUVDaGFubmVsW2ldID0gazsKKwkJaSsrOworCX0KKwkvLyBSZWNvcmQgY2hhbm5lbHMgdGhhdCBpcyBhYm92ZSB1cHBlciBjaGFubmVsLi4KKwlpZiAoTG93ZXJDaGFubmVsIDwgMTEpCisJeworCQlFQ2hhbm5lbFtpXSA9IFVwcGVyQ2hhbm5lbCArIDE7CisJCWkrKzsKKwkJaWYgKExvd2VyQ2hhbm5lbCA8IDEwKQorCQl7CisJCQlFQ2hhbm5lbFtpXSA9IExvd2VyQ2hhbm5lbCArIDI7CisJCQlpKys7CisJCQlpZiAoTG93ZXJDaGFubmVsIDwgOSkKKwkJCXsKKwkJCQlFQ2hhbm5lbFtpXSA9IExvd2VyQ2hhbm5lbCArIDM7CisJCQkJaSsrOworCQkJfQorCQl9CisJfQorCS8vCisJZm9yIChqID0gMDtqIDwgaTtqKyspCisJeworCQlmb3IgKGsgPSAwO2sgPCBwQWQtPkNoYW5uZWxMaXN0TnVtO2srKykKKwkJeworCQkJaWYgKHBBZC0+Q2hhbm5lbExpc3Rba10uQ2hhbm5lbCA9PSBFQ2hhbm5lbFtqXSkKKwkJCXsKKwkJCQlwQWQtPkNoYW5uZWxMaXN0W2tdLmJFZmZlY3RlZENoYW5uZWwgPSBUUlVFOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiIEVmZmVjdGVkQ2hhbm5lbCggPSVkKVxuIiwgRUNoYW5uZWxbal0pKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KK30KKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK0JPT0xFQU4gU2NhblJ1bm5pbmcoCisJCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCXJldHVybiAocEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9PSBTQ0FOX0xJU1RFTikgPyBUUlVFIDogRkFMU0U7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3dwYS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvd3BhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc0YzY1NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3dwYS5jCkBAIC0wLDAgKzEsMjA4NiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwl3cGEuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUphbglMZWUJCTAzLTA3LTIyCQlJbml0aWFsCisJUGF1bCBMaW4JMDMtMTEtMjgJCU1vZGlmeSBmb3Igc3VwcGxpY2FudAorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworI2RlZmluZQkJV1BBUlNOSUUJMHhkZAorI2RlZmluZQkJV1BBMlJTTklFCTB4MzAKKworLy9leHRlcm4gVUNIQVIgQklUOFtdOworVUNIQVIJQ2lwaGVyV3BhUHNrVGtpcFtdID0geworCQkweERELCAweDE2LAkJCQkvLyBSU04gSUUKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwJLy8gb3VpCisJCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLy8gTXVsdGljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIE51bWJlciBvZiB1bmljYXN0CisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8vIHVuaWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAorCQkweDAwLCAweDUwLCAweGYyLCAweDAyCS8vIGF1dGhlbnRpY2F0aW9uCisJCX07CitVQ0hBUglDaXBoZXJXcGFQc2tUa2lwTGVuID0gKHNpemVvZihDaXBoZXJXcGFQc2tUa2lwKSAvIHNpemVvZihVQ0hBUikpOworCitVQ0hBUglDaXBoZXJXcGFQc2tBZXNbXSA9IHsKKwkJMHhERCwgMHgxNiwgCQkJLy8gUlNOIElFCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEsCS8vIG91aQorCQkweDAxLCAweDAwLAkJCQkvLyBWZXJzaW9uCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDQsCS8vIE11bHRpY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBOdW1iZXIgb2YgdW5pY2FzdAorCQkweDAwLCAweDUwLCAweGYyLCAweDA0LAkvLyB1bmljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMgkvLyBhdXRoZW50aWNhdGlvbgorCQl9OworVUNIQVIJQ2lwaGVyV3BhUHNrQWVzTGVuID0gKHNpemVvZihDaXBoZXJXcGFQc2tBZXMpIC8gc2l6ZW9mKFVDSEFSKSk7CisKK1VDSEFSCUNpcGhlclN1aXRlQ2lzY29DQ0tNW10gPSB7CisJCTB4REQsIDB4MTYsCQkJCS8vIFJTTiBJRQorCQkweDAwLCAweDUwLCAweGYyLCAweDAxLCAvLyBvdWkKKwkJMHgwMSwgMHgwMCwJCQkJLy8gVmVyc2lvbgorCQkweDAwLCAweDQwLCAweDk2LCAweDAxLCAvLyBNdWx0aWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gTnVtYmVyIG9mIHVpY2FzdAorCQkweDAwLCAweDQwLCAweDk2LCAweDAxLCAvLyB1bmljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QKKwkJMHgwMCwgMHg0MCwgMHg5NiwgMHgwMCAgLy8gQXV0aGVudGljYXRpb24KKwkJfTsKK1VDSEFSCUNpcGhlclN1aXRlQ2lzY29DQ0tNTGVuID0gKHNpemVvZihDaXBoZXJTdWl0ZUNpc2NvQ0NLTSkgLyBzaXplb2YoVUNIQVIpKTsKKworVUNIQVIJQ2lwaGVyU3VpdGVDaXNjb0NDS00yNFtdID0geworCQkweERELCAweDE4LAkJCQkvLyBSU04gSUUKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwgLy8gb3VpCisJCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KKwkJMHgwMCwgMHg0MCwgMHg5NiwgMHgwMSwgLy8gTXVsdGljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIE51bWJlciBvZiB1aWNhc3QKKwkJMHgwMCwgMHg0MCwgMHg5NiwgMHgwMSwgLy8gdW5pY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBudW1iZXIgb2YgYXV0aGVudGljYXRpb24gbWV0aG9kCisJCTB4MDAsIDB4NDAsIDB4OTYsIDB4MDAsCisJCTB4MjgsIDB4MDAvLyBBdXRoZW50aWNhdGlvbgorCQl9OworCitVQ0hBUglDaXBoZXJTdWl0ZUNpc2NvQ0NLTTI0TGVuID0gKHNpemVvZihDaXBoZXJTdWl0ZUNpc2NvQ0NLTTI0KSAvIHNpemVvZihVQ0hBUikpOworCitVQ0hBUglDaXBoZXJTdWl0ZUNDWFRraXBbXSA9IHsKKwkJMHhERCwgMHgxNiwJCQkJLy8gUlNOIElFCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEsCS8vIG91aQorCQkweDAxLCAweDAwLAkJCQkvLyBWZXJzaW9uCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8vIE11bHRpY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBOdW1iZXIgb2YgdW5pY2FzdAorCQkweDAwLCAweDUwLCAweGYyLCAweDAyLAkvLyB1bmljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMQkvLyBhdXRoZW50aWNhdGlvbgorCQl9OworVUNIQVIJQ2lwaGVyU3VpdGVDQ1hUa2lwTGVuID0gKHNpemVvZihDaXBoZXJTdWl0ZUNDWFRraXApIC8gc2l6ZW9mKFVDSEFSKSk7CisKK1VDSEFSCUNDWF9MTENfSERSW10gPSB7MHhBQSwgMHhBQSwgMHgwMywgMHgwMCwgMHg0MCwgMHg5NiwgMHgwMCwgMHgwMn07CitVQ0hBUglMTENfTk9STUFMW10gPSB7MHhBQSwgMHhBQSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMH07CisKK1VDSEFSCUVBUE9MX0ZSQU1FW10gPSB7MHg4OCwgMHg4RX07CisKK0JPT0xFQU4gQ2hlY2tSU05JRSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEYXRhLAorCUlOICBVQ0hBUiAgICAgICAgICAgRGF0YUxlbiwKKwlPVVQJVUNIQVIJCQkqT2Zmc2V0KTsKKwordm9pZCBpbmNfYnl0ZV9hcnJheShVQ0hBUiAqY291bnRlciwgaW50IGxlbik7CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDbGFzc2lmeSBXUEEgRUFQIG1lc3NhZ2UgdHlwZQorCisJQXJndW1lbnRzOgorCQlFQVBUeXBlCQlWYWx1ZSBvZiBFQVAgbWVzc2FnZSB0eXBlCisJCU1zZ1R5cGUJCUludGVybmFsIE1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgTUxNRSBzdGF0ZSBtYWNoaW5lCisKKwlSZXR1cm4gVmFsdWU6CisJCVRSVUUJCUZvdW5kIGFwcHJvcHJpYXRlIG1lc3NhZ2UgdHlwZQorCQlGQUxTRQkJTm8gYXBwcm9wcmlhdGUgbWVzc2FnZSB0eXBlCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisJCUFsbCB0aGVzZSBjb25zdGFudHMgYXJlIGRlZmluZWQgaW4gd3BhLmgKKwkJRm9yIHN1cHBsaWNhbnQsIHRoZXJlIGlzIG9ubHkgRUFQT0wgS2V5IG1lc3NhZ2UgYXZhbGlhYmxlCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOCVdwYU1zZ1R5cGVTdWJzdCgKKwlJTglVQ0hBUglFQVBUeXBlLAorCU9VVAlJTlQJCSpNc2dUeXBlKQoreworCXN3aXRjaCAoRUFQVHlwZSkKKwl7CisJCWNhc2UgRUFQUGFja2V0OgorCQkJKk1zZ1R5cGUgPSBNVDJfRUFQUGFja2V0OworCQkJYnJlYWs7CisJCWNhc2UgRUFQT0xTdGFydDoKKwkJCSpNc2dUeXBlID0gTVQyX0VBUE9MU3RhcnQ7CisJCQlicmVhazsKKwkJY2FzZSBFQVBPTExvZ29mZjoKKwkJCSpNc2dUeXBlID0gTVQyX0VBUE9MTG9nb2ZmOworCQkJYnJlYWs7CisJCWNhc2UgRUFQT0xLZXk6CisJCQkqTXNnVHlwZSA9IE1UMl9FQVBPTEtleTsKKwkJCWJyZWFrOworCQljYXNlIEVBUE9MQVNGQWxlcnQ6CisJCQkqTXNnVHlwZSA9IE1UMl9FQVBPTEFTRkFsZXJ0OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gRkFMU0U7CisJfQorCXJldHVybiBUUlVFOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCWFzc29jaWF0aW9uCXN0YXRlIG1hY2hpbmUgaW5pdCwJaW5jbHVkaW5nIHN0YXRlCXRyYW5zaXRpb24gYW5kIHRpbWVyIGluaXQKKwlQYXJhbWV0ZXJzOgorCQlTIC0JcG9pbnRlcgl0byB0aGUgYXNzb2NpYXRpb24gc3RhdGUgbWFjaGluZQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgV3BhUHNrU3RhdGVNYWNoaW5lSW5pdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglTVEFURV9NQUNISU5FICpTLAorCU9VVAlTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKK3sKKwlTdGF0ZU1hY2hpbmVJbml0KFMsCVRyYW5zLCBNQVhfV1BBX1BTS19TVEFURSwgTUFYX1dQQV9QU0tfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIFdQQV9QU0tfSURMRSwgV1BBX01BQ0hJTkVfQkFTRSk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFdQQV9QU0tfSURMRSwgTVQyX0VBUE9MS2V5LCAoU1RBVEVfTUFDSElORV9GVU5DKVdwYUVBUE9MS2V5QWN0aW9uKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIGlzCXN0YXRlIG1hY2hpbmUgZnVuY3Rpb24uCisJCVdoZW4gcmVjZWl2aW5nIEVBUE9MIHBhY2tldHMgd2hpY2ggaXMgIGZvciA4MDIuMXgga2V5IG1hbmFnZW1lbnQuCisJCVVzZQlib3RoIGluCVdQQSwgYW5kIFdQQVBTSwljYXNlLgorCQlJbiB0aGlzCWZ1bmN0aW9uLCBmdXJ0aGVyIGRpc3BhdGNoIHRvIGRpZmZlcmVudAlmdW5jdGlvbnMgYWNjb3JkaW5nCXRvIHRoZSByZWNlaXZlZAlwYWNrZXQuCSAzIGNhdGVnb3JpZXMgYXJlIDoKKwkJICAxLiAgbm9ybWFsIDQtd2F5IHBhaXJ3aXNla2V5IGFuZCAyLXdheSBncm91cGtleSBoYW5kc2hha2UKKwkJICAyLiAgTUlDIGVycm9yCShDb3VudGVybWVhc3VyZXMgYXR0YWNrKSAgcmVwb3J0IHBhY2tldAlmcm9tIFNUQS4KKwkJICAzLiAgUmVxdWVzdCBmb3IgcGFpcndpc2UvZ3JvdXAga2V5IHVwZGF0ZQlmcm9tIFNUQQorCVJldHVybjoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgV3BhRUFQT0xLZXlBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTUxNRV9RVUVVRV9FTEVNCSpFbGVtKQorCit7CisJSU5UICAgICAgICAgICAgIE1zZ1R5cGUgPSBFQVBPTF9NU0dfSU5WQUxJRDsKKwlQS0VZX0RFU0NSSVBURVIgcEtleURlc2M7CisJUEhFQURFUl84MDJfMTEgIHBIZWFkZXI7IC8vcmVkCisJVUNIQVIgICAgICAgICAgIFplcm9SZXBsYXlbTEVOX0tFWV9ERVNDX1JFUExBWV07CisJVUNIQVIgRWFwb2xWcjsKKwlLRVlfSU5GTwkJcGVlcktleUluZm87CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLS0tLT4gV3BhRUFQT0xLZXlBY3Rpb25cbiIpKTsKKworCS8vIEdldCA4MDIuMTEgaGVhZGVyIGZpcnN0CisJcEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkgRWxlbS0+TXNnOworCisJLy8gR2V0IEVBUG9MLUtleSBEZXNjcmlwdG9yCisJcEtleURlc2MgPSAoUEtFWV9ERVNDUklQVEVSKSAmRWxlbS0+TXNnWyhMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0ggKyBMRU5HVEhfRUFQT0xfSCldOworCisJTmRpc1plcm9NZW1vcnkoKFBVQ0hBUikmcGVlcktleUluZm8sIHNpemVvZihwZWVyS2V5SW5mbykpOworCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpJnBlZXJLZXlJbmZvLCAoUFVDSEFSKSZwS2V5RGVzYy0+S2V5SW5mbywgc2l6ZW9mKEtFWV9JTkZPKSk7CisKKwkqKChVU0hPUlQgKikmcGVlcktleUluZm8pID0gY3B1MmxlMTYoKigoVVNIT1JUICopJnBlZXJLZXlJbmZvKSk7CisKKworCS8vIDEuIENoZWNrIEVBUE9MIGZyYW1lIHZlcnNpb24gYW5kIHR5cGUKKwlFYXBvbFZyCT0gKFVDSEFSKSBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMStMRU5HVEhfODAyXzFfSF07CisKKyAgICBpZiAoKChFYXBvbFZyICE9IEVBUE9MX1ZFUikgJiYgKEVhcG9sVnIgIT0gRUFQT0xfVkVSMikpIHx8ICgocEtleURlc2MtPlR5cGUgIT0gV1BBMV9LRVlfREVTQykgJiYgKHBLZXlEZXNjLT5UeXBlICE9IFdQQTJfS0VZX0RFU0MpKSkKKwl7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIktleSBkZXNjcmlwdGVyIGRvZXMgbm90IG1hdGNoIHdpdGggV1BBIHJ1bGVcbiIpKTsKKwkJCXJldHVybjsKKwl9CisKKwkvLyBGaXJzdCB2YWxpZGF0ZSByZXBsYXkgY291bnRlciwgb25seSBhY2NlcHQgbWVzc2FnZSB3aXRoIGxhcmdlciByZXBsYXkgY291bnRlcgorCS8vIExldCBlcXVhbCBwYXNzLCBzb21lIEFQIHN0YXJ0IHdpdGggYWxsIHplcm8gcmVwbGF5IGNvdW50ZXIKKwlOZGlzWmVyb01lbW9yeShaZXJvUmVwbGF5LCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCWlmKChSVE1QQ29tcGFyZU1lbW9yeShwS2V5RGVzYy0+UmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSkgIT0gMSkgJiYKKwkJKFJUTVBDb21wYXJlTWVtb3J5KHBLZXlEZXNjLT5SZXBsYXlDb3VudGVyLCBaZXJvUmVwbGF5LCBMRU5fS0VZX0RFU0NfUkVQTEFZKSAhPSAwKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiAgIFJlcGxheUNvdW50ZXIgbm90IG1hdGNoICAgXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwkvLyBQcm9jZXNzIFdQQTJQU0sgZnJhbWUKKwlpZihwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQorCXsKKwkJaWYoKHBlZXJLZXlJbmZvLktleVR5cGUgPT0gUEFJUldJU0VLRVkpICYmCisJCQkocGVlcktleUluZm8uRUtEX0RMID09IDApICYmCisJCQkocGVlcktleUluZm8uS2V5QWNrID09IDEpICYmCisJCQkocGVlcktleUluZm8uS2V5TWljID09IDApICYmCisJCQkocGVlcktleUluZm8uU2VjdXJlID09IDApICYmCisJCQkocGVlcktleUluZm8uRXJyb3IgPT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5SZXF1ZXN0ID09IDApKQorCQl7CisJCQlNc2dUeXBlID0gRUFQT0xfUEFJUl9NU0dfMTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQT0wgS2V5IFBhaXJ3aXNlIE1lc3NhZ2UgMVxuIikpOworCQl9IGVsc2UgaWYoKHBlZXJLZXlJbmZvLktleVR5cGUgPT0gUEFJUldJU0VLRVkpICYmCisJCQkocGVlcktleUluZm8uRUtEX0RMICA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleUFjayA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleU1pYyA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLlNlY3VyZSA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLkVycm9yID09IDApICYmCisJCQkocGVlcktleUluZm8uUmVxdWVzdCA9PSAwKSkKKwkJeworCQkJTXNnVHlwZSA9IEVBUE9MX1BBSVJfTVNHXzM7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUE9MIEtleSBQYWlyd2lzZSBNZXNzYWdlIDNcbiIpKTsKKwkJfSBlbHNlIGlmKChwZWVyS2V5SW5mby5LZXlUeXBlID09IEdST1VQS0VZKSAmJgorCQkJKHBlZXJLZXlJbmZvLkVLRF9ETCA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleUFjayA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleU1pYyA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLlNlY3VyZSA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLkVycm9yID09IDApICYmCisJCQkocGVlcktleUluZm8uUmVxdWVzdCA9PSAwKSkKKwkJeworCQkJTXNnVHlwZSA9IEVBUE9MX0dST1VQX01TR18xOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTCBLZXkgR3JvdXAgTWVzc2FnZSAxXG4iKSk7CisJCX0KKworCQkvLyBXZSB3aWxsIGFzc3VtZSBsaW5rIGlzIHVwIChhc3NvYyBzdWNlZXNzIGFuZCBwb3J0IG5vdCBzZWN1cmVkKS4KKwkJLy8gQWxsIHN0YXRlIGhhcyB0byBiZSBhYmxlIHRvIHByb2Nlc3MgbWVzc2FnZSBmcm9tIHByZXZpb3VzIHN0YXRlCisJCXN3aXRjaChwQWQtPlN0YUNmZy5XcGFTdGF0ZSkKKwkJeworCQljYXNlIFNTX1NUQVJUOgorCQkJaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xKQorCQkJeworCQkJCVdwYTJQYWlyTXNnMUFjdGlvbihwQWQsIEVsZW0pOworCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfV0FJVF9NU0dfMzsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU1NfV0FJVF9NU0dfMzoKKwkJCWlmKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMSkKKwkJCXsKKwkJCQlXcGEyUGFpck1zZzFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1dBSVRfTVNHXzM7CisJCQl9CisJCQllbHNlIGlmKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykKKwkJCXsKKwkJCQlXcGEyUGFpck1zZzNBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1dBSVRfR1JPVVA7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNTX1dBSVRfR1JPVVA6CQkvLyBXaGVuIGRvaW5nIGdyb3VwIGtleSBleGNoYW5nZQorCQljYXNlIFNTX0ZJTklTSDoJCQkvLyBUaGlzIGhhcHBlbmVkIHdoZW4gdXBkYXRlIGdyb3VwIGtleQorCQkJaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xKQorCQkJeworCQkJICAgIC8vIFJlc2V0IHBvcnQgc2VjdXJlZCB2YXJpYWJsZQorCQkJCXBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworCQkJCVdwYTJQYWlyTXNnMUFjdGlvbihwQWQsIEVsZW0pOworCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfV0FJVF9NU0dfMzsKKwkJCX0KKwkJCWVsc2UgaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKQorCQkJeworCQkJICAgIC8vIFJlc2V0IHBvcnQgc2VjdXJlZCB2YXJpYWJsZQorCQkJCXBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworCQkJCVdwYTJQYWlyTXNnM0FjdGlvbihwQWQsIEVsZW0pOworCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfV0FJVF9HUk9VUDsKKwkJCX0KKwkJCWVsc2UgaWYoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkKKwkJCXsKKwkJCQlXcGFHcm91cE1zZzFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX0ZJTklTSDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKwkvLyBQcm9jZXNzIFdQQVBTSyBGcmFtZQorCS8vIENsYXNzaWZ5IG1lc3NhZ2UgVHlwZSwgZWl0aGVyIHBhaXJ3aXNlIG1lc3NhZ2UgMSwgMywgb3IgZ3JvdXAgbWVzc2FnZSAxIGZvciBzdXBwbGljYW50CisJZWxzZSBpZihwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spCisJeworCQlpZigocGVlcktleUluZm8uS2V5VHlwZSA9PSBQQUlSV0lTRUtFWSkgJiYKKwkJCShwZWVyS2V5SW5mby5LZXlJbmRleCA9PSAwKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleUFjayA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleU1pYyA9PSAwKSAmJgorCQkJKHBlZXJLZXlJbmZvLlNlY3VyZSA9PSAwKSAmJgorCQkJKHBlZXJLZXlJbmZvLkVycm9yID09IDApICYmCisJCQkocGVlcktleUluZm8uUmVxdWVzdCA9PSAwKSkKKwkJeworCQkJTXNnVHlwZSA9IEVBUE9MX1BBSVJfTVNHXzE7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUE9MIEtleSBQYWlyd2lzZSBNZXNzYWdlIDFcbiIpKTsKKwkJfQorCQllbHNlIGlmKChwZWVyS2V5SW5mby5LZXlUeXBlID09IFBBSVJXSVNFS0VZKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleUluZGV4ID09IDApICYmCisJCQkocGVlcktleUluZm8uS2V5QWNrID09IDEpICYmCisJCQkocGVlcktleUluZm8uS2V5TWljID09IDEpICYmCisJCQkocGVlcktleUluZm8uU2VjdXJlID09IDApICYmCisJCQkocGVlcktleUluZm8uRXJyb3IgPT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5SZXF1ZXN0ID09IDApKQorCQl7CisJCQlNc2dUeXBlID0gRUFQT0xfUEFJUl9NU0dfMzsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQT0wgS2V5IFBhaXJ3aXNlIE1lc3NhZ2UgM1xuIikpOworCQl9CisJCWVsc2UgaWYoKHBlZXJLZXlJbmZvLktleVR5cGUgPT0gR1JPVVBLRVkpICYmCisJCQkocGVlcktleUluZm8uS2V5SW5kZXggIT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5LZXlBY2sgPT0gMSkgJiYKKwkJCShwZWVyS2V5SW5mby5LZXlNaWMgPT0gMSkgJiYKKwkJCShwZWVyS2V5SW5mby5TZWN1cmUgPT0gMSkgJiYKKwkJCShwZWVyS2V5SW5mby5FcnJvciA9PSAwKSAmJgorCQkJKHBlZXJLZXlJbmZvLlJlcXVlc3QgPT0gMCkpCisJCXsKKwkJCU1zZ1R5cGUgPSBFQVBPTF9HUk9VUF9NU0dfMTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQT0wgS2V5IEdyb3VwIE1lc3NhZ2UgMVxuIikpOworCQl9CisKKwkJLy8gV2Ugd2lsbCBhc3N1bWUgbGluayBpcyB1cCAoYXNzb2Mgc3VjZWVzcyBhbmQgcG9ydCBub3Qgc2VjdXJlZCkuCisJCS8vIEFsbCBzdGF0ZSBoYXMgdG8gYmUgYWJsZSB0byBwcm9jZXNzIG1lc3NhZ2UgZnJvbSBwcmV2aW91cyBzdGF0ZQorCQlzd2l0Y2gocEFkLT5TdGFDZmcuV3BhU3RhdGUpCisJCXsKKwkJY2FzZSBTU19TVEFSVDoKKwkJCWlmKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMSkKKwkJCXsKKwkJCQlXcGFQYWlyTXNnMUFjdGlvbihwQWQsIEVsZW0pOworCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfV0FJVF9NU0dfMzsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU1NfV0FJVF9NU0dfMzoKKwkJCWlmKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMSkKKwkJCXsKKwkJCQlXcGFQYWlyTXNnMUFjdGlvbihwQWQsIEVsZW0pOworCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfV0FJVF9NU0dfMzsKKwkJCX0KKwkJCWVsc2UgaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKQorCQkJeworCQkJCVdwYVBhaXJNc2czQWN0aW9uKHBBZCwgRWxlbSk7CisJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX0dST1VQOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTU19XQUlUX0dST1VQOgkJLy8gV2hlbiBkb2luZyBncm91cCBrZXkgZXhjaGFuZ2UKKwkJY2FzZSBTU19GSU5JU0g6CQkJLy8gVGhpcyBoYXBwZW5lZCB3aGVuIHVwZGF0ZSBncm91cCBrZXkKKwkJCWlmKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMSkKKwkJCXsKKwkJCQlXcGFQYWlyTXNnMUFjdGlvbihwQWQsIEVsZW0pOworCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfV0FJVF9NU0dfMzsKKwkJCQkvLyBSZXNldCBwb3J0IHNlY3VyZWQgdmFyaWFibGUKKwkJCQlwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKwkJCX0KKwkJCWVsc2UgaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKQorCQkJeworCQkJCVdwYVBhaXJNc2czQWN0aW9uKHBBZCwgRWxlbSk7CisJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX0dST1VQOworCQkJCS8vIFJlc2V0IHBvcnQgc2VjdXJlZCB2YXJpYWJsZQorCQkJCXBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworCQkJfQorCQkJZWxzZSBpZihNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKQorCQkJeworCQkJCVdwYUdyb3VwTXNnMUFjdGlvbihwQWQsIEVsZW0pOworCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfRklOSVNIOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tLS0tIFdwYUVBUE9MS2V5QWN0aW9uXG4iKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlQcm9jZXNzIFBhaXJ3aXNlIGtleSA0LXdheSBoYW5kc2hha2luZworCisJQXJndW1lbnRzOgorCQlwQWQJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgorCQlFbGVtCQlNZXNzYWdlIGJvZHkKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJV3BhUGFpck1zZzFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlQSEVBREVSXzgwMl8xMSAgICAgIHBIZWFkZXI7CisJVUNIQVIJCQkJKm1wb29sLCAqUFRLLCAqZGlnZXN0OworCVBVQ0hBUiAgICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJVUNIQVIgICAgICAgICAgICAgICBIZWFkZXI4MDJfM1sxNF07CisJVUxPTkcgICAgICAgICAgICAgICBGcmFtZUxlbiA9IDA7CisJUEVBUE9MX1BBQ0tFVCAgICAgICBwTXNnMTsKKwlFQVBPTF9QQUNLRVQgICAgICAgIFBhY2tldDsKKwlVQ0hBUiAgICAgICAgICAgICAgIE1pY1sxNl07CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGFQYWlyTXNnMUFjdGlvbiAtLS0tLT5cbiIpKTsKKworCS8vIGFsbG9jYXRlIG1lbW9yeSBwb29sCisJb3NfYWxsb2NfbWVtKHBBZCwgKFBVQ0hBUiAqKSZtcG9vbCwgMjU2KTsKKworCWlmIChtcG9vbCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvLyBQVEsgTGVuID0gODAuCisJUFRLID0gKFVDSEFSICopIFJPVU5EX1VQKG1wb29sLCA0KTsKKwkvLyBkaWdlc3QgTGVuID0gODAuCisJZGlnZXN0ID0gKFVDSEFSICopIFJPVU5EX1VQKFBUSyArIDgwLCA0KTsKKworCXBIZWFkZXIgPSAoUEhFQURFUl84MDJfMTEpIEVsZW0tPk1zZzsKKworCS8vIFByb2Nlc3MgbWVzc2FnZSAxIGZyb20gYXV0aGVudGljYXRvcgorCXBNc2cxID0gKFBFQVBPTF9QQUNLRVQpICZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IXTsKKworCS8vIDEuIFNhdmUgUmVwbGF5IGNvdW50ZXIsIGl0IHdpbGwgdXNlIHRvIHZlcmlmeSBtZXNzYWdlIDMgYW5kIGNvbnN0cnVjdCBtZXNzYWdlIDIKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBwTXNnMS0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCS8vIDIuIFNhdmUgQU5vbmNlCisJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuQU5vbmNlLCBwTXNnMS0+S2V5RGVzYy5LZXlOb25jZSwgTEVOX0tFWV9ERVNDX05PTkNFKTsKKworCS8vIEdlbmVyYXRlIHJhbmRvbSBTTm9uY2UKKwlHZW5SYW5kb20ocEFkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPlN0YUNmZy5TTm9uY2UpOworCisJLy8gQ2FsYyBQVEsoQU5vbmNlLCBTTm9uY2UpCisJV3BhQ291bnRQVEsocEFkLAorCQlwQWQtPlN0YUNmZy5QTUssCisJCXBBZC0+U3RhQ2ZnLkFOb25jZSwKKwkJcEFkLT5Db21tb25DZmcuQnNzaWQsCisJCXBBZC0+U3RhQ2ZnLlNOb25jZSwKKwkJcEFkLT5DdXJyZW50QWRkcmVzcywKKwkJUFRLLAorCQlMRU5fUFRLKTsKKworCS8vIFNhdmUga2V5IHRvIFBUSyBlbnRyeQorCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlBUSywgUFRLLCBMRU5fUFRLKTsKKworCS8vIGluaXQgODAyLjMgaGVhZGVyIGFuZCBGaWxsIFBhY2tldAorCU1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgRUFQT0wpOworCisJLy8gWmVybyBNZXNzYWdlIDIgYm9keQorCU5kaXNaZXJvTWVtb3J5KCZQYWNrZXQsIHNpemVvZihQYWNrZXQpKTsKKwlQYWNrZXQuUHJvVmVyCT0gRUFQT0xfVkVSOworCVBhY2tldC5Qcm9UeXBlCT0gRUFQT0xLZXk7CisJLy8KKwkvLyBNZXNzYWdlIDIgYXMgIEVBUE9MLUtleSgwLDEsMCwwLDAsUCwwLFNOb25jZSxNSUMsUlNOIElFKQorCS8vCisJUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTFfS0VZX0RFU0M7CisJLy8gMS4gS2V5IGRlc2NyaXB0b3IgdmVyc2lvbiBhbmQgYXBwcm9wcmlhdGUgUlNOIElFCisJaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzICA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gMjsKKwl9CisJZWxzZQkgIC8vIFRLSVAKKwl7CisJCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9IDE7CisJfQorCisJLy8gZmlsbCBpbiBEYXRhIE1hdGVyaWFsIGFuZCBpdHMgbGVuZ3RoCisJUGFja2V0LktleURlc2MuS2V5RGF0YVswXSA9IElFX1dQQTsKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzFdID0gcEFkLT5TdGFDZmcuUlNOSUVfTGVuOworCVBhY2tldC5LZXlEZXNjLktleURhdGFMZW5bMV0gPSBwQWQtPlN0YUNmZy5SU05JRV9MZW4gKyAyOworCU5kaXNNb3ZlTWVtb3J5KCZQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzJdLCBwQWQtPlN0YUNmZy5SU05fSUUsIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbik7CisKKwkvLyBVcGRhdGUgcGFja2V0IGxlbmd0aCBhZnRlciBkZWNpZGUgS2V5IGRhdGEgcGF5bG9hZAorCVBhY2tldC5Cb2R5X0xlblsxXSAgPSBzaXplb2YoS0VZX0RFU0NSSVBURVIpIC0gTUFYX0xFTl9PRl9SU05JRSArIFBhY2tldC5LZXlEZXNjLktleURhdGFMZW5bMV07CisKKwkvLyBVcGRhdGUgS2V5IGxlbmd0aAorCVBhY2tldC5LZXlEZXNjLktleUxlbmd0aFswXSA9IHBNc2cxLT5LZXlEZXNjLktleUxlbmd0aFswXTsKKwlQYWNrZXQuS2V5RGVzYy5LZXlMZW5ndGhbMV0gPSBwTXNnMS0+S2V5RGVzYy5LZXlMZW5ndGhbMV07CisJLy8gMi4gS2V5IFR5cGUgUGVlcktleQorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5VHlwZSA9IFBBSVJXSVNFS0VZOworCisJLy8gMy4gS2V5TWljIGZpZWxkIHByZXNlbnRlZAorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5TWljICA9IDE7CisKKwkvL0NvbnZlcnQgdG8gbGl0dGxlLWVuZGlhbiBmb3JtYXQuCisJKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pID0gY3B1MmxlMTYoKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pKTsKKworCisJLy8gNC4gRmlsbCBTTm9uY2UKKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlOb25jZSwgcEFkLT5TdGFDZmcuU05vbmNlLCBMRU5fS0VZX0RFU0NfTk9OQ0UpOworCisJLy8gNS4gS2V5IFJlcGxheSBDb3VudAorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLy8gU2VuZCBFQVBPTCgwLCAxLCAwLCAwLCAwLCBQLCAwLCBTTm9uY2UsIE1JQywgUlNOX0lFKQorCS8vIE91dCBidWZmZXIgZm9yIHRyYW5zbWl0dGluZyBtZXNzYWdlIDIKKwlNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFVDSEFSICopJnBPdXRCdWZmZXIpOyAgLy8gYWxsb2NhdGUgbWVtb3J5CisJaWYocE91dEJ1ZmZlciA9PSBOVUxMKQorCXsKKwkJb3NfZnJlZV9tZW0ocEFkLCBtcG9vbCk7CisJCXJldHVybjsKKwl9CisJLy8gUHJlcGFyZSBFQVBPTCBmcmFtZSBmb3IgTUlDIGNhbGN1bGF0aW9uCisJLy8gQmUgY2FyZWZ1bCwgb25seSBFQVBPTCBmcmFtZSBpcyBjb3VudGVkIGZvciBNSUMgY2FsY3VsYXRpb24KKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAorCQlQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAgICAmUGFja2V0LAorCQlFTkRfT0ZfQVJHUyk7CisKKwkvLyA2LiBQcmVwYXJlIGFuZCBGaWxsIE1JQyB2YWx1ZQorCU5kaXNaZXJvTWVtb3J5KE1pYywgc2l6ZW9mKE1pYykpOworCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CS8vIEFFUworCisJCUhNQUNfU0hBMShwT3V0QnVmZmVyLCBGcmFtZUxlbiwgUFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7CisJCU5kaXNNb3ZlTWVtb3J5KE1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKKwl9CisJZWxzZQorCXsJLy8gVEtJUAorCQlobWFjX21kNShQVEssICBMRU5fRUFQX01JQ0ssIHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBNaWMpOworCX0KKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKwkvL2hleF9kdW1wKCJNSUMiLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAJJkZyYW1lTGVuLAorCQkJICAJCQlMRU5HVEhfODAyXzMsICAgICAJCQkmSGVhZGVyODAyXzMsCisJCQkJCQlQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAgICAmUGFja2V0LAorCQkJCQkJRU5EX09GX0FSR1MpOworCisKKwkvLyA1LiBDb3B5IGZyYW1lIHRvIFR4IHJpbmcgYW5kIHNlbmQgTXNnIDIgdG8gYXV0aGVudGljYXRvcgorCVJUTVBUb1dpcmVsZXNzU3RhKHBBZCwgSGVhZGVyODAyXzMsIExFTkdUSF84MDJfMywgKFBVQ0hBUikmUGFja2V0LCBQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCBUUlVFKTsKKworCU1sbWVGcmVlTWVtb3J5KHBBZCwgKFBVQ0hBUilwT3V0QnVmZmVyKTsKKwlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhUGFpck1zZzFBY3Rpb24gPC0tLS0tXG4iKSk7Cit9CisKK1ZPSUQgV3BhMlBhaXJNc2cxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJUEhFQURFUl84MDJfMTEgICAgICBwSGVhZGVyOworCVVDSEFSCQkJCSptcG9vbCwgKlBUSywgKmRpZ2VzdDsKKwlQVUNIQVIgICAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworCVVDSEFSICAgICAgICAgICAgICAgSGVhZGVyODAyXzNbMTRdOworCVVMT05HICAgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOworCVBFQVBPTF9QQUNLRVQgICAgICAgcE1zZzE7CisJRUFQT0xfUEFDS0VUICAgICAgICBQYWNrZXQ7CisJVUNIQVIgICAgICAgICAgICAgICBNaWNbMTZdOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhMlBhaXJNc2cxQWN0aW9uIC0tLS0tPlxuIikpOworCisJLy8gYWxsb2NhdGUgbWVtb3J5IHBvb2wKKwlvc19hbGxvY19tZW0ocEFkLCAoUFVDSEFSICopJm1wb29sLCAyNTYpOworCisJaWYgKG1wb29sID09IE5VTEwpCisJCXJldHVybjsKKworCS8vIFBUSyBMZW4gPSA4MC4KKwlQVEsgPSAoVUNIQVIgKikgUk9VTkRfVVAobXBvb2wsIDQpOworCS8vIGRpZ2VzdCBMZW4gPSA4MC4KKwlkaWdlc3QgPSAoVUNIQVIgKikgUk9VTkRfVVAoUFRLICsgODAsIDQpOworCisJcEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkgRWxlbS0+TXNnOworCisJLy8gUHJvY2VzcyBtZXNzYWdlIDEgZnJvbSBhdXRoZW50aWNhdG9yCisJCXBNc2cxID0gKFBFQVBPTF9QQUNLRVQpCSZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IXTsKKworCS8vIDEuIFNhdmUgUmVwbGF5IGNvdW50ZXIsIGl0IHdpbGwgdXNlIHRvIHZlcmlmeSBtZXNzYWdlIDMgYW5kIGNvbnN0cnVjdCBtZXNzYWdlIDIKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBwTXNnMS0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCS8vIDIuIFNhdmUgQU5vbmNlCisJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuQU5vbmNlLCBwTXNnMS0+S2V5RGVzYy5LZXlOb25jZSwgTEVOX0tFWV9ERVNDX05PTkNFKTsKKworCS8vIEdlbmVyYXRlIHJhbmRvbSBTTm9uY2UKKwlHZW5SYW5kb20ocEFkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPlN0YUNmZy5TTm9uY2UpOworCisJaWYocE1zZzEtPktleURlc2MuS2V5RGF0YUxlblsxXSA+IDAgKQorCXsKKwkJLy8gY2FjaGVkIFBNS0lECisJfQorCisJLy8gQ2FsYyBQVEsoQU5vbmNlLCBTTm9uY2UpCisJV3BhQ291bnRQVEsocEFkLAorCQlwQWQtPlN0YUNmZy5QTUssCisJCXBBZC0+U3RhQ2ZnLkFOb25jZSwKKwkJcEFkLT5Db21tb25DZmcuQnNzaWQsCisJCXBBZC0+U3RhQ2ZnLlNOb25jZSwKKwkJcEFkLT5DdXJyZW50QWRkcmVzcywKKwkJUFRLLAorCQlMRU5fUFRLKTsKKworCS8vIFNhdmUga2V5IHRvIFBUSyBlbnRyeQorCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlBUSywgUFRLLCBMRU5fUFRLKTsKKworCS8vIGluaXQgODAyLjMgaGVhZGVyIGFuZCBGaWxsIFBhY2tldAorCU1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgRUFQT0wpOworCisJLy8gWmVybyBtZXNzYWdlIDIgYm9keQorCU5kaXNaZXJvTWVtb3J5KCZQYWNrZXQsIHNpemVvZihQYWNrZXQpKTsKKwlQYWNrZXQuUHJvVmVyCT0gRUFQT0xfVkVSOworCVBhY2tldC5Qcm9UeXBlCT0gRUFQT0xLZXk7CisJLy8KKwkvLyBNZXNzYWdlIDIgYXMgIEVBUE9MLUtleSgwLDEsMCwwLDAsUCwwLFNOb25jZSxNSUMsUlNOIElFKQorCS8vCisJUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTJfS0VZX0RFU0M7CisKKwkvLyAxLiBLZXkgZGVzY3JpcHRvciB2ZXJzaW9uIGFuZCBhcHByb3ByaWF0ZSBSU04gSUUKKwlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CisJCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9IDI7CisJfQorCWVsc2UJICAvLyBUS0lQCisJeworCQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPSAxOworCX0KKworCS8vIGZpbGwgaW4gRGF0YSBNYXRlcmlhbCBhbmQgaXRzIGxlbmd0aAorCVBhY2tldC5LZXlEZXNjLktleURhdGFbMF0gPSBJRV9XUEEyOworCVBhY2tldC5LZXlEZXNjLktleURhdGFbMV0gPSBwQWQtPlN0YUNmZy5SU05JRV9MZW47CisJUGFja2V0LktleURlc2MuS2V5RGF0YUxlblsxXSA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiArIDI7CisJTmRpc01vdmVNZW1vcnkoJlBhY2tldC5LZXlEZXNjLktleURhdGFbMl0sIHBBZC0+U3RhQ2ZnLlJTTl9JRSwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKKworCS8vIFVwZGF0ZSBwYWNrZXQgbGVuZ3RoIGFmdGVyIGRlY2lkZSBLZXkgZGF0YSBwYXlsb2FkCisJUGFja2V0LkJvZHlfTGVuWzFdICA9IHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFICsgUGFja2V0LktleURlc2MuS2V5RGF0YUxlblsxXTsKKworCS8vIDIuIEtleSBUeXBlIFBlZXJLZXkKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleVR5cGUgPSBQQUlSV0lTRUtFWTsKKworCS8vIDMuIEtleU1pYyBmaWVsZCBwcmVzZW50ZWQKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleU1pYyAgPSAxOworCisJLy8gVXBkYXRlIEtleSBMZW5ndGgKKwlQYWNrZXQuS2V5RGVzYy5LZXlMZW5ndGhbMF0gPSAwOworCVBhY2tldC5LZXlEZXNjLktleUxlbmd0aFsxXSA9IHBNc2cxLT5LZXlEZXNjLktleUxlbmd0aFsxXTsKKworCS8vIDQuIEZpbGwgU05vbmNlCisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5Tm9uY2UsIHBBZC0+U3RhQ2ZnLlNOb25jZSwgTEVOX0tFWV9ERVNDX05PTkNFKTsKKworCS8vIDUuIEtleSBSZXBsYXkgQ291bnQKKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCS8vIENvbnZlcnQgdG8gbGl0dGxlLWVuZGlhbiBmb3JtYXQuCisJKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pID0gY3B1MmxlMTYoKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pKTsKKworCS8vIFNlbmQgRUFQT0wtS2V5KDAsMSwwLDAsMCxQLDAsU05vbmNlLE1JQyxSU04gSUUpCisJLy8gT3V0IGJ1ZmZlciBmb3IgdHJhbnNtaXR0aW5nIG1lc3NhZ2UgMgorCU1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICAoUFVDSEFSICopJnBPdXRCdWZmZXIpOyAgLy8gYWxsb2NhdGUgbWVtb3J5CisJaWYocE91dEJ1ZmZlciA9PSBOVUxMKQorCXsKKwkJb3NfZnJlZV9tZW0ocEFkLCBtcG9vbCk7CisJCXJldHVybjsKKwl9CisKKwkvLyBQcmVwYXJlIEVBUE9MIGZyYW1lIGZvciBNSUMgY2FsY3VsYXRpb24KKwkvLyBCZSBjYXJlZnVsLCBvbmx5IEVBUE9MIGZyYW1lIGlzIGNvdW50ZWQgZm9yIE1JQyBjYWxjdWxhdGlvbgorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAmRnJhbWVMZW4sCisJCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICZQYWNrZXQsCisJCUVORF9PRl9BUkdTKTsKKworCS8vIDYuIFByZXBhcmUgYW5kIEZpbGwgTUlDIHZhbHVlCisJTmRpc1plcm9NZW1vcnkoTWljLCBzaXplb2YoTWljKSk7CisJaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJeworCQkvLyBBRVMKKwkJSE1BQ19TSEExKHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBQVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJTmRpc01vdmVNZW1vcnkoTWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKwllbHNlCisJeworCQlobWFjX21kNShQVEssICBMRU5fRUFQX01JQ0ssIHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBNaWMpOworCX0KKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKworCS8vIE1ha2UgIFRyYW5zbWl0dGluZyBmcmFtZQorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAJJkZyYW1lTGVuLAorCQkJICAJCQlMRU5HVEhfODAyXzMsICAgICAJCSZIZWFkZXI4MDJfMywKKwkJCQkJCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICZQYWNrZXQsCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisKKworCS8vIDUuIENvcHkgZnJhbWUgdG8gVHggcmluZworCVJUTVBUb1dpcmVsZXNzU3RhKHBBZCwgSGVhZGVyODAyXzMsIExFTkdUSF84MDJfMywgKFBVQ0hBUikmUGFja2V0LCBQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCBUUlVFKTsKKworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisJb3NfZnJlZV9tZW0ocEFkLCBtcG9vbCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGEyUGFpck1zZzFBY3Rpb24gPC0tLS0tXG4iKSk7CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVByb2Nlc3MgUGFpcndpc2Uga2V5IDQtd2F5IGhhbmRzaGFraW5nCisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCUVsZW0JCU1lc3NhZ2UgYm9keQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlXcGFQYWlyTXNnM0FjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglNTE1FX1FVRVVFX0VMRU0JKkVsZW0pCisKK3sKKwlQSEVBREVSXzgwMl8xMSAgICAgIHBIZWFkZXI7CisJUFVDSEFSICAgICAgICAgIAlwT3V0QnVmZmVyID0gTlVMTDsKKwlVQ0hBUiAgICAgICAgICAgICAgIEhlYWRlcjgwMl8zWzE0XTsKKwlVTE9ORyAgICAgICAgICAgCUZyYW1lTGVuID0gMDsKKwlFQVBPTF9QQUNLRVQgICAgICAgIFBhY2tldDsKKwlQRUFQT0xfUEFDS0VUICAgICAgIHBNc2czOworCVVDSEFSICAgICAgICAgICAJTWljWzE2XSwgT2xkTWljWzE2XTsKKwlNQUNfVEFCTEVfRU5UUlkgCSpwRW50cnkgPSBOVUxMOworCVVDSEFSCQkJCXNraXBfb2Zmc2V0OworCUtFWV9JTkZPCQkJcGVlcktleUluZm87CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGFQYWlyTXNnM0FjdGlvbiAtLS0tLT5cbiIpKTsKKworCS8vIFJlY29yZCA4MDIuMTEgaGVhZGVyICYgdGhlIHJlY2VpdmVkIEVBUE9MIHBhY2tldCBNc2czCisJcEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkgRWxlbS0+TXNnOworCXBNc2czID0gKFBFQVBPTF9QQUNLRVQpCSZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IXTsKKworCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpJnBlZXJLZXlJbmZvLCBzaXplb2YocGVlcktleUluZm8pKTsKKwlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKSZwZWVyS2V5SW5mbywgKFBVQ0hBUikmcE1zZzMtPktleURlc2MuS2V5SW5mbywgc2l6ZW9mKEtFWV9JTkZPKSk7CisKKwkqKChVU0hPUlQqKSZwZWVyS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQqKSZwZWVyS2V5SW5mbykpOworCisKKwkvLyAxLiBWZXJpZnkgY2lwaGVyIHR5cGUgbWF0Y2gKKwlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkICYmIChwZWVyS2V5SW5mby5LZXlEZXNjVmVyICE9IDIpKQorCXsKKwkJcmV0dXJuOworCX0KKwllbHNlIGlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkICYmIChwZWVyS2V5SW5mby5LZXlEZXNjVmVyICE9IDEpKQorCXsKKwkJcmV0dXJuOworCX0KKworCS8vIFZlcmlmeSBSU04gSUUKKwkvL2lmICghUlRNUEVxdWFsTWVtb3J5KHBNc2czLT5LZXlEZXNjLktleURhdGEsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOX0lFLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbikpCisJaWYgKCFDaGVja1JTTklFKHBBZCwgcE1zZzMtPktleURlc2MuS2V5RGF0YSwgcE1zZzMtPktleURlc2MuS2V5RGF0YUxlblsxXSwgJnNraXBfb2Zmc2V0KSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJTTl9JRSBEaWZmZXJlbnQgaW4gTXNnIDMgb2YgV1BBMSA0LXdheSBoYW5kc2hha2UhISBcbiIpKTsKKwkJaGV4X2R1bXAoIlRoZSBvcmlnaW5hbCBSU05fSUUiLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4pOworCQloZXhfZHVtcCgiVGhlIHJlY2VpdmVkIFJTTl9JRSIsIHBNc2czLT5LZXlEZXNjLktleURhdGEsIHBNc2czLT5LZXlEZXNjLktleURhdGFMZW5bMV0pOworCQlyZXR1cm47CisJfQorCWVsc2UKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlNOX0lFIFZBTElEIGluIE1zZyAzIG9mIFdQQTEgNC13YXkgaGFuZHNoYWtlISEgXG4iKSk7CisKKworCS8vIDIuIENoZWNrIE1JQyB2YWx1ZQorCS8vIFNhdmUgdGhlIE1JQyBhbmQgcmVwbGFjZSB3aXRoIHplcm8KKwlOZGlzTW92ZU1lbW9yeShPbGRNaWMsIHBNc2czLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisJTmRpc1plcm9NZW1vcnkocE1zZzMtPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKwlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJeworCQkvLyBBRVMKKwkJVUNIQVIgZGlnZXN0WzgwXTsKKworCQlITUFDX1NIQTEoKFBVQ0hBUikgcE1zZzMsIHBNc2czLT5Cb2R5X0xlblsxXSArIDQsIHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworCQlOZGlzTW92ZU1lbW9yeShNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisJfQorCWVsc2UJLy8gVEtJUAorCXsKKwkJaG1hY19tZDUocEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIChQVUNIQVIpIHBNc2czLCBwTXNnMy0+Qm9keV9MZW5bMV0gKyA0LCBNaWMpOworCX0KKworCWlmKCFOZGlzRXF1YWxNZW1vcnkoT2xkTWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiIE1JQyBEaWZmZXJlbnQgaW4gbXNnIDMgb2YgNC13YXkgaGFuZHNoYWtlISEhISEhISEhISBcbiIpKTsKKwkJcmV0dXJuOworCX0KKwllbHNlCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNSUMgVkFMSUQgaW4gbXNnIDMgb2YgNC13YXkgaGFuZHNoYWtlISEhISEhISEhISBcbiIpKTsKKworCS8vIDMuIENoZWNrIFJlcGxheSBDb3VudGVyLCBpdCBoYXMgdG8gYmUgbGFyZ2VyIHRoYW4gbGFzdCBvbmUuIE5vIG5lZWQgdG8gYmUgZXhhY3Qgb25lIGxhcmdlcgorCWlmKFJUTVBDb21wYXJlTWVtb3J5KHBNc2czLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDEpCisJCXJldHVybjsKKworCS8vIFVwZGF0ZSBuZXcgcmVwbGF5IGNvdW50ZXIKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBwTXNnMy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCS8vIDQuIERvdWJsZSBjaGVjayBBTm9uY2UKKwlpZighTmRpc0VxdWFsTWVtb3J5KHBBZC0+U3RhQ2ZnLkFOb25jZSwgcE1zZzMtPktleURlc2MuS2V5Tm9uY2UsIExFTl9LRVlfREVTQ19OT05DRSkpCisJCXJldHVybjsKKworCS8vIGluaXQgODAyLjMgaGVhZGVyIGFuZCBGaWxsIFBhY2tldAorCU1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgRUFQT0wpOworCisJLy8gWmVybyBNZXNzYWdlIDQgYm9keQorCU5kaXNaZXJvTWVtb3J5KCZQYWNrZXQsIHNpemVvZihQYWNrZXQpKTsKKwlQYWNrZXQuUHJvVmVyCT0gRUFQT0xfVkVSOworCVBhY2tldC5Qcm9UeXBlCT0gRUFQT0xLZXk7CisJUGFja2V0LkJvZHlfTGVuWzFdICA9IHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFOwkJLy8gTm8gZGF0YSBmaWVsZAorCisJLy8KKwkvLyBNZXNzYWdlIDQgYXMgIEVBUE9MLUtleSgwLDEsMCwwLDAsUCwwLDAsTUlDLDApCisJLy8KKwlQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMV9LRVlfREVTQzsKKworCS8vIEtleSBkZXNjcmlwdG9yIHZlcnNpb24gYW5kIGFwcHJvcHJpYXRlIFJTTiBJRQorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9IHBlZXJLZXlJbmZvLktleURlc2NWZXI7CisKKwkvLyBVcGRhdGUgS2V5IExlbmd0aAorCVBhY2tldC5LZXlEZXNjLktleUxlbmd0aFswXSA9IHBNc2czLT5LZXlEZXNjLktleUxlbmd0aFswXTsKKwlQYWNrZXQuS2V5RGVzYy5LZXlMZW5ndGhbMV0gPSBwTXNnMy0+S2V5RGVzYy5LZXlMZW5ndGhbMV07CisKKwkvLyBLZXkgVHlwZSBQZWVyS2V5CisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlUeXBlID0gUEFJUldJU0VLRVk7CisKKwkvLyBLZXlNaWMgZmllbGQgcHJlc2VudGVkCisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlNaWMgID0gMTsKKworCS8vIEluIE1zZzMsICBLZXlJbmZvLnNlY3VyZSA9MCBpZiBHcm91cCBLZXkgSFMgdG8gY29tZS4gMSBpZiBubyBncm91cCBrZXkgSFMKKwkvLyBTdGF0aW9uIHNlbmRzIE1zZzQgIEtleUluZm8uc2VjdXJlIHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGF0IGluIE1zZy4zCisJUGFja2V0LktleURlc2MuS2V5SW5mby5TZWN1cmU9IHBlZXJLZXlJbmZvLlNlY3VyZTsKKworCS8vIENvbnZlcnQgdG8gbGl0dGxlLWVuZGlhbiBmb3JtYXQuCisJKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pID0gY3B1MmxlMTYoKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pKTsKKworCS8vIEtleSBSZXBsYXkgY291bnQKKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwTXNnMy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCS8vIE91dCBidWZmZXIgZm9yIHRyYW5zbWl0dGluZyBtZXNzYWdlIDQKKwlNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFVDSEFSICopJnBPdXRCdWZmZXIpOyAgLy8gYWxsb2NhdGUgbWVtb3J5CisJaWYocE91dEJ1ZmZlciA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvLyBQcmVwYXJlIEVBUE9MIGZyYW1lIGZvciBNSUMgY2FsY3VsYXRpb24KKwkvLyBCZSBjYXJlZnVsLCBvbmx5IEVBUE9MIGZyYW1lIGlzIGNvdW50ZWQgZm9yIE1JQyBjYWxjdWxhdGlvbgorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCisJCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICAgICZQYWNrZXQsCisJCUVORF9PRl9BUkdTKTsKKworCS8vIFByZXBhcmUgYW5kIEZpbGwgTUlDIHZhbHVlCisJTmRpc1plcm9NZW1vcnkoTWljLCBzaXplb2YoTWljKSk7CisJaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzICA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJLy8gQUVTCisJCVVDSEFSIGRpZ2VzdFs4MF07CisKKwkJSE1BQ19TSEExKHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJTmRpc01vdmVNZW1vcnkoTWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKwllbHNlCisJeworCQlobWFjX21kNShwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIE1pYyk7CisJfQorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKworCS8vIFVwZGF0ZSBQVEsKKwkvLyBQcmVwYXJlIHBhaXItd2lzZSBrZXkgaW5mb3JtYXRpb24gaW50byBzaGFyZWQga2V5IHRhYmxlCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IExFTl9US0lQX0VLOworICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgJnBBZC0+U3RhQ2ZnLlBUS1szMl0sIExFTl9US0lQX0VLKTsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYywgJnBBZC0+U3RhQ2ZnLlBUS1s0OF0sIExFTl9US0lQX1JYTUlDSyk7CisJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDgrTEVOX1RLSVBfUlhNSUNLXSwgTEVOX1RLSVBfVFhNSUNLKTsKKworCS8vIERlY2lkZSBpdHMgQ2hpcGVyQWxnCisJaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7CisJZWxzZSBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworCWVsc2UKKwkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisKKwkvLyBVcGRhdGUgdGhlc2UgcmVsYXRlZCBpbmZvcm1hdGlvbiB0byBNQUNfVEFCTEVfRU5UUlkKKwlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKKwlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LktleSwgJnBBZC0+U3RhQ2ZnLlBUS1szMl0sIExFTl9US0lQX0VLKTsKKwlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LlJ4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4XSwgTEVOX1RLSVBfUlhNSUNLKTsKKwlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LlR4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4K0xFTl9US0lQX1JYTUlDS10sIExFTl9US0lQX1RYTUlDSyk7CisJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGc7CisKKwkvLyBVcGRhdGUgcGFpcndpc2Uga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQorCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCisJCQkJCQkgIEJTUzAsCisJCQkJCQkgIDAsCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMpOworCisJLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCisJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCisJCQkJCQkJICBCU1MwLAorCQkJCQkJCSAgMCwKKwkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKKwkJCQkJCQkgIHBFbnRyeSk7CisKKwkvLyBNYWtlIHRyYW5zbWl0dGluZyBmcmFtZQorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAJJkZyYW1lTGVuLAorCQkJICAJCQlMRU5HVEhfODAyXzMsICAgICAJCSZIZWFkZXI4MDJfMywKKwkJCQkJCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICZQYWNrZXQsCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisKKworCS8vIENvcHkgZnJhbWUgdG8gVHggcmluZyBhbmQgU2VuZCBNZXNzYWdlIDQgdG8gYXV0aGVudGljYXRvcgorCVJUTVBUb1dpcmVsZXNzU3RhKHBBZCwgSGVhZGVyODAyXzMsIExFTkdUSF84MDJfMywgKFBVQ0hBUikmUGFja2V0LCBQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCBUUlVFKTsKKworCU1sbWVGcmVlTWVtb3J5KHBBZCwgKFBVQ0hBUilwT3V0QnVmZmVyKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYVBhaXJNc2czQWN0aW9uIDwtLS0tLVxuIikpOworfQorCitWT0lEICAgIFdwYTJQYWlyTXNnM0FjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKQorCit7CisJUEhFQURFUl84MDJfMTEgICAgICBwSGVhZGVyOworCVBVQ0hBUiAgICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJVUNIQVIgICAgICAgICAgICAgICBIZWFkZXI4MDJfM1sxNF07CisJVUxPTkcgICAgICAgICAgICAgICBGcmFtZUxlbiA9IDA7CisJRUFQT0xfUEFDS0VUICAgICAgICBQYWNrZXQ7CisJUEVBUE9MX1BBQ0tFVCAgICAgICBwTXNnMzsKKwlVQ0hBUiAgICAgICAgICAgICAgIE1pY1sxNl0sIE9sZE1pY1sxNl07CisJVUNIQVIgICAgICAgICAgICAgICAqbXBvb2wsICpLRVlEQVRBLCAqZGlnZXN0OworCVVDSEFSICAgICAgICAgICAgICAgS2V5WzMyXTsKKwlNQUNfVEFCTEVfRU5UUlkgCSpwRW50cnkgPSBOVUxMOworCUtFWV9JTkZPCQkJcGVlcktleUluZm87CisKKwkvLyBhbGxvY2F0ZSBtZW1vcnkKKwlvc19hbGxvY19tZW0ocEFkLCAoUFVDSEFSICopJm1wb29sLCAxMDI0KTsKKworCWlmKG1wb29sID09IE5VTEwpCisJCXJldHVybjsKKworCS8vIEtFWURBVEEgTGVuID0gNTEyLgorCUtFWURBVEEgPSAoVUNIQVIgKikgUk9VTkRfVVAobXBvb2wsIDQpOworCS8vIGRpZ2VzdCBMZW4gPSA4MC4KKwlkaWdlc3QgPSAoVUNIQVIgKikgUk9VTkRfVVAoS0VZREFUQSArIDUxMiwgNCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGEyUGFpck1zZzNBY3Rpb24gLS0tLS0+XG4iKSk7CisKKwlwSGVhZGVyID0gKFBIRUFERVJfODAyXzExKSBFbGVtLT5Nc2c7CisKKwkvLyBQcm9jZXNzIG1lc3NhZ2UgMyBmcmFtZS4KKwlwTXNnMyA9IChQRUFQT0xfUEFDS0VUKQkmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSF07CisKKwlOZGlzWmVyb01lbW9yeSgoUFVDSEFSKSZwZWVyS2V5SW5mbywgc2l6ZW9mKHBlZXJLZXlJbmZvKSk7CisJTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikmcGVlcktleUluZm8sIChQVUNIQVIpJnBNc2czLT5LZXlEZXNjLktleUluZm8sIHNpemVvZihLRVlfSU5GTykpOworCisJKigoVVNIT1JUKikmcGVlcktleUluZm8pID0gY3B1MmxlMTYoKigoVVNIT1JUKikmcGVlcktleUluZm8pKTsKKworCS8vIDEuIFZlcmlmeSBjaXBoZXIgdHlwZSBtYXRjaAorCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCAmJiAocGVlcktleUluZm8uS2V5RGVzY1ZlciE9IDIpKQorCXsKKwkJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKwkJcmV0dXJuOworCX0KKwllbHNlIGlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkICYmIChwZWVyS2V5SW5mby5LZXlEZXNjVmVyICE9IDEpKQorCXsKKwkJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKwkJcmV0dXJuOworCX0KKworCS8vIDIuIENoZWNrIE1JQyB2YWx1ZQorCS8vIFNhdmUgdGhlIE1JQyBhbmQgcmVwbGFjZSB3aXRoIHplcm8KKwlOZGlzTW92ZU1lbW9yeShPbGRNaWMsIHBNc2czLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisJTmRpc1plcm9NZW1vcnkocE1zZzMtPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKwlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJeworCQkvLyBBRVMKKwkJSE1BQ19TSEExKChQVUNIQVIpIHBNc2czLCBwTXNnMy0+Qm9keV9MZW5bMV0gKyA0LCBwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJTmRpc01vdmVNZW1vcnkoTWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKwllbHNlCisJeworCQlobWFjX21kNShwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgKFBVQ0hBUikgcE1zZzMsIHBNc2czLT5Cb2R5X0xlblsxXSArIDQsIE1pYyk7CisJfQorCisJaWYoIU5kaXNFcXVhbE1lbW9yeShPbGRNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQykpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIgTUlDIERpZmZlcmVudCBpbiBtc2cgMyBvZiA0LXdheSBoYW5kc2hha2UhISEhISEhISEhIFxuIikpOworCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOworCQlyZXR1cm47CisJfQorCWVsc2UKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIE1JQyBWQUxJRCBpbiBtc2cgMyBvZiA0LXdheSBoYW5kc2hha2UhISEhISEhISEhIFxuIikpOworCisJLy8gMy4gQ2hlY2sgUmVwbGF5IENvdW50ZXIsIGl0IGhhcyB0byBiZSBsYXJnZXIgdGhhbiBsYXN0IG9uZS4gTm8gbmVlZCB0byBiZSBleGFjdCBvbmUgbGFyZ2VyCisJaWYoUlRNUENvbXBhcmVNZW1vcnkocE1zZzMtPktleURlc2MuUmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSkgIT0gMSkKKwl7CisJCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7CisJCXJldHVybjsKKwl9CisKKwkvLyBVcGRhdGUgbmV3IHJlcGxheSBjb3VudGVyCisJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgcE1zZzMtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwkvLyA0LiBEb3VibGUgY2hlY2sgQU5vbmNlCisJaWYoIU5kaXNFcXVhbE1lbW9yeShwQWQtPlN0YUNmZy5BTm9uY2UsIHBNc2czLT5LZXlEZXNjLktleU5vbmNlLCBMRU5fS0VZX0RFU0NfTk9OQ0UpKQorCXsKKwkJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKwkJcmV0dXJuOworCX0KKworCS8vIE9idGFpbiBHVEsKKwkvLyA1LiBEZWNyeXB0IEdUSyBmcm9tIEtleSBEYXRhCisJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkVLRCA9ICVkXG4iLCBwZWVyS2V5SW5mby5FS0RfREwpKTsKKwlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CisJCS8vIERlY3J5cHQgQUVTIEdUSworCQlBRVNfR1RLX0tFWV9VTldSQVAoJnBBZC0+U3RhQ2ZnLlBUS1sxNl0sIEtFWURBVEEsIHBNc2czLT5LZXlEZXNjLktleURhdGFMZW5bMV0scE1zZzMtPktleURlc2MuS2V5RGF0YSk7CisJfQorCWVsc2UJICAvLyBUS0lQCisJeworCQlJTlQgaTsKKwkJLy8gRGVjcnlwdCBUS0lQIEdUSworCQkvLyBDb25zdHJ1Y3QgMzIgYnl0ZXMgUkM0IEtleQorCQlOZGlzTW92ZU1lbW9yeShLZXksIHBNc2czLT5LZXlEZXNjLktleUl2LCAxNik7CisJCU5kaXNNb3ZlTWVtb3J5KCZLZXlbMTZdLCAmcEFkLT5TdGFDZmcuUFRLWzE2XSwgMTYpOworCQlBUkNGT1VSX0lOSVQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgS2V5LCAzMik7CisJCS8vZGlzY2FyZCBmaXJzdCAyNTYgYnl0ZXMKKwkJZm9yKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCQlBUkNGT1VSX0JZVEUoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCk7CisJCS8vIERlY3J5cHQgR1RLLiBCZWNhcmVmdWwsIHRoZXJlIGlzIG5vIElDViB0byBjaGVjayB0aGUgcmVzdWx0IGlzIGNvcnJlY3Qgb3Igbm90CisJCUFSQ0ZPVVJfREVDUllQVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBLRVlEQVRBLCBwTXNnMy0+S2V5RGVzYy5LZXlEYXRhLCBwTXNnMy0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdKTsKKwl9CisKKwlpZiAoIVBhcnNlS2V5RGF0YShwQWQsIEtFWURBVEEsIHBNc2czLT5LZXlEZXNjLktleURhdGFMZW5bMV0sIDEpKQorCXsKKwkJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKwkJcmV0dXJuOworCX0KKworCS8vIFVwZGF0ZSBHVEsgdG8gQVNJQworCS8vIFVwZGF0ZSBncm91cCBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCisJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKKwkJCQkJCSAgQlNTMCwKKwkJCQkJCSAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZywKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uVHhNaWMsCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uUnhNaWMpOworCisJLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCisJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCisJCQkJCQkJICBCU1MwLAorCQkJCQkJCSAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAorCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcsCisJCQkJCQkJICBOVUxMKTsKKworCS8vIGluaXQgODAyLjMgaGVhZGVyIGFuZCBGaWxsIFBhY2tldAorCU1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgRUFQT0wpOworCisJLy8gWmVybyBtZXNzYWdlIDQgYm9keQorCU5kaXNaZXJvTWVtb3J5KCZQYWNrZXQsIHNpemVvZihQYWNrZXQpKTsKKwlQYWNrZXQuUHJvVmVyCT0gRUFQT0xfVkVSOworCVBhY2tldC5Qcm9UeXBlCT0gRUFQT0xLZXk7CisJUGFja2V0LkJvZHlfTGVuWzFdICAJPSBzaXplb2YoS0VZX0RFU0NSSVBURVIpIC0gTUFYX0xFTl9PRl9SU05JRTsJCS8vIE5vIGRhdGEgZmllbGQKKworCS8vCisJLy8gTWVzc2FnZSA0IGFzICBFQVBPTC1LZXkoMCwxLDAsMCwwLFAsMCwwLE1JQywwKQorCS8vCisJUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTJfS0VZX0RFU0M7CisKKwkvLyBLZXkgZGVzY3JpcHRvciB2ZXJzaW9uIGFuZCBhcHByb3ByaWF0ZSBSU04gSUUKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPSBwZWVyS2V5SW5mby5LZXlEZXNjVmVyOworCisJLy8gVXBkYXRlIEtleSBMZW5ndGgKKwlQYWNrZXQuS2V5RGVzYy5LZXlMZW5ndGhbMF0gPSBwTXNnMy0+S2V5RGVzYy5LZXlMZW5ndGhbMF07CisJUGFja2V0LktleURlc2MuS2V5TGVuZ3RoWzFdID0gcE1zZzMtPktleURlc2MuS2V5TGVuZ3RoWzFdOworCisJLy8gS2V5IFR5cGUgUGVlcktleQorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5VHlwZSA9IFBBSVJXSVNFS0VZOworCisJLy8gS2V5TWljIGZpZWxkIHByZXNlbnRlZAorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5TWljICA9IDE7CisJUGFja2V0LktleURlc2MuS2V5SW5mby5TZWN1cmUgPSAxOworCisJLy8gQ29udmVydCB0byBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KKwkqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykpOworCisJLy8gS2V5IFJlcGxheSBjb3VudAorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBNc2czLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLy8gT3V0IGJ1ZmZlciBmb3IgdHJhbnNtaXR0aW5nIG1lc3NhZ2UgNAorCU1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVUNIQVIgKikmcE91dEJ1ZmZlcik7ICAvLyBhbGxvY2F0ZSBtZW1vcnkKKwlpZihwT3V0QnVmZmVyID09IE5VTEwpCisJeworCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOworCQlyZXR1cm47CisJfQorCisJLy8gUHJlcGFyZSBFQVBPTCBmcmFtZSBmb3IgTUlDIGNhbGN1bGF0aW9uCisJLy8gQmUgY2FyZWZ1bCwgb25seSBFQVBPTCBmcmFtZSBpcyBjb3VudGVkIGZvciBNSUMgY2FsY3VsYXRpb24KKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAorCQlQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAgICAmUGFja2V0LAorCQlFTkRfT0ZfQVJHUyk7CisKKwkvLyBQcmVwYXJlIGFuZCBGaWxsIE1JQyB2YWx1ZQorCU5kaXNaZXJvTWVtb3J5KE1pYywgc2l6ZW9mKE1pYykpOworCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJLy8gQUVTCisJCUhNQUNfU0hBMShwT3V0QnVmZmVyLCBGcmFtZUxlbiwgcEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7CisJCU5kaXNNb3ZlTWVtb3J5KE1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKKwl9CisJZWxzZQorCXsKKwkJaG1hY19tZDUocEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBNaWMpOworCX0KKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKwkvLyBVcGRhdGUgUFRLCisJLy8gUHJlcGFyZSBwYWlyLXdpc2Uga2V5IGluZm9ybWF0aW9uIGludG8gc2hhcmVkIGtleSB0YWJsZQorCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVswXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKwlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKyAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksICZwQWQtPlN0YUNmZy5QVEtbMzJdLCBMRU5fVEtJUF9FSyk7CisJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDhdLCBMRU5fVEtJUF9SWE1JQ0spOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4K0xFTl9US0lQX1JYTUlDS10sIExFTl9US0lQX1RYTUlDSyk7CisKKwkvLyBEZWNpZGUgaXRzIENoaXBlckFsZworCWlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9US0lQOworCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKwllbHNlCisJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCisJLy8gVXBkYXRlIHRoZXNlIHJlbGF0ZWQgaW5mb3JtYXRpb24gdG8gTUFDX1RBQkxFX0VOVFJZCisJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07CisJTmRpc01vdmVNZW1vcnkoJnBFbnRyeS0+UGFpcndpc2VLZXkuS2V5LCAmcEFkLT5TdGFDZmcuUFRLWzMyXSwgTEVOX1RLSVBfRUspOworCU5kaXNNb3ZlTWVtb3J5KCZwRW50cnktPlBhaXJ3aXNlS2V5LlJ4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4XSwgTEVOX1RLSVBfUlhNSUNLKTsKKwlOZGlzTW92ZU1lbW9yeSgmcEVudHJ5LT5QYWlyd2lzZUtleS5UeE1pYywgJnBBZC0+U3RhQ2ZnLlBUS1s0OCtMRU5fVEtJUF9SWE1JQ0tdLCBMRU5fVEtJUF9UWE1JQ0spOworCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnOworCisJLy8gVXBkYXRlIHBhaXJ3aXNlIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKKwlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAorCQkJCQkJICBCU1MwLAorCQkJCQkJICAwLAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljKTsKKworCS8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQorCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorCQkJCQkJCSAgQlNTMCwKKwkJCQkJCQkgIDAsCisJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCisJCQkJCQkJICBwRW50cnkpOworCisJLy8gTWFrZSAgVHJhbnNtaXR0aW5nIGZyYW1lCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgIAkmRnJhbWVMZW4sCisJCQkgIAkJCUxFTkdUSF84MDJfMywgICAgIAkJJkhlYWRlcjgwMl8zLAorCQkJCQkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgJlBhY2tldCwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKworCisJLy8gQ29weSBmcmFtZSB0byBUeCByaW5nIGFuZCBTZW5kIE1lc3NhZ2UgNCB0byBhdXRoZW50aWNhdG9yCisJUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zLCAoUFVDSEFSKSZQYWNrZXQsIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsIFRSVUUpOworCisJLy8gc2V0IDgwMi4xeCBwb3J0IGNvbnRyb2wKKwlTVEFfUE9SVF9TRUNVUkVEKHBBZCk7CisKKyAgICAvLyBJbmRpY2F0ZSBDb25uZWN0ZWQgZm9yIEdVSQorICAgIHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisKKwlNbG1lRnJlZU1lbW9yeShwQWQsIChQVUNIQVIpcE91dEJ1ZmZlcik7CisJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKworCisJLy8gc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciBzZXQga2V5IGRvbmUgV1BBMgorCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfU0VUX0tFWV9ET05FX1dQQTJfRVZFTlRfRkxBRywgcEVudHJ5LT5BZGRyLCBCU1MwLCAwKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIldwYTJQYWlyTXNnM0FjdGlvbiA8LS0tLS1cbiIpKTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJvY2VzcyBHcm91cCBrZXkgMi13YXkgaGFuZHNoYWtpbmcKKworCUFyZ3VtZW50czoKKwkJcEFkCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKwkJRWxlbQkJTWVzc2FnZSBib2R5CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVdwYUdyb3VwTXNnMUFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglNTE1FX1FVRVVFX0VMRU0JKkVsZW0pCisKK3sKKwlQVUNIQVIgICAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworCVVDSEFSICAgICAgICAgICAgICAgSGVhZGVyODAyXzNbMTRdOworCVVMT05HICAgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOworCUVBUE9MX1BBQ0tFVCAgICAgICAgUGFja2V0OworCVBFQVBPTF9QQUNLRVQgICAgICAgcEdyb3VwOworCVVDSEFSICAgICAgICAgICAgICAgKm1wb29sLCAqZGlnZXN0LCAqS0VZREFUQTsKKwlVQ0hBUiAgICAgICAgICAgICAgIE1pY1sxNl0sIE9sZE1pY1sxNl07CisJVUNIQVIgICAgICAgICAgICAgICBHVEtbMzJdLCBLZXlbMzJdOworCUtFWV9JTkZPCQkJcGVlcktleUluZm87CisKKwkvLyBhbGxvY2F0ZSBtZW1vcnkKKwlvc19hbGxvY19tZW0ocEFkLCAoUFVDSEFSICopJm1wb29sLCAxMDI0KTsKKworCWlmKG1wb29sID09IE5VTEwpCisJCXJldHVybjsKKworCS8vIGRpZ2VzdCBMZW4gPSA4MC4KKwlkaWdlc3QgPSAoVUNIQVIgKikgUk9VTkRfVVAobXBvb2wsIDQpOworCS8vIEtFWURBVEEgTGVuID0gNTEyLgorCUtFWURBVEEgPSAoVUNIQVIgKikgUk9VTkRfVVAoZGlnZXN0ICsgODAsIDQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhR3JvdXBNc2cxQWN0aW9uIC0tLS0tPlxuIikpOworCisJLy8gUHJvY2VzcyBHcm91cCBNZXNzYWdlIDEgZnJhbWUuIHNraXAgODAyLjExIGhlYWRlcigyNCkgJiBMTENfU05BUCBoZWFkZXIoOCkKKwlwR3JvdXAgPSAoUEVBUE9MX1BBQ0tFVCkgJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0hdOworCisJTmRpc1plcm9NZW1vcnkoKFBVQ0hBUikmcGVlcktleUluZm8sIHNpemVvZihwZWVyS2V5SW5mbykpOworCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpJnBlZXJLZXlJbmZvLCAoUFVDSEFSKSZwR3JvdXAtPktleURlc2MuS2V5SW5mbywgc2l6ZW9mKEtFWV9JTkZPKSk7CisKKwkqKChVU0hPUlQqKSZwZWVyS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQqKSZwZWVyS2V5SW5mbykpOworCisJLy8gMC4gQ2hlY2sgY2lwaGVyIHR5cGUgbWF0Y2gKKwlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQgJiYgKHBlZXJLZXlJbmZvLktleURlc2NWZXIgIT0gMikpCisJeworCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOworCQlyZXR1cm47CisJfQorCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkICYmIChwZWVyS2V5SW5mby5LZXlEZXNjVmVyICE9IDEpKQorCXsKKwkJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKwkJcmV0dXJuOworCX0KKworCS8vIDEuIFZlcmlmeSBSZXBsYXkgY291bnRlcgorCS8vICAgIENoZWNrIFJlcGxheSBDb3VudGVyLCBpdCBoYXMgdG8gYmUgbGFyZ2VyIHRoYW4gbGFzdCBvbmUuIE5vIG5lZWQgdG8gYmUgZXhhY3Qgb25lIGxhcmdlcgorCWlmKFJUTVBDb21wYXJlTWVtb3J5KHBHcm91cC0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKSAhPSAxKQorCXsKKwkJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKwkJcmV0dXJuOworCX0KKworCS8vIFVwZGF0ZSBuZXcgcmVwbGF5IGNvdW50ZXIKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBwR3JvdXAtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwkvLyAyLiBWZXJpZnkgTUlDIGlzIHZhbGlkCisJLy8gU2F2ZSB0aGUgTUlDIGFuZCByZXBsYWNlIHdpdGggemVybworCU5kaXNNb3ZlTWVtb3J5KE9sZE1pYywgcEdyb3VwLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisJTmRpc1plcm9NZW1vcnkocEdyb3VwLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKwlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJewkvLyBBRVMKKwkJSE1BQ19TSEExKChQVUNIQVIpIHBHcm91cCwgcEdyb3VwLT5Cb2R5X0xlblsxXSArIDQsIHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworCQlOZGlzTW92ZU1lbW9yeShNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisJfQorCWVsc2UKKwl7CS8vIFRLSVAKKwkJaG1hY19tZDUocEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIChQVUNIQVIpIHBHcm91cCwgcEdyb3VwLT5Cb2R5X0xlblsxXSArIDQsIE1pYyk7CisJfQorCisJaWYoIU5kaXNFcXVhbE1lbW9yeShPbGRNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQykpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIgTUlDIERpZmZlcmVudCBpbiBncm91cCBtc2cgMSBvZiAyLXdheSBoYW5kc2hha2UhISEhISEhISEhIFxuIikpOworCQlNbG1lRnJlZU1lbW9yeShwQWQsIChQVUNIQVIpbXBvb2wpOworCQlyZXR1cm47CisJfQorCWVsc2UKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIE1JQyBWQUxJRCBpbiBncm91cCBtc2cgMSBvZiAyLXdheSBoYW5kc2hha2UhISEhISEhISEhIFxuIikpOworCisKKwkvLyAzLiBEZWNyeXB0IEdUSyBmcm9tIEtleSBEYXRhCisJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJLy8gRGVjcnlwdCBBRVMgR1RLCisJCUFFU19HVEtfS0VZX1VOV1JBUCgmcEFkLT5TdGFDZmcuUFRLWzE2XSwgS0VZREFUQSwgIHBHcm91cC0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdLCBwR3JvdXAtPktleURlc2MuS2V5RGF0YSk7CisJfQorCWVsc2UJLy8gVEtJUAorCXsKKwkJSU5UIGk7CisKKwkJLy8gRGVjcnlwdCBUS0lQIEdUSworCQkvLyBDb25zdHJ1Y3QgMzIgYnl0ZXMgUkM0IEtleQorCQlOZGlzTW92ZU1lbW9yeShLZXksIHBHcm91cC0+S2V5RGVzYy5LZXlJdiwgMTYpOworCQlOZGlzTW92ZU1lbW9yeSgmS2V5WzE2XSwgJnBBZC0+U3RhQ2ZnLlBUS1sxNl0sIDE2KTsKKwkJQVJDRk9VUl9JTklUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIEtleSwgMzIpOworCQkvL2Rpc2NhcmQgZmlyc3QgMjU2IGJ5dGVzCisJCWZvcihpID0gMDsgaSA8IDI1NjsgaSsrKQorCQkJQVJDRk9VUl9CWVRFKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQpOworCQkvLyBEZWNyeXB0IEdUSy4gQmVjYXJlZnVsLCB0aGVyZSBpcyBubyBJQ1YgdG8gY2hlY2sgdGhlIHJlc3VsdCBpcyBjb3JyZWN0IG9yIG5vdAorCQlBUkNGT1VSX0RFQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgS0VZREFUQSwgcEdyb3VwLT5LZXlEZXNjLktleURhdGEsIHBHcm91cC0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdKTsKKwl9CisKKwkvLyBQcm9jZXNzIGRlY3J5cHRlZCBrZXkgZGF0YSBtYXRlcmlhbAorCS8vIFBhcnNlIGtleURhdGEgdG8gaGFuZGxlIEtERSBmb3JtYXQgZm9yIFdQQTJQU0sKKwlpZiAocGVlcktleUluZm8uRUtEX0RMKQorCXsKKwkJaWYgKCFQYXJzZUtleURhdGEocEFkLCBLRVlEQVRBLCBwR3JvdXAtPktleURlc2MuS2V5RGF0YUxlblsxXSwgMCkpCisJCXsKKwkJCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJZWxzZQkvLyBXUEFQU0sKKwl7CisJCS8vIHNldCBrZXkgbWF0ZXJpYWwsIFR4TWljIGFuZCBSeE1pYyBmb3IgV1BBUFNLCisJCU5kaXNNb3ZlTWVtb3J5KEdUSywgS0VZREFUQSwgMzIpOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5HVEssIEdUSywgMzIpOworCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSBwZWVyS2V5SW5mby5LZXlJbmRleDsKKworCQkvLyBQcmVwYXJlIHBhaXItd2lzZSBrZXkgaW5mb3JtYXRpb24gaW50byBzaGFyZWQga2V5IHRhYmxlCisJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbiA9IExFTl9US0lQX0VLOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwgR1RLLCBMRU5fVEtJUF9FSyk7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uUnhNaWMsICZHVEtbMTZdLCBMRU5fVEtJUF9SWE1JQ0spOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLCAmR1RLWzI0XSwgTEVOX1RLSVBfVFhNSUNLKTsKKworCQkvLyBVcGRhdGUgU2hhcmVkIEtleSBDaXBoZXJBbGcKKwkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9US0lQOworCQllbHNlIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworCisgICAgCS8vaGV4X2R1bXAoIkdyb3VwIEtleSA6IiwgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksIExFTl9US0lQX0VLKTsKKwl9CisKKwkvLyBVcGRhdGUgZ3JvdXAga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQorCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCisJCQkJCQkgIEJTUzAsCisJCQkJCQkgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcsCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlJ4TWljKTsKKworCS8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQorCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorCQkJCQkJCSAgQlNTMCwKKwkJCQkJCQkgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKKwkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLAorCQkJCQkJCSAgTlVMTCk7CisKKwkvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAorCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKKworICAgIC8vIEluZGljYXRlIENvbm5lY3RlZCBmb3IgR1VJCisgICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKworCS8vIGluaXQgaGVhZGVyIGFuZCBGaWxsIFBhY2tldAorCU1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgRUFQT0wpOworCisJLy8gWmVybyBHcm91cCBtZXNzYWdlIDEgYm9keQorCU5kaXNaZXJvTWVtb3J5KCZQYWNrZXQsIHNpemVvZihQYWNrZXQpKTsKKwlQYWNrZXQuUHJvVmVyCT0gRUFQT0xfVkVSOworCVBhY2tldC5Qcm9UeXBlCT0gRUFQT0xLZXk7CisJUGFja2V0LkJvZHlfTGVuWzFdICA9IHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFOwkJLy8gTm8gZGF0YSBmaWVsZAorCisJLy8KKwkvLyBHcm91cCBNZXNzYWdlIDIgYXMgIEVBUE9MLUtleSgxLDAsMCwwLEcsMCwwLE1JQywwKQorCS8vCisJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCisJeworCQlQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMl9LRVlfREVTQzsKKwl9CisJZWxzZQorCXsKKwkJUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTFfS0VZX0RFU0M7CisJfQorCisJLy8gS2V5IGRlc2NyaXB0b3IgdmVyc2lvbiBhbmQgYXBwcm9wcmlhdGUgUlNOIElFCisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gcGVlcktleUluZm8uS2V5RGVzY1ZlcjsKKworCS8vIFVwZGF0ZSBLZXkgTGVuZ3RoCisJUGFja2V0LktleURlc2MuS2V5TGVuZ3RoWzBdID0gcEdyb3VwLT5LZXlEZXNjLktleUxlbmd0aFswXTsKKwlQYWNrZXQuS2V5RGVzYy5LZXlMZW5ndGhbMV0gPSBwR3JvdXAtPktleURlc2MuS2V5TGVuZ3RoWzFdOworCisJLy8gS2V5IEluZGV4IGFzIEctTXNnIDEKKwlpZihwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spCisJCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5SW5kZXggPSBwZWVyS2V5SW5mby5LZXlJbmRleDsKKworCS8vIEtleSBUeXBlIEdyb3VwIGtleQorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5VHlwZSA9IEdST1VQS0VZOworCisJLy8gS2V5TWljIGZpZWxkIHByZXNlbnRlZAorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5TWljICA9IDE7CisKKwkvLyBTZWN1cmUgYml0CisJUGFja2V0LktleURlc2MuS2V5SW5mby5TZWN1cmUgID0gMTsKKworCS8vIENvbnZlcnQgdG8gbGl0dGxlLWVuZGlhbiBmb3JtYXQuCisJKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pID0gY3B1MmxlMTYoKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pKTsKKworCS8vIEtleSBSZXBsYXkgY291bnQKKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwR3JvdXAtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwkvLyBPdXQgYnVmZmVyIGZvciB0cmFuc21pdHRpbmcgZ3JvdXAgbWVzc2FnZSAyCisJTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBVQ0hBUiAqKSZwT3V0QnVmZmVyKTsgIC8vIGFsbG9jYXRlIG1lbW9yeQorCWlmKHBPdXRCdWZmZXIgPT0gTlVMTCkKKwl7CisJCU1sbWVGcmVlTWVtb3J5KHBBZCwgKFBVQ0hBUiltcG9vbCk7CisJCXJldHVybjsKKwl9CisKKwkvLyBQcmVwYXJlIEVBUE9MIGZyYW1lIGZvciBNSUMgY2FsY3VsYXRpb24KKwkvLyBCZSBjYXJlZnVsLCBvbmx5IEVBUE9MIGZyYW1lIGlzIGNvdW50ZWQgZm9yIE1JQyBjYWxjdWxhdGlvbgorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCisJCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICAgICZQYWNrZXQsCisJCUVORF9PRl9BUkdTKTsKKworCS8vIFByZXBhcmUgYW5kIEZpbGwgTUlDIHZhbHVlCisJTmRpc1plcm9NZW1vcnkoTWljLCBzaXplb2YoTWljKSk7CisJaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzICA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJLy8gQUVTCisJCUhNQUNfU0hBMShwT3V0QnVmZmVyLCBGcmFtZUxlbiwgcEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7CisJCU5kaXNNb3ZlTWVtb3J5KE1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKKwl9CisJZWxzZQorCXsKKwkJaG1hY19tZDUocEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBNaWMpOworCX0KKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKworCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgIAkJJkZyYW1lTGVuLAorCQkJCQkJTEVOR1RIXzgwMl8zLCAgICAgCQkmSGVhZGVyODAyXzMsCisJCQkJCQlQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAmUGFja2V0LAorCQkJCQkJRU5EX09GX0FSR1MpOworCisKKwkvLyA1LiBDb3B5IGZyYW1lIHRvIFR4IHJpbmcgYW5kIHByZXBhcmUgZm9yIGVuY3J5cHRpb24KKwlSVE1QVG9XaXJlbGVzc1N0YShwQWQsIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMsIChQVUNIQVIpJlBhY2tldCwgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgRkFMU0UpOworCisJLy8gNiBGcmVlIGFsbG9jYXRlZCBtZW1vcnkKKwlNbG1lRnJlZU1lbW9yeShwQWQsIChQVUNIQVIpcE91dEJ1ZmZlcik7CisJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKworCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3Igc2V0IGtleSBkb25lIFdQQTIKKwlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX1NFVF9LRVlfRE9ORV9XUEEyX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGFHcm91cE1zZzFBY3Rpb24gPC0tLS0tXG4iKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlJbml0IFdQQSBNQUMgaGVhZGVyCisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVdwYU1hY0hlYWRlckluaXQoCisJSU4JCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOIE9VVAlQSEVBREVSXzgwMl8xMQlwSGRyODAyMTEsCisJSU4JCVVDSEFSCQkJd2VwLAorCUlOCQlQVUNIQVIJCSAgICBwQWRkcjEpCit7CisJTmRpc1plcm9NZW1vcnkocEhkcjgwMjExLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCXBIZHI4MDIxMS0+RkMuVHlwZQk9IEJUWVBFX0RBVEE7CisJcEhkcjgwMjExLT5GQy5Ub0RzCT0gMTsKKwlpZiAod2VwCT09IDEpCisJCXBIZHI4MDIxMS0+RkMuV2VwID0gMTsKKworCSAvLwlBZGRyMTogQlNTSUQsIEFkZHIyOiBTQSwgQWRkcjM6CURBCisJQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIxLCBwQWRkcjEpOworCUNPUFlfTUFDX0FERFIocEhkcjgwMjExLT5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJcEhkcjgwMjExLT5TZXF1ZW5jZSA9CXBBZC0+U2VxdWVuY2U7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDb3B5IGZyYW1lIGZyb20gd2FpdGluZyBxdWV1ZSBpbnRvIHJlbGF0aXZlIHJpbmcgYnVmZmVyIGFuZCBzZXQKKwlhcHByb3ByaWF0ZSBBU0lDIHJlZ2lzdGVyIHRvIGtpY2sgaGFyZHdhcmUgZW5jcnlwdGlvbiBiZWZvcmUgcmVhbGx5CisJc2VudCBvdXQgdG8gYWlyLgorCisJQXJndW1lbnRzOgorCQlwQWQJCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKwkJUE5ESVNfUEFDS0VUCVBvaW50ZXIgdG8gb3V0Z29pbmcgTmRpcyBmcmFtZQorCQlOdW1iZXJPZkZyYWcJTnVtYmVyIG9mIGZyYWdtZW50IHJlcXVpcmVkCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEICAgIFJUTVBUb1dpcmVsZXNzU3RhKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcEhlYWRlcjgwMl8zLAorICAgIElOICBVSU5UICAgICAgICAgICAgSGRyTGVuLAorCUlOICBQVUNIQVIgICAgICAgICAgcERhdGEsCisgICAgSU4gIFVJTlQgICAgICAgICAgICBEYXRhTGVuLAorICAgIElOCUJPT0xFQU4JCQlpczR3YXlGcmFtZSkKKworeworCU5ESVNfU1RBVFVTICAgICBTdGF0dXM7CisJUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQ7CisJVUNIQVIgICBJbmRleDsKKworCWRvCisJeworCQkvLyAxLiBidWlsZCBhIE5ESVMgcGFja2V0IGFuZCBjYWxsIFJUTVBTZW5kUGFja2V0KCk7CisJCS8vICAgIGJlIGNhcmVmdWwgYWJvdXQgaG93L3doZW4gdG8gcmVsZWFzZSB0aGlzIGludGVybmFsIGFsbG9jYXRlZCBORElTIFBBQ0tFVCBidWZmZXIKKwkJU3RhdHVzID0gUlRNUEFsbG9jYXRlTmRpc1BhY2tldChwQWQsICZwUGFja2V0LCBwSGVhZGVyODAyXzMsIEhkckxlbiwgcERhdGEsIERhdGFMZW4pOworCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQlicmVhazsKKworCQlpZiAoaXM0d2F5RnJhbWUpCisJCQlSVE1QX1NFVF9QQUNLRVRfQ0xFQVJfRUFQX0ZSQU1FKHBQYWNrZXQsIDEpOworCQllbHNlCisJCQlSVE1QX1NFVF9QQUNLRVRfQ0xFQVJfRUFQX0ZSQU1FKHBQYWNrZXQsIDApOworCisJCS8vIDIuIHNlbmQgb3V0IHRoZSBwYWNrZXQKKwkJU3RhdHVzID0gU1RBU2VuZFBhY2tldChwQWQsIHBQYWNrZXQpOworCQlpZihTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJeworCQkJLy8gRGVxdWV1ZSBvbmUgZnJhbWUgZnJvbSBUeFN3UXVldWUwLi4zIHF1ZXVlIGFuZCBwcm9jZXNzIGl0CisJCQkvLyBUaGVyZSBhcmUgdGhyZWUgcGxhY2UgY2FsbGluZyBkZXF1ZXVlIGZvciBUWCByaW5nLgorCQkJLy8gMS4gSGVyZSwgcmlnaHQgYWZ0ZXIgcXVldWVpbmcgdGhlIGZyYW1lLgorCQkJLy8gMi4gQXQgdGhlIGVuZCBvZiBUeFJpbmdUeERvbmUgc2VydmljZSByb3V0aW5lLgorCQkJLy8gMy4gVXBvbiBORElTIGNhbGwgUlRNUFNlbmRQYWNrZXRzCisJCQlpZigoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpICYmCisJCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpKSkKKwkJCXsKKwkJCQlmb3IoSW5kZXggPSAwOyBJbmRleCA8IDU7IEluZGV4ICsrKQorCQkJCQlpZihwQWQtPlR4U3dRdWV1ZVtJbmRleF0uTnVtYmVyID4gMCkKKwkJCQkJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIEluZGV4LCBNQVhfVFhfUFJPQ0VTUyk7CisJCQl9CisJCX0KKwl9IHdoaWxlKEZBTFNFKTsKKworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBDaGVjayBTYW5pdHkgUlNOIElFIGZvcm0gQVAKKworICAgIEFyZ3VtZW50czoKKworICAgIFJldHVybiBWYWx1ZToKKworCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBDaGVja1JTTklFKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcERhdGEsCisJSU4gIFVDSEFSICAgICAgICAgICBEYXRhTGVuLAorCU9VVAlVQ0hBUgkJCSpPZmZzZXQpCit7CisJUFVDSEFSICAgICAgICAgICAgICBwVklFOworCVVDSEFSICAgICAgICAgICAgICAgbGVuOworCVBFSURfU1RSVUNUICAgICAgICAgcEVpZDsKKwlCT09MRUFOCQkJCXJlc3VsdCA9IEZBTFNFOworCisJcFZJRSA9IHBEYXRhOworCWxlbgkgPSBEYXRhTGVuOworCSpPZmZzZXQgPSAwOworCisJd2hpbGUgKGxlbiA+IHNpemVvZihSU05JRTIpKQorCXsKKwkJcEVpZCA9IChQRUlEX1NUUlVDVCkgcFZJRTsKKwkJLy8gV1BBIFJTTiBJRQorCQlpZiAoKHBFaWQtPkVpZCA9PSBJRV9XUEEpICYmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdQQV9PVUksIDQpKSkKKwkJeworCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEgfHwgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSAmJgorCQkJCShOZGlzRXF1YWxNZW1vcnkocFZJRSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05fSUUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuKSkgJiYKKwkJCQkocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4gPT0gKHBFaWQtPkxlbiArIDIpKSkKKwkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hlY2tSU05JRSA9PT4gV1BBL1dQQVBTSyBSU04gSUUgbWF0Y2hlZCBpbiBNc2cgMywgTGVuZ3RoKCVkKSBcbiIsIChwRWlkLT5MZW4gKyAyKSkpOworCQkJCQlyZXN1bHQgPSBUUlVFOworCQkJfQorCisJCQkqT2Zmc2V0ICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJfQorCQkvLyBXUEEyIFJTTiBJRQorCQllbHNlIGlmICgocEVpZC0+RWlkID09IElFX1JTTikgJiYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCArIDIsIFJTTl9PVUksIDMpKSkKKwkJeworCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyIHx8IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spICYmCisJCQkJKE5kaXNFcXVhbE1lbW9yeShwVklFLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4pKSAmJgorCQkJCShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbiA9PSAocEVpZC0+TGVuICsgMikpKQorCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGVja1JTTklFID09PiBXUEEyL1dQQTJQU0sgUlNOIElFIG1hdGNoZWQgaW4gTXNnIDMsIExlbmd0aCglZCkgXG4iLCAocEVpZC0+TGVuICsgMikpKTsKKwkJCQkJcmVzdWx0ID0gVFJVRTsKKwkJCX0KKworCQkJKk9mZnNldCArPSAocEVpZC0+TGVuICsgMik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlicmVhazsKKwkJfQorCisJCXBWSUUgKz0gKHBFaWQtPkxlbiArIDIpOworCQlsZW4gIC09IChwRWlkLT5MZW4gKyAyKTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGVja1JTTklFID09PiBza2lwX29mZnNldCglZCkgXG4iLCAqT2Zmc2V0KSk7CisKKwlyZXR1cm4gcmVzdWx0OworCit9CisKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgUGFyc2UgS0VZREFUQSBmaWVsZC4gIEtFWURBVEFbXSBNYXkgY29udGFpbiAyIFJTTiBJRSBhbmQgb3B0aW9uYWxseSBHVEsuCisgICAgR1RLICBpcyBlbmNhcHR1bGF0ZWQgaW4gS0RFIGZvcm1hdCBhdCAgcC44MyA4MDIuMTFpIEQxMAorCisgICAgQXJndW1lbnRzOgorCisgICAgUmV0dXJuIFZhbHVlOgorCisgICAgTm90ZToKKyAgICAgICAgODAyLjExaSBEMTAKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gUGFyc2VLZXlEYXRhKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcEtleURhdGEsCisJSU4gIFVDSEFSICAgICAgICAgICBLZXlEYXRhTGVuLAorCUlOCVVDSEFSCQkJYlBhaXJld2lzZSkKK3sKKyAgICBQS0RFX0VOQ0FQICAgICAgICAgIHBLREUgPSBOVUxMOworICAgIFBVQ0hBUiAgICAgICAgICAgICAgcE15S2V5RGF0YSA9IHBLZXlEYXRhOworICAgIFVDSEFSICAgICAgICAgICAgICAgS2V5RGF0YUxlbmd0aCA9IEtleURhdGFMZW47CisgICAgVUNIQVIgICAgICAgICAgICAgICBHVEtMRU47CisJVUNIQVIJCQkJc2tpcF9vZmZzZXQ7CisKKwkvLyBWZXJpZnkgVGhlIFJTTiBJRSBjb250YWluZWQgaW4gUGFpcmV3aXNlLU1zZyAzIGFuZCBza2lwIGl0CisJaWYgKGJQYWlyZXdpc2UpCisgICAgeworCQkvLyBDaGVjayBSU04gSUUgd2hldGhlciBpdCBpcyBXUEEyL1dQQTJQU0sKKwkJaWYgKCFDaGVja1JTTklFKHBBZCwgcEtleURhdGEsIEtleURhdGFMZW4sICZza2lwX29mZnNldCkpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlBhcnNlS2V5RGF0YSA9PT4gV1BBMi9XUEEyUFNLIFJTTiBJRSBtaXNtYXRjaGVkIFxuIikpOworCQkJaGV4X2R1bXAoIkdldCBLRVlEQVRBIDoiLCBwS2V5RGF0YSwgS2V5RGF0YUxlbik7CisJCQlyZXR1cm4gRkFMU0U7CisgICAgCX0KKyAgICAJZWxzZQorCQl7CisJCQkvLyBza2lwIFJTTiBJRQorCQkJcE15S2V5RGF0YSArPSBza2lwX29mZnNldDsKKwkJCUtleURhdGFMZW5ndGggLT0gc2tpcF9vZmZzZXQ7CisKKwkJCS8vREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGFyc2VLZXlEYXRhID09PiBXUEEyL1dQQTJQU0sgUlNOIElFIG1hdGNoZWQgaW4gTXNnIDMsIExlbmd0aCglZCkgXG4iLCBza2lwX29mZnNldCkpOworCQl9CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJQYXJzZUtleURhdGEgPT0+IEtleURhdGFMZW5ndGggJWQgd2l0aG91dCBSU05fSUUgXG4iLCBLZXlEYXRhTGVuZ3RoKSk7CisKKwkvLyBQYXJzZSBFS0QgZm9ybWF0CisJaWYgKEtleURhdGFMZW5ndGggPj0gOCkKKyAgICB7CisgICAgICAgIHBLREUgPSAoUEtERV9FTkNBUCkgcE15S2V5RGF0YTsKKyAgICB9CisJZWxzZQorICAgIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1I6IEtleURhdGFMZW5ndGggaXMgdG9vIHNob3J0IFxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisKKwkvLyBTYW5pdHkgY2hlY2sgLSBzaGFyZWQga2V5IGluZGV4IHNob3VsZCBub3QgYmUgMAorCWlmIChwS0RFLT5HVEtFbmNhcC5LaWQgPT0gMCkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVSUk9SOiBHVEsgS2V5IGluZGV4IHplcm8gXG4iKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKwkvLyBTYW5pdHkgY2hlY2sgLSBLRUQgbGVuZ3RoCisJaWYgKEtleURhdGFMZW5ndGggPCAocEtERS0+TGVuICsgMikpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUjogVGhlIGxlbiBmcm9tIEtERSBpcyB0b28gc2hvcnQgXG4iKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKwkvLyBHZXQgR1RLIGxlbmd0aCAtIHJlZmVyIHRvIElFRUUgODAyLjExaS0yMDA0IHAuODIKKwlHVEtMRU4gPSBwS0RFLT5MZW4gLTY7CisKKwlpZiAoR1RLTEVOIDwgTEVOX0FFU19LRVkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUjogR1RLIEtleSBsZW5ndGggaXMgdG9vIHNob3J0ICglZCkgXG4iLCBHVEtMRU4pKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCX0KKwllbHNlCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkdUSyBLZXkgd2l0aCBLREUgZm9ybWV0IGdvdCBpbmRleD0lZCwgbGVuPSVkIFxuIiwgcEtERS0+R1RLRW5jYXAuS2lkLCBHVEtMRU4pKTsKKworCS8vIFVwZGF0ZSBHVEsKKwkvLyBzZXQga2V5IG1hdGVyaWFsLCBUeE1pYyBhbmQgUnhNaWMgZm9yIFdQQVBTSworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLkdUSywgcEtERS0+R1RLRW5jYXAuR1RLLCAzMik7CisJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gcEtERS0+R1RLRW5jYXAuS2lkOworCisJLy8gVXBkYXRlIHNoYXJlZCBrZXkgdGFibGUKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKwlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbiA9IExFTl9US0lQX0VLOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LCBwS0RFLT5HVEtFbmNhcC5HVEssIExFTl9US0lQX0VLKTsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlJ4TWljLCAmcEtERS0+R1RLRW5jYXAuR1RLWzE2XSwgTEVOX1RLSVBfUlhNSUNLKTsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLCAmcEtERS0+R1RLRW5jYXAuR1RLWzI0XSwgTEVOX1RLSVBfVFhNSUNLKTsKKworCS8vIFVwZGF0ZSBTaGFyZWQgS2V5IENpcGhlckFsZworCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7CisJZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworCisJcmV0dXJuIFRSVUU7CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNpc2NvIENDS00gUFJGIGZ1bmN0aW9uCisKKwlBcmd1bWVudHM6CisJCWtleQkJCQlDaXNjbyBCYXNlIFRyYW5zaWVudCBLZXkgKEJUSykKKwkJa2V5X2xlbgkJCVRoZSBrZXkgbGVuZ3RoIG9mIHRoZSBCVEsKKwkJZGF0YQkJCVJ1cXVlc3QgTnVtYmVyKFJOKSArIEJTU0lECisJCWRhdGFfbGVuCQlUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhCisJCW91dHB1dAkJCVN0b3JlIGZvciBQVEsoUGFpcndpc2UgdHJhbnNpZW50IGtleXMpCisJCWxlbgkJCQlUaGUgbGVuZ3RoIG9mIHRoZSBvdXRwdXQKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisJCTgwMi4xaQlBbm5leCBGLjkKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQ0NLTVBSRigKKwlJTglVQ0hBUgkqa2V5LAorCUlOCUlOVAkJa2V5X2xlbiwKKwlJTglVQ0hBUgkqZGF0YSwKKwlJTglJTlQJCWRhdGFfbGVuLAorCU9VVAlVQ0hBUgkqb3V0cHV0LAorCUlOCUlOVAkJbGVuKQoreworCUlOVAkJaTsKKwlVQ0hBUglpbnB1dFsxMDI0XTsKKwlJTlQJCWN1cnJlbnRpbmRleCA9IDA7CisJSU5UCQl0b3RhbF9sZW47CisKKwlOZGlzTW92ZU1lbW9yeShpbnB1dCwgZGF0YSwgZGF0YV9sZW4pOworCXRvdGFsX2xlbiA9IGRhdGFfbGVuOworCWlucHV0W3RvdGFsX2xlbl0gPSAwOworCXRvdGFsX2xlbisrOworCWZvcgkoaSA9IDA7CWkgPAkobGVuICsgMTkpIC8gMjA7IGkrKykKKwl7CisJCUhNQUNfU0hBMShpbnB1dCwgdG90YWxfbGVuLAlrZXksIGtleV9sZW4sICZvdXRwdXRbY3VycmVudGluZGV4XSk7CisJCWN1cnJlbnRpbmRleCArPQkyMDsKKwkJaW5wdXRbdG90YWxfbGVuIC0gMV0rKzsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlQcm9jZXNzIE1JQyBlcnJvciBpbmRpY2F0aW9uIGFuZCByZWNvcmQgTUlDIGVycm9yIHRpbWVyLgorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcFdwYUtleSAJCVBvaW50ZXIgdG8gdGhlIFdQQSBrZXkgc3RydWN0dXJlCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFJlcG9ydE1pY0Vycm9yKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBDSVBIRVJfS0VZIAlwV3BhS2V5KQoreworCVVMT05HCU5vdzsKKyAgICBVQ0hBUiAgIHVuaWNhc3RLZXkgPSAocFdwYUtleS0+VHlwZSA9PSBQQUlSV0lTRV9LRVkgPyAxOjApOworCisJLy8gUmVjb3JkIExhc3QgTUlDIGVycm9yIHRpbWUgYW5kIGNvdW50CisJTm93ID0gamlmZmllczsKKwlpZiAocEFkLT5TdGFDZmcuTWljRXJyQ250ID09IDApCisJeworCQlwQWQtPlN0YUNmZy5NaWNFcnJDbnQrKzsKKwkJcEFkLT5TdGFDZmcuTGFzdE1pY0Vycm9yVGltZSA9IE5vdzsKKyAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgOCk7CisJfQorCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLk1pY0VyckNudCA9PSAxKQorCXsKKwkJaWYgKChwQWQtPlN0YUNmZy5MYXN0TWljRXJyb3JUaW1lICsgKDYwICogT1NfSFopKSA8IE5vdykKKwkJeworCQkJLy8gVXBkYXRlIExhc3QgTUlDIGVycm9yIHRpbWUsIHRoaXMgZGlkIG5vdCB2aW9sYXRlIHR3byBNSUMgZXJyb3JzIHdpdGhpbiA2MCBzZWNvbmRzCisJCQlwQWQtPlN0YUNmZy5MYXN0TWljRXJyb3JUaW1lID0gTm93OworCQl9CisJCWVsc2UKKwkJeworCisJCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfQ09VTlRFUl9NRUFTVVJFU19FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworCisJCQlwQWQtPlN0YUNmZy5MYXN0TWljRXJyb3JUaW1lID0gTm93OworCQkJLy8gVmlvbGF0ZSBNSUMgZXJyb3IgY291bnRzLCBNSUMgY291bnRlcm1lYXN1cmVzIGtpY2tzIGluCisJCQlwQWQtPlN0YUNmZy5NaWNFcnJDbnQrKzsKKwkJfQorCX0KKwllbHNlCisJeworCQkvLyBNSUMgZXJyb3IgY291bnQgPj0gMgorCQkvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuCisJCTsKKwl9CisgICAgTWxtZUVucXVldWUocEFkLAorCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJCU9JRF84MDJfMTFfTUlDX0ZBSUxVUkVfUkVQT1JUX0ZSQU1FLAorCQkJCTEsCisJCQkJJnVuaWNhc3RLZXkpOworCisgICAgaWYgKHBBZC0+U3RhQ2ZnLk1pY0VyckNudCA9PSAyKQorICAgIHsKKyAgICAgICAgUlRNUFNldFRpbWVyKCZwQWQtPlN0YUNmZy5XcGFEaXNhc3NvY0FuZEJsb2NrQXNzb2NUaW1lciwgMTAwKTsKKyAgICB9Cit9CisKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNkZWZpbmUJTEVOR1RIX0VBUF9IICAgIDQKKy8vIElmIHRoZSByZWNlaXZlZCBmcmFtZSBpcyBFQVAtUGFja2V0ICxmaW5kIG91dCBpdHMgRUFQLUNvZGUgKFJlcXVlc3QoMHgwMSksIFJlc3BvbnNlKDB4MDIpLCBTdWNjZXNzKDB4MDMpLCBGYWlsdXJlKDB4MDQpKS4KK0lOVAkgICAgV3BhQ2hlY2tFYXBDb2RlKAorCUlOICBQUlRNUF9BREFQVEVSICAgCQlwQWQsCisJSU4gIFBVQ0hBUgkJCQlwRnJhbWUsCisJSU4gIFVTSE9SVAkJCQlGcmFtZUxlbiwKKwlJTiAgVVNIT1JUCQkJCU9mZlNldCkKK3sKKworCVBVQ0hBUglwRGF0YTsKKwlJTlQJcmVzdWx0ID0gMDsKKworCWlmKCBGcmFtZUxlbiA8IE9mZlNldCArIExFTkdUSF9FQVBPTF9IICsgTEVOR1RIX0VBUF9IICkKKwkJcmV0dXJuIHJlc3VsdDsKKworCXBEYXRhID0gcEZyYW1lICsgT2ZmU2V0OyAvLyBza2lwIG9mZnNldCBieXRlcworCisJaWYoKihwRGF0YSsxKSA9PSBFQVBQYWNrZXQpIAkvLyA4MDIuMXggaGVhZGVyIC0gUGFja2V0IFR5cGUKKwl7CisJCSByZXN1bHQgPSAqKHBEYXRhKzQpOwkJLy8gRUFQIGhlYWRlciAtIENvZGUKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitWT0lEICAgIFdwYVNlbmRNaWNGYWlsdXJlVG9XcGFTdXBwbGljYW50KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgIHBBZCwKKyAgICBJTiAgQk9PTEVBTiAgICAgICAgICBiVW5pY2FzdCkKK3sKKyAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisgICAgY2hhciBjdXN0b21bSVdfQ1VTVE9NX01BWF0gPSB7MH07CisKKyAgICBzcHJpbnRmKGN1c3RvbSwgIk1MTUUtTUlDSEFFTE1JQ0ZBSUxVUkUuaW5kaWNhdGlvbiIpOworICAgIGlmIChiVW5pY2FzdCkKKyAgICAgICAgc3ByaW50ZihjdXN0b20sICIlcyB1bmljYXN0IiwgY3VzdG9tKTsKKyAgICB3cnF1LmRhdGEubGVuZ3RoID0gc3RybGVuKGN1c3RvbSk7CisgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBjdXN0b20pOworCisgICAgcmV0dXJuOworfQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworVk9JRAlXcGFNaWNGYWlsdXJlUmVwb3J0RnJhbWUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVBVQ0hBUiAgICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJVUNIQVIgICAgICAgICAgICAgICBIZWFkZXI4MDJfM1sxNF07CisJVUxPTkcgICAgICAgICAgICAgICBGcmFtZUxlbiA9IDA7CisJRUFQT0xfUEFDS0VUICAgICAgICBQYWNrZXQ7CisJVUNIQVIgICAgICAgICAgICAgICBNaWNbMTZdOworICAgIEJPT0xFQU4gICAgICAgICAgICAgYlVuaWNhc3Q7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGFNaWNGYWlsdXJlUmVwb3J0RnJhbWUgLS0tLS0+XG4iKSk7CisKKyAgICBiVW5pY2FzdCA9IChFbGVtLT5Nc2dbMF0gPT0gMSA/IFRSVUU6RkFMU0UpOworCXBBZC0+U2VxdWVuY2UgPSAoKHBBZC0+U2VxdWVuY2UpICsgMSkgJiAoTUFYX1NFUV9OVU1CRVIpOworCisJLy8gaW5pdCA4MDIuMyBoZWFkZXIgYW5kIEZpbGwgUGFja2V0CisJTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7CisKKwlOZGlzWmVyb01lbW9yeSgmUGFja2V0LCBzaXplb2YoUGFja2V0KSk7CisJUGFja2V0LlByb1Zlcgk9IEVBUE9MX1ZFUjsKKwlQYWNrZXQuUHJvVHlwZQk9IEVBUE9MS2V5OworCisJUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTFfS0VZX0RFU0M7CisKKyAgICAvLyBSZXF1ZXN0IGZpZWxkIHByZXNlbnRlZAorICAgIFBhY2tldC5LZXlEZXNjLktleUluZm8uUmVxdWVzdCA9IDE7CisKKwlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJeworCQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPSAyOworCX0KKwllbHNlCSAgLy8gVEtJUAorCXsKKwkJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gMTsKKwl9CisKKyAgICBQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleVR5cGUgPSAoYlVuaWNhc3QgPyBQQUlSV0lTRUtFWSA6IEdST1VQS0VZKTsKKworCS8vIEtleU1pYyBmaWVsZCBwcmVzZW50ZWQKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleU1pYyAgPSAxOworCisgICAgLy8gRXJyb3IgZmllbGQgcHJlc2VudGVkCisJUGFja2V0LktleURlc2MuS2V5SW5mby5FcnJvciAgPSAxOworCisJLy8gVXBkYXRlIHBhY2tldCBsZW5ndGggYWZ0ZXIgZGVjaWRlIEtleSBkYXRhIHBheWxvYWQKKwlQYWNrZXQuQm9keV9MZW5bMV0gID0gc2l6ZW9mKEtFWV9ERVNDUklQVEVSKSAtIE1BWF9MRU5fT0ZfUlNOSUU7CisKKwkvLyBLZXkgUmVwbGF5IENvdW50CisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuUmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisgICAgaW5jX2J5dGVfYXJyYXkocEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgOCk7CisKKwkvLyBDb252ZXJ0IHRvIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgorCSooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSk7CisKKworCU1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVUNIQVIgKikmcE91dEJ1ZmZlcik7ICAvLyBhbGxvY2F0ZSBtZW1vcnkKKwlpZihwT3V0QnVmZmVyID09IE5VTEwpCisJeworCQlyZXR1cm47CisJfQorCisJLy8gUHJlcGFyZSBFQVBPTCBmcmFtZSBmb3IgTUlDIGNhbGN1bGF0aW9uCisJLy8gQmUgY2FyZWZ1bCwgb25seSBFQVBPTCBmcmFtZSBpcyBjb3VudGVkIGZvciBNSUMgY2FsY3VsYXRpb24KKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKwkJICAgICAgICAgICAgICBQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAgICZQYWNrZXQsCisJCSAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworCisJLy8gUHJlcGFyZSBhbmQgRmlsbCBNSUMgdmFsdWUKKwlOZGlzWmVyb01lbW9yeShNaWMsIHNpemVvZihNaWMpKTsKKwlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJewkvLyBBRVMKKyAgICAgICAgVUNIQVIgZGlnZXN0WzIwXSA9IHswfTsKKwkJSE1BQ19TSEExKHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJTmRpc01vdmVNZW1vcnkoTWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKwllbHNlCisJewkvLyBUS0lQCisJCWhtYWNfbWQ1KHBBZC0+U3RhQ2ZnLlBUSywgIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIE1pYyk7CisJfQorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKworICAgIE1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAJJkZyYW1lTGVuLAorICAgIAkgIAkJCUxFTkdUSF84MDJfMywgICAgIAkJCSZIZWFkZXI4MDJfMywKKyAgICAJCQkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgICAgICZQYWNrZXQsCisgICAgCQkJCUVORF9PRl9BUkdTKTsKKworCS8vIG9weSBmcmFtZSB0byBUeCByaW5nIGFuZCBzZW5kIE1JQyBmYWlsdXJlIHJlcG9ydCBmcmFtZSB0byBhdXRoZW50aWNhdG9yCisJUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zLCAoUFVDSEFSKSZQYWNrZXQsIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsIEZBTFNFKTsKKworCU1sbWVGcmVlTWVtb3J5KHBBZCwgKFBVQ0hBUilwT3V0QnVmZmVyKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYU1pY0ZhaWx1cmVSZXBvcnRGcmFtZSA8LS0tLS1cbiIpKTsKK30KKworLyoqIGZyb20gd3BhX3N1cHBsaWNhbnQKKyAqIGluY19ieXRlX2FycmF5IC0gSW5jcmVtZW50IGFyYml0cmFyeSBsZW5ndGggYnl0ZSBhcnJheSBieSBvbmUKKyAqIEBjb3VudGVyOiBQb2ludGVyIHRvIGJ5dGUgYXJyYXkKKyAqIEBsZW46IExlbmd0aCBvZiB0aGUgY291bnRlciBpbiBieXRlcworICoKKyAqIFRoaXMgZnVuY3Rpb24gaW5jcmVtZW50cyB0aGUgbGFzdCBieXRlIG9mIHRoZSBjb3VudGVyIGJ5IG9uZSBhbmQgY29udGludWVzCisgKiByb2xsaW5nIG92ZXIgdG8gbW9yZSBzaWduaWZpY2FudCBieXRlcyBpZiB0aGUgYnl0ZSB3YXMgaW5jcmVtZW50ZWQgZnJvbQorICogMHhmZiB0byAweDAwLgorICovCit2b2lkIGluY19ieXRlX2FycmF5KFVDSEFSICpjb3VudGVyLCBpbnQgbGVuKQoreworCWludCBwb3MgPSBsZW4gLSAxOworCXdoaWxlIChwb3MgPj0gMCkgeworCQljb3VudGVyW3Bvc10rKzsKKwkJaWYgKGNvdW50ZXJbcG9zXSAhPSAwKQorCQkJYnJlYWs7CisJCXBvcy0tOworCX0KK30KKworVk9JRCBXcGFEaXNhc3NvY0FwQW5kQmxvY2tBc3NvYygKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisgICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisgICAgUlRNUF9BREFQVEVSICAgICAgICAgICAgICAgICpwQWQgPSAoUFJUTVBfQURBUFRFUilGdW5jdGlvbkNvbnRleHQ7CisgICAgTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUICAgIERpc2Fzc29jUmVxOworCisJLy8gZGlzYXNzb2MgZnJvbSBjdXJyZW50IEFQIGZpcnN0CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFJlcG9ydE1pY0Vycm9yIC0gZGlzYXNzb2NpYXRlIHdpdGggY3VycmVudCBBUCBhZnRlciBzZW5kaW5nIHNlY29uZCBjb250aW51b3VzIEVBUE9MIGZyYW1lXG4iKSk7CisJRGlzYXNzb2NQYXJtRmlsbChwQWQsICZEaXNhc3NvY1JlcSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIFJFQVNPTl9NSUNfRkFJTFVSRSk7CisJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsIHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpLCAmRGlzYXNzb2NSZXEpOworCisJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9ESVNBU1NPQzsKKwlwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyA9IFRSVUU7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhX2lvY3RsLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YV9pb2N0bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYTJiMmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YV9pb2N0bC5jCkBAIC0wLDAgKzEsNjk0NCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICBzdGFfaW9jdGwuYworCisgICAgQWJzdHJhY3Q6CisgICAgSU9DVEwgcmVsYXRlZCBzdWJyb3V0aW5lcworCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBSb3J5IENoZW4gICAwMS0wMy0yMDAzICAgIGNyZWF0ZWQKKwlSb3J5IENoZW4gICAwMi0xNC0yMDA1ICAgIG1vZGlmeSB0byBzdXBwb3J0IFJUNjEKKyovCisKKyNpbmNsdWRlCSJydF9jb25maWcuaCIKKworI2lmZGVmIERCRworZXh0ZXJuIFVMT05HICAgIFJURGVidWdMZXZlbDsKKyNlbmRpZgorCisjZGVmaW5lIE5SX1dFUF9LRVlTIAkJCQk0CisjZGVmaW5lIFdFUF9TTUFMTF9LRVlfTEVOIAkJCSg0MC84KQorI2RlZmluZSBXRVBfTEFSR0VfS0VZX0xFTiAJCQkoMTA0LzgpCisKKyNkZWZpbmUgR1JPVVBfS0VZX05PICAgICAgICAgICAgICAgIDQKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpCisjZGVmaW5lIElXRV9TVFJFQU1fQUREX0VWRU5UKF9BLCBfQiwgX0MsIF9ELCBfRSkJCWl3ZV9zdHJlYW1fYWRkX2V2ZW50KF9BLCBfQiwgX0MsIF9ELCBfRSkKKyNkZWZpbmUgSVdFX1NUUkVBTV9BRERfUE9JTlQoX0EsIF9CLCBfQywgX0QsIF9FKQkJaXdlX3N0cmVhbV9hZGRfcG9pbnQoX0EsIF9CLCBfQywgX0QsIF9FKQorI2RlZmluZSBJV0VfU1RSRUFNX0FERF9WQUxVRShfQSwgX0IsIF9DLCBfRCwgX0UsIF9GKQlpd2Vfc3RyZWFtX2FkZF92YWx1ZShfQSwgX0IsIF9DLCBfRCwgX0UsIF9GKQorI2Vsc2UKKyNkZWZpbmUgSVdFX1NUUkVBTV9BRERfRVZFTlQoX0EsIF9CLCBfQywgX0QsIF9FKQkJaXdlX3N0cmVhbV9hZGRfZXZlbnQoX0IsIF9DLCBfRCwgX0UpCisjZGVmaW5lIElXRV9TVFJFQU1fQUREX1BPSU5UKF9BLCBfQiwgX0MsIF9ELCBfRSkJCWl3ZV9zdHJlYW1fYWRkX3BvaW50KF9CLCBfQywgX0QsIF9FKQorI2RlZmluZSBJV0VfU1RSRUFNX0FERF9WQUxVRShfQSwgX0IsIF9DLCBfRCwgX0UsIF9GKQlpd2Vfc3RyZWFtX2FkZF92YWx1ZShfQiwgX0MsIF9ELCBfRSwgX0YpCisjZW5kaWYKKworZXh0ZXJuIFVDSEFSICAgIENpcGhlcldwYTJUZW1wbGF0ZVtdOworZXh0ZXJuIFVDSEFSICAgIENpcGhlcldwYVBza1RraXBbXTsKK2V4dGVybiBVQ0hBUiAgICBDaXBoZXJXcGFQc2tUa2lwTGVuOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JUX1ZFUlNJT05fSU5GT3sKKyAgICBVQ0hBUiAgICAgICBEcml2ZXJWZXJzaW9uVzsKKyAgICBVQ0hBUiAgICAgICBEcml2ZXJWZXJzaW9uWDsKKyAgICBVQ0hBUiAgICAgICBEcml2ZXJWZXJzaW9uWTsKKyAgICBVQ0hBUiAgICAgICBEcml2ZXJWZXJzaW9uWjsKKyAgICBVSU5UICAgICAgICBEcml2ZXJCdWlsZFllYXI7CisgICAgVUlOVCAgICAgICAgRHJpdmVyQnVpbGRNb250aDsKKyAgICBVSU5UICAgICAgICBEcml2ZXJCdWlsZERheTsKK30gUlRfVkVSU0lPTl9JTkZPLCAqUFJUX1ZFUlNJT05fSU5GTzsKKworc3RydWN0IGl3X3ByaXZfYXJncyBwcml2dGFiW10gPSB7Cit7IFJUUFJJVl9JT0NUTF9TRVQsCisgIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgMCwKKyAgInNldCJ9LAorCit7IFJUUFJJVl9JT0NUTF9TSE9XLCAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLAorICAiIn0sCit7IFJUUFJJVl9JT0NUTF9TSE9XLCBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssCisgICIifSwKKy8qIC0tLSBzdWItaW9jdGxzIGRlZmluaXRpb25zIC0tLSAqLworICAgIHsgU0hPV19DT05OX1NUQVRVUywKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJjb25uU3RhdHVzIiB9LAorCXsgU0hPV19EUlZJRVJfVkVSSU9OLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImRyaXZlclZlciIgfSwKKyAgICB7IFNIT1dfQkFfSU5GTywKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJiYWluZm8iIH0sCisJeyBTSE9XX0RFU0NfSU5GTywKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJkZXNjaW5mbyIgfSwKKyAgICB7IFJBSU9fT0ZGLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgInJhZGlvX29mZiIgfSwKKwl7IFJBSU9fT04sCisJICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAicmFkaW9fb24iIH0sCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJeyBTSE9XX0RMU19FTlRSWV9JTkZPLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImRsc2VudHJ5aW5mbyIgfSwKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwl7IFNIT1dfQ0ZHX1ZBTFVFLAorCSAgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAic2hvdyIgfSwKKy8qIC0tLSBzdWItaW9jdGxzIHJlbGF0aW9ucyAtLS0gKi8KKworI2lmZGVmIERCRworeyBSVFBSSVZfSU9DVExfQkJQLAorICBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLAorICAiYmJwIn0sCit7IFJUUFJJVl9JT0NUTF9NQUMsCisgIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LAorICAibWFjIn0sCit7IFJUUFJJVl9JT0NUTF9FMlAsCisgIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LAorICAiZTJwIn0sCisjZW5kaWYgIC8qIERCRyAqLworCit7IFJUUFJJVl9JT0NUTF9TVEFUSVNUSUNTLAorICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLAorICAic3RhdCJ9LAoreyBSVFBSSVZfSU9DVExfR1NJVEVTVVJWRVksCisgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwKKyAgImdldF9zaXRlX3N1cnZleSJ9LAorfTsKKworSU5UIFNldF9TU0lEX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKKyNpZmRlZiBXTU1fU1VQUE9SVAorSU5UCVNldF9XbW1DYXBhYmxlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKyNlbmRpZgorCitJTlQgU2V0X05ldHdvcmtUeXBlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfQXV0aE1vZGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9FbmNyeXBUeXBlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfRGVmYXVsdEtleUlEX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfS2V5MV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0tleTJfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9LZXkzX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfS2V5NF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X1dQQVBTS19Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCisKK0lOVCBTZXRfUFNNb2RlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCitJTlQgU2V0X1dwYV9TdXBwb3J0KAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjaWZkZWYgREJHCitWT0lEIFJUTVBJb2N0bEJCUCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCXN0cnVjdCBpd3JlcQkqd3JxKTsKKworVk9JRCBSVE1QSW9jdGxNQUMoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglzdHJ1Y3QgaXdyZXEJKndycSk7CisKK1ZPSUQgUlRNUElvY3RsRTJQUk9NKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIHN0cnVjdCBpd3JlcSAgICAqd3JxKTsKKyNlbmRpZiAvLyBEQkcgLy8KKworCitORElTX1NUQVRVUyBSVE1QV1BBTm9uZUFkZEtleVByb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4JUFZPSUQJCQlwQnVmKTsKKworSU5UIFNldF9GcmFnVGVzdF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitJTlQgU2V0X1RHbldpZmlUZXN0X1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitJTlQgU2V0X0xvbmdSZXRyeUxpbWl0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X1Nob3J0UmV0cnlMaW1pdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKK0lOVCBTZXRfSWVlZTgwMjExZENsaWVudE1vZGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisKKyNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCitJTlQgU2V0X0NhcnJpZXJEZXRlY3RfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworCitzdGF0aWMgc3RydWN0IHsKKwlDSEFSICpuYW1lOworCUlOVCAoKnNldF9wcm9jKShQUlRNUF9BREFQVEVSIHBBZGFwdGVyLCBQVUNIQVIgYXJnKTsKK30gKlBSVE1QX1BSSVZBVEVfU0VUX1BST0MsIFJUTVBfUFJJVkFURV9TVVBQT1JUX1BST0NbXSA9IHsKKwl7IkRyaXZlclZlcnNpb24iLAkJCQlTZXRfRHJpdmVyVmVyc2lvbl9Qcm9jfSwKKwl7IkNvdW50cnlSZWdpb24iLAkJCQlTZXRfQ291bnRyeVJlZ2lvbl9Qcm9jfSwKKwl7IkNvdW50cnlSZWdpb25BQmFuZCIsCQkJU2V0X0NvdW50cnlSZWdpb25BQmFuZF9Qcm9jfSwKKwl7IlNTSUQiLAkJCQkJCVNldF9TU0lEX1Byb2N9LAorCXsiV2lyZWxlc3NNb2RlIiwJCQkJU2V0X1dpcmVsZXNzTW9kZV9Qcm9jfSwKKwl7IlR4QnVyc3QiLAkJCQkJU2V0X1R4QnVyc3RfUHJvY30sCisJeyJUeFByZWFtYmxlIiwJCQkJU2V0X1R4UHJlYW1ibGVfUHJvY30sCisJeyJUeFBvd2VyIiwJCQkJCVNldF9UeFBvd2VyX1Byb2N9LAorCXsiQ2hhbm5lbCIsCQkJCQlTZXRfQ2hhbm5lbF9Qcm9jfSwKKwl7IkJHUHJvdGVjdGlvbiIsCQkJCVNldF9CR1Byb3RlY3Rpb25fUHJvY30sCisJeyJSVFNUaHJlc2hvbGQiLAkJCQlTZXRfUlRTVGhyZXNob2xkX1Byb2N9LAorCXsiRnJhZ1RocmVzaG9sZCIsCQkJCVNldF9GcmFnVGhyZXNob2xkX1Byb2N9LAorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCXsiSHRCdyIsCQkgICAgICAgICAgICAgICAgU2V0X0h0QndfUHJvY30sCisJeyJIdE1jcyIsCQkgICAgICAgICAgICAgICAgU2V0X0h0TWNzX1Byb2N9LAorCXsiSHRHaSIsCQkgICAgICAgICAgICAgICAgU2V0X0h0R2lfUHJvY30sCisJeyJIdE9wTW9kZSIsCQkgICAgICAgICAgICBTZXRfSHRPcE1vZGVfUHJvY30sCisJeyJIdEV4dGNoYSIsCQkgICAgICAgICAgICBTZXRfSHRFeHRjaGFfUHJvY30sCisJeyJIdE1wZHVEZW5zaXR5IiwJCSAgICAgICAgU2V0X0h0TXBkdURlbnNpdHlfUHJvY30sCisJeyJIdEJhV2luU2l6ZSIsCQkgICAgICAgIAlTZXRfSHRCYVdpblNpemVfUHJvY30sCisJeyJIdFJkZyIsCQkgICAgICAgIAkJU2V0X0h0UmRnX1Byb2N9LAorCXsiSHRBbXNkdSIsCQkgICAgICAgIAkJU2V0X0h0QW1zZHVfUHJvY30sCisJeyJIdEF1dG9CYSIsCQkgICAgICAgIAlTZXRfSHRBdXRvQmFfUHJvY30sCisJeyJIdEJhRGVjbGluZSIsCQkJCQlTZXRfQkFEZWNsaW5lX1Byb2N9LAorCXsiSHRQcm90ZWN0IiwJCSAgICAgICAgCVNldF9IdFByb3RlY3RfUHJvY30sCisJeyJIdE1pbW9QcyIsCQkgICAgICAgIAlTZXRfSHRNaW1vUHNfUHJvY30sCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKyNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCisJeyJQa3RBZ2dyZWdhdGUiLAkJCQlTZXRfUGt0QWdncmVnYXRlX1Byb2N9LAorI2VuZGlmCisKKyNpZmRlZiBXTU1fU1VQUE9SVAorCXsiV21tQ2FwYWJsZSIsCQkJCQlTZXRfV21tQ2FwYWJsZV9Qcm9jfSwKKyNlbmRpZgorCXsiSUVFRTgwMjExSCIsCQkJCQlTZXRfSUVFRTgwMjExSF9Qcm9jfSwKKyAgICB7Ik5ldHdvcmtUeXBlIiwgICAgICAgICAgICAgICAgIFNldF9OZXR3b3JrVHlwZV9Qcm9jfSwKKwl7IkF1dGhNb2RlIiwJCQkJCVNldF9BdXRoTW9kZV9Qcm9jfSwKKwl7IkVuY3J5cFR5cGUiLAkJCQkJU2V0X0VuY3J5cFR5cGVfUHJvY30sCisJeyJEZWZhdWx0S2V5SUQiLAkJCQlTZXRfRGVmYXVsdEtleUlEX1Byb2N9LAorCXsiS2V5MSIsCQkJCQkJU2V0X0tleTFfUHJvY30sCisJeyJLZXkyIiwJCQkJCQlTZXRfS2V5Ml9Qcm9jfSwKKwl7IktleTMiLAkJCQkJCVNldF9LZXkzX1Byb2N9LAorCXsiS2V5NCIsCQkJCQkJU2V0X0tleTRfUHJvY30sCisJeyJXUEFQU0siLAkJCQkJCVNldF9XUEFQU0tfUHJvY30sCisJeyJSZXNldENvdW50ZXIiLAkJCQlTZXRfUmVzZXRTdGF0Q291bnRlcl9Qcm9jfSwKKwl7IlBTTW9kZSIsICAgICAgICAgICAgICAgICAgICAgIFNldF9QU01vZGVfUHJvY30sCisjaWZkZWYgREJHCisJeyJEZWJ1ZyIsCQkJCQkJU2V0X0RlYnVnX1Byb2N9LAorI2VuZGlmCisKKyNpZmRlZiBSQUxJTktfQVRFCisJeyJBVEUiLAkJCQkJCQlTZXRfQVRFX1Byb2N9LAorCXsiQVRFREEiLAkJCQkJCVNldF9BVEVfREFfUHJvY30sCisJeyJBVEVTQSIsCQkJCQkJU2V0X0FURV9TQV9Qcm9jfSwKKwl7IkFURUJTU0lEIiwJCQkJCVNldF9BVEVfQlNTSURfUHJvY30sCisJeyJBVEVDSEFOTkVMIiwJCQkJCVNldF9BVEVfQ0hBTk5FTF9Qcm9jfSwKKwl7IkFURVRYUE9XMCIsCQkJCQlTZXRfQVRFX1RYX1BPV0VSMF9Qcm9jfSwKKwl7IkFURVRYUE9XMSIsCQkJCQlTZXRfQVRFX1RYX1BPV0VSMV9Qcm9jfSwKKwl7IkFURVRYQU5UIiwJCQkJCVNldF9BVEVfVFhfQW50ZW5uYV9Qcm9jfSwKKwl7IkFURVJYQU5UIiwJCQkJCVNldF9BVEVfUlhfQW50ZW5uYV9Qcm9jfSwKKwl7IkFURVRYRlJFUU9GRlNFVCIsCQkJCVNldF9BVEVfVFhfRlJFUU9GRlNFVF9Qcm9jfSwKKwl7IkFURVRYQlciLAkJCQkJCVNldF9BVEVfVFhfQldfUHJvY30sCisJeyJBVEVUWExFTiIsCQkJCQlTZXRfQVRFX1RYX0xFTkdUSF9Qcm9jfSwKKwl7IkFURVRYQ05UIiwJCQkJCVNldF9BVEVfVFhfQ09VTlRfUHJvY30sCisJeyJBVEVUWE1DUyIsCQkJCQlTZXRfQVRFX1RYX01DU19Qcm9jfSwKKwl7IkFURVRYTU9ERSIsCQkJCQlTZXRfQVRFX1RYX01PREVfUHJvY30sCisJeyJBVEVUWEdJIiwJCQkJCQlTZXRfQVRFX1RYX0dJX1Byb2N9LAorCXsiQVRFUlhGRVIiLAkJCQkJU2V0X0FURV9SWF9GRVJfUHJvY30sCisJeyJBVEVSUkYiLAkJCQkJCVNldF9BVEVfUmVhZF9SRl9Qcm9jfSwKKwl7IkFURVdSRjEiLAkJCQkJCVNldF9BVEVfV3JpdGVfUkYxX1Byb2N9LAorCXsiQVRFV1JGMiIsCQkJCQkJU2V0X0FURV9Xcml0ZV9SRjJfUHJvY30sCisJeyJBVEVXUkYzIiwJCQkJCQlTZXRfQVRFX1dyaXRlX1JGM19Qcm9jfSwKKwl7IkFURVdSRjQiLAkJCQkJCVNldF9BVEVfV3JpdGVfUkY0X1Byb2N9LAorCXsiQVRFTERFMlAiLAkJCQkgICAgU2V0X0FURV9Mb2FkX0UyUF9Qcm9jfSwKKwl7IkFURVJFMlAiLAkJCQkJCVNldF9BVEVfUmVhZF9FMlBfUHJvY30sCisJeyJBVEVTSE9XIiwJCQkJCQlTZXRfQVRFX1Nob3dfUHJvY30sCisJeyJBVEVIRUxQIiwJCQkJCQlTZXRfQVRFX0hlbHBfUHJvY30sCisKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCXsiVHhTdG9wIiwJCQkJCQlTZXRfVHhTdG9wX1Byb2N9LAorCXsiUnhTdG9wIiwJCQkJCQlTZXRfUnhTdG9wX1Byb2N9LAorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIHsiV3BhU3VwcG9ydCIsICAgICAgICAgICAgICAgICAgU2V0X1dwYV9TdXBwb3J0fSwKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKworCisJeyJGaXhlZFR4TW9kZSIsICAgICAgICAgICAgICAgICBTZXRfRml4ZWRUeE1vZGVfUHJvY30sCisjaWZkZWYgQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQKKwl7Ik9wTW9kZSIsCQkJCQkJU2V0X09wTW9kZV9Qcm9jfSwKKyNlbmRpZiAvLyBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVCAvLworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgIHsiVEduV2lmaVRlc3QiLCAgICAgICAgICAgICAgICAgU2V0X1RHbldpZmlUZXN0X1Byb2N9LAorICAgIHsiRm9yY2VHRiIsCQkgICAgICAgIAkJU2V0X0ZvcmNlR0ZfUHJvY30sCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJeyJEbHNBZGRFbnRyeSIsCQkJCQlTZXRfRGxzQWRkRW50cnlfUHJvY30sCisJeyJEbHNUZWFyRG93bkVudHJ5IiwJCQlTZXRfRGxzVGVhckRvd25FbnRyeV9Qcm9jfSwKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwl7IkxvbmdSZXRyeSIsCSAgICAgICAgCQlTZXRfTG9uZ1JldHJ5TGltaXRfUHJvY30sCisJeyJTaG9ydFJldHJ5IiwJICAgICAgICAJCVNldF9TaG9ydFJldHJ5TGltaXRfUHJvY30sCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCXsiMTFkQ2xpZW50TW9kZSIsCQkJCVNldF9JZWVlODAyMTFkQ2xpZW50TW9kZV9Qcm9jfSwKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVAorCXsiQ2FycmllckRldGVjdCIsCQkJCVNldF9DYXJyaWVyRGV0ZWN0X1Byb2N9LAorI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKworCXtOVUxMLH0KK307CisKKworVk9JRCBSVE1QQWRkS2V5KAorCUlOCVBSVE1QX0FEQVBURVIJICAgIHBBZCwKKwlJTglQTkRJU184MDJfMTFfS0VZICAgIHBLZXkpCit7CisJVUxPTkcJCQkJS2V5SWR4OworCU1BQ19UQUJMRV9FTlRSWSAgCSpwRW50cnk7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QQWRkS2V5IC0tLS0tLT5cbiIpKTsKKworCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJeworCQlpZiAocEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKQorCQl7CisJCSAgICBpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5QTUssIDMyKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5QTUssIHBLZXktPktleU1hdGVyaWFsLCBwS2V5LT5LZXlMZW5ndGgpOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfQorCQkgICAgLy8gVXBkYXRlIFBUSworCQkgICAgTmRpc1plcm9NZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworICAgICAgICAgICAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIHBLZXktPktleU1hdGVyaWFsLCBMRU5fVEtJUF9FSyk7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSywgTEVOX1RLSVBfVFhNSUNLKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSyArIExFTl9US0lQX1RYTUlDSywgTEVOX1RLSVBfUlhNSUNLKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssIExFTl9US0lQX1RYTUlDSyk7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIERlY2lkZSBpdHMgQ2hpcGVyQWxnCisgICAgICAgIAlpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorICAgICAgICAJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9US0lQOworICAgICAgICAJZWxzZSBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorICAgICAgICAJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7CisgICAgICAgIAllbHNlCisgICAgICAgIAkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGVzZSByZWxhdGVkIGluZm9ybWF0aW9uIHRvIE1BQ19UQUJMRV9FTlRSWQorICAgICAgICAJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LktleSwgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBMRU5fVEtJUF9FSyk7CisgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LlJ4TWljLCBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYywgTEVOX1RLSVBfUlhNSUNLKTsKKyAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuVHhNaWMsIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLCBMRU5fVEtJUF9UWE1JQ0spOworICAgICAgICAJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGc7CisKKyAgICAgICAgCS8vIFVwZGF0ZSBwYWlyd2lzZSBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCisgICAgICAgIAlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAorICAgICAgICAJCQkJCQkgIEJTUzAsCisgICAgICAgIAkJCQkJCSAgMCwKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljKTsKKworICAgICAgICAJLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCisgICAgICAgIAlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKyAgICAgICAgCQkJCQkJCSAgQlNTMCwKKyAgICAgICAgCQkJCQkJCSAgMCwKKyAgICAgICAgCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAorICAgICAgICAJCQkJCQkJICBwRW50cnkpOworCisgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAorCQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKKworICAgICAgICAgICAgICAgIC8vIEluZGljYXRlIENvbm5lY3RlZCBmb3IgR1VJCisgICAgICAgICAgICAgICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKyAgICAgICAgICAgIH0KKwkJfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFVwZGF0ZSBHVEsKKyAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChwS2V5LT5LZXlJbmRleCAmIDB4RkYpOworICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0sIHNpemVvZihDSVBIRVJfS0VZKSk7CisgICAgICAgICAgICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbiA9IExFTl9US0lQX0VLOworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksIHBLZXktPktleU1hdGVyaWFsLCBMRU5fVEtJUF9FSyk7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5SeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSywgTEVOX1RLSVBfVFhNSUNLKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLICsgTEVOX1RLSVBfVFhNSUNLLCBMRU5fVEtJUF9SWE1JQ0spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLLCBMRU5fVEtJUF9UWE1JQ0spOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uUnhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSBTaGFyZWQgS2V5IENpcGhlckFsZworICAgIAkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKyAgICAJCWlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorICAgIAkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7CisgICAgCQllbHNlIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorICAgIAkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKworICAgICAgICAgICAgLy8gVXBkYXRlIGdyb3VwIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKKyAgICAgICAgCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCisgICAgICAgIAkJCQkJCSAgQlNTMCwKKyAgICAgICAgCQkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcsCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5UeE1pYywKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlJ4TWljKTsKKworICAgICAgICAJLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCisgICAgICAgIAlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKyAgICAgICAgCQkJCQkJCSAgQlNTMCwKKyAgICAgICAgCQkJCQkJCSAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAorICAgICAgICAJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZywKKyAgICAgICAgCQkJCQkJCSAgTlVMTCk7CisKKyAgICAgICAgICAgIC8vIHNldCA4MDIuMXggcG9ydCBjb250cm9sCisJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZCk7CisKKyAgICAgICAgICAgIC8vIEluZGljYXRlIENvbm5lY3RlZCBmb3IgR1VJCisgICAgICAgICAgICBwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworICAgICAgICB9CisJfQorCWVsc2UJLy8gZHluYW1pYyBXRVAgZnJvbSB3cGFfc3VwcGxpY2FudAorCXsKKwkJVUNIQVIJQ2lwaGVyQWxnOworICAgIAlQVUNIQVIJS2V5OworCisJCWlmKHBLZXktPktleUxlbmd0aCA9PSAzMikKKwkJCWdvdG8gZW5kOworCisJCUtleUlkeCA9IHBLZXktPktleUluZGV4ICYgMHgwZmZmZmZmZjsKKworCQlpZiAoS2V5SWR4IDwgNCkKKwkJeworCQkJLy8gaXQgaXMgYSBkZWZhdWx0IHNoYXJlZCBrZXksIGZvciBQYWlyd2lzZSBrZXkgc2V0dGluZworCQkJaWYgKHBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkKKwkJCXsKKwkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIHBLZXktPkJTU0lEKTsKKworCQkJCWlmIChwRW50cnkpCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QQWRkS2V5OiBTZXQgUGFpci13aXNlIEtleVxuIikpOworCisJCQkJCS8vIHNldCBrZXkgbWF0ZXJpYWwgYW5kIGtleSBsZW5ndGgKKyAJCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuS2V5TGVuID0gKFVDSEFSKXBLZXktPktleUxlbmd0aDsKKwkJCQkJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5LZXksICZwS2V5LT5LZXlNYXRlcmlhbCwgcEtleS0+S2V5TGVuZ3RoKTsKKworCQkJCQkvLyBzZXQgQ2lwaGVyIHR5cGUKKwkJCQkJaWYgKHBLZXktPktleUxlbmd0aCA9PSA1KQorCQkJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCQkJCWVsc2UKKwkJCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKworCQkJCQkvLyBBZGQgUGFpci13aXNlIGtleSB0byBBc2ljCisJCQkJCUFzaWNBZGRQYWlyd2lzZUtleUVudHJ5KAorCQkJCQkJcEFkLAorCQkJCQkJcEVudHJ5LT5BZGRyLAorCQkJCQkJKFVDSEFSKXBFbnRyeS0+QWlkLAorICAgICAgICAgICAgICAgIAkJJnBFbnRyeS0+UGFpcndpc2VLZXkpOworCisJCQkJCS8vIHVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgZm9yIHRoaXMgZW50cnkKKwkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeSgKKwkJCQkJCXBBZCwKKwkJCQkJCUJTUzAsCisJCQkJCQlLZXlJZHgsIC8vIFRoZSB2YWx1ZSBtYXkgYmUgbm90IHplcm8KKwkJCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnLAorCQkJCQkJcEVudHJ5KTsKKworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKyAgICAgICAgICAgIHsKKwkJCQkvLyBEZWZhdWx0IGtleSBmb3IgdHggKHNoYXJlZCBrZXkpCisJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKFVDSEFSKSBLZXlJZHg7CisKKwkJCQkvLyBzZXQga2V5IG1hdGVyaWFsIGFuZCBrZXkgbGVuZ3RoCisJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPSAoVUNIQVIpIHBLZXktPktleUxlbmd0aDsKKwkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleSwgJnBLZXktPktleU1hdGVyaWFsLCBwS2V5LT5LZXlMZW5ndGgpOworCisJCQkJLy8gU2V0IENpcGVyIHR5cGUKKwkJCQlpZiAocEtleS0+S2V5TGVuZ3RoID09IDUpCisJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQkJCWVsc2UKKwkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCisgICAgCQkJQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGc7CisgICAgCQkJS2V5ID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXk7CisKKwkJCQkvLyBTZXQgR3JvdXAga2V5IG1hdGVyaWFsIHRvIEFzaWMKKyAgICAJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgS2V5LCBOVUxMLCBOVUxMKTsKKworCQkJCS8vIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgZm9yIHRoaXMgZ3JvdXAga2V5IHRhYmxlCisJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIEtleUlkeCwgQ2lwaGVyQWxnLCBOVUxMKTsKKworCQkJfQorCQl9CisJfQorZW5kOgorCXJldHVybjsKK30KKworY2hhciAqIHJ0c3RyY2hyKGNvbnN0IGNoYXIgKiBzLCBpbnQgYykKK3sKKyAgICBmb3IoOyAqcyAhPSAoY2hhcikgYzsgKytzKQorICAgICAgICBpZiAoKnMgPT0gJ1wwJykKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiAoY2hhciAqKSBzOworfQorCisvKgorVGhpcyBpcyByZXF1aXJlZCBmb3IgTGluRVgyMDA0L2tlcm5lbDIuNi43IHRvIHByb3ZpZGUgaXdsaXN0IHNjYW5uaW5nIGZ1bmN0aW9uCisqLworCitpbnQKK3J0X2lvY3RsX2dpd25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgY2hhciAqbmFtZSwgY2hhciAqZXh0cmEpCit7CisvLwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCisjaWZkZWYgUlQyODYwCisgICAgc3RybmNweShuYW1lLCAiUlQyODYwIFdpcmVsZXNzIiwgSUZOQU1TSVopOworI2VuZGlmIC8vIFJUMjg2MCAvLworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3ZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19mcmVxICpmcmVxLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCWludCAJY2hhbiA9IC0xOworCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgIHJldHVybiAtRU5FVERPV047CisgICAgfQorCisKKwlpZiAoZnJlcS0+ZSA+IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYoKGZyZXEtPmUgPT0gMCkgJiYgKGZyZXEtPm0gPD0gMTAwMCkpCisJCWNoYW4gPSBmcmVxLT5tOwkvLyBTZXR0aW5nIGJ5IGNoYW5uZWwgbnVtYmVyCisJZWxzZQorCQlNQVBfS0haX1RPX0NIQU5ORUxfSUQoIChmcmVxLT5tIC8xMDApICwgY2hhbik7IC8vIFNldHRpbmcgYnkgZnJlcXVlbmN5IC0gc2VhcmNoIHRoZSB0YWJsZSAsIGxpa2UgMi40MTJHLCAyLjQyMkcsCisKKyAgICBpZiAoQ2hhbm5lbFNhbml0eShwQWRhcHRlciwgY2hhbikgPT0gVFJVRSkKKyAgICB7CisJcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsID0gY2hhbjsKKwlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCI9PT5ydF9pb2N0bF9zaXdmcmVxOjpTSU9DU0lXRlJFUVtjbWQ9MHgleF0gKENoYW5uZWw9JWQpXG4iLCBTSU9DU0lXRlJFUSwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KK2ludCBydF9pb2N0bF9naXdmcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIHN0cnVjdCBpd19mcmVxICpmcmVxLCBjaGFyICpleHRyYSkKK3sKKyAgICBWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBOVUxMOworCVVDSEFSIGNoOworCVVMT05HCW07CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPm1sX3ByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPm1sX3ByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwkJY2ggPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIj09PnJ0X2lvY3RsX2dpd2ZyZXEgICVkXG4iLCBjaCkpOworCisgICAgTUFQX0NIQU5ORUxfSURfVE9fS0haKGNoLCBtKTsKKwlmcmVxLT5tID0gbSAqIDEwMDsKKwlmcmVxLT5lID0gMTsKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX3Npd21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgX191MzIgKm1vZGUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICB9CisKKwlzd2l0Y2ggKCptb2RlKQorCXsKKwkJY2FzZSBJV19NT0RFX0FESE9DOgorCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJBZGhvYyIpOworCQkJYnJlYWs7CisJCWNhc2UgSVdfTU9ERV9JTkZSQToKKwkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiSW5mcmEiKTsKKwkJCWJyZWFrOworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDQsMjApKQorICAgICAgICBjYXNlIElXX01PREVfTU9OSVRPUjoKKwkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiTW9uaXRvciIpOworCQkJYnJlYWs7CisjZW5kaWYKKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5ydF9pb2N0bF9zaXdtb2RlOjpTSU9DU0lXTU9ERSAodW5rbm93biAlZClcbiIsICptb2RlKSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvLyBSZXNldCBSYWxpbmsgc3VwcGxpY2FudCB0byBub3QgdXNlLCBpdCB3aWxsIGJlIHNldCB0byBzdGFydCB3aGVuIFVJIHNldCBQTUsga2V5CisJcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX05PVFVTRTsKKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3bW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBfX3UzMiAqbW9kZSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPm1sX3ByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPm1sX3ByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlpZiAoQURIT0NfT04ocEFkYXB0ZXIpKQorCQkqbW9kZSA9IElXX01PREVfQURIT0M7CisgICAgZWxzZSBpZiAoSU5GUkFfT04ocEFkYXB0ZXIpKQorCQkqbW9kZSA9IElXX01PREVfSU5GUkE7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNCwyMCkpCisgICAgZWxzZSBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCisgICAgeworICAgICAgICAqbW9kZSA9IElXX01PREVfTU9OSVRPUjsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlCisgICAgICAgICptb2RlID0gSVdfTU9ERV9BVVRPOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+cnRfaW9jdGxfZ2l3bW9kZShtb2RlPSVkKVxuIiwgKm1vZGUpKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX3Npd3NlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgY2hhciAqbmFtZSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICAJeworICAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICAJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdzZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIGNoYXIgKm5hbWUsIGNoYXIgKmV4dHJhKQoreworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3cmFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKwlzdHJ1Y3QgaXdfcmFuZ2UgKnJhbmdlID0gKHN0cnVjdCBpd19yYW5nZSAqKSBleHRyYTsKKwl1MTYgdmFsOworCWludCBpOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5tbF9wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5tbF9wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPm1sX3ByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT09PnJ0X2lvY3RsX2dpd3JhbmdlXG4iKSk7CisJZGF0YS0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSk7CisJbWVtc2V0KHJhbmdlLCAwLCBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKSk7CisKKwlyYW5nZS0+dHhwb3dlcl9jYXBhID0gSVdfVFhQT1dfREJNOworCisJaWYgKElORlJBX09OKHBBZGFwdGVyKXx8QURIT0NfT04ocEFkYXB0ZXIpKQorCXsKKwkJcmFuZ2UtPm1pbl9wbXAgPSAxICogMTAyNDsKKwkJcmFuZ2UtPm1heF9wbXAgPSA2NTUzNSAqIDEwMjQ7CisJCXJhbmdlLT5taW5fcG10ID0gMSAqIDEwMjQ7CisJCXJhbmdlLT5tYXhfcG10ID0gMTAwMCAqIDEwMjQ7CisJCXJhbmdlLT5wbXBfZmxhZ3MgPSBJV19QT1dFUl9QRVJJT0Q7CisJCXJhbmdlLT5wbXRfZmxhZ3MgPSBJV19QT1dFUl9USU1FT1VUOworCQlyYW5nZS0+cG1fY2FwYSA9IElXX1BPV0VSX1BFUklPRCB8IElXX1BPV0VSX1RJTUVPVVQgfAorCQkJSVdfUE9XRVJfVU5JQ0FTVF9SIHwgSVdfUE9XRVJfQUxMX1I7CisJfQorCisJcmFuZ2UtPndlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7CisJcmFuZ2UtPndlX3ZlcnNpb25fc291cmNlID0gMTQ7CisKKwlyYW5nZS0+cmV0cnlfY2FwYSA9IElXX1JFVFJZX0xJTUlUOworCXJhbmdlLT5yZXRyeV9mbGFncyA9IElXX1JFVFJZX0xJTUlUOworCXJhbmdlLT5taW5fcmV0cnkgPSAwOworCXJhbmdlLT5tYXhfcmV0cnkgPSAyNTU7CisKKwlyYW5nZS0+bnVtX2NoYW5uZWxzID0gIHBBZGFwdGVyLT5DaGFubmVsTGlzdE51bTsKKworCXZhbCA9IDA7CisJZm9yIChpID0gMTsgaSA8PSByYW5nZS0+bnVtX2NoYW5uZWxzOyBpKyspCisJeworCQl1MzIgbTsKKwkJcmFuZ2UtPmZyZXFbdmFsXS5pID0gcEFkYXB0ZXItPkNoYW5uZWxMaXN0W2ktMV0uQ2hhbm5lbDsKKwkJTUFQX0NIQU5ORUxfSURfVE9fS0haKHBBZGFwdGVyLT5DaGFubmVsTGlzdFtpLTFdLkNoYW5uZWwsIG0pOworCQlyYW5nZS0+ZnJlcVt2YWxdLm0gPSBtICogMTAwOyAvKiBIWiAqLworCisJCXJhbmdlLT5mcmVxW3ZhbF0uZSA9IDE7CisJCXZhbCsrOworCQlpZiAodmFsID09IElXX01BWF9GUkVRVUVOQ0lFUykKKwkJCWJyZWFrOworCX0KKwlyYW5nZS0+bnVtX2ZyZXF1ZW5jeSA9IHZhbDsKKworCXJhbmdlLT5tYXhfcXVhbC5xdWFsID0gMTAwOyAvKiB3aGF0IGlzIGNvcnJlY3QgbWF4PyBUaGlzIHdhcyBub3QKKwkJCQkJKiBkb2N1bWVudGVkIGV4YWN0bHkuIEF0IGxlYXN0CisJCQkJCSogNjkgaGFzIGJlZW4gb2JzZXJ2ZWQuICovCisJcmFuZ2UtPm1heF9xdWFsLmxldmVsID0gMDsgLyogZEIgKi8KKwlyYW5nZS0+bWF4X3F1YWwubm9pc2UgPSAwOyAvKiBkQiAqLworCisJLyogV2hhdCB3b3VsZCBiZSBzdWl0YWJsZSB2YWx1ZXMgZm9yICJhdmVyYWdlL3R5cGljYWwiIHF1YWw/ICovCisJcmFuZ2UtPmF2Z19xdWFsLnF1YWwgPSAyMDsKKwlyYW5nZS0+YXZnX3F1YWwubGV2ZWwgPSAtNjA7CisJcmFuZ2UtPmF2Z19xdWFsLm5vaXNlID0gLTk1OworCXJhbmdlLT5zZW5zaXRpdml0eSA9IDM7CisKKwlyYW5nZS0+bWF4X2VuY29kaW5nX3Rva2VucyA9IE5SX1dFUF9LRVlTOworCXJhbmdlLT5udW1fZW5jb2Rpbmdfc2l6ZXMgPSAyOworCXJhbmdlLT5lbmNvZGluZ19zaXplWzBdID0gNTsKKwlyYW5nZS0+ZW5jb2Rpbmdfc2l6ZVsxXSA9IDEzOworCisJcmFuZ2UtPm1pbl9ydHMgPSAwOworCXJhbmdlLT5tYXhfcnRzID0gMjM0NzsKKwlyYW5nZS0+bWluX2ZyYWcgPSAyNTY7CisJcmFuZ2UtPm1heF9mcmFnID0gMjM0NjsKKworI2lmIFdJUkVMRVNTX0VYVCA+IDE3CisJLyogSVdfRU5DX0NBUEFfKiBiaXQgZmllbGQgKi8KKwlyYW5nZS0+ZW5jX2NhcGEgPSBJV19FTkNfQ0FQQV9XUEEgfCBJV19FTkNfQ0FQQV9XUEEyIHwKKwkJCQkJSVdfRU5DX0NBUEFfQ0lQSEVSX1RLSVAgfCBJV19FTkNfQ0FQQV9DSVBIRVJfQ0NNUDsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9zaXdhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKmFwX2FkZHIsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisgICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgQnNzaWQ7CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICB9CisKKwlpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKKyAgICB7CisgICAgICAgIFJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRSBidXN5LCByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7CisgICAgfQorCisgICAgLy8gdGVsbCBDTlRMIHN0YXRlIG1hY2hpbmUgdG8gY2FsbCBOZGlzTVNldEluZm9ybWF0aW9uQ29tcGxldGUoKSBhZnRlciBjb21wbGV0aW5nCisgICAgLy8gdGhpcyByZXF1ZXN0LCBiZWNhdXNlIHRoaXMgcmVxdWVzdCBpcyBpbml0aWF0ZWQgYnkgTkRJUy4KKyAgICBwQWRhcHRlci0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IEZBTFNFOworCS8vIFByZXZlbnQgdG8gY29ubmVjdCBBUCBhZ2FpbiBpbiBTVEFNbG1lUGVyaW9kaWNFeGVjCisJcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW49IDMyOworCisgICAgbWVtc2V0KEJzc2lkLCAwLCBNQUNfQUREUl9MRU4pOworICAgIG1lbWNweShCc3NpZCwgYXBfYWRkci0+c2FfZGF0YSwgTUFDX0FERFJfTEVOKTsKKyAgICBNbG1lRW5xdWV1ZShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKyAgICAgICAgICAgICAgICBPSURfODAyXzExX0JTU0lELAorICAgICAgICAgICAgICAgIHNpemVvZihORElTXzgwMl8xMV9NQUNfQUREUkVTUyksCisgICAgICAgICAgICAgICAgKFZPSUQgKikmQnNzaWQpOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU9DVEw6OlNJT0NTSVdBUCAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKyAgICAgICAgQnNzaWRbMF0sIEJzc2lkWzFdLCBCc3NpZFsyXSwgQnNzaWRbM10sIEJzc2lkWzRdLCBCc3NpZFs1XSkpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKmFwX2FkZHIsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5tbF9wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5tbF9wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPm1sX3ByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJaWYgKElORlJBX09OKHBBZGFwdGVyKSB8fCBBREhPQ19PTihwQWRhcHRlcikpCisJeworCQlhcF9hZGRyLT5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJCW1lbWNweShhcF9hZGRyLT5zYV9kYXRhLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5Cc3NpZCwgRVRIX0FMRU4pOworCX0KKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgLy8gQWRkIGZvciBSVDI4NzAKKyAgICBlbHNlIGlmIChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQorICAgIHsKKyAgICAgICAgYXBfYWRkci0+c2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworICAgICAgICBtZW1jcHkoYXBfYWRkci0+c2FfZGF0YSwgJnBBZGFwdGVyLT5NbG1lQXV4LkJzc2lkLCBFVEhfQUxFTik7CisgICAgfQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJT0NUTDo6U0lPQ0dJV0FQKD1FTVBUWSlcbiIpKTsKKwkJcmV0dXJuIC1FTk9UQ09OTjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFVuaXRzIGFyZSBpbiBkYiBhYm92ZSB0aGUgbm9pc2UgZmxvb3IuIFRoYXQgbWVhbnMgdGhlCisgKiByc3NpIHZhbHVlcyByZXBvcnRlZCBpbiB0aGUgdHgvcnggZGVzY3JpcHRvcnMgaW4gdGhlCisgKiBkcml2ZXIgYXJlIHRoZSBTTlIgZXhwcmVzc2VkIGluIGRiLgorICoKKyAqIElmIHlvdSBhc3N1bWUgdGhhdCB0aGUgbm9pc2UgZmxvb3IgaXMgLTk1LCB3aGljaCBpcyBhbgorICogZXhjZWxsZW50IGFzc3VtcHRpb24gOTkuNSAlIG9mIHRoZSB0aW1lLCB0aGVuIHlvdSBjYW4KKyAqIGRlcml2ZSB0aGUgYWJzb2x1dGUgc2lnbmFsIGxldmVsIChpLmUuIC05NSArIHJzc2kpLgorICogVGhlcmUgYXJlIHNvbWUgb3RoZXIgc2xpZ2h0IGZhY3RvcnMgdG8gdGFrZSBpbnRvIGFjY291bnQKKyAqIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSByc3NpIG1lYXN1cmVtZW50IGlzIGZyb20gMTFiLAorICogMTFnLCBvciAxMWEuICAgVGhlc2UgZGlmZmVyZW5jZXMgYXJlIGF0IG1vc3QgMmRiIGFuZAorICogY2FuIGJlIGRvY3VtZW50ZWQuCisgKgorICogTkI6IHZhcmlvdXMgY2FsY3VsYXRpb25zIGFyZSBiYXNlZCBvbiB0aGUgb3Jpbm9jby93YXZlbGFuCisgKiAgICAgZHJpdmVycyBmb3IgY29tcGF0aWJpbGl0eQorICovCitzdGF0aWMgdm9pZCBzZXRfcXVhbGl0eShQUlRNUF9BREFQVEVSIHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3F1YWxpdHkgKmlxLAorICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkIGNoYXIgcnNzaSkKK3sKKwlfX3U4IENoYW5uZWxRdWFsaXR5OworCisJLy8gTm9ybWFsaXplIFJzc2kKKwlpZiAocnNzaSA+PSAtNTApCisJCUNoYW5uZWxRdWFsaXR5ID0gMTAwOworCWVsc2UgaWYgKHJzc2kgPj0gLTgwKSAvLyBiZXR3ZWVuIC01MCB+IC04MGRibQorCQlDaGFubmVsUXVhbGl0eSA9IChfX3U4KSgyNCArICgocnNzaSArIDgwKSAqIDI2KS8xMCk7CisJZWxzZSBpZiAocnNzaSA+PSAtOTApICAgLy8gYmV0d2VlbiAtODAgfiAtOTBkYm0KKyAgICAgICAgQ2hhbm5lbFF1YWxpdHkgPSAoX191OCkoKHJzc2kgKyA5MCkgKiAyNikvMTA7CisJZWxzZQorCQlDaGFubmVsUXVhbGl0eSA9IDA7CisKKyAgICBpcS0+cXVhbCA9IChfX3U4KUNoYW5uZWxRdWFsaXR5OworCisgICAgaXEtPmxldmVsID0gKF9fdTgpKHJzc2kpOworICAgIGlxLT5ub2lzZSA9IChwQWRhcHRlci0+QmJwV3JpdGVMYXRjaFs2Nl0gPiBwQWRhcHRlci0+QmJwVHVuaW5nLkZhbHNlQ2NhVXBwZXJUaHJlc2hvbGQpID8gKChfX3U4KXBBZGFwdGVyLT5CYnBUdW5pbmcuRmFsc2VDY2FVcHBlclRocmVzaG9sZCkgOiAoKF9fdTgpIHBBZGFwdGVyLT5CYnBXcml0ZUxhdGNoWzY2XSk7IAkvLyBub2lzZSBsZXZlbCAoZEJtKQorICAgIGlxLT5ub2lzZSArPSAyNTYgLSAxNDM7CisgICAgaXEtPnVwZGF0ZWQgPSBwQWRhcHRlci0+aXdfc3RhdHMucXVhbC51cGRhdGVkOworfQorCitpbnQgcnRfaW9jdGxfaXdhcGxpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQoreworIAlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCisJc3RydWN0IHNvY2thZGRyIGFkZHJbSVdfTUFYX0FQXTsKKwlzdHJ1Y3QgaXdfcXVhbGl0eSBxdWFsW0lXX01BWF9BUF07CisJaW50IGk7CisKKyAgIAkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJZGF0YS0+bGVuZ3RoID0gMDsKKwkJcmV0dXJuIDA7CisgICAgICAgIC8vcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDxJV19NQVhfQVAgOyBpKyspCisJeworCQlpZiAoaSA+PSAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnIpCisJCQlicmVhazsKKwkJYWRkcltpXS5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJCQltZW1jcHkoYWRkcltpXS5zYV9kYXRhLCAmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWQsIE1BQ19BRERSX0xFTik7CisJCXNldF9xdWFsaXR5KHBBZGFwdGVyLCAmcXVhbFtpXSwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNzaSk7CisJfQorCWRhdGEtPmxlbmd0aCA9IGk7CisJbWVtY3B5KGV4dHJhLCAmYWRkciwgaSpzaXplb2YoYWRkclswXSkpOworCWRhdGEtPmZsYWdzID0gMTsJCS8qIHNpZ25hbCBxdWFsaXR5IHByZXNlbnQgKHNvcnQgb2YpICovCisJbWVtY3B5KGV4dHJhICsgaSpzaXplb2YoYWRkclswXSksICZxdWFsLCBpKnNpemVvZihxdWFsW2ldKSk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIFNJT0NHSVdTQ0FOCitpbnQgcnRfaW9jdGxfc2l3c2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKworCVVMT05HCQkJCQkJCQlOb3c7CisJaW50IFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgRHJpdmVyIGlzIGluIE1vbml0b3IgTW9kZSBub3cgISEhXG4iKSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCWlmIChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpCisJeworCQlwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRTY2FuQ291bnQrKzsKKwl9CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisgICAgcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gVFJVRTsKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorCQlyZXR1cm4gMDsKKwlkb3sKKwkJTm93ID0gamlmZmllczsKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkJaWYgKChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpICYmCisJCQkocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50U2NhbkNvdW50ID4gMykpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBXcGFTdXBwbGljYW50U2NhbkNvdW50ID4gM1xuIikpOworCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisJCWlmICgoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpICYmCisJCQkoKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAorCQkJKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkgJiYKKwkJCShwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMaW5rIFVQLCBQb3J0IE5vdCBTZWN1cmVkISBpZ25vcmUgdGhpcyBzZXQ6Ok9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOXG4iKSk7CisJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKKwkJeworCQkJUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRSBidXN5LCByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7CisJCX0KKworCQkvLyB0ZWxsIENOVEwgc3RhdGUgbWFjaGluZSB0byBjYWxsIE5kaXNNU2V0SW5mb3JtYXRpb25Db21wbGV0ZSgpIGFmdGVyIGNvbXBsZXRpbmcKKwkJLy8gdGhpcyByZXF1ZXN0LCBiZWNhdXNlIHRoaXMgcmVxdWVzdCBpcyBpbml0aWF0ZWQgYnkgTkRJUy4KKwkJcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBGQUxTRTsKKwkJLy8gUmVzZXQgYWxsb3dlZCBzY2FuIHJldHJpZXMKKwkJcEFkYXB0ZXItPlN0YUNmZy5TY2FuQ250ID0gMDsKKwkJcEFkYXB0ZXItPlN0YUNmZy5MYXN0U2NhblRpbWUgPSBOb3c7CisKKwkJTWxtZUVucXVldWUocEFkYXB0ZXIsCisJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCU9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOLAorCQkJMCwKKwkJCU5VTEwpOworCisJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkYXB0ZXIpOworCX13aGlsZSgwKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQoreworCisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwlpbnQgaT0wOworCWNoYXIgKmN1cnJlbnRfZXYgPSBleHRyYSwgKnByZXZpb3VzX2V2ID0gZXh0cmE7CisJY2hhciAqZW5kX2J1ZjsKKwljaGFyICpjdXJyZW50X3ZhbCwgY3VzdG9tW01BWF9DVVNUT01fTEVOXSA9IHswfTsKKyNpZm5kZWYgSVdFVkdFTklFCisJY2hhciBpZHg7CisjZW5kaWYgLy8gSVdFVkdFTklFIC8vCisJc3RydWN0IGl3X2V2ZW50IGl3ZTsKKworCWlmIChSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisgICAgeworCQkvKgorCQkgKiBTdGlsbCBzY2FubmluZywgaW5kaWNhdGUgdGhlIGNhbGxlciBzaG91bGQgdHJ5IGFnYWluLgorCQkgKi8KKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJaWYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0VOQUJMRSkKKwl7CisJCXBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFNjYW5Db3VudCA9IDA7CisJfQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NOciA9PSAwKQorCXsKKwkJZGF0YS0+bGVuZ3RoID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgaWYgKGRhdGEtPmxlbmd0aCA+IDApCisgICAgICAgIGVuZF9idWYgPSBleHRyYSArIGRhdGEtPmxlbmd0aDsKKyAgICBlbHNlCisgICAgICAgIGVuZF9idWYgPSBleHRyYSArIElXX1NDQU5fTUFYX0RBVEE7CisjZWxzZQorICAgIGVuZF9idWYgPSBleHRyYSArIElXX1NDQU5fTUFYX0RBVEE7CisjZW5kaWYKKworCWZvciAoaSA9IDA7IGkgPCBwQWRhcHRlci0+U2NhblRhYi5Cc3NOcjsgaSsrKQorCXsKKwkJaWYgKGN1cnJlbnRfZXYgPj0gZW5kX2J1ZikKKyAgICAgICAgeworI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQlicmVhazsKKyNlbmRpZgorICAgICAgICB9CisKKwkJLy9NQUMgYWRkcmVzcworCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBTSU9DR0lXQVA7CisJCWl3ZS51LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCQltZW1jcHkoaXdlLnUuYXBfYWRkci5zYV9kYXRhLCAmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWQsIEVUSF9BTEVOKTsKKworICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9FVkVOVChpbmZvLCBjdXJyZW50X2V2LGVuZF9idWYsICZpd2UsIElXX0VWX0FERFJfTEVOKTsKKyAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJLy9FU1NJRAorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBTSU9DR0lXRVNTSUQ7CisJCWl3ZS51LmRhdGEubGVuZ3RoID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZExlbjsKKwkJaXdlLnUuZGF0YS5mbGFncyA9IDE7CisKKyAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgY3VycmVudF9ldixlbmRfYnVmLCAmaXdlLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkKTsKKyAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJLy9OZXR3b3JrIFR5cGUKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQlpd2UuY21kID0gU0lPQ0dJV01PREU7CisJCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NUeXBlID09IE5kaXM4MDJfMTFJQlNTKQorCQl7CisJCQlpd2UudS5tb2RlID0gSVdfTU9ERV9BREhPQzsKKwkJfQorCQllbHNlIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NUeXBlID09IE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZSkKKwkJeworCQkJaXdlLnUubW9kZSA9IElXX01PREVfSU5GUkE7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpd2UudS5tb2RlID0gSVdfTU9ERV9BVVRPOworCQl9CisJCWl3ZS5sZW4gPSBJV19FVl9VSU5UX0xFTjsKKworICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9FVkVOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCAgSVdfRVZfVUlOVF9MRU4pOworICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJYnJlYWs7CisjZW5kaWYKKworCQkvL0NoYW5uZWwgYW5kIEZyZXF1ZW5jeQorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBTSU9DR0lXRlJFUTsKKwkJaWYgKElORlJBX09OKHBBZGFwdGVyKSB8fCBBREhPQ19PTihwQWRhcHRlcikpCisJCQlpd2UudS5mcmVxLm0gPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5DaGFubmVsOworCQllbHNlCisJCQlpd2UudS5mcmVxLm0gPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5DaGFubmVsOworCQlpd2UudS5mcmVxLmUgPSAwOworCQlpd2UudS5mcmVxLmkgPSAwOworCisJCXByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKwkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX0VWRU5UKGluZm8sIGN1cnJlbnRfZXYsZW5kX2J1ZiwgJml3ZSwgSVdfRVZfRlJFUV9MRU4pOworICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJYnJlYWs7CisjZW5kaWYKKworICAgICAgICAvL0FkZCBxdWFsaXR5IHN0YXRpc3RpY3MKKyAgICAgICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICBtZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworICAgIAlpd2UuY21kID0gSVdFVlFVQUw7CisgICAgCWl3ZS51LnF1YWwubGV2ZWwgPSAwOworICAgIAlpd2UudS5xdWFsLm5vaXNlID0gMDsKKyAgICAgICAgc2V0X3F1YWxpdHkocEFkYXB0ZXIsICZpd2UudS5xdWFsLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc3NpKTsKKyAgICAJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX0VWRU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIElXX0VWX1FVQUxfTEVOKTsKKyAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJLy9FbmN5cHRpb24ga2V5CisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJaXdlLmNtZCA9IFNJT0NHSVdFTkNPREU7CisJCWlmIChDQVBfSVNfUFJJVkFDWV9PTiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQ2FwYWJpbGl0eUluZm8gKSkKKwkJCWl3ZS51LmRhdGEuZmxhZ3MgPUlXX0VOQ09ERV9FTkFCTEVEIHwgSVdfRU5DT0RFX05PS0VZOworCQllbHNlCisJCQlpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCisgICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKyAgICAgICAgY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsJml3ZSwgKGNoYXIgKilwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWyhpd2UudS5kYXRhLmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKS0xXS5LZXkpOworICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJYnJlYWs7CisjZW5kaWYKKworCQkvL0JpdCBSYXRlCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGVMZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIFVDSEFSIHRtcFJhdGUgPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlW3BBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGVMZW4tMV07CisJCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQkJaXdlLmNtZCA9IFNJT0NHSVdSQVRFOworICAgIAkJY3VycmVudF92YWwgPSBjdXJyZW50X2V2ICsgSVdfRVZfTENQX0xFTjsKKyAgICAgICAgICAgIGlmICh0bXBSYXRlID09IDB4ODIpCisgICAgICAgICAgICAgICAgaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICAxICogMTAwMDAwMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHRtcFJhdGUgPT0gMHg4NCkKKyAgICAgICAgICAgICAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gIDIgKiAxMDAwMDAwOworICAgICAgICAgICAgZWxzZSBpZiAodG1wUmF0ZSA9PSAweDhCKQorICAgICAgICAgICAgICAgIGl3ZS51LmJpdHJhdGUudmFsdWUgPSAgNS41ICogMTAwMDAwMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHRtcFJhdGUgPT0gMHg5NikKKyAgICAgICAgICAgICAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gIDExICogMTAwMDAwMDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAJCSAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gICh0bXBSYXRlLzIpICogMTAwMDAwMDsKKworCQkJaXdlLnUuYml0cmF0ZS5kaXNhYmxlZCA9IDA7CisJCQljdXJyZW50X3ZhbCA9IElXRV9TVFJFQU1fQUREX1ZBTFVFKGluZm8sIGN1cnJlbnRfZXYsCisJCQkJY3VycmVudF92YWwsIGVuZF9idWYsICZpd2UsCisgICAgCQkJSVdfRVZfUEFSQU1fTEVOKTsKKworICAgICAgICAJaWYoKGN1cnJlbnRfdmFsLWN1cnJlbnRfZXYpPklXX0VWX0xDUF9MRU4pCisgICAgICAgICAgICAJY3VycmVudF9ldiA9IGN1cnJlbnRfdmFsOworICAgICAgICAJZWxzZQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIH0KKworI2lmZGVmIElXRVZHRU5JRQorCQkvL1dQQSBJRQorCQlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW4gPiAwKQorCQl7CisJCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQkJbWVtc2V0KCZjdXN0b21bMF0sIDAsIE1BWF9DVVNUT01fTEVOKTsKKwkJCW1lbWNweShjdXN0b20sICYocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVbMF0pLAorCQkJCQkJICAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW4pOworCQkJaXdlLmNtZCA9IElXRVZHRU5JRTsKKwkJCWl3ZS51LmRhdGEubGVuZ3RoID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW47CisJCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgY3VzdG9tKTsKKwkJCWlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJICAgIGJyZWFrOworI2VuZGlmCisJCX0KKworCQkvL1dQQTIgSUUKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuID4gMCkKKyAgICAgICAgeworICAgICAgICAJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJCW1lbXNldCgmY3VzdG9tWzBdLCAwLCBNQVhfQ1VTVE9NX0xFTik7CisJCQltZW1jcHkoY3VzdG9tLCAmKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFWzBdKSwKKwkJCQkJCSAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuKTsKKwkJCWl3ZS5jbWQgPSBJV0VWR0VOSUU7CisJCQlpd2UudS5kYXRhLmxlbmd0aCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuOworCQkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIGN1c3RvbSk7CisJCQlpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCSAgICBicmVhazsKKyNlbmRpZgorICAgICAgICB9CisjZWxzZQorICAgICAgICAvL1dQQSBJRQorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbiA+IDApCisgICAgICAgIHsKKyAgICAJCU5kaXNaZXJvTWVtb3J5KCZpd2UsIHNpemVvZihpd2UpKTsKKwkJCW1lbXNldCgmY3VzdG9tWzBdLCAwLCBNQVhfQ1VTVE9NX0xFTik7CisgICAgCQlpd2UuY21kID0gSVdFVkNVU1RPTTsKKyAgICAgICAgICAgIGl3ZS51LmRhdGEubGVuZ3RoID0gKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuICogMikgKyA3OworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoY3VzdG9tLCAid3BhX2llPSIsIDcpOworICAgICAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbjsgaWR4KyspCisgICAgICAgICAgICAgICAgc3ByaW50ZihjdXN0b20sICIlcyUwMngiLCBjdXN0b20sIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFW2lkeF0pOworICAgICAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworICAgIAkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsICBjdXN0b20pOworICAgICAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQkgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIC8vV1BBMiBJRQorICAgICAgICBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW4gPiAwKQorICAgICAgICB7CisgICAgCQlOZGlzWmVyb01lbW9yeSgmaXdlLCBzaXplb2YoaXdlKSk7CisJCQltZW1zZXQoJmN1c3RvbVswXSwgMCwgTUFYX0NVU1RPTV9MRU4pOworICAgIAkJaXdlLmNtZCA9IElXRVZDVVNUT007CisgICAgICAgICAgICBpd2UudS5kYXRhLmxlbmd0aCA9IChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbiAqIDIpICsgNzsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KGN1c3RvbSwgInJzbl9pZT0iLCA3KTsKKwkJCWZvciAoaWR4ID0gMDsgaWR4IDwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW47IGlkeCsrKQorICAgICAgICAgICAgICAgIHNwcmludGYoY3VzdG9tLCAiJXMlMDJ4IiwgY3VzdG9tLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRVtpZHhdKTsKKyAgICAgICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKyAgICAJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCAgY3VzdG9tKTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIH0KKyNlbmRpZiAvLyBJV0VWR0VOSUUgLy8KKwl9CisKKwlkYXRhLT5sZW5ndGggPSBjdXJyZW50X2V2IC0gZXh0cmE7CisgICAgcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7CisJREJHUFJJTlQoUlRfREVCVUdfRVJST1IgLCgiPT09PnJ0X2lvY3RsX2dpd3NjYW4uICVkKCVkKSBCU1MgcmV0dXJuZWQsIGRhdGEtPmxlbmd0aCA9ICVkXG4iLGkgLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NOciwgZGF0YS0+bGVuZ3RoKSk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworaW50IHJ0X2lvY3RsX3Npd2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmVzc2lkKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICB9CisKKwlpZiAoZGF0YS0+ZmxhZ3MpCisJeworCQlQQ0hBUglwU3NpZFN0cmluZyA9IE5VTEw7CisKKwkJLy8gSW5jbHVkZXMgbnVsbCBjaGFyYWN0ZXIuCisJCWlmIChkYXRhLT5sZW5ndGggPiAoSVdfRVNTSURfTUFYX1NJWkUgKyAxKSkKKwkJCXJldHVybiAtRTJCSUc7CisKKwkJcFNzaWRTdHJpbmcgPSAoQ0hBUiAqKSBrbWFsbG9jKE1BWF9MRU5fT0ZfU1NJRCsxLCBNRU1fQUxMT0NfRkxBRyk7CisJCWlmIChwU3NpZFN0cmluZykKKwkJeworCQkJTmRpc1plcm9NZW1vcnkocFNzaWRTdHJpbmcsIE1BWF9MRU5fT0ZfU1NJRCsxKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBTc2lkU3RyaW5nLCBlc3NpZCwgZGF0YS0+bGVuZ3RoKTsKKwkJCWlmIChTZXRfU1NJRF9Qcm9jKHBBZGFwdGVyLCBwU3NpZFN0cmluZykgPT0gRkFMU0UpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJZWxzZQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCWVsc2UKKwl7CisJCS8vIEFOWSBzc2lkCisJCWlmIChTZXRfU1NJRF9Qcm9jKHBBZGFwdGVyLCAiIikgPT0gRkFMU0UpCisJCQlyZXR1cm4gLUVJTlZBTDsKKyAgICB9CisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdlc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICplc3NpZCkKK3sKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+bWxfcHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+bWxfcHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5tbF9wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWRhdGEtPmZsYWdzID0gMTsKKyAgICBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCisgICAgeworICAgICAgICBkYXRhLT5sZW5ndGggID0gMDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiTWVkaWFTdGF0ZSBpcyBjb25uZWN0ZWRcbiIpKTsKKwkJZGF0YS0+bGVuZ3RoID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkTGVuOworCQltZW1jcHkoZXNzaWQsIHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZCwgcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkTGVuKTsKKwl9CisJZWxzZQorCXsvL3RoZSBBTlkgc3NpZCB3YXMgc3BlY2lmaWVkCisJCWRhdGEtPmxlbmd0aCAgPSAwOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJNZWRpYVN0YXRlIGlzIG5vdCBjb25uZWN0ZWQsIGVzc1xuIikpOworCX0KKworCXJldHVybiAwOworCit9CisKK2ludCBydF9pb2N0bF9zaXduaWNrbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpuaWNrbmFtZSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgIHJldHVybiAtRU5FVERPV047CisgICAgfQorCisJaWYgKGRhdGEtPmxlbmd0aCA+IElXX0VTU0lEX01BWF9TSVpFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbXNldChwQWRhcHRlci0+bmlja25hbWUsIDAsIElXX0VTU0lEX01BWF9TSVpFICsgMSk7CisJbWVtY3B5KHBBZGFwdGVyLT5uaWNrbmFtZSwgbmlja25hbWUsIGRhdGEtPmxlbmd0aCk7CisKKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3bmlja24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqbmlja25hbWUpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPm1sX3ByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPm1sX3ByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlpZiAoZGF0YS0+bGVuZ3RoID4gc3RybGVuKHBBZGFwdGVyLT5uaWNrbmFtZSkgKyAxKQorCQlkYXRhLT5sZW5ndGggPSBzdHJsZW4ocEFkYXB0ZXItPm5pY2tuYW1lKSArIDE7CisJaWYgKGRhdGEtPmxlbmd0aCA+IDApIHsKKwkJbWVtY3B5KG5pY2tuYW1lLCBwQWRhcHRlci0+bmlja25hbWUsIGRhdGEtPmxlbmd0aC0xKTsKKwkJbmlja25hbWVbZGF0YS0+bGVuZ3RoLTFdID0gJ1wwJzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9zaXdydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKnJ0cywgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwl1MTYgdmFsOworCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgIHJldHVybiAtRU5FVERPV047CisgICAgfQorCisJaWYgKHJ0cy0+ZGlzYWJsZWQpCisJCXZhbCA9IE1BWF9SVFNfVEhSRVNIT0xEOworCWVsc2UgaWYgKHJ0cy0+dmFsdWUgPCAwIHx8IHJ0cy0+dmFsdWUgPiBNQVhfUlRTX1RIUkVTSE9MRCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZWxzZSBpZiAocnRzLT52YWx1ZSA9PSAwKQorCSAgICB2YWwgPSBNQVhfUlRTX1RIUkVTSE9MRDsKKwllbHNlCisJCXZhbCA9IHJ0cy0+dmFsdWU7CisKKwlpZiAodmFsICE9IHBBZGFwdGVyLT5Db21tb25DZmcuUnRzVGhyZXNob2xkKQorCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA9IHZhbDsKKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3cnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICAgc3RydWN0IGl3X3BhcmFtICpydHMsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5tbF9wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5tbF9wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPm1sX3ByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICAJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIAl7CisgICAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAgCXJldHVybiAtRU5FVERPV047CisgICAgCX0KKworCXJ0cy0+dmFsdWUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZDsKKwlydHMtPmRpc2FibGVkID0gKHJ0cy0+dmFsdWUgPT0gTUFYX1JUU19USFJFU0hPTEQpOworCXJ0cy0+Zml4ZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9zaXdmcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BhcmFtICpmcmFnLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCXUxNiB2YWw7CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIAlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgCXsKKyAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICAJfQorCisJaWYgKGZyYWctPmRpc2FibGVkKQorCQl2YWwgPSBNQVhfRlJBR19USFJFU0hPTEQ7CisJZWxzZSBpZiAoZnJhZy0+dmFsdWUgPj0gTUlOX0ZSQUdfVEhSRVNIT0xEIHx8IGZyYWctPnZhbHVlIDw9IE1BWF9GUkFHX1RIUkVTSE9MRCkKKyAgICAgICAgdmFsID0gX19jcHVfdG9fbGUxNihmcmFnLT52YWx1ZSAmIH4weDEpOyAvKiBldmVuIG51bWJlcnMgb25seSAqLworCWVsc2UgaWYgKGZyYWctPnZhbHVlID09IDApCisJICAgIHZhbCA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJcEFkYXB0ZXItPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IHZhbDsKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd2ZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcGFyYW0gKmZyYWcsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5tbF9wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5tbF9wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPm1sX3ByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICAJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIAl7CisgICAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAgCXJldHVybiAtRU5FVERPV047CisgICAgCX0KKworCWZyYWctPnZhbHVlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZDsKKwlmcmFnLT5kaXNhYmxlZCA9IChmcmFnLT52YWx1ZSA9PSBNQVhfRlJBR19USFJFU0hPTEQpOworCWZyYWctPmZpeGVkID0gMTsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIE1BWF9XRVBfS0VZX1NJWkUgMTMKKyNkZWZpbmUgTUlOX1dFUF9LRVlfU0laRSA1CitpbnQgcnRfaW9jdGxfc2l3ZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpd19wb2ludCAqZXJxLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICAJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIAl7CisgICAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAgCXJldHVybiAtRU5FVERPV047CisgICAgCX0KKworCWlmICgoZXJxLT5sZW5ndGggPT0gMCkgJiYKKyAgICAgICAgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpKQorCXsKKwkJcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCQlwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCQlwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworICAgICAgICBnb3RvIGRvbmU7CisJfQorCWVsc2UgaWYgKChlcnEtPmxlbmd0aCA9PSAwKSAmJgorICAgICAgICAgICAgIChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX1JFU1RSSUNURUQgfHwgZXJxLT5mbGFncyAmIElXX0VOQ09ERV9PUEVOKSkKKwl7CisJCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworCQlwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKwkJcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworCQlwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKwkJaWYgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfUkVTVFJJQ1RFRCkKKwkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQ7CisgICAgCWVsc2UKKwkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworICAgICAgICBnb3RvIGRvbmU7CisJfQorCisgICAgaWYgKGVycS0+bGVuZ3RoID4gMCkKKwl7CisJCWludCBrZXlJZHggPSAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOworCQkvKiBDaGVjayB0aGUgc2l6ZSBvZiB0aGUga2V5ICovCisJCWlmIChlcnEtPmxlbmd0aCA+IE1BWF9XRVBfS0VZX1NJWkUpIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCS8qIENoZWNrIGtleSBpbmRleCAqLworCQlpZiAoKGtleUlkeCA8IDApIHx8IChrZXlJZHggPj0gTlJfV0VQX0tFWVMpKQorICAgICAgICB7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6Oldyb25nIGtleUlkeD0lZCEgVXNpbmcgZGVmYXVsdCBrZXkgaW5zdGVhZCAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleUlkeCwgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQpKTsKKworICAgICAgICAgICAgLy9Vc2luZyBkZWZhdWx0IGtleQorCQkJa2V5SWR4ID0gcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CisgICAgICAgIH0KKworICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCAgMTYpOworCisJCWlmIChlcnEtPmxlbmd0aCA9PSBNQVhfV0VQX0tFWV9TSVpFKQorICAgICAgICB7CisJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gTUFYX1dFUF9LRVlfU0laRTsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCQl9CisJCWVsc2UgaWYgKGVycS0+bGVuZ3RoID09IE1JTl9XRVBfS0VZX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSBNSU5fV0VQX0tFWV9TSVpFOworICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJfQorCQllbHNlCisJCQkvKiBEaXNhYmxlIHRoZSBrZXkgKi8KKwkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSAwOworCisJCS8qIENoZWNrIGlmIHRoZSBrZXkgaXMgbm90IG1hcmtlZCBhcyBpbnZhbGlkICovCisJCWlmKCEoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9OT0tFWSkpIHsKKwkJCS8qIENvcHkgdGhlIGtleSBpbiB0aGUgZHJpdmVyICovCisJCQlOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCBleHRyYSwgZXJxLT5sZW5ndGgpOworICAgICAgICB9CisJfQorICAgIGVsc2UKKwkJCXsKKwkJLyogRG8gd2Ugd2FudCB0byBqdXN0IHNldCB0aGUgdHJhbnNtaXQga2V5IGluZGV4ID8gKi8KKwkJaW50IGluZGV4ID0gKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKwkJaWYgKChpbmRleCA+PSAwKSAmJiAoaW5kZXggPCA0KSkKKyAgICAgICAgeworCQkJcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSBpbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZQorCQkJLyogRG9uJ3QgY29tcGxhaW4gaWYgb25seSBjaGFuZ2UgdGhlIG1vZGUgKi8KKwkJCWlmKCFlcnEtPmZsYWdzICYgSVdfRU5DT0RFX01PREUpIHsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworZG9uZToKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6OmVycS0+ZmxhZ3M9JXhcbiIsZXJxLT5mbGFncykpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6QXV0aE1vZGU9JXhcbiIscEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6RGVmYXVsdEtleUlkPSV4LCBLZXlMZW4gPSAlZFxuIixwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCAsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbikpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6V2VwU3RhdHVzPSV4XG4iLHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzKSk7CisJcmV0dXJuIDA7Cit9CisKK2ludAorcnRfaW9jdGxfZ2l3ZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpd19wb2ludCAqZXJxLCBjaGFyICprZXkpCit7CisJaW50IGtpZDsKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+bWxfcHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+bWxfcHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5tbF9wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisJfQorCisJa2lkID0gZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWDsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+cnRfaW9jdGxfZ2l3ZW5jb2RlICVkXG4iLCBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSk7CisKKwlpZiAocEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQorCXsKKwkJZXJxLT5sZW5ndGggPSAwOworCQllcnEtPmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCX0KKwllbHNlIGlmICgoa2lkID4gMCkgJiYgKGtpZCA8PTQpKQorCXsKKwkJLy8gY29weSB3ZXAga2V5CisJCWVycS0+ZmxhZ3MgPSBraWQgOwkJCS8qIE5COiBiYXNlIDEgKi8KKwkJaWYgKGVycS0+bGVuZ3RoID4gcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtraWQtMV0uS2V5TGVuKQorCQkJZXJxLT5sZW5ndGggPSBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tpZC0xXS5LZXlMZW47CisJCW1lbWNweShrZXksIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2lkLTFdLktleSwgZXJxLT5sZW5ndGgpOworCQkvL2lmICgoa2lkID09IHBBZGFwdGVyLT5Qb3J0Q2ZnLkRlZmF1bHRLZXlJZCkpCisJCS8vZXJxLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsJLyogWFhYICovCisJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkKKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX1JFU1RSSUNURUQ7CQkvKiBYWFggKi8KKwkJZWxzZQorCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfT1BFTjsJCS8qIFhYWCAqLworCisJfQorCWVsc2UgaWYgKGtpZCA9PSAwKQorCXsKKwkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKQorCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfUkVTVFJJQ1RFRDsJCS8qIFhYWCAqLworCQllbHNlCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9PUEVOOwkJLyogWFhYICovCisJCWVycS0+bGVuZ3RoID0gcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuOworCQltZW1jcHkoa2V5LCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksIGVycS0+bGVuZ3RoKTsKKwkJLy8gY29weSBkZWZhdWx0IGtleSBJRAorCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9SRVNUUklDVEVEOwkJLyogWFhYICovCisJCWVsc2UKKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX09QRU47CQkvKiBYWFggKi8KKwkJZXJxLT5mbGFncyA9IHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkICsgMTsJCQkvKiBOQjogYmFzZSAxICovCisJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0VOQUJMRUQ7CS8qIFhYWCAqLworCX0KKworCXJldHVybiAwOworCit9CisKK3N0YXRpYyBpbnQKK3J0X2lvY3RsX3NldHBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgdm9pZCAqdywgY2hhciAqZXh0cmEpCit7CisgICAgVklSVFVBTF9BREFQVEVSCSpwVmlydHVhbEFkID0gTlVMTDsKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyOworCVBPU19DT09LSUUgcE9iajsKKwljaGFyICp0aGlzX2NoYXIgPSBleHRyYTsKKwljaGFyICp2YWx1ZTsKKwlpbnQgIFN0YXR1cz0wOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5tbF9wcml2OworCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPm1sX3ByaXY7CisJfQorCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkYXB0ZXItPk9TX0Nvb2tpZTsKKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPm1sX3ByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJeworCQlwT2JqLT5pb2N0bF9pZl90eXBlID0gSU5UX01BSU47CisgICAgICAgIHBPYmotPmlvY3RsX2lmID0gTUFJTl9NQlNTSUQ7CisJfQorCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICAJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIAl7CisgICAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJCXJldHVybiAtRU5FVERPV047CisgICAgCX0KKworCWlmICghKnRoaXNfY2hhcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKHZhbHVlID0gcnRzdHJjaHIodGhpc19jaGFyLCAnPScpKSAhPSBOVUxMKQorCSAgICAqdmFsdWUrKyA9IDA7CisKKwlpZiAoIXZhbHVlKQorCSAgICByZXR1cm4gLUVJTlZBTDsKKworCS8vIHJlamVjdCBzZXR0aW5nIG5vdGhpbmcgYmVzaWRlcyBBTlkgc3NpZChzc2lkTGVuPTApCisgICAgaWYgKCEqdmFsdWUgJiYgKHN0cmNtcCh0aGlzX2NoYXIsICJTU0lEIikgIT0gMCkpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisJZm9yIChQUlRNUF9QUklWQVRFX1NFVF9QUk9DID0gUlRNUF9QUklWQVRFX1NVUFBPUlRfUFJPQzsgUFJUTVBfUFJJVkFURV9TRVRfUFJPQy0+bmFtZTsgUFJUTVBfUFJJVkFURV9TRVRfUFJPQysrKQorCXsKKwkgICAgaWYgKHN0cmNtcCh0aGlzX2NoYXIsIFBSVE1QX1BSSVZBVEVfU0VUX1BST0MtPm5hbWUpID09IDApCisJICAgIHsKKwkgICAgICAgIGlmKCFQUlRNUF9QUklWQVRFX1NFVF9QUk9DLT5zZXRfcHJvYyhwQWRhcHRlciwgdmFsdWUpKQorCSAgICAgICAgewkvL0ZBTFNFOlNldCBwcml2YXRlIGZhaWxlZCB0aGVuIHJldHVybiBJbnZhbGlkIGFyZ3VtZW50CisJCQkgICAgU3RhdHVzID0gLUVJTlZBTDsKKwkgICAgICAgIH0KKwkJICAgIGJyZWFrOwkvL0V4aXQgZm9yIGxvb3AuCisJICAgIH0KKwl9CisKKwlpZihQUlRNUF9QUklWQVRFX1NFVF9QUk9DLT5uYW1lID09IE5VTEwpCisJeyAgLy9Ob3QgZm91bmQgYXJndW1lbnQKKwkgICAgU3RhdHVzID0gLUVJTlZBTDsKKwkgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PnJ0X2lvY3RsX3NldHBhcmFtOjogKGl3cHJpdikgTm90IFN1cHBvcnQgU2V0IENvbW1hbmQgWyVzPSVzXVxuIiwgdGhpc19jaGFyLCB2YWx1ZSkpOworCX0KKworICAgIHJldHVybiBTdGF0dXM7Cit9CisKKworc3RhdGljIGludAorcnRfcHJpdmF0ZV9nZXRfc3RhdGlzdGljcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQlzdHJ1Y3QgaXdfcG9pbnQgKndycSwgY2hhciAqZXh0cmEpCit7CisJSU5UCQkJCVN0YXR1cyA9IDA7CisgICAgUFJUTVBfQURBUFRFUiAgIHBBZCA9IGRldi0+bWxfcHJpdjsKKworICAgIGlmIChleHRyYSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgd3JxLT5sZW5ndGggPSAwOworICAgICAgICByZXR1cm4gLUVJTzsKKyAgICB9CisKKyAgICBtZW1zZXQoZXh0cmEsIDB4MDAsIElXX1BSSVZfU0laRV9NQVNLKTsKKyAgICBzcHJpbnRmKGV4dHJhLCAiXG5cbiIpOworCisjaWZkZWYgUkFMSU5LX0FURQorCWlmIChBVEVfT04ocEFkKSkKKwl7CisJICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlR4IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPmF0ZS5UeERvbmVDb3VudCk7CisJICAgIC8vc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyB3aXRob3V0IHJldHJ5ICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+YXRlLlR4RG9uZUNvdW50KTsKKwl9CisJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwl7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCk7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyB3aXRob3V0IHJldHJ5ICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCAtIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LlF1YWRQYXJ0KTsKKwl9CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyBhZnRlciByZXRyeSAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQuUXVhZFBhcnQpOworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlR4IGZhaWwgdG8gUmN2IEFDSyBhZnRlciByZXRyeSAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC5RdWFkUGFydCk7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlRTIFN1Y2Nlc3MgUmN2IENUUyAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJUU1N1Y2Nlc3NDb3VudC5RdWFkUGFydCk7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlRTIEZhaWwgUmN2IENUUyAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJUU0ZhaWx1cmVDb3VudC5RdWFkUGFydCk7CisKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSeCBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuUmVjZWl2ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0KTsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSeCB3aXRoIENSQyAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuRkNTRXJyb3JDb3VudC5RdWFkUGFydCk7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUnggZHJvcCBkdWUgdG8gb3V0IG9mIHJlc291cmNlICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXIpOworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJ4IGR1cGxpY2F0ZSBmcmFtZSAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5GcmFtZUR1cGxpY2F0ZUNvdW50LlF1YWRQYXJ0KTsKKworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIkZhbHNlIENDQSAob25lIHNlY29uZCkgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0ZhbHNlQ0NBQ250KTsKKyNpZmRlZiBSQUxJTktfQVRFCisJaWYgKEFURV9PTihwQWQpKQorCXsKKwkJaWYgKHBBZC0+YXRlLlJ4QW50ZW5uYVNlbCA9PSAwKQorCQl7CisgICAgCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUEgICAgICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoTE9ORykocEFkLT5hdGUuTGFzdFJzc2kwIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOworCQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1CIChpZiBhdmFpbGFibGUpICAgICAgICAgICA9ICVsZFxuIiwgKExPTkcpKHBBZC0+YXRlLkxhc3RSc3NpMSAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKwkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQyAoaWYgYXZhaWxhYmxlKSAgICAgICAgICAgPSAlbGRcblxuIiwgKExPTkcpKHBBZC0+YXRlLkxhc3RSc3NpMiAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKwkJfQorCQllbHNlCisJCXsKKyAgICAJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChMT05HKShwQWQtPmF0ZS5MYXN0UnNzaTAgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7CisJCX0KKwl9CisJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwl7CisgICAgCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChMT05HKShwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKyAgICAgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1CIChpZiBhdmFpbGFibGUpICAgICAgICAgICA9ICVsZFxuIiwgKExPTkcpKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOworICAgICAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUMgKGlmIGF2YWlsYWJsZSkgICAgICAgICAgID0gJWxkXG5cbiIsIChMT05HKShwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMiAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKwl9CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIldwYVN1cHBsaWNhbnRVUCAgICAgICAgICAgICAgICAgPSAlZFxuXG4iLCBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCisgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IHJ0X3ByaXZhdGVfZ2V0X3N0YXRpc3RpY3MsIHdycS0+bGVuZ3RoID0gJWRcbiIsIHdycS0+bGVuZ3RoKSk7CisKKyAgICByZXR1cm4gU3RhdHVzOworfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCit2b2lkCWdldEJhSW5mbygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwT3V0QnVmKQoreworCUlOVCBpLCBqOworCUJBX09SSV9FTlRSWSAqcE9yaUJBRW50cnk7CisJQkFfUkVDX0VOVFJZICpwUmVjQkFFbnRyeTsKKworCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCisJeworCQlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W2ldOworCQlpZiAoKChwRW50cnktPlZhbGlkQXNDTEkgfHwgcEVudHJ5LT5WYWxpZEFzQXBDbGkpICYmIChwRW50cnktPlNzdCA9PSBTU1RfQVNTT0MpKQorCQkJfHwgKHBFbnRyeS0+VmFsaWRBc1dEUykgfHwgKHBFbnRyeS0+VmFsaWRBc01lc2gpKQorCQl7CisJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1xuJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlggKEFpZCA9ICVkKSAoQVApIC1cbiIsCisgICAgICAgICAgICAgICAgcE91dEJ1ZiwKKwkJCQlwRW50cnktPkFkZHJbMF0sIHBFbnRyeS0+QWRkclsxXSwgcEVudHJ5LT5BZGRyWzJdLAorCQkJCXBFbnRyeS0+QWRkclszXSwgcEVudHJ5LT5BZGRyWzRdLCBwRW50cnktPkFkZHJbNV0sIHBFbnRyeS0+QWlkKTsKKworCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNbUmVjaXBpZW50XVxuIiwgcE91dEJ1Zik7CisJCQlmb3IgKGo9MDsgaiA8IE5VTV9PRl9USUQ7IGorKykKKwkJCXsKKwkJCQlpZiAocEVudHJ5LT5CQVJlY1djaWRBcnJheVtqXSAhPSAwKQorCQkJCXsKKwkJCQkJcFJlY0JBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtwRW50cnktPkJBUmVjV2NpZEFycmF5W2pdXTsKKwkJCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNUSUQ9JWQsIEJBV2luU2l6ZT0lZCwgTGFzdEluZFNlcT0lZCwgUmVvcmRlcmluZ1BrdHM9JWRcbiIsIHBPdXRCdWYsIGosIHBSZWNCQUVudHJ5LT5CQVdpblNpemUsIHBSZWNCQUVudHJ5LT5MYXN0SW5kU2VxLCBwUmVjQkFFbnRyeS0+bGlzdC5xbGVuKTsKKwkJCQl9CisJCQl9CisJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1xuIiwgcE91dEJ1Zik7CisKKwkJCXNwcmludGYocE91dEJ1ZiwgIiVzW09yaWdpbmF0b3JdXG4iLCBwT3V0QnVmKTsKKwkJCWZvciAoaj0wOyBqIDwgTlVNX09GX1RJRDsgaisrKQorCQkJeworCQkJCWlmIChwRW50cnktPkJBT3JpV2NpZEFycmF5W2pdICE9IDApCisJCQkJeworCQkJCQlwT3JpQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W3BFbnRyeS0+QkFPcmlXY2lkQXJyYXlbal1dOworCQkJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1RJRD0lZCwgQkFXaW5TaXplPSVkLCBTdGFydFNlcT0lZCwgQ3VyVHhTZXE9JWRcbiIsIHBPdXRCdWYsIGosIHBPcmlCQUVudHJ5LT5CQVdpblNpemUsIHBPcmlCQUVudHJ5LT5TZXF1ZW5jZSwgcEVudHJ5LT5UeFNlcVtqXSk7CisJCQkJfQorCQkJfQorCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNcblxuIiwgcE91dEJ1Zik7CisJCX0KKyAgICAgICAgaWYgKHN0cmxlbihwT3V0QnVmKSA+IChJV19QUklWX1NJWkVfTUFTSyAtIDMwKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKwl9CisKKwlyZXR1cm47Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK3N0YXRpYyBpbnQKK3J0X3ByaXZhdGVfc2hvdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQlzdHJ1Y3QgaXdfcG9pbnQgKndycSwgY2hhciAqZXh0cmEpCit7CisgICAgSU5UCQkJCVN0YXR1cyA9IDA7CisgICAgVklSVFVBTF9BREFQVEVSCSpwVmlydHVhbEFkID0gTlVMTDsKKyAgICBQUlRNUF9BREFQVEVSICAgcEFkOworCVBPU19DT09LSUUJCXBPYmo7CisgICAgdTMyICAgICAgICAgICAgIHN1YmNtZCA9IHdycS0+ZmxhZ3M7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCQlwQWQgPSBkZXYtPm1sX3ByaXY7CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+bWxfcHJpdjsKKwkJcEFkID0gcFZpcnR1YWxBZC0+UnRtcERldi0+bWxfcHJpdjsKKwl9CisJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKworCWlmIChwQWQgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5tbF9wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworICAgIGlmIChleHRyYSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgd3JxLT5sZW5ndGggPSAwOworICAgICAgICByZXR1cm4gLUVJTzsKKyAgICB9CisgICAgbWVtc2V0KGV4dHJhLCAweDAwLCBJV19QUklWX1NJWkVfTUFTSyk7CisKKwl7CisJCXBPYmotPmlvY3RsX2lmX3R5cGUgPSBJTlRfTUFJTjsKKyAgICAgICAgcE9iai0+aW9jdGxfaWYgPSBNQUlOX01CU1NJRDsKKwl9CisKKyAgICBzd2l0Y2goc3ViY21kKQorICAgIHsKKworICAgICAgICBjYXNlIFNIT1dfQ09OTl9TVEFUVVM6CisgICAgICAgICAgICBpZiAoTU9OSVRPUl9PTihwQWQpKQorICAgICAgICAgICAgeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgICAgICAgICAgICAgIGlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQgJiYKKyAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXKQorICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiTW9uaXRvciBNb2RlKENlbnRyYWxDaGFubmVsICVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIk1vbml0b3IgTW9kZShDaGFubmVsICVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID09IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgaWYgKElORlJBX09OKHBBZCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIkNvbm5lY3RlZChBUDogJXNbJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhdKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbNV0pOworICAgICAgICAgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJTc2lkPSVzICxTc2lkbGVuID0gJWRcbiIscEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbikpOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQURIT0NfT04ocEFkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJDb25uZWN0ZWRcbiIpOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAllbHNlCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICBzcHJpbnRmKGV4dHJhLCAiRGlzY29ubmVjdGVkXG4iKTsKKyAgICAgICAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiQ29ublN0YXR1cyBpcyBub3QgY29ubmVjdGVkXG4iKSk7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTSE9XX0RSVklFUl9WRVJJT046CisgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiRHJpdmVyIHZlcnNpb24tJXMsICVzICVzXG4iLCBTVEFfRFJJVkVSX1ZFUlNJT04sIF9fREFURV9fLCBfX1RJTUVfXyApOworICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICAgICAgY2FzZSBTSE9XX0JBX0lORk86CisgICAgICAgICAgICBnZXRCYUluZm8ocEFkLCBleHRyYSk7CisgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQljYXNlIFNIT1dfREVTQ19JTkZPOgorCQkJeworCQkJCVNob3dfRGVzY0luZm9fUHJvYyhwQWQsIE5VTEwpOworCQkJCXdycS0+bGVuZ3RoID0gMDsgLy8gMTogc2l6ZSBvZiAnXDAnCisJCQl9CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBSQUlPX09GRjoKKyAgICAgICAgICAgIGlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJTY2FubmluZ1xuIik7CisgICAgICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWQtPlN0YUNmZy5iU3dSYWRpbyA9IEZBTFNFOworICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyAhPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLmJSYWRpbyA9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbyk7CisgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBGQUxTRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE1sbWVSYWRpb09mZihwQWQpOworICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KKwkJCQkJcEFkLT5FeHRyYUluZm8gPSBTV19SQURJT19PRkY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIlJhZGlvIE9mZlxuIik7CisgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJBSU9fT046CisgICAgICAgICAgICBpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiU2Nhbm5pbmdcbiIpOworICAgICAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlN3UmFkaW8gPSBUUlVFOworICAgICAgICAgICAgLy9pZiAocEFkLT5TdGFDZmcuYlJhZGlvICE9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlJhZGlvID0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKTsKKyAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBNbG1lUmFkaW9PbihwQWQpOworICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KKwkJCQkJcEFkLT5FeHRyYUluZm8gPSBFWFRSQV9JTkZPX0NMRUFSOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJSYWRpbyBPblxuIik7CisgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgIGJyZWFrOworCisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJY2FzZSBTSE9XX0RMU19FTlRSWV9JTkZPOgorCQkJeworCQkJCVNldF9EbHNFbnRyeUluZm9fRGlzcGxheV9Qcm9jKHBBZCwgTlVMTCk7CisJCQkJd3JxLT5sZW5ndGggPSAwOyAvLyAxOiBzaXplIG9mICdcMCcKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisJCWNhc2UgU0hPV19DRkdfVkFMVUU6CisJCQl7CisJCQkJU3RhdHVzID0gUlRNUFNob3dDZmdWYWx1ZShwQWQsIHdycS0+cG9pbnRlciwgZXh0cmEpOworCQkJCWlmIChTdGF0dXMgPT0gMCkKKwkJCQkJd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisJCQl9CisJCQlicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIC0gdW5rbm93IHN1YmNtZCA9ICVkXG4iLCBfX2Z1bmNfXywgc3ViY21kKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gU3RhdHVzOworfQorCisjaWZkZWYgU0lPQ1NJV01MTUUKK2ludCBydF9pb2N0bF9zaXdtbG1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgICBwQWQgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IGl3X21sbWUgKnBNbG1lID0gKHN0cnVjdCBpd19tbG1lICopd3JxdS0+ZGF0YS5wb2ludGVyOworCU1MTUVfUVVFVUVfRUxFTQkJCQlNc2dFbGVtOworCU1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVAlEaXNBc3NvY1JlcTsKKwlNTE1FX0RFQVVUSF9SRVFfU1RSVUNUICAgICAgRGVBdXRoUmVxOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gJXNcbiIsIF9fZnVuY19fKSk7CisKKwlpZiAocE1sbWUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2gocE1sbWUtPmNtZCkKKwl7CisjaWZkZWYgSVdfTUxNRV9ERUFVVEgKKwkJY2FzZSBJV19NTE1FX0RFQVVUSDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzIC0gSVdfTUxNRV9ERUFVVEhcbiIsIF9fZnVuY19fKSk7CisJCQlDT1BZX01BQ19BRERSKERlQXV0aFJlcS5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQlEZUF1dGhSZXEuUmVhc29uID0gcE1sbWUtPnJlYXNvbl9jb2RlOworCQkJTXNnRWxlbS5Nc2dMZW4gPSBzaXplb2YoTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCk7CisJCQlOZGlzTW92ZU1lbW9yeShNc2dFbGVtLk1zZywgJkRlQXV0aFJlcSwgc2l6ZW9mKE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QpKTsKKwkJCU1sbWVEZWF1dGhSZXFBY3Rpb24ocEFkLCAmTXNnRWxlbSk7CisJCQlpZiAoSU5GUkFfT04ocEFkKSkKKwkJCXsKKwkJCSAgICBMaW5rRG93bihwQWQsIEZBTFNFKTsKKwkJCSAgICBwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZiAvLyBJV19NTE1FX0RFQVVUSCAvLworI2lmZGVmIElXX01MTUVfRElTQVNTT0MKKwkJY2FzZSBJV19NTE1FX0RJU0FTU09DOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gJXMgLSBJV19NTE1FX0RJU0FTU09DXG4iLCBfX2Z1bmNfXykpOworCQkJQ09QWV9NQUNfQUREUihEaXNBc3NvY1JlcS5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQlEaXNBc3NvY1JlcS5SZWFzb24gPSAgcE1sbWUtPnJlYXNvbl9jb2RlOworCisJCQlNc2dFbGVtLk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOworCQkJTXNnRWxlbS5Nc2dUeXBlID0gTVQyX01MTUVfRElTQVNTT0NfUkVROworCQkJTXNnRWxlbS5Nc2dMZW4gPSBzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KE1zZ0VsZW0uTXNnLCAmRGlzQXNzb2NSZXEsIHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpKTsKKworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfRElTQVNTT0M7CisJCQlNbG1lRGlzYXNzb2NSZXFBY3Rpb24ocEFkLCAmTXNnRWxlbSk7CisJCQlicmVhazsKKyNlbmRpZiAvLyBJV19NTE1FX0RJU0FTU09DIC8vCisJCWRlZmF1bHQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlcyAtIFVua25vdyBDb21tYW5kXG4iLCBfX2Z1bmNfXykpOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gU0lPQ1NJV01MTUUgLy8KKworI2lmIFdJUkVMRVNTX0VYVCA+IDE3CitpbnQgcnRfaW9jdGxfc2l3YXV0aChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IGl3X3BhcmFtICpwYXJhbSA9ICZ3cnF1LT5wYXJhbTsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisJfQorCXN3aXRjaCAocGFyYW0tPmZsYWdzICYgSVdfQVVUSF9JTkRFWCkgeworICAgIAljYXNlIElXX0FVVEhfV1BBX1ZFUlNJT046CisgICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfV1BBX1ZFUlNJT05fV1BBKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s7CisJCQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCisJCQkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfV1BBX1ZFUlNJT05fV1BBMikKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzsKKworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfV1BBX1ZFUlNJT04gLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIAljYXNlIElXX0FVVEhfQ0lQSEVSX1BBSVJXSVNFOgorICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9OT05FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9XRVA0MCB8fAorICAgICAgICAgICAgICAgICAgICAgcGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1dFUDEwNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxWCA9IEZBTFNFOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9US0lQKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX0NDTVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9DSVBIRVJfUEFJUldJU0UgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIAljYXNlIElXX0FVVEhfQ0lQSEVSX0dST1VQOgorICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9OT05FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfV0VQNDAgfHwKKyAgICAgICAgICAgICAgICAgICAgIHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9XRVAxMDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1RLSVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfQ0NNUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX0NJUEhFUl9HUk9VUCAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9LRVlfTUdNVDoKKyAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9LRVlfTUdNVF84MDJfMVgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gRkFMU0U7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMjsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gRkFMU0U7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAvLyBXRVAgMXgKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBUUlVFOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSAwKQorICAgICAgICAgICAgeworCQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfS0VZX01HTVQgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIAljYXNlIElXX0FVVEhfUlhfVU5FTkNSWVBURURfRUFQT0w6CisgICAgICAgICAgICBicmVhazsKKyAgICAJY2FzZSBJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRDoKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRCAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOworICAgIAkJYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9EUk9QX1VORU5DUllQVEVEOgorICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSAhPSAwKQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisJCQllbHNlCisJCQl7CisJCQkJU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisJCQl9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9XUEFfVkVSU0lPTiAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOworICAgIAkJYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF84MDIxMV9BVVRIX0FMRzoKKwkJCWlmIChwYXJhbS0+dmFsdWUgJiBJV19BVVRIX0FMR19TSEFSRURfS0VZKQorICAgICAgICAgICAgeworCQkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQ7CisJCQl9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgJiBJV19BVVRIX0FMR19PUEVOX1NZU1RFTSkKKyAgICAgICAgICAgIHsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKwkJCX0KKyAgICAgICAgICAgIGVsc2UKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIXzgwMjExX0FVVEhfQUxHIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7CisJCQlicmVhazsKKyAgICAJY2FzZSBJV19BVVRIX1dQQV9FTkFCTEVEOgorICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfV1BBX0VOQUJMRUQgLSBEcml2ZXIgc3VwcG9ydHMgV1BBIShwYXJhbS0+dmFsdWUgPSAlZClcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAJCWJyZWFrOworICAgIAlkZWZhdWx0OgorICAgIAkJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdhdXRoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IGl3X3BhcmFtICpwYXJhbSA9ICZ3cnF1LT5wYXJhbTsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisgICAgfQorCisJc3dpdGNoIChwYXJhbS0+ZmxhZ3MgJiBJV19BVVRIX0lOREVYKSB7CisJY2FzZSBJV19BVVRIX0RST1BfVU5FTkNSWVBURUQ6CisgICAgICAgIHBhcmFtLT52YWx1ZSA9IChwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpID8gMCA6IDE7CisJCWJyZWFrOworCisJY2FzZSBJV19BVVRIXzgwMjExX0FVVEhfQUxHOgorICAgICAgICBwYXJhbS0+dmFsdWUgPSAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpID8gSVdfQVVUSF9BTEdfU0hBUkVEX0tFWSA6IElXX0FVVEhfQUxHX09QRU5fU1lTVEVNOworCQlicmVhazsKKworCWNhc2UgSVdfQVVUSF9XUEFfRU5BQkxFRDoKKwkJcGFyYW0tPnZhbHVlID0gKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSA/IDEgOiAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnRfaW9jdGxfZ2l3YXV0aDo6cGFyYW0tPnZhbHVlID0gJWQhXG4iLCBwYXJhbS0+dmFsdWUpKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBmblNldENpcGhlcktleSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBJTlQgICAgICAgICAgICAga2V5SWR4LAorICAgIElOICBVQ0hBUiAgICAgICAgICAgQ2lwaGVyQWxnLAorICAgIElOICBCT09MRUFOICAgICAgICAgYkdUSywKKyAgICBJTiAgc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCkKK3sKKyAgICBOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKyAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCBleHQtPmtleSwgTEVOX1RLSVBfRUspOworICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5UeE1pYywgZXh0LT5rZXkgKyBMRU5fVEtJUF9FSywgTEVOX1RLSVBfVFhNSUNLKTsKKyAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uUnhNaWMsIGV4dC0+a2V5ICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7CisgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworICAgIC8vIFVwZGF0ZSBncm91cCBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCisJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLAorCQkJCQkJICBCU1MwLAorCQkJCQkJICBrZXlJZHgsCisJCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcsCisJCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksCisJCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5UeE1pYywKKwkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLlJ4TWljKTsKKworICAgIGlmIChiR1RLKQorICAgICAgICAvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKyAgICAJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwKKyAgICAJCQkJCQkJICBCU1MwLAorICAgIAkJCQkJCQkgIGtleUlkeCwKKyAgICAJCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnLAorICAgIAkJCQkJCQkgIE5VTEwpOworICAgIGVsc2UKKyAgICAgICAgLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCisgICAgCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkYXB0ZXIsCisgICAgCQkJCQkJCSAgQlNTMCwKKyAgICAJCQkJCQkJICBrZXlJZHgsCisgICAgCQkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZywKKyAgICAJCQkJCQkJICAmcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdKTsKK30KKworaW50IHJ0X2lvY3RsX3Npd2VuY29kZWV4dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICBjaGFyICpleHRyYSkKKwkJCXsKKyAgICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IGl3X3BvaW50ICplbmNvZGluZyA9ICZ3cnF1LT5lbmNvZGluZzsKKwlzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0ID0gKHN0cnVjdCBpd19lbmNvZGVfZXh0ICopZXh0cmE7CisgICAgaW50IGtleUlkeCwgYWxnID0gZXh0LT5hbGc7CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKworICAgIGlmIChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpCisJeworICAgICAgICBrZXlJZHggPSAoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisgICAgICAgIC8vIHNldCBCU1NJRCB3Y2lkIGVudHJ5IG9mIHRoZSBQYWlyLXdpc2UgS2V5IHRhYmxlIGFzIG5vLXNlY3VyaXR5IG1vZGUKKwkgICAgQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkocEFkYXB0ZXIsIEJTUzAsIEJTU0lEX1dDSUQpOworICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gMDsKKwkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIDAsIChVQ0hBUilrZXlJZHgpOworICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6UmVtb3ZlIGFsbCBrZXlzIShlbmNvZGluZy0+ZmxhZ3MgPSAleClcbiIsIF9fZnVuY19fLCBlbmNvZGluZy0+ZmxhZ3MpKTsKKyAgICB9CisJCQkJCWVsc2UKKyAgICB7CisgICAgICAgIC8vIEdldCBLZXkgSW5kZXggYW5kIGNvbnZldCB0byBvdXIgb3duIGRlZmluZWQga2V5IGluZGV4CisgICAgCWtleUlkeCA9IChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKyAgICAJaWYoKGtleUlkeCA8IDApIHx8IChrZXlJZHggPj0gTlJfV0VQX0tFWVMpKQorICAgIAkJcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKQorICAgICAgICB7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IGtleUlkeDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpEZWZhdWx0S2V5SWQgPSAlZFxuIiwgX19mdW5jX18sIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkKSk7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGFsZykgeworICAgIAkJY2FzZSBJV19FTkNPREVfQUxHX05PTkU6CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfTk9ORVxuIiwgX19mdW5jX18pKTsKKyAgICAJCQlicmVhazsKKyAgICAJCWNhc2UgSVdfRU5DT0RFX0FMR19XRVA6CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfV0VQIC0gZXh0LT5rZXlfbGVuID0gJWQsIGtleUlkeCA9ICVkXG4iLCBfX2Z1bmNfXywgZXh0LT5rZXlfbGVuLCBrZXlJZHgpKTsKKyAgICAJCQlpZiAoZXh0LT5rZXlfbGVuID09IE1BWF9XRVBfS0VZX1NJWkUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gTUFYX1dFUF9LRVlfU0laRTsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisJCQkJfQorICAgICAgICAJCWVsc2UgaWYgKGV4dC0+a2V5X2xlbiA9PSBNSU5fV0VQX0tFWV9TSVpFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IE1JTl9XRVBfS0VZX1NJWkU7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCQl9CisgICAgICAgIAkJZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksICAxNik7CisJCQkgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwgZXh0LT5rZXksIGV4dC0+a2V5X2xlbik7CisgICAgCQkJYnJlYWs7CisgICAgICAgICAgICBjYXNlIElXX0VOQ09ERV9BTEdfVEtJUDoKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfRU5DT0RFX0FMR19US0lQIC0ga2V5SWR4ID0gJWQsIGV4dC0+a2V5X2xlbiA9ICVkXG4iLCBfX2Z1bmNfXywga2V5SWR4LCBleHQtPmtleV9sZW4pKTsKKyAgICAgICAgICAgICAgICBpZiAoZXh0LT5rZXlfbGVuID09IDMyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmblNldENpcGhlcktleShwQWRhcHRlciwga2V5SWR4LCBDSVBIRVJfVEtJUCwgRkFMU0UsIGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCQl9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9HUk9VUF9LRVkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZuU2V0Q2lwaGVyS2V5KHBBZGFwdGVyLCBrZXlJZHgsIENJUEhFUl9US0lQLCBUUlVFLCBleHQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAorICAgICAgICAgICAgCSAgICAgICAgU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSVdfRU5DT0RFX0FMR19DQ01QOgorICAgICAgICAgICAgICAgIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkKKwkJeworICAgICAgICAgICAgICAgICAgICBmblNldENpcGhlcktleShwQWRhcHRlciwga2V5SWR4LCBDSVBIRVJfQUVTLCBGQUxTRSwgZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKKyAgICAgICAgICAgICAgICAgICAgCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfR1JPVVBfS0VZKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm5TZXRDaXBoZXJLZXkocEFkYXB0ZXIsIGtleUlkeCwgQ0lQSEVSX0FFUywgVFJVRSwgZXh0KTsKKworICAgICAgICAgICAgICAgICAgICAvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAorICAgICAgICAJICAgICAgICBTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgCQlkZWZhdWx0OgorICAgIAkJCXJldHVybiAtRUlOVkFMOworCQl9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorcnRfaW9jdGxfZ2l3ZW5jb2RlZXh0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkID0gZGV2LT5tbF9wcml2OworCVBDSEFSIHBLZXkgPSBOVUxMOworCXN0cnVjdCBpd19wb2ludCAqZW5jb2RpbmcgPSAmd3JxdS0+ZW5jb2Rpbmc7CisJc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCA9IChzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqKWV4dHJhOworCWludCBpZHgsIG1heF9rZXlfbGVuOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT09PiBydF9pb2N0bF9naXdlbmNvZGVleHRcbiIpKTsKKworCW1heF9rZXlfbGVuID0gZW5jb2RpbmctPmxlbmd0aCAtIHNpemVvZigqZXh0KTsKKwlpZiAobWF4X2tleV9sZW4gPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlkeCA9IGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWDsKKwlpZiAoaWR4KQorCXsKKwkJaWYgKGlkeCA8IDEgfHwgaWR4ID4gNCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZHgtLTsKKworCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSB8fAorCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkKKwkJeworCQkJaWYgKGlkeCAhPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQpCisJCQl7CisJCQkJZXh0LT5rZXlfbGVuID0gMDsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKwllbHNlCisJCWlkeCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKKworCWVuY29kaW5nLT5mbGFncyA9IGlkeCArIDE7CisJbWVtc2V0KGV4dCwgMCwgc2l6ZW9mKCpleHQpKTsKKworCWV4dC0+a2V5X2xlbiA9IDA7CisJc3dpdGNoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cykgeworCQljYXNlIE5kaXM4MDJfMTFXRVBEaXNhYmxlZDoKKwkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19OT05FOworCQkJZW5jb2RpbmctPmZsYWdzIHw9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwkJCWJyZWFrOworCQljYXNlIE5kaXM4MDJfMTFXRVBFbmFibGVkOgorCQkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX1dFUDsKKwkJCWlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleUxlbiA+IG1heF9rZXlfbGVuKQorCQkJCXJldHVybiAtRTJCSUc7CisJCQllbHNlCisJCQl7CisJCQkJZXh0LT5rZXlfbGVuID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlMZW47CisJCQkJcEtleSA9ICYocEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlbMF0pOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDoKKwkJY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOgorCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19US0lQOworCQkJZWxzZQorCQkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19DQ01QOworCisJCQlpZiAobWF4X2tleV9sZW4gPCAzMikKKwkJCQlyZXR1cm4gLUUyQklHOworCQkJZWxzZQorCQkJeworCQkJCWV4dC0+a2V5X2xlbiA9IDMyOworCQkJCXBLZXkgPSAmcEFkLT5TdGFDZmcuUE1LWzBdOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZXh0LT5rZXlfbGVuICYmIHBLZXkpCisJeworCQllbmNvZGluZy0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0VOQUJMRUQ7CisJCW1lbWNweShleHQtPmtleSwgcEtleSwgZXh0LT5rZXlfbGVuKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIFNJT0NTSVdHRU5JRQoraW50IHJ0X2lvY3RsX3Npd2dlbmllKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgICBwQWQgPSBkZXYtPm1sX3ByaXY7CisKKwlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPiBNQVhfTEVOX09GX1JTTklFIHx8CisJICAgICh3cnF1LT5kYXRhLmxlbmd0aCAmJiBleHRyYSA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAod3JxdS0+ZGF0YS5sZW5ndGgpCisJeworCQlwQWQtPlN0YUNmZy5SU05JRV9MZW4gPSB3cnF1LT5kYXRhLmxlbmd0aDsKKwkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlJTTl9JRVswXSwgZXh0cmEsIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbik7CisJfQorCWVsc2UKKwl7CisJCXBBZC0+U3RhQ2ZnLlJTTklFX0xlbiA9IDA7CisJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlN0YUNmZy5SU05fSUVbMF0sIE1BWF9MRU5fT0ZfUlNOSUUpOworCX0KKworCXJldHVybiAwOworfQorI2VuZGlmIC8vIFNJT0NTSVdHRU5JRSAvLworCitpbnQgcnRfaW9jdGxfZ2l3Z2VuaWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgICBwQWQgPSBkZXYtPm1sX3ByaXY7CisKKwlpZiAoKHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiA9PSAwKSB8fAorCQkocEFkLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpKQorCXsKKwkJd3JxdS0+ZGF0YS5sZW5ndGggPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2lmZGVmIFNJT0NTSVdHRU5JRQorCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFKQorCXsKKwlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pCisJCXJldHVybiAtRTJCSUc7CisKKwl3cnF1LT5kYXRhLmxlbmd0aCA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKKwltZW1jcHkoZXh0cmEsICZwQWQtPlN0YUNmZy5SU05fSUVbMF0sIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbik7CisJfQorCWVsc2UKKyNlbmRpZiAvLyBTSU9DU0lXR0VOSUUgLy8KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCXsKKwkJVUNIQVIgUlNOSWUgPSBJRV9XUEE7CisKKwkJaWYgKHdycXUtPmRhdGEubGVuZ3RoIDwgKHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiArIDIpKSAvLyBJRCwgTGVuCisJCQlyZXR1cm4gLUUyQklHOworCQl3cnF1LT5kYXRhLmxlbmd0aCA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiArIDI7CisKKwkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSB8fAorICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpKQorCQkJUlNOSWUgPSBJRV9SU047CisKKwkJZXh0cmFbMF0gPSAoY2hhcilSU05JZTsKKwkJZXh0cmFbMV0gPSBwQWQtPlN0YUNmZy5SU05JRV9MZW47CisJCW1lbWNweShleHRyYSsyLCAmcEFkLT5TdGFDZmcuUlNOX0lFWzBdLCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3cG1rc2Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAgIHBBZCA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgaXdfcG1rc2EgKnBQbWtzYSA9IChzdHJ1Y3QgaXdfcG1rc2EgKil3cnF1LT5kYXRhLnBvaW50ZXI7CisJSU5UCUNhY2hlZElkeCA9IDAsIGlkeCA9IDA7CisKKwlpZiAocFBta3NhID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT09PiBydF9pb2N0bF9zaXdwbWtzYVxuIikpOworCXN3aXRjaChwUG1rc2EtPmNtZCkKKwl7CisJCWNhc2UgSVdfUE1LU0FfRkxVU0g6CisJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5TYXZlZFBNSywgc2l6ZW9mKEJTU0lEX0lORk8pKlBNS0lEX05PKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoInJ0X2lvY3RsX3Npd3Bta3NhIC0gSVdfUE1LU0FfRkxVU0hcbiIpKTsKKwkJCWJyZWFrOworCQljYXNlIElXX1BNS1NBX1JFTU9WRToKKwkJCWZvciAoQ2FjaGVkSWR4ID0gMDsgQ2FjaGVkSWR4IDwgcEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW07IENhY2hlZElkeCsrKQorCQkJeworCQkgICAgICAgIC8vIGNvbXBhcmUgdGhlIEJTU0lECisJCSAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwUG1rc2EtPmJzc2lkLnNhX2RhdGEsIHBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSUQsIE1BQ19BRERSX0xFTikpCisJCSAgICAgICAgeworCQkgICAgICAgIAlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELCBNQUNfQUREUl9MRU4pOworCQkJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLlBNS0lELCAxNik7CisJCQkJCWZvciAoaWR4ID0gQ2FjaGVkSWR4OyBpZHggPCAocEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW0gLSAxKTsgaWR4KyspCisJCQkJCXsKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHhdLkJTU0lEWzBdLCAmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4KzFdLkJTU0lEWzBdLCBNQUNfQUREUl9MRU4pOworCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW2lkeF0uUE1LSURbMF0sICZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHgrMV0uUE1LSURbMF0sIDE2KTsKKwkJCQkJfQorCQkJCQlwQWQtPlN0YUNmZy5TYXZlZFBNS051bS0tOworCQkJICAgICAgICBicmVhazsKKwkJICAgICAgICB9CisJICAgICAgICB9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoInJ0X2lvY3RsX3Npd3Bta3NhIC0gSVdfUE1LU0FfUkVNT1ZFXG4iKSk7CisJCQlicmVhazsKKwkJY2FzZSBJV19QTUtTQV9BREQ6CisJCQlmb3IgKENhY2hlZElkeCA9IDA7IENhY2hlZElkeCA8IHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtOyBDYWNoZWRJZHgrKykKKwkJCXsKKwkJICAgICAgICAvLyBjb21wYXJlIHRoZSBCU1NJRAorCQkgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocFBta3NhLT5ic3NpZC5zYV9kYXRhLCBwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELCBNQUNfQUREUl9MRU4pKQorCQkJICAgICAgICBicmVhazsKKwkgICAgICAgIH0KKworCSAgICAgICAgLy8gRm91bmQsIHJlcGxhY2UgaXQKKwkgICAgICAgIGlmIChDYWNoZWRJZHggPCBQTUtJRF9OTykKKwkgICAgICAgIHsKKwkJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgiVXBkYXRlIFBNS0lELCBpZHggPSAlZFxuIiwgQ2FjaGVkSWR4KSk7CisJCSAgICAgICAgTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSURbMF0sIHBQbWtzYS0+YnNzaWQuc2FfZGF0YSwgTUFDX0FERFJfTEVOKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5QTUtJRFswXSwgcFBta3NhLT5wbWtpZCwgMTYpOworCQkgICAgICAgIHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtKys7CisJICAgICAgICB9CisJICAgICAgICAvLyBOb3QgZm91bmQsIHJlcGxhY2UgdGhlIGxhc3Qgb25lCisJICAgICAgICBlbHNlCisJICAgICAgICB7CisJCSAgICAgICAgLy8gUmFuZG9tbHkgcmVwbGFjZSBvbmUKKwkJICAgICAgICBDYWNoZWRJZHggPSAocFBta3NhLT5ic3NpZC5zYV9kYXRhWzVdICUgUE1LSURfTk8pOworCQkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJVcGRhdGUgUE1LSUQsIGlkeCA9ICVkXG4iLCBDYWNoZWRJZHgpKTsKKwkJICAgICAgICBOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRFswXSwgcFBta3NhLT5ic3NpZC5zYV9kYXRhLCBNQUNfQUREUl9MRU4pOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLlBNS0lEWzBdLCBwUG1rc2EtPnBta2lkLCAxNik7CisJICAgICAgICB9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoInJ0X2lvY3RsX3Npd3Bta3NhIC0gSVdfUE1LU0FfQUREXG4iKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoInJ0X2lvY3RsX3Npd3Bta3NhIC0gVW5rbm93IENvbW1hbmQhIVxuIikpOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gI2lmIFdJUkVMRVNTX0VYVCA+IDE3CisKKyNpZmRlZiBEQkcKK3N0YXRpYyBpbnQKK3J0X3ByaXZhdGVfaW9jdGxfYmJwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBpd19wb2ludCAqd3JxLCBjaGFyICpleHRyYSkKKwkJCXsKKwlDSEFSCQkJCSp0aGlzX2NoYXI7CisJQ0hBUgkJCQkqdmFsdWUgPSBOVUxMOworCVVDSEFSCQkJCXJlZ0JCUCA9IDA7CisJVUlOVDMyCQkJCWJicElkOworCVVJTlQzMgkJCQliYnBWYWx1ZTsKKwlCT09MRUFOCQkJCWJJc1ByaW50QWxsQkJQID0gRkFMU0U7CisJSU5UCQkJCQlTdGF0dXMgPSAwOworICAgIFBSVE1QX0FEQVBURVIgICAgICAgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisKKworCW1lbXNldChleHRyYSwgMHgwMCwgSVdfUFJJVl9TSVpFX01BU0spOworCisJaWYgKHdycS0+bGVuZ3RoID4gMSkgLy9ObyBwYXJhbWV0ZXJzLgorCQkJCXsKKwkJc3ByaW50ZihleHRyYSwgIlxuIik7CisKKwkJLy9QYXJzaW5nIFJlYWQgb3IgV3JpdGUKKwkJdGhpc19jaGFyID0gd3JxLT5wb2ludGVyOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ0aGlzX2NoYXI9JXNcbiIsIHRoaXNfY2hhcikpOworCQlpZiAoISp0aGlzX2NoYXIpCisJCQlnb3RvIG5leHQ7CisKKwkJaWYgKCh2YWx1ZSA9IHJ0c3RyY2hyKHRoaXNfY2hhciwgJz0nKSkgIT0gTlVMTCkKKwkJCSp2YWx1ZSsrID0gMDsKKworCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpCisJCXsgLy9SZWFkCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ0aGlzX2NoYXI9JXMsIHZhbHVlPSVzXG4iLCB0aGlzX2NoYXIsIHZhbHVlKSk7CisJCQlpZiAoc3NjYW5mKHRoaXNfY2hhciwgIiVkIiwgJihiYnBJZCkpID09IDEpCisJCQl7CisJCQkJaWYgKGJicElkIDw9IDEzNikKKwkJCQl7CisjaWZkZWYgUkFMSU5LX0FURQorCQkJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCQkJeworCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKKwkJCQkJfQorCQkJCQllbHNlCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCQkJCQl7CisJCQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsICZyZWdCQlApOworCQkJCQl9CisJCQkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlIlMDJkWzB4JTAyWF06JTAyWFxuIiwgYmJwSWQsIGJicElkKjIsIHJlZ0JCUCk7CisgICAgICAgICAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJtc2c9JXNcbiIsIGV4dHJhKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7Ly9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIGJicAorCQkJCQliSXNQcmludEFsbEJCUCA9IFRSVUU7CisJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7IC8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBiYnAKKwkJCQliSXNQcmludEFsbEJCUCA9IFRSVUU7CisJCQkJZ290byBuZXh0OworCQkJfQorCQl9CisJCWVsc2UKKwkJeyAvL1dyaXRlCisJCQlpZiAoKHNzY2FuZih0aGlzX2NoYXIsICIlZCIsICYoYmJwSWQpKSA9PSAxKSAmJiAoc3NjYW5mKHZhbHVlLCAiJXgiLCAmKGJicFZhbHVlKSkgPT0gMSkpCisJCQl7CisJCQkJaWYgKGJicElkIDw9IDEzNikKKwkJCQl7CisjaWZkZWYgUkFMSU5LX0FURQorCQkJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCQkJeworCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgYmJwVmFsdWUpOworCQkJCQkJLy9SZWFkIGl0IGJhY2sgZm9yIHNob3dpbmcKKwkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7CisJCQkJCX0KKwkJCQkJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwkJCQkJeworCQkJCQkgICAgUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsIGJicFZhbHVlKTsKKyAgICAJCQkJCS8vUmVhZCBpdCBiYWNrIGZvciBzaG93aW5nCisgICAgCQkJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKKwkJCX0KKwkJCQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUiUwMmRbMHglMDJYXTolMDJYXG4iLCBiYnBJZCwgYmJwSWQqMiwgcmVnQkJQKTsKKyAgICAgICAgICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIm1zZz0lc1xuIiwgZXh0cmEpKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgYmJwCisJCQkJCWJJc1ByaW50QWxsQkJQID0gVFJVRTsKKwkJCQkJZ290byBuZXh0OworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsgLy9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIGJicAorCQkJCWJJc1ByaW50QWxsQkJQID0gVFJVRTsKKwkJCQlnb3RvIG5leHQ7CisJCQl9CisJCX0KKwkJfQorCWVsc2UKKwkJYklzUHJpbnRBbGxCQlAgPSBUUlVFOworCituZXh0OgorCWlmIChiSXNQcmludEFsbEJCUCkKKwl7CisJCW1lbXNldChleHRyYSwgMHgwMCwgSVdfUFJJVl9TSVpFX01BU0spOworCQlzcHJpbnRmKGV4dHJhLCAiXG4iKTsKKwkJZm9yIChiYnBJZCA9IDA7IGJicElkIDw9IDEzNjsgYmJwSWQrKykKKwkJeworCQkgICAgaWYgKHN0cmxlbihleHRyYSkgPj0gKElXX1BSSVZfU0laRV9NQVNLIC0gMTApKQorICAgICAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFJBTElOS19BVEUKKwkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7CisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7CisJCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSJTAyZFsweCUwMlhdOiUwMlggICAgIiwgYmJwSWQsIGJicElkKjIsIHJlZ0JCUCk7CisJCQlpZiAoYmJwSWQlNSA9PSA0KQorCQkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlxuIik7CisJCX0KKworICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgid3JxLT5sZW5ndGggPSAlZFxuIiwgd3JxLT5sZW5ndGgpKTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT1ydF9wcml2YXRlX2lvY3RsX2JicFxuXG4iKSk7CisKKyAgICByZXR1cm4gU3RhdHVzOworfQorI2VuZGlmIC8vIERCRyAvLworCitpbnQgcnRfaW9jdGxfc2l3cmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworICAgIFBSVE1QX0FEQVBURVIgICBwQWQgPSBkZXYtPm1sX3ByaXY7CisgICAgVUlOVDMyICAgICAgICAgIHJhdGUgPSB3cnF1LT5iaXRyYXRlLnZhbHVlLCBmaXhlZCA9IHdycXUtPmJpdHJhdGUuZml4ZWQ7CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInJ0X2lvY3RsX3Npd3JhdGU6Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydF9pb2N0bF9zaXdyYXRlOjoocmF0ZSA9ICVkLCBmaXhlZCA9ICVkKVxuIiwgcmF0ZSwgZml4ZWQpKTsKKyAgICAvKiByYXRlID0gLTEgPT4gYXV0byByYXRlCisgICAgICAgcmF0ZSA9IFgsIGZpeGVkID0gMSA9PiAoZml4ZWQgcmF0ZSBYKQorICAgICovCisgICAgaWYgKHJhdGUgPT0gLTEpCisgICAgeworCQkvL0F1dG8gUmF0ZQorCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU19BVVRPOworCQlwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IFRSVUU7CisJCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA8PSBQSFlfMTFHKSB8fAorCQkgICAgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSkKKwkJCVJUTVBTZXREZXNpcmVkUmF0ZXMocEFkLCAtMSk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJU2V0Q29tbW9uSFQocEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKGZpeGVkKQorICAgICAgICB7CisgICAgICAgIAlwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IEZBTFNFOworICAgICAgICAgICAgaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlIDw9IFBIWV8xMUcpIHx8CisgICAgICAgICAgICAgICAgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSkKKyAgICAgICAgICAgICAgICBSVE1QU2V0RGVzaXJlZFJhdGVzKHBBZCwgcmF0ZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICAgICAgICAgICAgICBTZXRDb21tb25IVChwQWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnRfaW9jdGxfc2l3cmF0ZTo6KEh0TWNzPSVkKVxuIixwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUykpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVE9ETzogcmF0ZSA9IFgsIGZpeGVkID0gMCA9PiAocmF0ZXMgPD0gWCkKKyAgICAgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3cmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisgICAgUFJUTVBfQURBUFRFUiAgIHBBZCA9IGRldi0+bWxfcHJpdjsKKyAgICBpbnQgcmF0ZV9pbmRleCA9IDAsIHJhdGVfY291bnQgPSAwOworICAgIEhUVFJBTlNNSVRfU0VUVElORyBodF9zZXR0aW5nOworICAgIF9fczMyIHJhbGlua3JhdGVbXSA9CisJezIsICA0LCAgIDExLCAgMjIsIC8vIENDSworCTEyLCAxOCwgICAyNCwgIDM2LCA0OCwgNzIsIDk2LCAxMDgsIC8vIE9GRE0KKwkxMywgMjYsICAgMzksICA1MiwgIDc4LCAxMDQsIDExNywgMTMwLCAyNiwgIDUyLCAgNzgsIDEwNCwgMTU2LCAyMDgsIDIzNCwgMjYwLCAvLyAyME1IeiwgODAwbnMgR0ksIE1DUzogMCB+IDE1CisJMzksIDc4LCAgMTE3LCAxNTYsIDIzNCwgMzEyLCAzNTEsIDM5MCwJCQkJCQkJCQkJICAvLyAyME1IeiwgODAwbnMgR0ksIE1DUzogMTYgfiAyMworCTI3LCA1NCwgICA4MSwgMTA4LCAxNjIsIDIxNiwgMjQzLCAyNzAsIDU0LCAxMDgsIDE2MiwgMjE2LCAzMjQsIDQzMiwgNDg2LCA1NDAsIC8vIDQwTUh6LCA4MDBucyBHSSwgTUNTOiAwIH4gMTUKKwk4MSwgMTYyLCAyNDMsIDMyNCwgNDg2LCA2NDgsIDcyOSwgODEwLAkJCQkJCQkJCQkgIC8vIDQwTUh6LCA4MDBucyBHSSwgTUNTOiAxNiB+IDIzCisJMTQsIDI5LCAgIDQzLCAgNTcsICA4NywgMTE1LCAxMzAsIDE0NCwgMjksIDU5LCAgIDg3LCAxMTUsIDE3MywgMjMwLCAyNjAsIDI4OCwgLy8gMjBNSHosIDQwMG5zIEdJLCBNQ1M6IDAgfiAxNQorCTQzLCA4NywgIDEzMCwgMTczLCAyNjAsIDMxNywgMzkwLCA0MzMsCQkJCQkJCQkJCSAgLy8gMjBNSHosIDQwMG5zIEdJLCBNQ1M6IDE2IH4gMjMKKwkzMCwgNjAsICAgOTAsIDEyMCwgMTgwLCAyNDAsIDI3MCwgMzAwLCA2MCwgMTIwLCAxODAsIDI0MCwgMzYwLCA0ODAsIDU0MCwgNjAwLCAvLyA0ME1IeiwgNDAwbnMgR0ksIE1DUzogMCB+IDE1CisJOTAsIDE4MCwgMjcwLCAzNjAsIDU0MCwgNzIwLCA4MTAsIDkwMH07CQkJCQkJCQkJCSAgLy8gNDBNSHosIDQwMG5zIEdJLCBNQ1M6IDE2IH4gMjMKKworICAgIHJhdGVfY291bnQgPSBzaXplb2YocmFsaW5rcmF0ZSkvc2l6ZW9mKF9fczMyKTsKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKyAgICBpZiAoKHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID09IEZBTFNFKSAmJgorICAgICAgICAoSU5GUkFfT04ocEFkKSkgJiYKKyAgICAgICAgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlIDw9IFBIWV8xMUcpIHx8IChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFIDw9IE1PREVfT0ZETSkpKQorICAgICAgICBodF9zZXR0aW5nLndvcmQgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUud29yZDsKKyAgICBlbHNlCisgICAgICAgIGh0X3NldHRpbmcud29yZCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQ7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICBpZiAoaHRfc2V0dGluZy5maWVsZC5NT0RFID49IE1PREVfSFRNSVgpCisgICAgeworICAgIAlyYXRlX2luZGV4ID0gMTIgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuQlcgKjI0KSArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5TaG9ydEdJICo0OCkgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuTUNTKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworICAgIGlmIChodF9zZXR0aW5nLmZpZWxkLk1PREUgPT0gTU9ERV9PRkRNKQorICAgIAlyYXRlX2luZGV4ID0gKFVDSEFSKShodF9zZXR0aW5nLmZpZWxkLk1DUykgKyA0OworICAgIGVsc2UgaWYgKGh0X3NldHRpbmcuZmllbGQuTU9ERSA9PSBNT0RFX0NDSykKKyAgICAJcmF0ZV9pbmRleCA9IChVQ0hBUikoaHRfc2V0dGluZy5maWVsZC5NQ1MpOworCisgICAgaWYgKHJhdGVfaW5kZXggPCAwKQorICAgICAgICByYXRlX2luZGV4ID0gMDsKKworICAgIGlmIChyYXRlX2luZGV4ID4gcmF0ZV9jb3VudCkKKyAgICAgICAgcmF0ZV9pbmRleCA9IHJhdGVfY291bnQ7CisKKyAgICB3cnF1LT5iaXRyYXRlLnZhbHVlID0gcmFsaW5rcmF0ZVtyYXRlX2luZGV4XSAqIDUwMDAwMDsKKyAgICB3cnF1LT5iaXRyYXRlLmRpc2FibGVkID0gMDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlciBydF9oYW5kbGVyW10gPQoreworCShpd19oYW5kbGVyKSBOVUxMLAkJCSAgICAgICAgICAgIC8qIFNJT0NTSVdDT01NSVQgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3bmFtZSwJCQkvKiBTSU9DR0lXTkFNRSAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJICAgICAgICAgICAgLyogU0lPQ1NJV05XSUQgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCSAgICAgICAgICAgIC8qIFNJT0NHSVdOV0lEICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZnJlcSwJCSAgICAvKiBTSU9DU0lXRlJFUSAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2ZyZXEsCQkgICAgLyogU0lPQ0dJV0ZSRVEgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdtb2RlLAkJICAgIC8qIFNJT0NTSVdNT0RFICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3bW9kZSwJCSAgICAvKiBTSU9DR0lXTU9ERSAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1NFTlMgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdTRU5TICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCAvKiBub3QgdXNlZCAqLywJCS8qIFNJT0NTSVdSQU5HRSAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3cmFuZ2UsCQkgICAgLyogU0lPQ0dJV1JBTkdFICAqLworCShpd19oYW5kbGVyKSBOVUxMIC8qIG5vdCB1c2VkICovLAkJLyogU0lPQ1NJV1BSSVYgICAqLworCShpd19oYW5kbGVyKSBOVUxMIC8qIGtlcm5lbCBjb2RlICovLCAgICAvKiBTSU9DR0lXUFJJViAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwgLyogbm90IHVzZWQgKi8sCQkvKiBTSU9DU0lXU1RBVFMgICovCisJKGl3X2hhbmRsZXIpIHJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMgLyoga2VybmVsIGNvZGUgKi8sICAgIC8qIFNJT0NHSVdTVEFUUyAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DU0lXU1BZICAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1NQWSAgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIFNJT0NTSVdUSFJTUFkgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiBTSU9DR0lXVEhSU1BZICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2FwLCAgICAgICAgICAgIC8qIFNJT0NTSVdBUCAgICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3YXAsCQkgICAgLyogU0lPQ0dJV0FQICAgICAqLworI2lmZGVmIFNJT0NTSVdNTE1FCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd21sbWUsCSAgICAgICAgLyogU0lPQ1NJV01MTUUgICAqLworI2Vsc2UKKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiBTSU9DU0lXTUxNRSAqLworI2VuZGlmIC8vIFNJT0NTSVdNTE1FIC8vCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2l3YXBsaXN0LAkJICAgIC8qIFNJT0NHSVdBUExJU1QgKi8KKyNpZmRlZiBTSU9DR0lXU0NBTgorCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdzY2FuLAkJICAgIC8qIFNJT0NTSVdTQ0FOICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3c2NhbiwJCSAgICAvKiBTSU9DR0lXU0NBTiAgICovCisjZWxzZQorCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIFNJT0NTSVdTQ0FOICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiBTSU9DR0lXU0NBTiAgICovCisjZW5kaWYgLyogU0lPQ0dJV1NDQU4gKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZXNzaWQsCQkgICAgLyogU0lPQ1NJV0VTU0lEICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdlc3NpZCwJCSAgICAvKiBTSU9DR0lXRVNTSUQgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd25pY2tuLAkJICAgIC8qIFNJT0NTSVdOSUNLTiAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3bmlja24sCQkgICAgLyogU0lPQ0dJV05JQ0tOICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIC0tIGhvbGUgLS0gICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiAtLSBob2xlIC0tICAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd3JhdGUsICAgICAgICAgIC8qIFNJT0NTSVdSQVRFICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3cmF0ZSwgICAgICAgICAgLyogU0lPQ0dJV1JBVEUgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdydHMsCQkgICAgLyogU0lPQ1NJV1JUUyAgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdydHMsCQkgICAgLyogU0lPQ0dJV1JUUyAgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdmcmFnLAkJICAgIC8qIFNJT0NTSVdGUkFHICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZnJhZywJCSAgICAvKiBTSU9DR0lXRlJBRyAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1RYUE9XICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdUWFBPVyAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DU0lXUkVUUlkgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1JFVFJZICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdlbmNvZGUsCQkvKiBTSU9DU0lXRU5DT0RFICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2VuY29kZSwJCS8qIFNJT0NHSVdFTkNPREUgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DU0lXUE9XRVIgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1BPV0VSICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkJCS8qIC0tIGhvbGUgLS0gKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJCQkvKiAtLSBob2xlIC0tICovCisjaWYgV0lSRUxFU1NfRVhUID4gMTcKKyAgICAoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3Z2VuaWUsICAgICAgICAgLyogU0lPQ1NJV0dFTklFICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdnZW5pZSwgICAgICAgICAvKiBTSU9DR0lXR0VOSUUgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2F1dGgsCQkgICAgLyogU0lPQ1NJV0FVVEggICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdhdXRoLAkJICAgIC8qIFNJT0NHSVdBVVRIICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZW5jb2RlZXh0LAkgICAgLyogU0lPQ1NJV0VOQ09ERUVYVCAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdlbmNvZGVleHQsCQkvKiBTSU9DR0lXRU5DT0RFRVhUICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd3Bta3NhLCAgICAgICAgIC8qIFNJT0NTSVdQTUtTQSAgKi8KKyNlbmRpZgorfTsKKworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIgcnRfcHJpdl9oYW5kbGVyc1tdID0geworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDAxICovCisjaWZuZGVmIENPTkZJR19BUF9TVVBQT1JUCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3NldHBhcmFtLCAvKiArIDB4MDIgKi8KKyNlbHNlCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwMiAqLworI2VuZGlmIC8vIENPTkZJR19BUF9TVVBQT1JUIC8vCisjaWZkZWYgREJHCisJKGl3X2hhbmRsZXIpIHJ0X3ByaXZhdGVfaW9jdGxfYmJwLCAvKiArIDB4MDMgKi8KKyNlbHNlCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwMyAqLworI2VuZGlmCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwNCAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDUgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDA2ICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwNyAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDggKi8KKwkoaXdfaGFuZGxlcikgcnRfcHJpdmF0ZV9nZXRfc3RhdGlzdGljcywgLyogKyAweDA5ICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwQSAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEIgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBDICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwRCAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEUgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBGICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxMCAqLworCShpd19oYW5kbGVyKSBydF9wcml2YXRlX3Nob3csIC8qICsgMHgxMSAqLworICAgIChpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTIgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDEzICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxNSAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTcgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDE4ICovCit9OworCitjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgcnQyOHh4X2l3X2hhbmRsZXJfZGVmID0KK3sKKyNkZWZpbmUJTihhKQkoc2l6ZW9mIChhKSAvIHNpemVvZiAoYVswXSkpCisJLnN0YW5kYXJkCT0gKGl3X2hhbmRsZXIgKikgcnRfaGFuZGxlciwKKwkubnVtX3N0YW5kYXJkCT0gc2l6ZW9mKHJ0X2hhbmRsZXIpIC8gc2l6ZW9mKGl3X2hhbmRsZXIpLAorCS5wcml2YXRlCT0gKGl3X2hhbmRsZXIgKikgcnRfcHJpdl9oYW5kbGVycywKKwkubnVtX3ByaXZhdGUJCT0gTihydF9wcml2X2hhbmRsZXJzKSwKKwkucHJpdmF0ZV9hcmdzCT0gKHN0cnVjdCBpd19wcml2X2FyZ3MgKikgcHJpdnRhYiwKKwkubnVtX3ByaXZhdGVfYXJncwk9IE4ocHJpdnRhYiksCisjaWYgSVdfSEFORExFUl9WRVJTSU9OID49IDcKKyAgICAuZ2V0X3dpcmVsZXNzX3N0YXRzID0gcnQyOHh4X2dldF93aXJlbGVzc19zdGF0cywKKyNlbmRpZgorfTsKKworSU5UIFJUTVBTZXRJbmZvcm1hdGlvbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiBwQWRhcHRlciwKKyAgICBJTiAgT1VUIHN0cnVjdCBpZnJlcSAgICAqcnEsCisgICAgSU4gIElOVCAgICAgICAgICAgICAgICAgY21kKQoreworICAgIHN0cnVjdCBpd3JlcSAgICAgICAgICAgICAgICAgICAgICAgICp3cnEgPSAoc3RydWN0IGl3cmVxICopIHJxOworICAgIE5ESVNfODAyXzExX1NTSUQgICAgICAgICAgICAgICAgICAgIFNzaWQ7CisgICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgICAgICAgICAgICAgQnNzaWQ7CisgICAgUlRfODAyXzExX1BIWV9NT0RFICAgICAgICAgICAgICAgICAgUGh5TW9kZTsKKyAgICBSVF84MDJfMTFfU1RBX0NPTkZJRyAgICAgICAgICAgICAgICBTdGFDb25maWc7CisgICAgTkRJU184MDJfMTFfUkFURVMgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXM7CisgICAgUlRfODAyXzExX1BSRUFNQkxFICAgICAgICAgICAgICAgICAgUHJlYW1ibGU7CisgICAgTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgV2VwU3RhdHVzOworICAgIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgICAgIEF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlTWF4OworICAgIE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgIEJzc1R5cGU7CisgICAgTkRJU184MDJfMTFfUlRTX1RIUkVTSE9MRCAgICAgICAgICAgUnRzVGhyZXNoOworICAgIE5ESVNfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEIEZyYWdUaHJlc2g7CisgICAgTkRJU184MDJfMTFfUE9XRVJfTU9ERSAgICAgICAgICAgICAgUG93ZXJNb2RlOworICAgIFBORElTXzgwMl8xMV9LRVkgICAgICAgICAgICAgICAgICAgIHBLZXkgPSBOVUxMOworICAgIFBORElTXzgwMl8xMV9XRVAJCQkgICAgICAgIHBXZXBLZXkgPU5VTEw7CisgICAgUE5ESVNfODAyXzExX1JFTU9WRV9LRVkgICAgICAgICAgICAgcFJlbW92ZUtleSA9IE5VTEw7CisgICAgTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiAgICAgICAgICAgQ29uZmlnLCAqcENvbmZpZyA9IE5VTEw7CisgICAgTkRJU184MDJfMTFfTkVUV09SS19UWVBFICAgICAgICAgICAgTmV0VHlwZTsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3c7CisgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5SWR4ID0gMDsKKyAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTLCBNYXhQaHlNb2RlID0gUEhZXzExRzsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3dlclRlbXA7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFkaW9TdGF0ZTsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZU1hY2hpbmVUb3VjaGVkID0gRkFMU0U7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJT0lEX1NFVF9IVF9QSFlNT0RFCQkJCQlIVF9QaHlNb2RlOwkvLzExbiAsa2F0aHkKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgUE5ESVNfODAyXzExX1BNS0lEICAgICAgICAgICAgICAgICAgcFBta0lkID0gTlVMTDsKKyAgICBCT09MRUFOCQkJCSAgICAgICAgICAgICAgICBJRUVFODAyMXhTdGF0ZSA9IEZBTFNFOworICAgIEJPT0xFQU4JCQkJICAgICAgICAgICAgICAgIElFRUU4MDIxeF9yZXF1aXJlZF9rZXlzID0gRkFMU0U7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3BhX3N1cHBsaWNhbnRfZW5hYmxlID0gMDsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBTTk1QX1NVUFBPUlQKKwlUWF9SVFlfQ0ZHX1NUUlVDCQkJdHhfcnR5X2NmZzsKKwlVTE9ORwkJCQkJCVNob3J0UmV0cnlMaW1pdCwgTG9uZ1JldHJ5TGltaXQ7CisJVUNIQVIJCQkJCQljdG1wOworI2VuZGlmIC8vIFNOTVBfU1VQUE9SVCAvLworCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlNYXhQaHlNb2RlID0gUEhZXzExTl81RzsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+UlRNUFNldEluZm9ybWF0aW9uKCksCTB4JTA4eFxuIiwgY21kJjB4N0ZGRikpOworICAgIHN3aXRjaChjbWQgJiAweDdGRkYpIHsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX0NPVU5UUllfUkVHSU9OOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCA8IHNpemVvZihVQ0hBUikpCisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKKwkJCS8vIE9ubHkgYXZhbGlhYmxlIHdoZW4gRUVQUk9NIG5vdCBwcm9ncmFtbWluZworICAgICAgICAgICAgZWxzZSBpZiAoIShwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gJiAweDgwKSAmJiAhKHBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kICYgMHg4MCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVUxPTkcgICBDb3VudHJ5OworICAgICAgICAgICAgICAgIFVDSEFSCVRtcFBoeTsKKworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZDb3VudHJ5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiA9IChVQ0hBUikoQ291bnRyeSAmIDB4MDAwMDAwRkYpOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kID0gKFVDSEFSKSgoQ291bnRyeSA+PiA4KSAmIDB4MDAwMDAwRkYpOworICAgICAgICAgICAgICAgIFRtcFBoeSA9IHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSAweGZmOworCQkJCS8vIEJ1aWxkIGFsbCBjb3JyZXNwb25kaW5nIGNoYW5uZWwgaW5mb3JtYXRpb24KKwkJCQlSVE1QU2V0UGh5TW9kZShwQWRhcHRlciwgVG1wUGh5KTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQlTZXRDb21tb25IVChwQWRhcHRlcik7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX0NPVU5UUllfUkVHSU9OIChBOiVkICBCL0c6JWQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCwKKwkJCQkgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTjoKKyAjaWZkZWYgUkFMSU5LX0FURQorCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVGhlIGRyaXZlciBpcyBpbiBBVEUgbW9kZSBub3dcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisgICAgICAgICAgICBOb3cgPSBqaWZmaWVzOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTiwgVHhDbnQgPSAlZCBcbiIsIHBBZGFwdGVyLT5SYWxpbmtDb3VudGVycy5MYXN0T25lU2VjVG90YWxUeENvdW50KSk7CisKKyAgICAgICAgICAgIGlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgRHJpdmVyIGlzIGluIE1vbml0b3IgTW9kZSBub3cgISEhXG4iKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKwkJCS8vQmVuc29uIGFkZCAyMDA4MDUyNywgd2hlbiByYWRpbyBvZmYsIHN0YSBkb24ndCBuZWVkIHRvIHNjYW4KKwkJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpKQorCQkJCWJyZWFrOworCisJCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorCQkJeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBEcml2ZXIgaXMgc2Nhbm5pbmcgbm93ICEhIVxuIikpOworCQkJCXBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IFRSVUU7CisJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworCQkJaWYgKHBBZGFwdGVyLT5SYWxpbmtDb3VudGVycy5MYXN0T25lU2VjVG90YWxUeENvdW50ID4gMTAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMaW5rIFVQLCBpZ25vcmUgdGhpcyBzZXQ6Ok9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOXG4iKSk7CisJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLlNjYW5DbnQgPSA5OTsJCS8vIFByZXZlbnQgYXV0byBzY2FuIHRyaWdnZXJlZCBieSB0aGlzIE9JRAorCQkJCWJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKSAmJgorCQkJCSgocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8CisJCQkJKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAorCQkJCShwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8CisJCQkJKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpICYmCisgICAgICAgICAgICAgICAgKHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTGluayBVUCwgUG9ydCBOb3QgU2VjdXJlZCEgaWdub3JlIHRoaXMgc2V0OjpPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTlxuIikpOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCQkJcEFkYXB0ZXItPlN0YUNmZy5TY2FuQ250ID0gOTk7CQkvLyBQcmV2ZW50IGF1dG8gc2NhbiB0cmlnZ2VyZWQgYnkgdGhpcyBPSUQKKwkJCQlicmVhazsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRSBidXN5LCByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHRlbGwgQ05UTCBzdGF0ZSBtYWNoaW5lIHRvIGNhbGwgTmRpc01TZXRJbmZvcm1hdGlvbkNvbXBsZXRlKCkgYWZ0ZXIgY29tcGxldGluZworICAgICAgICAgICAgLy8gdGhpcyByZXF1ZXN0LCBiZWNhdXNlIHRoaXMgcmVxdWVzdCBpcyBpbml0aWF0ZWQgYnkgTkRJUy4KKyAgICAgICAgICAgIHBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gRkFMU0U7CisgICAgICAgICAgICAvLyBSZXNldCBhbGxvd2VkIHNjYW4gcmV0cmllcworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5TY2FuQ250ID0gMDsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gTm93OworCisJCQlwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBUUlVFOworICAgICAgICAgICAgUlRNUF9TRVRfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUyk7CisgICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgICAgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgICBTdGF0ZU1hY2hpbmVUb3VjaGVkID0gVFJVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfU1NJRDoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX1NTSUQpKQorICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJUENIQVIgcFNzaWRTdHJpbmcgPSBOVUxMOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZTc2lkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1NTSUQgKExlbj0lZCxTc2lkPSVzKVxuIiwgU3NpZC5Tc2lkTGVuZ3RoLCBTc2lkLlNzaWQpKTsKKyAgICAgICAgICAgICAgICBpZiAoU3NpZC5Tc2lkTGVuZ3RoID4gTUFYX0xFTl9PRl9TU0lEKQorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgCWlmIChTc2lkLlNzaWRMZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgIAkJU2V0X1NTSURfUHJvYyhwQWRhcHRlciwgIiIpOworICAgICAgICAgICAgICAgIAl9CisJCQkJCWVsc2UKKyAgICAgICAgICAgICAgICAJeworCSAgICAgICAgICAgICAgICAJcFNzaWRTdHJpbmcgPSAoQ0hBUiAqKSBrbWFsbG9jKE1BWF9MRU5fT0ZfU1NJRCsxLCBNRU1fQUxMT0NfRkxBRyk7CisJCQkJCQlpZiAocFNzaWRTdHJpbmcpCisJCQkJCQl7CisJCQkJCQkJTmRpc1plcm9NZW1vcnkocFNzaWRTdHJpbmcsIE1BWF9MRU5fT0ZfU1NJRCsxKTsKKwkJCQkJCQlOZGlzTW92ZU1lbW9yeShwU3NpZFN0cmluZywgU3NpZC5Tc2lkLCBTc2lkLlNzaWRMZW5ndGgpOworCSAgICAgICAgICAgICAgICAJCVNldF9TU0lEX1Byb2MocEFkYXB0ZXIsIHBTc2lkU3RyaW5nKTsKKwkJCQkJCQlrZnJlZShwU3NpZFN0cmluZyk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQkJU3RhdHVzID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQlNTSUQ6CisjaWZkZWYgUkFMSU5LX0FURQorCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVGhlIGRyaXZlciBpcyBpbiBBVEUgbW9kZSBub3dcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9NQUNfQUREUkVTUykpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkJzc2lkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisgICAgICAgICAgICAgICAgLy8gdGVsbCBDTlRMIHN0YXRlIG1hY2hpbmUgdG8gY2FsbCBOZGlzTVNldEluZm9ybWF0aW9uQ29tcGxldGUoKSBhZnRlciBjb21wbGV0aW5nCisgICAgICAgICAgICAgICAgLy8gdGhpcyByZXF1ZXN0LCBiZWNhdXNlIHRoaXMgcmVxdWVzdCBpcyBpbml0aWF0ZWQgYnkgTkRJUy4KKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IEZBTFNFOworCisJCQkJLy8gUHJldmVudCB0byBjb25uZWN0IEFQIGFnYWluIGluIFNUQU1sbWVQZXJpb2RpY0V4ZWMKKwkJCQlwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7CisKKyAgICAgICAgICAgICAgICAvLyBSZXNldCBhbGxvd2VkIHNjYW4gcmV0cmllcworCQkJCXBBZGFwdGVyLT5TdGFDZmcuU2NhbkNudCA9IDA7CisKKyAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRSBidXN5LCByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIE1sbWVFbnF1ZXVlKHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9JRF84MDJfMTFfQlNTSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE5ESVNfODAyXzExX01BQ19BRERSRVNTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVk9JRCAqKSZCc3NpZCk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICBTdGF0ZU1hY2hpbmVUb3VjaGVkID0gVFJVRTsKKworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9CU1NJRCAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCc3NpZFswXSwgQnNzaWRbMV0sIEJzc2lkWzJdLCBCc3NpZFszXSwgQnNzaWRbNF0sIEJzc2lkWzVdKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1JBRElPOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoQk9PTEVBTikpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlJhZGlvU3RhdGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1JBRElPICg9JWQpXG4iLCBSYWRpb1N0YXRlKSk7CisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYlN3UmFkaW8gIT0gUmFkaW9TdGF0ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYlN3UmFkaW8gPSBSYWRpb1N0YXRlOworICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iUmFkaW8gIT0gKHBBZGFwdGVyLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkYXB0ZXItPlN0YUNmZy5iU3dSYWRpbykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYlJhZGlvID0gKHBBZGFwdGVyLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkYXB0ZXItPlN0YUNmZy5iU3dSYWRpbyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iUmFkaW8gPT0gVFJVRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNbG1lUmFkaW9PbihwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uCisJCQkJCQkJcEFkYXB0ZXItPkV4dHJhSW5mbyA9IEVYVFJBX0lORk9fQ0xFQVI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWxtZVJhZGlvT2ZmKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KKwkJCQkJCQlwQWRhcHRlci0+RXh0cmFJbmZvID0gU1dfUkFESU9fT0ZGOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9QSFlfTU9ERToKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFJUXzgwMl8xMV9QSFlfTU9ERSkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlBoeU1vZGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJaWYgKFBoeU1vZGUgPD0gTWF4UGh5TW9kZSkKKwkJCQl7CisgICAgICAgICAgICAgICAgCVJUTVBTZXRQaHlNb2RlKHBBZGFwdGVyLCBQaHlNb2RlKTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQkJU2V0Q29tbW9uSFQocEFkYXB0ZXIpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCX0KKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfUEhZX01PREUgKD0lZClcbiIsIFBoeU1vZGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfU1RBX0NPTkZJRzoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFJUXzgwMl8xMV9TVEFfQ09ORklHKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmU3RhQ29uZmlnLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBTdGFDb25maWcuRW5hYmxlVHhCdXJzdDsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9IFN0YUNvbmZpZy5Vc2VCR1Byb3RlY3Rpb247CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSA9IDE7IC8vIDIwMDMtMTAtMzAgYWx3YXlzIFNIT1JUIFNMT1QgY2FwYWJsZQorICAgICAgICAgICAgICAgIGlmICgocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlICE9IFN0YUNvbmZpZy5BZGhvY01vZGUpICYmCisJCQkJCShTdGFDb25maWcuQWRob2NNb2RlIDw9IE1heFBoeU1vZGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgZHluYW1pYyBjaGFuZ2Ugb2YgIlVTRSBPRkRNIHJhdGUgb3Igbm90IiBpbiBBREhPQyBtb2RlCisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHNldHRpbmcgY2hhbmdlZCwgbmVlZCB0byByZXNldCBjdXJyZW50IFRYIHJhdGUgYXMgd2VsbCBhcyBCRUFDT04gZnJhbWUgZm9ybWF0CisgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKQorICAgICAgICAgICAgICAgICAgICB7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSBTdGFDb25maWcuQWRob2NNb2RlOworICAgICAgICAgICAgICAgICAgICAJUlRNUFNldFBoeU1vZGUocEFkYXB0ZXIsIFBoeU1vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgTWxtZVVwZGF0ZVR4UmF0ZXMocEFkYXB0ZXIsIEZBTFNFLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ha2VJYnNzQmVhY29uKHBBZGFwdGVyKTsgICAgICAgICAgIC8vIHJlLWJ1aWxkIEJFQUNPTiBmcmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgQXNpY0VuYWJsZUlic3NTeW5jKHBBZGFwdGVyKTsgICAvLyBjb3B5IHRvIG9uLWNoaXAgbWVtb3J5CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9TVEFfQ09ORklHIChCdXJzdD0lZCwgUHJvdGVjdGlvbj0lbGQsU2hvcnRTbG90PSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfUkFURVMpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZhcnlSYXRlcywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGUsICZhcnlSYXRlcywgc2l6ZW9mKE5ESVNfODAyXzExX1JBVEVTKSk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0RFU0lSRURfUkFURVMgKCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeClcbiIsCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVswXSxwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMV0sCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsyXSxwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbM10sCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs0XSxwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNV0sCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs2XSxwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbN10gKSk7CisgICAgICAgICAgICAgICAgLy8gQ2hhbmdpbmcgRGVzaXJlZFJhdGUgbWF5IGFmZmVjdCB0aGUgTUFYIFRYIHJhdGUgd2UgdXNlZCB0byBUWCBmcmFtZXMgb3V0CisgICAgICAgICAgICAgICAgTWxtZVVwZGF0ZVR4UmF0ZXMocEFkYXB0ZXIsIEZBTFNFLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUFJFQU1CTEU6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihSVF84MDJfMTFfUFJFQU1CTEUpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZQcmVhbWJsZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoUHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZVNob3J0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUHJlYW1ibGU7CisgICAgICAgICAgICAgICAgICAgIE1sbWVTZXRUeFByZWFtYmxlKHBBZGFwdGVyLCBSdDgwMl8xMVByZWFtYmxlU2hvcnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICgoUHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZUxvbmcpIHx8IChQcmVhbWJsZSA9PSBSdDgwMl8xMVByZWFtYmxlQXV0bykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBpZiB1c2VyIHdhbnRzIEFVVE8sIGluaXRpYWxpemUgdG8gTE9ORyBoZXJlLCB0aGVuIGNoYW5nZSBhY2NvcmRpbmcgdG8gQVAncworICAgICAgICAgICAgICAgICAgICAvLyBjYXBhYmlsaXR5IHVwb24gYXNzb2NpYXRpb24uCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFByZWFtYmxlOworICAgICAgICAgICAgICAgICAgICBNbG1lU2V0VHhQcmVhbWJsZShwQWRhcHRlciwgUnQ4MDJfMTFQcmVhbWJsZUxvbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1BSRUFNQkxFICg9JWQpXG4iLCBQcmVhbWJsZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9XRVBfU1RBVFVTOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfV0VQX1NUQVRVUykpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJldlcFN0YXR1cywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAvLyBTaW5jZSBUS0lQLCBBRVMsIFdFUCBhcmUgYWxsIHN1cHBvcnRlZC4gSXQgc2hvdWxkIG5vdCBoYXZlIGFueSBpbnZhbGlkIHNldHRpbmcKKyAgICAgICAgICAgICAgICBpZiAoV2VwU3RhdHVzIDw9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0tleUFic2VudCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBXZXBTdGF0dXMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbmZpZyBoYXMgY2hhbmdlZAorICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgICAgPSBXZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IFdlcFN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyICAgID0gV2VwU3RhdHVzOworICAgICAgICAgICAgICAgIAlwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICAgPSBXZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1dFUF9TVEFUVVMgKD0lZClcbiIsV2VwU3RhdHVzKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREU6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmQXV0aE1vZGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKEF1dGhNb2RlID4gTmRpczgwMl8xMUF1dGhNb2RlTWF4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBBdXRoTW9kZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uZmlnIGhhcyBjaGFuZ2VkCisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBBdXRoTW9kZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSAoPSVkKSBcbiIscEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkJzc1R5cGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwkJCQlpZiAoQnNzVHlwZSA9PSBOZGlzODAyXzExSUJTUykKKwkJCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJBZGhvYyIpOworCQkJCWVsc2UgaWYgKEJzc1R5cGUgPT0gTmRpczgwMl8xMUluZnJhc3RydWN0dXJlKQorCQkJCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWRhcHRlciwgIkluZnJhIik7CisJCQkJZWxzZSBpZiAoQnNzVHlwZSA9PSBOZGlzODAyXzExTW9uaXRvcikKKwkJCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJNb25pdG9yIik7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJU3RhdHVzICA9IC1FSU5WQUw7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFICh1bmtub3duKVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCSBjYXNlIE9JRF84MDJfMTFfUkVNT1ZFX1dFUDoKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfV0VQXG4iKSk7CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9LRVlfSU5ERVgpKQorICAgICAgICAgICAgeworCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisJCQkJS2V5SWR4ID0gKihORElTXzgwMl8xMV9LRVlfSU5ERVggKikgd3JxLT51LmRhdGEucG9pbnRlcjsKKworCQkJCWlmIChLZXlJZHggJiAweDgwMDAwMDAwKQorCQkJCXsKKwkJCQkJLy8gU2hvdWxkIG5ldmVyIHNldCBkZWZhdWx0IGJpdCB3aGVuIHJlbW92ZSBrZXkKKwkJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJS2V5SWR4ID0gS2V5SWR4ICYgMHgwZmZmZmZmZjsKKwkJCQkJaWYgKEtleUlkeCA+PSA0KXsKKwkJCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID0gMDsKKwkJCQkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJCQkJCUFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwgMCwgKFVDSEFSKUtleUlkeCk7CisJCQkJCX0KKwkJCQl9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1JFU0VUX0NPVU5URVJTOgorICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkoJnBBZGFwdGVyLT5XbGFuQ291bnRlcnMsIHNpemVvZihDT1VOVEVSXzgwMl8xMSkpOworICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkoJnBBZGFwdGVyLT5Db3VudGVyczgwMjMsIHNpemVvZihDT1VOVEVSXzgwMl8zKSk7CisgICAgICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPlJhbGlua0NvdW50ZXJzLCBzaXplb2YoQ09VTlRFUl9SQUxJTkspKTsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlciAgID0gMDsKKwkJCXBBZGFwdGVyLT5Db3VudGVyczgwMjMuR29vZFJlY2VpdmVzID0gMDsKKwkJCXBBZGFwdGVyLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlciAgID0gMDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9SRVNFVF9DT1VOVEVSUyBcbiIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX1JUU19USFJFU0hPTEQpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZSdHNUaHJlc2gsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKFJ0c1RocmVzaCA+IE1BWF9SVFNfVEhSRVNIT0xEKQorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUnRzVGhyZXNob2xkID0gKFVTSE9SVClSdHNUaHJlc2g7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRCAoPSVsZClcbiIsUnRzVGhyZXNoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZGcmFnVGhyZXNoLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9IEZBTFNFOworICAgICAgICAgICAgICAgIGlmIChGcmFnVGhyZXNoID4gTUFYX0ZSQUdfVEhSRVNIT0xEIHx8IEZyYWdUaHJlc2ggPCBNSU5fRlJBR19USFJFU0hPTEQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoRnJhZ1RocmVzaCA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gTUFYX0ZSQUdfVEhSRVNIT0xEOworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gKFVTSE9SVClGcmFnVGhyZXNoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEICg9JWxkKSBcbiIsRnJhZ1RocmVzaCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9QT1dFUl9NT0RFOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfUE9XRVJfTU9ERSkpCisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUG93ZXJNb2RlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChQb3dlck1vZGUgPT0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTSkKKyAgICAgICAgICAgICAgICAJU2V0X1BTTW9kZV9Qcm9jKHBBZGFwdGVyLCAiQ0FNIik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoUG93ZXJNb2RlID09IE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQKQorICAgICAgICAgICAgICAgIAlTZXRfUFNNb2RlX1Byb2MocEFkYXB0ZXIsICJNYXhfUFNQIik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoUG93ZXJNb2RlID09IE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUCkKKwkJCQkJU2V0X1BTTW9kZV9Qcm9jKHBBZGFwdGVyLCAiRmFzdF9QU1AiKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChQb3dlck1vZGUgPT0gTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1ApCisJCQkJCVNldF9QU01vZGVfUHJvYyhwQWRhcHRlciwgIkxlZ2FjeV9QU1AiKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUE9XRVJfTU9ERSAoPSVkKVxuIixQb3dlck1vZGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMXzE6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICA8IHNpemVvZihVTE9ORykpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUG93ZXJUZW1wLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCWlmIChQb3dlclRlbXAgPiAxMDApCisJCQkJCVBvd2VyVGVtcCA9IDB4ZmZmZmZmZmY7ICAvLyBBVVRPCisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdCA9IFBvd2VyVGVtcDsgLy9rZWVwIGN1cnJlbnQgc2V0dGluZy4KKwkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQ7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMXzEgKD0lbGQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlKSk7CisJCQl9CisJICAgICAgICBicmVhazsKKwkJY2FzZSBPSURfODAyXzExX05FVFdPUktfVFlQRV9JTl9VU0U6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJk5ldFR5cGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwkJCQlpZiAoTmV0VHlwZSA9PSBOZGlzODAyXzExRFMpCisJCQkJCVJUTVBTZXRQaHlNb2RlKHBBZGFwdGVyLCBQSFlfMTFCKTsKKwkJCQllbHNlIGlmIChOZXRUeXBlID09IE5kaXM4MDJfMTFPRkRNMjQpCisJCQkJCVJUTVBTZXRQaHlNb2RlKHBBZGFwdGVyLCBQSFlfMTFCR19NSVhFRCk7CisJCQkJZWxzZSBpZiAoTmV0VHlwZSA9PSBOZGlzODAyXzExT0ZETTUpCisJCQkJCVJUTVBTZXRQaHlNb2RlKHBBZGFwdGVyLCBQSFlfMTFBKTsKKwkJCQllbHNlCisJCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJaWYgKFN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCQlTZXRDb21tb25IVChwQWRhcHRlcik7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX05FVFdPUktfVFlQRV9JTl9VU0UgKD0lZClcbiIsTmV0VHlwZSkpOworCQkgICAgfQorCQkJYnJlYWs7CisgICAgICAgIC8vIEZvciBXUEEgUFNLIFBNSyBrZXkKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX0FERF9XUEE6CisgICAgICAgICAgICBwS2V5ID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmKHBLZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwS2V5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgaWYgKHBLZXktPkxlbmd0aCAhPSB3cnEtPnUuZGF0YS5sZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX0FERF9XUEEsIEZhaWxlZCEhXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgJiYKKwkJCQkgICAgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgJiYKKwkJCQkgICAgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVPUE5PVFNVUFA7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9BRERfV1BBLCBGYWlsZWQhISBbQXV0aE1vZGUgIT0gV1BBUFNLL1dQQTJQU0svV1BBTk9ORV1cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAorCQkJCQkJIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spIHx8CisJCQkJCQkgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkgKSAgICAgLy8gT25seSBmb3IgV1BBIFBTSyBtb2RlCisJCQkJeworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLlBNSywgJnBLZXktPktleU1hdGVyaWFsLCBwS2V5LT5LZXlMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAvLyBVc2UgUmFDb25maWcgYXMgUFNLIGFnZW50LgorICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCBTVEEgc3VwcGxpY2FudCBzdGF0ZSBtYWNoaW5lCisgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfU1RBUlQ7CisKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX0FERF9XUEEgKGlkPTB4JXgsIExlbj0lZC1ieXRlKVxuIiwgcEtleS0+S2V5SW5kZXgsIHBLZXktPktleUxlbmd0aCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfQUREX1dQQSAoaWQ9MHgleCwgTGVuPSVkLWJ5dGUpXG4iLCBwS2V5LT5LZXlJbmRleCwgcEtleS0+S2V5TGVuZ3RoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAga2ZyZWUocEtleSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1JFTU9WRV9LRVk6CisgICAgICAgICAgICBwUmVtb3ZlS2V5ID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmKHBSZW1vdmVLZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwUmVtb3ZlS2V5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgaWYgKHBSZW1vdmVLZXktPkxlbmd0aCAhPSB3cnEtPnUuZGF0YS5sZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9LRVksIEZhaWxlZCEhXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUlRNUFdQQVJlbW92ZUtleVByb2MocEFkYXB0ZXIsIHBSZW1vdmVLZXkpOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUkVNT1ZFX0tFWSwgUmVtb3ZlIFdQQSBLZXkhIVxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBLZXlJZHggPSBwUmVtb3ZlS2V5LT5LZXlJbmRleDsKKworICAgICAgICAgICAgICAgICAgICBpZiAoS2V5SWR4ICYgMHg4MDAwMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2hvdWxkIG5ldmVyIHNldCBkZWZhdWx0IGJpdCB3aGVuIHJlbW92ZSBrZXkKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9LRVksIEZhaWxlZCEhKFNob3VsZCBuZXZlciBzZXQgZGVmYXVsdCBiaXQgd2hlbiByZW1vdmUga2V5KVxuIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgS2V5SWR4ID0gS2V5SWR4ICYgMHgwZmZmZmZmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChLZXlJZHggPiAzKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfS0VZLCBGYWlsZWQhIShLZXlJZFslZF0gb3V0IG9mIHJhbmdlKVxuIiwgS2V5SWR4KSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwgMCwgKFVDSEFSKUtleUlkeCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9LRVkgKGlkPTB4JXgsIExlbj0lZC1ieXRlKVxuIiwgcFJlbW92ZUtleS0+S2V5SW5kZXgsIHBSZW1vdmVLZXktPkxlbmd0aCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAga2ZyZWUocFJlbW92ZUtleSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLy8gTmV3IGZvciBXUEEKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0FERF9LRVk6CisgICAgICAgICAgICBwS2V5ID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmKHBLZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocEtleSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChwS2V5LT5MZW5ndGggIT0gd3JxLT51LmRhdGEubGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfS0VZLCBGYWlsZWQhIVxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJUTVBBZGRLZXkocEFkYXB0ZXIsIHBLZXkpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfS0VZIChpZD0weCV4LCBMZW49JWQtYnl0ZSlcbiIsIHBLZXktPktleUluZGV4LCBwS2V5LT5LZXlMZW5ndGgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtmcmVlKHBLZXkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfQ09ORklHVVJBVElPTikpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkNvbmZpZywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBwQ29uZmlnID0gJkNvbmZpZzsKKworICAgICAgICAgICAgICAgIGlmICgocENvbmZpZy0+QmVhY29uUGVyaW9kID49IDIwKSAmJiAocENvbmZpZy0+QmVhY29uUGVyaW9kIDw9NDAwKSkKKyAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQmVhY29uUGVyaW9kID0gKFVTSE9SVCkgcENvbmZpZy0+QmVhY29uUGVyaW9kOworCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUFjdGl2ZS5BdGltV2luID0gKFVTSE9SVCkgcENvbmZpZy0+QVRJTVdpbmRvdzsKKyAgICAgICAgICAgICAgICBNQVBfS0haX1RPX0NIQU5ORUxfSUQocENvbmZpZy0+RFNDb25maWcsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCk7CisgICAgICAgICAgICAgICAgLy8KKwkJCQkvLyBTYXZlIHRoZSBjaGFubmVsIG9uIE1sbWVBdXggZm9yIENudGxPaWRSVEJzc2lkUHJvYyB1c2VkLgorCQkJCS8vCisJCQkJcEFkYXB0ZXItPk1sbWVBdXguQ2hhbm5lbCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbDsKKworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OIChCZWFjblBlcmlvZD0lbGQsQXRpbVc9JWxkLENoPSVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgcENvbmZpZy0+QmVhY29uUGVyaW9kLCBwQ29uZmlnLT5BVElNV2luZG93LCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKyAgICAgICAgICAgICAgICAvLyBDb25maWcgaGFzIGNoYW5nZWQKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfSFRfUEhZTU9ERToKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGgJIT0gc2l6ZW9mKE9JRF9TRVRfSFRfUEhZTU9ERSkpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCSAgICBQT0lEX1NFVF9IVF9QSFlNT0RFCXBIVFBoeU1vZGUgPSAmSFRfUGh5TW9kZTsKKworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZIVF9QaHlNb2RlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6cEhUUGh5TW9kZQkoUGh5TW9kZSA9ICVkLFRyYW5zbWl0Tm8gPSAlZCwgSHRNb2RlID0JJWQsCUV4dE9mZnNldCA9CSVkICwgTUNTID0gJWQsIEJXID0JJWQsCVNUQkMgPSAlZCwgU0hPUlRHSSA9ICVkKSBcbiIsCisJCQkJcEhUUGh5TW9kZS0+UGh5TW9kZSwgcEhUUGh5TW9kZS0+VHJhbnNtaXRObyxwSFRQaHlNb2RlLT5IdE1vZGUscEhUUGh5TW9kZS0+RXh0T2Zmc2V0LAorCQkJCXBIVFBoeU1vZGUtPk1DUywgcEhUUGh5TW9kZS0+QlcsIHBIVFBoeU1vZGUtPlNUQkMsCXBIVFBoeU1vZGUtPlNIT1JUR0kpKTsKKwkJCQlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlCT49IFBIWV8xMUFCR05fTUlYRUQpCisJCQkJCVJUTVBTZXRIVChwQWRhcHRlciwJcEhUUGh5TW9kZSk7CisJCQl9CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX0hUX1BIWU1PREUoTUNTPSVkLEJXPSVkLFNHST0lZCxTVEJDPSVkKVxuIiwKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MsIHBBZGFwdGVyLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLkJXLCBwQWRhcHRlci0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJLAorCQkJCXBBZGFwdGVyLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNUQkMpKTsKKwkJCWJyZWFrOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX0FQU0RfU0VUVElORzoKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVMT05HKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVVMT05HIGFwc2QgOworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZhcHNkLCB3cnEtPnUuZGF0YS5wb2ludGVyLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJCQkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJfEIzMX5CNwl8CUI2fkI1CSB8CSBCNAkgfAkgQjMJIHwJQjIJIHwJQjEJIHwJICAgQjAJCXwKKwkJCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQl8IFJzdmQJfCBNYXggU1AgTGVuIHwgQUNfVk8gfCBBQ19WSSB8IEFDX0JLIHwgQUNfQkUgfCBBUFNECUNhcGFibGUJfAorCQkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgPSAoYXBzZCAmIDB4MDAwMDAwMDEpID8gVFJVRSA6CUZBTFNFOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CRSA9ICgoYXBzZAkmIDB4MDAwMDAwMDIpID4+IDEpCT8gVFJVRSA6IEZBTFNFOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CSyA9ICgoYXBzZAkmIDB4MDAwMDAwMDQpID4+IDIpCT8gVFJVRSA6IEZBTFNFOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WSSA9ICgoYXBzZAkmIDB4MDAwMDAwMDgpID4+IDMpCT8gVFJVRSA6IEZBTFNFOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WTyA9ICgoYXBzZAkmIDB4MDAwMDAwMTApID4+IDQpCT8gVFJVRSA6IEZBTFNFOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuTWF4U1BMZW5ndGgJPSAoVUNIQVIpKChhcHNkCSYgMHgwMDAwMDA2MCkgPj4gNSk7CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX0FQU0RfU0VUVElORyAoYXBzZD0weCVseCwgQVBTRENhcD0lZCwgW0JFLEJLLFZJLFZPXT1bJWQvJWQvJWQvJWRdLAlNYXhTUExlbj0lZClcbiIsIGFwc2QsIHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlLAorCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUsCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CSywJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZJLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8sCXBBZGFwdGVyLT5Db21tb25DZmcuTWF4U1BMZW5ndGgpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfQVBTRF9QU006CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoCSE9IHNpemVvZihVTE9ORykpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBEcml2ZXIgbmVlZHMJdG8gbm90aWZ5IEFQIHdoZW4gUFNNIGNoYW5nZXMKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCWlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUJIT0gcEFkYXB0ZXItPlN0YUNmZy5Qc20pCisJCQkJeworCQkJCQlNbG1lU2V0UHNtQml0KHBBZGFwdGVyLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpOworCQkJCQlSVE1QU2VuZE51bGxGcmFtZShwQWRhcHRlciwJcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFJhdGUsCVRSVUUpOworCQkJCX0KKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX0FQU0RfUFNNIChiQVBTREZvcmNlUG93ZXJTYXZlOiVkKVxuIiwJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlKSk7CisJCQl9CisJCQlicmVhazsKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9ETFM6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVTE9ORykpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlCT09MRUFOCW9sZHZhbHVlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5iRExTQ2FwYWJsZTsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmcEFkYXB0ZXItPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlpZiAob2xkdmFsdWUgJiYJIXBBZGFwdGVyLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJCQkJeworCQkJCQlpbnQJaTsKKwkJCQkJLy8gdGVhcglkb3duIGxvY2FsIGRscyB0YWJsZSBlbnRyeQorCQkJCQlmb3IJKGk9MDsgaTxNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCisJCQkJCXsKKwkJCQkJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSkKKwkJCQkJCXsKKwkJCQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOworCQkJCQkJCXBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQkJCQlSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUocEFkYXB0ZXIsIHBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQkvLyB0ZWFyCWRvd24gcGVlciBkbHMgdGFibGUJZW50cnkKKwkJCQkJZm9yCShpPU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwkJCQkJeworCQkJCQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpKQorCQkJCQkJeworCQkJCQkJCXBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQkJCQkJcEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJCQkJCVJUTVBTZW5kRExTVGVhckRvd25GcmFtZShwQWRhcHRlciwgcEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9ETFMgKD0lZClcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuYkRMU0NhcGFibGUpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfRExTX1BBUkFNOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aAkhPSBzaXplb2YoUlRfODAyXzExX0RMU19VSSkpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlSVF84MDJfMTFfRExTCURsczsKKworCQkJCU5kaXNaZXJvTWVtb3J5KCZEbHMsIHNpemVvZihSVF84MDJfMTFfRExTKSk7CisJCQkJUlRNUE1vdmVNZW1vcnkoJkRscywgd3JxLT51LmRhdGEucG9pbnRlciwgc2l6ZW9mKFJUXzgwMl8xMV9ETFNfVUkpKTsKKwkJCQlNbG1lRW5xdWV1ZShwQWRhcHRlciwKKwkJCQkJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCQkJCQlSVF9PSURfODAyXzExX1NFVF9ETFNfUEFSQU0sCisJCQkJCQkJc2l6ZW9mKFJUXzgwMl8xMV9ETFMpLAorCQkJCQkJCSZEbHMpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9ETFNfUEFSQU0gXG4iKSk7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9XTU06CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoCSE9IHNpemVvZihCT09MRUFOKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZwQWRhcHRlci0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfV01NICg9JWQpCVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSkpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0RJU0FTU09DSUFURToKKyNpZmRlZiBSQUxJTktfQVRFCisJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUaGUgZHJpdmVyIGlzIGluIEFURSBtb2RlIG5vd1xuIikpOworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwkJCS8vCisJCQkvLyBTZXQgTmRpc1JhZGlvU3RhdGVPZmYgdG8JVFJVRSwgaW5zdGVhZCBvZiBjYWxsZWQJTWxtZVJhZGlvT2ZmLgorCQkJLy8gTGF0ZXIgb24sIE5ESVNfODAyXzExX0JTU0lEX0xJU1RfRVgtPk51bWJlck9mSXRlbXMgc2hvdWxkIGJlCTAKKwkJCS8vIHdoZW4JcXVlcnkgT0lEXzgwMl8xMV9CU1NJRF9MSVNULgorCQkJLy8KKwkJCS8vIFRSVUU6ICBOdW1iZXJPZkl0ZW1zCXdpbGwgc2V0IHRvCTAuCisJCQkvLyBGQUxTRTogTnVtYmVyT2ZJdGVtcwlubyBjaGFuZ2UuCisJCQkvLworCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5OZGlzUmFkaW9TdGF0ZU9mZiA9CVRSVUU7CisJCQkvLyBTZXQgdG8gaW1tZWRpYXRlbHkgc2VuZCB0aGUgbWVkaWEgZGlzY29ubmVjdAlldmVudAorCQkJcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMJPSBUUlVFOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0RJU0FTU09DSUFURQlcbiIpKTsKKworCQkJaWYgKElORlJBX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQlpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9CUNOVExfSURMRSkKKwkJCQl7CisJCQkJCVJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRQlidXN5LCByZXNldAlNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7CisJCQkJfQorCisJCQkJTWxtZUVucXVldWUocEFkYXB0ZXIsCisJCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJCQlPSURfODAyXzExX0RJU0FTU09DSUFURSwKKwkJCQkJMCwKKwkJCQkJTlVMTCk7CisKKwkJCQlTdGF0ZU1hY2hpbmVUb3VjaGVkCT0gVFJVRTsKKwkJCX0KKwkJCWJyZWFrOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfSU1NRV9CQV9DQVA6CisJCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoT0lEX0JBQ0FQX1NUUlVDKSkKKwkJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCQllbHNlCisJCQkJeworCQkJCQlPSURfQkFDQVBfU1RSVUMgT3JkZSA7CisJCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZPcmRlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCQlpZiAoT3JkZS5Qb2xpY3kgPiBCQV9OT1RVU0UpCisJCQkJCXsKKwkJCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQTsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChPcmRlLlBvbGljeSA9PSBCQV9OT1RVU0UpCisJCQkJCXsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSA9IEJBX05PVFVTRTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlID0gT3JkZS5BbXNkdUVuYWJsZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZT0gT3JkZS5BbXNkdVNpemU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHM9IE9yZGUuTU1QU21vZGU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSA9IE9yZGUuTU1QU21vZGU7CisJCQkJCQkvLyBVUGRhdGEgdG8gSFQgSUUKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHMgPSBPcmRlLk1NUFNtb2RlOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZSA9IE9yZGUuQW1zZHVTaXplOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IE9yZGUuQXV0b0JBOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID0gSU1NRURfQkE7IC8vIHdlIG9ubHkgc3VwcG9ydCBpbW1lZGlhdGUgQkEuCisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdUVuYWJsZSA9IE9yZGUuQW1zZHVFbmFibGU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemU9IE9yZGUuQW1zZHVTaXplOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWltb1BzID0gT3JkZS5NTVBTbW9kZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gT3JkZS5NTVBTbW9kZTsKKworCQkJCQkJLy8gVVBkYXRhIHRvIEhUIElFCisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzID0gT3JkZS5NTVBTbW9kZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemUgPSBPcmRlLkFtc2R1U2l6ZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7CisKKwkJCQkJCWlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPiBNQVhfUlhfUkVPUkRFUkJVRikKKwkJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSBNQVhfUlhfUkVPUkRFUkJVRjsKKworCQkJCQl9CisKKwkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkud29yZCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LndvcmQ7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6KE9yZGUuQXV0b0JBID0gJWQpIChQb2xpY3k9JWQpKFJlQkFXaW5MaW1pdD0lZCkoVHhCQVdpbkxpbWl0PSVkKShBdXRvTW9kZT0lZClcbiIsT3JkZS5BdXRvQkEsIHBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSwKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCxwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5UeEJBV2luTGltaXQsIHBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSkpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OihNaW1vUHMgPSAlZCkoQW1zZHVFbmFibGUgPSAlZCkgKEFtc2R1U2l6ZT0lZCkoTXBkdURlbnNpdHk9JWQpXG4iLHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QcywgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUsCisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemUsIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5KSk7CisJCQkJfQorCisJCQkJYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9BRERfSU1NRV9CQToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBTZXQgOjogUlRfT0lEXzgwMl8xMV9BRERfSU1NRV9CQSBcbiIpKTsKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE9JRF9BRERfQkFfRU5UUlkpKQorCQkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVVDSEFSCQkgICAgICAgIGluZGV4OworCQkJCU9JRF9BRERfQkFfRU5UUlkgICAgQkE7CisJCQkJTUFDX1RBQkxFX0VOVFJZICAgICAqcEVudHJ5OworCisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkJBLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCWlmIChCQS5USUQgPiAxNSkKKwkJCQl7CisJCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8vQkFUYWJsZUluc2VydEVudHJ5CisJCQkJCS8vQXMgYWQtaG9jIG1vZGUsIEJBIHBhaXIgaXMgbm90IGxpbWl0ZWQgdG8gb25seSBCU1NJRC4gc28gYWRkIHZpYSBPSUQuCisJCQkJCWluZGV4ID0gQkEuVElEOworCQkJCQkvLyBpbiBhZCBob2MgbW9kZSwgd2hlbiBhZGRpbmcgQkEgcGFpciwgd2Ugc2hvdWxkIGluc2VydCB0aGlzIGVudHJ5IGludG8gTUFDRW50cnkgdG9vCisJCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZGFwdGVyLCBCQS5NQUNBZGRyKTsKKwkJCQkJaWYgKCFwRW50cnkpCisJCQkJCXsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUX09JRF84MDJfMTFfQUREX0lNTUVfQkEuIGJyZWFrIG9uIG5vIGNvbm5lY3Rpb24uLS0tLToleDoleFxuIiwgQkEuTUFDQWRkcls0XSwgQkEuTUFDQWRkcls1XSkpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJaWYgKEJBLklzUmVjaXBpZW50ID09IEZBTFNFKQorCQkJCQl7CisJCQkJCSAgICBpZiAocEVudHJ5LT5iSUFtQmFkQXRoZXJvcyA9PSBUUlVFKQorCQkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IDB4MTA7CisKKwkJCQkJCUJBT3JpU2Vzc2lvblNldFVwKHBBZGFwdGVyLCBwRW50cnksIGluZGV4LCAwLCAxMDAsIFRSVUUpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJLy9CQVRhYmxlSW5zZXJ0RW50cnkocEFkYXB0ZXIsIHBFbnRyeS0+QWlkLCBCQS5NQUNBZGRyLCAwLCAweGZmZmYsIEJBLlRJRCwgQkEubk1TRFUsIEJBLklzUmVjaXBpZW50KTsKKwkJCQkJfQorCisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9BRERfSU1NRV9CQS4gUmVjID0gJWQuIE1hYyA9ICV4OiV4OiV4OiV4OiV4OiV4IC4gXG4iLAorCQkJCQkJQkEuSXNSZWNpcGllbnQsIEJBLk1BQ0FkZHJbMF0sIEJBLk1BQ0FkZHJbMV0sIEJBLk1BQ0FkZHJbMl0sIEJBLk1BQ0FkZHJbMl0KKwkJCQkJCSwgQkEuTUFDQWRkcls0XSwgQkEuTUFDQWRkcls1XSkpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9URUFSX0lNTUVfQkE6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQgOjogUlRfT0lEXzgwMl8xMV9URUFSX0lNTUVfQkEgXG4iKSk7CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihPSURfQUREX0JBX0VOVFJZKSkKKwkJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlQT0lEX0FERF9CQV9FTlRSWQlwQkE7CisJCQkJTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7CisKKwkJCQlwQkEgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgTUVNX0FMTE9DX0ZMQUcpOworCisJCQkJaWYgKHBCQSA9PSBOVUxMKQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IDo6IFJUX09JRF84MDJfMTFfVEVBUl9JTU1FX0JBIGttYWxsb2MoKSBjYW4ndCBhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5XG4iKSk7CisJCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBCQSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IDo6IFJUX09JRF84MDJfMTFfVEVBUl9JTU1FX0JBKFRJRD0lZCwgYkFsbFRpZD0lZClcbiIsIHBCQS0+VElELCBwQkEtPmJBbGxUaWQpKTsKKworCQkJCQlpZiAoIXBCQS0+YkFsbFRpZCAmJiAocEJBLT5USUQgPiBOVU1fT0ZfVElEKSkKKwkJCQkJeworCQkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQlpZiAocEJBLT5Jc1JlY2lwaWVudCA9PSBGQUxTRSkKKwkJCQkJeworCQkJCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkYXB0ZXIsIHBCQS0+TUFDQWRkcik7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgcEJBLT5Jc1JlY2lwaWVudCA9PSBGQUxTRVxuIikpOworCQkJCQkJaWYgKHBFbnRyeSkKKwkJCQkJCXsKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgcEJBLT5wRW50cnlcbiIpKTsKKwkJCQkJCQlCQU9yaVNlc3Npb25UZWFyRG93bihwQWRhcHRlciwgcEVudHJ5LT5BaWQsIHBCQS0+VElELCBGQUxTRSwgVFJVRSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IDo6IE5vdCBmb3VuZCBwRW50cnkgXG4iKSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWRhcHRlciwgcEJBLT5NQUNBZGRyKTsKKwkJCQkJCWlmIChwRW50cnkpCisJCQkJCQl7CisJCQkJCQkJQkFSZWNTZXNzaW9uVGVhckRvd24oIHBBZGFwdGVyLCAoVUNIQVIpcEVudHJ5LT5BaWQsIHBCQS0+VElELCBUUlVFKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQgOjogTm90IGZvdW5kIHBFbnRyeSBcbiIpKTsKKwkJCQkJfQorCQkJCQlrZnJlZShwQkEpOworCQkJCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisgICAgICAgIC8vIEZvciBXUEFfU1VQUExJQ0FOVCB0byBzZXQgc3RhdGljIHdlcCBrZXkKKyAgICAJY2FzZSBPSURfODAyXzExX0FERF9XRVA6CisgICAgCSAgICBwV2VwS2V5ID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKworICAgIAkgICAgaWYocFdlcEtleSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FTk9NRU07CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9XRVAsIEZhaWxlZCEhXG4iKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwV2VwS2V5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgaWYgKFN0YXR1cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX1dFUCwgRmFpbGVkIChsZW5ndGggbWlzbWF0Y2gpISFcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKwkJICAgICAgICBLZXlJZHggPSBwV2VwS2V5LT5LZXlJbmRleCAmIDB4MGZmZmZmZmY7CisgICAgICAgICAgICAgICAgLy8gS2V5SWR4IG11c3QgYmUgMCB+IDMKKyAgICAgICAgICAgICAgICBpZiAoS2V5SWR4ID4gNCkKKyAgICAJCQl7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX1dFUCwgRmFpbGVkIChLZXlJZHggbXVzdCBiZSBzbWFsbGVyIHRoYW4gNCkhIVxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBVQ0hBUiBDaXBoZXJBbGcgPSAwOworICAgICAgICAgICAgICAgICAgICBQVUNIQVIgS2V5OworCisgICAgICAgICAgICAgICAgICAgIC8vIHNldCBrZXkgbWF0ZXJpYWwgYW5kIGtleSBsZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleSwgMTYpOworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID0gKFVDSEFSKSBwV2VwS2V5LT5LZXlMZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXksICZwV2VwS2V5LT5LZXlNYXRlcmlhbCwgcFdlcEtleS0+S2V5TGVuZ3RoKTsKKworICAgICAgICAgICAgICAgICAgICBzd2l0Y2gocFdlcEtleS0+S2V5TGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX1dFUCwgb25seSBzdXBwb3J0IENJUEhFUl9XRVA2NChsZW46NSkgJiBDSVBIRVJfV0VQMTI4KGxlbjoxMykhIVxuIikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworICAgICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IGtleSBmb3IgdHggKHNoYXJlZCBrZXkpCisgICAgICAgICAgICAgICAgICAgIGlmIChwV2VwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApCisgICAgICAgICAgICAgICAgICAgIHsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQga2V5IG1hdGVyaWFsIGFuZCBrZXkgbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtLZXlJZHhdLktleSwgMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbS2V5SWR4XS5LZXlMZW4gPSAoVUNIQVIpIHBXZXBLZXktPktleUxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W0tleUlkeF0uS2V5LCAmcFdlcEtleS0+S2V5TWF0ZXJpYWwsIHBXZXBLZXktPktleUxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleUlkID0gS2V5SWR4OworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbS2V5SWR4XS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAoVUNIQVIpIEtleUlkeDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtleSA9IHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyB0byBBc2ljCisgICAgICAgIAkJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIEJTUzAsIEtleUlkeCwgQ2lwaGVyQWxnLCBLZXksIE5VTEwsIE5VTEwpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFdlcEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5ID0gJnBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBc3NpZ24gZ3JvdXAga2V5IGluZm8KKyAgICAJCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZGFwdGVyLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgTlVMTCk7CisgICAgCQkJCQkJLy8gQXNzaWduIHBhaXJ3aXNlIGtleSBpbmZvCisgICAgCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwgQlNTMCwgS2V5SWR4LCBDaXBoZXJBbGcsIHBFbnRyeSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9XRVAgKGlkPTB4JXgsIExlbj0lZC1ieXRlKSwgJXNcbiIsIHBXZXBLZXktPktleUluZGV4LCBwV2VwS2V5LT5LZXlMZW5ndGgsIChwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKSA/ICJQb3J0IFNlY3VyZWQiOiJQb3J0IE5PVCBTZWN1cmVkIikpOworCQkJCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtmcmVlKHBXZXBLZXkpOworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCSAgICBjYXNlIE9JRF9TRVRfQ09VTlRFUk1FQVNVUkVTOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoaW50KSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgZW5hYmxlZCA9IDA7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmVuYWJsZWQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKGVuYWJsZWQgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iQmxvY2tBc3NvYyA9IFRSVUU7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAvLyBXUEEgTUlDIGVycm9yIHNob3VsZCBibG9jayBhc3NvY2lhdGlvbiBhdHRlbXB0IGZvciA2MCBzZWNvbmRzCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYkJsb2NrQXNzb2MgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF9TRVRfQ09VTlRFUk1FQVNVUkVTIGJCbG9ja0Fzc29jPSVzXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLmJCbG9ja0Fzc29jID8gIlRSVUUiOiJGQUxTRSIpKTsKKyAgICAgICAgICAgIH0KKwkgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUNIQVIpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZ3cGFfc3VwcGxpY2FudF9lbmFibGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgCQkJcEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSB3cGFfc3VwcGxpY2FudF9lbmFibGU7CisgICAgCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAoPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVApKTsKKwkJCX0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfREVBVVRIRU5USUNBVElPTjoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QgICAgICAqcEluZm87CisJCQkJTUxNRV9RVUVVRV9FTEVNICpNc2dFbGVtID0gKE1MTUVfUVVFVUVfRUxFTSAqKSBrbWFsbG9jKHNpemVvZihNTE1FX1FVRVVFX0VMRU0pLCBNRU1fQUxMT0NfRkxBRyk7CisKKyAgICAgICAgICAgICAgICBwSW5mbyA9IChNTE1FX0RFQVVUSF9SRVFfU1RSVUNUICopIE1zZ0VsZW0tPk1zZzsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwSW5mbywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBNbG1lRGVhdXRoUmVxQWN0aW9uKHBBZGFwdGVyLCBNc2dFbGVtKTsKKwkJCQlrZnJlZShNc2dFbGVtKTsKKworICAgICAgICAgICAgICAgIGlmIChJTkZSQV9PTihwQWRhcHRlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBMaW5rRG93bihwQWRhcHRlciwgRkFMU0UpOworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0RFQVVUSEVOVElDQVRJT04gKFJlYXNvbj0lZClcbiIsIHBJbmZvLT5SZWFzb24pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfRFJPUF9VTkVOQ1JZUFRFRDoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKGludCkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGVuYWJsZWQgPSAwOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZlbmFibGVkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChlbmFibGVkID09IDEpCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCQkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkYXB0ZXItPk1hY1RhYkxvY2spOworCQkJCXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5Qb3J0U2VjdXJlZCA9IHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQ7CisJCQkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkYXB0ZXItPk1hY1RhYkxvY2spOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9EUk9QX1VORU5DUllQVEVEICg9JWQpXG4iLCBlbmFibGVkKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1NFVF9JRUVFODAyMVg6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihCT09MRUFOKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmSUVFRTgwMjF4U3RhdGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBJRUVFODAyMXhTdGF0ZTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfU0VUX0lFRUU4MDIxWCAoPSVkKVxuIiwgSUVFRTgwMjF4U3RhdGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfU0VUX0lFRUU4MDIxWF9SRVFVSVJFX0tFWToKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKEJPT0xFQU4pKQorCQkJCSBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMXhfcmVxdWlyZWRfa2V5cyA9IElFRUU4MDIxeF9yZXF1aXJlZF9rZXlzOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9TRVRfSUVFRTgwMjFYX1JFUVVJUkVfS0VZICglZClcbiIsIElFRUU4MDIxeF9yZXF1aXJlZF9rZXlzKSk7CisJCQl9CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1BNS0lEOgorCSAgICAgICAgcFBta0lkID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKworCSAgICAgICAgaWYocFBta0lkID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocFBta0lkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJICAgICAgICAvLyBjaGVjayB0aGUgUE1LSUQgaW5mb3JtYXRpb24KKwkgICAgICAgIGlmIChwUG1rSWQtPkJTU0lESW5mb0NvdW50ID09IDApCisgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPlN0YUNmZy5TYXZlZFBNSywgc2l6ZW9mKEJTU0lEX0lORk8pKlBNS0lEX05PKTsKKwkgICAgICAgIGVsc2UKKwkgICAgICAgIHsKKwkJICAgICAgICBQQlNTSURfSU5GTwlwQnNzSWRJbmZvOworCQkgICAgICAgIFVJTlQJCUJzc0lkeDsKKwkJICAgICAgICBVSU5UCQlDYWNoZWRJZHg7CisKKwkJICAgICAgICBmb3IgKEJzc0lkeCA9IDA7IEJzc0lkeCA8IHBQbWtJZC0+QlNTSURJbmZvQ291bnQ7IEJzc0lkeCsrKQorCQkgICAgICAgIHsKKwkJCSAgICAgICAgLy8gcG9pbnQgdG8gdGhlIGluZGV4ZWQgQlNTSURfSU5GTyBzdHJ1Y3R1cmUKKwkJCSAgICAgICAgcEJzc0lkSW5mbyA9IChQQlNTSURfSU5GTykgKChQVUNIQVIpIHBQbWtJZCArIDIgKiBzaXplb2YoVUlOVCkgKyBCc3NJZHggKiBzaXplb2YoQlNTSURfSU5GTykpOworCQkJICAgICAgICAvLyBGaW5kIHRoZSBlbnRyeSBpbiB0aGUgc2F2ZWQgZGF0YSBiYXNlLgorCQkJICAgICAgICBmb3IgKENhY2hlZElkeCA9IDA7IENhY2hlZElkeCA8IHBBZGFwdGVyLT5TdGFDZmcuU2F2ZWRQTUtOdW07IENhY2hlZElkeCsrKQorCQkJICAgICAgICB7CisJCQkJICAgICAgICAvLyBjb21wYXJlIHRoZSBCU1NJRAorCQkJCSAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwQnNzSWRJbmZvLT5CU1NJRCwgcEFkYXB0ZXItPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELCBzaXplb2YoTkRJU184MDJfMTFfTUFDX0FERFJFU1MpKSkKKwkJCQkJICAgICAgICBicmVhazsKKwkJCSAgICAgICAgfQorCisJCQkgICAgICAgIC8vIEZvdW5kLCByZXBsYWNlIGl0CisJCQkgICAgICAgIGlmIChDYWNoZWRJZHggPCBQTUtJRF9OTykKKwkJCSAgICAgICAgeworCQkJCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlVwZGF0ZSBPSURfODAyXzExX1BNS0lELCBpZHggPSAlZFxuIiwgQ2FjaGVkSWR4KSk7CisJCQkJICAgICAgICBOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLCBwQnNzSWRJbmZvLCBzaXplb2YoQlNTSURfSU5GTykpOworCQkJCSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5TYXZlZFBNS051bSsrOworCQkJICAgICAgICB9CisJCQkgICAgICAgIC8vIE5vdCBmb3VuZCwgcmVwbGFjZSB0aGUgbGFzdCBvbmUKKwkJCSAgICAgICAgZWxzZQorCQkJICAgICAgICB7CisJCQkJICAgICAgICAvLyBSYW5kb21seSByZXBsYWNlIG9uZQorCQkJCSAgICAgICAgQ2FjaGVkSWR4ID0gKHBCc3NJZEluZm8tPkJTU0lEWzVdICUgUE1LSURfTk8pOworCQkJCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlVwZGF0ZSBPSURfODAyXzExX1BNS0lELCBpZHggPSAlZFxuIiwgQ2FjaGVkSWR4KSk7CisJCQkJICAgICAgICBOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLCBwQnNzSWRJbmZvLCBzaXplb2YoQlNTSURfSU5GTykpOworCQkJICAgICAgICB9CisJCSAgICAgICAgfQorCQkJfQorCQkJaWYocFBta0lkKQorCQkJCWtmcmVlKHBQbWtJZCk7CisJICAgICAgICBicmVhazsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKworCisjaWZkZWYgU05NUF9TVVBQT1JUCisJCWNhc2UgT0lEXzgwMl8xMV9TSE9SVFJFVFJZTElNSVQ6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVTE9ORykpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmU2hvcnRSZXRyeUxpbWl0LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCAmdHhfcnR5X2NmZy53b3JkKTsKKwkJCQl0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UnR5TGltaXQgPSBTaG9ydFJldHJ5TGltaXQ7CisJCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCB0eF9ydHlfY2ZnLndvcmQpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9TSE9SVFJFVFJZTElNSVQgKHR4X3J0eV9jZmcuZmllbGQuU2hvcnRSZXRyeUxpbWl0PSVkLCBTaG9ydFJldHJ5TGltaXQ9JWxkKVxuIiwgdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJ0eUxpbWl0LCBTaG9ydFJldHJ5TGltaXQpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9MT05HUkVUUllMSU1JVDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9MT05HUkVUUllMSU1JVCBcbiIpKTsKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVMT05HKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZMb25nUmV0cnlMaW1pdCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7CisJCQkJdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQgPSBMb25nUmV0cnlMaW1pdDsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsIHR4X3J0eV9jZmcud29yZCk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0xPTkdSRVRSWUxJTUlUICh0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSZXRyeUxpbWl0PSAlZCxMb25nUmV0cnlMaW1pdD0lbGQpXG4iLCB0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdCwgTG9uZ1JldHJ5TGltaXQpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZVkFMVUU6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfV0VQREVGQVVMVEtFWVZBTFVFXG4iKSk7CisJCQlwS2V5ID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIEdGUF9LRVJORUwpOworCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIocEtleSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCS8vcEtleSA9ICZXZXBLZXk7CisKKwkJCWlmICggcEtleS0+TGVuZ3RoICE9IHdycS0+dS5kYXRhLmxlbmd0aCkKKwkJCXsKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZVkFMVUUsIEZhaWxlZCEhXG4iKSk7CisJCQl9CisJCQlLZXlJZHggPSBwS2V5LT5LZXlJbmRleCAmIDB4MGZmZmZmZmY7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoInBLZXktPktleUluZGV4ID0lZCwgcEtleS0+S2V5TGVuZ3RoPSVkXG4iLCBwS2V5LT5LZXlJbmRleCwgcEtleS0+S2V5TGVuZ3RoKSk7CisKKwkJCS8vIGl0IGlzIGEgc2hhcmVkIGtleQorCQkJaWYgKEtleUlkeCA+IDQpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4gPSAoVUNIQVIpIHBLZXktPktleUxlbmd0aDsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LCAmcEtleS0+S2V5TWF0ZXJpYWwsIHBLZXktPktleUxlbmd0aCk7CisJCQkJaWYgKHBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkKKwkJCQl7CisJCQkJCS8vIERlZmF1bHQga2V5IGZvciB0eCAoc2hhcmVkIGtleSkKKwkJCQkJcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAoVUNIQVIpIEtleUlkeDsKKwkJCQl9CisJCQkJLy9SZXN0YXJ0QVBJc1JlcXVpcmVkID0gVFJVRTsKKwkJCX0KKwkJCWJyZWFrOworCisKKwkJY2FzZSBPSURfODAyXzExX1dFUERFRkFVTFRLRVlJRDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZSUQgXG4iKSk7CisKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVDSEFSKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCQkJYnJlYWs7CisKKworCQljYXNlIE9JRF84MDJfMTFfQ1VSUkVOVENIQU5ORUw6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQ1VSUkVOVENIQU5ORUwgXG4iKSk7CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVQ0hBUikpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmY3RtcCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlzcHJpbnRmKCZjdG1wLCIlZCIsIGN0bXApOworCQkJCVNldF9DaGFubmVsX1Byb2MocEFkYXB0ZXIsICZjdG1wKTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmCisKKworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OnVua25vd24gSU9DVEwncyBzdWJjbWQgPSAweCUwOHhcbiIsIGNtZCkpOworICAgICAgICAgICAgU3RhdHVzID0gLUVPUE5PVFNVUFA7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKworICAgIHJldHVybiBTdGF0dXM7Cit9CisKK0lOVCBSVE1QUXVlcnlJbmZvcm1hdGlvbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiBwQWRhcHRlciwKKyAgICBJTiAgT1VUIHN0cnVjdCBpZnJlcSAgICAqcnEsCisgICAgSU4gIElOVCAgICAgICAgICAgICAgICAgY21kKQoreworICAgIHN0cnVjdCBpd3JlcSAgICAgICAgICAgICAgICAgICAgICAgICp3cnEgPSAoc3RydWN0IGl3cmVxICopIHJxOworICAgIE5ESVNfODAyXzExX0JTU0lEX0xJU1RfRVggICAgICAgICAgICpwQnNzaWRMaXN0ID0gTlVMTDsKKyAgICBQTkRJU19XTEFOX0JTU0lEX0VYICAgICAgICAgICAgICAgICBwQnNzOworICAgIE5ESVNfODAyXzExX1NTSUQgICAgICAgICAgICAgICAgICAgIFNzaWQ7CisgICAgTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiAgICAgICAgICAgKnBDb25maWd1cmF0aW9uID0gTlVMTDsKKyAgICBSVF84MDJfMTFfTElOS19TVEFUVVMgICAgICAgICAgICAgICAqcExpbmtTdGF0dXMgPSBOVUxMOworICAgIFJUXzgwMl8xMV9TVEFfQ09ORklHICAgICAgICAgICAgICAgICpwU3RhQ29uZmlnID0gTlVMTDsKKyAgICBORElTXzgwMl8xMV9TVEFUSVNUSUNTICAgICAgICAgICAgICAqcFN0YXRpc3RpY3MgPSBOVUxMOworICAgIE5ESVNfODAyXzExX1JUU19USFJFU0hPTEQgICAgICAgICAgIFJ0c1RocmVzaDsKKyAgICBORElTXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCBGcmFnVGhyZXNoOworICAgIE5ESVNfODAyXzExX1BPV0VSX01PREUgICAgICAgICAgICAgIFBvd2VyTW9kZTsKKyAgICBORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFICBCc3NUeXBlOworICAgIFJUXzgwMl8xMV9QUkVBTUJMRSAgICAgICAgICAgICAgICAgIFByZWFtVHlwZTsKKyAgICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFICAgICBBdXRoTW9kZTsKKyAgICBORElTXzgwMl8xMV9XRVBfU1RBVFVTICAgICAgICAgICAgICBXZXBTdGF0dXM7CisgICAgTkRJU19NRURJQV9TVEFURSAgICAgICAgICAgICAgICAgICAgTWVkaWFTdGF0ZTsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCc3NCdWZTaXplLCB1bEluZm89MCwgTmV0d29ya1R5cGVMaXN0WzRdLCBhcHNkID0gMDsKKyAgICBVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCc3NMZW4gPSAwOworICAgIFBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdWYgPSBOVUxMLCBwUHRyOworICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VfdmVyc2lvbl9jb21waWxlZDsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBQYWRkaW5nID0gMDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWRpb1N0YXRlOworCVVDSEFSCWRyaXZlclZlcnNpb25bOF07CisgICAgT0lEX1NFVF9IVF9QSFlNT0RFCQkJICAgICAgICAqcEhUUGh5TW9kZSA9IE5VTEw7CisKKworI2lmZGVmIFNOTVBfU1VQUE9SVAorCS8vZm9yIHNubXAsIGthdGh5CisJRGVmYXVsdEtleUlkeFZhbHVlCQkJKnBLZXlJZHhWYWx1ZTsKKwlJTlQJCQkJCQkJdmFsdWVMZW47CisJVFhfUlRZX0NGR19TVFJVQwkJCXR4X3J0eV9jZmc7CisJVUxPTkcJCQkJCQlTaG9ydFJldHJ5TGltaXQsIExvbmdSZXRyeUxpbWl0OworCVVDSEFSCQkJCQkJdG1wWzY0XTsKKyNlbmRpZiAvL1NOTVAKKworICAgIHN3aXRjaChjbWQpCisgICAgeworICAgICAgICBjYXNlIFJUX09JRF9ERVZJQ0VfTkFNRToKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihTVEFfTklDX0RFVklDRV9OQU1FKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBTVEFfTklDX0RFVklDRV9OQU1FLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEX1ZFUlNJT05fSU5GTzoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfVkVSU0lPTl9JTkZPIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gOCpzaXplb2YoVUNIQVIpOworCQkJc3ByaW50ZigmZHJpdmVyVmVyc2lvblswXSwgIiVzIiwgU1RBX0RSSVZFUl9WRVJTSU9OKTsKKwkJCWRyaXZlclZlcnNpb25bN10gPSAnXDAnOworCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmZHJpdmVyVmVyc2lvbiwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKwkJCQlTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgUkFMSU5LX0FURQorCQljYXNlIFJUX1FVRVJZX0FURV9UWERPTkVfQ09VTlQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfUVVFUllfQVRFX1RYRE9ORV9DT1VOVCBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVSU5UMzIpOworCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPmF0ZS5UeERvbmVDb3VudCwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKwkJCXsKKwkJCQlTdGF0dXMgPSAtRUZBVUxUOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQlNTSURfTElTVDoKKyAgICAgICAgICAgIGlmIChSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJLyoKKyAgICAgICAgICAgIAkgKiBTdGlsbCBzY2FubmluZywgaW5kaWNhdGUgdGhlIGNhbGxlciBzaG91bGQgdHJ5IGFnYWluLgorICAgICAgICAgICAgCSAqLworICAgICAgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0JTU0lEX0xJU1QgKFN0aWxsIHNjYW5uaW5nKVxuIikpOworCQkJCXJldHVybiAtRUFHQUlOOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQlNTSURfTElTVCAoJWQgQlNTIHJldHVybmVkKVxuIixwQWRhcHRlci0+U2NhblRhYi5Cc3NOcikpOworCQkJcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7CisgICAgICAgICAgICAvLyBDbGFjdWxhdGUgdG90YWwgYnVmZmVyIHNpemUgcmVxdWlyZWQKKyAgICAgICAgICAgIEJzc0J1ZlNpemUgPSBzaXplb2YoVUxPTkcpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnI7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBBbGlnbiBwb2ludGVyIHRvIDQgYnl0ZXMgYm91bmRhcnkuCisgICAgICAgICAgICAgICAgLy9QYWRkaW5nID0gNCAtIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbiAmIDB4MDAwMyk7CisgICAgICAgICAgICAgICAgLy9pZiAoUGFkZGluZyA9PSA0KQorICAgICAgICAgICAgICAgIC8vICAgIFBhZGRpbmcgPSAwOworICAgICAgICAgICAgICAgIEJzc0J1ZlNpemUgKz0gKHNpemVvZihORElTX1dMQU5fQlNTSURfRVgpIC0gMSArIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpICsgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4gKyBQYWRkaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRm9yIHNhZmV0eSBpc3N1ZSwgd2UgYWRkIDI1NiBieXRlcyBqdXN0IGluIGNhc2UKKyAgICAgICAgICAgIEJzc0J1ZlNpemUgKz0gMjU2OworICAgICAgICAgICAgLy8gQWxsb2NhdGUgdGhlIHNhbWUgc2l6ZSBhcyBwYXNzZWQgZnJvbSBoaWdoZXIgbGF5ZXIKKyAgICAgICAgICAgIHBCdWYgPSBrbWFsbG9jKEJzc0J1ZlNpemUsIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmKHBCdWYgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSW5pdCA4MDJfMTFfQlNTSURfTElTVF9FWCBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBCdWYsIEJzc0J1ZlNpemUpOworICAgICAgICAgICAgcEJzc2lkTGlzdCA9IChQTkRJU184MDJfMTFfQlNTSURfTElTVF9FWCkgcEJ1ZjsKKyAgICAgICAgICAgIHBCc3NpZExpc3QtPk51bWJlck9mSXRlbXMgPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NOcjsKKworICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRvdGFsIGJ1ZmZlciBsZW5ndGgKKyAgICAgICAgICAgIEJzc0xlbiA9IDQ7IC8vIENvbnNpc3Qgb2YgTnVtYmVyT2ZJdGVtcworICAgICAgICAgICAgLy8gUG9pbnQgdG8gc3RhcnQgb2YgTkRJU19XTEFOX0JTU0lEX0VYCisgICAgICAgICAgICAvLyBwUHRyID0gcEJ1ZiArIHNpemVvZihVTE9ORyk7CisgICAgICAgICAgICBwUHRyID0gKFBVQ0hBUikgJnBCc3NpZExpc3QtPkJzc2lkWzBdOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEJzcyA9IChQTkRJU19XTEFOX0JTU0lEX0VYKSBwUHRyOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5NYWNBZGRyZXNzLCAmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWQsIE1BQ19BRERSX0xFTik7CisgICAgICAgICAgICAgICAgaWYgKChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5IaWRkZW4gPT0gMSkgJiYgKHBBZGFwdGVyLT5TdGFDZmcuYlNob3dIaWRkZW5TU0lEID09IEZBTFNFKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vCisJCQkJCS8vIFdlIG11c3QgcmV0dXJuIHRoaXMgU1NJRCBkdXJpbmcgNHdheSBoYW5kc2hha2luZywgb3RoZXJ3aXNlIEFlZ2lzIHdpbGwgZmFpbGVkIHRvIHBhcnNlIFdQQSBpbmZvbWF0aW9uCisJCQkJCS8vIGFuZCB0aGVuIGZhaWxlZCB0byBzZW5kIEVBUE9sIGZhcmFtZS4KKwkJCQkJLy8KKwkJCQkJaWYgKChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgJiYgKHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgIT0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQpKQorCQkJCQl7CisJCQkJCQlwQnNzLT5Tc2lkLlNzaWRMZW5ndGggPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuOworCQkJCQkJTmRpc01vdmVNZW1vcnkocEJzcy0+U3NpZC5Tc2lkLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuKTsKKwkJCQkJfQorCQkJCQllbHNlCisgICAgICAgICAgICAgICAgICAgIAlwQnNzLT5Tc2lkLlNzaWRMZW5ndGggPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQnNzLT5Tc2lkLlNzaWRMZW5ndGggPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuOworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5Tc2lkLlNzaWQsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWQsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWRMZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwQnNzLT5Qcml2YWN5ID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUHJpdmFjeTsKKyAgICAgICAgICAgICAgICBwQnNzLT5Sc3NpID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNzaSAtIHBBZGFwdGVyLT5CYnBSc3NpVG9EYm1EZWx0YTsKKyAgICAgICAgICAgICAgICBwQnNzLT5OZXR3b3JrVHlwZUluVXNlID0gTmV0d29ya1R5cGVJblVzZVNhbml0eSgmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0pOworICAgICAgICAgICAgICAgIHBCc3MtPkNvbmZpZ3VyYXRpb24uTGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04pOworICAgICAgICAgICAgICAgIHBCc3MtPkNvbmZpZ3VyYXRpb24uQmVhY29uUGVyaW9kID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQmVhY29uUGVyaW9kOworICAgICAgICAgICAgICAgIHBCc3MtPkNvbmZpZ3VyYXRpb24uQVRJTVdpbmRvdyA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkF0aW1XaW47CisKKyAgICAgICAgICAgICAgICBNQVBfQ0hBTk5FTF9JRF9UT19LSFoocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQ2hhbm5lbCwgcEJzcy0+Q29uZmlndXJhdGlvbi5EU0NvbmZpZyk7CisKKyAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzVHlwZSA9PSBCU1NfSU5GUkEpCisgICAgICAgICAgICAgICAgICAgIHBCc3MtPkluZnJhc3RydWN0dXJlTW9kZSA9IE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHBCc3MtPkluZnJhc3RydWN0dXJlTW9kZSA9IE5kaXM4MDJfMTFJQlNTOworCisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEJzcy0+U3VwcG9ydGVkUmF0ZXMsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGUsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGVMZW4pOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBCc3MtPlN1cHBvcnRlZFJhdGVzICsgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5FeHRSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkV4dFJhdGVMZW4pOworCisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQnNzLT5JRUxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpOworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5JRXMsICZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5GaXhJRXMsIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpKTsKKyAgICAgICAgICAgICAgICAgICAgcFB0ciA9IHBQdHIgKyBzaXplb2YoTkRJU19XTEFOX0JTU0lEX0VYKSAtIDEgKyBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEJzcy0+SUVMZW5ndGggPSAoVUxPTkcpKHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpICsgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4pOworICAgICAgICAgICAgICAgICAgICBwUHRyID0gcFB0ciArIHNpemVvZihORElTX1dMQU5fQlNTSURfRVgpIC0gMSArIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpOworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5JRXMsICZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5GaXhJRXMsIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpKTsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEJzcy0+SUVzICsgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcyksIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFcywgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4pOworICAgICAgICAgICAgICAgICAgICBwUHRyICs9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwQnNzLT5MZW5ndGggPSAoVUxPTkcpKHNpemVvZihORElTX1dMQU5fQlNTSURfRVgpIC0gMSArIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpICsgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4gKyBQYWRkaW5nKTsKKworI2lmIFdJUkVMRVNTX0VYVCA8IDE3CisgICAgICAgICAgICAgICAgaWYgKChCc3NMZW4gKyBwQnNzLT5MZW5ndGgpIDwgd3JxLT51LmRhdGEubGVuZ3RoKQorICAgICAgICAgICAgICAgIEJzc0xlbiArPSBwQnNzLT5MZW5ndGg7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEJzc2lkTGlzdC0+TnVtYmVyT2ZJdGVtcyA9IGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgICAgQnNzTGVuICs9IHBCc3MtPkxlbmd0aDsKKyNlbmRpZgorICAgICAgICAgICAgfQorCisjaWYgV0lSRUxFU1NfRVhUIDwgMTcKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IEJzc0xlbjsKKyNlbHNlCisgICAgICAgICAgICBpZiAoQnNzTGVuID4gd3JxLT51LmRhdGEubGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGtmcmVlKHBCc3NpZExpc3QpOworICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gQnNzTGVuOworI2VuZGlmCisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcEJzc2lkTGlzdCwgQnNzTGVuKTsKKyAgICAgICAgICAgIGtmcmVlKHBCc3NpZExpc3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8zX0NVUlJFTlRfQUREUkVTUzoKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IE1BQ19BRERSX0xFTjsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkN1cnJlbnRBZGRyZXNzLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEX0dFTl9NRURJQV9DT05ORUNUX1NUQVRVUzoKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+SW5kaWNhdGVNZWRpYVN0YXRlID09IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkKQorICAgICAgICAgICAgICAgIE1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7CisKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihORElTX01FRElBX1NUQVRFKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmTWVkaWFTdGF0ZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQlNTSUQ6CisjaWZkZWYgUkFMSU5LX0FURQorCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVGhlIGRyaXZlciBpcyBpbiBBVEUgbW9kZSBub3dcbiIpKTsKKwkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7CisJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworICAgICAgICAgICAgaWYgKElORlJBX09OKHBBZGFwdGVyKSB8fCBBREhPQ19PTihwQWRhcHRlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLkJzc2lkLCBzaXplb2YoTkRJU184MDJfMTFfTUFDX0FERFJFU1MpKTsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0JTU0lEKD1FTVBUWSlcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PVENPTk47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1NTSUQ6CisJCQlOZGlzWmVyb01lbW9yeSgmU3NpZCwgc2l6ZW9mKE5ESVNfODAyXzExX1NTSUQpKTsKKwkJCU5kaXNaZXJvTWVtb3J5KFNzaWQuU3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKKyAgICAgICAgICAgIFNzaWQuU3NpZExlbmd0aCA9IHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbjsKKwkJCW1lbWNweShTc2lkLlNzaWQsIHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZCwJU3NpZC5Tc2lkTGVuZ3RoKTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9TU0lEKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmU3NpZCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1NTSUQgKExlbj0lZCwgc3NpZD0lcylcbiIsIFNzaWQuU3NpZExlbmd0aCxTc2lkLlNzaWQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfTElOS19TVEFUVVM6CisgICAgICAgICAgICBwTGlua1N0YXR1cyA9IChSVF84MDJfMTFfTElOS19TVEFUVVMgKikga21hbGxvYyhzaXplb2YoUlRfODAyXzExX0xJTktfU1RBVFVTKSwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYgKHBMaW5rU3RhdHVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBMaW5rU3RhdHVzLT5DdXJyVHhSYXRlID0gUmF0ZUlkVG81MDBLYnBzW3BBZGFwdGVyLT5Db21tb25DZmcuVHhSYXRlXTsgICAvLyB1bml0IDogNTAwIGticHMKKyAgICAgICAgICAgICAgICBwTGlua1N0YXR1cy0+Q2hhbm5lbFF1YWxpdHkgPSBwQWRhcHRlci0+TWxtZS5DaGFubmVsUXVhbGl0eTsKKyAgICAgICAgICAgICAgICBwTGlua1N0YXR1cy0+UnhCeXRlQ291bnQgPSBwQWRhcHRlci0+UmFsaW5rQ291bnRlcnMuUmVjZWl2ZWRCeXRlQ291bnQ7CisgICAgICAgICAgICAgICAgcExpbmtTdGF0dXMtPlR4Qnl0ZUNvdW50ID0gcEFkYXB0ZXItPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQnl0ZUNvdW50OworICAgICAgICAJCXBMaW5rU3RhdHVzLT5DZW50cmFsQ2hhbm5lbCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWw7CisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJUXzgwMl8xMV9MSU5LX1NUQVRVUyk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBMaW5rU3RhdHVzLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGtmcmVlKHBMaW5rU3RhdHVzKTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9MSU5LX1NUQVRVU1xuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0xJTktfU1RBVFVTKGttYWxsb2MgZmFpbGVkKVxuIikpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0NPTkZJR1VSQVRJT046CisgICAgICAgICAgICBwQ29uZmlndXJhdGlvbiA9IChORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OICopIGttYWxsb2Moc2l6ZW9mKE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04pLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZiAocENvbmZpZ3VyYXRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcENvbmZpZ3VyYXRpb24tPkxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OKTsKKyAgICAgICAgICAgICAgICBwQ29uZmlndXJhdGlvbi0+QmVhY29uUGVyaW9kID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5CZWFjb25QZXJpb2Q7CisgICAgICAgICAgICAgICAgcENvbmZpZ3VyYXRpb24tPkFUSU1XaW5kb3cgPSBwQWRhcHRlci0+U3RhQWN0aXZlLkF0aW1XaW47CisgICAgICAgICAgICAgICAgTUFQX0NIQU5ORUxfSURfVE9fS0haKHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCwgcENvbmZpZ3VyYXRpb24tPkRTQ29uZmlnKTsKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfQ09ORklHVVJBVElPTik7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBDb25maWd1cmF0aW9uLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0NPTkZJR1VSQVRJT04oQmVhY29uUGVyaW9kPSVsZCxBdGltVz0lbGQsQ2hhbm5lbD0lZCkgXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb25maWd1cmF0aW9uLT5CZWFjb25QZXJpb2QsIHBDb25maWd1cmF0aW9uLT5BVElNV2luZG93LCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJCQlrZnJlZShwQ29uZmlndXJhdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQ09ORklHVVJBVElPTihrbWFsbG9jIGZhaWxlZClcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TTlJfMDoKKwkJCWlmICgocEFkYXB0ZXItPlN0YUNmZy5MYXN0U05SMCA+IDApKQorCQkJeworCQkJCXVsSW5mbyA9ICgoMHhlYgktIHBBZGFwdGVyLT5TdGFDZmcuTGFzdFNOUjApICogMykgLwkxNiA7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sCXdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfU05SXzAoMHg9JWx4KVxuIiwgdWxJbmZvKSk7CisJCQl9CisgICAgICAgICAgICBlbHNlCisJCQkgICAgU3RhdHVzID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfU05SXzE6CisJCQlpZiAoKHBBZGFwdGVyLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aAk+IDEpICYmCisgICAgICAgICAgICAgICAgKHBBZGFwdGVyLT5TdGFDZmcuTGFzdFNOUjEgPiAwKSkKKwkJCXsKKwkJCQl1bEluZm8gPSAoKDB4ZWIJLSBwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTTlIxKSAqIDMpIC8JMTYgOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUXVlcnk6OlJUX09JRF84MDJfMTFfU05SXzEoMHg9JWx4KVxuIix1bEluZm8pKTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TTlJfMShwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTTlIxPSVkKVxuIixwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTTlIxKSk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1JTU0lfVFJJR0dFUjoKKyAgICAgICAgICAgIHVsSW5mbyA9IHBBZGFwdGVyLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAgLSBwQWRhcHRlci0+QmJwUnNzaVRvRGJtRGVsdGE7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfUlNTSV9UUklHR0VSKD0lbGQpXG4iLCB1bEluZm8pKTsKKyAgICAgICAgICAgIGJyZWFrOworCQljYXNlIE9JRF84MDJfMTFfUlNTSToKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1JTU0k6CisJCQl1bEluZm8gPSBwQWRhcHRlci0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywJd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfUlNTSV8xOgorICAgICAgICAgICAgdWxJbmZvID0gcEFkYXB0ZXItPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sCXdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1JTU0lfMjoKKyAgICAgICAgICAgIHVsSW5mbyA9IHBBZGFwdGVyLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTI7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9TVEFUSVNUSUNTOgorICAgICAgICAgICAgcFN0YXRpc3RpY3MgPSAoTkRJU184MDJfMTFfU1RBVElTVElDUyAqKSBrbWFsbG9jKHNpemVvZihORElTXzgwMl8xMV9TVEFUSVNUSUNTKSwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYgKHBTdGF0aXN0aWNzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1NUQVRJU1RJQ1MgXG4iKSk7CisgICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBtb3N0IHVwLXRvLWRhdGUgaC93IHJhdyBjb3VudGVycyBpbnRvIHNvZnR3YXJlIGNvdW50ZXJzCisJCQkgICAgTklDVXBkYXRlUmF3Q291bnRlcnMocEFkYXB0ZXIpOworCisgICAgICAgICAgICAgICAgLy8gU2FuaXR5IGNoZWNrIGZvciBjYWxjdWxhdGlvbiBvZiBzdWNlc3NmdWwgY291bnQKKyAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQgPCBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQuUXVhZFBhcnQpCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5SZXRyeUNvdW50LlF1YWRQYXJ0OworCisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5NdWx0aWNhc3RUcmFuc21pdHRlZEZyYW1lQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLk11bHRpY2FzdFRyYW5zbWl0dGVkRnJhbWVDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+RmFpbGVkQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkZhaWxlZENvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5SZXRyeUNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5SZXRyeUNvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5NdWx0aXBsZVJldHJ5Q291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLk11bHRpcGxlUmV0cnlDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+UlRTU3VjY2Vzc0NvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5SVFNTdWNjZXNzQ291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPlJUU0ZhaWx1cmVDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUlRTRmFpbHVyZUNvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5BQ0tGYWlsdXJlQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkFDS0ZhaWx1cmVDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+RnJhbWVEdXBsaWNhdGVDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuRnJhbWVEdXBsaWNhdGVDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+UmVjZWl2ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5SZWNlaXZlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPk11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuTXVsdGljYXN0UmVjZWl2ZWRGcmFtZUNvdW50LlF1YWRQYXJ0OworI2lmZGVmIERCRworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5GQ1NFcnJvckNvdW50ID0gcEFkYXB0ZXItPlJhbGlua0NvdW50ZXJzLlJlYWxGY3NFcnJDb3VudDsKKyNlbHNlCisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPkZDU0Vycm9yQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPkZyYW1lRHVwbGljYXRlQ291bnQudS5Mb3dQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5GcmFtZUR1cGxpY2F0ZUNvdW50LnUuTG93UGFydCAvIDEwMDsKKyNlbmRpZgorICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9TVEFUSVNUSUNTKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFN0YXRpc3RpY3MsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAga2ZyZWUocFN0YXRpc3RpY3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1NUQVRJU1RJQ1Moa21hbGxvYyBmYWlsZWQpXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF9HRU5fUkNWX09LOgorICAgICAgICAgICAgdWxJbmZvID0gcEFkYXB0ZXItPkNvdW50ZXJzODAyMy5Hb29kUmVjZWl2ZXM7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEX0dFTl9SQ1ZfTk9fQlVGRkVSOgorICAgICAgICAgICAgdWxJbmZvID0gcEFkYXB0ZXItPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUEhZX01PREU6CisgICAgICAgICAgICB1bEluZm8gPSAoVUxPTkcpcEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1BIWV9NT0RFICg9JWxkKVxuIiwgdWxJbmZvKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1NUQV9DT05GSUc6CisgICAgICAgICAgICBwU3RhQ29uZmlnID0gKFJUXzgwMl8xMV9TVEFfQ09ORklHICopIGttYWxsb2Moc2l6ZW9mKFJUXzgwMl8xMV9TVEFfQ09ORklHKSwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYgKHBTdGFDb25maWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfU1RBX0NPTkZJR1xuIikpOworICAgICAgICAgICAgICAgIHBTdGFDb25maWctPkVuYWJsZVR4QnVyc3QgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0OworICAgICAgICAgICAgICAgIHBTdGFDb25maWctPkVuYWJsZVR1cmJvUmF0ZSA9IDA7CisgICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+VXNlQkdQcm90ZWN0aW9uID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb247CisgICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+VXNlU2hvcnRTbG90VGltZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWU7CisgICAgICAgICAgICAgICAgLy9wU3RhQ29uZmlnLT5BZGhvY01vZGUgPSBwQWRhcHRlci0+U3RhQ2ZnLkFkaG9jTW9kZTsKKyAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5Id1JhZGlvU3RhdHVzID0gKHBBZGFwdGVyLT5TdGFDZmcuYkh3UmFkaW8gPT0gVFJVRSkgPyAxIDogMDsKKyAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5Sc3YxID0gMDsKKyAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5TeXN0ZW1FcnJvckJpdG1hcCA9IHBBZGFwdGVyLT5TeXN0ZW1FcnJvckJpdG1hcDsKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUlRfODAyXzExX1NUQV9DT05GSUcpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwU3RhQ29uZmlnLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGtmcmVlKHBTdGFDb25maWcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NUQV9DT05GSUcoa21hbGxvYyBmYWlsZWQpXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIFJ0c1RocmVzaCA9IHBBZGFwdGVyLT5Db21tb25DZmcuUnRzVGhyZXNob2xkOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJ0c1RocmVzaCk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJlJ0c1RocmVzaCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1JUU19USFJFU0hPTEQoPSVsZClcbiIsIFJ0c1RocmVzaCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIEZyYWdUaHJlc2ggPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkOworICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9PSBUUlVFKQorICAgICAgICAgICAgICAgIEZyYWdUaHJlc2ggPSAwOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKEZyYWdUaHJlc2gpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZGcmFnVGhyZXNoLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQoPSVsZClcbiIsIEZyYWdUaHJlc2gpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfUE9XRVJfTU9ERToKKyAgICAgICAgICAgIFBvd2VyTW9kZSA9IHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihQb3dlck1vZGUpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZQb3dlck1vZGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9QT1dFUl9NT0RFKD0lZClcbiIsIFBvd2VyTW9kZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9SQURJTzoKKyAgICAgICAgICAgIFJhZGlvU3RhdGUgPSAoQk9PTEVBTikgcEFkYXB0ZXItPlN0YUNmZy5iU3dSYWRpbzsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSYWRpb1N0YXRlKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmUmFkaW9TdGF0ZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX1JBRElPICg9JWQpXG4iLCBSYWRpb1N0YXRlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREU6CisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKKyAgICAgICAgICAgICAgICBCc3NUeXBlID0gTmRpczgwMl8xMUlCU1M7CisgICAgICAgICAgICBlbHNlIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0lORlJBKQorICAgICAgICAgICAgICAgIEJzc1R5cGUgPSBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmU7CisgICAgICAgICAgICBlbHNlIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX01PTklUT1IpCisgICAgICAgICAgICAgICAgQnNzVHlwZSA9IE5kaXM4MDJfMTFNb25pdG9yOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEJzc1R5cGUgPSBOZGlzODAyXzExQXV0b1Vua25vd247CisKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihCc3NUeXBlKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmQnNzVHlwZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREUoPSVkKVxuIiwgQnNzVHlwZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9QUkVBTUJMRToKKyAgICAgICAgICAgIFByZWFtVHlwZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuVHhQcmVhbWJsZTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihQcmVhbVR5cGUpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZQcmVhbVR5cGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9QUkVBTUJMRSg9JWQpXG4iLCBQcmVhbVR5cGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERToKKyAgICAgICAgICAgIEF1dGhNb2RlID0gcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihBdXRoTW9kZSk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJkF1dGhNb2RlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSg9JWQpXG4iLCBBdXRoTW9kZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9XRVBfU1RBVFVTOgorICAgICAgICAgICAgV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoV2VwU3RhdHVzKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmV2VwU3RhdHVzLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfV0VQX1NUQVRVUyg9JWQpXG4iLCBXZXBTdGF0dXMpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUw6CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTCAleFxuIixwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXIpKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUxfMToKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTF8xICg9JWxkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSkpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVTX1NVUFBPUlRFRDoKKwkJCWlmICgocEFkYXB0ZXItPlJmSWNUeXBlCT09IFJGSUNfMjg1MCkgfHwgKHBBZGFwdGVyLT5SZkljVHlwZSA9PQlSRklDXzI3NTApKQorCQkJeworCQkJCU5ldHdvcmtUeXBlTGlzdFswXSA9IDM7ICAgICAgICAgICAgICAgICAvLyBOdW1iZXJPZkl0ZW1zID0gMworCQkJCU5ldHdvcmtUeXBlTGlzdFsxXSA9IE5kaXM4MDJfMTFEUzsgICAgICAvLyBOZXR3b3JrVHlwZVsxXSA9IDExYgorCQkJCU5ldHdvcmtUeXBlTGlzdFsyXSA9IE5kaXM4MDJfMTFPRkRNMjQ7ICAvLyBOZXR3b3JrVHlwZVsyXSA9IDExZworCQkJCU5ldHdvcmtUeXBlTGlzdFszXSA9IE5kaXM4MDJfMTFPRkRNNTsgICAvLyBOZXR3b3JrVHlwZVszXSA9IDExYQorICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IDE2OworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmTmV0d29ya1R5cGVMaXN0WzBdLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCU5ldHdvcmtUeXBlTGlzdFswXSA9IDI7ICAgICAgICAgICAgICAgICAvLyBOdW1iZXJPZkl0ZW1zID0gMgorCQkJCU5ldHdvcmtUeXBlTGlzdFsxXSA9IE5kaXM4MDJfMTFEUzsgICAgICAvLyBOZXR3b3JrVHlwZVsxXSA9IDExYgorCQkJCU5ldHdvcmtUeXBlTGlzdFsyXSA9IE5kaXM4MDJfMTFPRkRNMjQ7ICAvLyBOZXR3b3JrVHlwZVsyXSA9IDExZworCQkJICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IDEyOworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmTmV0d29ya1R5cGVMaXN0WzBdLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJfQorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfTkVUV09SS19UWVBFU19TVVBQT1JURURcbiIpKTsKKwkJCQlicmVhazsKKwkgICAgY2FzZSBPSURfODAyXzExX05FVFdPUktfVFlQRV9JTl9VU0U6CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBKQorCQkJCXVsSW5mbyA9IE5kaXM4MDJfMTFPRkRNNTsKKwkJCWVsc2UgaWYgKChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQkdfTUlYRUQpIHx8IChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExRykpCisJCQkJdWxJbmZvID0gTmRpczgwMl8xMU9GRE0yNDsKKwkJCWVsc2UKKwkJCQl1bEluZm8gPSBOZGlzODAyXzExRFM7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfTEFTVF9SWF9SQVRFOgorICAgICAgICAgICAgdWxJbmZvID0gKFVMT05HKXBBZGFwdGVyLT5MYXN0UnhSYXRlOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfUlhfUkFURSAoPSVsZClcbiIsIHVsSW5mbykpOworCQkJYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9MQVNUX1RYX1JBVEU6CisJCQkvL3VsSW5mbyA9IChVTE9ORylwQWRhcHRlci0+TGFzdFR4UmF0ZTsKKwkJCXVsSW5mbyA9IChVTE9ORylwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQ7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfTEFTVF9UWF9SQVRFICg9JWx4KVxuIiwgdWxJbmZvKSk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0VFUFJPTV9WRVJTSU9OOgorICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkVlcHJvbVZlcnNpb24sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0ZJUk1XQVJFX1ZFUlNJT046CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+RmlybXdhcmVWZXJzaW9uLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisJICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9OT0lTRV9MRVZFTDoKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5CYnBXcml0ZUxhdGNoWzY2XSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX05PSVNFX0xFVkVMICg9JWQpXG4iLCBwQWRhcHRlci0+QmJwV3JpdGVMYXRjaFs2Nl0pKTsKKwkJCWJyZWFrOworCSAgICBjYXNlIFJUX09JRF84MDJfMTFfRVhUUkFfSU5GTzoKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5FeHRyYUluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9FWFRSQV9JTkZPICg9JWxkKVxuIiwgcEFkYXB0ZXItPkV4dHJhSW5mbykpOworCSAgICAgICAgYnJlYWs7CisJICAgIGNhc2UgUlRfT0lEX1dFX1ZFUlNJT05fQ09NUElMRUQ6CisJICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUlOVCk7CisJICAgICAgICB3ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOworCSAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ3ZV92ZXJzaW9uX2NvbXBpbGVkLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCSAgICAgICAgYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9BUFNEX1NFVFRJTkc6CisJCQlhcHNkID0gKHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlIHwgKHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CRSA8PCAxKSB8IChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQksgPDwgMikKKwkJCQl8IChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkgPDwgMykJfCAocEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZPIDw8IDQpCXwgKHBBZGFwdGVyLT5Db21tb25DZmcuTWF4U1BMZW5ndGggPDwgNSkpOworCisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZhcHNkLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfQVBTRF9TRVRUSU5HICg9MHglbHgsQVBTRENhcD0lZCxBQ19CRT0lZCxBQ19CSz0lZCxBQ19WST0lZCxBQ19WTz0lZCxNQVhTUExlbj0lZClcbiIsCisJCQkJYXBzZCxwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSxwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUscEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX0JLLHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WSSxwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8scEFkYXB0ZXItPkNvbW1vbkNmZy5NYXhTUExlbmd0aCkpOworCQkJYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9BUFNEX1BTTToKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0FQU0RfUFNNICg9JWQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpKTsKKwkJCWJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfV01NOgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKEJPT0xFQU4pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfV01NICg9JWQpXG4iLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKSk7CisJCQlicmVhazsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgIGNhc2UgUlRfT0lEX05FV19EUklWRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVUNIQVIgZW5hYmxlZCA9IDE7CisgICAgCSAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKyAgICAJICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJmVuYWJsZWQsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF9ORVdfRFJJVkVSICg9JWQpXG4iLCBlbmFibGVkKSk7CisgICAgICAgICAgICB9CisJICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVDoKKwkgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisJICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUICg9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkpOworCSAgICAgICAgYnJlYWs7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisgICAgICAgIGNhc2UgUlRfT0lEX0RSSVZFUl9ERVZJQ0VfTkFNRToKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfRFJJVkVSX0RFVklDRV9OQU1FIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gMTY7CisJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBBZGFwdGVyLT5TdGFDZmcuZGV2X25hbWUsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisJCQl7CisJCQkJU3RhdHVzID0gLUVGQVVMVDsKKwkJCX0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfSFRfUEhZTU9ERToKKyAgICAgICAgICAgIHBIVFBoeU1vZGUgPSAoT0lEX1NFVF9IVF9QSFlNT0RFICopIGttYWxsb2Moc2l6ZW9mKE9JRF9TRVRfSFRfUEhZTU9ERSksIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmIChwSFRQaHlNb2RlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBIVFBoeU1vZGUtPlBoeU1vZGUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGU7CisgICAgCQkJcEhUUGh5TW9kZS0+SHRNb2RlID0gKFVDSEFSKXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERTsKKyAgICAJCQlwSFRQaHlNb2RlLT5CVyA9IChVQ0hBUilwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLkJXOworICAgIAkJCXBIVFBoeU1vZGUtPk1DUz0gKFVDSEFSKXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTOworICAgIAkJCXBIVFBoeU1vZGUtPlNIT1JUR0k9IChVQ0hBUilwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLlNob3J0R0k7CisgICAgCQkJcEhUUGh5TW9kZS0+U1RCQz0gKFVDSEFSKXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuU1RCQzsKKworICAgIAkJCXBIVFBoeU1vZGUtPkV4dE9mZnNldCA9ICgocEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA8IHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCkgPyAoRVhUQ0hBX0JFTE9XKSA6IChFWFRDSEFfQUJPVkUpKTsKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoT0lEX1NFVF9IVF9QSFlNT0RFKTsKKyAgICAgICAgICAgICAgICBpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBIVFBoeU1vZGUsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgCQkJeworICAgIAkJCQlTdGF0dXMgPSAtRUZBVUxUOworICAgIAkJCX0KKyAgICAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9IVF9QSFlNT0RFIChQaHlNb2RlID0gJWQsIE1DUyA9JWQsIEJXID0gJWQsIFNUQkMgPSAlZCwgRXh0T2Zmc2V0PSVkKVxuIiwKKyAgICAJCQkJcEhUUGh5TW9kZS0+SHRNb2RlLCBwSFRQaHlNb2RlLT5NQ1MsIHBIVFBoeU1vZGUtPkJXLCBwSFRQaHlNb2RlLT5TVEJDLCBwSFRQaHlNb2RlLT5FeHRPZmZzZXQpKTsKKyAgICAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgTWxtZVVwZGF0ZVR4UmF0ZXMgKC53b3JkID0gJXggKVxuIiwgcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS53b3JkKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfU1RBX0NPTkZJRyhrbWFsbG9jIGZhaWxlZClcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9DT1VOVFJZX1JFR0lPTjoKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX0NPVU5UUllfUkVHSU9OIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisgICAgICAgICAgICB1bEluZm8gPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZDsKKyAgICAgICAgICAgIHVsSW5mbyA9ICh1bEluZm8gPDwgOCl8KHBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbik7CisJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICB7CisJCQkJU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfREFUX0hUX1BIWU1PREU6CisgICAgICAgICAgICBwSFRQaHlNb2RlID0gKE9JRF9TRVRfSFRfUEhZTU9ERSAqKSBrbWFsbG9jKHNpemVvZihPSURfU0VUX0hUX1BIWU1PREUpLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZiAocEhUUGh5TW9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwSFRQaHlNb2RlLT5QaHlNb2RlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlOworICAgIAkJCXBIVFBoeU1vZGUtPkh0TW9kZSA9IChVQ0hBUilwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREU7CisgICAgCQkJcEhUUGh5TW9kZS0+QlcgPSAoVUNIQVIpcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlc7CisgICAgCQkJcEhUUGh5TW9kZS0+TUNTPSAoVUNIQVIpcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUzsKKyAgICAJCQlwSFRQaHlNb2RlLT5TSE9SVEdJPSAoVUNIQVIpcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSTsKKyAgICAJCQlwSFRQaHlNb2RlLT5TVEJDPSAoVUNIQVIpcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQzsKKworICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihPSURfU0VUX0hUX1BIWU1PREUpOworICAgICAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcEhUUGh5TW9kZSwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAJCQl7CisgICAgCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisgICAgCQkJfQorICAgIAkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0hUX1BIWU1PREUgKFBoeU1vZGUgPSAlZCwgTUNTID0lZCwgQlcgPSAlZCwgU1RCQyA9ICVkLCBFeHRPZmZzZXQ9JWQpXG4iLAorICAgIAkJCQlwSFRQaHlNb2RlLT5IdE1vZGUsIHBIVFBoeU1vZGUtPk1DUywgcEhUUGh5TW9kZS0+QlcsIHBIVFBoeU1vZGUtPlNUQkMsIHBIVFBoeU1vZGUtPkV4dE9mZnNldCkpOworICAgIAkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNbG1lVXBkYXRlVHhSYXRlcyAoLndvcmQgPSAleCApXG4iLCBwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHKGttYWxsb2MgZmFpbGVkKVxuIikpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfUVVFUllfTVVMVElQTEVfQ0FSRF9TVVBQT1JUOgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKyAgICAgICAgICAgIGkgPSAwOworI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAorICAgICAgICAgICAgaSA9IDE7CisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZpLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgeworCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEX1FVRVJZX01VTFRJUExFX0NBUkRfU1VQUE9SVCg9JWQpIFxuIiwgaSkpOworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgU05NUF9TVVBQT1JUCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9NQUNfQUREUkVTUzoKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IE1BQ19BRERSX0xFTjsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkN1cnJlbnRBZGRyZXNzLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX01BTlVGQUNUVVJFUk9VSToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX01BTlVGQUNUVVJFUk9VSSBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IE1hbnVmYWN0dXJlck9VSV9MRU47CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5DdXJyZW50QWRkcmVzcywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRVJOQU1FOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVSTkFNRSBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihNYW51ZmFjdHVyZXJOQU1FKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBNYW51ZmFjdHVyZXJOQU1FLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1JFU09VUkNFVFlQRUlETkFNRToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1JFU09VUkNFVFlQRUlETkFNRSBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihSZXNvdXJjZVR5cGVJZE5hbWUpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIFJlc291cmNlVHlwZUlkTmFtZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9QUklWQUNZT1BUSU9OSU1QTEVNRU5URUQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9QUklWQUNZT1BUSU9OSU1QTEVNRU5URUQgXG4iKSk7CisJCQl1bEluZm8gPSAxOyAvLyAxIGlzIHN1cHBvcnQgd2VwIGVsc2UgMiBpcyBub3Qgc3VwcG9ydC4KKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfUE9XRVJNQU5BR0VNRU5UTU9ERToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1BPV0VSTUFOQUdFTUVOVE1PREUgXG4iKSk7CisJCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5Qc20gPT0gUFNNUF9BQ1RJT04pCisJCQkJdWxJbmZvID0gMTsgLy8gMSBpcyBwb3dlciBhY3RpdmUgZWxzZSAyIGlzIHBvd2VyIHNhdmUuCisJCQllbHNlCisJCQkJdWxJbmZvID0gMjsKKworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZVkFMVUU6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZVkFMVUUgXG4iKSk7CisJCQkvL0tleUlkeFZhbHVlLktleUlkeCA9IHBBZC0+UG9ydENmZy5NQlNTSURbcEFkLT5Jb2N0bElGXS5EZWZhdWx0S2V5SWQ7CisJCQlwS2V5SWR4VmFsdWUgPSB3cnEtPnUuZGF0YS5wb2ludGVyOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJLZXlJZHhWYWx1ZS5LZXlJZHggPSAlZCwgXG4iLHBLZXlJZHhWYWx1ZS0+S2V5SWR4KSk7CisJCQl2YWx1ZUxlbiA9IHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbjsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBLZXlJZHhWYWx1ZS0+VmFsdWUsCisJCQkJCQkgICAmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LAorCQkJCQkJICAgdmFsdWVMZW4pOworCQkJcEtleUlkeFZhbHVlLT5WYWx1ZVt2YWx1ZUxlbl09J1wwJzsKKworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKERlZmF1bHRLZXlJZHhWYWx1ZSk7CisKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwS2V5SWR4VmFsdWUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRlZmF1bHRLZXlJZCA9ICVkLCB0b3RhbCBsZW4gPSAlZCwgc3RyIGxlbj0lZCwgS2V5VmFsdWU9ICUwMnggJTAyeCAlMDJ4ICUwMnggXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwgd3JxLT51LmRhdGEubGVuZ3RoLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4sCisJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleVswXSwKKwkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5WzBdLAorCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXlbMF0sCisJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleVswXSkpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX1dFUERFRkFVTFRLRVlJRDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1dFUERFRkFVTFRLRVlJRCBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRGVmYXVsdEtleUlkID0lZCBcbiIsIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkKSk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfV0VQS0VZTUFQUElOR0xFTkdUSDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1dFUEtFWU1BUFBJTkdMRU5HVEggXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsCisJCQkJCQkJCQkmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuLAorCQkJCQkJCQkJd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9TSE9SVFJFVFJZTElNSVQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9TSE9SVFJFVFJZTElNSVQgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOworCQkJU2hvcnRSZXRyeUxpbWl0ID0gdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJ0eUxpbWl0OworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2hvcnRSZXRyeUxpbWl0ID0lbGQsICB0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UmV0cnlMaW1pdD0lZFxuIiwgU2hvcnRSZXRyeUxpbWl0LCB0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UnR5TGltaXQpKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmU2hvcnRSZXRyeUxpbWl0LCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0xPTkdSRVRSWUxJTUlUOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfTE9OR1JFVFJZTElNSVQgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOworCQkJTG9uZ1JldHJ5TGltaXQgPSB0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdDsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkxvbmdSZXRyeUxpbWl0ID0lbGQsICB0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdD0lZFxuIiwgTG9uZ1JldHJ5TGltaXQsIHR4X3J0eV9jZmcuZmllbGQuTG9uZ1J0eUxpbWl0KSk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJkxvbmdSZXRyeUxpbWl0LCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1BST0RVQ1RJRDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1BST0RVQ1RJRCBcbiIpKTsKKworI2lmZGVmIFJUMjg2MAorCQkJeworCisJCQkJVVNIT1JUICBkZXZpY2VfaWQ7CisJCQkJaWYgKCgoUE9TX0NPT0tJRSlwQWRhcHRlci0+T1NfQ29va2llKS0+cGNpX2RldiAhPSBOVUxMKQorCQkJICAgIAlwY2lfcmVhZF9jb25maWdfd29yZCgoKFBPU19DT09LSUUpcEFkYXB0ZXItPk9TX0Nvb2tpZSktPnBjaV9kZXYsIFBDSV9ERVZJQ0VfSUQsICZkZXZpY2VfaWQpOworCQkJCWVsc2UKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIHBjaV9kZXYgPSBOVUxMXG4iKSk7CisJCQkJc3ByaW50Zih0bXAsICIlMDR4ICUwNHhcbiIsIE5JQ19QQ0lfVkVORE9SX0lELCBkZXZpY2VfaWQpOworCQkJfQorI2VuZGlmIC8vIFJUMjg2MCAvLworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKHRtcCk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgdG1wLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX01BTlVGQUNUVVJFSUQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRUlEIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKE1hbnVmYWN0dXJlck5BTUUpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIE1hbnVmYWN0dXJlck5BTUUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfQ1VSUkVOVENIQU5ORUw6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9DVVJSRU5UQ0hBTk5FTCBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJzaXplb2YgVUNIQVI9JWQsIGNoYW5uZWw9JWQgXG4iLCBzaXplb2YoVUNIQVIpLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3RhdHVzPSVkXG4iLCBTdGF0dXMpKTsKKwkJCWJyZWFrOworI2VuZGlmIC8vU05NUF9TVVBQT1JUCisKKwkJY2FzZSBPSURfODAyXzExX0JVSUxEX0NIQU5ORUxfRVg6CisJCQl7CisJCQkJVUNIQVIgdmFsdWU7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQlVJTERfQ0hBTk5FTF9FWCBcbiIpKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTdXBwb3J0IEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QuXG4iKSk7CisJCQkJdmFsdWUgPSAxOworI2Vsc2UKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEb2Vzbid0IHN1cHBvcnQgRVhUX0JVSUxEX0NIQU5ORUxfTElTVC5cbiIpKTsKKwkJCQl2YWx1ZSA9IDA7CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdmFsdWUsIDEpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN0YXR1cz0lZFxuIiwgU3RhdHVzKSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfR0VUX0NIX0xJU1Q6CisJCQl7CisJCQkJUFJUX0NIQU5ORUxfTElTVF9JTkZPIHBDaExpc3RCdWY7CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9HRVRfQ0hfTElTVCBcbiIpKTsKKwkJCQlpZiAocEFkYXB0ZXItPkNoYW5uZWxMaXN0TnVtID09IDApCisJCQkJeworCQkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAwOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlwQ2hMaXN0QnVmID0gKFJUX0NIQU5ORUxfTElTVF9JTkZPICopIGttYWxsb2Moc2l6ZW9mKFJUX0NIQU5ORUxfTElTVF9JTkZPKSwgTUVNX0FMTE9DX0ZMQUcpOworCQkJCWlmIChwQ2hMaXN0QnVmID09IE5VTEwpCisJCQkJeworCQkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAwOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlwQ2hMaXN0QnVmLT5DaGFubmVsTGlzdE51bSA9IHBBZGFwdGVyLT5DaGFubmVsTGlzdE51bTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgcENoTGlzdEJ1Zi0+Q2hhbm5lbExpc3ROdW07IGkrKykKKwkJCQkJcENoTGlzdEJ1Zi0+Q2hhbm5lbExpc3RbaV0gPSBwQWRhcHRlci0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbDsKKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSVF9DSEFOTkVMX0xJU1RfSU5GTyk7CisJCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBDaExpc3RCdWYsIHNpemVvZihSVF9DSEFOTkVMX0xJU1RfSU5GTykpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN0YXR1cz0lZFxuIiwgU3RhdHVzKSk7CisKKwkJCQlpZiAocENoTGlzdEJ1ZikKKwkJCQkJa2ZyZWUocENoTGlzdEJ1Zik7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfR0VUX0NPVU5UUllfQ09ERToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0dFVF9DT1VOVFJZX0NPREUgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAyOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlLCAyKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN0YXR1cz0lZFxuIiwgU3RhdHVzKSk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfR0VUX0NIQU5ORUxfR0VPR1JBUEhZOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfR0VUX0NIQU5ORUxfR0VPR1JBUEhZIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gMTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5HZW9ncmFwaHksIDEpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3RhdHVzPSVkXG4iLCBTdGF0dXMpKTsKKwkJCWJyZWFrOworCisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0RMUzoKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihCT09MRUFOKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0RMUyg9JWQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKSk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfRExTX1BBUkFNOgorCQkJeworCQkJCVBSVF84MDJfMTFfRExTX0lORk8JcERsc0luZm8gPSBrbWFsbG9jKHNpemVvZihSVF84MDJfMTFfRExTX0lORk8pLCBHRlBfQVRPTUlDKTsKKwkJCQlpZiAocERsc0luZm8gPT0gTlVMTCkKKwkJCQkJYnJlYWs7CisKKwkJCQlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCQkJCXsKKwkJCQkJUlRNUE1vdmVNZW1vcnkoJnBEbHNJbmZvLT5FbnRyeVtpXSwgJnBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0sIHNpemVvZihSVF84MDJfMTFfRExTX1VJKSk7CisJCQkJfQorCisJCQkJcERsc0luZm8tPm51bSA9IE1BWF9OVU1fT0ZfRExTX0VOVFJZOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSVF84MDJfMTFfRExTX0lORk8pOworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwRGxzSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9ETFNfUEFSQU1cbiIpKTsKKworCQkJCWlmIChwRGxzSW5mbykKKwkJCQkJa2ZyZWUocERsc0luZm8pOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6dW5rbm93biBJT0NUTCdzIHN1YmNtZCA9IDB4JTA4eFxuIiwgY21kKSk7CisgICAgICAgICAgICBTdGF0dXMgPSAtRU9QTk9UU1VQUDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOworfQorCitJTlQgcnQyOHh4X3N0YV9pb2N0bCgKKwlJTglzdHJ1Y3QgbmV0X2RldmljZQkqbmV0X2RldiwKKwlJTglPVVQJc3RydWN0IGlmcmVxCSpycSwKKwlJTglJTlQJCQkJCWNtZCkKK3sKKwlQT1NfQ09PS0lFCQkJcE9iajsKKwlWSVJUVUFMX0FEQVBURVIJCSpwVmlydHVhbEFkID0gTlVMTDsKKwlSVE1QX0FEQVBURVIgICAgICAgICpwQWQgPSBOVUxMOworCXN0cnVjdCBpd3JlcSAgICAgICAgKndycSA9IChzdHJ1Y3QgaXdyZXEgKikgcnE7CisJQk9PTEVBTgkJCQlTdGF0ZU1hY2hpbmVUb3VjaGVkID0gRkFMU0U7CisJSU5UCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCVVTSE9SVAkJCQlzdWJjbWQ7CisKKwlpZiAobmV0X2Rldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCQlwQWQgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5tbF9wcml2OworCX0KKwlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisJaWYgKHBBZCA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPm1sX3ByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyNpZmRlZiBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVAorCSAgICBpZiAod3JxLT51LmRhdGEucG9pbnRlciA9PSBOVUxMKQorCSAgICB7CisJCSAgICByZXR1cm4gU3RhdHVzOworCSAgICB9CisKKwkgICAgaWYgKHN0cnN0cih3cnEtPnUuZGF0YS5wb2ludGVyLCAiT3BNb2RlIikgPT0gTlVMTCkKKyNlbmRpZiAvLyBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVCAvLworICAgICAgICB7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCSAgICByZXR1cm4gLUVORVRET1dOOworICAgICAgICB9CisgICAgfQorCisJewkvLyBkZXRlcm1pbmUgdGhpcyBpb2N0bCBjb21tYW5kIGlzIGNvbW1pbmcgZnJvbSB3aGljaCBpbnRlcmZhY2UuCisJCXBPYmotPmlvY3RsX2lmX3R5cGUgPSBJTlRfTUFJTjsKKwkJcE9iai0+aW9jdGxfaWYgPSBNQUlOX01CU1NJRDsKKwl9CisKKwlzd2l0Y2goY21kKQorCXsKKyNpZmRlZiBSQUxJTktfQVRFCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwkJY2FzZSBSVFBSSVZfSU9DVExfQVRFOgorCQkJeworCQkJCVJ0bXBEb0F0ZShwQWQsIHdycSk7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKyAgICAgICAgY2FzZSBTSU9DR0lGSFdBRERSOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU9DVEw6OlNJT0NHSUZIV0FERFJcbiIpKTsKKwkJCW1lbWNweSh3cnEtPnUubmFtZSwgcEFkLT5DdXJyZW50QWRkcmVzcywgRVRIX0FMRU4pOworCQkJYnJlYWs7CisJCWNhc2UgU0lPQ0dJV05BTUU6CisgICAgICAgIHsKKyAgICAgICAgCWNoYXIgKm5hbWU9JndycS0+dS5uYW1lWzBdOworICAgICAgICAJcnRfaW9jdGxfZ2l3bmFtZShuZXRfZGV2LCBOVUxMLCBuYW1lLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ0dJV0VTU0lEOiAgLy9HZXQgRVNTSUQKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BvaW50ICplc3NpZD0md3JxLT51LmVzc2lkOworICAgICAgICAJcnRfaW9jdGxfZ2l3ZXNzaWQobmV0X2RldiwgTlVMTCwgZXNzaWQsIGVzc2lkLT5wb2ludGVyKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ1NJV0VTU0lEOiAgLy9TZXQgRVNTSUQKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BvaW50CSplc3NpZD0md3JxLT51LmVzc2lkOworICAgICAgICAJcnRfaW9jdGxfc2l3ZXNzaWQobmV0X2RldiwgTlVMTCwgZXNzaWQsIGVzc2lkLT5wb2ludGVyKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ1NJV05XSUQ6ICAgLy8gc2V0IG5ldHdvcmsgaWQgKHRoZSBjZWxsKQorCQljYXNlIFNJT0NHSVdOV0lEOiAgIC8vIGdldCBuZXR3b3JrIGlkCisJCQlTdGF0dXMgPSAtRU9QTk9UU1VQUDsKKwkJCWJyZWFrOworCQljYXNlIFNJT0NTSVdGUkVROiAgIC8vc2V0IGNoYW5uZWwvZnJlcXVlbmN5IChIeikKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X2ZyZXEgKmZyZXE9JndycS0+dS5mcmVxOworICAgICAgICAJcnRfaW9jdGxfc2l3ZnJlcShuZXRfZGV2LCBOVUxMLCBmcmVxLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ0dJV0ZSRVE6ICAgLy8gZ2V0IGNoYW5uZWwvZnJlcXVlbmN5IChIeikKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X2ZyZXEgKmZyZXE9JndycS0+dS5mcmVxOworICAgICAgICAJcnRfaW9jdGxfZ2l3ZnJlcShuZXRfZGV2LCBOVUxMLCBmcmVxLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ1NJV05JQ0tOOiAvL3NldCBub2RlIG5hbWUvbmlja25hbWUKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BvaW50ICpkYXRhPSZ3cnEtPnUuZGF0YTsKKyAgICAgICAgCXJ0X2lvY3RsX3Npd25pY2tuKG5ldF9kZXYsIE5VTEwsIGRhdGEsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DR0lXTklDS046IC8vZ2V0IG5vZGUgbmFtZS9uaWNrbmFtZQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGE9JndycS0+dS5kYXRhOworICAgICAgICAJcnRfaW9jdGxfZ2l3bmlja24obmV0X2RldiwgTlVMTCwgZGF0YSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHSVdSQVRFOiAgIC8vZ2V0IGRlZmF1bHQgYml0IHJhdGUgKGJwcykKKwkJICAgIHJ0X2lvY3RsX2dpd3JhdGUobmV0X2RldiwgTlVMTCwgJndycS0+dSwgTlVMTCk7CisgICAgICAgICAgICBicmVhazsKKwkgICAgY2FzZSBTSU9DU0lXUkFURTogIC8vc2V0IGRlZmF1bHQgYml0IHJhdGUgKGJwcykKKwkgICAgICAgIHJ0X2lvY3RsX3Npd3JhdGUobmV0X2RldiwgTlVMTCwgJndycS0+dSwgTlVMTCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTSU9DR0lXUlRTOiAgLy8gZ2V0IFJUUy9DVFMgdGhyZXNob2xkIChieXRlcykKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BhcmFtICpydHM9JndycS0+dS5ydHM7CisgICAgICAgIAlydF9pb2N0bF9naXdydHMobmV0X2RldiwgTlVMTCwgcnRzLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisgICAgICAgIGNhc2UgU0lPQ1NJV1JUUzogIC8vc2V0IFJUUy9DVFMgdGhyZXNob2xkIChieXRlcykKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BhcmFtICpydHM9JndycS0+dS5ydHM7CisgICAgICAgIAlydF9pb2N0bF9zaXdydHMobmV0X2RldiwgTlVMTCwgcnRzLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisgICAgICAgIGNhc2UgU0lPQ0dJV0ZSQUc6ICAvL2dldCBmcmFnbWVudGF0aW9uIHRociAoYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wYXJhbSAqZnJhZz0md3JxLT51LmZyYWc7CisgICAgICAgIAlydF9pb2N0bF9naXdmcmFnKG5ldF9kZXYsIE5VTEwsIGZyYWcsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKyAgICAgICAgY2FzZSBTSU9DU0lXRlJBRzogIC8vc2V0IGZyYWdtZW50YXRpb24gdGhyIChieXRlcykKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BhcmFtICpmcmFnPSZ3cnEtPnUuZnJhZzsKKyAgICAgICAgCXJ0X2lvY3RsX3Npd2ZyYWcobmV0X2RldiwgTlVMTCwgZnJhZywgTlVMTCk7CisJCQlicmVhazsKKwkJfQorICAgICAgICBjYXNlIFNJT0NHSVdFTkNPREU6ICAvL2dldCBlbmNvZGluZyB0b2tlbiAmIG1vZGUKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BvaW50ICplcnE9JndycS0+dS5lbmNvZGluZzsKKyAgICAgICAgCWlmKGVycS0+cG9pbnRlcikKKyAgICAgICAgCQlydF9pb2N0bF9naXdlbmNvZGUobmV0X2RldiwgTlVMTCwgZXJxLCBlcnEtPnBvaW50ZXIpOworCQkJYnJlYWs7CisJCX0KKyAgICAgICAgY2FzZSBTSU9DU0lXRU5DT0RFOiAgLy9zZXQgZW5jb2RpbmcgdG9rZW4gJiBtb2RlCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wb2ludCAqZXJxPSZ3cnEtPnUuZW5jb2Rpbmc7CisgICAgICAgIAlpZihlcnEtPnBvaW50ZXIpCisgICAgICAgIAkJcnRfaW9jdGxfc2l3ZW5jb2RlKG5ldF9kZXYsIE5VTEwsIGVycSwgZXJxLT5wb2ludGVyKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ0dJV0FQOiAgICAgLy9nZXQgYWNjZXNzIHBvaW50IE1BQyBhZGRyZXNzZXMKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IHNvY2thZGRyICphcF9hZGRyPSZ3cnEtPnUuYXBfYWRkcjsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd2FwKG5ldF9kZXYsIE5VTEwsIGFwX2FkZHIsIGFwX2FkZHItPnNhX2RhdGEpOworCQkJYnJlYWs7CisJCX0KKwkgICAgY2FzZSBTSU9DU0lXQVA6ICAvL3NldCBhY2Nlc3MgcG9pbnQgTUFDIGFkZHJlc3NlcworICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3Qgc29ja2FkZHIgKmFwX2FkZHI9JndycS0+dS5hcF9hZGRyOworICAgICAgICAJcnRfaW9jdGxfc2l3YXAobmV0X2RldiwgTlVMTCwgYXBfYWRkciwgYXBfYWRkci0+c2FfZGF0YSk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHSVdNT0RFOiAgIC8vZ2V0IG9wZXJhdGlvbiBtb2RlCisgICAgICAgIHsKKyAgICAgICAgCV9fdTMyICptb2RlPSZ3cnEtPnUubW9kZTsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd21vZGUobmV0X2RldiwgTlVMTCwgbW9kZSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NTSVdNT0RFOiAgIC8vc2V0IG9wZXJhdGlvbiBtb2RlCisgICAgICAgIHsKKyAgICAgICAgCV9fdTMyICptb2RlPSZ3cnEtPnUubW9kZTsKKyAgICAgICAgCXJ0X2lvY3RsX3Npd21vZGUobmV0X2RldiwgTlVMTCwgbW9kZSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHSVdTRU5TOiAgIC8vZ2V0IHNlbnNpdGl2aXR5IChkQm0pCisJCWNhc2UgU0lPQ1NJV1NFTlM6CS8vc2V0IHNlbnNpdGl2aXR5IChkQm0pCisJCWNhc2UgU0lPQ0dJV1BPV0VSOiAgLy9nZXQgUG93ZXIgTWFuYWdlbWVudCBzZXR0aW5ncworCQljYXNlIFNJT0NTSVdQT1dFUjogIC8vc2V0IFBvd2VyIE1hbmFnZW1lbnQgc2V0dGluZ3MKKwkJY2FzZSBTSU9DR0lXVFhQT1c6ICAvL2dldCB0cmFuc21pdCBwb3dlciAoZEJtKQorCQljYXNlIFNJT0NTSVdUWFBPVzogIC8vc2V0IHRyYW5zbWl0IHBvd2VyIChkQm0pCisJCWNhc2UgU0lPQ0dJV1JBTkdFOgkvL0dldCByYW5nZSBvZiBwYXJhbWV0ZXJzCisJCWNhc2UgU0lPQ0dJV1JFVFJZOgkvL2dldCByZXRyeSBsaW1pdHMgYW5kIGxpZmV0aW1lCisJCWNhc2UgU0lPQ1NJV1JFVFJZOgkvL3NldCByZXRyeSBsaW1pdHMgYW5kIGxpZmV0aW1lCisJCQlTdGF0dXMgPSAtRU9QTk9UU1VQUDsKKwkJCWJyZWFrOworCQljYXNlIFJUX1BSSVZfSU9DVEw6CisJCQlzdWJjbWQgPSB3cnEtPnUuZGF0YS5mbGFnczsKKwkJCWlmKCBzdWJjbWQgJiBPSURfR0VUX1NFVF9UT0dHTEUpCisJCQkJU3RhdHVzID0gUlRNUFNldEluZm9ybWF0aW9uKHBBZCwgcnEsIHN1YmNtZCk7CisJCQllbHNlCisJCQkJU3RhdHVzID0gUlRNUFF1ZXJ5SW5mb3JtYXRpb24ocEFkLCBycSwgc3ViY21kKTsKKwkJCWJyZWFrOworCQljYXNlIFNJT0NHSVdQUklWOgorCQkJaWYgKHdycS0+dS5kYXRhLnBvaW50ZXIpCisJCQl7CisJCQkJaWYgKCBhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB3cnEtPnUuZGF0YS5wb2ludGVyLCBzaXplb2YocHJpdnRhYikpICE9IFRSVUUpCisJCQkJCWJyZWFrOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwcml2dGFiKSAvIHNpemVvZihwcml2dGFiWzBdKTsKKwkJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHByaXZ0YWIsIHNpemVvZihwcml2dGFiKSkpCisJCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBSVFBSSVZfSU9DVExfU0VUOgorCQkJaWYoYWNjZXNzX29rKFZFUklGWV9SRUFELCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpICE9IFRSVUUpCisJCQkJYnJlYWs7CisJCQlydF9pb2N0bF9zZXRwYXJhbShuZXRfZGV2LCBOVUxMLCBOVUxMLCB3cnEtPnUuZGF0YS5wb2ludGVyKTsKKwkJCWJyZWFrOworCQljYXNlIFJUUFJJVl9JT0NUTF9HU0lURVNVUlZFWToKKwkJCVJUTVBJb2N0bEdldFNpdGVTdXJ2ZXkocEFkLCB3cnEpOworCQkgICAgYnJlYWs7CisjaWZkZWYgREJHCisJCWNhc2UgUlRQUklWX0lPQ1RMX01BQzoKKwkJCVJUTVBJb2N0bE1BQyhwQWQsIHdycSk7CisJCQlicmVhazsKKwkJY2FzZSBSVFBSSVZfSU9DVExfRTJQOgorCQkJUlRNUElvY3RsRTJQUk9NKHBBZCwgd3JxKTsKKwkJCWJyZWFrOworI2VuZGlmIC8vIERCRyAvLworICAgICAgICBjYXNlIFNJT0NFVEhUT09MOgorICAgICAgICAgICAgICAgIGJyZWFrOworCQlkZWZhdWx0OgorCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiSU9DVEw6OnVua25vd24gSU9DVEwncyBjbWQgPSAweCUwOHhcbiIsIGNtZCkpOworCQkJU3RhdHVzID0gLUVPUE5PVFNVUFA7CisJCQlicmVhazsKKwl9CisKKyAgICBpZihTdGF0ZU1hY2hpbmVUb3VjaGVkKSAvLyBVcHBlciBsYXllciBzZW50IGEgTUxNRS1yZWxhdGVkIG9wZXJhdGlvbnMKKyAgICAJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCisJcmV0dXJuIFN0YXR1czsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgU1NJRAorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9TU0lEX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBORElTXzgwMl8xMV9TU0lEICAgICAgICAgICAgICAgICAgICBTc2lkLCAqcFNzaWQ9TlVMTDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZU1hY2hpbmVUb3VjaGVkID0gRkFMU0U7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IFRSVUU7CisKKyAgICBpZiggc3RybGVuKGFyZykgPD0gTUFYX0xFTl9PRl9TU0lEKQorICAgIHsKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoJlNzaWQsIHNpemVvZihORElTXzgwMl8xMV9TU0lEKSk7CisgICAgICAgIGlmIChzdHJsZW4oYXJnKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShTc2lkLlNzaWQsIGFyZywgc3RybGVuKGFyZykpOworICAgICAgICAgICAgU3NpZC5Tc2lkTGVuZ3RoID0gc3RybGVuKGFyZyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAgIC8vQU5ZIHNzaWQKKyAgICAgICAgeworICAgICAgICAgICAgU3NpZC5Tc2lkTGVuZ3RoID0gMDsKKwkJICAgIG1lbWNweShTc2lkLlNzaWQsICIiLCAwKTsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19JTkZSQTsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworCSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgID0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZDsKKwkJfQorICAgICAgICBwU3NpZCA9ICZTc2lkOworCisgICAgICAgIGlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQorICAgICAgICB7CisgICAgICAgICAgICBSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FIGJ1c3ksIHJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gVFJVRTsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7CisJCXBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7CisKKyAgICAgICAgTWxtZUVucXVldWUocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorICAgICAgICAgICAgICAgICAgICBPSURfODAyXzExX1NTSUQsCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihORElTXzgwMl8xMV9TU0lEKSwKKyAgICAgICAgICAgICAgICAgICAgKFZPSUQgKilwU3NpZCk7CisKKyAgICAgICAgU3RhdGVNYWNoaW5lVG91Y2hlZCA9IFRSVUU7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9TU0lEX1Byb2M6OihMZW49JWQsU3NpZD0lcylcbiIsIFNzaWQuU3NpZExlbmd0aCwgU3NpZC5Tc2lkKSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgc3VjY2VzcyA9IEZBTFNFOworCisgICAgaWYgKFN0YXRlTWFjaGluZVRvdWNoZWQpIC8vIFVwcGVyIGxheWVyIHNlbnQgYSBNTE1FLXJlbGF0ZWQgb3BlcmF0aW9ucworICAgIAlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZGFwdGVyKTsKKworICAgIHJldHVybiBzdWNjZXNzOworfQorCisjaWZkZWYgV01NX1NVUFBPUlQKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdtbUNhcGFibGUgRW5hYmxlIG9yIERpc2FibGUKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfV21tQ2FwYWJsZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlCT09MRUFOCWJXbW1DYXBhYmxlOworCisJYldtbUNhcGFibGUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKChiV21tQ2FwYWJsZSA9PSAxKQorCQkpCisJCXBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlID0gVFJVRTsKKwllbHNlIGlmIChiV21tQ2FwYWJsZSA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSA9IEZBTFNFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfV21tQ2FwYWJsZV9Qcm9jOjooYldtbUNhcGFibGU9JWQpXG4iLAorCQlwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gV01NX1NVUFBPUlQgLy8KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgTmV0d29yayBUeXBlKEluZnJhc3RydWN0dXJlL0FkaG9jIG1vZGUpCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X05ldHdvcmtUeXBlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBVSU5UMzIJVmFsdWUgPSAwOworCisgICAgaWYgKHN0cmNtcChhcmcsICJBZGhvYyIpID09IDApCisJeworCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlICE9IEJTU19BREhPQykKKwkJeworCQkJLy8gQ29uZmlnIGhhcyBjaGFuZ2VkCisJCQlwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOworICAgICAgICAgICAgaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgUlhfRklMVFJfQ0ZHLCBTVEFOT1JNQUwpOworICAgICAgICAgICAgICAgIFJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCQkJVmFsdWUgJj0gKH4weDgwKTsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworICAgICAgICAgICAgICAgIE9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICBMaW5rRG93bihwQWRhcHRlciwgRkFMU0UpOworICAgICAgICAgICAgfQorCQkJaWYgKElORlJBX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQkvL0JPT0xFQU4gQ2FuY2VsbGVkOworCQkJCS8vIFNldCB0aGUgQXV0b1JlY29ubmVjdFNzaWQgdG8gcHJldmVudCBpdCByZWNvbm5lY3QgdG8gb2xkIFNTSUQKKwkJCQkvLyBTaW5jZSBjYWxsaW5nIHRoaXMgaW5kaWNhdGUgdXNlciBkb24ndCB3YW50IHRvIGNvbm5lY3QgdG8gdGhhdCBTU0lEIGFueW1vcmUuCisJCQkJcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW49IDMyOworCQkJCU5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7CisKKwkJCQlMaW5rRG93bihwQWRhcHRlciwgRkFMU0UpOworCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVCBFdmVudCBCQiFcbiIpKTsKKwkJCX0KKwkJfQorCQlwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfQURIT0M7CisgICAgICAgIHBBZGFwdGVyLT5uZXRfZGV2LT50eXBlID0gcEFkYXB0ZXItPlN0YUNmZy5PcmlEZXZUeXBlOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+U2V0X05ldHdvcmtUeXBlX1Byb2M6OihBRC1IT0MpXG4iKSk7CisJfQorICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICJJbmZyYSIpID09IDApCisJeworCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlICE9IEJTU19JTkZSQSkKKwkJeworCQkJLy8gQ29uZmlnIGhhcyBjaGFuZ2VkCisJCQlwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOworICAgICAgICAgICAgaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgUlhfRklMVFJfQ0ZHLCBTVEFOT1JNQUwpOworICAgICAgICAgICAgICAgIFJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCQkJVmFsdWUgJj0gKH4weDgwKTsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworICAgICAgICAgICAgICAgIE9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICBMaW5rRG93bihwQWRhcHRlciwgRkFMU0UpOworICAgICAgICAgICAgfQorCQkJaWYgKEFESE9DX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQkvLyBTZXQgdGhlIEF1dG9SZWNvbm5lY3RTc2lkIHRvIHByZXZlbnQgaXQgcmVjb25uZWN0IHRvIG9sZCBTU0lECisJCQkJLy8gU2luY2UgY2FsbGluZyB0aGlzIGluZGljYXRlIHVzZXIgZG9uJ3Qgd2FudCB0byBjb25uZWN0IHRvIHRoYXQgU1NJRCBhbnltb3JlLgorCQkJCXBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuPSAzMjsKKwkJCQlOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pOworCisJCQkJTGlua0Rvd24ocEFkYXB0ZXIsIEZBTFNFKTsKKwkJCX0KKwkJfQorCQlwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfSU5GUkE7CisgICAgICAgIHBBZGFwdGVyLT5uZXRfZGV2LT50eXBlID0gcEFkYXB0ZXItPlN0YUNmZy5PcmlEZXZUeXBlOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+U2V0X05ldHdvcmtUeXBlX1Byb2M6OihJTkZSQSlcbiIpKTsKKworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfSU5GUkE7CisJfQorICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICJNb25pdG9yIikgPT0gMCkKKyAgICB7CisJCVVDSEFSCWJicFZhbHVlID0gMDsKKwkJQkNOX1RJTUVfQ0ZHX1NUUlVDIGNzcjsKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19JTkZSQV9PTik7CisgICAgICAgIE9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfQURIT0NfT04pOworCQlPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworCQkvLyBkaXNhYmxlIGFsbCBwZXJpb2RpYyBzdGF0ZSBtYWNoaW5lCisJCXBBZGFwdGVyLT5TdGFDZmcuYkF1dG9SZWNvbm5lY3QgPSBGQUxTRTsKKwkJLy8gcmVzZXQgYWxsIG1sbWUgc3RhdGUgbWFjaGluZQorCQlSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQgXG4iKSk7CisgICAgICAgIGlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID09IDApCisgICAgICAgIHsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQU5fTUlYRUQpCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IDM2OworICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSA2OworICAgICAgICB9CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIE5fQ2hhbm5lbENoZWNrKHBBZGFwdGVyKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCAmJgorICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDAgJiYKKyAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9PSBFWFRDSEFfQUJPVkUpCisJCXsKKwkJCS8vIDQwTUh6ICxjb250cm9sIGNoYW5uZWwgYXQgbG93ZXIKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCAmYmJwVmFsdWUpOworCQkJYmJwVmFsdWUgJj0gKH4weDE4KTsKKwkJCWJicFZhbHVlIHw9IDB4MTA7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsIGJicFZhbHVlKTsKKwkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7CisJCQkvLyAgUlggOiBjb250cm9sIGNoYW5uZWwgYXQgbG93ZXIKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IzLCAmYmJwVmFsdWUpOworCQkJYmJwVmFsdWUgJj0gKH4weDIwKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SMywgYmJwVmFsdWUpOworCisJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfQkFORF9DRkcsICZWYWx1ZSk7CisJCQlWYWx1ZSAmPSAweGZmZmZmZmZlOworCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9CQU5EX0NGRywgVmFsdWUpOworCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCArIDI7CisgICAgICAgICAgICBBc2ljU3dpdGNoQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOworCQkgICAgQXNpY0xvY2tDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJXXzQwICxjb250cm9sX2NoYW5uZWwoJWQpLCBDZW50cmFsQ2hhbm5lbCglZCkgXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCkpOworCQl9CisJCWVsc2UgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEICYmCisgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwICYmCisgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9PSBFWFRDSEFfQkVMT1cpCisJCXsKKwkJCS8vIDQwTUh6ICxjb250cm9sIGNoYW5uZWwgYXQgdXBwZXIKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCAmYmJwVmFsdWUpOworCQkJYmJwVmFsdWUgJj0gKH4weDE4KTsKKwkJCWJicFZhbHVlIHw9IDB4MTA7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsIGJicFZhbHVlKTsKKwkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7CisJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfQkFORF9DRkcsICZWYWx1ZSk7CisJCQlWYWx1ZSB8PSAweDE7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7CisKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IzLCAmYmJwVmFsdWUpOworCQkJYmJwVmFsdWUgfD0gKDB4MjApOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IzLCBiYnBWYWx1ZSk7CisJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsIC0gMjsKKyAgICAgICAgICAgIEFzaWNTd2l0Y2hDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7CisJCSAgICBBc2ljTG9ja0NoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQldfNDAgLGNvbnRyb2xfY2hhbm5lbCglZCksIENlbnRyYWxDaGFubmVsKCVkKSBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKSk7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQl7CisJCQkvLyAyME1IegorCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsICZiYnBWYWx1ZSk7CisJCQliYnBWYWx1ZSAmPSAofjB4MTgpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCBiYnBWYWx1ZSk7CisJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzIwOworCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOworCQkJQXNpY0xvY2tDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQldfMjAsIENoYW5uZWwoJWQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJfQorCQkvLyBFbmFibGUgUnggd2l0aCBwcm9taXNjdW91cyByZWNlcHRpb24KKwkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBSWF9GSUxUUl9DRkcsIDB4Myk7CisJCS8vIEFTSUMgc3VwcG9yc3RzIHNuaWZmZXIgZnVuY3Rpb24gd2l0aCByZXBsYWNpbmcgUlNTSSB3aXRoIHRpbWVzdGFtcC4KKwkJLy9SVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQkvL1ZhbHVlIHw9ICgweDgwKTsKKwkJLy9SVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCQkvLyBkaXNhYmxlIHN5bmMKKwkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIEJDTl9USU1FX0NGRywgJmNzci53b3JkKTsKKwkJY3NyLmZpZWxkLmJCZWFjb25HZW4gPSAwOworCQljc3IuZmllbGQuYlRCVFRFbmFibGUgPSAwOworCQljc3IuZmllbGQuVHNmU3luY01vZGUgPSAwOworCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIEJDTl9USU1FX0NGRywgY3NyLndvcmQpOworCisJCXBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19NT05JVE9SOworICAgICAgICBwQWRhcHRlci0+bmV0X2Rldi0+dHlwZSA9IEFSUEhSRF9JRUVFODAyMTFfUFJJU007IC8vQVJQSFJEX0lFRUU4MDIxMTsgLy8gSUVFRTgwMjExCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5TZXRfTmV0d29ya1R5cGVfUHJvYzo6KE1PTklUT1IpXG4iKSk7CisgICAgfQorCisgICAgLy8gUmVzZXQgUmFsaW5rIHN1cHBsaWNhbnQgdG8gbm90IHVzZSwgaXQgd2lsbCBiZSBzZXQgdG8gc3RhcnQgd2hlbiBVSSBzZXQgUE1LIGtleQorICAgIHBBZGFwdGVyLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfTmV0d29ya1R5cGVfUHJvYzo6KE5ldHdvcmtUeXBlPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlKSk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQXV0aGVudGljYXRpb24gbW9kZQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9BdXRoTW9kZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaWYgKChzdHJjbXAoYXJnLCAiV0VQQVVUTyIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid2VwYXV0byIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaDsKKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIk9QRU4iKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIm9wZW4iKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJTSEFSRUQiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgInNoYXJlZCIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkOworICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV1BBUFNLIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGFwc2siKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzsKKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldQQU5PTkUiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndwYW5vbmUiKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXUEEyUFNLIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGEycHNrIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldQQSIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid3BhIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEE7CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXUEEyIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGEyIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQXV0aE1vZGVfUHJvYzo6KEF1dGhNb2RlPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSkpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEVuY3J5cHRpb24gVHlwZQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9FbmNyeXBUeXBlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpZiAoKHN0cmNtcChhcmcsICJOT05FIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJub25lIikgPT0gMCkpCisgICAgeworICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyICAgID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCSAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICAgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgfQorICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV0VQIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3ZXAiKSA9PSAwKSkKKyAgICB7CisgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgICAgID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworCSAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICAgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKyAgICB9CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJUS0lQIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ0a2lwIikgPT0gMCkpCisgICAgeworICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA8IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgICAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyICAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKwkgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKyAgICB9CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJBRVMiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgImFlcyIpID09IDApKQorICAgIHsKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisJICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfRW5jcnlwVHlwZV9Qcm9jOjooRW5jcnlwVHlwZT0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzKSk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgRGVmYXVsdCBLZXkgSUQKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfRGVmYXVsdEtleUlEX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlJZHg7CisKKyAgICBLZXlJZHggPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworICAgIGlmKChLZXlJZHggPj0gMSApICYmIChLZXlJZHggPD0gNCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKFVDSEFSKSAoS2V5SWR4IC0gMSApOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkIGFyZ3VtZW50CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfRGVmYXVsdEtleUlEX1Byb2M6OihEZWZhdWx0S2V5SUQ9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdFUCBLRVkxCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0tleTFfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUxlbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZz1DSVBIRVJfV0VQNjQ7CisKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICBLZXlMZW4gPSBzdHJsZW4oYXJnKTsKKworICAgIHN3aXRjaCAoS2V5TGVuKQorICAgIHsKKyAgICAgICAgY2FzZSA1OiAvL3dlcCA0MCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6KEtleTE9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEwOiAvL3dlcCA0MCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjooS2V5MT0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEzOiAvL3dlcCAxMDQgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjooS2V5MT0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjY6IC8vd2VwIDEwNCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6KEtleTE9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogLy9JbnZhbGlkIGFyZ3VtZW50CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjpJbnZhbGlkIGFyZ3VtZW50ICg9JXMpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworICAgIC8vIFNldCBrZXlzIChpbnRvIEFTSUMpCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICA7ICAgLy8gbm90IHN1cHBvcnQKKyAgICBlbHNlICAgIC8vIE9sZCBXRVAgc3R1ZmYKKyAgICB7CisgICAgICAgIEFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV0VQIEtFWTIKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfS2V5Ml9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5TGVuOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnPUNJUEhFUl9XRVA2NDsKKworICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgIEtleUxlbiA9IHN0cmxlbihhcmcpOworCisgICAgc3dpdGNoIChLZXlMZW4pCisgICAgeworICAgICAgICBjYXNlIDU6IC8vd2VwIDQwIEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjooS2V5Mj0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTA6IC8vd2VwIDQwIEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkyX1Byb2M6OihLZXkyPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTM6IC8vd2VwIDEwNCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkyX1Byb2M6OihLZXkyPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyNjogLy93ZXAgMTA0IEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjooS2V5Mj0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvL0ludmFsaWQgYXJndW1lbnQKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkyX1Byb2M6OkludmFsaWQgYXJndW1lbnQgKD0lcylcbiIsIGFyZykpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworICAgIC8vIFNldCBrZXlzIChpbnRvIEFTSUMpCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICA7ICAgLy8gbm90IHN1cHBvcnQKKyAgICBlbHNlICAgIC8vIE9sZCBXRVAgc3R1ZmYKKyAgICB7CisgICAgICAgIEFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5DaXBoZXJBbGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdFUCBLRVkzCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0tleTNfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUxlbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZz1DSVBIRVJfV0VQNjQ7CisKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICBLZXlMZW4gPSBzdHJsZW4oYXJnKTsKKworICAgIHN3aXRjaCAoS2V5TGVuKQorICAgIHsKKyAgICAgICAgY2FzZSA1OiAvL3dlcCA0MCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTNfUHJvYzo6KEtleTM9JXMgYW5kIHR5cGU9QXNjaWkpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEwOiAvL3dlcCA0MCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5M19Qcm9jOjooS2V5Mz0lcyBhbmQgdHlwZT1IZXgpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEzOiAvL3dlcCAxMDQgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5M19Qcm9jOjooS2V5Mz0lcyBhbmQgdHlwZT1Bc2NpaSlcbiIsIGFyZykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjY6IC8vd2VwIDEwNCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTNfUHJvYzo6KEtleTM9JXMgYW5kIHR5cGU9SGV4KVxuIiwgYXJnKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogLy9JbnZhbGlkIGFyZ3VtZW50CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5M19Qcm9jOjpJbnZhbGlkIGFyZ3VtZW50ICg9JXMpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisKKyAgICAvLyBTZXQga2V5cyAoaW50byBBU0lDKQorICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgOyAgIC8vIG5vdCBzdXBwb3J0CisgICAgZWxzZSAgICAvLyBPbGQgV0VQIHN0dWZmCisgICAgeworICAgICAgICBBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uQ2lwaGVyQWxnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXRVAgS0VZNAorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9LZXk0X1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlMZW47CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGc9Q0lQSEVSX1dFUDY0OworCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgS2V5TGVuID0gc3RybGVuKGFyZyk7CisKKyAgICBzd2l0Y2ggKEtleUxlbikKKyAgICB7CisgICAgICAgIGNhc2UgNTogLy93ZXAgNDAgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OihLZXk0PSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMDogLy93ZXAgNDAgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6KEtleTQ9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMzogLy93ZXAgMTA0IEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6KEtleTQ9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI2OiAvL3dlcCAxMDQgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OihLZXk0PSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8vSW52YWxpZCBhcmd1bWVudAorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6SW52YWxpZCBhcmd1bWVudCAoPSVzKVxuIiwgYXJnKSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCisgICAgLy8gU2V0IGtleXMgKGludG8gQVNJQykKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIDsgICAvLyBub3Qgc3VwcG9ydAorICAgIGVsc2UgICAgLy8gT2xkIFdFUCBzdHVmZgorICAgIHsKKyAgICAgICAgQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLkNpcGhlckFsZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXUEEgUFNLIGtleQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9XUEFQU0tfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgIGtleU1hdGVyaWFsWzQwXTsKKworICAgIGlmICgocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spICYmCisgICAgICAgIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spICYmCisJICAgIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisJCSkKKyAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9XUEFQU0tfUHJvYzo6KFdQQVBTSz0lcylcbiIsIGFyZykpOworCisgICAgTmRpc1plcm9NZW1vcnkoa2V5TWF0ZXJpYWwsIDQwKTsKKworICAgIGlmICgoc3RybGVuKGFyZykgPCA4KSB8fCAoc3RybGVuKGFyZykgPiA2NCkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQgZmFpbGVkISEoV1BBUFNLPSVzKSwgV1BBUFNLIGtleS1zdHJpbmcgcmVxdWlyZWQgOCB+IDY0IGNoYXJhY3RlcnMgXG4iLCBhcmcpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGlmIChzdHJsZW4oYXJnKSA9PSA2NCkKKyAgICB7CisgICAgICAgIEF0b0goYXJnLCBrZXlNYXRlcmlhbCwgMzIpOworICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLlBNSywga2V5TWF0ZXJpYWwsIDMyKTsKKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBQYXNzd29yZEhhc2goKGNoYXIgKilhcmcsIHBBZGFwdGVyLT5NbG1lQXV4LlNzaWQsIHBBZGFwdGVyLT5NbG1lQXV4LlNzaWRMZW4sIGtleU1hdGVyaWFsKTsKKyAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlN0YUNmZy5QTUssIGtleU1hdGVyaWFsLCAzMik7CisgICAgfQorCisKKworICAgIGlmKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MgJiYKKyAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisgICAgeworICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX05PVFVTRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gU3RhcnQgU1RBIHN1cHBsaWNhbnQgc3RhdGUgbWFjaGluZQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfU1RBUlQ7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFBvd2VyIFNhdmluZyBtb2RlCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X1BTTW9kZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfSU5GUkEpCisgICAgeworICAgICAgICBpZiAoKHN0cmNtcChhcmcsICJNYXhfUFNQIikgPT0gMCkgfHwKKwkJCShzdHJjbXAoYXJnLCAibWF4X3BzcCIpID09IDApIHx8CisJCQkoc3RyY21wKGFyZywgIk1BWF9QU1AiKSA9PSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZG8gTk9UIHR1cm4gb24gUFNNIGJpdCBoZXJlLCB3YWl0IHVudGlsIE1sbWVDaGVja0ZvclBzbUNoYW5nZSgpCisgICAgICAgICAgICAvLyB0byBleGNsdWRlIGNlcnRhaW4gc2l0dWF0aW9ucy4KKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1A7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1A7CisgICAgICAgICAgICBPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSA1OworCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJGYXN0X1BTUCIpID09IDApIHx8CisJCQkJIChzdHJjbXAoYXJnLCAiZmFzdF9wc3AiKSA9PSAwKSB8fAorICAgICAgICAgICAgICAgICAoc3RyY21wKGFyZywgIkZBU1RfUFNQIikgPT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tGb3JQc21DaGFuZ2UoKQorICAgICAgICAgICAgLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCisgICAgICAgICAgICBPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOworICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1A7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSAzOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiTGVnYWN5X1BTUCIpID09IDApIHx8CisgICAgICAgICAgICAgICAgIChzdHJjbXAoYXJnLCAibGVnYWN5X3BzcCIpID09IDApIHx8CisgICAgICAgICAgICAgICAgIChzdHJjbXAoYXJnLCAiTEVHQUNZX1BTUCIpID09IDApKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBkbyBOT1QgdHVybiBvbiBQU00gYml0IGhlcmUsIHdhaXQgdW50aWwgTWxtZUNoZWNrRm9yUHNtQ2hhbmdlKCkKKyAgICAgICAgICAgIC8vIHRvIGV4Y2x1ZGUgY2VydGFpbiBzaXR1YXRpb25zLgorICAgICAgICAgICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1A7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1A7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCA9IDM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvL0RlZmF1bHQgTmRpczgwMl8xMVBvd2VyTW9kZUNBTQorICAgICAgICAgICAgLy8gY2xlYXIgUFNNIGJpdCBpbW1lZGlhdGVseQorICAgICAgICAgICAgTWxtZVNldFBzbUJpdChwQWRhcHRlciwgUFdSX0FDVElWRSk7CisgICAgICAgICAgICBPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOworICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVDQU07CisgICAgICAgIH0KKworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfUFNNb2RlX1Byb2M6OihQU01vZGU9JWxkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlKSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisKKyAgICByZXR1cm4gVFJVRTsKK30KKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdwYVN1cHBvcnQgZmxhZy4KKyAgICBWYWx1ZToKKyAgICAgICAgMDogRHJpdmVyIGlnbm9yZSB3cGFfc3VwcGxpY2FudC4KKyAgICAgICAgMTogd3BhX3N1cHBsaWNhbnQgaW5pdGlhdGVzIHNjYW5uaW5nIGFuZCBBUCBzZWxlY3Rpb24uCisgICAgICAgIDI6IGRyaXZlciB0YWtlcyBjYXJlIG9mIHNjYW5uaW5nLCBBUCBzZWxlY3Rpb24sIGFuZCBJRUVFIDgwMi4xMSBhc3NvY2lhdGlvbiBwYXJhbWV0ZXJzLgorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9XcGFfU3VwcG9ydCgKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisKKyAgICBpZiAoIHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMCkKKyAgICAgICAgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRTsKKyAgICBlbHNlIGlmICggc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAxKQorICAgICAgICBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSBXUEFfU1VQUExJQ0FOVF9FTkFCTEU7CisgICAgZWxzZSBpZiAoIHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMikKKyAgICAgICAgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFX1dJVEhfV0VCX1VJOworICAgIGVsc2UKKyAgICAgICAgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRTsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9XcGFfU3VwcG9ydDo6KFdwYVN1cHBsaWNhbnRVUD0lZClcbiIsIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjaWZkZWYgREJHCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFJlYWQgLyBXcml0ZSBNQUMKKyAgICBBcmd1bWVudHM6CisgICAgICAgIHBBZGFwdGVyICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgICAgIHdycSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpb2N0bCBhcmd1bWVudAorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOb25lCisKKyAgICBOb3RlOgorICAgICAgICBVc2FnZToKKyAgICAgICAgICAgICAgIDEuKSBpd3ByaXYgcmEwIG1hYyAwICAgICAgICA9PT4gcmVhZCBNQUMgd2hlcmUgQWRkcj0weDAKKyAgICAgICAgICAgICAgIDIuKSBpd3ByaXYgcmEwIG1hYyAwPTEyICAgICA9PT4gd3JpdGUgTUFDIHdoZXJlIEFkZHI9MHgwLCB2YWx1ZT0xMgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QSW9jdGxNQUMoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglzdHJ1Y3QgaXdyZXEJKndycSkKK3sKKwlDSEFSCQkJCSp0aGlzX2NoYXI7CisJQ0hBUgkJCQkqdmFsdWU7CisJSU5UCQkJCQlqID0gMCwgayA9IDA7CisJQ0hBUgkJCQltc2dbMTAyNF07CisJQ0hBUgkJCQlhcmdbMjU1XTsKKwlVTE9ORwkJCQltYWNBZGRyID0gMDsKKwlVQ0hBUgkJCQl0ZW1wWzE2XSwgdGVtcDJbMTZdOworCVVJTlQzMgkJCQltYWNWYWx1ZSA9IDA7CisJSU5UCQkJCQlTdGF0dXM7CisKKworCW1lbXNldChtc2csIDB4MDAsIDEwMjQpOworCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggPiAxKSAvL05vIHBhcmFtZXRlcnMuCisJeworCSAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihhcmcsIHdycS0+dS5kYXRhLnBvaW50ZXIsICh3cnEtPnUuZGF0YS5sZW5ndGggPiAyNTUpID8gMjU1IDogd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJc3ByaW50Zihtc2csICJcbiIpOworCisJCS8vUGFyc2luZyBSZWFkIG9yIFdyaXRlCisJICAgIHRoaXNfY2hhciA9IGFyZzsKKwkJaWYgKCEqdGhpc19jaGFyKQorCQkJZ290byBuZXh0OworCisJCWlmICgodmFsdWUgPSBydHN0cmNocih0aGlzX2NoYXIsICc9JykpICE9IE5VTEwpCisJCQkqdmFsdWUrKyA9IDA7CisKKwkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKQorCQl7IC8vUmVhZAorCQkJLy8gU2FuaXR5IGNoZWNrCisJCQlpZihzdHJsZW4odGhpc19jaGFyKSA+IDQpCisJCQkJZ290byBuZXh0OworCisJCQlqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCWlmKHRoaXNfY2hhcltqXSA+ICdmJyB8fCB0aGlzX2NoYXJbal0gPCAnMCcpCisJCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy8gTWFjIEFkZHIKKwkJCWsgPSBqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCXRoaXNfY2hhcls0LWsral0gPSB0aGlzX2NoYXJbal07CisJCQl9CisKKwkJCXdoaWxlKGsgPCA0KQorCQkJCXRoaXNfY2hhclszLWsrK109JzAnOworCQkJdGhpc19jaGFyWzRdPSdcMCc7CisKKwkJCWlmKHN0cmxlbih0aGlzX2NoYXIpID09IDQpCisJCQl7CisJCQkJQXRvSCh0aGlzX2NoYXIsIHRlbXAsIDIpOworCQkJCW1hY0FkZHIgPSAqdGVtcCoyNTYgKyB0ZW1wWzFdOworCQkJCWlmIChtYWNBZGRyIDwgMHhGRkZGKQorCQkJCXsKKwkJCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIG1hY0FkZHIsICZtYWNWYWx1ZSk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1hY0FkZHI9JWx4LCBNYWNWYWx1ZT0leFxuIiwgbWFjQWRkciwgbWFjVmFsdWUpKTsKKwkJCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICJbMHglMDhsWF06JTA4WCAgIiwgbWFjQWRkciAsIG1hY1ZhbHVlKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgYmJwCisJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZQorCQl7IC8vV3JpdGUKKwkJCW1lbWNweSgmdGVtcDIsIHZhbHVlLCBzdHJsZW4odmFsdWUpKTsKKwkJCXRlbXAyW3N0cmxlbih2YWx1ZSldID0gJ1wwJzsKKworCQkJLy8gU2FuaXR5IGNoZWNrCisJCQlpZigoc3RybGVuKHRoaXNfY2hhcikgPiA0KSB8fCBzdHJsZW4odGVtcDIpID4gOCkKKwkJCQlnb3RvIG5leHQ7CisKKwkJCWogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJaWYodGhpc19jaGFyW2pdID4gJ2YnIHx8IHRoaXNfY2hhcltqXSA8ICcwJykKKwkJCQkJcmV0dXJuOworCQkJfQorCisJCQlqID0gc3RybGVuKHRlbXAyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJaWYodGVtcDJbal0gPiAnZicgfHwgdGVtcDJbal0gPCAnMCcpCisJCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy9NQUMgQWRkcgorCQkJayA9IGogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJdGhpc19jaGFyWzQtaytqXSA9IHRoaXNfY2hhcltqXTsKKwkJCX0KKworCQkJd2hpbGUoayA8IDQpCisJCQkJdGhpc19jaGFyWzMtaysrXT0nMCc7CisJCQl0aGlzX2NoYXJbNF09J1wwJzsKKworCQkJLy9NQUMgdmFsdWUKKwkJCWsgPSBqID0gc3RybGVuKHRlbXAyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJdGVtcDJbOC1rK2pdID0gdGVtcDJbal07CisJCQl9CisKKwkJCXdoaWxlKGsgPCA4KQorCQkJCXRlbXAyWzctaysrXT0nMCc7CisJCQl0ZW1wMls4XT0nXDAnOworCisJCQl7CisJCQkJQXRvSCh0aGlzX2NoYXIsIHRlbXAsIDIpOworCQkJCW1hY0FkZHIgPSAqdGVtcCoyNTYgKyB0ZW1wWzFdOworCisJCQkJQXRvSCh0ZW1wMiwgdGVtcCwgNCk7CisJCQkJbWFjVmFsdWUgPSAqdGVtcCoyNTYqMjU2KjI1NiArIHRlbXBbMV0qMjU2KjI1NiArIHRlbXBbMl0qMjU2ICsgdGVtcFszXTsKKworCQkJCS8vIGRlYnVnIG1vZGUKKwkJCQlpZiAobWFjQWRkciA9PSAoSFdfREVCVUdfU0VUVElOR19CQVNFICsgNCkpCisJCQkJeworCQkJCQkvLyAweDJiZjQ6IGJ5dGUwIG5vbi16ZXJvOiBlbmFibGUgUjE3IHR1bmluZywgMDogZGlzYWJsZSBSMTcgdHVuaW5nCisgICAgICAgICAgICAgICAgICAgIGlmIChtYWNWYWx1ZSAmIDB4MDAwMDAwZmYpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5CYnBUdW5pbmcuYkVuYWJsZSA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoInR1cm4gb24gUjE3IHR1bmluZ1xuIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgUjY2OworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkJicFR1bmluZy5iRW5hYmxlID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICBSNjYgPSAweDI2ICsgR0VUX0xOQV9HQUlOKHBBZGFwdGVyKTsKKyNpZmRlZiBSQUxJTktfQVRFCisJCQkJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCQkJCXsKKwkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNjYsICgweDI2ICsgR0VUX0xOQV9HQUlOKHBBZGFwdGVyKSkpOworCQkJCQkJfQorCQkJCQkJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNjYsICgweDI2ICsgR0VUX0xOQV9HQUlOKHBBZGFwdGVyKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJ0dXJuIG9mZiBSMTcgdHVuaW5nLCByZXN0b3JlIHRvIDB4JTAyeFxuIiwgUjY2KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKwkJCQkJcmV0dXJuOworCQkJCX0KKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1hY0FkZHI9JTAybHgsIE1hY1ZhbHVlPTB4JXhcbiIsIG1hY0FkZHIsIG1hY1ZhbHVlKSk7CisKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIG1hY0FkZHIsIG1hY1ZhbHVlKTsKKwkJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIlsweCUwOGxYXTolMDhYICAiLCBtYWNBZGRyLCBtYWNWYWx1ZSk7CisJCQl9CisJCX0KKwl9CituZXh0OgorCWlmKHN0cmxlbihtc2cpID09IDEpCisJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiPT09PkVycm9yIGNvbW1hbmQgZm9ybWF0ISIpOworCisJLy8gQ29weSB0aGUgaW5mb3JtYXRpb24gaW50byB0aGUgdXNlciBidWZmZXIKKwl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4obXNnKTsKKwlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgbXNnLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09UlRNUElvY3RsTUFDXG5cbiIpKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBSZWFkIC8gV3JpdGUgRTJQUk9NCisgICAgQXJndW1lbnRzOgorICAgICAgICBwQWRhcHRlciAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorICAgICAgICB3cnEgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW9jdGwgYXJndW1lbnQKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgTm9uZQorCisgICAgTm90ZToKKyAgICAgICAgVXNhZ2U6CisgICAgICAgICAgICAgICAxLikgaXdwcml2IHJhMCBlMnAgMCAgICAgCT09PiByZWFkIEUyUFJPTSB3aGVyZSBBZGRyPTB4MAorICAgICAgICAgICAgICAgMi4pIGl3cHJpdiByYTAgZTJwIDA9MTIzNCAgICA9PT4gd3JpdGUgRTJQUk9NIHdoZXJlIEFkZHI9MHgwLCB2YWx1ZT0xMjM0CisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBJb2N0bEUyUFJPTSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCXN0cnVjdCBpd3JlcQkqd3JxKQoreworCUNIQVIJCQkJKnRoaXNfY2hhcjsKKwlDSEFSCQkJCSp2YWx1ZTsKKwlJTlQJCQkJCWogPSAwLCBrID0gMDsKKwlDSEFSCQkJCW1zZ1sxMDI0XTsKKwlDSEFSCQkJCWFyZ1syNTVdOworCVVTSE9SVAkJCQllZXBBZGRyID0gMDsKKwlVQ0hBUgkJCQl0ZW1wWzE2XSwgdGVtcDJbMTZdOworCVVTSE9SVAkJCQllZXBWYWx1ZTsKKwlpbnQJCQkJCVN0YXR1czsKKworCisJbWVtc2V0KG1zZywgMHgwMCwgMTAyNCk7CisJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCA+IDEpIC8vTm8gcGFyYW1ldGVycy4KKwl7CisJICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKGFyZywgd3JxLT51LmRhdGEucG9pbnRlciwgKHdycS0+dS5kYXRhLmxlbmd0aCA+IDI1NSkgPyAyNTUgOiB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQlzcHJpbnRmKG1zZywgIlxuIik7CisKKwkgICAgLy9QYXJzaW5nIFJlYWQgb3IgV3JpdGUKKwkJdGhpc19jaGFyID0gYXJnOworCisKKwkJaWYgKCEqdGhpc19jaGFyKQorCQkJZ290byBuZXh0OworCisJCWlmICgodmFsdWUgPSBydHN0cmNocih0aGlzX2NoYXIsICc9JykpICE9IE5VTEwpCisJCQkqdmFsdWUrKyA9IDA7CisKKwkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKQorCQl7IC8vUmVhZAorCisJCQkvLyBTYW5pdHkgY2hlY2sKKwkJCWlmKHN0cmxlbih0aGlzX2NoYXIpID4gNCkKKwkJCQlnb3RvIG5leHQ7CisKKwkJCWogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJaWYodGhpc19jaGFyW2pdID4gJ2YnIHx8IHRoaXNfY2hhcltqXSA8ICcwJykKKwkJCQkJcmV0dXJuOworCQkJfQorCisJCQkvLyBFMlBST00gYWRkcgorCQkJayA9IGogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJdGhpc19jaGFyWzQtaytqXSA9IHRoaXNfY2hhcltqXTsKKwkJCX0KKworCQkJd2hpbGUoayA8IDQpCisJCQkJdGhpc19jaGFyWzMtaysrXT0nMCc7CisJCQl0aGlzX2NoYXJbNF09J1wwJzsKKworCQkJaWYoc3RybGVuKHRoaXNfY2hhcikgPT0gNCkKKwkJCXsKKwkJCQlBdG9IKHRoaXNfY2hhciwgdGVtcCwgMik7CisJCQkJZWVwQWRkciA9ICp0ZW1wKjI1NiArIHRlbXBbMV07CisJCQkJaWYgKGVlcEFkZHIgPCAweEZGRkYpCisJCQkJeworCQkJCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWRhcHRlciwgZWVwQWRkciwgZWVwVmFsdWUpOworCQkJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIlsweCUwNFhdOjB4JTA0WCAgIiwgZWVwQWRkciAsIGVlcFZhbHVlKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgYmJwCisJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZQorCQl7IC8vV3JpdGUKKwkJCW1lbWNweSgmdGVtcDIsIHZhbHVlLCBzdHJsZW4odmFsdWUpKTsKKwkJCXRlbXAyW3N0cmxlbih2YWx1ZSldID0gJ1wwJzsKKworCQkJLy8gU2FuaXR5IGNoZWNrCisJCQlpZigoc3RybGVuKHRoaXNfY2hhcikgPiA0KSB8fCBzdHJsZW4odGVtcDIpID4gOCkKKwkJCQlnb3RvIG5leHQ7CisKKwkJCWogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJaWYodGhpc19jaGFyW2pdID4gJ2YnIHx8IHRoaXNfY2hhcltqXSA8ICcwJykKKwkJCQkJcmV0dXJuOworCQkJfQorCQkJaiA9IHN0cmxlbih0ZW1wMik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCWlmKHRlbXAyW2pdID4gJ2YnIHx8IHRlbXAyW2pdIDwgJzAnKQorCQkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vTUFDIEFkZHIKKwkJCWsgPSBqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCXRoaXNfY2hhcls0LWsral0gPSB0aGlzX2NoYXJbal07CisJCQl9CisKKwkJCXdoaWxlKGsgPCA0KQorCQkJCXRoaXNfY2hhclszLWsrK109JzAnOworCQkJdGhpc19jaGFyWzRdPSdcMCc7CisKKwkJCS8vTUFDIHZhbHVlCisJCQlrID0gaiA9IHN0cmxlbih0ZW1wMik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCXRlbXAyWzQtaytqXSA9IHRlbXAyW2pdOworCQkJfQorCisJCQl3aGlsZShrIDwgNCkKKwkJCQl0ZW1wMlszLWsrK109JzAnOworCQkJdGVtcDJbNF09J1wwJzsKKworCQkJQXRvSCh0aGlzX2NoYXIsIHRlbXAsIDIpOworCQkJZWVwQWRkciA9ICp0ZW1wKjI1NiArIHRlbXBbMV07CisKKwkJCUF0b0godGVtcDIsIHRlbXAsIDIpOworCQkJZWVwVmFsdWUgPSAqdGVtcCoyNTYgKyB0ZW1wWzFdOworCisJCQlSVDI4eHhfRUVQUk9NX1dSSVRFMTYocEFkYXB0ZXIsIGVlcEFkZHIsIGVlcFZhbHVlKTsKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiWzB4JTAyWF06JTAyWCAgIiwgZWVwQWRkciwgZWVwVmFsdWUpOworCQl9CisJfQorbmV4dDoKKwlpZihzdHJsZW4obXNnKSA9PSAxKQorCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIj09PT5FcnJvciBjb21tYW5kIGZvcm1hdCEiKTsKKworCisJLy8gQ29weSB0aGUgaW5mb3JtYXRpb24gaW50byB0aGUgdXNlciBidWZmZXIKKwl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4obXNnKTsKKwlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgbXNnLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09UlRNUElvY3RsRTJQUk9NXG4iKSk7Cit9CisjZW5kaWYgLy8gREJHIC8vCisKKworCisKK0lOVCBTZXRfVEduV2lmaVRlc3RfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAwKQorICAgICAgICBwQWQtPlN0YUNmZy5iVEduV2lmaVRlc3QgPSBGQUxTRTsKKyAgICBlbHNlCisgICAgICAgIHBBZC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCA9IFRSVUU7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRiBTZXRfVEduV2lmaVRlc3RfUHJvYzo6KGJUR25XaWZpVGVzdD0lZClcbiIsIHBBZC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCkpOworCXJldHVybiBUUlVFOworfQorCitJTlQgU2V0X0xvbmdSZXRyeUxpbWl0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVFhfUlRZX0NGR19TVFJVQwl0eF9ydHlfY2ZnOworCVVDSEFSCQkJCUxvbmdSZXRyeUxpbWl0ID0gKFVDSEFSKXNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7CisJdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQgPSBMb25nUmV0cnlMaW1pdDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsIHR4X3J0eV9jZmcud29yZCk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUYgU2V0X0xvbmdSZXRyeUxpbWl0X1Byb2M6Oih0eF9ydHlfY2ZnPTB4JXgpXG4iLCB0eF9ydHlfY2ZnLndvcmQpKTsKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UIFNldF9TaG9ydFJldHJ5TGltaXRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlUWF9SVFlfQ0ZHX1NUUlVDCXR4X3J0eV9jZmc7CisJVUNIQVIJCQkJU2hvcnRSZXRyeUxpbWl0ID0gKFVDSEFSKXNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7CisJdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJ0eUxpbWl0ID0gU2hvcnRSZXRyeUxpbWl0OworCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgdHhfcnR5X2NmZy53b3JkKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRiBTZXRfU2hvcnRSZXRyeUxpbWl0X1Byb2M6Oih0eF9ydHlfY2ZnPTB4JXgpXG4iLCB0eF9ydHlfY2ZnLndvcmQpKTsKKwlyZXR1cm4gVFJVRTsKK30KKworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKK0lOVCBTZXRfSWVlZTgwMjExZENsaWVudE1vZGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGlmIChzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDApCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUgPSBSdDgwMl8xMV9EX05vbmU7CisgICAgZWxzZSBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAxKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlID0gUnQ4MDJfMTFfRF9GbGV4aWJsZTsKKyAgICBlbHNlIGlmIChzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDIpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUgPSBSdDgwMl8xMV9EX1N0cmljdDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9JZWVlODAyZE1vZGVfUHJvYzo6KElFRUVFMDIxMWRNb2RlPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSkpOworICAgIHJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKworI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKK0lOVCBTZXRfQ2FycmllckRldGVjdF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGlmIChzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDApCisgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID0gRkFMU0U7CisgICAgZWxzZQorICAgICAgICBwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9IFRSVUU7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRiBTZXRfQ2FycmllckRldGVjdF9Qcm9jOjooQ2FycmllckRldGVjdC5FbmFibGU9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSkpOworCXJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC93cGEuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvd3BhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhjN2M4YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvd3BhLmgKQEAgLTAsMCArMSwzNTYgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJd3BhLmgKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlOYW1lCQlEYXRlCQkJTW9kaWZpY2F0aW9uIGxvZ3MKKyovCisKKyNpZm5kZWYJX19XUEFfSF9fCisjZGVmaW5lCV9fV1BBX0hfXworCisvLyBFQVBPTCBLZXkgZGVzY3JpcHRlciBmcmFtZSBmb3JtYXQgcmVsYXRlZCBsZW5ndGgKKyNkZWZpbmUgTEVOX0tFWV9ERVNDX05PTkNFCQkJMzIKKyNkZWZpbmUgTEVOX0tFWV9ERVNDX0lWCQkJCTE2CisjZGVmaW5lIExFTl9LRVlfREVTQ19SU0MJCQk4CisjZGVmaW5lIExFTl9LRVlfREVTQ19JRAkJCQk4CisjZGVmaW5lIExFTl9LRVlfREVTQ19SRVBMQVkJCQk4CisjZGVmaW5lIExFTl9LRVlfREVTQ19NSUMJCQkxNgorCisvLyBUaGUgbGVuZ3RoIGlzIHRoZSBFQVBvTC1LZXkgZnJhbWUgZXhjZXB0IGtleSBkYXRhIGZpZWxkLgorLy8gUGxlYXNlIHJlZmVyIHRvIDgwMi4xMWktMjAwNCAsRmlndXJlIDQzdSBpbiBwLjc4CisjZGVmaW5lIExFTl9FQVBPTF9LRVlfTVNHCQkJKHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFKQorCisvLyBFQVAgQ29kZSBUeXBlLgorI2RlZmluZSBFQVBfQ09ERV9SRVFVRVNUCTEKKyNkZWZpbmUgRUFQX0NPREVfUkVTUE9OU0UJMgorI2RlZmluZSBFQVBfQ09ERV9TVUNDRVNTICAgIDMKKyNkZWZpbmUgRUFQX0NPREVfRkFJTFVSRSAgICA0CisKKy8vIEVBUE9MIGZyYW1lIFByb3RvY29sIFZlcnNpb24KKyNkZWZpbmUJRUFQT0xfVkVSCQkJCQkxCisjZGVmaW5lCUVBUE9MX1ZFUjIJCQkJCTIKKworLy8gRUFQT0wtS0VZIERlc2NyaXB0b3IgVHlwZQorI2RlZmluZQlXUEExX0tFWV9ERVNDCQkJCTB4ZmUKKyNkZWZpbmUgV1BBMl9LRVlfREVTQyAgICAgICAgICAgICAgIDB4MDIKKworLy8gS2V5IERlc2NyaXB0b3IgVmVyc2lvbiBvZiBLZXkgSW5mb3JtYXRpb24KKyNkZWZpbmUJREVTQ19UWVBFX1RLSVAJCQkJMQorI2RlZmluZQlERVNDX1RZUEVfQUVTCQkJCTIKKyNkZWZpbmUgREVTQ19UWVBFX01FU0gJCQkJMworCisjZGVmaW5lIExFTl9NU0cxXzJXQVkgICAgICAgICAgICAgICAweDdmCisjZGVmaW5lIE1BWF9MRU5fT0ZfRUFQX0hTICAgICAgICAgICAyNTYKKworI2RlZmluZSBMRU5fTUFTVEVSX0tFWQkJCQkzMgorCisvLyBFQVBPTCBFSywgTUsKKyNkZWZpbmUgTEVOX0VBUF9FSwkJCQkJMTYKKyNkZWZpbmUgTEVOX0VBUF9NSUNLCQkJCTE2CisjZGVmaW5lIExFTl9FQVBfS0VZCQkJCQkoKExFTl9FQVBfRUspKyhMRU5fRUFQX01JQ0spKQorLy8gVEtJUCBrZXkgcmVsYXRlZAorI2RlZmluZSBMRU5fUE1LSUQJCQkJCTE2CisjZGVmaW5lIExFTl9US0lQX0VLCQkJCQkxNgorI2RlZmluZSBMRU5fVEtJUF9SWE1JQ0sJCQkJOAorI2RlZmluZSBMRU5fVEtJUF9UWE1JQ0sJCQkJOAorI2RlZmluZSBMRU5fQUVTX0VLCQkJCQkxNgorI2RlZmluZSBMRU5fQUVTX0tFWQkJCQkJTEVOX0FFU19FSworI2RlZmluZSBMRU5fVEtJUF9LRVkJCQkJKChMRU5fVEtJUF9FSykrKExFTl9US0lQX1JYTUlDSykrKExFTl9US0lQX1RYTUlDSykpCisjZGVmaW5lIFRLSVBfQVBfVFhNSUNLX09GRlNFVAkJKChMRU5fRUFQX0tFWSkrKExFTl9US0lQX0VLKSkKKyNkZWZpbmUgVEtJUF9BUF9SWE1JQ0tfT0ZGU0VUCQkoVEtJUF9BUF9UWE1JQ0tfT0ZGU0VUK0xFTl9US0lQX1RYTUlDSykKKyNkZWZpbmUgVEtJUF9HVEtfTEVOR1RICQkJCSgoTEVOX1RLSVBfRUspKyhMRU5fVEtJUF9SWE1JQ0spKyhMRU5fVEtJUF9UWE1JQ0spKQorI2RlZmluZSBMRU5fUFRLCQkJCQkJKChMRU5fRUFQX0tFWSkrKExFTl9US0lQX0tFWSkpCisKKy8vIFJTTiBJRSBMZW5ndGggZGVmaW5pdGlvbgorI2RlZmluZSBNQVhfTEVOX09GX1JTTklFICAgICAgICAgCTkwCisjZGVmaW5lIE1JTl9MRU5fT0ZfUlNOSUUgICAgICAgICAJOAorCisvL0VBUCBQYWNrZXQgVHlwZQorI2RlZmluZQlFQVBQYWNrZXQJCTAKKyNkZWZpbmUJRUFQT0xTdGFydAkJMQorI2RlZmluZQlFQVBPTExvZ29mZgkJMgorI2RlZmluZQlFQVBPTEtleQkJMworI2RlZmluZQlFQVBPTEFTRkFsZXJ0CTQKKyNkZWZpbmUJRUFQVHR5cGVNYXgJCTUKKworI2RlZmluZQlFQVBPTF9NU0dfSU5WQUxJRAkwCisjZGVmaW5lCUVBUE9MX1BBSVJfTVNHXzEJMQorI2RlZmluZQlFQVBPTF9QQUlSX01TR18yCTIKKyNkZWZpbmUJRUFQT0xfUEFJUl9NU0dfMwkzCisjZGVmaW5lCUVBUE9MX1BBSVJfTVNHXzQJNAorI2RlZmluZQlFQVBPTF9HUk9VUF9NU0dfMQk1CisjZGVmaW5lCUVBUE9MX0dST1VQX01TR18yCTYKKworI2RlZmluZSBQQUlSV0lTRUtFWQkJCQkJMQorI2RlZmluZSBHUk9VUEtFWQkJCQkJMAorCisvLyBSZXRyeSB0aW1lciBjb3VudGVyIGluaXRpYWwgdmFsdWUKKyNkZWZpbmUgUEVFUl9NU0cxX1JFVFJZX1RJTUVSX0NUUiAgICAgICAgICAgMAorI2RlZmluZSBQRUVSX01TRzNfUkVUUllfVElNRVJfQ1RSICAgICAgICAgICAxMAorI2RlZmluZSBHUk9VUF9NU0cxX1JFVFJZX1RJTUVSX0NUUiAgICAgICAgICAyMAorCisKKyNkZWZpbmUgRUFQT0xfU1RBUlRfRElTQUJMRQkJCQkJMAorI2RlZmluZSBFQVBPTF9TVEFSVF9QU0sJCQkJCQkxCisjZGVmaW5lIEVBUE9MX1NUQVJUXzFYCQkJCQkJMgorCisjZGVmaW5lIE1JWF9DSVBIRVJfV1BBX1RLSVBfT04oeCkgICAgICAgKCgoeCkgJiAweDA4KSAhPSAwKQorI2RlZmluZSBNSVhfQ0lQSEVSX1dQQV9BRVNfT04oeCkgICAgICAgICgoKHgpICYgMHgwNCkgIT0gMCkKKyNkZWZpbmUgTUlYX0NJUEhFUl9XUEEyX1RLSVBfT04oeCkgICAgICAoKCh4KSAmIDB4MDIpICE9IDApCisjZGVmaW5lIE1JWF9DSVBIRVJfV1BBMl9BRVNfT04oeCkgICAgICAgKCgoeCkgJiAweDAxKSAhPSAwKQorCisjZGVmaW5lIFJPVU5EX1VQKF9feCwgX195KSBcCisJKCgoVUxPTkcpKChfX3gpKygoX195KS0xKSkpICYgKChVTE9ORyl+KChfX3kpLTEpKSkKKworI2RlZmluZQlBRERfT05FX1RvXzY0QklUX1ZBUihfVikJCVwKK3sJCQkJCQkJCQkJXAorCVVDSEFSCWNudCA9IExFTl9LRVlfREVTQ19SRVBMQVk7CVwKKwlkbwkJCQkJCQkJCVwKKwl7CQkJCQkJCQkJXAorCQljbnQtLTsJCQkJCQkJXAorCQlfVltjbnRdKys7CQkJCQkJXAorCQlpZiAoY250ID09IDApCQkJCQlcCisJCQlicmVhazsJCQkJCQlcCisJfXdoaWxlIChfVltjbnRdID09IDApOwkJCQlcCit9CisKKyNkZWZpbmUgSVNfV1BBX0NBUEFCSUxJVFkoYSkgICAgICAgKCgoYSkgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSAmJiAoKGEpIDw9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLKSkKKworLy8gRUFQT0wgS2V5IEluZm9ybWF0aW9uIGRlZmluaXRpb24gd2l0aGluIEtleSBkZXNjcmlwdG9yIGZvcm1hdAordHlwZWRlZglzdHJ1Y3QgUEFDS0VEIF9LRVlfSU5GTworeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVQ0hBUglLZXlBY2s6MTsKKyAgICBVQ0hBUglJbnN0YWxsOjE7CisgICAgVUNIQVIJS2V5SW5kZXg6MjsKKyAgICBVQ0hBUglLZXlUeXBlOjE7CisgICAgVUNIQVIJS2V5RGVzY1ZlcjozOworICAgIFVDSEFSCVJzdmQ6MzsKKyAgICBVQ0hBUglFS0RfREw6MTsJCS8vIEVLRCBmb3IgQVA7IERMIGZvciBTVEEKKyAgICBVQ0hBUglSZXF1ZXN0OjE7CisgICAgVUNIQVIJRXJyb3I6MTsKKyAgICBVQ0hBUglTZWN1cmU6MTsKKyAgICBVQ0hBUglLZXlNaWM6MTsKKyNlbHNlCisJVUNIQVIJS2V5TWljOjE7CisJVUNIQVIJU2VjdXJlOjE7CisJVUNIQVIJRXJyb3I6MTsKKwlVQ0hBUglSZXF1ZXN0OjE7CisJVUNIQVIJRUtEX0RMOjE7ICAgICAgIC8vIEVLRCBmb3IgQVA7IERMIGZvciBTVEEKKwlVQ0hBUglSc3ZkOjM7CisJVUNIQVIJS2V5RGVzY1ZlcjozOworCVVDSEFSCUtleVR5cGU6MTsKKwlVQ0hBUglLZXlJbmRleDoyOworCVVDSEFSCUluc3RhbGw6MTsKKwlVQ0hBUglLZXlBY2s6MTsKKyNlbmRpZgorfQlLRVlfSU5GTywgKlBLRVlfSU5GTzsKKworLy8gRUFQT0wgS2V5IGRlc2NyaXB0b3IgZm9ybWF0Cit0eXBlZGVmCXN0cnVjdCBQQUNLRUQgX0tFWV9ERVNDUklQVEVSCit7CisJVUNIQVIJCVR5cGU7CisJS0VZX0lORk8JS2V5SW5mbzsKKwlVQ0hBUgkJS2V5TGVuZ3RoWzJdOworCVVDSEFSCQlSZXBsYXlDb3VudGVyW0xFTl9LRVlfREVTQ19SRVBMQVldOworCVVDSEFSCQlLZXlOb25jZVtMRU5fS0VZX0RFU0NfTk9OQ0VdOworCVVDSEFSCQlLZXlJdltMRU5fS0VZX0RFU0NfSVZdOworCVVDSEFSCQlLZXlSc2NbTEVOX0tFWV9ERVNDX1JTQ107CisJVUNIQVIJCUtleUlkW0xFTl9LRVlfREVTQ19JRF07CisJVUNIQVIJCUtleU1pY1tMRU5fS0VZX0RFU0NfTUlDXTsKKwlVQ0hBUgkJS2V5RGF0YUxlblsyXTsKKwlVQ0hBUgkJS2V5RGF0YVtNQVhfTEVOX09GX1JTTklFXTsKK30JS0VZX0RFU0NSSVBURVIsICpQS0VZX0RFU0NSSVBURVI7CisKK3R5cGVkZWYJc3RydWN0IFBBQ0tFRCBfRUFQT0xfUEFDS0VUCit7CisJVUNIQVIJIAkJCVByb1ZlcjsKKwlVQ0hBUgkgCQkJUHJvVHlwZTsKKwlVQ0hBUgkgCQkJQm9keV9MZW5bMl07CisJS0VZX0RFU0NSSVBURVIJCUtleURlc2M7Cit9CUVBUE9MX1BBQ0tFVCwgKlBFQVBPTF9QQUNLRVQ7CisKKy8vODAyLjExaSBEMTAgcGFnZSA4MwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9HVEtfRU5DQVAKK3sKKyNpZm5kZWYgUlRfQklHX0VORElBTgorICAgIFVDSEFSICAgICAgICAgICAgICAgS2lkOjI7CisgICAgVUNIQVIgICAgICAgICAgICAgICB0eDoxOworICAgIFVDSEFSICAgICAgICAgICAgICAgcnN2OjU7CisgICAgVUNIQVIgICAgICAgICAgICAgICByc3YxOworI2Vsc2UKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIHJzdjo1OworICAgIFVDSEFSICAgICAgICAgICAgICAgdHg6MTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIEtpZDoyOworICAgIFVDSEFSICAgICAgICAgICAgICAgcnN2MTsKKyNlbmRpZgorICAgIFVDSEFSICAgICAgICAgICAgICAgR1RLW1RLSVBfR1RLX0xFTkdUSF07Cit9ICAgR1RLX0VOQ0FQLCAqUEdUS19FTkNBUDsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9LREVfRU5DQVAKK3sKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIFR5cGU7CisgICAgVUNIQVIgICAgICAgICAgICAgICBMZW47CisgICAgVUNIQVIgICAgICAgICAgICAgICBPVUlbM107CisgICAgVUNIQVIgICAgICAgICAgICAgICBEYXRhVHlwZTsKKyAgICBHVEtfRU5DQVAgICAgICBHVEtFbmNhcDsKK30gICBLREVfRU5DQVAsICpQS0RFX0VOQ0FQOworCisvLyBGb3IgV1BBMQordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SU05JRSB7CisgICAgVUNIQVIgICBvdWlbNF07CisgICAgVVNIT1JUICB2ZXJzaW9uOworICAgIFVDSEFSICAgbWNhc3RbNF07CisgICAgVVNIT1JUICB1Y291bnQ7CisgICAgc3RydWN0IFBBQ0tFRCB7CisgICAgICAgIFVDSEFSIG91aVs0XTsKKyAgICB9dWNhc3RbMV07Cit9IFJTTklFLCAqUFJTTklFOworCisvLyBGb3IgV1BBMgordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SU05JRTIgeworICAgIFVTSE9SVCAgdmVyc2lvbjsKKyAgICBVQ0hBUiAgIG1jYXN0WzRdOworICAgIFVTSE9SVCAgdWNvdW50OworICAgIHN0cnVjdCBQQUNLRUQgeworICAgICAgICBVQ0hBUiBvdWlbNF07CisgICAgfXVjYXN0WzFdOworfSBSU05JRTIsICpQUlNOSUUyOworCisvLyBBS00gU3VpdGUKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUlNOSUVfQVVUSCB7CisgICAgVVNIT1JUIGFjb3VudDsKKyAgICBzdHJ1Y3QgUEFDS0VEIHsKKyAgICAgICAgVUNIQVIgb3VpWzRdOworICAgIH1hdXRoWzFdOworfSBSU05JRV9BVVRILCpQUlNOSUVfQVVUSDsKKwordHlwZWRlZgl1bmlvbiBQQUNLRUQgX1JTTl9DQVBBQklMSVRJRVMJeworCXN0cnVjdAlQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICAgICAgVVNIT1JUCQlSc3ZkOjEwOworICAgICAgICBVU0hPUlQJCUdUS1NBX1JfQ291bnRlcjoyOworICAgICAgICBVU0hPUlQJCVBUS1NBX1JfQ291bnRlcjoyOworICAgICAgICBVU0hPUlQJCU5vX1BhaXJ3aXNlOjE7CisJCVVTSE9SVAkJUHJlQXV0aDoxOworI2Vsc2UKKyAgICAgICAgVVNIT1JUCQlQcmVBdXRoOjE7CisJCVVTSE9SVAkJTm9fUGFpcndpc2U6MTsKKwkJVVNIT1JUCQlQVEtTQV9SX0NvdW50ZXI6MjsKKwkJVVNIT1JUCQlHVEtTQV9SX0NvdW50ZXI6MjsKKwkJVVNIT1JUCQlSc3ZkOjEwOworI2VuZGlmCisJfQlmaWVsZDsKKwlVU0hPUlQJCQl3b3JkOworfQlSU05fQ0FQQUJJTElUSUVTLCAqUFJTTl9DQVBBQklMSVRJRVM7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRUFQX0hEUiB7CisgICAgVUNIQVIgICBQcm9WZXI7CisgICAgVUNIQVIgICBQcm9UeXBlOworICAgIFVDSEFSICAgQm9keV9MZW5bMl07CisgICAgVUNIQVIgICBjb2RlOworICAgIFVDSEFSICAgaWRlbnRpZmllcjsKKyAgICBVQ0hBUiAgIGxlbmd0aFsyXTsgLy8gaW5jbHVkaW5nIGNvZGUgYW5kIGlkZW50aWZpZXIsIGZvbGxvd2VkIGJ5IGxlbmd0aC0yIG9jdGV0cyBvZiBkYXRhCit9IEVBUF9IRFIsICpQRUFQX0hEUjsKKworLy8gRm9yIHN1cHBsaWNhbnQgc3RhdGUgbWFjaGluZSBzdGF0ZXMuIDgwMi4xMWkgRHJhZnQgNC4xLCBwLiA5NworLy8gV2Ugc2ltcGxpZmllZCBpdAordHlwZWRlZgllbnVtCV9XcGFTdGF0ZQoreworCVNTX05PVFVTRSwJCQkJLy8gMAorCVNTX1NUQVJULAkJCQkvLyAxCisJU1NfV0FJVF9NU0dfMywJCQkvLyAyCisJU1NfV0FJVF9HUk9VUCwJCQkvLyAzCisJU1NfRklOSVNILCAgCQkJLy8gNAorCVNTX0tFWVVQREFURSwJCQkvLyA1Cit9CVdQQV9TVEFURTsKKworLy8KKy8vCVRoZSBkZWZpbml0aW9uIG9mIHRoZSBjaXBoZXIgY29tYmluYXRpb24KKy8vCisvLyAJIGJpdDMJYml0MiAgYml0MSAgIGJpdDAKKy8vCSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKworLy8gCXwJICBXUEEJIHwJICAgV1BBMiAgIHwKKy8vCSstLS0tLS0rLS0tLS0rLS0tLS0tKy0tLS0tKworLy8JfCBUS0lQIHwgQUVTIHwgVEtJUCB8IEFFUyB8CisvLwl8CTAgIHwgIDEgIHwgICAxICB8ICAwICB8IC0+IDB4MDYKKy8vCXwJMCAgfCAgMSAgfCAgIDEgIHwgIDEgIHwgLT4gMHgwNworLy8JfAkxICB8ICAwICB8ICAgMCAgfCAgMSAgfCAtPiAweDA5CisvLwl8CTEgIHwgIDAgIHwgICAxICB8ICAxICB8IC0+IDB4MEIKKy8vCXwJMSAgfCAgMSAgfCAgIDAgIHwgIDEgIHwgLT4gMHgwRAorLy8JfAkxICB8ICAxICB8ICAgMSAgfCAgMCAgfCAtPiAweDBFCisvLwl8CTEgIHwgIDEgIHwgICAxICB8ICAxICB8CS0+IDB4MEYKKy8vCSstLS0tLS0rLS0tLS0rLS0tLS0tKy0tLS0tKworLy8KK3R5cGVkZWYJZW51bQlfV3BhTWl4UGFpckNpcGhlcgoreworCU1JWF9DSVBIRVJfTk9UVVNFIAkJCT0gMHgwMCwKKwlXUEFfTk9ORV9XUEEyX1RLSVBBRVMJCT0gMHgwMywJCS8vIFdQQTItVEtJUEFFUworCVdQQV9BRVNfV1BBMl9US0lQIAkJCT0gMHgwNiwKKwlXUEFfQUVTX1dQQTJfVEtJUEFFUwkJPSAweDA3LAorCVdQQV9US0lQX1dQQTJfQUVTCQkJPSAweDA5LAorCVdQQV9US0lQX1dQQTJfVEtJUEFFUwkJPSAweDBCLAorCVdQQV9US0lQQUVTX1dQQTJfTk9ORQkJPSAweDBDLAkJLy8gV1BBLVRLSVBBRVMKKwlXUEFfVEtJUEFFU19XUEEyX0FFUwkJPSAweDBELAorCVdQQV9US0lQQUVTX1dQQTJfVEtJUAkJPSAweDBFLAorCVdQQV9US0lQQUVTX1dQQTJfVEtJUEFFUwk9IDB4MEYsCit9CVdQQV9NSVhfUEFJUl9DSVBIRVI7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUlNOX0lFX0hFQURFUl9TVFJVQ1QJeworCVVDSEFSCQlFaWQ7CisJVUNIQVIJCUxlbmd0aDsKKwlVU0hPUlQJCVZlcnNpb247CS8vIExpdHRsZSBlbmRpYW4gZm9ybWF0Cit9CVJTTl9JRV9IRUFERVJfU1RSVUNULCAqUFJTTl9JRV9IRUFERVJfU1RSVUNUOworCisvLyBDaXBoZXIgc3VpdGUgc2VsZWN0b3IgdHlwZXMKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfQ0lQSEVSX1NVSVRFX1NUUlVDVAl7CisJVUNIQVIJCU91aVszXTsKKwlVQ0hBUgkJVHlwZTsKK30JQ0lQSEVSX1NVSVRFX1NUUlVDVCwgKlBDSVBIRVJfU1VJVEVfU1RSVUNUOworCisvLyBBdXRoZW50aWNhdGlvbiBhbmQgS2V5IE1hbmFnZW1lbnQgc3VpdGUgc2VsZWN0b3IKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfQUtNX1NVSVRFX1NUUlVDVAl7CisJVUNIQVIJCU91aVszXTsKKwlVQ0hBUgkJVHlwZTsKK30JQUtNX1NVSVRFX1NUUlVDVCwgKlBBS01fU1VJVEVfU1RSVUNUOworCisvLyBSU04gY2FwYWJpbGl0eQordHlwZWRlZiBzdHJ1Y3QJUEFDS0VEIF9SU05fQ0FQQUJJTElUWQl7CisJVVNIT1JUCQlSc3Y6MTA7CisJVVNIT1JUCQlHVEtTQVJlcGxheUNudDoyOworCVVTSE9SVAkJUFRLU0FSZXBsYXlDbnQ6MjsKKwlVU0hPUlQJCU5vUGFpcndpc2U6MTsKKwlVU0hPUlQJCVByZUF1dGg6MTsKK30JUlNOX0NBUEFCSUxJVFksICpQUlNOX0NBUEFCSUxJVFk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC8yODcwX21haW5fZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwLzI4NzBfbWFpbl9kZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGM3NjRkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC8yODcwX21haW5fZGV2LmMKQEAgLTAsMCArMSwxNjEyIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorICAgIHJ0bXBfbWFpbi5jCisKKyAgICBBYnN0cmFjdDoKKyAgICBtYWluIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzCisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBOYW1lICAgICAgICBEYXRlICAgICAgICAgICAgTW9kaWZpY2F0aW9uIGxvZ3MKKyAgICBKYW4gTGVlCQkwMS0xMC0yMDA1CSAgICBtb2RpZmllZAorCVNhbXBsZQkJSnVuLzAxLzA3CQlNZXJnZSBSVDI4NzAgYW5kIFJUMjg2MCBkcml2ZXJzLgorKi8KKworI2luY2x1ZGUgInJ0X2NvbmZpZy5oIgorCisKKy8vIEZvbGxvd2luZyBpbmZvcm1hdGlvbiB3aWxsIGJlIHNob3cgd2hlbiB5b3UgcnVuICdtb2RpbmZvJworLy8gKioqIElmIHlvdSBoYXZlIGEgc29sdXRpb24gZm9yIHRoZSBidWcgaW4gY3VycmVudCB2ZXJzaW9uIG9mIGRyaXZlciwgcGxlYXNlIG1haWwgdG8gbWUuCisvLyBPdGhlcndpc2UgcG9zdCB0byBmb3J1bSBpbiByYWxpbmt0ZWNoJ3Mgd2ViIHNpdGUod3d3LnJhbGlua3RlY2guY29tKSBhbmQgbGV0IGFsbCB1c2VycyBoZWxwIHlvdS4gKioqCitNT0RVTEVfQVVUSE9SKCJQYXVsIExpbiA8cGF1bF9saW5AcmFsaW5rdGVjaC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJUMjg3MCBXaXJlbGVzcyBMYW4gTGludXggRHJpdmVyIik7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisjaWZkZWYgTU9EVUxFX1ZFUlNJT04KK01PRFVMRV9WRVJTSU9OKFNUQV9EUklWRVJfVkVSU0lPTik7CisjZW5kaWYKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAorLy8gcmVjb3JkIHdoZXRoZXIgdGhlIGNhcmQgaW4gdGhlIGNhcmQgbGlzdCBpcyB1c2VkIGluIHRoZSBjYXJkIGZpbGUKK2V4dGVybiBVSU5UOCAgTUNfQ2FyZFVzZWRbXTsKKyNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KKworLyogS2VybmVsIHRocmVhZCBhbmQgdmFycywgd2hpY2ggaGFuZGxlcyBwYWNrZXRzIHRoYXQgYXJlIGNvbXBsZXRlZC4gT25seQorICogcGFja2V0cyB0aGF0IGhhdmUgYSAiY29tcGxldGUiIGZ1bmN0aW9uIGFyZSBzZW50IGhlcmUuIFRoaXMgd2F5LCB0aGUKKyAqIGNvbXBsZXRpb24gaXMgcnVuIG91dCBvZiBrZXJuZWwgY29udGV4dCwgYW5kIGRvZXNuJ3QgYmxvY2sgdGhlIHJlc3Qgb2YKKyAqIHRoZSBzdGFjay4gKi8KKworZXh0ZXJuIElOVCBfX2RldmluaXQgcnQyOHh4X3Byb2JlKElOIHZvaWQgKl9kZXZfcCwgSU4gdm9pZCAqX2Rldl9pZF9wLAorCQkJCQkJCQkJSU4gVUlOVCBhcmdjLCBPVVQgUFJUTVBfQURBUFRFUiAqcHBBZCk7CisKKworLyogbW9kdWxlIHRhYmxlICovCitzdHJ1Y3QgdXNiX2RldmljZV9pZCAgICBydHVzYl91c2JfaWRbXSA9IFJUMjg3MF9VU0JfREVWSUNFUzsKK0lOVCBjb25zdCAgICAgICAgICAgICAgIHJ0dXNiX3VzYl9pZF9sZW4gPSBzaXplb2YocnR1c2JfdXNiX2lkKSAvIHNpemVvZihzdHJ1Y3QgdXNiX2RldmljZV9pZCk7CitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgcnR1c2JfdXNiX2lkKTsKKworI2lmbmRlZiBQRl9OT0ZSRUVaRQorI2RlZmluZSBQRl9OT0ZSRUVaRSAgMAorI2VuZGlmCisKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvL3Rlc3RlZCBmb3Iga2VybmVsIDIuNCBzZXJpZXMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkICpydHVzYl9wcm9iZShzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBVSU5UIGludGVyZmFjZSwKKwkJCQkJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZF90YWJsZSk7CitzdGF0aWMgdm9pZCBydHVzYl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHZvaWQgKnB0cik7CisKK3N0cnVjdCB1c2JfZHJpdmVyIHJ0dXNiX2RyaXZlciA9IHsKKwkJbmFtZToicnQyODcwIiwKKwkJcHJvYmU6cnR1c2JfcHJvYmUsCisJCWRpc2Nvbm5lY3Q6cnR1c2JfZGlzY29ubmVjdCwKKwkJaWRfdGFibGU6cnR1c2JfdXNiX2lkLAorCX07CisKKyNlbHNlCisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgcnQyODcwX3N1c3BlbmQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CitzdGF0aWMgaW50IHJ0Mjg3MF9yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOworI2VuZGlmIC8vIENPTkZJR19QTSAvLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvL3Rlc3RlZCBmb3Iga2VybmVsIDIuNnNlcmllcworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBydHVzYl9wcm9iZSAoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCQkJCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpOworc3RhdGljIHZvaWQgcnR1c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CisKK3N0cnVjdCB1c2JfZHJpdmVyIHJ0dXNiX2RyaXZlciA9IHsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMTUpCisJLm93bmVyID0gVEhJU19NT0RVTEUsCisjZW5kaWYKKwkubmFtZT0icnQyODcwIiwKKwkucHJvYmU9cnR1c2JfcHJvYmUsCisJLmRpc2Nvbm5lY3Q9cnR1c2JfZGlzY29ubmVjdCwKKwkuaWRfdGFibGU9cnR1c2JfdXNiX2lkLAorCisjaWZkZWYgQ09ORklHX1BNCisJc3VzcGVuZDoJcnQyODcwX3N1c3BlbmQsCisJcmVzdW1lOgkJcnQyODcwX3Jlc3VtZSwKKyNlbmRpZgorCX07CisKKyNpZmRlZiBDT05GSUdfUE0KKworVk9JRCBSVDI4NjBSZWplY3RQZW5kaW5nUGFja2V0cygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwkvLyBjbGVhciBQUyBwYWNrZXRzCisJLy8gY2xlYXIgVHhTdyBwYWNrZXRzCit9CisKK3N0YXRpYyBpbnQgcnQyODcwX3N1c3BlbmQoCisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2OworCVBSVE1QX0FEQVBURVIgcEFkID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBydDI4NzBfc3VzcGVuZCgpXG4iKSk7CisJbmV0X2RldiA9IHBBZC0+bmV0X2RldjsKKwluZXRpZl9kZXZpY2VfZGV0YWNoIChuZXRfZGV2KTsKKworCXBBZC0+UE1fRmxnU3VzcGVuZCA9IDE7CisJaWYgKG5ldGlmX3J1bm5pbmcobmV0X2RldikpIHsKKwkJUlRVU0JDYW5jZWxQZW5kaW5nQnVsa0luSVJQKHBBZCk7CisJCVJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtPdXRJUlAocEFkKTsKKwl9CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PSBydDI4NzBfc3VzcGVuZCgpXG4iKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnQyODcwX3Jlc3VtZSgKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldjsKKwlQUlRNUF9BREFQVEVSIHBBZCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnQyODcwX3Jlc3VtZSgpXG4iKSk7CisKKwlwQWQtPlBNX0ZsZ1N1c3BlbmQgPSAwOworCW5ldF9kZXYgPSBwQWQtPm5ldF9kZXY7CisJbmV0aWZfZGV2aWNlX2F0dGFjaCAobmV0X2Rldik7CisJbmV0aWZfc3RhcnRfcXVldWUobmV0X2Rldik7CisJbmV0aWZfY2Fycmllcl9vbihuZXRfZGV2KTsKKwluZXRpZl93YWtlX3F1ZXVlKG5ldF9kZXYpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PSBydDI4NzBfcmVzdW1lKClcbiIpKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvLyBDT05GSUdfUE0gLy8KKyNlbmRpZiAvLyBMSU5VWF9WRVJTSU9OX0NPREUgLy8KKworCisvLyBJbml0IGRyaXZlciBtb2R1bGUKK0lOVCBfX2luaXQgcnR1c2JfaW5pdCh2b2lkKQoreworCXByaW50aygicnR1c2IgaW5pdCAtLS0+XG4iKTsKKwlyZXR1cm4gdXNiX3JlZ2lzdGVyKCZydHVzYl9kcml2ZXIpOworfQorCisvLyBEZWluaXQgZHJpdmVyIG1vZHVsZQorVk9JRCBfX2V4aXQgcnR1c2JfZXhpdCh2b2lkKQoreworCXVzYl9kZXJlZ2lzdGVyKCZydHVzYl9kcml2ZXIpOworCXByaW50aygiPC0tLSBydHVzYiBleGl0XG4iKTsKK30KKworbW9kdWxlX2luaXQocnR1c2JfaW5pdCk7Cittb2R1bGVfZXhpdChydHVzYl9leGl0KTsKKworCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JKi8KKy8qIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucwkJCQkJCQkJCQkJCSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkqLworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIE1MTUUga2VybmVsIHRocmVhZC4KKworQXJndW1lbnRzOgorCSpDb250ZXh0CQkJdGhlIHBBZCwgZHJpdmVyIGNvbnRyb2wgYmxvY2sgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisgICAgMAkJCQkJY2xvc2UgdGhlIHRocmVhZAorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIE1sbWVUaHJlYWQoCisJSU4gdm9pZCAqQ29udGV4dCkKK3sKKwlQUlRNUF9BREFQVEVSCXBBZCA9IChQUlRNUF9BREFQVEVSKUNvbnRleHQ7CisJUE9TX0NPT0tJRQlwT2JqOworCWludCBzdGF0dXM7CisKKwlwT2JqID0gKFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7CisKKwlydG1wX29zX3RocmVhZF9pbml0KCJydDI4NzBNbG1lVGhyZWFkIiwgKFBWT0lEKSYocEFkLT5tbG1lQ29tcGxldGUpKTsKKworCXdoaWxlIChwQWQtPm1sbWVfa2lsbCA9PSAwKQorCXsKKwkJLyogbG9jayB0aGUgZGV2aWNlIHBvaW50ZXJzICovCisJCS8vZG93bigmKHBBZC0+bWxtZV9zZW1hcGhvcmUpKTsKKwkJc3RhdHVzID0gZG93bl9pbnRlcnJ1cHRpYmxlKCYocEFkLT5tbG1lX3NlbWFwaG9yZSkpOworCisJCS8qIGxvY2sgdGhlIGRldmljZSBwb2ludGVycyAsIG5lZWQgdG8gY2hlY2sgaWYgcmVxdWlyZWQqLworCQkvL2Rvd24oJihwQWQtPnVzYmRldl9zZW1hcGhvcmUpKTsKKworCQlpZiAoIXBBZC0+UE1fRmxnU3VzcGVuZCkKKwkJTWxtZUhhbmRsZXIocEFkKTsKKworCQkvKiB1bmxvY2sgdGhlIGRldmljZSBwb2ludGVycyAqLworCQkvL3VwKCYocEFkLT51c2JkZXZfc2VtYXBob3JlKSk7CisJCWlmIChzdGF0dXMgIT0gMCkKKwkJeworCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIG5vdGlmeSB0aGUgZXhpdCByb3V0aW5lIHRoYXQgd2UncmUgYWN0dWFsbHkgZXhpdGluZyBub3cKKwkgKgorCSAqIGNvbXBsZXRlKCkvd2FpdF9mb3JfY29tcGxldGlvbigpIGlzIHNpbWlsYXIgdG8gdXAoKS9kb3duKCksCisJICogZXhjZXB0IHRoYXQgY29tcGxldGUoKSBpcyBzYWZlIGluIHRoZSBjYXNlIHdoZXJlIHRoZSBzdHJ1Y3R1cmUKKwkgKiBpcyBnZXR0aW5nIGRlbGV0ZWQgaW4gYSBwYXJhbGxlbCBtb2RlIG9mIGV4ZWN1dGlvbiAoaS5lLiBqdXN0CisJICogYWZ0ZXIgdGhlIGRvd24oKSAtLSB0aGF0J3MgbmVjZXNzYXJ5IGZvciB0aGUgdGhyZWFkLXNodXRkb3duCisJICogY2FzZS4KKwkgKgorCSAqIGNvbXBsZXRlX2FuZF9leGl0KCkgZ29lcyBldmVuIGZ1cnRoZXIgdGhhbiB0aGlzIC0tIGl0IGlzIHNhZmUgaW4KKwkgKiB0aGUgY2FzZSB0aGF0IHRoZSB0aHJlYWQgb2YgdGhlIGNhbGxlciBpcyBnb2luZyBhd2F5IChub3QganVzdAorCSAqIHRoZSBzdHJ1Y3R1cmUpIC0tIHRoaXMgaXMgbmVjZXNzYXJ5IGZvciB0aGUgbW9kdWxlLXJlbW92ZSBjYXNlLgorCSAqIFRoaXMgaXMgaW1wb3J0YW50IGluIHByZWVtcHRpb24ga2VybmVscywgd2hpY2ggdHJhbnNmZXIgdGhlIGZsb3cKKwkgKiBvZiBleGVjdXRpb24gaW1tZWRpYXRlbHkgdXBvbiBhIGNvbXBsZXRlKCkuCisJICovCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCAiPC0tLSVzXG4iLF9fZnVuY19fKSk7CisKKwlwT2JqLT5NTE1FVGhyX3BpZCA9IFRIUkVBRF9QSURfSU5JVF9WQUxVRTsKKworCWNvbXBsZXRlX2FuZF9leGl0ICgmcEFkLT5tbG1lQ29tcGxldGUsIDApOworCXJldHVybiAwOworCit9CisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBVU0IgY29tbWFuZCBrZXJuZWwgdGhyZWFkLgorCitBcmd1bWVudHM6CisJKkNvbnRleHQJCQl0aGUgcEFkLCBkcml2ZXIgY29udHJvbCBibG9jayBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKyAgICAwCQkJCQljbG9zZSB0aGUgdGhyZWFkCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgUlRVU0JDbWRUaHJlYWQoCisJSU4gdm9pZCAqIENvbnRleHQpCit7CisJUFJUTVBfQURBUFRFUglwQWQgPSAoUFJUTVBfQURBUFRFUilDb250ZXh0OworCVBPU19DT09LSUUJCXBPYmo7CisJaW50IHN0YXR1czsKKworCXBPYmogPSAoUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKKworCXJ0bXBfb3NfdGhyZWFkX2luaXQoInJ0Mjg3MENtZFRocmVhZCIsIChQVk9JRCkmKHBBZC0+Q21kUUNvbXBsZXRlKSk7CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKKwlwQWQtPkNtZFEuQ21kUVN0YXRlID0gUlQyODcwX1RIUkVBRF9SVU5OSU5HOworCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOworCisJd2hpbGUgKHBBZC0+Q21kUS5DbWRRU3RhdGUgPT0gUlQyODcwX1RIUkVBRF9SVU5OSU5HKQorCXsKKwkJLyogbG9jayB0aGUgZGV2aWNlIHBvaW50ZXJzICovCisJCS8vZG93bigmKHBBZC0+UlRVU0JDbWRfc2VtYXBob3JlKSk7CisJCXN0YXR1cyA9IGRvd25faW50ZXJydXB0aWJsZSgmKHBBZC0+UlRVU0JDbWRfc2VtYXBob3JlKSk7CisKKwkJaWYgKHBBZC0+Q21kUS5DbWRRU3RhdGUgPT0gUlQyODcwX1RIUkVBRF9TVE9QRUQpCisJCQlicmVhazsKKworCQlpZiAoc3RhdHVzICE9IDApCisJCXsKKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpOworCQkJYnJlYWs7CisJCX0KKwkJLyogbG9jayB0aGUgZGV2aWNlIHBvaW50ZXJzICwgbmVlZCB0byBjaGVjayBpZiByZXF1aXJlZCovCisJCS8vZG93bigmKHBBZC0+dXNiZGV2X3NlbWFwaG9yZSkpOworCisJCWlmICghcEFkLT5QTV9GbGdTdXNwZW5kKQorCQlDTURIYW5kbGVyKHBBZCk7CisKKwkJLyogdW5sb2NrIHRoZSBkZXZpY2UgcG9pbnRlcnMgKi8KKwkJLy91cCgmKHBBZC0+dXNiZGV2X3NlbWFwaG9yZSkpOworCX0KKworCWlmICghcEFkLT5QTV9GbGdTdXNwZW5kKQorCXsJLy8gQ2xlYXIgdGhlIENtZFFFbGVtZW50cy4KKwkJQ21kUUVsbXQJKnBDbWRRRWxtdCA9IE5VTEw7CisKKwkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5DbWRRTG9jayk7CisJCXBBZC0+Q21kUS5DbWRRU3RhdGUgPSBSVDI4NzBfVEhSRUFEX1NUT1BFRDsKKwkJd2hpbGUocEFkLT5DbWRRLnNpemUpCisJCXsKKwkJCVJUVVNCRGVxdWV1ZUNtZCgmcEFkLT5DbWRRLCAmcENtZFFFbG10KTsKKwkJCWlmIChwQ21kUUVsbXQpCisJCQl7CisJCQkJaWYgKHBDbWRRRWxtdC0+Q21kRnJvbU5kaXMgPT0gVFJVRSkKKwkJCQl7CisJCQkJCWlmIChwQ21kUUVsbXQtPmJ1ZmZlciAhPSBOVUxMKQorCQkJCQkJTmRpc0ZyZWVNZW1vcnkocENtZFFFbG10LT5idWZmZXIsIHBDbWRRRWxtdC0+YnVmZmVybGVuZ3RoLCAwKTsKKworCQkJCQlOZGlzRnJlZU1lbW9yeShwQ21kUUVsbXQsIHNpemVvZihDbWRRRWxtdCksIDApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlpZiAoKHBDbWRRRWxtdC0+YnVmZmVyICE9IE5VTEwpICYmIChwQ21kUUVsbXQtPmJ1ZmZlcmxlbmd0aCAhPSAwKSkKKwkJCQkJCU5kaXNGcmVlTWVtb3J5KHBDbWRRRWxtdC0+YnVmZmVyLCBwQ21kUUVsbXQtPmJ1ZmZlcmxlbmd0aCwgMCk7CisJCSAgICAgICAgICAgIHsKKwkJCQkJCU5kaXNGcmVlTWVtb3J5KHBDbWRRRWxtdCwgc2l6ZW9mKENtZFFFbG10KSwgMCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKKwl9CisJLyogbm90aWZ5IHRoZSBleGl0IHJvdXRpbmUgdGhhdCB3ZSdyZSBhY3R1YWxseSBleGl0aW5nIG5vdworCSAqCisJICogY29tcGxldGUoKS93YWl0X2Zvcl9jb21wbGV0aW9uKCkgaXMgc2ltaWxhciB0byB1cCgpL2Rvd24oKSwKKwkgKiBleGNlcHQgdGhhdCBjb21wbGV0ZSgpIGlzIHNhZmUgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHN0cnVjdHVyZQorCSAqIGlzIGdldHRpbmcgZGVsZXRlZCBpbiBhIHBhcmFsbGVsIG1vZGUgb2YgZXhlY3V0aW9uIChpLmUuIGp1c3QKKwkgKiBhZnRlciB0aGUgZG93bigpIC0tIHRoYXQncyBuZWNlc3NhcnkgZm9yIHRoZSB0aHJlYWQtc2h1dGRvd24KKwkgKiBjYXNlLgorCSAqCisJICogY29tcGxldGVfYW5kX2V4aXQoKSBnb2VzIGV2ZW4gZnVydGhlciB0aGFuIHRoaXMgLS0gaXQgaXMgc2FmZSBpbgorCSAqIHRoZSBjYXNlIHRoYXQgdGhlIHRocmVhZCBvZiB0aGUgY2FsbGVyIGlzIGdvaW5nIGF3YXkgKG5vdCBqdXN0CisJICogdGhlIHN0cnVjdHVyZSkgLS0gdGhpcyBpcyBuZWNlc3NhcnkgZm9yIHRoZSBtb2R1bGUtcmVtb3ZlIGNhc2UuCisJICogVGhpcyBpcyBpbXBvcnRhbnQgaW4gcHJlZW1wdGlvbiBrZXJuZWxzLCB3aGljaCB0cmFuc2ZlciB0aGUgZmxvdworCSAqIG9mIGV4ZWN1dGlvbiBpbW1lZGlhdGVseSB1cG9uIGEgY29tcGxldGUoKS4KKwkgKi8KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoICI8LS0tUlRVU0JDbWRUaHJlYWRcbiIpKTsKKworCXBPYmotPlJUVVNCQ21kVGhyX3BpZCA9IFRIUkVBRF9QSURfSU5JVF9WQUxVRTsKKworCWNvbXBsZXRlX2FuZF9leGl0ICgmcEFkLT5DbWRRQ29tcGxldGUsIDApOworCXJldHVybiAwOworCit9CisKKworc3RhdGljIHZvaWQgUlQyODcwX1RpbWVyUV9IYW5kbGUoUlRNUF9BREFQVEVSICpwQWQpCit7CisJaW50IHN0YXR1czsKKwlSQUxJTktfVElNRVJfU1RSVUNUCSpwVGltZXI7CisJUlQyODcwX1RJTUVSX0VOVFJZCSpwRW50cnk7CisJdW5zaWduZWQgbG9uZwlpcnFGbGFnOworCisJd2hpbGUoIXBBZC0+VGltZXJGdW5jX2tpbGwpCisJeworLy8JCXByaW50aygid2FpdGluZyBmb3IgZXZlbnQhXG4iKTsKKwkJcFRpbWVyID0gTlVMTDsKKworCQlzdGF0dXMgPSBkb3duX2ludGVycnVwdGlibGUoJihwQWQtPlJUVVNCVGltZXJfc2VtYXBob3JlKSk7CisKKwkJaWYgKHBBZC0+VGltZXJRLnN0YXR1cyA9PSBSVDI4NzBfVEhSRUFEX1NUT1BFRCkKKwkJCWJyZWFrOworCisJCS8vIGV2ZW50IGhhcHBlbmVkLgorCQl3aGlsZShwQWQtPlRpbWVyUS5wUUhlYWQpCisJCXsKKwkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZyk7CisJCQlwRW50cnkgPSBwQWQtPlRpbWVyUS5wUUhlYWQ7CisJCQlpZiAocEVudHJ5KQorCQkJeworCQkJCXBUaW1lciA9IHBFbnRyeS0+cFJhVGltZXI7CisKKwkJCQkvLyB1cGRhdGUgcFFIZWFkCisJCQkJcEFkLT5UaW1lclEucFFIZWFkID0gcEVudHJ5LT5wTmV4dDsKKwkJCQlpZiAocEVudHJ5ID09IHBBZC0+VGltZXJRLnBRVGFpbCkKKwkJCQkJcEFkLT5UaW1lclEucFFUYWlsID0gTlVMTDsKKworCQkJCS8vIHJldHVybiB0aGlzIHF1ZXVlIGVudHJ5IHRvIHRpbWVyUUZyZWVMaXN0LgorCQkJCXBFbnRyeS0+cE5leHQgPSBwQWQtPlRpbWVyUS5wUVBvbGxGcmVlTGlzdDsKKwkJCQlwQWQtPlRpbWVyUS5wUVBvbGxGcmVlTGlzdCA9IHBFbnRyeTsKKwkJCX0KKwkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFnKTsKKworCQkJaWYgKHBUaW1lcikKKwkJCXsKKwkJCQlpZiAocFRpbWVyLT5oYW5kbGUgIT0gTlVMTCkKKwkJCQlpZiAoIXBBZC0+UE1fRmxnU3VzcGVuZCkKKwkJCQkJcFRpbWVyLT5oYW5kbGUoTlVMTCwgKFBWT0lEKSBwVGltZXItPmNvb2tpZSwgTlVMTCwgcFRpbWVyKTsKKwkJCQlpZiAoKHBUaW1lci0+UmVwZWF0KSAmJiAocFRpbWVyLT5TdGF0ZSA9PSBGQUxTRSkpCisJCQkJCVJUTVBfT1NfQWRkX1RpbWVyKCZwVGltZXItPlRpbWVyT2JqLCBwVGltZXItPlRpbWVyVmFsdWUpOworCQkJfQorCQl9CisKKwkJaWYgKHN0YXR1cyAhPSAwKQorCQl7CisJCQlwQWQtPlRpbWVyUS5zdGF0dXMgPSBSVDI4NzBfVEhSRUFEX1NUT1BFRDsKKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKworSU5UIFRpbWVyUVRocmVhZCgKKwlJTiBPVVQgUFZPSUQgQ29udGV4dCkKK3sKKwlQUlRNUF9BREFQVEVSCXBBZDsKKwlQT1NfQ09PS0lFCXBPYmo7CisKKwlwQWQgPSAoUFJUTVBfQURBUFRFUilDb250ZXh0OworCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwlydG1wX29zX3RocmVhZF9pbml0KCJydDI4NzBUaW1lclFIYW5kbGUiLCAoUFZPSUQpJihwQWQtPlRpbWVyUUNvbXBsZXRlKSk7CisKKwlSVDI4NzBfVGltZXJRX0hhbmRsZShwQWQpOworCisJLyogbm90aWZ5IHRoZSBleGl0IHJvdXRpbmUgdGhhdCB3ZSdyZSBhY3R1YWxseSBleGl0aW5nIG5vdworCSAqCisJICogY29tcGxldGUoKS93YWl0X2Zvcl9jb21wbGV0aW9uKCkgaXMgc2ltaWxhciB0byB1cCgpL2Rvd24oKSwKKwkgKiBleGNlcHQgdGhhdCBjb21wbGV0ZSgpIGlzIHNhZmUgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHN0cnVjdHVyZQorCSAqIGlzIGdldHRpbmcgZGVsZXRlZCBpbiBhIHBhcmFsbGVsIG1vZGUgb2YgZXhlY3V0aW9uIChpLmUuIGp1c3QKKwkgKiBhZnRlciB0aGUgZG93bigpIC0tIHRoYXQncyBuZWNlc3NhcnkgZm9yIHRoZSB0aHJlYWQtc2h1dGRvd24KKwkgKiBjYXNlLgorCSAqCisJICogY29tcGxldGVfYW5kX2V4aXQoKSBnb2VzIGV2ZW4gZnVydGhlciB0aGFuIHRoaXMgLS0gaXQgaXMgc2FmZSBpbgorCSAqIHRoZSBjYXNlIHRoYXQgdGhlIHRocmVhZCBvZiB0aGUgY2FsbGVyIGlzIGdvaW5nIGF3YXkgKG5vdCBqdXN0CisJICogdGhlIHN0cnVjdHVyZSkgLS0gdGhpcyBpcyBuZWNlc3NhcnkgZm9yIHRoZSBtb2R1bGUtcmVtb3ZlIGNhc2UuCisJICogVGhpcyBpcyBpbXBvcnRhbnQgaW4gcHJlZW1wdGlvbiBrZXJuZWxzLCB3aGljaCB0cmFuc2ZlciB0aGUgZmxvdworCSAqIG9mIGV4ZWN1dGlvbiBpbW1lZGlhdGVseSB1cG9uIGEgY29tcGxldGUoKS4KKwkgKi8KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoICI8LS0tJXNcbiIsX19mdW5jX18pKTsKKworCXBPYmotPlRpbWVyUVRocl9waWQgPSBUSFJFQURfUElEX0lOSVRfVkFMVUU7CisKKwljb21wbGV0ZV9hbmRfZXhpdCgmcEFkLT5UaW1lclFDb21wbGV0ZSwgMCk7CisJcmV0dXJuIDA7CisKK30KKworCitSVDI4NzBfVElNRVJfRU5UUlkgKlJUMjg3MF9UaW1lclFfSW5zZXJ0KAorCUlOIFJUTVBfQURBUFRFUiAqcEFkLAorCUlOIFJBTElOS19USU1FUl9TVFJVQ1QgKnBUaW1lcikKK3sKKwlSVDI4NzBfVElNRVJfRU5UUlkgKnBRTm9kZSA9IE5VTEwsICpwUVRhaWw7CisJdW5zaWduZWQgbG9uZyBpcnFGbGFnczsKKworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFncyk7CisJaWYgKHBBZC0+VGltZXJRLnN0YXR1cyAmIFJUMjg3MF9USFJFQURfQ0FOX0RPX0lOU0VSVCkKKwl7CisJCWlmKHBBZC0+VGltZXJRLnBRUG9sbEZyZWVMaXN0KQorCQl7CisJCQlwUU5vZGUgPSBwQWQtPlRpbWVyUS5wUVBvbGxGcmVlTGlzdDsKKwkJCXBBZC0+VGltZXJRLnBRUG9sbEZyZWVMaXN0ID0gcFFOb2RlLT5wTmV4dDsKKworCQkJcFFOb2RlLT5wUmFUaW1lciA9IHBUaW1lcjsKKwkJCXBRTm9kZS0+cE5leHQgPSBOVUxMOworCisJCQlwUVRhaWwgPSBwQWQtPlRpbWVyUS5wUVRhaWw7CisJCQlpZiAocEFkLT5UaW1lclEucFFUYWlsICE9IE5VTEwpCisJCQkJcFFUYWlsLT5wTmV4dCA9IHBRTm9kZTsKKwkJCXBBZC0+VGltZXJRLnBRVGFpbCA9IHBRTm9kZTsKKwkJCWlmIChwQWQtPlRpbWVyUS5wUUhlYWQgPT0gTlVMTCkKKwkJCQlwQWQtPlRpbWVyUS5wUUhlYWQgPSBwUU5vZGU7CisJCX0KKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWdzKTsKKworCQlpZiAocFFOb2RlKQorCQkJdXAoJnBBZC0+UlRVU0JUaW1lcl9zZW1hcGhvcmUpOworCQkJLy93YWtlX3VwKCZ0aW1lcldhaXRRKTsKKwl9CisJZWxzZQorCXsKKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWdzKTsKKwl9CisJcmV0dXJuIHBRTm9kZTsKK30KKworCitCT09MRUFOIFJUMjg3MF9UaW1lclFfUmVtb3ZlKAorCUlOIFJUTVBfQURBUFRFUiAqcEFkLAorCUlOIFJBTElOS19USU1FUl9TVFJVQ1QgKnBUaW1lcikKK3sKKwlSVDI4NzBfVElNRVJfRU5UUlkgKnBOb2RlLCAqcFByZXYgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgaXJxRmxhZ3M7CisKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWdzKTsKKwlpZiAocEFkLT5UaW1lclEuc3RhdHVzID49IFJUMjg3MF9USFJFQURfSU5JVEVEKQorCXsKKwkJcE5vZGUgPSBwQWQtPlRpbWVyUS5wUUhlYWQ7CisJCXdoaWxlIChwTm9kZSkKKwkJeworCQkJaWYgKHBOb2RlLT5wUmFUaW1lciA9PSBwVGltZXIpCisJCQkJYnJlYWs7CisJCQlwUHJldiA9IHBOb2RlOworCQkJcE5vZGUgPSBwTm9kZS0+cE5leHQ7CisJCX0KKworCQkvLyBOb3cgbW92ZSBpdCB0byBmcmVlTGlzdCBxdWV1ZS4KKwkJaWYgKHBOb2RlKQorCQl7CisJCQlpZiAocE5vZGUgPT0gcEFkLT5UaW1lclEucFFIZWFkKQorCQkJCXBBZC0+VGltZXJRLnBRSGVhZCA9IHBOb2RlLT5wTmV4dDsKKwkJCWlmIChwTm9kZSA9PSBwQWQtPlRpbWVyUS5wUVRhaWwpCisJCQkJcEFkLT5UaW1lclEucFFUYWlsID0gcFByZXY7CisJCQlpZiAocFByZXYgIT0gTlVMTCkKKwkJCQlwUHJldi0+cE5leHQgPSBwTm9kZS0+cE5leHQ7CisKKwkJCS8vIHJldHVybiB0aGlzIHF1ZXVlIGVudHJ5IHRvIHRpbWVyUUZyZWVMaXN0LgorCQkJcE5vZGUtPnBOZXh0ID0gcEFkLT5UaW1lclEucFFQb2xsRnJlZUxpc3Q7CisJCQlwQWQtPlRpbWVyUS5wUVBvbGxGcmVlTGlzdCA9IHBOb2RlOworCQl9CisJfQorCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFncyk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworCit2b2lkIFJUMjg3MF9UaW1lclFfRXhpdChSVE1QX0FEQVBURVIgKnBBZCkKK3sKKwlSVDI4NzBfVElNRVJfRU5UUlkgKnBUaW1lclE7CisJdW5zaWduZWQgbG9uZyBpcnFGbGFnczsKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZ3MpOworCXdoaWxlIChwQWQtPlRpbWVyUS5wUUhlYWQpCisJeworCQlwVGltZXJRID0gcEFkLT5UaW1lclEucFFIZWFkOworCQlwQWQtPlRpbWVyUS5wUUhlYWQgPSBwVGltZXJRLT5wTmV4dDsKKwkJLy8gcmVtb3ZlIHRoZSB0aW1lUQorCX0KKwlwQWQtPlRpbWVyUS5wUVBvbGxGcmVlTGlzdCA9IE5VTEw7CisJb3NfZnJlZV9tZW0ocEFkLCBwQWQtPlRpbWVyUS5wVGltZXJRUG9sbCk7CisJcEFkLT5UaW1lclEucFFUYWlsID0gTlVMTDsKKwlwQWQtPlRpbWVyUS5wUUhlYWQgPSBOVUxMOworCXBBZC0+VGltZXJRLnN0YXR1cyA9IFJUMjg3MF9USFJFQURfU1RPUEVEOworCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFncyk7CisKK30KKworCit2b2lkIFJUMjg3MF9UaW1lclFfSW5pdChSVE1QX0FEQVBURVIgKnBBZCkKK3sKKwlpbnQgCWk7CisJUlQyODcwX1RJTUVSX0VOVFJZICpwUU5vZGUsICpwRW50cnk7CisJdW5zaWduZWQgbG9uZyBpcnFGbGFnczsKKworCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPlRpbWVyUUxvY2spOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFncyk7CisJTmRpc1plcm9NZW1vcnkoJnBBZC0+VGltZXJRLCBzaXplb2YocEFkLT5UaW1lclEpKTsKKwkvL0ludGVybG9ja2VkRXhjaGFuZ2UoJnBBZC0+VGltZXJRLmNvdW50LCAwKTsKKworCS8qIEluaXRpYWxpc2UgdGhlIHdhaXQgcSBoZWFkICovCisJLy9pbml0X3dhaXRxdWV1ZV9oZWFkKCZ0aW1lcldhaXRRKTsKKworCW9zX2FsbG9jX21lbShwQWQsICZwQWQtPlRpbWVyUS5wVGltZXJRUG9sbCwgc2l6ZW9mKFJUMjg3MF9USU1FUl9FTlRSWSkgKiBUSU1FUl9RVUVVRV9TSVpFX01BWCk7CisJaWYgKHBBZC0+VGltZXJRLnBUaW1lclFQb2xsKQorCXsKKwkJcEVudHJ5ID0gTlVMTDsKKwkJcFFOb2RlID0gKFJUMjg3MF9USU1FUl9FTlRSWSAqKXBBZC0+VGltZXJRLnBUaW1lclFQb2xsOworCQlmb3IgKGkgPSAwIDtpIDxUSU1FUl9RVUVVRV9TSVpFX01BWDsgaSsrKQorCQl7CisJCQlwUU5vZGUtPnBOZXh0ID0gcEVudHJ5OworCQkJcEVudHJ5ID0gcFFOb2RlOworCQkJcFFOb2RlKys7CisJCX0KKwkJcEFkLT5UaW1lclEucFFQb2xsRnJlZUxpc3QgPSBwRW50cnk7CisJCXBBZC0+VGltZXJRLnBRSGVhZCA9IE5VTEw7CisJCXBBZC0+VGltZXJRLnBRVGFpbCA9IE5VTEw7CisJCXBBZC0+VGltZXJRLnN0YXR1cyA9IFJUMjg3MF9USFJFQURfSU5JVEVEOworCX0KKwlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZ3MpOworfQorCisKK1ZPSUQgUlQyODcwX1dhdGNoRG9nKElOIFJUTVBfQURBUFRFUiAqcEFkKQoreworCVBIVF9UWF9DT05URVhUCQlwSFRUWENvbnRleHQ7CisJaW50IAkJCQkJaWR4OworCVVMT05HCQkJCWlycUZsYWdzOworCVBVUkIJCSAgIAkJcFVyYjsKKwlCT09MRUFOCQkJCW5lZWREdW1wU2VxID0gRkFMU0U7CisJVUlOVDMyICAgICAgICAgIAlNQUNWYWx1ZTsKKworCisJaWR4ID0gMDsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYUlhRX1BDTlQsICZNQUNWYWx1ZSk7CisJaWYgKChNQUNWYWx1ZSAmIDB4ZmYpICE9MCApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUWCBRVUVVRSAwIE5vdCBFTVBUWShWYWx1ZT0weCUweCkuICEhISEhISEhISEhISEhIVxuIiwgTUFDVmFsdWUpKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX0NGRywgMHhmNDAwMTIpOworCQl3aGlsZSgoTUFDVmFsdWUgJjB4ZmYpICE9IDAgJiYgKGlkeCsrIDwgMTApKQorCQl7CisJCSAgICAgICAgUlRNUF9JT19SRUFEMzIocEFkLCBUWFJYUV9QQ05ULCAmTUFDVmFsdWUpOworCQkgICAgICAgIE5kaXNNU2xlZXAoMSk7CisJCX0KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX0NGRywgMHhmNDAwMDYpOworCX0KKworCWlkeCA9IDA7CisJaWYgKChNQUNWYWx1ZSAmIDB4ZmYwMCkgIT0wICkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRYIFFVRVVFIDEgTm90IEVNUFRZKFZhbHVlPTB4JTB4KS4gISEhISEhISEhISEhISEhXG4iLCBNQUNWYWx1ZSkpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfQ0ZHLCAweGY0MDAwYSk7CisJCXdoaWxlKChNQUNWYWx1ZSAmMHhmZjAwKSAhPSAwICYmIChpZHgrKyA8IDEwKSkKKwkJeworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWFJYUV9QQ05ULCAmTUFDVmFsdWUpOworCQkJTmRpc01TbGVlcCgxKTsKKwkJfQorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfQ0ZHLCAweGY0MDAwNik7CisJfQorCisKKwlpZiAocEFkLT53YXRjaERvZ1J4T3ZlckZsb3dDbnQgPj0gMikKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1heWJlIHRoZSBSeCBCdWxrLUluIGhhbmdlZCEgQ2FuY2VsIHRoZSBwZW5kaW5nIFJ4IGJ1bGtzIHJlcXVlc3QhXG4iKSk7CisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9CVUxLSU5fUkVTRVQgfAorCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJCWZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2FsbCBDTURUSFJFQURfUkVTRVRfQlVMS19JTiB0byBjYW5jZWwgdGhlIHBlbmRpbmcgUnggQnVsayFcbiIpKTsKKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtJTl9SRVNFVCk7CisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX0lOLCBOVUxMLCAwKTsKKwkJCW5lZWREdW1wU2VxID0gVFJVRTsKKwkJfQorCQlwQWQtPndhdGNoRG9nUnhPdmVyRmxvd0NudCA9IDA7CisJfQorCisKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IE5VTV9PRl9UWF9SSU5HOyBpZHgrKykKKwl7CisJCXBVcmIgPSBOVUxMOworCisJCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbaWR4XSwgaXJxRmxhZ3MpOworCQlpZiAoKHBBZC0+QnVsa091dFBlbmRpbmdbaWR4XSA9PSBUUlVFKSAmJiBwQWQtPndhdGNoRG9nVHhQZW5kaW5nQ250KQorCQl7CisJCQlwQWQtPndhdGNoRG9nVHhQZW5kaW5nQ250W2lkeF0rKzsKKworCQkJaWYgKChwQWQtPndhdGNoRG9nVHhQZW5kaW5nQ250W2lkeF0gPiAyKSAmJgorCQkJCSAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QgfCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpKSkKKwkJCQkpCisJCQl7CisJCQkJLy8gRklYTUU6IEZvbGxvd2luZyBjb2RlIGp1c3Qgc3VwcG9ydCBzaW5nbGUgYnVsayBvdXQuIElmIHlvdSB3YW5uYSBzdXBwb3J0IG11bHRpcGxlIGJ1bGsgb3V0LiBNb2RpZnkgaXQhCisJCQkJcEhUVFhDb250ZXh0ID0gKFBIVF9UWF9DT05URVhUKSgmcEFkLT5UeENvbnRleHRbaWR4XSk7CisJCQkJaWYgKHBIVFRYQ29udGV4dC0+SVJQUGVuZGluZykKKwkJCQl7CS8vIENoZWNrIFR4Q29udGV4dC4KKwkJCQkJcFVyYiA9IHBIVFRYQ29udGV4dC0+cFVyYjsKKwkJCQl9CisJCQkJZWxzZSBpZiAoaWR4ID09IE1HTVRQSVBFSURYKQorCQkJCXsKKwkJCQkJUFRYX0NPTlRFWFQgcE1MTUVDb250ZXh0LCBwTlVMTENvbnRleHQsIHBQc1BvbGxDb250ZXh0OworCisJCQkJCS8vQ2hlY2sgTWdtdENvbnRleHQuCisJCQkJCXBNTE1FQ29udGV4dCA9IChQVFhfQ09OVEVYVCkocEFkLT5NZ210UmluZy5DZWxsW3BBZC0+TWdtdFJpbmcuVHhEbWFJZHhdLkFsbG9jVmEpOworCQkJCQlwUHNQb2xsQ29udGV4dCA9IChQVFhfQ09OVEVYVCkoJnBBZC0+UHNQb2xsQ29udGV4dCk7CisJCQkJCXBOVUxMQ29udGV4dCA9IChQVFhfQ09OVEVYVCkoJnBBZC0+TnVsbENvbnRleHQpOworCisJCQkJCWlmIChwTUxNRUNvbnRleHQtPklSUFBlbmRpbmcpCisJCQkJCXsKKwkJCQkJCUFTU0VSVChwTUxNRUNvbnRleHQtPklSUFBlbmRpbmcpOworCQkJCQkJcFVyYiA9IHBNTE1FQ29udGV4dC0+cFVyYjsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChwTlVMTENvbnRleHQtPklSUFBlbmRpbmcpCisJCQkJCXsKKwkJCQkJCUFTU0VSVChwTlVMTENvbnRleHQtPklSUFBlbmRpbmcpOworCQkJCQkJcFVyYiA9IHBOVUxMQ29udGV4dC0+cFVyYjsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChwUHNQb2xsQ29udGV4dC0+SVJQUGVuZGluZykKKwkJCQkJeworCQkJCQkJQVNTRVJUKHBQc1BvbGxDb250ZXh0LT5JUlBQZW5kaW5nKTsKKwkJCQkJCXBVcmIgPSBwUHNQb2xsQ29udGV4dC0+cFVyYjsKKwkJCQkJfQorCQkJCX0KKworCQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tpZHhdLCBpcnFGbGFncyk7CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYXliZSB0aGUgVHggQnVsay1PdXQgaGFuZ2VkISBDYW5jZWwgdGhlIHBlbmRpbmcgVHggYnVsa3MgcmVxdWVzdCBvZiBpZHgoJWQpIVxuIiwgaWR4KSk7CisJCQkJaWYgKHBVcmIpCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJVbmxpbmsgdGhlIHBlbmRpbmcgVVJCIVxuIikpOworCQkJCQkvLyB1bmxpbmsgaXQgbm93CisJCQkJCVJUVVNCX1VOTElOS19VUkIocFVyYik7CisJCQkJCS8vIFNsZWVwIDIwMCBtaWNyb3NlY29uZHMgdG8gZ2l2ZSBjYW5jZWxsYXRpb24gdGltZSB0byB3b3JrCisJCQkJCVJUTVB1c2VjRGVsYXkoMjAwKTsKKwkJCQkJbmVlZER1bXBTZXEgPSBUUlVFOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJVbmtvbncgYnVsa091dCBVUkIgbWF5YmUgaGFuZ2VkISEhISEhISEhISEhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tpZHhdLCBpcnFGbGFncyk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbaWR4XSwgaXJxRmxhZ3MpOworCQl9CisJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJLy8gRm9yIFNpZ21hIGRlYnVnLCBkdW1wIHRoZSBiYV9yZW9yZGVyaW5nIHNlcXVlbmNlLgorCWlmKChuZWVkRHVtcFNlcSA9PSBUUlVFKSAmJiAocEFkLT5Db21tb25DZmcuYkRpc2FibGVSZW9yZGVyaW5nID09IDApKQorCXsKKwkJVVNIT1JUCQkJCUlkeDsKKwkJUEJBX1JFQ19FTlRSWQkJcEJBRW50cnkgPSBOVUxMOworCQlVQ0hBUgkJCQljb3VudCA9IDA7CisJCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOworCisJCUlkeCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQkFSZWNXY2lkQXJyYXlbMF07CisKKwkJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbSWR4XTsKKwkJaWYoKHBCQUVudHJ5LT5saXN0LnFsZW4gPiAwKSAmJiAocEJBRW50cnktPmxpc3QubmV4dCAhPSBOVUxMKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTklDVXBkYXRlUmF3Q291bnRlcnMoKTpUaGUgUXVldWVpbmcgcGt0IGluIHJlb3JkZXJpbmcgYnVmZmVyOlxuIikpOworCQkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7CisJCQltcGR1X2JsayA9IHBCQUVudHJ5LT5saXN0Lm5leHQ7CisJCQl3aGlsZSAobXBkdV9ibGspCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiXHQlZDpTZXEtJWQsIGJBTVNEVS0lZCFcbiIsIGNvdW50LCBtcGR1X2Jsay0+U2VxdWVuY2UsIG1wZHVfYmxrLT5iQU1TRFUpKTsKKwkJCQltcGR1X2JsayA9IG1wZHVfYmxrLT5uZXh0OworCQkJCWNvdW50Kys7CisJCQl9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlxucEJBRW50cnktPkxhc3RJbmRTZXE9JWQhXG4iLCBwQkFFbnRyeS0+TGFzdEluZFNlcSkpOworCQkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7CisJCX0KKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgUmVsZWFzZSBhbGxvY2F0ZWQgcmVzb3VyY2VzLgorCitBcmd1bWVudHM6CisgICAgKmRldgkJCQlQb2ludCB0byB0aGUgUENJIG9yIFVTQiBkZXZpY2UKKwlwQWQJCQkJCWRyaXZlciBjb250cm9sIGJsb2NrIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorICAgIE5vbmUKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyB2b2lkIF9ydHVzYl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIFBSVE1QX0FEQVBURVIgcEFkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlCSpuZXRfZGV2ID0gTlVMTDsKKworCisJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgicnR1c2JfZGlzY29ubmVjdDogdW5yZWdpc3RlciB1c2JuZXQgdXNiLSVzLSVzXG4iLAorCQkJCWRldi0+YnVzLT5idXNfbmFtZSwgZGV2LT5kZXZwYXRoKSk7CisJaWYgKCFwQWQpCisJeworI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAorCQlpZiAoKHBBZC0+TUNfUm93SUQgPj0gMCkgJiYgKHBBZC0+TUNfUm93SUQgPD0gTUFYX05VTV9PRl9NVUxUSVBMRV9DQVJEKSkKKwkJCU1DX0NhcmRVc2VkW3BBZC0+TUNfUm93SURdID0gMDsgLy8gbm90IGNsZWFyIE1BQyBhZGRyZXNzCisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkJLyoga2VybmVsIDIuNCBzZXJpZXMgKi8KKwkJd2hpbGUoTU9EX0lOX1VTRSA+IDApCisJCXsKKwkJCU1PRF9ERUNfVVNFX0NPVU5UOworCQl9CisjZWxzZQorCQl1c2JfcHV0X2RldihkZXYpOworI2VuZGlmIC8vIExJTlVYX1ZFUlNJT05fQ09ERSAvLworCisJCXByaW50aygicnR1c2JfZGlzY29ubmVjdDogcEFkID09IE5VTEwhXG4iKTsKKwkJcmV0dXJuOworCX0KKwlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKTsKKworCisKKwkvLyBmb3IgZGVidWcsIHdhaXQgdG8gc2hvdyBzb21lIG1lc3NhZ2VzIHRvIC9wcm9jIHN5c3RlbQorCXVkZWxheSgxKTsKKworCisKKworCW5ldF9kZXYgPSBwQWQtPm5ldF9kZXY7CisJaWYgKHBBZC0+bmV0X2RldiAhPSBOVUxMKQorCXsKKwkJcHJpbnRrKCJydHVzYl9kaXNjb25uZWN0OiB1bnJlZ2lzdGVyX25ldGRldigpLCBkZXYtPm5hbWU9JXMhXG4iLCBuZXRfZGV2LT5uYW1lKTsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYgKHBBZC0+bmV0X2Rldik7CisJfQorCXVkZWxheSgxKTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkJLyoga2VybmVsIDIuNCBzZXJpZXMgKi8KKyNlbHNlCisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKyNlbmRpZiAvLyBMSU5VWF9WRVJTSU9OX0NPREUgLy8KKwl1ZGVsYXkoMSk7CisKKwkvLyBmcmVlIG5ldF9kZXZpY2UgbWVtb3J5CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCS8qIGtlcm5lbCAyLjQgc2VyaWVzICovCisJa2ZyZWUobmV0X2Rldik7CisjZWxzZQorCWZyZWVfbmV0ZGV2KG5ldF9kZXYpOworI2VuZGlmIC8vIExJTlVYX1ZFUlNJT05fQ09ERSAvLworCisJLy8gZnJlZSBhZGFwdGVyIG1lbW9yeQorCVJUTVBGcmVlQWRhcHRlcihwQWQpOworCisJLy8gcmVsZWFzZSBhIHVzZSBvZiB0aGUgdXNiIGRldmljZSBzdHJ1Y3R1cmUKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkJLyoga2VybmVsIDIuNCBzZXJpZXMgKi8KKwl3aGlsZShNT0RfSU5fVVNFID4gMCkKKwl7CisJCU1PRF9ERUNfVVNFX0NPVU5UOworCX0KKyNlbHNlCisJdXNiX3B1dF9kZXYoZGV2KTsKKyNlbmRpZiAvLyBMSU5VWF9WRVJTSU9OX0NPREUgLy8KKwl1ZGVsYXkoMSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIgUlRVU0IgZGlzY29ubmVjdCBzdWNjZXNzZnVsbHlcbiIpKTsKK30KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIFByb2JlIFJUMjhYWCBjaGlwc2V0LgorCitBcmd1bWVudHM6CisgICAgKmRldgkJCQlQb2ludCB0byB0aGUgUENJIG9yIFVTQiBkZXZpY2UKKwlpbnRlcmZhY2UKKwkqaWRfdGFibGUJCQlQb2ludCB0byB0aGUgUENJIG9yIFVTQiBkZXZpY2UgSUQKKworUmV0dXJuIFZhbHVlOgorICAgIE5vbmUKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkJLyoga2VybmVsIDIuNCBzZXJpZXMgKi8KK3N0YXRpYyB2b2lkICpydHVzYl9wcm9iZShzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBVSU5UIGludGVyZmFjZSwKKwkJCQkJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZDsKKwlydDI4eHhfcHJvYmUoKHZvaWQgKilkZXYsICh2b2lkICopaWQsIGludGVyZmFjZSwgJnBBZCk7CisJcmV0dXJuICh2b2lkICopcEFkOworfQorCisvL0Rpc2Nvbm5lY3QgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGhpbiBleGl0IHJvdXRpbmUKK3N0YXRpYyB2b2lkIHJ0dXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdm9pZCAqcHRyKQoreworCV9ydHVzYl9kaXNjb25uZWN0KGRldiwgKChQUlRNUF9BREFQVEVSKXB0cikpOworfQorCisjZWxzZQkvKiBrZXJuZWwgMi42IHNlcmllcyAqLworc3RhdGljIGludCBydHVzYl9wcm9iZSAoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCQkJCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJUFJUTVBfQURBUFRFUiBwQWQ7CisJcmV0dXJuIChpbnQpcnQyOHh4X3Byb2JlKCh2b2lkICopaW50ZiwgKHZvaWQgKilpZCwgMCwgJnBBZCk7Cit9CisKKworc3RhdGljIHZvaWQgcnR1c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAgICpkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCVBSVE1QX0FEQVBURVIgICAgICAgcEFkOworCisKKwlwQWQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CisKKwlfcnR1c2JfZGlzY29ubmVjdChkZXYsIHBBZCk7Cit9CisjZW5kaWYgLy8gTElOVVhfVkVSU0lPTl9DT0RFIC8vCisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBDbG9zZSBrZXJuZWwgdGhyZWFkcy4KKworQXJndW1lbnRzOgorCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisgICAgTk9ORQorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVDI4eHhUaHJlYWRUZXJtaW5hdGUoCisJSU4gUlRNUF9BREFQVEVSICpwQWQpCit7CisJUE9TX0NPT0tJRQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCUlOVAkJCXJldDsKKworCisJLy8gU2xlZXAgNTAgbWlsbGlzZWNvbmRzIHNvIHBlbmRpbmcgaW8gbWlnaHQgZmluaXNoIG5vcm1hbGx5CisJUlRNUHVzZWNEZWxheSg1MDAwMCk7CisKKwkvLyBXZSB3YW50IHRvIHdhaXQgdW50aWwgYWxsIHBlbmRpbmcgcmVjZWl2ZXMgYW5kIHNlbmRzIHRvIHRoZQorCS8vIGRldmljZSBvYmplY3QuIFdlIGNhbmNlbCBhbnkKKwkvLyBpcnBzLiBXYWl0IHVudGlsIHNlbmRzIGFuZCByZWNlaXZlcyBoYXZlIHN0b3BwZWQuCisJUlRVU0JDYW5jZWxQZW5kaW5nSVJQcyhwQWQpOworCisJLy8gVGVybWluYXRlIFRocmVhZHMKKwlDSEVDS19QSURfTEVHQUxJVFkocE9iai0+VGltZXJRVGhyX3BpZCkKKwl7CisJCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOworCisJCXByaW50aygiVGVybWluYXRlIHRoZSBUaW1lclFUaHJfcGlkPSVkIVxuIiwgR0VUX1BJRF9OVU1CRVIocE9iai0+VGltZXJRVGhyX3BpZCkpOworCQltYigpOworCQlwQWQtPlRpbWVyRnVuY19raWxsID0gMTsKKwkJbWIoKTsKKwkJcmV0ID0gS0lMTF9USFJFQURfUElEKHBPYmotPlRpbWVyUVRocl9waWQsIFNJR1RFUk0sIDEpOworCQlpZiAocmV0KQorCQl7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdW5hYmxlIHRvIHN0b3AgVGltZXJRVGhyZWFkLCBwaWQ9JWQsIHJldD0lZCFcbiIsCisJCQkJCXBBZC0+bmV0X2Rldi0+bmFtZSwgR0VUX1BJRF9OVU1CRVIocE9iai0+VGltZXJRVGhyX3BpZCksIHJldCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZwQWQtPlRpbWVyUUNvbXBsZXRlKTsKKwkJCXBPYmotPlRpbWVyUVRocl9waWQgPSBUSFJFQURfUElEX0lOSVRfVkFMVUU7CisJCX0KKwl9CisKKwlDSEVDS19QSURfTEVHQUxJVFkocE9iai0+TUxNRVRocl9waWQpCisJeworCQlwcmludGsoIlRlcm1pbmF0ZSB0aGUgTUxNRVRocl9waWQ9JWQhXG4iLCBHRVRfUElEX05VTUJFUihwT2JqLT5NTE1FVGhyX3BpZCkpOworCQltYigpOworCQlwQWQtPm1sbWVfa2lsbCA9IDE7CisJCS8vUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCQltYigpOworCQlyZXQgPSBLSUxMX1RIUkVBRF9QSUQocE9iai0+TUxNRVRocl9waWQsIFNJR1RFUk0sIDEpOworCQlpZiAocmV0KQorCQl7CisJCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IHVuYWJsZSB0byBNbG1lIHRocmVhZCwgcGlkPSVkLCByZXQ9JWQhXG4iLAorCQkJCQlwQWQtPm5ldF9kZXYtPm5hbWUsIEdFVF9QSURfTlVNQkVSKHBPYmotPk1MTUVUaHJfcGlkKSwgcmV0KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vd2FpdF9mb3JfY29tcGxldGlvbiAoJnBBZC0+bm90aWZ5KTsKKwkJCXdhaXRfZm9yX2NvbXBsZXRpb24gKCZwQWQtPm1sbWVDb21wbGV0ZSk7CisJCQlwT2JqLT5NTE1FVGhyX3BpZCA9IFRIUkVBRF9QSURfSU5JVF9WQUxVRTsKKwkJfQorCX0KKworCUNIRUNLX1BJRF9MRUdBTElUWShwT2JqLT5SVFVTQkNtZFRocl9waWQpCisJeworCQlwcmludGsoIlRlcm1pbmF0ZSB0aGUgUlRVU0JDbWRUaHJfcGlkPSVkIVxuIiwgR0VUX1BJRF9OVU1CRVIocE9iai0+UlRVU0JDbWRUaHJfcGlkKSk7CisJCW1iKCk7CisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOworCQlwQWQtPkNtZFEuQ21kUVN0YXRlID0gUlQyODcwX1RIUkVBRF9TVE9QRUQ7CisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOworCQltYigpOworCQkvL1JUVVNCQ01EVXAocEFkKTsKKwkJcmV0ID0gS0lMTF9USFJFQURfUElEKHBPYmotPlJUVVNCQ21kVGhyX3BpZCwgU0lHVEVSTSwgMSk7CisJCWlmIChyZXQpCisJCXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB1bmFibGUgdG8gUlRVU0JDbWQgdGhyZWFkLCBwaWQ9JWQsIHJldD0lZCFcbiIsCisJCQkJCXBBZC0+bmV0X2Rldi0+bmFtZSwgR0VUX1BJRF9OVU1CRVIocE9iai0+UlRVU0JDbWRUaHJfcGlkKSwgcmV0KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vd2FpdF9mb3JfY29tcGxldGlvbiAoJnBBZC0+bm90aWZ5KTsKKwkJCXdhaXRfZm9yX2NvbXBsZXRpb24gKCZwQWQtPkNtZFFDb21wbGV0ZSk7CisJCQlwT2JqLT5SVFVTQkNtZFRocl9waWQgPSBUSFJFQURfUElEX0lOSVRfVkFMVUU7CisJfQorCX0KKworCisJLy8gS2lsbCB0YXNrbGV0cworCXBBZC0+bWxtZV9raWxsID0gMDsKKwlwQWQtPkNtZFEuQ21kUVN0YXRlID0gUlQyODcwX1RIUkVBRF9VTktOT1dOOworCXBBZC0+VGltZXJGdW5jX2tpbGwgPSAwOworfQorCisKK3ZvaWQga2lsbF90aHJlYWRfdGFzayhJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlQT1NfQ09PS0lFIHBPYmo7CisKKwlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisJdGFza2xldF9raWxsKCZwT2JqLT5yeF9kb25lX3Rhc2spOworCXRhc2tsZXRfa2lsbCgmcE9iai0+bWdtdF9kbWFfZG9uZV90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJnBPYmotPmFjMF9kbWFfZG9uZV90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJnBPYmotPmFjMV9kbWFfZG9uZV90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJnBPYmotPmFjMl9kbWFfZG9uZV90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJnBPYmotPmFjM19kbWFfZG9uZV90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJnBPYmotPmhjY2FfZG1hX2RvbmVfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT50YnR0X3Rhc2spOworCit9CisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBDaGVjayB0aGUgY2hpcHNldCB2ZW5kb3IvcHJvZHVjdCBJRC4KKworQXJndW1lbnRzOgorICAgIF9kZXZfcAkJCQlQb2ludCB0byB0aGUgUENJIG9yIFVTQiBkZXZpY2UKKworUmV0dXJuIFZhbHVlOgorICAgIFRSVUUJCQkJQ2hlY2sgb2sKKwlGQUxTRQkJCQlDaGVjayBmYWlsCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOIFJUMjhYWENoaXBzZXRDaGVjaygKKwlJTiB2b2lkICpfZGV2X3ApCit7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCS8qIGtlcm5lbCAyLjQgc2VyaWVzICovCisJc3RydWN0IHVzYl9kZXZpY2UgKmRldl9wID0gKHN0cnVjdCB1c2JfZGV2aWNlICopX2Rldl9wOworI2Vsc2UKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqKV9kZXZfcDsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2X3AgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworI2VuZGlmIC8vIExJTlVYX1ZFUlNJT05fQ09ERSAvLworCVVJTlQzMiBpOworCisKKwlmb3IoaT0wOyBpPHJ0dXNiX3VzYl9pZF9sZW47IGkrKykKKwl7CisJCWlmIChkZXZfcC0+ZGVzY3JpcHRvci5pZFZlbmRvciA9PSBydHVzYl91c2JfaWRbaV0uaWRWZW5kb3IgJiYKKwkJCWRldl9wLT5kZXNjcmlwdG9yLmlkUHJvZHVjdCA9PSBydHVzYl91c2JfaWRbaV0uaWRQcm9kdWN0KQorCQl7CisJCQlwcmludGsoInJ0Mjg3MDogaWRWZW5kb3IgPSAweCV4LCBpZFByb2R1Y3QgPSAweCV4XG4iLAorCQkJCQlkZXZfcC0+ZGVzY3JpcHRvci5pZFZlbmRvciwgZGV2X3AtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGkgPT0gcnR1c2JfdXNiX2lkX2xlbikKKwl7CisJCXByaW50aygicnQyODcwOiBFcnJvciEgRGV2aWNlIERlc2NyaXB0b3Igbm90IG1hdGNoaW5nIVxuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIEluaXQgbmV0IGRldmljZSBzdHJ1Y3R1cmUuCisKK0FyZ3VtZW50czoKKyAgICBfZGV2X3AJCQkJUG9pbnQgdG8gdGhlIFBDSSBvciBVU0IgZGV2aWNlCisgICAgKm5ldF9kZXYJCQlQb2ludCB0byB0aGUgbmV0IGRldmljZQorCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisgICAgVFJVRQkJCQlJbml0IG9rCisJRkFMU0UJCQkJSW5pdCBmYWlsCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOIFJUMjhYWE5ldERldkluaXQoCisJSU4gdm9pZCAJCQkJKl9kZXZfcCwKKwlJTiBzdHJ1Y3QgIG5ldF9kZXZpY2UJKm5ldF9kZXYsCisJSU4gUlRNUF9BREFQVEVSIAkJKnBBZCkKK3sKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkJLyoga2VybmVsIDIuNCBzZXJpZXMgKi8KKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2X3AgPSAoc3RydWN0IHVzYl9kZXZpY2UgKilfZGV2X3A7CisjZWxzZQorCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gKHN0cnVjdCB1c2JfaW50ZXJmYWNlICopX2Rldl9wOworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXZfcCA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisjZW5kaWYgLy8gTElOVVhfVkVSU0lPTl9DT0RFIC8vCisKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQkvKiBrZXJuZWwgMi40IHNlcmllcyAqLworCXBBZC0+Y29uZmlnID0gZGV2X3AtPmNvbmZpZzsKKyNlbHNlCisJcEFkLT5jb25maWcgPSAmZGV2X3AtPmNvbmZpZy0+ZGVzYzsKKyNlbmRpZiAvLyBMSU5VWF9WRVJTSU9OX0NPREUgLy8KKwlyZXR1cm4gVFJVRTsKK30KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIEluaXQgbmV0IGRldmljZSBzdHJ1Y3R1cmUuCisKK0FyZ3VtZW50czoKKyAgICBfZGV2X3AJCQkJUG9pbnQgdG8gdGhlIFBDSSBvciBVU0IgZGV2aWNlCisJKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKyAgICBUUlVFCQkJCUNvbmZpZyBvaworCUZBTFNFCQkJCUNvbmZpZyBmYWlsCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCitCT09MRUFOIFJUMjhYWFByb2JlUG9zdENvbmZpZygKKwlJTiB2b2lkIAkJCQkqX2Rldl9wLAorCUlOIFJUTVBfQURBUFRFUiAJCSpwQWQsCisJSU4gSU5UMzIJCQkJaW50ZXJmYWNlKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXZfcCA9IChzdHJ1Y3QgdXNiX2RldmljZSAqKV9kZXZfcDsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZjsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yICppZmFjZV9kZXNjOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CisJVUxPTkcgQnVsa091dElkeDsKKwlVSU5UMzIgaTsKKworCisJLyogZ2V0IHRoZSBhY3RpdmUgaW50ZXJmYWNlIGRlc2NyaXB0b3IgKi8KKwlpbnRmID0gJmRldl9wLT5hY3Rjb25maWctPmludGVyZmFjZVtpbnRlcmZhY2VdOworCWlmYWNlX2Rlc2MgPSAmaW50Zi0+YWx0c2V0dGluZ1swXTsKKworCS8qIGdldCAjIG9mIGVucG9pbnRzICovCisJcEFkLT5OdW1iZXJPZlBpcGVzID0gaWZhY2VfZGVzYy0+Yk51bUVuZHBvaW50czsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOdW1FbmRwb2ludHM9JWRcbiIsIGlmYWNlX2Rlc2MtPmJOdW1FbmRwb2ludHMpKTsKKworCS8qIENvbmZpZ3VyZSBQaXBlcyAqLworCWVuZHBvaW50ID0gJmlmYWNlX2Rlc2MtPmVuZHBvaW50WzBdOworCUJ1bGtPdXRJZHggPSAwOworCisJZm9yKGk9MDsgaTxwQWQtPk51bWJlck9mUGlwZXM7IGkrKykKKwl7CisJCWlmICgoZW5kcG9pbnRbaV0uYm1BdHRyaWJ1dGVzID09IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEspICYmCisJCQkoKGVuZHBvaW50W2ldLmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spID09IFVTQl9ESVJfSU4pKQorCQl7CisJCQlwQWQtPkJ1bGtJbkVwQWRkciA9IGVuZHBvaW50W2ldLmJFbmRwb2ludEFkZHJlc3M7CisJCQlwQWQtPkJ1bGtJbk1heFBhY2tldFNpemUgPSBlbmRwb2ludFtpXS53TWF4UGFja2V0U2l6ZTsKKworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJCSgiQlVMSyBJTiBNYXhpbXVtUGFja2V0U2l6ZSA9ICVkXG4iLCBwQWQtPkJ1bGtJbk1heFBhY2tldFNpemUpKTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkoIkVQIGFkZHJlc3MgPSAweCUyeCAgXG4iLCBlbmRwb2ludFtpXS5iRW5kcG9pbnRBZGRyZXNzKSk7CisJCX0KKwkJZWxzZSBpZiAoKGVuZHBvaW50W2ldLmJtQXR0cmlidXRlcyA9PSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLKSAmJgorCQkJCSgoZW5kcG9pbnRbaV0uYkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykgPT0gVVNCX0RJUl9PVVQpKQorCQl7CisJCQkvLyBUaGVyZSBhcmUgNiBidWxrIG91dCBFUC4gRVA2IGhpZ2hlc3QgcHJpb3JpdHkuCisJCQkvLyBFUDEtNCBpcyBFRENBLiAgRVA1IGlzIEhDQ0EuCisJCQlwQWQtPkJ1bGtPdXRFcEFkZHJbQnVsa091dElkeCsrXSA9IGVuZHBvaW50W2ldLmJFbmRwb2ludEFkZHJlc3M7CisJCQlwQWQtPkJ1bGtPdXRNYXhQYWNrZXRTaXplID0gZW5kcG9pbnRbaV0ud01heFBhY2tldFNpemU7CisKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkoIkJVTEsgT1VUIE1heGltdW1QYWNrZXRTaXplID0gJWRcbiIsIHBBZC0+QnVsa091dE1heFBhY2tldFNpemUpKTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkoIkVQIGFkZHJlc3MgPSAweCUyeCAgXG4iLCBlbmRwb2ludFtpXS5iRW5kcG9pbnRBZGRyZXNzKSk7CisJCX0KKwl9CisKKwlpZiAoIShwQWQtPkJ1bGtJbkVwQWRkciAmJiBwQWQtPkJ1bGtPdXRFcEFkZHJbMF0pKQorCXsKKwkJcHJpbnRrKCJDb3VsZCBub3QgZmluZCBib3RoIGJ1bGstaW4gYW5kIGJ1bGstb3V0IGVuZHBvaW50c1xuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworI2Vsc2UKK0JPT0xFQU4gUlQyOFhYUHJvYmVQb3N0Q29uZmlnKAorCUlOIHZvaWQgCQkJCSpfZGV2X3AsCisJSU4gUlRNUF9BREFQVEVSIAkJKnBBZCwKKwlJTiBJTlQzMgkJCQlpbnRlcmZhY2UpCit7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSAoc3RydWN0IHVzYl9pbnRlcmZhY2UgKilfZGV2X3A7CisJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaWZhY2VfZGVzYzsKKwlVTE9ORyBCdWxrT3V0SWR4OworCVVJTlQzMiBpOworCisKKwkvKiBnZXQgdGhlIGFjdGl2ZSBpbnRlcmZhY2UgZGVzY3JpcHRvciAqLworCWlmYWNlX2Rlc2MgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsKKworCS8qIGdldCAjIG9mIGVucG9pbnRzICAqLworCXBBZC0+TnVtYmVyT2ZQaXBlcyA9IGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50czsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSgiTnVtRW5kcG9pbnRzPSVkXG4iLCBpZmFjZV9kZXNjLT5kZXNjLmJOdW1FbmRwb2ludHMpKTsKKworCS8qIENvbmZpZ3VyZSBQaXBlcyAqLworCUJ1bGtPdXRJZHggPSAwOworCisJZm9yKGk9MDsgaTxwQWQtPk51bWJlck9mUGlwZXM7IGkrKykKKwl7CisJCWlmICgoaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYy5ibUF0dHJpYnV0ZXMgPT0KKwkJCQlVU0JfRU5EUE9JTlRfWEZFUl9CVUxLKSAmJgorCQkJKChpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjLmJFbmRwb2ludEFkZHJlc3MgJgorCQkJCVVTQl9FTkRQT0lOVF9ESVJfTUFTSykgPT0gVVNCX0RJUl9JTikpCisJCXsKKwkJCXBBZC0+QnVsa0luRXBBZGRyID0gaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYy5iRW5kcG9pbnRBZGRyZXNzOworCQkJcEFkLT5CdWxrSW5NYXhQYWNrZXRTaXplID0gaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYy53TWF4UGFja2V0U2l6ZTsKKworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJCSgiQlVMSyBJTiBNYXhpbXVtUGFja2V0U2l6ZSA9ICVkXG4iLCBwQWQtPkJ1bGtJbk1heFBhY2tldFNpemUpKTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkoIkVQIGFkZHJlc3MgPSAweCUyeFxuIiwgaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYy5iRW5kcG9pbnRBZGRyZXNzKSk7CisJCX0KKwkJZWxzZSBpZiAoKGlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2MuYm1BdHRyaWJ1dGVzID09CisJCQkJCVVTQl9FTkRQT0lOVF9YRkVSX0JVTEspICYmCisJCQkJKChpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjLmJFbmRwb2ludEFkZHJlc3MgJgorCQkJCQlVU0JfRU5EUE9JTlRfRElSX01BU0spID09IFVTQl9ESVJfT1VUKSkKKwkJeworCQkJLy8gdGhlcmUgYXJlIDYgYnVsayBvdXQgRVAuIEVQNiBoaWdoZXN0IHByaW9yaXR5LgorCQkJLy8gRVAxLTQgaXMgRURDQS4gIEVQNSBpcyBIQ0NBLgorCQkJcEFkLT5CdWxrT3V0RXBBZGRyW0J1bGtPdXRJZHgrK10gPSBpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjLmJFbmRwb2ludEFkZHJlc3M7CisJCQlwQWQtPkJ1bGtPdXRNYXhQYWNrZXRTaXplID0gaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYy53TWF4UGFja2V0U2l6ZTsKKworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJCSgiQlVMSyBPVVQgTWF4aW11bVBhY2tldFNpemUgPSAlZFxuIiwgcEFkLT5CdWxrT3V0TWF4UGFja2V0U2l6ZSkpOworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJCSgiRVAgYWRkcmVzcyA9IDB4JTJ4ICBcbiIsIGlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2MuYkVuZHBvaW50QWRkcmVzcykpOworCQl9CisJfQorCisJaWYgKCEocEFkLT5CdWxrSW5FcEFkZHIgJiYgcEFkLT5CdWxrT3V0RXBBZGRyWzBdKSkKKwl7CisJCXByaW50aygiJXM6IENvdWxkIG5vdCBmaW5kIGJvdGggYnVsay1pbiBhbmQgYnVsay1vdXQgZW5kcG9pbnRzXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvLyBMSU5VWF9WRVJTSU9OX0NPREUgLy8KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIERpc2FibGUgRE1BLgorCitBcmd1bWVudHM6CisJKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKwlOb25lCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUMjhYWERNQURpc2FibGUoCisJSU4gUlRNUF9BREFQVEVSIAkJKnBBZCkKK3sKKwkvLyBubyB1c2UKK30KKworCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgRW5hYmxlIERNQS4KKworQXJndW1lbnRzOgorCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisJTm9uZQorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVDI4WFhETUFFbmFibGUoCisJSU4gUlRNUF9BREFQVEVSIAkJKnBBZCkKK3sKKwlXUERNQV9HTE9fQ0ZHX1NUUlVDCUdsb0NmZzsKKwlVU0JfRE1BX0NGR19TVFJVQwlVc2JDZmc7CisJaW50CQkJCQlpID0gMDsKKworCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDQpOworCWRvCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZHbG9DZmcud29yZCk7CisJCWlmICgoR2xvQ2ZnLmZpZWxkLlR4RE1BQnVzeSA9PSAwKSAgJiYgKEdsb0NmZy5maWVsZC5SeERNQUJ1c3kgPT0gMCkpCisJCQlicmVhazsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gIERNQUJ1c3lcbiIpKTsKKwkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKwkJaSsrOworCX13aGlsZSAoIGkgPDIwMCk7CisKKworCVJUTVB1c2VjRGVsYXkoNTApOworCUdsb0NmZy5maWVsZC5FblRYV3JpdGVCYWNrRERPTkUgPSAxOworCUdsb0NmZy5maWVsZC5FbmFibGVSeERNQSA9IDE7CisJR2xvQ2ZnLmZpZWxkLkVuYWJsZVR4RE1BID0gMTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gV1JJVEUgRE1BIG9mZnNldCAweDIwOCA9IDB4JXhcbiIsIEdsb0NmZy53b3JkKSk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfR0xPX0NGRywgR2xvQ2ZnLndvcmQpOworCisJVXNiQ2ZnLndvcmQgPSAwOworCVVzYkNmZy5maWVsZC5waHljbGVhciA9IDA7CisJLyogdXNiIHZlcnNpb24gaXMgMS4xLGRvIG5vdCB1c2UgYnVsayBpbiBhZ2dyZWdhdGlvbiAqLworCWlmIChwQWQtPkJ1bGtJbk1heFBhY2tldFNpemUgPT0gNTEyKQorCQkJVXNiQ2ZnLmZpZWxkLlJ4QnVsa0FnZ0VuID0gMTsKKwkvKiBmb3IgbGFzdCBwYWNrZXQsIFBCRiBtaWdodCB1c2UgbW9yZSB0aGFuIGxpbWl0ZWQsIHNvIG1pbnVzIDIgdG8gcHJldmVudCBmcm9tIGVycm9yICovCisJVXNiQ2ZnLmZpZWxkLlJ4QnVsa0FnZ0xtdCA9IChNQVhfUlhCVUxLX1NJWkUgLzEwMjQpLTM7CisJVXNiQ2ZnLmZpZWxkLlJ4QnVsa0FnZ1RPdXQgPSAweDgwOyAvKiAyMDA2LTEwLTE4ICovCisJVXNiQ2ZnLmZpZWxkLlJ4QnVsa0VuID0gMTsKKwlVc2JDZmcuZmllbGQuVHhCdWxrRW4gPSAxOworCisJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgVVNCX0RNQV9DRkcsIFVzYkNmZy53b3JkKTsKKworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIFdyaXRlIEJlYWNvbiBidWZmZXIgdG8gQXNpYy4KKworQXJndW1lbnRzOgorCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisJTm9uZQorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVDI4eHhfVXBkYXRlQmVhY29uVG9Bc2ljKAorCUlOIFJUTVBfQURBUFRFUgkJKnBBZCwKKwlJTiBJTlQJCQkJYXBpZHgsCisJSU4gVUxPTkcJCQlGcmFtZUxlbiwKKwlJTiBVTE9ORwkJCVVwZGF0ZVBvcykKK3sKKwlQVUNIQVIgICAgICAgIAlwQmVhY29uRnJhbWUgPSBOVUxMOworCVVDSEFSICAJCQkqcHRyOworCVVJTlQgIAkJCWksIHBhZGRpbmc7CisJQkVBQ09OX1NZTkNfU1RSVUNUCSpwQmVhY29uU3luYyA9IHBBZC0+Q29tbW9uQ2ZnLnBCZWFjb25TeW5jOworCVVJTlQzMgkJCWxvbmdWYWx1ZTsKKwlCT09MRUFOCQkJYkJjblJlcSA9IEZBTFNFOworCVVDSEFSCQkJYmNuX2lkeCA9IDA7CisKKworCWlmIChwQmVhY29uRnJhbWUgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgicEJlYWNvbkZyYW1lIGlzIE5VTEwhXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAocEJlYWNvblN5bmMgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgicEJlYWNvblN5bmMgaXMgTlVMTCFcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCS8vaWYgKChwQWQtPldkc1RhYi5Nb2RlID09IFdEU19CUklER0VfTU9ERSkgfHwKKwkvLwkoKHBBZC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5NU1NJRERldiA9PSBOVUxMKSB8fCAhKHBBZC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5NU1NJRERldi0+ZmxhZ3MgJiBJRkZfVVApKQorCS8vCSkKKwlpZiAoYkJjblJlcSA9PSBGQUxTRSkKKwl7CisJCS8qIHdoZW4gdGhlIHJhIGludGVyZmFjZSBpcyBkb3duLCBkbyBub3Qgc2VuZCBpdHMgYmVhY29uIGZyYW1lICovCisJCS8qIGNsZWFyIGFsbCB6ZXJvICovCisJCWZvcihpPTA7IGk8VFhXSV9TSVpFOyBpKz00KSB7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBwQWQtPkJlYWNvbk9mZnNldFtiY25faWR4XSArIGksIDB4MDApOworCQl9CisJCXBCZWFjb25TeW5jLT5CZWFjb25CaXRNYXAgJj0gKH4oQkVBQ09OX0JJVE1BUF9NQVNLICYgKDEgPDwgYmNuX2lkeCkpKTsKKwkJTmRpc1plcm9NZW1vcnkocEJlYWNvblN5bmMtPkJlYWNvblR4V0lbYmNuX2lkeF0sIFRYV0lfU0laRSk7CisJfQorCWVsc2UKKwl7CisJCXB0ciA9IChQVUNIQVIpJnBBZC0+QmVhY29uVHhXSTsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJCVJUTVBXSUVuZGlhbkNoYW5nZShwdHIsIFRZUEVfVFhXSSk7CisjZW5kaWYKKwkJaWYgKE5kaXNFcXVhbE1lbW9yeShwQmVhY29uU3luYy0+QmVhY29uVHhXSVtiY25faWR4XSwgJnBBZC0+QmVhY29uVHhXSSwgVFhXSV9TSVpFKSA9PSBGQUxTRSkKKwkJewkvLyBJZiBCZWFjb25UeFdJIGNoYW5nZWQsIHdlIG5lZWQgdG8gcmV3cml0ZSB0aGUgVHhXSSBmb3IgdGhlIEJlYWNvbiBmcmFtZXMuCisJCQlwQmVhY29uU3luYy0+QmVhY29uQml0TWFwICY9ICh+KEJFQUNPTl9CSVRNQVBfTUFTSyAmICgxIDw8IGJjbl9pZHgpKSk7CisJCQlOZGlzTW92ZU1lbW9yeShwQmVhY29uU3luYy0+QmVhY29uVHhXSVtiY25faWR4XSwgJnBBZC0+QmVhY29uVHhXSSwgVFhXSV9TSVpFKTsKKwkJfQorCisJCWlmICgocEJlYWNvblN5bmMtPkJlYWNvbkJpdE1hcCAmICgxIDw8IGJjbl9pZHgpKSAhPSAoMSA8PCBiY25faWR4KSkKKwkJeworCQkJZm9yIChpPTA7IGk8VFhXSV9TSVpFOyBpKz00KSAgLy8gMTYtYnl0ZSBUWFdJIGZpZWxkCisJCQl7CisJCQkJbG9uZ1ZhbHVlID0gICpwdHIgKyAoKihwdHIrMSk8PDgpICsgKCoocHRyKzIpPDwxNikgKyAoKihwdHIrMyk8PDI0KTsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBwQWQtPkJlYWNvbk9mZnNldFtiY25faWR4XSArIGksIGxvbmdWYWx1ZSk7CisJCQkJcHRyICs9IDQ7CisJCQl9CisJCX0KKworCQlwdHIgPSBwQmVhY29uU3luYy0+QmVhY29uQnVmW2Jjbl9pZHhdOworCQlwYWRkaW5nID0gKEZyYW1lTGVuICYgMHgwMSk7CisJCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpKHBCZWFjb25GcmFtZSArIEZyYW1lTGVuKSwgcGFkZGluZyk7CisJCUZyYW1lTGVuICs9IHBhZGRpbmc7CisJCWZvciAoaSA9IDAgOyBpIDwgRnJhbWVMZW4gLypIV19CRUFDT05fT0ZGU0VUKi87IGkgKz0gMikKKwkJeworCQkJaWYgKE5kaXNFcXVhbE1lbW9yeShwdHIsIHBCZWFjb25GcmFtZSwgMikgPT0gRkFMU0UpCisJCQl7CisJCQkJTmRpc01vdmVNZW1vcnkocHRyLCBwQmVhY29uRnJhbWUsIDIpOworCQkJCS8vc2hvcnRWYWx1ZSA9ICpwdHIgKyAoKihwdHIrMSk8PDgpOworCQkJCS8vUlRNUF9JT19XUklURTgocEFkLCBwQWQtPkJlYWNvbk9mZnNldFtiY25faWR4XSArIFRYV0lfU0laRSArIGksIHNob3J0VmFsdWUpOworCQkJCVJUVVNCTXVsdGlXcml0ZShwQWQsIHBBZC0+QmVhY29uT2Zmc2V0W2Jjbl9pZHhdICsgVFhXSV9TSVpFICsgaSwgcHRyLCAyKTsKKwkJCX0KKwkJCXB0ciArPTI7CisJCQlwQmVhY29uRnJhbWUgKz0gMjsKKwkJfQorCisJCXBCZWFjb25TeW5jLT5CZWFjb25CaXRNYXAgfD0gKDEgPDwgYmNuX2lkeCk7CisJfQorCit9CisKKworVk9JRCBSVDI4NzBfQnNzQmVhY29uU3RvcCgKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCkKK3sKKwlCRUFDT05fU1lOQ19TVFJVQ1QJKnBCZWFjb25TeW5jOworCWludCBpLCBvZmZzZXQ7CisJQk9PTEVBTglDYW5jZWxsZWQgPSBUUlVFOworCisJcEJlYWNvblN5bmMgPSBwQWQtPkNvbW1vbkNmZy5wQmVhY29uU3luYzsKKwlpZiAocEJlYWNvblN5bmMgJiYgcEJlYWNvblN5bmMtPkVuYWJsZUJlYWNvbikKKwl7CisJCUlOVCBOdW1PZkJjbjsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCU51bU9mQmNuID0gTUFYX01FU0hfTlVNOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPkNvbW1vbkNmZy5CZWFjb25VcGRhdGVUaW1lciwgJkNhbmNlbGxlZCk7CisKKwkJZm9yKGk9MDsgaTxOdW1PZkJjbjsgaSsrKQorCQl7CisJCQlOZGlzWmVyb01lbW9yeShwQmVhY29uU3luYy0+QmVhY29uQnVmW2ldLCBIV19CRUFDT05fT0ZGU0VUKTsKKwkJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25TeW5jLT5CZWFjb25UeFdJW2ldLCBUWFdJX1NJWkUpOworCisJCQlmb3IgKG9mZnNldD0wOyBvZmZzZXQ8SFdfQkVBQ09OX09GRlNFVDsgb2Zmc2V0Kz00KQorCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIHBBZC0+QmVhY29uT2Zmc2V0W2ldICsgb2Zmc2V0LCAweDAwKTsKKworCQkJcEJlYWNvblN5bmMtPkNhcGFiaWxpdHlJbmZvTG9jYXRpb25JbkJlYWNvbltpXSA9IDA7CisJCQlwQmVhY29uU3luYy0+VGltSUVMb2NhdGlvbkluQmVhY29uW2ldID0gMDsKKwkJfQorCQlwQmVhY29uU3luYy0+QmVhY29uQml0TWFwID0gMDsKKwkJcEJlYWNvblN5bmMtPkR0aW1CaXRPbiA9IDA7CisJfQorfQorCisKK1ZPSUQgUlQyODcwX0Jzc0JlYWNvblN0YXJ0KAorCUlOIFJUTVBfQURBUFRFUiAqcEFkKQoreworCWludCBhcGlkeDsKKwlCRUFDT05fU1lOQ19TVFJVQ1QJKnBCZWFjb25TeW5jOworLy8JTEFSR0VfSU5URUdFUiAJdHNmVGltZSwgZGVsdGFUaW1lOworCisJcEJlYWNvblN5bmMgPSBwQWQtPkNvbW1vbkNmZy5wQmVhY29uU3luYzsKKwlpZiAocEJlYWNvblN5bmMgJiYgcEJlYWNvblN5bmMtPkVuYWJsZUJlYWNvbikKKwl7CisJCUlOVCBOdW1PZkJjbjsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCU51bU9mQmNuID0gTUFYX01FU0hfTlVNOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJZm9yKGFwaWR4PTA7IGFwaWR4PE51bU9mQmNuOyBhcGlkeCsrKQorCQl7CisJCQlVQ0hBUiBDYXBhYmlsaXR5SW5mb0xvY2F0aW9uSW5CZWFjb24gPSAwOworCQkJVUNIQVIgVGltSUVMb2NhdGlvbkluQmVhY29uID0gMDsKKworCQkJTmRpc1plcm9NZW1vcnkocEJlYWNvblN5bmMtPkJlYWNvbkJ1ZlthcGlkeF0sIEhXX0JFQUNPTl9PRkZTRVQpOworCQkJcEJlYWNvblN5bmMtPkNhcGFiaWxpdHlJbmZvTG9jYXRpb25JbkJlYWNvblthcGlkeF0gPSBDYXBhYmlsaXR5SW5mb0xvY2F0aW9uSW5CZWFjb247CisJCQlwQmVhY29uU3luYy0+VGltSUVMb2NhdGlvbkluQmVhY29uW2FwaWR4XSA9IFRpbUlFTG9jYXRpb25JbkJlYWNvbjsKKwkJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25TeW5jLT5CZWFjb25UeFdJW2FwaWR4XSwgVFhXSV9TSVpFKTsKKwkJfQorCQlwQmVhY29uU3luYy0+QmVhY29uQml0TWFwID0gMDsKKwkJcEJlYWNvblN5bmMtPkR0aW1CaXRPbiA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkJlYWNvblVwZGF0ZVRpbWVyLlJlcGVhdCA9IFRSVUU7CisKKwkJcEFkLT5Db21tb25DZmcuQmVhY29uQWRqdXN0ID0gMDsKKwkJcEFkLT5Db21tb25DZmcuQmVhY29uRmFjdG9yID0gMHhmZmZmZmZmZiAvIChwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgMTApOworCQlwQWQtPkNvbW1vbkNmZy5CZWFjb25SZW1haW4gPSAoMHhmZmZmZmZmZiAlIChwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgMTApKSArIDE7CisJCXByaW50aygiUlQyODcwX0Jzc0JlYWNvblN0YXJ0OkJlYWNvbkZhY3Rvcj0lZCwgQmVhY29uUmVtYWluPSVkIVxuIiwgcEFkLT5Db21tb25DZmcuQmVhY29uRmFjdG9yLCBwQWQtPkNvbW1vbkNmZy5CZWFjb25SZW1haW4pOworCQlSVE1QU2V0VGltZXIoJnBBZC0+Q29tbW9uQ2ZnLkJlYWNvblVwZGF0ZVRpbWVyLCBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QpOworCisJfQorfQorCisKK1ZPSUQgUlQyODcwX0Jzc0JlYWNvbkluaXQoCisJSU4gUlRNUF9BREFQVEVSICpwQWQpCit7CisJQkVBQ09OX1NZTkNfU1RSVUNUCSpwQmVhY29uU3luYzsKKwlpbnQgaTsKKworCU5kaXNBbGxvY01lbW9yeShwQWQtPkNvbW1vbkNmZy5wQmVhY29uU3luYywgc2l6ZW9mKEJFQUNPTl9TWU5DX1NUUlVDVCksIE1FTV9BTExPQ19GTEFHKTsKKwlpZiAocEFkLT5Db21tb25DZmcucEJlYWNvblN5bmMpCisJeworCQlwQmVhY29uU3luYyA9IHBBZC0+Q29tbW9uQ2ZnLnBCZWFjb25TeW5jOworCQlOZGlzWmVyb01lbW9yeShwQmVhY29uU3luYywgc2l6ZW9mKEJFQUNPTl9TWU5DX1NUUlVDVCkpOworCQlmb3IoaT0wOyBpIDwgSFdfQkVBQ09OX01BWF9DT1VOVDsgaSsrKQorCQl7CisJCQlOZGlzWmVyb01lbW9yeShwQmVhY29uU3luYy0+QmVhY29uQnVmW2ldLCBIV19CRUFDT05fT0ZGU0VUKTsKKwkJCXBCZWFjb25TeW5jLT5DYXBhYmlsaXR5SW5mb0xvY2F0aW9uSW5CZWFjb25baV0gPSAwOworCQkJcEJlYWNvblN5bmMtPlRpbUlFTG9jYXRpb25JbkJlYWNvbltpXSA9IDA7CisJCQlOZGlzWmVyb01lbW9yeShwQmVhY29uU3luYy0+QmVhY29uVHhXSVtpXSwgVFhXSV9TSVpFKTsKKwkJfQorCQlwQmVhY29uU3luYy0+QmVhY29uQml0TWFwID0gMDsKKworCQkvL1JUTVBJbml0VGltZXIocEFkLCAmcEFkLT5Db21tb25DZmcuQmVhY29uVXBkYXRlVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihCZWFjb25VcGRhdGVFeGVjKSwgcEFkLCBUUlVFKTsKKwkJcEJlYWNvblN5bmMtPkVuYWJsZUJlYWNvbiA9IFRSVUU7CisJfQorfQorCisKK1ZPSUQgUlQyODcwX0Jzc0JlYWNvbkV4aXQoCisJSU4gUlRNUF9BREFQVEVSICpwQWQpCit7CisJQkVBQ09OX1NZTkNfU1RSVUNUCSpwQmVhY29uU3luYzsKKwlCT09MRUFOCUNhbmNlbGxlZCA9IFRSVUU7CisJaW50IGk7CisKKwlpZiAocEFkLT5Db21tb25DZmcucEJlYWNvblN5bmMpCisJeworCQlwQmVhY29uU3luYyA9IHBBZC0+Q29tbW9uQ2ZnLnBCZWFjb25TeW5jOworCQlwQmVhY29uU3luYy0+RW5hYmxlQmVhY29uID0gRkFMU0U7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5Db21tb25DZmcuQmVhY29uVXBkYXRlVGltZXIsICZDYW5jZWxsZWQpOworCQlwQmVhY29uU3luYy0+QmVhY29uQml0TWFwID0gMDsKKworCQlmb3IoaT0wOyBpPEhXX0JFQUNPTl9NQVhfQ09VTlQ7IGkrKykKKwkJeworCQkJTmRpc1plcm9NZW1vcnkocEJlYWNvblN5bmMtPkJlYWNvbkJ1ZltpXSwgSFdfQkVBQ09OX09GRlNFVCk7CisJCQlwQmVhY29uU3luYy0+Q2FwYWJpbGl0eUluZm9Mb2NhdGlvbkluQmVhY29uW2ldID0gMDsKKwkJCXBCZWFjb25TeW5jLT5UaW1JRUxvY2F0aW9uSW5CZWFjb25baV0gPSAwOworCQkJTmRpc1plcm9NZW1vcnkocEJlYWNvblN5bmMtPkJlYWNvblR4V0lbaV0sIFRYV0lfU0laRSk7CisJCX0KKworCQlOZGlzRnJlZU1lbW9yeShwQWQtPkNvbW1vbkNmZy5wQmVhY29uU3luYywgSFdfQkVBQ09OX09GRlNFVCAqIEhXX0JFQUNPTl9NQVhfQ09VTlQsIDApOworCQlwQWQtPkNvbW1vbkNmZy5wQmVhY29uU3luYyA9IE5VTEw7CisJfQorfQorCitWT0lEIEJlYWNvblVwZGF0ZUV4ZWMoCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCVBSVE1QX0FEQVBURVIJcEFkID0gKFBSVE1QX0FEQVBURVIpRnVuY3Rpb25Db250ZXh0OworCUxBUkdFX0lOVEVHRVIJdHNmVGltZV9hOy8vLCB0c2ZUaW1lX2IsIGRlbHRhVGltZV9leHAsIGRlbHRhVGltZV9hYjsKKwlVSU5UMzIJCQlkZWx0YSwgcmVtYWluLCByZW1haW5fbG93LCByZW1haW5faGlnaDsKKy8vCUJPT0xFQU4JCQlwb3NpdGl2ZTsKKworCVJlU3luY0JlYWNvblRpbWUocEFkKTsKKworCisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRTRl9USU1FUl9EVzAsICZ0c2ZUaW1lX2EudS5Mb3dQYXJ0KTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRTRl9USU1FUl9EVzEsICZ0c2ZUaW1lX2EudS5IaWdoUGFydCk7CisKKworCS8vcG9zaXRpdmU9Z2V0RGVsdGFUaW1lKHRzZlRpbWVfYSwgZXhwZWN0ZWRUaW1lLCAmZGVsdGFUaW1lX2V4cCk7CisJcmVtYWluX2hpZ2ggPSBwQWQtPkNvbW1vbkNmZy5CZWFjb25SZW1haW4gKiB0c2ZUaW1lX2EudS5IaWdoUGFydDsKKwlyZW1haW5fbG93ID0gdHNmVGltZV9hLnUuTG93UGFydCAlIChwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgMTApOworCXJlbWFpbiA9IChyZW1haW5faGlnaCArIHJlbWFpbl9sb3cpJShwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgMTApOworCWRlbHRhID0gKHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA8PCAxMCkgLSByZW1haW47CisKKwlwQWQtPkNvbW1vbkNmZy5CZWFjb25VcGRhdGVUaW1lci5UaW1lclZhbHVlID0gKGRlbHRhID4+IDEwKSArIDEwOworCit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mzk4ZDk3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9LY29uZmlnCkBAIC0wLDAgKzEsNiBAQAorY29uZmlnIFJUMjg3MAorCXRyaXN0YXRlICJSYWxpbmsgMjg3MCB3aXJlbGVzcyBzdXBwb3J0IgorCWRlcGVuZHMgb24gVVNCICYmIFg4NiAmJiBXTEFOXzgwMjExCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhbiBleHBlcmltZW50YWwgZHJpdmVyIGZvciB0aGUgUmFsaW5rIDI4NzAgd2lyZWxlc3MgY2hpcC4KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEwMTVmNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvTWFrZWZpbGUKQEAgLTAsMCArMSw0NyBAQAorb2JqLSQoQ09ORklHX1JUMjg3MCkJKz0gcnQyODcwc3RhLm8KKworIyBUT0RPOiBhbGwgb2YgdGhlc2Ugc2hvdWxkIGJlIHJlbW92ZWQKK0VYVFJBX0NGTEFHUyArPSAtRExJTlVYIC1EQUdHUkVHQVRJT05fU1VQUE9SVCAtRFBJR0dZQkFDS19TVVBQT1JUIC1EV01NX1NVUFBPUlQKK0VYVFJBX0NGTEFHUyArPSAtRFJUMjg3MAorRVhUUkFfQ0ZMQUdTICs9IC1EQ09ORklHX1NUQV9TVVBQT1JUCitFWFRSQV9DRkxBR1MgKz0gLUREQkcKK0VYVFJBX0NGTEFHUyArPSAtRERPVDExX05fU1VQUE9SVAorRVhUUkFfQ0ZMQUdTICs9IC1EV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorRVhUUkFfQ0ZMQUdTICs9IC1ETkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKworcnQyODcwc3RhLW9ianMgOj0JCVwKKwljb21tb24vbWQ1Lm8JCVwKKwljb21tb24vbWxtZS5vCQlcCisJY29tbW9uL3J0bXBfd2VwLm8JXAorCWNvbW1vbi9hY3Rpb24ubwkJXAorCWNvbW1vbi9jbW1fZGF0YS5vCVwKKwljb21tb24vcnRtcF9pbml0Lm8JXAorCWNvbW1vbi9ydG1wX3RraXAubwlcCisJY29tbW9uL2NtbV9zeW5jLm8JXAorCWNvbW1vbi9lZXByb20ubwkJXAorCWNvbW1vbi9jbW1fc2FuaXR5Lm8JXAorCWNvbW1vbi9jbW1faW5mby5vCVwKKwljb21tb24vY21tX3dwYS5vCVwKKwljb21tb24vZGZzLm8JCVwKKwljb21tb24vc3BlY3RydW0ubwlcCisJc3RhL2Fzc29jLm8JCVwKKwlzdGEvYWlyb25ldC5vCQlcCisJc3RhL2F1dGgubwkJXAorCXN0YS9hdXRoX3JzcC5vCQlcCisJc3RhL3N5bmMubwkJXAorCXN0YS9zYW5pdHkubwkJXAorCXN0YS9ydG1wX2RhdGEubwkJXAorCXN0YS9jb25uZWN0Lm8JCVwKKwlzdGEvd3BhLm8JCVwKKwlydF9saW51eC5vCQlcCisJcnRfcHJvZmlsZS5vCQlcCisJcnRfbWFpbl9kZXYubwkJXAorCXN0YV9pb2N0bC5vCQlcCisJY29tbW9uL2JhX2FjdGlvbi5vCVwKKwkyODcwX21haW5fZGV2Lm8JCVwKKwljb21tb24vMjg3MF9ydG1wX2luaXQubwlcCisJY29tbW9uL3J0dXNiX2lvLm8JXAorCWNvbW1vbi9ydHVzYl9idWxrLm8JXAorCWNvbW1vbi9ydHVzYl9kYXRhLm8JXAorCWNvbW1vbi9jbW1fZGF0YV8yODcwLm8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZTFhYzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL1RPRE8KQEAgLTAsMCArMSwxMCBAQAorVE9ETzoKKwktIGNoZWNrcGF0Y2gucGwgY2xlYW4KKwktIHNwYXJzZSBjbGVhbgorCS0gcG9ydCB0byBpbi1rZXJuZWwgODAyMTEgc3RhY2sKKwktIHJlbW92ZSByZWFkaW5nIGZyb20gL2V0Yy8gY29uZmlnIGZpbGVzCisJLSByZXZpZXcgYnkgdGhlIHdpcmVsZXNzIGRldmVsb3BlciBjb21tdW5pdHkKKworUGxlYXNlIHNlbmQgYW55IHBhdGNoZXMgb3IgY29tcGxhaW50cyBhYm91dCB0aGlzIGRyaXZlciB0byBHcmVnCitLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4gYW5kIGRvbid0IGJvdGhlciB0aGUgdXBzdHJlYW0gd2lyZWxlc3MKK2tlcm5lbCBkZXZlbG9wZXJzIGFib3V0IGl0LCB0aGV5IHdhbnQgbm90aGluZyB0byBkbyB3aXRoIGl0LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9haXJvbmV0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2Fpcm9uZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTA3YjE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9haXJvbmV0LmgKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJYWlyb25ldC5oCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCisJUGF1bCBMaW4JMDQtMDYtMTUJCUluaXRpYWwKKyovCisKKyNpZm5kZWYJX19BSVJPTkVUX0hfXworI2RlZmluZQlfX0FJUk9ORVRfSF9fCisKKy8vIE1lYXN1cmVtZW50IFR5cGUgZGVmaW5pdGlvbgorI2RlZmluZQlNU1JOX1RZUEVfVU5VU0VECQkJCTAKKyNkZWZpbmUJTVNSTl9UWVBFX0NIQU5ORUxfTE9BRF9SRVEJCTEKKyNkZWZpbmUJTVNSTl9UWVBFX05PSVNFX0hJU1RfUkVRCQkyCisjZGVmaW5lCU1TUk5fVFlQRV9CRUFDT05fUkVRCQkJMworI2RlZmluZQlNU1JOX1RZUEVfRlJBTUVfUkVRCQkJCTQKKworLy8gU2NhbiBNb2RlIGluIEJlYWNvbiBSZXF1ZXN0CisjZGVmaW5lCU1TUk5fU0NBTl9NT0RFX1BBU1NJVkUJCQkwCisjZGVmaW5lCU1TUk5fU0NBTl9NT0RFX0FDVElWRQkJCTEKKyNkZWZpbmUJTVNSTl9TQ0FOX01PREVfQkVBQ09OX1RBQkxFCQkyCisKKy8vIFBIWSB0eXBlIGRlZmluaXRpb24gZm9yIEFpcm9uZXQgYmVhY29uIHJlcG9ydCwgQ0NYIDIgdGFibGUgMzYtOQorI2RlZmluZQlQSFlfRkgJCQkJCQkJMQorI2RlZmluZQlQSFlfRFNTCQkJCQkJCTIKKyNkZWZpbmUJUEhZX1VOVVNFRAkJCQkJCTMKKyNkZWZpbmUJUEhZX09GRE0JCQkJCQk0CisjZGVmaW5lCVBIWV9IUl9EU1MJCQkJCQk1CisjZGVmaW5lCVBIWV9FUlAJCQkJCQkJNgorCisvLyBSUEkgdGFibGUgaW4gZEJtCisjZGVmaW5lCVJQSV8wCQkJMAkJCS8vCVBvd2VyIDw9IC04NworI2RlZmluZQlSUElfMQkJCTEJCQkvLwktODcgPCBQb3dlciA8PSAtODIKKyNkZWZpbmUJUlBJXzIJCQkyCQkJLy8JLTgyIDwgUG93ZXIgPD0gLTc3CisjZGVmaW5lCVJQSV8zCQkJMwkJCS8vCS03NyA8IFBvd2VyIDw9IC03MgorI2RlZmluZQlSUElfNAkJCTQJCQkvLwktNzIgPCBQb3dlciA8PSAtNjcKKyNkZWZpbmUJUlBJXzUJCQk1CQkJLy8JLTY3IDwgUG93ZXIgPD0gLTYyCisjZGVmaW5lCVJQSV82CQkJNgkJCS8vCS02MiA8IFBvd2VyIDw9IC01NworI2RlZmluZQlSUElfNwkJCTcJCQkvLwktNTcgPCBQb3dlcgorCisvLyBDaXNjbyBBaXJvbmV0IElBUFAgZGVmaW5ldGlvbnMKKyNkZWZpbmUJQUlST05FVF9JQVBQX1RZUEUJCQkJCTB4MzIKKyNkZWZpbmUJQUlST05FVF9JQVBQX1NVQlRZUEVfUkVRVUVTVAkJMHgwMQorI2RlZmluZQlBSVJPTkVUX0lBUFBfU1VCVFlQRV9SRVBPUlQJCQkweDgxCisKKy8vIE1lYXN1cmVtZW50IFJlcXVlc3QgZGV0YWlsIGZvcm1hdAordHlwZWRlZglzdHJ1Y3QJX01FQVNVUkVNRU5UX1JFUVVFU1QJeworCVVDSEFSCUNoYW5uZWw7CisJVUNIQVIJU2Nhbk1vZGU7CQkJLy8gVXNlIG9ubHkgaW4gYmVhY29uIHJlcXVlc3QsIG90aGVyIHJlcXVlc3RzIGRpZCBub3QgdXNlIHRoaXMgZmllbGQKKwlVU0hPUlQJRHVyYXRpb247Cit9CU1FQVNVUkVNRU5UX1JFUVVFU1QsICpQTUVBU1VSRU1FTlRfUkVRVUVTVDsKKworLy8gQmVhY29uIE1lYXN1cmVtZW50IFJlcG9ydAorLy8gQWxsIHRoZXNlIGZpZWxkIG1pZ2h0IGNoYW5nZSB0byBVQ0hBUiwgYmVjYXVzZSB3ZSBkaWRuJ3QgZG8gYW55dGhpbmcgdG8gdGhlc2UgcmVwb3J0LgorLy8gV2UgY29weSBhbGwgdGhlc2UgYmVhY29ucyBhbmQgcmVwb3J0IHRvIENDWCAyIEFQLgordHlwZWRlZglzdHJ1Y3QJX0JFQUNPTl9SRVBPUlQJeworCVVDSEFSCUNoYW5uZWw7CisJVUNIQVIJU3BhcmU7CisJVVNIT1JUCUR1cmF0aW9uOworCVVDSEFSCVBoeVR5cGU7CQkJLy8gRGVmaW5pYXRpb24gaXMgbGlzdGVkIGFib3ZlIHRhYmxlIDM2LTkKKwlVQ0hBUglSeFBvd2VyOworCVVDSEFSCUJTU0lEWzZdOworCVVDSEFSCVBhcmVudFRTRls0XTsKKwlVQ0hBUglUYXJnZXRUU0ZbOF07CisJVVNIT1JUCUJlYWNvbkludGVydmFsOworCVVTSE9SVAlDYXBhYmlsaXR5SW5mbzsKK30JQkVBQ09OX1JFUE9SVCwgKlBCRUFDT05fUkVQT1JUOworCisvLyBGcmFtZSBNZWFzdXJlbWVudCBSZXBvcnQgKE9wdGlvbmFsKQordHlwZWRlZglzdHJ1Y3QJX0ZSQU1FX1JFUE9SVAl7CisJVUNIQVIJQ2hhbm5lbDsKKwlVQ0hBUglTcGFyZTsKKwlVU0hPUlQJRHVyYXRpb247CisJVUNIQVIJVEE7CisJVUNIQVIJQlNTSURbNl07CisJVUNIQVIJUlNTSTsKKwlVQ0hBUglDb3VudDsKK30JRlJBTUVfUkVQT1JULCAqUEZSQU1FX1JFUE9SVDsKKworI3ByYWdtYSBwYWNrKDEpCisvLyBDaGFubmVsIExvYWQgUmVwb3J0Cit0eXBlZGVmCXN0cnVjdAlfQ0hBTk5FTF9MT0FEX1JFUE9SVAl7CisJVUNIQVIJQ2hhbm5lbDsKKwlVQ0hBUglTcGFyZTsKKwlVU0hPUlQJRHVyYXRpb247CisJVUNIQVIJQ0NBQnVzeTsKK30JQ0hBTk5FTF9MT0FEX1JFUE9SVCwgKlBDSEFOTkVMX0xPQURfUkVQT1JUOworI3ByYWdtYSBwYWNrKCkKKworLy8gTm9zaWUgSGlzdG9ncmFtIFJlcG9ydAordHlwZWRlZglzdHJ1Y3QJX05PSVNFX0hJU1RfUkVQT1JUCXsKKwlVQ0hBUglDaGFubmVsOworCVVDSEFSCVNwYXJlOworCVVTSE9SVAlEdXJhdGlvbjsKKwlVQ0hBUglEZW5zaXR5WzhdOworfQlOT0lTRV9ISVNUX1JFUE9SVCwgKlBOT0lTRV9ISVNUX1JFUE9SVDsKKworLy8gUmFkaW8gTWFuYWdlbWVudCBDYXBhYmlsaXR5IGVsZW1lbnQKK3R5cGVkZWYJc3RydWN0CV9SQURJT19NQU5BR0VNRU5UX0NBUEFCSUxJVFkJeworCVVDSEFSCUVpZDsJCQkJLy8gVE9ETzogV2h5IHRoZSBFaWQgaXMgMSBieXRlLCBub3Qgbm9ybWFsIDIgYnl0ZXM/Pz8KKwlVQ0hBUglMZW5ndGg7CisJVUNIQVIJQWlyb25ldE91aVszXTsJCS8vIEFJcm9uZXQgT1VJICgwMCA0MCA5NikKKwlVQ0hBUglUeXBlOwkJCQkvLyBUeXBlIC8gVmVyc2lvbgorCVVTSE9SVAlTdGF0dXM7CQkJCS8vIHN3YXAxNiByZXF1aXJlZAorfQlSQURJT19NQU5BR0VNRU5UX0NBUEFCSUxJVFksICpQUkFESU9fTUFOQUdFTUVOVF9DQVBBQklMSVRZOworCisvLyBNZWFzdXJlbWVudCBNb2RlIEJpdCBkZWZpbml0aW9uCit0eXBlZGVmCXN0cnVjdAlfTUVBU1VSRU1FTlRfTU9ERQl7CisJVUNIQVIJUnN2ZDo0OworCVVDSEFSCVJlcG9ydDoxOworCVVDSEFSCU5vdFVzZWQ6MTsKKwlVQ0hBUglFbmFibGU6MTsKKwlVQ0hBUglQYXJhbGxlbDoxOworfQlNRUFTVVJFTUVOVF9NT0RFLCAqUE1FQVNVUkVNRU5UX01PREU7CisKKy8vIE1lYXN1cmVtZW50IFJlcXVlc3QgZWxlbWVudCwgVGhpcyBpcyBsaXR0bGUgZW5kaWFuIG1vZGUKK3R5cGVkZWYJc3RydWN0CV9NRUFTVVJFTUVOVF9SRVFVRVNUX0VMRU1FTlQJeworCVVTSE9SVAkJCQlFaWQ7CisJVVNIT1JUCQkJCUxlbmd0aDsJCQkJLy8gc3dhcDE2IHJlcXVpcmVkCisJVVNIT1JUCQkJCVRva2VuOwkJCQkvLyBub24temVybyB1bmlxdWUgdG9rZW4KKwlVQ0hBUgkJCQlNb2RlOwkJCQkvLyBNZWFzdXJlbWVudCBNb2RlCisJVUNIQVIJCQkJVHlwZTsJCQkJLy8gTWVhc3VyZW1lbnQgdHlwZQorfQlNRUFTVVJFTUVOVF9SRVFVRVNUX0VMRU1FTlQsICpQTUVBU1VSRU1FTlRfUkVRVUVTVF9FTEVNRU5UOworCisvLyBNZWFzdXJlbWVudCBSZXBvcnQgZWxlbWVudCwgVGhpcyBpcyBsaXR0bGUgZW5kaWFuIG1vZGUKK3R5cGVkZWYJc3RydWN0CV9NRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVAl7CisJVVNIT1JUCQkJCUVpZDsKKwlVU0hPUlQJCQkJTGVuZ3RoOwkJCQkvLyBzd2FwMTYgcmVxdWlyZWQKKwlVU0hPUlQJCQkJVG9rZW47CQkJCS8vIG5vbi16ZXJvIHVuaXF1ZSB0b2tlbgorCVVDSEFSCQkJCU1vZGU7CQkJCS8vIE1lYXN1cmVtZW50IE1vZGUKKwlVQ0hBUgkJCQlUeXBlOwkJCQkvLyBNZWFzdXJlbWVudCB0eXBlCit9CU1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5ULCAqUE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UOworCisvLyBDaXNjbyBBaXJvbmV0IElBUFAgRnJhbWUgSGVhZGVyLCBOZXR3b3JrIGJ5dGUgb3JkZXIgdXNlZAordHlwZWRlZglzdHJ1Y3QJX0FJUk9ORVRfSUFQUF9IRUFERVIgeworCVVDSEFSCUNpc2NvU25hcEhlYWRlcls4XTsJLy8gOCBieXRlcyBDaXNjbyBzbmFwIGhlYWRlcgorCVVTSE9SVAlMZW5ndGg7CQkJCS8vIElBUFAgSUQgJiBsZW5ndGgsIHJlbWVtYmVyIHRvIHN3YXAxNiBpbiBMRSBzeXN0ZW0KKwlVQ0hBUglUeXBlOwkJCQkvLyBJQVBQIHR5cGUKKwlVQ0hBUglTdWJUeXBlOwkJCS8vIElBUFAgc3VidHlwZQorCVVDSEFSCURBWzZdOwkJCQkvLyBEZXN0aW5hdGlvbiBNQUMgYWRkcmVzcworCVVDSEFSCVNBWzZdOwkJCQkvLyBTb3VyY2UgTUFDIGFkZHJlc3MKKwlVU0hPUlQJVG9rZW47CQkJCS8vIERpYWxvZyB0b2tlbiwgbm8gbmVlZCB0byBzd2FwMTYgc2luY2UgaXQgaXMgZm9yIHlva2VuIHVzYWdlIG9ubHkKK30JQUlST05FVF9JQVBQX0hFQURFUiwgKlBBSVJPTkVUX0lBUFBfSEVBREVSOworCisvLyBSYWRpbyBNZWFzdXJlbWVudCBSZXF1ZXN0IGZyYW1lCit0eXBlZGVmCXN0cnVjdAlfQUlST05FVF9STV9SRVFVRVNUX0ZSQU1FCXsKKyAgICBBSVJPTkVUX0lBUFBfSEVBREVSCUlBUFA7CQkJLy8gQ29tbW9uIGhlYWRlcgorCVVDSEFSCQkJCURlbGF5OwkJCS8vIEFjdGl2YXRpb24gRGVsYXkKKwlVQ0hBUgkJCQlPZmZzZXQ7CQkJLy8gTWVhc3VyZW1lbnQgb2Zmc2V0Cit9CUFJUk9ORVRfUk1fUkVRVUVTVF9GUkFNRSwgKlBBSVJPTkVUX1JNX1JFUVVFU1RfRlJBTUU7CisKKy8vIFJhZGlvIE1lYXN1cmVtZW50IFJlcG9ydCBmcmFtZQordHlwZWRlZglzdHJ1Y3QJX0FJUk9ORVRfUk1fUkVQT1JUX0ZSQU1FCXsKKyAgICBBSVJPTkVUX0lBUFBfSEVBREVSCUlBUFA7CQkJLy8gQ29tbW9uIGhlYWRlcgorfQlBSVJPTkVUX1JNX1JFUE9SVF9GUkFNRSwgKlBBSVJPTkVUX1JNX1JFUE9SVF9GUkFNRTsKKworLy8gU2F2ZWQgZWxlbWVudCByZXF1ZXN0IGFjdGlvbnMgd2hpY2ggd2lsbCBzYXZlZCBpbiBTdGFDZmcuCit0eXBlZGVmCXN0cnVjdAlfUk1fUkVRVUVTVF9BQ1RJT04JeworCU1FQVNVUkVNRU5UX1JFUVVFU1RfRUxFTUVOVAlSZXFFbGVtOwkJLy8gU2F2ZWQgcmVxdWVzdCBlbGVtZW50CisJTUVBU1VSRU1FTlRfUkVRVUVTVAkJCU1lYXN1cmVtZW50OwkvLyBTYXZlZCBtZWFzdXJlbWVudCB3aXRoaW4gdGhlIHJlcXVlc3QgZWxlbWVudAorfQlSTV9SRVFVRVNUX0FDVElPTiwgKlBSTV9SRVFVRVNUX0FDVElPTjsKKworLy8gQ0NYIGFkbWluaXN0cmF0aW9uIGNvbnRyb2wKK3R5cGVkZWYJdW5pb24JX0NDWF9DT05UUk9MCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCUVuYWJsZToxOwkJCS8vIEVuYWJsZSBDQ1gyCisJCVVJTlQzMgkJTGVhcEVuYWJsZToxOwkJLy8gRW5hYmxlIExFQVAgYXQgQ0NYMgorCQlVSU5UMzIJCVJNRW5hYmxlOjE7CQkJLy8gUmFkaW8gTWVhc3VyZW1lbnQgRW5hYmxlCisJCVVJTlQzMgkJRENSTUVuYWJsZToxOwkJLy8gTm9uIHNlcnZpbmcgY2hhbm5lbCBSYWRpbyBNZWFzdXJlbWVudCBlbmFibGUKKwkJVUlOVDMyCQlRT1NFbmFibGU6MTsJCS8vIEVuYWJsZSBRT1MgZm9yIENDWCAyLjAgc3VwcG9ydAorCQlVSU5UMzIJCUZhc3RSb2FtRW5hYmxlOjE7CS8vIEVuYWJsZSBmYXN0IHJvYW1pbmcKKwkJVUlOVDMyCQlSc3ZkOjI7CQkJCS8vIE5vdCB1c2VkCisJCVVJTlQzMgkJZEJtVG9Sb2FtOjg7CQkvLyB0aGUgY29uZGl0aW9uIHRvIHJvYW0gd2hlbiByZWNlaXZpbmcgUnNzaSBsZXNzIHRoYW4gdGhpcyB2YWx1ZS4gSXQncyBuZWdhdGl2ZSB2YWx1ZS4KKwkJVUlOVDMyCQlUdUxpbWl0OjE2OwkJCS8vIExpbWl0IGZvciBkaWZmZXJlbnQgY2hhbm5lbCBzY2FuCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlDQ1hfQ09OVFJPTCwgKlBDQ1hfQ09OVFJPTDsKKworI2VuZGlmCS8vIF9fQUlST05FVF9IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvYXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGM1NTc1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9hcC5oCkBAIC0wLDAgKzEsNTYyIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorICAgIGFwLmgKKworICAgIEFic3RyYWN0OgorICAgIE1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBQYXVsIExpbiAgICAwOC0wMS0yMDAyICAgIGNyZWF0ZWQKKyAgICBKYW1lcyBUYW4gICAwOS0wNi0yMDAyICAgIG1vZGlmaWVkIChSZXZpc2UgTlRDUmVnVGFibGUpCisgICAgSm9obiBDaGFuZyAgMTItMjItMjAwNCAgICBtb2RpZmllZCBmb3IgUlQyNTYxLzI2NjEuIG1lcmdlIHdpdGggU1RBIGRyaXZlcgorKi8KKyNpZm5kZWYgX19BUF9IX18KKyNkZWZpbmUgX19BUF9IX18KKworCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT0gQVAgUlRNUC5oID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgICAgIEZ1bmN0aW9uIFByb3RvdHlwZXMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gYXBfZGF0YS5jCisKK0JPT0xFQU4gQVBCcmlkZ2VUb1dpcmVsZXNzU3RhKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgcEhlYWRlciwKKyAgICBJTiAgVUlOVCAgICAgICAgICAgIEhkckxlbiwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIHBEYXRhLAorICAgIElOICBVSU5UICAgICAgICAgICAgRGF0YUxlbiwKKyAgICBJTiAgVUxPTkcgICAgICAgICAgIGZyb213ZHNpZHgpOworCitCT09MRUFOIEFQSGFuZGxlUnhEb25lSW50ZXJydXB0KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRAlBUFNlbmRQYWNrZXRzKAorCUlOCU5ESVNfSEFORExFCQlNaW5pcG9ydEFkYXB0ZXJDb250ZXh0LAorCUlOCVBQTkRJU19QQUNLRVQJcHBQYWNrZXRBcnJheSwKKwlJTglVSU5UCQkJTnVtYmVyT2ZQYWNrZXRzKTsKKworTkRJU19TVEFUVVMgQVBTZW5kUGFja2V0KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQTkRJU19QQUNLRVQgICAgcFBhY2tldCk7CisKKworTkRJU19TVEFUVVMgQVBIYXJkVHJhbnNtaXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaywKKwlJTglVQ0hBUgkJCVF1ZUlkeCk7CisKK1ZPSUQgQVBSeEVBUE9MRnJhbWVJbmRpY2F0ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCitORElTX1NUQVRVUyBBUENoZWNrUnhFcnJvcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQUlQyOFhYX1JYRF9TVFJVQwkJcFJ4RCwKKwlJTglVQ0hBUgkJCVdjaWQpOworCitCT09MRUFOIEFQQ2hlY2tDbGFzczJDbGFzczNFcnJvcigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiBVTE9ORyBXY2lkLAorCUlOICBQSEVBREVSXzgwMl8xMSAgcEhlYWRlcik7CisKK1ZPSUQgQVBIYW5kbGVSeFBzUG9sbCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwQWRkciwKKwlJTglVU0hPUlQJCQlBaWQsCisgICAgSU4JQk9PTEVBTgkJCWlzQWN0aXZlKTsKKworVk9JRCAgICBSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIHBEYXRhLAorICAgIElOICBVTE9ORyAgICAgICAgICAgRGVzY3JpcHRvclR5cGUpOworCitWT0lEICAgIFJUTVBGcmFtZUVuZGlhbkNoYW5nZSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIHBEYXRhLAorICAgIElOICBVTE9ORyAgICAgICAgICAgRGlyLAorICAgIElOICBCT09MRUFOICAgICAgICAgRnJvbVJ4RG9uZUludCk7CisKKy8vIGFwX2Fzc29jLmMKKworVk9JRCBBUEFzc29jU3RhdGVNYWNoaW5lSW5pdCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgU1RBVEVfTUFDSElORSAqUywKKyAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCitWT0lEICBBUFBlZXJBc3NvY1JlcUFjdGlvbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgQVBQZWVyUmVhc3NvY1JlcUFjdGlvbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgQVBQZWVyRGlzYXNzb2NSZXFBY3Rpb24oCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgTWJzc0tpY2tPdXRTdGFzKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIElOVCBhcGlkeCwKKwlJTiBVU0hPUlQgUmVhc29uKTsKKworVk9JRCBBUE1sbWVLaWNrT3V0U3RhKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBwU3RhQWRkciwKKwlJTiBVQ0hBUiBXY2lkLAorCUlOIFVTSE9SVCBSZWFzb24pOworCitWT0lEIEFQTWxtZURpc2Fzc29jUmVxQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgIEFQQ2xzM2VyckFjdGlvbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAJVUxPTkcgV2NpZCwKKyAgICBJTglQSEVBREVSXzgwMl8xMQlwSGVhZGVyKTsKKworCitVU0hPUlQgQVBCdWlsZEFzc29jaWF0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5LAorICAgIElOIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKKyAgICBJTiBVQ0hBUiAgTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcywKKyAgICBJTiBVQ0hBUiAgKlJTTiwKKyAgICBJTiBVQ0hBUiAgKnBSU05MZW4sCisgICAgSU4gQk9PTEVBTiBiV21tQ2FwYWJsZSwKKyAgICBJTiBVTE9ORyAgUmFsaW5rSWUsCisjaWZkZWYgRE9UMTFOX0RSQUZUMworICAgIElOIEVYVF9DQVBfSU5GT19FTEVNRU5UIEV4dENhcEluZm8sCisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCUlOIEhUX0NBUEFCSUxJVFlfSUUJCSpwSHRDYXBhYmlsaXR5LAorCUlOIFVDSEFSCQkgSHRDYXBhYmlsaXR5TGVuLAorICAgIE9VVCBVU0hPUlQgKnBBaWQpOworCisvKgorVk9JRAlSVE1QQWRkQ2xpZW50U2VjKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCUJzc0lkeCwKKwlJTiBVQ0hBUgkJIEtleUlkeCwKKwlJTiBVQ0hBUgkJIENpcGhlckFsZywKKwlJTiBQVUNIQVIJCSBwS2V5LAorCUlOIFBVQ0hBUgkJIHBUeE1pYywKKwlJTiBQVUNIQVIJCSBwUnhNaWMsCisJSU4gTUFDX1RBQkxFX0VOVFJZICpwRW50cnkpOworKi8KKworLy8gYXBfYXV0aC5jCisKK3ZvaWQgQVBBdXRoU3RhdGVNYWNoaW5lSW5pdCgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBTVEFURV9NQUNISU5FICpTbSwKKyAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCitWT0lEIEFQTWxtZURlYXV0aFJlcUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFQQ2xzMmVyckFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiAJVUxPTkcgV2NpZCwKKyAgICBJTglQSEVBREVSXzgwMl8xMQlwSGVhZGVyKTsKKworLy8gYXBfYXV0aHJzcC5jCisKK1ZPSUQgQVBBdXRoUnNwU3RhdGVNYWNoaW5lSW5pdCgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBQU1RBVEVfTUFDSElORSBTbSwKKyAgICBJTiBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CisKK1ZPSUQgQVBQZWVyQXV0aEF0QXV0aFJzcElkbGVBY3Rpb24oCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQVBQZWVyRGVhdXRoUmVxQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIJcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQVBQZWVyQXV0aFNpbXBsZVJzcEdlbkFuZFNlbmQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBIRUFERVJfODAyXzExIHBIZHI4MDIxMSwKKyAgICBJTiAgVVNIT1JUIEFsZywKKyAgICBJTiAgVVNIT1JUIFNlcSwKKyAgICBJTiAgVVNIT1JUIFN0YXR1c0NvZGUpOworCisvLyBhcF9jb25uZWN0LmMKKworQk9PTEVBTiBCZWFjb25UcmFuc21pdFJlcXVpcmVkKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIElOVAkJCQlhcGlkeCk7CisKK1ZPSUQgQVBNYWtlQnNzQmVhY29uKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCUlOVAkJCQlhcGlkeCk7CisKK1ZPSUQgIEFQVXBkYXRlQmVhY29uRnJhbWUoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4JSU5UCQkJCWFwaWR4KTsKKworVk9JRCBBUE1ha2VBbGxCc3NCZWFjb24oCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEICBBUFVwZGF0ZUFsbEJlYWNvbkZyYW1lKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworCisvLyBhcF9zeW5jLmMKKworVk9JRCBBUFN5bmNTdGF0ZU1hY2hpbmVJbml0KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFNUQVRFX01BQ0hJTkUgKlNtLAorICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CisKK1ZPSUQgQVBTY2FuVGltZW91dCgKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIEFQSW52YWxpZFN0YXRlV2hlblNjYW4oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBUFNjYW5UaW1lb3V0QWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQVBQZWVyUHJvYmVSZXFBY3Rpb24oCisgICAgSU4gIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFQUGVlckJlYWNvbkFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFQTWxtZVNjYW5SZXFBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBUFBlZXJCZWFjb25BdFNjYW5BY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBUFNjYW5DbmNsQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQXBTaXRlU3VydmV5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBTdXBwb3J0UmF0ZSgKKwlJTiBQVUNIQVIgU3VwUmF0ZSwKKwlJTiBVQ0hBUiBTdXBSYXRlTGVuLAorCUlOIFBVQ0hBUiBFeHRSYXRlLAorCUlOIFVDSEFSIEV4dFJhdGVMZW4sCisJT1VUIFBVQ0hBUiAqUmF0ZXMsCisJT1VUIFBVQ0hBUiBSYXRlc0xlbiwKKwlPVVQgUFVDSEFSIHBNYXhTdXBwb3J0UmF0ZSk7CisKKworQk9PTEVBTiBBcFNjYW5SdW5uaW5nKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworI2lmZGVmIERPVDExTl9EUkFGVDMKK1ZPSUQgQVBPdmVybGFwcGluZ0JTU1NjYW4oCisJSU4gUlRNUF9BREFQVEVSICpwQWQpOworI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKworLy8gYXBfd3BhLmMKKworVk9JRCBBUFdwYVN0YXRlTWFjaGluZUluaXQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFNUQVRFX01BQ0hJTkUgKlNtLAorICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CisKKy8vIGFwX21sbWUuYworCitWT0lEIEFQTWxtZVBlcmlvZGljRXhlYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgQVBNbG1lU2VsZWN0VHhSYXRlVGFibGUoCisJSU4gUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOIFBNQUNfVEFCTEVfRU5UUlkJCXBFbnRyeSwKKwlJTiBQVUNIQVIJCQkJKnBwVGFibGUsCisJSU4gUFVDSEFSCQkJCXBUYWJsZVNpemUsCisJSU4gUFVDSEFSCQkJCXBJbml0VHhSYXRlSWR4KTsKKworVk9JRCBBUE1sbWVTZXRUeFJhdGUoCisJSU4gUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOIFBNQUNfVEFCTEVfRU5UUlkJCXBFbnRyeSwKKwlJTiBQUlRNUF9UWF9SQVRFX1NXSVRDSAlwVHhSYXRlKTsKKworVk9JRCBBUE1sbWVEeW5hbWljVHhSYXRlU3dpdGNoaW5nKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBBUFF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMoCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworQk9PTEVBTiBBUE1zZ1R5cGVTdWJzdCgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBQRlJBTUVfODAyXzExIHBGcmFtZSwKKyAgICBPVVQgSU5UICpNYWNoaW5lLAorICAgIE9VVCBJTlQgKk1zZ1R5cGUpOworCitWT0lEIEFQUXVpY2tSZXNwb25lRm9yUmF0ZVVwRXhlYygKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisgICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCisjaWZkZWYgUlQyODcwCitWT0lEIEJlYWNvblVwZGF0ZUV4ZWMoCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworVk9JRCBSVE1QU2V0UGlnZ3lCYWNrKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIEJPT0xFQU4JCQliUGlnZ3lCYWNrKTsKKworVk9JRCBBUEFzaWNFdmFsdWF0ZVJ4QW50KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBBUEFzaWNSeEFudEV2YWxUaW1lb3V0KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworLy8gYXAuYworCitWT0lEIEFQU3dpdGNoQ2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBJTlQgQ2hhbm5lbCk7CisKK05ESVNfU1RBVFVTIEFQSW5pdGlhbGl6ZSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgQVBTaHV0ZG93bigKKyAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCk7CisKK1ZPSUQgQVBTdGFydFVwKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBBUFN0b3AoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIEFQQ2xlYW51cFBzUXVldWUoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBRVUVVRV9IRUFERVIgICBwUXVldWUpOworCitWT0lEIE1hY1RhYmxlUmVzZXQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitNQUNfVEFCTEVfRU5UUlkgKk1hY1RhYmxlSW5zZXJ0RW50cnkoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBwQWRkciwKKwlJTglVQ0hBUgkJCWFwaWR4LAorCUlOIEJPT0xFQU4JQ2xlYW5BbGwpOworCitCT09MRUFOIE1hY1RhYmxlRGVsZXRlRW50cnkoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gVVNIT1JUIHdjaWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBwQWRkcik7CisKK01BQ19UQUJMRV9FTlRSWSAqTWFjVGFibGVMb29rdXAoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBwQWRkcik7CisKK1ZPSUQgTWFjVGFibGVNYWludGVuYW5jZSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1VJTlQzMiBNYWNUYWJsZUFzc29jU3RhTnVtR2V0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworTUFDX1RBQkxFX0VOVFJZICpBUFNzUHNJbnF1aXJ5KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgcEFkZHIsCisgICAgT1VUIFNTVCAgICAgICAgICAgICAqU3N0LAorICAgIE9VVCBVU0hPUlQgICAgICAgICAgKkFpZCwKKyAgICBPVVQgVUNIQVIgICAgICAgICAgICpQc01vZGUsCisgICAgT1VUIFVDSEFSICAgICAgICAgICAqUmF0ZSk7CisKK0JPT0xFQU4gQVBQc0luZGljYXRlKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgcEFkZHIsCisJSU4gVUxPTkcgV2NpZCwKKyAgICBJTiAgVUNIQVIgICAgICAgICAgIFBzbSk7CisKK1ZPSUQgQXBMb2dFdmVudCgKKyAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKyAgICBJTiBQVUNIQVIgICAgICAgICAgIHBBZGRyLAorICAgIElOIFVTSE9SVCAgICAgICAgICAgRXZlbnQpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitWT0lEIEFQVXBkYXRlT3BlcmF0aW9uTW9kZSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK1ZPSUQgQVBVcGRhdGVDYXBhYmlsaXR5QW5kRXJwSWUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitCT09MRUFOIEFwQ2hlY2tBY2Nlc3NDb250cm9sTGlzdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgICAgICAgIHBBZGRyLAorCUlOIFVDSEFSICAgICAgICAgQXBpZHgpOworCitWT0lEIEFwVXBkYXRlQWNjZXNzQ29udHJvbExpc3QoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVUNIQVIgICAgICAgICBBcGlkeCk7CisKK1ZPSUQgQXBFbnF1ZXVlTnVsbEZyYW1lKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiAgICAgICAgcEFkZHIsCisJSU4gVUNIQVIgICAgICAgICBUeFJhdGUsCisJSU4gVUNIQVIgICAgICAgICBQSUQsCisJSU4gVUNIQVIgICAgICAgICBhcGlkeCwKKyAgICBJTiBCT09MRUFOICAgICAgIGJRb3NOdWxsLAorICAgIElOIEJPT0xFQU4gICAgICAgYkVPU1AsCisgICAgSU4gVUNIQVIgICAgICAgICBPbGRVUCk7CisKK1ZPSUQgQXBTZW5kRnJhbWUoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBWT0lEICAgICAgICAgICBwQnVmZmVyLAorICAgIElOICBVTE9ORyAgICAgICAgICAgTGVuZ3RoLAorICAgIElOICBVQ0hBUiAgICAgICAgICAgVHhSYXRlLAorICAgIElOICBVQ0hBUiAgICAgICAgICAgUElEKTsKKworVk9JRCBBcEVucXVldWVBY2tGcmFtZSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBQVUNIQVIgICAgICAgIHBBZGRyLAorICAgIElOIFVDSEFSICAgICAgICAgVHhSYXRlLAorCUlOIFVDSEFSICAgICAgICAgYXBpZHgpOworCitVQ0hBUiBBUEF1dG9TZWxlY3RDaGFubmVsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIEJPT0xFQU4gT3B0aW1hbCk7CisKKy8vIGFwX3Nhbml0eS5jCisKKworQk9PTEVBTiBQZWVyQXNzb2NSZXFDbW1TYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gQk9PTEVBTiBpc1Jlc3NvYywKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcEFkZHIyLAorICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKKyAgICBPVVQgVVNIT1JUICpwTGlzdGVuSW50ZXJ2YWwsCisgICAgT1VUIFBVQ0hBUiBwQXBBZGRyLAorICAgIE9VVCBVQ0hBUiAqcFNzaWRMZW4sCisgICAgT1VUIGNoYXIgKlNzaWQsCisgICAgT1VUIFVDSEFSICpwUmF0ZXNMZW4sCisgICAgT1VUIFVDSEFSIFJhdGVzW10sCisgICAgT1VUIFVDSEFSICpSU04sCisgICAgT1VUIFVDSEFSICpwUlNOTGVuLAorICAgIE9VVCBCT09MRUFOICpwYldtbUNhcGFibGUsCisjaWZkZWYgV1NDX0FQX1NVUFBPUlQKKyAgICBPVVQgQk9PTEVBTiAqcFdzY0NhcGFibGUsCisjZW5kaWYgLy8gV1NDX0FQX1NVUFBPUlQgLy8KKyAgICBPVVQgVUxPTkcgICpwUmFsaW5rSWUsCisjaWZkZWYgRE9UMTFOX0RSQUZUMworICAgIE9VVCBFWFRfQ0FQX0lORk9fRUxFTUVOVAkqcEV4dENhcEluZm8sCisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworICAgIE9VVCBVQ0hBUgkJICpwSHRDYXBhYmlsaXR5TGVuLAorICAgIE9VVCBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5KTsKKworQk9PTEVBTiBQZWVyRGlzYXNzb2NSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMiwKKyAgICBPVVQgVVNIT1JUICpSZWFzb24pOworCitCT09MRUFOIFBlZXJEZWF1dGhSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMiwKKyAgICBPVVQgVVNIT1JUICpSZWFzb24pOworCitCT09MRUFOIEFQUGVlckF1dGhTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKwlPVVQgUFVDSEFSIHBBZGRyMSwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMiwKKyAgICBPVVQgVVNIT1JUICpBbGcsCisgICAgT1VUIFVTSE9SVCAqU2VxLAorICAgIE9VVCBVU0hPUlQgKlN0YXR1cywKKyAgICBDSEFSICpDaGxnVGV4dCk7CisKK0JPT0xFQU4gQVBQZWVyUHJvYmVSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMiwKKyAgICBPVVQgQ0hBUiBTc2lkW10sCisgICAgT1VUIFVDSEFSICpTc2lkTGVuKTsKKworQk9PTEVBTiBBUFBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcEFkZHIyLAorICAgIE9VVCBQVUNIQVIgcEJzc2lkLAorICAgIE9VVCBDSEFSIFNzaWRbXSwKKyAgICBPVVQgVUNIQVIgKlNzaWRMZW4sCisgICAgT1VUIFVDSEFSICpCc3NUeXBlLAorICAgIE9VVCBVU0hPUlQgKkJlYWNvblBlcmlvZCwKKyAgICBPVVQgVUNIQVIgKkNoYW5uZWwsCisgICAgT1VUIExBUkdFX0lOVEVHRVIgKlRpbWVzdGFtcCwKKyAgICBPVVQgVVNIT1JUICpDYXBhYmlsaXR5SW5mbywKKyAgICBPVVQgVUNIQVIgUmF0ZVtdLAorICAgIE9VVCBVQ0hBUiAqUmF0ZUxlbiwKKyAgICBPVVQgQk9PTEVBTiAqRXh0ZW5kZWRSYXRlSWVFeGlzdCwKKyAgICBPVVQgVUNIQVIgKkVycCk7CisKKy8vIGFwX2luZm8uYworCisKKworLy8gPT09PT09PT09PT09PT09PT09IGVuZCBvZiBBUCBSVE1QLmggPT09PT09PT09PT09PT09PT09PT09PT09CisKKworI2VuZGlmICAvLyBfX0FQX0hfXworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NobGlzdC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jaGxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTE1YjlkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jaGxpc3QuaApAQCAtMCwwICsxLDEyOTYgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJY2hsaXN0LmMKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKwktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlGb25jaGkgV3UgICAyMDA3LTEyLTE5ICAgIGNyZWF0ZWQKKyovCisKKyNpZm5kZWYgX19DSExJU1RfSF9fCisjZGVmaW5lIF9fQ0hMSVNUX0hfXworCisjaW5jbHVkZSAicnRtcF90eXBlLmgiCisjaW5jbHVkZSAicnRtcF9kZWYuaCIKKworCisjZGVmaW5lIE9ET1IJCQkwCisjZGVmaW5lIElET1IJCQkxCisjZGVmaW5lIEJPVEgJCQkyCisKKyNkZWZpbmUgQkFORF81RyAgICAgICAgIDAKKyNkZWZpbmUgQkFORF8yNEcgICAgICAgIDEKKyNkZWZpbmUgQkFORF9CT1RIICAgICAgIDIKKwordHlwZWRlZiBzdHJ1Y3QgX0NIX0RFU1AgeworCVVDSEFSIEZpcnN0Q2hhbm5lbDsKKwlVQ0hBUiBOdW1PZkNoOworCUNIQVIgTWF4VHhQd3I7CQkJLy8gZEJtCisJVUNIQVIgR2VvZ3JhcGh5OwkJCS8vIDA6b3V0IGRvb3IsIDE6aW4gZG9vciwgMjpib3RoCisJQk9PTEVBTiBEZnNSZXE7CQkJLy8gRGZzIHJlcXVpcmUsIDA6IE5vLCAxOiB5ZXMuCit9IENIX0RFU1AsICpQQ0hfREVTUDsKKwordHlwZWRlZiBzdHJ1Y3QgX0NIX1JFR0lPTiB7CisJVUNIQVIgQ291bnRSZWdbM107CisJVUNIQVIgRGZzVHlwZTsJCQkvLyAwOiBDRSwgMTogRkNDLCAyOiBKQVAsIDM6SkFQX1c1MywgSkFQX1c1NgorCUNIX0RFU1AgQ2hEZXNwWzEwXTsKK30gQ0hfUkVHSU9OLCAqUENIX1JFR0lPTjsKKworc3RhdGljIENIX1JFR0lPTiBDaFJlZ2lvbltdID0KK3sKKwkJewkvLyBBbnRpZ3VhIGFuZCBCZXJidWRhCisJCQkiQUciLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBBcmdlbnRpbmEKKwkJCSJBUiIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDE0OSwgNCwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBBcnViYQorCQkJIkFXIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQXVzdHJhbGlhCisJCQkiQVUiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDE0OSwgNSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBBdXN0cmlhCisJCQkiQVQiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIElET1IsIFRSVUV9LAkJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyMywgSURPUiwgVFJVRX0sCQkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfSwJCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBCYWhhbWFzCisJCQkiQlMiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDE0OSwgNSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBCYXJiYWRvcworCQkJIkJCIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQmVybXVkYQorCQkJIkJNIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQnJhemlsCisJCQkiQlIiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAxNDksIDUsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQmVsZ2l1bQorCQkJIkJFIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDE4LCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMTgsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBCdWxnYXJpYQorCQkJIkJHIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsIDMwLCBPRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIENhbmFkYQorCQkJIkNBIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxNDksIDUsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQ2F5bWFuIElzTGFuZHMKKwkJCSJLWSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIENoaWxlCisJCQkiQ0wiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDE0OSwgNSwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBDaGluYQorCQkJIkNOIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDE0OSwgNCwgIDI3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBDb2xvbWJpYQorCQkJIkNPIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDE3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMTQ5LCA1LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIENvc3RhIFJpY2EKKwkJCSJDUiIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAxNywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCA0LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEN5cHJ1cworCQkJIkNZIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMjQsIElET1IsIFRSVUV9LAkJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAzMCwgQk9USCwgVFJVRX0sCQkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gQ3plY2hfUmVwdWJsaWMKKwkJCSJDWiIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gRGVubWFyaworCQkJIkRLIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgMjMsIElET1IsIFRSVUV9LAkJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAzMCwgQk9USCwgVFJVRX0sCQkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gRG9taW5pY2FuIFJlcHVibGljCisJCQkiRE8iLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDAsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMAorCQkJCXsgMTQ5LCA0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEVxdWFkb3IKKwkJCSJFQyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMTAwLCAxMSwgIDI3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBFbCBTYWx2YWRvcgorCQkJIlNWIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDE0OSwgNCwgICAzNiwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxNDl+MTY1CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBGaW5sYW5kCisJCQkiRkkiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEZyYW5jZQorCQkJIkZSIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEdlcm1hbnkKKwkJCSJERSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICA0LCAgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gR3JlZWNlCisJCQkiR1IiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBPRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEd1YW0KKwkJCSJHVSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTEsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQorCQkJCXsgMzYsICA0LCAgIDE3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICA0LCAgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAxNDksICA1LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEd1YXRlbWFsYQorCQkJIkdUIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgIDQsICAgMTcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgIDQsICAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxNDksICA0LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEhhaXRpCisJCQkiSFQiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgNCwgICAxNywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgNCwgICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDE0OSwgIDQsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gSG9uZHVyYXMKKwkJCSJITiIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMTQ5LCAgNCwgIDI3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBIb25nIEtvbmcKKwkJCSJISyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCAgNCwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBIdW5nYXJ5CisJCQkiSFUiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gSWNlbGFuZAorCQkJIklTIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBJbmRpYQorCQkJIklOIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAxNDksIAk0LCAgMjQsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEluZG9uZXNpYQorCQkJIklEIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAxNDksIAk0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIElyZWxhbmQKKwkJCSJJRSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgCTQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBPRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIElzcmFlbAorCQkJIklMIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAgMywgIDIwLCBJRE9SLCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjMKKwkJCQl7IDQsIAk2LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDR+OQorCQkJCXsgMTAsIAk0LCAgMjAsIElET1IsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDEwfjEzCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBJdGFseQorCQkJIklUIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAJNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIE9ET1IsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gSmFwYW4KKwkJCSJKUCIsCisJCQlKQVAsCisJCQl7CisJCQkJeyAxLCAgIDE0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTQKKwkJCQl7IDM2LCAJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gSm9yZGFuCisJCQkiSk8iLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIElET1IsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgMTQ5LCAJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBMYXR2aWEKKwkJCSJMViIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgCTQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIExpZWNodGVuc3RlaW4KKwkJCSJMSSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgNTIsIAk0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBMaXRodWFuaWEKKwkJCSJMVCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgCTQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIEx1eGVtYnVyZworCQkJIkxVIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAJNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gTWFsYXlzaWEKKwkJCSJNWSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDM2LCAJNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsIAk0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxNDksICA1LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIE1hbHRhCisJCQkiTVQiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsIAk0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBNYXJvY2NvCisJCQkiTUEiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAJNCwgIDI0LCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gTWV4aWNvCisJCQkiTVgiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAJNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsIAk0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxNDksICA1LCAgMzAsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIE5ldGhlcmxhbmRzCisJCQkiTkwiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsIAk0LCAgMjQsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBOZXcgWmVhbGFuZAorCQkJIk5aIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgCTQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAJNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCAgNCwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBOb3J3YXkKKwkJCSJOTyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsIAk0LCAgMjQsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgCTQsICAyNCwgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFBlcnUKKwkJCSJQRSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMTQ5LCAgNCwgIDI3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBQb3J0dWdhbAorCQkJIlBUIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBQb2xhbmQKKwkJCSJQTCIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gUm9tYW5pYQorCQkJIlJPIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBSdXNzaWEKKwkJCSJSVSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMTQ5LCAgNCwgIDIwLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBTYXVkaSBBcmFiaWEKKwkJCSJTQSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTQ5LCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBTZXJiaWFfYW5kX01vbnRlbmVncm8KKwkJCSJDUyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gU2luZ2Fwb3JlCisJCQkiU0ciLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDE0OSwgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gU2xvdmFraWEKKwkJCSJTSyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gU2xvdmVuaWEKKwkJCSJTSSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBTb3V0aCBBZnJpY2EKKwkJCSJaQSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDE0OSwgIDQsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gU291dGggS29yZWEKKwkJCSJLUiIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMworCQkJCXsgMzYsICAgNCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAorCQkJCXsgNTIsICAgNCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAgOCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTI4CisJCQkJeyAxNDksICA0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFNwYWluCisJCQkiRVMiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKKwkJCQl7IDM2LCAgIDQsICAxNywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFN3ZWRlbgorCQkJIlNFIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBTd2l0emVybGFuZAorCQkJIkNIIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCisJCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggMzZ+NDgKKwkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorCisJCXsJLy8gVGFpd2FuCisJCQkiVFciLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDExLCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKKwkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFR1cmtleQorCQkJIlRSIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCisJCQkJeyAzNiwgICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4CisJCQkJeyA1MiwgICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBVSworCQkJIkdCIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCisJCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKKwkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBVa3JhaW5lCisJCQkiVUEiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFVuaXRlZF9BcmFiX0VtaXJhdGVzCisJCQkiQUUiLAorCQkJQ0UsCisJCQl7CisJCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKKwkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKKwkJCX0KKwkJfSwKKworCQl7CS8vIFVuaXRlZF9TdGF0ZXMKKwkJCSJVUyIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTEsICAzMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQorCQkJCXsgMzYsICAgNCwgIDE3LCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAorCQkJCXsgNTIsICAgNCwgIDI0LCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAorCQkJCXsgMTQ5LCAgNSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1CisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBWZW5lenVlbGEKKwkJCSJWRSIsCisJCQlDRSwKKwkJCXsKKwkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQorCQkJCXsgMTQ5LCAgNCwgIDI3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCisJCQkJeyAwfSwJCQkJCQkJLy8gZW5kCisJCQl9CisJCX0sCisKKwkJewkvLyBEZWZhdWx0CisJCQkiIiwKKwkJCUNFLAorCQkJeworCQkJCXsgMSwgICAxMSwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCisJCQkJeyAzNiwgICA0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyA1MiwgICA0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0CisJCQkJeyAxMDAsIDExLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKKwkJCQl7IDE0OSwgIDUsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQorCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAorCQkJfQorCQl9LAorfTsKKworc3RhdGljIGlubGluZSBQQ0hfUkVHSU9OIEdldENoUmVnaW9uKAorCUlOIFBVQ0hBUiBDbnRyeUNvZGUpCit7CisJSU5UIGxvb3AgPSAwOworCVBDSF9SRUdJT04gcENoUmVnaW9uID0gTlVMTDsKKworCXdoaWxlIChzdHJjbXAoQ2hSZWdpb25bbG9vcF0uQ291bnRSZWcsICIiKSAhPSAwKQorCXsKKwkJaWYgKHN0cm5jbXAoQ2hSZWdpb25bbG9vcF0uQ291bnRSZWcsIENudHJ5Q29kZSwgMikgPT0gMCkKKwkJeworCQkJcENoUmVnaW9uID0gJkNoUmVnaW9uW2xvb3BdOworCQkJYnJlYWs7CisJCX0KKwkJbG9vcCsrOworCX0KKworCWlmIChwQ2hSZWdpb24gPT0gTlVMTCkKKwkJcENoUmVnaW9uID0gJkNoUmVnaW9uW2xvb3BdOworCXJldHVybiBwQ2hSZWdpb247Cit9CisKK3N0YXRpYyBpbmxpbmUgVk9JRCBDaEJhbmRDaGVjaygKKwlJTiBVQ0hBUiBQaHlNb2RlLAorCU9VVCBQVUNIQVIgcENoVHlwZSkKK3sKKwlzd2l0Y2goUGh5TW9kZSkKKwl7CisJCWNhc2UgUEhZXzExQToKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJY2FzZSBQSFlfMTFBTl9NSVhFRDoKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCSpwQ2hUeXBlID0gQkFORF81RzsKKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMUFCR19NSVhFRDoKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJY2FzZSBQSFlfMTFBR05fTUlYRUQ6CisJCWNhc2UgUEhZXzExQUJHTl9NSVhFRDoKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCSpwQ2hUeXBlID0gQkFORF9CT1RIOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCSpwQ2hUeXBlID0gQkFORF8yNEc7CisJCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgVUNIQVIgRmlsbENoTGlzdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQQ0hfREVTUCBwQ2hEZXNwLAorCUlOIFVDSEFSIE9mZnNldCwKKwlJTiBVQ0hBUiBpbmNyZW1lbnQpCit7CisJSU5UIGksIGosIGw7CisJVUNIQVIgY2hhbm5lbDsKKworCWogPSBPZmZzZXQ7CisJZm9yIChpID0gMDsgaSA8IHBDaERlc3AtPk51bU9mQ2g7IGkrKykKKwl7CisJCWNoYW5uZWwgPSBwQ2hEZXNwLT5GaXJzdENoYW5uZWwgKyBpICogaW5jcmVtZW50OworCQlmb3IgKGw9MDsgbDxNQVhfTlVNX09GX0NIQU5ORUxTOyBsKyspCisJCXsKKwkJCWlmIChjaGFubmVsID09IHBBZC0+VHhQb3dlcltsXS5DaGFubmVsKQorCQkJeworCQkJCXBBZC0+Q2hhbm5lbExpc3Rbal0uUG93ZXIgPSBwQWQtPlR4UG93ZXJbbF0uUG93ZXI7CisJCQkJcEFkLT5DaGFubmVsTGlzdFtqXS5Qb3dlcjIgPSBwQWQtPlR4UG93ZXJbbF0uUG93ZXIyOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChsID09IE1BWF9OVU1fT0ZfQ0hBTk5FTFMpCisJCQljb250aW51ZTsKKworCQlwQWQtPkNoYW5uZWxMaXN0W2pdLkNoYW5uZWwgPSBwQ2hEZXNwLT5GaXJzdENoYW5uZWwgKyBpICogaW5jcmVtZW50OworCQlwQWQtPkNoYW5uZWxMaXN0W2pdLk1heFR4UHdyID0gcENoRGVzcC0+TWF4VHhQd3I7CisJCXBBZC0+Q2hhbm5lbExpc3Rbal0uRGZzUmVxID0gcENoRGVzcC0+RGZzUmVxOworCQlqKys7CisJfQorCXBBZC0+Q2hhbm5lbExpc3ROdW0gPSBqOworCisJcmV0dXJuIGo7Cit9CisKK3N0YXRpYyBpbmxpbmUgVk9JRCBDcmVhdGVDaExpc3QoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUENIX1JFR0lPTiBwQ2hSZWdpb24sCisJSU4gVUNIQVIgR2VvZ3JhcGh5KQoreworCUlOVCBpOworCVVDSEFSIG9mZnNldCA9IDA7CisJUENIX0RFU1AgcENoRGVzcDsKKwlVQ0hBUiBDaFR5cGU7CisJVUNIQVIgaW5jcmVtZW50OworCisJaWYgKHBDaFJlZ2lvbiA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlDaEJhbmRDaGVjayhwQWQtPkNvbW1vbkNmZy5QaHlNb2RlLCAmQ2hUeXBlKTsKKworCWZvciAoaT0wOyBpPDEwOyBpKyspCisJeworCQlwQ2hEZXNwID0gJnBDaFJlZ2lvbi0+Q2hEZXNwW2ldOworCQlpZiAocENoRGVzcC0+Rmlyc3RDaGFubmVsID09IDApCisJCQlicmVhazsKKworCQlpZiAoQ2hUeXBlID09IEJBTkRfNUcpCisJCXsKKwkJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPD0gMTQpCisJCQkJY29udGludWU7CisJCX0KKwkJZWxzZSBpZiAoQ2hUeXBlID09IEJBTkRfMjRHKQorCQl7CisJCQlpZiAocENoRGVzcC0+Rmlyc3RDaGFubmVsID4gMTQpCisJCQkJY29udGludWU7CisJCX0KKworCQlpZiAoKHBDaERlc3AtPkdlb2dyYXBoeSA9PSBCT1RIKQorCQkJfHwgKHBDaERlc3AtPkdlb2dyYXBoeSA9PSBHZW9ncmFwaHkpKQorICAgICAgICB7CisJCQlpZiAocENoRGVzcC0+Rmlyc3RDaGFubmVsID4gMTQpCisgICAgICAgICAgICAgICAgaW5jcmVtZW50ID0gNDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpbmNyZW1lbnQgPSAxOworCQkJb2Zmc2V0ID0gRmlsbENoTGlzdChwQWQsIHBDaERlc3AsIG9mZnNldCwgaW5jcmVtZW50KTsKKyAgICAgICAgfQorCX0KK30KKworc3RhdGljIGlubGluZSBWT0lEIEJ1aWxkQ2hhbm5lbExpc3RFeCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlQQ0hfUkVHSU9OIHBDaFJlZzsKKworCXBDaFJlZyA9IEdldENoUmVnaW9uKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlKTsKKwlDcmVhdGVDaExpc3QocEFkLCBwQ2hSZWcsIHBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgVk9JRCBCdWlsZEJlYWNvbkNoTGlzdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlPVVQgUFVDSEFSIHBCdWYsCisJT1VUCVBVTE9ORyBwQnVmTGVuKQoreworCUlOVCBpOworCVVMT05HIFRtcExlbjsKKwlQQ0hfUkVHSU9OIHBDaFJlZ2lvbjsKKwlQQ0hfREVTUCBwQ2hEZXNwOworCVVDSEFSIENoVHlwZTsKKworCXBDaFJlZ2lvbiA9IEdldENoUmVnaW9uKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlKTsKKworCWlmIChwQ2hSZWdpb24gPT0gTlVMTCkKKwkJcmV0dXJuOworCisJQ2hCYW5kQ2hlY2socEFkLT5Db21tb25DZmcuUGh5TW9kZSwgJkNoVHlwZSk7CisJKnBCdWZMZW4gPSAwOworCisJZm9yIChpPTA7IGk8MTA7IGkrKykKKwl7CisJCXBDaERlc3AgPSAmcENoUmVnaW9uLT5DaERlc3BbaV07CisJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPT0gMCkKKwkJCWJyZWFrOworCisJCWlmIChDaFR5cGUgPT0gQkFORF81RykKKwkJeworCQkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA8PSAxNCkKKwkJCQljb250aW51ZTsKKwkJfQorCQllbHNlIGlmIChDaFR5cGUgPT0gQkFORF8yNEcpCisJCXsKKwkJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPiAxNCkKKwkJCQljb250aW51ZTsKKwkJfQorCisJCWlmICgocENoRGVzcC0+R2VvZ3JhcGh5ID09IEJPVEgpCisJCQl8fCAocENoRGVzcC0+R2VvZ3JhcGh5ID09IHBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSkpCisJCXsKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBCdWYgKyAqcEJ1ZkxlbiwJCSZUbXBMZW4sCisJCQkJCQkJCTEsICAgICAgICAgICAgICAgICAJJnBDaERlc3AtPkZpcnN0Q2hhbm5lbCwKKwkJCQkJCQkJMSwgICAgICAgICAgICAgICAgIAkmcENoRGVzcC0+TnVtT2ZDaCwKKwkJCQkJCQkJMSwgICAgICAgICAgICAgICAgIAkmcENoRGVzcC0+TWF4VHhQd3IsCisJCQkJCQkJCUVORF9PRl9BUkdTKTsKKwkJCSpwQnVmTGVuICs9IFRtcExlbjsKKwkJfQorCX0KK30KKworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitzdGF0aWMgaW5saW5lIEJPT0xFQU4gSXNWYWxpZENoYW5uZWwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgY2hhbm5lbCkKKworeworCUlOVCBpOworCisJZm9yIChpID0gMDsgaSA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGkrKykKKwl7CisJCWlmIChwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwgPT0gY2hhbm5lbCkKKwkJCWJyZWFrOworCX0KKworCWlmIChpID09IHBBZC0+Q2hhbm5lbExpc3ROdW0pCisJCXJldHVybiBGQUxTRTsKKwllbHNlCisJCXJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyBpbmxpbmUgVUNIQVIgR2V0RXh0Q2goCisJSU4gVUNIQVIgQ2hhbm5lbCwKKwlJTiBVQ0hBUiBEaXJlY3Rpb24pCit7CisJQ0hBUiBFeHRDaDsKKworCWlmIChEaXJlY3Rpb24gPT0gRVhUQ0hBX0FCT1ZFKQorCQlFeHRDaCA9IENoYW5uZWwgKyA0OworCWVsc2UKKwkJRXh0Q2ggPSAoQ2hhbm5lbCAtIDQpID4gMCA/IChDaGFubmVsIC0gNCkgOiAwOworCisJcmV0dXJuIEV4dENoOworfQorCisKK3N0YXRpYyBpbmxpbmUgVk9JRCBOX0NoYW5uZWxDaGVjaygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwkvL1VDSEFSIENoYW5uZWxOdW0gPSBwQWQtPkNoYW5uZWxMaXN0TnVtOworCVVDSEFSIENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCisJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpICYmIChwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgID09IEJXXzQwKSkKKwl7CisJCWlmIChDaGFubmVsID4gMTQpCisJCXsKKwkJCWlmICgoQ2hhbm5lbCA9PSAzNikgfHwgKENoYW5uZWwgPT0gNDQpIHx8IChDaGFubmVsID09IDUyKSB8fCAoQ2hhbm5lbCA9PSA2MCkgfHwgKENoYW5uZWwgPT0gMTAwKSB8fCAoQ2hhbm5lbCA9PSAxMDgpIHx8CisJCQkgICAgKENoYW5uZWwgPT0gMTE2KSB8fCAoQ2hhbm5lbCA9PSAxMjQpIHx8IChDaGFubmVsID09IDEzMikgfHwgKENoYW5uZWwgPT0gMTQ5KSB8fCAoQ2hhbm5lbCA9PSAxNTcpKQorCQkJeworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfQUJPVkU7CisJCQl9CisJCQllbHNlIGlmICgoQ2hhbm5lbCA9PSA0MCkgfHwgKENoYW5uZWwgPT0gNDgpIHx8IChDaGFubmVsID09IDU2KSB8fCAoQ2hhbm5lbCA9PSA2NCkgfHwgKENoYW5uZWwgPT0gMTA0KSB8fCAoQ2hhbm5lbCA9PSAxMTIpIHx8CisJCQkJCShDaGFubmVsID09IDEyMCkgfHwgKENoYW5uZWwgPT0gMTI4KSB8fCAoQ2hhbm5lbCA9PSAxMzYpIHx8IChDaGFubmVsID09IDE1MykgfHwgKENoYW5uZWwgPT0gMTYxKSkKKwkJCXsKKwkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRVhUQ0hBX0JFTE9XOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPSBCV18yMDsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWRvCisJCQl7CisJCQkJVUNIQVIgRXh0Q2g7CisJCQkJVUNIQVIgRGlyID0gcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQTsKKwkJCQlFeHRDaCA9IEdldEV4dENoKENoYW5uZWwsIERpcik7CisJCQkJaWYgKElzVmFsaWRDaGFubmVsKHBBZCwgRXh0Q2gpKQorCQkJCQlicmVhazsKKworCQkJCURpciA9IChEaXIgPT0gRVhUQ0hBX0FCT1ZFKSA/IEVYVENIQV9CRUxPVyA6IEVYVENIQV9BQk9WRTsKKwkJCQlFeHRDaCA9IEdldEV4dENoKENoYW5uZWwsIERpcik7CisJCQkJaWYgKElzVmFsaWRDaGFubmVsKHBBZCwgRXh0Q2gpKQorCQkJCXsKKwkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IERpcjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPSBCV18yMDsKKwkJCX0gd2hpbGUoRkFMU0UpOworCisJCQlpZiAoQ2hhbm5lbCA9PSAxNCkKKwkJCXsKKwkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgID0gQldfMjA7CisJCQkJLy9wQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRVhUQ0hBX05PTkU7CS8vIFdlIGRpZG4ndCBzZXQgdGhlIEV4dENoIGFzIE5PTkUgZHVlIHRvIGl0J2xsIHNldCBpbiBSVE1QU2V0SFQoKQorCQkJfQorI2lmIDAKKwkJCXN3aXRjaCAocEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiAgJiAweDdmKQorCQkJeworCQkJCWNhc2UgUkVHSU9OXzBfQkdfQkFORDoJLy8gMSAtMTEKKwkJCQljYXNlIFJFR0lPTl8xX0JHX0JBTkQ6CS8vIDEgLSAxMworCQkJCWNhc2UgUkVHSU9OXzVfQkdfQkFORDoJLy8gMSAtIDE0CisJCQkJCWlmIChDaGFubmVsIDw9IDQpCisJCQkJCXsKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfQUJPVkU7CisJCQkJCX0KKwkJCQkJZWxzZSBpZiAoQ2hhbm5lbCA+PSA4KQorCQkJCQl7CisJCQkJCQlpZiAoKENoYW5uZWxOdW0gLSBDaGFubmVsKSA8IDQpCisJCQkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9CRUxPVzsKKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCWNhc2UgUkVHSU9OXzJfQkdfQkFORDoJLy8gMTAgLSAxMQorCQkJCWNhc2UgUkVHSU9OXzNfQkdfQkFORDoJLy8gMTAgLSAxMworCQkJCWNhc2UgUkVHSU9OXzRfQkdfQkFORDoJLy8gMTQKKwkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzIwOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgUkVHSU9OXzZfQkdfQkFORDoJLy8gMyAtIDkKKwkJCQkJaWYgKENoYW5uZWwgPD0gNSkKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfQUJPVkU7CisJCQkJCWVsc2UgaWYgKENoYW5uZWwgPT0gNikKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPSBCV18yMDsKKwkJCQkJZWxzZSBpZiAoQ2hhbm5lbCA+PSA3KQorCQkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9CRUxPVzsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIFJFR0lPTl83X0JHX0JBTkQ6ICAvLyA1IC0gMTMKKwkJCQkJaWYgKENoYW5uZWwgPD0gOCkKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfQUJPVkU7CisJCQkJCWVsc2UgaWYgKENoYW5uZWwgPj0gMTApCisJCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRVhUQ0hBX0JFTE9XOworCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CS8vIEVycm9yLiBzaG91bGQgbmV2ZXIgaGFwcGVuCisJCQkJCWJyZWFrOworCQkJfQorI2VuZGlmCisJCX0KKwl9CisKKworfQorCisKK3N0YXRpYyBpbmxpbmUgVk9JRCBOX1NldENlbkNoKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCWlmIChwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDApCisJeworCQlpZiAocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9PSBFWFRDSEFfQUJPVkUpCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCArIDI7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9PSAxNCkKKwkJCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgLSAxOworCQkJZWxzZQorCQkJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCAtIDI7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCX0KK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCitzdGF0aWMgaW5saW5lIFVJTlQ4IEdldEN1bnRyeU1heFR4UHdyKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVJTlQ4IGNoYW5uZWwpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGkrKykKKwl7CisJCWlmIChwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwgPT0gY2hhbm5lbCkKKwkJCWJyZWFrOworCX0KKworCWlmIChpID09IHBBZC0+Q2hhbm5lbExpc3ROdW0pCisJCXJldHVybiAweGZmOworCWVsc2UKKwkJcmV0dXJuIHBBZC0+Q2hhbm5lbExpc3RbaV0uTWF4VHhQd3I7Cit9CisjZW5kaWYgLy8gX19DSExJU1RfSF9fCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uLzI4NzBfcnRtcF9pbml0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi8yODcwX3J0bXBfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNTE0M2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi8yODcwX3J0bXBfaW5pdC5jCkBAIC0wLDAgKzEsMTc3OCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwkyODcwX3J0bXBfaW5pdC5jCisKKwlBYnN0cmFjdDoKKwlNaW5pcG9ydCBnZW5lcmljIHBvcnRpb24gaGVhZGVyIGZpbGUKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisJLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJUGF1bCBMaW4gICAgMjAwMi0wOC0wMSAgICBjcmVhdGVkCisgICAgSm9obiBDaGFuZyAgMjAwNC0wOC0yMCAgICBSVDI1NjEvMjY2MSB1c2Ugc2NhdHRlci1nYXRoZXIgc2NoZW1lCisgICAgSmFuIExlZSAgCTIwMDYtMDktMTUgICAgUlQyODYwLiBDaGFuZ2UgZm9yIDgwMi4xMW4gLCBFRVBST00sIExlZCwgQkEsIEhULgorCVNhbXBsZSBMaW4JMjAwNy0wNS0zMSAgICBNZXJnZSBSVDI4NjAgYW5kIFJUMjg3MCBkcml2ZXJzLgorKi8KKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisKK3N0YXRpYyB2b2lkIHJ4X2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgcnQyODcwX2hjY2FfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgcnQyODcwX2FjM19kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBydDI4NzBfYWMyX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIHJ0Mjg3MF9hYzFfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgcnQyODcwX2FjMF9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBydDI4NzBfbWdtdF9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBydDI4NzBfbnVsbF9mcmFtZV9jb21wbGV0ZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBydDI4NzBfcnRzX2ZyYW1lX2NvbXBsZXRlX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIHJ0Mjg3MF9wc3BvbGxfZnJhbWVfY29tcGxldGVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgcnQyODcwX2RhdGFvdXRfY29tcGxldGVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgSW5pdGlhbGl6ZSByZWNlaXZlIGRhdGEgc3RydWN0dXJlcy4KKworQXJndW1lbnRzOgorICAgIHBBZAkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCitSZXR1cm4gVmFsdWU6CisJTkRJU19TVEFUVVNfU1VDQ0VTUworCU5ESVNfU1RBVFVTX1JFU09VUkNFUworCitOb3RlOgorCUluaXRpYWxpemUgYWxsIHJlY2VpdmUgcmVsZWF0ZWQgcHJpdmF0ZSBidWZmZXIsIGluY2x1ZGUgdGhvc2UgZGVmaW5lCisJaW4gUlRNUF9BREFQVEVSIHN0cnVjdHVyZSBhbmQgYWxsIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmVzLiBUaGUgbWFob3IKKwl3b3JrIGlzIHRvIGFsbG9jYXRlIGJ1ZmZlciBmb3IgZWFjaCBwYWNrZXQgYW5kIGNoYWluIGJ1ZmZlciB0bworCU5ESVMgcGFja2V0IGRlc2NyaXB0b3IuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUwlOSUNJbml0UmVjdigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlVQ0hBUgkJCQlpOworCU5ESVNfU1RBVFVTCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlQT1NfQ09PS0lFCQkJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IE5JQ0luaXRSZWN2XG4iKSk7CisJcE9iaiA9IHBPYmo7CisKKwkvL0ludGVybG9ja2VkRXhjaGFuZ2UoJnBBZC0+UGVuZGluZ1J4LCAwKTsKKwlwQWQtPlBlbmRpbmdSeCA9IDA7CisJcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXggCT0gMDsJLy8gTmV4dCBSeCBSZWFkIGluZGV4CisJcEFkLT5OZXh0UnhCdWxrSW5JbmRleAkJPSAwIDsgLy9SWF9SSU5HX1NJWkUgLTE7IC8vIFJ4IEJ1bGsgcG9pbnRlcgorCXBBZC0+TmV4dFJ4QnVsa0luUG9zaXRpb24gCT0gMDsKKworCWZvciAoaSA9IDA7IGkgPCAoUlhfUklOR19TSVpFKTsgaSsrKQorCXsKKwkJUFJYX0NPTlRFWFQgIHBSeENvbnRleHQgPSAmKHBBZC0+UnhDb250ZXh0W2ldKTsKKworCQkvL0FsbG9jYXRlIFVSQgorCQlwUnhDb250ZXh0LT5wVXJiID0gUlRVU0JfQUxMT0NfVVJCKDApOworCQlpZiAocFJ4Q29udGV4dC0+cFVyYiA9PSBOVUxMKQorCQl7CisJCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7CisJCQlnb3RvIG91dDE7CisJCX0KKworCQkvLyBBbGxvY2F0ZSB0cmFuc2ZlciBidWZmZXIKKwkJcFJ4Q29udGV4dC0+VHJhbnNmZXJCdWZmZXIgPSBSVFVTQl9VUkJfQUxMT0NfQlVGRkVSKHBPYmotPnBVc2JfRGV2LCBNQVhfUlhCVUxLX1NJWkUsICZwUnhDb250ZXh0LT5kYXRhX2RtYSk7CisJCWlmIChwUnhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciA9PSBOVUxMKQorCQl7CisJCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7CisJCQlnb3RvIG91dDE7CisJCX0KKworCQlOZGlzWmVyb01lbW9yeShwUnhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciwgTUFYX1JYQlVMS19TSVpFKTsKKworCQlwUnhDb250ZXh0LT5wQWQJPSBwQWQ7CisJCXBSeENvbnRleHQtPnBJcnAgPSBOVUxMOworCQlwUnhDb250ZXh0LT5JblVzZQkJPSBGQUxTRTsKKwkJcFJ4Q29udGV4dC0+SVJQUGVuZGluZwk9IEZBTFNFOworCQlwUnhDb250ZXh0LT5SZWFkYWJsZQk9IEZBTFNFOworCQkvL3BSeENvbnRleHQtPlJlb3JkZXJJblVzZSA9IEZBTFNFOworCQlwUnhDb250ZXh0LT5iUnhIYW5kbGluZyA9IEZBTFNFOworCQlwUnhDb250ZXh0LT5CdWxrSW5PZmZzZXQgPSAwOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBOSUNJbml0UmVjdlxuIikpOworCXJldHVybiBTdGF0dXM7CisKK291dDE6CisJZm9yIChpID0gMDsgaSA8IChSWF9SSU5HX1NJWkUpOyBpKyspCisJeworCQlQUlhfQ09OVEVYVCAgcFJ4Q29udGV4dCA9ICYocEFkLT5SeENvbnRleHRbaV0pOworCisJCWlmIChOVUxMICE9IHBSeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyKQorCQl7CisJCQlSVFVTQl9VUkJfRlJFRV9CVUZGRVIocE9iai0+cFVzYl9EZXYsIE1BWF9SWEJVTEtfU0laRSwKKwkJCQkJCQkJcFJ4Q29udGV4dC0+VHJhbnNmZXJCdWZmZXIsIHBSeENvbnRleHQtPmRhdGFfZG1hKTsKKwkJCXBSeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyID0gTlVMTDsKKwkJfQorCisJCWlmIChOVUxMICE9IHBSeENvbnRleHQtPnBVcmIpCisJCXsKKwkJCVJUVVNCX1VOTElOS19VUkIocFJ4Q29udGV4dC0+cFVyYik7CisJCQlSVFVTQl9GUkVFX1VSQihwUnhDb250ZXh0LT5wVXJiKTsKKwkJCXBSeENvbnRleHQtPnBVcmIgPSBOVUxMOworCQl9CisJfQorCisJcmV0dXJuIFN0YXR1czsKK30KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIEluaXRpYWxpemUgdHJhbnNtaXQgZGF0YSBzdHJ1Y3R1cmVzLgorCitBcmd1bWVudHM6CisgICAgcEFkCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKK1JldHVybiBWYWx1ZToKKwlORElTX1NUQVRVU19TVUNDRVNTCisJTkRJU19TVEFUVVNfUkVTT1VSQ0VTCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUwlOSUNJbml0VHJhbnNtaXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisjZGVmaW5lIExNX1VTQl9BTExPQyhwT2JqLCBDb250ZXh0LCBUQl9UeXBlLCBCdWZmZXJTaXplLCBTdGF0dXMsIG1zZzEsIGVycjEsIG1zZzIsIGVycjIpCVwKKwlDb250ZXh0LT5wVXJiID0gUlRVU0JfQUxMT0NfVVJCKDApOwkJXAorCWlmIChDb250ZXh0LT5wVXJiID09IE5VTEwpIHsJCQlcCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCBtc2cxKTsJCVwKKwkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOwkJXAorCQlnb3RvIGVycjE7IH0JCQkJCQlcCisJCQkJCQkJCQkJCVwKKwlDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciA9IAkJCQlcCisJCShUQl9UeXBlKVJUVVNCX1VSQl9BTExPQ19CVUZGRVIocE9iai0+cFVzYl9EZXYsIEJ1ZmZlclNpemUsICZDb250ZXh0LT5kYXRhX2RtYSk7CVwKKwlpZiAoQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIgPT0gTlVMTCkgewlcCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCBtc2cyKTsJCVwKKwkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOwkJXAorCQlnb3RvIGVycjI7IH0KKworI2RlZmluZSBMTV9VUkJfRlJFRShwT2JqLCBDb250ZXh0LCBCdWZmZXJTaXplKQkJCQlcCisJaWYgKE5VTEwgIT0gQ29udGV4dC0+cFVyYikgewkJCQkJCQlcCisJCVJUVVNCX1VOTElOS19VUkIoQ29udGV4dC0+cFVyYik7CQkJCQlcCisJCVJUVVNCX0ZSRUVfVVJCKENvbnRleHQtPnBVcmIpOwkJCQkJCVwKKwkJQ29udGV4dC0+cFVyYiA9IE5VTEw7IH0JCQkJCQkJCVwKKwlpZiAoTlVMTCAhPSBDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlcikgewkJCQlcCisJCVJUVVNCX1VSQl9GUkVFX0JVRkZFUihwT2JqLT5wVXNiX0RldiwgQnVmZmVyU2l6ZSwJXAorCQkJCQkJCQlDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciwJXAorCQkJCQkJCQlDb250ZXh0LT5kYXRhX2RtYSk7CQkJXAorCQlDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciA9IE5VTEw7IH0KKworCVVDSEFSCQkJaSwgYWNpZHg7CisJTkRJU19TVEFUVVMgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJUFRYX0NPTlRFWFQJCXBOdWxsQ29udGV4dCAgID0gJihwQWQtPk51bGxDb250ZXh0KTsKKwlQVFhfQ09OVEVYVAkJcFBzUG9sbENvbnRleHQgPSAmKHBBZC0+UHNQb2xsQ29udGV4dCk7CisJUFRYX0NPTlRFWFQJCXBSVFNDb250ZXh0ICAgID0gJihwQWQtPlJUU0NvbnRleHQpOworCVBUWF9DT05URVhUCQlwTUxNRUNvbnRleHQgPSBOVUxMOworLy8JUEhUX1RYX0NPTlRFWFQJcEhUVFhDb250ZXh0ID0gTlVMTDsKKwlQT1NfQ09PS0lFCQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCVBWT0lECQkJUmluZ0Jhc2VWYTsKKy8vCVJUTVBfVFhfUklORwkqcFR4UmluZzsKKwlSVE1QX01HTVRfUklORyAgKnBNZ210UmluZzsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBOSUNJbml0VHJhbnNtaXRcbiIpKTsKKwlwT2JqID0gcE9iajsKKworCS8vIEluaXQgNCBzZXQgb2YgVHggcGFyYW1ldGVycworCWZvcihhY2lkeCA9IDA7IGFjaWR4IDwgTlVNX09GX1RYX1JJTkc7IGFjaWR4KyspCisJeworCQkvLyBJbml0aWFsaXplIGFsbCBUcmFuc21pdCByZWxlYXRlZCBxdWV1ZXMKKwkJSW5pdGlhbGl6ZVF1ZXVlSGVhZGVyKCZwQWQtPlR4U3dRdWV1ZVthY2lkeF0pOworCisJCS8vIE5leHQgTG9jYWwgdHggcmluZyBwb2ludGVyIHdhaXRpbmcgZm9yIGJ1Y2sgb3V0CisJCXBBZC0+TmV4dEJ1bGtPdXRJbmRleFthY2lkeF0gPSBhY2lkeDsKKwkJcEFkLT5CdWxrT3V0UGVuZGluZ1thY2lkeF0gPSBGQUxTRTsgLy8gQnVjayBPdXQgY29udHJvbCBmbGFnCisJCS8vcEFkLT5EYXRhQnVsa0RvbmVJZHhbYWNpZHhdID0gMDsKKwl9CisKKwkvL3BBZC0+TmV4dE1MTUVJbmRleAk9IDA7CisJLy9wQWQtPlB1c2hNZ210SW5kZXgJPSAwOworCS8vcEFkLT5Qb3BNZ210SW5kZXgJPSAwOworCS8vSW50ZXJsb2NrZWRFeGNoYW5nZSgmcEFkLT5NZ210UXVldWVTaXplLCAwKTsKKwkvL0ludGVybG9ja2VkRXhjaGFuZ2UoJnBBZC0+VHhDb3VudCwgMCk7CisKKwkvL3BBZC0+UHJpb1JpbmdGaXJzdEluZGV4CT0gMDsKKwkvL3BBZC0+UHJpb1JpbmdUeENudAkJPSAwOworCisJZG8KKwl7CisJCS8vCisJCS8vIFRYX1JJTkdfU0laRSwgNCBBQ3MKKwkJLy8KKwkJZm9yKGFjaWR4PTA7IGFjaWR4PDQ7IGFjaWR4KyspCisJCXsKKwkJCVBIVF9UWF9DT05URVhUCXBIVFRYQ29udGV4dCA9ICYocEFkLT5UeENvbnRleHRbYWNpZHhdKTsKKworCQkJTmRpc1plcm9NZW1vcnkocEhUVFhDb250ZXh0LCBzaXplb2YoSFRfVFhfQ09OVEVYVCkpOworCQkJLy9BbGxvY2F0ZSBVUkIKKwkJCUxNX1VTQl9BTExPQyhwT2JqLCBwSFRUWENvbnRleHQsIFBIVFRYX0JVRkZFUiwgc2l6ZW9mKEhUVFhfQlVGRkVSKSwgU3RhdHVzLAorCQkJCQkJCSgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIFR4Q29udGV4dFslZF0gdXJiISEgXG4iLCBhY2lkeCksCisJCQkJCQkJZG9uZSwKKwkJCQkJCQkoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBUeENvbnRleHRbJWRdIEhUVFhfQlVGRkVSICEhIFxuIiwgYWNpZHgpLAorCQkJCQkJCW91dDEpOworCisJCQlOZGlzWmVyb01lbW9yeShwSFRUWENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5BZ2dyZWdhdGlvbiwgNCk7CisJCQlwSFRUWENvbnRleHQtPnBBZCA9IHBBZDsKKwkJCXBIVFRYQ29udGV4dC0+cElycCA9IE5VTEw7CisJCQlwSFRUWENvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwkJCXBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiA9IDA7CisJCQlwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID0gMDsKKwkJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA9IDA7CisJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcyA9IDA7CisJCQlwSFRUWENvbnRleHQtPkJ1bGtPdXRTaXplID0gMDsKKwkJCXBIVFRYQ29udGV4dC0+QnVsa091dFBpcGVJZCA9IGFjaWR4OworCQkJcEhUVFhDb250ZXh0LT5iUmluZ0VtcHR5ID0gVFJVRTsKKwkJCXBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkID0gRkFMU0U7CisKKwkJCXBBZC0+QnVsa091dFBlbmRpbmdbYWNpZHhdID0gRkFMU0U7CisJCX0KKworCisJCS8vCisJCS8vIE1HTVRfUklOR19TSVpFCisJCS8vCisjaWYgMAorCQlmb3IoaT0wOyBpPE1HTVRfUklOR19TSVpFOyBpKyspIC8vIDgKKwkJeworCQkJUFRYX0NPTlRFWFQJcE1MTUVDb250ZXh0ID0gJihwQWQtPk1MTUVDb250ZXh0W2ldKTsKKworCisJCQlOZGlzWmVyb01lbW9yeShwTUxNRUNvbnRleHQsIHNpemVvZihUWF9DT05URVhUKSk7CisKKwkJCS8vQWxsb2NhdGUgVVJCCisJCQlMTV9VU0JfQUxMT0MocE9iaiwgcE1MTUVDb250ZXh0LCBQVFhfQlVGRkVSLCBzaXplb2YoVFhfQlVGRkVSKSwgU3RhdHVzLAorCQkJCQkJCSgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIE1MTUVDb250ZXh0WyVkXSB1cmIhISBcbiIsIGkpLAorCQkJCQkJCW91dDIsCisJCQkJCQkJKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggTUxNRUNvbnRleHRbJWRdIFRYX0JVRkZFUiAhISBcbiIsIGkpLAorCQkJCQkJCW91dDIpOworCisJCQlwTUxNRUNvbnRleHQtPnBBZCA9IHBBZDsKKwkJCXBNTE1FQ29udGV4dC0+cElycCA9IE5VTEw7CisJCQlwTUxNRUNvbnRleHQtPkluVXNlID0gRkFMU0U7CisJCQlwTUxNRUNvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwkJfQorI2Vsc2UKKwkJLy8gQWxsb2NhdGUgTUdNVCByaW5nIGRlc2NyaXB0b3IncyBtZW1vcnkKKwkJcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplID0gTUdNVF9SSU5HX1NJWkUgKiBzaXplb2YoVFhfQ09OVEVYVCk7CisJCVJUTVBBbGxvY2F0ZU1lbW9yeSgmcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSwgcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplKTsKKwkJaWYgKHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEgPT0gTlVMTCkKKwkJeworCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlciBmb3IgTWdtdERlc2NSaW5nIVxuIikpOworCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOworCQkJZ290byBvdXQxOworCQl9CisJCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEsIHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jU2l6ZSk7CisJCVJpbmdCYXNlVmEgICAgID0gcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYTsKKworCQkvLyBJbml0aWFsaXplIE1HTVQgUmluZyBhbmQgYXNzb2NpYXRlZCBidWZmZXIgbWVtb3J5CisJCXBNZ210UmluZyA9ICZwQWQtPk1nbXRSaW5nOworCQlmb3IgKGkgPSAwOyBpIDwgTUdNVF9SSU5HX1NJWkU7IGkrKykKKwkJeworCQkJLy8gbGluayB0aGUgcHJlLWFsbG9jYXRlZCBNZ210IGJ1ZmZlciB0byBNZ210UmluZy5DZWxsCisJCQlwTWdtdFJpbmctPkNlbGxbaV0uQWxsb2NTaXplID0gc2l6ZW9mKFRYX0NPTlRFWFQpOworCQkJcE1nbXRSaW5nLT5DZWxsW2ldLkFsbG9jVmEgPSBSaW5nQmFzZVZhOworCQkJcE1nbXRSaW5nLT5DZWxsW2ldLnBOZGlzUGFja2V0ID0gTlVMTDsKKwkJCXBNZ210UmluZy0+Q2VsbFtpXS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOworCisJCQkvL0FsbG9jYXRlIFVSQiBmb3IgTUxNRUNvbnRleHQKKwkJCXBNTE1FQ29udGV4dCA9IChQVFhfQ09OVEVYVCkgcEFkLT5NZ210UmluZy5DZWxsW2ldLkFsbG9jVmE7CisJCQlwTUxNRUNvbnRleHQtPnBVcmIgPSBSVFVTQl9BTExPQ19VUkIoMCk7CisJCQlpZiAocE1MTUVDb250ZXh0LT5wVXJiID09IE5VTEwpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIE1MTUVDb250ZXh0WyVkXSB1cmIhISBcbiIsIGkpKTsKKwkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7CisJCQkJZ290byBvdXQyOworCQkJfQorCQkJcE1MTUVDb250ZXh0LT5wQWQgPSBwQWQ7CisJCQlwTUxNRUNvbnRleHQtPnBJcnAgPSBOVUxMOworCQkJcE1MTUVDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciA9IE5VTEw7CisJCQlwTUxNRUNvbnRleHQtPkluVXNlID0gRkFMU0U7CisJCQlwTUxNRUNvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwkJCXBNTE1FQ29udGV4dC0+YldhaXRpbmdCdWxrT3V0ID0gRkFMU0U7CisJCQlwTUxNRUNvbnRleHQtPkJ1bGtPdXRTaXplID0gMDsKKwkJCXBNTE1FQ29udGV4dC0+U2VsZklkeCA9IGk7CisKKwkJCS8vIE9mZnNldCB0byBuZXh0IHJpbmcgZGVzY3JpcHRvciBhZGRyZXNzCisJCQlSaW5nQmFzZVZhID0gKFBVQ0hBUikgUmluZ0Jhc2VWYSArIHNpemVvZihUWF9DT05URVhUKTsKKwkJfQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNR01UIFJpbmc6IHRvdGFsICVkIGVudHJ5IGFsbG9jYXRlZFxuIiwgaSkpOworCisJCS8vcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA9IChNR01UX1JJTkdfU0laRSAtIDEpOworCQlwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ID0gTUdNVF9SSU5HX1NJWkU7CisJCXBBZC0+TWdtdFJpbmcuVHhDcHVJZHggPSAwOworCQlwQWQtPk1nbXRSaW5nLlR4RG1hSWR4ID0gMDsKKyNlbmRpZgorCisJCS8vCisJCS8vIEJFQUNPTl9SSU5HX1NJWkUKKwkJLy8KKwkJZm9yKGk9MDsgaTxCRUFDT05fUklOR19TSVpFOyBpKyspIC8vIDIKKwkJeworCQkJUFRYX0NPTlRFWFQJcEJlYWNvbkNvbnRleHQgPSAmKHBBZC0+QmVhY29uQ29udGV4dFtpXSk7CisKKworCQkJTmRpc1plcm9NZW1vcnkocEJlYWNvbkNvbnRleHQsIHNpemVvZihUWF9DT05URVhUKSk7CisKKwkJCS8vQWxsb2NhdGUgVVJCCisJCQlMTV9VU0JfQUxMT0MocE9iaiwgcEJlYWNvbkNvbnRleHQsIFBUWF9CVUZGRVIsIHNpemVvZihUWF9CVUZGRVIpLCBTdGF0dXMsCisJCQkJCQkJKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggQmVhY29uQ29udGV4dFslZF0gdXJiISEgXG4iLCBpKSwKKwkJCQkJCQlvdXQyLAorCQkJCQkJCSgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIEJlYWNvbkNvbnRleHRbJWRdIFRYX0JVRkZFUiAhISBcbiIsIGkpLAorCQkJCQkJCW91dDMpOworCisJCQlwQmVhY29uQ29udGV4dC0+cEFkID0gcEFkOworCQkJcEJlYWNvbkNvbnRleHQtPnBJcnAgPSBOVUxMOworCQkJcEJlYWNvbkNvbnRleHQtPkluVXNlID0gRkFMU0U7CisJCQlwQmVhY29uQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCQl9CisKKwkJLy8KKwkJLy8gTnVsbENvbnRleHQKKwkJLy8KKwkJTmRpc1plcm9NZW1vcnkocE51bGxDb250ZXh0LCBzaXplb2YoVFhfQ09OVEVYVCkpOworCisJCS8vQWxsb2NhdGUgVVJCCisJCUxNX1VTQl9BTExPQyhwT2JqLCBwTnVsbENvbnRleHQsIFBUWF9CVUZGRVIsIHNpemVvZihUWF9CVUZGRVIpLCBTdGF0dXMsCisJCQkJCQkoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBOdWxsQ29udGV4dCB1cmIhISBcbiIpLAorCQkJCQkJb3V0MywKKwkJCQkJCSgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIE51bGxDb250ZXh0IFRYX0JVRkZFUiAhISBcbiIpLAorCQkJCQkJb3V0NCk7CisKKwkJcE51bGxDb250ZXh0LT5wQWQgPSBwQWQ7CisJCXBOdWxsQ29udGV4dC0+cElycCA9IE5VTEw7CisJCXBOdWxsQ29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKKwkJcE51bGxDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisKKwkJLy8KKwkJLy8gUlRTQ29udGV4dAorCQkvLworCQlOZGlzWmVyb01lbW9yeShwUlRTQ29udGV4dCwgc2l6ZW9mKFRYX0NPTlRFWFQpKTsKKworCQkvL0FsbG9jYXRlIFVSQgorCQlMTV9VU0JfQUxMT0MocE9iaiwgcFJUU0NvbnRleHQsIFBUWF9CVUZGRVIsIHNpemVvZihUWF9CVUZGRVIpLCBTdGF0dXMsCisJCQkJCQkoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBSVFNDb250ZXh0IHVyYiEhIFxuIiksCisJCQkJCQlvdXQ0LAorCQkJCQkJKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggUlRTQ29udGV4dCBUWF9CVUZGRVIgISEgXG4iKSwKKwkJCQkJCW91dDUpOworCisJCXBSVFNDb250ZXh0LT5wQWQgPSBwQWQ7CisJCXBSVFNDb250ZXh0LT5wSXJwID0gTlVMTDsKKwkJcFJUU0NvbnRleHQtPkluVXNlID0gRkFMU0U7CisJCXBSVFNDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisKKwkJLy8KKwkJLy8gUHNQb2xsQ29udGV4dAorCQkvLworCQkvL05kaXNaZXJvTWVtb3J5KHBQc1BvbGxDb250ZXh0LCBzaXplb2YoVFhfQ09OVEVYVCkpOworCQkvL0FsbG9jYXRlIFVSQgorCQlMTV9VU0JfQUxMT0MocE9iaiwgcFBzUG9sbENvbnRleHQsIFBUWF9CVUZGRVIsIHNpemVvZihUWF9CVUZGRVIpLCBTdGF0dXMsCisJCQkJCQkoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBQc1BvbGxDb250ZXh0IHVyYiEhIFxuIiksCisJCQkJCQlvdXQ1LAorCQkJCQkJKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggUHNQb2xsQ29udGV4dCBUWF9CVUZGRVIgISEgXG4iKSwKKwkJCQkJCW91dDYpOworCisJCXBQc1BvbGxDb250ZXh0LT5wQWQgPSBwQWQ7CisJCXBQc1BvbGxDb250ZXh0LT5wSXJwID0gTlVMTDsKKwkJcFBzUG9sbENvbnRleHQtPkluVXNlID0gRkFMU0U7CisJCXBQc1BvbGxDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisJCXBQc1BvbGxDb250ZXh0LT5iQWdncmVnYXRpYmxlID0gRkFMU0U7CisJCXBQc1BvbGxDb250ZXh0LT5MYXN0T25lID0gVFJVRTsKKworCX0gICB3aGlsZSAoRkFMU0UpOworCisKK2RvbmU6CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tIE5JQ0luaXRUcmFuc21pdFxuIikpOworCisJcmV0dXJuIFN0YXR1czsKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFUlJPUiBIQU5ETEUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitvdXQ2OgorCUxNX1VSQl9GUkVFKHBPYmosIHBQc1BvbGxDb250ZXh0LCBzaXplb2YoVFhfQlVGRkVSKSk7CisKK291dDU6CisJTE1fVVJCX0ZSRUUocE9iaiwgcFJUU0NvbnRleHQsIHNpemVvZihUWF9CVUZGRVIpKTsKKworb3V0NDoKKwlMTV9VUkJfRlJFRShwT2JqLCBwTnVsbENvbnRleHQsIHNpemVvZihUWF9CVUZGRVIpKTsKKworb3V0MzoKKwlmb3IoaT0wOyBpPEJFQUNPTl9SSU5HX1NJWkU7IGkrKykKKwl7CisJCVBUWF9DT05URVhUCXBCZWFjb25Db250ZXh0ID0gJihwQWQtPkJlYWNvbkNvbnRleHRbaV0pOworCQlpZiAocEJlYWNvbkNvbnRleHQpCisJCQlMTV9VUkJfRlJFRShwT2JqLCBwQmVhY29uQ29udGV4dCwgc2l6ZW9mKFRYX0JVRkZFUikpOworCX0KKworb3V0MjoKKwlpZiAocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSkKKwl7CisJCXBNZ210UmluZyA9ICZwQWQtPk1nbXRSaW5nOworCWZvcihpPTA7IGk8TUdNVF9SSU5HX1NJWkU7IGkrKykKKwl7CisJCXBNTE1FQ29udGV4dCA9IChQVFhfQ09OVEVYVCkgcEFkLT5NZ210UmluZy5DZWxsW2ldLkFsbG9jVmE7CisJCWlmIChwTUxNRUNvbnRleHQpCisJCQlMTV9VUkJfRlJFRShwT2JqLCBwTUxNRUNvbnRleHQsIHNpemVvZihUWF9CVUZGRVIpKTsKKwl9CisJCU5kaXNGcmVlTWVtb3J5KHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEsIHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jU2l6ZSwgMCk7CisJCXBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEgPSBOVUxMOworCX0KKworb3V0MToKKwlmb3IgKGFjaWR4ID0gMDsgYWNpZHggPCA0OyBhY2lkeCsrKQorCXsKKwkJUEhUX1RYX0NPTlRFWFQgcFR4Q29udGV4dCA9ICYocEFkLT5UeENvbnRleHRbYWNpZHhdKTsKKwkJaWYgKHBUeENvbnRleHQpCisJCQlMTV9VUkJfRlJFRShwT2JqLCBwVHhDb250ZXh0LCBzaXplb2YoSFRUWF9CVUZGRVIpKTsKKwl9CisKKwkvLyBIZXJlIHdlIGRpZG4ndCBoYXZlIGFueSBwcmUtYWxsb2NhdGVkIG1lbW9yeSBuZWVkIHRvIGZyZWUuCisKKwlyZXR1cm4gU3RhdHVzOworfQorCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgQWxsb2NhdGUgRE1BIG1lbW9yeSBibG9ja3MgZm9yIHNlbmQsIHJlY2VpdmUuCisKK0FyZ3VtZW50czoKKyAgICBwQWQJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworUmV0dXJuIFZhbHVlOgorCU5ESVNfU1RBVFVTX1NVQ0NFU1MKKwlORElTX1NUQVRVU19GQUlMVVJFCisJTkRJU19TVEFUVVNfUkVTT1VSQ0VTCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUwlSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKy8vCUNPVU5URVJfODAyXzExCXBDb3VudGVyID0gJnBBZC0+V2xhbkNvdW50ZXJzOworCU5ESVNfU1RBVFVTCQlTdGF0dXM7CisJSU5UCQkJCW51bTsKKworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFJUTVBBbGxvY1R4UnhSaW5nTWVtb3J5XG4iKSk7CisKKworCWRvCisJeworCQkvLyBJbml0IHRoZSBDbWRRIGFuZCBDbWRRTG9jaworCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5DbWRRTG9jayk7CisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOworCQlSVFVTQkluaXRpYWxpemVDbWRRKCZwQWQtPkNtZFEpOworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKKworCisJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1MTUVCdWxrT3V0TG9jayk7CisJCS8vTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+TUxNRVdhaXRRdWV1ZUxvY2spOworCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CdWxrT3V0TG9ja1swXSk7CisJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrWzFdKTsKKwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbMl0pOworCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CdWxrT3V0TG9ja1szXSk7CisJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrWzRdKTsKKwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbNV0pOworCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CdWxrSW5Mb2NrKTsKKworCQlmb3IgKG51bSA9IDA7IG51bSA8IE5VTV9PRl9UWF9SSU5HOyBudW0rKykKKwkJeworCQkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW251bV0pOworCQl9CisKKyNpZmRlZiBSQUxJTktfQVRFCisJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkdlbmVyaWNMb2NrKTsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKy8vCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5NZW1Mb2NrKTsJLy8gTm90IHVzZWQgaW4gUlQyOFhYCisKKy8vCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsgLy8gaW5pdCBpdCBpbiBVc2VyQ2ZnSW5pdCgpCisvLwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsgLy8gaW5pdCBpdCBpbiBCQVRhYmxlSW5pdCgpCisKKy8vCQlmb3IobnVtPTA7IG51bTxNQVhfTEVOX09GX0JBX1JFQ19UQUJMRTsgbnVtKyspCisvLwkJeworLy8JCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbbnVtXS5SeFJlUmluZ0xvY2spOworLy8JCX0KKworCQkvLworCQkvLyBJbml0IE1hYyBUYWJsZQorCQkvLworLy8JCU1hY1RhYmxlSW5pdGlhbGl6ZShwQWQpOworCisJCS8vCisJCS8vIEluaXQgc2VuZCBkYXRhIHN0cnVjdHVyZXMgYW5kIHJlbGF0ZWQgcGFyYW1ldGVycworCQkvLworCQlTdGF0dXMgPSBOSUNJbml0VHJhbnNtaXQocEFkKTsKKwkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJYnJlYWs7CisKKwkJLy8KKwkJLy8gSW5pdCByZWNlaXZlIGRhdGEgc3RydWN0dXJlcyBhbmQgcmVsYXRlZCBwYXJhbWV0ZXJzCisJCS8vCisJCVN0YXR1cyA9IE5JQ0luaXRSZWN2KHBBZCk7CisJCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCWJyZWFrOworCisJCXBBZC0+UGVuZGluZ0lvQ291bnQgPSAxOworCisJfSB3aGlsZSAoRkFMU0UpOworCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+RnJhZ0ZyYW1lLCBzaXplb2YoRlJBR01FTlRfRlJBTUUpKTsKKwlwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCA9ICBSVE1QX0FsbG9jYXRlRnJhZ1BhY2tldEJ1ZmZlcihwQWQsIFJYX0JVRkZFUl9OT1JNU0laRSk7CisKKwlpZiAocEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQgPT0gTlVMTCkKKwl7CisJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwl9CisKKwlEQkdQUklOVF9TKFN0YXR1cywgKCI8LS0gUlRNUEFsbG9jVHhSeFJpbmdNZW1vcnksIFN0YXR1cz0leFxuIiwgU3RhdHVzKSk7CisJcmV0dXJuIFN0YXR1czsKK30KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorCUNhbGxzIFVTQl9JbnRlcmZhY2VTdG9wIGFuZCBmcmVlcyBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgVVJCcworICAgIGNhbGxzIE5kaXNNRGVyZWdpc3RlckRldmljZSBhbmQgZnJlZXMgdGhlIG1lbW9yeQorICAgIGFsbG9jYXRlZCBpbiBWTmV0SW5pdGlhbGl6ZSBmb3IgdGhlIEFkYXB0ZXIgT2JqZWN0CisKK0FyZ3VtZW50czoKKwkqcEFkCQkJCXRoZSByYXh4IGludGVyZmFjZSBkYXRhIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorCU5vbmUKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUEZyZWVUeFJ4UmluZ01lbW9yeSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKyNkZWZpbmUgTE1fVVJCX0ZSRUUocE9iaiwgQ29udGV4dCwgQnVmZmVyU2l6ZSkJCQkJXAorCWlmIChOVUxMICE9IENvbnRleHQtPnBVcmIpIHsJCQkJCQkJXAorCQlSVFVTQl9VTkxJTktfVVJCKENvbnRleHQtPnBVcmIpOwkJCQkJXAorCQlSVFVTQl9GUkVFX1VSQihDb250ZXh0LT5wVXJiKTsJCQkJCQlcCisJCUNvbnRleHQtPnBVcmIgPSBOVUxMOyB9CQkJCQkJCQlcCisJaWYgKE5VTEwgIT0gQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIpIHsJCQkJCVwKKwkJUlRVU0JfVVJCX0ZSRUVfQlVGRkVSKHBPYmotPnBVc2JfRGV2LCBCdWZmZXJTaXplLAlcCisJCQkJCQkJCUNvbnRleHQtPlRyYW5zZmVyQnVmZmVyLAlcCisJCQkJCQkJCUNvbnRleHQtPmRhdGFfZG1hKTsJCQlcCisJCUNvbnRleHQtPlRyYW5zZmVyQnVmZmVyID0gTlVMTDsgfQorCisKKwlVSU5UICAgICAgICAgICAgICAgIGksIGFjaWR4OworCVBUWF9DT05URVhUCQkJcE51bGxDb250ZXh0ICAgPSAmcEFkLT5OdWxsQ29udGV4dDsKKwlQVFhfQ09OVEVYVAkJCXBQc1BvbGxDb250ZXh0ID0gJnBBZC0+UHNQb2xsQ29udGV4dDsKKwlQVFhfQ09OVEVYVAkJCXBSVFNDb250ZXh0ICAgID0gJnBBZC0+UlRTQ29udGV4dDsKKy8vCVBIVF9UWF9DT05URVhUIAkJcEhUVFhDb250ZXh0OworCS8vUFJUTVBfUkVPUkRFUkJVRglwUmVvcmRlckJ1ZjsKKwlQT1NfQ09PS0lFCQkJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKy8vCVJUTVBfVFhfUklORwkJKnBUeFJpbmc7CisKKwlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCItLS0+IFJUTVBGcmVlVHhSeFJpbmdNZW1vcnlcbiIpKTsKKwlwT2JqID0gcE9iajsKKworCS8vIEZyZWUgYWxsIHJlc291cmNlcyBmb3IgdGhlIFJFQ0VJVkUgYnVmZmVyIHF1ZXVlLgorCWZvcihpPTA7IGk8KFJYX1JJTkdfU0laRSk7IGkrKykKKwl7CisJCVBSWF9DT05URVhUICBwUnhDb250ZXh0ID0gJihwQWQtPlJ4Q29udGV4dFtpXSk7CisJCWlmIChwUnhDb250ZXh0KQorCQkJTE1fVVJCX0ZSRUUocE9iaiwgcFJ4Q29udGV4dCwgTUFYX1JYQlVMS19TSVpFKTsKKwl9CisKKwkvLyBGcmVlIFBzUG9sbCBmcmFtZSByZXNvdXJjZQorCUxNX1VSQl9GUkVFKHBPYmosIHBQc1BvbGxDb250ZXh0LCBzaXplb2YoVFhfQlVGRkVSKSk7CisKKwkvLyBGcmVlIE5VTEwgZnJhbWUgcmVzb3VyY2UKKwlMTV9VUkJfRlJFRShwT2JqLCBwTnVsbENvbnRleHQsIHNpemVvZihUWF9CVUZGRVIpKTsKKworCS8vIEZyZWUgUlRTIGZyYW1lIHJlc291cmNlCisJTE1fVVJCX0ZSRUUocE9iaiwgcFJUU0NvbnRleHQsIHNpemVvZihUWF9CVUZGRVIpKTsKKworCisJLy8gRnJlZSBiZWFjb24gZnJhbWUgcmVzb3VyY2UKKwlmb3IoaT0wOyBpPEJFQUNPTl9SSU5HX1NJWkU7IGkrKykKKwl7CisJCVBUWF9DT05URVhUCXBCZWFjb25Db250ZXh0ID0gJihwQWQtPkJlYWNvbkNvbnRleHRbaV0pOworCQlpZiAocEJlYWNvbkNvbnRleHQpCisJCQlMTV9VUkJfRlJFRShwT2JqLCBwQmVhY29uQ29udGV4dCwgc2l6ZW9mKFRYX0JVRkZFUikpOworCX0KKworCisJLy8gRnJlZSBtZ210IGZyYW1lIHJlc291cmNlCisJZm9yKGkgPSAwOyBpIDwgTUdNVF9SSU5HX1NJWkU7IGkrKykKKwl7CisJCVBUWF9DT05URVhUIHBNTE1FQ29udGV4dCA9IChQVFhfQ09OVEVYVClwQWQtPk1nbXRSaW5nLkNlbGxbaV0uQWxsb2NWYTsKKwkJLy9MTV9VUkJfRlJFRShwT2JqLCBwTUxNRUNvbnRleHQsIHNpemVvZihUWF9CVUZGRVIpKTsKKwkJaWYgKE5VTEwgIT0gcEFkLT5NZ210UmluZy5DZWxsW2ldLnBOZGlzUGFja2V0KQorCQl7CisJCQlSVE1QRnJlZU5kaXNQYWNrZXQocEFkLCBwQWQtPk1nbXRSaW5nLkNlbGxbaV0ucE5kaXNQYWNrZXQpOworCQkJcEFkLT5NZ210UmluZy5DZWxsW2ldLnBOZGlzUGFja2V0ID0gTlVMTDsKKwkJCXBNTE1FQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIgPSBOVUxMOworCQl9CisKKwkJaWYgKHBNTE1FQ29udGV4dCkKKwkJeworCQkJaWYgKE5VTEwgIT0gcE1MTUVDb250ZXh0LT5wVXJiKQorCQkJeworCQkJCVJUVVNCX1VOTElOS19VUkIocE1MTUVDb250ZXh0LT5wVXJiKTsKKwkJCQlSVFVTQl9GUkVFX1VSQihwTUxNRUNvbnRleHQtPnBVcmIpOworCQkJCXBNTE1FQ29udGV4dC0+cFVyYiA9IE5VTEw7CisJCQl9CisJCX0KKwl9CisJaWYgKHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEpCisJCU5kaXNGcmVlTWVtb3J5KHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEsIHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jU2l6ZSwgMCk7CisKKworCS8vIEZyZWUgVHggZnJhbWUgcmVzb3VyY2UKKwlmb3IgKGFjaWR4ID0gMDsgYWNpZHggPCA0OyBhY2lkeCsrKQorCQl7CisJCVBIVF9UWF9DT05URVhUIHBIVFRYQ29udGV4dCA9ICYocEFkLT5UeENvbnRleHRbYWNpZHhdKTsKKwkJCWlmIChwSFRUWENvbnRleHQpCisJCQkJTE1fVVJCX0ZSRUUocE9iaiwgcEhUVFhDb250ZXh0LCBzaXplb2YoSFRUWF9CVUZGRVIpKTsKKwkJfQorCisJaWYgKHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0KQorCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCisJZm9yKGk9MDsgaTw2OyBpKyspCisJeworCQlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrW2ldKTsKKwl9CisKKwlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPkJ1bGtJbkxvY2spOworCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+TUxNRUJ1bGtPdXRMb2NrKTsKKworCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOworI2lmZGVmIFJBTElOS19BVEUKKwlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPkdlbmVyaWNMb2NrKTsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJLy8gQ2xlYXIgYWxsIHBlbmRpbmcgYnVsay1vdXQgcmVxdWVzdCBmbGFncy4KKwlSVFVTQl9DTEVBUl9CVUxLX0ZMQUcocEFkLCAweGZmZmZmZmZmKTsKKworLy8JTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKworLy8JZm9yKGk9MDsgaTxNQVhfTEVOX09GX0JBX1JFQ19UQUJMRTsgaSsrKQorLy8JeworLy8JCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W2ldLlJ4UmVSaW5nTG9jayk7CisvLwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCI8LS0tIFJlbGVhc2VBZGFwdGVyXG4iKSk7Cit9CisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFkYXB0ZXIgY29udHJvbCBibG9jay4KKworQXJndW1lbnRzOgorICAgIHBBZAkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCitSZXR1cm4gVmFsdWU6CisJTkRJU19TVEFUVVNfU1VDQ0VTUworCU5ESVNfU1RBVFVTX0ZBSUxVUkUKKwlORElTX1NUQVRVU19SRVNPVVJDRVMKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTIEFkYXB0ZXJCbG9ja0FsbG9jYXRlTWVtb3J5KAorCUlOIFBWT0lECWhhbmRsZSwKKwlPVVQJUFZPSUQJKnBwQWQpCit7CisJUFVTQl9ERVYJdXNiX2RldjsKKwlQT1NfQ09PS0lFCXBPYmogPSAoUE9TX0NPT0tJRSkgaGFuZGxlOworCisKKwl1c2JfZGV2ID0gcE9iai0+cFVzYl9EZXY7CisKKwlwT2JqLT5NTE1FVGhyX3BpZAkJPSBUSFJFQURfUElEX0lOSVRfVkFMVUU7CisJcE9iai0+UlRVU0JDbWRUaHJfcGlkCT0gVEhSRUFEX1BJRF9JTklUX1ZBTFVFOworCisJKnBwQWQgPSAoUFZPSUQpdm1hbGxvYyhzaXplb2YoUlRNUF9BREFQVEVSKSk7CisKKwlpZiAoKnBwQWQpCisJeworCQlOZGlzWmVyb01lbW9yeSgqcHBBZCwgc2l6ZW9mKFJUTVBfQURBUFRFUikpOworCQkoKFBSVE1QX0FEQVBURVIpKnBwQWQpLT5PU19Db29raWUgPSBoYW5kbGU7CisJCXJldHVybiAoTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJfQorfQorCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgQ3JlYXRlIGtlcm5lbCB0aHJlYWRzICYgdGFza2xldHMuCisKK0FyZ3VtZW50czoKKyAgICAqbmV0X2RldgkJCVBvaW50ZXIgdG8gd2lyZWxlc3MgbmV0IGRldmljZSBpbnRlcmZhY2UKKworUmV0dXJuIFZhbHVlOgorCU5ESVNfU1RBVFVTX1NVQ0NFU1MKKwlORElTX1NUQVRVU19GQUlMVVJFCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUwkgQ3JlYXRlVGhyZWFkcygKKwlJTglzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlQUlRNUF9BREFQVEVSIHBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisJUE9TX0NPT0tJRSBwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCXBpZF90IHBpZF9udW1iZXIgPSAtMTsKKworCS8vaW5pdF9NVVRFWCgmKHBBZC0+dXNiZGV2X3NlbWFwaG9yZSkpOworCisJaW5pdF9NVVRFWF9MT0NLRUQoJihwQWQtPm1sbWVfc2VtYXBob3JlKSk7CisJaW5pdF9jb21wbGV0aW9uICgmcEFkLT5tbG1lQ29tcGxldGUpOworCisJaW5pdF9NVVRFWF9MT0NLRUQoJihwQWQtPlJUVVNCQ21kX3NlbWFwaG9yZSkpOworCWluaXRfY29tcGxldGlvbiAoJnBBZC0+Q21kUUNvbXBsZXRlKTsKKworCWluaXRfTVVURVhfTE9DS0VEKCYocEFkLT5SVFVTQlRpbWVyX3NlbWFwaG9yZSkpOworCWluaXRfY29tcGxldGlvbiAoJnBBZC0+VGltZXJRQ29tcGxldGUpOworCisJLy8gQ3JlYXQgTUxNRSBUaHJlYWQKKwlwT2JqLT5NTE1FVGhyX3BpZD0gVEhSRUFEX1BJRF9JTklUX1ZBTFVFOworCXBpZF9udW1iZXIgPSBrZXJuZWxfdGhyZWFkKE1sbWVUaHJlYWQsIHBBZCwgQ0xPTkVfVk0pOworCWlmIChwaWRfbnVtYmVyIDwgMCkKKwl7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogdW5hYmxlIHRvIHN0YXJ0IE1sbWUgdGhyZWFkXG4iLHBBZC0+bmV0X2Rldi0+bmFtZSk7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKwlwT2JqLT5NTE1FVGhyX3BpZCA9IEdFVF9QSUQocGlkX251bWJlcik7CisJLy8gV2FpdCBmb3IgdGhlIHRocmVhZCB0byBzdGFydAorCXdhaXRfZm9yX2NvbXBsZXRpb24oJihwQWQtPm1sbWVDb21wbGV0ZSkpOworCisJLy8gQ3JlYXQgQ29tbWFuZCBUaHJlYWQKKwlwT2JqLT5SVFVTQkNtZFRocl9waWQ9IFRIUkVBRF9QSURfSU5JVF9WQUxVRTsKKwlwaWRfbnVtYmVyID0ga2VybmVsX3RocmVhZChSVFVTQkNtZFRocmVhZCwgcEFkLCBDTE9ORV9WTSk7CisJaWYgKHBpZF9udW1iZXIgPCAwKQorCXsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiB1bmFibGUgdG8gc3RhcnQgUlRVU0JDbWQgdGhyZWFkXG4iLHBBZC0+bmV0X2Rldi0+bmFtZSk7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKwlwT2JqLT5SVFVTQkNtZFRocl9waWQgPSBHRVRfUElEKHBpZF9udW1iZXIpOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJihwQWQtPkNtZFFDb21wbGV0ZSkpOworCisJcE9iai0+VGltZXJRVGhyX3BpZD0gVEhSRUFEX1BJRF9JTklUX1ZBTFVFOworCXBpZF9udW1iZXIgPSBrZXJuZWxfdGhyZWFkKFRpbWVyUVRocmVhZCwgcEFkLCBDTE9ORV9WTSk7CisJaWYgKHBpZF9udW1iZXIgPCAwKQorCXsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiB1bmFibGUgdG8gc3RhcnQgVGltZXJRVGhyZWFkXG4iLHBBZC0+bmV0X2Rldi0+bmFtZSk7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKwlwT2JqLT5UaW1lclFUaHJfcGlkID0gR0VUX1BJRChwaWRfbnVtYmVyKTsKKwkvLyBXYWl0IGZvciB0aGUgdGhyZWFkIHRvIHN0YXJ0CisJd2FpdF9mb3JfY29tcGxldGlvbigmKHBBZC0+VGltZXJRQ29tcGxldGUpKTsKKworCS8vIENyZWF0ZSByZWNlaXZlIHRhc2tsZXQKKwl0YXNrbGV0X2luaXQoJnBPYmotPnJ4X2RvbmVfdGFzaywgcnhfZG9uZV90YXNrbGV0LCAoVUxPTkcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPm1nbXRfZG1hX2RvbmVfdGFzaywgcnQyODcwX21nbXRfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPmFjMF9kbWFfZG9uZV90YXNrLCBydDI4NzBfYWMwX2RtYV9kb25lX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7CisJdGFza2xldF9pbml0KCZwT2JqLT5hYzFfZG1hX2RvbmVfdGFzaywgcnQyODcwX2FjMV9kbWFfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOworCXRhc2tsZXRfaW5pdCgmcE9iai0+YWMyX2RtYV9kb25lX3Rhc2ssIHJ0Mjg3MF9hYzJfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPmFjM19kbWFfZG9uZV90YXNrLCBydDI4NzBfYWMzX2RtYV9kb25lX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7CisJdGFza2xldF9pbml0KCZwT2JqLT5oY2NhX2RtYV9kb25lX3Rhc2ssIHJ0Mjg3MF9oY2NhX2RtYV9kb25lX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7CisJdGFza2xldF9pbml0KCZwT2JqLT50YnR0X3Rhc2ssIHRidHRfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPm51bGxfZnJhbWVfY29tcGxldGVfdGFzaywgcnQyODcwX251bGxfZnJhbWVfY29tcGxldGVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPnJ0c19mcmFtZV9jb21wbGV0ZV90YXNrLCBydDI4NzBfcnRzX2ZyYW1lX2NvbXBsZXRlX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7CisJdGFza2xldF9pbml0KCZwT2JqLT5wc3BvbGxfZnJhbWVfY29tcGxldGVfdGFzaywgcnQyODcwX3BzcG9sbF9mcmFtZV9jb21wbGV0ZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOworCisJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAJQXMgU1RBJ3MgQlNTSUQgaXMgYSBXQyB0b28sIGl0IHVzZXMgc2hhcmVkIGtleSB0YWJsZS4KKyAJVGhpcyBmdW5jdGlvbiB3cml0ZSBjb3JyZWN0IHVuaWNhc3QgVFgga2V5IHRvIEFTSUMgV0NJRC4KKyAJQW5kIHdlIHN0aWxsIG1ha2UgYSBjb3B5IGluIG91ciBNYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS4KKwlDYWxsZXIgZ3VhcmFudGVlIFRLSVAvQUVTIGFsd2F5cyBoYXMga2V5aWR4ID0gMC4gKHBhaXJ3aXNlIGtleSkKKwlDYWxsZXIgZ3VhcmFudGVlIFdFUCBjYWxscyB0aGlzIGZ1bmN0aW9uIHdoZW4gc2V0IFR4a2V5LCAgZGVmYXVsdCBrZXkgaW5kZXg9MH4zLgorCitBcmd1bWVudHM6CisJcEFkIAkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCXBLZXkJCQkJCVBvaW50ZXIgdG8gdGhlIHdoZXJlIHRoZSBrZXkgc3RvcmVkCisKK1JldHVybiBWYWx1ZToKKwlORElTX1NVQ0NFU1MJCQlBZGQga2V5IHN1Y2Nlc3NmdWxseQorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QQWRkQlNTSURDaXBoZXIoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCVVDSEFSCQkJCUFpZCwKKwlJTglQTkRJU184MDJfMTFfS0VZCXBLZXksCisJSU4gIFVDSEFSICAgCQkJQ2lwaGVyQWxnKQoreworCVBVQ0hBUgkJcFR4TWljLCBwUnhNaWM7CisJQk9PTEVBTiAJYktleVJTQywgYkF1dGhlbnRpY2F0b3I7IC8vIGluZGljYXRlIHRoZSByZWNlaXZlIFNDIHNldCBieSBLZXlSU0MgdmFsdWUKKy8vCVVDSEFSCQlDaXBoZXJBbGc7CisJVUNIQVIJCWk7CisJVUxPTkcJCVdDSURBdHRyaTsKKwlVU0hPUlQJIAlvZmZzZXQ7CisJVUNIQVIJCUtleUlkeCwgSVZFSVZbOF07CisJVUlOVDMyCQlWYWx1ZTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBBZGRCU1NJRENpcGhlcj09PiBBaWQgPSAlZFxuIixBaWQpKTsKKworCS8vIEJpdCAyOSBvZiBBZGQta2V5IEtleVJTQworCWJLZXlSU0MgCSAgID0gKHBLZXktPktleUluZGV4ICYgMHgyMDAwMDAwMCkgPyBUUlVFIDogRkFMU0U7CisKKwkvLyBCaXQgMjggb2YgQWRkLWtleSBBdXRoZW50aWNhdG9yCisJYkF1dGhlbnRpY2F0b3IgPSAocEtleS0+S2V5SW5kZXggJiAweDEwMDAwMDAwKSA/IFRSVUUgOiBGQUxTRTsKKwlLZXlJZHggPSAoVUNIQVIpcEtleS0+S2V5SW5kZXgmMHhmZjsKKworCWlmIChLZXlJZHggPiA0KQorCQlyZXR1cm47CisKKworCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uUGFpcndpc2VLZXkuQ2lwaGVyQWxnID09IENJUEhFUl9US0lQKQorCXsJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisJCXsKKwkJCS8vIGZvciBXUEEtTm9uZSBUeCwgUnggTUlDIGlzIHRoZSBzYW1lCisJCQlwVHhNaWMgPSAoUFVDSEFSKSAoJnBLZXktPktleU1hdGVyaWFsKSArIDE2OworCQkJcFJ4TWljID0gcFR4TWljOworCQl9CisJCWVsc2UgaWYgKGJBdXRoZW50aWNhdG9yID09IFRSVUUpCisJCXsKKwkJCXBUeE1pYyA9IChQVUNIQVIpICgmcEtleS0+S2V5TWF0ZXJpYWwpICsgMTY7CisJCQlwUnhNaWMgPSAoUFVDSEFSKSAoJnBLZXktPktleU1hdGVyaWFsKSArIDI0OworCQl9CisJCWVsc2UKKwkJeworCQkJcFJ4TWljID0gKFBVQ0hBUikgKCZwS2V5LT5LZXlNYXRlcmlhbCkgKyAxNjsKKwkJCXBUeE1pYyA9IChQVUNIQVIpICgmcEtleS0+S2V5TWF0ZXJpYWwpICsgMjQ7CisJCX0KKworCQlvZmZzZXQgPSBQQUlSV0lTRV9LRVlfVEFCTEVfQkFTRSArIChBaWQgKiBIV19LRVlfRU5UUllfU0laRSkgKyAweDEwOworCQlmb3IgKGk9MDsgaTw4OyApCisJCXsKKwkJCVZhbHVlID0gKihwVHhNaWMraSk7CisJCQlWYWx1ZSArPSAoKihwVHhNaWMraSsxKTw8OCk7CisJCQlWYWx1ZSArPSAoKihwVHhNaWMraSsyKTw8MTYpOworCQkJVmFsdWUgKz0gKCoocFR4TWljK2krMyk8PDI0KTsKKwkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIG9mZnNldCtpLCBWYWx1ZSk7CisJCQlpKz00OworCQl9CisKKwkJb2Zmc2V0ID0gUEFJUldJU0VfS0VZX1RBQkxFX0JBU0UgKyAoQWlkICogSFdfS0VZX0VOVFJZX1NJWkUpICsgMHgxODsKKwkJZm9yIChpPTA7IGk8ODsgKQorCQl7CisJCQlWYWx1ZSA9ICoocFJ4TWljK2kpOworCQkJVmFsdWUgKz0gKCoocFJ4TWljK2krMSk8PDgpOworCQkJVmFsdWUgKz0gKCoocFJ4TWljK2krMik8PDE2KTsKKwkJCVZhbHVlICs9ICgqKHBSeE1pYytpKzMpPDwyNCk7CisJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQraSwgVmFsdWUpOworCQkJaSs9NDsKKwkJfQorCisJCS8vIE9ubHkgS2V5IGxlbnRoIGVxdWFsIHRvIFRLSVAga2V5IGhhdmUgdGhlc2UKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtBaWRdLlBhaXJ3aXNlS2V5LlJ4TWljLCBwUnhNaWMsIDgpOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uUGFpcndpc2VLZXkuVHhNaWMsIHBUeE1pYywgOCk7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJKCIJVHhNSUMgID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IFxuIiwKKwkJCQlwVHhNaWNbMF0scFR4TWljWzFdLHBUeE1pY1syXSxwVHhNaWNbM10sCisJCQkJcFR4TWljWzRdLHBUeE1pY1s1XSxwVHhNaWNbNl0scFR4TWljWzddKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSgiCVJ4TUlDICA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBcbiIsCisJCQkJcFJ4TWljWzBdLHBSeE1pY1sxXSxwUnhNaWNbMl0scFJ4TWljWzNdLAorCQkJCXBSeE1pY1s0XSxwUnhNaWNbNV0scFJ4TWljWzZdLHBSeE1pY1s3XSkpOworCX0KKworCS8vIDIuIFJlY29yZCBTZWN1cml0eSBLZXkuCisJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5LZXlMZW49IChVQ0hBUilwS2V5LT5LZXlMZW5ndGg7CisJTmRpc01vdmVNZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtBaWRdLlBhaXJ3aXNlS2V5LktleSwgJnBLZXktPktleU1hdGVyaWFsLCBwS2V5LT5LZXlMZW5ndGgpOworCisJLy8gMy4gQ2hlY2sgUnhUc2MuIEFuZCB1c2VkIHRvIGluaXQgdG8gQVNJQyBJVi4KKwlpZiAoYktleVJTQyA9PSBUUlVFKQorCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uUGFpcndpc2VLZXkuUnhUc2MsICZwS2V5LT5LZXlSU0MsIDYpOworCWVsc2UKKwkJTmRpc1plcm9NZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtBaWRdLlBhaXJ3aXNlS2V5LlJ4VHNjLCA2KTsKKworCS8vIDQuIEluaXQgVHhUc2MgdG8gb25lIGJhc2VkIG9uIFdpRmkgV1BBIHNwZWNzCisJcEFkLT5NYWNUYWIuQ29udGVudFtBaWRdLlBhaXJ3aXNlS2V5LlR4VHNjWzBdID0gMTsKKwlwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uUGFpcndpc2VLZXkuVHhUc2NbMV0gPSAwOworCXBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5QYWlyd2lzZUtleS5UeFRzY1syXSA9IDA7CisJcEFkLT5NYWNUYWIuQ29udGVudFtBaWRdLlBhaXJ3aXNlS2V5LlR4VHNjWzNdID0gMDsKKwlwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uUGFpcndpc2VLZXkuVHhUc2NbNF0gPSAwOworCXBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5QYWlyd2lzZUtleS5UeFRzY1s1XSA9IDA7CisKKwlDaXBoZXJBbGcgPSBwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uUGFpcndpc2VLZXkuQ2lwaGVyQWxnOworCisJb2Zmc2V0ID0gUEFJUldJU0VfS0VZX1RBQkxFX0JBU0UgKyAoQWlkICogSFdfS0VZX0VOVFJZX1NJWkUpOworCVJUVVNCTXVsdGlXcml0ZShwQWQsIChVU0hPUlQpIG9mZnNldCwgcEtleS0+S2V5TWF0ZXJpYWwsCisJCQkJKChwS2V5LT5LZXlMZW5ndGggPT0gTEVOX1RLSVBfS0VZKSA/IDE2IDogKFVTSE9SVClwS2V5LT5LZXlMZW5ndGgpKTsKKworCW9mZnNldCA9IFNIQVJFRF9LRVlfVEFCTEVfQkFTRSArIChLZXlJZHggKiBIV19LRVlfRU5UUllfU0laRSk7CisJUlRVU0JNdWx0aVdyaXRlKHBBZCwgKFVTSE9SVCkgb2Zmc2V0LCBwS2V5LT5LZXlNYXRlcmlhbCwgKFVTSE9SVClwS2V5LT5LZXlMZW5ndGgpOworCisJb2Zmc2V0ID0gUEFJUldJU0VfSVZFSVZfVEFCTEVfQkFTRSArIChBaWQgKiBIV19JVkVJVl9FTlRSWV9TSVpFKTsKKwlOZGlzWmVyb01lbW9yeShJVkVJViwgOCk7CisKKwkvLyBJVi9FSVYKKwlpZiAoKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkgfHwKKwkJKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUF9OT19NSUMpIHx8CisJCShDaXBoZXJBbGcgPT0gQ0lQSEVSX0FFUykpCisJeworCQlJVkVJVlszXSA9IDB4MjA7IC8vIEVpdiBiaXQgb24uIGtleWlkIGFsd2F5cyAwIGZvciBwYWlyd2lzZSBrZXkKKwl9CisJLy8gZGVmYXVsdCBrZXkgaWR4IG5lZWRzIHRvIHNldC4KKwkvLyBpbiBUS0lQL0FFUyBLZXlJZHggPSAwICwgV0VQIEtleUlkeCBpcyBkZWZhdWx0IHR4IGtleS4KKwllbHNlCisJeworCQlJVkVJVlszXSB8PSAoS2V5SWR4PDwgNik7CisJfQorCVJUVVNCTXVsdGlXcml0ZShwQWQsIChVU0hPUlQpIG9mZnNldCwgSVZFSVYsIDgpOworCisJLy8gV0NJRCBBdHRyaWJ1dGUgVURGOjMsIEJTU0lkeDozLCBBbGc6MywgS2V5dGFibGU6MT1QQUlSV0lTRSBLRVksIEJTU0lkeCBpcyAwCisJaWYgKChDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApIHx8CisJCShDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVBfTk9fTUlDKSB8fAorCQkoQ2lwaGVyQWxnID09IENJUEhFUl9BRVMpKQorCXsKKwkJV0NJREF0dHJpID0gKENpcGhlckFsZzw8MSl8U0hBUkVES0VZVEFCTEU7CisJfQorCWVsc2UKKwkJV0NJREF0dHJpID0gKENpcGhlckFsZzw8MSl8U0hBUkVES0VZVEFCTEU7CisKKwlvZmZzZXQgPSBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSArIChBaWQqIEhXX1dDSURfQVRUUklfU0laRSk7CisJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgb2Zmc2V0LCBXQ0lEQXR0cmkpOworCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgb2Zmc2V0LCAmVmFsdWUpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQlNTSURfV0NJRCA6IG9mZnNldCA9ICV4LCBXQ0lEQXR0cmkgPSAlbHhcbiIsCisJCQlvZmZzZXQsIFdDSURBdHRyaSkpOworCisJLy8gcEFkZHIKKwkvLyBBZGQgQnNzaWQgbWFjIGFkZHJlc3MgYXQgbGlua3VwLiBub3QgaGVyZS4gIGNoZWNrIQorCS8qb2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArIChCU1NJRF9XQ0lEICogSFdfV0NJRF9FTlRSWV9TSVpFKTsKKwkqZm9yIChpPTA7IGk8TUFDX0FERFJfTEVOOyBpKyspCisJeworCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCtpLCBwS2V5LT5CU1NJRFtpXSk7CisJfQorCSovCisKKwlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBZGRCU1NJRGFzV0NJREVudHJ5OiBBbGc9JXMsIEtleUxlbmd0aCA9ICVkXG4iLAorCQkJQ2lwaGVyTmFtZVtDaXBoZXJBbGddLCBwS2V5LT5LZXlMZW5ndGgpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJLZXkgW2lkeD0leF0gW0tleUxlbiA9ICVkXVxuIiwKKwkJCXBLZXktPktleUluZGV4LCBwS2V5LT5LZXlMZW5ndGgpKTsKKwlmb3IoaT0wOyBpPHBLZXktPktleUxlbmd0aDsgaSsrKQorCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCIgJXg6IiwgcEtleS0+S2V5TWF0ZXJpYWxbaV0pKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIgkgXG4iKSk7Cit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgR2V0IGEgcmVjZWl2ZWQgcGFja2V0LgorCitBcmd1bWVudHM6CisJcEFkCQkJCQlkZXZpY2UgY29udHJvbCBibG9jaworCXBTYXZlUnhECQkJcmVjZWl2ZSBkZXNjcmlwdG9yIGluZm9ybWF0aW9uCisJKnBiUmVzY2hlZHVsZQkJbmVlZCByZXNjaGVkdWxlIGZsYWcKKwkqcFJ4UGVuZGluZwkJCXBlbmRpbmcgcmVjZWl2ZWQgcGFja2V0IGZsYWcKKworUmV0dXJuIFZhbHVlOgorICAgIHRoZSByZWNpZXZlZCBwYWNrZXQKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKyNkZWZpbmUgUlQyODcwX1JYRE1BTEVOX0ZJRUxEX1NJWkUJCQk0CitQTkRJU19QQUNLRVQgR2V0UGFja2V0RnJvbVJ4UmluZygKKwlJTgkJUFJUTVBfQURBUFRFUgkJcEFkLAorCU9VVAkJUFJUMjhYWF9SWERfU1RSVUMJcFNhdmVSeEQsCisJT1VUCQlCT09MRUFOCQkJCSpwYlJlc2NoZWR1bGUsCisJSU4gT1VUCVVJTlQzMgkJCQkqcFJ4UGVuZGluZykKK3sKKwlQUlhfQ09OVEVYVAkJcFJ4Q29udGV4dDsKKwlQTkRJU19QQUNLRVQJcFNrYjsKKwlQVUNIQVIJCQlwRGF0YTsKKwlVTE9ORwkJCVRoaXNGcmFtZUxlbjsKKwlVTE9ORwkJCVJ4QnVmZmVyTGVuZ3RoOworCVBSWFdJX1NUUlVDCQlwUnhXSTsKKworCXBSeENvbnRleHQgPSAmcEFkLT5SeENvbnRleHRbcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXhdOworCWlmICgocFJ4Q29udGV4dC0+UmVhZGFibGUgPT0gRkFMU0UpIHx8IChwUnhDb250ZXh0LT5JblVzZSA9PSBUUlVFKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlSeEJ1ZmZlckxlbmd0aCA9IHBSeENvbnRleHQtPkJ1bGtJbk9mZnNldCAtIHBBZC0+UmVhZFBvc2l0aW9uOworCWlmIChSeEJ1ZmZlckxlbmd0aCA8IChSVDI4NzBfUlhETUFMRU5fRklFTERfU0laRSArIHNpemVvZihSWFdJX1NUUlVDKSArIHNpemVvZihSWElORk9fU1RSVUMpKSkKKwl7CisJCWdvdG8gbGFiZWxfbnVsbDsKKwl9CisKKwlwRGF0YSA9ICZwUnhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlcltwQWQtPlJlYWRQb3NpdGlvbl07IC8qIDRLQiAqLworCS8vIFRoZSBSWERNQSBmaWVsZCBpcyA0IGJ5dGVzLCBub3cganVzdCB1c2UgdGhlIGZpcnN0IDIgYnl0ZXMuIFRoZSBMZW5ndGggaW5jbHVkaW5nIHRoZSAoUlhXSSArIE1TRFUgKyBQYWRkaW5nKQorCVRoaXNGcmFtZUxlbiA9ICpwRGF0YSArICgqKHBEYXRhKzEpPDw4KTsKKyAgICBpZiAoVGhpc0ZyYW1lTGVuID09IDApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCSVJJZHgoJWQpOiBSWERNQUxlbiBpcyB6ZXJvLlslbGRdLCBCdWxrSW5CdWZMZW4gPSAlbGQpXG4iLAorCQkJCQkJCQlwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleCwgVGhpc0ZyYW1lTGVuLCBwUnhDb250ZXh0LT5CdWxrSW5PZmZzZXQpKTsKKwkJZ290byBsYWJlbF9udWxsOworCX0KKwlpZiAoKFRoaXNGcmFtZUxlbiYweDMpICE9IDApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJCSVJJZHgoJWQpOiBSWERNQUxlbiBub3QgbXVsdGlwbGUgb2YgNC5bJWxkXSwgQnVsa0luQnVmTGVuID0gJWxkKVxuIiwKKwkJCQkJCQkJcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXgsIFRoaXNGcmFtZUxlbiwgcFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0KSk7CisJCWdvdG8gbGFiZWxfbnVsbDsKKwl9CisKKwlpZiAoKFRoaXNGcmFtZUxlbiArIDgpPiBSeEJ1ZmZlckxlbmd0aCkJLy8gOCBmb3IgKFJUMjg3MF9SWERNQUxFTl9GSUVMRF9TSVpFICsgc2l6ZW9mKFJYSU5GT19TVFJVQykpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJJUklkeCglZCk6RnJhbWVMZW4oMHglbHgpIG91dHJhbmdlcy4gQnVsa0luTGVuPTB4JWx4LCByZW1haW5pbmcgUnhCdWZMZW49MHglbHgsIFJlYWRQb3M9MHglbHhcbiIsCisJCQkJCQlwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleCwgVGhpc0ZyYW1lTGVuLCBwUnhDb250ZXh0LT5CdWxrSW5PZmZzZXQsIFJ4QnVmZmVyTGVuZ3RoLCBwQWQtPlJlYWRQb3NpdGlvbikpOworCisJCS8vIGVycm9yIGZyYW1lLiBmaW5pc2ggdGhpcyBsb29wCisJCWdvdG8gbGFiZWxfbnVsbDsKKwl9CisKKwkvLyBza2lwIFVTQiBmcmFtZSBsZW5ndGggZmllbGQKKwlwRGF0YSArPSBSVDI4NzBfUlhETUFMRU5fRklFTERfU0laRTsKKwlwUnhXSSA9IChQUlhXSV9TVFJVQylwRGF0YTsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUFdJRW5kaWFuQ2hhbmdlKHBEYXRhLCBUWVBFX1JYV0kpOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKwlpZiAocFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCA+IFRoaXNGcmFtZUxlbikKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzKCk6cFJ4V0lNUERVdG90YWxCeXRlQ291bnQoJWQpIGxhcmdlIHRoYW4gUnhETUFMZW4oJWxkKVxuIiwKKwkJCQkJCQkJCV9fZnVuY19fLCBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50LCBUaGlzRnJhbWVMZW4pKTsKKwkJZ290byBsYWJlbF9udWxsOworCX0KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUFdJRW5kaWFuQ2hhbmdlKHBEYXRhLCBUWVBFX1JYV0kpOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKworCS8vIGFsbG9jYXRlIGEgcnggcGFja2V0CisJcFNrYiA9IGRldl9hbGxvY19za2IoVGhpc0ZyYW1lTGVuKTsKKwlpZiAocFNrYiA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCIlcygpOkNhbm5vdCBBbGxvY2F0ZSBzayBidWZmZXIgZm9yIHRoaXMgQnVsay1JbiBidWZmZXIhXG4iLCBfX2Z1bmNfXykpOworCQlnb3RvIGxhYmVsX251bGw7CisJfQorCisJLy8gY29weSB0aGUgcnggcGFja2V0CisJbWVtY3B5KHNrYl9wdXQocFNrYiwgVGhpc0ZyYW1lTGVuKSwgcERhdGEsIFRoaXNGcmFtZUxlbik7CisJUlRQS1RfVE9fT1NQS1QocFNrYiktPmRldiA9IGdldF9uZXRkZXZfZnJvbV9ic3NpZChwQWQsIEJTUzApOworCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UoT1NQS1RfVE9fUlRQS1QocFNrYiksIFBLVFNSQ19ORElTKTsKKworCS8vIGNvcHkgUnhECisJKnBTYXZlUnhEID0gKihQUlhJTkZPX1NUUlVDKShwRGF0YSArIFRoaXNGcmFtZUxlbik7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFNhdmVSeEQsIFRZUEVfUlhJTkZPKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisKKwkvLyB1cGRhdGUgbmV4dCBwYWNrZXQgcmVhZCBwb3NpdGlvbi4KKwlwQWQtPlJlYWRQb3NpdGlvbiArPSAoVGhpc0ZyYW1lTGVuICsgUlQyODcwX1JYRE1BTEVOX0ZJRUxEX1NJWkUgKyBSWElORk9fU0laRSk7CS8vIDggZm9yIChSVDI4NzBfUlhETUFMRU5fRklFTERfU0laRSArIHNpemVvZihSWElORk9fU1RSVUMpKQorCisJcmV0dXJuIHBTa2I7CisKK2xhYmVsX251bGw6CisKKwlyZXR1cm4gTlVMTDsKK30KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIEhhbmRsZSByZWNlaXZlZCBwYWNrZXRzLgorCitBcmd1bWVudHM6CisJZGF0YQkJCQktIFVSQiBpbmZvcm1hdGlvbiBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKyAgICBOb25lCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgdm9pZCByeF9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXB1cmJiX3QgCQkJcFVyYjsKKwlQUlhfQ09OVEVYVAkJCXBSeENvbnRleHQ7CisJUFJUTVBfQURBUFRFUgkJcEFkOworCU5UU1RBVFVTCQkJU3RhdHVzOworCXVuc2lnbmVkIGludAkJSXJxRmxhZ3M7CisKKwlwVXJiCQk9IChwdXJiYl90KWRhdGE7CisJcFJ4Q29udGV4dAk9IChQUlhfQ09OVEVYVClwVXJiLT5jb250ZXh0OworCXBBZCAJCT0gcFJ4Q29udGV4dC0+cEFkOworCVN0YXR1cyA9IHBVcmItPnN0YXR1czsKKworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisJcFJ4Q29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKKwlwUnhDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisJcFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0ICs9IHBVcmItPmFjdHVhbF9sZW5ndGg7CisJLy9OZGlzSW50ZXJsb2NrZWREZWNyZW1lbnQoJnBBZC0+UGVuZGluZ1J4KTsKKwlwQWQtPlBlbmRpbmdSeC0tOworCisJaWYgKFN0YXR1cyA9PSBVU0JfU1RfTk9FUlJPUikKKwl7CisJCXBBZC0+QnVsa0luQ29tcGxldGUrKzsKKwkJcEFkLT5OZXh0UnhCdWxrSW5Qb3NpdGlvbiA9IDA7CisJCWlmIChwUnhDb250ZXh0LT5CdWxrSW5PZmZzZXQpCS8vIEFzIGphbidzIGNvbW1lbnQsIGl0IG1heSBidWxrLWluIHN1Y2Nlc3MgYnV0IHNpemUgaXMgemVyby4KKwkJeworCQkJcFJ4Q29udGV4dC0+UmVhZGFibGUgPSBUUlVFOworCQkJSU5DX1JJTkdfSU5ERVgocEFkLT5OZXh0UnhCdWxrSW5JbmRleCwgUlhfUklOR19TSVpFKTsKKwkJfQorCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOworCX0KKwllbHNlCSAvLyBTVEFUVVNfT1RIRVIKKwl7CisJCXBBZC0+QnVsa0luQ29tcGxldGVGYWlsKys7CisJCS8vIFN0aWxsIHJlYWQgdGhpcyBwYWNrZXQgYWx0aG91Z2ggaXQgbWF5IGNvbXRhaW4gd3JvbmcgYnl0ZXMuCisJCXBSeENvbnRleHQtPlJlYWRhYmxlID0gRkFMU0U7CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisKKwkJLy8gUGFyc2luZyBhbGwgcGFja2V0cy4gYmVjYXVzZSBhZnRlciByZXNldCwgdGhlIGluZGV4IHdpbGwgcmVzZXQgdG8gYWxsIHplcm8uCisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9CVUxLSU5fUkVTRVQgfAorCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJCWZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKSkKKwkJeworCisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsayBJbiBGYWlsZWQuIFN0YXR1cz0lZCwgQklJZHg9MHgleCwgQklSSWR4PTB4JXgsIGFjdHVhbF9sZW5ndGg9IDB4JXhcbiIsCisJCQkJCQkJU3RhdHVzLCBwQWQtPk5leHRSeEJ1bGtJbkluZGV4LCBwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleCwgcFJ4Q29udGV4dC0+cFVyYi0+YWN0dWFsX2xlbmd0aCkpOworCisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLSU5fUkVTRVQpOworCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfUkVTRVRfQlVMS19JTiwgTlVMTCwgMCk7CisJCX0KKwl9CisKKwlBU1NFUlQoKHBSeENvbnRleHQtPkluVXNlID09IHBSeENvbnRleHQtPklSUFBlbmRpbmcpKTsKKworI2lmZGVmIFJBTElOS19BVEUKKwlpZiAoQVRFX09OKHBBZCkpCisgICAgeworCQkvLyBJZiB0aGUgZHJpdmVyIGlzIGluIEFURSBtb2RlIGFuZCBSeCBmcmFtZSBpcyBzZXQgaW50byBoZXJlLgorCQlpZiAocEFkLT5Db250aW5CdWxrSW4gPT0gVFJVRSkKKwkJeworCQkJUlRVU0JCdWxrUmVjZWl2ZShwQWQpOworCQl9CisJfQorCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJUlRVU0JCdWxrUmVjZWl2ZShwQWQpOworCisJcmV0dXJuOworCit9CisKKworc3RhdGljIHZvaWQgcnQyODcwX21nbXRfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkOworCVBUWF9DT05URVhUCQlwTUxNRUNvbnRleHQ7CisJaW50CQkJCWluZGV4OworCVBORElTX1BBQ0tFVAlwUGFja2V0OworCXB1cmJiX3QJCQlwVXJiOworCU5UU1RBVFVTCQlTdGF0dXM7CisJdW5zaWduZWQgbG9uZwlJcnFGbGFnczsKKworCisJcFVyYgkJCT0gKHB1cmJiX3QpZGF0YTsKKwlwTUxNRUNvbnRleHQJPSAoUFRYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKKwlwQWQgCQkJPSBwTUxNRUNvbnRleHQtPnBBZDsKKwlTdGF0dXMJCQk9IHBVcmItPnN0YXR1czsKKwlpbmRleCAJCQk9IHBNTE1FQ29udGV4dC0+U2VsZklkeDsKKworCUFTU0VSVCgocEFkLT5NZ210UmluZy5UeERtYUlkeCA9PSBpbmRleCkpOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tNR01UUElQRUlEWF0sIElycUZsYWdzKTsKKworCisJaWYgKFN0YXR1cyAhPSBVU0JfU1RfTk9FUlJPUikKKwl7CisJCS8vQnVsay1PdXQgZmFpbCBzdGF0dXMgaGFuZGxlCisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQorCQl7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsayBPdXQgTUxNRSBGYWlsZWQsIFN0YXR1cz0lZCFcbiIsIFN0YXR1cykpOworCQkJLy8gVE9ETzogSG93IHRvIGhhbmRsZSBhYm91dCB0aGUgTUxNRUJ1bGtPdXQgZmFpbGVkIGlzc3VlLiBOZWVkIHRvIHJlc2VuZCB0aGUgbWdtdCBwa3Q/CisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKTsKKwkJCXBBZC0+YnVsa1Jlc2V0UGlwZWlkID0gKE1HTVRQSVBFSURYIHwgQlVMS09VVF9NR01UX1JFU0VUX0ZMQUcpOworCQl9CisJfQorCisJcEFkLT5CdWxrT3V0UGVuZGluZ1tNR01UUElQRUlEWF0gPSBGQUxTRTsKKwlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbTUdNVFBJUEVJRFhdLCBJcnFGbGFncyk7CisKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPk1MTUVCdWxrT3V0TG9jaywgSXJxRmxhZ3MpOworCS8vIFJlc2V0IE1MTUUgY29udGV4dCBmbGFncworCXBNTE1FQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCXBNTE1FQ29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKKwlwTUxNRUNvbnRleHQtPmJXYWl0aW5nQnVsa091dCA9IEZBTFNFOworCXBNTE1FQ29udGV4dC0+QnVsa091dFNpemUgPSAwOworCisJcFBhY2tldCA9IHBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0ucE5kaXNQYWNrZXQ7CisJcEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5wTmRpc1BhY2tldCA9IE5VTEw7CisKKwkvLyBJbmNyZWFzZSBNZ210UmluZyBJbmRleAorCUlOQ19SSU5HX0lOREVYKHBBZC0+TWdtdFJpbmcuVHhEbWFJZHgsIE1HTVRfUklOR19TSVpFKTsKKwlwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4Kys7CisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPk1MTUVCdWxrT3V0TG9jaywgSXJxRmxhZ3MpOworCisJLy8gTm8tbWF0dGVyIHN1Y2Nlc3Mgb3IgZmFpbCwgd2UgZnJlZSB0aGUgbWdtdCBwYWNrZXQuCisJaWYgKHBQYWNrZXQpCisJCVJUTVBGcmVlTmRpc1BhY2tldChwQWQsIHBQYWNrZXQpOworCisJaWYgKChSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpKQorCXsKKwkJLy8gZG8gbm90aGluZyBhbmQgcmV0dXJuIGRpcmVjdGx5LgorCX0KKwllbHNlCisJeworCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpICYmCisJCQkoKHBBZC0+YnVsa1Jlc2V0UGlwZWlkICYgQlVMS09VVF9NR01UX1JFU0VUX0ZMQUcpID09IEJVTEtPVVRfTUdNVF9SRVNFVF9GTEFHKSkKKwkJewkvLyBGb3IgTWdtdCBCdWxrLU91dCBmYWlsZWQsIGlnbm9yZSBpdCBub3cuCisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCwgTlVMTCwgMCk7CisJCX0KKwkJZWxzZQorCQl7CisKKwkJCS8vIEFsd2F5cyBjYWxsIEJ1bGsgcm91dGluZSwgZXZlbiByZXNldCBidWxrLgorCQkJLy8gVGhlIHByb3RlY3Rpb29uIG9mIHJlc3QgYnVsayBzaG91bGQgYmUgaW4gQnVsa091dCByb3V0aW5lCisJCQlpZiAocEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA8IE1HTVRfUklOR19TSVpFIC8qIHBNTE1FQ29udGV4dC0+YldhaXRpbmdCdWxrT3V0ID09IFRSVUUgKi8pCisJCQl7CisJCQkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9NTE1FKTsKKwkJCX0KKwkJCQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisJCQl9CisJCX0KKworfQorCisKK3N0YXRpYyB2b2lkIHJ0Mjg3MF9oY2NhX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCVBSVE1QX0FEQVBURVIJCXBBZDsKKwlQSFRfVFhfQ09OVEVYVAkJcEhUVFhDb250ZXh0OworCVVDSEFSCQkJCUJ1bGtPdXRQaXBlSWQgPSA0OworCXB1cmJiX3QJCQkJcFVyYjsKKworCisJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIi0tLT5oY2NhX2RtYV9kb25lX3Rhc2tsZXRcbiIpKTsKKworCisJcFVyYgkJCT0gKHB1cmJiX3QpZGF0YTsKKwlwSFRUWENvbnRleHQJPSAoUEhUX1RYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKKwlwQWQJCQkJPSBwSFRUWENvbnRleHQtPnBBZDsKKworCXJ0Mjg3MF9kYXRhb3V0X2NvbXBsZXRlX3Rhc2tsZXQoKHVuc2lnbmVkIGxvbmcpcFVyYik7CisKKwlpZiAoKFJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpCisJeworCQkvLyBkbyBub3RoaW5nIGFuZCByZXR1cm4gZGlyZWN0bHkuCisJfQorCWVsc2UKKwl7CisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpCisJCXsKKwkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULCBOVUxMLCAwKTsKKwkJfQorCQllbHNlCisJCXsJcEhUVFhDb250ZXh0ID0gJnBBZC0+VHhDb250ZXh0W0J1bGtPdXRQaXBlSWRdOworCQkJaWYgKChwQWQtPlR4U3dRdWV1ZVtCdWxrT3V0UGlwZUlkXS5OdW1iZXIgPiAwKSAmJgorCQkJCS8qKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPiAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uICsgMHg2MDAwKSkgfHwgKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiA+IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArIDB4NjAwMCkpICYmICovCisJCQkJKHBBZC0+RGVRdWV1ZVJ1bm5pbmdbQnVsa091dFBpcGVJZF0gPT0gRkFMU0UpICYmCisJCQkJKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gRkFMU0UpKQorCQkJeworCQkJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIEJ1bGtPdXRQaXBlSWQsIE1BWF9UWF9QUk9DRVNTKTsKKwkJCX0KKworCQkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCk7CisJCQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisJCX0KKwl9CisKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiPC0tLWhjY2FfZG1hX2RvbmVfdGFza2xldFxuIikpOworCisJCXJldHVybjsKK30KKworCitzdGF0aWMgdm9pZCBydDI4NzBfYWMzX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCVBSVE1QX0FEQVBURVIJCXBBZDsKKwlQSFRfVFhfQ09OVEVYVAkJcEhUVFhDb250ZXh0OworCVVDSEFSCQkJCUJ1bGtPdXRQaXBlSWQgPSAzOworCXB1cmJiX3QJCQkJcFVyYjsKKworCisJcFVyYgkJCT0gKHB1cmJiX3QpZGF0YTsKKwlwSFRUWENvbnRleHQJPSAoUEhUX1RYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKKwlwQWQJCQkJPSBwSFRUWENvbnRleHQtPnBBZDsKKworCXJ0Mjg3MF9kYXRhb3V0X2NvbXBsZXRlX3Rhc2tsZXQoKHVuc2lnbmVkIGxvbmcpcFVyYik7CisKKwlpZiAoKFJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpCisJeworCQkvLyBkbyBub3RoaW5nIGFuZCByZXR1cm4gZGlyZWN0bHkuCisJfQorCWVsc2UKKwl7CisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpCisJCXsKKwkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULCBOVUxMLCAwKTsKKwkJfQorCQllbHNlCisJCXsJcEhUVFhDb250ZXh0ID0gJnBBZC0+VHhDb250ZXh0W0J1bGtPdXRQaXBlSWRdOworCQkJaWYgKChwQWQtPlR4U3dRdWV1ZVtCdWxrT3V0UGlwZUlkXS5OdW1iZXIgPiAwKSAmJgorCQkJCS8qKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPiAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uICsgMHg2MDAwKSkgfHwgKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiA+IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArIDB4NjAwMCkpICYmICovCisJCQkJKHBBZC0+RGVRdWV1ZVJ1bm5pbmdbQnVsa091dFBpcGVJZF0gPT0gRkFMU0UpICYmCisJCQkJKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gRkFMU0UpKQorCQkJeworCQkJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIEJ1bGtPdXRQaXBlSWQsIE1BWF9UWF9QUk9DRVNTKTsKKwkJCX0KKworCQkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTDw8Myk7CisJCQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisJCX0KKwl9CisKKworCQlyZXR1cm47Cit9CisKKworc3RhdGljIHZvaWQgcnQyODcwX2FjMl9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlQUlRNUF9BREFQVEVSCQlwQWQ7CisJUEhUX1RYX0NPTlRFWFQJCXBIVFRYQ29udGV4dDsKKwlVQ0hBUgkJCQlCdWxrT3V0UGlwZUlkID0gMjsKKwlwdXJiYl90CQkJCXBVcmI7CisKKworCXBVcmIJCQk9IChwdXJiYl90KWRhdGE7CisJcEhUVFhDb250ZXh0CT0gKFBIVF9UWF9DT05URVhUKXBVcmItPmNvbnRleHQ7CisJcEFkCQkJCT0gcEhUVFhDb250ZXh0LT5wQWQ7CisKKwlydDI4NzBfZGF0YW91dF9jb21wbGV0ZV90YXNrbGV0KCh1bnNpZ25lZCBsb25nKXBVcmIpOworCisJaWYgKChSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpKQorCXsKKwkJLy8gZG8gbm90aGluZyBhbmQgcmV0dXJuIGRpcmVjdGx5LgorCX0KKwllbHNlCisJeworCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpKQorCQl7CisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCwgTlVMTCwgMCk7CisJCX0KKwkJZWxzZQorCQl7CXBIVFRYQ29udGV4dCA9ICZwQWQtPlR4Q29udGV4dFtCdWxrT3V0UGlwZUlkXTsKKwkJCWlmICgocEFkLT5UeFN3UXVldWVbQnVsa091dFBpcGVJZF0uTnVtYmVyID4gMCkgJiYKKwkJCQkvKigocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID4gKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiArIDB4NjAwMCkpIHx8IChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gPiBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyAweDYwMDApKSAmJiAqLworCQkJCShwQWQtPkRlUXVldWVSdW5uaW5nW0J1bGtPdXRQaXBlSWRdID09IEZBTFNFKSAmJgorCQkJCShwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID09IEZBTFNFKSkKKwkJCXsKKwkJCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBCdWxrT3V0UGlwZUlkLCBNQVhfVFhfUFJPQ0VTUyk7CisJCQl9CisKKwkJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUw8PDIpOworCQkJUlRVU0JLaWNrQnVsa091dChwQWQpOworCQl9CisJfQorCisJCXJldHVybjsKK30KKworCitzdGF0aWMgdm9pZCBydDI4NzBfYWMxX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCVBSVE1QX0FEQVBURVIJCXBBZDsKKwlQSFRfVFhfQ09OVEVYVAkJcEhUVFhDb250ZXh0OworCVVDSEFSCQkJCUJ1bGtPdXRQaXBlSWQgPSAxOworCXB1cmJiX3QJCQkJcFVyYjsKKworCisJcFVyYgkJCT0gKHB1cmJiX3QpZGF0YTsKKwlwSFRUWENvbnRleHQJPSAoUEhUX1RYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKKwlwQWQJCQkJPSBwSFRUWENvbnRleHQtPnBBZDsKKworCXJ0Mjg3MF9kYXRhb3V0X2NvbXBsZXRlX3Rhc2tsZXQoKHVuc2lnbmVkIGxvbmcpcFVyYik7CisKKwlpZiAoKFJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpCisJeworCQkvLyBkbyBub3RoaW5nIGFuZCByZXR1cm4gZGlyZWN0bHkuCisJfQorCWVsc2UKKwl7CisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpCisJCXsKKwkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULCBOVUxMLCAwKTsKKwkJfQorCQllbHNlCisJCXsJcEhUVFhDb250ZXh0ID0gJnBBZC0+VHhDb250ZXh0W0J1bGtPdXRQaXBlSWRdOworCQkJaWYgKChwQWQtPlR4U3dRdWV1ZVtCdWxrT3V0UGlwZUlkXS5OdW1iZXIgPiAwKSAmJgorCQkJCS8qKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPiAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uICsgMHg2MDAwKSkgfHwgKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiA+IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArIDB4NjAwMCkpICYmICovCisJCQkJKHBBZC0+RGVRdWV1ZVJ1bm5pbmdbQnVsa091dFBpcGVJZF0gPT0gRkFMU0UpICYmCisJCQkJKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gRkFMU0UpKQorCQkJeworCQkJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIEJ1bGtPdXRQaXBlSWQsIE1BWF9UWF9QUk9DRVNTKTsKKwkJCX0KKworCQkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTDw8MSk7CisJCQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisJCX0KKwl9CisKKworCXJldHVybjsKK30KKworCitzdGF0aWMgdm9pZCBydDI4NzBfYWMwX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCVBSVE1QX0FEQVBURVIJCXBBZDsKKwlQSFRfVFhfQ09OVEVYVAkJcEhUVFhDb250ZXh0OworCVVDSEFSCQkJCUJ1bGtPdXRQaXBlSWQgPSAwOworCXB1cmJiX3QJCQkJcFVyYjsKKworCisJcFVyYgkJCT0gKHB1cmJiX3QpZGF0YTsKKwlwSFRUWENvbnRleHQJPSAoUEhUX1RYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKKwlwQWQJCQkJPSBwSFRUWENvbnRleHQtPnBBZDsKKworCXJ0Mjg3MF9kYXRhb3V0X2NvbXBsZXRlX3Rhc2tsZXQoKHVuc2lnbmVkIGxvbmcpcFVyYik7CisKKwlpZiAoKFJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpCisJeworCQkvLyBkbyBub3RoaW5nIGFuZCByZXR1cm4gZGlyZWN0bHkuCisJfQorCWVsc2UKKwl7CisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpCisJCXsKKwkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULCBOVUxMLCAwKTsKKwkJfQorCQllbHNlCisJCXsJcEhUVFhDb250ZXh0ID0gJnBBZC0+VHhDb250ZXh0W0J1bGtPdXRQaXBlSWRdOworCQkJaWYgKChwQWQtPlR4U3dRdWV1ZVtCdWxrT3V0UGlwZUlkXS5OdW1iZXIgPiAwKSAmJgorCQkJCS8qICAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA+IChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gKyAweDYwMDApKSB8fCAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uID4gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICsgMHg2MDAwKSkgJiYgKi8KKwkJCQkocEFkLT5EZVF1ZXVlUnVubmluZ1tCdWxrT3V0UGlwZUlkXSA9PSBGQUxTRSkgJiYKKwkJCQkocEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9PSBGQUxTRSkpCisJCQl7CisJCQkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgQnVsa091dFBpcGVJZCwgTUFYX1RYX1BST0NFU1MpOworCQkJfQorCisJCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMKTsKKwkJCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKKwkJfQorCX0KKworCisJcmV0dXJuOworCit9CisKKworc3RhdGljIHZvaWQgcnQyODcwX251bGxfZnJhbWVfY29tcGxldGVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJUFJUTVBfQURBUFRFUglwQWQ7CisJUFRYX0NPTlRFWFQJCXBOdWxsQ29udGV4dDsKKwlwdXJiYl90CQkJcFVyYjsKKwlOVFNUQVRVUwkJU3RhdHVzOworCXVuc2lnbmVkIGxvbmcJaXJxRmxhZzsKKworCisJcFVyYgkJCT0gKHB1cmJiX3QpZGF0YTsKKwlwTnVsbENvbnRleHQJPSAoUFRYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKKwlwQWQgCQkJPSBwTnVsbENvbnRleHQtPnBBZDsKKwlTdGF0dXMgCQkJPSBwVXJiLT5zdGF0dXM7CisKKwkvLyBSZXNldCBOdWxsIGZyYW1lIGNvbnRleHQgZmxhZ3MKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBpcnFGbGFnKTsKKwlwTnVsbENvbnRleHQtPklSUFBlbmRpbmcgCT0gRkFMU0U7CisJcE51bGxDb250ZXh0LT5JblVzZSAJCT0gRkFMU0U7CisJcEFkLT5CdWxrT3V0UGVuZGluZ1swXSA9IEZBTFNFOworCXBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbMF0gPSAwOworCisJaWYgKFN0YXR1cyA9PSBVU0JfU1RfTk9FUlJPUikKKwl7CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgaXJxRmxhZyk7CisKKwkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKKwl9CisJZWxzZQkvLyBTVEFUVVNfT1RIRVIKKwl7CisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQorCQl7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsayBPdXQgTnVsbCBGcmFtZSBGYWlsZWQsIFJlYXNvbkNvZGU9JWQhXG4iLCBTdGF0dXMpKTsKKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpOworCQkJcEFkLT5idWxrUmVzZXRQaXBlaWQgPSAoTUdNVFBJUEVJRFggfCBCVUxLT1VUX01HTVRfUkVTRVRfRkxBRyk7CisJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIGlycUZsYWcpOworCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQsIE5VTEwsIDApOworCQl9CisJCWVsc2UKKwkJeworCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBpcnFGbGFnKTsKKwkJfQorCX0KKworCS8vIEFsd2F5cyBjYWxsIEJ1bGsgcm91dGluZSwgZXZlbiByZXNldCBidWxrLgorCS8vIFRoZSBwcm90ZWN0aW9vbiBvZiByZXN0IGJ1bGsgc2hvdWxkIGJlIGluIEJ1bGtPdXQgcm91dGluZQorCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKKworfQorCisKK3N0YXRpYyB2b2lkIHJ0Mjg3MF9ydHNfZnJhbWVfY29tcGxldGVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJUFJUTVBfQURBUFRFUglwQWQ7CisJUFRYX0NPTlRFWFQJCXBSVFNDb250ZXh0OworCXB1cmJiX3QJCQlwVXJiOworCU5UU1RBVFVTCQlTdGF0dXM7CisJdW5zaWduZWQgbG9uZwlpcnFGbGFnOworCisKKwlwVXJiCQk9IChwdXJiYl90KWRhdGE7CisJcFJUU0NvbnRleHQJPSAoUFRYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKKwlwQWQJCQk9IHBSVFNDb250ZXh0LT5wQWQ7CisJU3RhdHVzCQk9IHBVcmItPnN0YXR1czsKKworCS8vIFJlc2V0IFJUUyBmcmFtZSBjb250ZXh0IGZsYWdzCisJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgaXJxRmxhZyk7CisJcFJUU0NvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwlwUlRTQ29udGV4dC0+SW5Vc2UJCT0gRkFMU0U7CisKKwlpZiAoU3RhdHVzID09IFVTQl9TVF9OT0VSUk9SKQorCXsKKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBpcnFGbGFnKTsKKwkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKKwl9CisJZWxzZQkvLyBTVEFUVVNfT1RIRVIKKwl7CisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQorCQl7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsayBPdXQgUlRTIEZyYW1lIEZhaWxlZFxuIikpOworCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCk7CisJCQlwQWQtPmJ1bGtSZXNldFBpcGVpZCA9IChNR01UUElQRUlEWCB8IEJVTEtPVVRfTUdNVF9SRVNFVF9GTEFHKTsKKwkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgaXJxRmxhZyk7CisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCwgTlVMTCwgMCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIGlycUZsYWcpOworCQl9CisJfQorCisJUlRNUF9TRU1fTE9DSygmcEFkLT5CdWxrT3V0TG9ja1twUlRTQ29udGV4dC0+QnVsa091dFBpcGVJZF0pOworCXBBZC0+QnVsa091dFBlbmRpbmdbcFJUU0NvbnRleHQtPkJ1bGtPdXRQaXBlSWRdID0gRkFMU0U7CisJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW3BSVFNDb250ZXh0LT5CdWxrT3V0UGlwZUlkXSk7CisKKwkvLyBBbHdheXMgY2FsbCBCdWxrIHJvdXRpbmUsIGV2ZW4gcmVzZXQgYnVsay4KKwkvLyBUaGUgcHJvdGVjdGlvb24gb2YgcmVzdCBidWxrIHNob3VsZCBiZSBpbiBCdWxrT3V0IHJvdXRpbmUKKwlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisKK30KKworCitzdGF0aWMgdm9pZCBydDI4NzBfcHNwb2xsX2ZyYW1lX2NvbXBsZXRlX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCVBSVE1QX0FEQVBURVIJcEFkOworCVBUWF9DT05URVhUCQlwUHNQb2xsQ29udGV4dDsKKwlwdXJiYl90CQkJcFVyYjsKKwlOVFNUQVRVUwkJU3RhdHVzOworCisKKwlwVXJiCQkJPSAocHVyYmJfdClkYXRhOworCXBQc1BvbGxDb250ZXh0CT0gKFBUWF9DT05URVhUKXBVcmItPmNvbnRleHQ7CisJcEFkCQkJCT0gcFBzUG9sbENvbnRleHQtPnBBZDsKKwlTdGF0dXMJCQk9IHBVcmItPnN0YXR1czsKKworCS8vIFJlc2V0IFBzUG9sbCBjb250ZXh0IGZsYWdzCisJcFBzUG9sbENvbnRleHQtPklSUFBlbmRpbmcJPSBGQUxTRTsKKwlwUHNQb2xsQ29udGV4dC0+SW5Vc2UJCT0gRkFMU0U7CisJcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFswXSA9IDA7CisKKwlpZiAoU3RhdHVzID09IFVTQl9TVF9OT0VSUk9SKQorCXsKKwkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKKwl9CisJZWxzZSAvLyBTVEFUVVNfT1RIRVIKKwl7CisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQorCQl7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsayBPdXQgUFNQb2xsIEZhaWxlZFxuIikpOworCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCk7CisJCQlwQWQtPmJ1bGtSZXNldFBpcGVpZCA9IChNR01UUElQRUlEWCB8IEJVTEtPVVRfTUdNVF9SRVNFVF9GTEFHKTsKKwkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULCBOVUxMLCAwKTsKKwkJfQorCX0KKworCVJUTVBfU0VNX0xPQ0soJnBBZC0+QnVsa091dExvY2tbMF0pOworCXBBZC0+QnVsa091dFBlbmRpbmdbMF0gPSBGQUxTRTsKKwlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0pOworCisJLy8gQWx3YXlzIGNhbGwgQnVsayByb3V0aW5lLCBldmVuIHJlc2V0IGJ1bGsuCisJLy8gVGhlIHByb3RlY3Rpb29uIG9mIHJlc3QgYnVsayBzaG91bGQgYmUgaW4gQnVsa091dCByb3V0aW5lCisJUlRVU0JLaWNrQnVsa091dChwQWQpOworCit9CisKKworc3RhdGljIHZvaWQgcnQyODcwX2RhdGFvdXRfY29tcGxldGVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJUFJUTVBfQURBUFRFUgkJcEFkOworCXB1cmJiX3QJCQkJcFVyYjsKKwlQT1NfQ09PS0lFCQkJcE9iajsKKwlQSFRfVFhfQ09OVEVYVAkJcEhUVFhDb250ZXh0OworCVVDSEFSCQkJCUJ1bGtPdXRQaXBlSWQ7CisJTlRTVEFUVVMJCQlTdGF0dXM7CisJdW5zaWduZWQgbG9uZwkJSXJxRmxhZ3M7CisKKworCXBVcmIJCQk9IChwdXJiYl90KWRhdGE7CisJcEhUVFhDb250ZXh0CT0gKFBIVF9UWF9DT05URVhUKXBVcmItPmNvbnRleHQ7CisJcEFkCQkJCT0gcEhUVFhDb250ZXh0LT5wQWQ7CisJcE9iaiAJCQk9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKwlTdGF0dXMJCQk9IHBVcmItPnN0YXR1czsKKworCS8vIFN0b3JlIEJ1bGtPdXQgUGlwZUlkCisJQnVsa091dFBpcGVJZCA9IHBIVFRYQ29udGV4dC0+QnVsa091dFBpcGVJZDsKKwlwQWQtPkJ1bGtPdXREYXRhT25lU2VjQ291bnQrKzsKKworCS8vREJHUFJJTlQoUlRfREVCVUdfTE9VRCwgKCJEb25lLUIoJWQpOkk9MHglbHgsIENXUG9zPSVsZCwgTkJQb3M9JWxkLCBFTkJQb3M9JWxkLCBiQ29weT0lZCFcbiIsIEJ1bGtPdXRQaXBlSWQsIGluX2ludGVycnVwdCgpLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sCisJLy8JCXBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQpKTsKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwlwQWQtPkJ1bGtPdXRQZW5kaW5nW0J1bGtPdXRQaXBlSWRdID0gRkFMU0U7CisJcEhUVFhDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisJcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFtCdWxrT3V0UGlwZUlkXSA9IDA7CisKKwlpZiAoU3RhdHVzID09IFVTQl9TVF9OT0VSUk9SKQorCXsKKwkJcEFkLT5CdWxrT3V0Q29tcGxldGUrKzsKKworCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKworCQlwQWQtPkNvdW50ZXJzODAyMy5Hb29kVHJhbnNtaXRzKys7CisJCS8vUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwkJRlJFRV9IVFRYX1JJTkcocEFkLCBCdWxrT3V0UGlwZUlkLCBwSFRUWENvbnRleHQpOworCQkvL1JUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKworCisJfQorCWVsc2UJLy8gU1RBVFVTX09USEVSCisJeworCQlQVUNIQVIJcEJ1ZjsKKworCQlwQWQtPkJ1bGtPdXRDb21wbGV0ZU90aGVyKys7CisKKwkJcEJ1ZiA9ICZwSFRUWENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb25dOworCisJCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCAoZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8CisJCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUIHwKKwkJCQkJCQkJCWZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQorCQl7CisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKTsKKwkJCXBBZC0+YnVsa1Jlc2V0UGlwZWlkID0gQnVsa091dFBpcGVJZDsKKwkJCXBBZC0+YnVsa1Jlc2V0UmVxW0J1bGtPdXRQaXBlSWRdID0gcEFkLT5CdWxrT3V0UmVxOworCQl9CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJCdWxrT3V0RGF0YVBhY2tldCBmYWlsZWQ6IFJlYXNvbkNvZGU9JWQhXG4iLCBTdGF0dXMpKTsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIlx0Pj5CdWxrT3V0IFJlcT0weCVseCwgQ29tcGxldGU9MHglbHgsIE90aGVyPTB4JWx4XG4iLCBwQWQtPkJ1bGtPdXRSZXEsIHBBZC0+QnVsa091dENvbXBsZXRlLCBwQWQtPkJ1bGtPdXRDb21wbGV0ZU90aGVyKSk7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJcdD4+QnVsa091dCBIZWFkZXI6JXggJXggJXggJXggJXggJXggJXggJXhcbiIsIHBCdWZbMF0sIHBCdWZbMV0sIHBCdWZbMl0sIHBCdWZbM10sIHBCdWZbNF0sIHBCdWZbNV0sIHBCdWZbNl0sIHBCdWZbN10pKTsKKwkJLy9EQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiPj5CdWxrT3V0Q29tcGxldGVDYW5jZWw9MHgleCwgQnVsa091dENvbXBsZXRlT3RoZXI9MHgleFxuIiwgcEFkLT5CdWxrT3V0Q29tcGxldGVDYW5jZWwsIHBBZC0+QnVsa091dENvbXBsZXRlT3RoZXIpKTsKKworCX0KKworCS8vCisJLy8gYkluVXNlID0gVFJVRSwgbWVhbnMgc29tZSBwcm9jZXNzIGFyZSBmaWxsaW5nIFRYIGRhdGEsIGFmdGVyIHRoYXQgbXVzdCB0dXJuIG9uIGJXYWl0aW5nQnVsa091dAorCS8vIGJXYWl0aW5nQnVsa091dCA9IFRSVUUsIG1lYW5zIHRoZSBUWCBkYXRhIGFyZSB3YWl0aW5nIGZvciBidWxrIG91dC4KKwkvLworCS8vUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwlpZiAoKHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gIT0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSAmJgorCQkocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiAhPSAocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKzgpKSAmJgorCQkhUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfRlJBRyA8PCBCdWxrT3V0UGlwZUlkKSkpCisJeworCQkvLyBJbmRpY2F0ZSBUaGVyZSBpcyBkYXRhIGF2YWxpYWJsZQorCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCBCdWxrT3V0UGlwZUlkKSk7CisJfQorCS8vUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCisJLy8gQWx3YXlzIGNhbGwgQnVsayByb3V0aW5lLCBldmVuIHJlc2V0IGJ1bGsuCisJLy8gVGhlIHByb3RlY3Rpb24gb2YgcmVzdCBidWxrIHNob3VsZCBiZSBpbiBCdWxrT3V0IHJvdXRpbmUKKwlSVFVTQktpY2tCdWxrT3V0KHBBZCk7Cit9CisKKy8qIEVuZCBvZiAyODcwX3J0bXBfaW5pdC5jICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9hY3Rpb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2FjdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNDhhN2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9hY3Rpb24uYwpAQCAtMCwwICsxLDEwNDYgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisJYWN0aW9uLmMKKworICAgIEFic3RyYWN0OgorICAgIEhhbmRsZSBhc3NvY2lhdGlvbiByZWxhdGVkIHJlcXVlc3RzIGVpdGhlciBmcm9tIFdTVEEgb3IgZnJvbSBsb2NhbCBNTE1FCisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUphbiBMZWUJCTIwMDYJICAJY3JlYXRlZCBmb3IgcnQyODYwCisgKi8KKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorI2luY2x1ZGUgImFjdGlvbi5oIgorCisKK3N0YXRpYyBWT0lEIFJlc2VydmVkQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgYXNzb2NpYXRpb24gc3RhdGUgbWFjaGluZSBpbml0LCBpbmNsdWRpbmcgc3RhdGUgdHJhbnNpdGlvbiBhbmQgdGltZXIgaW5pdAorICAgIFBhcmFtZXRlcnM6CisgICAgICAgIFMgLSBwb2ludGVyIHRvIHRoZSBhc3NvY2lhdGlvbiBzdGF0ZSBtYWNoaW5lCisgICAgTm90ZToKKyAgICAgICAgVGhlIHN0YXRlIG1hY2hpbmUgbG9va3MgbGlrZSB0aGUgZm9sbG93aW5nCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTU09DX0lETEUKKyAgICAgICAgTVQyX01MTUVfRElTQVNTT0NfUkVRICAgIG1sbWVfZGlzYXNzb2NfcmVxX2FjdGlvbgorICAgICAgICBNVDJfUEVFUl9ESVNBU1NPQ19SRVEgICAgcGVlcl9kaXNhc3NvY19hY3Rpb24KKyAgICAgICAgTVQyX1BFRVJfQVNTT0NfUkVRICAgICAgIGRyb3AKKyAgICAgICAgTVQyX1BFRVJfUkVBU1NPQ19SRVEgICAgIGRyb3AKKyAgICAgICAgTVQyX0NMUzNFUlIgICAgICAgICAgICAgIGNsczNlcnJfYWN0aW9uCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBY3Rpb25TdGF0ZU1hY2hpbmVJbml0KAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorICAgIElOICBTVEFURV9NQUNISU5FICpTLAorICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKK3sKKwlTdGF0ZU1hY2hpbmVJbml0KFMsIChTVEFURV9NQUNISU5FX0ZVTkMgKilUcmFucywgTUFYX0FDVF9TVEFURSwgTUFYX0FDVF9NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpRHJvcCwgQUNUX0lETEUsIEFDVF9NQUNISU5FX0JBU0UpOworCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9TUEVDVFJVTV9DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJTcGVjdHJ1bUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9RT1NfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyUU9TQWN0aW9uKTsKKworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfRExTX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpUmVzZXJ2ZWRBY3Rpb24pOworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9QRUVSX0RMU19DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJETFNBY3Rpb24pOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9CQV9DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJCQUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9IVF9DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJIVEFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfTUxNRV9BRERfQkFfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lQUREQkFBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX01MTUVfT1JJX0RFTEJBX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZURFTEJBQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9NTE1FX1JFQ19ERUxCQV9DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVERUxCQUFjdGlvbik7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9QRUVSX1BVQkxJQ19DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJQdWJsaWNBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfUk1fQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyUk1BY3Rpb24pOworCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfTUxNRV9RT1NfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lUU9TQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9NTE1FX0RMU19DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVETFNBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX0FDVF9JTlZBTElELCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVJbnZhbGlkQWN0aW9uKTsKK30KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVk9JRCBNbG1lQUREQkFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQorCit7CisJTUxNRV9BRERCQV9SRVFfU1RSVUNUICpwSW5mbzsKKwlVQ0hBUiAgICAgICAgICAgQWRkcls2XTsKKwlQVUNIQVIgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUyAgICAgTlN0YXR1czsKKwlVTE9ORwkJSWR4OworCUZSQU1FX0FEREJBX1JFUSAgRnJhbWU7CisJVUxPTkcJCUZyYW1lTGVuOworCUJBX09SSV9FTlRSWQkJCSpwQkFFbnRyeSA9IE5VTEw7CisKKwlwSW5mbyA9IChNTE1FX0FEREJBX1JFUV9TVFJVQ1QgKilFbGVtLT5Nc2c7CisJTmRpc1plcm9NZW1vcnkoJkZyYW1lLCBzaXplb2YoRlJBTUVfQUREQkFfUkVRKSk7CisKKwlpZihNbG1lQWRkQkFSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcikpCisJeworCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkEgLSBNbG1lQUREQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQkJcmV0dXJuOworCQl9CisJCS8vIDEuIGZpbmQgZW50cnkKKwkJSWR4ID0gcEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uQkFPcmlXY2lkQXJyYXlbcEluZm8tPlRJRF07CisJCWlmIChJZHggPT0gMCkKKwkJeworCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQkEgLSBNbG1lQUREQkFBY3Rpb24oKSBjYW4ndCBmaW5kIEJBT3JpRW50cnkgXG4iKSk7CisJCQlyZXR1cm47CisJCX0KKwkJZWxzZQorCQl7CisJCQlwQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W0lkeF07CisJCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQlpZiAoQURIT0NfT04ocEFkKSkKKwkJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEluZm8tPnBBZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQllbHNlCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCQlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uVmFsaWRBc0RscykKKwkJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEluZm8tPnBBZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQllbHNlCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCQkJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwSW5mby0+cEFkZHIpOworCisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQlGcmFtZS5DYXRlZ29yeSA9IENBVEVHT1JZX0JBOworCQlGcmFtZS5BY3Rpb24gPSBBRERCQV9SRVE7CisJCUZyYW1lLkJhUGFybS5BTVNEVVN1cHBvcnRlZCA9IDA7CisJCUZyYW1lLkJhUGFybS5CQVBvbGljeSA9IElNTUVEX0JBOworCQlGcmFtZS5CYVBhcm0uVElEID0gcEluZm8tPlRJRDsKKwkJRnJhbWUuQmFQYXJtLkJ1ZlNpemUgPSBwSW5mby0+QmFCdWZTaXplOworCQlGcmFtZS5Ub2tlbiA9IHBJbmZvLT5Ub2tlbjsKKwkJRnJhbWUuVGltZU91dFZhbHVlID0gcEluZm8tPlRpbWVPdXRWYWx1ZTsKKwkJRnJhbWUuQmFTdGFydFNlcS5maWVsZC5GcmFnTnVtID0gMDsKKwkJRnJhbWUuQmFTdGFydFNlcS5maWVsZC5TdGFydFNlcSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLlR4U2VxW3BJbmZvLT5USURdOworCisJCSooVVNIT1JUICopKCZGcmFtZS5CYVBhcm0pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJkZyYW1lLkJhUGFybSkpOworCQlGcmFtZS5UaW1lT3V0VmFsdWUgPSBjcHUybGUxNihGcmFtZS5UaW1lT3V0VmFsdWUpOworCQlGcmFtZS5CYVN0YXJ0U2VxLndvcmQgPSBjcHUybGUxNihGcmFtZS5CYVN0YXJ0U2VxLndvcmQpOworCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkgICAmRnJhbWVMZW4sCisJCSAgICAgICAgICAgICAgc2l6ZW9mKEZSQU1FX0FEREJBX1JFUSksICZGcmFtZSwKKwkJICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7CisJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkEgLSBTZW5kIEFEREJBIHJlcXVlc3QuIFN0YXJ0U2VxID0gJXgsICBGcmFtZUxlbiA9ICVsZC4gQnVmU2l6ZSA9ICVkXG4iLCBGcmFtZS5CYVN0YXJ0U2VxLmZpZWxkLlN0YXJ0U2VxLCBGcmFtZUxlbiwgRnJhbWUuQmFQYXJtLkJ1ZlNpemUpKTsKKyAgICB9Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgc2VuZCBERUxCQSBhbmQgZGVsZXRlIEJhRW50cnkgaWYgYW55CisgICAgUGFyYW1ldHJzOgorICAgICAgICBFbGVtIC0gTUxNRSBtZXNzYWdlIE1MTUVfREVMQkFfUkVRX1NUUlVDVAorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVERUxCQUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJTUxNRV9ERUxCQV9SRVFfU1RSVUNUICpwSW5mbzsKKwlQVUNIQVIgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlQVUNIQVIJCSAgIHBPdXRCdWZmZXIyID0gTlVMTDsKKwlORElTX1NUQVRVUyAgICAgTlN0YXR1czsKKwlVTE9ORwkJSWR4OworCUZSQU1FX0RFTEJBX1JFUSAgRnJhbWU7CisJVUxPTkcJCUZyYW1lTGVuOworCUZSQU1FX0JBUglGcmFtZUJhcjsKKworCXBJbmZvID0gKE1MTUVfREVMQkFfUkVRX1NUUlVDVCAqKUVsZW0tPk1zZzsKKwkvLyBtdXN0IHNlbmQgYmFjayBERUxCQQorCU5kaXNaZXJvTWVtb3J5KCZGcmFtZSwgc2l6ZW9mKEZSQU1FX0RFTEJBX1JFUSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBNbG1lREVMQkFBY3Rpb24oKSwgSW5pdGlhdG9yKCVkKSBcbiIsIHBJbmZvLT5Jbml0aWF0b3IpKTsKKworCWlmKE1sbWVEZWxCQVJlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKSkKKwl7CisJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJCQSAtIE1sbWVERUxCQUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgMS4gXG4iKSk7CisJCQlyZXR1cm47CisJCX0KKworCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwkJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQkEgLSBNbG1lREVMQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIDIuIFxuIikpOworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gU0VORCBCQVIgKFNlbmQgQkFSIHRvIHJlZnJlc2ggcGVlciByZW9yZGVyaW5nIGJ1ZmZlci4pCisJCUlkeCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkJBT3JpV2NpZEFycmF5W3BJbmZvLT5USURdOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQlCYXJIZWFkZXJJbml0KHBBZCwgJkZyYW1lQmFyLCBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5BZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQlGcmFtZUJhci5TdGFydGluZ1NlcS5maWVsZC5GcmFnTnVtID0gMDsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCisJCUZyYW1lQmFyLlN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxID0gcEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uVHhTZXFbcEluZm8tPlRJRF07IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgorCQlGcmFtZUJhci5CYXJDb250cm9sLlRJRCA9IHBJbmZvLT5USUQ7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgorCQlGcmFtZUJhci5CYXJDb250cm9sLkFDS1BvbGljeSA9IElNTUVEX0JBOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KKwkJRnJhbWVCYXIuQmFyQ29udHJvbC5Db21wcmVzc2VkID0gMTsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCisJCUZyYW1lQmFyLkJhckNvbnRyb2wuTVRJRCA9IDA7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgorCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIyLAkJCQkmRnJhbWVMZW4sCisJCQkJCSAgc2l6ZW9mKEZSQU1FX0JBUiksCSAgJkZyYW1lQmFyLAorCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIyLCBGcmFtZUxlbik7CisJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcjIpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJBIC0gTWxtZURFTEJBQWN0aW9uKCkgLiBTZW5kIEJBUiB0byByZWZyZXNoIHBlZXIgcmVvcmRlcmluZyBidWZmZXIgXG4iKSk7CisKKwkJLy8gU0VORCBERUxCQSBGUkFNRQorCQlGcmFtZUxlbiA9IDA7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCWlmIChBREhPQ19PTihwQWQpKQorCQkJCUFjdEhlYWRlckluaXQocEFkLCAmRnJhbWUuSGRyLCBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5BZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQllbHNlCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCQlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uVmFsaWRBc0RscykKKwkJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQkJCUFjdEhlYWRlckluaXQocEFkLCAmRnJhbWUuSGRyLCAgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkFkZHIpOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCUZyYW1lLkNhdGVnb3J5ID0gQ0FURUdPUllfQkE7CisJCUZyYW1lLkFjdGlvbiA9IERFTEJBOworCQlGcmFtZS5EZWxiYVBhcm0uSW5pdGlhdG9yID0gcEluZm8tPkluaXRpYXRvcjsKKwkJRnJhbWUuRGVsYmFQYXJtLlRJRCA9IHBJbmZvLT5USUQ7CisJCUZyYW1lLlJlYXNvbkNvZGUgPSAzOTsgLy8gVGltZSBPdXQKKwkJKihVU0hPUlQgKikoJkZyYW1lLkRlbGJhUGFybSkgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmRnJhbWUuRGVsYmFQYXJtKSk7CisJCUZyYW1lLlJlYXNvbkNvZGUgPSBjcHUybGUxNihGcmFtZS5SZWFzb25Db2RlKTsKKworCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKwkJICAgICAgICAgICAgICBzaXplb2YoRlJBTUVfREVMQkFfUkVRKSwgICAgJkZyYW1lLAorCQkgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKwkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkEgLSBNbG1lREVMQkFBY3Rpb24oKSAuIDMgREVMQkEgc2VudC4gSW5pdGlhdG9yKCVkKVxuIiwgcEluZm8tPkluaXRpYXRvcikpOworICAgIAl9Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK1ZPSUQgTWxtZVFPU0FjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7Cit9CisKK1ZPSUQgTWxtZURMU0FjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7Cit9CisKK1ZPSUQgTWxtZUludmFsaWRBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCS8vUFVDSEFSCQkgICBwT3V0QnVmZmVyID0gTlVMTDsKKwkvL1JldHVybiB0aGUgcmVjZWl2aW5nIGZyYW1lIGV4Y2VwdCB0aGUgTVNCIG9mIGNhdGVnb3J5IGZpbGVkIHNldCB0byAxLiAgNy4zLjEuMTEKK30KKworVk9JRCBQZWVyUU9TQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKK30KKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorVk9JRCBQZWVyRExTQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUglBY3Rpb24gPSBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsxXTsKKworCXN3aXRjaChBY3Rpb24pCisJeworCQljYXNlIEFDVElPTl9ETFNfUkVRVUVTVDoKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQlQZWVyRGxzUmVxQWN0aW9uKHBBZCwgRWxlbSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQlicmVhazsKKworCQljYXNlIEFDVElPTl9ETFNfUkVTUE9OU0U6CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJUGVlckRsc1JzcEFjdGlvbihwQWQsIEVsZW0pOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1RJT05fRExTX1RFQVJET1dOOgorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCVBlZXJEbHNUZWFyRG93bkFjdGlvbihwQWQsIEVsZW0pOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJYnJlYWs7CisJfQorfQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitWT0lEIFBlZXJCQUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVUNIQVIJQWN0aW9uID0gRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMV07CisKKwlzd2l0Y2goQWN0aW9uKQorCXsKKwkJY2FzZSBBRERCQV9SRVE6CisJCQlQZWVyQWRkQkFSZXFBY3Rpb24ocEFkLEVsZW0pOworCQkJYnJlYWs7CisJCWNhc2UgQUREQkFfUkVTUDoKKwkJCVBlZXJBZGRCQVJzcEFjdGlvbihwQWQsRWxlbSk7CisJCQlicmVhazsKKwkJY2FzZSBERUxCQToKKwkJCVBlZXJEZWxCQUFjdGlvbihwQWQsRWxlbSk7CisJCQlicmVhazsKKwl9Cit9CisKKworI2lmZGVmIERPVDExTl9EUkFGVDMKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorVk9JRCBTdGFQdWJsaWNBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgQnNzMjA0MENvZXhpc3QpCit7CisJQlNTXzIwNDBfQ09FWElTVF9JRQkJQnNzQ29leGlzdDsKKwlNTE1FX1NDQU5fUkVRX1NUUlVDVAkJCVNjYW5SZXE7CisKKwlCc3NDb2V4aXN0LndvcmQgPSBCc3MyMDQwQ29leGlzdDsKKwkvLyBBUCBhc2tzIFN0YXRpb24gdG8gcmV0dXJuIGEgMjAvNDAgQlNTIENvZXhpc3RlbmNlIG1nbXQgZnJhbWUuICBTbyB3ZSBmaXJzdCBzdGFydHMgYSBzY2FuLCB0aGVuIHNlbmQgYmFjayAyMC80MCBCU1MgQ29leGlzdGVuY2UgbWdtdCBmcmFtZQorCWlmICgoQnNzQ29leGlzdC5maWVsZC5JbmZvUmVxID09IDEpICYmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NDQU5fMjA0MCkpKQorCXsKKwkJLy8gQ2xlYXIgcmVjb3JkIGZpcnN0LiAgQWZ0ZXIgc2NhbiAsIHdpbGwgdXBkYXRlIHRob3NlIGJpdCBhbmQgc2VuZCBiYWNrIHRvIHRyYW5zbWl0ZXIuCisJCXBBZC0+Q29tbW9uQ2ZnLkJTU0NvZXhpc3QyMDQwLmZpZWxkLkluZm9SZXEgPSAxOworCQlwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC5maWVsZC5JbnRvbGVyYW50NDAgPSAwOworCQlwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC5maWVsZC5CU1MyMFdpZHRoUmVxID0gMDsKKwkJLy8gRmlsbCBvdXQgc3R1ZmYgZm9yIHNjYW4gcmVxdWVzdAorCQlTY2FuUGFybUZpbGwocEFkLCAmU2NhblJlcSwgWmVyb1NzaWQsIDAsIEJTU19BTlksIFNDQU5fMjA0MF9CU1NfQ09FWElTVCk7CisJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TQ0FOX1JFUSwgc2l6ZW9mKE1MTUVfU0NBTl9SRVFfU1RSVUNUKSwgJlNjYW5SZXEpOworCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47CisJfQorfQorCisKKy8qCitEZXNjcmlwdGlvbiA6IEJ1aWxkIEludG9sZXJhbnQgQ2hhbm5lbCBSZXJwb3QgZnJvbSBUcmlnZ2VyIGV2ZW50IHRhYmxlLgorcmV0dXJuIDogaG93IG1hbnkgYnl0ZXMgY29waWVkLgorKi8KK1VMT05HIEJ1aWxkSW50b2xlcmFudENoYW5uZWxSZXAoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gICAgUFVDSEFSICBwRGVzdCkKK3sKKwlVTE9ORwkJCUZyYW1lTGVuID0gMDsKKwlVTE9ORwkJCVJlYWRPZmZzZXQgPSAwOworCVVDSEFSCQkJaTsKKwlVQ0hBUgkJCUxhc3RSZWdDbGFzcyA9IDB4ZmY7CisJUFVDSEFSCQkJcExlbjsKKworCWZvciAoIGkgPSAwO2kgPCBNQVhfVFJJR0dFUl9FVkVOVDtpKyspCisJeworCQlpZiAocEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5iVmFsaWQgPT0gVFJVRSkKKwkJeworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFbaV0uUmVnQ2xhc3MgPT0gTGFzdFJlZ0NsYXNzKQorCQkJeworCQkJCSoocERlc3QgKyBSZWFkT2Zmc2V0KSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLkNoYW5uZWw7CisJCQkJKnBMZW4rKzsKKwkJCQlSZWFkT2Zmc2V0Kys7CisJCQkJRnJhbWVMZW4rKzsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkqKHBEZXN0ICsgUmVhZE9mZnNldCkgPSBJRV8yMDQwX0JTU19JTlRPTEVSQU5UX1JFUE9SVDsgIC8vIElFCisJCQkJKihwRGVzdCArIFJlYWRPZmZzZXQgKyAxKSA9IDI7CS8vIExlbiA9IFJlZ0NsYXNzIGJ5dGUgKyBjaGFubmVsIGJ5dGUuCisJCQkJcExlbiA9IHBEZXN0ICsgUmVhZE9mZnNldCArIDE7CisJCQkJTGFzdFJlZ0NsYXNzID0gcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5SZWdDbGFzczsKKwkJCQkqKHBEZXN0ICsgUmVhZE9mZnNldCArIDIpID0gTGFzdFJlZ0NsYXNzOwkvLyBMZW4gPSBSZWdDbGFzcyBieXRlICsgY2hhbm5lbCBieXRlLgorCQkJCSoocERlc3QgKyBSZWFkT2Zmc2V0ICsgMykgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5DaGFubmVsOworCQkJCUZyYW1lTGVuICs9IDQ7CisJCQkJUmVhZE9mZnNldCArPSA0OworCQkJfQorCisJCX0KKwl9CisJcmV0dXJuIEZyYW1lTGVuOworfQorCisKKy8qCitEZXNjcmlwdGlvbiA6IFNlbmQgMjAvNDAgQlNTIENvZXhpc3RlbmNlIEFjdGlvbiBmcmFtZSBJZiBvbmUgdHJpZ2dlciBldmVudCBpcyB0cmlnZ2VyZWQuCisqLworVk9JRCBTZW5kMjA0MENvZXhpc3RBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gICAgVUNIQVIgIFdjaWQsCisJSU4JQk9PTEVBTgliQWRkSW50b2xlcmFudENoYSkKK3sKKwlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUyAJTlN0YXR1czsKKwlGUkFNRV9BQ1RJT05fSERSCUZyYW1lOworCVVMT05HCQkJRnJhbWVMZW47CisJVUxPTkcJCQlJbnRvbGVyYW50Q2hhUmVwTGVuOworCisJSW50b2xlcmFudENoYVJlcExlbiA9IDA7CisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkFDVCAtIFNlbmQyMDQwQ29leGlzdEFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CisJCXJldHVybjsKKwl9CisJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCUZyYW1lLkNhdGVnb3J5ID0gQ0FURUdPUllfUFVCTElDOworCUZyYW1lLkFjdGlvbiA9IEFDVElPTl9CU1NfMjA0MF9DT0VYSVNUOworCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAorCQkJCSAgc2l6ZW9mKEZSQU1FX0FDVElPTl9IRFIpLAkgICZGcmFtZSwKKwkJCQkgIEVORF9PRl9BUkdTKTsKKworCSoocE91dEJ1ZmZlciArIEZyYW1lTGVuKSA9IHBBZC0+Q29tbW9uQ2ZnLkJTU0NvZXhpc3QyMDQwLndvcmQ7CisJRnJhbWVMZW4rKzsKKworCWlmIChiQWRkSW50b2xlcmFudENoYSA9PSBUUlVFKQorCQlJbnRvbGVyYW50Q2hhUmVwTGVuID0gQnVpbGRJbnRvbGVyYW50Q2hhbm5lbFJlcChwQWQsIHBPdXRCdWZmZXIgKyBGcmFtZUxlbik7CisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4gKyBJbnRvbGVyYW50Q2hhUmVwTGVuKTsKKwlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkFDVCAtIFNlbmQyMDQwQ29leGlzdEFjdGlvbiggQlNTQ29leGlzdDIwNDAgPSAweCV4ICkgIFxuIiwgcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAud29yZCkpOworCit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCUFmdGVyIHNjYW4sIFVwZGF0ZSAyMC80MCBCU1MgQ29leGlzdGVuY2UgSUUgYW5kIHNlbmQgb3V0LgorCUFjY29yZGluZyB0byA4MDIuMTFuIEQzLjAzIDExLjE0LjEwCisKKwlQYXJhbWV0ZXJzOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgVXBkYXRlMjA0MENvZXhpc3RGcmFtZUFuZE5vdGlmeSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgICBVQ0hBUiAgV2NpZCwKKwlJTglCT09MRUFOCWJBZGRJbnRvbGVyYW50Q2hhKQoreworCUJTU18yMDQwX0NPRVhJU1RfSUUJT2xkVmFsdWU7CisKKwlPbGRWYWx1ZS53b3JkID0gcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAud29yZDsKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFObyA+IDApIHx8IChwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRCQ291bnREb3duID4gMCkpCisJCXBBZC0+Q29tbW9uQ2ZnLkJTU0NvZXhpc3QyMDQwLmZpZWxkLkJTUzIwV2lkdGhSZXEgPSAxOworCisJLy8gTmVlZCB0byBjaGVjayAhISEhCisJLy8gSG93IFNUQSB3aWxsIHNldCBJbnRvbGVyYW50NDAgaWYgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50LiBOb3cgd2UgZG9uJ3Qgc2V0IHRoaXMgYml0IGZpcnN0LiEhISEhCisJLy8gU28gT25seSBjaGVjayBCU1MyMFdpZHRoUmVxIGNoYW5nZS4KKwlpZiAoT2xkVmFsdWUuZmllbGQuQlNTMjBXaWR0aFJlcSAhPSBwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC5maWVsZC5CU1MyMFdpZHRoUmVxKQorCXsKKwkJU2VuZDIwNDBDb2V4aXN0QWN0aW9uKHBBZCwgV2NpZCwgYkFkZEludG9sZXJhbnRDaGEpOworCX0KK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCitCT09MRUFOIENoYW5uZWxTd2l0Y2hTYW5pdHlDaGVjaygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgICBVQ0hBUiAgV2NpZCwKKwlJTiAgICBVQ0hBUiAgTmV3Q2hhbm5lbCwKKwlJTiAgICBVQ0hBUiAgU2Vjb25kYXJ5KQoreworCVVDSEFSCQlpOworCisJaWYgKFdjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCXJldHVybiBGQUxTRTsKKworCWlmICgoTmV3Q2hhbm5lbCA+IDcpICYmIChTZWNvbmRhcnkgPT0gMSkpCisJCXJldHVybiBGQUxTRTsKKworCWlmICgoTmV3Q2hhbm5lbCA8IDUpICYmIChTZWNvbmRhcnkgPT0gMykpCisJCXJldHVybiBGQUxTRTsKKworCS8vIDAuIENoZWNrIGlmIG5ldyBjaGFubmVsIGlzIGluIHRoZSBjaGFubmVsbGlzdC4KKwlmb3IgKGkgPSAwO2kgPCBwQWQtPkNoYW5uZWxMaXN0TnVtO2krKykKKwl7CisJCWlmIChwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwgPT0gTmV3Q2hhbm5lbCkKKwkJeworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoaSA9PSBwQWQtPkNoYW5uZWxMaXN0TnVtKQorCQlyZXR1cm4gRkFMU0U7CisKKwlyZXR1cm4gVFJVRTsKK30KKworCitWT0lEIENoYW5uZWxTd2l0Y2hBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gICAgVUNIQVIgIFdjaWQsCisJSU4gICAgVUNIQVIgIE5ld0NoYW5uZWwsCisJSU4gICAgVUNIQVIgIFNlY29uZGFyeSkKK3sKKwlVQ0hBUgkJQkJQVmFsdWUgPSAwOworCVVMT05HCQlNQUNWYWx1ZTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU1BFQ1RSVU0gLSBDaGFubmVsU3dpdGNoQWN0aW9uKE5ld0NoYW5uZWwgPSAlZCAsIFNlY29uZGFyeSA9ICVkKSAgXG4iLCBOZXdDaGFubmVsLCBTZWNvbmRhcnkpKTsKKworCWlmIChDaGFubmVsU3dpdGNoU2FuaXR5Q2hlY2socEFkLCBXY2lkLCBOZXdDaGFubmVsLCBTZWNvbmRhcnkpID09IEZBTFNFKQorCQlyZXR1cm47CisKKwkvLyAxLiAgU3dpdGNoZXMgdG8gQlcgPSAyMC4KKwlpZiAoU2Vjb25kYXJ5ID09IDApCisJeworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7CisJCUJCUFZhbHVlJj0gKH4weDE4KTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOworCQlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCisJCXsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY5LCAweDE2KTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCAweDA4KTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjczLCAweDExKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhIXJ0Mjg2MEMgISEhIFxuIiApKTsKKwkJfQorCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV18yMDsKKwkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IE5ld0NoYW5uZWw7CisJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKKwkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLEZBTFNFKTsKKwkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uSFRQaHlNb2RlLmZpZWxkLkJXID0gMDsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhMjBNSHogICAhISEgXG4iICkpOworCX0KKwkvLyAxLiAgU3dpdGNoZXMgdG8gQlcgPSA0MCBBbmQgU3RhdGlvbiBzdXBwb3J0cyBCVyA9IDQwLgorCWVsc2UgaWYgKCgoU2Vjb25kYXJ5ID09IDEpIHx8IChTZWNvbmRhcnkgPT0gMykpICYmIChwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSAxKSkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSBOZXdDaGFubmVsOworCisJCWlmIChTZWNvbmRhcnkgPT0gMSkKKwkJeworCQkJLy8gU2Vjb25kYXJ5IGFib3ZlLgorCQkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsICsgMjsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZNQUNWYWx1ZSk7CisJCQlNQUNWYWx1ZSAmPSAweGZlOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIE1BQ1ZhbHVlKTsKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKKwkJCUJCUFZhbHVlJj0gKH4weDE4KTsKKwkJCUJCUFZhbHVlfD0gKDB4MTApOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQkJQVmFsdWUpOworCQkJQkJQVmFsdWUmPSAofjB4MjApOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQkJQVmFsdWUpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhNDBNSHogTG93ZXIgTElOSyBVUCAhISEgQ29udHJvbCBDaGFubmVsIGF0IEJlbG93LiBDZW50cmFsID0gJWQgXG4iLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCApKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIFNlY29uZGFyeSBiZWxvdy4KKwkJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCAtIDI7CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmTUFDVmFsdWUpOworCQkJTUFDVmFsdWUgJj0gMHhmZTsKKwkJCU1BQ1ZhbHVlIHw9IDB4MTsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBNQUNWYWx1ZSk7CisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7CisJCQlCQlBWYWx1ZSY9ICh+MHgxOCk7CisJCQlCQlBWYWx1ZXw9ICgweDEwKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJCUFZhbHVlKTsKKwkJCUJCUFZhbHVlJj0gKH4weDIwKTsKKwkJCUJCUFZhbHVlfD0gKDB4MjApOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQkJQVmFsdWUpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhNDBNSHogVXBwZXIgTElOSyBVUCAhISEgQ29udHJvbCBDaGFubmVsIGF0IFVwcGVyQ2VudHJhbCA9ICVkIFxuIiwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgKSk7CisJCX0KKwkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7CisJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKKwkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworCQlwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkhUUGh5TW9kZS5maWVsZC5CVyA9IDE7CisJfQorfQorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBQZWVyUHVibGljQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJVUNIQVIJQWN0aW9uID0gRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMV07CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCisJaWYgKEVsZW0tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCXJldHVybjsKKworI2lmZGVmIERPVDExTl9EUkFGVDMKKwlzd2l0Y2goQWN0aW9uKQorCXsKKwkJY2FzZSBBQ1RJT05fQlNTXzIwNDBfQ09FWElTVDoJLy8gRm9ybWF0IGRlZmluZWQgaW4gSUVFRSA3LjQuN2EuMSBpbiAxMW4gRHJhZjMuMDMKKwkJCXsKKwkJCQkvL1VDSEFSCUJzc0NvZXhpc3Q7CisJCQkJQlNTXzIwNDBfQ09FWElTVF9FTEVNRU5UCQkqcENvZXhpc3RJbmZvOworCQkJCUJTU18yMDQwX0NPRVhJU1RfSUUgCQkJKnBCc3NDb2V4aXN0SWU7CisJCQkJQlNTXzIwNDBfSU5UT0xFUkFOVF9DSF9SRVBPUlQJKnBJbnRvbGVyYW50UmVwb3J0ID0gTlVMTDsKKworCQkJCWlmIChFbGVtLT5Nc2dMZW4gPD0gKExFTkdUSF84MDJfMTEgKyBzaXplb2YoQlNTXzIwNDBfQ09FWElTVF9FTEVNRU5UKSkgKQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQUNUSU9OIC0gMjAvNDAgQlNTIENvZXhpc3RlbmNlIE1hbmFnZW1lbnQgRnJhbWUgbGVuZ3RoIHRvbyBzaG9ydCEgbGVuID0gJWxkIVxuIiwgRWxlbS0+TXNnTGVuKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBQ1RJT04gLSAyMC80MCBCU1MgQ29leGlzdGVuY2UgTWFuYWdlbWVudCBhY3Rpb24tLS0tPiBcbiIpKTsKKwkJCQloZXhfZHVtcCgiQ29leGlzdGVuY2VNZ210RnJhbWUiLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbik7CisKKworCQkJCXBDb2V4aXN0SW5mbyA9IChCU1NfMjA0MF9DT0VYSVNUX0VMRU1FTlQgKikgJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdOworCQkJCS8vaGV4X2R1bXAoIkNvZXhpc3RJbmZvIiwgKFBVQ0hBUilwQ29leGlzdEluZm8sIHNpemVvZihCU1NfMjA0MF9DT0VYSVNUX0VMRU1FTlQpKTsKKwkJCQlpZiAoRWxlbS0+TXNnTGVuID49IChMRU5HVEhfODAyXzExICsgc2l6ZW9mKEJTU18yMDQwX0NPRVhJU1RfRUxFTUVOVCkgKyBzaXplb2YoQlNTXzIwNDBfSU5UT0xFUkFOVF9DSF9SRVBPUlQpKSkKKwkJCQl7CisJCQkJCXBJbnRvbGVyYW50UmVwb3J0ID0gKEJTU18yMDQwX0lOVE9MRVJBTlRfQ0hfUkVQT1JUICopKChQVUNIQVIpcENvZXhpc3RJbmZvICsgc2l6ZW9mKEJTU18yMDQwX0NPRVhJU1RfRUxFTUVOVCkpOworCQkJCX0KKwkJCQkvL2hleF9kdW1wKCJJbnRvbGVyYW50UmVwb3J0ICIsIChQVUNIQVIpcEludG9sZXJhbnRSZXBvcnQsIHNpemVvZihCU1NfMjA0MF9JTlRPTEVSQU5UX0NIX1JFUE9SVCkpOworCisJCQkJcEJzc0NvZXhpc3RJZSA9IChCU1NfMjA0MF9DT0VYSVNUX0lFICopKCZwQ29leGlzdEluZm8tPkJzc0NvZXhpc3RJZSk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCXsKKwkJCQkJaWYgKElORlJBX09OKHBBZCkpCisJCQkJCXsKKwkJCQkJCVN0YVB1YmxpY0FjdGlvbihwQWQsIHBDb2V4aXN0SW5mbyk7CisJCQkJCX0KKwkJCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJCX0KKwkJCWJyZWFrOworCX0KKworI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKworfQorCisKK3N0YXRpYyBWT0lEIFJlc2VydmVkQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUiBDYXRlZ29yeTsKKworCWlmIChFbGVtLT5Nc2dMZW4gPD0gTEVOR1RIXzgwMl8xMSkKKwl7CisJCXJldHVybjsKKwl9CisKKwlDYXRlZ29yeSA9IEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExXTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJjdiByZXNlcnZlZCBjYXRlZ29yeSglZCkgQWN0aW9uIEZyYW1lXG4iLCBDYXRlZ29yeSkpOworCWhleF9kdW1wKCJSZXNlcnZlZCBBY3Rpb24gRnJhbWUiLCAmRWxlbS0+TXNnWzBdLCBFbGVtLT5Nc2dMZW4pOworfQorCitWT0lEIFBlZXJSTUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCisKK3sKKwlyZXR1cm47Cit9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK3N0YXRpYyBWT0lEIHJlc3BvbmRfaHRfaW5mb3JtYXRpb25fZXhjaGFuZ2VfYWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUwkJTlN0YXR1czsKKwlVTE9ORwkJCUZyYW1lTGVuOworCUZSQU1FX0hUX0lORk8JSFRJTkZPZnJhbWUsICpwRnJhbWU7CisJVUNIQVIgICAJCSpwQWRkcjsKKworCisJLy8gMi4gQWx3YXlzIHNlbmQgYmFjayBBRERCQSBSZXNwb25zZQorCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CSAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisKKwlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1RJT04gLSByZXNwb25kX2h0X2luZm9ybWF0aW9uX2V4Y2hhbmdlX2FjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwkvLyBnZXQgUkEKKwlwRnJhbWUgPSAoRlJBTUVfSFRfSU5GTyAqKSAmRWxlbS0+TXNnWzBdOworCXBBZGRyID0gcEZyYW1lLT5IZHIuQWRkcjI7CisKKwlOZGlzWmVyb01lbW9yeSgmSFRJTkZPZnJhbWUsIHNpemVvZihGUkFNRV9IVF9JTkZPKSk7CisJLy8gMi0xLiBQcmVwYXJlIEFEREJBIFJlc3BvbnNlIGZyYW1lLgorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlpZiAoQURIT0NfT04ocEFkKSkKKwkJCUFjdEhlYWRlckluaXQocEFkLCAmSFRJTkZPZnJhbWUuSGRyLCBwQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQllbHNlCisJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkhUSU5GT2ZyYW1lLkhkciwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZGRyKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlIVElORk9mcmFtZS5DYXRlZ29yeSA9IENBVEVHT1JZX0hUOworCUhUSU5GT2ZyYW1lLkFjdGlvbiA9IEhUX0lORk9fRVhDSEFOR0U7CisJSFRJTkZPZnJhbWUuSFRfSW5mby5SZXF1ZXN0ID0gMDsKKwlIVElORk9mcmFtZS5IVF9JbmZvLkZvcnR5X01Iel9JbnRvbGVyYW50ID0gcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5Gb3J0eV9NaHpfSW50b2xlcmFudDsKKwlIVElORk9mcmFtZS5IVF9JbmZvLlNUQV9DaGFubmVsX1dpZHRoCSA9IHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aDsKKworCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkJCQkmRnJhbWVMZW4sCisJCQkJCSAgc2l6ZW9mKEZSQU1FX0hUX0lORk8pLAkmSFRJTkZPZnJhbWUsCisJCQkJCSAgRU5EX09GX0FSR1MpOworCisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworfQorCisKKyNpZmRlZiBET1QxMU5fRFJBRlQzCitWT0lEIFNlbmROb3RpZnlCV0FjdGlvbkZyYW1lKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSICBXY2lkLAorCUlOIFVDSEFSIGFwaWR4KQoreworCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTIAlOU3RhdHVzOworCUZSQU1FX0FDVElPTl9IRFIJRnJhbWU7CisJVUxPTkcJCQlGcmFtZUxlbjsKKwlQVUNIQVIJCQlwQWRkcjE7CisKKworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJBQ1QgLSBTZW5kTm90aWZ5QldBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQlyZXR1cm47CisJfQorCisJaWYgKFdjaWQgPT0gTUNBU1RfV0NJRCkKKwkJcEFkZHIxID0gJkJST0FEQ0FTVF9BRERSWzBdOworCWVsc2UKKwkJcEFkZHIxID0gcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5BZGRyOworCUFjdEhlYWRlckluaXQocEFkLCAmRnJhbWUuSGRyLCBwQWRkcjEsIHBBZC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5Cc3NpZCwgcEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLkJzc2lkKTsKKworCUZyYW1lLkNhdGVnb3J5ID0gQ0FURUdPUllfSFQ7CisJRnJhbWUuQWN0aW9uID0gTk9USUZZX0JXX0FDVElPTjsKKworCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkJCSZGcmFtZUxlbiwKKwkJCQkgIHNpemVvZihGUkFNRV9BQ1RJT05fSERSKSwJICAmRnJhbWUsCisJCQkJICBFTkRfT0ZfQVJHUyk7CisKKwkqKHBPdXRCdWZmZXIgKyBGcmFtZUxlbikgPSBwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLlJlY29tV2lkdGg7CisJRnJhbWVMZW4rKzsKKworCisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFDVCAtIFNlbmROb3RpZnlCV0FjdGlvbihOb3RpZnlCVz0gJWQpIVxuIiwgcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5SZWNvbVdpZHRoKSk7CisKK30KKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisKKworVk9JRCBQZWVySFRBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSCUFjdGlvbiA9IEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzFdOworCisJaWYgKEVsZW0tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCXJldHVybjsKKworCXN3aXRjaChBY3Rpb24pCisJeworCQljYXNlIE5PVElGWV9CV19BQ1RJT046CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFDVElPTiAtIEhUIE5vdGlmeSBDaGFubmVsIGJhbmR3aWR0aCBhY3Rpb24tLS0tPiBcbiIpKTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCWlmKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IEZBTFNFKQorCQkJeworCQkJCS8vIE5vdGUsIHRoaXMgaXMgdG8gcGF0Y2ggRElSLTEzNTMgQVAuIFdoZW4gdGhlIEFQIHNldCB0byBXZXAsIGl0IHdpbGwgdXNlIGxlZ2FjeSBtb2RlLiBCdXQgQVAgc3RpbGwga2VlcHMKKwkJCQkvLyBzZW5kaW5nIEJXX05vdGlmeSBBY3Rpb24gZnJhbWUsIGFuZCBjYXVzZSB1cyB0byBsaW5rdXAgYW5kIGxpbmtkb3duLgorCQkJCS8vIEluIGxlZ2FjeSBtb2RlLCBkb24ndCBuZWVkIHRvIHBhcnNlIEhUIGFjdGlvbiBmcmFtZS4KKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFDVElPTiAtSWdub3JlIEhUIE5vdGlmeSBDaGFubmVsIEJXIHdoZW4gbGluayBhcyBsZWdhY3kgbW9kZS4gQlcgPSAlZC0tLT4gXG4iLAorCQkJCQkJCQlFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsyXSApKTsKKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkJaWYgKEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdID09IDApCS8vIDcuNC44LjIuIGlmIHZhbHVlIGlzIDEsIGtlZXAgdGhlIHNhbWUgYXMgc3VwcG9ydGVkIGNoYW5uZWwgYmFuZHdpZHRoLgorCQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uSFRQaHlNb2RlLmZpZWxkLkJXID0gMDsKKworCQkJYnJlYWs7CisKKwkJY2FzZSBTTVBTX0FDVElPTjoKKwkJCS8vIDcuMy4xLjI1CisgCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1RJT04gLSBTTVBTIGFjdGlvbi0tLS0+IFxuIikpOworCQkJaWYgKCgoRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMl0mMHgxKSA9PSAwKSkKKwkJCXsKKwkJCQlwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLk1tcHNNb2RlID0gTU1QU19FTkFCTEU7CisJCQl9CisJCQllbHNlIGlmICgoKEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdJjB4MikgPT0gMCkpCisJCQl7CisJCQkJcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5NbXBzTW9kZSA9IE1NUFNfU1RBVElDOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uTW1wc01vZGUgPSBNTVBTX0RZTkFNSUM7CisJCQl9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQWlkKCVkKSBNSU1PIFBTID0gJWRcbiIsIEVsZW0tPldjaWQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uTW1wc01vZGUpKTsKKwkJCS8vIHJ0Mjg2MGMgOiBhZGQgc29tZXRoaW5nIGZvciBzbXBzIGNoYW5nZS4KKwkJCWJyZWFrOworCisJCWNhc2UgU0VUUENPX0FDVElPTjoKKwkJCWJyZWFrOworCisJCWNhc2UgTUlNT19DSEFfTUVBU1VSRV9BQ1RJT046CisJCQlicmVhazsKKworCQljYXNlIEhUX0lORk9fRVhDSEFOR0U6CisJCQl7CisJCQkJSFRfSU5GT1JNQVRJT05fT0NURVQJKnBIVF9pbmZvOworCisJCQkJcEhUX2luZm8gPSAoSFRfSU5GT1JNQVRJT05fT0NURVQgKikgJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdOworICAgIAkJCQkvLyA3LjQuOC4xMAorICAgIAkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFDVElPTiAtIEhUIEluZm9ybWF0aW9uIEV4Y2hhbmdlIGFjdGlvbi0tLS0+IFxuIikpOworICAgIAkJCQlpZiAocEhUX2luZm8tPlJlcXVlc3QpCisgICAgCQkJCXsKKyAgICAJCQkJCXJlc3BvbmRfaHRfaW5mb3JtYXRpb25fZXhjaGFuZ2VfYWN0aW9uKHBBZCwgRWxlbSk7CisgICAgCQkJCX0KKwkJCX0KKyAgICAJCQlicmVhazsKKwl9Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlSZXRyeSBzZW5kaW5nIEFEREJBIFJlcWVzdC4KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJUGFyYW1ldHJzOgorCXA4MDIzSGVhZGVyOiBpZiB0aGlzIGlzIGFscmVhZHkgODAyLjMgZm9ybWF0LCBwODAyM0hlYWRlciBpcyBOVUxMCisKKwlSZXR1cm4JOiBUUlVFIGlmIHB1dCBpbnRvIHJ4IHJlb3JkZXJpbmcgYnVmZmVyLCBzaG91bGRuJ3QgaW5kaWNhdGVyeGhlcmUuCisJCQkJRkFMU0UgLCB0aGVuIGNvbnRpbnVlIGluZGljYXRlcnggYXQgdGhpcyBtb21lbnQuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBPUklCQVRpbWVyVGltZW91dCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeTsKKwlJTlQJCQlpLCB0b3RhbDsKKy8vCUZSQU1FX0JBUgkJCUZyYW1lQmFyOworLy8JVUxPTkcJCQlGcmFtZUxlbjsKKy8vCU5ESVNfU1RBVFVTIAlOU3RhdHVzOworLy8JUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisvLwlVU0hPUlQJCQlTZXF1ZW5jZTsKKwlVQ0hBUgkJCVRJRDsKKworI2lmZGVmIFJBTElOS19BVEUKKwlpZiAoQVRFX09OKHBBZCkpCisJCXJldHVybjsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKwl0b3RhbCA9IHBBZC0+TWFjVGFiLlNpemUgKiBOVU1fT0ZfVElEOworCisJZm9yIChpID0gMTsgKChpIDxNQVhfTEVOX09GX0JBX09SSV9UQUJMRSkgJiYgKHRvdGFsID4gMCkpIDsgaSsrKQorCXsKKwkJaWYgIChwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpXS5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfRG9uZSkKKwkJeworCQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbaV0uV2NpZF07CisJCQlUSUQgPSBwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpXS5USUQ7CisKKwkJCUFTU0VSVChwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpXS5XY2lkIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpOworCQl9CisJCXRvdGFsIC0tOworCX0KK30KKworCitWT0lEIFNlbmRSZWZyZXNoQkFSKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5KQoreworCUZSQU1FX0JBUgkJRnJhbWVCYXI7CisJVUxPTkcJCQlGcmFtZUxlbjsKKwlORElTX1NUQVRVUyAJTlN0YXR1czsKKwlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlVU0hPUlQJCQlTZXF1ZW5jZTsKKwlVQ0hBUgkJCWksIFRJRDsKKwlVU0hPUlQJCQlpZHg7CisJQkFfT1JJX0VOVFJZCSpwQkFFbnRyeTsKKworCWZvciAoaSA9IDA7IGkgPE5VTV9PRl9USUQ7IGkrKykKKwl7CisJCWlkeCA9IHBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbaV07CisJCWlmIChpZHggPT0gMCkKKwkJeworCQkJY29udGludWU7CisJCX0KKwkJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbaWR4XTsKKworCQlpZiAgKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfRG9uZSkKKwkJeworCQkJVElEID0gcEJBRW50cnktPlRJRDsKKworCQkJQVNTRVJUKHBCQUVudHJ5LT5XY2lkIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpOworCisJCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCQkJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQkEgLSBNbG1lQUREQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJU2VxdWVuY2UgPSBwRW50cnktPlR4U2VxW1RJRF07CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQlCYXJIZWFkZXJJbml0KHBBZCwgJkZyYW1lQmFyLCBwRW50cnktPkFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCQlGcmFtZUJhci5TdGFydGluZ1NlcS5maWVsZC5GcmFnTnVtID0gMDsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY3Rpb24uCisJCQlGcmFtZUJhci5TdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSA9IFNlcXVlbmNlOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KKwkJCUZyYW1lQmFyLkJhckNvbnRyb2wuVElEID0gVElEOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KKworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAorCQkJCQkJCSAgc2l6ZW9mKEZSQU1FX0JBUiksCSAgJkZyYW1lQmFyLAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJLy9pZiAoIShDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1JBTElOS19DSElQU0VUKSkpCisJCQlpZiAoMSkJLy8gTm93IHdlIGFsd2F5cyBzZW5kIEJBUi4KKwkJCXsKKwkJCQkvL01pbmlwb3J0TU1SZXF1ZXN0VW5sb2NrKHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQkJfQorCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJfQorCX0KK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBBY3RIZWFkZXJJbml0KAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorICAgIElOIE9VVCBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCisgICAgSU4gUFVDSEFSIEFkZHIxLAorICAgIElOIFBVQ0hBUiBBZGRyMiwKKyAgICBJTiBQVUNIQVIgQWRkcjMpCit7CisgICAgTmRpc1plcm9NZW1vcnkocEhkcjgwMjExLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworICAgIHBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX01HTVQ7CisgICAgcEhkcjgwMjExLT5GQy5TdWJUeXBlID0gU1VCVFlQRV9BQ1RJT047CisKKyAgICBDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjEsIEFkZHIxKTsKKwlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjIsIEFkZHIyKTsKKyAgICBDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjMsIEFkZHIzKTsKK30KKworVk9JRCBCYXJIZWFkZXJJbml0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOIE9VVCBQRlJBTUVfQkFSIHBDbnRsQmFyLAorCUlOIFBVQ0hBUiBwREEsCisJSU4gUFVDSEFSIHBTQSkKK3sKKy8vCVVTSE9SVAlEdXJhdGlvbjsKKworCU5kaXNaZXJvTWVtb3J5KHBDbnRsQmFyLCBzaXplb2YoRlJBTUVfQkFSKSk7CisJcENudGxCYXItPkZDLlR5cGUgPSBCVFlQRV9DTlRMOworCXBDbnRsQmFyLT5GQy5TdWJUeXBlID0gU1VCVFlQRV9CTE9DS19BQ0tfUkVROworICAgCXBDbnRsQmFyLT5CYXJDb250cm9sLk1USUQgPSAwOworCXBDbnRsQmFyLT5CYXJDb250cm9sLkNvbXByZXNzZWQgPSAxOworCXBDbnRsQmFyLT5CYXJDb250cm9sLkFDS1BvbGljeSA9IDA7CisKKworCXBDbnRsQmFyLT5EdXJhdGlvbiA9IDE2ICsgUlRNUENhbGNEdXJhdGlvbihwQWQsIFJBVEVfMSwgc2l6ZW9mKEZSQU1FX0JBKSk7CisKKwlDT1BZX01BQ19BRERSKHBDbnRsQmFyLT5BZGRyMSwgcERBKTsKKwlDT1BZX01BQ19BRERSKHBDbnRsQmFyLT5BZGRyMiwgcFNBKTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUluc2VydCBDYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUgaW50byB0aGUgYWN0aW9uIGZyYW1lLgorCisJUGFyYW1ldHJzOgorCQkxLiBmcmFtZSBidWZmZXIgcG9pbnRlci4KKwkJMi4gZnJhbWUgbGVuZ3RoLgorCQkzLiBjYXRlZ29yeSBjb2RlIG9mIHRoZSBmcmFtZS4KKwkJNC4gYWN0aW9uIGNvZGUgb2YgdGhlIGZyYW1lLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEluc2VydEFjdEZpZWxkKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAorCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAorCUlOIFVJTlQ4IENhdGVnb3J5LAorCUlOIFVJTlQ4IEFjdENvZGUpCit7CisJVUxPTkcgVGVtcExlbjsKKworCU1ha2VPdXRnb2luZ0ZyYW1lKAlwRnJhbWVCdWYsCQkmVGVtcExlbiwKKwkJCQkJCTEsCQkJCSZDYXRlZ29yeSwKKwkJCQkJCTEsCQkJCSZBY3RDb2RlLAorCQkJCQkJRU5EX09GX0FSR1MpOworCisJKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOworCisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vYWN0aW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9hY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTM4NzdkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vYWN0aW9uLmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlhaXJvbmV0LmgKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlOYW1lCQlEYXRlCQkJTW9kaWZpY2F0aW9uIGxvZ3MKKwlQYXVsIExpbgkwNC0wNi0xNQkJSW5pdGlhbAorKi8KKworI2lmbmRlZglfX0FDVElPTl9IX18KKyNkZWZpbmUJX19BQ1RJT05fSF9fCisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfX0hUX0lORk9fT0NURVQKK3sKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVUNIQVIJUmVzZXJ2ZWQ6NTsKKwlVQ0hBUiAJU1RBX0NoYW5uZWxfV2lkdGg6MTsKKwlVQ0hBUglGb3J0eV9NSHpfSW50b2xlcmFudDoxOworCVVDSEFSCVJlcXVlc3Q6MTsKKyNlbHNlCisJVUNIQVIJUmVxdWVzdDoxOworCVVDSEFSCUZvcnR5X01Iel9JbnRvbGVyYW50OjE7CisJVUNIQVIgCVNUQV9DaGFubmVsX1dpZHRoOjE7CisJVUNIQVIJUmVzZXJ2ZWQ6NTsKKyNlbmRpZgorfSBIVF9JTkZPUk1BVElPTl9PQ1RFVDsKKworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX19GUkFNRV9IVF9JTkZPCit7CisJSEVBREVSXzgwMl8xMSAgIAkJSGRyOworCVVDSEFSCQkJCQlDYXRlZ29yeTsKKwlVQ0hBUgkJCQkJQWN0aW9uOworCUhUX0lORk9STUFUSU9OX09DVEVUCUhUX0luZm87Cit9ICAgRlJBTUVfSFRfSU5GTywgKlBGUkFNRV9IVF9JTkZPOworCisjZW5kaWYgLyogX19BQ1RJT05fSF9fICovCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vYmFfYWN0aW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9iYV9hY3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWY3MzgxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vYmFfYWN0aW9uLmMKQEAgLTAsMCArMSwxNzk4IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisKKworI2RlZmluZSBCQV9PUklfSU5JVF9TRVEJCShwRW50cnktPlR4U2VxW1RJRF0pIC8vMQkJCS8vIGluaXRhbCBzZXF1ZW5jZSBudW1iZXIgb2YgQkEgc2Vzc2lvbgorCisjZGVmaW5lIE9SSV9TRVNTSU9OX01BWF9SRVRSWQk4CisjZGVmaW5lIE9SSV9CQV9TRVNTSU9OX1RJTUVPVVQJKDIwMDApCS8vIG1zCisjZGVmaW5lIFJFQ19CQV9TRVNTSU9OX0lETEVfVElNRU9VVAkoMTAwMCkJLy8gbXMKKworI2RlZmluZSBSRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VUCQkoKDEwMCAqIEhaKS8xMDAwKQkvLyBzeXN0ZW0gdGlja3MgLS0gMTAwIG1zCisjZGVmaW5lIE1BWF9SRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VUCSgoMzAwMCAqIEhaKS8xMDAwKQkvLyBzeXN0ZW0gdGlja3MgLS0gMTAwIG1zCisKKyNkZWZpbmUgUkVTRVRfUkNWX1NFUQkJKDB4RkZGRikKKworc3RhdGljIHZvaWQgYmFfbXBkdV9ibGtfZnJlZShQUlRNUF9BREFQVEVSIHBBZCwgc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGspOworCisKK0JBX09SSV9FTlRSWSAqQkFUYWJsZUFsbG9jT3JpRW50cnkoCisJCQkJCQkJCSAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJCQkJCQkJCSAgT1VUIFVTSE9SVCAgICAgICAgICAqSWR4KTsKKworQkFfUkVDX0VOVFJZICpCQVRhYmxlQWxsb2NSZWNFbnRyeSgKKwkJCQkJCQkJICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwkJCQkJCQkJICBPVVQgVVNIT1JUICAgICAgICAgICpJZHgpOworCitWT0lEIEJBT3JpU2Vzc2lvblNldHVwVGltZW91dCgKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisgICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIEJBUmVjU2Vzc2lvbklkbGVUaW1lb3V0KAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKyAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKKworQlVJTERfVElNRVJfRlVOQ1RJT04oQkFPcmlTZXNzaW9uU2V0dXBUaW1lb3V0KTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKEJBUmVjU2Vzc2lvbklkbGVUaW1lb3V0KTsKKworI2RlZmluZSBBTk5PVU5DRV9SRU9SREVSSU5HX1BBQ0tFVChfcEFkLCBfbXBkdV9ibGspCVwKKwkJCUFubm91bmNlX1Jlb3JkZXJpbmdfUGFja2V0KF9wQWQsIF9tcGR1X2Jsayk7CisKK1ZPSUQgQkFfTWF4V2luU2l6ZVJlYXNpZ24oCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5UGVlciwKKwlPVVQgVUNIQVIJCQkqcFdpblNpemUpCit7CisJVUNIQVIgTWF4U2l6ZTsKKworCisJaWYgKHBBZC0+TUFDVmVyc2lvbiA+PSBSQUxJTktfMjg4M19WRVJTSU9OKSAvLyAzKjMKKwl7CisJCWlmIChwQWQtPk1BQ1ZlcnNpb24gPj0gUkFMSU5LXzMwNzBfVkVSU0lPTikKKwkJeworCQkJaWYgKHBFbnRyeVBlZXItPldlcFN0YXR1cyAhPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkKQorCQkJCU1heFNpemUgPSA3OyAvLyBmb3Igbm9uLW9wZW4gbW9kZQorCQkJZWxzZQorCQkJCU1heFNpemUgPSAxMzsKKwkJfQorCQllbHNlCisJCQlNYXhTaXplID0gMzE7CisJfQorCWVsc2UgaWYgKHBBZC0+TUFDVmVyc2lvbiA+PSBSQUxJTktfMjg4MEVfVkVSU0lPTikgLy8gMjg4MCBlCisJeworCQlpZiAocEVudHJ5UGVlci0+V2VwU3RhdHVzICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQpCisJCQlNYXhTaXplID0gNzsgLy8gZm9yIG5vbi1vcGVuIG1vZGUKKwkJZWxzZQorCQkJTWF4U2l6ZSA9IDEzOworCX0KKwllbHNlCisJCU1heFNpemUgPSA3OworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiYmE+IFdpbiBTaXplID0gJWQsIE1heCBTaXplID0gJWRcbiIsCisJCQkqcFdpblNpemUsIE1heFNpemUpKTsKKworCWlmICgoKnBXaW5TaXplKSA+IE1heFNpemUpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJiYT4gcmVhc3NpZ24gbWF4IHdpbiBzaXplIGZyb20gJWQgdG8gJWRcbiIsCisJCQkJKnBXaW5TaXplLCBNYXhTaXplKSk7CisKKwkJKnBXaW5TaXplID0gTWF4U2l6ZTsKKwl9Cit9CisKK3ZvaWQgQW5ub3VuY2VfUmVvcmRlcmluZ19QYWNrZXQoSU4gUFJUTVBfQURBUFRFUgkJCXBBZCwKKwkJCQkJCQkJSU4gc3RydWN0IHJlb3JkZXJpbmdfbXBkdQkqbXBkdSkKK3sKKwlQTkRJU19QQUNLRVQgICAgcFBhY2tldDsKKworCXBQYWNrZXQgPSBtcGR1LT5wUGFja2V0OworCisJaWYgKG1wZHUtPmJBTVNEVSkKKwl7CisJCUFTU0VSVCgwKTsKKwkJQkFfUmVvcmRlcl9BTVNEVV9Bbm5ub3VuY2UocEFkLCBwUGFja2V0KTsKKwl9CisJZWxzZQorCXsKKwkJLy8KKwkJLy8gcGFzcyB0aGlzIDgwMi4zIHBhY2tldCB0byB1cHBlciBsYXllciBvciBmb3J3YXJkIHRoaXMgcGFja2V0IHRvIFdNIGRpcmVjdGx5CisJCS8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCUFOTk9VTkNFX09SX0ZPUldBUkRfODAyXzNfUEFDS0VUKHBBZCwgcFBhY2tldCwgUlRNUF9HRVRfUEFDS0VUX0lGKHBQYWNrZXQpKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl9Cit9CisKKy8qCisgKiBJbnNlcnQgYSByZW9yZGVyaW5nIG1wZHUgaW50byBzb3J0ZWQgbGlua2VkIGxpc3QgYnkgc2VxdWVuY2Ugbm8uCisgKi8KK0JPT0xFQU4gYmFfcmVvcmRlcmluZ19tcGR1X2luc2VydHNvcnRlZChzdHJ1Y3QgcmVvcmRlcmluZ19saXN0ICpsaXN0LCBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1KQoreworCisJc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqKnBwU2NhbiA9ICZsaXN0LT5uZXh0OworCisJd2hpbGUgKCpwcFNjYW4gIT0gTlVMTCkKKwl7CisJCWlmIChTRVFfU01BTExFUigoKnBwU2NhbiktPlNlcXVlbmNlLCBtcGR1LT5TZXF1ZW5jZSwgTUFYU0VRKSkKKwkJeworCQkJcHBTY2FuID0gJigqcHBTY2FuKS0+bmV4dDsKKwkJfQorCQllbHNlIGlmICgoKnBwU2NhbiktPlNlcXVlbmNlID09IG1wZHUtPlNlcXVlbmNlKQorCQl7CisJCQkvKiBnaXZlIHVwIHRoaXMgZHVwbGljYXRlZCBmcmFtZSAqLworCQkJcmV0dXJuKEZBTFNFKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIGZpbmQgcG9zaXRpb24gKi8KKwkJCWJyZWFrOworCQl9CisJfQorCisJbXBkdS0+bmV4dCA9ICpwcFNjYW47CisJKnBwU2NhbiA9IG1wZHU7CisJbGlzdC0+cWxlbisrOworCXJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBjYWxsZXIgbG9jayBjcml0aWNhbCBzZWN0aW9uIGlmIG5lY2Vzc2FyeQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmFfZW5xdWV1ZShzdHJ1Y3QgcmVvcmRlcmluZ19saXN0ICpsaXN0LCBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsaykKK3sKKwlsaXN0LT5xbGVuKys7CisJbXBkdV9ibGstPm5leHQgPSBsaXN0LT5uZXh0OworCWxpc3QtPm5leHQgPSBtcGR1X2JsazsKK30KKworLyoKKyAqIGNhbGxlciBsb2NrIGNyaXRpY2FsIHNlY3Rpb24gaWYgbmVjZXNzYXJ5CisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqIGJhX2RlcXVldWUoc3RydWN0IHJlb3JkZXJpbmdfbGlzdCAqbGlzdCkKK3sKKwlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsayA9IE5VTEw7CisKKwlBU1NFUlQobGlzdCk7CisKKwkJaWYgKGxpc3QtPnFsZW4pCisJCXsKKwkJCWxpc3QtPnFsZW4tLTsKKwkJCW1wZHVfYmxrID0gbGlzdC0+bmV4dDsKKwkJCWlmIChtcGR1X2JsaykKKwkJCXsKKwkJCQlsaXN0LT5uZXh0ID0gbXBkdV9ibGstPm5leHQ7CisJCQkJbXBkdV9ibGstPm5leHQgPSBOVUxMOworCQkJfQorCQl9CisJcmV0dXJuIG1wZHVfYmxrOworfQorCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAgKmJhX3Jlb3JkZXJpbmdfbXBkdV9kZXF1ZXVlKHN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmxpc3QpCit7CisJcmV0dXJuKGJhX2RlcXVldWUobGlzdCkpOworfQorCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAgKmJhX3Jlb3JkZXJpbmdfbXBkdV9wcm9iZShzdHJ1Y3QgcmVvcmRlcmluZ19saXN0ICpsaXN0KQorCXsKKwlBU1NFUlQobGlzdCk7CisKKwkJcmV0dXJuKGxpc3QtPm5leHQpOworCX0KKworCisvKgorICogZnJlZSBhbGwgcmVzb3VyY2UgZm9yIHJlb3JkZXJpbmcgbWVjaGFuaXNtCisgKi8KK3ZvaWQgYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9yZWxlYXNlKFBSVE1QX0FEQVBURVIgcEFkKQoreworCUJBX1RBQkxFICAgICAgICAqVGFiOworCVBCQV9SRUNfRU5UUlkgICBwQkFFbnRyeTsKKwlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsazsKKwlpbnQgaTsKKworCVRhYiA9ICZwQWQtPkJBVGFibGU7CisKKwkvKiBJLiAgcmVsZWFzZSBhbGwgcGVuZGluZyByZW9yZGVyaW5nIHBhY2tldCAqLworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEU7IGkrKykKKwl7CisJCXBCQUVudHJ5ID0gJlRhYi0+QkFSZWNFbnRyeVtpXTsKKwkJaWYgKHBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzICE9IFJlY2lwaWVudF9OT05FKQorCQl7CisJCQl3aGlsZSAoKG1wZHVfYmxrID0gYmFfcmVvcmRlcmluZ19tcGR1X2RlcXVldWUoJnBCQUVudHJ5LT5saXN0KSkpCisJCQl7CisJCQkJQVNTRVJUKG1wZHVfYmxrLT5wUGFja2V0KTsKKwkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgbXBkdV9ibGstPnBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJCWJhX21wZHVfYmxrX2ZyZWUocEFkLCBtcGR1X2Jsayk7CisJCQl9CisJCX0KKwl9CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCisJQVNTRVJUKHBCQUVudHJ5LT5saXN0LnFsZW4gPT0gMCk7CisJLyogSUkuIGZyZWUgbWVtb3J5IG9mIHJlb3JkZXJpbmcgbXBkdSB0YWJsZSAqLworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+bXBkdV9ibGtfcG9vbC5sb2NrKTsKKwlvc19mcmVlX21lbShwQWQsIHBBZC0+bXBkdV9ibGtfcG9vbC5tZW0pOworCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+bXBkdV9ibGtfcG9vbC5sb2NrKTsKK30KKworCisKKy8qCisgKiBBbGxvY2F0ZSBhbGwgcmVzb3VyY2UgZm9yIHJlb3JkZXJpbmcgbWVjaGFuaXNtCisgKi8KK0JPT0xFQU4gYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9pbml0KFBSVE1QX0FEQVBURVIgcEFkLCBpbnQgbnVtKQoreworCWludCAgICAgaTsKKwlQVUNIQVIgIG1lbTsKKwlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsazsKKwlzdHJ1Y3QgcmVvcmRlcmluZ19saXN0ICpmcmVlbGlzdDsKKworCS8qIGFsbG9jYXRlIHNwaW5sb2NrICovCisJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+bXBkdV9ibGtfcG9vbC5sb2NrKTsKKworCS8qIGluaXRpYWxpemUgZnJlZWxpc3QgKi8KKwlmcmVlbGlzdCA9ICZwQWQtPm1wZHVfYmxrX3Bvb2wuZnJlZWxpc3Q7CisJZnJlZWxpc3QtPm5leHQgPSBOVUxMOworCWZyZWVsaXN0LT5xbGVuID0gMDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFsbG9jYXRlICVkIG1lbW9yeSBmb3IgQkEgcmVvcmRlcmluZ1xuIiwgKFVJTlQzMikobnVtKnNpemVvZihzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1KSkpKTsKKworCS8qIGFsbG9jYXRlIG51bWJlciBvZiBtcGR1X2JsayBtZW1vcnkgKi8KKwlvc19hbGxvY19tZW0ocEFkLCAoUFVDSEFSICopJm1lbSwgKG51bSpzaXplb2Yoc3RydWN0IHJlb3JkZXJpbmdfbXBkdSkpKTsKKworCXBBZC0+bXBkdV9ibGtfcG9vbC5tZW0gPSBtZW07CisKKwlpZiAobWVtID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJDYW4ndCBBbGxvY2F0ZSBNZW1vcnkgZm9yIEJBIFJlb3JkZXJpbmdcbiIpKTsKKwkJcmV0dXJuKEZBTFNFKTsKKwl9CisKKwkvKiBidWlsZCBtcGR1X2JsayBmcmVlIGxpc3QgKi8KKwlmb3IgKGk9MDsgaTxudW07IGkrKykKKwl7CisJCS8qIGdldCBtcGR1X2JsayAqLworCQltcGR1X2JsayA9IChzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICopIG1lbTsKKwkJLyogaW5pdGlhbCBtcGR1X2JsayAqLworCQlOZGlzWmVyb01lbW9yeShtcGR1X2Jsaywgc2l6ZW9mKHN0cnVjdCByZW9yZGVyaW5nX21wZHUpKTsKKwkJLyogbmV4dCBtcGR1X2JsayAqLworCQltZW0gKz0gc2l6ZW9mKHN0cnVjdCByZW9yZGVyaW5nX21wZHUpOworCQkvKiBpbnNlcnQgbXBkdV9ibGsgaW50byBmcmVlbGlzdCAqLworCQliYV9lbnF1ZXVlKGZyZWVsaXN0LCBtcGR1X2Jsayk7CisJfQorCisJcmV0dXJuKFRSVUUpOworfQorCisvL3N0YXRpYyBpbnQgYmxrX2NvdW50PTA7IC8vIHNhbXBsZSB0YWtlIG9mZiwgbm8gdXNlCisKK3N0YXRpYyBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICpiYV9tcGR1X2Jsa19hbGxvYyhQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsazsKKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+bXBkdV9ibGtfcG9vbC5sb2NrKTsKKwltcGR1X2JsayA9IGJhX2RlcXVldWUoJnBBZC0+bXBkdV9ibGtfcG9vbC5mcmVlbGlzdCk7CisJaWYgKG1wZHVfYmxrKQorCXsKKy8vCQlibGtfY291bnQrKzsKKwkJLyogcmVzZXQgbXBkdV9ibGsgKi8KKwkJTmRpc1plcm9NZW1vcnkobXBkdV9ibGssIHNpemVvZihzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1KSk7CisJfQorCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+bXBkdV9ibGtfcG9vbC5sb2NrKTsKKwlyZXR1cm4gbXBkdV9ibGs7Cit9CisKK3N0YXRpYyB2b2lkIGJhX21wZHVfYmxrX2ZyZWUoUFJUTVBfQURBUFRFUiBwQWQsIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrKQoreworCUFTU0VSVChtcGR1X2Jsayk7CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPm1wZHVfYmxrX3Bvb2wubG9jayk7CisvLwlibGtfY291bnQtLTsKKwliYV9lbnF1ZXVlKCZwQWQtPm1wZHVfYmxrX3Bvb2wuZnJlZWxpc3QsIG1wZHVfYmxrKTsKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPm1wZHVfYmxrX3Bvb2wubG9jayk7Cit9CisKKworc3RhdGljIFVTSE9SVCBiYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2luX29yZGVyKAorCQkJCQkJCQkJCQkJICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJCQkJCQkJCQkJCQkgICBJTiBQQkFfUkVDX0VOVFJZICAgIHBCQUVudHJ5LAorCQkJCQkJCQkJCQkJICAgSU4gVVNIT1JUICAgICAgICAgICBTdGFydFNlcSkKK3sKKwlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsazsKKwlVU0hPUlQgIExhc3RJbmRTZXEgPSBSRVNFVF9SQ1ZfU0VROworCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7CisKKwl3aGlsZSAoKG1wZHVfYmxrID0gYmFfcmVvcmRlcmluZ19tcGR1X3Byb2JlKCZwQkFFbnRyeS0+bGlzdCkpKQorCQl7CisJCQkvKiBmaW5kIGluLW9yZGVyIGZyYW1lICovCisJCWlmICghU0VRX1NURVBPTkUobXBkdV9ibGstPlNlcXVlbmNlLCBTdGFydFNlcSwgTUFYU0VRKSkKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIGRlcXVldWUgaW4tb3JkZXIgZnJhbWUgZnJvbSByZW9kZXJpbmcgbGlzdCAqLworCQkJbXBkdV9ibGsgPSBiYV9yZW9yZGVyaW5nX21wZHVfZGVxdWV1ZSgmcEJBRW50cnktPmxpc3QpOworCQkJLyogcGFzcyB0aGlzIGZyYW1lIHVwICovCisJCUFOTk9VTkNFX1JFT1JERVJJTkdfUEFDS0VUKHBBZCwgbXBkdV9ibGspOworCQkvKiBtb3ZlIHRvIG5leHQgc2VxdWVuY2UgKi8KKwkJCVN0YXJ0U2VxID0gbXBkdV9ibGstPlNlcXVlbmNlOworCQlMYXN0SW5kU2VxID0gU3RhcnRTZXE7CisJCS8qIGZyZWUgbXBkdV9ibGsgKi8KKwkJCWJhX21wZHVfYmxrX2ZyZWUocEFkLCBtcGR1X2Jsayk7CisJfQorCisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7CisKKwkvKiB1cGRhdGUgbGFzdCBpbmRpY2F0ZWQgc2VxdWVuY2UgKi8KKwlyZXR1cm4gTGFzdEluZFNlcTsKK30KKworc3RhdGljIHZvaWQgYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19sZV9zZXEoCisJCQkJCQkJCQkJCSAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCQkJCQkJCQkJCQkgICBJTiBQQkFfUkVDX0VOVFJZICAgIHBCQUVudHJ5LAorCQkJCQkJCQkJCQkgICBJTiBVU0hPUlQgICAgICAgICAgIFNlcXVlbmNlKQoreworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOworCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7CisJd2hpbGUgKChtcGR1X2JsayA9IGJhX3Jlb3JkZXJpbmdfbXBkdV9wcm9iZSgmcEJBRW50cnktPmxpc3QpKSkKKwkJeworCQkJLyogZmluZCBpbi1vcmRlciBmcmFtZSAqLworCQlpZiAoKG1wZHVfYmxrLT5TZXF1ZW5jZSA9PSBTZXF1ZW5jZSkgfHwgU0VRX1NNQUxMRVIobXBkdV9ibGstPlNlcXVlbmNlLCBTZXF1ZW5jZSwgTUFYU0VRKSkKKwkJeworCQkJLyogZGVxdWV1ZSBpbi1vcmRlciBmcmFtZSBmcm9tIHJlb2RlcmluZyBsaXN0ICovCisJCQltcGR1X2JsayA9IGJhX3Jlb3JkZXJpbmdfbXBkdV9kZXF1ZXVlKCZwQkFFbnRyeS0+bGlzdCk7CisJCQkvKiBwYXNzIHRoaXMgZnJhbWUgdXAgKi8KKwkJCUFOTk9VTkNFX1JFT1JERVJJTkdfUEFDS0VUKHBBZCwgbXBkdV9ibGspOworCQkJLyogZnJlZSBtcGR1X2JsayAqLworCQkJYmFfbXBkdV9ibGtfZnJlZShwQWQsIG1wZHVfYmxrKTsKKwkJfQorCQllbHNlCisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisJfQorCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBCQUVudHJ5LT5SeFJlUmluZ0xvY2spOworfQorCisKK3N0YXRpYyB2b2lkIGJhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cygKKwkJCQkJCQkJCSAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCQkJCQkJCQkJICAgUEJBX1JFQ19FTlRSWSAgICAgICBwQkFFbnRyeSkKK3sKKwlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsazsKKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBCQUVudHJ5LT5SeFJlUmluZ0xvY2spOworCisJCQkvKiBkZXF1ZXVlIGluLW9yZGVyIGZyYW1lIGZyb20gcmVvZGVyaW5nIGxpc3QgKi8KKwl3aGlsZSAoKG1wZHVfYmxrID0gYmFfcmVvcmRlcmluZ19tcGR1X2RlcXVldWUoJnBCQUVudHJ5LT5saXN0KSkpCisJeworCQkJLyogcGFzcyB0aGlzIGZyYW1lIHVwICovCisJCUFOTk9VTkNFX1JFT1JERVJJTkdfUEFDS0VUKHBBZCwgbXBkdV9ibGspOworCisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gbXBkdV9ibGstPlNlcXVlbmNlOworCQkJYmFfbXBkdV9ibGtfZnJlZShwQWQsIG1wZHVfYmxrKTsKKworCQkvKiB1cGRhdGUgbGFzdCBpbmRpY2F0ZWQgc2VxdWVuY2UgKi8KKwl9CisJQVNTRVJUKHBCQUVudHJ5LT5saXN0LnFsZW4gPT0gMCk7CisJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBSRVNFVF9SQ1ZfU0VROworCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBCQUVudHJ5LT5SeFJlUmluZ0xvY2spOworfQorCisKKy8vc3RhdGljCit2b2lkIGJhX2ZsdXNoX3Jlb3JkZXJpbmdfdGltZW91dF9tcGR1cygKKwkJCQkJCQkJCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCQkJCQkJCQkJSU4gUEJBX1JFQ19FTlRSWSAgICBwQkFFbnRyeSwKKwkJCQkJCQkJCUlOIFVMT05HICAgICAgICAgICAgTm93MzIpCisKK3sKKwlVU0hPUlQgU2VxdWVuY2U7CisKKy8vCWlmICgoUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdzMyLCAodW5zaWduZWQgbG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyK1JFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQpKSAmJgorLy8JCSAocEJBRW50cnktPmxpc3QucWxlbiA+ICgocEJBRW50cnktPkJBV2luU2l6ZSo3KS84KSkpIC8vfHwKKy8vCQkoUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdzMyLCAodW5zaWduZWQgbG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyKygxMCpSRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VUKSkpICYmCisvLwkJIChwQkFFbnRyeS0+bGlzdC5xbGVuID4gKHBCQUVudHJ5LT5CQVdpblNpemUvOCkpKQorCWlmIChSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93MzIsICh1bnNpZ25lZCBsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIrKE1BWF9SRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VULzYpKSkKKwkJICYmKHBCQUVudHJ5LT5saXN0LnFsZW4gPiAxKQorCQkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoInRpbWVvdXRbJWRdICglMDhseC0lMDhseCA9ICVkID4gJWQpOiAleCwgZmx1c2ggYWxsIVxuICIsIHBCQUVudHJ5LT5saXN0LnFsZW4sIE5vdzMyLCAocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyKSwKKwkJCSAgIChpbnQpKChsb25nKSBOb3czMiAtIChsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIpKSwgTUFYX1JFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQsCisJCQkgICBwQkFFbnRyeS0+TGFzdEluZFNlcSkpOworCQliYV9yZWZyZXNoX3Jlb3JkZXJpbmdfbXBkdXMocEFkLCBwQkFFbnRyeSk7CisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciA9IE5vdzMyOworCX0KKwllbHNlCisJaWYgKFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3czMiwgKHVuc2lnbmVkIGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lcisoUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCkpKQorCQkmJiAocEJBRW50cnktPmxpc3QucWxlbiA+IDApCisJICAgKQorCQl7CisgICAgCQkvLworCQkvLyBmb3JjZSBMYXN0SW5kU2VxIHRvIHNoaWZ0IHRvIExhc3RJbmRTZXErMQorICAgIAkJLy8KKyAgICAJCVNlcXVlbmNlID0gKHBCQUVudHJ5LT5MYXN0SW5kU2VxKzEpICYgTUFYU0VROworICAgIAkJYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19sZV9zZXEocEFkLCBwQkFFbnRyeSwgU2VxdWVuY2UpOworICAgIAkJcEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyID0gTm93MzI7CisJCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFNlcXVlbmNlOworICAgIAkJLy8KKyAgICAJCS8vIGluZGljYXRlIGluLW9yZGVyIG1wZHVzCisgICAgCQkvLworICAgIAkJU2VxdWVuY2UgPSBiYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2luX29yZGVyKHBBZCwgcEJBRW50cnksIFNlcXVlbmNlKTsKKyAgICAJCWlmIChTZXF1ZW5jZSAhPSBSRVNFVF9SQ1ZfU0VRKQorICAgIAkJeworICAgIAkJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gU2VxdWVuY2U7CisgICAgCQl9CisKKwl9CisjaWYgMAorCWVsc2UgaWYgKAorCQkJIChSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93MzIsICh1bnNpZ25lZCBsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIrKE1BWF9SRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VUKSkpICYmCisJCQkgIChwQkFFbnRyeS0+bGlzdC5xbGVuID4gMSkpCisJCQkpCisJCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJ0aW1lb3V0WyVkXSAoJWx4LSVseCA9ICVkID4gJWQpOiAleFxuICIsIHBCQUVudHJ5LT5saXN0LnFsZW4sIE5vdzMyLCAocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyKSwKKwkJCSAgIChpbnQpKChsb25nKSBOb3czMiAtIChsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIpKSwgTUFYX1JFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQsCisJCQkgICBwQkFFbnRyeS0+TGFzdEluZFNlcSkpOworCQliYV9yZWZyZXNoX3Jlb3JkZXJpbmdfbXBkdXMocEFkLCBwQkFFbnRyeSk7CisJCQlwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIgPSBOb3czMjsKKwkJCQl9CisjZW5kaWYKK30KKworCisvKgorICogZ2VuZXJhdGUgQUREQkEgcmVxdWVzdCB0bworICogc2V0IHVwIEJBIGFncmVlbWVudAorICovCitWT0lEIEJBT3JpU2Vzc2lvblNldFVwKAorCQkJCQkgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCQkJCQkgIElOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKKwkJCQkJICBJTiBVQ0hBUiAgICAgICAgICAgIFRJRCwKKwkJCQkJICBJTiBVU0hPUlQgICAgICAgICAgIFRpbWVPdXQsCisJCQkJCSAgSU4gVUxPTkcgICAgICAgICAgICBEZWxheVRpbWUsCisJCQkJCSAgSU4gQk9PTEVBTiAgICAgICAgICBpc0ZvcmNlZCkKKworeworCS8vTUxNRV9BRERCQV9SRVFfU1RSVUNUCUFkZGJhUmVxOworCUJBX09SSV9FTlRSWSAgICAgICAgICAgICpwQkFFbnRyeSA9IE5VTEw7CisJVVNIT1JUICAgICAgICAgICAgICAgICAgSWR4OworCUJPT0xFQU4gICAgICAgICAgICAgICAgIENhbmNlbGxlZDsKKworCWlmICgocEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSAhPSBUUlVFKSAgJiYgIChpc0ZvcmNlZCA9PSBGQUxTRSkpCisJCXJldHVybjsKKworCS8vIGlmIHRoaXMgZW50cnkgaXMgbGltaXRlZCB0byB1c2UgbGVnYWN5IHR4IG1vZGUsIGl0IGRvZXNuJ3QgZ2VuZXJhdGUgQkEuCisJaWYgKFJUTVBTdGFGaXhlZFR4TW9kZShwQWQsIHBFbnRyeSkgIT0gRklYRURfVFhNT0RFX0hUKQorCQlyZXR1cm47CisKKwlpZiAoKHBFbnRyeS0+QkFEZWNsaW5lQml0bWFwICYgKDE8PFRJRCkpICYmIChpc0ZvcmNlZCA9PSBGQUxTRSkpCisJeworCQkvLyB0cnkgYWdhaW4gYWZ0ZXIgMyBzZWNzCisJCURlbGF5VGltZSA9IDMwMDA7CisvLwkJcHJpbnRrKCJEZUNsaW5lIEJBIGZyb20gUGVlclxuIik7CisvLwkJcmV0dXJuOworCX0KKworCisJSWR4ID0gcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtUSURdOworCWlmIChJZHggPT0gMCkKKwl7CisJCS8vIGFsbG9jYXRlIGEgQkEgc2Vzc2lvbgorCQlwQkFFbnRyeSA9IEJBVGFibGVBbGxvY09yaUVudHJ5KHBBZCwgJklkeCk7CisJCWlmIChwQkFFbnRyeSA9PSBOVUxMKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFEREJBIC0gTWxtZUFEREJBQWN0aW9uKCkgYWxsb2NhdGUgQkEgc2Vzc2lvbiBmYWlsZWQgXG4iKSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcEJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtJZHhdOworCX0KKworCWlmIChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA+PSBPcmlnaW5hdG9yX1dhaXRSZXMpCisJeworCQlyZXR1cm47CisJfQorCisJcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtUSURdID0gSWR4OworCisJLy8gSW5pdGlhbGl6ZSBCQSBzZXNzaW9uCisJcEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPSBPcmlnaW5hdG9yX1dhaXRSZXM7CisJcEJBRW50cnktPldjaWQgPSBwRW50cnktPkFpZDsKKwlwQkFFbnRyeS0+QkFXaW5TaXplID0gcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdDsKKwlwQkFFbnRyeS0+U2VxdWVuY2UgPSBCQV9PUklfSU5JVF9TRVE7CisJcEJBRW50cnktPlRva2VuID0gMTsJLy8gKDIwMDgtMDEtMjEpIEphbiBMZWUgcmVjb21tZW5kcyBpdCAtIHRoaXMgdG9rZW4gY2FuJ3QgYmUgMAorCXBCQUVudHJ5LT5USUQgPSBUSUQ7CisJcEJBRW50cnktPlRpbWVPdXRWYWx1ZSA9IFRpbWVPdXQ7CisJcEJBRW50cnktPnBBZGFwdGVyID0gcEFkOworCisJaWYgKCEocEVudHJ5LT5UWEJBYml0bWFwICYgKDE8PFRJRCkpKQorCXsKKwkJUlRNUEluaXRUaW1lcihwQWQsICZwQkFFbnRyeS0+T1JJQkFUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKEJBT3JpU2Vzc2lvblNldHVwVGltZW91dCksIHBCQUVudHJ5LCBGQUxTRSk7CisJfQorCWVsc2UKKwkJUlRNUENhbmNlbFRpbWVyKCZwQkFFbnRyeS0+T1JJQkFUaW1lciwgJkNhbmNlbGxlZCk7CisKKwkvLyBzZXQgdGltZXIgdG8gc2VuZCBBRERCQSByZXF1ZXN0CisJUlRNUFNldFRpbWVyKCZwQkFFbnRyeS0+T1JJQkFUaW1lciwgRGVsYXlUaW1lKTsKK30KKworVk9JRCBCQU9yaVNlc3Npb25BZGQoCisJCQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwkJCQkJSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5LAorCQkJSU4gUEZSQU1FX0FEREJBX1JTUCBwRnJhbWUpCit7CisJQkFfT1JJX0VOVFJZICAqcEJBRW50cnkgPSBOVUxMOworCUJPT0xFQU4gICAgICAgQ2FuY2VsbGVkOworCVVDSEFSICAgICAgICAgVElEOworCVVTSE9SVCAgICAgICAgSWR4OworCVBVQ0hBUiAgICAgICAgICBwT3V0QnVmZmVyMiA9IE5VTEw7CisJTkRJU19TVEFUVVMgICAgIE5TdGF0dXM7CisJVUxPTkcgICAgICAgICAgIEZyYW1lTGVuOworCUZSQU1FX0JBUiAgICAgICBGcmFtZUJhcjsKKworCVRJRCA9IHBGcmFtZS0+QmFQYXJtLlRJRDsKKwlJZHggPSBwRW50cnktPkJBT3JpV2NpZEFycmF5W1RJRF07CisJcEJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtJZHhdOworCisJLy8gU3RhcnQgZmlsbCBpbiBwYXJhbWV0ZXJzLgorCWlmICgoSWR4ICE9MCkgJiYgKHBCQUVudHJ5LT5USUQgPT0gVElEKSAmJiAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9XYWl0UmVzKSkKKwl7CisJCXBCQUVudHJ5LT5CQVdpblNpemUgPSBtaW4ocEJBRW50cnktPkJBV2luU2l6ZSwgKChVQ0hBUilwRnJhbWUtPkJhUGFybS5CdWZTaXplKSk7CisJCUJBX01heFdpblNpemVSZWFzaWduKHBBZCwgcEVudHJ5LCAmcEJBRW50cnktPkJBV2luU2l6ZSk7CisKKwkJcEJBRW50cnktPlRpbWVPdXRWYWx1ZSA9IHBGcmFtZS0+VGltZU91dFZhbHVlOworCQlwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9IE9yaWdpbmF0b3JfRG9uZTsKKwkJLy8gcmVzZXQgc2VxdWVuY2UgbnVtYmVyCisJCXBCQUVudHJ5LT5TZXF1ZW5jZSA9IEJBX09SSV9JTklUX1NFUTsKKwkJLy8gU2V0IEJpdG1hcCBmbGFnLgorCQlwRW50cnktPlRYQkFiaXRtYXAgfD0gKDE8PFRJRCk7CisJCQkJUlRNUENhbmNlbFRpbWVyKCZwQkFFbnRyeS0+T1JJQkFUaW1lciwgJkNhbmNlbGxlZCk7CisKKwkJcEJBRW50cnktPk9SSUJBVGltZXIuVGltZXJWYWx1ZSA9IDA7CS8vcEZyYW1lLT5UaW1lT3V0VmFsdWU7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcyA6IFRYQkFiaXRtYXAgPSAleCwgQkFXaW5TaXplID0gJWQsIFRpbWVPdXQgPSAlbGRcbiIsIF9fZnVuY19fLCBwRW50cnktPlRYQkFiaXRtYXAsCisJCQkJCQkJCSBwQkFFbnRyeS0+QkFXaW5TaXplLCBwQkFFbnRyeS0+T1JJQkFUaW1lci5UaW1lclZhbHVlKSk7CisKKwkJLy8gU0VORCBCQVIgOworCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwkJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQSAtIEJBT3JpU2Vzc2lvbkFkZCgpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CisJCQlyZXR1cm47CisJCX0KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQlCYXJIZWFkZXJJbml0KHBBZCwgJkZyYW1lQmFyLCBwQWQtPk1hY1RhYi5Db250ZW50W3BCQUVudHJ5LT5XY2lkXS5BZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQlGcmFtZUJhci5TdGFydGluZ1NlcS5maWVsZC5GcmFnTnVtID0gMDsJLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY3Rpb24uCisJCUZyYW1lQmFyLlN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxID0gcEJBRW50cnktPlNlcXVlbmNlOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KKwkJRnJhbWVCYXIuQmFyQ29udHJvbC5USUQgPSBwQkFFbnRyeS0+VElEOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlcjIsICAgICAgICAgICAgICAmRnJhbWVMZW4sCisJCQkJCQkgIHNpemVvZihGUkFNRV9CQVIpLCAgICAgICZGcmFtZUJhciwKKwkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyMiwgRnJhbWVMZW4pOworCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIyKTsKKworCisJCWlmIChwQkFFbnRyeS0+T1JJQkFUaW1lci5UaW1lclZhbHVlKQorCQkJUlRNUFNldFRpbWVyKCZwQkFFbnRyeS0+T1JJQkFUaW1lciwgcEJBRW50cnktPk9SSUJBVGltZXIuVGltZXJWYWx1ZSk7IC8vIGluIG1TZWMKKwl9Cit9CisKK0JPT0xFQU4gQkFSZWNTZXNzaW9uQWRkKAorCQkJCQkgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwkJCQkJICAgSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5LAorCQkJCQkgICBJTiBQRlJBTUVfQUREQkFfUkVRIHBGcmFtZSkKK3sKKwlCQV9SRUNfRU5UUlkgICAgICAgICAgICAqcEJBRW50cnkgPSBOVUxMOworCUJPT0xFQU4gICAgICAgICAgICAgICAgIFN0YXR1cyA9IFRSVUU7CisJQk9PTEVBTiAgICAgICAgICAgICAgICAgQ2FuY2VsbGVkOworCVVTSE9SVCAgICAgICAgICAgICAgICAgIElkeDsKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBUSUQ7CisJVUNIQVIgICAgICAgICAgICAgICAgICAgQkFXaW5TaXplOworCS8vVUlOVDMyICAgICAgICAgICAgICAgICAgVmFsdWU7CisJLy9VSU5UICAgICAgICAgICAgICAgICAgICBvZmZzZXQ7CisKKworCUFTU0VSVChwRW50cnkpOworCisJLy8gZmluZCBUSUQKKwlUSUQgPSBwRnJhbWUtPkJhUGFybS5USUQ7CisKKwlCQVdpblNpemUgPSBtaW4oKChVQ0hBUilwRnJhbWUtPkJhUGFybS5CdWZTaXplKSwgKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQpOworCisJLy8gSW50ZWwgcGF0Y2gKKwlpZiAoQkFXaW5TaXplID09IDApCisJeworCQlCQVdpblNpemUgPSA2NDsKKwl9CisKKwlJZHggPSBwRW50cnktPkJBUmVjV2NpZEFycmF5W1RJRF07CisKKworCWlmIChJZHggPT0gMCkKKwl7CisJCXBCQUVudHJ5ID0gQkFUYWJsZUFsbG9jUmVjRW50cnkocEFkLCAmSWR4KTsKKwl9CisJZWxzZQorCXsKKwkJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbSWR4XTsKKwkJLy8gZmx1c2ggYWxsIHBlbmRpbmcgcmVvcmRlcmluZyBtcGR1cworCQliYV9yZWZyZXNoX3Jlb3JkZXJpbmdfbXBkdXMocEFkLCBwQkFFbnRyeSk7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcyglbGQpOiBJZHggPSAlZCwgQkFXaW5TaXplKHJlcSAlZCkgPSAlZFxuIiwgX19mdW5jX18sIHBBZC0+QkFUYWJsZS5udW1Bc1JlY2lwaWVudCwgSWR4LAorCQkJCQkJCSBwRnJhbWUtPkJhUGFybS5CdWZTaXplLCBCQVdpblNpemUpKTsKKworCS8vIFN0YXJ0IGZpbGwgaW4gcGFyYW1ldGVycy4KKwlpZiAocEJBRW50cnkgIT0gTlVMTCkKKwl7CisJCUFTU0VSVChwQkFFbnRyeS0+bGlzdC5xbGVuID09IDApOworCisJCXBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzID0gUmVjaXBpZW50X0hhbmRsZVJlczsKKwkJcEJBRW50cnktPkJBV2luU2l6ZSA9IEJBV2luU2l6ZTsKKwkJcEJBRW50cnktPldjaWQgPSBwRW50cnktPkFpZDsKKwkJcEJBRW50cnktPlRJRCA9IFRJRDsKKwkJcEJBRW50cnktPlRpbWVPdXRWYWx1ZSA9IHBGcmFtZS0+VGltZU91dFZhbHVlOworCQlwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9IFJlY2lwaWVudF9BY2NlcHQ7CisJCS8vIGluaXRpYWwgc2VxdWVuY2UgbnVtYmVyCisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gUkVTRVRfUkNWX1NFUTsgLy9wRnJhbWUtPkJhU3RhcnRTZXEuZmllbGQuU3RhcnRTZXE7CisKKwkJcHJpbnRrKCJTdGFydCBTZXEgPSAlMDh4XG4iLCAgcEZyYW1lLT5CYVN0YXJ0U2VxLmZpZWxkLlN0YXJ0U2VxKTsKKworCQlpZiAocEVudHJ5LT5SWEJBYml0bWFwICYgKDE8PFRJRCkpCisJCXsKKwkJCVJUTVBDYW5jZWxUaW1lcigmcEJBRW50cnktPlJFQ0JBVGltZXIsICZDYW5jZWxsZWQpOworCQl9CisJCWVsc2UKKwkJeworCQkJUlRNUEluaXRUaW1lcihwQWQsICZwQkFFbnRyeS0+UkVDQkFUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKEJBUmVjU2Vzc2lvbklkbGVUaW1lb3V0KSwgcEJBRW50cnksIFRSVUUpOworCQl9CisKKyNpZiAwCS8vIGZvciBkZWJ1Z2dpbmcKKwkJUlRNUFNldFRpbWVyKCZwQkFFbnRyeS0+UkVDQkFUaW1lciwgUkVDX0JBX1NFU1NJT05fSURMRV9USU1FT1VUKTsKKyNlbmRpZgorCisJCS8vIFNldCBCaXRtYXAgZmxhZy4KKwkJcEVudHJ5LT5SWEJBYml0bWFwIHw9ICgxPDxUSUQpOworCQlwRW50cnktPkJBUmVjV2NpZEFycmF5W1RJRF0gPSBJZHg7CisKKwkJcEVudHJ5LT5CQURlY2xpbmVCaXRtYXAgJj0gfigxPDxUSUQpOworCisJCS8vIFNldCBCQSBzZXNzaW9uIG1hc2sgaW4gV0NJRCB0YWJsZS4KKwkJUlQyOFhYX0FERF9CQV9TRVNTSU9OX1RPX0FTSUMocEFkLCBwRW50cnktPkFpZCwgVElEKTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIk1BQ0VudHJ5WyVkXVJYQkFiaXRtYXAgPSAweCV4LiBCQVJlY1djaWRBcnJheT0lZFxuIiwKKwkJCQlwRW50cnktPkFpZCwgcEVudHJ5LT5SWEJBYml0bWFwLCBwRW50cnktPkJBUmVjV2NpZEFycmF5W1RJRF0pKTsKKwl9CisJZWxzZQorCXsKKwkJU3RhdHVzID0gRkFMU0U7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQ2FuJ3QgQWNjZXB0IEFEREJBIGZvciAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBUSUQgPSAlZFxuIiwKKwkJCQlQUklOVF9NQUMocEVudHJ5LT5BZGRyKSwgVElEKSk7CisJfQorCXJldHVybihTdGF0dXMpOworfQorCisKK0JBX1JFQ19FTlRSWSAqQkFUYWJsZUFsbG9jUmVjRW50cnkoCisJCQkJCQkJCSAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJCQkJCQkJCSAgT1VUIFVTSE9SVCAgICAgICAgICAqSWR4KQoreworCWludCAgICAgICAgICAgICBpOworCUJBX1JFQ19FTlRSWSAgICAqcEJBRW50cnkgPSBOVUxMOworCisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisKKwlpZiAocEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50ID49IE1BWF9CQVJFQ0lfU0VTU0lPTikKKwl7CisJCXByaW50aygiQkEgUmVjaXBlaW50IFNlc3Npb24gKCVsZCkgPiAlZFxuIiwgcEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50LAorCQkJTUFYX0JBUkVDSV9TRVNTSU9OKTsKKwkJZ290byBkb25lOworCX0KKworCS8vIHJlc2VydmUgaWR4IDAgdG8gaWRlbnRpZnkgQkFXY2lkQXJyYXlbVElEXSBhcyBlbXB0eQorCWZvciAoaT0xOyBpIDwgTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEU7IGkrKykKKwl7CisJCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbaV07CisJCWlmICgocEJBRW50cnktPlJFQ19CQV9TdGF0dXMgPT0gUmVjaXBpZW50X05PTkUpKQorCQl7CisJCQkvLyBnZXQgb25lCisJCQlwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQrKzsKKwkJCXBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzID0gUmVjaXBpZW50X1VTRUQ7CisJCQkqSWR4ID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCitkb25lOgorCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKKwlyZXR1cm4gcEJBRW50cnk7Cit9CisKK0JBX09SSV9FTlRSWSAqQkFUYWJsZUFsbG9jT3JpRW50cnkoCisJCQkJCQkJCSAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJCQkJCQkJCSAgT1VUIFVTSE9SVCAgICAgICAgICAqSWR4KQoreworCWludCAgICAgICAgICAgICBpOworCUJBX09SSV9FTlRSWSAgICAqcEJBRW50cnkgPSBOVUxMOworCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCisJaWYgKHBBZC0+QkFUYWJsZS5udW1Bc09yaWdpbmF0b3IgPj0gKE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFKSkKKwl7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvLyByZXNlcnZlIGlkeCAwIHRvIGlkZW50aWZ5IEJBV2NpZEFycmF5W1RJRF0gYXMgZW1wdHkKKwlmb3IgKGk9MTsgaTxNQVhfTEVOX09GX0JBX09SSV9UQUJMRTsgaSsrKQorCXsKKwkJcEJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpXTsKKwkJaWYgKChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX05PTkUpKQorCQl7CisJCQkvLyBnZXQgb25lCisJCQlwQWQtPkJBVGFibGUubnVtQXNPcmlnaW5hdG9yKys7CisJCQlwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9IE9yaWdpbmF0b3JfVVNFRDsKKwkJCXBCQUVudHJ5LT5wQWRhcHRlciA9IHBBZDsKKwkJCSpJZHggPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisKK2RvbmU6CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCXJldHVybiBwQkFFbnRyeTsKK30KKworCitWT0lEIEJBVGFibGVGcmVlT3JpRW50cnkoCisJCQkJCQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwkJCQkJCUlOICBVTE9ORyAgICAgICAgICAgSWR4KQoreworCUJBX09SSV9FTlRSWSAgICAqcEJBRW50cnkgPSBOVUxMOworCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCisKKwlpZiAoKElkeCA9PSAwKSB8fCAoSWR4ID49IE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFKSkKKwkJcmV0dXJuOworCisJcEJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtJZHhdOworCisJaWYgKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzICE9IE9yaWdpbmF0b3JfTk9ORSkKKwl7CisJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3BCQUVudHJ5LT5XY2lkXTsKKwkJcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtwQkFFbnRyeS0+VElEXSA9IDA7CisKKworCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisJCWlmIChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX0RvbmUpCisJCXsKKwkJIAlwRW50cnktPlRYQkFiaXRtYXAgJj0gKH4oMTw8KHBCQUVudHJ5LT5USUQpICkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkFUYWJsZUZyZWVPcmlFbnRyeSBudW1Bc09yaWdpbmF0b3I9ICVsZFxuIiwgcEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50KSk7CisJCQkvLyBFcmFzZSBCaXRtYXAgZmxhZy4KKwkJfQorCisJCUFTU0VSVChwQWQtPkJBVGFibGUubnVtQXNPcmlnaW5hdG9yICE9IDApOworCisJCXBBZC0+QkFUYWJsZS5udW1Bc09yaWdpbmF0b3IgLT0gMTsKKworCQlwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9IE9yaWdpbmF0b3JfTk9ORTsKKwkJcEJBRW50cnktPlRva2VuID0gMDsKKwkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCX0KK30KKworCitWT0lEIEJBVGFibGVGcmVlUmVjRW50cnkoCisJCQkJCQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwkJCQkJCUlOICBVTE9ORyAgICAgICAgICAgSWR4KQoreworCUJBX1JFQ19FTlRSWSAgICAqcEJBRW50cnkgPSBOVUxMOworCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCisKKwlpZiAoKElkeCA9PSAwKSB8fCAoSWR4ID49IE1BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFKSkKKwkJcmV0dXJuOworCisJcEJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtJZHhdOworCisJaWYgKHBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzICE9IFJlY2lwaWVudF9OT05FKQorCXsKKwkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbcEJBRW50cnktPldjaWRdOworCQlwRW50cnktPkJBUmVjV2NpZEFycmF5W3BCQUVudHJ5LT5USURdID0gMDsKKworCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisKKwkJQVNTRVJUKHBBZC0+QkFUYWJsZS5udW1Bc1JlY2lwaWVudCAhPSAwKTsKKworCQlwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQgLT0gMTsKKworCQlwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9IFJlY2lwaWVudF9OT05FOworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisJfQorfQorCisKK1ZPSUQgQkFPcmlTZXNzaW9uVGVhckRvd24oCisJCQkJCQkgSU4gT1VUICBQUlRNUF9BREFQVEVSICAgcEFkLAorCQkJCQkJIElOICAgICAgVUNIQVIgICAgICAgICAgIFdjaWQsCisJCQkJCQkgSU4gICAgICBVQ0hBUiAgICAgICAgICAgVElELAorCQkJCQkJIElOICAgICAgQk9PTEVBTiAgICAgICAgIGJQYXNzaXZlLAorCQkJCQkJIElOICAgICAgQk9PTEVBTiAgICAgICAgIGJGb3JjZVNlbmQpCit7CisJVUxPTkcgICAgICAgICAgIElkeCA9IDA7CisJQkFfT1JJX0VOVFJZICAgICpwQkFFbnRyeTsKKwlCT09MRUFOICAgICAgICAgQ2FuY2VsbGVkOworCisJaWYgKFdjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJeworCQlyZXR1cm47CisJfQorCisJLy8KKwkvLyBMb2NhdGUgY29ycmVzcG9uZGluZyBCQSBPcmlnaW5hdG9yIEVudHJ5IGluIEJBIFRhYmxlIHdpdGggdGhlIChwQWRkcixUSUQpLgorCS8vCisJSWR4ID0gcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5CQU9yaVdjaWRBcnJheVtUSURdOworCWlmICgoSWR4ID09IDApIHx8IChJZHggPj0gTUFYX0xFTl9PRl9CQV9PUklfVEFCTEUpKQorCXsKKwkJaWYgKGJGb3JjZVNlbmQgPT0gVFJVRSkKKwkJeworCQkJLy8gZm9yY2Ugc2VuZCBzcGVjaWZpZWQgVElEIERlbEJBCisJCQlNTE1FX0RFTEJBX1JFUV9TVFJVQ1QgICBEZWxiYVJlcTsKKwkJCU1MTUVfUVVFVUVfRUxFTSAqRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOworCisJCQlOZGlzWmVyb01lbW9yeSgmRGVsYmFSZXEsIHNpemVvZihEZWxiYVJlcSkpOworCQkJTmRpc1plcm9NZW1vcnkoRWxlbSwgc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSkpOworCisJCQlDT1BZX01BQ19BRERSKERlbGJhUmVxLkFkZHIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQWRkcik7CisJCQlEZWxiYVJlcS5XY2lkID0gV2NpZDsKKwkJCURlbGJhUmVxLlRJRCA9IFRJRDsKKwkJCURlbGJhUmVxLkluaXRpYXRvciA9IE9SSUdJTkFUT1I7CisjaWYgMQorCQkJRWxlbS0+TXNnTGVuICA9IHNpemVvZihEZWxiYVJlcSk7CisJCQlOZGlzTW92ZU1lbW9yeShFbGVtLT5Nc2csICZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7CisJCQlNbG1lREVMQkFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCWtmcmVlKEVsZW0pOworI2Vsc2UKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgQUNUSU9OX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX09SSV9ERUxCQV9DQVRFLCBzaXplb2YoTUxNRV9ERUxCQV9SRVFfU1RSVUNUKSwgKFBWT0lEKSZEZWxiYVJlcSk7CisJCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisjZW5kaWYKKwkJfQorCisJCXJldHVybjsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzPT09PldjaWQ9JWQuVElEPSVkIFxuIiwgX19mdW5jX18sIFdjaWQsIFRJRCkpOworCisJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbSWR4XTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlx0PT09PklkeCA9ICVsZCwgV2NpZD0lZC5USUQ9JWQsIE9SSV9CQV9TdGF0dXMgPSAlZCBcbiIsIElkeCwgV2NpZCwgVElELCBwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cykpOworCS8vCisJLy8gUHJlcGFyZSBEZWxCQSBhY3Rpb24gZnJhbWUgYW5kIHNlbmQgdG8gdGhlIHBlZXIuCisJLy8KKwlpZiAoKGJQYXNzaXZlID09IEZBTFNFKSAmJiAoVElEID09IHBCQUVudHJ5LT5USUQpICYmIChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX0RvbmUpKQorCXsKKwkJTUxNRV9ERUxCQV9SRVFfU1RSVUNUICAgRGVsYmFSZXE7CisJCU1MTUVfUVVFVUVfRUxFTSAqRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOworCisJCU5kaXNaZXJvTWVtb3J5KCZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7CisJCU5kaXNaZXJvTWVtb3J5KEVsZW0sIHNpemVvZihNTE1FX1FVRVVFX0VMRU0pKTsKKworCQlDT1BZX01BQ19BRERSKERlbGJhUmVxLkFkZHIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQWRkcik7CisJCURlbGJhUmVxLldjaWQgPSBXY2lkOworCQlEZWxiYVJlcS5USUQgPSBwQkFFbnRyeS0+VElEOworCQlEZWxiYVJlcS5Jbml0aWF0b3IgPSBPUklHSU5BVE9SOworI2lmIDEKKwkJRWxlbS0+TXNnTGVuICA9IHNpemVvZihEZWxiYVJlcSk7CisJCU5kaXNNb3ZlTWVtb3J5KEVsZW0tPk1zZywgJkRlbGJhUmVxLCBzaXplb2YoRGVsYmFSZXEpKTsKKwkJTWxtZURFTEJBQWN0aW9uKHBBZCwgRWxlbSk7CisJCWtmcmVlKEVsZW0pOworI2Vsc2UKKwkJTWxtZUVucXVldWUocEFkLCBBQ1RJT05fU1RBVEVfTUFDSElORSwgTVQyX01MTUVfT1JJX0RFTEJBX0NBVEUsIHNpemVvZihNTE1FX0RFTEJBX1JFUV9TVFJVQ1QpLCAoUFZPSUQpJkRlbGJhUmVxKTsKKwkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworI2VuZGlmCisJfQorCVJUTVBDYW5jZWxUaW1lcigmcEJBRW50cnktPk9SSUJBVGltZXIsICZDYW5jZWxsZWQpOworCUJBVGFibGVGcmVlT3JpRW50cnkocEFkLCBJZHgpOworCisJaWYgKGJQYXNzaXZlKQorCXsKKwkJLy9CQU9yaVNlc3Npb25TZXRVcChwQWQsICZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBUSUQsIDAsIDEwMDAwLCBUUlVFKTsKKwl9Cit9CisKK1ZPSUQgQkFSZWNTZXNzaW9uVGVhckRvd24oCisJCQkJCQkgSU4gT1VUICBQUlRNUF9BREFQVEVSICAgcEFkLAorCQkJCQkJIElOICAgICAgVUNIQVIgICAgICAgICAgIFdjaWQsCisJCQkJCQkgSU4gICAgICBVQ0hBUiAgICAgICAgICAgVElELAorCQkJCQkJIElOICAgICAgQk9PTEVBTiAgICAgICAgIGJQYXNzaXZlKQoreworCVVMT05HICAgICAgICAgICBJZHggPSAwOworCUJBX1JFQ19FTlRSWSAgICAqcEJBRW50cnk7CisKKwlpZiAoV2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwl7CisJCXJldHVybjsKKwl9CisKKwkvLworCS8vICBMb2NhdGUgY29ycmVzcG9uZGluZyBCQSBPcmlnaW5hdG9yIEVudHJ5IGluIEJBIFRhYmxlIHdpdGggdGhlIChwQWRkcixUSUQpLgorCS8vCisJSWR4ID0gcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5CQVJlY1djaWRBcnJheVtUSURdOworCWlmIChJZHggPT0gMCkKKwkJcmV0dXJuOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcz09PT5XY2lkPSVkLlRJRD0lZCBcbiIsIF9fZnVuY19fLCBXY2lkLCBUSUQpKTsKKworCisJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbSWR4XTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlx0PT09PklkeCA9ICVsZCwgV2NpZD0lZC5USUQ9JWQsIFJFQ19CQV9TdGF0dXMgPSAlZCBcbiIsIElkeCwgV2NpZCwgVElELCBwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cykpOworCS8vCisJLy8gUHJlcGFyZSBEZWxCQSBhY3Rpb24gZnJhbWUgYW5kIHNlbmQgdG8gdGhlIHBlZXIuCisJLy8KKwlpZiAoKFRJRCA9PSBwQkFFbnRyeS0+VElEKSAmJiAocEJBRW50cnktPlJFQ19CQV9TdGF0dXMgPT0gUmVjaXBpZW50X0FjY2VwdCkpCisJeworCQlNTE1FX0RFTEJBX1JFUV9TVFJVQ1QgICBEZWxiYVJlcTsKKwkJQk9PTEVBTiAJCQkJQ2FuY2VsbGVkOworCQlNTE1FX1FVRVVFX0VMRU0gKkVsZW0gPSAoTUxNRV9RVUVVRV9FTEVNICopIGttYWxsb2Moc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSksIE1FTV9BTExPQ19GTEFHKTsKKwkJLy9VTE9ORyAgIG9mZnNldDsKKwkJLy9VSU5UMzIgIFZBTFVFOworCisJCVJUTVBDYW5jZWxUaW1lcigmcEJBRW50cnktPlJFQ0JBVGltZXIsICZDYW5jZWxsZWQpOworCisJCS8vCisJCS8vIDEuIFNlbmQgREVMQkEgQWN0aW9uIEZyYW1lCisJCS8vCisJCWlmIChiUGFzc2l2ZSA9PSBGQUxTRSkKKwkJeworCQkJTmRpc1plcm9NZW1vcnkoJkRlbGJhUmVxLCBzaXplb2YoRGVsYmFSZXEpKTsKKwkJCU5kaXNaZXJvTWVtb3J5KEVsZW0sIHNpemVvZihNTE1FX1FVRVVFX0VMRU0pKTsKKworCQkJQ09QWV9NQUNfQUREUihEZWxiYVJlcS5BZGRyLCBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkFkZHIpOworCQkJRGVsYmFSZXEuV2NpZCA9IFdjaWQ7CisJCQlEZWxiYVJlcS5USUQgPSBUSUQ7CisJCQlEZWxiYVJlcS5Jbml0aWF0b3IgPSBSRUNJUElFTlQ7CisjaWYgMQorCQkJRWxlbS0+TXNnTGVuICA9IHNpemVvZihEZWxiYVJlcSk7CisJCQlOZGlzTW92ZU1lbW9yeShFbGVtLT5Nc2csICZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7CisJCQlNbG1lREVMQkFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCWtmcmVlKEVsZW0pOworI2Vsc2UKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgQUNUSU9OX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX09SSV9ERUxCQV9DQVRFLCBzaXplb2YoTUxNRV9ERUxCQV9SRVFfU1RSVUNUKSwgKFBWT0lEKSZEZWxiYVJlcSk7CisJCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisjZW5kaWYKKwkJfQorCisKKwkJLy8KKwkJLy8gMi4gRnJlZSByZXNvdXJjZSBvZiBCQSBzZXNzaW9uCisJCS8vCisJCS8vIGZsdXNoIGFsbCBwZW5kaW5nIHJlb3JkZXJpbmcgbXBkdXMKKwkJYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKHBBZCwgcEJBRW50cnkpOworCisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKKworCQkvLyBFcmFzZSBCaXRtYXAgZmxhZy4KKwkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBSRVNFVF9SQ1ZfU0VROworCQlwQkFFbnRyeS0+QkFXaW5TaXplID0gMDsKKwkJLy8gRXJhc2UgQml0bWFwIGZsYWcgYXQgc29mdHdhcmUgbWFjdGFibGUKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5SWEJBYml0bWFwICY9ICh+KDE8PChwQkFFbnRyeS0+VElEKSkpOworCQlwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkJBUmVjV2NpZEFycmF5W1RJRF0gPSAwOworCisJCVJUMjhYWF9ERUxfQkFfU0VTU0lPTl9GUk9NX0FTSUMocEFkLCBXY2lkLCBUSUQpOworCisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKKworCX0KKworCUJBVGFibGVGcmVlUmVjRW50cnkocEFkLCBJZHgpOworfQorCitWT0lEIEJBU2Vzc2lvblRlYXJEb3duQUxMKAorCQkJCQkJIElOIE9VVCAgUFJUTVBfQURBUFRFUiBwQWQsCisJCQkJCQkgSU4gICAgICBVQ0hBUiBXY2lkKQoreworCWludCBpOworCisJZm9yIChpPTA7IGk8TlVNX09GX1RJRDsgaSsrKQorCXsKKwkJQkFPcmlTZXNzaW9uVGVhckRvd24ocEFkLCBXY2lkLCBpLCBGQUxTRSwgRkFMU0UpOworCQlCQVJlY1Nlc3Npb25UZWFyRG93bihwQWQsIFdjaWQsIGksIEZBTFNFKTsKKwl9Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlSZXRyeSBzZW5kaW5nIEFEREJBIFJlcWVzdC4KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJUGFyYW1ldHJzOgorCXA4MDIzSGVhZGVyOiBpZiB0aGlzIGlzIGFscmVhZHkgODAyLjMgZm9ybWF0LCBwODAyM0hlYWRlciBpcyBOVUxMCisKKwlSZXR1cm4JOiBUUlVFIGlmIHB1dCBpbnRvIHJ4IHJlb3JkZXJpbmcgYnVmZmVyLCBzaG91bGRuJ3QgaW5kaWNhdGVyeGhlcmUuCisJCQkJRkFMU0UgLCB0aGVuIGNvbnRpbnVlIGluZGljYXRlcnggYXQgdGhpcyBtb21lbnQuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBCQU9yaVNlc3Npb25TZXR1cFRpbWVvdXQoCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCUJBX09SSV9FTlRSWSAgICAqcEJBRW50cnkgPSAoQkFfT1JJX0VOVFJZICopRnVuY3Rpb25Db250ZXh0OworCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCVBSVE1QX0FEQVBURVIgICBwQWQ7CisKKwlpZiAocEJBRW50cnkgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJcEFkID0gcEJBRW50cnktPnBBZGFwdGVyOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCS8vIERvIG5vdGhpbmcgaWYgbW9uaXRvciBtb2RlIGlzIG9uCisJCWlmIChNT05JVE9SX09OKHBBZCkpCisJCQlyZXR1cm47CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgUkFMSU5LX0FURQorCS8vIE5vdGhpbmcgdG8gZG8gaW4gQVRFIG1vZGUuCisJaWYgKEFURV9PTihwQWQpKQorCQlyZXR1cm47CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbcEJBRW50cnktPldjaWRdOworCisJaWYgKChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX1dhaXRSZXMpICYmIChwQkFFbnRyeS0+VG9rZW4gPCBPUklfU0VTU0lPTl9NQVhfUkVUUlkpKQorCXsKKwkJTUxNRV9BRERCQV9SRVFfU1RSVUNUICAgIEFkZGJhUmVxOworCisJCU5kaXNaZXJvTWVtb3J5KCZBZGRiYVJlcSwgc2l6ZW9mKEFkZGJhUmVxKSk7CisJCUNPUFlfTUFDX0FERFIoQWRkYmFSZXEucEFkZHIsIHBFbnRyeS0+QWRkcik7CisJCUFkZGJhUmVxLldjaWQgPSAoVUNIQVIpKHBFbnRyeS0+QWlkKTsKKwkJQWRkYmFSZXEuVElEID0gcEJBRW50cnktPlRJRDsKKwkJQWRkYmFSZXEuQmFCdWZTaXplID0gcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdDsKKwkJQWRkYmFSZXEuVGltZU91dFZhbHVlID0gMDsKKwkJQWRkYmFSZXEuVG9rZW4gPSBwQkFFbnRyeS0+VG9rZW47CisJCU1sbWVFbnF1ZXVlKHBBZCwgQUNUSU9OX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0FERF9CQV9DQVRFLCBzaXplb2YoTUxNRV9BRERCQV9SRVFfU1RSVUNUKSwgKFBWT0lEKSZBZGRiYVJlcSk7CisJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQSBPcmkgU2Vzc2lvbiBUaW1lb3V0KCVkKSA6IFNlbmQgQUREIEJBIGFnYWluXG4iLCBwQkFFbnRyeS0+VG9rZW4pKTsKKworCQlwQkFFbnRyeS0+VG9rZW4rKzsKKwkJUlRNUFNldFRpbWVyKCZwQkFFbnRyeS0+T1JJQkFUaW1lciwgT1JJX0JBX1NFU1NJT05fVElNRU9VVCk7CisJfQorCWVsc2UKKwl7CisJCUJBVGFibGVGcmVlT3JpRW50cnkocEFkLCBwRW50cnktPkJBT3JpV2NpZEFycmF5W3BCQUVudHJ5LT5USURdKTsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUmV0cnkgc2VuZGluZyBBRERCQSBSZXFlc3QuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCVBhcmFtZXRyczoKKwlwODAyM0hlYWRlcjogaWYgdGhpcyBpcyBhbHJlYWR5IDgwMi4zIGZvcm1hdCwgcDgwMjNIZWFkZXIgaXMgTlVMTAorCisJUmV0dXJuCTogVFJVRSBpZiBwdXQgaW50byByeCByZW9yZGVyaW5nIGJ1ZmZlciwgc2hvdWxkbid0IGluZGljYXRlcnhoZXJlLgorCQkJCUZBTFNFICwgdGhlbiBjb250aW51ZSBpbmRpY2F0ZXJ4IGF0IHRoaXMgbW9tZW50LgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQkFSZWNTZXNzaW9uSWRsZVRpbWVvdXQoCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCisJQkFfUkVDX0VOVFJZICAgICpwQkFFbnRyeSA9IChCQV9SRUNfRU5UUlkgKilGdW5jdGlvbkNvbnRleHQ7CisJUFJUTVBfQURBUFRFUiAgIHBBZDsKKwlVTE9ORyAgICAgICAgICAgTm93MzI7CisKKwlpZiAocEJBRW50cnkgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKChwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9PSBSZWNpcGllbnRfQWNjZXB0KSkKKwl7CisJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdzMyKTsKKworCQlpZiAoUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdzMyLCAodW5zaWduZWQgbG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyICsgUkVDX0JBX1NFU1NJT05fSURMRV9USU1FT1VUKSkpCisJCXsKKwkJCXBBZCA9IHBCQUVudHJ5LT5wQWRhcHRlcjsKKwkJCS8vIGZsdXNoIGFsbCBwZW5kaW5nIHJlb3JkZXJpbmcgbXBkdXMKKwkJCWJhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhwQWQsIHBCQUVudHJ5KTsKKwkJCXByaW50aygiJWxkOiBSRUMgQkEgc2Vzc2lvbiBUaW1lb3V0XG4iLCBOb3czMik7CisJCX0KKwl9Cit9CisKKworVk9JRCBQZWVyQWRkQkFSZXFBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQorCit7CisJLy8JNy40LjQuMQorCS8vVUxPTkcJSWR4OworCVVDSEFSICAgU3RhdHVzID0gMTsKKwlVQ0hBUiAgIHBBZGRyWzZdOworCUZSQU1FX0FEREJBX1JTUCBBRERmcmFtZTsKKwlQVUNIQVIgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUyAgICAgTlN0YXR1czsKKwlQRlJBTUVfQUREQkFfUkVRICBwQWRkcmVxRnJhbWUgPSBOVUxMOworCS8vVUNIQVIJCUJ1ZlNpemU7CisJVUxPTkcgICAgICAgRnJhbWVMZW47CisJUFVMT05HICAgICAgcHRlbXA7CisJUE1BQ19UQUJMRV9FTlRSWQlwTWFjRW50cnk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyA9PT4gKFdjaWQgPSAlZClcbiIsIF9fZnVuY19fLCBFbGVtLT5XY2lkKSk7CisKKwkvL2hleF9kdW1wKCJBZGRCQVJlcSIsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKTsKKworCS8vQUREQkEgUmVxdWVzdCBmcm9tIHVua25vd24gcGVlciwgaWdub3JlIHRoaXMuCisJaWYgKEVsZW0tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCXJldHVybjsKKworCXBNYWNFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkEgLSBQZWVyQWRkQkFSZXFBY3Rpb24tLS0tPiBcbiIpKTsKKwlwdGVtcCA9IChQVUxPTkcpRWxlbS0+TXNnOworCS8vREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VNVSwgKCIlMDh4OjogJTA4eDo6ICUwOHg6OiAlMDh4OjogJTA4eDo6ICUwOHg6OiAlMDh4OjogJTA4eDo6ICUwOHhcbiIsICoocHRlbXApLCAqKHB0ZW1wKzEpLCAqKHB0ZW1wKzIpLCAqKHB0ZW1wKzMpLCAqKHB0ZW1wKzQpLCAqKHB0ZW1wKzUpLCAqKHB0ZW1wKzYpLCAqKHB0ZW1wKzcpLCAqKHB0ZW1wKzgpKSk7CisKKwlpZiAoUGVlckFkZEJBUmVxQWN0aW9uU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIHBBZGRyKSkKKwl7CisKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5iQkFEZWNsaW5lID09IEZBTFNFKSAmJiBJU19IVF9TVEEocE1hY0VudHJ5KSkKKwkJeworCQkJcEFkZHJlcUZyYW1lID0gKFBGUkFNRV9BRERCQV9SRVEpKCZFbGVtLT5Nc2dbMF0pOworCQkJcHJpbnRrKCJSY3YgV2NpZCglZCkgQWRkQkFSZXFcbiIsIEVsZW0tPldjaWQpOworCQkJaWYgKEJBUmVjU2Vzc2lvbkFkZChwQWQsICZwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLCBwQWRkcmVxRnJhbWUpKQorCQkJCVN0YXR1cyA9IDA7CisJCQllbHNlCisJCQkJU3RhdHVzID0gMzg7IC8vIG1vcmUgcGFyYW1ldGVycyBoYXZlIGludmFsaWQgdmFsdWVzCisJCX0KKwkJZWxzZQorCQl7CisJCQlTdGF0dXMgPSAzNzsgLy8gdGhlIHJlcXVlc3QgaGFzIGJlZW4gZGVjbGluZWQuCisJCX0KKwl9CisKKwlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5WYWxpZEFzQ0xJKQorCQlBU1NFUlQocEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5Tc3QgPT0gU1NUX0FTU09DKTsKKworCXBBZGRyZXFGcmFtZSA9IChQRlJBTUVfQUREQkFfUkVRKSgmRWxlbS0+TXNnWzBdKTsKKwkvLyAyLiBBbHdheXMgc2VuZCBiYWNrIEFEREJBIFJlc3BvbnNlCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsJIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1RJT04gLSBQZWVyQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQlyZXR1cm47CisJfQorCisJTmRpc1plcm9NZW1vcnkoJkFERGZyYW1lLCBzaXplb2YoRlJBTUVfQUREQkFfUlNQKSk7CisJLy8gMi0xLiBQcmVwYXJlIEFEREJBIFJlc3BvbnNlIGZyYW1lLgorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlpZiAoQURIT0NfT04ocEFkKSkKKwkJCUFjdEhlYWRlckluaXQocEFkLCAmQUREZnJhbWUuSGRyLCBwQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQllbHNlCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLlZhbGlkQXNEbHMpCisJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkFERGZyYW1lLkhkciwgcEFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQkJQWN0SGVhZGVySW5pdChwQWQsICZBRERmcmFtZS5IZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWRkcik7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCUFERGZyYW1lLkNhdGVnb3J5ID0gQ0FURUdPUllfQkE7CisJQUREZnJhbWUuQWN0aW9uID0gQUREQkFfUkVTUDsKKwlBRERmcmFtZS5Ub2tlbiA9IHBBZGRyZXFGcmFtZS0+VG9rZW47CisJLy8gV2hhdCBpcyB0aGUgU3RhdHVzIGNvZGU/PyAgbmVlZCB0byBjaGVjay4KKwlBRERmcmFtZS5TdGF0dXNDb2RlID0gU3RhdHVzOworCUFERGZyYW1lLkJhUGFybS5CQVBvbGljeSA9IElNTUVEX0JBOworCUFERGZyYW1lLkJhUGFybS5BTVNEVVN1cHBvcnRlZCA9IDA7CisJQUREZnJhbWUuQmFQYXJtLlRJRCA9IHBBZGRyZXFGcmFtZS0+QmFQYXJtLlRJRDsKKwlBRERmcmFtZS5CYVBhcm0uQnVmU2l6ZSA9IG1pbigoKFVDSEFSKXBBZGRyZXFGcmFtZS0+QmFQYXJtLkJ1ZlNpemUpLCAoVUNIQVIpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCk7CisJaWYgKEFERGZyYW1lLkJhUGFybS5CdWZTaXplID09IDApCisJeworCQlBRERmcmFtZS5CYVBhcm0uQnVmU2l6ZSA9IDY0OworCX0KKwlBRERmcmFtZS5UaW1lT3V0VmFsdWUgPSAwOyAvL3BBZGRyZXFGcmFtZS0+VGltZU91dFZhbHVlOworCisJKihVU0hPUlQgKikoJkFERGZyYW1lLkJhUGFybSkgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmQUREZnJhbWUuQmFQYXJtKSk7CisJQUREZnJhbWUuU3RhdHVzQ29kZSA9IGNwdTJsZTE2KEFERGZyYW1lLlN0YXR1c0NvZGUpOworCUFERGZyYW1lLlRpbWVPdXRWYWx1ZSA9IGNwdTJsZTE2KEFERGZyYW1lLlRpbWVPdXRWYWx1ZSk7CisKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKwkJCQkJICBzaXplb2YoRlJBTUVfQUREQkFfUlNQKSwgICZBRERmcmFtZSwKKwkJCSAgRU5EX09GX0FSR1MpOworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCVkKTogVElEKCVkKSwgQnVmU2l6ZSglZCkgPD09IFxuIiwgX19mdW5jX18sIEVsZW0tPldjaWQsIEFERGZyYW1lLkJhUGFybS5USUQsCisJCQkJCQkJICBBRERmcmFtZS5CYVBhcm0uQnVmU2l6ZSkpOworfQorCisKK1ZPSUQgUGVlckFkZEJBUnNwQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKKworeworCS8vVUNIQVIJCUlkeCwgaTsKKwkvL1BVQ0hBUgkJICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJUEZSQU1FX0FEREJBX1JTUCAgICBwRnJhbWUgPSBOVUxMOworCS8vUEJBX09SSV9FTlRSWQkJcEJBRW50cnk7CisKKwkvL0FEREJBIFJlc3BvbnNlIGZyb20gdW5rbm93biBwZWVyLCBpZ25vcmUgdGhpcy4KKwlpZiAoRWxlbS0+V2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJcmV0dXJuOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgPT0+IFdjaWQoJWQpXG4iLCBfX2Z1bmNfXywgRWxlbS0+V2NpZCkpOworCisJLy9oZXhfZHVtcCgiUGVlckFkZEJBUnNwQWN0aW9uKCkiLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbik7CisKKwlpZiAoUGVlckFkZEJBUnNwQWN0aW9uU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4pKQorCXsKKwkJcEZyYW1lID0gKFBGUkFNRV9BRERCQV9SU1ApKCZFbGVtLT5Nc2dbMF0pOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlx0XHQgU3RhdHVzQ29kZSA9ICVkXG4iLCBwRnJhbWUtPlN0YXR1c0NvZGUpKTsKKwkJc3dpdGNoIChwRnJhbWUtPlN0YXR1c0NvZGUpCisJCXsKKwkJCWNhc2UgMDoKKwkJCQkvLyBJIHdhbnQgYSBCQXNlc3Npb24gd2l0aCB0aGlzIHBlZXIgYXMgYW4gb3JpZ2luYXRvci4KKwkJCQlCQU9yaVNlc3Npb25BZGQocEFkLCAmcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXSwgcEZyYW1lKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJLy8gY2hlY2sgc3RhdHVzID09IFVTRUQgPz8/CisJCQkJQkFPcmlTZXNzaW9uVGVhckRvd24ocEFkLCBFbGVtLT5XY2lkLCBwRnJhbWUtPkJhUGFybS5USUQsIFRSVUUsIEZBTFNFKTsKKwkJCQlicmVhazsKKwkJfQorCQkvLyBSY3YgRGVjbGluZSBTdGF0dXNDb2RlCisJCWlmICgocEZyYW1lLT5TdGF0dXNDb2RlID09IDM3KQorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorICAgICAgICAgICAgfHwgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJiBTVEFfVEdOX1dJRklfT04ocEFkKSAmJiAocEZyYW1lLT5TdGF0dXNDb2RlICE9IDApKQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworICAgICAgICAgICAgKQorCQl7CisJCQlwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLkJBRGVjbGluZUJpdG1hcCB8PSAxPDxwRnJhbWUtPkJhUGFybS5USUQ7CisJCX0KKwl9Cit9CisKK1ZPSUQgUGVlckRlbEJBQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKKworeworCS8vVUNIQVIJCQkJSWR4OworCS8vUFVDSEFSCQkJCXBPdXRCdWZmZXIgPSBOVUxMOworCVBGUkFNRV9ERUxCQV9SRVEgICAgcERlbEZyYW1lID0gTlVMTDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiJXMgPT0+XG4iLCBfX2Z1bmNfXykpOworCS8vREVMQkEgUmVxdWVzdCBmcm9tIHVua25vd24gcGVlciwgaWdub3JlIHRoaXMuCisJaWYgKFBlZXJEZWxCQUFjdGlvblNhbml0eShwQWQsIEVsZW0tPldjaWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKSkKKwl7CisJCXBEZWxGcmFtZSA9IChQRlJBTUVfREVMQkFfUkVRKSgmRWxlbS0+TXNnWzBdKTsKKwkJaWYgKHBEZWxGcmFtZS0+RGVsYmFQYXJtLkluaXRpYXRvciA9PSBPUklHSU5BVE9SKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJBIC0gUGVlckRlbEJBQWN0aW9uLS0tLT4gT1JJR0lOQVRPUlxuIikpOworCQkJQkFSZWNTZXNzaW9uVGVhckRvd24ocEFkLCBFbGVtLT5XY2lkLCBwRGVsRnJhbWUtPkRlbGJhUGFybS5USUQsIFRSVUUpOworCQl9CisJCWVsc2UKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQSAtIFBlZXJEZWxCQUFjdGlvbi0tLS0+IFJFQ0lQSUVOVCwgUmVhc29uID0gJWRcbiIsICBwRGVsRnJhbWUtPlJlYXNvbkNvZGUpKTsKKwkJCS8vaGV4X2R1bXAoIkRlbEJBIEZyYW1lIiwgcERlbEZyYW1lLCBFbGVtLT5Nc2dMZW4pOworCQkJQkFPcmlTZXNzaW9uVGVhckRvd24ocEFkLCBFbGVtLT5XY2lkLCBwRGVsRnJhbWUtPkRlbGJhUGFybS5USUQsIFRSVUUsIEZBTFNFKTsKKwkJfQorCX0KK30KKworCitCT09MRUFOIENudGxFbnF1ZXVlRm9yUmVjdigKKwkJCQkJCSAgSU4gUFJUTVBfQURBUFRFUgkJcEFkLAorCQkJCQkJICBJTiBVTE9ORwkJCQlXY2lkLAorCQkJCQkJICBJTiBVTE9ORwkJCQlNc2dMZW4sCisJCQkJCQkgIElOIFBGUkFNRV9CQV9SRVEJCXBNc2cpCit7CisJUEZSQU1FX0JBX1JFUSAgIHBGcmFtZSA9IHBNc2c7CisJLy9QUlRNUF9SRU9SREVSQlVGCXBCdWZmZXI7CisJLy9QUlRNUF9SRU9SREVSQlVGCXBEbWFCdWY7CisJUEJBX1JFQ19FTlRSWSBwQkFFbnRyeTsKKwkvL0JPT0xFQU4gCVJlc3VsdDsKKwlVTE9ORyAgIElkeDsKKwkvL1VDSEFSCU51bVJ4UGt0OworCVVDSEFSCVRJRDsvLywgaTsKKworCVRJRCA9IChVQ0hBUilwRnJhbWUtPkJBUkNvbnRyb2wuVElEOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKTogQkFSLVdjaWQoJWxkKSwgVGlkICglZClcbiIsIF9fZnVuY19fLCBXY2lkLCBUSUQpKTsKKwkvL2hleF9kdW1wKCJCQVIiLCAoUENIQVIpIHBGcmFtZSwgTXNnTGVuKTsKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQlyZXR1cm4gRkFMU0U7CisKKwkvLyBGaXJzdCBjaGVjayB0aGUgc2l6ZSwgaXQgTVVTVCBub3QgZXhjZWVkIHRoZSBtbG1lIHF1ZXVlIHNpemUKKwlpZiAoTXNnTGVuID4gTUdNVF9ETUFfQlVGRkVSX1NJWkUpCisJeworCQlEQkdQUklOVF9FUlIoKCJDbnRsRW5xdWV1ZUZvclJlY3Y6IGZyYW1lIHRvbyBsYXJnZSwgc2l6ZSA9ICVsZCBcbiIsIE1zZ0xlbikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCWVsc2UgaWYgKE1zZ0xlbiAhPSBzaXplb2YoRlJBTUVfQkFfUkVRKSkKKwl7CisJCURCR1BSSU5UX0VSUigoIkNudGxFbnF1ZXVlRm9yUmVjdjogQmxvY2tBY2sgUmVxdWVzdCBmcmFtZSBsZW5ndGggc2l6ZSA9ICVsZCBpbmNvcnJlY3RcbiIsIE1zZ0xlbikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCWVsc2UgaWYgKE1zZ0xlbiAhPSBzaXplb2YoRlJBTUVfQkFfUkVRKSkKKwl7CisJCURCR1BSSU5UX0VSUigoIkNudGxFbnF1ZXVlRm9yUmVjdjogQmxvY2tBY2sgUmVxdWVzdCBmcmFtZSBsZW5ndGggc2l6ZSA9ICVsZCBpbmNvcnJlY3RcbiIsIE1zZ0xlbikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYgKChXY2lkIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpICYmIChUSUQgPCA4KSkKKwkJeworCQkvLyBpZiB0aGlzIHJlY2VpdmluZyBwYWNrZXQgaXMgZnJvbSBTQSB0aGF0IGlzIGluIG91ciBPcmlFbnRyeS4gU2luY2UgV0NJRCA8OSBoYXMgZGlyZWN0IG1hcHBpbmcuIG5vIG5lZWQgc2VhcmNoLgorCQlJZHggPSBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkJBUmVjV2NpZEFycmF5W1RJRF07CisJCXBCQUVudHJ5ID0gJnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W0lkeF07CisJCX0KKwkJZWxzZQorCQl7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCQVIoJWxkKSA6IFRpZCAoJWQpIC0gJTA0eDolMDR4XG4iLCBXY2lkLCBUSUQsIHBGcmFtZS0+QkFTdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSwgcEJBRW50cnktPkxhc3RJbmRTZXEgKSk7CisKKwlpZiAoU0VRX1NNQUxMRVIocEJBRW50cnktPkxhc3RJbmRTZXEsIHBGcmFtZS0+QkFTdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSwgTUFYU0VRKSkKKwl7CisJCS8vcHJpbnRrKCJCQVIgU2VxID0gJXgsIExhc3RJbmRTZXEgPSAleFxuIiwgcEZyYW1lLT5CQVN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxLCBwQkFFbnRyeS0+TGFzdEluZFNlcSk7CisJCWJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfbGVfc2VxKHBBZCwgcEJBRW50cnksIHBGcmFtZS0+QkFTdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSk7CisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gKHBGcmFtZS0+QkFTdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSA9PSAwKSA/IE1BWFNFUSA6KHBGcmFtZS0+QkFTdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSAtMSk7CisJfQorCS8vYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKHBBZCwgcEJBRW50cnkpOworCXJldHVybiBUUlVFOworfQorCisvKgorRGVzY3JpcHRpb24gOiBTZW5kIFBTTVAgQWN0aW9uIGZyYW1lIElmIFBTTVAgbW9kZSBzd2l0Y2hlcy4KKyovCitWT0lEIFNlbmRQU01QQWN0aW9uKAorCQkJCSAgIElOIFBSVE1QX0FEQVBURVIJCXBBZCwKKwkJCQkgICBJTiBVQ0hBUgkJCQlXY2lkLAorCQkJCSAgIElOIFVDSEFSCQkJCVBzbXApCit7CisJUFVDSEFSICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTICAgICBOU3RhdHVzOworCS8vVUxPTkcgICAgICAgICAgIElkeDsKKwlGUkFNRV9QU01QX0FDVElPTiAgIEZyYW1lOworCVVMT05HICAgICAgICAgICBGcmFtZUxlbjsKKworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CSAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQkEgLSBNbG1lQUREQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQlyZXR1cm47CisJfQorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCUFjdEhlYWRlckluaXQocEFkLCAmRnJhbWUuSGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5BZGRyKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCUZyYW1lLkNhdGVnb3J5ID0gQ0FURUdPUllfSFQ7CisJRnJhbWUuQWN0aW9uID0gU01QU19BQ1RJT047CisJc3dpdGNoIChQc21wKQorCXsKKwkJY2FzZSBNTVBTX0VOQUJMRToKKwkJCUZyYW1lLlBzbXAgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgTU1QU19EWU5BTUlDOgorCQkJRnJhbWUuUHNtcCA9IDM7CisJCQlicmVhazsKKwkJY2FzZSBNTVBTX1NUQVRJQzoKKwkJCUZyYW1lLlBzbXAgPSAxOworCQkJYnJlYWs7CisJfQorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAorCQkJCQkgIHNpemVvZihGUkFNRV9QU01QX0FDVElPTiksICAgICAgJkZyYW1lLAorCQkJCQkgIEVORF9PRl9BUkdTKTsKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJIVCAtIFNlbmRQU01QQWN0aW9uKCAlZCApICBcbiIsIEZyYW1lLlBzbXApKTsKK30KKworCisjZGVmaW5lIFJBRElPX01FQVNVUkVNRU5UX1JFUVVFU1RfQUNUSU9OCTAKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VECit7CisJVUNIQVIJUmVndWxhdG9yeUNsYXNzOworCVVDSEFSCUNoYW5uZWxOdW1iZXI7CisJVVNIT1JUCVJhbmRvbUludGVydmFsOworCVVTSE9SVAlNZWFzdXJlbWVudER1cmF0aW9uOworCVVDSEFSCU1lYXN1cmVtZW50TW9kZTsKKwlVQ0hBUiAgIEJTU0lEW01BQ19BRERSX0xFTl07CisJVUNIQVIJUmVwb3J0aW5nQ29uZGl0aW9uOworCVVDSEFSCVRocmVzaG9sZDsKKwlVQ0hBUiAgIFNTSURJRVsyXTsJCQkvLyAyIGJ5dGUKK30gQkVBQ09OX1JFUVVFU1Q7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRAoreworCVVDSEFSCUlEOworCVVDSEFSCUxlbmd0aDsKKwlVQ0hBUglUb2tlbjsKKwlVQ0hBUglSZXF1ZXN0TW9kZTsKKwlVQ0hBUglUeXBlOworfSBNRUFTVVJFTUVOVF9SRVE7CisKKworCisKK3ZvaWQgY29udmVydF9yZW9yZGVyaW5nX3BhY2tldF90b19wcmVBTVNEVV9vcl84MDJfM19wYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTiAgVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKwlQTkRJU19QQUNLRVQJcFJ4UGt0OworCVVDSEFSCQkJSGVhZGVyODAyXzNbTEVOR1RIXzgwMl8zXTsKKworCS8vIDEuIGdldCA4MDIuMyBIZWFkZXIKKwkvLyAyLiByZW1vdmUgTExDCisJLy8gCQlhLiBwb2ludGVyIHBSeEJsay0+cERhdGEgdG8gcGF5bG9hZAorCS8vICAgICAgYi4gbW9kaWZ5IHBSeEJsay0+RGF0YVNpemUKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCVJUTVBfODAyXzExX1JFTU9WRV9MTENfQU5EX0NPTlZFUlRfVE9fODAyXzMocFJ4QmxrLCBIZWFkZXI4MDJfMyk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlBU1NFUlQocFJ4QmxrLT5wUnhQYWNrZXQpOworCXBSeFBrdCA9IFJUUEtUX1RPX09TUEtUKHBSeEJsay0+cFJ4UGFja2V0KTsKKworCVJUUEtUX1RPX09TUEtUKHBSeFBrdCktPmRldiA9IGdldF9uZXRkZXZfZnJvbV9ic3NpZChwQWQsIEZyb21XaGljaEJTU0lEKTsKKwlSVFBLVF9UT19PU1BLVChwUnhQa3QpLT5kYXRhID0gcFJ4QmxrLT5wRGF0YTsKKwlSVFBLVF9UT19PU1BLVChwUnhQa3QpLT5sZW4gPSBwUnhCbGstPkRhdGFTaXplOworCVJUUEtUX1RPX09TUEtUKHBSeFBrdCktPnRhaWwgPSBSVFBLVF9UT19PU1BLVChwUnhQa3QpLT5kYXRhICsgUlRQS1RfVE9fT1NQS1QocFJ4UGt0KS0+bGVuOworCisJLy8KKwkvLyBjb3B5IDgwMi4zIGhlYWRlciwgaWYgbmVjZXNzYXJ5CisJLy8KKwlpZiAoIVJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfQU1TRFUpKQorCXsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisjaWZkZWYgTElOVVgKKwkJCU5kaXNNb3ZlTWVtb3J5KHNrYl9wdXNoKHBSeFBrdCwgTEVOR1RIXzgwMl8zKSwgSGVhZGVyODAyXzMsIExFTkdUSF84MDJfMyk7CisjZW5kaWYKKyNpZmRlZiBVQ09TCisJCQlOZGlzTW92ZU1lbW9yeShuZXRfcGt0X3B1c2gocFJ4UGt0LCBMRU5HVEhfODAyXzMpLCBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zKTsKKyNlbmRpZgorCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfQorfQorCisKKyNkZWZpbmUgSU5ESUNBVEVfTEVHQUNZX09SX0FNU0RVKF9wQWQsIF9wUnhCbGssIF9mcm9tV2hpY2hCU1NJRCkJCVwKKwlkbwkJCQkJCQkJCQkJCQkJCQkJXAorCXsJCQkJCQkJCQkJCQkJCQkJCVwKKyAgICAJaWYgKFJYX0JMS19URVNUX0ZMQUcoX3BSeEJsaywgZlJYX0FNU0RVKSkJCQkJCQlcCisgICAgCXsJCQkJCQkJCQkJCQkJCQkJXAorICAgIAkJSW5kaWNhdGVfQU1TRFVfUGFja2V0KF9wQWQsIF9wUnhCbGssIF9mcm9tV2hpY2hCU1NJRCk7CQlcCisgICAgCX0JCQkJCQkJCQkJCQkJCQkJXAorCQllbHNlIGlmIChSWF9CTEtfVEVTVF9GTEFHKF9wUnhCbGssIGZSWF9FQVApKQkJCQkJXAorCQl7CQkJCQkJCQkJCQkJCQkJCVwKKwkJCUluZGljYXRlX0VBUE9MX1BhY2tldChfcEFkLCBfcFJ4QmxrLCBfZnJvbVdoaWNoQlNTSUQpOwkJXAorCQl9CQkJCQkJCQkJCQkJCQkJCVwKKyAgICAJZWxzZQkJCQkJCQkJCQkJCQkJCVwKKyAgICAJewkJCQkJCQkJCQkJCQkJCQlcCisgICAgCQlJbmRpY2F0ZV9MZWdhY3lfUGFja2V0KF9wQWQsIF9wUnhCbGssIF9mcm9tV2hpY2hCU1NJRCk7CQlcCisgICAgCX0JCQkJCQkJCQkJCQkJCQkJXAorCX0gd2hpbGUgKDApOworCisKKworc3RhdGljIFZPSUQgYmFfZW5xdWV1ZV9yZW9yZGVyaW5nX3BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQQkFfUkVDX0VOVFJZCXBCQUVudHJ5LAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKwlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsazsKKwlVSU5UMTYJU2VxdWVuY2UgPSAoVUlOVDE2KSBwUnhCbGstPnBIZWFkZXItPlNlcXVlbmNlOworCisJbXBkdV9ibGsgPSBiYV9tcGR1X2Jsa19hbGxvYyhwQWQpOworCWlmIChtcGR1X2JsayAhPSBOVUxMKQorCXsKKwkJLy8gV3JpdGUgUnhEIGJ1ZmZlciBhZGRyZXNzICYgYWxsb2NhdGVkIGJ1ZmZlciBsZW5ndGgKKwkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7CisKKwkJbXBkdV9ibGstPlNlcXVlbmNlID0gU2VxdWVuY2U7CisKKwkJbXBkdV9ibGstPmJBTVNEVSA9IFJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfQU1TRFUpOworCisJCWNvbnZlcnRfcmVvcmRlcmluZ19wYWNrZXRfdG9fcHJlQU1TRFVfb3JfODAyXzNfcGFja2V0KHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisKKwkJU1RBVFNfSU5DX1JYX1BBQ0tFVFMocEFkLCBGcm9tV2hpY2hCU1NJRCk7CisKKyAgICAgICAgLy8KKwkJLy8gaXQgaXMgbmVjZXNzYXJ5IGZvciByZW9yZGVyaW5nIHBhY2tldCB0byByZWNvcmQKKwkJLy8gd2hpY2ggQlNTIGl0IGNvbWUgZnJvbQorCQkvLworCQlSVE1QX1NFVF9QQUNLRVRfSUYocFJ4QmxrLT5wUnhQYWNrZXQsIEZyb21XaGljaEJTU0lEKTsKKworCQltcGR1X2Jsay0+cFBhY2tldCA9IHBSeEJsay0+cFJ4UGFja2V0OworCisJCWlmIChiYV9yZW9yZGVyaW5nX21wZHVfaW5zZXJ0c29ydGVkKCZwQkFFbnRyeS0+bGlzdCwgbXBkdV9ibGspID09IEZBTFNFKQorCQl7CisJCQkvLyBoYWQgYmVlbiBhbHJlYWR5IHdpdGhpbiByZW9yZGVyaW5nIGxpc3QKKwkJCS8vIGRvbid0IGluZGljYXRlCisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkJYmFfbXBkdV9ibGtfZnJlZShwQWQsIG1wZHVfYmxrKTsKKwkJfQorCisJCUFTU0VSVCgoMDw9IHBCQUVudHJ5LT5saXN0LnFsZW4pICAmJiAocEJBRW50cnktPmxpc3QucWxlbiA8PSBwQkFFbnRyeS0+QkFXaW5TaXplKSk7CisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBCQUVudHJ5LT5SeFJlUmluZ0xvY2spOworCX0KKwllbHNlCisJeworI2lmIDAKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICAoIiEhISAoJWQ6JWQpIENhbid0IGFsbG9jYXRlIHJlb3JkZXJpbmcgbXBkdSBibGtcbiIsCisJCQkJCQkJCSAgIGJsa19jb3VudCwgcEJBRW50cnktPmxpc3QucWxlbikpOworI2Vsc2UKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICAoIiEhISAoJWQpIENhbid0IGFsbG9jYXRlIHJlb3JkZXJpbmcgbXBkdSBibGtcbiIsCisJCQkJCQkJCSAgIHBCQUVudHJ5LT5saXN0LnFsZW4pKTsKKyNlbmRpZgorCQkvKgorCQkgKiBmbHVzaCBhbGwgcGVuZGluZyByZW9yZGVyaW5nIG1wZHVzCisJCSAqIGFuZCByZWNldmluZyBtcGR1IHRvIHVwcGVyIGxheWVyCisJCSAqIG1ha2UgdGNwL2lwIHRvIHRha2UgY2FyZSByZW9yZGVyaW5nIG1lY2hhbmlzbQorCQkgKi8KKwkJLy9iYV9yZWZyZXNoX3Jlb3JkZXJpbmdfbXBkdXMocEFkLCBwQkFFbnRyeSk7CisJCWJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfbGVfc2VxKHBBZCwgcEJBRW50cnksIFNlcXVlbmNlKTsKKworCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFNlcXVlbmNlOworCQlJTkRJQ0FURV9MRUdBQ1lfT1JfQU1TRFUocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwl9Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlJbmRpY2F0ZSB0aGlzIHBhY2tldCB0byB1cHBlciBsYXllciBvciBwdXQgaXQgaW50byByZW9yZGVyaW5nIGJ1ZmZlcgorCisJUGFyYW1ldHJzOgorCQlwUnhCbGsgICAgICAgICA6IGNhcnJ5IG5lY2Vzc2FyeSBwYWNrZXQgaW5mbyA4MDIuMTEgZm9ybWF0CisJCUZyb21XaGljaEJTU0lEIDogdGhlIHBhY2tldCByZWNlaXZlZCBmcm9tIHdoaWNoIEJTUworCisJUmV0dXJuCToKKwkJCSAgbm9uZQorCisJTm90ZSAgICA6CisJICAgICAgICAgIHRoZSBwYWNrZXQgcXVldWVkIGludG8gcmVvcmRlcmluZyBidWZmZXIgbmVlZCB0byBjb3ZlciB0byA4MDIuMyBmb3JtYXQKKwkJCSAgb3IgcHJlX0FNU0RVIGZvcm1hdAorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworVk9JRCBJbmRpY2F0ZV9BTVBEVV9QYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQoreworCVVTSE9SVAkJCQlJZHg7CisJUEJBX1JFQ19FTlRSWQkJcEJBRW50cnkgPSBOVUxMOworCVVJTlQxNgkJCQlTZXF1ZW5jZSA9IHBSeEJsay0+cEhlYWRlci0+U2VxdWVuY2U7CisJVUxPTkcJCQkJTm93MzI7CisJVUNIQVIJCQkJV2NpZCA9IHBSeEJsay0+cFJ4V0ktPldpcmVsZXNzQ2xpSUQ7CisJVUNIQVIJCQkJVElEID0gcFJ4QmxrLT5wUnhXSS0+VElEOworCisKKwlpZiAoIVJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfQU1TRFUpICYmICAocFJ4QmxrLT5EYXRhU2l6ZSA+IE1BWF9SWF9QS1RfTEVOKSkKKwl7CisjaWYgMCAvLyBzYW1wbGUgdGFrZSBvZmYsIG5vIHVzZQorCQlzdGF0aWMgaW50IGVycl9zaXplOworCisJCWVycl9zaXplKys7CisJCWlmIChlcnJfc2l6ZSA+IDIwKSB7CisJCQkgcHJpbnRrKCJBTVBEVSBEYXRhU2l6ZSA9ICVkXG4iLCBwUnhCbGstPkRhdGFTaXplKTsKKwkJCSBoZXhfZHVtcCgiODAyLjExIEhlYWRlciIsIChVQ0hBUiAqKXBSeEJsay0+cEhlYWRlciwgMjQpOworCQkJIGhleF9kdW1wKCJQYXlsb2FkIiwgcFJ4QmxrLT5wRGF0YSwgNjQpOworCQkJIGVycl9zaXplID0gMDsKKwkJfQorI2VuZGlmCisJCS8vIHJlbGVhc2UgcGFja2V0CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybjsKKwl9CisKKworI2lmIDAgLy8gdGVzdAorCS8qIFJlYyBCQSBTZXNzaW9uIGhhZCBiZWVuIHRvcm4gZG93biAqLworCUlORElDQVRFX0xFR0FDWV9PUl9BTVNEVShwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCXJldHVybjsKKyNlbmRpZgorCisJaWYgKFdjaWQgPCBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwl7CisJCUlkeCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQkFSZWNXY2lkQXJyYXlbVElEXTsKKwkJaWYgKElkeCA9PSAwKQorCQl7CisJCQkvKiBSZWMgQkEgU2Vzc2lvbiBoYWQgYmVlbiB0b3JuIGRvd24gKi8KKwkJCUlORElDQVRFX0xFR0FDWV9PUl9BTVNEVShwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCQkJcmV0dXJuOworCQl9CisJCXBCQUVudHJ5ID0gJnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W0lkeF07CisJfQorCWVsc2UKKwl7CisJCS8vIGltcG9zc2libGUgISEhCisJCUFTU0VSVCgwKTsKKwkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJcmV0dXJuOworCX0KKworCUFTU0VSVChwQkFFbnRyeSk7CisKKwkvLyB1cGRhdGUgbGFzdCByeCB0aW1lCisJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93MzIpOworCisJcEJBRW50cnktPnJjdlNlcSA9IFNlcXVlbmNlOworCisKKwliYV9mbHVzaF9yZW9yZGVyaW5nX3RpbWVvdXRfbXBkdXMocEFkLCBwQkFFbnRyeSwgTm93MzIpOworCXBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciA9IE5vdzMyOworCisJLy8KKwkvLyBSZXNldCBMYXN0IEluZGljYXRlIFNlcXVlbmNlCisJLy8KKwlpZiAocEJBRW50cnktPkxhc3RJbmRTZXEgPT0gUkVTRVRfUkNWX1NFUSkKKwl7CisJCUFTU0VSVCgocEJBRW50cnktPmxpc3QucWxlbiA9PSAwKSAmJiAocEJBRW50cnktPmxpc3QubmV4dCA9PSBOVUxMKSk7CisKKwkJLy8gcmVzZXQgcmN2IHNlcXVlbmNlIG9mIEJBIHNlc3Npb24KKwkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBTZXF1ZW5jZTsKKwkJcEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyID0gTm93MzI7CisJCUlORElDQVRFX0xFR0FDWV9PUl9BTVNEVShwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCQlyZXR1cm47CisJfQorCisKKwkvLworCS8vIEkuIENoZWNrIGlmIGluIG9yZGVyLgorCS8vCisJaWYgKFNFUV9TVEVQT05FKFNlcXVlbmNlLCBwQkFFbnRyeS0+TGFzdEluZFNlcSwgTUFYU0VRKSkKKwl7CisJCVVTSE9SVCAgTGFzdEluZFNlcTsKKworCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFNlcXVlbmNlOworCQlJTkRJQ0FURV9MRUdBQ1lfT1JfQU1TRFUocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKyAJCUxhc3RJbmRTZXEgPSBiYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2luX29yZGVyKHBBZCwgcEJBRW50cnksIHBCQUVudHJ5LT5MYXN0SW5kU2VxKTsKKwkJaWYgKExhc3RJbmRTZXEgIT0gUkVTRVRfUkNWX1NFUSkKKwkJeworCQkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBMYXN0SW5kU2VxOworCQl9CisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciA9IE5vdzMyOworCX0KKwkvLworCS8vIElJLiBEcm9wIER1cGxpY2F0ZWQgUGFja2V0CisJLy8KKwllbHNlIGlmIChTZXF1ZW5jZSA9PSBwQkFFbnRyeS0+TGFzdEluZFNlcSkKKwl7CisKKwkJLy8gZHJvcCBhbmQgcmVsZWFzZSBwYWNrZXQKKwkJcEJBRW50cnktPm5Ecm9wUGFja2V0Kys7CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJfQorCS8vCisJLy8gSUlJLiBEcm9wIE9sZCBSZWNlaXZlZCBQYWNrZXQKKwkvLworCWVsc2UgaWYgKFNFUV9TTUFMTEVSKFNlcXVlbmNlLCBwQkFFbnRyeS0+TGFzdEluZFNlcSwgTUFYU0VRKSkKKwl7CisKKwkJLy8gZHJvcCBhbmQgcmVsZWFzZSBwYWNrZXQKKwkJcEJBRW50cnktPm5Ecm9wUGFja2V0Kys7CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJfQorCS8vCisJLy8gSVYuIFJlY2VpdmUgU2VxdWVuY2Ugd2l0aGluIFdpbmRvdyBTaXplCisJLy8KKwllbHNlIGlmIChTRVFfU01BTExFUihTZXF1ZW5jZSwgKCgocEJBRW50cnktPkxhc3RJbmRTZXErcEJBRW50cnktPkJBV2luU2l6ZSsxKSkgJiBNQVhTRVEpLCBNQVhTRVEpKQorCXsKKwkJYmFfZW5xdWV1ZV9yZW9yZGVyaW5nX3BhY2tldChwQWQsIHBCQUVudHJ5LCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwl9CisJLy8KKwkvLyBWLiBSZWNlaXZlIHNlcSBzdXJwYXNzZXMgV2luKGxhc3RzZXEgKyBuTVNEVSkuIFNvIHJlZnJlc2ggYWxsIHJlb3JkZXIgYnVmZmVyCisJLy8KKwllbHNlCisJeworI2lmIDAKKwkJYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKHBBZCwgcEJBRW50cnkpOworCQlJTkRJQ0FURV9MRUdBQ1lfT1JfQU1TRFUocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKyNlbHNlCisJCUxPTkcgV2luU3RhcnRTZXEsIFRtcFNlcTsKKworCisJCVRtcFNlcSA9IFNlcXVlbmNlIC0gKHBCQUVudHJ5LT5CQVdpblNpemUpIC0xOworCQlpZiAoVG1wU2VxIDwgMCkKKwkJeworCQkJVG1wU2VxID0gKE1BWFNFUSsxKSArIFRtcFNlcTsKKwkJfQorCQlXaW5TdGFydFNlcSA9IChUbXBTZXErMSkgJiBNQVhTRVE7CisJCWJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfbGVfc2VxKHBBZCwgcEJBRW50cnksIFdpblN0YXJ0U2VxKTsKKwkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBXaW5TdGFydFNlcTsgLy9UbXBTZXE7CisKKwkJcEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyID0gTm93MzI7CisKKwkJYmFfZW5xdWV1ZV9yZW9yZGVyaW5nX3BhY2tldChwQWQsIHBCQUVudHJ5LCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKworCQlUbXBTZXEgPSBiYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2luX29yZGVyKHBBZCwgcEJBRW50cnksIHBCQUVudHJ5LT5MYXN0SW5kU2VxKTsKKwkJaWYgKFRtcFNlcSAhPSBSRVNFVF9SQ1ZfU0VRKQorCQl7CisJCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFRtcFNlcTsKKwkJfQorI2VuZGlmCisJfQorfQorCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9kYXRhLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkODA5YWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fZGF0YS5jCkBAIC0wLDAgKzEsMjczNCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKyNkZWZpbmUgTUFYX1RYX0lOX1RCVFQJCSgxNikKKworCitVQ0hBUglTTkFQXzgwMl8xSFtdID0gezB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDB9OworVUNIQVIJU05BUF9CUklER0VfVFVOTkVMW10gPSB7MHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHhmOH07CisvLyBBZGQgQ2lzY28gQWlyb25ldCBTTkFQIGhlYWRlIGZvciBDQ1gyIHN1cHBvcnQKK1VDSEFSCVNOQVBfQUlST05FVFtdID0gezB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4NDAsIDB4OTYsIDB4MDAsIDB4MDB9OworVUNIQVIJQ0tJUF9MTENfU05BUFtdID0gezB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4NDAsIDB4OTYsIDB4MDAsIDB4MDJ9OworVUNIQVIJRUFQT0xfTExDX1NOQVBbXT0gezB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODgsIDB4OGV9OworVUNIQVIJRUFQT0xbXSA9IHsweDg4LCAweDhlfTsKK1VDSEFSICAgVFBJRFtdID0gezB4ODEsIDB4MDB9OyAvKiBWTEFOIHJlbGF0ZWQgKi8KKworVUNIQVIJSVBYW10gPSB7MHg4MSwgMHgzN307CitVQ0hBUglBUFBMRV9UQUxLW10gPSB7MHg4MCwgMHhmM307CitVQ0hBUglSYXRlSWRUb1BsY3BTaWduYWxbMTJdID0geworCSAwLCAvKiBSQVRFXzEgKi8JMSwgLyogUkFURV8yICovIAkyLCAvKiBSQVRFXzVfNSAqLwkzLCAvKiBSQVRFXzExICovCS8vIHNlZSBCQlAgc3BlYworCTExLCAvKiBSQVRFXzYgKi8gICAxNSwgLyogUkFURV85ICovICAgIDEwLCAvKiBSQVRFXzEyICovICAgMTQsIC8qIFJBVEVfMTggKi8JLy8gc2VlIElFRUU4MDIuMTFhLTE5OTkgcC4xNAorCSA5LCAvKiBSQVRFXzI0ICovICAxMywgLyogUkFURV8zNiAqLwk4LCAvKiBSQVRFXzQ4ICovICAgMTIgIC8qIFJBVEVfNTQgKi8gfTsgLy8gc2VlIElFRUU4MDIuMTFhLTE5OTkgcC4xNAorCitVQ0hBUgkgT2ZkbVNpZ25hbFRvUmF0ZUlkWzE2XSA9IHsKKwlSQVRFXzU0LCAgUkFURV81NCwJUkFURV81NCwgIFJBVEVfNTQsCS8vIE9GRE0gUExDUCBTaWduYWwgPSAwLCAgMSwgIDIsICAzIHJlc3BlY3RpdmVseQorCVJBVEVfNTQsICBSQVRFXzU0LAlSQVRFXzU0LCAgUkFURV81NCwJLy8gT0ZETSBQTENQIFNpZ25hbCA9IDQsICA1LCAgNiwgIDcgcmVzcGVjdGl2ZWx5CisJUkFURV80OCwgIFJBVEVfMjQsCVJBVEVfMTIsICBSQVRFXzYsCS8vIE9GRE0gUExDUCBTaWduYWwgPSA4LCAgOSwgIDEwLCAxMSByZXNwZWN0aXZlbHkKKwlSQVRFXzU0LCAgUkFURV8zNiwJUkFURV8xOCwgIFJBVEVfOSwJLy8gT0ZETSBQTENQIFNpZ25hbCA9IDEyLCAxMywgMTQsIDE1IHJlc3BlY3RpdmVseQorfTsKKworVUNIQVIJIE9mZG1SYXRlVG9SeHdpTUNTWzEyXSA9IHsKKwkwLCAgMCwJMCwgIDAsCisJMCwgIDEsCTIsICAzLAkvLyBPRkRNIHJhdGUgNiw5LDEyLDE4ID0gcnh3aSBtY3MgMCwxLDIsMworCTQsICA1LAk2LCAgNywJLy8gT0ZETSByYXRlIDI0LDM2LDQ4LDU0ID0gcnh3aSBtY3MgNCw1LDYsNworfTsKK1VDSEFSCSBSeHdpTUNTVG9PZmRtUmF0ZVsxMl0gPSB7CisJUkFURV82LCAgUkFURV85LAlSQVRFXzEyLCAgUkFURV8xOCwKKwlSQVRFXzI0LCAgUkFURV8zNiwJUkFURV80OCwgIFJBVEVfNTQsCS8vIE9GRE0gcmF0ZSA2LDksMTIsMTggPSByeHdpIG1jcyAwLDEsMiwzCisJNCwgIDUsCTYsICA3LAkvLyBPRkRNIHJhdGUgMjQsMzYsNDgsNTQgPSByeHdpIG1jcyA0LDUsNiw3Cit9OworCitjaGFyKiAgIE1DU1RvTWJwc1tdID0geyIxTWJwcyIsIjJNYnBzIiwiNS41TWJwcyIsIjExTWJwcyIsIjA2TWJwcyIsIjA5TWJwcyIsIjEyTWJwcyIsIjE4TWJwcyIsIjI0TWJwcyIsIjM2TWJwcyIsIjQ4TWJwcyIsIjU0TWJwcyIsIk1NLTAiLCJNTS0xIiwiTU0tMiIsIk1NLTMiLCJNTS00IiwiTU0tNSIsIk1NLTYiLCJNTS03IiwiTU0tOCIsIk1NLTkiLCJNTS0xMCIsIk1NLTExIiwiTU0tMTIiLCJNTS0xMyIsIk1NLTE0IiwiTU0tMTUiLCJNTS0zMiIsImVlMSIsImVlMiIsImVlMyJ9OworCitVQ0hBUiBkZWZhdWx0X2N3bWluW109e0NXX01JTl9JTl9CSVRTLCBDV19NSU5fSU5fQklUUywgQ1dfTUlOX0lOX0JJVFMtMSwgQ1dfTUlOX0lOX0JJVFMtMn07CisvL1VDSEFSIGRlZmF1bHRfY3dtYXhbXT17Q1dfTUFYX0lOX0JJVFMsIENXX01BWF9JTl9CSVRTLCBDV19NSU5fSU5fQklUUywgQ1dfTUlOX0lOX0JJVFMtMX07CitVQ0hBUiBkZWZhdWx0X3N0YV9haWZzbltdPXszLDcsMiwyfTsKKworVUNIQVIgTWFwVXNlclByaW9yaXR5VG9BY2Nlc3NDYXRlZ29yeVs4XSA9IHtRSURfQUNfQkUsIFFJRF9BQ19CSywgUUlEX0FDX0JLLCBRSURfQUNfQkUsIFFJRF9BQ19WSSwgUUlEX0FDX1ZJLCBRSURfQUNfVk8sIFFJRF9BQ19WT307CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUFQSSBmb3IgTUxNRSB0byB0cmFuc21pdCBtYW5hZ2VtZW50IGZyYW1lIHRvIEFQIChCU1MgTW9kZSkKKwlvciBzdGF0aW9uIChJQlNTIE1vZGUpCisKKwlBcmd1bWVudHM6CisJCXBBZCBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBEYXRhCQlQb2ludGVyIHRvIHRoZSBvdXRnb2luZyA4MDIuMTEgZnJhbWUKKwkJTGVuZ3RoCQlTaXplIG9mIG91dGdvaW5nIG1hbmFnZW1lbnQgZnJhbWUKKworCVJldHVybiBWYWx1ZToKKwkJTkRJU19TVEFUVVNfRkFJTFVSRQorCQlORElTX1NUQVRVU19QRU5ESU5HCisJCU5ESVNfU1RBVFVTX1NVQ0NFU1MKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMgTWluaXBvcnRNTVJlcXVlc3QoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlRdWVJZHgsCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUlOVAkJCUxlbmd0aCkKK3sKKwlQTkRJU19QQUNLRVQJcFBhY2tldDsKKwlORElTX1NUQVRVUyAgCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJVUxPTkcJIAkJRnJlZU51bTsKKwlVQ0hBUgkJCUlycVN0YXRlOworCVVDSEFSCQkJcnRtcEh3SGRyW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXTsgLy9SVE1QX0hXX0hEUl9MRU5dOworCisJQVNTRVJUKExlbmd0aCA8PSBNR01UX0RNQV9CVUZGRVJfU0laRSk7CisKKwlRdWVJZHg9MzsKKworCS8vIDI4NjBDIHVzZSBUeCBSaW5nCisKKwlJcnFTdGF0ZSA9IHBBZC0+aXJxX2Rpc2FibGVkOworCisJZG8KKwl7CisJCS8vIFJlc2V0IGlzIGluIHByb2dyZXNzLCBzdG9wIGltbWVkaWF0ZWx5CisJCWlmICggUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSB8fAorCQkJIFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKXx8CisJCQkgIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkpCisJCXsKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJCQlicmVhazsKKwkJfQorCisJCS8vIENoZWNrIEZyZWUgcHJpb3JpdHkgcXVldWUKKwkJLy8gU2luY2Ugd2UgdXNlIFBCRiBRdWV1ZTIgZm9yIG1hbmFnZW1lbnQgZnJhbWUuICBJdHMgY29ycmVzcG9uZGluZyBETUEgcmluZyBzaG91bGQgYmUgdXNpbmcgVHhSaW5nLgorCisJCS8vIDI4NjBDIHVzZSBUeCBSaW5nCisJCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKKwkJeworCQkJRnJlZU51bSA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCUZyZWVOdW0gPSBHRVRfTUdNVFJJTkdfRlJFRU5PKHBBZCk7CisJCX0KKworCQlpZiAoKEZyZWVOdW0gPiAwKSkKKwkJeworCQkJLy8gV2UgbmVlZCB0byByZXNlcnZlIHNwYWNlIGZvciBydG1wIGhhcmR3YXJlIGhlYWRlci4gaS5lLiwgVHhXSSBmb3IgUlQyODYwIGFuZCBUeEluZm8rVHhXSSBmb3IgUlQyODcwCisJCQlOZGlzWmVyb01lbW9yeSgmcnRtcEh3SGRyLCAoVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUpKTsKKwkJCVN0YXR1cyA9IFJUTVBBbGxvY2F0ZU5kaXNQYWNrZXQocEFkLCAmcFBhY2tldCwgKFBVQ0hBUikmcnRtcEh3SGRyLCAoVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUpLCBwRGF0YSwgTGVuZ3RoKTsKKwkJCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIk1pbmlwb3J0TU1SZXF1ZXN0IChlcnJvcjo6IGNhbid0IGFsbG9jYXRlIE5ESVMgUEFDS0VUKVxuIikpOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvL3BBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCQkvL3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV8yOworCisKKwkJCVN0YXR1cyA9IE1sbWVIYXJkVHJhbnNtaXQocEFkLCBRdWVJZHgsIHBQYWNrZXQpOworCQkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCVJUTVBGcmVlTmRpc1BhY2tldChwQWQsIHBQYWNrZXQpOworCQl9CisJCWVsc2UKKwkJeworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5NZ210UmluZ0Z1bGxDb3VudCsrOworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUWlkeCglZCksIG5vdCBlbm91Z2ggc3BhY2UgaW4gTWdtdFJpbmcsIE1nbXRSaW5nRnVsbENvdW50PSVsZCFcbiIsCisJCQkJCQkJCQkJUXVlSWR4LCBwQWQtPlJhbGlua0NvdW50ZXJzLk1nbXRSaW5nRnVsbENvdW50KSk7CisJCX0KKworCX0gd2hpbGUgKEZBTFNFKTsKKworCisJcmV0dXJuIFN0YXR1czsKK30KKworCisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNvcHkgZnJhbWUgZnJvbSB3YWl0aW5nIHF1ZXVlIGludG8gcmVsYXRpdmUgcmluZyBidWZmZXIgYW5kIHNldAorCWFwcHJvcHJpYXRlIEFTSUMgcmVnaXN0ZXIgdG8ga2ljayBoYXJkd2FyZSB0cmFuc21pdCBmdW5jdGlvbgorCisJQXJndW1lbnRzOgorCQlwQWQgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwQnVmZmVyIAlQb2ludGVyIHRvCW1lbW9yeSBvZiBvdXRnb2luZyBmcmFtZQorCQlMZW5ndGgJCVNpemUgb2Ygb3V0Z29pbmcgbWFuYWdlbWVudCBmcmFtZQorCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NUQVRVU19GQUlMVVJFCisJCU5ESVNfU1RBVFVTX1BFTkRJTkcKKwkJTkRJU19TVEFUVVNfU1VDQ0VTUworCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUyBNbG1lSGFyZFRyYW5zbWl0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJUXVlSWR4LAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQoreworCWlmICgocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlICE9IFJEX05PUk1BTF9NT0RFKQorI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisJCSkKKwl7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworCQlyZXR1cm4gTWxtZUhhcmRUcmFuc21pdE1nbXRSaW5nKHBBZCxRdWVJZHgscFBhY2tldCk7CisKK30KKworCisKK05ESVNfU1RBVFVTIE1sbWVIYXJkVHJhbnNtaXRNZ210UmluZygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUglRdWVJZHgsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCit7CisJUEFDS0VUX0lORk8gCVBhY2tldEluZm87CisJUFVDSEFSCQkJcFNyY0J1ZlZBOworCVVJTlQJCQlTcmNCdWZMZW47CisJUEhFQURFUl84MDJfMTEJcEhlYWRlcl84MDJfMTE7CisJQk9PTEVBTiAJCWJBY2tSZXF1aXJlZCwgYkluc2VydFRpbWVzdGFtcDsKKwlVQ0hBUgkJCU1sbWVSYXRlOworCVBUWFdJX1NUUlVDIAlwRmlyc3RUeFdJOworCU1BQ19UQUJMRV9FTlRSWQkqcE1hY0VudHJ5ID0gTlVMTDsKKworCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBQYWNrZXQsICZQYWNrZXRJbmZvLCAmcFNyY0J1ZlZBLCAmU3JjQnVmTGVuKTsKKworCS8vIE1ha2Ugc3VyZSBNR01UIHJpbmcgcmVzb3VyY2Ugd29uJ3QgYmUgdXNlZCBieSBvdGhlciB0aHJlYWRzCisvLyBzYW1wbGUsIGZvciBJUlEgTE9DSyAtPiBTRU0gTE9DSworLy8JSXJxU3RhdGUgPSBwQWQtPmlycV9kaXNhYmxlZDsKKy8vCWlmICghSXJxU3RhdGUpCisJCVJUTVBfU0VNX0xPQ0soJnBBZC0+TWdtdFJpbmdMb2NrKTsKKworCisJaWYgKHBTcmNCdWZWQSA9PSBOVUxMKQorCXsKKwkJLy8gVGhlIGJ1ZmZlciBzaG91bGRuJ3QgYmUgTlVMTAorLy8JCWlmICghSXJxU3RhdGUpCisJCQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+TWdtdFJpbmdMb2NrKTsKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCS8vIG91dGdvaW5nIGZyYW1lIGFsd2F5cyB3YWtldXAgUEhZIHRvIHByZXZlbnQgZnJhbWUgbG9zdAorCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKwkJCUFzaWNGb3JjZVdha2V1cChwQWQsIFRSVUUpOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCXBGaXJzdFR4V0kgPSAoUFRYV0lfU1RSVUMpKHBTcmNCdWZWQSArICBUWElORk9fU0laRSk7CisJcEhlYWRlcl84MDJfMTEgPSAoUEhFQURFUl84MDJfMTEpIChwU3JjQnVmVkEgKyBUWElORk9fU0laRSArIFRYV0lfU0laRSk7IC8vVFhXSV9TSVpFKTsKKworCWlmIChwSGVhZGVyXzgwMl8xMS0+QWRkcjFbMF0gJiAweDAxKQorCXsKKwkJTWxtZVJhdGUgPSBwQWQtPkNvbW1vbkNmZy5CYXNpY01sbWVSYXRlOworCX0KKwllbHNlCisJeworCQlNbG1lUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlOworCX0KKworCS8vIFZlcmlmeSBNbG1lIHJhdGUgZm9yIGEgLyBnIGJhbmRzLgorCWlmICgocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsID4gMTQpICYmIChNbG1lUmF0ZSA8IFJBVEVfNikpIC8vIDExQSBiYW5kCisJCU1sbWVSYXRlID0gUkFURV82OworCisJaWYgKChwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSA9PSBCVFlQRV9EQVRBKSAmJgorCQkocEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPT0gU1VCVFlQRV9RT1NfTlVMTCkpCisJeworCQlwTWFjRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIHBIZWFkZXJfODAyXzExLT5BZGRyMSk7CisJfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCS8vIEZpeGVkIFc1MiB3aXRoIEFjdGl2aXR5IHNjYW4gaXNzdWUgaW4gQUJHX01JWEVEIGFuZCBBQkdOX01JWEVEIG1vZGUuCisJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFCR19NSVhFRAorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJfHwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdOX01JWEVECisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCSkKKwkJeworCQkJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA+IDE0KQorCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gMTsKKwkJCWVsc2UKKwkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IDA7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLworCS8vIFNob3VsZCBub3QgYmUgaGFyZCBjb2RlIHRvIHNldCBQd3JNZ210IHRvIDAgKFBXUl9BQ1RJVkUpCisJLy8gU25pY2UgaXQncyBiZWVuIHNldCB0byAwIHdoaWxlIG9uIE1ndE1hY0hlYWRlckluaXQKKwkvLyBCeSB0aGUgd2F5IHRoaXMgd2lsbCBjYXVzZSBmcmFtZSB0byBiZSBzZW5kIG9uIFBXUl9TQVZFIGZhaWxlZC4KKwkvLworCS8vIHBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gMDsgLy8gKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSk7CisJLy8KKwkvLyBJbiBXTU0tVUFQU0QsIG1sbWUgZnJhbWUgc2hvdWxkIGJlIHNldCBwc20gYXMgcG93ZXIgc2F2aW5nIGJ1dCBwcm9iZSByZXF1ZXN0IGZyYW1lCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisgICAgLy8gRGF0YS1OdWxsIHBhY2tldHMgYWxzZSBwYXNzIHRocm91Z2ggTU1SZXF1ZXN0IGluIFJUMjg2MCwgaG93ZXZlciwgd2UgaG9wZSBjb250cm9sIHRoZSBwc20gYml0IHRvIHBhc3MgQVBTRAorCWlmICgocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgIT0gQlRZUEVfREFUQSkgJiYgKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlICE9IEJUWVBFX0NOVEwpKQorCXsKKwkJaWYgKChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpICYmCisJCQkocEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPT0gU1VCVFlQRV9BQ1RJT04pKQorCQkJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSBQV1JfU0FWRTsKKwkJZWxzZQorCQkJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSBQV1JfQUNUSVZFOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCWJJbnNlcnRUaW1lc3RhbXAgPSBGQUxTRTsKKwlpZiAocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgPT0gQlRZUEVfQ05UTCkgLy8gbXVzdCBiZSBQUy1QT0xMCisJeworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkvL1NldCBQTSBiaXQgaW4gcHMtcG9sbCwgdG8gZml4IFdMSyAxLjIgIFBvd2VyU2F2ZU1vZGVfZXh0IGZhaWx1cmUgaXNzdWUuCisJCWlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYgKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUFNfUE9MTCkpCisJCXsKKwkJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJYkFja1JlcXVpcmVkID0gRkFMU0U7CisJfQorCWVsc2UgLy8gQlRZUEVfTUdNVCBvciBCVFlQRV9EQVRBKG11c3QgYmUgTlVMTCBmcmFtZSkKKwl7CisJCS8vcEFkLT5TZXF1ZW5jZSsrOworCQkvL3BIZWFkZXJfODAyXzExLT5TZXF1ZW5jZSA9IHBBZC0+U2VxdWVuY2U7CisKKwkJaWYgKHBIZWFkZXJfODAyXzExLT5BZGRyMVswXSAmIDB4MDEpIC8vIE1VTFRJQ0FTVCwgQlJPQURDQVNUCisJCXsKKwkJCWJBY2tSZXF1aXJlZCA9IEZBTFNFOworCQkJcEhlYWRlcl84MDJfMTEtPkR1cmF0aW9uID0gMDsKKwkJfQorCQllbHNlCisJCXsKKwkJCWJBY2tSZXF1aXJlZCA9IFRSVUU7CisJCQlwSGVhZGVyXzgwMl8xMS0+RHVyYXRpb24gPSBSVE1QQ2FsY0R1cmF0aW9uKHBBZCwgTWxtZVJhdGUsIDE0KTsKKwkJCWlmIChwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX1BST0JFX1JTUCkKKwkJCXsKKwkJCQliSW5zZXJ0VGltZXN0YW1wID0gVFJVRTsKKwkJCX0KKwkJfQorCX0KKworCXBIZWFkZXJfODAyXzExLT5TZXF1ZW5jZSA9IHBBZC0+U2VxdWVuY2UrKzsKKwlpZiAocEFkLT5TZXF1ZW5jZSA+MHhmZmYpCisJCXBBZC0+U2VxdWVuY2UgPSAwOworCisJLy8gQmVmb3JlIHJhZGFyIGRldGVjdGlvbiBkb25lLCBtZ210IGZyYW1lIGNhbiBub3QgYmUgc2VudCBidXQgcHJvYmUgcmVxCisJLy8gQmVjYXVzZSB3ZSBuZWVkIHRvIHVzZSBwcm9iZSByZXEgdG8gdHJpZ2dlciBkcml2ZXIgdG8gc2VuZCBwcm9iZSByZXEgaW4gcGFzc2l2ZSBzY2FuCisJaWYgKChwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSAhPSBTVUJUWVBFX1BST0JFX1JFUSkKKwkJJiYgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpCisJCSYmIChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgIT0gUkRfTk9STUFMX01PREUpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJNbG1lSGFyZFRyYW5zbWl0IC0tPiByYWRhciBkZXRlY3Qgbm90IGluIG5vcm1hbCBtb2RlICEhIVxuIikpOworLy8JCWlmICghSXJxU3RhdGUpCisJCQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+TWdtdFJpbmdMb2NrKTsKKwkJcmV0dXJuIChORElTX1NUQVRVU19GQUlMVVJFKTsKKwl9CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUilwSGVhZGVyXzgwMl8xMSwgRElSX1dSSVRFLCBGQUxTRSk7CisjZW5kaWYKKworCS8vCisJLy8gZmlsbCBzY2F0dGVyLWFuZC1nYXRoZXIgYnVmZmVyIGxpc3QgaW50byBUWEQuIEludGVybmFsbHkgY3JlYXRlZCBORElTIFBBQ0tFVAorCS8vIHNob3VsZCBhbHdheXMgaGFzIG9ubHkgb25lIG9oeXNpY2FsIGJ1ZmZlciwgYW5kIHRoZSB3aG9sZSBmcmFtZSBzaXplIGVxdWFscworCS8vIHRvIHRoZSBmaXJzdCBzY2F0dGVyIGJ1ZmZlciBzaXplCisJLy8KKworCS8vIEluaXRpYWxpemUgVFggRGVzY3JpcHRvcgorCS8vIEZvciBpbnRlci1mcmFtZSBnYXAsIHRoZSBudW1iZXIgaXMgZm9yIHRoaXMgZnJhbWUgYW5kIG5leHQgZnJhbWUKKwkvLyBGb3IgTUxNRSByYXRlLCB3ZSB3aWxsIGZpeCBhcyAyTWIgdG8gbWF0Y2ggb3RoZXIgdmVuZG9yJ3MgaW1wbGVtZW50CisvLwlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IDE7CisKKy8vIG1hbmFnZW1lbnQgZnJhbWUgZG9lc24ndCBuZWVkIGVuY3J5cHRpb24uIHNvIHVzZSBSRVNFUlZFRF9XQ0lEIG5vIG1hdHRlciB1IGFyZSBzZW5kaW5nIHRvIHNwZWNpZmljIHdjaWQgb3Igbm90LgorCWlmIChwTWFjRW50cnkgPT0gTlVMTCkKKwl7CisJCVJUTVBXcml0ZVR4V0kocEFkLCBwRmlyc3RUeFdJLCBGQUxTRSwgRkFMU0UsIGJJbnNlcnRUaW1lc3RhbXAsIEZBTFNFLCBiQWNrUmVxdWlyZWQsIEZBTFNFLAorCQkwLCBSRVNFUlZFRF9XQ0lELCAoU3JjQnVmTGVuIC0gVFhJTkZPX1NJWkUgLSBUWFdJX1NJWkUpLCBQSURfTUdNVCwgMCwgIChVQ0hBUilwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTLCBJRlNfQkFDS09GRiwgRkFMU0UsICZwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQpOworCX0KKwllbHNlCisJeworCQlSVE1QV3JpdGVUeFdJKHBBZCwgcEZpcnN0VHhXSSwgRkFMU0UsIEZBTFNFLAorCQkJCQliSW5zZXJ0VGltZXN0YW1wLCBGQUxTRSwgYkFja1JlcXVpcmVkLCBGQUxTRSwKKwkJCQkJMCwgcE1hY0VudHJ5LT5BaWQsIChTcmNCdWZMZW4gLSBUWElORk9fU0laRSAtIFRYV0lfU0laRSksCisJCQkJCXBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUywgMCwKKwkJCQkJKFVDSEFSKXBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUywKKwkJCQkJSUZTX0JBQ0tPRkYsIEZBTFNFLCAmcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUpOworCX0KKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlSVE1QV0lFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwRmlyc3RUeFdJLCBUWVBFX1RYV0kpOworI2VuZGlmCisKKwkvLyBOb3cgZG8gaGFyZHdhcmUtZGVwZW5lZCBraWNrIG91dC4KKwlIQUxfS2lja091dE1nbXRUeChwQWQsIFF1ZUlkeCwgcFBhY2tldCwgcFNyY0J1ZlZBLCBTcmNCdWZMZW4pOworCisJLy8gTWFrZSBzdXJlIHRvIHJlbGVhc2UgTUdNVCByaW5nIHJlc291cmNlCisvLwlpZiAoIUlycVN0YXRlKQorCQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+TWdtdFJpbmdMb2NrKTsKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU5ldyBEZVF1ZXVlIFByb2NlZHVyZXMuCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBERVFVRVVFX0xPQ0sobG9jaywgYkludENvbnRleHQsIElycUZsYWdzKSAJCQkJXAorCQkJZG97CQkJCQkJCQkJCQkJCVwKKwkJCQlpZiAoYkludENvbnRleHQgPT0gRkFMU0UpCQkJCQkJXAorCQkJCVJUTVBfSVJRX0xPQ0soKGxvY2spLCBJcnFGbGFncyk7CQlcCisJCQl9d2hpbGUoMCkKKworI2RlZmluZSBERVFVRVVFX1VOTE9DSyhsb2NrLCBiSW50Q29udGV4dCwgSXJxRmxhZ3MpCQkJCVwKKwkJCWRvewkJCQkJCQkJCQkJCQlcCisJCQkJaWYgKGJJbnRDb250ZXh0ID09IEZBTFNFKQkJCQkJCVwKKwkJCQkJUlRNUF9JUlFfVU5MT0NLKChsb2NrKSwgSXJxRmxhZ3MpOwlcCisJCQl9d2hpbGUoMCkKKworCisjaWYgMAorc3RhdGljIFZPSUQgZHVtcFR4QmxrKFRYX0JMSyAqcFR4QmxrKQoreworCU5ESVNfUEFDS0VUICpwUGFja2V0OworCWludCBpLCBmcmFtZU51bTsKKwlQUVVFVUVfRU5UUlkJcFFFbnRyeTsKKworCXByaW50aygiRHVtcCBUWF9CTEsgU3RydWN0dXJlOlxuIik7CisJcHJpbnRrKCJcdFR4RnJhbWVUeXBlPSVkIVxuIiwgcFR4QmxrLT5UeEZyYW1lVHlwZSk7CisJcHJpbnRrKCJcdFRvdGFsRnJhbWVMZW49JWRcbiIsIHBUeEJsay0+VG90YWxGcmFtZUxlbik7CisJcHJpbnRrKCJcdFRvdGFsRnJhbWVOdW09JWxkIVxuIiwgcFR4QmxrLT5UeFBhY2tldExpc3QuTnVtYmVyKTsKKwlwcmludGsoIlx0VG90YWxGcmFnTnVtPSVkIVxuIiwgcFR4QmxrLT5Ub3RhbEZyYWdOdW0pOworCXByaW50aygiXHRwUGFja2V0TGlzdD1cbiIpOworCisJZnJhbWVOdW0gPSBwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXI7CisKKwlmb3IoaT0wOyBpIDwgZnJhbWVOdW07IGkrKykKKwl7CWludCBqOworCQlVQ0hBUgkqcEJ1ZjsKKworCQlwUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7CisJCXBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocFFFbnRyeSk7CisJCWlmIChwUGFja2V0KQorCQl7CisJCQlwQnVmID0gR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOworCQkJcHJpbnRrKCJcdFx0WyVkXTpwdHI9MHgleCwgTGVuPSVkIVxuIiwgaSwgKFVJTlQzMikoR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpKSwgR0VUX09TX1BLVF9MRU4ocFBhY2tldCkpOworCQkJcHJpbnRrKCJcdFx0Iik7CisJCQlmb3IgKGogPTAgOyBqIDwgR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7IGorKykKKwkJCXsKKwkJCQlwcmludGsoIiUwMnggIiwgKHBCdWZbal0gJiAweGZmKSk7CisJCQkJaWYgKGogPT0gMTYpCisJCQkJCWJyZWFrOworCQkJfQorCQkJSW5zZXJ0VGFpbFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCwgUEFDS0VUX1RPX1FVRVVFX0VOVFJZKHBQYWNrZXQpKTsKKwkJfQorCX0KKwlwcmludGsoIlx0V2NpZD0lZCFcbiIsIHBUeEJsay0+V2NpZCk7CisJcHJpbnRrKCJcdGFwaWR4PSVkIVxuIiwgcFR4QmxrLT5hcGlkeCk7CisJcHJpbnRrKCItLS0tRW5kT2ZEdW1wXG4iKTsKKworfQorI2VuZGlmCisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlUeCBQYXRoIGRlc2lnbiBhbGdvcml0aG06CisJCUJhc2ljYWxseSwgd2UgZGl2aWRlIHRoZSBwYWNrZXRzIGludG8gZm91ciB0eXBlcywgQnJvYWRjYXN0L011bHRpY2FzdCwgMTFOIFJhdGUoQU1QRFUsIEFNU0RVLCBOb3JtYWwpLCBCL0cgUmF0ZShBUkFMSU5LLCBOb3JtYWwpLAorCQlTcGVjaWZpYyBQYWNrZXQgVHlwZS4gRm9sbG93aW5nIHNob3cgdGhlIGNsYXNzaWZpY2F0aW9uIHJ1bGUgYW5kIHBvbGljeSBmb3IgZWFjaCBraW5kcyBvZiBwYWNrZXRzLgorCQkJCUNsYXNzaWZpY2F0aW9uIFJ1bGU9PgorCQkJCQlNdWx0aWNhc3Q6ICgqYWRkcjEgJiAweDAxKSA9PSAweDAxCisJCQkJCVNwZWNpZmljIDogYkRIQ1BGcmFtZSwgYkFSUEZyYW1lLCBiRUFQT0xGcmFtZSwgZXRjLgorCQkJCQkxMU4gUmF0ZSA6IElmIHBlZXIgc3VwcG9ydCBIVAorCQkJCQkJCQkoMSkuQU1QRFUgIC0tIElmIFRYQkEgaXMgbmVnb3RpYXRlZC4KKwkJCQkJCQkJKDIpLkFNU0RVICAtLSBJZiBBTVNEVSBpcyBjYXBhYmxlIGZvciBib3RoIHBlZXIgYW5kIG91cnNlbGYuCisJCQkJCQkJCQkJCSopLiBBTVNEVSBjYW4gZW1iZWRkZWQgaW4gYSBBTVBEVSwgYnV0IG5vdyB3ZSBkaWRuJ3Qgc3VwcG9ydCBpdC4KKwkJCQkJCQkJKDMpLk5vcm1hbCAtLSBPdGhlciBwYWNrZXRzIHdoaWNoIHNlbmQgYXMgMTFuIHJhdGUuCisKKwkJCQkJQi9HIFJhdGUgOiBJZiBwZWVyIGlzIGIvZyBvbmx5LgorCQkJCQkJCQkoMSkuQVJBTElOSy0tIElmIGJvdGggb2YgcGVlci91cyBzdXBwcm90IFJhbGluayBwcm9wcmlldGFyeSBBZ2dyZWdhdGlvbiBhbmQgdGhlIFR4UmF0ZSBpcyBsYXJnZSB0aGFuIFJBVEVfNgorCQkJCQkJCQkoMikuTm9ybWFsIC0tIE90aGVyIHBhY2tldHMgd2hpY2ggc2VuZCBhcyBiL2cgcmF0ZS4KKwkJCQkJRnJhZ21lbnQ6CisJCQkJCQkJCVRoZSBwYWNrZXQgbXVzdCBiZSB1bmljYXN0LCBOT1QgQS1SQUxJTkssIE5PVCBBLU1TRFUsIE5PVCAxMW4sIHRoZW4gY2FuIGNvbnNpZGVyIGFib3V0IGZyYWdtZW50LgorCisJCQkJQ2xhc3NpZmllZCBQYWNrZXQgSGFuZGxlIFJ1bGU9PgorCQkJCQlNdWx0aWNhc3Q6CisJCQkJCQkJCU5vIEFDSywgCQkvL3BUeEJsay0+YkFja1JlcXVpcmVkID0gRkFMU0U7CisJCQkJCQkJCU5vIFdNTSwgCQkvL3BUeEJsay0+YldNTSA9IEZBTFNFOworCQkJCQkJCQlObyBwaWdneWJhY2ssICAgLy9wVHhCbGstPmJQaWdneUJhY2sgPSBGQUxTRTsKKwkJCQkJCQkJRm9yY2UgTG93UmF0ZSwgIC8vcFR4QmxrLT5iRm9yY2VMb3dSYXRlID0gVFJVRTsKKwkJCQkJU3BlY2lmaWMgOglCYXNpY2FsbHksIGZvciBzcGVjaWZpYyBwYWNrZXQsIHdlIHNob3VsZCBoYW5kbGUgaXQgc3BlY2lmaWNhbGx5LCBidXQgbm93IGFsbCBzcGVjaWZpYyBwYWNrZXRzIGFyZSB1c2UKKwkJCQkJCQkJCXRoZSBzYW1lIHBvbGljeSB0byBoYW5kbGUgaXQuCisJCQkJCQkJCUZvcmNlIExvd1JhdGUsICAvL3BUeEJsay0+YkZvcmNlTG93UmF0ZSA9IFRSVUU7CisKKwkJCQkJMTFOIFJhdGUgOgorCQkJCQkJCQlObyBwaWdneWJhY2ssCS8vcFR4QmxrLT5iUGlnZ3lCYWNrID0gRkFMU0U7CisKKwkJCQkJCQkJKDEpLkFNU0RVCisJCQkJCQkJCQlwVHhCbGstPmJXTU0gPSBUUlVFOworCQkJCQkJCQkoMikuQU1QRFUKKwkJCQkJCQkJCXBUeEJsay0+YldNTSA9IFRSVUU7CisJCQkJCQkJCSgzKS5Ob3JtYWwKKworCQkJCQlCL0cgUmF0ZSA6CisJCQkJCQkJCSgxKS5BUkFMSU5LCisKKwkJCQkJCQkJKDIpLk5vcm1hbAorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBVQ0hBUiBUeFBrdENsYXNzaWZpY2F0aW9uKAorCUlOIFJUTVBfQURBUFRFUiAqcEFkLAorCUlOIFBORElTX1BBQ0tFVCAgcFBhY2tldCkKK3sKKwlVQ0hBUgkJCVR4RnJhbWVUeXBlID0gVFhfVU5LT1dOX0ZSQU1FOworCVVDSEFSCQkJV2NpZDsKKwlNQUNfVEFCTEVfRU5UUlkJKnBNYWNFbnRyeSA9IE5VTEw7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJQk9PTEVBTgkJCWJIVFJhdGUgPSBGQUxTRTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCVdjaWQgPSBSVE1QX0dFVF9QQUNLRVRfV0NJRChwUGFja2V0KTsKKwlpZiAoV2NpZCA9PSBNQ0FTVF9XQ0lEKQorCXsJLy8gSGFuZGxlIGZvciBSQSBpcyBCcm9hZGNhc3QvTXVsdGljYXN0IEFkZHJlc3MuCisJCXJldHVybiBUWF9NQ0FTVF9GUkFNRTsKKwl9CisKKwkvLyBIYW5kbGUgZm9yIHVuaWNhc3QgcGFja2V0cworCXBNYWNFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdOworCWlmIChSVE1QX0dFVF9QQUNLRVRfTE9XUkFURShwUGFja2V0KSkKKwl7CS8vIEl0J3MgYSBzcGVjaWZpYyBwYWNrZXQgbmVlZCB0byBmb3JjZSBsb3cgcmF0ZSwgaS5lLiwgYkRIQ1BGcmFtZSwgYkVBUE9MRnJhbWUsIGJXQUlGcmFtZQorCQlUeEZyYW1lVHlwZSA9IFRYX0xFR0FDWV9GUkFNRTsKKwl9CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJZWxzZSBpZiAoSVNfSFRfUkFURShwTWFjRW50cnkpKQorCXsJLy8gaXQncyBhIDExbiBjYXBhYmxlIHBhY2tldAorCisJCS8vIERlcGVuZHMgb24gSFRQaHlNb2RlIHRvIGNoZWNrIGlmIHRoZSBwZWVyIHN1cHBvcnQgdGhlIEhUUmF0ZSB0cmFuc21pc3Npb24uCisJCS8vIAlDdXJyZW50bHkgZGlkbid0IHN1cHBvcnQgQS1NU0RVIGVtYmVkZGVkIGluIEEtTVBEVQorCQliSFRSYXRlID0gVFJVRTsKKwkJaWYgKFJUTVBfR0VUX1BBQ0tFVF9NT1JFREFUQShwUGFja2V0KSB8fCAocE1hY0VudHJ5LT5Qc01vZGUgPT0gUFdSX1NBVkUpKQorCQkJVHhGcmFtZVR5cGUgPSBUWF9MRUdBQ1lfRlJBTUU7CisjaWZkZWYgVUFQU0RfQVBfU1VQUE9SVAorCQllbHNlIGlmIChSVE1QX0dFVF9QQUNLRVRfRU9TUChwUGFja2V0KSkKKwkJCVR4RnJhbWVUeXBlID0gVFhfTEVHQUNZX0ZSQU1FOworI2VuZGlmIC8vIFVBUFNEX0FQX1NVUFBPUlQgLy8KKwkJZWxzZSBpZigocE1hY0VudHJ5LT5UWEJBYml0bWFwICYgKDE8PChSVE1QX0dFVF9QQUNLRVRfVVAocFBhY2tldCkpKSkgIT0gMCkKKwkJCXJldHVybiBUWF9BTVBEVV9GUkFNRTsKKwkJZWxzZSBpZihDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX0FNU0RVX0lOVVNFRCkpCisJCQlyZXR1cm4gVFhfQU1TRFVfRlJBTUU7CisJCWVsc2UKKwkJCVR4RnJhbWVUeXBlID0gVFhfTEVHQUNZX0ZSQU1FOworCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwllbHNlCisJewkvLyBpdCdzIGEgbGVnYWN5IGIvZyBwYWNrZXQuCisJCWlmICgoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19BR0dSRUdBVElPTl9DQVBBQkxFKSAmJiBwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlKSAmJgorCQkJKFJUTVBfR0VUX1BBQ0tFVF9UWFJBVEUocFBhY2tldCkgPj0gUkFURV82KSAmJgorCQkJKCEoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKSkpKQorCQl7CS8vIGlmIHBlZXIgc3VwcG9ydCBSYWxpbmsgQWdncmVnYXRpb24sIHdlIHVzZSBpdC4KKwkJCVR4RnJhbWVUeXBlID0gVFhfUkFMSU5LX0ZSQU1FOworCQl9CisJCWVsc2UKKwkJeworCQkJVHhGcmFtZVR5cGUgPSBUWF9MRUdBQ1lfRlJBTUU7CisJCX0KKwl9CisKKwkvLyBDdXJyZW50bHksIG91ciBmcmFnbWVudCBvbmx5IHN1cHBvcnQgd2hlbiBhIHVuaWNhc3QgcGFja2V0IHNlbmQgYXMgTk9ULUFSQUxJTkssIE5PVC1BTVNEVSBhbmQgTk9ULUFNUERVLgorCWlmICgoUlRNUF9HRVRfUEFDS0VUX0ZSQUdNRU5UUyhwUGFja2V0KSA+IDEpICYmIChUeEZyYW1lVHlwZSA9PSBUWF9MRUdBQ1lfRlJBTUUpKQorCQlUeEZyYW1lVHlwZSA9IFRYX0ZSQUdfRlJBTUU7CisKKwlyZXR1cm4gVHhGcmFtZVR5cGU7Cit9CisKKworQk9PTEVBTiBSVE1QX0ZpbGxUeEJsa0luZm8oCisJSU4gUlRNUF9BREFQVEVSICpwQWQsCisJSU4gVFhfQkxLICpwVHhCbGspCit7CisJUEFDS0VUX0lORk8JCQlQYWNrZXRJbmZvOworCVBORElTX1BBQ0tFVAkJcFBhY2tldDsKKwlQTUFDX1RBQkxFX0VOVFJZCXBNYWNFbnRyeSA9IE5VTEw7CisKKwlwUGFja2V0ID0gcFR4QmxrLT5wUGFja2V0OworCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBQYWNrZXQsICZQYWNrZXRJbmZvLCAmcFR4QmxrLT5wU3JjQnVmSGVhZGVyLCAmcFR4QmxrLT5TcmNCdWZMZW4pOworCisJcFR4QmxrLT5XY2lkCSAJIAkJPSBSVE1QX0dFVF9QQUNLRVRfV0NJRChwUGFja2V0KTsKKwlwVHhCbGstPmFwaWR4CQkgCQk9IFJUTVBfR0VUX1BBQ0tFVF9JRihwUGFja2V0KTsKKwlwVHhCbGstPlVzZXJQcmlvcml0eSAJCT0gUlRNUF9HRVRfUEFDS0VUX1VQKHBQYWNrZXQpOworCXBUeEJsay0+RnJhbWVHYXAgPSBJRlNfSFRUWE9QOwkJLy8gQVNJQyBkZXRlcm1pbmUgRnJhbWUgR2FwCisKKwlpZiAoUlRNUF9HRVRfUEFDS0VUX0NMRUFSX0VBUF9GUkFNRShwVHhCbGstPnBQYWNrZXQpKQorCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYkNsZWFyRUFQRnJhbWUpOworCWVsc2UKKwkJVFhfQkxLX0NMRUFSX0ZMQUcocFR4QmxrLCBmVFhfYkNsZWFyRUFQRnJhbWUpOworCisJLy8gRGVmYXVsdCB0byBjbGVhciB0aGlzIGZsYWcKKwlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iRm9yY2VOb25Rb1MpOworCisKKwlpZiAocFR4QmxrLT5XY2lkID09IE1DQVNUX1dDSUQpCisJeworCQlwVHhCbGstPnBNYWNFbnRyeSA9IE5VTEw7CisJCXsKKyNpZmRlZiBNQ0FTVF9SQVRFX1NQRUNJRklDCisJCQlQVUNIQVIgcERBID0gR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOworCQkJaWYgKCgoKnBEQSAmIDB4MDEpID09IDB4MDEpICYmICgqcERBICE9IDB4ZmYpKQorCQkJCXBUeEJsay0+cFRyYW5zbWl0ID0gJnBBZC0+Q29tbW9uQ2ZnLk1DYXN0UGh5TW9kZTsKKwkJCWVsc2UKKyNlbmRpZiAvLyBNQ0FTVF9SQVRFX1NQRUNJRklDIC8vCisJCQkJcFR4QmxrLT5wVHJhbnNtaXQgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXS5IVFBoeU1vZGU7CisJCX0KKworCQlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iQWNrUmVxdWlyZWQpOwkvLyBBY2tSZXF1aXJlZCA9IEZBTFNFLCB3aGVuIGJyb2FkY2FzdCBwYWNrZXQgaW4gQWRob2MgbW9kZS4KKwkJLy9UWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYkZvcmNlTG93UmF0ZSk7CisJCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JBbGxvd0ZyYWcpOworCQlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iV01NKTsKKwkJaWYgKFJUTVBfR0VUX1BBQ0tFVF9NT1JFREFUQShwUGFja2V0KSkKKwkJeworCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JNb3JlRGF0YSk7CisJCX0KKworCX0KKwllbHNlCisJeworCQlwVHhCbGstPnBNYWNFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3BUeEJsay0+V2NpZF07CisJCXBUeEJsay0+cFRyYW5zbWl0ID0gJnBUeEJsay0+cE1hY0VudHJ5LT5IVFBoeU1vZGU7CisKKwkJcE1hY0VudHJ5ID0gcFR4QmxrLT5wTWFjRW50cnk7CisKKworCQkvLyBGb3IgYWxsIHVuaWNhc3QgcGFja2V0cywgbmVlZCBBY2sgdW5sZXNzIHRoZSBBY2sgUG9saWN5IGlzIG5vdCBzZXQgYXMgTk9STUFMX0FDSy4KKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkFja1BvbGljeVtwVHhCbGstPlF1ZUlkeF0gIT0gTk9STUFMX0FDSykKKwkJCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JBY2tSZXF1aXJlZCk7CisJCWVsc2UKKwkJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iQWNrUmVxdWlyZWQpOworCisJCXsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCXsKKworCQkJCS8vIElmIHN1cHBvcnQgV01NLCBlbmFibGUgaXQuCisJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkgJiYKKwkJCQkJQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSkpCisJCQkJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iV01NKTsKKwkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJfQorCisJCWlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0xFR0FDWV9GUkFNRSkKKwkJeworCQkJaWYgKCAoUlRNUF9HRVRfUEFDS0VUX0xPV1JBVEUocFBhY2tldCkpIHx8CisgICAgICAgICAgICAgICAgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApICYmIChwTWFjRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID09IE1PREVfQ0NLKSAmJiAocE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID09IFJBVEVfMSkpKQorCQkJewkvLyBTcGVjaWZpYyBwYWNrZXQsIGkuZS4sIGJESENQRnJhbWUsIGJFQVBPTEZyYW1lLCBiV0FJRnJhbWUsIG5lZWQgZm9yY2UgbG93IHJhdGUuCisJCQkJcFR4QmxrLT5wVHJhbnNtaXQgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXS5IVFBoeU1vZGU7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJLy8gTW9kaWZ5IHRoZSBXTU0gYml0IGZvciBJQ1YgaXNzdWUuIElmIHdlIGhhdmUgYSBwYWNrZXQgd2l0aCBFT1NQIGZpZWxkIG5lZWQgdG8gc2V0IGFzIDEsIGhvdyB0byBoYW5kbGUgaXQ/Pz8KKwkJCQlpZiAoSVNfSFRfU1RBKHBUeEJsay0+cE1hY0VudHJ5KSAmJgorCQkJCQkoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19SQUxJTktfQ0hJUFNFVCkpICYmCisJCQkJCSgocEFkLT5Db21tb25DZmcuYlJkZyA9PSBUUlVFKSAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKSkpCisJCQkJeworCQkJCQlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iV01NKTsKKwkJCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JGb3JjZU5vblFvUyk7CisJCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlpZiAoIChJU19IVF9SQVRFKHBNYWNFbnRyeSkgPT0gRkFMU0UpICYmCisJCQkJKENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUElHR1lCQUNLX0NBUEFCTEUpKSkKKwkJCXsJLy8gQ3VycmVudGx5IHBpZ2d5LWJhY2sgb25seSBzdXBwb3J0IHdoZW4gcGVlciBpcyBvcGVyYXRlIGluIGIvZyBtb2RlLgorCQkJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iUGlnZ3lCYWNrKTsKKwkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkJaWYgKFJUTVBfR0VUX1BBQ0tFVF9NT1JFREFUQShwUGFja2V0KSkKKwkJCXsKKwkJCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYk1vcmVEYXRhKTsKKwkJCX0KKyNpZmRlZiBVQVBTRF9BUF9TVVBQT1JUCisJCQlpZiAoUlRNUF9HRVRfUEFDS0VUX0VPU1AocFBhY2tldCkpCisJCQl7CisJCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JXTU1fVUFQU0RfRU9TUCk7CisJCQl9CisjZW5kaWYgLy8gVUFQU0RfQVBfU1VQUE9SVCAvLworCQl9CisJCWVsc2UgaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfRlJBR19GUkFNRSkKKwkJeworCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JBbGxvd0ZyYWcpOworCQl9CisKKwkJcE1hY0VudHJ5LT5EZWJ1Z1R4Q291bnQrKzsKKwl9CisKKwlyZXR1cm4gVFJVRTsKKworRmlsbFR4QmxrRXJyOgorCXJldHVybiBGQUxTRTsKK30KKworCitCT09MRUFOIENhbkRvQWdncmVnYXRlVHJhbnNtaXQoCisJSU4gUlRNUF9BREFQVEVSICpwQWQsCisJSU4gTkRJU19QQUNLRVQgKnBQYWNrZXQsCisJSU4gVFhfQkxLCQkqcFR4QmxrKQoreworCisJLy9wcmludGsoIkNoZWNrIGlmIGNhbiBkbyBhZ2dyZWdhdGlvbiEgVHhGcmFtZVR5cGU9JWQhXG4iLCBwVHhCbGstPlR4RnJhbWVUeXBlKTsKKworCWlmIChSVE1QX0dFVF9QQUNLRVRfV0NJRChwUGFja2V0KSA9PSBNQ0FTVF9XQ0lEKQorCQlyZXR1cm4gRkFMU0U7CisKKwlpZiAoUlRNUF9HRVRfUEFDS0VUX0RIQ1AocFBhY2tldCkgfHwKKwkJUlRNUF9HRVRfUEFDS0VUX0VBUE9MKHBQYWNrZXQpIHx8CisJCVJUTVBfR0VUX1BBQ0tFVF9XQUkocFBhY2tldCkpCisJCXJldHVybiBGQUxTRTsKKworCWlmICgocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVNEVV9GUkFNRSkgJiYKKwkJKChwVHhCbGstPlRvdGFsRnJhbWVMZW4gKyBHRVRfT1NfUEtUX0xFTihwUGFja2V0KSk+IChSWF9CVUZGRVJfQUdHUkVTSVpFIC0gMTAwKSkpCisJewkvLyBGb3IgQU1TRFUsIGFsbG93IHRoZSBwYWNrZXRzIHdpdGggdG90YWwgbGVuZ3RoIDwgbWF4LWFtc2R1IHNpemUKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmICgocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9SQUxJTktfRlJBTUUpICYmCisJCShwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXIgPT0gMikpCisJewkvLyBGb3IgUkFMSU5LLUFnZ3JlZ2F0aW9uLCBhbGxvdyB0d28gZnJhbWVzIGluIG9uZSBiYXRjaC4KKwkJcmV0dXJuIEZBTFNFOworCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCWlmICgoSU5GUkFfT04ocEFkKSkgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKSAvLyBtdXN0IGJlIHVuaWNhc3QgdG8gQVAKKwkJcmV0dXJuIFRSVUU7CisJZWxzZQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQlyZXR1cm4gRkFMU0U7CisKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJVG8gZG8gdGhlIGVucXVldWUgb3BlcmF0aW9uIGFuZCBleHRyYWN0IHRoZSBmaXJzdCBpdGVtIG9mIHdhaXRpbmcKKwkJbGlzdC4gSWYgYSBudW1iZXIgb2YgYXZhaWxhYmxlIHNoYXJlZCBtZW1vcnkgc2VnbWVudHMgY291bGQgbWVldAorCQl0aGUgcmVxdWVzdCBvZiBleHRyYWN0ZWQgaXRlbSwgdGhlIGV4dHJhY3RlZCBpdGVtIHdpbGwgYmUgZnJhZ21lbnRlZAorCQlpbnRvIHNoYXJlZCBtZW1vcnkgc2VnbWVudHMuCisKKwlBcmd1bWVudHM6CisJCXBBZCBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBRdWV1ZQkJUG9pbnRlciB0byBXYWl0aW5nIFF1ZXVlCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUERlUXVldWVQYWNrZXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIEJPT0xFQU4gICAgICAgICBiSW50Q29udGV4dCwKKwlJTiAgVUNIQVIJCQlRSWR4LCAvKiBCdWxrT3V0UGlwZUlkICovCisJSU4gIFVDSEFSICAgICAgICAgICBNYXhfVHhfUGFja2V0cykKK3sKKwlQUVVFVUVfRU5UUlkgICAgcEVudHJ5ID0gTlVMTDsKKwlQTkRJU19QQUNLRVQgCXBQYWNrZXQ7CisJTkRJU19TVEFUVVMgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJVUNIQVIgICAgICAgICAgIENvdW50PTA7CisJUFFVRVVFX0hFQURFUiAgIHBRdWV1ZTsKKwlVTE9ORyAgICAgICAgICAgRnJlZU51bWJlcltOVU1fT0ZfVFhfUklOR107CisJVUNIQVIJCQlRdWVJZHgsIHNRSWR4LCBlUUlkeDsKKwl1bnNpZ25lZCBsb25nCUlycUZsYWdzID0gMDsKKwlCT09MRUFOCQkJaGFzVHhEZXNjID0gRkFMU0U7CisJVFhfQkxLCQkJVHhCbGs7CisJVFhfQkxLCQkJKnBUeEJsazsKKworI2lmZGVmIERCR19ESUFHTk9TRQorCUJPT0xFQU4JCQlmaXJzdFJvdW5kOworCVJ0bXBEaWFnU3RydWN0CSpwRGlhZ1N0cnVjdCA9ICZwQWQtPkRpYWdTdHJ1Y3Q7CisjZW5kaWYKKworCisJaWYgKFFJZHggPT0gTlVNX09GX1RYX1JJTkcpCisJeworCQlzUUlkeCA9IDA7CisJCWVRSWR4ID0gMzsJLy8gNCBBQ3MsIHN0YXJ0IGZyb20gMC4KKwl9CisJZWxzZQorCXsKKwkJc1FJZHggPSBlUUlkeCA9IFFJZHg7CisJfQorCisJZm9yIChRdWVJZHg9c1FJZHg7IFF1ZUlkeCA8PSBlUUlkeDsgUXVlSWR4KyspCisJeworCQlDb3VudD0wOworCisJCVJUMjhYWF9TVEFSVF9ERVFVRVVFKHBBZCwgUXVlSWR4LCBJcnFGbGFncyk7CisKKyNpZmRlZiBEQkdfRElBR05PU0UKKwkJZmlyc3RSb3VuZCA9ICgoUXVlSWR4ID09IDApID8gVFJVRSA6IEZBTFNFKTsKKyNlbmRpZiAvLyBEQkdfRElBR05PU0UgLy8KKworCQl3aGlsZSAoMSkKKwkJeworCQkJaWYgKChSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JBRElPX09GRiB8CisJCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8CisJCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpCisJCQl7CisJCQkJUlQyOFhYX1NUT1BfREVRVUVVRShwQWQsIFF1ZUlkeCwgSXJxRmxhZ3MpOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJaWYgKENvdW50ID49IE1heF9UeF9QYWNrZXRzKQorCQkJCWJyZWFrOworCisJCQlERVFVRVVFX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncyk7CisJCQlpZiAoJnBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0gPT0gTlVMTCkKKwkJCXsKKyNpZmRlZiBEQkdfRElBR05PU0UKKwkJCQlpZiAoZmlyc3RSb3VuZCA9PSBUUlVFKQorCQkJCQlwRGlhZ1N0cnVjdC0+VHhTV1F1ZUNudFtwRGlhZ1N0cnVjdC0+QXJyYXlDdXJJZHhdWzBdKys7CisjZW5kaWYgLy8gREJHX0RJQUdOT1NFIC8vCisJCQkJREVRVUVVRV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncyk7CisJCQkJYnJlYWs7CisJCQl9CisKKworCQkJLy8gcHJvYmUgdGhlIFF1ZXVlIEhlYWQKKwkJCXBRdWV1ZSA9ICZwQWQtPlR4U3dRdWV1ZVtRdWVJZHhdOworCQkJaWYgKChwRW50cnkgPSBwUXVldWUtPkhlYWQpID09IE5VTEwpCisJCQl7CisJCQkJREVRVUVVRV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncyk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXBUeEJsayA9ICZUeEJsazsKKwkJCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpcFR4QmxrLCBzaXplb2YoVFhfQkxLKSk7CisJCQkvL0luaXRpYWxpemVRdWV1ZUhlYWRlcigmcFR4QmxrLT5UeFBhY2tldExpc3QpOwkJLy8gRGlkbid0IG5lZWQgaXQgYmVjYXVzZSB3ZSBhbHJlYWR5IG1lbXplcm8gaXQuCisJCQlwVHhCbGstPlF1ZUlkeCA9IFF1ZUlkeDsKKworCQkJcFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BLVChwRW50cnkpOworCisJCQkvLyBFYXJseSBjaGVjayB0byBtYWtlIHN1cmUgd2UgaGF2ZSBlbm9ndWggVHggUmVzb3VyY2UuCisJCQloYXNUeERlc2MgPSBSVDI4WFhfSEFTX0VOT1VHSF9GUkVFX0RFU0MocEFkLCBwVHhCbGssIEZyZWVOdW1iZXJbUXVlSWR4XSwgcFBhY2tldCk7CisJCQlpZiAoIWhhc1R4RGVzYykKKwkJCXsKKwkJCQlwQWQtPlByaXZhdGVJbmZvLlR4UmluZ0Z1bGxDbnQrKzsKKworCQkJCURFUVVFVUVfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBiSW50Q29udGV4dCwgSXJxRmxhZ3MpOworCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXBUeEJsay0+VHhGcmFtZVR5cGUgPSBUeFBrdENsYXNzaWZpY2F0aW9uKHBBZCwgcFBhY2tldCk7CisJCQlwRW50cnkgPSBSZW1vdmVIZWFkUXVldWUocFF1ZXVlKTsKKwkJCXBUeEJsay0+VG90YWxGcmFtZU51bSsrOworCQkJcFR4QmxrLT5Ub3RhbEZyYWdOdW0gKz0gUlRNUF9HRVRfUEFDS0VUX0ZSQUdNRU5UUyhwUGFja2V0KTsJLy8gVGhlIHJlYWwgZnJhZ21lbnQgbnVtYmVyIG1heWJlIHZhcnkKKwkJCXBUeEJsay0+VG90YWxGcmFtZUxlbiArPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKKwkJCXBUeEJsay0+cFBhY2tldCA9IHBQYWNrZXQ7CisJCQlJbnNlcnRUYWlsUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0LCBQQUNLRVRfVE9fUVVFVUVfRU5UUlkocFBhY2tldCkpOworCisJCQlpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9SQUxJTktfRlJBTUUgfHwgcFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVNEVV9GUkFNRSkKKwkJCXsKKwkJCQkvLyBFbmhhbmNlIFNXIEFnZ3JlZ2F0aW9uIE1lY2hhbmlzbQorCQkJCWlmIChORUVEX1FVRVVFX0JBQ0tfRk9SX0FHRyhwQWQsIFF1ZUlkeCwgRnJlZU51bWJlcltRdWVJZHhdLCBwVHhCbGstPlR4RnJhbWVUeXBlKSkKKwkJCQl7CisJCQkJCUluc2VydEhlYWRRdWV1ZShwUXVldWUsIFBBQ0tFVF9UT19RVUVVRV9FTlRSWShwUGFja2V0KSk7CisJCQkJCURFUVVFVUVfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBiSW50Q29udGV4dCwgSXJxRmxhZ3MpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlkb3sKKwkJCQkJaWYoKHBFbnRyeSA9IHBRdWV1ZS0+SGVhZCkgPT0gTlVMTCkKKwkJCQkJCWJyZWFrOworCisJCQkJCS8vIEZvciBUWF9BTVNEVV9GUkFNRS9UWF9SQUxJTktfRlJBTUUsIE5lZWQgdG8gY2hlY2sgaWYgbmV4dCBwYWtjZXQgY2FuIGRvIGFnZ3JlZ2F0aW9uLgorCQkJCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEtUKHBFbnRyeSk7CisJCQkJCUZyZWVOdW1iZXJbUXVlSWR4XSA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKKwkJCQkJaGFzVHhEZXNjID0gUlQyOFhYX0hBU19FTk9VR0hfRlJFRV9ERVNDKHBBZCwgcFR4QmxrLCBGcmVlTnVtYmVyW1F1ZUlkeF0sIHBQYWNrZXQpOworCQkJCQlpZiAoKGhhc1R4RGVzYyA9PSBGQUxTRSkgfHwgKENhbkRvQWdncmVnYXRlVHJhbnNtaXQocEFkLCBwUGFja2V0LCBwVHhCbGspID09IEZBTFNFKSkKKwkJCQkJCWJyZWFrOworCisJCQkJCS8vUmVtb3ZlIHRoZSBwYWNrZXQgZnJvbSB0aGUgVHhTd1F1ZXVlIGFuZCBpbnNlcnQgaW50byBwVHhCbGsKKwkJCQkJcEVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKHBRdWV1ZSk7CisJCQkJCUFTU0VSVChwRW50cnkpOworCQkJCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEtUKHBFbnRyeSk7CisJCQkJCXBUeEJsay0+VG90YWxGcmFtZU51bSsrOworCQkJCQlwVHhCbGstPlRvdGFsRnJhZ051bSArPSBSVE1QX0dFVF9QQUNLRVRfRlJBR01FTlRTKHBQYWNrZXQpOwkvLyBUaGUgcmVhbCBmcmFnbWVudCBudW1iZXIgbWF5YmUgdmFyeQorCQkJCQlwVHhCbGstPlRvdGFsRnJhbWVMZW4gKz0gR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7CisJCQkJCUluc2VydFRhaWxRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QsIFBBQ0tFVF9UT19RVUVVRV9FTlRSWShwUGFja2V0KSk7CisJCQkJfXdoaWxlKDEpOworCisJCQkJaWYgKHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlciA9PSAxKQorCQkJCQlwVHhCbGstPlR4RnJhbWVUeXBlID0gVFhfTEVHQUNZX0ZSQU1FOworCQkJfQorCisjaWZkZWYgUlQyODcwCisJCQlERVFVRVVFX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgYkludENvbnRleHQsIElycUZsYWdzKTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCQkJQ291bnQgKz0gcFR4QmxrLT5UeFBhY2tldExpc3QuTnVtYmVyOworCisJCQkJLy8gRG8gSGFyZFRyYW5zbWl0IG5vdy4KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJU3RhdHVzID0gU1RBSGFyZFRyYW5zbWl0KHBBZCwgcFR4QmxrLCBRdWVJZHgpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKKyNpZiAwCS8vIFdlIHNob3VsZCBub3QgYnJlYWsgaWYgSGFyZFRyYW5zbWl0IGZhaWxlZC4gV2VsbCwgYXQgbGVhc3Qgbm93IHdlIHNob3VsZCBub3QhCisJCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLypSVF9ERUJVR19JTkZPKi8sKCJSVE1QSGFyZFRyYW5zbWl0IHJldHVybiBmYWlsZWQhISFcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZgorCQl9CisKKwkJUlQyOFhYX1NUT1BfREVRVUVVRShwQWQsIFF1ZUlkeCwgSXJxRmxhZ3MpOworCisjaWZkZWYgUlQyODcwCisJCWlmICghaGFzVHhEZXNjKQorCQkJUlRVU0JLaWNrQnVsa091dChwQWQpOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisjaWZkZWYgQkxPQ0tfTkVUX0lGCisJCWlmICgocEFkLT5ibG9ja1F1ZXVlVGFiW1F1ZUlkeF0uU3dUeFF1ZXVlQmxvY2tGbGFnID09IFRSVUUpCisJCQkmJiAocEFkLT5UeFN3UXVldWVbUXVlSWR4XS5OdW1iZXIgPCAxKSkKKwkJeworCQkJcmVsZWFzZU5ldElmKCZwQWQtPmJsb2NrUXVldWVUYWJbUXVlSWR4XSk7CisJCX0KKyNlbmRpZiAvLyBCTE9DS19ORVRfSUYgLy8KKworCX0KKworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDYWxjdWxhdGVzIHRoZSBkdXJhdGlvbiB3aGljaCBpcyByZXF1aXJlZCB0byB0cmFuc21pdCBvdXQgZnJhbWVzCisJd2l0aCBnaXZlbiBzaXplIGFuZCBzcGVjaWZpZWQgcmF0ZS4KKworCUFyZ3VtZW50czoKKwkJcEFkIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCVJhdGUJCQlUcmFuc21pdCByYXRlCisJCVNpemUJCQlGcmFtZSBzaXplIGluIHVuaXRzIG9mIGJ5dGUKKworCVJldHVybiBWYWx1ZToKKwkJRHVyYXRpb24gbnVtYmVyIGluIHVuaXRzIG9mIHVzZWMKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVVNIT1JUCVJUTVBDYWxjRHVyYXRpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlSYXRlLAorCUlOCVVMT05HCQkJU2l6ZSkKK3sKKwlVTE9ORwlEdXJhdGlvbiA9IDA7CisKKwlpZiAoUmF0ZSA8IFJBVEVfRklSU1RfT0ZETV9SQVRFKSAvLyBDQ0sKKwl7CisJCWlmICgoUmF0ZSA+IFJBVEVfMSkgJiYgT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpKQorCQkJRHVyYXRpb24gPSA5NjsJLy8gNzIrMjQgcHJlYW1ibGUrcGxjcAorCQllbHNlCisJCQlEdXJhdGlvbiA9IDE5MjsgLy8gMTQ0KzQ4IHByZWFtYmxlK3BsY3AKKworCQlEdXJhdGlvbiArPSAoVVNIT1JUKSgoU2l6ZSA8PCA0KSAvIFJhdGVJZFRvNTAwS2Jwc1tSYXRlXSk7CisJCWlmICgoU2l6ZSA8PCA0KSAlIFJhdGVJZFRvNTAwS2Jwc1tSYXRlXSkKKwkJCUR1cmF0aW9uICsrOworCX0KKwllbHNlIGlmIChSYXRlIDw9IFJBVEVfTEFTVF9PRkRNX1JBVEUpLy8gT0ZETSByYXRlcworCXsKKwkJRHVyYXRpb24gPSAyMCArIDY7CQkvLyAxNis0IHByZWFtYmxlK3BsY3AgKyBTaWduYWwgRXh0ZW5zaW9uCisJCUR1cmF0aW9uICs9IDQgKiAoVVNIT1JUKSgoMTEgKyBTaXplICogNCkgLyBSYXRlSWRUbzUwMEticHNbUmF0ZV0pOworCQlpZiAoKDExICsgU2l6ZSAqIDQpICUgUmF0ZUlkVG81MDBLYnBzW1JhdGVdKQorCQkJRHVyYXRpb24gKz0gNDsKKwl9CisJZWxzZQkvL21pbW8gcmF0ZQorCXsKKwkJRHVyYXRpb24gPSAyMCArIDY7CQkvLyAxNis0IHByZWFtYmxlK3BsY3AgKyBTaWduYWwgRXh0ZW5zaW9uCisJfQorCisJcmV0dXJuIChVU0hPUlQpRHVyYXRpb247Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNhbGN1bGF0ZXMgdGhlIGR1cmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHRyYW5zbWl0IG91dCBmcmFtZXMKKwl3aXRoIGdpdmVuIHNpemUgYW5kIHNwZWNpZmllZCByYXRlLgorCisJQXJndW1lbnRzOgorCQlwVHhXSQkJUG9pbnRlciB0byBoZWFkIG9mIGVhY2ggTVBEVSB0byBIVy4KKwkJQWNrIAkJU2V0dGluZyBmb3IgQWNrIHJlcXVpcmVtZW50IGJpdAorCQlGcmFnbWVudAlTZXR0aW5nIGZvciBGcmFnbWVudCBiaXQKKwkJUmV0cnlNb2RlCVNldHRpbmcgZm9yIHJldHJ5IG1vZGUKKwkJSWZzIAkJU2V0dGluZyBmb3IgSUZTIGdhcAorCQlSYXRlCQlTZXR0aW5nIGZvciB0cmFuc21pdCByYXRlCisJCVNlcnZpY2UgCVNldHRpbmcgZm9yIHNlcnZpY2UKKwkJTGVuZ3RoCQlGcmFtZSBsZW5ndGgKKwkJVHhQcmVhbWJsZQlTaG9ydCBvciBMb25nIHByZWFtYmxlIHdoZW4gdXNpbmcgQ0NLIHJhdGVzCisJCVF1ZUlkeCAtIDAtMywgYWNjb3JkaW5nIHRvIDgwMi4xMWUvZDQuNCBKdW5lLzIwMDMKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgIFNlZSBhbHNvIDogQkFTbWFydEhhcmRUcmFuc21pdCgpICAgICEhIQorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QV3JpdGVUeFdJKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBUWFdJX1NUUlVDIAlwT3V0VHhXSSwKKwlJTglCT09MRUFOCQkJRlJBRywKKwlJTglCT09MRUFOCQkJQ0ZBQ0ssCisJSU4JQk9PTEVBTgkJCUluc1RpbWVzdGFtcCwKKwlJTglCT09MRUFOIAkJQU1QRFUsCisJSU4JQk9PTEVBTiAJCUFjaywKKwlJTglCT09MRUFOIAkJTlNlcSwJCS8vIEhXIG5ldyBhIHNlcXVlbmNlLgorCUlOCVVDSEFSCQkJQkFTaXplLAorCUlOCVVDSEFSCQkJV0NJRCwKKwlJTglVTE9ORwkJCUxlbmd0aCwKKwlJTglVQ0hBUiAJCQlQSUQsCisJSU4JVUNIQVIJCQlUSUQsCisJSU4JVUNIQVIJCQlUeFJhdGUsCisJSU4JVUNIQVIJCQlUeG9wbW9kZSwKKwlJTglCT09MRUFOCQkJQ2ZBY2ssCisJSU4JSFRUUkFOU01JVF9TRVRUSU5HCSpwVHJhbnNtaXQpCit7CisJUE1BQ19UQUJMRV9FTlRSWQlwTWFjID0gTlVMTDsKKwlUWFdJX1NUUlVDIAkJVHhXSTsKKwlQVFhXSV9TVFJVQyAJcFR4V0k7CisKKwlpZiAoV0NJRCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCQlwTWFjID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbV0NJRF07CisKKwkvLworCS8vIEFsd2F5cyB1c2UgTG9uZyBwcmVhbWJsZSBiZWZvcmUgdmVyaWZpYXRpb24gc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcyB3ZWxsLgorCS8vIFRvZG86IHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUgaWYgc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcworCS8vCisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsKKwlOZGlzWmVyb01lbW9yeSgmVHhXSSwgVFhXSV9TSVpFKTsKKwlwVHhXSSA9ICZUeFdJOworCisJcFR4V0ktPkZSQUc9IEZSQUc7CisKKwlwVHhXSS0+Q0ZBQ0sgPSBDRkFDSzsKKwlwVHhXSS0+VFM9IEluc1RpbWVzdGFtcDsKKwlwVHhXSS0+QU1QRFUgPSBBTVBEVTsKKwlwVHhXSS0+QUNLID0gQWNrOworCXBUeFdJLT50eG9wPSBUeG9wbW9kZTsKKworCXBUeFdJLT5OU0VRID0gTlNlcTsKKwkvLyBKb2huIHR1bmUgdGhlIHBlcmZvcm1hY2Ugd2l0aCBJbnRlbCBDbGllbnQgaW4gMjAgTUh6IHBlcmZvcm1hbmNlCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJQkFTaXplID0gcEFkLT5Db21tb25DZmcuVHhCQVNpemU7CisKKwlpZiggQkFTaXplID43ICkKKwkJQkFTaXplID03OworCXBUeFdJLT5CQVdpblNpemUgPSBCQVNpemU7CisJcFR4V0ktPlNob3J0R0kgPSBwVHJhbnNtaXQtPmZpZWxkLlNob3J0R0k7CisJcFR4V0ktPlNUQkMgPSBwVHJhbnNtaXQtPmZpZWxkLlNUQkM7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlwVHhXSS0+V2lyZWxlc3NDbGlJRCA9IFdDSUQ7CisJcFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCA9IExlbmd0aDsKKwlwVHhXSS0+UGFja2V0SWQgPSBQSUQ7CisKKwkvLyBJZiBDQ0sgb3IgT0ZETSwgQlcgbXVzdCBiZSAyMAorCXBUeFdJLT5CVyA9IChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSA/IChCV18yMCkgOiAocFRyYW5zbWl0LT5maWVsZC5CVyk7CisjaWZkZWYgRE9UMTFOX0RSQUZUMworCWlmIChwVHhXSS0+QlcpCisJCXBUeFdJLT5CVyA9IChwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLlJlY29tV2lkdGggPT0gMCkgPyAoQldfMjApIDogKHBUcmFuc21pdC0+ZmllbGQuQlcpOworI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKworCXBUeFdJLT5NQ1MgPSBwVHJhbnNtaXQtPmZpZWxkLk1DUzsKKwlwVHhXSS0+UEhZTU9ERSA9IHBUcmFuc21pdC0+ZmllbGQuTU9ERTsKKwlwVHhXSS0+Q0ZBQ0sgPSBDZkFjazsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmIChwTWFjKQorCXsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUpCisJCXsKKwkJCWlmICgocE1hYy0+TW1wc01vZGUgPT0gTU1QU19EWU5BTUlDKSAmJiAocFRyYW5zbWl0LT5maWVsZC5NQ1MgPiA3KSkKKwkJCXsKKwkJCQkvLyBEeW5hbWljIE1JTU8gUG93ZXIgU2F2ZSBNb2RlCisJCQkJcFR4V0ktPk1JTU9wcyA9IDE7CisJCQl9CisJCQllbHNlIGlmIChwTWFjLT5NbXBzTW9kZSA9PSBNTVBTX1NUQVRJQykKKwkJCXsKKwkJCQkvLyBTdGF0aWMgTUlNTyBQb3dlciBTYXZlIE1vZGUKKwkJCQlpZiAocFRyYW5zbWl0LT5maWVsZC5NT0RFID49IE1PREVfSFRNSVggJiYgcFRyYW5zbWl0LT5maWVsZC5NQ1MgPiA3KQorCQkJCXsKKwkJCQkJcFR4V0ktPk1DUyA9IDc7CisJCQkJCXBUeFdJLT5NSU1PcHMgPSAwOworCQkJCX0KKwkJCX0KKwkJfQorCQkvL3BUeFdJLT5NSU1PcHMgPSAocE1hYy0+UHNNb2RlID09IFBXUl9NTVBTKT8gMTowOworCQlpZiAocE1hYy0+YklBbUJhZEF0aGVyb3MgJiYgKHBNYWMtPldlcFN0YXR1cyAhPSBOZGlzODAyXzExV0VQRGlzYWJsZWQpKQorCQl7CisJCQlwVHhXSS0+TXBkdURlbnNpdHkgPSA3OworCQl9CisJCWVsc2UKKwkJeworCQkJcFR4V0ktPk1wZHVEZW5zaXR5ID0gcE1hYy0+TXBkdURlbnNpdHk7CisJCX0KKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlwVHhXSS0+UGFja2V0SWQgPSBwVHhXSS0+TUNTOworCU5kaXNNb3ZlTWVtb3J5KHBPdXRUeFdJLCAmVHhXSSwgc2l6ZW9mKFRYV0lfU1RSVUMpKTsKK30KKworCitWT0lEIFJUTVBXcml0ZVR4V0lfRGF0YSgKKwlJTglQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4JT1VUIFBUWFdJX1NUUlVDCQlwVHhXSSwKKwlJTglUWF9CTEsJCQkJKnBUeEJsaykKK3sKKwlIVFRSQU5TTUlUX1NFVFRJTkcJKnBUcmFuc21pdDsKKwlQTUFDX1RBQkxFX0VOVFJZCXBNYWNFbnRyeTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlVQ0hBUgkJCQlCQVNpemU7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKworCUFTU0VSVChwVHhXSSk7CisKKwlwVHJhbnNtaXQgPSBwVHhCbGstPnBUcmFuc21pdDsKKwlwTWFjRW50cnkgPSBwVHhCbGstPnBNYWNFbnRyeTsKKworCisJLy8KKwkvLyBBbHdheXMgdXNlIExvbmcgcHJlYW1ibGUgYmVmb3JlIHZlcmlmaWF0aW9uIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3Mgd2VsbC4KKwkvLyBUb2RvOiByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lIGlmIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3MKKwkvLworCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCk7CisJTmRpc1plcm9NZW1vcnkocFR4V0ksIFRYV0lfU0laRSk7CisKKwlwVHhXSS0+RlJBRwkJPSBUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JBbGxvd0ZyYWcpOworCXBUeFdJLT5BQ0sJCT0gVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iQWNrUmVxdWlyZWQpOworCXBUeFdJLT50eG9wCQk9IHBUeEJsay0+RnJhbWVHYXA7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwlpZiAocE1hY0VudHJ5ICYmCisJCShwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19JTkZSQSkgJiYKKwkJKHBNYWNFbnRyeS0+VmFsaWRBc0RscyA9PSBUUlVFKSkKKwkJcFR4V0ktPldpcmVsZXNzQ2xpSUQgPSBCU1NJRF9XQ0lEOworCWVsc2UKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJcFR4V0ktPldpcmVsZXNzQ2xpSUQJCT0gcFR4QmxrLT5XY2lkOworCisJcFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudAk9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+U3JjQnVmTGVuOworCXBUeFdJLT5DRkFDSwkJCQk9IFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYlBpZ2d5QmFjayk7CisKKwkvLyBJZiBDQ0sgb3IgT0ZETSwgQlcgbXVzdCBiZSAyMAorCXBUeFdJLT5CVyA9IChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSA/IChCV18yMCkgOiAocFRyYW5zbWl0LT5maWVsZC5CVyk7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisjaWZkZWYgRE9UMTFOX0RSQUZUMworCWlmIChwVHhXSS0+QlcpCisJCXBUeFdJLT5CVyA9IChwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLlJlY29tV2lkdGggPT0gMCkgPyAoQldfMjApIDogKHBUcmFuc21pdC0+ZmllbGQuQlcpOworI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKwlwVHhXSS0+QU1QRFUJPSAoKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfQU1QRFVfRlJBTUUpID8gVFJVRSA6IEZBTFNFKTsKKworCS8vIEpvaG4gdHVuZSB0aGUgcGVyZm9ybWFjZSB3aXRoIEludGVsIENsaWVudCBpbiAyMCBNSHogcGVyZm9ybWFuY2UKKwlCQVNpemUgPSBwQWQtPkNvbW1vbkNmZy5UeEJBU2l6ZTsKKwlpZigocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVBEVV9GUkFNRSkgJiYgKHBNYWNFbnRyeSkpCisJeworCQlVQ0hBUgkJUkFCQU9yaUlkeCA9IDA7CS8vVGhlIFJBJ3MgQkEgT3JpZ2luYXRvciB0YWJsZSBpbmRleC4KKworCQlSQUJBT3JpSWR4ID0gcFR4QmxrLT5wTWFjRW50cnktPkJBT3JpV2NpZEFycmF5W3BUeEJsay0+VXNlclByaW9yaXR5XTsKKwkJQkFTaXplID0gcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbUkFCQU9yaUlkeF0uQkFXaW5TaXplOworCX0KKworI2lmIDAgLy8gMyozCisJaWYgKEJBU2l6ZSA+IDcpCisJCUJBU2l6ZSA9IDc7CisjZW5kaWYKKworCXBUeFdJLT5UeEJGID0gcFRyYW5zbWl0LT5maWVsZC5UeEJGOworCXBUeFdJLT5CQVdpblNpemUgPSBCQVNpemU7CisJcFR4V0ktPlNob3J0R0kgPSBwVHJhbnNtaXQtPmZpZWxkLlNob3J0R0k7CisJcFR4V0ktPlNUQkMgPSBwVHJhbnNtaXQtPmZpZWxkLlNUQkM7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlwVHhXSS0+TUNTID0gcFRyYW5zbWl0LT5maWVsZC5NQ1M7CisJcFR4V0ktPlBIWU1PREUgPSBwVHJhbnNtaXQtPmZpZWxkLk1PREU7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlpZiAocE1hY0VudHJ5KQorCXsKKwkJaWYgKChwTWFjRW50cnktPk1tcHNNb2RlID09IE1NUFNfRFlOQU1JQykgJiYgKHBUcmFuc21pdC0+ZmllbGQuTUNTID4gNykpCisJCXsKKwkJCS8vIER5bmFtaWMgTUlNTyBQb3dlciBTYXZlIE1vZGUKKwkJCXBUeFdJLT5NSU1PcHMgPSAxOworCQl9CisJCWVsc2UgaWYgKHBNYWNFbnRyeS0+TW1wc01vZGUgPT0gTU1QU19TVEFUSUMpCisJCXsKKwkJCS8vIFN0YXRpYyBNSU1PIFBvd2VyIFNhdmUgTW9kZQorCQkJaWYgKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYICYmIHBUcmFuc21pdC0+ZmllbGQuTUNTID4gNykKKwkJCXsKKwkJCQlwVHhXSS0+TUNTID0gNzsKKwkJCQlwVHhXSS0+TUlNT3BzID0gMDsKKwkJCX0KKwkJfQorCisJCWlmIChwTWFjRW50cnktPmJJQW1CYWRBdGhlcm9zICYmIChwTWFjRW50cnktPldlcFN0YXR1cyAhPSBOZGlzODAyXzExV0VQRGlzYWJsZWQpKQorCQl7CisJCQlwVHhXSS0+TXBkdURlbnNpdHkgPSA3OworCQl9CisJCWVsc2UKKwkJeworCQkJcFR4V0ktPk1wZHVEZW5zaXR5ID0gcE1hY0VudHJ5LT5NcGR1RGVuc2l0eTsKKwkJfQorCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2lmZGVmIERCR19ESUFHTk9TRQorCQlpZiAocFR4QmxrLT5RdWVJZHg9PSAwKQorCQl7CisJCQlwQWQtPkRpYWdTdHJ1Y3QuVHhEYXRhQ250W3BBZC0+RGlhZ1N0cnVjdC5BcnJheUN1cklkeF0rKzsKKwkJCXBBZC0+RGlhZ1N0cnVjdC5UeE1jc0NudFtwQWQtPkRpYWdTdHJ1Y3QuQXJyYXlDdXJJZHhdW3BUeFdJLT5NQ1NdKys7CisJCX0KKyNlbmRpZiAvLyBEQkdfRElBR05PU0UgLy8KKworCS8vIGZvciByYXRlIGFkYXBhdGlvbgorCXBUeFdJLT5QYWNrZXRJZCA9IHBUeFdJLT5NQ1M7Cit9CisKKworVk9JRCBSVE1QV3JpdGVUeFdJX0NhY2hlKAorCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTglPVVQgUFRYV0lfU1RSVUMJCXBUeFdJLAorCUlOCVRYX0JMSwkJCQkqcFR4QmxrKQoreworCVBIVFRSQU5TTUlUX1NFVFRJTkcJLypwVHhIVFBoeU1vZGUsKi8gcFRyYW5zbWl0OworCVBNQUNfVEFCTEVfRU5UUlkJcE1hY0VudHJ5OworCisJLy8KKwkvLyB1cGRhdGUgVFhXSQorCS8vCisJcE1hY0VudHJ5ID0gcFR4QmxrLT5wTWFjRW50cnk7CisJcFRyYW5zbWl0ID0gcFR4QmxrLT5wVHJhbnNtaXQ7CisKKwlpZiAocE1hY0VudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCkKKwl7CisJCXBUeFdJLT50eG9wID0gSUZTX0hUVFhPUDsKKworCQkvLyBJZiBDQ0sgb3IgT0ZETSwgQlcgbXVzdCBiZSAyMAorCQlwVHhXSS0+QlcgPSAocFRyYW5zbWl0LT5maWVsZC5NT0RFIDw9IE1PREVfT0ZETSkgPyAoQldfMjApIDogKHBUcmFuc21pdC0+ZmllbGQuQlcpOworCQlwVHhXSS0+U2hvcnRHSSA9IHBUcmFuc21pdC0+ZmllbGQuU2hvcnRHSTsKKwkJcFR4V0ktPlNUQkMgPSBwVHJhbnNtaXQtPmZpZWxkLlNUQkM7CisKKwkJcFR4V0ktPk1DUyA9IHBUcmFuc21pdC0+ZmllbGQuTUNTOworCQlwVHhXSS0+UEhZTU9ERSA9IHBUcmFuc21pdC0+ZmllbGQuTU9ERTsKKworCQkvLyBzZXQgUElEIGZvciBUeFJhdGVTd2l0Y2hpbmcKKwkJcFR4V0ktPlBhY2tldElkID0gcFRyYW5zbWl0LT5maWVsZC5NQ1M7CisJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJcFR4V0ktPkFNUERVID0gKChwTWFjRW50cnktPk5vQkFEYXRhQ291bnREb3duID09IDApID8gVFJVRTogRkFMU0UpOworCXBUeFdJLT5NSU1PcHMgPSAwOworCisjaWZkZWYgRE9UMTFOX0RSQUZUMworCWlmIChwVHhXSS0+QlcpCisJCXBUeFdJLT5CVyA9IChwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLlJlY29tV2lkdGggPT0gMCkgPyAoQldfMjApIDogKHBUcmFuc21pdC0+ZmllbGQuQlcpOworI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKworCWlmIChwQWQtPkNvbW1vbkNmZy5iTUlNT1BTRW5hYmxlKQorCXsKKwkJLy8gTUlNTyBQb3dlciBTYXZlIE1vZGUKKwkJaWYgKChwTWFjRW50cnktPk1tcHNNb2RlID09IE1NUFNfRFlOQU1JQykgJiYgKHBUcmFuc21pdC0+ZmllbGQuTUNTID4gNykpCisJCXsKKwkJCS8vIER5bmFtaWMgTUlNTyBQb3dlciBTYXZlIE1vZGUKKwkJCXBUeFdJLT5NSU1PcHMgPSAxOworCQl9CisJCWVsc2UgaWYgKHBNYWNFbnRyeS0+TW1wc01vZGUgPT0gTU1QU19TVEFUSUMpCisJCXsKKwkJCS8vIFN0YXRpYyBNSU1PIFBvd2VyIFNhdmUgTW9kZQorCQkJaWYgKChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkgJiYgKHBUcmFuc21pdC0+ZmllbGQuTUNTID4gNykpCisJCQl7CisJCQkJcFR4V0ktPk1DUyA9IDc7CisJCQkJcFR4V0ktPk1JTU9wcyA9IDA7CisJCQl9CisJCX0KKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKyNpZmRlZiBEQkdfRElBR05PU0UKKwlpZiAocFR4QmxrLT5RdWVJZHg9PSAwKQorCXsKKwkJcEFkLT5EaWFnU3RydWN0LlR4RGF0YUNudFtwQWQtPkRpYWdTdHJ1Y3QuQXJyYXlDdXJJZHhdKys7CisJCXBBZC0+RGlhZ1N0cnVjdC5UeE1jc0NudFtwQWQtPkRpYWdTdHJ1Y3QuQXJyYXlDdXJJZHhdW3BUeFdJLT5NQ1NdKys7CisJfQorI2VuZGlmIC8vIERCR19ESUFHTk9TRSAvLworCisJcFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+U3JjQnVmTGVuOworCit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNhbGN1bGF0ZXMgdGhlIGR1cmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHRyYW5zbWl0IG91dCBmcmFtZXMKKwl3aXRoIGdpdmVuIHNpemUgYW5kIHNwZWNpZmllZCByYXRlLgorCisJQXJndW1lbnRzOgorCQlwVHhECQlQb2ludGVyIHRvIHRyYW5zbWl0IGRlc2NyaXB0b3IKKwkJQWNrIAkJU2V0dGluZyBmb3IgQWNrIHJlcXVpcmVtZW50IGJpdAorCQlGcmFnbWVudAlTZXR0aW5nIGZvciBGcmFnbWVudCBiaXQKKwkJUmV0cnlNb2RlCVNldHRpbmcgZm9yIHJldHJ5IG1vZGUKKwkJSWZzIAkJU2V0dGluZyBmb3IgSUZTIGdhcAorCQlSYXRlCQlTZXR0aW5nIGZvciB0cmFuc21pdCByYXRlCisJCVNlcnZpY2UgCVNldHRpbmcgZm9yIHNlcnZpY2UKKwkJTGVuZ3RoCQlGcmFtZSBsZW5ndGgKKwkJVHhQcmVhbWJsZQlTaG9ydCBvciBMb25nIHByZWFtYmxlIHdoZW4gdXNpbmcgQ0NLIHJhdGVzCisJCVF1ZUlkeCAtIDAtMywgYWNjb3JkaW5nIHRvIDgwMi4xMWUvZDQuNCBKdW5lLzIwMDMKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUFdyaXRlVHhEZXNjcmlwdG9yKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBUWERfU1RSVUMJCXBUeEQsCisJSU4JQk9PTEVBTiAJCWJXSVYsCisJSU4JVUNIQVIJCQlRdWV1ZVNFTCkKK3sKKwkvLworCS8vIEFsd2F5cyB1c2UgTG9uZyBwcmVhbWJsZSBiZWZvcmUgdmVyaWZpYXRpb24gc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcyB3ZWxsLgorCS8vIFRvZG86IHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUgaWYgc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcworCS8vCisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsKKworCXBUeEQtPldJVgk9IChiV0lWKSA/IDE6IDA7CisJcFR4RC0+UVNFTD0gKFF1ZXVlU0VMKTsKKwkvL1JUMjg2MGM/PyAgZml4ZWQgdXNpbmcgRURDQSBxdWV1ZSBmb3IgdGVzdC4uLiAgV2UgZG91YnQgUXVldWUxIGhhcyBwcm9ibGVtLiAgMjAwNi0wOS0yNiBKYW4KKwkvL3BUeEQtPlFTRUw9IEZJRk9fRURDQTsKKwlpZiAocEFkLT5iR2VuT25lSENDQSA9PSBUUlVFKQorCQlwVHhELT5RU0VMPSBGSUZPX0hDQ0E7CisJcFR4RC0+RE1BRE9ORSA9IDA7Cit9CisKKworLy8gc2hvdWxkIGJlIGNhbGxlZCBvbmx5IHdoZW4gLQorLy8gMS4gTUVBRElBX0NPTk5FQ1RFRAorLy8gMi4gQUdHUkVHQVRJT05fSU5fVVNFRAorLy8gMy4gRnJhZ21lbnRhdGlvbiBub3QgaW4gdXNlZAorLy8gNC4gZWl0aGVyIG5vIHByZXZpb3VzIGZyYW1lIChwUHJldkFkZHIxPU5VTEwpIC5PUi4gcHJldmlvdWQgZnJhbWUgaXMgYWdncmVnYXRpYmxlCitCT09MRUFOIFR4RnJhbWVJc0FnZ3JlZ2F0aWJsZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwUHJldkFkZHIxLAorCUlOCVBVQ0hBUgkJCXA4MDIzaGRyKQoreworCisJLy8gY2FuJ3QgYWdncmVnYXRlIEVBUE9MICg4MDIuMXgpIGZyYW1lCisJaWYgKChwODAyM2hkclsxMl0gPT0gMHg4OCkgJiYgKHA4MDIzaGRyWzEzXSA9PSAweDhlKSkKKwkJcmV0dXJuIEZBTFNFOworCisJLy8gY2FuJ3QgYWdncmVnYXRlIG11bHRpY2FzdC9icm9hZGNhc3QgZnJhbWUKKwlpZiAocDgwMjNoZHJbMF0gJiAweDAxKQorCQlyZXR1cm4gRkFMU0U7CisKKwlpZiAoSU5GUkFfT04ocEFkKSkgLy8gbXVzdCBiZSB1bmljYXN0IHRvIEFQCisJCXJldHVybiBUUlVFOworCWVsc2UgaWYgKChwUHJldkFkZHIxID09IE5VTEwpIHx8IE1BQ19BRERSX0VRVUFMKHBQcmV2QWRkcjEsIHA4MDIzaGRyKSkgLy8gdW5pY2FzdCB0byBzYW1lIFNUQQorCQlyZXR1cm4gVFJVRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkgICBDaGVjayB0aGUgTVNEVSBBZ2dyZWdhdGlvbiBwb2xpY3kKKwkxLkhUIGFnZ3JlZ2F0aW9uIGlzIEEtTVNEVQorCTIubGVnYWFjeSByYXRlIGFnZ3JlZ2F0aW9uIGlzIHNvZnR3YXJlIGFnZ3JlZ2F0aW9uIGJ5IFJhbGluay4KKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOIFBlZXJJc0FnZ3JlT24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUxPTkcJCSAgIFR4UmF0ZSwKKwlJTglQTUFDX1RBQkxFX0VOVFJZIHBNYWNFbnRyeSkKK3sKKwlVTE9ORwlBRmxhZ3MgPSAoZkNMSUVOVF9TVEFUVVNfQU1TRFVfSU5VU0VEIHwgZkNMSUVOVF9TVEFUVVNfQUdHUkVHQVRJT05fQ0FQQUJMRSk7CisKKwlpZiAocE1hY0VudHJ5ICE9IE5VTEwgJiYgQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBBRmxhZ3MpKQorCXsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJaWYgKHBNYWNFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkKKwkJeworCQkJcmV0dXJuIFRSVUU7CisJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKKwkJaWYgKFR4UmF0ZSA+PSBSQVRFXzYgJiYgcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSAmJiAoIShPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpICYmIENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpKSkpCisJCXsJLy8gbGVnYWN5ICBSYWxpbmsgQWdncmVnYXRpb24gc3VwcG9ydAorCQkJcmV0dXJuIFRSVUU7CisJCX0KKyNlbmRpZiAvLyBBR0dSRUdBVElPTl9TVVBQT1JUIC8vCisJfQorCisJcmV0dXJuIEZBTFNFOworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDaGVjayBhbmQgZmluZSB0aGUgcGFja2V0IHdhaXRpbmcgaW4gU1cgcXVldWUgd2l0aCBoaWdoZXN0IHByaW9yaXR5CisKKwlBcmd1bWVudHM6CisJCXBBZCBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCXBRdWV1ZQkJUG9pbnRlciB0byBXYWl0aW5nIFF1ZXVlCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitQUVVFVUVfSEVBREVSCVJUTVBDaGVja1R4U3dRdWV1ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQgUFVDSEFSCQkJcFF1ZUlkeCkKK3sKKworCVVMT05HCU51bWJlcjsKKwkvLyAyMDA0LTExLTE1IHRvIGJlIHJlbW92ZWQuIHRlc3QgYWdncmVnYXRpb24gb25seQorLy8JaWYgKChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCkpICYmICgqcE51bWJlciA8IDIpKQorLy8JCSByZXR1cm4gTlVMTDsKKworCU51bWJlciA9IHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CS10uTnVtYmVyCisJCQkgKyBwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQkVdLk51bWJlcgorCQkJICsgcEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZJXS5OdW1iZXIKKwkJCSArIHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WT10uTnVtYmVyCisJCQkgKyBwQWQtPlR4U3dRdWV1ZVtRSURfSENDQV0uTnVtYmVyOworCisJaWYgKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WT10uSGVhZCAhPSBOVUxMKQorCXsKKwkJKnBRdWVJZHggPSBRSURfQUNfVk87CisJCXJldHVybiAoJnBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WT10pOworCX0KKwllbHNlIGlmIChwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVkldLkhlYWQgIT0gTlVMTCkKKwl7CisJCSpwUXVlSWR4ID0gUUlEX0FDX1ZJOworCQlyZXR1cm4gKCZwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVkldKTsKKwl9CisJZWxzZSBpZiAocEFkLT5UeFN3UXVldWVbUUlEX0FDX0JFXS5IZWFkICE9IE5VTEwpCisJeworCQkqcFF1ZUlkeCA9IFFJRF9BQ19CRTsKKwkJcmV0dXJuICgmcEFkLT5UeFN3UXVldWVbUUlEX0FDX0JFXSk7CisJfQorCWVsc2UgaWYgKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CS10uSGVhZCAhPSBOVUxMKQorCXsKKwkJKnBRdWVJZHggPSBRSURfQUNfQks7CisJCXJldHVybiAoJnBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CS10pOworCX0KKwllbHNlIGlmIChwQWQtPlR4U3dRdWV1ZVtRSURfSENDQV0uSGVhZCAhPSBOVUxMKQorCXsKKwkJKnBRdWVJZHggPSBRSURfSENDQTsKKwkJcmV0dXJuICgmcEFkLT5UeFN3UXVldWVbUUlEX0hDQ0FdKTsKKwl9CisKKwkvLyBObyBwYWNrZXQgcGVuZGluZyBpbiBUeCBTdyBxdWV1ZQorCSpwUXVlSWR4ID0gUUlEX0FDX0JLOworCisJcmV0dXJuIChOVUxMKTsKK30KKworCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlTdXNwZW5kIE1TRFUgdHJhbnNtaXNzaW9uCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QU3VzcGVuZE1zZHVUcmFuc21pc3Npb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTQ0FOTklORywgc3VzcGVuZCBNU0RVIHRyYW5zbWlzc2lvbiAuLi5cbiIpKTsKKworCisJLy8KKwkvLyBCZWZvcmUgQlNTX1NDQU5fSU5fUFJPR1JFU1MsIHdlIG5lZWQgdG8ga2VlcCBDdXJyZW50IFI2NiB2YWx1ZSBhbmQKKwkvLyB1c2UgTG93Ym91bmQgYXMgUjY2IHZhbHVlIG9uIFNjYW5OZXh0Q2hhbm5lbCguLi4pCisJLy8KKwlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCAmcEFkLT5CYnBUdW5pbmcuUjY2Q3VycmVudFZhbHVlKTsKKworCS8vIHNldCBCQlBfUjY2IHRvIDB4MzAvMHg0MCB3aGVuIHNjYW5uaW5nIChBc2ljU3dpdGNoQ2hhbm5lbCB3aWxsIHNldCBSNjYgYWNjb3JkaW5nIHRvIGNoYW5uZWwgd2hlbiBzY2FubmluZykKKwkvL1JUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCAoMHgyNiArIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJUlRNUFNldEFHQ0luaXRWYWx1ZShwQWQsIEJXXzIwKTsKKworCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKTsKKwkvL1JUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0NOVExfQ1NSLCAweDAwMGYwMDAwKTsJCS8vIGFib3J0IGFsbCBUWCByaW5ncworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlSZXN1bWUgTVNEVSB0cmFuc21pc3Npb24KKworCUFyZ3VtZW50czoKKwkJcEFkIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUFJlc3VtZU1zZHVUcmFuc21pc3Npb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisvLyAgICBVQ0hBUgkJCUlycVN0YXRlOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTQ0FOIGRvbmUsIHJlc3VtZSBNU0RVIHRyYW5zbWlzc2lvbiAuLi5cbiIpKTsKKworCisJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIHBBZC0+QmJwVHVuaW5nLlI2NkN1cnJlbnRWYWx1ZSk7CisKKwlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKTsKKy8vIHNhbXBsZSwgZm9yIElSUSBMT0NLIHRvIFNFTSBMT0NLCisvLyAgICBJcnFTdGF0ZSA9IHBBZC0+aXJxX2Rpc2FibGVkOworLy8JaWYgKElycVN0YXRlKQorLy8JCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgVFJVRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKKy8vICAgIGVsc2UKKwlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBOVU1fT0ZfVFhfUklORywgTUFYX1RYX1BST0NFU1MpOworfQorCisKK1VJTlQgZGVhZ2dyZWdhdGVfQU1TRFVfYW5ub3VuY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJUE5ESVNfUEFDS0VUCQlwUGFja2V0LAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVMT05HCQkJRGF0YVNpemUpCit7CisJVVNIT1JUIAkJCVBheWxvYWRTaXplOworCVVTSE9SVCAJCQlTdWJGcmFtZVNpemU7CisJUEhFQURFUl84MDJfMyAJcEFNU0RVc3ViaGVhZGVyOworCVVJTlQJCQluTVNEVTsKKyAgICBVQ0hBUgkJCUhlYWRlcjgwMl8zWzE0XTsKKworCVBVQ0hBUgkJCXBQYXlsb2FkLCBwREEsIHBTQSwgcFJlbW92ZWRMTENTTkFQOworCVBORElTX1BBQ0tFVAlwQ2xvbmVQYWNrZXQ7CisKKworCisJbk1TRFUgPSAwOworCisJd2hpbGUgKERhdGFTaXplID4gTEVOR1RIXzgwMl8zKQorCXsKKworCQluTVNEVSsrOworCisJCS8vaGV4X2R1bXAoInN1YmhlYWRlciIsIHBEYXRhLCA2NCk7CisJCXBBTVNEVXN1YmhlYWRlciA9IChQSEVBREVSXzgwMl8zKXBEYXRhOworCQkvL3BEYXRhICs9IExFTkdUSF84MDJfMzsKKwkJUGF5bG9hZFNpemUgPSBwQU1TRFVzdWJoZWFkZXItPk9jdGV0WzFdICsgKHBBTVNEVXN1YmhlYWRlci0+T2N0ZXRbMF08PDgpOworCQlTdWJGcmFtZVNpemUgPSBQYXlsb2FkU2l6ZSArIExFTkdUSF84MDJfMzsKKworCisJCWlmICgoRGF0YVNpemUgPCBTdWJGcmFtZVNpemUpIHx8IChQYXlsb2FkU2l6ZSA+IDE1MTggKSkKKwkJeworCQkJYnJlYWs7CisJCX0KKworCQkvL3ByaW50aygiJWQgc3ViZnJhbWU6IFNpemUgPSAlZFxuIiwgIG5NU0RVLCBQYXlsb2FkU2l6ZSk7CisKKwkJcFBheWxvYWQgPSBwRGF0YSArIExFTkdUSF84MDJfMzsKKwkJcERBID0gcERhdGE7CisJCXBTQSA9IHBEYXRhICsgTUFDX0FERFJfTEVOOworCisJCS8vIGNvbnZlcnQgdG8gODAyLjMgaGVhZGVyCisgICAgICAgIENPTlZFUlRfVE9fODAyXzMoSGVhZGVyODAyXzMsIHBEQSwgcFNBLCBwUGF5bG9hZCwgUGF5bG9hZFNpemUsIHBSZW1vdmVkTExDU05BUCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJaWYgKChIZWFkZXI4MDJfM1sxMl0gPT0gMHg4OCkgJiYgKEhlYWRlcjgwMl8zWzEzXSA9PSAweDhFKSApCisJCXsKKwkJICAgIC8vIGF2b2lkIGxvY2FsIGhlYXAgb3ZlcmZsb3csIHVzZSBkeWFuYW1pYyBhbGxvY2F0aW9uCisJCSAgIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOworCQkgICBtZW1tb3ZlKEVsZW0tPk1zZysoTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IKSwgcFBheWxvYWQsIFBheWxvYWRTaXplKTsKKwkJICAgRWxlbS0+TXNnTGVuID0gTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IICsgUGF5bG9hZFNpemU7CisJCSAgIFdwYUVBUE9MS2V5QWN0aW9uKHBBZCwgRWxlbSk7CisJCSAgIGtmcmVlKEVsZW0pOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCSAgICAgICAgCWlmIChwUmVtb3ZlZExMQ1NOQVApCisJICAgICAgICAJeworCSAgICAJCQlwUGF5bG9hZCAtPSBMRU5HVEhfODAyXzM7CisJICAgIAkJCVBheWxvYWRTaXplICs9IExFTkdUSF84MDJfMzsKKwkgICAgCQkJTmRpc01vdmVNZW1vcnkocFBheWxvYWQsICZIZWFkZXI4MDJfM1swXSwgTEVOR1RIXzgwMl8zKTsKKwkgICAgICAgIAl9CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQlwQ2xvbmVQYWNrZXQgPSBDbG9uZVBhY2tldChwQWQsIHBQYWNrZXQsIHBQYXlsb2FkLCBQYXlsb2FkU2l6ZSk7CisJCWlmIChwQ2xvbmVQYWNrZXQpCisJCXsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQocEFkLCBwQ2xvbmVQYWNrZXQsIFJUTVBfR0VUX1BBQ0tFVF9JRihwUGFja2V0KSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCX0KKworCisJCS8vIEEtTVNEVSBoYXMgcGFkZGluZyB0byBtdWx0aXBsZSBvZiA0IGluY2x1ZGluZyBzdWJmcmFtZSBoZWFkZXIuCisJCS8vIGFsaWduIFN1YkZyYW1lU2l6ZSB1cCB0byBtdWx0aXBsZSBvZiA0CisJCVN1YkZyYW1lU2l6ZSA9IChTdWJGcmFtZVNpemUrMykmKH4weDMpOworCisKKwkJaWYgKFN1YkZyYW1lU2l6ZSA+IDE1MjggfHwgU3ViRnJhbWVTaXplIDwgMzIpCisJCXsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKERhdGFTaXplID4gU3ViRnJhbWVTaXplKQorCQl7CisJCQlwRGF0YSArPSBTdWJGcmFtZVNpemU7CisJCQlEYXRhU2l6ZSAtPSBTdWJGcmFtZVNpemU7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBlbmQgb2YgQS1NU0RVCisJCQlEYXRhU2l6ZSA9IDA7CisJCX0KKwl9CisKKwkvLyBmaW5hbGx5IHJlbGVhc2Ugb3JpZ2luYWwgcnggcGFja2V0CisJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCisJcmV0dXJuIG5NU0RVOworfQorCisKK1VJTlQgQkFfUmVvcmRlcl9BTVNEVV9Bbm5ub3VuY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCit7CisJUFVDSEFSCQkJcERhdGE7CisJVVNIT1JUCQkJRGF0YVNpemU7CisJVUlOVAkJCW5NU0RVID0gMDsKKworCXBEYXRhID0gKFBVQ0hBUikgR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOworCURhdGFTaXplID0gKFVTSE9SVCkgR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7CisKKwluTVNEVSA9IGRlYWdncmVnYXRlX0FNU0RVX2Fubm91bmNlKHBBZCwgcFBhY2tldCwgcERhdGEsIERhdGFTaXplKTsKKworCXJldHVybiBuTVNEVTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUxvb2sgdXAgdGhlIE1BQyBhZGRyZXNzIGluIHRoZSBNQUMgdGFibGUuIFJldHVybiBOVUxMIGlmIG5vdCBmb3VuZC4KKwlSZXR1cm46CisJCXBFbnRyeSAtIHBvaW50ZXIgdG8gdGhlIE1BQyBlbnRyeTsgTlVMTCBpcyBub3QgZm91bmQKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK01BQ19UQUJMRV9FTlRSWSAqTWFjVGFibGVMb29rdXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJUFVDSEFSIHBBZGRyKQoreworCVVMT05HIEhhc2hJZHg7CisJTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSBOVUxMOworCisJSGFzaElkeCA9IE1BQ19BRERSX0hBU0hfSU5ERVgocEFkZHIpOworCXBFbnRyeSA9IHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF07CisKKwl3aGlsZSAocEVudHJ5ICYmIChwRW50cnktPlZhbGlkQXNDTEkgfHwgcEVudHJ5LT5WYWxpZEFzV0RTIHx8IHBFbnRyeS0+VmFsaWRBc0FwQ2xpIHx8IHBFbnRyeS0+VmFsaWRBc01lc2gpKQorCXsKKwkJaWYgKE1BQ19BRERSX0VRVUFMKHBFbnRyeS0+QWRkciwgcEFkZHIpKQorCQl7CisJCQlicmVhazsKKwkJfQorCQllbHNlCisJCQlwRW50cnkgPSBwRW50cnktPnBOZXh0OworCX0KKworCXJldHVybiBwRW50cnk7Cit9CisKK01BQ19UQUJMRV9FTlRSWSAqTWFjVGFibGVJbnNlcnRFbnRyeSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSCQkJcEFkZHIsCisJSU4JVUNIQVIJCQlhcGlkeCwKKwlJTiBCT09MRUFOCUNsZWFuQWxsKQoreworCVVDSEFSIEhhc2hJZHg7CisJaW50IGksIEZpcnN0V2NpZDsKKwlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9IE5VTEwsICpwQ3VyckVudHJ5OworCisJLy8gaWYgRlVMTCwgcmV0dXJuCisJaWYgKHBBZC0+TWFjVGFiLlNpemUgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCXJldHVybiBOVUxMOworCisJRmlyc3RXY2lkID0gMTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCWlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19JTkZSQSkKKwkJRmlyc3RXY2lkID0gMjsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIGFsbG9jYXRlIG9uZSBNQUMgZW50cnkKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCWZvciAoaSA9IEZpcnN0V2NpZDsgaTwgTUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykgICAvLyBza2lwIGVudHJ5IzAgc28gdGhhdCAiZW50cnkgaW5kZXggPT0gQUlEIiBmb3IgZmFzdCBsb29rdXAKKwl7CisJCS8vIHBpY2sgdXAgdGhlIGZpcnN0IGF2YWlsYWJsZSB2YWNhbmN5CisJCWlmICgocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQ0xJID09IEZBTFNFKSAmJgorCQkJKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc1dEUyA9PSBGQUxTRSkgJiYKKwkJCShwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNBcENsaT09IEZBTFNFKSAmJgorCQkJKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc01lc2ggPT0gRkFMU0UpCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCQkmJiAocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzRGxzID09IEZBTFNFKQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJKQorCQl7CisJCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtpXTsKKwkJCWlmIChDbGVhbkFsbCA9PSBUUlVFKQorCQkJeworCQkJCXBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7CisJCQkJcEVudHJ5LT5DdXJyVHhSYXRlID0gUkFURV8xMTsKKwkJCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihNQUNfVEFCTEVfRU5UUlkpKTsKKwkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LktleUxlbiA9IDA7CisJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJCX0KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCWlmIChhcGlkeCA+PSBNSU5fTkVUX0RFVklDRV9GT1JfRExTKQorCQkJeworCQkJCXBFbnRyeS0+VmFsaWRBc0NMSSA9IEZBTFNFOworCQkJCXBFbnRyeS0+VmFsaWRBc1dEUyA9IEZBTFNFOworCQkJCXBFbnRyeS0+VmFsaWRBc0FwQ2xpID0gRkFMU0U7CisJCQkJcEVudHJ5LT5WYWxpZEFzTWVzaCA9IEZBTFNFOworCQkJCXBFbnRyeS0+VmFsaWRBc0RscyA9IFRSVUU7CisJCQkJcEVudHJ5LT5pc0NhY2hlZCA9IEZBTFNFOworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJeworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQl7CisJCQkJCXBFbnRyeS0+VmFsaWRBc0NMSSA9IFRSVUU7CisJCQkJCXBFbnRyeS0+VmFsaWRBc1dEUyA9IEZBTFNFOworCQkJCQlwRW50cnktPlZhbGlkQXNBcENsaSA9IEZBTFNFOworCQkJCQlwRW50cnktPlZhbGlkQXNNZXNoID0gRkFMU0U7CisJCQkJCXBFbnRyeS0+VmFsaWRBc0RscyA9IEZBTFNFOworCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCX0KKworCQkJcEVudHJ5LT5iSUFtQmFkQXRoZXJvcyA9IEZBTFNFOworCQkJcEVudHJ5LT5wQWQgPSBwQWQ7CisJCQlwRW50cnktPkNNVGltZXJSdW5uaW5nID0gRkFMU0U7CisJCQlwRW50cnktPkVucXVldWVFYXBvbFN0YXJ0VGltZXJSdW5uaW5nID0gRUFQT0xfU1RBUlRfRElTQUJMRTsKKwkJCXBFbnRyeS0+UlNOSUVfTGVuID0gMDsKKwkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+Ul9Db3VudGVyLCBzaXplb2YocEVudHJ5LT5SX0NvdW50ZXIpKTsKKwkJCXBFbnRyeS0+UmVUcnlDb3VudGVyID0gUEVFUl9NU0cxX1JFVFJZX1RJTUVSX0NUUjsKKworCQkJaWYgKHBFbnRyeS0+VmFsaWRBc01lc2gpCisJCQkJcEVudHJ5LT5hcGlkeCA9IChhcGlkeCAtIE1JTl9ORVRfREVWSUNFX0ZPUl9NRVNIKTsKKwkJCWVsc2UgaWYgKHBFbnRyeS0+VmFsaWRBc0FwQ2xpKQorCQkJCXBFbnRyeS0+YXBpZHggPSAoYXBpZHggLSBNSU5fTkVUX0RFVklDRV9GT1JfQVBDTEkpOworCQkJZWxzZSBpZiAocEVudHJ5LT5WYWxpZEFzV0RTKQorCQkJCXBFbnRyeS0+YXBpZHggPSAoYXBpZHggLSBNSU5fTkVUX0RFVklDRV9GT1JfV0RTKTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCWVsc2UgaWYgKHBFbnRyeS0+VmFsaWRBc0RscykKKwkJCQlwRW50cnktPmFwaWR4ID0gKGFwaWR4IC0gTUlOX05FVF9ERVZJQ0VfRk9SX0RMUyk7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQllbHNlCisJCQkJcEVudHJ5LT5hcGlkeCA9IGFwaWR4OworCisJCQl7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCXsKKwkJCQkJcEVudHJ5LT5BdXRoTW9kZSA9IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlOworCQkJCQlwRW50cnktPldlcFN0YXR1cyA9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKKwkJCQkJcEVudHJ5LT5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXJBY2NlcHRBbGw7CisJCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJfQorCisJCQlwRW50cnktPkdUS1N0YXRlID0gUkVLRVlfTkVHT1RJQVRJTkc7CisJCQlwRW50cnktPlBhaXJ3aXNlS2V5LktleUxlbiA9IDA7CisJCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkJaWYgKHBFbnRyeS0+VmFsaWRBc0RscyA9PSBUUlVFKQorCQkJCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKyNlbmRpZiAvL1FPU19ETFNfU1VQUE9SVAorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJcEVudHJ5LT5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKwkJCXBFbnRyeS0+UE1LSURfQ2FjaGVJZHggPSBFTlRSWV9OT1RfRk9VTkQ7CisJCQlDT1BZX01BQ19BRERSKHBFbnRyeS0+QWRkciwgcEFkZHIpOworCQkJcEVudHJ5LT5Tc3QgPSBTU1RfTk9UX0FVVEg7CisJCQlwRW50cnktPkF1dGhTdGF0ZSA9IEFTX05PVF9BVVRIOworCQkJcEVudHJ5LT5BaWQgPSAoVVNIT1JUKWk7ICAvLzA7CisJCQlwRW50cnktPkNhcGFiaWxpdHlJbmZvID0gMDsKKwkJCXBFbnRyeS0+UHNNb2RlID0gUFdSX0FDVElWRTsKKwkJCXBFbnRyeS0+UHNRSWRsZUNvdW50ID0gMDsKKwkJCXBFbnRyeS0+Tm9EYXRhSWRsZUNvdW50ID0gMDsKKwkJCXBFbnRyeS0+Q29udGludWVUeEZhaWxDbnQgPSAwOworCQkJSW5pdGlhbGl6ZVF1ZXVlSGVhZGVyKCZwRW50cnktPlBzUXVldWUpOworCisKKwkJCXBBZC0+TWFjVGFiLlNpemUgKys7CisJCQkvLyBBZGQgdGhpcyBlbnRyeSBpbnRvIEFTSUMgUlggV0NJRCBzZWFyY2ggdGFibGUKKwkJCVJUMjhYWF9TVEFfRU5UUllfQUREKHBBZCwgcEVudHJ5KTsKKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWFjVGFibGVJbnNlcnRFbnRyeSAtIGFsbG9jYXRlIGVudHJ5ICMlZCwgVG90YWw9ICVkXG4iLGksIHBBZC0+TWFjVGFiLlNpemUpKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLy8gYWRkIHRoaXMgTUFDIGVudHJ5IGludG8gSEFTSCB0YWJsZQorCWlmIChwRW50cnkpCisJeworCQlIYXNoSWR4ID0gTUFDX0FERFJfSEFTSF9JTkRFWChwQWRkcik7CisJCWlmIChwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdID09IE5VTEwpCisJCXsKKwkJCXBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF0gPSBwRW50cnk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwQ3VyckVudHJ5ID0gcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XTsKKwkJCXdoaWxlIChwQ3VyckVudHJ5LT5wTmV4dCAhPSBOVUxMKQorCQkJCXBDdXJyRW50cnkgPSBwQ3VyckVudHJ5LT5wTmV4dDsKKwkJCXBDdXJyRW50cnktPnBOZXh0ID0gcEVudHJ5OworCQl9CisJfQorCisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKwlyZXR1cm4gcEVudHJ5OworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCURlbGV0ZSBhIHNwZWNpZmllZCBjbGllbnQgZnJvbSBNQUMgdGFibGUKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIE1hY1RhYmxlRGVsZXRlRW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUIHdjaWQsCisJSU4gUFVDSEFSIHBBZGRyKQoreworCVVTSE9SVCBIYXNoSWR4OworCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5LCAqcFByZXZFbnRyeSwgKnBQcm9iZUVudHJ5OworCUJPT0xFQU4gQ2FuY2VsbGVkOworCS8vVVNIT1JUCW9mZnNldDsJLy8gdW51c2VkIHZhcmlhYmxlCisJLy9VQ0hBUglqOwkJCS8vIHVudXNlZCB2YXJpYWJsZQorCisJaWYgKHdjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCXJldHVybiBGQUxTRTsKKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisKKwlIYXNoSWR4ID0gTUFDX0FERFJfSEFTSF9JTkRFWChwQWRkcik7CisJLy9wRW50cnkgPSBwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdOworCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3djaWRdOworCisJaWYgKHBFbnRyeSAmJiAocEVudHJ5LT5WYWxpZEFzQ0xJIHx8IHBFbnRyeS0+VmFsaWRBc0FwQ2xpIHx8IHBFbnRyeS0+VmFsaWRBc1dEUyB8fCBwRW50cnktPlZhbGlkQXNNZXNoCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisgCQl8fCBwRW50cnktPlZhbGlkQXNEbHMKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJKSkKKwl7CisJCWlmIChNQUNfQUREUl9FUVVBTChwRW50cnktPkFkZHIsIHBBZGRyKSkKKwkJeworCisJCQkvLyBEZWxldGUgdGhpcyBlbnRyeSBmcm9tIEFTSUMgb24tY2hpcCBXQ0lEIFRhYmxlCisJCQlSVDI4WFhfU1RBX0VOVFJZX01BQ19SRVNFVChwQWQsIHdjaWQpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkvLyBmcmVlIHJlc291cmNlcyBvZiBCQQorCQkJQkFTZXNzaW9uVGVhckRvd25BTEwocEFkLCBwRW50cnktPkFpZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKworCQkJcFByZXZFbnRyeSA9IE5VTEw7CisJCQlwUHJvYmVFbnRyeSA9IHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF07CisJCQlBU1NFUlQocFByb2JlRW50cnkpOworCisJCQkvLyB1cGRhdGUgSGFzaCBsaXN0CisJCQlkbworCQkJeworCQkJCWlmIChwUHJvYmVFbnRyeSA9PSBwRW50cnkpCisJCQkJeworCQkJCQlpZiAocFByZXZFbnRyeSA9PSBOVUxMKQorCQkJCQl7CisJCQkJCQlwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdID0gcEVudHJ5LT5wTmV4dDsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBQcmV2RW50cnktPnBOZXh0ID0gcEVudHJ5LT5wTmV4dDsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlwUHJldkVudHJ5ID0gcFByb2JlRW50cnk7CisJCQkJcFByb2JlRW50cnkgPSBwUHJvYmVFbnRyeS0+cE5leHQ7CisJCQl9IHdoaWxlIChwUHJvYmVFbnRyeSk7CisKKwkJCS8vIG5vdCBmb3VuZCAhISEKKwkJCUFTU0VSVChwUHJvYmVFbnRyeSAhPSBOVUxMKTsKKworCQkJUlQyOFhYX1NUQV9FTlRSWV9LRVlfREVMKHBBZCwgQlNTMCwgd2NpZCk7CisKKworCQlpZiAocEVudHJ5LT5FbnF1ZXVlRWFwb2xTdGFydFRpbWVyUnVubmluZyAhPSBFQVBPTF9TVEFSVF9ESVNBQkxFKQorCQl7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBFbnRyeS0+RW5xdWV1ZVN0YXJ0Rm9yUFNLVGltZXIsICZDYW5jZWxsZWQpOworCQkJcEVudHJ5LT5FbnF1ZXVlRWFwb2xTdGFydFRpbWVyUnVubmluZyA9IEVBUE9MX1NUQVJUX0RJU0FCTEU7CisJCX0KKworCisgICAJCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihNQUNfVEFCTEVfRU5UUlkpKTsKKwkJCXBBZC0+TWFjVGFiLlNpemUgLS07CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYWNUYWJsZURlbGV0ZUVudHJ5MSAtIFRvdGFsPSAlZFxuIiwgcEFkLT5NYWNUYWIuU2l6ZSkpOworCQl9CisJCWVsc2UKKwkJeworCQkJcHJpbnRrKCJcbiVzOiBJbXBvc3NpYmxlIFdjaWQgPSAlZCAhISEhIVxuIiwgX19mdW5jX18sIHdjaWQpOworCQl9CisJfQorCisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKworCS8vUmVzZXQgb3BlcmF0aW5nIG1vZGUgd2hlbiBubyBTdGEuCisJaWYgKHBBZC0+TWFjVGFiLlNpemUgPT0gMCkKKwl7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSA9IDA7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgMCAvKnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSovLCAoQUxMTl9TRVRQUk9URUNUKSwgVFJVRSwgMCAvKnBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uTm9uR0YqLyk7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIHJvdXRpbmUgcmVzZXQgdGhlIGVudGlyZSBNQUMgdGFibGUuIEFsbCBwYWNrZXRzIHBlbmRpbmcgaW4KKwkJdGhlIHBvd2VyLXNhdmluZyBxdWV1ZXMgYXJlIGZyZWVkIGhlcmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNYWNUYWJsZVJlc2V0KAorCUlOICBQUlRNUF9BREFQVEVSICBwQWQpCit7CisJaW50ICAgICAgICAgaTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1hY1RhYmxlUmVzZXRcbiIpKTsKKwkvL05kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisKKwlmb3IgKGk9MTsgaTxNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0NMSSA9PSBUUlVFKQorCSAgIHsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJLy8gZnJlZSByZXNvdXJjZXMgb2YgQkEKKwkJCUJBU2Vzc2lvblRlYXJEb3duQUxMKHBBZCwgaSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0NMSSA9IEZBTFNFOworCisKKworI2lmZGVmIFJUMjg3MAorCQkJTmRpc1plcm9NZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtpXS5BZGRyLCA2KTsKKwkJCVJUMjhYWF9TVEFfRU5UUllfTUFDX1JFU0VUKHBBZCwgaSk7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwkJCS8vQXNpY0RlbFdjaWRUYWIocEFkLCBpKTsKKwkJfQorCX0KKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQXNzb2NQYXJtRmlsbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBPVVQgTUxNRV9BU1NPQ19SRVFfU1RSVUNUICpBc3NvY1JlcSwKKwlJTiBQVUNIQVIgICAgICAgICAgICAgICAgICAgICBwQWRkciwKKwlJTiBVU0hPUlQgICAgICAgICAgICAgICAgICAgICBDYXBhYmlsaXR5SW5mbywKKwlJTiBVTE9ORyAgICAgICAgICAgICAgICAgICAgICBUaW1lb3V0LAorCUlOIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgIExpc3RlbkludHYpCit7CisJQ09QWV9NQUNfQUREUihBc3NvY1JlcS0+QWRkciwgcEFkZHIpOworCS8vIEFkZCBtYXNrIHRvIHN1cHBvcnQgODAyLjExYiBtb2RlIG9ubHkKKwlBc3NvY1JlcS0+Q2FwYWJpbGl0eUluZm8gPSBDYXBhYmlsaXR5SW5mbyAmIFNVUFBPUlRFRF9DQVBBQklMSVRZX0lORk87IC8vIG5vdCBjZi1wb2xsYWJsZSwgbm90IGNmLXBvbGwtcmVxdWVzdAorCUFzc29jUmVxLT5UaW1lb3V0ID0gVGltZW91dDsKKwlBc3NvY1JlcS0+TGlzdGVuSW50diA9IExpc3RlbkludHY7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgRGlzYXNzb2NQYXJtRmlsbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBPVVQgTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUICpEaXNhc3NvY1JlcSwKKwlJTiBQVUNIQVIgcEFkZHIsCisJSU4gVVNIT1JUIFJlYXNvbikKK3sKKwlDT1BZX01BQ19BRERSKERpc2Fzc29jUmVxLT5BZGRyLCBwQWRkcik7CisJRGlzYXNzb2NSZXEtPlJlYXNvbiA9IFJlYXNvbjsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ2hlY2sgdGhlIG91dCBnb2luZyBmcmFtZSwgaWYgdGhpcyBpcyBhbiBESENQIG9yIEFSUCBkYXRhZ3JhbQorCXdpbGwgYmUgZHVwbGljYXRlIGFub3RoZXIgZnJhbWUgYXQgbG93IGRhdGEgcmF0ZSB0cmFuc21pdC4KKworCUFyZ3VtZW50czoKKwkJcEFkIAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwUGFja2V0IAlQb2ludGVyIHRvIG91dGdvaW5nIE5kaXMgZnJhbWUKKworCVJldHVybiBWYWx1ZToKKwkJVFJVRQkJVG8gYmUgZHVwbGljYXRlIGF0IExvdyBkYXRhIHJhdGUgdHJhbnNtaXQuICgxbWIpCisJCUZBTFNFCQlEbyBub3RoaW5nLgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJCU1BQyBoZWFkZXIgKyBJUCBIZWFkZXIgKyBVRFAgSGVhZGVyCisJCSAgMTQgQnl0ZXMJICAyMCBCeXRlcworCisJCVVEUCBIZWFkZXIKKwkJMDB8MDF8MDJ8MDN8MDR8MDV8MDZ8MDd8MDh8MDl8MTB8MTF8MTJ8MTN8MTR8MTV8CisJCQkJCQlTb3VyY2UgUG9ydAorCQkxNnwxN3wxOHwxOXwyMHwyMXwyMnwyM3wyNHwyNXwyNnwyN3wyOHwyOXwzMHwzMXwKKwkJCQkJRGVzdGluYXRpb24gUG9ydAorCisJCXBvcnQgMHg0MyBtZWFucyBCb290c3RyYXAgUHJvdG9jb2wsIHNlcnZlci4KKwkJUG9ydCAweDQ0IG1lYW5zIEJvb3RzdHJhcCBQcm90b2NvbCwgY2xpZW50LgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCitCT09MRUFOIFJUTVBDaGVja0RIQ1BGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCkKK3sKKwlQQUNLRVRfSU5GTyAJUGFja2V0SW5mbzsKKwlVTE9ORwkJCU51bWJlck9mQnl0ZXNSZWFkID0gMDsKKwlVTE9ORwkJCUN1cnJlbnRPZmZzZXQgPSAwOworCVBWT0lECQkJcFZpcnR1YWxBZGRyZXNzID0gTlVMTDsKKwlVSU5UCQkJTmRpc0J1ZmZlckxlbmd0aDsKKwlQVUNIQVIJCQlwU3JjOworCVVTSE9SVAkJCVByb3RvY29sOworCVVDSEFSCQkJQnl0ZU9mZnNldDM2ID0gMDsKKwlVQ0hBUgkJCUJ5dGVPZmZzZXQzOCA9IDA7CisJQk9PTEVBTiAJCVJlYWRGaXJzdFBhcm0gPSBUUlVFOworCisJUlRNUF9RdWVyeVBhY2tldEluZm8ocFBhY2tldCwgJlBhY2tldEluZm8sIChQVUNIQVIgKikmcFZpcnR1YWxBZGRyZXNzLCAmTmRpc0J1ZmZlckxlbmd0aCk7CisKKwlOdW1iZXJPZkJ5dGVzUmVhZCArPSBOZGlzQnVmZmVyTGVuZ3RoOworCXBTcmMgPSAoUFVDSEFSKSBwVmlydHVhbEFkZHJlc3M7CisJUHJvdG9jb2wgPSAqKHBTcmMgKyAxMikgKiAyNTYgKyAqKHBTcmMgKyAxMyk7CisKKwkvLworCS8vIENoZWNrIERIQ1AgJiBCT09UUCBwcm90b2NvbAorCS8vCisJd2hpbGUgKE51bWJlck9mQnl0ZXNSZWFkIDw9IFBhY2tldEluZm8uVG90YWxQYWNrZXRMZW5ndGgpCisJeworCQlpZiAoKE51bWJlck9mQnl0ZXNSZWFkID49IDM1KSAmJiAoUmVhZEZpcnN0UGFybSA9PSBUUlVFKSkKKwkJeworCQkJQ3VycmVudE9mZnNldCA9IDM1IC0gKE51bWJlck9mQnl0ZXNSZWFkIC0gTmRpc0J1ZmZlckxlbmd0aCk7CisJCQlCeXRlT2Zmc2V0MzYgPSAqKHBTcmMgKyBDdXJyZW50T2Zmc2V0KTsKKwkJCVJlYWRGaXJzdFBhcm0gPSBGQUxTRTsKKwkJfQorCisJCWlmIChOdW1iZXJPZkJ5dGVzUmVhZCA+PSAzNykKKwkJeworCQkJQ3VycmVudE9mZnNldCA9IDM3IC0gKE51bWJlck9mQnl0ZXNSZWFkIC0gTmRpc0J1ZmZlckxlbmd0aCk7CisJCQlCeXRlT2Zmc2V0MzggPSAqKHBTcmMgKyBDdXJyZW50T2Zmc2V0KTsKKwkJCS8vRW5kIG9mIFJlYWQKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkvLyBDaGVjayBmb3IgREhDUCAmIEJPT1RQIHByb3RvY29sCisJaWYgKChCeXRlT2Zmc2V0MzYgIT0gMHg0NCkgfHwgKEJ5dGVPZmZzZXQzOCAhPSAweDQzKSkKKwkJeworCQkvLworCQkvLyAyMDU0IChoZXggMDgwNikgZm9yIEFSUCBkYXRhZ3JhbXMKKwkJLy8gaWYgdGhpcyBwYWNrZXQgaXMgbm90IEFSUCBkYXRhZ3JhbXMsIHRoZW4gZG8gbm90aGluZworCQkvLyBBUlAgZGF0YWdyYW1zIHdpbGwgYWxzbyBiZSBkdXBsaWNhdGUgYXQgMW1iIGJyb2FkY2FzdCBmcmFtZXMKKwkJLy8KKwkJaWYgKFByb3RvY29sICE9IDB4MDgwNiApCisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKworCXJldHVybiBUUlVFOworfQorCisKK0JPT0xFQU4gUlRNUENoZWNrRXRoZXJUeXBlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQoreworCVVTSE9SVAlUeXBlTGVuOworCVVDSEFSCUJ5dGUwLCBCeXRlMTsKKwlQVUNIQVIJcFNyY0J1ZjsKKwlVSU5UMzIJcGt0TGVuOworCVVJTlQxNiAJc3JjUG9ydCwgZHN0UG9ydDsKKwlCT09MRUFOCXN0YXR1cyA9IFRSVUU7CisKKworCXBTcmNCdWYgPSBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CisJcGt0TGVuID0gR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7CisKKwlBU1NFUlQocFNyY0J1Zik7CisKKwlSVE1QX1NFVF9QQUNLRVRfU1BFQ0lGSUMocFBhY2tldCwgMCk7CisKKwkvLyBnZXQgRXRoZXJuZXQgcHJvdG9jb2wgZmllbGQKKwlUeXBlTGVuID0gKHBTcmNCdWZbMTJdIDw8IDgpICsgcFNyY0J1ZlsxM107CisKKwlwU3JjQnVmICs9IExFTkdUSF84MDJfMzsJLy8gU2tpcCB0aGUgRXRoZXJuZXQgSGVhZGVyLgorCisJaWYgKFR5cGVMZW4gPD0gMTUwMCkKKwl7CS8vIDgwMi4zLCA4MDIuMyBMTEMKKwkJLyoKKwkJCURlc3RNQUMoNikgKyBTcmNNQUMoNikgKyBMZW5naHQoMikgKworCQkJRFNBUCgxKSArIFNTQVAoMSkgKyBDb250cm9sKDEpICsKKwkJCWlmIHRoZSBEU0FQID0gMHhBQSwgU1NBUD0weEFBLCBDb250b3JsID0gMHgwMywgaXQgaGFzIGEgNS1ieXRlcyBTTkFQIGhlYWRlci4KKwkJCQk9PiArIFNOQVAgKDUsIE9yaWdpbmF0aW9uSUQoMykgKyBldGhlclR5cGUoMikpCisJCSovCisJCWlmIChwU3JjQnVmWzBdID09IDB4QUEgJiYgcFNyY0J1ZlsxXSA9PSAweEFBICYmIHBTcmNCdWZbMl0gPT0gMHgwMykKKwkJeworCQkJU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcihwU3JjQnVmLCA2LCAmQnl0ZTAsICZCeXRlMSk7CisJCQlSVE1QX1NFVF9QQUNLRVRfTExDU05BUChwUGFja2V0LCAxKTsKKwkJCVR5cGVMZW4gPSAoVVNIT1JUKSgoQnl0ZTAgPDwgOCkgKyBCeXRlMSk7CisJCQlwU3JjQnVmICs9IDg7IC8vIFNraXAgdGhpcyBMTEMvU05BUCBoZWFkZXIKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vSXQganVzdCBoYXMgMy1ieXRlIExMQyBoZWFkZXIsIG1heWJlIGEgbGVnYWN5IGV0aGVyIHR5cGUgZnJhbWUuIHdlIGRpZG4ndCBoYW5kbGUgaXQuCisJCX0KKwl9CisKKwkvLyBJZiBpdCdzIGEgVkxBTiBwYWNrZXQsIGdldCB0aGUgcmVhbCBUeXBlL0xlbmd0aCBmaWVsZC4KKwlpZiAoVHlwZUxlbiA9PSAweDgxMDApCisJeworCQkvKiAweDgxMDAgbWVhbnMgVkxBTiBwYWNrZXRzICovCisKKwkJLyogRGVzdC4gTUFDIEFkZHJlc3MgKDYtYnl0ZXMpICsKKwkJICAgU291cmNlIE1BQyBBZGRyZXNzICg2LWJ5dGVzKSArCisJCSAgIExlbmd0aC9UeXBlID0gODAyLjFRIFRhZyBUeXBlICgyLWJ5dGUpICsKKwkJICAgVGFnIENvbnRyb2wgSW5mb3JtYXRpb24gKDItYnl0ZXMpICsKKwkJICAgTGVuZ3RoIC8gVHlwZSAoMi1ieXRlcykgKworCQkgICBkYXRhIHBheWxvYWQgKDAtbiBieXRlcykgKworCQkgICBQYWQgKDAtcCBieXRlcykgKworCQkgICBGcmFtZSBDaGVjayBTZXF1ZW5jZSAoNC1ieXRlcykgKi8KKworCQlSVE1QX1NFVF9QQUNLRVRfVkxBTihwUGFja2V0LCAxKTsKKwkJU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcihwU3JjQnVmLCAyLCAmQnl0ZTAsICZCeXRlMSk7CisJCVR5cGVMZW4gPSAoVVNIT1JUKSgoQnl0ZTAgPDwgOCkgKyBCeXRlMSk7CisKKwkJcFNyY0J1ZiArPSA0OyAvLyBTa2lwIHRoZSBWTEFOIEhlYWRlci4KKwl9CisKKwlzd2l0Y2ggKFR5cGVMZW4pCisJeworCQljYXNlIDB4MDgwMDoKKwkJCXsKKwkJCQlBU1NFUlQoKHBrdExlbiA+IDM0KSk7CisJCQkJaWYgKCoocFNyY0J1ZiArIDkpID09IDB4MTEpCisJCQkJewkvLyB1ZHAgcGFja2V0CisJCQkJCUFTU0VSVCgocGt0TGVuID4gMzQpKTsJLy8gMTQgZm9yIGV0aGVybmV0IGhlYWRlciwgMjAgZm9yIElQIGhlYWRlcgorCisJCQkJCXBTcmNCdWYgKz0gMjA7CS8vIFNraXAgdGhlIElQIGhlYWRlcgorCQkJCQlzcmNQb3J0ID0gT1NfTlRPSFMoKigoVUlOVDE2ICopcFNyY0J1ZikpOworCQkJCQlkc3RQb3J0ID0gT1NfTlRPSFMoKigoVUlOVDE2ICopKHBTcmNCdWYgKzIpKSk7CisKKwkJCQkJaWYgKChzcmNQb3J0PT0weDQ0ICYmIGRzdFBvcnQ9PTB4NDMpIHx8IChzcmNQb3J0PT0weDQzICYmIGRzdFBvcnQ9PTB4NDQpKQorCQkJCQl7CS8vSXQncyBhIEJPT1RQL0RIQ1AgcGFja2V0CisJCQkJCQlSVE1QX1NFVF9QQUNLRVRfREhDUChwUGFja2V0LCAxKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDB4MDgwNjoKKwkJCXsKKwkJCQkvL0FSUCBQYWNrZXQuCisJCQkJUlRNUF9TRVRfUEFDS0VUX0RIQ1AocFBhY2tldCwgMSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAweDg4OGU6CisJCQl7CisJCQkJLy8gRUFQT0wgUGFja2V0LgorCQkJCVJUTVBfU0VUX1BBQ0tFVF9FQVBPTChwUGFja2V0LCAxKTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3RhdHVzID0gRkFMU0U7CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworCit9CisKKworCitWT0lEIFVwZGF0ZV9Sc3NpX1NhbXBsZSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBSU1NJX1NBTVBMRQkJKnBSc3NpLAorCUlOIFBSWFdJX1NUUlVDCQlwUnhXSSkKKwkJeworCUNIQVIJcnNzaTAgPSBwUnhXSS0+UlNTSTA7CisJQ0hBUglyc3NpMSA9IHBSeFdJLT5SU1NJMTsKKwlDSEFSCXJzc2kyID0gcFJ4V0ktPlJTU0kyOworCisJaWYgKHJzc2kwICE9IDApCisJeworCQlwUnNzaS0+TGFzdFJzc2kwCT0gQ29udmVydFRvUnNzaShwQWQsIChDSEFSKXJzc2kwLCBSU1NJXzApOworCQlwUnNzaS0+QXZnUnNzaTBYOAk9IChwUnNzaS0+QXZnUnNzaTBYOCAtIHBSc3NpLT5BdmdSc3NpMCkgKyBwUnNzaS0+TGFzdFJzc2kwOworCQlwUnNzaS0+QXZnUnNzaTAJPSBwUnNzaS0+QXZnUnNzaTBYOCA+PiAzOworCX0KKworCWlmIChyc3NpMSAhPSAwKQorCXsKKwkJcFJzc2ktPkxhc3RSc3NpMQk9IENvbnZlcnRUb1Jzc2kocEFkLCAoQ0hBUilyc3NpMSwgUlNTSV8xKTsKKwkJcFJzc2ktPkF2Z1Jzc2kxWDgJPSAocFJzc2ktPkF2Z1Jzc2kxWDggLSBwUnNzaS0+QXZnUnNzaTEpICsgcFJzc2ktPkxhc3RSc3NpMTsKKwkJcFJzc2ktPkF2Z1Jzc2kxCT0gcFJzc2ktPkF2Z1Jzc2kxWDggPj4gMzsKKwl9CisKKwlpZiAocnNzaTIgIT0gMCkKKwl7CisJCXBSc3NpLT5MYXN0UnNzaTIJPSBDb252ZXJ0VG9Sc3NpKHBBZCwgKENIQVIpcnNzaTIsIFJTU0lfMik7CisJCXBSc3NpLT5BdmdSc3NpMlg4ICA9IChwUnNzaS0+QXZnUnNzaTJYOCAtIHBSc3NpLT5BdmdSc3NpMikgKyBwUnNzaS0+TGFzdFJzc2kyOworCQlwUnNzaS0+QXZnUnNzaTIgPSBwUnNzaS0+QXZnUnNzaTJYOCA+PiAzOworCX0KK30KKworCisKKy8vIE5vcm1hbCBsZWdhY3kgUnggcGFja2V0IGluZGljYXRpb24KK1ZPSUQgSW5kaWNhdGVfTGVnYWN5X1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJUE5ESVNfUEFDS0VUCXBSeFBhY2tldCA9IHBSeEJsay0+cFJ4UGFja2V0OworCVVDSEFSCQkJSGVhZGVyODAyXzNbTEVOR1RIXzgwMl8zXTsKKworCS8vIDEuIGdldCA4MDIuMyBIZWFkZXIKKwkvLyAyLiByZW1vdmUgTExDCisJLy8gCQlhLiBwb2ludGVyIHBSeEJsay0+cERhdGEgdG8gcGF5bG9hZAorCS8vICAgICAgYi4gbW9kaWZ5IHBSeEJsay0+RGF0YVNpemUKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlSVE1QXzgwMl8xMV9SRU1PVkVfTExDX0FORF9DT05WRVJUX1RPXzgwMl8zKHBSeEJsaywgSGVhZGVyODAyXzMpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJaWYgKHBSeEJsay0+RGF0YVNpemUgPiBNQVhfUlhfUEtUX0xFTikKKwl7CisjaWYgMCAvLyBzYW1wbGUgdGFrZSBvZmYsIGZvciBtdWx0aXBsZSBjYXJkIGRlc2lnbgorCQlzdGF0aWMgaW50IGVycl9zaXplOworCisJCWVycl9zaXplKys7CisJCWlmIChlcnJfc2l6ZSA+IDIwKQorCQl7CisJCQkgcHJpbnRrKCJMZWdhY3kgRGF0YVNpemUgPSAlZFxuIiwgcFJ4QmxrLT5EYXRhU2l6ZSk7CisJCQkgaGV4X2R1bXAoIjgwMi4zIEhlYWRlciIsIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMpOworCQkJIGhleF9kdW1wKCJQYXlsb2FkIiwgcFJ4QmxrLT5wRGF0YSwgNjQpOworCQkJIGVycl9zaXplID0gMDsKKwkJfQorI2VuZGlmCisKKwkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybjsKKwl9CisKKworCVNUQVRTX0lOQ19SWF9QQUNLRVRTKHBBZCwgRnJvbVdoaWNoQlNTSUQpOworCisjaWZkZWYgUlQyODcwCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJEaXNhYmxlUmVvcmRlcmluZyA9PSAwKQorCXsKKwkJUEJBX1JFQ19FTlRSWQkJcEJBRW50cnk7CisJCVVMT05HCQkJCU5vdzMyOworCQlVQ0hBUgkJCQlXY2lkID0gcFJ4QmxrLT5wUnhXSS0+V2lyZWxlc3NDbGlJRDsKKwkJVUNIQVIJCQkJVElEID0gcFJ4QmxrLT5wUnhXSS0+VElEOworCQlVU0hPUlQJCQkJSWR4OworCisjZGVmaW5lIFJFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQJCSgoMTAwICogSFopLzEwMDApCS8vIHN5c3RlbSB0aWNrcyAtLSAxMDAgbXMKKworCQlpZiAoV2NpZCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCQl7CisJCQlJZHggPSBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkJBUmVjV2NpZEFycmF5W1RJRF07CisJCQlpZiAoSWR4ICE9IDApCisJCQl7CisJCQkJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbSWR4XTsKKwkJCQkvLyB1cGRhdGUgbGFzdCByeCB0aW1lCisJCQkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93MzIpOworCQkJCWlmICgocEJBRW50cnktPmxpc3QucWxlbiA+IDApICYmCisJCQkJCSBSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93MzIsICh1bnNpZ25lZCBsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIrKFJFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQpKSkKKwkgICAJCQkJKQorCQkJCXsKKwkJCQkJcHJpbnRrKCJJbmRpY2F0ZV9MZWdhY3lfUGFja2V0KCk6Zmx1c2ggcmVvcmRlcmluZ190aW1lb3V0X21wZHVzISBSeFdJLT5GbGFncz0lZCwgcFJ4V0kuVElEPSVkLCBSeEQtPkFNUERVPSVkIVxuIiwgcFJ4QmxrLT5GbGFncywgcFJ4QmxrLT5wUnhXSS0+VElELCBwUnhCbGstPlJ4RC5BTVBEVSk7CisJCQkJCWhleF9kdW1wKCJEdW1wIHRoZSBsZWdhY3kgUGFja2V0OiIsIEdFVF9PU19QS1RfREFUQVBUUihwUnhCbGstPnBSeFBhY2tldCksIDY0KTsKKwkJCQkJYmFfZmx1c2hfcmVvcmRlcmluZ190aW1lb3V0X21wZHVzKHBBZCwgcEJBRW50cnksIE5vdzMyKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwl3bGFuXzgwMl8xMV90b184MDJfM19wYWNrZXQocEFkLCBwUnhCbGssIEhlYWRlcjgwMl8zLCBGcm9tV2hpY2hCU1NJRCk7CisKKwkvLworCS8vIHBhc3MgdGhpcyA4MDIuMyBwYWNrZXQgdG8gdXBwZXIgbGF5ZXIgb3IgZm9yd2FyZCB0aGlzIHBhY2tldCB0byBXTSBkaXJlY3RseQorCS8vCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIEZyb21XaGljaEJTU0lEKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworfQorCisKKy8vIE5vcm1hbCwgQU1QRFUgb3IgQU1TRFUKK1ZPSUQgQ21tUnhub25SYWxpbmtGcmFtZUluZGljYXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlpZiAoUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BTVBEVSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLmJEaXNhYmxlUmVvcmRlcmluZyA9PSAwKSkKKwl7CisJCUluZGljYXRlX0FNUERVX1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCX0KKwllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAoUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BTVNEVSkpCisJCXsKKwkJCS8vIGhhbmRsZSBBLU1TRFUKKwkJCUluZGljYXRlX0FNU0RVX1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCQl9CisJCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJeworCQkJSW5kaWNhdGVfTGVnYWN5X1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCQl9CisJfQorfQorCisKK1ZPSUQgQ21tUnhSYWxpbmtGcmFtZUluZGljYXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKwlVQ0hBUgkJCUhlYWRlcjgwMl8zW0xFTkdUSF84MDJfM107CisJVUlOVDE2CQkJTXNkdTJTaXplOworCVVJTlQxNiAJCQlQYXlsb2FkMVNpemUsIFBheWxvYWQyU2l6ZTsKKwlQVUNIQVIgCQkJcERhdGEyOworCVBORElTX1BBQ0tFVAlwUGFja2V0MiA9IE5VTEw7CisKKworCisJTXNkdTJTaXplID0gKihwUnhCbGstPnBEYXRhKSArICgqKHBSeEJsay0+cERhdGErMSkgPDwgOCk7CisKKwlpZiAoKE1zZHUyU2l6ZSA8PSAxNTM2KSAmJiAoTXNkdTJTaXplIDwgcFJ4QmxrLT5EYXRhU2l6ZSkpCisJeworCQkvKiBza2lwIHR3byBieXRlIE1TRFUyIGxlbiAqLworCQlwUnhCbGstPnBEYXRhICs9IDI7CisJCXBSeEJsay0+RGF0YVNpemUgLT0gMjsKKwl9CisJZWxzZQorCXsKKwkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJcmV0dXJuOworCX0KKworCS8vIGdldCA4MDIuMyBIZWFkZXIgYW5kICByZW1vdmUgTExDCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJUlRNUF84MDJfMTFfUkVNT1ZFX0xMQ19BTkRfQ09OVkVSVF9UT184MDJfMyhwUnhCbGssIEhlYWRlcjgwMl8zKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisJQVNTRVJUKHBSeEJsay0+cFJ4UGFja2V0KTsKKworCS8vIFJhbGluayBBZ2dyZWdhdGlvbiBmcmFtZQorCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhBZ2dyZWdhdGlvbkNvdW50ICsrOworCVBheWxvYWQxU2l6ZSA9IHBSeEJsay0+RGF0YVNpemUgLSBNc2R1MlNpemU7CisJUGF5bG9hZDJTaXplID0gTXNkdTJTaXplIC0gTEVOR1RIXzgwMl8zOworCisJcERhdGEyID0gcFJ4QmxrLT5wRGF0YSArIFBheWxvYWQxU2l6ZSArIExFTkdUSF84MDJfMzsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlwUGFja2V0MiA9IGR1cGxpY2F0ZV9wa3QocEFkLCAocERhdGEyLUxFTkdUSF84MDJfMyksIExFTkdUSF84MDJfMywgcERhdGEyLCBQYXlsb2FkMlNpemUsIEZyb21XaGljaEJTU0lEKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCWlmICghcFBhY2tldDIpCisJeworCQkvLyByZWxlYXNlIHBhY2tldAorCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlyZXR1cm47CisJfQorCisJLy8gdXBkYXRlIHBheWxvYWQgc2l6ZSBvZiAxc3QgcGFja2V0CisJcFJ4QmxrLT5EYXRhU2l6ZSA9IFBheWxvYWQxU2l6ZTsKKwl3bGFuXzgwMl8xMV90b184MDJfM19wYWNrZXQocEFkLCBwUnhCbGssIEhlYWRlcjgwMl8zLCBGcm9tV2hpY2hCU1NJRCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlBTk5PVU5DRV9PUl9GT1JXQVJEXzgwMl8zX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBGcm9tV2hpY2hCU1NJRCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlpZiAocFBhY2tldDIpCisJeworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQocEFkLCBwUGFja2V0MiwgRnJvbVdoaWNoQlNTSUQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KK30KKworCisjZGVmaW5lIFJFU0VUX0ZSQUdGUkFNRShfZnJhZ0ZyYW1lKSBcCisJewkJCQkJCQkJXAorCQlfZnJhZ0ZyYW1lLlJ4U2l6ZSA9IDA7CQlcCisJCV9mcmFnRnJhbWUuU2VxdWVuY2UgPSAwOwlcCisJCV9mcmFnRnJhbWUuTGFzdEZyYWcgPSAwOwlcCisJCV9mcmFnRnJhbWUuRmxhZ3MgPSAwOwkJXAorCX0KKworCitQTkRJU19QQUNLRVQgUlRNUERlRnJhZ21lbnREYXRhRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaykKK3sKKwlQSEVBREVSXzgwMl8xMQlwSGVhZGVyID0gcFJ4QmxrLT5wSGVhZGVyOworCVBORElTX1BBQ0tFVAlwUnhQYWNrZXQgPSBwUnhCbGstPnBSeFBhY2tldDsKKwlVQ0hBUgkJCSpwRGF0YSA9IHBSeEJsay0+cERhdGE7CisJVVNIT1JUCQkJRGF0YVNpemUgPSBwUnhCbGstPkRhdGFTaXplOworCVBORElTX1BBQ0tFVAlwUmV0UGFja2V0ID0gTlVMTDsKKwlVQ0hBUgkJCSpwRnJhZ0J1ZmZlciA9IE5VTEw7CisJQk9PTEVBTiAJCWJSZWFzc0RvbmUgPSBGQUxTRTsKKwlVQ0hBUgkJCUhlYWRlclJvb20gPSAwOworCisKKwlBU1NFUlQocEhlYWRlcik7CisKKwlIZWFkZXJSb29tID0gcERhdGEgLSAoVUNIQVIgKilwSGVhZGVyOworCisJLy8gUmUtYXNzZW1ibGUgdGhlIGZyYWdtZW50ZWQgcGFja2V0cworCWlmIChwSGVhZGVyLT5GcmFnID09IDApCQkvLyBGcmFnLiBOdW1iZXIgaXMgMCA6IEZpcnN0IGZyYWcgb3Igb25seSBvbmUgcGt0CisJeworCQkvLyB0aGUgZmlyc3QgcGt0IG9mIGZyYWdtZW50LCByZWNvcmQgaXQuCisJCWlmIChwSGVhZGVyLT5GQy5Nb3JlRnJhZykKKwkJeworCQkJQVNTRVJUKHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0KTsKKwkJCXBGcmFnQnVmZmVyID0gR0VUX09TX1BLVF9EQVRBUFRSKHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0KTsKKwkJCXBBZC0+RnJhZ0ZyYW1lLlJ4U2l6ZSAgID0gRGF0YVNpemUgKyBIZWFkZXJSb29tOworCQkJTmRpc01vdmVNZW1vcnkocEZyYWdCdWZmZXIsCSBwSGVhZGVyLCBwQWQtPkZyYWdGcmFtZS5SeFNpemUpOworCQkJcEFkLT5GcmFnRnJhbWUuU2VxdWVuY2UgPSBwSGVhZGVyLT5TZXF1ZW5jZTsKKwkJCXBBZC0+RnJhZ0ZyYW1lLkxhc3RGcmFnID0gcEhlYWRlci0+RnJhZzsJICAgLy8gU2hvdWxkIGJlIDAKKwkJCUFTU0VSVChwQWQtPkZyYWdGcmFtZS5MYXN0RnJhZyA9PSAwKTsKKwkJCWdvdG8gZG9uZTsJLy8gZW5kIG9mIHByb2Nlc3NpbmcgdGhpcyBmcmFtZQorCQl9CisJfQorCWVsc2UJLy9NaWRkbGUgJiBFbmQgb2YgZnJhZ21lbnQKKwl7CisJCWlmICgocEhlYWRlci0+U2VxdWVuY2UgIT0gcEFkLT5GcmFnRnJhbWUuU2VxdWVuY2UpIHx8CisJCQkocEhlYWRlci0+RnJhZyAhPSAocEFkLT5GcmFnRnJhbWUuTGFzdEZyYWcgKyAxKSkpCisJCXsKKwkJCS8vIEZyYWdtZW50IGlzIG5vdCB0aGUgc2FtZSBzZXF1ZW5jZSBvciBvdXQgb2YgZnJhZ21lbnQgbnVtYmVyIG9yZGVyCisJCQkvLyBSZXNldCBGcmFnbWVudCBjb250cm9sIGJsaworCQkJUkVTRVRfRlJBR0ZSQU1FKHBBZC0+RnJhZ0ZyYW1lKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkZyYWdtZW50IGlzIG5vdCB0aGUgc2FtZSBzZXF1ZW5jZSBvciBvdXQgb2YgZnJhZ21lbnQgbnVtYmVyIG9yZGVyLlxuIikpOworCQkJZ290byBkb25lOyAvLyBnaXZlIHVwIHRoaXMgZnJhbWUKKwkJfQorCQllbHNlIGlmICgocEFkLT5GcmFnRnJhbWUuUnhTaXplICsgRGF0YVNpemUpID4gTUFYX0ZSQU1FX1NJWkUpCisJCXsKKwkJCS8vIEZyYWdtZW50IGZyYW1lIGlzIHRvbyBsYXJnZSwgaXQgZXhlZWRzIHRoZSBtYXhpbXVtIGZyYW1lIHNpemUuCisJCQkvLyBSZXNldCBGcmFnbWVudCBjb250cm9sIGJsaworCQkJUkVTRVRfRlJBR0ZSQU1FKHBBZC0+RnJhZ0ZyYW1lKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkZyYWdtZW50IGZyYW1lIGlzIHRvbyBsYXJnZSwgaXQgZXhlZWRzIHRoZSBtYXhpbXVtIGZyYW1lIHNpemUuXG4iKSk7CisJCQlnb3RvIGRvbmU7IC8vIGdpdmUgdXAgdGhpcyBmcmFtZQorCQl9CisKKyAgICAgICAgLy8KKwkJLy8gQnJvYWRjb20gQVAoQkNNOTQ3MDRBR1IpIHdpbGwgc2VuZCBvdXQgTExDIGluIGZyYWdtZW50J3MgcGFja2V0LCBMTEMgb25seSBjYW4gYWNjcGV0IGF0IGZpcnN0IGZyYWdtZW50LgorCQkvLyBJbiB0aGlzIGNhc2UsIHdlIHdpbGwgZHJvcHQgaXQuCisJCS8vCisJCWlmIChOZGlzRXF1YWxNZW1vcnkocERhdGEsIFNOQVBfODAyXzFILCBzaXplb2YoU05BUF84MDJfMUgpKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRmluZCBhbm90aGVyIExMQyBhdCBNaWRkbGUgb3IgRW5kIGZyYWdtZW50KFNOPSVkLCBGcmFnPSVkKVxuIiwgcEhlYWRlci0+U2VxdWVuY2UsIHBIZWFkZXItPkZyYWcpKTsKKwkJCWdvdG8gZG9uZTsgLy8gZ2l2ZSB1cCB0aGlzIGZyYW1lCisJCX0KKworCQlwRnJhZ0J1ZmZlciA9IEdFVF9PU19QS1RfREFUQVBUUihwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCk7CisKKwkJLy8gY29uY2F0ZW5hdGUgdGhpcyBmcmFnbWVudCBpbnRvIHRoZSByZS1hc3NlbWJseSBidWZmZXIKKwkJTmRpc01vdmVNZW1vcnkoKHBGcmFnQnVmZmVyICsgcEFkLT5GcmFnRnJhbWUuUnhTaXplKSwgcERhdGEsIERhdGFTaXplKTsKKwkJcEFkLT5GcmFnRnJhbWUuUnhTaXplICArPSBEYXRhU2l6ZTsKKwkJcEFkLT5GcmFnRnJhbWUuTGFzdEZyYWcgPSBwSGVhZGVyLT5GcmFnOwkgICAvLyBVcGRhdGUgZnJhZ21lbnQgbnVtYmVyCisKKwkJLy8gTGFzdCBmcmFnbWVudAorCQlpZiAocEhlYWRlci0+RkMuTW9yZUZyYWcgPT0gRkFMU0UpCisJCXsKKwkJCWJSZWFzc0RvbmUgPSBUUlVFOworCQl9CisJfQorCitkb25lOgorCS8vIGFsd2F5cyByZWxlYXNlIHJ4IGZyYWdtZW50ZWQgcGFja2V0CisJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisKKwkvLyByZXR1cm4gZGVmcmFnbWVudGVkIHBhY2tldCBpZiBwYWNrZXQgaXMgcmVhc3NlbWJsZWQgY29tcGxldGVseQorCS8vIG90aGVyd2lzZSByZXR1cm4gTlVMTAorCWlmIChiUmVhc3NEb25lKQorCXsKKwkJUE5ESVNfUEFDS0VUIHBOZXdGcmFnUGFja2V0OworCisJCS8vIGFsbG9jYXRlIGEgbmV3IHBhY2tldCBidWZmZXIgZm9yIGZyYWdtZW50CisJCXBOZXdGcmFnUGFja2V0ID0gUlRNUF9BbGxvY2F0ZUZyYWdQYWNrZXRCdWZmZXIocEFkLCBSWF9CVUZGRVJfTk9STVNJWkUpOworCQlpZiAocE5ld0ZyYWdQYWNrZXQpCisJCXsKKwkJCS8vIHVwZGF0ZSBSeEJsaworCQkJcFJldFBhY2tldCA9IHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0OworCQkJcEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQgPSBwTmV3RnJhZ1BhY2tldDsKKwkJCXBSeEJsay0+cEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkgR0VUX09TX1BLVF9EQVRBUFRSKHBSZXRQYWNrZXQpOworCQkJcFJ4QmxrLT5wRGF0YSA9IChVQ0hBUiAqKXBSeEJsay0+cEhlYWRlciArIEhlYWRlclJvb207CisJCQlwUnhCbGstPkRhdGFTaXplID0gcEFkLT5GcmFnRnJhbWUuUnhTaXplIC0gSGVhZGVyUm9vbTsKKwkJCXBSeEJsay0+cFJ4UGFja2V0ID0gcFJldFBhY2tldDsKKwkJfQorCQllbHNlCisJCXsKKwkJCVJFU0VUX0ZSQUdGUkFNRShwQWQtPkZyYWdGcmFtZSk7CisJCX0KKwl9CisKKwlyZXR1cm4gcFJldFBhY2tldDsKK30KKworCitWT0lEIEluZGljYXRlX0FNU0RVX1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJVUlOVAkJCW5NU0RVOworCisJdXBkYXRlX29zX3BhY2tldF9pbmZvKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJUlRNUF9TRVRfUEFDS0VUX0lGKHBSeEJsay0+cFJ4UGFja2V0LCBGcm9tV2hpY2hCU1NJRCk7CisJbk1TRFUgPSBkZWFnZ3JlZ2F0ZV9BTVNEVV9hbm5vdW5jZShwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBwUnhCbGstPnBEYXRhLCBwUnhCbGstPkRhdGFTaXplKTsKK30KKworVk9JRCBJbmRpY2F0ZV9FQVBPTF9QYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQoreworCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5ID0gTlVMTDsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOworCQlTVEFSeEVBUE9MRnJhbWVJbmRpY2F0ZShwQWQsIHBFbnRyeSwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJCXJldHVybjsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlpZiAocEVudHJ5ID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIkluZGljYXRlX0VBUE9MX1BhY2tldDogZHJvcCBhbmQgcmVsZWFzZSB0aGUgaW52YWxpZCBwYWNrZXQuXG4iKSk7CisJCS8vIHJlbGVhc2UgcGFja2V0CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybjsKKwl9Cit9CisKKyNkZWZpbmUgQkNOX1RCVFRfT0ZGU0VUCQk2NAkvL2RlZmVyIDY0IHVzCitWT0lEIFJlU3luY0JlYWNvblRpbWUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpCit7CisKKwlVSU5UMzIgIE9mZnNldDsKKworCisJT2Zmc2V0ID0gKHBBZC0+VGJ0dFRpY2tDb3VudCkgJSAoQkNOX1RCVFRfT0ZGU0VUKTsKKworCXBBZC0+VGJ0dFRpY2tDb3VudCsrOworCisJLy8KKwkvLyBUaGUgdXBkYXRlZCBCZWFjb25JbnRlcnZhbCBWYWx1ZSB3aWxsIGFmZmVjdCBCZWFjb24gSW50ZXJ2YWwgYWZ0ZXIgdHdvIFRCVFQKKwkvLyBiZWFjYXN1ZSB0aGUgb3JpZ2luYWwgQmVhY29uSW50ZXJ2YWwgaGFkIGJlZW4gbG9hZGVkIGludG8gbmV4dCBUQlRUX1RJTUVSCisJLy8KKwlpZiAoT2Zmc2V0ID09IChCQ05fVEJUVF9PRkZTRVQtMikpCisJeworCQlCQ05fVElNRV9DRkdfU1RSVUMgY3NyOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIEJDTl9USU1FX0NGRywgJmNzci53b3JkKTsKKwkJY3NyLmZpZWxkLkJlYWNvbkludGVydmFsID0gKHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA8PCA0KSAtIDEgOwkvLyBBU0lDIHJlZ2lzdGVyIGluIHVuaXRzIG9mIDEvMTYgVFUgPSA2NHVzCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJDTl9USU1FX0NGRywgY3NyLndvcmQpOworCX0KKwllbHNlCisJeworCQlpZiAoT2Zmc2V0ID09IChCQ05fVEJUVF9PRkZTRVQtMSkpCisJCXsKKwkJCUJDTl9USU1FX0NGR19TVFJVQyBjc3I7CisKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAmY3NyLndvcmQpOworCQkJY3NyLmZpZWxkLkJlYWNvbkludGVydmFsID0gKHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCkgPDwgNDsgLy8gQVNJQyByZWdpc3RlciBpbiB1bml0cyBvZiAxLzE2IFRVCisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIGNzci53b3JkKTsKKwkJfQorCX0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX2RhdGFfMjg3MC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX2RhdGFfMjg3MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NzAwMGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fZGF0YV8yODcwLmMKQEAgLTAsMCArMSw5NjMgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKy8qCisgICBBbGwgZnVuY3Rpb25zIGluIHRoaXMgZmlsZSBtdXN0IGJlIFVTQi1kZXBlbmRlZCwgb3IgeW91IHNob3VsZCBvdXQgeW91ciBmdW5jdGlvbgorCWluIG90aGVyIGZpbGVzLgorCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisKKy8qCisJV2UgY2FuIGRvIGNvcHkgdGhlIGZyYW1lIGludG8gcFR4Q29udGV4dCB3aGVuIG1hdGNoIGZvbGxvd2luZyBjb25kaXRpb25zLgorCQk9PgorCQk9PgorCQk9PgorKi8KK3N0YXRpYyBpbmxpbmUgTkRJU19TVEFUVVMgUnRtcFVTQkNhbkRvV3JpdGUoCisJSU4gUlRNUF9BREFQVEVSCQkqcEFkLAorCUlOIFVDSEFSCQkJUXVlSWR4LAorCUlOIEhUX1RYX0NPTlRFWFQgCSpwSFRUWENvbnRleHQpCit7CisJTkRJU19TVEFUVVMJY2FuV3JpdGUgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7CisKKwlpZiAoKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pIDwgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uKSAmJiAocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICsgTE9DQUxfVFhCVUZfU0laRSkgPiBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24pCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlJ0bXBVU0JDYW5Eb1dyaXRlIGMxIVxuIikpOworCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCBRdWVJZHgpKTsKKwl9CisJZWxzZSBpZiAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA9PSA4KSAmJiAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uIDwgTE9DQUxfVFhCVUZfU0laRSkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlJ0bXBVU0JDYW5Eb1dyaXRlIGMyIVxuIikpOworCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCBRdWVJZHgpKTsKKwl9CisJZWxzZSBpZiAocEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9PSBUUlVFKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJSdG1wVVNCQ2FuRG9Xcml0ZSBjMyFcbiIpKTsKKwl9CisJZWxzZQorCXsKKwkJY2FuV3JpdGUgPSBORElTX1NUQVRVU19TVUNDRVNTOworCX0KKworCisJcmV0dXJuIGNhbldyaXRlOworfQorCisKK1VTSE9SVCBSdG1wVVNCX1dyaXRlU3ViVHhSZXNvdXJjZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrLAorCUlOCUJPT0xFQU4JCQliSXNMYXN0LAorCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcikKK3sKKworCS8vIER1bW15IGZ1bmN0aW9uLiBTaG91bGQgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgorCXJldHVybiAwOworCit9CisKK1VTSE9SVAlSdG1wVVNCX1dyaXRlRnJhZ1R4UmVzb3VyY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaywKKwlJTglVQ0hBUgkJCWZyYWdOdW0sCisJT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKQoreworCUhUX1RYX0NPTlRFWFQJKnBIVFRYQ29udGV4dDsKKwlVU0hPUlQJCQlod0hkckxlbjsJLy8gVGhlIGh3SGRyTGVuIGNvbnNpc3Qgb2YgODAyLjExIGhlYWRlciBsZW5ndGggcGx1cyB0aGUgaGVhZGVyIHBhZGRpbmcgbGVuZ3RoLgorCVVJTlQzMgkJCWZpbGxPZmZzZXQ7CisJVFhJTkZPX1NUUlVDCSpwVHhJbmZvOworCVRYV0lfU1RSVUMJCSpwVHhXSTsKKwlQVUNIQVIJCQlwV2lyZWxlc3NQYWNrZXQgPSBOVUxMOworCVVDSEFSCQkJUXVlSWR4OworCU5ESVNfU1RBVFVTCQlTdGF0dXM7CisJdW5zaWduZWQgbG9uZwlJcnFGbGFnczsKKwlVSU5UMzIJCQlVU0JETUFwa3RMZW4gPSAwLCBETUFIZHJMZW4sIHBhZGRpbmc7CisJQk9PTEVBTgkJCVR4UUxhc3RSb3VuZCA9IEZBTFNFOworCisJLy8KKwkvLyBnZXQgVHggUmluZyBSZXNvdXJjZSAmIERtYSBCdWZmZXIgYWRkcmVzcworCS8vCisJUXVlSWR4ID0gcFR4QmxrLT5RdWVJZHg7CisJcEhUVFhDb250ZXh0ICA9ICZwQWQtPlR4Q29udGV4dFtRdWVJZHhdOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOworCisJcEhUVFhDb250ZXh0ICA9ICZwQWQtPlR4Q29udGV4dFtRdWVJZHhdOworCWZpbGxPZmZzZXQgPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb247CisKKwlpZihmcmFnTnVtID09IDApCisJeworCQkvLyBDaGVjayBpZiB3ZSBoYXZlIGVub3VnaCBzcGFjZSBmb3IgdGhpcyBidWxrLW91dCBiYXRjaC4KKwkJU3RhdHVzID0gUnRtcFVTQkNhbkRvV3JpdGUocEFkLCBRdWVJZHgsIHBIVFRYQ29udGV4dCk7CisJCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJeworCQkJcEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9IFRSVUU7CisKKwkJCS8vIFJlc2VydmUgc3BhY2UgZm9yIDggYnl0ZXMgcGFkZGluZy4KKwkJCWlmICgocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9PSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pKQorCQkJeworCQkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gKz0gODsKKwkJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKz0gODsKKwkJCQlmaWxsT2Zmc2V0ICs9IDg7CisJCQl9CisJCQlwVHhCbGstPlByaXYgPSAwOworCQkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb247CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKKworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQlyZXR1cm4oU3RhdHVzKTsKKwkJfQorCX0KKwllbHNlCisJeworCQkvLyBGb3Igc3ViLXNlcXVlbnQgZnJhbWVzIG9mIHRoaXMgYnVsay1vdXQgYmF0Y2guIEp1c3QgY29weSBpdCB0byBvdXIgYnVsay1vdXQgYnVmZmVyLgorCQlTdGF0dXMgPSAoKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gVFJVRSkgPyBORElTX1NUQVRVU19TVUNDRVNTIDogTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJeworCQkJZmlsbE9mZnNldCArPSBwVHhCbGstPlByaXY7CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKKworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQlyZXR1cm4oU3RhdHVzKTsKKwkJfQorCX0KKworCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpKCZwVHhCbGstPkhlYWRlckJ1ZlswXSksIFRYSU5GT19TSVpFKTsKKwlwVHhJbmZvID0gKFBUWElORk9fU1RSVUMpKCZwVHhCbGstPkhlYWRlckJ1ZlswXSk7CisJcFR4V0k9IChQVFhXSV9TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSk7CisKKwlwV2lyZWxlc3NQYWNrZXQgPSAmcEhUVFhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbZmlsbE9mZnNldF07CisKKwkvLyBjb3B5IFRYV0kgKyBXTEFOIEhlYWRlciArIExMQyBpbnRvIERNQSBIZWFkZXIgQnVmZmVyCisJLy9od0hkckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbiwgNCk7CisJaHdIZHJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPkhkclBhZExlbjsKKworCS8vIEJ1aWxkIG91ciBVUkIgZm9yIFVTQkQKKwlETUFIZHJMZW4gPSBUWFdJX1NJWkUgKyBod0hkckxlbjsKKwlVU0JETUFwa3RMZW4gPSBETUFIZHJMZW4gKyBwVHhCbGstPlNyY0J1ZkxlbjsKKwlwYWRkaW5nID0gKDQgLSAoVVNCRE1BcGt0TGVuICUgNCkpICYgMHgwMzsJLy8gcm91bmQgdXAgdG8gNCBieXRlIGFsaWdubWVudAorCVVTQkRNQXBrdExlbiArPSBwYWRkaW5nOworCisJcFR4QmxrLT5Qcml2ICs9IChUWElORk9fU0laRSArIFVTQkRNQXBrdExlbik7CisKKwkvLyBGb3IgVHhJbmZvLCB0aGUgbGVuZ3RoIG9mIFVTQkRNQXBrdExlbiA9IFRYV0lfU0laRSArIDgwMi4xMSBoZWFkZXIgKyBwYXlsb2FkCisJUlRNUFdyaXRlVHhJbmZvKHBBZCwgcFR4SW5mbywgKFVTSE9SVCkoVVNCRE1BcGt0TGVuKSwgRkFMU0UsIEZJRk9fRURDQSwgRkFMU0UgLypOZXh0VmFsaWQqLywgIEZBTFNFKTsKKworCWlmIChmcmFnTnVtID09IHBUeEJsay0+VG90YWxGcmFnTnVtKQorCXsKKwkJcFR4SW5mby0+VVNCRE1BVHhidXJzdCA9IDA7CisJCWlmICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICsgcFR4QmxrLT5Qcml2ICsgMzkwNik+IE1BWF9UWEJVTEtfTElNSVQpCisJCXsKKwkJCXBUeEluZm8tPlN3VXNlTGFzdFJvdW5kID0gMTsKKwkJCVR4UUxhc3RSb3VuZCA9IFRSVUU7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcFR4SW5mby0+VVNCRE1BVHhidXJzdCA9IDE7CisJfQorCisJTmRpc01vdmVNZW1vcnkocFdpcmVsZXNzUGFja2V0LCBwVHhCbGstPkhlYWRlckJ1ZiwgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hkckxlbik7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIChQVUNIQVIpKHBXaXJlbGVzc1BhY2tldCArIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFKSwgRElSX1dSSVRFLCBGQUxTRSk7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCXBXaXJlbGVzc1BhY2tldCArPSAoVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hkckxlbik7CisJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgKz0gKFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZHJMZW4pOworCisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7CisKKwlOZGlzTW92ZU1lbW9yeShwV2lyZWxlc3NQYWNrZXQsIHBUeEJsay0+cFNyY0J1ZkRhdGEsIHBUeEJsay0+U3JjQnVmTGVuKTsKKworCS8vCVplcm8gdGhlIGxhc3QgcGFkZGluZy4KKwlwV2lyZWxlc3NQYWNrZXQgKz0gcFR4QmxrLT5TcmNCdWZMZW47CisJTmRpc1plcm9NZW1vcnkocFdpcmVsZXNzUGFja2V0LCBwYWRkaW5nICsgOCk7CisKKwlpZiAoZnJhZ051bSA9PSBwVHhCbGstPlRvdGFsRnJhZ051bSkKKwl7CisJCVJUTVBfSVJRX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKKworCQkvLyBVcGRhdGUgdGhlIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbi4gMzkwNiB1c2VkIHRvIHByZXZlbnQgdGhlIE5leHRCdWxrT3V0IGlzIGEgQS1SQUxJTksvQS1NU0RVIEZyYW1lLgorCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKz0gcFR4QmxrLT5Qcml2OworCQlpZiAoVHhRTGFzdFJvdW5kID09IFRSVUUpCisJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPSA4OworCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcyA9IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbjsKKworCisJCS8vIEZpbmFsbHksIHNldCBiQ3VyV3JpdGluZyBhcyBGQUxTRQorCXBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPSBGQUxTRTsKKworCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKKworCQkvLyBzdWNjZWVkIGFuZCByZWxlYXNlIHRoZSBza2IgYnVmZmVyCisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwVHhCbGstPnBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCX0KKworCisJcmV0dXJuKFN0YXR1cyk7CisKK30KKworCitVU0hPUlQgUnRtcFVTQl9Xcml0ZVNpbmdsZVR4UmVzb3VyY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaywKKwlJTglCT09MRUFOCQkJYklzTGFzdCwKKwlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpCit7CisJSFRfVFhfQ09OVEVYVAkqcEhUVFhDb250ZXh0OworCVVTSE9SVAkJCWh3SGRyTGVuOworCVVJTlQzMgkJCWZpbGxPZmZzZXQ7CisJVFhJTkZPX1NUUlVDCSpwVHhJbmZvOworCVRYV0lfU1RSVUMJCSpwVHhXSTsKKwlQVUNIQVIJCQlwV2lyZWxlc3NQYWNrZXQ7CisJVUNIQVIJCQlRdWVJZHg7CisJdW5zaWduZWQgbG9uZwlJcnFGbGFnczsKKwlORElTX1NUQVRVUwkJU3RhdHVzOworCVVJTlQzMgkJCVVTQkRNQXBrdExlbiA9IDAsIERNQUhkckxlbiwgcGFkZGluZzsKKwlCT09MRUFOCQkJYlR4UUxhc3RSb3VuZCA9IEZBTFNFOworCisJLy8gRm9yIFVTQiwgZGlkbid0IG5lZWQgUENJX01BUF9TSU5HTEUoKQorCS8vU3JjQnVmUEEgPSBQQ0lfTUFQX1NJTkdMRShwQWQsIChjaGFyICopIHBUeEJsay0+cFNyY0J1ZkRhdGEsIHBUeEJsay0+U3JjQnVmTGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKworCisJLy8KKwkvLyBnZXQgVHggUmluZyBSZXNvdXJjZSAmIERtYSBCdWZmZXIgYWRkcmVzcworCS8vCisJUXVlSWR4ID0gcFR4QmxrLT5RdWVJZHg7CisKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7CisJcEhUVFhDb250ZXh0ICA9ICZwQWQtPlR4Q29udGV4dFtRdWVJZHhdOworCWZpbGxPZmZzZXQgPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb247CisKKworCisJLy8gQ2hlY2sgcmluZyBmdWxsLgorCVN0YXR1cyA9IFJ0bXBVU0JDYW5Eb1dyaXRlKHBBZCwgUXVlSWR4LCBwSFRUWENvbnRleHQpOworCWlmKFN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJcEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9IFRSVUU7CisKKwkJcFR4SW5mbyA9IChQVFhJTkZPX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbMF0pOworCQlwVHhXST0gKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKTsKKworCQkvLyBSZXNlcnZlIHNwYWNlIGZvciA4IGJ5dGVzIHBhZGRpbmcuCisJCWlmICgocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9PSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pKQorCQl7CisJCQlwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uICs9IDg7CisJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKz0gODsKKwkJCWZpbGxPZmZzZXQgKz0gODsKKwkJfQorCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcyA9IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbjsKKworCQlwV2lyZWxlc3NQYWNrZXQgPSAmcEhUVFhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbZmlsbE9mZnNldF07CisKKwkJLy8gY29weSBUWFdJICsgV0xBTiBIZWFkZXIgKyBMTEMgaW50byBETUEgSGVhZGVyIEJ1ZmZlcgorCQkvL2h3SGRyTGVuID0gUk9VTkRfVVAocFR4QmxrLT5NcGR1SGVhZGVyTGVuLCA0KTsKKwkJaHdIZHJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPkhkclBhZExlbjsKKworCQkvLyBCdWlsZCBvdXIgVVJCIGZvciBVU0JECisJCURNQUhkckxlbiA9IFRYV0lfU0laRSArIGh3SGRyTGVuOworCQlVU0JETUFwa3RMZW4gPSBETUFIZHJMZW4gKyBwVHhCbGstPlNyY0J1ZkxlbjsKKwkJcGFkZGluZyA9ICg0IC0gKFVTQkRNQXBrdExlbiAlIDQpKSAmIDB4MDM7CS8vIHJvdW5kIHVwIHRvIDQgYnl0ZSBhbGlnbm1lbnQKKwkJVVNCRE1BcGt0TGVuICs9IHBhZGRpbmc7CisKKwkJcFR4QmxrLT5Qcml2ID0gKFRYSU5GT19TSVpFICsgVVNCRE1BcGt0TGVuKTsKKworCQkvLyBGb3IgVHhJbmZvLCB0aGUgbGVuZ3RoIG9mIFVTQkRNQXBrdExlbiA9IFRYV0lfU0laRSArIDgwMi4xMSBoZWFkZXIgKyBwYXlsb2FkCisJCVJUTVBXcml0ZVR4SW5mbyhwQWQsIHBUeEluZm8sIChVU0hPUlQpKFVTQkRNQXBrdExlbiksIEZBTFNFLCBGSUZPX0VEQ0EsIEZBTFNFIC8qTmV4dFZhbGlkKi8sICBGQUxTRSk7CisKKwkJaWYgKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyAzOTA2ICsgcFR4QmxrLT5Qcml2KSA+IE1BWF9UWEJVTEtfTElNSVQpCisJCXsKKwkJCXBUeEluZm8tPlN3VXNlTGFzdFJvdW5kID0gMTsKKwkJCWJUeFFMYXN0Um91bmQgPSBUUlVFOworCQl9CisJCU5kaXNNb3ZlTWVtb3J5KHBXaXJlbGVzc1BhY2tldCwgcFR4QmxrLT5IZWFkZXJCdWYsIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZHJMZW4pOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUikocFdpcmVsZXNzUGFja2V0ICsgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUpLCBESVJfV1JJVEUsIEZBTFNFKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisJCXBXaXJlbGVzc1BhY2tldCArPSAoVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hkckxlbik7CisKKwkJLy8gV2UgdW5sb2NrIGl0IGhlcmUgdG8gcHJldmVudCB0aGUgZmlyc3QgOCBieXRlcyBtYXliZSBvdmVyLXdyaXRlZCBpc3N1ZS4KKwkJLy8JMS4gRmlyc3Qgd2UgZ290IEN1cldyaXRlUG9zaXRpb24gYnV0IHRoZSBmaXJzdCA4IGJ5dGVzIHN0aWxsIG5vdCB3cml0ZSB0byB0aGUgcFR4Y29udGV4dC4KKwkJLy8JMi4gQW4gaW50ZXJydXB0IGJyZWFrIG91ciByb3V0aW5lIGFuZCBoYW5kbGUgYnVsay1vdXQgY29tcGxldGUuCisJCS8vCTMuIEluIHRoZSBidWxrLW91dCBjb21wbGxldGUsIGl0IG5lZWQgdG8gZG8gYW5vdGhlciBidWxrLW91dCwKKwkJLy8JCQlpZiB0aGUgRU5leHRCdWxrT3V0UG9zaXRpb24gaXMganVzdCB0aGUgc2FtZSBhcyBDdXJXcml0ZVBvc2l0aW9uLCBpdCB3aWxsIHNhdmUgdGhlIGZpcnN0IDggYnl0ZXMgZnJvbSBDdXJXcml0ZVBvc2l0aW9uLAorCQkvLwkJCWJ1dCB0aGUgcGF5bG9hZCBzdGlsbCBub3QgY29weWVkLiB0aGUgcFR4Q29udGV4dC0+U2F2ZWRQYWRbXSB3aWxsIHNhdmUgYXMgYWxsemVyby4gYW5kIHNldCB0aGUgYkNvcHlQYWQgPSBUUlVFLgorCQkvLwk0LiBJbnRlcnJ1cHQgY29tcGxldGUuCisJCS8vICA1LiBPdXIgaW50ZXJydXB0ZWQgcm91dGluZSBnbyBiYWNrIGFuZCBmaWxsIHRoZSBmaXJzdCA4IGJ5dGVzIHRvIHBUeENvbnRleHQuCisJCS8vCTYuIE5leHQgdGltZSB3aGVuIGRvIGJ1bGstb3V0LCBpdCBmb3VuZCB0aGUgYkNvcHlQYWQ9PVRSVUUgYW5kIHdpbGwgY29weSB0aGUgU2F2ZWRQYWRbXSB0byBwVHhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uLgorCQkvLwkJYW5kIHRoZSBwYWNrZXQgd2lsbCB3cm9uZy4KKwkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgKz0gKFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZHJMZW4pOworCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKKworCQlOZGlzTW92ZU1lbW9yeShwV2lyZWxlc3NQYWNrZXQsIHBUeEJsay0+cFNyY0J1ZkRhdGEsIHBUeEJsay0+U3JjQnVmTGVuKTsKKwkJcFdpcmVsZXNzUGFja2V0ICs9IHBUeEJsay0+U3JjQnVmTGVuOworCQlOZGlzWmVyb01lbW9yeShwV2lyZWxlc3NQYWNrZXQsIHBhZGRpbmcgKyA4KTsKKworCQlSVE1QX0lSUV9MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7CisKKwkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICs9IHBUeEJsay0+UHJpdjsKKwkJaWYgKGJUeFFMYXN0Um91bmQpCisJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPSA4OworCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcyA9IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbjsKKworCXBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPSBGQUxTRTsKKwl9CisKKworCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOworCisKKwkvLyBzdWNjZWVkIGFuZCByZWxlYXNlIHRoZSBza2IgYnVmZmVyCisJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisKKwlyZXR1cm4oU3RhdHVzKTsKKworfQorCisKK1VTSE9SVCBSdG1wVVNCX1dyaXRlTXVsdGlUeFJlc291cmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGssCisJSU4JVUNIQVIJCQlmcmFtZU51bSwKKwlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpCit7CisJSFRfVFhfQ09OVEVYVAkqcEhUVFhDb250ZXh0OworCVVTSE9SVAkJCWh3SGRyTGVuOwkvLyBUaGUgaHdIZHJMZW4gY29uc2lzdCBvZiA4MDIuMTEgaGVhZGVyIGxlbmd0aCBwbHVzIHRoZSBoZWFkZXIgcGFkZGluZyBsZW5ndGguCisJVUlOVDMyCQkJZmlsbE9mZnNldDsKKwlUWElORk9fU1RSVUMJKnBUeEluZm87CisJVFhXSV9TVFJVQwkJKnBUeFdJOworCVBVQ0hBUgkJCXBXaXJlbGVzc1BhY2tldCA9IE5VTEw7CisJVUNIQVIJCQlRdWVJZHg7CisJTkRJU19TVEFUVVMJCVN0YXR1czsKKwl1bnNpZ25lZCBsb25nCUlycUZsYWdzOworCS8vVUlOVDMyCQkJVVNCRE1BcGt0TGVuID0gMCwgRE1BSGRyTGVuLCBwYWRkaW5nOworCisJLy8KKwkvLyBnZXQgVHggUmluZyBSZXNvdXJjZSAmIERtYSBCdWZmZXIgYWRkcmVzcworCS8vCisJUXVlSWR4ID0gcFR4QmxrLT5RdWVJZHg7CisJcEhUVFhDb250ZXh0ICA9ICZwQWQtPlR4Q29udGV4dFtRdWVJZHhdOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOworCisJaWYoZnJhbWVOdW0gPT0gMCkKKwl7CisJCS8vIENoZWNrIGlmIHdlIGhhdmUgZW5vdWdoIHNwYWNlIGZvciB0aGlzIGJ1bGstb3V0IGJhdGNoLgorCQlTdGF0dXMgPSBSdG1wVVNCQ2FuRG9Xcml0ZShwQWQsIFF1ZUlkeCwgcEhUVFhDb250ZXh0KTsKKwkJaWYgKFN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQlwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID0gVFJVRTsKKworCQkJcFR4SW5mbyA9IChQVFhJTkZPX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbMF0pOworCQkJcFR4V0k9IChQVFhXSV9TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSk7CisKKworCQkJLy8gUmVzZXJ2ZSBzcGFjZSBmb3IgOCBieXRlcyBwYWRkaW5nLgorCQkJaWYgKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID09IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikpCisJCQl7CisKKwkJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKz0gODsKKwkJCQlwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uICs9IDg7CisJCQl9CisJCQlmaWxsT2Zmc2V0ID0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uOworCQkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb247CisKKwkJCXBXaXJlbGVzc1BhY2tldCA9ICZwSFRUWENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtmaWxsT2Zmc2V0XTsKKworCQkJLy8KKwkJCS8vIENvcHkgVFhJTkZPICsgVFhXSSArIFdMQU4gSGVhZGVyICsgTExDIGludG8gRE1BIEhlYWRlciBCdWZmZXIKKwkJCS8vCisJCQlpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVNEVV9GUkFNRSkKKwkJCQkvL2h3SGRyTGVuID0gUk9VTkRfVVAocFR4QmxrLT5NcGR1SGVhZGVyTGVuLUxFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQsIDQpK0xFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQ7CisJCQkJaHdIZHJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4tTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCArIHBUeEJsay0+SGRyUGFkTGVuICsgTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRDsKKwkJCWVsc2UgaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfUkFMSU5LX0ZSQU1FKQorCQkJCS8vaHdIZHJMZW4gPSBST1VORF9VUChwVHhCbGstPk1wZHVIZWFkZXJMZW4tTEVOR1RIX0FSQUxJTktfSEVBREVSX0ZJRUxELCA0KStMRU5HVEhfQVJBTElOS19IRUFERVJfRklFTEQ7CisJCQkJaHdIZHJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4tTEVOR1RIX0FSQUxJTktfSEVBREVSX0ZJRUxEICsgcFR4QmxrLT5IZHJQYWRMZW4gKyBMRU5HVEhfQVJBTElOS19IRUFERVJfRklFTEQ7CisJCQllbHNlCisJCQkJLy9od0hkckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbiwgNCk7CisJCQkJaHdIZHJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPkhkclBhZExlbjsKKworCQkJLy8gVXBkYXRlIHRoZSBwVHhCbGstPlByaXYuCisJCQlwVHhCbGstPlByaXYgPSBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGRyTGVuOworCisJCQkvLwlwVHhJbmZvLT5VU0JETUFwa3RMZW4gbm93IGp1c3QgYSB0ZW1wIHZhbHVlIGFuZCB3aWxsIHRvIGNvcnJlY3QgbGF0dGVyLgorCQkJUlRNUFdyaXRlVHhJbmZvKHBBZCwgcFR4SW5mbywgKFVTSE9SVCkocFR4QmxrLT5Qcml2KSwgRkFMU0UsIEZJRk9fRURDQSwgRkFMU0UgLypOZXh0VmFsaWQqLywgIEZBTFNFKTsKKworCQkJLy8gQ29weSBpdC4KKwkJCU5kaXNNb3ZlTWVtb3J5KHBXaXJlbGVzc1BhY2tldCwgcFR4QmxrLT5IZWFkZXJCdWYsIHBUeEJsay0+UHJpdik7CisjaWZkZWYgUlRfQklHX0VORElBTgorCQkJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUikocFdpcmVsZXNzUGFja2V0KyBUWElORk9fU0laRSArIFRYV0lfU0laRSksIERJUl9XUklURSwgRkFMU0UpOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKwkJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zICs9IHBUeEJsay0+UHJpdjsKKwkJCXBXaXJlbGVzc1BhY2tldCArPSBwVHhCbGstPlByaXY7CisJCX0KKwl9CisJZWxzZQorCXsJLy8gRm9yIHN1Yi1zZXF1ZW50IGZyYW1lcyBvZiB0aGlzIGJ1bGstb3V0IGJhdGNoLiBKdXN0IGNvcHkgaXQgdG8gb3VyIGJ1bGstb3V0IGJ1ZmZlci4KKworCQlTdGF0dXMgPSAoKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gVFJVRSkgPyBORElTX1NUQVRVU19TVUNDRVNTIDogTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJeworCQkJZmlsbE9mZnNldCA9ICAocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICsgcFR4QmxrLT5Qcml2KTsKKwkJCXBXaXJlbGVzc1BhY2tldCA9ICZwSFRUWENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtmaWxsT2Zmc2V0XTsKKworCQkJLy9od0hkckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBXaXJlbGVzc1BhY2tldCwgcFR4QmxrLT5IZWFkZXJCdWYsIHBUeEJsay0+TXBkdUhlYWRlckxlbik7CisJCQlwV2lyZWxlc3NQYWNrZXQgKz0gKHBUeEJsay0+TXBkdUhlYWRlckxlbik7CisJCQlwVHhCbGstPlByaXYgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuOworCQl9CisJCWVsc2UKKwkJewkvLyBJdCBzaG91bGQgbm90IGhhcHBlbmVkIG5vdyB1bmxlc3Mgd2UgYXJlIGdvaW5nIHRvIHNodXRkb3duLgorCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiV3JpdGVNdWx0aVR4UmVzb3VyY2UoKTpiQ3VyV3JpdGluZyBpcyBGQUxTRSB3aGVuIGhhbmRsZSBzdWItc2VxdWVudCBmcmFtZXMuXG4iKSk7CisJCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCQl9CisJfQorCisKKwkvLyBXZSB1bmxvY2sgaXQgaGVyZSB0byBwcmV2ZW50IHRoZSBmaXJzdCA4IGJ5dGVzIG1heWJlIG92ZXItd3JpdGUgaXNzdWUuCisJLy8JMS4gRmlyc3Qgd2UgZ290IEN1cldyaXRlUG9zaXRpb24gYnV0IHRoZSBmaXJzdCA4IGJ5dGVzIHN0aWxsIG5vdCB3cml0ZSB0byB0aGUgcFR4Q29udGV4dC4KKwkvLwkyLiBBbiBpbnRlcnJ1cHQgYnJlYWsgb3VyIHJvdXRpbmUgYW5kIGhhbmRsZSBidWxrLW91dCBjb21wbGV0ZS4KKwkvLwkzLiBJbiB0aGUgYnVsay1vdXQgY29tcGxsZXRlLCBpdCBuZWVkIHRvIGRvIGFub3RoZXIgYnVsay1vdXQsCisJLy8JCQlpZiB0aGUgRU5leHRCdWxrT3V0UG9zaXRpb24gaXMganVzdCB0aGUgc2FtZSBhcyBDdXJXcml0ZVBvc2l0aW9uLCBpdCB3aWxsIHNhdmUgdGhlIGZpcnN0IDggYnl0ZXMgZnJvbSBDdXJXcml0ZVBvc2l0aW9uLAorCS8vCQkJYnV0IHRoZSBwYXlsb2FkIHN0aWxsIG5vdCBjb3B5ZWQuIHRoZSBwVHhDb250ZXh0LT5TYXZlZFBhZFtdIHdpbGwgc2F2ZSBhcyBhbGx6ZXJvLiBhbmQgc2V0IHRoZSBiQ29weVBhZCA9IFRSVUUuCisJLy8JNC4gSW50ZXJydXB0IGNvbXBsZXRlLgorCS8vICA1LiBPdXIgaW50ZXJydXB0ZWQgcm91dGluZSBnbyBiYWNrIGFuZCBmaWxsIHRoZSBmaXJzdCA4IGJ5dGVzIHRvIHBUeENvbnRleHQuCisJLy8JNi4gTmV4dCB0aW1lIHdoZW4gZG8gYnVsay1vdXQsIGl0IGZvdW5kIHRoZSBiQ29weVBhZD09VFJVRSBhbmQgd2lsbCBjb3B5IHRoZSBTYXZlZFBhZFtdIHRvIHBUeENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24uCisJLy8JCWFuZCB0aGUgcGFja2V0IHdpbGwgd3JvbmcuCisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7CisKKwlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIldyaXRlTXVsdGlUeFJlc291cmNlOiBDV1BvcyA9ICVsZCwgTkJPdXRQb3MgPSAlbGQuXG4iLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sIHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbikpOworCQlnb3RvIGRvbmU7CisJfQorCisJLy8gQ29weSB0aGUgZnJhbWUgY29udGVudCBpbnRvIERNQSBidWZmZXIgYW5kIHVwZGF0ZSB0aGUgcFR4QmxrLT5Qcml2CisJTmRpc01vdmVNZW1vcnkocFdpcmVsZXNzUGFja2V0LCBwVHhCbGstPnBTcmNCdWZEYXRhLCBwVHhCbGstPlNyY0J1Zkxlbik7CisJcFdpcmVsZXNzUGFja2V0ICs9IHBUeEJsay0+U3JjQnVmTGVuOworCXBUeEJsay0+UHJpdiArPSBwVHhCbGstPlNyY0J1ZkxlbjsKKworZG9uZToKKwkvLyBSZWxlYXNlIHRoZSBza2IgYnVmZmVyIGhlcmUKKwlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKworCXJldHVybihTdGF0dXMpOworCit9CisKKworVk9JRCBSdG1wVVNCX0ZpbmFsV3JpdGVUeFJlc291cmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGssCisJSU4JVVNIT1JUCQkJdG90YWxNUERVU2l6ZSwKKwlJTglVU0hPUlQJCQlUeElkeCkKK3sKKwlVQ0hBUgkJCVF1ZUlkeDsKKwlIVF9UWF9DT05URVhUCSpwSFRUWENvbnRleHQ7CisJVUlOVDMyCQkJZmlsbE9mZnNldDsKKwlUWElORk9fU1RSVUMJKnBUeEluZm87CisJVFhXSV9TVFJVQwkJKnBUeFdJOworCVVJTlQzMgkJCVVTQkRNQXBrdExlbiwgcGFkZGluZzsKKwl1bnNpZ25lZCBsb25nCUlycUZsYWdzOworCVBVQ0hBUgkJCXBXaXJlbGVzc1BhY2tldDsKKworCVF1ZUlkeCA9IHBUeEJsay0+UXVlSWR4OworCXBIVFRYQ29udGV4dCAgPSAmcEFkLT5UeENvbnRleHRbUXVlSWR4XTsKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKKworCWlmIChwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID09IFRSVUUpCisJeworCQlmaWxsT2Zmc2V0ID0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uOworCQlpZiAoKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID09IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikgfHwgKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uLTgpID09IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikpCisJCQkmJiAocEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQgPT0gVFJVRSkpCisJCQlwV2lyZWxlc3NQYWNrZXQgPSAoUFVDSEFSKSgmcEhUVFhDb250ZXh0LT5TYXZlZFBhZFswXSk7CisJCWVsc2UKKwkJCXBXaXJlbGVzc1BhY2tldCA9IChQVUNIQVIpKCZwSFRUWENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtmaWxsT2Zmc2V0XSk7CisKKwkJLy8KKwkJLy8gVXBkYXRlIFR4SW5mby0+VVNCRE1BcGt0TGVuICwKKwkJLy8JCXRoZSBsZW5ndGggPSBUWFdJX1NJWkUgKyA4MDIuMTFfaGRyICsgODAyLjExX2hkcl9wYWQgKyBwYXlsb2FkX29mX2FsbF9iYXRjaF9mcmFtZXMgKyBCdWxrLU91dC1wYWRkaW5nCisJCS8vCisJCXBUeEluZm8gPSAoUFRYSU5GT19TVFJVQykocFdpcmVsZXNzUGFja2V0KTsKKworCQkvLyBDYWxjdWxhdGUgdGhlIGJ1bGstb3V0IHBhZGRpbmcKKwkJVVNCRE1BcGt0TGVuID0gcFR4QmxrLT5Qcml2IC0gVFhJTkZPX1NJWkU7CisJCXBhZGRpbmcgPSAoNCAtIChVU0JETUFwa3RMZW4gJSA0KSkgJiAweDAzOwkvLyByb3VuZCB1cCB0byA0IGJ5dGUgYWxpZ25tZW50CisJCVVTQkRNQXBrdExlbiArPSBwYWRkaW5nOworCisJCXBUeEluZm8tPlVTQkRNQVR4UGt0TGVuID0gVVNCRE1BcGt0TGVuOworCisJCS8vCisJCS8vIFVwZGF0ZSBUWFdJLT5NUERVdG90YWxCeXRlQ291bnQgLAorCQkvLwkJdGhlIGxlbmd0aCA9IDgwMi4xMSBoZWFkZXIgKyBwYXlsb2FkX29mX2FsbF9iYXRjaF9mcmFtZXMKKwkJcFR4V0k9IChQVFhXSV9TVFJVQykocFdpcmVsZXNzUGFja2V0ICsgVFhJTkZPX1NJWkUpOworCQlwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID0gdG90YWxNUERVU2l6ZTsKKworCQkvLworCQkvLyBVcGRhdGUgdGhlIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbgorCQkvLworCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKz0gKFRYSU5GT19TSVpFICsgVVNCRE1BcGt0TGVuKTsKKwkJaWYgKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyAzOTA2KT4gTUFYX1RYQlVMS19MSU1JVCkKKwkJewkvLyBBZGQgMzkwNiBmb3IgcHJldmVudCB0aGUgTmV4dEJ1bGtPdXQgcGFja2V0IHNpemUgaXMgYSBBLVJBTElOSy9BLU1TRFUgRnJhbWUuCisJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPSA4OworCQkJcFR4SW5mby0+U3dVc2VMYXN0Um91bmQgPSAxOworCQl9CisJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zID0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uOworCisKKwkJLy8KKwkJLy8JWmVybyB0aGUgbGFzdCBwYWRkaW5nLgorCQkvLworCQlwV2lyZWxlc3NQYWNrZXQgPSAoJnBIVFRYQ29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0W2ZpbGxPZmZzZXQgKyBwVHhCbGstPlByaXZdKTsKKwkJTmRpc1plcm9NZW1vcnkocFdpcmVsZXNzUGFja2V0LCBwYWRkaW5nICsgOCk7CisKKwkJLy8gRmluYWxseSwgc2V0IGJDdXJXcml0aW5nIGFzIEZBTFNFCisJCXBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPSBGQUxTRTsKKworCX0KKwllbHNlCisJewkvLyBJdCBzaG91bGQgbm90IGhhcHBlbmVkIG5vdyB1bmxlc3Mgd2UgYXJlIGdvaW5nIHRvIHNodXRkb3duLgorCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJGaW5hbFdyaXRlVHhSZXNvdXJjZSgpOmJDdXJXcml0aW5nIGlzIEZBTFNFIHdoZW4gaGFuZGxlIGxhc3QgZnJhbWVzLlxuIikpOworCX0KKworCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOworCit9CisKKworVk9JRCBSdG1wVVNCRGF0YUxhc3RUeElkeCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCVF1ZUlkeCwKKwlJTglVU0hPUlQJCQlUeElkeCkKK3sKKwkvLyBETyBub3RoaW5nIGZvciBVU0IuCit9CisKKworLyoKKwlXaGVuIGNhbiBkbyBidWxrLW91dDoKKwkJMS4gVHhTd0ZyZWVJZHggPCBUWF9SSU5HX1NJWkU7CisJCQlJdCBtZWFucyBoYXMgYXQgbGVhc3Qgb25lIFJpbmcgZW50aXR5IGlzIHJlYWR5IGZvciBidWxrLW91dCwga2ljayBpdCBvdXQuCisJCTIuIElmIFR4U3dGcmVlSWR4ID09IFRYX1JJTkdfU0laRQorCQkJQ2hlY2sgaWYgdGhlIEN1cldyaXRpbmcgZmxhZyBpcyBGQUxTRSwgaWYgaXQncyBGQUxTRSwgd2UgY2FuIGRvIGtpY2sgb3V0LgorCisqLworVk9JRCBSdG1wVVNCRGF0YUtpY2tPdXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaywKKwlJTglVQ0hBUgkJCVF1ZUlkeCkKK3sKKwlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCBRdWVJZHgpKTsKKwlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisKK30KKworCisvKgorCU11c3QgYmUgcnVuIGluIEludGVycnVwdCBjb250ZXh0CisJVGhpcyBmdW5jdGlvbiBoYW5kbGUgUlQyODcwIHNwZWNpZmljIFR4RGVzYyBhbmQgY3B1IGluZGV4IHVwZGF0ZSBhbmQga2ljayB0aGUgcGFja2V0IG91dC4KKyAqLworaW50IFJ0bXBVU0JNZ210S2lja091dCgKKwlJTiBSVE1QX0FEQVBURVIgCSpwQWQsCisJSU4gVUNIQVIgCQkJUXVlSWR4LAorCUlOIFBORElTX1BBQ0tFVAkJcFBhY2tldCwKKwlJTiBQVUNIQVIJCQlwU3JjQnVmVkEsCisJSU4gVUlOVCAJCQlTcmNCdWZMZW4pCit7CisJUFRYSU5GT19TVFJVQwlwVHhJbmZvOworCVVMT05HCQkJQnVsa091dFNpemU7CisJVUNIQVIJCQlwYWRMZW47CisJUFVDSEFSCQkJcERlc3Q7CisJVUxPTkcJCQlTd0lkeCA9IHBBZC0+TWdtdFJpbmcuVHhDcHVJZHg7CisJUFRYX0NPTlRFWFQJCXBNTE1FQ29udGV4dCA9IChQVFhfQ09OVEVYVClwQWQtPk1nbXRSaW5nLkNlbGxbU3dJZHhdLkFsbG9jVmE7CisJdW5zaWduZWQgbG9uZwlJcnFGbGFnczsKKworCisJcFR4SW5mbyA9IChQVFhJTkZPX1NUUlVDKShwU3JjQnVmVkEpOworCisJLy8gQnVpbGQgb3VyIFVSQiBmb3IgVVNCRAorCUJ1bGtPdXRTaXplID0gU3JjQnVmTGVuOworCUJ1bGtPdXRTaXplID0gKEJ1bGtPdXRTaXplICsgMykgJiAofjMpOworCVJUTVBXcml0ZVR4SW5mbyhwQWQsIHBUeEluZm8sIChVU0hPUlQpKEJ1bGtPdXRTaXplIC0gVFhJTkZPX1NJWkUpLCBUUlVFLCBFcFRvUXVldWVbTUdNVFBJUEVJRFhdLCBGQUxTRSwgIEZBTFNFKTsKKworCUJ1bGtPdXRTaXplICs9IDQ7IC8vIEFsd2F5cyBhZGQgNCBleHRyYSBieXRlcyBhdCBldmVyeSBwYWNrZXQuCisKKwkvLyBJZiBCdWxrT3V0U2l6ZSBpcyBtdWx0aXBsZSBvZiBCdWxrT3V0TWF4UGFja2V0U2l6ZSwgYWRkIGV4dHJhIDQgYnl0ZXMgYWdhaW4uCisJaWYgKChCdWxrT3V0U2l6ZSAlIHBBZC0+QnVsa091dE1heFBhY2tldFNpemUpID09IDApCisJCUJ1bGtPdXRTaXplICs9IDQ7CisKKwlwYWRMZW4gPSBCdWxrT3V0U2l6ZSAtIFNyY0J1ZkxlbjsKKwlBU1NFUlQoKHBhZExlbiA8PSBSVE1QX1BLVF9UQUlMX1BBRERJTkcpKTsKKworCS8vIE5vdyBtZW16ZXJvIGFsbCBleHRyYSBwYWRkaW5nIGJ5dGVzLgorCXBEZXN0ID0gKFBVQ0hBUikocFNyY0J1ZlZBICsgU3JjQnVmTGVuKTsKKwlza2JfcHV0KEdFVF9PU19QS1RfVFlQRShwUGFja2V0KSwgcGFkTGVuKTsKKwlOZGlzWmVyb01lbW9yeShwRGVzdCwgcGFkTGVuKTsKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+TUxNRUJ1bGtPdXRMb2NrLCBJcnFGbGFncyk7CisKKwlwQWQtPk1nbXRSaW5nLkNlbGxbcEFkLT5NZ210UmluZy5UeENwdUlkeF0ucE5kaXNQYWNrZXQgPSBwUGFja2V0OworCXBNTE1FQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIgPSAoUFRYX0JVRkZFUikoR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpKTsKKworCS8vIExlbmd0aCBpbiBUeEluZm8gc2hvdWxkIGJlIDggbGVzcyB0aGFuIGJ1bGtvdXQgc2l6ZS4KKwlwTUxNRUNvbnRleHQtPkJ1bGtPdXRTaXplID0gQnVsa091dFNpemU7CisJcE1MTUVDb250ZXh0LT5JblVzZSA9IFRSVUU7CisJcE1MTUVDb250ZXh0LT5iV2FpdGluZ0J1bGtPdXQgPSBUUlVFOworCisKKwkvL2ZvciBkZWJ1ZworCS8vaGV4X2R1bXAoIlJ0bXBVU0JNZ210S2lja091dCIsICZwTUxNRUNvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFswXSwgKHBNTE1FQ29udGV4dC0+QnVsa091dFNpemUgPiAxNiA/IDE2IDogcE1MTUVDb250ZXh0LT5CdWxrT3V0U2l6ZSkpOworCisJLy9wQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7CisJLy9wQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RG9uZUNvdW50Kys7CisKKwkvL2lmIChwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ID09IE1HTVRfUklOR19TSVpFKQorCS8vCW5lZWRLaWNrT3V0ID0gVFJVRTsKKworCS8vIERlY3JlYXNlIHRoZSBUeFN3RnJlZUlkeCBhbmQgSW5jcmVhc2UgdGhlIFRYX0NUWF9JRFgKKwlwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4LS07CisJSU5DX1JJTkdfSU5ERVgocEFkLT5NZ210UmluZy5UeENwdUlkeCwgTUdNVF9SSU5HX1NJWkUpOworCisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPk1MTUVCdWxrT3V0TG9jaywgSXJxRmxhZ3MpOworCisJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9NTE1FKTsKKwkvL2lmIChuZWVkS2lja091dCkKKwlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisKKwlyZXR1cm4gMDsKK30KKworCitWT0lEIFJ0bXBVU0JOdWxsRnJhbWVLaWNrT3V0KAorCUlOIFJUTVBfQURBUFRFUiAqcEFkLAorCUlOIFVDSEFSCQlRdWVJZHgsCisJSU4gVUNIQVIJCSpwTnVsbEZyYW1lLAorCUlOIFVJTlQzMgkJZnJhbWVMZW4pCit7CisJaWYgKHBBZC0+TnVsbENvbnRleHQuSW5Vc2UgPT0gRkFMU0UpCisJeworCQlQVFhfQ09OVEVYVAkJcE51bGxDb250ZXh0OworCQlQVFhJTkZPX1NUUlVDCXBUeEluZm87CisJCVBUWFdJX1NUUlVDCQlwVHhXSTsKKwkJUFVDSEFSCQkJcFdpcmVsZXNzUGt0OworCisJCXBOdWxsQ29udGV4dCA9ICYocEFkLT5OdWxsQ29udGV4dCk7CisKKwkJLy8gU2V0IHRoZSBpbiB1c2UgYml0CisJCXBOdWxsQ29udGV4dC0+SW5Vc2UgPSBUUlVFOworCQlwV2lyZWxlc3NQa3QgPSAoUFVDSEFSKSZwTnVsbENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFswXTsKKworCQlSVE1QWmVyb01lbW9yeSgmcFdpcmVsZXNzUGt0WzBdLCAxMDApOworCQlwVHhJbmZvID0gKFBUWElORk9fU1RSVUMpJnBXaXJlbGVzc1BrdFswXTsKKwkJUlRNUFdyaXRlVHhJbmZvKHBBZCwgcFR4SW5mbywgKFVTSE9SVCkoc2l6ZW9mKEhFQURFUl84MDJfMTEpK1RYV0lfU0laRSksIFRSVUUsIEVwVG9RdWV1ZVtNR01UUElQRUlEWF0sIEZBTFNFLCAgRkFMU0UpOworCQlwVHhJbmZvLT5RU0VMID0gRklGT19FRENBOworCQlwVHhXSSA9IChQVFhXSV9TVFJVQykmcFdpcmVsZXNzUGt0W1RYSU5GT19TSVpFXTsKKwkJUlRNUFdyaXRlVHhXSShwQWQsIHBUeFdJLCAgRkFMU0UsIEZBTFNFLCBGQUxTRSwgRkFMU0UsIFRSVUUsIEZBTFNFLCAwLCBCU1NJRF9XQ0lELCAoc2l6ZW9mKEhFQURFUl84MDJfMTEpKSwKKwkJCTAsIDAsIChVQ0hBUilwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTLCBJRlNfSFRUWE9QLCBGQUxTRSwgJnBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdCk7CisjaWZkZWYgUlRfQklHX0VORElBTgorCQlSVE1QV0lFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhXSSwgVFlQRV9UWFdJKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisKKwkJUlRNUE1vdmVNZW1vcnkoJnBXaXJlbGVzc1BrdFtUWFdJX1NJWkUrVFhJTkZPX1NJWkVdLCAmcEFkLT5OdWxsRnJhbWUsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisjaWZkZWYgUlRfQklHX0VORElBTgorCQlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKSZwV2lyZWxlc3NQa3RbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdLCBESVJfV1JJVEUsIEZBTFNFKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisJCXBBZC0+TnVsbENvbnRleHQuQnVsa091dFNpemUgPSAgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBzaXplb2YocEFkLT5OdWxsRnJhbWUpICsgNDsKKworCQkvLyBGaWxsIG91dCBmcmFtZSBsZW5ndGggaW5mb3JtYXRpb24gZm9yIGdsb2JhbCBCdWxrIG91dCBhcmJpdG9yCisJCS8vcE51bGxDb250ZXh0LT5CdWxrT3V0U2l6ZSA9IFRyYW5zZmVyQnVmZmVyTGVuZ3RoOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gc2VuZCBOVUxMIEZyYW1lIEAlZCBNYnBzLi4uXG4iLCBSYXRlSWRUb01icHNbcEFkLT5Db21tb25DZmcuVHhSYXRlXSkpOworCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTlVMTCk7CisKKwkJLy8gS2ljayBidWxrIG91dAorCQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisJfQorCit9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDaGVjayBSeCBkZXNjcmlwdG9yLCByZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRSBpZiBhbnkgZXJyb3IgZG91bmQKKworCUFyZ3VtZW50czoKKwkJcFJ4RAkJUG9pbnRlcgl0byB0aGUgUnggZGVzY3JpcHRvcgorCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NUQVRVU19TVUNDRVNTCQlObyBlcnIKKwkJTkRJU19TVEFUVVNfRkFJTFVSRQkJRXJyb3IKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUwlSVE1QQ2hlY2tSeEVycm9yKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBIRUFERVJfODAyXzExCXBIZWFkZXIsCisJSU4JUFJYV0lfU1RSVUMJcFJ4V0ksCisJSU4JUFJUMjhYWF9SWERfU1RSVUMJcFJ4SU5GTykKK3sKKwlQQ0lQSEVSX0tFWSBwV3BhS2V5OworCUlOVAlkQm07CisKKwlpZiAocEFkLT5iUHJvbWlzY3VvdXMgPT0gVFJVRSkKKwkJcmV0dXJuKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCWlmKHBSeElORk8gPT0gTlVMTCkKKwkJcmV0dXJuKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCisJLy8gUGh5IGVycm9ycyAmIENSQyBlcnJvcnMKKwlpZiAocFJ4SU5GTy0+Q3JjKQorCXsKKwkJLy8gQ2hlY2sgUlNTSSBmb3IgTm9pc2UgSGlzdCBzdGF0aXN0aWMgY29sbGVjdGlvbi4KKwkJZEJtID0gKElOVCkgKHBSeFdJLT5SU1NJMCkgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhOworCQlpZiAoZEJtIDw9IC04NykKKwkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbMF0gKz0gMTsKKwkJZWxzZSBpZiAoZEJtIDw9IC04MikKKwkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbMV0gKz0gMTsKKwkJZWxzZSBpZiAoZEJtIDw9IC03NykKKwkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbMl0gKz0gMTsKKwkJZWxzZSBpZiAoZEJtIDw9IC03MikKKwkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbM10gKz0gMTsKKwkJZWxzZSBpZiAoZEJtIDw9IC02NykKKwkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbNF0gKz0gMTsKKwkJZWxzZSBpZiAoZEJtIDw9IC02MikKKwkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbNV0gKz0gMTsKKwkJZWxzZSBpZiAoZEJtIDw9IC01NykKKwkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbNl0gKz0gMTsKKwkJZWxzZSBpZiAoZEJtID4gLTU3KQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVs3XSArPSAxOworCisJCXJldHVybihORElTX1NUQVRVU19GQUlMVVJFKTsKKwl9CisKKwkvLyBBZGQgUnggc2l6ZSB0byBjaGFubmVsIGxvYWQgY291bnRlciwgd2Ugc2hvdWxkIGlnbm9yZSBlcnJvciBjb3VudHMKKwlwQWQtPlN0YUNmZy5DTEJ1c3lCeXRlcyArPSAocFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCsgMTQpOworCisJLy8gRHJvcCBUb0RzIHByb21pc2NvdXMgZnJhbWUsIGl0IGlzIG9wZW5lZCBkdWUgdG8gQ0NYIDIgY2hhbm5lbCBsb2FkIHN0YXRpc3RpY3MKKwlpZiAocEhlYWRlci0+RkMuVG9EcykKKwl7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJFcnI7RkMuVG9Ec1xuIikpOworCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKwkvLyBQYXVsIDA0LTAzIGZvciBPRkRNIFJ4IGxlbmd0aCBpc3N1ZQorCWlmIChwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID4gTUFYX0FHR1JFR0FUSU9OX1NJWkUpCisJeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgicmVjZWl2ZWQgcGFja2V0IHRvbyBsb25nXG4iKSk7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworCS8vIERyb3Agbm90IFUyTSBmcmFtZXMsIGNhbnQncyBkcm9wIGhlcmUgYmVjYXVzZSB3ZSB3aWxsIGRyb3AgYmVhY29uIGluIHRoaXMgY2FzZQorCS8vIEkgYW0ga2luZCBvZiBkb3VidGluZyB0aGUgVTJNIGJpdCBvcGVyYXRpb24KKwkvLyBpZiAocFJ4RC0+VTJNID09IDApCisJLy8JcmV0dXJuKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCisJLy8gZHJvcCBkZWN5cHRpb24gZmFpbCBmcmFtZQorCWlmIChwUnhJTkZPLT5EZWNyeXB0ZWQgJiYgcFJ4SU5GTy0+Q2lwaGVyRXJyKQorCXsKKworCQkvLworCQkvLyBNSUMgRXJyb3IKKwkJLy8KKwkJaWYgKChwUnhJTkZPLT5DaXBoZXJFcnIgPT0gMikgJiYgcFJ4SU5GTy0+TXlCc3MpCisJCXsKKwkJCXBXcGFLZXkgPSAmcEFkLT5TaGFyZWRLZXlbQlNTMF1bcFJ4V0ktPktleUluZGV4XTsKKwkJCVJUTVBSZXBvcnRNaWNFcnJvcihwQWQsIHBXcGFLZXkpOworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiUnggTUlDIFZhbHVlIGVycm9yXG4iKSk7CisJCX0KKworCQlpZiAocFJ4SU5GTy0+RGVjcnlwdGVkICYmCisJCQkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcFJ4V0ktPktleUluZGV4XS5DaXBoZXJBbGcgPT0gQ0lQSEVSX0FFUykgJiYKKwkJCShwSGVhZGVyLT5TZXF1ZW5jZSA9PSBwQWQtPkZyYWdGcmFtZS5TZXF1ZW5jZSkpCisJCXsKKwkJCS8vCisJCQkvLyBBY2NlcHRhYmxlIHNpbmNlIHRoZSBGaXJzdCBGcmFnRnJhbWUgbm8gQ2lwaGVyRXJyIHByb2JsZW0uCisJCQkvLworCQkJcmV0dXJuKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQl9CisKKwkJcmV0dXJuKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKworCXJldHVybihORElTX1NUQVRVU19TVUNDRVNTKTsKK30KKworVk9JRCBSVDI4eHhVc2JTdGFBc2ljRm9yY2VXYWtldXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gQk9PTEVBTiAgICAgICBiRnJvbVR4KQoreworICAgIEFVVE9fV0FLRVVQX1NUUlVDCUF1dG9XYWtldXBDZmc7CisKKwlBdXRvV2FrZXVwQ2ZnLndvcmQgPSAwOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKKworCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMSwgMHhmZiwgMHgwMCwgMHgwMCk7CisKKwlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKK30KKworVk9JRCBSVDI4eHhVc2JTdGFBc2ljU2xlZXBUaGVuQXV0b1dha2V1cCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQgVGJ0dE51bVRvTmV4dFdha2VVcCkKK3sKKwlBVVRPX1dBS0VVUF9TVFJVQwlBdXRvV2FrZXVwQ2ZnOworCisJLy8gd2UgaGF2ZSBkZWNpZGVkIHRvIFNMRUVQLCBzbyBhdCBsZWFzdCBkbyBpdCBmb3IgYSBCRUFDT04gcGVyaW9kLgorCWlmIChUYnR0TnVtVG9OZXh0V2FrZVVwID09IDApCisJCVRidHROdW1Ub05leHRXYWtlVXAgPSAxOworCisJQXV0b1dha2V1cENmZy53b3JkID0gMDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7CisKKwlBdXRvV2FrZXVwQ2ZnLmZpZWxkLk51bW9mU2xlZXBpbmdUYnR0ID0gVGJ0dE51bVRvTmV4dFdha2VVcCAtIDE7CisJQXV0b1dha2V1cENmZy5maWVsZC5FbmFibGVBdXRvV2FrZXVwID0gMTsKKwlBdXRvV2FrZXVwQ2ZnLmZpZWxkLkF1dG9MZWFkVGltZSA9IDU7CisJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOworCisJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMwLCAweGZmLCAweGZmLCAweDAyKTsgICAvLyBzZW5kIFBPV0VSLVNBVkUgY29tbWFuZCB0byBNQ1UuIFRpbWVvdXQgNDB1cy4KKworCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKKworfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCitWT0lEIFJUMjh4eFVzYk1sbWVSYWRpb09uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlQyOHh4VXNiTWxtZVJhZGlvT24oKVxuIikpOworCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkKKwkJcmV0dXJuOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisgICAgCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMSwgMHhmZiwgMHgwMCwgMHgwMCk7CisJCVJUTVB1c2VjRGVsYXkoMTAwMDApOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlOSUNSZXNldEZyb21FcnJvcihwQWQpOworCisJLy8gRW5hYmxlIFR4L1J4CisJUlRNUEVuYWJsZVJ4VHgocEFkKTsKKworCS8vIENsZWFyIFJhZGlvIG9mZiBmbGFnCisJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJUlRVU0JCdWxrUmVjZWl2ZShwQWQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8gU2V0IExFRAorCVJUTVBTZXRMRUQocEFkLCBMRURfUkFESU9fT04pOworfQorCitWT0lEIFJUMjh4eFVzYk1sbWVSYWRpb09GRigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlXUERNQV9HTE9fQ0ZHX1NUUlVDCUdsb0NmZzsKKwlVSU5UMzIJVmFsdWUsIGk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUMjh4eFVzYk1sbWVSYWRpb09GRigpXG4iKSk7CisKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpCisJCXJldHVybjsKKworCS8vIFNldCBMRUQKKwlSVE1QU2V0TEVEKHBBZCwgTEVEX1JBRElPX09GRik7CisJLy8gU2V0IFJhZGlvIG9mZiBmbGFnCisJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQkvLyBMaW5rIGRvd24gZmlyc3QgaWYgYW55IGFzc29jaWF0aW9uIGV4aXN0cworCQlpZiAoSU5GUkFfT04ocEFkKSB8fCBBREhPQ19PTihwQWQpKQorCQkJTGlua0Rvd24ocEFkLCBGQUxTRSk7CisJCVJUTVB1c2VjRGVsYXkoMTAwMDApOworCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCS8vIENsZWFuIHVwIG9sZCBic3MgdGFibGUKKwkJQnNzVGFibGVJbml0KCZwQWQtPlNjYW5UYWIpOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisJLy8gRGlzYWJsZSBNQUMgVHgvUngKKwlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwlWYWx1ZSAmPSAoMHhmZmZmZmZmMyk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKwkvLyBNQUNfU1lTX0NUUkwgPT4gdmFsdWUgPSAweDAgPT4gNDBtQQorCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMCk7CisKKwkvLyBQV1JfUElOX0NGRyA9PiB2YWx1ZSA9IDB4MCA9PiA0MG1BCisJUlRNUF9JT19XUklURTMyKHBBZCwgUFdSX1BJTl9DRkcsIDApOworCisJLy8gVFhfUElOX0NGRyA9PiB2YWx1ZSA9IDB4MCA9PiAyMG1BCisJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUElOX0NGRywgMCk7CisKKwlpZiAocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzQwKQorCXsKKwkJLy8gTXVzdCB1c2luZyA0ME1Iei4KKwkJQXNpY1R1cm5PZmZSRkNsayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKwl9CisJZWxzZQorCXsKKwkJLy8gTXVzdCB1c2luZyAyME1Iei4KKwkJQXNpY1R1cm5PZmZSRkNsayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCX0KKworCS8vIFdhaXRpbmcgZm9yIERNQSBpZGxlCisJaSA9IDA7CisJZG8KKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsKKwkJaWYgKChHbG9DZmcuZmllbGQuVHhETUFCdXN5ID09IDApICYmIChHbG9DZmcuZmllbGQuUnhETUFCdXN5ID09IDApKQorCQkJYnJlYWs7CisKKwkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKwl9d2hpbGUgKGkrKyA8IDEwMCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzAsIDB4ZmYsIDB4ZmYsIDB4MDIpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1faW5mby5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX2luZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2ExYjFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX2luZm8uYwpAQCAtMCwwICsxLDM3MTIgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCitJTlQJU2hvd19TU0lEX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19XaXJlbGVzc01vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X1R4QnVyc3RfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X1R4UHJlYW1ibGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X1R4UG93ZXJfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0NoYW5uZWxfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0JHUHJvdGVjdGlvbl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfUlRTVGhyZXNob2xkX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19GcmFnVGhyZXNob2xkX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitJTlQJU2hvd19IdEJ3X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19IdE1jc19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfSHRHaV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfSHRPcE1vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0h0RXh0Y2hhX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19IdE1wZHVEZW5zaXR5X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19IdEJhV2luU2l6ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfSHRSZGdfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0h0QW1zZHVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0h0QXV0b0JhX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitJTlQJU2hvd19Db3VudHJ5UmVnaW9uX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19Db3VudHJ5UmVnaW9uQUJhbmRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK0lOVAlTaG93X0NvdW50cnlDb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCisjaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAorSU5UCVNob3dfUGt0QWdncmVnYXRlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworI2VuZGlmIC8vIEFHR1JFR0FUSU9OX1NVUFBPUlQgLy8KKworI2lmZGVmIFdNTV9TVVBQT1JUCitJTlQJU2hvd19XbW1DYXBhYmxlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworI2VuZGlmIC8vIFdNTV9TVVBQT1JUIC8vCisKK0lOVAlTaG93X0lFRUU4MDIxMUhfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK0lOVAlTaG93X05ldHdvcmtUeXBlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCitJTlQJU2hvd19BdXRoTW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfRW5jcnlwVHlwZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKTsKKworSU5UCVNob3dfRGVmYXVsdEtleUlEX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19LZXkxX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19LZXkyX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19LZXkzX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19LZXk0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpOworCitJTlQJU2hvd19XUEFQU0tfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1Zik7CisKK3N0YXRpYyBzdHJ1Y3QgeworCUNIQVIgKm5hbWU7CisJSU5UICgqc2hvd19wcm9jKShQUlRNUF9BREFQVEVSIHBBZGFwdGVyLCBQVUNIQVIgYXJnKTsKK30gKlBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MsIFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQ1tdID0geworCXsiU1NJRCIsCQkJCQlTaG93X1NTSURfUHJvY30sCisJeyJXaXJlbGVzc01vZGUiLAkJCVNob3dfV2lyZWxlc3NNb2RlX1Byb2N9LAorCXsiVHhCdXJzdCIsCQkJCQlTaG93X1R4QnVyc3RfUHJvY30sCisJeyJUeFByZWFtYmxlIiwJCQkJU2hvd19UeFByZWFtYmxlX1Byb2N9LAorCXsiVHhQb3dlciIsCQkJCQlTaG93X1R4UG93ZXJfUHJvY30sCisJeyJDaGFubmVsIiwJCQkJCVNob3dfQ2hhbm5lbF9Qcm9jfSwKKwl7IkJHUHJvdGVjdGlvbiIsCQkJU2hvd19CR1Byb3RlY3Rpb25fUHJvY30sCisJeyJSVFNUaHJlc2hvbGQiLAkJCVNob3dfUlRTVGhyZXNob2xkX1Byb2N9LAorCXsiRnJhZ1RocmVzaG9sZCIsCQkJU2hvd19GcmFnVGhyZXNob2xkX1Byb2N9LAorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCXsiSHRCdyIsCQkJCQlTaG93X0h0QndfUHJvY30sCisJeyJIdE1jcyIsCQkJCQlTaG93X0h0TWNzX1Byb2N9LAorCXsiSHRHaSIsCQkJCQlTaG93X0h0R2lfUHJvY30sCisJeyJIdE9wTW9kZSIsCQkJCVNob3dfSHRPcE1vZGVfUHJvY30sCisJeyJIdEV4dGNoYSIsCQkJCVNob3dfSHRFeHRjaGFfUHJvY30sCisJeyJIdE1wZHVEZW5zaXR5IiwJCQlTaG93X0h0TXBkdURlbnNpdHlfUHJvY30sCisJeyJIdEJhV2luU2l6ZSIsCQkgICAgICAgIFNob3dfSHRCYVdpblNpemVfUHJvY30sCisJeyJIdFJkZyIsCQkgICAgICAgIAlTaG93X0h0UmRnX1Byb2N9LAorCXsiSHRBbXNkdSIsCQkgICAgICAgIAlTaG93X0h0QW1zZHVfUHJvY30sCisJeyJIdEF1dG9CYSIsCQkgICAgICAgIFNob3dfSHRBdXRvQmFfUHJvY30sCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJeyJDb3VudHJ5UmVnaW9uIiwJCQlTaG93X0NvdW50cnlSZWdpb25fUHJvY30sCisJeyJDb3VudHJ5UmVnaW9uQUJhbmQiLAkJU2hvd19Db3VudHJ5UmVnaW9uQUJhbmRfUHJvY30sCisJeyJDb3VudHJ5Q29kZSIsCQkJCVNob3dfQ291bnRyeUNvZGVfUHJvY30sCisjaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAorCXsiUGt0QWdncmVnYXRlIiwJCQlTaG93X1BrdEFnZ3JlZ2F0ZV9Qcm9jfSwKKyNlbmRpZgorCisjaWZkZWYgV01NX1NVUFBPUlQKKwl7IldtbUNhcGFibGUiLAkJCQlTaG93X1dtbUNhcGFibGVfUHJvY30sCisjZW5kaWYKKwl7IklFRUU4MDIxMUgiLAkJCQlTaG93X0lFRUU4MDIxMUhfUHJvY30sCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisgICAgeyJOZXR3b3JrVHlwZSIsCQkJCVNob3dfTmV0d29ya1R5cGVfUHJvY30sCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJeyJBdXRoTW9kZSIsCQkJCVNob3dfQXV0aE1vZGVfUHJvY30sCisJeyJFbmNyeXBUeXBlIiwJCQkJU2hvd19FbmNyeXBUeXBlX1Byb2N9LAorCXsiRGVmYXVsdEtleUlEIiwJCQlTaG93X0RlZmF1bHRLZXlJRF9Qcm9jfSwKKwl7IktleTEiLAkJCQkJU2hvd19LZXkxX1Byb2N9LAorCXsiS2V5MiIsCQkJCQlTaG93X0tleTJfUHJvY30sCisJeyJLZXkzIiwJCQkJCVNob3dfS2V5M19Qcm9jfSwKKwl7IktleTQiLAkJCQkJU2hvd19LZXk0X1Byb2N9LAorCXsiV1BBUFNLIiwJCQkJCVNob3dfV1BBUFNLX1Byb2N9LAorCXtOVUxMLCBOVUxMfQorfTsKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBHZXQgRHJpdmVyIHZlcnNpb24uCisKKyAgICBSZXR1cm46CisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0RyaXZlclZlcnNpb25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEcml2ZXIgdmVyc2lvbi0lc1xuIiwgU1RBX0RSSVZFUl9WRVJTSU9OKSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQ291bnRyeSBSZWdpb24uCisgICAgICAgIFRoaXMgY29tbWFuZCB3aWxsIG5vdCB3b3JrLCBpZiB0aGUgZmllbGQgb2YgQ291bnRyeVJlZ2lvbiBpbiBlZXByb20gaXMgcHJvZ3JhbW1lZC4KKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfQ291bnRyeVJlZ2lvbl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyByZWdpb247CisKKwlyZWdpb24gPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCXJldHVybiAtRU9QTk9UU1VQUDsKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisKKwkvLyBDb3VudHJ5IGNhbiBiZSBzZXQgb25seSB3aGVuIEVFUFJPTSBub3QgcHJvZ3JhbW1lZAorCWlmIChwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uICYgMHg4MCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9Db3VudHJ5UmVnaW9uX1Byb2M6OnBhcmFtZXRlciBvZiBDb3VudHJ5UmVnaW9uIGluIGVlcHJvbSBpcyBwcm9ncmFtbWVkIFxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYoKHJlZ2lvbiA+PSAwKSAmJiAocmVnaW9uIDw9IFJFR0lPTl9NQVhJTVVNX0JHX0JBTkQpKQorCXsKKwkJcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiA9IChVQ0hBUikgcmVnaW9uOworCX0KKwllbHNlIGlmIChyZWdpb24gPT0gUkVHSU9OXzMxX0JHX0JBTkQpCisJeworCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uID0gKFVDSEFSKSByZWdpb247CisJfQorCWVsc2UKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9Db3VudHJ5UmVnaW9uX1Byb2M6OnBhcmFtZXRlcnMgb3V0IG9mIHJhbmdlXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkvLyBpZiBzZXQgY291bnRyeSByZWdpb24sIGRyaXZlciBuZWVkcyB0byBiZSByZXNldAorCUJ1aWxkQ2hhbm5lbExpc3QocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9Db3VudHJ5UmVnaW9uX1Byb2M6OihDb3VudHJ5UmVnaW9uPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbikpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IENvdW50cnkgUmVnaW9uIGZvciBBIGJhbmQuCisgICAgICAgIFRoaXMgY29tbWFuZCB3aWxsIG5vdCB3b3JrLCBpZiB0aGUgZmllbGQgb2YgQ291bnRyeVJlZ2lvbiBpbiBlZXByb20gaXMgcHJvZ3JhbW1lZC4KKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIHJlZ2lvbjsKKworCXJlZ2lvbiA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJcmV0dXJuIC1FT1BOT1RTVVBQOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKworCS8vIENvdW50cnkgY2FuIGJlIHNldCBvbmx5IHdoZW4gRUVQUk9NIG5vdCBwcm9ncmFtbWVkCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCAmIDB4ODApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2M6OnBhcmFtZXRlciBvZiBDb3VudHJ5UmVnaW9uIGluIGVlcHJvbSBpcyBwcm9ncmFtbWVkIFxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYoKHJlZ2lvbiA+PSAwKSAmJiAocmVnaW9uIDw9IFJFR0lPTl9NQVhJTVVNX0FfQkFORCkpCisJeworCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQgPSAoVUNIQVIpIHJlZ2lvbjsKKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0NvdW50cnlSZWdpb25BQmFuZF9Qcm9jOjpwYXJhbWV0ZXJzIG91dCBvZiByYW5nZVxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLy8gaWYgc2V0IGNvdW50cnkgcmVnaW9uLCBkcml2ZXIgbmVlZHMgdG8gYmUgcmVzZXQKKwlCdWlsZENoYW5uZWxMaXN0KHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2M6OihDb3VudHJ5UmVnaW9uPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV2lyZWxlc3MgTW9kZQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9XaXJlbGVzc01vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcJV2lyZWxlc3NNb2RlOworCUlOVAkJc3VjY2VzcyA9IFRSVUU7CisKKwlXaXJlbGVzc01vZGUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJSU5UIE1heFBoeU1vZGUgPSBQSFlfMTFHOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCU1heFBoeU1vZGUgPSBQSFlfMTFOXzVHOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCWlmIChXaXJlbGVzc01vZGUgPD0gTWF4UGh5TW9kZSkKKwkJeworCQkJUlRNUFNldFBoeU1vZGUocEFkLCBXaXJlbGVzc01vZGUpOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJaWYgKFdpcmVsZXNzTW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQorCQkJeworCQkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBUUlVFOworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBUUlVFOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBGQUxTRTsKKwkJCQlwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gRkFMU0U7CisJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkvLyBTZXQgQWRob2NNb2RlIHJhdGVzCisJCQlpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCisJCQl7CisJCQkJTWxtZVVwZGF0ZVR4UmF0ZXMocEFkLCBGQUxTRSwgMCk7CisJCQkJTWFrZUlic3NCZWFjb24ocEFkKTsgICAgICAgICAgIC8vIHJlLWJ1aWxkIEJFQUNPTiBmcmFtZQorCQkJCUFzaWNFbmFibGVJYnNzU3luYyhwQWQpOyAgICAgICAvLyBjb3B5IHRvIG9uLWNoaXAgbWVtb3J5CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlzdWNjZXNzID0gRkFMU0U7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLyBpdCBpcyBuZWVkZWQgdG8gc2V0IFNTSUQgdG8gdGFrZSBlZmZlY3QKKwlpZiAoc3VjY2VzcyA9PSBUUlVFKQorCXsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJU2V0Q29tbW9uSFQocEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1dpcmVsZXNzTW9kZV9Qcm9jOjooPSVsZClcbiIsIFdpcmVsZXNzTW9kZSkpOworCX0KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfV2lyZWxlc3NNb2RlX1Byb2M6OnBhcmFtZXRlcnMgb3V0IG9mIHJhbmdlXG4iKSk7CisJfQorCisJcmV0dXJuIHN1Y2Nlc3M7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IENoYW5uZWwKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQ2hhbm5lbF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKyAJSU5UCQlzdWNjZXNzID0gVFJVRTsKKwlVQ0hBUglDaGFubmVsOworCisJQ2hhbm5lbCA9IChVQ0hBUikgc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCS8vIGNoZWNrIGlmIHRoaXMgY2hhbm5lbCBpcyB2YWxpZAorCWlmIChDaGFubmVsU2FuaXR5KHBBZCwgQ2hhbm5lbCkgPT0gVFJVRSkKKwl7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSBDaGFubmVsOworCisJCQlpZiAoTU9OSVRPUl9PTihwQWQpKQorCQkJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCU5fQ2hhbm5lbENoZWNrKHBBZCk7CisJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCAmJgorCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDApCisJCQkJeworCQkJCQlOX1NldENlbkNoKHBBZCk7CisJCQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKKwkJCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCV180MCwgY29udHJvbF9jaGFubmVsKCVkKSwgQ2VudHJhbENoYW5uZWwoJWQpIFxuIiwKKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpKTsKKwkJCQl9CisJCQkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCXsKKwkJCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCV18yMCwgQ2hhbm5lbCglZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJCQl9CisJCQl9CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJc3VjY2VzcyA9IFRSVUU7CisJfQorCWVsc2UKKwl7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCXN1Y2Nlc3MgPSBGQUxTRTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl9CisKKworCWlmIChzdWNjZXNzID09IFRSVUUpCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9DaGFubmVsX1Byb2M6OihDaGFubmVsPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCisJcmV0dXJuIHN1Y2Nlc3M7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFNob3J0IFNsb3QgVGltZSBFbmFibGUgb3IgRGlzYWJsZQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9TaG9ydFNsb3RfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgU2hvcnRTbG90OworCisJU2hvcnRTbG90ID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChTaG9ydFNsb3QgPT0gMSkKKwkJcEFkLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUgPSBUUlVFOworCWVsc2UgaWYgKFNob3J0U2xvdCA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSA9IEZBTFNFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfU2hvcnRTbG90X1Byb2M6OihTaG9ydFNsb3Q9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFR4IHBvd2VyCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X1R4UG93ZXJfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgVHhQb3dlcjsKKwlJTlQgICBzdWNjZXNzID0gRkFMU0U7CisKKwlUeFBvd2VyID0gKFVMT05HKSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCWlmIChUeFBvd2VyIDw9IDEwMCkKKwl7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQgPSBUeFBvd2VyOworCQkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdDsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQlzdWNjZXNzID0gVFJVRTsKKwl9CisJZWxzZQorCQlzdWNjZXNzID0gRkFMU0U7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfVHhQb3dlcl9Qcm9jOjooVHhQb3dlclBlcmNlbnRhZ2U9JWxkKVxuIiwgcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UpKTsKKworCXJldHVybiBzdWNjZXNzOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCAxMUIvMTFHIFByb3RlY3Rpb24KKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQkdQcm90ZWN0aW9uX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCXN3aXRjaCAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSkKKwl7CisJCWNhc2UgMDogLy9BVVRPCisJCQlwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSAwOworCQkJYnJlYWs7CisJCWNhc2UgMTogLy9BbHdheXMgT24KKwkJCXBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAyOiAvL0Fsd2F5cyBPRkYKKwkJCXBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9IDI7CisJCQlicmVhazsKKwkJZGVmYXVsdDogIC8vSW52YWxpZCBhcmd1bWVudAorCQkJcmV0dXJuIEZBTFNFOworCX0KKworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0JHUHJvdGVjdGlvbl9Qcm9jOjooQkdQcm90ZWN0aW9uPSVsZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbikpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFR4UHJlYW1ibGUKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfVHhQcmVhbWJsZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlSVF84MDJfMTFfUFJFQU1CTEUJUHJlYW1ibGU7CisKKwlQcmVhbWJsZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKworCXN3aXRjaCAoUHJlYW1ibGUpCisJeworCQljYXNlIFJ0ODAyXzExUHJlYW1ibGVTaG9ydDoKKwkJCXBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPSBQcmVhbWJsZTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJTWxtZVNldFR4UHJlYW1ibGUocEFkLCBSdDgwMl8xMVByZWFtYmxlU2hvcnQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJYnJlYWs7CisJCWNhc2UgUnQ4MDJfMTFQcmVhbWJsZUxvbmc6CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCWNhc2UgUnQ4MDJfMTFQcmVhbWJsZUF1dG86CisJCQkvLyBpZiB1c2VyIHdhbnRzIEFVVE8sIGluaXRpYWxpemUgdG8gTE9ORyBoZXJlLCB0aGVuIGNoYW5nZSBhY2NvcmRpbmcgdG8gQVAncworCQkJLy8gY2FwYWJpbGl0eSB1cG9uIGFzc29jaWF0aW9uLgorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFByZWFtYmxlOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQlNbG1lU2V0VHhQcmVhbWJsZShwQWQsIFJ0ODAyXzExUHJlYW1ibGVMb25nKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCWJyZWFrOworCQlkZWZhdWx0OiAvL0ludmFsaWQgYXJndW1lbnQKKwkJCXJldHVybiBGQUxTRTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfVHhQcmVhbWJsZV9Qcm9jOjooVHhQcmVhbWJsZT0lbGQpXG4iLCBwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgUlRTIFRocmVzaG9sZAorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9SVFNUaHJlc2hvbGRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJIE5ESVNfODAyXzExX1JUU19USFJFU0hPTEQgICAgICAgICAgIFJ0c1RocmVzaDsKKworCVJ0c1RocmVzaCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZigoUnRzVGhyZXNoID4gMCkgJiYgKFJ0c1RocmVzaCA8PSBNQVhfUlRTX1RIUkVTSE9MRCkpCisJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCAgPSAoVVNIT1JUKVJ0c1RocmVzaDsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwllbHNlIGlmIChSdHNUaHJlc2ggPT0gMCkKKwkJcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkID0gTUFYX1JUU19USFJFU0hPTEQ7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1JUU1RocmVzaG9sZF9Qcm9jOjooUlRTVGhyZXNob2xkPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgRnJhZ21lbnQgVGhyZXNob2xkCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0ZyYWdUaHJlc2hvbGRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJIE5ESVNfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEICAgICBGcmFnVGhyZXNoOworCisJRnJhZ1RocmVzaCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoRnJhZ1RocmVzaCA+IE1BWF9GUkFHX1RIUkVTSE9MRCB8fCBGcmFnVGhyZXNoIDwgTUlOX0ZSQUdfVEhSRVNIT0xEKQorCXsKKwkJLy9JbGxlZ2FsIEZyYWdUaHJlc2ggc28gd2Ugc2V0IGl0IHRvIGRlZmF1bHQKKwkJcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSBNQVhfRlJBR19USFJFU0hPTEQ7CisJfQorCWVsc2UgaWYgKEZyYWdUaHJlc2ggJSAyID09IDEpCisJeworCQkvLyBUaGUgbGVuZ3RoIG9mIGVhY2ggZnJhZ21lbnQgc2hhbGwgYWx3YXlzIGJlIGFuIGV2ZW4gbnVtYmVyIG9mIG9jdGV0cywgZXhjZXB0IGZvciB0aGUgbGFzdCBmcmFnbWVudAorCQkvLyBvZiBhbiBNU0RVIG9yIE1NUERVLCB3aGljaCBtYXkgYmUgZWl0aGVyIGFuIGV2ZW4gb3IgYW4gb2RkIG51bWJlciBvZiBvY3RldHMuCisJCXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gKFVTSE9SVCkoRnJhZ1RocmVzaCAtIDEpOworCX0KKwllbHNlCisJeworCQlwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IChVU0hPUlQpRnJhZ1RocmVzaDsKKwl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID09IE1BWF9GUkFHX1RIUkVTSE9MRCkKKwkJCXBBZC0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBUUlVFOworCQllbHNlCisJCQlwQWQtPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID0gRkFMU0U7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0ZyYWdUaHJlc2hvbGRfUHJvYzo6KEZyYWdUaHJlc2hvbGQ9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFR4QnVyc3QKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfVHhCdXJzdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBUeEJ1cnN0OworCisJVHhCdXJzdCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJaWYgKFR4QnVyc3QgPT0gMSkKKwkJcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBUUlVFOworCWVsc2UgaWYgKFR4QnVyc3QgPT0gMCkKKwkJcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBGQUxTRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1R4QnVyc3RfUHJvYzo6KFR4QnVyc3Q9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKyNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBUeEJ1cnN0CisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X1BrdEFnZ3JlZ2F0ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBhZ2dyZTsKKworCWFnZ3JlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChhZ2dyZSA9PSAxKQorCQlwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID0gVFJVRTsKKwllbHNlIGlmIChhZ2dyZSA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID0gRkFMU0U7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKKworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1BrdEFnZ3JlZ2F0ZV9Qcm9jOjooQUdHUkU9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZgorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBJRUVFODAyMTFILgorICAgICAgICBUaGlzIHBhcmFtZXRlciBpcyAxIHdoZW4gbmVlZHMgcmFkYXIgZGV0ZWN0aW9uLCBvdGhlcndpc2UgMAorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9JRUVFODAyMTFIX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworICAgIFVMT05HIGllZWU4MDIxMWg7CisKKwlpZWVlODAyMTFoID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChpZWVlODAyMTFoID09IDEpCisJCXBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID0gVFJVRTsKKwllbHNlIGlmIChpZWVlODAyMTFoID09IDApCisJCXBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID0gRkFMU0U7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9JRUVFODAyMTFIX1Byb2M6OihJRUVFODAyMTFIPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUgpKTsKKworCXJldHVybiBUUlVFOworfQorCisKKyNpZmRlZiBEQkcKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgRm9yIERlYnVnIGluZm9ybWF0aW9uCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0RlYnVnX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBTZXRfRGVidWdfUHJvYyAqKioqKioqKioqKioqKioqKioqXG4iKSk7CisKKyAgICBpZihzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApIDw9IFJUX0RFQlVHX0xPVUQpCisgICAgICAgIFJURGVidWdMZXZlbCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gU2V0X0RlYnVnX1Byb2MoUlREZWJ1Z0xldmVsID0gJWxkKVxuIiwgUlREZWJ1Z0xldmVsKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZgorCitJTlQJU2hvd19EZXNjSW5mb19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFJlc2V0IHN0YXRpc3RpY3MgY291bnRlcgorCisgICAgQXJndW1lbnRzOgorICAgICAgICBwQWRhcHRlciAgICAgICAgICAgIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKyAgICAgICAgYXJnCisKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfUmVzZXRTdGF0Q291bnRlcl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwkvL1VDSEFSICAgICAgICAgICBpOworCS8vTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT5TZXRfUmVzZXRTdGF0Q291bnRlcl9Qcm9jXG4iKSk7CisKKwkvLyBhZGQgdGhlIG1vc3QgdXAtdG8tZGF0ZSBoL3cgcmF3IGNvdW50ZXJzIGludG8gc29mdHdhcmUgY291bnRlcnMKKwlOSUNVcGRhdGVSYXdDb3VudGVycyhwQWQpOworCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+V2xhbkNvdW50ZXJzLCBzaXplb2YoQ09VTlRFUl84MDJfMTEpKTsKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5Db3VudGVyczgwMjMsIHNpemVvZihDT1VOVEVSXzgwMl8zKSk7CisJTmRpc1plcm9NZW1vcnkoJnBBZC0+UmFsaW5rQ291bnRlcnMsIHNpemVvZihDT1VOVEVSX1JBTElOSykpOworCisJLy8gUmVzZXQgSG90U3BvdCBjb3VudGVyCisjaWYgMCAvLyBUb0RvLgorCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQorCXsKKwkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV07CisKKwkJaWYgKChwRW50cnktPlZhbGlkID09IEZBTFNFKSB8fCAocEVudHJ5LT5Tc3QgIT0gU1NUX0FTU09DKSkKKwkJCWNvbnRpbnVlOworCisJCXBFbnRyeS0+SFNDb3VudGVyLkxhc3REYXRhUGFja2V0VGltZSA9IDA7CisJCXBFbnRyeS0+SFNDb3VudGVyLlRvdGFsUnhCeXRlQ291bnQ9IDA7CisJCXBFbnRyeS0+SFNDb3VudGVyLlRvdGFsVHhCeXRlQ291bnQ9IDA7CisJfQorI2VuZGlmCisKKworCXJldHVybiBUUlVFOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQWRkIFdQQSBrZXkgcHJvY2Vzcy4KKwkJSW4gQWRob2MgV1BBTk9ORSwgYlBhaXJ3aXNlID0gMDsgIEtleUlkeCA9IDA7CisKKwlBcmd1bWVudHM6CisJCXBBZCAJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcEJ1ZgkJCQkJCQlQb2ludGVyIHRvIHRoZSB3aGVyZSB0aGUga2V5IHN0b3JlZAorCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NVQ0NFU1MJCQkJCUFkZCBrZXkgc3VjY2Vzc2Z1bGx5CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisjaWYgMCAvLyByZW1vdmUgYnkgQWxiZXJ0WQorTkRJU19TVEFUVVMgUlRNUFdQQUFkZEtleVByb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFZPSUQJCQlwQnVmKQoreworCVBORElTXzgwMl8xMV9LRVkJcEtleTsKKwlVTE9ORwkJCQlLZXlJZHg7CisvLwlORElTX1NUQVRVUyAJCVN0YXR1czsKKy8vCVVMT05HIAlvZmZzZXQ7CS8vIHVudXNlZCB2YXJpYWJsZSwgc25vd3BpbiAyMDA2LjA3LjEzCisKKwlQVUNIQVIJCXBUeE1pYywgcFJ4TWljOworCUJPT0xFQU4gCWJUeEtleTsgCQkvLyBTZXQgdGhlIGtleSBhcyB0cmFuc21pdCBrZXkKKwlCT09MRUFOIAliUGFpcndpc2U7CQkvLyBJbmRpY2F0ZSB0aGUga2V5IGlzIHBhaXJ3aXNlIGtleQorCUJPT0xFQU4gCWJLZXlSU0M7CQkvLyBpbmRpY2F0ZSB0aGUgcmVjZWl2ZSAgU0Mgc2V0IGJ5IEtleVJTQyB2YWx1ZS4KKwkJCQkJCQkJLy8gT3RoZXJ3aXNlLCBpdCB3aWxsIHNldCBieSB0aGUgTklDLgorCUJPT0xFQU4gCWJBdXRoZW50aWNhdG9yOyAvLyBpbmRpY2F0ZSBrZXkgaXMgc2V0IGJ5IGF1dGhlbnRpY2F0b3IuCisJVUNIQVIJCWFwaWR4ID0gQlNTMDsKKworCXBLZXkgPSAoUE5ESVNfODAyXzExX0tFWSkgcEJ1ZjsKKwlLZXlJZHggPSBwS2V5LT5LZXlJbmRleCAmIDB4ZmY7CisJLy8gQml0IDMxIG9mIEFkZC1rZXksIFR4IEtleQorCWJUeEtleQkJICAgPSAocEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKSA/IFRSVUUgOiBGQUxTRTsKKwkvLyBCaXQgMzAgb2YgQWRkLWtleSBQYWlyd2lzZUtleQorCWJQYWlyd2lzZQkgICA9IChwS2V5LT5LZXlJbmRleCAmIDB4NDAwMDAwMDApID8gVFJVRSA6IEZBTFNFOworCS8vIEJpdCAyOSBvZiBBZGQta2V5IEtleVJTQworCWJLZXlSU0MgCSAgID0gKHBLZXktPktleUluZGV4ICYgMHgyMDAwMDAwMCkgPyBUUlVFIDogRkFMU0U7CisJLy8gQml0IDI4IG9mIEFkZC1rZXkgQXV0aGVudGljYXRvcgorCWJBdXRoZW50aWNhdG9yID0gKHBLZXktPktleUluZGV4ICYgMHgxMDAwMDAwMCkgPyBUUlVFIDogRkFMU0U7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBXUEFBZGRLZXlQcm9jPT0+cEtleS0+S2V5SW5kZXggPSAleC4gYlBhaXJ3aXNlPSAlZFxuIiwgcEtleS0+S2V5SW5kZXgsIGJQYWlyd2lzZSkpOworCS8vIDEuIENoZWNrIEdyb3VwIC8gUGFpcndpc2UgS2V5CisJaWYgKGJQYWlyd2lzZSkJLy8gUGFpcndpc2UgS2V5CisJeworCQkvLyAxLiBLZXlJZHggbXVzdCBiZSAwLCBvdGhlcndpc2UsIHJldHVybiBORElTX1NUQVRVU19JTlZBTElEX0RBVEEKKwkJaWYgKEtleUlkeCAhPSAwKQorCQkJcmV0dXJuKE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQSk7CisKKwkJLy8gMi4gQ2hlY2sgYlR4LCBpdCBtdXN0IGJlIHRydWUsIG90aGVyd2lzZSwgcmV0dXJuIE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQQorCQlpZiAoYlR4S2V5ID09IEZBTFNFKQorCQkJcmV0dXJuKE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQSk7CisKKwkJLy8gMy4gSWYgQlNTSUQgaXMgYWxsIDB4ZmYsIHJldHVybiBORElTX1NUQVRVU19JTlZBTElEX0RBVEEKKwkJaWYgKE1BQ19BRERSX0VRVUFMKHBLZXktPkJTU0lELCBCUk9BRENBU1RfQUREUikpCisJCQlyZXR1cm4oTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBKTsKKworCQkvLyAzLjEgQ2hlY2sgUGFpcndpc2Uga2V5IGxlbmd0aCBmb3IgVEtJUCBrZXkuIEZvciBBRVMsIGl0J3MgYWx3YXlzIDEyOCBiaXRzCisJCS8vaWYgKChwQWRhcHRlci0+UG9ydENmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgJiYgKHBLZXktPktleUxlbmd0aCAhPSBMRU5fVEtJUF9LRVkpKQorCQlpZiAoKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgJiYgKHBLZXktPktleUxlbmd0aCAhPSBMRU5fVEtJUF9LRVkpKQorCQkJcmV0dXJuKE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQSk7CisKKwkJcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uVHlwZSA9IFBBSVJXSVNFX0tFWTsKKworCQlpZiAocEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCisJCXsKKwkJCS8vIFNlbmQgbWVkaWEgc3BlY2lmaWMgZXZlbnQgdG8gc3RhcnQgUE1LSUQgY2FjaGluZworCQkJUlRNUEluZGljYXRlV1BBMlN0YXR1cyhwQWQpOworCQl9CisJfQorCWVsc2UKKwl7CisJCS8vIDEuIENoZWNrIEJTU0lELCBpZiBub3QgY3VycmVudCBCU1NJRCBvciBCY2FzdCwgcmV0dXJuIE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQQorCQlpZiAoKCEgTUFDX0FERFJfRVFVQUwocEtleS0+QlNTSUQsIEJST0FEQ0FTVF9BRERSKSkgJiYKKwkJCSghIE1BQ19BRERSX0VRVUFMKHBLZXktPkJTU0lELCBwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uQnNzaWQpKSkKKwkJCXJldHVybihORElTX1NUQVRVU19JTlZBTElEX0RBVEEpOworCisJCS8vIDIuIENoZWNrIEtleSBpbmRleCBmb3Igc3VwcG9ydGVkIEdyb3VwIEtleQorCQlpZiAoS2V5SWR4ID49IEdST1VQX0tFWV9OVU0pCisJCQlyZXR1cm4oTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBKTsKKworCQkvLyAzLiBTZXQgYXMgZGVmYXVsdCBUeCBLZXkgaWYgYlR4S2V5IGlzIFRSVUUKKwkJaWYgKGJUeEtleSA9PSBUUlVFKQorCQkJcEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLkRlZmF1bHRLZXlJZCA9IChVQ0hBUikgS2V5SWR4OworCisJCXBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLlR5cGUgPSBHUk9VUF9LRVk7CisJfQorCisJLy8gNC4gU2VsZWN0IFJ4TWljIC8gVHhNaWMgYmFzZWQgb24gU3VwcCAvIEF1dGhlbnRpY2F0b3IKKwlpZiAocEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisJeworCQkvLyBmb3IgV1BBLU5vbmUgVHgsIFJ4IE1JQyBpcyB0aGUgc2FtZQorCQlwVHhNaWMgPSAoUFVDSEFSKSAoJnBLZXktPktleU1hdGVyaWFsKSArIDE2OworCQlwUnhNaWMgPSBwVHhNaWM7CisJfQorCWVsc2UgaWYgKGJBdXRoZW50aWNhdG9yID09IFRSVUUpCisJeworCQlwVHhNaWMgPSAoUFVDSEFSKSAoJnBLZXktPktleU1hdGVyaWFsKSArIDE2OworCQlwUnhNaWMgPSAoUFVDSEFSKSAoJnBLZXktPktleU1hdGVyaWFsKSArIDI0OworCX0KKwllbHNlCisJeworCQlwUnhNaWMgPSAoUFVDSEFSKSAoJnBLZXktPktleU1hdGVyaWFsKSArIDE2OworCQlwVHhNaWMgPSAoUFVDSEFSKSAoJnBLZXktPktleU1hdGVyaWFsKSArIDI0OworCX0KKworCS8vIDYuIENoZWNrIFJ4VHNjCisJaWYgKGJLZXlSU0MgPT0gVFJVRSkKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLlJ4VHNjLCAmcEtleS0+S2V5UlNDLCA2KTsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5SeFRzYywgJnBLZXktPktleVJTQywgNik7CisJfQorCWVsc2UKKwl7CisJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLlJ4VHNjLCA2KTsKKwl9CisKKwkvLyA3LiBDb3B5IGluZm9ybWF0aW9uIGludG8gUGFpcndpc2UgS2V5IHN0cnVjdHVyZS4KKwkvLyBwS2V5LT5LZXlMZW5ndGggd2lsbCBpbmNsdWRlIFR4TWljIGFuZCBSeE1pYywgdGhlcmVmb3JlLCB3ZSB1c2UgMTYgYnl0ZXMgaGFyZGNvZGVkLgorCXBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLktleUxlbiA9IChVQ0hBUikgcEtleS0+S2V5TGVuZ3RoOworCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuS2V5TGVuID0gKFVDSEFSKXBLZXktPktleUxlbmd0aDsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleSwgJnBLZXktPktleU1hdGVyaWFsLCAxNik7CisJTmRpc01vdmVNZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5LZXksICZwS2V5LT5LZXlNYXRlcmlhbCwgMTYpOworCWlmIChwS2V5LT5LZXlMZW5ndGggPT0gTEVOX1RLSVBfS0VZKQorCXsKKwkJLy8gT25seSBLZXkgbGVudGggZXF1YWwgdG8gVEtJUCBrZXkgaGF2ZSB0aGVzZQorCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5SeE1pYywgcFJ4TWljLCA4KTsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uVHhNaWMsIHBUeE1pYywgOCk7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuUnhNaWMsIHBSeE1pYywgOCk7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuVHhNaWMsIHBUeE1pYywgOCk7CisJfQorCisJQ09QWV9NQUNfQUREUihwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkJzc0lkLCBwS2V5LT5CU1NJRCk7CisKKwkvLyBJbml0IFR4VHNjIHRvIG9uZSBiYXNlZCBvbiBXaUZpIFdQQSBzcGVjcworCXBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLlR4VHNjWzBdID0gMTsKKwlwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5UeFRzY1sxXSA9IDA7CisJcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uVHhUc2NbMl0gPSAwOworCXBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLlR4VHNjWzNdID0gMDsKKwlwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5UeFRzY1s0XSA9IDA7CisJcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uVHhUc2NbNV0gPSAwOworCS8vIDQuIEluaXQgVHhUc2MgdG8gb25lIGJhc2VkIG9uIFdpRmkgV1BBIHNwZWNzCisJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5UeFRzY1swXSA9IDE7CisJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5UeFRzY1sxXSA9IDA7CisJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5UeFRzY1syXSA9IDA7CisJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5UeFRzY1szXSA9IDA7CisJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5UeFRzY1s0XSA9IDA7CisJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5UeFRzY1s1XSA9IDA7CisKKwlpZiAocEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworCX0KKwllbHNlIGlmIChwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJeworCQlwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKwl9CisJZWxzZSBpZiAocEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKQorCXsKKwkJaWYgKHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLktleUxlbiA9PSA1KQorCQl7CisJCQlwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJfQorCQllbHNlIGlmIChwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5LZXlMZW4gPT0gMTMpCisJCXsKKwkJCXBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisJCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJfQorCisJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSkgIC8vIFBhaXJ3aXNlIEtleS4gQWRkIEJTU0lEIHRvIFdDVGFibGUKKwl7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGc7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuS2V5TGVuID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW47CisJfQorCisJaWYgKChwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwKKwkJKHBBZC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKKwl7CisJCS8vCisJCS8vIE9uIFdQQTIsIFVwZGF0ZSBHcm91cCBLZXkgQ2lwaGVyLgorCQkvLworCQlpZiAoIWJQYWlyd2lzZSkKKwkJeworCQkJaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCQkJcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKwkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJCQkJcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7CisJCX0KKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJwQWQtPlNoYXJlZEtleVslZF1bJWRdLkNpcGhlckFsZyA9ICVkXG4iLCBhcGlkeCwgS2V5SWR4LCBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5DaXBoZXJBbGcpKTsKKworI2lmIDAKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiJXMgS2V5ICMlZCIsIENpcGhlck5hbWVbcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uQ2lwaGVyQWxnXSxLZXlJZHgpKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwl7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIlMDJ4OiIsIHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLktleVtpXSkpOworCX0KKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiXG4JICBSeCBNSUMgS2V5ID0gIikpOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiJTAyeDoiLCBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5SeE1pY1tpXSkpOworCX0KKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiXG4JICBUeCBNSUMgS2V5ID0gIikpOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiJTAyeDoiLCBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5UeE1pY1tpXSkpOworCX0KKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiXG4JICBSeFRTQyA9ICIpKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCXsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiUwMng6IiwgcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uUnhUc2NbaV0pKTsKKwl9CisjZW5kaWYKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiXG4gcEtleS0+IEJTU0lEOiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IFxuIiwKKwkJcEtleS0+QlNTSURbMF0scEtleS0+QlNTSURbMV0scEtleS0+QlNTSURbMl0scEtleS0+QlNTSURbM10scEtleS0+QlNTSURbNF0scEtleS0+QlNTSURbNV0pKTsKKworCWlmICgoYlR4S2V5KSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpICAvLyBQYWlyd2lzZSBLZXkuIEFkZCBCU1NJRCB0byBXQ1RhYmxlCisJCVJUTVBBZGRCU1NJRENpcGhlcihwQWQsIEJTU0lEX1dDSUQsIHBLZXksIHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnKTsKKworCisJLy8gTm8gbWF0dGVyIHBhaXJ3aXNlIGtleSBvciB3aGF0IGxleWlkeCBpcywgYWx3YXlzIGhhcyBhIGNvcHkgYXQgb24tY2hpcCBTaGFyZWRLZXl0YWJsZS4KKwlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAorCQkJCQkJICBhcGlkeCwKKwkJCQkJCSAgKFVDSEFSKUtleUlkeCwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlkeF0uQ2lwaGVyQWxnLAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5LZXksCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLlR4TWljLAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SWR4XS5SeE1pYyk7CisKKwkvLyBUaGUgV0NJRCBrZXkgc3BlY2lmaWVkIGluIHVzZWQgYXQgVHguIEZvciBTVEEsIGFsd2F5cyB1c2UgcGFpcndpc2Uga2V5LgorCisJLy8gYWQtaG9jIG1vZGUgbmVlZCB0byBzcGVjaWZ5IFdBUCBHcm91cCBrZXkgd2l0aCBXQ0lEIGluZGV4PUJTUzBNY2FzdF9XQ0lELiBMZXQncyBhbHdheXMgc2V0IHRoaXMga2V5IGhlcmUuCisvKglpZiAoYlBhaXJ3aXNlID09IEZBTFNFKQorCXsKKwkJb2Zmc2V0ID0gTUFDX0lWRUlWX1RBQkxFX0JBU0UgKyAoQlNTME1jYXN0X1dDSUQgKiBIV19JVkVJVl9FTlRSWV9TSVpFKTsKKwkJTmRpc1plcm9NZW1vcnkoSVZFSVYsIDgpOworCQkvLyAxLiBJVi9FSVYKKwkJLy8gU3BlY2lmeSBrZXkgaW5kZXggdG8gZmluZCBzaGFyZWQga2V5LgorCQlpZiAoKHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnPT1DSVBIRVJfVEtJUCkgfHwKKwkJCShwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZz09Q0lQSEVSX0FFUykpCisJCUlWRUlWWzNdID0gMHgyMDsJCS8vIEVpdiBiaXQgb24uIGtleWlkIGFsd2F5cyAwIGZvciBwYWlyd2lzZSBrZXkKKwkJSVZFSVZbM10gfD0gKEtleUlkeDw8IDYpOwkvLyBncm91cGtleSBpbmRleCBpcyBub3QgMAorCQlmb3IgKGk9MDsgaTw4OyBpKyspCisJCXsKKwkJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0K2ksIElWRUlWW2ldKTsKKwkJfQorCisJCS8vIDIuIFdDSUQgQXR0cmlidXRlIFVERjozLCBCU1NJZHg6MywgQWxnOjMsIEtleXRhYmxlOnVzZSBzaGFyZSBrZXksIEJTU0lkeCBpcyAwCisJCVdDSURBdHRyaSA9IChwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZzw8MSl8UEFJUldJU0VLRVlUQUJMRTsKKwkJb2Zmc2V0ID0gTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgKyAoQlNTME1jYXN0X1dDSUQqIEhXX1dDSURfQVRUUklfU0laRSk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCwgV0NJREF0dHJpKTsKKworCX0KKworKi8KKworICAgaWYgKHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJZHhdLlR5cGUgPT0gR1JPVVBfS0VZKQorCXsKKwkJLy8gODAyLjF4IHBvcnQgY29udHJvbAorCQlwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiEhV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQhIVxuIikpOworCisJfQorCisJcmV0dXJuIChORElTX1NUQVRVU19TVUNDRVNTKTsKK30KKyNlbmRpZgorCitCT09MRUFOIFJUTVBDaGVja1N0clByaW50QWJsZSgKKyAgICBJTiAgQ0hBUiAqcEluUHV0U3RyLAorICAgIElOICBVQ0hBUiBzdHJMZW4pCit7CisgICAgVUNIQVIgaT0wOworCisgICAgZm9yIChpPTA7IGk8c3RyTGVuOyBpKyspCisgICAgeworICAgICAgICBpZiAoKHBJblB1dFN0cltpXSA8IDB4MjEpIHx8CisgICAgICAgICAgICAocEluUHV0U3RyW2ldID4gMHg3RSkpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlSZW1vdmUgV1BBIEtleSBwcm9jZXNzCisKKwlBcmd1bWVudHM6CisJCXBBZCAJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcEJ1ZgkJCQkJCQlQb2ludGVyIHRvIHRoZSB3aGVyZSB0aGUga2V5IHN0b3JlZAorCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NVQ0NFU1MJCQkJCUFkZCBrZXkgc3VjY2Vzc2Z1bGx5CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitWT0lEICAgIFJUTVBTZXREZXNpcmVkUmF0ZXMoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgTE9ORyAgICAgICAgICAgIFJhdGVzKQoreworICAgIE5ESVNfODAyXzExX1JBVEVTIGFyeVJhdGVzOworCisgICAgbWVtc2V0KCZhcnlSYXRlcywgMHgwMCwgc2l6ZW9mKE5ESVNfODAyXzExX1JBVEVTKSk7CisgICAgc3dpdGNoIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUpCisgICAgeworICAgICAgICBjYXNlIFBIWV8xMUE6IC8vIEEgb25seQorICAgICAgICAgICAgc3dpdGNoIChSYXRlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDYwMDAwMDA6IC8vNk0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDBjOyAvLyA2TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgOTAwMDAwMDogLy85TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MTI7IC8vIDlNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxMjAwMDAwMDogLy8xMk0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDE4OyAvLyAxMk0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18yOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE4MDAwMDAwOiAvLzE4TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MjQ7IC8vIDE4TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjQwMDAwMDA6IC8vMjRNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgzMDsgLy8gMjRNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzNjAwMDAwMDogLy8zNk0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDQ4OyAvLyAzNk0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU181OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQ4MDAwMDAwOiAvLzQ4TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4NjA7IC8vIDQ4TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzY7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNTQwMDAwMDA6IC8vNTRNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHg2YzsgLy8gNTRNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAtMTogLy9BdXRvCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDZjOyAvLyA1NE1icHMKKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMV0gPSAweDYwOyAvLyA0OE1icHMKKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMl0gPSAweDQ4OyAvLyAzNk1icHMKKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbM10gPSAweDMwOyAvLyAyNE1icHMKKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbNF0gPSAweDI0OyAvLyAxOE0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbNV0gPSAweDE4OyAvLyAxMk0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbNl0gPSAweDEyOyAvLyA5TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1s3XSA9IDB4MGM7IC8vIDZNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQSFlfMTFCR19NSVhFRDogLy8gQi9HIE1peGVkCisgICAgICAgIGNhc2UgUEhZXzExQjogLy8gQiBvbmx5CisgICAgICAgIGNhc2UgUEhZXzExQUJHX01JWEVEOiAvLyBBL0IvRyBNaXhlZAorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc3dpdGNoIChSYXRlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEwMDAwMDA6IC8vMU0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDAyOworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjAwMDAwMDogLy8yTQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MDQ7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA1MDAwMDAwOiAvLzUuNU0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDBiOyAvLyA1LjVNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxMTAwMDAwMDogLy8xMU0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDE2OyAvLyAxMU0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18zOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDYwMDAwMDA6IC8vNk0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDBjOyAvLyA2TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgOTAwMDAwMDogLy85TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MTI7IC8vIDlNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxMjAwMDAwMDogLy8xMk0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDE4OyAvLyAxMk0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18yOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE4MDAwMDAwOiAvLzE4TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MjQ7IC8vIDE4TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjQwMDAwMDA6IC8vMjRNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgzMDsgLy8gMjRNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzNjAwMDAwMDogLy8zNk0KKyAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDQ4OyAvLyAzNk0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU181OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQ4MDAwMDAwOiAvLzQ4TQorICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4NjA7IC8vIDQ4TQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzY7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNTQwMDAwMDA6IC8vNTRNCisgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHg2YzsgLy8gNTRNCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAtMTogLy9BdXRvCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCKQorICAgICAgICAgICAgICAgICAgICB7IC8vQiBPbmx5CisgICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MTY7IC8vIDExTWJwcworICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMV0gPSAweDBiOyAvLyA1LjVNYnBzCisgICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1syXSA9IDB4MDQ7IC8vIDJNYnBzCisgICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1szXSA9IDB4MDI7IC8vIDFNYnBzCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7IC8vKEIvRykgTWl4ZWQgb3IgKEEvQi9HKSBNaXhlZAorICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDZjOyAvLyA1NE1icHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzFdID0gMHg2MDsgLy8gNDhNYnBzCisgICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1syXSA9IDB4NDg7IC8vIDM2TWJwcworICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbM10gPSAweDMwOyAvLyAyNE1icHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzRdID0gMHgxNjsgLy8gMTFNYnBzCisgICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1s1XSA9IDB4MGI7IC8vIDUuNU1icHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzZdID0gMHgwNDsgLy8gMk1icHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzddID0gMHgwMjsgLy8gMU1icHMKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTX0FVVE87CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlLCAmYXJ5UmF0ZXMsIHNpemVvZihORElTXzgwMl8xMV9SQVRFUykpOworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBSVE1QU2V0RGVzaXJlZFJhdGVzICglMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngpXG4iLAorICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMF0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzFdLAorICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMl0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzNdLAorICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNF0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzVdLAorICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNl0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzddICkpOworICAgIC8vIENoYW5naW5nIERlc2lyZWRSYXRlIG1heSBhZmZlY3QgdGhlIE1BWCBUWCByYXRlIHdlIHVzZWQgdG8gVFggZnJhbWVzIG91dAorICAgIE1sbWVVcGRhdGVUeFJhdGVzKHBBZGFwdGVyLCBGQUxTRSwgMCk7Cit9CisKK05ESVNfU1RBVFVTIFJUTVBXUEFSZW1vdmVLZXlQcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBWT0lECQkJcEJ1ZikKK3sKKwlQTkRJU184MDJfMTFfUkVNT1ZFX0tFWSBwS2V5OworCVVMT05HCQkJCQlLZXlJZHg7CisJTkRJU19TVEFUVVMgCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwlCT09MRUFOIAliVHhLZXk7IAkJLy8gU2V0IHRoZSBrZXkgYXMgdHJhbnNtaXQga2V5CisJQk9PTEVBTiAJYlBhaXJ3aXNlOwkJLy8gSW5kaWNhdGUgdGhlIGtleSBpcyBwYWlyd2lzZSBrZXkKKwlCT09MRUFOIAliS2V5UlNDOwkJLy8gaW5kaWNhdGUgdGhlIHJlY2VpdmUgIFNDIHNldCBieSBLZXlSU0MgdmFsdWUuCisJCQkJCQkJCS8vIE90aGVyd2lzZSwgaXQgd2lsbCBzZXQgYnkgdGhlIE5JQy4KKwlCT09MRUFOIAliQXV0aGVudGljYXRvcjsgLy8gaW5kaWNhdGUga2V5IGlzIHNldCBieSBhdXRoZW50aWNhdG9yLgorCUlOVCAJCWk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIi0tLT4gUlRNUFdQQVJlbW92ZUtleVByb2NcbiIpKTsKKworCXBLZXkgPSAoUE5ESVNfODAyXzExX1JFTU9WRV9LRVkpIHBCdWY7CisJS2V5SWR4ID0gcEtleS0+S2V5SW5kZXggJiAweGZmOworCS8vIEJpdCAzMSBvZiBBZGQta2V5LCBUeCBLZXkKKwliVHhLZXkJCSAgID0gKHBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkgPyBUUlVFIDogRkFMU0U7CisJLy8gQml0IDMwIG9mIEFkZC1rZXkgUGFpcndpc2VLZXkKKwliUGFpcndpc2UJICAgPSAocEtleS0+S2V5SW5kZXggJiAweDQwMDAwMDAwKSA/IFRSVUUgOiBGQUxTRTsKKwkvLyBCaXQgMjkgb2YgQWRkLWtleSBLZXlSU0MKKwliS2V5UlNDIAkgICA9IChwS2V5LT5LZXlJbmRleCAmIDB4MjAwMDAwMDApID8gVFJVRSA6IEZBTFNFOworCS8vIEJpdCAyOCBvZiBBZGQta2V5IEF1dGhlbnRpY2F0b3IKKwliQXV0aGVudGljYXRvciA9IChwS2V5LT5LZXlJbmRleCAmIDB4MTAwMDAwMDApID8gVFJVRSA6IEZBTFNFOworCisJLy8gMS4gSWYgYlR4IGlzIFRSVUUsIHJldHVybiBmYWlsdXJlIGluZm9ybWF0aW9uCisJaWYgKGJUeEtleSA9PSBUUlVFKQorCQlyZXR1cm4oTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBKTsKKworCS8vIDIuIENoZWNrIFBhaXJ3aXNlIEtleQorCWlmIChiUGFpcndpc2UpCisJeworCQkvLyBhLiBJZiBCU1NJRCBpcyBicm9hZGNhc3QsIHJlbW92ZSBhbGwgcGFpcndpc2Uga2V5cy4KKwkJLy8gYi4gSWYgbm90IGJyb2FkY2FzdCwgcmVtb3ZlIHRoZSBwYWlyd2lzZSBzcGVjaWZpZWQgYnkgQlNTSUQKKwkJZm9yIChpID0gMDsgaSA8IFNIQVJFX0tFWV9OVU07IGkrKykKKwkJeworCQkJaWYgKE1BQ19BRERSX0VRVUFMKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkJzc0lkLCBwS2V5LT5CU1NJRCkpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSVE1QV1BBUmVtb3ZlS2V5UHJvYyhLZXlJZHg9JWQpXG4iLCBpKSk7CisJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uS2V5TGVuID0gMDsKKwkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCAoVUNIQVIpaSk7CisJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwkvLyAzLiBHcm91cCBLZXkKKwllbHNlCisJeworCQkvLyBhLiBJZiBCU1NJRCBpcyBicm9hZGNhc3QsIHJlbW92ZSBhbGwgZ3JvdXAga2V5cyBpbmRleGVkCisJCS8vIGIuIElmIEJTU0lEIG1hdGNoZWQsIGRlbGV0ZSB0aGUgZ3JvdXAga2V5IGluZGV4ZWQuCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFdQQVJlbW92ZUtleVByb2MoS2V5SWR4PSVsZClcbiIsIEtleUlkeCkpOworCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9IDA7CisJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJCUFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIChVQ0hBUilLZXlJZHgpOworCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCX0KKworCXJldHVybiAoU3RhdHVzKTsKK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUmVtb3ZlIEFsbCBXUEEgS2V5cworCisJQXJndW1lbnRzOgorCQlwQWQgCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFdQQVJlbW92ZUFsbEtleXMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisKKwlVQ0hBUiAJaTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFdQQVJlbW92ZUFsbEtleXMoQXV0aE1vZGU9JWQsIFdlcFN0YXR1cz0lZClcbiIsIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMpKTsKKworCS8vIEZvciBXRVAvQ0tJUCwgdGhlcmUgaXMgbm8gbmVlZCB0byByZW1vdmUgaXQsIHNpbmNlIFdpblhQIHdvbid0IHNldCBpdCBhZ2FpbiBhZnRlcgorCS8vIExpbmsgdXAuIEFuZCBpdCB3aWxsIGJlIHJlcGxhY2VkIGlmIHVzZXIgY2hhbmdlZCBpdC4KKwlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJCXJldHVybjsKKworCS8vIEZvciBXUEEtTm9uZSwgdGhlcmUgaXMgbm8gbmVlZCB0byByZW1vdmUgaXQsIHNpbmNlIFdpblhQIHdvbid0IHNldCBpdCBhZ2FpbiBhZnRlcgorCS8vIExpbmsgdXAuIEFuZCBpdCB3aWxsIGJlIHJlcGxhY2VkIGlmIHVzZXIgY2hhbmdlZCBpdC4KKwlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKwkJcmV0dXJuOworCisJLy8gc2V0IEJTU0lEIHdjaWQgZW50cnkgb2YgdGhlIFBhaXItd2lzZSBLZXkgdGFibGUgYXMgbm8tc2VjdXJpdHkgbW9kZQorCUFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KHBBZCwgQlNTMCwgQlNTSURfV0NJRCk7CisKKwkvLyBzZXQgYWxsIHNoYXJlZCBrZXkgbW9kZSBhcyBuby1zZWN1cml0eS4KKwlmb3IgKGkgPSAwOyBpIDwgU0hBUkVfS0VZX05VTTsgaSsrKQorICAgIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJyZW1vdmUgJXMga2V5ICMlZFxuIiwgQ2lwaGVyTmFtZVtwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGddLCBpKSk7CisJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVtpXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKworCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCBpKTsKKwl9CisKK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDaGFuZ2UgTklDIFBIWSBtb2RlLiBSZS1hc3NvY2lhdGlvbiBtYXkgYmUgbmVjZXNzYXJ5LiBwb3NzaWJsZSBzZXR0aW5ncworCQlpbmNsdWRlIC0gUEhZXzExQiwgUEhZXzExQkdfTUlYRUQsIFBIWV8xMUEsIGFuZCBQSFlfMTFBQkdfTUlYRUQKKworCUFyZ3VtZW50czoKKwkJcEFkIC0gUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwaHltb2RlICAtCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QU2V0UGh5TW9kZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVTE9ORyBwaHltb2RlKQoreworCUlOVCBpOworCS8vIHRoZSBzZWxlY3RlZCBwaHltb2RlIG11c3QgYmUgc3VwcG9ydGVkIGJ5IHRoZSBSRiBJQyBlbmNvZGVkIGluIEUyUFJPTQorCisJLy8gaWYgbm8gY2hhbmdlLCBkbyBub3RoaW5nCisJLyogYnVnIGZpeAorCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IHBoeW1vZGUpCisJCXJldHVybjsKKyAgICAqLworCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSAoVUNIQVIpcGh5bW9kZTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFNldFBoeU1vZGUgOiBQaHlNb2RlPSVkLCBjaGFubmVsPSVkIFxuIiwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwlCdWlsZENoYW5uZWxMaXN0RXgocEFkKTsKKyNlbHNlCisJQnVpbGRDaGFubmVsTGlzdChwQWQpOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKworCS8vIHNhbml0eSBjaGVjayB1c2VyIHNldHRpbmcKKwlmb3IgKGkgPSAwOyBpIDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPT0gcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gcEFkLT5DaGFubmVsTGlzdE51bSkKKwl7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsID0gRmlyc3RDaGFubmVsKHBBZCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBTZXRQaHlNb2RlOiBjaGFubmVsIGlzIG91dCBvZiByYW5nZSwgdXNlIGZpcnN0IGNoYW5uZWw9JWQgXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJfQorCisJTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcuU3VwUmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOworCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKwlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisJc3dpdGNoIChwaHltb2RlKSB7CisJCWNhc2UgUEhZXzExQjoKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMF0gID0gMHg4MjsJICAvLyAxIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzFdICA9IDB4ODQ7CSAgLy8gMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQorCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVsyXSAgPSAweDhCOwkgIC8vIDUuNSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQorCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVszXSAgPSAweDk2OwkgIC8vIDExIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuICA9IDQ7CisJCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuICA9IDA7CisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzBdICA9IDI7CSAgIC8vIDEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMV0gID0gNDsJICAgLy8gMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsyXSAgPSAxMTsgICAgLy8gNS41IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzNdICA9IDIyOyAgICAvLyAxMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJLy9wQWQtPkNvbW1vbkNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOyAvLyBUaGlzIE1PREUgaXMgb25seSBGWUkuIG5vdCB1c2UKKwkJCWJyZWFrOworCisJCWNhc2UgUEhZXzExRzoKKwkJY2FzZSBQSFlfMTFCR19NSVhFRDoKKwkJY2FzZSBQSFlfMTFBQkdfTUlYRUQ6CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgUEhZXzExTl8yXzRHOgorCQljYXNlIFBIWV8xMUFCR05fTUlYRUQ6CisJCWNhc2UgUEhZXzExQkdOX01JWEVEOgorCQljYXNlIFBIWV8xMUdOX01JWEVEOgorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVswXSAgPSAweDgyOwkgIC8vIDEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMV0gID0gMHg4NDsJICAvLyAyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzJdICA9IDB4OEI7CSAgLy8gNS41IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzNdICA9IDB4OTY7CSAgLy8gMTEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNF0gID0gMHgxMjsJICAvLyA5IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzVdICA9IDB4MjQ7CSAgLy8gMTggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNl0gID0gMHg0ODsJICAvLyAzNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs3XSAgPSAweDZjOwkgIC8vIDU0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuICA9IDg7CisJCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlWzBdICA9IDB4MEM7CSAgLy8gNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZVsxXSAgPSAweDE4OwkgIC8vIDEyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlWzJdICA9IDB4MzA7CSAgLy8gMjQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVbM10gID0gMHg2MDsJICAvLyA0OCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbiAgPSA0OworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVswXSAgPSAyOwkgICAvLyAxIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzFdICA9IDQ7CSAgIC8vIDIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMl0gID0gMTE7ICAgIC8vIDUuNSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVszXSAgPSAyMjsgICAgLy8gMTEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNF0gID0gMTI7ICAgIC8vIDYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNV0gID0gMTg7ICAgIC8vIDkgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNl0gID0gMjQ7ICAgIC8vIDEyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzddICA9IDM2OyAgICAvLyAxOCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs4XSAgPSA0ODsgICAgLy8gMjQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbOV0gID0gNzI7ICAgIC8vIDM2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzEwXSA9IDk2OyAgICAvLyA0OCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxMV0gPSAxMDg7ICAgLy8gNTQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCWJyZWFrOworCisJCWNhc2UgUEhZXzExQToKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJY2FzZSBQSFlfMTFBTl9NSVhFRDoKKwkJY2FzZSBQSFlfMTFBR05fTUlYRUQ6CisJCWNhc2UgUEhZXzExTl81RzoKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMF0gID0gMHg4QzsJICAvLyA2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzFdICA9IDB4MTI7CSAgLy8gOSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVsyXSAgPSAweDk4OwkgIC8vIDEyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzNdICA9IDB4MjQ7CSAgLy8gMTggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNF0gID0gMHhiMDsJICAvLyAyNCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQorCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs1XSAgPSAweDQ4OwkgIC8vIDM2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzZdICA9IDB4NjA7CSAgLy8gNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbN10gID0gMHg2YzsJICAvLyA1NCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbiAgPSA4OworCQkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbiAgPSAwOworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVswXSAgPSAxMjsgICAgLy8gNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxXSAgPSAxODsgICAgLy8gOSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsyXSAgPSAyNDsgICAgLy8gMTIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbM10gID0gMzY7ICAgIC8vIDE4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzRdICA9IDQ4OyAgICAvLyAyNCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs1XSAgPSA3MjsgICAgLy8gMzYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNl0gID0gOTY7ICAgIC8vIDQ4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzddICA9IDEwODsgICAvLyA1NCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQkJLy9wQWQtPkNvbW1vbkNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsgLy8gVGhpcyBNT0RFIGlzIG9ubHkgRllJLiBub3QgdXNlCisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisKKwlwQWQtPkNvbW1vbkNmZy5CYW5kU3RhdGUgPSBVTktOT1dOX0JBTkQ7Cit9CisKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDYWxsZXIgZW5zdXJlcyB3ZSBoYXMgODAyLjExbiBzdXBwb3J0LgorCQlDYWxscyBhdCBzZXR0aW5nIEhUIGZyb20gQVAvU1RBU2V0aW5mb3JtYXRpb24KKworCUFyZ3VtZW50czoKKwkJcEFkIC0gUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwaHltb2RlICAtCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBTZXRIVCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglPSURfU0VUX0hUX1BIWU1PREUgKnBIVFBoeU1vZGUpCit7CisJLy9VTE9ORwkqcG1jczsKKwlVSU5UMzIJVmFsdWUgPSAwOworCVVDSEFSCUJCUFZhbHVlID0gMDsKKwlVQ0hBUglCQlAzVmFsdWUgPSAwOworCVVDSEFSCVJ4U3RyZWFtID0gcEFkLT5Db21tb25DZmcuUnhTdHJlYW07CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2V0SFQgOiBIVF9tb2RlKCVkKSwgRXh0T2Zmc2V0KCVkKSwgTUNTKCVkKSwgQlcoJWQpLCBTVEJDKCVkKSwgU0hPUlRHSSglZClcbiIsCisJCQkJCQkJCQkJcEhUUGh5TW9kZS0+SHRNb2RlLCBwSFRQaHlNb2RlLT5FeHRPZmZzZXQsCisJCQkJCQkJCQkJcEhUUGh5TW9kZS0+TUNTLCBwSFRQaHlNb2RlLT5CVywKKwkJCQkJCQkJCQlwSFRQaHlNb2RlLT5TVEJDLCBwSFRQaHlNb2RlLT5TSE9SVEdJKSk7CisKKwkvLyBEb24ndCB6ZXJvIHN1cHBvcnRlZEh5UGh5IHN0cnVjdHVyZS4KKwlSVE1QWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LCBzaXplb2YocEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5KSk7CisJUlRNUFplcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbywgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbykpOworCVJUTVBaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5OZXdFeHRDaGFuT2Zmc2V0LCBzaXplb2YocEFkLT5Db21tb25DZmcuTmV3RXh0Q2hhbk9mZnNldCkpOworCVJUTVBaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHksIHNpemVvZihwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkpKTsKKworICAgCWlmIChwQWQtPkNvbW1vbkNmZy5iUmRnKQorCXsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDID0gMTsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0ID0gMTsKKwl9CisJZWxzZQorCXsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDID0gMDsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0ID0gMDsKKwl9CisKKwlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1heFJBbXBkdUZhY3RvciA9IDM7CisJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1heFJBbXBkdUZhY3RvciA9IDM7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2V0SFQgOiBSeEJBV2luTGltaXQgPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCkpOworCisJLy8gTWltbyBwb3dlciBzYXZlLCBBLU1TRFUgc2l6ZSwKKwlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUgPSAoVVNIT1JUKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZTsKKwlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdVNpemU7CisJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QcyA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGU7CisJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5ID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eTsKKworCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVTaXplOworCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGU7CisJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2V0SFQgOiBBTXNkdVNpemUgPSAlZCwgTWltb1BzID0gJWQsIE1wZHVEZW5zaXR5ID0gJWQsIE1heFJBbXBkdUZhY3RvciA9ICVkXG4iLAorCQkJCQkJCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemUsCisJCQkJCQkJCQkJCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QcywKKwkJCQkJCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTXBkdURlbnNpdHksCisJCQkJCQkJCQkJCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1heFJBbXBkdUZhY3RvcikpOworCisJaWYocEhUUGh5TW9kZS0+SHRNb2RlID09IEhUTU9ERV9HRikKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uR0YgPSAxOworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuR0YgPSAxOworCX0KKwllbHNlCisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRiA9IDA7CisKKwkvLyBEZWNpZGUgUnggTUNTU2V0CisJc3dpdGNoIChSeFN0cmVhbSkKKwl7CisJCWNhc2UgMToKKwkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAgMHhmZjsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAgMHgwMDsKKwkJCWJyZWFrOworCisJCWNhc2UgMjoKKwkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAgMHhmZjsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAgMHhmZjsKKwkJCWJyZWFrOworCisJCWNhc2UgMzogLy8gMyozCisJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzBdID0gIDB4ZmY7CisJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzFdID0gIDB4ZmY7CisJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzJdID0gIDB4ZmY7CisJCQlicmVhazsKKwl9CisKKwlpZiAocEFkLT5Db21tb25DZmcuYkZvcnR5X01oel9JbnRvbGVyYW50ICYmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KSAmJiAocEhUUGh5TW9kZS0+QlcgPT0gQldfNDApICkKKwl7CisJCXBIVFBoeU1vZGUtPkJXID0gQldfMjA7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uRm9ydHlfTWh6X0ludG9sZXJhbnQgPSAxOworCX0KKworCWlmKHBIVFBoeU1vZGUtPkJXID09IEJXXzQwKQorCXsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFs0XSA9IDB4MTsgLy8gTUNTIDMyCisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID0gMTsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpCisJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNDS21vZGVpbjQwID0gMTsKKworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoID0gMTsKKwkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5SZWNvbVdpZHRoID0gMTsKKwkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID0gKHBIVFBoeU1vZGUtPkV4dE9mZnNldCA9PSBFWFRDSEFfQkVMT1cpPyAoRVhUQ0hBX0JFTE9XKTogRVhUQ0hBX0FCT1ZFOworCQkvLyBTZXQgUmVnc2l0ZXIgZm9yIGV4dGVuc2lvbiBjaGFubmVsIHBvc2l0aW9uLgorCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmVmFsdWUpOworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCQlAzVmFsdWUpOworCQlpZiAoKHBIVFBoeU1vZGUtPkV4dE9mZnNldCA9PSBFWFRDSEFfQkVMT1cpKQorCQl7CisJCQlWYWx1ZSB8PSAweDE7CisJCQlCQlAzVmFsdWUgfD0gKDB4MjApOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIFZhbHVlKTsKKwkJfQorCQllbHNlIGlmICgocEhUUGh5TW9kZS0+RXh0T2Zmc2V0ID09IEVYVENIQV9BQk9WRSkpCisJCXsKKwkJCVZhbHVlICY9IDB4ZmU7CisJCQlCQlAzVmFsdWUgJj0gKH4weDIwKTsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7CisJCX0KKworCQkvLyBUdXJuIG9uIEJCUCA0ME1IeiBtb2RlIG5vdyBvbmx5IGFzIEFQIC4KKwkJLy8gU3RhIGNhbiB0dXJuIG9uIEJCUCA0ME1IeiBhZnRlciBjb25uZWN0aW9uIHdpdGggNDBNSHogQVAuIFN0YSBvbmx5IGJyb2FkY2FzdCA0ME1IeiBjYXBhYmlsaXR5IGJlZm9yZSBjb25uZWN0aW9uLgorCQlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkgfHwgSU5GUkFfT04ocEFkKSB8fCBBREhPQ19PTihwQWQpCisJCQkpCisJCXsKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKKwkJCUJCUFZhbHVlICY9ICh+MHgxOCk7CisJCQlCQlBWYWx1ZSB8PSAweDEwOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOworCisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCQlAzVmFsdWUpOworCQkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPSAwOworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoID0gMDsKKwkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5SZWNvbVdpZHRoID0gMDsKKwkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID0gRVhUQ0hBX05PTkU7CisJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKKwkJLy8gVHVybiBvbiBCQlAgMjBNSHogbW9kZSBieSByZXF1ZXN0IGhlcmUuCisJCXsKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKKwkJCUJCUFZhbHVlICY9ICh+MHgxOCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7CisJCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV18yMDsKKwkJfQorCX0KKworCWlmKHBIVFBoeU1vZGUtPlNUQkMgPT0gU1RCQ19VU0UpCisJeworCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlR4U1RCQyA9IDE7CisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMgPSAxOworCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQyA9IDE7CisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5SeFNUQkMgPSAxOworCX0KKwllbHNlCisJeworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDID0gMDsKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlJ4U1RCQyA9IDA7CisJfQorCisjaWZkZWYgUlQyODcwCisJLyogRnJhbmsgcmVjb21tZW5kICxJZiBub3QsIFR4IG1heWJlIGJsb2NrIGluIGhpZ2ggcG93ZXIuIFJ4IGhhcyBubyBwcm9ibGVtKi8KKwlpZihJU19SVDMwNzAocEFkKSAmJiAoKHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18zMDIwKSB8fCAocEFkLT5SZkljVHlwZSA9PSBSRklDXzIwMjApKSkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uVHhTVEJDID0gMDsKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlR4U1RCQyA9IDA7CisJfQorI2VuZGlmIC8vIFJUMjg3MCAvLworCisJaWYocEhUUGh5TW9kZS0+U0hPUlRHSSA9PSBHSV80MDApCisJeworCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCA9IDE7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwID0gMTsKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCA9IDE7CisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDAgPSAxOworCX0KKwllbHNlCisJeworCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwID0gMDsKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDAgPSAwOworCX0KKworCS8vIFdlIHN1cHBvcnQgbGluayBhZGFwdGF0aW9uIGZvciB1bnNvbGljaXQgTUNTIGZlZWRiYWNrLCBzZXQgdG8gMi4KKwlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLk1DU0ZlZWRiYWNrID0gTUNTRkJLX05PTkU7IC8vTUNTRkJLX1VOU09MSUNJVDsKKwlwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQ29udHJvbENoYW4gPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCS8vIDEsIHRoZSBleHRlbnNpb24gY2hhbm5lbCBhYm92ZSB0aGUgY29udHJvbCBjaGFubmVsLgorCisJLy8gRURDQSBwYXJhbWV0ZXJzIHVzZWQgZm9yIEFQJ3Mgb3duIHRyYW5zbWlzc2lvbgorCWlmIChwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJWYWxpZCA9PSBGQUxTRSkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYlZhbGlkID0gVFJVRTsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblswXSA9IDM7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQWlmc25bMV0gPSA3OworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkFpZnNuWzJdID0gMTsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblszXSA9IDE7CisKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21pblswXSA9IDQ7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtaW5bMV0gPSA0OworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWluWzJdID0gMzsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21pblszXSA9IDI7CisKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFswXSA9IDY7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbMV0gPSAxMDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFsyXSA9IDQ7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbM10gPSAzOworCisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFswXSAgPSAwOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbMV0gID0gMDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzJdICA9IDk0OworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbM10gID0gNDc7CisJfQorCUFzaWNTZXRFZGNhUGFybShwQWQsICZwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtKTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCVJUTVBTZXRJbmRpdmlkdWFsSFQocEFkLCAwKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDYWxsZXIgZW5zdXJlcyB3ZSBoYXMgODAyLjExbiBzdXBwb3J0LgorCQlDYWxscyBhdCBzZXR0aW5nIEhUIGZyb20gQVAvU1RBU2V0aW5mb3JtYXRpb24KKworCUFyZ3VtZW50czoKKwkJcEFkIC0gUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwaHltb2RlICAtCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBTZXRJbmRpdmlkdWFsSFQoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCVVDSEFSCQkJCWFwaWR4KQoreworCVBSVF9IVF9QSFlfSU5GTwkJcERlc2lyZWRfaHRfcGh5ID0gTlVMTDsKKwlVQ0hBUglUeFN0cmVhbSA9IHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtOworCVVDSEFSCURlc2lyZWRNY3MJPSBNQ1NfQVVUTzsKKworCWRvCisJeworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCXBEZXNpcmVkX2h0X3BoeSA9ICZwQWQtPlN0YUNmZy5EZXNpcmVkSHRQaHlJbmZvOworCQkJRGVzaXJlZE1jcyA9IHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTOworCQkJLy9wQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IChEZXNpcmVkTWNzID09IE1DU19BVVRPKSA/IFRSVUUgOiBGQUxTRTsKKwkJCQlicmVhazsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0gd2hpbGUgKEZBTFNFKTsKKworCWlmIChwRGVzaXJlZF9odF9waHkgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBTZXRJbmRpdmlkdWFsSFQ6IGludmFsaWQgYXBpZHgoJWQpXG4iLCBhcGlkeCkpOworCQlyZXR1cm47CisJfQorCVJUTVBaZXJvTWVtb3J5KHBEZXNpcmVkX2h0X3BoeSwgc2l6ZW9mKFJUX0hUX1BIWV9JTkZPKSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2V0SW5kaXZpZHVhbEhUIDogRGVzaXJlZCBNQ1MgPSAlZFxuIiwgRGVzaXJlZE1jcykpOworCS8vIENoZWNrIHRoZSB2YWxpZGl0eSBvZiBNQ1MKKwlpZiAoKFR4U3RyZWFtID09IDEpICYmICgoRGVzaXJlZE1jcyA+PSBNQ1NfOCkgJiYgKERlc2lyZWRNY3MgPD0gTUNTXzE1KSkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlJUTVBTZXRJbmRpdmlkdWFsSFQ6IE1DUyglZCkgaXMgaW52YWxpZCBpbiAxUywgcmVzZXQgaXQgYXMgTUNTXzdcbiIsIERlc2lyZWRNY3MpKTsKKwkJRGVzaXJlZE1jcyA9IE1DU183OworCX0KKworCWlmICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCA9PSBCV18yMCkgJiYgKERlc2lyZWRNY3MgPT0gTUNTXzMyKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUlRNUFNldEluZGl2aWR1YWxIVDogTUNTXzMyIGlzIG9ubHkgc3VwcG9ydGVkIGluIDQwLU1IeiwgcmVzZXQgaXQgYXMgTUNTXzBcbiIpKTsKKwkJRGVzaXJlZE1jcyA9IE1DU18wOworCX0KKworCXBEZXNpcmVkX2h0X3BoeS0+Ykh0RW5hYmxlID0gVFJVRTsKKworCS8vIERlY2lkZSBkZXNpcmVkIFR4IE1DUworCXN3aXRjaCAoVHhTdHJlYW0pCisJeworCQljYXNlIDE6CisJCQlpZiAoRGVzaXJlZE1jcyA9PSBNQ1NfQVVUTykKKwkJCXsKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFswXT0gMHhmZjsKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsxXT0gMHgwMDsKKwkJCX0KKwkJCWVsc2UgaWYgKERlc2lyZWRNY3MgPD0gTUNTXzcpCisJCQl7CisJCQkJcERlc2lyZWRfaHRfcGh5LT5NQ1NTZXRbMF09IDE8PERlc2lyZWRNY3M7CisJCQkJcERlc2lyZWRfaHRfcGh5LT5NQ1NTZXRbMV09IDB4MDA7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIDI6CisJCQlpZiAoRGVzaXJlZE1jcyA9PSBNQ1NfQVVUTykKKwkJCXsKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFswXT0gMHhmZjsKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsxXT0gMHhmZjsKKwkJCX0KKwkJCWVsc2UgaWYgKERlc2lyZWRNY3MgPD0gTUNTXzE1KQorCQkJeworCQkJCVVMT05HIG1vZGU7CisKKwkJCQltb2RlID0gRGVzaXJlZE1jcyAvIDg7CisJCQkJaWYgKG1vZGUgPCAyKQorCQkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFttb2RlXSA9ICgxIDw8IChEZXNpcmVkTWNzIC0gbW9kZSAqIDgpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgMzogLy8gMyozCisJCQlpZiAoRGVzaXJlZE1jcyA9PSBNQ1NfQVVUTykKKwkJCXsKKwkJCQkvKiBNQ1MwIH4gTUNTMjMsIDMgYnl0ZXMgKi8KKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFswXT0gMHhmZjsKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsxXT0gMHhmZjsKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsyXT0gMHhmZjsKKwkJCX0KKwkJCWVsc2UgaWYgKERlc2lyZWRNY3MgPD0gTUNTXzIzKQorCQkJeworCQkJCVVMT05HIG1vZGU7CisKKwkJCQltb2RlID0gRGVzaXJlZE1jcyAvIDg7CisJCQkJaWYgKG1vZGUgPCAzKQorCQkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFttb2RlXSA9ICgxIDw8IChEZXNpcmVkTWNzIC0gbW9kZSAqIDgpKTsKKwkJCX0KKwkJCWJyZWFrOworCX0KKworCWlmKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGggPT0gQldfNDApCisJeworCQlpZiAoRGVzaXJlZE1jcyA9PSBNQ1NfQVVUTyB8fCBEZXNpcmVkTWNzID09IE1DU18zMikKKwkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzRdID0gMHgxOworCX0KKworCS8vIHVwZGF0ZSBIVCBSYXRlIHNldHRpbmcKKyAgICBpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKKyAgICAgICAgTWxtZVVwZGF0ZUh0VHhSYXRlcyhwQWQsIEJTUzApOworICAgIGVsc2UKKwkgICAgTWxtZVVwZGF0ZUh0VHhSYXRlcyhwQWQsIGFwaWR4KTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVVwZGF0ZSBIVCBJRSBmcm9tIG91ciBjYXBhYmlsaXR5LgorCisJQXJndW1lbnRzOgorCQlTZW5kIGFsbCBIVCBJRSBpbiBiZWFjb24vcHJvYmUgcnNwL2Fzc29jIHJzcC9hY3Rpb24gZnJhbWUuCisKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFVwZGF0ZUhUSUUoCisJSU4JUlRfSFRfQ0FQQUJJTElUWQkqcFJ0SHQsCisJSU4JCVVDSEFSCQkJCSpwTWNzU2V0LAorCU9VVAkJSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKKwlPVVQJCUFERF9IVF9JTkZPX0lFCQkqcEFkZEh0SW5mbykKK3sKKwlSVE1QWmVyb01lbW9yeShwSHRDYXBhYmlsaXR5LCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOworCVJUTVBaZXJvTWVtb3J5KHBBZGRIdEluZm8sIHNpemVvZihBRERfSFRfSU5GT19JRSkpOworCisJCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPSBwUnRIdC0+Q2hhbm5lbFdpZHRoOworCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uTWltb1BzID0gcFJ0SHQtPk1pbW9QczsKKwkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkdGID0gcFJ0SHQtPkdGOworCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjIwID0gcFJ0SHQtPlNob3J0R0lmb3IyMDsKKwkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3I0MCA9IHBSdEh0LT5TaG9ydEdJZm9yNDA7CisJCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5UeFNUQkMgPSBwUnRIdC0+VHhTVEJDOworCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uUnhTVEJDID0gcFJ0SHQtPlJ4U1RCQzsKKwkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkFNc2R1U2l6ZSA9IHBSdEh0LT5BbXNkdVNpemU7CisJCXBIdENhcGFiaWxpdHktPkh0Q2FwUGFybS5NYXhSQW1wZHVGYWN0b3IgPSBwUnRIdC0+TWF4UkFtcGR1RmFjdG9yOworCQlwSHRDYXBhYmlsaXR5LT5IdENhcFBhcm0uTXBkdURlbnNpdHkgPSBwUnRIdC0+TXBkdURlbnNpdHk7CisKKwkJcEFkZEh0SW5mby0+QWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPSBwUnRIdC0+RXh0Q2hhbk9mZnNldCA7CisJCXBBZGRIdEluZm8tPkFkZEh0SW5mby5SZWNvbVdpZHRoID0gcFJ0SHQtPlJlY29tV2lkdGg7CisJCXBBZGRIdEluZm8tPkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlID0gcFJ0SHQtPk9wZXJhaW9uTW9kZTsKKwkJcEFkZEh0SW5mby0+QWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPSBwUnRIdC0+Tm9uR2ZQcmVzZW50OworCQlSVE1QTW92ZU1lbW9yeShwQWRkSHRJbmZvLT5NQ1NTZXQsIC8qcFJ0SHQtPk1DU1NldCovcE1jc1NldCwgNCk7IC8vIHJ0Mjg2MCBvbmx5IHN1cHBvcnQgTUNTIG1heD0zMiwgbm8gbmVlZCB0byBjb3B5IGFsbCAxNiB1Y2hhci4KKworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBVcGRhdGVIVElFIDw9PSBcbiIpKTsKK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJQWRkIENsaWVudCBzZWN1cml0eSBpbmZvcm1hdGlvbiBpbnRvIEFTSUMgV0NJRCB0YWJsZSBhbmQgSVZFSVYgdGFibGUuCisgICAgUmV0dXJuOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUJzc0lkeCwKKwlJTiAJVUNIQVIJCSAJS2V5SWR4LAorCUlOIAlVQ0hBUgkJIAlDaXBoZXJBbGcsCisJSU4gCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5KQoreworCVVJTlQzMgkJV0NJREF0dHJpID0gMDsKKwlVU0hPUlQJCW9mZnNldDsKKwlVQ0hBUgkJSVZFSVYgPSAwOworCVVTSE9SVAkJV2NpZCA9IDA7CisKKwl7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCWlmIChCc3NJZHggPiBCU1MwKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnk6IFRoZSBCU1MtaW5kZXgoJWQpIGlzIG91dCBvZiByYW5nZSBmb3IgSW5mcmEgbGluay4gXG4iLCBCc3NJZHgpKTsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vIDEuCUluIEFESE9DIG1vZGUsIHRoZSBBSUQgaXMgd2NpZCBudW1iZXIuIEFuZCBOTyBtZXNoIGxpbmsgZXhpc3RzLgorCQkJLy8gMi4JSW4gSW5mcmEgbW9kZSwgdGhlIEFJRDoxIE1VU1QgYmUgd2NpZCBvZiBpbmZyYSBTVEEuCisJCQkvLwkJCQkJICAgdGhlIEFJRDoyfiBhc3NpZ24gdG8gbWVzaCBsaW5rIGVudHJ5LgorCQkJaWYgKHBFbnRyeSAmJiBBREhPQ19PTihwQWQpKQorCQkJCVdjaWQgPSBwRW50cnktPkFpZDsKKwkJCWVsc2UgaWYgKHBFbnRyeSAmJiBJTkZSQV9PTihwQWQpKQorCQkJeworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkJCWlmIChwRW50cnktPlZhbGlkQXNEbHMgPT0gVFJVRSkKKwkJCQkJV2NpZCA9IHBFbnRyeS0+QWlkOworCQkJCWVsc2UKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkJCQlXY2lkID0gQlNTSURfV0NJRDsKKwkJCX0KKwkJCWVsc2UKKwkJCQlXY2lkID0gTUNBU1RfV0NJRDsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KKworCS8vIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZQorCW9mZnNldCA9IE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsgKFdjaWQgKiBIV19XQ0lEX0FUVFJJX1NJWkUpOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWlmIChwRW50cnkgJiYgcEVudHJ5LT5WYWxpZEFzTWVzaCkKKwkJCVdDSURBdHRyaSA9IChDaXBoZXJBbGc8PDEpIHwgUEFJUldJU0VLRVlUQUJMRTsKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJZWxzZSBpZiAoKHBFbnRyeSkgJiYgKHBFbnRyeS0+VmFsaWRBc0RscykgJiYKKwkJCQkJKChDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApIHx8CisJCQkJIAkoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQX05PX01JQykgfHwKKwkJCQkJKENpcGhlckFsZyA9PSBDSVBIRVJfQUVTKSB8fAorCQkJCSAJKENpcGhlckFsZyA9PSBDSVBIRVJfTk9ORSkpKQorCQkJV0NJREF0dHJpID0gKENpcGhlckFsZzw8MSkgfCBQQUlSV0lTRUtFWVRBQkxFOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQllbHNlCisJCQlXQ0lEQXR0cmkgPSAoQ2lwaGVyQWxnPDwxKSB8IFNIQVJFREtFWVRBQkxFOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCwgV0NJREF0dHJpKTsKKworCisJLy8gVXBkYXRlIElWL0VJViB0YWJsZQorCW9mZnNldCA9IE1BQ19JVkVJVl9UQUJMRV9CQVNFICsgKFdjaWQgKiBIV19JVkVJVl9FTlRSWV9TSVpFKTsKKworCS8vIFdQQSBtb2RlCisJaWYgKChDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApIHx8IChDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVBfTk9fTUlDKSB8fCAoQ2lwaGVyQWxnID09IENJUEhFUl9BRVMpKQorCXsKKwkJLy8gRWl2IGJpdCBvbi4ga2V5aWQgYWx3YXlzIGlzIDAgZm9yIHBhaXJ3aXNlIGtleQorCQlJVkVJViA9IChLZXlJZHggPDw2KSB8IDB4MjA7CisJfQorCWVsc2UKKwl7CisJCS8vIFdFUCBLZXlJZHggaXMgZGVmYXVsdCB0eCBrZXkuCisJCUlWRUlWID0gKEtleUlkeCA8PCA2KTsKKwl9CisKKwkvLyBGb3Iga2V5IGluZGV4IGFuZCBleHQgSVYgYml0LCBzbyBvbmx5IG5lZWQgdG8gdXBkYXRlIHRoZSBwb3NpdGlvbihvZmZzZXQrMykuCisjaWZkZWYgUlQyODcwCisJUlRVU0JNdWx0aVdyaXRlX09uZUJ5dGUocEFkLCBvZmZzZXQrMywgJklWRUlWKTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeTogV0NJRCAjJWQsIEtleUluZGV4ICMlZCwgQWxnPSVzXG4iLFdjaWQsIEtleUlkeCwgQ2lwaGVyTmFtZVtDaXBoZXJBbGddKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIJV0NJREF0dHJpID0gMHgleCBcbiIsICBXQ0lEQXR0cmkpKTsKKworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFBhcnNlIGVuY3J5cHRpb24gdHlwZQorQXJndW1lbnRzOgorICAgIHBBZGFwdGVyICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgd3JxICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlvY3RsIGFyZ3VtZW50CisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIE5vbmUKKworICAgIE5vdGU6CisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitDSEFSICpHZXRFbmNyeXB0VHlwZShDSEFSIGVuYykKK3sKKyAgICBpZihlbmMgPT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQorICAgICAgICByZXR1cm4gIk5PTkUiOworICAgIGlmKGVuYyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkKKyAgICAJcmV0dXJuICJXRVAiOworICAgIGlmKGVuYyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorICAgIAlyZXR1cm4gIlRLSVAiOworICAgIGlmKGVuYyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorICAgIAlyZXR1cm4gIkFFUyI7CisJaWYoZW5jID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQpCisgICAgCXJldHVybiAiVEtJUEFFUyI7CisgICAgZWxzZQorICAgIAlyZXR1cm4gIlVOS05PVyI7Cit9CisKK0NIQVIgKkdldEF1dGhNb2RlKENIQVIgYXV0aCkKK3sKKyAgICBpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pCisgICAgCXJldHVybiAiT1BFTiI7CisgICAgaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpCisgICAgCXJldHVybiAiU0hBUkVEIjsKKwlpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gpCisgICAgCXJldHVybiAiQVVUT1dFUCI7CisgICAgaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgCXJldHVybiAiV1BBIjsKKyAgICBpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykKKyAgICAJcmV0dXJuICJXUEFQU0siOworICAgIGlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKyAgICAJcmV0dXJuICJXUEFOT05FIjsKKyAgICBpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCisgICAgCXJldHVybiAiV1BBMiI7CisgICAgaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQorICAgIAlyZXR1cm4gIldQQTJQU0siOworCWlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMVdQQTIpCisgICAgCXJldHVybiAiV1BBMVdQQTIiOworCWlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0spCisgICAgCXJldHVybiAiV1BBMVBTS1dQQTJQU0siOworCisgICAgCXJldHVybiAiVU5LTk9XIjsKK30KKworI2lmIDEgLy8jaWZuZGVmIFVDT1MKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgR2V0IHNpdGUgc3VydmV5IHJlc3VsdHMKKwlBcmd1bWVudHM6CisJICAgIHBBZGFwdGVyICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJICAgIHdycSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpb2N0bCBhcmd1bWVudAorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOb25lCisKKyAgICBOb3RlOgorICAgICAgICBVc2FnZToKKyAgICAgICAgCQkxLikgVUkgbmVlZHMgdG8gd2FpdCA0IHNlY29uZHMgYWZ0ZXIgaXNzdWUgYSBzaXRlIHN1cnZleSBjb21tYW5kCisgICAgICAgIAkJMi4pIGl3cHJpdiByYTAgZ2V0X3NpdGVfc3VydmV5CisgICAgICAgIAkJMy4pIFVJIG5lZWRzIHRvIHByZXBhcmUgYXQgbGVhc3QgNDA5NmJ5dGVzIHRvIGdldCB0aGUgcmVzdWx0cworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworI2RlZmluZQlMSU5FX0xFTgkoNCszMysyMCs4KzEwKzkrNyszKQkvLyBDaGFubmVsK1NTSUQrQnNzaWQrV2VwU3RhdHVzK0F1dGhNb2RlK1NpZ25hbCtXaXJlc3NNb2RlK05ldHdvcmtUeXBlCitWT0lEIFJUTVBJb2N0bEdldFNpdGVTdXJ2ZXkoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglzdHJ1Y3QgaXdyZXEJKndycSkKK3sKKwlDSEFSCQkqbXNnOworCUlOVCAJCWk9MDsKKwlJTlQJCQlXYWl0Q250OworCUlOVCAJCVN0YXR1cz0wOworCUNIQVIJCVNzaWRbTUFYX0xFTl9PRl9TU0lEICsxXTsKKyAgICBJTlQgICAgICAgICBSc3NpID0gMCwgbWF4X2xlbiA9IExJTkVfTEVOOworCVVJTlQgICAgICAgIFJzc2lfUXVhbGl0eSA9IDA7CisJTkRJU184MDJfMTFfTkVUV09SS19UWVBFICAgIHdpcmVsZXNzX21vZGU7CisKKwlvc19hbGxvY19tZW0oTlVMTCwgKFBVQ0hBUiAqKSZtc2csIHNpemVvZihDSEFSKSooKE1BWF9MRU5fT0ZfQlNTX1RBQkxFKSptYXhfbGVuKSk7CisKKwlpZiAobXNnID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QSW9jdGxHZXRTaXRlU3VydmV5IC0gbXNnIG1lbW9yeSBhbGxvYyBmYWlsLlxuIikpOworCQlyZXR1cm47CisJfQorCisJbWVtc2V0KG1zZywgMCAsKE1BWF9MRU5fT0ZfQlNTX1RBQkxFKSptYXhfbGVuICk7CisJbWVtc2V0KFNzaWQsIDAgLChNQVhfTEVOX09GX1NTSUQgKzEpKTsKKwlzcHJpbnRmKG1zZywiJXMiLCJcbiIpOworCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTRzJS0zM3MlLTIwcyUtOHMlLTEwcyUtOXMlLTdzJS0zc1xuIiwKKwkgICAgIkNoIiwgIlNTSUQiLCAiQlNTSUQiLCAiRW5jIiwgIkF1dGgiLCAiU2lnYW5sKCUpIiwgIlctTW9kZSIsICIgTlQiKTsKKworCisJV2FpdENudCA9IDA7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gVFJVRTsKKwl3aGlsZSAoKFNjYW5SdW5uaW5nKHBBZGFwdGVyKSA9PSBUUlVFKSAmJiAoV2FpdENudCsrIDwgMjAwKSkKKwkJT1NfV0FJVCg1MDApOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJZm9yKGk9MDsgaTxwQWRhcHRlci0+U2NhblRhYi5Cc3NOciA7aSsrKQorCXsKKwkJaWYoIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkNoYW5uZWw9PTApCisJCQlicmVhazsKKworCQlpZigoc3RybGVuKG1zZykrbWF4X2xlbiApID49IElXX1NDQU5fTUFYX0RBVEEpCisJCQlicmVhazsKKworCQkvL0NoYW5uZWwKKwkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtNGQiLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5DaGFubmVsKTsKKwkJLy9TU0lECisJCW1lbWNweShTc2lkLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuKTsKKwkJU3NpZFtwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuXSA9ICdcMCc7CisJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTMzcyIsIFNzaWQpOworCQkvL0JTU0lECisJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAgICIsCisJCQlwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZFswXSwKKwkJCXBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkWzFdLAorCQkJcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWRbMl0sCisJCQlwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZFszXSwKKwkJCXBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkWzRdLAorCQkJcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWRbNV0pOworCQkvL0VuY3J5cHRpb24gVHlwZQorCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS04cyIsR2V0RW5jcnlwdFR5cGUocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV2VwU3RhdHVzKSk7CisJCS8vQXV0aGVudGljYXRpb24gTW9kZQorCQlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKQorCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtMTBzIiwgIlVOS05PVyIpOworCQllbHNlCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0xMHMiLEdldEF1dGhNb2RlKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkF1dGhNb2RlKSk7CisJCS8vIFJzc2kKKwkJUnNzaSA9IChJTlQpcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNzaTsKKwkJaWYgKFJzc2kgPj0gLTUwKQorCQkJUnNzaV9RdWFsaXR5ID0gMTAwOworCQllbHNlIGlmIChSc3NpID49IC04MCkgICAgLy8gYmV0d2VlbiAtNTAgfiAtODBkYm0KKwkJCVJzc2lfUXVhbGl0eSA9IChVSU5UKSgyNCArICgoUnNzaSArIDgwKSAqIDI2KS8xMCk7CisJCWVsc2UgaWYgKFJzc2kgPj0gLTkwKSAgIC8vIGJldHdlZW4gLTgwIH4gLTkwZGJtCisJCQlSc3NpX1F1YWxpdHkgPSAoVUlOVCkoKChSc3NpICsgOTApICogMjYpLzEwKTsKKwkJZWxzZSAgICAvLyA8IC04NCBkYm0KKwkJCVJzc2lfUXVhbGl0eSA9IDA7CisJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTlkIiwgUnNzaV9RdWFsaXR5KTsKKwkJLy8gV2lyZWxlc3MgTW9kZQorCQl3aXJlbGVzc19tb2RlID0gTmV0d29ya1R5cGVJblVzZVNhbml0eSgmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0pOworCQlpZiAod2lyZWxlc3NfbW9kZSA9PSBOZGlzODAyXzExRkggfHwKKwkJCXdpcmVsZXNzX21vZGUgPT0gTmRpczgwMl8xMURTKQorCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtN3MiLCAiMTFiIik7CisJCWVsc2UgaWYgKHdpcmVsZXNzX21vZGUgPT0gTmRpczgwMl8xMU9GRE01KQorCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtN3MiLCAiMTFhIik7CisJCWVsc2UgaWYgKHdpcmVsZXNzX21vZGUgPT0gTmRpczgwMl8xMU9GRE01X04pCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS03cyIsICIxMWEvbiIpOworCQllbHNlIGlmICh3aXJlbGVzc19tb2RlID09IE5kaXM4MDJfMTFPRkRNMjQpCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS03cyIsICIxMWIvZyIpOworCQllbHNlIGlmICh3aXJlbGVzc19tb2RlID09IE5kaXM4MDJfMTFPRkRNMjRfTikKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTdzIiwgIjExYi9nL24iKTsKKwkJZWxzZQorCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtN3MiLCAidW5rbm93Iik7CisJCS8vTmV0d29yayBUeXBlCisJCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NUeXBlID09IEJTU19BREhPQykKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTNzIiwgIiBBZCIpOworCQllbHNlCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0zcyIsICIgSW4iKTsKKworICAgICAgICBzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiXG4iKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBGQUxTRTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4obXNnKTsKKwlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgbXNnLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUElvY3RsR2V0U2l0ZVN1cnZleSAtIHdycS0+dS5kYXRhLmxlbmd0aCA9ICVkXG4iLCB3cnEtPnUuZGF0YS5sZW5ndGgpKTsKKwlvc19mcmVlX21lbShOVUxMLCAoUFVDSEFSKW1zZyk7Cit9CisKKworI2RlZmluZQlNQUNfTElORV9MRU4JKDE0KzQrNCsxMCsxMCsxMCs2KzYpCS8vIEFkZHIrYWlkK3BzbStkYXRhdGltZStyeGJ5dGUrdHhieXRlK2N1cnJlbnQgdHggcmF0ZStsYXN0IHR4IHJhdGUKK1ZPSUQgUlRNUElvY3RsR2V0TWFjVGFibGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gc3RydWN0IGl3cmVxICp3cnEpCit7CisJSU5UIGk7CisJUlRfODAyXzExX01BQ19UQUJMRSBNYWNUYWI7CisJY2hhciAqbXNnOworCisJTWFjVGFiLk51bSA9IDA7CisJZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKKwl7CisJCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNDTEkgJiYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uU3N0ID09IFNTVF9BU1NPQykpCisJCXsKKwkJCUNPUFlfTUFDX0FERFIoTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLkFkZHIsICZwQWQtPk1hY1RhYi5Db250ZW50W2ldLkFkZHIpOworCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLkFpZCA9IChVQ0hBUilwQWQtPk1hY1RhYi5Db250ZW50W2ldLkFpZDsKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5Qc20gPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlBzTW9kZTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5NaW1vUHMgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLk1tcHNNb2RlOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCQkvLyBGaWxsIGluIFJTU0kgcGVyIGVudHJ5CisJCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uQXZnUnNzaTAgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlJzc2lTYW1wbGUuQXZnUnNzaTA7CisJCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uQXZnUnNzaTEgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlJzc2lTYW1wbGUuQXZnUnNzaTE7CisJCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uQXZnUnNzaTIgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlJzc2lTYW1wbGUuQXZnUnNzaTI7CisKKwkJCS8vIHRoZSBjb25uZWN0ZWQgdGltZSBwZXIgZW50cnkKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5Db25uZWN0ZWRUaW1lID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5TdGFDb25uZWN0VGltZTsKKyNpZiAwIC8vIFRvRG8KKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5IU0NvdW50ZXIuTGFzdERhdGFQYWNrZXRUaW1lID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IU0NvdW50ZXIuTGFzdERhdGFQYWNrZXRUaW1lOworCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLkhTQ291bnRlci5Ub3RhbFJ4Qnl0ZUNvdW50ID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IU0NvdW50ZXIuVG90YWxSeEJ5dGVDb3VudDsKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5IU0NvdW50ZXIuVG90YWxUeEJ5dGVDb3VudCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFNDb3VudGVyLlRvdGFsVHhCeXRlQ291bnQ7CisjZW5kaWYKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5UeFJhdGUuZmllbGQuTUNTID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IVFBoeU1vZGUuZmllbGQuTUNTOworCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLlR4UmF0ZS5maWVsZC5CVyA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLmZpZWxkLkJXOworCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLlR4UmF0ZS5maWVsZC5TaG9ydEdJID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSTsKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5UeFJhdGUuZmllbGQuU1RCQyA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLmZpZWxkLlNUQkM7CisJCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uVHhSYXRlLmZpZWxkLnJzdiA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLmZpZWxkLnJzdjsKKwkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5UeFJhdGUuZmllbGQuTU9ERSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLmZpZWxkLk1PREU7CisJCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uVHhSYXRlLndvcmQgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhUUGh5TW9kZS53b3JkOworCisJCQlNYWNUYWIuTnVtICs9IDE7CisJCX0KKwl9CisJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJUXzgwMl8xMV9NQUNfVEFCTEUpOworCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJk1hY1RhYiwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOiBjb3B5X3RvX3VzZXIoKSBmYWlsXG4iLCBfX2Z1bmNfXykpOworCX0KKworCW1zZyA9IChDSEFSICopIGttYWxsb2Moc2l6ZW9mKENIQVIpKihNQVhfTEVOX09GX01BQ19UQUJMRSpNQUNfTElORV9MRU4pLCBNRU1fQUxMT0NfRkxBRyk7CisJbWVtc2V0KG1zZywgMCAsTUFYX0xFTl9PRl9NQUNfVEFCTEUqTUFDX0xJTkVfTEVOICk7CisJc3ByaW50Zihtc2csIiVzIiwiXG4iKTsKKwlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0xNHMlLTRzJS00cyUtMTBzJS0xMHMlLTEwcyUtNnMlLTZzXG4iLAorCQkiTUFDIiwgIkFJRCIsICJQU00iLCAiTERUIiwgIlJ4QiIsICJUeEIiLCJDVHhSIiwgIkxUeFIiKTsKKworCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCisJeworCQlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W2ldOworCQlpZiAocEVudHJ5LT5WYWxpZEFzQ0xJICYmIChwRW50cnktPlNzdCA9PSBTU1RfQVNTT0MpKQorCQl7CisJCQlpZigoc3RybGVuKG1zZykrTUFDX0xJTkVfTEVOICkgPj0gKE1BWF9MRU5fT0ZfTUFDX1RBQkxFKk1BQ19MSU5FX0xFTikgKQorCQkJCWJyZWFrOworCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAgIiwKKwkJCQlwRW50cnktPkFkZHJbMF0sIHBFbnRyeS0+QWRkclsxXSwgcEVudHJ5LT5BZGRyWzJdLAorCQkJCXBFbnRyeS0+QWRkclszXSwgcEVudHJ5LT5BZGRyWzRdLCBwRW50cnktPkFkZHJbNV0pOworCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtNGQiLCAoaW50KXBFbnRyeS0+QWlkKTsKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTRkIiwgKGludClwRW50cnktPlBzTW9kZSk7CisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0xMGQiLDAvKnBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFNDb3VudGVyLkxhc3REYXRhUGFja2V0VGltZSovKTsgLy8gVG9EbworCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtMTBkIiwwLypwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhTQ291bnRlci5Ub3RhbFJ4Qnl0ZUNvdW50Ki8pOyAvLyBUb0RvCisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0xMGQiLDAvKnBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFNDb3VudGVyLlRvdGFsVHhCeXRlQ291bnQqLyk7IC8vIFRvRG8KKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTZkIixSYXRlSWRUb01icHNbcEFkLT5NYWNUYWIuQ29udGVudFtpXS5DdXJyVHhSYXRlXSk7CisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS02ZFxuIiwwLypSYXRlSWRUb01icHNbcEFkLT5NYWNUYWIuQ29udGVudFtpXS5MYXN0VHhSYXRlXSovKTsgLy8gVG9EbworCQl9CisJfQorCS8vIGZvciBjb21wYXRpYmxlIHdpdGggb2xkIEFQSSBqdXN0IGRvIHRoZSBwcmludGsgdG8gY29uc29sZQorCS8vd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKG1zZyk7CisJLy9pZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIG1zZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIiwgbXNnKSk7CisJfQorCisJa2ZyZWUobXNnKTsKK30KKyNlbmRpZiAvLyBVQ09TIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK0lOVAlTZXRfQkFTZXR1cF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKyAgICBVQ0hBUiBtYWNbNl0sIHRpZDsKKwljaGFyICp0b2tlbiwgc2VwVmFsdWVbXSA9ICI6IiwgREFTSCA9ICctJzsKKwlJTlQgaTsKKyAgICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKworLyoKKwlUaGUgQkFTZXR1cCBpbnVwdCBzdHJpbmcgZm9ybWF0IHNob3VsZCBiZSB4eDp4eDp4eDp4eDp4eDp4eC1kLAorCQk9PlRoZSBzaXggMiBkaWdpdCBoZXgtZGVjaW1hbCBudW1iZXIgcHJldmlvdXMgYXJlIHRoZSBNYWMgYWRkcmVzcywKKwkJPT5UaGUgc2V2ZW50aCBkZWNpbWFsIG51bWJlciBpcyB0aGUgdGlkIHZhbHVlLgorKi8KKwkvL3ByaW50aygiXG4lc1xuIiwgYXJnKTsKKworCWlmKHN0cmxlbihhcmcpIDwgMTkpICAvL01hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNyBwbHVzIHRoZSAiLSIgYW5kIHRpZCB2YWx1ZSBpbiBkZWNpbWFsIGZvcm1hdC4KKwkJcmV0dXJuIEZBTFNFOworCisJdG9rZW4gPSBzdHJjaHIoYXJnLCBEQVNIKTsKKwlpZiAoKHRva2VuICE9IE5VTEwpICYmIChzdHJsZW4odG9rZW4pPjEpKQorCXsKKwkJdGlkID0gc2ltcGxlX3N0cnRvbCgodG9rZW4rMSksIDAsIDEwKTsKKwkJaWYgKHRpZCA+IDE1KQorCQkJcmV0dXJuIEZBTFNFOworCisJCSp0b2tlbiA9ICdcMCc7CisJCWZvciAoaSA9IDAsIHRva2VuID0gcnN0cnRvayhhcmcsICZzZXBWYWx1ZVswXSk7IHRva2VuOyB0b2tlbiA9IHJzdHJ0b2soTlVMTCwgJnNlcFZhbHVlWzBdKSwgaSsrKQorCQl7CisJCQlpZigoc3RybGVuKHRva2VuKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCp0b2tlbikpIHx8ICghaXN4ZGlnaXQoKih0b2tlbisxKSkpKQorCQkJCXJldHVybiBGQUxTRTsKKwkJCUF0b0godG9rZW4sIChQVUNIQVIpKCZtYWNbaV0pLCAxKTsKKwkJfQorCQlpZihpICE9IDYpCisJCQlyZXR1cm4gRkFMU0U7CisKKwkJcHJpbnRrKCJcbiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LSUwMnhcbiIsIG1hY1swXSwgbWFjWzFdLAorCQkJCW1hY1syXSwgbWFjWzNdLCBtYWNbNF0sIG1hY1s1XSwgdGlkKTsKKworCSAgICBwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIG1hYyk7CisKKyAgICAJaWYgKHBFbnRyeSkgeworICAgICAgICAJcHJpbnRrKCJcblNldHVwIEJBIFNlc3Npb246IFRpZCA9ICVkXG4iLCB0aWQpOworCSAgICAgICAgQkFPcmlTZXNzaW9uU2V0VXAocEFkLCBwRW50cnksIHRpZCwgMCwgMTAwLCBUUlVFKTsKKyAgICAJfQorCisJCXJldHVybiBUUlVFOworCX0KKworCXJldHVybiBGQUxTRTsKKworfQorCitJTlQJU2V0X0JBRGVjbGluZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBiQkFEZWNsaW5lOworCisJYkJBRGVjbGluZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoYkJBRGVjbGluZSA9PSAwKQorCXsKKwkJcEFkLT5Db21tb25DZmcuYkJBRGVjbGluZSA9IEZBTFNFOworCX0KKwllbHNlIGlmIChiQkFEZWNsaW5lID09IDEpCisJeworCQlwQWQtPkNvbW1vbkNmZy5iQkFEZWNsaW5lID0gVFJVRTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQkFEZWNsaW5lX1Byb2M6OihCQURlY2xpbmU9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5iQkFEZWNsaW5lKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9CQU9yaVRlYXJEb3duX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworICAgIFVDSEFSIG1hY1s2XSwgdGlkOworCWNoYXIgKnRva2VuLCBzZXBWYWx1ZVtdID0gIjoiLCBEQVNIID0gJy0nOworCUlOVCBpOworICAgIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCisgICAgLy9wcmludGsoIlxuJXNcbiIsIGFyZyk7CisvKgorCVRoZSBCQU9yaVRlYXJEb3duIGludXB0IHN0cmluZyBmb3JtYXQgc2hvdWxkIGJlIHh4Onh4Onh4Onh4Onh4Onh4LWQsCisJCT0+VGhlIHNpeCAyIGRpZ2l0IGhleC1kZWNpbWFsIG51bWJlciBwcmV2aW91cyBhcmUgdGhlIE1hYyBhZGRyZXNzLAorCQk9PlRoZSBzZXZlbnRoIGRlY2ltYWwgbnVtYmVyIGlzIHRoZSB0aWQgdmFsdWUuCisqLworICAgIGlmKHN0cmxlbihhcmcpIDwgMTkpICAvL01hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNyBwbHVzIHRoZSAiLSIgYW5kIHRpZCB2YWx1ZSBpbiBkZWNpbWFsIGZvcm1hdC4KKwkJcmV0dXJuIEZBTFNFOworCisJdG9rZW4gPSBzdHJjaHIoYXJnLCBEQVNIKTsKKwlpZiAoKHRva2VuICE9IE5VTEwpICYmIChzdHJsZW4odG9rZW4pPjEpKQorCXsKKwkJdGlkID0gc2ltcGxlX3N0cnRvbCgodG9rZW4rMSksIDAsIDEwKTsKKwkJaWYgKHRpZCA+IE5VTV9PRl9USUQpCisJCQlyZXR1cm4gRkFMU0U7CisKKwkJKnRva2VuID0gJ1wwJzsKKwkJZm9yIChpID0gMCwgdG9rZW4gPSByc3RydG9rKGFyZywgJnNlcFZhbHVlWzBdKTsgdG9rZW47IHRva2VuID0gcnN0cnRvayhOVUxMLCAmc2VwVmFsdWVbMF0pLCBpKyspCisJCXsKKwkJCWlmKChzdHJsZW4odG9rZW4pICE9IDIpIHx8ICghaXN4ZGlnaXQoKnRva2VuKSkgfHwgKCFpc3hkaWdpdCgqKHRva2VuKzEpKSkpCisJCQkJcmV0dXJuIEZBTFNFOworCQkJQXRvSCh0b2tlbiwgKFBVQ0hBUikoJm1hY1tpXSksIDEpOworCQl9CisJCWlmKGkgIT0gNikKKwkJCXJldHVybiBGQUxTRTsKKworCSAgICBwcmludGsoIlxuJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngtJTAyeCIsIG1hY1swXSwgbWFjWzFdLAorCSAgICAgICAgICAgbWFjWzJdLCBtYWNbM10sIG1hY1s0XSwgbWFjWzVdLCB0aWQpOworCisJICAgIHBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgbWFjKTsKKworCSAgICBpZiAocEVudHJ5KSB7CisJICAgICAgICBwcmludGsoIlxuVGVhciBkb3duIE9yaSBCQSBTZXNzaW9uOiBUaWQgPSAlZFxuIiwgdGlkKTsKKyAgICAgICAgQkFPcmlTZXNzaW9uVGVhckRvd24ocEFkLCBwRW50cnktPkFpZCwgdGlkLCBGQUxTRSwgVFJVRSk7CisJICAgIH0KKworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlyZXR1cm4gRkFMU0U7CisKK30KKworSU5UCVNldF9CQVJlY1RlYXJEb3duX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworICAgIFVDSEFSIG1hY1s2XSwgdGlkOworCWNoYXIgKnRva2VuLCBzZXBWYWx1ZVtdID0gIjoiLCBEQVNIID0gJy0nOworCUlOVCBpOworICAgIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCisgICAgLy9wcmludGsoIlxuJXNcbiIsIGFyZyk7CisvKgorCVRoZSBCQVJlY1RlYXJEb3duIGludXB0IHN0cmluZyBmb3JtYXQgc2hvdWxkIGJlIHh4Onh4Onh4Onh4Onh4Onh4LWQsCisJCT0+VGhlIHNpeCAyIGRpZ2l0IGhleC1kZWNpbWFsIG51bWJlciBwcmV2aW91cyBhcmUgdGhlIE1hYyBhZGRyZXNzLAorCQk9PlRoZSBzZXZlbnRoIGRlY2ltYWwgbnVtYmVyIGlzIHRoZSB0aWQgdmFsdWUuCisqLworICAgIGlmKHN0cmxlbihhcmcpIDwgMTkpICAvL01hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNyBwbHVzIHRoZSAiLSIgYW5kIHRpZCB2YWx1ZSBpbiBkZWNpbWFsIGZvcm1hdC4KKwkJcmV0dXJuIEZBTFNFOworCisJdG9rZW4gPSBzdHJjaHIoYXJnLCBEQVNIKTsKKwlpZiAoKHRva2VuICE9IE5VTEwpICYmIChzdHJsZW4odG9rZW4pPjEpKQorCXsKKwkJdGlkID0gc2ltcGxlX3N0cnRvbCgodG9rZW4rMSksIDAsIDEwKTsKKwkJaWYgKHRpZCA+IE5VTV9PRl9USUQpCisJCQlyZXR1cm4gRkFMU0U7CisKKwkJKnRva2VuID0gJ1wwJzsKKwkJZm9yIChpID0gMCwgdG9rZW4gPSByc3RydG9rKGFyZywgJnNlcFZhbHVlWzBdKTsgdG9rZW47IHRva2VuID0gcnN0cnRvayhOVUxMLCAmc2VwVmFsdWVbMF0pLCBpKyspCisJCXsKKwkJCWlmKChzdHJsZW4odG9rZW4pICE9IDIpIHx8ICghaXN4ZGlnaXQoKnRva2VuKSkgfHwgKCFpc3hkaWdpdCgqKHRva2VuKzEpKSkpCisJCQkJcmV0dXJuIEZBTFNFOworCQkJQXRvSCh0b2tlbiwgKFBVQ0hBUikoJm1hY1tpXSksIDEpOworCQl9CisJCWlmKGkgIT0gNikKKwkJCXJldHVybiBGQUxTRTsKKworCQlwcmludGsoIlxuJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngtJTAyeCIsIG1hY1swXSwgbWFjWzFdLAorCQkgICAgICAgbWFjWzJdLCBtYWNbM10sIG1hY1s0XSwgbWFjWzVdLCB0aWQpOworCisJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgbWFjKTsKKworCQlpZiAocEVudHJ5KSB7CisJCSAgICBwcmludGsoIlxuVGVhciBkb3duIFJlYyBCQSBTZXNzaW9uOiBUaWQgPSAlZFxuIiwgdGlkKTsKKwkJICAgIEJBUmVjU2Vzc2lvblRlYXJEb3duKHBBZCwgcEVudHJ5LT5BaWQsIHRpZCwgRkFMU0UpOworCQl9CisKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJcmV0dXJuIEZBTFNFOworCit9CisKK0lOVAlTZXRfSHRCd19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBIdEJ3OworCisJSHRCdyA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJaWYgKEh0QncgPT0gQldfNDApCisJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPSBCV180MDsKKwllbHNlIGlmIChIdEJ3ID09IEJXXzIwKQorCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgID0gQldfMjA7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKKworCVNldENvbW1vbkhUKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRCd19Qcm9jOjooSHRCdz0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVykpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfSHRNY3NfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgSHRNY3MsIE1jc190bXA7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisgICAgQk9PTEVBTiBiQXV0b1JhdGUgPSBGQUxTRTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCU1jc190bXAgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKE1jc190bXAgPD0gMTUgfHwgTWNzX3RtcCA9PSAzMikKKwkJSHRNY3MgPSBNY3NfdG1wOworCWVsc2UKKwkJSHRNY3MgPSBNQ1NfQVVUTzsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IEh0TWNzOworCQlwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IChIdE1jcyA9PSBNQ1NfQVVUTykgPyBUUlVFOkZBTFNFOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRNY3NfUHJvYzo6KEh0TWNzPSVkLCBiQXV0b1R4UmF0ZVN3aXRjaCA9ICVkKVxuIiwKKwkJCQkJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTLCBwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCkpOworCisJCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA8IFBIWV8xMUFCR05fTUlYRUQpIHx8CisJCQkocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERSA8IE1PREVfSFRNSVgpKQorCQl7CisJICAgICAgICBpZiAoKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICE9IE1DU19BVVRPKSAmJgorCQkJCShIdE1jcyA+PSAwICYmIEh0TWNzIDw9IDMpICYmCisJICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGUgPT0gRklYRURfVFhNT0RFX0NDSykpCisJCQl7CisJCQkJUlRNUFNldERlc2lyZWRSYXRlcyhwQWQsIChMT05HKSAoUmF0ZUlkVG9NYnBzW0h0TWNzXSAqIDEwMDAwMDApKTsKKwkJCX0KKwkgICAgICAgIGVsc2UgaWYgKChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyAhPSBNQ1NfQVVUTykgJiYKKwkJCQkJKEh0TWNzID49IDAgJiYgSHRNY3MgPD0gNykgJiYKKwkgICAgICAgICAgICAJKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGUgPT0gRklYRURfVFhNT0RFX09GRE0pKQorCQkJeworCQkJCVJUTVBTZXREZXNpcmVkUmF0ZXMocEFkLCAoTE9ORykgKFJhdGVJZFRvTWJwc1tIdE1jcys0XSAqIDEwMDAwMDApKTsKKwkJCX0KKwkJCWVsc2UKKwkJCQliQXV0b1JhdGUgPSBUUlVFOworCisJCQlpZiAoYkF1dG9SYXRlKQorCQkJeworCSAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTX0FVVE87CisJCQkJUlRNUFNldERlc2lyZWRSYXRlcyhwQWQsIC0xKTsKKwkJCX0KKwkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdE1jc19Qcm9jOjooRml4ZWRUeE1vZGU9JWQpXG4iLHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGUpKTsKKwkJfQorICAgICAgICBpZiAoQURIT0NfT04ocEFkKSkKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCVNldENvbW1vbkhUKHBBZCk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9IdEdpX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIEh0R2k7CisKKwlIdEdpID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmICggSHRHaSA9PSBHSV80MDApCisJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJID0gR0lfNDAwOworCWVsc2UgaWYgKCBIdEdpID09IEdJXzgwMCApCisJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJID0gR0lfODAwOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworCVNldENvbW1vbkhUKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRHaV9Qcm9jOjooU2hvcnRHST0lZClcbiIscEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0kpKTsKKworCXJldHVybiBUUlVFOworfQorCisKK0lOVAlTZXRfSHRUeEJBU2l6ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVQ0hBUiBTaXplOworCisJU2l6ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoU2l6ZSA8PTAgfHwgU2l6ZSA+PTY0KQorCXsKKwkJU2l6ZSA9IDg7CisJfQorCXBBZC0+Q29tbW9uQ2ZnLlR4QkFTaXplID0gU2l6ZS0xOworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9IdFR4QkFTaXplIDo6KFR4QkFTaXplPSAlZClcbiIsIFNpemUpKTsKKworCXJldHVybiBUUlVFOworfQorCisKK0lOVAlTZXRfSHRPcE1vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChWYWx1ZSA9PSBIVE1PREVfR0YpCisJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREUgID0gSFRNT0RFX0dGOworCWVsc2UgaWYgKCBWYWx1ZSA9PSBIVE1PREVfTU0gKQorCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFICA9IEhUTU9ERV9NTTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlTZXRDb21tb25IVChwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0T3BNb2RlX1Byb2M6OihIdE9wTW9kZT0lZClcbiIscEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERSkpOworCisJcmV0dXJuIFRSVUU7CisKK30KKworSU5UCVNldF9IdFN0YmNfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChWYWx1ZSA9PSBTVEJDX1VTRSkKKwkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkMgPSBTVEJDX1VTRTsKKwllbHNlIGlmICggVmFsdWUgPT0gU1RCQ19OT05FICkKKwkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkMgPSBTVEJDX05PTkU7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJU2V0Q29tbW9uSFQocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9TdGJjX1Byb2M6OihIdFN0YmM9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9IdEh0Y19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCWlmIChWYWx1ZSA9PSAwKQorCQlwQWQtPkhUQ0VuYWJsZSA9IEZBTFNFOworCWVsc2UgaWYgKCBWYWx1ZSA9PTEgKQorICAgICAgICAJcEFkLT5IVENFbmFibGUgPSBUUlVFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdEh0Y19Qcm9jOjooSHRIdGM9JWQpXG4iLHBBZC0+SFRDRW5hYmxlKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9IdEV4dGNoYV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKFZhbHVlID09IDApCisJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgID0gRVhUQ0hBX0JFTE9XOworCWVsc2UgaWYgKCBWYWx1ZSA9PTEgKQorICAgICAgICBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRVhUQ0hBX0FCT1ZFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworCVNldENvbW1vbkhUKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRFeHRjaGFfUHJvYzo6KEh0RXh0Y2hhPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9IdE1wZHVEZW5zaXR5X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKFZhbHVlIDw9NyAmJiBWYWx1ZSA+PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkgPSBWYWx1ZTsKKwllbHNlCisJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eSA9IDQ7CisKKwlTZXRDb21tb25IVChwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0TXBkdURlbnNpdHlfUHJvYzo6KEh0TXBkdURlbnNpdHk9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfSHRCYVdpblNpemVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKworCWlmIChWYWx1ZSA+PTEgJiYgVmFsdWUgPD0gNjQpCisJeworCQlwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gVmFsdWU7CisJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSBWYWx1ZTsKKwl9CisJZWxzZQorCXsKKyAgICAgICAgcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IDY0OworCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gNjQ7CisJfQorCisJU2V0Q29tbW9uSFQocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdEJhV2luU2l6ZV9Qcm9jOjooSHRCYVdpblNpemU9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQpKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQJU2V0X0h0UmRnX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKFZhbHVlID09IDApCisJCXBBZC0+Q29tbW9uQ2ZnLmJSZGcgPSBGQUxTRTsKKwllbHNlIGlmICggVmFsdWUgPT0xICkKKwl7CisJCXBBZC0+SFRDRW5hYmxlID0gVFJVRTsKKyAgICAgICAgCXBBZC0+Q29tbW9uQ2ZnLmJSZGcgPSBUUlVFOworCX0KKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlTZXRDb21tb25IVChwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0UmRnX1Byb2M6OihIdFJkZz0lZClcbiIscEFkLT5Db21tb25DZmcuYlJkZykpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfSHRMaW5rQWRhcHRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJaWYgKFZhbHVlID09IDApCisJCXBBZC0+YkxpbmtBZGFwdCA9IEZBTFNFOworCWVsc2UgaWYgKCBWYWx1ZSA9PTEgKQorCXsKKwkJCXBBZC0+SFRDRW5hYmxlID0gVFJVRTsKKwkJCXBBZC0+YkxpbmtBZGFwdCA9IFRSVUU7CisJfQorCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdExpbmtBZGFwdF9Qcm9jOjooSHRMaW5rQWRhcHQ9JWQpXG4iLHBBZC0+YkxpbmtBZGFwdCkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfSHRBbXNkdV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKwlpZiAoVmFsdWUgPT0gMCkKKwkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1RW5hYmxlID0gRkFMU0U7CisJZWxzZSBpZiAoIFZhbHVlID09IDEgKQorICAgICAgICBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGUgPSBUUlVFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworCVNldENvbW1vbkhUKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRBbXNkdV9Qcm9jOjooSHRBbXNkdT0lZClcbiIscEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1RW5hYmxlKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9IdEF1dG9CYV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKwlpZiAoVmFsdWUgPT0gMCkKKwkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IEZBTFNFOworICAgIGVsc2UgaWYgKFZhbHVlID09IDEpCisJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBUUlVFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworICAgIHBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBOworCVNldENvbW1vbkhUKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRBdXRvQmFfUHJvYzo6KEh0QXV0b0JhPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBKSk7CisKKwlyZXR1cm4gVFJVRTsKKworfQorCitJTlQJU2V0X0h0UHJvdGVjdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKwlpZiAoVmFsdWUgPT0gMCkKKwkJcEFkLT5Db21tb25DZmcuYkhUUHJvdGVjdCA9IEZBTFNFOworICAgIGVsc2UgaWYgKFZhbHVlID09IDEpCisJCXBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QgPSBUUlVFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdFByb3RlY3RfUHJvYzo6KEh0UHJvdGVjdD0lZClcbiIscEFkLT5Db21tb25DZmcuYkhUUHJvdGVjdCkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfU2VuZFBTTVBBY3Rpb25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisgICAgVUNIQVIgbWFjWzZdLCBtb2RlOworCWNoYXIgKnRva2VuLCBzZXBWYWx1ZVtdID0gIjoiLCBEQVNIID0gJy0nOworCUlOVCBpOworICAgIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCisgICAgLy9wcmludGsoIlxuJXNcbiIsIGFyZyk7CisvKgorCVRoZSBCQVJlY1RlYXJEb3duIGludXB0IHN0cmluZyBmb3JtYXQgc2hvdWxkIGJlIHh4Onh4Onh4Onh4Onh4Onh4LWQsCisJCT0+VGhlIHNpeCAyIGRpZ2l0IGhleC1kZWNpbWFsIG51bWJlciBwcmV2aW91cyBhcmUgdGhlIE1hYyBhZGRyZXNzLAorCQk9PlRoZSBzZXZlbnRoIGRlY2ltYWwgbnVtYmVyIGlzIHRoZSBtb2RlIHZhbHVlLgorKi8KKyAgICBpZihzdHJsZW4oYXJnKSA8IDE5KSAgLy9NYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcgcGx1cyB0aGUgIi0iIGFuZCBtb2RlIHZhbHVlIGluIGRlY2ltYWwgZm9ybWF0LgorCQlyZXR1cm4gRkFMU0U7CisKKyAgIAl0b2tlbiA9IHN0cmNocihhcmcsIERBU0gpOworCWlmICgodG9rZW4gIT0gTlVMTCkgJiYgKHN0cmxlbih0b2tlbik+MSkpCisJeworCQltb2RlID0gc2ltcGxlX3N0cnRvbCgodG9rZW4rMSksIDAsIDEwKTsKKwkJaWYgKG1vZGUgPiBNTVBTX0VOQUJMRSkKKwkJCXJldHVybiBGQUxTRTsKKworCQkqdG9rZW4gPSAnXDAnOworCQlmb3IgKGkgPSAwLCB0b2tlbiA9IHJzdHJ0b2soYXJnLCAmc2VwVmFsdWVbMF0pOyB0b2tlbjsgdG9rZW4gPSByc3RydG9rKE5VTEwsICZzZXBWYWx1ZVswXSksIGkrKykKKwkJeworCQkJaWYoKHN0cmxlbih0b2tlbikgIT0gMikgfHwgKCFpc3hkaWdpdCgqdG9rZW4pKSB8fCAoIWlzeGRpZ2l0KCoodG9rZW4rMSkpKSkKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQlBdG9IKHRva2VuLCAoUFVDSEFSKSgmbWFjW2ldKSwgMSk7CisJCX0KKwkJaWYoaSAhPSA2KQorCQkJcmV0dXJuIEZBTFNFOworCisJCXByaW50aygiXG4lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC0lMDJ4IiwgbWFjWzBdLCBtYWNbMV0sCisJCSAgICAgICBtYWNbMl0sIG1hY1szXSwgbWFjWzRdLCBtYWNbNV0sIG1vZGUpOworCisJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgbWFjKTsKKworCQlpZiAocEVudHJ5KSB7CisJCSAgICBwcmludGsoIlxuU2VuZFBTTVBBY3Rpb24gTUlQUyBtb2RlID0gJWRcbiIsIG1vZGUpOworCQkgICAgU2VuZFBTTVBBY3Rpb24ocEFkLCBwRW50cnktPkFpZCwgbW9kZSk7CisJCX0KKworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlyZXR1cm4gRkFMU0U7CisKKworfQorCitJTlQJU2V0X0h0TUlNT1BTbW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmIChWYWx1ZSA8PTMgJiYgVmFsdWUgPj0gMCkKKwkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gVmFsdWU7CisJZWxzZQorCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSAzOworCisJU2V0Q29tbW9uSFQocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdE1JTU9QU21vZGVfUHJvYzo6KE1JTU9QUyBtb2RlPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUpKTsKKworCXJldHVybiBUUlVFOworfQorCisKK0lOVAlTZXRfRm9yY2VTaG9ydEdJX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCWlmIChWYWx1ZSA9PSAwKQorCQlwQWQtPldJRkl0ZXN0YmVkLmJTaG9ydEdJID0gRkFMU0U7CisJZWxzZSBpZiAoVmFsdWUgPT0gMSkKKwkJcEFkLT5XSUZJdGVzdGJlZC5iU2hvcnRHSSA9IFRSVUU7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJU2V0Q29tbW9uSFQocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9Gb3JjZVNob3J0R0lfUHJvYzo6KEZvcmNlU2hvcnRHST0lZClcbiIsIHBBZC0+V0lGSXRlc3RiZWQuYlNob3J0R0kpKTsKKworCXJldHVybiBUUlVFOworfQorCisKKworSU5UCVNldF9Gb3JjZUdGX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCWlmIChWYWx1ZSA9PSAwKQorCQlwQWQtPldJRkl0ZXN0YmVkLmJHcmVlbkZpZWxkID0gRkFMU0U7CisJZWxzZSBpZiAoVmFsdWUgPT0gMSkKKwkJcEFkLT5XSUZJdGVzdGJlZC5iR3JlZW5GaWVsZCA9IFRSVUU7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJU2V0Q29tbW9uSFQocEFkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9Gb3JjZUdGX1Byb2M6OihGb3JjZUdGPSVkKVxuIiwgcEFkLT5XSUZJdGVzdGJlZC5iR3JlZW5GaWVsZCkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfSHRNaW1vUHNfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUxPTkcgVmFsdWU7CisKKwlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJaWYgKFZhbHVlID09IDApCisJCXBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUgPSBGQUxTRTsKKwllbHNlIGlmIChWYWx1ZSA9PSAxKQorCQlwQWQtPkNvbW1vbkNmZy5iTUlNT1BTRW5hYmxlID0gVFJVRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRNaW1vUHNfUHJvYzo6KEh0TWltb1BzPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5iTUlNT1BTRW5hYmxlKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitJTlQJU2V0Q29tbW9uSFQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJT0lEX1NFVF9IVF9QSFlNT0RFCQlTZXRIVDsKKworCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlIDwgUEhZXzExQUJHTl9NSVhFRCkKKwkJcmV0dXJuIEZBTFNFOworCisJU2V0SFQuUGh5TW9kZSA9IHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGU7CisJU2V0SFQuVHJhbnNtaXRObyA9ICgoVUNIQVIpcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCk7CisJU2V0SFQuSHRNb2RlID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREU7CisJU2V0SFQuRXh0T2Zmc2V0ID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEE7CisJU2V0SFQuTUNTID0gTUNTX0FVVE87CisJU2V0SFQuQlcgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXOworCVNldEhULlNUQkMgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkM7CisJU2V0SFQuU0hPUlRHSSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSTsKKworCVJUTVBTZXRIVChwQWQsICZTZXRIVCk7CisKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworSU5UCVNldF9GaXhlZFR4TW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVQ0hBUglmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9IVDsKKworCWlmIChzdHJjbXAoYXJnLCAiT0ZETSIpID09IDAgfHwgc3RyY21wKGFyZywgIm9mZG0iKSA9PSAwKQorCXsKKwkJZml4X3R4X21vZGUgPSBGSVhFRF9UWE1PREVfT0ZETTsKKwl9CisJZWxzZSBpZiAoc3RyY21wKGFyZywgIkNDSyIpID09IDAgfHwgc3RyY21wKGFyZywgImNjayIpID09IDApCisJeworICAgICAgICBmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9DQ0s7CisJfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSA9IGZpeF90eF9tb2RlOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0ZpeGVkVHhNb2RlX1Byb2M6OihGaXhlZFR4TW9kZT0lZClcbiIsIGZpeF90eF9tb2RlKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworI2lmZGVmIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUCitJTlQJU2V0X09wTW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVTE9ORyBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworI2lmZGVmIFJUMjg3MAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfU1RBUlRfVVApKQorI2VuZGlmIC8vIFJUMjg3MCAvLworCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQ2FuIG5vdCBzd2l0Y2ggb3BlcmF0ZSBtb2RlIG9uIGludGVyZmFjZSB1cCAhISBcbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmIChWYWx1ZSA9PSAwKQorCQlwQWQtPk9wTW9kZSA9IE9QTU9ERV9TVEE7CisJZWxzZSBpZiAoVmFsdWUgPT0gMSkKKwkJcEFkLT5PcE1vZGUgPSBPUE1PREVfQVA7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X09wTW9kZV9Qcm9jOjooT3BNb2RlPSVzKVxuIiwgcEFkLT5PcE1vZGUgPT0gMSA/ICJBUCBNb2RlIiA6ICJTVEEgTW9kZSIpKTsKKworCXJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUIC8vCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworUENIQVIgICBSVE1QR2V0UmFsaW5rQXV0aE1vZGVTdHIoCisgICAgSU4gIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgYXV0aE1vZGUpCit7CisJc3dpdGNoKGF1dGhNb2RlKQorCXsKKwkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOgorCQkJcmV0dXJuICJPUEVOIjsKKwkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s6CisJCQlyZXR1cm4gIldQQVBTSyI7CisJCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkOgorCQkJcmV0dXJuICJTSEFSRUQiOworCQljYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQToKKwkJCXJldHVybiAiV1BBIjsKKwkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEEyOgorCQkJcmV0dXJuICJXUEEyIjsKKwkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOgorCQkJcmV0dXJuICJXUEEyUFNLIjsKKyAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSzoKKwkJCXJldHVybiAiV1BBUFNLV1BBMlBTSyI7CisgICAgICAgIGNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMVdQQTI6CisJCQlyZXR1cm4gIldQQTFXUEEyIjsKKwkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOgorCQkJcmV0dXJuICJXUEFOT05FIjsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAiVU5LTk9XIjsKKwl9Cit9CisKK1BDSEFSICAgUlRNUEdldFJhbGlua0VuY3J5TW9kZVN0cigKKyAgICBJTiAgVVNIT1JUIGVuY3J5TW9kZSkKK3sKKwlzd2l0Y2goZW5jcnlNb2RlKQorCXsKKwkJY2FzZSBOZGlzODAyXzExV0VQRGlzYWJsZWQ6CisJCQlyZXR1cm4gIk5PTkUiOworCQljYXNlIE5kaXM4MDJfMTFXRVBFbmFibGVkOgorCQkJcmV0dXJuICJXRVAiOworCQljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ6CisJCQlyZXR1cm4gIlRLSVAiOworCQljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ6CisJCQlyZXR1cm4gIkFFUyI7CisgICAgICAgIGNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZDoKKwkJCXJldHVybiAiVEtJUEFFUyI7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gIlVOS05PVyI7CisJfQorfQorCitJTlQgUlRNUFNob3dDZmdWYWx1ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwTmFtZSwKKwlJTglQVUNIQVIJCQlwQnVmKQoreworCUlOVAlTdGF0dXMgPSAwOworCisJZm9yIChQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DID0gUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DOyBQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DLT5uYW1lOyBQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DKyspCisJeworCQlpZiAoIXN0cmNtcChwTmFtZSwgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQy0+bmFtZSkpCisJCXsKKwkJCWlmKFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MtPnNob3dfcHJvYyhwQWQsIHBCdWYpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQlicmVhazsgIC8vRXhpdCBmb3IgbG9vcC4KKwkJfQorCX0KKworCWlmKFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MtPm5hbWUgPT0gTlVMTCkKKwl7CisJCXNwcmludGYocEJ1ZiwgIlxuIik7CisJCWZvciAoUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQyA9IFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQzsgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQy0+bmFtZTsgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQysrKQorCQkJc3ByaW50ZihwQnVmLCAiJXMlc1xuIiwgcEJ1ZiwgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQy0+bmFtZSk7CisJfQorCisJcmV0dXJuIFN0YXR1czsKK30KKworSU5UCVNob3dfU1NJRF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLlNzaWQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCXJldHVybiAwOworfQorCitJTlQJU2hvd19XaXJlbGVzc01vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzd2l0Y2gocEFkLT5Db21tb25DZmcuUGh5TW9kZSkKKwl7CisJCWNhc2UgUEhZXzExQkdfTUlYRUQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdDExQi9HIik7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfMTFCOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMUIiKTsKKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMUE6CisJCQlzcHJpbnRmKHBCdWYsICJcdDExQSIpOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExQUJHX01JWEVEOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMUEvQi9HIik7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfMTFHOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMUciKTsKKwkJCWJyZWFrOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQljYXNlIFBIWV8xMUFCR05fTUlYRUQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdDExQS9CL0cvTiIpOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExTl8yXzRHOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMU4gb25seSB3aXRoIDIuNEciKTsKKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMUdOX01JWEVEOgorCQkJc3ByaW50ZihwQnVmLCAiXHQxMUcvTiIpOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExQU5fTUlYRUQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdDExQS9OIik7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfMTFCR05fTUlYRUQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdDExQi9HL04iKTsKKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMUFHTl9NSVhFRDoKKwkJCXNwcmludGYocEJ1ZiwgIlx0MTFBL0cvTiIpOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExTl81RzoKKwkJCXNwcmludGYocEJ1ZiwgIlx0MTFOIG9ubHkgd2l0aCA1RyIpOworCQkJYnJlYWs7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCWRlZmF1bHQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSglZCkiLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKTsKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworCitJTlQJU2hvd19UeEJ1cnN0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ID8gIlRSVUUiOiJGQUxTRSIpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19UeFByZWFtYmxlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3dpdGNoKHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUpCisJeworCQljYXNlIFJ0ODAyXzExUHJlYW1ibGVTaG9ydDoKKwkJCXNwcmludGYocEJ1ZiwgIlx0U2hvcnQiKTsKKwkJCWJyZWFrOworCQljYXNlIFJ0ODAyXzExUHJlYW1ibGVMb25nOgorCQkJc3ByaW50ZihwQnVmLCAiXHRMb25nIik7CisJCQlicmVhazsKKwkJY2FzZSBSdDgwMl8xMVByZWFtYmxlQXV0bzoKKwkJCXNwcmludGYocEJ1ZiwgIlx0QXV0byIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSglbHUpIiwgcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSk7CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfVHhQb3dlcl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JWx1IiwgcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19DaGFubmVsX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3ByaW50ZihwQnVmLCAiXHQlZCIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19CR1Byb3RlY3Rpb25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzd2l0Y2gocEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uKQorCXsKKwkJY2FzZSAxOiAvL0Fsd2F5cyBPbgorCQkJc3ByaW50ZihwQnVmLCAiXHRPTiIpOworCQkJYnJlYWs7CisJCWNhc2UgMjogLy9BbHdheXMgT0ZGCisJCQlzcHJpbnRmKHBCdWYsICJcdE9GRiIpOworCQkJYnJlYWs7CisJCWNhc2UgMDogLy9BVVRPCisJCQlzcHJpbnRmKHBCdWYsICJcdEF1dG8iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJWx1KSIsIHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbik7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X1JUU1RocmVzaG9sZF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXUiLCBwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19GcmFnVGhyZXNob2xkX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3ByaW50ZihwQnVmLCAiXHQldSIsIHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorSU5UCVNob3dfSHRCd19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCWlmIChwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDApCisJeworCQlzcHJpbnRmKHBCdWYsICJcdDQwIE1IeiIpOworCX0KKwllbHNlCisJeworICAgICAgICBzcHJpbnRmKHBCdWYsICJcdDIwIE1IeiIpOworCX0KKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfSHRNY3NfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXNwcmludGYocEJ1ZiwgIlx0JXUiLCBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X0h0R2lfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzd2l0Y2gocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0kpCisJeworCQljYXNlIEdJXzQwMDoKKwkJCXNwcmludGYocEJ1ZiwgIlx0R0lfNDAwIik7CisJCQlicmVhazsKKwkJY2FzZSBHSV84MDA6CisJCQlzcHJpbnRmKHBCdWYsICJcdEdJXzgwMCIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSgldSkiLCBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSSk7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X0h0T3BNb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3dpdGNoKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREUpCisJeworCQljYXNlIEhUTU9ERV9HRjoKKwkJCXNwcmludGYocEJ1ZiwgIlx0R0YiKTsKKwkJCWJyZWFrOworCQljYXNlIEhUTU9ERV9NTToKKwkJCXNwcmludGYocEJ1ZiwgIlx0TU0iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJXUpIiwgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERSk7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X0h0RXh0Y2hhX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3dpdGNoKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEpCisJeworCQljYXNlIEVYVENIQV9CRUxPVzoKKwkJCXNwcmludGYocEJ1ZiwgIlx0QmVsb3ciKTsKKwkJCWJyZWFrOworCQljYXNlIEVYVENIQV9BQk9WRToKKwkJCXNwcmludGYocEJ1ZiwgIlx0QWJvdmUiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJXUpIiwgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSk7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworSU5UCVNob3dfSHRNcGR1RGVuc2l0eV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXUiLCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19IdEJhV2luU2l6ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXUiLCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0KTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfSHRSZGdfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCVzIiwgcEFkLT5Db21tb25DZmcuYlJkZyA/ICJUUlVFIjoiRkFMU0UiKTsKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfSHRBbXNkdV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGUgPyAiVFJVRSI6IkZBTFNFIik7CisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X0h0QXV0b0JhX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPyAiVFJVRSI6IkZBTFNFIik7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK0lOVAlTaG93X0NvdW50cnlSZWdpb25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCVkIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbik7CisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X0NvdW50cnlSZWdpb25BQmFuZF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JWQiLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19Db3VudHJ5Q29kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZSk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCitJTlQJU2hvd19Qa3RBZ2dyZWdhdGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzcHJpbnRmKHBCdWYsICJcdCVzIiwgcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSA/ICJUUlVFIjoiRkFMU0UiKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvLyBBR0dSRUdBVElPTl9TVVBQT1JUIC8vCisKKyNpZmRlZiBXTU1fU1VQUE9SVAorSU5UCVNob3dfV21tQ2FwYWJsZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlID8gIlRSVUUiOiJGQUxTRSIpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gV01NX1NVUFBPUlQgLy8KKworSU5UCVNob3dfSUVFRTgwMjExSF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA/ICJUUlVFIjoiRkFMU0UiKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorSU5UCVNob3dfTmV0d29ya1R5cGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlzd2l0Y2gocEFkLT5TdGFDZmcuQnNzVHlwZSkKKwl7CisJCWNhc2UgQlNTX0FESE9DOgorCQkJc3ByaW50ZihwQnVmLCAiXHRBZGhvYyIpOworCQkJYnJlYWs7CisJCWNhc2UgQlNTX0lORlJBOgorCQkJc3ByaW50ZihwQnVmLCAiXHRJbmZyYSIpOworCQkJYnJlYWs7CisJCWNhc2UgQlNTX0FOWToKKwkJCXNwcmludGYocEJ1ZiwgIlx0QW55Iik7CisJCQlicmVhazsKKwkJY2FzZSBCU1NfTU9OSVRPUjoKKwkJCXNwcmludGYocEJ1ZiwgIlx0TW9uaXRvciIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSglZCkiLCBwQWQtPlN0YUNmZy5Cc3NUeXBlKTsKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworSU5UCVNob3dfQXV0aE1vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFCUF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCUF1dGhNb2RlID0gcEFkLT5TdGFDZmcuQXV0aE1vZGU7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlpZiAoKEF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pICYmCisJCShBdXRoTW9kZSA8PSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSykpCisJCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBSVE1QR2V0UmFsaW5rQXV0aE1vZGVTdHIoQXV0aE1vZGUpKTsKKwllbHNlCisJCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCVkKSIsIEF1dGhNb2RlKTsKKworCXJldHVybiAwOworfQorCitJTlQJU2hvd19FbmNyeXBUeXBlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJTkRJU184MDJfMTFfV0VQX1NUQVRVUwlXZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlXZXBTdGF0dXMgPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlpZiAoKFdlcFN0YXR1cyA+PSBOZGlzODAyXzExV0VQRW5hYmxlZCkgJiYKKwkJKFdlcFN0YXR1cyA8PSBOZGlzODAyXzExRW5jcnlwdGlvbjRLZXlBYnNlbnQpKQorCQlzcHJpbnRmKHBCdWYsICJcdCVzIiwgUlRNUEdldFJhbGlua0VuY3J5TW9kZVN0cihXZXBTdGF0dXMpKTsKKwllbHNlCisJCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCVkKSIsIFdlcFN0YXR1cyk7CisKKwlyZXR1cm4gMDsKK30KKworSU5UCVNob3dfRGVmYXVsdEtleUlEX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJVUNIQVIgRGVmYXVsdEtleUlkID0gMDsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCURlZmF1bHRLZXlJZCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCXNwcmludGYocEJ1ZiwgIlx0JWQiLCBEZWZhdWx0S2V5SWQpOworCisJcmV0dXJuIDA7Cit9CisKK0lOVAlTaG93X1dlcEtleV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICBJTlQJCQkJS2V5SWR4LAorCU9VVAlQVUNIQVIJCQlwQnVmKQoreworCVVDSEFSICAgS2V5WzE2XSA9IHswfSwgS2V5TGVuZ3RoID0gMDsKKwlJTlQJCWluZGV4ID0gQlNTMDsKKworCUtleUxlbmd0aCA9IHBBZC0+U2hhcmVkS2V5W2luZGV4XVtLZXlJZHhdLktleUxlbjsKKwlOZGlzTW92ZU1lbW9yeShLZXksIHBBZC0+U2hhcmVkS2V5W2luZGV4XVtLZXlJZHhdLktleSwgS2V5TGVuZ3RoKTsKKworCS8vY2hlY2sga2V5IHN0cmluZyBpcyBBU0NJSSBvciBub3QKKyAgICBpZiAoUlRNUENoZWNrU3RyUHJpbnRBYmxlKEtleSwgS2V5TGVuZ3RoKSkKKyAgICAgICAgc3ByaW50ZihwQnVmLCAiXHQlcyIsIEtleSk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaW50IGlkeDsKKyAgICAgICAgc3ByaW50ZihwQnVmLCAiXHQiKTsKKyAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBLZXlMZW5ndGg7IGlkeCsrKQorICAgICAgICAgICAgc3ByaW50ZihwQnVmK3N0cmxlbihwQnVmKSwgIiUwMlgiLCBLZXlbaWR4XSk7CisgICAgfQorCXJldHVybiAwOworfQorCitJTlQJU2hvd19LZXkxX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJU2hvd19XZXBLZXlfUHJvYyhwQWQsIDAsIHBCdWYpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19LZXkyX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJU2hvd19XZXBLZXlfUHJvYyhwQWQsIDEsIHBCdWYpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19LZXkzX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJU2hvd19XZXBLZXlfUHJvYyhwQWQsIDIsIHBCdWYpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19LZXk0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVQ0hBUgkJCXBCdWYpCit7CisJU2hvd19XZXBLZXlfUHJvYyhwQWQsIDMsIHBCdWYpOworCXJldHVybiAwOworfQorCitJTlQJU2hvd19XUEFQU0tfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJUFVDSEFSCQkJcEJ1ZikKK3sKKwlJTlQgCWlkeDsKKwlVQ0hBUglQTUtbMzJdID0gezB9OworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlOZGlzTW92ZU1lbW9yeShQTUssIHBBZC0+U3RhQ2ZnLlBNSywgMzIpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisgICAgc3ByaW50ZihwQnVmLCAiXHRQTUsgPSAiKTsKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IDMyOyBpZHgrKykKKyAgICAgICAgc3ByaW50ZihwQnVmK3N0cmxlbihwQnVmKSwgIiUwMlgiLCBQTUtbaWR4XSk7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX3Nhbml0eS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX3Nhbml0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMjQzMjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fc2FuaXR5LmMKQEAgLTAsMCArMSwxNjYzIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXNhbml0eS5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSm9obiBDaGFuZyAgMjAwNC0wOS0wMSAgICAgIGFkZCBXTU0gc3VwcG9ydAorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworCitleHRlcm4gVUNIQVIJQ0lTQ09fT1VJW107CisKK2V4dGVybiBVQ0hBUglXUEFfT1VJW107CitleHRlcm4gVUNIQVIJUlNOX09VSVtdOworZXh0ZXJuIFVDSEFSCVdNRV9JTkZPX0VMRU1bXTsKK2V4dGVybiBVQ0hBUglXTUVfUEFSTV9FTEVNW107CitleHRlcm4gVUNIQVIJQ2N4MlFvc0luZm9bXTsKK2V4dGVybiBVQ0hBUglSQUxJTktfT1VJW107CitleHRlcm4gVUNIQVIJQlJPQURDT01fT1VJW107CitleHRlcm4gVUNIQVIgICAgV1BTX09VSVtdOworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBNbG1lQWRkQkFSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMikKK3sKKyAgICBQTUxNRV9BRERCQV9SRVFfU1RSVUNUICAgcEluZm87CisKKyAgICBwSW5mbyA9IChNTE1FX0FEREJBX1JFUV9TVFJVQ1QgKilNc2c7CisKKyAgICBpZiAoKE1zZ0xlbiAhPSBzaXplb2YoTUxNRV9BRERCQV9SRVFfU1RSVUNUKSkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lQWRkQkFSZXFTYW5pdHkgZmFpbCAtIG1lc3NhZ2UgbGVuZ2h0IG5vdCBjb3JyZWN0LlxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKChwSW5mby0+V2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lQWRkQkFSZXFTYW5pdHkgZmFpbCAtIFRoZSBwZWVyIE1hYyBpcyBub3QgYXNzb2NpYXRlZCB5ZXQuXG4iKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKwkvKgorICAgIGlmICgocEluZm8tPkJhQnVmU2l6ZSA+IE1BWF9SWF9SRU9SREVSQlVGKSB8fCAocEluZm8tPkJhQnVmU2l6ZSA8IDIpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZUFkZEJBUmVxU2FuaXR5IGZhaWwgLSBSeCBSZW9yZGVyaW5nIGJ1ZmZlciB0b28gYmlnIG9yIHRvbyBzbWFsbFxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCSovCisKKyAgICBpZiAoKHBJbmZvLT5wQWRkclswXSYweDAxKSA9PSAweDAxKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZUFkZEJBUmVxU2FuaXR5IGZhaWwgLSBicm9hZGNhc3QgYWRkcmVzcyBub3Qgc3VwcG9ydCBCQVxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjaworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIE1sbWVEZWxCQVJlcVNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuKQoreworCU1MTUVfREVMQkFfUkVRX1NUUlVDVCAqcEluZm87CisJcEluZm8gPSAoTUxNRV9ERUxCQV9SRVFfU1RSVUNUICopTXNnOworCisgICAgaWYgKChNc2dMZW4gIT0gc2l6ZW9mKE1MTUVfREVMQkFfUkVRX1NUUlVDVCkpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTWxtZURlbEJBUmVxU2FuaXR5IGZhaWwgLSBtZXNzYWdlIGxlbmdodCBub3QgY29ycmVjdC5cbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGlmICgocEluZm8tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTWxtZURlbEJBUmVxU2FuaXR5IGZhaWwgLSBUaGUgcGVlciBNYWMgaXMgbm90IGFzc29jaWF0ZWQgeWV0LlxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKChwSW5mby0+VElEICYgMHhmMCkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJNbG1lRGVsQkFSZXFTYW5pdHkgZmFpbCAtIFRoZSBwZWVyIFRJRCBpcyBpbmNvcnJlY3QuXG4iKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKwlpZiAoTmRpc0VxdWFsTWVtb3J5KHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkFkZHIsIHBJbmZvLT5BZGRyLCBNQUNfQUREUl9MRU4pID09IDApCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJNbG1lRGVsQkFSZXFTYW5pdHkgZmFpbCAtIHRoZSBwZWVyIGFkZHIgZG9zZW4ndCBleGlzdC5cbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCitCT09MRUFOIFBlZXJBZGRCQVJlcUFjdGlvblNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpwTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKwlPVVQgUFVDSEFSIHBBZGRyMikKK3sKKwlQRlJBTUVfODAyXzExIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKXBNc2c7CisJUEZSQU1FX0FEREJBX1JFUSBwQWRkRnJhbWU7CisJcEFkZEZyYW1lID0gKFBGUkFNRV9BRERCQV9SRVEpKHBNc2cpOworCWlmIChNc2dMZW4gPCAoc2l6ZW9mKEZSQU1FX0FEREJBX1JFUSkpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHk6IEFEREJBIFJlcXVlc3QgZnJhbWUgbGVuZ3RoIHNpemUgPSAlbGQgaW5jb3JyZWN0XG4iLCBNc2dMZW4pKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwkvLyB3ZSBzdXBwb3J0IGltbWVkaWF0ZSBCQS4KKwkqKFVTSE9SVCAqKSgmcEFkZEZyYW1lLT5CYVBhcm0pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBBZGRGcmFtZS0+QmFQYXJtKSk7CisJcEFkZEZyYW1lLT5UaW1lT3V0VmFsdWUgPSBjcHUybGUxNihwQWRkRnJhbWUtPlRpbWVPdXRWYWx1ZSk7CisJcEFkZEZyYW1lLT5CYVN0YXJ0U2VxLndvcmQgPSBjcHUybGUxNihwQWRkRnJhbWUtPkJhU3RhcnRTZXEud29yZCk7CisKKwlpZiAocEFkZEZyYW1lLT5CYVBhcm0uQkFQb2xpY3kgIT0gSU1NRURfQkEpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlBlZXJBZGRCQVJlcUFjdGlvblNhbml0eTogQUREQkEgUmVxdWVzdCBCYSBQb2xpY3lbJWRdIG5vdCBzdXBwb3J0XG4iLCBwQWRkRnJhbWUtPkJhUGFybS5CQVBvbGljeSkpOworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkFEREJBIFJlcXVlc3QuIHRpZD0leCwgQnVmc2l6ZT0leCwgQU1TRFVTdXBwb3J0ZWQ9JXggXG4iLCBwQWRkRnJhbWUtPkJhUGFybS5USUQsIHBBZGRGcmFtZS0+QmFQYXJtLkJ1ZlNpemUsIHBBZGRGcmFtZS0+QmFQYXJtLkFNU0RVU3VwcG9ydGVkKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkvLyB3ZSBzdXBwb3J0IGltbWVkaWF0ZSBCQS4KKwlpZiAocEFkZEZyYW1lLT5CYVBhcm0uVElEICYweGZmZjApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlBlZXJBZGRCQVJlcUFjdGlvblNhbml0eTogQUREQkEgUmVxdWVzdCBpbmNvcnJlY3QgVElEID0gJWRcbiIsIHBBZGRGcmFtZS0+QmFQYXJtLlRJRCkpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCUNPUFlfTUFDX0FERFIocEFkZHIyLCBwRnJhbWUtPkhkci5BZGRyMik7CisJcmV0dXJuIFRSVUU7Cit9CisKK0JPT0xFQU4gUGVlckFkZEJBUnNwQWN0aW9uU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKnBNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuKQoreworCS8vUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOworCVBGUkFNRV9BRERCQV9SU1AgcEFkZEZyYW1lOworCisJcEFkZEZyYW1lID0gKFBGUkFNRV9BRERCQV9SU1ApKHBNc2cpOworCWlmIChNc2dMZW4gPCAoc2l6ZW9mKEZSQU1FX0FEREJBX1JTUCkpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJQZWVyQWRkQkFSc3BBY3Rpb25TYW5pdHk6IEFEREJBIFJlc3BvbnNlIGZyYW1lIGxlbmd0aCBzaXplID0gJWxkIGluY29ycmVjdFxuIiwgTXNnTGVuKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJLy8gd2Ugc3VwcG9ydCBpbW1lZGlhdGUgQkEuCisJKihVU0hPUlQgKikoJnBBZGRGcmFtZS0+QmFQYXJtKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwQWRkRnJhbWUtPkJhUGFybSkpOworCXBBZGRGcmFtZS0+U3RhdHVzQ29kZSA9IGNwdTJsZTE2KHBBZGRGcmFtZS0+U3RhdHVzQ29kZSk7CisJcEFkZEZyYW1lLT5UaW1lT3V0VmFsdWUgPSBjcHUybGUxNihwQWRkRnJhbWUtPlRpbWVPdXRWYWx1ZSk7CisKKwlpZiAocEFkZEZyYW1lLT5CYVBhcm0uQkFQb2xpY3kgIT0gSU1NRURfQkEpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlBlZXJBZGRCQVJlcUFjdGlvblNhbml0eTogQUREQkEgUmVzcG9uc2UgQmEgUG9saWN5WyVkXSBub3Qgc3VwcG9ydFxuIiwgcEFkZEZyYW1lLT5CYVBhcm0uQkFQb2xpY3kpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCS8vIHdlIHN1cHBvcnQgaW1tZWRpYXRlIEJBLgorCWlmIChwQWRkRnJhbWUtPkJhUGFybS5USUQgJjB4ZmZmMCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiUGVlckFkZEJBUnNwQWN0aW9uU2FuaXR5OiBBRERCQSBSZXNwb25zZSBpbmNvcnJlY3QgVElEID0gJWRcbiIsIHBBZGRGcmFtZS0+QmFQYXJtLlRJRCkpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCXJldHVybiBUUlVFOworCit9CisKK0JPT0xFQU4gUGVlckRlbEJBQWN0aW9uU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFVDSEFSIFdjaWQsCisgICAgSU4gVk9JRCAqcE1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4gKQoreworCS8vUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOworCVBGUkFNRV9ERUxCQV9SRVEgIHBEZWxGcmFtZTsKKwlpZiAoTXNnTGVuICE9IChzaXplb2YoRlJBTUVfREVMQkFfUkVRKSkpCisJCXJldHVybiBGQUxTRTsKKworCWlmIChXY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCQlyZXR1cm4gRkFMU0U7CisKKwlwRGVsRnJhbWUgPSAoUEZSQU1FX0RFTEJBX1JFUSkocE1zZyk7CisKKwkqKFVTSE9SVCAqKSgmcERlbEZyYW1lLT5EZWxiYVBhcm0pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBEZWxGcmFtZS0+RGVsYmFQYXJtKSk7CisJcERlbEZyYW1lLT5SZWFzb25Db2RlID0gY3B1MmxlMTYocERlbEZyYW1lLT5SZWFzb25Db2RlKTsKKworCWlmIChwRGVsRnJhbWUtPkRlbGJhUGFybS5USUQgJjB4ZmZmMCkKKwkJcmV0dXJuIEZBTFNFOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjaworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIFBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIElOIFVDSEFSICBNc2dDaGFubmVsLAorICAgIE9VVCBQVUNIQVIgcEFkZHIyLAorICAgIE9VVCBQVUNIQVIgcEJzc2lkLAorICAgIE9VVCBDSEFSIFNzaWRbXSwKKyAgICBPVVQgVUNIQVIgKnBTc2lkTGVuLAorICAgIE9VVCBVQ0hBUiAqcEJzc1R5cGUsCisgICAgT1VUIFVTSE9SVCAqcEJlYWNvblBlcmlvZCwKKyAgICBPVVQgVUNIQVIgKnBDaGFubmVsLAorICAgIE9VVCBVQ0hBUiAqcE5ld0NoYW5uZWwsCisgICAgT1VUIExBUkdFX0lOVEVHRVIgKnBUaW1lc3RhbXAsCisgICAgT1VUIENGX1BBUk0gKnBDZlBhcm0sCisgICAgT1VUIFVTSE9SVCAqcEF0aW1XaW4sCisgICAgT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAorICAgIE9VVCBVQ0hBUiAqcEVycCwKKyAgICBPVVQgVUNIQVIgKnBEdGltQ291bnQsCisgICAgT1VUIFVDSEFSICpwRHRpbVBlcmlvZCwKKyAgICBPVVQgVUNIQVIgKnBCY2FzdEZsYWcsCisgICAgT1VUIFVDSEFSICpwTWVzc2FnZVRvTWUsCisgICAgT1VUIFVDSEFSIFN1cFJhdGVbXSwKKyAgICBPVVQgVUNIQVIgKnBTdXBSYXRlTGVuLAorICAgIE9VVCBVQ0hBUiBFeHRSYXRlW10sCisgICAgT1VUIFVDSEFSICpwRXh0UmF0ZUxlbiwKKyAgICBPVVQJVUNIQVIgKnBDa2lwRmxhZywKKyAgICBPVVQJVUNIQVIgKnBBaXJvbmV0Q2VsbFBvd2VyTGltaXQsCisgICAgT1VUIFBFRENBX1BBUk0gICAgICAgcEVkY2FQYXJtLAorICAgIE9VVCBQUUJTU19MT0FEX1BBUk0gIHBRYnNzTG9hZCwKKyAgICBPVVQgUFFPU19DQVBBQklMSVRZX1BBUk0gcFFvc0NhcGFiaWxpdHksCisgICAgT1VUIFVMT05HICpwUmFsaW5rSWUsCisgICAgT1VUIFVDSEFSCQkgKnBIdENhcGFiaWxpdHlMZW4sCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisgICAgT1VUIFVDSEFSCQkgKnBQcmVOSHRDYXBhYmlsaXR5TGVuLAorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworICAgIE9VVCBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAorCU9VVCBVQ0hBUgkJICpBZGRIdEluZm9MZW4sCisJT1VUIEFERF9IVF9JTkZPX0lFICpBZGRIdEluZm8sCisJT1VUIFVDSEFSICpOZXdFeHRDaGFubmVsT2Zmc2V0LAkJLy8gSHQgZXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0KGFib3ZlIG9yIGJlbG93KQorICAgIE9VVCBVU0hPUlQgKkxlbmd0aFZJRSwKKyAgICBPVVQJUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcyBwVklFKQoreworICAgIENIQVIJCQkJKlB0cjsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlDSEFSIAkJCQlUaW1MZW47CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisgICAgUEZSQU1FXzgwMl8xMQkJcEZyYW1lOworICAgIFBFSURfU1RSVUNUICAgICAgICAgcEVpZDsKKyAgICBVQ0hBUgkJCQlTdWJUeXBlOworICAgIFVDSEFSCQkJCVNhbml0eTsKKyAgICAvL1VDSEFSCQkJCUVDV01pbiwgRUNXTWF4OworICAgIC8vTUFDX0NTUjlfU1RSVUMJCUNzcjk7CisgICAgVUxPTkcJCQkJTGVuZ3RoID0gMDsKKworCS8vIEZvciBzb21lIDExYSBBUCB3aGljaCBkaWRuJ3QgaGF2ZSBEU19JRSwgd2UgdXNlIHR3byBjb25kaXRpb25zIHRvIGRlY2lkZSB0aGUgY2hhbm5lbAorCS8vCTEuIElmIHRoZSBBUCBpcyAxMW4gZW5hYmxlZCwgdGhlbiBjaGVjayB0aGUgY29udHJvbCBjaGFubmVsLgorCS8vCTIuIElmIHRoZSBBUCBkaWRuJ3QgaGF2ZSBhbnkgaW5mbyBhYm91dCBjaGFubmVsLCB1c2UgdGhlIGNoYW5uZWwgd2UgcmVjZWl2ZWQgdGhpcyBmcmFtZSBhcyB0aGUgY2hhbm5lbC4gKE1heSBpbmFjY3VyYWN5ISEpCisJVUNIQVIJCQlDdHJsQ2hhbm5lbCA9IDA7CisKKyAgICAvLyBBZGQgZm9yIDMgbmVjZXNzYXJ5IEVJRCBmaWVsZCBjaGVjaworICAgIFNhbml0eSA9IDA7CisKKyAgICAqcEF0aW1XaW4gPSAwOworICAgICpwRXJwID0gMDsKKyAgICAqcER0aW1Db3VudCA9IDA7CisgICAgKnBEdGltUGVyaW9kID0gMDsKKyAgICAqcEJjYXN0RmxhZyA9IDA7CisgICAgKnBNZXNzYWdlVG9NZSA9IDA7CisgICAgKnBFeHRSYXRlTGVuID0gMDsKKyAgICAqcENraXBGbGFnID0gMDsJCQkgICAgICAgIC8vIERlZmF1bHQgb2YgQ2tpcEZsYWcgaXMgMAorICAgICpwQWlyb25ldENlbGxQb3dlckxpbWl0ID0gMHhGRjsgIC8vIERlZmF1bHQgb2YgQWlyb25ldENlbGxQb3dlckxpbWl0IGlzIDB4RkYKKyAgICAqTGVuZ3RoVklFID0gMDsJCQkJCS8vIFNldCB0aGUgbGVuZ3RoIG9mIFZJRSB0byBpbml0IHZhbHVlIDAKKyAgICAqcEh0Q2FwYWJpbGl0eUxlbiA9IDA7CQkJCQkvLyBTZXQgdGhlIGxlbmd0aCBvZiBWSUUgdG8gaW5pdCB2YWx1ZSAwCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCisJCSpwUHJlTkh0Q2FwYWJpbGl0eUxlbiA9IDA7CQkJCQkvLyBTZXQgdGhlIGxlbmd0aCBvZiBWSUUgdG8gaW5pdCB2YWx1ZSAwCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisgICAgKkFkZEh0SW5mb0xlbiA9IDA7CQkJCQkvLyBTZXQgdGhlIGxlbmd0aCBvZiBWSUUgdG8gaW5pdCB2YWx1ZSAwCisgICAgKnBSYWxpbmtJZSA9IDA7CisgICAgKnBOZXdDaGFubmVsID0gMDsKKyAgICAqTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7CS8vRGVmYXVsdCAweGZmIG1lYW5zIG5vIHN1Y2ggSUUKKyAgICBwQ2ZQYXJtLT5iVmFsaWQgPSBGQUxTRTsgICAgICAgIC8vIGRlZmF1bHQ6IG5vIElFX0NGIGZvdW5kCisgICAgcFFic3NMb2FkLT5iVmFsaWQgPSBGQUxTRTsgICAgICAvLyBkZWZhdWx0OiBubyBJRV9RQlNTX0xPQUQgZm91bmQKKyAgICBwRWRjYVBhcm0tPmJWYWxpZCA9IEZBTFNFOyAgICAgIC8vIGRlZmF1bHQ6IG5vIElFX0VEQ0FfUEFSQU1FVEVSIGZvdW5kCisgICAgcFFvc0NhcGFiaWxpdHktPmJWYWxpZCA9IEZBTFNFOyAvLyBkZWZhdWx0OiBubyBJRV9RT1NfQ0FQQUJJTElUWSBmb3VuZAorCisgICAgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpTXNnOworCisgICAgLy8gZ2V0IHN1YnR5cGUgZnJvbSBoZWFkZXIKKyAgICBTdWJUeXBlID0gKFVDSEFSKXBGcmFtZS0+SGRyLkZDLlN1YlR5cGU7CisKKyAgICAvLyBnZXQgQWRkcjIgYW5kIEJTU0lEIGZyb20gaGVhZGVyCisgICAgQ09QWV9NQUNfQUREUihwQWRkcjIsIHBGcmFtZS0+SGRyLkFkZHIyKTsKKyAgICBDT1BZX01BQ19BRERSKHBCc3NpZCwgcEZyYW1lLT5IZHIuQWRkcjMpOworCisvLwloZXhfZHVtcCgiQmVhY29uIiwgTXNnLCBNc2dMZW4pOworCisgICAgUHRyID0gcEZyYW1lLT5PY3RldDsKKyAgICBMZW5ndGggKz0gTEVOR1RIXzgwMl8xMTsKKworICAgIC8vIGdldCB0aW1lc3RhbXAgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisgICAgTmRpc01vdmVNZW1vcnkocFRpbWVzdGFtcCwgUHRyLCBUSU1FU1RBTVBfTEVOKTsKKworCXBUaW1lc3RhbXAtPnUuTG93UGFydCA9IGNwdTJsZTMyKHBUaW1lc3RhbXAtPnUuTG93UGFydCk7CisJcFRpbWVzdGFtcC0+dS5IaWdoUGFydCA9IGNwdTJsZTMyKHBUaW1lc3RhbXAtPnUuSGlnaFBhcnQpOworCisgICAgUHRyICs9IFRJTUVTVEFNUF9MRU47CisgICAgTGVuZ3RoICs9IFRJTUVTVEFNUF9MRU47CisKKyAgICAvLyBnZXQgYmVhY29uIGludGVydmFsIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBCZWFjb25QZXJpb2QsIFB0ciwgMik7CisgICAgUHRyICs9IDI7CisgICAgTGVuZ3RoICs9IDI7CisKKyAgICAvLyBnZXQgY2FwYWJpbGl0eSBpbmZvIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBDYXBhYmlsaXR5SW5mbywgUHRyLCAyKTsKKyAgICBQdHIgKz0gMjsKKyAgICBMZW5ndGggKz0gMjsKKworICAgIGlmIChDQVBfSVNfRVNTX09OKCpwQ2FwYWJpbGl0eUluZm8pKQorICAgICAgICAqcEJzc1R5cGUgPSBCU1NfSU5GUkE7CisgICAgZWxzZQorICAgICAgICAqcEJzc1R5cGUgPSBCU1NfQURIT0M7CisKKyAgICBwRWlkID0gKFBFSURfU1RSVUNUKSBQdHI7CisKKyAgICAvLyBnZXQgdmFyaWFibGUgZmllbGRzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIHdoaWxlICgoTGVuZ3RoICsgMiArIHBFaWQtPkxlbikgPD0gTXNnTGVuKQorICAgIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2VjdXJlIGNvcHkgVklFIHRvIFZhcklFW01BWF9WSUVfTEVOXSBkaWRuJ3Qgb3ZlcmZsb3cuCisgICAgICAgIC8vCisgICAgICAgIGlmICgoKkxlbmd0aFZJRSArIHBFaWQtPkxlbiArIDIpID49IE1BWF9WSUVfTEVOKQorICAgICAgICB7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIFZhcmlhYmxlIElFcyBvdXQgb2YgcmVzb3VyY2UgW2xlbig9JWQpID4gTUFYX1ZJRV9MRU4oPSVkKV1cbiIsCisgICAgICAgICAgICAgICAgICAgICgqTGVuZ3RoVklFICsgcEVpZC0+TGVuICsgMiksIE1BWF9WSUVfTEVOKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaChwRWlkLT5FaWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgSUVfU1NJRDoKKyAgICAgICAgICAgICAgICAvLyBBbHJlYWR5IGhhcyBvbmUgU1NJRCBFSUQgaW4gdGhpcyBiZWFjb24sIGlnbm9yZSB0aGUgc2Vjb25kIG9uZQorICAgICAgICAgICAgICAgIGlmIChTYW5pdHkgJiAweDEpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGlmKHBFaWQtPkxlbiA8PSBNQVhfTEVOX09GX1NTSUQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShTc2lkLCBwRWlkLT5PY3RldCwgcEVpZC0+TGVuKTsKKyAgICAgICAgICAgICAgICAgICAgKnBTc2lkTGVuID0gcEVpZC0+TGVuOworICAgICAgICAgICAgICAgICAgICBTYW5pdHkgfD0gMHgxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9TU0lEIChsZW49JWQpXG4iLHBFaWQtPkxlbikpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIElFX1NVUFBfUkFURVM6CisgICAgICAgICAgICAgICAgaWYocEVpZC0+TGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU2FuaXR5IHw9IDB4MjsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoU3VwUmF0ZSwgcEVpZC0+T2N0ZXQsIHBFaWQtPkxlbik7CisgICAgICAgICAgICAgICAgICAgICpwU3VwUmF0ZUxlbiA9IHBFaWQtPkxlbjsKKworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiAyMDA0LTA5LTE0IG5vdCBhIGdvb2QgZGVzaWduIGhlcmUsIGNhdXNlIGl0IGV4Y2x1ZGUgZXh0cmEgcmF0ZXMKKyAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBTY2FuVGFiLiBXZSBzaG91bGQgcmVwb3J0IGFzIGlzLiBBbmQgZmlsdGVyIG91dCB1bnN1cHBvcnRlZAorICAgICAgICAgICAgICAgICAgICAvLyByYXRlcyBpbiBNbG1lQXV4LgorICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBhZ2FpbnN0IHRoZSBzdXBwb3J0ZWQgcmF0ZXMKKyAgICAgICAgICAgICAgICAgICAgLy8gUlRNUENoZWNrUmF0ZXMocEFkLCBTdXBSYXRlLCBwU3VwUmF0ZUxlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX1NVUFBfUkFURVMgKGxlbj0lZClcbiIscEVpZC0+TGVuKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgSUVfSFRfQ0FQOgorCQkJaWYgKHBFaWQtPkxlbiA+PSBTSVpFX0hUX0NBUF9JRSkgIC8vTm90ZTogYWxsb3cgZXh0ZW5zaW9uLiEhCisJCQl7CisJCQkJTmRpc01vdmVNZW1vcnkocEh0Q2FwYWJpbGl0eSwgcEVpZC0+T2N0ZXQsIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSk7CisJCQkJKnBIdENhcGFiaWxpdHlMZW4gPSBTSVpFX0hUX0NBUF9JRTsJLy8gTm5vdyB3ZSBvbmx5IHN1cHBvcnQgMjYgYnl0ZXMuCisKKwkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pKTsKKwkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8pKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJeworCQkJCQkqcFByZU5IdENhcGFiaWxpdHlMZW4gPSAwOwkvLyBObm93IHdlIG9ubHkgc3VwcG9ydCAyNiBieXRlcy4KKworCQkJCQlQdHIgPSAoUFVDSEFSKSBwVklFOworCQkJCQlOZGlzTW92ZU1lbW9yeShQdHIgKyAqTGVuZ3RoVklFLCAmcEVpZC0+RWlkLCBwRWlkLT5MZW4gKyAyKTsKKwkJCQkJKkxlbmd0aFZJRSArPSAocEVpZC0+TGVuICsgMik7CisJCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gd3JvbmcgSUVfSFRfQ0FQLiBwRWlkLT5MZW4gPSAlZFxuIiwgcEVpZC0+TGVuKSk7CisJCQl9CisKKwkJYnJlYWs7CisgICAgICAgICAgICBjYXNlIElFX0FERF9IVDoKKwkJCWlmIChwRWlkLT5MZW4gPj0gc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSkKKwkJCXsKKwkJCQkvLyBUaGlzIElFIGFsbG93cyBleHRlbnNpb24sIGJ1dCB3ZSBjYW4gaWdub3JlIGV4dHJhIGJ5dGVzIGJleW9uZCBvdXIga25vd2xlZGdlICwgc28gb25seQorCQkJCS8vIGNvcHkgZmlyc3Qgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKQorCQkJCU5kaXNNb3ZlTWVtb3J5KEFkZEh0SW5mbywgcEVpZC0+T2N0ZXQsIHNpemVvZihBRERfSFRfSU5GT19JRSkpOworCQkJCSpBZGRIdEluZm9MZW4gPSBTSVpFX0FERF9IVF9JTkZPX0lFOworCisJCQkJQ3RybENoYW5uZWwgPSBBZGRIdEluZm8tPkNvbnRyb2xDaGFuOworCisJCQkJKihVU0hPUlQgKikoJkFkZEh0SW5mby0+QWRkSHRJbmZvMikgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmQWRkSHRJbmZvLT5BZGRIdEluZm8yKSk7CisJCQkJKihVU0hPUlQgKikoJkFkZEh0SW5mby0+QWRkSHRJbmZvMykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmQWRkSHRJbmZvLT5BZGRIdEluZm8zKSk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCXsKKwkJCSAgICAgICAgICAgICAgICBQdHIgPSAoUFVDSEFSKSBwVklFOworCQkJICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFB0ciArICpMZW5ndGhWSUUsICZwRWlkLT5FaWQsIHBFaWQtPkxlbiArIDIpOworCQkJICAgICAgICAgICAgICAgICpMZW5ndGhWSUUgKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX0FERF9IVC4gXG4iKSk7CisJCQl9CisKKwkJYnJlYWs7CisgICAgICAgICAgICBjYXNlIElFX1NFQ09OREFSWV9DSF9PRkZTRVQ6CisJCQlpZiAocEVpZC0+TGVuID09IDEpCisJCQl7CisJCQkJKk5ld0V4dENoYW5uZWxPZmZzZXQgPSBwRWlkLT5PY3RldFswXTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX1NFQ09OREFSWV9DSF9PRkZTRVQuIFxuIikpOworCQkJfQorCisJCWJyZWFrOworICAgICAgICAgICAgY2FzZSBJRV9GSF9QQVJNOgorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eShJRV9GSF9QQVJNKSBcbiIpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBJRV9EU19QQVJNOgorICAgICAgICAgICAgICAgIGlmKHBFaWQtPkxlbiA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKnBDaGFubmVsID0gKnBFaWQtPk9jdGV0OworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQl7CisJCQkJCQlpZiAoQ2hhbm5lbFNhbml0eShwQWQsICpwQ2hhbm5lbCkgPT0gMCkKKwkJCQkJCXsKKworCQkJCQkJCXJldHVybiBGQUxTRTsKKwkJCQkJCX0KKwkJCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworICAgICAgICAgICAgICAgICAgICBTYW5pdHkgfD0gMHg0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9EU19QQVJNIChsZW49JWQpXG4iLHBFaWQtPkxlbikpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIElFX0NGX1BBUk06CisgICAgICAgICAgICAgICAgaWYocEVpZC0+TGVuID09IDYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQ2ZQYXJtLT5iVmFsaWQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBwQ2ZQYXJtLT5DZnBDb3VudCA9IHBFaWQtPk9jdGV0WzBdOworICAgICAgICAgICAgICAgICAgICBwQ2ZQYXJtLT5DZnBQZXJpb2QgPSBwRWlkLT5PY3RldFsxXTsKKyAgICAgICAgICAgICAgICAgICAgcENmUGFybS0+Q2ZwTWF4RHVyYXRpb24gPSBwRWlkLT5PY3RldFsyXSArIDI1NiAqIHBFaWQtPk9jdGV0WzNdOworICAgICAgICAgICAgICAgICAgICBwQ2ZQYXJtLT5DZnBEdXJSZW1haW5pbmcgPSBwRWlkLT5PY3RldFs0XSArIDI1NiAqIHBFaWQtPk9jdGV0WzVdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9DRl9QQVJNXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgSUVfSUJTU19QQVJNOgorICAgICAgICAgICAgICAgIGlmKHBFaWQtPkxlbiA9PSAyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEF0aW1XaW4sIHBFaWQtPk9jdGV0LCBwRWlkLT5MZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9JQlNTX1BBUk1cbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorICAgICAgICAgICAgY2FzZSBJRV9USU06CisgICAgICAgICAgICAgICAgaWYoSU5GUkFfT04ocEFkKSAmJiBTdWJUeXBlID09IFNVQlRZUEVfQkVBQ09OKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgR2V0VGltQml0KChQVUNIQVIpcEVpZCwgcEFkLT5TdGFBY3RpdmUuQWlkLCAmVGltTGVuLCBwQmNhc3RGbGFnLCBwRHRpbUNvdW50LCBwRHRpbVBlcmlvZCwgcE1lc3NhZ2VUb01lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisgICAgICAgICAgICBjYXNlIElFX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVDoKKyAgICAgICAgICAgICAgICBpZihwRWlkLT5MZW4gPT0gMykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgCSpwTmV3Q2hhbm5lbCA9IHBFaWQtPk9jdGV0WzFdOwkvL2V4dHJhY3QgbmV3IGNoYW5uZWwgbnVtYmVyCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvLyBOZXcgZm9yIFdQQQorICAgICAgICAgICAgLy8gQ0NYIHYyIGhhcyB0aGUgc2FtZSBJRSwgd2UgbmVlZCB0byBwYXJzZSB0aGF0IHRvbworICAgICAgICAgICAgLy8gV2lmaSBXTU0gdXNlIHRoZSBzYW1lIElFIHZhbGUsIG5lZWQgdG8gcGFyc2UgdGhhdCB0b28KKyAgICAgICAgICAgIC8vIGNhc2UgSUVfV1BBOgorICAgICAgICAgICAgY2FzZSBJRV9WRU5ET1JfU1BFQ0lGSUM6CisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgQnJvYWRjb20vQXRoZXJvcyA4MDIuMTFuIE9VSSB2ZXJzaW9uLCBmb3IgSFQgQ2FwYWJpbGl0eSBJRS4KKyAgICAgICAgICAgICAgICAvLyBUaGlzIEhUIElFIGlzIGJlZm9yZSBJRUVFIGRyYWZ0IHNldCBIVCBJRSB2YWx1ZS4yMDA2LTA5LTI4IGJ5IEphbi4KKyAgICAgICAgICAgICAgICAvKmlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIEJST0FEQ09NX09VSSwgMykgJiYgKHBFaWQtPkxlbiA+PSA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgCWlmICgocEVpZC0+T2N0ZXRbM10gPT0gT1VJX0JST0FEQ09NX0hUKSAmJiAocEVpZC0+TGVuID49IDMwKSkKKyAgICAgICAgICAgIAkJeworCQkJCXsKKwkJCQkJTmRpc01vdmVNZW1vcnkocEh0Q2FwYWJpbGl0eSwgJnBFaWQtPk9jdGV0WzRdLCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOworCQkJCQkqcEh0Q2FwYWJpbGl0eUxlbiA9IFNJWkVfSFRfQ0FQX0lFOwkvLyBObm93IHdlIG9ubHkgc3VwcG9ydCAyNiBieXRlcy4KKwkJCQl9CisgICAgICAgICAJCX0KKyAgICAgICAgICAgICAgICAJaWYgKChwRWlkLT5PY3RldFszXSA9PSBPVUlfQlJPQURDT01fSFQpICYmIChwRWlkLT5MZW4gPj0gMjYpKQorICAgICAgICAgICAgCQl7CisJCQkJeworCQkJCQlOZGlzTW92ZU1lbW9yeShBZGRIdEluZm8sICZwRWlkLT5PY3RldFs0XSwgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7CisJCQkJCSpBZGRIdEluZm9MZW4gPSBTSVpFX0FERF9IVF9JTkZPX0lFOwkvLyBObm93IHdlIG9ubHkgc3VwcG9ydCAyNiBieXRlcy4KKwkJCQl9CisgICAgICAgICAJCX0KKyAgICAgICAgICAgICAgICB9CisJCQkJKi8KKyAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgT1VJIHZlcnNpb24sIGZpbHRlciBvdXQgbm9uLXN0YW5kYXJkIHVzYWdlCisgICAgICAgICAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgUkFMSU5LX09VSSwgMykgJiYgKHBFaWQtPkxlbiA9PSA3KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vKnBSYWxpbmtJZSA9IHBFaWQtPk9jdGV0WzNdOworICAgICAgICAgICAgICAgICAgICBpZiAocEVpZC0+T2N0ZXRbM10gIT0gMCkKKyAgICAgICAgCQkJCSpwUmFsaW5rSWUgPSBwRWlkLT5PY3RldFszXTsKKyAgICAgICAgCQkJZWxzZQorICAgICAgICAJCQkJKnBSYWxpbmtJZSA9IDB4ZjAwMDAwMDA7IC8vIFNldCB0byBub24temVybyB2YWx1ZSAoY2FuJ3Qgc2V0IGJpdDAtMikgdG8gcmVwcmVzZW50IHRoaXMgaXMgUmFsaW5rIENoaXAuIFNvIGF0IGxpbmt1cCwgd2Ugd2lsbCBzZXQgcmFsaW5rY2hpcCBmbGFnLgorICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJLy8gVGhpcyBIVCBJRSBpcyBiZWZvcmUgSUVFRSBkcmFmdCBzZXQgSFQgSUUgdmFsdWUuMjAwNi0wOS0yOCBieSBKYW4uCisKKyAgICAgICAgICAgICAgICAvLyBPdGhlciB2ZW5kb3JzIGhhZCBwcm9kdWN0aW9uIGJlZm9yZSBJRV9IVF9DQVAgdmFsdWUgaXMgYXNzaWduZWQuIFRvIGJhY2t3YXJkIHN1cHBvcnQgdGhvc2Ugb2xkLWZpcm13YXJlIEFQLAorICAgICAgICAgICAgICAgIC8vIENoZWNrIGJyb2FkY29tLWRlZmllbmQgcHJlLTgwMi4xMW5EMS4wIE9VSSBmb3IgSFQgcmVsYXRlZCBJRSwgaW5jbHVkaW5nIEhUIENhcGF0aWxpdGllcyBJRSBhbmQgSFQgSW5mb3JtYXRpb24gSUUKKyAgICAgICAgICAgICAgICBlbHNlIGlmICgoKnBIdENhcGFiaWxpdHlMZW4gPT0gMCkgJiYgTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBQUkVfTl9IVF9PVUksIDMpICYmIChwRWlkLT5MZW4gPj0gNCkgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChwRWlkLT5PY3RldFszXSA9PSBPVUlfUFJFTl9IVF9DQVApICYmIChwRWlkLT5MZW4gPj0gMzApICYmICgqcEh0Q2FwYWJpbGl0eUxlbiA9PSAwKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEh0Q2FwYWJpbGl0eSwgJnBFaWQtPk9jdGV0WzRdLCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOworICAgICAgICAgICAgICAgICAgICAgICAgKnBQcmVOSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoKHBFaWQtPk9jdGV0WzNdID09IE9VSV9QUkVOX0FERF9IVCkgJiYgKHBFaWQtPkxlbiA+PSAyNikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KEFkZEh0SW5mbywgJnBFaWQtPk9jdGV0WzRdLCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpBZGRIdEluZm9MZW4gPSBTSVpFX0FERF9IVF9JTkZPX0lFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworICAgICAgICAgICAgICAgIGVsc2UgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV1BBX09VSSwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBDb3B5IHRvIHBWSUUgd2hpY2ggd2lsbCByZXBvcnQgdG8gbWljcm9zb2Z0IGJzc2lkIGxpc3QuCisgICAgICAgICAgICAgICAgICAgIFB0ciA9IChQVUNIQVIpIHBWSUU7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFB0ciArICpMZW5ndGhWSUUsICZwRWlkLT5FaWQsIHBFaWQtPkxlbiArIDIpOworICAgICAgICAgICAgICAgICAgICAqTGVuZ3RoVklFICs9IChwRWlkLT5MZW4gKyAyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXTUVfUEFSTV9FTEVNLCA2KSAmJiAocEVpZC0+TGVuID09IDI0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFBVQ0hBUiBwdHI7CisgICAgICAgICAgICAgICAgICAgIGludCBpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHBhcnNpbmcgRURDQSBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlZhbGlkICAgICAgICAgID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iUUFjayAgICAgICAgICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDEwOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJRdWV1ZVJlcXVlc3QgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4MjA7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlR4b3BSZXF1ZXN0ICAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHg0MDsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5FZGNhVXBkYXRlQ291bnQgPSBwRWlkLT5PY3RldFs2XSAmIDB4MGY7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFQU0RDYXBhYmxlICAgID0gKHBFaWQtPk9jdGV0WzZdICYgMHg4MCkgPyAxIDogMDsKKyAgICAgICAgICAgICAgICAgICAgcHRyID0gJnBFaWQtPk9jdGV0WzhdOworICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGFjaSA9ICgqcHRyICYgMHg2MCkgPj4gNTsgLy8gYjV+NiBpcyBBQyBJTkRFWAorICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQUNNW2FjaV0gID0gKCgoKnB0cikgJiAweDEwKSA9PSAweDEwKTsgICAvLyBiNSBpcyBBQ00KKyAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+QWlmc25bYWNpXSA9ICgqcHRyKSAmIDB4MGY7ICAgICAgICAgICAgICAgLy8gYjB+MyBpcyBBSUZTTgorICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21pblthY2ldID0gKihwdHIrMSkgJiAweDBmOyAgICAgICAgICAgICAvLyBiMH40IGlzIEN3bWluCisgICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWF4W2FjaV0gPSAqKHB0cisxKSA+PiA0OyAgICAgICAgICAgICAgIC8vIGI1fjggaXMgQ3dtYXgKKyAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+VHhvcFthY2ldICA9ICoocHRyKzIpICsgMjU2ICogKCoocHRyKzMpKTsgLy8gaW4gdW5pdCBvZiAzMi11cworICAgICAgICAgICAgICAgICAgICAgICAgcHRyICs9IDQ7IC8vIHBvaW50IHRvIG5leHQgQUMKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdNRV9JTkZPX0VMRU0sIDYpICYmIChwRWlkLT5MZW4gPT0gNykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBwYXJzaW5nIEVEQ0EgcGFyYW1ldGVycworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJWYWxpZCAgICAgICAgICA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlFBY2sgICAgICAgICAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHgxMDsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iUXVldWVSZXF1ZXN0ICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDIwOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJUeG9wUmVxdWVzdCAgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4NDA7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+RWRjYVVwZGF0ZUNvdW50ID0gcEVpZC0+T2N0ZXRbNl0gJiAweDBmOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBUFNEQ2FwYWJsZSAgICA9IChwRWlkLT5PY3RldFs2XSAmIDB4ODApID8gMSA6IDA7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGRlZmF1bHQgRURDQSBwYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQUNNW1FJRF9BQ19CRV0gID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQkVdID0gMzsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfQkVdID0gQ1dfTUlOX0lOX0JJVFM7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX0JFXSA9IENXX01BWF9JTl9CSVRTOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX0JFXSAgPSAwOworCisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFDTVtRSURfQUNfQktdICA9IDA7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JLXSA9IDc7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX0JLXSA9IENXX01JTl9JTl9CSVRTOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19CS10gPSBDV19NQVhfSU5fQklUUzsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19CS10gID0gMDsKKworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBQ01bUUlEX0FDX1ZJXSAgPSAwOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WSV0gPSAyOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19WSV0gPSBDV19NSU5fSU5fQklUUy0xOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19WSV0gPSBDV19NQVhfSU5fQklUUzsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WSV0gID0gOTY7ICAgLy8gQUNfVkk6IDk2KjMydXMgfj0gM21zCisKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQUNNW1FJRF9BQ19WT10gID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVk9dID0gMjsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVk9dID0gQ1dfTUlOX0lOX0JJVFMtMjsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfVk9dID0gQ1dfTUFYX0lOX0JJVFMtMTsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WT10gID0gNDg7ICAgLy8gQUNfVk86IDQ4KjMydXMgfj0gMS41bXMKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgSUVfRVhUX1NVUFBfUkFURVM6CisgICAgICAgICAgICAgICAgaWYgKHBFaWQtPkxlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KEV4dFJhdGUsIHBFaWQtPk9jdGV0LCBwRWlkLT5MZW4pOworICAgICAgICAgICAgICAgICAgICAqcEV4dFJhdGVMZW4gPSBwRWlkLT5MZW47CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogMjAwNC0wOS0xNCBub3QgYSBnb29kIGRlc2lnbiBoZXJlLCBjYXVzZSBpdCBleGNsdWRlIGV4dHJhIHJhdGVzCisgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gU2NhblRhYi4gV2Ugc2hvdWxkIHJlcG9ydCBhcyBpcy4gQW5kIGZpbHRlciBvdXQgdW5zdXBwb3J0ZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gcmF0ZXMgaW4gTWxtZUF1eC4KKyAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgYWdhaW5zdCB0aGUgc3VwcG9ydGVkIHJhdGVzCisgICAgICAgICAgICAgICAgICAgIC8vIFJUTVBDaGVja1JhdGVzKHBBZCwgRXh0UmF0ZSwgcEV4dFJhdGVMZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBJRV9FUlA6CisgICAgICAgICAgICAgICAgaWYgKHBFaWQtPkxlbiA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKnBFcnAgPSAoVUNIQVIpcEVpZC0+T2N0ZXRbMF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIElFX0FJUk9ORVRfQ0tJUDoKKyAgICAgICAgICAgICAgICAvLyAwLiBDaGVjayBBaXJvbmV0IElFIGxlbmd0aCwgaXQgbXVzdCBiZSBsYXJnZXIgb3IgZXF1YWwgdG8gMjgKKyAgICAgICAgICAgICAgICAvLyBDaXNjbyBBUDM1MCB1c2VkIGxlbmd0aCBhcyAyOAorICAgICAgICAgICAgICAgIC8vIENpc2NvIEFQMTJYWCB1c2VkIGxlbmd0aCBhcyAzMAorICAgICAgICAgICAgICAgIGlmIChwRWlkLT5MZW4gPCAoQ0tJUF9ORUdPVElBVElPTl9MRU5HVEggLSAyKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAvLyAxLiBDb3B5IENLSVAgZmxhZyBieXRlIHRvIGJ1ZmZlciBmb3IgcHJvY2VzcworICAgICAgICAgICAgICAgICpwQ2tpcEZsYWcgPSAqKHBFaWQtPk9jdGV0ICsgOCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgSUVfQVBfVFhfUE9XRVI6CisgICAgICAgICAgICAgICAgLy8gQVAgQ29udHJvbCBvZiBDbGllbnQgVHJhbnNtaXQgUG93ZXIKKyAgICAgICAgICAgICAgICAvLzAuIENoZWNrIEFpcm9uZXQgSUUgbGVuZ3RoLCBpdCBtdXN0IGJlIDYKKyAgICAgICAgICAgICAgICBpZiAocEVpZC0+TGVuICE9IDB4MDYpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgLy8gR2V0IGNlbGwgcG93ZXIgbGltaXQgaW4gZEJtCisgICAgICAgICAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgQ0lTQ09fT1VJLCAzKSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAqcEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA9ICoocEVpZC0+T2N0ZXQgKyA0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLy8gV1BBMiAmIDgwMi4xMWkgUlNOCisgICAgICAgICAgICBjYXNlIElFX1JTTjoKKyAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBPVUkgZm9yIHZlcnNpb24gYW55bW9yZSwgY2hlY2sgdGhlIGdyb3VwIGNpcGhlciBPVUkgYmVmb3JlIGNvcHlpbmcKKyAgICAgICAgICAgICAgICBpZiAoUlRNUEVxdWFsTWVtb3J5KHBFaWQtPk9jdGV0ICsgMiwgUlNOX09VSSwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBDb3B5IHRvIHBWSUUgd2hpY2ggd2lsbCByZXBvcnQgdG8gbWljcm9zb2Z0IGJzc2lkIGxpc3QuCisgICAgICAgICAgICAgICAgICAgIFB0ciA9IChQVUNIQVIpIHBWSUU7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFB0ciArICpMZW5ndGhWSUUsICZwRWlkLT5FaWQsIHBFaWQtPkxlbiArIDIpOworICAgICAgICAgICAgICAgICAgICAqTGVuZ3RoVklFICs9IChwRWlkLT5MZW4gKyAyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCQkJY2FzZSBJRV9DT1VOVFJZOgorCQkJCVB0ciA9IChQVUNIQVIpIHBWSUU7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoUHRyICsgKkxlbmd0aFZJRSwgJnBFaWQtPkVpZCwgcEVpZC0+TGVuICsgMik7CisgICAgICAgICAgICAgICAgKkxlbmd0aFZJRSArPSAocEVpZC0+TGVuICsgMik7CisJCQkJYnJlYWs7CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIExlbmd0aCA9IExlbmd0aCArIDIgKyBwRWlkLT5MZW47ICAvLyBFaWRbMV0gKyBMZW5bMV0rIGNvbnRlbnRbTGVuXQorICAgICAgICBwRWlkID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKXBFaWQgKyAyICsgcEVpZC0+TGVuKTsKKyAgICB9CisKKyAgICAvLyBGb3Igc29tZSAxMWEgQVAuIGl0IGRpZCBub3QgaGF2ZSB0aGUgY2hhbm5lbCBFSUQsIHBhdGNoIGhlcmUKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJVUNIQVIgTGF0Y2hSZkNoYW5uZWwgPSBNc2dDaGFubmVsOworCQlpZiAoKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA+IDE0KSAmJiAoKFNhbml0eSAmIDB4NCkgPT0gMCkpCisJCXsKKwkJCWlmIChDdHJsQ2hhbm5lbCAhPSAwKQorCQkJCSpwQ2hhbm5lbCA9IEN0cmxDaGFubmVsOworCQkJZWxzZQorCQkJCSpwQ2hhbm5lbCA9IExhdGNoUmZDaGFubmVsOworCQkJU2FuaXR5IHw9IDB4NDsKKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCWlmIChTYW5pdHkgIT0gMHg3KQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSBtaXNzaW5nIGZpZWxkLCBTYW5pdHk9MHglMDJ4XG4iLCBTYW5pdHkpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwllbHNlCisJeworCQlyZXR1cm4gVFJVRTsKKwl9CisKK30KKworI2lmZGVmIERPVDExTl9EUkFGVDMKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjayBmb3Igc29tZSBJRSBhZGRyZXNzZWQgIGluIDgwMi4xMW4gZDMuMDMuCisJUmV0dXJuOgorCQlUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5MigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBWT0lEICpNc2csCisJSU4gVUxPTkcgTXNnTGVuLAorCU9VVCBVQ0hBUiAJKlJlZ0NsYXNzKQoreworCUNIQVIJCQkJKlB0cjsKKwlQRlJBTUVfODAyXzExCQlwRnJhbWU7CisJUEVJRF9TVFJVQ1QJCQlwRWlkOworCVVMT05HCQkJCUxlbmd0aCA9IDA7CisKKwlwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlNc2c7CisKKwkqUmVnQ2xhc3MgPSAwOworCVB0ciA9IHBGcmFtZS0+T2N0ZXQ7CisJTGVuZ3RoICs9IExFTkdUSF84MDJfMTE7CisKKwkvLyBnZXQgdGltZXN0YW1wIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorCVB0ciArPSBUSU1FU1RBTVBfTEVOOworCUxlbmd0aCArPSBUSU1FU1RBTVBfTEVOOworCisJLy8gZ2V0IGJlYWNvbiBpbnRlcnZhbCBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKwlQdHIgKz0gMjsKKwlMZW5ndGggKz0gMjsKKworCS8vIGdldCBjYXBhYmlsaXR5IGluZm8gZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisJUHRyICs9IDI7CisJTGVuZ3RoICs9IDI7CisKKwlwRWlkID0gKFBFSURfU1RSVUNUKSBQdHI7CisKKwkvLyBnZXQgdmFyaWFibGUgZmllbGRzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorCXdoaWxlICgoTGVuZ3RoICsgMiArIHBFaWQtPkxlbikgPD0gTXNnTGVuKQorCXsKKwkJc3dpdGNoKHBFaWQtPkVpZCkKKwkJeworCQkJY2FzZSBJRV9TVVBQX1JFR19DTEFTUzoKKwkJCQlpZihwRWlkLT5MZW4gPiAwKQorCQkJCXsKKwkJCQkJKlJlZ0NsYXNzID0gKnBFaWQtPk9jdGV0OworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9TU0lEIChsZW49JWQpXG4iLHBFaWQtPkxlbikpOworCQkJCQlyZXR1cm4gRkFMU0U7CisJCQkJfQorCQkJCWJyZWFrOworCQl9CisKKwkJTGVuZ3RoID0gTGVuZ3RoICsgMiArIHBFaWQtPkxlbjsgIC8vIEVpZFsxXSArIExlblsxXSsgY29udGVudFtMZW5dCisJCXBFaWQgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopcEVpZCArIDIgKyBwRWlkLT5MZW4pOworCX0KKworCXJldHVybiBUUlVFOworCit9CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIE1sbWVTY2FuUmVxU2FuaXR5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFZPSUQgKk1zZywKKwlJTiBVTE9ORyBNc2dMZW4sCisJT1VUIFVDSEFSICpwQnNzVHlwZSwKKwlPVVQgQ0hBUiBTc2lkW10sCisJT1VUIFVDSEFSICpwU3NpZExlbiwKKwlPVVQgVUNIQVIgKnBTY2FuVHlwZSkKK3sKKwlNTE1FX1NDQU5fUkVRX1NUUlVDVCAqSW5mbzsKKworCUluZm8gPSAoTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgKikoTXNnKTsKKwkqcEJzc1R5cGUgPSBJbmZvLT5Cc3NUeXBlOworCSpwU3NpZExlbiA9IEluZm8tPlNzaWRMZW47CisJTmRpc01vdmVNZW1vcnkoU3NpZCwgSW5mby0+U3NpZCwgKnBTc2lkTGVuKTsKKwkqcFNjYW5UeXBlID0gSW5mby0+U2NhblR5cGU7CisKKwlpZiAoKCpwQnNzVHlwZSA9PSBCU1NfSU5GUkEgfHwgKnBCc3NUeXBlID09IEJTU19BREhPQyB8fCAqcEJzc1R5cGUgPT0gQlNTX0FOWSkKKwkJJiYgKCpwU2NhblR5cGUgPT0gU0NBTl9BQ1RJVkUgfHwgKnBTY2FuVHlwZSA9PSBTQ0FOX1BBU1NJVkUKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJfHwgKnBTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX1BBU1NJVkUgfHwgKnBTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX0FDVElWRQorCQl8fCAqcFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQ0hBTk5FTF9MT0FEIHx8ICpwU2NhblR5cGUgPT0gU0NBTl9DSVNDT19OT0lTRQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkpKQorCXsKKwkJcmV0dXJuIFRSVUU7CisJfQorCWVsc2UKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTY2FuUmVxU2FuaXR5IGZhaWwgLSB3cm9uZyBCc3NUeXBlIG9yIFNjYW5UeXBlXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9Cit9CisKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVUNIQVIgQ2hhbm5lbFNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBVQ0hBUiBjaGFubmVsKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGkgKyspCisgICAgeworICAgICAgICBpZiAoY2hhbm5lbCA9PSBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjaworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIFBlZXJEZWF1dGhTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMiwKKyAgICBPVVQgVVNIT1JUICpwUmVhc29uKQoreworICAgIFBGUkFNRV84MDJfMTEgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpTXNnOworCisgICAgQ09QWV9NQUNfQUREUihwQWRkcjIsIHBGcmFtZS0+SGRyLkFkZHIyKTsKKyAgICBOZGlzTW92ZU1lbW9yeShwUmVhc29uLCAmcEZyYW1lLT5PY3RldFswXSwgMik7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gUGVlckF1dGhTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyLAorICAgIE9VVCBVU0hPUlQgKnBBbGcsCisgICAgT1VUIFVTSE9SVCAqcFNlcSwKKyAgICBPVVQgVVNIT1JUICpwU3RhdHVzLAorICAgIENIQVIgKnBDaGxnVGV4dCkKK3sKKyAgICBQRlJBTUVfODAyXzExIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKU1zZzsKKworICAgIENPUFlfTUFDX0FERFIocEFkZHIsICAgcEZyYW1lLT5IZHIuQWRkcjIpOworICAgIE5kaXNNb3ZlTWVtb3J5KHBBbGcsICAgICZwRnJhbWUtPk9jdGV0WzBdLCAyKTsKKyAgICBOZGlzTW92ZU1lbW9yeShwU2VxLCAgICAmcEZyYW1lLT5PY3RldFsyXSwgMik7CisgICAgTmRpc01vdmVNZW1vcnkocFN0YXR1cywgJnBGcmFtZS0+T2N0ZXRbNF0sIDIpOworCisgICAgaWYgKCgqcEFsZyA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQorI2lmZGVmIExFQVBfU1VQUE9SVAorICAgICAgfHwgKCpwQWxnID09IENJU0NPX0F1dGhNb2RlTEVBUCkKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKyAgICAgICkKKyAgICB7CisgICAgICAgIGlmICgqcFNlcSA9PSAxIHx8ICpwU2VxID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckF1dGhTYW5pdHkgZmFpbCAtIHdyb25nIFNlZyNcbiIpKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICgqcEFsZyA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpCisgICAgeworICAgICAgICBpZiAoKnBTZXEgPT0gMSB8fCAqcFNlcSA9PSA0KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgqcFNlcSA9PSAyIHx8ICpwU2VxID09IDMpCisgICAgICAgIHsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBDaGxnVGV4dCwgJnBGcmFtZS0+T2N0ZXRbOF0sIENJUEhFUl9URVhUX0xFTik7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJBdXRoU2FuaXR5IGZhaWwgLSB3cm9uZyBTZWcjXG4iKSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckF1dGhTYW5pdHkgZmFpbCAtIHdyb25nIGFsZ29yaXRobVxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIE1sbWVBdXRoUmVxU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQWRkciwKKyAgICBPVVQgVUxPTkcgKnBUaW1lb3V0LAorICAgIE9VVCBVU0hPUlQgKnBBbGcpCit7CisgICAgTUxNRV9BVVRIX1JFUV9TVFJVQ1QgKnBJbmZvOworCisgICAgcEluZm8gID0gKE1MTUVfQVVUSF9SRVFfU1RSVUNUICopTXNnOworICAgIENPUFlfTUFDX0FERFIocEFkZHIsIHBJbmZvLT5BZGRyKTsKKyAgICAqcFRpbWVvdXQgPSBwSW5mby0+VGltZW91dDsKKyAgICAqcEFsZyA9IHBJbmZvLT5BbGc7CisKKyAgICBpZiAoKCgqcEFsZyA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpIHx8KCpwQWxnID09IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pCisjaWZkZWYgTEVBUF9TVVBQT1JUCisgICAgIHx8ICgqcEFsZyA9PSBDSVNDT19BdXRoTW9kZUxFQVApCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisgICAgIAkpICYmCisgICAgICAgICgoKnBBZGRyICYgMHgwMSkgPT0gMCkpCisgICAgeworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZUF1dGhSZXFTYW5pdHkgZmFpbCAtIHdyb25nIGFsZ29yaXRobVxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBNbG1lQXNzb2NSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBcEFkZHIsCisgICAgT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAorICAgIE9VVCBVTE9ORyAqcFRpbWVvdXQsCisgICAgT1VUIFVTSE9SVCAqcExpc3RlbkludHYpCit7CisgICAgTUxNRV9BU1NPQ19SRVFfU1RSVUNUICpwSW5mbzsKKworICAgIHBJbmZvID0gKE1MTUVfQVNTT0NfUkVRX1NUUlVDVCAqKU1zZzsKKyAgICAqcFRpbWVvdXQgPSBwSW5mby0+VGltZW91dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRpbWVvdXQKKyAgICBDT1BZX01BQ19BRERSKHBBcEFkZHIsIHBJbmZvLT5BZGRyKTsgICAgICAgICAgICAgICAgICAgLy8gQVAgYWRkcmVzcworICAgICpwQ2FwYWJpbGl0eUluZm8gPSBwSW5mby0+Q2FwYWJpbGl0eUluZm87ICAgICAgICAgICAgICAgLy8gY2FwYWJpbGl0eSBpbmZvCisgICAgKnBMaXN0ZW5JbnR2ID0gcEluZm8tPkxpc3RlbkludHY7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gUGVlckRpc2Fzc29jU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQWRkcjIsCisgICAgT1VUIFVTSE9SVCAqcFJlYXNvbikKK3sKKyAgICBQRlJBTUVfODAyXzExIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKU1zZzsKKworICAgIENPUFlfTUFDX0FERFIocEFkZHIyLCBwRnJhbWUtPkhkci5BZGRyMik7CisgICAgTmRpc01vdmVNZW1vcnkocFJlYXNvbiwgJnBGcmFtZS0+T2N0ZXRbMF0sIDIpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJU2FuaXR5IGNoZWNrIE5ldHdvcmtUeXBlICgxMWIsIDExZyBvciAxMWEpCisKKwlBcmd1bWVudHM6CisJCXBCc3MgLSBQb2ludGVyIHRvIEJTUyB0YWJsZS4KKworCVJldHVybiBWYWx1ZToKKyAgICAgICAgTmRpczgwMl8xMURTIC4uLi4uLi4oMTFiKQorICAgICAgICBOZGlzODAyXzExT0ZETTI0Li4uLigxMWcpCisgICAgICAgIE5kaXM4MDJfMTFPRkRNNS4uLi4uKDExYSkKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU184MDJfMTFfTkVUV09SS19UWVBFIE5ldHdvcmtUeXBlSW5Vc2VTYW5pdHkoCisgICAgSU4gUEJTU19FTlRSWSBwQnNzKQoreworCU5ESVNfODAyXzExX05FVFdPUktfVFlQRQlOZXRXb3JrVHlwZTsKKwlVQ0hBUgkJCQkJCXJhdGUsIGk7CisKKwlOZXRXb3JrVHlwZSA9IE5kaXM4MDJfMTFEUzsKKworCWlmIChwQnNzLT5DaGFubmVsIDw9IDE0KQorCXsKKwkJLy8KKwkJLy8gRmlyc3QgY2hlY2sgc3VwcG9ydCBSYXRlLgorCQkvLworCQlmb3IgKGkgPSAwOyBpIDwgcEJzcy0+U3VwUmF0ZUxlbjsgaSsrKQorCQl7CisJCQlyYXRlID0gcEJzcy0+U3VwUmF0ZVtpXSAmIDB4N2Y7IC8vIE1hc2sgb3V0IGJhc2ljIHJhdGUgc2V0IGJpdAorCQkJaWYgKChyYXRlID09IDIpIHx8IChyYXRlID09IDQpIHx8IChyYXRlID09IDExKSB8fCAocmF0ZSA9PSAyMikpCisJCQl7CisJCQkJY29udGludWU7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8KKwkJCQkvLyBPdGhlcndpc2UgKGV2ZW4gcmF0ZSA+IDEwOCkgbWVhbnMgTmRpczgwMl8xMU9GRE0yNAorCQkJCS8vCisJCQkJTmV0V29ya1R5cGUgPSBOZGlzODAyXzExT0ZETTI0OworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLy8KKwkJLy8gU2Vjb25kIGNoZWNrIEV4dGVuZCBSYXRlLgorCQkvLworCQlpZiAoTmV0V29ya1R5cGUgIT0gTmRpczgwMl8xMU9GRE0yNCkKKwkJeworCQkJZm9yIChpID0gMDsgaSA8IHBCc3MtPkV4dFJhdGVMZW47IGkrKykKKwkJCXsKKwkJCQlyYXRlID0gcEJzcy0+U3VwUmF0ZVtpXSAmIDB4N2Y7IC8vIE1hc2sgb3V0IGJhc2ljIHJhdGUgc2V0IGJpdAorCQkJCWlmICgocmF0ZSA9PSAyKSB8fCAocmF0ZSA9PSA0KSB8fCAocmF0ZSA9PSAxMSkgfHwgKHJhdGUgPT0gMjIpKQorCQkJCXsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8vCisJCQkJCS8vIE90aGVyd2lzZSAoZXZlbiByYXRlID4gMTA4KSBtZWFucyBOZGlzODAyXzExT0ZETTI0CisJCQkJCS8vCisJCQkJCU5ldFdvcmtUeXBlID0gTmRpczgwMl8xMU9GRE0yNDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWVsc2UKKwl7CisJCU5ldFdvcmtUeXBlID0gTmRpczgwMl8xMU9GRE01OworCX0KKworICAgIGlmIChwQnNzLT5IdENhcGFiaWxpdHlMZW4gIT0gMCkKKyAgICB7CisgICAgICAgIGlmIChOZXRXb3JrVHlwZSA9PSBOZGlzODAyXzExT0ZETTUpCisgICAgICAgICAgICBOZXRXb3JrVHlwZSA9IE5kaXM4MDJfMTFPRkRNNV9OOworICAgICAgICBlbHNlCisgICAgICAgICAgICBOZXRXb3JrVHlwZSA9IE5kaXM4MDJfMTFPRkRNMjRfTjsKKyAgICB9CisKKwlyZXR1cm4gTmV0V29ya1R5cGU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgV1BBIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBQZWVyV3BhTWVzc2FnZVNhbml0eSgKKyAgICBJTiAJUFJUTVBfQURBUFRFUiAJCXBBZCwKKyAgICBJTiAJUEVBUE9MX1BBQ0tFVCAJCXBNc2csCisgICAgSU4gCVVMT05HIAkJCQlNc2dMZW4sCisgICAgSU4gCVVDSEFSCQkJCU1zZ1R5cGUsCisgICAgSU4gCU1BQ19UQUJMRV9FTlRSWSAgCSpwRW50cnkpCit7CisJVUNIQVIJCQltaWNbTEVOX0tFWV9ERVNDX01JQ10sIGRpZ2VzdFs4MF0sIEtFWURBVEFbTUFYX0xFTl9PRl9SU05JRV07CisJQk9PTEVBTgkJCWJSZXBsYXlEaWZmID0gRkFMU0U7CisJQk9PTEVBTgkJCWJXUEEyID0gRkFMU0U7CisJS0VZX0lORk8JCUVhcG9sS2V5SW5mbzsKKwlVQ0hBUgkJCUdyb3VwS2V5SW5kZXggPSAwOworCisKKwlOZGlzWmVyb01lbW9yeShtaWMsIHNpemVvZihtaWMpKTsKKwlOZGlzWmVyb01lbW9yeShkaWdlc3QsIHNpemVvZihkaWdlc3QpKTsKKwlOZGlzWmVyb01lbW9yeShLRVlEQVRBLCBzaXplb2YoS0VZREFUQSkpOworCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpJkVhcG9sS2V5SW5mbywgc2l6ZW9mKEVhcG9sS2V5SW5mbykpOworCisJTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikmRWFwb2xLZXlJbmZvLCAoUFVDSEFSKSZwTXNnLT5LZXlEZXNjLktleUluZm8sIHNpemVvZihLRVlfSU5GTykpOworCisJKigoVVNIT1JUICopJkVhcG9sS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQgKikmRWFwb2xLZXlJbmZvKSk7CisKKwkvLyBDaG9vc2UgV1BBMiBvciBub3QKKwlpZiAoKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCisJCWJXUEEyID0gVFJVRTsKKworCS8vIDAuIENoZWNrIE1zZ1R5cGUKKwlpZiAoKE1zZ1R5cGUgPiBFQVBPTF9HUk9VUF9NU0dfMikgfHwgKE1zZ1R5cGUgPCBFQVBPTF9QQUlSX01TR18xKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlRoZSBtZXNzYWdlIHR5cGUgaXMgaW52YWxpZCglZCkhIFxuIiwgTXNnVHlwZSkpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLy8gMS4gUmVwbGF5IGNvdW50ZXIgY2hlY2sKKyAJaWYgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMSB8fCBNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMgfHwgTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkJLy8gRm9yIHN1cHBsaWNhbnQKKyAgICB7CisgICAgCS8vIEZpcnN0IHZhbGlkYXRlIHJlcGxheSBjb3VudGVyLCBvbmx5IGFjY2VwdCBtZXNzYWdlIHdpdGggbGFyZ2VyIHJlcGxheSBjb3VudGVyLgorCQkvLyBMZXQgZXF1YWwgcGFzcywgc29tZSBBUCBzdGFydCB3aXRoIGFsbCB6ZXJvIHJlcGxheSBjb3VudGVyCisJCVVDSEFSCVplcm9SZXBsYXlbTEVOX0tFWV9ERVNDX1JFUExBWV07CisKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoWmVyb1JlcGxheSwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisJCWlmICgoUlRNUENvbXBhcmVNZW1vcnkocE1zZy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwRW50cnktPlJfQ291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSkgIT0gMSkgJiYKKwkJCShSVE1QQ29tcGFyZU1lbW9yeShwTXNnLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIFplcm9SZXBsYXksIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDApKQorICAgIAl7CisJCQliUmVwbGF5RGlmZiA9IFRSVUU7CisgICAgCX0KKyAJfQorCWVsc2UgaWYgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMiB8fCBNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzQgfHwgTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMikJLy8gRm9yIGF1dGhlbnRpY2F0b3IKKwl7CisJCS8vIGNoZWNrIFJlcGxheSBDb3VudGVyIGNvcmVzcG9uZHMgdG8gTVNHIGZyb20gYXV0aGVudGljYXRvciwgb3RoZXJ3aXNlIGRpc2NhcmQKKyAgICAJaWYgKCFOZGlzRXF1YWxNZW1vcnkocE1zZy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwRW50cnktPlJfQ291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSkpCisgICAgCXsKKwkJCWJSZXBsYXlEaWZmID0gVFJVRTsKKyAgICAJfQorCX0KKworCS8vIFJlcGxheSBDb3VudGVyIGRpZmZlcmVudCBjb25kaXRpb24KKwlpZiAoYlJlcGxheURpZmYpCisJeworCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIHJlcGxheSBjb3VudGVyIGRpZmZlcmVudAorCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19SRVBMQVlfQ09VTlRFUl9ESUZGX0VWRU5UX0ZMQUcsIHBFbnRyeS0+QWRkciwgcEVudHJ5LT5hcGlkeCwgMCk7CisKKwkJaWYgKE1zZ1R5cGUgPCBFQVBPTF9HUk9VUF9NU0dfMSkKKwkJeworICAgICAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUmVwbGF5IENvdW50ZXIgRGlmZmVyZW50IGluIHBhaXJ3aXNlIG1zZyAlZCBvZiA0LXdheSBoYW5kc2hha2UhXG4iLCBNc2dUeXBlKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSZXBsYXkgQ291bnRlciBEaWZmZXJlbnQgaW4gZ3JvdXAgbXNnICVkIG9mIDItd2F5IGhhbmRzaGFrZSFcbiIsIChNc2dUeXBlIC0gRUFQT0xfUEFJUl9NU0dfNCkpKTsKKwkJfQorCisJCWhleF9kdW1wKCJSZWNlaXZlIHJlcGxheSBjb3VudGVyICIsIHBNc2ctPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisJCWhleF9kdW1wKCJDdXJyZW50IHJlcGxheSBjb3VudGVyICIsIHBFbnRyeS0+Ul9Db3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCX0KKworCS8vIDIuIFZlcmlmeSBNSUMgZXhjZXB0IFBhaXJ3aXNlIE1zZzEKKwlpZiAoTXNnVHlwZSAhPSBFQVBPTF9QQUlSX01TR18xKQorCXsKKwkJVUNIQVIJCQlyY3ZkX21pY1tMRU5fS0VZX0RFU0NfTUlDXTsKKworCQkvLyBSZWNvcmQgdGhlIHJlY2VpdmVkIE1JQyBmb3IgY2hlY2sgbGF0ZXIKKwkJTmRpc01vdmVNZW1vcnkocmN2ZF9taWMsIHBNc2ctPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKwkJTmRpc1plcm9NZW1vcnkocE1zZy0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCisgICAgICAgIGlmIChwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQkvLyBUS0lQCisgICAgICAgIHsKKyAgICAgICAgICAgIGhtYWNfbWQ1KHBFbnRyeS0+UFRLLCBMRU5fRUFQX01JQ0ssIChQVUNIQVIpcE1zZywgTXNnTGVuLCBtaWMpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHBFbnRyeS0+V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCS8vIEFFUworICAgICAgICB7CisgICAgICAgICAgICBITUFDX1NIQTEoKFBVQ0hBUilwTXNnLCBNc2dMZW4sIHBFbnRyeS0+UFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShtaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIU5kaXNFcXVhbE1lbW9yeShyY3ZkX21pYywgbWljLCBMRU5fS0VZX0RFU0NfTUlDKSkKKyAgICAgICAgeworCQkJLy8gc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciBNSUMgZGlmZmVyZW50CisJCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfTUlDX0RJRkZfRVZFTlRfRkxBRywgcEVudHJ5LT5BZGRyLCBwRW50cnktPmFwaWR4LCAwKTsKKworCQkJaWYgKE1zZ1R5cGUgPCBFQVBPTF9HUk9VUF9NU0dfMSkKKwkJCXsKKyAgICAgICAgICAgIAlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJNSUMgRGlmZmVyZW50IGluIHBhaXJ3aXNlIG1zZyAlZCBvZiA0LXdheSBoYW5kc2hha2UhXG4iLCBNc2dUeXBlKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTUlDIERpZmZlcmVudCBpbiBncm91cCBtc2cgJWQgb2YgMi13YXkgaGFuZHNoYWtlIVxuIiwgKE1zZ1R5cGUgLSBFQVBPTF9QQUlSX01TR180KSkpOworCQkJfQorCisJCQloZXhfZHVtcCgiUmVjZWl2ZWQgTUlDIiwgcmN2ZF9taWMsIExFTl9LRVlfREVTQ19NSUMpOworCQkJaGV4X2R1bXAoIkRlc2lyZWQgIE1JQyIsIG1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKwkJCXJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCX0KKworCS8vIEV4dHJhY3QgdGhlIGNvbnRleHQgb2YgdGhlIEtleSBEYXRhIGZpZWxkIGlmIGl0IGV4aXN0CisJLy8gVGhlIGZpZWxkIGluIHBhaXJ3aXNlX21zZ18yX1dQQTEoV1BBMikgJiBwYWlyd2lzZV9tc2dfM19XUEExIGlzIHVuLWVuY3J5cHRlZC4KKwkvLyBUaGUgZmllbGQgaW4gZ3JvdXBfbXNnXzFfV1BBMShXUEEyKSAmIHBhaXJ3aXNlX21zZ18zX1dQQTIgaXMgZW5jcnlwdGVkLgorCWlmIChwTXNnLT5LZXlEZXNjLktleURhdGFMZW5bMV0gPiAwKQorCXsKKwkJLy8gRGVjcnlwdCB0aGlzIGZpZWxkCisJCWlmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zICYmIGJXUEEyKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpCisJCXsKKwkJCWlmKHBFbnRyeS0+V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCQl7CisJCQkJLy8gQUVTCisJCQkJQUVTX0dUS19LRVlfVU5XUkFQKCZwRW50cnktPlBUS1sxNl0sIEtFWURBVEEsIHBNc2ctPktleURlc2MuS2V5RGF0YUxlblsxXSxwTXNnLT5LZXlEZXNjLktleURhdGEpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUlOVCAJaTsKKwkJCQlVQ0hBUiAgIEtleVszMl07CisJCQkJLy8gRGVjcnlwdCBUS0lQIEdUSworCQkJCS8vIENvbnN0cnVjdCAzMiBieXRlcyBSQzQgS2V5CisJCQkJTmRpc01vdmVNZW1vcnkoS2V5LCBwTXNnLT5LZXlEZXNjLktleUl2LCAxNik7CisJCQkJTmRpc01vdmVNZW1vcnkoJktleVsxNl0sICZwRW50cnktPlBUS1sxNl0sIDE2KTsKKwkJCQlBUkNGT1VSX0lOSVQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgS2V5LCAzMik7CisJCQkJLy9kaXNjYXJkIGZpcnN0IDI1NiBieXRlcworCQkJCWZvcihpID0gMDsgaSA8IDI1NjsgaSsrKQorCQkJCQlBUkNGT1VSX0JZVEUoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCk7CisJCQkJLy8gRGVjcnlwdCBHVEsuIEJlY2FyZWZ1bCwgdGhlcmUgaXMgbm8gSUNWIHRvIGNoZWNrIHRoZSByZXN1bHQgaXMgY29ycmVjdCBvciBub3QKKwkJCQlBUkNGT1VSX0RFQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgS0VZREFUQSwgcE1zZy0+S2V5RGVzYy5LZXlEYXRhLCBwTXNnLT5LZXlEZXNjLktleURhdGFMZW5bMV0pOworCQkJfQorCisJCQlpZiAoIWJXUEEyICYmIChNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkKKwkJCQlHcm91cEtleUluZGV4ID0gRWFwb2xLZXlJbmZvLktleUluZGV4OworCisJCX0KKwkJZWxzZSBpZiAoKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMikgfHwgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMyAmJiAhYldQQTIpKQorCQl7CisJCQlOZGlzTW92ZU1lbW9yeShLRVlEQVRBLCBwTXNnLT5LZXlEZXNjLktleURhdGEsIHBNc2ctPktleURlc2MuS2V5RGF0YUxlblsxXSk7CisJCX0KKwkJZWxzZQorCQl7CisKKwkJCXJldHVybiBUUlVFOworCQl9CisKKwkJLy8gUGFyc2UgS2V5IERhdGEgZmllbGQgdG8KKwkJLy8gMS4gdmVyaWZ5IFJTTiBJRSBmb3IgcGFpcndpc2VfbXNnXzJfV1BBMShXUEEyKSAscGFpcndpc2VfbXNnXzNfV1BBMShXUEEyKQorCQkvLyAyLiB2ZXJpZnkgS0RFIGZvcm1hdCBmb3IgcGFpcndpc2VfbXNnXzNfV1BBMiwgZ3JvdXBfbXNnXzFfV1BBMgorCQkvLyAzLiB1cGRhdGUgc2hhcmVkIGtleSBmb3IgcGFpcndpc2VfbXNnXzNfV1BBMiwgZ3JvdXBfbXNnXzFfV1BBMShXUEEyKQorCQlpZiAoIVJUTVBQYXJzZUVhcG9sS2V5RGF0YShwQWQsIEtFWURBVEEsIHBNc2ctPktleURlc2MuS2V5RGF0YUxlblsxXSwgR3JvdXBLZXlJbmRleCwgTXNnVHlwZSwgYldQQTIsIHBFbnRyeSkpCisJCXsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCX0KKworCXJldHVybiBUUlVFOworCit9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKK0JPT0xFQU4gTWxtZURsc1JlcVNhbml0eSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQUlRfODAyXzExX0RMUyAqcERMUywKKyAgICBPVVQgUFVTSE9SVCBwUmVhc29uKQoreworCU1MTUVfRExTX1JFUV9TVFJVQ1QgKnBJbmZvOworCisgICAgcEluZm8gPSAoTUxNRV9ETFNfUkVRX1NUUlVDVCAqKU1zZzsKKworCSpwRExTID0gcEluZm8tPnBETFM7CisJKnBSZWFzb24gPSBwSW5mby0+UmVhc29uOworCisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKK0JPT0xFQU4gUGVlckRsc1JlcVNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcERBLAorICAgIE9VVCBQVUNIQVIgcFNBLAorICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKKyAgICBPVVQgVVNIT1JUICpwRGxzVGltZW91dCwKKyAgICBPVVQgVUNIQVIgKnBSYXRlc0xlbiwKKyAgICBPVVQgVUNIQVIgUmF0ZXNbXSwKKwlPVVQgVUNIQVIgKnBIdENhcGFiaWxpdHlMZW4sCisgICAgT1VUIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHkpCit7CisJQ0hBUiAgICAgICAgICAgICpQdHI7CisgICAgUEZSQU1FXzgwMl8xMQlGciA9IChQRlJBTUVfODAyXzExKU1zZzsKKwlQRUlEX1NUUlVDVCAgZWlkX3B0cjsKKworICAgIC8vIHRvIHByZXZlbnQgY2FsbGVyIGZyb20gdXNpbmcgZ2FyYmFnZSBvdXRwdXQgdmFsdWUKKyAgICAqcENhcGFiaWxpdHlJbmZvCT0gMDsKKyAgICAqcERsc1RpbWVvdXQJPSAwOworCSpwSHRDYXBhYmlsaXR5TGVuID0gMDsKKworICAgIFB0ciA9IEZyLT5PY3RldDsKKworCS8vIG9mZnNldCB0byBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcyAoQ2F0ZWdvcnkgYW5kIEFjdGlvbiBmaWVsZCkKKyAgICBQdHIgKz0gMjsKKworICAgIC8vIGdldCBEQSBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICBOZGlzTW92ZU1lbW9yeShwREEsIFB0ciwgTUFDX0FERFJfTEVOKTsKKyAgICBQdHIgKz0gTUFDX0FERFJfTEVOOworCisgICAgLy8gZ2V0IFNBIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBTQSwgUHRyLCBNQUNfQUREUl9MRU4pOworICAgIFB0ciArPSBNQUNfQUREUl9MRU47CisKKyAgICAvLyBnZXQgY2FwYWJpbGl0eSBpbmZvIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBDYXBhYmlsaXR5SW5mbywgUHRyLCAyKTsKKyAgICBQdHIgKz0gMjsKKworICAgIC8vIGdldCBjYXBhYmlsaXR5IGluZm8gZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisgICAgTmRpc01vdmVNZW1vcnkocERsc1RpbWVvdXQsIFB0ciwgMik7CisgICAgUHRyICs9IDI7CisKKwkvLyBDYXRlZ29yeSBhbmQgQWN0aW9uIGZpZWxkICsgREEgKyBTQSArIGNhcGFiaWxpdHkgKyBUaW1lb3V0CisJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkgJkZyLT5PY3RldFsxOF07CisKKwl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChVQ0hBUiopRnIgKyBNc2dMZW4pKQorCXsKKwkJc3dpdGNoKGVpZF9wdHItPkVpZCkKKwkJeworCQkJY2FzZSBJRV9TVVBQX1JBVEVTOgorICAgICAgICAgICAgICAgIGlmICgoZWlkX3B0ci0+TGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKSAmJiAoZWlkX3B0ci0+TGVuID4gMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShSYXRlcywgZWlkX3B0ci0+T2N0ZXQsIGVpZF9wdHItPkxlbik7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJEbHNSZXFTYW5pdHkgLSBJRV9TVVBQX1JBVEVTLiwgTGVuPSVkLiBSYXRlc1swXT0leFxuIixlaWRfcHRyLT5MZW4sIFJhdGVzWzBdKSk7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhdGVzWzFdPSV4ICV4ICV4ICV4ICV4ICV4ICV4XG4iLCBSYXRlc1sxXSwgUmF0ZXNbMl0sIFJhdGVzWzNdLCBSYXRlc1s0XSwgUmF0ZXNbNV0sIFJhdGVzWzZdLCBSYXRlc1s3XSkpOworICAgICAgICAgICAgICAgICAgICAqcFJhdGVzTGVuID0gZWlkX3B0ci0+TGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqcFJhdGVzTGVuID0gODsKKwkJCQkJUmF0ZXNbMF0gPSAweDgyOworCQkJCQlSYXRlc1sxXSA9IDB4ODQ7CisJCQkJCVJhdGVzWzJdID0gMHg4YjsKKwkJCQkJUmF0ZXNbM10gPSAweDk2OworCQkJCQlSYXRlc1s0XSA9IDB4MTI7CisJCQkJCVJhdGVzWzVdID0gMHgyNDsKKwkJCQkJUmF0ZXNbNl0gPSAweDQ4OworCQkJCQlSYXRlc1s3XSA9IDB4NmM7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJEbHNSZXFTYW5pdHkgLSB3cm9uZyBJRV9TVVBQX1JBVEVTLiwgTGVuPSVkXG4iLGVpZF9wdHItPkxlbikpOworICAgICAgICAgICAgICAgIH0KKwkJCQlicmVhazsKKworCQkJY2FzZSBJRV9FWFRfU1VQUF9SQVRFUzoKKyAgICAgICAgICAgICAgICBpZiAoZWlkX3B0ci0+TGVuICsgKnBSYXRlc0xlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZSYXRlc1sqcFJhdGVzTGVuXSwgZWlkX3B0ci0+T2N0ZXQsIGVpZF9wdHItPkxlbik7CisgICAgICAgICAgICAgICAgICAgICpwUmF0ZXNMZW4gPSAoKnBSYXRlc0xlbikgKyBlaWRfcHRyLT5MZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZSYXRlc1sqcFJhdGVzTGVuXSwgZWlkX3B0ci0+T2N0ZXQsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTIC0gKCpwUmF0ZXNMZW4pKTsKKyAgICAgICAgICAgICAgICAgICAgKnBSYXRlc0xlbiA9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOworICAgICAgICAgICAgICAgIH0KKwkJCQlicmVhazsKKworCQkJY2FzZSBJRV9IVF9DQVA6CisJCQkJaWYgKGVpZF9wdHItPkxlbiA+PSBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpCisJCQkJeworCQkJCQlOZGlzTW92ZU1lbW9yeShwSHRDYXBhYmlsaXR5LCBlaWRfcHRyLT5PY3RldCwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKKworCQkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pKTsKKwkJCQkJKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSk7CisJCQkJCSpwSHRDYXBhYmlsaXR5TGVuID0gc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpOworCisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJEbHNSZXFTYW5pdHkgLSBJRV9IVF9DQVBcbiIpKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckRsc1JlcVNhbml0eSAtIHdyb25nIElFX0hUX0NBUC5laWRfcHRyLT5MZW4gPSAlZFxuIiwgZWlkX3B0ci0+TGVuKSk7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisKKwkJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKillaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7CisJfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK0JPT0xFQU4gUGVlckRsc1JzcFNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcERBLAorICAgIE9VVCBQVUNIQVIgcFNBLAorICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKKyAgICBPVVQgVVNIT1JUICpwU3RhdHVzLAorICAgIE9VVCBVQ0hBUiAqcFJhdGVzTGVuLAorICAgIE9VVCBVQ0hBUiBSYXRlc1tdLAorICAgIE9VVCBVQ0hBUiAqcEh0Q2FwYWJpbGl0eUxlbiwKKyAgICBPVVQgSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSkKK3sKKyAgICBDSEFSICAgICAgICAgICAgKlB0cjsKKyAgICBQRlJBTUVfODAyXzExCUZyID0gKFBGUkFNRV84MDJfMTEpTXNnOworCVBFSURfU1RSVUNUICBlaWRfcHRyOworCisgICAgLy8gdG8gcHJldmVudCBjYWxsZXIgZnJvbSB1c2luZyBnYXJiYWdlIG91dHB1dCB2YWx1ZQorICAgICpwU3RhdHVzCQk9IDA7CisgICAgKnBDYXBhYmlsaXR5SW5mbwk9IDA7CisJKnBIdENhcGFiaWxpdHlMZW4gPSAwOworCisgICAgUHRyID0gRnItPk9jdGV0OworCisJLy8gb2Zmc2V0IHRvIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzIChDYXRlZ29yeSBhbmQgQWN0aW9uIGZpZWxkKQorICAgIFB0ciArPSAyOworCisJLy8gZ2V0IHN0YXR1cyBjb2RlIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBTdGF0dXMsIFB0ciwgMik7CisgICAgUHRyICs9IDI7CisKKyAgICAvLyBnZXQgREEgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisgICAgTmRpc01vdmVNZW1vcnkocERBLCBQdHIsIE1BQ19BRERSX0xFTik7CisgICAgUHRyICs9IE1BQ19BRERSX0xFTjsKKworICAgIC8vIGdldCBTQSBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICBOZGlzTW92ZU1lbW9yeShwU0EsIFB0ciwgTUFDX0FERFJfTEVOKTsKKyAgICBQdHIgKz0gTUFDX0FERFJfTEVOOworCisJaWYgKHBTdGF0dXMgPT0gMCkKKwl7CisJICAgIC8vIGdldCBjYXBhYmlsaXR5IGluZm8gZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisJICAgIE5kaXNNb3ZlTWVtb3J5KHBDYXBhYmlsaXR5SW5mbywgUHRyLCAyKTsKKwkgICAgUHRyICs9IDI7CisJfQorCisJLy8gQ2F0ZWdvcnkgYW5kIEFjdGlvbiBmaWVsZCArIHN0YXR1cyBjb2RlICsgREEgKyBTQSArIGNhcGFiaWxpdHkKKwllaWRfcHRyID0gKFBFSURfU1RSVUNUKSAmRnItPk9jdGV0WzE4XTsKKworCXdoaWxlICgoKFVDSEFSKillaWRfcHRyICsgZWlkX3B0ci0+TGVuICsgMSkgPCAoKFVDSEFSKilGciArIE1zZ0xlbikpCisJeworCQlzd2l0Y2goZWlkX3B0ci0+RWlkKQorCQl7CisJCQljYXNlIElFX1NVUFBfUkFURVM6CisgICAgICAgICAgICAgICAgaWYgKChlaWRfcHRyLT5MZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpICYmIChlaWRfcHRyLT5MZW4gPiAwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFJhdGVzLCBlaWRfcHRyLT5PY3RldCwgZWlkX3B0ci0+TGVuKTsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckRsc1JzcFNhbml0eSAtIElFX1NVUFBfUkFURVMuLCBMZW49JWQuIFJhdGVzWzBdPSV4XG4iLGVpZF9wdHItPkxlbiwgUmF0ZXNbMF0pKTsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmF0ZXNbMV09JXggJXggJXggJXggJXggJXggJXhcbiIsIFJhdGVzWzFdLCBSYXRlc1syXSwgUmF0ZXNbM10sIFJhdGVzWzRdLCBSYXRlc1s1XSwgUmF0ZXNbNl0sIFJhdGVzWzddKSk7CisgICAgICAgICAgICAgICAgICAgICpwUmF0ZXNMZW4gPSBlaWRfcHRyLT5MZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICpwUmF0ZXNMZW4gPSA4OworCQkJCQlSYXRlc1swXSA9IDB4ODI7CisJCQkJCVJhdGVzWzFdID0gMHg4NDsKKwkJCQkJUmF0ZXNbMl0gPSAweDhiOworCQkJCQlSYXRlc1szXSA9IDB4OTY7CisJCQkJCVJhdGVzWzRdID0gMHgxMjsKKwkJCQkJUmF0ZXNbNV0gPSAweDI0OworCQkJCQlSYXRlc1s2XSA9IDB4NDg7CisJCQkJCVJhdGVzWzddID0gMHg2YzsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckRsc1JzcFNhbml0eSAtIHdyb25nIElFX1NVUFBfUkFURVMuLCBMZW49JWRcbiIsZWlkX3B0ci0+TGVuKSk7CisgICAgICAgICAgICAgICAgfQorCQkJCWJyZWFrOworCisJCQljYXNlIElFX0VYVF9TVVBQX1JBVEVTOgorICAgICAgICAgICAgICAgIGlmIChlaWRfcHRyLT5MZW4gKyAqcFJhdGVzTGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoJlJhdGVzWypwUmF0ZXNMZW5dLCBlaWRfcHRyLT5PY3RldCwgZWlkX3B0ci0+TGVuKTsKKyAgICAgICAgICAgICAgICAgICAgKnBSYXRlc0xlbiA9ICgqcFJhdGVzTGVuKSArIGVpZF9wdHItPkxlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoJlJhdGVzWypwUmF0ZXNMZW5dLCBlaWRfcHRyLT5PY3RldCwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMgLSAoKnBSYXRlc0xlbikpOworICAgICAgICAgICAgICAgICAgICAqcFJhdGVzTGVuID0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVM7CisgICAgICAgICAgICAgICAgfQorCQkJCWJyZWFrOworCisJCQljYXNlIElFX0hUX0NBUDoKKwkJCQlpZiAoZWlkX3B0ci0+TGVuID49IHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSkKKwkJCQl7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBIdENhcGFiaWxpdHksIGVpZF9wdHItPk9jdGV0LCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOworCisJCQkJCSooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkh0Q2FwSW5mbykpOworCQkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8pKTsKKwkJCQkJKnBIdENhcGFiaWxpdHlMZW4gPSBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSk7CisKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckRsc1JzcFNhbml0eSAtIElFX0hUX0NBUFxuIikpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyRGxzUnNwU2FuaXR5IC0gd3JvbmcgSUVfSFRfQ0FQLmVpZF9wdHItPkxlbiA9ICVkXG4iLCBlaWRfcHRyLT5MZW4pKTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KKworCQllaWRfcHRyID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKWVpZF9wdHIgKyAyICsgZWlkX3B0ci0+TGVuKTsKKwl9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworQk9PTEVBTiBQZWVyRGxzVGVhckRvd25TYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBEQSwKKyAgICBPVVQgUFVDSEFSIHBTQSwKKyAgICBPVVQgVVNIT1JUICpwUmVhc29uKQoreworICAgIENIQVIgICAgICAgICAgICAqUHRyOworICAgIFBGUkFNRV84MDJfMTEJRnIgPSAoUEZSQU1FXzgwMl8xMSlNc2c7CisKKyAgICAvLyB0byBwcmV2ZW50IGNhbGxlciBmcm9tIHVzaW5nIGdhcmJhZ2Ugb3V0cHV0IHZhbHVlCisgICAgKnBSZWFzb24JPSAwOworCisgICAgUHRyID0gRnItPk9jdGV0OworCisJLy8gb2Zmc2V0IHRvIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzIChDYXRlZ29yeSBhbmQgQWN0aW9uIGZpZWxkKQorICAgIFB0ciArPSAyOworCisgICAgLy8gZ2V0IERBIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIE5kaXNNb3ZlTWVtb3J5KHBEQSwgUHRyLCBNQUNfQUREUl9MRU4pOworICAgIFB0ciArPSBNQUNfQUREUl9MRU47CisKKyAgICAvLyBnZXQgU0EgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisgICAgTmRpc01vdmVNZW1vcnkocFNBLCBQdHIsIE1BQ19BRERSX0xFTik7CisgICAgUHRyICs9IE1BQ19BRERSX0xFTjsKKworCS8vIGdldCByZWFzb24gY29kZSBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKKyAgICBOZGlzTW92ZU1lbW9yeShwUmVhc29uLCBQdHIsIDIpOworICAgIFB0ciArPSAyOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9zeW5jLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fc3luYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZTdjNzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fc3luYy5jCkBAIC0wLDAgKzEsNzExIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXN5bmMuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUpvaG4gQ2hhbmcJMjAwNC0wOS0wMSAgICAgIG1vZGlmaWVkIGZvciBydDI1NjEvMjY2MQorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworLy8gMi40IEdoeiBjaGFubmVsIHBsYW4gaW5kZXggaW4gdGhlIFR4UG93ZXIgYXJyYXlzLgorI2RlZmluZQlCR19CQU5EX1JFR0lPTl8wX1NUQVJUCTAJCQkvLyAxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMQorI2RlZmluZQlCR19CQU5EX1JFR0lPTl8wX1NJWkUJMTEKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fMV9TVEFSVAkwCQkJLy8gMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fMV9TSVpFCTEzCisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzJfU1RBUlQJOQkJCS8vIDEwLDExCisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzJfU0laRQkyCisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzNfU1RBUlQJOQkJCS8vIDEwLDExLDEyLDEzCisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzNfU0laRQk0CisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzRfU1RBUlQJMTMJCQkvLyAxNAorI2RlZmluZQlCR19CQU5EX1JFR0lPTl80X1NJWkUJMQorI2RlZmluZQlCR19CQU5EX1JFR0lPTl81X1NUQVJUCTAJCQkvLyAxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNAorI2RlZmluZQlCR19CQU5EX1JFR0lPTl81X1NJWkUJMTQKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fNl9TVEFSVAkyCQkJLy8gMyw0LDUsNiw3LDgsOQorI2RlZmluZQlCR19CQU5EX1JFR0lPTl82X1NJWkUJNworI2RlZmluZQlCR19CQU5EX1JFR0lPTl83X1NUQVJUCTQJCQkvLyA1LDYsNyw4LDksMTAsMTEsMTIsMTMKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fN19TSVpFCTkKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fMzFfU1RBUlQJMAkJCS8vIDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0CisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzMxX1NJWkUJMTQKKworLy8gNSBHaHogY2hhbm5lbCBwbGFuIGluZGV4IGluIHRoZSBUeFBvd2VyIGFycmF5cy4KK1VDSEFSIEFfQkFORF9SRUdJT05fMF9DSEFOTkVMX0xJU1RbXT17MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NX07CitVQ0hBUiBBX0JBTkRfUkVHSU9OXzFfQ0hBTk5FTF9MSVNUW109ezM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDB9OworVUNIQVIgQV9CQU5EX1JFR0lPTl8yX0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjR9OworVUNIQVIgQV9CQU5EX1JFR0lPTl8zX0NIQU5ORUxfTElTVFtdPXs1MiwgNTYsIDYwLCA2NCwgMTQ5LCAxNTMsIDE1NywgMTYxfTsKK1VDSEFSIEFfQkFORF9SRUdJT05fNF9DSEFOTkVMX0xJU1RbXT17MTQ5LCAxNTMsIDE1NywgMTYxLCAxNjV9OworVUNIQVIgQV9CQU5EX1JFR0lPTl81X0NIQU5ORUxfTElTVFtdPXsxNDksIDE1MywgMTU3LCAxNjF9OworVUNIQVIgQV9CQU5EX1JFR0lPTl82X0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OH07CitVQ0hBUiBBX0JBTkRfUkVHSU9OXzdfQ0hBTk5FTF9MSVNUW109ezM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDAsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1fTsKK1VDSEFSIEFfQkFORF9SRUdJT05fOF9DSEFOTkVMX0xJU1RbXT17NTIsIDU2LCA2MCwgNjR9OworVUNIQVIgQV9CQU5EX1JFR0lPTl85X0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMzIsIDEzNiwgMTQwLCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NX07CitVQ0hBUiBBX0JBTkRfUkVHSU9OXzEwX0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjV9OworVUNIQVIgQV9CQU5EX1JFR0lPTl8xMV9DSEFOTkVMX0xJU1RbXT17MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxNDksIDE1MywgMTU3LCAxNjF9OworCisvL0JhU2l6ZUFycmF5IGZvbGxvd3MgdGhlIDgwMi4xMW4gZGVmaW5pdGlvbiBhcyBNYXhSeEZhY3Rvci4gIDJeKDEzK2ZhY3RvcikgYnl0ZXMuIFdoZW4gZmFjdG9yID0wLCBpdCdzIGFib3V0IEJhIGJ1ZmZlciBzaXplID04LgorVUNIQVIgQmFTaXplQXJyYXlbNF0gPSB7OCwxNiwzMiw2NH07CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVXBkYXRlIFN0YUNmZy0+Q2hhbm5lbExpc3RbXSBhY2NvcmRpbmcgdG8gMSkgQ291bnRyeSBSZWdpb24gMikgUkYgSUMgdHlwZSwKKwkJYW5kIDMpIFBIWS1tb2RlIHVzZXIgc2VsZWN0ZWQuCisJCVRoZSBvdXRjb21lIGlzIHVzZWQgYnkgZHJpdmVyIHdoZW4gZG9pbmcgc2l0ZSBzdXJ2ZXkuCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBCdWlsZENoYW5uZWxMaXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVVDSEFSIGksIGosIGluZGV4PTAsIG51bT0wOworCVBVQ0hBUglwQ2hhbm5lbExpc3QgPSBOVUxMOworCisJTmRpc1plcm9NZW1vcnkocEFkLT5DaGFubmVsTGlzdCwgTUFYX05VTV9PRl9DSEFOTkVMUyAqIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSk7CisKKwkvLyBpZiBub3QgMTFhLW9ubHkgbW9kZSwgY2hhbm5lbCBsaXN0IHN0YXJ0cyBmcm9tIDIuNEdoeiBiYW5kCisJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlICE9IFBIWV8xMUEpCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCSYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlICE9IFBIWV8xMUFOX01JWEVEKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSAhPSBQSFlfMTFOXzVHKQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCSkKKwl7CisJCXN3aXRjaCAocEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiAgJiAweDdmKQorCQl7CisJCQljYXNlIFJFR0lPTl8wX0JHX0JBTkQ6CS8vIDEgLTExCisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzBfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl8wX1NJWkUpOworCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzBfU0laRTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzFfQkdfQkFORDoJLy8gMSAtIDEzCisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzFfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl8xX1NJWkUpOworCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzFfU0laRTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzJfQkdfQkFORDoJLy8gMTAgLSAxMQorCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl8yX1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fMl9TSVpFKTsKKwkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl8yX1NJWkU7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl8zX0JHX0JBTkQ6CS8vIDEwIC0gMTMKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fM19TVEFSVF0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSAqIEJHX0JBTkRfUkVHSU9OXzNfU0laRSk7CisJCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fM19TSVpFOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fNF9CR19CQU5EOgkvLyAxNAorCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl80X1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fNF9TSVpFKTsKKwkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl80X1NJWkU7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl81X0JHX0JBTkQ6CS8vIDEgLSAxNAorCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl81X1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fNV9TSVpFKTsKKwkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl81X1NJWkU7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl82X0JHX0JBTkQ6CS8vIDMgLSA5CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzZfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl82X1NJWkUpOworCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzZfU0laRTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzdfQkdfQkFORDogIC8vIDUgLSAxMworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl83X1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fN19TSVpFKTsKKwkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl83X1NJWkU7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl8zMV9CR19CQU5EOgkvLyAxIC0gMTQKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fMzFfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl8zMV9TSVpFKTsKKwkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl8zMV9TSVpFOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDogICAgICAgICAgICAvLyBFcnJvci4gc2hvdWxkIG5ldmVyIGhhcHBlbgorCQkJCWJyZWFrOworCQl9CisJCWZvciAoaT0wOyBpPGluZGV4OyBpKyspCisJCQlwQWQtPkNoYW5uZWxMaXN0W2ldLk1heFR4UHdyID0gMjA7CisJfQorCisJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUEpIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFCR19NSVhFRCkKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHTl9NSVhFRCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQU5fTUlYRUQpCisJCXx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFHTl9NSVhFRCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl81RykKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkpCisJeworCQlzd2l0Y2ggKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCAmIDB4N2YpCisJCXsKKwkJCWNhc2UgUkVHSU9OXzBfQV9CQU5EOgorCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzBfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOworCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fMF9DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl8xX0FfQkFORDoKKwkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl8xX0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKKwkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzFfQ0hBTk5FTF9MSVNUOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fMl9BX0JBTkQ6CisJCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fMl9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7CisJCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8yX0NIQU5ORUxfTElTVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzNfQV9CQU5EOgorCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzNfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOworCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fM19DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl80X0FfQkFORDoKKwkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl80X0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKKwkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzRfQ0hBTk5FTF9MSVNUOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fNV9BX0JBTkQ6CisJCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fNV9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7CisJCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl81X0NIQU5ORUxfTElTVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzZfQV9CQU5EOgorCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzZfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOworCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fNl9DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisJCQljYXNlIFJFR0lPTl83X0FfQkFORDoKKwkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl83X0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKKwkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzdfQ0hBTk5FTF9MSVNUOworCQkJCWJyZWFrOworCQkJY2FzZSBSRUdJT05fOF9BX0JBTkQ6CisJCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fOF9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7CisJCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl84X0NIQU5ORUxfTElTVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVHSU9OXzlfQV9CQU5EOgorCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzlfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOworCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fOV9DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUkVHSU9OXzEwX0FfQkFORDoKKwkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl8xMF9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7CisJCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8xMF9DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUkVHSU9OXzExX0FfQkFORDoKKwkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl8xMV9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7CisJCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8xMV9DSEFOTkVMX0xJU1Q7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6ICAgICAgICAgICAgLy8gRXJyb3IuIHNob3VsZCBuZXZlciBoYXBwZW4KKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCgiY291bnRyeXJlZ2lvbj0lZCBub3Qgc3VwcG9ydCIsIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCkpOworCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKG51bSAhPSAwKQorCQl7CisJCQlVQ0hBUiBSYWRhckNoWzE1XT17NTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwfTsKKwkJCWZvciAoaT0wOyBpPG51bTsgaSsrKQorCQkJeworCQkJCWZvciAoaj0wOyBqPE1BWF9OVU1fT0ZfQ0hBTk5FTFM7IGorKykKKwkJCQl7CisJCQkJCWlmIChwQ2hhbm5lbExpc3RbaV0gPT0gcEFkLT5UeFBvd2VyW2pdLkNoYW5uZWwpCisJCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleCtpXSwgJnBBZC0+VHhQb3dlcltqXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpKTsKKwkJCQkJfQorCQkJCWZvciAoaj0wOyBqPDE1OyBqKyspCisJCQkJeworCQkJCQlpZiAocENoYW5uZWxMaXN0W2ldID09IFJhZGFyQ2hbal0pCisJCQkJCQlwQWQtPkNoYW5uZWxMaXN0W2luZGV4K2ldLkRmc1JlcSA9IFRSVUU7CisJCQkJfQorCQkJCXBBZC0+Q2hhbm5lbExpc3RbaW5kZXgraV0uTWF4VHhQd3IgPSAyMDsKKwkJCX0KKwkJCWluZGV4ICs9IG51bTsKKwkJfQorCX0KKworCXBBZC0+Q2hhbm5lbExpc3ROdW0gPSBpbmRleDsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoImNvdW50cnkgY29kZT0lZC8lZCwgUkZJQz0lZCwgUEhZIG1vZGU9JWQsIHN1cHBvcnQgJWQgY2hhbm5lbHNcbiIsCisJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24sIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCwgcEFkLT5SZkljVHlwZSwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSwgcEFkLT5DaGFubmVsTGlzdE51bSkpOworI2lmZGVmIERCRworCWZvciAoaT0wO2k8cEFkLT5DaGFubmVsTGlzdE51bTtpKyspCisJeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJCdWlsZENoYW5uZWwgIyAlZCA6OiBQd3IwID0gJWQsIFB3cjEgPSVkLCBcbiAiLCBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwsIHBBZC0+Q2hhbm5lbExpc3RbaV0uUG93ZXIsIHBBZC0+Q2hhbm5lbExpc3RbaV0uUG93ZXIyKSk7CisJfQorI2VuZGlmCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIHJldHVybiB0aGUgZmlyc3QgY2hhbm5lbCBudW1iZXIgYWNjb3JkaW5nIHRvIHRoZSBjb3VudHJ5CisJCWNvZGUgc2VsZWN0aW9uIGFuZCBSRiBJQyBzZWxlY3Rpb24gKHNpZ25hbCBiYW5kIG9yIGR1YWwgYmFuZCkuIEl0IGlzIGNhbGxlZAorCQl3aGVuZXZlciBkcml2ZXIgbmVlZCB0byBzdGFydCBhIHNpdGUgc3VydmV5IG9mIGFsbCBzdXBwb3J0ZWQgY2hhbm5lbHMuCisJUmV0dXJuOgorCQljaCAtIHRoZSBmaXJzdCBjaGFubmVsIG51bWJlciBvZiBjdXJyZW50IGNvdW50cnkgY29kZSBzZXR0aW5nCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVUNIQVIgRmlyc3RDaGFubmVsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCXJldHVybiBwQWQtPkNoYW5uZWxMaXN0WzBdLkNoYW5uZWw7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIG5leHQgY2hhbm5lbCBudW1iZXIuIFRoaXMgcm91dGluZSBpcyBjYWxsZWQKKwkJZHVyaW5nIGRyaXZlciBuZWVkIHRvIHN0YXJ0IGEgc2l0ZSBzdXJ2ZXkgb2YgYWxsIHN1cHBvcnRlZCBjaGFubmVscy4KKwlSZXR1cm46CisJCW5leHRfY2hhbm5lbCAtIHRoZSBuZXh0IGNoYW5uZWwgbnVtYmVyIHZhbGlkIGluIGN1cnJlbnQgY291bnRyeSBjb2RlIHNldHRpbmcuCisJTm90ZToKKwkJcmV0dXJuIDAgaWYgbm8gbW9yZSBuZXh0IGNoYW5uZWwKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitVQ0hBUiBOZXh0Q2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiBjaGFubmVsKQoreworCWludCBpOworCVVDSEFSIG5leHRfY2hhbm5lbCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgKHBBZC0+Q2hhbm5lbExpc3ROdW0gLSAxKTsgaSsrKQorCQlpZiAoY2hhbm5lbCA9PSBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwpCisJCXsKKwkJCW5leHRfY2hhbm5lbCA9IHBBZC0+Q2hhbm5lbExpc3RbaSsxXS5DaGFubmVsOworCQkJYnJlYWs7CisJfQorCXJldHVybiBuZXh0X2NoYW5uZWw7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIGlzIGZvciBDaXNjbyBDb21wYXRpYmxlIEV4dGVuc2lvbnMgMi5YCisJCVNwZWMzMS4gQVAgQ29udHJvbCBvZiBDbGllbnQgVHJhbnNtaXQgUG93ZXIKKwlSZXR1cm46CisJCU5vbmUKKwlOb3RlOgorCSAgIFJlcXVpcmVkIGJ5IEFpcm9uZXQgZEJtKG1XKQorCQkgICAwZEJtKDFtVyksICAgMWRCbSg1bVcpLCAxM2RCbSgyMG1XKSwgMTVkQm0oMzBtVyksCisJCSAgMTdkQm0oNTBtdyksIDIwZEJtKDEwMG1XKQorCisJICAgV2Ugc3VwcG9ydGVkCisJCSAgIDNkQm0oTG93ZXN0KSwgNmRCbSgxMCUpLCA5ZEJtKDI1JSksIDEyZEJtKDUwJSksCisJCSAgMTRkQm0oNzUlKSwgICAxNWRCbSgxMDAlKQorCisJCVRoZSBjbGllbnQgc3RhdGlvbidzIGFjdHVhbCB0cmFuc21pdCBwb3dlciBzaGFsbCBiZSB3aXRoaW4gKy8tIDVkQiBvZgorCQl0aGUgbWluaW11bSB2YWx1ZSBvciBuZXh0IGxvd2VyIHZhbHVlLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQ2hhbmdlVG9DZWxsUG93ZXJMaW1pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiAgICAgICAgIEFpcm9uZXRDZWxsUG93ZXJMaW1pdCkKK3sKKwkvL3ZhbHVkIDB4RkYgbWVhbnMgdGhhdCBoYXNuJ3QgZm91bmQgcG93ZXIgbGltaXQgaW5mb3JtYXRpb24KKwkvL2Zyb20gdGhlIEFQJ3MgQmVhY29uL1Byb2JlIHJlc3BvbnNlLgorCWlmIChBaXJvbmV0Q2VsbFBvd2VyTGltaXQgPT0gMHhGRikKKwkJcmV0dXJuOworCisJaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA8IDYpIC8vVXNlZCBMb3dlc3QgUG93ZXIgUGVyY2VudGFnZS4KKwkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSA2OworCWVsc2UgaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA8IDkpCisJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gMTA7CisJZWxzZSBpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0IDwgMTIpCisJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gMjU7CisJZWxzZSBpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0IDwgMTQpCisJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gNTA7CisJZWxzZSBpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0IDwgMTUpCisJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gNzU7CisJZWxzZQorCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IDEwMDsgLy9lbHNlIHVzZWQgbWF4aW11bQorCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQpCisJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQ7CisKK30KKworQ0hBUglDb252ZXJ0VG9Sc3NpKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOCUNIQVIJCQlSc3NpLAorCUlOICBVQ0hBUiAgIFJzc2lOdW1iZXIpCit7CisJVUNIQVIJUnNzaU9mZnNldCwgTE5BR2FpbjsKKworCS8vIFJzc2kgZXF1YWxzIHRvIHplcm8gc2hvdWxkIGJlIGFuIGludmFsaWQgdmFsdWUKKwlpZiAoUnNzaSA9PSAwKQorCQlyZXR1cm4gLTk5OworCisJTE5BR2FpbiA9IEdFVF9MTkFfR0FJTihwQWQpOworICAgIGlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkKKyAgICB7CisgICAgICAgIGlmIChSc3NpTnVtYmVyID09IDApCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5BUnNzaU9mZnNldDA7CisJCWVsc2UgaWYgKFJzc2lOdW1iZXIgPT0gMSkKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkFSc3NpT2Zmc2V0MTsKKwkJZWxzZQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QVJzc2lPZmZzZXQyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoUnNzaU51bWJlciA9PSAwKQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MDsKKwkJZWxzZSBpZiAoUnNzaU51bWJlciA9PSAxKQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MTsKKwkJZWxzZQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QkdSc3NpT2Zmc2V0MjsKKyAgICB9CisKKyAgICByZXR1cm4gKC0xMiAtIFJzc2lPZmZzZXQgLSBMTkFHYWluIC0gUnNzaSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJU2NhbiBuZXh0IGNoYW5uZWwKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFNjYW5OZXh0Q2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlIRUFERVJfODAyXzExICAgSGRyODAyMTE7CisJUFVDSEFSICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTICAgICBOU3RhdHVzOworCVVMT05HICAgICAgICAgICBGcmFtZUxlbiA9IDA7CisJVUNIQVIgICAgICAgICAgIFNzaWRMZW4gPSAwLCBTY2FuVHlwZSA9IHBBZC0+TWxtZUF1eC5TY2FuVHlwZSwgQkJQVmFsdWUgPSAwOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCVVTSE9SVCAgICAgICAgICBTdGF0dXM7CisJUEhFQURFUl84MDJfMTEgIHBIZHI4MDIxMTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlVSU5UCQkJU2NhblRpbWVJbjVnQ2hhbm5lbCA9IFNIT1JUX0NIQU5ORUxfVElNRTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlpZiAoTU9OSVRPUl9PTihwQWQpKQorCQkJcmV0dXJuOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIFJBTElOS19BVEUKKwkvLyBOb3RoaW5nIHRvIGRvIGluIEFURSBtb2RlLgorCWlmIChBVEVfT04ocEFkKSkKKwkJcmV0dXJuOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA9PSAwKQorCXsKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfNDApCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkmJiAoSU5GUkFfT04ocEFkKQorCQkJCXx8IChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApKQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJKQorCQl7CisJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7CisJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7CisJCQlCQlBWYWx1ZSAmPSAofjB4MTgpOworCQkJQkJQVmFsdWUgfD0gMHgxMDsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBFbmQgb2YgU0NBTiwgcmVzdG9yZSB0byA0ME1IeiBjaGFubmVsICVkLCBUb3RhbCBCU1NbJTAyZF1cbiIscEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIHBBZC0+U2NhblRhYi5Cc3NOcikpOworCQl9CisJCWVsc2UKKwkJeworCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBFbmQgb2YgU0NBTiwgcmVzdG9yZSB0byBjaGFubmVsICVkLCBUb3RhbCBCU1NbJTAyZF1cbiIscEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgcEFkLT5TY2FuVGFiLkJzc05yKSk7CisJCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQkvLworCQkJLy8gVG8gcHJldmVudCBkYXRhIGxvc3QuCisJCQkvLyBTZW5kIGFuIE5VTEwgZGF0YSB3aXRoIHR1cm5lZCBQU00gYml0IG9uIHRvIGN1cnJlbnQgYXNzb2NpYXRlZCBBUCBiZWZvcmUgU0NBTiBwcm9ncmVzcy4KKwkJCS8vIE5vdywgd2UgbmVlZCB0byBzZW5kIGFuIE5VTEwgZGF0YSB3aXRoIHR1cm5lZCBQU00gYml0IG9mZiB0byBBUCwgd2hlbiBzY2FuIHByb2dyZXNzIGRvbmUKKwkJCS8vCisJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpICYmIChJTkZSQV9PTihwQWQpKSkKKwkJCXsKKwkJCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsKKwkJCQlpZiAoTlN0YXR1cwk9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCXsKKwkJCQkJcEhkcjgwMjExID0gKFBIRUFERVJfODAyXzExKSBwT3V0QnVmZmVyOworCQkJCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgcEhkcjgwMjExLCBTVUJUWVBFX05VTExfRlVOQywgMSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCQkJcEhkcjgwMjExLT5EdXJhdGlvbiA9IDA7CisJCQkJCXBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX0RBVEE7CisJCQkJCXBIZHI4MDIxMS0+RkMuUHdyTWdtdCA9IChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpOworCisJCQkJCS8vIFNlbmQgdXNpbmcgcHJpb3JpdHkgcXVldWUKKwkJCQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lU2NhblJlcUFjdGlvbiAtLSBTZW5kIFBTTSBEYXRhIGZyYW1lXG4iKSk7CisJCQkJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisJCQkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisJCQkJfQorCQkJfQorCisJCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOworCQkJU3RhdHVzID0gTUxNRV9TVUNDRVNTOworCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NDQU5fQ09ORiwgMiwgJlN0YXR1cyk7CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpOworCX0KKyNpZmRlZiBSVDI4NzAKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwllbHNlIGlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKQorCXsKKwkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKKwkJTWxtZUNudGxDb25maXJtKHBBZCwgTVQyX1NDQU5fQ09ORiwgTUxNRV9GQUlMX05PX1JFU09VUkNFKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisjZW5kaWYgLy8gUlQyODcwIC8vCisJZWxzZQorCXsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkvLyBCQlAgYW5kIFJGIGFyZSBub3QgYWNjZXNzaWJsZSBpbiBQUyBtb2RlLCB3ZSBoYXMgdG8gd2FrZSB0aGVtIHVwIGZpcnN0CisJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQorCQkJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgVFJVRSk7CisKKwkJCS8vIGxlYXZlIFBTTSBkdXJpbmcgc2Nhbm5pbmcuIG90aGVyd2lzZSB3ZSBtYXkgbG9zdCBQcm9iZVJzcCAmIEJFQUNPTgorCQkJaWYgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkKKwkJCQlNbG1lU2V0UHNtQml0KHBBZCwgUFdSX0FDVElWRSk7CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsLCBUUlVFKTsKKwkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXsKKwkJCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA+IDE0KQorCQkJeworCQkJCWlmICgocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkgJiYgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCkpCisJCQkJeworCQkJCQlTY2FuVHlwZSA9IFNDQU5fUEFTU0lWRTsKKwkJCQkJU2NhblRpbWVJbjVnQ2hhbm5lbCA9IE1JTl9DSEFOTkVMX1RJTUU7CisJCQkJfQorCQkJfQorCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLyBSb2dlciBzeW5jIENhcnJpZXIKKwkJCS8vIGNhcnJpZXIgZGV0ZWN0aW9uCisJCQlpZiAocEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPT0gVFJVRSkKKwkJCXsKKwkJCQlTY2FuVHlwZSA9IFNDQU5fUEFTU0lWRTsKKwkJCQlTY2FuVGltZUluNWdDaGFubmVsID0gTUlOX0NIQU5ORUxfVElNRTsKKwkJCX0KKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisJCX0KKworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCS8vR2xvYmFsIGNvdW50cnkgZG9tYWluKGNoMS0xMTphY3RpdmUgc2NhbiwgY2gxMi0xNCBwYXNzaXZlIHNjYW4pCisJCWlmICgocEFkLT5NbG1lQXV4LkNoYW5uZWwgPD0gMTQpICYmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA+PSAxMikgJiYgKChwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uICYgMHg3ZikgPT0gUkVHSU9OXzMxX0JHX0JBTkQpKQorCQl7CisJCQlTY2FuVHlwZSA9IFNDQU5fUEFTU0lWRTsKKwkJfQorCisJCS8vIFdlIG5lZWQgdG8gc2hvcnRlbiBhY3RpdmUgc2NhbiB0aW1lIGluIG9yZGVyIGZvciBXWkMgY29ubmVjdCBpc3N1ZQorCQkvLyBDaG5hZ2UgdGhlIGNoYW5uZWwgc2NhbiB0aW1lIGZvciBDSVNDTyBzdHVmZiBiYXNlZCBvbiBpdHMgSUFQUCBhbm5vdW5jZW1lbnQKKwkJaWYgKFNjYW5UeXBlID09IEZBU1RfU0NBTl9BQ1RJVkUpCisJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsIEZBU1RfQUNUSVZFX1NDQU5fVElNRSk7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCWVsc2UgaWYgKCgoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19BQ1RJVkUpIHx8CisJCQkJKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fUEFTU0lWRSkgfHwKKwkJCQkoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19DSEFOTkVMX0xPQUQpIHx8CisJCQkJKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fTk9JU0UpKSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCisJCXsKKwkJCWlmIChwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSA8IDI1KQorCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgcEFkLT5TdGFDZmcuQ0NYU2NhblRpbWUgKiAyKTsKKwkJCWVsc2UKKwkJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsIHBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lKTsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQllbHNlIC8vIG11c3QgYmUgU0NBTl9QQVNTSVZFIG9yIFNDQU5fQUNUSVZFCisJCXsKKwkJCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdfTUlYRUQpCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHTl9NSVhFRCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUdOX01JWEVEKQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJKQorCQkJeworCQkJCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA+IDE0KQorCQkJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsIFNjYW5UaW1lSW41Z0NoYW5uZWwpOworCQkJCWVsc2UKKwkJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsIE1JTl9DSEFOTkVMX1RJTUUpOworCQkJfQorCQkJZWxzZQorCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgTUFYX0NIQU5ORUxfVElNRSk7CisJCX0KKworCQlpZiAoKFNjYW5UeXBlID09IFNDQU5fQUNUSVZFKSB8fCAoU2NhblR5cGUgPT0gRkFTVF9TQ0FOX0FDVElWRSkgfHwKKwkJCShTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX0FDVElWRSkpCisJCXsKKwkJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBTY2FuTmV4dENoYW5uZWwoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbFxuIikpOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJeworCQkJCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOworCQkJCQlTdGF0dXMgPSBNTE1FX0ZBSUxfTk9fUkVTT1VSQ0U7CisJCQkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9TQ0FOX0NPTkYsIDIsICZTdGF0dXMpOworCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy8gVGhlcmUgaXMgbm8gbmVlZCB0byBzZW5kIGJyb2FkY2FzdCBwcm9iZSByZXF1ZXN0IGlmIGFjdGl2ZSBzY2FuIGlzIGluIGVmZmVjdC4KKwkJCWlmICgoU2NhblR5cGUgPT0gU0NBTl9BQ1RJVkUpIHx8IChTY2FuVHlwZSA9PSBGQVNUX1NDQU5fQUNUSVZFKQorCQkJCSkKKwkJCQlTc2lkTGVuID0gcEFkLT5NbG1lQXV4LlNzaWRMZW47CisJCQllbHNlCisJCQkJU3NpZExlbiA9IDA7CisKKwkJCU1ndE1hY0hlYWRlckluaXQocEFkLCAmSGRyODAyMTEsIFNVQlRZUEVfUFJPQkVfUkVRLCAwLCBCUk9BRENBU1RfQUREUiwgQlJPQURDQVNUX0FERFIpOworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAmRnJhbWVMZW4sCisJCQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksICAgICZIZHI4MDIxMSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRJZSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRMZW4sCisJCQkJCQkJICBTc2lkTGVuLAkJCSAgICAgICAgcEFkLT5NbG1lQXV4LlNzaWQsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZTdXBSYXRlSWUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuLAorCQkJCQkJCSAgcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbiwgIHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGUsCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuKQorCQkJeworCQkJCVVMT05HIFRtcDsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcCwKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkV4dFJhdGVJZSwKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW4sCisJCQkJCQkJCSAgcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbiwgICAgICAgICAgcEFkLT5Db21tb25DZmcuRXh0UmF0ZSwKKwkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQkJRnJhbWVMZW4gKz0gVG1wOworCQkJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQorCQkJeworCQkJCVVMT05HCVRtcDsKKwkJCQlVQ0hBUglIdExlbjsKKwkJCQlVQ0hBUglCUk9BRENPTVs0XSA9IHsweDAsIDB4OTAsIDB4NGMsIDB4MzN9OworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCQlIVF9DQVBBQklMSVRZX0lFIEh0Q2FwYWJpbGl0eVRtcDsKKyNlbmRpZgorCQkJCWlmIChwQWQtPmJCcm9hZENvbUhUID09IFRSVUUpCisJCQkJeworCQkJCQlIdExlbiA9IHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gKyA0OworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCQkJTmRpc01vdmVNZW1vcnkoJkh0Q2FwYWJpbGl0eVRtcCwgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksIFNJWkVfSFRfQ0FQX0lFKTsKKwkJCQkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSk7CisJCQkJCSooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykpOworCisJCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgJlRtcCwKKwkJCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmV3BhSWUsCisJCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0TGVuLAorCQkJCQkJCQkJNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCUk9BRENPTVswXSwKKwkJCQkJCQkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sICAgICAmSHRDYXBhYmlsaXR5VG1wLAorCQkJCQkJCQkJRU5EX09GX0FSR1MpOworI2Vsc2UKKwkJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAmVG1wLAorCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZXcGFJZSwKKwkJCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRMZW4sCisJCQkJCQkJCQk0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkJST0FEQ09NWzBdLAorCQkJCQkJCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LAorCQkJCQkJCQkJRU5EX09GX0FSR1MpOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJSHRMZW4gPSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCQkJTmRpc01vdmVNZW1vcnkoJkh0Q2FwYWJpbGl0eVRtcCwgJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwgU0laRV9IVF9DQVBfSUUpOworCQkJCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pKTsKKwkJCQkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSk7CisKKwkJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAmVG1wLAorCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcEllLAorCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdExlbiwKKwkJCQkJCQkJCUh0TGVuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRDYXBhYmlsaXR5VG1wLAorCQkJCQkJCQkJRU5EX09GX0FSR1MpOworI2Vsc2UKKwkJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAmVG1wLAorCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcEllLAorCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdExlbiwKKwkJCQkJCQkJCUh0TGVuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LAorCQkJCQkJCQkJRU5EX09GX0FSR1MpOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKwkJCQl9CisJCQkJRnJhbWVMZW4gKz0gVG1wOworCisjaWZkZWYgRE9UMTFOX0RSQUZUMworCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuYjIwNDBDb2V4aXN0U2NhblN1cCA9PSAxKQorCQkJCXsKKwkJCQkJVUxPTkcJCVRtcDsKKwkJCQkJSHRMZW4gPSAxOworCQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcCwKKwkJCQkJCQkJCSAgMSwJCQkJCSZFeHRIdENhcEllLAorCQkJCQkJCQkJICAxLAkJCQkJJkh0TGVuLAorCQkJCQkJCQkJICAxLCAgICAgICAgICAJCQkmcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAud29yZCwKKwkJCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCisJCQkJCUZyYW1lTGVuICs9IFRtcDsKKwkJCQl9CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisKKwkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJfQorCisJCS8vIEZvciBTQ0FOX0NJU0NPX1BBU1NJVkUsIGRvIG5vdGhpbmcgYW5kIHNpbGVudGx5IHdhaXQgZm9yIGJlYWNvbiBvciBvdGhlciBwcm9iZSByZXBvbnNlCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTQ0FOX0xJU1RFTjsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCX0KK30KKworVk9JRCBNZ3RQcm9iUmVxTWFjSGVhZGVySW5pdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBPVVQgUEhFQURFUl84MDJfMTEgcEhkcjgwMjExLAorCUlOIFVDSEFSIFN1YlR5cGUsCisJSU4gVUNIQVIgVG9EcywKKwlJTiBQVUNIQVIgcERBLAorCUlOIFBVQ0hBUiBwQnNzaWQpCit7CisJTmRpc1plcm9NZW1vcnkocEhkcjgwMjExLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCisJcEhkcjgwMjExLT5GQy5UeXBlID0gQlRZUEVfTUdNVDsKKwlwSGRyODAyMTEtPkZDLlN1YlR5cGUgPSBTdWJUeXBlOworCWlmIChTdWJUeXBlID09IFNVQlRZUEVfQUNLKQorCQlwSGRyODAyMTEtPkZDLlR5cGUgPSBCVFlQRV9DTlRMOworCXBIZHI4MDIxMS0+RkMuVG9EcyA9IFRvRHM7CisJQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIxLCBwREEpOworCUNPUFlfTUFDX0FERFIocEhkcjgwMjExLT5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIzLCBwQnNzaWQpOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV93cGEuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV93cGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmMyNGJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX3dwYS5jCkBAIC0wLDAgKzEsMTY1NCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwl3cGEuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUphbglMZWUJCTAzLTA3LTIyCQlJbml0aWFsCisJUGF1bCBMaW4JMDMtMTEtMjgJCU1vZGlmeSBmb3Igc3VwcGxpY2FudAorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKy8vIFdQQSBPVUkKK1VDSEFSCQlPVUlfV1BBX05PTkVfQUtNWzRdCQk9IHsweDAwLCAweDUwLCAweEYyLCAweDAwfTsKK1VDSEFSICAgICAgIE9VSV9XUEFfVkVSU0lPTls0XSAgICAgID0gezB4MDAsIDB4NTAsIDB4RjIsIDB4MDF9OworVUNIQVIgICAgICAgT1VJX1dQQV9XRVA0MFs0XSAgICAgID0gezB4MDAsIDB4NTAsIDB4RjIsIDB4MDF9OworVUNIQVIgICAgICAgT1VJX1dQQV9US0lQWzRdICAgICA9IHsweDAwLCAweDUwLCAweEYyLCAweDAyfTsKK1VDSEFSICAgICAgIE9VSV9XUEFfQ0NNUFs0XSAgICAgPSB7MHgwMCwgMHg1MCwgMHhGMiwgMHgwNH07CitVQ0hBUiAgICAgICBPVUlfV1BBX1dFUDEwNFs0XSAgICAgID0gezB4MDAsIDB4NTAsIDB4RjIsIDB4MDV9OworVUNIQVIgICAgICAgT1VJX1dQQV84MDIxWF9BS01bNF0JPSB7MHgwMCwgMHg1MCwgMHhGMiwgMHgwMX07CitVQ0hBUiAgICAgICBPVUlfV1BBX1BTS19BS01bNF0gICAgICA9IHsweDAwLCAweDUwLCAweEYyLCAweDAyfTsKKy8vIFdQQTIgT1VJCitVQ0hBUiAgICAgICBPVUlfV1BBMl9XRVA0MFs0XSAgID0gezB4MDAsIDB4MEYsIDB4QUMsIDB4MDF9OworVUNIQVIgICAgICAgT1VJX1dQQTJfVEtJUFs0XSAgICAgICAgPSB7MHgwMCwgMHgwRiwgMHhBQywgMHgwMn07CitVQ0hBUiAgICAgICBPVUlfV1BBMl9DQ01QWzRdICAgICAgICA9IHsweDAwLCAweDBGLCAweEFDLCAweDA0fTsKK1VDSEFSICAgICAgIE9VSV9XUEEyXzgwMjFYX0FLTVs0XSAgID0gezB4MDAsIDB4MEYsIDB4QUMsIDB4MDF9OworVUNIQVIgICAgICAgT1VJX1dQQTJfUFNLX0FLTVs0XSAgIAk9IHsweDAwLCAweDBGLCAweEFDLCAweDAyfTsKK1VDSEFSICAgICAgIE9VSV9XUEEyX1dFUDEwNFs0XSAgID0gezB4MDAsIDB4MEYsIDB4QUMsIDB4MDV9OworLy8gTVNBIE9VSQorVUNIQVIgICAJT1VJX01TQV84MDIxWF9BS01bNF0gICAgPSB7MHgwMCwgMHgwRiwgMHhBQywgMHgwNX07CQkvLyBOb3QgeWV0IGZpbmFsIC0gSUVFRSA4MDIuMTFzLUQxLjA2CitVQ0hBUiAgIAlPVUlfTVNBX1BTS19BS01bNF0gICAJPSB7MHgwMCwgMHgwRiwgMHhBQywgMHgwNn07CQkvLyBOb3QgeWV0IGZpbmFsIC0gSUVFRSA4MDIuMTFzLUQxLjA2CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlUaGUgcHNldWRvLXJhbmRvbSBmdW5jdGlvbihQUkYpIHRoYXQgaGFzaGVzIHZhcmlvdXMgaW5wdXRzIHRvCisJCWRlcml2ZSBhIHBzZXVkby1yYW5kb20gdmFsdWUuIFRvIGFkZCBsaXZlbmVzcyB0byB0aGUgcHNldWRvLXJhbmRvbQorCQl2YWx1ZSwgYSBub25jZSBzaG91bGQgYmUgb25lIG9mIHRoZSBpbnB1dHMuCisKKwkJSXQgaXMgdXNlZCB0byBnZW5lcmF0ZSBQVEssIEdUSyBvciBzb21lIHNwZWNpZmljIHJhbmRvbSB2YWx1ZS4KKworCUFyZ3VtZW50czoKKwkJVUNIQVIJKmtleSwJCS0JdGhlIGtleSBtYXRlcmlhbCBmb3IgSE1BQ19TSEExIHVzZQorCQlJTlQJCWtleV9sZW4JCS0JdGhlIGxlbmd0aCBvZiBrZXkKKwkJVUNIQVIJKnByZWZpeAkJLQlhIHByZWZpeCBsYWJlbAorCQlJTlQJCXByZWZpeF9sZW4JLQl0aGUgbGVuZ3RoIG9mIHRoZSBsYWJlbAorCQlVQ0hBUgkqZGF0YQkJLQlhIHNwZWNpZmljIGRhdGEgd2l0aCB2YXJpYWJsZSBsZW5ndGgKKwkJSU5UCQlkYXRhX2xlbgktCXRoZSBsZW5ndGggb2YgYSBzcGVjaWZpYyBkYXRhCisJCUlOVAkJbGVuCQkJLQl0aGUgb3V0cHV0IGxlbmdodAorCisJUmV0dXJuIFZhbHVlOgorCQlVQ0hBUgkqb3V0cHV0CQktCXRoZSBjYWxjdWxhdGVkIHJlc3VsdAorCisJTm90ZToKKwkJODAyLjExaS0yMDA0CUFubmV4IEguMworCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlQUkYoCisJSU4JVUNIQVIJKmtleSwKKwlJTglJTlQJCWtleV9sZW4sCisJSU4JVUNIQVIJKnByZWZpeCwKKwlJTglJTlQJCXByZWZpeF9sZW4sCisJSU4JVUNIQVIJKmRhdGEsCisJSU4JSU5UCQlkYXRhX2xlbiwKKwlPVVQJVUNIQVIJKm91dHB1dCwKKwlJTglJTlQJCWxlbikKK3sKKwlJTlQJCWk7CisgICAgVUNIQVIgICAqaW5wdXQ7CisJSU5UCQljdXJyZW50aW5kZXggPSAwOworCUlOVAkJdG90YWxfbGVuOworCisJLy8gQWxsb2NhdGUgbWVtb3J5IGZvciBpbnB1dAorCW9zX2FsbG9jX21lbShOVUxMLCAoUFVDSEFSICopJmlucHV0LCAxMDI0KTsKKworICAgIGlmIChpbnB1dCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiISEhUFJGOiBubyBtZW1vcnkhISFcbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworCS8vIEdlbmVyYXRlIGNvbmNhdGVuYXRpb24gaW5wdXQKKwlOZGlzTW92ZU1lbW9yeShpbnB1dCwgcHJlZml4LCBwcmVmaXhfbGVuKTsKKworCS8vIENvbmNhdGVuYXRlIGEgc2luZ2xlIG9jdGV0IGNvbnRhaW5pbmcgMAorCWlucHV0W3ByZWZpeF9sZW5dID0JMDsKKworCS8vIENvbmNhdGVuYXRlIHNwZWNpZmljIGRhdGEKKwlOZGlzTW92ZU1lbW9yeSgmaW5wdXRbcHJlZml4X2xlbiArIDFdLCBkYXRhLCBkYXRhX2xlbik7CisJdG90YWxfbGVuID0JcHJlZml4X2xlbiArIDEgKyBkYXRhX2xlbjsKKworCS8vIENvbmNhdGVuYXRlIGEgc2luZ2xlIG9jdGV0IGNvbnRhaW5pbmcgMAorCS8vIFRoaXMgb2N0ZXQgc2hhbGwgYmUgdXBkYXRlIGxhdGVyCisJaW5wdXRbdG90YWxfbGVuXSA9IDA7CisJdG90YWxfbGVuKys7CisKKwkvLyBJdGVyYXRlIHRvIGNhbGN1bGF0ZSB0aGUgcmVzdWx0IGJ5IGhtYWMtc2hhLTEKKwkvLyBUaGVuIGNvbmNhdGVuYXRlIHRvIGxhc3QgcmVzdWx0CisJZm9yCShpID0gMDsJaSA8CShsZW4gKyAxOSkgLyAyMDsgaSsrKQorCXsKKwkJSE1BQ19TSEExKGlucHV0LCB0b3RhbF9sZW4sCWtleSwga2V5X2xlbiwgJm91dHB1dFtjdXJyZW50aW5kZXhdKTsKKwkJY3VycmVudGluZGV4ICs9CTIwOworCisJCS8vIHVwZGF0ZSB0aGUgbGFzdCBvY3RldAorCQlpbnB1dFt0b3RhbF9sZW4gLSAxXSsrOworCX0KKyAgICBvc19mcmVlX21lbShOVUxMLCBpbnB1dCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlJdCB1dGlsaXplcyBQUkYtMzg0IG9yIFBSRi01MTIgdG8gZGVyaXZlIHNlc3Npb24tc3BlY2lmaWMga2V5cyBmcm9tIGEgUE1LLgorCQlJdCBzaGFsbCBiZSBjYWxsZWQgYnkgNC13YXkgaGFuZHNoYWtlIHByb2Nlc3NpbmcuCisKKwlBcmd1bWVudHM6CisJCXBBZCAJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0CisJCVBNSwkJLQlwb2ludGVyIHRvIFBNSworCQlBTm9uY2UJLQlwb2ludGVyIHRvIEFOb25jZQorCQlBQQkJLQlwb2ludGVyIHRvIEF1dGhlbnRpY2F0b3IgQWRkcmVzcworCQlTTm9uY2UJLQlwb2ludGVyIHRvIFNOb25jZQorCQlTQQkJLQlwb2ludGVyIHRvIFN1cHBsaWNhbnQgQWRkcmVzcworCQlsZW4JCS0JaW5kaWNhdGUgdGhlIGxlbmd0aCBvZiBQVEsgKG9jdGV0KQorCisJUmV0dXJuIFZhbHVlOgorCQlPdXRwdXQJCXBvaW50ZXIgdG8gdGhlIFBUSworCisJTm90ZToKKwkJUmVmZXIgdG8gSUVFRSA4MDIuMTFpLTIwMDQgOC41LjEuMgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBXcGFDb3VudFBUSygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkqUE1LLAorCUlOCVVDSEFSCSpBTm9uY2UsCisJSU4JVUNIQVIJKkFBLAorCUlOCVVDSEFSCSpTTm9uY2UsCisJSU4JVUNIQVIJKlNBLAorCU9VVAlVQ0hBUgkqb3V0cHV0LAorCUlOCVVJTlQJbGVuKQoreworCVVDSEFSCWNvbmNhdGVuYXRpb25bNzZdOworCVVJTlQJQ3VyclBvcyA9IDA7CisJVUNIQVIJdGVtcFszMl07CisJVUNIQVIJUHJlZml4W10gPSB7J1AnLCAnYScsICdpJywgJ3InLCAndycsICdpJywgJ3MnLCAnZScsICcgJywgJ2snLCAnZScsICd5JywgJyAnLAorCQkJCQkJJ2UnLCAneCcsICdwJywgJ2EnLCAnbicsICdzJywgJ2knLCAnbycsICduJ307CisKKwkvLyBpbml0aWF0ZSB0aGUgY29uY2F0ZW5hdGlvbiBpbnB1dAorCU5kaXNaZXJvTWVtb3J5KHRlbXAsIHNpemVvZih0ZW1wKSk7CisJTmRpc1plcm9NZW1vcnkoY29uY2F0ZW5hdGlvbiwgNzYpOworCisJLy8gR2V0IHNtYWxsZXIgYWRkcmVzcworCWlmIChSVE1QQ29tcGFyZU1lbW9yeShTQSwgQUEsIDYpID09IDEpCisJCU5kaXNNb3ZlTWVtb3J5KGNvbmNhdGVuYXRpb24sIEFBLCA2KTsKKwllbHNlCisJCU5kaXNNb3ZlTWVtb3J5KGNvbmNhdGVuYXRpb24sIFNBLCA2KTsKKwlDdXJyUG9zICs9IDY7CisKKwkvLyBHZXQgbGFyZ2VyIGFkZHJlc3MKKwlpZiAoUlRNUENvbXBhcmVNZW1vcnkoU0EsIEFBLCA2KSA9PSAxKQorCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgU0EsIDYpOworCWVsc2UKKwkJTmRpc01vdmVNZW1vcnkoJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIEFBLCA2KTsKKworCS8vIHN0b3JlIHRoZSBsYXJnZXIgbWFjIGFkZHJlc3MgZm9yIGJhY2t3YXJkIGNvbXBhdGlibGUgb2YKKwkvLyByYWxpbmsgcHJvcHJpZXRhcnkgU1RBLWtleSBpc3N1ZQorCU5kaXNNb3ZlTWVtb3J5KHRlbXAsICZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCBNQUNfQUREUl9MRU4pOworCUN1cnJQb3MgKz0gNjsKKworCS8vIEdldCBzbWFsbGVyIE5vbmNlCisJaWYgKFJUTVBDb21wYXJlTWVtb3J5KEFOb25jZSwgU05vbmNlLCAzMikgPT0gMCkKKwkJTmRpc01vdmVNZW1vcnkoJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIHRlbXAsIDMyKTsJLy8gcGF0Y2ggZm9yIHJhbGluayBwcm9wcmlldGFyeSBTVEEta2V5IGlzc3VlCisJZWxzZSBpZiAoUlRNUENvbXBhcmVNZW1vcnkoQU5vbmNlLCBTTm9uY2UsIDMyKSA9PSAxKQorCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgU05vbmNlLCAzMik7CisJZWxzZQorCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgQU5vbmNlLCAzMik7CisJQ3VyclBvcyArPSAzMjsKKworCS8vIEdldCBsYXJnZXIgTm9uY2UKKwlpZiAoUlRNUENvbXBhcmVNZW1vcnkoQU5vbmNlLCBTTm9uY2UsIDMyKSA9PSAwKQorCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgdGVtcCwgMzIpOwkvLyBwYXRjaCBmb3IgcmFsaW5rIHByb3ByaWV0YXJ5IFNUQS1rZXkgaXNzdWUKKwllbHNlIGlmIChSVE1QQ29tcGFyZU1lbW9yeShBTm9uY2UsIFNOb25jZSwgMzIpID09IDEpCisJCU5kaXNNb3ZlTWVtb3J5KCZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCBBTm9uY2UsIDMyKTsKKwllbHNlCisJCU5kaXNNb3ZlTWVtb3J5KCZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCBTTm9uY2UsIDMyKTsKKwlDdXJyUG9zICs9IDMyOworCisJaGV4X2R1bXAoImNvbmNhdGVuYXRpb249IiwgY29uY2F0ZW5hdGlvbiwgNzYpOworCisJLy8gVXNlIFBSRiB0byBnZW5lcmF0ZSBQVEsKKwlQUkYoUE1LLCBMRU5fTUFTVEVSX0tFWSwgUHJlZml4LCAyMiwgY29uY2F0ZW5hdGlvbiwgNzYsIG91dHB1dCwgbGVuKTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJR2VuZXJhdGUgcmFuZG9tIG51bWJlciBieSBzb2Z0d2FyZS4KKworCUFyZ3VtZW50czoKKwkJcEFkCQktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKKwkJbWFjQWRkcgktCXBvaW50ZXIgdG8gbG9jYWwgTUFDIGFkZHJlc3MKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisJCTgwMi4xaWktMjAwNCAgQW5uZXggSC41CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUdlblJhbmRvbSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCSptYWNBZGRyLAorCU9VVAlVQ0hBUgkJCSpyYW5kb20pCit7CisJSU5UCQlpLCBjdXJyOworCVVDSEFSCWxvY2FsWzgwXSwgS2V5Q291bnRlclszMl07CisJVUNIQVIJcmVzdWx0WzgwXTsKKwlVTE9ORwlDdXJyZW50VGltZTsKKwlVQ0hBUglwcmVmaXhbXSA9IHsnSScsICduJywgJ2knLCAndCcsICcgJywgJ0MnLCAnbycsICd1JywgJ24nLCAndCcsICdlJywgJ3InfTsKKworCS8vIFplcm8gdGhlIHJlbGF0ZWQgaW5mb3JtYXRpb24KKwlOZGlzWmVyb01lbW9yeShyZXN1bHQsIDgwKTsKKwlOZGlzWmVyb01lbW9yeShsb2NhbCwgODApOworCU5kaXNaZXJvTWVtb3J5KEtleUNvdW50ZXIsIDMyKTsKKworCWZvcgkoaSA9IDA7CWkgPAkzMjsJaSsrKQorCXsKKwkJLy8gY29weSB0aGUgbG9jYWwgTUFDIGFkZHJlc3MKKwkJQ09QWV9NQUNfQUREUihsb2NhbCwgbWFjQWRkcik7CisJCWN1cnIgPQlNQUNfQUREUl9MRU47CisKKwkJLy8gY29uY2F0ZW5hdGUgdGhlIGN1cnJlbnQgdGltZQorCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZDdXJyZW50VGltZSk7CisJCU5kaXNNb3ZlTWVtb3J5KCZsb2NhbFtjdXJyXSwgICZDdXJyZW50VGltZSwJc2l6ZW9mKEN1cnJlbnRUaW1lKSk7CisJCWN1cnIgKz0Jc2l6ZW9mKEN1cnJlbnRUaW1lKTsKKworCQkvLyBjb25jYXRlbmF0ZSB0aGUgbGFzdCByZXN1bHQKKwkJTmRpc01vdmVNZW1vcnkoJmxvY2FsW2N1cnJdLCAgcmVzdWx0LCAzMik7CisJCWN1cnIgKz0JMzI7CisKKwkJLy8gY29uY2F0ZW5hdGUgYSB2YXJpYWJsZQorCQlOZGlzTW92ZU1lbW9yeSgmbG9jYWxbY3Vycl0sICAmaSwgIDIpOworCQljdXJyICs9CTI7CisKKwkJLy8gY2FsY3VsYXRlIHRoZSByZXN1bHQKKwkJUFJGKEtleUNvdW50ZXIsIDMyLCBwcmVmaXgsMTIsIGxvY2FsLCBjdXJyLCByZXN1bHQsIDMyKTsKKwl9CisKKwlOZGlzTW92ZU1lbW9yeShyYW5kb20sIHJlc3VsdCwJMzIpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQnVpbGQgY2lwaGVyIHN1aXRlIGluIFJTTi1JRS4KKwkJSXQgb25seSBzaGFsbCBiZSBjYWxsZWQgYnkgUlRNUE1ha2VSU05JRS4KKworCUFyZ3VtZW50czoKKwkJcEFkCQkJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0CisgICAgCUVsZW1lbnRJRAktCWluZGljYXRlIHRoZSBXUEExIG9yIFdQQTIKKyAgICAJV2VwU3RhdHVzCS0JaW5kaWNhdGUgdGhlIGVuY3J5cHRpb24gdHlwZQorCQliTWl4Q2lwaGVyCS0JYSBib29sZWFuIHRvIGluZGljYXRlIHRoZSBwYWlyd2lzZSBjaXBoZXIgYW5kIGdyb3VwCisJCQkJCQljaXBoZXIgYXJlIHRoZSBzYW1lIG9yIG5vdAorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBWT0lEIFJUTVBJbnNlcnRSc25JZUNpcGhlcigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTglVQ0hBUgkJCUVsZW1lbnRJRCwKKwlJTglVSU5UCQkJV2VwU3RhdHVzLAorCUlOCUJPT0xFQU4JCQliTWl4Q2lwaGVyLAorCUlOCVVDSEFSCQkJRmxleGlibGVDaXBoZXIsCisJT1VUCVBVQ0hBUgkJCXBSc25JZSwKKwlPVVQJVUNIQVIJCQkqcnNuX2xlbikKK3sKKwlVQ0hBUglQYWlyd2lzZUNudDsKKworCSpyc25fbGVuID0gMDsKKworCS8vIGRlY2lkZSBXUEEyIG9yIFdQQTEKKwlpZiAoRWxlbWVudElEID09IFdwYTJJZSkKKwl7CisJCVJTTklFMgkqcFJzbmllX2NpcGhlciA9IChSU05JRTIqKXBSc25JZTsKKworCQkvLyBBc3NpZ24gdGhlIHZlcnNvbiBhcyAxCisJCXBSc25pZV9jaXBoZXItPnZlcnNpb24gPSAxOworCisgICAgICAgIHN3aXRjaCAoV2VwU3RhdHVzKQorICAgICAgICB7CisgICAgICAgIAkvLyBUS0lQIG1vZGUKKyAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDoKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQTJfVEtJUCwgNCk7CisgICAgICAgICAgICAgICAgcFJzbmllX2NpcGhlci0+dWNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksIE9VSV9XUEEyX1RLSVAsIDQpOworICAgICAgICAgICAgICAgICpyc25fbGVuID0gc2l6ZW9mKFJTTklFMik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKwkJCS8vIEFFUyBtb2RlCisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ6CisJCQkJaWYgKGJNaXhDaXBoZXIpCisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBMl9US0lQLCA0KTsKKwkJCQllbHNlCisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBMl9DQ01QLCA0KTsKKyAgICAgICAgICAgICAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSAxOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQTJfQ0NNUCwgNCk7CisgICAgICAgICAgICAgICAgKnJzbl9sZW4gPSBzaXplb2YoUlNOSUUyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworCQkJLy8gVEtJUC1BRVMgbWl4IG1vZGUKKyAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZDoKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQTJfVEtJUCwgNCk7CisKKwkJCQlQYWlyd2lzZUNudCA9IDE7CisJCQkJLy8gSW5zZXJ0IFdQQTIgVEtJUCBhcyB0aGUgZmlyc3QgcGFpcndpc2UgY2lwaGVyCisJCQkJaWYgKE1JWF9DSVBIRVJfV1BBMl9US0lQX09OKEZsZXhpYmxlQ2lwaGVyKSkKKwkJCQl7CisgICAgICAgICAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQTJfVEtJUCwgNCk7CisJCQkJCS8vIEluc2VydCBXUEEyIEFFUyBhcyB0aGUgc2Vjb25kYXJ5IHBhaXJ3aXNlIGNpcGhlcgorCQkJCQlpZiAoTUlYX0NJUEhFUl9XUEEyX0FFU19PTihGbGV4aWJsZUNpcGhlcikpCisJCQkJCXsKKyAgICAgICAgICAgICAgICAJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSArIDQsIE9VSV9XUEEyX0NDTVAsIDQpOworCQkJCQkJUGFpcndpc2VDbnQgPSAyOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8vIEluc2VydCBXUEEyIEFFUyBhcyB0aGUgZmlyc3QgcGFpcndpc2UgY2lwaGVyCisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQTJfQ0NNUCwgNCk7CisJCQkJfQorCisgICAgICAgICAgICAgICAgcFJzbmllX2NpcGhlci0+dWNvdW50ID0gUGFpcndpc2VDbnQ7CisgICAgICAgICAgICAgICAgKnJzbl9sZW4gPSBzaXplb2YoUlNOSUUyKSArICg0ICogKFBhaXJ3aXNlQ250IC0gMSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJgorCQkJKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpICYmCisJCQkocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgIT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpCisJCXsKKwkJCVVJTlQgR3JvdXBDaXBoZXIgPSBwQWQtPlN0YUNmZy5Hcm91cENpcGhlcjsKKwkJCXN3aXRjaChHcm91cENpcGhlcikKKwkJCXsKKwkJCQljYXNlIE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZDoKKwkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEEyX1dFUDQwLCA0KTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkOgorCQkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQTJfV0VQMTA0LCA0KTsKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkvLyBzd2FwIGZvciBiaWctZW5kaWFuIHBsYXRmb3JtCisJCXBSc25pZV9jaXBoZXItPnZlcnNpb24gPSBjcHUybGUxNihwUnNuaWVfY2lwaGVyLT52ZXJzaW9uKTsKKwkgICAgcFJzbmllX2NpcGhlci0+dWNvdW50ID0gY3B1MmxlMTYocFJzbmllX2NpcGhlci0+dWNvdW50KTsKKwl9CisJZWxzZQorCXsKKwkJUlNOSUUJKnBSc25pZV9jaXBoZXIgPSAoUlNOSUUqKXBSc25JZTsKKworCQkvLyBBc3NpZ24gT1VJIGFuZCB2ZXJzaW9uCisJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm91aSwgT1VJX1dQQV9WRVJTSU9OLCA0KTsKKyAgICAgICAgcFJzbmllX2NpcGhlci0+dmVyc2lvbiA9IDE7CisKKwkJc3dpdGNoIChXZXBTdGF0dXMpCisJCXsKKwkJCS8vIFRLSVAgbW9kZQorICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOgorICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBX1RLSVAsIDQpOworICAgICAgICAgICAgICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IDE7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBX1RLSVAsIDQpOworICAgICAgICAgICAgICAgICpyc25fbGVuID0gc2l6ZW9mKFJTTklFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworCQkJLy8gQUVTIG1vZGUKKyAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDoKKwkJCQlpZiAoYk1peENpcGhlcikKKwkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEFfVEtJUCwgNCk7CisJCQkJZWxzZQorCQkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQV9DQ01QLCA0KTsKKyAgICAgICAgICAgICAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSAxOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQV9DQ01QLCA0KTsKKyAgICAgICAgICAgICAgICAqcnNuX2xlbiA9IHNpemVvZihSU05JRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKwkJCS8vIFRLSVAtQUVTIG1peCBtb2RlCisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQ6CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEFfVEtJUCwgNCk7CisKKwkJCQlQYWlyd2lzZUNudCA9IDE7CisJCQkJLy8gSW5zZXJ0IFdQQSBUS0lQIGFzIHRoZSBmaXJzdCBwYWlyd2lzZSBjaXBoZXIKKwkJCQlpZiAoTUlYX0NJUEhFUl9XUEFfVEtJUF9PTihGbGV4aWJsZUNpcGhlcikpCisJCQkJeworICAgICAgICAgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksIE9VSV9XUEFfVEtJUCwgNCk7CisJCQkJCS8vIEluc2VydCBXUEEgQUVTIGFzIHRoZSBzZWNvbmRhcnkgcGFpcndpc2UgY2lwaGVyCisJCQkJCWlmIChNSVhfQ0lQSEVSX1dQQV9BRVNfT04oRmxleGlibGVDaXBoZXIpKQorCQkJCQl7CisgICAgICAgICAgICAgICAgCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWkgKyA0LCBPVUlfV1BBX0NDTVAsIDQpOworCQkJCQkJUGFpcndpc2VDbnQgPSAyOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8vIEluc2VydCBXUEEgQUVTIGFzIHRoZSBmaXJzdCBwYWlyd2lzZSBjaXBoZXIKKwkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBX0NDTVAsIDQpOworCQkJCX0KKworICAgICAgICAgICAgICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IFBhaXJ3aXNlQ250OworICAgICAgICAgICAgICAgICpyc25fbGVuID0gc2l6ZW9mKFJTTklFKSArICg0ICogKFBhaXJ3aXNlQ250IC0gMSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJgorCQkJKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpICYmCisJCQkocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgIT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpCisJCXsKKwkJCVVJTlQgR3JvdXBDaXBoZXIgPSBwQWQtPlN0YUNmZy5Hcm91cENpcGhlcjsKKwkJCXN3aXRjaChHcm91cENpcGhlcikKKwkJCXsKKwkJCQljYXNlIE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZDoKKwkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEFfV0VQNDAsIDQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIE5kaXM4MDJfMTFHcm91cFdFUDEwNEVuYWJsZWQ6CisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBX1dFUDEwNCwgNCk7CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJLy8gc3dhcCBmb3IgYmlnLWVuZGlhbiBwbGF0Zm9ybQorCQlwUnNuaWVfY2lwaGVyLT52ZXJzaW9uID0gY3B1MmxlMTYocFJzbmllX2NpcGhlci0+dmVyc2lvbik7CisJICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IGNwdTJsZTE2KHBSc25pZV9jaXBoZXItPnVjb3VudCk7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQnVpbGQgQUtNIHN1aXRlIGluIFJTTi1JRS4KKwkJSXQgb25seSBzaGFsbCBiZSBjYWxsZWQgYnkgUlRNUE1ha2VSU05JRS4KKworCUFyZ3VtZW50czoKKwkJcEFkCQkJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0CisgICAgCUVsZW1lbnRJRAktCWluZGljYXRlIHRoZSBXUEExIG9yIFdQQTIKKyAgICAJQXV0aE1vZGUJLQlpbmRpY2F0ZSB0aGUgYXV0aGVudGljYXRpb24gbW9kZQorCQlhcGlkeAkJLQlpbmRpY2F0ZSB0aGUgaW50ZXJmYWNlIGluZGV4CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIFZPSUQgUlRNUEluc2VydFJzbkllQUtNKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCVVDSEFSCQkJRWxlbWVudElELAorCUlOCVVJTlQJCQlBdXRoTW9kZSwKKwlJTglVQ0hBUgkJCWFwaWR4LAorCU9VVAlQVUNIQVIJCQlwUnNuSWUsCisJT1VUCVVDSEFSCQkJKnJzbl9sZW4pCit7CisJUlNOSUVfQVVUSAkJKnBSc25pZV9hdXRoOworCisJcFJzbmllX2F1dGggPSAoUlNOSUVfQVVUSCopKHBSc25JZSArICgqcnNuX2xlbikpOworCisJLy8gZGVjaWRlIFdQQTIgb3IgV1BBMQorCWlmIChFbGVtZW50SUQgPT0gV3BhMkllKQorCXsKKwkJc3dpdGNoIChBdXRoTW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEEyOgorICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEExV1BBMjoKKyAgICAgICAgICAgICAgICBwUnNuaWVfYXV0aC0+YWNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICAJTmRpc01vdmVNZW1vcnkocFJzbmllX2F1dGgtPmF1dGhbMF0ub3VpLCBPVUlfV1BBMl84MDIxWF9BS00sIDQpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s6CisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLOgorICAgICAgICAgICAgICAgIHBSc25pZV9hdXRoLT5hY291bnQgPSAxOworICAgICAgICAgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwUnNuaWVfYXV0aC0+YXV0aFswXS5vdWksIE9VSV9XUEEyX1BTS19BS00sIDQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisJfQorCWVsc2UKKwl7CisJCXN3aXRjaCAoQXV0aE1vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBOgorICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEExV1BBMjoKKyAgICAgICAgICAgICAgICBwUnNuaWVfYXV0aC0+YWNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfYXV0aC0+YXV0aFswXS5vdWksIE9VSV9XUEFfODAyMVhfQUtNLCA0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s6CisgICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLOgorICAgICAgICAgICAgICAgIHBSc25pZV9hdXRoLT5hY291bnQgPSAxOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9hdXRoLT5hdXRoWzBdLm91aSwgT1VJX1dQQV9QU0tfQUtNLCA0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworCQkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOgorICAgICAgICAgICAgICAgIHBSc25pZV9hdXRoLT5hY291bnQgPSAxOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9hdXRoLT5hdXRoWzBdLm91aSwgT1VJX1dQQV9OT05FX0FLTSwgNCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwl9CisKKwlwUnNuaWVfYXV0aC0+YWNvdW50ID0gY3B1MmxlMTYocFJzbmllX2F1dGgtPmFjb3VudCk7CisKKwkoKnJzbl9sZW4pICs9IHNpemVvZihSU05JRV9BVVRIKTsJLy8gdXBkYXRlIGN1cnJlbnQgUlNOSUUgbGVuZ3RoCisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUJ1aWxkIGNhcGFiaWxpdHkgaW4gUlNOLUlFLgorCQlJdCBvbmx5IHNoYWxsIGJlIGNhbGxlZCBieSBSVE1QTWFrZVJTTklFLgorCisJQXJndW1lbnRzOgorCQlwQWQJCQktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKKyAgICAJRWxlbWVudElECS0JaW5kaWNhdGUgdGhlIFdQQTEgb3IgV1BBMgorCQlhcGlkeAkJLQlpbmRpY2F0ZSB0aGUgaW50ZXJmYWNlIGluZGV4CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIFZPSUQgUlRNUEluc2VydFJzbkllQ2FwKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCVVDSEFSCQkJRWxlbWVudElELAorCUlOCVVDSEFSCQkJYXBpZHgsCisJT1VUCVBVQ0hBUgkJCXBSc25JZSwKKwlPVVQJVUNIQVIJCQkqcnNuX2xlbikKK3sKKwlSU05fQ0FQQUJJTElUSUVTICAgICpwUlNOX0NhcDsKKworCS8vIGl0IGNvdWxkIGJlIGlnbm9yZWQgaW4gV1BBMSBtb2RlCisJaWYgKEVsZW1lbnRJRCA9PSBXcGFJZSkKKwkJcmV0dXJuOworCisJcFJTTl9DYXAgPSAoUlNOX0NBUEFCSUxJVElFUyopKHBSc25JZSArICgqcnNuX2xlbikpOworCisKKwlwUlNOX0NhcC0+d29yZCA9IGNwdTJsZTE2KHBSU05fQ2FwLT53b3JkKTsKKworCSgqcnNuX2xlbikgKz0gc2l6ZW9mKFJTTl9DQVBBQklMSVRJRVMpOwkvLyB1cGRhdGUgY3VycmVudCBSU05JRSBsZW5ndGgKKworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlCdWlsZCBSU04gSUUgY29udGV4dC4gSXQgaXMgbm90IGluY2x1ZGVkIGVsZW1lbnQtSUQgYW5kIGxlbmd0aC4KKworCUFyZ3VtZW50czoKKwkJcEFkCQkJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0CisgICAgCUF1dGhNb2RlCS0JaW5kaWNhdGUgdGhlIGF1dGhlbnRpY2F0aW9uIG1vZGUKKyAgICAJV2VwU3RhdHVzCS0JaW5kaWNhdGUgdGhlIGVuY3J5cHRpb24gdHlwZQorCQlhcGlkeAkJLQlpbmRpY2F0ZSB0aGUgaW50ZXJmYWNlIGluZGV4CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QTWFrZVJTTklFKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBVSU5UICAgICAgICAgICAgQXV0aE1vZGUsCisgICAgSU4gIFVJTlQgICAgICAgICAgICBXZXBTdGF0dXMsCisJSU4JVUNIQVIJCQlhcGlkeCkKK3sKKwlQVUNIQVIJCXBSc25JZSA9IE5VTEw7CQkJLy8gcHJpbWFyeSBSU05JRQorCVVDSEFSIAkJKnJzbmllbGVuX2N1cl9wID0gMDsJLy8gdGhlIGxlbmd0aCBvZiB0aGUgcHJpbWFyeSBSU05JRQorCVVDSEFSCQkqcnNuaWVsZW5fZXhfY3VyX3AgPSAwOwkvLyB0aGUgbGVuZ3RoIG9mIHRoZSBzZWNvbmRhcnkgUlNOSUUKKwlVQ0hBUgkJUHJpbWFyeVJzbmllOworCUJPT0xFQU4JCWJNaXhDaXBoZXIgPSBGQUxTRTsJLy8gaW5kaWNhdGUgdGhlIHBhaXJ3aXNlIGFuZCBncm91cCBjaXBoZXIgYXJlIGRpZmZlcmVudAorCVVDSEFSCQlwX29mZnNldDsKKwlXUEFfTUlYX1BBSVJfQ0lQSEVSCQlGbGV4aWJsZUNpcGhlciA9IE1JWF9DSVBIRVJfTk9UVVNFOwkvLyBpdCBwcm92aWRlIHRoZSBtb3JlIGZsZXhpYmxlIGNpcGhlciBjb21iaW5hdGlvbiBpbiBXUEEtV1BBMiBhbmQgVEtJUEFFUyBtb2RlCisKKwlyc25pZWxlbl9jdXJfcCA9IE5VTEw7CisJcnNuaWVsZW5fZXhfY3VyX3AgPSBOVUxMOworCisJeworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQkJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQorCQkJeworCQkJCWlmIChBdXRoTW9kZSA8IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKwkJCQkJcmV0dXJuOworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwkJCXsKKwkJCQkvLyBTdXBwb3J0IFdQQVBTSyBvciBXUEEyUFNLIGluIFNUQS1JbmZyYSBtb2RlCisJCQkJLy8gU3VwcG9ydCBXUEFOb25lIGluIFNUQS1BZGhvYyBtb2RlCisJCQkJaWYgKChBdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spICYmCisJCQkJCShBdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSAmJgorCQkJCQkoQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKwkJCQkJKQorCQkJCQlyZXR1cm47CisJCQl9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiPT0+IFJUTVBNYWtlUlNOSUUoU1RBKVxuIikpOworCisJCQkvLyBaZXJvIFJTTklFIGNvbnRleHQKKwkJCXBBZC0+U3RhQ2ZnLlJTTklFX0xlbiA9IDA7CisJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5SU05fSUUsIE1BWF9MRU5fT0ZfUlNOSUUpOworCisJCQkvLyBQb2ludGVyIHRvIFJTTklFCisJCQlyc25pZWxlbl9jdXJfcCA9ICZwQWQtPlN0YUNmZy5SU05JRV9MZW47CisJCQlwUnNuSWUgPSBwQWQtPlN0YUNmZy5SU05fSUU7CisKKwkJCWJNaXhDaXBoZXIgPSBwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfQorCisJLy8gaW5kaWNhdGUgcHJpbWFyeSBSU05JRSBhcyBXUEEgb3IgV1BBMgorCWlmICgoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAorCQkoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAorCQkoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkgfHwKKwkJKEF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyKSB8fAorCQkoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0spKQorCQlQcmltYXJ5UnNuaWUgPSBXcGFJZTsKKwllbHNlCisJCVByaW1hcnlSc25pZSA9IFdwYTJJZTsKKworCXsKKwkJLy8gQnVpbGQgdGhlIHByaW1hcnkgUlNOSUUKKwkJLy8gMS4gaW5zZXJ0IGNpcGhlciBzdWl0ZQorCQlSVE1QSW5zZXJ0UnNuSWVDaXBoZXIocEFkLCBQcmltYXJ5UnNuaWUsIFdlcFN0YXR1cywgYk1peENpcGhlciwgRmxleGlibGVDaXBoZXIsIHBSc25JZSwgJnBfb2Zmc2V0KTsKKworCQkvLyAyLiBpbnNlcnQgQUtNCisJCVJUTVBJbnNlcnRSc25JZUFLTShwQWQsIFByaW1hcnlSc25pZSwgQXV0aE1vZGUsIGFwaWR4LCBwUnNuSWUsICZwX29mZnNldCk7CisKKwkJLy8gMy4gaW5zZXJ0IGNhcGFiaWxpdHkKKwkJUlRNUEluc2VydFJzbkllQ2FwKHBBZCwgUHJpbWFyeVJzbmllLCBhcGlkeCwgcFJzbkllLCAmcF9vZmZzZXQpOworCX0KKworCS8vIDQuIHVwZGF0ZSB0aGUgUlNOSUUgbGVuZ3RoCisJKnJzbmllbGVuX2N1cl9wID0gcF9vZmZzZXQ7CisKKwloZXhfZHVtcCgiVGhlIHByaW1hcnkgUlNOSUUiLCBwUnNuSWUsICgqcnNuaWVsZW5fY3VyX3ApKTsKKworCit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKwkJQ2hlY2sgd2hldGhlciB0aGUgcmVjZWl2ZWQgZnJhbWUgaXMgRUFQIGZyYW1lLgorCisJQXJndW1lbnRzOgorCQlwQWQJCQkJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0CisJCXBFbnRyeQkJCS0JcG9pbnRlciB0byBhY3RpdmUgZW50cnkKKwkJcERhdGEJCQktCXRoZSByZWNlaXZlZCBmcmFtZQorCQlEYXRhQnl0ZUNvdW50IAktCXRoZSByZWNlaXZlZCBmcmFtZSdzIGxlbmd0aAorCQlGcm9tV2hpY2hCU1NJRAktCWluZGljYXRlIHRoZSBpbnRlcmZhY2UgaW5kZXgKKworICAgIFJldHVybjoKKyAgICAgICAgIFRSVUUgCQkJLQlUaGlzIGZyYW1lIGlzIEVBUCBmcmFtZQorICAgICAgICAgRkFMU0UgCQkJLQlvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gUlRNUENoZWNrV1BBZnJhbWUoCisgICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisgICAgSU4gUE1BQ19UQUJMRV9FTlRSWQlwRW50cnksCisgICAgSU4gUFVDSEFSICAgICAgICAgICBwRGF0YSwKKyAgICBJTiBVTE9ORyAgICAgICAgICAgIERhdGFCeXRlQ291bnQsCisJSU4gVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKwlVTE9ORwlCb2R5X2xlbjsKKwlCT09MRUFOIENhbmNlbGxlZDsKKworCisgICAgaWYoRGF0YUJ5dGVDb3VudCA8IChMRU5HVEhfODAyXzFfSCArIExFTkdUSF9FQVBPTF9IKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisKKwkvLyBTa2lwIExMQyBoZWFkZXIKKyAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KFNOQVBfODAyXzFILCBwRGF0YSwgNikgfHwKKyAgICAgICAgLy8gQ2lzY28gMTIwMCBBUCBtYXkgc2VuZCBwYWNrZXQgd2l0aCBTTkFQX0JSSURHRV9UVU5ORUwKKyAgICAgICAgTmRpc0VxdWFsTWVtb3J5KFNOQVBfQlJJREdFX1RVTk5FTCwgcERhdGEsIDYpKQorICAgIHsKKyAgICAgICAgcERhdGEgKz0gNjsKKyAgICB9CisJLy8gU2tpcCAyLWJ5dGVzIEVBUG9MIHR5cGUKKyAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KEVBUE9MLCBwRGF0YSwgMikpCisgICAgeworICAgICAgICBwRGF0YSArPSAyOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHN3aXRjaCAoKihwRGF0YSsxKSkKKyAgICB7CisgICAgICAgIGNhc2UgRUFQUGFja2V0OgorCQkJQm9keV9sZW4gPSAoKihwRGF0YSsyKTw8OCkgfCAoKihwRGF0YSszKSk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUC1QYWNrZXQgZnJhbWUsIFRZUEUgPSAwLCBMZW5ndGggPSAlbGRcbiIsIEJvZHlfbGVuKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFQVBPTFN0YXJ0OgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTC1TdGFydCBmcmFtZSwgVFlQRSA9IDEgXG4iKSk7CisJCQlpZiAocEVudHJ5LT5FbnF1ZXVlRWFwb2xTdGFydFRpbWVyUnVubmluZyAhPSBFQVBPTF9TVEFSVF9ESVNBQkxFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNhbmNlbCB0aGUgRW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgXG4iKSk7CisgICAgICAgICAgICAgICAgUlRNUENhbmNlbFRpbWVyKCZwRW50cnktPkVucXVldWVTdGFydEZvclBTS1RpbWVyLCAmQ2FuY2VsbGVkKTsKKyAgICAgICAgICAgICAgICBwRW50cnktPkVucXVldWVFYXBvbFN0YXJ0VGltZXJSdW5uaW5nID0gRUFQT0xfU1RBUlRfRElTQUJMRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVBUE9MTG9nb2ZmOgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTExvZ29mZiBmcmFtZSwgVFlQRSA9IDIgXG4iKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFQVBPTEtleToKKwkJCUJvZHlfbGVuID0gKCoocERhdGErMik8PDgpIHwgKCoocERhdGErMykpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTC1LZXkgZnJhbWUsIFRZUEUgPSAzLCBMZW5ndGggPSAlbGRcbiIsIEJvZHlfbGVuKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFQVBPTEFTRkFsZXJ0OgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTEFTRkFsZXJ0IGZyYW1lLCBUWVBFID0gNCBcbiIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgfQorICAgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgRU5DUllQVCBBRVMgR1RLIGJlZm9yZSBzZW5kaW5nIGluIEVBUE9MIGZyYW1lLgorICAgICAgICBBRVMgR1RLIGxlbmd0aCA9IDEyOCBiaXQsICBzbyBmaXggYmxvY2tzIGZvciBhZXMta2V5LXdyYXAgYXMgMiBpbiB0aGlzIGZ1bmN0aW9uLgorICAgICAgICBUaGlzIGZ1bmN0aW9uIHJlZmVyZW5jZXMgdG8gUkZDIDMzOTQgZm9yIGFlcyBrZXkgd3JhcCBhbGdvcml0aG0uCisgICAgUmV0dXJuOgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBBRVNfR1RLX0tFWV9XUkFQKAorICAgIElOIFVDSEFSICAgICprZXksCisgICAgSU4gVUNIQVIgICAgKnBsYWludGV4dCwKKyAgICBJTiBVQ0hBUiAgICBwX2xlbiwKKyAgICBPVVQgVUNIQVIgICAqY2lwaGVydGV4dCkKK3sKKyAgICBVQ0hBUiAgICAgICBBWzhdLCBCSU5bMTZdLCBCT1VUWzE2XTsKKyAgICBVQ0hBUiAgICAgICBSWzUxMl07CisgICAgSU5UICAgICAgICAgbnVtX2Jsb2NrcyA9IHBfbGVuLzg7ICAgLy8gdW5pdDo2NGJpdHMKKyAgICBJTlQgICAgICAgICBpLCBqOworICAgIGFlc19jb250ZXh0IGFlc2N0eDsKKyAgICBVQ0hBUiAgICAgICB4b3I7CisKKyAgICBydG1wX2Flc19zZXRfa2V5KCZhZXNjdHgsIGtleSwgMTI4KTsKKworICAgIC8vIEluaXQgSUEKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICBBW2ldID0gMHhhNjsKKworICAgIC8vSW5wdXQgcGxhaW50ZXh0CisgICAgZm9yIChpID0gMDsgaSA8IG51bV9ibG9ja3M7IGkrKykKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDAgOyBqIDwgODsgaisrKQorICAgICAgICAgICAgUls4ICogKGkgKyAxKSArIGpdID0gcGxhaW50ZXh0WzggKiBpICsgal07CisgICAgfQorCisgICAgLy8gS2V5IE1peAorICAgIGZvciAoaiA9IDA7IGogPCA2OyBqKyspCisgICAgeworICAgICAgICBmb3IoaSA9IDE7IGkgPD0gbnVtX2Jsb2NrczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAvL3BoYXNlIDEKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KEJJTiwgQSwgOCk7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeSgmQklOWzhdLCAmUls4ICogaV0sIDgpOworICAgICAgICAgICAgcnRtcF9hZXNfZW5jcnlwdCgmYWVzY3R4LCBCSU4sIEJPVVQpOworCisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShBLCAmQk9VVFswXSwgOCk7CisgICAgICAgICAgICB4b3IgPSBudW1fYmxvY2tzICogaiArIGk7CisgICAgICAgICAgICBBWzddID0gQk9VVFs3XSBeIHhvcjsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZSWzggKiBpXSwgJkJPVVRbOF0sIDgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gT3V0cHV0IGNpcGhlcnRleHQKKyAgICBOZGlzTW92ZU1lbW9yeShjaXBoZXJ0ZXh0LCBBLCA4KTsKKworICAgIGZvciAoaSA9IDE7IGkgPD0gbnVtX2Jsb2NrczsgaSsrKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMCA7IGogPCA4OyBqKyspCisgICAgICAgICAgICBjaXBoZXJ0ZXh0WzggKiBpICsgal0gPSBSWzggKiBpICsgal07CisgICAgfQorfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlNaXNjIGZ1bmN0aW9uIHRvIGRlY3J5cHQgQUVTIGJvZHkKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisJCVRoaXMgZnVuY3Rpb24gcmVmZXJlbmNlcyB0bwlSRkMJMzM5NCBmb3IgYWVzIGtleSB1bndyYXAgYWxnb3JpdGhtLgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlBRVNfR1RLX0tFWV9VTldSQVAoCisJSU4JVUNIQVIJKmtleSwKKwlPVVQJVUNIQVIJKnBsYWludGV4dCwKKwlJTglVQ0hBUiAgICBjX2xlbiwKKwlJTglVQ0hBUgkqY2lwaGVydGV4dCkKKworeworCVVDSEFSICAgICAgIEFbOF0sIEJJTlsxNl0sIEJPVVRbMTZdOworCVVDSEFSICAgICAgIHhvcjsKKwlJTlQgICAgICAgICBpLCBqOworCWFlc19jb250ZXh0IGFlc2N0eDsKKwlVQ0hBUiAgICAgICAqUjsKKwlJTlQgICAgICAgICBudW1fYmxvY2tzID0gY19sZW4vODsJLy8gdW5pdDo2NGJpdHMKKworCisJb3NfYWxsb2NfbWVtKE5VTEwsIChQVUNIQVIgKikmUiwgNTEyKTsKKworCWlmIChSID09IE5VTEwpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIhISFBRVNfR1RLX0tFWV9VTldSQVA6IG5vIG1lbW9yeSEhIVxuIikpOworICAgICAgICByZXR1cm47CisgICAgfSAvKiBFbmQgb2YgaWYgKi8KKworCS8vIEluaXRpYWxpemUKKwlOZGlzTW92ZU1lbW9yeShBLCBjaXBoZXJ0ZXh0LCA4KTsKKwkvL0lucHV0IHBsYWludGV4dAorCWZvcihpID0gMDsgaSA8IChjX2xlbi04KTsgaSsrKQorCXsKKwkJUlsgaV0gPSBjaXBoZXJ0ZXh0W2kgKyA4XTsKKwl9CisKKwlydG1wX2Flc19zZXRfa2V5KCZhZXNjdHgsIGtleSwgMTI4KTsKKworCWZvcihqID0gNTsgaiA+PSAwOyBqLS0pCisJeworCQlmb3IoaSA9IChudW1fYmxvY2tzLTEpOyBpID4gMDsgaS0tKQorCQl7CisJCQl4b3IgPSAobnVtX2Jsb2NrcyAtMSApKiBqICsgaTsKKwkJCU5kaXNNb3ZlTWVtb3J5KEJJTiwgQSwgOCk7CisJCQlCSU5bN10gPSBBWzddIF4geG9yOworCQkJTmRpc01vdmVNZW1vcnkoJkJJTls4XSwgJlJbKGktMSkqOF0sIDgpOworCQkJcnRtcF9hZXNfZGVjcnlwdCgmYWVzY3R4LCBCSU4sIEJPVVQpOworCQkJTmRpc01vdmVNZW1vcnkoQSwgJkJPVVRbMF0sIDgpOworCQkJTmRpc01vdmVNZW1vcnkoJlJbKGktMSkqOF0sICZCT1VUWzhdLCA4KTsKKwkJfQorCX0KKworCS8vIE9VVFBVVAorCWZvcihpID0gMDsgaSA8IGNfbGVuOyBpKyspCisJeworCQlwbGFpbnRleHRbaV0gPSBSW2ldOworCX0KKworCisJb3NfZnJlZV9tZW0oTlVMTCwgUik7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKwkJUmVwb3J0IHRoZSBFQVAgbWVzc2FnZSB0eXBlCisKKwlBcmd1bWVudHM6CisJCW1zZwkJLQlFQVBPTF9QQUlSX01TR18xCisJCQkJCUVBUE9MX1BBSVJfTVNHXzIKKwkJCQkJRUFQT0xfUEFJUl9NU0dfMworCQkJCQlFQVBPTF9QQUlSX01TR180CisJCQkJCUVBUE9MX0dST1VQX01TR18xCisJCQkJCUVBUE9MX0dST1VQX01TR18yCisKKyAgICBSZXR1cm46CisgICAgICAgICBtZXNzYWdlIHR5cGUgc3RyaW5nCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0NIQVIgKkdldEVhcG9sTXNnVHlwZShDSEFSIG1zZykKK3sKKyAgICBpZihtc2cgPT0gRUFQT0xfUEFJUl9NU0dfMSkKKyAgICAgICAgcmV0dXJuICJQYWlyd2lzZSBNZXNzYWdlIDEiOworICAgIGVsc2UgaWYobXNnID09IEVBUE9MX1BBSVJfTVNHXzIpCisgICAgICAgIHJldHVybiAiUGFpcndpc2UgTWVzc2FnZSAyIjsKKwllbHNlIGlmKG1zZyA9PSBFQVBPTF9QQUlSX01TR18zKQorICAgICAgICByZXR1cm4gIlBhaXJ3aXNlIE1lc3NhZ2UgMyI7CisJZWxzZSBpZihtc2cgPT0gRUFQT0xfUEFJUl9NU0dfNCkKKyAgICAgICAgcmV0dXJuICJQYWlyd2lzZSBNZXNzYWdlIDQiOworCWVsc2UgaWYobXNnID09IEVBUE9MX0dST1VQX01TR18xKQorICAgICAgICByZXR1cm4gIkdyb3VwIE1lc3NhZ2UgMSI7CisJZWxzZSBpZihtc2cgPT0gRUFQT0xfR1JPVVBfTVNHXzIpCisgICAgICAgIHJldHVybiAiR3JvdXAgTWVzc2FnZSAyIjsKKyAgICBlbHNlCisgICAgCXJldHVybiAiSW52YWxpZCBNZXNzYWdlIjsKK30KKworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBDaGVjayBTYW5pdHkgUlNOIElFIG9mIEVBUG9MIG1lc3NhZ2UKKworICAgIEFyZ3VtZW50czoKKworICAgIFJldHVybiBWYWx1ZToKKworCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBSVE1QQ2hlY2tSU05JRSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEYXRhLAorCUlOICBVQ0hBUiAgICAgICAgICAgRGF0YUxlbiwKKwlJTiAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnksCisJT1VUCVVDSEFSCQkJKk9mZnNldCkKK3sKKwlQVUNIQVIgICAgICAgICAgICAgIHBWSUU7CisJVUNIQVIgICAgICAgICAgICAgICBsZW47CisJUEVJRF9TVFJVQ1QgICAgICAgICBwRWlkOworCUJPT0xFQU4JCQkJcmVzdWx0ID0gRkFMU0U7CisKKwlwVklFID0gcERhdGE7CisJbGVuCSA9IERhdGFMZW47CisJKk9mZnNldCA9IDA7CisKKwl3aGlsZSAobGVuID4gc2l6ZW9mKFJTTklFMikpCisJeworCQlwRWlkID0gKFBFSURfU1RSVUNUKSBwVklFOworCQkvLyBXUEEgUlNOIElFCisJCWlmICgocEVpZC0+RWlkID09IElFX1dQQSkgJiYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV1BBX09VSSwgNCkpKQorCQl7CisJCQlpZiAoKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBIHx8IHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSAmJgorCQkJCShOZGlzRXF1YWxNZW1vcnkocFZJRSwgcEVudHJ5LT5SU05fSUUsIHBFbnRyeS0+UlNOSUVfTGVuKSkgJiYKKwkJCQkocEVudHJ5LT5SU05JRV9MZW4gPT0gKHBFaWQtPkxlbiArIDIpKSkKKwkJCXsKKwkJCQkJcmVzdWx0ID0gVFJVRTsKKwkJCX0KKworCQkJKk9mZnNldCArPSAocEVpZC0+TGVuICsgMik7CisJCX0KKwkJLy8gV1BBMiBSU04gSUUKKwkJZWxzZSBpZiAoKHBFaWQtPkVpZCA9PSBJRV9SU04pICYmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQgKyAyLCBSU05fT1VJLCAzKSkpCisJCXsKKwkJCWlmICgocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyIHx8IHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgJiYKKwkJCQkoTmRpc0VxdWFsTWVtb3J5KHBWSUUsIHBFbnRyeS0+UlNOX0lFLCBwRW50cnktPlJTTklFX0xlbikpICYmCisJCQkJKHBFbnRyeS0+UlNOSUVfTGVuID09IChwRWlkLT5MZW4gKyAyKSkvKiBUb0RvLUFsYmVydFkgZm9yIG1lc2gqLykKKwkJCXsKKwkJCQkJcmVzdWx0ID0gVFJVRTsKKwkJCX0KKworCQkJKk9mZnNldCArPSAocEVpZC0+TGVuICsgMik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlicmVhazsKKwkJfQorCisJCXBWSUUgKz0gKHBFaWQtPkxlbiArIDIpOworCQlsZW4gIC09IChwRWlkLT5MZW4gKyAyKTsKKwl9CisKKworCXJldHVybiByZXN1bHQ7CisKK30KKworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBQYXJzZSBLRVlEQVRBIGZpZWxkLiAgS0VZREFUQVtdIE1heSBjb250YWluIDIgUlNOIElFIGFuZCBvcHRpb25hbGx5IEdUSy4KKyAgICBHVEsgIGlzIGVuY2FwdHVsYXRlZCBpbiBLREUgZm9ybWF0IGF0ICBwLjgzIDgwMi4xMWkgRDEwCisKKyAgICBBcmd1bWVudHM6CisKKyAgICBSZXR1cm4gVmFsdWU6CisKKyAgICBOb3RlOgorICAgICAgICA4MDIuMTFpIEQxMAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBSVE1QUGFyc2VFYXBvbEtleURhdGEoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwS2V5RGF0YSwKKwlJTiAgVUNIQVIgICAgICAgICAgIEtleURhdGFMZW4sCisJSU4JVUNIQVIJCQlHcm91cEtleUluZGV4LAorCUlOCVVDSEFSCQkJTXNnVHlwZSwKKwlJTglCT09MRUFOCQkJYldQQTIsCisJSU4gIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5KQoreworICAgIFBLREVfRU5DQVAgICAgICAgICAgcEtERSA9IE5VTEw7CisgICAgUFVDSEFSICAgICAgICAgICAgICBwTXlLZXlEYXRhID0gcEtleURhdGE7CisgICAgVUNIQVIgICAgICAgICAgICAgICBLZXlEYXRhTGVuZ3RoID0gS2V5RGF0YUxlbjsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIEdUS0xFTiA9IDA7CisJVUNIQVIJCQkJRGVmYXVsdElkeCA9IDA7CisJVUNIQVIJCQkJc2tpcF9vZmZzZXQ7CisKKwkvLyBWZXJpZnkgVGhlIFJTTiBJRSBjb250YWluZWQgaW4gcGFpcmV3aXNlX21zZ18yICYmIHBhaXJld2lzZV9tc2dfMyBhbmQgc2tpcCBpdAorCWlmIChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzIgfHwgTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKQorICAgIHsKKwkJLy8gQ2hlY2sgUlNOIElFIHdoZXRoZXIgaXQgaXMgV1BBMi9XUEEyUFNLCisJCWlmICghUlRNUENoZWNrUlNOSUUocEFkLCBwS2V5RGF0YSwgS2V5RGF0YUxlbiwgcEVudHJ5LCAmc2tpcF9vZmZzZXQpKQorCQl7CisJCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIFJTTiBJRSBkaWZmZXJlbnQKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19SU05JRV9ESUZGX0VWRU5UX0ZMQUcsIHBFbnRyeS0+QWRkciwgcEVudHJ5LT5hcGlkeCwgMCk7CisKKyAgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJTTl9JRSBEaWZmZXJlbnQgaW4gbXNnICVkIG9mIDQtd2F5IGhhbmRzaGFrZSFcbiIsIE1zZ1R5cGUpKTsKKwkJCWhleF9kdW1wKCJSZWNlaXZlIFJTTl9JRSAiLCBwS2V5RGF0YSwgS2V5RGF0YUxlbik7CisJCQloZXhfZHVtcCgiRGVzaXJlZCBSU05fSUUgIiwgcEVudHJ5LT5SU05fSUUsIHBFbnRyeS0+UlNOSUVfTGVuKTsKKworCQkJcmV0dXJuIEZBTFNFOworICAgIAl9CisgICAgCWVsc2UKKwkJeworCQkJaWYgKGJXUEEyICYmIE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykKKwkJCXsKKwkJCQkvLyBza2lwIFJTTiBJRQorCQkJCXBNeUtleURhdGEgKz0gc2tpcF9vZmZzZXQ7CisJCQkJS2V5RGF0YUxlbmd0aCAtPSBza2lwX29mZnNldDsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QUGFyc2VFYXBvbEtleURhdGEgPT0+IFdQQTIvV1BBMlBTSyBSU04gSUUgbWF0Y2hlZCBpbiBNc2cgMywgTGVuZ3RoKCVkKSBcbiIsIHNraXBfb2Zmc2V0KSk7CisJCQl9CisJCQllbHNlCisJCQkJcmV0dXJuIFRSVUU7CisJCX0KKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBQYXJzZUVhcG9sS2V5RGF0YSA9PT4gS2V5RGF0YUxlbmd0aCAlZCB3aXRob3V0IFJTTl9JRSBcbiIsIEtleURhdGFMZW5ndGgpKTsKKworCS8vIFBhcnNlIEVLRCBmb3JtYXQgaW4gcGFpcndpc2VfbXNnXzNfV1BBMiAmJiBncm91cF9tc2dfMV9XUEEyCisJaWYgKGJXUEEyICYmIChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMgfHwgTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpCisJeworCQlpZiAoS2V5RGF0YUxlbmd0aCA+PSA4KQkvLyBLREUgZm9ybWF0IGV4Y2x1ZGUgR1RLIGxlbmd0aAorICAgIAl7CisgICAgICAgIAlwS0RFID0gKFBLREVfRU5DQVApIHBNeUtleURhdGE7CisKKworCQkJRGVmYXVsdElkeCA9IHBLREUtPkdUS0VuY2FwLktpZDsKKworCQkJLy8gU2FuaXR5IGNoZWNrIC0gS0VEIGxlbmd0aAorCQkJaWYgKEtleURhdGFMZW5ndGggPCAocEtERS0+TGVuICsgMikpCisgICAgCQl7CisgICAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1I6IFRoZSBsZW4gZnJvbSBLREUgaXMgdG9vIHNob3J0IFxuIikpOworICAgICAgICAJCXJldHVybiBGQUxTRTsKKyAgICAJCX0KKworCQkJLy8gR2V0IEdUSyBsZW5ndGggLSByZWZlciB0byBJRUVFIDgwMi4xMWktMjAwNCBwLjgyCisJCQlHVEtMRU4gPSBwS0RFLT5MZW4gLTY7CisJCQlpZiAoR1RLTEVOIDwgTEVOX0FFU19LRVkpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1I6IEdUSyBLZXkgbGVuZ3RoIGlzIHRvbyBzaG9ydCAoJWQpIFxuIiwgR1RLTEVOKSk7CisgICAgICAgIAkJcmV0dXJuIEZBTFNFOworCQkJfQorCisgICAgCX0KKwkJZWxzZQorICAgIAl7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUjogS0RFIGZvcm1hdCBsZW5ndGggaXMgdG9vIHNob3J0IFxuIikpOworCSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIAl9CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiR1RLIGluIEtERSBmb3JtYXQgLERlZmF1bHRLZXlJRD0lZCwgS2V5TGVuPSVkIFxuIiwgRGVmYXVsdElkeCwgR1RLTEVOKSk7CisJCS8vIHNraXAgaXQKKwkJcE15S2V5RGF0YSArPSA4OworCQlLZXlEYXRhTGVuZ3RoIC09IDg7CisKKwl9CisJZWxzZSBpZiAoIWJXUEEyICYmIE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpCisJeworCQlEZWZhdWx0SWR4ID0gR3JvdXBLZXlJbmRleDsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiR1RLIERlZmF1bHRLZXlJRD0lZCBcbiIsIERlZmF1bHRJZHgpKTsKKwl9CisKKwkvLyBTYW5pdHkgY2hlY2sgLSBzaGFyZWQga2V5IGluZGV4IG11c3QgYmUgMSB+IDMKKwlpZiAoRGVmYXVsdElkeCA8IDEgfHwgRGVmYXVsdElkeCA+IDMpCisgICAgeworICAgICAJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1I6IEdUSyBLZXkgaW5kZXgoJWQpIGlzIGludmFsaWQgaW4gJXMgJXMgXG4iLCBEZWZhdWx0SWR4LCAoKGJXUEEyKSA/ICJXUEEyIiA6ICJXUEEiKSwgR2V0RWFwb2xNc2dUeXBlKE1zZ1R5cGUpKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCS8vIFRvZG8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCXJldHVybiBUUlVFOworCit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNvbnN0cnVjdCBFQVBvTCBtZXNzYWdlIGZvciBXUEEgaGFuZHNoYWtpbmcKKwkJSXRzIGZvcm1hdCBpcyBiZWxvdywKKworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgUHJvdG9jb2wgVmVyc2lvbgkgfCAgMSBvY3RldAorCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgUHJvdG9jb2wgVHlwZQkJIHwJMSBvY3RldAorCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgQm9keSBMZW5ndGgJCSB8ICAyIG9jdGV0cworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgRGVzY3JpcHRvciBUeXBlCSB8CTEgb2N0ZXQKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBJbmZvcm1hdGlvbiAgICB8CTIgb2N0ZXRzCisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBLZXkgTGVuZ3RoCSAgICAgfCAgMSBvY3RldAorCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgS2V5IFJlcGFseSBDb3VudGVyIHwJOCBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBOb25jZQkJICAgICB8ICAzMiBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBJVgkJCSB8ICAxNiBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBSU0MJCQkgfCAgOCBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBJRCBvciBSZXNlcnZlZCB8CTggb2N0ZXRzCisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBLZXkgTUlDCQkJIHwJMTYgb2N0ZXRzCisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBLZXkgRGF0YSBMZW5ndGgJIHwJMiBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBEYXRhCQkJIHwJbiBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCisKKwlBcmd1bWVudHM6CisJCXBBZAkJCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQ29uc3RydWN0RWFwb2xNc2coCisJSU4gCVBSVE1QX0FEQVBURVIgICAgCXBBZCwKKyAgICBJTiAJVUNIQVIJCQkJQXV0aE1vZGUsCisgICAgSU4gCVVDSEFSCQkJCVdlcFN0YXR1cywKKyAgICBJTiAJVUNIQVIJCQkJR3JvdXBLZXlXZXBTdGF0dXMsCisgICAgSU4gCVVDSEFSCQkJCU1zZ1R5cGUsCisgICAgSU4JVUNIQVIJCQkJRGVmYXVsdEtleUlkeCwKKyAgICBJTiAJVUNIQVIJCQkJKlJlcGxheUNvdW50ZXIsCisJSU4gCVVDSEFSCQkJCSpLZXlOb25jZSwKKwlJTglVQ0hBUgkJCQkqVHhSU0MsCisJSU4JVUNIQVIJCQkJKlBUSywKKwlJTglVQ0hBUgkJCQkqR1RLLAorCUlOCVVDSEFSCQkJCSpSU05JRSwKKwlJTglVQ0hBUgkJCQlSU05JRV9MZW4sCisgICAgT1VUIFBFQVBPTF9QQUNLRVQgICAgICAgcE1zZykKK3sKKwlCT09MRUFOCWJXUEEyID0gRkFMU0U7CisKKwkvLyBDaG9vc2UgV1BBMiBvciBub3QKKwlpZiAoKEF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8IChBdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKKwkJYldQQTIgPSBUUlVFOworCisgICAgLy8gSW5pdCBQYWNrZXQgYW5kIEZpbGwgaGVhZGVyCisgICAgcE1zZy0+UHJvVmVyID0gRUFQT0xfVkVSOworICAgIHBNc2ctPlByb1R5cGUgPSBFQVBPTEtleTsKKworCS8vIERlZmF1bHQgOTUgYnl0ZXMsIHRoZSBFQVBvTC1LZXkgZGVzY3JpcHRvciBleGNsdWRlIEtleS1kYXRhIGZpZWxkCisJcE1zZy0+Qm9keV9MZW5bMV0gPSBMRU5fRUFQT0xfS0VZX01TRzsKKworCS8vIEZpbGwgaW4gRUFQb0wgZGVzY3JpcHRvcgorCWlmIChiV1BBMikKKwkJcE1zZy0+S2V5RGVzYy5UeXBlID0gV1BBMl9LRVlfREVTQzsKKwllbHNlCisJCXBNc2ctPktleURlc2MuVHlwZSA9IFdQQTFfS0VZX0RFU0M7CisKKwkvLyBGaWxsIGluIEtleSBpbmZvcm1hdGlvbiwgcmVmZXIgdG8gSUVFRSBTdGQgODAyLjExaS0yMDA0IHBhZ2UgNzgKKwkvLyBXaGVuIGVpdGhlciB0aGUgcGFpcndpc2Ugb3IgdGhlIGdyb3VwIGNpcGhlciBpcyBBRVMsIHRoZSBERVNDX1RZUEVfQUVTKDIpIHNoYWxsIGJlIHVzZWQuCisJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPQorICAgICAgICAJKCgoV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpIHx8IChHcm91cEtleVdlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkgPyAoREVTQ19UWVBFX0FFUykgOiAoREVTQ19UWVBFX1RLSVApKTsKKworCS8vIFNwZWNpZnkgS2V5IFR5cGUgYXMgR3JvdXAoMCkgb3IgUGFpcndpc2UoMSkKKwlpZiAoTXNnVHlwZSA+PSBFQVBPTF9HUk9VUF9NU0dfMSkKKwkJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLktleVR5cGUgPSBHUk9VUEtFWTsKKwllbHNlCisJCXBNc2ctPktleURlc2MuS2V5SW5mby5LZXlUeXBlID0gUEFJUldJU0VLRVk7CisKKwkvLyBTcGVjaWZ5IEtleSBJbmRleCwgb25seSBncm91cF9tc2cxX1dQQTEKKwlpZiAoIWJXUEEyICYmIChNc2dUeXBlID49IEVBUE9MX0dST1VQX01TR18xKSkKKwkJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLktleUluZGV4ID0gRGVmYXVsdEtleUlkeDsKKworCWlmIChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpCisJCXBNc2ctPktleURlc2MuS2V5SW5mby5JbnN0YWxsID0gMTsKKworCWlmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpCisJCXBNc2ctPktleURlc2MuS2V5SW5mby5LZXlBY2sgPSAxOworCisJaWYgKE1zZ1R5cGUgIT0gRUFQT0xfUEFJUl9NU0dfMSkKKwkJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLktleU1pYyA9IDE7CisKKwlpZiAoKGJXUEEyICYmIChNc2dUeXBlID49IEVBUE9MX1BBSVJfTVNHXzMpKSB8fCAoIWJXUEEyICYmIChNc2dUeXBlID49IEVBUE9MX0dST1VQX01TR18xKSkpCisgICAgeworICAgICAgIAlwTXNnLT5LZXlEZXNjLktleUluZm8uU2VjdXJlID0gMTsKKyAgICB9CisKKwlpZiAoYldQQTIgJiYgKChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpIHx8IChNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkpCisgICAgeworICAgICAgICBwTXNnLT5LZXlEZXNjLktleUluZm8uRUtEX0RMID0gMTsKKyAgICB9CisKKwkvLyBrZXkgSW5mb3JtYXRpb24gZWxlbWVudCBoYXMgZG9uZS4KKwkqKFVTSE9SVCAqKSgmcE1zZy0+S2V5RGVzYy5LZXlJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwTXNnLT5LZXlEZXNjLktleUluZm8pKTsKKworCS8vIEZpbGwgaW4gS2V5IExlbmd0aAorI2lmIDAKKwlpZiAoYldQQTIpCisJeworCQkvLyBJbiBXUEEyIG1vZGUsIHRoZSBmaWVsZCBpbmRpY2F0ZXMgdGhlIGxlbmd0aCBvZiBwYWlyd2lzZSBrZXkgY2lwaGVyLAorCQkvLyBzbyBvbmx5IHBhaXJ3aXNlX21zZ18xIGFuZCBwYWlyd2lzZV9tc2dfMyBuZWVkIHRvIGZpbGwuCisJCWlmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKSkKKwkJCXBNc2ctPktleURlc2MuS2V5TGVuZ3RoWzFdID0gKChXZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgPyBMRU5fVEtJUF9LRVkgOiBMRU5fQUVTX0tFWSk7CisJfQorCWVsc2UgaWYgKCFiV1BBMikKKyNlbmRpZgorCXsKKwkJaWYgKE1zZ1R5cGUgPj0gRUFQT0xfR1JPVVBfTVNHXzEpCisJCXsKKwkJCS8vIHRoZSBsZW5ndGggb2YgZ3JvdXAga2V5IGNpcGhlcgorCQkJcE1zZy0+S2V5RGVzYy5LZXlMZW5ndGhbMV0gPSAoKEdyb3VwS2V5V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpID8gVEtJUF9HVEtfTEVOR1RIIDogTEVOX0FFU19LRVkpOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gdGhlIGxlbmd0aCBvZiBwYWlyd2lzZSBrZXkgY2lwaGVyCisJCQlwTXNnLT5LZXlEZXNjLktleUxlbmd0aFsxXSA9ICgoV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpID8gTEVOX1RLSVBfS0VZIDogTEVOX0FFU19LRVkpOworCQl9CisJfQorCisgCS8vIEZpbGwgaW4gcmVwbGF5IGNvdW50ZXIKKyAgICBOZGlzTW92ZU1lbW9yeShwTXNnLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIFJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLy8gRmlsbCBLZXkgTm9uY2UgZmllbGQKKwkvLyBBTm9uY2UgOiBwYWlyd2lzZV9tc2cxICYgcGFpcndpc2VfbXNnMworCS8vIFNOb25jZSA6IHBhaXJ3aXNlX21zZzIKKwkvLyBHTm9uY2UgOiBncm91cF9tc2cxX3dwYTEKKwlpZiAoKE1zZ1R5cGUgPD0gRUFQT0xfUEFJUl9NU0dfMykgfHwgKCghYldQQTIgJiYgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKSkpCisgICAgCU5kaXNNb3ZlTWVtb3J5KHBNc2ctPktleURlc2MuS2V5Tm9uY2UsIEtleU5vbmNlLCBMRU5fS0VZX0RFU0NfTk9OQ0UpOworCisJLy8gRmlsbCBrZXkgSVYgLSBXUEEyIGFzIDAsIFdQQTEgYXMgcmFuZG9tCisJaWYgKCFiV1BBMiAmJiAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpCisJeworCQkvLyBTdWdnZXN0IElWIGJlIHJhbmRvbSBudW1iZXIgcGx1cyBzb21lIG51bWJlciwKKwkJTmRpc01vdmVNZW1vcnkocE1zZy0+S2V5RGVzYy5LZXlJdiwgJktleU5vbmNlWzE2XSwgTEVOX0tFWV9ERVNDX0lWKTsKKyAgICAgICAgcE1zZy0+S2V5RGVzYy5LZXlJdlsxNV0gKz0gMjsKKwl9CisKKyAgICAvLyBGaWxsIEtleSBSU0MgZmllbGQKKyAgICAvLyBJdCBjb250YWlucyB0aGUgUlNDIGZvciB0aGUgR1RLIGJlaW5nIGluc3RhbGxlZC4KKwlpZiAoKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMyAmJiBiV1BBMikgfHwgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKQorCXsKKyAgICAgICAgTmRpc01vdmVNZW1vcnkocE1zZy0+S2V5RGVzYy5LZXlSc2MsIFR4UlNDLCA2KTsKKwl9CisKKwkvLyBDbGVhciBLZXkgTUlDIGZpZWxkIGZvciBNSUMgY2FsY3VsYXRpb24gbGF0ZXIKKyAgICBOZGlzWmVyb01lbW9yeShwTXNnLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKwlDb25zdHJ1Y3RFYXBvbEtleURhdGEocEFkLAorCQkJCQkJICBBdXRoTW9kZSwKKwkJCQkJCSAgV2VwU3RhdHVzLAorCQkJCQkJICBHcm91cEtleVdlcFN0YXR1cywKKwkJCQkJCSAgTXNnVHlwZSwKKwkJCQkJCSAgRGVmYXVsdEtleUlkeCwKKwkJCQkJCSAgYldQQTIsCisJCQkJCQkgIFBUSywKKwkJCQkJCSAgR1RLLAorCQkJCQkJICBSU05JRSwKKwkJCQkJCSAgUlNOSUVfTGVuLAorCQkJCQkJICBwTXNnKTsKKworCS8vIENhbGN1bGF0ZSBNSUMgYW5kIGZpbGwgaW4gS2V5TWljIEZpZWxkIGV4Y2VwdCBQYWlyd2lzZSBNc2cgMS4KKwlpZiAoTXNnVHlwZSAhPSBFQVBPTF9QQUlSX01TR18xKQorCXsKKwkJQ2FsY3VsYXRlTUlDKHBBZCwgV2VwU3RhdHVzLCBQVEssIHBNc2cpOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gQ29uc3RydWN0RWFwb2xNc2cgZm9yICVzICVzXG4iLCAoKGJXUEEyKSA/ICJXUEEyIiA6ICJXUEEiKSwgR2V0RWFwb2xNc2dUeXBlKE1zZ1R5cGUpKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiCSAgICAgQm9keSBsZW5ndGggPSAlZCBcbiIsIHBNc2ctPkJvZHlfTGVuWzFdKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiCSAgICAgS2V5IGxlbmd0aCAgPSAlZCBcbiIsIHBNc2ctPktleURlc2MuS2V5TGVuZ3RoWzFdKSk7CisKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ29uc3RydWN0IHRoZSBLZXkgRGF0YSBmaWVsZCBvZiBFQVBvTCBtZXNzYWdlCisKKwlBcmd1bWVudHM6CisJCXBBZAkJCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKwkJRWxlbQkJTWVzc2FnZSBib2R5CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUNvbnN0cnVjdEVhcG9sS2V5RGF0YSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUF1dGhNb2RlLAorCUlOCVVDSEFSCQkJV2VwU3RhdHVzLAorCUlOCVVDSEFSCQkJR3JvdXBLZXlXZXBTdGF0dXMsCisJSU4gCVVDSEFSCQkJTXNnVHlwZSwKKwlJTglVQ0hBUgkJCURlZmF1bHRLZXlJZHgsCisJSU4JQk9PTEVBTgkJCWJXUEEyQ2FwYWJsZSwKKwlJTglVQ0hBUgkJCSpQVEssCisJSU4JVUNIQVIJCQkqR1RLLAorCUlOCVVDSEFSCQkJKlJTTklFLAorCUlOCVVDSEFSCQkJUlNOSUVfTEVOLAorCU9VVCBQRUFQT0xfUEFDS0VUICAgcE1zZykKK3sKKwlVQ0hBUgkJKm1wb29sLCAqS2V5X0RhdGEsICpSYzRHVEs7CisJVUNIQVIgICAgICAgZWtleVsoTEVOX0tFWV9ERVNDX0lWK0xFTl9FQVBfRUspXTsKKwlVQ0hBUgkJZGF0YV9vZmZzZXQ7CisKKworCWlmIChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzEgfHwgTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR180IHx8IE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzIpCisJCXJldHVybjsKKworCS8vIGFsbG9jYXRlIG1lbW9yeSBwb29sCisJb3NfYWxsb2NfbWVtKHBBZCwgKFBVQ0hBUiAqKSZtcG9vbCwgMTUwMCk7CisKKyAgICBpZiAobXBvb2wgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLyogUmM0R1RLIExlbiA9IDUxMiAqLworCVJjNEdUSyA9IChVQ0hBUiAqKSBST1VORF9VUChtcG9vbCwgNCk7CisJLyogS2V5X0RhdGEgTGVuID0gNTEyICovCisJS2V5X0RhdGEgPSAoVUNIQVIgKikgUk9VTkRfVVAoUmM0R1RLICsgNTEyLCA0KTsKKworCU5kaXNaZXJvTWVtb3J5KEtleV9EYXRhLCA1MTIpOworCXBNc2ctPktleURlc2MuS2V5RGF0YUxlblsxXSA9IDA7CisJZGF0YV9vZmZzZXQgPSAwOworCisJLy8gRW5jYXBzdWxhdGUgUlNOSUUgaW4gcGFpcndpc2VfbXNnMiAmIHBhaXJ3aXNlX21zZzMKKwlpZiAoUlNOSUVfTEVOICYmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18yKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKSkpCisJeworCQlpZiAoYldQQTJDYXBhYmxlKQorCQkJS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAwXSA9IElFX1dQQTI7CisJCWVsc2UKKwkJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMF0gPSBJRV9XUEE7CisKKyAgICAgICAgS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAxXSA9IFJTTklFX0xFTjsKKwkJTmRpc01vdmVNZW1vcnkoJktleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMl0sIFJTTklFLCBSU05JRV9MRU4pOworCQlkYXRhX29mZnNldCArPSAoMiArIFJTTklFX0xFTik7CisJfQorCisJLy8gRW5jYXBzdWxhdGUgS0RFIGZvcm1hdCBpbiBwYWlyd2lzZV9tc2czX1dQQTIgJiBncm91cF9tc2cxX1dQQTIKKwlpZiAoYldQQTJDYXBhYmxlICYmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpKQorCXsKKwkJLy8gS2V5IERhdGEgRW5jYXBzdWxhdGlvbiAoS0RFKSBmb3JtYXQgLSA4MDIuMTFpLTIwMDQgIEZpZ3VyZS00M3cgYW5kIFRhYmxlLTIwaAorICAgICAgICBLZXlfRGF0YVtkYXRhX29mZnNldCArIDBdID0gMHhERDsKKworCQlpZiAoR3JvdXBLZXlXZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJeworCQkJS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAxXSA9IDB4MTY7Ly8gNCsyKzE2KE9VSStEYXRhVHlwZStEYXRhRmllbGQpCisJCX0KKwkJZWxzZQorCQl7CisJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDFdID0gMHgyNjsvLyA0KzIrMzIoT1VJK0RhdGFUeXBlK0RhdGFGaWVsZCkKKwkJfQorCisgICAgICAgIEtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMl0gPSAweDAwOworICAgICAgICBLZXlfRGF0YVtkYXRhX29mZnNldCArIDNdID0gMHgwRjsKKyAgICAgICAgS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyA0XSA9IDB4QUM7CisgICAgICAgIEtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgNV0gPSAweDAxOworCisJCS8vIEdUSyBLREUgZm9ybWF0IC0gODAyLjExaS0yMDA0ICBGaWd1cmUtNDN4CisgICAgICAgIEtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgNl0gPSAoRGVmYXVsdEtleUlkeCAmIDB4MDMpOworICAgICAgICBLZXlfRGF0YVtkYXRhX29mZnNldCArIDddID0gMHgwMDsJLy8gUmVzZXJ2ZWQgQnl0ZQorCisJCWRhdGFfb2Zmc2V0ICs9IDg7CisJfQorCisKKwkvLyBFbmNhcHN1bGF0ZSBHVEsgYW5kIGVuY3J5cHQgdGhlIGtleS1kYXRhIGZpZWxkIHdpdGggS0VLLgorCS8vIE9ubHkgZm9yIHBhaXJ3aXNlX21zZzNfV1BBMiBhbmQgZ3JvdXBfbXNnMQorCWlmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zICYmIGJXUEEyQ2FwYWJsZSkgfHwgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKQorCXsKKwkJLy8gRmlsbCBpbiBHVEsKKwkJaWYgKEdyb3VwS2V5V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCXsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZLZXlfRGF0YVtkYXRhX29mZnNldF0sIEdUSywgTEVOX0FFU19LRVkpOworCQkJZGF0YV9vZmZzZXQgKz0gTEVOX0FFU19LRVk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlOZGlzTW92ZU1lbW9yeSgmS2V5X0RhdGFbZGF0YV9vZmZzZXRdLCBHVEssIFRLSVBfR1RLX0xFTkdUSCk7CisJCQlkYXRhX29mZnNldCArPSBUS0lQX0dUS19MRU5HVEg7CisJCX0KKworCQkvLyBTdGlsbCBkb250IGtub3cgd2h5LCBidXQgaWYgbm90IGFwcGVuZCB3aWxsIG9jY3VyICJHVEsgbm90IGluY2x1ZGUgaW4gTVNHMyIKKwkJLy8gUGF0Y2ggZm9yIGNvbXBhdGliaWxpdHkgYmV0d2VlbiB6ZXJvIGNvbmZpZyBhbmQgZnVuaworCQlpZiAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zICYmIGJXUEEyQ2FwYWJsZSkKKwkJeworCQkJaWYgKEdyb3VwS2V5V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCQl7CisJCQkJS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAwXSA9IDB4REQ7CisJCQkJS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAxXSA9IDA7CisJCQkJZGF0YV9vZmZzZXQgKz0gMjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDBdID0gMHhERDsKKwkJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDFdID0gMDsKKwkJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDJdID0gMDsKKwkJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDNdID0gMDsKKwkJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDRdID0gMDsKKwkJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDVdID0gMDsKKwkJCQlkYXRhX29mZnNldCArPSA2OworCQkJfQorCQl9CisKKwkJLy8gRW5jcnlwdCB0aGUgZGF0YSBtYXRlcmlhbCBpbiBrZXkgZGF0YSBmaWVsZAorCQlpZiAoV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCXsKKwkJCUFFU19HVEtfS0VZX1dSQVAoJlBUS1sxNl0sIEtleV9EYXRhLCBkYXRhX29mZnNldCwgUmM0R1RLKTsKKyAgICAgICAgICAgIC8vIEFFUyB3cmFwIGZ1bmN0aW9uIHdpbGwgZ3JvdyA4IGJ5dGVzIGluIGxlbmd0aAorICAgICAgICAgICAgZGF0YV9vZmZzZXQgKz0gODsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIFBSRVBBUkUgRW5jcnlwdGVkICAiS2V5IERBVEEiIGZpZWxkLiAgKEVuY3J5cHQgR1RLIHdpdGggUkM0LCB1c2luZiBQVEtbMTZdLT5bMzFdIGFzIEtleSwgSVYtZmllbGQgYXMgSVYpCisJCQkvLyBwdXQgVHhUc2MgaW4gS2V5IFJTQyBmaWVsZAorCQkJcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiA9IFBQUElOSVRGQ1MzMjsgICAvL0luaXQgY3JjMzIuCisKKwkJCS8vIGVrZXkgaXMgdGhlIGNvbnRhbmV0aW9uIG9mIElWLWZpZWxkLCBhbmQgUFRLWzE2XS0+UFRLWzMxXQorCQkJTmRpc01vdmVNZW1vcnkoZWtleSwgcE1zZy0+S2V5RGVzYy5LZXlJdiwgTEVOX0tFWV9ERVNDX0lWKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZla2V5W0xFTl9LRVlfREVTQ19JVl0sICZQVEtbMTZdLCBMRU5fRUFQX0VLKTsKKwkJCUFSQ0ZPVVJfSU5JVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBla2V5LCBzaXplb2YoZWtleSkpOyAgLy9JTklUIFNCT1gsIEtFWUxFTiszKElWKQorCQkJcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiA9IFJUTVBfQ0FMQ19GQ1MzMihwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyLCBLZXlfRGF0YSwgZGF0YV9vZmZzZXQpOworCQkJV1BBQVJDRk9VUl9FTkNSWVBUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIFJjNEdUSywgS2V5X0RhdGEsIGRhdGFfb2Zmc2V0KTsKKwkJfQorCisJCU5kaXNNb3ZlTWVtb3J5KHBNc2ctPktleURlc2MuS2V5RGF0YSwgUmM0R1RLLCBkYXRhX29mZnNldCk7CisJfQorCWVsc2UKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KHBNc2ctPktleURlc2MuS2V5RGF0YSwgS2V5X0RhdGEsIGRhdGFfb2Zmc2V0KTsKKwl9CisKKwkvLyBzZXQga2V5IGRhdGEgbGVuZ3RoIGZpZWxkIGFuZCB0b3RhbCBsZW5ndGgKKwlwTXNnLT5LZXlEZXNjLktleURhdGFMZW5bMV0gPSBkYXRhX29mZnNldDsKKyAgICBwTXNnLT5Cb2R5X0xlblsxXSArPSBkYXRhX29mZnNldDsKKworCW9zX2ZyZWVfbWVtKHBBZCwgbXBvb2wpOworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDYWxjYXVsYXRlIE1JQy4gSXQgaXMgdXNlZCBkdXJpbmcgNC13YXlzIGhhbmRzaGFya2luZy4KKworCUFyZ3VtZW50czoKKwkJcEFkCQkJCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAorICAgIAlQZWVyV2VwU3RhdHVzCS0JaW5kaWNhdGUgdGhlIGVuY3J5cHRpb24gdHlwZQorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQ2FsY3VsYXRlTUlDKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJUGVlcldlcFN0YXR1cywKKwlJTglVQ0hBUgkJCSpQVEssCisJT1VUIFBFQVBPTF9QQUNLRVQgICBwTXNnKQoreworICAgIFVDSEFSICAgKk91dEJ1ZmZlcjsKKwlVTE9ORwlGcmFtZUxlbiA9IDA7CisJVUNIQVIJbWljW0xFTl9LRVlfREVTQ19NSUNdOworCVVDSEFSCWRpZ2VzdFs4MF07CisKKwkvLyBhbGxvY2F0ZSBtZW1vcnkgZm9yIE1JQyBjYWxjdWxhdGlvbgorCW9zX2FsbG9jX21lbShwQWQsIChQVUNIQVIgKikmT3V0QnVmZmVyLCA1MTIpOworCisgICAgaWYgKE91dEJ1ZmZlciA9PSBOVUxMKQorICAgIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiISEhQ2FsY3VsYXRlTUlDOiBubyBtZW1vcnkhISFcbiIpKTsKKwkJcmV0dXJuOworICAgIH0KKworCS8vIG1ha2UgYSBmcmFtZSBmb3IgY2FsY3VsYXRpbmcgTUlDLgorICAgIE1ha2VPdXRnb2luZ0ZyYW1lKE91dEJ1ZmZlciwgICAgICAgICAgICAJJkZyYW1lTGVuLAorICAgICAgICAgICAgICAgICAgICAgIHBNc2ctPkJvZHlfTGVuWzFdICsgNCwgIAlwTXNnLAorICAgICAgICAgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKworCU5kaXNaZXJvTWVtb3J5KG1pYywgc2l6ZW9mKG1pYykpOworCisJLy8gQ2FsY3VsYXRlIE1JQworICAgIGlmIChQZWVyV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisgCXsKKwkJSE1BQ19TSEExKE91dEJ1ZmZlciwgIEZyYW1lTGVuLCBQVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJTmRpc01vdmVNZW1vcnkobWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKwllbHNlCisJeworCQlobWFjX21kNShQVEssICBMRU5fRUFQX01JQ0ssIE91dEJ1ZmZlciwgRnJhbWVMZW4sIG1pYyk7CisJfQorCisJLy8gc3RvcmUgdGhlIGNhbGN1bGF0ZWQgTUlDCisJTmRpc01vdmVNZW1vcnkocE1zZy0+S2V5RGVzYy5LZXlNaWMsIG1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKwlvc19mcmVlX21lbShwQWQsIE91dEJ1ZmZlcik7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlTb21lIHJlY2VpdmVkIGZyYW1lcyBjYW4ndCBkZWNyeXB0IGJ5IEFzaWMsIHNvIGRlY3J5cHQgdGhlbSBieSBzb2Z0d2FyZS4KKworCUFyZ3VtZW50czoKKwkJcEFkCQkJCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAorICAgIAlQZWVyV2VwU3RhdHVzCS0JaW5kaWNhdGUgdGhlIGVuY3J5cHRpb24gdHlwZQorCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NUQVRVU19TVUNDRVNTCQktCWRlY3J5cHRpb24gc3VjY2Vzc2Z1bAorCQlORElTX1NUQVRVU19GQUlMVVJFCQktCWRlY3J5cHRpb24gZmFpbHVyZQorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMJUlRNUFNvZnREZWNyeXB0QnJvYWRDYXN0RGF0YSgKKwlJTglQUlRNUF9BREFQVEVSCQkJCQlwQWQsCisJSU4JUlhfQkxLCQkJCQkJCSpwUnhCbGssCisJSU4gIE5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTIAlHcm91cENpcGhlciwKKwlJTiAgUENJUEhFUl9LRVkJCQkJCQlwU2hhcmRfa2V5KQoreworCVBSWFdJX1NUUlVDCQkJcFJ4V0kgPSBwUnhCbGstPnBSeFdJOworCisKKworCS8vIGhhbmRsZSBXRVAgZGVjcnlwdGlvbgorCWlmIChHcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKQorICAgIHsKKwkJaWYgKFJUTVBTb2Z0RGVjcnlwdFdFUChwQWQsIHBSeEJsay0+cERhdGEsIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQsIHBTaGFyZF9rZXkpKQorCQl7CisKKwkJCS8vTWludXMgSVZbNF0gJiBJQ1ZbNF0KKwkJCXBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQgLT0gODsKKwkJfQorCQllbHNlCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVSUk9SIDogU29mdHdhcmUgZGVjcnlwdCBXRVAgZGF0YSBmYWlscy5cbiIpKTsKKwkJCS8vIGdpdmUgdXAgdGhpcyBmcmFtZQorCQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJCX0KKwl9CisJLy8gaGFuZGxlIFRLSVAgZGVjcnlwdGlvbgorCWVsc2UgaWYgKEdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJeworCQlpZiAoUlRNUFNvZnREZWNyeXB0VEtJUChwQWQsIHBSeEJsay0+cERhdGEsIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQsIDAsIHBTaGFyZF9rZXkpKQorCQl7CisKKwkJCS8vTWludXMgOCBieXRlcyBNSUMsIDggYnl0ZXMgSVYvRUlWLCA0IGJ5dGVzIElDVgorCQkJcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCAtPSAyMDsKKwkJfQorICAgICAgICBlbHNlCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVSUk9SIDogUlRNUFNvZnREZWNyeXB0VEtJUCBGYWlsZWRcbiIpKTsKKwkJCS8vIGdpdmUgdXAgdGhpcyBmcmFtZQorCQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgIH0KKwl9CisJLy8gaGFuZGxlIEFFUyBkZWNyeXB0aW9uCisJZWxzZSBpZiAoR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CisJCWlmIChSVE1QU29mdERlY3J5cHRBRVMocEFkLCBwUnhCbGstPnBEYXRhLCBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ICwgcFNoYXJkX2tleSkpCisJCXsKKworCQkJLy84IGJ5dGVzIE1JQywgOCBieXRlcyBJVi9FSVYgKENDTVAgSGVhZGVyKQorCQkJcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCAtPSAxNjsKKwkJfQorCQllbHNlCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVSUk9SIDogUlRNUFNvZnREZWNyeXB0QUVTIEZhaWxlZFxuIikpOworCQkJLy8gZ2l2ZSB1cCB0aGlzIGZyYW1lCisJCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwkJfQorCX0KKwllbHNlCisJeworCQkvLyBnaXZlIHVwIHRoaXMgZnJhbWUKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vZGZzLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9kZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDliYmE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vZGZzLmMKQEAgLTAsMCArMSw0NTMgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgYXBfZGZzLmMKKworICAgIEFic3RyYWN0OgorICAgIFN1cHBvcnQgREZTIGZ1bmN0aW9uLgorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgV2hlbiAgICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgLS0tLS0tLS0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGb25jaGkgICAgMDMtMTItMjAwNyAgICAgIGNyZWF0ZWQKKyovCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKwordHlwZWRlZiBzdHJ1Y3QgX1JBREFSX0RVUkFUSU9OX1RBQkxFCit7CisJVUxPTkcgUkREdXJSZWdpb247CisJVUxPTkcgUmFkYXJTaWduYWxEdXJhdGlvbjsKKwlVTE9ORyBUb2xlcmFuY2U7Cit9IFJBREFSX0RVUkFUSU9OX1RBQkxFLCAqUFJBREFSX0RVUkFUSU9OX1RBQkxFOworCisKK3N0YXRpYyBVQ0hBUiBSZElkbGVUaW1lVGFibGVbTUFYX1JEX1JFR0lPTl1bNF0gPQoreworCXs5LCAyNTAsIDI1MCwgMjUwfSwJCS8vIENFCisJezQsIDI1MCwgMjUwLCAyNTB9LAkJLy8gRkNDCisJezQsIDI1MCwgMjUwLCAyNTB9LAkJLy8gSkFQCisJezE1LCAyNTAsIDI1MCwgMjUwfSwJLy8gSkFQX1c1MworCXs0LCAyNTAsIDI1MCwgMjUwfQkJLy8gSkFQX1c1NgorfTsKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUJicCBSYWRhciBkZXRlY3Rpb24gcm91dGluZQorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQmJwUmFkYXJEZXRlY3Rpb25TdGFydCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlVSU5UOCBSYWRhclBlcmlvZDsKKworCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMTQsIDB4MDIpOworCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMjEsIDB4MjApOworCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMjIsIDB4MDApOworCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMjMsIDB4MDgvKjB4ODAqLyk7CisJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIDEyNCwgMHgyOCk7CisJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIDEyNSwgMHhmZik7CisKKyNpZiAwCisJLy8gdG9nZ2xlIFJ4IGVuYWJsZSBiaXQgZm9yIHJhZGFyIGRldGVjdGlvbi4KKwkvLyBpdCdzIEFuZHkncyByZWNvbW1hbmQuCisJeworCQlVSU5UMzIgVmFsdWU7CisJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJVmFsdWUgfD0gKDB4MSA8PCAzKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKwlWYWx1ZSAmPSB+KDB4MSA8PCAzKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKwl9CisjZW5kaWYKKwlSYWRhclBlcmlvZCA9ICgoVUlOVClSZElkbGVUaW1lVGFibGVbcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb25dWzBdICsgKFVJTlQpcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUpIDwgMjUwID8KKwkJCShSZElkbGVUaW1lVGFibGVbcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb25dWzBdICsgcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUpIDogMjUwOworCisJUlRNUF9JT19XUklURTgocEFkLCAweDcwMjAsIDB4MWQpOworCVJUTVBfSU9fV1JJVEU4KHBBZCwgMHg3MDIxLCAweDQwKTsKKworCVJhZGFyRGV0ZWN0aW9uU3RhcnQocEFkLCAwLCBSYWRhclBlcmlvZCk7CisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQmJwIFJhZGFyIGRldGVjdGlvbiByb3V0aW5lCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBCYnBSYWRhckRldGVjdGlvblN0b3AoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJUlRNUF9JT19XUklURTgocEFkLCAweDcwMjAsIDB4MWQpOworCVJUTVBfSU9fV1JJVEU4KHBBZCwgMHg3MDIxLCAweDYwKTsKKworCVJhZGFyRGV0ZWN0aW9uU3RvcChwQWQpOworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJhZGFyIGRldGVjdGlvbiByb3V0aW5lCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSYWRhckRldGVjdGlvblN0YXJ0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIEJPT0xFQU4gQ1RTUHJvdGVjdCwKKwlJTiBVSU5UOCBDVFNQZXJpb2QpCit7CisJVUlOVDggRGZzQWN0aXZlVGltZSA9IChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSAmIDB4MWYpOworCVVJTlQ4IEN0c1Byb3RlY3QgPSAoQ1RTUHJvdGVjdCA9PSAxKSA/IDB4MDIgOiAweDAxOyAvLyBDVFMgcHJvdGVjdC4KKworCWlmIChDVFNQcm90ZWN0ICE9IDApCisJeworCQlzd2l0Y2gocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24pCisJCXsKKwkJY2FzZSBGQ0M6CisJCWNhc2UgSkFQX1c1NjoKKwkJCUN0c1Byb3RlY3QgPSAweDAzOworCQkJYnJlYWs7CisKKwkJY2FzZSBDRToKKwkJY2FzZSBKQVBfVzUzOgorCQlkZWZhdWx0OgorCQkJQ3RzUHJvdGVjdCA9IDB4MDI7CisJCQlicmVhazsKKwkJfQorCX0KKwllbHNlCisJCUN0c1Byb3RlY3QgPSAweDAxOworCisKKwkvLyBzZW5kIHN0YXJ0LVJEIHdpdGggQ1RTIHByb3RlY3Rpb24gY29tbWFuZCB0byBNQ1UKKwkvLyBoaWdoYnl0ZSBbN10JCXJlc2VydmUKKwkvLyBoaWdoYnl0ZSBbNjo1XQkweDogc3RvcCBDYXJyaWVyL1JhZGFyIGRldGVjdGlvbgorCS8vIGhpZ2hieXRlIFsxMF06CVN0YXJ0IENhcnJpZXIvUmFkYXIgZGV0ZWN0aW9uIHdpdGhvdXQgQ1RTIHByb3RlY3Rpb24sIDExOiBTdGFydCBDYXJyaWVyL1JhZGFyIGRldGVjdGlvbiB3aXRoIENUUyBwcm90ZWN0aW9uCisJLy8gaGlnaGJ5dGUgWzQ6MF0JUmFkYXIvY2FycmllciBkZXRlY3Rpb24gZHVyYXRpb24uIEluIDFtcy4KKworCS8vIGxvd2J5dGUgWzc6MF0JUmFkYXIvY2FycmllciBkZXRlY3Rpb24gcGVyaW9kLCBpbiAxbXMuCisJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDYwLCAweGZmLCBDVFNQZXJpb2QsIERmc0FjdGl2ZVRpbWUgfCAoQ3RzUHJvdGVjdCA8PCA1KSk7CisJLy9Bc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NjMsIDB4ZmYsIDEwLCAwKTsKKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJhZGFyIGRldGVjdGlvbiByb3V0aW5lCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlUUlVFCUZvdW5kIHJhZGFyIHNpZ25hbAorCQlGQUxTRQlOb3QgZm91bmQgcmFkYXIgc2lnbmFsCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJhZGFyRGV0ZWN0aW9uU3RvcCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJhZGFyRGV0ZWN0aW9uU3RvcC5cbiIpKTsKKwlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NjAsIDB4ZmYsIDB4MDAsIDB4MDApOwkvLyBzZW5kIHN0YXJ0LVJEIHdpdGggQ1RTIHByb3RlY3Rpb24gY29tbWFuZCB0byBNQ1UKKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJhZGFyIGNoYW5uZWwgY2hlY2sgcm91dGluZQorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJVFJVRQluZWVkIHRvIGRvIHJhZGFyIGRldGVjdAorCQlGQUxTRQluZWVkIG5vdCB0byBkbyByYWRhciBkZXRlY3QKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gUmFkYXJDaGFubmVsQ2hlY2soCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVUNIQVIJCQlDaCkKK3sKKyNpZiAxCisJSU5UCQlpOworCUJPT0xFQU4gcmVzdWx0ID0gRkFMU0U7CisKKwlmb3IgKGk9MDsgaTxwQWQtPkNoYW5uZWxMaXN0TnVtOyBpKyspCisJeworCQlpZiAoQ2ggPT0gcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsKQorCQl7CisJCQlyZXN1bHQgPSBwQWQtPkNoYW5uZWxMaXN0W2ldLkRmc1JlcTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJlc3VsdDsKKyNlbHNlCisJSU5UCQlpOworCVVDSEFSCUNoYW5uZWxbMTVdPXs1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDB9OworCisJZm9yIChpPTA7IGk8MTU7IGkrKykKKwl7CisJCWlmIChDaCA9PSBDaGFubmVsW2ldKQorCQl7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpICE9IDE1KQorCQlyZXR1cm4gVFJVRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsKKyNlbmRpZgorfQorCitVTE9ORyBKYXBSYWRhclR5cGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUxPTkcJCWk7CisJY29uc3QgVUNIQVIJQ2hhbm5lbFsxNV09ezUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MH07CisKKwlpZiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24gIT0gSkFQKQorCXsKKwkJcmV0dXJuIHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uOworCX0KKworCWZvciAoaT0wOyBpPDE1OyBpKyspCisJeworCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9PSBDaGFubmVsW2ldKQorCQl7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpIDwgNCkKKwkJcmV0dXJuIEpBUF9XNTM7CisJZWxzZSBpZiAoaSA8IDE1KQorCQlyZXR1cm4gSkFQX1c1NjsKKwllbHNlCisJCXJldHVybiBKQVA7IC8vIFc1MgorCit9CisKK1VMT05HIFJUTVBCYnBSZWFkUmFkYXJEdXJhdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlVSU5UOCBieXRlVmFsdWUgPSAwOworCVVMT05HIHJlc3VsdDsKKworCUJCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjExNSwgJmJ5dGVWYWx1ZSk7CisKKwlyZXN1bHQgPSAwOworCXN3aXRjaCAoYnl0ZVZhbHVlKQorCXsKKwljYXNlIDE6IC8vIHJhZGFyIHNpZ25hbCBkZXRlY3RlZCBieSBwdWxzZSBtb2RlLgorCWNhc2UgMjogLy8gcmFkYXIgc2lnbmFsIGRldGVjdGVkIGJ5IHdpZHRoIG1vZGUuCisJCXJlc3VsdCA9IFJUTVBSZWFkUmFkYXJEdXJhdGlvbihwQWQpOworCQlicmVhazsKKworCWNhc2UgMDogLy8gTm8gcmFkYXIgc2lnbmFsLgorCWRlZmF1bHQ6CisKKwkJcmVzdWx0ID0gMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworVUxPTkcgUlRNUFJlYWRSYWRhckR1cmF0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKQoreworCVVMT05HIHJlc3VsdCA9IDA7CisKKyNpZmRlZiBERlNfU1VQUE9SVAorCVVJTlQ4IGR1cmF0aW9uMSA9IDAsIGR1cmF0aW9uMiA9IDAsIGR1cmF0aW9uMyA9IDA7CisKKwlCQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxMTYsICZkdXJhdGlvbjEpOworCUJCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjExNywgJmR1cmF0aW9uMik7CisJQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMTE4LCAmZHVyYXRpb24zKTsKKwlyZXN1bHQgPSAoZHVyYXRpb24xIDw8IDE2KSArIChkdXJhdGlvbjIgPDwgOCkgKyBkdXJhdGlvbjM7CisjZW5kaWYgLy8gREZTX1NVUFBPUlQgLy8KKworCXJldHVybiByZXN1bHQ7CisKK30KKworVk9JRCBSVE1QQ2xlYW5SYWRhckR1cmF0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKQoreworCXJldHVybjsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBSYWRhciB3YXZlIGRldGVjdGlvbi4gVGhlIEFQSSBzaG91bGQgYmUgaW52b2tlIGVhY2ggc2Vjb25kLgorCisgICAgQXJndW1lbnRzOgorICAgICAgICBwQWQgICAgICAgICAtIEFkYXB0ZXIgcG9pbnRlcgorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOb25lCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEFwUmFkYXJEZXRlY3RQZXJpb2RpYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlJTlQJaTsKKworCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkluU2VydmljZU1vbml0b3JDb3VudCsrOworCisJZm9yIChpPTA7IGk8cEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaV0uUmVtYWluaW5nVGltZUZvclVzZSA+IDApCisJCXsKKwkJCXBBZC0+Q2hhbm5lbExpc3RbaV0uUmVtYWluaW5nVGltZUZvclVzZSAtLTsKKwkJCWlmICgocEFkLT5NbG1lLlBlcmlvZGljUm91bmQlNSkgPT0gMCkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWRhckRldGVjdFBlcmlvZGljIC0gY2g9JWQsIFJlbWFpbmluZ1RpbWVGb3JVc2U9JWRcbiIsIHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCwgcEFkLT5DaGFubmVsTGlzdFtpXS5SZW1haW5pbmdUaW1lRm9yVXNlKSk7CisJCQl9CisJCX0KKwl9CisKKwkvL3JhZGFyIGRldGVjdAorCWlmICgocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQorCQkmJiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkKKwkJJiYgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSkKKwl7CisJCVJhZGFyRGV0ZWN0UGVyaW9kaWMocEFkKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8vIFBlcmlvZGljIFJhZGFyIGRldGVjdGlvbiwgc3dpdGNoIGNoYW5uZWwgd2lsbCBvY2N1ciBpbiBSVE1QSGFuZGxlVEJUVEludGVycnVwdCgpCisvLyBCZWZvcmUgc3dpdGNoIGNoYW5uZWwsIGRyaXZlciBuZWVkcyBkb2luZyBjaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQuCitWT0lEIFJhZGFyRGV0ZWN0UGVyaW9kaWMoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpCit7CisJLy8gbmVlZCB0byBjaGVjayBjaGFubmVsIGF2YWlsYWJpbGl0eSwgYWZ0ZXIgc3dpdGNoIGNoYW5uZWwKKwlpZiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlICE9IFJEX1NJTEVOQ0VfTU9ERSkKKwkJCXJldHVybjsKKworCS8vIGNoYW5uZWwgYXZhaWxhYmlsaXR5IGNoZWNrIHRpbWUgaXMgNjBzZWMsIHVzZSA2NSBmb3IgYXNzdXJhbmNlCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJEQ291bnQrKyA+IHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNoTW92aW5nVGltZSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5vdCBmb3VuZCByYWRhciBzaWduYWwsIHN0YXJ0IHNlbmQgYmVhY29uIGFuZCByYWRhciBkZXRlY3Rpb24gaW4gc2VydmljZSBtb25pdG9yXG5cbiIpKTsKKwkJCUJicFJhZGFyRGV0ZWN0aW9uU3RvcChwQWQpOworCQlBc2ljRW5hYmxlQnNzU3luYyhwQWQpOworCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgPSBSRF9OT1JNQUxfTU9ERTsKKworCisJCXJldHVybjsKKwl9CisKKwlyZXR1cm47Cit9CisKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCQljaGFuZ2UgY2hhbm5lbCBtb3ZpbmcgdGltZSBmb3IgREZTIHRlc3RpbmcuCisKKwlBcmd1bWVudHM6CisJICAgIHBBZGFwdGVyICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJICAgIHdycSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpb2N0bCBhcmd1bWVudAorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOb25lCisKKyAgICBOb3RlOgorICAgICAgICBVc2FnZToKKyAgICAgICAgICAgICAgIDEuKSBpd3ByaXYgcmEwIHNldCBDaE1vdlRpbWU9W3ZhbHVlXQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9DaE1vdmluZ1RpbWVfUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgYXJnKQoreworCVVJTlQ4IFZhbHVlOworCisJVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ2hNb3ZpbmdUaW1lID0gVmFsdWU7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6ICVkXG4iLCBfX2Z1bmNfXywKKwkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ2hNb3ZpbmdUaW1lKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UIFNldF9Mb25nUHVsc2VSYWRhclRoX1Byb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIGFyZykKK3sKKwlVSU5UOCBWYWx1ZTsKKworCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA+IDEwID8gMTAgOiBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuTG9uZ1B1bHNlUmFkYXJUaCA9IFZhbHVlOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OiAlZFxuIiwgX19mdW5jX18sCisJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkxvbmdQdWxzZVJhZGFyVGgpKTsKKworCXJldHVybiBUUlVFOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2VlcHJvbS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vZWVwcm9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNmMTZlZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2VlcHJvbS5jCkBAIC0wLDAgKzEsMjU0IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCWVlcHJvbS5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisjaWYgMAorI2RlZmluZSBFRVBST01fU0laRQkJCQkJCQkJMHgyMDAKKyNkZWZpbmUgTlZSQU1fT0ZGU0VUCQkJMHgzMDAwMAorI2RlZmluZSBSRl9PRkZTRVQJCQkJMHg0MDAwMAorCitzdGF0aWMgVUNIQVIgaW5pdF9mbGFnID0gMDsKK3N0YXRpYyBQVUNIQVIgbnZfZWVfc3RhcnQgPSAwOworCitzdGF0aWMgVUNIQVIgRWVCdWZmZXJbRUVQUk9NX1NJWkVdOworI2VuZGlmCisvLyBJUlFMID0gUEFTU0lWRV9MRVZFTAorVk9JRCBSYWlzZUNsb2NrKAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorICAgIElOICBVSU5UMzIgKngpCit7CisgICAgKnggPSAqeCB8IEVFU0s7CisgICAgUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgKngpOworICAgIFJUTVB1c2VjRGVsYXkoMSk7CQkJCS8vIE1heCBmcmVxdWVuY3kgPSAxTUh6IGluIFNwZWMuIGRlZmluaXRpb24KK30KKworLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKK1ZPSUQgTG93ZXJDbG9jaygKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiAgVUlOVDMyICp4KQoreworICAgICp4ID0gKnggJiB+RUVTSzsKKyAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCAqeCk7CisgICAgUlRNUHVzZWNEZWxheSgxKTsKK30KKworLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKK1VTSE9SVCBTaGlmdEluQml0cygKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKyAgICBVSU5UMzIJCXgsaTsKKwlVU0hPUlQgICAgICBkYXRhPTA7CisKKyAgICBSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKworICAgIHggJj0gfiggRUVETyB8IEVFREkpOworCisgICAgZm9yKGk9MDsgaTwxNjsgaSsrKQorICAgIHsKKyAgICAgICAgZGF0YSA9IGRhdGEgPDwgMTsKKyAgICAgICAgUmFpc2VDbG9jayhwQWQsICZ4KTsKKworICAgICAgICBSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKworICAgICAgICB4ICY9IH4oRUVESSk7CisgICAgICAgIGlmKHggJiBFRURPKQorICAgICAgICAgICAgZGF0YSB8PSAxOworCisgICAgICAgIExvd2VyQ2xvY2socEFkLCAmeCk7CisgICAgfQorCisgICAgcmV0dXJuIGRhdGE7Cit9CisKKy8vIElSUUwgPSBQQVNTSVZFX0xFVkVMCitWT0lEIFNoaWZ0T3V0Qml0cygKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiAgVVNIT1JUIGRhdGEsCisgICAgSU4gIFVTSE9SVCBjb3VudCkKK3sKKyAgICBVSU5UMzIgICAgICAgeCxtYXNrOworCisgICAgbWFzayA9IDB4MDEgPDwgKGNvdW50IC0gMSk7CisgICAgUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7CisKKyAgICB4ICY9IH4oRUVETyB8IEVFREkpOworCisgICAgZG8KKyAgICB7CisgICAgICAgIHggJj0gfkVFREk7CisgICAgICAgIGlmKGRhdGEgJiBtYXNrKQkJeCB8PSBFRURJOworCisgICAgICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOworCisgICAgICAgIFJhaXNlQ2xvY2socEFkLCAmeCk7CisgICAgICAgIExvd2VyQ2xvY2socEFkLCAmeCk7CisKKyAgICAgICAgbWFzayA9IG1hc2sgPj4gMTsKKyAgICB9IHdoaWxlKG1hc2spOworCisgICAgeCAmPSB+RUVESTsKKyAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKK30KKworLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKK1ZPSUQgRUVwcm9tQ2xlYW51cCgKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKyAgICBVSU5UMzIgeDsKKworICAgIFJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOworCisgICAgeCAmPSB+KEVFQ1MgfCBFRURJKTsKKyAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKKworICAgIFJhaXNlQ2xvY2socEFkLCAmeCk7CisgICAgTG93ZXJDbG9jayhwQWQsICZ4KTsKK30KKworVk9JRCBFV0VOKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworICAgIFVJTlQzMgl4OworCisgICAgLy8gcmVzZXQgYml0cyBhbmQgc2V0IEVFQ1MKKyAgICBSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKyAgICB4ICY9IH4oRUVESSB8IEVFRE8gfCBFRVNLKTsKKyAgICB4IHw9IEVFQ1M7CisgICAgUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7CisKKwkvLyBraWNrIGEgcHVsc2UKKwlSYWlzZUNsb2NrKHBBZCwgJngpOworCUxvd2VyQ2xvY2socEFkLCAmeCk7CisKKyAgICAvLyBvdXRwdXQgdGhlIHJlYWRfb3Bjb2RlIGFuZCBzaXggcHVsc2UgaW4gdGhhdCBvcmRlcgorICAgIFNoaWZ0T3V0Qml0cyhwQWQsIEVFUFJPTV9FV0VOX09QQ09ERSwgNSk7CisgICAgU2hpZnRPdXRCaXRzKHBBZCwgMCwgNik7CisKKyAgICBFRXByb21DbGVhbnVwKHBBZCk7Cit9CisKK1ZPSUQgRVdEUygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKyAgICBVSU5UMzIJeDsKKworICAgIC8vIHJlc2V0IGJpdHMgYW5kIHNldCBFRUNTCisgICAgUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7CisgICAgeCAmPSB+KEVFREkgfCBFRURPIHwgRUVTSyk7CisgICAgeCB8PSBFRUNTOworICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOworCisJLy8ga2ljayBhIHB1bHNlCisJUmFpc2VDbG9jayhwQWQsICZ4KTsKKwlMb3dlckNsb2NrKHBBZCwgJngpOworCisgICAgLy8gb3V0cHV0IHRoZSByZWFkX29wY29kZSBhbmQgc2l4IHB1bHNlIGluIHRoYXQgb3JkZXIKKyAgICBTaGlmdE91dEJpdHMocEFkLCBFRVBST01fRVdEU19PUENPREUsIDUpOworICAgIFNoaWZ0T3V0Qml0cyhwQWQsIDAsIDYpOworCisgICAgRUVwcm9tQ2xlYW51cChwQWQpOworfQorCisvLyBJUlFMID0gUEFTU0lWRV9MRVZFTAorVVNIT1JUIFJUTVBfRUVQUk9NX1JFQUQxNigKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiAgVVNIT1JUIE9mZnNldCkKK3sKKyAgICBVSU5UMzIJCXg7CisgICAgVVNIT1JUCQlkYXRhOworCisgICAgT2Zmc2V0IC89IDI7CisgICAgLy8gcmVzZXQgYml0cyBhbmQgc2V0IEVFQ1MKKyAgICBSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKyAgICB4ICY9IH4oRUVESSB8IEVFRE8gfCBFRVNLKTsKKyAgICB4IHw9IEVFQ1M7CisgICAgUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7CisKKwkvLyBraWNrIGEgcHVsc2UKKwlSYWlzZUNsb2NrKHBBZCwgJngpOworCUxvd2VyQ2xvY2socEFkLCAmeCk7CisKKyAgICAvLyBvdXRwdXQgdGhlIHJlYWRfb3Bjb2RlIGFuZCByZWdpc3RlciBudW1iZXIgaW4gdGhhdCBvcmRlcgorICAgIFNoaWZ0T3V0Qml0cyhwQWQsIEVFUFJPTV9SRUFEX09QQ09ERSwgMyk7CisgICAgU2hpZnRPdXRCaXRzKHBBZCwgT2Zmc2V0LCBwQWQtPkVFUFJPTUFkZHJlc3NOdW0pOworCisgICAgLy8gTm93IHJlYWQgdGhlIGRhdGEgKDE2IGJpdHMpIGluIGZyb20gdGhlIHNlbGVjdGVkIEVFUFJPTSB3b3JkCisgICAgZGF0YSA9IFNoaWZ0SW5CaXRzKHBBZCk7CisKKyAgICBFRXByb21DbGVhbnVwKHBBZCk7CisKKyAgICByZXR1cm4gZGF0YTsKK30JLy9SZWFkRUVwcm9tCisKK1ZPSUQgUlRNUF9FRVBST01fV1JJVEUxNigKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiAgVVNIT1JUIE9mZnNldCwKKyAgICBJTiAgVVNIT1JUIERhdGEpCit7CisgICAgVUlOVDMyIHg7CisKKwlPZmZzZXQgLz0gMjsKKworCUVXRU4ocEFkKTsKKworICAgIC8vIHJlc2V0IGJpdHMgYW5kIHNldCBFRUNTCisgICAgUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7CisgICAgeCAmPSB+KEVFREkgfCBFRURPIHwgRUVTSyk7CisgICAgeCB8PSBFRUNTOworICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOworCisJLy8ga2ljayBhIHB1bHNlCisJUmFpc2VDbG9jayhwQWQsICZ4KTsKKwlMb3dlckNsb2NrKHBBZCwgJngpOworCisgICAgLy8gb3V0cHV0IHRoZSByZWFkX29wY29kZSAscmVnaXN0ZXIgbnVtYmVyIGFuZCBkYXRhIGluIHRoYXQgb3JkZXIKKyAgICBTaGlmdE91dEJpdHMocEFkLCBFRVBST01fV1JJVEVfT1BDT0RFLCAzKTsKKyAgICBTaGlmdE91dEJpdHMocEFkLCBPZmZzZXQsIHBBZC0+RUVQUk9NQWRkcmVzc051bSk7CisJU2hpZnRPdXRCaXRzKHBBZCwgRGF0YSwgMTYpOwkJLy8gMTYtYml0IGFjY2VzcworCisgICAgLy8gcmVhZCBETyBzdGF0dXMKKyAgICBSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKworCUVFcHJvbUNsZWFudXAocEFkKTsKKworCVJUTVB1c2VjRGVsYXkoMTAwMDApOwkvL2RlbGF5IGZvciB0d3AoTUFYKT0xMG1zCisKKwlFV0RTKHBBZCk7CisKKyAgICBFRXByb21DbGVhbnVwKHBBZCk7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2Zpcm13YXJlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9maXJtd2FyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MDY2OTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9maXJtd2FyZS5oCkBAIC0wLDAgKzEsNTU4IEBACisvKgorIENvcHlyaWdodCAoYykgMjAwNywgUmFsaW5rIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24KKyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24uICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIGJpbmFyeSBmb3JtLCB3aXRob3V0CisgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIG1ldDoKKworIAkqIFJlZGlzdHJpYnV0aW9ucyBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhlCisgCWZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAJcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIAkqIE5laXRoZXIgdGhlIG5hbWUgb2YgUmFsaW5rIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAJc3VwcGxpZXJzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcworIAlzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAJKiBObyByZXZlcnNlIGVuZ2luZWVyaW5nLCBkZWNvbXBpbGF0aW9uLCBvciBkaXNhc3NlbWJseSBvZiB0aGlzIHNvZnR3YXJlCisgCWlzIHBlcm1pdHRlZC4KKworIExpbWl0ZWQgcGF0ZW50IGxpY2Vuc2UuIFJhbGluayBUZWNobm9sb2d5IENvcnBvcmF0aW9uIGdyYW50cyBhIHdvcmxkLXdpZGUsCisgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlIGxpY2Vuc2UgdW5kZXIgcGF0ZW50cyBpdCBub3cgb3IgaGVyZWFmdGVyCisgb3ducyBvciBjb250cm9scyB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgaW1wb3J0LCBvZmZlciB0byBzZWxsIGFuZAorIHNlbGwgKCJVdGlsaXplIikgdGhpcyBzb2Z0d2FyZSwgYnV0IHNvbGVseSB0byB0aGUgZXh0ZW50IHRoYXQgYW55Cisgc3VjaCBwYXRlbnQgaXMgbmVjZXNzYXJ5IHRvIFV0aWxpemUgdGhlIHNvZnR3YXJlIGFsb25lLCBvciBpbgorIGNvbWJpbmF0aW9uIHdpdGggYW4gb3BlcmF0aW5nIHN5c3RlbSBsaWNlbnNlZCB1bmRlciBhbiBhcHByb3ZlZCBPcGVuCisgU291cmNlIGxpY2Vuc2UgYXMgbGlzdGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlIGF0CisgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzLiAgVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bworIGFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGlzIHNvZnR3YXJlLiAgTm8gaGFyZHdhcmUgcGVyCisgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLgorCisgRElTQ0xBSU1FUi4gIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORAorIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywKKyBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MKKyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyBEQU1BR0UuCisqLworLyogQVVUTyBHRU4gUExFQVNFIERPIE5PVCBNT0RJRlkgSVQgKi8KKy8qIEFVVE8gR0VOIFBMRUFTRSBETyBOT1QgTU9ESUZZIElUICovCisKKworVUNIQVIgRmlybXdhcmVJbWFnZSBbXSA9IHsKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDIsIDB4MTAsIDB4MjgsIDB4MDIsIDB4MTAsIDB4MzIsIDB4MDIsIDB4MTAsIDB4NzgsIDB4MDIsIDB4MTIsIDB4NzksIDB4MDIsCisweDEyLCAweDdhLCAweDAyLCAweDEyLCAweDk5LCAweDAyLCAweDEyLCAweDllLCAweDEyLCAweDEyLCAweDlhLCAweDIyLCAweDAyLCAweDE2LCAweDM2LCAweDAyLAorMHgxNywgMHgwYywgMHgwMiwgMHgxMywgMHg4OSwgMHgwMiwgMHgxMiwgMHg5ZiwgMHgzMCwgMHgwNSwgMHgwNiwgMHgyMCwgMHgwZCwgMHgwMywgMHgxMiwgMHgxNywKKzB4YWUsIDB4MjIsIDB4OTAsIDB4MDEsIDB4OGMsIDB4ZTAsIDB4MzAsIDB4ZTMsIDB4MWIsIDB4ZTUsIDB4NGMsIDB4MzAsIDB4ZTAsIDB4MDQsIDB4N2YsIDB4NDAsCisweDgwLCAweDAyLCAweDdmLCAweDAwLCAweDkwLCAweDEwLCAweDJmLCAweGVmLCAweGYwLCAweDkwLCAweDAxLCAweDhjLCAweDc0LCAweDA4LCAweGYwLCAweGU0LAorMHg5MCwgMHgwMSwgMHhhNywgMHhmMCwgMHg5MCwgMHgwMSwgMHg4YywgMHhlMCwgMHgzMCwgMHhlMCwgMHgxYywgMHg5MCwgMHgwMSwgMHg4MCwgMHhlMCwgMHhiNCwKKzB4MDIsIDB4MTUsIDB4YTMsIDB4ZTAsIDB4YjQsIDB4MDEsIDB4MTAsIDB4OTAsIDB4MDEsIDB4ODQsIDB4ZTAsIDB4YjQsIDB4ODEsIDB4MDksIDB4OTAsIDB4MDEsCisweDhjLCAweDc0LCAweDAxLCAweGYwLCAweDEyLCAweDBkLCAweGM4LCAweDIyLCAweDkwLCAweDA0LCAweDE0LCAweGUwLCAweDIwLCAweGU3LCAweDAzLCAweDAyLAorMHgxMiwgMHg2ZSwgMHg5MCwgMHg3MCwgMHgxMiwgMHhlMCwgMHhmNSwgMHg1NiwgMHg5MCwgMHgwNCwgMHgwNCwgMHhlMCwgMHgxMiwgMHgwYSwgMHg5ZCwgMHgxMCwKKzB4YjcsIDB4MzEsIDB4MTAsIDB4ZTIsIDB4NTAsIDB4MTEsIDB4MDgsIDB4NTEsIDB4MTEsIDB4MTMsIDB4NTIsIDB4MTEsIDB4MTMsIDB4NTMsIDB4MTEsIDB4MTMsCisweDU0LCAweDExLCAweDU0LCAweDU1LCAweDExLCAweDc5LCAweDcwLCAweDExLCAweGE0LCAweDcxLCAweDExLCAweGQyLCAweDcyLCAweDEyLCAweDI1LCAweDczLAorMHgxMiwgMHg0NiwgMHg4MCwgMHgwMCwgMHgwMCwgMHgxMiwgMHg2ZSwgMHgyMCwgMHgwMiwgMHgwMywgMHgzMCwgMHgwMywgMHgxZCwgMHg3ZCwgMHgwMiwgMHhhZiwKKzB4NTYsIDB4MTIsIDB4MGIsIDB4OTEsIDB4OTAsIDB4MDQsIDB4MTQsIDB4NzQsIDB4ODAsIDB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZjAsIDB4ZTUsCisweDU2LCAweGY0LCAweDcwLCAweDAzLCAweDAyLCAweDEyLCAweDZlLCAweDAyLCAweDEyLCAweDY3LCAweDg1LCAweDU2LCAweDQxLCAweGQyLCAweDAyLCAweDAyLAorMHgxMiwgMHg2ZSwgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHg1NCwgMHg3ZiwgMHg2NCwgMHgwMiwgMHg2MCwgMHgwMywgMHgwMiwgMHgxMiwgMHg2ZSwgMHg5MCwKKzB4NzAsIDB4MTEsIDB4ZTAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MDgsIDB4ZTAsIDB4NjQsIDB4MjAsIDB4NjAsIDB4MDMsIDB4MDIsIDB4MTIsIDB4NmUsIDB4NzUsCisweDRlLCAweDAzLCAweDc1LCAweDRmLCAweDIwLCAweDAyLCAweDEyLCAweDZlLCAweDkwLCAweDcwLCAweDExLCAweGUwLCAweDI0LCAweGZmLCAweDkyLCAweDQ3LAorMHgwMiwgMHgxMiwgMHg2ZSwgMHg5MCwgMHgwNCwgMHgwNCwgMHhlMCwgMHgyNSwgMHhlMCwgMHgyNCwgMHg1ZCwgMHhmNSwgMHg1NywgMHg5MCwgMHg3MCwgMHgxMCwKKzB4ZTAsIDB4ZmYsIDB4NzQsIDB4NDcsIDB4MjUsIDB4NTcsIDB4ZjgsIDB4YzYsIDB4ZWYsIDB4YzYsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsIDB4ZmYsIDB4NzQsCisweDQ4LCAweDI1LCAweDU3LCAweGY4LCAweGM2LCAweGVmLCAweGM2LCAweGU0LCAweGZkLCAweGFmLCAweDU2LCAweDEyLCAweDBiLCAweDkxLCAweDkwLCAweDA0LAorMHgxNCwgMHg3NCwgMHg4MCwgMHhmMCwgMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywgMHhmMCwgMHhlNSwgMHg1NiwgMHhmNCwgMHg3MCwgMHgwMywgMHgwMiwgMHgxMiwKKzB4NmUsIDB4MDIsIDB4MTIsIDB4NjcsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDcsIDB4NjAsIDB4MGIsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MDUsCisweGU1LCAweDQ3LCAweGI0LCAweDA5LCAweDA4LCAweDkwLCAweDcwLCAweDExLCAweGUwLCAweDU0LCAweDBmLCAweGY1LCAweDNhLCAweGU0LCAweGZkLCAweGFmLAorMHg1NiwgMHgxMiwgMHgwYiwgMHg5MSwgMHhkMiwgMHgwNCwgMHgwMiwgMHgxMiwgMHg2ZSwgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHhmZSwgMHg5MCwgMHg3MCwKKzB4MTEsIDB4ZTAsIDB4ZmQsIDB4ZWQsIDB4ZjgsIDB4ZTYsIDB4ZjUsIDB4NTcsIDB4ZmQsIDB4YWYsIDB4NTYsIDB4MTIsIDB4MGIsIDB4OTEsIDB4OTAsIDB4MDQsCisweDE0LCAweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLCAweGU1LCAweDU2LCAweGY0LCAweDcwLCAweDAzLCAweDAyLCAweDEyLAorMHg2ZSwgMHgwMiwgMHgxMiwgMHg2NywgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHhmZSwgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwgMHhmZCwgMHhlZCwgMHhmNSwKKzB4ODIsIDB4OGUsIDB4ODMsIDB4ZTAsIDB4ZjUsIDB4NTcsIDB4ZmQsIDB4YWYsIDB4NTYsIDB4MTIsIDB4MGIsIDB4OTEsIDB4OTAsIDB4MDQsIDB4MTQsIDB4NzQsCisweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLCAweGU1LCAweDU2LCAweGY0LCAweDcwLCAweDAzLCAweDAyLCAweDEyLCAweDZlLCAweDAyLAorMHgxMiwgMHg2NywgMHg5MCwgMHgxMCwgMHgwMiwgMHhlMCwgMHhiNCwgMHg3MCwgMHgxZSwgMHhhMywgMHhlMCwgMHhiNCwgMHgzMCwgMHgxOSwgMHg5MCwgMHgwNSwKKzB4MDgsIDB4ZTAsIDB4NDQsIDB4MDEsIDB4ZjAsIDB4ZmQsIDB4OTAsIDB4MDUsIDB4MDUsIDB4ZTAsIDB4NTQsIDB4ZmIsIDB4ZjAsIDB4NDQsIDB4MDQsIDB4ZjAsCisweGVkLCAweDU0LCAweGZlLCAweDkwLCAweDA1LCAweDA4LCAweGYwLCAweGU0LCAweGY1LCAweDRlLCAweGY1LCAweDRmLCAweDc1LCAweDNhLCAweGZmLCAweGFkLAorMHg1NywgMHhhZiwgMHg1NiwgMHgxMiwgMHgwYiwgMHg5MSwgMHg5MCwgMHgwNCwgMHgxNCwgMHg3NCwgMHg4MCwgMHhmMCwgMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywKKzB4ZjAsIDB4ZTUsIDB4NTYsIDB4ZjQsIDB4NjAsIDB4MDcsIDB4OTAsIDB4NzAsIDB4MjUsIDB4ZTAsIDB4NDQsIDB4MDEsIDB4ZjAsIDB4OTAsIDB4NzAsIDB4NDAsCisweGU1LCAweDNhLCAweGYwLCAweDgwLCAweDQ5LCAweDkwLCAweDcwLCAweDEwLCAweGUwLCAweDI0LCAweGZmLCAweDkyLCAweDkzLCAweGU0LCAweGZkLCAweGFmLAorMHg1NiwgMHgxMiwgMHgwYiwgMHg5MSwgMHg5MCwgMHgwNCwgMHgxNCwgMHg3NCwgMHg4MCwgMHhmMCwgMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywgMHhmMCwgMHhlNSwKKzB4NTYsIDB4ZjQsIDB4NjAsIDB4MmEsIDB4ODAsIDB4MjEsIDB4OTAsIDB4NzAsIDB4MTAsIDB4ZTAsIDB4MjQsIDB4ZmYsIDB4OTIsIDB4NGEsIDB4ZDIsIDB4MDUsCisweGFkLCAweDU3LCAweGFmLCAweDU2LCAweDEyLCAweDBiLCAweDkxLCAweDkwLCAweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLAorMHgxMywgMHhmMCwgMHhlNSwgMHg1NiwgMHhmNCwgMHg2MCwgMHgwNywgMHg5MCwgMHg3MCwgMHgyNSwgMHhlMCwgMHg0NCwgMHgwMSwgMHhmMCwgMHg5MCwgMHg3MCwKKzB4NDIsIDB4ZTUsIDB4M2EsIDB4ZjAsIDB4YTMsIDB4NzQsIDB4YWIsIDB4ZjAsIDB4MjIsIDB4MjIsIDB4ZTUsIDB4NTMsIDB4NzAsIDB4MWEsIDB4MzAsIDB4NjAsCisweDA5LCAweGIyLCAweDRkLCAweDMwLCAweDRkLCAweDA0LCAweDA1LCAweDQ2LCAweGMyLCAweDA0LCAweGU1LCAweDRmLCAweDQ1LCAweDRlLCAweDYwLCAweDA4LAorMHhlNSwgMHg0ZiwgMHgxNSwgMHg0ZiwgMHg3MCwgMHgwMiwgMHgxNSwgMHg0ZSwgMHgyMiwgMHgyMiwgMHhjMiwgMHg0MiwgMHhkMywgMHgyMiwgMHgyMiwgMHhjMiwKKzB4NGIsIDB4YzIsIDB4NGMsIDB4ZTUsIDB4NDQsIDB4MTIsIDB4MGEsIDB4OWQsIDB4MTIsIDB4YzEsIDB4MDAsIDB4MTMsIDB4NTQsIDB4MDQsIDB4MTMsIDB4NTAsCisweDA4LCAweDEzLCAweDJiLCAweDEwLCAweDEyLCAweGQ1LCAweDIwLCAweDEyLCAweGY1LCAweDYwLCAweDEzLCAweDA2LCAweGEwLCAweDAwLCAweDAwLCAweDEzLAorMHg1NiwgMHg4NSwgMHg0OCwgMHg0MywgMHg4NSwgMHg0YSwgMHg0MiwgMHg4NSwgMHg0YywgMHg1ZSwgMHhlNSwgMHg0NywgMHg2NCwgMHgwNiwgMHg2MCwgMHgwMywKKzB4MDIsIDB4MTMsIDB4NTYsIDB4ODAsIDB4MWIsIDB4ZTUsIDB4NDgsIDB4YzQsIDB4NTQsIDB4MGYsIDB4ZjUsIDB4NDMsIDB4ZTUsIDB4NGEsIDB4YzQsIDB4NTQsCisweDBmLCAweGY1LCAweDQyLCAweGU1LCAweDRjLCAweGM0LCAweDU0LCAweDBmLCAweGY1LCAweDVlLCAweGU1LCAweDQ3LCAweDY0LCAweDA2LCAweDcwLCAweDY2LAorMHg1MywgMHg0MywgMHgwZiwgMHg4MCwgMHg2MSwgMHg4NSwgMHg0OSwgMHg0MywgMHg4NSwgMHg0YiwgMHg0MiwgMHg4NSwgMHg0ZCwgMHg1ZSwgMHhlNSwgMHg0NywKKzB4NjQsIDB4MDYsIDB4NzAsIDB4NTIsIDB4ODAsIDB4MWIsIDB4ZTUsIDB4NDksIDB4YzQsIDB4NTQsIDB4MGYsIDB4ZjUsIDB4NDMsIDB4ZTUsIDB4NGIsIDB4YzQsCisweDU0LCAweDBmLCAweGY1LCAweDQyLCAweGU1LCAweDRkLCAweGM0LCAweDU0LCAweDBmLCAweGY1LCAweDVlLCAweGU1LCAweDQ3LCAweDY0LCAweDA2LCAweDcwLAorMHgzNSwgMHhlNSwgMHg0MywgMHg1NCwgMHgwZiwgMHg0NCwgMHgxMCwgMHhmNSwgMHg0MywgMHg4MCwgMHgyYiwgMHhlNSwgMHg0NywgMHhiNCwgMHgwNCwgMHgwNiwKKzB4NTMsIDB4NWUsIDB4ZmIsIDB4NzUsIDB4NDIsIDB4MDksIDB4ZTUsIDB4NDcsIDB4YjQsIDB4MDUsIDB4MDYsIDB4NDMsIDB4NWUsIDB4MDQsIDB4NzUsIDB4NDIsCisweDA5LCAweGU1LCAweDQ3LCAweGI0LCAweDA2LCAweDEwLCAweGU1LCAweDQzLCAweDU0LCAweDBmLCAweDQ0LCAweDMwLCAweGY1LCAweDQzLCAweDgwLCAweDA2LAorMHhkMiwgMHg0YiwgMHg4MCwgMHgwMiwgMHhkMiwgMHg0YywgMHhlNCwgMHhmNSwgMHgyNSwgMHhlNSwgMHg0MiwgMHhjNCwgMHg1NCwgMHhmMCwgMHhmZiwgMHhlNSwKKzB4NDMsIDB4NTQsIDB4MGYsIDB4NGYsIDB4ZjUsIDB4NWYsIDB4OTAsIDB4NzAsIDB4NDQsIDB4ZjAsIDB4YTMsIDB4ZTUsIDB4NWUsIDB4ZjAsIDB4YTMsIDB4ZTUsCisweDRhLCAweGYwLCAweGEzLCAweGU1LCAweDQ4LCAweGYwLCAweGEzLCAweGU1LCAweDRjLCAweGYwLCAweGEzLCAweGU1LCAweDQ0LCAweGYwLCAweGEzLCAweGU1LAorMHg0MiwgMHhmMCwgMHhhMywgMHhlNSwgMHg0MywgMHhmMCwgMHhkMiwgMHg2MCwgMHgyMiwgMHhlNSwgMHg0NywgMHg2MCwgMHgxMCwgMHgyNCwgMHhjMCwgMHg3MCwKKzB4MDMsIDB4MTIsIDB4MTYsIDB4MTYsIDB4MTIsIDB4MTMsIDB4OWUsIDB4YzIsIDB4YWYsIDB4YzIsIDB4MDQsIDB4ZDIsIDB4YWYsIDB4MjIsIDB4YzIsIDB4YWYsCisweDkwLCAweDA0LCAweDE0LCAweGUwLCAweDU0LCAweDBlLCAweDYwLCAweDA0LCAweGQyLCAweDE4LCAweDgwLCAweDA4LCAweGU1LCAweDRlLCAweDQ1LCAweDRmLAorMHgyNCwgMHhmZiwgMHg5MiwgMHgxOCwgMHhkMiwgMHhhZiwgMHg5MCwgMHgwNCwgMHgxNCwgMHhlMCwgMHhhMiwgMHhlNCwgMHg5MiwgMHgxOSwgMHg3NCwgMHgxZSwKKzB4ZjAsIDB4ZTUsIDB4NWYsIDB4NTQsIDB4MGYsIDB4ZjUsIDB4MmQsIDB4ZTUsIDB4MjUsIDB4NzAsIDB4MTMsIDB4MzAsIDB4MTgsIDB4MDUsIDB4ZTUsIDB4NWYsCisweDIwLCAweGU1LCAweDBiLCAweDMwLCAweDE5LCAweDE5LCAweGU1LCAweDVmLCAweDU0LCAweDMwLCAweGZmLCAweGJmLCAweDMwLCAweDExLCAweGU1LCAweDI1LAorMHg3MCwgMHgwNSwgMHg3NSwgMHgyNSwgMHgwYywgMHg4MCwgMHgwMiwgMHgxNSwgMHgyNSwgMHhkMiwgMHg2YywgMHhkMiwgMHg2ZCwgMHg4MCwgMHgwZiwgMHhlNSwKKzB4NWYsIDB4MzAsIDB4ZTYsIDB4MDYsIDB4YzIsIDB4NmMsIDB4ZDIsIDB4NmQsIDB4ODAsIDB4MDQsIDB4ZDIsIDB4NmMsIDB4YzIsIDB4NmQsIDB4ZTUsIDB4NDcsCisweDY0LCAweDAzLCAweDcwLCAweDIxLCAweDMwLCAweDRiLCAweDA2LCAweGMyLCAweDZjLCAweGQyLCAweDZkLCAweDgwLCAweDE4LCAweGU1LCAweDI1LCAweDcwLAorMHgwMywgMHgzMCwgMHg0YywgMHgxMSwgMHhjMiwgMHg0YywgMHhlNSwgMHgyNSwgMHg3MCwgMHgwNSwgMHg3NSwgMHgyNSwgMHgwNywgMHg4MCwgMHgwMiwgMHgxNSwKKzB4MjUsIDB4ZDIsIDB4NmMsIDB4ZDIsIDB4NmQsIDB4ZTUsIDB4NDcsIDB4YjQsIDB4MDksIDB4MTQsIDB4ZTUsIDB4NDQsIDB4MjAsIDB4ZTMsIDB4MGIsIDB4ZTUsCisweDNhLCAweDY0LCAweDAyLCAweDYwLCAweDA1LCAweGU1LCAweDNhLCAweGI0LCAweDAzLCAweDA0LCAweGMyLCAweDZjLCAweGQyLCAweDZkLCAweDkwLCAweDcwLAorMHg0NiwgMHhlNSwgMHgyZCwgMHhmMCwgMHgyMCwgMHg2OSwgMHgwNywgMHhlNSwgMHg1ZSwgMHgyMCwgMHhlMCwgMHgwMiwgMHhiMiwgMHg2OCwgMHgyMCwgMHg2YiwKKzB4MDcsIDB4ZTUsIDB4NWUsIDB4MjAsIDB4ZTEsIDB4MDIsIDB4YjIsIDB4NmEsIDB4MjAsIDB4NmQsIDB4MDcsIDB4ZTUsIDB4NWUsIDB4MjAsIDB4ZTIsIDB4MDIsCisweGIyLCAweDZjLCAweDkwLCAweDcwLCAweDQ3LCAweGU1LCAweDJkLCAweGYwLCAweDc1LCAweDJlLCAweDQwLCAweDIwLCAweDY5LCAweDA0LCAweGEyLCAweDY4LAorMHg4MCwgMHgyNiwgMHgzMCwgMHg2OCwgMHgwNiwgMHhlNSwgMHg0NiwgMHhhMiwgMHhlMiwgMHg4MCwgMHgxZCwgMHhlNSwgMHg1ZSwgMHgyMCwgMHhlMiwgMHgwNCwKKzB4N2YsIDB4MDEsIDB4ODAsIDB4MDIsIDB4N2YsIDB4MDAsIDB4ZTUsIDB4NDYsIDB4NTQsIDB4ZjAsIDB4ZmUsIDB4YmUsIDB4ZjAsIDB4MDQsIDB4N2UsIDB4MDEsCisweDgwLCAweDAyLCAweDdlLCAweDAwLCAweGVlLCAweDZmLCAweDI0LCAweGZmLCAweDkyLCAweDczLCAweDkyLCAweDcyLCAweDIwLCAweDZiLCAweDA0LCAweGEyLAorMHg2YSwgMHg4MCwgMHgyNiwgMHgzMCwgMHg2YSwgMHgwNiwgMHhlNSwgMHg0NiwgMHhhMiwgMHhlMiwgMHg4MCwgMHgxZCwgMHhlNSwgMHg1ZSwgMHgyMCwgMHhlMCwKKzB4MDQsIDB4N2YsIDB4MDEsIDB4ODAsIDB4MDIsIDB4N2YsIDB4MDAsIDB4ZTUsIDB4NDYsIDB4NTQsIDB4ZjAsIDB4ZmUsIDB4YmUsIDB4ZjAsIDB4MDQsIDB4N2UsCisweDAxLCAweDgwLCAweDAyLCAweDdlLCAweDAwLCAweGVlLCAweDZmLCAweDI0LCAweGZmLCAweDkyLCAweDc1LCAweDkyLCAweDc0LCAweDIwLCAweDZkLCAweDA0LAorMHhhMiwgMHg2YywgMHg4MCwgMHgyNiwgMHgzMCwgMHg2YywgMHgwNiwgMHhlNSwgMHg0NiwgMHhhMiwgMHhlMiwgMHg4MCwgMHgxZCwgMHhlNSwgMHg1ZSwgMHgyMCwKKzB4ZTEsIDB4MDQsIDB4N2YsIDB4MDEsIDB4ODAsIDB4MDIsIDB4N2YsIDB4MDAsIDB4ZTUsIDB4NDYsIDB4NTQsIDB4ZjAsIDB4ZmUsIDB4YmUsIDB4ZjAsIDB4MDQsCisweDdlLCAweDAxLCAweDgwLCAweDAyLCAweDdlLCAweDAwLCAweGVlLCAweDZmLCAweDI0LCAweGZmLCAweDkyLCAweDcxLCAweDkyLCAweDcwLCAweDkwLCAweDEwLAorMHgyZiwgMHhlNSwgMHgyZSwgMHhmMCwgMHhlNSwgMHg0NywgMHg2NCwgMHgwNiwgMHg3MCwgMHg0YywgMHg5MCwgMHgwMiwgMHgyOSwgMHhlMCwgMHg1NCwgMHhmZSwKKzB4ZjAsIDB4ZTUsIDB4NDMsIDB4YzQsIDB4NTQsIDB4MGYsIDB4MTQsIDB4NjAsIDB4MTQsIDB4MjQsIDB4ZmUsIDB4NjAsIDB4MjMsIDB4MjQsIDB4MDMsIDB4NjAsCisweDAzLCAweDAyLCAweDE2LCAweDA1LCAweDkwLCAweDAyLCAweDI4LCAweGUwLCAweDMwLCAweDQ3LCAweDBmLCAweDgwLCAweDA3LCAweDkwLCAweDAyLCAweDI4LAorMHhlMCwgMHgyMCwgMHg0NywgMHgwNiwgMHg1NCwgMHhmZSwgMHhmMCwgMHgwMiwgMHgxNiwgMHgwNSwgMHg0NCwgMHgwMSwgMHhmMCwgMHgwMiwgMHgxNiwgMHgwNSwKKzB4ZTUsIDB4NDYsIDB4MzAsIDB4ZTIsIDB4MDQsIDB4N2YsIDB4MDEsIDB4ODAsIDB4MDIsIDB4N2YsIDB4MDAsIDB4OTAsIDB4MDIsIDB4MjgsIDB4ZTAsIDB4NTQsCisweGZlLCAweDRmLCAweGYwLCAweDAyLCAweDE2LCAweDA1LCAweGU1LCAweDQ3LCAweDY0LCAweDA3LCAweDYwLCAweDBmLCAweGU1LCAweDQ3LCAweDY0LCAweDA4LAorMHg2MCwgMHgwOSwgMHhlNSwgMHg0NywgMHg2NCwgMHgwOSwgMHg2MCwgMHgwMywgMHgwMiwgMHgxNiwgMHgwNSwgMHhlNCwgMHhmNSwgMHgyNywgMHg5MCwgMHgwMiwKKzB4MjksIDB4ZTAsIDB4NTQsIDB4ZmMsIDB4ZjAsIDB4ZTUsIDB4M2EsIDB4MTQsIDB4NjAsIDB4MmQsIDB4MTQsIDB4NjAsIDB4MmUsIDB4MTQsIDB4NjAsIDB4MzYsCisweDI0LCAweGZjLCAweDYwLCAweDVmLCAweDI0LCAweGY5LCAweDYwLCAweDFmLCAweDI0LCAweDBlLCAweDcwLCAweDY5LCAweGU1LCAweDQ2LCAweDEzLCAweDEzLAorMHg1NCwgMHgzZiwgMHg3NSwgMHhmMCwgMHgwMSwgMHg4NCwgMHhhZiwgMHhmMCwgMHgyMCwgMHg0NywgMHgwNCwgMHg3ZSwgMHgwMSwgMHg4MCwgMHgwMiwgMHg3ZSwKKzB4MDAsIDB4ZWYsIDB4NmUsIDB4MjQsIDB4ZmYsIDB4ODAsIDB4NDUsIDB4YTIsIDB4NDcsIDB4ODAsIDB4NDEsIDB4ZTUsIDB4NDYsIDB4MzAsIDB4ZTIsIDB4MDMsCisweGQzLCAweDgwLCAweDI3LCAweGMzLCAweDgwLCAweDI0LCAweGU1LCAweDQ2LCAweDMwLCAweGUyLCAweDBkLCAweDU0LCAweDM4LCAweGMzLCAweDk0LCAweDMwLAorMHg1MCwgMHgwNiwgMHg3ZSwgMHgwMCwgMHg3ZiwgMHgwMSwgMHg4MCwgMHgwNCwgMHg3ZSwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgyMCwgMHg0NywgMHgwNCwgMHg3ZCwKKzB4MDEsIDB4ODAsIDB4MDIsIDB4N2QsIDB4MDAsIDB4ZWYsIDB4NmQsIDB4NGUsIDB4MjQsIDB4ZmYsIDB4OTIsIDB4MzgsIDB4YTIsIDB4NDcsIDB4YjMsIDB4OTIsCisweDM5LCAweDgwLCAweDE5LCAweGU1LCAweDQ2LCAweDMwLCAweGUyLCAweDAzLCAweGQzLCAweDgwLCAweDAxLCAweGMzLCAweDkyLCAweDM5LCAweGEyLCAweDQ3LAorMHhiMywgMHg5MiwgMHgzOCwgMHg4MCwgMHgwNywgMHhhMiwgMHg0NywgMHhiMywgMHg5MiwgMHgzOCwgMHg5MiwgMHgzOSwgMHg5MCwgMHgwMiwgMHgyOCwgMHhlMCwKKzB4NTQsIDB4ZmMsIDB4NDUsIDB4MjcsIDB4ZjAsIDB4OTAsIDB4NzAsIDB4OWMsIDB4ZTUsIDB4M2EsIDB4ZjAsIDB4YTMsIDB4ZTUsIDB4NDcsIDB4ZjAsIDB4OTAsCisweDcwLCAweDQxLCAweGU1LCAweDNhLCAweGYwLCAweDIyLCAweGU0LCAweDkwLCAweDAyLCAweDI5LCAweGYwLCAweDMwLCAweDQ3LCAweDA0LCAweGFmLCAweDQ1LAorMHg4MCwgMHgwNCwgMHhlNSwgMHg0NSwgMHhmNCwgMHhmZiwgMHg5MCwgMHgwMiwgMHgyOCwgMHhlZiwgMHhmMCwgMHgyMiwgMHg4ZiwgMHg1MCwgMHhkMiwgMHg1OSwKKzB4MjIsIDB4OGYsIDB4NTQsIDB4ZDIsIDB4NTgsIDB4MjIsIDB4ZTQsIDB4ZjUsIDB4NjIsIDB4YzIsIDB4YWYsIDB4ZTUsIDB4NTEsIDB4MTQsIDB4NjAsIDB4NDYsCisweDE0LCAweDYwLCAweDYyLCAweDI0LCAweDAyLCAweDYwLCAweDAzLCAweDAyLCAweDE2LCAweGYwLCAweGQyLCAweDU5LCAweDc1LCAweDU1LCAweDAxLCAweDkwLAorMHgwMiwgMHhhMiwgMHhlMCwgMHg1NCwgMHg3ZiwgMHhmMCwgMHhhMywgMHhlMCwgMHgyMCwgMHhlNywgMHgyMiwgMHg5MCwgMHgwNCwgMHgzNCwgMHhlMCwgMHhiNCwKKzB4MDIsIDB4MWIsIDB4YTMsIDB4ZTAsIDB4YjQsIDB4MDIsIDB4MTYsIDB4YTMsIDB4ZTAsIDB4YjQsIDB4MDIsIDB4MTEsIDB4N2YsIDB4MjAsIDB4MTIsIDB4MTYsCisweDJjLCAweDkwLCAweDEwLCAweDA0LCAweGUwLCAweDU0LCAweGYzLCAweGYwLCAweDc1LCAweDUxLCAweDAxLCAweDgwLCAweDczLCAweGU1LCAweDUwLCAweDcwLAorMHgwNSwgMHg3NSwgMHg2MiwgMHgwMywgMHg4MCwgMHg2YSwgMHg5MCwgMHgxMiwgMHgwMCwgMHhlMCwgMHg1NCwgMHgwMywgMHg3MCwgMHgxMSwgMHg3ZiwgMHgyMCwKKzB4MTIsIDB4MTYsIDB4MmMsIDB4OTAsIDB4MDIsIDB4YTIsIDB4ZTAsIDB4NTQsIDB4YmYsIDB4ZjAsIDB4NzUsIDB4NTEsIDB4MDIsIDB4ODAsIDB4NTEsIDB4ZTUsCisweDUwLCAweDcwLCAweDAyLCAweDgwLCAweDQ2LCAweDkwLCAweDAyLCAweGEzLCAweGUwLCAweDIwLCAweGU2LCAweDNiLCAweDkwLCAweDA0LCAweDM3LCAweGUwLAorMHg2NCwgMHgyMiwgMHg3MCwgMHgzMywgMHg5MCwgMHgwMSwgMHg4YSwgMHg3NCwgMHg3ZSwgMHhmMCwgMHg5MCwgMHgwMSwgMHg5NiwgMHhmMCwgMHg5MCwgMHgxMiwKKzB4MDQsIDB4NzQsIDB4MGEsIDB4ZjAsIDB4OTAsIDB4MTMsIDB4MjgsIDB4ZTAsIDB4NTQsIDB4ZjAsIDB4ZjAsIDB4YTMsIDB4ZTAsIDB4NTQsIDB4ZjAsIDB4ZjAsCisweGEzLCAweGUwLCAweDU0LCAweGZhLCAweGYwLCAweDkwLCAweDA0LCAweDAxLCAweGUwLCAweDU0LCAweGY5LCAweGYwLCAweDc1LCAweDYyLCAweDAxLCAweDc1LAorMHg1NSwgMHgwMiwgMHhlNCwgMHhmNSwgMHg1MSwgMHg4MCwgMHgwOSwgMHhlNSwgMHg1MCwgMHg3MCwgMHgwNSwgMHg3NSwgMHg2MiwgMHgwMywgMHhmNSwgMHg1MSwKKzB4ZTUsIDB4NjIsIDB4NjAsIDB4MTUsIDB4YzIsIDB4MDEsIDB4ZTQsIDB4ZjUsIDB4NTEsIDB4YzIsIDB4NTksIDB4YWQsIDB4NjIsIDB4YWYsIDB4NDAsIDB4MTIsCisweDE3LCAweDdhLCAweGU1LCAweDYyLCAweGI0LCAweDAzLCAweDAyLCAweGQyLCAweDAzLCAweGQyLCAweGFmLCAweDIyLCAweGMyLCAweGFmLCAweDMwLCAweDAxLAorMHgxMiwgMHhlNCwgMHg5MCwgMHgwMSwgMHg5NiwgMHhmMCwgMHhmNSwgMHg1MSwgMHhjMiwgMHg1OSwgMHhjMiwgMHgwMSwgMHg3ZCwgMHgwMiwgMHhhZiwgMHg0MCwKKzB4MTIsIDB4MTcsIDB4N2EsIDB4ZTUsIDB4NTIsIDB4MTQsIDB4NjAsIDB4MDksIDB4MDQsIDB4NzAsIDB4NGMsIDB4NzUsIDB4NTIsIDB4MDEsIDB4NzUsIDB4NTUsCisweDAzLCAweDkwLCAweDA0LCAweDAxLCAweGUwLCAweDQ0LCAweDBlLCAweGYwLCAweDkwLCAweDEzLCAweDI4LCAweGUwLCAweDQ0LCAweDBmLCAweGYwLCAweGEzLAorMHhlMCwgMHg0NCwgMHgwZiwgMHhmMCwgMHhhMywgMHhlMCwgMHg0NCwgMHgwNSwgMHhmMCwgMHg5MCwgMHgxMiwgMHgwNCwgMHg3NCwgMHgwMywgMHhmMCwgMHg5MCwKKzB4MDIsIDB4YTIsIDB4ZTAsIDB4NDQsIDB4YzAsIDB4ZjAsIDB4OTAsIDB4MTAsIDB4MDQsIDB4ZTAsIDB4NDQsIDB4MGMsIDB4ZjAsIDB4ZTQsIDB4ZjUsIDB4NTIsCisweGY1LCAweDU1LCAweDMwLCAweDAyLCAweDBiLCAweGMyLCAweDAyLCAweDdkLCAweDAxLCAweGFmLCAweDQxLCAweDEyLCAweDE3LCAweDdhLCAweDgwLCAweDAyLAorMHhjMiwgMHgwMywgMHhlNCwgMHg5MCwgMHgwMSwgMHg5NiwgMHhmMCwgMHhkMiwgMHhhZiwgMHgyMiwgMHhlZiwgMHhmNCwgMHg2MCwgMHgyZCwgMHhlNCwgMHhmZSwKKzB4NzQsIDB4MTQsIDB4MmUsIDB4ZjUsIDB4ODIsIDB4ZTQsIDB4MzQsIDB4NzAsIDB4ZjUsIDB4ODMsIDB4ZTAsIDB4YjQsIDB4ZmYsIDB4MTksIDB4NzQsIDB4MTQsCisweDJlLCAweGY1LCAweDgyLCAweGU0LCAweDM0LCAweDcwLCAweGY1LCAweDgzLCAweGVmLCAweGYwLCAweDc0LCAweDFjLCAweDJlLCAweGY1LCAweDgyLCAweGU0LAorMHgzNCwgMHg3MCwgMHhmNSwgMHg4MywgMHhlZCwgMHhmMCwgMHgyMiwgMHgwZSwgMHhiZSwgMHgwNCwgMHhkNSwgMHgyMiwgMHgyMiwgMHgyMiwgMHg5MCwgMHg3MCwKKzB4MmEsIDB4ZTAsIDB4MzAsIDB4ZTEsIDB4NGQsIDB4YzIsIDB4YWYsIDB4OTAsIDB4NzAsIDB4MjgsIDB4ZTAsIDB4OTAsIDB4MTAsIDB4MWMsIDB4ZjAsIDB4OTAsCisweDcwLCAweDI5LCAweGUwLCAweDkwLCAweDEwLCAweDFkLCAweGYwLCAweDkwLCAweDcwLCAweDJhLCAweGUwLCAweDkwLCAweDEwLCAweDFlLCAweGYwLCAweDkwLAorMHgxMCwgMHgxYywgMHhlMCwgMHhmNSwgMHg2MiwgMHg5MCwgMHgxMCwgMHgxZSwgMHhlMCwgMHgyMCwgMHhlMSwgMHhmMywgMHg5MCwgMHgxMCwgMHgxYywgMHhlMCwKKzB4OTAsIDB4NzAsIDB4MjgsIDB4ZjAsIDB4OTAsIDB4MTAsIDB4MWQsIDB4ZTAsIDB4OTAsIDB4NzAsIDB4MjksIDB4ZjAsIDB4OTAsIDB4MTAsIDB4MWUsIDB4ZTAsCisweDkwLCAweDcwLCAweDJhLCAweGYwLCAweDMwLCAweDRhLCAweDA3LCAweDkwLCAweDcwLCAweDI0LCAweGUwLCAweDQ0LCAweDAxLCAweGYwLCAweGMyLCAweDA1LAorMHhkMiwgMHhhZiwgMHgyMiwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGEsIDB4NjksIDB4NzcsCisweGZmLCAweGZmLCAweGZmLCAweDAyLCAweDEwLCAweDI4LCAweDAyLCAweDEwLCAweDMyLCAweDAyLCAweDEwLCAweDc4LCAweDAyLCAweDEyLCAweDI1LCAweDAyLAorMHgxMiwgMHgyNiwgMHgwMiwgMHgxMiwgMHgzOSwgMHgwMiwgMHgxMiwgMHgzZSwgMHgxMiwgMHgxMiwgMHgzYSwgMHgyMiwgMHgwMiwgMHgxNSwgMHg3MiwgMHgwMiwKKzB4MTYsIDB4NDgsIDB4MDIsIDB4MTMsIDB4MjksIDB4MDIsIDB4MTIsIDB4M2YsIDB4MzAsIDB4MDUsIDB4MDYsIDB4MjAsIDB4MGQsIDB4MDMsIDB4MTIsIDB4MTYsCisweGVhLCAweDIyLCAweDkwLCAweDAxLCAweDhjLCAweGUwLCAweDMwLCAweGUzLCAweDFiLCAweGU1LCAweDRjLCAweDMwLCAweGUwLCAweDA0LCAweDdmLCAweDQwLAorMHg4MCwgMHgwMiwgMHg3ZiwgMHgwMCwgMHg5MCwgMHgxMCwgMHgyZiwgMHhlZiwgMHhmMCwgMHg5MCwgMHgwMSwgMHg4YywgMHg3NCwgMHgwOCwgMHhmMCwgMHhlNCwKKzB4OTAsIDB4MDEsIDB4YTcsIDB4ZjAsIDB4OTAsIDB4MDEsIDB4OGMsIDB4ZTAsIDB4MzAsIDB4ZTAsIDB4MWMsIDB4OTAsIDB4MDEsIDB4ODAsIDB4ZTAsIDB4YjQsCisweDAyLCAweDE1LCAweGEzLCAweGUwLCAweGI0LCAweDAxLCAweDEwLCAweDkwLCAweDAxLCAweDg0LCAweGUwLCAweGI0LCAweDgxLCAweDA5LCAweDkwLCAweDAxLAorMHg4YywgMHg3NCwgMHgwMSwgMHhmMCwgMHgxMiwgMHgwZCwgMHhkZCwgMHgyMiwgMHg5MCwgMHgwNCwgMHgxNCwgMHhlMCwgMHgyMCwgMHhlNywgMHgwMywgMHgwMiwKKzB4MTIsIDB4MWEsIDB4OTAsIDB4NzAsIDB4MTIsIDB4ZTAsIDB4ZjUsIDB4NTYsIDB4OTAsIDB4MDQsIDB4MDQsIDB4ZTAsIDB4MTIsIDB4MGEsIDB4YjYsIDB4MTAsCisweGI0LCAweDMxLCAweDEwLCAweGRmLCAweDUwLCAweDExLCAweDA1LCAweDUxLCAweDExLCAweDEwLCAweDUyLCAweDExLCAweDEwLCAweDUzLCAweDExLCAweDEwLAorMHg1NCwgMHgxMSwgMHg1MSwgMHg1NSwgMHgxMSwgMHg3MCwgMHg3MCwgMHgxMSwgMHg5YSwgMHg3MSwgMHgxMSwgMHhjNCwgMHg3MiwgMHgxMSwgMHhmMiwgMHg4MCwKKzB4MDAsIDB4MDAsIDB4MTIsIDB4MWEsIDB4MjAsIDB4MDIsIDB4MDMsIDB4MzAsIDB4MDMsIDB4MWQsIDB4N2QsIDB4MDIsIDB4YWYsIDB4NTYsIDB4MTIsIDB4MGIsCisweGFhLCAweDkwLCAweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLCAweGU1LCAweDU2LCAweGY0LCAweDcwLAorMHgwMywgMHgwMiwgMHgxMiwgMHgxYSwgMHgwMiwgMHgxMiwgMHgxMywgMHg4NSwgMHg1NiwgMHg0MSwgMHhkMiwgMHgwMiwgMHgwMiwgMHgxMiwgMHgxYSwgMHg5MCwKKzB4NzAsIDB4MTAsIDB4ZTAsIDB4NTQsIDB4N2YsIDB4NjQsIDB4MDIsIDB4NjAsIDB4MDMsIDB4MDIsIDB4MTIsIDB4MWEsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsCisweDY0LCAweDA4LCAweDYwLCAweDA4LCAweGUwLCAweDY0LCAweDIwLCAweDYwLCAweDAzLCAweDAyLCAweDEyLCAweDFhLCAweDc1LCAweDRlLCAweDAzLCAweDc1LAorMHg0ZiwgMHgyMCwgMHgwMiwgMHgxMiwgMHgxYSwgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwgMHgyNCwgMHhmZiwgMHg5MiwgMHg0NywgMHgwMiwgMHgxMiwgMHgxYSwKKzB4OTAsIDB4MDQsIDB4MDQsIDB4ZTAsIDB4MjUsIDB4ZTAsIDB4MjQsIDB4NWQsIDB4ZjUsIDB4NTcsIDB4OTAsIDB4NzAsIDB4MTAsIDB4ZTAsIDB4ZmYsIDB4NzQsCisweDQ3LCAweDI1LCAweDU3LCAweGY4LCAweGM2LCAweGVmLCAweGM2LCAweDkwLCAweDcwLCAweDExLCAweGUwLCAweGZmLCAweDc0LCAweDQ4LCAweDI1LCAweDU3LAorMHhmOCwgMHhjNiwgMHhlZiwgMHhjNiwgMHhlNCwgMHhmZCwgMHhhZiwgMHg1NiwgMHgxMiwgMHgwYiwgMHhhYSwgMHg5MCwgMHgwNCwgMHgxNCwgMHg3NCwgMHg4MCwKKzB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZjAsIDB4ZTUsIDB4NTYsIDB4ZjQsIDB4NzAsIDB4MDMsIDB4MDIsIDB4MTIsIDB4MWEsIDB4MDIsIDB4MTIsCisweDEzLCAweGU1LCAweDQ3LCAweDY0LCAweDA3LCAweDYwLCAweDA1LCAweGU1LCAweDQ3LCAweGI0LCAweDA4LCAweDA4LCAweDkwLCAweDcwLCAweDExLCAweGUwLAorMHg1NCwgMHgwNywgMHhmNSwgMHgzYSwgMHhlNCwgMHhmZCwgMHhhZiwgMHg1NiwgMHgxMiwgMHgwYiwgMHhhYSwgMHhkMiwgMHgwNCwgMHgwMiwgMHgxMiwgMHgxYSwKKzB4OTAsIDB4NzAsIDB4MTAsIDB4ZTAsIDB4ZmUsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsIDB4ZmQsIDB4ZWQsIDB4ZjgsIDB4ZTYsIDB4ZjUsIDB4NTcsIDB4ZmQsCisweGFmLCAweDU2LCAweDEyLCAweDBiLCAweGFhLCAweDkwLCAweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLAorMHhlNSwgMHg1NiwgMHhmNCwgMHg3MCwgMHgwMywgMHgwMiwgMHgxMiwgMHgxYSwgMHg4MCwgMHg3OSwgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHhmZSwgMHg5MCwKKzB4NzAsIDB4MTEsIDB4ZTAsIDB4ZmQsIDB4ZWQsIDB4ZjUsIDB4ODIsIDB4OGUsIDB4ODMsIDB4ZTAsIDB4ZjUsIDB4NTcsIDB4ZmQsIDB4YWYsIDB4NTYsIDB4MTIsCisweDBiLCAweGFhLCAweDkwLCAweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLCAweGU1LCAweDU2LCAweGY0LAorMHg2MCwgMHg1OCwgMHg4MCwgMHg0ZiwgMHhlNCwgMHhmNSwgMHg0ZSwgMHhmNSwgMHg0ZiwgMHg3NSwgMHgzYSwgMHhmZiwgMHhhZCwgMHg1NywgMHhhZiwgMHg1NiwKKzB4MTIsIDB4MGIsIDB4YWEsIDB4OTAsIDB4MDQsIDB4MTQsIDB4NzQsIDB4ODAsIDB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZjAsIDB4ZTUsIDB4NTYsCisweGY0LCAweDYwLCAweDA3LCAweDkwLCAweDcwLCAweDI1LCAweGUwLCAweDQ0LCAweDAxLCAweGYwLCAweDkwLCAweDcwLCAweDQwLCAweGU1LCAweDNhLCAweGYwLAorMHg4MCwgMHgyOCwgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHgyNCwgMHhmZiwgMHg5MiwgMHg0YSwgMHhkMiwgMHgwNSwgMHhhZCwgMHg1NywgMHhhZiwgMHg1NiwKKzB4MTIsIDB4MGIsIDB4YWEsIDB4OTAsIDB4MDQsIDB4MTQsIDB4NzQsIDB4ODAsIDB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZjAsIDB4ZTUsIDB4NTYsCisweGY0LCAweDYwLCAweDA3LCAweDkwLCAweDcwLCAweDI1LCAweGUwLCAweDQ0LCAweDAxLCAweGYwLCAweDkwLCAweDcwLCAweDQyLCAweGU1LCAweDNhLCAweGYwLAorMHhhMywgMHg3NCwgMHhhYiwgMHhmMCwgMHgyMiwgMHgyMiwgMHhlNSwgMHg1MywgMHg3MCwgMHgwZSwgMHhlNSwgMHg0ZiwgMHg0NSwgMHg0ZSwgMHg2MCwgMHgwOCwKKzB4ZTUsIDB4NGYsIDB4MTUsIDB4NGYsIDB4NzAsIDB4MDIsIDB4MTUsIDB4NGUsIDB4MjIsIDB4MjIsIDB4YzIsIDB4NDIsIDB4ZDMsIDB4MjIsIDB4MjIsIDB4YzIsCisweDRiLCAweGMyLCAweDRjLCAweGU1LCAweDQ0LCAweDEyLCAweDBhLCAweGI2LCAweDEyLCAweDYxLCAweDAwLCAweDEyLCAweGY0LCAweDA0LCAweDEyLCAweGYwLAorMHgwOCwgMHgxMiwgMHhjYiwgMHgxMCwgMHgxMiwgMHg3NSwgMHgyMCwgMHgxMiwgMHg5NSwgMHg2MCwgMHgxMiwgMHhhNiwgMHhhMCwgMHgwMCwgMHgwMCwgMHgxMiwKKzB4ZjYsIDB4ODUsIDB4NDgsIDB4NDMsIDB4ODUsIDB4NGEsIDB4NDIsIDB4ODUsIDB4NGMsIDB4NWUsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDYsIDB4NjAsIDB4MDMsCisweDAyLCAweDEyLCAweGY2LCAweDgwLCAweDFiLCAweGU1LCAweDQ4LCAweGM0LCAweDU0LCAweDBmLCAweGY1LCAweDQzLCAweGU1LCAweDRhLCAweGM0LCAweDU0LAorMHgwZiwgMHhmNSwgMHg0MiwgMHhlNSwgMHg0YywgMHhjNCwgMHg1NCwgMHgwZiwgMHhmNSwgMHg1ZSwgMHhlNSwgMHg0NywgMHg2NCwgMHgwNiwgMHg3MCwgMHg2NiwKKzB4NTMsIDB4NDMsIDB4MGYsIDB4ODAsIDB4NjEsIDB4ODUsIDB4NDksIDB4NDMsIDB4ODUsIDB4NGIsIDB4NDIsIDB4ODUsIDB4NGQsIDB4NWUsIDB4ZTUsIDB4NDcsCisweDY0LCAweDA2LCAweDcwLCAweDUyLCAweDgwLCAweDFiLCAweGU1LCAweDQ5LCAweGM0LCAweDU0LCAweDBmLCAweGY1LCAweDQzLCAweGU1LCAweDRiLCAweGM0LAorMHg1NCwgMHgwZiwgMHhmNSwgMHg0MiwgMHhlNSwgMHg0ZCwgMHhjNCwgMHg1NCwgMHgwZiwgMHhmNSwgMHg1ZSwgMHhlNSwgMHg0NywgMHg2NCwgMHgwNiwgMHg3MCwKKzB4MzUsIDB4ZTUsIDB4NDMsIDB4NTQsIDB4MGYsIDB4NDQsIDB4MTAsIDB4ZjUsIDB4NDMsIDB4ODAsIDB4MmIsIDB4ZTUsIDB4NDcsIDB4YjQsIDB4MDQsIDB4MDYsCisweDUzLCAweDVlLCAweGZiLCAweDc1LCAweDQyLCAweDA5LCAweGU1LCAweDQ3LCAweGI0LCAweDA1LCAweDA2LCAweDQzLCAweDVlLCAweDA0LCAweDc1LCAweDQyLAorMHgwOSwgMHhlNSwgMHg0NywgMHhiNCwgMHgwNiwgMHgxMCwgMHhlNSwgMHg0MywgMHg1NCwgMHgwZiwgMHg0NCwgMHgzMCwgMHhmNSwgMHg0MywgMHg4MCwgMHgwNiwKKzB4ZDIsIDB4NGIsIDB4ODAsIDB4MDIsIDB4ZDIsIDB4NGMsIDB4ZTQsIDB4ZjUsIDB4MjUsIDB4ZTUsIDB4NDIsIDB4YzQsIDB4NTQsIDB4ZjAsIDB4ZmYsIDB4ZTUsCisweDQzLCAweDU0LCAweDBmLCAweDRmLCAweGY1LCAweDVmLCAweDkwLCAweDcwLCAweDQ0LCAweGYwLCAweGEzLCAweGU1LCAweDVlLCAweGYwLCAweGEzLCAweGU1LAorMHg0YSwgMHhmMCwgMHhhMywgMHhlNSwgMHg0OCwgMHhmMCwgMHhhMywgMHhlNSwgMHg0YywgMHhmMCwgMHhhMywgMHhlNSwgMHg0NCwgMHhmMCwgMHhhMywgMHhlNSwKKzB4NDIsIDB4ZjAsIDB4YTMsIDB4ZTUsIDB4NDMsIDB4ZjAsIDB4ZDIsIDB4NjAsIDB4MjIsIDB4ZTUsIDB4NDcsIDB4NjAsIDB4MTAsIDB4MjQsIDB4YzAsIDB4NzAsCisweDAzLCAweDEyLCAweDE1LCAweDUyLCAweDEyLCAweDEzLCAweDNlLCAweGMyLCAweGFmLCAweGMyLCAweDA0LCAweGQyLCAweGFmLCAweDIyLCAweGMyLCAweGFmLAorMHg5MCwgMHgwNCwgMHgxNCwgMHhlMCwgMHg1NCwgMHgwZSwgMHg2MCwgMHgwNCwgMHhkMiwgMHgxOCwgMHg4MCwgMHgwOCwgMHhlNSwgMHg0ZSwgMHg0NSwgMHg0ZiwKKzB4MjQsIDB4ZmYsIDB4OTIsIDB4MTgsIDB4ZDIsIDB4YWYsIDB4OTAsIDB4MDQsIDB4MTQsIDB4ZTAsIDB4YTIsIDB4ZTQsIDB4OTIsIDB4MTksIDB4NzQsIDB4MWUsCisweGYwLCAweGU1LCAweDVmLCAweDU0LCAweDBmLCAweGY1LCAweDJkLCAweGU1LCAweDI1LCAweDcwLCAweDEzLCAweDMwLCAweDE4LCAweDA1LCAweGU1LCAweDVmLAorMHgyMCwgMHhlNSwgMHgwYiwgMHgzMCwgMHgxOSwgMHgxOSwgMHhlNSwgMHg1ZiwgMHg1NCwgMHgzMCwgMHhmZiwgMHhiZiwgMHgzMCwgMHgxMSwgMHhlNSwgMHgyNSwKKzB4NzAsIDB4MDUsIDB4NzUsIDB4MjUsIDB4MGMsIDB4ODAsIDB4MDIsIDB4MTUsIDB4MjUsIDB4ZDIsIDB4NmMsIDB4ZDIsIDB4NmQsIDB4ODAsIDB4MGYsIDB4ZTUsCisweDVmLCAweDMwLCAweGU2LCAweDA2LCAweGMyLCAweDZjLCAweGQyLCAweDZkLCAweDgwLCAweDA0LCAweGQyLCAweDZjLCAweGMyLCAweDZkLCAweGU1LCAweDQ3LAorMHg2NCwgMHgwMywgMHg3MCwgMHgyMSwgMHgzMCwgMHg0YiwgMHgwNiwgMHhjMiwgMHg2YywgMHhkMiwgMHg2ZCwgMHg4MCwgMHgxOCwgMHhlNSwgMHgyNSwgMHg3MCwKKzB4MDMsIDB4MzAsIDB4NGMsIDB4MTEsIDB4YzIsIDB4NGMsIDB4ZTUsIDB4MjUsIDB4NzAsIDB4MDUsIDB4NzUsIDB4MjUsIDB4MDcsIDB4ODAsIDB4MDIsIDB4MTUsCisweDI1LCAweGQyLCAweDZjLCAweGQyLCAweDZkLCAweDkwLCAweDcwLCAweDQ2LCAweGU1LCAweDJkLCAweGYwLCAweDIwLCAweDY5LCAweDA3LCAweGU1LCAweDVlLAorMHgyMCwgMHhlMCwgMHgwMiwgMHhiMiwgMHg2OCwgMHgyMCwgMHg2YiwgMHgwNywgMHhlNSwgMHg1ZSwgMHgyMCwgMHhlMSwgMHgwMiwgMHhiMiwgMHg2YSwgMHgyMCwKKzB4NmQsIDB4MDcsIDB4ZTUsIDB4NWUsIDB4MjAsIDB4ZTIsIDB4MDIsIDB4YjIsIDB4NmMsIDB4OTAsIDB4NzAsIDB4NDcsIDB4ZTUsIDB4MmQsIDB4ZjAsIDB4NzUsCisweDJlLCAweDQwLCAweDIwLCAweDY5LCAweDA0LCAweGEyLCAweDY4LCAweDgwLCAweDE1LCAweDMwLCAweDY4LCAweDA2LCAweGU1LCAweDQ2LCAweGEyLCAweGUzLAorMHg4MCwgMHgwYywgMHhlNSwgMHg0NiwgMHg1NCwgMHhmMCwgMHhmZiwgMHhiZiwgMHhmMCwgMHgwMywgMHhkMywgMHg4MCwgMHgwMSwgMHhjMywgMHg5MiwgMHg3MywKKzB4OTIsIDB4NzIsIDB4MjAsIDB4NmIsIDB4MDQsIDB4YTIsIDB4NmEsIDB4ODAsIDB4MTUsIDB4MzAsIDB4NmEsIDB4MDYsIDB4ZTUsIDB4NDYsIDB4YTIsIDB4ZTMsCisweDgwLCAweDBjLCAweGU1LCAweDQ2LCAweDU0LCAweGYwLCAweGZmLCAweGJmLCAweGYwLCAweDAzLCAweGQzLCAweDgwLCAweDAxLCAweGMzLCAweDkyLCAweDc1LAorMHg5MiwgMHg3NCwgMHgyMCwgMHg2ZCwgMHgwNCwgMHhhMiwgMHg2YywgMHg4MCwgMHgxNSwgMHgzMCwgMHg2YywgMHgwNiwgMHhlNSwgMHg0NiwgMHhhMiwgMHhlMywKKzB4ODAsIDB4MGMsIDB4ZTUsIDB4NDYsIDB4NTQsIDB4ZjAsIDB4ZmYsIDB4YmYsIDB4ZjAsIDB4MDMsIDB4ZDMsIDB4ODAsIDB4MDEsIDB4YzMsIDB4OTIsIDB4NzEsCisweDkyLCAweDcwLCAweDkwLCAweDEwLCAweDJmLCAweGU1LCAweDJlLCAweGYwLCAweGU1LCAweDQ3LCAweDY0LCAweDA2LCAweDcwLCAweDRjLCAweDkwLCAweDAyLAorMHgyOSwgMHhlMCwgMHg1NCwgMHhmZSwgMHhmMCwgMHhlNSwgMHg0MywgMHhjNCwgMHg1NCwgMHgwZiwgMHgxNCwgMHg2MCwgMHgxNCwgMHgyNCwgMHhmZSwgMHg2MCwKKzB4MjMsIDB4MjQsIDB4MDMsIDB4NjAsIDB4MDMsIDB4MDIsIDB4MTUsIDB4NDEsIDB4OTAsIDB4MDIsIDB4MjgsIDB4ZTAsIDB4MzAsIDB4NDcsIDB4MGYsIDB4ODAsCisweDA3LCAweDkwLCAweDAyLCAweDI4LCAweGUwLCAweDIwLCAweDQ3LCAweDA2LCAweDU0LCAweGZlLCAweGYwLCAweDAyLCAweDE1LCAweDQxLCAweDQ0LCAweDAxLAorMHhmMCwgMHgwMiwgMHgxNSwgMHg0MSwgMHhlNSwgMHg0NiwgMHgzMCwgMHhlMywgMHgwNCwgMHg3ZiwgMHgwMSwgMHg4MCwgMHgwMiwgMHg3ZiwgMHgwMCwgMHg5MCwKKzB4MDIsIDB4MjgsIDB4ZTAsIDB4NTQsIDB4ZmUsIDB4NGYsIDB4ZjAsIDB4MDIsIDB4MTUsIDB4NDEsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDcsIDB4NjAsIDB4MDksCisweGU1LCAweDQ3LCAweDY0LCAweDA4LCAweDYwLCAweDAzLCAweDAyLCAweDE1LCAweDQxLCAweGU0LCAweGY1LCAweDI3LCAweDkwLCAweDAyLCAweDI5LCAweGUwLAorMHg1NCwgMHhmYywgMHhmMCwgMHhlNSwgMHgzYSwgMHgxNCwgMHg2MCwgMHgyNiwgMHgxNCwgMHg2MCwgMHgyZSwgMHgxNCwgMHg2MCwgMHgzNiwgMHgyNCwgMHgwMywKKzB4NzAsIDB4NWYsIDB4ZTUsIDB4NDYsIDB4MTMsIDB4MTMsIDB4MTMsIDB4NTQsIDB4MWYsIDB4NzUsIDB4ZjAsIDB4MDMsIDB4ODQsIDB4YWYsIDB4ZjAsIDB4MjAsCisweDQ3LCAweDA0LCAweDdlLCAweDAxLCAweDgwLCAweDAyLCAweDdlLCAweDAwLCAweGVmLCAweDZlLCAweDI0LCAweGZmLCAweDgwLCAweDAyLCAweGEyLCAweDQ3LAorMHg5MiwgMHgzOSwgMHhhMiwgMHg0NywgMHhiMywgMHg5MiwgMHgzOCwgMHg4MCwgMHgzZiwgMHhlNSwgMHg0NiwgMHgzMCwgMHhlMywgMHgwMywgMHhkMywgMHg4MCwKKzB4MjcsIDB4YzMsIDB4ODAsIDB4MjQsIDB4ZTUsIDB4NDYsIDB4MzAsIDB4ZTMsIDB4MGQsIDB4NTQsIDB4NzAsIDB4YzMsIDB4OTQsIDB4NjAsIDB4NTAsIDB4MDYsCisweDdlLCAweDAwLCAweDdmLCAweDAxLCAweDgwLCAweDA0LCAweDdlLCAweDAwLCAweDdmLCAweDAwLCAweDIwLCAweDQ3LCAweDA0LCAweDdkLCAweDAxLCAweDgwLAorMHgwMiwgMHg3ZCwgMHgwMCwgMHhlZiwgMHg2ZCwgMHg0ZSwgMHgyNCwgMHhmZiwgMHg5MiwgMHgzOCwgMHhhMiwgMHg0NywgMHhiMywgMHg5MiwgMHgzOSwgMHg4MCwKKzB4MDcsIDB4YTIsIDB4NDcsIDB4YjMsIDB4OTIsIDB4MzgsIDB4OTIsIDB4MzksIDB4OTAsIDB4MDIsIDB4MjgsIDB4ZTAsIDB4NTQsIDB4ZmMsIDB4NDUsIDB4MjcsCisweGYwLCAweDkwLCAweDcwLCAweDljLCAweGU1LCAweDNhLCAweGYwLCAweGEzLCAweGU1LCAweDQ3LCAweGYwLCAweDkwLCAweDcwLCAweDQxLCAweGU1LCAweDNhLAorMHhmMCwgMHgyMiwgMHhlNCwgMHg5MCwgMHgwMiwgMHgyOSwgMHhmMCwgMHgzMCwgMHg0NywgMHgwNCwgMHhhZiwgMHg0NSwgMHg4MCwgMHgwNCwgMHhlNSwgMHg0NSwKKzB4ZjQsIDB4ZmYsIDB4OTAsIDB4MDIsIDB4MjgsIDB4ZWYsIDB4ZjAsIDB4MjIsIDB4OGYsIDB4NTAsIDB4ZDIsIDB4NTksIDB4MjIsIDB4OGYsIDB4NTQsIDB4ZDIsCisweDU4LCAweDIyLCAweGU0LCAweGY1LCAweDYyLCAweGMyLCAweGFmLCAweGU1LCAweDUxLCAweDE0LCAweDYwLCAweDQ2LCAweDE0LCAweDYwLCAweDYyLCAweDI0LAorMHgwMiwgMHg2MCwgMHgwMywgMHgwMiwgMHgxNiwgMHgyYywgMHhkMiwgMHg1OSwgMHg3NSwgMHg1NSwgMHgwMSwgMHg5MCwgMHgwMiwgMHhhMiwgMHhlMCwgMHg1NCwKKzB4N2YsIDB4ZjAsIDB4YTMsIDB4ZTAsIDB4MjAsIDB4ZTcsIDB4MjIsIDB4OTAsIDB4MDQsIDB4MzQsIDB4ZTAsIDB4YjQsIDB4MDIsIDB4MWIsIDB4YTMsIDB4ZTAsCisweGI0LCAweDAyLCAweDE2LCAweGEzLCAweGUwLCAweGI0LCAweDAyLCAweDExLCAweDdmLCAweDIwLCAweDEyLCAweDE1LCAweDY4LCAweDkwLCAweDEwLCAweDA0LAorMHhlMCwgMHg1NCwgMHhmMywgMHhmMCwgMHg3NSwgMHg1MSwgMHgwMSwgMHg4MCwgMHg3MywgMHhlNSwgMHg1MCwgMHg3MCwgMHgwNSwgMHg3NSwgMHg2MiwgMHgwMywKKzB4ODAsIDB4NmEsIDB4OTAsIDB4MTIsIDB4MDAsIDB4ZTAsIDB4NTQsIDB4MDMsIDB4NzAsIDB4MTEsIDB4N2YsIDB4MjAsIDB4MTIsIDB4MTUsIDB4NjgsIDB4OTAsCisweDAyLCAweGEyLCAweGUwLCAweDU0LCAweGJmLCAweGYwLCAweDc1LCAweDUxLCAweDAyLCAweDgwLCAweDUxLCAweGU1LCAweDUwLCAweDcwLCAweDAyLCAweDgwLAorMHg0NiwgMHg5MCwgMHgwMiwgMHhhMywgMHhlMCwgMHgyMCwgMHhlNiwgMHgzYiwgMHg5MCwgMHgwNCwgMHgzNywgMHhlMCwgMHg2NCwgMHgyMiwgMHg3MCwgMHgzMywKKzB4OTAsIDB4MDEsIDB4OGEsIDB4NzQsIDB4N2UsIDB4ZjAsIDB4OTAsIDB4MDEsIDB4OTYsIDB4ZjAsIDB4OTAsIDB4MTIsIDB4MDQsIDB4NzQsIDB4MGEsIDB4ZjAsCisweDkwLCAweDEzLCAweDI4LCAweGUwLCAweDU0LCAweGYwLCAweGYwLCAweGEzLCAweGUwLCAweDU0LCAweGYwLCAweGYwLCAweGEzLCAweGUwLCAweDU0LCAweGZhLAorMHhmMCwgMHg5MCwgMHgwNCwgMHgwMSwgMHhlMCwgMHg1NCwgMHhmOSwgMHhmMCwgMHg3NSwgMHg2MiwgMHgwMSwgMHg3NSwgMHg1NSwgMHgwMiwgMHhlNCwgMHhmNSwKKzB4NTEsIDB4ODAsIDB4MDksIDB4ZTUsIDB4NTAsIDB4NzAsIDB4MDUsIDB4NzUsIDB4NjIsIDB4MDMsIDB4ZjUsIDB4NTEsIDB4ZTUsIDB4NjIsIDB4NjAsIDB4MTUsCisweGMyLCAweDAxLCAweGU0LCAweGY1LCAweDUxLCAweGMyLCAweDU5LCAweGFkLCAweDYyLCAweGFmLCAweDQwLCAweDEyLCAweDE2LCAweGI2LCAweGU1LCAweDYyLAorMHhiNCwgMHgwMywgMHgwMiwgMHhkMiwgMHgwMywgMHhkMiwgMHhhZiwgMHgyMiwgMHhjMiwgMHhhZiwgMHgzMCwgMHgwMSwgMHgxMiwgMHhlNCwgMHg5MCwgMHgwMSwKKzB4OTYsIDB4ZjAsIDB4ZjUsIDB4NTEsIDB4YzIsIDB4NTksIDB4YzIsIDB4MDEsIDB4N2QsIDB4MDIsIDB4YWYsIDB4NDAsIDB4MTIsIDB4MTYsIDB4YjYsIDB4ZTUsCisweDUyLCAweDE0LCAweDYwLCAweDA5LCAweDA0LCAweDcwLCAweDRjLCAweDc1LCAweDUyLCAweDAxLCAweDc1LCAweDU1LCAweDAzLCAweDkwLCAweDA0LCAweDAxLAorMHhlMCwgMHg0NCwgMHgwZSwgMHhmMCwgMHg5MCwgMHgxMywgMHgyOCwgMHhlMCwgMHg0NCwgMHgwZiwgMHhmMCwgMHhhMywgMHhlMCwgMHg0NCwgMHgwZiwgMHhmMCwKKzB4YTMsIDB4ZTAsIDB4NDQsIDB4MDUsIDB4ZjAsIDB4OTAsIDB4MTIsIDB4MDQsIDB4NzQsIDB4MDMsIDB4ZjAsIDB4OTAsIDB4MDIsIDB4YTIsIDB4ZTAsIDB4NDQsCisweGMwLCAweGYwLCAweDkwLCAweDEwLCAweDA0LCAweGUwLCAweDQ0LCAweDBjLCAweGYwLCAweGU0LCAweGY1LCAweDUyLCAweGY1LCAweDU1LCAweDMwLCAweDAyLAorMHgwYiwgMHhjMiwgMHgwMiwgMHg3ZCwgMHgwMSwgMHhhZiwgMHg0MSwgMHgxMiwgMHgxNiwgMHhiNiwgMHg4MCwgMHgwMiwgMHhjMiwgMHgwMywgMHhlNCwgMHg5MCwKKzB4MDEsIDB4OTYsIDB4ZjAsIDB4ZDIsIDB4YWYsIDB4MjIsIDB4ZWYsIDB4ZjQsIDB4NjAsIDB4MmQsIDB4ZTQsIDB4ZmUsIDB4NzQsIDB4MTQsIDB4MmUsIDB4ZjUsCisweDgyLCAweGU0LCAweDM0LCAweDcwLCAweGY1LCAweDgzLCAweGUwLCAweGI0LCAweGZmLCAweDE5LCAweDc0LCAweDE0LCAweDJlLCAweGY1LCAweDgyLCAweGU0LAorMHgzNCwgMHg3MCwgMHhmNSwgMHg4MywgMHhlZiwgMHhmMCwgMHg3NCwgMHgxYywgMHgyZSwgMHhmNSwgMHg4MiwgMHhlNCwgMHgzNCwgMHg3MCwgMHhmNSwgMHg4MywKKzB4ZWQsIDB4ZjAsIDB4MjIsIDB4MGUsIDB4YmUsIDB4MDQsIDB4ZDUsIDB4MjIsIDB4MjIsIDB4MjIsIDB4OTAsIDB4NzAsIDB4MmEsIDB4ZTAsIDB4MzAsIDB4ZTEsCisweDRkLCAweGMyLCAweGFmLCAweDkwLCAweDcwLCAweDI4LCAweGUwLCAweDkwLCAweDEwLCAweDFjLCAweGYwLCAweDkwLCAweDcwLCAweDI5LCAweGUwLCAweDkwLAorMHgxMCwgMHgxZCwgMHhmMCwgMHg5MCwgMHg3MCwgMHgyYSwgMHhlMCwgMHg5MCwgMHgxMCwgMHgxZSwgMHhmMCwgMHg5MCwgMHgxMCwgMHgxYywgMHhlMCwgMHhmNSwKKzB4NjIsIDB4OTAsIDB4MTAsIDB4MWUsIDB4ZTAsIDB4MjAsIDB4ZTEsIDB4ZjMsIDB4OTAsIDB4MTAsIDB4MWMsIDB4ZTAsIDB4OTAsIDB4NzAsIDB4MjgsIDB4ZjAsCisweDkwLCAweDEwLCAweDFkLCAweGUwLCAweDkwLCAweDcwLCAweDI5LCAweGYwLCAweDkwLCAweDEwLCAweDFlLCAweGUwLCAweDkwLCAweDcwLCAweDJhLCAweGYwLAorMHgzMCwgMHg0YSwgMHgwNywgMHg5MCwgMHg3MCwgMHgyNCwgMHhlMCwgMHg0NCwgMHgwMSwgMHhmMCwgMHhjMiwgMHgwNSwgMHhkMiwgMHhhZiwgMHgyMiwgMHgyMiwKKzB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweGU5LCAweDAwLCB9IDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL21kNS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vbWQ1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc0Nzc2YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL21kNS5jCkBAIC0wLDAgKzEsMTQyNyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICBtZDUuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCU5hbWUJCURhdGUJCQlNb2RpZmljYXRpb24gbG9ncworCWphbgkJCTEwLTI4LTAzCQlJbml0aWFsCisJUml0YSAgICAJMTEtMjMtMDQJCU1vZGlmeSBNRDUgYW5kIFNIQS0xCisJUml0YQkJMTAtMTQtMDUJCU1vZGlmeSBTSEEtMSBpbiBiaWctZW5kaWFuIHBsYXRmb3JtCisgKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworLyoqCisgKiBtZDVfbWFjOgorICogQGtleTogcG9pbnRlciB0bwl0aGUJa2V5CXVzZWQgZm9yIE1BQyBnZW5lcmF0aW9uCisgKiBAa2V5X2xlbjogbGVuZ3RoCW9mIHRoZSBrZXkgaW4gYnl0ZXMKKyAqIEBkYXRhOiBwb2ludGVyIHRvIHRoZSBkYXRhIGFyZWEgZm9yIHdoaWNoIHRoZSBNQUMgaXMJZ2VuZXJhdGVkCisgKiBAZGF0YV9sZW46IGxlbmd0aCBvZgl0aGUJZGF0YSBpbglieXRlcworICogQG1hYzogcG9pbnRlciB0bwl0aGUJYnVmZmVyIGhvbGRpbmcgc3BhY2UgZm9yIHRoZSBNQUM7IHRoZSBidWZmZXIgc2hvdWxkCisgKiBoYXZlCXNwYWNlIGZvciAxMjgtYml0ICgxNiBieXRlcykgTUQ1IGhhc2ggdmFsdWUKKyAqCisgKiBtZDVfbWFjKCkgZGV0ZXJtaW5lcwl0aGUJbWVzc2FnZQlhdXRoZW50aWNhdGlvbiBjb2RlCWJ5IHVzaW5nIHNlY3VyZQloYXNoCisgKiBNRDUoa2V5IHwgZGF0YSB8CWtleSkuCisgKi8KK3ZvaWQgbWQ1X21hYyh1OCAqa2V5LCBzaXplX3Qga2V5X2xlbiwgdTggKmRhdGEsIHNpemVfdCBkYXRhX2xlbiwgdTggKm1hYykKK3sKKwlNRDVfQ1RYCWNvbnRleHQ7CisKKwlNRDVJbml0KCZjb250ZXh0KTsKKwlNRDVVcGRhdGUoJmNvbnRleHQsCWtleSwga2V5X2xlbik7CisJTUQ1VXBkYXRlKCZjb250ZXh0LAlkYXRhLCBkYXRhX2xlbik7CisJTUQ1VXBkYXRlKCZjb250ZXh0LAlrZXksIGtleV9sZW4pOworCU1ENUZpbmFsKG1hYywgJmNvbnRleHQpOworfQorCisvKioKKyAqIGhtYWNfbWQ1OgorICogQGtleTogcG9pbnRlciB0bwl0aGUJa2V5CXVzZWQgZm9yIE1BQyBnZW5lcmF0aW9uCisgKiBAa2V5X2xlbjogbGVuZ3RoCW9mIHRoZSBrZXkgaW4gYnl0ZXMKKyAqIEBkYXRhOiBwb2ludGVyIHRvIHRoZSBkYXRhIGFyZWEgZm9yIHdoaWNoIHRoZSBNQUMgaXMJZ2VuZXJhdGVkCisgKiBAZGF0YV9sZW46IGxlbmd0aCBvZgl0aGUJZGF0YSBpbglieXRlcworICogQG1hYzogcG9pbnRlciB0bwl0aGUJYnVmZmVyIGhvbGRpbmcgc3BhY2UgZm9yIHRoZSBNQUM7IHRoZSBidWZmZXIgc2hvdWxkCisgKiBoYXZlCXNwYWNlIGZvciAxMjgtYml0ICgxNiBieXRlcykgTUQ1IGhhc2ggdmFsdWUKKyAqCisgKiBobWFjX21kNSgpIGRldGVybWluZXMgdGhlIG1lc3NhZ2UgYXV0aGVudGljYXRpb24JY29kZSB1c2luZyBITUFDLU1ENS4KKyAqIFRoaXMJaW1wbGVtZW50YXRpb24gaXMgYmFzZWQJb24gdGhlIHNhbXBsZSBjb2RlIHByZXNlbnRlZCBpbglSRkMJMjEwNC4KKyAqLwordm9pZCBobWFjX21kNSh1OCAqa2V5LCBzaXplX3Qga2V5X2xlbiwgdTggKmRhdGEsIHNpemVfdCBkYXRhX2xlbiwgdTggKm1hYykKK3sKKwlNRDVfQ1RYCWNvbnRleHQ7CisgICAgdTgga19pcGFkWzY1XTsgLyogaW5uZXIgcGFkZGluZyAtIGtleSBYT1JkIHdpdGggaXBhZCAqLworICAgIHU4IGtfb3BhZFs2NV07IC8qIG91dGVyIHBhZGRpbmcgLSBrZXkgWE9SZCB3aXRoIG9wYWQgKi8KKyAgICB1OCB0a1sxNl07CisJaW50CWk7CisKKwkvL2Fzc2VydChrZXkgIT0gTlVMTCAmJiBkYXRhICE9IE5VTEwgJiYgbWFjICE9IE5VTEwpOworCisJLyogaWYga2V5IGlzIGxvbmdlcgl0aGFuIDY0CWJ5dGVzIHJlc2V0CWl0IHRvIGtleSA9CU1ENShrZXkpICovCisJaWYgKGtleV9sZW4JPiA2NCkgeworCQlNRDVfQ1RYCXR0Y29udGV4dDsKKworCQlNRDVJbml0KCZ0dGNvbnRleHQpOworCQlNRDVVcGRhdGUoJnR0Y29udGV4dCwga2V5LCBrZXlfbGVuKTsKKwkJTUQ1RmluYWwodGssICZ0dGNvbnRleHQpOworCQkvL2tleT0oUFVDSEFSKXR0Y29udGV4dC5idWY7CisJCWtleQk9IHRrOworCQlrZXlfbGVuCT0gMTY7CisJfQorCisJLyogdGhlIEhNQUNfTUQ1CXRyYW5zZm9ybSBsb29rcwlsaWtlOgorCSAqCisJICogTUQ1KEsgWE9SIG9wYWQsIE1ENShLIFhPUiBpcGFkLCB0ZXh0KSkKKwkgKgorCSAqIHdoZXJlIEsgaXMgYW4gbiBieXRlCWtleQorCSAqIGlwYWQJaXMgdGhlIGJ5dGUJMHgzNiByZXBlYXRlZCA2NCB0aW1lcworCSAqIG9wYWQJaXMgdGhlIGJ5dGUJMHg1YyByZXBlYXRlZCA2NCB0aW1lcworCSAqIGFuZCB0ZXh0CWlzIHRoZSBkYXRhCWJlaW5nIHByb3RlY3RlZAkqLworCisJLyogc3RhcnQgb3V0IGJ5CXN0b3JpbmcJa2V5CWluIHBhZHMJKi8KKwlOZGlzWmVyb01lbW9yeShrX2lwYWQsIHNpemVvZihrX2lwYWQpKTsKKwlOZGlzWmVyb01lbW9yeShrX29wYWQsCXNpemVvZihrX29wYWQpKTsKKwkvL2Fzc2VydChrZXlfbGVuIDwgc2l6ZW9mKGtfaXBhZCkpOworCU5kaXNNb3ZlTWVtb3J5KGtfaXBhZCwga2V5LAlrZXlfbGVuKTsKKwlOZGlzTW92ZU1lbW9yeShrX29wYWQsIGtleSwJa2V5X2xlbik7CisKKwkvKiBYT1Iga2V5IHdpdGgJaXBhZCBhbmQgb3BhZCB2YWx1ZXMgKi8KKwlmb3IJKGkgPSAwOwlpIDwJNjQ7CWkrKykgeworCQlrX2lwYWRbaV0gXj0gMHgzNjsKKwkJa19vcGFkW2ldIF49IDB4NWM7CisJfQorCisJLyogcGVyZm9ybSBpbm5lciBNRDUgKi8KKwlNRDVJbml0KCZjb250ZXh0KTsJCQkJCSAvKglpbml0IGNvbnRleHQgZm9yIDFzdCBwYXNzICovCisJTUQ1VXBkYXRlKCZjb250ZXh0LAlrX2lwYWQsCTY0KTsJIC8qCXN0YXJ0IHdpdGggaW5uZXIgcGFkICovCisJTUQ1VXBkYXRlKCZjb250ZXh0LAlkYXRhLCBkYXRhX2xlbik7IC8qCXRoZW4gdGV4dCBvZiBkYXRhZ3JhbSAqLworCU1ENUZpbmFsKG1hYywgJmNvbnRleHQpOwkJCSAvKglmaW5pc2ggdXAgMXN0IHBhc3MgKi8KKworCS8qIHBlcmZvcm0gb3V0ZXIgTUQ1ICovCisJTUQ1SW5pdCgmY29udGV4dCk7CQkJCQkgLyoJaW5pdCBjb250ZXh0IGZvciAybmQgcGFzcyAqLworCU1ENVVwZGF0ZSgmY29udGV4dCwJa19vcGFkLAk2NCk7CSAvKglzdGFydCB3aXRoIG91dGVyIHBhZCAqLworCU1ENVVwZGF0ZSgmY29udGV4dCwJbWFjLCAxNik7CQkgLyoJdGhlbiByZXN1bHRzIG9mCTFzdAloYXNoICovCisJTUQ1RmluYWwobWFjLCAmY29udGV4dCk7CQkJIC8qCWZpbmlzaCB1cCAybmQgcGFzcyAqLworfQorCisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKyNkZWZpbmUgYnl0ZVJldmVyc2UoYnVmLCBsZW4pICAgLyogTm90aGluZyAqLworI2Vsc2UKK3ZvaWQgYnl0ZVJldmVyc2UodW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25ncyk7Cit2b2lkIGJ5dGVSZXZlcnNlKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZ3MpCit7CisgICAgZG8geworICAgICAgICAqKFVJTlQzMiAqKWJ1ZiA9IFNXQVAzMigqKFVJTlQzMiAqKWJ1Zik7CisgICAgICAgIGJ1ZiArPSA0OworICAgIH0gd2hpbGUgKC0tbG9uZ3MpOworfQorI2VuZGlmCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT0gIE1ENSBpbXBsZW1lbnRhdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8vIGZvdXIgYmFzZSBmdW5jdGlvbnMgZm9yIE1ENQorI2RlZmluZSBNRDVfRjEoeCwgeSwgeikgKCgoeCkgJiAoeSkpIHwgKCh+eCkgJiAoeikpKQorI2RlZmluZSBNRDVfRjIoeCwgeSwgeikgKCgoeCkgJiAoeikpIHwgKCh5KSAmICh+eikpKQorI2RlZmluZSBNRDVfRjMoeCwgeSwgeikgKCh4KSBeICh5KSBeICh6KSkKKyNkZWZpbmUgTUQ1X0Y0KHgsIHksIHopICgoeSkgXiAoKHgpIHwgKH56KSkpCisjZGVmaW5lIENZQ0xJQ19MRUZUX1NISUZUKHcsIHMpICgoKHcpIDw8IChzKSkgfCAoKHcpID4+ICgzMi0ocykpKSkKKworI2RlZmluZQlNRDVTdGVwKGYsIHcsIHgsIHksCXosIGRhdGEsIHQsIHMpCVwKKwkoIHcJKz0gZih4LAl5LCB6KSArCWRhdGEgKyB0LCAgdyA9IChDWUNMSUNfTEVGVF9TSElGVCh3LCBzKSkgJiAweGZmZmZmZmZmLCB3ICs9CXggKQorCisKKy8qCisgKiAgRnVuY3Rpb24gRGVzY3JpcHRpb246CisgKiAgICAgIEluaXRpYXRlIE1ENSBDb250ZXh0IHNhdGlzZmllZCBpbiBSRkMgMTMyMQorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICAgIHBDdHggICAgICAgIFBvaW50ZXIJdG8gTUQ1IGNvbnRleHQKKyAqCisgKiAgUmV0dXJuIFZhbHVlOgorICogICAgICBOb25lCisgKi8KK1ZPSUQgTUQ1SW5pdChNRDVfQ1RYICpwQ3R4KQoreworICAgIHBDdHgtPkJ1ZlswXT0weDY3NDUyMzAxOworICAgIHBDdHgtPkJ1ZlsxXT0weGVmY2RhYjg5OworICAgIHBDdHgtPkJ1ZlsyXT0weDk4YmFkY2ZlOworICAgIHBDdHgtPkJ1ZlszXT0weDEwMzI1NDc2OworCisgICAgcEN0eC0+TGVuSW5CaXRDb3VudFswXT0wOworICAgIHBDdHgtPkxlbkluQml0Q291bnRbMV09MDsKK30KKworCisvKgorICogIEZ1bmN0aW9uIERlc2NyaXB0aW9uOgorICogICAgICBVcGRhdGUgTUQ1IENvbnRleHQsIGFsbG93IG9mIGFuIGFycmFyeSBvZiBvY3RldHMgYXMgdGhlIG5leHQgcG9ydGlvbgorICogICAgICBvZiB0aGUgbWVzc2FnZQorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICAgIHBDdHgJCVBvaW50ZXIJdG8gTUQ1IGNvbnRleHQKKyAqIAkgICAgcERhdGEgICAgICAgUG9pbnRlciB0byBpbnB1dCBkYXRhCisgKiAgICAgIExlbkluQnl0ZXMgIFRoZSBsZW5ndGggb2YgaW5wdXQgZGF0YSAodW5pdDogYnl0ZSkKKyAqCisgKiAgUmV0dXJuIFZhbHVlOgorICogICAgICBOb25lCisgKgorICogIE5vdGU6CisgKiAgICAgIENhbGxlZCBhZnRlciBNRDVJbml0IG9yIE1ENVVwZGF0ZShpdHNlbGYpCisgKi8KK1ZPSUQgTUQ1VXBkYXRlKE1ENV9DVFggKnBDdHgsIFVDSEFSICpwRGF0YSwgVUlOVDMyIExlbkluQnl0ZXMpCit7CisKKyAgICBVSU5UMzIgVGZUaW1lczsKKyAgICBVSU5UMzIgdGVtcDsKKwl1bnNpZ25lZCBpbnQgaTsKKworICAgIHRlbXAgPSBwQ3R4LT5MZW5JbkJpdENvdW50WzBdOworCisgICAgcEN0eC0+TGVuSW5CaXRDb3VudFswXSA9IChVSU5UMzIpIChwQ3R4LT5MZW5JbkJpdENvdW50WzBdICsgKExlbkluQnl0ZXMgPDwgMykpOworCisgICAgaWYgKHBDdHgtPkxlbkluQml0Q291bnRbMF0gPCB0ZW1wKQorICAgICAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzFdKys7ICAgLy9jYXJyeSBpbgorCisgICAgcEN0eC0+TGVuSW5CaXRDb3VudFsxXSArPSBMZW5JbkJ5dGVzID4+IDI5OworCisgICAgLy8gbW9kIDY0IGJ5dGVzCisgICAgdGVtcCA9ICh0ZW1wID4+IDMpICYgMHgzZjsKKworICAgIC8vIHByb2Nlc3MgbGFja3Mgb2YgNjQtYnl0ZSBkYXRhCisgICAgaWYgKHRlbXApCisgICAgeworICAgICAgICBVQ0hBUiAqcEFkcyA9IChVQ0hBUiAqKSBwQ3R4LT5JbnB1dCArIHRlbXA7CisKKyAgICAgICAgaWYgKCh0ZW1wK0xlbkluQnl0ZXMpIDwgNjQpCisgICAgICAgIHsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZHMsIChVQ0hBUiAqKXBEYXRhLCBMZW5JbkJ5dGVzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZHMsIChVQ0hBUiAqKXBEYXRhLCA2NC10ZW1wKTsKKyAgICAgICAgYnl0ZVJldmVyc2UocEN0eC0+SW5wdXQsIDE2KTsKKyAgICAgICAgTUQ1VHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKKworICAgICAgICBwRGF0YSArPSA2NC10ZW1wOworICAgICAgICBMZW5JbkJ5dGVzIC09IDY0LXRlbXA7CisgICAgfSAvLyBlbmQgb2YgaWYgKHRlbXApCisKKworICAgIFRmVGltZXMgPSAoTGVuSW5CeXRlcyA+PiA2KTsKKworICAgIGZvciAoaT1UZlRpbWVzOyBpPjA7IGktLSkKKyAgICB7CisgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBDdHgtPklucHV0LCAoVUNIQVIgKilwRGF0YSwgNjQpOworICAgICAgICBieXRlUmV2ZXJzZShwQ3R4LT5JbnB1dCwgMTYpOworICAgICAgICBNRDVUcmFuc2Zvcm0ocEN0eC0+QnVmLCAoVUlOVDMyICopcEN0eC0+SW5wdXQpOworICAgICAgICBwRGF0YSArPSA2NDsKKyAgICAgICAgTGVuSW5CeXRlcyAtPSA2NDsKKyAgICB9IC8vIGVuZCBvZiBmb3IKKworICAgIC8vIGJ1ZmZlcmluZyBsYWNrcyBvZiA2NC1ieXRlIGRhdGEKKyAgICBpZihMZW5JbkJ5dGVzKQorICAgICAgICBOZGlzTW92ZU1lbW9yeShwQ3R4LT5JbnB1dCwgKFVDSEFSICopcERhdGEsIExlbkluQnl0ZXMpOworCit9CisKKworLyoKKyAqICBGdW5jdGlvbiBEZXNjcmlwdGlvbjoKKyAqICAgICAgQXBwZW5kIHBhZGRpbmcgYml0cyBhbmQgbGVuZ3RoIG9mIG9yaWdpbmFsIG1lc3NhZ2UgaW4gdGhlIHRhaWwKKyAqICAgICAgVGhlIG1lc3NhZ2UgZGlnZXN0IGhhcyB0byBiZSBjb21wbGV0ZWQgaW4gdGhlIGVuZAorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICAgIERpZ2VzdAkJT3V0cHV0IG9mIERpZ2VzdC1NZXNzYWdlIGZvciBNRDUKKyAqICAJcEN0eCAgICAgICAgUG9pbnRlcgl0byBNRDUgY29udGV4dAorICoKKyAqICBSZXR1cm4gVmFsdWU6CisgKiAgICAgIE5vbmUKKyAqCisgKiAgTm90ZToKKyAqICAgICAgQ2FsbGVkIGFmdGVyIE1ENVVwZGF0ZQorICovCitWT0lEIE1ENUZpbmFsKFVDSEFSIERpZ2VzdFsxNl0sIE1ENV9DVFggKnBDdHgpCit7CisgICAgVUNIQVIgUmVtYWluZGVyOworICAgIFVDSEFSIFBhZExlbkluQnl0ZXM7CisgICAgVUNIQVIgKnBBcHBlbmQ9MDsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgIFJlbWFpbmRlciA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMF0gPj4gMykgJiAweDNmKTsKKworICAgIFBhZExlbkluQnl0ZXMgPSAoUmVtYWluZGVyIDwgNTYpID8gKDU2LVJlbWFpbmRlcikgOiAoMTIwLVJlbWFpbmRlcik7CisKKyAgICBwQXBwZW5kID0gKFVDSEFSICopcEN0eC0+SW5wdXQgKyBSZW1haW5kZXI7CisKKyAgICAvLyBwYWRkaW5nIGJpdHMgd2l0aG91dCBjcm9zc2luZyBibG9jayg2NC1ieXRlIGJhc2VkKSBib3VuZGFyeQorICAgIGlmIChSZW1haW5kZXIgPCA1NikKKyAgICB7CisgICAgICAgICpwQXBwZW5kID0gMHg4MDsKKyAgICAgICAgUGFkTGVuSW5CeXRlcyAtLTsKKworICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCArIFJlbWFpbmRlcisxLCBQYWRMZW5JbkJ5dGVzKTsKKworCQkvLyBhZGQgZGF0YS1sZW5ndGggZmllbGQsIGZyb20gbG93IHRvIGhpZ2gKKyAgICAgICAJZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICB7CisgICAgICAgIAlwQ3R4LT5JbnB1dFs1NitpXSA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMF0gPj4gKGkgPDwgMykpICYgMHhmZik7CisgICAgICAgIAlwQ3R4LT5JbnB1dFs2MCtpXSA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMV0gPj4gKGkgPDwgMykpICYgMHhmZik7CisgICAgICAJfQorCisgICAgICAgIGJ5dGVSZXZlcnNlKHBDdHgtPklucHV0LCAxNik7CisgICAgICAgIE1ENVRyYW5zZm9ybShwQ3R4LT5CdWYsIChVSU5UMzIgKilwQ3R4LT5JbnB1dCk7CisgICAgfSAvLyBlbmQgb2YgaWYKKworICAgIC8vIHBhZGRpbmcgYml0cyB3aXRoIGNyb3NzaW5nIGJsb2NrKDY0LWJ5dGUgYmFzZWQpIGJvdW5kYXJ5CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gdGhlIGZpcnN0IGJsb2NrID09PQorICAgICAgICAqcEFwcGVuZCA9IDB4ODA7CisgICAgICAgIFBhZExlbkluQnl0ZXMgLS07CisKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQgKyBSZW1haW5kZXIrMSwgKDY0LVJlbWFpbmRlci0xKSk7CisgICAgICAgIFBhZExlbkluQnl0ZXMgLT0gKDY0IC0gUmVtYWluZGVyIC0gMSk7CisKKyAgICAgICAgYnl0ZVJldmVyc2UocEN0eC0+SW5wdXQsIDE2KTsKKyAgICAgICAgTUQ1VHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKKworCisgICAgICAgIC8vIHRoZSBzZWNvbmQgYmxvY2sgPT09CisgICAgICAgIE5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKXBDdHgtPklucHV0LCBQYWRMZW5JbkJ5dGVzKTsKKworICAgICAgICAvLyBhZGQgZGF0YS1sZW5ndGggZmllbGQKKyAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQorICAgICAgICB7CisgICAgICAgIAlwQ3R4LT5JbnB1dFs1NitpXSA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMF0gPj4gKGkgPDwgMykpICYgMHhmZik7CisgICAgICAgIAlwQ3R4LT5JbnB1dFs2MCtpXSA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMV0gPj4gKGkgPDwgMykpICYgMHhmZik7CisgICAgICAJfQorCisgICAgICAgIGJ5dGVSZXZlcnNlKHBDdHgtPklucHV0LCAxNik7CisgICAgICAgIE1ENVRyYW5zZm9ybShwQ3R4LT5CdWYsIChVSU5UMzIgKilwQ3R4LT5JbnB1dCk7CisgICAgfSAvLyBlbmQgb2YgZWxzZQorCisKKyAgICBOZGlzTW92ZU1lbW9yeSgoVUNIQVIgKilEaWdlc3QsIChVSU5UMzIgKilwQ3R4LT5CdWYsIDE2KTsgLy8gb3V0cHV0CisgICAgYnl0ZVJldmVyc2UoKFVDSEFSICopRGlnZXN0LCA0KTsKKyAgICBOZGlzWmVyb01lbW9yeShwQ3R4LCBzaXplb2YocEN0eCkpOyAvLyBtZW1vcnkgZnJlZQorfQorCisKKy8qCisgKiAgRnVuY3Rpb24gRGVzY3JpcHRpb246CisgKiAgICAgIFRoZSBjZW50cmFsIGFsZ29yaXRobSBvZiBNRDUsIGNvbnNpc3RzIG9mIGZvdXIgcm91bmRzIGFuZCBzaXh0ZWVuCisgKiAgCXN0ZXBzIHBlciByb3VuZAorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICAgIEJ1ZiAgICAgQnVmZmVycyBvZiBmb3VyIHN0YXRlcyAob3V0cHV0OiAxNiBieXRlcykKKyAqIAkgICAgTWVzICAgICBJbnB1dCBkYXRhIChpbnB1dDogNjQgYnl0ZXMpCisgKgorICogIFJldHVybiBWYWx1ZToKKyAqICAgICAgTm9uZQorICoKKyAqICBOb3RlOgorICogICAgICBDYWxsZWQgYnkgTUQ1VXBkYXRlIG9yIE1ENUZpbmFsCisgKi8KK1ZPSUQgTUQ1VHJhbnNmb3JtKFVJTlQzMiBCdWZbNF0sIFVJTlQzMiBNZXNbMTZdKQoreworICAgIFVJTlQzMiBSZWdbNF0sIFRlbXA7CisJdW5zaWduZWQgaW50IGk7CisKKyAgICBzdGF0aWMgVUNIQVIgTFNoaWZ0VmFsWzE2XSA9CisgICAgeworICAgICAgICA3LCAxMiwgMTcsIDIyLAorCQk1LCA5ICwgMTQsIDIwLAorCQk0LCAxMSwgMTYsIDIzLAorIAkJNiwgMTAsIDE1LCAyMSwKKyAJfTsKKworCisJLy8gW2VxdWFsIHRvIDQyOTQ5NjcyOTYqYWJzKHNpbihpbmRleCkpXQorICAgIHN0YXRpYyBVSU5UMzIgTUQ1VGFibGVbNjRdID0KKwl7CisJCTB4ZDc2YWE0NzgsCTB4ZThjN2I3NTYsCTB4MjQyMDcwZGIsCTB4YzFiZGNlZWUsCisJCTB4ZjU3YzBmYWYsCTB4NDc4N2M2MmEsCTB4YTgzMDQ2MTMsIDB4ZmQ0Njk1MDEsCisJCTB4Njk4MDk4ZDgsCTB4OGI0NGY3YWYsCTB4ZmZmZjViYjEsCTB4ODk1Y2Q3YmUsCisgICAgCTB4NmI5MDExMjIsCTB4ZmQ5ODcxOTMsCTB4YTY3OTQzOGUsCTB4NDliNDA4MjEsCisKKyAgICAJMHhmNjFlMjU2MiwJMHhjMDQwYjM0MCwJMHgyNjVlNWE1MSwJMHhlOWI2YzdhYSwKKyAgICAJMHhkNjJmMTA1ZCwJMHgwMjQ0MTQ1MywJMHhkOGExZTY4MSwJMHhlN2QzZmJjOCwKKyAgICAJMHgyMWUxY2RlNiwJMHhjMzM3MDdkNiwJMHhmNGQ1MGQ4NywJMHg0NTVhMTRlZCwKKyAgICAJMHhhOWUzZTkwNSwJMHhmY2VmYTNmOCwJMHg2NzZmMDJkOSwJMHg4ZDJhNGM4YSwKKworICAgIAkweGZmZmEzOTQyLAkweDg3NzFmNjgxLAkweDZkOWQ2MTIyLAkweGZkZTUzODBjLAorICAgIAkweGE0YmVlYTQ0LAkweDRiZGVjZmE5LAkweGY2YmI0YjYwLAkweGJlYmZiYzcwLAorICAgIAkweDI4OWI3ZWM2LAkweGVhYTEyN2ZhLAkweGQ0ZWYzMDg1LAkweDA0ODgxZDA1LAorICAgIAkweGQ5ZDRkMDM5LAkweGU2ZGI5OWU1LAkweDFmYTI3Y2Y4LAkweGM0YWM1NjY1LAorCisgICAgCTB4ZjQyOTIyNDQsCTB4NDMyYWZmOTcsCTB4YWI5NDIzYTcsCTB4ZmM5M2EwMzksCisgICAJCTB4NjU1YjU5YzMsCTB4OGYwY2NjOTIsCTB4ZmZlZmY0N2QsCTB4ODU4NDVkZDEsCisgICAgCTB4NmZhODdlNGYsCTB4ZmUyY2U2ZTAsCTB4YTMwMTQzMTQsCTB4NGUwODExYTEsCisgICAgCTB4Zjc1MzdlODIsCTB4YmQzYWYyMzUsCTB4MmFkN2QyYmIsCTB4ZWI4NmQzOTEKKwl9OworCisKKyAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgIFJlZ1tpXT1CdWZbaV07CisKKworICAgIC8vIDY0IHN0ZXBzIGluIE1ENSBhbGdvcml0aG0KKyAgICBmb3IgKGk9MDsgaTwxNjsgaSsrKQorICAgIHsKKyAgICAgICAgTUQ1U3RlcChNRDVfRjEsIFJlZ1swXSwgUmVnWzFdLCBSZWdbMl0sIFJlZ1szXSwgTWVzW2ldLAorICAgICAgICAgICAgICAgIE1ENVRhYmxlW2ldLCBMU2hpZnRWYWxbaSAmIDB4M10pOworCisgICAgICAgIC8vIG9uZS13b3JkIHJpZ2h0IHNoaWZ0CisgICAgICAgIFRlbXAgICA9IFJlZ1szXTsKKyAgICAgICAgUmVnWzNdID0gUmVnWzJdOworICAgICAgICBSZWdbMl0gPSBSZWdbMV07CisgICAgICAgIFJlZ1sxXSA9IFJlZ1swXTsKKyAgICAgICAgUmVnWzBdID0gVGVtcDsKKyAgICB9CisgICAgZm9yIChpPTE2OyBpPDMyOyBpKyspCisgICAgeworICAgICAgICBNRDVTdGVwKE1ENV9GMiwgUmVnWzBdLCBSZWdbMV0sIFJlZ1syXSwgUmVnWzNdLCBNZXNbKDUqKGkgJiAweGYpKzEpICYgMHhmXSwKKyAgICAgICAgICAgICAgICBNRDVUYWJsZVtpXSwgTFNoaWZ0VmFsWygweDEgPDwgMikrKGkgJiAweDMpXSk7CisKKyAgICAgICAgLy8gb25lLXdvcmQgcmlnaHQgc2hpZnQKKyAgICAgICAgVGVtcCAgID0gUmVnWzNdOworICAgICAgICBSZWdbM10gPSBSZWdbMl07CisgICAgICAgIFJlZ1syXSA9IFJlZ1sxXTsKKyAgICAgICAgUmVnWzFdID0gUmVnWzBdOworICAgICAgICBSZWdbMF0gPSBUZW1wOworICAgIH0KKyAgICBmb3IgKGk9MzI7IGk8NDg7IGkrKykKKyAgICB7CisgICAgICAgIE1ENVN0ZXAoTUQ1X0YzLCBSZWdbMF0sIFJlZ1sxXSwgUmVnWzJdLCBSZWdbM10sIE1lc1soMyooaSAmIDB4ZikrNSkgJiAweGZdLAorICAgICAgICAgICAgICAgIE1ENVRhYmxlW2ldLCBMU2hpZnRWYWxbKDB4MSA8PCAzKSsoaSAmIDB4MyldKTsKKworICAgICAgICAvLyBvbmUtd29yZCByaWdodCBzaGlmdAorICAgICAgICBUZW1wICAgPSBSZWdbM107CisgICAgICAgIFJlZ1szXSA9IFJlZ1syXTsKKyAgICAgICAgUmVnWzJdID0gUmVnWzFdOworICAgICAgICBSZWdbMV0gPSBSZWdbMF07CisgICAgICAgIFJlZ1swXSA9IFRlbXA7CisgICAgfQorICAgIGZvciAoaT00ODsgaTw2NDsgaSsrKQorICAgIHsKKyAgICAgICAgTUQ1U3RlcChNRDVfRjQsIFJlZ1swXSwgUmVnWzFdLCBSZWdbMl0sIFJlZ1szXSwgTWVzWyg3KihpICYgMHhmKSkgJiAweGZdLAorICAgICAgICAgICAgICAgIE1ENVRhYmxlW2ldLCBMU2hpZnRWYWxbKDB4MyA8PCAyKSsoaSAmIDB4MyldKTsKKworICAgICAgICAvLyBvbmUtd29yZCByaWdodCBzaGlmdAorICAgICAgICBUZW1wICAgPSBSZWdbM107CisgICAgICAgIFJlZ1szXSA9IFJlZ1syXTsKKyAgICAgICAgUmVnWzJdID0gUmVnWzFdOworICAgICAgICBSZWdbMV0gPSBSZWdbMF07CisgICAgICAgIFJlZ1swXSA9IFRlbXA7CisgICAgfQorCisKKyAgICAvLyAodGVtcG9yYXJ5KW91dHB1dAorICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgQnVmW2ldICs9IFJlZ1tpXTsKKworfQorCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PSAgU0hBLTEgaW1wbGVtZW50YXRpb24gPT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8vIGZvdXIgYmFzZSBmdW5jdGlvbnMgZm9yIFNIQS0xCisjZGVmaW5lIFNIQTFfRjEoYiwgYywgZCkgICAgKCgoYikgJiAoYykpIHwgKCh+YikgJiAoZCkpKQorI2RlZmluZSBTSEExX0YyKGIsIGMsIGQpICAgICgoYikgXiAoYykgXiAoZCkpCisjZGVmaW5lIFNIQTFfRjMoYiwgYywgZCkgICAgKCgoYikgJiAoYykpIHwgKChiKSAmIChkKSkgfCAoKGMpICYgKGQpKSkKKworCisjZGVmaW5lIFNIQTFTdGVwKGYsIGEsIGIsIGMsIGQsIGUsIHcsIGspICAgIFwKKyAgICAoIGUJKz0gKCBmKGIsIGMsIGQpICsgdyArIGsgKyBDWUNMSUNfTEVGVF9TSElGVChhLCA1KSkgJiAweGZmZmZmZmZmLCBcCisgICAgICBiID0gQ1lDTElDX0xFRlRfU0hJRlQoYiwgMzApICkKKworLy9Jbml0aWF0ZSBTSEEtMSBDb250ZXh0IHNhdGlzZmllZCBpbiBSRkMgMzE3NAorVk9JRCBTSEFJbml0KFNIQV9DVFggKnBDdHgpCit7CisgICAgcEN0eC0+QnVmWzBdPTB4Njc0NTIzMDE7CisgICAgcEN0eC0+QnVmWzFdPTB4ZWZjZGFiODk7CisgICAgcEN0eC0+QnVmWzJdPTB4OThiYWRjZmU7CisgICAgcEN0eC0+QnVmWzNdPTB4MTAzMjU0NzY7CisgICAgcEN0eC0+QnVmWzRdPTB4YzNkMmUxZjA7CisKKyAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzBdPTA7CisgICAgcEN0eC0+TGVuSW5CaXRDb3VudFsxXT0wOworfQorCisvKgorICogIEZ1bmN0aW9uIERlc2NyaXB0aW9uOgorICogICAgICBVcGRhdGUgU0hBLTEgQ29udGV4dCwgYWxsb3cgb2YgYW4gYXJyYXJ5IG9mIG9jdGV0cyBhcyB0aGUgbmV4dAorICogICAgICBwb3J0aW9uIG9mIHRoZSBtZXNzYWdlCisgKgorICogIEFyZ3VtZW50czoKKyAqICAgICAgcEN0eAkJUG9pbnRlcgl0byBTSEEtMSBjb250ZXh0CisgKiAJICAgIHBEYXRhICAgICAgIFBvaW50ZXIgdG8gaW5wdXQgZGF0YQorICogICAgICBMZW5JbkJ5dGVzICBUaGUgbGVuZ3RoIG9mIGlucHV0IGRhdGEgKHVuaXQ6IGJ5dGUpCisgKgorICogIFJldHVybiBWYWx1ZToKKyAqICAgICAgZXJyb3IgICAgICAgaW5kaWNhdGUgbW9yZSB0aGFuIHBvdygyLDY0KSBiaXRzIG9mIGRhdGEKKyAqCisgKiAgTm90ZToKKyAqICAgICAgQ2FsbGVkIGFmdGVyIFNIQUluaXQgb3IgU0hBVXBkYXRlKGl0c2VsZikKKyAqLworVUNIQVIgU0hBVXBkYXRlKFNIQV9DVFggKnBDdHgsIFVDSEFSICpwRGF0YSwgVUlOVDMyIExlbkluQnl0ZXMpCit7CisgICAgVUlOVDMyIFRmVGltZXM7CisgICAgVUlOVDMyIHRlbXAxLHRlbXAyOworCXVuc2lnbmVkIGludCBpOworCVVDSEFSIGVycj0xOworCisgICAgdGVtcDEgPSBwQ3R4LT5MZW5JbkJpdENvdW50WzBdOworICAgIHRlbXAyID0gcEN0eC0+TGVuSW5CaXRDb3VudFsxXTsKKworICAgIHBDdHgtPkxlbkluQml0Q291bnRbMF0gPSAoVUlOVDMyKSAocEN0eC0+TGVuSW5CaXRDb3VudFswXSArIChMZW5JbkJ5dGVzIDw8IDMpKTsKKyAgICBpZiAocEN0eC0+TGVuSW5CaXRDb3VudFswXSA8IHRlbXAxKQorICAgICAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzFdKys7ICAgLy9jYXJyeSBpbgorCisKKyAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzFdID0gKFVJTlQzMikgKHBDdHgtPkxlbkluQml0Q291bnRbMV0gKyhMZW5JbkJ5dGVzID4+IDI5KSk7CisgICAgaWYgKHBDdHgtPkxlbkluQml0Q291bnRbMV0gPCB0ZW1wMikKKyAgICAgICAgcmV0dXJuIChlcnIpOyAgIC8vY2hlY2sgdG90YWwgbGVuZ3RoIG9mIG9yaWdpbmFsIGRhdGEKKworCisgICAgLy8gbW9kIDY0IGJ5dGVzCisgICAgdGVtcDEgPSAodGVtcDEgPj4gMykgJiAweDNmOworCisgICAgLy8gcHJvY2VzcyBsYWNrcyBvZiA2NC1ieXRlIGRhdGEKKyAgICBpZiAodGVtcDEpCisgICAgeworICAgICAgICBVQ0hBUiAqcEFkcyA9IChVQ0hBUiAqKSBwQ3R4LT5JbnB1dCArIHRlbXAxOworCisgICAgICAgIGlmICgodGVtcDErTGVuSW5CeXRlcykgPCA2NCkKKyAgICAgICAgeworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkcywgKFVDSEFSICopcERhdGEsIExlbkluQnl0ZXMpOworICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgfQorCisgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZHMsIChVQ0hBUiAqKXBEYXRhLCA2NC10ZW1wMSk7CisgICAgICAgIGJ5dGVSZXZlcnNlKChVQ0hBUiAqKXBDdHgtPklucHV0LCAxNik7CisKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQgKyA2NCwgMTYpOworICAgICAgICBTSEFUcmFuc2Zvcm0ocEN0eC0+QnVmLCAoVUlOVDMyICopcEN0eC0+SW5wdXQpOworCisgICAgICAgIHBEYXRhICs9IDY0LXRlbXAxOworICAgICAgICBMZW5JbkJ5dGVzIC09IDY0LXRlbXAxOworICAgIH0gLy8gZW5kIG9mIGlmICh0ZW1wMSkKKworCisgICAgVGZUaW1lcyA9IChMZW5JbkJ5dGVzID4+IDYpOworCisgICAgZm9yIChpPVRmVGltZXM7IGk+MDsgaS0tKQorICAgIHsKKyAgICAgICAgTmRpc01vdmVNZW1vcnkocEN0eC0+SW5wdXQsIChVQ0hBUiAqKXBEYXRhLCA2NCk7CisgICAgICAgIGJ5dGVSZXZlcnNlKChVQ0hBUiAqKXBDdHgtPklucHV0LCAxNik7CisKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQgKyA2NCwgMTYpOworICAgICAgICBTSEFUcmFuc2Zvcm0ocEN0eC0+QnVmLCAoVUlOVDMyICopcEN0eC0+SW5wdXQpOworICAgICAgICBwRGF0YSArPSA2NDsKKyAgICAgICAgTGVuSW5CeXRlcyAtPSA2NDsKKyAgICB9IC8vIGVuZCBvZiBmb3IKKworICAgIC8vIGJ1ZmZlcmluZyBsYWNrcyBvZiA2NC1ieXRlIGRhdGEKKyAgICBpZihMZW5JbkJ5dGVzKQorICAgICAgICBOZGlzTW92ZU1lbW9yeShwQ3R4LT5JbnB1dCwgKFVDSEFSICopcERhdGEsIExlbkluQnl0ZXMpOworCisJcmV0dXJuICgwKTsKKworfQorCisvLyBBcHBlbmQgcGFkZGluZyBiaXRzIGFuZCBsZW5ndGggb2Ygb3JpZ2luYWwgbWVzc2FnZSBpbiB0aGUgdGFpbAorLy8gVGhlIG1lc3NhZ2UgZGlnZXN0IGhhcyB0byBiZSBjb21wbGV0ZWQgaW4gdGhlIGVuZAorVk9JRCBTSEFGaW5hbChTSEFfQ1RYICpwQ3R4LCBVQ0hBUiBEaWdlc3RbMjBdKQoreworICAgIFVDSEFSIFJlbWFpbmRlcjsKKyAgICBVQ0hBUiBQYWRMZW5JbkJ5dGVzOworICAgIFVDSEFSICpwQXBwZW5kPTA7CisgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICBSZW1haW5kZXIgPSAoVUNIQVIpKChwQ3R4LT5MZW5JbkJpdENvdW50WzBdID4+IDMpICYgMHgzZik7CisKKyAgICBwQXBwZW5kID0gKFVDSEFSICopcEN0eC0+SW5wdXQgKyBSZW1haW5kZXI7CisKKyAgICBQYWRMZW5JbkJ5dGVzID0gKFJlbWFpbmRlciA8IDU2KSA/ICg1Ni1SZW1haW5kZXIpIDogKDEyMC1SZW1haW5kZXIpOworCisgICAgLy8gcGFkZGluZyBiaXRzIHdpdGhvdXQgY3Jvc3NpbmcgYmxvY2soNjQtYnl0ZSBiYXNlZCkgYm91bmRhcnkKKyAgICBpZiAoUmVtYWluZGVyIDwgNTYpCisgICAgeworICAgICAgICAqcEFwcGVuZCA9IDB4ODA7CisgICAgICAgIFBhZExlbkluQnl0ZXMgLS07CisKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQgKyBSZW1haW5kZXIrMSwgUGFkTGVuSW5CeXRlcyk7CisKKwkJLy8gYWRkIGRhdGEtbGVuZ3RoIGZpZWxkLCBmcm9tIGhpZ2ggdG8gbG93CisgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAJcEN0eC0+SW5wdXRbNTYraV0gPSAoVUNIQVIpKChwQ3R4LT5MZW5JbkJpdENvdW50WzFdID4+ICgoMy1pKSA8PCAzKSkgJiAweGZmKTsKKyAgICAgICAgCXBDdHgtPklucHV0WzYwK2ldID0gKFVDSEFSKSgocEN0eC0+TGVuSW5CaXRDb3VudFswXSA+PiAoKDMtaSkgPDwgMykpICYgMHhmZik7CisgICAgICAJfQorCisgICAgICAgIGJ5dGVSZXZlcnNlKChVQ0hBUiAqKXBDdHgtPklucHV0LCAxNik7CisgICAgICAgIE5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKXBDdHgtPklucHV0ICsgNjQsIDE0KTsKKyAgICAgICAgU0hBVHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKKyAgICB9IC8vIGVuZCBvZiBpZgorCisgICAgLy8gcGFkZGluZyBiaXRzIHdpdGggY3Jvc3NpbmcgYmxvY2soNjQtYnl0ZSBiYXNlZCkgYm91bmRhcnkKKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyB0aGUgZmlyc3QgYmxvY2sgPT09CisgICAgICAgICpwQXBwZW5kID0gMHg4MDsKKyAgICAgICAgUGFkTGVuSW5CeXRlcyAtLTsKKworICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCArIFJlbWFpbmRlcisxLCAoNjQtUmVtYWluZGVyLTEpKTsKKyAgICAgICAgUGFkTGVuSW5CeXRlcyAtPSAoNjQgLSBSZW1haW5kZXIgLSAxKTsKKworICAgICAgICBieXRlUmV2ZXJzZSgoVUNIQVIgKilwQ3R4LT5JbnB1dCwgMTYpOworICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCArIDY0LCAxNik7CisgICAgICAgIFNIQVRyYW5zZm9ybShwQ3R4LT5CdWYsIChVSU5UMzIgKilwQ3R4LT5JbnB1dCk7CisKKworICAgICAgICAvLyB0aGUgc2Vjb25kIGJsb2NrID09PQorICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCwgUGFkTGVuSW5CeXRlcyk7CisKKwkJLy8gYWRkIGRhdGEtbGVuZ3RoIGZpZWxkCisJCWZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAJcEN0eC0+SW5wdXRbNTYraV0gPSAoVUNIQVIpKChwQ3R4LT5MZW5JbkJpdENvdW50WzFdID4+ICgoMy1pKSA8PCAzKSkgJiAweGZmKTsKKyAgICAgICAgCXBDdHgtPklucHV0WzYwK2ldID0gKFVDSEFSKSgocEN0eC0+TGVuSW5CaXRDb3VudFswXSA+PiAoKDMtaSkgPDwgMykpICYgMHhmZik7CisgICAgICAJfQorCisgICAgICAgIGJ5dGVSZXZlcnNlKChVQ0hBUiAqKXBDdHgtPklucHV0LCAxNik7CisgICAgICAgIE5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKXBDdHgtPklucHV0ICsgNjQsIDE2KTsKKyAgICAgICAgU0hBVHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKKyAgICB9IC8vIGVuZCBvZiBlbHNlCisKKworICAgIC8vT3V0cHV0LCBieXRlcmV2ZXJzZQorICAgIGZvciAoaT0wOyBpPDIwOyBpKyspCisgICAgeworICAgICAgICBEaWdlc3QgW2ldID0gKFVDSEFSKShwQ3R4LT5CdWZbaT4+Ml0gPj4gOCooMy0oaSAmIDB4MykpKTsKKyAgICB9CisKKyAgICBOZGlzWmVyb01lbW9yeShwQ3R4LCBzaXplb2YocEN0eCkpOyAvLyBtZW1vcnkgZnJlZQorfQorCisKKy8vIFRoZSBjZW50cmFsIGFsZ29yaXRobSBvZiBTSEEtMSwgY29uc2lzdHMgb2YgZm91ciByb3VuZHMgYW5kCisvLyB0d2VudHkgc3RlcHMgcGVyIHJvdW5kCitWT0lEIFNIQVRyYW5zZm9ybShVSU5UMzIgQnVmWzVdLCBVSU5UMzIgTWVzWzIwXSkKK3sKKyAgICBVSU5UMzIgUmVnWzVdLFRlbXA7CisJdW5zaWduZWQgaW50IGk7CisgICAgVUlOVDMyIFdbODBdOworCisgICAgc3RhdGljIFVJTlQzMiBTSEExVGFibGVbNF0gPSB7IDB4NWE4Mjc5OTksIDB4NmVkOWViYTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ZjFiYmNkYywgMHhjYTYyYzFkNiB9OworCisgICAgUmVnWzBdPUJ1ZlswXTsKKwlSZWdbMV09QnVmWzFdOworCVJlZ1syXT1CdWZbMl07CisJUmVnWzNdPUJ1ZlszXTsKKwlSZWdbNF09QnVmWzRdOworCisgICAgLy90aGUgZmlyc3Qgb2N0ZXQgb2YgYSB3b3JkIGlzIHN0b3JlZCBpbiB0aGUgMHRoIGVsZW1lbnQsIGJ5dGVyZXZlcnNlCisJZm9yKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICB7CisgICAgCVdbaV0gID0gKE1lc1tpXSA+PiAyNCkgJiAweGZmOworICAgICAgICBXW2ldIHw9IChNZXNbaV0gPj4gOCApICYgMHhmZjAwOworICAgICAgICBXW2ldIHw9IChNZXNbaV0gPDwgOCApICYgMHhmZjAwMDA7CisgICAgICAgIFdbaV0gfD0gKE1lc1tpXSA8PCAyNCkgJiAweGZmMDAwMDAwOworICAgIH0KKworCisgICAgZm9yCShpID0gMDsgaSA8IDY0OyBpKyspCisJICAgIFdbMTYraV0gPSBDWUNMSUNfTEVGVF9TSElGVChXW2ldIF4gV1syK2ldIF4gV1s4K2ldIF4gV1sxMytpXSwgMSk7CisKKworICAgIC8vIDgwIHN0ZXBzIGluIFNIQS0xIGFsZ29yaXRobQorICAgIGZvciAoaT0wOyBpPDgwOyBpKyspCisgICAgeworICAgICAgICBpZiAoaTwyMCkKKyAgICAgICAgICAgIFNIQTFTdGVwKFNIQTFfRjEsIFJlZ1swXSwgUmVnWzFdLCBSZWdbMl0sIFJlZ1szXSwgUmVnWzRdLAorICAgICAgICAgICAgICAgICAgICAgV1tpXSwgU0hBMVRhYmxlWzBdKTsKKworICAgICAgICBlbHNlIGlmIChpPj0yMCAmJiBpPDQwKQorICAgICAgICAgICAgU0hBMVN0ZXAoU0hBMV9GMiwgUmVnWzBdLCBSZWdbMV0sIFJlZ1syXSwgUmVnWzNdLCBSZWdbNF0sCisgICAgICAgICAgICAgICAgICAgICBXW2ldLCBTSEExVGFibGVbMV0pOworCisJCWVsc2UgaWYgKGk+PTQwICYmIGk8NjApCisgICAgICAgICAgICBTSEExU3RlcChTSEExX0YzLCBSZWdbMF0sIFJlZ1sxXSwgUmVnWzJdLCBSZWdbM10sIFJlZ1s0XSwKKyAgICAgICAgICAgICAgICAgICAgICBXW2ldLCBTSEExVGFibGVbMl0pOworCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFNIQTFTdGVwKFNIQTFfRjIsIFJlZ1swXSwgUmVnWzFdLCBSZWdbMl0sIFJlZ1szXSwgUmVnWzRdLAorICAgICAgICAgICAgICAgICAgICAgV1tpXSwgU0hBMVRhYmxlWzNdKTsKKworCisgICAgICAgLy8gb25lLXdvcmQgcmlnaHQgc2hpZnQKKwkJVGVtcCAgID0gUmVnWzRdOworICAgICAgICBSZWdbNF0gPSBSZWdbM107CisgICAgICAgIFJlZ1szXSA9IFJlZ1syXTsKKyAgICAgICAgUmVnWzJdID0gUmVnWzFdOworICAgICAgICBSZWdbMV0gPSBSZWdbMF07CisgICAgICAgIFJlZ1swXSA9IFRlbXA7CisKKyAgICB9IC8vIGVuZCBvZiBmb3ItbG9vcAorCisKKyAgICAvLyAodGVtcG9yYXJ5KW91dHB1dAorICAgIGZvciAoaT0wOyBpPDU7IGkrKykKKyAgICAgICAgQnVmW2ldICs9IFJlZ1tpXTsKKworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT0gIEFFUyBFbi9EZWNyeXB0aW9uID09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qIGZvcndhcmQgUy1ib3ggKi8KK3N0YXRpYyB1aW50MzIgRlNiWzI1Nl0gPQoreworCTB4NjMsIDB4N0MsCTB4NzcsIDB4N0IsCTB4RjIsIDB4NkIsCTB4NkYsIDB4QzUsCisJMHgzMCwgMHgwMSwJMHg2NywgMHgyQiwJMHhGRSwgMHhENywJMHhBQiwgMHg3NiwKKwkweENBLCAweDgyLAkweEM5LCAweDdELAkweEZBLCAweDU5LAkweDQ3LCAweEYwLAorCTB4QUQsIDB4RDQsCTB4QTIsIDB4QUYsCTB4OUMsIDB4QTQsCTB4NzIsIDB4QzAsCisJMHhCNywgMHhGRCwJMHg5MywgMHgyNiwJMHgzNiwgMHgzRiwJMHhGNywgMHhDQywKKwkweDM0LCAweEE1LAkweEU1LCAweEYxLAkweDcxLCAweEQ4LAkweDMxLCAweDE1LAorCTB4MDQsIDB4QzcsCTB4MjMsIDB4QzMsCTB4MTgsIDB4OTYsCTB4MDUsIDB4OUEsCisJMHgwNywgMHgxMiwJMHg4MCwgMHhFMiwJMHhFQiwgMHgyNywJMHhCMiwgMHg3NSwKKwkweDA5LCAweDgzLAkweDJDLCAweDFBLAkweDFCLCAweDZFLAkweDVBLCAweEEwLAorCTB4NTIsIDB4M0IsCTB4RDYsIDB4QjMsCTB4MjksIDB4RTMsCTB4MkYsIDB4ODQsCisJMHg1MywgMHhEMSwJMHgwMCwgMHhFRCwJMHgyMCwgMHhGQywJMHhCMSwgMHg1QiwKKwkweDZBLCAweENCLAkweEJFLCAweDM5LAkweDRBLCAweDRDLAkweDU4LCAweENGLAorCTB4RDAsIDB4RUYsCTB4QUEsIDB4RkIsCTB4NDMsIDB4NEQsCTB4MzMsIDB4ODUsCisJMHg0NSwgMHhGOSwJMHgwMiwgMHg3RiwJMHg1MCwgMHgzQywJMHg5RiwgMHhBOCwKKwkweDUxLCAweEEzLAkweDQwLCAweDhGLAkweDkyLCAweDlELAkweDM4LCAweEY1LAorCTB4QkMsIDB4QjYsCTB4REEsIDB4MjEsCTB4MTAsIDB4RkYsCTB4RjMsIDB4RDIsCisJMHhDRCwgMHgwQywJMHgxMywgMHhFQywJMHg1RiwgMHg5NywJMHg0NCwgMHgxNywKKwkweEM0LCAweEE3LAkweDdFLCAweDNELAkweDY0LCAweDVELAkweDE5LCAweDczLAorCTB4NjAsIDB4ODEsCTB4NEYsIDB4REMsCTB4MjIsIDB4MkEsCTB4OTAsIDB4ODgsCisJMHg0NiwgMHhFRSwJMHhCOCwgMHgxNCwJMHhERSwgMHg1RSwJMHgwQiwgMHhEQiwKKwkweEUwLCAweDMyLAkweDNBLCAweDBBLAkweDQ5LCAweDA2LAkweDI0LCAweDVDLAorCTB4QzIsIDB4RDMsCTB4QUMsIDB4NjIsCTB4OTEsIDB4OTUsCTB4RTQsIDB4NzksCisJMHhFNywgMHhDOCwJMHgzNywgMHg2RCwJMHg4RCwgMHhENSwJMHg0RSwgMHhBOSwKKwkweDZDLCAweDU2LAkweEY0LCAweEVBLAkweDY1LCAweDdBLAkweEFFLCAweDA4LAorCTB4QkEsIDB4NzgsCTB4MjUsIDB4MkUsCTB4MUMsIDB4QTYsCTB4QjQsIDB4QzYsCisJMHhFOCwgMHhERCwJMHg3NCwgMHgxRiwJMHg0QiwgMHhCRCwJMHg4QiwgMHg4QSwKKwkweDcwLCAweDNFLAkweEI1LCAweDY2LAkweDQ4LCAweDAzLAkweEY2LCAweDBFLAorCTB4NjEsIDB4MzUsCTB4NTcsIDB4QjksCTB4ODYsIDB4QzEsCTB4MUQsIDB4OUUsCisJMHhFMSwgMHhGOCwJMHg5OCwgMHgxMSwJMHg2OSwgMHhEOSwJMHg4RSwgMHg5NCwKKwkweDlCLCAweDFFLAkweDg3LCAweEU5LAkweENFLCAweDU1LAkweDI4LCAweERGLAorCTB4OEMsIDB4QTEsCTB4ODksIDB4MEQsCTB4QkYsIDB4RTYsCTB4NDIsIDB4NjgsCisJMHg0MSwgMHg5OSwJMHgyRCwgMHgwRiwJMHhCMCwgMHg1NCwJMHhCQiwgMHgxNgorfTsKKworLyogZm9yd2FyZCB0YWJsZSAqLworI2RlZmluZQlGVCBcCitcCisJVihDNiw2Myw2MyxBNSksCVYoRjgsN0MsN0MsODQpLAlWKEVFLDc3LDc3LDk5KSwJVihGNiw3Qiw3Qiw4RCksCVwKKwlWKEZGLEYyLEYyLDBEKSwJVihENiw2Qiw2QixCRCksCVYoREUsNkYsNkYsQjEpLAlWKDkxLEM1LEM1LDU0KSwJXAorCVYoNjAsMzAsMzAsNTApLAlWKDAyLDAxLDAxLDAzKSwJVihDRSw2Nyw2NyxBOSksCVYoNTYsMkIsMkIsN0QpLAlcCisJVihFNyxGRSxGRSwxOSksCVYoQjUsRDcsRDcsNjIpLAlWKDRELEFCLEFCLEU2KSwJVihFQyw3Niw3Niw5QSksCVwKKwlWKDhGLENBLENBLDQ1KSwJVigxRiw4Miw4Miw5RCksCVYoODksQzksQzksNDApLAlWKEZBLDdELDdELDg3KSwJXAorCVYoRUYsRkEsRkEsMTUpLAlWKEIyLDU5LDU5LEVCKSwJVig4RSw0Nyw0NyxDOSksCVYoRkIsRjAsRjAsMEIpLAlcCisJVig0MSxBRCxBRCxFQyksCVYoQjMsRDQsRDQsNjcpLAlWKDVGLEEyLEEyLEZEKSwJVig0NSxBRixBRixFQSksCVwKKwlWKDIzLDlDLDlDLEJGKSwJVig1MyxBNCxBNCxGNyksCVYoRTQsNzIsNzIsOTYpLAlWKDlCLEMwLEMwLDVCKSwJXAorCVYoNzUsQjcsQjcsQzIpLAlWKEUxLEZELEZELDFDKSwJVigzRCw5Myw5MyxBRSksCVYoNEMsMjYsMjYsNkEpLAlcCisJVig2QywzNiwzNiw1QSksCVYoN0UsM0YsM0YsNDEpLAlWKEY1LEY3LEY3LDAyKSwJVig4MyxDQyxDQyw0RiksCVwKKwlWKDY4LDM0LDM0LDVDKSwJVig1MSxBNSxBNSxGNCksCVYoRDEsRTUsRTUsMzQpLAlWKEY5LEYxLEYxLDA4KSwJXAorCVYoRTIsNzEsNzEsOTMpLAlWKEFCLEQ4LEQ4LDczKSwJVig2MiwzMSwzMSw1MyksCVYoMkEsMTUsMTUsM0YpLAlcCisJVigwOCwwNCwwNCwwQyksCVYoOTUsQzcsQzcsNTIpLAlWKDQ2LDIzLDIzLDY1KSwJVig5RCxDMyxDMyw1RSksCVwKKwlWKDMwLDE4LDE4LDI4KSwJVigzNyw5Niw5NixBMSksCVYoMEEsMDUsMDUsMEYpLAlWKDJGLDlBLDlBLEI1KSwJXAorCVYoMEUsMDcsMDcsMDkpLAlWKDI0LDEyLDEyLDM2KSwJVigxQiw4MCw4MCw5QiksCVYoREYsRTIsRTIsM0QpLAlcCisJVihDRCxFQixFQiwyNiksCVYoNEUsMjcsMjcsNjkpLAlWKDdGLEIyLEIyLENEKSwJVihFQSw3NSw3NSw5RiksCVwKKwlWKDEyLDA5LDA5LDFCKSwJVigxRCw4Myw4Myw5RSksCVYoNTgsMkMsMkMsNzQpLAlWKDM0LDFBLDFBLDJFKSwJXAorCVYoMzYsMUIsMUIsMkQpLAlWKERDLDZFLDZFLEIyKSwJVihCNCw1QSw1QSxFRSksCVYoNUIsQTAsQTAsRkIpLAlcCisJVihBNCw1Miw1MixGNiksCVYoNzYsM0IsM0IsNEQpLAlWKEI3LEQ2LEQ2LDYxKSwJVig3RCxCMyxCMyxDRSksCVwKKwlWKDUyLDI5LDI5LDdCKSwJVihERCxFMyxFMywzRSksCVYoNUUsMkYsMkYsNzEpLAlWKDEzLDg0LDg0LDk3KSwJXAorCVYoQTYsNTMsNTMsRjUpLAlWKEI5LEQxLEQxLDY4KSwJVigwMCwwMCwwMCwwMCksCVYoQzEsRUQsRUQsMkMpLAlcCisJVig0MCwyMCwyMCw2MCksCVYoRTMsRkMsRkMsMUYpLAlWKDc5LEIxLEIxLEM4KSwJVihCNiw1Qiw1QixFRCksCVwKKwlWKEQ0LDZBLDZBLEJFKSwJVig4RCxDQixDQiw0NiksCVYoNjcsQkUsQkUsRDkpLAlWKDcyLDM5LDM5LDRCKSwJXAorCVYoOTQsNEEsNEEsREUpLAlWKDk4LDRDLDRDLEQ0KSwJVihCMCw1OCw1OCxFOCksCVYoODUsQ0YsQ0YsNEEpLAlcCisJVihCQixEMCxEMCw2QiksCVYoQzUsRUYsRUYsMkEpLAlWKDRGLEFBLEFBLEU1KSwJVihFRCxGQixGQiwxNiksCVwKKwlWKDg2LDQzLDQzLEM1KSwJVig5QSw0RCw0RCxENyksCVYoNjYsMzMsMzMsNTUpLAlWKDExLDg1LDg1LDk0KSwJXAorCVYoOEEsNDUsNDUsQ0YpLAlWKEU5LEY5LEY5LDEwKSwJVigwNCwwMiwwMiwwNiksCVYoRkUsN0YsN0YsODEpLAlcCisJVihBMCw1MCw1MCxGMCksCVYoNzgsM0MsM0MsNDQpLAlWKDI1LDlGLDlGLEJBKSwJVig0QixBOCxBOCxFMyksCVwKKwlWKEEyLDUxLDUxLEYzKSwJVig1RCxBMyxBMyxGRSksCVYoODAsNDAsNDAsQzApLAlWKDA1LDhGLDhGLDhBKSwJXAorCVYoM0YsOTIsOTIsQUQpLAlWKDIxLDlELDlELEJDKSwJVig3MCwzOCwzOCw0OCksCVYoRjEsRjUsRjUsMDQpLAlcCisJVig2MyxCQyxCQyxERiksCVYoNzcsQjYsQjYsQzEpLAlWKEFGLERBLERBLDc1KSwJVig0MiwyMSwyMSw2MyksCVwKKwlWKDIwLDEwLDEwLDMwKSwJVihFNSxGRixGRiwxQSksCVYoRkQsRjMsRjMsMEUpLAlWKEJGLEQyLEQyLDZEKSwJXAorCVYoODEsQ0QsQ0QsNEMpLAlWKDE4LDBDLDBDLDE0KSwJVigyNiwxMywxMywzNSksCVYoQzMsRUMsRUMsMkYpLAlcCisJVihCRSw1Riw1RixFMSksCVYoMzUsOTcsOTcsQTIpLAlWKDg4LDQ0LDQ0LENDKSwJVigyRSwxNywxNywzOSksCVwKKwlWKDkzLEM0LEM0LDU3KSwJVig1NSxBNyxBNyxGMiksCVYoRkMsN0UsN0UsODIpLAlWKDdBLDNELDNELDQ3KSwJXAorCVYoQzgsNjQsNjQsQUMpLAlWKEJBLDVELDVELEU3KSwJVigzMiwxOSwxOSwyQiksCVYoRTYsNzMsNzMsOTUpLAlcCisJVihDMCw2MCw2MCxBMCksCVYoMTksODEsODEsOTgpLAlWKDlFLDRGLDRGLEQxKSwJVihBMyxEQyxEQyw3RiksCVwKKwlWKDQ0LDIyLDIyLDY2KSwJVig1NCwyQSwyQSw3RSksCVYoM0IsOTAsOTAsQUIpLAlWKDBCLDg4LDg4LDgzKSwJXAorCVYoOEMsNDYsNDYsQ0EpLAlWKEM3LEVFLEVFLDI5KSwJVig2QixCOCxCOCxEMyksCVYoMjgsMTQsMTQsM0MpLAlcCisJVihBNyxERSxERSw3OSksCVYoQkMsNUUsNUUsRTIpLAlWKDE2LDBCLDBCLDFEKSwJVihBRCxEQixEQiw3NiksCVwKKwlWKERCLEUwLEUwLDNCKSwJVig2NCwzMiwzMiw1NiksCVYoNzQsM0EsM0EsNEUpLAlWKDE0LDBBLDBBLDFFKSwJXAorCVYoOTIsNDksNDksREIpLAlWKDBDLDA2LDA2LDBBKSwJVig0OCwyNCwyNCw2QyksCVYoQjgsNUMsNUMsRTQpLAlcCisJVig5RixDMixDMiw1RCksCVYoQkQsRDMsRDMsNkUpLAlWKDQzLEFDLEFDLEVGKSwJVihDNCw2Miw2MixBNiksCVwKKwlWKDM5LDkxLDkxLEE4KSwJVigzMSw5NSw5NSxBNCksCVYoRDMsRTQsRTQsMzcpLAlWKEYyLDc5LDc5LDhCKSwJXAorCVYoRDUsRTcsRTcsMzIpLAlWKDhCLEM4LEM4LDQzKSwJVig2RSwzNywzNyw1OSksCVYoREEsNkQsNkQsQjcpLAlcCisJVigwMSw4RCw4RCw4QyksCVYoQjEsRDUsRDUsNjQpLAlWKDlDLDRFLDRFLEQyKSwJVig0OSxBOSxBOSxFMCksCVwKKwlWKEQ4LDZDLDZDLEI0KSwJVihBQyw1Niw1NixGQSksCVYoRjMsRjQsRjQsMDcpLAlWKENGLEVBLEVBLDI1KSwJXAorCVYoQ0EsNjUsNjUsQUYpLAlWKEY0LDdBLDdBLDhFKSwJVig0NyxBRSxBRSxFOSksCVYoMTAsMDgsMDgsMTgpLAlcCisJVig2RixCQSxCQSxENSksCVYoRjAsNzgsNzgsODgpLAlWKDRBLDI1LDI1LDZGKSwJVig1QywyRSwyRSw3MiksCVwKKwlWKDM4LDFDLDFDLDI0KSwJVig1NyxBNixBNixGMSksCVYoNzMsQjQsQjQsQzcpLAlWKDk3LEM2LEM2LDUxKSwJXAorCVYoQ0IsRTgsRTgsMjMpLAlWKEExLERELERELDdDKSwJVihFOCw3NCw3NCw5QyksCVYoM0UsMUYsMUYsMjEpLAlcCisJVig5Niw0Qiw0QixERCksCVYoNjEsQkQsQkQsREMpLAlWKDBELDhCLDhCLDg2KSwJVigwRiw4QSw4QSw4NSksCVwKKwlWKEUwLDcwLDcwLDkwKSwJVig3QywzRSwzRSw0MiksCVYoNzEsQjUsQjUsQzQpLAlWKENDLDY2LDY2LEFBKSwJXAorCVYoOTAsNDgsNDgsRDgpLAlWKDA2LDAzLDAzLDA1KSwJVihGNyxGNixGNiwwMSksCVYoMUMsMEUsMEUsMTIpLAlcCisJVihDMiw2MSw2MSxBMyksCVYoNkEsMzUsMzUsNUYpLAlWKEFFLDU3LDU3LEY5KSwJVig2OSxCOSxCOSxEMCksCVwKKwlWKDE3LDg2LDg2LDkxKSwJVig5OSxDMSxDMSw1OCksCVYoM0EsMUQsMUQsMjcpLAlWKDI3LDlFLDlFLEI5KSwJXAorCVYoRDksRTEsRTEsMzgpLAlWKEVCLEY4LEY4LDEzKSwJVigyQiw5OCw5OCxCMyksCVYoMjIsMTEsMTEsMzMpLAlcCisJVihEMiw2OSw2OSxCQiksCVYoQTksRDksRDksNzApLAlWKDA3LDhFLDhFLDg5KSwJVigzMyw5NCw5NCxBNyksCVwKKwlWKDJELDlCLDlCLEI2KSwJVigzQywxRSwxRSwyMiksCVYoMTUsODcsODcsOTIpLAlWKEM5LEU5LEU5LDIwKSwJXAorCVYoODcsQ0UsQ0UsNDkpLAlWKEFBLDU1LDU1LEZGKSwJVig1MCwyOCwyOCw3OCksCVYoQTUsREYsREYsN0EpLAlcCisJVigwMyw4Qyw4Qyw4RiksCVYoNTksQTEsQTEsRjgpLAlWKDA5LDg5LDg5LDgwKSwJVigxQSwwRCwwRCwxNyksCVwKKwlWKDY1LEJGLEJGLERBKSwJVihENyxFNixFNiwzMSksCVYoODQsNDIsNDIsQzYpLAlWKEQwLDY4LDY4LEI4KSwJXAorCVYoODIsNDEsNDEsQzMpLAlWKDI5LDk5LDk5LEIwKSwJVig1QSwyRCwyRCw3NyksCVYoMUUsMEYsMEYsMTEpLAlcCisJVig3QixCMCxCMCxDQiksCVYoQTgsNTQsNTQsRkMpLAlWKDZELEJCLEJCLEQ2KSwJVigyQywxNiwxNiwzQSkKKworI2RlZmluZQlWKGEsYixjLGQpIDB4IyNhIyNiIyNjIyNkCitzdGF0aWMgdWludDMyIEZUMFsyNTZdID0geyBGVCB9OworI3VuZGVmIFYKKworI2RlZmluZQlWKGEsYixjLGQpIDB4IyNkIyNhIyNiIyNjCitzdGF0aWMgdWludDMyIEZUMVsyNTZdID0geyBGVCB9OworI3VuZGVmIFYKKworI2RlZmluZQlWKGEsYixjLGQpIDB4IyNjIyNkIyNhIyNiCitzdGF0aWMgdWludDMyIEZUMlsyNTZdID0geyBGVCB9OworI3VuZGVmIFYKKworI2RlZmluZQlWKGEsYixjLGQpIDB4IyNiIyNjIyNkIyNhCitzdGF0aWMgdWludDMyIEZUM1syNTZdID0geyBGVCB9OworI3VuZGVmIFYKKworI3VuZGVmIEZUCisKKy8qIHJldmVyc2UgUy1ib3ggKi8KKworc3RhdGljIHVpbnQzMiBSU2JbMjU2XSA9Cit7CisJMHg1MiwgMHgwOSwJMHg2QSwgMHhENSwJMHgzMCwgMHgzNiwJMHhBNSwgMHgzOCwKKwkweEJGLCAweDQwLAkweEEzLCAweDlFLAkweDgxLCAweEYzLAkweEQ3LCAweEZCLAorCTB4N0MsIDB4RTMsCTB4MzksIDB4ODIsCTB4OUIsIDB4MkYsCTB4RkYsIDB4ODcsCisJMHgzNCwgMHg4RSwJMHg0MywgMHg0NCwJMHhDNCwgMHhERSwJMHhFOSwgMHhDQiwKKwkweDU0LCAweDdCLAkweDk0LCAweDMyLAkweEE2LCAweEMyLAkweDIzLCAweDNELAorCTB4RUUsIDB4NEMsCTB4OTUsIDB4MEIsCTB4NDIsIDB4RkEsCTB4QzMsIDB4NEUsCisJMHgwOCwgMHgyRSwJMHhBMSwgMHg2NiwJMHgyOCwgMHhEOSwJMHgyNCwgMHhCMiwKKwkweDc2LCAweDVCLAkweEEyLCAweDQ5LAkweDZELCAweDhCLAkweEQxLCAweDI1LAorCTB4NzIsIDB4RjgsCTB4RjYsIDB4NjQsCTB4ODYsIDB4NjgsCTB4OTgsIDB4MTYsCisJMHhENCwgMHhBNCwJMHg1QywgMHhDQywJMHg1RCwgMHg2NSwJMHhCNiwgMHg5MiwKKwkweDZDLCAweDcwLAkweDQ4LCAweDUwLAkweEZELCAweEVELAkweEI5LCAweERBLAorCTB4NUUsIDB4MTUsCTB4NDYsIDB4NTcsCTB4QTcsIDB4OEQsCTB4OUQsIDB4ODQsCisJMHg5MCwgMHhEOCwJMHhBQiwgMHgwMCwJMHg4QywgMHhCQywJMHhEMywgMHgwQSwKKwkweEY3LCAweEU0LAkweDU4LCAweDA1LAkweEI4LCAweEIzLAkweDQ1LCAweDA2LAorCTB4RDAsIDB4MkMsCTB4MUUsIDB4OEYsCTB4Q0EsIDB4M0YsCTB4MEYsIDB4MDIsCisJMHhDMSwgMHhBRiwJMHhCRCwgMHgwMywJMHgwMSwgMHgxMywJMHg4QSwgMHg2QiwKKwkweDNBLCAweDkxLAkweDExLCAweDQxLAkweDRGLCAweDY3LAkweERDLCAweEVBLAorCTB4OTcsIDB4RjIsCTB4Q0YsIDB4Q0UsCTB4RjAsIDB4QjQsCTB4RTYsIDB4NzMsCisJMHg5NiwgMHhBQywJMHg3NCwgMHgyMiwJMHhFNywgMHhBRCwJMHgzNSwgMHg4NSwKKwkweEUyLCAweEY5LAkweDM3LCAweEU4LAkweDFDLCAweDc1LAkweERGLCAweDZFLAorCTB4NDcsIDB4RjEsCTB4MUEsIDB4NzEsCTB4MUQsIDB4MjksCTB4QzUsIDB4ODksCisJMHg2RiwgMHhCNywJMHg2MiwgMHgwRSwJMHhBQSwgMHgxOCwJMHhCRSwgMHgxQiwKKwkweEZDLCAweDU2LAkweDNFLCAweDRCLAkweEM2LCAweEQyLAkweDc5LCAweDIwLAorCTB4OUEsIDB4REIsCTB4QzAsIDB4RkUsCTB4NzgsIDB4Q0QsCTB4NUEsIDB4RjQsCisJMHgxRiwgMHhERCwJMHhBOCwgMHgzMywJMHg4OCwgMHgwNywJMHhDNywgMHgzMSwKKwkweEIxLCAweDEyLAkweDEwLCAweDU5LAkweDI3LCAweDgwLAkweEVDLCAweDVGLAorCTB4NjAsIDB4NTEsCTB4N0YsIDB4QTksCTB4MTksIDB4QjUsCTB4NEEsIDB4MEQsCisJMHgyRCwgMHhFNSwJMHg3QSwgMHg5RiwJMHg5MywgMHhDOSwJMHg5QywgMHhFRiwKKwkweEEwLCAweEUwLAkweDNCLCAweDRELAkweEFFLCAweDJBLAkweEY1LCAweEIwLAorCTB4QzgsIDB4RUIsCTB4QkIsIDB4M0MsCTB4ODMsIDB4NTMsCTB4OTksIDB4NjEsCisJMHgxNywgMHgyQiwJMHgwNCwgMHg3RSwJMHhCQSwgMHg3NywJMHhENiwgMHgyNiwKKwkweEUxLCAweDY5LAkweDE0LCAweDYzLAkweDU1LCAweDIxLAkweDBDLCAweDdECit9OworCisvKiByZXZlcnNlIHRhYmxlICovCisKKyNkZWZpbmUJUlQgXAorXAorCVYoNTEsRjQsQTcsNTApLAlWKDdFLDQxLDY1LDUzKSwJVigxQSwxNyxBNCxDMyksCVYoM0EsMjcsNUUsOTYpLAlcCisJVigzQixBQiw2QixDQiksCVYoMUYsOUQsNDUsRjEpLAlWKEFDLEZBLDU4LEFCKSwJVig0QixFMywwMyw5MyksCVwKKwlWKDIwLDMwLEZBLDU1KSwJVihBRCw3Niw2RCxGNiksCVYoODgsQ0MsNzYsOTEpLAlWKEY1LDAyLDRDLDI1KSwJXAorCVYoNEYsRTUsRDcsRkMpLAlWKEM1LDJBLENCLEQ3KSwJVigyNiwzNSw0NCw4MCksCVYoQjUsNjIsQTMsOEYpLAlcCisJVihERSxCMSw1QSw0OSksCVYoMjUsQkEsMUIsNjcpLAlWKDQ1LEVBLDBFLDk4KSwJVig1RCxGRSxDMCxFMSksCVwKKwlWKEMzLDJGLDc1LDAyKSwJVig4MSw0QyxGMCwxMiksCVYoOEQsNDYsOTcsQTMpLAlWKDZCLEQzLEY5LEM2KSwJXAorCVYoMDMsOEYsNUYsRTcpLAlWKDE1LDkyLDlDLDk1KSwJVihCRiw2RCw3QSxFQiksCVYoOTUsNTIsNTksREEpLAlcCisJVihENCxCRSw4MywyRCksCVYoNTgsNzQsMjEsRDMpLAlWKDQ5LEUwLDY5LDI5KSwJVig4RSxDOSxDOCw0NCksCVwKKwlWKDc1LEMyLDg5LDZBKSwJVihGNCw4RSw3OSw3OCksCVYoOTksNTgsM0UsNkIpLAlWKDI3LEI5LDcxLEREKSwJXAorCVYoQkUsRTEsNEYsQjYpLAlWKEYwLDg4LEFELDE3KSwJVihDOSwyMCxBQyw2NiksCVYoN0QsQ0UsM0EsQjQpLAlcCisJVig2MyxERiw0QSwxOCksCVYoRTUsMUEsMzEsODIpLAlWKDk3LDUxLDMzLDYwKSwJVig2Miw1Myw3Riw0NSksCVwKKwlWKEIxLDY0LDc3LEUwKSwJVihCQiw2QixBRSw4NCksCVYoRkUsODEsQTAsMUMpLAlWKEY5LDA4LDJCLDk0KSwJXAorCVYoNzAsNDgsNjgsNTgpLAlWKDhGLDQ1LEZELDE5KSwJVig5NCxERSw2Qyw4NyksCVYoNTIsN0IsRjgsQjcpLAlcCisJVihBQiw3MyxEMywyMyksCVYoNzIsNEIsMDIsRTIpLAlWKEUzLDFGLDhGLDU3KSwJVig2Niw1NSxBQiwyQSksCVwKKwlWKEIyLEVCLDI4LDA3KSwJVigyRixCNSxDMiwwMyksCVYoODYsQzUsN0IsOUEpLAlWKEQzLDM3LDA4LEE1KSwJXAorCVYoMzAsMjgsODcsRjIpLAlWKDIzLEJGLEE1LEIyKSwJVigwMiwwMyw2QSxCQSksCVYoRUQsMTYsODIsNUMpLAlcCisJVig4QSxDRiwxQywyQiksCVYoQTcsNzksQjQsOTIpLAlWKEYzLDA3LEYyLEYwKSwJVig0RSw2OSxFMixBMSksCVwKKwlWKDY1LERBLEY0LENEKSwJVigwNiwwNSxCRSxENSksCVYoRDEsMzQsNjIsMUYpLAlWKEM0LEE2LEZFLDhBKSwJXAorCVYoMzQsMkUsNTMsOUQpLAlWKEEyLEYzLDU1LEEwKSwJVigwNSw4QSxFMSwzMiksCVYoQTQsRjYsRUIsNzUpLAlcCisJVigwQiw4MyxFQywzOSksCVYoNDAsNjAsRUYsQUEpLAlWKDVFLDcxLDlGLDA2KSwJVihCRCw2RSwxMCw1MSksCVwKKwlWKDNFLDIxLDhBLEY5KSwJVig5NixERCwwNiwzRCksCVYoREQsM0UsMDUsQUUpLAlWKDRELEU2LEJELDQ2KSwJXAorCVYoOTEsNTQsOEQsQjUpLAlWKDcxLEM0LDVELDA1KSwJVigwNCwwNixENCw2RiksCVYoNjAsNTAsMTUsRkYpLAlcCisJVigxOSw5OCxGQiwyNCksCVYoRDYsQkQsRTksOTcpLAlWKDg5LDQwLDQzLENDKSwJVig2NyxEOSw5RSw3NyksCVwKKwlWKEIwLEU4LDQyLEJEKSwJVigwNyw4OSw4Qiw4OCksCVYoRTcsMTksNUIsMzgpLAlWKDc5LEM4LEVFLERCKSwJXAorCVYoQTEsN0MsMEEsNDcpLAlWKDdDLDQyLDBGLEU5KSwJVihGOCw4NCwxRSxDOSksCVYoMDAsMDAsMDAsMDApLAlcCisJVigwOSw4MCw4Niw4MyksCVYoMzIsMkIsRUQsNDgpLAlWKDFFLDExLDcwLEFDKSwJVig2Qyw1QSw3Miw0RSksCVwKKwlWKEZELDBFLEZGLEZCKSwJVigwRiw4NSwzOCw1NiksCVYoM0QsQUUsRDUsMUUpLAlWKDM2LDJELDM5LDI3KSwJXAorCVYoMEEsMEYsRDksNjQpLAlWKDY4LDVDLEE2LDIxKSwJVig5Qiw1Qiw1NCxEMSksCVYoMjQsMzYsMkUsM0EpLAlcCisJVigwQywwQSw2NyxCMSksCVYoOTMsNTcsRTcsMEYpLAlWKEI0LEVFLDk2LEQyKSwJVigxQiw5Qiw5MSw5RSksCVwKKwlWKDgwLEMwLEM1LDRGKSwJVig2MSxEQywyMCxBMiksCVYoNUEsNzcsNEIsNjkpLAlWKDFDLDEyLDFBLDE2KSwJXAorCVYoRTIsOTMsQkEsMEEpLAlWKEMwLEEwLDJBLEU1KSwJVigzQywyMixFMCw0MyksCVYoMTIsMUIsMTcsMUQpLAlcCisJVigwRSwwOSwwRCwwQiksCVYoRjIsOEIsQzcsQUQpLAlWKDJELEI2LEE4LEI5KSwJVigxNCwxRSxBOSxDOCksCVwKKwlWKDU3LEYxLDE5LDg1KSwJVihBRiw3NSwwNyw0QyksCVYoRUUsOTksREQsQkIpLAlWKEEzLDdGLDYwLEZEKSwJXAorCVYoRjcsMDEsMjYsOUYpLAlWKDVDLDcyLEY1LEJDKSwJVig0NCw2NiwzQixDNSksCVYoNUIsRkIsN0UsMzQpLAlcCisJVig4Qiw0MywyOSw3NiksCVYoQ0IsMjMsQzYsREMpLAlWKEI2LEVELEZDLDY4KSwJVihCOCxFNCxGMSw2MyksCVwKKwlWKEQ3LDMxLERDLENBKSwJVig0Miw2Myw4NSwxMCksCVYoMTMsOTcsMjIsNDApLAlWKDg0LEM2LDExLDIwKSwJXAorCVYoODUsNEEsMjQsN0QpLAlWKEQyLEJCLDNELEY4KSwJVihBRSxGOSwzMiwxMSksCVYoQzcsMjksQTEsNkQpLAlcCisJVigxRCw5RSwyRiw0QiksCVYoREMsQjIsMzAsRjMpLAlWKDBELDg2LDUyLEVDKSwJVig3NyxDMSxFMyxEMCksCVwKKwlWKDJCLEIzLDE2LDZDKSwJVihBOSw3MCxCOSw5OSksCVYoMTEsOTQsNDgsRkEpLAlWKDQ3LEU5LDY0LDIyKSwJXAorCVYoQTgsRkMsOEMsQzQpLAlWKEEwLEYwLDNGLDFBKSwJVig1Niw3RCwyQyxEOCksCVYoMjIsMzMsOTAsRUYpLAlcCisJVig4Nyw0OSw0RSxDNyksCVYoRDksMzgsRDEsQzEpLAlWKDhDLENBLEEyLEZFKSwJVig5OCxENCwwQiwzNiksCVwKKwlWKEE2LEY1LDgxLENGKSwJVihBNSw3QSxERSwyOCksCVYoREEsQjcsOEUsMjYpLAlWKDNGLEFELEJGLEE0KSwJXAorCVYoMkMsM0EsOUQsRTQpLAlWKDUwLDc4LDkyLDBEKSwJVig2QSw1RixDQyw5QiksCVYoNTQsN0UsNDYsNjIpLAlcCisJVihGNiw4RCwxMyxDMiksCVYoOTAsRDgsQjgsRTgpLAlWKDJFLDM5LEY3LDVFKSwJVig4MixDMyxBRixGNSksCVwKKwlWKDlGLDVELDgwLEJFKSwJVig2OSxEMCw5Myw3QyksCVYoNkYsRDUsMkQsQTkpLAlWKENGLDI1LDEyLEIzKSwJXAorCVYoQzgsQUMsOTksM0IpLAlWKDEwLDE4LDdELEE3KSwJVihFOCw5Qyw2Myw2RSksCVYoREIsM0IsQkIsN0IpLAlcCisJVihDRCwyNiw3OCwwOSksCVYoNkUsNTksMTgsRjQpLAlWKEVDLDlBLEI3LDAxKSwJVig4Myw0Riw5QSxBOCksCVwKKwlWKEU2LDk1LDZFLDY1KSwJVihBQSxGRixFNiw3RSksCVYoMjEsQkMsQ0YsMDgpLAlWKEVGLDE1LEU4LEU2KSwJXAorCVYoQkEsRTcsOUIsRDkpLAlWKDRBLDZGLDM2LENFKSwJVihFQSw5RiwwOSxENCksCVYoMjksQjAsN0MsRDYpLAlcCisJVigzMSxBNCxCMixBRiksCVYoMkEsM0YsMjMsMzEpLAlWKEM2LEE1LDk0LDMwKSwJVigzNSxBMiw2NixDMCksCVwKKwlWKDc0LDRFLEJDLDM3KSwJVihGQyw4MixDQSxBNiksCVYoRTAsOTAsRDAsQjApLAlWKDMzLEE3LEQ4LDE1KSwJXAorCVYoRjEsMDQsOTgsNEEpLAlWKDQxLEVDLERBLEY3KSwJVig3RixDRCw1MCwwRSksCVYoMTcsOTEsRjYsMkYpLAlcCisJVig3Niw0RCxENiw4RCksCVYoNDMsRUYsQjAsNEQpLAlWKENDLEFBLDRELDU0KSwJVihFNCw5NiwwNCxERiksCVwKKwlWKDlFLEQxLEI1LEUzKSwJVig0Qyw2QSw4OCwxQiksCVYoQzEsMkMsMUYsQjgpLAlWKDQ2LDY1LDUxLDdGKSwJXAorCVYoOUQsNUUsRUEsMDQpLAlWKDAxLDhDLDM1LDVEKSwJVihGQSw4Nyw3NCw3MyksCVYoRkIsMEIsNDEsMkUpLAlcCisJVihCMyw2NywxRCw1QSksCVYoOTIsREIsRDIsNTIpLAlWKEU5LDEwLDU2LDMzKSwJVig2RCxENiw0NywxMyksCVwKKwlWKDlBLEQ3LDYxLDhDKSwJVigzNyxBMSwwQyw3QSksCVYoNTksRjgsMTQsOEUpLAlWKEVCLDEzLDNDLDg5KSwJXAorCVYoQ0UsQTksMjcsRUUpLAlWKEI3LDYxLEM5LDM1KSwJVihFMSwxQyxFNSxFRCksCVYoN0EsNDcsQjEsM0MpLAlcCisJVig5QyxEMixERiw1OSksCVYoNTUsRjIsNzMsM0YpLAlWKDE4LDE0LENFLDc5KSwJVig3MyxDNywzNyxCRiksCVwKKwlWKDUzLEY3LENELEVBKSwJVig1RixGRCxBQSw1QiksCVYoREYsM0QsNkYsMTQpLAlWKDc4LDQ0LERCLDg2KSwJXAorCVYoQ0EsQUYsRjMsODEpLAlWKEI5LDY4LEM0LDNFKSwJVigzOCwyNCwzNCwyQyksCVYoQzIsQTMsNDAsNUYpLAlcCisJVigxNiwxRCxDMyw3MiksCVYoQkMsRTIsMjUsMEMpLAlWKDI4LDNDLDQ5LDhCKSwJVihGRiwwRCw5NSw0MSksCVwKKwlWKDM5LEE4LDAxLDcxKSwJVigwOCwwQyxCMyxERSksCVYoRDgsQjQsRTQsOUMpLAlWKDY0LDU2LEMxLDkwKSwJXAorCVYoN0IsQ0IsODQsNjEpLAlWKEQ1LDMyLEI2LDcwKSwJVig0OCw2Qyw1Qyw3NCksCVYoRDAsQjgsNTcsNDIpCisKKyNkZWZpbmUJVihhLGIsYyxkKSAweCMjYSMjYiMjYyMjZAorc3RhdGljIHVpbnQzMiBSVDBbMjU2XSA9IHsgUlQgfTsKKyN1bmRlZiBWCisKKyNkZWZpbmUJVihhLGIsYyxkKSAweCMjZCMjYSMjYiMjYworc3RhdGljIHVpbnQzMiBSVDFbMjU2XSA9IHsgUlQgfTsKKyN1bmRlZiBWCisKKyNkZWZpbmUJVihhLGIsYyxkKSAweCMjYyMjZCMjYSMjYgorc3RhdGljIHVpbnQzMiBSVDJbMjU2XSA9IHsgUlQgfTsKKyN1bmRlZiBWCisKKyNkZWZpbmUJVihhLGIsYyxkKSAweCMjYiMjYyMjZCMjYQorc3RhdGljIHVpbnQzMiBSVDNbMjU2XSA9IHsgUlQgfTsKKyN1bmRlZiBWCisKKyN1bmRlZiBSVAorCisvKiByb3VuZCBjb25zdGFudHMgKi8KKworc3RhdGljIHVpbnQzMiBSQ09OWzEwXSA9Cit7CisJMHgwMTAwMDAwMCwJMHgwMjAwMDAwMCwJMHgwNDAwMDAwMCwJMHgwODAwMDAwMCwKKwkweDEwMDAwMDAwLAkweDIwMDAwMDAwLAkweDQwMDAwMDAwLAkweDgwMDAwMDAwLAorCTB4MUIwMDAwMDAsCTB4MzYwMDAwMDAKK307CisKKy8qIGtleSBzY2hlZHVsZQl0YWJsZXMgKi8KKworc3RhdGljIGludCBLVF9pbml0ID0gMTsKKworc3RhdGljIHVpbnQzMiBLVDBbMjU2XTsKK3N0YXRpYyB1aW50MzIgS1QxWzI1Nl07CitzdGF0aWMgdWludDMyIEtUMlsyNTZdOworc3RhdGljIHVpbnQzMiBLVDNbMjU2XTsKKworLyogcGxhdGZvcm0taW5kZXBlbmRhbnQJMzItYml0IGludGVnZXIgbWFuaXB1bGF0aW9uCW1hY3JvcyAqLworCisjZGVmaW5lCUdFVF9VSU5UMzIobixiLGkpCQkJCQkJXAorewkJCQkJCQkJCQkJCVwKKwkobikJPSAoCSh1aW50MzIpIChiKVsoaSkJXSA8PCAyNAkpCQlcCisJCXwgKAkodWludDMyKSAoYilbKGkpICsgMV0gPDwgMTYJKQkJXAorCQl8ICgJKHVpbnQzMikgKGIpWyhpKSArIDJdIDw8ICA4CSkJCVwKKwkJfCAoCSh1aW50MzIpIChiKVsoaSkgKyAzXQkJKTsJCVwKK30KKworI2RlZmluZQlQVVRfVUlOVDMyKG4sYixpKQkJCQkJCVwKK3sJCQkJCQkJCQkJCQlcCisJKGIpWyhpKQkgICBdID0gKHVpbnQ4KSAoIChuKSA+PgkyNCApOwkJXAorCShiKVsoaSkJKyAxXSA9ICh1aW50OCkgKCAobikgPj4JMTYgKTsJCVwKKwkoYilbKGkpCSsgMl0gPSAodWludDgpICggKG4pID4+CSA4ICk7CQlcCisJKGIpWyhpKQkrIDNdID0gKHVpbnQ4KSAoIChuKQkgICApOwkJXAorfQorCisvKiBBRVMga2V5IHNjaGVkdWxpbmcgcm91dGluZSAqLworCitpbnQJcnRtcF9hZXNfc2V0X2tleSggYWVzX2NvbnRleHQgKmN0eCwgdWludDggKmtleSwgaW50IG5iaXRzICkKK3sKKwlpbnQJaTsKKwl1aW50MzIgKlJLLAkqU0s7CisKKwlzd2l0Y2goCW5iaXRzICkKKwl7CisJCWNhc2UgMTI4OiBjdHgtPm5yID0JMTA7CWJyZWFrOworCQljYXNlIDE5MjogY3R4LT5uciA9CTEyOwlicmVhazsKKwkJY2FzZSAyNTY6IGN0eC0+bnIgPQkxNDsJYnJlYWs7CisJCWRlZmF1bHQJOiByZXR1cm4oIDEJKTsKKwl9CisKKwlSSyA9IGN0eC0+ZXJrOworCisJZm9yKCBpID0gMDsJaSA8CShuYml0cyA+PiA1KTsgaSsrICkKKwl7CisJCUdFVF9VSU5UMzIoCVJLW2ldLCBrZXksCWkgKgk0ICk7CisJfQorCisJLyogc2V0dXAgZW5jcnlwdGlvbglyb3VuZCBrZXlzICovCisKKwlzd2l0Y2goCW5iaXRzICkKKwl7CisJY2FzZSAxMjg6CisKKwkJZm9yKCBpID0gMDsJaSA8CTEwOwlpKyssIFJLCSs9IDQgKQorCQl7CisJCQlSS1s0XSAgPSBSS1swXSBeIFJDT05baV0gXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1szXSA+PiAxNiApIF0gPDwJMjQgKSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzNdID4+ICA4ICkgXSA8PAkxNiApIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbM10JCSApIF0gPDwJIDggKSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzNdID4+IDI0ICkgXQkgICApOworCisJCQlSS1s1XSAgPSBSS1sxXSBeIFJLWzRdOworCQkJUktbNl0gID0gUktbMl0gXiBSS1s1XTsKKwkJCVJLWzddICA9IFJLWzNdIF4gUktbNl07CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDE5MjoKKworCQlmb3IoIGkgPSAwOwlpIDwJODsgaSsrLAlSSyArPSA2CSkKKwkJeworCQkJUktbNl0gID0gUktbMF0gXiBSQ09OW2ldIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbNV0gPj4gMTYgKSBdIDw8CTI0ICkgXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s1XSA+PiAgOCApIF0gPDwJMTYgKSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzVdCQkgKSBdIDw8CSA4ICkgXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s1XSA+PiAyNCApIF0JICAgKTsKKworCQkJUktbN10gID0gUktbMV0gXiBSS1s2XTsKKwkJCVJLWzhdICA9IFJLWzJdIF4gUktbN107CisJCQlSS1s5XSAgPSBSS1szXSBeIFJLWzhdOworCQkJUktbMTBdID0gUktbNF0gXiBSS1s5XTsKKwkJCVJLWzExXSA9IFJLWzVdIF4gUktbMTBdOworCQl9CisJCWJyZWFrOworCisJY2FzZSAyNTY6CisKKwkJZm9yKCBpID0gMDsJaSA8CTc7IGkrKywJUksgKz0gOAkpCisJCXsKKwkJCVJLWzhdICA9IFJLWzBdIF4gUkNPTltpXSBeCisJCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzddID4+IDE2ICkgXSA8PAkyNCApIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbN10gPj4gIDggKSBdIDw8CTE2ICkgXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s3XQkJICkgXSA8PAkgOCApIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbN10gPj4gMjQgKSBdCSAgICk7CisKKwkJCVJLWzldICA9IFJLWzFdIF4gUktbOF07CisJCQlSS1sxMF0gPSBSS1syXSBeIFJLWzldOworCQkJUktbMTFdID0gUktbM10gXiBSS1sxMF07CisKKwkJCVJLWzEyXSA9IFJLWzRdIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbMTFdCT4+IDI0ICkJXSA8PCAyNAkpIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbMTFdCT4+IDE2ICkJXSA8PCAxNgkpIF4KKwkJCQkJCSggRlNiWyAodWludDgpICggUktbMTFdCT4+CTggKQldIDw8ICA4CSkgXgorCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1sxMV0JCSAgKQldCQkpOworCisJCQlSS1sxM10gPSBSS1s1XSBeIFJLWzEyXTsKKwkJCVJLWzE0XSA9IFJLWzZdIF4gUktbMTNdOworCQkJUktbMTVdID0gUktbN10gXiBSS1sxNF07CisJCX0KKwkJYnJlYWs7CisJfQorCisJLyogc2V0dXAgZGVjcnlwdGlvbglyb3VuZCBrZXlzICovCisKKwlpZigJS1RfaW5pdAkpCisJeworCQlmb3IoIGkgPSAwOwlpIDwJMjU2OyBpKysgKQorCQl7CisJCQlLVDBbaV0gPSBSVDBbIEZTYltpXSBdOworCQkJS1QxW2ldID0gUlQxWyBGU2JbaV0gXTsKKwkJCUtUMltpXSA9IFJUMlsgRlNiW2ldIF07CisJCQlLVDNbaV0gPSBSVDNbIEZTYltpXSBdOworCQl9CisKKwkJS1RfaW5pdAk9IDA7CisJfQorCisJU0sgPSBjdHgtPmRyazsKKworCSpTSysrID0JKlJLKys7CisJKlNLKysgPQkqUksrKzsKKwkqU0srKyA9CSpSSysrOworCSpTSysrID0JKlJLKys7CisKKwlmb3IoIGkgPSAxOwlpIDwJY3R4LT5ucjsgaSsrICkKKwl7CisJCVJLIC09IDg7CisKKwkJKlNLKysgPQlLVDBbICh1aW50OCkgKCAqUksgPj4gMjQgKSBdIF4KKwkJCQlLVDFbICh1aW50OCkgKCAqUksgPj4gMTYgKSBdIF4KKwkJCQlLVDJbICh1aW50OCkgKCAqUksgPj4gIDggKSBdIF4KKwkJCQlLVDNbICh1aW50OCkgKCAqUksJCSApIF07IFJLKys7CisKKwkJKlNLKysgPQlLVDBbICh1aW50OCkgKCAqUksgPj4gMjQgKSBdIF4KKwkJCQlLVDFbICh1aW50OCkgKCAqUksgPj4gMTYgKSBdIF4KKwkJCQlLVDJbICh1aW50OCkgKCAqUksgPj4gIDggKSBdIF4KKwkJCQlLVDNbICh1aW50OCkgKCAqUksJCSApIF07IFJLKys7CisKKwkJKlNLKysgPQlLVDBbICh1aW50OCkgKCAqUksgPj4gMjQgKSBdIF4KKwkJCQlLVDFbICh1aW50OCkgKCAqUksgPj4gMTYgKSBdIF4KKwkJCQlLVDJbICh1aW50OCkgKCAqUksgPj4gIDggKSBdIF4KKwkJCQlLVDNbICh1aW50OCkgKCAqUksJCSApIF07IFJLKys7CisKKwkJKlNLKysgPQlLVDBbICh1aW50OCkgKCAqUksgPj4gMjQgKSBdIF4KKwkJCQlLVDFbICh1aW50OCkgKCAqUksgPj4gMTYgKSBdIF4KKwkJCQlLVDJbICh1aW50OCkgKCAqUksgPj4gIDggKSBdIF4KKwkJCQlLVDNbICh1aW50OCkgKCAqUksJCSApIF07IFJLKys7CisJfQorCisJUksgLT0gODsKKworCSpTSysrID0JKlJLKys7CisJKlNLKysgPQkqUksrKzsKKwkqU0srKyA9CSpSSysrOworCSpTSysrID0JKlJLKys7CisKKwlyZXR1cm4oCTAgKTsKK30KKworLyogQUVTIDEyOC1iaXQgYmxvY2sgZW5jcnlwdGlvbglyb3V0aW5lCSovCisKK3ZvaWQgcnRtcF9hZXNfZW5jcnlwdChhZXNfY29udGV4dCAqY3R4LCB1aW50OCBpbnB1dFsxNl0sCXVpbnQ4IG91dHB1dFsxNl0gKQoreworCXVpbnQzMiAqUkssCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMzsKKworCVJLID0gY3R4LT5lcms7CisJR0VUX1VJTlQzMigJWDAsCWlucHV0LAkwICk7IFgwCV49IFJLWzBdOworCUdFVF9VSU5UMzIoCVgxLAlpbnB1dCwJNCApOyBYMQlePSBSS1sxXTsKKwlHRVRfVUlOVDMyKAlYMiwJaW5wdXQsCTggKTsgWDIJXj0gUktbMl07CisJR0VUX1VJTlQzMigJWDMsCWlucHV0LCAxMiApOyBYMwlePSBSS1szXTsKKworI2RlZmluZQlBRVNfRlJPVU5EKFgwLFgxLFgyLFgzLFkwLFkxLFkyLFkzKQkJXAorewkJCQkJCQkJCQkJCVwKKwlSSyArPSA0OwkJCQkJCQkJCVwKKwkJCQkJCQkJCQkJCVwKKwlYMCA9IFJLWzBdIF4gRlQwWyAodWludDgpICgJWTAgPj4gMjQgKSBdIF4JXAorCQkJCSBGVDFbICh1aW50OCkgKAlZMSA+PiAxNiApIF0gXglcCisJCQkJIEZUMlsgKHVpbnQ4KSAoCVkyID4+ICA4ICkgXSBeCVwKKwkJCQkgRlQzWyAodWludDgpICgJWTMJCSApIF07CVwKKwkJCQkJCQkJCQkJCVwKKwlYMSA9IFJLWzFdIF4gRlQwWyAodWludDgpICgJWTEgPj4gMjQgKSBdIF4JXAorCQkJCSBGVDFbICh1aW50OCkgKAlZMiA+PiAxNiApIF0gXglcCisJCQkJIEZUMlsgKHVpbnQ4KSAoCVkzID4+ICA4ICkgXSBeCVwKKwkJCQkgRlQzWyAodWludDgpICgJWTAJCSApIF07CVwKKwkJCQkJCQkJCQkJCVwKKwlYMiA9IFJLWzJdIF4gRlQwWyAodWludDgpICgJWTIgPj4gMjQgKSBdIF4JXAorCQkJCSBGVDFbICh1aW50OCkgKAlZMyA+PiAxNiApIF0gXglcCisJCQkJIEZUMlsgKHVpbnQ4KSAoCVkwID4+ICA4ICkgXSBeCVwKKwkJCQkgRlQzWyAodWludDgpICgJWTEJCSApIF07CVwKKwkJCQkJCQkJCQkJCVwKKwlYMyA9IFJLWzNdIF4gRlQwWyAodWludDgpICgJWTMgPj4gMjQgKSBdIF4JXAorCQkJCSBGVDFbICh1aW50OCkgKAlZMCA+PiAxNiApIF0gXglcCisJCQkJIEZUMlsgKHVpbnQ4KSAoCVkxID4+ICA4ICkgXSBeCVwKKwkJCQkgRlQzWyAodWludDgpICgJWTIJCSApIF07CVwKK30KKworCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgMSAqLworCUFFU19GUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkJLyogcm91bmQgMiAqLworCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgMyAqLworCUFFU19GUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkJLyogcm91bmQgNCAqLworCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgNSAqLworCUFFU19GUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkJLyogcm91bmQgNiAqLworCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgNyAqLworCUFFU19GUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkJLyogcm91bmQgOCAqLworCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgOSAqLworCisJaWYoCWN0eC0+bnIJPiAxMCApCisJeworCQlBRVNfRlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJLyogcm91bmQgMTAJKi8KKwkJQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CS8qIHJvdW5kIDExCSovCisJfQorCisJaWYoCWN0eC0+bnIJPiAxMiApCisJeworCQlBRVNfRlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJLyogcm91bmQgMTIJKi8KKwkJQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CS8qIHJvdW5kIDEzCSovCisJfQorCisJLyogbGFzdAlyb3VuZCAqLworCisJUksgKz0gNDsKKworCVgwID0gUktbMF0gXiAoIEZTYlsJKHVpbnQ4KQkoIFkwID4+CTI0ICkgXSA8PCAyNCApIF4KKwkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMSA+PgkxNiApIF0gPDwgMTYgKSBeCisJCQkJICggRlNiWwkodWludDgpCSggWTIgPj4JIDggKSBdIDw8ICA4ICkgXgorCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkzCSAgICkgXQkJICk7CisKKwlYMSA9IFJLWzFdIF4gKCBGU2JbCSh1aW50OCkJKCBZMSA+PgkyNCApIF0gPDwgMjQgKSBeCisJCQkJICggRlNiWwkodWludDgpCSggWTIgPj4JMTYgKSBdIDw8IDE2ICkgXgorCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkzID4+CSA4ICkgXSA8PCAgOCApIF4KKwkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMAkgICApIF0JCSApOworCisJWDIgPSBSS1syXSBeICggRlNiWwkodWludDgpCSggWTIgPj4JMjQgKSBdIDw8IDI0ICkgXgorCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkzID4+CTE2ICkgXSA8PCAxNiApIF4KKwkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMCA+PgkgOCApIF0gPDwgIDggKSBeCisJCQkJICggRlNiWwkodWludDgpCSggWTEJICAgKSBdCQkgKTsKKworCVgzID0gUktbM10gXiAoIEZTYlsJKHVpbnQ4KQkoIFkzID4+CTI0ICkgXSA8PCAyNCApIF4KKwkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMCA+PgkxNiApIF0gPDwgMTYgKSBeCisJCQkJICggRlNiWwkodWludDgpCSggWTEgPj4JIDggKSBdIDw8ICA4ICkgXgorCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkyCSAgICkgXQkJICk7CisKKwlQVVRfVUlOVDMyKAlYMCwJb3V0cHV0LAkgMCApOworCVBVVF9VSU5UMzIoCVgxLAlvdXRwdXQsCSA0ICk7CisJUFVUX1VJTlQzMigJWDIsCW91dHB1dCwJIDggKTsKKwlQVVRfVUlOVDMyKAlYMywJb3V0cHV0LAkxMiApOworfQorCisvKiBBRVMgMTI4LWJpdCBibG9jayBkZWNyeXB0aW9uCXJvdXRpbmUJKi8KKwordm9pZCBydG1wX2Flc19kZWNyeXB0KCBhZXNfY29udGV4dCAqY3R4LAl1aW50OCBpbnB1dFsxNl0sIHVpbnQ4IG91dHB1dFsxNl0gKQoreworCXVpbnQzMiAqUkssCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMzsKKworCVJLID0gY3R4LT5kcms7CisKKwlHRVRfVUlOVDMyKAlYMCwJaW5wdXQsCTAgKTsgWDAJXj0gUktbMF07CisJR0VUX1VJTlQzMigJWDEsCWlucHV0LAk0ICk7IFgxCV49IFJLWzFdOworCUdFVF9VSU5UMzIoCVgyLAlpbnB1dCwJOCApOyBYMglePSBSS1syXTsKKwlHRVRfVUlOVDMyKAlYMywJaW5wdXQsIDEyICk7IFgzCV49IFJLWzNdOworCisjZGVmaW5lCUFFU19SUk9VTkQoWDAsWDEsWDIsWDMsWTAsWTEsWTIsWTMpCQlcCit7CQkJCQkJCQkJCQkJXAorCVJLICs9IDQ7CQkJCQkJCQkJXAorCQkJCQkJCQkJCQkJXAorCVgwID0gUktbMF0gXiBSVDBbICh1aW50OCkgKAlZMCA+PiAyNCApIF0gXglcCisJCQkJIFJUMVsgKHVpbnQ4KSAoCVkzID4+IDE2ICkgXSBeCVwKKwkJCQkgUlQyWyAodWludDgpICgJWTIgPj4gIDggKSBdIF4JXAorCQkJCSBSVDNbICh1aW50OCkgKAlZMQkJICkgXTsJXAorCQkJCQkJCQkJCQkJXAorCVgxID0gUktbMV0gXiBSVDBbICh1aW50OCkgKAlZMSA+PiAyNCApIF0gXglcCisJCQkJIFJUMVsgKHVpbnQ4KSAoCVkwID4+IDE2ICkgXSBeCVwKKwkJCQkgUlQyWyAodWludDgpICgJWTMgPj4gIDggKSBdIF4JXAorCQkJCSBSVDNbICh1aW50OCkgKAlZMgkJICkgXTsJXAorCQkJCQkJCQkJCQkJXAorCVgyID0gUktbMl0gXiBSVDBbICh1aW50OCkgKAlZMiA+PiAyNCApIF0gXglcCisJCQkJIFJUMVsgKHVpbnQ4KSAoCVkxID4+IDE2ICkgXSBeCVwKKwkJCQkgUlQyWyAodWludDgpICgJWTAgPj4gIDggKSBdIF4JXAorCQkJCSBSVDNbICh1aW50OCkgKAlZMwkJICkgXTsJXAorCQkJCQkJCQkJCQkJXAorCVgzID0gUktbM10gXiBSVDBbICh1aW50OCkgKAlZMyA+PiAyNCApIF0gXglcCisJCQkJIFJUMVsgKHVpbnQ4KSAoCVkyID4+IDE2ICkgXSBeCVwKKwkJCQkgUlQyWyAodWludDgpICgJWTEgPj4gIDggKSBdIF4JXAorCQkJCSBSVDNbICh1aW50OCkgKAlZMAkJICkgXTsJXAorfQorCisJQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCAxICovCisJQUVTX1JST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCAyICovCisJQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCAzICovCisJQUVTX1JST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCA0ICovCisJQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCA1ICovCisJQUVTX1JST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCA2ICovCisJQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCA3ICovCisJQUVTX1JST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCA4ICovCisJQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCA5ICovCisKKwlpZigJY3R4LT5ucgk+IDEwICkKKwl7CisJCUFFU19SUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkvKiByb3VuZCAxMAkqLworCQlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJLyogcm91bmQgMTEJKi8KKwl9CisKKwlpZigJY3R4LT5ucgk+IDEyICkKKwl7CisJCUFFU19SUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkvKiByb3VuZCAxMgkqLworCQlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJLyogcm91bmQgMTMJKi8KKwl9CisKKwkvKiBsYXN0CXJvdW5kICovCisKKwlSSyArPSA0OworCisJWDAgPSBSS1swXSBeICggUlNiWwkodWludDgpCSggWTAgPj4JMjQgKSBdIDw8IDI0ICkgXgorCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkzID4+CTE2ICkgXSA8PCAxNiApIF4KKwkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMiA+PgkgOCApIF0gPDwgIDggKSBeCisJCQkJICggUlNiWwkodWludDgpCSggWTEJICAgKSBdCQkgKTsKKworCVgxID0gUktbMV0gXiAoIFJTYlsJKHVpbnQ4KQkoIFkxID4+CTI0ICkgXSA8PCAyNCApIF4KKwkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMCA+PgkxNiApIF0gPDwgMTYgKSBeCisJCQkJICggUlNiWwkodWludDgpCSggWTMgPj4JIDggKSBdIDw8ICA4ICkgXgorCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkyCSAgICkgXQkJICk7CisKKwlYMiA9IFJLWzJdIF4gKCBSU2JbCSh1aW50OCkJKCBZMiA+PgkyNCApIF0gPDwgMjQgKSBeCisJCQkJICggUlNiWwkodWludDgpCSggWTEgPj4JMTYgKSBdIDw8IDE2ICkgXgorCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkwID4+CSA4ICkgXSA8PCAgOCApIF4KKwkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMwkgICApIF0JCSApOworCisJWDMgPSBSS1szXSBeICggUlNiWwkodWludDgpCSggWTMgPj4JMjQgKSBdIDw8IDI0ICkgXgorCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkyID4+CTE2ICkgXSA8PCAxNiApIF4KKwkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMSA+PgkgOCApIF0gPDwgIDggKSBeCisJCQkJICggUlNiWwkodWludDgpCSggWTAJICAgKSBdCQkgKTsKKworCVBVVF9VSU5UMzIoCVgwLAlvdXRwdXQsCSAwICk7CisJUFVUX1VJTlQzMigJWDEsCW91dHB1dCwJIDQgKTsKKwlQVVRfVUlOVDMyKAlYMiwJb3V0cHV0LAkgOCApOworCVBVVF9VSU5UMzIoCVgzLAlvdXRwdXQsCTEyICk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlTSEExIGZ1bmN0aW9uCisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlITUFDX1NIQTEoCisJSU4JVUNIQVIJKnRleHQsCisJSU4JVUlOVAl0ZXh0X2xlbiwKKwlJTglVQ0hBUgkqa2V5LAorCUlOCVVJTlQJa2V5X2xlbiwKKwlJTglVQ0hBUgkqZGlnZXN0KQoreworCVNIQV9DVFgJY29udGV4dDsKKwlVQ0hBUglrX2lwYWRbNjVdOyAvKiBpbm5lciBwYWRkaW5nIC0ga2V5IFhPUmQgd2l0aCBpcGFkCSovCisJVUNIQVIJa19vcGFkWzY1XTsgLyogb3V0ZXIgcGFkZGluZyAtIGtleSBYT1JkIHdpdGggb3BhZAkqLworCUlOVAkJaTsKKworCS8vIGlmIGtleSBpcyBsb25nZXIJdGhhbiA2NAlieXRlcyByZXNldAlpdCB0byBrZXk9U0hBMShrZXkpCisJaWYgKGtleV9sZW4JPiA2NCkKKwl7CisJCVNIQV9DVFgJCSB0Y3R4OworCQlTSEFJbml0KCZ0Y3R4KTsKKwkJU0hBVXBkYXRlKCZ0Y3R4LCBrZXksIGtleV9sZW4pOworCQlTSEFGaW5hbCgmdGN0eCwJa2V5KTsKKwkJa2V5X2xlbgk9IDIwOworCX0KKwlOZGlzWmVyb01lbW9yeShrX2lwYWQsIHNpemVvZihrX2lwYWQpKTsKKwlOZGlzWmVyb01lbW9yeShrX29wYWQsIHNpemVvZihrX29wYWQpKTsKKwlOZGlzTW92ZU1lbW9yeShrX2lwYWQsIGtleSwJa2V5X2xlbik7CisJTmRpc01vdmVNZW1vcnkoa19vcGFkLCBrZXksCWtleV9sZW4pOworCisJLy8gWE9SIGtleSB3aXRoCWlwYWQgYW5kIG9wYWQgdmFsdWVzCisJZm9yCShpID0gMDsJaSA8CTY0OwlpKyspCisJeworCQlrX2lwYWRbaV0gXj0gMHgzNjsKKwkJa19vcGFkW2ldIF49IDB4NWM7CisJfQorCisJLy8gcGVyZm9ybSBpbm5lciBTSEExCisJU0hBSW5pdCgmY29udGV4dCk7IAkJCQkJCS8qIGluaXQgY29udGV4dCBmb3IgMXN0IHBhc3MgKi8KKwlTSEFVcGRhdGUoJmNvbnRleHQsCWtfaXBhZCwJNjQpOwkJLyoJc3RhcnQgd2l0aCBpbm5lciBwYWQgKi8KKwlTSEFVcGRhdGUoJmNvbnRleHQsCXRleHQsIHRleHRfbGVuKTsJLyoJdGhlbiB0ZXh0IG9mIGRhdGFncmFtICovCisJU0hBRmluYWwoJmNvbnRleHQsIGRpZ2VzdCk7CQkJCS8qIGZpbmlzaCB1cCAxc3QgcGFzcyAqLworCisJLy9wZXJmb3JtIG91dGVyCVNIQTEKKwlTSEFJbml0KCZjb250ZXh0KTsJCQkJCS8qIGluaXQgY29udGV4dCBmb3IgMm5kIHBhc3MgKi8KKwlTSEFVcGRhdGUoJmNvbnRleHQsCWtfb3BhZCwJNjQpOwkvKglzdGFydCB3aXRoIG91dGVyIHBhZCAqLworCVNIQVVwZGF0ZSgmY29udGV4dCwJZGlnZXN0LAkyMCk7CS8qCXRoZW4gcmVzdWx0cyBvZgkxc3QJaGFzaCAqLworCVNIQUZpbmFsKCZjb250ZXh0LCBkaWdlc3QpOwkJCS8qIGZpbmlzaCB1cCAybmQgcGFzcyAqLworCit9CisKKy8qCisqIEYoUCwgUywgYywgaSkgPSBVMSB4b3IgVTIgeG9yIC4uLiBVYworKiBVMSA9IFBSRihQLCBTIHx8IEludChpKSkKKyogVTIgPSBQUkYoUCwgVTEpCisqIFVjID0gUFJGKFAsIFVjLTEpCisqLworCit2b2lkIEYoY2hhciAqcGFzc3dvcmQsIHVuc2lnbmVkIGNoYXIgKnNzaWQsIGludCBzc2lkbGVuZ3RoLCBpbnQgaXRlcmF0aW9ucywgaW50IGNvdW50LCB1bnNpZ25lZCBjaGFyICpvdXRwdXQpCit7CisgICAgdW5zaWduZWQgY2hhciBkaWdlc3RbMzZdLCBkaWdlc3QxW1NIQV9ESUdFU1RfTEVOXTsKKyAgICBpbnQgaSwgajsKKworICAgIC8qIFUxID0gUFJGKFAsIFMgfHwgaW50KGkpKSAqLworICAgIG1lbWNweShkaWdlc3QsIHNzaWQsIHNzaWRsZW5ndGgpOworICAgIGRpZ2VzdFtzc2lkbGVuZ3RoXSA9ICh1bnNpZ25lZCBjaGFyKSgoY291bnQ+PjI0KSAmIDB4ZmYpOworICAgIGRpZ2VzdFtzc2lkbGVuZ3RoKzFdID0gKHVuc2lnbmVkIGNoYXIpKChjb3VudD4+MTYpICYgMHhmZik7CisgICAgZGlnZXN0W3NzaWRsZW5ndGgrMl0gPSAodW5zaWduZWQgY2hhcikoKGNvdW50Pj44KSAmIDB4ZmYpOworICAgIGRpZ2VzdFtzc2lkbGVuZ3RoKzNdID0gKHVuc2lnbmVkIGNoYXIpKGNvdW50ICYgMHhmZik7CisgICAgSE1BQ19TSEExKGRpZ2VzdCwgc3NpZGxlbmd0aCs0LCAodW5zaWduZWQgY2hhciopIHBhc3N3b3JkLCAoaW50KSBzdHJsZW4ocGFzc3dvcmQpLCBkaWdlc3QxKTsgLy8gZm9yIFdQQSB1cGRhdGUKKworICAgIC8qIG91dHB1dCA9IFUxICovCisgICAgbWVtY3B5KG91dHB1dCwgZGlnZXN0MSwgU0hBX0RJR0VTVF9MRU4pOworCisgICAgZm9yIChpID0gMTsgaSA8IGl0ZXJhdGlvbnM7IGkrKykKKyAgICB7CisgICAgICAgIC8qIFVuID0gUFJGKFAsIFVuLTEpICovCisgICAgICAgIEhNQUNfU0hBMShkaWdlc3QxLCBTSEFfRElHRVNUX0xFTiwgKHVuc2lnbmVkIGNoYXIqKSBwYXNzd29yZCwgKGludCkgc3RybGVuKHBhc3N3b3JkKSwgZGlnZXN0KTsgLy8gZm9yIFdQQSB1cGRhdGUKKyAgICAgICAgbWVtY3B5KGRpZ2VzdDEsIGRpZ2VzdCwgU0hBX0RJR0VTVF9MRU4pOworCisgICAgICAgIC8qIG91dHB1dCA9IG91dHB1dCB4b3IgVW4gKi8KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IFNIQV9ESUdFU1RfTEVOOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dHB1dFtqXSBePSBkaWdlc3Rbal07CisgICAgICAgIH0KKyAgICB9Cit9CisvKgorKiBwYXNzd29yZCAtIGFzY2lpIHN0cmluZyB1cCB0byA2MyBjaGFyYWN0ZXJzIGluIGxlbmd0aAorKiBzc2lkIC0gb2N0ZXQgc3RyaW5nIHVwIHRvIDMyIG9jdGV0cworKiBzc2lkbGVuZ3RoIC0gbGVuZ3RoIG9mIHNzaWQgaW4gb2N0ZXRzCisqIG91dHB1dCBtdXN0IGJlIDQwIG9jdGV0cyBpbiBsZW5ndGggYW5kIG91dHB1dHMgMjU2IGJpdHMgb2Yga2V5CisqLworaW50IFBhc3N3b3JkSGFzaChjaGFyICpwYXNzd29yZCwgdW5zaWduZWQgY2hhciAqc3NpZCwgaW50IHNzaWRsZW5ndGgsIHVuc2lnbmVkIGNoYXIgKm91dHB1dCkKK3sKKyAgICBpZiAoKHN0cmxlbihwYXNzd29yZCkgPiA2MykgfHwgKHNzaWRsZW5ndGggPiAzMikpCisgICAgICAgIHJldHVybiAwOworCisgICAgRihwYXNzd29yZCwgc3NpZCwgc3NpZGxlbmd0aCwgNDA5NiwgMSwgb3V0cHV0KTsKKyAgICBGKHBhc3N3b3JkLCBzc2lkLCBzc2lkbGVuZ3RoLCA0MDk2LCAyLCAmb3V0cHV0W1NIQV9ESUdFU1RfTEVOXSk7CisgICAgcmV0dXJuIDE7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vbWxtZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vbWxtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhODJjZWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9tbG1lLmMKQEAgLTAsMCArMSw4NjA5IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCW1sbWUuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUpvaG4gQ2hhbmcJMjAwNC0wOC0yNQkJTW9kaWZ5IGZyb20gUlQyNTAwIGNvZGUgYmFzZQorCUpvaG4gQ2hhbmcJMjAwNC0wOS0wNgkJbW9kaWZpZWQgZm9yIFJUMjYwMAorKi8KKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCitVQ0hBUglDSVNDT19PVUlbXSA9IHsweDAwLCAweDQwLCAweDk2fTsKKworVUNIQVIJV1BBX09VSVtdID0gezB4MDAsIDB4NTAsIDB4ZjIsIDB4MDF9OworVUNIQVIJUlNOX09VSVtdID0gezB4MDAsIDB4MGYsIDB4YWN9OworVUNIQVIJV0FQSV9PVUlbXSA9IHsweDAwLCAweDE0LCAweDcyfTsKK1VDSEFSICAgV01FX0lORk9fRUxFTVtdICA9IHsweDAwLCAweDUwLCAweGYyLCAweDAyLCAweDAwLCAweDAxfTsKK1VDSEFSICAgV01FX1BBUk1fRUxFTVtdID0gezB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsIDB4MDEsIDB4MDF9OworVUNIQVIJQ2N4MlFvc0luZm9bXSA9IHsweDAwLCAweDQwLCAweDk2LCAweDA0fTsKK1VDSEFSICAgUkFMSU5LX09VSVtdICA9IHsweDAwLCAweDBjLCAweDQzfTsKK1VDSEFSICAgQlJPQURDT01fT1VJW10gID0gezB4MDAsIDB4OTAsIDB4NGN9OworVUNIQVIgICBXUFNfT1VJW10gPSB7MHgwMCwgMHg1MCwgMHhmMiwgMHgwNH07CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitVQ0hBUglQUkVfTl9IVF9PVUlbXQk9IHsweDAwLCAweDkwLCAweDRjfTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlW10gPSB7CisvLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCisgICAgMHgxMSwgMHgwMCwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgorICAgIDB4MDAsIDB4MDAsICAwLCA0MCwgMTAxLAorICAgIDB4MDEsIDB4MDAsICAxLCA0MCwgNTAsCisgICAgMHgwMiwgMHgwMCwgIDIsIDM1LCA0NSwKKyAgICAweDAzLCAweDAwLCAgMywgMjAsIDQ1LAorICAgIDB4MDQsIDB4MjEsICAwLCAzMCwgNTAsCisgICAgMHgwNSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDA2LCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDcsIDB4MjEsICAzLCAxNSwgNTAsCisgICAgMHgwOCwgMHgyMSwgIDQsIDE1LCAzMCwKKyAgICAweDA5LCAweDIxLCAgNSwgMTAsIDI1LAorICAgIDB4MGEsIDB4MjEsICA2LCAgOCwgMjUsCisgICAgMHgwYiwgMHgyMSwgIDcsICA4LCAyNSwKKyAgICAweDBjLCAweDIwLCAxMiwgIDE1LCAzMCwKKyAgICAweDBkLCAweDIwLCAxMywgIDgsIDIwLAorICAgIDB4MGUsIDB4MjAsIDE0LCAgOCwgMjAsCisgICAgMHgwZiwgMHgyMCwgMTUsICA4LCAyNSwKKyAgICAweDEwLCAweDIyLCAxNSwgIDgsIDI1LAorICAgIDB4MTEsIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxMiwgMHgwMCwgIDAsICAwLCAgMCwKKyAgICAweDEzLCAweDAwLCAgMCwgIDAsICAwLAorICAgIDB4MTQsIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxNSwgMHgwMCwgIDAsICAwLCAgMCwKKyAgICAweDE2LCAweDAwLCAgMCwgIDAsICAwLAorICAgIDB4MTcsIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxOCwgMHgwMCwgIDAsICAwLCAgMCwKKyAgICAweDE5LCAweDAwLCAgMCwgIDAsICAwLAorICAgIDB4MWEsIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxYiwgMHgwMCwgIDAsICAwLCAgMCwKKyAgICAweDFjLCAweDAwLCAgMCwgIDAsICAwLAorICAgIDB4MWQsIDB4MDAsICAwLCAgMCwgIDAsCisgICAgMHgxZSwgMHgwMCwgIDAsICAwLCAgMCwKKyAgICAweDFmLCAweDAwLCAgMCwgIDAsICAwLAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCW10gPSB7CisvLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCisgICAgMHgwNCwgMHgwMywgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgorICAgIDB4MDAsIDB4MDAsICAwLCA0MCwgMTAxLAorICAgIDB4MDEsIDB4MDAsICAxLCA0MCwgNTAsCisgICAgMHgwMiwgMHgwMCwgIDIsIDM1LCA0NSwKKyAgICAweDAzLCAweDAwLCAgMywgMjAsIDQ1LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR1tdID0geworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MGEsIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDAwLCAgMCwgNDAsIDEwMSwKKyAgICAweDAxLCAweDAwLCAgMSwgNDAsIDUwLAorICAgIDB4MDIsIDB4MDAsICAyLCAzNSwgNDUsCisgICAgMHgwMywgMHgwMCwgIDMsIDIwLCA0NSwKKyAgICAweDA0LCAweDEwLCAgMiwgMjAsIDM1LAorICAgIDB4MDUsIDB4MTAsICAzLCAxNiwgMzUsCisgICAgMHgwNiwgMHgxMCwgIDQsIDEwLCAyNSwKKyAgICAweDA3LCAweDEwLCAgNSwgMTYsIDI1LAorICAgIDB4MDgsIDB4MTAsICA2LCAxMCwgMjUsCisgICAgMHgwOSwgMHgxMCwgIDcsIDEwLCAxMywKK307CisKK1VDSEFSIFJhdGVTd2l0Y2hUYWJsZTExR1tdID0geworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MDgsIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDEwLCAgMCwgMjAsIDEwMSwKKyAgICAweDAxLCAweDEwLCAgMSwgMjAsIDM1LAorICAgIDB4MDIsIDB4MTAsICAyLCAyMCwgMzUsCisgICAgMHgwMywgMHgxMCwgIDMsIDE2LCAzNSwKKyAgICAweDA0LCAweDEwLCAgNCwgMTAsIDI1LAorICAgIDB4MDUsIDB4MTAsICA1LCAxNiwgMjUsCisgICAgMHgwNiwgMHgxMCwgIDYsIDEwLCAyNSwKKyAgICAweDA3LCAweDEwLCAgNywgMTAsIDEzLAorfTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFOMVNbXSA9IHsKKy8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKKyAgICAweDA5LCAweDAwLCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCisgICAgMHgwMCwgMHgyMSwgIDAsIDMwLCAxMDEsCisgICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCisgICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKKyAgICAweDA1LCAweDIxLCAgNSwgMTAsIDI1LAorICAgIDB4MDYsIDB4MjEsICA2LCAgOCwgMTQsCisgICAgMHgwNywgMHgyMSwgIDcsICA4LCAxNCwKKyAgICAweDA4LCAweDIzLCAgNywgIDgsIDE0LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFOMlNbXSA9IHsKKy8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKKyAgICAweDBhLCAweDAwLCAgMCwgIDAsICAwLCAgICAgIC8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCisgICAgMHgwMCwgMHgyMSwgIDAsIDMwLCAxMDEsCisgICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCisgICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKKyAgICAweDA1LCAweDIwLCAxMiwgIDE1LCAzMCwKKyAgICAweDA2LCAweDIwLCAxMywgIDgsIDIwLAorICAgIDB4MDcsIDB4MjAsIDE0LCAgOCwgMjAsCisgICAgMHgwOCwgMHgyMCwgMTUsICA4LCAyNSwKKyAgICAweDA5LCAweDIyLCAxNSwgIDgsIDI1LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFOM1NbXSA9IHsKKy8vIEl0ZW0gTm8uCU1vZGUJQ3Vyci1NQ1MJVHJhaW5VcAlUcmFpbkRvd24JLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKKyAgICAweDBhLCAweDAwLCAgMCwgIDAsICAwLCAgICAgIC8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCisgICAgMHgwMCwgMHgyMSwgIDAsIDMwLCAxMDEsCisgICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCisgICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKKyAgICAweDA1LCAweDIwLCAxMiwgIDE1LCAzMCwKKyAgICAweDA2LCAweDIwLCAxMywgIDgsIDIwLAorICAgIDB4MDcsIDB4MjAsIDE0LCAgOCwgMjAsCisgICAgMHgwOCwgMHgyMCwgMTUsICA4LCAyNSwKKyAgICAweDA5LCAweDIyLCAxNSwgIDgsIDI1LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZFtdID0geworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MGIsIDB4MDksICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDIxLCAgMCwgMzAsIDEwMSwKKyAgICAweDAxLCAweDIxLCAgMSwgMjAsIDUwLAorICAgIDB4MDIsIDB4MjEsICAyLCAyMCwgNTAsCisgICAgMHgwMywgMHgyMSwgIDMsIDE1LCA1MCwKKyAgICAweDA0LCAweDIxLCAgNCwgMTUsIDMwLAorICAgIDB4MDUsIDB4MjEsICA1LCAxNSwgMzAsCisgICAgMHgwNiwgMHgyMCwgMTIsICAxNSwgMzAsCisgICAgMHgwNywgMHgyMCwgMTMsICA4LCAyMCwKKyAgICAweDA4LCAweDIwLCAxNCwgIDgsIDIwLAorICAgIDB4MDksIDB4MjAsIDE1LCAgOCwgMjUsCisgICAgMHgwYSwgMHgyMiwgMTUsICA4LCAyNSwKK307CisKK1VDSEFSIFJhdGVTd2l0Y2hUYWJsZTExTjNTRm9yQUJhbmRbXSA9IHsgLy8gMyozCisvLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCisgICAgMHgwYiwgMHgwOSwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgorICAgIDB4MDAsIDB4MjEsICAwLCAzMCwgMTAxLAorICAgIDB4MDEsIDB4MjEsICAxLCAyMCwgNTAsCisgICAgMHgwMiwgMHgyMSwgIDIsIDIwLCA1MCwKKyAgICAweDAzLCAweDIxLCAgMywgMTUsIDUwLAorICAgIDB4MDQsIDB4MjEsICA0LCAxNSwgMzAsCisgICAgMHgwNSwgMHgyMSwgIDUsIDE1LCAzMCwKKyAgICAweDA2LCAweDIwLCAxMiwgIDE1LCAzMCwKKyAgICAweDA3LCAweDIwLCAxMywgIDgsIDIwLAorICAgIDB4MDgsIDB4MjAsIDE0LCAgOCwgMjAsCisgICAgMHgwOSwgMHgyMCwgMTUsICA4LCAyNSwKKyAgICAweDBhLCAweDIyLCAxNSwgIDgsIDI1LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR04xU1tdID0geworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MGQsIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDAwLCAgMCwgNDAsIDEwMSwKKyAgICAweDAxLCAweDAwLCAgMSwgNDAsIDUwLAorICAgIDB4MDIsIDB4MDAsICAyLCAzNSwgNDUsCisgICAgMHgwMywgMHgwMCwgIDMsIDIwLCA0NSwKKyAgICAweDA0LCAweDIxLCAgMCwgMzAsMTAxLAkvLzUwCisgICAgMHgwNSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDA2LCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDcsIDB4MjEsICAzLCAxNSwgNTAsCisgICAgMHgwOCwgMHgyMSwgIDQsIDE1LCAzMCwKKyAgICAweDA5LCAweDIxLCAgNSwgMTAsIDI1LAorICAgIDB4MGEsIDB4MjEsICA2LCAgOCwgMTQsCisgICAgMHgwYiwgMHgyMSwgIDcsICA4LCAxNCwKKwkweDBjLCAweDIzLCAgNywgIDgsIDE0LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR04yU1tdID0geworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MGEsIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDIxLCAgMCwgMzAsMTAxLAkvLzUwCisgICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCisgICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKKyAgICAweDA1LCAweDIwLCAxMiwgMTUsIDMwLAorICAgIDB4MDYsIDB4MjAsIDEzLCAgOCwgMjAsCisgICAgMHgwNywgMHgyMCwgMTQsICA4LCAyMCwKKyAgICAweDA4LCAweDIwLCAxNSwgIDgsIDI1LAorICAgIDB4MDksIDB4MjIsIDE1LCAgOCwgMjUsCit9OworCitVQ0hBUiBSYXRlU3dpdGNoVGFibGUxMUJHTjNTW10gPSB7IC8vIDMqMworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MGEsIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDIxLCAgMCwgMzAsMTAxLAkvLzUwCisgICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDMsIDB4MjEsICAzLCAyMCwgNTAsCisgICAgMHgwNCwgMHgyMSwgIDQsIDE1LCA1MCwKKyNpZiAxCisgICAgMHgwNSwgMHgyMCwgMjAsIDE1LCAzMCwKKyAgICAweDA2LCAweDIwLCAyMSwgIDgsIDIwLAorICAgIDB4MDcsIDB4MjAsIDIyLCAgOCwgMjAsCisgICAgMHgwOCwgMHgyMCwgMjMsICA4LCAyNSwKKyAgICAweDA5LCAweDIyLCAyMywgIDgsIDI1LAorI2Vsc2UgLy8gZm9yIFJUMjg2MCAyKjMgdGVzdAorICAgIDB4MDUsIDB4MjAsIDEyLCAxNSwgMzAsCisgICAgMHgwNiwgMHgyMCwgMTMsICA4LCAyMCwKKyAgICAweDA3LCAweDIwLCAxNCwgIDgsIDIwLAorICAgIDB4MDgsIDB4MjAsIDE1LCAgOCwgMjUsCisgICAgMHgwOSwgMHgyMiwgMTUsICA4LCAyNSwKKyNlbmRpZgorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR04yU0ZvckFCYW5kW10gPSB7CisvLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCisgICAgMHgwYiwgMHgwOSwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgorICAgIDB4MDAsIDB4MjEsICAwLCAzMCwxMDEsCS8vNTAKKyAgICAweDAxLCAweDIxLCAgMSwgMjAsIDUwLAorICAgIDB4MDIsIDB4MjEsICAyLCAyMCwgNTAsCisgICAgMHgwMywgMHgyMSwgIDMsIDE1LCA1MCwKKyAgICAweDA0LCAweDIxLCAgNCwgMTUsIDMwLAorICAgIDB4MDUsIDB4MjEsICA1LCAxNSwgMzAsCisgICAgMHgwNiwgMHgyMCwgMTIsIDE1LCAzMCwKKyAgICAweDA3LCAweDIwLCAxMywgIDgsIDIwLAorICAgIDB4MDgsIDB4MjAsIDE0LCAgOCwgMjAsCisgICAgMHgwOSwgMHgyMCwgMTUsICA4LCAyNSwKKyAgICAweDBhLCAweDIyLCAxNSwgIDgsIDI1LAorfTsKKworVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR04zU0ZvckFCYW5kW10gPSB7IC8vIDMqMworLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQorICAgIDB4MGMsIDB4MDksICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KKyAgICAweDAwLCAweDIxLCAgMCwgMzAsMTAxLAkvLzUwCisgICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKKyAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAorICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCisgICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKKyAgICAweDA1LCAweDIxLCAgNSwgMTUsIDMwLAorICAgIDB4MDYsIDB4MjEsIDEyLCAxNSwgMzAsCisgICAgMHgwNywgMHgyMCwgMjAsIDE1LCAzMCwKKyAgICAweDA4LCAweDIwLCAyMSwgIDgsIDIwLAorICAgIDB4MDksIDB4MjAsIDIyLCAgOCwgMjAsCisgICAgMHgwYSwgMHgyMCwgMjMsICA4LCAyNSwKKyAgICAweDBiLCAweDIyLCAyMywgIDgsIDI1LAorfTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworUFVDSEFSIFJlYXNvblN0cmluZ1tdID0geworCS8qIDAgICovCSAiUmVzZXJ2ZWQiLAorCS8qIDEgICovCSAiVW5zcGVjaWZpZWQgUmVhc29uIiwKKwkvKiAyICAqLwkgIlByZXZpb3VzIEF1dGggbm8gbG9uZ2VyIHZhbGlkIiwKKwkvKiAzICAqLwkgIlNUQSBpcyBsZWF2aW5nIC8gaGFzIGxlZnQiLAorCS8qIDQgICovCSAiRElTLUFTU09DIGR1ZSB0byBpbmFjdGl2aXR5IiwKKwkvKiA1ICAqLwkgIkFQIHVuYWJsZSB0byBoYW5sZSBhbGwgYXNzb2NpYXRpb25zIiwKKwkvKiA2ICAqLwkgImNsYXNzIDIgZXJyb3IiLAorCS8qIDcgICovCSAiY2xhc3MgMyBlcnJvciIsCisJLyogOCAgKi8JICJTVEEgaXMgbGVhdmluZyAvIGhhcyBsZWZ0IiwKKwkvKiA5ICAqLwkgInJlcXVpcmUgYXV0aCBiZWZvcmUgYXNzb2MvcmUtYXNzb2MiLAorCS8qIDEwICovCSAiUmVzZXJ2ZWQiLAorCS8qIDExICovCSAiUmVzZXJ2ZWQiLAorCS8qIDEyICovCSAiUmVzZXJ2ZWQiLAorCS8qIDEzICovCSAiaW52YWxpZCBJRSIsCisJLyogMTQgKi8JICJNSUMgZXJyb3IiLAorCS8qIDE1ICovCSAiNC13YXkgaGFuZHNoYWtlIHRpbWVvdXQiLAorCS8qIDE2ICovCSAiMi13YXkgKGdyb3VwIGtleSkgaGFuZHNoYWtlIHRpbWVvdXQiLAorCS8qIDE3ICovCSAiNC13YXkgaGFuZHNoYWtlIElFIGRpZmYgYW1vbmcgQXNzb3NSZXEvUnNwL0JlYWNvbiIsCisJLyogMTggKi8KK307CisKK2V4dGVybiBVQ0hBUgkgT2ZkbVJhdGVUb1J4d2lNQ1NbXTsKKy8vIHNpbmNlIFJUNjEgaGFzIGJldHRlciBSWCBzZW5zaWJpbGl0eSwgd2UgaGF2ZSB0byBsaW1pdCBUWCBBQ0sgcmF0ZSBub3QgdG8gZXhjZWVkIG91ciBub3JtYWwgZGF0YSBUWCByYXRlLgorLy8gb3RoZXJ3aXNlIHRoZSBXTEFOIHBlZXIgbWF5IG5vdCBiZSBhYmxlIHRvIHJlY2VpdmUgdGhlIEFDSyB0aHVzIGRvd25ncmFkZSBpdHMgZGF0YSBUWCByYXRlCitVTE9ORyBCYXNpY1JhdGVNYXNrWzEyXQkJCQk9IHsweGZmZmZmMDAxIC8qIDEtTWJwcyAqLywgMHhmZmZmZjAwMyAvKiAyIE1icHMgKi8sIDB4ZmZmZmYwMDcgLyogNS41ICovLCAweGZmZmZmMDBmIC8qIDExICovLAorCQkJCQkJCQkJICAweGZmZmZmMDFmIC8qIDYgKi8JICwgMHhmZmZmZjAzZiAvKiA5ICovCSAgLCAweGZmZmZmMDdmIC8qIDEyICovICwgMHhmZmZmZjBmZiAvKiAxOCAqLywKKwkJCQkJCQkJCSAgMHhmZmZmZjFmZiAvKiAyNCAqLwkgLCAweGZmZmZmM2ZmIC8qIDM2ICovCSAgLCAweGZmZmZmN2ZmIC8qIDQ4ICovICwgMHhmZmZmZmZmZiAvKiA1NCAqL307CisKK1VDSEFSIE1VTFRJQ0FTVF9BRERSW01BQ19BRERSX0xFTl0gPSB7MHgxLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CitVQ0hBUiBCUk9BRENBU1RfQUREUltNQUNfQUREUl9MRU5dID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OworVUNIQVIgWkVST19NQUNfQUREUltNQUNfQUREUl9MRU5dICA9IHsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKKworLy8gZS5nLiBSc3NpU2FmZUxldmVsRm9yVHhSYXRlW1JBVEVfMzZdIiBtZWFucyBpZiB0aGUgY3VycmVudCBSU1NJIGlzIGdyZWF0ZXIgdGhhbgorLy8JCXRoaXMgdmFsdWUsIHRoZW4gaXQncyBxdWFyYW50ZWVkIGNhcGFibGUgb2Ygb3BlcmF0aW5nIGluIDM2IG1icHMgVFggcmF0ZSBpbgorLy8JCWNsZWFuIGVudmlyb25tZW50LgorLy8JCQkJCQkJCSAgVHhSYXRlOiAxICAgMiAgIDUuNQkxMQkgNgkgIDkgICAgMTIJMTgJIDI0ICAgMzYgICA0OAk1NAkgNzIgIDEwMAorQ0hBUiBSc3NpU2FmZUxldmVsRm9yVHhSYXRlW10gPXsgIC05MiwgLTkxLCAtOTAsIC04NywgLTg4LCAtODYsIC04NSwgLTgzLCAtODEsIC03OCwgLTcyLCAtNzEsIC00MCwgLTQwIH07CisKK1VDSEFSICBSYXRlSWRUb01icHNbXQkgPSB7IDEsIDIsIDUsIDExLCA2LCA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0LCA3MiwgMTAwfTsKK1VTSE9SVCBSYXRlSWRUbzUwMEticHNbXSA9IHsgMiwgNCwgMTEsIDIyLCAxMiwgMTgsIDI0LCAzNiwgNDgsIDcyLCA5NiwgMTA4LCAxNDQsIDIwMH07CisKK1VDSEFSICBTc2lkSWUJID0gSUVfU1NJRDsKK1VDSEFSICBTdXBSYXRlSWUgPSBJRV9TVVBQX1JBVEVTOworVUNIQVIgIEV4dFJhdGVJZSA9IElFX0VYVF9TVVBQX1JBVEVTOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVUNIQVIgIEh0Q2FwSWUgPSBJRV9IVF9DQVA7CitVQ0hBUiAgQWRkSHRJbmZvSWUgPSBJRV9BRERfSFQ7CitVQ0hBUiAgTmV3RXh0Q2hhbkllID0gSUVfU0VDT05EQVJZX0NIX09GRlNFVDsKKyNpZmRlZiBET1QxMU5fRFJBRlQzCitVQ0hBUiAgRXh0SHRDYXBJZSA9IElFX0VYVF9DQVBBQklMSVRZOworI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KK1VDSEFSICBFcnBJZQkgPSBJRV9FUlA7CitVQ0hBUiAgRHNJZSAJID0gSUVfRFNfUEFSTTsKK1VDSEFSICBUaW1JZQkgPSBJRV9USU07CitVQ0hBUiAgV3BhSWUJID0gSUVfV1BBOworVUNIQVIgIFdwYTJJZQkgPSBJRV9XUEEyOworVUNIQVIgIElic3NJZQkgPSBJRV9JQlNTX1BBUk07CitVQ0hBUiAgQ2N4MkllCSA9IElFX0NDWF9WMjsKK1VDSEFSICBXYXBpSWUJID0gSUVfV0FQSTsKKworZXh0ZXJuIFVDSEFSCVdQQV9PVUlbXTsKKworVUNIQVIJU0VTX09VSVtdID0gezB4MDAsIDB4OTAsIDB4NGN9OworCitVQ0hBUglaZXJvU3NpZFszMl0gPSB7MHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfTsKKworLy8gUmVzZXQgdGhlIFJGSUMgc2V0dGluZyB0byBuZXcgc2VyaWVzCitSVE1QX1JGX1JFR1MgUkYyODUwUmVnVGFibGVbXSA9IHsKKy8vCQljaAkgUjEgCQkgUjIgCQkgUjMoVFgwfjQ9MCkgUjQKKwkJezEsICAweDk4NDAyZWNjLCAweDk4NGMwNzg2LCAweDk4MTZiNDU1LCAweDk4MDA1MTBifSwKKwkJezIsICAweDk4NDAyZWNjLCAweDk4NGMwNzg2LCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKKwkJezMsICAweDk4NDAyZWNjLCAweDk4NGMwNzhhLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKKwkJezQsICAweDk4NDAyZWNjLCAweDk4NGMwNzhhLCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKKwkJezUsICAweDk4NDAyZWNjLCAweDk4NGMwNzhlLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKKwkJezYsICAweDk4NDAyZWNjLCAweDk4NGMwNzhlLCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKKwkJezcsICAweDk4NDAyZWNjLCAweDk4NGMwNzkyLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKKwkJezgsICAweDk4NDAyZWNjLCAweDk4NGMwNzkyLCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKKwkJezksICAweDk4NDAyZWNjLCAweDk4NGMwNzk2LCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKKwkJezEwLCAweDk4NDAyZWNjLCAweDk4NGMwNzk2LCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKKwkJezExLCAweDk4NDAyZWNjLCAweDk4NGMwNzlhLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKKwkJezEyLCAweDk4NDAyZWNjLCAweDk4NGMwNzlhLCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKKwkJezEzLCAweDk4NDAyZWNjLCAweDk4NGMwNzllLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKKwkJezE0LCAweDk4NDAyZWNjLCAweDk4NGMwN2EyLCAweDk4MTY4YTU1LCAweDk4MDA1MTkzfSwKKworCQkvLyA4MDIuMTEgVU5JIC8gSHlwZXJMYW4gMgorCQl7MzYsIDB4OTg0MDJlY2MsIDB4OTg0YzA5OWEsIDB4OTgxNThhNTUsIDB4OTgwZWQxYTN9LAorCQl7MzgsIDB4OTg0MDJlY2MsIDB4OTg0YzA5OWUsIDB4OTgxNThhNTUsIDB4OTgwZWQxOTN9LAorCQl7NDAsIDB4OTg0MDJlYzgsIDB4OTg0YzA2ODIsIDB4OTgxNThhNTUsIDB4OTgwZWQxODN9LAorCQl7NDQsIDB4OTg0MDJlYzgsIDB4OTg0YzA2ODIsIDB4OTgxNThhNTUsIDB4OTgwZWQxYTN9LAorCQl7NDYsIDB4OTg0MDJlYzgsIDB4OTg0YzA2ODYsIDB4OTgxNThhNTUsIDB4OTgwZWQxOGJ9LAorCQl7NDgsIDB4OTg0MDJlYzgsIDB4OTg0YzA2ODYsIDB4OTgxNThhNTUsIDB4OTgwZWQxOWJ9LAorCQl7NTIsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OGEsIDB4OTgxNThhNTUsIDB4OTgwZWQxOTN9LAorCQl7NTQsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OGEsIDB4OTgxNThhNTUsIDB4OTgwZWQxYTN9LAorCQl7NTYsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OGUsIDB4OTgxNThhNTUsIDB4OTgwZWQxOGJ9LAorCQl7NjAsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OTIsIDB4OTgxNThhNTUsIDB4OTgwZWQxODN9LAorCQl7NjIsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OTIsIDB4OTgxNThhNTUsIDB4OTgwZWQxOTN9LAorCQl7NjQsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OTIsIDB4OTgxNThhNTUsIDB4OTgwZWQxYTN9LCAvLyBQbHVnZmVzdCM0LCBEYXk0LCBjaGFuZ2UgUkZSMyBsZWZ0NHRoIDktPjUuCisKKwkJLy8gODAyLjExIEh5cGVyTGFuIDIKKwkJezEwMCwgMHg5ODQwMmVjOCwgMHg5ODRjMDZiMiwgMHg5ODE3OGE1NSwgMHg5ODBlZDc4M30sCisKKwkJLy8gMjAwOC4wNC4zMCBtb2RpZmllZAorCQkvLyBUaGUgc3lzdGVtIHRlYW0gaGFzIEFOIHRvIGltcHJvdmUgdGhlIEVWTSB2YWx1ZQorCQkvLyBmb3IgY2hhbm5lbCAxMDIgdG8gMTA4IGZvciB0aGUgUlQyODUwL1JUMjc1MCBkdWFsIGJhbmQgc29sdXRpb24uCisJCXsxMDIsIDB4OTg0MDJlYzgsIDB4OTg1YzA2YjIsIDB4OTg1NzhhNTUsIDB4OTgwZWQ3OTN9LAorCQl7MTA0LCAweDk4NDAyZWM4LCAweDk4NWMwNmIyLCAweDk4NTc4YTU1LCAweDk4MGVkMWEzfSwKKwkJezEwOCwgMHg5ODQwMmVjYywgMHg5ODVjMGEzMiwgMHg5ODU3OGE1NSwgMHg5ODBlZDE5M30sCisKKwkJezExMCwgMHg5ODQwMmVjYywgMHg5ODRjMGEzNiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4M30sCisJCXsxMTIsIDB4OTg0MDJlY2MsIDB4OTg0YzBhMzYsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOWJ9LAorCQl7MTE2LCAweDk4NDAyZWNjLCAweDk4NGMwYTNhLCAweDk4MTc4YTU1LCAweDk4MGVkMWEzfSwKKwkJezExOCwgMHg5ODQwMmVjYywgMHg5ODRjMGEzZSwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5M30sCisJCXsxMjAsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODIsIDB4OTgxNzhhNTUsIDB4OTgwZWQxODN9LAorCQl7MTI0LCAweDk4NDAyZWM0LCAweDk4NGMwMzgyLCAweDk4MTc4YTU1LCAweDk4MGVkMTkzfSwKKwkJezEyNiwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4MiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE1Yn0sIC8vIDB4OTgwZWQxYmItPjB4OTgwZWQxNWIgcmVxdWlyZWQgYnkgUm9yeSAyMDA3MDkyNworCQl7MTI4LCAweDk4NDAyZWM0LCAweDk4NGMwMzgyLCAweDk4MTc4YTU1LCAweDk4MGVkMWEzfSwKKwkJezEzMiwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4NiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4Yn0sCisJCXsxMzQsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODYsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOTN9LAorCQl7MTM2LCAweDk4NDAyZWM0LCAweDk4NGMwMzg2LCAweDk4MTc4YTU1LCAweDk4MGVkMTlifSwKKwkJezE0MCwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4YSwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4M30sCisKKwkJLy8gODAyLjExIFVOSUkKKwkJezE0OSwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4YSwgMHg5ODE3OGE1NSwgMHg5ODBlZDFhN30sCisJCXsxNTEsIDB4OTg0MDJlYzQsIDB4OTg0YzAzOGUsIDB4OTgxNzhhNTUsIDB4OTgwZWQxODd9LAorCQl7MTUzLCAweDk4NDAyZWM0LCAweDk4NGMwMzhlLCAweDk4MTc4YTU1LCAweDk4MGVkMThmfSwKKwkJezE1NywgMHg5ODQwMmVjNCwgMHg5ODRjMDM4ZSwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5Zn0sCisJCXsxNTksIDB4OTg0MDJlYzQsIDB4OTg0YzAzOGUsIDB4OTgxNzhhNTUsIDB4OTgwZWQxYTd9LAorCQl7MTYxLCAweDk4NDAyZWM0LCAweDk4NGMwMzkyLCAweDk4MTc4YTU1LCAweDk4MGVkMTg3fSwKKwkJezE2NSwgMHg5ODQwMmVjNCwgMHg5ODRjMDM5MiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5N30sCisKKwkJLy8gSmFwYW4KKwkJezE4NCwgMHg5NTAwMmNjYywgMHg5NTAwNDkxZSwgMHg5NTA5YmU1NSwgMHg5NTBjMGEwYn0sCisJCXsxODgsIDB4OTUwMDJjY2MsIDB4OTUwMDQ5MjIsIDB4OTUwOWJlNTUsIDB4OTUwYzBhMTN9LAorCQl7MTkyLCAweDk1MDAyY2NjLCAweDk1MDA0OTI2LCAweDk1MDliZTU1LCAweDk1MGMwYTFifSwKKwkJezE5NiwgMHg5NTAwMmNjYywgMHg5NTAwNDkyYSwgMHg5NTA5YmU1NSwgMHg5NTBjMGEyM30sCisJCXsyMDgsIDB4OTUwMDJjY2MsIDB4OTUwMDQ5M2EsIDB4OTUwOWJlNTUsIDB4OTUwYzBhMTN9LAorCQl7MjEyLCAweDk1MDAyY2NjLCAweDk1MDA0OTNlLCAweDk1MDliZTU1LCAweDk1MGMwYTFifSwKKwkJezIxNiwgMHg5NTAwMmNjYywgMHg5NTAwNDk4MiwgMHg5NTA5YmU1NSwgMHg5NTBjMGEyM30sCisKKwkJLy8gc3RpbGwgbGFjayBvZiBNTUFDKEphcGFuKSBjaCAzNCwzOCw0Miw0NgorfTsKK1VDSEFSCU5VTV9PRl8yODUwX0NITkwgPSAoc2l6ZW9mKFJGMjg1MFJlZ1RhYmxlKSAvIHNpemVvZihSVE1QX1JGX1JFR1MpKTsKKworRlJFUVVFTkNZX0lURU0gRnJlcUl0ZW1zMzAyMFtdID0KK3sKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJLy8gSVNNIDogMi40IHRvIDIuNDgzIEdIeiAgICAgICAgICAgICAgICAgICAgICAgICAvLworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvLyAxMWcKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJLy8tQ0gtLS1OLS0tLS0tLVItLS1LLS0tLS0tLS0tLS0KKwl7MSwgICAgMjQxLCAgMiwgIDJ9LAorCXsyLCAgICAyNDEsCSAyLCAgN30sCisJezMsICAgIDI0MiwJIDIsICAyfSwKKwl7NCwgICAgMjQyLAkgMiwgIDd9LAorCXs1LCAgICAyNDMsCSAyLCAgMn0sCisJezYsICAgIDI0MywJIDIsICA3fSwKKwl7NywgICAgMjQ0LAkgMiwgIDJ9LAorCXs4LCAgICAyNDQsCSAyLCAgN30sCisJezksICAgIDI0NSwJIDIsICAyfSwKKwl7MTAsICAgMjQ1LAkgMiwgIDd9LAorCXsxMSwgICAyNDYsCSAyLCAgMn0sCisJezEyLCAgIDI0NiwJIDIsICA3fSwKKwl7MTMsICAgMjQ3LAkgMiwgIDJ9LAorCXsxNCwgICAyNDgsCSAyLCAgNH0sCit9OworI2RlZmluZQlOVU1fT0ZfMzAyMF9DSE5MCShzaXplb2YoRnJlcUl0ZW1zMzAyMCkgLyBzaXplb2YoRlJFUVVFTkNZX0lURU0pKQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCWluaXRpYWxpemUgdGhlIE1MTUUgdGFzayBhbmQgaXRzIGRhdGEgc3RydWN0dXJlIChxdWV1ZSwgc3BpbmxvY2ssCisJCXRpbWVyLCBzdGF0ZSBtYWNoaW5lcykuCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJUmV0dXJuOgorCQlhbHdheXMgcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1MKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMgTWxtZUluaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTkRJU19TVEFUVVMgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBNTE1FIEluaXRpYWxpemVcbiIpKTsKKworCWRvCisJeworCQlTdGF0dXMgPSBNbG1lUXVldWVJbml0KCZwQWQtPk1sbWUuUXVldWUpOworCQlpZihTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCWJyZWFrOworCisJCXBBZC0+TWxtZS5iUnVubmluZyA9IEZBTFNFOworCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQlCc3NUYWJsZUluaXQoJnBBZC0+U2NhblRhYik7CisKKwkJCS8vIGluaXQgU1RBIHN0YXRlIG1hY2hpbmVzCisJCQlBc3NvY1N0YXRlTWFjaGluZUluaXQocEFkLCAmcEFkLT5NbG1lLkFzc29jTWFjaGluZSwgcEFkLT5NbG1lLkFzc29jRnVuYyk7CisJCQlBdXRoU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQXV0aE1hY2hpbmUsIHBBZC0+TWxtZS5BdXRoRnVuYyk7CisJCQlBdXRoUnNwU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQXV0aFJzcE1hY2hpbmUsIHBBZC0+TWxtZS5BdXRoUnNwRnVuYyk7CisJCQlTeW5jU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuU3luY01hY2hpbmUsIHBBZC0+TWxtZS5TeW5jRnVuYyk7CisJCQlXcGFQc2tTdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5XcGFQc2tNYWNoaW5lLCBwQWQtPk1sbWUuV3BhUHNrRnVuYyk7CisJCQlBaXJvbmV0U3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUsIHBBZC0+TWxtZS5BaXJvbmV0RnVuYyk7CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJCURsc1N0YXRlTWFjaGluZUluaXQocEFkLCAmcEFkLT5NbG1lLkRsc01hY2hpbmUsIHBBZC0+TWxtZS5EbHNGdW5jKTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCisJCQkvLyBTaW5jZSB3ZSBhcmUgdXNpbmcgc3dpdGNoL2Nhc2UgdG8gaW1wbGVtZW50IGl0LCB0aGUgaW5pdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgYWJvdmUKKwkJCS8vIHN0YXRlIG1hY2hpbmUgaW5pdAorCQkJTWxtZUNudGxJbml0KHBBZCwgJnBBZC0+TWxtZS5DbnRsTWFjaGluZSwgTlVMTCk7CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisKKwkJQWN0aW9uU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQWN0TWFjaGluZSwgcEFkLT5NbG1lLkFjdEZ1bmMpOworCisJCS8vIEluaXQgbWxtZSBwZXJpb2RpYyB0aW1lcgorCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZS5QZXJpb2RpY1RpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oTWxtZVBlcmlvZGljRXhlYyksIHBBZCwgVFJVRSk7CisKKwkJLy8gU2V0IG1sbWUgcGVyaW9kaWMgdGltZXIKKwkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUGVyaW9kaWNUaW1lciwgTUxNRV9UQVNLX0VYRUNfSU5UVik7CisKKwkJLy8gc29mdHdhcmUtYmFzZWQgUlggQW50ZW5uYSBkaXZlcnNpdHkKKwkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWUuUnhBbnRFdmFsVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihBc2ljUnhBbnRFdmFsVGltZW91dCksIHBBZCwgRkFMU0UpOworCisJfSB3aGlsZSAoRkFMU0UpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tIE1MTUUgSW5pdGlhbGl6ZVxuIikpOworCisJcmV0dXJuIFN0YXR1czsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQltYWluIGxvb3Agb2YgdGhlIE1MTUUKKwlQcmU6CisJCU1sbWUgaGFzIHRvIGJlIGluaXRpYWxpemVkLCBhbmQgdGhlcmUgYXJlIHNvbWV0aGluZyBpbnNpZGUgdGhlIHF1ZXVlCisJTm90ZToKKwkJVGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkIGZyb20gTVBTZXRJbmZvcm1hdGlvbiBhbmQgTVBSZWNlaXZlOworCQlUaGlzIHRhc2sgZ3VhcmFudGVlIG9ubHkgb25lIE1sbWVIYW5kbGVyIHdpbGwgcnVuLgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVIYW5kbGVyKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCU1MTUVfUVVFVUVfRUxFTSAJICAgKkVsZW0gPSBOVUxMOworI2lmZGVmIEFQQ0xJX1NVUFBPUlQKKwlTSE9SVCBhcGNsaUlmSW5kZXg7CisjZW5kaWYKKworCS8vIE9ubHkgYWNjZXB0IE1MTUUgYW5kIEZyYW1lIGZyb20gcGVlciBzaWRlLCBubyBvdGhlciAoY29udHJvbC9kYXRhKSBmcmFtZSBzaG91bGQKKwkvLyBnZXQgaW50byB0aGlzIHN0YXRlIG1hY2hpbmUKKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7CisJaWYocEFkLT5NbG1lLmJSdW5uaW5nKQorCXsKKwkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKKwkJcmV0dXJuOworCX0KKwllbHNlCisJeworCQlwQWQtPk1sbWUuYlJ1bm5pbmcgPSBUUlVFOworCX0KKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOworCisJd2hpbGUgKCFNbG1lUXVldWVFbXB0eSgmcEFkLT5NbG1lLlF1ZXVlKSkKKwl7CisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTUxNRV9SRVNFVF9JTl9QUk9HUkVTUykgfHwKKwkJCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSB8fAorCQkJUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEZXZpY2UgSGFsdGVkIG9yIFJlbW92ZWQgb3IgTWxtZVJlc3QsIGV4aXQgTWxtZUhhbmRsZXIhIChxdWV1ZSBudW0gPSAlbGQpXG4iLCBwQWQtPk1sbWUuUXVldWUuTnVtKSk7CisJCQlicmVhazsKKwkJfQorCisjaWZkZWYgUkFMSU5LX0FURQorCQlpZihBVEVfT04ocEFkKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVGhlIGRyaXZlciBpcyBpbiBBVEUgbW9kZSBub3cgaW4gTWxtZUhhbmRsZXJcbiIpKTsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisJCS8vRnJvbSBtZXNzYWdlIHR5cGUsIGRldGVybWluZSB3aGljaCBzdGF0ZSBtYWNoaW5lIEkgc2hvdWxkIGRyaXZlCisJCWlmIChNbG1lRGVxdWV1ZSgmcEFkLT5NbG1lLlF1ZXVlLCAmRWxlbSkpCisJCXsKKyNpZmRlZiBSVDI4NzAKKwkJCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9SRVNFVF9DT05GKQorCQkJeworCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIhISEgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworCQkJCU1sbWVSZXN0YXJ0U3RhdGVNYWNoaW5lKHBBZCk7CisJCQkJRWxlbS0+T2NjdXBpZWQgPSBGQUxTRTsKKwkJCQlFbGVtLT5Nc2dMZW4gPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorI2VuZGlmIC8vIFJUMjg3MCAvLworCisJCQkvLyBpZiBkZXF1ZXVlIHN1Y2Nlc3MKKwkJCXN3aXRjaCAoRWxlbS0+TWFjaGluZSkKKwkJCXsKKwkJCQkvLyBTVEEgc3RhdGUgbWFjaGluZXMKKyNpZmRlZglDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQljYXNlIEFTU09DX1NUQVRFX01BQ0hJTkU6CisJCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLkFzc29jTWFjaGluZSwgRWxlbSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQVVUSF9TVEFURV9NQUNISU5FOgorCQkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5BdXRoTWFjaGluZSwgRWxlbSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQVVUSF9SU1BfU1RBVEVfTUFDSElORToKKwkJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuQXV0aFJzcE1hY2hpbmUsIEVsZW0pOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNZTkNfU1RBVEVfTUFDSElORToKKwkJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuU3luY01hY2hpbmUsIEVsZW0pOworCQkJCQlicmVhazsKKwkJCQljYXNlIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FOgorCQkJCQlNbG1lQ250bE1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5DbnRsTWFjaGluZSwgRWxlbSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgV1BBX1BTS19TVEFURV9NQUNISU5FOgorCQkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5XcGFQc2tNYWNoaW5lLCBFbGVtKTsKKwkJCQkJYnJlYWs7CisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQkJY2FzZSBMRUFQX1NUQVRFX01BQ0hJTkU6CisJCQkJCUxlYXBNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuTGVhcE1hY2hpbmUsIEVsZW0pOworCQkJCQlicmVhazsKKyNlbmRpZgorCQkJCWNhc2UgQUlST05FVF9TVEFURV9NQUNISU5FOgorCQkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZSwgRWxlbSk7CisJCQkJCWJyZWFrOworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCQkJY2FzZSBETFNfU1RBVEVfTUFDSElORToKKwkJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuRGxzTWFjaGluZSwgRWxlbSk7CisJCQkJCWJyZWFrOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCQkJY2FzZSBBQ1RJT05fU1RBVEVfTUFDSElORToKKwkJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuQWN0TWFjaGluZSwgRWxlbSk7CisJCQkJCWJyZWFrOworCisKKworCisJCQkJZGVmYXVsdDoKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRVJST1I6IElsbGVnYWwgbWFjaGluZSAlbGQgaW4gTWxtZUhhbmRsZXIoKVxuIiwgRWxlbS0+TWFjaGluZSkpOworCQkJCQlicmVhazsKKwkJCX0gLy8gZW5kIG9mIHN3aXRjaAorCisJCQkvLyBmcmVlIE1MTUUgZWxlbWVudAorCQkJRWxlbS0+T2NjdXBpZWQgPSBGQUxTRTsKKwkJCUVsZW0tPk1zZ0xlbiA9IDA7CisKKwkJfQorCQllbHNlIHsKKwkJCURCR1BSSU5UX0VSUigoIk1sbWVIYW5kbGVyOiBNbG1lUXVldWUgZW1wdHlcbiIpKTsKKwkJfQorCX0KKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7CisJcEFkLT5NbG1lLmJSdW5uaW5nID0gRkFMU0U7CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlEZXN0cnVjdG9yIG9mIE1MTUUgKERlc3Ryb3kgcXVldWUsIHN0YXRlIG1hY2hpbmUsIHNwaW4gbG9jayBhbmQgdGltZXIpCisJUGFyYW1ldGVyczoKKwkJQWRhcHRlciAtIE5JQyBBZGFwdGVyIHBvaW50ZXIKKwlQb3N0OgorCQlUaGUgTUxNRSB0YXNrIHdpbGwgbm8gbG9uZ2VyIHdvcmsgcHJvcGVybHkKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVIYWx0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCUJPT0xFQU4gCSAgQ2FuY2VsbGVkOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IE1sbWVIYWx0XG4iKSk7CisKKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwl7CisJCS8vIGRpc2FibGUgQkVBQ09OIGdlbmVyYXRpb24gYW5kIG90aGVyIEJFQUNPTiByZWxhdGVkIGhhcmR3YXJlIHRpbWVycworCQlBc2ljRGlzYWJsZVN5bmMocEFkKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJVUNIQVIJCWk7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCS8vIENhbmNlbCBwZW5kaW5nIHRpbWVycworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5Bc3NvY1RpbWVyLAkJJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlJlYXNzb2NUaW1lciwJCSZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLAkmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLAkJJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLAkJJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwJCSZDYW5jZWxsZWQpOworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJCXsKKwkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZDYW5jZWxsZWQpOworCQl9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUGVyaW9kaWNUaW1lciwJCSZDYW5jZWxsZWQpOworCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlJ4QW50RXZhbFRpbWVyLAkJJkNhbmNlbGxlZCk7CisKKworCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJeworCQkvLyBTZXQgTEVECisJCVJUTVBTZXRMRUQocEFkLCBMRURfSEFMVCk7CisgICAgICAgIFJUTVBTZXRTaWduYWxMRUQocEFkLCAtMTAwKTsJLy8gRm9yY2Ugc2lnbmFsIHN0cmVuZ3RoIExlZCB0byBiZSB0dXJuZWQgb2ZmLCBmaXJtd2FyZSBpcyBub3QgZG9uZSBpdC4KKyNpZmRlZiBSVDI4NzAKKyAgICAgICAgeworICAgICAgICAgICAgTEVEX0NGR19TVFJVQyBMZWRDZmc7CisgICAgICAgICAgICBSVE1QX0lPX1JFQUQzMihwQWQsIExFRF9DRkcsICZMZWRDZmcud29yZCk7CisgICAgICAgICAgICBMZWRDZmcuZmllbGQuTGVkUG9sYXIgPSAwOworICAgICAgICAgICAgTGVkQ2ZnLmZpZWxkLlJMZWRNb2RlID0gMDsKKyAgICAgICAgICAgIExlZENmZy5maWVsZC5HTGVkTW9kZSA9IDA7CisgICAgICAgICAgICBMZWRDZmcuZmllbGQuWUxlZE1vZGUgPSAwOworICAgICAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZCwgTEVEX0NGRywgTGVkQ2ZnLndvcmQpOworICAgICAgICB9CisjZW5kaWYgLy8gUlQyODcwIC8vCisJfQorCisJUlRNUHVzZWNEZWxheSg1MDAwKTsgICAgLy8gIDUgbXNlYyB0byBndXJhbnRlZSBBbnQgRGl2ZXJzaXR5IHRpbWVyIGNhbmNlbGVkCisKKwlNbG1lUXVldWVEZXN0cm95KCZwQWQtPk1sbWUuUXVldWUpOworCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gTWxtZUhhbHRcbiIpKTsKK30KKworVk9JRCBNbG1lUmVzZXRSYWxpbmtDb3VudGVycygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCkKK3sKKwlwQWQtPlJhbGlua0NvdW50ZXJzLkxhc3RPbmVTZWNSeE9rRGF0YUNudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhPa0RhdGFDbnQ7CisJLy8gY2xlYXIgYWxsIE9uZVNlY3h4eCBjb3VudGVycy4KKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0JlYWNvblNlbnRDbnQgPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjRmFsc2VDQ0FDbnQgPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhGY3NFcnJDbnQgPSAwOworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhPa0NudCA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudCA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4T2tEYXRhQ250ID0gMDsKKworCS8vIFRPRE86IGZvciBkZWJ1ZyBvbmx5LiB0byBiZSByZW1vdmVkCisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNPc1R4Q291bnRbUUlEX0FDX0JFXSA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNPc1R4Q291bnRbUUlEX0FDX0JLXSA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNPc1R4Q291bnRbUUlEX0FDX1ZJXSA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNPc1R4Q291bnRbUUlEX0FDX1ZPXSA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNEbWFEb25lQ291bnRbUUlEX0FDX0JFXSA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNEbWFEb25lQ291bnRbUUlEX0FDX0JLXSA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNEbWFEb25lQ291bnRbUUlEX0FDX1ZJXSA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNEbWFEb25lQ291bnRbUUlEX0FDX1ZPXSA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeERvbmVDb3VudCA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeENvdW50ID0gMDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4QWdncmVnYXRpb25Db3VudCA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeEFnZ3JlZ2F0aW9uQ291bnQgPSAwOworCisJcmV0dXJuOworfQorCit1bnNpZ25lZCBsb25nIHJ4X0FNU0RVOwordW5zaWduZWQgbG9uZyByeF9Ub3RhbDsKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIHJvdXRpbmUgaXMgZXhlY3V0ZWQgcGVyaW9kaWNhbGx5IHRvIC0KKwkJMS4gRGVjaWRlIGlmIGl0J3MgYSByaWdodCB0aW1lIHRvIHR1cm4gb24gUHdyTWdtdCBiaXQgb2YgYWxsCisJCSAgIG91dGdvaWluZyBmcmFtZXMKKwkJMi4gQ2FsY3VsYXRlIENoYW5uZWxRdWFsaXR5IGJhc2VkIG9uIHN0YXRpc3RpY3Mgb2YgdGhlIGxhc3QKKwkJICAgcGVyaW9kLCBzbyB0aGF0IFRYIHJhdGUgd29uJ3QgdG9nZ2xpbmcgdmVyeSBmcmVxdWVudGx5IGJldHdlZW4gYQorCQkgICBzdWNjZXNzZnVsIFRYIGFuZCBhIGZhaWxlZCBUWC4KKwkJMy4gSWYgdGhlIGNhbGN1bGF0ZWQgQ2hhbm5lbFF1YWxpdHkgaW5kaWNhdGVkIGN1cnJlbnQgY29ubmVjdGlvbiBub3QKKwkJICAgaGVhbHRoeSwgdGhlbiBhIFJPQU1pbmcgYXR0ZW1wdCBpcyB0cmllZCBoZXJlLgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisjZGVmaW5lIEFESE9DX0JFQUNPTl9MT1NUX1RJTUUJCSg4Kk9TX0haKSAgLy8gOCBzZWMKK1ZPSUQgTWxtZVBlcmlvZGljRXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisJVUxPTkcJCQlUeFRvdGFsQ250OworCVBSVE1QX0FEQVBURVIJcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmICgoUlRNUF9URVNUX0ZMQUcocEFkLCAoZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JBRElPX01FQVNVUkVNRU5UIHwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpKSkKKwkJcmV0dXJuOworCisJUlQyOFhYX01MTUVfUFJFX1NBTklUWV9DSEVDSyhwQWQpOworCisjaWZkZWYgUkFMSU5LX0FURQorCS8qIERvIG5vdCBzaG93IFJTU0kgdW50aWwgIk5vcm1hbCAxIHNlY29uZCBNbG1lIFBlcmlvZGljRXhlYyIuICovCisJaWYgKEFURV9PTihwQWQpKQorCXsKKwkJaWYgKHBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kICUgTUxNRV9UQVNLX0VYRUNfTVVMVElQTEUgIT0gKE1MTUVfVEFTS19FWEVDX01VTFRJUExFIC0gMSkpCisJeworCQkJcEFkLT5NbG1lLlBlcmlvZGljUm91bmQgKys7CisJCQlyZXR1cm47CisJCX0KKwl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCS8vIERvIG5vdGhpbmcgaWYgbW9uaXRvciBtb2RlIGlzIG9uCisJCWlmIChNT05JVE9SX09OKHBBZCkpCisJCQlyZXR1cm47CisKKwkJaWYgKHBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kICYgMHgxKQorCQl7CisJCQkvLyBUaGlzIGlzIHRoZSBmaXggZm9yIHdpZmkgMTFuIGV4dGVuc2lvbiBjaGFubmVsIG92ZXJsYXBwaW5nIHRlc3QgY2FzZS4gIGZvciAyODYwRAorCQkJaWYgKCgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA9PSAweDAxMDEpICYmCisJCQkJKFNUQV9UR05fV0lGSV9PTihwQWQpKSAmJgorCQkJCShwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJUb2dnbGUgPT0gRkFMU0UpKQorCisJCQkJeworCQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWE9QX0NUUkxfQ0ZHLCAweDI0QmYpOworCQkJCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJUb2dnbGUgPSBUUlVFOworCQkJCX0KKwkJCQllbHNlIGlmICgoU1RBX1RHTl9XSUZJX09OKHBBZCkpICYmCisJCQkJCQkoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPT0gMHgwMTAxKSkKKwkJCQl7CisJCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYT1BfQ1RSTF9DRkcsIDB4MjQzZik7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlRvZ2dsZSA9IEZBTFNFOworCQkJCX0KKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCXBBZC0+YlVwZGF0ZUJjbkNudERvbmUgPSBGQUxTRTsKKworLy8JUkVDQkFUaW1lclRpbWVvdXQoU3lzdGVtU3BlY2lmaWMxLEZ1bmN0aW9uQ29udGV4dCxTeXN0ZW1TcGVjaWZpYzIsU3lzdGVtU3BlY2lmaWMzKTsKKwlwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCArKzsKKworCS8vIGV4ZWN1dGUgZXZlcnkgNTAwbXMKKwlpZiAoKHBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kICUgNSA9PSAwKSAmJiBSVE1QQXV0b1JhdGVTd2l0Y2hDaGVjayhwQWQpLyooT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKSkqLykKKwl7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCS8vIHBlcmZvcm0gZHluYW1pYyB0eCByYXRlIHN3aXRjaGluZyBiYXNlZCBvbiBwYXN0IFRYIGhpc3RvcnkKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJaWYgKChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkKKwkJCQkJKQorCQkJCSYmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkpCisJCQkJTWxtZUR5bmFtaWNUeFJhdGVTd2l0Y2hpbmcocEFkKTsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KKworCS8vIE5vcm1hbCAxIHNlY29uZCBNbG1lIFBlcmlvZGljRXhlYy4KKwlpZiAocEFkLT5NbG1lLlBlcmlvZGljUm91bmQgJU1MTUVfVEFTS19FWEVDX01VTFRJUExFID09IDApCisJeworICAgICAgICAgICAgICAgIHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICsrOworCisjaWZkZWYgUkFMSU5LX0FURQorICAgIAlpZiAoQVRFX09OKHBBZCkpCisgICAgCXsKKwkJCS8qIHJlcXVlc3QgZnJvbSBCYXJvbiA6IG1vdmUgdGhpcyByb3V0aW5lIGZyb20gbGF0ZXIgdG8gaGVyZSAqLworCQkJLyogZm9yIHNob3dpbmcgUnggZXJyb3IgY291bnQgaW4gQVRFIFJYRlJBTUUgKi8KKyAgICAgICAgICAgIE5JQ1VwZGF0ZVJhd0NvdW50ZXJzKHBBZCk7CisJCQlpZiAocEFkLT5hdGUuYlJ4RmVyID09IDEpCisJCQl7CisJCQkJcEFkLT5hdGUuUnhUb3RhbENudCArPSBwQWQtPmF0ZS5SeENudFBlclNlYzsKKwkJCSAgICBhdGVfcHJpbnQoS0VSTl9FTUVSRyAiTWxtZVBlcmlvZGljRXhlYzogUnggcGFja2V0IGNudCA9ICVkLyVkXG4iLCBwQWQtPmF0ZS5SeENudFBlclNlYywgcEFkLT5hdGUuUnhUb3RhbENudCk7CisJCQkJcEFkLT5hdGUuUnhDbnRQZXJTZWMgPSAwOworCisJCQkJaWYgKHBBZC0+YXRlLlJ4QW50ZW5uYVNlbCA9PSAwKQorCQkJCQlhdGVfcHJpbnQoS0VSTl9FTUVSRyAiTWxtZVBlcmlvZGljRXhlYzogUnggQXZnUnNzaTA9JWQsIEF2Z1Jzc2kxPSVkLCBBdmdSc3NpMj0lZFxuXG4iLAorCQkJCQkJcEFkLT5hdGUuQXZnUnNzaTAsIHBBZC0+YXRlLkF2Z1Jzc2kxLCBwQWQtPmF0ZS5BdmdSc3NpMik7CisJCQkJZWxzZQorCQkJCQlhdGVfcHJpbnQoS0VSTl9FTUVSRyAiTWxtZVBlcmlvZGljRXhlYzogUnggQXZnUnNzaT0lZFxuXG4iLCBwQWQtPmF0ZS5BdmdSc3NpMCk7CisJCQl9CisJCQlNbG1lUmVzZXRSYWxpbmtDb3VudGVycyhwQWQpOworCQkJcmV0dXJuOworICAgIAl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisKKwkJaWYgKHJ4X1RvdGFsKQorCQl7CisKKwkJCS8vIHJlc2V0IGNvdW50ZXJzCisJCQlyeF9BTVNEVSA9IDA7CisJCQlyeF9Ub3RhbCA9IDA7CisJCX0KKworCQkvL09SSUJBVGltZXJUaW1lb3V0KHBBZCk7CisKKwkJLy8gTWVkaWEgc3RhdHVzIGNoYW5nZWQsIHJlcG9ydCB0byBORElTCisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTUVESUFfU1RBVEVfQ0hBTkdFKSkKKwkJeworCQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9NRURJQV9TVEFURV9DSEFOR0UpOworCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwkJCXsKKwkJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworCQkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CisKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOworCQkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CisJCQl9CisJCX0KKworCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZwQWQtPk1sbWUuTm93MzIpOworCisJCS8vIGFkZCB0aGUgbW9zdCB1cC10by1kYXRlIGgvdyByYXcgY291bnRlcnMgaW50byBzb2Z0d2FyZSB2YXJpYWJsZSwgc28gdGhhdAorCQkvLyB0aGUgZHluYW1pYyB0dW5pbmcgbWVjaGFuaXNtIGJlbG93IGFyZSBiYXNlZCBvbiBtb3N0IHVwLXRvLWRhdGUgaW5mb3JtYXRpb24KKwkJTklDVXBkYXRlUmF3Q291bnRlcnMocEFkKTsKKworI2lmZGVmIFJUMjg3MAorCQlSVDI4NzBfV2F0Y2hEb2cocEFkKTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgCQkvLyBOZWVkIHN0YXRpc3RpY3MgYWZ0ZXIgcmVhZCBjb3VudGVyLiBTbyBwdXQgYWZ0ZXIgTklDVXBkYXRlUmF3Q291bnRlcnMKKwkJT1JJQkFUaW1lclRpbWVvdXQocEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkvLyBpZiBNR01UIFJJTkcgaXMgZnVsbCBtb3JlIHRoYW4gdHdpY2Ugd2l0aGluIDEgc2Vjb25kLCB3ZSBjb25zaWRlciB0aGVyZSdzCisJCS8vIGEgaGFyZHdhcmUgcHJvYmxlbSBzdHVja2luZyB0aGUgVFggcGF0aC4gSW4gdGhpcyBjYXNlLCB0cnkgYSBoYXJkd2FyZSByZXNldAorCQkvLyB0byByZWNvdmVyIHRoZSBzeXN0ZW0KKwkvLwlpZiAocEFkLT5SYWxpbmtDb3VudGVycy5NZ210UmluZ0Z1bGxDb3VudCA+PSAyKQorCS8vCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQVJEV0FSRV9FUlJPUik7CisJLy8JZWxzZQorCS8vCQlwQWQtPlJhbGlua0NvdW50ZXJzLk1nbXRSaW5nRnVsbENvdW50ID0gMDsKKworCQkvLyBUaGUgdGltZSBwZXJpb2QgZm9yIGNoZWNraW5nIGFudGVubmEgaXMgYWNjb3JkaW5nIHRvIHRyYWZmaWMKKwkJaWYgKHBBZC0+TWxtZS5iRW5hYmxlQXV0b0FudGVubmFDaGVjaykKKwkJeworCQkJVHhUb3RhbENudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArCisJCQkJCQkJIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKworCQkJCQkJCSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50OworCisJCQlpZiAoVHhUb3RhbENudCA+IDUwKQorCQkJeworCQkJCWlmIChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDEwID09IDApCisJCQkJeworCQkJCQlBc2ljRXZhbHVhdGVSeEFudChwQWQpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAocEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgJSAzID09IDApCisJCQkJeworCQkJCQlBc2ljRXZhbHVhdGVSeEFudChwQWQpOworCQkJCX0KKwkJCX0KKwkJfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQlTVEFNbG1lUGVyaW9kaWNFeGVjKHBBZCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJTWxtZVJlc2V0UmFsaW5rQ291bnRlcnMocEFkKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQl7CisJCQkJLy8gV2hlbiBBZGhvYyBiZWFjb24gaXMgZW5hYmxlZCBhbmQgUlRTL0NUUyBpcyBlbmFibGVkLCB0aGVyZSBpcyBhIGNoYW5jZSB0aGF0IGhhcmR3YXJlIE1BQyBGU00gd2lsbCBydW4gaW50byBhIGRlYWRsb2NrCisJCQkJLy8gYW5kIHNlbmRpbmcgQ1RTLXRvLXNlbGYgb3ZlciBhbmQgb3Zlci4KKwkJCQkvLyBTb2Z0d2FyZSBQYXRjaCBTb2x1dGlvbjoKKwkJCQkvLyAxLiBQb2xsaW5nIGRlYnVnIHN0YXRlIHJlZ2lzdGVyIDB4MTBGNCBldmVyeSBvbmUgc2Vjb25kLgorCQkJCS8vIDIuIElmIGluIDB4MTBGNCB0aGUgKChiaXQyOT09MSkgJiYgKGJpdDc9PTEpKSBPUiAoKGJpdDI5PT0xKSAmJiAoYml0NT09MSkpLCBpdCBtZWFucyB0aGUgZGVhZGxvY2sgaGFzIG9jY3VycmVkLgorCQkJCS8vIDMuIElmIHRoZSBkZWFkbG9jayBvY2N1cnJlZCwgcmVzZXQgTUFDL0JCUCBieSBzZXR0aW5nIDB4MTAwNCB0byAweDAwMDEgZm9yIGEgd2hpbGUgdGhlbiBzZXR0aW5nIGl0IGJhY2sgdG8gMHgwMDBDIGFnYWluLgorCisJCQkJVUlOVDMyCU1hY1JlZyA9IDA7CisKKwkJCQlSVE1QX0lPX1JFQUQzMihwQWQsIDB4MTBGNCwgJk1hY1JlZyk7CisJCQkJaWYgKCgoTWFjUmVnICYgMHgyMDAwMDAwMCkgJiYgKE1hY1JlZyAmIDB4ODApKSB8fCAoKE1hY1JlZyAmIDB4MjAwMDAwMDApICYmIChNYWNSZWcgJiAweDIwKSkpCisJCQkJeworCQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4MSk7CisJCQkJCVJUTVB1c2VjRGVsYXkoMSk7CisJCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHhDKTsKKworCQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCgiV2FybmluZywgTUFDIHNwZWNpZmljIGNvbmRpdGlvbiBvY2N1cnMgXG4iKSk7CisJCQkJfQorCQkJfQorCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCX0KKworCisJcEFkLT5iVXBkYXRlQmNuQ250RG9uZSA9IEZBTFNFOworfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitWT0lEIFNUQU1sbWVQZXJpb2RpY0V4ZWMoCisJUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUxPTkcJVHhUb3RhbENudDsKKwlpbnQgCWk7CisKKy8vCisvLyBXZSByZXR1cm4gaGVyZSBpbiBBVEUgbW9kZSwgYmVjYXVzZSB0aGUgc3RhdGlzdGljcworLy8gdGhhdCBBVEUgbmVlZHMgYXJlIG5vdCBjb2xsZWN0ZWQgdmlhIHRoaXMgcm91dGluZS4KKy8vCisjaWZkZWYgUkFMSU5LX0FURQorCS8vIEl0IGlzIHN1cHBvc2VkIHRoYXQgd2Ugd2lsbCBuZXZlciByZWFjaCBoZXJlIGluIEFURSBtb2RlLgorCUFTU0VSVCghKEFURV9PTihwQWQpKSk7CisJaWYgKEFURV9PTihwQWQpKQorCQlyZXR1cm47CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgeworICAgIAkvLyBXUEEgTUlDIGVycm9yIHNob3VsZCBibG9jayBhc3NvY2lhdGlvbiBhdHRlbXB0IGZvciA2MCBzZWNvbmRzCisgICAgCWlmIChwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyAmJiAocEFkLT5TdGFDZmcuTGFzdE1pY0Vycm9yVGltZSArICg2MCAqIE9TX0haKSA8IHBBZC0+TWxtZS5Ob3czMikpCisgICAgCQlwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyA9IEZBTFNFOworICAgIH0KKworICAgIGlmICgocEFkLT5QcmVNZWRpYVN0YXRlICE9IHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlKSAmJiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpKQorCXsKKwkJaWYgKHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID09IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkKQorCQl7CisJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TVEFfTElOS1VQX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJCX0KKwkJcEFkLT5QcmVNZWRpYVN0YXRlID0gcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGU7CisJfQorCisKKworCisgICAJQXNpY1N0YUJicFR1bmluZyhwQWQpOworCisJVHhUb3RhbENudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArCisJCQkJCSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKKwkJCQkJIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQ7CisKKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQorCXsKKwkJLy8gdXBkYXRlIGNoYW5uZWwgcXVhbGl0eSBmb3IgUm9hbWluZyBhbmQgVUkgTGlua1F1YWxpdHkgZGlzcGxheQorCQlNbG1lQ2FsY3VsYXRlQ2hhbm5lbFF1YWxpdHkocEFkLCBwQWQtPk1sbWUuTm93MzIpOworCX0KKworCS8vIG11c3QgYmUgQUZURVIgTWxtZUR5bmFtaWNUeFJhdGVTd2l0Y2hpbmcoKSBiZWNhdXNlIGl0IG5lZWRzIHRvIGtub3cgaWYKKwkvLyBSYWRpbyBpcyBjdXJyZW50bHkgaW4gbm9pc3kgZW52aXJvbm1lbnQKKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisJCUFzaWNBZGp1c3RUeFBvd2VyKHBBZCk7CisKKwlpZiAoSU5GUkFfT04ocEFkKSkKKwl7CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCS8vIENoZWNrIERMUyB0aW1lIG91dCwgdGhlbiB0ZWFyIGRvd24gdGhvc2Ugc2Vzc2lvbgorCQlSVE1QQ2hlY2tETFNUaW1lT3V0KHBBZCk7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKwkJLy8gSXMgUFNNIGJpdCBjb25zaXN0ZW50IHdpdGggdXNlciBwb3dlciBtYW5hZ2VtZW50IHBvbGljeT8KKwkJLy8gVGhpcyBpcyB0aGUgb25seSBwbGFjZSB0aGF0IHdpbGwgc2V0IFBTTSBiaXQgT04uCisJCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKwkJTWxtZUNoZWNrUHNtQ2hhbmdlKHBBZCwgcEFkLT5NbG1lLk5vdzMyKTsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLkxhc3RPbmVTZWNUb3RhbFR4Q291bnQgPSBUeFRvdGFsQ250OworCisJCWlmICgocEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSArIDEqT1NfSFogPCBwQWQtPk1sbWUuTm93MzIpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpICYmCisJCQkoKFR4VG90YWxDbnQgKyBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4T2tDbnQgPCA2MDApKSkKKwkJeworCQkJUlRNUFNldEFHQ0luaXRWYWx1ZShwQWQsIEJXXzIwKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gTm8gQkVBQ09OLiByZXN0b3JlIFI2NiB0byB0aGUgbG93IGJvdW5kKCVkKSBcbiIsICgweDJFICsgR0VUX0xOQV9HQUlOKHBBZCkpKSk7CisJCX0KKworICAgICAgICAvL2lmICgocEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ID09IDApICYmCisgICAgICAgIC8vICAgIChwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ID09IDApKQorICAgICAgICB7CisgICAgCQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlKQorICAgIAkJeworICAgIAkJICAgIC8vIFdoZW4gQVBTRCBpcyBlbmFibGVkLCB0aGUgcGVyaW9kIGNoYW5nZXMgYXMgMjAgc2VjCisgICAgCQkJaWYgKChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDIwKSA9PSA4KQorICAgIAkJCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSwgVFJVRSk7CisgICAgCQl9CisgICAgCQllbHNlCisgICAgCQl7CisgICAgCQkgICAgLy8gU2VuZCBvdXQgYSBOVUxMIGZyYW1lIGV2ZXJ5IDEwIHNlYyB0byBpbmZvcm0gQVAgdGhhdCBTVEEgaXMgc3RpbGwgYWxpdmUgKEF2b2lkIGJlaW5nIGFnZSBvdXQpCisgICAgCQkJaWYgKChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDEwKSA9PSA4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKQorICAgIAkJCQkJUlRNUFNlbmROdWxsRnJhbWUocEFkLCBwQWQtPkNvbW1vbkNmZy5UeFJhdGUsIFRSVUUpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisJCQkJCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSwgRkFMU0UpOworICAgICAgICAgICAgICAgIH0KKyAgICAJCX0KKyAgICAgICAgfQorCisJCWlmIChDUUlfSVNfREVBRChwQWQtPk1sbWUuQ2hhbm5lbFF1YWxpdHkpKQorCQkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTU1DSEsgLSBObyBCRUFDT04uIERlYWQgQ1FJLiBBdXRvIFJlY292ZXJ5IGF0dGVtcHQgIyVsZFxuIiwgcEFkLT5SYWxpbmtDb3VudGVycy5CYWRDUUlBdXRvUmVjb3ZlcnlDb3VudCkpOworCQkJcEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUFJlcG9ydEZsYWcgPSBUUlVFOworCQkJcEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUExpbmtEb3duVGltZSA9IHBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWU7CisKKwkJCS8vIExvc3QgQVAsIHNlbmQgZGlzY29ubmVjdCAmIGxpbmsgZG93biBldmVudAorCQkJTGlua0Rvd24ocEFkLCBGQUxTRSk7CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKQorCQkJeworICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKyAgICAgICAgICAgICAgICAvL3NlbmQgZGlzYXNzb2NpYXRlIGV2ZW50IHRvIHdwYV9zdXBwbGljYW50CisgICAgICAgICAgICAgICAgbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworICAgICAgICAgICAgICAgIHdycXUuZGF0YS5mbGFncyA9IFJUX0RJU0FTU09DX0VWRU5UX0ZMQUc7CisgICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgICAgICAgICAgICAgIG1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKKyAgICAgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisgICAgICAgICAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCQkJLy8gUlRNUFBhdGNoTWFjQmJwQnVnKHBBZCk7CisJCQlNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKHBBZCk7CisJCX0KKwkJZWxzZSBpZiAoQ1FJX0lTX0JBRChwQWQtPk1sbWUuQ2hhbm5lbFF1YWxpdHkpKQorCQl7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLkJhZENRSUF1dG9SZWNvdmVyeUNvdW50ICsrOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTU1DSEsgLSBCYWQgQ1FJLiBBdXRvIFJlY292ZXJ5IGF0dGVtcHQgIyVsZFxuIiwgcEFkLT5SYWxpbmtDb3VudGVycy5CYWRDUUlBdXRvUmVjb3ZlcnlDb3VudCkpOworCQkJTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRChwQWQpOworCQl9CisKKwkJLy8gQWRkIGF1dG8gc2VhbWxlc3Mgcm9hbWluZworCQlpZiAocEFkLT5TdGFDZmcuYkZhc3RSb2FtaW5nKQorCQl7CisJCQlTSE9SVAlkQm1Ub1JvYW0gPSAoU0hPUlQpcEFkLT5TdGFDZmcuZEJtVG9Sb2FtOworCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSc3NpPSVkLCBkQm1Ub1JvYW09JWRcbiIsIFJUTVBNYXhSc3NpKHBBZCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMiksIChDSEFSKWRCbVRvUm9hbSkpOworCisJCQlpZiAoUlRNUE1heFJzc2kocEFkLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyKSA8PSAoQ0hBUilkQm1Ub1JvYW0pCisJCQl7CisJCQkJTWxtZUNoZWNrRm9yRmFzdFJvYW1pbmcocEFkLCBwQWQtPk1sbWUuTm93MzIpOworCQkJfQorCQl9CisJfQorCWVsc2UgaWYgKEFESE9DX09OKHBBZCkpCisJeworCQkvL3JhZGFyIGRldGVjdAorCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKKwkJCSYmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKQorCQkJJiYgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSkKKwkJeworCQkJUmFkYXJEZXRlY3RQZXJpb2RpYyhwQWQpOworCQl9CisKKwkJLy8gSWYgYWxsIHBlZXJzIGxlYXZlLCBhbmQgdGhpcyBTVEEgYmVjb21lcyB0aGUgbGFzdCBvbmUgaW4gdGhpcyBJQlNTLCB0aGVuIGNoYW5nZSBNZWRpYVN0YXRlCisJCS8vIHRvIERJU0NPTk5FQ1RFRC4gQnV0IHN0aWxsIGhvbGRpbmcgdGhpcyBJQlNTIChpLmUuIHNlbmRpbmcgQkVBQ09OKSBzbyB0aGF0IG90aGVyIFNUQXMgY2FuCisJCS8vIGpvaW4gbGF0ZXIuCisJCWlmICgocEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSArIEFESE9DX0JFQUNPTl9MT1NUX1RJTUUgPCBwQWQtPk1sbWUuTm93MzIpICYmCisJCQlPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJCXsKKwkJCU1MTUVfU1RBUlRfUkVRX1NUUlVDVCAgICAgU3RhcnRSZXE7CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gZXhjZXNzaXZlIEJFQUNPTiBsb3N0LCBsYXN0IFNUQSBpbiB0aGlzIElCU1MsIE1lZGlhU3RhdGU9RGlzY29ubmVjdGVkXG4iKSk7CisJCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKKworCQkJU3RhcnRQYXJtRmlsbChwQWQsICZTdGFydFJlcSwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TVEFSVF9SRVEsIHNpemVvZihNTE1FX1NUQVJUX1JFUV9TVFJVQ1QpLCAmU3RhcnRSZXEpOworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9TVEFSVDsKKwkJfQorCisJCWZvciAoaSA9IDE7IGkgPCBNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQorCQl7CisJCQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W2ldOworCisJCQlpZiAocEVudHJ5LT5WYWxpZEFzQ0xJID09IEZBTFNFKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAocEVudHJ5LT5MYXN0QmVhY29uUnhUaW1lICsgQURIT0NfQkVBQ09OX0xPU1RfVElNRSA8IHBBZC0+TWxtZS5Ob3czMikKKwkJCQlNYWNUYWJsZURlbGV0ZUVudHJ5KHBBZCwgcEVudHJ5LT5BaWQsIHBFbnRyeS0+QWRkcik7CisJCX0KKwl9CisJZWxzZSAvLyBubyBJTkZSQSBub3IgQURIT0MgY29ubmVjdGlvbgorCXsKKworCQlpZiAocEFkLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSAmJgorICAgICAgICAgICAgKChwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgKyAzMCAqIE9TX0haKSA+IHBBZC0+TWxtZS5Ob3czMikpCisJCQlnb3RvIFNLSVBfQVVUT19TQ0FOX0NPTk47CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBGQUxTRTsKKworCQlpZiAoKHBBZC0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID09IFRSVUUpCisJCQkmJiBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfU1RBUlRfVVApCisJCQkmJiAoTWxtZVZhbGlkYXRlU1NJRChwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbikgPT0gVFJVRSkpCisJCXsKKwkJCWlmICgocEFkLT5TY2FuVGFiLkJzc05yPT0wKSAmJiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpKQorCQkJeworCQkJCU1MTUVfU0NBTl9SRVFfU1RSVUNUCSAgIFNjYW5SZXE7CisKKwkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSArIDEwICogT1NfSFopIDwgcEFkLT5NbG1lLk5vdzMyKQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1RBTWxtZVBlcmlvZGljRXhlYygpOkNOVEwgLSBTY2FuVGFiLkJzc05yPT0wLCBzdGFydCBhIG5ldyBBQ1RJVkUgc2NhbiBTU0lEWyVzXVxuIiwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkKSk7CisJCQkJCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbiwgQlNTX0FOWSwgU0NBTl9BQ1RJVkUpOworCQkJCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsIHNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKKwkJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOworCQkJCQkvLyBSZXNldCBNaXNzZWQgc2NhbiBudW1iZXIKKwkJCQkJcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gcEFkLT5NbG1lLk5vdzMyOworCQkJCX0KKwkJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykJLy8gUXVpdCB0aGUgZm9yZXZlciBzY2FuIHdoZW4gaW4gYSB2ZXJ5IGNsZWFuIHJvb20KKwkJCQkJTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRChwQWQpOworCQkJfQorCQkJZWxzZSBpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpCisJCQl7CisJCQkJaWYgKChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDcpID09IDApCisJCQkJeworCQkJCQlNbG1lQXV0b1NjYW4ocEFkKTsKKwkJCQkJcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gcEFkLT5NbG1lLk5vdzMyOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8gUm9nZXIgc3luYyBDYXJyaWVyCisJCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9PSBUUlVFKQorCQkJCQl7CisJCQkJCQlpZiAoKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgNSkgPT0gMSkKKwkJCQkJCQlNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKHBBZCk7CisJCQkJCX0KKwkJCQkJZWxzZQorI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKwkJCQkJCU1sbWVBdXRvUmVjb25uZWN0TGFzdFNTSUQocEFkKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKK1NLSVBfQVVUT19TQ0FOX0NPTk46CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICBpZiAoKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uVFhCQWJpdG1hcCAhPTApICYmIChwQWQtPk1hY1RhYi5mQW55QkFTZXNzaW9uID09IEZBTFNFKSkKKwl7CisJCXBBZC0+TWFjVGFiLmZBbnlCQVNlc3Npb24gPSBUUlVFOworCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIEhUX0ZPUkNFUlRTQ1RTLCAgQUxMTl9TRVRQUk9URUNULCBGQUxTRSwgRkFMU0UpOworCX0KKwllbHNlIGlmICgocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5UWEJBYml0bWFwID09MCkgJiYgKHBBZC0+TWFjVGFiLmZBbnlCQVNlc3Npb24gPT0gVFJVRSkpCisJeworCQlwQWQtPk1hY1RhYi5mQW55QkFTZXNzaW9uID0gRkFMU0U7CisJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgIEFMTE5fU0VUUFJPVEVDVCwgRkFMU0UsIEZBTFNFKTsKKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorI2lmZGVmIERPVDExTl9EUkFGVDMKKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TQ0FOXzIwNDApKQorCQlUcmlFdmVudENvdW50ZXJNYWludGVuYW5jZShwQWQpOworI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCXJldHVybjsKK30KKworLy8gTGluayBkb3duIHJlcG9ydAorVk9JRCBMaW5rRG93bkV4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCisJUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OworCisJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKKwlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOworICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX0RPV047Cit9CisKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRCBNbG1lQXV0b1NjYW4oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJLy8gY2hlY2sgQ250bE1hY2hpbmUuQ3VyclN0YXRlIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIE5ESVMgU2V0T0lEIHJlcXVlc3QKKwlpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIERyaXZlciBhdXRvIHNjYW5cbiIpKTsKKwkJTWxtZUVucXVldWUocEFkLAorCQkJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCQkJT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU4sCisJCQkJCTAsCisJCQkJCU5VTEwpOworCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisJfQorfQorCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQgTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKworCisJLy8gY2hlY2sgQ250bE1hY2hpbmUuQ3VyclN0YXRlIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIE5ESVMgU2V0T0lEIHJlcXVlc3QKKwlpZiAoKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPT0gQ05UTF9JRExFKSAmJgorCQkoTWxtZVZhbGlkYXRlU1NJRChwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbikgPT0gVFJVRSkpCisJeworCQlORElTXzgwMl8xMV9TU0lEIE9pZFNzaWQ7CisJCU9pZFNzaWQuU3NpZExlbmd0aCA9IHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbjsKKwkJTmRpc01vdmVNZW1vcnkoT2lkU3NpZC5Tc2lkLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRHJpdmVyIGF1dG8gcmVjb25uZWN0IHRvIGxhc3QgT0lEXzgwMl8xMV9TU0lEIHNldHRpbmcgLSAlcywgbGVuIC0gJWRcbiIsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKSk7CisJCU1sbWVFbnF1ZXVlKHBBZCwKKwkJCQkJTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisJCQkJCU9JRF84MDJfMTFfU1NJRCwKKwkJCQkJc2l6ZW9mKE5ESVNfODAyXzExX1NTSUQpLAorCQkJCQkmT2lkU3NpZCk7CisJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwl9Cit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlWYWxpZGF0ZSBTU0lEIGZvciBjb25uZWN0aW9uIHRyeSBhbmQgcmVzY2FuIHB1cnBvc2UKKwlWYWxpZCBTU0lEIHdpbGwgaGF2ZSB2aXNpYmxlIGNoYXJzIG9ubHkuCisJVGhlIHZhbGlkIGxlbmd0aCBpcyBmcm9tIDAgdG8gMzIuCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBNbG1lVmFsaWRhdGVTU0lEKAorCUlOIFBVQ0hBUglwU3NpZCwKKwlJTiBVQ0hBUglTc2lkTGVuKQoreworCWludAlpbmRleDsKKworCWlmIChTc2lkTGVuID4gTUFYX0xFTl9PRl9TU0lEKQorCQlyZXR1cm4gKEZBTFNFKTsKKworCS8vIENoZWNrIGVhY2ggY2hhcmFjdGVyIHZhbHVlCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgU3NpZExlbjsgaW5kZXgrKykKKwl7CisJCWlmIChwU3NpZFtpbmRleF0gPCAweDIwKQorCQkJcmV0dXJuIChGQUxTRSk7CisJfQorCisJLy8gQWxsIGNoZWNrZWQKKwlyZXR1cm4gKFRSVUUpOworfQorCitWT0lEIE1sbWVTZWxlY3RUeFJhdGVUYWJsZSgKKwlJTiBQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4gUE1BQ19UQUJMRV9FTlRSWQkJcEVudHJ5LAorCUlOIFBVQ0hBUgkJCQkqcHBUYWJsZSwKKwlJTiBQVUNIQVIJCQkJcFRhYmxlU2l6ZSwKKwlJTiBQVUNIQVIJCQkJcEluaXRUeFJhdGVJZHgpCit7CisJZG8KKwl7CisJCS8vIGRlY2lkZSB0aGUgcmF0ZSB0YWJsZSBmb3IgdHVuaW5nCisJCWlmIChwQWQtPkNvbW1vbkNmZy5UeFJhdGVUYWJsZVNpemUgPiAwKQorCQl7CisJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTsKKwkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlWzBdOworCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlWzFdOworCisJCQlicmVhazsKKwkJfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCWlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYgQURIT0NfT04ocEFkKSkKKwkJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpICYmCisJCQkJKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJgorCQkJCSgocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4MDApIHx8IChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpKSkKKwkJCXsvLyAxMU4gMVMgQWRob2MKKwkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTOworCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVNbMF07CisJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVNbMV07CisKKwkJCX0KKwkJCWVsc2UgaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpICYmCisJCQkJCShwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMHhmZikgJiYKKwkJCQkJKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAweGZmKSAmJgorCQkJCQkocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKSkKKwkJCXsvLyAxMU4gMlMgQWRob2MKKwkJCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQorCQkJCXsKKwkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4yUzsKKwkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU1swXTsKKwkJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMV07CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZDsKKwkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzBdOworCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzFdOworCQkJCX0KKworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCWlmICgocEVudHJ5LT5SYXRlTGVuID09IDQpCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJCSYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAwKQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCQkpCisJCQl7CisJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUI7CisJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJbMF07CisJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCWzFdOworCisJCQl9CisJCQllbHNlIGlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpCisJCQl7CisJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUJHOworCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFCR1swXTsKKwkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJHWzFdOworCisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUc7CisJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUdbMF07CisJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFHWzFdOworCisJCQl9CisJCQlicmVhazsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCS8vaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuICsgcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiA9PSAxMikgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDB4ZmYpICYmCisJCS8vCSgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMHgwMCkgfHwgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkpKQorCQlpZiAoKHBFbnRyeS0+UmF0ZUxlbiA9PSAxMikgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJgorCQkJKChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMHgwMCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDEpKSkKKwkJey8vIDExQkdOIDFTIEFQCisJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMVM7CisJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMVNbMF07CisJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJHTjFTWzFdOworCisJCQlicmVhazsKKwkJfQorCisJCS8vZWxzZSBpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gKyBwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuID09IDEyKSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMHhmZikgJiYKKwkJLy8JKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDB4ZmYpICYmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpKQorCQlpZiAoKHBFbnRyeS0+UmF0ZUxlbiA9PSAxMikgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJgorCQkJKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAweGZmKSAmJiAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMikpCisJCXsvLyAxMUJHTiAyUyBBUAorCQkJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKKwkJCXsKKwkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlM7CisJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJHTjJTWzBdOworCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNbMV07CisKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNGb3JBQmFuZDsKKwkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNGb3JBQmFuZFswXTsKKwkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJHTjJTRm9yQUJhbmRbMV07CisKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJLy9lbHNlIGlmICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMHhmZikgJiYgKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAweDAwKSB8fCAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKSkpCisJCWlmICgocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDB4ZmYpICYmICgocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4MDApIHx8IChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAxKSkpCisJCXsvLyAxMU4gMVMgQVAKKwkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVM7CisJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTWzBdOworCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVNbMV07CisKKwkJCWJyZWFrOworCQl9CisKKwkJLy9lbHNlIGlmICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMHhmZikgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDB4ZmYpICYmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpKQorCQlpZiAoKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4ZmYpICYmIChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAyKSkKKwkJey8vIDExTiAyUyBBUAorCQkJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKKwkJCXsKKwkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlM7CisJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTWzBdOworCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMV07CisgICAgICAgICAgICB9CisJCQllbHNlCisJCQl7CisJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kOworCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZFswXTsKKwkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzFdOworCQkJfQorCisJCQlicmVhazsKKwkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkvL2Vsc2UgaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuID09IDQpICYmIChwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuID09IDApICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSA9PSAwKSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMCkpCisJCWlmICgocEVudHJ5LT5SYXRlTGVuID09IDQpCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDApICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMCkKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCSkKKwkJey8vIEIgb25seSBBUAorCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUI7CisJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQlswXTsKKwkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQlsxXTsKKworCQkJYnJlYWs7CisJCX0KKworCQkvL2Vsc2UgaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuICsgcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiA+IDgpICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSA9PSAwKSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMCkpCisJCWlmICgocEVudHJ5LT5SYXRlTGVuID4gOCkKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCSYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAwKQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJKQorCQl7Ly8gQi9HICBtaXhlZCBBUAorCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUJHOworCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJHWzBdOworCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCR1sxXTsKKworCQkJYnJlYWs7CisJCX0KKworCQkvL2Vsc2UgaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuICsgcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiA9PSA4KSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDApKQorCQlpZiAoKHBFbnRyeS0+UmF0ZUxlbiA9PSA4KQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAwKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDApCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkpCisJCXsvLyBHIG9ubHkgQVAKKwkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFHOworCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUdbMF07CisJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUdbMV07CisKKwkJCWJyZWFrOworCQl9CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJLy9lbHNlIGlmICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDApKQorCQkJaWYgKChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAwKSkKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCXsJLy8gTGVnYWN5IG1vZGUKKwkJCQlpZiAocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlIDw9IFJBVEVfMTEpCisJCQkJeworCQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQjsKKwkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJbMF07CisJCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQlsxXTsKKwkJCQl9CisJCQkJZWxzZSBpZiAoKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA+IFJBVEVfMTEpICYmIChwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGUgPiBSQVRFXzExKSkKKwkJCQl7CisJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFHOworCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExR1swXTsKKwkJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFHWzFdOworCisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCRzsKKwkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJHWzBdOworCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJHWzFdOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpCisJCQl7CisJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDEpCisJCQkJeworCQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTOworCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTWzBdOworCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4xU1sxXTsKKwkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiRFJTOiB1bmtvd24gbW9kZSxkZWZhdWx0IHVzZSAxMU4gMVMgQVAgXG4iKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlM7CisJCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMF07CisJCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTWzFdOworCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJEUlM6IHVua293biBtb2RlLGRlZmF1bHQgdXNlIDExTiAyUyBBUCBcbiIpKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDEpCisJCQkJeworCQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTOworCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTWzBdOworCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4xU1sxXTsKKwkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiRFJTOiB1bmtvd24gbW9kZSxkZWZhdWx0IHVzZSAxMU4gMVMgQVAgXG4iKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZDsKKwkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzBdOworCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzFdOworCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJEUlM6IHVua293biBtb2RlLGRlZmF1bHQgdXNlIDExTiAyUyBBUCBcbiIpKTsKKwkJCQl9CisJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJEUlM6IHVua293biBtb2RlIChTdXBSYXRlTGVuPSVkLCBFeHRSYXRlTGVuPSVkLCBNQ1NTZXRbMF09MHgleCwgTUNTU2V0WzFdPTB4JXgpXG4iLAorCQkJCXBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4sIHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4sIHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdLCBwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSkpOworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfSB3aGlsZShGQUxTRSk7Cit9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIGNoZWNrcyBpZiB0aGVyZSdyZSBvdGhlciBBUHMgb3V0IHRoZXJlIGNhcGFibGUgZm9yCisJCXJvYW1pbmcuIENhbGxlciBzaG91bGQgY2FsbCB0aGlzIHJvdXRpbmUgb25seSB3aGVuIExpbmsgdXAgaW4gSU5GUkEgbW9kZQorCQlhbmQgY2hhbm5lbCBxdWFsaXR5IGlzIGJlbG93IENRSV9HT09EX1RIUkVTSE9MRC4KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJT3V0cHV0OgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZUNoZWNrRm9yUm9hbWluZygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVTE9ORwlOb3czMikKK3sKKwlVU0hPUlQJICAgaTsKKwlCU1NfVEFCTEUgICpwUm9hbVRhYiA9ICZwQWQtPk1sbWVBdXguUm9hbVRhYjsKKwlCU1NfRU5UUlkgICpwQnNzOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IE1sbWVDaGVja0ZvclJvYW1pbmdcbiIpKTsKKwkvLyBwdXQgYWxsIHJvYW1pbmcgY2FuZGlkYXRlcyBpbnRvIFJvYW1UYWIsIGFuZCBzb3J0IGluIFJTU0kgb3JkZXIKKwlCc3NUYWJsZUluaXQocFJvYW1UYWIpOworCWZvciAoaSA9IDA7IGkgPCBwQWQtPlNjYW5UYWIuQnNzTnI7IGkrKykKKwl7CisJCXBCc3MgPSAmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldOworCisJCWlmICgocEJzcy0+TGFzdEJlYWNvblJ4VGltZSArIEJFQUNPTl9MT1NUX1RJTUUpIDwgTm93MzIpCisJCQljb250aW51ZTsJIC8vIEFQIGRpc2FwcGVhcgorCQlpZiAocEJzcy0+UnNzaSA8PSBSU1NJX1RIUkVTSE9MRF9GT1JfUk9BTUlORykKKwkJCWNvbnRpbnVlOwkgLy8gUlNTSSB0b28gd2Vhay4gZm9yZ2V0IGl0LgorCQlpZiAoTUFDX0FERFJfRVFVQUwocEJzcy0+QnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKSkKKwkJCWNvbnRpbnVlOwkgLy8gc2tpcCBjdXJyZW50IEFQCisJCWlmIChwQnNzLT5Sc3NpIDwgKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwICsgUlNTSV9ERUxUQSkpCisJCQljb250aW51ZTsJIC8vIG9ubHkgQVAgd2l0aCBzdHJvbmdlciBSU1NJIGlzIGVsaWdpYmxlIGZvciByb2FtaW5nCisKKwkJLy8gQVAgcGFzc2luZyBhbGwgYWJvdmUgcnVsZXMgaXMgcHV0IGludG8gcm9hbWluZyBjYW5kaWRhdGUgdGFibGUKKwkJTmRpc01vdmVNZW1vcnkoJnBSb2FtVGFiLT5Cc3NFbnRyeVtwUm9hbVRhYi0+QnNzTnJdLCBwQnNzLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJCXBSb2FtVGFiLT5Cc3NOciArPSAxOworCX0KKworCWlmIChwUm9hbVRhYi0+QnNzTnIgPiAwKQorCXsKKwkJLy8gY2hlY2sgQ250bE1hY2hpbmUuQ3VyclN0YXRlIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIE5ESVMgU2V0T0lEIHJlcXVlc3QKKwkJaWYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPT0gQ05UTF9JRExFKQorCQl7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLlBvb3JDUUlSb2FtaW5nQ291bnQgKys7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIFJvYW1pbmcgYXR0ZW1wdCAjJWxkXG4iLCBwQWQtPlJhbGlua0NvdW50ZXJzLlBvb3JDUUlSb2FtaW5nQ291bnQpKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1JPQU1JTkdfUkVRLCAwLCBOVUxMKTsKKwkJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwkJfQorCX0KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gTWxtZUNoZWNrRm9yUm9hbWluZygjIG9mIGNhbmRpZGF0ZT0gJWQpXG4iLHBSb2FtVGFiLT5Cc3NOcikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoaXMgcm91dGluZSBjaGVja3MgaWYgdGhlcmUncmUgb3RoZXIgQVBzIG91dCB0aGVyZSBjYXBhYmxlIGZvcgorCQlyb2FtaW5nLiBDYWxsZXIgc2hvdWxkIGNhbGwgdGhpcyByb3V0aW5lIG9ubHkgd2hlbiBsaW5rIHVwIGluIElORlJBIG1vZGUKKwkJYW5kIGNoYW5uZWwgcXVhbGl0eSBpcyBiZWxvdyBDUUlfR09PRF9USFJFU0hPTEQuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU91dHB1dDoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVDaGVja0ZvckZhc3RSb2FtaW5nKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVMT05HCQkJTm93KQoreworCVVTSE9SVAkJaTsKKwlCU1NfVEFCTEUJKnBSb2FtVGFiID0gJnBBZC0+TWxtZUF1eC5Sb2FtVGFiOworCUJTU19FTlRSWQkqcEJzczsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBNbG1lQ2hlY2tGb3JGYXN0Um9hbWluZ1xuIikpOworCS8vIHB1dCBhbGwgcm9hbWluZyBjYW5kaWRhdGVzIGludG8gUm9hbVRhYiwgYW5kIHNvcnQgaW4gUlNTSSBvcmRlcgorCUJzc1RhYmxlSW5pdChwUm9hbVRhYik7CisJZm9yIChpID0gMDsgaSA8IHBBZC0+U2NhblRhYi5Cc3NOcjsgaSsrKQorCXsKKwkJcEJzcyA9ICZwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV07CisKKyAgICAgICAgaWYgKChwQnNzLT5Sc3NpIDw9IC01MCkgJiYgKHBCc3MtPkNoYW5uZWwgPT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpCisJCQljb250aW51ZTsJIC8vIFJTU0kgdG9vIHdlYWsuIGZvcmdldCBpdC4KKwkJaWYgKE1BQ19BRERSX0VRVUFMKHBCc3MtPkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCkpCisJCQljb250aW51ZTsJIC8vIHNraXAgY3VycmVudCBBUAorCQlpZiAoIVNTSURfRVFVQUwocEJzcy0+U3NpZCwgcEJzcy0+U3NpZExlbiwgcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbikpCisJCQljb250aW51ZTsJIC8vIHNraXAgZGlmZmVyZW50IFNTSUQKKyAgICAgICAgaWYgKHBCc3MtPlJzc2kgPCAoUlRNUE1heFJzc2kocEFkLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyKSArIFJTU0lfREVMVEEpKQorCQkJY29udGludWU7CSAvLyBza2lwIEFQIHdpdGhvdXQgYmV0dGVyIFJTU0kKKworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJMYXN0UnNzaTAgPSAlZCwgcEJzcy0+UnNzaSA9ICVkXG4iLCBSVE1QTWF4UnNzaShwQWQsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMSwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIpLCBwQnNzLT5Sc3NpKSk7CisJCS8vIEFQIHBhc3NpbmcgYWxsIGFib3ZlIHJ1bGVzIGlzIHB1dCBpbnRvIHJvYW1pbmcgY2FuZGlkYXRlIHRhYmxlCisJCU5kaXNNb3ZlTWVtb3J5KCZwUm9hbVRhYi0+QnNzRW50cnlbcFJvYW1UYWItPkJzc05yXSwgcEJzcywgc2l6ZW9mKEJTU19FTlRSWSkpOworCQlwUm9hbVRhYi0+QnNzTnIgKz0gMTsKKwl9CisKKwlpZiAocFJvYW1UYWItPkJzc05yID4gMCkKKwl7CisJCS8vIGNoZWNrIENudGxNYWNoaW5lLkN1cnJTdGF0ZSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBORElTIFNldE9JRCByZXF1ZXN0CisJCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkKKwkJeworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5Qb29yQ1FJUm9hbWluZ0NvdW50ICsrOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTU1DSEsgLSBSb2FtaW5nIGF0dGVtcHQgIyVsZFxuIiwgcEFkLT5SYWxpbmtDb3VudGVycy5Qb29yQ1FJUm9hbWluZ0NvdW50KSk7CisJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ST0FNSU5HX1JFUSwgMCwgTlVMTCk7CisJCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisJCX0KKwl9CisJLy8gTWF5YmUgc2l0ZSBzdXJ2ZXkgcmVxdWlyZWQKKwllbHNlCisJeworCQlpZiAoKHBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSArIDEwICogMTAwMCkgPCBOb3cpCisJCXsKKwkJCS8vIGNoZWNrIENudGxNYWNoaW5lLkN1cnJTdGF0ZSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBORElTIFNldE9JRCByZXF1ZXN0CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIFJvYW1pbmcsIE5vIGVsaWdhYmxlIGVudHJ5LCB0cnkgbmV3IHNjYW4hXG4iKSk7CisJCQlwQWQtPlN0YUNmZy5TY2FuQ250ID0gMjsKKwkJCXBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSA9IE5vdzsKKwkJCU1sbWVBdXRvU2NhbihwQWQpOworCQl9CisJfQorCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IE1sbWVDaGVja0ZvckZhc3RSb2FtaW5nIChCc3NOcj0lZClcbiIsIHBSb2FtVGFiLT5Cc3NOcikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoaXMgcm91dGluZSBjYWxjdWxhdGVzIFR4UEVSLCBSeFBFUiBvZiB0aGUgcGFzdCBOLXNlYyBwZXJpb2QuIEFuZAorCQlhY2NvcmRpbmcgdG8gdGhlIGNhbGN1bGF0aW9uIHJlc3VsdCwgQ2hhbm5lbFF1YWxpdHkgaXMgY2FsY3VsYXRlZCBoZXJlCisJCXRvIGRlY2lkZSBpZiBjdXJyZW50IEFQIGlzIHN0aWxsIGRvaW5nIHRoZSBqb2IuCisKKwkJSWYgQ2hhbm5lbFF1YWxpdHkgaXMgbm90IGdvb2QsIGEgUk9BTWluZyBhdHRlbXB0IG1heSBiZSB0cmllZCBsYXRlci4KKwlPdXRwdXQ6CisJCVN0YUNmZy5DaGFubmVsUXVhbGl0eSAtIDAuLjEwMAorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOT1RFOiBUaGlzIHJvdXRpbmUgZGVjaWRlIGNoYW5ubGUgcXVhbGl0eSBiYXNlZCBvbiBSWCBDUkMgZXJyb3IgcmF0aW8uCisJCUNhbGxlciBzaG91bGQgbWFrZSBzdXJlIGEgZnVuY3Rpb24gY2FsbCB0byBOSUNVcGRhdGVSYXdDb3VudGVycyhwQWQpCisJCWlzIHBlcmZvcm1lZCByaWdodCBiZWZvcmUgdGhpcyByb3V0aW5lLCBzbyB0aGF0IHRoaXMgcm91dGluZSBjYW4gZGVjaWRlCisJCWNoYW5uZWwgcXVhbGl0eSBiYXNlZCBvbiB0aGUgbW9zdCB1cC10by1kYXRlIGluZm9ybWF0aW9uCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lQ2FsY3VsYXRlQ2hhbm5lbFF1YWxpdHkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUxPTkcgTm93MzIpCit7CisJVUxPTkcgVHhPa0NudCwgVHhDbnQsIFR4UEVSLCBUeFBSUjsKKwlVTE9ORyBSeENudCwgUnhQRVI7CisJVUNIQVIgTm9yUnNzaTsKKwlDSEFSICBNYXhSc3NpOworCVVMT05HIEJlYWNvbkxvc3RUaW1lID0gQkVBQ09OX0xPU1RfVElNRTsKKworI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8gUm9nZXIgc3luYyBDYXJyaWVyCisJLy8gbG9uZ2VyIGJlYWNvbiBsb3N0IHRpbWUgd2hlbiBjYXJyaWVyIGRldGVjdGlvbiBlbmFibGVkCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID09IFRSVUUpCisJeworCQlCZWFjb25Mb3N0VGltZSA9IEJFQUNPTl9MT1NUX1RJTUUgKyBCRUFDT05fTE9TVF9USU1FLzI7CisJfQorI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKworCU1heFJzc2kgPSBSVE1QTWF4UnNzaShwQWQsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMSwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIpOworCisJLy8KKwkvLyBjYWxjdWxhdGUgVFggcGFja2V0IGVycm9yIHJhdGlvIGFuZCBUWCByZXRyeSByYXRpbyAtIGlmIHRvbyBmZXcgVFggc2FtcGxlcywgc2tpcCBUWCByZWxhdGVkIHN0YXRpc3RpY3MKKwkvLworCVR4T2tDbnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKyBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50OworCVR4Q250ID0gVHhPa0NudCArIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQ7CisJaWYgKFR4Q250IDwgNSkKKwl7CisJCVR4UEVSID0gMDsKKwkJVHhQUlIgPSAwOworCX0KKwllbHNlCisJeworCQlUeFBFUiA9IChwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50ICogMTAwKSAvIFR4Q250OworCQlUeFBSUiA9ICgoVHhDbnQgLSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQpICogMTAwKSAvIFR4Q250OworCX0KKworCS8vCisJLy8gY2FsY3VsYXRlIFJYIFBFUiAtIGRvbid0IHRha2UgUnhQRVIgaW50byBjb25zaWRlcmF0aW9uIGlmIHRvbyBmZXcgc2FtcGxlCisJLy8KKwlSeENudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhPa0NudCArIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhGY3NFcnJDbnQ7CisJaWYgKFJ4Q250IDwgNSkKKwkJUnhQRVIgPSAwOworCWVsc2UKKwkJUnhQRVIgPSAocEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeEZjc0VyckNudCAqIDEwMCkgLyBSeENudDsKKworCS8vCisJLy8gZGVjaWRlIENoYW5uZWxRdWFsaXR5IGJhc2VkIG9uOiAxKWxhc3QgQkVBQ09OIHJlY2VpdmVkIHRpbWUsIDIpbGFzdCBSU1NJLCAzKVR4UEVSLCBhbmQgNClSeFBFUgorCS8vCisJaWYgKElORlJBX09OKHBBZCkgJiYKKwkJKHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCA8IDIpICYmIC8vIG5vIGhlYXZ5IHRyYWZmaWMKKwkJKHBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWUgKyBCZWFjb25Mb3N0VGltZSA8IE5vdzMyKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJFQUNPTiBsb3N0ID4gJWxkIG1zZWMgd2l0aCBUeE9rQ250PSVsZCAtPiBDUUk9MFxuIiwgQmVhY29uTG9zdFRpbWUsIFR4T2tDbnQpKTsKKwkJcEFkLT5NbG1lLkNoYW5uZWxRdWFsaXR5ID0gMDsKKwl9CisJZWxzZQorCXsKKwkJLy8gTm9ybWFsaXplIFJzc2kKKwkJaWYgKE1heFJzc2kgPiAtNDApCisJCQlOb3JSc3NpID0gMTAwOworCQllbHNlIGlmIChNYXhSc3NpIDwgLTkwKQorCQkJTm9yUnNzaSA9IDA7CisJCWVsc2UKKwkJCU5vclJzc2kgPSAoTWF4UnNzaSArIDkwKSAqIDI7CisKKwkJLy8gQ2hhbm5lbFF1YWxpdHkgPSBXMSpSU1NJICsgVzIqVHhQUlIgKyBXMypSeFBFUgkgKFJTU0kgMC4uMTAwKSwgKFR4UEVSIDEwMC4uMCksIChSeFBFUiAxMDAuLjApCisJCXBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSA9IChSU1NJX1dFSUdIVElORyAqIE5vclJzc2kgKworCQkJCQkJCQkgICBUWF9XRUlHSFRJTkcgKiAoMTAwIC0gVHhQUlIpICsKKwkJCQkJCQkJICAgUlhfV0VJR0hUSU5HKiAoMTAwIC0gUnhQRVIpKSAvIDEwMDsKKwkJaWYgKHBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSA+PSAxMDApCisJCQlwQWQtPk1sbWUuQ2hhbm5lbFF1YWxpdHkgPSAxMDA7CisJfQorCit9CisKK1ZPSUQgTWxtZVNldFR4UmF0ZSgKKwlJTiBQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4gUE1BQ19UQUJMRV9FTlRSWQkJcEVudHJ5LAorCUlOIFBSVE1QX1RYX1JBVEVfU1dJVENICXBUeFJhdGUpCit7CisJVUNIQVIJTWF4TW9kZSA9IE1PREVfT0ZETTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCU1heE1vZGUgPSBNT0RFX0hUR1JFRU5GSUVMRDsKKworCWlmIChwVHhSYXRlLT5TVEJDICYmIChwQWQtPlN0YUNmZy5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQykgJiYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikpCisJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TVEJDID0gU1RCQ19VU0U7CisJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKKworCWlmIChwVHhSYXRlLT5DdXJyTUNTIDwgTUNTX0FVVE8pCisJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwVHhSYXRlLT5DdXJyTUNTOworCisJaWYgKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgPiA3KQorCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKKworICAgCWlmIChBREhPQ19PTihwQWQpKQorCXsKKwkJLy8gSWYgcGVlciBhZGhvYyBpcyBiLW9ubHkgbW9kZSwgd2UgY2FuJ3Qgc2VuZCAxMWcgcmF0ZS4KKwkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7CisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNUQkMJPSBTVEJDX05PTkU7CisKKwkJLy8KKwkJLy8gRm9yIEFkaG9jIE1PREVfQ0NLLCBkcml2ZXIgd2lsbCB1c2UgQWRob2NCT25seUpvaW5lZCBmbGFnIHRvIHJvbGwgYmFjayB0byBCIG9ubHkgaWYgbmVjZXNzYXJ5CisJCS8vCisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUJPSBwVHhSYXRlLT5Nb2RlOworCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0k7CisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUwkJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOworCisJCS8vIFBhdGNoIHNwZWVkIGVycm9yIGluIHN0YXR1cyBwYWdlCisJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERTsKKwl9CisJZWxzZQorCXsKKwkJaWYgKHBUeFJhdGUtPk1vZGUgPD0gTWF4TW9kZSkKKwkJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gcFR4UmF0ZS0+TW9kZTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAocFR4UmF0ZS0+U2hvcnRHSSAmJiAocEFkLT5TdGFDZmcuTWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kpKQorCQkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV80MDA7CisJCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gR0lfODAwOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCS8vIFJlZXhhbSBlYWNoIGJhbmR3aWR0aCdzIFNHSSBzdXBwb3J0LgorCQlpZiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPT0gR0lfNDAwKQorCQl7CisJCQlpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLkJXID09IEJXXzIwKSAmJiAoIUNMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJMjBfQ0FQQUJMRSkpKQorCQkJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gR0lfODAwOworCQkJaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5CVyA9PSBCV180MCkgJiYgKCFDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTQwX0NBUEFCTEUpKSkKKwkJCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IEdJXzgwMDsKKwkJfQorCisJCS8vIFR1cm4gUlRTL0NUUyByYXRlIHRvIDZNYnBzLgorCQlpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9PSAwKSAmJiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyAhPSAwKSkKKwkJeworCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisJCQlpZiAocEFkLT5NYWNUYWIuZkFueUJBU2Vzc2lvbikKKwkJCXsKKwkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIEhUX0ZPUkNFUlRTQ1RTLCBBTExOX1NFVFBST1RFQ1QsIFRSVUUsIChCT09MRUFOKXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgQUxMTl9TRVRQUk9URUNULCBUUlVFLCAoQk9PTEVBTilwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50KTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID09IDgpICYmIChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTICE9IDgpKQorCQl7CisJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MJCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKKwkJCWlmIChwQWQtPk1hY1RhYi5mQW55QkFTZXNzaW9uKQorCQkJeworCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgSFRfRk9SQ0VSVFNDVFMsIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwgKEJPT0xFQU4pcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCBBTExOX1NFVFBST1RFQ1QsIFRSVUUsIChCT09MRUFOKXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQpOworCQkJfQorCQl9CisJCWVsc2UgaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgIT0gMCkgJiYgKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgPT0gMCkpCisJCXsKKwkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgSFRfUlRTQ1RTXzZNLCBBTExOX1NFVFBST1RFQ1QsIFRSVUUsIChCT09MRUFOKXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQpOworCisJCX0KKwkJZWxzZSBpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyAhPSA4KSAmJiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyA9PSA4KSkKKwkJeworCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBIVF9SVFNDVFNfNk0sIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwgKEJPT0xFQU4pcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCk7CisJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TVEJDCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNUQkM7CisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSTsKKwkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJaWYgKChwQWQtPlN0YUNmZy5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9PSBNT0RFX0hUR1JFRU5GSUVMRCkgJiYKKwkJICAgIHBBZC0+V0lGSXRlc3RiZWQuYkdyZWVuRmllbGQpCisJCSAgICBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVEdSRUVORklFTEQ7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJfQorCisJcEFkLT5MYXN0VHhSYXRlID0gKFVTSE9SVCkocEVudHJ5LT5IVFBoeU1vZGUud29yZCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIGNhbGN1bGF0ZXMgdGhlIGFjdW11bGF0ZWQgVHhQRVIgb2YgZWF4aCBUeFJhdGUuIEFuZAorCQlhY2NvcmRpbmcgdG8gdGhlIGNhbGN1bGF0aW9uIHJlc3VsdCwgY2hhbmdlIENvbW1vbkNmZy5UeFJhdGUgd2hpY2gKKwkJaXMgdGhlIHN0YWJsZSBUWCBSYXRlIHdlIGV4cGVjdCB0aGUgUmFkaW8gc2l0dWF0aW9uIGNvdWxkIHN1c3RhaW5lZC4KKworCQlDb21tb25DZmcuVHhSYXRlIHdpbGwgY2hhbmdlIGR5bmFtaWNhbGx5IHdpdGhpbiB7UkFURV8xL1JBVEVfNiwgTWF4VHhSYXRlfQorCU91dHB1dDoKKwkJQ29tbW9uQ2ZnLlR4UmF0ZSAtCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5PVEU6CisJCWNhbGwgdGhpcyByb3V0aW5lIGV2ZXJ5IHNlY29uZAorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZUR5bmFtaWNUeFJhdGVTd2l0Y2hpbmcoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUNIQVIJCQkJCVVwUmF0ZUlkeCA9IDAsIERvd25SYXRlSWR4ID0gMCwgQ3VyclJhdGVJZHg7CisJVUxPTkcJCQkJCWksIEFjY3VUeFRvdGFsQ250ID0gMCwgVHhUb3RhbENudDsKKwlVTE9ORwkJCQkJVHhFcnJvclJhdGlvID0gMDsKKwlCT09MRUFOCQkJCQliVHhSYXRlQ2hhbmdlZCwgYlVwZ3JhZGVRdWFsaXR5ID0gRkFMU0U7CisJUFJUTVBfVFhfUkFURV9TV0lUQ0gJcEN1cnJUeFJhdGUsIHBOZXh0VHhSYXRlID0gTlVMTDsKKwlQVUNIQVIJCQkJCXBUYWJsZTsKKwlVQ0hBUgkJCQkJVGFibGVTaXplID0gMDsKKwlVQ0hBUgkJCQkJSW5pdFR4UmF0ZUlkeCA9IDAsIFRyYWluVXAsIFRyYWluRG93bjsKKwlDSEFSCQkJCQlSc3NpLCBSc3NpT2Zmc2V0ID0gMDsKKwlUWF9TVEFfQ05UMV9TVFJVQwkJU3RhVHgxOworCVRYX1NUQV9DTlQwX1NUUlVDCQlUeFN0YUNudDA7CisJVUxPTkcJCQkJCVR4UmV0cmFuc21pdCA9IDAsIFR4U3VjY2VzcyA9IDAsIFR4RmFpbENvdW50ID0gMDsKKwlNQUNfVEFCTEVfRU5UUlkJCQkqcEVudHJ5OworCisjaWZkZWYgUkFMSU5LX0FURQorCWlmIChBVEVfT04ocEFkKSkKKwl7CisJCXJldHVybjsKKwl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisJLy8KKwkvLyB3YWxrIHRocm91Z2ggTUFDIHRhYmxlLCBzZWUgaWYgbmVlZCB0byBjaGFuZ2UgQVAncyBUWCByYXRlIHRvd2FyZCBlYWNoIGVudHJ5CisJLy8KKyAgIAlmb3IgKGkgPSAxOyBpIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKKwl7CisJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W2ldOworCisJCS8vIGNoZWNrIGlmIHRoaXMgZW50cnkgbmVlZCB0byBzd2l0Y2ggcmF0ZSBhdXRvbWF0aWNhbGx5CisJCWlmIChSVE1QQ2hlY2tFbnRyeUVuYWJsZUF1dG9SYXRlU3dpdGNoKHBBZCwgcEVudHJ5KSA9PSBGQUxTRSkKKwkJCWNvbnRpbnVlOworCisJCWlmICgocEFkLT5NYWNUYWIuU2l6ZSA9PSAxKSB8fCAocEVudHJ5LT5WYWxpZEFzRGxzKSkKKwkJeworCQkJUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwKKwkJCQkJCQkgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwLAorCQkJCQkJCSAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTEsCisJCQkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMik7CisKKwkJCS8vIFVwZGF0ZSBzdGF0aXN0aWMgY291bnRlcgorCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMCwgJlR4U3RhQ250MC53b3JkKTsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDEsICZTdGFUeDEud29yZCk7CisJCQlwQWQtPmJVcGRhdGVCY25DbnREb25lID0gVFJVRTsKKwkJCVR4UmV0cmFuc21pdCA9IFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7CisJCQlUeFN1Y2Nlc3MgPSBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOworCQkJVHhGYWlsQ291bnQgPSBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7CisJCQlUeFRvdGFsQ250ID0gVHhSZXRyYW5zbWl0ICsgVHhTdWNjZXNzICsgVHhGYWlsQ291bnQ7CisKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKz0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArPSBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudCArPSBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7CisJCQlwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQudS5Mb3dQYXJ0ICs9IFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7CisJCQlwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LnUuTG93UGFydCArPSBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OworCQkJcEFkLT5XbGFuQ291bnRlcnMuRmFpbGVkQ291bnQudS5Mb3dQYXJ0ICs9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKworCQkJLy8gaWYgbm8gdHJhZmZpYyBpbiB0aGUgcGFzdCAxLXNlYyBwZXJpb2QsIGRvbid0IGNoYW5nZSBUWCByYXRlLAorCQkJLy8gYnV0IGNsZWFyIGFsbCBiYWQgaGlzdG9yeS4gYmVjYXVzZSB0aGUgYmFkIGhpc3RvcnkgbWF5IGFmZmVjdCB0aGUgbmV4dAorCQkJLy8gQ2hhcmlvdCB0aHJvdWdocHV0IHRlc3QKKwkJCUFjY3VUeFRvdGFsQ250ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsKKwkJCQkJCSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKKwkJCQkJCSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50OworCisJCQlpZiAoVHhUb3RhbENudCkKKwkJCQlUeEVycm9yUmF0aW8gPSAoKFR4UmV0cmFuc21pdCArIFR4RmFpbENvdW50KSAqIDEwMCkgLyBUeFRvdGFsQ250OworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKElORlJBX09OKHBBZCkgJiYgKGkgPT0gMSkpCisJCQkJUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwKKwkJCQkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCwKKwkJCQkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMSwKKwkJCQkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMik7CisJCQllbHNlCisJCQkJUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwKKwkJCQkJCQkJICAgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kwLAorCQkJCQkJCQkgICBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTEsCisJCQkJCQkJCSAgIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMik7CisKKwkJCVR4VG90YWxDbnQgPSBwRW50cnktPk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKworCQkJCSBwRW50cnktPk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKKwkJCQkgcEVudHJ5LT5PbmVTZWNUeEZhaWxDb3VudDsKKworCQkJaWYgKFR4VG90YWxDbnQpCisJCQkJVHhFcnJvclJhdGlvID0gKChwRW50cnktPk9uZVNlY1R4UmV0cnlPa0NvdW50ICsgcEVudHJ5LT5PbmVTZWNUeEZhaWxDb3VudCkgKiAxMDApIC8gVHhUb3RhbENudDsKKwkJfQorCisJCUN1cnJSYXRlSWR4ID0gcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXg7CisKKwkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgcEVudHJ5LCAmcFRhYmxlLCAmVGFibGVTaXplLCAmSW5pdFR4UmF0ZUlkeCk7CisKKwkJaWYgKEN1cnJSYXRlSWR4ID49IFRhYmxlU2l6ZSkKKwkJeworCQkJQ3VyclJhdGVJZHggPSBUYWJsZVNpemUgLSAxOworCQl9CisKKwkJLy8gV2hlbiBzd2l0Y2ggZnJvbSBGaXhlZCByYXRlIC0+IGF1dG8gcmF0ZSwgdGhlIFJFQUwgVFggcmF0ZSBtaWdodCBiZSBkaWZmZXJlbnQgZnJvbSBwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleC4KKwkJLy8gU28gbmVlZCB0byBzeW5jIGhlcmUuCisJCXBDdXJyVHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhDdXJyUmF0ZUlkeCsxKSo1XTsKKwkJaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgIT0gcEN1cnJUeFJhdGUtPkN1cnJNQ1MpCisJCQkvLyYmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBUUlVFKQorCQkJKQorCQl7CisKKwkJCS8vIE5lZWQgdG8gc3luYyBSZWFsIFR4IHJhdGUgYW5kIG91ciByZWNvcmQuCisJCQkvLyBUaGVuIHJldHVybiBmb3IgbmV4dCBEUlMuCisJCQlwQ3VyclR4UmF0ZSA9IChQUlRNUF9UWF9SQVRFX1NXSVRDSCkgJnBUYWJsZVsoSW5pdFR4UmF0ZUlkeCsxKSo1XTsKKwkJCXBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4ID0gSW5pdFR4UmF0ZUlkeDsKKwkJCU1sbWVTZXRUeFJhdGUocEFkLCBwRW50cnksIHBDdXJyVHhSYXRlKTsKKworCQkJLy8gcmVzZXQgYWxsIE9uZVNlY1R4IGNvdW50ZXJzCisJCQlSRVNFVF9PTkVfU0VDX1RYX0NOVChwRW50cnkpOworCQkJY29udGludWU7CisJCX0KKworCQkvLyBkZWNpZGUgdGhlIG5leHQgdXBncmFkZSByYXRlIGFuZCBkb3duZ3JhZGUgcmF0ZSwgaWYgYW55CisJCWlmICgoQ3VyclJhdGVJZHggPiAwKSAmJiAoQ3VyclJhdGVJZHggPCAoVGFibGVTaXplIC0gMSkpKQorCQl7CisJCQlVcFJhdGVJZHggPSBDdXJyUmF0ZUlkeCArIDE7CisJCQlEb3duUmF0ZUlkeCA9IEN1cnJSYXRlSWR4IC0xOworCQl9CisJCWVsc2UgaWYgKEN1cnJSYXRlSWR4ID09IDApCisJCXsKKwkJCVVwUmF0ZUlkeCA9IEN1cnJSYXRlSWR4ICsgMTsKKwkJCURvd25SYXRlSWR4ID0gQ3VyclJhdGVJZHg7CisJCX0KKwkJZWxzZSBpZiAoQ3VyclJhdGVJZHggPT0gKFRhYmxlU2l6ZSAtIDEpKQorCQl7CisJCQlVcFJhdGVJZHggPSBDdXJyUmF0ZUlkeDsKKwkJCURvd25SYXRlSWR4ID0gQ3VyclJhdGVJZHggLSAxOworCQl9CisKKwkJcEN1cnJUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKEN1cnJSYXRlSWR4KzEpKjVdOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWlmICgoUnNzaSA+IC02NSkgJiYgKHBDdXJyVHhSYXRlLT5Nb2RlID49IE1PREVfSFRNSVgpKQorCQl7CisJCQlUcmFpblVwCQk9IChwQ3VyclR4UmF0ZS0+VHJhaW5VcCArIChwQ3VyclR4UmF0ZS0+VHJhaW5VcCA+PiAxKSk7CisJCQlUcmFpbkRvd24JPSAocEN1cnJUeFJhdGUtPlRyYWluRG93biArIChwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duID4+IDEpKTsKKwkJfQorCQllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCXsKKwkJCVRyYWluVXAJCT0gcEN1cnJUeFJhdGUtPlRyYWluVXA7CisJCQlUcmFpbkRvd24JPSBwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duOworCQl9CisKKwkJLy9wQWQtPkRyc0NvdW50ZXJzLkxhc3RUaW1lVHhSYXRlQ2hhbmdlQWN0aW9uID0gcEFkLT5EcnNDb3VudGVycy5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uOworCisJCS8vCisJCS8vIEtlZXAgdGhlIGxhc3QgdGltZSBUeFJhdGVDaGFuZ2VBY3Rpb24gc3RhdHVzLgorCQkvLworCQlwRW50cnktPkxhc3RUaW1lVHhSYXRlQ2hhbmdlQWN0aW9uID0gcEVudHJ5LT5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uOworCisKKworCQkvLworCQkvLyBDQVNFIDEuIHdoZW4gVFggc2FtcGxlcyBhcmUgZmV3ZXIgdGhhbiAxNSwgdGhlbiBkZWNpZGUgVFggcmF0ZSBzb2xlbHkgb24gUlNTSQorCQkvLyAgICAgICAgIChjcml0ZXJpYSBjb3BpZWQgZnJvbSBSVDI1MDAgZm9yIE5ldG9waWEgY2FzZSkKKwkJLy8KKwkJaWYgKFR4VG90YWxDbnQgPD0gMTUpCisJCXsKKwkJCUNIQVIJaWR4ID0gMDsKKwkJCVVDSEFSCVR4UmF0ZUlkeDsKKwkJCS8vVUNIQVIJTUNTMCA9IDAsIE1DUzEgPSAwLCBNQ1MyID0gMCwgTUNTMyA9IDAsIE1DUzQgPSAwLCBNQ1M3ID0gMCwgTUNTMTIgPSAwLCBNQ1MxMyA9IDAsIE1DUzE0ID0gMCwgTUNTMTUgPSAwOworCQkJVUNIQVIJTUNTMCA9IDAsIE1DUzEgPSAwLCBNQ1MyID0gMCwgTUNTMyA9IDAsIE1DUzQgPSAwLCAgTUNTNSA9MCwgTUNTNiA9IDAsIE1DUzcgPSAwOworCSAgICAgICAgVUNIQVIJTUNTMTIgPSAwLCBNQ1MxMyA9IDAsIE1DUzE0ID0gMCwgTUNTMTUgPSAwOworCQkJVUNIQVIJTUNTMjAgPSAwLCBNQ1MyMSA9IDAsIE1DUzIyID0gMCwgTUNTMjMgPSAwOyAvLyAzKjMKKworCQkJLy8gY2hlY2sgdGhlIGV4aXN0ZW5jZSBhbmQgaW5kZXggb2YgZWFjaCBuZWVkZWQgTUNTCisJCQl3aGlsZSAoaWR4IDwgcFRhYmxlWzBdKQorCQkJeworCQkJCXBDdXJyVHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhpZHgrMSkqNV07CisKKwkJCQlpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzApCisJCQkJeworCQkJCQlNQ1MwID0gaWR4OworCQkJCX0KKwkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMSkKKwkJCQl7CisJCQkJCU1DUzEgPSBpZHg7CisJCQkJfQorCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18yKQorCQkJCXsKKwkJCQkJTUNTMiA9IGlkeDsKKwkJCQl9CisJCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzMpCisJCQkJeworCQkJCQlNQ1MzID0gaWR4OworCQkJCX0KKwkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfNCkKKwkJCQl7CisJCQkJCU1DUzQgPSBpZHg7CisJCQkJfQorCSAgICAgICAgICAgIGVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU181KQorCSAgICAgICAgICAgIHsKKwkgICAgICAgICAgICAgICAgTUNTNSA9IGlkeDsKKwkgICAgICAgICAgICB9CisJICAgICAgICAgICAgZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzYpCisJICAgICAgICAgICAgeworCSAgICAgICAgICAgICAgICBNQ1M2ID0gaWR4OworCSAgICAgICAgICAgIH0KKwkJCQkvL2Vsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU183KQorCQkJCWVsc2UgaWYgKChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfNykgJiYgKHBDdXJyVHhSYXRlLT5TaG9ydEdJID09IEdJXzgwMCkpCS8vIHByZXZlbnQgdGhlIGhpZ2hlc3QgTUNTIHVzaW5nIHNob3J0IEdJIHdoZW4gMVQgYW5kIGxvdyB0aHJvdWdocHV0CisJCQkJeworCQkJCQlNQ1M3ID0gaWR4OworCQkJCX0KKwkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMTIpCisJCQkJeworCQkJCQlNQ1MxMiA9IGlkeDsKKwkJCQl9CisJCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzEzKQorCQkJCXsKKwkJCQkJTUNTMTMgPSBpZHg7CisJCQkJfQorCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18xNCkKKwkJCQl7CisJCQkJCU1DUzE0ID0gaWR4OworCQkJCX0KKwkJCQkvL2Vsc2UgaWYgKChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMTUpLyogJiYgKHBDdXJyVHhSYXRlLT5TaG9ydEdJID09IEdJXzgwMCkqLykJLy93ZSBob3BlIHRvIHVzZSBTaG9ydEdJIGFzIGluaXRpYWwgcmF0ZQorCQkJCWVsc2UgaWYgKChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMTUpICYmIChwQ3VyclR4UmF0ZS0+U2hvcnRHSSA9PSBHSV84MDApKQkvL3dlIGhvcGUgdG8gdXNlIFNob3J0R0kgYXMgaW5pdGlhbCByYXRlLCBob3dldmVyIEF0aGVyb3MncyBjaGlwIGhhcyBidWdzIHdoZW4gc2hvcnQgR0kKKwkJCQl7CisJCQkJCU1DUzE1ID0gaWR4OworCQkJCX0KKwkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMjApIC8vIDMqMworCQkJCXsKKwkJCQkJTUNTMjAgPSBpZHg7CisJCQkJfQorCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18yMSkKKwkJCQl7CisJCQkJCU1DUzIxID0gaWR4OworCQkJCX0KKwkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMjIpCisJCQkJeworCQkJCQlNQ1MyMiA9IGlkeDsKKwkJCQl9CisJCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzIzKQorCQkJCXsKKwkJCQkJTUNTMjMgPSBpZHg7CisJCQkJfQorCQkJCWlkeCArKzsKKwkJCX0KKworCQkJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKKwkJCXsKKwkJCQlpZiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkV4dGVybmFsTE5BRm9yRykKKwkJCQl7CisJCQkJCVJzc2lPZmZzZXQgPSAyOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSc3NpT2Zmc2V0ID0gNTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5FeHRlcm5hbExOQUZvckEpCisJCQkJeworCQkJCQlSc3NpT2Zmc2V0ID0gNTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJUnNzaU9mZnNldCA9IDg7CisJCQkJfQorCQkJfQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJLyppZiAoTUNTMTUpKi8KKwkJCWlmICgocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExQkdOM1MpIHx8CisJCQkJKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMU4zUykgfHwKKwkJCQkocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZSkpCisJCQl7Ly8gTiBtb2RlIHdpdGggMyBzdHJlYW0gLy8gMyozCisJCQkJaWYgKE1DUzIzICYmIChSc3NpID49IC03MCkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzE1OworCQkJCWVsc2UgaWYgKE1DUzIyICYmIChSc3NpID49IC03MikpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzE0OworICAgICAgICAJICAgIGVsc2UgaWYgKE1DUzIxICYmIChSc3NpID49IC03NikpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzEzOworCQkJCWVsc2UgaWYgKE1DUzIwICYmIChSc3NpID49IC03OCkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzEyOworCQkJZWxzZSBpZiAoTUNTNCAmJiAoUnNzaSA+PSAtODIpKQorCQkJCVR4UmF0ZUlkeCA9IE1DUzQ7CisJCQllbHNlIGlmIChNQ1MzICYmIChSc3NpID49IC04NCkpCisJCQkJVHhSYXRlSWR4ID0gTUNTMzsKKwkJCWVsc2UgaWYgKE1DUzIgJiYgKFJzc2kgPj0gLTg2KSkKKwkJCQlUeFJhdGVJZHggPSBNQ1MyOworCQkJZWxzZSBpZiAoTUNTMSAmJiAoUnNzaSA+PSAtODgpKQorCQkJCVR4UmF0ZUlkeCA9IE1DUzE7CisJCQllbHNlCisJCQkJVHhSYXRlSWR4ID0gTUNTMDsKKwkJfQorLy8JCWVsc2UgaWYgKChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yUykgfHwgKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMUJHTjJTRm9yQUJhbmQpIHx8KHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMU4yUykgfHwocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmQpIHx8IChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlKSkKKwkJZWxzZSBpZiAoKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMUJHTjJTKSB8fCAocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNGb3JBQmFuZCkgfHwocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExTjJTKSB8fChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZCkpIC8vIDMqMworCQkJey8vIE4gbW9kZSB3aXRoIDIgc3RyZWFtCisJCQkJaWYgKE1DUzE1ICYmIChSc3NpID49ICgtNzArUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MxNTsKKwkJCQllbHNlIGlmIChNQ1MxNCAmJiAoUnNzaSA+PSAoLTcyK1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMTQ7CisJCQkJZWxzZSBpZiAoTUNTMTMgJiYgKFJzc2kgPj0gKC03NitSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzEzOworCQkJCWVsc2UgaWYgKE1DUzEyICYmIChSc3NpID49ICgtNzgrUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MxMjsKKwkJCQllbHNlIGlmIChNQ1M0ICYmIChSc3NpID49ICgtODIrUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1M0OworCQkJCWVsc2UgaWYgKE1DUzMgJiYgKFJzc2kgPj0gKC04NCtSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzM7CisJCQkJZWxzZSBpZiAoTUNTMiAmJiAoUnNzaSA+PSAoLTg2K1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMjsKKwkJCQllbHNlIGlmIChNQ1MxICYmIChSc3NpID49ICgtODgrUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MxOworCQkJCWVsc2UKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMDsKKwkJCX0KKwkJCWVsc2UgaWYgKChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFCR04xUykgfHwgKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMU4xUykpCisJCQl7Ly8gTiBtb2RlIHdpdGggMSBzdHJlYW0KKwkJCQlpZiAoTUNTNyAmJiAoUnNzaSA+ICgtNzIrUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1M3OworCQkJCWVsc2UgaWYgKE1DUzYgJiYgKFJzc2kgPiAoLTc0K1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTNjsKKwkJCQllbHNlIGlmIChNQ1M1ICYmIChSc3NpID4gKC03NytSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzU7CisJCQkJZWxzZSBpZiAoTUNTNCAmJiAoUnNzaSA+ICgtNzkrUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1M0OworCQkJCWVsc2UgaWYgKE1DUzMgJiYgKFJzc2kgPiAoLTgxK1Jzc2lPZmZzZXQpKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMzsKKwkJCQllbHNlIGlmIChNQ1MyICYmIChSc3NpID4gKC04MytSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzI7CisJCQkJZWxzZSBpZiAoTUNTMSAmJiAoUnNzaSA+ICgtODYrUnNzaU9mZnNldCkpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MxOworCQkJCWVsc2UKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMDsKKwkJCX0KKwkJCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCXsvLyBMZWdhY3kgbW9kZQorCQkJCWlmIChNQ1M3ICYmIChSc3NpID4gLTcwKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTNzsKKwkJCQllbHNlIGlmIChNQ1M2ICYmIChSc3NpID4gLTc0KSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTNjsKKwkJCQllbHNlIGlmIChNQ1M1ICYmIChSc3NpID4gLTc4KSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTNTsKKwkJCQllbHNlIGlmIChNQ1M0ICYmIChSc3NpID4gLTgyKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTNDsKKwkJCQllbHNlIGlmIChNQ1M0ID09IDApCS8vIGZvciBCLW9ubHkgbW9kZQorCQkJCQlUeFJhdGVJZHggPSBNQ1MzOworCQkJCWVsc2UgaWYgKE1DUzMgJiYgKFJzc2kgPiAtODUpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MzOworCQkJCWVsc2UgaWYgKE1DUzIgJiYgKFJzc2kgPiAtODcpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MyOworCQkJCWVsc2UgaWYgKE1DUzEgJiYgKFJzc2kgPiAtOTApKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MxOworCQkJCWVsc2UKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMDsKKwkJCX0KKworCS8vCQlpZiAoVHhSYXRlSWR4ICE9IHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4KQorCQkJeworCQkJCXBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4ID0gVHhSYXRlSWR4OworCQkJCXBOZXh0VHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhwRW50cnktPkN1cnJUeFJhdGVJbmRleCsxKSo1XTsKKwkJCQlNbG1lU2V0VHhSYXRlKHBBZCwgcEVudHJ5LCBwTmV4dFR4UmF0ZSk7CisJCQl9CisKKwkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+VHhRdWFsaXR5LCBzaXplb2YoVVNIT1JUKSAqIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKKwkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+UEVSLCBzaXplb2YoVUNIQVIpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOworCQkJcEVudHJ5LT5mTGFzdFNlY0FjY29yZGluZ1JTU0kgPSBUUlVFOworCQkJLy8gcmVzZXQgYWxsIE9uZVNlY1R4IGNvdW50ZXJzCisJCQlSRVNFVF9PTkVfU0VDX1RYX0NOVChwRW50cnkpOworCisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChwRW50cnktPmZMYXN0U2VjQWNjb3JkaW5nUlNTSSA9PSBUUlVFKQorCQl7CisJCQlwRW50cnktPmZMYXN0U2VjQWNjb3JkaW5nUlNTSSA9IEZBTFNFOworCQkJcEVudHJ5LT5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID0gMDsKKwkJCS8vIHJlc2V0IGFsbCBPbmVTZWNUeCBjb3VudGVycworCQkJUkVTRVRfT05FX1NFQ19UWF9DTlQocEVudHJ5KTsKKworCQkJY29udGludWU7CisJCX0KKworCQlkbworCQl7CisJCQlCT09MRUFOCWJUcmFpblVwRG93biA9IEZBTFNFOworCisJCQlwRW50cnktPkN1cnJUeFJhdGVTdGFibGVUaW1lICsrOworCisJCQkvLyBkb3duZ3JhZGUgVFggcXVhbGl0eSBpZiBQRVIgPj0gUmF0ZS1Eb3duIHRocmVzaG9sZAorCQkJaWYgKFR4RXJyb3JSYXRpbyA+PSBUcmFpbkRvd24pCisJCQl7CisJCQkJYlRyYWluVXBEb3duID0gVFJVRTsKKwkJCQlwRW50cnktPlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gPSBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORDsKKwkJCX0KKwkJCS8vIHVwZ3JhZGUgVFggcXVhbGl0eSBpZiBQRVIgPD0gUmF0ZS1VcCB0aHJlc2hvbGQKKwkJCWVsc2UgaWYgKFR4RXJyb3JSYXRpbyA8PSBUcmFpblVwKQorCQkJeworCQkJCWJUcmFpblVwRG93biA9IFRSVUU7CisJCQkJYlVwZ3JhZGVRdWFsaXR5ID0gVFJVRTsKKwkJCQlpZiAocEVudHJ5LT5UeFF1YWxpdHlbQ3VyclJhdGVJZHhdKQorCQkJCQlwRW50cnktPlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gLS07ICAvLyBxdWFsaXR5IHZlcnkgZ29vZCBpbiBDdXJyUmF0ZQorCisJCQkJaWYgKHBFbnRyeS0+VHhSYXRlVXBQZW5hbHR5KQorCQkJCQlwRW50cnktPlR4UmF0ZVVwUGVuYWx0eSAtLTsKKwkJCQllbHNlIGlmIChwRW50cnktPlR4UXVhbGl0eVtVcFJhdGVJZHhdKQorCQkJCQlwRW50cnktPlR4UXVhbGl0eVtVcFJhdGVJZHhdIC0tOyAgICAvLyBtYXkgaW1wcm92ZSBuZXh0IFVQIHJhdGUncyBxdWFsaXR5CisJCQl9CisKKwkJCXBFbnRyeS0+UEVSW0N1cnJSYXRlSWR4XSA9IChVQ0hBUilUeEVycm9yUmF0aW87CisKKwkJCWlmIChiVHJhaW5VcERvd24pCisJCQl7CisJCQkJLy8gcGVyZm9ybSBEUlMgLSBjb25zaWRlciBUeFJhdGUgRG93biBmaXJzdCwgdGhlbiByYXRlIHVwLgorCQkJCWlmICgoQ3VyclJhdGVJZHggIT0gRG93blJhdGVJZHgpICYmIChwRW50cnktPlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gPj0gRFJTX1RYX1FVQUxJVFlfV09SU1RfQk9VTkQpKQorCQkJCXsKKwkJCQkJcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXggPSBEb3duUmF0ZUlkeDsKKwkJCQl9CisJCQkJZWxzZSBpZiAoKEN1cnJSYXRlSWR4ICE9IFVwUmF0ZUlkeCkgJiYgKHBFbnRyeS0+VHhRdWFsaXR5W1VwUmF0ZUlkeF0gPD0gMCkpCisJCQkJeworCQkJCQlwRW50cnktPkN1cnJUeFJhdGVJbmRleCA9IFVwUmF0ZUlkeDsKKwkJCQl9CisJCQl9CisJCX0gd2hpbGUgKEZBTFNFKTsKKworCQkvLyBpZiByYXRlLXVwIGhhcHBlbiwgY2xlYXIgYWxsIGJhZCBoaXN0b3J5IG9mIGFsbCBUWCByYXRlcworCQlpZiAocEVudHJ5LT5DdXJyVHhSYXRlSW5kZXggPiBDdXJyUmF0ZUlkeCkKKwkJeworCQkJcEVudHJ5LT5DdXJyVHhSYXRlU3RhYmxlVGltZSA9IDA7CisJCQlwRW50cnktPlR4UmF0ZVVwUGVuYWx0eSA9IDA7CisJCQlwRW50cnktPkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gPSAxOyAvLyByYXRlIFVQCisJCQlOZGlzWmVyb01lbW9yeShwRW50cnktPlR4UXVhbGl0eSwgc2l6ZW9mKFVTSE9SVCkgKiBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7CisJCQlOZGlzWmVyb01lbW9yeShwRW50cnktPlBFUiwgc2l6ZW9mKFVDSEFSKSAqIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKKworCQkJLy8KKwkJCS8vIEZvciBUeFJhdGUgZmFzdCB0cmFpbiB1cAorCQkJLy8KKwkJCWlmICghcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nKQorCQkJeworCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXIsIDEwMCk7CisKKwkJCQlwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lclJ1bm5pbmcgPSBUUlVFOworCQkJfQorCQkJYlR4UmF0ZUNoYW5nZWQgPSBUUlVFOworCQl9CisJCS8vIGlmIHJhdGUtZG93biBoYXBwZW4sIG9ubHkgY2xlYXIgRG93blJhdGUncyBiYWQgaGlzdG9yeQorCQllbHNlIGlmIChwRW50cnktPkN1cnJUeFJhdGVJbmRleCA8IEN1cnJSYXRlSWR4KQorCQl7CisJCQlwRW50cnktPkN1cnJUeFJhdGVTdGFibGVUaW1lID0gMDsKKwkJCXBFbnRyeS0+VHhSYXRlVXBQZW5hbHR5ID0gMDsgICAgICAgICAgIC8vIG5vIHBlbmFsdHkKKwkJCXBFbnRyeS0+TGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9IDI7IC8vIHJhdGUgRE9XTgorCQkJcEVudHJ5LT5UeFF1YWxpdHlbcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXhdID0gMDsKKwkJCXBFbnRyeS0+UEVSW3BFbnRyeS0+Q3VyclR4UmF0ZUluZGV4XSA9IDA7CisKKwkJCS8vCisJCQkvLyBGb3IgVHhSYXRlIGZhc3QgdHJhaW4gZG93bgorCQkJLy8KKwkJCWlmICghcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nKQorCQkJeworCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXIsIDEwMCk7CisKKwkJCQlwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lclJ1bm5pbmcgPSBUUlVFOworCQkJfQorCQkJYlR4UmF0ZUNoYW5nZWQgPSBUUlVFOworCQl9CisJCWVsc2UKKwkJeworCQkJcEVudHJ5LT5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID0gMDsgLy8gcmF0ZSBubyBjaGFuZ2UKKwkJCWJUeFJhdGVDaGFuZ2VkID0gRkFMU0U7CisJCX0KKworCQlwRW50cnktPkxhc3RUeE9rQ291bnQgPSBUeFN1Y2Nlc3M7CisKKwkJLy8gcmVzZXQgYWxsIE9uZVNlY1R4IGNvdW50ZXJzCisJCVJFU0VUX09ORV9TRUNfVFhfQ05UKHBFbnRyeSk7CisKKwkJcE5leHRUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKHBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4KzEpKjVdOworCQlpZiAoYlR4UmF0ZUNoYW5nZWQgJiYgcE5leHRUeFJhdGUpCisJCXsKKwkJCU1sbWVTZXRUeFJhdGUocEFkLCBwRW50cnksIHBOZXh0VHhSYXRlKTsKKwkJfQorCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlTdGF0aW9uIHNpZGUsIEF1dG8gVHhSYXRlIGZhc3RlciB0cmFpbiB1cCB0aW1lciBjYWxsIGJhY2sgZnVuY3Rpb24uCisKKwlBcmd1bWVudHM6CisJCVN5c3RlbVNwZWNpZmljMQkJCS0gTm90IHVzZWQuCisJCUZ1bmN0aW9uQ29udGV4dAkJCS0gUG9pbnRlciB0byBvdXIgQWRhcHRlciBjb250ZXh0LgorCQlTeXN0ZW1TcGVjaWZpYzIJCQktIE5vdCB1c2VkLgorCQlTeXN0ZW1TcGVjaWZpYzMJCQktIE5vdCB1c2VkLgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCVBSVE1QX0FEQVBURVIJCQlwQWQgPSAoUFJUTVBfQURBUFRFUilGdW5jdGlvbkNvbnRleHQ7CisJVUNIQVIJCQkJCVVwUmF0ZUlkeCA9IDAsIERvd25SYXRlSWR4ID0gMCwgQ3VyclJhdGVJZHggPSAwOworCVVMT05HCQkJCQlUeFRvdGFsQ250OworCVVMT05HCQkJCQlUeEVycm9yUmF0aW8gPSAwOworCUJPT0xFQU4JCQkJCWJUeFJhdGVDaGFuZ2VkOyAvLywgYlVwZ3JhZGVRdWFsaXR5ID0gRkFMU0U7CisJUFJUTVBfVFhfUkFURV9TV0lUQ0gJcEN1cnJUeFJhdGUsIHBOZXh0VHhSYXRlID0gTlVMTDsKKwlQVUNIQVIJCQkJCXBUYWJsZTsKKwlVQ0hBUgkJCQkJVGFibGVTaXplID0gMDsKKwlVQ0hBUgkJCQkJSW5pdFR4UmF0ZUlkeCA9IDAsIFRyYWluVXAsIFRyYWluRG93bjsKKwlUWF9TVEFfQ05UMV9TVFJVQwkJU3RhVHgxOworCVRYX1NUQV9DTlQwX1NUUlVDCQlUeFN0YUNudDA7CisJQ0hBUgkJCQkJUnNzaSwgcmF0aW87CisJVUxPTkcJCQkJCVR4UmV0cmFuc21pdCA9IDAsIFR4U3VjY2VzcyA9IDAsIFR4RmFpbENvdW50ID0gMDsKKwlNQUNfVEFCTEVfRU5UUlkJCQkqcEVudHJ5OworCVVMT05HCQkJCQlpOworCisJcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nID0gRkFMU0U7CisKKyAgICAvLworICAgIC8vIHdhbGsgdGhyb3VnaCBNQUMgdGFibGUsIHNlZSBpZiBuZWVkIHRvIGNoYW5nZSBBUCdzIFRYIHJhdGUgdG93YXJkIGVhY2ggZW50cnkKKyAgICAvLworCWZvciAoaSA9IDE7IGkgPCBNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQorCXsKKwkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV07CisKKwkJLy8gY2hlY2sgaWYgdGhpcyBlbnRyeSBuZWVkIHRvIHN3aXRjaCByYXRlIGF1dG9tYXRpY2FsbHkKKwkJaWYgKFJUTVBDaGVja0VudHJ5RW5hYmxlQXV0b1JhdGVTd2l0Y2gocEFkLCBwRW50cnkpID09IEZBTFNFKQorCQkJY29udGludWU7CisKKwkJaWYgKElORlJBX09OKHBBZCkgJiYgKGkgPT0gMSkpCisJCQlSc3NpID0gUlRNUE1heFJzc2kocEFkLAorCQkJCQkJCSAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAsCisJCQkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMSwKKwkJCQkJCQkgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyKTsKKwkJZWxzZQorCQkJUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwKKwkJCQkJCQkgICBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTAsCisJCQkJCQkJICAgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kxLAorCQkJCQkJCSAgIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMik7CisKKwkJQ3VyclJhdGVJZHggPSBwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleDsKKworCQkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgcEVudHJ5LCAmcFRhYmxlLCAmVGFibGVTaXplLCAmSW5pdFR4UmF0ZUlkeCk7CisKKwkJLy8gZGVjaWRlIHRoZSBuZXh0IHVwZ3JhZGUgcmF0ZSBhbmQgZG93bmdyYWRlIHJhdGUsIGlmIGFueQorCQlpZiAoKEN1cnJSYXRlSWR4ID4gMCkgJiYgKEN1cnJSYXRlSWR4IDwgKFRhYmxlU2l6ZSAtIDEpKSkKKwkJeworCQkJVXBSYXRlSWR4ID0gQ3VyclJhdGVJZHggKyAxOworCQkJRG93blJhdGVJZHggPSBDdXJyUmF0ZUlkeCAtMTsKKwkJfQorCQllbHNlIGlmIChDdXJyUmF0ZUlkeCA9PSAwKQorCQl7CisJCQlVcFJhdGVJZHggPSBDdXJyUmF0ZUlkeCArIDE7CisJCQlEb3duUmF0ZUlkeCA9IEN1cnJSYXRlSWR4OworCQl9CisJCWVsc2UgaWYgKEN1cnJSYXRlSWR4ID09IChUYWJsZVNpemUgLSAxKSkKKwkJeworCQkJVXBSYXRlSWR4ID0gQ3VyclJhdGVJZHg7CisJCQlEb3duUmF0ZUlkeCA9IEN1cnJSYXRlSWR4IC0gMTsKKwkJfQorCisJCXBDdXJyVHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhDdXJyUmF0ZUlkeCsxKSo1XTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAoKFJzc2kgPiAtNjUpICYmIChwQ3VyclR4UmF0ZS0+TW9kZSA+PSBNT0RFX0hUTUlYKSkKKwkJeworCQkJVHJhaW5VcAkJPSAocEN1cnJUeFJhdGUtPlRyYWluVXAgKyAocEN1cnJUeFJhdGUtPlRyYWluVXAgPj4gMSkpOworCQkJVHJhaW5Eb3duCT0gKHBDdXJyVHhSYXRlLT5UcmFpbkRvd24gKyAocEN1cnJUeFJhdGUtPlRyYWluRG93biA+PiAxKSk7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQl7CisJCQlUcmFpblVwCQk9IHBDdXJyVHhSYXRlLT5UcmFpblVwOworCQkJVHJhaW5Eb3duCT0gcEN1cnJUeFJhdGUtPlRyYWluRG93bjsKKwkJfQorCisJCWlmIChwQWQtPk1hY1RhYi5TaXplID09IDEpCisJCXsKKwkJCS8vIFVwZGF0ZSBzdGF0aXN0aWMgY291bnRlcgorCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMCwgJlR4U3RhQ250MC53b3JkKTsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDEsICZTdGFUeDEud29yZCk7CisKKwkJCVR4UmV0cmFuc21pdCA9IFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7CisJCQlUeFN1Y2Nlc3MgPSBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOworCQkJVHhGYWlsQ291bnQgPSBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7CisJCQlUeFRvdGFsQ250ID0gVHhSZXRyYW5zbWl0ICsgVHhTdWNjZXNzICsgVHhGYWlsQ291bnQ7CisKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKz0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArPSBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudCArPSBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7CisJCQlwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQudS5Mb3dQYXJ0ICs9IFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7CisJCQlwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LnUuTG93UGFydCArPSBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OworCQkJcEFkLT5XbGFuQ291bnRlcnMuRmFpbGVkQ291bnQudS5Mb3dQYXJ0ICs9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKworI2lmIDAgLy8gdGVzdCBieSBHYXJ5LgorCQkJLy8gaWYgbm8gdHJhZmZpYyBpbiB0aGUgcGFzdCAxLXNlYyBwZXJpb2QsIGRvbid0IGNoYW5nZSBUWCByYXRlLAorCQkJLy8gYnV0IGNsZWFyIGFsbCBiYWQgaGlzdG9yeS4gYmVjYXVzZSB0aGUgYmFkIGhpc3RvcnkgbWF5IGFmZmVjdCB0aGUgbmV4dAorCQkJLy8gQ2hhcmlvdCB0aHJvdWdocHV0IHRlc3QKKwkJCVR4VG90YWxDbnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKworCQkJCQkJIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKworCQkJCQkJIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQ7CisjZW5kaWYKKwkJCWlmIChUeFRvdGFsQ250KQorCQkJCVR4RXJyb3JSYXRpbyA9ICgoVHhSZXRyYW5zbWl0ICsgVHhGYWlsQ291bnQpICogMTAwKSAvIFR4VG90YWxDbnQ7CisJCX0KKwkJZWxzZQorCQl7CisJCQlUeFRvdGFsQ250ID0gcEVudHJ5LT5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsKKwkJCQkgcEVudHJ5LT5PbmVTZWNUeFJldHJ5T2tDb3VudCArCisJCQkJIHBFbnRyeS0+T25lU2VjVHhGYWlsQ291bnQ7CisKKwkJCWlmIChUeFRvdGFsQ250KQorCQkJCVR4RXJyb3JSYXRpbyA9ICgocEVudHJ5LT5PbmVTZWNUeFJldHJ5T2tDb3VudCArIHBFbnRyeS0+T25lU2VjVHhGYWlsQ291bnQpICogMTAwKSAvIFR4VG90YWxDbnQ7CisJCX0KKworCisJCS8vCisJCS8vIENBU0UgMS4gd2hlbiBUWCBzYW1wbGVzIGFyZSBmZXdlciB0aGFuIDE1LCB0aGVuIGRlY2lkZSBUWCByYXRlIHNvbGVseSBvbiBSU1NJCisJCS8vICAgICAgICAgKGNyaXRlcmlhIGNvcGllZCBmcm9tIFJUMjUwMCBmb3IgTmV0b3BpYSBjYXNlKQorCQkvLworCQlpZiAoVHhUb3RhbENudCA8PSAxMikKKwkJeworCQkJTmRpc1plcm9NZW1vcnkocEFkLT5EcnNDb3VudGVycy5UeFF1YWxpdHksIHNpemVvZihVU0hPUlQpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOworCQkJTmRpc1plcm9NZW1vcnkocEFkLT5EcnNDb3VudGVycy5QRVIsIHNpemVvZihVQ0hBUikgKiBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7CisKKwkJCWlmICgocEFkLT5EcnNDb3VudGVycy5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID09IDEpICYmIChDdXJyUmF0ZUlkeCAhPSBEb3duUmF0ZUlkeCkpCisJCQl7CisJCQkJcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXggPSBEb3duUmF0ZUlkeDsKKwkJCQlwQWQtPkRyc0NvdW50ZXJzLlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gPSBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORDsKKwkJCX0KKwkJCWVsc2UgaWYgKChwQWQtPkRyc0NvdW50ZXJzLkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gPT0gMikgJiYgKEN1cnJSYXRlSWR4ICE9IFVwUmF0ZUlkeCkpCisJCQl7CisJCQkJcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXggPSBVcFJhdGVJZHg7CisJCQl9CisKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIlF1aWNrRFJTOiBUeFRvdGFsQ250IDw9IDE1LCB0cmFpbiBiYWNrIHRvIG9yaWdpbmFsIHJhdGUgXG4iKSk7CisJCQlyZXR1cm47CisJCX0KKworCQlkbworCQl7CisJCQlVTE9ORyBPbmVTZWNUeE5vUmV0cnlPS1JhdGlvbkNvdW50OworCisJCQlpZiAocEFkLT5EcnNDb3VudGVycy5MYXN0VGltZVR4UmF0ZUNoYW5nZUFjdGlvbiA9PSAwKQorCQkJCXJhdGlvID0gNTsKKwkJCWVsc2UKKwkJCQlyYXRpbyA9IDQ7CisKKwkJCS8vIGRvd25ncmFkZSBUWCBxdWFsaXR5IGlmIFBFUiA+PSBSYXRlLURvd24gdGhyZXNob2xkCisJCQlpZiAoVHhFcnJvclJhdGlvID49IFRyYWluRG93bikKKwkJCXsKKwkJCQlwQWQtPkRyc0NvdW50ZXJzLlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gPSBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORDsKKwkJCX0KKworCQkJcEFkLT5EcnNDb3VudGVycy5QRVJbQ3VyclJhdGVJZHhdID0gKFVDSEFSKVR4RXJyb3JSYXRpbzsKKworCQkJT25lU2VjVHhOb1JldHJ5T0tSYXRpb25Db3VudCA9IChUeFN1Y2Nlc3MgKiByYXRpbyk7CisKKwkJCS8vIHBlcmZvcm0gRFJTIC0gY29uc2lkZXIgVHhSYXRlIERvd24gZmlyc3QsIHRoZW4gcmF0ZSB1cC4KKwkJCWlmICgocEFkLT5EcnNDb3VudGVycy5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID09IDEpICYmIChDdXJyUmF0ZUlkeCAhPSBEb3duUmF0ZUlkeCkpCisJCQl7CisJCQkJaWYgKChwQWQtPkRyc0NvdW50ZXJzLkxhc3RUeE9rQ291bnQgKyAyKSA+PSBPbmVTZWNUeE5vUmV0cnlPS1JhdGlvbkNvdW50KQorCQkJCXsKKwkJCQkJcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXggPSBEb3duUmF0ZUlkeDsKKwkJCQkJcEFkLT5EcnNDb3VudGVycy5UeFF1YWxpdHlbQ3VyclJhdGVJZHhdID0gRFJTX1RYX1FVQUxJVFlfV09SU1RfQk9VTkQ7CisKKwkJCQl9CisKKwkJCX0KKwkJCWVsc2UgaWYgKChwQWQtPkRyc0NvdW50ZXJzLkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gPT0gMikgJiYgKEN1cnJSYXRlSWR4ICE9IFVwUmF0ZUlkeCkpCisJCQl7CisJCQkJaWYgKChUeEVycm9yUmF0aW8gPj0gNTApIHx8IChUeEVycm9yUmF0aW8gPj0gVHJhaW5Eb3duKSkKKwkJCQl7CisKKwkJCQl9CisJCQkJZWxzZSBpZiAoKHBBZC0+RHJzQ291bnRlcnMuTGFzdFR4T2tDb3VudCArIDIpID49IE9uZVNlY1R4Tm9SZXRyeU9LUmF0aW9uQ291bnQpCisJCQkJeworCQkJCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCA9IFVwUmF0ZUlkeDsKKwkJCQl9CisJCQl9CisJCX13aGlsZSAoRkFMU0UpOworCisJCS8vIGlmIHJhdGUtdXAgaGFwcGVuLCBjbGVhciBhbGwgYmFkIGhpc3Rvcnkgb2YgYWxsIFRYIHJhdGVzCisJCWlmIChwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCA+IEN1cnJSYXRlSWR4KQorCQl7CisJCQlwQWQtPkRyc0NvdW50ZXJzLlR4UmF0ZVVwUGVuYWx0eSA9IDA7CisJCQlOZGlzWmVyb01lbW9yeShwQWQtPkRyc0NvdW50ZXJzLlR4UXVhbGl0eSwgc2l6ZW9mKFVTSE9SVCkgKiBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7CisJCQlOZGlzWmVyb01lbW9yeShwQWQtPkRyc0NvdW50ZXJzLlBFUiwgc2l6ZW9mKFVDSEFSKSAqIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKKwkJCWJUeFJhdGVDaGFuZ2VkID0gVFJVRTsKKwkJfQorCQkvLyBpZiByYXRlLWRvd24gaGFwcGVuLCBvbmx5IGNsZWFyIERvd25SYXRlJ3MgYmFkIGhpc3RvcnkKKwkJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXggPCBDdXJyUmF0ZUlkeCkKKwkJeworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiUXVpY2tEUlM6IC0tVFggcmF0ZSBmcm9tICVkIHRvICVkIFxuIiwgQ3VyclJhdGVJZHgsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4KSk7CisKKwkJCXBBZC0+RHJzQ291bnRlcnMuVHhSYXRlVXBQZW5hbHR5ID0gMDsgICAgICAgICAgIC8vIG5vIHBlbmFsdHkKKwkJCXBBZC0+RHJzQ291bnRlcnMuVHhRdWFsaXR5W3BBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4XSA9IDA7CisJCQlwQWQtPkRyc0NvdW50ZXJzLlBFUltwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleF0gPSAwOworCQkJYlR4UmF0ZUNoYW5nZWQgPSBUUlVFOworCQl9CisJCWVsc2UKKwkJeworCQkJYlR4UmF0ZUNoYW5nZWQgPSBGQUxTRTsKKwkJfQorCisJCXBOZXh0VHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCsxKSo1XTsKKwkJaWYgKGJUeFJhdGVDaGFuZ2VkICYmIHBOZXh0VHhSYXRlKQorCQl7CisJCQlNbG1lU2V0VHhSYXRlKHBBZCwgcEVudHJ5LCBwTmV4dFR4UmF0ZSk7CisJCX0KKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIGlzIGV4ZWN1dGVkIHBlcmlvZGljYWxseSBpbnNpZGUgTWxtZVBlcmlvZGljRXhlYygpIGFmdGVyCisJCWFzc29jaWF0aW9uIHdpdGggYW4gQVAuCisJCUl0IGNoZWNrcyBpZiBTdGFDZmcuUHNtIGlzIGNvbnNpc3RlbnQgd2l0aCB1c2VyIHBvbGljeSAocmVjb3JkZWQgaW4KKwkJU3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUpLiBJZiBub3QsIGVuZm9yY2UgdXNlciBwb2xpY3kuIEhvd2V2ZXIsCisJCXRoZXJlJ3JlIHNvbWUgY29uZGl0aW9ucyB0byBjb25zaWRlcjoKKwkJMS4gd2UgZG9uJ3Qgc3VwcG9ydCBwb3dlci1zYXZpbmcgaW4gQURIT0MgbW9kZSwgc28gUHNtPVBXUl9BQ1RJVkUgYWxsCisJCSAgIHRoZSB0aW1lIHdoZW4gTWlic3M9PVRSVUUKKwkJMi4gV2hlbiBsaW5rIHVwIGluIElORlJBIG1vZGUsIFBzbSBzaG91bGQgbm90IGJlIHN3aXRjaCB0byBQV1JfU0FWRQorCQkgICBpZiBvdXRnb2luZyB0cmFmZmljIGF2YWlsYWJsZSBpbiBUeFJpbmcgb3IgTWdtdFJpbmcuCisJT3V0cHV0OgorCQkxLiBjaGFuZ2UgcEFkLT5TdGFDZmcuUHNtIHRvIFBXUl9TQVZFIG9yIGxlYXZlIGl0IHVudG91Y2hlZAorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVDaGVja1BzbUNoYW5nZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVTE9ORwlOb3czMikKK3sKKwlVTE9ORwlQb3dlck1vZGU7CisKKwkvLyBjb25kaXRpb24gLQorCS8vIDEuIFBzbSBtYXliZSBPTiBvbmx5IGhhcHBlbiBpbiBJTkZSQVNUUlVDVFVSRSBtb2RlCisJLy8gMi4gdXNlciB3YW50cyBlaXRoZXIgTUFYX1BTUCBvciBGQVNUX1BTUAorCS8vIDMuIGJ1dCBjdXJyZW50IHBzbSBpcyBub3QgaW4gUFdSX1NBVkUKKwkvLyA0LiBDTlRMIHN0YXRlIG1hY2hpbmUgaXMgbm90IGRvaW5nIFNDQU5uaW5nCisJLy8gNS4gbm8gVFggU1VDQ0VTUyBldmVudCBmb3IgdGhlIHBhc3QgMS1zZWMgcGVyaW9kCisjaWZkZWYgTkRJUzUxX01JTklQT1JUCisJaWYgKHBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlclByb2ZpbGUgPT0gTmRpc1Bvd2VyUHJvZmlsZUJhdHRlcnkpCisJCVBvd2VyTW9kZSA9IHBBZC0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlOworCWVsc2UKKyNlbmRpZgorCQlQb3dlck1vZGUgPSBwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlOworCisJaWYgKElORlJBX09OKHBBZCkgJiYKKwkJKFBvd2VyTW9kZSAhPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNKSAmJgorCQkocEFkLT5TdGFDZmcuUHNtID09IFBXUl9BQ1RJVkUpICYmCisvLwkJKCEgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKwkJKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPT0gQ05UTF9JRExFKSAvKiYmCisJCShwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgPT0gMCkgJiYKKwkJKHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgPT0gMCkqLykKKwl7CisJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJnBBZC0+TWxtZS5MYXN0U2VuZE5VTExwc21UaW1lKTsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50U2luY2VMYXN0TlVMTCA9IDA7CisJCU1sbWVTZXRQc21CaXQocEFkLCBQV1JfU0FWRSk7CisJCWlmICghKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSAmJiBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSkpCisJCXsKKwkJCVJUTVBTZW5kTnVsbEZyYW1lKHBBZCwgcEFkLT5Db21tb25DZmcuVHhSYXRlLCBGQUxTRSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSwgVFJVRSk7CisJCX0KKwl9Cit9CisKKy8vIElSUUwgPSBQQVNTSVZFX0xFVkVMCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQgTWxtZVNldFBzbUJpdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQgcHNtKQoreworCUFVVE9fUlNQX0NGR19TVFJVQyBjc3I0OworCisJcEFkLT5TdGFDZmcuUHNtID0gcHNtOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgQVVUT19SU1BfQ0ZHLCAmY3NyNC53b3JkKTsKKwljc3I0LmZpZWxkLkFja0N0c1BzbUJpdCA9IChwc20gPT0gUFdSX1NBVkUpPyAxOjA7CisJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19SU1BfQ0ZHLCBjc3I0LndvcmQpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTZXRQc21CaXQgPSAlZFxuIiwgcHNtKSk7Cit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCitWT0lEIE1sbWVTZXRUeFByZWFtYmxlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVCBUeFByZWFtYmxlKQoreworCUFVVE9fUlNQX0NGR19TVFJVQyBjc3I0OworCisJLy8KKwkvLyBBbHdheXMgdXNlIExvbmcgcHJlYW1ibGUgYmVmb3JlIHZlcmlmaWF0aW9uIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3Mgd2VsbC4KKwkvLyBUb2RvOiByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lIGlmIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3MKKwkvLworCS8vVHhQcmVhbWJsZSA9IFJ0ODAyXzExUHJlYW1ibGVMb25nOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBBVVRPX1JTUF9DRkcsICZjc3I0LndvcmQpOworCWlmIChUeFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVMb25nKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVNldFR4UHJlYW1ibGUgKD0gTE9ORyBQUkVBTUJMRSlcbiIpKTsKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsKKwkJY3NyNC5maWVsZC5BdXRvUmVzcG9uZGVyUHJlYW1ibGUgPSAwOworCX0KKwllbHNlCisJeworCQkvLyBOT1RFOiAxTWJwcyBzaG91bGQgYWx3YXlzIHVzZSBsb25nIHByZWFtYmxlCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTZXRUeFByZWFtYmxlICg9IFNIT1JUIFBSRUFNQkxFKVxuIikpOworCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsKKwkJY3NyNC5maWVsZC5BdXRvUmVzcG9uZGVyUHJlYW1ibGUgPSAxOworCX0KKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fUlNQX0NGRywgY3NyNC53b3JkKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBVcGRhdGUgYmFzaWMgcmF0ZSBiaXRtYXAKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKK1ZPSUQgVXBkYXRlQmFzaWNSYXRlQml0bWFwKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIpCit7CisgICAgSU5UICBpLCBqOworICAgICAgICAgICAgICAgICAgLyogMSAgMiAgNS41LCAxMSwgIDYsICA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsICA1NCAqLworICAgIFVDSEFSIHJhdGVbXSA9IHsgMiwgNCwgIDExLCAyMiwgMTIsIDE4LCAyNCwgMzYsIDQ4LCA3MiwgOTYsIDEwOCB9OworICAgIFVDSEFSICpzdXBfcCA9IHBBZGFwdGVyLT5Db21tb25DZmcuU3VwUmF0ZTsKKyAgICBVQ0hBUiAqZXh0X3AgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkV4dFJhdGU7CisgICAgVUxPTkcgYml0bWFwID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXA7CisKKworICAgIC8qIGlmIEEgbW9kZSwgYWx3YXlzIHVzZSBmaXggQmFzaWNSYXRlQml0TWFwICovCisgICAgLy9pZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsID09IFBIWV8xMUEpCisJaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQorICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJhc2ljUmF0ZUJpdG1hcCA9IDB4MTUwOyAvKiA2LCAxMiwgMjRNICovCisgICAgLyogRW5kIG9mIGlmICovCisKKyAgICBpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXAgPiA0MDk1KQorICAgIHsKKyAgICAgICAgLyogKDIgXiBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykgLTEgKi8KKyAgICAgICAgcmV0dXJuOworICAgIH0gLyogRW5kIG9mIGlmICovCisKKyAgICBmb3IoaT0wOyBpPE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOyBpKyspCisgICAgeworICAgICAgICBzdXBfcFtpXSAmPSAweDdmOworICAgICAgICBleHRfcFtpXSAmPSAweDdmOworICAgIH0gLyogRW5kIG9mIGZvciAqLworCisgICAgZm9yKGk9MDsgaTxNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKGJpdG1hcCAmICgxIDw8IGkpKQorICAgICAgICB7CisgICAgICAgICAgICBmb3Ioaj0wOyBqPE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHN1cF9wW2pdID09IHJhdGVbaV0pCisgICAgICAgICAgICAgICAgICAgIHN1cF9wW2pdIHw9IDB4ODA7CisgICAgICAgICAgICAgICAgLyogRW5kIG9mIGlmICovCisgICAgICAgICAgICB9IC8qIEVuZCBvZiBmb3IgKi8KKworICAgICAgICAgICAgZm9yKGo9MDsgajxNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChleHRfcFtqXSA9PSByYXRlW2ldKQorICAgICAgICAgICAgICAgICAgICBleHRfcFtqXSB8PSAweDgwOworICAgICAgICAgICAgICAgIC8qIEVuZCBvZiBpZiAqLworICAgICAgICAgICAgfSAvKiBFbmQgb2YgZm9yICovCisgICAgICAgIH0gLyogRW5kIG9mIGlmICovCisgICAgfSAvKiBFbmQgb2YgZm9yICovCit9IC8qIEVuZCBvZiBVcGRhdGVCYXNpY1JhdGVCaXRtYXAgKi8KKworLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorLy8gYkxpbmtVcCBpcyB0byBpZGVudGlmeSB0aGUgaW5pdGFsIGxpbmsgc3BlZWQuCisvLyBUUlVFIGluZGljYXRlcyB0aGUgcmF0ZSB1cGRhdGUgYXQgbGlua3VwLCB3ZSBzaG91bGQgbm90IHRyeSB0byBzZXQgdGhlIHJhdGUgYXQgNTRNYnBzLgorVk9JRCBNbG1lVXBkYXRlVHhSYXRlcygKKwlJTiBQUlRNUF9BREFQVEVSIAkJcEFkLAorCUlOIAlCT09MRUFOCQkgCQliTGlua1VwLAorCUlOCVVDSEFSCQkJCWFwaWR4KQoreworCWludCBpLCBudW07CisJVUNIQVIgUmF0ZSA9IFJBVEVfNiwgTWF4RGVzaXJlID0gUkFURV8xLCBNYXhTdXBwb3J0ID0gUkFURV8xOworCVVDSEFSIE1pblN1cHBvcnQgPSBSQVRFXzU0OworCVVMT05HIEJhc2ljUmF0ZUJpdG1hcCA9IDA7CisJVUNIQVIgQ3VyckJhc2ljUmF0ZSA9IFJBVEVfMTsKKwlVQ0hBUiAqcFN1cFJhdGUsIFN1cFJhdGVMZW4sICpwRXh0UmF0ZSwgRXh0UmF0ZUxlbjsKKwlQSFRUUkFOU01JVF9TRVRUSU5HCQlwSHRQaHkgPSBOVUxMOworCVBIVFRSQU5TTUlUX1NFVFRJTkcJCXBNYXhIdFBoeSA9IE5VTEw7CisJUEhUVFJBTlNNSVRfU0VUVElORwkJcE1pbkh0UGh5ID0gTlVMTDsKKwlCT09MRUFOIAkJCQkqYXV0b19yYXRlX2N1cl9wOworCVVDSEFSCQkJCQlIdE1jcyA9IE1DU19BVVRPOworCisJLy8gZmluZCBtYXggZGVzaXJlZCByYXRlCisJVXBkYXRlQmFzaWNSYXRlQml0bWFwKHBBZCk7CisKKwludW0gPSAwOworCWF1dG9fcmF0ZV9jdXJfcCA9IE5VTEw7CisJZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVM7IGkrKykKKwl7CisJCXN3aXRjaCAocEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVtpXSAmIDB4N2YpCisJCXsKKwkJCWNhc2UgMjogIFJhdGUgPSBSQVRFXzE7ICAgbnVtKys7ICAgYnJlYWs7CisJCQljYXNlIDQ6ICBSYXRlID0gUkFURV8yOyAgIG51bSsrOyAgIGJyZWFrOworCQkJY2FzZSAxMTogUmF0ZSA9IFJBVEVfNV81OyBudW0rKzsgICBicmVhazsKKwkJCWNhc2UgMjI6IFJhdGUgPSBSQVRFXzExOyAgbnVtKys7ICAgYnJlYWs7CisJCQljYXNlIDEyOiBSYXRlID0gUkFURV82OyAgIG51bSsrOyAgIGJyZWFrOworCQkJY2FzZSAxODogUmF0ZSA9IFJBVEVfOTsgICBudW0rKzsgICBicmVhazsKKwkJCWNhc2UgMjQ6IFJhdGUgPSBSQVRFXzEyOyAgbnVtKys7ICAgYnJlYWs7CisJCQljYXNlIDM2OiBSYXRlID0gUkFURV8xODsgIG51bSsrOyAgIGJyZWFrOworCQkJY2FzZSA0ODogUmF0ZSA9IFJBVEVfMjQ7ICBudW0rKzsgICBicmVhazsKKwkJCWNhc2UgNzI6IFJhdGUgPSBSQVRFXzM2OyAgbnVtKys7ICAgYnJlYWs7CisJCQljYXNlIDk2OiBSYXRlID0gUkFURV80ODsgIG51bSsrOyAgIGJyZWFrOworCQkJY2FzZSAxMDg6IFJhdGUgPSBSQVRFXzU0OyBudW0rKzsgICBicmVhazsKKwkJCS8vZGVmYXVsdDogUmF0ZSA9IFJBVEVfMTsgICBicmVhazsKKwkJfQorCQlpZiAoTWF4RGVzaXJlIDwgUmF0ZSkgIE1heERlc2lyZSA9IFJhdGU7CisJfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlwSHRQaHkgCQk9ICZwQWQtPlN0YUNmZy5IVFBoeU1vZGU7CisJCXBNYXhIdFBoeQk9ICZwQWQtPlN0YUNmZy5NYXhIVFBoeU1vZGU7CisJCXBNaW5IdFBoeQk9ICZwQWQtPlN0YUNmZy5NaW5IVFBoeU1vZGU7CisKKwkJYXV0b19yYXRlX2N1cl9wID0gJnBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoOworCQlIdE1jcyAJCT0gcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1M7CisKKwkJaWYgKChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykgJiYKKwkJCShwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpICYmCisJCQkoTWF4RGVzaXJlID4gUkFURV8xMSkpCisJCXsKKwkJCU1heERlc2lyZSA9IFJBVEVfMTE7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlwQWQtPkNvbW1vbkNmZy5NYXhEZXNpcmVkUmF0ZSA9IE1heERlc2lyZTsKKwlwTWluSHRQaHktPndvcmQgPSAwOworCXBNYXhIdFBoeS0+d29yZCA9IDA7CisJcEh0UGh5LT53b3JkID0gMDsKKworCS8vIEF1dG8gcmF0ZSBzd2l0Y2hpbmcgaXMgZW5hYmxlZCBvbmx5IGlmIG1vcmUgdGhhbiBvbmUgREVTSVJFRCBSQVRFUyBhcmUKKwkvLyBzcGVjaWZpZWQ7IG90aGVyd2lzZSBkaXNhYmxlZAorCWlmIChudW0gPD0gMSkKKwl7CisJCS8vT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCk7CisJCS8vcEFkLT5Db21tb25DZmcuYkF1dG9UeFJhdGVTd2l0Y2gJPSBGQUxTRTsKKwkJKmF1dG9fcmF0ZV9jdXJfcCA9IEZBTFNFOworCX0KKwllbHNlCisJeworCQkvL09QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKTsKKwkJLy9wQWQtPkNvbW1vbkNmZy5iQXV0b1R4UmF0ZVN3aXRjaAk9IFRSVUU7CisJCSphdXRvX3JhdGVfY3VyX3AgPSBUUlVFOworCX0KKworI2lmIDEKKwlpZiAoSHRNY3MgIT0gTUNTX0FVVE8pCisJeworCQkvL09QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpOworCQkvL3BBZC0+Q29tbW9uQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoCT0gRkFMU0U7CisJCSphdXRvX3JhdGVfY3VyX3AgPSBGQUxTRTsKKwl9CisJZWxzZQorCXsKKwkJLy9PUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCk7CisJCS8vcEFkLT5Db21tb25DZmcuYkF1dG9UeFJhdGVTd2l0Y2gJPSBUUlVFOworCQkqYXV0b19yYXRlX2N1cl9wID0gVFJVRTsKKwl9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCWlmICgoQURIT0NfT04ocEFkKSB8fCBJTkZSQV9PTihwQWQpKSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCisJeworCQlwU3VwUmF0ZSA9ICZwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlWzBdOworCQlwRXh0UmF0ZSA9ICZwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlWzBdOworCQlTdXBSYXRlTGVuID0gcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbjsKKwkJRXh0UmF0ZUxlbiA9IHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW47CisJfQorCWVsc2UKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl7CisJCXBTdXBSYXRlID0gJnBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMF07CisJCXBFeHRSYXRlID0gJnBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVbMF07CisJCVN1cFJhdGVMZW4gPSBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuOworCQlFeHRSYXRlTGVuID0gcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbjsKKwl9CisKKwkvLyBmaW5kIG1heCBzdXBwb3J0ZWQgcmF0ZQorCWZvciAoaT0wOyBpPFN1cFJhdGVMZW47IGkrKykKKwl7CisJCXN3aXRjaCAocFN1cFJhdGVbaV0gJiAweDdmKQorCQl7CisJCQljYXNlIDI6ICAgUmF0ZSA9IFJBVEVfMTsJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwMTsJIGJyZWFrOworCQkJY2FzZSA0OiAgIFJhdGUgPSBSQVRFXzI7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDI7CSBicmVhazsKKwkJCWNhc2UgMTE6ICBSYXRlID0gUkFURV81XzU7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDQ7CSBicmVhazsKKwkJCWNhc2UgMjI6ICBSYXRlID0gUkFURV8xMTsJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwODsJIGJyZWFrOworCQkJY2FzZSAxMjogIFJhdGUgPSBSQVRFXzY7CS8qaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkqLyAgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAxMDsgIGJyZWFrOworCQkJY2FzZSAxODogIFJhdGUgPSBSQVRFXzk7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMjA7CSBicmVhazsKKwkJCWNhc2UgMjQ6ICBSYXRlID0gUkFURV8xMjsJLyppZiAocFN1cFJhdGVbaV0gJiAweDgwKSovICBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDQwOyAgYnJlYWs7CisJCQljYXNlIDM2OiAgUmF0ZSA9IFJBVEVfMTg7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwODA7CSBicmVhazsKKwkJCWNhc2UgNDg6ICBSYXRlID0gUkFURV8yNDsJLyppZiAocFN1cFJhdGVbaV0gJiAweDgwKSovICBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMTAwOyAgYnJlYWs7CisJCQljYXNlIDcyOiAgUmF0ZSA9IFJBVEVfMzY7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAyMDA7CSBicmVhazsKKwkJCWNhc2UgOTY6ICBSYXRlID0gUkFURV80ODsJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDQwMDsJIGJyZWFrOworCQkJY2FzZSAxMDg6IFJhdGUgPSBSQVRFXzU0OwlpZiAocFN1cFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwODAwOwkgYnJlYWs7CisJCQlkZWZhdWx0OiAgUmF0ZSA9IFJBVEVfMTsJYnJlYWs7CisJCX0KKwkJaWYgKE1heFN1cHBvcnQgPCBSYXRlKQlNYXhTdXBwb3J0ID0gUmF0ZTsKKworCQlpZiAoTWluU3VwcG9ydCA+IFJhdGUpIE1pblN1cHBvcnQgPSBSYXRlOworCX0KKworCWZvciAoaT0wOyBpPEV4dFJhdGVMZW47IGkrKykKKwl7CisJCXN3aXRjaCAocEV4dFJhdGVbaV0gJiAweDdmKQorCQl7CisJCQljYXNlIDI6ICAgUmF0ZSA9IFJBVEVfMTsJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwMTsJIGJyZWFrOworCQkJY2FzZSA0OiAgIFJhdGUgPSBSQVRFXzI7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDI7CSBicmVhazsKKwkJCWNhc2UgMTE6ICBSYXRlID0gUkFURV81XzU7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDQ7CSBicmVhazsKKwkJCWNhc2UgMjI6ICBSYXRlID0gUkFURV8xMTsJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwODsJIGJyZWFrOworCQkJY2FzZSAxMjogIFJhdGUgPSBSQVRFXzY7CS8qaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkqLyAgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAxMDsgIGJyZWFrOworCQkJY2FzZSAxODogIFJhdGUgPSBSQVRFXzk7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMjA7CSBicmVhazsKKwkJCWNhc2UgMjQ6ICBSYXRlID0gUkFURV8xMjsJLyppZiAocEV4dFJhdGVbaV0gJiAweDgwKSovICBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDQwOyAgYnJlYWs7CisJCQljYXNlIDM2OiAgUmF0ZSA9IFJBVEVfMTg7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwODA7CSBicmVhazsKKwkJCWNhc2UgNDg6ICBSYXRlID0gUkFURV8yNDsJLyppZiAocEV4dFJhdGVbaV0gJiAweDgwKSovICBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMTAwOyAgYnJlYWs7CisJCQljYXNlIDcyOiAgUmF0ZSA9IFJBVEVfMzY7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAyMDA7CSBicmVhazsKKwkJCWNhc2UgOTY6ICBSYXRlID0gUkFURV80ODsJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDQwMDsJIGJyZWFrOworCQkJY2FzZSAxMDg6IFJhdGUgPSBSQVRFXzU0OwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwODAwOwkgYnJlYWs7CisJCQlkZWZhdWx0OiAgUmF0ZSA9IFJBVEVfMTsJYnJlYWs7CisJCX0KKwkJaWYgKE1heFN1cHBvcnQgPCBSYXRlKQlNYXhTdXBwb3J0ID0gUmF0ZTsKKworCQlpZiAoTWluU3VwcG9ydCA+IFJhdGUpIE1pblN1cHBvcnQgPSBSYXRlOworCX0KKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIExFR0FDWV9CQVNJQ19SQVRFLCBCYXNpY1JhdGVCaXRtYXApOworCisJLy8gYnVnIGZpeAorCS8vIHBBZC0+Q29tbW9uQ2ZnLkJhc2ljUmF0ZUJpdG1hcCA9IEJhc2ljUmF0ZUJpdG1hcDsKKworCS8vIGNhbGN1bGF0ZSB0aGUgZXhwdGVjdGVkIEFDSyByYXRlIGZvciBlYWNoIFRYIHJhdGUuIFRoaXMgaW5mbyBpcyB1c2VkIHRvIGNhY3VsYXRlCisJLy8gdGhlIERVUkFUSU9OIGZpZWxkIG9mIG91dGdvaW5nIHVuaWljYXN0IERBVEEvTUdNVCBmcmFtZQorCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOyBpKyspCisJeworCQlpZiAoQmFzaWNSYXRlQml0bWFwICYgKDB4MDEgPDwgaSkpCisJCQlDdXJyQmFzaWNSYXRlID0gKFVDSEFSKWk7CisJCXBBZC0+Q29tbW9uQ2ZnLkV4cGVjdGVkQUNLUmF0ZVtpXSA9IEN1cnJCYXNpY1JhdGU7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJNbG1lVXBkYXRlVHhSYXRlc1tNYXhTdXBwb3J0ID0gJWRdID0gTWF4RGVzaXJlICVkIE1icHNcbiIsIFJhdGVJZFRvTWJwc1tNYXhTdXBwb3J0XSwgUmF0ZUlkVG9NYnBzW01heERlc2lyZV0pKTsKKwkvLyBtYXggdHggcmF0ZSA9IG1pbiB7bWF4IGRlc2lyZSByYXRlLCBtYXggc3VwcG9ydGVkIHJhdGV9CisJaWYgKE1heFN1cHBvcnQgPCBNYXhEZXNpcmUpCisJCXBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA9IE1heFN1cHBvcnQ7CisJZWxzZQorCQlwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPSBNYXhEZXNpcmU7CisKKwlwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGUgPSBNaW5TdXBwb3J0OworCS8vIDIwMDMtMDctMzEgam9obiAtIDI1MDAgZG9lc24ndCBoYXZlIGdvb2Qgc2Vuc2l0aXZpdHkgYXQgaGlnaCBPRkRNIHJhdGVzLiB0byBpbmNyZWFzZSB0aGUgc3VjY2VzcworCS8vIHJhdGlvIG9mIGluaXRpYWwgREhDUCBwYWNrZXQgZXhjaGFuZ2UsIFRYIHJhdGUgc3RhcnRzIGZyb20gYSBsb3dlciByYXRlIGRlcGVuZGluZworCS8vIG9uIGF2ZXJhZ2UgUlNTSQorCS8vCSAxLiBSU1NJID49IC03MGRiLCBzdGFydCBhdCA1NCBNYnBzIChzaG9ydCBkaXN0YW5jZSkKKwkvLwkgMi4gLTcwID4gUlNTSSA+PSAtNzUsIHN0YXJ0IGF0IDI0IE1icHMgKG1pZCBkaXN0YW5jZSkKKwkvLwkgMy4gLTc1ID4gUlNTSSwgc3RhcnQgYXQgMTEgTWJwcyAobG9uZyBkaXN0YW5jZSkKKwkvL2lmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpLyogJiYKKwkvLwlPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkqLykKKwlpZiAoKmF1dG9fcmF0ZV9jdXJfcCkKKwl7CisJCXNob3J0IGRibSA9IDA7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQlkYm0gPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJaWYgKGJMaW5rVXAgPT0gVFJVRSkKKwkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSA9IFJBVEVfMjQ7CisJCWVsc2UKKwkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZTsKKworCQlpZiAoZGJtIDwgLTc1KQorCQkJcEFkLT5Db21tb25DZmcuVHhSYXRlID0gUkFURV8xMTsKKwkJZWxzZSBpZiAoZGJtIDwgLTcwKQorCQkJcEFkLT5Db21tb25DZmcuVHhSYXRlID0gUkFURV8yNDsKKworCQkvLyBzaG91bGQgbmV2ZXIgZXhjZWVkIE1heFR4UmF0ZSAoY29uc2lkZXIgMTFCLW9ubHkgbW9kZSkKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSA+IHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSkKKwkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZTsKKworCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCA9IDA7CisJfQorCWVsc2UKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZTsKKwkJcEh0UGh5LT5maWVsZC5NQ1MJPSAocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlID4gMykgPyAocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlIC0gNCkgOiBwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGU7CisJCXBIdFBoeS0+ZmllbGQuTU9ERQk9IChwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPiAzKSA/IE1PREVfT0ZETSA6IE1PREVfQ0NLOworCisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLlNUQkMJPSBwSHRQaHktPmZpZWxkLlNUQkM7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kJPSBwSHRQaHktPmZpZWxkLlNob3J0R0k7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1DUwkJPSBwSHRQaHktPmZpZWxkLk1DUzsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERQk9IHBIdFBoeS0+ZmllbGQuTU9ERTsKKwl9CisKKwlpZiAocEFkLT5Db21tb25DZmcuVHhSYXRlIDw9IFJBVEVfMTEpCisJeworCQlwTWF4SHRQaHktPmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJcE1heEh0UGh5LT5maWVsZC5NQ1MgPSBwQWQtPkNvbW1vbkNmZy5UeFJhdGU7CisJCXBNaW5IdFBoeS0+ZmllbGQuTUNTID0gcEFkLT5Db21tb25DZmcuTWluVHhSYXRlOworCX0KKwllbHNlCisJeworCQlwTWF4SHRQaHktPmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCXBNYXhIdFBoeS0+ZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuVHhSYXRlXTsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZSA+PSBSQVRFXzYgJiYgKHBBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZSA8PSBSQVRFXzU0KSkKKwkJCXtwTWluSHRQaHktPmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZV07fQorCQllbHNlCisJCQl7cE1pbkh0UGh5LT5maWVsZC5NQ1MgPSBwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGU7fQorCX0KKworCXBIdFBoeS0+d29yZCA9IChwTWF4SHRQaHktPndvcmQpOworCWlmIChiTGlua1VwICYmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSkKKwl7CisJCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS53b3JkID0gcEh0UGh5LT53b3JkOworCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NYXhIVFBoeU1vZGUud29yZCA9IHBNYXhIdFBoeS0+d29yZDsKKwkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTWluSFRQaHlNb2RlLndvcmQgPSBwTWluSHRQaHktPndvcmQ7CisJfQorCWVsc2UKKwl7CisJCXN3aXRjaCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSkKKwkJeworCQkJY2FzZSBQSFlfMTFCR19NSVhFRDoKKwkJCWNhc2UgUEhZXzExQjoKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCWNhc2UgUEhZXzExQkdOX01JWEVEOgorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV8xOworCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IFJBVEVfMTsKKworLy8jaWZkZWYJV0lGSV9URVNUCisJCQkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfMTE7CisvLyNlbHNlCisvLwkJCQlwQWQtPkNvbW1vbkNmZy5SdHNSYXRlID0gUkFURV8xOworLy8jZW5kaWYKKwkJCQlicmVhazsKKwkJCWNhc2UgUEhZXzExRzoKKwkJCWNhc2UgUEhZXzExQToKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCWNhc2UgUEhZXzExQUdOX01JWEVEOgorCQkJY2FzZSBQSFlfMTFHTl9NSVhFRDoKKwkJCWNhc2UgUEhZXzExTl8yXzRHOgorCQkJY2FzZSBQSFlfMTFBTl9NSVhFRDoKKwkJCWNhc2UgUEhZXzExTl81RzoKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IFJBVEVfNjsKKwkJCQlwQWQtPkNvbW1vbkNmZy5SdHNSYXRlID0gUkFURV82OworCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07CisJCQkJYnJlYWs7CisJCQljYXNlIFBIWV8xMUFCR19NSVhFRDoKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCWNhc2UgUEhZXzExQUJHTl9NSVhFRDoKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA8PSAxNCkKKwkJCQl7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV8xOworCQkJCQlwQWQtPkNvbW1vbkNmZy5SdHNSYXRlID0gUkFURV8xOworCQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gUkFURV8xOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IFJBVEVfNjsKKwkJCQkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfNjsKKwkJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07CisJCQkJfQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDogLy8gZXJyb3IKKwkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IFJBVEVfNjsKKyAgICAgICAgICAgICAgICAgICAgICAgIAlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBSQVRFXzE7CisJCQkJYnJlYWs7CisJCX0KKwkJLy8KKwkJLy8gS2VlcCBCYXNpYyBNbG1lIFJhdGUuCisJCS8vCisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbTUNBU1RfV0NJRF0uSFRQaHlNb2RlLndvcmQgPSBwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQud29yZDsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID09IE1PREVfT0ZETSkKKwkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbTUNBU1RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW1JBVEVfMjRdOworCQllbHNlCisJCQlwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBSQVRFXzE7CisJCXBBZC0+Q29tbW9uQ2ZnLkJhc2ljTWxtZVJhdGUgPSBwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgTWxtZVVwZGF0ZVR4UmF0ZXMgKE1heERlc2lyZT0lZCwgTWF4U3VwcG9ydD0lZCwgTWF4VHhSYXRlPSVkLCBNaW5SYXRlPSVkLCBSYXRlIFN3aXRjaGluZyA9JWQpXG4iLAorCQkJIFJhdGVJZFRvTWJwc1tNYXhEZXNpcmVdLCBSYXRlSWRUb01icHNbTWF4U3VwcG9ydF0sIFJhdGVJZFRvTWJwc1twQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGVdLCBSYXRlSWRUb01icHNbcEFkLT5Db21tb25DZmcuTWluVHhSYXRlXSwKKwkJCSAvKk9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCkqLyphdXRvX3JhdGVfY3VyX3ApKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgTWxtZVVwZGF0ZVR4UmF0ZXMgKFR4UmF0ZT0lZCwgUnRzUmF0ZT0lZCwgQmFzaWNSYXRlQml0bWFwPTB4JTA0bHgpXG4iLAorCQkJIFJhdGVJZFRvTWJwc1twQWQtPkNvbW1vbkNmZy5UeFJhdGVdLCBSYXRlSWRUb01icHNbcEFkLT5Db21tb25DZmcuUnRzUmF0ZV0sIEJhc2ljUmF0ZUJpdG1hcCkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVVcGRhdGVUeFJhdGVzIChNbG1lVHJhbnNtaXQ9MHgleCwgTWluSFRQaHlNb2RlPSV4LCBNYXhIVFBoeU1vZGU9MHgleCwgSFRQaHlNb2RlPTB4JXgpXG4iLAorCQkJIHBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC53b3JkLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1pbkhUUGh5TW9kZS53b3JkICxwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1heEhUUGh5TW9kZS53b3JkICxwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS53b3JkICkpOworfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoaXMgZnVuY3Rpb24gdXBkYXRlIEhUIFJhdGUgc2V0dGluZy4KKwkJSW5wdXQgV2NpZCB2YWx1ZSBpcyB2YWxpZCBmb3IgMiBjYXNlIDoKKwkJMS4gaXQncyB1c2VkIGZvciBTdGF0aW9uIGluIGluZnJhIG1vZGUgdGhhdCBjb3B5IEFQIHJhdGUgdG8gTWFjdGFibGUuCisJCTIuIE9SIFN0YXRpb24gCWluIGFkaG9jIG1vZGUgdG8gY29weSBwZWVyJ3MgSFQgcmF0ZSB0byBNYWN0YWJsZS4KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lVXBkYXRlSHRUeFJhdGVzKAorCUlOIFBSVE1QX0FEQVBURVIgCQlwQWQsCisJSU4JVUNIQVIJCQkJYXBpZHgpCit7CisJVUNIQVIJU3RiY01jczsgLy9qLCBTdGJjTWNzLCBiaXRtYXNrOworCUNIQVIgCWk7IC8vIDMqMworCVJUX0hUX0NBUEFCSUxJVFkgCSpwUnRIdENhcCA9IE5VTEw7CisJUlRfSFRfUEhZX0lORk8JCSpwQWN0aXZlSHRQaHkgPSBOVUxMOworCVVMT05HCQlCYXNpY01DUzsKKwlVQ0hBUiBqLCBiaXRtYXNrOworCVBSVF9IVF9QSFlfSU5GTwkJCXBEZXNpcmVIdFBoeSA9IE5VTEw7CisJUEhUVFJBTlNNSVRfU0VUVElORwkJcEh0UGh5ID0gTlVMTDsKKwlQSFRUUkFOU01JVF9TRVRUSU5HCQlwTWF4SHRQaHkgPSBOVUxMOworCVBIVFRSQU5TTUlUX1NFVFRJTkcJCXBNaW5IdFBoeSA9IE5VTEw7CisJQk9PTEVBTiAJCQkJKmF1dG9fcmF0ZV9jdXJfcDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiTWxtZVVwZGF0ZUh0VHhSYXRlcz09PT4gXG4iKSk7CisKKwlhdXRvX3JhdGVfY3VyX3AgPSBOVUxMOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCXBEZXNpcmVIdFBoeQk9ICZwQWQtPlN0YUNmZy5EZXNpcmVkSHRQaHlJbmZvOworCQlwQWN0aXZlSHRQaHkJPSAmcEFkLT5TdGFDZmcuRGVzaXJlZEh0UGh5SW5mbzsKKwkJcEh0UGh5IAkJPSAmcEFkLT5TdGFDZmcuSFRQaHlNb2RlOworCQlwTWF4SHRQaHkJPSAmcEFkLT5TdGFDZmcuTWF4SFRQaHlNb2RlOworCQlwTWluSHRQaHkJPSAmcEFkLT5TdGFDZmcuTWluSFRQaHlNb2RlOworCisJCWF1dG9fcmF0ZV9jdXJfcCA9ICZwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaDsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlpZiAoKEFESE9DX09OKHBBZCkgfHwgSU5GUkFfT04ocEFkKSkgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKQorCXsKKwkJaWYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IEZBTFNFKQorCQkJcmV0dXJuOworCisJCXBSdEh0Q2FwID0gJnBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5OworCQlwQWN0aXZlSHRQaHkgPSAmcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mbzsKKwkJU3RiY01jcyA9IChVQ0hBUilwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzMuU3RiY01jczsKKwkJQmFzaWNNQ1MgPXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uTUNTU2V0WzBdKyhwQWQtPk1sbWVBdXguQWRkSHRJbmZvLk1DU1NldFsxXTw8OCkrKFN0YmNNY3M8PDE2KTsKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSAmJiAocFJ0SHRDYXAtPlJ4U1RCQykgJiYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikpCisJCQlwTWF4SHRQaHktPmZpZWxkLlNUQkMgPSBTVEJDX1VTRTsKKwkJZWxzZQorCQkJcE1heEh0UGh5LT5maWVsZC5TVEJDID0gU1RCQ19OT05FOworCX0KKwllbHNlCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJeworCQlpZiAocERlc2lyZUh0UGh5LT5iSHRFbmFibGUgPT0gRkFMU0UpCisJCQlyZXR1cm47CisKKwkJcFJ0SHRDYXAgPSAmcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5OworCQlTdGJjTWNzID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8zLlN0YmNNY3M7CisJCUJhc2ljTUNTID0gcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLk1DU1NldFswXSsocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLk1DU1NldFsxXTw8OCkrKFN0YmNNY3M8PDE2KTsKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSAmJiAocFJ0SHRDYXAtPlJ4U1RCQykgJiYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikpCisJCQlwTWF4SHRQaHktPmZpZWxkLlNUQkMgPSBTVEJDX1VTRTsKKwkJZWxzZQorCQkJcE1heEh0UGh5LT5maWVsZC5TVEJDID0gU1RCQ19OT05FOworCX0KKworCS8vIERlY2lkZSBNQVggaHQgcmF0ZS4KKwlpZiAoKHBSdEh0Q2FwLT5HRikgJiYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRikpCisJCXBNYXhIdFBoeS0+ZmllbGQuTU9ERSA9IE1PREVfSFRHUkVFTkZJRUxEOworCWVsc2UKKwkJcE1heEh0UGh5LT5maWVsZC5NT0RFID0gTU9ERV9IVE1JWDsKKworICAgIGlmICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCkgJiYgKHBSdEh0Q2FwLT5DaGFubmVsV2lkdGgpKQorCQlwTWF4SHRQaHktPmZpZWxkLkJXID0gQldfNDA7CisJZWxzZQorCQlwTWF4SHRQaHktPmZpZWxkLkJXID0gQldfMjA7CisKKyAgICBpZiAocE1heEh0UGh5LT5maWVsZC5CVyA9PSBCV18yMCkKKwkJcE1heEh0UGh5LT5maWVsZC5TaG9ydEdJID0gKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yMjAgJiBwUnRIdENhcC0+U2hvcnRHSWZvcjIwKTsKKwllbHNlCisJCXBNYXhIdFBoeS0+ZmllbGQuU2hvcnRHSSA9IChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjQwICYgcFJ0SHRDYXAtPlNob3J0R0lmb3I0MCk7CisKKwlmb3IgKGk9MjM7IGk+PTA7IGktLSkgLy8gMyozCisJeworCQlqID0gaS84OworCQliaXRtYXNrID0gKDE8PChpLShqKjgpKSk7CisKKwkJaWYgKChwQWN0aXZlSHRQaHktPk1DU1NldFtqXSAmIGJpdG1hc2spICYmIChwRGVzaXJlSHRQaHktPk1DU1NldFtqXSAmIGJpdG1hc2spKQorCQl7CisJCQlwTWF4SHRQaHktPmZpZWxkLk1DUyA9IGk7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChpPT0wKQorCQkJYnJlYWs7CisJfQorCisJLy8gQ29weSBNSU4gaHQgcmF0ZS4gIHJ0Mjg2MD8/PworCXBNaW5IdFBoeS0+ZmllbGQuQlcgPSBCV18yMDsKKwlwTWluSHRQaHktPmZpZWxkLk1DUyA9IDA7CisJcE1pbkh0UGh5LT5maWVsZC5TVEJDID0gMDsKKwlwTWluSHRQaHktPmZpZWxkLlNob3J0R0kgPSAwOworCS8vSWYgU1RBIGFzc2lnbnMgZml4ZWQgcmF0ZS4gdXBkYXRlIHRvIGZpeGVkIGhlcmUuCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJaWYgKCAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYgKHBEZXNpcmVIdFBoeS0+TUNTU2V0WzBdICE9IDB4ZmYpKQorCXsKKwkJaWYgKHBEZXNpcmVIdFBoeS0+TUNTU2V0WzRdICE9IDApCisJCXsKKwkJCXBNYXhIdFBoeS0+ZmllbGQuTUNTID0gMzI7CisJCQlwTWluSHRQaHktPmZpZWxkLk1DUyA9IDMyOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJNbG1lVXBkYXRlSHRUeFJhdGVzPD09PSBVc2UgRml4ZWQgTUNTID0gJWRcbiIscE1pbkh0UGh5LT5maWVsZC5NQ1MpKTsKKwkJfQorCisJCWZvciAoaT0yMzsgKENIQVIpaSA+PSAwOyBpLS0pIC8vIDMqMworCQl7CisJCQlqID0gaS84OworCQkJYml0bWFzayA9ICgxPDwoaS0oaio4KSkpOworCQkJaWYgKCAocERlc2lyZUh0UGh5LT5NQ1NTZXRbal0gJiBiaXRtYXNrKSAmJiAocEFjdGl2ZUh0UGh5LT5NQ1NTZXRbal0gJiBiaXRtYXNrKSkKKwkJCXsKKwkJCQlwTWF4SHRQaHktPmZpZWxkLk1DUyA9IGk7CisJCQkJcE1pbkh0UGh5LT5maWVsZC5NQ1MgPSBpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGk9PTApCisJCQkJYnJlYWs7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworCS8vIERlY2lkZSBodCByYXRlCisJcEh0UGh5LT5maWVsZC5TVEJDID0gcE1heEh0UGh5LT5maWVsZC5TVEJDOworCXBIdFBoeS0+ZmllbGQuQlcgPSBwTWF4SHRQaHktPmZpZWxkLkJXOworCXBIdFBoeS0+ZmllbGQuTU9ERSA9IHBNYXhIdFBoeS0+ZmllbGQuTU9ERTsKKwlwSHRQaHktPmZpZWxkLk1DUyA9IHBNYXhIdFBoeS0+ZmllbGQuTUNTOworCXBIdFBoeS0+ZmllbGQuU2hvcnRHSSA9IHBNYXhIdFBoeS0+ZmllbGQuU2hvcnRHSTsKKworCS8vIHVzZSBkZWZhdWx0IG5vdy4gcnQyODYwCisJaWYgKHBEZXNpcmVIdFBoeS0+TUNTU2V0WzBdICE9IDB4ZmYpCisJCSphdXRvX3JhdGVfY3VyX3AgPSBGQUxTRTsKKwllbHNlCisJCSphdXRvX3JhdGVfY3VyX3AgPSBUUlVFOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIE1sbWVVcGRhdGVIdFR4UmF0ZXM8LS0tLkFNc2R1U2l6ZSA9ICVkICBcbiIsIHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemUgKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJUWDogTUNTWzBdID0gJXggKGNob29zZSAlZCksIEJXID0gJWQsIFNob3J0R0kgPSAlZCwgTU9ERSA9ICVkLCAgXG4iLCBwQWN0aXZlSHRQaHktPk1DU1NldFswXSxwSHRQaHktPmZpZWxkLk1DUywKKwkJcEh0UGh5LT5maWVsZC5CVywgcEh0UGh5LT5maWVsZC5TaG9ydEdJLCBwSHRQaHktPmZpZWxkLk1PREUpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIk1sbWVVcGRhdGVIdFR4UmF0ZXM8PT09IFxuIikpOworfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQgTWxtZVJhZGlvT2ZmKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVJUMjhYWF9NTE1FX1JBRElPX09GRihwQWQpOworfQorCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQgTWxtZVJhZGlvT24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJUlQyOFhYX01MTUVfUkFESU9fT04ocEFkKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gYnNzX3RhYmxlLmMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisvKiEgXGJyaWVmIGluaXRpYWxpemUgQlNTIHRhYmxlCisgKglccGFyYW0gcF90YWIgcG9pbnRlciB0byB0aGUgdGFibGUKKyAqCVxyZXR1cm4gbm9uZQorICoJXHByZQorICoJXHBvc3QKKworIElSUUwgPSBQQVNTSVZFX0xFVkVMCisgSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAqLworVk9JRCBCc3NUYWJsZUluaXQoCisJSU4gQlNTX1RBQkxFICpUYWIpCit7CisJaW50IGk7CisKKwlUYWItPkJzc05yID0gMDsKKyAgICBUYWItPkJzc092ZXJsYXBOciA9IDA7CisJZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfQlNTX1RBQkxFOyBpKyspCisJeworCQlOZGlzWmVyb01lbW9yeSgmVGFiLT5Cc3NFbnRyeVtpXSwgc2l6ZW9mKEJTU19FTlRSWSkpOworCQlUYWItPkJzc0VudHJ5W2ldLlJzc2kgPSAtMTI3OwkvLyBpbml0aWFsIHRoZSByc3NpIGFzIGEgbWluaW11bSB2YWx1ZQorCX0KK30KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVk9JRCBCQVRhYmxlSW5pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBCQV9UQUJMRSAqVGFiKQoreworCWludCBpOworCisJVGFiLT5udW1Bc09yaWdpbmF0b3IgPSAwOworCVRhYi0+bnVtQXNSZWNpcGllbnQgPSAwOworCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisJZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFOyBpKyspCisJeworCQlUYWItPkJBUmVjRW50cnlbaV0uUkVDX0JBX1N0YXR1cyA9IFJlY2lwaWVudF9OT05FOworCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmKFRhYi0+QkFSZWNFbnRyeVtpXS5SeFJlUmluZ0xvY2spKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFOyBpKyspCisJeworCQlUYWItPkJBT3JpRW50cnlbaV0uT1JJX0JBX1N0YXR1cyA9IE9yaWdpbmF0b3JfTk9ORTsKKwl9Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKy8qISBcYnJpZWYgc2VhcmNoIHRoZSBCU1MgdGFibGUgYnkgU1NJRAorICoJXHBhcmFtIHBfdGFiIHBvaW50ZXIgdG8gdGhlIGJzcyB0YWJsZQorICoJXHBhcmFtIHNzaWQgU1NJRCBzdHJpbmcKKyAqCVxyZXR1cm4gaW5kZXggb2YgdGhlIHRhYmxlLCBCU1NfTk9UX0ZPVU5EIGlmIG5vdCBpbiB0aGUgdGFibGUKKyAqCVxwcmUKKyAqCVxwb3N0CisgKglcbm90ZSBzZWFyY2ggYnkgc2VxdWVudGlhbCBzZWFyY2gKKworIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKi8KK1VMT05HIEJzc1RhYmxlU2VhcmNoKAorCUlOIEJTU19UQUJMRSAqVGFiLAorCUlOIFBVQ0hBUgkgcEJzc2lkLAorCUlOIFVDSEFSCSBDaGFubmVsKQoreworCVVDSEFSIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVGFiLT5Cc3NOcjsgaSsrKQorCXsKKwkJLy8KKwkJLy8gU29tZSBBUCB0aGF0IHN1cHBvcnQgQS9CL0cgbW9kZSB0aGF0IG1heSB1c2VkIHRoZSBzYW1lIEJTU0lEIG9uIDExQSBhbmQgMTFCL0cuCisJCS8vIFdlIHNob3VsZCBkaXN0aW5ndWlzaCB0aGlzIGNhc2UuCisJCS8vCisJCWlmICgoKChUYWItPkJzc0VudHJ5W2ldLkNoYW5uZWwgPD0gMTQpICYmIChDaGFubmVsIDw9IDE0KSkgfHwKKwkJCSAoKFRhYi0+QnNzRW50cnlbaV0uQ2hhbm5lbCA+IDE0KSAmJiAoQ2hhbm5lbCA+IDE0KSkpICYmCisJCQlNQUNfQUREUl9FUVVBTChUYWItPkJzc0VudHJ5W2ldLkJzc2lkLCBwQnNzaWQpKQorCQl7CisJCQlyZXR1cm4gaTsKKwkJfQorCX0KKwlyZXR1cm4gKFVMT05HKUJTU19OT1RfRk9VTkQ7Cit9CisKK1VMT05HIEJzc1NzaWRUYWJsZVNlYXJjaCgKKwlJTiBCU1NfVEFCTEUgKlRhYiwKKwlJTiBQVUNIQVIJIHBCc3NpZCwKKwlJTiBQVUNIQVIJIHBTc2lkLAorCUlOIFVDSEFSCSBTc2lkTGVuLAorCUlOIFVDSEFSCSBDaGFubmVsKQoreworCVVDSEFSIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVGFiLT5Cc3NOcjsgaSsrKQorCXsKKwkJLy8KKwkJLy8gU29tZSBBUCB0aGF0IHN1cHBvcnQgQS9CL0cgbW9kZSB0aGF0IG1heSB1c2VkIHRoZSBzYW1lIEJTU0lEIG9uIDExQSBhbmQgMTFCL0cuCisJCS8vIFdlIHNob3VsZCBkaXN0aW5ndWlzaCB0aGlzIGNhc2UuCisJCS8vCisJCWlmICgoKChUYWItPkJzc0VudHJ5W2ldLkNoYW5uZWwgPD0gMTQpICYmIChDaGFubmVsIDw9IDE0KSkgfHwKKwkJCSAoKFRhYi0+QnNzRW50cnlbaV0uQ2hhbm5lbCA+IDE0KSAmJiAoQ2hhbm5lbCA+IDE0KSkpICYmCisJCQlNQUNfQUREUl9FUVVBTChUYWItPkJzc0VudHJ5W2ldLkJzc2lkLCBwQnNzaWQpICYmCisJCQlTU0lEX0VRVUFMKHBTc2lkLCBTc2lkTGVuLCBUYWItPkJzc0VudHJ5W2ldLlNzaWQsIFRhYi0+QnNzRW50cnlbaV0uU3NpZExlbikpCisJCXsKKwkJCXJldHVybiBpOworCQl9CisJfQorCXJldHVybiAoVUxPTkcpQlNTX05PVF9GT1VORDsKK30KKworVUxPTkcgQnNzVGFibGVTZWFyY2hXaXRoU1NJRCgKKwlJTiBCU1NfVEFCTEUgKlRhYiwKKwlJTiBQVUNIQVIJIEJzc2lkLAorCUlOIFBVQ0hBUgkgcFNzaWQsCisJSU4gVUNIQVIJIFNzaWRMZW4sCisJSU4gVUNIQVIJIENoYW5uZWwpCit7CisJVUNIQVIgaTsKKworCWZvciAoaSA9IDA7IGkgPCBUYWItPkJzc05yOyBpKyspCisJeworCQlpZiAoKCgoVGFiLT5Cc3NFbnRyeVtpXS5DaGFubmVsIDw9IDE0KSAmJiAoQ2hhbm5lbCA8PSAxNCkpIHx8CisJCQkoKFRhYi0+QnNzRW50cnlbaV0uQ2hhbm5lbCA+IDE0KSAmJiAoQ2hhbm5lbCA+IDE0KSkpICYmCisJCQlNQUNfQUREUl9FUVVBTCgmKFRhYi0+QnNzRW50cnlbaV0uQnNzaWQpLCBCc3NpZCkgJiYKKwkJCShTU0lEX0VRVUFMKHBTc2lkLCBTc2lkTGVuLCBUYWItPkJzc0VudHJ5W2ldLlNzaWQsIFRhYi0+QnNzRW50cnlbaV0uU3NpZExlbikgfHwKKwkJCShOZGlzRXF1YWxNZW1vcnkocFNzaWQsIFplcm9Tc2lkLCBTc2lkTGVuKSkgfHwKKwkJCShOZGlzRXF1YWxNZW1vcnkoVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkLCBaZXJvU3NpZCwgVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkTGVuKSkpKQorCQl7CisJCQlyZXR1cm4gaTsKKwkJfQorCX0KKwlyZXR1cm4gKFVMT05HKUJTU19OT1RfRk9VTkQ7Cit9CisKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRCBCc3NUYWJsZURlbGV0ZUVudHJ5KAorCUlOIE9VVAlCU1NfVEFCTEUgKlRhYiwKKwlJTgkJUFVDSEFSCSAgcEJzc2lkLAorCUlOCQlVQ0hBUgkgIENoYW5uZWwpCit7CisJVUNIQVIgaSwgajsKKworCWZvciAoaSA9IDA7IGkgPCBUYWItPkJzc05yOyBpKyspCisJeworCQlpZiAoKFRhYi0+QnNzRW50cnlbaV0uQ2hhbm5lbCA9PSBDaGFubmVsKSAmJgorCQkJKE1BQ19BRERSX0VRVUFMKFRhYi0+QnNzRW50cnlbaV0uQnNzaWQsIHBCc3NpZCkpKQorCQl7CisJCQlmb3IgKGogPSBpOyBqIDwgVGFiLT5Cc3NOciAtIDE7IGorKykKKwkJCXsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmKFRhYi0+QnNzRW50cnlbal0pLCAmKFRhYi0+QnNzRW50cnlbaiArIDFdKSwgc2l6ZW9mKEJTU19FTlRSWSkpOworCQkJfQorCQkJTmRpc1plcm9NZW1vcnkoJihUYWItPkJzc0VudHJ5W1RhYi0+QnNzTnIgLSAxXSksIHNpemVvZihCU1NfRU5UUlkpKTsKKwkJCVRhYi0+QnNzTnIgLT0gMTsKKwkJCXJldHVybjsKKwkJfQorCX0KK30KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlEZWxldGUgdGhlIE9yaWdpbmF0b3IgRW50cnkgaW4gQkF0YWJsZS4gT3IgZGVjcmVhc2UgbnVtQXMgT3JpZ2luYXRvciBieSAxIGlmIG5lZWRlZC4KKworCUFyZ3VtZW50czoKKwkvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEJBVGFibGVEZWxldGVPUklFbnRyeSgKKwlJTiBPVVQJUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JCUJBX09SSV9FTlRSWQkqcEJBT1JJRW50cnkpCit7CisKKwlpZiAocEJBT1JJRW50cnktPk9SSV9CQV9TdGF0dXMgIT0gT3JpZ2luYXRvcl9OT05FKQorCXsKKwkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOworCQlpZiAocEJBT1JJRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9Eb25lKQorCQl7CisJCQlwQWQtPkJBVGFibGUubnVtQXNPcmlnaW5hdG9yIC09IDE7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCQVRhYmxlRGVsZXRlT1JJRW50cnkgbnVtQXNPcmlnaW5hdG9yPSAlbGRcbiIsIHBBZC0+QkFUYWJsZS5udW1Bc1JlY2lwaWVudCkpOworCQkJLy8gRXJhc2UgQml0bWFwIGZsYWcuCisJCX0KKwkJcEFkLT5NYWNUYWIuQ29udGVudFtwQkFPUklFbnRyeS0+V2NpZF0uVFhCQWJpdG1hcCAmPSAofigxPDwocEJBT1JJRW50cnktPlRJRCkgKSk7CS8vIElmIFNUQSBtb2RlLCAgZXJhc2UgZmxhZyBoZXJlCisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbcEJBT1JJRW50cnktPldjaWRdLkJBT3JpV2NpZEFycmF5W3BCQU9SSUVudHJ5LT5USURdID0gMDsJLy8gSWYgU1RBIG1vZGUsICBlcmFzZSBmbGFnIGhlcmUKKwkJcEJBT1JJRW50cnktPk9SSV9CQV9TdGF0dXMgPSBPcmlnaW5hdG9yX05PTkU7CisJCXBCQU9SSUVudHJ5LT5Ub2tlbiA9IDE7CisJCS8vIE5vdCBjbGVhciBTZXF1ZW5jZSBoZXJlLgorCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CisJfQorfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisvKiEgXGJyaWVmCisgKglccGFyYW0KKyAqCVxyZXR1cm4KKyAqCVxwcmUKKyAqCVxwb3N0CisKKyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICovCitWT0lEIEJzc0VudHJ5U2V0KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCU9VVCBCU1NfRU5UUlkgKnBCc3MsCisJSU4gUFVDSEFSIHBCc3NpZCwKKwlJTiBDSEFSIFNzaWRbXSwKKwlJTiBVQ0hBUiBTc2lkTGVuLAorCUlOIFVDSEFSIEJzc1R5cGUsCisJSU4gVVNIT1JUIEJlYWNvblBlcmlvZCwKKwlJTiBQQ0ZfUEFSTSBwQ2ZQYXJtLAorCUlOIFVTSE9SVCBBdGltV2luLAorCUlOIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKKwlJTiBVQ0hBUiBTdXBSYXRlW10sCisJSU4gVUNIQVIgU3VwUmF0ZUxlbiwKKwlJTiBVQ0hBUiBFeHRSYXRlW10sCisJSU4gVUNIQVIgRXh0UmF0ZUxlbiwKKwlJTiBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAorCUlOIEFERF9IVF9JTkZPX0lFICpwQWRkSHRJbmZvLAkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKwlJTiBVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbiwKKwlJTiBVQ0hBUgkJCUFkZEh0SW5mb0xlbiwKKwlJTiBVQ0hBUgkJCU5ld0V4dENoYW5PZmZzZXQsCisJSU4gVUNIQVIgQ2hhbm5lbCwKKwlJTiBDSEFSIFJzc2ksCisJSU4gTEFSR0VfSU5URUdFUiBUaW1lU3RhbXAsCisJSU4gVUNIQVIgQ2tpcEZsYWcsCisJSU4gUEVEQ0FfUEFSTSBwRWRjYVBhcm0sCisJSU4gUFFPU19DQVBBQklMSVRZX1BBUk0gcFFvc0NhcGFiaWxpdHksCisJSU4gUFFCU1NfTE9BRF9QQVJNIHBRYnNzTG9hZCwKKwlJTiBVU0hPUlQgTGVuZ3RoVklFLAorCUlOIFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMgcFZJRSkKK3sKKwlDT1BZX01BQ19BRERSKHBCc3MtPkJzc2lkLCBwQnNzaWQpOworCS8vIERlZmF1bHQgSGlkZGVuIFNTSUQgdG8gYmUgVFJVRSwgaXQgd2lsbCBiZSB0dXJuZWQgdG8gRkFMU0UgYWZ0ZXIgY29waW5nIFNTSUQKKwlwQnNzLT5IaWRkZW4gPSAxOworCWlmIChTc2lkTGVuID4gMCkKKwl7CisJCS8vIEZvciBoaWRkZW4gU1NJRCBBUCwgaXQgbWlnaHQgc2VuZCBiZWFjb24gd2l0aCBTU0lEIGxlbiBlcXVhbCB0byAwCisJCS8vIE9yIHNlbmQgYmVhY29uIC9wcm9iZSByZXNwb25zZSB3aXRoIFNTSUQgbGVuIG1hdGNoaW5nIHJlYWwgU1NJRCBsZW5ndGgsCisJCS8vIGJ1dCBTU0lEIGlzIGFsbCB6ZXJvLiBzdWNoIGFzICIwMC0wMC0wMC0wMCIgd2l0aCBsZW5ndGggNC4KKwkJLy8gV2UgaGF2ZSB0byBwcmV2ZW50IHRoaXMgY2FzZSBvdmVyd3JpdGUgY29ycmVjdCB0YWJsZQorCQlpZiAoTmRpc0VxdWFsTWVtb3J5KFNzaWQsIFplcm9Tc2lkLCBTc2lkTGVuKSA9PSAwKQorCQl7CisJCSAgICBOZGlzWmVyb01lbW9yeShwQnNzLT5Tc2lkLCBNQVhfTEVOX09GX1NTSUQpOworCQkJTmRpc01vdmVNZW1vcnkocEJzcy0+U3NpZCwgU3NpZCwgU3NpZExlbik7CisJCQlwQnNzLT5Tc2lkTGVuID0gU3NpZExlbjsKKwkJCXBCc3MtPkhpZGRlbiA9IDA7CisJCX0KKwl9CisJZWxzZQorCQlwQnNzLT5Tc2lkTGVuID0gMDsKKwlwQnNzLT5Cc3NUeXBlID0gQnNzVHlwZTsKKwlwQnNzLT5CZWFjb25QZXJpb2QgPSBCZWFjb25QZXJpb2Q7CisJaWYgKEJzc1R5cGUgPT0gQlNTX0lORlJBKQorCXsKKwkJaWYgKHBDZlBhcm0tPmJWYWxpZCkKKwkJeworCQkJcEJzcy0+Q2ZwQ291bnQgPSBwQ2ZQYXJtLT5DZnBDb3VudDsKKwkJCXBCc3MtPkNmcFBlcmlvZCA9IHBDZlBhcm0tPkNmcFBlcmlvZDsKKwkJCXBCc3MtPkNmcE1heER1cmF0aW9uID0gcENmUGFybS0+Q2ZwTWF4RHVyYXRpb247CisJCQlwQnNzLT5DZnBEdXJSZW1haW5pbmcgPSBwQ2ZQYXJtLT5DZnBEdXJSZW1haW5pbmc7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcEJzcy0+QXRpbVdpbiA9IEF0aW1XaW47CisJfQorCisJcEJzcy0+Q2FwYWJpbGl0eUluZm8gPSBDYXBhYmlsaXR5SW5mbzsKKwkvLyBUaGUgcHJpdmFjeSBiaXQgaW5kaWNhdGUgc2VjdXJpdHkgaXMgT04sIGl0IG1haWdodCBiZSBXRVAsIFRLSVAgb3IgQUVTCisJLy8gQ29tYmluZSB3aXRoIEF1dGhNb2RlLCB0aGV5IHdpbGwgZGVjaWRlIHRoZSBjb25uZWN0aW9uIG1ldGhvZHMuCisJcEJzcy0+UHJpdmFjeSA9IENBUF9JU19QUklWQUNZX09OKHBCc3MtPkNhcGFiaWxpdHlJbmZvKTsKKwlBU1NFUlQoU3VwUmF0ZUxlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisJaWYgKFN1cFJhdGVMZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpCisJCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPlN1cFJhdGUsIFN1cFJhdGUsIFN1cFJhdGVMZW4pOworCWVsc2UKKwkJTmRpc01vdmVNZW1vcnkocEJzcy0+U3VwUmF0ZSwgU3VwUmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOworCXBCc3MtPlN1cFJhdGVMZW4gPSBTdXBSYXRlTGVuOworCUFTU0VSVChFeHRSYXRlTGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKwlOZGlzTW92ZU1lbW9yeShwQnNzLT5FeHRSYXRlLCBFeHRSYXRlLCBFeHRSYXRlTGVuKTsKKwlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+SHRDYXBhYmlsaXR5LCBwSHRDYXBhYmlsaXR5LCBIdENhcGFiaWxpdHlMZW4pOworCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5BZGRIdEluZm8sIHBBZGRIdEluZm8sIEFkZEh0SW5mb0xlbik7CisJcEJzcy0+TmV3RXh0Q2hhbk9mZnNldCA9IE5ld0V4dENoYW5PZmZzZXQ7CisJcEJzcy0+RXh0UmF0ZUxlbiA9IEV4dFJhdGVMZW47CisJcEJzcy0+Q2hhbm5lbCA9IENoYW5uZWw7CisJcEJzcy0+Q2VudHJhbENoYW5uZWwgPSBDaGFubmVsOworCXBCc3MtPlJzc2kgPSBSc3NpOworCS8vIFVwZGF0ZSBDa2lwRmxhZy4gaWYgbm90IGV4aXN0cywgdGhlIHZhbHVlIGlzIDB4MAorCXBCc3MtPkNraXBGbGFnID0gQ2tpcEZsYWc7CisKKwkvLyBOZXcgZm9yIG1pY3Jvc29mdCBGaXhlZCBJRXMKKwlOZGlzTW92ZU1lbW9yeShwQnNzLT5GaXhJRXMuVGltZXN0YW1wLCAmVGltZVN0YW1wLCA4KTsKKwlwQnNzLT5GaXhJRXMuQmVhY29uSW50ZXJ2YWwgPSBCZWFjb25QZXJpb2Q7CisJcEJzcy0+Rml4SUVzLkNhcGFiaWxpdGllcyA9IENhcGFiaWxpdHlJbmZvOworCisJLy8gTmV3IGZvciBtaWNyb3NvZnQgVmFyaWFibGUgSUVzCisJaWYgKExlbmd0aFZJRSAhPSAwKQorCXsKKwkJcEJzcy0+VmFySUVMZW4gPSBMZW5ndGhWSUU7CisJCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPlZhcklFcywgcFZJRSwgcEJzcy0+VmFySUVMZW4pOworCX0KKwllbHNlCisJeworCQlwQnNzLT5WYXJJRUxlbiA9IDA7CisJfQorCisJcEJzcy0+QWRkSHRJbmZvTGVuID0gMDsKKwlwQnNzLT5IdENhcGFiaWxpdHlMZW4gPSAwOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmIChIdENhcGFiaWxpdHlMZW4+IDApCisJeworCQlwQnNzLT5IdENhcGFiaWxpdHlMZW4gPSBIdENhcGFiaWxpdHlMZW47CisJCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5IdENhcGFiaWxpdHksIHBIdENhcGFiaWxpdHksIEh0Q2FwYWJpbGl0eUxlbik7CisJCWlmIChBZGRIdEluZm9MZW4gPiAwKQorCQl7CisJCQlwQnNzLT5BZGRIdEluZm9MZW4gPSBBZGRIdEluZm9MZW47CisJCQlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+QWRkSHRJbmZvLCBwQWRkSHRJbmZvLCBBZGRIdEluZm9MZW4pOworCisJIAkJCWlmICgocEFkZEh0SW5mby0+Q29udHJvbENoYW4gPiAyKSYmIChwQWRkSHRJbmZvLT5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9PSBFWFRDSEFfQkVMT1cpICYmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKKwkgCQkJeworCSAJCQkJcEJzcy0+Q2VudHJhbENoYW5uZWwgPSBwQWRkSHRJbmZvLT5Db250cm9sQ2hhbiAtIDI7CisJIAkJCX0KKwkgCQkJZWxzZSBpZiAoKHBBZGRIdEluZm8tPkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID09IEVYVENIQV9BQk9WRSkgJiYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQorCQkJCXsKKwkJIAkJCQlwQnNzLT5DZW50cmFsQ2hhbm5lbCA9IHBBZGRIdEluZm8tPkNvbnRyb2xDaGFuICsgMjsKKwkJCQl9CisJCX0KKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlCc3NDaXBoZXJQYXJzZShwQnNzKTsKKworCS8vIG5ldyBmb3IgUU9TCisJaWYgKHBFZGNhUGFybSkKKwkJTmRpc01vdmVNZW1vcnkoJnBCc3MtPkVkY2FQYXJtLCBwRWRjYVBhcm0sIHNpemVvZihFRENBX1BBUk0pKTsKKwllbHNlCisJCXBCc3MtPkVkY2FQYXJtLmJWYWxpZCA9IEZBTFNFOworCWlmIChwUW9zQ2FwYWJpbGl0eSkKKwkJTmRpc01vdmVNZW1vcnkoJnBCc3MtPlFvc0NhcGFiaWxpdHksIHBRb3NDYXBhYmlsaXR5LCBzaXplb2YoUU9TX0NBUEFCSUxJVFlfUEFSTSkpOworCWVsc2UKKwkJcEJzcy0+UW9zQ2FwYWJpbGl0eS5iVmFsaWQgPSBGQUxTRTsKKwlpZiAocFFic3NMb2FkKQorCQlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+UWJzc0xvYWQsIHBRYnNzTG9hZCwgc2l6ZW9mKFFCU1NfTE9BRF9QQVJNKSk7CisJZWxzZQorCQlwQnNzLT5RYnNzTG9hZC5iVmFsaWQgPSBGQUxTRTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlQRUlEX1NUUlVDVCAgICAgcEVpZDsKKwkJVVNIT1JUICAgICAgICAgIExlbmd0aCA9IDA7CisKKworCQlOZGlzWmVyb01lbW9yeSgmcEJzcy0+V3BhSUUuSUVbMF0sIE1BWF9DVVNUT01fTEVOKTsKKwkJTmRpc1plcm9NZW1vcnkoJnBCc3MtPlJzbklFLklFWzBdLCBNQVhfQ1VTVE9NX0xFTik7CisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCQlOZGlzWmVyb01lbW9yeSgmcEJzcy0+Q291bnRyeVN0cmluZ1swXSwgMyk7CisJCXBCc3MtPmJIYXNDb3VudHJ5SUUgPSBGQUxTRTsKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisJCXBFaWQgPSAoUEVJRF9TVFJVQ1QpIHBWSUU7CisJCXdoaWxlICgoTGVuZ3RoICsgMiArIChVU0hPUlQpcEVpZC0+TGVuKSA8PSBMZW5ndGhWSUUpCisJCXsKKwkJCXN3aXRjaChwRWlkLT5FaWQpCisJCQl7CisJCQkJY2FzZSBJRV9XUEE6CisJCQkJCWlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdQQV9PVUksIDQpKQorCQkJCQl7CisJCQkJCQlpZiAoKHBFaWQtPkxlbiArIDIpID4gTUFYX0NVU1RPTV9MRU4pCisJCQkJCQl7CisJCQkJCQkJcEJzcy0+V3BhSUUuSUVMZW4gPSAwOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJcEJzcy0+V3BhSUUuSUVMZW4gPSBwRWlkLT5MZW4gKyAyOworCQkJCQkJTmRpc01vdmVNZW1vcnkocEJzcy0+V3BhSUUuSUUsIHBFaWQsIHBCc3MtPldwYUlFLklFTGVuKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIElFX1JTTjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCArIDIsIFJTTl9PVUksIDMpKQorCQkJCQl7CisJCQkJCQlpZiAoKHBFaWQtPkxlbiArIDIpID4gTUFYX0NVU1RPTV9MRU4pCisJCQkJCQl7CisJCQkJCQkJcEJzcy0+UnNuSUUuSUVMZW4gPSAwOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJcEJzcy0+UnNuSUUuSUVMZW4gPSBwRWlkLT5MZW4gKyAyOworCQkJCQkJTmRpc01vdmVNZW1vcnkocEJzcy0+UnNuSUUuSUUsIHBFaWQsIHBCc3MtPlJzbklFLklFTGVuKTsKKwkJCX0KKwkJCQlicmVhazsKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJCQkJY2FzZSBJRV9DT1VOVFJZOgorCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+Q291bnRyeVN0cmluZ1swXSwgcEVpZC0+T2N0ZXQsIDMpOworCQkJCQlwQnNzLT5iSGFzQ291bnRyeUlFID0gVFJVRTsKKwkJCQkJYnJlYWs7CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworICAgICAgICAgICAgfQorCQkJTGVuZ3RoID0gTGVuZ3RoICsgMiArIChVU0hPUlQpcEVpZC0+TGVuOyAgLy8gRWlkWzFdICsgTGVuWzFdKyBjb250ZW50W0xlbl0KKwkJCXBFaWQgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopcEVpZCArIDIgKyBwRWlkLT5MZW4pOworCQl9CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworfQorCisvKiEKKyAqCVxicmllZiBpbnNlcnQgYW4gZW50cnkgaW50byB0aGUgYnNzIHRhYmxlCisgKglccGFyYW0gcF90YWIgVGhlIEJTUyB0YWJsZQorICoJXHBhcmFtIEJzc2lkIEJTU0lECisgKglccGFyYW0gc3NpZCBTU0lECisgKglccGFyYW0gc3NpZF9sZW4gTGVuZ3RoIG9mIFNTSUQKKyAqCVxwYXJhbSBic3NfdHlwZQorICoJXHBhcmFtIGJlYWNvbl9wZXJpb2QKKyAqCVxwYXJhbSB0aW1lc3RhbXAKKyAqCVxwYXJhbSBwX2NmCisgKglccGFyYW0gYXRpbV93aW4KKyAqCVxwYXJhbSBjYXAKKyAqCVxwYXJhbSByYXRlcworICoJXHBhcmFtIHJhdGVzX2xlbgorICoJXHBhcmFtIGNoYW5uZWxfaWR4CisgKglccmV0dXJuIG5vbmUKKyAqCVxwcmUKKyAqCVxwb3N0CisgKglcbm90ZSBJZiBTU0lEIGlzIGlkZW50aWNhbCwgdGhlIG9sZCBlbnRyeSB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBuZXcgb25lCisKKyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICovCitVTE9ORyBCc3NUYWJsZVNldEVudHJ5KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVCBCU1NfVEFCTEUgKlRhYiwKKwlJTiBQVUNIQVIgcEJzc2lkLAorCUlOIENIQVIgU3NpZFtdLAorCUlOIFVDSEFSIFNzaWRMZW4sCisJSU4gVUNIQVIgQnNzVHlwZSwKKwlJTiBVU0hPUlQgQmVhY29uUGVyaW9kLAorCUlOIENGX1BBUk0gKkNmUGFybSwKKwlJTiBVU0hPUlQgQXRpbVdpbiwKKwlJTiBVU0hPUlQgQ2FwYWJpbGl0eUluZm8sCisJSU4gVUNIQVIgU3VwUmF0ZVtdLAorCUlOIFVDSEFSIFN1cFJhdGVMZW4sCisJSU4gVUNIQVIgRXh0UmF0ZVtdLAorCUlOIFVDSEFSIEV4dFJhdGVMZW4sCisJSU4gSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKKwlJTiBBRERfSFRfSU5GT19JRSAqcEFkZEh0SW5mbywJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCisJSU4gVUNIQVIJCQlIdENhcGFiaWxpdHlMZW4sCisJSU4gVUNIQVIJCQlBZGRIdEluZm9MZW4sCisJSU4gVUNIQVIJCQlOZXdFeHRDaGFuT2Zmc2V0LAorCUlOIFVDSEFSIENoYW5uZWxObywKKwlJTiBDSEFSIFJzc2ksCisJSU4gTEFSR0VfSU5URUdFUiBUaW1lU3RhbXAsCisJSU4gVUNIQVIgQ2tpcEZsYWcsCisJSU4gUEVEQ0FfUEFSTSBwRWRjYVBhcm0sCisJSU4gUFFPU19DQVBBQklMSVRZX1BBUk0gcFFvc0NhcGFiaWxpdHksCisJSU4gUFFCU1NfTE9BRF9QQVJNIHBRYnNzTG9hZCwKKwlJTiBVU0hPUlQgTGVuZ3RoVklFLAorCUlOIFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMgcFZJRSkKK3sKKwlVTE9ORwlJZHg7CisKKwlJZHggPSBCc3NUYWJsZVNlYXJjaFdpdGhTU0lEKFRhYiwgcEJzc2lkLCAgU3NpZCwgU3NpZExlbiwgQ2hhbm5lbE5vKTsKKwlpZiAoSWR4ID09IEJTU19OT1RfRk9VTkQpCisJeworCQlpZiAoVGFiLT5Cc3NOciA+PSBNQVhfTEVOX09GX0JTU19UQUJMRSkKKwkgICAgeworCQkJLy8KKwkJCS8vIEl0IG1heSBoYXBwZW4gd2hlbiBCU1MgVGFibGUgd2FzIGZ1bGwuCisJCQkvLyBUaGUgZGVzaXJlZCBBUCB3aWxsIG5vdCBiZSBhZGRlZCBpbnRvIEJTUyBUYWJsZQorCQkJLy8gSW4gdGhpcyBjYXNlLCBpZiB3ZSBmb3VuZCB0aGUgZGVzaXJlZCBBUCB0aGVuIG92ZXJ3cml0ZSBCU1MgVGFibGUuCisJCQkvLworCQkJaWYoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwkJCXsKKwkJCQlpZiAoTUFDX0FERFJfRVFVQUwocEFkLT5NbG1lQXV4LkJzc2lkLCBwQnNzaWQpIHx8CisJCQkJCVNTSURfRVFVQUwocEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCBTc2lkLCBTc2lkTGVuKSkKKwkJCQl7CisJCQkJCUlkeCA9IFRhYi0+QnNzT3ZlcmxhcE5yOworCQkJCQlCc3NFbnRyeVNldChwQWQsICZUYWItPkJzc0VudHJ5W0lkeF0sIHBCc3NpZCwgU3NpZCwgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLCBDZlBhcm0sIEF0aW1XaW4sCisJCQkJCQlDYXBhYmlsaXR5SW5mbywgU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgRXh0UmF0ZUxlbixwSHRDYXBhYmlsaXR5LCBwQWRkSHRJbmZvLEh0Q2FwYWJpbGl0eUxlbiwgQWRkSHRJbmZvTGVuLAorCQkJCQkJTmV3RXh0Q2hhbk9mZnNldCwgQ2hhbm5lbE5vLCBSc3NpLCBUaW1lU3RhbXAsIENraXBGbGFnLCBwRWRjYVBhcm0sIHBRb3NDYXBhYmlsaXR5LCBwUWJzc0xvYWQsIExlbmd0aFZJRSwgcFZJRSk7CisgICAgICAgICAgICAgICAgICAgIFRhYi0+QnNzT3ZlcmxhcE5yID0gKFRhYi0+QnNzT3ZlcmxhcE5yKyspICUgTUFYX0xFTl9PRl9CU1NfVEFCTEU7CisJCQkJfQorCQkJCXJldHVybiBJZHg7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQlyZXR1cm4gQlNTX05PVF9GT1VORDsKKwkJCX0KKwkJfQorCQlJZHggPSBUYWItPkJzc05yOworCQlCc3NFbnRyeVNldChwQWQsICZUYWItPkJzc0VudHJ5W0lkeF0sIHBCc3NpZCwgU3NpZCwgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLCBDZlBhcm0sIEF0aW1XaW4sCisJCQkJCUNhcGFiaWxpdHlJbmZvLCBTdXBSYXRlLCBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLHBIdENhcGFiaWxpdHksIHBBZGRIdEluZm8sSHRDYXBhYmlsaXR5TGVuLCBBZGRIdEluZm9MZW4sCisJCQkJCU5ld0V4dENoYW5PZmZzZXQsIENoYW5uZWxObywgUnNzaSwgVGltZVN0YW1wLCBDa2lwRmxhZywgcEVkY2FQYXJtLCBwUW9zQ2FwYWJpbGl0eSwgcFFic3NMb2FkLCBMZW5ndGhWSUUsIHBWSUUpOworCQlUYWItPkJzc05yKys7CisJfQorCWVsc2UKKwl7CisJCUJzc0VudHJ5U2V0KHBBZCwgJlRhYi0+QnNzRW50cnlbSWR4XSwgcEJzc2lkLCBTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsQ2ZQYXJtLCBBdGltV2luLAorCQkJCQlDYXBhYmlsaXR5SW5mbywgU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgRXh0UmF0ZUxlbixwSHRDYXBhYmlsaXR5LCBwQWRkSHRJbmZvLEh0Q2FwYWJpbGl0eUxlbiwgQWRkSHRJbmZvTGVuLAorCQkJCQlOZXdFeHRDaGFuT2Zmc2V0LCBDaGFubmVsTm8sIFJzc2ksIFRpbWVTdGFtcCwgQ2tpcEZsYWcsIHBFZGNhUGFybSwgcFFvc0NhcGFiaWxpdHksIHBRYnNzTG9hZCwgTGVuZ3RoVklFLCBwVklFKTsKKwl9CisKKwlyZXR1cm4gSWR4OworfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisjaWZkZWYgRE9UMTFOX0RSQUZUMworVk9JRCAgVHJpRXZlbnRJbml0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVVDSEFSCQlpOworCisJZm9yIChpID0gMDtpIDwgTUFYX1RSSUdHRVJfRVZFTlQ7aSsrKQorCQlwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLmJWYWxpZCA9IEZBTFNFOworCisJcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QU5vID0gMDsKKwlwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRCQ291bnREb3duID0gMDsKK30KKworVUxPTkcgVHJpRXZlbnRUYWJsZVNldEVudHJ5KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVCBUUklHR0VSX0VWRU5UX1RBQiAqVGFiLAorCUlOIFBVQ0hBUiBwQnNzaWQsCisJSU4gSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKKwlJTiBVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbiwKKwlJTiBVQ0hBUgkJCVJlZ0NsYXNzLAorCUlOIFVDSEFSIENoYW5uZWxObykKK3sKKwkvLyBFdmVudCBBCisJaWYgKEh0Q2FwYWJpbGl0eUxlbiA9PSAwKQorCXsKKwkJaWYgKFRhYi0+RXZlbnRBTm8gPCBNQVhfVFJJR0dFUl9FVkVOVCkKKwkJeworCQkJUlRNUE1vdmVNZW1vcnkoVGFiLT5FdmVudEFbVGFiLT5FdmVudEFOb10uQlNTSUQsIHBCc3NpZCwgNik7CisJCQlUYWItPkV2ZW50QVtUYWItPkV2ZW50QU5vXS5iVmFsaWQgPSBUUlVFOworCQkJVGFiLT5FdmVudEFbVGFiLT5FdmVudEFOb10uQ2hhbm5lbCA9IENoYW5uZWxObzsKKwkJCVRhYi0+RXZlbnRBW1RhYi0+RXZlbnRBTm9dLkNEQ291bnRlciA9IHBBZC0+Q29tbW9uQ2ZnLkRvdDExQnNzV2lkdGhDaGFuVHJhbkRlbGF5OworCQkJaWYgKFJlZ0NsYXNzICE9IDApCisJCQl7CisJCQkJLy8gQmVhY29uIGhhcyBSZWd1bGF0b3J5IGNsYXNzIElFLiBTbyB1c2UgYmVhY29uJ3MKKwkJCQlUYWItPkV2ZW50QVtUYWItPkV2ZW50QU5vXS5SZWdDbGFzcyA9IFJlZ0NsYXNzOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIFVzZSBTdGF0aW9uJ3MgUmVndWxhdG9yeSBjbGFzcyBpbnN0ZWFkLgorCQkJCWlmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5iSHRFbmFibGUgPT0gVFJVRSkKKwkJCQl7CisJCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA+IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJCQkJCXsKKwkJCQkJCVRhYi0+RXZlbnRBW1RhYi0+RXZlbnRBTm9dLlJlZ0NsYXNzID0gMzI7CisJCQkJCX0KKwkJCQkJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQkJCQkJVGFiLT5FdmVudEFbVGFiLT5FdmVudEFOb10uUmVnQ2xhc3MgPSAzMzsKKwkJCQl9CisJCQkJZWxzZQorCQkJCQlUYWItPkV2ZW50QVtUYWItPkV2ZW50QU5vXS5SZWdDbGFzcyA9ID8/OworCisJCQl9CisKKwkJCVRhYi0+RXZlbnRBTm8gKys7CisJCX0KKwl9CisJZWxzZSBpZiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkludG9sZXJhbnQ0MCkKKwl7CisJCVRhYi0+RXZlbnRCQ291bnREb3duID0gcEFkLT5Db21tb25DZmcuRG90MTFCc3NXaWR0aENoYW5UcmFuRGVsYXk7CisJfQorCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJVHJpZ2dlciBFdmVudCB0YWJsZSBNYWludGFpbmVuY2UgY2FsbGVkIG9uY2UgZXZlcnkgc2Vjb25kLgorCisJQXJndW1lbnRzOgorCS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgVHJpRXZlbnRDb3VudGVyTWFpbnRlbmFuY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJVUNIQVIJCWk7CisJQk9PTEVBTgkJCWJOb3RpZnkgPSBGQUxTRTsKKwlmb3IgKGkgPSAwO2kgPCBNQVhfVFJJR0dFUl9FVkVOVDtpKyspCisJeworCQlpZiAocEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5iVmFsaWQgJiYgKHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFbaV0uQ0RDb3VudGVyID4gMCkpCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFbaV0uQ0RDb3VudGVyLS07CisJCQlpZiAocEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5DRENvdW50ZXIgPT0gMCkKKwkJCXsKKwkJCQlwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLmJWYWxpZCA9IEZBTFNFOworCQkJCXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFObyAtLTsKKwkJCQkvLyBOZWVkIHRvIHNlbmQgMjAvNDAgQ29leGlzdGVuY2UgTm90aWZ5IGZyYW1lIGlmIGhhcyBzdGF0dXMgY2hhbmdlLgorCQkJCWJOb3RpZnkgPSBUUlVFOworCQkJfQorCQl9CisJfQorCWlmIChwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRCQ291bnREb3duID4gMCkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEJDb3VudERvd24tLTsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEJDb3VudERvd24gPT0gMCkKKwkJCWJOb3RpZnkgPSBUUlVFOworCX0KKworCWlmIChiTm90aWZ5ID09IFRSVUUpCisJCVVwZGF0ZTIwNDBDb2V4aXN0RnJhbWVBbmROb3RpZnkocEFkLCBCU1NJRF9XQ0lELCBUUlVFKTsKK30KKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRCBCc3NUYWJsZVNzaWRTb3J0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVCBCU1NfVEFCTEUgKk91dFRhYiwKKwlJTglDSEFSIFNzaWRbXSwKKwlJTglVQ0hBUiBTc2lkTGVuKQoreworCUlOVCBpOworCUJzc1RhYmxlSW5pdChPdXRUYWIpOworCisJZm9yIChpID0gMDsgaSA8IHBBZC0+U2NhblRhYi5Cc3NOcjsgaSsrKQorCXsKKwkJQlNTX0VOVFJZICpwSW5Cc3MgPSAmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldOworCQlCT09MRUFOCWJJc0hpZGRlbkFwSW5jbHVkZWQgPSBGQUxTRTsKKworCQlpZiAoKChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJgorICAgICAgICAgICAgKHBBZC0+TWxtZUF1eC5DaGFubmVsID4gMTQpICYmCisgICAgICAgICAgICAgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwSW5Cc3MtPkNoYW5uZWwpKQorI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8gUm9nZXIgc3luYyBDYXJyaWVyCisgICAgICAgICAgICAgfHwgKHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID09IFRSVUUpCisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworICAgICAgICAgICAgKQorCQl7CisJCQlpZiAocEluQnNzLT5IaWRkZW4pCisJCQkJYklzSGlkZGVuQXBJbmNsdWRlZCA9IFRSVUU7CisJCX0KKworCQlpZiAoKHBJbkJzcy0+QnNzVHlwZSA9PSBwQWQtPlN0YUNmZy5Cc3NUeXBlKSAmJgorCQkJKFNTSURfRVFVQUwoU3NpZCwgU3NpZExlbiwgcEluQnNzLT5Tc2lkLCBwSW5Cc3MtPlNzaWRMZW4pIHx8IGJJc0hpZGRlbkFwSW5jbHVkZWQpKQorCQl7CisJCQlCU1NfRU5UUlkgKnBPdXRCc3MgPSAmT3V0VGFiLT5Cc3NFbnRyeVtPdXRUYWItPkJzc05yXTsKKworCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCQkJLy8gSWYgbm8gQ291bnRyeSBJRSBleGlzdHMgbm8gQ29ubmVjdGlvbiB3aWxsIGJlIGVzdGFibGlzaGVkIHdoZW4gSUVFRTgwMjExZENsaWVudE1vZGUgaXMgc3RyaWN0LgorCQkJaWYgKChwQWQtPlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSA9PSBSdDgwMl8xMV9EX1N0cmljdCkgJiYKKwkJCQkocEluQnNzLT5iSGFzQ291bnRyeUlFID09IEZBTFNFKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSA9PSBSdDgwMl8xMV9EX1N0cmljdCwgYnV0IHRoaXMgQVAgZG9lc24ndCBoYXZlIGNvdW50cnkgSUUuXG4iKSk7CisJCQkJY29udGludWU7CisJCQl9CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkvLyAyLjRHLzVHIE4gb25seSBtb2RlCisJCQlpZiAoKHBJbkJzcy0+SHRDYXBhYmlsaXR5TGVuID09IDApICYmCisJCQkJKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fMl80RykgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl81RykpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU1RBIGlzIGluIE4tb25seSBNb2RlLCB0aGlzIEFQIGRvbid0IGhhdmUgSHQgY2FwYWJpbGl0eSBpbiBCZWFjb24uXG4iKSk7CisJCQkJY29udGludWU7CisJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJCS8vIE5ldyBmb3IgV1BBMgorCQkJLy8gQ2hlY2sgdGhlIEF1dGhtb2RlIGZpcnN0CisJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorCQkJeworCQkJCS8vIENoZWNrIEF1dGhNb2RlIGFuZCBBdXRoTW9kZUF1eCBmb3IgbWF0Y2hpbmcsIGluIGNhc2UgQVAgc3VwcG9ydCBkdWFsLW1vZGUKKwkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IHBJbkJzcy0+QXV0aE1vZGUpICYmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSAhPSBwSW5Cc3MtPkF1dGhNb2RlQXV4KSkKKwkJCQkJLy8gTm9uZSBtYXRjaGVkCisJCQkJCWNvbnRpbnVlOworCisJCQkJLy8gQ2hlY2sgY2lwaGVyIHN1aXRlLCBBUCBtdXN0IGhhdmUgbW9yZSBzZWN1cmVkIGNpcGhlciB0aGFuIHN0YXRpb24gc2V0dGluZworCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkKKwkJCQl7CisJCQkJCS8vIElmIGl0J3Mgbm90IG1peGVkIG1vZGUsIHdlIHNob3VsZCBvbmx5IGxldCBCU1MgcGFzcyB3aXRoIHRoZSBzYW1lIGVuY3J5cHRpb24KKwkJCQkJaWYgKHBJbkJzcy0+V1BBLmJNaXhNb2RlID09IEZBTFNFKQorCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5Hcm91cENpcGhlcikKKwkJCQkJCQljb250aW51ZTsKKworCQkJCQkvLyBjaGVjayBncm91cCBjaXBoZXIKKwkJCQkJaWYgKChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPCBwSW5Cc3MtPldQQS5Hcm91cENpcGhlcikgJiYKKwkJCQkJCShwSW5Cc3MtPldQQS5Hcm91cENpcGhlciAhPSBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQpICYmCisJCQkJCQkocEluQnNzLT5XUEEuR3JvdXBDaXBoZXIgIT0gTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZCkpCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvLyBjaGVjayBwYWlyd2lzZSBjaXBoZXIsIHNraXAgaWYgbm9uZSBtYXRjaGVkCisJCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIEFFUywgbGV0IGl0IHBhc3Mgd2l0aG91dCBxdWVzdGlvbi4KKwkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gVEtJUCwgd2UgbXVzdCBmaW5kIG9uZSBtYXRlY2hlZAorCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgorCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5QYWlyQ2lwaGVyKSAmJgorCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5QYWlyQ2lwaGVyQXV4KSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQllbHNlIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQorCQkJCXsKKwkJCQkJLy8gSWYgaXQncyBub3QgbWl4ZWQgbW9kZSwgd2Ugc2hvdWxkIG9ubHkgbGV0IEJTUyBwYXNzIHdpdGggdGhlIHNhbWUgZW5jcnlwdGlvbgorCQkJCQlpZiAocEluQnNzLT5XUEEyLmJNaXhNb2RlID09IEZBTFNFKQorCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIpCisJCQkJCQkJY29udGludWU7CisKKwkJCQkJLy8gY2hlY2sgZ3JvdXAgY2lwaGVyCisJCQkJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzIDwgcEluQnNzLT5XUEEuR3JvdXBDaXBoZXIpICYmCisJCQkJCQkocEluQnNzLT5XUEEyLkdyb3VwQ2lwaGVyICE9IE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZCkgJiYKKwkJCQkJCShwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIgIT0gTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZCkpCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvLyBjaGVjayBwYWlyd2lzZSBjaXBoZXIsIHNraXAgaWYgbm9uZSBtYXRjaGVkCisJCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIEFFUywgbGV0IGl0IHBhc3Mgd2l0aG91dCBxdWVzdGlvbi4KKwkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gVEtJUCwgd2UgbXVzdCBmaW5kIG9uZSBtYXRlY2hlZAorCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgorCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuUGFpckNpcGhlcikgJiYKKwkJCQkJCShwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXgpKQorCQkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQkJLy8gQnNzIFR5cGUgbWF0Y2hlZCwgU1NJRCBtYXRjaGVkLgorCQkJLy8gV2Ugd2lsbCBjaGVjayB3ZXBzdGF0dXMgZm9yIHF1YWxpZmljYXRpb24gQnNzCisJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XZXBTdGF0dXMpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTdGFDZmcuV2VwU3RhdHVzPSVkLCB3aGlsZSBwSW5Cc3MtPldlcFN0YXR1cz0lZFxuIiwgcEFkLT5TdGFDZmcuV2VwU3RhdHVzLCBwSW5Cc3MtPldlcFN0YXR1cykpOworCQkJCS8vCisJCQkJLy8gRm9yIHRoZSBTRVN2MiBjYXNlLCB3ZSB3aWxsIG5vdCBxdWFsaWZ5IFdlcFN0YXR1cy4KKwkJCQkvLworCQkJCWlmICghcEluQnNzLT5iU0VTKQorCQkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLy8gU2luY2UgdGhlIEFQIGlzIHVzaW5nIGhpZGRlbiBTU0lELCBhbmQgd2UgYXJlIHRyeWluZyB0byBjb25uZWN0IHRvIEFOWQorCQkJLy8gSXQgZGVmaW5pdGVseSB3aWxsIGZhaWwuIFNvLCBza2lwIGl0LgorCQkJLy8gQ0NYIGFsc28gcmVxdWlyZSBub3QgZXZlbiB0cnkgdG8gY29ubmVjdCBpdCEhCisJCQlpZiAoU3NpZExlbiA9PSAwKQorCQkJCWNvbnRpbnVlOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkvLyBJZiBib3RoIHN0YXRpb24gYW5kIEFQIHVzZSA0ME1Ieiwgc3RpbGwgbmVlZCB0byBjaGVjayBpZiB0aGUgNDBNSFogYmFuZCdzIGxlZ2FsaXR5IGluIG15IGNvdW50cnkgcmVnaW9uCisJCQkvLyBJZiB0aGlzIDQwTUh6IHdpZGViYW5kIGlzIG5vdCBhbGxvd2VkIGluIG15IGNvdW50cnkgbGlzdCwgdXNlIGJhbmR3aWR0aCAyME1IWiBpbnN0ZWFkLAorCQkJaWYgKChwSW5Cc3MtPkNlbnRyYWxDaGFubmVsICE9IHBJbkJzcy0+Q2hhbm5lbCkgJiYKKwkJCQkocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwKSkKKwkJCXsKKwkJCQlpZiAoUlRNUENoZWNrQ2hhbm5lbChwQWQsIHBJbkJzcy0+Q2VudHJhbENoYW5uZWwsIHBJbkJzcy0+Q2hhbm5lbCkgPT0gRkFMU0UpCisJCQkJeworCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPSBCV18yMDsKKwkJCQkJU2V0Q29tbW9uSFQocEFkKTsKKwkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID0gQldfNDA7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoID09IEJBTkRfV0lEVEhfMjApCisJCQkJCXsKKwkJCQkJCVNldENvbW1vbkhUKHBBZCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJCS8vIGNvcHkgbWF0Y2hpbmcgQlNTIGZyb20gSW5UYWIgdG8gT3V0VGFiCisJCQlOZGlzTW92ZU1lbW9yeShwT3V0QnNzLCBwSW5Cc3MsIHNpemVvZihCU1NfRU5UUlkpKTsKKworCQkJT3V0VGFiLT5Cc3NOcisrOworCQl9CisJCWVsc2UgaWYgKChwSW5Cc3MtPkJzc1R5cGUgPT0gcEFkLT5TdGFDZmcuQnNzVHlwZSkgJiYgKFNzaWRMZW4gPT0gMCkpCisJCXsKKwkJCUJTU19FTlRSWSAqcE91dEJzcyA9ICZPdXRUYWItPkJzc0VudHJ5W091dFRhYi0+QnNzTnJdOworCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCS8vIDIuNEcvNUcgTiBvbmx5IG1vZGUKKwkJCWlmICgocEluQnNzLT5IdENhcGFiaWxpdHlMZW4gPT0gMCkgJiYKKwkJCQkoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl8yXzRHKSB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzVHKSkpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTVEEgaXMgaW4gTi1vbmx5IE1vZGUsIHRoaXMgQVAgZG9uJ3QgaGF2ZSBIdCBjYXBhYmlsaXR5IGluIEJlYWNvbi5cbiIpKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkJLy8gTmV3IGZvciBXUEEyCisJCQkvLyBDaGVjayB0aGUgQXV0aG1vZGUgZmlyc3QKKwkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisJCQl7CisJCQkJLy8gQ2hlY2sgQXV0aE1vZGUgYW5kIEF1dGhNb2RlQXV4IGZvciBtYXRjaGluZywgaW4gY2FzZSBBUCBzdXBwb3J0IGR1YWwtbW9kZQorCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gcEluQnNzLT5BdXRoTW9kZSkgJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IHBJbkJzcy0+QXV0aE1vZGVBdXgpKQorCQkJCQkvLyBOb25lIG1hdGNoZWQKKwkJCQkJY29udGludWU7CisKKwkJCQkvLyBDaGVjayBjaXBoZXIgc3VpdGUsIEFQIG11c3QgaGF2ZSBtb3JlIHNlY3VyZWQgY2lwaGVyIHRoYW4gc3RhdGlvbiBzZXR0aW5nCisJCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKQorCQkJCXsKKwkJCQkJLy8gSWYgaXQncyBub3QgbWl4ZWQgbW9kZSwgd2Ugc2hvdWxkIG9ubHkgbGV0IEJTUyBwYXNzIHdpdGggdGhlIHNhbWUgZW5jcnlwdGlvbgorCQkJCQlpZiAocEluQnNzLT5XUEEuYk1peE1vZGUgPT0gRkFMU0UpCisJCQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBLkdyb3VwQ2lwaGVyKQorCQkJCQkJCWNvbnRpbnVlOworCisJCQkJCS8vIGNoZWNrIGdyb3VwIGNpcGhlcgorCQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzIDwgcEluQnNzLT5XUEEuR3JvdXBDaXBoZXIpCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvLyBjaGVjayBwYWlyd2lzZSBjaXBoZXIsIHNraXAgaWYgbm9uZSBtYXRjaGVkCisJCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIEFFUywgbGV0IGl0IHBhc3Mgd2l0aG91dCBxdWVzdGlvbi4KKwkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gVEtJUCwgd2UgbXVzdCBmaW5kIG9uZSBtYXRlY2hlZAorCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgorCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5QYWlyQ2lwaGVyKSAmJgorCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5QYWlyQ2lwaGVyQXV4KSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQllbHNlIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQorCQkJCXsKKwkJCQkJLy8gSWYgaXQncyBub3QgbWl4ZWQgbW9kZSwgd2Ugc2hvdWxkIG9ubHkgbGV0IEJTUyBwYXNzIHdpdGggdGhlIHNhbWUgZW5jcnlwdGlvbgorCQkJCQlpZiAocEluQnNzLT5XUEEyLmJNaXhNb2RlID09IEZBTFNFKQorCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIpCisJCQkJCQkJY29udGludWU7CisKKwkJCQkJLy8gY2hlY2sgZ3JvdXAgY2lwaGVyCisJCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPCBwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIpCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvLyBjaGVjayBwYWlyd2lzZSBjaXBoZXIsIHNraXAgaWYgbm9uZSBtYXRjaGVkCisJCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIEFFUywgbGV0IGl0IHBhc3Mgd2l0aG91dCBxdWVzdGlvbi4KKwkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gVEtJUCwgd2UgbXVzdCBmaW5kIG9uZSBtYXRlY2hlZAorCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgorCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuUGFpckNpcGhlcikgJiYKKwkJCQkJCShwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXgpKQorCQkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQkJLy8gQnNzIFR5cGUgbWF0Y2hlZCwgU1NJRCBtYXRjaGVkLgorCQkJLy8gV2Ugd2lsbCBjaGVjayB3ZXBzdGF0dXMgZm9yIHF1YWxpZmljYXRpb24gQnNzCisJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XZXBTdGF0dXMpCisJCQkJCWNvbnRpbnVlOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkvLyBJZiBib3RoIHN0YXRpb24gYW5kIEFQIHVzZSA0ME1Ieiwgc3RpbGwgbmVlZCB0byBjaGVjayBpZiB0aGUgNDBNSFogYmFuZCdzIGxlZ2FsaXR5IGluIG15IGNvdW50cnkgcmVnaW9uCisJCQkvLyBJZiB0aGlzIDQwTUh6IHdpZGViYW5kIGlzIG5vdCBhbGxvd2VkIGluIG15IGNvdW50cnkgbGlzdCwgdXNlIGJhbmR3aWR0aCAyME1IWiBpbnN0ZWFkLAorCQkJaWYgKChwSW5Cc3MtPkNlbnRyYWxDaGFubmVsICE9IHBJbkJzcy0+Q2hhbm5lbCkgJiYKKwkJCQkocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwKSkKKwkJCXsKKwkJCQlpZiAoUlRNUENoZWNrQ2hhbm5lbChwQWQsIHBJbkJzcy0+Q2VudHJhbENoYW5uZWwsIHBJbkJzcy0+Q2hhbm5lbCkgPT0gRkFMU0UpCisJCQkJeworCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPSBCV18yMDsKKwkJCQkJU2V0Q29tbW9uSFQocEFkKTsKKwkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID0gQldfNDA7CisJCQkJfQorCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCQkvLyBjb3B5IG1hdGNoaW5nIEJTUyBmcm9tIEluVGFiIHRvIE91dFRhYgorCQkJTmRpc01vdmVNZW1vcnkocE91dEJzcywgcEluQnNzLCBzaXplb2YoQlNTX0VOVFJZKSk7CisKKwkJCU91dFRhYi0+QnNzTnIrKzsKKwkJfQorCisJCWlmIChPdXRUYWItPkJzc05yID49IE1BWF9MRU5fT0ZfQlNTX1RBQkxFKQorCQkJYnJlYWs7CisJfQorCisJQnNzVGFibGVTb3J0QnlSc3NpKE91dFRhYik7Cit9CisKKworLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCitWT0lEIEJzc1RhYmxlU29ydEJ5UnNzaSgKKwlJTiBPVVQgQlNTX1RBQkxFICpPdXRUYWIpCit7CisJSU5UIAkgIGksIGo7CisJQlNTX0VOVFJZIFRtcEJzczsKKworCWZvciAoaSA9IDA7IGkgPCBPdXRUYWItPkJzc05yIC0gMTsgaSsrKQorCXsKKwkJZm9yIChqID0gaSsxOyBqIDwgT3V0VGFiLT5Cc3NOcjsgaisrKQorCQl7CisJCQlpZiAoT3V0VGFiLT5Cc3NFbnRyeVtqXS5Sc3NpID4gT3V0VGFiLT5Cc3NFbnRyeVtpXS5Sc3NpKQorCQkJeworCQkJCU5kaXNNb3ZlTWVtb3J5KCZUbXBCc3MsICZPdXRUYWItPkJzc0VudHJ5W2pdLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJk91dFRhYi0+QnNzRW50cnlbal0sICZPdXRUYWItPkJzc0VudHJ5W2ldLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJk91dFRhYi0+QnNzRW50cnlbaV0sICZUbXBCc3MsIHNpemVvZihCU1NfRU5UUlkpKTsKKwkJCX0KKwkJfQorCX0KK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCitWT0lEIEJzc0NpcGhlclBhcnNlKAorCUlOIE9VVAlQQlNTX0VOVFJZCXBCc3MpCit7CisJUEVJRF9TVFJVQ1QgCQkgcEVpZDsKKwlQVUNIQVIJCQkJcFRtcDsKKwlQUlNOX0lFX0hFQURFUl9TVFJVQ1QJCQlwUnNuSGVhZGVyOworCVBDSVBIRVJfU1VJVEVfU1RSVUNUCQkJcENpcGhlcjsKKwlQQUtNX1NVSVRFX1NUUlVDVAkJCQlwQUtNOworCVVTSE9SVAkJCQkJCQlDb3VudDsKKwlJTlQJCQkJCQkJCUxlbmd0aDsKKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwlUbXBDaXBoZXI7CisKKwkvLworCS8vIFdlcFN0YXR1cyB3aWxsIGJlIHJlc2V0IGxhdGVyLCBpZiBBUCBhbm5vdW5jZSBUS0lQIG9yIEFFUyBvbiB0aGUgYmVhY29uIGZyYW1lLgorCS8vCisJaWYgKHBCc3MtPlByaXZhY3kpCisJeworCQlwQnNzLT5XZXBTdGF0dXMgCT0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisJfQorCWVsc2UKKwl7CisJCXBCc3MtPldlcFN0YXR1cyAJPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJfQorCS8vIFNldCBkZWZhdWx0IHRvIGRpc2FibGUgJiBvcGVuIGF1dGhlbnRpY2F0aW9uIGJlZm9yZSBwYXJzaW5nIHZhcmlhYmxlIElFCisJcEJzcy0+QXV0aE1vZGUJCT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKwlwQnNzLT5BdXRoTW9kZUF1eAk9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisKKwkvLyBJbml0IFdQQSBzZXR0aW5nCisJcEJzcy0+V1BBLlBhaXJDaXBoZXIJPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJcEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyCT0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCXBCc3MtPldQQS5Sc25DYXBhYmlsaXR5ID0gMDsKKwlwQnNzLT5XUEEuYk1peE1vZGUJCT0gRkFMU0U7CisKKwkvLyBJbml0IFdQQTIgc2V0dGluZworCXBCc3MtPldQQTIuUGFpckNpcGhlcgkgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJcEJzcy0+V1BBMi5QYWlyQ2lwaGVyQXV4ID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCXBCc3MtPldQQTIuR3JvdXBDaXBoZXIJID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCXBCc3MtPldQQTIuUnNuQ2FwYWJpbGl0eSA9IDA7CisJcEJzcy0+V1BBMi5iTWl4TW9kZSAJID0gRkFMU0U7CisKKworCUxlbmd0aCA9IChJTlQpIHBCc3MtPlZhcklFTGVuOworCisJd2hpbGUgKExlbmd0aCA+IDApCisJeworCQkvLyBQYXJzZSBjaXBoZXIgc3VpdGUgYmFzZSBvbiBXUEExICYgV1BBMiwgdGhleSBzaG91bGQgYmUgcGFyc2VkIGRpZmZlcmVudGx5CisJCXBUbXAgPSAoKFBVQ0hBUikgcEJzcy0+VmFySUVzKSArIHBCc3MtPlZhcklFTGVuIC0gTGVuZ3RoOworCQlwRWlkID0gKFBFSURfU1RSVUNUKSBwVG1wOworCQlzd2l0Y2ggKHBFaWQtPkVpZCkKKwkJeworCQkJY2FzZSBJRV9XUEE6CisJCQkJLy9QYXJzZSBDaXNjbyBJRV9XUEEgKExFQVAsIENDS00sIGV0Yy4pCisJCQkJaWYgKCBOZGlzRXF1YWxNZW1vcnkoKHBUbXArOCksIENJU0NPX09VSSwgMykpCisJCQkJeworCQkJCQlwVG1wICAgKz0gMTE7CisJCQkJCXN3aXRjaCAoKnBUbXApCisJCQkJCXsKKwkJCQkJCWNhc2UgMToKKwkJCQkJCWNhc2UgNToJLy8gQWx0aG91Z2ggV0VQIGlzIG5vdCBhbGxvd2VkIGluIFdQQSByZWxhdGVkIGF1dGggbW9kZSwgd2UgcGFyc2UgaXQgYW55d2F5CisJCQkJCQkJcEJzcy0+V2VwU3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKKwkJCQkJCQlwQnNzLT5XUEEuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7CisJCQkJCQkJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgMjoKKwkJCQkJCQlwQnNzLT5XZXBTdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCQkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKKwkJCQkJCQlwQnNzLT5XUEEuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSA0OgorCQkJCQkJCXBCc3MtPldlcFN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisJCQkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOworCQkJCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7CisJCQkJCQkJYnJlYWs7CisJCQkJCQlkZWZhdWx0OgorCQkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJLy8gaWYgQ2lzY28gSUVfV1BBLCBicmVhaworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZWxzZSBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBTRVNfT1VJLCAzKSAmJiAocEVpZC0+TGVuID09IDcpKQorCQkJCXsKKwkJCQkJcEJzcy0+YlNFUyA9IFRSVUU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQllbHNlIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdQQV9PVUksIDQpICE9IDEpCisJCQkJeworCQkJCQkvLyBpZiB1bnN1cHBvcnRlZCB2ZW5kb3Igc3BlY2lmaWMgSUUKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8vIFNraXAgT1VJLCB2ZXJzaW9uLCBhbmQgbXVsdGljYXN0IHN1aXRlCisJCQkJLy8gVGhpcyBwYXJ0IHNob3VsZCBiZSBpbXByb3ZlZCBpbiB0aGUgZnV0dXJlIHdoZW4gQVAgc3VwcG9ydGVkIG11bHRpcGxlIGNpcGhlciBzdWl0ZS4KKwkJCQkvLyBGb3Igbm93LCBpdCdzIE9LIHNpbmNlIGFsbW9zdCBhbGwgQVBzIGhhdmUgZml4ZWQgY2lwaGVyIHN1aXRlIHN1cHBvcnRlZC4KKwkJCQkvLyBwVG1wID0gKFBVQ0hBUikgcEVpZC0+T2N0ZXQ7CisJCQkJcFRtcCAgICs9IDExOworCisJCQkJLy8gQ2lwaGVyIFN1aXRlIFNlbGVjdG9ycyBmcm9tIFNwZWMgUDgwMi4xMWkvRDMuMiBQMjYuCisJCQkJLy8JVmFsdWUJICAgTWVhbmluZworCQkJCS8vCTAJCQlOb25lCisJCQkJLy8JMQkJCVdFUC00MAorCQkJCS8vCTIJCQlUa2lwCisJCQkJLy8JMwkJCVdSQVAKKwkJCQkvLwk0CQkJQUVTCisJCQkJLy8JNQkJCVdFUC0xMDQKKwkJCQkvLyBQYXJzZSBncm91cCBjaXBoZXIKKwkJCQlzd2l0Y2ggKCpwVG1wKQorCQkJCXsKKwkJCQkJY2FzZSAxOgorCQkJCQkJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUdyb3VwV0VQNDBFbmFibGVkOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgNToKKwkJCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFHcm91cFdFUDEwNEVuYWJsZWQ7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAyOgorCQkJCQkJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDQ6CisJCQkJCQlwQnNzLT5XUEEuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLy8gbnVtYmVyIG9mIHVuaWNhc3Qgc3VpdGUKKwkJCQlwVG1wICAgKz0gMTsKKworCQkJCS8vIHNraXAgYWxsIHVuaWNhc3QgY2lwaGVyIHN1aXRlcworCQkJCS8vQ291bnQgPSAqKFBVU0hPUlQpIHBUbXA7CisJCQkJQ291bnQgPSAocFRtcFsxXTw8OCkgKyBwVG1wWzBdOworCQkJCXBUbXAgICArPSBzaXplb2YoVVNIT1JUKTsKKworCQkJCS8vIFBhcnNpbmcgYWxsIHVuaWNhc3QgY2lwaGVyIHN1aXRlCisJCQkJd2hpbGUgKENvdW50ID4gMCkKKwkJCQl7CisJCQkJCS8vIFNraXAgT1VJCisJCQkJCXBUbXAgKz0gMzsKKwkJCQkJVG1wQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCQkJCQlzd2l0Y2ggKCpwVG1wKQorCQkJCQl7CisJCQkJCQljYXNlIDE6CisJCQkJCQljYXNlIDU6IC8vIEFsdGhvdWdoIFdFUCBpcyBub3QgYWxsb3dlZCBpbiBXUEEgcmVsYXRlZCBhdXRoIG1vZGUsIHdlIHBhcnNlIGl0IGFueXdheQorCQkJCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDI6CisJCQkJCQkJVG1wQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgNDoKKwkJCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworCQkJCQkJCWJyZWFrOworCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlpZiAoVG1wQ2lwaGVyID4gcEJzcy0+V1BBLlBhaXJDaXBoZXIpCisJCQkJCXsKKwkJCQkJCS8vIE1vdmUgdGhlIGxvd2VyIGNpcGhlciBzdWl0ZSB0byBQYWlyQ2lwaGVyQXV4CisJCQkJCQlwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9IHBCc3MtPldQQS5QYWlyQ2lwaGVyOworCQkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXIJPSBUbXBDaXBoZXI7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9IFRtcENpcGhlcjsKKwkJCQkJfQorCQkJCQlwVG1wKys7CisJCQkJCUNvdW50LS07CisJCQkJfQorCisJCQkJLy8gNC4gZ2V0IEFLTSBzdWl0ZSBjb3VudHMKKwkJCQkvL0NvdW50CT0gKihQVVNIT1JUKSBwVG1wOworCQkJCUNvdW50ID0gKHBUbXBbMV08PDgpICsgcFRtcFswXTsKKwkJCQlwVG1wICAgKz0gc2l6ZW9mKFVTSE9SVCk7CisJCQkJcFRtcCAgICs9IDM7CisKKwkJCQlzd2l0Y2ggKCpwVG1wKQorCQkJCXsKKwkJCQkJY2FzZSAxOgorCQkJCQkJLy8gU2V0IEFQIHN1cHBvcnQgV1BBIG1vZGUKKwkJCQkJCWlmIChwQnNzLT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQorCQkJCQkJCXBCc3MtPkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBOworCQkJCQkJZWxzZQorCQkJCQkJCXBCc3MtPkF1dGhNb2RlQXV4ID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMjoKKwkJCQkJCS8vIFNldCBBUCBzdXBwb3J0IFdQQSBtb2RlCisJCQkJCQlpZiAocEJzcy0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKKwkJCQkJCQlwQnNzLT5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzsKKwkJCQkJCWVsc2UKKwkJCQkJCQlwQnNzLT5BdXRoTW9kZUF1eCA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXBUbXAgICArPSAxOworCisJCQkJLy8gRml4ZWQgZm9yIFdQQS1Ob25lCisJCQkJaWYgKHBCc3MtPkJzc1R5cGUgPT0gQlNTX0FESE9DKQorCQkJCXsKKwkJCQkJcEJzcy0+QXV0aE1vZGUJICA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7CisJCQkJCXBCc3MtPkF1dGhNb2RlQXV4ID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKKwkJCQkJcEJzcy0+V2VwU3RhdHVzICAgPSBwQnNzLT5XUEEuR3JvdXBDaXBoZXI7CisJCQkJCS8vIFBhdGNoZWQgYnVncyBmb3Igb2xkIGRyaXZlcgorCQkJCQlpZiAocEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQorCQkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPSBwQnNzLT5XUEEuR3JvdXBDaXBoZXI7CisJCQkJfQorCQkJCWVsc2UKKwkJCQkJcEJzcy0+V2VwU3RhdHVzICAgPSBwQnNzLT5XUEEuUGFpckNpcGhlcjsKKworCQkJCS8vIENoZWNrIHRoZSBQYWlyICYgR3JvdXAsIGlmIGRpZmZlcmVudCwgdHVybiBvbiBtaXhlZCBtb2RlIGZsYWcKKwkJCQlpZiAocEJzcy0+V1BBLkdyb3VwQ2lwaGVyICE9IHBCc3MtPldQQS5QYWlyQ2lwaGVyKQorCQkJCQlwQnNzLT5XUEEuYk1peE1vZGUgPSBUUlVFOworCisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSUVfUlNOOgorCQkJCXBSc25IZWFkZXIgPSAoUFJTTl9JRV9IRUFERVJfU1RSVUNUKSBwVG1wOworCisJCQkJLy8gMC4gVmVyc2lvbiBtdXN0IGJlIDEKKwkJCQlpZiAobGUyY3B1MTYocFJzbkhlYWRlci0+VmVyc2lvbikgIT0gMSkKKwkJCQkJYnJlYWs7CisJCQkJcFRtcCAgICs9IHNpemVvZihSU05fSUVfSEVBREVSX1NUUlVDVCk7CisKKwkJCQkvLyAxLiBDaGVjayBncm91cCBjaXBoZXIKKwkJCQlwQ2lwaGVyID0gKFBDSVBIRVJfU1VJVEVfU1RSVUNUKSBwVG1wOworCQkJCWlmICghUlRNUEVxdWFsTWVtb3J5KHBUbXAsIFJTTl9PVUksIDMpKQorCQkJCQlicmVhazsKKworCQkJCS8vIFBhcnNlIGdyb3VwIGNpcGhlcgorCQkJCXN3aXRjaCAocENpcGhlci0+VHlwZSkKKwkJCQl7CisJCQkJCWNhc2UgMToKKwkJCQkJCXBCc3MtPldQQTIuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQ7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSA1OgorCQkJCQkJcEJzcy0+V1BBMi5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFHcm91cFdFUDEwNEVuYWJsZWQ7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAyOgorCQkJCQkJcEJzcy0+V1BBMi5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSA0OgorCQkJCQkJcEJzcy0+V1BBMi5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvLyBzZXQgdG8gY29ycmVjdCBvZmZzZXQgZm9yIG5leHQgcGFyc2luZworCQkJCXBUbXAgICArPSBzaXplb2YoQ0lQSEVSX1NVSVRFX1NUUlVDVCk7CisKKwkJCQkvLyAyLiBHZXQgcGFpcndpc2UgY2lwaGVyIGNvdW50cworCQkJCS8vQ291bnQgPSAqKFBVU0hPUlQpIHBUbXA7CisJCQkJQ291bnQgPSAocFRtcFsxXTw8OCkgKyBwVG1wWzBdOworCQkJCXBUbXAgICArPSBzaXplb2YoVVNIT1JUKTsKKworCQkJCS8vIDMuIEdldCBwYWlyd2lzZSBjaXBoZXIKKwkJCQkvLyBQYXJzaW5nIGFsbCB1bmljYXN0IGNpcGhlciBzdWl0ZQorCQkJCXdoaWxlIChDb3VudCA+IDApCisJCQkJeworCQkJCQkvLyBTa2lwIE9VSQorCQkJCQlwQ2lwaGVyID0gKFBDSVBIRVJfU1VJVEVfU1RSVUNUKSBwVG1wOworCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJCQkJCXN3aXRjaCAocENpcGhlci0+VHlwZSkKKwkJCQkJeworCQkJCQkJY2FzZSAxOgorCQkJCQkJY2FzZSA1OiAvLyBBbHRob3VnaCBXRVAgaXMgbm90IGFsbG93ZWQgaW4gV1BBIHJlbGF0ZWQgYXV0aCBtb2RlLCB3ZSBwYXJzZSBpdCBhbnl3YXkKKwkJCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAyOgorCQkJCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDQ6CisJCQkJCQkJVG1wQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJaWYgKFRtcENpcGhlciA+IHBCc3MtPldQQTIuUGFpckNpcGhlcikKKwkJCQkJeworCQkJCQkJLy8gTW92ZSB0aGUgbG93ZXIgY2lwaGVyIHN1aXRlIHRvIFBhaXJDaXBoZXJBdXgKKwkJCQkJCXBCc3MtPldQQTIuUGFpckNpcGhlckF1eCA9IHBCc3MtPldQQTIuUGFpckNpcGhlcjsKKwkJCQkJCXBCc3MtPldQQTIuUGFpckNpcGhlcgkgPSBUbXBDaXBoZXI7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXggPSBUbXBDaXBoZXI7CisJCQkJCX0KKwkJCQkJcFRtcCArPSBzaXplb2YoQ0lQSEVSX1NVSVRFX1NUUlVDVCk7CisJCQkJCUNvdW50LS07CisJCQkJfQorCisJCQkJLy8gNC4gZ2V0IEFLTSBzdWl0ZSBjb3VudHMKKwkJCQkvL0NvdW50CT0gKihQVVNIT1JUKSBwVG1wOworCQkJCUNvdW50ID0gKHBUbXBbMV08PDgpICsgcFRtcFswXTsKKwkJCQlwVG1wICAgKz0gc2l6ZW9mKFVTSE9SVCk7CisKKwkJCQkvLyA1LiBHZXQgQUtNIGNpcGhlcnMKKwkJCQlwQUtNID0gKFBBS01fU1VJVEVfU1RSVUNUKSBwVG1wOworCQkJCWlmICghUlRNUEVxdWFsTWVtb3J5KHBUbXAsIFJTTl9PVUksIDMpKQorCQkJCQlicmVhazsKKworCQkJCXN3aXRjaCAocEFLTS0+VHlwZSkKKwkJCQl7CisJCQkJCWNhc2UgMToKKwkJCQkJCS8vIFNldCBBUCBzdXBwb3J0IFdQQSBtb2RlCisJCQkJCQlpZiAocEJzcy0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKKwkJCQkJCQlwQnNzLT5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI7CisJCQkJCQllbHNlCisJCQkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMjoKKwkJCQkJCS8vIFNldCBBUCBzdXBwb3J0IFdQQSBtb2RlCisJCQkJCQlpZiAocEJzcy0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKKwkJCQkJCQlwQnNzLT5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7CisJCQkJCQllbHNlCisJCQkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcFRtcCAgICs9IChDb3VudCAqIHNpemVvZihBS01fU1VJVEVfU1RSVUNUKSk7CisKKwkJCQkvLyBGaXhlZCBmb3IgV1BBLU5vbmUKKwkJCQlpZiAocEJzcy0+QnNzVHlwZSA9PSBCU1NfQURIT0MpCisJCQkJeworCQkJCQlwQnNzLT5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7CisJCQkJCXBCc3MtPkF1dGhNb2RlQXV4ID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKKwkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPSBwQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXg7CisJCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlcgk9IHBCc3MtPldQQTIuR3JvdXBDaXBoZXI7CisJCQkJCXBCc3MtPldlcFN0YXR1cyAJCT0gcEJzcy0+V1BBLkdyb3VwQ2lwaGVyOworCQkJCQkvLyBQYXRjaGVkIGJ1Z3MgZm9yIG9sZCBkcml2ZXIKKwkJCQkJaWYgKHBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKKwkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID0gcEJzcy0+V1BBLkdyb3VwQ2lwaGVyOworCQkJCX0KKwkJCQlwQnNzLT5XZXBTdGF0dXMgICA9IHBCc3MtPldQQTIuUGFpckNpcGhlcjsKKworCQkJCS8vIDYuIEdldCBSU04gY2FwYWJpbGl0eQorCQkJCS8vcEJzcy0+V1BBMi5Sc25DYXBhYmlsaXR5ID0gKihQVVNIT1JUKSBwVG1wOworCQkJCXBCc3MtPldQQTIuUnNuQ2FwYWJpbGl0eSA9IChwVG1wWzFdPDw4KSArIHBUbXBbMF07CisJCQkJcFRtcCArPSBzaXplb2YoVVNIT1JUKTsKKworCQkJCS8vIENoZWNrIHRoZSBQYWlyICYgR3JvdXAsIGlmIGRpZmZlcmVudCwgdHVybiBvbiBtaXhlZCBtb2RlIGZsYWcKKwkJCQlpZiAocEJzcy0+V1BBMi5Hcm91cENpcGhlciAhPSBwQnNzLT5XUEEyLlBhaXJDaXBoZXIpCisJCQkJCXBCc3MtPldQQTIuYk1peE1vZGUgPSBUUlVFOworCisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisJCUxlbmd0aCAtPSAocEVpZC0+TGVuICsgMik7CisJfQorfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBtYWNfdGFibGUuYworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvKiEgXGJyaWVmIGdlbmVyYXRlcyBhIHJhbmRvbSBtYWMgYWRkcmVzcyB2YWx1ZSBmb3IgSUJTUyBCU1NJRAorICoJXHBhcmFtIEFkZHIgdGhlIGJzc2lkIGxvY2F0aW9uCisgKglccmV0dXJuIG5vbmUKKyAqCVxwcmUKKyAqCVxwb3N0CisgKi8KK1ZPSUQgTWFjQWRkclJhbmRvbUJzc2lkKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBQVUNIQVIgcEFkZHIpCit7CisJSU5UIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFDX0FERFJfTEVOOyBpKyspCisJeworCQlwQWRkcltpXSA9IFJhbmRvbUJ5dGUocEFkKTsKKwl9CisKKwlwQWRkclswXSA9IChwQWRkclswXSAmIDB4ZmUpIHwgMHgwMjsgIC8vIHRoZSBmaXJzdCAyIGJpdHMgbXVzdCBiZSAwMXh4eHh4eHh4Cit9CisKKy8qISBcYnJpZWYgaW5pdCB0aGUgbWFuYWdlbWVudCBtYWMgZnJhbWUgaGVhZGVyCisgKglccGFyYW0gcF9oZHIgbWFjIGhlYWRlcgorICoJXHBhcmFtIHN1YnR5cGUgc3VidHlwZSBvZiB0aGUgZnJhbWUKKyAqCVxwYXJhbSBwX2RzIGRlc3RpbmF0aW9uIGFkZHJlc3MsIGRvbid0IGNhcmUgaWYgaXQgaXMgYSBicm9hZGNhc3QgYWRkcmVzcworICoJXHJldHVybiBub25lCisgKglccHJlIHRoZSBzdGF0aW9uIGhhcyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIGluIHRoZSBwQWQtPlN0YUNmZworICoJIC0gYnNzaWQKKyAqCSAtIHN0YXRpb24gYWRkcmVzcworICoJXHBvc3QKKyAqCVxub3RlIHRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIGZvbGxvd2luZyBmaWVsZAorCisgSVJRTCA9IFBBU1NJVkVfTEVWRUwKKyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICovCitWT0lEIE1ndE1hY0hlYWRlckluaXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gT1VUIFBIRUFERVJfODAyXzExIHBIZHI4MDIxMSwKKwlJTiBVQ0hBUiBTdWJUeXBlLAorCUlOIFVDSEFSIFRvRHMsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBQVUNIQVIgcEJzc2lkKQoreworCU5kaXNaZXJvTWVtb3J5KHBIZHI4MDIxMSwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKworCXBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX01HTVQ7CisJcEhkcjgwMjExLT5GQy5TdWJUeXBlID0gU3ViVHlwZTsKKy8vCWlmIChTdWJUeXBlID09IFNVQlRZUEVfQUNLKQkvLyBzYW1wbGUsIG5vIHVzZSwgaXQgd2lsbCBjb25mbGljdCB3aXRoIEFDVElPTiBmcmFtZSBzdWIgdHlwZQorLy8JCXBIZHI4MDIxMS0+RkMuVHlwZSA9IEJUWVBFX0NOVEw7CisJcEhkcjgwMjExLT5GQy5Ub0RzID0gVG9EczsKKwlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjEsIHBEQSk7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjMsIHBCc3NpZCk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIG1lbV9tZ210LmMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGlzIHJvdXRpbmUgYnVpbGQgYW4gb3V0Z29pbmcgZnJhbWUsIGFuZCBmaWxsIGFsbCBpbmZvcm1hdGlvbiBzcGVjaWZpZWQKKyAqIGluIGFyZ3VtZW50IGxpc3QgdG8gdGhlIGZyYW1lIGJvZHkuIFRoZSBhY3R1YWwgZnJhbWUgc2l6ZSBpcyB0aGUgc3VtbWF0aW9uCisgKiBvZiBhbGwgYXJndW1lbnRzLgorICogaW5wdXQgcGFyYW1zOgorICoJCUJ1ZmZlciAtIHBvaW50ZXIgdG8gYSBwcmUtYWxsb2NhdGVkIG1lbW9yeSBzZWdtZW50CisgKgkJYXJncyAtIGEgbGlzdCBvZiA8aW50IGFyZ19zaXplLCBhcmc+IHBhaXJzLgorICoJCU5PVEUgTk9URSBOT1RFISEhISB0aGUgbGFzdCBhcmd1bWVudCBtdXN0IGJlIE5VTEwsIG90aGVyd2lzZSB0aGlzCisgKgkJCQkJCSAgIGZ1bmN0aW9uIHdpbGwgRkFJTCEhIQorICogcmV0dXJuOgorICoJCVNpemUgb2YgdGhlIGJ1ZmZlcgorICogdXNhZ2U6CisgKgkJTWFrZU91dGdvaW5nRnJhbWUoQnVmZmVyLCBvdXRwdXRfbGVuZ3RoLCAyLCAmZmMsIDIsICZkdXIsIDYsIHBfYWRkcjEsIDYscF9hZGRyMiwgRU5EX09GX0FSR1MpOworCisgSVJRTCA9IFBBU1NJVkVfTEVWRUwKKyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitVTE9ORyBNYWtlT3V0Z29pbmdGcmFtZSgKKwlPVVQgQ0hBUiAqQnVmZmVyLAorCU9VVCBVTE9ORyAqRnJhbWVMZW4sIC4uLikKK3sKKwlDSEFSICAgKnA7CisJaW50IAlsZW5nOworCVVMT05HCVRvdExlbmc7CisJdmFfbGlzdCBBcmdzOworCisJLy8gY2FsY3VsYXRlcyB0aGUgdG90YWwgbGVuZ3RoCisJVG90TGVuZyA9IDA7CisJdmFfc3RhcnQoQXJncywgRnJhbWVMZW4pOworCWRvCisJeworCQlsZW5nID0gdmFfYXJnKEFyZ3MsIGludCk7CisJCWlmIChsZW5nID09IEVORF9PRl9BUkdTKQorCQl7CisJCQlicmVhazsKKwkJfQorCQlwID0gdmFfYXJnKEFyZ3MsIFBWT0lEKTsKKwkJTmRpc01vdmVNZW1vcnkoJkJ1ZmZlcltUb3RMZW5nXSwgcCwgbGVuZyk7CisJCVRvdExlbmcgPSBUb3RMZW5nICsgbGVuZzsKKwl9IHdoaWxlKFRSVUUpOworCisJdmFfZW5kKEFyZ3MpOyAvKiBjbGVhbiB1cCAqLworCSpGcmFtZUxlbiA9IFRvdExlbmc7CisJcmV0dXJuIFRvdExlbmc7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIG1sbWVfcXVldWUuYworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvKiEgXGJyaWVmCUluaXRpYWxpemUgVGhlIE1MTUUgUXVldWUsIHVzZWQgYnkgTUxNRSBGdW5jdGlvbnMKKyAqCVxwYXJhbQkqUXVldWUJICAgVGhlIE1MTUUgUXVldWUKKyAqCVxyZXR1cm4gQWx3YXlzCSAgIFJldHVybiBORElTX1NUQVRFX1NVQ0NFU1MgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbgorICoJXHByZQorICoJXHBvc3QKKyAqCVxub3RlCUJlY2F1c2UgdGhpcyBpcyBkb25lIG9ubHkgb25jZSAoYXQgdGhlIGluaXQgc3RhZ2UpLCBubyBuZWVkIHRvIGJlIGxvY2tlZAorCisgSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworICovCitORElTX1NUQVRVUyBNbG1lUXVldWVJbml0KAorCUlOIE1MTUVfUVVFVUUgKlF1ZXVlKQoreworCUlOVCBpOworCisJTmRpc0FsbG9jYXRlU3BpbkxvY2soJlF1ZXVlLT5Mb2NrKTsKKworCVF1ZXVlLT5OdW0JPSAwOworCVF1ZXVlLT5IZWFkID0gMDsKKwlRdWV1ZS0+VGFpbCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9NTE1FX1FVRVVFOyBpKyspCisJeworCQlRdWV1ZS0+RW50cnlbaV0uT2NjdXBpZWQgPSBGQUxTRTsKKwkJUXVldWUtPkVudHJ5W2ldLk1zZ0xlbiA9IDA7CisJCU5kaXNaZXJvTWVtb3J5KFF1ZXVlLT5FbnRyeVtpXS5Nc2csIE1HTVRfRE1BX0JVRkZFUl9TSVpFKTsKKwl9CisKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyohIFxicmllZgkgRW5xdWV1ZSBhIG1lc3NhZ2UgZm9yIG90aGVyIHRocmVhZHMsIGlmIHRoZXkgd2FudCB0byBzZW5kIG1lc3NhZ2VzIHRvIE1MTUUgdGhyZWFkCisgKglccGFyYW0JKlF1ZXVlCSAgVGhlIE1MTUUgUXVldWUKKyAqCVxwYXJhbQkgTWFjaGluZSAgVGhlIFN0YXRlIE1hY2hpbmUgSWQKKyAqCVxwYXJhbQkgTXNnVHlwZSAgVGhlIE1lc3NhZ2UgVHlwZQorICoJXHBhcmFtCSBNc2dMZW4gICBUaGUgTWVzc2FnZSBsZW5ndGgKKyAqCVxwYXJhbQkqTXNnCSAgVGhlIG1lc3NhZ2UgcG9pbnRlcgorICoJXHJldHVybiAgVFJVRSBpZiBlbnF1ZXVlIGlzIHN1Y2Nlc3NmdWwsIEZBTFNFIGlmIHRoZSBxdWV1ZSBpcyBmdWxsCisgKglccHJlCisgKglccG9zdAorICoJXG5vdGUJIFRoZSBtZXNzYWdlIGhhcyB0byBiZSBpbml0aWFsaXplZAorCisgSVJRTCA9IFBBU1NJVkVfTEVWRUwKKyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICovCitCT09MRUFOIE1sbWVFbnF1ZXVlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVMT05HIE1hY2hpbmUsCisJSU4gVUxPTkcgTXNnVHlwZSwKKwlJTiBVTE9ORyBNc2dMZW4sCisJSU4gVk9JRCAqTXNnKQoreworCUlOVCBUYWlsOworCU1MTUVfUVVFVUUJKlF1ZXVlID0gKE1MTUVfUVVFVUUgKikmcEFkLT5NbG1lLlF1ZXVlOworCisJLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCisJLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0CisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkJcmV0dXJuIEZBTFNFOworCisJLy8gRmlyc3QgY2hlY2sgdGhlIHNpemUsIGl0IE1VU1Qgbm90IGV4Y2VlZCB0aGUgbWxtZSBxdWV1ZSBzaXplCisJaWYgKE1zZ0xlbiA+IE1HTVRfRE1BX0JVRkZFUl9TSVpFKQorCXsKKwkJREJHUFJJTlRfRVJSKCgiTWxtZUVucXVldWU6IG1zZyB0b28gbGFyZ2UsIHNpemUgPSAlbGQgXG4iLCBNc2dMZW4pKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmIChNbG1lUXVldWVGdWxsKFF1ZXVlKSkKKwl7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKKwlUYWlsID0gUXVldWUtPlRhaWw7CisJUXVldWUtPlRhaWwrKzsKKwlRdWV1ZS0+TnVtKys7CisJaWYgKFF1ZXVlLT5UYWlsID09IE1BWF9MRU5fT0ZfTUxNRV9RVUVVRSkKKwl7CisJCVF1ZXVlLT5UYWlsID0gMDsKKwl9CisKKwlRdWV1ZS0+RW50cnlbVGFpbF0uV2NpZCA9IFJFU0VSVkVEX1dDSUQ7CisJUXVldWUtPkVudHJ5W1RhaWxdLk9jY3VwaWVkID0gVFJVRTsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uTWFjaGluZSA9IE1hY2hpbmU7CisJUXVldWUtPkVudHJ5W1RhaWxdLk1zZ1R5cGUgPSBNc2dUeXBlOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5Nc2dMZW4gID0gTXNnTGVuOworCisJaWYgKE1zZyAhPSBOVUxMKQorCXsKKwkJTmRpc01vdmVNZW1vcnkoUXVldWUtPkVudHJ5W1RhaWxdLk1zZywgTXNnLCBNc2dMZW4pOworCX0KKworCU5kaXNSZWxlYXNlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOworCXJldHVybiBUUlVFOworfQorCisvKiEgXGJyaWVmCSBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2hlbiBSZWN2IGdldHMgYSBNTE1FIG1lc3NhZ2UKKyAqCVxwYXJhbQkqUXVldWUJCQkgVGhlIE1MTUUgUXVldWUKKyAqCVxwYXJhbQkgVGltZVN0YW1wSGlnaAkgVGhlIHVwcGVyIDMyIGJpdCBvZiB0aW1lc3RhbXAKKyAqCVxwYXJhbQkgVGltZVN0YW1wTG93CSBUaGUgbG93ZXIgMzIgYml0IG9mIHRpbWVzdGFtcAorICoJXHBhcmFtCSBSc3NpCQkJIFRoZSByZWNlaXZpbmcgUlNTSSBzdHJlbmd0aAorICoJXHBhcmFtCSBNc2dMZW4gCQkgVGhlIGxlbmd0aCBvZiB0aGUgbWVzc2FnZQorICoJXHBhcmFtCSpNc2cJCQkgVGhlIG1lc3NhZ2UgcG9pbnRlcgorICoJXHJldHVybiAgVFJVRSBpZiBldmVyeXRoaW5nIG9rLCBGQUxTRSBvdGhlcndpc2UgKGxpa2UgUXVldWUgRnVsbCkKKyAqCVxwcmUKKyAqCVxwb3N0CisKKyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICovCitCT09MRUFOIE1sbWVFbnF1ZXVlRm9yUmVjdigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVTE9ORyBXY2lkLAorCUlOIFVMT05HIFRpbWVTdGFtcEhpZ2gsCisJSU4gVUxPTkcgVGltZVN0YW1wTG93LAorCUlOIFVDSEFSIFJzc2kwLAorCUlOIFVDSEFSIFJzc2kxLAorCUlOIFVDSEFSIFJzc2kyLAorCUlOIFVMT05HIE1zZ0xlbiwKKwlJTiBWT0lEICpNc2csCisJSU4gVUNIQVIgU2lnbmFsKQoreworCUlOVCAJCSBUYWlsLCBNYWNoaW5lOworCVBGUkFNRV84MDJfMTEgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpTXNnOworCUlOVAkJIE1zZ1R5cGU7CisJTUxNRV9RVUVVRQkqUXVldWUgPSAoTUxNRV9RVUVVRSAqKSZwQWQtPk1sbWUuUXVldWU7CisKKyNpZmRlZiBSQUxJTktfQVRFCisJLyogTm90aGluZyB0byBkbyBpbiBBVEUgbW9kZSAqLworCWlmKEFURV9PTihwQWQpKQorCQlyZXR1cm4gRkFMU0U7CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisJLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCisJLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0CisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwl7CisJCURCR1BSSU5UX0VSUigoIk1sbWVFbnF1ZXVlRm9yUmVjdjogZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwkvLyBGaXJzdCBjaGVjayB0aGUgc2l6ZSwgaXQgTVVTVCBub3QgZXhjZWVkIHRoZSBtbG1lIHF1ZXVlIHNpemUKKwlpZiAoTXNnTGVuID4gTUdNVF9ETUFfQlVGRkVSX1NJWkUpCisJeworCQlEQkdQUklOVF9FUlIoKCJNbG1lRW5xdWV1ZUZvclJlY3Y6IGZyYW1lIHRvbyBsYXJnZSwgc2l6ZSA9ICVsZCBcbiIsIE1zZ0xlbikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYgKE1sbWVRdWV1ZUZ1bGwoUXVldWUpKQorCXsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlpZiAoIU1zZ1R5cGVTdWJzdChwQWQsIHBGcmFtZSwgJk1hY2hpbmUsICZNc2dUeXBlKSkKKwkJeworCQkJREJHUFJJTlRfRVJSKCgiTWxtZUVucXVldWVGb3JSZWN2OiB1bi1yZWNvbmduaXplZCBtZ210LT5zdWJ0eXBlPSVkXG4iLHBGcmFtZS0+SGRyLkZDLlN1YlR5cGUpKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIE9LLCB3ZSBnb3QgYWxsIHRoZSBpbmZvcm1hdGlvbnMsIGl0IGlzIHRpbWUgdG8gcHV0IHRoaW5ncyBpbnRvIHF1ZXVlCisJTmRpc0FjcXVpcmVTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7CisJVGFpbCA9IFF1ZXVlLT5UYWlsOworCVF1ZXVlLT5UYWlsKys7CisJUXVldWUtPk51bSsrOworCWlmIChRdWV1ZS0+VGFpbCA9PSBNQVhfTEVOX09GX01MTUVfUVVFVUUpCisJeworCQlRdWV1ZS0+VGFpbCA9IDA7CisJfQorCVF1ZXVlLT5FbnRyeVtUYWlsXS5PY2N1cGllZCA9IFRSVUU7CisJUXVldWUtPkVudHJ5W1RhaWxdLk1hY2hpbmUgPSBNYWNoaW5lOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5Nc2dUeXBlID0gTXNnVHlwZTsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uTXNnTGVuICA9IE1zZ0xlbjsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uVGltZVN0YW1wLnUuTG93UGFydCA9IFRpbWVTdGFtcExvdzsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uVGltZVN0YW1wLnUuSGlnaFBhcnQgPSBUaW1lU3RhbXBIaWdoOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5Sc3NpMCA9IFJzc2kwOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5Sc3NpMSA9IFJzc2kxOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5Sc3NpMiA9IFJzc2kyOworCVF1ZXVlLT5FbnRyeVtUYWlsXS5TaWduYWwgPSBTaWduYWw7CisJUXVldWUtPkVudHJ5W1RhaWxdLldjaWQgPSAoVUNIQVIpV2NpZDsKKworCVF1ZXVlLT5FbnRyeVtUYWlsXS5DaGFubmVsID0gcEFkLT5MYXRjaFJmUmVncy5DaGFubmVsOworCisJaWYgKE1zZyAhPSBOVUxMKQorCXsKKwkJTmRpc01vdmVNZW1vcnkoUXVldWUtPkVudHJ5W1RhaWxdLk1zZywgTXNnLCBNc2dMZW4pOworCX0KKworCU5kaXNSZWxlYXNlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOworCisJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKworLyohIFxicmllZgkgRGVxdWV1ZSBhIG1lc3NhZ2UgZnJvbSB0aGUgTUxNRSBRdWV1ZQorICoJXHBhcmFtCSpRdWV1ZQkgIFRoZSBNTE1FIFF1ZXVlCisgKglccGFyYW0JKkVsZW0JICBUaGUgbWVzc2FnZSBkZXF1ZXVlZCBmcm9tIE1MTUUgUXVldWUKKyAqCVxyZXR1cm4gIFRSVUUgaWYgdGhlIEVsZW0gY29udGFpbnMgc29tZXRoaW5nLCBGQUxTRSBvdGhlcndpc2UKKyAqCVxwcmUKKyAqCVxwb3N0CisKKyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICovCitCT09MRUFOIE1sbWVEZXF1ZXVlKAorCUlOIE1MTUVfUVVFVUUgKlF1ZXVlLAorCU9VVCBNTE1FX1FVRVVFX0VMRU0gKipFbGVtKQoreworCU5kaXNBY3F1aXJlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOworCSpFbGVtID0gJihRdWV1ZS0+RW50cnlbUXVldWUtPkhlYWRdKTsKKwlRdWV1ZS0+TnVtLS07CisJUXVldWUtPkhlYWQrKzsKKwlpZiAoUXVldWUtPkhlYWQgPT0gTUFYX0xFTl9PRl9NTE1FX1FVRVVFKQorCXsKKwkJUXVldWUtPkhlYWQgPSAwOworCX0KKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKKwlyZXR1cm4gVFJVRTsKK30KKworLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCitWT0lECU1sbWVSZXN0YXJ0U3RhdGVNYWNoaW5lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUJPT0xFQU4JCQkJQ2FuY2VsbGVkOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVJlc3RhcnRTdGF0ZU1hY2hpbmUgXG4iKSk7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQlVQ0hBUiBpOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQkvLyBDYW5jZWwgYWxsIHRpbWVyIGV2ZW50cworCQkvLyBCZSBjYXJlZnVsIHRvIGNhbmNlbCBuZXcgYWRkZWQgdGltZXIKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXNzb2NUaW1lciwJICAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLCAgICZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLCAgJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwJICAgJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLAkgICAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLAkgICAmQ2FuY2VsbGVkKTsKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCQl7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmQ2FuY2VsbGVkKTsKKwkJfQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIENoYW5nZSBiYWNrIHRvIG9yaWdpbmFsIGNoYW5uZWwgaW4gY2FzZSBvZiBkb2luZyBzY2FuCisJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisKKwkvLyBSZXN1bWUgTVNEVSB3aGljaCBpcyB0dXJuZWQgb2ZmIGR1cm5pbmcgc2NhbgorCVJUTVBSZXN1bWVNc2R1VHJhbnNtaXNzaW9uKHBBZCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJLy8gU2V0IGFsbCBzdGF0ZSBtYWNoaW5lcyBiYWNrIElETEUKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAgICA9IENOVExfSURMRTsKKwkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgICA9IEFTU09DX0lETEU7CisJCXBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgICAgPSBBVVRIX1JFUV9JRExFOworCQlwQWQtPk1sbWUuQXV0aFJzcE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SU1BfSURMRTsKKwkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSAgICA9IFNZTkNfSURMRTsKKwkJcEFkLT5NbG1lLkFjdE1hY2hpbmUuQ3VyclN0YXRlICAgID0gQUNUX0lETEU7CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCXBBZC0+TWxtZS5EbHNNYWNoaW5lLkN1cnJTdGF0ZSAgICA9IERMU19JRExFOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworfQorCisvKiEgXGJyaWVmCXRlc3QgaWYgdGhlIE1MTUUgUXVldWUgaXMgZW1wdHkKKyAqCVxwYXJhbQkqUXVldWUJICBUaGUgTUxNRSBRdWV1ZQorICoJXHJldHVybiBUUlVFIGlmIHRoZSBRdWV1ZSBpcyBlbXB0eSwgRkFMU0Ugb3RoZXJ3aXNlCisgKglccHJlCisgKglccG9zdAorCisgSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAqLworQk9PTEVBTiBNbG1lUXVldWVFbXB0eSgKKwlJTiBNTE1FX1FVRVVFICpRdWV1ZSkKK3sKKwlCT09MRUFOIEFuczsKKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOworCUFucyA9IChRdWV1ZS0+TnVtID09IDApOworCU5kaXNSZWxlYXNlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOworCisJcmV0dXJuIEFuczsKK30KKworLyohIFxicmllZgkgdGVzdCBpZiB0aGUgTUxNRSBRdWV1ZSBpcyBmdWxsCisgKglccGFyYW0JICpRdWV1ZSAJIFRoZSBNTE1FIFF1ZXVlCisgKglccmV0dXJuICBUUlVFIGlmIHRoZSBRdWV1ZSBpcyBlbXB0eSwgRkFMU0Ugb3RoZXJ3aXNlCisgKglccHJlCisgKglccG9zdAorCisgSVJRTCA9IFBBU1NJVkVfTEVWRUwKKyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICovCitCT09MRUFOIE1sbWVRdWV1ZUZ1bGwoCisJSU4gTUxNRV9RVUVVRSAqUXVldWUpCit7CisJQk9PTEVBTiBBbnM7CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKKwlBbnMgPSAoUXVldWUtPk51bSA9PSBNQVhfTEVOX09GX01MTUVfUVVFVUUgfHwgUXVldWUtPkVudHJ5W1F1ZXVlLT5UYWlsXS5PY2N1cGllZCk7CisJTmRpc1JlbGVhc2VTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7CisKKwlyZXR1cm4gQW5zOworfQorCisvKiEgXGJyaWVmCSBUaGUgZGVzdHJ1Y3RvciBvZiBNTE1FIFF1ZXVlCisgKglccGFyYW0KKyAqCVxyZXR1cm4KKyAqCVxwcmUKKyAqCVxwb3N0CisgKglcbm90ZQlDbGVhciBNbG1lIFF1ZXVlLCBTZXQgUXVldWUtPk51bSB0byBaZXJvLgorCisgSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworICovCitWT0lEIE1sbWVRdWV1ZURlc3Ryb3koCisJSU4gTUxNRV9RVUVVRSAqcFF1ZXVlKQoreworCU5kaXNBY3F1aXJlU3BpbkxvY2soJihwUXVldWUtPkxvY2spKTsKKwlwUXVldWUtPk51bSAgPSAwOworCXBRdWV1ZS0+SGVhZCA9IDA7CisJcFF1ZXVlLT5UYWlsID0gMDsKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCYocFF1ZXVlLT5Mb2NrKSk7CisJTmRpc0ZyZWVTcGluTG9jaygmKHBRdWV1ZS0+TG9jaykpOworfQorCisvKiEgXGJyaWVmCSBUbyBzdWJzdGl0dXRlIHRoZSBtZXNzYWdlIHR5cGUgaWYgdGhlIG1lc3NhZ2UgaXMgY29taW5nIGZyb20gZXh0ZXJuYWwKKyAqCVxwYXJhbQlwRnJhbWUJCSAgIFRoZSBmcmFtZSByZWNlaXZlZAorICoJXHBhcmFtCSpNYWNoaW5lCSAgIFRoZSBzdGF0ZSBtYWNoaW5lCisgKglccGFyYW0JKk1zZ1R5cGUJICAgdGhlIG1lc3NhZ2UgdHlwZSBmb3IgdGhlIHN0YXRlIG1hY2hpbmUKKyAqCVxyZXR1cm4gVFJVRSBpZiB0aGUgc3Vic3RpdHV0aW9uIGlzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZQorICoJXHByZQorICoJXHBvc3QKKworIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKi8KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK0JPT0xFQU4gTXNnVHlwZVN1YnN0KAorCUlOIFBSVE1QX0FEQVBURVIgIHBBZCwKKwlJTiBQRlJBTUVfODAyXzExIHBGcmFtZSwKKwlPVVQgSU5UICpNYWNoaW5lLAorCU9VVCBJTlQgKk1zZ1R5cGUpCit7CisJVVNIT1JUCVNlcTsKKwlVQ0hBUglFQVBUeXBlOworCVBVQ0hBUglwRGF0YTsKKworCS8vIFBvaW50ZXIgdG8gc3RhcnQgb2YgZGF0YSBmcmFtZXMgaW5jbHVkaW5nIFNOQVAgaGVhZGVyCisJcERhdGEgPSAoUFVDSEFSKSBwRnJhbWUgKyBMRU5HVEhfODAyXzExOworCisJLy8gVGhlIG9ubHkgZGF0YSB0eXBlIHdpbGwgcGFzcyB0byB0aGlzIGZ1bmN0aW9uIGlzIEVBUE9MIGZyYW1lCisJaWYgKHBGcmFtZS0+SGRyLkZDLlR5cGUgPT0gQlRZUEVfREFUQSkKKwl7CisJCWlmIChOZGlzRXF1YWxNZW1vcnkoU05BUF9BSVJPTkVULCBwRGF0YSwgTEVOR1RIXzgwMl8xX0gpKQorCQl7CisJCQkvLyBDaXNjbyBBaXJvbmV0IFNOQVAgaGVhZGVyCisJCQkqTWFjaGluZSA9IEFJUk9ORVRfU1RBVEVfTUFDSElORTsKKwkJCSpNc2dUeXBlID0gTVQyX0FJUk9ORVRfTVNHOworCQkJcmV0dXJuIChUUlVFKTsKKwkJfQorI2lmZGVmIExFQVBfU1VQUE9SVAorCQlpZiAoIHBBZC0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSA9PSBDSVNDT19BdXRoTW9kZUxFQVAgKSAvL0xFQVAKKwkJeworCQkJLy8gTEVBUCBmcmFtZXMKKwkJCSpNYWNoaW5lID0gTEVBUF9TVEFURV9NQUNISU5FOworCQkJRUFQVHlwZSA9ICooKFVDSEFSKilwRnJhbWUgKyBMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0ggKyAxKTsKKwkJCXJldHVybiAoTGVhcE1zZ1R5cGVTdWJzdChFQVBUeXBlLCBNc2dUeXBlKSk7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCQl7CisJCQkqTWFjaGluZSA9IFdQQV9QU0tfU1RBVEVfTUFDSElORTsKKwkJCUVBUFR5cGUgPSAqKChVQ0hBUiopcEZyYW1lICsgTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IICsgMSk7CisJCQlyZXR1cm4oV3BhTXNnVHlwZVN1YnN0KEVBUFR5cGUsIE1zZ1R5cGUpKTsKKwkJfQorCX0KKworCXN3aXRjaCAocEZyYW1lLT5IZHIuRkMuU3ViVHlwZSkKKwl7CisJCWNhc2UgU1VCVFlQRV9BU1NPQ19SRVE6CisJCQkqTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7CisJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0FTU09DX1JFUTsKKwkJCWJyZWFrOworCQljYXNlIFNVQlRZUEVfQVNTT0NfUlNQOgorCQkJKk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOworCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9BU1NPQ19SU1A7CisJCQlicmVhazsKKwkJY2FzZSBTVUJUWVBFX1JFQVNTT0NfUkVROgorCQkJKk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOworCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9SRUFTU09DX1JFUTsKKwkJCWJyZWFrOworCQljYXNlIFNVQlRZUEVfUkVBU1NPQ19SU1A6CisJCQkqTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7CisJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX1JFQVNTT0NfUlNQOworCQkJYnJlYWs7CisJCWNhc2UgU1VCVFlQRV9QUk9CRV9SRVE6CisJCQkqTWFjaGluZSA9IFNZTkNfU1RBVEVfTUFDSElORTsKKwkJCSpNc2dUeXBlID0gTVQyX1BFRVJfUFJPQkVfUkVROworCQkJYnJlYWs7CisJCWNhc2UgU1VCVFlQRV9QUk9CRV9SU1A6CisJCQkqTWFjaGluZSA9IFNZTkNfU1RBVEVfTUFDSElORTsKKwkJCSpNc2dUeXBlID0gTVQyX1BFRVJfUFJPQkVfUlNQOworCQkJYnJlYWs7CisJCWNhc2UgU1VCVFlQRV9CRUFDT046CisJCQkqTWFjaGluZSA9IFNZTkNfU1RBVEVfTUFDSElORTsKKwkJCSpNc2dUeXBlID0gTVQyX1BFRVJfQkVBQ09OOworCQkJYnJlYWs7CisJCWNhc2UgU1VCVFlQRV9BVElNOgorCQkJKk1hY2hpbmUgPSBTWU5DX1NUQVRFX01BQ0hJTkU7CisJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0FUSU07CisJCQlicmVhazsKKwkJY2FzZSBTVUJUWVBFX0RJU0FTU09DOgorCQkJKk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOworCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9ESVNBU1NPQ19SRVE7CisJCQlicmVhazsKKwkJY2FzZSBTVUJUWVBFX0FVVEg6CisJCQkvLyBnZXQgdGhlIHNlcXVlbmNlIG51bWJlciBmcm9tIHBheWxvYWQgMjQgTWFjIEhlYWRlciArIDIgYnl0ZXMgYWxnb3JpdGhtCisJCQlOZGlzTW92ZU1lbW9yeSgmU2VxLCAmcEZyYW1lLT5PY3RldFsyXSwgc2l6ZW9mKFVTSE9SVCkpOworCQkJaWYgKFNlcSA9PSAxIHx8IFNlcSA9PSAzKQorCQkJeworCQkJCSpNYWNoaW5lID0gQVVUSF9SU1BfU1RBVEVfTUFDSElORTsKKwkJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0FVVEhfT0REOworCQkJfQorCQkJZWxzZSBpZiAoU2VxID09IDIgfHwgU2VxID09IDQpCisJCQl7CisJCQkJKk1hY2hpbmUgPSBBVVRIX1NUQVRFX01BQ0hJTkU7CisJCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9BVVRIX0VWRU47CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU1VCVFlQRV9ERUFVVEg6CisJCQkqTWFjaGluZSA9IEFVVEhfUlNQX1NUQVRFX01BQ0hJTkU7CisJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0RFQVVUSDsKKwkJCWJyZWFrOworCQljYXNlIFNVQlRZUEVfQUNUSU9OOgorCQkJKk1hY2hpbmUgPSBBQ1RJT05fU1RBVEVfTUFDSElORTsKKwkJCS8vICBTb21ldGltZXMgU3RhIHdpbGwgcmV0dXJuIHdpdGggY2F0ZWdvcnkgYnl0ZXMgd2l0aCBNU0IgPSAxLCBpZiB0aGV5IHJlY2VpdmUgY2F0b2dvcnkgb3V0IG9mIHRoZWlyIHN1cHBvcnQKKwkJCWlmICgocEZyYW1lLT5PY3RldFswXSYweDdGKSA+IE1BWF9QRUVSX0NBVEVfTVNHKQorCQkJeworCQkJCSpNc2dUeXBlID0gTVQyX0FDVF9JTlZBTElEOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCSpNc2dUeXBlID0gKHBGcmFtZS0+T2N0ZXRbMF0mMHg3Rik7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBGQUxTRTsKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBzdGF0ZV9tYWNoaW5lLmMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLyohIFxicmllZiBJbml0aWFsaXplIHRoZSBzdGF0ZSBtYWNoaW5lLgorICoJXHBhcmFtICpTCQkJcG9pbnRlciB0byB0aGUgc3RhdGUgbWFjaGluZQorICoJXHBhcmFtCVRyYW5zCQlTdGF0ZSBtYWNoaW5lIHRyYW5zaXRpb24gZnVuY3Rpb24KKyAqCVxwYXJhbQlTdE5yCQludW1iZXIgb2Ygc3RhdGVzCisgKglccGFyYW0JTXNnTnIJCW51bWJlciBvZiBtZXNzYWdlcworICoJXHBhcmFtCURlZkZ1bmMgCWRlZmF1bHQgZnVuY3Rpb24sIHdoZW4gdGhlcmUgaXMgaW52YWxpZCBzdGF0ZS9tZXNzYWdlIGNvbWJpbmF0aW9uCisgKglccGFyYW0JSW5pdFN0YXRlCWluaXRpYWwgc3RhdGUgb2YgdGhlIHN0YXRlIG1hY2hpbmUKKyAqCVxwYXJhbQlCYXNlCQlTdGF0ZU1hY2hpbmUgYmFzZSwgaW50ZXJuYWwgdXNlIG9ubHkKKyAqCVxwcmUgcF9zbSBzaG91bGQgYmUgYSBsZWdhbCBwb2ludGVyCisgKglccG9zdAorCisgSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworICovCitWT0lEIFN0YXRlTWFjaGluZUluaXQoCisJSU4gU1RBVEVfTUFDSElORSAqUywKKwlJTiBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSwKKwlJTiBVTE9ORyBTdE5yLAorCUlOIFVMT05HIE1zZ05yLAorCUlOIFNUQVRFX01BQ0hJTkVfRlVOQyBEZWZGdW5jLAorCUlOIFVMT05HIEluaXRTdGF0ZSwKKwlJTiBVTE9ORyBCYXNlKQoreworCVVMT05HIGksIGo7CisKKwkvLyBzZXQgbnVtYmVyIG9mIHN0YXRlcyBhbmQgbWVzc2FnZXMKKwlTLT5OclN0YXRlID0gU3ROcjsKKwlTLT5Ock1zZyAgID0gTXNnTnI7CisJUy0+QmFzZSAgICA9IEJhc2U7CisKKwlTLT5UcmFuc0Z1bmMgID0gVHJhbnM7CisKKwkvLyBpbml0IGFsbCBzdGF0ZSB0cmFuc2l0aW9uIHRvIGRlZmF1bHQgZnVuY3Rpb24KKwlmb3IgKGkgPSAwOyBpIDwgU3ROcjsgaSsrKQorCXsKKwkJZm9yIChqID0gMDsgaiA8IE1zZ05yOyBqKyspCisJCXsKKwkJCVMtPlRyYW5zRnVuY1tpICogTXNnTnIgKyBqXSA9IERlZkZ1bmM7CisJCX0KKwl9CisKKwkvLyBzZXQgdGhlIHN0YXJ0aW5nIHN0YXRlCisJUy0+Q3VyclN0YXRlID0gSW5pdFN0YXRlOworfQorCisvKiEgXGJyaWVmIFRoaXMgZnVuY3Rpb24gZmlsbHMgaW4gdGhlIGZ1bmN0aW9uIHBvaW50ZXIgaW50byB0aGUgY2VsbCBpbiB0aGUgc3RhdGUgbWFjaGluZQorICoJXHBhcmFtICpTCXBvaW50ZXIgdG8gdGhlIHN0YXRlIG1hY2hpbmUKKyAqCVxwYXJhbSBTdAlzdGF0ZQorICoJXHBhcmFtIE1zZwlpbmNvbWluZyBtZXNzYWdlCisgKglccGFyYW0gZgl0aGUgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiAoc3RhdGUsIG1lc3NhZ2UpIGNvbWJpbmF0aW9uIG9jY3VycyBhdCB0aGUgc3RhdGUgbWFjaGluZQorICoJXHByZSAqUyBzaG91bGQgYmUgYSBsZWdhbCBwb2ludGVyIHRvIHRoZSBzdGF0ZSBtYWNoaW5lLCBzdCwgbXNnLCBzaG91bGQgYmUgYWxsIHdpdGhpbiB0aGUgcmFuZ2UsIEJhc2Ugc2hvdWxkIGJlIHNldCBpbiB0aGUgaW5pdGlhbCBzdGF0ZQorICoJXHBvc3QKKworIElSUUwgPSBQQVNTSVZFX0xFVkVMCisKKyAqLworVk9JRCBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oCisJSU4gU1RBVEVfTUFDSElORSAqUywKKwlJTiBVTE9ORyBTdCwKKwlJTiBVTE9ORyBNc2csCisJSU4gU1RBVEVfTUFDSElORV9GVU5DIEZ1bmMpCit7CisJVUxPTkcgTXNnSWR4OworCisJTXNnSWR4ID0gTXNnIC0gUy0+QmFzZTsKKworCWlmIChTdCA8IFMtPk5yU3RhdGUgJiYgTXNnSWR4IDwgUy0+TnJNc2cpCisJeworCQkvLyBib3VuZGFyeSBjaGVja2luZyBiZWZvcmUgc2V0dGluZyB0aGUgYWN0aW9uCisJCVMtPlRyYW5zRnVuY1tTdCAqIFMtPk5yTXNnICsgTXNnSWR4XSA9IEZ1bmM7CisJfQorfQorCisvKiEgXGJyaWVmCSBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIHN0YXRlIHRyYW5zaXRpb24KKyAqCVxwYXJhbQkgKkFkYXB0ZXIgdGhlIE5JQyBhZGFwdGVyIHBvaW50ZXIKKyAqCVxwYXJhbQkgKlMgCSAgdGhlIHN0YXRlIG1hY2hpbmUKKyAqCVxwYXJhbQkgKkVsZW0JICB0aGUgbWVzc2FnZSB0byBiZSBleGVjdXRlZAorICoJXHJldHVybiAgIE5vbmUKKworIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgKi8KK1ZPSUQgU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBTVEFURV9NQUNISU5FICpTLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwkoKihTLT5UcmFuc0Z1bmNbUy0+Q3VyclN0YXRlICogUy0+TnJNc2cgKyBFbGVtLT5Nc2dUeXBlIC0gUy0+QmFzZV0pKShwQWQsIEVsZW0pOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoZSBkcm9wIGZ1bmN0aW9uLCB3aGVuIG1hY2hpbmUgZXhlY3V0ZXMgdGhpcywgdGhlIG1lc3NhZ2UgaXMgc2ltcGx5CisJCWlnbm9yZWQuIFRoaXMgZnVuY3Rpb24gZG9lcyBub3RoaW5nLCB0aGUgbWVzc2FnZSBpcyBmcmVlZCBpbgorCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKCkKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIERyb3AoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBsZnNyLmMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTGZzckluaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUxPTkcgU2VlZCkKK3sKKwlpZiAoU2VlZCA9PSAwKQorCQlwQWQtPk1sbWUuU2hpZnRSZWcgPSAxOworCWVsc2UKKwkJcEFkLT5NbG1lLlNoaWZ0UmVnID0gU2VlZDsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1VDSEFSIFJhbmRvbUJ5dGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUxPTkcgaTsKKwlVQ0hBUiBSLCBSZXN1bHQ7CisKKwlSID0gMDsKKworCWlmIChwQWQtPk1sbWUuU2hpZnRSZWcgPT0gMCkKKwlOZGlzR2V0U3lzdGVtVXBUaW1lKChVTE9ORyAqKSZwQWQtPk1sbWUuU2hpZnRSZWcpOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwl7CisJCWlmIChwQWQtPk1sbWUuU2hpZnRSZWcgJiAweDAwMDAwMDAxKQorCQl7CisJCQlwQWQtPk1sbWUuU2hpZnRSZWcgPSAoKHBBZC0+TWxtZS5TaGlmdFJlZyBeIExGU1JfTUFTSykgPj4gMSkgfCAweDgwMDAwMDAwOworCQkJUmVzdWx0ID0gMTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBBZC0+TWxtZS5TaGlmdFJlZyA9IHBBZC0+TWxtZS5TaGlmdFJlZyA+PiAxOworCQkJUmVzdWx0ID0gMDsKKwkJfQorCQlSID0gKFIgPDwgMSkgfCBSZXN1bHQ7CisJfQorCisJcmV0dXJuIFI7Cit9CisKK1ZPSUQgQXNpY1VwZGF0ZUF1dG9GYWxsQmFja1RhYmxlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBSYXRlVGFibGUpCit7CisJVUNIQVIJCQkJCWk7CisJSFRfRkJLX0NGRzBfU1RSVUMJCUh0Q2ZnMDsKKwlIVF9GQktfQ0ZHMV9TVFJVQwkJSHRDZmcxOworCUxHX0ZCS19DRkcwX1NUUlVDCQlMZ0NmZzA7CisJTEdfRkJLX0NGRzFfU1RSVUMJCUxnQ2ZnMTsKKwlQUlRNUF9UWF9SQVRFX1NXSVRDSAlwQ3VyclR4UmF0ZSwgcE5leHRUeFJhdGU7CisKKwkvLyBzZXQgdG8gaW5pdGlhbCB2YWx1ZQorCUh0Q2ZnMC53b3JkID0gMHg2NTQzMjEwMDsKKwlIdENmZzEud29yZCA9IDB4ZWRjYmE5ODg7CisJTGdDZmcwLndvcmQgPSAweGVkY2JhOTg4OworCUxnQ2ZnMS53b3JkID0gMHgwMDAwMjEwMDsKKworCXBOZXh0VHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKXBSYXRlVGFibGUrMTsKKwlmb3IgKGkgPSAxOyBpIDwgKigoUFVDSEFSKSBwUmF0ZVRhYmxlKTsgaSsrKQorCXsKKwkJcEN1cnJUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpcFJhdGVUYWJsZSsxK2k7CisJCXN3aXRjaCAocEN1cnJUeFJhdGUtPk1vZGUpCisJCXsKKwkJCWNhc2UgMDoJCS8vQ0NLCisJCQkJYnJlYWs7CisJCQljYXNlIDE6CQkvL09GRE0KKwkJCQl7CisJCQkJCXN3aXRjaChwQ3VyclR4UmF0ZS0+Q3Vyck1DUykKKwkJCQkJeworCQkJCQkJY2FzZSAwOgorCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTMEZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgMToKKwkJCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzFGQksgPSAocE5leHRUeFJhdGUtPk1vZGUgPT0gTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+Q3Vyck1DUys4KTogcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDI6CisJCQkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1MyRkJLID0gKHBOZXh0VHhSYXRlLT5Nb2RlID09IE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPkN1cnJNQ1MrOCk6IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAzOgorCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTM0ZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgNDoKKwkJCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzRGQksgPSAocE5leHRUeFJhdGUtPk1vZGUgPT0gTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+Q3Vyck1DUys4KTogcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDU6CisJCQkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1M1RkJLID0gKHBOZXh0VHhSYXRlLT5Nb2RlID09IE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPkN1cnJNQ1MrOCk6IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSA2OgorCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTNkZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgNzoKKwkJCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzdGQksgPSAocE5leHRUeFJhdGUtPk1vZGUgPT0gTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+Q3Vyck1DUys4KTogcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQljYXNlIDI6CQkvL0hULU1JWAorCQkJY2FzZSAzOgkJLy9IVC1HRgorCQkJCXsKKwkJCQkJaWYgKChwTmV4dFR4UmF0ZS0+TW9kZSA+PSBNT0RFX0hUTUlYKSAmJiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgIT0gcE5leHRUeFJhdGUtPkN1cnJNQ1MpKQorCQkJCQl7CisJCQkJCQlzd2l0Y2gocEN1cnJUeFJhdGUtPkN1cnJNQ1MpCisJCQkJCQl7CisJCQkJCQkJY2FzZSAwOgorCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1MwRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMToKKwkJCQkJCQkJSHRDZmcwLmZpZWxkLkhUTUNTMUZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDI6CisJCQkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzJGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAzOgorCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1MzRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgNDoKKwkJCQkJCQkJSHRDZmcwLmZpZWxkLkhUTUNTNEZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDU6CisJCQkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzVGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSA2OgorCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1M2RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgNzoKKwkJCQkJCQkJSHRDZmcwLmZpZWxkLkhUTUNTN0ZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDg6CisJCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzhGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSA5OgorCQkJCQkJCQlIdENmZzEuZmllbGQuSFRNQ1M5RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMTA6CisJCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzEwRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMTE6CisJCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzExRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMTI6CisJCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzEyRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMTM6CisJCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzEzRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMTQ6CisJCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzE0RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMTU6CisJCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzE1RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFzaWNVcGRhdGVBdXRvRmFsbEJhY2tUYWJsZTogbm90IHN1cHBvcnQgQ3Vyck1DUz0lZFxuIiwgcEN1cnJUeFJhdGUtPkN1cnJNQ1MpKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJfQorCisJCXBOZXh0VHhSYXRlID0gcEN1cnJUeFJhdGU7CisJfQorCisJUlRNUF9JT19XUklURTMyKHBBZCwgSFRfRkJLX0NGRzAsIEh0Q2ZnMC53b3JkKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIVF9GQktfQ0ZHMSwgSHRDZmcxLndvcmQpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIExHX0ZCS19DRkcwLCBMZ0NmZzAud29yZCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgTEdfRkJLX0NGRzEsIExnQ2ZnMS53b3JkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVNldCBNQUMgcmVnaXN0ZXIgdmFsdWUgYWNjb3JkaW5nIG9wZXJhdGlvbiBtb2RlLgorCQlPcGVyYXRpb25Nb2RlIEFORCBiTm9uR0ZFeGlzdCBhcmUgZm9yIE1NIGFuZCBHRiBQcm90ZWNpdG9uLgorCQlJZiBNTSBvciBHRiBtYXNrIGlzIG5vdCBzZXQsIHRob3NlIHBhc3NpbmcgYXJndW1lbnQgZG9lc24ndCBub3QgdGFrZSBlZmZlY3QuCisKKwkJT3BlcmF0aW9uIG1vZGUgbWVhbmluZzoKKwkJPSAwIDogUHVyZSBIVCwgbm8gcHJlb3RlY3Rpb24uCisJCT0gMHgwMTsgdGhlcmUgbWF5IGJlIG5vbi1IVCBkZXZpY2VzIGluIGJvdGggdGhlIGNvbnRyb2wgYW5kIGV4dGVuc2lvbiBjaGFubmVsLCBwcm90ZWN0aW9uIGlzIG9wdGlvbmFsIGluIEJTUy4KKwkJPSAweDEwOiBObyBUcmFuc21pc3Npb24gaW4gNDBNIGlzIHByb3RlY3RlZC4KKwkJPSAweDExOiBUcmFuc21pc3Npb24gaW4gYm90aCA0ME0gYW5kIDIwTSBzaGFsbCBiZSBwcm90ZWN0ZWQKKwkJaWYgKGJOb25HRkV4aXN0KQorCQkJd2Ugc2hvdWxkIGNob29zZSBub3QgdG8gdXNlIEdGLiBCdXQgc3RpbGwgc2V0IGNvcnJlY3QgQVNJQyByZWdpc3RlcnMuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCAJQXNpY1VwZGF0ZVByb3RlY3QoCisJSU4JCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOIAkJVVNIT1JUCQkJT3BlcmF0aW9uTW9kZSwKKwlJTiAJCVVDSEFSCQkJU2V0TWFzaywKKwlJTgkJQk9PTEVBTgkJCWJEaXNhYmxlQkdQcm90ZWN0LAorCUlOCQlCT09MRUFOCQkJYk5vbkdGRXhpc3QpCit7CisJUFJPVF9DRkdfU1RSVUMJUHJvdENmZywgUHJvdENmZzQ7CisJVUlOVDMyIFByb3RlY3RbNl07CisJVVNIT1JUCQkJb2Zmc2V0OworCVVDSEFSCQkJaTsKKwlVSU5UMzIgTWFjUmVnID0gMDsKKworI2lmZGVmIFJBTElOS19BVEUKKwlpZiAoQVRFX09OKHBBZCkpCisJCXJldHVybjsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlpZiAoIShwQWQtPkNvbW1vbkNmZy5iSFRQcm90ZWN0KSAmJiAoT3BlcmF0aW9uTW9kZSAhPSA4KSkKKwl7CisJCXJldHVybjsKKwl9CisKKwlpZiAocEFkLT5CQVRhYmxlLm51bUFzT3JpZ2luYXRvcikKKwl7CisJCS8vCisJCS8vIGVuYWJsZSB0aGUgUlRTL0NUUyB0byBhdm9pZCBjaGFubmVsIGNvbGxpc2lvbgorCQkvLworCQlTZXRNYXNrID0gQUxMTl9TRVRQUk9URUNUOworCQlPcGVyYXRpb25Nb2RlID0gODsKKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkvLyBDb25maWcgQVNJQyBSVFMgdGhyZXNob2xkIHJlZ2lzdGVyCisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9SVFNfQ0ZHLCAmTWFjUmVnKTsKKwlNYWNSZWcgJj0gMHhGRjAwMDBGRjsKKyNpZiAwCisJTWFjUmVnIHw9IChwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPDwgOCk7CisjZWxzZQorCS8vIElmIHRoZSB1c2VyIHdhbnQgZGlzYWJsZSBSdHNUaHJlc2hvbGQgYW5kIGVuYmFsZSBBbXNkdS9SYWxpbmstQWdncmVnYXRpb24sIHNldCB0aGUgUnRzVGhyZXNob2xkIGFzIDQwOTYKKyAgICAgICAgaWYgKCgKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCShwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGUpIHx8CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkocEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSA9PSBUUlVFKSkKKyAgICAgICAgICAgICYmIHBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA9PSBNQVhfUlRTX1RIUkVTSE9MRCkKKyAgICAgICAgeworCQkJTWFjUmVnIHw9ICgweDEwMDAgPDwgOCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisJCQlNYWNSZWcgfD0gKHBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA8PCA4KTsKKyAgICAgICAgfQorI2VuZGlmCisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9SVFNfQ0ZHLCBNYWNSZWcpOworCisJLy8gSW5pdGlhbCBjb21tb24gcHJvdGVjdGlvbiBzZXR0aW5ncworCVJUTVBaZXJvTWVtb3J5KFByb3RlY3QsIHNpemVvZihQcm90ZWN0KSk7CisJUHJvdENmZzQud29yZCA9IDA7CisJUHJvdENmZy53b3JkID0gMDsKKwlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd0dGNDAgPSAxOworCVByb3RDZmcuZmllbGQuVHhvcEFsbG93R0YyMCA9IDE7CisJUHJvdENmZy5maWVsZC5UeG9wQWxsb3dNTTQwID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd01NMjAgPSAxOworCVByb3RDZmcuZmllbGQuVHhvcEFsbG93T2ZkbSA9IDE7CisJUHJvdENmZy5maWVsZC5UeG9wQWxsb3dDY2sgPSAxOworCVByb3RDZmcuZmllbGQuUlRTVGhFbiA9IDE7CisJUHJvdENmZy5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKKworCS8vIHVwZGF0ZSBQSFkgbW9kZSBhbmQgcmF0ZQorCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCisJCVByb3RDZmcuZmllbGQuUHJvdGVjdFJhdGUgPSAweDQwMDA7CisJUHJvdENmZy5maWVsZC5Qcm90ZWN0UmF0ZSB8PSBwQWQtPkNvbW1vbkNmZy5SdHNSYXRlOworCisJLy8gSGFuZGxlIGxlZ2FjeShCL0cpIHByb3RlY3Rpb24KKwlpZiAoYkRpc2FibGVCR1Byb3RlY3QpCisJeworCQkvL1Byb3RDZmcuZmllbGQuUHJvdGVjdFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5SdHNSYXRlOworCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gMDsKKwkJUHJvdGVjdFswXSA9IFByb3RDZmcud29yZDsKKwkJUHJvdGVjdFsxXSA9IFByb3RDZmcud29yZDsKKwl9CisJZWxzZQorCXsKKwkJLy9Qcm90Q2ZnLmZpZWxkLlByb3RlY3RSYXRlID0gcEFkLT5Db21tb25DZmcuUnRzUmF0ZTsKKwkJUHJvdENmZy5maWVsZC5Qcm90ZWN0Q3RybCA9IDA7CQkJLy8gQ0NLIGRvIG5vdCBuZWVkIHRvIGJlIHByb3RlY3RlZAorCQlQcm90ZWN0WzBdID0gUHJvdENmZy53b3JkOworCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gQVNJQ19DVFM7CS8vIE9GRE0gbmVlZHMgdXNpbmcgQ0NLIHRvIHByb3RlY3QKKwkJUHJvdGVjdFsxXSA9IFByb3RDZmcud29yZDsKKwl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkvLyBEZWNpZGUgSFQgZnJhbWUgcHJvdGVjdGlvbi4KKwlpZiAoKFNldE1hc2sgJiBBTExOX1NFVFBST1RFQ1QpICE9IDApCisJeworCQlzd2l0Y2goT3BlcmF0aW9uTW9kZSkKKwkJeworCQkJY2FzZSAweDA6CisJCQkJLy8gTk8gUFJPVEVDVAorCQkJCS8vIDEuQWxsIFNUQXMgaW4gdGhlIEJTUyBhcmUgMjAvNDAgTUh6IEhUCisJCQkJLy8gMi4gaW4gYWkgMjAvNDBNSHogQlNTCisJCQkJLy8gMy4gYWxsIFNUQXMgYXJlIDIwTUh6IGluIGEgMjBNSHogQlNTCisJCQkJLy8gUHVyZSBIVC4gbm8gcHJvdGVjdGlvbi4KKworCQkJCS8vIE1NMjBfUFJPVF9DRkcKKwkJCQkvLwlSZXNlcnZlZCAoMzE6MjcpCisJCQkJLy8gCVBST1RfVFhPUCgyNToyMCkgLS0gMDEwMTExCisJCQkJLy8JUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pCisJCQkJLy8gIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpCisJCQkJLy8gCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDA0IChPRkRNIDI0TSkKKwkJCQlQcm90ZWN0WzJdID0gMHgwMTc0NDAwNDsKKworCQkJCS8vIE1NNDBfUFJPVF9DRkcKKwkJCQkvLwlSZXNlcnZlZCAoMzE6MjcpCisJCQkJLy8gCVBST1RfVFhPUCgyNToyMCkgLS0gMTExMTExCisJCQkJLy8JUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pCisJCQkJLy8gIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpCisJCQkJLy8gCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDg0IChkdXBsaWNhdGUgT0ZETSAyNE0pCisJCQkJUHJvdGVjdFszXSA9IDB4MDNmNDQwODQ7CisKKwkJCQkvLyBDRjIwX1BST1RfQ0ZHCisJCQkJLy8JUmVzZXJ2ZWQgKDMxOjI3KQorCQkJCS8vIAlQUk9UX1RYT1AoMjU6MjApIC0tIDAxMDExMQorCQkJCS8vCVBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKQorCQkJCS8vICBQUk9UX0NUUkwoMTc6MTYpIC0tIDAwIChOb25lKQorCQkJCS8vIAlQUk9UX1JBVEUoMTU6MCkgIC0tIDB4NDAwNCAoT0ZETSAyNE0pCisJCQkJUHJvdGVjdFs0XSA9IDB4MDE3NDQwMDQ7CisKKwkJCQkvLyBDRjQwX1BST1RfQ0ZHCisJCQkJLy8JUmVzZXJ2ZWQgKDMxOjI3KQorCQkJCS8vIAlQUk9UX1RYT1AoMjU6MjApIC0tIDExMTExMQorCQkJCS8vCVBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKQorCQkJCS8vICBQUk9UX0NUUkwoMTc6MTYpIC0tIDAwIChOb25lKQorCQkJCS8vIAlQUk9UX1JBVEUoMTU6MCkgIC0tIDB4NDA4NCAoZHVwbGljYXRlIE9GRE0gMjRNKQorCQkJCVByb3RlY3RbNV0gPSAweDAzZjQ0MDg0OworCisJCQkJaWYgKGJOb25HRkV4aXN0KQorCQkJCXsKKwkJCQkJLy8gUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3RpaW9uKQorCQkJCQkvLyBQUk9UX0NUUkwoMTc6MTYpIC0tIDAxIChSVFMvQ1RTKQorCQkJCQlQcm90ZWN0WzRdID0gMHgwMTc1NDAwNDsKKwkJCQkJUHJvdGVjdFs1XSA9IDB4MDNmNTQwODQ7CisJCQkJfQorCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBGQUxTRTsKKwkJCQlicmVhazsKKworIAkJCWNhc2UgMToKKwkJCQkvLyBUaGlzIGlzICJIVCBub24tbWVtYmVyIHByb3RlY3Rpb24gbW9kZS4iCisJCQkJLy8gSWYgdGhlcmUgbWF5IGJlIG5vbi1IVCBTVEFzIG15IEJTUworCQkJCVByb3RDZmcud29yZCA9IDB4MDE3NDQwMDQ7CS8vIFBST1RfQ1RSTCgxNzoxNikgOiAwIChOb25lKQorCQkJCVByb3RDZmc0LndvcmQgPSAweDAzZjQ0MDg0OyAvLyBkdXBsaWNhZXQgbGVnYWN5IDI0TS4gQlcgc2V0IDEuCisJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQpKQorCQkJCXsKKwkJCQkJUHJvdENmZy53b3JkID0gMHgwMTc0MDAwMzsJLy9FUlAgdXNlIFByb3RlY3Rpb24gYml0IGlzIHNldCwgdXNlIHByb3RlY3Rpb24gcmF0ZSBhdCBDbGF1c2UgMTguLgorCQkJCQlQcm90Q2ZnNC53b3JkID0gMHgwM2Y0MDAwMzsgLy8gRG9uJ3QgZHVwbGljYXRlIFJUUy9DVFMgaW4gQ0NLIG1vZGUuIDB4MDNmNDAwODM7CisJCQkJfQorCQkJCS8vQXNzaWduIFByb3RlY3Rpb24gbWV0aG9kIGZvciAyMCY0MCBNSHogcGFja2V0cworCQkJCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKKwkJCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOworCQkJCVByb3RDZmc0LmZpZWxkLlByb3RlY3RDdHJsID0gQVNJQ19SVFM7CisJCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7CisJCQkJUHJvdGVjdFsyXSA9IFByb3RDZmcud29yZDsKKwkJCQlQcm90ZWN0WzNdID0gUHJvdENmZzQud29yZDsKKwkJCQlQcm90ZWN0WzRdID0gUHJvdENmZy53b3JkOworCQkJCVByb3RlY3RbNV0gPSBQcm90Q2ZnNC53b3JkOworCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBUUlVFOworCQkJCWJyZWFrOworCisJCQljYXNlIDI6CisJCQkJLy8gSWYgb25seSBIVCBTVEFzIGFyZSBpbiBCU1MuIGF0IGxlYXN0IG9uZSBpcyAyME1Iei4gT25seSBwcm90ZWN0IDQwTUh6IHBhY2tldHMKKwkJCQlQcm90Q2ZnLndvcmQgPSAweDAxNzQ0MDA0OyAgLy8gUFJPVF9DVFJMKDE3OjE2KSA6IDAgKE5vbmUpCisJCQkJUHJvdENmZzQud29yZCA9IDB4MDNmNDQwODQ7IC8vIGR1cGxpY2FldCBsZWdhY3kgMjRNLiBCVyBzZXQgMS4KKworCQkJCS8vQXNzaWduIFByb3RlY3Rpb24gbWV0aG9kIGZvciA0ME1IeiBwYWNrZXRzCisJCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKKwkJCQlQcm90Q2ZnNC5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKKwkJCQlQcm90ZWN0WzJdID0gUHJvdENmZy53b3JkOworCQkJCVByb3RlY3RbM10gPSBQcm90Q2ZnNC53b3JkOworCQkJCWlmIChiTm9uR0ZFeGlzdCkKKwkJCQl7CisJCQkJCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKKwkJCQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKKwkJCQl9CisJCQkJUHJvdGVjdFs0XSA9IFByb3RDZmcud29yZDsKKwkJCQlQcm90ZWN0WzVdID0gUHJvdENmZzQud29yZDsKKworCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBGQUxTRTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAzOgorCQkJCS8vIEhUIG1peGVkIG1vZGUuCSBQUk9URUNUIEFMTCEKKwkJCQkvLyBBc3NpZ24gUmF0ZQorCQkJCVByb3RDZmcud29yZCA9IDB4MDE3NDQwMDQ7CS8vZHVwbGljYWV0IGxlZ2FjeSAyNE0uIEJXIHNldCAxLgorCQkJCVByb3RDZmc0LndvcmQgPSAweDAzZjQ0MDg0OworCQkJCS8vIGJvdGggMjBNSHogYW5kIDQwTUh6IGFyZSBwcm90ZWN0ZWQuIFdoZXRoZXIgdXNlIFJUUyBvciBDVFMtdG8tc2VsZiBkZXBlbmRzIG9uIHRoZQorCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEKSkKKwkJCQl7CisJCQkJCVByb3RDZmcud29yZCA9IDB4MDE3NDAwMDM7CS8vRVJQIHVzZSBQcm90ZWN0aW9uIGJpdCBpcyBzZXQsIHVzZSBwcm90ZWN0aW9uIHJhdGUgYXQgQ2xhdXNlIDE4Li4KKwkJCQkJUHJvdENmZzQud29yZCA9IDB4MDNmNDAwMDM7IC8vIERvbid0IGR1cGxpY2F0ZSBSVFMvQ1RTIGluIENDSyBtb2RlLiAweDAzZjQwMDgzCisJCQkJfQorCQkJCS8vQXNzaWduIFByb3RlY3Rpb24gbWV0aG9kIGZvciAyMCY0MCBNSHogcGFja2V0cworCQkJCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKKwkJCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOworCQkJCVByb3RDZmc0LmZpZWxkLlByb3RlY3RDdHJsID0gQVNJQ19SVFM7CisJCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7CisJCQkJUHJvdGVjdFsyXSA9IFByb3RDZmcud29yZDsKKwkJCQlQcm90ZWN0WzNdID0gUHJvdENmZzQud29yZDsKKwkJCQlQcm90ZWN0WzRdID0gUHJvdENmZy53b3JkOworCQkJCVByb3RlY3RbNV0gPSBQcm90Q2ZnNC53b3JkOworCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBUUlVFOworCQkJCWJyZWFrOworCisJCQljYXNlIDg6CisJCQkJLy8gU3BlY2lhbCBvbiBmb3IgQXRoZXJvcyBwcm9ibGVtIG4gY2hpcC4KKwkJCQlQcm90ZWN0WzJdID0gMHgwMTc1NDAwNDsKKwkJCQlQcm90ZWN0WzNdID0gMHgwM2Y1NDA4NDsKKwkJCQlQcm90ZWN0WzRdID0gMHgwMTc1NDAwNDsKKwkJCQlQcm90ZWN0WzVdID0gMHgwM2Y1NDA4NDsKKwkJCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJSVFNMb25nUHJvdE9uID0gVFJVRTsKKwkJCQlicmVhazsKKwkJfQorCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCW9mZnNldCA9IENDS19QUk9UX0NGRzsKKwlmb3IgKGkgPSAwO2kgPCA2O2krKykKKwl7CisJCWlmICgoU2V0TWFzayAmICgxPDwgaSkpKQorCQl7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQgKyBpKjQsIFByb3RlY3RbaV0pOworCQl9CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBc2ljU3dpdGNoQ2hhbm5lbCgKKwkJCQkJICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVQ0hBUgkJCUNoYW5uZWwsCisJSU4JQk9PTEVBTgkJCWJTY2FuKQoreworCVVMT05HCQkJUjIgPSAwLCBSMyA9IERFRkFVTFRfUkZfVFhfUE9XRVIsIFI0ID0gMDsKKwlDSEFSICAgIFR4UHdlciA9IDAsIFR4UHdlcjIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOyAvL0JicDk0ID0gQkJQUjk0X0RFRkFVTFQsIFR4UHdlcjIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCVVDSEFSCWluZGV4OworCVVJTlQzMiAJVmFsdWUgPSAwOyAvL0JicFJlZywgVmFsdWU7CisJUlRNUF9SRl9SRUdTICpSRlJlZ1RhYmxlOworCisJLy8gU2VhcmNoIFR4IHBvd2VyIHZhbHVlCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaW5kZXgrKykKKwl7CisJCWlmIChDaGFubmVsID09IHBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLkNoYW5uZWwpCisJCXsKKwkJCVR4UHdlciA9IHBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLlBvd2VyOworCQkJVHhQd2VyMiA9IHBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLlBvd2VyMjsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGluZGV4ID09IE1BWF9OVU1fT0ZfQ0hBTk5FTFMpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBc2ljU3dpdGNoQ2hhbm5lbDogQ2FudCBmaW5kIHRoZSBDaGFubmVsIyVkIFxuIiwgQ2hhbm5lbCkpOworCX0KKworI2lmZGVmIFJUMjg3MAorCS8vIFRoZSBSRiBwcm9ncmFtbWluZyBzZXF1ZW5jZSBpcyBkaWZmZXJlbmNlIGJldHdlZW4gM3h4eCBhbmQgMnh4eAorCWlmIChJU19SVDMwNzAocEFkKSAmJiAoKHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18zMDIwKSB8fCAocEFkLT5SZkljVHlwZSA9PSBSRklDXzIwMjApKSkKKwl7CisJCS8qIG1vZGlmeSBieSBXWSBmb3IgUmVhZCBSRiBSZWcuIGVycm9yICovCisJCVVDSEFSIFJGVmFsdWU7CisKKwkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNX09GXzMwMjBfQ0hOTDsgaW5kZXgrKykKKwkJeworCQkJaWYgKENoYW5uZWwgPT0gRnJlcUl0ZW1zMzAyMFtpbmRleF0uQ2hhbm5lbCkKKwkJCXsKKwkJCQkvLyBQcm9ncmFtbWluZyBjaGFubmVsIHBhcmFtZXRlcnMKKwkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDIsIEZyZXFJdGVtczMwMjBbaW5kZXhdLk4pOworCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwMywgRnJlcUl0ZW1zMzAyMFtpbmRleF0uSyk7CisKKwkJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwNiwgKFBVQ0hBUikmUkZWYWx1ZSk7CisJCQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgMHhGQykgfCBGcmVxSXRlbXMzMDIwW2luZGV4XS5SOworCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwNiwgKFVDSEFSKVJGVmFsdWUpOworCisJCQkJLy8gU2V0IFR4IFBvd2VyCisJCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMTIsIChQVUNIQVIpJlJGVmFsdWUpOworCQkJCVJGVmFsdWUgPSAoUkZWYWx1ZSAmIDB4RTApIHwgVHhQd2VyOworCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IxMiwgKFVDSEFSKVJGVmFsdWUpOworCisJCQkJLy8gU2V0IFJGIG9mZnNldAorCQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjIzLCAoUFVDSEFSKSZSRlZhbHVlKTsKKwkJCQlSRlZhbHVlID0gKFJGVmFsdWUgJiAweDgwKSB8IHBBZC0+UmZGcmVxT2Zmc2V0OworCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyMywgKFVDSEFSKVJGVmFsdWUpOworCisJCQkJLy8gU2V0IEJXCisJCQkJaWYgKCFiU2NhbiAmJiAocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzQwKSkKKwkJCQl7CisJCQkJCVJGVmFsdWUgPSBwQWQtPk1sbWUuQ2FsaUJXNDBSZlIyNDsKKwkJCQkJLy9ESVNBQkxFXzExTl9DSEVDSyhwQWQpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSRlZhbHVlID0gcEFkLT5NbG1lLkNhbGlCVzIwUmZSMjQ7CisJCQkJfQorCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNCwgKFVDSEFSKVJGVmFsdWUpOworCisJCQkJLy8gRW5hYmxlIFJGIHR1bmluZworCQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjA3LCAoUFVDSEFSKSZSRlZhbHVlKTsKKwkJCQlSRlZhbHVlID0gUkZWYWx1ZSB8IDB4MTsKKwkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDcsIChVQ0hBUilSRlZhbHVlKTsKKworCQkJCS8vIGxhdGNoIGNoYW5uZWwgZm9yIGZ1dHVyZSB1c2FnZS4KKwkJCQlwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPSBDaGFubmVsOworCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTd2l0Y2hDaGFubmVsIyVkKFJGPSVkLCBQd3IwPSVkLCBQd3IxPSVkLCAlZFQpLCBOPTB4JTAyWCwgSz0weCUwMlgsIFI9MHglMDJYXG4iLAorCQkJQ2hhbm5lbCwKKwkJCXBBZC0+UmZJY1R5cGUsCisJCQlUeFB3ZXIsCisJCQlUeFB3ZXIyLAorCQkJcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCwKKwkJCUZyZXFJdGVtczMwMjBbaW5kZXhdLk4sCisJCQlGcmVxSXRlbXMzMDIwW2luZGV4XS5LLAorCQkJRnJlcUl0ZW1zMzAyMFtpbmRleF0uUikpOworCX0KKwllbHNlCisjZW5kaWYgLy8gUlQyODcwIC8vCisJeworCQlSRlJlZ1RhYmxlID0gUkYyODUwUmVnVGFibGU7CisKKwkJc3dpdGNoIChwQWQtPlJmSWNUeXBlKQorCQl7CisJCQljYXNlIFJGSUNfMjgyMDoKKwkJCWNhc2UgUkZJQ18yODUwOgorCQkJY2FzZSBSRklDXzI3MjA6CisJCQljYXNlIFJGSUNfMjc1MDoKKworCQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNX09GXzI4NTBfQ0hOTDsgaW5kZXgrKykKKwkJCXsKKwkJCQlpZiAoQ2hhbm5lbCA9PSBSRlJlZ1RhYmxlW2luZGV4XS5DaGFubmVsKQorCQkJCXsKKwkJCQkJUjIgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMjsKKwkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKKwkJCQkJeworCQkJCQkJUjIgfD0gMHg0MDAwOwkvLyBJZiBUWHBhdGggaXMgMSwgYml0IDE0ID0gMTsKKwkJCQkJfQorCisJCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpCisJCQkJCXsKKwkJCQkJCVIyIHw9IDB4NDA7CS8vIHdyaXRlIDEgdG8gb2ZmIFJ4cGF0aC4KKwkJCQkJfQorCQkJCQllbHNlIGlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCisJCQkJCXsKKwkJCQkJCVIyIHw9IDB4MjAwNDA7CS8vIHdyaXRlIDEgdG8gb2ZmIFJ4UGF0aAorCQkJCQl9CisKKwkJCQkJaWYgKENoYW5uZWwgPiAxNCkKKwkJCQkJeworCQkJCQkJLy8gaW5pdGlhbGl6ZSBSMywgUjQKKwkJCQkJCVIzID0gKFJGUmVnVGFibGVbaW5kZXhdLlIzICYgMHhmZmZmYzFmZik7CisJCQkJCQlSNCA9IChSRlJlZ1RhYmxlW2luZGV4XS5SNCAmICh+MHgwMDFmODdjMCkpIHwgKHBBZC0+UmZGcmVxT2Zmc2V0IDw8IDE1KTsKKworCQkJCQkJLy8gNUcgYmFuZCBwb3dlciByYW5nZTogMHhGOX4wWDBGLCBUWDAgUmVnMyBiaXQ5L1RYMSBSZWc0IGJpdDY9IjAiIG1lYW5zIHRoZSBUWCBwb3dlciByZWR1Y2UgN2RCCisJCQkJCQkvLyBSMworCQkJCQkJaWYgKChUeFB3ZXIgPj0gLTcpICYmIChUeFB3ZXIgPCAwKSkKKwkJCQkJCXsKKwkJCQkJCQlUeFB3ZXIgPSAoNytUeFB3ZXIpOworCQkJCQkJCVR4UHdlciA9IChUeFB3ZXIgPiAweEYpID8gKDB4RikgOiAoVHhQd2VyKTsKKwkJCQkJCQlSMyB8PSAoVHhQd2VyIDw8IDEwKTsKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBc2ljU3dpdGNoQ2hhbm5lbDogVHhQd2VyPSVkIFxuIiwgVHhQd2VyKSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJVHhQd2VyID0gKFR4UHdlciA+IDB4RikgPyAoMHhGKSA6IChUeFB3ZXIpOworCQkJCQkJCVIzIHw9IChUeFB3ZXIgPDwgMTApIHwgKDEgPDwgOSk7CisJCQkJCQl9CisKKwkJCQkJCS8vIFI0CisJCQkJCQlpZiAoKFR4UHdlcjIgPj0gLTcpICYmIChUeFB3ZXIyIDwgMCkpCisJCQkJCQl7CisJCQkJCQkJVHhQd2VyMiA9ICg3K1R4UHdlcjIpOworCQkJCQkJCVR4UHdlcjIgPSAoVHhQd2VyMiA+IDB4RikgPyAoMHhGKSA6IChUeFB3ZXIyKTsKKwkJCQkJCQlSNCB8PSAoVHhQd2VyMiA8PCA3KTsKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBc2ljU3dpdGNoQ2hhbm5lbDogVHhQd2VyMj0lZCBcbiIsIFR4UHdlcjIpKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlUeFB3ZXIyID0gKFR4UHdlcjIgPiAweEYpID8gKDB4RikgOiAoVHhQd2VyMik7CisJCQkJCQkJUjQgfD0gKFR4UHdlcjIgPDwgNykgfCAoMSA8PCA2KTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCVIzID0gKFJGUmVnVGFibGVbaW5kZXhdLlIzICYgMHhmZmZmYzFmZikgfCAoVHhQd2VyIDw8IDkpOyAvLyBzZXQgVFggcG93ZXIwCisJCQkJCVI0ID0gKFJGUmVnVGFibGVbaW5kZXhdLlI0ICYgKH4weDAwMWY4N2MwKSkgfCAocEFkLT5SZkZyZXFPZmZzZXQgPDwgMTUpIHwgKFR4UHdlcjIgPDw2KTsvLyBTZXQgZnJlcSBPZmZzZXQgJiBUeFB3cjEKKwkJCQkJfQorCisJCQkJCS8vIEJhc2VkIG9uIEJCUCBjdXJyZW50IG1vZGUgYmVmb3JlIGNoYW5naW5nIFJGIGNoYW5uZWwuCisJCQkJCWlmICghYlNjYW4gJiYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkpCisJCQkJCXsKKwkJCQkJCVI0IHw9MHgyMDAwMDA7CisJCQkJCX0KKworCQkJCQkvLyBVcGRhdGUgdmFyaWFibGVzCisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA9IENoYW5uZWw7CisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjEgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMTsKKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5SMiA9IFIyOworCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIzID0gUjM7CisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgPSBSNDsKKworCQkJCQkvLyBTZXQgUkYgdmFsdWUgMSdzIHNldCBSM1tiaXQyXSA9IFswXQorCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIxKTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMik7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIChwQWQtPkxhdGNoUmZSZWdzLlIzICYgKH4weDA0KSkpOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlI0KTsKKworCQkJCQlSVE1QdXNlY0RlbGF5KDIwMCk7CisKKwkJCQkJLy8gU2V0IFJGIHZhbHVlIDIncyBzZXQgUjNbYml0Ml0gPSBbMV0KKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMSk7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjIpOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCAocEFkLT5MYXRjaFJmUmVncy5SMyB8IDB4MDQpKTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SNCk7CisKKwkJCQkJUlRNUHVzZWNEZWxheSgyMDApOworCisJCQkJCS8vIFNldCBSRiB2YWx1ZSAzJ3Mgc2V0IFIzW2JpdDJdID0gWzBdCisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjEpOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIyKTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgJiAofjB4MDQpKSk7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpOworCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvLyBDaGFuZ2UgQkJQIHNldHRpbmcgZHVyaW5nIHNpd3RjaCBmcm9tIGEtPmcsIGctPmEKKwlpZiAoQ2hhbm5lbCA8PSAxNCkKKwl7CisJICAgIFVMT05HCVR4UGluQ2ZnID0gMHgwMDA1MEYwQTsvL0dhcnkgMjAwNy8wOC8wOSAweDA1MEEwQQorCisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjYyLCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjYzLCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY0LCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjg2LCAwKTsvLygweDQ0IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsJLy8gQWNjb3JkaW5nIHRoZSBSb3J5J3Mgc3VnZ2VzdGlvbiB0byBzb2x2ZSB0aGUgbWlkZGxlIHJhbmdlIGlzc3VlLgorCQkvL1JUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgyLCAweDYyKTsKKworCQkvLyBSeCBIaWdoIHBvd2VyIFZHQSBvZmZzZXQgZm9yIExOQSBzZWxlY3QKKwkgICAgaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5FeHRlcm5hbExOQUZvckcpCisJICAgIHsKKwkgICAgICAgIFJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgyLCAweDYyKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjc1LCAweDQ2KTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkgICAgICAgIFJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgyLCAweDg0KTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjc1LCAweDUwKTsKKwkgICAgfQorCisJCS8vIDVHIGJhbmQgc2VsZWN0aW9uIFBJTiwgYml0MSBhbmQgYml0MiBhcmUgY29tcGxlbWVudAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmVmFsdWUpOworCQlWYWx1ZSAmPSAofjB4Nik7CisJCVZhbHVlIHw9ICgweDA0KTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIFZhbHVlKTsKKworICAgICAgICAvLyBUdXJuIG9mZiB1bnVzZWQgUEEgb3IgTE5BIHdoZW4gb25seSAxVCBvciAxUgorCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKQorCQl7CisJCQlUeFBpbkNmZyAmPSAweEZGRkZGRkYzOworCQl9CisJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCisJCXsKKwkJCVR4UGluQ2ZnICY9IDB4RkZGRkYzRkY7CisJCX0KKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QSU5fQ0ZHLCBUeFBpbkNmZyk7CisJfQorCWVsc2UKKwl7CisJICAgIFVMT05HCVR4UGluQ2ZnID0gMHgwMDA1MEYwNTsvL0dhcnkgMjAwNy84LzkgMHgwNTA1MDUKKworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2MiwgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2MywgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NCwgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4NiwgMCk7Ly8oMHg0NCAtIEdFVF9MTkFfR0FJTihwQWQpKSk7ICAgLy8gQWNjb3JkaW5nIHRoZSBSb3J5J3Mgc3VnZ2VzdGlvbiB0byBzb2x2ZSB0aGUgbWlkZGxlIHJhbmdlIGlzc3VlLgorCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MiwgMHhGMik7CisKKwkJLy8gUnggSGlnaCBwb3dlciBWR0Egb2Zmc2V0IGZvciBMTkEgc2VsZWN0CisJCWlmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuRXh0ZXJuYWxMTkFGb3JBKQorCQl7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3NSwgMHg0Nik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3NSwgMHg1MCk7CisJCX0KKworCQkvLyA1RyBiYW5kIHNlbGVjdGlvbiBQSU4sIGJpdDEgYW5kIGJpdDIgYXJlIGNvbXBsZW1lbnQKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJlZhbHVlKTsKKwkJVmFsdWUgJj0gKH4weDYpOworCQlWYWx1ZSB8PSAoMHgwMik7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7CisKKyAgICAgICAgLy8gVHVybiBvZmYgdW51c2VkIFBBIG9yIExOQSB3aGVuIG9ubHkgMVQgb3IgMVIKKwkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKKwkJeworCQkJVHhQaW5DZmcgJj0gMHhGRkZGRkZGMzsKKwl9CisJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCisJCXsKKwkJCVR4UGluQ2ZnICY9IDB4RkZGRkYzRkY7CisJfQorCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BJTl9DRkcsIFR4UGluQ2ZnKTsKKwl9CisKKyAgICAvLyBSNjYgc2hvdWxkIGJlIHNldCBhY2NvcmRpbmcgdG8gQ2hhbm5lbCBhbmQgdXNlIDIwTUh6IHdoZW4gc2Nhbm5pbmcKKwkvL1JUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCAoMHgyRSArIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJaWYgKGJTY2FuKQorCQlSVE1QU2V0QUdDSW5pdFZhbHVlKHBBZCwgQldfMjApOworCWVsc2UKKwkJUlRNUFNldEFHQ0luaXRWYWx1ZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyk7CisKKwkvLworCS8vIE9uIDExQSwgV2Ugc2hvdWxkIGRlbGF5IGFuZCB3YWl0IFJGL0JCUCB0byBiZSBzdGFibGUKKwkvLyBhbmQgdGhlIGFwcHJvcHJpYXRlIHRpbWUgc2hvdWxkIGJlIDEwMDAgbWljcm8gc2Vjb25kcworCS8vIDIwMDUvMDYvMDUgLSBPbiAxMUcsIFdlIGFsc28gbmVlZCB0aGlzIGRlbGF5IHRpbWUuIE90aGVyd2lzZSBpdCdzIGRpZmZpY3VsdCB0byBwYXNzIHRoZSBXSFFMLgorCS8vCisJUlRNUHVzZWNEZWxheSgxMDAwKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN3aXRjaENoYW5uZWwjJWQoUkY9JWQsIFB3cjA9JWx1LCBQd3IxPSVsdSwgJWRUKSB0byAsIFIxPTB4JTA4bHgsIFIyPTB4JTA4bHgsIFIzPTB4JTA4bHgsIFI0PTB4JTA4bHhcbiIsCisJCQkJCQkJICBDaGFubmVsLAorCQkJCQkJCSAgcEFkLT5SZkljVHlwZSwKKwkJCQkJCQkgIChSMyAmIDB4MDAwMDNlMDApID4+IDksCisJCQkJCQkJICAoUjQgJiAweDAwMDAwN2MwKSA+PiA2LAorCQkJCQkJCSAgcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCwKKwkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjEsCisJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlIyLAorCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMywKKwkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciAyNDIxIG9ubHksIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgZHVyaW5nCisJCXNpdGUgc3VydmV5LiBJdCdzIG9ubHkgcmVxdWlyZWQgYWZ0ZXIgTklDIGRlY2lkZWQgdG8gc3RheSBhdCBhIGNoYW5uZWwKKwkJZm9yIGEgbG9uZ2VyIHBlcmlvZC4KKwkJV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgaXQncyBhbHdheXMgYWZ0ZXIgQXNpY1N3aXRjaENoYW5uZWwoKS4KKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNMb2NrQ2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiBDaGFubmVsKQoreworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRAlBc2ljQW50ZW5uYVNlbGVjdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUNoYW5uZWwpCit7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlBbnRlbm5hIG1pc2NlbGxhbmVvdXMgc2V0dGluZy4KKworCUFyZ3VtZW50czoKKwkJcEFkCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlCYW5kU3RhdGUJCQkJSW5kaWNhdGUgY3VycmVudCBCYW5kIFN0YXRlLgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMIDw9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCQkxLikgRnJhbWUgRW5kIHR5cGUgY29udHJvbAorCQkJb25seSB2YWxpZCBmb3IgRyBvbmx5IChSRl8yNTI3ICYgUkZfMjUyOSkKKwkJCTA6IG1lYW5zIERQRFQsIHNldCBCQlAgUjQgYml0IDUgdG8gMQorCQkJMTogbWVhbnMgU1BEVCwgc2V0IEJCUCBSNCBiaXQgNSB0byAwCisKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQXNpY0FudGVubmFTZXR0aW5nKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCUFCR0JBTkRfU1RBVEUJQmFuZFN0YXRlKQoreworfQorCitWT0lEIEFzaWNSZlR1bmluZ0V4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUdpdmVzIENDSyBUWCByYXRlIDIgbW9yZSBkQiBUWCBwb3dlci4KKwkJVGhpcyByb3V0aW5lIHdvcmtzIG9ubHkgaW4gTElOSyBVUCBpbiBJTkZSQVNUUlVDVFVSRSBtb2RlLgorCisJCWNhbGN1bGF0ZSBkZXNpcmVkIFR4IHBvd2VyIGluIFJGIFIzLlR4MH41LAlzaG91bGQgY29uc2lkZXIgLQorCQkwLiBpZiBjdXJyZW50IHJhZGlvIGlzIGEgbm9pc3kgZW52aXJvbm1lbnQgKHBBZC0+RHJzQ291bnRlcnMuZk5vaXN5RW52aXJvbm1lbnQpCisJCTEuIFR4UG93ZXJQZXJjZW50YWdlCisJCTIuIGF1dG8gY2FsaWJyYXRpb24gYmFzZWQgb24gVFNTSSBmZWVkYmFjaworCQkzLiBleHRyYSAyIGRiIGZvciBDQ0sKKwkJNC4gLTEwIGRiIHVwb24gdmVyeS1zaG9ydCBkaXN0YW5jZSAoQXZnUlNTSSA+PSAtNDBkYikgdG8gQVAKKworCU5PVEU6IFNpbmNlIHRoaXMgcm91dGluZSByZXF1aXJlcyB0aGUgdmFsdWUgb2YgKHBBZC0+RHJzQ291bnRlcnMuZk5vaXN5RW52aXJvbm1lbnQpLAorCQlpdCBzaG91bGQgYmUgY2FsbGVkIEFGVEVSIE1sbWVEeW5hbWljVHhSYXRTd2l0Y2hpbmcoKQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY0FkanVzdFR4UG93ZXIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJSU5UCQkJaSwgajsKKwlDSEFSCQlEZWx0YVB3ciA9IDA7CisJQk9PTEVBTgkJYkF1dG9UeEFnYyA9IEZBTFNFOworCVVDSEFSCQlUc3NpUmVmLCAqcFRzc2lNaW51c0JvdW5kYXJ5LCAqcFRzc2lQbHVzQm91bmRhcnksIFR4QWdjU3RlcDsKKwlVQ0hBUgkJQmJwUjEgPSAwLCBCYnBSNDkgPSAwLCBpZHg7CisJUENIQVIJCXBUeEFnY0NvbXBlbnNhdGU7CisJVUxPTkcJCVR4UHdyWzVdOworCUNIQVIJCVZhbHVlOworCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkKKwl7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA+IDE0KQorCQl7CisJCQlUeFB3clswXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFswXTsKKwkJCVR4UHdyWzFdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzFdOworCQkJVHhQd3JbMl0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbMl07CisJCQlUeFB3clszXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFszXTsKKwkJCVR4UHdyWzRdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzRdOworCQl9CisJCWVsc2UKKwkJeworCQkJVHhQd3JbMF0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbMF07CisJCQlUeFB3clsxXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFsxXTsKKwkJCVR4UHdyWzJdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzJdOworCQkJVHhQd3JbM10gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbM107CisJCQlUeFB3cls0XSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFs0XTsKKwkJfQorCX0KKwllbHNlCisJeworCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQorCQl7CisJCQlUeFB3clswXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFswXTsKKwkJCVR4UHdyWzFdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzFdOworCQkJVHhQd3JbMl0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbMl07CisJCQlUeFB3clszXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFszXTsKKwkJCVR4UHdyWzRdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzRdOworCQl9CisJCWVsc2UKKwkJeworCQkJVHhQd3JbMF0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbMF07CisJCQlUeFB3clsxXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFsxXTsKKwkJCVR4UHdyWzJdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzJdOworCQkJVHhQd3JbM10gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbM107CisJCQlUeFB3cls0XSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFs0XTsKKwkJfQorCX0KKworCS8vIFRYIHBvd2VyIGNvbXBlbnNhdGlvbiBmb3IgdGVtcGVyYXR1cmUgdmFyaWF0aW9uIGJhc2VkIG9uIFRTU0kuIHRyeSBldmVyeSA0IHNlY29uZAorCWlmIChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDQgPT0gMCkKKwl7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KQorCQl7CisJCQkvKiBiZyBjaGFubmVsICovCisJCQliQXV0b1R4QWdjICAgICAgICAgPSBwQWQtPmJBdXRvVHhBZ2NHOworCQkJVHNzaVJlZiAgICAgICAgICAgID0gcEFkLT5Uc3NpUmVmRzsKKwkJCXBUc3NpTWludXNCb3VuZGFyeSA9ICZwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1swXTsKKwkJCXBUc3NpUGx1c0JvdW5kYXJ5ICA9ICZwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzBdOworCQkJVHhBZ2NTdGVwICAgICAgICAgID0gcEFkLT5UeEFnY1N0ZXBHOworCQkJcFR4QWdjQ29tcGVuc2F0ZSAgID0gJnBBZC0+VHhBZ2NDb21wZW5zYXRlRzsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIGEgY2hhbm5lbCAqLworCQkJYkF1dG9UeEFnYyAgICAgICAgID0gcEFkLT5iQXV0b1R4QWdjQTsKKwkJCVRzc2lSZWYgICAgICAgICAgICA9IHBBZC0+VHNzaVJlZkE7CisJCQlwVHNzaU1pbnVzQm91bmRhcnkgPSAmcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbMF07CisJCQlwVHNzaVBsdXNCb3VuZGFyeSAgPSAmcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVswXTsKKwkJCVR4QWdjU3RlcCAgICAgICAgICA9IHBBZC0+VHhBZ2NTdGVwQTsKKwkJCXBUeEFnY0NvbXBlbnNhdGUgICA9ICZwQWQtPlR4QWdjQ29tcGVuc2F0ZUE7CisJCX0KKworCQlpZiAoYkF1dG9UeEFnYykKKwkJeworCQkJLyogQmJwUjEgaXMgdW5zaWduZWQgY2hhciAqLworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0OSwgJkJicFI0OSk7CisKKwkJCS8qIChwKSBUc3NpUGx1c0JvdW5kYXJ5R1swXSA9IDAgPSAobSkgVHNzaU1pbnVzQm91bmRhcnlHWzBdICovCisJCQkvKiBjb21wZW5zYXRlOiArNCAgICAgKzMgICArMiAgICsxICAgIDAgICAtMSAgIC0yICAgLTMgICAtNCAqIHN0ZXBzICovCisJCQkvKiBzdGVwIHZhbHVlIGlzIGRlZmluZWQgaW4gcEFkLT5UeEFnY1N0ZXBHIGZvciB0eCBwb3dlciB2YWx1ZSAqLworCisJCQkvKiBbNF0rMStbNF0gICBwNCAgICAgcDMgICBwMiAgIHAxICAgbzEgICBtMSAgIG0yICAgbTMgICBtNCAqLworCQkJLyogZXg6ICAgICAgICAgMHgwMCAweDE1IDB4MjUgMHg0NSAweDg4IDB4QTAgMHhCNSAweEQwIDB4RjAKKwkJCSAgIGFib3ZlIHZhbHVlIGFyZSBleGFtaW5lZCBpbiBtYXNzIGZhY3RvcnkgcHJvZHVjdGlvbiAqLworCQkJLyogICAgICAgICAgICAgWzRdICAgIFszXSAgWzJdICBbMV0gIFswXSAgWzFdICBbMl0gIFszXSAgWzRdICovCisKKwkJCS8qIHBsdXMgKCspIGlzIDB4MDAgfiAweDQ1LCBtaW51cyAoLSkgaXMgMHhhMCB+IDB4ZjAgKi8KKwkJCS8qIGlmIHZhbHVlIGlzIGJldHdlZW4gcDEgfiBvMSBvciBvMSB+IHMxLCBubyBuZWVkIHRvIGFkanVzdCB0eCBwb3dlciAqLworCQkJLyogaWYgdmFsdWUgaXMgMHhhNSwgdHggcG93ZXIgd2lsbCBiZSAtPSBUeEFnY1N0ZXAqKDItMSkgKi8KKworCQkJaWYgKEJicFI0OSA+IHBUc3NpTWludXNCb3VuZGFyeVsxXSkKKwkJCXsKKwkJCQkvLyBSZWFkaW5nIGlzIGxhcmdlciB0aGFuIHRoZSByZWZlcmVuY2UgdmFsdWUKKwkJCQkvLyBjaGVjayBmb3IgaG93IGxhcmdlIHdlIG5lZWQgdG8gZGVjcmVhc2UgdGhlIFR4IHBvd2VyCisJCQkJZm9yIChpZHggPSAxOyBpZHggPCA1OyBpZHgrKykKKwkJCQl7CisJCQkJCWlmIChCYnBSNDkgPD0gcFRzc2lNaW51c0JvdW5kYXJ5W2lkeF0pICAvLyBGb3VuZCB0aGUgcmFuZ2UKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvLyBUaGUgaW5kZXggaXMgdGhlIHN0ZXAgd2Ugc2hvdWxkIGRlY3JlYXNlLCBpZHggPSAwIG1lYW5zIHRoZXJlIGlzIG5vdGhpbmcgdG8gY29tcGVuc2F0ZQorLy8JCQkJaWYgKFIzID4gKFVMT05HKSAoVHhBZ2NTdGVwICogKGlkeC0xKSkpCisJCQkJCSpwVHhBZ2NDb21wZW5zYXRlID0gLShUeEFnY1N0ZXAgKiAoaWR4LTEpKTsKKy8vCQkJCWVsc2UKKy8vCQkJCQkqcFR4QWdjQ29tcGVuc2F0ZSA9IC0oKFVDSEFSKVIzKTsKKworCQkJCURlbHRhUHdyICs9ICgqcFR4QWdjQ29tcGVuc2F0ZSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0gVHggUG93ZXIsIEJCUCBSMT0leCwgVHNzaVJlZj0leCwgVHhBZ2NTdGVwPSV4LCBzdGVwID0gLSVkXG4iLAorCQkJCQlCYnBSNDksIFRzc2lSZWYsIFR4QWdjU3RlcCwgaWR4LTEpKTsKKwkJCX0KKwkJCWVsc2UgaWYgKEJicFI0OSA8IHBUc3NpUGx1c0JvdW5kYXJ5WzFdKQorCQkJeworCQkJCS8vIFJlYWRpbmcgaXMgc21hbGxlciB0aGFuIHRoZSByZWZlcmVuY2UgdmFsdWUKKwkJCQkvLyBjaGVjayBmb3IgaG93IGxhcmdlIHdlIG5lZWQgdG8gaW5jcmVhc2UgdGhlIFR4IHBvd2VyCisJCQkJZm9yIChpZHggPSAxOyBpZHggPCA1OyBpZHgrKykKKwkJCQl7CisJCQkJCWlmIChCYnBSNDkgPj0gcFRzc2lQbHVzQm91bmRhcnlbaWR4XSkgICAvLyBGb3VuZCB0aGUgcmFuZ2UKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvLyBUaGUgaW5kZXggaXMgdGhlIHN0ZXAgd2Ugc2hvdWxkIGluY3JlYXNlLCBpZHggPSAwIG1lYW5zIHRoZXJlIGlzIG5vdGhpbmcgdG8gY29tcGVuc2F0ZQorCQkJCSpwVHhBZ2NDb21wZW5zYXRlID0gVHhBZ2NTdGVwICogKGlkeC0xKTsKKwkJCQlEZWx0YVB3ciArPSAoKnBUeEFnY0NvbXBlbnNhdGUpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIisrIFR4IFBvd2VyLCBCQlAgUjE9JXgsIFRzc2lSZWY9JXgsIFR4QWdjU3RlcD0leCwgc3RlcCA9ICslZFxuIiwKKwkJCQkJQmJwUjQ5LCBUc3NpUmVmLCBUeEFnY1N0ZXAsIGlkeC0xKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJKnBUeEFnY0NvbXBlbnNhdGUgPSAwOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiAgIFR4IFBvd2VyLCBCQlAgUjQ5PSV4LCBUc3NpUmVmPSV4LCBUeEFnY1N0ZXA9JXgsIHN0ZXAgPSArJWRcbiIsCisJCQkJCUJicFI0OSwgVHNzaVJlZiwgVHhBZ2NTdGVwLCAwKSk7CisJCQl9CisJCX0KKwl9CisJZWxzZQorCXsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpCisJCXsKKwkJCWJBdXRvVHhBZ2MgICAgICAgICA9IHBBZC0+YkF1dG9UeEFnY0c7CisJCQlwVHhBZ2NDb21wZW5zYXRlICAgPSAmcEFkLT5UeEFnY0NvbXBlbnNhdGVHOworCQl9CisJCWVsc2UKKwkJeworCQkJYkF1dG9UeEFnYyAgICAgICAgID0gcEFkLT5iQXV0b1R4QWdjQTsKKwkJCXBUeEFnY0NvbXBlbnNhdGUgICA9ICZwQWQtPlR4QWdjQ29tcGVuc2F0ZUE7CisJCX0KKworCQlpZiAoYkF1dG9UeEFnYykKKwkJCURlbHRhUHdyICs9ICgqcFR4QWdjQ29tcGVuc2F0ZSk7CisJfQorCisJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCAmQmJwUjEpOworCUJicFIxICY9IDB4RkM7CisKKyNpZmRlZiBTSU5HTEVfU0tVCisJLy8gSGFuZGxlIHJlZ3VsYXRvcnkgbWF4IHR4IHBvd2VyIGNvbnN0cmFpbgorCWRvCisJeworCQlVQ0hBUiAgICBUeFB3ckluRUVQUk9NID0gMHhGRiwgQ291bnRyeVR4UHdyID0gMHhGRiwgY3JpdGVyaW9uOworCQlVQ0hBUiAgICBBZGp1c3RNYXhUeFB3cls0MF07CisKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkgLy8gNUcgYmFuZAorCQkJVHhQd3JJbkVFUFJPTSA9ICgocEFkLT5Db21tb25DZmcuRGVmaW5lTWF4VHhQd3IgJiAweEZGMDApID4+IDgpOworCQllbHNlIC8vIDIuNEcgYmFuZAorCQkJVHhQd3JJbkVFUFJPTSA9IChwQWQtPkNvbW1vbkNmZy5EZWZpbmVNYXhUeFB3ciAmIDB4MDBGRik7CisJCUNvdW50cnlUeFB3ciA9IEdldEN1bnRyeU1heFR4UHdyKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisKKwkJLy8gZXJyb3IgaGFuZGxpbmcsIHJhbmdlIGNoZWNrCisJCWlmICgoVHhQd3JJbkVFUFJPTSA+IDB4NTApIHx8IChDb3VudHJ5VHhQd3IgPiAweDUwKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJBc2ljQWRqdXN0VHhQb3dlciAtIEludmFsaWQgbWF4IHR4IHBvd2VyICg9MHglMDJ4KSwgQ291bnRyeVR4UHdyPSVkXG4iLCBUeFB3ckluRUVQUk9NLCBDb3VudHJ5VHhQd3IpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY3JpdGVyaW9uID0gKigoUFVDSEFSKVR4UHdyICsgMikgJiAweEY7ICAgICAgICAvLyBGQUUgdXNlIE9GRE0gNk0gYXMgY3JpdGVyaW9uCisKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiQXNpY0FkanVzdFR4UG93ZXIgKGNyaXRlcmlvbj0lZCwgVHhQd3JJbkVFUFJPTT0lZCwgQ291bnRyeVR4UHdyPSVkKVxuIiwgY3JpdGVyaW9uLCBUeFB3ckluRUVQUk9NLCBDb3VudHJ5VHhQd3IpKTsKKworCQkvLyBBZGp1c3QgbWF4IHR4IHBvd2VyIGFjY29yZGluZyB0byB0aGUgcmVsYXRpb25zaGlwIG9mIHR4IHBvd2VyIGluIEUyUFJPTQorCQlmb3IgKGk9MDsgaTw1OyBpKyspCisJCXsKKwkJCS8vIENDSyB3aWxsIGhhdmUgNGRCbSBsYXJnZXIgdGhhbiBPRkRNCisJCQkvLyBUaGVyZWZvcmUsIHdlIHNob3VsZCBzZXBhcmF0ZSB0byBwYXJzZSB0aGUgdHggcG93ZXIgZmllbGQKKwkJCWlmIChpID09IDApCisJCQl7CisJCQkJZm9yIChqPTA7IGo8ODsgaisrKQorCQkJCXsKKwkJCQkJVmFsdWUgPSAoQ0hBUikoKFR4UHdyW2ldID4+IGoqNCkgJiAweDBGKTsKKworCQkJCQlpZiAoaiA8IDQpCisJCQkJCXsKKwkJCQkJCS8vIENDSyB3aWxsIGhhdmUgNGRCbSBsYXJnZXIgdGhhbiBPRkRNCisJCQkJCQlBZGp1c3RNYXhUeFB3cltpKjgral0gPSBUeFB3ckluRUVQUk9NICsgKFZhbHVlIC0gY3JpdGVyaW9uKSArIDQ7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlBZGp1c3RNYXhUeFB3cltpKjgral0gPSBUeFB3ckluRUVQUk9NICsgKFZhbHVlIC0gY3JpdGVyaW9uKTsKKwkJCQkJfQorCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJBc2ljQWRqdXN0VHhQb3dlciAoaS9qPSVkLyVkLCBWYWx1ZT0lZCwgJWQpXG4iLCBpLCBqLCBWYWx1ZSwgQWRqdXN0TWF4VHhQd3JbaSo4K2pdKSk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWZvciAoaj0wOyBqPDg7IGorKykKKwkJCQl7CisJCQkJCVZhbHVlID0gKENIQVIpKChUeFB3cltpXSA+PiBqKjQpICYgMHgwRik7CisKKwkJCQkJQWRqdXN0TWF4VHhQd3JbaSo4K2pdID0gVHhQd3JJbkVFUFJPTSArIChWYWx1ZSAtIGNyaXRlcmlvbik7CisJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIkFzaWNBZGp1c3RUeFBvd2VyIChpL2o9JWQvJWQsIFZhbHVlPSVkLCAlZClcbiIsIGksIGosIFZhbHVlLCBBZGp1c3RNYXhUeFB3cltpKjgral0pKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBBZGp1c3QgdHggcG93ZXIgYWNjb3JkaW5nIHRvIHRoZSByZWxhdGlvbnNoaXAKKwkJZm9yIChpPTA7IGk8NTsgaSsrKQorCQl7CisJCQlpZiAoVHhQd3JbaV0gIT0gMHhmZmZmZmZmZikKKwkJCXsKKwkJCQlmb3IgKGo9MDsgajw4OyBqKyspCisJCQkJeworCQkJCQlWYWx1ZSA9IChDSEFSKSgoVHhQd3JbaV0gPj4gaio0KSAmIDB4MEYpOworCisJCQkJCS8vIFRoZSBzeXN0ZW0gdHggcG93ZXIgaXMgbGFyZ2VyIHRoYW4gdGhlIHJlZ3VsYXRvcnksIHRoZSBwb3dlciBzaG91bGQgYmUgcmVzdHJhaW4KKwkJCQkJaWYgKEFkanVzdE1heFR4UHdyW2kqOCtqXSA+IENvdW50cnlUeFB3cikKKwkJCQkJeworCQkJCQkJLy8gZGVjcmVhc2UgdG8gemVybyBhbmQgZG9uJ3QgbmVlZCB0byB0YWtlIGNhcmUgQkJQUjEKKwkJCQkJCWlmICgoVmFsdWUgLSAoQWRqdXN0TWF4VHhQd3JbaSo4K2pdIC0gQ291bnRyeVR4UHdyKSkgPiAwKQorCQkJCQkJCVZhbHVlIC09IChBZGp1c3RNYXhUeFB3cltpKjgral0gLSBDb3VudHJ5VHhQd3IpOworCQkJCQkJZWxzZQorCQkJCQkJCVZhbHVlID0gMDsKKworCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiQXNpY0FkanVzdFR4UG93ZXIgKGkvaj0lZC8lZCwgVmFsdWU9JWQsICVkKVxuIiwgaSwgaiwgVmFsdWUsIEFkanVzdE1heFR4UHdyW2kqOCtqXSkpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIkFzaWNBZGp1c3RUeFBvd2VyIChpL2o9JWQvJWQsIFZhbHVlPSVkLCAlZCwgbm8gY2hhbmdlKVxuIiwgaSwgaiwgVmFsdWUsIEFkanVzdE1heFR4UHdyW2kqOCtqXSkpOworCisJCQkJCQlUeFB3cltpXSA9IChUeFB3cltpXSAmIH4oMHgwMDAwMDAwRiA8PCBqKjQpKSB8IChWYWx1ZSA8PCBqKjQpOworCQkJCX0KKwkJCX0KKwkJfQorCX0gd2hpbGUgKEZBTFNFKTsKKyNlbmRpZiAvLyBTSU5HTEVfU0tVIC8vCisKKwkvKiBjYWxjdWxhdGUgZGVsdGEgcG93ZXIgYmFzZWQgb24gdGhlIHBlcmNlbnRhZ2Ugc3BlY2lmaWVkIGZyb20gVUkgKi8KKwkvLyBFMlBST00gc2V0dGluZyBpcyBjYWxpYnJhdGVkIGZvciBtYXhpbXVtIFRYIHBvd2VyIChpLmUuIDEwMCUpCisJLy8gV2UgbG93ZXIgVFggcG93ZXIgaGVyZSBhY2NvcmRpbmcgdG8gdGhlIHBlcmNlbnRhZ2Ugc3BlY2lmaWVkIGZyb20gVUkKKwlpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPT0gMHhmZmZmZmZmZikgICAgICAgLy8gQVVUTyBUWCBQT1dFUiBjb250cm9sCisJCTsKKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDkwKSAgLy8gOTEgfiAxMDAlICYgQVVUTywgdHJlYXQgYXMgMTAwJSBpbiB0ZXJtcyBvZiBtVworCQk7CisJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiA2MCkgIC8vIDYxIH4gOTAlLCB0cmVhdCBhcyA3NSUgaW4gdGVybXMgb2YgbVcJCS8vIERlbHRhUHdyIC09IDE7CisJeworCQlEZWx0YVB3ciAtPSAxOworCX0KKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDMwKSAgLy8gMzEgfiA2MCUsIHRyZWF0IGFzIDUwJSBpbiB0ZXJtcyBvZiBtVwkJLy8gRGVsdGFQd3IgLT0gMzsKKwl7CisJCURlbHRhUHdyIC09IDM7CisJfQorCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gMTUpICAvLyAxNiB+IDMwJSwgdHJlYXQgYXMgMjUlIGluIHRlcm1zIG9mIG1XCQkvLyBEZWx0YVB3ciAtPSA2OworCXsKKwkJQmJwUjEgfD0gMHgwMTsKKwl9CisJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiA5KSAgIC8vIDEwIH4gMTUlLCB0cmVhdCBhcyAxMi41JSBpbiB0ZXJtcyBvZiBtVwkJLy8gRGVsdGFQd3IgLT0gOTsKKwl7CisJCUJicFIxIHw9IDB4MDE7CisJCURlbHRhUHdyIC09IDM7CisJfQorCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMCB+IDkgJSwgdHJlYXQgYXMgTUlOKH4zJSkgaW4gdGVybXMgb2YgbVcJCS8vIERlbHRhUHdyIC09IDEyOworCXsKKwkJQmJwUjEgfD0gMHgwMjsKKwl9CisKKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBCYnBSMSk7CisKKwkvKiByZXNldCBkaWZmZXJlbnQgbmV3IHR4IHBvd2VyIGZvciBkaWZmZXJlbnQgVFggcmF0ZSAqLworCWZvcihpPTA7IGk8NTsgaSsrKQorCXsKKwkJaWYgKFR4UHdyW2ldICE9IDB4ZmZmZmZmZmYpCisJCXsKKwkJCWZvciAoaj0wOyBqPDg7IGorKykKKwkJCXsKKwkJCQlWYWx1ZSA9IChDSEFSKSgoVHhQd3JbaV0gPj4gaio0KSAmIDB4MEYpOyAvKiAwIH4gMTUgKi8KKworCQkJCWlmICgoVmFsdWUgKyBEZWx0YVB3cikgPCAwKQorCQkJCXsKKwkJCQkJVmFsdWUgPSAwOyAvKiBtaW4gKi8KKwkJCQl9CisJCQkJZWxzZSBpZiAoKFZhbHVlICsgRGVsdGFQd3IpID4gMHhGKQorCQkJCXsKKwkJCQkJVmFsdWUgPSAweEY7IC8qIG1heCAqLworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlWYWx1ZSArPSBEZWx0YVB3cjsgLyogdGVtcGVyYXR1cmUgY29tcGVuc2F0aW9uICovCisJCQkJfQorCisJCQkJLyogZmlsbCBuZXcgdmFsdWUgdG8gQ1NSIG9mZnNldCAqLworCQkJCVR4UHdyW2ldID0gKFR4UHdyW2ldICYgfigweDAwMDAwMDBGIDw8IGoqNCkpIHwgKFZhbHVlIDw8IGoqNCk7CisJCQl9CisKKwkJCS8qIHdyaXRlIHR4IHBvd2VyIHZhbHVlIHRvIENTUiAqLworCQkJLyogVFhfUFdSX0NGR18wICg4IHR4IHJhdGUpIGZvcglUWCBwb3dlciBmb3IgT0ZETSAxMk0vMThNCisJCQkJCQkJCQkJCVRYIHBvd2VyIGZvciBPRkRNIDZNLzlNCisJCQkJCQkJCQkJCVRYIHBvd2VyIGZvciBDQ0s1LjVNLzExTQorCQkJCQkJCQkJCQlUWCBwb3dlciBmb3IgQ0NLMU0vMk0gKi8KKwkJCS8qIFRYX1BXUl9DRkdfMSB+IFRYX1BXUl9DRkdfNCAqLworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUFdSX0NGR18wICsgaSo0LCBUeFB3cltpXSk7CisJCX0KKwl9CisKK30KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlwdXQgUEhZIHRvIHNsZWVwIGhlcmUsIGFuZCBzZXQgbmV4dCB3YWtldXAgdGltZXIuIFBIWSBkb2Vzbid0IG5vdCB3YWtldXAKKwkJYXV0b21hdGljYWxseS4gSW5zdGVhZCwgTUNVIHdpbGwgaXNzdWUgYSBUd2FrZVVwSW50ZXJydXB0IHRvIGhvc3QgYWZ0ZXIKKwkJdGhlIHdha2V1cCB0aW1lciB0aW1lb3V0LiBEcml2ZXIgaGFzIHRvIGlzc3VlIGEgc2VwYXJhdGUgY29tbWFuZCB0byB3YWtlCisJCVBIWSB1cC4KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBBc2ljU2xlZXBUaGVuQXV0b1dha2V1cCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQgVGJ0dE51bVRvTmV4dFdha2VVcCkKK3sKKyAgICBSVDI4WFhfU1RBX1NMRUVQX1RIRU5fQVVUT19XQUtFVVAocEFkLCBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlBc2ljRm9yY2VXYWtldXAoKSBpcyB1c2VkIHdoZW5ldmVyIG1hbnVhbCB3YWtldXAgaXMgcmVxdWlyZWQKKwkJQXNpY0ZvcmNlU2xlZXAoKSBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gbm90IGluIElORlJBIEJTUy4gV2hlbgorCQlpbiBJTkZSQSBCU1MsIHdlIHNob3VsZCB1c2UgQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAoKSBpbnN0ZWFkLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY0ZvcmNlU2xlZXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlBc2ljRm9yY2VXYWtldXAoKSBpcyB1c2VkIHdoZW5ldmVyIFR3YWtldXAgdGltZXIgKHNldCB2aWEgQXNpY1NsZWVwVGhlbkF1dG9XYWtldXApCisJCWV4cGlyZWQuCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY0ZvcmNlV2FrZXVwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIEJPT0xFQU4gICAgYkZyb21UeCkKK3sKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gQXNpY0ZvcmNlV2FrZXVwIFxuIikpOworICAgIFJUMjhYWF9TVEFfRk9SQ0VfV0FLRVVQKHBBZCwgYkZyb21UeCk7Cit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVNldCBNeSBCU1NJRAorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNTZXRCc3NpZCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcEJzc2lkKQoreworCVVMT05HCQkgIEFkZHI0OworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT09PT09PT09PT09PiBBc2ljU2V0QnNzaWQgJXg6JXg6JXg6JXg6JXg6JXhcbiIsCisJCXBCc3NpZFswXSxwQnNzaWRbMV0scEJzc2lkWzJdLHBCc3NpZFszXSwgcEJzc2lkWzRdLHBCc3NpZFs1XSkpOworCisJQWRkcjQgPSAoVUxPTkcpKHBCc3NpZFswXSkJCSB8CisJCQkoVUxPTkcpKHBCc3NpZFsxXSA8PCA4KSAgfAorCQkJKFVMT05HKShwQnNzaWRbMl0gPDwgMTYpIHwKKwkJCShVTE9ORykocEJzc2lkWzNdIDw8IDI0KTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQlNTSURfRFcwLCBBZGRyNCk7CisKKwlBZGRyNCA9IDA7CisJLy8gYWx3YXlzIG9uZSBCU1NJRCBpbiBTVEEgbW9kZQorCUFkZHI0ID0gKFVMT05HKShwQnNzaWRbNF0pIHwgKFVMT05HKShwQnNzaWRbNV0gPDwgOCk7CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQlNTSURfRFcxLCBBZGRyNCk7Cit9CisKK1ZPSUQgQXNpY1NldE1jYXN0V0MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXTsKKwlVU0hPUlQJCW9mZnNldDsKKworCXBFbnRyeS0+U3N0ICAgICAgICA9IFNTVF9BU1NPQzsKKwlwRW50cnktPkFpZCAgICAgICAgPSBNQ0FTVF9XQ0lEOwkvLyBTb2Z0YXAgc3VwcG9ydHMgMSBCU1NJRCBhbmQgdXNlIFdDSUQ9MCBhcyBtdWx0aWNhc3QgV2NpZCBpbmRleAorCXBFbnRyeS0+UHNNb2RlICAgICA9IFBXUl9BQ1RJVkU7CisJcEVudHJ5LT5DdXJyVHhSYXRlID0gcEFkLT5Db21tb25DZmcuTWxtZVJhdGU7CisJb2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArIEJTUzBNY2FzdF9XQ0lEICogSFdfV0NJRF9FTlRSWV9TSVpFOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY0RlbFdjaWRUYWIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIJV2NpZCkKK3sKKwlVTE9ORwkJICBBZGRyMCA9IDB4MCwgQWRkcjEgPSAweDA7CisJVUxPTkcgCQlvZmZzZXQ7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljRGVsV2NpZFRhYj09PldjaWQgPSAweCV4XG4iLFdjaWQpKTsKKwlvZmZzZXQgPSBNQUNfV0NJRF9CQVNFICsgV2NpZCAqIEhXX1dDSURfRU5UUllfU0laRTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIEFkZHIwKTsKKwlvZmZzZXQgKz0gNDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIEFkZHIxKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNFbmFibGVSREcoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVFhfTElOS19DRkdfU1RSVUMJVHhMaW5rQ2ZnOworCVVJTlQzMgkJCQlEYXRhID0gMDsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfTElOS19DRkcsICZUeExpbmtDZmcud29yZCk7CisJVHhMaW5rQ2ZnLmZpZWxkLlR4UkRHRW4gPSAxOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0xJTktfQ0ZHLCBUeExpbmtDZmcud29yZCk7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIEVEQ0FfQUMwX0NGRywgJkRhdGEpOworCURhdGEgICY9IDB4RkZGRkZGMDA7CisJRGF0YSAgfD0gMHg4MDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIERhdGEpOworCisJLy9PUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY0Rpc2FibGVSREcoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVFhfTElOS19DRkdfU1RSVUMJVHhMaW5rQ2ZnOworCVVJTlQzMgkJCQlEYXRhID0gMDsKKworCisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9MSU5LX0NGRywgJlR4TGlua0NmZy53b3JkKTsKKwlUeExpbmtDZmcuZmllbGQuVHhSREdFbiA9IDA7CisJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfTElOS19DRkcsIFR4TGlua0NmZy53b3JkKTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgRURDQV9BQzBfQ0ZHLCAmRGF0YSk7CisKKwlEYXRhICAmPSAweEZGRkZGRjAwOworCS8vRGF0YSAgfD0gMHgyMDsKKyNpZm5kZWYgV0lGSV9URVNUCisJLy9pZiAoIHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ICkKKwkvLwlEYXRhIHw9IDB4NjA7IC8vIGZvciBwZXJmb3JtYW5jZSBpc3N1ZSBub3Qgc2V0IHRoZSBUWE9QIHRvIDAKKyNlbmRpZgorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfRFlOQU1JQ19CRV9UWE9QX0FDVElWRSkKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJJiYgKHBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uTUlNT1BTRHluYW1pYyA9PSBGQUxTRSkKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkpCisJeworCQkvLyBGb3IgQ1dDIHRlc3QsIGNoYW5nZSB0eG9wIGZyb20gMHgzMCB0byAweDIwIGluIFR4QnVyc3QgbW9kZQorCQlpZiAocEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QpCisJCQlEYXRhIHw9IDB4MjA7CisJfQorCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgRGF0YSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNEaXNhYmxlU3luYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlCQ05fVElNRV9DRkdfU1RSVUMgY3NyOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tPkRpc2FibGUgVFNGIHN5bmNocm9uaXphdGlvblxuIikpOworCisJLy8gMjAwMy0xMi0yMCBkaXNhYmxlIFRTRiBhbmQgVEJUVCB3aGlsZSBOSUMgaW4gcG93ZXItc2F2aW5nIGhhdmUgc2lkZSBlZmZlY3QKKwkvLwkJCSAgdGhhdCBOSUMgd2lsbCBuZXZlciB3YWtlcyB1cCBiZWNhdXNlIFRTRiBzdG9wcyBhbmQgbm8gbW9yZQorCS8vCQkJICBUQlRUIGludGVycnVwdHMKKwlwQWQtPlRidHRUaWNrQ291bnQgPSAwOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAmY3NyLndvcmQpOworCWNzci5maWVsZC5iQmVhY29uR2VuID0gMDsKKwljc3IuZmllbGQuYlRCVFRFbmFibGUgPSAwOworCWNzci5maWVsZC5Uc2ZTeW5jTW9kZSA9IDA7CisJY3NyLmZpZWxkLmJUc2ZUaWNraW5nID0gMDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIGNzci53b3JkKTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY0VuYWJsZUJzc1N5bmMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJQkNOX1RJTUVfQ0ZHX1NUUlVDIGNzcjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tLT5Bc2ljRW5hYmxlQnNzU3luYyhJTkZSQSBtb2RlKVxuIikpOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBCQ05fVElNRV9DRkcsICZjc3Iud29yZCk7CisvLwlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIDB4MDAwMDAwMDApOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQljc3IuZmllbGQuQmVhY29uSW50ZXJ2YWwgPSBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgNDsgLy8gQVNJQyByZWdpc3RlciBpbiB1bml0cyBvZiAxLzE2IFRVCisJCWNzci5maWVsZC5iVHNmVGlja2luZyA9IDE7CisJCWNzci5maWVsZC5Uc2ZTeW5jTW9kZSA9IDE7IC8vIHN5bmMgVFNGIGluIElORlJBU1RSVUNUVVJFIG1vZGUKKwkJY3NyLmZpZWxkLmJCZWFjb25HZW4gID0gMDsgLy8gZG8gTk9UIGdlbmVyYXRlIEJFQUNPTgorCQljc3IuZmllbGQuYlRCVFRFbmFibGUgPSAxOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIGNzci53b3JkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCU5vdGU6CisJCUJFQUNPTiBmcmFtZSBpbiBzaGFyZWQgbWVtb3J5IHNob3VsZCBiZSBidWlsdCBvayBiZWZvcmUgdGhpcyByb3V0aW5lCisJCWNhbiBiZSBjYWxsZWQuIE90aGVyd2lzZSwgYSBnYXJiYWdlIGZyYW1lIG1heWJlIHRyYW5zbWl0dGVkIG91dCBldmVyeQorCQlCZWFjb24gcGVyaW9kLgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNFbmFibGVJYnNzU3luYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlCQ05fVElNRV9DRkdfU1RSVUMgY3NyOTsKKwlQVUNIQVIJCQlwdHI7CisJVUlOVCBpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tPkFzaWNFbmFibGVJYnNzU3luYyhBREhPQyBtb2RlLiBNUERVdG90YWxCeXRlQ291bnQgPSAlZClcbiIsIHBBZC0+QmVhY29uVHhXSS5NUERVdG90YWxCeXRlQ291bnQpKTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAmY3NyOS53b3JkKTsKKwljc3I5LmZpZWxkLmJCZWFjb25HZW4gPSAwOworCWNzcjkuZmllbGQuYlRCVFRFbmFibGUgPSAwOworCWNzcjkuZmllbGQuYlRzZlRpY2tpbmcgPSAwOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJDTl9USU1FX0NGRywgY3NyOS53b3JkKTsKKworCisjaWZkZWYgUlQyODcwCisJLy8gbW92ZSBCRUFDT04gVFhEIGFuZCBmcmFtZSBjb250ZW50IHRvIG9uLWNoaXAgbWVtb3J5CisJcHRyID0gKFBVQ0hBUikmcEFkLT5CZWFjb25UeFdJOworCWZvciAoaT0wOyBpPFRYV0lfU0laRTsgaSs9MikgIC8vIDE2LWJ5dGUgVFhXSSBmaWVsZAorCXsKKwkJLy9VSU5UMzIgbG9uZ3B0ciA9ICAqcHRyICsgKCoocHRyKzEpPDw4KSArICgqKHB0cisyKTw8MTYpICsgKCoocHRyKzMpPDwyNCk7CisJCS8vUlRNUF9JT19XUklURTMyKHBBZCwgSFdfQkVBQ09OX0JBU0UwICsgaSwgbG9uZ3B0cik7CisJCVJUVVNCTXVsdGlXcml0ZShwQWQsIEhXX0JFQUNPTl9CQVNFMCArIGksIHB0ciwgMik7CisJCXB0ciArPSAyOworCX0KKworCS8vIHN0YXJ0IHJpZ2h0IGFmdGVyIHRoZSAxNi1ieXRlIFRYV0kgZmllbGQKKwlwdHIgPSBwQWQtPkJlYWNvbkJ1ZjsKKwlmb3IgKGk9MDsgaTwgcEFkLT5CZWFjb25UeFdJLk1QRFV0b3RhbEJ5dGVDb3VudDsgaSs9MikKKwl7CisJCS8vVUlOVDMyIGxvbmdwdHIgPSAgKnB0ciArICgqKHB0cisxKTw8OCkgKyAoKihwdHIrMik8PDE2KSArICgqKHB0ciszKTw8MjQpOworCQkvL1JUTVBfSU9fV1JJVEUzMihwQWQsIEhXX0JFQUNPTl9CQVNFMCArIFRYV0lfU0laRSArIGksIGxvbmdwdHIpOworCQlSVFVTQk11bHRpV3JpdGUocEFkLCBIV19CRUFDT05fQkFTRTAgKyBUWFdJX1NJWkUgKyBpLCBwdHIsIDIpOworCQlwdHIgKz0yOworCX0KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCS8vCisJLy8gRm9yIFdpLUZpIGZhaWx5IGdlbmVyYXRlZCBiZWFjb25zIGJldHdlZW4gcGFydGljaXBhdGluZyBzdGF0aW9ucy4KKwkvLyBTZXQgVEJUVCBwaGFzZSBhZGFwdGl2ZSBhZGp1c3RtZW50IHN0ZXAgdG8gOHVzIChkZWZhdWx0IDE2dXMpCisJLy8gZG9uJ3QgY2hhbmdlIHNldHRpbmdzIDIwMDYtNS0gYnkgSmVycnkKKwkvL1JUTVBfSU9fV1JJVEUzMihwQWQsIFRCVFRfU1lOQ19DRkcsIDB4MDAwMDEwMTApOworCisJLy8gc3RhcnQgc2VuZGluZyBCRUFDT04KKwljc3I5LmZpZWxkLkJlYWNvbkludGVydmFsID0gcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kIDw8IDQ7IC8vIEFTSUMgcmVnaXN0ZXIgaW4gdW5pdHMgb2YgMS8xNiBUVQorCWNzcjkuZmllbGQuYlRzZlRpY2tpbmcgPSAxOworCWNzcjkuZmllbGQuVHNmU3luY01vZGUgPSAyOyAvLyBzeW5jIFRTRiBpbiBJQlNTIG1vZGUKKwljc3I5LmZpZWxkLmJUQlRURW5hYmxlID0gMTsKKwljc3I5LmZpZWxkLmJCZWFjb25HZW4gPSAxOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJDTl9USU1FX0NGRywgY3NyOS53b3JkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNpY1NldEVkY2FQYXJtKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBFRENBX1BBUk0JIHBFZGNhUGFybSkKK3sKKwlFRENBX0FDX0NGR19TVFJVQyAgIEFjMENmZywgQWMxQ2ZnLCBBYzJDZmcsIEFjM0NmZzsKKwlBQ19UWE9QX0NTUjBfU1RSVUMgY3NyMDsKKwlBQ19UWE9QX0NTUjFfU1RSVUMgY3NyMTsKKwlBSUZTTl9DU1JfU1RSVUMgICAgQWlmc25Dc3I7CisJQ1dNSU5fQ1NSX1NUUlVDICAgIEN3bWluQ3NyOworCUNXTUFYX0NTUl9TVFJVQyAgICBDd21heENzcjsKKwlpbnQgaTsKKworCUFjMENmZy53b3JkID0gMDsKKwlBYzFDZmcud29yZCA9IDA7CisJQWMyQ2ZnLndvcmQgPSAwOworCUFjM0NmZy53b3JkID0gMDsKKwlpZiAoKHBFZGNhUGFybSA9PSBOVUxMKSB8fCAocEVkY2FQYXJtLT5iVmFsaWQgPT0gRkFMU0UpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBc2ljU2V0RWRjYVBhcm1cbiIpKTsKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCk7CisJCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCisJCXsKKwkJCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNDTEkgfHwgcEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQXBDbGkpCisJCQkJQ0xJRU5UX1NUQVRVU19DTEVBUl9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W2ldLCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSk7CisJCX0KKworCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCS8vICAgICAgTUFDIFJlZ2lzdGVyIGhhcyBhIGNvcHkgLgorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyNpZm5kZWYgV0lGSV9URVNUCisJCWlmKCBwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCApCisJCXsKKwkJCS8vIEZvciBDV0MgdGVzdCwgY2hhbmdlIHR4b3AgZnJvbSAweDMwIHRvIDB4MjAgaW4gVHhCdXJzdCBtb2RlCisJCQlBYzBDZmcuZmllbGQuQWNUeG9wID0gMHgyMDsgLy8gU3VnZ2VzdCBieSBKb2huIGZvciBUeEJ1cnN0IGluIEhUIE1vZGUKKwkJfQorCQllbHNlCisJCQlBYzBDZmcuZmllbGQuQWNUeG9wID0gMDsJLy8gUUlEX0FDX0JFCisvLyNlbHNlCisvLwkJQWMwQ2ZnLmZpZWxkLkFjVHhvcCA9IDA7CS8vIFFJRF9BQ19CRQorLy8jZW5kaWYKKwkJQWMwQ2ZnLmZpZWxkLkN3bWluID0gQ1dfTUlOX0lOX0JJVFM7CisJCUFjMENmZy5maWVsZC5Dd21heCA9IENXX01BWF9JTl9CSVRTOworCQlBYzBDZmcuZmllbGQuQWlmc24gPSAyOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIEFjMENmZy53b3JkKTsKKworCQlBYzFDZmcuZmllbGQuQWNUeG9wID0gMDsJLy8gUUlEX0FDX0JLCisJCUFjMUNmZy5maWVsZC5Dd21pbiA9IENXX01JTl9JTl9CSVRTOworCQlBYzFDZmcuZmllbGQuQ3dtYXggPSBDV19NQVhfSU5fQklUUzsKKwkJQWMxQ2ZnLmZpZWxkLkFpZnNuID0gMjsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzFfQ0ZHLCBBYzFDZmcud29yZCk7CisKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikKKwkJeworCQkJQWMyQ2ZnLmZpZWxkLkFjVHhvcCA9IDE5MjsJLy8gQUNfVkk6IDE5MiozMnVzIH49IDZtcworCQkJQWMzQ2ZnLmZpZWxkLkFjVHhvcCA9IDk2OwkvLyBBQ19WTzogOTYqMzJ1cyAgfj0gM21zCisJCX0KKwkJZWxzZQorCQl7CisJCQlBYzJDZmcuZmllbGQuQWNUeG9wID0gOTY7CS8vIEFDX1ZJOiA5NiozMnVzIH49IDNtcworCQkJQWMzQ2ZnLmZpZWxkLkFjVHhvcCA9IDQ4OwkvLyBBQ19WTzogNDgqMzJ1cyB+PSAxLjVtcworCQl9CisJCUFjMkNmZy5maWVsZC5Dd21pbiA9IENXX01JTl9JTl9CSVRTOworCQlBYzJDZmcuZmllbGQuQ3dtYXggPSBDV19NQVhfSU5fQklUUzsKKwkJQWMyQ2ZnLmZpZWxkLkFpZnNuID0gMjsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzJfQ0ZHLCBBYzJDZmcud29yZCk7CisJCUFjM0NmZy5maWVsZC5Dd21pbiA9IENXX01JTl9JTl9CSVRTOworCQlBYzNDZmcuZmllbGQuQ3dtYXggPSBDV19NQVhfSU5fQklUUzsKKwkJQWMzQ2ZnLmZpZWxkLkFpZnNuID0gMjsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzNfQ0ZHLCBBYzNDZmcud29yZCk7CisKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkvLyAgICAgIERNQSBSZWdpc3RlciBoYXMgYSBjb3B5IHRvby4KKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQljc3IwLmZpZWxkLkFjMFR4b3AgPSAwOwkJLy8gUUlEX0FDX0JFCisJCWNzcjAuZmllbGQuQWMxVHhvcCA9IDA7CQkvLyBRSURfQUNfQksKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX1RYT1AwX0NGRywgY3NyMC53b3JkKTsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikKKwkJeworCQkJY3NyMS5maWVsZC5BYzJUeG9wID0gMTkyOwkJLy8gQUNfVkk6IDE5MiozMnVzIH49IDZtcworCQkJY3NyMS5maWVsZC5BYzNUeG9wID0gOTY7CQkvLyBBQ19WTzogOTYqMzJ1cyAgfj0gM21zCisJCX0KKwkJZWxzZQorCQl7CisJCQljc3IxLmZpZWxkLkFjMlR4b3AgPSA5NjsJCS8vIEFDX1ZJOiA5NiozMnVzIH49IDNtcworCQkJY3NyMS5maWVsZC5BYzNUeG9wID0gNDg7CQkvLyBBQ19WTzogNDgqMzJ1cyB+PSAxLjVtcworCQl9CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9UWE9QMV9DRkcsIGNzcjEud29yZCk7CisKKwkJQ3dtaW5Dc3Iud29yZCA9IDA7CisJCUN3bWluQ3NyLmZpZWxkLkN3bWluMCA9IENXX01JTl9JTl9CSVRTOworCQlDd21pbkNzci5maWVsZC5Dd21pbjEgPSBDV19NSU5fSU5fQklUUzsKKwkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4yID0gQ1dfTUlOX0lOX0JJVFM7CisJCUN3bWluQ3NyLmZpZWxkLkN3bWluMyA9IENXX01JTl9JTl9CSVRTOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQ1dNSU5fQ0ZHLCBDd21pbkNzci53b3JkKTsKKworCQlDd21heENzci53b3JkID0gMDsKKwkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgwID0gQ1dfTUFYX0lOX0JJVFM7CisJCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MSA9IENXX01BWF9JTl9CSVRTOworCQlDd21heENzci5maWVsZC5Dd21heDIgPSBDV19NQVhfSU5fQklUUzsKKwkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgzID0gQ1dfTUFYX0lOX0JJVFM7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9DV01BWF9DRkcsIEN3bWF4Q3NyLndvcmQpOworCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9BSUZTTl9DRkcsIDB4MDAwMDIyMjIpOworCisJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7CisJfQorCWVsc2UKKwl7CisJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKTsKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkvLyAgICAgIE1BQyBSZWdpc3RlciBoYXMgYSBjb3B5LgorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCS8vCisJCS8vIE1vZGlmeSBDd21pbi9Dd21heC9UeG9wIG9uIHF1ZXVlW1FJRF9BQ19WSV0sIFJlY29tbWVuZCBieSBKZXJyeSAyMDA1LzA3LzI3CisJCS8vIFRvIGRlZ3JhZGUgb3VyIFZJRE8gUXVldWUncyB0aHJvdWdocHV0IGZvciBXaUZpIFdNTSBTM1QwNyBJc3N1ZS4KKwkJLy8KKwkJLy9wRWRjYVBhcm0tPlR4b3BbUUlEX0FDX1ZJXSA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfVkldICogNyAvIDEwOyAvLyBydDI4NjBjIG5lZWQgdGhpcworCisJCUFjMENmZy5maWVsZC5BY1R4b3AgPSAgcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19CRV07CisJCUFjMENmZy5maWVsZC5Dd21pbj0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfQkVdOworCQlBYzBDZmcuZmllbGQuQ3dtYXggPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19CRV07CisJCUFjMENmZy5maWVsZC5BaWZzbiA9IHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JFXTsgLy8rMTsKKworCQlBYzFDZmcuZmllbGQuQWNUeG9wID0gIHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQktdOworCQlBYzFDZmcuZmllbGQuQ3dtaW4gPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CS107IC8vKzI7CisJCUFjMUNmZy5maWVsZC5Dd21heCA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX0JLXTsKKwkJQWMxQ2ZnLmZpZWxkLkFpZnNuID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQktdOyAvLysxOworCisJCUFjMkNmZy5maWVsZC5BY1R4b3AgPSAocEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WSV0gKiA2KSAvIDEwOworCQlBYzJDZmcuZmllbGQuQ3dtaW4gPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19WSV07CisJCUFjMkNmZy5maWVsZC5Dd21heCA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZJXTsKKwkJQWMyQ2ZnLmZpZWxkLkFpZnNuID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQkvLyBUdW5pbmcgZm9yIFdpLUZpIFdNTSBTMDYKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lGaVRlc3QgJiYKKwkJCQlwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WSV0gPT0gMTApCisJCQkJQWMyQ2ZnLmZpZWxkLkFpZnNuIC09IDE7CisKKwkJCS8vIFR1bmluZyBmb3IgVEduIFdpLUZpIDUuMi4zMgorCQkJLy8gU1RBIFRlc3RCZWQgY2hhbmdlcyBpbiB0aGlzIGl0ZW06IGNvbmV4YW50IGxlZ2FjeSBzdGEgPT0+IGJyb2FkY29tIDExbiBzdGEKKwkJCWlmIChTVEFfVEdOX1dJRklfT04ocEFkKSAmJgorCQkJCXBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXSA9PSAxMCkKKwkJCXsKKwkJCQlBYzBDZmcuZmllbGQuQWlmc24gPSAzOworCQkJCUFjMkNmZy5maWVsZC5BY1R4b3AgPSA1OworCQkJfQorCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJQWMzQ2ZnLmZpZWxkLkFjVHhvcCA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfVk9dOworCQlBYzNDZmcuZmllbGQuQ3dtaW4gPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19WT107CisJCUFjM0NmZy5maWVsZC5Dd21heCA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZPXTsKKwkJQWMzQ2ZnLmZpZWxkLkFpZnNuID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVk9dOworCisvLyNpZmRlZiBXSUZJX1RFU1QKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaUZpVGVzdCkKKwkJeworCQkJaWYgKEFjM0NmZy5maWVsZC5BY1R4b3AgPT0gMTAyKQorCQkJeworCQkJQWMwQ2ZnLmZpZWxkLkFjVHhvcCA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQkVdID8gcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19CRV0gOiAxMDsKKwkJCQlBYzBDZmcuZmllbGQuQWlmc24gID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQkVdLTE7IC8qIEFJRlNOIG11c3QgPj0gMSAqLworCQkJQWMxQ2ZnLmZpZWxkLkFjVHhvcCA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQktdOworCQkJCUFjMUNmZy5maWVsZC5BaWZzbiAgPSBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CS107CisJCQlBYzJDZmcuZmllbGQuQWNUeG9wID0gcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WSV07CisJCQl9IC8qIEVuZCBvZiBpZiAqLworCQl9CisvLyNlbmRpZiAvLyBXSUZJX1RFU1QgLy8KKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIEFjMENmZy53b3JkKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzFfQ0ZHLCBBYzFDZmcud29yZCk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMyX0NGRywgQWMyQ2ZnLndvcmQpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDM19DRkcsIEFjM0NmZy53b3JkKTsKKworCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gICAgICBETUEgUmVnaXN0ZXIgaGFzIGEgY29weSB0b28uCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJY3NyMC5maWVsZC5BYzBUeG9wID0gQWMwQ2ZnLmZpZWxkLkFjVHhvcDsKKwkJY3NyMC5maWVsZC5BYzFUeG9wID0gQWMxQ2ZnLmZpZWxkLkFjVHhvcDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX1RYT1AwX0NGRywgY3NyMC53b3JkKTsKKworCQljc3IxLmZpZWxkLkFjMlR4b3AgPSBBYzJDZmcuZmllbGQuQWNUeG9wOworCQljc3IxLmZpZWxkLkFjM1R4b3AgPSBBYzNDZmcuZmllbGQuQWNUeG9wOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fVFhPUDFfQ0ZHLCBjc3IxLndvcmQpOworCisJCUN3bWluQ3NyLndvcmQgPSAwOworCQlDd21pbkNzci5maWVsZC5Dd21pbjAgPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CRV07CisJCUN3bWluQ3NyLmZpZWxkLkN3bWluMSA9IHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX0JLXTsKKwkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4yID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVkldOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4zID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVk9dIC0gMTsgLy9mb3IgVEduIHdpZmkgdGVzdAorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQ1dNSU5fQ0ZHLCBDd21pbkNzci53b3JkKTsKKworCQlDd21heENzci53b3JkID0gMDsKKwkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgwID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfQkVdOworCQlDd21heENzci5maWVsZC5Dd21heDEgPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19CS107CisJCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MiA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZJXTsKKwkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgzID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfVk9dOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQ1dNQVhfQ0ZHLCBDd21heENzci53b3JkKTsKKworCQlBaWZzbkNzci53b3JkID0gMDsKKwkJQWlmc25Dc3IuZmllbGQuQWlmc24wID0gQWMwQ2ZnLmZpZWxkLkFpZnNuOyAvL3BFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JFXTsKKwkJQWlmc25Dc3IuZmllbGQuQWlmc24xID0gQWMxQ2ZnLmZpZWxkLkFpZnNuOyAvL3BFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JLXTsKKwkJQWlmc25Dc3IuZmllbGQuQWlmc24yID0gQWMyQ2ZnLmZpZWxkLkFpZnNuOyAvL3BFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJeworCQkJLy8gVHVuaW5nIGZvciBXaS1GaSBXTU0gUzA2CisJCQlpZiAocEFkLT5Db21tb25DZmcuYldpRmlUZXN0ICYmCisJCQkJcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldID09IDEwKQorCQkJCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMiA9IEFjMkNmZy5maWVsZC5BaWZzbiAtIDQ7CisKKwkJCS8vIFR1bmluZyBmb3IgVEduIFdpLUZpIDUuMi4zMgorCQkJLy8gU1RBIFRlc3RCZWQgY2hhbmdlcyBpbiB0aGlzIGl0ZW06IGNvbmV4YW50IGxlZ2FjeSBzdGEgPT0+IGJyb2FkY29tIDExbiBzdGEKKwkJCWlmIChTVEFfVEdOX1dJRklfT04ocEFkKSAmJgorCQkJCXBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXSA9PSAxMCkKKwkJCXsKKwkJCQlBaWZzbkNzci5maWVsZC5BaWZzbjAgPSAzOworCQkJCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMiA9IDc7CisJCQl9CisKKwkJCWlmIChJTkZSQV9PTihwQWQpKQorCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0sIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKTsKKwkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQlBaWZzbkNzci5maWVsZC5BaWZzbjMgPSBBYzNDZmcuZmllbGQuQWlmc24gLSAxOyAvL3BFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZPXTsgLy9mb3IgVEduIHdpZmkgdGVzdAorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQUlGU05fQ0ZHLCBBaWZzbkNzci53b3JkKTsKKworCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybSwgcEVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7CisJCWlmICghQURIT0NfT04ocEFkKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJFRENBIFsjJWRdOiBBSUZTTiBDV21pbiBDV21heCAgVFhPUCh1cykgIEFDTVxuIiwgcEVkY2FQYXJtLT5FZGNhVXBkYXRlQ291bnQpKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiICAgICBBQ19CRSAgICAgICUyZCAgICAgJTJkICAgICAlMmQgICAgICAlNGQgICAgICVkXG4iLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+QWlmc25bMF0sCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21pblswXSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPkN3bWF4WzBdLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+VHhvcFswXTw8NSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPmJBQ01bMF0pKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiICAgICBBQ19CSyAgICAgICUyZCAgICAgJTJkICAgICAlMmQgICAgICAlNGQgICAgICVkXG4iLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+QWlmc25bMV0sCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21pblsxXSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPkN3bWF4WzFdLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+VHhvcFsxXTw8NSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPmJBQ01bMV0pKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiICAgICBBQ19WSSAgICAgICUyZCAgICAgJTJkICAgICAlMmQgICAgICAlNGQgICAgICVkXG4iLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+QWlmc25bMl0sCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21pblsyXSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPkN3bWF4WzJdLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+VHhvcFsyXTw8NSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPmJBQ01bMl0pKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiICAgICBBQ19WTyAgICAgICUyZCAgICAgJTJkICAgICAlMmQgICAgICAlNGQgICAgICVkXG4iLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+QWlmc25bM10sCisJCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21pblszXSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPkN3bWF4WzNdLAorCQkJCQkJCQkJIHBFZGNhUGFybS0+VHhvcFszXTw8NSwKKwkJCQkJCQkJCSBwRWRjYVBhcm0tPmJBQ01bM10pKTsKKwkJfQorCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgCUFzaWNTZXRTbG90VGltZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBCT09MRUFOIGJVc2VTaG9ydFNsb3RUaW1lKQoreworCVVMT05HCVNsb3RUaW1lOworCVVJTlQzMglSZWdWYWx1ZSA9IDA7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQorCQliVXNlU2hvcnRTbG90VGltZSA9IFRSVUU7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlpZiAoYlVzZVNob3J0U2xvdFRpbWUpCisJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9TTE9UX0lOVVNFRCk7CisJZWxzZQorCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9TTE9UX0lOVVNFRCk7CisKKwlTbG90VGltZSA9IChiVXNlU2hvcnRTbG90VGltZSk/IDkgOiAyMDsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQkvLyBmb3JjZSB1c2luZyBzaG9ydCBTTE9UIHRpbWUgZm9yIEZBRSB0byBkZW1vIHBlcmZvcm1hbmNlIHdoZW4gVHhCdXJzdCBpcyBPTgorCQlpZiAoKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBGQUxTRSkgJiYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkpKQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJfHwgKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBUUlVFKSAmJiAocEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSA9PSBCQV9OT1RVU0UpKQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJKQorCQl7CisJCQkvLyBJbiB0aGlzIGNhc2UsIHdlIHdpbGwgdGhpbmsgaXQgaXMgZG9pbmcgV2ktRmkgdGVzdAorCQkJLy8gQW5kIHdlIHdpbGwgbm90IHNldCB0byBzaG9ydCBzbG90IHdoZW4gYkVuYWJsZVR4QnVyc3QgaXMgVFJVRS4KKwkJfQorCQllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCkKKwkJCVNsb3RUaW1lID0gOTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLworCS8vIEZvciBzb21lIHJlYXNvbnMsIGFsd2F5cyBzZXQgaXQgdG8gc2hvcnQgc2xvdCB0aW1lLgorCS8vCisJLy8gVG9EbzogU2hvdWxkIGNvbnNpZGVyIGNhcGFiaWxpdHkgd2l0aCAxMUIKKwkvLworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCisJCQlTbG90VGltZSA9IDIwOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgQktPRkZfU0xPVF9DRkcsICZSZWdWYWx1ZSk7CisJUmVnVmFsdWUgPSBSZWdWYWx1ZSAmIDB4RkZGRkZGMDA7CisKKwlSZWdWYWx1ZSB8PSBTbG90VGltZTsKKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJLT0ZGX1NMT1RfQ0ZHLCBSZWdWYWx1ZSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUFkZCBTaGFyZWQga2V5IGluZm9ybWF0aW9uIGludG8gQVNJQy4KKwkJVXBkYXRlIHNoYXJlZCBrZXksIFR4TWljIGFuZCBSeE1pYyB0byBBc2ljIFNoYXJlZCBrZXkgdGFibGUKKwkJVXBkYXRlIGl0cyBjaXBoZXJBbGcgdG8gQXNpYyBTaGFyZWQga2V5IE1vZGUuCisKKyAgICBSZXR1cm46CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBBc2ljQWRkU2hhcmVkS2V5RW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIJCSBCc3NJbmRleCwKKwlJTiBVQ0hBUgkJIEtleUlkeCwKKwlJTiBVQ0hBUgkJIENpcGhlckFsZywKKwlJTiBQVUNIQVIJCSBwS2V5LAorCUlOIFBVQ0hBUgkJIHBUeE1pYywKKwlJTiBQVUNIQVIJCSBwUnhNaWMpCit7CisJVUxPTkcgb2Zmc2V0OyAvLywgY3NyMDsKKwlTSEFSRURLRVlfTU9ERV9TVFJVQyBjc3IxOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY0FkZFNoYXJlZEtleUVudHJ5IEJzc0luZGV4PSVkLCBLZXlJZHg9JWRcbiIsIEJzc0luZGV4LEtleUlkeCkpOworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBc2ljQWRkU2hhcmVkS2V5RW50cnk6ICVzIGtleSAjJWRcbiIsIENpcGhlck5hbWVbQ2lwaGVyQWxnXSwgQnNzSW5kZXgqNCArIEtleUlkeCkpOworCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIgCUtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCXBLZXlbMF0scEtleVsxXSxwS2V5WzJdLHBLZXlbM10scEtleVs0XSxwS2V5WzVdLHBLZXlbNl0scEtleVs3XSxwS2V5WzhdLHBLZXlbOV0scEtleVsxMF0scEtleVsxMV0scEtleVsxMl0scEtleVsxM10scEtleVsxNF0scEtleVsxNV0pKTsKKwlpZiAocFJ4TWljKQorCXsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiAJUnggTUlDIEtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCXBSeE1pY1swXSxwUnhNaWNbMV0scFJ4TWljWzJdLHBSeE1pY1szXSxwUnhNaWNbNF0scFJ4TWljWzVdLHBSeE1pY1s2XSxwUnhNaWNbN10pKTsKKwl9CisJaWYgKHBUeE1pYykKKwl7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIgCVR4IE1JQyBLZXkgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQlwVHhNaWNbMF0scFR4TWljWzFdLHBUeE1pY1syXSxwVHhNaWNbM10scFR4TWljWzRdLHBUeE1pY1s1XSxwVHhNaWNbNl0scFR4TWljWzddKSk7CisJfQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vCisJLy8gZmlsbCBrZXkgbWF0ZXJpYWwgLSBrZXkgKyBUWCBNSUMgKyBSWCBNSUMKKwkvLworCisjaWZkZWYgUlQyODcwCit7CisJb2Zmc2V0ID0gU0hBUkVEX0tFWV9UQUJMRV9CQVNFICsgKDQqQnNzSW5kZXggKyBLZXlJZHgpKkhXX0tFWV9FTlRSWV9TSVpFOworCVJUVVNCTXVsdGlXcml0ZShwQWQsIG9mZnNldCwgcEtleSwgTUFYX0xFTl9PRl9TSEFSRV9LRVkpOworCisJb2Zmc2V0ICs9IE1BWF9MRU5fT0ZfU0hBUkVfS0VZOworCWlmIChwVHhNaWMpCisJeworCQlSVFVTQk11bHRpV3JpdGUocEFkLCBvZmZzZXQsIHBUeE1pYywgOCk7CisJfQorCisJb2Zmc2V0ICs9IDg7CisJaWYgKHBSeE1pYykKKwl7CisJCVJUVVNCTXVsdGlXcml0ZShwQWQsIG9mZnNldCwgcFJ4TWljLCA4KTsKKwl9Cit9CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwkvLworCS8vIFVwZGF0ZSBjaXBoZXIgYWxnb3JpdGhtLiBXU1RBIGFsd2F5cyB1c2UgQlNTMAorCS8vCisJUlRNUF9JT19SRUFEMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSs0KihCc3NJbmRleC8yKSwgJmNzcjEud29yZCk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSZWFkOiBTSEFSRURfS0VZX01PREVfQkFTRSBhdCB0aGlzIEJzc1slZF0gS2V5SWR4WyVkXT0gMHgleCBcbiIsIEJzc0luZGV4LEtleUlkeCwgY3NyMS53b3JkKSk7CisJaWYgKChCc3NJbmRleCUyKSA9PSAwKQorCXsKKwkJaWYgKEtleUlkeCA9PSAwKQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCisJCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQllbHNlIGlmIChLZXlJZHggPT0gMikKKwkJCWNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCWVsc2UKKwkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJfQorCWVsc2UKKwl7CisJCWlmIChLZXlJZHggPT0gMCkKKwkJCWNzcjEuZmllbGQuQnNzMUtleTBDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCWVsc2UgaWYgKEtleUlkeCA9PSAxKQorCQkJY3NyMS5maWVsZC5Cc3MxS2V5MUNpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJZWxzZSBpZiAoS2V5SWR4ID09IDIpCisJCQljc3IxLmZpZWxkLkJzczFLZXkyQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQllbHNlCisJCQljc3IxLmZpZWxkLkJzczFLZXkzQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCX0KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIldyaXRlOiBTSEFSRURfS0VZX01PREVfQkFTRSBhdCB0aGlzIEJzc1slZF0gPSAweCV4IFxuIiwgQnNzSW5kZXgsIGNzcjEud29yZCkpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFKzQqKEJzc0luZGV4LzIpLCBjc3IxLndvcmQpOworCit9CisKKy8vCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRCBBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIJCSBCc3NJbmRleCwKKwlJTiBVQ0hBUgkJIEtleUlkeCkKK3sKKwkvL1VMT05HIFNlY0NzcjA7CisJU0hBUkVES0VZX01PREVfU1RSVUMgY3NyMTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5OiAjJWQgXG4iLCBCc3NJbmRleCo0ICsgS2V5SWR4KSk7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFKzQqKEJzc0luZGV4LzIpLCAmY3NyMS53b3JkKTsKKwlpZiAoKEJzc0luZGV4JTIpID09IDApCisJeworCQlpZiAoS2V5SWR4ID09IDApCisJCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gMDsKKwkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCisJCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gMDsKKwkJZWxzZSBpZiAoS2V5SWR4ID09IDIpCisJCQljc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID0gMDsKKwkJZWxzZQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9IDA7CisJfQorCWVsc2UKKwl7CisJCWlmIChLZXlJZHggPT0gMCkKKwkJCWNzcjEuZmllbGQuQnNzMUtleTBDaXBoZXJBbGcgPSAwOworCQllbHNlIGlmIChLZXlJZHggPT0gMSkKKwkJCWNzcjEuZmllbGQuQnNzMUtleTFDaXBoZXJBbGcgPSAwOworCQllbHNlIGlmIChLZXlJZHggPT0gMikKKwkJCWNzcjEuZmllbGQuQnNzMUtleTJDaXBoZXJBbGcgPSAwOworCQllbHNlCisJCQljc3IxLmZpZWxkLkJzczFLZXkzQ2lwaGVyQWxnID0gMDsKKwl9CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJXcml0ZTogU0hBUkVEX0tFWV9NT0RFX0JBU0UgYXQgdGhpcyBCc3NbJWRdID0gMHgleCBcbiIsIEJzc0luZGV4LCBjc3IxLndvcmQpKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSs0KihCc3NJbmRleC8yKSwgY3NyMS53b3JkKTsKKwlBU1NFUlQoQnNzSW5kZXggPCA0KTsKKwlBU1NFUlQoS2V5SWR4IDwgNCk7CisKK30KKworCitWT0lEIEFzaWNVcGRhdGVXQ0lEQXR0cmlidXRlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVAkJV0NJRCwKKwlJTiBVQ0hBUgkJQnNzSW5kZXgsCisJSU4gVUNIQVIgICAgICAgIENpcGhlckFsZywKKwlJTiBCT09MRUFOCQliVXNlUGFpcmV3aXNlS2V5VGFibGUpCit7CisJVUxPTkcgICBXQ0lEQXR0cmkgPSAwLCBvZmZzZXQ7CisKKwkvLworCS8vIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZS4KKwkvLyBPbmx5IFR4S2V5IGNvdWxkIHVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZS4KKwkvLworCW9mZnNldCA9IE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsgKFdDSUQgKiBIV19XQ0lEX0FUVFJJX1NJWkUpOworCVdDSURBdHRyaSA9IChCc3NJbmRleCA8PCA0KSB8IChDaXBoZXJBbGcgPDwgMSkgfCAoYlVzZVBhaXJld2lzZUtleVRhYmxlKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIFdDSURBdHRyaSk7Cit9CisKK1ZPSUQgQXNpY1VwZGF0ZVdDSURJVkVJVigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQJCVdDSUQsCisJSU4gVUxPTkcgICAgICAgIHVJViwKKwlJTiBVTE9ORyAgICAgICAgdUVJVikKK3sKKwlVTE9ORwlvZmZzZXQ7CisKKwlvZmZzZXQgPSBNQUNfSVZFSVZfVEFCTEVfQkFTRSArIChXQ0lEICogSFdfSVZFSVZfRU5UUllfU0laRSk7CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIHVJVik7CisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0ICsgNCwgdUVJVik7Cit9CisKK1ZPSUQgQXNpY1VwZGF0ZVJ4V0NJRFRhYmxlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVAkJV0NJRCwKKwlJTiBQVUNIQVIgICAgICAgIHBBZGRyKQoreworCVVMT05HIG9mZnNldDsKKwlVTE9ORyBBZGRyOworCisJb2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArIChXQ0lEICogSFdfV0NJRF9FTlRSWV9TSVpFKTsKKwlBZGRyID0gcEFkZHJbMF0gKyAocEFkZHJbMV0gPDwgOCkgKyhwQWRkclsyXSA8PCAxNikgKyhwQWRkclszXSA8PCAyNCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBBZGRyKTsKKwlBZGRyID0gcEFkZHJbNF0gKyAocEFkZHJbNV0gPDwgOCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0ICsgNCwgQWRkcik7Cit9CisKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBDaXBoZXIgS2V5LCBDaXBoZXIgYWxnb3JpdGhtLCBJVi9FSVYgdG8gQXNpYworCisgICAgQXJndW1lbnRzOgorICAgICAgICBwQWQgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgICAgIFdDSUQgICAgICAgICAgICAgICAgICAgIFdDSUQgRW50cnkgbnVtYmVyLgorICAgICAgICBCc3NJbmRleCAgICAgICAgICAgICAgICBCU1NJRCBpbmRleCwgc3RhdGlvbiBvciBub25lIG11bHRpcGxlIEJTU0lEIHN1cHBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyB2YWx1ZSBzaG91bGQgYmUgMC4KKyAgICAgICAgS2V5SWR4ICAgICAgICAgICAgICAgICAgVGhpcyBLZXlJZHggd2lsbCBzZXQgdG8gSVYncyBLZXlJRCBpZiBiVHhLZXkgZW5hYmxlZAorICAgICAgICBwQ2lwaGVyS2V5ICAgICAgICAgICAgICBQb2ludGVyIHRvIENpcGhlciBLZXkuCisgICAgICAgIGJVc2VQYWlyZXdpc2VLZXlUYWJsZSAgIFRSVUUgbWVhbnMgc2F2ZWQgdGhlIGtleSBpbiBTaGFyZWRLZXkgdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSBQYWlyZXdpc2VLZXkgdGFibGUKKyAgICAgICAgYlR4S2V5ICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgdHJhbnNtaXQga2V5IGlmIGVuYWJsZWQuCisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIE5vbmUKKworICAgIE5vdGU6CisgICAgICAgIFRoaXMgcm91dGluZSB3aWxsIHNldCB0aGUgcmVsYXRpdmUga2V5IHN0dWZmIHRvIEFzaWMgaW5jbHVkaW5nIFdDSUQgYXR0cmlidXRlLAorICAgICAgICBDaXBoZXIgS2V5LCBDaXBoZXIgYWxnb3JpdGhtIGFuZCBJVi9FSVYuCisKKyAgICAgICAgSVYvRUlWIHdpbGwgYmUgdXBkYXRlIGlmIHRoaXMgQ2lwaGVyS2V5IGlzIHRoZSB0cmFuc21pc3Npb24ga2V5IGJlY2F1c2UKKyAgICAgICAgQVNJQyB3aWxsIGJhc2Ugb24gSVYncyBLZXlJRCB2YWx1ZSB0byBzZWxlY3QgQ2lwaGVyIEtleS4KKworICAgICAgICBJZiBiVHhLZXkgc2V0cyB0byBGQUxTRSwgdGhpcyBpcyBub3QgdGhlIFRYIGtleSwgYnV0IGl0IGNvdWxkIGJlCisgICAgICAgIFJYIGtleQorCisgICAgCUZvciBBUCBtb2RlIGJUeEtleSBtdXN0IGJlIGFsd2F5cyBzZXQgdG8gVFJVRS4KKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEFzaWNBZGRLZXlFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQJCVdDSUQsCisJSU4gVUNIQVIJCUJzc0luZGV4LAorCUlOIFVDSEFSCQlLZXlJZHgsCisJSU4gUENJUEhFUl9LRVkJcENpcGhlcktleSwKKwlJTiBCT09MRUFOCQliVXNlUGFpcmV3aXNlS2V5VGFibGUsCisJSU4gQk9PTEVBTgkJYlR4S2V5KQoreworCVVMT05HCW9mZnNldDsKKy8vCVVMT05HICAgV0NJREF0dHJpID0gMDsKKwlVQ0hBUglJVjQgPSAwOworCVBVQ0hBUgkJcEtleSA9IHBDaXBoZXJLZXktPktleTsKKy8vCVVMT05HCQlLZXlMZW4gPSBwQ2lwaGVyS2V5LT5LZXlMZW47CisJUFVDSEFSCQlwVHhNaWMgPSBwQ2lwaGVyS2V5LT5UeE1pYzsKKwlQVUNIQVIJCXBSeE1pYyA9IHBDaXBoZXJLZXktPlJ4TWljOworCVBVQ0hBUgkJcFR4dHNjID0gcENpcGhlcktleS0+VHhUc2M7CisJVUNIQVIJCUNpcGhlckFsZyA9IHBDaXBoZXJLZXktPkNpcGhlckFsZzsKKwlTSEFSRURLRVlfTU9ERV9TVFJVQyBjc3IxOworCisvLwlBU1NFUlQoS2V5TGVuIDw9IE1BWF9MRU5fT0ZfUEVFUl9LRVkpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IEFzaWNBZGRLZXlFbnRyeVxuIikpOworCS8vCisJLy8gMS4pIGRlY2lkZSBrZXkgdGFibGUgb2Zmc2V0CisJLy8KKwlpZiAoYlVzZVBhaXJld2lzZUtleVRhYmxlKQorCQlvZmZzZXQgPSBQQUlSV0lTRV9LRVlfVEFCTEVfQkFTRSArIChXQ0lEICogSFdfS0VZX0VOVFJZX1NJWkUpOworCWVsc2UKKwkJb2Zmc2V0ID0gU0hBUkVEX0tFWV9UQUJMRV9CQVNFICsgKDQgKiBCc3NJbmRleCArIEtleUlkeCkgKiBIV19LRVlfRU5UUllfU0laRTsKKworCS8vCisJLy8gMi4pIFNldCBLZXkgdG8gQXNpYworCS8vCisJLy9mb3IgKGkgPSAwOyBpIDwgS2V5TGVuOyBpKyspCisKKyNpZmRlZiBSVDI4NzAKKwlSVFVTQk11bHRpV3JpdGUocEFkLCBvZmZzZXQsIHBLZXksIE1BWF9MRU5fT0ZfUEVFUl9LRVkpOworCW9mZnNldCArPSBNQVhfTEVOX09GX1BFRVJfS0VZOworCisJLy8KKwkvLyAzLikgU2V0IE1JQyBrZXkgaWYgYXZhaWxhYmxlCisJLy8KKwlpZiAocFR4TWljKQorCXsKKwkJUlRVU0JNdWx0aVdyaXRlKHBBZCwgb2Zmc2V0LCBwVHhNaWMsIDgpOworCX0KKwlvZmZzZXQgKz0gTEVOX1RLSVBfVFhNSUNLOworCisJaWYgKHBSeE1pYykKKwl7CisJCVJUVVNCTXVsdGlXcml0ZShwQWQsIG9mZnNldCwgcFJ4TWljLCA4KTsKKwl9CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwkvLworCS8vIDQuKSBNb2RpZnkgSVYvRUlWIGlmIG5lZWRzCisJLy8gICAgIFRoaXMgd2lsbCBmb3JjZSBBc2ljIHRvIHVzZSB0aGlzIGtleSBJRCBieSBzZXR0aW5nIElWLgorCS8vCisJaWYgKGJUeEtleSkKKwl7CisKKyNpZmRlZiBSVDI4NzAKKwkJVUlOVDMyIHRtcFZhbDsKKworCQkvLworCQkvLyBXcml0ZSBJVgorCQkvLworCQlJVjQgPSAoS2V5SWR4IDw8IDYpOworCQlpZiAoKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkgfHwgKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUF9OT19NSUMpIHx8KENpcGhlckFsZyA9PSBDSVBIRVJfQUVTKSkKKwkJCUlWNCB8PSAweDIwOyAgLy8gdHVybiBvbiBleHRlbnNpb24gYml0IG1lYW5zIEVJViBleGlzdGVuY2UKKworCQl0bXBWYWwgPSBwVHh0c2NbMV0gKyAoKChwVHh0c2NbMV0gfCAweDIwKSAmIDB4N2YpIDw8IDgpICsgKHBUeHRzY1swXSA8PCAxNikgKyAoSVY0IDw8IDI0KTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCB0bXBWYWwpOworCisJCS8vCisJCS8vIFdyaXRlIEVJVgorCQkvLworCQlvZmZzZXQgKz0gNDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCAqKFBVSU5UMzIpJnBDaXBoZXJLZXktPlR4VHNjWzJdKTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwkJQXNpY1VwZGF0ZVdDSURBdHRyaWJ1dGUocEFkLCBXQ0lELCBCc3NJbmRleCwgQ2lwaGVyQWxnLCBiVXNlUGFpcmV3aXNlS2V5VGFibGUpOworCX0KKworCWlmICghYlVzZVBhaXJld2lzZUtleVRhYmxlKQorCXsKKwkJLy8KKwkJLy8gT25seSB1cGRhdGUgdGhlIHNoYXJlZCBrZXkgc2VjdXJpdHkgbW9kZQorCQkvLworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFICsgNCAqIChCc3NJbmRleCAvIDIpLCAmY3NyMS53b3JkKTsKKwkJaWYgKChCc3NJbmRleCAlIDIpID09IDApCisJCXsKKwkJCWlmIChLZXlJZHggPT0gMCkKKwkJCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCisJCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJCWVsc2UgaWYgKEtleUlkeCA9PSAyKQorCQkJCWNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCQllbHNlCisJCQkJY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmIChLZXlJZHggPT0gMCkKKwkJCQljc3IxLmZpZWxkLkJzczFLZXkwQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCisJCQkJY3NyMS5maWVsZC5Cc3MxS2V5MUNpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJCWVsc2UgaWYgKEtleUlkeCA9PSAyKQorCQkJCWNzcjEuZmllbGQuQnNzMUtleTJDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCQllbHNlCisJCQkJY3NyMS5maWVsZC5Cc3MxS2V5M0NpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJfQorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSArIDQgKiAoQnNzSW5kZXggLyAyKSwgY3NyMS53b3JkKTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gQXNpY0FkZEtleUVudHJ5XG4iKSk7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJQWRkIFBhaXItd2lzZSBrZXkgbWF0ZXJpYWwgaW50byBBU0lDLgorCQlVcGRhdGUgcGFpcndpc2Uga2V5LCBUeE1pYyBhbmQgUnhNaWMgdG8gQXNpYyBQYWlyLXdpc2Uga2V5IHRhYmxlCisKKyAgICBSZXR1cm46CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBBc2ljQWRkUGFpcndpc2VLZXlFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgICAgICAgIHBBZGRyLAorCUlOIFVDSEFSCQlXQ0lELAorCUlOIENJUEhFUl9LRVkJCSAqcENpcGhlcktleSkKK3sKKwlJTlQgaTsKKwlVTE9ORyAJCW9mZnNldDsKKwlQVUNIQVIJCSBwS2V5ID0gcENpcGhlcktleS0+S2V5OworCVBVQ0hBUgkJIHBUeE1pYyA9IHBDaXBoZXJLZXktPlR4TWljOworCVBVQ0hBUgkJIHBSeE1pYyA9IHBDaXBoZXJLZXktPlJ4TWljOworI2lmZGVmIERCRworCVVDSEFSCQlDaXBoZXJBbGcgPSBwQ2lwaGVyS2V5LT5DaXBoZXJBbGc7CisjZW5kaWYgLy8gREJHIC8vCisKKwkvLyBFS0VZCisJb2Zmc2V0ID0gUEFJUldJU0VfS0VZX1RBQkxFX0JBU0UgKyAoV0NJRCAqIEhXX0tFWV9FTlRSWV9TSVpFKTsKKyNpZmRlZiBSVDI4NzAKKwlSVFVTQk11bHRpV3JpdGUocEFkLCBvZmZzZXQsICZwQ2lwaGVyS2V5LT5LZXlbMF0sIE1BWF9MRU5fT0ZfUEVFUl9LRVkpOworI2VuZGlmIC8vIFJUMjg3MCAvLworCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfUEVFUl9LRVk7IGkrPTQpCisJeworCQlVSU5UMzIgVmFsdWU7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgb2Zmc2V0ICsgaSwgJlZhbHVlKTsKKwl9CisKKwlvZmZzZXQgKz0gTUFYX0xFTl9PRl9QRUVSX0tFWTsKKworCS8vICBNSUMgS0VZCisJaWYgKHBUeE1pYykKKwl7CisjaWZkZWYgUlQyODcwCisJCVJUVVNCTXVsdGlXcml0ZShwQWQsIG9mZnNldCwgJnBDaXBoZXJLZXktPlR4TWljWzBdLCA4KTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwl9CisJb2Zmc2V0ICs9IDg7CisJaWYgKHBSeE1pYykKKwl7CisjaWZkZWYgUlQyODcwCisJCVJUVVNCTXVsdGlXcml0ZShwQWQsIG9mZnNldCwgJnBDaXBoZXJLZXktPlJ4TWljWzBdLCA4KTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFzaWNBZGRQYWlyd2lzZUtleUVudHJ5OiBXQ0lEICMlZCBBbGc9JXNcbiIsV0NJRCwgQ2lwaGVyTmFtZVtDaXBoZXJBbGddKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIJS2V5ID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJcEtleVswXSxwS2V5WzFdLHBLZXlbMl0scEtleVszXSxwS2V5WzRdLHBLZXlbNV0scEtleVs2XSxwS2V5WzddLHBLZXlbOF0scEtleVs5XSxwS2V5WzEwXSxwS2V5WzExXSxwS2V5WzEyXSxwS2V5WzEzXSxwS2V5WzE0XSxwS2V5WzE1XSkpOworCWlmIChwUnhNaWMpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIJUnggTUlDIEtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCXBSeE1pY1swXSxwUnhNaWNbMV0scFJ4TWljWzJdLHBSeE1pY1szXSxwUnhNaWNbNF0scFJ4TWljWzVdLHBSeE1pY1s2XSxwUnhNaWNbN10pKTsKKwl9CisJaWYgKHBUeE1pYykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIglUeCBNSUMgS2V5ID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJcFR4TWljWzBdLHBUeE1pY1sxXSxwVHhNaWNbMl0scFR4TWljWzNdLHBUeE1pY1s0XSxwVHhNaWNbNV0scFR4TWljWzZdLHBUeE1pY1s3XSkpOworCX0KK30KKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVJlbW92ZSBQYWlyLXdpc2Uga2V5IG1hdGVyaWFsIGZyb20gQVNJQy4KKworICAgIFJldHVybjoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSCQkgQnNzSWR4LAorCUlOIFVDSEFSCQkgV2NpZCkKK3sKKwlVTE9ORwkJV0NJREF0dHJpOworCVVTSE9SVAkJb2Zmc2V0OworCisJLy8gcmUtc2V0IHRoZSBlbnRyeSdzIFdDSUQgYXR0cmlidXRlIGFzIE9QRU4tTk9ORS4KKwlvZmZzZXQgPSBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSArIChXY2lkICogSFdfV0NJRF9BVFRSSV9TSVpFKTsKKwlXQ0lEQXR0cmkgPSAoQnNzSWR4PDw0KSB8IFBBSVJXSVNFS0VZVEFCTEU7CisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBXQ0lEQXR0cmkpOworfQorCitCT09MRUFOIEFzaWNTZW5kQ29tbWFuZFRvTWN1KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSCQkgQ29tbWFuZCwKKwlJTiBVQ0hBUgkJIFRva2VuLAorCUlOIFVDSEFSCQkgQXJnMCwKKwlJTiBVQ0hBUgkJIEFyZzEpCit7CisJSE9TVF9DTURfQ1NSX1NUUlVDCUgyTUNtZDsKKwlIMk1fTUFJTEJPWF9TVFJVQwlIMk1NYWlsYm94OworCVVMT05HCQkJCWkgPSAwOworCWRvCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIEgyTV9NQUlMQk9YX0NTUiwgJkgyTU1haWxib3gud29yZCk7CisJCWlmIChIMk1NYWlsYm94LmZpZWxkLk93bmVyID09IDApCisJCQlicmVhazsKKworCQlSVE1QdXNlY0RlbGF5KDIpOworCX0gd2hpbGUoaSsrIDwgMTAwKTsKKworCWlmIChpID49IDEwMCkKKwl7CisJCXsKKwkJREJHUFJJTlRfRVJSKCgiSDJNX01BSUxCT1ggc3RpbGwgaG9sZCBieSBNQ1UuIGNvbW1hbmQgZmFpbFxuIikpOworCQl9CisJCXJldHVybiBGQUxTRTsKKwl9CisKKworCUgyTU1haWxib3guZmllbGQuT3duZXIJICA9IDE7CSAgIC8vIHBhc3Mgb3duZXJzaGlwIHRvIE1DVQorCUgyTU1haWxib3guZmllbGQuQ21kVG9rZW4gPSBUb2tlbjsKKwlIMk1NYWlsYm94LmZpZWxkLkhpZ2hCeXRlID0gQXJnMTsKKwlIMk1NYWlsYm94LmZpZWxkLkxvd0J5dGUgID0gQXJnMDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9DU1IsIEgyTU1haWxib3gud29yZCk7CisKKwlIMk1DbWQud29yZCAJCQkgID0gMDsKKwlIMk1DbWQuZmllbGQuSG9zdENvbW1hbmQgID0gQ29tbWFuZDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIT1NUX0NNRF9DU1IsIEgyTUNtZC53b3JkKTsKKworCWlmIChDb21tYW5kICE9IDB4ODApCisJeworCX0KKworCXJldHVybiBUUlVFOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlWZXJpZnkgdGhlIHN1cHBvcnQgcmF0ZSBmb3IgZGlmZmVyZW50IFBIWSB0eXBlCisKKwlBcmd1bWVudHM6CisJCXBBZCAJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QQ2hlY2tSYXRlcygKKwlJTgkJUFJUTVBfQURBUFRFUglwQWQsCisJSU4gT1VUCVVDSEFSCQkJU3VwUmF0ZVtdLAorCUlOIE9VVAlVQ0hBUgkJCSpTdXBSYXRlTGVuKQoreworCVVDSEFSCVJhdGVJZHgsIGksIGo7CisJVUNIQVIJTmV3UmF0ZVsxMl0sIE5ld1JhdGVMZW47CisKKwlOZXdSYXRlTGVuID0gMDsKKworCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpCisJCVJhdGVJZHggPSA0OworCWVsc2UKKwkJUmF0ZUlkeCA9IDEyOworCisJLy8gQ2hlY2sgZm9yIHN1cHBvcnQgcmF0ZXMgZXhjbHVkZSBiYXNpYyByYXRlIGJpdAorCWZvciAoaSA9IDA7IGkgPCAqU3VwUmF0ZUxlbjsgaSsrKQorCQlmb3IgKGogPSAwOyBqIDwgUmF0ZUlkeDsgaisrKQorCQkJaWYgKChTdXBSYXRlW2ldICYgMHg3ZikgPT0gUmF0ZUlkVG81MDBLYnBzW2pdKQorCQkJCU5ld1JhdGVbTmV3UmF0ZUxlbisrXSA9IFN1cFJhdGVbaV07CisKKwkqU3VwUmF0ZUxlbiA9IE5ld1JhdGVMZW47CisJTmRpc01vdmVNZW1vcnkoU3VwUmF0ZSwgTmV3UmF0ZSwgTmV3UmF0ZUxlbik7Cit9CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK0JPT0xFQU4gUlRNUENoZWNrQ2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUgkJQ2VudHJhbENoYW5uZWwsCisJSU4gVUNIQVIJCUNoYW5uZWwpCit7CisJVUNIQVIJCWs7CisJVUNIQVIJCVVwcGVyQ2hhbm5lbCA9IDAsIExvd2VyQ2hhbm5lbCA9IDA7CisJVUNIQVIJCU5vRWZmZWN0Q2hhbm5lbGluTGlzdCA9IDA7CisKKwkvLyBGaW5kIHVwcGVyIGFuZCBsb3dlciBjaGFubmVsIGFjY29yZGluZyB0byA0ME1IeiBjdXJyZW50IG9wZXJhdGlvbi4KKwlpZiAoQ2VudHJhbENoYW5uZWwgPCBDaGFubmVsKQorCXsKKwkJVXBwZXJDaGFubmVsID0gQ2hhbm5lbDsKKwkJaWYgKENlbnRyYWxDaGFubmVsID4gMikKKwkJCUxvd2VyQ2hhbm5lbCA9IENlbnRyYWxDaGFubmVsIC0gMjsKKwkJZWxzZQorCQkJcmV0dXJuIEZBTFNFOworCX0KKwllbHNlIGlmIChDZW50cmFsQ2hhbm5lbCA+IENoYW5uZWwpCisJeworCQlVcHBlckNoYW5uZWwgPSBDZW50cmFsQ2hhbm5lbCArIDI7CisJCUxvd2VyQ2hhbm5lbCA9IENoYW5uZWw7CisJfQorCisJZm9yIChrID0gMDtrIDwgcEFkLT5DaGFubmVsTGlzdE51bTtrKyspCisJeworCQlpZiAocEFkLT5DaGFubmVsTGlzdFtrXS5DaGFubmVsID09IFVwcGVyQ2hhbm5lbCkKKwkJeworCQkJTm9FZmZlY3RDaGFubmVsaW5MaXN0ICsrOworCQl9CisJCWlmIChwQWQtPkNoYW5uZWxMaXN0W2tdLkNoYW5uZWwgPT0gTG93ZXJDaGFubmVsKQorCQl7CisJCQlOb0VmZmVjdENoYW5uZWxpbkxpc3QgKys7CisJCX0KKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlRvdGFsIENoYW5uZWwgaW4gQ2hhbm5lbCBMaXN0ID0gWyVkXVxuIiwgTm9FZmZlY3RDaGFubmVsaW5MaXN0KSk7CisJaWYgKE5vRWZmZWN0Q2hhbm5lbGluTGlzdCA9PSAyKQorCQlyZXR1cm4gVFJVRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVZlcmlmeSB0aGUgc3VwcG9ydCByYXRlIGZvciBIVCBwaHkgdHlwZQorCisJQXJndW1lbnRzOgorCQlwQWQgCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJRkFMU0UgaWYgcEFkLT5Db21tb25DZmcuU3VwcG9ydGVkSHRQaHkgZG9lc24ndCBhY2NlcHQgdGhlIHBIdENhcGFiaWxpdHkuICAoQVAgTW9kZSkKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOIAlSVE1QQ2hlY2tIdCgKKwlJTglQUlRNUF9BREFQVEVSCQkJcEFkLAorCUlOCVVDSEFSCQkJCQlXY2lkLAorCUlOIAlIVF9DQVBBQklMSVRZX0lFCQkqcEh0Q2FwYWJpbGl0eSwKKwlJTiAJQUREX0hUX0lORk9fSUUJCQkqcEFkZEh0SW5mbykKK3sKKwlpZiAoV2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJcmV0dXJuIEZBTFNFOworCisJLy8gSWYgdXNlIEFNU0RVLCBzZXQgZmxhZy4KKwlpZiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlKQorCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQpOworCS8vIFNhdmUgUGVlciBDYXBhYmlsaXR5CisJaWYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApCisJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sIGZDTElFTlRfU1RBVFVTX1NHSTIwX0NBUEFCTEUpOworCWlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjQwKQorCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBmQ0xJRU5UX1NUQVRVU19TR0k0MF9DQVBBQkxFKTsKKwlpZiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlR4U1RCQykKKwkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXSwgZkNMSUVOVF9TVEFUVVNfVHhTVEJDX0NBUEFCTEUpOworCWlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uUnhTVEJDKQorCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBmQ0xJRU5UX1NUQVRVU19SeFNUQkNfQ0FQQUJMRSk7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJSZGcgJiYgcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlJER1N1cHBvcnQpCisJeworCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSk7CisJfQorCisJaWYgKFdjaWQgPCBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwl7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uTXBkdURlbnNpdHkgPSBwSHRDYXBhYmlsaXR5LT5IdENhcFBhcm0uTXBkdURlbnNpdHk7CisJfQorCisJLy8gV2lsbCBjaGVjayBDaGFubmVsV2lkdGggZm9yIE1DU1NldFs0XSBiZWxvdworCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzRdID0gMHgxOworICAgIHN3aXRjaCAocEFkLT5Db21tb25DZmcuUnhTdHJlYW0pCisJeworCQljYXNlIDE6CisJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFswXSA9IDB4ZmY7CisJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9IDB4MDA7CisgICAgICAgICAgICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFsyXSA9IDB4MDA7CisgICAgICAgICAgICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFszXSA9IDB4MDA7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAweGZmOworCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAweGZmOworICAgICAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMl0gPSAweDAwOworICAgICAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbM10gPSAweDAwOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzBdID0gMHhmZjsKKwkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzFdID0gMHhmZjsKKyAgICAgICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzJdID0gMHhmZjsKKyAgICAgICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzNdID0gMHgwMDsKKwkJCWJyZWFrOworCX0KKworCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9IHBBZGRIdEluZm8tPkFkZEh0SW5mby5SZWNvbVdpZHRoICYgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aDsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBDaGVja0h0OjogSHRDYXBJbmZvLkNoYW5uZWxXaWR0aD0lZCwgUmVjb21XaWR0aD0lZCwgRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aD0lZCwgQlc0ME1BdmFpbEZvckEvRz0lZC8lZCwgUGh5TW9kZT0lZCBcbiIsCisJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCwgcEFkZEh0SW5mby0+QWRkSHRJbmZvLlJlY29tV2lkdGgsIHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGgsCisJCXBBZC0+TmljQ29uZmlnMi5maWVsZC5CVzQwTUF2YWlsRm9yQSwgcEFkLT5OaWNDb25maWcyLmZpZWxkLkJXNDBNQXZhaWxGb3JHLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKSk7CisKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5HRiA9ICBwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uR0YgJnBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRjsKKworCS8vIFNlbmQgQXNzb2MgUmVxIHdpdGggbXkgSFQgY2FwYWJpbGl0eS4KKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemUgPSAgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZTsKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHMgPSAgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QczsKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yMjAgPSAgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yMjApICYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApOworCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3I0MCA9ICAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3I0MCkgJiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3I0MCk7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uVHhTVEJDID0gIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSYocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlJ4U1RCQyk7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uUnhTVEJDID0gIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuUnhTVEJDKSYocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlR4U1RCQyk7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTWF4UkFtcGR1RmFjdG9yID0gcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1heFJBbXBkdUZhY3RvcjsKKyAgICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHk7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQyA9IHBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mby5QbHVzSFRDOworCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uSFRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDID0gcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlBsdXNIVEM7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJSZGcpCisJeworCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0ID0gcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlJER1N1cHBvcnQ7CisgICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlBsdXNIVEMgPSAxOworCX0KKworICAgIGlmIChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfMjApCisgICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzRdID0gMHgwOyAgLy8gQlcyMCBjYW4ndCB0cmFuc21pdCBNQ1MzMgorCisJQ09QWV9BUF9IVFNFVFRJTkdTX0ZST01fQkVBQ09OKHBBZCwgcEh0Q2FwYWJpbGl0eSk7CisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlWZXJpZnkgdGhlIHN1cHBvcnQgcmF0ZSBmb3IgZGlmZmVyZW50IFBIWSB0eXBlCisKKwlBcmd1bWVudHM6CisJCXBBZCAJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QVXBkYXRlTWxtZVJhdGUoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpCit7CisJVUNIQVIJTWluaW11bVJhdGU7CisJVUNIQVIJUHJvcGVyTWxtZVJhdGU7IC8vPSBSQVRFXzU0OworCVVDSEFSCWksIGosIFJhdGVJZHggPSAxMjsgLy8xLCAyLCA1LjUsIDExLCA2LCA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0CisJQk9PTEVBTgliTWF0Y2ggPSBGQUxTRTsKKworCXN3aXRjaCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSkKKwl7CisJCWNhc2UgUEhZXzExQjoKKwkJCVByb3Blck1sbWVSYXRlID0gUkFURV8xMTsKKwkJCU1pbmltdW1SYXRlID0gUkFURV8xOworCQkJYnJlYWs7CisJCWNhc2UgUEhZXzExQkdfTUlYRUQ6CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgUEhZXzExQUJHTl9NSVhFRDoKKwkJY2FzZSBQSFlfMTFCR05fTUlYRUQ6CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQlpZiAoKHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuID09IDQpICYmCisJCQkJKHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuID09IDApKQorCQkJCS8vIEIgb25seSBBUAorCQkJCVByb3Blck1sbWVSYXRlID0gUkFURV8xMTsKKwkJCWVsc2UKKwkJCQlQcm9wZXJNbG1lUmF0ZSA9IFJBVEVfMjQ7CisKKwkJCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA8PSAxNCkKKwkJCQlNaW5pbXVtUmF0ZSA9IFJBVEVfMTsKKwkJCWVsc2UKKwkJCQlNaW5pbXVtUmF0ZSA9IFJBVEVfNjsKKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMUE6CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgUEhZXzExTl8yXzRHOgkvLyBydDI4NjAgbmVlZCB0byBjaGVjayBtbG1lcmF0ZSBmb3IgODAyLjExbgorCQljYXNlIFBIWV8xMUdOX01JWEVEOgorCQljYXNlIFBIWV8xMUFHTl9NSVhFRDoKKwkJY2FzZSBQSFlfMTFBTl9NSVhFRDoKKwkJY2FzZSBQSFlfMTFOXzVHOgorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJUHJvcGVyTWxtZVJhdGUgPSBSQVRFXzI0OworCQkJTWluaW11bVJhdGUgPSBSQVRFXzY7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfMTFBQkdfTUlYRUQ6CisJCQlQcm9wZXJNbG1lUmF0ZSA9IFJBVEVfMjQ7CisJCQlpZiAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPD0gMTQpCisJCQkgICBNaW5pbXVtUmF0ZSA9IFJBVEVfMTsKKwkJCWVsc2UKKwkJCQlNaW5pbXVtUmF0ZSA9IFJBVEVfNjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OiAvLyBlcnJvcgorCQkJUHJvcGVyTWxtZVJhdGUgPSBSQVRFXzE7CisJCQlNaW5pbXVtUmF0ZSA9IFJBVEVfMTsKKwkJCWJyZWFrOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbjsgaSsrKQorCXsKKwkJZm9yIChqID0gMDsgaiA8IFJhdGVJZHg7IGorKykKKwkJeworCQkJaWYgKChwQWQtPk1sbWVBdXguU3VwUmF0ZVtpXSAmIDB4N2YpID09IFJhdGVJZFRvNTAwS2Jwc1tqXSkKKwkJCXsKKwkJCQlpZiAoaiA9PSBQcm9wZXJNbG1lUmF0ZSkKKwkJCQl7CisJCQkJCWJNYXRjaCA9IFRSVUU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChiTWF0Y2gpCisJCQlicmVhazsKKwl9CisKKwlpZiAoYk1hdGNoID09IEZBTFNFKQorCXsKKwkJZm9yIChpID0gMDsgaSA8IHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuOyBpKyspCisJCXsKKwkJCWZvciAoaiA9IDA7IGogPCBSYXRlSWR4OyBqKyspCisJCQl7CisJCQkJaWYgKChwQWQtPk1sbWVBdXguRXh0UmF0ZVtpXSAmIDB4N2YpID09IFJhdGVJZFRvNTAwS2Jwc1tqXSkKKwkJCQl7CisJCQkJCWlmIChqID09IFByb3Blck1sbWVSYXRlKQorCQkJCQl7CisJCQkJCQliTWF0Y2ggPSBUUlVFOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWlmIChiTWF0Y2gpCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoYk1hdGNoID09IEZBTFNFKQorCXsKKwkJUHJvcGVyTWxtZVJhdGUgPSBNaW5pbXVtUmF0ZTsKKwl9CisKKwlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IE1pbmltdW1SYXRlOworCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBQcm9wZXJNbG1lUmF0ZTsKKwlpZiAocEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPj0gUkFURV82KQorCXsKKwkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTUzBNY2FzdF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOworCX0KKwllbHNlCisJeworCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gcEFkLT5Db21tb25DZmcuTWxtZVJhdGU7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QVXBkYXRlTWxtZVJhdGUgPT0+ICAgTWxtZVRyYW5zbWl0ID0gMHgleCAgXG4iICwgcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LndvcmQpKTsKK30KKworQ0hBUiBSVE1QTWF4UnNzaSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBDSEFSCQkJCVJzc2kwLAorCUlOIENIQVIJCQkJUnNzaTEsCisJSU4gQ0hBUgkJCQlSc3NpMikKK3sKKwlDSEFSCWxhcmdlciA9IC0xMjc7CisKKwlpZiAoKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkgJiYgKFJzc2kwICE9IDApKQorCXsKKwkJbGFyZ2VyID0gUnNzaTA7CisJfQorCisJaWYgKChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID49IDIpICYmIChSc3NpMSAhPSAwKSkKKwl7CisJCWxhcmdlciA9IG1heChSc3NpMCwgUnNzaTEpOworCX0KKworCWlmICgocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKSAmJiAoUnNzaTIgIT0gMCkpCisJeworCQlsYXJnZXIgPSBtYXgobGFyZ2VyLCBSc3NpMik7CisJfQorCisJaWYgKGxhcmdlciA9PSAtMTI3KQorCQlsYXJnZXIgPSAwOworCisJcmV0dXJuIGxhcmdlcjsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBQZXJpb2RpYyBldmFsdWF0ZSBhbnRlbm5hIGxpbmsgc3RhdHVzCisKKyAgICBBcmd1bWVudHM6CisgICAgICAgIHBBZCAgICAgICAgIC0gQWRhcHRlciBwb2ludGVyCisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIE5vbmUKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQXNpY0V2YWx1YXRlUnhBbnQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpCit7CisJVUNIQVIJQkJQUjMgPSAwOworCisjaWZkZWYgUkFMSU5LX0FURQorCWlmIChBVEVfT04ocEFkKSkKKwkJcmV0dXJuOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MJfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MJfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JBRElPX09GRgkJCXwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUCQl8CisJCQkJCQkJCWZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorCQkJcmV0dXJuOworCisJCWlmIChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpCisJCQlyZXR1cm47CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQkJQUjMpOworCUJCUFIzICY9ICh+MHgxOCk7CisJaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKQorCXsKKwkJQkJQUjMgfD0gKDB4MTApOworCX0KKwllbHNlIGlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMikKKwl7CisJCUJCUFIzIHw9ICgweDgpOworCX0KKwllbHNlIGlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKKwl7CisJCUJCUFIzIHw9ICgweDApOworCX0KKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCQlBSMyk7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKQorCQkpCisJeworCQlVTE9ORwlUeFRvdGFsQ250ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsKKwkJCQkJCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArCisJCQkJCQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQ7CisKKwkJaWYgKFR4VG90YWxDbnQgPiA1MCkKKwkJeworCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUnhBbnRFdmFsVGltZXIsIDIwKTsKKwkJCXBBZC0+TWxtZS5iTG93VGhyb3VnaHB1dCA9IEZBTFNFOworCQl9CisJCWVsc2UKKwkJeworCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUnhBbnRFdmFsVGltZXIsIDMwMCk7CisJCQlwQWQtPk1sbWUuYkxvd1Rocm91Z2hwdXQgPSBUUlVFOworCQl9CisJfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgICAgIEFmdGVyIGV2YWx1YXRpb24sIGNoZWNrIGFudGVubmEgbGluayBzdGF0dXMKKworICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkICAgICAgICAgLSBBZGFwdGVyIHBvaW50ZXIKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgTm9uZQorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBBc2ljUnhBbnRFdmFsVGltZW91dCgKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisJUlRNUF9BREFQVEVSCSpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCVVDSEFSCQkJQkJQUjMgPSAwOworCUNIQVIJCQlsYXJnZXIgPSAtMTI3LCByc3NpMCwgcnNzaTEsIHJzc2kyOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgUkFMSU5LX0FURQorCWlmIChBVEVfT04ocEFkKSkKKwkJcmV0dXJuOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpCXx8CisJCQlSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykJCXx8CisJCQlSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKQkJCXx8CisJCQlSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCQlyZXR1cm47CisKKwkJaWYgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkKKwkJCXJldHVybjsKKworCisJCS8vIGlmIHRoZSB0cmFmZmljIGlzIGxvdywgdXNlIGF2ZXJhZ2UgcnNzaSBhcyB0aGUgY3JpdGVyaWEKKwkJaWYgKHBBZC0+TWxtZS5iTG93VGhyb3VnaHB1dCA9PSBUUlVFKQorCQl7CisJCQlyc3NpMCA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwOworCQkJcnNzaTEgPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMTsKKwkJCXJzc2kyID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTI7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyc3NpMCA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTA7CisJCQlyc3NpMSA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTE7CisJCQlyc3NpMiA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTI7CisJCX0KKworCQlpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDMpCisJCXsKKwkJCWxhcmdlciA9IG1heChyc3NpMCwgcnNzaTEpOworCisJCQlpZiAobGFyZ2VyID4gKHJzc2kyICsgMjApKQorCQkJCXBBZC0+TWxtZS5SZWFsUnhQYXRoID0gMjsKKwkJCWVsc2UKKwkJCQlwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9IDM7CisJCX0KKwkJZWxzZSBpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpCisJCXsKKwkJCWlmIChyc3NpMCA+IChyc3NpMSArIDIwKSkKKwkJCQlwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9IDE7CisJCQllbHNlCisJCQkJcEFkLT5NbG1lLlJlYWxSeFBhdGggPSAyOworCQl9CisKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQkJQUjMpOworCQlCQlBSMyAmPSAofjB4MTgpOworCQlpZihwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9PSAzKQorCQl7CisJCQlCQlBSMyB8PSAoMHgxMCk7CisJCX0KKwkJZWxzZSBpZihwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9PSAyKQorCQl7CisJCQlCQlBSMyB8PSAoMHg4KTsKKwkJfQorCQllbHNlIGlmKHBBZC0+TWxtZS5SZWFsUnhQYXRoID09IDEpCisJCXsKKwkJCUJCUFIzIHw9ICgweDApOworCQl9CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJCUFIzKTsKKwl9CisKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworfQorCisKKworVk9JRCBBUFNEUGVyaW9kaWNFeGVjKAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKwlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisKKwlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwkJcmV0dXJuOworCisJcEFkLT5Db21tb25DZmcuVHJpZ2dlclRpbWVyQ291bnQrKzsKKworLy8gRHJpdmVyIHNob3VsZCBub3Qgc2VuZCB0cmlnZ2VyIGZyYW1lLCBpdCBzaG91bGQgYmUgc2VuZCBieSBhcHBsaWNhdGlvbiBsYXllcgorLyoKKwlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlCisJCSYmIChwQWQtPkNvbW1vbkNmZy5iTmVlZFNlbmRUcmlnZ2VyRnJhbWUgfHwKKwkJKCgocEFkLT5Db21tb25DZmcuVHJpZ2dlclRpbWVyQ291bnQlMjApID09IDE5KSAmJiAoIXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUgfHwgIXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQksgfHwgIXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkgfHwgIXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8pKSkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNlbmRpbmcgdHJpZ2dlciBmcmFtZSBhbmQgZW50ZXIgc2VydmljZSBwZXJpb2Qgd2hlbiBzdXBwb3J0IEFQU0RcbiIpKTsKKwkJUlRNUFNlbmROdWxsRnJhbWUocEFkLCBwQWQtPkNvbW1vbkNmZy5UeFJhdGUsIFRSVUUpOworCQlwQWQtPkNvbW1vbkNmZy5iTmVlZFNlbmRUcmlnZ2VyRnJhbWUgPSBGQUxTRTsKKwkJcEFkLT5Db21tb25DZmcuVHJpZ2dlclRpbWVyQ291bnQgPSAwOworCQlwQWQtPkNvbW1vbkNmZy5iSW5TZXJ2aWNlUGVyaW9kID0gVFJVRTsKKwl9Ki8KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQvcmVzZXQgTUFDIHJlZ2lzdGVycyBhY2NvcmRpbmcgdG8gYlBpZ2d5QmFjayBwYXJhbWV0ZXIKKworICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkICAgICAgICAgLSBBZGFwdGVyIHBvaW50ZXIKKyAgICAgICAgYlBpZ2d5QmFjayAgLSBFbmFibGUgLyBEaXNhYmxlIFBpZ2d5LUJhY2sKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgTm9uZQorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QU2V0UGlnZ3lCYWNrKAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorICAgIElOIEJPT0xFQU4gICAgICAgICAgYlBpZ2d5QmFjaykKK3sKKwlUWF9MSU5LX0NGR19TVFJVQyAgVHhMaW5rQ2ZnOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9MSU5LX0NGRywgJlR4TGlua0NmZy53b3JkKTsKKworCVR4TGlua0NmZy5maWVsZC5UeENGQWNrRW4gPSBiUGlnZ3lCYWNrOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0xJTktfQ0ZHLCBUeExpbmtDZmcud29yZCk7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICAgICAgY2hlY2sgaWYgdGhpcyBlbnRyeSBuZWVkIHRvIHN3aXRjaCByYXRlIGF1dG9tYXRpY2FsbHkKKworICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkCisgICAgICAgIHBFbnRyeQorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBUVVJFCisgICAgICAgIEZBTFNFCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOIFJUTVBDaGVja0VudHJ5RW5hYmxlQXV0b1JhdGVTd2l0Y2goCisJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJSU4gUE1BQ19UQUJMRV9FTlRSWQlwRW50cnkpCit7CisJQk9PTEVBTgkJcmVzdWx0ID0gVFJVRTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCS8vIG9ubHkgYXNzb2NpYXRlZCBTVEEgY291bnRzCisJCWlmIChwRW50cnkgJiYgKHBFbnRyeS0+VmFsaWRBc0NMSSkgJiYgKHBFbnRyeS0+U3N0ID09IFNTVF9BU1NPQykpCisJCXsKKwkJCXJlc3VsdCA9IHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoOworCQl9CisJCWVsc2UKKwkJCXJlc3VsdCA9IEZBTFNFOworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWlmIChwRW50cnkgJiYgKHBFbnRyeS0+VmFsaWRBc0RscykpCisJCQlyZXN1bHQgPSBwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaDsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworCisJcmV0dXJuIHJlc3VsdDsKK30KKworCitCT09MRUFOIFJUTVBBdXRvUmF0ZVN3aXRjaENoZWNrKAorCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkKQoreworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWlmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCkKKwkJCXJldHVybiBUUlVFOworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlyZXR1cm4gRkFMU0U7Cit9CisKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBjaGVjayBpZiB0aGlzIGVudHJ5IG5lZWQgdG8gZml4IHR4IGxlZ2FjeSByYXRlCisKKyAgICBBcmd1bWVudHM6CisgICAgICAgIHBBZAorICAgICAgICBwRW50cnkKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgVFVSRQorICAgICAgICBGQUxTRQorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVUNIQVIgUlRNUFN0YUZpeGVkVHhNb2RlKAorCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCUlOIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5KQoreworCVVDSEFSCXR4X21vZGUgPSBGSVhFRF9UWE1PREVfSFQ7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQl0eF9tb2RlID0gKFVDSEFSKXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGU7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJcmV0dXJuIHR4X21vZGU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICAgICAgT3ZlcndyaXRlIEhUIFR4IE1vZGUgYnkgRml4ZWQgTGVnZW5jeSBUeCBNb2RlLCBpZiBzcGVjaWZpZWQuCisKKyAgICBBcmd1bWVudHM6CisgICAgICAgIHBBZAorICAgICAgICBwRW50cnkKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgVFVSRQorICAgICAgICBGQUxTRQorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nKAorCQlVQ0hBUgkJCQlmaXhlZF90eF9tb2RlLAorCQlQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSkKK3sKKwlIVFRSQU5TTUlUX1NFVFRJTkcgVHJhbnNtaXRTZXR0aW5nOworCisJaWYgKGZpeGVkX3R4X21vZGUgPT0gRklYRURfVFhNT0RFX0hUKQorCQlyZXR1cm47CisKKwlUcmFuc21pdFNldHRpbmcud29yZCA9IDA7CisKKwlUcmFuc21pdFNldHRpbmcuZmllbGQuTU9ERSA9IHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREU7CisJVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUzsKKworCWlmIChmaXhlZF90eF9tb2RlID09IEZJWEVEX1RYTU9ERV9DQ0spCisJeworCQlUcmFuc21pdFNldHRpbmcuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkvLyBDQ0sgbW9kZSBhbGxvdyBNQ1MgMH4zCisJCWlmIChUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID4gTUNTXzMpCisJCQlUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzM7CisJfQorCWVsc2UKKwl7CisJCVRyYW5zbWl0U2V0dGluZy5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkvLyBPRkRNIG1vZGUgYWxsb3cgTUNTIDB+NworCQlpZiAoVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA+IE1DU183KQorCQkJVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU183OworCX0KKworCWlmIChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID49IFRyYW5zbWl0U2V0dGluZy5maWVsZC5NT0RFKQorCXsKKwkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IFRyYW5zbWl0U2V0dGluZy53b3JkOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nIDogd2NpZC0lZCwgTU9ERT0lcywgTUNTPSVkIFxuIiwKKwkJCQlwRW50cnktPkFpZCwgR2V0UGh5TW9kZShwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFKSwgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTKSk7CisJfQorfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCWR5bmFtaWMgdHVuZSBCQlAgUjY2IHRvIGZpbmQgYSBiYWxhbmNlIGJldHdlZW4gc2Vuc2liaWxpdHkgYW5kCisJCW5vaXNlIGlzb2xhdGlvbgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzaWNTdGFCYnBUdW5pbmcoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUNIQVIJT3JpZ1I2NlZhbHVlID0gMCwgUjY2Oy8vLCBSNjZVcHBlckJvdW5kID0gMHgzMCwgUjY2TG93ZXJCb3VuZCA9IDB4MzA7CisJQ0hBUglSc3NpOworCisJLy8gMjg2MEMgZGlkIG5vdCBzdXBwb3J0IEZhc2UgQ0NBLCB0aGVyZWZvcmUgY2FuJ3QgdHVuZQorCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKKwkJcmV0dXJuOworCisJLy8KKwkvLyB3b3JrIGFzIGEgU1RBCisJLy8KKwlpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpICAvLyBubyBSNjYgdHVuaW5nIHdoZW4gU0NBTk5JTkcKKwkJcmV0dXJuOworCisJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorCQkmJiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpCisJCQkpCisJCSYmICEoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKwkJKQorCXsKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgJk9yaWdSNjZWYWx1ZSk7CisJCVI2NiA9IE9yaWdSNjZWYWx1ZTsKKworCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+IDEpCisJCQlSc3NpID0gKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAgKyBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxKSA+PiAxOworCQllbHNlCisJCQlSc3NpID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMDsKKworCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQorCQl7CS8vQkcgYmFuZAorI2lmZGVmIFJUMjg3MAorCQkJLy8gUlQzMDcwIGlzIGEgbm8gTE5BIHNvbHV0aW9uLCBpdCBzaG91bGQgaGF2ZSBkaWZmZXJlbnQgY29udHJvbCByZWdhcmRpbmcgdG8gQUdDIGdhaW4gY29udHJvbAorCQkJLy8gT3RoZXJ3aXNlLCBpdCB3aWxsIGhhdmUgc29tZSB0aHJvdWdocHV0IHNpZGUgZWZmZWN0IHdoZW4gbG93IFJTU0kKKwkJCWlmIChJU19SVDMwNzAocEFkKSkKKwkJCXsKKwkJCQlpZiAoUnNzaSA+IFJTU0lfRk9SX01JRF9MT1dfU0VOU0lCSUxJVFkpCisJCQkJeworCQkJCQlSNjYgPSAweDFDICsgMipHRVRfTE5BX0dBSU4ocEFkKSArIDB4MjA7CisJCQkJCWlmIChPcmlnUjY2VmFsdWUgIT0gUjY2KQorCQkJCQl7CisJCQkJCQlSVFVTQldyaXRlQkJQUmVnaXN0ZXIocEFkLCBCQlBfUjY2LCBSNjYpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVI2NiA9IDB4MUMgKyAyKkdFVF9MTkFfR0FJTihwQWQpOworCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikKKwkJCQkJeworCQkJCQkJUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2UKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwkJCXsKKwkJCQlpZiAoUnNzaSA+IFJTU0lfRk9SX01JRF9MT1dfU0VOU0lCSUxJVFkpCisJCQkJeworCQkJCQlSNjYgPSAoMHgyRSArIEdFVF9MTkFfR0FJTihwQWQpKSArIDB4MTA7CisJCQkJCWlmIChPcmlnUjY2VmFsdWUgIT0gUjY2KQorCQkJCQl7CisJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSNjYgPSAweDJFICsgR0VUX0xOQV9HQUlOKHBBZCk7CisJCQkJCWlmIChPcmlnUjY2VmFsdWUgIT0gUjY2KQorCQkJCQl7CisJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsJLy9BIGJhbmQKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfMjApCisJCQl7CisJCQkJaWYgKFJzc2kgPiBSU1NJX0ZPUl9NSURfTE9XX1NFTlNJQklMSVRZKQorCQkJCXsKKwkJCQkJUjY2ID0gMHgzMiArIChHRVRfTE5BX0dBSU4ocEFkKSo1KS8zICsgMHgxMDsKKwkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCisJCQkJCXsKKwkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVI2NiA9IDB4MzIgKyAoR0VUX0xOQV9HQUlOKHBBZCkqNSkvMzsKKwkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCisJCQkJCXsKKwkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmIChSc3NpID4gUlNTSV9GT1JfTUlEX0xPV19TRU5TSUJJTElUWSkKKwkJCQl7CisJCQkJCVI2NiA9IDB4M0EgKyAoR0VUX0xOQV9HQUlOKHBBZCkqNSkvMyArIDB4MTA7CisJCQkJCWlmIChPcmlnUjY2VmFsdWUgIT0gUjY2KQorCQkJCQl7CisJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSNjYgPSAweDNBICsgKEdFVF9MTkFfR0FJTihwQWQpKjUpLzM7CisJCQkJCWlmIChPcmlnUjY2VmFsdWUgIT0gUjY2KQorCQkJCQl7CisJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisKKwl9Cit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK1ZPSUQgUlRNUFNldEFHQ0luaXRWYWx1ZSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVQ0hBUgkJCUJhbmRXaWR0aCkKK3sKKwlVQ0hBUglSNjYgPSAweDMwOworCisJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKKwl7CS8vIEJHIGJhbmQKKwkJUjY2ID0gMHgyRSArIEdFVF9MTkFfR0FJTihwQWQpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwl9CisJZWxzZQorCXsJLy9BIGJhbmQKKwkJaWYgKEJhbmRXaWR0aCA9PSBCV18yMCkKKwkJeworCQkJUjY2ID0gKFVDSEFSKSgweDMyICsgKEdFVF9MTkFfR0FJTihwQWQpKjUpLzMpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7CisJCX0KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJZWxzZQorCQl7CisJCQlSNjYgPSAoVUNIQVIpKDB4M0EgKyAoR0VUX0xOQV9HQUlOKHBBZCkqNSkvMyk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCX0KKworfQorCitWT0lEIEFzaWNUdXJuT2ZmUkZDbGsoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUNIQVIJCUNoYW5uZWwpCit7CisKKwkvLyBSRiBSMiBiaXQgMTggPSAwCisJVUlOVDMyCQkJUjEgPSAwLCBSMiA9IDAsIFIzID0gMDsKKwlVQ0hBUgkJCWluZGV4OworCVJUTVBfUkZfUkVHUwkqUkZSZWdUYWJsZTsKKworCVJGUmVnVGFibGUgPSBSRjI4NTBSZWdUYWJsZTsKKworCXN3aXRjaCAocEFkLT5SZkljVHlwZSkKKwl7CisJCWNhc2UgUkZJQ18yODIwOgorCQljYXNlIFJGSUNfMjg1MDoKKwkJY2FzZSBSRklDXzI3MjA6CisJCWNhc2UgUkZJQ18yNzUwOgorCisJCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fT0ZfMjg1MF9DSE5MOyBpbmRleCsrKQorCQkJeworCQkJCWlmIChDaGFubmVsID09IFJGUmVnVGFibGVbaW5kZXhdLkNoYW5uZWwpCisJCQkJeworCQkJCQlSMSA9IFJGUmVnVGFibGVbaW5kZXhdLlIxICYgMHhmZmZmZGZmZjsKKwkJCQkJUjIgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMiAmIDB4ZmZmYmZmZmY7CisJCQkJCVIzID0gUkZSZWdUYWJsZVtpbmRleF0uUjMgJiAweGZmZjNmZmZmOworCisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIxKTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjIpOworCisJCQkJCS8vIFByb2dyYW0gUjFiMTMgdG8gMSwgUjMvYjE4LDE5IHRvIDAsIFIyYjE4IHRvIDAuCisJCQkJCS8vIFNldCBSRiBSMiBiaXQxOD0wLCBSMyBiaXRbMTg6MTldPTAKKwkJCQkJLy9pZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IEZBTFNFKQorCQkJCQlpZiAoMSkKKwkJCQkJeworCQkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjMpOworCisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljVHVybk9mZlJGQ2xrIyVkKFJGPSVkLCApICwgUjI9MHglMDh4LCAgUjMgPSAweCUwOHggXG4iLAorCQkJCQkJCUNoYW5uZWwsIHBBZC0+UmZJY1R5cGUsIFIyLCBSMykpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzaWNUdXJuT2ZmUkZDbGsjJWQoUkY9JWQsICkgLCBSMj0weCUwOHggXG4iLAorCQkJCQkJCUNoYW5uZWwsIHBBZC0+UmZJY1R5cGUsIFIyKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9Cit9CisKKworVk9JRCBBc2ljVHVybk9uUkZDbGsoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUNIQVIJCQlDaGFubmVsKQoreworCisJLy8gUkYgUjIgYml0IDE4ID0gMAorCVVJTlQzMgkJCVIxID0gMCwgUjIgPSAwLCBSMyA9IDA7CisJVUNIQVIJCQlpbmRleDsKKwlSVE1QX1JGX1JFR1MJKlJGUmVnVGFibGU7CisKKwlSRlJlZ1RhYmxlID0gUkYyODUwUmVnVGFibGU7CisKKwlzd2l0Y2ggKHBBZC0+UmZJY1R5cGUpCisJeworCQljYXNlIFJGSUNfMjgyMDoKKwkJY2FzZSBSRklDXzI4NTA6CisJCWNhc2UgUkZJQ18yNzIwOgorCQljYXNlIFJGSUNfMjc1MDoKKworCQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNX09GXzI4NTBfQ0hOTDsgaW5kZXgrKykKKwkJCXsKKwkJCQlpZiAoQ2hhbm5lbCA9PSBSRlJlZ1RhYmxlW2luZGV4XS5DaGFubmVsKQorCQkJCXsKKwkJCQkJUjMgPSBwQWQtPkxhdGNoUmZSZWdzLlIzOworCQkJCQlSMyAmPSAweGZmZjNmZmZmOworCQkJCQlSMyB8PSAweDAwMDgwMDAwOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMyk7CisKKwkJCQkJUjEgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjEpOworCisJCQkJCVIyID0gUkZSZWdUYWJsZVtpbmRleF0uUjI7CisJCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCisJCQkJCXsKKwkJCQkJCVIyIHw9IDB4NDAwMDsJLy8gSWYgVFhwYXRoIGlzIDEsIGJpdCAxNCA9IDE7CisJCQkJCX0KKworCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKQorCQkJCQl7CisJCQkJCQlSMiB8PSAweDQwOwkvLyB3cml0ZSAxIHRvIG9mZiBSeHBhdGguCisJCQkJCX0KKwkJCQkJZWxzZSBpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQorCQkJCQl7CisJCQkJCQlSMiB8PSAweDIwMDQwOwkvLyB3cml0ZSAxIHRvIG9mZiBSeFBhdGgKKwkJCQkJfQorCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMik7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzaWNUdXJuT25SRkNsayMlZChSRj0lZCwgKSAsIFIyPTB4JTA4eFxuIiwKKwkJQ2hhbm5lbCwKKwkJcEFkLT5SZkljVHlwZSwKKwkJUjIpKTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vbmV0aWZfYmxvY2suYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL25ldGlmX2Jsb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNmN2QwOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL25ldGlmX2Jsb2NrLmMKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKyNpbmNsdWRlICJuZXRpZl9ibG9jay5oIgorCitzdGF0aWMgTkVUSUZfRU5UUlkgZnJlZU5ldElmRW50cnlQb29sW0ZSRUVfTkVUSUZfUE9PTF9TSVpFXTsKK3N0YXRpYyBMSVNUX0hFQURFUiBmcmVlTmV0SWZFbnRyeUxpc3Q7CisKK3ZvaWQgaW5pdGJsb2NrUXVldWVUYWIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJaW50IGk7CisKKwlpbml0TGlzdCgmZnJlZU5ldElmRW50cnlMaXN0KTsKKwlmb3IgKGkgPSAwOyBpIDwgRlJFRV9ORVRJRl9QT09MX1NJWkU7IGkrKykKKwkJaW5zZXJ0VGFpbExpc3QoJmZyZWVOZXRJZkVudHJ5TGlzdCwgKFBMSVNUX0VOVFJZKSZmcmVlTmV0SWZFbnRyeVBvb2xbaV0pOworCisJZm9yIChpPTA7IGkgPCBOVU1fT0ZfVFhfUklORzsgaSsrKQorCQlpbml0TGlzdCgmcEFkLT5ibG9ja1F1ZXVlVGFiW2ldLk5ldElmTGlzdCk7CisKKwlyZXR1cm47Cit9CisKK0JPT0xFQU4gYmxvY2tOZXRJZigKKwlJTiBQQkxPQ0tfUVVFVUVfRU5UUlkgcEJsb2NrUXVldWVFbnRyeSwKKwlJTiBQTkVUX0RFViBwTmV0RGV2KQoreworCVBORVRJRl9FTlRSWSBwTmV0SWZFbnRyeSA9IE5VTEw7CisKKwlpZiAoKHBOZXRJZkVudHJ5ID0gKFBORVRJRl9FTlRSWSlyZW1vdmVIZWFkTGlzdCgmZnJlZU5ldElmRW50cnlMaXN0KSkgIT0gTlVMTCkKKwl7CisJCW5ldGlmX3N0b3BfcXVldWUocE5ldERldik7CisJCXBOZXRJZkVudHJ5LT5wTmV0RGV2ID0gcE5ldERldjsKKwkJaW5zZXJ0VGFpbExpc3QoJnBCbG9ja1F1ZXVlRW50cnktPk5ldElmTGlzdCwgKFBMSVNUX0VOVFJZKXBOZXRJZkVudHJ5KTsKKworCQlwQmxvY2tRdWV1ZUVudHJ5LT5Td1R4UXVldWVCbG9ja0ZsYWcgPSBUUlVFOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJuZXRpZl9zdG9wX3F1ZXVlKCVzKVxuIiwgcE5ldERldi0+bmFtZSkpOworCX0KKwllbHNlCisJCXJldHVybiBGQUxTRTsKKworCXJldHVybiBUUlVFOworfQorCitWT0lEIHJlbGVhc2VOZXRJZigKKwlJTiBQQkxPQ0tfUVVFVUVfRU5UUlkgcEJsb2NrUXVldWVFbnRyeSkKK3sKKwlQTkVUSUZfRU5UUlkgcE5ldElmRW50cnkgPSBOVUxMOworCVBMSVNUX0hFQURFUiBwTmV0SWZMaXN0ID0gJnBCbG9ja1F1ZXVlRW50cnktPk5ldElmTGlzdDsKKworCXdoaWxlKChwTmV0SWZFbnRyeSA9IChQTkVUSUZfRU5UUlkpcmVtb3ZlSGVhZExpc3QocE5ldElmTGlzdCkpICE9ICBOVUxMKQorCXsKKwkJUE5FVF9ERVYgcE5ldERldiA9IHBOZXRJZkVudHJ5LT5wTmV0RGV2OworCQluZXRpZl93YWtlX3F1ZXVlKHBOZXREZXYpOworCQlpbnNlcnRUYWlsTGlzdCgmZnJlZU5ldElmRW50cnlMaXN0LCAoUExJU1RfRU5UUlkpcE5ldElmRW50cnkpOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIm5ldGlmX3dha2VfcXVldWUoJXMpXG4iLCBwTmV0RGV2LT5uYW1lKSk7CisJfQorCXBCbG9ja1F1ZXVlRW50cnktPlN3VHhRdWV1ZUJsb2NrRmxhZyA9IEZBTFNFOworCXJldHVybjsKK30KKworCitWT0lEIFN0b3BOZXRJZlF1ZXVlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSIFF1ZUlkeCwKKwlJTiBQTkRJU19QQUNLRVQgcFBhY2tldCkKK3sKKwlQTkVUX0RFViBOZXREZXYgPSBOVUxMOworCVVDSEFSIElmSWR4ID0gMDsKKwlCT09MRUFOIHZhbGlkID0gRkFMU0U7CisKKyNpZmRlZiBBUENMSV9TVVBQT1JUCisJaWYgKFJUTVBfR0VUX1BBQ0tFVF9ORVRfREVWSUNFKHBQYWNrZXQpID49IE1JTl9ORVRfREVWSUNFX0ZPUl9BUENMSSkKKwl7CisJCUlmSWR4ID0gKFJUTVBfR0VUX1BBQ0tFVF9ORVRfREVWSUNFKHBQYWNrZXQpIC0gTUlOX05FVF9ERVZJQ0VfRk9SX0FQQ0xJKSAlIE1BWF9BUENMSV9OVU07CisJCU5ldERldiA9IHBBZC0+QXBDZmcuQXBDbGlUYWJbSWZJZHhdLmRldjsKKwl9CisJZWxzZQorI2VuZGlmIC8vIEFQQ0xJX1NVUFBPUlQgLy8KKyNpZmRlZiBXRFNfU1VQUE9SVAorCWlmIChSVE1QX0dFVF9QQUNLRVRfTkVUX0RFVklDRShwUGFja2V0KSA+PSBNSU5fTkVUX0RFVklDRV9GT1JfV0RTKQorCXsKKwkJSWZJZHggPSAoUlRNUF9HRVRfUEFDS0VUX05FVF9ERVZJQ0UocFBhY2tldCkgLSBNSU5fTkVUX0RFVklDRV9GT1JfV0RTKSAlIE1BWF9XRFNfRU5UUlk7CisJCU5ldERldiA9IHBBZC0+V2RzVGFiLldkc0VudHJ5W0lmSWR4XS5kZXY7CisJfQorCWVsc2UKKyNlbmRpZiAvLyBXRFNfU1VQUE9SVCAvLworCXsKKyNpZmRlZiBNQlNTX1NVUFBPUlQKKwkJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkKKwkJeworCQkJSWZJZHggPSAoUlRNUF9HRVRfUEFDS0VUX05FVF9ERVZJQ0UocFBhY2tldCkgLSBNSU5fTkVUX0RFVklDRV9GT1JfTUJTU0lEKSAlIE1BWF9NQlNTSURfTlVNOworCQkJTmV0RGV2ID0gcEFkLT5BcENmZy5NQlNTSURbSWZJZHhdLk1TU0lERGV2OworCQl9CisJCWVsc2UKKwkJeworCQkJSWZJZHggPSBNQUlOX01CU1NJRDsKKwkJCU5ldERldiA9IHBBZC0+bmV0X2RldjsKKwkJfQorI2Vsc2UKKwkJSWZJZHggPSBNQUlOX01CU1NJRDsKKwkJTmV0RGV2ID0gcEFkLT5uZXRfZGV2OworI2VuZGlmCisJfQorCisJLy8gV01NIHN1cHBvcnQgNCBzb2Z0d2FyZSBxdWV1ZXMuCisJLy8gT25lIHNvZnR3YXJlIHF1ZXVlIGZ1bGwgZG9lc24ndCBtZWFuIGRldmljZSBoYXZlIG5vIGNhcGJpbGl0eSB0byB0cmFuc21pdCBwYWNrZXQuCisJLy8gU28gZGlzYWJsZSBibG9jayBOZXQtSWYgcXVldWUgZnVuY3Rpb24gd2hpbGUgV01NIGVuYWJsZS4KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl2YWxpZCA9IChwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSA9PSBUUlVFKSA/IEZBTFNFIDogVFJVRTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCWlmICh2YWxpZCkKKwkJYmxvY2tOZXRJZigmcEFkLT5ibG9ja1F1ZXVlVGFiW1F1ZUlkeF0sIE5ldERldik7CisJcmV0dXJuOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydG1wX2luaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0bXBfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MGEwMGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydG1wX2luaXQuYwpAQCAtMCwwICsxLDQxMzIgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJcnRtcF9pbml0LmMKKworCUFic3RyYWN0OgorCU1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKwktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlQYXVsIExpbiAgICAyMDAyLTA4LTAxICAgIGNyZWF0ZWQKKyAgICBKb2huIENoYW5nICAyMDA0LTA4LTIwICAgIFJUMjU2MS8yNjYxIHVzZSBzY2F0dGVyLWdhdGhlciBzY2hlbWUKKyAgICBKYW4gTGVlICAyMDA2LTA5LTE1ICAgIFJUMjg2MC4gQ2hhbmdlIGZvciA4MDIuMTFuICwgRUVQUk9NLCBMZWQsIEJBLCBIVC4KKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisjaW5jbHVkZSAiZmlybXdhcmUuaCIKKworLy8jZGVmaW5lIEJJTl9JTl9GSUxFIC8qIHVzZSAqLmJpbiBmaXJtd2FyZSAqLworCitVQ0hBUiAgICBCSVQ4W10gPSB7MHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MH07CitVTE9ORyAgICBCSVQzMltdID0gezB4MDAwMDAwMDEsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDQsIDB4MDAwMDAwMDgsCisJCQkJCTB4MDAwMDAwMTAsIDB4MDAwMDAwMjAsIDB4MDAwMDAwNDAsIDB4MDAwMDAwODAsCisJCQkJCTB4MDAwMDAxMDAsIDB4MDAwMDAyMDAsIDB4MDAwMDA0MDAsIDB4MDAwMDA4MDAsCisJCQkJCTB4MDAwMDEwMDAsIDB4MDAwMDIwMDAsIDB4MDAwMDQwMDAsIDB4MDAwMDgwMDAsCisJCQkJCTB4MDAwMTAwMDAsIDB4MDAwMjAwMDAsIDB4MDAwNDAwMDAsIDB4MDAwODAwMDAsCisJCQkJCTB4MDAxMDAwMDAsIDB4MDAyMDAwMDAsIDB4MDA0MDAwMDAsIDB4MDA4MDAwMDAsCisJCQkJCTB4MDEwMDAwMDAsIDB4MDIwMDAwMDAsIDB4MDQwMDAwMDAsIDB4MDgwMDAwMDAsCisJCQkJCTB4MTAwMDAwMDAsIDB4MjAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4ODAwMDAwMDB9OworCitjaGFyKiAgIENpcGhlck5hbWVbXSA9IHsibm9uZSIsIndlcDY0Iiwid2VwMTI4IiwiVEtJUCIsIkFFUyIsIkNLSVA2NCIsIkNLSVAxMjgifTsKKworY29uc3QgdW5zaWduZWQgc2hvcnQgY2NpdHRfMTZUYWJsZVtdID0geworCTB4MDAwMCwgMHgxMDIxLCAweDIwNDIsIDB4MzA2MywgMHg0MDg0LCAweDUwQTUsIDB4NjBDNiwgMHg3MEU3LAorCTB4ODEwOCwgMHg5MTI5LCAweEExNEEsIDB4QjE2QiwgMHhDMThDLCAweEQxQUQsIDB4RTFDRSwgMHhGMUVGLAorCTB4MTIzMSwgMHgwMjEwLCAweDMyNzMsIDB4MjI1MiwgMHg1MkI1LCAweDQyOTQsIDB4NzJGNywgMHg2MkQ2LAorCTB4OTMzOSwgMHg4MzE4LCAweEIzN0IsIDB4QTM1QSwgMHhEM0JELCAweEMzOUMsIDB4RjNGRiwgMHhFM0RFLAorCTB4MjQ2MiwgMHgzNDQzLCAweDA0MjAsIDB4MTQwMSwgMHg2NEU2LCAweDc0QzcsIDB4NDRBNCwgMHg1NDg1LAorCTB4QTU2QSwgMHhCNTRCLCAweDg1MjgsIDB4OTUwOSwgMHhFNUVFLCAweEY1Q0YsIDB4QzVBQywgMHhENThELAorCTB4MzY1MywgMHgyNjcyLCAweDE2MTEsIDB4MDYzMCwgMHg3NkQ3LCAweDY2RjYsIDB4NTY5NSwgMHg0NkI0LAorCTB4Qjc1QiwgMHhBNzdBLCAweDk3MTksIDB4ODczOCwgMHhGN0RGLCAweEU3RkUsIDB4RDc5RCwgMHhDN0JDLAorCTB4NDhDNCwgMHg1OEU1LCAweDY4ODYsIDB4NzhBNywgMHgwODQwLCAweDE4NjEsIDB4MjgwMiwgMHgzODIzLAorCTB4QzlDQywgMHhEOUVELCAweEU5OEUsIDB4RjlBRiwgMHg4OTQ4LCAweDk5NjksIDB4QTkwQSwgMHhCOTJCLAorCTB4NUFGNSwgMHg0QUQ0LCAweDdBQjcsIDB4NkE5NiwgMHgxQTcxLCAweDBBNTAsIDB4M0EzMywgMHgyQTEyLAorCTB4REJGRCwgMHhDQkRDLCAweEZCQkYsIDB4RUI5RSwgMHg5Qjc5LCAweDhCNTgsIDB4QkIzQiwgMHhBQjFBLAorCTB4NkNBNiwgMHg3Qzg3LCAweDRDRTQsIDB4NUNDNSwgMHgyQzIyLCAweDNDMDMsIDB4MEM2MCwgMHgxQzQxLAorCTB4RURBRSwgMHhGRDhGLCAweENERUMsIDB4RERDRCwgMHhBRDJBLCAweEJEMEIsIDB4OEQ2OCwgMHg5RDQ5LAorCTB4N0U5NywgMHg2RUI2LCAweDVFRDUsIDB4NEVGNCwgMHgzRTEzLCAweDJFMzIsIDB4MUU1MSwgMHgwRTcwLAorCTB4RkY5RiwgMHhFRkJFLCAweERGREQsIDB4Q0ZGQywgMHhCRjFCLCAweEFGM0EsIDB4OUY1OSwgMHg4Rjc4LAorCTB4OTE4OCwgMHg4MUE5LCAweEIxQ0EsIDB4QTFFQiwgMHhEMTBDLCAweEMxMkQsIDB4RjE0RSwgMHhFMTZGLAorCTB4MTA4MCwgMHgwMEExLCAweDMwQzIsIDB4MjBFMywgMHg1MDA0LCAweDQwMjUsIDB4NzA0NiwgMHg2MDY3LAorCTB4ODNCOSwgMHg5Mzk4LCAweEEzRkIsIDB4QjNEQSwgMHhDMzNELCAweEQzMUMsIDB4RTM3RiwgMHhGMzVFLAorCTB4MDJCMSwgMHgxMjkwLCAweDIyRjMsIDB4MzJEMiwgMHg0MjM1LCAweDUyMTQsIDB4NjI3NywgMHg3MjU2LAorCTB4QjVFQSwgMHhBNUNCLCAweDk1QTgsIDB4ODU4OSwgMHhGNTZFLCAweEU1NEYsIDB4RDUyQywgMHhDNTBELAorCTB4MzRFMiwgMHgyNEMzLCAweDE0QTAsIDB4MDQ4MSwgMHg3NDY2LCAweDY0NDcsIDB4NTQyNCwgMHg0NDA1LAorCTB4QTdEQiwgMHhCN0ZBLCAweDg3OTksIDB4OTdCOCwgMHhFNzVGLCAweEY3N0UsIDB4QzcxRCwgMHhENzNDLAorCTB4MjZEMywgMHgzNkYyLCAweDA2OTEsIDB4MTZCMCwgMHg2NjU3LCAweDc2NzYsIDB4NDYxNSwgMHg1NjM0LAorCTB4RDk0QywgMHhDOTZELCAweEY5MEUsIDB4RTkyRiwgMHg5OUM4LCAweDg5RTksIDB4Qjk4QSwgMHhBOUFCLAorCTB4NTg0NCwgMHg0ODY1LCAweDc4MDYsIDB4NjgyNywgMHgxOEMwLCAweDA4RTEsIDB4Mzg4MiwgMHgyOEEzLAorCTB4Q0I3RCwgMHhEQjVDLCAweEVCM0YsIDB4RkIxRSwgMHg4QkY5LCAweDlCRDgsIDB4QUJCQiwgMHhCQjlBLAorCTB4NEE3NSwgMHg1QTU0LCAweDZBMzcsIDB4N0ExNiwgMHgwQUYxLCAweDFBRDAsIDB4MkFCMywgMHgzQTkyLAorCTB4RkQyRSwgMHhFRDBGLCAweERENkMsIDB4Q0Q0RCwgMHhCREFBLCAweEFEOEIsIDB4OURFOCwgMHg4REM5LAorCTB4N0MyNiwgMHg2QzA3LCAweDVDNjQsIDB4NEM0NSwgMHgzQ0EyLCAweDJDODMsIDB4MUNFMCwgMHgwQ0MxLAorCTB4RUYxRiwgMHhGRjNFLCAweENGNUQsIDB4REY3QywgMHhBRjlCLCAweEJGQkEsIDB4OEZEOSwgMHg5RkY4LAorCTB4NkUxNywgMHg3RTM2LCAweDRFNTUsIDB4NUU3NCwgMHgyRTkzLCAweDNFQjIsIDB4MEVEMSwgMHgxRUYwCit9OworI2RlZmluZSBCeXRlQ1JDMTYodiwgY3JjKSBcCisJKHVuc2lnbmVkIHNob3J0KSgoY3JjIDw8IDgpIF4gIGNjaXR0XzE2VGFibGVbKChjcmMgPj4gOCkgXiAodikpICYgMjU1XSkKKwordW5zaWduZWQgY2hhciBCaXRSZXZlcnNlKHVuc2lnbmVkIGNoYXIgeCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIFRlbXA9MDsKKwlmb3IoaT0wOyA7IGkrKykKKwl7CisJCWlmKHggJiAweDgwKQlUZW1wIHw9IDB4ODA7CisJCWlmKGk9PTcpCQlicmVhazsKKwkJeAk8PD0gMTsKKwkJVGVtcCA+Pj0gMTsKKwl9CisJcmV0dXJuIFRlbXA7Cit9CisKKy8vCisvLyBCQlAgcmVnaXN0ZXIgaW5pdGlhbGl6YXRpb24gc2V0CisvLworUkVHX1BBSVIgICBCQlBSZWdUYWJsZVtdID0geworCXtCQlBfUjY1LAkJMHgyQ30sCQkvLyBmaXggcnNzaSBpc3N1ZQorCXtCQlBfUjY2LAkJMHgzOH0sCS8vIEFsc28gc2V0IHRoaXMgZGVmYXVsdCB2YWx1ZSB0byBwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUgYXQgaW5pdGlhbAorCXtCQlBfUjY5LAkJMHgxMn0sCisJe0JCUF9SNzAsCQkweGF9LAkvLyBCQlBfUjcwIHdpbGwgY2hhbmdlIHRvIDB4OCBpbiBBcFN0YXJ0VXAgYW5kIExpbmtVcCBmb3IgcnQyODYwQywgb3RoZXJ3aXNlIHZhbHVlIGlzIDB4YQorCXtCQlBfUjczLAkJMHgxMH0sCisJe0JCUF9SODEsCQkweDM3fSwKKwl7QkJQX1I4MiwJCTB4NjJ9LAorCXtCQlBfUjgzLAkJMHg2QX0sCisJe0JCUF9SODQsCQkweDk5fSwJLy8gMHgxOSBpcyBmb3IgcnQyODYwRSBhbmQgYWZ0ZXIuIFRoaXMgaXMgZm9yIGV4dGVuc2lvbiBjaGFubmVsIG92ZXJsYXBwaW5nIElPVC4gMHg5OSBpcyBmb3IgcnQyODYwRCBhbmQgYmVmb3JlCisJe0JCUF9SODYsCQkweDAwfSwJLy8gbWlkZGxlIHJhbmdlIGlzc3VlLCBSb3J5IEAyMDA4LTAxLTI4CisJe0JCUF9SOTEsCQkweDA0fSwJLy8gbWlkZGxlIHJhbmdlIGlzc3VlLCBSb3J5IEAyMDA4LTAxLTI4CisJe0JCUF9SOTIsCQkweDAwfSwJLy8gbWlkZGxlIHJhbmdlIGlzc3VlLCBSb3J5IEAyMDA4LTAxLTI4CisJe0JCUF9SMTAzLCAgCTB4MDB9LCAJLy8gbmVhciByYW5nZSBoaWdoLXBvd2VyIGlzc3VlLCByZXF1ZXN0ZWQgZnJvbSBHYXJ5IEAyMDA4LTA1MjgKKwl7QkJQX1IxMDUsCQkweDA1fSwJLy8gMHgwNSBpcyBmb3IgcnQyODYwRSB0byB0dXJuIG9uIEZFUSBjb250cm9sLiBJdCBpcyBzYWZlIGZvciBydDI4NjBEIGFuZCBiZWZvcmUsIGJlY2F1c2UgQml0IDc6MiBhcmUgcmVzZXJ2ZWQgaW4gcnQyODYwRCBhbmQgYmVmb3JlLgorfTsKKyNkZWZpbmUJTlVNX0JCUF9SRUdfUEFSTVMJKHNpemVvZihCQlBSZWdUYWJsZSkgLyBzaXplb2YoUkVHX1BBSVIpKQorCisvLworLy8gUkYgcmVnaXN0ZXIgaW5pdGlhbGl6YXRpb24gc2V0CisvLworI2lmZGVmIFJUMjg3MAorUkVHX1BBSVIgICBSVDMweHhfUkZSZWdUYWJsZVtdID0geworICAgICAgICB7UkZfUjA0LCAgICAgICAgICAweDQwfSwKKyAgICAgICAge1JGX1IwNSwgICAgICAgICAgMHgwM30sCisgICAgICAgIHtSRl9SMDYsICAgICAgICAgIDB4MDJ9LAorICAgICAgICB7UkZfUjA3LCAgICAgICAgICAweDcwfSwKKyAgICAgICAge1JGX1IwOSwgICAgICAgICAgMHgwRn0sCisgICAgICAgIHtSRl9SMTAsICAgICAgICAgIDB4NzF9LAorICAgICAgICB7UkZfUjExLCAgICAgICAgICAweDIxfSwKKyAgICAgICAge1JGX1IxMiwgICAgICAgICAgMHg3Qn0sCisgICAgICAgIHtSRl9SMTQsICAgICAgICAgIDB4OTB9LAorICAgICAgICB7UkZfUjE1LCAgICAgICAgICAweDU4fSwKKyAgICAgICAge1JGX1IxNiwgICAgICAgICAgMHhCM30sCisgICAgICAgIHtSRl9SMTcsICAgICAgICAgIDB4OTJ9LAorICAgICAgICB7UkZfUjE4LCAgICAgICAgICAweDJDfSwKKyAgICAgICAge1JGX1IxOSwgICAgICAgICAgMHgwMn0sCisgICAgICAgIHtSRl9SMjAsICAgICAgICAgIDB4QkF9LAorICAgICAgICB7UkZfUjIxLCAgICAgICAgICAweERCfSwKKyAgICAgICAge1JGX1IyNCwgICAgICAgICAgMHgxNn0sCisgICAgICAgIHtSRl9SMjUsICAgICAgICAgIDB4MDF9LAorICAgICAgICB7UkZfUjI3LCAgICAgICAgICAweDAzfSwKKyAgICAgICAge1JGX1IyOSwgICAgICAgICAgMHgxRn0sCit9OworI2RlZmluZQlOVU1fUkZfUkVHX1BBUk1TCShzaXplb2YoUlQzMHh4X1JGUmVnVGFibGUpIC8gc2l6ZW9mKFJFR19QQUlSKSkKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworLy8KKy8vIEFTSUMgcmVnaXN0ZXIgaW5pdGlhbGl6YXRpb24gc2V0cworLy8KKworUlRNUF9SRUdfUEFJUglNQUNSZWdUYWJsZVtdID0JeworI2lmIGRlZmluZWQoSFdfQkVBQ09OX09GRlNFVCkgJiYgKEhXX0JFQUNPTl9PRkZTRVQgPT0gMHgyMDApCisJe0JDTl9PRkZTRVQwLAkJCTB4ZjhmMGU4ZTB9LCAvKiAweDM4MDAoZTApLCAweDNBMDAoZTgpLCAweDNDMDAoZjApLCAweDNFMDAoZjgpLCA1MTJCIGZvciBlYWNoIGJlYWNvbiAqLworCXtCQ05fT0ZGU0VUMSwJCQkweDZmNzdkMGM4fSwgLyogMHgzMjAwKGM4KSwgMHgzNDAwKGQwKSwgMHgxREMwKDc3KSwgMHgxQkMwKDZmKSwgNTEyQiBmb3IgZWFjaCBiZWFjb24gKi8KKyNlbGlmIGRlZmluZWQoSFdfQkVBQ09OX09GRlNFVCkgJiYgKEhXX0JFQUNPTl9PRkZTRVQgPT0gMHgxMDApCisJe0JDTl9PRkZTRVQwLAkJCTB4ZWNlOGU0ZTB9LCAvKiAweDM4MDAsIDB4M0EwMCwgMHgzQzAwLCAweDNFMDAsIDUxMkIgZm9yIGVhY2ggYmVhY29uICovCisJe0JDTl9PRkZTRVQxLAkJCTB4ZmNmOGY0ZjB9LCAvKiAweDM4MDAsIDB4M0EwMCwgMHgzQzAwLCAweDNFMDAsIDUxMkIgZm9yIGVhY2ggYmVhY29uICovCisjZWxzZQorICAgICNlcnJvciBZb3UgbXVzdCByZS1jYWxjdWxhdGUgbmV3IHZhbHVlIGZvciBCQ05fT0ZGU0VUMCAmIEJDTl9PRkZTRVQxIGluIE1BQ1JlZ1RhYmxlW10hISEKKyNlbmRpZiAvLyBIV19CRUFDT05fT0ZGU0VUIC8vCisKKwl7TEVHQUNZX0JBU0lDX1JBVEUsCQkweDAwMDAwMTNmfSwgLy8gIEJhc2ljIHJhdGUgc2V0IGJpdG1hcAorCXtIVF9CQVNJQ19SQVRFLAkJMHgwMDAwODAwM30sIC8vIEJhc2ljIEhUIHJhdGUgc2V0ICwgMjBNLCBNQ1M9MywgTU0uIEZvcm1hdCBpcyB0aGUgc2FtZSBhcyBpbiBUWFdJLgorCXtNQUNfU1lTX0NUUkwsCQkweDAwfSwgLy8gMHgxMDA0LCAsIGRlZmF1bHQgRGlzYWJsZSBSWAorCXtSWF9GSUxUUl9DRkcsCQkweDE3Zjk3fSwgLy8weDE0MDAgICwgUlggZmlsdGVyIGNvbnRyb2wsCisJe0JLT0ZGX1NMT1RfQ0ZHLAkweDIwOX0sIC8vIGRlZmF1bHQgc2V0IHNob3J0IHNsb3QgdGltZSwgQ0NfREVMQVlfVElNRSBzaG91bGQgYmUgMgorCXtUWF9TV19DRkcwLAkJMHgwfSwgCQkvLyBHYXJ5LDIwMDgtMDUtMjEgZm9yIENXQyB0ZXN0CisJe1RYX1NXX0NGRzEsCQkweDgwNjA2fSwgLy8gR2FyeSwyMDA2LTA4LTIzCisJe1RYX0xJTktfQ0ZHLAkJMHgxMDIwfSwJCS8vIEdhcnksMjAwNi0wOC0yMworCS8ve1RYX1RJTUVPVVRfQ0ZHLAkweDAwMTgyMDkwfSwJLy8gQ0NLIGhhcyBzb21lIHByb2JsZW0uIFNvIGluY3JlYXNlIHRpbWllb3V0IHZhbHVlLiAyMDA2LTEwLTA5Ly8gTUFydmVrIFJUCisJe1RYX1RJTUVPVVRfQ0ZHLAkweDAwMGEyMDkwfSwJLy8gQ0NLIGhhcyBzb21lIHByb2JsZW0uIFNvIGluY3JlYXNlIHRpbWllb3V0IHZhbHVlLiAyMDA2LTEwLTA5Ly8gTUFydmVrIFJUICwgTW9kaWZ5IGZvciAyODYwRSAsMjAwNy0wOC0wMQorCXtNQVhfTEVOX0NGRywJCU1BWF9BR0dSRUdBVElPTl9TSVpFIHwgMHgwMDAwMTAwMH0sCS8vIDB4MzAxOCwgTUFYIGZyYW1lIGxlbmd0aC4gTWF4IFBTRFUgPSAxNmtieXRlcy4KKwl7TEVEX0NGRywJCTB4N2YwMzFlNDZ9LCAvLyBHYXJ5LCAyMDA2LTA4LTIzCisJe1BCRl9NQVhfUENOVCwJCQkweDFGM0ZCRjlGfSwgCS8vMHgxRjNmN2Y5Zn0sCQkvL0phbiwgMjAwNi8wNC8yMAorCS8ve1RYX1JUWV9DRkcsCQkJMHg2YmI4MDQwOH0sCS8vIEphbiwgMjAwNi8xMS8xNgorCXtUWF9SVFlfQ0ZHLAkJCTB4NDdkMDFmMGZ9LAkvLyBKYW4sIDIwMDYvMTEvMTYsIFNldCBUeFdJLT5BQ0sgPTAgaW4gUHJvYmUgUnNwIE1vZGlmeSBmb3IgMjg2MEUgLDIwMDctMDgtMDMKKwl7QVVUT19SU1BfQ0ZHLAkJCTB4MDAwMDAwMTN9LAkvLyBJbml0aWFsIEF1dG9fUmVzcG9uZGVyLCBiZWNhdXNlIFFBIHdpbGwgdHVybiBvZmYgQXV0by1SZXNwb25kZXIKKwl7Q0NLX1BST1RfQ0ZHLAkJCTB4MDU3NDAwMDMgLyoweDAxNzQwMDAzKi99LAkvLyBJbml0aWFsIEF1dG9fUmVzcG9uZGVyLCBiZWNhdXNlIFFBIHdpbGwgdHVybiBvZmYgQXV0by1SZXNwb25kZXIuIEFuZCBSVFMgdGhyZXNob2xkIGlzIGVuYWJsZWQuCisJe09GRE1fUFJPVF9DRkcsCQkJMHgwNTc0MDAwMyAvKjB4MDE3NDAwMDMqL30sCS8vIEluaXRpYWwgQXV0b19SZXNwb25kZXIsIGJlY2F1c2UgUUEgd2lsbCB0dXJuIG9mZiBBdXRvLVJlc3BvbmRlci4gQW5kIFJUUyB0aHJlc2hvbGQgaXMgZW5hYmxlZC4KKyNpZmRlZiBSVDI4NzAKKwl7UEJGX0NGRywgCQkJCTB4ZjQwMDA2fSwgCQkvLyBPbmx5IGVuYWJsZSBRdWV1ZSAyCisJe01NNDBfUFJPVF9DRkcsCQkJMHgzRjQ0MDg0fSwJCS8vIEluaXRpYWwgQXV0b19SZXNwb25kZXIsIGJlY2F1c2UgUUEgd2lsbCB0dXJuIG9mZiBBdXRvLVJlc3BvbmRlcgorCXtXUERNQV9HTE9fQ0ZHLAkJCTB4MDAwMDAwMzB9LAorI2VuZGlmIC8vIFJUMjg3MCAvLworCXtHRjIwX1BST1RfQ0ZHLAkJCTB4MDE3NDQwMDR9LCAgICAvLyBzZXQgMTk6MTggLS0+IFNob3J0IE5BViBmb3IgTUlNTyBQUworCXtHRjQwX1BST1RfQ0ZHLAkJCTB4MDNGNDQwODR9LAorCXtNTTIwX1BST1RfQ0ZHLAkJCTB4MDE3NDQwMDR9LAorCXtUWE9QX0NUUkxfQ0ZHLAkJCTB4MDAwMDU4M2YsIC8qMHgwMDAwMjQzZiovIC8qMHgwMDAwMjRiZiovfSwJLy9FeHRlbnNpb24gY2hhbm5lbCBiYWNrb2ZmLgorCXtUWF9SVFNfQ0ZHLAkJCTB4MDAwOTJiMjB9LAorLy8jaWZkZWYgV0lGSV9URVNUCisJe0VYUF9BQ0tfVElNRSwJCQkweDAwMjQwMGNhfSwJLy8gZGVmYXVsdCB2YWx1ZQorLy8jZWxzZQorLy8Je0VYUF9BQ0tfVElNRSwJCQkweDAwNTQwMGNhfSwJLy8gc3VnZ2VzdGVkIGJ5IEdyYXkgQCAyMDA3MDMyMyBmb3IgMTFuIGludGVsLXN0YSB0aHJvdWdocHV0CisvLyNlbmRpZiAvLyBlbmQgLSBXSUZJX1RFU1QgLy8KKwl7VFhPUF9ITERSX0VULCAJCQkweDAwMDAwMDAyfSwKKworCS8qIEplcnJ5IGNvbW1lbnRzIDIwMDgvMDEvMTY6IHdlIHVzZSBTSUZTID0gMTB1cyBpbiBDQ0sgZGVmYXVsdGx5LCBidXQgaXQgc2VlbXMgdGhhdCAxMHVzCisJCWlzIHRvbyBzbWFsbCBmb3IgSU5URUwgMjIwMGJnIGNhcmQsIHNvIGluIE1CU1MgbW9kZSwgdGhlIGRlbHRhIHRpbWUgYmV0d2VlbiBiZWFjb24wCisJCWFuZCBiZWFjb24xIGlzIFNJRlMgKDEwdXMpLCBzbyBpZiBJTlRFTCAyMjAwYmcgY2FyZCBjb25uZWN0cyB0byBCU1MwLCB0aGUgcGluZworCQl3aWxsIGFsd2F5cyBsb3N0LiBTbyB3ZSBjaGFuZ2UgdGhlIFNJRlMgb2YgQ0NLIGZyb20gMTB1cyB0byAxNnVzLiAqLworCXtYSUZTX1RJTUVfQ0ZHLAkJCTB4MzNhNDEwMTB9LAorCXtQV1JfUElOX0NGRywJCQkweDAwMDAwMDAzfSwJLy8gcGF0Y2ggZm9yIDI4ODAtRQorfTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitSVE1QX1JFR19QQUlSCVNUQU1BQ1JlZ1RhYmxlW10gPQl7CisJe1dNTV9BSUZTTl9DRkcsCQkweDAwMDAyMjczfSwKKwl7V01NX0NXTUlOX0NGRywJMHgwMDAwMjM0NH0sCisJe1dNTV9DV01BWF9DRkcsCTB4MDAwMDM0YWF9LAorfTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2RlZmluZQlOVU1fTUFDX1JFR19QQVJNUwkJKHNpemVvZihNQUNSZWdUYWJsZSkgLyBzaXplb2YoUlRNUF9SRUdfUEFJUikpCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZGVmaW5lCU5VTV9TVEFfTUFDX1JFR19QQVJNUwkoc2l6ZW9mKFNUQU1BQ1JlZ1RhYmxlKSAvIHNpemVvZihSVE1QX1JFR19QQUlSKSkKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIFJUMjg3MAorLy8KKy8vIFJUMjg3MCBGaXJtd2FyZSBTcGVjIG9ubHkgdXNlZCAxIG9jdCBmb3IgdmVyc2lvbiBleHByZXNzaW9uCisvLworI2RlZmluZSBGSVJNV0FSRV9NSU5PUl9WRVJTSU9OCTcKKworI2VuZGlmIC8vIFJUMjg3MCAvLworCisvLyBOZXcgOGsgYnl0ZSBmaXJtd2FyZSBzaXplIGZvciBSVDMwNzEvUlQzMDcyCisjZGVmaW5lIEZJUk1XQVJFSU1BR0VfTUFYX0xFTkdUSAkweDIwMDAKKyNkZWZpbmUgRklSTVdBUkVJTUFHRV9MRU5HVEgJCShzaXplb2YgKEZpcm13YXJlSW1hZ2UpIC8gc2l6ZW9mKFVDSEFSKSkKKyNkZWZpbmUgRklSTVdBUkVfTUFKT1JfVkVSU0lPTgkwCisKKyNkZWZpbmUgRklSTVdBUkVJTUFHRVYxX0xFTkdUSAkweDEwMDAKKyNkZWZpbmUgRklSTVdBUkVJTUFHRVYyX0xFTkdUSAkweDEwMDAKKworCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlBbGxvY2F0ZSBSVE1QX0FEQVBURVIgZGF0YSBibG9jayBhbmQgZG8gc29tZSBpbml0aWFsaXphdGlvbgorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX1NVQ0NFU1MKKwkJTkRJU19TVEFUVVNfRkFJTFVSRQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUwlSVE1QQWxsb2NBZGFwdGVyQmxvY2soCisJSU4gIFBWT0lECWhhbmRsZSwKKwlPVVQJUFJUTVBfQURBUFRFUgkqcHBBZGFwdGVyKQoreworCVBSVE1QX0FEQVBURVIJcEFkOworCU5ESVNfU1RBVFVTCQlTdGF0dXM7CisJSU5UIAkJCWluZGV4OworCVVDSEFSCQkJKnBCZWFjb25CdWYgPSBOVUxMOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFJUTVBBbGxvY0FkYXB0ZXJCbG9ja1xuIikpOworCisJKnBwQWRhcHRlciA9IE5VTEw7CisKKwlkbworCXsKKwkJLy8gQWxsb2NhdGUgUlRNUF9BREFQVEVSIG1lbW9yeSBibG9jaworCQlwQmVhY29uQnVmID0ga21hbGxvYyhNQVhfQkVBQ09OX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKKwkJaWYgKHBCZWFjb25CdWYgPT0gTlVMTCkKKwkJeworCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgLSBCZWFjb25CdWYhXG4iKSk7CisJCQlicmVhazsKKwkJfQorCisJCVN0YXR1cyA9IEFkYXB0ZXJCbG9ja0FsbG9jYXRlTWVtb3J5KGhhbmRsZSwgKFBWT0lEICopJnBBZCk7CisJCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJeworCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSAtIEFEQVBURVJcbiIpKTsKKwkJCWJyZWFrOworCQl9CisJCXBBZC0+QmVhY29uQnVmID0gcEJlYWNvbkJ1ZjsKKwkJcHJpbnRrKCJcblxuPT09IHBBZCA9ICVwLCBzaXplID0gJWQgPT09XG5cbiIsIHBBZCwgKFVJTlQzMilzaXplb2YoUlRNUF9BREFQVEVSKSk7CisKKworCQkvLyBJbml0IHNwaW4gbG9ja3MKKwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+TWdtdFJpbmdMb2NrKTsKKworCQlmb3IgKGluZGV4ID0wIDsgaW5kZXggPCBOVU1fT0ZfVFhfUklORzsgaW5kZXgrKykKKwkJeworCQkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+VHhTd1F1ZXVlTG9ja1tpbmRleF0pOworCQkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+RGVRdWV1ZUxvY2tbaW5kZXhdKTsKKwkJCXBBZC0+RGVRdWV1ZVJ1bm5pbmdbaW5kZXhdID0gRkFMU0U7CisJCX0KKworCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5pcnFfbG9jayk7CisKKwl9IHdoaWxlIChGQUxTRSk7CisKKwlpZiAoKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSAmJiAocEJlYWNvbkJ1ZikpCisJCWtmcmVlKHBCZWFjb25CdWYpOworCisJKnBwQWRhcHRlciA9IHBBZDsKKworCURCR1BSSU5UX1MoU3RhdHVzLCAoIjwtLSBSVE1QQWxsb2NBZGFwdGVyQmxvY2ssIFN0YXR1cz0leFxuIiwgU3RhdHVzKSk7CisJcmV0dXJuIFN0YXR1czsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJlYWQgaW5pdGlhbCBUeCBwb3dlciBwZXIgTUNTIGFuZCBCVyBmcm9tIEVFUFJPTQorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFJlYWRUeFB3clBlclJhdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJVUxPTkcJCWRhdGEsIEFkYXRhLCBHZGF0YTsKKwlVU0hPUlQJCWksIHZhbHVlLCB2YWx1ZTI7CisJSU5UCQkJQXB3cmRlbHRhLCBHcHdyZGVsdGE7CisJVUNIQVIJCXQxLHQyLHQzLHQ0OworCUJPT0xFQU4JCWJWYWxpZCwgYkFwd3JkZWx0YU1pbnVzID0gVFJVRSwgYkdwd3JkZWx0YU1pbnVzID0gVFJVRTsKKworCS8vCisJLy8gR2V0IHBvd2VyIGRlbHRhIGZvciAyME1IeiBhbmQgNDBNSHouCisJLy8KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUeHBvd2VyIHBlciBSYXRlXG4iKSk7CisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9ERUxUQSwgdmFsdWUyKTsKKwlBcHdyZGVsdGEgPSAwOworCUdwd3JkZWx0YSA9IDA7CisKKwlpZiAoKHZhbHVlMiAmIDB4ZmYpICE9IDB4ZmYpCisJeworCQlpZiAoKHZhbHVlMiAmIDB4ODApKQorCQkJR3B3cmRlbHRhID0gKHZhbHVlMiYweGYpOworCisJCWlmICgodmFsdWUyICYgMHg0MCkpCisJCQliR3B3cmRlbHRhTWludXMgPSBGQUxTRTsKKwkJZWxzZQorCQkJYkdwd3JkZWx0YU1pbnVzID0gVFJVRTsKKwl9CisJaWYgKCh2YWx1ZTIgJiAweGZmMDApICE9IDB4ZmYwMCkKKwl7CisJCWlmICgodmFsdWUyICYgMHg4MDAwKSkKKwkJCUFwd3JkZWx0YSA9ICgodmFsdWUyJjB4ZjAwKT4+OCk7CisKKwkJaWYgKCh2YWx1ZTIgJiAweDQwMDApKQorCQkJYkFwd3JkZWx0YU1pbnVzID0gRkFMU0U7CisJCWVsc2UKKwkJCWJBcHdyZGVsdGFNaW51cyA9IFRSVUU7CisJfQorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkdwd3JkZWx0YSA9ICV4LCBBcHdyZGVsdGEgPSAleCAuXG4iLCBHcHdyZGVsdGEsIEFwd3JkZWx0YSkpOworCisJLy8KKwkvLyBHZXQgVHhwb3dlciBwZXIgTUNTIGZvciAyME1IeiBpbiAyLjRHLgorCS8vCisJZm9yIChpPTA7IGk8NTsgaSsrKQorCXsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfMl80RyArIGkqNCwgdmFsdWUpOworCQlkYXRhID0gdmFsdWU7CisJCWlmIChiQXB3cmRlbHRhTWludXMgPT0gRkFMU0UpCisJCXsKKwkJCXQxID0gKHZhbHVlJjB4ZikrKEFwd3JkZWx0YSk7CisJCQlpZiAodDEgPiAweGYpCisJCQkJdDEgPSAweGY7CisJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhBcHdyZGVsdGEpOworCQkJaWYgKHQyID4gMHhmKQorCQkJCXQyID0gMHhmOworCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEFwd3JkZWx0YSk7CisJCQlpZiAodDMgPiAweGYpCisJCQkJdDMgPSAweGY7CisJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhBcHdyZGVsdGEpOworCQkJaWYgKHQ0ID4gMHhmKQorCQkJCXQ0ID0gMHhmOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKCh2YWx1ZSYweGYpID4gQXB3cmRlbHRhKQorCQkJCXQxID0gKHZhbHVlJjB4ZiktKEFwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDEgPSAwOworCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gQXB3cmRlbHRhKQorCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEFwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDIgPSAwOworCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEFwd3JkZWx0YSkKKwkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oQXB3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0MyA9IDA7CisJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBBcHdyZGVsdGEpCisJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oQXB3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0NCA9IDA7CisJCX0KKwkJQWRhdGEgPSB0MSArICh0Mjw8NCkgKyAodDM8PDgpICsgKHQ0PDwxMik7CisJCWlmIChiR3B3cmRlbHRhTWludXMgPT0gRkFMU0UpCisJCXsKKwkJCXQxID0gKHZhbHVlJjB4ZikrKEdwd3JkZWx0YSk7CisJCQlpZiAodDEgPiAweGYpCisJCQkJdDEgPSAweGY7CisJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhHcHdyZGVsdGEpOworCQkJaWYgKHQyID4gMHhmKQorCQkJCXQyID0gMHhmOworCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEdwd3JkZWx0YSk7CisJCQlpZiAodDMgPiAweGYpCisJCQkJdDMgPSAweGY7CisJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhHcHdyZGVsdGEpOworCQkJaWYgKHQ0ID4gMHhmKQorCQkJCXQ0ID0gMHhmOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKCh2YWx1ZSYweGYpID4gR3B3cmRlbHRhKQorCQkJCXQxID0gKHZhbHVlJjB4ZiktKEdwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDEgPSAwOworCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gR3B3cmRlbHRhKQorCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEdwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDIgPSAwOworCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEdwd3JkZWx0YSkKKwkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oR3B3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0MyA9IDA7CisJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBHcHdyZGVsdGEpCisJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oR3B3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0NCA9IDA7CisJCX0KKwkJR2RhdGEgPSB0MSArICh0Mjw8NCkgKyAodDM8PDgpICsgKHQ0PDwxMik7CisKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfMl80RyArIGkqNCArIDIsIHZhbHVlKTsKKwkJaWYgKGJBcHdyZGVsdGFNaW51cyA9PSBGQUxTRSkKKwkJeworCQkJdDEgPSAodmFsdWUmMHhmKSsoQXB3cmRlbHRhKTsKKwkJCWlmICh0MSA+IDB4ZikKKwkJCQl0MSA9IDB4ZjsKKwkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCkrKEFwd3JkZWx0YSk7CisJCQlpZiAodDIgPiAweGYpCisJCQkJdDIgPSAweGY7CisJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KSsoQXB3cmRlbHRhKTsKKwkJCWlmICh0MyA+IDB4ZikKKwkJCQl0MyA9IDB4ZjsKKwkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMikrKEFwd3JkZWx0YSk7CisJCQlpZiAodDQgPiAweGYpCisJCQkJdDQgPSAweGY7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoKHZhbHVlJjB4ZikgPiBBcHdyZGVsdGEpCisJCQkJdDEgPSAodmFsdWUmMHhmKS0oQXB3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0MSA9IDA7CisJCQlpZiAoKCh2YWx1ZSYweGYwKT4+NCkgPiBBcHdyZGVsdGEpCisJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oQXB3cmRlbHRhKTsKKwkJCWVsc2UKKwkJCQl0MiA9IDA7CisJCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gQXB3cmRlbHRhKQorCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpLShBcHdyZGVsdGEpOworCQkJZWxzZQorCQkJCXQzID0gMDsKKwkJCWlmICgoKHZhbHVlJjB4ZjAwMCk+PjEyKSA+IEFwd3JkZWx0YSkKKwkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpLShBcHdyZGVsdGEpOworCQkJZWxzZQorCQkJCXQ0ID0gMDsKKwkJfQorCQlBZGF0YSB8PSAoKHQxPDwxNikgKyAodDI8PDIwKSArICh0Mzw8MjQpICsgKHQ0PDwyOCkpOworCQlpZiAoYkdwd3JkZWx0YU1pbnVzID09IEZBTFNFKQorCQl7CisJCQl0MSA9ICh2YWx1ZSYweGYpKyhHcHdyZGVsdGEpOworCQkJaWYgKHQxID4gMHhmKQorCQkJCXQxID0gMHhmOworCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoR3B3cmRlbHRhKTsKKwkJCWlmICh0MiA+IDB4ZikKKwkJCQl0MiA9IDB4ZjsKKwkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhHcHdyZGVsdGEpOworCQkJaWYgKHQzID4gMHhmKQorCQkJCXQzID0gMHhmOworCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoR3B3cmRlbHRhKTsKKwkJCWlmICh0NCA+IDB4ZikKKwkJCQl0NCA9IDB4ZjsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmICgodmFsdWUmMHhmKSA+IEdwd3JkZWx0YSkKKwkJCQl0MSA9ICh2YWx1ZSYweGYpLShHcHdyZGVsdGEpOworCQkJZWxzZQorCQkJCXQxID0gMDsKKwkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEdwd3JkZWx0YSkKKwkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShHcHdyZGVsdGEpOworCQkJZWxzZQorCQkJCXQyID0gMDsKKwkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBHcHdyZGVsdGEpCisJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEdwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDMgPSAwOworCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gR3B3cmRlbHRhKQorCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEdwd3JkZWx0YSk7CisJCQllbHNlCisJCQkJdDQgPSAwOworCQl9CisJCUdkYXRhIHw9ICgodDE8PDE2KSArICh0Mjw8MjApICsgKHQzPDwyNCkgKyAodDQ8PDI4KSk7CisJCWRhdGEgfD0gKHZhbHVlPDwxNik7CisKKwkJcEFkLT5UeDIwTVB3ckNmZ0FCYW5kW2ldID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kW2ldID0gQWRhdGE7CisJCXBBZC0+VHgyME1Qd3JDZmdHQmFuZFtpXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFtpXSA9IEdkYXRhOworCisJCWlmIChkYXRhICE9IDB4ZmZmZmZmZmYpCisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QV1JfQ0ZHXzAgKyBpKjQsIGRhdGEpOworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiMjBNSHogQlcsIDIuNEcgYmFuZC0lbHgsICBBZGF0YSA9ICVseCwgIEdkYXRhID0gJWx4IFxuIiwgZGF0YSwgQWRhdGEsIEdkYXRhKSk7CisJfQorCisJLy8KKwkvLyBDaGVjayB0aGlzIGJsb2NrIGlzIHZhbGlkIGZvciA0ME1IeiBpbiAyLjRHLiBJZiBpbnZhbGlkLCB1c2UgcGFyYW1ldGVyIGZvciAyME1IeiBpbiAyLjRHCisJLy8KKwliVmFsaWQgPSBUUlVFOworCWZvciAoaT0wOyBpPDY7IGkrKykKKwl7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzQwTUhaXzJfNEcgKyAyICsgaSoyLCB2YWx1ZSk7CisJCWlmICgoKHZhbHVlICYgMHgwMEZGKSA9PSAweDAwRkYpIHx8ICgodmFsdWUgJiAweEZGMDApID09IDB4RkYwMCkpCisJCXsKKwkJCWJWYWxpZCA9IEZBTFNFOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvLworCS8vIEdldCBUeHBvd2VyIHBlciBNQ1MgZm9yIDQwTUh6IGluIDIuNEcuCisJLy8KKwlpZiAoYlZhbGlkKQorCXsKKwkJZm9yIChpPTA7IGk8NDsgaSsrKQorCQl7CisJCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0JZUkFURV80ME1IWl8yXzRHICsgaSo0LCB2YWx1ZSk7CisJCQlpZiAoYkdwd3JkZWx0YU1pbnVzID09IEZBTFNFKQorCQkJeworCQkJCXQxID0gKHZhbHVlJjB4ZikrKEdwd3JkZWx0YSk7CisJCQkJaWYgKHQxID4gMHhmKQorCQkJCQl0MSA9IDB4ZjsKKwkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhHcHdyZGVsdGEpOworCQkJCWlmICh0MiA+IDB4ZikKKwkJCQkJdDIgPSAweGY7CisJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEdwd3JkZWx0YSk7CisJCQkJaWYgKHQzID4gMHhmKQorCQkJCQl0MyA9IDB4ZjsKKwkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhHcHdyZGVsdGEpOworCQkJCWlmICh0NCA+IDB4ZikKKwkJCQkJdDQgPSAweGY7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKCh2YWx1ZSYweGYpID4gR3B3cmRlbHRhKQorCQkJCQl0MSA9ICh2YWx1ZSYweGYpLShHcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDEgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEdwd3JkZWx0YSkKKwkJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oR3B3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQyID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gR3B3cmRlbHRhKQorCQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oR3B3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQzID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBHcHdyZGVsdGEpCisJCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEdwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0NCA9IDA7CisJCQl9CisJCQlHZGF0YSA9IHQxICsgKHQyPDw0KSArICh0Mzw8OCkgKyAodDQ8PDEyKTsKKworCQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfNDBNSFpfMl80RyArIGkqNCArIDIsIHZhbHVlKTsKKwkJCWlmIChiR3B3cmRlbHRhTWludXMgPT0gRkFMU0UpCisJCQl7CisJCQkJdDEgPSAodmFsdWUmMHhmKSsoR3B3cmRlbHRhKTsKKwkJCQlpZiAodDEgPiAweGYpCisJCQkJCXQxID0gMHhmOworCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCkrKEdwd3JkZWx0YSk7CisJCQkJaWYgKHQyID4gMHhmKQorCQkJCQl0MiA9IDB4ZjsKKwkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KSsoR3B3cmRlbHRhKTsKKwkJCQlpZiAodDMgPiAweGYpCisJCQkJCXQzID0gMHhmOworCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMikrKEdwd3JkZWx0YSk7CisJCQkJaWYgKHQ0ID4gMHhmKQorCQkJCQl0NCA9IDB4ZjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAoKHZhbHVlJjB4ZikgPiBHcHdyZGVsdGEpCisJCQkJCXQxID0gKHZhbHVlJjB4ZiktKEdwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MSA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gR3B3cmRlbHRhKQorCQkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShHcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDIgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBHcHdyZGVsdGEpCisJCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpLShHcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDMgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjAwMCk+PjEyKSA+IEdwd3JkZWx0YSkKKwkJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oR3B3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQ0ID0gMDsKKwkJCX0KKwkJCUdkYXRhIHw9ICgodDE8PDE2KSArICh0Mjw8MjApICsgKHQzPDwyNCkgKyAodDQ8PDI4KSk7CisKKwkJCWlmIChpID09IDApCisJCQkJcEFkLT5UeDQwTVB3ckNmZ0dCYW5kW2krMV0gPSAocEFkLT5UeDQwTVB3ckNmZ0dCYW5kW2krMV0gJiAweDAwMDBGRkZGKSB8IChHZGF0YSAmIDB4RkZGRjAwMDApOworCQkJZWxzZQorCQkJCXBBZC0+VHg0ME1Qd3JDZmdHQmFuZFtpKzFdID0gR2RhdGE7CisKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCI0ME1IeiBCVywgMi40RyBiYW5kLCBHZGF0YSA9ICVseCBcbiIsIEdkYXRhKSk7CisJCX0KKwl9CisKKwkvLworCS8vIENoZWNrIHRoaXMgYmxvY2sgaXMgdmFsaWQgZm9yIDIwTUh6IGluIDVHLiBJZiBpbnZhbGlkLCB1c2UgcGFyYW1ldGVyIGZvciAyME1IeiBpbiAyLjRHCisJLy8KKwliVmFsaWQgPSBUUlVFOworCWZvciAoaT0wOyBpPDg7IGkrKykKKwl7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzIwTUhaXzVHICsgMiArIGkqMiwgdmFsdWUpOworCQlpZiAoKCh2YWx1ZSAmIDB4MDBGRikgPT0gMHgwMEZGKSB8fCAoKHZhbHVlICYgMHhGRjAwKSA9PSAweEZGMDApKQorCQl7CisJCQliVmFsaWQgPSBGQUxTRTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLy8KKwkvLyBHZXQgVHhwb3dlciBwZXIgTUNTIGZvciAyME1IeiBpbiA1Ry4KKwkvLworCWlmIChiVmFsaWQpCisJeworCQlmb3IgKGk9MDsgaTw1OyBpKyspCisJCXsKKwkJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzIwTUhaXzVHICsgaSo0LCB2YWx1ZSk7CisJCQlpZiAoYkFwd3JkZWx0YU1pbnVzID09IEZBTFNFKQorCQkJeworCQkJCXQxID0gKHZhbHVlJjB4ZikrKEFwd3JkZWx0YSk7CisJCQkJaWYgKHQxID4gMHhmKQorCQkJCQl0MSA9IDB4ZjsKKwkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MiA+IDB4ZikKKwkJCQkJdDIgPSAweGY7CisJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEFwd3JkZWx0YSk7CisJCQkJaWYgKHQzID4gMHhmKQorCQkJCQl0MyA9IDB4ZjsKKwkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0NCA+IDB4ZikKKwkJCQkJdDQgPSAweGY7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKCh2YWx1ZSYweGYpID4gQXB3cmRlbHRhKQorCQkJCQl0MSA9ICh2YWx1ZSYweGYpLShBcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDEgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEFwd3JkZWx0YSkKKwkJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQyID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gQXB3cmRlbHRhKQorCQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQzID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBBcHdyZGVsdGEpCisJCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0NCA9IDA7CisJCQl9CisJCQlBZGF0YSA9IHQxICsgKHQyPDw0KSArICh0Mzw8OCkgKyAodDQ8PDEyKTsKKworCQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfNUcgKyBpKjQgKyAyLCB2YWx1ZSk7CisJCQlpZiAoYkFwd3JkZWx0YU1pbnVzID09IEZBTFNFKQorCQkJeworCQkJCXQxID0gKHZhbHVlJjB4ZikrKEFwd3JkZWx0YSk7CisJCQkJaWYgKHQxID4gMHhmKQorCQkJCQl0MSA9IDB4ZjsKKwkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MiA+IDB4ZikKKwkJCQkJdDIgPSAweGY7CisJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEFwd3JkZWx0YSk7CisJCQkJaWYgKHQzID4gMHhmKQorCQkJCQl0MyA9IDB4ZjsKKwkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0NCA+IDB4ZikKKwkJCQkJdDQgPSAweGY7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKCh2YWx1ZSYweGYpID4gQXB3cmRlbHRhKQorCQkJCQl0MSA9ICh2YWx1ZSYweGYpLShBcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDEgPSAwOworCQkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEFwd3JkZWx0YSkKKwkJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQyID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gQXB3cmRlbHRhKQorCQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQzID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBBcHdyZGVsdGEpCisJCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0NCA9IDA7CisJCQl9CisJCQlBZGF0YSB8PSAoKHQxPDwxNikgKyAodDI8PDIwKSArICh0Mzw8MjQpICsgKHQ0PDwyOCkpOworCisJCQlpZiAoaSA9PSAwKQorCQkJCXBBZC0+VHgyME1Qd3JDZmdBQmFuZFtpXSA9IChwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbaV0gJiAweDAwMDBGRkZGKSB8IChBZGF0YSAmIDB4RkZGRjAwMDApOworCQkJZWxzZQorCQkJCXBBZC0+VHgyME1Qd3JDZmdBQmFuZFtpXSA9IEFkYXRhOworCisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiMjBNSHogQlcsIDVHSHogYmFuZCwgQWRhdGEgPSAlbHggXG4iLCBBZGF0YSkpOworCQl9CisJfQorCisJLy8KKwkvLyBDaGVjayB0aGlzIGJsb2NrIGlzIHZhbGlkIGZvciA0ME1IeiBpbiA1Ry4gSWYgaW52YWxpZCwgdXNlIHBhcmFtZXRlciBmb3IgMjBNSHogaW4gMi40RworCS8vCisJYlZhbGlkID0gVFJVRTsKKwlmb3IgKGk9MDsgaTw2OyBpKyspCisJeworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0JZUkFURV80ME1IWl81RyArIDIgKyBpKjIsIHZhbHVlKTsKKwkJaWYgKCgodmFsdWUgJiAweDAwRkYpID09IDB4MDBGRikgfHwgKCh2YWx1ZSAmIDB4RkYwMCkgPT0gMHhGRjAwKSkKKwkJeworCQkJYlZhbGlkID0gRkFMU0U7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8vCisJLy8gR2V0IFR4cG93ZXIgcGVyIE1DUyBmb3IgNDBNSHogaW4gNUcuCisJLy8KKwlpZiAoYlZhbGlkKQorCXsKKwkJZm9yIChpPTA7IGk8NDsgaSsrKQorCQl7CisJCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0JZUkFURV80ME1IWl81RyArIGkqNCwgdmFsdWUpOworCQkJaWYgKGJBcHdyZGVsdGFNaW51cyA9PSBGQUxTRSkKKwkJCXsKKwkJCQl0MSA9ICh2YWx1ZSYweGYpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MSA+IDB4ZikKKwkJCQkJdDEgPSAweGY7CisJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDIgPiAweGYpCisJCQkJCXQyID0gMHhmOworCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MyA+IDB4ZikKKwkJCQkJdDMgPSAweGY7CisJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDQgPiAweGYpCisJCQkJCXQ0ID0gMHhmOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmICgodmFsdWUmMHhmKSA+IEFwd3JkZWx0YSkKKwkJCQkJdDEgPSAodmFsdWUmMHhmKS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQxID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwKT4+NCkgPiBBcHdyZGVsdGEpCisJCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MiA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEFwd3JkZWx0YSkKKwkJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MyA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gQXB3cmRlbHRhKQorCQkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpLShBcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDQgPSAwOworCQkJfQorCQkJQWRhdGEgPSB0MSArICh0Mjw8NCkgKyAodDM8PDgpICsgKHQ0PDwxMik7CisKKwkJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzQwTUhaXzVHICsgaSo0ICsgMiwgdmFsdWUpOworCQkJaWYgKGJBcHdyZGVsdGFNaW51cyA9PSBGQUxTRSkKKwkJCXsKKwkJCQl0MSA9ICh2YWx1ZSYweGYpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MSA+IDB4ZikKKwkJCQkJdDEgPSAweGY7CisJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDIgPiAweGYpCisJCQkJCXQyID0gMHhmOworCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhBcHdyZGVsdGEpOworCQkJCWlmICh0MyA+IDB4ZikKKwkJCQkJdDMgPSAweGY7CisJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoQXB3cmRlbHRhKTsKKwkJCQlpZiAodDQgPiAweGYpCisJCQkJCXQ0ID0gMHhmOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmICgodmFsdWUmMHhmKSA+IEFwd3JkZWx0YSkKKwkJCQkJdDEgPSAodmFsdWUmMHhmKS0oQXB3cmRlbHRhKTsKKwkJCQllbHNlCisJCQkJCXQxID0gMDsKKwkJCQlpZiAoKCh2YWx1ZSYweGYwKT4+NCkgPiBBcHdyZGVsdGEpCisJCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MiA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEFwd3JkZWx0YSkKKwkJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEFwd3JkZWx0YSk7CisJCQkJZWxzZQorCQkJCQl0MyA9IDA7CisJCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gQXB3cmRlbHRhKQorCQkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpLShBcHdyZGVsdGEpOworCQkJCWVsc2UKKwkJCQkJdDQgPSAwOworCQkJfQorCQkJQWRhdGEgfD0gKCh0MTw8MTYpICsgKHQyPDwyMCkgKyAodDM8PDI0KSArICh0NDw8MjgpKTsKKworCQkJaWYgKGkgPT0gMCkKKwkJCQlwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbaSsxXSA9IChwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbaSsxXSAmIDB4MDAwMEZGRkYpIHwgKEFkYXRhICYgMHhGRkZGMDAwMCk7CisJCQllbHNlCisJCQkJcEFkLT5UeDQwTVB3ckNmZ0FCYW5kW2krMV0gPSBBZGF0YTsKKworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIjQwTUh6IEJXLCA1R0h6IGJhbmQsIEFkYXRhID0gJWx4IFxuIiwgQWRhdGEpKTsKKwkJfQorCX0KK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUmVhZCBpbml0aWFsIGNoYW5uZWwgcG93ZXIgcGFyYW1ldGVycyBmcm9tIEVFUFJPTQorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFJlYWRDaGFubmVsUHdyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVVDSEFSCQkJCWksIGNob2Zmc2V0OworCUVFUFJPTV9UWF9QV1JfU1RSVUMJICAgIFBvd2VyOworCUVFUFJPTV9UWF9QV1JfU1RSVUMJICAgIFBvd2VyMjsKKworCS8vIFJlYWQgVHggcG93ZXIgdmFsdWUgZm9yIGFsbCBjaGFubmVscworCS8vIFZhbHVlIGZyb20gMSAtIDB4N2YuIERlZmF1bHQgdmFsdWUgaXMgMjQuCisJLy8gUG93ZXIgdmFsdWUgOiAyLjRHIDB4MDAgKDApIH4gMHgxRiAoMzEpCisJLy8gICAgICAgICAgICAgOiA1LjVHIDB4RjkgKC03KSB+IDB4MEYgKDE1KQorCisJLy8gMC4gMTFiL2csIGNoMSAtIGNoIDE0CisJZm9yIChpID0gMDsgaSA8IDc7IGkrKykKKwl7CisvLwkJUG93ZXIud29yZCA9IFJUTVBfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9HX1RYX1BXUl9PRkZTRVQgKyBpICogMik7CisvLwkJUG93ZXIyLndvcmQgPSBSVE1QX0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fR19UWDJfUFdSX09GRlNFVCArIGkgKiAyKTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fR19UWF9QV1JfT0ZGU0VUICsgaSAqIDIsIFBvd2VyLndvcmQpOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9HX1RYMl9QV1JfT0ZGU0VUICsgaSAqIDIsIFBvd2VyMi53b3JkKTsKKwkJcEFkLT5UeFBvd2VyW2kgKiAyXS5DaGFubmVsID0gaSAqIDIgKyAxOworCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyAxXS5DaGFubmVsID0gaSAqIDIgKyAyOworCisJCWlmICgoUG93ZXIuZmllbGQuQnl0ZTAgPiAzMSkgfHwgKFBvd2VyLmZpZWxkLkJ5dGUwIDwgMCkpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDJdLlBvd2VyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJZWxzZQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyXS5Qb3dlciA9IFBvd2VyLmZpZWxkLkJ5dGUwOworCisJCWlmICgoUG93ZXIuZmllbGQuQnl0ZTEgPiAzMSkgfHwgKFBvd2VyLmZpZWxkLkJ5dGUxIDwgMCkpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyAxXS5Qb3dlciA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCWVsc2UKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIDFdLlBvd2VyID0gUG93ZXIuZmllbGQuQnl0ZTE7CisKKwkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTAgPiAzMSkgfHwgKFBvd2VyMi5maWVsZC5CeXRlMCA8IDApKQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyXS5Qb3dlcjIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQllbHNlCisJCQlwQWQtPlR4UG93ZXJbaSAqIDJdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMDsKKworCQlpZiAoKFBvd2VyMi5maWVsZC5CeXRlMSA+IDMxKSB8fCAoUG93ZXIyLmZpZWxkLkJ5dGUxIDwgMCkpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyAxXS5Qb3dlcjIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQllbHNlCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyAxXS5Qb3dlcjIgPSBQb3dlcjIuZmllbGQuQnl0ZTE7CisJfQorCisJLy8gMS4gVS1OSUkgbG93ZXIvbWlkZGxlIGJhbmQ6IDM2LCAzOCwgNDA7IDQ0LCA0NiwgNDg7IDUyLCA1NCwgNTY7IDYwLCA2MiwgNjQgKGluY2x1ZGluZyBjZW50cmFsIGZyZXF1ZW5jeSBpbiBCVyA0ME1IeikKKwkvLyAxLjEgRmlsbCB1cCBjaGFubmVsCisJY2hvZmZzZXQgPSAxNDsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCXsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5DaGFubmVsCT0gMzYgKyBpICogOCArIDA7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5DaGFubmVsCT0gMzYgKyBpICogOCArIDI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5DaGFubmVsCT0gMzYgKyBpICogOCArIDQ7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJfQorCisJLy8gMS4yIEZpbGwgdXAgcG93ZXIKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCXsKKy8vCQlQb3dlci53b3JkID0gUlRNUF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFhfUFdSX09GRlNFVCArIGkgKiAyKTsKKy8vCQlQb3dlcjIud29yZCA9IFJUTVBfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYMl9QV1JfT0ZGU0VUICsgaSAqIDIpOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYX1BXUl9PRkZTRVQgKyBpICogMiwgUG93ZXIud29yZCk7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFgyX1BXUl9PRkZTRVQgKyBpICogMiwgUG93ZXIyLndvcmQpOworCisJCWlmICgoUG93ZXIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUwID49IC03KSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMDsKKworCQlpZiAoKFBvd2VyLmZpZWxkLkJ5dGUxIDwgMTYpICYmIChQb3dlci5maWVsZC5CeXRlMSA+PSAtNykpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDFdLlBvd2VyID0gUG93ZXIuZmllbGQuQnl0ZTE7CisKKwkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyMi5maWVsZC5CeXRlMCA+PSAtNykpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDBdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMDsKKworCQlpZiAoKFBvd2VyMi5maWVsZC5CeXRlMSA8IDE2KSAmJiAoUG93ZXIyLmZpZWxkLkJ5dGUxID49IC03KSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUxOworCX0KKworCS8vIDIuIEhpcHBlckxBTiAyIDEwMCwgMTAyICwxMDQ7IDEwOCwgMTEwLCAxMTI7IDExNiwgMTE4LCAxMjA7IDEyNCwgMTI2LCAxMjg7IDEzMiwgMTM0LCAxMzY7IDE0MCAoaW5jbHVkaW5nIGNlbnRyYWwgZnJlcXVlbmN5IGluIEJXIDQwTUh6KQorCS8vIDIuMSBGaWxsIHVwIGNoYW5uZWwKKwljaG9mZnNldCA9IDE0ICsgMTI7CisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwl7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uQ2hhbm5lbAk9IDEwMCArIGkgKiA4ICsgMDsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLkNoYW5uZWwJPSAxMDAgKyBpICogOCArIDI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5DaGFubmVsCT0gMTAwICsgaSAqIDggKyA0OworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCX0KKwlwQWQtPlR4UG93ZXJbMyAqIDUgKyBjaG9mZnNldCArIDBdLkNoYW5uZWwJCT0gMTQwOworCXBBZC0+VHhQb3dlclszICogNSArIGNob2Zmc2V0ICsgMF0uUG93ZXIJCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwlwQWQtPlR4UG93ZXJbMyAqIDUgKyBjaG9mZnNldCArIDBdLlBvd2VyMgkJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCisJLy8gMi4yIEZpbGwgdXAgcG93ZXIKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCXsKKy8vCQlQb3dlci53b3JkID0gUlRNUF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFhfUFdSX09GRlNFVCArIChjaG9mZnNldCAtIDE0KSArIGkgKiAyKTsKKy8vCQlQb3dlcjIud29yZCA9IFJUTVBfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYMl9QV1JfT0ZGU0VUICsgKGNob2Zmc2V0IC0gMTQpICsgaSAqIDIpOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYX1BXUl9PRkZTRVQgKyAoY2hvZmZzZXQgLSAxNCkgKyBpICogMiwgUG93ZXIud29yZCk7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFgyX1BXUl9PRkZTRVQgKyAoY2hvZmZzZXQgLSAxNCkgKyBpICogMiwgUG93ZXIyLndvcmQpOworCisJCWlmICgoUG93ZXIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUwID49IC03KSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMDsKKworCQlpZiAoKFBvd2VyLmZpZWxkLkJ5dGUxIDwgMTYpICYmIChQb3dlci5maWVsZC5CeXRlMSA+PSAtNykpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDFdLlBvd2VyID0gUG93ZXIuZmllbGQuQnl0ZTE7CisKKwkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyMi5maWVsZC5CeXRlMCA+PSAtNykpCisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDBdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMDsKKworCQlpZiAoKFBvd2VyMi5maWVsZC5CeXRlMSA8IDE2KSAmJiAoUG93ZXIyLmZpZWxkLkJ5dGUxID49IC03KSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUxOworCX0KKworCS8vIDMuIFUtTklJIHVwcGVyIGJhbmQ6IDE0OSwgMTUxLCAxNTM7IDE1NywgMTU5LCAxNjE7IDE2NSAoaW5jbHVkaW5nIGNlbnRyYWwgZnJlcXVlbmN5IGluIEJXIDQwTUh6KQorCS8vIDMuMSBGaWxsIHVwIGNoYW5uZWwKKwljaG9mZnNldCA9IDE0ICsgMTIgKyAxNjsKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorCXsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5DaGFubmVsCT0gMTQ5ICsgaSAqIDggKyAwOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uQ2hhbm5lbAk9IDE0OSArIGkgKiA4ICsgMjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLkNoYW5uZWwJPSAxNDkgKyBpICogOCArIDQ7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJfQorCXBBZC0+VHhQb3dlclszICogMiArIGNob2Zmc2V0ICsgMF0uQ2hhbm5lbAkJPSAxNjU7CisJcEFkLT5UeFBvd2VyWzMgKiAyICsgY2hvZmZzZXQgKyAwXS5Qb3dlcgkJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCXBBZC0+VHhQb3dlclszICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIyCQk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisKKwkvLyAzLjIgRmlsbCB1cCBwb3dlcgorCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJeworLy8JCVBvd2VyLndvcmQgPSBSVE1QX0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fQV9UWF9QV1JfT0ZGU0VUICsgKGNob2Zmc2V0IC0gMTQpICsgaSAqIDIpOworLy8JCVBvd2VyMi53b3JkID0gUlRNUF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFgyX1BXUl9PRkZTRVQgKyAoY2hvZmZzZXQgLSAxNCkgKyBpICogMik7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFhfUFdSX09GRlNFVCArIChjaG9mZnNldCAtIDE0KSArIGkgKiAyLCBQb3dlci53b3JkKTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fQV9UWDJfUFdSX09GRlNFVCArIChjaG9mZnNldCAtIDE0KSArIGkgKiAyLCBQb3dlcjIud29yZCk7CisKKwkJaWYgKChQb3dlci5maWVsZC5CeXRlMCA8IDE2KSAmJiAoUG93ZXIuZmllbGQuQnl0ZTAgPj0gLTcpKQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAwXS5Qb3dlciA9IFBvd2VyLmZpZWxkLkJ5dGUwOworCisJCWlmICgoUG93ZXIuZmllbGQuQnl0ZTEgPCAxNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUxID49IC03KSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMTsKKworCQlpZiAoKFBvd2VyMi5maWVsZC5CeXRlMCA8IDE2KSAmJiAoUG93ZXIyLmZpZWxkLkJ5dGUwID49IC03KSkKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUwOworCisJCWlmICgoUG93ZXIyLmZpZWxkLkJ5dGUxIDwgMTYpICYmIChQb3dlcjIuZmllbGQuQnl0ZTEgPj0gLTcpKQorCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAxXS5Qb3dlcjIgPSBQb3dlcjIuZmllbGQuQnl0ZTE7CisJfQorCisJLy8gNC4gUHJpbnQgYW5kIERlYnVnCisJY2hvZmZzZXQgPSAxNCArIDEyICsgMTYgKyA3OworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlSZWFkIHRoZSBmb2xsb3dpbmcgZnJvbSB0aGUgcmVnaXN0cnkKKwkJMS4gQWxsIHRoZSBwYXJhbWV0ZXJzCisJCTIuIE5ldHdvcmtBZGRyZXMKKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJV3JhcHBlckNvbmZpZ3VyYXRpb25Db250ZXh0CUZvciB1c2UgYnkgTmRpc09wZW5Db25maWd1cmF0aW9uCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX1NVQ0NFU1MKKwkJTkRJU19TVEFUVVNfRkFJTFVSRQorCQlORElTX1NUQVRVU19SRVNPVVJDRVMKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMJTklDUmVhZFJlZ1BhcmFtZXRlcnMoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCU5ESVNfSEFORExFCQkJV3JhcHBlckNvbmZpZ3VyYXRpb25Db250ZXh0CisJKQoreworCU5ESVNfU1RBVFVTCQkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlEQkdQUklOVF9TKFN0YXR1cywgKCI8LS0gTklDUmVhZFJlZ1BhcmFtZXRlcnMsIFN0YXR1cz0leFxuIiwgU3RhdHVzKSk7CisJcmV0dXJuIFN0YXR1czsKK30KKworCisjaWZkZWYgUlQyODcwCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJRm9yIFJGIGZpbHRlciBjYWxpYnJhdGlvbiBwdXJwb3NlCisKKwlBcmd1bWVudHM6CisJCXBBZCAgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVFVTQkZpbHRlckNhbGlicmF0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVVDSEFSCVI1NXggPSAwLCB2YWx1ZSwgRmlsdGVyVGFyZ2V0ID0gMHgxRSwgQkJQVmFsdWU7CisJVUlOVAlsb29wID0gMCwgY291bnQgPSAwLCBsb29wY250ID0gMCwgUmVUcnkgPSAwOworCVVDSEFSCVJGX1IyNF9WYWx1ZSA9IDA7CisKKwkvLyBHaXZlIGJicCBmaWx0ZXIgaW5pdGlhbCB2YWx1ZQorCXBBZC0+TWxtZS5DYWxpQlcyMFJmUjI0ID0gMHgxNjsKKwlwQWQtPk1sbWUuQ2FsaUJXNDBSZlIyNCA9IDB4MzY7ICAvL0JpdFs1XSBtdXN0IGJlIDEgZm9yIEJXIDQwCisKKwlkbworCXsKKwkJaWYgKGxvb3AgPT0gMSkJLy9CYW5kV2lkdGggPSA0MCBNSHoKKwkJeworCQkJLy8gV3JpdGUgMHgyNyB0byBSRl9SMjQgdG8gcHJvZ3JhbSBmaWx0ZXIKKwkJCVJGX1IyNF9WYWx1ZSA9IDB4Mjc7CisJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjQsIFJGX1IyNF9WYWx1ZSk7CisJCQlGaWx0ZXJUYXJnZXQgPSAweDE5OworCisJCQkvLyB3aGVuIGNhbGlicmF0ZSBCVzQwLCBCQlAgbWFzayBtdXN0IHNldCB0byBCVzQwLgorCQkJUlRVU0JSZWFkQkJQUmVnaXN0ZXIocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7CisJCQlCQlBWYWx1ZSY9ICh+MHgxOCk7CisJCQlCQlBWYWx1ZXw9ICgweDEwKTsKKwkJCVJUVVNCV3JpdGVCQlBSZWdpc3RlcihwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOworCQl9CisJCWVsc2UJCQkvL0JhbmRXaWR0aCA9IDIwIE1IegorCQl7CisJCQkvLyBXcml0ZSAweDA3IHRvIFJGX1IyNCB0byBwcm9ncmFtIGZpbHRlcgorCQkJUkZfUjI0X1ZhbHVlID0gMHgwNzsKKwkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNCwgUkZfUjI0X1ZhbHVlKTsKKwkJCUZpbHRlclRhcmdldCA9IDB4MTY7CisJCX0KKworCQkvLyBXcml0ZSAweDAxIHRvIFJGX1IyMiB0byBlbmFibGUgYmFzZWJhbmQgbG9vcGJhY2sgbW9kZQorCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMiwgJnZhbHVlKTsKKwkJdmFsdWUgfD0gMHgwMTsKKwkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjIyLCB2YWx1ZSk7CisKKwkJLy8gV3JpdGUgMHgwMCB0byBCQlBfUjI0IHRvIHNldCBwb3dlciAmIGZyZXF1ZW5jeSBvZiBwYXNzYmFuZCB0ZXN0IHRvbmUKKwkJUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKHBBZCwgQkJQX1IyNCwgMCk7CisKKwkJZG8KKwkJeworCQkJLy8gV3JpdGUgMHg5MCB0byBCQlBfUjI1IHRvIHRyYW5zbWl0IHRlc3QgdG9uZQorCQkJUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKHBBZCwgQkJQX1IyNSwgMHg5MCk7CisKKwkJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJCQkvLyBSZWFkIEJCUF9SNTVbNjowXSBmb3IgcmVjZWl2ZWQgcG93ZXIsIHNldCBSNTV4ID0gQkJQX1I1NVs2OjBdCisJCQlSVFVTQlJlYWRCQlBSZWdpc3RlcihwQWQsIEJCUF9SNTUsICZ2YWx1ZSk7CisJCQlSNTV4ID0gdmFsdWUgJiAweEZGOworCisJCX0gd2hpbGUgKChSZVRyeSsrIDwgMTAwKSAmJiAoUjU1eCA9PSAwKSk7CisKKwkJLy8gV3JpdGUgMHgwNiB0byBCQlBfUjI0IHRvIHNldCBwb3dlciAmIGZyZXF1ZW5jeSBvZiBzdG9wYmFuZCB0ZXN0IHRvbmUKKwkJUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKHBBZCwgQkJQX1IyNCwgMHgwNik7CisKKwkJd2hpbGUoVFJVRSkKKwkJeworCQkJLy8gV3JpdGUgMHg5MCB0byBCQlBfUjI1IHRvIHRyYW5zbWl0IHRlc3QgdG9uZQorCQkJUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKHBBZCwgQkJQX1IyNSwgMHg5MCk7CisKKwkJCS8vV2UgbmVlZCB0byB3YWl0IGZvciBjYWxpYnJhdGlvbgorCQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKwkJCVJUVVNCUmVhZEJCUFJlZ2lzdGVyKHBBZCwgQkJQX1I1NSwgJnZhbHVlKTsKKwkJCXZhbHVlICY9IDB4RkY7CisJCQlpZiAoKFI1NXggLSB2YWx1ZSkgPCBGaWx0ZXJUYXJnZXQpCisJCQl7CisJCQkJUkZfUjI0X1ZhbHVlICsrOworCQkJfQorCQkJZWxzZSBpZiAoKFI1NXggLSB2YWx1ZSkgPT0gRmlsdGVyVGFyZ2V0KQorCQkJeworCQkJCVJGX1IyNF9WYWx1ZSArKzsKKwkJCQljb3VudCArKzsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLy8gcHJldmVudCBpbmZpbml0ZSBsb29wIGNhdXNlIGRyaXZlciBoYW5nLgorCQkJaWYgKGxvb3BjbnQrKyA+IDEwMCkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVFVTQkZpbHRlckNhbGlicmF0aW9uIC0gY2FuJ3QgZmluZCBhIHZhbGlkIHZhbHVlLCBsb29wY250PSVkIHN0b3AgY2FsaWJyYXRpbmciLCBsb29wY250KSk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8vIFdyaXRlIFJGX1IyNCB0byBwcm9ncmFtIGZpbHRlcgorCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI0LCBSRl9SMjRfVmFsdWUpOworCQl9CisKKwkJaWYgKGNvdW50ID4gMCkKKwkJeworCQkJUkZfUjI0X1ZhbHVlID0gUkZfUjI0X1ZhbHVlIC0gKChjb3VudCkgPyAoMSkgOiAoMCkpOworCQl9CisKKwkJLy8gU3RvcmUgZm9yIGZ1dHVyZSB1c2FnZQorCQlpZiAobG9vcGNudCA8IDEwMCkKKwkJeworCQkJaWYgKGxvb3ArKyA9PSAwKQorCQkJeworCQkJCS8vQmFuZFdpZHRoID0gMjAgTUh6CisJCQkJcEFkLT5NbG1lLkNhbGlCVzIwUmZSMjQgPSAoVUNIQVIpUkZfUjI0X1ZhbHVlOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vQmFuZFdpZHRoID0gNDAgTUh6CisJCQkJcEFkLT5NbG1lLkNhbGlCVzQwUmZSMjQgPSAoVUNIQVIpUkZfUjI0X1ZhbHVlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWVsc2UKKwkJCWJyZWFrOworCisJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNCwgUkZfUjI0X1ZhbHVlKTsKKworCQkvLyByZXNldCBjb3VudAorCQljb3VudCA9IDA7CisJfSB3aGlsZShUUlVFKTsKKworCS8vCisJLy8gU2V0IGJhY2sgdG8gaW5pdGlhbCBzdGF0ZQorCS8vCisJUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKHBBZCwgQkJQX1IyNCwgMCk7CisKKwlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMiwgJnZhbHVlKTsKKwl2YWx1ZSAmPSB+KDB4MDEpOworCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyMiwgdmFsdWUpOworCisJLy8gc2V0IEJCUCBiYWNrIHRvIEJXMjAKKwlSVFVTQlJlYWRCQlBSZWdpc3RlcihwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKKwlCQlBWYWx1ZSY9ICh+MHgxOCk7CisJUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVFVTQkZpbHRlckNhbGlicmF0aW9uIC0gQ2FsaUJXMjBSZlIyND0weCV4LCBDYWxpQlc0MFJmUjI0PTB4JXhcbiIsIHBBZC0+TWxtZS5DYWxpQlcyMFJmUjI0LCBwQWQtPk1sbWUuQ2FsaUJXNDBSZlIyNCkpOworfQorCisKK1ZPSUQgTklDSW5pdFJUMzB4eFJGUmVnaXN0ZXJzKElOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCUlOVCBpOworCS8vIERyaXZlciBtdXN0IHJlYWQgRUVQUk9NIHRvIGdldCBSZkljVHlwZSBiZWZvcmUgaW5pdGlhbCBSRiByZWdpc3RlcnMKKwkvLyBJbml0aWFsaXplIFJGIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUKKyAgICAgICAgaWYgKElTX1JUMzA3MChwQWQpICYmICgocEFkLT5SZkljVHlwZSA9PSBSRklDXzMwMjApIHx8KHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18yMDIwKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBJbml0IFJGIGNhbGlicmF0aW9uCisgICAgICAgICAgICAgICAgLy8gRHJpdmVyIHNob3VsZCB0b2dnbGUgUkYgUjMwIGJpdDcgYmVmb3JlIGluaXQgUkYgcmVnaXN0ZXJzCisgICAgICAgICAgICAgICAgVUxPTkcgUmZSZWcgPSAwOworICAgICAgICAgICAgICAgIFJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjMwLCAoUFVDSEFSKSZSZlJlZyk7CisgICAgICAgICAgICAgICAgUmZSZWcgfD0gMHg4MDsKKyAgICAgICAgICAgICAgICBSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMzAsIChVQ0hBUilSZlJlZyk7CisgICAgICAgICAgICAgICAgUlRNUHVzZWNEZWxheSgxMDAwKTsKKyAgICAgICAgICAgICAgICBSZlJlZyAmPSAweDdGOworICAgICAgICAgICAgICAgIFJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IzMCwgKFVDSEFSKVJmUmVnKTsKKworICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgUkYgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQorICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fUkZfUkVHX1BBUk1TOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUlQzMHh4X1JGUmVnVGFibGVbaV0uUmVnaXN0ZXIsIFJUMzB4eF9SRlJlZ1RhYmxlW2ldLlZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvL0ZvciBSRiBmaWx0ZXIgQ2FsaWJyYXRpb24KKyAgICAgICAgICAgICAgICBSVFVTQkZpbHRlckNhbGlicmF0aW9uKHBBZCk7CisgICAgICAgIH0KKworfQorI2VuZGlmIC8vIFJUMjg3MCAvLworCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlSZWFkIGluaXRpYWwgcGFyYW1ldGVycyBmcm9tIEVFUFJPTQorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJTklDUmVhZEVFUFJPTVBhcmFtZXRlcnMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJbWFjX2FkZHIpCit7CisJVUlOVDMyCQkJZGF0YSA9IDA7CisJVVNIT1JUCQkJaSwgdmFsdWUsIHZhbHVlMjsKKwlVQ0hBUgkJCVRtcFBoeTsKKwlFRVBST01fVFhfUFdSX1NUUlVDCSAgICBQb3dlcjsKKwlFRVBST01fVkVSU0lPTl9TVFJVQyAgICBWZXJzaW9uOworCUVFUFJPTV9BTlRFTk5BX1NUUlVDCUFudGVubmE7CisJRUVQUk9NX05JQ19DT05GSUcyX1NUUlVDICAgIE5pY0NvbmZpZzI7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gTklDUmVhZEVFUFJPTVBhcmFtZXRlcnNcbiIpKTsKKworCS8vIEluaXQgRUVQUk9NIEFkZHJlc3MgTnVtYmVyLCBiZWZvcmUgYWNjZXNzIEVFUFJPTTsgaWYgOTNjNDYsIEVFUFJPTUFkZHJlc3NOdW09NiwgZWxzZSBpZiA5M2M2NiwgRUVQUk9NQWRkcmVzc051bT04CisJUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmZGF0YSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IEUyUFJPTV9DU1IgPSAweCV4XG4iLCBkYXRhKSk7CisKKwlpZigoZGF0YSAmIDB4MzApID09IDApCisJCXBBZC0+RUVQUk9NQWRkcmVzc051bSA9IDY7CQkvLyA5M0M0NgorCWVsc2UgaWYoKGRhdGEgJiAweDMwKSA9PSAweDEwKQorCQlwQWQtPkVFUFJPTUFkZHJlc3NOdW0gPSA4OyAgICAgLy8gOTNDNjYKKwllbHNlCisJCXBBZC0+RUVQUk9NQWRkcmVzc051bSA9IDg7ICAgICAvLyA5M0M4NgorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBFRVBST01BZGRyZXNzTnVtID0gJWRcbiIsIHBBZC0+RUVQUk9NQWRkcmVzc051bSApKTsKKworCS8vIFJUMjg2MCBNQUMgbm8gbG9uZ2VyIGF1dG8gbG9hZCBNQUMgYWRkcmVzcyBmcm9tIEUyUFJPTS4gRHJpdmVyIGhhcyB0byBpbnRpYWxpemUKKwkvLyBNQUMgYWRkcmVzcyByZWdpc3RlcnMgYWNjb3JkaW5nIHRvIEUyUFJPTSBzZXR0aW5nCisJaWYgKG1hY19hZGRyID09IE5VTEwgfHwKKwkJc3RybGVuKG1hY19hZGRyKSAhPSAxNyB8fAorCQltYWNfYWRkclsyXSAhPSAnOicgIHx8IG1hY19hZGRyWzVdICE9ICc6JyAgfHwgbWFjX2FkZHJbOF0gIT0gJzonIHx8CisJCW1hY19hZGRyWzExXSAhPSAnOicgfHwgbWFjX2FkZHJbMTRdICE9ICc6JykKKwl7CisJCVVTSE9SVCAgQWRkcjAxLEFkZHIyMyxBZGRyNDUgOworCisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHgwNCwgQWRkcjAxKTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDA2LCBBZGRyMjMpOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MDgsIEFkZHI0NSk7CisKKwkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzBdID0gKFVDSEFSKShBZGRyMDEgJiAweGZmKTsKKwkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzFdID0gKFVDSEFSKShBZGRyMDEgPj4gOCk7CisJCXBBZC0+UGVybWFuZW50QWRkcmVzc1syXSA9IChVQ0hBUikoQWRkcjIzICYgMHhmZik7CisJCXBBZC0+UGVybWFuZW50QWRkcmVzc1szXSA9IChVQ0hBUikoQWRkcjIzID4+IDgpOworCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbNF0gPSAoVUNIQVIpKEFkZHI0NSAmIDB4ZmYpOworCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbNV0gPSAoVUNIQVIpKEFkZHI0NSA+PiA4KTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJbml0aWFsaXplIE1BQyBBZGRyZXNzIGZyb20gRTJQUk9NIFxuIikpOworCX0KKwllbHNlCisJeworCQlJTlQJCWo7CisJCVBVQ0hBUgltYWNwdHI7CisKKwkJbWFjcHRyID0gbWFjX2FkZHI7CisKKwkJZm9yIChqPTA7IGo8TUFDX0FERFJfTEVOOyBqKyspCisJCXsKKwkJCUF0b0gobWFjcHRyLCAmcEFkLT5QZXJtYW5lbnRBZGRyZXNzW2pdLCAxKTsKKwkJCW1hY3B0cj1tYWNwdHIrMzsKKwkJfQorCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkluaXRpYWxpemUgTUFDIEFkZHJlc3MgZnJvbSBtb2R1bGUgcGFyYW1ldGVyIFxuIikpOworCX0KKworCisJeworI2lmIDAKKwkJVVNIT1JUICBBZGRyMDEsQWRkcjIzLEFkZHI0NSA7CisKKwkJQWRkcjAxPVJUTVBfRUVQUk9NX1JFQUQxNihwQWQsIDB4MDQpOworCQlBZGRyMjM9UlRNUF9FRVBST01fUkVBRDE2KHBBZCwgMHgwNik7CisJCUFkZHI0NT1SVE1QX0VFUFJPTV9SRUFEMTYocEFkLCAweDA4KTsKKworCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMF0gPSAoVUNIQVIpKEFkZHIwMSAmIDB4ZmYpOworCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMV0gPSAoVUNIQVIpKEFkZHIwMSA+PiA4KTsKKwkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzJdID0gKFVDSEFSKShBZGRyMjMgJiAweGZmKTsKKwkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzNdID0gKFVDSEFSKShBZGRyMjMgPj4gOCk7CisJCXBBZC0+UGVybWFuZW50QWRkcmVzc1s0XSA9IChVQ0hBUikoQWRkcjQ1ICYgMHhmZik7CisJCXBBZC0+UGVybWFuZW50QWRkcmVzc1s1XSA9IChVQ0hBUikoQWRkcjQ1ID4+IDgpOworI2VuZGlmCisJCS8vbW9yZSBjb252ZW5pbmV0IHRvIHRlc3QgbWJzc2lkLCBzbyBhcCdzIGJzc2lkICYweGYxCisJCWlmIChwQWQtPlBlcm1hbmVudEFkZHJlc3NbMF0gPT0gMHhmZikKKwkJCXBBZC0+UGVybWFuZW50QWRkcmVzc1swXSA9IFJhbmRvbUJ5dGUocEFkKSYweGY4OworCisJCS8vaWYgKHBBZC0+UGVybWFuZW50QWRkcmVzc1s1XSA9PSAweGZmKQorCQkvLwlwQWQtPlBlcm1hbmVudEFkZHJlc3NbNV0gPSBSYW5kb21CeXRlKHBBZCkmMHhmODsKKworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJFMlBST00gTUFDOiA9JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMF0sIHBBZC0+UGVybWFuZW50QWRkcmVzc1sxXSwKKwkJCXBBZC0+UGVybWFuZW50QWRkcmVzc1syXSwgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzNdLAorCQkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzRdLCBwQWQtPlBlcm1hbmVudEFkZHJlc3NbNV0pKTsKKwkJaWYgKHBBZC0+YkxvY2FsQWRtaW5NQUMgPT0gRkFMU0UpCisJCXsKKwkJCU1BQ19EVzBfU1RSVUMgY3NyMjsKKwkJCU1BQ19EVzFfU1RSVUMgY3NyMzsKKwkJCUNPUFlfTUFDX0FERFIocEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5QZXJtYW5lbnRBZGRyZXNzKTsKKwkJCWNzcjIuZmllbGQuQnl0ZTAgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzBdOworCQkJY3NyMi5maWVsZC5CeXRlMSA9IHBBZC0+Q3VycmVudEFkZHJlc3NbMV07CisJCQljc3IyLmZpZWxkLkJ5dGUyID0gcEFkLT5DdXJyZW50QWRkcmVzc1syXTsKKwkJCWNzcjIuZmllbGQuQnl0ZTMgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzNdOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0FERFJfRFcwLCBjc3IyLndvcmQpOworCQkJY3NyMy53b3JkID0gMDsKKwkJCWNzcjMuZmllbGQuQnl0ZTQgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzRdOworCQkJY3NyMy5maWVsZC5CeXRlNSA9IHBBZC0+Q3VycmVudEFkZHJlc3NbNV07CisJCQljc3IzLmZpZWxkLlUyTWVNYXNrID0gMHhmZjsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19BRERSX0RXMSwgY3NyMy53b3JkKTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIkUyUFJPTSBNQUM6ID0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMF0sIHBBZC0+UGVybWFuZW50QWRkcmVzc1sxXSwKKwkJCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMl0sIHBBZC0+UGVybWFuZW50QWRkcmVzc1szXSwKKwkJCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbNF0sIHBBZC0+UGVybWFuZW50QWRkcmVzc1s1XSkpOworCQl9CisJfQorCisJLy8gaWYgbm90IHJldHVybiBlYXJseS4gY2F1c2UgZmFpbCBhdCBlbXVsYXRpb24uCisJLy8gSW5pdCB0aGUgY2hhbm5lbCBudW1iZXIgZm9yIFRYIGNoYW5uZWwgcG93ZXIKKwlSVE1QUmVhZENoYW5uZWxQd3IocEFkKTsKKworCS8vIGlmIEUyUFJPTSB2ZXJzaW9uIG1pc21hdGNoIHdpdGggZHJpdmVyJ3MgZXhwZWN0YXRpb24sIHRoZW4gc2tpcAorCS8vIGFsbCBzdWJzZXF1ZW50IEUyUlBPTSByZXRpZXZhbCBhbmQgc2V0IGEgc3lzdGVtIGVycm9yIGJpdCB0byBub3RpZnkgR1VJCisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVkVSU0lPTl9PRkZTRVQsIFZlcnNpb24ud29yZCk7CisJcEFkLT5FZXByb21WZXJzaW9uID0gVmVyc2lvbi5maWVsZC5WZXJzaW9uICsgVmVyc2lvbi5maWVsZC5GYWVSZWxlYXNlTnVtYmVyICogMjU2OworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkUyUFJPTTogVmVyc2lvbiA9ICVkLCBGQUUgcmVsZWFzZSAjJWRcbiIsIFZlcnNpb24uZmllbGQuVmVyc2lvbiwgVmVyc2lvbi5maWVsZC5GYWVSZWxlYXNlTnVtYmVyKSk7CisKKwlpZiAoVmVyc2lvbi5maWVsZC5WZXJzaW9uID4gVkFMSURfRUVQUk9NX1ZFUlNJT04pCisJeworCQlEQkdQUklOVF9FUlIoKCJFMlBST006IFdST05HIFZFUlNJT04gMHgleCwgc2hvdWxkIGJlICVkXG4iLFZlcnNpb24uZmllbGQuVmVyc2lvbiwgVkFMSURfRUVQUk9NX1ZFUlNJT04pKTsKKwkJLypwQWQtPlN5c3RlbUVycm9yQml0bWFwIHw9IDB4MDAwMDAwMDE7CisKKwkJLy8gaGFyZC1jb2RlIGRlZmF1bHQgdmFsdWUgd2hlbiBubyBwcm9wZXIgRTJQUk9NIGluc3RhbGxlZAorCQlwQWQtPmJBdXRvVHhBZ2NBID0gRkFMU0U7CisJCXBBZC0+YkF1dG9UeEFnY0cgPSBGQUxTRTsKKworCQkvLyBEZWZhdWx0IHRoZSBjaGFubmVsIHBvd2VyCisJCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX09GX0NIQU5ORUxTOyBpKyspCisJCQlwQWQtPlR4UG93ZXJbaV0uUG93ZXIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCisJCS8vIERlZmF1bHQgdGhlIGNoYW5uZWwgcG93ZXIKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fT0ZfMTFKQ0hBTk5FTFM7IGkrKykKKwkJCXBBZC0+VHhQb3dlcjExSltpXS5Qb3dlciA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisKKwkJZm9yKGkgPSAwOyBpIDwgTlVNX0VFUFJPTV9CQlBfUEFSTVM7IGkrKykKKwkJCXBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlW2ldID0gMHhmZmZmOworCQlyZXR1cm47ICAqLworCX0KKworCS8vIFJlYWQgQkJQIGRlZmF1bHQgdmFsdWUgZnJvbSBFRVBST00gYW5kIHN0b3JlIHRvIGFycmF5KEVFUFJPTURlZmF1bHRWYWx1ZSkgaW4gcEFkCisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTklDMV9PRkZTRVQsIHZhbHVlKTsKKwlwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVswXSA9IHZhbHVlOworCisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTklDMl9PRkZTRVQsIHZhbHVlKTsKKwlwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVsxXSA9IHZhbHVlOworCisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDM4LCB2YWx1ZSk7CS8vIENvdW50cnkgUmVnaW9uCisJcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMl0gPSB2YWx1ZTsKKworCWZvcihpID0gMDsgaSA8IDg7IGkrKykKKwl7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0JCUF9CQVNFX09GRlNFVCArIGkqMiwgdmFsdWUpOworCQlwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpKzNdID0gdmFsdWU7CisJfQorCisJLy8gV2UgaGF2ZSB0byBwYXJzZSBOSUMgY29uZmlndXJhdGlvbiAwIGF0IGhlcmUuCisJLy8gSWYgVFNTSSBkaWQgbm90IGhhdmUgcHJlbG9hZGVkIHZhbHVlLCBpdCBzaG91bGQgcmVzZXQgdGhlIFR4QXV0b0FnYyB0byBmYWxzZQorCS8vIFRoZXJlZm9yZSwgd2UgaGF2ZSB0byByZWFkIFR4QXV0b0FnYyBjb250cm9sIGJlZm9yZWhhbmQuCisJLy8gUmVhZCBUeCBBR0MgY29udHJvbCBiaXQKKwlBbnRlbm5hLndvcmQgPSBwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVswXTsKKwlpZiAoQW50ZW5uYS53b3JkID09IDB4RkZGRikKKwl7CisJCUFudGVubmEud29yZCA9IDA7CisJCUFudGVubmEuZmllbGQuUmZJY1R5cGUgPSBSRklDXzI4MjA7CisJCUFudGVubmEuZmllbGQuVHhQYXRoID0gMTsKKwkJQW50ZW5uYS5maWVsZC5SeFBhdGggPSAyOworCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIkUyUFJPTSBlcnJvciwgaGFyZCBjb2RlIGFzIDB4JTA0eFxuIiwgQW50ZW5uYS53b3JkKSk7CisJfQorCisJLy8gQ2hvb3NlIHRoZSBkZXNpcmVkIFR4JlJ4IHN0cmVhbS4KKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDApIHx8IChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA+IEFudGVubmEuZmllbGQuVHhQYXRoKSkKKwkJcEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPSBBbnRlbm5hLmZpZWxkLlR4UGF0aDsKKworCWlmICgocEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPT0gMCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID4gQW50ZW5uYS5maWVsZC5SeFBhdGgpKQorCXsKKwkJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSBBbnRlbm5hLmZpZWxkLlJ4UGF0aDsKKworCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiA8IFJBTElOS18yODgzX1ZFUlNJT04pICYmCisJCQkocEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPiAyKSkKKwkJeworCQkJLy8gb25seSAyIFJ4IHN0cmVhbXMgZm9yIFJUMjg2MCBzZXJpZXMKKwkJCXBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID0gMjsKKwkJfQorCX0KKworCS8vIDMqMworCS8vIHJlYWQgdmFsdWUgZnJvbSBFRVBST00gYW5kIHNldCB0aGVtIHRvIENTUjE3NCB+IDE3NyBpbiBjaGFpbjAgfiBjaGFpbjIKKwkvLyB5ZXQgaW1wbGVtZW50CisJZm9yKGk9MDsgaTwzOyBpKyspCisJeworCX0KKworCU5pY0NvbmZpZzIud29yZCA9IHBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlWzFdOworCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlOaWNDb25maWcyLndvcmQgPSAwOworCQlpZiAoKE5pY0NvbmZpZzIud29yZCAmIDB4MDBmZikgPT0gMHhmZikKKwkJeworCQkJTmljQ29uZmlnMi53b3JkICY9IDB4ZmYwMDsKKwkJfQorCisJCWlmICgoTmljQ29uZmlnMi53b3JkID4+IDgpID09IDB4ZmYpCisJCXsKKwkJCU5pY0NvbmZpZzIud29yZCAmPSAweDAwZmY7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlpZiAoTmljQ29uZmlnMi5maWVsZC5EeW5hbWljVHhBZ2NDb250cm9sID09IDEpCisJCXBBZC0+YkF1dG9UeEFnY0EgPSBwQWQtPmJBdXRvVHhBZ2NHID0gVFJVRTsKKwllbHNlCisJCXBBZC0+YkF1dG9UeEFnY0EgPSBwQWQtPmJBdXRvVHhBZ2NHID0gRkFMU0U7CisKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiTklDUmVhZEVFUFJPTVBhcmFtZXRlcnM6IFJ4UGF0aCA9ICVkLCBUeFBhdGggPSAlZFxuIiwgQW50ZW5uYS5maWVsZC5SeFBhdGgsIEFudGVubmEuZmllbGQuVHhQYXRoKSk7CisKKwkvLyBTYXZlIHRoZSBhbnRlbm5hIGZvciBmdXR1cmUgdXNlCisJcEFkLT5BbnRlbm5hLndvcmQgPSBBbnRlbm5hLndvcmQ7CisKKwkvLworCS8vIFJlc2V0IFBoeU1vZGUgaWYgd2UgZG9uJ3Qgc3VwcG9ydCA4MDIuMTFhCisJLy8gT25seSBSRklDXzI4NTAgJiBSRklDXzI3NTAgc3VwcG9ydCA4MDIuMTFhCisJLy8KKwlpZiAoKEFudGVubmEuZmllbGQuUmZJY1R5cGUgIT0gUkZJQ18yODUwKSAmJiAoQW50ZW5uYS5maWVsZC5SZkljVHlwZSAhPSBSRklDXzI3NTApKQorCXsKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFCR19NSVhFRCkgfHwKKwkJCShwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUEpKQorCQkJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IFBIWV8xMUJHX01JWEVEOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQllbHNlIGlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdOX01JWEVEKQl8fAorCQkJCSAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBTl9NSVhFRCkgCXx8CisJCQkJIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFHTl9NSVhFRCkgCXx8CisJCQkJIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fNUcpKQorCQkJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IFBIWV8xMUJHTl9NSVhFRDsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwl9CisKKwkvLyBSZWFkIFRTU0kgcmVmZXJlbmNlIGFuZCBUU1NJIGJvdW5kYXJ5IGZvciB0ZW1wZXJhdHVyZSBjb21wZW5zYXRpb24uIFRoaXMgaXMgdWdseQorCS8vIDAuIDExYi9nCisJeworCQkvKiB0aGVzZSBhcmUgdGVtcGF0dXJlIHJlZmVyZW5jZSB2YWx1ZSAoMHgwMCB+IDB4RkUpCisJCSAgIGV4OiAweDAwIDB4MTUgMHgyNSAweDQ1IDB4ODggMHhBMCAweEI1IDB4RDAgMHhGMAorCQkgICBUc3NpUGx1c0JvdW5kYXJ5RyBbNF0gWzNdIFsyXSBbMV0gWzBdIChzbWFsbGVyKSArCisJCSAgIFRzc2lNaW51c0JvdW5kYXJ5R1swXSBbMV0gWzJdIFszXSBbNF0gKGxhcmdlcikgKi8KKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDZFLCBQb3dlci53b3JkKTsKKwkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbNF0gPSBQb3dlci5maWVsZC5CeXRlMDsKKwkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbM10gPSBQb3dlci5maWVsZC5CeXRlMTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDcwLCBQb3dlci53b3JkKTsKKwkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbMl0gPSBQb3dlci5maWVsZC5CeXRlMDsKKwkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbMV0gPSBQb3dlci5maWVsZC5CeXRlMTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDcyLCBQb3dlci53b3JkKTsKKwkJcEFkLT5Uc3NpUmVmRyAgID0gUG93ZXIuZmllbGQuQnl0ZTA7IC8qIHJlZmVyZW5jZSB2YWx1ZSBbMF0gKi8KKwkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1sxXSA9IFBvd2VyLmZpZWxkLkJ5dGUxOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4NzQsIFBvd2VyLndvcmQpOworCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzJdID0gUG93ZXIuZmllbGQuQnl0ZTA7CisJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbM10gPSBQb3dlci5maWVsZC5CeXRlMTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDc2LCBQb3dlci53b3JkKTsKKwkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1s0XSA9IFBvd2VyLmZpZWxkLkJ5dGUwOworCQlwQWQtPlR4QWdjU3RlcEcgPSBQb3dlci5maWVsZC5CeXRlMTsKKwkJcEFkLT5UeEFnY0NvbXBlbnNhdGVHID0gMDsKKwkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbMF0gPSBwQWQtPlRzc2lSZWZHOworCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzBdICA9IHBBZC0+VHNzaVJlZkc7CisKKwkJLy8gRGlzYWJsZSBUeEFnYyBpZiB0aGUgYmFzZWQgdmFsdWUgaXMgbm90IHJpZ2h0CisJCWlmIChwQWQtPlRzc2lSZWZHID09IDB4ZmYpCisJCQlwQWQtPmJBdXRvVHhBZ2NHID0gRkFMU0U7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJFMlBST006IEcgVHNzaVstNCAuLiArNF0gPSAlZCAlZCAlZCAlZCAtICVkIC0lZCAlZCAlZCAlZCwgc3RlcD0lZCwgdHVuaW5nPSVkXG4iLAorCQkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbNF0sIHBBZC0+VHNzaU1pbnVzQm91bmRhcnlHWzNdLCBwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1syXSwgcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbMV0sCisJCQlwQWQtPlRzc2lSZWZHLAorCQkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1sxXSwgcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1syXSwgcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1szXSwgcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1s0XSwKKwkJCXBBZC0+VHhBZ2NTdGVwRywgcEFkLT5iQXV0b1R4QWdjRykpOworCX0KKwkvLyAxLiAxMWEKKwl7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHhENCwgUG93ZXIud29yZCk7CisJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzRdID0gUG93ZXIuZmllbGQuQnl0ZTA7CisJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzNdID0gUG93ZXIuZmllbGQuQnl0ZTE7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHhENiwgUG93ZXIud29yZCk7CisJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzJdID0gUG93ZXIuZmllbGQuQnl0ZTA7CisJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzFdID0gUG93ZXIuZmllbGQuQnl0ZTE7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHhEOCwgUG93ZXIud29yZCk7CisJCXBBZC0+VHNzaVJlZkEgICA9IFBvd2VyLmZpZWxkLkJ5dGUwOworCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzFdID0gUG93ZXIuZmllbGQuQnl0ZTE7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHhEQSwgUG93ZXIud29yZCk7CisJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMl0gPSBQb3dlci5maWVsZC5CeXRlMDsKKwkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVszXSA9IFBvd2VyLmZpZWxkLkJ5dGUxOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4REMsIFBvd2VyLndvcmQpOworCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzRdID0gUG93ZXIuZmllbGQuQnl0ZTA7CisJCXBBZC0+VHhBZ2NTdGVwQSA9IFBvd2VyLmZpZWxkLkJ5dGUxOworCQlwQWQtPlR4QWdjQ29tcGVuc2F0ZUEgPSAwOworCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVswXSA9IHBBZC0+VHNzaVJlZkE7CisJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMF0gID0gcEFkLT5Uc3NpUmVmQTsKKworCQkvLyBEaXNhYmxlIFR4QWdjIGlmIHRoZSBiYXNlZCB2YWx1ZSBpcyBub3QgcmlnaHQKKwkJaWYgKHBBZC0+VHNzaVJlZkEgPT0gMHhmZikKKwkJCXBBZC0+YkF1dG9UeEFnY0EgPSBGQUxTRTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkUyUFJPTTogQSBUc3NpWy00IC4uICs0XSA9ICVkICVkICVkICVkIC0gJWQgLSVkICVkICVkICVkLCBzdGVwPSVkLCB0dW5pbmc9JWRcbiIsCisJCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVs0XSwgcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbM10sIHBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzJdLCBwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVsxXSwKKwkJCXBBZC0+VHNzaVJlZkEsCisJCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzFdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzJdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzNdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzRdLAorCQkJcEFkLT5UeEFnY1N0ZXBBLCBwQWQtPmJBdXRvVHhBZ2NBKSk7CisJfQorCXBBZC0+QmJwUnNzaVRvRGJtRGVsdGEgPSAweDA7CisKKwkvLyBSZWFkIGZyZXF1ZW5jeSBvZmZzZXQgc2V0dGluZyBmb3IgUkYKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9GUkVRX09GRlNFVCwgdmFsdWUpOworCWlmICgodmFsdWUgJiAweDAwRkYpICE9IDB4MDBGRikKKwkJcEFkLT5SZkZyZXFPZmZzZXQgPSAoVUxPTkcpICh2YWx1ZSAmIDB4MDBGRik7CisJZWxzZQorCQlwQWQtPlJmRnJlcU9mZnNldCA9IDA7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRTJQUk9NOiBSRiBGcmVxT2Zmc2V0PTB4JWx4IFxuIiwgcEFkLT5SZkZyZXFPZmZzZXQpKTsKKworCS8vQ291bnRyeVJlZ2lvbiBieXRlIG9mZnNldCAoMzhoKQorCXZhbHVlID0gcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMl0gPj4gODsJCS8vIDIuNEcgYmFuZAorCXZhbHVlMiA9IHBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlWzJdICYgMHgwMEZGOwkvLyA1RyBiYW5kCisKKwlpZiAoKHZhbHVlIDw9IFJFR0lPTl9NQVhJTVVNX0JHX0JBTkQpICYmICh2YWx1ZTIgPD0gUkVHSU9OX01BWElNVU1fQV9CQU5EKSkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gPSAoKFVDSEFSKSB2YWx1ZSkgfCAweDgwOworCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQgPSAoKFVDSEFSKSB2YWx1ZTIpIHwgMHg4MDsKKwkJVG1wUGh5ID0gcEFkLT5Db21tb25DZmcuUGh5TW9kZTsKKwkJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IDB4ZmY7CisJCVJUTVBTZXRQaHlNb2RlKHBBZCwgVG1wUGh5KTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJU2V0Q29tbW9uSFQocEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwl9CisKKwkvLworCS8vIEdldCBSU1NJIE9mZnNldCBvbiBFRVBST00gMHg5QWggJiAweDlDaC4KKwkvLyBUaGUgdmFsaWQgdmFsdWUgYXJlICgtMTAgfiAxMCkKKwkvLworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1JTU0lfQkdfT0ZGU0VULCB2YWx1ZSk7CisJcEFkLT5CR1Jzc2lPZmZzZXQwID0gdmFsdWUgJiAweDAwZmY7CisJcEFkLT5CR1Jzc2lPZmZzZXQxID0gKHZhbHVlID4+IDgpOworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1JTU0lfQkdfT0ZGU0VUKzIsIHZhbHVlKTsKKwlwQWQtPkJHUnNzaU9mZnNldDIgPSB2YWx1ZSAmIDB4MDBmZjsKKwlwQWQtPkFMTkFHYWluMSA9ICh2YWx1ZSA+PiA4KTsKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9MTkFfT0ZGU0VULCB2YWx1ZSk7CisJcEFkLT5CTE5BR2FpbiA9IHZhbHVlICYgMHgwMGZmOworCXBBZC0+QUxOQUdhaW4wID0gKHZhbHVlID4+IDgpOworCisJLy8gVmFsaWRhdGUgMTFiL2cgUlNTSV8wIG9mZnNldC4KKwlpZiAoKHBBZC0+QkdSc3NpT2Zmc2V0MCA8IC0xMCkgfHwgKHBBZC0+QkdSc3NpT2Zmc2V0MCA+IDEwKSkKKwkJcEFkLT5CR1Jzc2lPZmZzZXQwID0gMDsKKworCS8vIFZhbGlkYXRlIDExYi9nIFJTU0lfMSBvZmZzZXQuCisJaWYgKChwQWQtPkJHUnNzaU9mZnNldDEgPCAtMTApIHx8IChwQWQtPkJHUnNzaU9mZnNldDEgPiAxMCkpCisJCXBBZC0+QkdSc3NpT2Zmc2V0MSA9IDA7CisKKwkvLyBWYWxpZGF0ZSAxMWIvZyBSU1NJXzIgb2Zmc2V0LgorCWlmICgocEFkLT5CR1Jzc2lPZmZzZXQyIDwgLTEwKSB8fCAocEFkLT5CR1Jzc2lPZmZzZXQyID4gMTApKQorCQlwQWQtPkJHUnNzaU9mZnNldDIgPSAwOworCisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fUlNTSV9BX09GRlNFVCwgdmFsdWUpOworCXBBZC0+QVJzc2lPZmZzZXQwID0gdmFsdWUgJiAweDAwZmY7CisJcEFkLT5BUnNzaU9mZnNldDEgPSAodmFsdWUgPj4gOCk7CisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAoRUVQUk9NX1JTU0lfQV9PRkZTRVQrMiksIHZhbHVlKTsKKwlwQWQtPkFSc3NpT2Zmc2V0MiA9IHZhbHVlICYgMHgwMGZmOworCXBBZC0+QUxOQUdhaW4yID0gKHZhbHVlID4+IDgpOworCisJaWYgKCgoVUNIQVIpcEFkLT5BTE5BR2FpbjEgPT0gMHhGRikgfHwgKHBBZC0+QUxOQUdhaW4xID09IDB4MDApKQorCQlwQWQtPkFMTkFHYWluMSA9IHBBZC0+QUxOQUdhaW4wOworCWlmICgoKFVDSEFSKXBBZC0+QUxOQUdhaW4yID09IDB4RkYpIHx8IChwQWQtPkFMTkFHYWluMiA9PSAweDAwKSkKKwkJcEFkLT5BTE5BR2FpbjIgPSBwQWQtPkFMTkFHYWluMDsKKworCS8vIFZhbGlkYXRlIDExYSBSU1NJXzAgb2Zmc2V0LgorCWlmICgocEFkLT5BUnNzaU9mZnNldDAgPCAtMTApIHx8IChwQWQtPkFSc3NpT2Zmc2V0MCA+IDEwKSkKKwkJcEFkLT5BUnNzaU9mZnNldDAgPSAwOworCisJLy8gVmFsaWRhdGUgMTFhIFJTU0lfMSBvZmZzZXQuCisJaWYgKChwQWQtPkFSc3NpT2Zmc2V0MSA8IC0xMCkgfHwgKHBBZC0+QVJzc2lPZmZzZXQxID4gMTApKQorCQlwQWQtPkFSc3NpT2Zmc2V0MSA9IDA7CisKKwkvL1ZhbGlkYXRlIDExYSBSU1NJXzIgb2Zmc2V0LgorCWlmICgocEFkLT5BUnNzaU9mZnNldDIgPCAtMTApIHx8IChwQWQtPkFSc3NpT2Zmc2V0MiA+IDEwKSkKKwkJcEFkLT5BUnNzaU9mZnNldDIgPSAwOworCisJLy8KKwkvLyBHZXQgTEVEIFNldHRpbmcuCisJLy8KKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4M2EsIHZhbHVlKTsKKwlwQWQtPkxlZENudGwud29yZCA9ICh2YWx1ZSYweGZmMDApID4+IDg7CisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTEVEMV9PRkZTRVQsIHZhbHVlKTsKKwlwQWQtPkxlZDEgPSB2YWx1ZTsKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9MRUQyX09GRlNFVCwgdmFsdWUpOworCXBBZC0+TGVkMiA9IHZhbHVlOworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0xFRDNfT0ZGU0VULCB2YWx1ZSk7CisJcEFkLT5MZWQzID0gdmFsdWU7CisKKwlSVE1QUmVhZFR4UHdyUGVyUmF0ZShwQWQpOworCisjaWZkZWYgU0lOR0xFX1NLVQorCS8vcEFkLT5Db21tb25DZmcuRGVmaW5lTWF4VHhQd3IgPSBSVE1QX0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fREVGSU5FX01BWF9UWFBXUik7CisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fREVGSU5FX01BWF9UWFBXUiwgcEFkLT5Db21tb25DZmcuRGVmaW5lTWF4VHhQd3IpOworI2VuZGlmIC8vIFNJTkdMRV9TS1UgLy8KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBOSUNSZWFkRUVQUk9NUGFyYW1ldGVyc1xuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJU2V0IGRlZmF1bHQgdmFsdWUgZnJvbSBFRVBST00KKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECU5JQ0luaXRBc2ljRnJvbUVFUFJPTSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlVSU5UMzIJCQkJCWRhdGEgPSAwOworCVVDSEFSCUJCUFIxID0gMDsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwlVU0hPUlQJCQkJCWk7CisJRUVQUk9NX0FOVEVOTkFfU1RSVUMJQW50ZW5uYTsKKwlFRVBST01fTklDX0NPTkZJRzJfU1RSVUMgICAgTmljQ29uZmlnMjsKKwlVQ0hBUglCQlBSMyA9IDA7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gTklDSW5pdEFzaWNGcm9tRUVQUk9NXG4iKSk7CisJZm9yKGkgPSAzOyBpIDwgTlVNX0VFUFJPTV9CQlBfUEFSTVM7IGkrKykKKwl7CisJCVVDSEFSIEJicFJlZ0lkeCwgQmJwVmFsdWU7CisKKwkJaWYgKChwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpXSAhPSAweEZGRkYpICYmIChwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpXSAhPSAwKSkKKwkJeworCQkJQmJwUmVnSWR4ID0gKFVDSEFSKShwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpXSA+PiA4KTsKKwkJCUJicFZhbHVlICA9IChVQ0hBUikocEFkLT5FRVBST01EZWZhdWx0VmFsdWVbaV0gJiAweGZmKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCYnBSZWdJZHgsIEJicFZhbHVlKTsKKwkJfQorCX0KKworCUFudGVubmEud29yZCA9IHBBZC0+QW50ZW5uYS53b3JkOworCXBBZC0+TWxtZS5SZWFsUnhQYXRoID0gKFVDSEFSKSBBbnRlbm5hLmZpZWxkLlJ4UGF0aDsKKwlwQWQtPlJmSWNUeXBlID0gKFVDSEFSKSBBbnRlbm5hLmZpZWxkLlJmSWNUeXBlOworCisJTmljQ29uZmlnMi53b3JkID0gcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMV07CisKKworCS8vIFNhdmUgdGhlIGFudGVubmEgZm9yIGZ1dHVyZSB1c2UKKwlwQWQtPk5pY0NvbmZpZzIud29yZCA9IE5pY0NvbmZpZzIud29yZDsKKworCS8vCisJLy8gU2VuZCBMRUQgU2V0dGluZyB0byBNQ1UuCisJLy8KKwlpZiAocEFkLT5MZWRDbnRsLndvcmQgPT0gMHhGRikKKwl7CisJCXBBZC0+TGVkQ250bC53b3JkID0gMHgwMTsKKwkJcEFkLT5MZWQxID0gMHg1NTU1OworCQlwQWQtPkxlZDIgPSAweDIyMjE7CisKKyNpZmRlZiBSVDI4NzAKKwkJcEFkLT5MZWQzID0gMHg1NjI3OworI2VuZGlmIC8vIFJUMjg3MCAvLworCX0KKworCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MiwgMHhmZiwgKFVDSEFSKXBBZC0+TGVkMSwgKFVDSEFSKShwQWQtPkxlZDEgPj4gOCkpOworCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MywgMHhmZiwgKFVDSEFSKXBBZC0+TGVkMiwgKFVDSEFSKShwQWQtPkxlZDIgPj4gOCkpOworCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1NCwgMHhmZiwgKFVDSEFSKXBBZC0+TGVkMywgKFVDSEFSKShwQWQtPkxlZDMgPj4gOCkpOworICAgIHBBZC0+TGVkSW5kaWNhdG9yU3RyZWd0aCA9IDB4RkY7CisgICAgUlRNUFNldFNpZ25hbExFRChwQWQsIC0xMDApOwkvLyBGb3JjZSBzaWduYWwgc3RyZW5ndGggTGVkIHRvIGJlIHR1cm5lZCBvZmYsIGJlZm9yZSBsaW5rIHVwCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJLy8gUmVhZCBIYXJkd2FyZSBjb250cm9sbGVkIFJhZGlvIHN0YXRlIGVuYWJsZSBiaXQKKwkJaWYgKE5pY0NvbmZpZzIuZmllbGQuSGFyZHdhcmVSYWRpb0NvbnRyb2wgPT0gMSkKKwkJeworCQkJcEFkLT5TdGFDZmcuYkhhcmR3YXJlUmFkaW8gPSBUUlVFOworCisJCQkvLyBSZWFkIEdQSU8gcGluMiBhcyBIYXJkd2FyZSBjb250cm9sbGVkIHJhZGlvIHN0YXRlCisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIEdQSU9fQ1RSTF9DRkcsICZkYXRhKTsKKwkJCWlmICgoZGF0YSAmIDB4MDQpID09IDApCisJCQl7CisJCQkJcEFkLT5TdGFDZmcuYkh3UmFkaW8gPSBGQUxTRTsKKwkJCQlwQWQtPlN0YUNmZy5iUmFkaW8gPSBGQUxTRTsKKy8vCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBXUl9QSU5fQ0ZHLCAweDAwMDAxODE4KTsKKwkJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOworCQkJfQorCQl9CisJCWVsc2UKKwkJCXBBZC0+U3RhQ2ZnLmJIYXJkd2FyZVJhZGlvID0gRkFMU0U7CisKKwkJaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBGQUxTRSkKKwkJeworCQkJUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PRkYpOworCQl9CisJCWVsc2UKKwkJeworCQkJUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PTik7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLyBUdXJuIG9mZiBwYXRjaGluZyBmb3IgY2FyZGJ1cyBjb250cm9sbGVyCisJaWYgKE5pY0NvbmZpZzIuZmllbGQuQ2FyZGJ1c0FjY2VsZXJhdGlvbiA9PSAxKQorCXsKKy8vCQlwQWQtPmJUZXN0MSA9IFRSVUU7CisJfQorCisJaWYgKE5pY0NvbmZpZzIuZmllbGQuRHluYW1pY1R4QWdjQ29udHJvbCA9PSAxKQorCQlwQWQtPmJBdXRvVHhBZ2NBID0gcEFkLT5iQXV0b1R4QWdjRyA9IFRSVUU7CisJZWxzZQorCQlwQWQtPmJBdXRvVHhBZ2NBID0gcEFkLT5iQXV0b1R4QWdjRyA9IEZBTFNFOworCS8vCisJLy8gU2luY2UgQkJQIGhhcyBiZWVuIHByb2dhbWVkLCB0byBtYWtlIHN1cmUgQkJQIHNldHRpbmcgd2lsbCBiZQorCS8vIHVwYXRlIGluc2lkZSBvZiBBc2ljQW50ZW5uYVNlbGVjdCwgc28gcmVzZXQgdG8gVU5LTk9XTl9CQU5EISEKKwkvLworCXBBZC0+Q29tbW9uQ2ZnLkJhbmRTdGF0ZSA9IFVOS05PV05fQkFORDsKKworCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJCUFIzKTsKKwlCQlBSMyAmPSAofjB4MTgpOworCWlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMykKKwl7CisJCUJCUFIzIHw9ICgweDEwKTsKKwl9CisJZWxzZSBpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpCisJeworCQlCQlBSMyB8PSAoMHg4KTsKKwl9CisJZWxzZSBpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCisJeworCQlCQlBSMyB8PSAoMHgwKTsKKwl9CisJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQkJQUjMpOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCS8vIEhhbmRsZSB0aGUgZGlmZmVyZW5jZSB3aGVuIDFUCisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgJkJCUFIxKTsKKwkJaWYocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKQorCQl7CisJCUJCUFIxICY9ICh+MHgxOCk7CisJCX0KKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgQkJQUjEpOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlVzZSBIdyBSYWRpbyBDb250cm9sIFBpbj0lZDsgaWYgdXNlZCBQaW49JWQ7XG4iLCBwQWQtPkNvbW1vbkNmZy5iSGFyZHdhcmVSYWRpbywgcEFkLT5Db21tb25DZmcuYkhhcmR3YXJlUmFkaW8pKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhQYXRoID0gJWQsIFJ4UGF0aCA9ICVkLCBSRklDPSVkLCBQb2xhcitMRUQgbW9kZT0leFxuIiwgcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCwgcEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCwgcEFkLT5SZkljVHlwZSwgcEFkLT5MZWRDbnRsLndvcmQpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gTklDSW5pdEFzaWNGcm9tRUVQUk9NXG4iKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlJbml0aWFsaXplIE5JQyBoYXJkd2FyZQorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTCU5JQ0luaXRpYWxpemVBZGFwdGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICAgQk9PTEVBTiAgICBiSGFyZFJlc2V0KQoreworCU5ESVNfU1RBVFVTICAgICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCVdQRE1BX0dMT19DRkdfU1RSVUMJR2xvQ2ZnOworLy8JSU5UX01BU0tfQ1NSX1NUUlVDCQlJbnRNYXNrOworCVVMT05HCWkgPTAsIGo9MDsKKwlBQ19UWE9QX0NTUjBfU1RSVUMJY3NyMDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBOSUNJbml0aWFsaXplQWRhcHRlclxuIikpOworCisJLy8gMy4gU2V0IERNQSBnbG9iYWwgY29uZmlndXJhdGlvbiBleGNlcHQgVFhfRE1BX0VOIGFuZCBSWF9ETUFfRU4gYml0czoKK3JldHJ5OgorCWkgPSAwOworCWRvCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZHbG9DZmcud29yZCk7CisJCWlmICgoR2xvQ2ZnLmZpZWxkLlR4RE1BQnVzeSA9PSAwKSAgJiYgKEdsb0NmZy5maWVsZC5SeERNQUJ1c3kgPT0gMCkpCisJCQlicmVhazsKKworCQlSVE1QdXNlY0RlbGF5KDEwMDApOworCQlpKys7CisJfXdoaWxlICggaTwxMDApOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBETUEgb2Zmc2V0IDB4MjA4ID0gMHgleFxuIiwgR2xvQ2ZnLndvcmQpKTsKKwlHbG9DZmcud29yZCAmPSAweGZmMDsKKwlHbG9DZmcuZmllbGQuRW5UWFdyaXRlQmFja0RET05FID0xOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIEdsb0NmZy53b3JkKTsKKworCS8vIFJlY29yZCBIVyBCZWFjb24gb2Zmc2V0CisJcEFkLT5CZWFjb25PZmZzZXRbMF0gPSBIV19CRUFDT05fQkFTRTA7CisJcEFkLT5CZWFjb25PZmZzZXRbMV0gPSBIV19CRUFDT05fQkFTRTE7CisJcEFkLT5CZWFjb25PZmZzZXRbMl0gPSBIV19CRUFDT05fQkFTRTI7CisJcEFkLT5CZWFjb25PZmZzZXRbM10gPSBIV19CRUFDT05fQkFTRTM7CisJcEFkLT5CZWFjb25PZmZzZXRbNF0gPSBIV19CRUFDT05fQkFTRTQ7CisJcEFkLT5CZWFjb25PZmZzZXRbNV0gPSBIV19CRUFDT05fQkFTRTU7CisJcEFkLT5CZWFjb25PZmZzZXRbNl0gPSBIV19CRUFDT05fQkFTRTY7CisJcEFkLT5CZWFjb25PZmZzZXRbN10gPSBIV19CRUFDT05fQkFTRTc7CisKKwkvLworCS8vIHdyaXRlIGFsbCBzaGFyZWQgUmluZydzIGJhc2UgYWRkcmVzcyBpbnRvIEFTSUMKKwkvLworCisJLy8gYXNpYyBzaW11bGF0aW9uIHNlcXVlbmNlIHB1dCB0aGlzIGFoZWFkIGJlZm9yZSBsb2FkaW5nIGZpcm13YXJlLgorCS8vIHBiZiBoYXJkd2FyZSByZXNldAorCisJLy8gSW5pdGlhbHplIEFTSUMgZm9yIFRYICYgUnggb3BlcmF0aW9uCisJaWYgKE5JQ0luaXRpYWxpemVBc2ljKHBBZCAsIGJIYXJkUmVzZXQpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlpZiAoaisrID09IDApCisJCXsKKwkJCU5JQ0xvYWRGaXJtd2FyZShwQWQpOworCQkJZ290byByZXRyeTsKKwkJfQorCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKworCisKKwkvLyBXTU0gcGFyYW1ldGVyCisJY3NyMC53b3JkID0gMDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fVFhPUDBfQ0ZHLCBjc3IwLndvcmQpOworCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpCisJeworCQljc3IwLmZpZWxkLkFjMFR4b3AgPSAxOTI7CS8vIEFDX1ZJOiAxOTIqMzJ1cyB+PSA2bXMKKwkJY3NyMC5maWVsZC5BYzFUeG9wID0gOTY7CS8vIEFDX1ZPOiA5NiozMnVzICB+PSAzbXMKKwl9CisJZWxzZQorCXsKKwkJY3NyMC5maWVsZC5BYzBUeG9wID0gOTY7CS8vIEFDX1ZJOiA5NiozMnVzIH49IDNtcworCQljc3IwLmZpZWxkLkFjMVR4b3AgPSA0ODsJLy8gQUNfVk86IDQ4KjMydXMgfj0gMS41bXMKKwl9CisJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX1RYT1AxX0NGRywgY3NyMC53b3JkKTsKKworCisKKworCS8vIHJlc2V0IGFjdGlvbgorCS8vIExvYWQgZmlybXdhcmUKKwkvLyAgU3RhdHVzID0gTklDTG9hZEZpcm13YXJlKHBBZCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gTklDSW5pdGlhbGl6ZUFkYXB0ZXJcbiIpKTsKKwlyZXR1cm4gU3RhdHVzOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJSW5pdGlhbGl6ZSBBU0lDCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMJTklDSW5pdGlhbGl6ZUFzaWMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gIEJPT0xFQU4JCWJIYXJkUmVzZXQpCit7CisJVUxPTkcJCQlJbmRleCA9IDA7CisJVUNIQVIJCQlSMCA9IDB4ZmY7CisJVUlOVDMyCQkJTWFjQ3NyMTIgPSAwLCBDb3VudGVyID0gMDsKKyNpZmRlZiBSVDI4NzAKKwlVSU5UMzIJCQlNYWNDc3IwID0gMDsKKwlOVFNUQVRVUwkJU3RhdHVzOworCVVDSEFSCQkJVmFsdWUgPSAweGZmOworI2VuZGlmIC8vIFJUMjg3MCAvLworCVVTSE9SVAkJCUtleUlkeDsKKwlJTlQJCQkJaSxhcGlkeDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBOSUNJbml0aWFsaXplQXNpY1xuIikpOworCisKKyNpZmRlZiBSVDI4NzAKKwkvLworCS8vIE1ha2Ugc3VyZSBNQUMgZ2V0cyByZWFkeSBhZnRlciBOSUNMb2FkRmlybXdhcmUoKS4KKwkvLworCUluZGV4ID0gMDsKKworCS8vVG8gYXZvaWQgaGFuZy1vbiBpc3N1ZSB3aGVuIGludGVyZmFjZSB1cCBpbiBrZXJuZWwgMi40LAorCS8vd2UgdXNlIGEgbG9jYWwgdmFyaWFibGUgIk1hY0NzcjAiIGluc3RlYWQgb2YgdXNpbmcgInBBZC0+TUFDVmVyc2lvbiIgZGlyZWN0bHkuCisJZG8KKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX0NTUjAsICZNYWNDc3IwKTsKKworCQlpZiAoKE1hY0NzcjAgIT0gMHgwMCkgJiYgKE1hY0NzcjAgIT0gMHhGRkZGRkZGRikpCisJCQlicmVhazsKKworCQlSVE1QdXNlY0RlbGF5KDEwKTsKKwl9IHdoaWxlIChJbmRleCsrIDwgMTAwKTsKKworCXBBZC0+TUFDVmVyc2lvbiA9IE1hY0NzcjA7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTUFDX0NTUjAgIFsgVmVyOlJldj0weCUwOHhdXG4iLCBwQWQtPk1BQ1ZlcnNpb24pKTsKKwkvLyB0dXJuIG9uIGJpdDEzIChzZXQgdG8gemVybykgYWZ0ZXIgcnQyODYwRC4gVGhpcyBpcyB0byBzb2x2ZSBoaWdoLWN1cnJlbnQgaXNzdWUuCisJUlRNUF9JT19SRUFEMzIocEFkLCBQQkZfU1lTX0NUUkwsICZNYWNDc3IxMik7CisJTWFjQ3NyMTIgJj0gKH4weDIwMDApOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgTWFjQ3NyMTIpOworCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDMpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFVTQl9ETUFfQ0ZHLCAweDApOworCVN0YXR1cyA9IFJUVVNCVmVuZGVyUmVzZXQocEFkKTsKKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHgwKTsKKworCS8vIEluaXRpYWxpemUgTUFDIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUKKwlmb3IoSW5kZXg9MDsgSW5kZXg8TlVNX01BQ19SRUdfUEFSTVM7IEluZGV4KyspCisJeworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCAoVVNIT1JUKU1BQ1JlZ1RhYmxlW0luZGV4XS5SZWdpc3RlciwgTUFDUmVnVGFibGVbSW5kZXhdLlZhbHVlKTsKKwl9CisKKwlpZihJU19SVDMwNzAocEFkKSkKKwl7CisJCS8vIEFjY29yZGluZyB0byBGcmFuayBIc3UgKGZyb20gR2FyeSBUc2FvKQorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCAoVVNIT1JUKVRYX1NXX0NGRzAsIDB4MDAwMDA0MDApOworCisJCS8vIEluaXRpYWxpemUgUlQzMDcwIHNlcmlhbCBNQUMgcmVnaXN0ZXJzIHdoaWNoIGlzIGRpZmZlcmVudCBmcm9tIFJUMjg3MCBzZXJpYWwKKwkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgVFhfU1dfQ0ZHMSwgMCk7CisJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIFRYX1NXX0NGRzIsIDApOworCX0KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IE5VTV9TVEFfTUFDX1JFR19QQVJNUzsgSW5kZXgrKykKKwkJeworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgKFVTSE9SVClTVEFNQUNSZWdUYWJsZVtJbmRleF0uUmVnaXN0ZXIsIFNUQU1BQ1JlZ1RhYmxlW0luZGV4XS5WYWx1ZSk7CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwkvLworCS8vIEJlZm9yZSBwcm9ncmFtIEJCUCwgd2UgbmVlZCB0byB3YWl0IEJCUC9SRiBnZXQgd2FrZSB1cC4KKwkvLworCUluZGV4ID0gMDsKKwlkbworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1RBVFVTX0NGRywgJk1hY0NzcjEyKTsKKworCQlpZiAoKE1hY0NzcjEyICYgMHgwMykgPT0gMCkJLy8gaWYgQkIuUkYgaXMgc3RhYmxlCisJCQlicmVhazsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGVjayBNQUNfU1RBVFVTX0NGRyAgPSBCdXN5ID0gJXhcbiIsIE1hY0NzcjEyKSk7CisJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJfSB3aGlsZSAoSW5kZXgrKyA8IDEwMCk7CisKKyAgICAvLyBUaGUgY29tbWFuZHMgdG8gZmlybXdhcmUgc2hvdWxkIGJlIGFmdGVyIHRoZXNlIGNvbW1hbmRzLCB0aGVzZSBjb21tYW5kcyB3aWxsIGluaXQgZmlybXdhcmUKKwkvLyBQQ0kgYW5kIFVTQiBhcmUgbm90IHRoZSBzYW1lIGJlY2F1c2UgUENJIGRyaXZlciBuZWVkcyB0byB3YWl0IGZvciBQQ0kgYnVzIHJlYWR5CisJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX0JCUF9BR0VOVCwgMCk7CS8vIGluaXRpYWxpemUgQkJQIFIvVyBhY2Nlc3MgYWdlbnQKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9DU1IsIDApOworCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisKKwkvLyBSZWFkIEJCUCByZWdpc3RlciwgbWFrZSBzdXJlIEJCUCBpcyB1cCBhbmQgcnVubmluZyBiZWZvcmUgd3JpdGUgbmV3IGRhdGEKKwlJbmRleCA9IDA7CisJZG8KKwl7CisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMCwgJlIwKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkJQIHZlcnNpb24gPSAleFxuIiwgUjApKTsKKwl9IHdoaWxlICgoKytJbmRleCA8IDIwKSAmJiAoKFIwID09IDB4ZmYpIHx8IChSMCA9PSAweDAwKSkpOworCS8vQVNTRVJUKEluZGV4IDwgMjApOyAvL3RoaXMgd2lsbCBjYXVzZSBCU09EIG9uIENoZWNrLWJ1aWxkIGRyaXZlcgorCisJaWYgKChSMCA9PSAweGZmKSB8fCAoUjAgPT0gMHgwMCkpCisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCisJLy8gSW5pdGlhbGl6ZSBCQlAgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQorCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IE5VTV9CQlBfUkVHX1BBUk1TOyBJbmRleCsrKQorCXsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUFJlZ1RhYmxlW0luZGV4XS5SZWdpc3RlciwgQkJQUmVnVGFibGVbSW5kZXhdLlZhbHVlKTsKKwl9CisKKwkvLyBmb3IgcnQyODYwRSBhbmQgYWZ0ZXIsIGluaXQgQkJQX1I4NCB3aXRoIDB4MTkuIFRoaXMgaXMgZm9yIGV4dGVuc2lvbiBjaGFubmVsIG92ZXJsYXBwaW5nIElPVC4KKwlpZiAoKHBBZC0+TUFDVmVyc2lvbiYweGZmZmYpICE9IDB4MDEwMSkKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODQsIDB4MTkpOworCisjaWZkZWYgUlQyODcwCisJLy93cml0ZSBSVDMwNzAgQkJQIHdjaGljaCBkaWZmZXJlbnQgd2l0aCAyODcwIGFmdGVyIHdyaXRlIFJUMjg3MCBCQlAKKwlpZiAoSVNfUlQzMDcwKHBBZCkpCisJeworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgMHgwYSk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjg0LCAweDk5KTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMTA1LCAweDA1KTsKKwl9CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCisJeworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgMHgxNik7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjczLCAweDEyKTsKKyAgICB9CisKKwlpZiAocEFkLT5NQUNWZXJzaW9uID49IFJBTElOS18yODgwRV9WRVJTSU9OICYmIHBBZC0+TUFDVmVyc2lvbiA8IFJBTElOS18zMDcwX1ZFUlNJT04pIC8vIDMqMworCXsKKwkJLy8gZW5sYXJnZSBNQVhfTEVOX0NGRworCQlVSU5UMzIgY3NyOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BWF9MRU5fQ0ZHLCAmY3NyKTsKKwkJY3NyICY9IDB4RkZGOworCQljc3IgfD0gMHgyMDAwOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQVhfTEVOX0NGRywgY3NyKTsKKwl9CisKKyNpZmRlZiBSVDI4NzAKK3sKKwlVQ0hBUglNQUNfVmFsdWVbXT17MHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwwLDB9OworCisJLy9Jbml0aWFsaXplIFdDSUQgdGFibGUKKwlWYWx1ZSA9IDB4ZmY7CisJZm9yKEluZGV4ID0wIDtJbmRleCA8IDI1NDtJbmRleCsrKQorCXsKKwkJUlRVU0JNdWx0aVdyaXRlKHBBZCwgKFVTSE9SVCkoTUFDX1dDSURfQkFTRSArIEluZGV4ICogOCksIE1BQ19WYWx1ZSwgOCk7CisJfQorfQorI2VuZGlmIC8vIFJUMjg3MCAvLworCisJLy8gQWRkIHJhZGlvIG9mZiBjb250cm9sCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCWlmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gRkFMU0UpCisJCXsKKy8vCQkJUlRNUF9JT19XUklURTMyKHBBZCwgUFdSX1BJTl9DRkcsIDB4MDAwMDE4MTgpOworCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCBSYWRpbyBPZmZcbiIpKTsKKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIENsZWFyIHJhdyBjb3VudGVycworCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfU1RBX0NOVDAsICZDb3VudGVyKTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX1NUQV9DTlQxLCAmQ291bnRlcik7CisJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9TVEFfQ05UMiwgJkNvdW50ZXIpOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDAsICZDb3VudGVyKTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQxLCAmQ291bnRlcik7CisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMiwgJkNvdW50ZXIpOworCisJLy8gQVNJQyB3aWxsIGtlZXAgZ2FyYmFnZSB2YWx1ZSBhZnRlciBib290CisJLy8gQ2xlYXIgYWxsIHNlYXJlZCBrZXkgdGFibGUgd2hlbiBpbml0aWFsCisJLy8gVGhpcyByb3V0aW5lIGNhbiBiZSBpZ25vcmVkIGluIHJhZGlvLU9OL09GRiBvcGVyYXRpb24uCisJaWYgKGJIYXJkUmVzZXQpCisJeworCQlmb3IgKEtleUlkeCA9IDA7IEtleUlkeCA8IDQ7IEtleUlkeCsrKQorCQl7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSArIDQqS2V5SWR4LCAwKTsKKwkJfQorCisJCS8vIENsZWFyIGFsbCBwYWlyd2lzZSBrZXkgdGFibGUgd2hlbiBpbml0aWFsCisJCWZvciAoS2V5SWR4ID0gMDsgS2V5SWR4IDwgMjU2OyBLZXlJZHgrKykKKwkJeworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgKyAoS2V5SWR4ICogSFdfV0NJRF9BVFRSSV9TSVpFKSwgMSk7CisJCX0KKwl9CisKKwkvLyBhc3NlcnQgSE9TVCByZWFkeSBiaXQKKy8vICBSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQ1NSMSwgMHgwKTsgLy8gMjAwNC0wOS0xNCBhc2tlZCBieSBNYXJrCisvLyAgUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0NTUjEsIDB4NCk7CisKKwkvLyBJdCBpc24ndCBuZWNlc3NhcnkgdG8gY2xlYXIgdGhpcyBzcGFjZSB3aGVuIG5vdCBoYXJkIHJlc2V0LgorCWlmIChiSGFyZFJlc2V0ID09IFRSVUUpCisJeworCQkvLyBjbGVhciBhbGwgb24tY2hpcCBCRUFDT04gZnJhbWUgc3BhY2UKKwkJZm9yIChhcGlkeCA9IDA7IGFwaWR4IDwgSFdfQkVBQ09OX01BWF9DT1VOVDsgYXBpZHgrKykKKwkJeworCQkJZm9yIChpID0gMDsgaSA8IEhXX0JFQUNPTl9PRkZTRVQ+PjI7IGkrPTQpCisJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgcEFkLT5CZWFjb25PZmZzZXRbYXBpZHhdICsgaSwgMHgwMCk7CisJCX0KKwl9CisjaWZkZWYgUlQyODcwCisJQXNpY0Rpc2FibGVTeW5jKHBBZCk7CisJLy8gQ2xlYXIgcmF3IGNvdW50ZXJzCisJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9TVEFfQ05UMCwgJkNvdW50ZXIpOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfU1RBX0NOVDEsICZDb3VudGVyKTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX1NUQV9DTlQyLCAmQ291bnRlcik7CisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMCwgJkNvdW50ZXIpOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDEsICZDb3VudGVyKTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQyLCAmQ291bnRlcik7CisJLy8gRGVmYXVsdCBQQ0kgY2xvY2sgY3ljbGUgcGVyIG1zIGlzIGRpZmZlcmVudCBhcyBkZWZhdWx0IHNldHRpbmcsIHdoaWNoIGlzIGJhc2VkIG9uIFBDSS4KKwlSVE1QX0lPX1JFQUQzMihwQWQsIFVTQl9DWUNfQ0ZHLCAmQ291bnRlcik7CisJQ291bnRlciY9MHhmZmZmZmYwMDsKKwlDb3VudGVyfD0weDAwMDAwMWU7CisJUlRNUF9JT19XUklURTMyKHBBZCwgVVNCX0NZQ19DRkcsIENvdW50ZXIpOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCS8vIGZvciBydDI4NjBFIGFuZCBhZnRlciwgaW5pdCBUWE9QX0NUUkxfQ0ZHIHdpdGggMHg1ODNmLiBUaGlzIGlzIGZvciBleHRlbnNpb24gY2hhbm5lbCBvdmVybGFwcGluZyBJT1QuCisJCWlmICgocEFkLT5NQUNWZXJzaW9uJjB4ZmZmZikgIT0gMHgwMTAxKQorCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhPUF9DVFJMX0NGRywgMHg1ODNmKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gTklDSW5pdGlhbGl6ZUFzaWNcbiIpKTsKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJlc2V0IE5JQyBBc2ljcworCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKwkJUmVzZXQgTklDIHRvIGluaXRpYWwgc3RhdGUgQVMgSVMgc3lzdGVtIGJvb3QgdXAgdGltZS4KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJTklDSXNzdWVSZXNldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlVSU5UMzIJVmFsdWUgPSAwOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBOSUNJc3N1ZVJlc2V0XG4iKSk7CisKKwkvLyBBYm9ydCBUeCwgcHJldmVudCBBU0lDIGZyb20gd3JpdGluZyB0byBIb3N0IG1lbW9yeQorCS8vUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQ05UTF9DU1IsIDB4MDAxZjAwMDApOworCisJLy8gRGlzYWJsZSBSeCwgcmVnaXN0ZXIgdmFsdWUgc3VwcG9zZWQgd2lsbCByZW1haW4gYWZ0ZXIgcmVzZXQKKwlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwlWYWx1ZSAmPSAoMHhmZmZmZmZmMyk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKwkvLyBJc3N1ZSByZXNldCBhbmQgY2xlYXIgZnJvbSByZXNldCBzdGF0ZQorCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHgwMyk7IC8vIDIwMDQtMDktMTcgY2hhbmdlIGZyb20gMHgwMQorCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHgwMCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gTklDSXNzdWVSZXNldFxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ2hlY2sgQVNJQyByZWdpc3RlcnMgYW5kIGZpbmQgYW55IHJlYXNvbiB0aGUgc3lzdGVtIG1pZ2h0IGhhbmcKKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOCU5JQ0NoZWNrRm9ySGFuZygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlyZXR1cm4gKEZBTFNFKTsKK30KKworVk9JRCBOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVFhfU1RBX0ZJRk9fU1RSVUMJU3RhRmlmbzsKKwlNQUNfVEFCTEVfRU5UUlkJCSpwRW50cnk7CisJVUNIQVIJCQkJaSA9IDA7CisJVUNIQVIJCQlwaWQgPSAwLCB3Y2lkID0gMDsKKwlDSEFSCQkJCXJlVHJ5OworCVVDSEFSCQkJCXN1Y2NNQ1M7CisKKyNpZmRlZiBSQUxJTktfQVRFCisJLyogTm90aGluZyB0byBkbyBpbiBBVEUgbW9kZSAqLworCWlmIChBVEVfT04ocEFkKSkKKwkJcmV0dXJuOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCQlkbworCQl7CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9GSUZPLCAmU3RhRmlmby53b3JkKTsKKworCQkJaWYgKFN0YUZpZm8uZmllbGQuYlZhbGlkID09IDApCisJCQkJYnJlYWs7CisKKwkJCXdjaWQgPSAoVUNIQVIpU3RhRmlmby5maWVsZC53Y2lkOworCisKKwkJLyogaWdub3JlIE5vQUNLIGFuZCBNR01UIGZyYW1lIHVzZSAweEZGIGFzIFdDSUQgKi8KKwkJCWlmICgoU3RhRmlmby5maWVsZC5UeEFja1JlcXVpcmVkID09IDApIHx8ICh3Y2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKSkKKwkJCXsKKwkJCQlpKys7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qIFBJRCBzdG9yZSBUeCBNQ1MgUmF0ZSAqLworCQkJcGlkID0gKFVDSEFSKVN0YUZpZm8uZmllbGQuUGlkVHlwZTsKKworCQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbd2NpZF07CisKKwkJCXBFbnRyeS0+RGVidWdGSUZPQ291bnQrKzsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJaWYgKFN0YUZpZm8uZmllbGQuVHhCRikgLy8gMyozCisJCQkJcEVudHJ5LT5UeEJGQ291bnQrKzsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2lmZGVmIFVBUFNEX0FQX1NVUFBPUlQKKwkJCVVBUFNEX1NQX0FVRV9IYW5kbGUocEFkLCBwRW50cnksIFN0YUZpZm8uZmllbGQuVHhTdWNjZXNzKTsKKyNlbmRpZiAvLyBVQVBTRF9BUF9TVVBQT1JUIC8vCisKKwkJCWlmICghU3RhRmlmby5maWVsZC5UeFN1Y2Nlc3MpCisJCQl7CisJCQkJcEVudHJ5LT5GSUZPQ291bnQrKzsKKwkJCQlwRW50cnktPk9uZVNlY1R4RmFpbENvdW50Kys7CisKKwkJCQlpZiAocEVudHJ5LT5GSUZPQ291bnQgPj0gMSkKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiMiKSk7CisjaWYgMAorCQkJCQlTZW5kUmVmcmVzaEJBUihwQWQsIHBFbnRyeSk7CisJCQkJCXBFbnRyeS0+Tm9CQURhdGFDb3VudERvd24gPSA2NDsKKyNlbHNlCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJCXBFbnRyeS0+Tm9CQURhdGFDb3VudERvd24gPSA2NDsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkJCQlpZihwRW50cnktPlBzTW9kZSA9PSBQV1JfQUNUSVZFKQorCQkJCQl7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJCQlpbnQgdGlkOworCQkJCQkJZm9yICh0aWQ9MDsgdGlkPE5VTV9PRl9USUQ7IHRpZCsrKQorCQkJCQkJeworCQkJCQkJCUJBT3JpU2Vzc2lvblRlYXJEb3duKHBBZCwgcEVudHJ5LT5BaWQsICB0aWQsIEZBTFNFLCBGQUxTRSk7CisJCQkJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJCQkJCS8vIFVwZGF0ZSB0aGUgY29udGludW91cyB0cmFuc21pc3Npb24gY291bnRlciBleGNlcHQgUFMgbW9kZQorCQkJCQkJcEVudHJ5LT5Db250aW51ZVR4RmFpbENudCsrOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJLy8gQ2xlYXIgdGhlIEZJRk9Db3VudCB3aGVuIHN0YSBpbiBQb3dlciBTYXZlIG1vZGUuIEJhc2ljYWxseSB3ZSBhc3N1bWUKKwkJCQkJCS8vICAgICB0aGlzIHR4IGVycm9yIGhhcHBlbmVkIGR1ZSB0byBzdGEganVzdCBnbyB0byBzbGVlcC4KKwkJCQkJCXBFbnRyeS0+RklGT0NvdW50ID0gMDsKKwkJCQkJCXBFbnRyeS0+Q29udGludWVUeEZhaWxDbnQgPSAwOworCQkJCQl9CisjZW5kaWYKKwkJCQkJLy9wRW50cnktPkZJRk9Db3VudCA9IDA7CisJCQkJfQorCQkJCS8vcEVudHJ5LT5iU2VuZEJBUiA9IFRSVUU7CisJCQl9CisJCQllbHNlCisJCQl7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJaWYgKChwRW50cnktPlBzTW9kZSAhPSBQV1JfU0FWRSkgJiYgKHBFbnRyeS0+Tm9CQURhdGFDb3VudERvd24gPiAwKSkKKwkJCQl7CisJCQkJCXBFbnRyeS0+Tm9CQURhdGFDb3VudERvd24tLTsKKwkJCQkJaWYgKHBFbnRyeS0+Tm9CQURhdGFDb3VudERvd249PTApCisJCQkJCXsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkBcbiIpKTsKKwkJCQkJfQorCQkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCQlwRW50cnktPkZJRk9Db3VudCA9IDA7CisJCQkJcEVudHJ5LT5PbmVTZWNUeE5vUmV0cnlPa0NvdW50Kys7CisJCQkJLy8gdXBkYXRlIE5vRGF0YUlkbGVDb3VudCB3aGVuIHN1Y2Vzc2Z1bCBzZW5kIHBhY2tldCB0byBTVEEuCisJCQkJcEVudHJ5LT5Ob0RhdGFJZGxlQ291bnQgPSAwOworCQkJCXBFbnRyeS0+Q29udGludWVUeEZhaWxDbnQgPSAwOworCQkJfQorCisJCQlzdWNjTUNTID0gU3RhRmlmby5maWVsZC5TdWNjZXNzUmF0ZSAmIDB4N0Y7CisKKwkJCXJlVHJ5ID0gcGlkIC0gc3VjY01DUzsKKworCQkJaWYgKFN0YUZpZm8uZmllbGQuVHhTdWNjZXNzKQorCQkJeworCQkJCXBFbnRyeS0+VFhNQ1NFeHBlY3RlZFtwaWRdKys7CisJCQkJaWYgKHBpZCA9PSBzdWNjTUNTKQorCQkJCXsKKwkJCQkJcEVudHJ5LT5UWE1DU1N1Y2Nlc3NmdWxbcGlkXSsrOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlwRW50cnktPlRYTUNTQXV0b0ZhbGxCYWNrW3BpZF1bc3VjY01DU10rKzsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcEVudHJ5LT5UWE1DU0ZhaWxlZFtwaWRdKys7CisJCQl9CisKKwkJCWlmIChyZVRyeSA+IDApCisJCQl7CisJCQkJaWYgKChwaWQgPj0gMTIpICYmIHN1Y2NNQ1MgPD03KQorCQkJCXsKKwkJCQkJcmVUcnkgLT0gNDsKKwkJCQl9CisJCQkJcEVudHJ5LT5PbmVTZWNUeFJldHJ5T2tDb3VudCArPSByZVRyeTsKKwkJCX0KKworCQkJaSsrOworCQkJLy8gQVNJQyBzdG9yZSAxNiBzdGFjaworCQl9IHdoaWxlICggaSA8ICgyKlRYX1JJTkdfU0laRSkgKTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUmVhZCBzdGF0aXN0aWNhbCBjb3VudGVycyBmcm9tIGhhcmR3YXJlIHJlZ2lzdGVycyBhbmQgcmVjb3JkIHRoZW0KKwkJaW4gc29mdHdhcmUgdmFyaWFibGVzIGZvciBsYXRlciBvbiBxdWVyeQorCisJQXJndW1lbnRzOgorCQlwQWQJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIE5JQ1VwZGF0ZVJhd0NvdW50ZXJzKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVVJTlQzMglPbGRWYWx1ZTsKKwlSWF9TVEFfQ05UMF9TVFJVQwkgUnhTdGFDbnQwOworCVJYX1NUQV9DTlQxX1NUUlVDICAgUnhTdGFDbnQxOworCVJYX1NUQV9DTlQyX1NUUlVDICAgUnhTdGFDbnQyOworCVRYX1NUQV9DTlQwX1NUUlVDIAkgVHhTdGFDbnQwOworCVRYX1NUQV9DTlQxX1NUUlVDCSBTdGFUeDE7CisJVFhfU1RBX0NOVDJfU1RSVUMJIFN0YVR4MjsKKwlUWF9BR0dfQ05UX1NUUlVDCVR4QWdnQ250OworCVRYX0FHR19DTlQwX1NUUlVDCVR4QWdnQ250MDsKKwlUWF9BR0dfQ05UMV9TVFJVQwlUeEFnZ0NudDE7CisJVFhfQUdHX0NOVDJfU1RSVUMJVHhBZ2dDbnQyOworCVRYX0FHR19DTlQzX1NUUlVDCVR4QWdnQ250MzsKKwlUWF9BR0dfQ05UNF9TVFJVQwlUeEFnZ0NudDQ7CisJVFhfQUdHX0NOVDVfU1RSVUMJVHhBZ2dDbnQ1OworCVRYX0FHR19DTlQ2X1NUUlVDCVR4QWdnQ250NjsKKwlUWF9BR0dfQ05UN19TVFJVQwlUeEFnZ0NudDc7CisKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfU1RBX0NOVDAsICZSeFN0YUNudDAud29yZCk7CisJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9TVEFfQ05UMiwgJlJ4U3RhQ250Mi53b3JkKTsKKworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9TVEFfQ05UMSwgJlJ4U3RhQ250MS53b3JkKTsKKwkgICAgLy8gVXBkYXRlIFJYIFBMQ1AgZXJyb3IgY291bnRlcgorCSAgICBwQWQtPlByaXZhdGVJbmZvLlBoeVJ4RXJyQ250ICs9IFJ4U3RhQ250MS5maWVsZC5QbGNwRXJyOworCQkvLyBVcGRhdGUgRmFsc2UgQ0NBIGNvdW50ZXIKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNGYWxzZUNDQUNudCArPSBSeFN0YUNudDEuZmllbGQuRmFsc2VDY2E7CisJfQorCisJLy8gVXBkYXRlIEZDUyBjb3VudGVycworCU9sZFZhbHVlPSBwQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LnUuTG93UGFydDsKKwlwQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LnUuTG93UGFydCArPSAoUnhTdGFDbnQwLmZpZWxkLkNyY0Vycik7IC8vID4+IDcpOworCWlmIChwQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LnUuTG93UGFydCA8IE9sZFZhbHVlKQorCQlwQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LnUuSGlnaFBhcnQrKzsKKworCS8vIEFkZCBGQ1MgZXJyb3IgY291bnQgdG8gcHJpdmF0ZSBjb3VudGVycworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhGY3NFcnJDbnQgKz0gUnhTdGFDbnQwLmZpZWxkLkNyY0VycjsKKwlPbGRWYWx1ZSA9IHBBZC0+UmFsaW5rQ291bnRlcnMuUmVhbEZjc0VyckNvdW50LnUuTG93UGFydDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLlJlYWxGY3NFcnJDb3VudC51Lkxvd1BhcnQgKz0gUnhTdGFDbnQwLmZpZWxkLkNyY0VycjsKKwlpZiAocEFkLT5SYWxpbmtDb3VudGVycy5SZWFsRmNzRXJyQ291bnQudS5Mb3dQYXJ0IDwgT2xkVmFsdWUpCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuUmVhbEZjc0VyckNvdW50LnUuSGlnaFBhcnQrKzsKKworCS8vIFVwZGF0ZSBEdXBsaWNhdGUgUmN2IGNoZWNrCisJcEFkLT5SYWxpbmtDb3VudGVycy5EdXBsaWNhdGVSY3YgKz0gUnhTdGFDbnQyLmZpZWxkLlJ4RHVwbGlDb3VudDsKKwlwQWQtPldsYW5Db3VudGVycy5GcmFtZUR1cGxpY2F0ZUNvdW50LnUuTG93UGFydCArPSBSeFN0YUNudDIuZmllbGQuUnhEdXBsaUNvdW50OworCS8vIFVwZGF0ZSBSWCBPdmVyZmxvdyBjb3VudGVyCisJcEFkLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlciArPSAoUnhTdGFDbnQyLmZpZWxkLlJ4Rmlmb092ZXJmbG93Q291bnQpOworCisJLy9wQWQtPlJhbGlua0NvdW50ZXJzLlJ4Q291bnQgPSAwOworI2lmZGVmIFJUMjg3MAorCWlmIChwQWQtPlJhbGlua0NvdW50ZXJzLlJ4Q291bnQgIT0gcEFkLT53YXRjaERvZ1J4Q250KQorCXsKKwkJcEFkLT53YXRjaERvZ1J4Q250ID0gcEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50OworCQlwQWQtPndhdGNoRG9nUnhPdmVyRmxvd0NudCA9IDA7CisJfQorCWVsc2UKKwl7CisJCWlmIChSeFN0YUNudDIuZmllbGQuUnhGaWZvT3ZlcmZsb3dDb3VudCkKKwkJCXBBZC0+d2F0Y2hEb2dSeE92ZXJGbG93Q250Kys7CisJCWVsc2UKKwkJCXBBZC0+d2F0Y2hEb2dSeE92ZXJGbG93Q250ID0gMDsKKwl9CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKworCS8vaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpIHx8CisJLy8JKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCkgJiYgKHBBZC0+TWFjVGFiLlNpemUgIT0gMSkpKQorCWlmICghcEFkLT5iVXBkYXRlQmNuQ250RG9uZSkKKwl7CisJLy8gVXBkYXRlIEJFQUNPTiBzZW50IGNvdW50CisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMCwgJlR4U3RhQ250MC53b3JkKTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQxLCAmU3RhVHgxLndvcmQpOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDIsICZTdGFUeDIud29yZCk7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNCZWFjb25TZW50Q250ICs9IFR4U3RhQ250MC5maWVsZC5UeEJlYWNvbkNvdW50OworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKz0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKz0gU3RhVHgxLmZpZWxkLlR4U3VjY2VzczsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50ICs9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKwlwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQudS5Mb3dQYXJ0ICs9IFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7CisJcEFkLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC51Lkxvd1BhcnQgKz0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKKwlwQWQtPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC51Lkxvd1BhcnQgKz0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OworCX0KKworI2lmIDAKKwlSZXRyeSA9IFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7CisJRmFpbCA9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKwlUeEVycm9yUmF0aW8gPSAwOworCU9uZVNlY1RyYW5zbWl0Q291bnQgPSBwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQudS5Mb3dQYXJ0LSBwQWQtPldsYW5Db3VudGVycy5MYXN0VHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LnUuTG93UGFydDsKKwlpZiAoKE9uZVNlY1RyYW5zbWl0Q291bnQrUmV0cnkgKyBGYWlsKSA+IDApCisJCVR4RXJyb3JSYXRpbyA9ICgoIFJldHJ5ICsgRmFpbCkgKjEwMCkgLyAoT25lU2VjVHJhbnNtaXRDb3VudCtSZXRyeSArIEZhaWwpOworCisJaWYgKChPbmVTZWNUcmFuc21pdENvdW50K1JldHJ5ICsgRmFpbCkgPiAwKQorCQlUeEVycm9yUmF0aW8gPSAoKCBSZXRyeSArIEZhaWwpICoxMDApIC8gKE9uZVNlY1RyYW5zbWl0Q291bnQrUmV0cnkgKyBGYWlsKTsKKwlEQkdQUklOVChSVF9ERUJVR19JTkZPLCAoIlRYIEVSUk9SIFJhdGUgPSAlbGQgJSUsIFJldHJ5ID0gJWxkLCBGYWlsID0gJWxkLCBUb3RhbCA9ICVsZCAgXG4iLFR4RXJyb3JSYXRpbywgUmV0cnksIEZhaWwsIChPbmVTZWNUcmFuc21pdENvdW50K1JldHJ5ICsgRmFpbCkpKTsKKwlwQWQtPldsYW5Db3VudGVycy5MYXN0VHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LnUuTG93UGFydCA9IHBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC51Lkxvd1BhcnQ7CisjZW5kaWYKKworCS8vaWYgKHBBZC0+YlN0YUZpZm9UZXN0ID09IFRSVUUpCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQsICZUeEFnZ0NudC53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UMCwgJlR4QWdnQ250MC53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UMSwgJlR4QWdnQ250MS53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UMiwgJlR4QWdnQ250Mi53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UMywgJlR4QWdnQ250My53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UNCwgJlR4QWdnQ250NC53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UNSwgJlR4QWdnQ250NS53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UNiwgJlR4QWdnQ250Ni53b3JkKTsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UNywgJlR4QWdnQ250Ny53b3JkKTsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZ0NvdW50ICs9IFR4QWdnQ250LmZpZWxkLkFnZ1R4Q291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhOb25BZ2dDb3VudCArPSBUeEFnZ0NudC5maWVsZC5Ob25BZ2dUeENvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMU1QRFVDb3VudCArPSBUeEFnZ0NudDAuZmllbGQuQWdnU2l6ZTFDb3VudDsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzJNUERVQ291bnQgKz0gVHhBZ2dDbnQwLmZpZWxkLkFnZ1NpemUyQ291bnQ7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzNNUERVQ291bnQgKz0gVHhBZ2dDbnQxLmZpZWxkLkFnZ1NpemUzQ291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2c0TVBEVUNvdW50ICs9IFR4QWdnQ250MS5maWVsZC5BZ2dTaXplNENvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnNU1QRFVDb3VudCArPSBUeEFnZ0NudDIuZmllbGQuQWdnU2l6ZTVDb3VudDsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzZNUERVQ291bnQgKz0gVHhBZ2dDbnQyLmZpZWxkLkFnZ1NpemU2Q291bnQ7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzdNUERVQ291bnQgKz0gVHhBZ2dDbnQzLmZpZWxkLkFnZ1NpemU3Q291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2c4TVBEVUNvdW50ICs9IFR4QWdnQ250My5maWVsZC5BZ2dTaXplOENvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnOU1QRFVDb3VudCArPSBUeEFnZ0NudDQuZmllbGQuQWdnU2l6ZTlDb3VudDsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzEwTVBEVUNvdW50ICs9IFR4QWdnQ250NC5maWVsZC5BZ2dTaXplMTBDb3VudDsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMTFNUERVQ291bnQgKz0gVHhBZ2dDbnQ1LmZpZWxkLkFnZ1NpemUxMUNvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMTJNUERVQ291bnQgKz0gVHhBZ2dDbnQ1LmZpZWxkLkFnZ1NpemUxMkNvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMTNNUERVQ291bnQgKz0gVHhBZ2dDbnQ2LmZpZWxkLkFnZ1NpemUxM0NvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMTRNUERVQ291bnQgKz0gVHhBZ2dDbnQ2LmZpZWxkLkFnZ1NpemUxNENvdW50OworCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxNU1QRFVDb3VudCArPSBUeEFnZ0NudDcuZmllbGQuQWdnU2l6ZTE1Q291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2cxNk1QRFVDb3VudCArPSBUeEFnZ0NudDcuZmllbGQuQWdnU2l6ZTE2Q291bnQ7CisKKwkJLy8gQ2FsY3VsYXRlIHRoZSB0cmFuc21pdHRlZCBBLU1QRFUgY291bnQKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IFR4QWdnQ250MC5maWVsZC5BZ2dTaXplMUNvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250MC5maWVsZC5BZ2dTaXplMkNvdW50IC8gMik7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDEuZmllbGQuQWdnU2l6ZTNDb3VudCAvIDMpOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250MS5maWVsZC5BZ2dTaXplNENvdW50IC8gNCk7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDIuZmllbGQuQWdnU2l6ZTVDb3VudCAvIDUpOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250Mi5maWVsZC5BZ2dTaXplNkNvdW50IC8gNik7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDMuZmllbGQuQWdnU2l6ZTdDb3VudCAvIDcpOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250My5maWVsZC5BZ2dTaXplOENvdW50IC8gOCk7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDQuZmllbGQuQWdnU2l6ZTlDb3VudCAvIDkpOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250NC5maWVsZC5BZ2dTaXplMTBDb3VudCAvIDEwKTsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250NS5maWVsZC5BZ2dTaXplMTFDb3VudCAvIDExKTsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDUuZmllbGQuQWdnU2l6ZTEyQ291bnQgLyAxMik7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDYuZmllbGQuQWdnU2l6ZTEzQ291bnQgLyAxMyk7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQ2LmZpZWxkLkFnZ1NpemUxNENvdW50IC8gMTQpOworCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQ3LmZpZWxkLkFnZ1NpemUxNUNvdW50IC8gMTUpOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250Ny5maWVsZC5BZ2dTaXplMTZDb3VudCAvIDE2KTsKKwl9CisKKyNpZmRlZiBEQkdfRElBR05PU0UKKwl7CisJCVJ0bXBEaWFnU3RydWN0CSpwRGlhZzsKKwkJQ09VTlRFUl9SQUxJTksJKnBSYWxpbmtDb3VudGVyczsKKwkJVUNIQVIJCQlBcnJheUN1cklkeCwgaTsKKworCQlwRGlhZyA9ICZwQWQtPkRpYWdTdHJ1Y3Q7CisJCXBSYWxpbmtDb3VudGVycyA9ICZwQWQtPlJhbGlua0NvdW50ZXJzOworCQlBcnJheUN1cklkeCA9IHBEaWFnLT5BcnJheUN1cklkeDsKKworCQlpZiAocERpYWctPmluaXRlZCA9PSAwKQorCQl7CisJCQlOZGlzWmVyb01lbW9yeShwRGlhZywgc2l6ZW9mKHN0cnVjdCBfUnRtcERpYWdTdHJjdXRfKSk7CisJCQlwRGlhZy0+QXJyYXlTdGFydElkeCA9IHBEaWFnLT5BcnJheUN1cklkeCA9IDA7CisJCQlwRGlhZy0+aW5pdGVkID0gMTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIFR4CisJCQlwRGlhZy0+VHhGYWlsQ250W0FycmF5Q3VySWR4XSA9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKwkJCXBEaWFnLT5UeEFnZ0NudFtBcnJheUN1cklkeF0gPSBUeEFnZ0NudC5maWVsZC5BZ2dUeENvdW50OworCQkJcERpYWctPlR4Tm9uQWdnQ250W0FycmF5Q3VySWR4XSA9IFR4QWdnQ250LmZpZWxkLk5vbkFnZ1R4Q291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bMF0gPSBUeEFnZ0NudDAuZmllbGQuQWdnU2l6ZTFDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVsxXSA9IFR4QWdnQ250MC5maWVsZC5BZ2dTaXplMkNvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzJdID0gVHhBZ2dDbnQxLmZpZWxkLkFnZ1NpemUzQ291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bM10gPSBUeEFnZ0NudDEuZmllbGQuQWdnU2l6ZTRDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVs0XSA9IFR4QWdnQ250Mi5maWVsZC5BZ2dTaXplNUNvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzVdID0gVHhBZ2dDbnQyLmZpZWxkLkFnZ1NpemU2Q291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bNl0gPSBUeEFnZ0NudDMuZmllbGQuQWdnU2l6ZTdDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVs3XSA9IFR4QWdnQ250My5maWVsZC5BZ2dTaXplOENvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzhdID0gVHhBZ2dDbnQ0LmZpZWxkLkFnZ1NpemU5Q291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bOV0gPSBUeEFnZ0NudDQuZmllbGQuQWdnU2l6ZTEwQ291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bMTBdID0gVHhBZ2dDbnQ1LmZpZWxkLkFnZ1NpemUxMUNvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzExXSA9IFR4QWdnQ250NS5maWVsZC5BZ2dTaXplMTJDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVsxMl0gPSBUeEFnZ0NudDYuZmllbGQuQWdnU2l6ZTEzQ291bnQ7CisJCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bMTNdID0gVHhBZ2dDbnQ2LmZpZWxkLkFnZ1NpemUxNENvdW50OworCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzE0XSA9IFR4QWdnQ250Ny5maWVsZC5BZ2dTaXplMTVDb3VudDsKKwkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVsxNV0gPSBUeEFnZ0NudDcuZmllbGQuQWdnU2l6ZTE2Q291bnQ7CisKKwkJCXBEaWFnLT5SeENyY0VyckNudFtBcnJheUN1cklkeF0gPSBSeFN0YUNudDAuZmllbGQuQ3JjRXJyOworCisJCQlJTkNfUklOR19JTkRFWChwRGlhZy0+QXJyYXlDdXJJZHgsICBESUFHTk9TRV9USU1FKTsKKwkJCUFycmF5Q3VySWR4ID0gcERpYWctPkFycmF5Q3VySWR4OworCQkJZm9yIChpID0wOyBpIDwgOTsgaSsrKQorCQkJeworCQkJCXBEaWFnLT5UeERlc2NDbnRbQXJyYXlDdXJJZHhdW2ldPSAwOworCQkJCXBEaWFnLT5UeFNXUXVlQ250W0FycmF5Q3VySWR4XVtpXSA9MDsKKwkJCQlwRGlhZy0+VHhNY3NDbnRbQXJyYXlDdXJJZHhdW2ldID0gMDsKKwkJCQlwRGlhZy0+UnhNY3NDbnRbQXJyYXlDdXJJZHhdW2ldID0gMDsKKwkJCX0KKwkJCXBEaWFnLT5UeERhdGFDbnRbQXJyYXlDdXJJZHhdID0gMDsKKwkJCXBEaWFnLT5UeEZhaWxDbnRbQXJyYXlDdXJJZHhdID0gMDsKKwkJCXBEaWFnLT5SeERhdGFDbnRbQXJyYXlDdXJJZHhdID0gMDsKKwkJCXBEaWFnLT5SeENyY0VyckNudFtBcnJheUN1cklkeF0gID0gMDsKKy8vCQkJZm9yIChpID0gOTsgaSA8IDE2OyBpKyspCisJCQlmb3IgKGkgPSA5OyBpIDwgMjQ7IGkrKykgLy8gMyozCisJCQl7CisJCQkJcERpYWctPlR4RGVzY0NudFtBcnJheUN1cklkeF1baV0gPSAwOworCQkJCXBEaWFnLT5UeE1jc0NudFtBcnJheUN1cklkeF1baV0gPSAwOworCQkJCXBEaWFnLT5SeE1jc0NudFtBcnJheUN1cklkeF1baV0gPSAwOworfQorCisJCQlpZiAocERpYWctPkFycmF5Q3VySWR4ID09IHBEaWFnLT5BcnJheVN0YXJ0SWR4KQorCQkJCUlOQ19SSU5HX0lOREVYKHBEaWFnLT5BcnJheVN0YXJ0SWR4LCAgRElBR05PU0VfVElNRSk7CisJCX0KKworCX0KKyNlbmRpZiAvLyBEQkdfRElBR05PU0UgLy8KKworCit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJlc2V0IE5JQyBmcm9tIGVycm9yCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwlOb3RlOgorCQlSZXNldCBOSUMgZnJvbSBlcnJvciBzdGF0ZQorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlOSUNSZXNldEZyb21FcnJvcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwkvLyBSZXNldCBCQlAgKGFjY29yZGluZyB0byBhbGV4LCByZXNldCBBU0lDIHdpbGwgZm9yY2UgcmVzZXQgQkJQCisJLy8gVGhlcmVmb3JlLCBza2lwIHRoZSByZXNldCBCQlAKKwkvLyBSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQ1NSMSwgMHgyKTsKKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHgxKTsKKwkvLyBSZW1vdmUgQVNJQyBmcm9tIHJlc2V0IHN0YXRlCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDApOworCisJTklDSW5pdGlhbGl6ZUFkYXB0ZXIocEFkLCBGQUxTRSk7CisJTklDSW5pdEFzaWNGcm9tRUVQUk9NKHBBZCk7CisKKwkvLyBTd2l0Y2ggdG8gY3VycmVudCBjaGFubmVsLCBzaW5jZSBkdXJpbmcgcmVzZXQgcHJvY2VzcywgdGhlIGNvbm5lY3Rpb24gc2hvdWxkIHJlbWFpbnMgb24uCisJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOworCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCWVyYXNlIDgwNTEgZmlybXdhcmUgaW1hZ2UgaW4gTUFDIEFTSUMKKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIE5JQ0VyYXNlRmlybXdhcmUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJVUxPTkcgaTsKKworCWZvcihpPTA7IGk8TUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkU7IGkrPTQpCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEZJUk1XQVJFX0lNQUdFX0JBU0UgKyBpLCAwKTsKKworfS8qIEVuZCBvZiBOSUNFcmFzZUZpcm13YXJlICovCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlMb2FkIDgwNTEgZmlybXdhcmUgUlQyNTYxLkJJTiBmaWxlIGludG8gTUFDIEFTSUMKKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTkRJU19TVEFUVVNfU1VDQ0VTUyAgICAgICAgIGZpcm13YXJlIGltYWdlIGxvYWQgb2sKKwkJTkRJU19TVEFUVVNfRkFJTFVSRSAgICAgICAgIGltYWdlIG5vdCBmb3VuZAorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTIE5JQ0xvYWRGaXJtd2FyZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKyNpZmRlZiBCSU5fSU5fRklMRQorI2RlZmluZSBOSUNMRl9ERUZBVUxUX1VTRSgpCVwKKwlmbGdfZGVmYXVsdF9maXJtX3VzZSA9IFRSVUU7IFwKKwlwcmludGsoIiVzIC0gVXNlIGRlZmF1bHQgZmlybXdhcmUhXG4iLCBfX2Z1bmNfXyk7CisKKwlORElTX1NUQVRVUwkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlQVUNIQVIJCQlzcmM7CisJc3RydWN0IGZpbGUJCSpzcmNmOworCUlOVCAJCQlyZXR2YWwsIG9yZ2ZzdWlkLCBvcmdmc2dpZCwgaTsKKyAgIAltbV9zZWdtZW50X3QJb3JnZnM7CisJUFVDSEFSCQkJcEZpcm13YXJlSW1hZ2U7CisJVUlOVAkJCUZpbGVMZW5ndGggPSAwOworCVVJTlQzMgkJCU1hY1JlZzsKKwlVTE9ORwkJCUluZGV4OworCVVMT05HCQkJZmlybTsKKwlCT09MRUFOCQkJZmxnX2RlZmF1bHRfZmlybV91c2UgPSBGQUxTRTsKKworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiAlc1xuIiwgX19mdW5jX18pKTsKKworCS8qIGluaXQgKi8KKwlwRmlybXdhcmVJbWFnZSA9IE5VTEw7CisJc3JjID0gUlRNUF9GSVJNV0FSRV9GSUxFX05BTUU7CisKKwkvKiBzYXZlIHVpZCBhbmQgZ2lkIHVzZWQgZm9yIGZpbGVzeXN0ZW0gYWNjZXNzLgorCSAgIHNldCB1c2VyIGFuZCBncm91cCB0byAwIChyb290KSAqLworCW9yZ2ZzdWlkID0gY3VycmVudC0+ZnN1aWQ7CisJb3JnZnNnaWQgPSBjdXJyZW50LT5mc2dpZDsKKwljdXJyZW50LT5mc3VpZCA9IGN1cnJlbnQtPmZzZ2lkID0gMDsKKyAgICBvcmdmcyA9IGdldF9mcygpOworICAgIHNldF9mcyhLRVJORUxfRFMpOworCisJcEFkLT5GaXJtd2FyZVZlcnNpb24gPSAoRklSTVdBUkVfTUFKT1JfVkVSU0lPTiA8PCA4KSArIFwKKwkJCQkJCSAgIEZJUk1XQVJFX01JTk9SX1ZFUlNJT047CisKKworCS8qIGFsbG9jYXRlIGZpcm13YXJlIGJ1ZmZlciAqLworICAgIHBGaXJtd2FyZUltYWdlID0ga21hbGxvYyhNQVhfRklSTVdBUkVfSU1BR0VfU0laRSwgTUVNX0FMTE9DX0ZMQUcpOworICAgIGlmIChwRmlybXdhcmVJbWFnZSA9PSBOVUxMKQorCXsKKwkJLyogYWxsb2NhdGUgZmFpbCwgdXNlIGRlZmF1bHQgZmlybXdhcmUgYXJyYXkgaW4gZmlybXdhcmUuaCAqLworCQlwcmludGsoIiVzIC0gQWxsb2NhdGUgbWVtb3J5IGZhaWwhXG4iLCBfX2Z1bmNfXyk7CisJCU5JQ0xGX0RFRkFVTFRfVVNFKCk7CisgICAgfQorCWVsc2UKKwl7CisJCS8qIGFsbG9jYXRlIG9rISB6ZXJvIHRoZSBmaXJtd2FyZSBidWZmZXIgKi8KKwkJbWVtc2V0KHBGaXJtd2FyZUltYWdlLCAweDAwLCBNQVhfRklSTVdBUkVfSU1BR0VfU0laRSk7CisJfSAvKiBFbmQgb2YgaWYgKi8KKworCisJLyogaWYgb2ssIHJlYWQgZmlybXdhcmUgZmlsZSBmcm9tICouYmluIGZpbGUgKi8KKwlpZiAoZmxnX2RlZmF1bHRfZmlybV91c2UgPT0gRkFMU0UpCisJeworCQlkbworCQl7CisJCQkvKiBvcGVuIHRoZSBiaW4gZmlsZSAqLworCQkJc3JjZiA9IGZpbHBfb3BlbihzcmMsIE9fUkRPTkxZLCAwKTsKKworCQkJaWYgKElTX0VSUihzcmNmKSkKKwkJCXsKKwkJCQlwcmludGsoIiVzIC0gRXJyb3IgJWxkIG9wZW5pbmcgJXNcbiIsCisJCQkJCSAgIF9fZnVuY19fLCAtUFRSX0VSUihzcmNmKSwgc3JjKTsKKwkJCQlOSUNMRl9ERUZBVUxUX1VTRSgpOworCQkJCWJyZWFrOworCQkJfSAvKiBFbmQgb2YgaWYgKi8KKworCQkJLyogdGhlIG9iamVjdCBtdXN0IGhhdmUgYSByZWFkIG1ldGhvZCAqLworCQkJaWYgKChzcmNmLT5mX29wID09IE5VTEwpIHx8IChzcmNmLT5mX29wLT5yZWFkID09IE5VTEwpKQorCQkJeworCQkJCXByaW50aygiJXMgLSAlcyBkb2VzIG5vdCBoYXZlIGEgd3JpdGUgbWV0aG9kXG4iLCBfX2Z1bmNfXywgc3JjKTsKKwkJCQlOSUNMRl9ERUZBVUxUX1VTRSgpOworCQkJCWJyZWFrOworCQkJfSAvKiBFbmQgb2YgaWYgKi8KKworCQkJLyogcmVhZCB0aGUgZmlybXdhcmUgZnJvbSB0aGUgZmlsZSAqLmJpbiAqLworCQkJRmlsZUxlbmd0aCA9IHNyY2YtPmZfb3AtPnJlYWQoc3JjZiwKKwkJCQkJCQkJCQkgIHBGaXJtd2FyZUltYWdlLAorCQkJCQkJCQkJCSAgTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUsCisJCQkJCQkJCQkJICAmc3JjZi0+Zl9wb3MpOworCisJCQlpZiAoRmlsZUxlbmd0aCAhPSBNQVhfRklSTVdBUkVfSU1BR0VfU0laRSkKKwkJCXsKKwkJCQlwcmludGsoIiVzOiBlcnJvciBmaWxlIGxlbmd0aCAoPSVkKSBpbiBSVDI4NjBBUC5CSU5cbiIsCisJCQkJCSAgIF9fZnVuY19fLCBGaWxlTGVuZ3RoKTsKKwkJCQlOSUNMRl9ERUZBVUxUX1VTRSgpOworCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCVBVQ0hBUiBwdHIgPSBwRmlybXdhcmVJbWFnZTsKKwkJCQlVU0hPUlQgY3JjID0gMHhmZmZmOworCisKKwkJCQkvKiBjYWxjdWxhdGUgZmlybXdhcmUgQ1JDICovCisJCQkJZm9yKGk9MDsgaTwoTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUtMik7IGkrKywgcHRyKyspCisJCQkJCWNyYyA9IEJ5dGVDUkMxNihCaXRSZXZlcnNlKCpwdHIpLCBjcmMpOworCQkJCS8qIEVuZCBvZiBmb3IgKi8KKworCQkJCWlmICgocEZpcm13YXJlSW1hZ2VbTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUtMl0gIT0gXAorCQkJCQkJCQkoVUNIQVIpQml0UmV2ZXJzZSgoVUNIQVIpKGNyYz4+OCkpKSB8fAorCQkJCQkocEZpcm13YXJlSW1hZ2VbTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUtMV0gIT0gXAorCQkJCQkJCQkoVUNIQVIpQml0UmV2ZXJzZSgoVUNIQVIpY3JjKSkpCisJCQkJeworCQkJCQkvKiBDUkMgZmFpbCAqLworCQkJCQlwcmludGsoIiVzOiBDUkMgPSAweCUwMnggMHglMDJ4ICIKKwkJCQkJCSAgICJlcnJvciwgc2hvdWxkIGJlIDB4JTAyeCAweCUwMnhcbiIsCisJCQkJCQkgICBfX2Z1bmNfXywKKwkJCQkJCSAgIHBGaXJtd2FyZUltYWdlW01BWF9GSVJNV0FSRV9JTUFHRV9TSVpFLTJdLAorCQkJCQkJICAgcEZpcm13YXJlSW1hZ2VbTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUtMV0sCisJCQkJCQkgICAoVUNIQVIpKGNyYz4+OCksIChVQ0hBUikoY3JjKSk7CisJCQkJCU5JQ0xGX0RFRkFVTFRfVVNFKCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQkvKiBmaXJtd2FyZSBpcyBvayAqLworCQkJCQlwQWQtPkZpcm13YXJlVmVyc2lvbiA9IFwKKwkJCQkJCShwRmlybXdhcmVJbWFnZVtNQVhfRklSTVdBUkVfSU1BR0VfU0laRS00XSA8PCA4KSArCisJCQkJCQlwRmlybXdhcmVJbWFnZVtNQVhfRklSTVdBUkVfSU1BR0VfU0laRS0zXTsKKworCQkJCQkvKiBjaGVjayBpZiBmaXJtd2FyZSB2ZXJzaW9uIG9mIHRoZSBmaWxlIGlzIHRvbyBvbGQgKi8KKwkJCQkJaWYgKChwQWQtPkZpcm13YXJlVmVyc2lvbikgPCBcCisJCQkJCQkJCQkJCSgoRklSTVdBUkVfTUFKT1JfVkVSU0lPTiA8PCA4KSArCisJCQkJCQkJCQkgIAkgCSBGSVJNV0FSRV9NSU5PUl9WRVJTSU9OKSkKKwkJCQkJeworCQkJCQkJcHJpbnRrKCIlczogZmlybXdhcmUgdmVyc2lvbiB0b28gb2xkIVxuIiwgX19mdW5jX18pOworCQkJCQkJTklDTEZfREVGQVVMVF9VU0UoKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9IC8qIEVuZCBvZiBpZiAqLworCQkJCX0gLyogRW5kIG9mIGlmICovCisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCSAoIk5JQ0xvYWRGaXJtd2FyZTogQ1JDIG9rLCB2ZXI9JWQuJWRcbiIsCisJCQkJCQkgIHBGaXJtd2FyZUltYWdlW01BWF9GSVJNV0FSRV9JTUFHRV9TSVpFLTRdLAorCQkJCQkJICBwRmlybXdhcmVJbWFnZVtNQVhfRklSTVdBUkVfSU1BR0VfU0laRS0zXSkpOworCQkJfSAvKiBFbmQgb2YgaWYgKEZpbGVMZW5ndGggPT0gTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUpICovCisJCQlicmVhazsKKwkJfSB3aGlsZShUUlVFKTsKKworCQkvKiBjbG9zZSBmaXJtd2FyZSBmaWxlICovCisJCWlmIChJU19FUlIoc3JjZikpCisJCQk7CisJCWVsc2UKKwkJeworCQkJcmV0dmFsID0gZmlscF9jbG9zZShzcmNmLCBOVUxMKTsKKwkJCWlmIChyZXR2YWwpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJCQkgKCItLT4gRXJyb3IgJWQgY2xvc2luZyAlc1xuIiwgLXJldHZhbCwgc3JjKSk7CisJCQl9IC8qIEVuZCBvZiBpZiAqLworCQl9IC8qIEVuZCBvZiBpZiAqLworCX0gLyogRW5kIG9mIGlmICovCisKKworCS8qIHdyaXRlIGZpcm13YXJlIHRvIEFTSUMgKi8KKwlpZiAoZmxnX2RlZmF1bHRfZmlybV91c2UgPT0gVFJVRSkKKwl7CisJCS8qIHVzZSBkZWZhdWx0IGZpbWV3YXJlLCBmcmVlIGFsbG9jYXRlZCBidWZmZXIgKi8KKwkJaWYgKHBGaXJtd2FyZUltYWdlICE9IE5VTEwpCisJCQlrZnJlZShwRmlybXdhcmVJbWFnZSk7CisJCS8qIEVuZCBvZiBpZiAqLworCisJCS8qIHVzZSBkZWZhdWx0ICouYmluIGFycmF5ICovCisJCXBGaXJtd2FyZUltYWdlID0gRmlybXdhcmVJbWFnZTsKKwkJRmlsZUxlbmd0aCA9IHNpemVvZihGaXJtd2FyZUltYWdlKTsKKwl9IC8qIEVuZCBvZiBpZiAqLworCisJLyogZW5hYmxlIEhvc3QgcHJvZ3JhbSByYW0gd3JpdGUgc2VsZWN0aW9uICovCisJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX1NZU19DVFJMLCAweDEwMDAwKTsKKworCWZvcihpPTA7IGk8RmlsZUxlbmd0aDsgaSs9NCkKKwl7CisJCWZpcm0gPSBwRmlybXdhcmVJbWFnZVtpXSArCisJCQkgICAocEZpcm13YXJlSW1hZ2VbaSszXSA8PCAyNCkgKworCQkJICAgKHBGaXJtd2FyZUltYWdlW2krMl0gPDwgMTYpICsKKwkJCSAgIChwRmlybXdhcmVJbWFnZVtpKzFdIDw8IDgpOworCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEZJUk1XQVJFX0lNQUdFX0JBU0UgKyBpLCBmaXJtKTsKKwl9IC8qIEVuZCBvZiBmb3IgKi8KKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgMHgwMDAwMCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX1NZU19DVFJMLCAweDAwMDAxKTsKKworCS8qIGluaXRpYWxpemUgQkJQIFIvVyBhY2Nlc3MgYWdlbnQgKi8KKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fQkJQX0FHRU5ULCAwKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9DU1IsIDApOworCisJaWYgKGZsZ19kZWZhdWx0X2Zpcm1fdXNlID09IEZBTFNFKQorCXsKKwkJLyogdXNlIGZpbGUgZmlybXdhcmUsIGZyZWUgYWxsb2NhdGVkIGJ1ZmZlciAqLworCQlpZiAocEZpcm13YXJlSW1hZ2UgIT0gTlVMTCkKKwkJCWtmcmVlKHBGaXJtd2FyZUltYWdlKTsKKwkJLyogRW5kIG9mIGlmICovCisJfSAvKiBFbmQgb2YgaWYgKi8KKworCXNldF9mcyhvcmdmcyk7CisJY3VycmVudC0+ZnN1aWQgPSBvcmdmc3VpZDsKKwljdXJyZW50LT5mc2dpZCA9IG9yZ2ZzZ2lkOworI2Vsc2UKKworCU5ESVNfU1RBVFVTCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCVBVQ0hBUgkJCXBGaXJtd2FyZUltYWdlOworCVVMT05HCQkJRmlsZUxlbmd0aCwgSW5kZXg7CisJLy9VTE9ORwkJCWZpcm07CisJVUlOVDMyCQkJTWFjUmVnID0gMDsKKyNpZmRlZiBSVDI4NzAKKwlVSU5UMzIJCQlWZXJzaW9uID0gKHBBZC0+TUFDVmVyc2lvbiA+PiAxNik7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwlwRmlybXdhcmVJbWFnZSA9IEZpcm13YXJlSW1hZ2U7CisJRmlsZUxlbmd0aCA9IHNpemVvZihGaXJtd2FyZUltYWdlKTsKKyNpZmRlZiBSVDI4NzAKKwkvLyBOZXcgOGsgYnl0ZSBmaXJtd2FyZSBzaXplIGZvciBSVDMwNzEvUlQzMDcyCisJLy9wcmludGsoIlVzYiBDaGlwXG4iKTsKKwlpZiAoRklSTVdBUkVJTUFHRV9MRU5HVEggPT0gRklSTVdBUkVJTUFHRV9NQVhfTEVOR1RIKQorCS8vVGhlIGZpcm13YXJlIGltYWdlIGNvbnNpc3RzIG9mIHR3byBwYXJ0cy4gT25lIGlzIHRoZSBvcmlnaWFubCBhbmQgdGhlIG90aGVyIGlzIHRoZSBuZXcuCisJLy9Vc2UgU2Vjb25kIFBhcnQKKwl7CisJCWlmICgoVmVyc2lvbiAhPSAweDI4NjApICYmIChWZXJzaW9uICE9IDB4Mjg3MikgJiYgKFZlcnNpb24gIT0gMHgzMDcwKSkKKwkJewkvLyBVc2UgRmlybXdhcmUgVjIuCisJCQkvL3ByaW50aygiS0g6VXNlIE5ldyBWZXJzaW9uLHBhcnQyXG4iKTsKKwkJCXBGaXJtd2FyZUltYWdlID0gKFBVQ0hBUikmRmlybXdhcmVJbWFnZVtGSVJNV0FSRUlNQUdFVjFfTEVOR1RIXTsKKwkJCUZpbGVMZW5ndGggPSBGSVJNV0FSRUlNQUdFVjJfTEVOR1RIOworCQl9CisJCWVsc2UKKwkJeworCQkJLy9wcmludGsoIktIOlVzZSBOZXcgVmVyc2lvbixwYXJ0MVxuIik7CisJCQlwRmlybXdhcmVJbWFnZSA9IEZpcm13YXJlSW1hZ2U7CisJCQlGaWxlTGVuZ3RoID0gRklSTVdBUkVJTUFHRVYxX0xFTkdUSDsKKwkJfQorCX0KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJLSDogYmluIGZpbGUgc2hvdWxkIGJlIDhLQi5cbiIpKTsKKwkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworI2lmIDAKKwkvKiBlbmFibGUgSG9zdCBwcm9ncmFtIHJhbSB3cml0ZSBzZWxlY3Rpb24gKi8KKwlSVDI4WFhfRklSTVVEX0lOSVQocEFkKTsKKworCWZvcihpPTA7IGk8RmlsZUxlbmd0aDsgaSs9NCkKKwl7CisJCWZpcm0gPSBwRmlybXdhcmVJbWFnZVtpXSArCisJCQkgICAocEZpcm13YXJlSW1hZ2VbaSszXSA8PCAyNCkgKworCQkJICAgKHBGaXJtd2FyZUltYWdlW2krMl0gPDwgMTYpICsKKwkJCSAgIChwRmlybXdhcmVJbWFnZVtpKzFdIDw8IDgpOworCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEZJUk1XQVJFX0lNQUdFX0JBU0UgKyBpLCBmaXJtKTsKKwl9IC8qIEVuZCBvZiBmb3IgKi8KKworCVJUMjhYWF9GSVJNVURfRU5EKHBBZCk7CisjZWxzZQorCVJUMjhYWF9XUklURV9GSVJNV0FSRShwQWQsIHBGaXJtd2FyZUltYWdlLCBGaWxlTGVuZ3RoKTsKKyNlbmRpZgorCisjZW5kaWYKKworCS8qIGNoZWNrIGlmIE1DVSBpcyByZWFkeSAqLworCUluZGV4ID0gMDsKKwlkbworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBQQkZfU1lTX0NUUkwsICZNYWNSZWcpOworCisJCWlmIChNYWNSZWcgJiAweDgwKQorCQkJYnJlYWs7CisKKwkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKwl9IHdoaWxlIChJbmRleCsrIDwgMTAwMCk7CisKKyAgICBpZiAoSW5kZXggPj0gMTAwMCkKKwl7CisJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIk5JQ0xvYWRGaXJtd2FyZTogTUNVIGlzIG5vdCByZWFkeVxuXG5cbiIpKTsKKwl9IC8qIEVuZCBvZiBpZiAqLworCisjaWYgMAorICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiPD09PSAlcyAoc3JjPSVzLCBzdGF0dXM9JWQpXG4iLCBfX2Z1bmNfXywgc3JjLCBTdGF0dXMpKTsKKyNlbHNlCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCI8PT09ICVzIChzdGF0dXM9JWQpXG4iLCBfX2Z1bmNfXywgU3RhdHVzKSk7CisjZW5kaWYKKyAgICByZXR1cm4gU3RhdHVzOworfSAvKiBFbmQgb2YgTklDTG9hZEZpcm13YXJlICovCisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUxvYWQgVHggcmF0ZSBzd2l0Y2hpbmcgcGFyYW1ldGVycworCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NUQVRVU19TVUNDRVNTICAgICAgICAgZmlybXdhcmUgaW1hZ2UgbG9hZCBvaworCQlORElTX1NUQVRVU19GQUlMVVJFICAgICAgICAgaW1hZ2Ugbm90IGZvdW5kCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJUmF0ZSBUYWJsZSBGb3JtYXQ6CisJCTEuIChCMDogVmFsaWQgSXRlbSBudW1iZXIpIChCMTpJbml0aWFsIGl0ZW0gZnJvbSB6ZXJvKQorCQkyLiBJdGVtIE51bWJlcihEZWMpICAgICAgTW9kZShIZXgpICAgICBDdXJyZW50IE1DUyhEZWMpICAgIFRyYWluVXAoRGVjKSAgICBUcmFpbkRvd24oRGVjKQorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTkRJU19TVEFUVVMgTklDTG9hZFJhdGVTd2l0Y2hpbmdQYXJhbXMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisjaWYgMAorCU5ESVNfU1RBVFVTIFN0YXR1czsKKworCU5ESVNfSEFORExFIEZpbGVIYW5kbGU7CisJVUlOVCBGaWxlTGVuZ3RoID0gMCwgaSwgajsKKwlQVUNIQVIgcEZpcm13YXJlSW1hZ2U7CisJTkRJU19TVFJJTkcgRmlsZU5hbWU7CisJTkRJU19QSFlTSUNBTF9BRERSRVNTIEhpZ2hlc3RBY2NlcHRhYmxlTWF4ID0gTkRJU19QSFlTSUNBTF9BRERSRVNTX0NPTlNUKC0xLCAtMSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIj09PT4gTklDTG9hZFJhdGVTd2l0Y2hpbmdQYXJhbXMgXG4iKSk7CisJcEFkLT5Db21tb25DZmcuVHhSYXRlVGFibGVTaXplID0gMDsKKworCWlmICgocEFkLT5EZXZpY2VJRCA9PSBOSUMyODYwX1BDSV9ERVZJQ0VfSUQpIHx8IChwQWQtPkRldmljZUlEID09IE5JQzI4NjBfUENJZV9ERVZJQ0VfSUQpKQorCXsKKwkJTmRpc0luaXRpYWxpemVTdHJpbmcoJkZpbGVOYW1lLCJyYXRlLmJpbiIpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOSUNMb2FkUmF0ZVN3aXRjaGluZ1BhcmFtczogbG9hZCBmaWxlIC0gcmF0ZS5iaW4gZm9yIHR4IHJhdGUgc3dpdGNoIFxuIikpOworCX0KKwllbHNlCisJeworCQlEQkdQUklOVF9FUlIoKCJOSUNMb2FkUmF0ZVN3aXRjaGluZ1BhcmFtczogd3JvbmcgRGV2aWNlSUQgPSAweCUwNHgsIGNhbid0IGZpbmQgVHggcmF0ZSBzd2l0Y2ggcGFyYW1ldGVycyBmaWxlXG4iLCBwQWQtPkRldmljZUlEKSk7CisJCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworCX0KKwlOZGlzT3BlbkZpbGUoJlN0YXR1cywgJkZpbGVIYW5kbGUsICZGaWxlTGVuZ3RoLCAmRmlsZU5hbWUsIEhpZ2hlc3RBY2NlcHRhYmxlTWF4KTsKKwlOZGlzRnJlZVN0cmluZyhGaWxlTmFtZSk7CisKKwlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJOSUNMb2FkUmF0ZVN3aXRjaGluZ1BhcmFtczogTmRpc09wZW5GaWxlKCkgZmFpbGVkLCB1c2VkIFJhdGVTd2l0Y2hUYWJsZSBpbnN0ZWFkXG4iKSk7CisJCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworCX0KKworCWlmICgoRmlsZUxlbmd0aCA9PSAwKSB8fCAoRmlsZUxlbmd0aCA+IChNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCsxKSoxNikpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJOSUNMb2FkUmF0ZVN3aXRjaGluZ1BhcmFtczogZmlsZSBzaXplIGlzIG5vdCByZWFzb25hYmxlLCB1c2VkIFJhdGVTd2l0Y2hUYWJsZSBpbnN0ZWFkXG4iKSk7CisKKwkJTmRpc0Nsb3NlRmlsZShGaWxlSGFuZGxlKTsKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJfQorCWVsc2UKKwl7CisJCS8vCisJCS8vIE5ESVNfU1RBVFVTX1NVQ0NFU1MgbWVhbnMKKwkJLy8gVGhlIGhhbmRsZSBhdCBGaWxlSGFuZGxlIGlzIHZhbGlkIGZvciBhIHN1YnNlcXVlbnQgY2FsbCB0byBOZGlzTWFwRmlsZS4KKwkJLy8KKwkJTmRpc01hcEZpbGUoJlN0YXR1cywgJnBGaXJtd2FyZUltYWdlLCBGaWxlSGFuZGxlKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTmRpc01hcEZpbGUgRmlsZUxlbmd0aD0lZFxuIiwgRmlsZUxlbmd0aCkpOworCX0KKworCWZvciAoaT0wLCBqPTA7IGk8RmlsZUxlbmd0aDsgaSsrKQorCXsKKwkJaWYgKChpJTE2KSA8PSA0KQkvLyB0cmltIHJlc2VydmVkIGZpZWxkCisJCXsKKwkJCWlmIChpJTE2ID09IDEpCS8vIGRlYWwgd2l0aCBERUMgYW5kIEhFWCwgb25seSByb3cwIGlzIEhleCwgb3RoZXJzIGFyZSBEZWMKKwkJCXsKKwkJCQlSYXRlU3dpdGNoVGFibGVbal0gPSAqKHBGaXJtd2FyZUltYWdlICsgaSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJUmF0ZVN3aXRjaFRhYmxlW2pdID0gKCoocEZpcm13YXJlSW1hZ2UgKyBpKT4+NCkgKiAxMCArICgqKHBGaXJtd2FyZUltYWdlICsgaSkgJiAweDBGKTsKKwkJCX0KKworCQkJaisrOworCQl9CisJfQorCisJcEFkLT5Db21tb25DZmcuVHhSYXRlVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlWzBdOwkJLy8gYmFja3VwIHRhYmxlIHNpemUKKworCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCU5kaXNVbm1hcEZpbGUoRmlsZUhhbmRsZSk7CisJCU5kaXNDbG9zZUZpbGUoRmlsZUhhbmRsZSk7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCI8PT09IE5JQ0xvYWRSYXRlU3dpdGNoaW5nUGFyYW1zKFZhbGlkIFR4UmF0ZVRhYmxlIGl0ZW0gbnVtYmVyPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuVHhSYXRlVGFibGVTaXplKSk7CisjZW5kaWYKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCWlmICBwU3JjMSBhbGwgemVybyB3aXRoIGxlbmd0aCBMZW5ndGgsIHJldHVybiAwLgorCQlJZiBub3QgYWxsIHplcm8sIHJldHVybiAxCisKKwlBcmd1bWVudHM6CisJCXBTcmMxCisKKwlSZXR1cm4gVmFsdWU6CisJCTE6CQkJbm90IGFsbCB6ZXJvCisJCTA6CQkJYWxsIHplcm8KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1VMT05HCVJUTVBOb3RBbGxaZXJvKAorCUlOCVBWT0lECXBTcmMxLAorCUlOCVVMT05HCUxlbmd0aCkKK3sKKwlQVUNIQVIJcE1lbTE7CisJVUxPTkcJSW5kZXggPSAwOworCisJcE1lbTEgPSAoUFVDSEFSKSBwU3JjMTsKKworCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IExlbmd0aDsgSW5kZXgrKykKKwl7CisJCWlmIChwTWVtMVtJbmRleF0gIT0gMHgwKQorCQl7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChJbmRleCA9PSBMZW5ndGgpCisJeworCQlyZXR1cm4gKDApOworCX0KKwllbHNlCisJeworCQlyZXR1cm4gKDEpOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNvbXBhcmUgdHdvIG1lbW9yeSBibG9jaworCisJQXJndW1lbnRzOgorCQlwU3JjMQkJUG9pbnRlciB0byBmaXJzdCBtZW1vcnkgYWRkcmVzcworCQlwU3JjMgkJUG9pbnRlciB0byBzZWNvbmQgbWVtb3J5IGFkZHJlc3MKKworCVJldHVybiBWYWx1ZToKKwkJMDoJCQltZW1vcnkgaXMgZXF1YWwKKwkJMToJCQlwU3JjMSBtZW1vcnkgaXMgbGFyZ2VyCisJCTI6CQkJcFNyYzIgbWVtb3J5IGlzIGxhcmdlcgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVUxPTkcJUlRNUENvbXBhcmVNZW1vcnkoCisJSU4JUFZPSUQJcFNyYzEsCisJSU4JUFZPSUQJcFNyYzIsCisJSU4JVUxPTkcJTGVuZ3RoKQoreworCVBVQ0hBUglwTWVtMTsKKwlQVUNIQVIJcE1lbTI7CisJVUxPTkcJSW5kZXggPSAwOworCisJcE1lbTEgPSAoUFVDSEFSKSBwU3JjMTsKKwlwTWVtMiA9IChQVUNIQVIpIHBTcmMyOworCisJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTGVuZ3RoOyBJbmRleCsrKQorCXsKKwkJaWYgKHBNZW0xW0luZGV4XSA+IHBNZW0yW0luZGV4XSkKKwkJCXJldHVybiAoMSk7CisJCWVsc2UgaWYgKHBNZW0xW0luZGV4XSA8IHBNZW0yW0luZGV4XSkKKwkJCXJldHVybiAoMik7CisJfQorCisJLy8gRXF1YWwKKwlyZXR1cm4gKDApOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJWmVybyBvdXQgbWVtb3J5IGJsb2NrCisKKwlBcmd1bWVudHM6CisJCXBTcmMxCQlQb2ludGVyIHRvIG1lbW9yeSBhZGRyZXNzCisJCUxlbmd0aAkJU2l6ZQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFplcm9NZW1vcnkoCisJSU4JUFZPSUQJcFNyYywKKwlJTglVTE9ORwlMZW5ndGgpCit7CisJUFVDSEFSCXBNZW07CisJVUxPTkcJSW5kZXggPSAwOworCisJcE1lbSA9IChQVUNIQVIpIHBTcmM7CisKKwlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBMZW5ndGg7IEluZGV4KyspCisJeworCQlwTWVtW0luZGV4XSA9IDB4MDA7CisJfQorfQorCitWT0lECVJUTVBGaWxsTWVtb3J5KAorCUlOCVBWT0lECXBTcmMsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCVVDSEFSCUZpbGwpCit7CisJUFVDSEFSCXBNZW07CisJVUxPTkcJSW5kZXggPSAwOworCisJcE1lbSA9IChQVUNIQVIpIHBTcmM7CisKKwlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBMZW5ndGg7IEluZGV4KyspCisJeworCQlwTWVtW0luZGV4XSA9IEZpbGw7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ29weSBkYXRhIGZyb20gbWVtb3J5IGJsb2NrIDEgdG8gbWVtb3J5IGJsb2NrIDIKKworCUFyZ3VtZW50czoKKwkJcERlc3QJCVBvaW50ZXIgdG8gZGVzdGluYXRpb24gbWVtb3J5IGFkZHJlc3MKKwkJcFNyYwkJUG9pbnRlciB0byBzb3VyY2UgbWVtb3J5IGFkZHJlc3MKKwkJTGVuZ3RoCQlDb3B5IHNpemUKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBNb3ZlTWVtb3J5KAorCU9VVAlQVk9JRAlwRGVzdCwKKwlJTglQVk9JRAlwU3JjLAorCUlOCVVMT05HCUxlbmd0aCkKK3sKKwlQVUNIQVIJcE1lbTE7CisJUFVDSEFSCXBNZW0yOworCVVJTlQJSW5kZXg7CisKKwlBU1NFUlQoKExlbmd0aD09MCkgfHwgKHBEZXN0ICYmIHBTcmMpKTsKKworCXBNZW0xID0gKFBVQ0hBUikgcERlc3Q7CisJcE1lbTIgPSAoUFVDSEFSKSBwU3JjOworCisJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTGVuZ3RoOyBJbmRleCsrKQorCXsKKwkJcE1lbTFbSW5kZXhdID0gcE1lbTJbSW5kZXhdOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUluaXRpYWxpemUgcG9ydCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJVXNlckNmZ0luaXQoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQpCit7CisvLwlFRENBX1BBUk0gRGVmYXVsdEVkY2FQYXJtOworICAgIFVJTlQga2V5X2luZGV4LCBic3NfaW5kZXg7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gVXNlckNmZ0luaXRcbiIpKTsKKworCS8vCisJLy8gIHBhcnQgSS4gaW50aWFsaXplIGNvbW1vbiBjb25maWd1cmF0aW9uCisJLy8KKyNpZmRlZiBSVDI4NzAKKwlwQWQtPkJ1bGtPdXRSZXEgPSAwOworCisJcEFkLT5CdWxrT3V0Q29tcGxldGUgPSAwOworCXBBZC0+QnVsa091dENvbXBsZXRlT3RoZXIgPSAwOworCXBBZC0+QnVsa091dENvbXBsZXRlQ2FuY2VsID0gMDsKKwlwQWQtPkJ1bGtJblJlcSA9IDA7CisJcEFkLT5CdWxrSW5Db21wbGV0ZSA9IDA7CisJcEFkLT5CdWxrSW5Db21wbGV0ZUZhaWwgPSAwOworCisJLy9wQWQtPlF1aWNrVGltZXJQID0gMTAwOworCS8vcEFkLT5UdXJuQWdnckJ1bGtJbkNvdW50ID0gMDsKKwlwQWQtPmJVc2JUeEJ1bGtBZ2dyZSA9IDA7CisKKwkvLyBpbml0IGFzIHVuc2VkIHZhbHVlIHRvIGVuc3VyZSBkcml2ZXIgd2lsbCBzZXQgdG8gTUNVIG9uY2UuCisJcEFkLT5MZWRJbmRpY2F0b3JTdHJlZ3RoID0gMHhGRjsKKworCXBBZC0+Q29tbW9uQ2ZnLk1heFBrdE9uZVR4QnVsayA9IDI7CisJcEFkLT5Db21tb25DZmcuVHhCdWxrRmFjdG9yID0gMTsKKwlwQWQtPkNvbW1vbkNmZy5SeEJ1bGtGYWN0b3IgPTE7CisKKwlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyID0gMTAwOyAvL21XCisKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybSwgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0pKTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCWZvcihrZXlfaW5kZXg9MDsga2V5X2luZGV4PFNIQVJFX0tFWV9OVU07IGtleV9pbmRleCsrKQorCXsKKwkJZm9yKGJzc19pbmRleCA9IDA7IGJzc19pbmRleCA8IE1BWF9NQlNTSURfTlVNOyBic3NfaW5kZXgrKykKKwkJeworCQkJcEFkLT5TaGFyZWRLZXlbYnNzX2luZGV4XVtrZXlfaW5kZXhdLktleUxlbiA9IDA7CisJCQlwQWQtPlNoYXJlZEtleVtic3NfaW5kZXhdW2tleV9pbmRleF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJCX0KKwl9CisKKwlwQWQtPkFudGVubmEud29yZCA9IDA7CisJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfMjA7CisKKwlwQWQtPkxlZENudGwud29yZCA9IDA7CisKKwlwQWQtPmJBdXRvVHhBZ2NBID0gRkFMU0U7CQkJLy8gRGVmYXVsdCBpcyBPRkYKKwlwQWQtPmJBdXRvVHhBZ2NHID0gRkFMU0U7CQkJLy8gRGVmYXVsdCBpcyBPRkYKKwlwQWQtPlJmSWNUeXBlID0gUkZJQ18yODIwOworCisJLy8gSW5pdCB0aW1lciBmb3IgcmVzZXQgY29tcGxldGUgZXZlbnQKKwlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IDE7CisJcEFkLT5iRm9yY2VQcmludFRYID0gRkFMU0U7CisJcEFkLT5iRm9yY2VQcmludFJYID0gRkFMU0U7CisJcEFkLT5iU3RhRmlmb1Rlc3QgPSBGQUxTRTsKKwlwQWQtPmJQcm90ZWN0aW9uVGVzdCA9IEZBTFNFOworCXBBZC0+YkhDQ0FUZXN0ID0gRkFMU0U7CisJcEFkLT5iR2VuT25lSENDQSA9IEZBTFNFOworCXBBZC0+Q29tbW9uQ2ZnLkRzaWZzID0gMTA7ICAgICAgLy8gaW4gdW5pdHMgb2YgdXNlYworCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXIgPSAxMDA7IC8vbVcKKwlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IDB4ZmZmZmZmZmY7IC8vIEFVVE8KKwlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdCA9IDB4ZmZmZmZmZmY7IC8vIEFVVE8KKwlwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUnQ4MDJfMTFQcmVhbWJsZUF1dG87IC8vIHVzZSBMb25nIHByZWFtYmxlIG9uIFRYIGJ5IGRlZmF1dAorCXBBZC0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBGQUxTRTsKKwlwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPSAyMzQ3OworCXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gMjM0NjsKKwlwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSAwOyAgICAvLyAwOiBBVVRPCisJcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBUUlVFOyAvLzA7CisJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IDB4ZmY7ICAgICAvLyB1bmtub3duCisJcEFkLT5Db21tb25DZmcuQmFuZFN0YXRlID0gVU5LTk9XTl9CQU5EOworCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNTUGVyaW9kID0gMTA7CisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ1NDb3VudCA9IDA7CisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlID0gUkRfTk9STUFMX01PREU7CisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ2hNb3ZpbmdUaW1lID0gNjU7CisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuTG9uZ1B1bHNlUmFkYXJUaCA9IDM7CisJcEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlID0gRkFMU0U7CisJcEFkLT5Db21tb25DZmcuYk5lZWRTZW5kVHJpZ2dlckZyYW1lID0gRkFMU0U7CisJcEFkLT5Db21tb25DZmcuVHJpZ2dlclRpbWVyQ291bnQgPSAwOworCXBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUgPSBGQUxTRTsKKwlwQWQtPkNvbW1vbkNmZy5iQ291bnRyeUZsYWcgPSBGQUxTRTsKKwlwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9IDA7CisJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSAwOworCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+QmVhY29uVHhXSSwgc2l6ZW9mKHBBZC0+QmVhY29uVHhXSSkpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSkpOworCXBBZC0+SFRDRW5hYmxlID0gRkFMU0U7CisJcEFkLT5iQnJvYWRDb21IVCA9IEZBTFNFOworCXBBZC0+Q29tbW9uQ2ZnLmJSZGcgPSBGQUxTRTsKKworI2lmZGVmIERPVDExTl9EUkFGVDMKKwlwQWQtPkNvbW1vbkNmZy5Eb3QxMU9Cc3NTY2FuUGFzc2l2ZUR3ZWxsID0gZG90MTFPQlNTU2NhblBhc3NpdmVEd2VsbDsJLy8gVW5pdCA6IFRVLiA1fjEwMDAKKwlwQWQtPkNvbW1vbkNmZy5Eb3QxMU9Cc3NTY2FuQWN0aXZlRHdlbGwgPSBkb3QxMU9CU1NTY2FuQWN0aXZlRHdlbGw7CS8vIFVuaXQgOiBUVS4gMTB+MTAwMAorCXBBZC0+Q29tbW9uQ2ZnLkRvdDExQnNzV2lkdGhUcmlnZ2VyU2NhbkludCA9IGRvdDExQlNTV2lkdGhUcmlnZ2VyU2NhbkludGVydmFsOwkvLyBVbml0IDogU2Vjb25kCisJcEFkLT5Db21tb25DZmcuRG90MTFPQnNzU2NhblBhc3NpdmVUb3RhbFBlckNoYW5uZWwgPSBkb3QxMU9CU1NTY2FuUGFzc2l2ZVRvdGFsUGVyQ2hhbm5lbDsJLy8gVW5pdCA6IFRVLiAyMDB+MTAwMDAKKwlwQWQtPkNvbW1vbkNmZy5Eb3QxMU9Cc3NTY2FuQWN0aXZlVG90YWxQZXJDaGFubmVsID0gZG90MTFPQlNTU2NhbkFjdGl2ZVRvdGFsUGVyQ2hhbm5lbDsJLy8gVW5pdCA6IFRVLiAyMH4xMDAwMAorCXBBZC0+Q29tbW9uQ2ZnLkRvdDExQnNzV2lkdGhDaGFuVHJhbkRlbGF5RmFjdG9yID0gZG90MTFCU1NXaWR0aENoYW5uZWxUcmFuc2FjdGlvbkRlbGF5RmFjdG9yOworCXBBZC0+Q29tbW9uQ2ZnLkRvdDExT0Jzc1NjYW5BY3Rpdml0eVRocmUgPSBkb3QxMUJTU1NjYW5BY3Rpdml0eVRocmVzaG9sZDsJLy8gVW5pdCA6IHBlcmNlbnRhZ2UKKwlwQWQtPkNvbW1vbkNmZy5Eb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheSA9IChwQWQtPkNvbW1vbkNmZy5Eb3QxMUJzc1dpZHRoVHJpZ2dlclNjYW5JbnQgKiBwQWQtPkNvbW1vbkNmZy5Eb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheUZhY3Rvcik7CisjZW5kaWYgIC8vIERPVDExTl9EUkFGVDMgLy8KKworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8sIHNpemVvZihwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8pKTsKKwlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSBNTVBTX0VOQUJMRTsKKwlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkgPSAwOworCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPSBJTU1FRF9CQTsKKwlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gNjQ7IC8vMzI7CisJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlR4QkFXaW5MaW1pdCA9IDY0OyAvLzMyOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBVc2VyQ2ZnSW5pdC4gQkFDYXBhYmlsaXR5ID0gMHgleFxuIiwgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LndvcmQpKTsKKworCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBGQUxTRTsKKwlCQVRhYmxlSW5pdChwQWQsICZwQWQtPkJBVGFibGUpOworCisJcEFkLT5Db21tb25DZmcuYkV4dENoYW5uZWxTd2l0Y2hBbm5vdW5jZW1lbnQgPSAxOworCXBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QgPSAxOworCXBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUgPSBUUlVFOworCXBBZC0+Q29tbW9uQ2ZnLmJCQURlY2xpbmUgPSBGQUxTRTsKKwlwQWQtPkNvbW1vbkNmZy5iRGlzYWJsZVJlb3JkZXJpbmcgPSBGQUxTRTsKKworCXBBZC0+Q29tbW9uQ2ZnLlR4QkFTaXplID0gNzsKKworCXBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS53b3JkID0gcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LndvcmQ7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkvL3BBZC0+Q29tbW9uQ2ZnLkhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOworCS8vcEFkLT5Db21tb25DZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyA9IE1DU19BVVRPOworCS8vcEFkLT5Db21tb25DZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7CisJLy9wQWQtPkNvbW1vbkNmZy5IVFBoeU1vZGUuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKKwlwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPSBSQVRFXzY7CisKKwlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gTUNTX1JBVEVfNjsKKwlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuQlcgPSBCV18yMDsKKwlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKworCXBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA9IDEwMDsgICAgIC8vIGluIG1TZWMKKworCS8vCisJLy8gcGFydCBJSS4gaW50aWFsaXplIFNUQSBzcGVjaWZpYyBjb25maWd1cmF0aW9uCisJLy8KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJUlhfRklMVEVSX1NFVF9GTEFHKHBBZCwgZlJYX0ZJTFRFUl9BQ0NFUFRfRElSRUNUKTsKKwkJUlhfRklMVEVSX0NMRUFSX0ZMQUcocEFkLCBmUlhfRklMVEVSX0FDQ0VQVF9NVUxUSUNBU1QpOworCQlSWF9GSUxURVJfU0VUX0ZMQUcocEFkLCBmUlhfRklMVEVSX0FDQ0VQVF9CUk9BRENBU1QpOworCQlSWF9GSUxURVJfU0VUX0ZMQUcocEFkLCBmUlhfRklMVEVSX0FDQ0VQVF9BTExfTVVMVElDQVNUKTsKKworCQlwQWQtPlN0YUNmZy5Qc20gPSBQV1JfQUNUSVZFOworCisJCXBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkOworCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZDsKKwkJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkOworCQlwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyID0gRkFMU0U7CisJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IDA7CisKKwkJLy8gODAyLjF4IHBvcnQgY29udHJvbAorCQlwQWQtPlN0YUNmZy5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXI4MDIxeFdFUDsKKwkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisJCXBBZC0+U3RhQ2ZnLkxhc3RNaWNFcnJvclRpbWUgPSAwOworCQlwQWQtPlN0YUNmZy5NaWNFcnJDbnQgICAgICAgID0gMDsKKwkJcEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgICAgICA9IEZBTFNFOworCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSAgICAgICAgID0gU1NfTk9UVVNFOworCisJCXBBZC0+Q29tbW9uQ2ZnLk5kaXNSYWRpb1N0YXRlT2ZmID0gRkFMU0U7CQkvLyBOZXcgdG8gc3VwcG9ydCBtaWNyb3NvZnQgZGlzYWJsZSByYWRpbyB3aXRoIE9JRCBjb21tYW5kCisKKwkJcEFkLT5TdGFDZmcuUnNzaVRyaWdnZXIgPSAwOworCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5TdGFDZmcuUnNzaVNhbXBsZSwgc2l6ZW9mKFJTU0lfU0FNUExFKSk7CisJCXBBZC0+U3RhQ2ZnLlJzc2lUcmlnZ2VyTW9kZSA9IFJTU0lfVFJJR0dFUkVEX1VQT05fQkVMT1dfVEhSRVNIT0xEOworCQlwQWQtPlN0YUNmZy5BdGltV2luID0gMDsKKwkJcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gMzsvL2RlZmF1bHQgbGlzdGVuIGNvdW50OworCQlwQWQtPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0lORlJBOyAgLy8gQlNTX0lORlJBIG9yIEJTU19BREhPQyBvciBCU1NfTU9OSVRPUgorCQlwQWQtPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7CisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpOworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19XQUtFVVBfTk9XKTsKKworCQlwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IFRSVUU7CisJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTX0FVVE87CisJfQorCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCXBBZC0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlID0gUnQ4MDJfMTFfRF9Ob25lOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIGdsb2JhbCB2YXJpYWJsZXMgbVhYWFggdXNlZCBpbiBNQUMgcHJvdG9jb2wgc3RhdGUgbWFjaGluZXMKKwlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKKwlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19BREhPQ19PTik7CisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfSU5GUkFfT04pOworCisJLy8gUEhZIHNwZWNpZmljYXRpb24KKwlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gUEhZXzExQkdfTUlYRUQ7CQkvLyBkZWZhdWx0IFBIWSBtb2RlCisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsgIC8vIENDSyB1c2UgTE9ORyBwcmVhbWJsZQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwl7CisJCS8vIHVzZXIgZGVzaXJlZCBwb3dlciBtb2RlCisJCXBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNOworCQlwQWQtPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVDQU07CisJCXBBZC0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPSBGQUxTRTsKKworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkvLyBDQ1ggdjEuMCByZWxlYXRlZCBpbml0IHZhbHVlCisJCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5TdGFDZmcuTGVhcEF1dGhUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKExlYXBBdXRoVGltZW91dCksIHBBZCwgRkFMU0UpOworCQlwQWQtPlN0YUNmZy5MZWFwQXV0aE1vZGUgPSBDSVNDT19BdXRoTW9kZUxFQVBOb25lOworCQlwQWQtPlN0YUNmZy5iQ2tpcE9uID0gRkFMU0U7CisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisKKwkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMpLCBwQWQsIEZBTFNFKTsKKwkJcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nID0gRkFMU0U7CisKKwkJLy8gUGF0Y2ggZm9yIE5kdGVzdAorCQlwQWQtPlN0YUNmZy5TY2FuQ250ID0gMDsKKworCQkvLyBDQ1ggMi4wIGNvbnRyb2wgZmxhZyBpbml0CisJCXBBZC0+U3RhQ2ZnLkNDWEVuYWJsZSA9IEZBTFNFOworCQlwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlID0gTVNSTl9UWVBFX1VOVVNFRDsKKwkJcEFkLT5TdGFDZmcuQ0NYUW9zRUNXTWluCT0gNDsKKwkJcEFkLT5TdGFDZmcuQ0NYUW9zRUNXTWF4CT0gMTA7CisKKwkJcEFkLT5TdGFDZmcuYkh3UmFkaW8gID0gVFJVRTsgLy8gRGVmYXVsdCBIYXJkd2FyZSBSYWRpbyBzdGF0dXMgaXMgT24KKwkJcEFkLT5TdGFDZmcuYlN3UmFkaW8gID0gVFJVRTsgLy8gRGVmYXVsdCBTb2Z0d2FyZSBSYWRpbyBzdGF0dXMgaXMgT24KKwkJcEFkLT5TdGFDZmcuYlJhZGlvICAgID0gVFJVRTsgLy8gYkh3UmFkaW8gJiYgYlN3UmFkaW8KKwkJcEFkLT5TdGFDZmcuYkhhcmR3YXJlUmFkaW8gPSBGQUxTRTsJCS8vIERlZmF1bHQgaXMgT0ZGCisJCXBBZC0+U3RhQ2ZnLmJTaG93SGlkZGVuU1NJRCA9IEZBTFNFOwkJLy8gRGVmYXVsdCBubyBzaG93CisKKwkJLy8gTml0cm8gbW9kZSBjb250cm9sCisJCXBBZC0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID0gVFJVRTsKKworCQkvLyBTYXZlIHRoZSBpbml0IHRpbWUgYXMgbGFzdCBzY2FuIHRpbWUsIHRoZSBzeXN0ZW0gc2hvdWxkIGRvIHNjYW4gYWZ0ZXIgMiBzZWNvbmRzLgorCQkvLyBUaGlzIHBhdGNoIGlzIGZvciBkcml2ZXIgd2FrZSB1cCBmcm9tIHN0YW5kYnkgbW9kZSwgc3lzdGVtIHdpbGwgZG8gc2NhbiByaWdodCBhd2F5LgorCQlwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgPSAwOworCQlOZGlzWmVyb01lbW9yeShwQWQtPm5pY2tuYW1lLCBJV19FU1NJRF9NQVhfU0laRSsxKTsKKwkJc3ByaW50ZihwQWQtPm5pY2tuYW1lLCAiJXMiLCBTVEFfTklDX0RFVklDRV9OQU1FKTsKKwkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPlN0YUNmZy5XcGFEaXNhc3NvY0FuZEJsb2NrQXNzb2NUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKFdwYURpc2Fzc29jQXBBbmRCbG9ja0Fzc29jKSwgcEFkLCBGQUxTRSk7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQlwQWQtPlN0YUNmZy5JRUVFODAyMVggPSBGQUxTRTsKKwkJcEFkLT5TdGFDZmcuSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMgPSBGQUxTRTsKKwkJcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRTsKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQlwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSBXUEFfU1VQUExJQ0FOVF9FTkFCTEU7CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLyBEZWZhdWx0IGZvciBleHRyYSBpbmZvcm1hdGlvbiBpcyBub3QgdmFsaWQKKwlwQWQtPkV4dHJhSW5mbyA9IEVYVFJBX0lORk9fQ0xFQVI7CisKKwkvLyBEZWZhdWx0IENvbmZpZyBjaGFuZ2UgZmxhZworCXBBZC0+YkNvbmZpZ0NoYW5nZWQgPSBGQUxTRTsKKworCS8vCisJLy8gcGFydCBJSUkuIEFQIGNvbmZpZ3VyYXRpb25zCisJLy8KKworCisJLy8KKwkvLyBwYXJ0IElWLiBvdGhlcnMKKwkvLworCS8vIGR5bmFtaWMgQkJQIFI2NjpzZW5zaWJpdHkgdHVuaW5nIHRvIG92ZXJjb21lIGJhY2tncm91bmQgbm9pc2UKKwlwQWQtPkJicFR1bmluZy5iRW5hYmxlICAgICAgICAgICAgICAgID0gVFJVRTsKKwlwQWQtPkJicFR1bmluZy5GYWxzZUNjYUxvd2VyVGhyZXNob2xkID0gMTAwOworCXBBZC0+QmJwVHVuaW5nLkZhbHNlQ2NhVXBwZXJUaHJlc2hvbGQgPSA1MTI7CisJcEFkLT5CYnBUdW5pbmcuUjY2RGVsdGEgICAgICAgICAgICAgICA9IDQ7CisJcEFkLT5NbG1lLmJFbmFibGVBdXRvQW50ZW5uYUNoZWNrID0gVFJVRTsKKworCS8vCisJLy8gQWxzbyBpbml0aWFsIFI2NkN1cnJlbnRWYWx1ZSwgUlRVU0JSZXN1bWVNc2R1VHJhbnNtaXNzaW9uIG1pZ2h0IHVzZSB0aGlzIHZhbHVlLgorCS8vIGlmIG5vdCBpbml0aWFsIHRoaXMgdmFsdWUsIHRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgMC4KKwkvLworCXBBZC0+QmJwVHVuaW5nLlI2NkN1cnJlbnRWYWx1ZSA9IDB4Mzg7CisKKwlwQWQtPkJicDk0ID0gQkJQUjk0X0RFRkFVTFQ7CisJcEFkLT5CYnBGb3JDQ0sgPSBGQUxTRTsKKworCS8vIERlZmF1bHQgaXMgRkFMU0UgZm9yIHRlc3QgYml0IDEKKwkvL3BBZC0+YlRlc3QxID0gRkFMU0U7CisKKwkvLyBpbml0aWFsaXplIE1BQyB0YWJsZSBhbmQgYWxsb2NhdGUgc3BpbiBsb2NrCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWFjVGFiLCBzaXplb2YoTUFDX1RBQkxFKSk7CisJSW5pdGlhbGl6ZVF1ZXVlSGVhZGVyKCZwQWQtPk1hY1RhYi5NY2FzdFBzUXVldWUpOworCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCisJLy9SVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+UkVDQkFUaW1lciwgUkVDQkFUaW1lclRpbWVvdXQsIHBBZCwgVFJVRSk7CisJLy9SVE1QU2V0VGltZXIoJnBBZC0+UkVDQkFUaW1lciwgUkVPUkRFUl9FWEVDX0lOVFYpOworCisjaWZkZWYgUkFMSU5LX0FURQorCU5kaXNaZXJvTWVtb3J5KCZwQWQtPmF0ZSwgc2l6ZW9mKEFURV9JTkZPKSk7CisJcEFkLT5hdGUuTW9kZSA9IEFURV9TVE9QOworCXBBZC0+YXRlLlR4Q291bnQgPSAyMDA7LyogdG8gZXhjZWVkIFRYX1JJTkdfU0laRSAuLi4gKi8KKwlwQWQtPmF0ZS5UeExlbmd0aCA9IDEwMjQ7CisJcEFkLT5hdGUuVHhXSS5TaG9ydEdJID0gMDsvLyBMT05HIEdJIDogODAwIG5zCisJcEFkLT5hdGUuVHhXSS5QSFlNT0RFID0gTU9ERV9DQ0s7CisJcEFkLT5hdGUuVHhXSS5NQ1MgPSAzOworCXBBZC0+YXRlLlR4V0kuQlcgPSBCV18yMDsKKwlwQWQtPmF0ZS5DaGFubmVsID0gMTsKKwlwQWQtPmF0ZS5RSUQgPSBRSURfQUNfQkU7CisJcEFkLT5hdGUuQWRkcjFbMF0gPSAweDAwOworCXBBZC0+YXRlLkFkZHIxWzFdID0gMHgxMTsKKwlwQWQtPmF0ZS5BZGRyMVsyXSA9IDB4MjI7CisJcEFkLT5hdGUuQWRkcjFbM10gPSAweEFBOworCXBBZC0+YXRlLkFkZHIxWzRdID0gMHhCQjsKKwlwQWQtPmF0ZS5BZGRyMVs1XSA9IDB4Q0M7CisJTmRpc01vdmVNZW1vcnkocEFkLT5hdGUuQWRkcjIsIHBBZC0+YXRlLkFkZHIxLCBFVEhfTEVOR1RIX09GX0FERFJFU1MpOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+YXRlLkFkZHIzLCBwQWQtPmF0ZS5BZGRyMSwgRVRIX0xFTkdUSF9PRl9BRERSRVNTKTsKKwlwQWQtPmF0ZS5iUnhGZXIgPSAwOworCXBBZC0+YXRlLmJRQVR4U3RhcnQgPSBGQUxTRTsKKwlwQWQtPmF0ZS5iUUFSeFN0YXJ0ID0gRkFMU0U7CisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwkvL3BBZC0+YXRlLlJlcGVhdCA9IDA7CisJcEFkLT5hdGUuVHhTdGF0dXMgPSAwOworCXBBZC0+YXRlLkF0ZVBpZCA9IFRIUkVBRF9QSURfSU5JVF9WQUxVRTsKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCisJcEFkLT5Db21tb25DZmcuYldpRmlUZXN0ID0gRkFMU0U7CisKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBVc2VyQ2ZnSW5pdFxuIikpOworfQorCisvLyBJUlFMID0gUEFTU0lWRV9MRVZFTAorVUNIQVIgQnRvSChjaGFyIGNoKQoreworCWlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSByZXR1cm4gKGNoIC0gJzAnKTsgICAgICAgIC8vIEhhbmRsZSBudW1lcmFscworCWlmIChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKSByZXR1cm4gKGNoIC0gJ0EnICsgMHhBKTsgIC8vIEhhbmRsZSBjYXBpdG9sIGhleCBkaWdpdHMKKwlpZiAoY2ggPj0gJ2EnICYmIGNoIDw9ICdmJykgcmV0dXJuIChjaCAtICdhJyArIDB4QSk7ICAvLyBIYW5kbGUgc21hbGwgaGV4IGRpZ2l0cworCXJldHVybigyNTUpOworfQorCisvLworLy8gIEZVTkNUSU9OOiBBdG9IKGNoYXIgKiwgVUNIQVIgKiwgaW50KQorLy8KKy8vICBQVVJQT1NFOiAgQ29udmVydHMgYXNjaWkgc3RyaW5nIHRvIG5ldHdvcmsgb3JkZXIgaGV4CisvLworLy8gIFBBUkFNRVRFUlM6CisvLyAgICBzcmMgICAgLSBwb2ludGVyIHRvIGlucHV0IGFzY2lpIHN0cmluZworLy8gICAgZGVzdCAgIC0gcG9pbnRlciB0byBvdXRwdXQgaGV4CisvLyAgICBkZXN0bGVuIC0gc2l6ZSBvZiBkZXN0CisvLworLy8gIENPTU1FTlRTOgorLy8KKy8vICAgIDIgYXNjaWkgYnl0ZXMgbWFrZSBhIGhleCBieXRlIHNvIG11c3QgcHV0IDFzdCBhc2NpaSBieXRlIG9mIHBhaXIKKy8vICAgIGludG8gdXBwZXIgbmliYmxlIGFuZCAybmQgYXNjaWkgYnl0ZSBvZiBwYWlyIGludG8gbG93ZXIgbmliYmxlLgorLy8KKy8vIElSUUwgPSBQQVNTSVZFX0xFVkVMCisKK3ZvaWQgQXRvSChjaGFyICogc3JjLCBVQ0hBUiAqIGRlc3QsIGludCBkZXN0bGVuKQoreworCWNoYXIgKiBzcmNwdHI7CisJUFVDSEFSIGRlc3RUZW1wOworCisJc3JjcHRyID0gc3JjOworCWRlc3RUZW1wID0gKFBVQ0hBUikgZGVzdDsKKworCXdoaWxlKGRlc3RsZW4tLSkKKwl7CisJCSpkZXN0VGVtcCA9IEJ0b0goKnNyY3B0cisrKSA8PCA0OyAgICAvLyBQdXQgMXN0IGFzY2lpIGJ5dGUgaW4gdXBwZXIgbmliYmxlLgorCQkqZGVzdFRlbXAgKz0gQnRvSCgqc3JjcHRyKyspOyAgICAgIC8vIEFkZCAybmQgYXNjaWkgYnl0ZSB0byBhYm92ZS4KKwkJZGVzdFRlbXArKzsKKwl9Cit9CisKK1ZPSUQJUlRNUFBhdGNoTWFjQmJwQnVnKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVVMT05HCUluZGV4OworCisJLy8gSW5pdGlhbGl6ZSBCQlAgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQorCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IE5VTV9CQlBfUkVHX1BBUk1TOyBJbmRleCsrKQorCXsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUFJlZ1RhYmxlW0luZGV4XS5SZWdpc3RlciwgKFVDSEFSKUJCUFJlZ1RhYmxlW0luZGV4XS5WYWx1ZSk7CisJfQorCisJLy8gSW5pdGlhbGl6ZSBSRiByZWdpc3RlciB0byBkZWZhdWx0IHZhbHVlCisJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisKKwkvLyBSZS1pbml0IEJCUCByZWdpc3RlciBmcm9tIEVFUFJPTSB2YWx1ZQorCU5JQ0luaXRBc2ljRnJvbUVFUFJPTShwQWQpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJSW5pdCB0aW1lciBvYmplY3RzCisKKwlBcmd1bWVudHM6CisJCXBBZAkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcFRpbWVyCQkJCVRpbWVyIHN0cnVjdHVyZQorCQlwVGltZXJGdW5jCQkJRnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRpbWVyIGV4cGlyZWQKKwkJUmVwZWF0CQkJCVR1cmUgZm9yIHBlcmlvZCB0aW1lcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QSW5pdFRpbWVyKAorCUlOCVBSVE1QX0FEQVBURVIJCQlwQWQsCisJSU4JUFJBTElOS19USU1FUl9TVFJVQ1QJcFRpbWVyLAorCUlOCVBWT0lECQkJCQlwVGltZXJGdW5jLAorCUlOCVBWT0lECQkJCQlwRGF0YSwKKwlJTglCT09MRUFOCQkJCQlSZXBlYXQpCit7CisJLy8KKwkvLyBTZXQgVmFsaWQgdG8gVFJVRSBmb3IgbGF0ZXIgdXNlZC4KKwkvLyBJdCB3aWxsIGNyYXNoIGlmIHdlIGNhbmNlbCBhIHRpbWVyIG9yIHNldCBhIHRpbWVyCisJLy8gdGhhdCB3ZSBoYXZlbid0IGluaXRpYWxpemUgYmVmb3JlLgorCS8vCisJcFRpbWVyLT5WYWxpZCAgICAgID0gVFJVRTsKKworCXBUaW1lci0+UGVyaW9kaWNUeXBlID0gUmVwZWF0OworCXBUaW1lci0+U3RhdGUgICAgICA9IEZBTFNFOworCXBUaW1lci0+Y29va2llID0gKFVMT05HKSBwRGF0YTsKKworI2lmZGVmIFJUMjg3MAorCXBUaW1lci0+cEFkID0gcEFkOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisJUlRNUF9PU19Jbml0X1RpbWVyKHBBZCwJJnBUaW1lci0+VGltZXJPYmosCXBUaW1lckZ1bmMsIChQVk9JRCkgcFRpbWVyKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUluaXQgdGltZXIgb2JqZWN0cworCisJQXJndW1lbnRzOgorCQlwVGltZXIJCQkJVGltZXIgc3RydWN0dXJlCisJCVZhbHVlCQkJCVRpbWVyIHZhbHVlIGluIG1pbGxpc2Vjb25kcworCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCQlUbyB1c2UgdGhpcyByb3V0aW5lLCBtdXN0IGNhbGwgUlRNUEluaXRUaW1lciBiZWZvcmUuCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBTZXRUaW1lcigKKwlJTglQUkFMSU5LX1RJTUVSX1NUUlVDVAlwVGltZXIsCisJSU4JVUxPTkcJCQkJCVZhbHVlKQoreworCWlmIChwVGltZXItPlZhbGlkKQorCXsKKwkJcFRpbWVyLT5UaW1lclZhbHVlID0gVmFsdWU7CisJCXBUaW1lci0+U3RhdGUgICAgICA9IEZBTFNFOworCQlpZiAocFRpbWVyLT5QZXJpb2RpY1R5cGUgPT0gVFJVRSkKKwkJeworCQkJcFRpbWVyLT5SZXBlYXQgPSBUUlVFOworCQkJUlRNUF9TZXRQZXJpb2RpY1RpbWVyKCZwVGltZXItPlRpbWVyT2JqLCBWYWx1ZSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwVGltZXItPlJlcGVhdCA9IEZBTFNFOworCQkJUlRNUF9PU19BZGRfVGltZXIoJnBUaW1lci0+VGltZXJPYmosIFZhbHVlKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlEQkdQUklOVF9FUlIoKCJSVE1QU2V0VGltZXIgZmFpbGVkLCBUaW1lciBoYXNuJ3QgYmVlbiBpbml0aWFsaXplIVxuIikpOworCX0KK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJSW5pdCB0aW1lciBvYmplY3RzCisKKwlBcmd1bWVudHM6CisJCXBUaW1lcgkJCQlUaW1lciBzdHJ1Y3R1cmUKKwkJVmFsdWUJCQkJVGltZXIgdmFsdWUgaW4gbWlsbGlzZWNvbmRzCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisJCVRvIHVzZSB0aGlzIHJvdXRpbmUsIG11c3QgY2FsbCBSVE1QSW5pdFRpbWVyIGJlZm9yZS4KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUE1vZFRpbWVyKAorCUlOCVBSQUxJTktfVElNRVJfU1RSVUNUCXBUaW1lciwKKwlJTglVTE9ORwkJCQkJVmFsdWUpCit7CisJQk9PTEVBTglDYW5jZWw7CisKKwlpZiAocFRpbWVyLT5WYWxpZCkKKwl7CisJCXBUaW1lci0+VGltZXJWYWx1ZSA9IFZhbHVlOworCQlwVGltZXItPlN0YXRlICAgICAgPSBGQUxTRTsKKwkJaWYgKHBUaW1lci0+UGVyaW9kaWNUeXBlID09IFRSVUUpCisJCXsKKwkJCVJUTVBDYW5jZWxUaW1lcihwVGltZXIsICZDYW5jZWwpOworCQkJUlRNUFNldFRpbWVyKHBUaW1lciwgVmFsdWUpOworCQl9CisJCWVsc2UKKwkJeworCQkJUlRNUF9PU19Nb2RfVGltZXIoJnBUaW1lci0+VGltZXJPYmosIFZhbHVlKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlEQkdQUklOVF9FUlIoKCJSVE1QTW9kVGltZXIgZmFpbGVkLCBUaW1lciBoYXNuJ3QgYmVlbiBpbml0aWFsaXplIVxuIikpOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNhbmNlbCB0aW1lciBvYmplY3RzCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCQkxLikgVG8gdXNlIHRoaXMgcm91dGluZSwgbXVzdCBjYWxsIFJUTVBJbml0VGltZXIgYmVmb3JlLgorCQkyLikgUmVzZXQgTklDIHRvIGluaXRpYWwgc3RhdGUgQVMgSVMgc3lzdGVtIGJvb3QgdXAgdGltZS4KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUENhbmNlbFRpbWVyKAorCUlOCVBSQUxJTktfVElNRVJfU1RSVUNUCXBUaW1lciwKKwlPVVQJQk9PTEVBTgkJCQkJKnBDYW5jZWxsZWQpCit7CisJaWYgKHBUaW1lci0+VmFsaWQpCisJeworCQlpZiAocFRpbWVyLT5TdGF0ZSA9PSBGQUxTRSkKKwkJCXBUaW1lci0+UmVwZWF0ID0gRkFMU0U7CisJCQlSVE1QX09TX0RlbF9UaW1lcigmcFRpbWVyLT5UaW1lck9iaiwgcENhbmNlbGxlZCk7CisKKwkJaWYgKCpwQ2FuY2VsbGVkID09IFRSVUUpCisJCQlwVGltZXItPlN0YXRlID0gVFJVRTsKKworI2lmZGVmIFJUMjg3MAorCQkvLyBXZSBuZWVkIHRvIGdvLXRocm91Z2ggdGhlIFRpbWVyUSB0byBmaW5kb3V0IHRoaXMgdGltZXIgaGFuZGxlciBhbmQgcmVtb3ZlIGl0IGlmCisJCS8vCQlpdCdzIHN0aWxsIHdhaXRpbmcgZm9yIGV4ZWN1dGlvbi4KKworCQlSVDI4NzBfVGltZXJRX1JlbW92ZShwVGltZXItPnBBZCwgcFRpbWVyKTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwl9CisJZWxzZQorCXsKKwkJLy8KKwkJLy8gTmRpc01DYW5jZWxUaW1lciBqdXN0IGNhbmNlZCB0aGUgdGltZXIgYW5kIG5vdCBtZWFuIHJlbGVhc2UgdGhlIHRpbWVyLgorCQkvLyBBbmQgZG9uJ3Qgc2V0IHRoZSAiVmFsaWQiIHRvIEZhbHNlLiBTbyB0aGF0IHdlIGNhbiB1c2UgdGhpcyB0aW1lciBhZ2Fpbi4KKwkJLy8KKwkJREJHUFJJTlRfRVJSKCgiUlRNUENhbmNlbFRpbWVyIGZhaWxlZCwgVGltZXIgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZSFcbiIpKTsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlTZXQgTEVEIFN0YXR1cworCisJQXJndW1lbnRzOgorCQlwQWQJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCVN0YXR1cwkJCQkJTEVEIFN0YXR1cworCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUFNldExFRCgKKwlJTiBQUlRNUF9BREFQVEVSIAlwQWQsCisJSU4gVUNIQVIJCQlTdGF0dXMpCit7CisJLy9VTE9ORwkJCWRhdGE7CisJVUNIQVIJCQlIaWdoQnl0ZSA9IDA7CisJVUNIQVIJCQlMb3dCeXRlOworCisvLyBJbiBBVEUgbW9kZSBvZiBSVDI4NjAgQVAvU1RBLCB3ZSBoYXZlIGVyYXNlZCA4MDUxIGZpcm13YXJlLgorLy8gU28gTEVEIG1vZGUgaXMgbm90IHN1cHBvcnRlZCB3aGVuIEFURSBpcyBydW5uaW5nLgorI2lmZGVmIFJBTElOS19BVEUKKwlpZiAoQVRFX09OKHBBZCkpCisJCXJldHVybjsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKwlMb3dCeXRlID0gcEFkLT5MZWRDbnRsLmZpZWxkLkxlZE1vZGUmMHg3ZjsKKwlzd2l0Y2ggKFN0YXR1cykKKwl7CisJCWNhc2UgTEVEX0xJTktfRE9XTjoKKwkJCUhpZ2hCeXRlID0gMHgyMDsKKwkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MCwgMHhmZiwgTG93Qnl0ZSwgSGlnaEJ5dGUpOworCQkJcEFkLT5MZWRJbmRpY2F0b3JTdHJlZ3RoID0gMDsKKwkJCWJyZWFrOworCQljYXNlIExFRF9MSU5LX1VQOgorCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKKwkJCQlIaWdoQnl0ZSA9IDB4YTA7CisJCQllbHNlCisJCQkJSGlnaEJ5dGUgPSAweDYwOworCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7CisJCQlicmVhazsKKwkJY2FzZSBMRURfUkFESU9fT046CisJCQlIaWdoQnl0ZSA9IDB4MjA7CisJCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKKwkJCWJyZWFrOworCQljYXNlIExFRF9IQUxUOgorCQkJTG93Qnl0ZSA9IDA7IC8vIERyaXZlciBzZXRzIE1BQyByZWdpc3RlciBhbmQgTUFDIGNvbnRyb2xzIExFRAorCQljYXNlIExFRF9SQURJT19PRkY6CisJCQlIaWdoQnl0ZSA9IDA7CisJCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIExFRF9XUFM6CisJCQlIaWdoQnl0ZSA9IDB4MTA7CisJCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKKwkJCWJyZWFrOworCQljYXNlIExFRF9PTl9TSVRFX1NVUlZFWToKKwkJCUhpZ2hCeXRlID0gMHgwODsKKwkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MCwgMHhmZiwgTG93Qnl0ZSwgSGlnaEJ5dGUpOworCQkJYnJlYWs7CisJCWNhc2UgTEVEX1BPV0VSX1VQOgorCQkJSGlnaEJ5dGUgPSAweDA0OworCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUlRNUFNldExFRDo6VW5rbm93biBTdGF0dXMgJWRcbiIsIFN0YXR1cykpOworCQkJYnJlYWs7CisJfQorCisgICAgLy8KKwkvLyBLZWVwIExFRCBzdGF0dXMgZm9yIExFRCBTaXRlU3VydmV5IG1vZGUuCisJLy8gQWZ0ZXIgU2l0ZVN1cnZleSwgd2Ugd2lsbCBzZXQgdGhlIExFRCBtb2RlIHRvIHByZXZpb3VzIHN0YXR1cy4KKwkvLworCWlmICgoU3RhdHVzICE9IExFRF9PTl9TSVRFX1NVUlZFWSkgJiYgKFN0YXR1cyAhPSBMRURfUE9XRVJfVVApKQorCQlwQWQtPkxlZFN0YXR1cyA9IFN0YXR1czsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBTZXRMRUQ6Ok1vZGU9JWQsSGlnaEJ5dGU9MHglMDJ4LExvd0J5dGU9MHglMDJ4XG4iLCBwQWQtPkxlZENudGwuZmllbGQuTGVkTW9kZSwgSGlnaEJ5dGUsIExvd0J5dGUpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVNldCBMRUQgU2lnbmFsIFN0cmVndGgKKworCUFyZ3VtZW50czoKKwkJcEFkCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlEYm0JCQkJCQlTaWduYWwgU3RyZWd0aAorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJTm90ZToKKwkJQ2FuIGJlIHJ1biBvbiBhbnkgSVJRTCBsZXZlbC4KKworCQlBY2NvcmRpbmcgdG8gTWljcm9zb2Z0IFplcm8gQ29uZmlnIFdpcmVsZXNzIFNpZ25hbCBTdHJlZ3RoIGRlZmluaXRpb24gYXMgYmVsb3dzLgorCQk8PSAtOTAgIE5vIFNpZ25hbAorCQk8PSAtODEgIFZlcnkgTG93CisJCTw9IC03MSAgTG93CisJCTw9IC02NyAgR29vZAorCQk8PSAtNTcgIFZlcnkgR29vZAorCQkgPiAtNTcgIEV4Y2VsbGVudAorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUFNldFNpZ25hbExFRCgKKwlJTiBQUlRNUF9BREFQVEVSIAlwQWQsCisJSU4gTkRJU184MDJfMTFfUlNTSSBEYm0pCit7CisJVUNIQVIJCW5MZWQgPSAwOworCisJLy8KKwkvLyBpZiBub3QgU2lnbmFsIFN0cmVndGgsIHRoZW4gZG8gbm90aGluZy4KKwkvLworCWlmIChwQWQtPkxlZENudGwuZmllbGQuTGVkTW9kZSAhPSBMRURfTU9ERV9TSUdOQUxfU1RSRUdUSCkKKwl7CisJCXJldHVybjsKKwl9CisKKwlpZiAoRGJtIDw9IC05MCkKKwkJbkxlZCA9IDA7CisJZWxzZSBpZiAoRGJtIDw9IC04MSkKKwkJbkxlZCA9IDE7CisJZWxzZSBpZiAoRGJtIDw9IC03MSkKKwkJbkxlZCA9IDM7CisJZWxzZSBpZiAoRGJtIDw9IC02NykKKwkJbkxlZCA9IDc7CisJZWxzZSBpZiAoRGJtIDw9IC01NykKKwkJbkxlZCA9IDE1OworCWVsc2UKKwkJbkxlZCA9IDMxOworCisJLy8KKwkvLyBVcGRhdGUgU2lnbmFsIFN0cmVndGggdG8gZmlybXdhcmUgaWYgY2hhbmdlZC4KKwkvLworCWlmIChwQWQtPkxlZEluZGljYXRvclN0cmVndGggIT0gbkxlZCkKKwl7CisJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MSwgMHhmZiwgbkxlZCwgcEFkLT5MZWRDbnRsLmZpZWxkLlBvbGFyaXR5KTsKKwkJcEFkLT5MZWRJbmRpY2F0b3JTdHJlZ3RoID0gbkxlZDsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlFbmFibGUgUlgKKworCUFyZ3VtZW50czoKKwkJcEFkCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMIDw9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCQlCZWZvcmUgRW5hYmxlIFJYLCBtYWtlIHN1cmUgeW91IGhhdmUgZW5hYmxlZCBJbnRlcnJ1cHQuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QRW5hYmxlUnhUeCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCkKK3sKKy8vCVdQRE1BX0dMT19DRkdfU1RSVUMJR2xvQ2ZnOworLy8JVUxPTkcJaSA9IDA7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gUlRNUEVuYWJsZVJ4VHhcbiIpKTsKKworI2lmIDAKKwkvLyBFbmFibGUgUnggRE1BLgorCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHg0KTsKKwlkbworCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOworCQlpZiAoKEdsb0NmZy5maWVsZC5UeERNQUJ1c3kgPT0gMCkgICYmIChHbG9DZmcuZmllbGQuUnhETUFCdXN5ID09IDApKQorCQkJYnJlYWs7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+ICBETUFCdXN5XG4iKSk7CisJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJCWkrKzsKKwl9d2hpbGUgKCBpIDwyMDApOworCisJUlRNUHVzZWNEZWxheSg1MCk7CisJUlQyOFhYX0RNQV9XUklURV9JTklUKEdsb0NmZyk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IFdSSVRFIERNQSBvZmZzZXQgMHgyMDggPSAweCV4XG4iLCBHbG9DZmcud29yZCkpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIEdsb0NmZy53b3JkKTsKKworCVJUMjhYWF9ETUFfUE9TVF9XUklURShwQWQpOworI2Vsc2UKKwkvLyBFbmFibGUgUnggRE1BLgorCVJUMjhYWERNQUVuYWJsZShwQWQpOworI2VuZGlmCisKKwkvLyBlbmFibGUgUlggb2YgTUFDIGJsb2NrCisJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkKKwl7CisJCVVJTlQzMiByeF9maWx0ZXJfZmxhZyA9IEFQTk9STUFMOworCisKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfRklMVFJfQ0ZHLCByeF9maWx0ZXJfZmxhZyk7ICAgICAvLyBlbmFibGUgUlggb2YgRE1BIGJsb2NrCisJfQorCWVsc2UKKwl7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0ZJTFRSX0NGRywgU1RBTk9STUFMKTsgICAgIC8vIFN0YWlvbiBub3QgZHJvcCBjb250cm9sIGZyYW1lIHdpbGwgZmFpbCBXaUZpIENlcnRpZmljYXRpb24uCisJfQorCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweGMpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBSVE1QRW5hYmxlUnhUeFxuIikpOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0bXBfdGtpcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnRtcF90a2lwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg0NzQwOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0bXBfdGtpcC5jCkBAIC0wLDAgKzEsMTYxMyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlydG1wX3RraXAuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVBhdWwgV3UJCTAyLTI1LTAyCQlJbml0aWFsCisqLworCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKy8vIFJvdGF0aW9uIGZ1bmN0aW9ucyBvbiAzMiBiaXQgdmFsdWVzCisjZGVmaW5lIFJPTDMyKCBBLCBuICkgXAorCSggKChBKSA8PCAobikpIHwgKCAoKEEpPj4oMzItKG4pKSkgJiAoICgxVUwgPDwgKG4pKSAtIDEgKSApICkKKyNkZWZpbmUgUk9SMzIoIEEsIG4gKSBST0wzMiggKEEpLCAzMi0obikgKQorCitVSU5UIFRraXBfU2JveF9Mb3dlclsyNTZdID0KK3sKKwkweEE1LDB4ODQsMHg5OSwweDhELDB4MEQsMHhCRCwweEIxLDB4NTQsCisJMHg1MCwweDAzLDB4QTksMHg3RCwweDE5LDB4NjIsMHhFNiwweDlBLAorCTB4NDUsMHg5RCwweDQwLDB4ODcsMHgxNSwweEVCLDB4QzksMHgwQiwKKwkweEVDLDB4NjcsMHhGRCwweEVBLDB4QkYsMHhGNywweDk2LDB4NUIsCisJMHhDMiwweDFDLDB4QUUsMHg2QSwweDVBLDB4NDEsMHgwMiwweDRGLAorCTB4NUMsMHhGNCwweDM0LDB4MDgsMHg5MywweDczLDB4NTMsMHgzRiwKKwkweDBDLDB4NTIsMHg2NSwweDVFLDB4MjgsMHhBMSwweDBGLDB4QjUsCisJMHgwOSwweDM2LDB4OUIsMHgzRCwweDI2LDB4NjksMHhDRCwweDlGLAorCTB4MUIsMHg5RSwweDc0LDB4MkUsMHgyRCwweEIyLDB4RUUsMHhGQiwKKwkweEY2LDB4NEQsMHg2MSwweENFLDB4N0IsMHgzRSwweDcxLDB4OTcsCisJMHhGNSwweDY4LDB4MDAsMHgyQywweDYwLDB4MUYsMHhDOCwweEVELAorCTB4QkUsMHg0NiwweEQ5LDB4NEIsMHhERSwweEQ0LDB4RTgsMHg0QSwKKwkweDZCLDB4MkEsMHhFNSwweDE2LDB4QzUsMHhENywweDU1LDB4OTQsCisJMHhDRiwweDEwLDB4MDYsMHg4MSwweEYwLDB4NDQsMHhCQSwweEUzLAorCTB4RjMsMHhGRSwweEMwLDB4OEEsMHhBRCwweEJDLDB4NDgsMHgwNCwKKwkweERGLDB4QzEsMHg3NSwweDYzLDB4MzAsMHgxQSwweDBFLDB4NkQsCisJMHg0QywweDE0LDB4MzUsMHgyRiwweEUxLDB4QTIsMHhDQywweDM5LAorCTB4NTcsMHhGMiwweDgyLDB4NDcsMHhBQywweEU3LDB4MkIsMHg5NSwKKwkweEEwLDB4OTgsMHhEMSwweDdGLDB4NjYsMHg3RSwweEFCLDB4ODMsCisJMHhDQSwweDI5LDB4RDMsMHgzQywweDc5LDB4RTIsMHgxRCwweDc2LAorCTB4M0IsMHg1NiwweDRFLDB4MUUsMHhEQiwweDBBLDB4NkMsMHhFNCwKKwkweDVELDB4NkUsMHhFRiwweEE2LDB4QTgsMHhBNCwweDM3LDB4OEIsCisJMHgzMiwweDQzLDB4NTksMHhCNywweDhDLDB4NjQsMHhEMiwweEUwLAorCTB4QjQsMHhGQSwweDA3LDB4MjUsMHhBRiwweDhFLDB4RTksMHgxOCwKKwkweEQ1LDB4ODgsMHg2RiwweDcyLDB4MjQsMHhGMSwweEM3LDB4NTEsCisJMHgyMywweDdDLDB4OUMsMHgyMSwweERELDB4REMsMHg4NiwweDg1LAorCTB4OTAsMHg0MiwweEM0LDB4QUEsMHhEOCwweDA1LDB4MDEsMHgxMiwKKwkweEEzLDB4NUYsMHhGOSwweEQwLDB4OTEsMHg1OCwweDI3LDB4QjksCisJMHgzOCwweDEzLDB4QjMsMHgzMywweEJCLDB4NzAsMHg4OSwweEE3LAorCTB4QjYsMHgyMiwweDkyLDB4MjAsMHg0OSwweEZGLDB4NzgsMHg3QSwKKwkweDhGLDB4RjgsMHg4MCwweDE3LDB4REEsMHgzMSwweEM2LDB4QjgsCisJMHhDMywweEIwLDB4NzcsMHgxMSwweENCLDB4RkMsMHhENiwweDNBCit9OworCitVSU5UIFRraXBfU2JveF9VcHBlclsyNTZdID0KK3sKKwkweEM2LDB4RjgsMHhFRSwweEY2LDB4RkYsMHhENiwweERFLDB4OTEsCisJMHg2MCwweDAyLDB4Q0UsMHg1NiwweEU3LDB4QjUsMHg0RCwweEVDLAorCTB4OEYsMHgxRiwweDg5LDB4RkEsMHhFRiwweEIyLDB4OEUsMHhGQiwKKwkweDQxLDB4QjMsMHg1RiwweDQ1LDB4MjMsMHg1MywweEU0LDB4OUIsCisJMHg3NSwweEUxLDB4M0QsMHg0QywweDZDLDB4N0UsMHhGNSwweDgzLAorCTB4NjgsMHg1MSwweEQxLDB4RjksMHhFMiwweEFCLDB4NjIsMHgyQSwKKwkweDA4LDB4OTUsMHg0NiwweDlELDB4MzAsMHgzNywweDBBLDB4MkYsCisJMHgwRSwweDI0LDB4MUIsMHhERiwweENELDB4NEUsMHg3RiwweEVBLAorCTB4MTIsMHgxRCwweDU4LDB4MzQsMHgzNiwweERDLDB4QjQsMHg1QiwKKwkweEE0LDB4NzYsMHhCNywweDdELDB4NTIsMHhERCwweDVFLDB4MTMsCisJMHhBNiwweEI5LDB4MDAsMHhDMSwweDQwLDB4RTMsMHg3OSwweEI2LAorCTB4RDQsMHg4RCwweDY3LDB4NzIsMHg5NCwweDk4LDB4QjAsMHg4NSwKKwkweEJCLDB4QzUsMHg0RiwweEVELDB4ODYsMHg5QSwweDY2LDB4MTEsCisJMHg4QSwweEU5LDB4MDQsMHhGRSwweEEwLDB4NzgsMHgyNSwweDRCLAorCTB4QTIsMHg1RCwweDgwLDB4MDUsMHgzRiwweDIxLDB4NzAsMHhGMSwKKwkweDYzLDB4NzcsMHhBRiwweDQyLDB4MjAsMHhFNSwweEZELDB4QkYsCisJMHg4MSwweDE4LDB4MjYsMHhDMywweEJFLDB4MzUsMHg4OCwweDJFLAorCTB4OTMsMHg1NSwweEZDLDB4N0EsMHhDOCwweEJBLDB4MzIsMHhFNiwKKwkweEMwLDB4MTksMHg5RSwweEEzLDB4NDQsMHg1NCwweDNCLDB4MEIsCisJMHg4QywweEM3LDB4NkIsMHgyOCwweEE3LDB4QkMsMHgxNiwweEFELAorCTB4REIsMHg2NCwweDc0LDB4MTQsMHg5MiwweDBDLDB4NDgsMHhCOCwKKwkweDlGLDB4QkQsMHg0MywweEM0LDB4MzksMHgzMSwweEQzLDB4RjIsCisJMHhENSwweDhCLDB4NkUsMHhEQSwweDAxLDB4QjEsMHg5QywweDQ5LAorCTB4RDgsMHhBQywweEYzLDB4Q0YsMHhDQSwweEY0LDB4NDcsMHgxMCwKKwkweDZGLDB4RjAsMHg0QSwweDVDLDB4MzgsMHg1NywweDczLDB4OTcsCisJMHhDQiwweEExLDB4RTgsMHgzRSwweDk2LDB4NjEsMHgwRCwweDBGLAorCTB4RTAsMHg3QywweDcxLDB4Q0MsMHg5MCwweDA2LDB4RjcsMHgxQywKKwkweEMyLDB4NkEsMHhBRSwweDY5LDB4MTcsMHg5OSwweDNBLDB4MjcsCisJMHhEOSwweEVCLDB4MkIsMHgyMiwweEQyLDB4QTksMHgwNywweDMzLAorCTB4MkQsMHgzQywweDE1LDB4QzksMHg4NywweEFBLDB4NTAsMHhBNSwKKwkweDAzLDB4NTksMHgwOSwweDFBLDB4NjUsMHhENywweDg0LDB4RDAsCisJMHg4MiwweDI5LDB4NUEsMHgxRSwweDdCLDB4QTgsMHg2RCwweDJDCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKiogU0JPWCBUYWJsZSAqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK1VDSEFSIFNib3hUYWJsZVsyNTZdID0KK3sKKwkweDYzLCAweDdjLCAweDc3LCAweDdiLCAweGYyLCAweDZiLCAweDZmLCAweGM1LAorCTB4MzAsIDB4MDEsIDB4NjcsIDB4MmIsIDB4ZmUsIDB4ZDcsIDB4YWIsIDB4NzYsCisJMHhjYSwgMHg4MiwgMHhjOSwgMHg3ZCwgMHhmYSwgMHg1OSwgMHg0NywgMHhmMCwKKwkweGFkLCAweGQ0LCAweGEyLCAweGFmLCAweDljLCAweGE0LCAweDcyLCAweGMwLAorCTB4YjcsIDB4ZmQsIDB4OTMsIDB4MjYsIDB4MzYsIDB4M2YsIDB4ZjcsIDB4Y2MsCisJMHgzNCwgMHhhNSwgMHhlNSwgMHhmMSwgMHg3MSwgMHhkOCwgMHgzMSwgMHgxNSwKKwkweDA0LCAweGM3LCAweDIzLCAweGMzLCAweDE4LCAweDk2LCAweDA1LCAweDlhLAorCTB4MDcsIDB4MTIsIDB4ODAsIDB4ZTIsIDB4ZWIsIDB4MjcsIDB4YjIsIDB4NzUsCisJMHgwOSwgMHg4MywgMHgyYywgMHgxYSwgMHgxYiwgMHg2ZSwgMHg1YSwgMHhhMCwKKwkweDUyLCAweDNiLCAweGQ2LCAweGIzLCAweDI5LCAweGUzLCAweDJmLCAweDg0LAorCTB4NTMsIDB4ZDEsIDB4MDAsIDB4ZWQsIDB4MjAsIDB4ZmMsIDB4YjEsIDB4NWIsCisJMHg2YSwgMHhjYiwgMHhiZSwgMHgzOSwgMHg0YSwgMHg0YywgMHg1OCwgMHhjZiwKKwkweGQwLCAweGVmLCAweGFhLCAweGZiLCAweDQzLCAweDRkLCAweDMzLCAweDg1LAorCTB4NDUsIDB4ZjksIDB4MDIsIDB4N2YsIDB4NTAsIDB4M2MsIDB4OWYsIDB4YTgsCisJMHg1MSwgMHhhMywgMHg0MCwgMHg4ZiwgMHg5MiwgMHg5ZCwgMHgzOCwgMHhmNSwKKwkweGJjLCAweGI2LCAweGRhLCAweDIxLCAweDEwLCAweGZmLCAweGYzLCAweGQyLAorCTB4Y2QsIDB4MGMsIDB4MTMsIDB4ZWMsIDB4NWYsIDB4OTcsIDB4NDQsIDB4MTcsCisJMHhjNCwgMHhhNywgMHg3ZSwgMHgzZCwgMHg2NCwgMHg1ZCwgMHgxOSwgMHg3MywKKwkweDYwLCAweDgxLCAweDRmLCAweGRjLCAweDIyLCAweDJhLCAweDkwLCAweDg4LAorCTB4NDYsIDB4ZWUsIDB4YjgsIDB4MTQsIDB4ZGUsIDB4NWUsIDB4MGIsIDB4ZGIsCisJMHhlMCwgMHgzMiwgMHgzYSwgMHgwYSwgMHg0OSwgMHgwNiwgMHgyNCwgMHg1YywKKwkweGMyLCAweGQzLCAweGFjLCAweDYyLCAweDkxLCAweDk1LCAweGU0LCAweDc5LAorCTB4ZTcsIDB4YzgsIDB4MzcsIDB4NmQsIDB4OGQsIDB4ZDUsIDB4NGUsIDB4YTksCisJMHg2YywgMHg1NiwgMHhmNCwgMHhlYSwgMHg2NSwgMHg3YSwgMHhhZSwgMHgwOCwKKwkweGJhLCAweDc4LCAweDI1LCAweDJlLCAweDFjLCAweGE2LCAweGI0LCAweGM2LAorCTB4ZTgsIDB4ZGQsIDB4NzQsIDB4MWYsIDB4NGIsIDB4YmQsIDB4OGIsIDB4OGEsCisJMHg3MCwgMHgzZSwgMHhiNSwgMHg2NiwgMHg0OCwgMHgwMywgMHhmNiwgMHgwZSwKKwkweDYxLCAweDM1LCAweDU3LCAweGI5LCAweDg2LCAweGMxLCAweDFkLCAweDllLAorCTB4ZTEsIDB4ZjgsIDB4OTgsIDB4MTEsIDB4NjksIDB4ZDksIDB4OGUsIDB4OTQsCisJMHg5YiwgMHgxZSwgMHg4NywgMHhlOSwgMHhjZSwgMHg1NSwgMHgyOCwgMHhkZiwKKwkweDhjLCAweGExLCAweDg5LCAweDBkLCAweGJmLCAweGU2LCAweDQyLCAweDY4LAorCTB4NDEsIDB4OTksIDB4MmQsIDB4MGYsIDB4YjAsIDB4NTQsIDB4YmIsIDB4MTYKK307CisKK1ZPSUQgeG9yXzMyKAorCUlOICBQVUNIQVIgICAgICAgICAgICAgIGEsCisJSU4gIFBVQ0hBUiAgICAgICAgICAgICAgYiwKKwlPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOworCitWT0lEIHhvcl8xMjgoCisJSU4gIFBVQ0hBUiAgICAgICAgICAgICAgYSwKKwlJTiAgUFVDSEFSICAgICAgICAgICAgICBiLAorCU9VVCBQVUNIQVIgICAgICAgICAgICAgIG91dCk7CisKK1ZPSUQgbmV4dF9rZXkoCisJSU4gIFBVQ0hBUiAgICAgICAgICAgICAga2V5LAorCUlOICBJTlQgICAgICAgICAgICAgICAgIHJvdW5kKTsKKworVk9JRCBieXRlX3N1YigKKwlJTiAgUFVDSEFSICAgICAgICAgICAgICBpbiwKKwlPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOworCitWT0lEIHNoaWZ0X3JvdygKKwlJTiAgUFVDSEFSICAgICAgICAgICAgICBpbiwKKwlPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOworCitWT0lEIG1peF9jb2x1bW4oCisJSU4gIFBVQ0hBUiAgICAgICAgICAgICAgaW4sCisJT1VUIFBVQ0hBUiAgICAgICAgICAgICAgb3V0KTsKKworVUNIQVIgUlRNUENraXBTYm94KAorCUlOICBVQ0hBUiAgICAgICAgICAgICAgIGEpOworLy8KKy8vIEV4cGFuZGVkIElWIGZvciBUS0lQIGZ1bmN0aW9uLgorLy8KK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCBfSVZfQ09OVFJPTF8KK3sKKwl1bmlvbiBQQUNLRUQKKwl7CisJCXN0cnVjdCBQQUNLRUQKKwkJeworCQkJVUNIQVIJCXJjMDsKKwkJCVVDSEFSCQlyYzE7CisJCQlVQ0hBUgkJcmMyOworCisJCQl1bmlvbiBQQUNLRUQKKwkJCXsKKwkJCQlzdHJ1Y3QgUEFDS0VECisJCQkJeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJCQkJVUNIQVIJS2V5SUQ6MjsKKwkJCQkJVUNIQVIJRXh0SVY6MTsKKwkJCQkJVUNIQVIJUnN2ZDo1OworI2Vsc2UKKwkJCQkJVUNIQVIJUnN2ZDo1OworCQkJCQlVQ0hBUglFeHRJVjoxOworCQkJCQlVQ0hBUglLZXlJRDoyOworI2VuZGlmCisJCQkJfQlmaWVsZDsKKwkJCQlVQ0hBUgkJQnl0ZTsKKwkJCX0JQ09OVFJPTDsKKwkJfQlmaWVsZDsKKworCQlVTE9ORwl3b3JkOworCX0JSVYxNjsKKworCVVMT05HCUlWMzI7Cit9CVRLSVBfSVYsICpQVEtJUF9JVjsKKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJQ29udmVydCBmcm9tIFVDSEFSW10gdG8gVUxPTkcgaW4gYSBwb3J0YWJsZSB3YXkKKworCUFyZ3VtZW50czoKKyAgICAgIHBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVUxPTkcJUlRNUFRraXBHZXRVSW50MzIoCisJSU4JUFVDSEFSCXBNSUNLZXkpCit7CisJVUxPTkcJcmVzID0gMDsKKwlJTlQJCWk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCXsKKwkJcmVzIHw9ICgqcE1JQ0tleSsrKSA8PCAoOCAqIGkpOworCX0KKworCXJldHVybiByZXM7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDb252ZXJ0IGZyb20gVUxPTkcgdG8gVUNIQVJbXSBpbiBhIHBvcnRhYmxlIHdheQorCisJQXJndW1lbnRzOgorICAgICAgcERzdAkJCXBvaW50ZXIgdG8gZGVzdGluYXRpb24gZm9yIGNvbnZlcnQgVUxPTkcgdG8gVUNIQVJbXQorICAgICAgdmFsCQkJdGhlIHZhbHVlIGZvciBjb252ZXJ0CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUFRraXBQdXRVSW50MzIoCisJSU4gT1VUCVBVQ0hBUgkJcERzdCwKKwlJTgkJVUxPTkcJCXZhbCkKK3sKKwlJTlQgaTsKKworCWZvcihpID0gMDsgaSA8IDQ7IGkrKykKKwl7CisJCSpwRHN0KysgPSAoVUNIQVIpICh2YWwgJiAweGZmKTsKKwkJdmFsID4+PSA4OworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCVNldCB0aGUgTUlDIEtleS4KKworCUFyZ3VtZW50czoKKyAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorICAgICAgcE1JQ0tleQkJcG9pbnRlciB0byBNSUMgS2V5CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUFRraXBTZXRNSUNLZXkoCisJSU4JUFRLSVBfS0VZX0lORk8JcFRraXAsCisJSU4JUFVDSEFSCQkJcE1JQ0tleSkKK3sKKwkvLyBTZXQgdGhlIGtleQorCXBUa2lwLT5LMCA9IFJUTVBUa2lwR2V0VUludDMyKHBNSUNLZXkpOworCXBUa2lwLT5LMSA9IFJUTVBUa2lwR2V0VUludDMyKHBNSUNLZXkgKyA0KTsKKwkvLyBhbmQgcmVzZXQgdGhlIG1lc3NhZ2UKKwlwVGtpcC0+TCA9IHBUa2lwLT5LMDsKKwlwVGtpcC0+UiA9IHBUa2lwLT5LMTsKKwlwVGtpcC0+bkJ5dGVzSW5NID0gMDsKKwlwVGtpcC0+TSA9IDA7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDYWxjdWxhdGUgdGhlIE1JQyBWYWx1ZS4KKworCUFyZ3VtZW50czoKKyAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorICAgICAgdUNoYXIJCQlBcHBlbmQgdGhpcyB1Q2hhcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBUa2lwQXBwZW5kQnl0ZSgKKwlJTglQVEtJUF9LRVlfSU5GTwlwVGtpcCwKKwlJTglVQ0hBUiAJCQl1Q2hhcikKK3sKKwkvLyBBcHBlbmQgdGhlIGJ5dGUgdG8gb3VyIHdvcmQtc2l6ZWQgYnVmZmVyCisJcFRraXAtPk0gfD0gKHVDaGFyIDw8ICg4KiBwVGtpcC0+bkJ5dGVzSW5NKSk7CisJcFRraXAtPm5CeXRlc0luTSsrOworCS8vIFByb2Nlc3MgdGhlIHdvcmQgaWYgaXQgaXMgZnVsbC4KKwlpZiggcFRraXAtPm5CeXRlc0luTSA+PSA0ICkKKwl7CisJCXBUa2lwLT5MIF49IHBUa2lwLT5NOworCQlwVGtpcC0+UiBePSBST0wzMiggcFRraXAtPkwsIDE3ICk7CisJCXBUa2lwLT5MICs9IHBUa2lwLT5SOworCQlwVGtpcC0+UiBePSAoKHBUa2lwLT5MICYgMHhmZjAwZmYwMCkgPj4gOCkgfCAoKHBUa2lwLT5MICYgMHgwMGZmMDBmZikgPDwgOCk7CisJCXBUa2lwLT5MICs9IHBUa2lwLT5SOworCQlwVGtpcC0+UiBePSBST0wzMiggcFRraXAtPkwsIDMgKTsKKwkJcFRraXAtPkwgKz0gcFRraXAtPlI7CisJCXBUa2lwLT5SIF49IFJPUjMyKCBwVGtpcC0+TCwgMiApOworCQlwVGtpcC0+TCArPSBwVGtpcC0+UjsKKwkJLy8gQ2xlYXIgdGhlIGJ1ZmZlcgorCQlwVGtpcC0+TSA9IDA7CisJCXBUa2lwLT5uQnl0ZXNJbk0gPSAwOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNhbGN1bGF0ZSB0aGUgTUlDIFZhbHVlLgorCisJQXJndW1lbnRzOgorICAgICAgcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgICBwU3JjCQkJUG9pbnRlciB0byBzb3VyY2UgZGF0YSBmb3IgQ2FsY3VsYXRlIE1JQyBWYWx1ZQorICAgICAgTGVuCQkJSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgc291cmNlIGRhdGEKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QVGtpcEFwcGVuZCgKKwlJTglQVEtJUF9LRVlfSU5GTwlwVGtpcCwKKwlJTglQVUNIQVIJCQlwU3JjLAorCUlOCVVJTlQJCQluQnl0ZXMpCit7CisJLy8gVGhpcyBpcyBzaW1wbGUKKwl3aGlsZShuQnl0ZXMgPiAwKQorCXsKKwkJUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAqcFNyYysrKTsKKwkJbkJ5dGVzLS07CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJR2V0IHRoZSBNSUMgVmFsdWUuCisKKwlBcmd1bWVudHM6CisgICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCQl0aGUgTUlDIFZhbHVlIGlzIHN0b3JlIGluIHBBZC0+UHJpdmF0ZUluZm8uTUlDCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QVGtpcEdldE1JQygKKwlJTglQVEtJUF9LRVlfSU5GTwlwVGtpcCkKK3sKKwkvLyBBcHBlbmQgdGhlIG1pbmltdW0gcGFkZGluZworCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMHg1YSApOworCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCApOworCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCApOworCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCApOworCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCApOworCS8vIGFuZCB0aGVuIHplcm9lcyB1bnRpbCB0aGUgbGVuZ3RoIGlzIGEgbXVsdGlwbGUgb2YgNAorCXdoaWxlKCBwVGtpcC0+bkJ5dGVzSW5NICE9IDAgKQorCXsKKwkJUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAwICk7CisJfQorCS8vIFRoZSBhcHBlbmRCeXRlIGZ1bmN0aW9uIGhhcyBhbHJlYWR5IGNvbXB1dGVkIHRoZSByZXN1bHQuCisJUlRNUFRraXBQdXRVSW50MzIocFRraXAtPk1JQywgcFRraXAtPkwpOworCVJUTVBUa2lwUHV0VUludDMyKHBUa2lwLT5NSUMgKyA0LCBwVGtpcC0+Uik7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlJbml0IFRraXAgZnVuY3Rpb24uCisKKwlBcmd1bWVudHM6CisgICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcFRLZXkgICAgICAgUG9pbnRlciB0byB0aGUgVGVtcG9yYWwgS2V5IChUSyksIFRLIHNoYWxsIGJlIDEyOGJpdHMuCisJCUtleUlkCQlUSyBLZXkgSUQKKwkJcFRBCQkJUG9pbnRlciB0byB0cmFuc21pdHRlciBhZGRyZXNzCisJCXBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBJbml0VGtpcEVuZ2luZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwS2V5LAorCUlOCVVDSEFSCQkJS2V5SWQsCisJSU4JUFVDSEFSCQkJcFRBLAorCUlOCVBVQ0hBUgkJCXBNSUNLZXksCisJSU4JUFVDSEFSCQkJcFRTQywKKwlPVVQJUFVMT05HCQkJcElWMTYsCisJT1VUCVBVTE9ORwkJCXBJVjMyKQoreworCVRLSVBfSVYJdGtpcEl2OworCisJLy8gUHJlcGFyZSA4IGJ5dGVzIFRLSVAgZW5jYXBzdWxhdGlvbiBmb3IgTVBEVQorCU5kaXNaZXJvTWVtb3J5KCZ0a2lwSXYsIHNpemVvZihUS0lQX0lWKSk7CisJdGtpcEl2LklWMTYuZmllbGQucmMwID0gKihwVFNDICsgMSk7CisJdGtpcEl2LklWMTYuZmllbGQucmMxID0gKHRraXBJdi5JVjE2LmZpZWxkLnJjMCB8IDB4MjApICYgMHg3ZjsKKwl0a2lwSXYuSVYxNi5maWVsZC5yYzIgPSAqcFRTQzsKKwl0a2lwSXYuSVYxNi5maWVsZC5DT05UUk9MLmZpZWxkLkV4dElWID0gMTsgIC8vIDA6IG5vbi1leHRlbmRlZCBJViwgMTogYW4gZXh0ZW5kZWQgSVYKKwl0a2lwSXYuSVYxNi5maWVsZC5DT05UUk9MLmZpZWxkLktleUlEID0gS2V5SWQ7CisvLwl0a2lwSXYuSVYzMiA9ICooUFVMT05HKShwVFNDICsgMik7CisJTmRpc01vdmVNZW1vcnkoJnRraXBJdi5JVjMyLCAocFRTQyArIDIpLCA0KTsgICAvLyBDb3B5IElWCisKKwkqcElWMTYgPSB0a2lwSXYuSVYxNi53b3JkOworCSpwSVYzMiA9IHRraXBJdi5JVjMyOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJSW5pdCBNSUMgVmFsdWUgY2FsY3VsYXRpb24gZnVuY3Rpb24gd2hpY2ggaW5jbHVkZSBzZXQgTUlDIGtleSAmCisJCWNhbGN1bGF0ZSBmaXJzdCAxNiBieXRlcyAoREEgKyBTQSArIHByaW9yaXR5ICsgIDApCisKKwlBcmd1bWVudHM6CisgICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcFRLZXkgICAgICAgUG9pbnRlciB0byB0aGUgVGVtcG9yYWwgS2V5IChUSyksIFRLIHNoYWxsIGJlIDEyOGJpdHMuCisJCXBEQQkJCVBvaW50ZXIgdG8gREEgYWRkcmVzcworCQlwU0EJCQlQb2ludGVyIHRvIFNBIGFkZHJlc3MKKwkJcE1JQ0tleQkJcG9pbnRlciB0byBNSUMgS2V5CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBJbml0TUlDRW5naW5lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBLZXksCisJSU4JUFVDSEFSCQkJcERBLAorCUlOCVBVQ0hBUgkJCXBTQSwKKwlJTiAgVUNIQVIgICAgICAgICAgIFVzZXJQcmlvcml0eSwKKwlJTglQVUNIQVIJCQlwTUlDS2V5KQoreworCVVMT05HIFByaW9yaXR5ID0gVXNlclByaW9yaXR5OworCisJLy8gSW5pdCBNSUMgdmFsdWUgY2FsY3VsYXRpb24KKwlSVE1QVGtpcFNldE1JQ0tleSgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcE1JQ0tleSk7CisJLy8gREEKKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcERBLCBNQUNfQUREUl9MRU4pOworCS8vIFNBCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uVHgsIHBTQSwgTUFDX0FERFJfTEVOKTsKKwkvLyBQcmlvcml0eSArIDMgYnl0ZXMgb2YgMAorCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCAoUFVDSEFSKSZQcmlvcml0eSwgNCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDb21wYXJlIE1JQyB2YWx1ZSBvZiByZWNlaXZlZCBNU0RVCisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIHJlY2VpdmVkIFBsYWluIHRleHQgZGF0YQorCQlwREEJCQlQb2ludGVyIHRvIERBIGFkZHJlc3MKKwkJcFNBCQkJUG9pbnRlciB0byBTQSBhZGRyZXNzCisJCXBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQorCQlMZW4gICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSByZWNlaXZlZCBwbGFpbiB0ZXh0IGRhdGEgZXhjbHVkZSBNSUMgdmFsdWUKKworCVJldHVybiBWYWx1ZToKKwkJVFJVRSAgICAgICAgTUlDIHZhbHVlIG1hdGNoZWQKKwkJRkFMU0UgICAgICAgTUlDIHZhbHVlIG1pc21hdGNoZWQKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4JUlRNUFRraXBDb21wYXJlTUlDVmFsdWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJcFNyYywKKwlJTglQVUNIQVIJCQlwREEsCisJSU4JUFVDSEFSCQkJcFNBLAorCUlOCVBVQ0hBUgkJCXBNSUNLZXksCisJSU4JVUNIQVIJCQlVc2VyUHJpb3JpdHksCisJSU4JVUlOVAkJCUxlbikKK3sKKwlVQ0hBUglPbGRNaWNbOF07CisJVUxPTkcJUHJpb3JpdHkgPSBVc2VyUHJpb3JpdHk7CisKKwkvLyBJbml0IE1JQyB2YWx1ZSBjYWxjdWxhdGlvbgorCVJUTVBUa2lwU2V0TUlDS2V5KCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwTUlDS2V5KTsKKwkvLyBEQQorCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwREEsIE1BQ19BRERSX0xFTik7CisJLy8gU0EKKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgcFNBLCBNQUNfQUREUl9MRU4pOworCS8vIFByaW9yaXR5ICsgMyBieXRlcyBvZiAwCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIChQVUNIQVIpJlByaW9yaXR5LCA0KTsKKworCS8vIENhbGN1bGF0ZSBNSUMgdmFsdWUgZnJvbSBwbGFpbiB0ZXh0IGRhdGEKKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgcFNyYywgTGVuKTsKKworCS8vIEdldCBNSUMgdmFsdWRlIGZyb20gcmVjZWl2ZWQgZnJhbWUKKwlOZGlzTW92ZU1lbW9yeShPbGRNaWMsIHBTcmMgKyBMZW4sIDgpOworCisJLy8gR2V0IE1JQyB2YWx1ZSBmcm9tIGRlY3J5cHRlZCBwbGFpbiBkYXRhCisJUlRNUFRraXBHZXRNSUMoJnBBZC0+UHJpdmF0ZUluZm8uUngpOworCisJLy8gTW92ZSBNSUMgdmFsdWUgZnJvbSBNU0RVLCB0aGlzIHN0ZXBzIHNob3VsZCBtb3ZlIHRvIGRhdGEgcGF0aC4KKwkvLyBTaW5jZSB0aGUgTUlDIHZhbHVlIG1pZ2h0IGNyb3NzIE1QRFVzLgorCWlmKCFOZGlzRXF1YWxNZW1vcnkocEFkLT5Qcml2YXRlSW5mby5SeC5NSUMsIE9sZE1pYywgOCkpCisJeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiUlRNUFRraXBDb21wYXJlTUlDVmFsdWUoKTogVEtJUCBNSUMgRXJyb3IgIVxuIikpOyAgLy9NSUMgZXJyb3IuCisKKworCQlyZXR1cm4gKEZBTFNFKTsKKwl9CisJcmV0dXJuIChUUlVFKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNvbXBhcmUgTUlDIHZhbHVlIG9mIHJlY2VpdmVkIE1TRFUKKworCUFyZ3VtZW50czoKKwkJcEFkCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcExMQwkJTExDIGhlYWRlcgorCQlwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSByZWNlaXZlZCBQbGFpbiB0ZXh0IGRhdGEKKwkJcERBCQkJUG9pbnRlciB0byBEQSBhZGRyZXNzCisJCXBTQQkJCVBvaW50ZXIgdG8gU0EgYWRkcmVzcworCQlwTUlDS2V5CQlwb2ludGVyIHRvIE1JQyBLZXkKKwkJTGVuICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgcmVjZWl2ZWQgcGxhaW4gdGV4dCBkYXRhIGV4Y2x1ZGUgTUlDIHZhbHVlCisKKwlSZXR1cm4gVmFsdWU6CisJCVRSVUUgICAgICAgIE1JQyB2YWx1ZSBtYXRjaGVkCisJCUZBTFNFICAgICAgIE1JQyB2YWx1ZSBtaXNtYXRjaGVkCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOCVJUTVBUa2lwQ29tcGFyZU1JQ1ZhbHVlV2l0aExMQygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwTExDLAorCUlOCVBVQ0hBUgkJCXBTcmMsCisJSU4JUFVDSEFSCQkJcERBLAorCUlOCVBVQ0hBUgkJCXBTQSwKKwlJTglQVUNIQVIJCQlwTUlDS2V5LAorCUlOCVVJTlQJCQlMZW4pCit7CisJVUNIQVIJT2xkTWljWzhdOworCVVMT05HCVByaW9yaXR5ID0gMDsKKworCS8vIEluaXQgTUlDIHZhbHVlIGNhbGN1bGF0aW9uCisJUlRNUFRraXBTZXRNSUNLZXkoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBNSUNLZXkpOworCS8vIERBCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBEQSwgTUFDX0FERFJfTEVOKTsKKwkvLyBTQQorCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwU0EsIE1BQ19BRERSX0xFTik7CisJLy8gUHJpb3JpdHkgKyAzIGJ5dGVzIG9mIDAKKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgKFBVQ0hBUikmUHJpb3JpdHksIDQpOworCisJLy8gU3RhcnQgd2l0aCBMTEMgaGVhZGVyCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBMTEMsIDgpOworCisJLy8gQ2FsY3VsYXRlIE1JQyB2YWx1ZSBmcm9tIHBsYWluIHRleHQgZGF0YQorCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwU3JjLCBMZW4pOworCisJLy8gR2V0IE1JQyB2YWx1ZGUgZnJvbSByZWNlaXZlZCBmcmFtZQorCU5kaXNNb3ZlTWVtb3J5KE9sZE1pYywgcFNyYyArIExlbiwgOCk7CisKKwkvLyBHZXQgTUlDIHZhbHVlIGZyb20gZGVjcnlwdGVkIHBsYWluIGRhdGEKKwlSVE1QVGtpcEdldE1JQygmcEFkLT5Qcml2YXRlSW5mby5SeCk7CisKKwkvLyBNb3ZlIE1JQyB2YWx1ZSBmcm9tIE1TRFUsIHRoaXMgc3RlcHMgc2hvdWxkIG1vdmUgdG8gZGF0YSBwYXRoLgorCS8vIFNpbmNlIHRoZSBNSUMgdmFsdWUgbWlnaHQgY3Jvc3MgTVBEVXMuCisJaWYoIU5kaXNFcXVhbE1lbW9yeShwQWQtPlByaXZhdGVJbmZvLlJ4Lk1JQywgT2xkTWljLCA4KSkKKwl7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJSVE1QVGtpcENvbXBhcmVNSUNWYWx1ZVdpdGhMTEMoKTogVEtJUCBNSUMgRXJyb3IgIVxuIikpOyAgLy9NSUMgZXJyb3IuCisKKworCQlyZXR1cm4gKEZBTFNFKTsKKwl9CisJcmV0dXJuIChUUlVFKTsKK30KKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDb3B5IGZyYW1lIGZyb20gd2FpdGluZyBxdWV1ZSBpbnRvIHJlbGF0aXZlIHJpbmcgYnVmZmVyIGFuZCBzZXQKKwlhcHByb3ByaWF0ZSBBU0lDIHJlZ2lzdGVyIHRvIGtpY2sgaGFyZHdhcmUgdHJhbnNtaXQgZnVuY3Rpb24KKworCUFyZ3VtZW50czoKKwkJcEFkCQlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCVBORElTX1BBQ0tFVAlQb2ludGVyIHRvIE5kaXMgUGFja2V0IGZvciBNSUMgY2FsY3VsYXRpb24KKwkJcEVuY2FwCQkJUG9pbnRlciB0byBMTEMgZW5jYXAgZGF0YQorCQlMZW5FbmNhcAkJVG90YWwgZW5jYXAgbGVuZ3RoLCBtaWdodCBiZSAwIHdoaWNoIGluZGljYXRlcyBubyBlbmNhcAorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBDYWxjdWxhdGVNSUNWYWx1ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKKwlJTglQVUNIQVIJCQlwRW5jYXAsCisJSU4JUENJUEhFUl9LRVkJCXBLZXksCisJSU4JVUNIQVIJCQlhcGlkeCkKK3sKKwlQQUNLRVRfSU5GTwkJUGFja2V0SW5mbzsKKwlQVUNIQVIJCQlwU3JjQnVmVkE7CisJVUlOVAkJCVNyY0J1ZkxlbjsKKwlQVUNIQVIJCQlwU3JjOworICAgIFVDSEFSICAgICAgICAgICBVc2VyUHJpb3JpdHk7CisJVUNIQVIJCQl2bGFuX29mZnNldCA9IDA7CisKKwlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwUGFja2V0LCAmUGFja2V0SW5mbywgJnBTcmNCdWZWQSwgJlNyY0J1Zkxlbik7CisKKwlVc2VyUHJpb3JpdHkgPSBSVE1QX0dFVF9QQUNLRVRfVVAocFBhY2tldCk7CisJcFNyYyA9IHBTcmNCdWZWQTsKKworCS8vIGRldGVybWluZSBpZiB0aGlzIGlzIGEgdmxhbiBwYWNrZXQKKwlpZiAoKCgqKHBTcmMgKyAxMikgPDwgOCkgKyAqKHBTcmMgKyAxMykpID09IDB4ODEwMCkKKwkJdmxhbl9vZmZzZXQgPSA0OworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJeworCQlSVE1QSW5pdE1JQ0VuZ2luZSgKKwkJCXBBZCwKKwkJCXBLZXktPktleSwKKwkJCXBTcmMsCisJCQlwU3JjICsgNiwKKwkJCVVzZXJQcmlvcml0eSwKKwkJCXBLZXktPlR4TWljKTsKKwl9CisKKworCWlmIChwRW5jYXAgIT0gTlVMTCkKKwl7CisJCS8vIExMQyBlbmNhcHN1bGF0aW9uCisJCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwRW5jYXAsIDYpOworCQkvLyBQcm90b2NvbCBUeXBlCisJCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwU3JjICsgMTIgKyB2bGFuX29mZnNldCwgMik7CisJfQorCVNyY0J1ZkxlbiAtPSAoMTQgKyB2bGFuX29mZnNldCk7CisJcFNyYyArPSAoMTQgKyB2bGFuX29mZnNldCk7CisJZG8KKwl7CisJCWlmIChTcmNCdWZMZW4gPiAwKQorCQl7CisJCQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcFNyYywgU3JjQnVmTGVuKTsKKwkJfQorCisJCWJyZWFrOwkvLyBObyBuZWVkIGhhbmRsZSBuZXh0IHBhY2tldAorCisJfQl3aGlsZSAoVFJVRSk7CQkvLyBFbmQgb2YgY29weWluZyBwYXlsb2FkCisKKwkvLyBDb21wdXRlIHRoZSBmaW5hbCBNSUMgVmFsdWUKKwlSVE1QVGtpcEdldE1JQygmcEFkLT5Qcml2YXRlSW5mby5UeCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHRraXBfc2JveCgpCQkJCQkJCQkJCQkJCQkJCSovCisvKiBSZXR1cm5zIGEgMTYgYml0IHZhbHVlIGZyb20gYSA2NEsgZW50cnkgdGFibGUuIFRoZSBUYWJsZSAqLworLyogaXMgc3ludGhlc2l6ZWQgZnJvbSB0d28gMjU2IGVudHJ5IGJ5dGUgd2lkZSB0YWJsZXMuCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworVUlOVCB0a2lwX3Nib3goVUlOVCBpbmRleCkKK3sKKwlVSU5UIGluZGV4X2xvdzsKKwlVSU5UIGluZGV4X2hpZ2g7CisJVUlOVCBsZWZ0LCByaWdodDsKKworCWluZGV4X2xvdyA9IChpbmRleCAlIDI1Nik7CisJaW5kZXhfaGlnaCA9ICgoaW5kZXggPj4gOCkgJSAyNTYpOworCisJbGVmdCA9IFRraXBfU2JveF9Mb3dlcltpbmRleF9sb3ddICsgKFRraXBfU2JveF9VcHBlcltpbmRleF9sb3ddICogMjU2KTsKKwlyaWdodCA9IFRraXBfU2JveF9VcHBlcltpbmRleF9oaWdoXSArIChUa2lwX1Nib3hfTG93ZXJbaW5kZXhfaGlnaF0gKiAyNTYpOworCisJcmV0dXJuIChsZWZ0IF4gcmlnaHQpOworfQorCitVSU5UIHJvdHIxKFVJTlQgYSkKK3sKKwl1bnNpZ25lZCBpbnQgYjsKKworCWlmICgoYSAmIDB4MDEpID09IDB4MDEpCisJeworCQliID0gKGEgPj4gMSkgfCAweDgwMDA7CisJfQorCWVsc2UKKwl7CisJCWIgPSAoYSA+PiAxKSAmIDB4N2ZmZjsKKwl9CisJYiA9IGIgJSA2NTUzNjsKKwlyZXR1cm4gYjsKK30KKworVk9JRCBSVE1QVGtpcE1peEtleSgKKwlVQ0hBUiAqa2V5LAorCVVDSEFSICp0YSwKKwlVTE9ORyBwbmwsIC8qIExlYXN0IHNpZ25pZmljYW50IDE2IGJpdHMgb2YgUE4gKi8KKwlVTE9ORyBwbmgsIC8qIE1vc3Qgc2lnbmlmaWNhbnQgMzIgYml0cyBvZiBQTiAqLworCVVDSEFSICpyYzRrZXksCisJVUlOVCAqcDFrKQoreworCisJVUlOVCB0c2MwOworCVVJTlQgdHNjMTsKKwlVSU5UIHRzYzI7CisKKwlVSU5UIHBwazA7CisJVUlOVCBwcGsxOworCVVJTlQgcHBrMjsKKwlVSU5UIHBwazM7CisJVUlOVCBwcGs0OworCVVJTlQgcHBrNTsKKworCUlOVCBpOworCUlOVCBqOworCisJdHNjMCA9ICh1bnNpZ25lZCBpbnQpKChwbmggPj4gMTYpICUgNjU1MzYpOyAvKiBtc2IgKi8KKwl0c2MxID0gKHVuc2lnbmVkIGludCkocG5oICUgNjU1MzYpOworCXRzYzIgPSAodW5zaWduZWQgaW50KShwbmwgJSA2NTUzNik7IC8qIGxzYiAqLworCisJLyogUGhhc2UgMSwgc3RlcCAxICovCisJcDFrWzBdID0gdHNjMTsKKwlwMWtbMV0gPSB0c2MwOworCXAxa1syXSA9IChVSU5UKSh0YVswXSArICh0YVsxXSoyNTYpKTsKKwlwMWtbM10gPSAoVUlOVCkodGFbMl0gKyAodGFbM10qMjU2KSk7CisJcDFrWzRdID0gKFVJTlQpKHRhWzRdICsgKHRhWzVdKjI1NikpOworCisJLyogUGhhc2UgMSwgc3RlcCAyICovCisJZm9yIChpPTA7IGk8ODsgaSsrKQorCXsKKwkJaiA9IDIqKGkgJiAxKTsKKwkJcDFrWzBdID0gKHAxa1swXSArIHRraXBfc2JveCggKHAxa1s0XSBeICgoMjU2KmtleVsxK2pdKSArIGtleVtqXSkpICUgNjU1MzYgKSkgJSA2NTUzNjsKKwkJcDFrWzFdID0gKHAxa1sxXSArIHRraXBfc2JveCggKHAxa1swXSBeICgoMjU2KmtleVs1K2pdKSArIGtleVs0K2pdKSkgJSA2NTUzNiApKSAlIDY1NTM2OworCQlwMWtbMl0gPSAocDFrWzJdICsgdGtpcF9zYm94KCAocDFrWzFdIF4gKCgyNTYqa2V5Wzkral0pICsga2V5Wzgral0pKSAlIDY1NTM2ICkpICUgNjU1MzY7CisJCXAxa1szXSA9IChwMWtbM10gKyB0a2lwX3Nib3goIChwMWtbMl0gXiAoKDI1NiprZXlbMTMral0pICsga2V5WzEyK2pdKSkgJSA2NTUzNiApKSAlIDY1NTM2OworCQlwMWtbNF0gPSAocDFrWzRdICsgdGtpcF9zYm94KCAocDFrWzNdIF4gKCgoMjU2KmtleVsxK2pdKSArIGtleVtqXSkpKSAlIDY1NTM2ICkpICUgNjU1MzY7CisJCXAxa1s0XSA9IChwMWtbNF0gKyBpKSAlIDY1NTM2OworCX0KKworCS8qIFBoYXNlIDIsIFN0ZXAgMSAqLworCXBwazAgPSBwMWtbMF07CisJcHBrMSA9IHAxa1sxXTsKKwlwcGsyID0gcDFrWzJdOworCXBwazMgPSBwMWtbM107CisJcHBrNCA9IHAxa1s0XTsKKwlwcGs1ID0gKHAxa1s0XSArIHRzYzIpICUgNjU1MzY7CisKKwkvKiBQaGFzZTIsIFN0ZXAgMiAqLworCXBwazAgPSBwcGswICsgdGtpcF9zYm94KCAocHBrNSBeICgoMjU2KmtleVsxXSkgKyBrZXlbMF0pKSAlIDY1NTM2KTsKKwlwcGsxID0gcHBrMSArIHRraXBfc2JveCggKHBwazAgXiAoKDI1NiprZXlbM10pICsga2V5WzJdKSkgJSA2NTUzNik7CisJcHBrMiA9IHBwazIgKyB0a2lwX3Nib3goIChwcGsxIF4gKCgyNTYqa2V5WzVdKSArIGtleVs0XSkpICUgNjU1MzYpOworCXBwazMgPSBwcGszICsgdGtpcF9zYm94KCAocHBrMiBeICgoMjU2KmtleVs3XSkgKyBrZXlbNl0pKSAlIDY1NTM2KTsKKwlwcGs0ID0gcHBrNCArIHRraXBfc2JveCggKHBwazMgXiAoKDI1NiprZXlbOV0pICsga2V5WzhdKSkgJSA2NTUzNik7CisJcHBrNSA9IHBwazUgKyB0a2lwX3Nib3goIChwcGs0IF4gKCgyNTYqa2V5WzExXSkgKyBrZXlbMTBdKSkgJSA2NTUzNik7CisKKwlwcGswID0gcHBrMCArIHJvdHIxKHBwazUgXiAoKDI1NiprZXlbMTNdKSArIGtleVsxMl0pKTsKKwlwcGsxID0gcHBrMSArIHJvdHIxKHBwazAgXiAoKDI1NiprZXlbMTVdKSArIGtleVsxNF0pKTsKKwlwcGsyID0gcHBrMiArIHJvdHIxKHBwazEpOworCXBwazMgPSBwcGszICsgcm90cjEocHBrMik7CisJcHBrNCA9IHBwazQgKyByb3RyMShwcGszKTsKKwlwcGs1ID0gcHBrNSArIHJvdHIxKHBwazQpOworCisJLyogUGhhc2UgMiwgU3RlcCAzICovCisgICAgLyogUGhhc2UgMiwgU3RlcCAzICovCisKKwl0c2MwID0gKHVuc2lnbmVkIGludCkoKHBuaCA+PiAxNikgJSA2NTUzNik7IC8qIG1zYiAqLworCXRzYzEgPSAodW5zaWduZWQgaW50KShwbmggJSA2NTUzNik7CisJdHNjMiA9ICh1bnNpZ25lZCBpbnQpKHBubCAlIDY1NTM2KTsgLyogbHNiICovCisKKwlyYzRrZXlbMF0gPSAodHNjMiA+PiA4KSAlIDI1NjsKKwlyYzRrZXlbMV0gPSAoKCh0c2MyID4+IDgpICUgMjU2KSB8IDB4MjApICYgMHg3ZjsKKwlyYzRrZXlbMl0gPSB0c2MyICUgMjU2OworCXJjNGtleVszXSA9ICgocHBrNSBeICgoMjU2KmtleVsxXSkgKyBrZXlbMF0pKSA+PiAxKSAlIDI1NjsKKworCXJjNGtleVs0XSA9IHBwazAgJSAyNTY7CisJcmM0a2V5WzVdID0gKHBwazAgPj4gOCkgJSAyNTY7CisKKwlyYzRrZXlbNl0gPSBwcGsxICUgMjU2OworCXJjNGtleVs3XSA9IChwcGsxID4+IDgpICUgMjU2OworCisJcmM0a2V5WzhdID0gcHBrMiAlIDI1NjsKKwlyYzRrZXlbOV0gPSAocHBrMiA+PiA4KSAlIDI1NjsKKworCXJjNGtleVsxMF0gPSBwcGszICUgMjU2OworCXJjNGtleVsxMV0gPSAocHBrMyA+PiA4KSAlIDI1NjsKKworCXJjNGtleVsxMl0gPSBwcGs0ICUgMjU2OworCXJjNGtleVsxM10gPSAocHBrNCA+PiA4KSAlIDI1NjsKKworCXJjNGtleVsxNF0gPSBwcGs1ICUgMjU2OworCXJjNGtleVsxNV0gPSAocHBrNSA+PiA4KSAlIDI1NjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogY29uc3RydWN0X21pY19oZWFkZXIxKCkgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEJ1aWxkcyB0aGUgZmlyc3QgTUlDIGhlYWRlciBibG9jayBmcm9tICAgICAgICovCisvKiBoZWFkZXIgZmllbGRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBjb25zdHJ1Y3RfbWljX2hlYWRlcjEoCisJdW5zaWduZWQgY2hhciAqbWljX2hlYWRlcjEsCisJaW50IGhlYWRlcl9sZW5ndGgsCisJdW5zaWduZWQgY2hhciAqbXBkdSkKK3sKKwltaWNfaGVhZGVyMVswXSA9ICh1bnNpZ25lZCBjaGFyKSgoaGVhZGVyX2xlbmd0aCAtIDIpIC8gMjU2KTsKKwltaWNfaGVhZGVyMVsxXSA9ICh1bnNpZ25lZCBjaGFyKSgoaGVhZGVyX2xlbmd0aCAtIDIpICUgMjU2KTsKKwltaWNfaGVhZGVyMVsyXSA9IG1wZHVbMF0gJiAweGNmOyAgICAvKiBNdXRlIENGIHBvbGwgJiBDRiBhY2sgYml0cyAqLworCW1pY19oZWFkZXIxWzNdID0gbXBkdVsxXSAmIDB4Yzc7ICAgIC8qIE11dGUgcmV0cnksIG1vcmUgZGF0YSBhbmQgcHdyIG1ndCBiaXRzICovCisJbWljX2hlYWRlcjFbNF0gPSBtcGR1WzRdOyAgICAgICAvKiBBMSAqLworCW1pY19oZWFkZXIxWzVdID0gbXBkdVs1XTsKKwltaWNfaGVhZGVyMVs2XSA9IG1wZHVbNl07CisJbWljX2hlYWRlcjFbN10gPSBtcGR1WzddOworCW1pY19oZWFkZXIxWzhdID0gbXBkdVs4XTsKKwltaWNfaGVhZGVyMVs5XSA9IG1wZHVbOV07CisJbWljX2hlYWRlcjFbMTBdID0gbXBkdVsxMF07ICAgICAvKiBBMiAqLworCW1pY19oZWFkZXIxWzExXSA9IG1wZHVbMTFdOworCW1pY19oZWFkZXIxWzEyXSA9IG1wZHVbMTJdOworCW1pY19oZWFkZXIxWzEzXSA9IG1wZHVbMTNdOworCW1pY19oZWFkZXIxWzE0XSA9IG1wZHVbMTRdOworCW1pY19oZWFkZXIxWzE1XSA9IG1wZHVbMTVdOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogY29uc3RydWN0X21pY19oZWFkZXIyKCkgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEJ1aWxkcyB0aGUgbGFzdCBNSUMgaGVhZGVyIGJsb2NrIGZyb20gICAgICAgICovCisvKiBoZWFkZXIgZmllbGRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBjb25zdHJ1Y3RfbWljX2hlYWRlcjIoCisJdW5zaWduZWQgY2hhciAqbWljX2hlYWRlcjIsCisJdW5zaWduZWQgY2hhciAqbXBkdSwKKwlpbnQgYTRfZXhpc3RzLAorCWludCBxY19leGlzdHMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpPDE2OyBpKyspIG1pY19oZWFkZXIyW2ldPTB4MDA7CisKKwltaWNfaGVhZGVyMlswXSA9IG1wZHVbMTZdOyAgICAvKiBBMyAqLworCW1pY19oZWFkZXIyWzFdID0gbXBkdVsxN107CisJbWljX2hlYWRlcjJbMl0gPSBtcGR1WzE4XTsKKwltaWNfaGVhZGVyMlszXSA9IG1wZHVbMTldOworCW1pY19oZWFkZXIyWzRdID0gbXBkdVsyMF07CisJbWljX2hlYWRlcjJbNV0gPSBtcGR1WzIxXTsKKworCS8vIEluIFNlcXVlbmNlIENvbnRyb2wgZmllbGQsIG11dGUgc2VxdWVuY2UgbnVtZXIgYml0cyAoMTItYml0KQorCW1pY19oZWFkZXIyWzZdID0gbXBkdVsyMl0gJiAweDBmOyAgIC8qIFNDICovCisJbWljX2hlYWRlcjJbN10gPSAweDAwOyAvKiBtcGR1WzIzXTsgKi8KKworCWlmICgoIXFjX2V4aXN0cykgJiBhNF9leGlzdHMpCisJeworCQlmb3IgKGk9MDtpPDY7aSsrKSBtaWNfaGVhZGVyMls4K2ldID0gbXBkdVsyNCtpXTsgICAvKiBBNCAqLworCisJfQorCisJaWYgKHFjX2V4aXN0cyAmJiAoIWE0X2V4aXN0cykpCisJeworCQltaWNfaGVhZGVyMls4XSA9IG1wZHVbMjRdICYgMHgwZjsgLyogbXV0ZSBiaXRzIDE1IC0gNCAqLworCQltaWNfaGVhZGVyMls5XSA9IG1wZHVbMjVdICYgMHgwMDsKKwl9CisKKwlpZiAocWNfZXhpc3RzICYmIGE0X2V4aXN0cykKKwl7CisJCWZvciAoaT0wO2k8NjtpKyspIG1pY19oZWFkZXIyWzgraV0gPSBtcGR1WzI0K2ldOyAgIC8qIEE0ICovCisKKwkJbWljX2hlYWRlcjJbMTRdID0gbXBkdVszMF0gJiAweDBmOworCQltaWNfaGVhZGVyMlsxNV0gPSBtcGR1WzMxXSAmIDB4MDA7CisJfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBjb25zdHJ1Y3RfbWljX2l2KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQnVpbGRzIHRoZSBNSUMgSVYgZnJvbSBoZWFkZXIgZmllbGRzIGFuZCBQTiAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgY29uc3RydWN0X21pY19pdigKKwl1bnNpZ25lZCBjaGFyICptaWNfaXYsCisJaW50IHFjX2V4aXN0cywKKwlpbnQgYTRfZXhpc3RzLAorCXVuc2lnbmVkIGNoYXIgKm1wZHUsCisJdW5zaWduZWQgaW50IHBheWxvYWRfbGVuZ3RoLAorCXVuc2lnbmVkIGNoYXIgKnBuX3ZlY3RvcikKK3sKKwlpbnQgaTsKKworCW1pY19pdlswXSA9IDB4NTk7CisJaWYgKHFjX2V4aXN0cyAmJiBhNF9leGlzdHMpCisJCW1pY19pdlsxXSA9IG1wZHVbMzBdICYgMHgwZjsgICAgLyogUW9TX1RDICAgICAgICAgICAqLworCWlmIChxY19leGlzdHMgJiYgIWE0X2V4aXN0cykKKwkJbWljX2l2WzFdID0gbXBkdVsyNF0gJiAweDBmOyAgIC8qIG11dGUgYml0cyA3LTQgICAgKi8KKwlpZiAoIXFjX2V4aXN0cykKKwkJbWljX2l2WzFdID0gMHgwMDsKKwlmb3IgKGkgPSAyOyBpIDwgODsgaSsrKQorCQltaWNfaXZbaV0gPSBtcGR1W2kgKyA4XTsgICAgICAgICAgICAgICAgICAgIC8qIG1pY19pdlsyOjddID0gQTJbMDo1XSA9IG1wZHVbMTA6MTVdICovCisjaWZkZWYgQ09OU0lTVEVOVF9QTl9PUkRFUgorCQlmb3IgKGkgPSA4OyBpIDwgMTQ7IGkrKykKKwkJCW1pY19pdltpXSA9IHBuX3ZlY3RvcltpIC0gOF07ICAgICAgICAgICAvKiBtaWNfaXZbODoxM10gPSBQTlswOjVdICovCisjZWxzZQorCQlmb3IgKGkgPSA4OyBpIDwgMTQ7IGkrKykKKwkJCW1pY19pdltpXSA9IHBuX3ZlY3RvclsxMyAtIGldOyAgICAgICAgICAvKiBtaWNfaXZbODoxM10gPSBQTls1OjBdICovCisjZW5kaWYKKwlpID0gKHBheWxvYWRfbGVuZ3RoIC8gMjU2KTsKKwlpID0gKHBheWxvYWRfbGVuZ3RoICUgMjU2KTsKKwltaWNfaXZbMTRdID0gKHVuc2lnbmVkIGNoYXIpIChwYXlsb2FkX2xlbmd0aCAvIDI1Nik7CisJbWljX2l2WzE1XSA9ICh1bnNpZ25lZCBjaGFyKSAocGF5bG9hZF9sZW5ndGggJSAyNTYpOworCit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogYml0d2lzZV94b3IoKSAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEEgMTI4IGJpdCwgYml0d2lzZSBleGNsdXNpdmUgb3IgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGJpdHdpc2VfeG9yKHVuc2lnbmVkIGNoYXIgKmluYSwgdW5zaWduZWQgY2hhciAqaW5iLCB1bnNpZ25lZCBjaGFyICpvdXQpCit7CisJaW50IGk7CisJZm9yIChpPTA7IGk8MTY7IGkrKykKKwl7CisJCW91dFtpXSA9IGluYVtpXSBeIGluYltpXTsKKwl9Cit9CisKKwordm9pZCBhZXMxMjhrMTI4ZCh1bnNpZ25lZCBjaGFyICprZXksIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGNoYXIgKmNpcGhlcnRleHQpCit7CisJaW50IHJvdW5kOworCWludCBpOworCXVuc2lnbmVkIGNoYXIgaW50ZXJtZWRpYXRlYVsxNl07CisJdW5zaWduZWQgY2hhciBpbnRlcm1lZGlhdGViWzE2XTsKKwl1bnNpZ25lZCBjaGFyIHJvdW5kX2tleVsxNl07CisKKwlmb3IoaT0wOyBpPDE2OyBpKyspIHJvdW5kX2tleVtpXSA9IGtleVtpXTsKKworCWZvciAocm91bmQgPSAwOyByb3VuZCA8IDExOyByb3VuZCsrKQorCXsKKwkJaWYgKHJvdW5kID09IDApCisJCXsKKwkJCXhvcl8xMjgocm91bmRfa2V5LCBkYXRhLCBjaXBoZXJ0ZXh0KTsKKwkJCW5leHRfa2V5KHJvdW5kX2tleSwgcm91bmQpOworCQl9CisJCWVsc2UgaWYgKHJvdW5kID09IDEwKQorCQl7CisJCQlieXRlX3N1YihjaXBoZXJ0ZXh0LCBpbnRlcm1lZGlhdGVhKTsKKwkJCXNoaWZ0X3JvdyhpbnRlcm1lZGlhdGVhLCBpbnRlcm1lZGlhdGViKTsKKwkJCXhvcl8xMjgoaW50ZXJtZWRpYXRlYiwgcm91bmRfa2V5LCBjaXBoZXJ0ZXh0KTsKKwkJfQorCQllbHNlICAgIC8qIDEgLSA5ICovCisJCXsKKwkJCWJ5dGVfc3ViKGNpcGhlcnRleHQsIGludGVybWVkaWF0ZWEpOworCQkJc2hpZnRfcm93KGludGVybWVkaWF0ZWEsIGludGVybWVkaWF0ZWIpOworCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYlswXSwgJmludGVybWVkaWF0ZWFbMF0pOworCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYls0XSwgJmludGVybWVkaWF0ZWFbNF0pOworCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYls4XSwgJmludGVybWVkaWF0ZWFbOF0pOworCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYlsxMl0sICZpbnRlcm1lZGlhdGVhWzEyXSk7CisJCQl4b3JfMTI4KGludGVybWVkaWF0ZWEsIHJvdW5kX2tleSwgY2lwaGVydGV4dCk7CisJCQluZXh0X2tleShyb3VuZF9rZXksIHJvdW5kKTsKKwkJfQorCX0KKworfQorCit2b2lkIGNvbnN0cnVjdF9jdHJfcHJlbG9hZCgKKwl1bnNpZ25lZCBjaGFyICpjdHJfcHJlbG9hZCwKKwlpbnQgYTRfZXhpc3RzLAorCWludCBxY19leGlzdHMsCisJdW5zaWduZWQgY2hhciAqbXBkdSwKKwl1bnNpZ25lZCBjaGFyICpwbl92ZWN0b3IsCisJaW50IGMpCit7CisKKwlpbnQgaSA9IDA7CisJZm9yIChpPTA7IGk8MTY7IGkrKykgY3RyX3ByZWxvYWRbaV0gPSAweDAwOworCWkgPSAwOworCisJY3RyX3ByZWxvYWRbMF0gPSAweDAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmbGFnICovCisJaWYgKHFjX2V4aXN0cyAmJiBhNF9leGlzdHMpIGN0cl9wcmVsb2FkWzFdID0gbXBkdVszMF0gJiAweDBmOyAgIC8qIFFvQ19Db250cm9sICAqLworCWlmIChxY19leGlzdHMgJiYgIWE0X2V4aXN0cykgY3RyX3ByZWxvYWRbMV0gPSBtcGR1WzI0XSAmIDB4MGY7CisKKwlmb3IgKGkgPSAyOyBpIDwgODsgaSsrKQorCQljdHJfcHJlbG9hZFtpXSA9IG1wZHVbaSArIDhdOyAgICAgICAgICAgICAgICAgICAgICAgLyogY3RyX3ByZWxvYWRbMjo3XSA9IEEyWzA6NV0gPSBtcGR1WzEwOjE1XSAqLworI2lmZGVmIENPTlNJU1RFTlRfUE5fT1JERVIKKwkgIGZvciAoaSA9IDg7IGkgPCAxNDsgaSsrKQorCQkJY3RyX3ByZWxvYWRbaV0gPSAgICBwbl92ZWN0b3JbaSAtIDhdOyAgICAgICAgICAgLyogY3RyX3ByZWxvYWRbODoxM10gPSBQTlswOjVdICovCisjZWxzZQorCSAgZm9yIChpID0gODsgaSA8IDE0OyBpKyspCisJCQljdHJfcHJlbG9hZFtpXSA9ICAgIHBuX3ZlY3RvclsxMyAtIGldOyAgICAgICAgICAvKiBjdHJfcHJlbG9hZFs4OjEzXSA9IFBOWzU6MF0gKi8KKyNlbmRpZgorCWN0cl9wcmVsb2FkWzE0XSA9ICAodW5zaWduZWQgY2hhcikgKGMgLyAyNTYpOyAvLyBDdHIKKwljdHJfcHJlbG9hZFsxNV0gPSAgKHVuc2lnbmVkIGNoYXIpIChjICUgMjU2KTsKKworfQorCisKKy8vCisvLyBUUlVFOiBTdWNjZXNzIQorLy8gRkFMU0U6IERlY3J5cHQgRXJyb3IhCisvLworQk9PTEVBTiBSVE1QU29mdERlY3J5cHRUS0lQKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUglwRGF0YSwKKwlJTiBVTE9ORwlEYXRhQnl0ZUNudCwKKwlJTiBVQ0hBUiAgICBVc2VyUHJpb3JpdHksCisJSU4gUENJUEhFUl9LRVkJcFdwYUtleSkKK3sKKwlVQ0hBUgkJCUtleUlEOworCVVJTlQJCQlIZWFkZXJMZW47CisgICAgVUNIQVIJCQlmYzA7CisJVUNIQVIJCQlmYzE7CisJVVNIT1JUCQkJZmM7CisJVUlOVAkJCWZyYW1lX3R5cGU7CisJVUlOVAkJCWZyYW1lX3N1YnR5cGU7CisgICAgVUlOVAkJCWZyb21fZHM7CisgICAgVUlOVAkJCXRvX2RzOworCUlOVAkJCQlhNF9leGlzdHM7CisJSU5UCQkJCXFjX2V4aXN0czsKKwlVU0hPUlQJCQlkdXJhdGlvbjsKKwlVU0hPUlQJCQlzZXFfY29udHJvbDsKKwlVU0hPUlQJCQlxb3NfY29udHJvbDsKKwlVQ0hBUgkJCVRBW01BQ19BRERSX0xFTl07CisJVUNIQVIJCQlEQVtNQUNfQUREUl9MRU5dOworCVVDSEFSCQkJU0FbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUgkJCVJDNEtleVsxNl07CisJVUlOVAkJCXAxa1s1XTsgLy9mb3IgbWl4X2tleTsKKwlVTE9ORwkJCXBubDsvKiBMZWFzdCBzaWduaWZpY2FudCAxNiBiaXRzIG9mIFBOICovCisJVUxPTkcJCQlwbmg7LyogTW9zdCBzaWduaWZpY2FudCAzMiBiaXRzIG9mIFBOICovCisJVUlOVAkJCW51bV9ibG9ja3M7CisJVUlOVAkJCXBheWxvYWRfcmVtYWluZGVyOworCUFSQ0ZPVVJDT05URVhUIAlBcmNGb3VyQ29udGV4dDsKKwlVSU5UCQkJY3JjMzIgPSAwOworCVVJTlQJCQl0cmFpbGZjcyA9IDA7CisJVUNIQVIJCQlNSUNbOF07CisJVUNIQVIJCQlUcmFpbE1JQ1s4XTsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKXBEYXRhLCBESVJfUkVBRCwgRkFMU0UpOworI2VuZGlmCisKKwlmYzAgPSAqcERhdGE7CisJZmMxID0gKihwRGF0YSArIDEpOworCisJZmMgPSAqKChQVVNIT1JUKXBEYXRhKTsKKworCWZyYW1lX3R5cGUgPSAoKGZjMCA+PiAyKSAmIDB4MDMpOworCWZyYW1lX3N1YnR5cGUgPSAoKGZjMCA+PiA0KSAmIDB4MGYpOworCisgICAgZnJvbV9kcyA9IChmYzEgJiAweDIpID4+IDE7CisgICAgdG9fZHMgPSAoZmMxICYgMHgxKTsKKworICAgIGE0X2V4aXN0cyA9IChmcm9tX2RzICYgdG9fZHMpOworICAgIHFjX2V4aXN0cyA9ICgoZnJhbWVfc3VidHlwZSA9PSAweDA4KSB8fCAgICAvKiBBc3N1bWVkIFFvUyBzdWJ0eXBlcyAqLworICAgICAgICAgICAgICAgICAgKGZyYW1lX3N1YnR5cGUgPT0gMHgwOSkgfHwgICAvKiBMaWtlbHkgdG8gY2hhbmdlLiAgICAqLworICAgICAgICAgICAgICAgICAgKGZyYW1lX3N1YnR5cGUgPT0gMHgwYSkgfHwKKyAgICAgICAgICAgICAgICAgIChmcmFtZV9zdWJ0eXBlID09IDB4MGIpCisgICAgICAgICAgICAgICAgICk7CisKKwlIZWFkZXJMZW4gPSAyNDsKKwlpZiAoYTRfZXhpc3RzKQorCQlIZWFkZXJMZW4gKz0gNjsKKworCUtleUlEID0gKigoUFVDSEFSKShwRGF0YSsgSGVhZGVyTGVuICsgMykpOworCUtleUlEID0gS2V5SUQgPj4gNjsKKworCWlmIChwV3BhS2V5W0tleUlEXS5LZXlMZW4gPT0gMCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBTb2Z0RGVjcnlwdFRLSVAgZmFpbGVkIShLZXlJRFslZF0gTGVuZ3RoIGNhbiBub3QgYmUgMClcbiIsIEtleUlEKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlkdXJhdGlvbiA9ICooKFBVU0hPUlQpKHBEYXRhKzIpKTsKKworCXNlcV9jb250cm9sID0gKigoUFVTSE9SVCkocERhdGErMjIpKTsKKworCWlmIChxY19leGlzdHMpCisJeworCQlpZiAoYTRfZXhpc3RzKQorCQl7CisJCQlxb3NfY29udHJvbCA9ICooKFBVU0hPUlQpKHBEYXRhKzMwKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlxb3NfY29udHJvbCA9ICooKFBVU0hPUlQpKHBEYXRhKzI0KSk7CisJCX0KKwl9CisKKwlpZiAodG9fZHMgPT0gMCAmJiBmcm9tX2RzID09IDEpCisJeworCQlOZGlzTW92ZU1lbW9yeShEQSwgcERhdGErNCwgTUFDX0FERFJfTEVOKTsKKwkJTmRpc01vdmVNZW1vcnkoU0EsIHBEYXRhKzE2LCBNQUNfQUREUl9MRU4pOworCQlOZGlzTW92ZU1lbW9yeShUQSwgcERhdGErMTAsIE1BQ19BRERSX0xFTik7ICAvL0JTU0lECisJfQorCWVsc2UgaWYgKHRvX2RzID09IDAgJiYgZnJvbV9kcyA9PSAwICkKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KFRBLCBwRGF0YSsxMCwgTUFDX0FERFJfTEVOKTsKKwkJTmRpc01vdmVNZW1vcnkoREEsIHBEYXRhKzQsIE1BQ19BRERSX0xFTik7CisJCU5kaXNNb3ZlTWVtb3J5KFNBLCBwRGF0YSsxMCwgTUFDX0FERFJfTEVOKTsKKwl9CisJZWxzZSBpZiAodG9fZHMgPT0gMSAmJiBmcm9tX2RzID09IDApCisJeworCQlOZGlzTW92ZU1lbW9yeShTQSwgcERhdGErMTAsIE1BQ19BRERSX0xFTik7CisJCU5kaXNNb3ZlTWVtb3J5KFRBLCBwRGF0YSsxMCwgTUFDX0FERFJfTEVOKTsKKwkJTmRpc01vdmVNZW1vcnkoREEsIHBEYXRhKzE2LCBNQUNfQUREUl9MRU4pOworCX0KKwllbHNlIGlmICh0b19kcyA9PSAxICYmIGZyb21fZHMgPT0gMSkKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KFRBLCBwRGF0YSsxMCwgTUFDX0FERFJfTEVOKTsKKwkJTmRpc01vdmVNZW1vcnkoREEsIHBEYXRhKzE2LCBNQUNfQUREUl9MRU4pOworCQlOZGlzTW92ZU1lbW9yeShTQSwgcERhdGErMjIsIE1BQ19BRERSX0xFTik7CisJfQorCisJbnVtX2Jsb2NrcyA9IChEYXRhQnl0ZUNudCAtIDE2KSAvIDE2OworCXBheWxvYWRfcmVtYWluZGVyID0gKERhdGFCeXRlQ250IC0gMTYpICUgMTY7CisKKwlwbmwgPSAoKihwRGF0YSArIEhlYWRlckxlbikpICogMjU2ICsgKihwRGF0YSArIEhlYWRlckxlbiArIDIpOworCXBuaCA9ICooKFBVTE9ORykocERhdGEgKyBIZWFkZXJMZW4gKyA0KSk7CisJcG5oID0gY3B1MmxlMzIocG5oKTsKKwlSVE1QVGtpcE1peEtleShwV3BhS2V5W0tleUlEXS5LZXksIFRBLCBwbmwsIHBuaCwgUkM0S2V5LCBwMWspOworCisJQVJDRk9VUl9JTklUKCZBcmNGb3VyQ29udGV4dCwgUkM0S2V5LCAxNik7CisKKwlBUkNGT1VSX0RFQ1JZUFQoJkFyY0ZvdXJDb250ZXh0LCBwRGF0YSArIEhlYWRlckxlbiwgcERhdGEgKyBIZWFkZXJMZW4gKyA4LCBEYXRhQnl0ZUNudCAtIEhlYWRlckxlbiAtIDgpOworCU5kaXNNb3ZlTWVtb3J5KCZ0cmFpbGZjcywgcERhdGEgKyBEYXRhQnl0ZUNudCAtIDggLSA0LCA0KTsKKwljcmMzMiA9IFJUTVBfQ0FMQ19GQ1MzMihQUFBJTklURkNTMzIsIHBEYXRhICsgSGVhZGVyTGVuLCBEYXRhQnl0ZUNudCAtIEhlYWRlckxlbiAtIDggLSA0KTsgIC8vU2tpcCBJVitFSVYgOCBieXRlcyAmIFNraXAgbGFzdCA0IGJ5dGVzKEZDUykuCisJY3JjMzIgXj0gMHhmZmZmZmZmZjsgICAgICAgICAgICAgLyogY29tcGxlbWVudCAqLworCisgICAgaWYoY3JjMzIgIT0gY3B1MmxlMzIodHJhaWxmY3MpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNvZnREZWNyeXB0VEtJUCwgV0VQIERhdGEgSUNWIEVycm9yICFcbiIpKTsJIC8vSUNWIGVycm9yLgorCisJCXJldHVybiAoRkFMU0UpOworCX0KKworCU5kaXNNb3ZlTWVtb3J5KFRyYWlsTUlDLCBwRGF0YSArIERhdGFCeXRlQ250IC0gOCAtIDggLSA0LCA4KTsKKwlSVE1QSW5pdE1JQ0VuZ2luZShwQWQsIHBXcGFLZXlbS2V5SURdLktleSwgREEsIFNBLCBVc2VyUHJpb3JpdHksIHBXcGFLZXlbS2V5SURdLlJ4TWljKTsKKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcERhdGEgKyBIZWFkZXJMZW4sIERhdGFCeXRlQ250IC0gSGVhZGVyTGVuIC0gOCAtIDEyKTsKKwlSVE1QVGtpcEdldE1JQygmcEFkLT5Qcml2YXRlSW5mby5UeCk7CisJTmRpc01vdmVNZW1vcnkoTUlDLCBwQWQtPlByaXZhdGVJbmZvLlR4Lk1JQywgOCk7CisKKwlpZiAoIU5kaXNFcXVhbE1lbW9yeShNSUMsIFRyYWlsTUlDLCA4KSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBTb2Z0RGVjcnlwdFRLSVAsIFdFUCBEYXRhIE1JQyBFcnJvciAhXG4iKSk7CSAvL01JQyBlcnJvci4KKwkJLy9SVE1QUmVwb3J0TWljRXJyb3IocEFkLCAmcFdwYUtleVtLZXlJRF0pOwkvLyBtYXJrZWQgYnkgQWxiZXJ0WSBAIDIwMDYwNjMwCisJCXJldHVybiAoRkFMU0UpOworCX0KKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKXBEYXRhLCBESVJfUkVBRCwgRkFMU0UpOworI2VuZGlmCisJLy9EQkdQUklOVChSVF9ERUJVR19UUkFDRSwgIlJUTVBTb2Z0RGVjcnlwdFRLSVAgRGVjcmlwdCBkb25lISFcbiIpOworCXJldHVybiBUUlVFOworfQorCisKKworCitCT09MRUFOIFJUTVBTb2Z0RGVjcnlwdEFFUygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIJcERhdGEsCisJSU4gVUxPTkcJRGF0YUJ5dGVDbnQsCisJSU4gUENJUEhFUl9LRVkJcFdwYUtleSkKK3sKKwlVQ0hBUgkJCUtleUlEOworCVVJTlQJCQlIZWFkZXJMZW47CisJVUNIQVIJCQlQTls2XTsKKwlVSU5UCQkJcGF5bG9hZF9sZW47CisJVUlOVAkJCW51bV9ibG9ja3M7CisJVUlOVAkJCXBheWxvYWRfcmVtYWluZGVyOworCVVTSE9SVAkJCWZjOworCVVDSEFSCQkJZmMwOworCVVDSEFSCQkJZmMxOworCVVJTlQJCQlmcmFtZV90eXBlOworCVVJTlQJCQlmcmFtZV9zdWJ0eXBlOworCVVJTlQJCQlmcm9tX2RzOworCVVJTlQJCQl0b19kczsKKwlJTlQJCQkJYTRfZXhpc3RzOworCUlOVAkJCQlxY19leGlzdHM7CisJVUNIQVIJCQlhZXNfb3V0WzE2XTsKKwlpbnQgCQkJcGF5bG9hZF9pbmRleDsKKwlVSU5UIAkJCWk7CisJVUNIQVIgCQkJY3RyX3ByZWxvYWRbMTZdOworCVVDSEFSIAkJCWNoYWluX2J1ZmZlclsxNl07CisJVUNIQVIgCQkJcGFkZGVkX2J1ZmZlclsxNl07CisJVUNIQVIgCQkJbWljX2l2WzE2XTsKKwlVQ0hBUiAJCQltaWNfaGVhZGVyMVsxNl07CisJVUNIQVIgCQkJbWljX2hlYWRlcjJbMTZdOworCVVDSEFSCQkJTUlDWzhdOworCVVDSEFSCQkJVHJhaWxNSUNbOF07CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUilwRGF0YSwgRElSX1JFQUQsIEZBTFNFKTsKKyNlbmRpZgorCisJZmMwID0gKnBEYXRhOworCWZjMSA9ICoocERhdGEgKyAxKTsKKworCWZjID0gKigoUFVTSE9SVClwRGF0YSk7CisKKwlmcmFtZV90eXBlID0gKChmYzAgPj4gMikgJiAweDAzKTsKKwlmcmFtZV9zdWJ0eXBlID0gKChmYzAgPj4gNCkgJiAweDBmKTsKKworCWZyb21fZHMgPSAoZmMxICYgMHgyKSA+PiAxOworCXRvX2RzID0gKGZjMSAmIDB4MSk7CisKKwlhNF9leGlzdHMgPSAoZnJvbV9kcyAmIHRvX2RzKTsKKwlxY19leGlzdHMgPSAoKGZyYW1lX3N1YnR5cGUgPT0gMHgwOCkgfHwgICAgLyogQXNzdW1lZCBRb1Mgc3VidHlwZXMgKi8KKwkJCQkgIChmcmFtZV9zdWJ0eXBlID09IDB4MDkpIHx8ICAgLyogTGlrZWx5IHRvIGNoYW5nZS4gICAgKi8KKwkJCQkgIChmcmFtZV9zdWJ0eXBlID09IDB4MGEpIHx8CisJCQkJICAoZnJhbWVfc3VidHlwZSA9PSAweDBiKQorCQkJCSApOworCisJSGVhZGVyTGVuID0gMjQ7CisJaWYgKGE0X2V4aXN0cykKKwkJSGVhZGVyTGVuICs9IDY7CisKKwlLZXlJRCA9ICooKFBVQ0hBUikocERhdGErIEhlYWRlckxlbiArIDMpKTsKKwlLZXlJRCA9IEtleUlEID4+IDY7CisKKwlpZiAocFdwYUtleVtLZXlJRF0uS2V5TGVuID09IDApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU29mdERlY3J5cHRBRVMgZmFpbGVkIShLZXlJRFslZF0gTGVuZ3RoIGNhbiBub3QgYmUgMClcbiIsIEtleUlEKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlQTlswXSA9ICoocERhdGErIEhlYWRlckxlbik7CisJUE5bMV0gPSAqKHBEYXRhKyBIZWFkZXJMZW4gKyAxKTsKKwlQTlsyXSA9ICoocERhdGErIEhlYWRlckxlbiArIDQpOworCVBOWzNdID0gKihwRGF0YSsgSGVhZGVyTGVuICsgNSk7CisJUE5bNF0gPSAqKHBEYXRhKyBIZWFkZXJMZW4gKyA2KTsKKwlQTls1XSA9ICoocERhdGErIEhlYWRlckxlbiArIDcpOworCisJcGF5bG9hZF9sZW4gPSBEYXRhQnl0ZUNudCAtIEhlYWRlckxlbiAtIDggLSA4OwkvLyA4IGJ5dGVzIGZvciBDQ01QIGhlYWRlciAsIDggYnl0ZXMgZm9yIE1JQworCXBheWxvYWRfcmVtYWluZGVyID0gKHBheWxvYWRfbGVuKSAlIDE2OworCW51bV9ibG9ja3MgPSAocGF5bG9hZF9sZW4pIC8gMTY7CisKKworCisJLy8gRmluZCBzdGFydCBvZiBwYXlsb2FkCisJcGF5bG9hZF9pbmRleCA9IEhlYWRlckxlbiArIDg7IC8vSVYrRUlWCisKKwlmb3IgKGk9MDsgaTwgbnVtX2Jsb2NrczsgaSsrKQorCXsKKwkJY29uc3RydWN0X2N0cl9wcmVsb2FkKGN0cl9wcmVsb2FkLAorCQkJCQkJCQlhNF9leGlzdHMsCisJCQkJCQkJCXFjX2V4aXN0cywKKwkJCQkJCQkJcERhdGEsCisJCQkJCQkJCVBOLAorCQkJCQkJCQlpKzEgKTsKKworCQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKKworCQliaXR3aXNlX3hvcihhZXNfb3V0LCBwRGF0YSArIHBheWxvYWRfaW5kZXgsIGNoYWluX2J1ZmZlcik7CisJCU5kaXNNb3ZlTWVtb3J5KHBEYXRhICsgcGF5bG9hZF9pbmRleCAtIDgsIGNoYWluX2J1ZmZlciwgMTYpOworCQlwYXlsb2FkX2luZGV4ICs9IDE2OworCX0KKworCS8vCisJLy8gSWYgdGhlcmUgaXMgYSBzaG9ydCBmaW5hbCBibG9jaywgdGhlbiBwYWQgaXQKKwkvLyBlbmNyeXB0IGl0IGFuZCBjb3B5IHRoZSB1bnBhZGRlZCBwYXJ0IGJhY2sKKwkvLworCWlmIChwYXlsb2FkX3JlbWFpbmRlciA+IDApCisJeworCQljb25zdHJ1Y3RfY3RyX3ByZWxvYWQoY3RyX3ByZWxvYWQsCisJCQkJCQkJCWE0X2V4aXN0cywKKwkJCQkJCQkJcWNfZXhpc3RzLAorCQkJCQkJCQlwRGF0YSwKKwkJCQkJCQkJUE4sCisJCQkJCQkJCW51bV9ibG9ja3MgKyAxKTsKKworCQlOZGlzWmVyb01lbW9yeShwYWRkZWRfYnVmZmVyLCAxNik7CisJCU5kaXNNb3ZlTWVtb3J5KHBhZGRlZF9idWZmZXIsIHBEYXRhICsgcGF5bG9hZF9pbmRleCwgcGF5bG9hZF9yZW1haW5kZXIpOworCisJCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgY3RyX3ByZWxvYWQsIGFlc19vdXQpOworCisJCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBhZGRlZF9idWZmZXIsIGNoYWluX2J1ZmZlcik7CisJCU5kaXNNb3ZlTWVtb3J5KHBEYXRhICsgcGF5bG9hZF9pbmRleCAtIDgsIGNoYWluX2J1ZmZlciwgcGF5bG9hZF9yZW1haW5kZXIpOworCQlwYXlsb2FkX2luZGV4ICs9IHBheWxvYWRfcmVtYWluZGVyOworCX0KKworCS8vCisJLy8gRGVzY3J5cHQgdGhlIE1JQworCS8vCisJY29uc3RydWN0X2N0cl9wcmVsb2FkKGN0cl9wcmVsb2FkLAorCQkJCQkJCWE0X2V4aXN0cywKKwkJCQkJCQlxY19leGlzdHMsCisJCQkJCQkJcERhdGEsCisJCQkJCQkJUE4sCisJCQkJCQkJMCk7CisJTmRpc1plcm9NZW1vcnkocGFkZGVkX2J1ZmZlciwgMTYpOworCU5kaXNNb3ZlTWVtb3J5KHBhZGRlZF9idWZmZXIsIHBEYXRhICsgcGF5bG9hZF9pbmRleCwgOCk7CisKKwlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKKworCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBhZGRlZF9idWZmZXIsIGNoYWluX2J1ZmZlcik7CisKKwlOZGlzTW92ZU1lbW9yeShUcmFpbE1JQywgY2hhaW5fYnVmZmVyLCA4KTsKKworCS8vCisJLy8gQ2FsY3VsYXRlIE1JQworCS8vCisKKwkvL0ZvcmNlIHRoZSBwcm90ZWN0ZWQgZnJhbWUgYml0IG9uCisJKihwRGF0YSArIDEpID0gKihwRGF0YSArIDEpIHwgMHg0MDsKKworCS8vIEZpbmQgc3RhcnQgb2YgcGF5bG9hZAorCS8vIEJlY2F1c2UgdGhlIENDTVAgaGVhZGVyIGhhcyBiZWVuIHJlbW92ZWQKKwlwYXlsb2FkX2luZGV4ID0gSGVhZGVyTGVuOworCisJY29uc3RydWN0X21pY19pdigKKwkJCQkJbWljX2l2LAorCQkJCQlxY19leGlzdHMsCisJCQkJCWE0X2V4aXN0cywKKwkJCQkJcERhdGEsCisJCQkJCXBheWxvYWRfbGVuLAorCQkJCQlQTik7CisKKwljb25zdHJ1Y3RfbWljX2hlYWRlcjEoCisJCQkJCQltaWNfaGVhZGVyMSwKKwkJCQkJCUhlYWRlckxlbiwKKwkJCQkJCXBEYXRhKTsKKworCWNvbnN0cnVjdF9taWNfaGVhZGVyMigKKwkJCQkJCW1pY19oZWFkZXIyLAorCQkJCQkJcERhdGEsCisJCQkJCQlhNF9leGlzdHMsCisJCQkJCQlxY19leGlzdHMpOworCisJYWVzMTI4azEyOGQocFdwYUtleVtLZXlJRF0uS2V5LCBtaWNfaXYsIGFlc19vdXQpOworCWJpdHdpc2VfeG9yKGFlc19vdXQsIG1pY19oZWFkZXIxLCBjaGFpbl9idWZmZXIpOworCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgY2hhaW5fYnVmZmVyLCBhZXNfb3V0KTsKKwliaXR3aXNlX3hvcihhZXNfb3V0LCBtaWNfaGVhZGVyMiwgY2hhaW5fYnVmZmVyKTsKKwlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGNoYWluX2J1ZmZlciwgYWVzX291dCk7CisKKwkvLyBpdGVyYXRlIHRocm91Z2ggZWFjaCAxNiBieXRlIHBheWxvYWQgYmxvY2sKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2Jsb2NrczsgaSsrKQorCXsKKwkJYml0d2lzZV94b3IoYWVzX291dCwgcERhdGEgKyBwYXlsb2FkX2luZGV4LCBjaGFpbl9idWZmZXIpOworCQlwYXlsb2FkX2luZGV4ICs9IDE2OworCQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGNoYWluX2J1ZmZlciwgYWVzX291dCk7CisJfQorCisJLy8gQWRkIG9uIHRoZSBmaW5hbCBwYXlsb2FkIGJsb2NrIGlmIGl0IG5lZWRzIHBhZGRpbmcKKwlpZiAocGF5bG9hZF9yZW1haW5kZXIgPiAwKQorCXsKKwkJTmRpc1plcm9NZW1vcnkocGFkZGVkX2J1ZmZlciwgMTYpOworCQlOZGlzTW92ZU1lbW9yeShwYWRkZWRfYnVmZmVyLCBwRGF0YSArIHBheWxvYWRfaW5kZXgsIHBheWxvYWRfcmVtYWluZGVyKTsKKworCQliaXR3aXNlX3hvcihhZXNfb3V0LCBwYWRkZWRfYnVmZmVyLCBjaGFpbl9idWZmZXIpOworCQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGNoYWluX2J1ZmZlciwgYWVzX291dCk7CisJfQorCisJLy8gYWVzX291dCBjb250YWlucyBwYWRkZWQgbWljLCBkaXNjYXJkIG1vc3Qgc2lnbmlmaWNhbnQKKwkvLyA4IGJ5dGVzIHRvIGdlbmVyYXRlIDY0IGJpdCBNSUMKKwlmb3IgKGkgPSAwIDsgaSA8IDg7IGkrKykgTUlDW2ldID0gYWVzX291dFtpXTsKKworCWlmICghTmRpc0VxdWFsTWVtb3J5KE1JQywgVHJhaWxNSUMsIDgpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRNUFNvZnREZWNyeXB0QUVTLCBNSUMgRXJyb3IgIVxuIikpOwkgLy9NSUMgZXJyb3IuCisJCXJldHVybiBGQUxTRTsKKwl9CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUilwRGF0YSwgRElSX1JFQUQsIEZBTFNFKTsKKyNlbmRpZgorCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogYWVzMTI4azEyOGQoKSAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQZXJmb3JtcyBhIDEyOCBiaXQgQUVTIGVuY3J5cHQgd2l0aCAgKi8KKy8qIDEyOCBiaXQgZGF0YS4gICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitWT0lEIHhvcl8xMjgoCisJSU4gIFBVQ0hBUiAgYSwKKwlJTiAgUFVDSEFSICBiLAorCU9VVCBQVUNIQVIgIG91dCkKK3sKKwlJTlQgaTsKKworCWZvciAoaT0wO2k8MTY7IGkrKykKKwl7CisJCW91dFtpXSA9IGFbaV0gXiBiW2ldOworCX0KK30KKworVk9JRCBuZXh0X2tleSgKKwlJTiAgUFVDSEFSICBrZXksCisJSU4gIElOVCAgICAgcm91bmQpCit7CisJVUNIQVIgICAgICAgcmNvbjsKKwlVQ0hBUiAgICAgICBzYm94X2tleVs0XTsKKwlVQ0hBUiAgICAgICByY29uX3RhYmxlWzEyXSA9CisJeworCQkweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwLAorCQkweDFiLCAweDM2LCAweDM2LCAweDM2CisJfTsKKworCXNib3hfa2V5WzBdID0gUlRNUENraXBTYm94KGtleVsxM10pOworCXNib3hfa2V5WzFdID0gUlRNUENraXBTYm94KGtleVsxNF0pOworCXNib3hfa2V5WzJdID0gUlRNUENraXBTYm94KGtleVsxNV0pOworCXNib3hfa2V5WzNdID0gUlRNUENraXBTYm94KGtleVsxMl0pOworCisJcmNvbiA9IHJjb25fdGFibGVbcm91bmRdOworCisJeG9yXzMyKCZrZXlbMF0sIHNib3hfa2V5LCAma2V5WzBdKTsKKwlrZXlbMF0gPSBrZXlbMF0gXiByY29uOworCisJeG9yXzMyKCZrZXlbNF0sICZrZXlbMF0sICZrZXlbNF0pOworCXhvcl8zMigma2V5WzhdLCAma2V5WzRdLCAma2V5WzhdKTsKKwl4b3JfMzIoJmtleVsxMl0sICZrZXlbOF0sICZrZXlbMTJdKTsKK30KKworVk9JRCB4b3JfMzIoCisJSU4gIFBVQ0hBUiAgYSwKKwlJTiAgUFVDSEFSICBiLAorCU9VVCBQVUNIQVIgIG91dCkKK3sKKwlJTlQgaTsKKworCWZvciAoaT0wO2k8NDsgaSsrKQorCXsKKwkJb3V0W2ldID0gYVtpXSBeIGJbaV07CisJfQorfQorCitWT0lEIGJ5dGVfc3ViKAorCUlOICBQVUNIQVIgIGluLAorCU9VVCBQVUNIQVIgIG91dCkKK3sKKwlJTlQgaTsKKworCWZvciAoaT0wOyBpPCAxNjsgaSsrKQorCXsKKwkJb3V0W2ldID0gUlRNUENraXBTYm94KGluW2ldKTsKKwl9Cit9CisKK1VDSEFSIFJUTVBDa2lwU2JveCgKKwlJTiAgVUNIQVIgICBhKQoreworCXJldHVybiBTYm94VGFibGVbKGludClhXTsKK30KKworVk9JRCBzaGlmdF9yb3coCisJSU4gIFBVQ0hBUiAgaW4sCisJT1VUIFBVQ0hBUiAgb3V0KQoreworCW91dFswXSA9ICBpblswXTsKKwlvdXRbMV0gPSAgaW5bNV07CisJb3V0WzJdID0gIGluWzEwXTsKKwlvdXRbM10gPSAgaW5bMTVdOworCW91dFs0XSA9ICBpbls0XTsKKwlvdXRbNV0gPSAgaW5bOV07CisJb3V0WzZdID0gIGluWzE0XTsKKwlvdXRbN10gPSAgaW5bM107CisJb3V0WzhdID0gIGluWzhdOworCW91dFs5XSA9ICBpblsxM107CisJb3V0WzEwXSA9IGluWzJdOworCW91dFsxMV0gPSBpbls3XTsKKwlvdXRbMTJdID0gaW5bMTJdOworCW91dFsxM10gPSBpblsxXTsKKwlvdXRbMTRdID0gaW5bNl07CisJb3V0WzE1XSA9IGluWzExXTsKK30KKworVk9JRCBtaXhfY29sdW1uKAorCUlOICBQVUNIQVIgIGluLAorCU9VVCBQVUNIQVIgIG91dCkKK3sKKwlJTlQgICAgICAgICBpOworCVVDSEFSICAgICAgIGFkZDFiWzRdOworCVVDSEFSICAgICAgIGFkZDFiZjdbNF07CisJVUNIQVIgICAgICAgcm90bFs0XTsKKwlVQ0hBUiAgICAgICBzd2FwX2hhbGZzWzRdOworCVVDSEFSICAgICAgIGFuZGY3WzRdOworCVVDSEFSICAgICAgIHJvdHJbNF07CisJVUNIQVIgICAgICAgdGVtcFs0XTsKKwlVQ0hBUiAgICAgICB0ZW1wYls0XTsKKworCWZvciAoaT0wIDsgaTw0OyBpKyspCisJeworCQlpZiAoKGluW2ldICYgMHg4MCk9PSAweDgwKQorCQkJYWRkMWJbaV0gPSAweDFiOworCQllbHNlCisJCQlhZGQxYltpXSA9IDB4MDA7CisJfQorCisJc3dhcF9oYWxmc1swXSA9IGluWzJdOyAgICAvKiBTd2FwIGhhbGZzICovCisJc3dhcF9oYWxmc1sxXSA9IGluWzNdOworCXN3YXBfaGFsZnNbMl0gPSBpblswXTsKKwlzd2FwX2hhbGZzWzNdID0gaW5bMV07CisKKwlyb3RsWzBdID0gaW5bM107ICAgICAgICAvKiBSb3RhdGUgbGVmdCA4IGJpdHMgKi8KKwlyb3RsWzFdID0gaW5bMF07CisJcm90bFsyXSA9IGluWzFdOworCXJvdGxbM10gPSBpblsyXTsKKworCWFuZGY3WzBdID0gaW5bMF0gJiAweDdmOworCWFuZGY3WzFdID0gaW5bMV0gJiAweDdmOworCWFuZGY3WzJdID0gaW5bMl0gJiAweDdmOworCWFuZGY3WzNdID0gaW5bM10gJiAweDdmOworCisJZm9yIChpID0gMzsgaT4wOyBpLS0pICAgIC8qIGxvZ2ljYWwgc2hpZnQgbGVmdCAxIGJpdCAqLworCXsKKwkJYW5kZjdbaV0gPSBhbmRmN1tpXSA8PCAxOworCQlpZiAoKGFuZGY3W2ktMV0gJiAweDgwKSA9PSAweDgwKQorCQl7CisJCQlhbmRmN1tpXSA9IChhbmRmN1tpXSB8IDB4MDEpOworCQl9CisJfQorCWFuZGY3WzBdID0gYW5kZjdbMF0gPDwgMTsKKwlhbmRmN1swXSA9IGFuZGY3WzBdICYgMHhmZTsKKworCXhvcl8zMihhZGQxYiwgYW5kZjcsIGFkZDFiZjcpOworCisJeG9yXzMyKGluLCBhZGQxYmY3LCByb3RyKTsKKworCXRlbXBbMF0gPSByb3RyWzBdOyAgICAgICAgIC8qIFJvdGF0ZSByaWdodCA4IGJpdHMgKi8KKwlyb3RyWzBdID0gcm90clsxXTsKKwlyb3RyWzFdID0gcm90clsyXTsKKwlyb3RyWzJdID0gcm90clszXTsKKwlyb3RyWzNdID0gdGVtcFswXTsKKworCXhvcl8zMihhZGQxYmY3LCByb3RyLCB0ZW1wKTsKKwl4b3JfMzIoc3dhcF9oYWxmcywgcm90bCx0ZW1wYik7CisJeG9yXzMyKHRlbXAsIHRlbXBiLCBvdXQpOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydG1wX3dlcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnRtcF93ZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmY5ZTU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnRtcF93ZXAuYwpAQCAtMCwwICsxLDUwOCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlydG1wX3dlcC5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJUGF1bCBXdQkJMTAtMjgtMDIJCUluaXRpYWwKKyovCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworVUlOVCBGQ1NUQUJfMzJbMjU2XSA9Cit7CisJMHgwMDAwMDAwMCwgMHg3NzA3MzA5NiwgMHhlZTBlNjEyYywgMHg5OTA5NTFiYSwKKwkweDA3NmRjNDE5LCAweDcwNmFmNDhmLCAweGU5NjNhNTM1LCAweDllNjQ5NWEzLAorCTB4MGVkYjg4MzIsIDB4NzlkY2I4YTQsIDB4ZTBkNWU5MWUsIDB4OTdkMmQ5ODgsCisJMHgwOWI2NGMyYiwgMHg3ZWIxN2NiZCwgMHhlN2I4MmQwNywgMHg5MGJmMWQ5MSwKKwkweDFkYjcxMDY0LCAweDZhYjAyMGYyLCAweGYzYjk3MTQ4LCAweDg0YmU0MWRlLAorCTB4MWFkYWQ0N2QsIDB4NmRkZGU0ZWIsIDB4ZjRkNGI1NTEsIDB4ODNkMzg1YzcsCisJMHgxMzZjOTg1NiwgMHg2NDZiYThjMCwgMHhmZDYyZjk3YSwgMHg4YTY1YzllYywKKwkweDE0MDE1YzRmLCAweDYzMDY2Y2Q5LCAweGZhMGYzZDYzLCAweDhkMDgwZGY1LAorCTB4M2I2ZTIwYzgsIDB4NGM2OTEwNWUsIDB4ZDU2MDQxZTQsIDB4YTI2NzcxNzIsCisJMHgzYzAzZTRkMSwgMHg0YjA0ZDQ0NywgMHhkMjBkODVmZCwgMHhhNTBhYjU2YiwKKwkweDM1YjVhOGZhLCAweDQyYjI5ODZjLCAweGRiYmJjOWQ2LCAweGFjYmNmOTQwLAorCTB4MzJkODZjZTMsIDB4NDVkZjVjNzUsIDB4ZGNkNjBkY2YsIDB4YWJkMTNkNTksCisJMHgyNmQ5MzBhYywgMHg1MWRlMDAzYSwgMHhjOGQ3NTE4MCwgMHhiZmQwNjExNiwKKwkweDIxYjRmNGI1LCAweDU2YjNjNDIzLCAweGNmYmE5NTk5LCAweGI4YmRhNTBmLAorCTB4MjgwMmI4OWUsIDB4NWYwNTg4MDgsIDB4YzYwY2Q5YjIsIDB4YjEwYmU5MjQsCisJMHgyZjZmN2M4NywgMHg1ODY4NGMxMSwgMHhjMTYxMWRhYiwgMHhiNjY2MmQzZCwKKwkweDc2ZGM0MTkwLCAweDAxZGI3MTA2LCAweDk4ZDIyMGJjLCAweGVmZDUxMDJhLAorCTB4NzFiMTg1ODksIDB4MDZiNmI1MWYsIDB4OWZiZmU0YTUsIDB4ZThiOGQ0MzMsCisJMHg3ODA3YzlhMiwgMHgwZjAwZjkzNCwgMHg5NjA5YTg4ZSwgMHhlMTBlOTgxOCwKKwkweDdmNmEwZGJiLCAweDA4NmQzZDJkLCAweDkxNjQ2Yzk3LCAweGU2NjM1YzAxLAorCTB4NmI2YjUxZjQsIDB4MWM2YzYxNjIsIDB4ODU2NTMwZDgsIDB4ZjI2MjAwNGUsCisJMHg2YzA2OTVlZCwgMHgxYjAxYTU3YiwgMHg4MjA4ZjRjMSwgMHhmNTBmYzQ1NywKKwkweDY1YjBkOWM2LCAweDEyYjdlOTUwLCAweDhiYmViOGVhLCAweGZjYjk4ODdjLAorCTB4NjJkZDFkZGYsIDB4MTVkYTJkNDksIDB4OGNkMzdjZjMsIDB4ZmJkNDRjNjUsCisJMHg0ZGIyNjE1OCwgMHgzYWI1NTFjZSwgMHhhM2JjMDA3NCwgMHhkNGJiMzBlMiwKKwkweDRhZGZhNTQxLCAweDNkZDg5NWQ3LCAweGE0ZDFjNDZkLCAweGQzZDZmNGZiLAorCTB4NDM2OWU5NmEsIDB4MzQ2ZWQ5ZmMsIDB4YWQ2Nzg4NDYsIDB4ZGE2MGI4ZDAsCisJMHg0NDA0MmQ3MywgMHgzMzAzMWRlNSwgMHhhYTBhNGM1ZiwgMHhkZDBkN2NjOSwKKwkweDUwMDU3MTNjLCAweDI3MDI0MWFhLCAweGJlMGIxMDEwLCAweGM5MGMyMDg2LAorCTB4NTc2OGI1MjUsIDB4MjA2Zjg1YjMsIDB4Yjk2NmQ0MDksIDB4Y2U2MWU0OWYsCisJMHg1ZWRlZjkwZSwgMHgyOWQ5Yzk5OCwgMHhiMGQwOTgyMiwgMHhjN2Q3YThiNCwKKwkweDU5YjMzZDE3LCAweDJlYjQwZDgxLCAweGI3YmQ1YzNiLCAweGMwYmE2Y2FkLAorCTB4ZWRiODgzMjAsIDB4OWFiZmIzYjYsIDB4MDNiNmUyMGMsIDB4NzRiMWQyOWEsCisJMHhlYWQ1NDczOSwgMHg5ZGQyNzdhZiwgMHgwNGRiMjYxNSwgMHg3M2RjMTY4MywKKwkweGUzNjMwYjEyLCAweDk0NjQzYjg0LCAweDBkNmQ2YTNlLCAweDdhNmE1YWE4LAorCTB4ZTQwZWNmMGIsIDB4OTMwOWZmOWQsIDB4MGEwMGFlMjcsIDB4N2QwNzllYjEsCisJMHhmMDBmOTM0NCwgMHg4NzA4YTNkMiwgMHgxZTAxZjI2OCwgMHg2OTA2YzJmZSwKKwkweGY3NjI1NzVkLCAweDgwNjU2N2NiLCAweDE5NmMzNjcxLCAweDZlNmIwNmU3LAorCTB4ZmVkNDFiNzYsIDB4ODlkMzJiZTAsIDB4MTBkYTdhNWEsIDB4NjdkZDRhY2MsCisJMHhmOWI5ZGY2ZiwgMHg4ZWJlZWZmOSwgMHgxN2I3YmU0MywgMHg2MGIwOGVkNSwKKwkweGQ2ZDZhM2U4LCAweGExZDE5MzdlLCAweDM4ZDhjMmM0LCAweDRmZGZmMjUyLAorCTB4ZDFiYjY3ZjEsIDB4YTZiYzU3NjcsIDB4M2ZiNTA2ZGQsIDB4NDhiMjM2NGIsCisJMHhkODBkMmJkYSwgMHhhZjBhMWI0YywgMHgzNjAzNGFmNiwgMHg0MTA0N2E2MCwKKwkweGRmNjBlZmMzLCAweGE4NjdkZjU1LCAweDMxNmU4ZWVmLCAweDQ2NjliZTc5LAorCTB4Y2I2MWIzOGMsIDB4YmM2NjgzMWEsIDB4MjU2ZmQyYTAsIDB4NTI2OGUyMzYsCisJMHhjYzBjNzc5NSwgMHhiYjBiNDcwMywgMHgyMjAyMTZiOSwgMHg1NTA1MjYyZiwKKwkweGM1YmEzYmJlLCAweGIyYmQwYjI4LCAweDJiYjQ1YTkyLCAweDVjYjM2YTA0LAorCTB4YzJkN2ZmYTcsIDB4YjVkMGNmMzEsIDB4MmNkOTllOGIsIDB4NWJkZWFlMWQsCisJMHg5YjY0YzJiMCwgMHhlYzYzZjIyNiwgMHg3NTZhYTM5YywgMHgwMjZkOTMwYSwKKwkweDljMDkwNmE5LCAweGViMGUzNjNmLCAweDcyMDc2Nzg1LCAweDA1MDA1NzEzLAorCTB4OTViZjRhODIsIDB4ZTJiODdhMTQsIDB4N2JiMTJiYWUsIDB4MGNiNjFiMzgsCisJMHg5MmQyOGU5YiwgMHhlNWQ1YmUwZCwgMHg3Y2RjZWZiNywgMHgwYmRiZGYyMSwKKwkweDg2ZDNkMmQ0LCAweGYxZDRlMjQyLCAweDY4ZGRiM2Y4LCAweDFmZGE4MzZlLAorCTB4ODFiZTE2Y2QsIDB4ZjZiOTI2NWIsIDB4NmZiMDc3ZTEsIDB4MThiNzQ3NzcsCisJMHg4ODA4NWFlNiwgMHhmZjBmNmE3MCwgMHg2NjA2M2JjYSwgMHgxMTAxMGI1YywKKwkweDhmNjU5ZWZmLCAweGY4NjJhZTY5LCAweDYxNmJmZmQzLCAweDE2NmNjZjQ1LAorCTB4YTAwYWUyNzgsIDB4ZDcwZGQyZWUsIDB4NGUwNDgzNTQsIDB4MzkwM2IzYzIsCisJMHhhNzY3MjY2MSwgMHhkMDYwMTZmNywgMHg0OTY5NDc0ZCwgMHgzZTZlNzdkYiwKKwkweGFlZDE2YTRhLCAweGQ5ZDY1YWRjLCAweDQwZGYwYjY2LCAweDM3ZDgzYmYwLAorCTB4YTliY2FlNTMsIDB4ZGViYjllYzUsIDB4NDdiMmNmN2YsIDB4MzBiNWZmZTksCisJMHhiZGJkZjIxYywgMHhjYWJhYzI4YSwgMHg1M2IzOTMzMCwgMHgyNGI0YTNhNiwKKwkweGJhZDAzNjA1LCAweGNkZDcwNjkzLCAweDU0ZGU1NzI5LCAweDIzZDk2N2JmLAorCTB4YjM2NjdhMmUsIDB4YzQ2MTRhYjgsIDB4NWQ2ODFiMDIsIDB4MmE2ZjJiOTQsCisJMHhiNDBiYmUzNywgMHhjMzBjOGVhMSwgMHg1YTA1ZGYxYiwgMHgyZDAyZWY4ZAorfTsKKworLyoKK1VDSEFSICAgV0VQS0VZW10gPSB7CisJCS8vSVYKKwkJMHgwMCwgMHgxMSwgMHgyMiwKKwkJLy9XRVAgS0VZCisJCTB4MDAsIDB4MTEsIDB4MjIsIDB4MzMsIDB4NDQsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0MKKwl9OworICovCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlJbml0IFdFUCBmdW5jdGlvbi4KKworCUFyZ3VtZW50czoKKyAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwS2V5ICAgICAgICBQb2ludGVyIHRvIHRoZSBXRVAgS0VZCisJCUtleUlkCQkgICBXRVAgS2V5IElECisJCUtleUxlbiAgICAgIHRoZSBsZW5ndGggb2YgV0VQIEtFWQorCQlwRGVzdCAgICAgICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiB3aGljaCBFbmNyeXB0aW9uIGRhdGEgd2lsbCBzdG9yZSBpbi4KKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QSW5pdFdlcEVuZ2luZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwS2V5LAorCUlOCVVDSEFSCQkJS2V5SWQsCisJSU4JVUNIQVIJCQlLZXlMZW4sCisJSU4gT1VUCVBVQ0hBUgkJcERlc3QpCit7CisJVUlOVCBpOworCVVDSEFSICAgV0VQS0VZW10gPSB7CisJCS8vSVYKKwkJMHgwMCwgMHgxMSwgMHgyMiwKKwkJLy9XRVAgS0VZCisJCTB4MDAsIDB4MTEsIDB4MjIsIDB4MzMsIDB4NDQsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0MKKwl9OworCisJcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiA9IFBQUElOSVRGQ1MzMjsgICAvL0luaXQgY3JjMzIuCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyAgICBpZiAocEFkLT5TdGFDZmcuYkNraXBPbiAmJiAocEFkLT5TdGFDZmcuQ2tpcEZsYWcgJiAweDEwKSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCisgICAgeworICAgICAgICBBUkNGT1VSX0lOSVQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgcEtleSwgS2V5TGVuKTsgIC8vSU5JVCBTQk9YLCBLRVlMRU4rMyhJVikKKyAgICAgICAgTmRpc01vdmVNZW1vcnkocERlc3QsIHBLZXksIDMpOyAgLy9BcHBlbmQgSW5pdCBWZWN0b3IKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworICAgIHsKKwkJTmRpc01vdmVNZW1vcnkoV0VQS0VZICsgMywgcEtleSwgS2V5TGVuKTsKKworICAgICAgICBmb3IoaSA9IDA7IGkgPCAzOyBpKyspCisJCQlXRVBLRVlbaV0gPSBSYW5kb21CeXRlKHBBZCk7ICAgLy9DYWxsIG1sbWUgUmFuZG9tQnl0ZSgpIGZ1bmN0aW9uLgorCQlBUkNGT1VSX0lOSVQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgV0VQS0VZLCBLZXlMZW4gKyAzKTsgIC8vSU5JVCBTQk9YLCBLRVlMRU4rMyhJVikKKworCQlOZGlzTW92ZU1lbW9yeShwRGVzdCwgV0VQS0VZLCAzKTsgIC8vQXBwZW5kIEluaXQgVmVjdG9yCisgICAgfQorCSoocERlc3QrMykgPSAoS2V5SWQgPDwgNik7ICAgICAgIC8vQXBwZW5kIEtFWUlECisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUVuY3J5cHQgdHJhbnNpbWl0dGVkIGRhdGEKKworCUFyZ3VtZW50czoKKyAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorICAgICAgcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgdHJhbnNpbWl0dGVkIHNvdXJjZSBkYXRhIHRoYXQgd2lsbCBiZSBlbmNyeXB0CisgICAgICBwRGVzdCAgICAgICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiB3aGVyZSBlbnRyeXB0aW9uIGRhdGEgd2lsbCBiZSBzdG9yZSBpbi4KKyAgICAgIExlbgkJCUluZGljYXRlIHRoZSBsZW5ndGggb2YgdGhlIHNvdXJjZSBkYXRhCisKKwlSZXR1cm4gVmFsdWU6CisgICAgICBOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUTVBFbmNyeXB0RGF0YSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwU3JjLAorCUlOCVBVQ0hBUgkJCXBEZXN0LAorCUlOCVVJTlQJCQlMZW4pCit7CisJcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiA9IFJUTVBfQ0FMQ19GQ1MzMihwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyLCBwU3JjLCBMZW4pOworCUFSQ0ZPVVJfRU5DUllQVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBwRGVzdCwgcFNyYywgTGVuKTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJRGVjcnlwdCByZWNlaXZlZCBXRVAgZGF0YQorCisJQXJndW1lbnRzOgorCQlwQWRhcHRlcgkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSByZWNlaXZlZCBkYXRhCisJCUxlbiAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIHJlY2VpdmVkIGRhdGEKKworCVJldHVybiBWYWx1ZToKKwkJVFJVRSAgICAgICAgRGVjcnlwdCBXRVAgZGF0YSBzdWNjZXNzCisJCUZBTFNFICAgICAgIERlY3J5cHQgV0VQIGRhdGEgZmFpbGVkCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTglSVE1QU29mdERlY3J5cHRXRVAoCisJSU4gUFJUTVBfQURBUFRFUiAJcEFkLAorCUlOIFBVQ0hBUgkJCXBEYXRhLAorCUlOIFVMT05HCQkJRGF0YUJ5dGVDbnQsCisJSU4gUENJUEhFUl9LRVkJCXBHcm91cEtleSkKK3sKKwlVSU5UCXRyYWlsZmNzOworCVVJTlQgICAgY3JjMzI7CisJVUNIQVIJS2V5SWR4OworCVVDSEFSICAgV0VQS0VZW10gPSB7CisJCS8vSVYKKwkJMHgwMCwgMHgxMSwgMHgyMiwKKwkJLy9XRVAgS0VZCisJCTB4MDAsIDB4MTEsIDB4MjIsIDB4MzMsIDB4NDQsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0MKKwl9OworCVVDSEFSIAkqcFBheWxvYWQgPSAoVUNIQVIgKilwRGF0YSArIExFTkdUSF84MDJfMTE7CisJVUxPTkcJcGF5bG9hZF9sZW4gPSBEYXRhQnl0ZUNudCAtIExFTkdUSF84MDJfMTE7CisKKwlOZGlzTW92ZU1lbW9yeShXRVBLRVksIHBQYXlsb2FkLCAzKTsgICAgLy9HZXQgV0VQIElWCisKKwlLZXlJZHggPSAoKihwUGF5bG9hZCArIDMpICYgMHhjMCkgPj4gNjsKKwlpZiAocEdyb3VwS2V5W0tleUlkeF0uS2V5TGVuID09IDApCisJCXJldHVybiAoRkFMU0UpOworCisJTmRpc01vdmVNZW1vcnkoV0VQS0VZICsgMywgcEdyb3VwS2V5W0tleUlkeF0uS2V5LCBwR3JvdXBLZXlbS2V5SWR4XS5LZXlMZW4pOworCUFSQ0ZPVVJfSU5JVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBXRVBLRVksIHBHcm91cEtleVtLZXlJZHhdLktleUxlbiArIDMpOworCUFSQ0ZPVVJfREVDUllQVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBwUGF5bG9hZCwgcFBheWxvYWQgKyA0LCBwYXlsb2FkX2xlbiAtIDQpOworCU5kaXNNb3ZlTWVtb3J5KCZ0cmFpbGZjcywgcFBheWxvYWQgKyBwYXlsb2FkX2xlbiAtIDgsIDQpOworCWNyYzMyID0gUlRNUF9DQUxDX0ZDUzMyKFBQUElOSVRGQ1MzMiwgcFBheWxvYWQsIHBheWxvYWRfbGVuIC0gOCk7ICAvL1NraXAgbGFzdCA0IGJ5dGVzKEZDUykuCisJY3JjMzIgXj0gMHhmZmZmZmZmZjsgICAgICAgICAgICAgLyogY29tcGxlbWVudCAqLworCisgICAgaWYoY3JjMzIgIT0gY3B1MmxlMzIodHJhaWxmY3MpKQorICAgIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISBXRVAgRGF0YSBDUkMgRXJyb3IgIVxuIikpOwkgLy9DUkMgZXJyb3IuCisJCXJldHVybiAoRkFMU0UpOworCX0KKwlyZXR1cm4gKFRSVUUpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJVGhlIFN0cmVhbSBDaXBoZXIgRW5jcnlwdGlvbiBBbGdvcml0aG0gIkFSQ0ZPVVIiIGluaXRpYWxpemUKKworCUFyZ3VtZW50czoKKwkgICBDdHggICAgICAgICBQb2ludGVyIHRvIEFSQ0ZPVVIgQ09OVEVYVCAoU0JPWCkKKwkJcEtleSAgICAgICAgUG9pbnRlciB0byB0aGUgV0VQIEtFWQorCQlLZXlMZW4gICAgICBJbmRpY2F0ZSB0aGUgbGVuZ3RoIGZvIHRoZSBXRVAgS0VZCisKKwlSZXR1cm4gVmFsdWU6CisJICAgTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlBUkNGT1VSX0lOSVQoCisJSU4JUEFSQ0ZPVVJDT05URVhUCUN0eCwKKwlJTglQVUNIQVIJCQlwS2V5LAorCUlOCVVJTlQJCQlLZXlMZW4pCit7CisJVUNIQVIJdCwgdTsKKwlVSU5UCWtleWluZGV4OworCVVJTlQJc3RhdGVpbmRleDsKKwlQVUNIQVIJc3RhdGU7CisJVUlOVAljb3VudGVyOworCisJc3RhdGUgPSBDdHgtPlNUQVRFOworCUN0eC0+WCA9IDA7CisJQ3R4LT5ZID0gMDsKKwlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgMjU2OyBjb3VudGVyKyspCisJCXN0YXRlW2NvdW50ZXJdID0gKFVDSEFSKWNvdW50ZXI7CisJa2V5aW5kZXggPSAwOworCXN0YXRlaW5kZXggPSAwOworCWZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCAyNTY7IGNvdW50ZXIrKykKKwl7CisJCXQgPSBzdGF0ZVtjb3VudGVyXTsKKwkJc3RhdGVpbmRleCA9IChzdGF0ZWluZGV4ICsgcEtleVtrZXlpbmRleF0gKyB0KSAmIDB4ZmY7CisJCXUgPSBzdGF0ZVtzdGF0ZWluZGV4XTsKKwkJc3RhdGVbc3RhdGVpbmRleF0gPSB0OworCQlzdGF0ZVtjb3VudGVyXSA9IHU7CisJCWlmICgrK2tleWluZGV4ID49IEtleUxlbikKKwkJCWtleWluZGV4ID0gMDsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlHZXQgYnl0ZXMgZnJvbSBBUkNGT1VSIENPTlRFWFQgKFMtQk9YKQorCisJQXJndW1lbnRzOgorCSAgIEN0eCAgICAgICAgIFBvaW50ZXIgdG8gQVJDRk9VUiBDT05URVhUIChTQk9YKQorCisJUmV0dXJuIFZhbHVlOgorCSAgIFVDSEFSICAtIHRoZSB2YWx1ZSBvZiB0aGUgQVJDRk9VUiBDT05URVhUIChTLUJPWCkKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitVQ0hBUglBUkNGT1VSX0JZVEUoCisJSU4JUEFSQ0ZPVVJDT05URVhUCQlDdHgpCit7CisgIFVJTlQgeDsKKyAgVUlOVCB5OworICBVQ0hBUiBzeCwgc3k7CisgIFBVQ0hBUiBzdGF0ZTsKKworICBzdGF0ZSA9IEN0eC0+U1RBVEU7CisgIHggPSAoQ3R4LT5YICsgMSkgJiAweGZmOworICBzeCA9IHN0YXRlW3hdOworICB5ID0gKHN4ICsgQ3R4LT5ZKSAmIDB4ZmY7CisgIHN5ID0gc3RhdGVbeV07CisgIEN0eC0+WCA9IHg7CisgIEN0eC0+WSA9IHk7CisgIHN0YXRlW3ldID0gc3g7CisgIHN0YXRlW3hdID0gc3k7CisKKyAgcmV0dXJuKHN0YXRlWyhzeCArIHN5KSAmIDB4ZmZdKTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJVGhlIFN0cmVhbSBDaXBoZXIgRGVjcnlwdGlvbiBBbGdvcml0aG0KKworCUFyZ3VtZW50czoKKwkJQ3R4ICAgICAgICAgUG9pbnRlciB0byBBUkNGT1VSIENPTlRFWFQgKFNCT1gpCisJCXBEZXN0CQkJUG9pbnRlciB0byB0aGUgRGVzdGluYXRpb24KKwkJcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgU291cmNlIGRhdGEKKwkJTGVuICAgICAgICAgSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgU291cmNlIGRhdGEKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQVJDRk9VUl9ERUNSWVBUKAorCUlOCVBBUkNGT1VSQ09OVEVYVAlDdHgsCisJSU4JUFVDSEFSCQkJcERlc3QsCisJSU4JUFVDSEFSCQkJcFNyYywKKwlJTglVSU5UCQkJTGVuKQoreworCVVJTlQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBMZW47IGkrKykKKwkJcERlc3RbaV0gPSBwU3JjW2ldIF4gQVJDRk9VUl9CWVRFKEN0eCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlUaGUgU3RyZWFtIENpcGhlciBFbmNyeXB0aW9uIEFsZ29yaXRobQorCisJQXJndW1lbnRzOgorCQlDdHggICAgICAgICBQb2ludGVyIHRvIEFSQ0ZPVVIgQ09OVEVYVCAoU0JPWCkKKwkJcERlc3QJCQlQb2ludGVyIHRvIHRoZSBEZXN0aW5hdGlvbgorCQlwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSBTb3VyY2UgZGF0YQorCQlMZW4gICAgICAgICBJbmRpY2F0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBTb3VyY2UgZHRhCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQVJDRk9VUl9FTkNSWVBUKAorCUlOCVBBUkNGT1VSQ09OVEVYVAlDdHgsCisJSU4JUFVDSEFSCQkJcERlc3QsCisJSU4JUFVDSEFSCQkJcFNyYywKKwlJTglVSU5UCQkJTGVuKQoreworCVVJTlQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBMZW47IGkrKykKKwkJcERlc3RbaV0gPSBwU3JjW2ldIF4gQVJDRk9VUl9CWVRFKEN0eCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlUaGUgU3RyZWFtIENpcGhlciBFbmNyeXB0aW9uIEFsZ29yaXRobSB3aGljaCBjb25mb3JtIHRvIHRoZSBzcGVjaWFsIHJlcXVpcmVtZW50IHRvIGVuY3J5cHQgIEdUSy4KKworCUFyZ3VtZW50czoKKwkJQ3R4ICAgICAgICAgUG9pbnRlciB0byBBUkNGT1VSIENPTlRFWFQgKFNCT1gpCisJCXBEZXN0CQkJUG9pbnRlciB0byB0aGUgRGVzdGluYXRpb24KKwkJcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgU291cmNlIGRhdGEKKwkJTGVuICAgICAgICAgSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgU291cmNlIGR0YQorCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKK1ZPSUQJV1BBQVJDRk9VUl9FTkNSWVBUKAorCUlOCVBBUkNGT1VSQ09OVEVYVAlDdHgsCisJSU4JUFVDSEFSCQkJcERlc3QsCisJSU4JUFVDSEFSCQkJcFNyYywKKwlJTglVSU5UCQkJTGVuKQoreworCVVJTlQgaTsKKyAgICAgICAgLy9kaXNjYXJkIGZpcnN0IDI1NiBieXRlcworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICAgICAgICAgIEFSQ0ZPVVJfQllURShDdHgpOworCisJZm9yIChpID0gMDsgaSA8IExlbjsgaSsrKQorCQlwRGVzdFtpXSA9IHBTcmNbaV0gXiBBUkNGT1VSX0JZVEUoQ3R4KTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJQ2FsY3VsYXRlIGEgbmV3IEZDUyBnaXZlbiB0aGUgY3VycmVudCBGQ1MgYW5kIHRoZSBuZXcgZGF0YS4KKworCUFyZ3VtZW50czoKKwkJRmNzCSAgICAgIHRoZSBvcmlnaW5hbCBGQ1MgdmFsdWUKKwkJQ3AgICAgICAgICAgcG9pbnRlciB0byB0aGUgZGF0YSB3aGljaCB3aWxsIGJlIGNhbGN1bGF0ZSB0aGUgRkNTCisJCUxlbiAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEKKworCVJldHVybiBWYWx1ZToKKwkJVUlOVCAtIEZDUyAzMiBiaXRzCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitVSU5UCVJUTVBfQ0FMQ19GQ1MzMigKKwlJTglVSU5UCUZjcywKKwlJTglQVUNIQVIJQ3AsCisJSU4JSU5UCQlMZW4pCit7CisJd2hpbGUgKExlbi0tKQorCSAgIEZjcyA9ICgoKEZjcykgPj4gOCkgXiBGQ1NUQUJfMzJbKChGY3MpIF4gKCpDcCsrKSkgJiAweGZmXSk7CisKKwlyZXR1cm4gKEZjcyk7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUdldCBsYXN0IEZDUyBhbmQgZW5jcnlwdCBpdCB0byB0aGUgZGVzdGluYXRpb24KKworCUFyZ3VtZW50czoKKwkJcERlc3QJCQlQb2ludGVyIHRvIHRoZSBEZXN0aW5hdGlvbgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QU2V0SUNWKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUglwRGVzdCkKK3sKKwlwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyIF49IDB4ZmZmZmZmZmY7ICAgICAgICAgICAgIC8qIGNvbXBsZW1lbnQgKi8KKwlwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyID0gY3B1MmxlMzIocEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMik7CisKKwlBUkNGT1VSX0VOQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgcERlc3QsIChQVUNIQVIpICZwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyLCA0KTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnR1c2JfYnVsay5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnR1c2JfYnVsay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NmQ5MTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydHVzYl9idWxrLmMKQEAgLTAsMCArMSwxOTgxIEBACisgLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlydHVzYl9idWxrLmMKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTmFtZQkJRGF0ZQkJTW9kaWZpY2F0aW9uIGxvZ3MKKwlQYXVsIExpbgkwNi0yNS0yMDA0CWNyZWF0ZWQKKworKi8KKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorLy8gTWF0Y2ggdG90YWwgNiBidWxrb3V0IGVuZHBvaW50IHRvIGNvcnJlc3BvbmRpbmcgcXVldWUuCitVQ0hBUglFcFRvUXVldWVbNl09e0ZJRk9fRURDQSwgRklGT19FRENBLCBGSUZPX0VEQ0EsIEZJRk9fRURDQSwgRklGT19FRENBLCBGSUZPX01HTVR9OworCisvL3N0YXRpYyBCT09MRUFOIFNpbmdsZUJ1bGtPdXQgPSBGQUxTRTsKKwordm9pZCBSVFVTQl9GSUxMX0JVTEtfVVJCIChzdHJ1Y3QgdXJiICpwVXJiLAorCXN0cnVjdCB1c2JfZGV2aWNlICpwVXNiX0RldiwKKwl1bnNpZ25lZCBpbnQgYnVsa3BpcGUsCisJdm9pZCAqcFRyYW5zZmVyQnVmLAorCWludCBCdWZTaXplLAorCXVzYl9jb21wbGV0ZV90IENvbXBsZXRlLAorCXZvaWQgKnBDb250ZXh0KQoreworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCXVzYl9maWxsX2J1bGtfdXJiKHBVcmIsIHBVc2JfRGV2LCBidWxrcGlwZSwgcFRyYW5zZmVyQnVmLCBCdWZTaXplLCAodXNiX2NvbXBsZXRlX3QpQ29tcGxldGUsIHBDb250ZXh0KTsKKyNlbHNlCisJRklMTF9CVUxLX1VSQihwVXJiLCBwVXNiX0RldiwgYnVsa3BpcGUsIHBUcmFuc2ZlckJ1ZiwgQnVmU2l6ZSwgQ29tcGxldGUsIHBDb250ZXh0KTsKKyNlbmRpZgorCit9CisKK1ZPSUQJUlRVU0JJbml0VHhEZXNjKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBUWF9DT05URVhUCQlwVHhDb250ZXh0LAorCUlOCVVDSEFSCQkJQnVsa091dFBpcGVJZCwKKwlJTgl1c2JfY29tcGxldGVfdAlGdW5jKQoreworCVBVUkIJCQkJcFVyYjsKKwlQVUNIQVIJCQkJcFNyYyA9IE5VTEw7CisJUE9TX0NPT0tJRQkJCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwlwVXJiID0gcFR4Q29udGV4dC0+cFVyYjsKKwlBU1NFUlQocFVyYik7CisKKwkvLyBTdG9yZSBCdWxrT3V0IFBpcGVJZAorCXBUeENvbnRleHQtPkJ1bGtPdXRQaXBlSWQgPSBCdWxrT3V0UGlwZUlkOworCisJaWYgKHBUeENvbnRleHQtPmJBZ2dyZWdhdGlibGUpCisJeworCQlwU3JjID0gJnBUeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5BZ2dyZWdhdGlvblsyXTsKKwl9CisJZWxzZQorCXsKKwkJcFNyYyA9IChQVUNIQVIpIHBUeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldDsKKwl9CisKKworCS8vSW5pdGlhbGl6ZSBhIHR4IGJ1bGsgdXJiCisJUlRVU0JfRklMTF9CVUxLX1VSQihwVXJiLAorCQkJCQkJcE9iai0+cFVzYl9EZXYsCisJCQkJCQl1c2Jfc25kYnVsa3BpcGUocE9iai0+cFVzYl9EZXYsIHBBZC0+QnVsa091dEVwQWRkcltCdWxrT3V0UGlwZUlkXSksCisJCQkJCQlwU3JjLAorCQkJCQkJcFR4Q29udGV4dC0+QnVsa091dFNpemUsCisJCQkJCQlGdW5jLAorCQkJCQkJcFR4Q29udGV4dCk7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJaWYgKHBUeENvbnRleHQtPmJBZ2dyZWdhdGlibGUpCisJCXBVcmItPnRyYW5zZmVyX2RtYQk9IChwVHhDb250ZXh0LT5kYXRhX2RtYSArIFRYX0JVRkZFUl9OT1JNU0laRSArIDIpOworCWVsc2UKKwkJcFVyYi0+dHJhbnNmZXJfZG1hCT0gcFR4Q29udGV4dC0+ZGF0YV9kbWE7CisKKwlwVXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKyNlbmRpZgorCit9CisKK1ZPSUQJUlRVU0JJbml0SFRUeERlc2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUEhUX1RYX0NPTlRFWFQJcFR4Q29udGV4dCwKKwlJTglVQ0hBUgkJCUJ1bGtPdXRQaXBlSWQsCisJSU4JVUxPTkcJCQlCdWxrT3V0U2l6ZSwKKwlJTgl1c2JfY29tcGxldGVfdAlGdW5jKQoreworCVBVUkIJCQkJcFVyYjsKKwlQVUNIQVIJCQkJcFNyYyA9IE5VTEw7CisJUE9TX0NPT0tJRQkJCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwlwVXJiID0gcFR4Q29udGV4dC0+cFVyYjsKKwlBU1NFUlQocFVyYik7CisKKwkvLyBTdG9yZSBCdWxrT3V0IFBpcGVJZAorCXBUeENvbnRleHQtPkJ1bGtPdXRQaXBlSWQgPSBCdWxrT3V0UGlwZUlkOworCisJcFNyYyA9ICZwVHhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbcFR4Q29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbl07CisKKworCS8vSW5pdGlhbGl6ZSBhIHR4IGJ1bGsgdXJiCisJUlRVU0JfRklMTF9CVUxLX1VSQihwVXJiLAorCQkJCQkJcE9iai0+cFVzYl9EZXYsCisJCQkJCQl1c2Jfc25kYnVsa3BpcGUocE9iai0+cFVzYl9EZXYsIHBBZC0+QnVsa091dEVwQWRkcltCdWxrT3V0UGlwZUlkXSksCisJCQkJCQlwU3JjLAorCQkJCQkJQnVsa091dFNpemUsCisJCQkJCQlGdW5jLAorCQkJCQkJcFR4Q29udGV4dCk7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJcFVyYi0+dHJhbnNmZXJfZG1hCT0gKHBUeENvbnRleHQtPmRhdGFfZG1hICsgcFR4Q29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbik7CisJcFVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CisjZW5kaWYKKworfQorCitWT0lECVJUVVNCSW5pdFJ4RGVzYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQUlhfQ09OVEVYVAkJcFJ4Q29udGV4dCkKK3sKKwlQVVJCCQkJCXBVcmI7CisJUE9TX0NPT0tJRQkJCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisJVUxPTkcJCQkJUlhfYnVsa19zaXplOworCisKKwlwVXJiID0gcFJ4Q29udGV4dC0+cFVyYjsKKwlBU1NFUlQocFVyYik7CisKKwlpZiAoIHBBZC0+QnVsa0luTWF4UGFja2V0U2l6ZSA9PSA2NCkKKwkJUlhfYnVsa19zaXplID0gNDA5NjsKKwllbHNlCisJCVJYX2J1bGtfc2l6ZSA9IE1BWF9SWEJVTEtfU0laRTsKKworCS8vSW5pdGlhbGl6ZSBhIHJ4IGJ1bGsgdXJiCisJUlRVU0JfRklMTF9CVUxLX1VSQihwVXJiLAorCQkJCQkJcE9iai0+cFVzYl9EZXYsCisJCQkJCQl1c2JfcmN2YnVsa3BpcGUocE9iai0+cFVzYl9EZXYsIHBBZC0+QnVsa0luRXBBZGRyKSwKKwkJCQkJCSYocFJ4Q29udGV4dC0+VHJhbnNmZXJCdWZmZXJbcEFkLT5OZXh0UnhCdWxrSW5Qb3NpdGlvbl0pLAorCQkJCQkJUlhfYnVsa19zaXplIC0gKHBBZC0+TmV4dFJ4QnVsa0luUG9zaXRpb24pLAorCQkJCQkJKHVzYl9jb21wbGV0ZV90KVJUVVNCQnVsa1J4Q29tcGxldGUsCisJCQkJCQkodm9pZCAqKXBSeENvbnRleHQpOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCXBVcmItPnRyYW5zZmVyX2RtYQk9IHBSeENvbnRleHQtPmRhdGFfZG1hICsgcEFkLT5OZXh0UnhCdWxrSW5Qb3NpdGlvbjsKKwlwVXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKyNlbmRpZgorCisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisjZGVmaW5lIEJVTEtfT1VUX0xPQ0socExvY2ssIElycUZsYWdzKQlcCisJCWlmKDEgLyohKGluX2ludGVycnVwdCgpICYgMHhmZmZmMDAwMCkqLykJXAorCQkJUlRNUF9JUlFfTE9DSygocExvY2spLCBJcnFGbGFncyk7CisKKyNkZWZpbmUgQlVMS19PVVRfVU5MT0NLKHBMb2NrLCBJcnFGbGFncykJXAorCQlpZigxIC8qIShpbl9pbnRlcnJ1cHQoKSAmIDB4ZmZmZjAwMDApKi8pCVwKKwkJCVJUTVBfSVJRX1VOTE9DSygocExvY2spLCBJcnFGbGFncyk7CisKKworVk9JRAlSVFVTQkJ1bGtPdXREYXRhUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJQnVsa091dFBpcGVJZCwKKwlJTglVQ0hBUgkJCUluZGV4KQoreworCisJUEhUX1RYX0NPTlRFWFQJcEhUVFhDb250ZXh0OworCVBVUkIJCQlwVXJiOworCWludAkJCQlyZXQgPSAwOworCVBUWElORk9fU1RSVUMJcFR4SW5mbywgcExhc3RUeEluZm8gPSBOVUxMOworCVBUWFdJX1NUUlVDICAgICAgICAgICAgIHBUeFdJOworCVVMT05HCQkJVG1wQnVsa0VuZFBvcywgVGhpc0J1bGtTaXplOworCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3MgPSAwLCBJcnFGbGFnczIgPSAwOworCVBVQ0hBUgkJCXBXaXJlbGVzc1BrdCwgcEFwcGVuZGFudDsKKwlCT09MRUFOCQkJYlR4UUxhc3RSb3VuZCA9IEZBTFNFOworCVVDSEFSCQkJYWxsemVyb1s0XT0gezB4MCwweDAsMHgwLDB4MH07CisKKwlCVUxLX09VVF9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisJaWYgKChwQWQtPkJ1bGtPdXRQZW5kaW5nW0J1bGtPdXRQaXBlSWRdID09IFRSVUUpIHx8IFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9ORUVEX1NUT1BfVFgpKQorCXsKKwkJQlVMS19PVVRfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisJCXJldHVybjsKKwl9CisJcEFkLT5CdWxrT3V0UGVuZGluZ1tCdWxrT3V0UGlwZUlkXSA9IFRSVUU7CisKKwlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKQorCQkpCisJeworCQlwQWQtPkJ1bGtPdXRQZW5kaW5nW0J1bGtPdXRQaXBlSWRdID0gRkFMU0U7CisJCUJVTEtfT1VUX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCQlyZXR1cm47CisJfQorCUJVTEtfT1VUX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCisKKwlwSFRUWENvbnRleHQgPSAmKHBBZC0+VHhDb250ZXh0W0J1bGtPdXRQaXBlSWRdKTsKKworCUJVTEtfT1VUX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFnczIpOworCWlmICgocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9PSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pCisJCXx8ICgocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbi04KSA9PSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pKQorCXsKKwkJQlVMS19PVVRfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MyKTsKKworCQlCVUxLX09VVF9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisJCXBBZC0+QnVsa091dFBlbmRpbmdbQnVsa091dFBpcGVJZF0gPSBGQUxTRTsKKworCQkvLyBDbGVhciBEYXRhIGZsYWcKKwkJUlRVU0JfQ0xFQVJfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX0ZSQUcgPDwgQnVsa091dFBpcGVJZCkpOworCQlSVFVTQl9DTEVBUl9CVUxLX0ZMQUcocEFkLCAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8IEJ1bGtPdXRQaXBlSWQpKTsKKworCQlCVUxLX09VVF9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8vIENsZWFyIERhdGEgZmxhZworCVJUVVNCX0NMRUFSX0JVTEtfRkxBRyhwQWQsIChmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHIDw8IEJ1bGtPdXRQaXBlSWQpKTsKKwlSVFVTQl9DTEVBUl9CVUxLX0ZMQUcocEFkLCAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8IEJ1bGtPdXRQaXBlSWQpKTsKKworCS8vREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCdWxrT3V0LUI6ST0weCVseCwgQ1dQb3M9JWxkLCBDV1JQb3M9JWxkLCBOQlBvcz0lbGQsIEVOQlBvcz0lbGQsIGJDb3B5PSVkIVxuIiwgaW5faW50ZXJydXB0KCksCisJLy8JCQkJCQkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcywgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uLAorCS8vCQkJCQkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkKSk7CisJcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uID0gcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbjsKKwlUaGlzQnVsa1NpemUgPSAwOworCVRtcEJ1bGtFbmRQb3MgPSBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb247CisJcFdpcmVsZXNzUGt0ID0gJnBIVFRYQ29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0WzBdOworCisJaWYgKChwSFRUWENvbnRleHQtPmJDb3B5U2F2ZVBhZCA9PSBUUlVFKSkKKwl7CisJCWlmIChSVE1QRXF1YWxNZW1vcnkocEhUVFhDb250ZXh0LT5TYXZlZFBhZCwgYWxsemVybyw0KSkKKwkJeworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiZTEsIGFsbHplcm8gOiAleCAgJXggICV4ICAleCAgJXggICV4ICAleCAgJXggXG4iLAorCQkJCXBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbMF0sIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbMV0sIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbMl0scEhUVFhDb250ZXh0LT5TYXZlZFBhZFszXQorCQkJCSxwSFRUWENvbnRleHQtPlNhdmVkUGFkWzRdLCBwSFRUWENvbnRleHQtPlNhdmVkUGFkWzVdLCBwSFRUWENvbnRleHQtPlNhdmVkUGFkWzZdLHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbN10pKTsKKwkJfQorCQlOZGlzTW92ZU1lbW9yeSgmcFdpcmVsZXNzUGt0W1RtcEJ1bGtFbmRQb3NdLCBwSFRUWENvbnRleHQtPlNhdmVkUGFkLCA4KTsKKwkJcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQgPSBGQUxTRTsKKwkJaWYgKHBBZC0+YkZvcmNlUHJpbnRUWCA9PSBUUlVFKQorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSVFVTQkJ1bGtPdXREYXRhUGFja2V0IC0tPiBDT1BZIFBBRC4gQ3VyV3JpdGUgPSAlbGQsIE5leHRCdWxrID0gJWxkLiAgIEVOZXh0QnVsayA9ICVsZC5cbiIsICAgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLCBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24pKTsKKwl9CisKKwlkbworCXsKKwkJcFR4SW5mbyA9IChQVFhJTkZPX1NUUlVDKSZwV2lyZWxlc3NQa3RbVG1wQnVsa0VuZFBvc107CisJCXBUeFdJID0gKFBUWFdJX1NUUlVDKSZwV2lyZWxlc3NQa3RbVG1wQnVsa0VuZFBvcyArIFRYSU5GT19TSVpFXTsKKworCQlpZiAocEFkLT5iRm9yY2VQcmludFRYID09IFRSVUUpCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVFVTQkJ1bGtPdXREYXRhUGFja2V0IEFNUERVID0gJWQuXG4iLCAgIHBUeFdJLT5BTVBEVSkpOworCisJCS8vIGFkZCBieSBJdmVyc29uLCBsaW1pdCBCdWxrT3V0IHNpemUgdG8gNGsgdG8gcGFzcyBXTU0gYiBtb2RlIDJUMVIgdGVzdCBpdGVtcworCQkvL2lmICgoVGhpc0J1bGtTaXplICE9IDApICAmJiAocFR4V0ktPkFNUERVID09IDApKQorCQlpZiAoKFRoaXNCdWxrU2l6ZSAhPSAwKSAmJiAocFR4V0ktPlBIWU1PREUgPT0gTU9ERV9DQ0spKQorCQl7CisJCQlpZiAoKChUaGlzQnVsa1NpemUmMHhmZmZmODAwMCkgIT0gMCkgfHwgKChUaGlzQnVsa1NpemUmMHgxMDAwKSA9PSAweDEwMDApKQorCQkJeworCQkJCS8vIExpbWl0IEJ1bGtPdXQgc2l6ZSB0byBhYm91dCA0ayBieXRlcy4KKwkJCQlwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID0gVG1wQnVsa0VuZFBvczsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UgaWYgKCgocEFkLT5CdWxrT3V0TWF4UGFja2V0U2l6ZSA8IDUxMikgJiYgKChUaGlzQnVsa1NpemUmMHhmZmZmZjgwMCkgIT0gMCkgKSAvKnx8ICggKFRoaXNCdWxrU2l6ZSAhPSAwKSAgJiYgKHBUeFdJLT5BTVBEVSA9PSAwKSkqLykKKwkJCXsKKwkJCQkvLyBGb3IgVVNCIDEuMSBvciBwZWVyIHdoaWNoIGRpZG4ndCBzdXBwb3J0IEFNUERVLCBsaW1pdCB0aGUgQnVsa091dCBzaXplLgorCQkJCS8vIEZvciBwZXJmb3JtZW5jZSBpbiBiL2cgbW9kZSwgbm93IGp1c3QgY2hlY2sgZm9yIFVTQiAxLjEgYW5kIGRpZG4ndCBjYXJlIGFib3V0IHRoZSBBUE1EVSBvciBub3QhIDIwMDgvMDYvMDQuCisJCQkJcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9IFRtcEJ1bGtFbmRQb3M7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJLy8gZW5kIEl2ZXJzb24KKwkJZWxzZQorCQl7CisJCQlpZiAoKChUaGlzQnVsa1NpemUmMHhmZmZmODAwMCkgIT0gMCkgfHwgKChUaGlzQnVsa1NpemUmMHg2MDAwKSA9PSAweDYwMDApKQorCQkJewkvLyBMaW1pdCBCdWxrT3V0IHNpemUgdG8gYWJvdXQgMjRrIGJ5dGVzLgorCQkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gPSBUbXBCdWxrRW5kUG9zOworCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZSBpZiAoKChwQWQtPkJ1bGtPdXRNYXhQYWNrZXRTaXplIDwgNTEyKSAmJiAoKFRoaXNCdWxrU2l6ZSYweGZmZmZmODAwKSAhPSAwKSApIC8qfHwgKCAoVGhpc0J1bGtTaXplICE9IDApICAmJiAocFR4V0ktPkFNUERVID09IDApKSovKQorCQkJewkvLyBGb3IgVVNCIDEuMSBvciBwZWVyIHdoaWNoIGRpZG4ndCBzdXBwb3J0IEFNUERVLCBsaW1pdCB0aGUgQnVsa091dCBzaXplLgorCQkJCS8vIEZvciBwZXJmb3JtZW5jZSBpbiBiL2cgbW9kZSwgbm93IGp1c3QgY2hlY2sgZm9yIFVTQiAxLjEgYW5kIGRpZG4ndCBjYXJlIGFib3V0IHRoZSBBUE1EVSBvciBub3QhIDIwMDgvMDYvMDQuCisJCQkJcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9IFRtcEJ1bGtFbmRQb3M7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoVG1wQnVsa0VuZFBvcyA9PSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pCisJCXsKKwkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gPSBUbXBCdWxrRW5kUG9zOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocFR4SW5mby0+UVNFTCAhPSBGSUZPX0VEQ0EpCisJCXsKKwkJCXByaW50aygiJXMoKTogPT09PT4gcFR4SW5mby0+UXVldWVTZWwoJWQpIT0gRklGT19FRENBISEhIVxuIiwgX19mdW5jX18sIHBUeEluZm8tPlFTRUwpOworCQkJcHJpbnRrKCJcdENXUG9zPSVsZCwgTkJQb3M9JWxkLCBFTkJQb3M9JWxkLCBiQ29weT0lZCFcbiIsIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uLCBwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uLCBwSFRUWENvbnRleHQtPmJDb3B5U2F2ZVBhZCk7CisJCQloZXhfZHVtcCgiV3JvbmcgUVNlbCBQa3Q6IiwgKFBVQ0hBUikmcFdpcmVsZXNzUGt0W1RtcEJ1bGtFbmRQb3NdLCAocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uIC0gcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uKSk7CisJCX0KKworCQlpZiAocFR4SW5mby0+VVNCRE1BVHhQa3RMZW4gPD0gOCkKKwkJeworCQkJQlVMS19PVVRfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MyKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SIC8qUlRfREVCVUdfVFJBQ0UqLywoImUyLCBVU0JETUFUeFBrdExlbj09MCwgU2l6ZT0lbGQsIGJDU1BhZD0lZCwgQ1dQb3M9JWxkLCBOQlBvcz0lbGQsIENXUlBvcz0lbGQhXG4iLAorCQkJCQlwSFRUWENvbnRleHQtPkJ1bGtPdXRTaXplLCBwSFRUWENvbnRleHQtPmJDb3B5U2F2ZVBhZCwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLCBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zKSk7CisJCQl7CisJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SIC8qUlRfREVCVUdfVFJBQ0UqLywoIiV4ICAleCAgJXggICV4ICAleCAgJXggICV4ICAleCBcbiIsCisJCQkJCXBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbMF0sIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbMV0sIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbMl0scEhUVFhDb250ZXh0LT5TYXZlZFBhZFszXQorCQkJCQkscEhUVFhDb250ZXh0LT5TYXZlZFBhZFs0XSwgcEhUVFhDb250ZXh0LT5TYXZlZFBhZFs1XSwgcEhUVFhDb250ZXh0LT5TYXZlZFBhZFs2XSxwSFRUWENvbnRleHQtPlNhdmVkUGFkWzddKSk7CisJCQl9CisJCQlwQWQtPmJGb3JjZVByaW50VFggPSBUUlVFOworCQkJQlVMS19PVVRfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCQkJcEFkLT5CdWxrT3V0UGVuZGluZ1tCdWxrT3V0UGlwZUlkXSA9IEZBTFNFOworCQkJQlVMS19PVVRfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisJCQkvL0RCR1BSSU5UKFJUX0RFQlVHX0xPVUQsKCJPdXQ6cFR4SW5mby0+VVNCRE1BVHhQa3RMZW49JWQhXG4iLCBwVHhJbmZvLT5VU0JETUFUeFBrdExlbikpOworCQkJcmV0dXJuOworCQl9CisKKwkJCS8vIEluY3JlYXNlIFRvdGFsIHRyYW5zbWl0IGJ5dGUgY291bnRlcgorCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1RyYW5zbWl0dGVkQnl0ZUNvdW50ICs9ICBwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQnl0ZUNvdW50ICs9ICBwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50OworCisJCXBMYXN0VHhJbmZvID0gcFR4SW5mbzsKKworCQkvLyBNYWtlIHN1cmUgd2UgdXNlIEVEQ0EgUVVFVUUuCisJCXBUeEluZm8tPlFTRUwgPSBGSUZPX0VEQ0E7CisJCVRoaXNCdWxrU2l6ZSArPSAocFR4SW5mby0+VVNCRE1BVHhQa3RMZW4rNCk7CisJCVRtcEJ1bGtFbmRQb3MgKz0gKHBUeEluZm8tPlVTQkRNQVR4UGt0TGVuKzQpOworCisJCWlmIChUbXBCdWxrRW5kUG9zICE9IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikKKwkJCXBUeEluZm8tPlVTQkRNQU5leHRWTEQgPSAxOworCisJCWlmIChwVHhJbmZvLT5Td1VzZUxhc3RSb3VuZCA9PSAxKQorCQl7CisJCQlpZiAocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID09IDgpCisJCQkJcFR4SW5mby0+VVNCRE1BTmV4dFZMRCA9IDA7CisJCQlwVHhJbmZvLT5Td1VzZUxhc3RSb3VuZCA9IDA7CisKKwkJCWJUeFFMYXN0Um91bmQgPSBUUlVFOworCQkJcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9IDg7CisKKwkjaWZkZWYgUlRfQklHX0VORElBTgorCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhJbmZvLCBUWVBFX1RYSU5GTyk7CisJCQlSVE1QV0lFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhXSSwgVFlQRV9UWFdJKTsKKwkjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCisJCQlicmVhazsKKwkJfQorCisjaWZkZWYgUlRfQklHX0VORElBTgorCQlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEluZm8sIFRZUEVfVFhJTkZPKTsKKwkJUlRNUFdJRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4V0ksIFRZUEVfVFhXSSk7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCisJfXdoaWxlIChUUlVFKTsKKworCS8vIGFkanVzdCB0aGUgcFR4SW5mby0+VVNCRE1BTmV4dFZMRCB2YWx1ZSBvZiBsYXN0IHBUeEluZm8uCisJaWYgKHBMYXN0VHhJbmZvKQorCXsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcExhc3RUeEluZm8sIFRZUEVfVFhJTkZPKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisJCXBMYXN0VHhJbmZvLT5VU0JETUFOZXh0VkxEID0gMDsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcExhc3RUeEluZm8sIFRZUEVfVFhJTkZPKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisJfQorCisJLyoKKwkJV2UgbmVlZCB0byBjb3B5IFNhdmVkUGFkIHdoZW4gZm9sbG93aW5nIGNvbmRpdGlvbiBtYXRjaGVkIQorCQkJMS4gTm90IHRoZSBsYXN0IHJvdW5kIG9mIHRoZSBUeFF1ZXVlIGFuZAorCQkJMi4gYW55IG1hdGNoIG9mIGZvbGxvd2luZyBjYXNlczoKKwkJCQkoMSkuIFRoZSBFbmQgUG9zaXRpb24gb2YgdGhpcyBidWxrIG91dCBpcyByZWFjaCB0byB0aGUgQ3VycmVuY3QgV3JpdGUgcG9zaXRpb24gYW5kCisJCQkJCQl0aGUgVHhJbmZvIGFuZCByZWxhdGVkIGhlYWRlciBhbHJlYWR5IHdyaXRlIHRvIHRoZSBDdXJXcml0ZVBvc2l0aW9uLgorCQkJICAgCQk9PihFTmV4dEJ1bGtPdXRQb3NpdGlvbiA9PSBDdXJXcml0ZVBvc2l0aW9uKSAmJiAoQ3VyV3JpdGVSZWFsUG9zID4gQ3VyV3JpdGVQb3NpdGlvbikKKworCQkJCSgyKS4gVGhlIEVuZFBvc2l0aW9uIG9mIHRoZSBidWxrIG91dCBpcyBub3QgcmVhY2ggdG8gdGhlIEN1cnJlbnQgV3JpdGUgUG9zaXRpb24uCisJCQkJCT0+KEVOZXh0QnVsa091dFBvc2l0aW9uICE9IEN1cldyaXRlUG9zaXRpb24pCisJKi8KKwlpZiAoKGJUeFFMYXN0Um91bmQgPT0gRkFMU0UpICYmCisJCSAoKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID09IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikgJiYgKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zID4gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSkgfHwKKwkJICAocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiAhPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pKQorCQkpCisJeworCQlOZGlzTW92ZU1lbW9yeShwSFRUWENvbnRleHQtPlNhdmVkUGFkLCAmcFdpcmVsZXNzUGt0W3BIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb25dLCA4KTsKKwkJcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQgPSBUUlVFOworCQlpZiAoUlRNUEVxdWFsTWVtb3J5KHBIVFRYQ29udGV4dC0+U2F2ZWRQYWQsIGFsbHplcm8sNCkpCisJCXsKKwkJCVBVQ0hBUglwQnVmID0gJnBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbMF07CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJXQVJOSU5HLVplcm8tMzolMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCxDV1Bvcz0lbGQsIENXUlBvcz0lbGQsIGJDVz0lZCwgTkJQb3M9JWxkLCBUQlBvcz0lbGQsIFRCU2l6ZT0lbGRcbiIsCisJCQkJcEJ1ZlswXSwgcEJ1ZlsxXSwgcEJ1ZlsyXSxwQnVmWzNdLHBCdWZbNF0sIHBCdWZbNV0sIHBCdWZbNl0scEJ1Zls3XSwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcywKKwkJCQlwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nLCBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24sIFRtcEJ1bGtFbmRQb3MsIFRoaXNCdWxrU2l6ZSkpOworCisJCQlwQnVmID0gJnBXaXJlbGVzc1BrdFtwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb25dOworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiXHRDV1Bvcz0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIiwgcEJ1ZlswXSwgcEJ1ZlsxXSwgcEJ1ZlsyXSxwQnVmWzNdLHBCdWZbNF0sIHBCdWZbNV0sIHBCdWZbNl0scEJ1Zls3XSkpOworCQl9CisJCS8vREJHUFJJTlQoUlRfREVCVUdfTE9VRCwoIkVOUG9zPT1DV1Bvcz0lbGQsIENXUlBvcz0lbGQsIGJDU1BhZD0lZCFcbiIsIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MsIHBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkKSk7CisJfQorCisJaWYgKHBBZC0+YkZvcmNlUHJpbnRUWCA9PSBUUlVFKQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJ1bGtPdXQtQTpTaXplPSVsZCwgQ1dQb3M9JWxkLCBOQlBvcz0lbGQsIEVOQlBvcz0lbGQsIGJDb3B5PSVkIVxuIiwgVGhpc0J1bGtTaXplLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sIHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQpKTsKKwkvL0RCR1BSSU5UKFJUX0RFQlVHX0xPVUQsKCJCdWxrT3V0LUE6U2l6ZT0lbGQsIENXUG9zPSVsZCwgQ1dSUG9zPSVsZCwgTkJQb3M9JWxkLCBFTkJQb3M9JWxkLCBiQ29weT0lZCwgYkxSb3VuZD0lZCFcbiIsIFRoaXNCdWxrU2l6ZSwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcywgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uLCBwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uLCBwSFRUWENvbnRleHQtPmJDb3B5U2F2ZVBhZCwgYlR4UUxhc3RSb3VuZCkpOworCisJCS8vIFVTQiBETUEgZW5naW5lIHJlcXVpcmVzIHRvIHBhZCBleHRyYSA0IGJ5dGVzLiBUaGlzIHBhZCBkb2Vzbid0IGNvdW50IGludG8gcmVhbCBidWxrb3V0c2l6ZS4KKwlwQXBwZW5kYW50ID0gJnBXaXJlbGVzc1BrdFtUbXBCdWxrRW5kUG9zXTsKKwlOZGlzWmVyb01lbW9yeShwQXBwZW5kYW50LCA4KTsKKwkJVGhpc0J1bGtTaXplICs9IDQ7CisJCXBIVFRYQ29udGV4dC0+TGFzdE9uZSA9IFRSVUU7CisJCWlmICgoVGhpc0J1bGtTaXplICUgcEFkLT5CdWxrT3V0TWF4UGFja2V0U2l6ZSkgPT0gMCkKKwkJCVRoaXNCdWxrU2l6ZSArPSA0OworCXBIVFRYQ29udGV4dC0+QnVsa091dFNpemUgPSBUaGlzQnVsa1NpemU7CisKKwlwQWQtPndhdGNoRG9nVHhQZW5kaW5nQ250W0J1bGtPdXRQaXBlSWRdID0gMTsKKwlCVUxLX09VVF9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFnczIpOworCisJLy8gSW5pdCBUeCBjb250ZXh0IGRlc2NyaXB0b3IKKwlSVFVTQkluaXRIVFR4RGVzYyhwQWQsIHBIVFRYQ29udGV4dCwgQnVsa091dFBpcGVJZCwgVGhpc0J1bGtTaXplLCAodXNiX2NvbXBsZXRlX3QpUlRVU0JCdWxrT3V0RGF0YVBhY2tldENvbXBsZXRlKTsKKworCXBVcmIgPSBwSFRUWENvbnRleHQtPnBVcmI7CisJaWYoKHJldCA9IFJUVVNCX1NVQk1JVF9VUkIocFVyYikpIT0wKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRVU0JCdWxrT3V0RGF0YVBhY2tldDogU3VibWl0IFR4IFVSQiBmYWlsZWQgJWRcbiIsIHJldCkpOworCisJCUJVTEtfT1VUX0xPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwkJcEFkLT5CdWxrT3V0UGVuZGluZ1tCdWxrT3V0UGlwZUlkXSA9IEZBTFNFOworCQlwQWQtPndhdGNoRG9nVHhQZW5kaW5nQ250W0J1bGtPdXRQaXBlSWRdID0gMDsKKwkJQlVMS19PVVRfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisKKwkJcmV0dXJuOworCX0KKworCUJVTEtfT1VUX0xPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwlwSFRUWENvbnRleHQtPklSUFBlbmRpbmcgPSBUUlVFOworCUJVTEtfT1VUX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCXBBZC0+QnVsa091dFJlcSsrOworCit9CisKKworVk9JRCBSVFVTQkJ1bGtPdXREYXRhUGFja2V0Q29tcGxldGUocHVyYmJfdCBwVXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncykKK3sKKyNpZiAwIC8vIHNhbXBsZSwgSVJRIExPQ0sKKwlQUlRNUF9BREFQVEVSCQlwQWQ7CisJUE9TX0NPT0tJRQkJCXBPYmo7CisJUEhUX1RYX0NPTlRFWFQJCXBIVFRYQ29udGV4dDsKKwlVQ0hBUgkJCQlCdWxrT3V0UGlwZUlkOworCU5UU1RBVFVTCQkJU3RhdHVzOworCXVuc2lnbmVkIGxvbmcJCUlycUZsYWdzOworCisJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0lORk8sICgiLS0tPlJUVVNCQnVsa091dERhdGFQYWNrZXRDb21wbGV0ZVxuIikpOworCisJcEhUVFhDb250ZXh0CT0gKFBIVF9UWF9DT05URVhUKXBVcmItPmNvbnRleHQ7CisJcEFkCQkJPSBwSFRUWENvbnRleHQtPnBBZDsKKwlwT2JqIAkJPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisJU3RhdHVzCQk9IHBVcmItPnN0YXR1czsKKworCS8vIFN0b3JlIEJ1bGtPdXQgUGlwZUlkCisJQnVsa091dFBpcGVJZCA9IHBIVFRYQ29udGV4dC0+QnVsa091dFBpcGVJZDsKKwlwQWQtPkJ1bGtPdXREYXRhT25lU2VjQ291bnQrKzsKKworCS8vREJHUFJJTlQoUlRfREVCVUdfTE9VRCwgKCJEb25lLUIoJWQpOkk9MHglbHgsIENXUG9zPSVsZCwgTkJQb3M9JWxkLCBFTkJQb3M9JWxkLCBiQ29weT0lZCFcbiIsIEJ1bGtPdXRQaXBlSWQsIGluX2ludGVycnVwdCgpLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sCisJLy8JCXBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQpKTsKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwlwQWQtPkJ1bGtPdXRQZW5kaW5nW0J1bGtPdXRQaXBlSWRdID0gRkFMU0U7CisJcEhUVFhDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisKKwlpZiAoU3RhdHVzID09IFVTQl9TVF9OT0VSUk9SKQorCXsKKwkJcEFkLT5CdWxrT3V0Q29tcGxldGUrKzsKKworCQlwQWQtPkNvdW50ZXJzODAyMy5Hb29kVHJhbnNtaXRzKys7CisJCS8vUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwkJRlJFRV9IVFRYX1JJTkcocEFkLCBCdWxrT3V0UGlwZUlkLCBwSFRUWENvbnRleHQpOworCQkvL1JUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKworCisJfQorCWVsc2UJLy8gU1RBVFVTX09USEVSCisJeworCQlQVUNIQVIJcEJ1ZjsKKworCQlwQWQtPkJ1bGtPdXRDb21wbGV0ZU90aGVyKys7CisKKwkJcEJ1ZiA9ICZwSFRUWENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5XaXJlbGVzc1BhY2tldFtwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb25dOworCisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJCdWxrT3V0RGF0YVBhY2tldCBmYWlsZWQ6IFJlYXNvbkNvZGU9JWQhXG4iLCBTdGF0dXMpKTsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIj4+QnVsa091dCBSZXE9MHglbHgsIENvbXBsZXRlPTB4JWx4LCBPdGhlcj0weCVseFxuIiwgcEFkLT5CdWxrT3V0UmVxLCBwQWQtPkJ1bGtPdXRDb21wbGV0ZSwgcEFkLT5CdWxrT3V0Q29tcGxldGVPdGhlcikpOworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiPj5CdWxrT3V0IEhlYWRlcjoleCAleCAleCAleCAleCAleCAleCAleFxuIiwgcEJ1ZlswXSwgcEJ1ZlsxXSwgcEJ1ZlsyXSwgcEJ1ZlszXSwgcEJ1Zls0XSwgcEJ1Zls1XSwgcEJ1Zls2XSwgcEJ1Zls3XSkpOworCQkvL0RCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCI+PkJ1bGtPdXRDb21wbGV0ZUNhbmNlbD0weCV4LCBCdWxrT3V0Q29tcGxldGVPdGhlcj0weCV4XG4iLCBwQWQtPkJ1bGtPdXRDb21wbGV0ZUNhbmNlbCwgcEFkLT5CdWxrT3V0Q29tcGxldGVPdGhlcikpOworCisJCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCAoZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8CisJCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAorCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUIHwKKwkJCQkJCQkJCWZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQorCQl7CisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKTsKKwkJCXBBZC0+YnVsa1Jlc2V0UGlwZWlkID0gQnVsa091dFBpcGVJZDsKKwkJfQorCX0KKworCS8vCisJLy8gYkluVXNlID0gVFJVRSwgbWVhbnMgc29tZSBwcm9jZXNzIGFyZSBmaWxsaW5nIFRYIGRhdGEsIGFmdGVyIHRoYXQgbXVzdCB0dXJuIG9uIGJXYWl0aW5nQnVsa091dAorCS8vIGJXYWl0aW5nQnVsa091dCA9IFRSVUUsIG1lYW5zIHRoZSBUWCBkYXRhIGFyZSB3YWl0aW5nIGZvciBidWxrIG91dC4KKwkvLworCS8vUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwlpZiAoKHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gIT0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSAmJgorCQkocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiAhPSAocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKzgpKSAmJgorCQkhUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfRlJBRyA8PCBCdWxrT3V0UGlwZUlkKSkpCisJeworCQkvLyBJbmRpY2F0ZSBUaGVyZSBpcyBkYXRhIGF2YWxpYWJsZQorCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCBCdWxrT3V0UGlwZUlkKSk7CisJfQorCS8vUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCisJLy8gQWx3YXlzIGNhbGwgQnVsayByb3V0aW5lLCBldmVuIHJlc2V0IGJ1bGsuCisJLy8gVGhlIHByb3RlY3Rpb24gb2YgcmVzdCBidWxrIHNob3VsZCBiZSBpbiBCdWxrT3V0IHJvdXRpbmUKKwlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisKKworCS8vREJHUFJJTlQoUlRfREVCVUdfTE9VRCwoIkRvbmUtQSglZCk6ST0weCVseCwgQ1dQb3M9JWxkLCBOQlBvcz0lbGQsIEVOQlBvcz0lbGQsIGJDb3B5PSVkXG4iLCBCdWxrT3V0UGlwZUlkLCBpbl9pbnRlcnJ1cHQoKSwKKwkvLwkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLCBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkKSk7CisKKwlzd2l0Y2ggKEJ1bGtPdXRQaXBlSWQpCisJeworCQljYXNlIDA6CisJCQkJcE9iai0+YWMwX2RtYV9kb25lX3Rhc2suZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBBZDsKKwkJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzBfZG1hX2RvbmVfdGFzayk7CisJCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCQlwT2JqLT5hYzFfZG1hX2RvbmVfdGFzay5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcEFkOworCQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMV9kbWFfZG9uZV90YXNrKTsKKwkJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJCXBPYmotPmFjMl9kbWFfZG9uZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwQWQ7CisJCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMyX2RtYV9kb25lX3Rhc2spOworCQkJCWJyZWFrOworCQljYXNlIDM6CisJCQkJcE9iai0+YWMzX2RtYV9kb25lX3Rhc2suZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBBZDsKKwkJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzNfZG1hX2RvbmVfdGFzayk7CisJCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCQlwT2JqLT5oY2NhX2RtYV9kb25lX3Rhc2suZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBBZDsKKwkJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5oY2NhX2RtYV9kb25lX3Rhc2spOworCQkJCWJyZWFrOworCX0KKyNlbHNlCisKK3sKKwlQSFRfVFhfQ09OVEVYVAlwSFRUWENvbnRleHQ7CisJUFJUTVBfQURBUFRFUglwQWQ7CisJUE9TX0NPT0tJRSAJCXBPYmo7CisJVUNIQVIJCQlCdWxrT3V0UGlwZUlkOworCisKKwlwSFRUWENvbnRleHQJPSAoUEhUX1RYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKKwlwQWQgCQkJPSBwSFRUWENvbnRleHQtPnBBZDsKKwlwT2JqIAkJCT0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisJLy8gU3RvcmUgQnVsa091dCBQaXBlSWQKKwlCdWxrT3V0UGlwZUlkCT0gcEhUVFhDb250ZXh0LT5CdWxrT3V0UGlwZUlkOworCXBBZC0+QnVsa091dERhdGFPbmVTZWNDb3VudCsrOworCisJc3dpdGNoIChCdWxrT3V0UGlwZUlkKQorCXsKKwkJY2FzZSAwOgorCQkJCXBPYmotPmFjMF9kbWFfZG9uZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVXJiOworCQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMF9kbWFfZG9uZV90YXNrKTsKKwkJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJCXBPYmotPmFjMV9kbWFfZG9uZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVXJiOworCQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMV9kbWFfZG9uZV90YXNrKTsKKwkJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJCXBPYmotPmFjMl9kbWFfZG9uZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVXJiOworCQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMl9kbWFfZG9uZV90YXNrKTsKKwkJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJCXBPYmotPmFjM19kbWFfZG9uZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVXJiOworCQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjM19kbWFfZG9uZV90YXNrKTsKKwkJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJCXBPYmotPmhjY2FfZG1hX2RvbmVfdGFzay5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFVyYjsKKwkJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5oY2NhX2RtYV9kb25lX3Rhc2spOworCQkJCWJyZWFrOworCX0KK30KKyNlbmRpZgorCisKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6IE5VTEwgZnJhbWUgdXNlIEJ1bGtPdXRQaXBlSWQgPSAwCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUVVNCQnVsa091dE51bGxGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlQVFhfQ09OVEVYVAkJcE51bGxDb250ZXh0ID0gJihwQWQtPk51bGxDb250ZXh0KTsKKwlQVVJCCQkJcFVyYjsKKwlpbnQJCQkJcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nCUlycUZsYWdzOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgSXJxRmxhZ3MpOworCWlmICgocEFkLT5CdWxrT3V0UGVuZGluZ1swXSA9PSBUUlVFKSB8fCBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTkVFRF9TVE9QX1RYKSkKKwl7CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgSXJxRmxhZ3MpOworCQlyZXR1cm47CisJfQorCXBBZC0+QnVsa091dFBlbmRpbmdbMF0gPSBUUlVFOworCXBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbMF0gPSAxOworCXBOdWxsQ29udGV4dC0+SVJQUGVuZGluZyA9IFRSVUU7CisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBJcnFGbGFncyk7CisKKwkvLyBJbmNyZWFzZSBUb3RhbCB0cmFuc21pdCBieXRlIGNvdW50ZXIKKwlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQnl0ZUNvdW50ICs9ICBwTnVsbENvbnRleHQtPkJ1bGtPdXRTaXplOworCisKKwkvLyBDbGVhciBOdWxsIGZyYW1lIGJ1bGsgZmxhZworCVJUVVNCX0NMRUFSX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05VTEwpOworCisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcE51bGxDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciwgVFlQRV9UWElORk8pOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKworCS8vIEluaXQgVHggY29udGV4dCBkZXNjcmlwdG9yCisJUlRVU0JJbml0VHhEZXNjKHBBZCwgcE51bGxDb250ZXh0LCAwLCAodXNiX2NvbXBsZXRlX3QpUlRVU0JCdWxrT3V0TnVsbEZyYW1lQ29tcGxldGUpOworCisJcFVyYiA9IHBOdWxsQ29udGV4dC0+cFVyYjsKKwlpZigocmV0ID0gUlRVU0JfU1VCTUlUX1VSQihwVXJiKSkhPTApCisJeworCQlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBJcnFGbGFncyk7CisJCXBBZC0+QnVsa091dFBlbmRpbmdbMF0gPSBGQUxTRTsKKwkJcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFswXSA9IDA7CisJCXBOdWxsQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIElycUZsYWdzKTsKKworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVFVTQkJ1bGtPdXROdWxsRnJhbWU6IFN1Ym1pdCBUeCBVUkIgZmFpbGVkICVkXG4iLCByZXQpKTsKKwkJcmV0dXJuOworCX0KKworfQorCisvLyBOVUxMIGZyYW1lIHVzZSBCdWxrT3V0UGlwZUlkID0gMAorVk9JRCBSVFVTQkJ1bGtPdXROdWxsRnJhbWVDb21wbGV0ZShwdXJiYl90IHBVcmIsIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKQoreworCVBSVE1QX0FEQVBURVIJCXBBZDsKKwlQVFhfQ09OVEVYVAkJCXBOdWxsQ29udGV4dDsKKwlOVFNUQVRVUwkJCVN0YXR1czsKKyNpZiAwIC8vIHNhbXBsZSwgSVJRIExPQ0sKKwl1bnNpZ25lZCBsb25nCQlJcnFGbGFnczsKKyNlbmRpZgorCVBPU19DT09LSUUJCQlwT2JqOworCisKKwlwTnVsbENvbnRleHQJPSAoUFRYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKKwlwQWQgCQkJPSBwTnVsbENvbnRleHQtPnBBZDsKKwlTdGF0dXMgCQkJPSBwVXJiLT5zdGF0dXM7CisKKyNpZiAwIC8vIHNhbXBsZSwgSVJRIExPQ0sKKwkvLyBSZXNldCBOdWxsIGZyYW1lIGNvbnRleHQgZmxhZ3MKKwlwTnVsbENvbnRleHQtPklSUFBlbmRpbmcgCT0gRkFMU0U7CisJcE51bGxDb250ZXh0LT5JblVzZSAJCT0gRkFMU0U7CisKKwlpZiAoU3RhdHVzID09IFVTQl9TVF9OT0VSUk9SKQorCXsKKwkJLy8gRG9uJ3Qgd29ycnkgYWJvdXQgdGhlIHF1ZXVlIGlzIGVtcHR5IG9yIG5vdCwgdGhpcyBmdW5jdGlvbiB3aWxsIGNoZWNrIGl0c2VsZgorCQkvL1JUTVBVU0JEZVF1ZXVlUGFja2V0KHBBZCwgMCk7CisJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgVFJVRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKKwl9CisJZWxzZQkvLyBTVEFUVVNfT1RIRVIKKwl7CisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQorCQl7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsayBPdXQgTnVsbCBGcmFtZSBGYWlsZWRcbiIpKTsKKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpOworCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQsIE5VTEwsIDApOworCQl9CisJfQorCisJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgSXJxRmxhZ3MpOworCXBBZC0+QnVsa091dFBlbmRpbmdbMF0gPSBGQUxTRTsKKwlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIElycUZsYWdzKTsKKworCS8vIEFsd2F5cyBjYWxsIEJ1bGsgcm91dGluZSwgZXZlbiByZXNldCBidWxrLgorCS8vIFRoZSBwcm90ZWN0aW9vbiBvZiByZXN0IGJ1bGsgc2hvdWxkIGJlIGluIEJ1bGtPdXQgcm91dGluZQorCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKKyNlbHNlCisKKwlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCXBPYmotPm51bGxfZnJhbWVfY29tcGxldGVfdGFzay5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFVyYjsKKwl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5udWxsX2ZyYW1lX2NvbXBsZXRlX3Rhc2spOworI2VuZGlmCisKK30KKworI2lmIDAJLy8gRm9yIFJUMjg3MCwgUlRTIGZyYW1lIG5vdCB1c2VkIG5vdywgYnV0IG1heWJlIHdpbGwgdXNlIGl0IGxhdHRlci4KKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZTogUlRTIGZyYW1lIHVzZSBCdWxrT3V0UGlwZUlkID0gMAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVFVTQkJ1bGtPdXRSVFNGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlQVFhfQ09OVEVYVAkJcFJUU0NvbnRleHQgPSAmKHBBZC0+UlRTQ29udGV4dCk7CisJUFVSQgkJCXBVcmI7CisJaW50CQkJCXJldCA9IDA7CisJdW5zaWduZWQgbG9uZwlJcnFGbGFnczsKKwlVQ0hBUgkJCVBpcGVJRD0wOworCisJaWYgKFJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMXzQpKQorCQlQaXBlSUQ9IDM7CisJZWxzZSBpZiAoUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUxfMykpCisJCVBpcGVJRD0gMjsKKwllbHNlIGlmIChSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTF8yKSkKKwkJUGlwZUlEPSAxOworCWVsc2UgaWYgKFJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMKSkKKwkJUGlwZUlEPSAwOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tQaXBlSURdLCBJcnFGbGFncyk7CisJaWYgKChwQWQtPkJ1bGtPdXRQZW5kaW5nW1BpcGVJRF0gPT0gVFJVRSkgfHwgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05FRURfU1RPUF9UWCkpCisJeworCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbUGlwZUlEXSwgSXJxRmxhZ3MpOworCQlyZXR1cm47CisJfQorCXBBZC0+QnVsa091dFBlbmRpbmdbUGlwZUlEXSA9IFRSVUU7CisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW1BpcGVJRF0sIElycUZsYWdzKTsKKworCS8vIEluY3JlYXNlIFRvdGFsIHRyYW5zbWl0IGJ5dGUgY291bnRlcgorCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRCeXRlQ291bnQgKz0gIHBSVFNDb250ZXh0LT5CdWxrT3V0U2l6ZTsKKworCURCR1BSSU5UX1JBVyhSVF9ERUJVR19JTkZPLCAoIi0tLT5SVFVTQkJ1bGtPdXRSVFNGcmFtZSBcbiIpKTsKKworCS8vIENsZWFyIFJUUyBmcmFtZSBidWxrIGZsYWcKKwlSVFVTQl9DTEVBUl9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfUlRTKTsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBSVFNDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciwgVFlQRV9UWElORk8pOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKworCS8vIEluaXQgVHggY29udGV4dCBkZXNjcmlwdG9yCisJUlRVU0JJbml0VHhEZXNjKHBBZCwgcFJUU0NvbnRleHQsIFBpcGVJRCwgKHVzYl9jb21wbGV0ZV90KVJUVVNCQnVsa091dFJUU0ZyYW1lQ29tcGxldGUpOworCXBSVFNDb250ZXh0LT5JUlBQZW5kaW5nID0gVFJVRTsKKworCXBVcmIgPSBwUlRTQ29udGV4dC0+cFVyYjsKKwlpZigocmV0ID0gUlRVU0JfU1VCTUlUX1VSQihwVXJiKSkhPTApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVFVTQkJ1bGtPdXRSVFNGcmFtZTogU3VibWl0IFR4IFVSQiBmYWlsZWQgJWRcbiIsIHJldCkpOworCQlyZXR1cm47CisJfQorCisJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0lORk8sICgiPC0tLVJUVVNCQnVsa091dFJUU0ZyYW1lIFxuIikpOworCit9CisKKy8vIFJUUyBmcmFtZSB1c2UgQnVsa091dFBpcGVJZCA9IDAKK1ZPSUQgUlRVU0JCdWxrT3V0UlRTRnJhbWVDb21wbGV0ZShwdXJiYl90IHBVcmIsIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKQoreworCVBSVE1QX0FEQVBURVIJcEFkOworCVBUWF9DT05URVhUCQlwUlRTQ29udGV4dDsKKwlOVFNUQVRVUwkJU3RhdHVzOworI2lmIDAgLy8gc2FtcGxlLCBJUlEgTE9DSworCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7CisjZW5kaWYKKwlQT1NfQ09PS0lFCQlwT2JqOworCisJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0lORk8sICgiLS0tPlJUVVNCQnVsa091dFJUU0ZyYW1lQ29tcGxldGVcbiIpKTsKKworCXBSVFNDb250ZXh0CT0gKFBUWF9DT05URVhUKXBVcmItPmNvbnRleHQ7CisJcEFkCQkJPSBwUlRTQ29udGV4dC0+cEFkOworCVN0YXR1cwkJPSBwVXJiLT5zdGF0dXM7CisKKyNpZiAwIC8vIHNhbXBsZSwgSVJRIExPQ0sKKwkvLyBSZXNldCBSVFMgZnJhbWUgY29udGV4dCBmbGFncworCXBSVFNDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisJcFJUU0NvbnRleHQtPkluVXNlCQk9IEZBTFNFOworCisJaWYgKFN0YXR1cyA9PSBVU0JfU1RfTk9FUlJPUikKKwl7CisJCS8vIERvbid0IHdvcnJ5IGFib3V0IHRoZSBxdWV1ZSBpcyBlbXB0eSBvciBub3QsIHRoaXMgZnVuY3Rpb24gd2lsbCBjaGVjayBpdHNlbGYKKwkJLy9SVE1QVVNCRGVRdWV1ZVBhY2tldChwQWQsIHBSVFNDb250ZXh0LT5CdWxrT3V0UGlwZUlkKTsKKwkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBUUlVFLCBOVU1fT0ZfVFhfUklORywgTUFYX1RYX1BST0NFU1MpOworCX0KKwllbHNlCS8vIFNUQVRVU19PVEhFUgorCXsKKwkJaWYgKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKSkpCisJCXsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJCdWxrIE91dCBSVFMgRnJhbWUgRmFpbGVkXG4iKSk7CisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKTsKKwkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULCBOVUxMLCAwKTsKKwkJfQorCX0KKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbcFJUU0NvbnRleHQtPkJ1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisJcEFkLT5CdWxrT3V0UGVuZGluZ1twUlRTQ29udGV4dC0+QnVsa091dFBpcGVJZF0gPSBGQUxTRTsKKwlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbcFJUU0NvbnRleHQtPkJ1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisKKwkvLyBBbHdheXMgY2FsbCBCdWxrIHJvdXRpbmUsIGV2ZW4gcmVzZXQgYnVsay4KKwkvLyBUaGUgcHJvdGVjdGlvb24gb2YgcmVzdCBidWxrIHNob3VsZCBiZSBpbiBCdWxrT3V0IHJvdXRpbmUKKwlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisjZWxzZQorCisJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKwlwT2JqLT5ydHNfZnJhbWVfY29tcGxldGVfdGFzay5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFVyYjsKKwl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5ydHNfZnJhbWVfY29tcGxldGVfdGFzayk7CisjZW5kaWYKKworCURCR1BSSU5UX1JBVyhSVF9ERUJVR19JTkZPLCAoIjwtLS1SVFVTQkJ1bGtPdXRSVFNGcmFtZUNvbXBsZXRlXG4iKSk7CisKK30KKyNlbmRpZgorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6IE1MTUUgdXNlIEJ1bGtPdXRQaXBlSWQgPSAwCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUVVNCQnVsa091dE1MTUVQYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlJbmRleCkKK3sKKwlQVFhfQ09OVEVYVAkJcE1MTUVDb250ZXh0OworCVBVUkIJCQlwVXJiOworCWludAkJCQlyZXQgPSAwOworCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7CisKKwlwTUxNRUNvbnRleHQgPSAoUFRYX0NPTlRFWFQpcEFkLT5NZ210UmluZy5DZWxsW3BBZC0+TWdtdFJpbmcuVHhEbWFJZHhdLkFsbG9jVmE7CisJcFVyYiA9IHBNTE1FQ29udGV4dC0+cFVyYjsKKworCWlmICgocEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA+PSBNR01UX1JJTkdfU0laRSkgfHwKKwkJKHBNTE1FQ29udGV4dC0+SW5Vc2UgPT0gRkFMU0UpIHx8CisJCShwTUxNRUNvbnRleHQtPmJXYWl0aW5nQnVsa091dCA9PSBGQUxTRSkpCisJeworCisKKwkJLy8gQ2xlYXIgTUxNRSBidWxrIGZsYWcKKwkJUlRVU0JfQ0xFQVJfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX01MTUUpOworCisJCXJldHVybjsKKwl9CisKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbTUdNVFBJUEVJRFhdLCBJcnFGbGFncyk7CisJaWYgKChwQWQtPkJ1bGtPdXRQZW5kaW5nW01HTVRQSVBFSURYXSA9PSBUUlVFKSB8fCBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTkVFRF9TVE9QX1RYKSkKKwl7CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tNR01UUElQRUlEWF0sIElycUZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCXBBZC0+QnVsa091dFBlbmRpbmdbTUdNVFBJUEVJRFhdID0gVFJVRTsKKwlwQWQtPndhdGNoRG9nVHhQZW5kaW5nQ250W01HTVRQSVBFSURYXSA9IDE7CisJcE1MTUVDb250ZXh0LT5JUlBQZW5kaW5nID0gVFJVRTsKKwlwTUxNRUNvbnRleHQtPmJXYWl0aW5nQnVsa091dCA9IEZBTFNFOworCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tNR01UUElQRUlEWF0sIElycUZsYWdzKTsKKworCS8vIEluY3JlYXNlIFRvdGFsIHRyYW5zbWl0IGJ5dGUgY291bnRlcgorCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRCeXRlQ291bnQgKz0gIHBNTE1FQ29udGV4dC0+QnVsa091dFNpemU7CisKKwkvLyBDbGVhciBNTE1FIGJ1bGsgZmxhZworCVJUVVNCX0NMRUFSX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9NTE1FKTsKKworCisJLy9EQkdQUklOVF9SQVcoUlRfREVCVUdfSU5GTywgKCItLS0+UlRVU0JCdWxrT3V0TUxNRVBhY2tldFxuIikpOworI2lmIDAgLy8gZm9yIGRlYnVnCit7CisJcHJpbnRrKCJNTE1FLU91dCwgQz0lZCEsIEQ9JWQsIEY9JWQhXG4iLCBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4LCBwQWQtPk1nbXRSaW5nLlR4RG1hSWR4LCBwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4KTsKKworCS8vVE9ETzogTmVlZCB0byByZW1vdmUgaXQgd2hlbiBmb3JtYWwgcmVsZWFzZQorCVBUWElORk9fU1RSVUMgcFR4SW5mbzsKKworCXBUeEluZm8gPSAoUFRYSU5GT19TVFJVQylwTUxNRUNvbnRleHQtPlRyYW5zZmVyQnVmZmVyOworCWlmIChwVHhJbmZvLT5RU0VMICE9IEZJRk9fRURDQSkKKwl7CisJCQlwcmludGsoIiVzKCk6ID09PT0+IHBUeEluZm8tPlF1ZXVlU2VsKCVkKSE9IEZJRk9fRURDQSEhISFcbiIsIF9fZnVuY19fLCBwVHhJbmZvLT5RU0VMKTsKKwkJCXByaW50aygiXHRNTE1FX0luZGV4PSVkIVxuIiwgSW5kZXgpOworCQkJaGV4X2R1bXAoIldyb25nIFFTZWwgUGt0OiIsIChQVUNIQVIpcE1MTUVDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciwgcFR4SW5mby0+VVNCRE1BVHhQa3RMZW4pOworCX0KK30KKyNlbmRpZgorCisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcE1MTUVDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciwgVFlQRV9UWElORk8pOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKworCS8vIEluaXQgVHggY29udGV4dCBkZXNjcmlwdG9yCisJUlRVU0JJbml0VHhEZXNjKHBBZCwgcE1MTUVDb250ZXh0LCBNR01UUElQRUlEWCwgKHVzYl9jb21wbGV0ZV90KVJUVVNCQnVsa091dE1MTUVQYWNrZXRDb21wbGV0ZSk7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJLy9Gb3IgbWdtdCB1cmIgYnVmZmVyLCBiZWNhdXNlIHdlIHVzZSBza19idWZmLCBzbyB3ZSBuZWVkIHRvIG5vdGlmeSB0aGUgVVNCIGNvbnRyb2xsZXIgZG8gZG1hIG1hcHBpbmcuCisJcFVyYi0+dHJhbnNmZXJfZG1hCT0gMDsKKwlwVXJiLT50cmFuc2Zlcl9mbGFncyAmPSAoflVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQKTsKKyNlbmRpZgorCisJcFVyYiA9IHBNTE1FQ29udGV4dC0+cFVyYjsKKwlpZigocmV0ID0gUlRVU0JfU1VCTUlUX1VSQihwVXJiKSkhPTApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVFVTQkJ1bGtPdXRNTE1FUGFja2V0OiBTdWJtaXQgTUxNRSBVUkIgZmFpbGVkICVkXG4iLCByZXQpKTsKKwkJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tNR01UUElQRUlEWF0sIElycUZsYWdzKTsKKwkJcEFkLT5CdWxrT3V0UGVuZGluZ1tNR01UUElQRUlEWF0gPSBGQUxTRTsKKwkJcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFtNR01UUElQRUlEWF0gPSAwOworCQlwTUxNRUNvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwkJcE1MTUVDb250ZXh0LT5iV2FpdGluZ0J1bGtPdXQgPSBUUlVFOworCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbTUdNVFBJUEVJRFhdLCBJcnFGbGFncyk7CisKKwkJcmV0dXJuOworCX0KKworCS8vREJHUFJJTlRfUkFXKFJUX0RFQlVHX0lORk8sICgiPC0tLVJUVVNCQnVsa091dE1MTUVQYWNrZXQgXG4iKSk7CisvLwlwcmludGsoIjwtLS1SVFVTQkJ1bGtPdXRNTE1FUGFja2V0LENwdT0lZCEsIERtYT0lZCwgU3dJZHg9JWQhXG4iLCBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4LCBwQWQtPk1nbXRSaW5nLlR4RG1hSWR4LCBwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4KTsKK30KKworCitWT0lEIFJUVVNCQnVsa091dE1MTUVQYWNrZXRDb21wbGV0ZShwdXJiYl90IHBVcmIsIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKQoreworCVBUWF9DT05URVhUCQkJcE1MTUVDb250ZXh0OworCVBSVE1QX0FEQVBURVIJCXBBZDsKKwlOVFNUQVRVUwkJCVN0YXR1czsKKwlQT1NfQ09PS0lFIAkJCXBPYmo7CisJaW50CQkJCQlpbmRleDsKKyNpZiAwIC8vIHNhbXBsZSwgSVJRIExPQ0sKKwl1bnNpZ25lZCBsb25nCQlJcnFGbGFnczsKKwlQTkRJU19QQUNLRVQJCXBQYWNrZXQ7CisjZW5kaWYKKworCisJLy9EQkdQUklOVF9SQVcoUlRfREVCVUdfSU5GTywgKCItLS0+UlRVU0JCdWxrT3V0TUxNRVBhY2tldENvbXBsZXRlXG4iKSk7CisJcE1MTUVDb250ZXh0CT0gKFBUWF9DT05URVhUKXBVcmItPmNvbnRleHQ7CisJcEFkIAkJCT0gcE1MTUVDb250ZXh0LT5wQWQ7CisJcE9iaiAJCQk9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOworCVN0YXR1cwkJCT0gcFVyYi0+c3RhdHVzOworCWluZGV4IAkJCT0gcE1MTUVDb250ZXh0LT5TZWxmSWR4OworCisKKyNpZiAwIC8vIHNhbXBsZSwgSVJRIExPQ0sKKwlBU1NFUlQoKHBBZC0+TWdtdFJpbmcuVHhEbWFJZHggPT0gaW5kZXgpKTsKKwkvL3ByaW50aygiTUxNRS1Eb25lLUI6IEM9JWQsIEQ9JWQsIEY9JWQsIFNlbGY9JWQhXG4iLCBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4LCBwQWQtPk1nbXRSaW5nLlR4RG1hSWR4LCBwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4LCBwTUxNRUNvbnRleHQtPlNlbGZJZHgpOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tNR01UUElQRUlEWF0sIElycUZsYWdzKTsKKworCisJaWYgKFN0YXR1cyAhPSBVU0JfU1RfTk9FUlJPUikKKwl7CisJCS8vQnVsay1PdXQgZmFpbCBzdGF0dXMgaGFuZGxlCisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQorCQl7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsayBPdXQgTUxNRSBGYWlsZWQsIFN0YXR1cz0lZCFcbiIsIFN0YXR1cykpOworCQkJLy8gVE9ETzogSG93IHRvIGhhbmRsZSBhYm91dCB0aGUgTUxNRUJ1bGtPdXQgZmFpbGVkIGlzc3VlLiBOZWVkIHRvIHJlc2VuZCB0aGUgbWdtdCBwa3Q/CisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKTsKKwkJCXBBZC0+YnVsa1Jlc2V0UGlwZWlkID0gKE1HTVRQSVBFSURYIHwgQlVMS09VVF9NR01UX1JFU0VUX0ZMQUcpOworCQl9CisJfQorCXBBZC0+QnVsa091dFBlbmRpbmdbTUdNVFBJUEVJRFhdID0gRkFMU0U7CisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW01HTVRQSVBFSURYXSwgSXJxRmxhZ3MpOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5NTE1FQnVsa091dExvY2ssIElycUZsYWdzKTsKKwkvLyBSZXNldCBNTE1FIGNvbnRleHQgZmxhZ3MKKwlwTUxNRUNvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwlwTUxNRUNvbnRleHQtPkluVXNlID0gRkFMU0U7CisJcE1MTUVDb250ZXh0LT5iV2FpdGluZ0J1bGtPdXQgPSBGQUxTRTsKKwlwTUxNRUNvbnRleHQtPkJ1bGtPdXRTaXplID0gMDsKKworCXBQYWNrZXQgPSBwQWQtPk1nbXRSaW5nLkNlbGxbaW5kZXhdLnBOZGlzUGFja2V0OworCXBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0ucE5kaXNQYWNrZXQgPSBOVUxMOworCisJLy8gSW5jcmVhc2UgTWdtdFJpbmcgSW5kZXgKKwlJTkNfUklOR19JTkRFWChwQWQtPk1nbXRSaW5nLlR4RG1hSWR4LCBNR01UX1JJTkdfU0laRSk7CisJcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCsrOworCisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPk1MTUVCdWxrT3V0TG9jaywgSXJxRmxhZ3MpOworCisJLy8gTm8tbWF0dGVyIHN1Y2Nlc3Mgb3IgZmFpbCwgd2UgZnJlZSB0aGUgbWdtdCBwYWNrZXQuCisJaWYgKHBQYWNrZXQpCisJCVJUTVBGcmVlTmRpc1BhY2tldChwQWQsIHBQYWNrZXQpOworCisjaWYgMAorCS8vQnVsay1PdXQgZmFpbCBzdGF0dXMgaGFuZGxlCisJaWYgKFN0YXR1cyAhPSBVU0JfU1RfTk9FUlJPUikKKwl7CisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQorCQl7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsayBPdXQgTUxNRSBGYWlsZWQsIFN0YXR1cz0lZCFcbiIsIFN0YXR1cykpOworCQkJLy8gVE9ETzogSG93IHRvIGhhbmRsZSBhYm91dCB0aGUgTUxNRUJ1bGtPdXQgZmFpbGVkIGlzc3VlLiBOZWVkIHRvIHJlc2V0IHRoZSBlbmRwb2ludD8KKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpOworCQkJcEFkLT5idWxrUmVzZXRQaXBlaWQgPSAoTUdNVFBJUEVJRFggfCBCVUxLT1VUX01HTVRfUkVTRVRfRkxBRyk7CisJCX0KKwl9CisjZW5kaWYKKworCS8vcHJpbnRrKCJNTE1FLURvbmUtQTogQz0lZCwgRD0lZCwgRj0lZCFcbiIsIHBBZC0+TWdtdFJpbmcuVHhDcHVJZHgsIHBBZC0+TWdtdFJpbmcuVHhEbWFJZHgsIHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHgpOworCisJcE9iai0+bWdtdF9kbWFfZG9uZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwQWQ7CisJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+bWdtdF9kbWFfZG9uZV90YXNrKTsKKworCS8vREJHUFJJTlRfUkFXKFJUX0RFQlVHX0lORk8sICgiPC0tLVJUVVNCQnVsa091dE1MTUVQYWNrZXRDb21wbGV0ZVxuIikpOworLy8JcHJpbnRrKCI8LS0tUlRVU0JCdWxrT3V0TUxNRVBhY2tldENvbXBsZXRlLCBDcHU9JWQsIERtYT0lZCwgU3dJZHg9JWQhXG4iLAorLy8JCQkJcEFkLT5NZ210UmluZy5UeENwdUlkeCwgcEFkLT5NZ210UmluZy5UeERtYUlkeCwgcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCk7CisKKyNlbHNlCisKKwlwT2JqLT5tZ210X2RtYV9kb25lX3Rhc2suZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBVcmI7CisJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+bWdtdF9kbWFfZG9uZV90YXNrKTsKKyNlbmRpZgorfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZTogUHNQb2xsIHVzZSBCdWxrT3V0UGlwZUlkID0gMAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVFVTQkJ1bGtPdXRQc1BvbGwoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJUFRYX0NPTlRFWFQJCXBQc1BvbGxDb250ZXh0ID0gJihwQWQtPlBzUG9sbENvbnRleHQpOworCVBVUkIJCQlwVXJiOworCWludAkJCQlyZXQgPSAwOworCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7CisKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBJcnFGbGFncyk7CisJaWYgKChwQWQtPkJ1bGtPdXRQZW5kaW5nWzBdID09IFRSVUUpIHx8IFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9ORUVEX1NUT1BfVFgpKQorCXsKKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBJcnFGbGFncyk7CisJCXJldHVybjsKKwl9CisJcEFkLT5CdWxrT3V0UGVuZGluZ1swXSA9IFRSVUU7CisJcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFswXSA9IDE7CisJcFBzUG9sbENvbnRleHQtPklSUFBlbmRpbmcgPSBUUlVFOworCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgSXJxRmxhZ3MpOworCisKKwkvLyBDbGVhciBQUy1Qb2xsIGJ1bGsgZmxhZworCVJUVVNCX0NMRUFSX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9QU1BPTEwpOworCisjaWZkZWYgUlRfQklHX0VORElBTgorCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFBzUG9sbENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLCBUWVBFX1RYSU5GTyk7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCisJLy8gSW5pdCBUeCBjb250ZXh0IGRlc2NyaXB0b3IKKwlSVFVTQkluaXRUeERlc2MocEFkLCBwUHNQb2xsQ29udGV4dCwgTUdNVFBJUEVJRFgsICh1c2JfY29tcGxldGVfdClSVFVTQkJ1bGtPdXRQc1BvbGxDb21wbGV0ZSk7CisKKwlwVXJiID0gcFBzUG9sbENvbnRleHQtPnBVcmI7CisJaWYoKHJldCA9IFJUVVNCX1NVQk1JVF9VUkIocFVyYikpIT0wKQorCXsKKwkJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgSXJxRmxhZ3MpOworCQlwQWQtPkJ1bGtPdXRQZW5kaW5nWzBdID0gRkFMU0U7CisJCXBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbMF0gPSAwOworCQlwUHNQb2xsQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIElycUZsYWdzKTsKKworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVFVTQkJ1bGtPdXRQc1BvbGw6IFN1Ym1pdCBUeCBVUkIgZmFpbGVkICVkXG4iLCByZXQpKTsKKwkJcmV0dXJuOworCX0KKworfQorCisvLyBQUy1Qb2xsIGZyYW1lIHVzZSBCdWxrT3V0UGlwZUlkID0gMAorVk9JRCBSVFVTQkJ1bGtPdXRQc1BvbGxDb21wbGV0ZShwdXJiYl90IHBVcmIsc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpCit7CisJUFJUTVBfQURBUFRFUgkJcEFkOworCVBUWF9DT05URVhUCQkJcFBzUG9sbENvbnRleHQ7CisJTlRTVEFUVVMJCQlTdGF0dXM7CisjaWYgMCAvLyBzYW1wbGUsIElSUSBMT0NLCisJdW5zaWduZWQgbG9uZwkJSXJxRmxhZ3M7CisjZW5kaWYKKwlQT1NfQ09PS0lFCQkJcE9iajsKKworCisJcFBzUG9sbENvbnRleHQ9IChQVFhfQ09OVEVYVClwVXJiLT5jb250ZXh0OworCXBBZCA9IHBQc1BvbGxDb250ZXh0LT5wQWQ7CisJU3RhdHVzID0gcFVyYi0+c3RhdHVzOworCisjaWYgMCAvLyBzYW1wbGUsIElSUSBMT0NLCisJLy8gUmVzZXQgUHNQb2xsIGNvbnRleHQgZmxhZ3MKKwlwUHNQb2xsQ29udGV4dC0+SVJQUGVuZGluZwk9IEZBTFNFOworCXBQc1BvbGxDb250ZXh0LT5JblVzZQkJPSBGQUxTRTsKKworCWlmIChTdGF0dXMgPT0gVVNCX1NUX05PRVJST1IpCisJeworCQkvLyBEb24ndCB3b3JyeSBhYm91dCB0aGUgcXVldWUgaXMgZW1wdHkgb3Igbm90LCB0aGlzIGZ1bmN0aW9uIHdpbGwgY2hlY2sgaXRzZWxmCisJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgVFJVRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKKwl9CisJZWxzZSAvLyBTVEFUVVNfT1RIRVIKKwl7CisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKQorCQl7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsayBPdXQgUFNQb2xsIEZhaWxlZFxuIikpOworCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCk7CisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCwgTlVMTCwgMCk7CisJCX0KKwl9CisKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBJcnFGbGFncyk7CisJcEFkLT5CdWxrT3V0UGVuZGluZ1swXSA9IEZBTFNFOworCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgSXJxRmxhZ3MpOworCisJLy8gQWx3YXlzIGNhbGwgQnVsayByb3V0aW5lLCBldmVuIHJlc2V0IGJ1bGsuCisJLy8gVGhlIHByb3RlY3Rpb29uIG9mIHJlc3QgYnVsayBzaG91bGQgYmUgaW4gQnVsa091dCByb3V0aW5lCisJUlRVU0JLaWNrQnVsa091dChwQWQpOworI2Vsc2UKKworCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisJcE9iai0+cHNwb2xsX2ZyYW1lX2NvbXBsZXRlX3Rhc2suZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBVcmI7CisJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+cHNwb2xsX2ZyYW1lX2NvbXBsZXRlX3Rhc2spOworI2VuZGlmCit9CisKKworI2lmIDAKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCVVTQl9SeFBhY2tldCBpbml0aWFsaXplcyBhIFVSQiBhbmQgdXNlcyB0aGUgUnggSVJQIHRvIHN1Ym1pdCBpdAorCXRvIFVTQi4gSXQgY2hlY2tzIGlmIGFuIFJ4IERlc2NyaXB0b3IgaXMgYXZhaWxhYmxlIGFuZCBwYXNzZXMgdGhlCisJdGhlIGNvcmVzcG9uZGluZyBidWZmZXIgdG8gYmUgZmlsbGVkLiBJZiBubyBkZXNjcmlwdG9yIGlzIGF2YWlsYWJsZQorCWZhaWxzIHRoZSByZXF1ZXN0LiBXaGVuIHNldHRpbmcgdGhlIGNvbXBsZXRpb24gcm91dGluZSB3ZSBwYXNzIG91cgorCUFkYXB0ZXIgT2JqZWN0IGFzIENvbnRleHQuCisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisJCVRSVUUJCQlmb3VuZCBtYXRjaGVkIHR1cGxlIGNhY2hlCisJCUZBTFNFCQkJbm8gbWF0Y2hlZCBmb3VuZAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRVU0JCdWxrUmVjZWl2ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlQUlhfQ09OVEVYVAkJcFJ4Q29udGV4dDsKKwlQVVJCCQkJcFVyYjsKKwlpbnQJCQkJcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nCUlycUZsYWdzOworCisKKwkvKiBkZXZpY2UgaGFkIGJlZW4gY2xvc2VkICovCisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRU1PVkVfSU5fUFJPR1JFU1MpKQorCQlyZXR1cm47CisKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKworCS8vIExhc3QgaXMgdGltZSBwb2ludCBiZXR3ZWVuIDIgc2VwYXJhdGUgVVJCLgorCWlmIChwQWQtPk5leHRSeEJ1bGtJblBvc2l0aW9uID09IDApCisJeworCQkvL3BBZC0+TmV4dFJ4QnVsa0luSW5kZXggPSAocEFkLT5OZXh0UnhCdWxrSW5JbmRleCArIDEpICUgKFJYX1JJTkdfU0laRSk7CisJCUlOQ19SSU5HX0lOREVYKHBBZC0+TmV4dFJ4QnVsa0luSW5kZXgsIFJYX1JJTkdfU0laRSk7CisJfQorCWVsc2UgaWYgKChwQWQtPk5leHRSeEJ1bGtJblBvc2l0aW9uJjB4MWZmKSAhPSAwKQorCXsKKwkJLy9wQWQtPk5leHRSeEJ1bGtJbkluZGV4ID0gKHBBZC0+TmV4dFJ4QnVsa0luSW5kZXggKyAxKSAlIChSWF9SSU5HX1NJWkUpOworCQlJTkNfUklOR19JTkRFWChwQWQtPk5leHRSeEJ1bGtJbkluZGV4LCBSWF9SSU5HX1NJWkUpOworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgicEFkLT5OZXh0UnhCdWxrSW5Qb3NpdGlvbiA9IDB4JWx4LiAgRW5kIG9mIFVSQi5cbiIsIHBBZC0+TmV4dFJ4QnVsa0luUG9zaXRpb24gKSk7CisJCXBBZC0+TmV4dFJ4QnVsa0luUG9zaXRpb24gPSAwOworCX0KKworCWlmIChwQWQtPk5leHRSeEJ1bGtJblBvc2l0aW9uID09IE1BWF9SWEJVTEtfU0laRSkKKwkJcEFkLT5OZXh0UnhCdWxrSW5Qb3NpdGlvbiA9IDA7CisKKwlwUnhDb250ZXh0ID0gJihwQWQtPlJ4Q29udGV4dFtwQWQtPk5leHRSeEJ1bGtJbkluZGV4XSk7CisKKwkvLyBUT0RPOiBXaHkgbmVlZCB0byBjaGVjayBpZiBwUnhDb250ZXh0LT5JblVzZWQgPT0gVFJVRT8KKwkvL2lmICgocFJ4Q29udGV4dC0+SW5Vc2UgPT0gVFJVRSkgfHwgKHBSeENvbnRleHQtPlJlYWRhYmxlID09IFRSVUUpKQorCWlmICgocFJ4Q29udGV4dC0+SW5Vc2UgPT0gRkFMU0UpICYmIChwUnhDb250ZXh0LT5SZWFkYWJsZSA9PSBUUlVFKSkKKwl7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJwUnhDb250ZXh0WyVkXSBJblVzZSA9ICVkLnBSeENvbnRleHQtPlJlYWRhYmxlID0gJWQuICBSZXR1cm4uXG4iLCBwQWQtPk5leHRSeEJ1bGtJbkluZGV4LHBSeENvbnRleHQtPkluVXNlLCBwUnhDb250ZXh0LT5SZWFkYWJsZSApKTsKKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKworCQkvLyByZWFkIFJ4Q29udGV4dCwgU2luY2Ugbm90CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCVNUQVJ4RG9uZUludGVycnVwdEhhbmRsZShwQWQsIFRSVUUpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCS8vcmV0dXJuOworCX0KKwlwUnhDb250ZXh0LT5JblVzZSA9IFRSVUU7CisJcFJ4Q29udGV4dC0+SVJQUGVuZGluZz0gVFJVRTsKKworCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisKKwkvLyBJbml0IFJ4IGNvbnRleHQgZGVzY3JpcHRvcgorCU5kaXNaZXJvTWVtb3J5KHBSeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLCBCVUZGRVJfU0laRSk7CisJUlRVU0JJbml0UnhEZXNjKHBBZCwgcFJ4Q29udGV4dCk7CisKKwlwVXJiID0gcFJ4Q29udGV4dC0+cFVyYjsKKwlpZiAoKHJldCA9IFJUVVNCX1NVQk1JVF9VUkIocFVyYikpIT0wKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRVU0JCdWxrUmVjZWl2ZTogU3VibWl0IFJ4IFVSQiBmYWlsZWQgJWRcbiIsIHJldCkpOworCQlyZXR1cm47CisJfQorCWVsc2UgLy8gc3VjY2VzcworCXsKKwkJTmRpc0ludGVybG9ja2VkSW5jcmVtZW50KCZwQWQtPlBlbmRpbmdSeCk7CisJCXBBZC0+QnVsa0luUmVxKys7CisJfQorCisJLy8gcmVhZCBSeENvbnRleHQsIFNpbmNlIG5vdAorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCVNUQVJ4RG9uZUludGVycnVwdEhhbmRsZShwQWQsIEZBTFNFKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVRoaXMgcm91dGluZSBwcm9jZXNzIFJ4IElycCBhbmQgY2FsbCByeCBjb21wbGV0ZSBmdW5jdGlvbi4KKworCUFyZ3VtZW50czoKKwkJRGV2aWNlT2JqZWN0CVBvaW50ZXIgdG8gdGhlIGRldmljZSBvYmplY3QgZm9yIG5leHQgbG93ZXIKKwkJCQkJCWRldmljZS4gRGV2aWNlT2JqZWN0IHBhc3NlZCBpbiBoZXJlIGJlbG9uZ3MgdG8KKwkJCQkJCXRoZSBuZXh0IGxvd2VyIGRyaXZlciBpbiB0aGUgc3RhY2sgYmVjYXVzZSB3ZQorCQkJCQkJd2VyZSBpbnZva2VkIHZpYSBJb0NhbGxEcml2ZXIgaW4gVVNCX1J4UGFja2V0CisJCQkJCQlBTkQgaXQgaXMgbm90IE9VUiBkZXZpY2Ugb2JqZWN0CisJICBJcnAJCQkJUHRyIHRvIGNvbXBsZXRlZCBJUlAKKwkgIENvbnRleHQJCQlQdHIgdG8gb3VyIEFkYXB0ZXIgb2JqZWN0IChjb250ZXh0IHNwZWNpZmllZAorCQkJCQkJaW4gSW9TZXRDb21wbGV0aW9uUm91dGluZQorCisJUmV0dXJuIFZhbHVlOgorCQlBbHdheXMgcmV0dXJucyBTVEFUVVNfTU9SRV9QUk9DRVNTSU5HX1JFUVVJUkVECisKKwlOb3RlOgorCQlBbHdheXMgcmV0dXJucyBTVEFUVVNfTU9SRV9QUk9DRVNTSU5HX1JFUVVJUkVECisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVFVTQkJ1bGtSeENvbXBsZXRlKHB1cmJiX3QgcFVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpCit7CisjaWYgMAorCVBSWF9DT05URVhUCQkJcFJ4Q29udGV4dDsKKwlQUlRNUF9BREFQVEVSCQlwQWQ7CisJTlRTVEFUVVMJCQlTdGF0dXM7CisvLwlQT1NfQ09PS0lFCQkJcE9iajsKKworCXBSeENvbnRleHQJPSAoUFJYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKKwlwQWQgCQk9IHBSeENvbnRleHQtPnBBZDsKKy8vCXBPYmoJCT0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisKKwlTdGF0dXMgPSBwVXJiLT5zdGF0dXM7CisJLy9wUnhDb250ZXh0LT5wSXJwID0gTlVMTDsKKworCXBSeENvbnRleHQtPkluVXNlID0gRkFMU0U7CisJcFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCisJaWYgKFN0YXR1cyA9PSBVU0JfU1RfTk9FUlJPUikKKwl7CisJCXBBZC0+QnVsa0luQ29tcGxldGUrKzsKKwkJcFJ4Q29udGV4dC0+UmVhZGFibGUgPSBUUlVFOworCQlwQWQtPk5leHRSeEJ1bGtJblBvc2l0aW9uID0gMDsKKworCX0KKwllbHNlCSAvLyBTVEFUVVNfT1RIRVIKKwl7CisJCXBBZC0+QnVsa0luQ29tcGxldGVGYWlsKys7CisJCS8vIFN0aWxsIHJlYWQgdGhpcyBwYWNrZXQgYWx0aG91Z2ggaXQgbWF5IGNvbXRhaW4gd3JvbmcgYnl0ZXMuCisJCXBSeENvbnRleHQtPlJlYWRhYmxlID0gRkFMU0U7CisJCS8vIFBhcnNpbmcgYWxsIHBhY2tldHMuIGJlY2F1c2UgYWZ0ZXIgcmVzZXQsIHRoZSBpbmRleCB3aWxsIHJlc2V0IHRvIGFsbCB6ZXJvLgorCisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLSU5fUkVTRVQpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCisJCXsKKworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIkJ1bGsgSW4gRmFpbGVkLiBTdGF0dXMgPSAlZFxuIiwgU3RhdHVzKSk7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiPT0+TmV4dFJ4QnVsa0luSW5kZXg9MHgleCwgTmV4dFJ4QnVsa0luUmVhZEluZGV4PTB4JXgsIFRyYW5zZmVyQnVmZmVyTGVuZ3RoPSAweCV4XG4iLAorCQkJCXBBZC0+TmV4dFJ4QnVsa0luSW5kZXgsIHBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4LCBwUnhDb250ZXh0LT5wVXJiLT5hY3R1YWxfbGVuZ3RoKSk7CisKKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtJTl9SRVNFVCk7CisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX0lOLCBOVUxMLCAwKTsKKwkJfQorCQkvL3BVcmIgPSBOVUxMOworCX0KKworCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCisJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtJTl9SRVNFVCkpICYmCisvLwkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpICYmCisJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpICYmCisJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKSAmJgorCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCisJeworCQlSVFVTQkJ1bGtSZWNlaXZlKHBBZCk7CisjaWYgMAorI2lmIDEKKwkJU1RBUnhEb25lSW50ZXJydXB0SGFuZGxlKHBBZCwgRkFMU0UpOworI2Vsc2UKKwkJcE9iai0+cnhfYmguZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBVcmI7CisJCXRhc2tsZXRfc2NoZWR1bGUoJnBPYmotPnJ4X2JoKTsKKyNlbmRpZgorI2VuZGlmCisJfQorCisJLy8gQ2FsbCBSeFBhY2tldCB0byBwcm9jZXNzIHBhY2tldCBhbmQgcmV0dXJuIHRoZSBzdGF0dXMKKwlOZGlzSW50ZXJsb2NrZWREZWNyZW1lbnQoJnBBZC0+UGVuZGluZ1J4KTsKKyNlbHNlCisKKworCS8vIHVzZSBhIHJlY2VpdmUgdGFza2xldCB0byBoYW5kbGUgcmVjZWl2ZWQgcGFja2V0czsKKwkvLyBvciBzb21ldGltZXMgaGFyZHdhcmUgSVJRIHdpbGwgYmUgZGlzYWJsZWQgaGVyZSwgc28gd2UgY2FuIG5vdAorCS8vIHVzZSBzcGluX2xvY2tfYmgoKS9zcGluX3VubG9ja19iaCgpIGFmdGVyIElSUSBpcyBkaXNhYmxlZC4gOjwKKwlQUlhfQ09OVEVYVAkJcFJ4Q29udGV4dDsKKwlQUlRNUF9BREFQVEVSCXBBZDsKKwlQT1NfQ09PS0lFIAkJcE9iajsKKworCisJcFJ4Q29udGV4dAk9IChQUlhfQ09OVEVYVClwVXJiLT5jb250ZXh0OworCXBBZCAJCT0gcFJ4Q29udGV4dC0+cEFkOworCXBPYmogCQk9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKworCXBPYmotPnJ4X2RvbmVfdGFzay5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFVyYjsKKwl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5yeF9kb25lX3Rhc2spOworI2VuZGlmCit9CisKKyNlbHNlCisKK1ZPSUQgRG9CdWxrSW4oSU4gUlRNUF9BREFQVEVSICpwQWQpCit7CisJUFJYX0NPTlRFWFQJCXBSeENvbnRleHQ7CisJUFVSQgkJCXBVcmI7CisJaW50CQkJCXJldCA9IDA7CisJdW5zaWduZWQgbG9uZwlJcnFGbGFnczsKKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOworCXBSeENvbnRleHQgPSAmKHBBZC0+UnhDb250ZXh0W3BBZC0+TmV4dFJ4QnVsa0luSW5kZXhdKTsKKwlpZiAoKHBBZC0+UGVuZGluZ1J4ID4gMCkgfHwgKHBSeENvbnRleHQtPlJlYWRhYmxlID09IFRSVUUpIHx8IChwUnhDb250ZXh0LT5JblVzZSA9PSBUUlVFKSkKKwl7CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisJCXJldHVybjsKKwl9CisJcFJ4Q29udGV4dC0+SW5Vc2UgPSBUUlVFOworCXBSeENvbnRleHQtPklSUFBlbmRpbmcgPSBUUlVFOworCXBBZC0+UGVuZGluZ1J4Kys7CisJcEFkLT5CdWxrSW5SZXErKzsKKwlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOworCisJLy8gSW5pdCBSeCBjb250ZXh0IGRlc2NyaXB0b3IKKwlOZGlzWmVyb01lbW9yeShwUnhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciwgcFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0KTsKKwlSVFVTQkluaXRSeERlc2MocEFkLCBwUnhDb250ZXh0KTsKKworCXBVcmIgPSBwUnhDb250ZXh0LT5wVXJiOworCWlmICgocmV0ID0gUlRVU0JfU1VCTUlUX1VSQihwVXJiKSkhPTApCisJewkvLyBmYWlsCisKKwkJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisJCXBSeENvbnRleHQtPkluVXNlID0gRkFMU0U7CisJCXBSeENvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwkJcEFkLT5QZW5kaW5nUngtLTsKKwkJcEFkLT5CdWxrSW5SZXEtLTsKKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRVU0JCdWxrUmVjZWl2ZTogU3VibWl0IFJ4IFVSQiBmYWlsZWQgJWRcbiIsIHJldCkpOworCX0KKwllbHNlCisJewkvLyBzdWNjZXNzCisjaWYgMAorCQlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKwkJcFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9IFRSVUU7CisJCS8vTmRpc0ludGVybG9ja2VkSW5jcmVtZW50KCZwQWQtPlBlbmRpbmdSeCk7CisJCXBBZC0+UGVuZGluZ1J4Kys7CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisJCXBBZC0+QnVsa0luUmVxKys7CisjZW5kaWYKKwkJQVNTRVJUKChwUnhDb250ZXh0LT5JblVzZSA9PSBwUnhDb250ZXh0LT5JUlBQZW5kaW5nKSk7CisJCS8vcHJpbnRrKCJCSURvbmUsIFBlbmQ9JWQsQklJZHg9JWQsQklSSWR4PSVkIVxuIiwgcEFkLT5QZW5kaW5nUngsIHBBZC0+TmV4dFJ4QnVsa0luSW5kZXgsIHBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4KTsKKwl9Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJVVNCX1J4UGFja2V0IGluaXRpYWxpemVzIGEgVVJCIGFuZCB1c2VzIHRoZSBSeCBJUlAgdG8gc3VibWl0IGl0CisJdG8gVVNCLiBJdCBjaGVja3MgaWYgYW4gUnggRGVzY3JpcHRvciBpcyBhdmFpbGFibGUgYW5kIHBhc3NlcyB0aGUKKwl0aGUgY29yZXNwb25kaW5nIGJ1ZmZlciB0byBiZSBmaWxsZWQuIElmIG5vIGRlc2NyaXB0b3IgaXMgYXZhaWxhYmxlCisJZmFpbHMgdGhlIHJlcXVlc3QuIFdoZW4gc2V0dGluZyB0aGUgY29tcGxldGlvbiByb3V0aW5lIHdlIHBhc3Mgb3VyCisJQWRhcHRlciBPYmplY3QgYXMgQ29udGV4dC4KKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKwkJVFJVRQkJCWZvdW5kIG1hdGNoZWQgdHVwbGUgY2FjaGUKKwkJRkFMU0UJCQlubyBtYXRjaGVkIGZvdW5kCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworI2RlZmluZSBmUlRNUF9BREFQVEVSX05FRURfU1RPUF9SWAkJXAorCQkoZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUIHwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwJXAorCQkgZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwgXAorCQkgZlJUTVBfQURBUFRFUl9SRU1PVkVfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX0JVTEtJTl9SRVNFVCkKKworI2RlZmluZSBmUlRNUF9BREFQVEVSX05FRURfU1RPUF9IQU5ETEVfUlgJXAorCQkoZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUIHwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwJXAorCQkgZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwgXAorCQkgZlJUTVBfQURBUFRFUl9SRU1PVkVfSU5fUFJPR1JFU1MpCisKK1ZPSUQJUlRVU0JCdWxrUmVjZWl2ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlQUlhfQ09OVEVYVAkJcFJ4Q29udGV4dDsKKwl1bnNpZ25lZCBsb25nCUlycUZsYWdzOworCisKKwkvKiBzYW5pdHkgY2hlY2sgKi8KKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05FRURfU1RPUF9IQU5ETEVfUlgpKQorCQlyZXR1cm47CisKKwl3aGlsZSgxKQorCXsKKworCQlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKwkJcFJ4Q29udGV4dCA9ICYocEFkLT5SeENvbnRleHRbcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXhdKTsKKwkJaWYgKCgocFJ4Q29udGV4dC0+SW5Vc2UgPT0gRkFMU0UpICYmIChwUnhDb250ZXh0LT5SZWFkYWJsZSA9PSBUUlVFKSkgJiYKKwkJCShwUnhDb250ZXh0LT5iUnhIYW5kbGluZyA9PSBGQUxTRSkpCisJCXsKKwkJCXBSeENvbnRleHQtPmJSeEhhbmRsaW5nID0gVFJVRTsKKwkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisKKwkJCS8vIHJlYWQgUnhDb250ZXh0LCBTaW5jZSBub3QKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJU1RBUnhEb25lSW50ZXJydXB0SGFuZGxlKHBBZCwgVFJVRSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkJCS8vIEZpbmlzaCB0byBoYW5kbGUgdGhpcyBidWxrSW4gYnVmZmVyLgorCQkJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisJCQlwUnhDb250ZXh0LT5CdWxrSW5PZmZzZXQgPSAwOworCQkJcFJ4Q29udGV4dC0+UmVhZGFibGUgPSBGQUxTRTsKKwkJCXBSeENvbnRleHQtPmJSeEhhbmRsaW5nID0gRkFMU0U7CisJCQlwQWQtPlJlYWRQb3NpdGlvbiA9IDA7CisJCQlwQWQtPlRyYW5zZmVyQnVmZmVyTGVuZ3RoID0gMDsKKwkJCUlOQ19SSU5HX0lOREVYKHBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4LCBSWF9SSU5HX1NJWkUpOworCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKworCQl9CisJCWVsc2UKKwkJeworCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCEoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05FRURfU1RPUF9SWCkpKQorCQlEb0J1bGtJbihwQWQpOworCit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVRoaXMgcm91dGluZSBwcm9jZXNzIFJ4IElycCBhbmQgY2FsbCByeCBjb21wbGV0ZSBmdW5jdGlvbi4KKworCUFyZ3VtZW50czoKKwkJRGV2aWNlT2JqZWN0CVBvaW50ZXIgdG8gdGhlIGRldmljZSBvYmplY3QgZm9yIG5leHQgbG93ZXIKKwkJCQkJCWRldmljZS4gRGV2aWNlT2JqZWN0IHBhc3NlZCBpbiBoZXJlIGJlbG9uZ3MgdG8KKwkJCQkJCXRoZSBuZXh0IGxvd2VyIGRyaXZlciBpbiB0aGUgc3RhY2sgYmVjYXVzZSB3ZQorCQkJCQkJd2VyZSBpbnZva2VkIHZpYSBJb0NhbGxEcml2ZXIgaW4gVVNCX1J4UGFja2V0CisJCQkJCQlBTkQgaXQgaXMgbm90IE9VUiBkZXZpY2Ugb2JqZWN0CisJICBJcnAJCQkJUHRyIHRvIGNvbXBsZXRlZCBJUlAKKwkgIENvbnRleHQJCQlQdHIgdG8gb3VyIEFkYXB0ZXIgb2JqZWN0IChjb250ZXh0IHNwZWNpZmllZAorCQkJCQkJaW4gSW9TZXRDb21wbGV0aW9uUm91dGluZQorCisJUmV0dXJuIFZhbHVlOgorCQlBbHdheXMgcmV0dXJucyBTVEFUVVNfTU9SRV9QUk9DRVNTSU5HX1JFUVVJUkVECisKKwlOb3RlOgorCQlBbHdheXMgcmV0dXJucyBTVEFUVVNfTU9SRV9QUk9DRVNTSU5HX1JFUVVJUkVECisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVFVTQkJ1bGtSeENvbXBsZXRlKHB1cmJiX3QgcFVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpCit7CisJLy8gdXNlIGEgcmVjZWl2ZSB0YXNrbGV0IHRvIGhhbmRsZSByZWNlaXZlZCBwYWNrZXRzOworCS8vIG9yIHNvbWV0aW1lcyBoYXJkd2FyZSBJUlEgd2lsbCBiZSBkaXNhYmxlZCBoZXJlLCBzbyB3ZSBjYW4gbm90CisJLy8gdXNlIHNwaW5fbG9ja19iaCgpL3NwaW5fdW5sb2NrX2JoKCkgYWZ0ZXIgSVJRIGlzIGRpc2FibGVkLiA6PAorCVBSWF9DT05URVhUCQlwUnhDb250ZXh0OworCVBSVE1QX0FEQVBURVIJcEFkOworCVBPU19DT09LSUUgCQlwT2JqOworCisKKwlwUnhDb250ZXh0CT0gKFBSWF9DT05URVhUKXBVcmItPmNvbnRleHQ7CisJcEFkIAkJPSBwUnhDb250ZXh0LT5wQWQ7CisJcE9iaiAJCT0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisJcE9iai0+cnhfZG9uZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVXJiOworCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPnJ4X2RvbmVfdGFzayk7CisKK30KKworI2VuZGlmCisKKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUVVNCS2lja0J1bGtPdXQoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQpCit7CisJLy8gQnVsa0luIFJlc2V0IHdpbGwgcmVzZXQgd2hvbGUgVVNCIFBIWS4gU28gd2UgbmVlZCB0byBtYWtlIHN1cmUgZlJUTVBfQURBUFRFUl9CVUxLSU5fUkVTRVQgbm90IGZsYWdlZC4KKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCAsZlJUTVBfQURBUFRFUl9ORUVEX1NUT1BfVFgpCisjaWZkZWYgUkFMSU5LX0FURQorCQkmJiAhKEFURV9PTihwQWQpKQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwkJKQorCXsKKyNpZiAwCS8vIG5vdCB1c2VkIG5vdyBpbiBSVDI4eHgsIGJ1dCBtYXkgdXNlZCBsYXR0ZXIuCisJCS8vIDEuIERhdGEgRnJhZ21lbnQgaGFzIGhpZ2hlc3QgcHJpb3JpdHkKKwkJaWYgKFJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfRlJBRykpCisJCXsKKwkJCWlmICgoKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKSB8fAorCQkJCSghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQorCQkJCSkpCisJCQl7CisJCQkJUlRVU0JCdWxrT3V0RGF0YVBhY2tldChwQWQsIDAsIHBBZC0+TmV4dEJ1bGtPdXRJbmRleFswXSk7CisJCQl9CisJCX0KKwkJaWYgKFJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfRlJBR18yKSkKKwkJeworCQkJaWYgKCgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpIHx8CisJCQkJKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJCQkJKSkKKwkJCXsKKwkJCQlSVFVTQkJ1bGtPdXREYXRhUGFja2V0KHBBZCwgMSwgcEFkLT5OZXh0QnVsa091dEluZGV4WzFdKTsKKwkJCX0KKwkJfQorCQlpZiAoUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHXzMpKQorCQl7CisJCQlpZiAoKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgfHwKKwkJCQkoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwkJCQkpKQorCQkJeworCQkJCVJUVVNCQnVsa091dERhdGFQYWNrZXQocEFkLCAyLCBwQWQtPk5leHRCdWxrT3V0SW5kZXhbMl0pOworCQkJfQorCQl9CisJCWlmIChSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX0ZSQUdfNCkpCisJCXsKKwkJCWlmICgoKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKSB8fAorCQkJCSghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQorCQkJCSkpCisJCQl7CisJCQkJUlRVU0JCdWxrT3V0RGF0YVBhY2tldChwQWQsIDMsIHBBZC0+TmV4dEJ1bGtPdXRJbmRleFszXSk7CisJCQl9CisJCX0KKyNlbmRpZgorCisJCS8vIDIuIFBTLVBvbGwgZnJhbWUgaXMgbmV4dAorCQlpZiAoUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfUFNQT0xMKSkKKwkJeworCQkJUlRVU0JCdWxrT3V0UHNQb2xsKHBBZCk7CisJCX0KKworCQkvLyA1LiBNbG1lIGZyYW1lIGlzIG5leHQKKwkJZWxzZSBpZiAoKFJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX01MTUUpKSAmJgorCQkJCSAocEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA8IE1HTVRfUklOR19TSVpFKSkKKwkJeworCQkJUlRVU0JCdWxrT3V0TUxNRVBhY2tldChwQWQsIHBBZC0+TWdtdFJpbmcuVHhEbWFJZHgpOworCQl9CisKKwkJLy8gNi4gRGF0YSBmcmFtZSBub3JtYWwgaXMgbmV4dAorCQlpZiAoUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwpKQorCQl7CisJCQlpZiAoKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgfHwKKwkJCQkoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwkJCQkpKQorCQkJeworCQkJCVJUVVNCQnVsa091dERhdGFQYWNrZXQocEFkLCAwLCBwQWQtPk5leHRCdWxrT3V0SW5kZXhbMF0pOworCQkJfQorCQl9CisJCWlmIChSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTF8yKSkKKwkJeworCQkJaWYgKCgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpIHx8CisJCQkJKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJCQkJKSkKKwkJCXsKKwkJCQlSVFVTQkJ1bGtPdXREYXRhUGFja2V0KHBBZCwgMSwgcEFkLT5OZXh0QnVsa091dEluZGV4WzFdKTsKKwkJCX0KKwkJfQorCQlpZiAoUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUxfMykpCisJCXsKKwkJCWlmICgoKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKSB8fAorCQkJCSghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQorCQkJCSkpCisJCQl7CisJCQkJUlRVU0JCdWxrT3V0RGF0YVBhY2tldChwQWQsIDIsIHBBZC0+TmV4dEJ1bGtPdXRJbmRleFsyXSk7CisJCQl9CisJCX0KKwkJaWYgKFJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMXzQpKQorCQl7CisJCQlpZiAoKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgfHwKKwkJCQkoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwkJCQkpKQorCQkJeworCQkJCVJUVVNCQnVsa091dERhdGFQYWNrZXQocEFkLCAzLCBwQWQtPk5leHRCdWxrT3V0SW5kZXhbM10pOworCQkJfQorCQl9CisKKwkJLy8gNy4gTnVsbCBmcmFtZSBpcyB0aGUgbGFzdAorCQllbHNlIGlmIChSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05VTEwpKQorCQl7CisJCQlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisJCQl7CisJCQkJUlRVU0JCdWxrT3V0TnVsbEZyYW1lKHBBZCk7CisJCQl9CisJCX0KKworCQkvLyA4LiBObyBkYXRhIGF2YWxpYWJsZQorCQllbHNlCisJCXsKKworCQl9CisJfQorI2lmZGVmIFJBTElOS19BVEUKKwkvKiBJZiB0aGUgbW9kZSBpcyBpbiBBVEUgbW9kZS4gKi8KKwllbHNlIGlmKChBVEVfT04ocEFkKSkgJiYKKwkJIVJUTVBfVEVTVF9GTEFHKHBBZCAsZlJUTVBfQURBUFRFUl9ORUVEX1NUT1BfVFgpKS8vIFBFVEVSIDogd2F0Y2ggb3V0ICEKKwl7CisJCWlmIChSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX0FURSkpCisJCXsKKwkJCUFURV9SVFVTQkJ1bGtPdXREYXRhUGFja2V0KHBBZCwgMCk7CisJCX0KKwl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCUNhbGwgZnJvbSBSZXNldCBhY3Rpb24gYWZ0ZXIgQnVsa091dCBmYWlsZWQuCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRVU0JDbGVhblVwRGF0YUJ1bGtPdXRRdWV1ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlVQ0hBUgkJCUlkeDsKKwlQSFRfVFhfQ09OVEVYVAlwVHhDb250ZXh0OworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tPkNsZWFuVXBEYXRhQnVsa091dFF1ZXVlXG4iKSk7CisKKwlmb3IgKElkeCA9IDA7IElkeCA8IDQ7IElkeCsrKQorCXsKKwkJcFR4Q29udGV4dCA9ICZwQWQtPlR4Q29udGV4dFtJZHhdOworCisJCXBUeENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPSBwVHhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uOworCQlwVHhDb250ZXh0LT5MYXN0T25lID0gRkFMU0U7CisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbSWR4XSk7CisJCXBBZC0+QnVsa091dFBlbmRpbmdbSWR4XSA9IEZBTFNFOworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrW0lkeF0pOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLS1DbGVhblVwRGF0YUJ1bGtPdXRRdWV1ZVxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUVVNCQ2xlYW5VcE1MTUVCdWxrT3V0UXVldWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tPkNsZWFuVXBNTE1FQnVsa091dFF1ZXVlXG4iKSk7CisKKyNpZiAwCS8vIERvIG5vdGhpbmchCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NTE1FQnVsa091dExvY2spOworCXdoaWxlIChwQWQtPlByaW9SaW5nVHhDbnQgPiAwKQorCXsKKwkJcEFkLT5NTE1FQ29udGV4dFtwQWQtPlByaW9SaW5nRmlyc3RJbmRleF0uSW5Vc2UgPSBGQUxTRTsKKworCQlwQWQtPlByaW9SaW5nRmlyc3RJbmRleCsrOworCQlpZiAocEFkLT5QcmlvUmluZ0ZpcnN0SW5kZXggPj0gTUdNVF9SSU5HX1NJWkUpCisJCXsKKwkJCXBBZC0+UHJpb1JpbmdGaXJzdEluZGV4ID0gMDsKKwkJfQorCisJCXBBZC0+UHJpb1JpbmdUeENudC0tOworCX0KKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1MTUVCdWxrT3V0TG9jayk7CisjZW5kaWYKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLS1DbGVhblVwTUxNRUJ1bGtPdXRRdWV1ZVxuIikpOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVFVTQkNhbmNlbFBlbmRpbmdJUlBzKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUChwQWQpOworCVJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtPdXRJUlAocEFkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVFVTQkNhbmNlbFBlbmRpbmdCdWxrSW5JUlAoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJUFJYX0NPTlRFWFQJCXBSeENvbnRleHQ7CisJVUlOVAkJCWk7CisKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiLS0tPlJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUFxuIikpOworCWZvciAoIGkgPSAwOyBpIDwgKFJYX1JJTkdfU0laRSk7IGkrKykKKwl7CisJCXBSeENvbnRleHQgPSAmKHBBZC0+UnhDb250ZXh0W2ldKTsKKwkJaWYocFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9PSBUUlVFKQorCQl7CisJCQlSVFVTQl9VTkxJTktfVVJCKHBSeENvbnRleHQtPnBVcmIpOworCQkJcFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCQkJcFJ4Q29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKKwkJCS8vTmRpc0ludGVybG9ja2VkRGVjcmVtZW50KCZwQWQtPlBlbmRpbmdSeCk7CisJCQkvL3BBZC0+UGVuZGluZ1J4LS07CisJCX0KKwl9CisJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIjwtLS1SVFVTQkNhbmNlbFBlbmRpbmdCdWxrSW5JUlBcbiIpKTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtPdXRJUlAoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJUEhUX1RYX0NPTlRFWFQJCXBIVFRYQ29udGV4dDsKKwlQVFhfQ09OVEVYVAkJCXBNTE1FQ29udGV4dDsKKwlQVFhfQ09OVEVYVAkJCXBCZWFjb25Db250ZXh0OworCVBUWF9DT05URVhUCQkJcE51bGxDb250ZXh0OworCVBUWF9DT05URVhUCQkJcFBzUG9sbENvbnRleHQ7CisJUFRYX0NPTlRFWFQJCQlwUlRTQ29udGV4dDsKKwlVSU5UCQkJCWksIElkeDsKKy8vCXVuc2lnbmVkIGludCAJCUlycUZsYWdzOworLy8JTkRJU19TUElOX0xPQ0sJCSpwTG9jazsKKy8vCUJPT0xFQU4JCQkJKnBQZW5kaW5nOworCisKKy8vCXBMb2NrID0gJnBBZC0+QnVsa091dExvY2tbTUdNVFBJUEVJRFhdOworLy8JcFBlbmRpbmcgPSAmcEFkLT5CdWxrT3V0UGVuZGluZ1tNR01UUElQRUlEWF07CisKKwlmb3IgKElkeCA9IDA7IElkeCA8IDQ7IElkeCsrKQorCXsKKwkJcEhUVFhDb250ZXh0ID0gJihwQWQtPlR4Q29udGV4dFtJZHhdKTsKKworCQlpZiAocEhUVFhDb250ZXh0LT5JUlBQZW5kaW5nID09IFRSVUUpCisJCXsKKworCQkJLy8gR2V0IHRoZSBVU0JfQ09OVEVYVCBhbmQgY2FuY2VsIGl0J3MgSVJQOyB0aGUgY29tcGxldGlvbiByb3V0aW5lIHdpbGwgaXRzZWxmCisJCQkvLyByZW1vdmUgaXQgZnJvbSB0aGUgSGVhZFBlbmRpbmdTZW5kTGlzdCBhbmQgTlVMTCBvdXQgSGVhZFBlbmRpbmdTZW5kTGlzdAorCQkJLy8Jd2hlbiB0aGUgbGFzdCBJUlAgb24gdGhlIGxpc3QgaGFzIGJlZW4JY2FuY2VsbGVkOyB0aGF0J3MgaG93IHdlIGV4aXQgdGhpcyBsb29wCisJCQkvLworCisJCQlSVFVTQl9VTkxJTktfVVJCKHBIVFRYQ29udGV4dC0+cFVyYik7CisKKwkJCS8vIFNsZWVwIDIwMCBtaWNyb3NlY29uZHMgdG8gZ2l2ZSBjYW5jZWxsYXRpb24gdGltZSB0byB3b3JrCisJCQlSVE1QdXNlY0RlbGF5KDIwMCk7CisJCX0KKworI2lmZGVmIFJBTElOS19BVEUKKwkJcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQgPSAwOworCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPSAwOworCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcyA9IDA7CisJCXBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPSBGQUxTRTsKKwkJcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uID0gMDsKKwkJcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9IDA7CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCQlwQWQtPkJ1bGtPdXRQZW5kaW5nW0lkeF0gPSBGQUxTRTsKKwl9CisKKwkvL1JUTVBfSVJRX0xPQ0socExvY2ssIElycUZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUdNVF9SSU5HX1NJWkU7IGkrKykKKwl7CisJCXBNTE1FQ29udGV4dCA9IChQVFhfQ09OVEVYVClwQWQtPk1nbXRSaW5nLkNlbGxbaV0uQWxsb2NWYTsKKwkJaWYocE1MTUVDb250ZXh0ICYmIChwTUxNRUNvbnRleHQtPklSUFBlbmRpbmcgPT0gVFJVRSkpCisJCXsKKworCQkJLy8gR2V0IHRoZSBVU0JfQ09OVEVYVCBhbmQgY2FuY2VsIGl0J3MgSVJQOyB0aGUgY29tcGxldGlvbiByb3V0aW5lIHdpbGwgaXRzZWxmCisJCQkvLyByZW1vdmUgaXQgZnJvbSB0aGUgSGVhZFBlbmRpbmdTZW5kTGlzdCBhbmQgTlVMTCBvdXQgSGVhZFBlbmRpbmdTZW5kTGlzdAorCQkJLy8Jd2hlbiB0aGUgbGFzdCBJUlAgb24gdGhlIGxpc3QgaGFzIGJlZW4JY2FuY2VsbGVkOyB0aGF0J3MgaG93IHdlIGV4aXQgdGhpcyBsb29wCisJCQkvLworCisJCQlSVFVTQl9VTkxJTktfVVJCKHBNTE1FQ29udGV4dC0+cFVyYik7CisJCQlwTUxNRUNvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKworCQkJLy8gU2xlZXAgMjAwIG1pY3Jvc2VjcyB0byBnaXZlIGNhbmNlbGxhdGlvbiB0aW1lIHRvIHdvcmsKKwkJCVJUTVB1c2VjRGVsYXkoMjAwKTsKKwkJfQorCX0KKwlwQWQtPkJ1bGtPdXRQZW5kaW5nW01HTVRQSVBFSURYXSA9IEZBTFNFOworCS8vUlRNUF9JUlFfVU5MT0NLKHBMb2NrLCBJcnFGbGFncyk7CisKKworCWZvciAoaSA9IDA7IGkgPCBCRUFDT05fUklOR19TSVpFOyBpKyspCisJeworCQlwQmVhY29uQ29udGV4dCA9ICYocEFkLT5CZWFjb25Db250ZXh0W2ldKTsKKworCQlpZihwQmVhY29uQ29udGV4dC0+SVJQUGVuZGluZyA9PSBUUlVFKQorCQl7CisKKwkJCS8vIEdldCB0aGUgVVNCX0NPTlRFWFQgYW5kIGNhbmNlbCBpdCdzIElSUDsgdGhlIGNvbXBsZXRpb24gcm91dGluZSB3aWxsIGl0c2VsZgorCQkJLy8gcmVtb3ZlIGl0IGZyb20gdGhlIEhlYWRQZW5kaW5nU2VuZExpc3QgYW5kIE5VTEwgb3V0IEhlYWRQZW5kaW5nU2VuZExpc3QKKwkJCS8vCXdoZW4gdGhlIGxhc3QgSVJQIG9uIHRoZSBsaXN0IGhhcyBiZWVuCWNhbmNlbGxlZDsgdGhhdCdzIGhvdyB3ZSBleGl0IHRoaXMgbG9vcAorCQkJLy8KKworCQkJUlRVU0JfVU5MSU5LX1VSQihwQmVhY29uQ29udGV4dC0+cFVyYik7CisKKwkJCS8vIFNsZWVwIDIwMCBtaWNyb3NlY3MgdG8gZ2l2ZSBjYW5jZWxsYXRpb24gdGltZSB0byB3b3JrCisJCQlSVE1QdXNlY0RlbGF5KDIwMCk7CisJCX0KKwl9CisKKwlwTnVsbENvbnRleHQgPSAmKHBBZC0+TnVsbENvbnRleHQpOworCWlmIChwTnVsbENvbnRleHQtPklSUFBlbmRpbmcgPT0gVFJVRSkKKwkJUlRVU0JfVU5MSU5LX1VSQihwTnVsbENvbnRleHQtPnBVcmIpOworCisJcFJUU0NvbnRleHQgPSAmKHBBZC0+UlRTQ29udGV4dCk7CisJaWYgKHBSVFNDb250ZXh0LT5JUlBQZW5kaW5nID09IFRSVUUpCisJCVJUVVNCX1VOTElOS19VUkIocFJUU0NvbnRleHQtPnBVcmIpOworCisJcFBzUG9sbENvbnRleHQgPSAmKHBBZC0+UHNQb2xsQ29udGV4dCk7CisJaWYgKHBQc1BvbGxDb250ZXh0LT5JUlBQZW5kaW5nID09IFRSVUUpCisJCVJUVVNCX1VOTElOS19VUkIocFBzUG9sbENvbnRleHQtPnBVcmIpOworCisJZm9yIChJZHggPSAwOyBJZHggPCA0OyBJZHgrKykKKwl7CisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbSWR4XSk7CisJCXBBZC0+QnVsa091dFBlbmRpbmdbSWR4XSA9IEZBTFNFOworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrW0lkeF0pOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnR1c2JfZGF0YS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnR1c2JfZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMGQ3ODMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydHVzYl9kYXRhLmMKQEAgLTAsMCArMSwyMjkgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJcnR1c2JfZGF0YS5jCisKKwlBYnN0cmFjdDoKKwlSYWxpbmsgVVNCIGRyaXZlciBUeC9SeCBmdW5jdGlvbnMuCisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUphbiAgICAgICAgICAgIDAzLTI1LTIwMDYgICAgY3JlYXRlZAorCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCitleHRlcm4gIFVDSEFSIFBoeTExQkdOZXh0UmF0ZVVwd2FyZFtdOyAvLyBkZWZpbmVkIGluIG1sbWUuYworZXh0ZXJuIFVDSEFSCUVwVG9RdWV1ZVtdOworCitWT0lEIFJFUE9SVF9BTVNEVV9GUkFNRVNfVE9fTExDKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVMT05HCQkJRGF0YVNpemUpCit7CisJUE5ESVNfUEFDS0VUCXBQYWNrZXQ7CisJVUlOVAkJCW5NU0RVOworCXN0cnVjdAkJCXNrX2J1ZmYgKnBTa2I7CisKKwluTVNEVSA9IDA7CisJLyogYWxsb2NhdGUgYSByeCBwYWNrZXQgKi8KKwlwU2tiID0gZGV2X2FsbG9jX3NrYihSWF9CVUZGRVJfQUdHUkVTSVpFKTsKKwlwUGFja2V0ID0gKFBORElTX1BBQ0tFVClPU1BLVF9UT19SVFBLVChwU2tiKTsKKwlpZiAocFNrYikKKwl7CisKKwkJLyogY29udmVydCA4MDIuMTEgdG8gODAyLjMgcGFja2V0ICovCisJCXBTa2ItPmRldiA9IGdldF9uZXRkZXZfZnJvbV9ic3NpZChwQWQsIEJTUzApOworCQlSVE1QX1NFVF9QQUNLRVRfU09VUkNFKHBQYWNrZXQsIFBLVFNSQ19ORElTKTsKKwkJZGVhZ2dyZWdhdGVfQU1TRFVfYW5ub3VuY2UocEFkLCBwUGFja2V0LCBwRGF0YSwgRGF0YVNpemUpOworCX0KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkNhbid0IGFsbG9jYXRlIHNrYlxuIikpOworCX0KK30KKworTkRJU19TVEFUVVMJUlRVU0JGcmVlRGVzY3JpcHRvclJlcXVlc3QoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlCdWxrT3V0UGlwZUlkLAorCUlOCVVJTlQzMgkJCU51bWJlclJlcXVpcmVkKQoreworLy8JVUNIQVIJCQlGcmVlTnVtYmVyID0gMDsKKy8vCVVJTlQJCQlJbmRleDsKKwlORElTX1NUQVRVUwkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl1bnNpZ25lZCBsb25nICAgSXJxRmxhZ3M7CisJSFRfVFhfQ09OVEVYVAkqcEhUVFhDb250ZXh0OworCisKKwlwSFRUWENvbnRleHQgPSAmcEFkLT5UeENvbnRleHRbQnVsa091dFBpcGVJZF07CisJUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwlpZiAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA8IHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbikgJiYgKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyBOdW1iZXJSZXF1aXJlZCArIExPQ0FMX1RYQlVGX1NJWkUpID4gcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uKSkKKwl7CisKKwkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIChmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwgPDwgQnVsa091dFBpcGVJZCkpOworCX0KKwllbHNlIGlmICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID09IDgpICYmIChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gPCAoTnVtYmVyUmVxdWlyZWQgKyBMT0NBTF9UWEJVRl9TSVpFKSkpCisJeworCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCBCdWxrT3V0UGlwZUlkKSk7CisJfQorCWVsc2UgaWYgKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gVFJVRSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRVU0JGcmVlRCBjMyAtLT4gUXVlSWR4PSVkLCBDV1Bvcz0lbGQsIE5CT3V0UG9zPSVsZCFcbiIsIEJ1bGtPdXRQaXBlSWQsIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uKSk7CisJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8IEJ1bGtPdXRQaXBlSWQpKTsKKwl9CisJZWxzZQorCXsKKwkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwl9CisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCisKKwlyZXR1cm4gKFN0YXR1cyk7Cit9CisKK05ESVNfU1RBVFVTIFJUVVNCRnJlZURlc2NyaXB0b3JSZWxlYXNlKAorCUlOIFJUTVBfQURBUFRFUiAqcEFkLAorCUlOIFVDSEFSCQlCdWxrT3V0UGlwZUlkKQoreworCXVuc2lnbmVkIGxvbmcgICBJcnFGbGFnczsKKwlIVF9UWF9DT05URVhUCSpwSFRUWENvbnRleHQ7CisKKwlwSFRUWENvbnRleHQgPSAmcEFkLT5UeENvbnRleHRbQnVsa091dFBpcGVJZF07CisJUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwlwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID0gRkFMU0U7CisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCisJcmV0dXJuIChORElTX1NUQVRVU19TVUNDRVNTKTsKK30KKworCitCT09MRUFOCVJUVVNCTmVlZFF1ZXVlQmFja0ZvckFnZygKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCwKKwlJTiBVQ0hBUgkJQnVsa091dFBpcGVJZCkKK3sKKwl1bnNpZ25lZCBsb25nICAgSXJxRmxhZ3M7CisJSFRfVFhfQ09OVEVYVAkqcEhUVFhDb250ZXh0OworCUJPT0xFQU4JCQluZWVkUXVlQmFjayA9IEZBTFNFOworCisJcEhUVFhDb250ZXh0ID0gJnBBZC0+VHhDb250ZXh0W0J1bGtPdXRQaXBlSWRdOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwlpZiAoKHBIVFRYQ29udGV4dC0+SVJQUGVuZGluZyA9PSBUUlVFKSAgLyomJiAocEFkLT5UeFN3UXVldWVbQnVsa091dFBpcGVJZF0uTnVtYmVyID09IDApICovKQorCXsKKyNpZiAwCisJCWlmICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uIDw9IDgpICYmCisJCQkocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uID4gOCAmJiAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uK01BWF9BR0dSRUdBVElPTl9TSVpFKSA8IE1BWF9UWEJVTEtfTElNSVQpKQorCQl7CisJCQluZWVkUXVlQmFjayA9IFRSVUU7CisJCX0KKwkJZWxzZSBpZiAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA8IHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbikgJiYKKwkJCQkgKChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gKyBNQVhfQUdHUkVHQVRJT05fU0laRSkgPCBNQVhfVFhCVUxLX0xJTUlUKSkKKwkJeworCQkJbmVlZFF1ZUJhY2sgPSBUUlVFOworCQl9CisjZWxzZQorCQlpZiAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA8IHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24pICYmCisJCQkoKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uK01BWF9BR0dSRUdBVElPTl9TSVpFKSA8IE1BWF9UWEJVTEtfTElNSVQpIHx8IChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPiBNQVhfQUdHUkVHQVRJT05fU0laRSkpKQorCQl7CisJCQluZWVkUXVlQmFjayA9IFRSVUU7CisJCX0KKyNlbmRpZgorCQllbHNlIGlmICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID4gcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbikgJiYKKwkJCQkgKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uICsgTUFYX0FHR1JFR0FUSU9OX1NJWkUpIDwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSkKKwkJeworCQkJbmVlZFF1ZUJhY2sgPSBUUlVFOworCQl9CisJfQorCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKworCXJldHVybiBuZWVkUXVlQmFjazsKKworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJSVJRTCA9CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVFVTQlJlamVjdFBlbmRpbmdQYWNrZXRzKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVVDSEFSCQkJSW5kZXg7CisJUFFVRVVFX0VOVFJZCXBFbnRyeTsKKwlQTkRJU19QQUNLRVQJcFBhY2tldDsKKwlQUVVFVUVfSEVBREVSCXBRdWV1ZTsKKworCisJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgNDsgSW5kZXgrKykKKwl7CisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+VHhTd1F1ZXVlTG9ja1tJbmRleF0pOworCQl3aGlsZSAocEFkLT5UeFN3UXVldWVbSW5kZXhdLkhlYWQgIT0gTlVMTCkKKwkJeworCQkJcFF1ZXVlID0gKFBRVUVVRV9IRUFERVIpICYocEFkLT5UeFN3UXVldWVbSW5kZXhdKTsKKwkJCXBFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZShwUXVldWUpOworCQkJcFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwRW50cnkpOworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQl9CisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+VHhTd1F1ZXVlTG9ja1tJbmRleF0pOworCisJfQorCit9CisKK1ZPSUQgUlRNUFdyaXRlVHhJbmZvKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBUWElORk9fU1RSVUMgCXBUeEluZm8sCisJSU4JICBVU0hPUlQJCVVTQkRNQXBrdExlbiwKKwlJTgkgIEJPT0xFQU4JCWJXaXYsCisJSU4JICBVQ0hBUgkJCVF1ZXVlU2VsLAorCUlOCSAgVUNIQVIJCQlOZXh0VmFsaWQsCisJSU4JICBVQ0hBUgkJCVR4QnVyc3QpCit7CisJcFR4SW5mby0+VVNCRE1BVHhQa3RMZW4gPSBVU0JETUFwa3RMZW47CisJcFR4SW5mby0+UVNFTCA9IFF1ZXVlU2VsOworCWlmIChRdWV1ZVNlbCAhPSBGSUZPX0VEQ0EpCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+IFF1ZXVlU2VsICE9IEZJRk9fRURDQTw9PT09PT09PT09PT1cbiIpKTsKKwlwVHhJbmZvLT5VU0JETUFOZXh0VkxEID0gRkFMU0U7IC8vTmV4dFZhbGlkOyAgLy8gTmVlZCB0byBjaGVjayB3aXRoIEphbiBhYm91dCB0aGlzLgorCXBUeEluZm8tPlVTQkRNQVR4YnVyc3QgPSBUeEJ1cnN0OworCXBUeEluZm8tPldJViA9IGJXaXY7CisJcFR4SW5mby0+U3dVc2VMYXN0Um91bmQgPSAwOworCXBUeEluZm8tPnJzdiA9IDA7CisJcFR4SW5mby0+cnN2MiA9IDA7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0dXNiX2lvLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydHVzYl9pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYjQ0M2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydHVzYl9pby5jCkBAIC0wLDAgKzEsMjAwNiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAJTW9kdWxlIE5hbWU6CisJcnR1c2JfaW8uYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JICAgIFdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTmFtZQkJRGF0ZQkgICAgTW9kaWZpY2F0aW9uIGxvZ3MKKwlQYXVsIExpbiAgICAwNi0yNS0yMDA0ICBjcmVhdGVkCisqLworCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246IE5JQyBpbml0aWFsaXphdGlvbiBjb21wbGV0ZQorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJSVJRTCA9CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCitOVFNUQVRVUwlSVFVTQkZpcm13YXJlUnVuKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCU5UU1RBVFVTCVN0YXR1czsKKworCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QoCisJCXBBZCwKKwkJVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fT1VULAorCQlERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VULAorCQkweDAxLAorCQkweDgsCisJCTAsCisJCU5VTEwsCisJCTApOworCisJcmV0dXJuIFN0YXR1czsKK30KKworCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOiBXcml0ZSBGaXJtd2FyZSB0byBOSUMuCisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlJUlFMID0KKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitOVFNUQVRVUyBSVFVTQkZpcm13YXJlV3JpdGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSCQlwRndJbWFnZSwKKwlJTiBVTE9ORwkJRndMZW4pCit7CisJVUlOVDMyCQlNYWNSZWc7CisJTlRTVEFUVVMgCVN0YXR1czsKKy8vCVVMT05HIAkJaTsKKwlVU0hPUlQJCXdyaXRlTGVuOworCisJU3RhdHVzID0gUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBNQUNfQ1NSMCwgJk1hY1JlZyk7CisKKworCXdyaXRlTGVuID0gRndMZW47CisJUlRVU0JNdWx0aVdyaXRlKHBBZCwgRklSTVdBUkVfSU1BR0VfQkFTRSwgcEZ3SW1hZ2UsIHdyaXRlTGVuKTsKKworCVN0YXR1cyA9IFJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIDB4NzAxNCwgMHhmZmZmZmZmZik7CisJU3RhdHVzID0gUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgMHg3MDFjLCAweGZmZmZmZmZmKTsKKwlTdGF0dXMgPSBSVFVTQkZpcm13YXJlUnVuKHBBZCk7CisKKwlyZXR1cm4gU3RhdHVzOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOiBHZXQgY3VycmVudCBmaXJtd2FyZSBvcGVyYXRpb24gbW9kZSAoUmV0dXJuIFZhbHVlKQorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCQkwIG9yIDEgPSBEb3dubG9hZGVkIGJ5IGhvc3QgZHJpdmVyCisJCW90aGVycyA9IERyaXZlciBkb2Vzbid0IGRvd25sb2FkIGZpcm13YXJlCisKKwlJUlFMID0KKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitOVFNUQVRVUwlSVFVTQkZpcm13YXJlT3Btb2RlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVAlQVUlOVDMyCQkJcFZhbHVlKQoreworCU5UU1RBVFVTCVN0YXR1czsKKworCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QoCisJCXBBZCwKKwkJKFVTQkRfVFJBTlNGRVJfRElSRUNUSU9OX0lOIHwgVVNCRF9TSE9SVF9UUkFOU0ZFUl9PSyksCisJCURFVklDRV9WRU5ET1JfUkVRVUVTVF9JTiwKKwkJMHgxLAorCQkweDExLAorCQkwLAorCQlwVmFsdWUsCisJCTQpOworCXJldHVybiBTdGF0dXM7Cit9CitOVFNUQVRVUwlSVFVTQlZlbmRlclJlc2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCU5UU1RBVFVTCVN0YXR1czsKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiLS0+UlRVU0JWZW5kZXJSZXNldFxuIikpOworCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QoCisJCXBBZCwKKwkJVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fT1VULAorCQlERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VULAorCQkweDAxLAorCQkweDEsCisJCTAsCisJCU5VTEwsCisJCTApOworCisJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIjwtLVJUVVNCVmVuZGVyUmVzZXRcbiIpKTsKKwlyZXR1cm4gU3RhdHVzOworfQorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246IFJlYWQgdmFyaW91cyBsZW5ndGggZGF0YSBmcm9tIFJUMjU3MworCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJSVJRTCA9CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTlRTVEFUVVMJUlRVU0JNdWx0aVJlYWQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVVNIT1JUCQkJT2Zmc2V0LAorCU9VVAlQVUNIQVIJCQlwRGF0YSwKKwlJTglVU0hPUlQJCQlsZW5ndGgpCit7CisJTlRTVEFUVVMJU3RhdHVzOworCisJU3RhdHVzID0gUlRVU0JfVmVuZG9yUmVxdWVzdCgKKwkJcEFkLAorCQkoVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fSU4gfCBVU0JEX1NIT1JUX1RSQU5TRkVSX09LKSwKKwkJREVWSUNFX1ZFTkRPUl9SRVFVRVNUX0lOLAorCQkweDcsCisJCTAsCisJCU9mZnNldCwKKwkJcERhdGEsCisJCWxlbmd0aCk7CisKKwlyZXR1cm4gU3RhdHVzOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjogV3JpdGUgdmFyaW91cyBsZW5ndGggZGF0YSB0byBSVDI1NzMKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCUlSUUwgPQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05UU1RBVFVTCVJUVVNCTXVsdGlXcml0ZV9PbmVCeXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVTSE9SVAkJCU9mZnNldCwKKwlJTglQVUNIQVIJCQlwRGF0YSkKK3sKKwlOVFNUQVRVUwlTdGF0dXM7CisKKwkvLyBUT0RPOiBJbiAyODcwLCB1c2UgdGhpcyBmdW5jaXRvbiBjYXJlZnVsbHkgY2F1c2UgaXQncyBub3Qgc3RhYmxlLgorCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QoCisJCXBBZCwKKwkJVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fT1VULAorCQlERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VULAorCQkweDYsCisJCTAsCisJCU9mZnNldCwKKwkJcERhdGEsCisJCTEpOworCisJcmV0dXJuIFN0YXR1czsKK30KKworTlRTVEFUVVMJUlRVU0JNdWx0aVdyaXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVTSE9SVAkJCU9mZnNldCwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVU0hPUlQJCQlsZW5ndGgpCit7CisJTlRTVEFUVVMJU3RhdHVzOworCisKKyAgICAgICAgVVNIT1JUICAgICAgICAgIGluZGV4ID0gMCxWYWx1ZTsKKyAgICAgICAgUFVDSEFSICAgICAgICAgIHBTcmMgPSBwRGF0YTsKKyAgICAgICAgVVNIT1JUICAgICAgICAgIHJlc3VkZSA9IDA7CisKKyAgICAgICAgcmVzdWRlID0gbGVuZ3RoICUgMjsKKwkJbGVuZ3RoICArPSByZXN1ZGU7CisJCWRvCisJCXsKKwkJCVZhbHVlID0oVVNIT1JUKSggKnBTcmMgIHwgKCoocFNyYyArIDEpIDw8IDgpKTsKKwkJU3RhdHVzID0gUlRVU0JTaW5nbGVXcml0ZShwQWQsT2Zmc2V0ICsgaW5kZXgsVmFsdWUpOworICAgICAgICAgICAgaW5kZXggKz0yOworICAgICAgICAgICAgbGVuZ3RoIC09IDI7CisgICAgICAgICAgICBwU3JjID0gcFNyYyArIDI7CisgICAgICAgIH13aGlsZShsZW5ndGggPiAwKTsKKworCXJldHVybiBTdGF0dXM7Cit9CisKKworTlRTVEFUVVMgUlRVU0JTaW5nbGVXcml0ZSgKKwlJTiAJUlRNUF9BREFQVEVSIAkqcEFkLAorCUlOCVVTSE9SVAkJCU9mZnNldCwKKwlJTglVU0hPUlQJCQlWYWx1ZSkKK3sKKwlOVFNUQVRVUwlTdGF0dXM7CisKKwlTdGF0dXMgPSBSVFVTQl9WZW5kb3JSZXF1ZXN0KAorCQlwQWQsCisJCVVTQkRfVFJBTlNGRVJfRElSRUNUSU9OX09VVCwKKwkJREVWSUNFX1ZFTkRPUl9SRVFVRVNUX09VVCwKKwkJMHgyLAorCQlWYWx1ZSwKKwkJT2Zmc2V0LAorCQlOVUxMLAorCQkwKTsKKworCXJldHVybiBTdGF0dXM7CisKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjogUmVhZCAzMi1iaXQgTUFDIHJlZ2lzdGVyCisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlJUlFMID0KKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitOVFNUQVRVUwlSVFVTQlJlYWRNQUNSZWdpc3RlcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVU0hPUlQJCQlPZmZzZXQsCisJT1VUCVBVSU5UMzIJCQlwVmFsdWUpCit7CisJTlRTVEFUVVMJU3RhdHVzOworCVVJTlQzMgkJbG9jYWxWYWw7CisKKwlTdGF0dXMgPSBSVFVTQl9WZW5kb3JSZXF1ZXN0KAorCQlwQWQsCisJCShVU0JEX1RSQU5TRkVSX0RJUkVDVElPTl9JTiB8IFVTQkRfU0hPUlRfVFJBTlNGRVJfT0spLAorCQlERVZJQ0VfVkVORE9SX1JFUVVFU1RfSU4sCisJCTB4NywKKwkJMCwKKwkJT2Zmc2V0LAorCQkmbG9jYWxWYWwsCisJCTQpOworCisJKnBWYWx1ZSA9IGxlMmNwdTMyKGxvY2FsVmFsKTsKKworCisJaWYgKFN0YXR1cyA8IDApCisJCSpwVmFsdWUgPSAweGZmZmZmZmZmOworCisJcmV0dXJuIFN0YXR1czsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjogV3JpdGUgMzItYml0IE1BQyByZWdpc3RlcgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJSVJRTCA9CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTlRTVEFUVVMJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVTSE9SVAkJCU9mZnNldCwKKwlJTglVSU5UMzIJCQlWYWx1ZSkKK3sKKwlOVFNUQVRVUwlTdGF0dXM7CisJVUlOVDMyCQlsb2NhbFZhbDsKKworCWxvY2FsVmFsID0gVmFsdWU7CisKKwlTdGF0dXMgPSBSVFVTQlNpbmdsZVdyaXRlKHBBZCwgT2Zmc2V0LCAoVVNIT1JUKShsb2NhbFZhbCAmIDB4ZmZmZikpOworCVN0YXR1cyA9IFJUVVNCU2luZ2xlV3JpdGUocEFkLCBPZmZzZXQgKyAyLCAoVVNIT1JUKSgobG9jYWxWYWwgJiAweGZmZmYwMDAwKSA+PiAxNikpOworCisJcmV0dXJuIFN0YXR1czsKK30KKworCisKKyNpZiAxCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjogUmVhZCA4LWJpdCBCQlAgcmVnaXN0ZXIKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCUlSUUwgPQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05UU1RBVFVTCVJUVVNCUmVhZEJCUFJlZ2lzdGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJSWQsCisJSU4JUFVDSEFSCQkJcFZhbHVlKQoreworCUJCUF9DU1JfQ0ZHX1NUUlVDCUJicENzcjsKKwlVSU5UCQkJaSA9IDA7CisJTlRTVEFUVVMJCXN0YXR1czsKKworCS8vIFZlcmlmeSB0aGUgYnVzeSBjb25kaXRpb24KKwlkbworCXsKKwkJc3RhdHVzID0gUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBCQlBfQ1NSX0NGRywgJkJicENzci53b3JkKTsKKwkJaWYoc3RhdHVzID49IDApCisJCXsKKwkJaWYgKCEoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkpCisJCQlicmVhazsKKwkJfQorCQlwcmludGsoIlJUVVNCUmVhZEJCUFJlZ2lzdGVyKEJCUF9DU1JfQ0ZHXzEpOnJldHJ5IGNvdW50PSVkIVxuIiwgaSk7CisJCWkrKzsKKwl9CisJd2hpbGUgKChpIDwgUkVUUllfTElNSVQpICYmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSk7CisKKwlpZiAoKGkgPT0gUkVUUllfTElNSVQpIHx8IChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKQorCXsKKwkJLy8KKwkJLy8gUmVhZCBmYWlsZWQgdGhlbiBSZXR1cm4gRGVmYXVsdCB2YWx1ZS4KKwkJLy8KKwkJKnBWYWx1ZSA9IHBBZC0+QmJwV3JpdGVMYXRjaFtJZF07CisKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIlJldHJ5IGNvdW50IGV4aGF1c3RlZCBvciBkZXZpY2UgcmVtb3ZlZCEhIVxuIikpOworCQlyZXR1cm4gU1RBVFVTX1VOU1VDQ0VTU0ZVTDsKKwl9CisKKwkvLyBQcmVwYXJlIGZvciB3cml0ZSBtYXRlcmlhbAorCUJicENzci53b3JkIAkJCQk9IDA7CisJQmJwQ3NyLmZpZWxkLmZSZWFkCQkJPSAxOworCUJicENzci5maWVsZC5CdXN5CQkJPSAxOworCUJicENzci5maWVsZC5SZWdOdW0gCQk9IElkOworCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIEJCUF9DU1JfQ0ZHLCBCYnBDc3Iud29yZCk7CisKKwlpID0gMDsKKwkvLyBWZXJpZnkgdGhlIGJ1c3kgY29uZGl0aW9uCisJZG8KKwl7CisJCXN0YXR1cyA9IFJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgQkJQX0NTUl9DRkcsICZCYnBDc3Iud29yZCk7CisJCWlmIChzdGF0dXMgPj0gMCkKKwkJeworCQlpZiAoIShCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSkKKwkJeworCQkJKnBWYWx1ZSA9IChVQ0hBUilCYnBDc3IuZmllbGQuVmFsdWU7CisJCQlicmVhazsKKwkJfQorCQl9CisJCXByaW50aygiUlRVU0JSZWFkQkJQUmVnaXN0ZXIoQkJQX0NTUl9DRkdfMik6cmV0cnkgY291bnQ9JWQhXG4iLCBpKTsKKwkJaSsrOworCX0KKwl3aGlsZSAoKGkgPCBSRVRSWV9MSU1JVCkgJiYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKTsKKworCWlmICgoaSA9PSBSRVRSWV9MSU1JVCkgfHwgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCisJeworCQkvLworCQkvLyBSZWFkIGZhaWxlZCB0aGVuIFJldHVybiBEZWZhdWx0IHZhbHVlLgorCQkvLworCQkqcFZhbHVlID0gcEFkLT5CYnBXcml0ZUxhdGNoW0lkXTsKKworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiUmV0cnkgY291bnQgZXhoYXVzdGVkIG9yIGRldmljZSByZW1vdmVkISEhXG4iKSk7CisJCXJldHVybiBTVEFUVVNfVU5TVUNDRVNTRlVMOworCX0KKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKyNlbHNlCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjogUmVhZCA4LWJpdCBCQlAgcmVnaXN0ZXIgdmlhIGZpcm13YXJlCisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlJUlFMID0KKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitOVFNUQVRVUwlSVFVTQlJlYWRCQlBSZWdpc3RlcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUlkLAorCUlOCVBVQ0hBUgkJCXBWYWx1ZSkKK3sKKwlCQlBfQ1NSX0NGR19TVFJVQwlCYnBDc3I7CisJaW50CQkJCQlpLCBrOworCWZvciAoaT0wOyBpPE1BWF9CVVNZX0NPVU5UOyBpKyspCisJeworCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIEgyTV9CQlBfQUdFTlQsICZCYnBDc3Iud29yZCk7CisJCWlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKQorCQl7CisJCQljb250aW51ZTsKKwkJfQorCQlCYnBDc3Iud29yZCA9IDA7CisJCUJicENzci5maWVsZC5mUmVhZCA9IDE7CisJCUJicENzci5maWVsZC5CQlBfUldfTU9ERSA9IDE7CisJCUJicENzci5maWVsZC5CdXN5ID0gMTsKKwkJQmJwQ3NyLmZpZWxkLlJlZ051bSA9IElkOworCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBIMk1fQkJQX0FHRU5ULCBCYnBDc3Iud29yZCk7CisJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg4MCwgMHhmZiwgMHgwLCAweDApOworCQlmb3IgKGs9MDsgazxNQVhfQlVTWV9DT1VOVDsgaysrKQorCQl7CisJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIEgyTV9CQlBfQUdFTlQsICZCYnBDc3Iud29yZCk7CisJCQlpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gSURMRSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoKEJicENzci5maWVsZC5CdXN5ID09IElETEUpICYmCisJCQkoQmJwQ3NyLmZpZWxkLlJlZ051bSA9PSBJZCkpCisJCXsKKwkJCSpwVmFsdWUgPSAoVUNIQVIpQmJwQ3NyLmZpZWxkLlZhbHVlOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpCisJeworCQlEQkdQUklOVF9FUlIoKCJCQlAgcmVhZCBSJWQ9MHgleCBmYWlsXG4iLCBJZCwgQmJwQ3NyLndvcmQpKTsKKwkJKnBWYWx1ZSA9IHBBZC0+QmJwV3JpdGVMYXRjaFtJZF07CisJCXJldHVybiBTVEFUVVNfVU5TVUNDRVNTRlVMOworCX0KKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisjZW5kaWYKKworI2lmIDEKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOiBXcml0ZSA4LWJpdCBCQlAgcmVnaXN0ZXIKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCUlSUUwgPQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05UU1RBVFVTCVJUVVNCV3JpdGVCQlBSZWdpc3RlcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUlkLAorCUlOCVVDSEFSCQkJVmFsdWUpCit7CisJQkJQX0NTUl9DRkdfU1RSVUMJQmJwQ3NyOworCVVJTlQJCQlpID0gMDsKKwlOVFNUQVRVUwkJc3RhdHVzOworCS8vIFZlcmlmeSB0aGUgYnVzeSBjb25kaXRpb24KKwlkbworCXsKKwkJc3RhdHVzID0gUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBCQlBfQ1NSX0NGRywgJkJicENzci53b3JkKTsKKwkJaWYgKHN0YXR1cyA+PSAwKQorCQl7CisJCWlmICghKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpKQorCQkJYnJlYWs7CisJCX0KKwkJcHJpbnRrKCJSVFVTQldyaXRlQkJQUmVnaXN0ZXIoQkJQX0NTUl9DRkcpOnJldHJ5IGNvdW50PSVkIVxuIiwgaSk7CisJCWkrKzsKKwl9CisJd2hpbGUgKChpIDwgUkVUUllfTElNSVQpICYmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSk7CisKKwlpZiAoKGkgPT0gUkVUUllfTElNSVQpIHx8IChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKQorCXsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIlJldHJ5IGNvdW50IGV4aGF1c3RlZCBvciBkZXZpY2UgcmVtb3ZlZCEhIVxuIikpOworCQlyZXR1cm4gU1RBVFVTX1VOU1VDQ0VTU0ZVTDsKKwl9CisKKwkvLyBQcmVwYXJlIGZvciB3cml0ZSBtYXRlcmlhbAorCUJicENzci53b3JkIAkJCQk9IDA7CisJQmJwQ3NyLmZpZWxkLmZSZWFkCQkJPSAwOworCUJicENzci5maWVsZC5WYWx1ZQkJCT0gVmFsdWU7CisJQmJwQ3NyLmZpZWxkLkJ1c3kJCQk9IDE7CisJQmJwQ3NyLmZpZWxkLlJlZ051bSAJCT0gSWQ7CisJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgQkJQX0NTUl9DRkcsIEJicENzci53b3JkKTsKKworCXBBZC0+QmJwV3JpdGVMYXRjaFtJZF0gPSBWYWx1ZTsKKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKyNlbHNlCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjogV3JpdGUgOC1iaXQgQkJQIHJlZ2lzdGVyIHZpYSBmaXJtd2FyZQorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJSVJRTCA9CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCitOVFNUQVRVUwlSVFVTQldyaXRlQkJQUmVnaXN0ZXIoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlJZCwKKwlJTglVQ0hBUgkJCVZhbHVlKQorCit7CisJQkJQX0NTUl9DRkdfU1RSVUMJQmJwQ3NyOworCWludAkJCQkJQnVzeUNudDsKKwlmb3IgKEJ1c3lDbnQ9MDsgQnVzeUNudDxNQVhfQlVTWV9DT1VOVDsgQnVzeUNudCsrKQorCXsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBIMk1fQkJQX0FHRU5ULCAmQmJwQ3NyLndvcmQpOworCQlpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkKKwkJCWNvbnRpbnVlOworCQlCYnBDc3Iud29yZCA9IDA7CisJCUJicENzci5maWVsZC5mUmVhZCA9IDA7CisJCUJicENzci5maWVsZC5CQlBfUldfTU9ERSA9IDE7CisJCUJicENzci5maWVsZC5CdXN5ID0gMTsKKwkJQmJwQ3NyLmZpZWxkLlZhbHVlID0gVmFsdWU7CisJCUJicENzci5maWVsZC5SZWdOdW0gPSBJZDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX0JCUF9BR0VOVCwgQmJwQ3NyLndvcmQpOworCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4ODAsIDB4ZmYsIDB4MCwgMHgwKTsKKwkJcEFkLT5CYnBXcml0ZUxhdGNoW0lkXSA9IFZhbHVlOworCQlicmVhazsKKwl9CisJaWYgKEJ1c3lDbnQgPT0gTUFYX0JVU1lfQ09VTlQpCisJeworCQlEQkdQUklOVF9FUlIoKCJCQlAgd3JpdGUgUiVkPTB4JXggZmFpbFxuIiwgSWQsIEJicENzci53b3JkKSk7CisJCXJldHVybiBTVEFUVVNfVU5TVUNDRVNTRlVMOworCX0KKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisjZW5kaWYKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOiBXcml0ZSBSRiByZWdpc3RlciB0aHJvdWdoIE1BQworCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJSVJRTCA9CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTlRTVEFUVVMJUlRVU0JXcml0ZVJGUmVnaXN0ZXIoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUlOVDMyCQkJVmFsdWUpCit7CisJUEhZX0NTUjRfU1RSVUMJUGh5Q3NyNDsKKwlVSU5UCQkJaSA9IDA7CisJTlRTVEFUVVMJCXN0YXR1czsKKworCU5kaXNaZXJvTWVtb3J5KCZQaHlDc3I0LCBzaXplb2YoUEhZX0NTUjRfU1RSVUMpKTsKKwlkbworCXsKKwkJc3RhdHVzID0gUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBSRl9DU1JfQ0ZHMCwgJlBoeUNzcjQud29yZCk7CisJCWlmIChzdGF0dXMgPj0gMCkKKwkJeworCQlpZiAoIShQaHlDc3I0LmZpZWxkLkJ1c3kpKQorCQkJYnJlYWs7CisJCX0KKwkJcHJpbnRrKCJSVFVTQldyaXRlUkZSZWdpc3RlcihSRl9DU1JfQ0ZHMCk6cmV0cnkgY291bnQ9JWQhXG4iLCBpKTsKKwkJaSsrOworCX0KKwl3aGlsZSAoKGkgPCBSRVRSWV9MSU1JVCkgJiYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKTsKKworCWlmICgoaSA9PSBSRVRSWV9MSU1JVCkgfHwgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCisJeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiUmV0cnkgY291bnQgZXhoYXVzdGVkIG9yIGRldmljZSByZW1vdmVkISEhXG4iKSk7CisJCXJldHVybiBTVEFUVVNfVU5TVUNDRVNTRlVMOworCX0KKworCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIFJGX0NTUl9DRkcwLCBWYWx1ZSk7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOiBXcml0ZSBSVDMwNzAgUkYgcmVnaXN0ZXIgdGhyb3VnaCBNQUMKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCUlSUUwgPQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05UU1RBVFVTCVJUMzB4eFdyaXRlUkZSZWdpc3RlcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCVJlZ0lELAorCUlOCVVDSEFSCQkJVmFsdWUpCit7CisJUkZfQ1NSX0NGR19TVFJVQwlyZmNzcjsKKwlVSU5UCQkJCWkgPSAwOworCisJZG8KKwl7CisJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgUkZfQ1NSX0NGRywgJnJmY3NyLndvcmQpOworCisJCWlmICghcmZjc3IuZmllbGQuUkZfQ1NSX0tJQ0spCisJCQlicmVhazsKKwkJaSsrOworCX0KKwl3aGlsZSAoKGkgPCBSRVRSWV9MSU1JVCkgJiYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKTsKKworCWlmICgoaSA9PSBSRVRSWV9MSU1JVCkgfHwgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCisJeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiUmV0cnkgY291bnQgZXhoYXVzdGVkIG9yIGRldmljZSByZW1vdmVkISEhXG4iKSk7CisJCXJldHVybiBTVEFUVVNfVU5TVUNDRVNTRlVMOworCX0KKworCXJmY3NyLmZpZWxkLlJGX0NTUl9XUiA9IDE7CisJcmZjc3IuZmllbGQuUkZfQ1NSX0tJQ0sgPSAxOworCXJmY3NyLmZpZWxkLlRFU1RDU1JfUkZBQ0NfUkVHTlVNID0gUmVnSUQ7CisJcmZjc3IuZmllbGQuUkZfQ1NSX0RBVEEgPSBWYWx1ZTsKKworCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIFJGX0NTUl9DRkcsIHJmY3NyLndvcmQpOworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjogUmVhZCBSVDMwNzAgUkYgcmVnaXN0ZXIgdGhyb3VnaCBNQUMKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCUlSUUwgPQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05UU1RBVFVTCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJUmVnSUQsCisJSU4JUFVDSEFSCQkJcFZhbHVlKQoreworCVJGX0NTUl9DRkdfU1RSVUMJcmZjc3I7CisJVUlOVAkJCQlpPTAsIGs7CisKKwlmb3IgKGk9MDsgaTxNQVhfQlVTWV9DT1VOVDsgaSsrKQorCXsKKwkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBSRl9DU1JfQ0ZHLCAmcmZjc3Iud29yZCk7CisKKwkJaWYgKHJmY3NyLmZpZWxkLlJGX0NTUl9LSUNLID09IEJVU1kpCisJCXsKKwkJCWNvbnRpbnVlOworCQl9CisJCXJmY3NyLndvcmQgPSAwOworCQlyZmNzci5maWVsZC5SRl9DU1JfV1IgPSAwOworCQlyZmNzci5maWVsZC5SRl9DU1JfS0lDSyA9IDE7CisJCXJmY3NyLmZpZWxkLlRFU1RDU1JfUkZBQ0NfUkVHTlVNID0gUmVnSUQ7CisJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIFJGX0NTUl9DRkcsIHJmY3NyLndvcmQpOworCQlmb3IgKGs9MDsgazxNQVhfQlVTWV9DT1VOVDsgaysrKQorCQl7CisJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIFJGX0NTUl9DRkcsICZyZmNzci53b3JkKTsKKworCQkJaWYgKHJmY3NyLmZpZWxkLlJGX0NTUl9LSUNLID09IElETEUpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKChyZmNzci5maWVsZC5SRl9DU1JfS0lDSyA9PSBJRExFKSAmJgorCQkJKHJmY3NyLmZpZWxkLlRFU1RDU1JfUkZBQ0NfUkVHTlVNID09IFJlZ0lEKSkKKwkJeworCQkJKnBWYWx1ZSA9IChVQ0hBUilyZmNzci5maWVsZC5SRl9DU1JfREFUQTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChyZmNzci5maWVsZC5SRl9DU1JfS0lDSyA9PSBCVVNZKQorCXsKKwkJREJHUFJJTlRfRVJSKCgiUkYgcmVhZCBSJWQ9MHgleCBmYWlsXG4iLCBSZWdJRCwgcmZjc3Iud29yZCkpOworCQlyZXR1cm4gU1RBVFVTX1VOU1VDQ0VTU0ZVTDsKKwl9CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJSVJRTCA9CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTlRTVEFUVVMJUlRVU0JSZWFkRUVQUk9NKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVTSE9SVAkJCU9mZnNldCwKKwlPVVQJUFVDSEFSCQkJcERhdGEsCisJSU4JVVNIT1JUCQkJbGVuZ3RoKQoreworCU5UU1RBVFVTCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOworCisJU3RhdHVzID0gUlRVU0JfVmVuZG9yUmVxdWVzdCgKKwkJcEFkLAorCQkoVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fSU4gfCBVU0JEX1NIT1JUX1RSQU5TRkVSX09LKSwKKwkJREVWSUNFX1ZFTkRPUl9SRVFVRVNUX0lOLAorCQkweDksCisJCTAsCisJCU9mZnNldCwKKwkJcERhdGEsCisJCWxlbmd0aCk7CisKKwlyZXR1cm4gU3RhdHVzOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCUlSUUwgPQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05UU1RBVFVTCVJUVVNCV3JpdGVFRVBST00oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVVNIT1JUCQkJT2Zmc2V0LAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVTSE9SVAkJCWxlbmd0aCkKK3sKKwlOVFNUQVRVUwlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKKworCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QoCisJCXBBZCwKKwkJVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fT1VULAorCQlERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VULAorCQkweDgsCisJCTAsCisJCU9mZnNldCwKKwkJcERhdGEsCisJCWxlbmd0aCk7CisKKwlyZXR1cm4gU3RhdHVzOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCUlSUUwgPQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRVU0JQdXRUb1NsZWVwKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworCVVJTlQzMgkJdmFsdWU7CisKKwkvLyBUaW1lb3V0IDB4NDAgeCA1MHVzCisJdmFsdWUgPSAoU0xFRVBDSUQ8PDE2KSsoT1dORVJNQ1U8PDI0KSsgKDB4NDA8PDgpKzE7CisJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgMHg3MDEwLCB2YWx1ZSk7CisJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgMHg0MDQsIDB4MzApOworCS8vUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7CisJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIlNsZWVwIE1haWxib3ggdGVzdHZhbHVlICV4XG4iLCB2YWx1ZSkpOworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJSVJRTCA9CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworTlRTVEFUVVMgUlRVU0JXYWtlVXAoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJTlRTVEFUVVMJU3RhdHVzOworCisJU3RhdHVzID0gUlRVU0JfVmVuZG9yUmVxdWVzdCgKKwkJcEFkLAorCQlVU0JEX1RSQU5TRkVSX0RJUkVDVElPTl9PVVQsCisJCURFVklDRV9WRU5ET1JfUkVRVUVTVF9PVVQsCisJCTB4MDEsCisJCTB4MDksCisJCTAsCisJCU5VTEwsCisJCTApOworCisJcmV0dXJuIFN0YXR1czsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlJUlFMID0KKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUVVNCSW5pdGlhbGl6ZUNtZFEoCisJSU4JUENtZFEJY21kcSkKK3sKKwljbWRxLT5oZWFkID0gTlVMTDsKKwljbWRxLT50YWlsID0gTlVMTDsKKwljbWRxLT5zaXplID0gMDsKKwljbWRxLT5DbWRRU3RhdGUgPSBSVDI4NzBfVEhSRUFEX0lOSVRFRDsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlJUlFMID0KKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUwlSVFVTQkVucXVldWVDbWRGcm9tTmRpcygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglORElTX09JRAkJT2lkLAorCUlOCUJPT0xFQU4JCQlTZXRJbmZvcm1hdGlvbiwKKwlJTglQVk9JRAkJCXBJbmZvcm1hdGlvbkJ1ZmZlciwKKwlJTglVSU5UMzIJCQlJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCkKK3sKKwlORElTX1NUQVRVUwlzdGF0dXM7CisJUENtZFFFbG10CWNtZHFlbG10ID0gTlVMTDsKKwlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKworCUNIRUNLX1BJRF9MRUdBTElUWShwT2JqLT5SVFVTQkNtZFRocl9waWQpCisJCXJldHVybiAoTkRJU19TVEFUVVNfUkVTT1VSQ0VTKTsKKworCXN0YXR1cyA9IFJUTVBBbGxvY2F0ZU1lbW9yeSgoUFZPSUQgKikmY21kcWVsbXQsIHNpemVvZihDbWRRRWxtdCkpOworCWlmICgoc3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHx8IChjbWRxZWxtdCA9PSBOVUxMKSkKKwkJcmV0dXJuIChORElTX1NUQVRVU19SRVNPVVJDRVMpOworCisJCWNtZHFlbG10LT5idWZmZXIgPSBOVUxMOworCQlpZiAocEluZm9ybWF0aW9uQnVmZmVyICE9IE5VTEwpCisJCXsKKwkJCXN0YXR1cyA9IFJUTVBBbGxvY2F0ZU1lbW9yeSgoUFZPSUQgKikmY21kcWVsbXQtPmJ1ZmZlciwgSW5mb3JtYXRpb25CdWZmZXJMZW5ndGgpOworCQkJaWYgKChzdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgfHwgKGNtZHFlbG10LT5idWZmZXIgPT0gTlVMTCkpCisJCQl7CisJCQkJa2ZyZWUoY21kcWVsbXQpOworCQkJCXJldHVybiAoTkRJU19TVEFUVVNfUkVTT1VSQ0VTKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlOZGlzTW92ZU1lbW9yeShjbWRxZWxtdC0+YnVmZmVyLCBwSW5mb3JtYXRpb25CdWZmZXIsIEluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoKTsKKwkJCQljbWRxZWxtdC0+YnVmZmVybGVuZ3RoID0gSW5mb3JtYXRpb25CdWZmZXJMZW5ndGg7CisJCQl9CisJCX0KKwkJZWxzZQorCQkJY21kcWVsbXQtPmJ1ZmZlcmxlbmd0aCA9IDA7CisKKwljbWRxZWxtdC0+Y29tbWFuZCA9IE9pZDsKKwljbWRxZWxtdC0+Q21kRnJvbU5kaXMgPSBUUlVFOworCWlmIChTZXRJbmZvcm1hdGlvbiA9PSBUUlVFKQorCQljbWRxZWxtdC0+U2V0T3BlcmF0aW9uID0gVFJVRTsKKwllbHNlCisJCWNtZHFlbG10LT5TZXRPcGVyYXRpb24gPSBGQUxTRTsKKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOworCWlmIChwQWQtPkNtZFEuQ21kUVN0YXRlICYgUlQyODcwX1RIUkVBRF9DQU5fRE9fSU5TRVJUKQorCXsKKwkJRW5xdWV1ZUNtZCgoJnBBZC0+Q21kUSksIGNtZHFlbG10KTsKKwkJc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwl9CisJZWxzZQorCXsKKwkJc3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5DbWRRTG9jayk7CisKKwlpZiAoc3RhdHVzID09IE5ESVNfU1RBVFVTX0ZBSUxVUkUpCisJeworCQlpZiAoY21kcWVsbXQtPmJ1ZmZlcikKKwkJCU5kaXNGcmVlTWVtb3J5KGNtZHFlbG10LT5idWZmZXIsIGNtZHFlbG10LT5idWZmZXJsZW5ndGgsIDApOworCQlOZGlzRnJlZU1lbW9yeShjbWRxZWxtdCwgc2l6ZW9mKENtZFFFbG10KSwgMCk7CisJfQorCWVsc2UKKwlSVFVTQkNNRFVwKHBBZCk7CisKKworICAgIHJldHVybihORElTX1NUQVRVU19TVUNDRVNTKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlJUlFMID0KKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUyBSVFVTQkVucXVldWVJbnRlcm5hbENtZCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBORElTX09JRAkJCU9pZCwKKwlJTiBQVk9JRAkJCXBJbmZvcm1hdGlvbkJ1ZmZlciwKKwlJTiBVSU5UMzIJCQlJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCkKK3sKKwlORElTX1NUQVRVUwlzdGF0dXM7CisJUENtZFFFbG10CWNtZHFlbG10ID0gTlVMTDsKKworCisJc3RhdHVzID0gUlRNUEFsbG9jYXRlTWVtb3J5KChQVk9JRCAqKSZjbWRxZWxtdCwgc2l6ZW9mKENtZFFFbG10KSk7CisJaWYgKChzdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgfHwgKGNtZHFlbG10ID09IE5VTEwpKQorCQlyZXR1cm4gKE5ESVNfU1RBVFVTX1JFU09VUkNFUyk7CisJTmRpc1plcm9NZW1vcnkoY21kcWVsbXQsIHNpemVvZihDbWRRRWxtdCkpOworCisJaWYoSW5mb3JtYXRpb25CdWZmZXJMZW5ndGggPiAwKQorCXsKKwkJc3RhdHVzID0gUlRNUEFsbG9jYXRlTWVtb3J5KChQVk9JRCAqKSZjbWRxZWxtdC0+YnVmZmVyLCBJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCk7CisJCWlmICgoc3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHx8IChjbWRxZWxtdC0+YnVmZmVyID09IE5VTEwpKQorCQl7CisJCQlOZGlzRnJlZU1lbW9yeShjbWRxZWxtdCwgc2l6ZW9mKENtZFFFbG10KSwgMCk7CisJCQlyZXR1cm4gKE5ESVNfU1RBVFVTX1JFU09VUkNFUyk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlOZGlzTW92ZU1lbW9yeShjbWRxZWxtdC0+YnVmZmVyLCBwSW5mb3JtYXRpb25CdWZmZXIsIEluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoKTsKKwkJCWNtZHFlbG10LT5idWZmZXJsZW5ndGggPSBJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aDsKKwkJfQorCX0KKwllbHNlCisJeworCQljbWRxZWxtdC0+YnVmZmVyID0gTlVMTDsKKwkJY21kcWVsbXQtPmJ1ZmZlcmxlbmd0aCA9IDA7CisJfQorCisJY21kcWVsbXQtPmNvbW1hbmQgPSBPaWQ7CisJY21kcWVsbXQtPkNtZEZyb21OZGlzID0gRkFMU0U7CisKKwlpZiAoY21kcWVsbXQgIT0gTlVMTCkKKwl7CisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOworCQlpZiAocEFkLT5DbWRRLkNtZFFTdGF0ZSAmIFJUMjg3MF9USFJFQURfQ0FOX0RPX0lOU0VSVCkKKwkJeworCQkJRW5xdWV1ZUNtZCgoJnBBZC0+Q21kUSksIGNtZHFlbG10KTsKKwkJCXN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCX0KKwkJZWxzZQorCQl7CisJCQlzdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCQl9CisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOworCisJCWlmIChzdGF0dXMgPT0gTkRJU19TVEFUVVNfRkFJTFVSRSkKKwkJeworCQkJaWYgKGNtZHFlbG10LT5idWZmZXIpCisJCQkJTmRpc0ZyZWVNZW1vcnkoY21kcWVsbXQtPmJ1ZmZlciwgY21kcWVsbXQtPmJ1ZmZlcmxlbmd0aCwgMCk7CisJCQlOZGlzRnJlZU1lbW9yeShjbWRxZWxtdCwgc2l6ZW9mKENtZFFFbG10KSwgMCk7CisJCX0KKwkJZWxzZQorCQlSVFVTQkNNRFVwKHBBZCk7CisJfQorCXJldHVybihORElTX1NUQVRVU19TVUNDRVNTKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlJUlFMID0KKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVJUVVNCRGVxdWV1ZUNtZCgKKwlJTglQQ21kUQkJY21kcSwKKwlPVVQJUENtZFFFbG10CSpwY21kcWVsbXQpCit7CisJKnBjbWRxZWxtdCA9IGNtZHEtPmhlYWQ7CisKKwlpZiAoKnBjbWRxZWxtdCAhPSBOVUxMKQorCXsKKwkJY21kcS0+aGVhZCA9IGNtZHEtPmhlYWQtPm5leHQ7CisJCWNtZHEtPnNpemUtLTsKKwkJaWYgKGNtZHEtPnNpemUgPT0gMCkKKwkJCWNtZHEtPnRhaWwgPSBOVUxMOworCX0KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkgIHVzYl9jb250cm9sX21zZyAtIEJ1aWxkcyBhIGNvbnRyb2wgdXJiLCBzZW5kcyBpdCBvZmYgYW5kIHdhaXRzIGZvciBjb21wbGV0aW9uCisJICBAZGV2OiBwb2ludGVyIHRvIHRoZSB1c2IgZGV2aWNlIHRvIHNlbmQgdGhlIG1lc3NhZ2UgdG8KKwkgIEBwaXBlOiBlbmRwb2ludCAicGlwZSIgdG8gc2VuZCB0aGUgbWVzc2FnZSB0bworCSAgQHJlcXVlc3Q6IFVTQiBtZXNzYWdlIHJlcXVlc3QgdmFsdWUKKwkgIEByZXF1ZXN0dHlwZTogVVNCIG1lc3NhZ2UgcmVxdWVzdCB0eXBlIHZhbHVlCisJICBAdmFsdWU6IFVTQiBtZXNzYWdlIHZhbHVlCisJICBAaW5kZXg6IFVTQiBtZXNzYWdlIGluZGV4IHZhbHVlCisJICBAZGF0YTogcG9pbnRlciB0byB0aGUgZGF0YSB0byBzZW5kCisJICBAc2l6ZTogbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBkYXRhIHRvIHNlbmQKKwkgIEB0aW1lb3V0OiB0aW1lIGluIGppZmZpZXMgdG8gd2FpdCBmb3IgdGhlIG1lc3NhZ2UgdG8gY29tcGxldGUgYmVmb3JlCisJCQkgIHRpbWluZyBvdXQgKGlmIDAgdGhlIHdhaXQgaXMgZm9yZXZlcikKKwkgIENvbnRleHQ6ICFpbl9pbnRlcnJ1cHQgKCkKKworCSAgVGhpcyBmdW5jdGlvbiBzZW5kcyBhIHNpbXBsZSBjb250cm9sIG1lc3NhZ2UgdG8gYSBzcGVjaWZpZWQgZW5kcG9pbnQKKwkgIGFuZCB3YWl0cyBmb3IgdGhlIG1lc3NhZ2UgdG8gY29tcGxldGUsIG9yIHRpbWVvdXQuCisJICBJZiBzdWNjZXNzZnVsLCBpdCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQsIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm9yIG51bWJlci4KKworCSBEb24ndCB1c2UgdGhpcyBmdW5jdGlvbiBmcm9tIHdpdGhpbiBhbiBpbnRlcnJ1cHQgY29udGV4dCwgbGlrZSBhCisJICBib3R0b20gaGFsZiBoYW5kbGVyLglJZiB5b3UgbmVlZCBhbiBhc3luY2hyb25vdXMgbWVzc2FnZSwgb3IgbmVlZCB0byBzZW5kCisJICBhIG1lc3NhZ2UgZnJvbSB3aXRoaW4gaW50ZXJydXB0IGNvbnRleHQsIHVzZSB1c2Jfc3VibWl0X3VyYigpCisJICBJZiBhIHRocmVhZCBpbiB5b3VyIGRyaXZlciB1c2VzIHRoaXMgY2FsbCwgbWFrZSBzdXJlIHlvdXIgZGlzY29ubmVjdCgpCisJICBtZXRob2QgY2FuIHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlLiAgU2luY2UgeW91IGRvbid0IGhhdmUgYSBoYW5kbGUgb24KKwkgIHRoZSBVUkIgdXNlZCwgeW91IGNhbid0IGNhbmNlbCB0aGUgcmVxdWVzdC4KKworCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitOVFNUQVRVUyAgICBSVFVTQl9WZW5kb3JSZXF1ZXN0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVJTlQzMgkJCVRyYW5zZmVyRmxhZ3MsCisJSU4JVUNIQVIJCQlSZXF1ZXN0VHlwZSwKKwlJTglVQ0hBUgkJCVJlcXVlc3QsCisJSU4JVVNIT1JUCQkJVmFsdWUsCisJSU4JVVNIT1JUCQkJSW5kZXgsCisJSU4JUFZPSUQJCQlUcmFuc2ZlckJ1ZmZlciwKKwlJTglVSU5UMzIJCQlUcmFuc2ZlckJ1ZmZlckxlbmd0aCkKK3sKKwlpbnQJCQkJcmV0OworCVBPU19DT09LSUUJCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiZGV2aWNlIGRpc2Nvbm5lY3RlZFxuIikpOworCQlyZXR1cm4gLTE7CisJfQorCWVsc2UgaWYgKGluX2ludGVycnVwdCgpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiaW5faW50ZXJydXB0LCBSVFVTQl9WZW5kb3JSZXF1ZXN0IFJlcXVlc3QlMDJ4IFZhbHVlJTA0eCBPZmZzZXQlMDR4XG4iLFJlcXVlc3QsVmFsdWUsSW5kZXgpKTsKKworCQlyZXR1cm4gLTE7CisJfQorCWVsc2UKKwl7CisjZGVmaW5lIE1BWF9SRVRSWV9DT1VOVCAgMTAKKworCQlpbnQgcmV0cnlDb3VudCA9IDA7CisJCXZvaWQJKnRtcEJ1ZiA9IFRyYW5zZmVyQnVmZmVyOworCisJCS8vIEFjcXVpcmUgQ29udHJvbCB0b2tlbgorI2lmZGVmIElORl9BTUFaT05fU0UKKwkJLy9TZW1hcGhvcmUgZml4IElORl9BTUFaT05fU0UgaGFuZworCQkvL3BBZC0+VXNiVmVuZG9yUmVxQnVmIGlzIHRoZSBzd2FwIGZvciBERVZJQ0VfVkVORE9SX1JFUVVFU1RfSU4gdG8gZml4IGRtYSBidWcuCisJCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmKHBBZC0+VXNiVmVuZG9yUmVxX3NlbWFwaG9yZSkpOworCQlpZiAocEFkLT5Vc2JWZW5kb3JSZXFCdWYpCisJCXsKKwkJCUFTU0VSVChUcmFuc2ZlckJ1ZmZlckxlbmd0aCA8TUFYX1BBUkFNX0JVRkZFUl9TSVpFKTsKKworCQkgICAJdG1wQnVmID0gKHZvaWQgKilwQWQtPlVzYlZlbmRvclJlcUJ1ZjsKKwkJICAgCU5kaXNaZXJvTWVtb3J5KHBBZC0+VXNiVmVuZG9yUmVxQnVmLCBUcmFuc2ZlckJ1ZmZlckxlbmd0aCk7CisKKwkJICAgCWlmIChSZXF1ZXN0VHlwZSA9PSBERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VUKQorCQkgICAJIE5kaXNNb3ZlTWVtb3J5KHRtcEJ1ZiwgVHJhbnNmZXJCdWZmZXIsIFRyYW5zZmVyQnVmZmVyTGVuZ3RoKTsKKwkJfQorI2VuZGlmIC8vIElORl9BTUFaT05fU0UgLy8KKwkJZG8geworCQlpZiggUmVxdWVzdFR5cGUgPT0gREVWSUNFX1ZFTkRPUl9SRVFVRVNUX09VVCkKKwkJCXJldD11c2JfY29udHJvbF9tc2cocE9iai0+cFVzYl9EZXYsIHVzYl9zbmRjdHJscGlwZSggcE9iai0+cFVzYl9EZXYsIDAgKSwgUmVxdWVzdCwgUmVxdWVzdFR5cGUsIFZhbHVlLEluZGV4LCB0bXBCdWYsIFRyYW5zZmVyQnVmZmVyTGVuZ3RoLCBDT05UUk9MX1RJTUVPVVRfSklGRklFUyk7CisJCWVsc2UgaWYoUmVxdWVzdFR5cGUgPT0gREVWSUNFX1ZFTkRPUl9SRVFVRVNUX0lOKQorCQkJcmV0PXVzYl9jb250cm9sX21zZyhwT2JqLT5wVXNiX0RldiwgdXNiX3JjdmN0cmxwaXBlKCBwT2JqLT5wVXNiX0RldiwgMCApLCBSZXF1ZXN0LCBSZXF1ZXN0VHlwZSwgVmFsdWUsSW5kZXgsIHRtcEJ1ZiwgVHJhbnNmZXJCdWZmZXJMZW5ndGgsIENPTlRST0xfVElNRU9VVF9KSUZGSUVTKTsKKwkJZWxzZQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJ2ZW5kb3IgcmVxdWVzdCBkaXJlY3Rpb24gaXMgZmFpbGVkXG4iKSk7CisJCQlyZXQgPSAtMTsKKwkJfQorCisJCQlyZXRyeUNvdW50Kys7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCXByaW50aygiI1xuIik7CisJCQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKKwkJCX0KKwkJfSB3aGlsZSgocmV0IDwgMCkgJiYgKHJldHJ5Q291bnQgPCBNQVhfUkVUUllfQ09VTlQpKTsKKworI2lmZGVmIElORl9BTUFaT05fU0UKKwkgIAlpZiAoKHBBZC0+VXNiVmVuZG9yUmVxQnVmKSAmJiAoUmVxdWVzdFR5cGUgPT0gREVWSUNFX1ZFTkRPUl9SRVFVRVNUX0lOKSkKKwkJCU5kaXNNb3ZlTWVtb3J5KFRyYW5zZmVyQnVmZmVyLCB0bXBCdWYsIFRyYW5zZmVyQnVmZmVyTGVuZ3RoKTsKKwkgIAl1cCgmKHBBZC0+VXNiVmVuZG9yUmVxX3NlbWFwaG9yZSkpOworI2VuZGlmIC8vIElORl9BTUFaT05fU0UgLy8KKworICAgICAgICBpZiAocmV0IDwgMCkgeworLy8JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJVU0JWZW5kb3JSZXF1ZXN0IGZhaWxlZCByZXQ9JWQgXG4iLHJldCkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRVU0JfVmVuZG9yUmVxdWVzdCBmYWlsZWQoJWQpLFR4RmxhZ3M9MHgleCwgUmVxVHlwZT0lcywgUmVxPTB4JXgsIEluZGV4PTB4JXhcbiIsCisJCQkJCQlyZXQsIFRyYW5zZmVyRmxhZ3MsIChSZXF1ZXN0VHlwZSA9PSBERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VUID8gIk9VVCIgOiAiSU4iKSwgUmVxdWVzdCwgSW5kZXgpKTsKKwkJCWlmIChSZXF1ZXN0ID09IDB4MikKKwkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJcdFJlcXVlc3QgVmFsdWU9MHglMDR4IVxuIiwgVmFsdWUpKTsKKworCQkJaWYgKChUcmFuc2ZlckJ1ZmZlciE9IE5VTEwpICYmIChUcmFuc2ZlckJ1ZmZlckxlbmd0aCA+IDApKQorCQkJCWhleF9kdW1wKCJGYWlsZWQgVHJhbnNmZXJCdWZmZXIgdmFsdWUiLCBUcmFuc2ZlckJ1ZmZlciwgVHJhbnNmZXJCdWZmZXJMZW5ndGgpOworICAgICAgICB9CisKKyNpZiAwCisgICAgICAgIC8vIHJldHJ5CisJCWlmIChyZXQgPCAwKSB7CisJCQlpbnQgdGVtcF9pPTA7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJVU0JWZW5kb3JSZXF1ZXN0IGZhaWxlZCByZXQ9JWQsIFxuIixyZXQpKTsKKwkJCXJldCA9IDA7CisJCQlkbworCQkJeworCQkJCWlmKCBSZXF1ZXN0VHlwZSA9PSBERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VUKQorCQkJCQlyZXQ9dXNiX2NvbnRyb2xfbXNnKHBPYmotPnBVc2JfRGV2LCB1c2Jfc25kY3RybHBpcGUoIHBPYmotPnBVc2JfRGV2LCAwICksIFJlcXVlc3QsIFJlcXVlc3RUeXBlLCBWYWx1ZSxJbmRleCwgVHJhbnNmZXJCdWZmZXIsIFRyYW5zZmVyQnVmZmVyTGVuZ3RoLCBDT05UUk9MX1RJTUVPVVRfSklGRklFUyk7CisJCQkJZWxzZSBpZihSZXF1ZXN0VHlwZSA9PSBERVZJQ0VfVkVORE9SX1JFUVVFU1RfSU4pCisJCQkJCXJldD11c2JfY29udHJvbF9tc2cocE9iai0+cFVzYl9EZXYsIHVzYl9yY3ZjdHJscGlwZSggcE9iai0+cFVzYl9EZXYsIDAgKSwgUmVxdWVzdCwgUmVxdWVzdFR5cGUsIFZhbHVlLEluZGV4LCBUcmFuc2ZlckJ1ZmZlciwgVHJhbnNmZXJCdWZmZXJMZW5ndGgsIENPTlRST0xfVElNRU9VVF9KSUZGSUVTKTsKKwkJCQl0ZW1wX2krKzsKKwkJCX0gd2hpbGUoIChyZXQgPCAwKSAmJiAodGVtcF9pIDw9IDEpICk7CisKKwkJCWlmKCByZXQgPj0gMCkKKwkJCQlyZXR1cm4gcmV0OworCisJCX0KKyNlbmRpZgorCisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCSAgQ3JlYXRlcyBhbiBJUlAgdG8gc3VibWl0ZSBhbiBJT0NUTF9JTlRFUk5BTF9VU0JfUkVTRVRfUE9SVAorCSAgc3luY2hyb25vdXNseS4gQ2FsbGVycyBvZiB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgcnVubmluZyBhdAorCSAgUEFTU0lWRSBMRVZFTC4KKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitOVFNUQVRVUwlSVFVTQl9SZXNldERldmljZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlOVFNUQVRVUwkJU3RhdHVzID0gVFJVRTsKKworCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCItLS0+VVNCX1Jlc2V0RGV2aWNlXG4iKSk7CisJLy9SVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyk7CisJcmV0dXJuIFN0YXR1czsKK30KKworVk9JRCBDTURIYW5kbGVyKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVBDbWRRRWxtdAkJY21kcWVsbXQ7CisJUFVDSEFSCQkJcERhdGE7CisJTkRJU19TVEFUVVMJCU5kaXNTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworLy8JVUxPTkcJCQlOb3cgPSAwOworCU5UU1RBVFVTCQludFN0YXR1czsKKy8vCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7CisKKwl3aGlsZSAocEFkLT5DbWRRLnNpemUgPiAwKQorCXsKKwkJTmRpc1N0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisKKwkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5DbWRRTG9jayk7CisJCVJUVVNCRGVxdWV1ZUNtZCgmcEFkLT5DbWRRLCAmY21kcWVsbXQpOworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKKworCQlpZiAoY21kcWVsbXQgPT0gTlVMTCkKKwkJCWJyZWFrOworCisJCXBEYXRhID0gY21kcWVsbXQtPmJ1ZmZlcjsKKworCQlpZighKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSB8fCBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpKQorCQl7CisJCQlzd2l0Y2ggKGNtZHFlbG10LT5jb21tYW5kKQorCQkJeworCQkJCWNhc2UgQ01EVEhSRUFEX0NIRUNLX0dQSU86CisJCQkJCXsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQkJCVVJTlQzMiBkYXRhOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworI2lmZGVmIFJBTElOS19BVEUKKyAgICAgICAJCQkJCWlmKEFURV9PTihwQWQpKQorCQkJCQkJeworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRoZSBkcml2ZXIgaXMgaW4gQVRFIG1vZGUgbm93XG4iKSk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisKKworCQkJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQkJCXsKKwkJCQkJCQkvLyBSZWFkIEdQSU8gcGluMiBhcyBIYXJkd2FyZSBjb250cm9sbGVkIHJhZGlvIHN0YXRlCisKKwkJCQkJCQlSVFVTQlJlYWRNQUNSZWdpc3RlciggcEFkLCBHUElPX0NUUkxfQ0ZHLCAmZGF0YSk7CisKKwkJCQkJCQlpZiAoZGF0YSAmIDB4MDQpCisJCQkJCQkJeworCQkJCQkJCQlwQWQtPlN0YUNmZy5iSHdSYWRpbyA9IFRSVUU7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCXBBZC0+U3RhQ2ZnLmJId1JhZGlvID0gRkFMU0U7CisJCQkJCQkJfQorCisJCQkJCQkJaWYocEFkLT5TdGFDZmcuYlJhZGlvICE9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbykpCisJCQkJCQkJeworCQkJCQkJCQlwQWQtPlN0YUNmZy5iUmFkaW8gPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pOworCQkJCQkJCQlpZihwQWQtPlN0YUNmZy5iUmFkaW8gPT0gVFJVRSkKKwkJCQkJCQkJeworCQkJCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIiEhISBSYWRpbyBPbiAhISFcbiIpKTsKKworCQkJCQkJCQkJTWxtZVJhZGlvT24ocEFkKTsKKwkJCQkJCQkJCS8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbgorCQkJCQkJCQkJcEFkLT5FeHRyYUluZm8gPSBFWFRSQV9JTkZPX0NMRUFSOworCQkJCQkJCQl9CisJCQkJCQkJCWVsc2UKKwkJCQkJCQkJeworCQkJCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIiEhISBSYWRpbyBPZmYgISEhXG4iKSk7CisKKwkJCQkJCQkJCU1sbWVSYWRpb09mZihwQWQpOworCQkJCQkJCQkJLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uCisJCQkJCQkJCQlwQWQtPkV4dHJhSW5mbyA9IEhXX1JBRElPX09GRjsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCQkJfQorCQkJCQlicmVhazsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCWNhc2UgQ01EVEhSRUFEX1FLRVJJT0RJQ19FWEVDVVQ6CisJCQkJCXsKKwkJCQkJCVN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMoTlVMTCwgcEFkLCBOVUxMLCBOVUxMKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkJCWNhc2UgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VUOgorCQkJCQl7CisJCQkJCQlVSU5UMzIJCU1BQ1ZhbHVlOworCQkJCQkJVUNIQVIJCUluZGV4OworCQkJCQkJaW50CQkJcmV0PTA7CisJCQkJCQlQSFRfVFhfQ09OVEVYVAlwSFRUWENvbnRleHQ7CisvLwkJCQkJCVJUTVBfVFhfUklORyAqcFR4UmluZzsKKwkJCQkJCXVuc2lnbmVkIGxvbmcgSXJxRmxhZ3M7CisjaWZkZWYgUkFMSU5LX0FURQorCQkJCQkJUFRYX0NPTlRFWFQJCXBOdWxsQ29udGV4dCA9ICYocEFkLT5OdWxsQ29udGV4dCk7CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkNtZFRocmVhZCA6IENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVChSZXNldFBpcGVpZD0weCUweCk9PT0+XG4iLCBwQWQtPmJ1bGtSZXNldFBpcGVpZCkpOworCQkJCQkJLy8gQWxsIHRyYW5zZmVycyBtdXN0IGJlIGFib3J0ZWQgb3IgY2FuY2VsbGVkIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHJlc2V0IHRoZSBwaXBlLgorCQkJCQkJLy9SVFVTQkNhbmNlbFBlbmRpbmdCdWxrT3V0SVJQKHBBZCk7CisJCQkJCQkvLyBXYWl0IDEwbXMgdG8gbGV0IHByZXZpb3VzIHBhY2tldCB0aGF0IGFyZSBhbHJlYWR5IGluIEhXIEZJRk8gdG8gY2xlYXIuIGJ5IE1BWExFRSAxMi0yNS0yMDA3CisJCQkJCQlJbmRleCA9IDA7CisJCQkJCQlkbworCQkJCQkJeworCQkJCQkJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgVFhSWFFfUENOVCwgJk1BQ1ZhbHVlKTsKKwkJCQkJCQlpZiAoKE1BQ1ZhbHVlICYgMHhmMDAwMDAvKjB4ODAwMDAwKi8pID09IDApCisJCQkJCQkJCWJyZWFrOworCQkJCQkJCUluZGV4Kys7CisJCQkJCQkJUlRNUHVzZWNEZWxheSgxMDAwMCk7CisJCQkJCQl9d2hpbGUoSW5kZXggPCAxMDApOworCQkJCQkJTUFDVmFsdWUgPSAwOworCQkJCQkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBVU0JfRE1BX0NGRywgJk1BQ1ZhbHVlKTsKKwkJCQkJCS8vIFRvIHByZXZlbnQgUmVhZCBSZWdpc3RlciBlcnJvciwgd2UgMm5kIGNoZWNrIHRoZSB2YWxpZGl0eS4KKwkJCQkJCWlmICgoTUFDVmFsdWUgJiAweGMwMDAwMCkgPT0gMCkKKwkJCQkJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIFVTQl9ETUFfQ0ZHLCAmTUFDVmFsdWUpOworCQkJCQkJLy8gVG8gcHJldmVudCBSZWFkIFJlZ2lzdGVyIGVycm9yLCB3ZSAzcmQgY2hlY2sgdGhlIHZhbGlkaXR5LgorCQkJCQkJaWYgKChNQUNWYWx1ZSAmIDB4YzAwMDAwKSA9PSAwKQorCQkJCQkJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgVVNCX0RNQV9DRkcsICZNQUNWYWx1ZSk7CisJCQkJCQlNQUNWYWx1ZSB8PSAweDgwMDAwOworCQkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgVVNCX0RNQV9DRkcsIE1BQ1ZhbHVlKTsKKworCQkJCQkJLy8gV2FpdCAxbXMgdG8gcHJldmVudCBuZXh0IFVSQiB0byBidWxrb3V0IGJlZm9yZSBIVyByZXNldC4gYnkgTUFYTEVFIDEyLTI1LTIwMDcKKwkJCQkJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisKKwkJCQkJCU1BQ1ZhbHVlICY9ICh+MHg4MDAwMCk7CisJCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBVU0JfRE1BX0NGRywgTUFDVmFsdWUpOworCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIlx0U2V0IDB4MmEwIGJpdDE5LiBDbGVhciBVU0IgRE1BIFRYIHBhdGhcbiIpKTsKKworCQkJCQkJLy8gV2FpdCA1bXMgdG8gcHJldmVudCBuZXh0IFVSQiB0byBidWxrb3V0IGJlZm9yZSBIVyByZXNldC4gYnkgTUFYTEVFIDEyLTI1LTIwMDcKKwkJCQkJCS8vUlRNUHVzZWNEZWxheSg1MDAwKTsKKworCQkJCQkJaWYgKChwQWQtPmJ1bGtSZXNldFBpcGVpZCAmIEJVTEtPVVRfTUdNVF9SRVNFVF9GTEFHKSA9PSBCVUxLT1VUX01HTVRfUkVTRVRfRkxBRykKKwkJCQkJCXsKKwkJCQkJCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpOworCQkJCQkJCWlmIChwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4IDwgTUdNVF9SSU5HX1NJWkUgLyogcE1MTUVDb250ZXh0LT5iV2FpdGluZ0J1bGtPdXQgPT0gVFJVRSAqLykKKwkJCQkJCQl7CisJCQkJCQkJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfTUxNRSk7CisJCQkJCQkJfQorCQkJCQkJCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKKworCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJcdFRYIE1HTVQgUkVDT1ZFUiBEb25lIVxuIikpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCXBIVFRYQ29udGV4dCA9ICYocEFkLT5UeENvbnRleHRbcEFkLT5idWxrUmVzZXRQaXBlaWRdKTsKKwkJCQkJCQkvL05kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbcEFkLT5idWxrUmVzZXRQaXBlaWRdKTsKKwkJCQkJCQlSVE1QX0lOVF9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSwgSXJxRmxhZ3MpOworCQkJCQkJCWlmICggcEFkLT5CdWxrT3V0UGVuZGluZ1twQWQtPmJ1bGtSZXNldFBpcGVpZF0gPT0gRkFMU0UpCisJCQkJCQkJeworCQkJCQkJCQlwQWQtPkJ1bGtPdXRQZW5kaW5nW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSA9IFRSVUU7CisJCQkJCQkJCXBIVFRYQ29udGV4dC0+SVJQUGVuZGluZyA9IFRSVUU7CisJCQkJCQkJCXBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbcEFkLT5idWxrUmVzZXRQaXBlaWRdID0gMTsKKworCQkJCQkJCQkvLyBubyBtYXR0ZXIgd2hhdCwgY2xlYW4gdGhlIGZsYWcKKwkJCQkJCQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKTsKKworCQkJCQkJCQkvL05kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbcEFkLT5idWxrUmVzZXRQaXBlaWRdKTsKKwkJCQkJCQkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSwgSXJxRmxhZ3MpOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgUkFMSU5LX0FURQorCQkJCQkJCQlpZihBVEVfT04ocEFkKSkKKwkJCQkJCQkgICAgeworCQkJCQkJCQkJcE51bGxDb250ZXh0LT5JUlBQZW5kaW5nID0gVFJVRTsKKwkJCQkJCQkJCS8vCisJCQkJCQkJCQkvLyBJZiBkcml2ZXIgaXMgc3RpbGwgaW4gQVRFIFRYRlJBTUUgbW9kZSwKKwkJCQkJCQkJCS8vIGtlZXAgb24gdHJhbnNtaXR0aW5nIEFURSBmcmFtZXMuCisJCQkJCQkJCQkvLworCQkJCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoInBBZC0+YXRlLk1vZGUgPT0gJWRcbnBBZC0+Q29udGluQnVsa091dCA9PSAlZFxucEFkLT5CdWxrT3V0UmVtYWluZWQgPT0gJWRcbiIsIHBBZC0+YXRlLk1vZGUsIHBBZC0+Q29udGluQnVsa091dCwgYXRvbWljX3JlYWQoJnBBZC0+QnVsa091dFJlbWFpbmVkKSkpOworCQkJCQkJCQkJaWYoKHBBZC0+YXRlLk1vZGUgPT0gQVRFX1RYRlJBTUUpICYmICgocEFkLT5Db250aW5CdWxrT3V0ID09IFRSVUUpIHx8IChhdG9taWNfcmVhZCgmcEFkLT5CdWxrT3V0UmVtYWluZWQpID4gMCkpKQorCQkJCQkJCQkgICAgeworCQkJCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJBZnRlciBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQsIGNvbnRpbnVlIHRvIGJ1bGsgb3V0IGZyYW1lcyAhXG4iKSk7CisKKwkJCQkJCQkJCQkvLyBJbml0IFR4IGNvbnRleHQgZGVzY3JpcHRvcgorCQkJCQkJCQkJCVJUVVNCSW5pdFR4RGVzYyhwQWQsIHBOdWxsQ29udGV4dCwgMC8qIHBBZC0+YnVsa1Jlc2V0UGlwZWlkICovLCAodXNiX2NvbXBsZXRlX3QpQVRFX1JUVVNCQnVsa091dERhdGFQYWNrZXRDb21wbGV0ZSk7CisKKwkJCQkJCQkJCQlpZigocmV0ID0gUlRVU0JfU1VCTUlUX1VSQihwTnVsbENvbnRleHQtPnBVcmIpKSE9MCkKKwkJCQkJCQkJCQl7CisJCQkJCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFURV9SVFVTQkJ1bGtPdXREYXRhUGFja2V0OiBTdWJtaXQgVHggVVJCIGZhaWxlZCAlZFxuIiwgcmV0KSk7CisJCQkJCQkJCQkJfQorCisJCQkJCQkJCQkJcEFkLT5CdWxrT3V0UmVxKys7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQkJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCQkJCQkJCQl7CisJCQkJCQkJCVJUVVNCSW5pdEhUVHhEZXNjKHBBZCwgcEhUVFhDb250ZXh0LCBwQWQtPmJ1bGtSZXNldFBpcGVpZCwgcEhUVFhDb250ZXh0LT5CdWxrT3V0U2l6ZSwgKHVzYl9jb21wbGV0ZV90KVJUVVNCQnVsa091dERhdGFQYWNrZXRDb21wbGV0ZSk7CisKKwkJCQkJCQkJaWYoKHJldCA9IFJUVVNCX1NVQk1JVF9VUkIocEhUVFhDb250ZXh0LT5wVXJiKSkhPTApCisJCQkJCQkJCXsKKwkJCQkJCQkJCQlSVE1QX0lOVF9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSwgSXJxRmxhZ3MpOworCQkJCQkJCQkJcEFkLT5CdWxrT3V0UGVuZGluZ1twQWQtPmJ1bGtSZXNldFBpcGVpZF0gPSBGQUxTRTsKKwkJCQkJCQkJCXBIVFRYQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCQkJCQkJCQkJCXBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbcEFkLT5idWxrUmVzZXRQaXBlaWRdID0gMDsKKwkJCQkJCQkJCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbcEFkLT5idWxrUmVzZXRQaXBlaWRdLCBJcnFGbGFncyk7CisKKwkJCQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJDbWRUaHJlYWQgOiBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQ6IFN1Ym1pdCBUeCBVUkIgZmFpbGVkICVkXG4iLCByZXQpKTsKKwkJCQkJCQkJfQorCQkJCQkJCQkJZWxzZQorCQkJCQkJCQkJeworCQkJCQkJCQkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbcEFkLT5idWxrUmVzZXRQaXBlaWRdLCBJcnFGbGFncyk7CisJCQkJCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiXHRDTURUSFJFQURfUkVTRVRfQlVMS19PVVQ6IFR4Q29udGV4dFslZF06Q1dQb3M9JWxkLCBOQlBvcz0lbGQsIEVOQlBvcz0lbGQsIGJDb3B5PSVkLCBwZW5kaW5nPSVkIVxuIiwKKwkJCQkJCQkJCQkJCXBBZC0+YnVsa1Jlc2V0UGlwZWlkLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sIHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiwKKwkJCQkJCQkJCQkJCQkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkLCBwQWQtPkJ1bGtPdXRQZW5kaW5nW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSkpOworCQkJCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIlx0XHRCdWxrT3V0IFJlcT0weCVseCwgQ29tcGxldGU9MHglbHgsIE90aGVyPTB4JWx4XG4iLAorCQkJCQkJCQkJCQkJCQkJcEFkLT5CdWxrT3V0UmVxLCBwQWQtPkJ1bGtPdXRDb21wbGV0ZSwgcEFkLT5CdWxrT3V0Q29tcGxldGVPdGhlcikpOworCQkJCQkJCQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1twQWQtPmJ1bGtSZXNldFBpcGVpZF0sIElycUZsYWdzKTsKKwkJCQkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiXHRDTURUSFJFQURfUkVTRVRfQlVMS19PVVQ6IFN1Ym1pdCBUeCBEQVRBIFVSQiBmb3IgZmFpbGVkIEJ1bGtSZXEoMHglbHgpIERvbmUsIHN0YXR1cz0lZCFcbiIsIHBBZC0+YnVsa1Jlc2V0UmVxW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSwgcEhUVFhDb250ZXh0LT5wVXJiLT5zdGF0dXMpKTsKKworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCS8vTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5CdWxrT3V0TG9ja1twQWQtPmJ1bGtSZXNldFBpcGVpZF0pOworCQkJCQkJCQkvL1JUTVBfSU5UX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1twQWQtPmJ1bGtSZXNldFBpcGVpZF0sIElycUZsYWdzKTsKKworCQkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQ21kVGhyZWFkIDogVFggREFUQSBSRUNPVkVSIEZBSUwgZm9yIEJ1bGtSZXEoMHglbHgpIGJlY2F1c2UgQnVsa091dFBlbmRpbmdbJWRdIGlzIFRSVUUhXG4iLCBwQWQtPmJ1bGtSZXNldFJlcVtwQWQtPmJ1bGtSZXNldFBpcGVpZF0sIHBBZC0+YnVsa1Jlc2V0UGlwZWlkKSk7CisJCQkJCQkJCWlmIChwQWQtPmJ1bGtSZXNldFBpcGVpZCA9PSAwKQorCQkJCQkJCQl7CisJCQkJCQkJCQlVQ0hBUglwZW5kaW5nQ29udGV4dCA9IDA7CisJCQkJCQkJCQlQSFRfVFhfQ09OVEVYVCBwSFRUWENvbnRleHQgPSAoUEhUX1RYX0NPTlRFWFQpKCZwQWQtPlR4Q29udGV4dFtwQWQtPmJ1bGtSZXNldFBpcGVpZCBdKTsKKwkJCQkJCQkJCVBUWF9DT05URVhUIHBNTE1FQ29udGV4dCA9IChQVFhfQ09OVEVYVCkocEFkLT5NZ210UmluZy5DZWxsW3BBZC0+TWdtdFJpbmcuVHhEbWFJZHhdLkFsbG9jVmEpOworCQkJCQkJCQkJUFRYX0NPTlRFWFQgcE5VTExDb250ZXh0ID0gKFBUWF9DT05URVhUKSgmcEFkLT5Qc1BvbGxDb250ZXh0KTsKKwkJCQkJCQkJCVBUWF9DT05URVhUIHBQc1BvbGxDb250ZXh0ID0gKFBUWF9DT05URVhUKSgmcEFkLT5OdWxsQ29udGV4dCk7CisKKwkJCQkJCQkJCWlmIChwSFRUWENvbnRleHQtPklSUFBlbmRpbmcpCisJCQkJCQkJCQkJcGVuZGluZ0NvbnRleHQgfD0gMTsKKwkJCQkJCQkJCWVsc2UgaWYgKHBNTE1FQ29udGV4dC0+SVJQUGVuZGluZykKKwkJCQkJCQkJCQlwZW5kaW5nQ29udGV4dCB8PSAyOworCQkJCQkJCQkJZWxzZSBpZiAocE5VTExDb250ZXh0LT5JUlBQZW5kaW5nKQorCQkJCQkJCQkJCXBlbmRpbmdDb250ZXh0IHw9IDQ7CisJCQkJCQkJCQllbHNlIGlmIChwUHNQb2xsQ29udGV4dC0+SVJQUGVuZGluZykKKwkJCQkJCQkJCQlwZW5kaW5nQ29udGV4dCB8PSA4OworCQkJCQkJCQkJZWxzZQorCQkJCQkJCQkJCXBlbmRpbmdDb250ZXh0ID0gMDsKKworCQkJCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIlx0VFggT2NjdXBpZWQgYnkgJWQhXG4iLCBwZW5kaW5nQ29udGV4dCkpOworCQkJCQkJCQl9CisKKwkJCQkJCQkvLyBubyBtYXR0ZXIgd2hhdCwgY2xlYW4gdGhlIGZsYWcKKwkJCQkJCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpOworCisJCQkJCQkJCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1twQWQtPmJ1bGtSZXNldFBpcGVpZF0sIElycUZsYWdzKTsKKworCQkJCQkJCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCBwQWQtPmJ1bGtSZXNldFBpcGVpZCkpOworCQkJCQkJCX0KKworCQkJCQkJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7CisJCQkJCQkJLy9SVFVTQktpY2tCdWxrT3V0KHBBZCk7CisJCQkJCQl9CisKKwkJCQkJfQorCQkJCQkvKgorCQkJCQkJLy8gRG9uJ3QgY2FuY2VsIEJVTEtJTi4KKwkJCQkJCXdoaWxlICgoYXRvbWljX3JlYWQoJnBBZC0+UGVuZGluZ1J4KSA+IDApICYmCisJCQkJCQkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKKwkJCQkJCXsKKwkJCQkJCQlpZiAoYXRvbWljX3JlYWQoJnBBZC0+UGVuZGluZ1J4KSA+IDApCisJCQkJCQkJeworCQkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsa0luIElSUCBQZW5kaW5nISFjYW5jZWwgaXQhXG4iKSk7CisJCQkJCQkJCVJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUChwQWQpOworCQkJCQkJCX0KKwkJCQkJCQlSVE1QdXNlY0RlbGF5KDEwMDAwMCk7CisJCQkJCQl9CisKKwkJCQkJCWlmICgoYXRvbWljX3JlYWQoJnBBZC0+UGVuZGluZ1J4KSA9PSAwKSAmJiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkpCisJCQkJCQl7CisJCQkJCQkJVUNIQVIJaTsKKwkJCQkJCQlSVFVTQlJ4UGFja2V0KHBBZCk7CisJCQkJCQkJcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXggPSAwOwkvLyBOZXh0IFJ4IFJlYWQgaW5kZXgKKwkJCQkJCQlwQWQtPk5leHRSeEJ1bGtJbkluZGV4CQk9IDA7CS8vIFJ4IEJ1bGsgcG9pbnRlcgorCQkJCQkJCWZvciAoaSA9IDA7IGkgPCAoUlhfUklOR19TSVpFKTsgaSsrKQorCQkJCQkJCXsKKwkJCQkJCQkJUFJYX0NPTlRFWFQgIHBSeENvbnRleHQgPSAmKHBBZC0+UnhDb250ZXh0W2ldKTsKKworCQkJCQkJCQlwUnhDb250ZXh0LT5wQWQJPSBwQWQ7CisJCQkJCQkJCXBSeENvbnRleHQtPkluVXNlCQk9IEZBTFNFOworCQkJCQkJCQlwUnhDb250ZXh0LT5JUlBQZW5kaW5nCT0gRkFMU0U7CisJCQkJCQkJCXBSeENvbnRleHQtPlJlYWRhYmxlCT0gRkFMU0U7CisJCQkJCQkJCXBSeENvbnRleHQtPlJlb3JkZXJJblVzZSA9IEZBTFNFOworCisJCQkJCQkJfQorCQkJCQkJCVJUVVNCQnVsa1JlY2VpdmUocEFkKTsKKwkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiUlRVU0JCdWxrUmVjZWl2ZVxuIikpOworCQkJCQkJfSovCisJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJDbWRUaHJlYWQgOiBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQ8PT09XG4iKSk7CisgICAgCSAgIAkJCWJyZWFrOworCisJCQkJY2FzZSBDTURUSFJFQURfUkVTRVRfQlVMS19JTjoKKwkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkNtZFRocmVhZCA6IENNRFRIUkVBRF9SRVNFVF9CVUxLX0lOID09PSA+XG4iKSk7CisKKwkJCQkJLy8gQWxsIHRyYW5zZmVycyBtdXN0IGJlIGFib3J0ZWQgb3IgY2FuY2VsbGVkIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHJlc2V0IHRoZSBwaXBlLgorCQkJCQl7CisJCQkJCQlVSU5UMzIJCU1BQ1ZhbHVlOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgUkFMSU5LX0FURQorCQkJCQkJaWYgKEFURV9PTihwQWQpKQorCQkJCQkJeworCQkJCQkJCWlmKChwQWQtPlBlbmRpbmdSeCA+IDApICYmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKKwkJCQkJCQl7CisJCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJBVEUgOiBCdWxrSW4gSVJQIFBlbmRpbmchISFcbiIpKTsKKwkJCQkJCQkJQVRFX1JUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUChwQWQpOworCQkJCQkJCQlSVE1QdXNlY0RlbGF5KDEwMDAwMCk7CisJCQkJCQkJCXBBZC0+UGVuZGluZ1J4ID0gMDsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQllbHNlCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJCQkJCQl7CisJCQkJCQkvL3doaWxlICgoYXRvbWljX3JlYWQoJnBBZC0+UGVuZGluZ1J4KSA+IDApICYmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKKwkJCQkJCWlmKChwQWQtPlBlbmRpbmdSeCA+IDApICYmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKKwkJCQkJCXsKKwkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsa0luIElSUCBQZW5kaW5nISEhXG4iKSk7CisJCQkJCQkJUlRVU0JDYW5jZWxQZW5kaW5nQnVsa0luSVJQKHBBZCk7CisJCQkJCQkJUlRNUHVzZWNEZWxheSgxMDAwMDApOworCQkJCQkJCXBBZC0+UGVuZGluZ1J4ID0gMDsKKwkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQkJLy8gV2FpdCAxMG1zIGJlZm9yZSByZWFkaW5nIHJlZ2lzdGVyLgorCQkJCQkJUlRNUHVzZWNEZWxheSgxMDAwMCk7CisJCQkJCQludFN0YXR1cyA9IFJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgTUFDX0NTUjAsICZNQUNWYWx1ZSk7CisKKwkJCQkJCWlmICgoTlRfU1VDQ0VTUyhudFN0YXR1cykgPT0gVFJVRSkgJiYKKwkJCQkJCQkoIShSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfAorCQkJCQkJCQkJCQkJCWZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKSkpCisJCQkJCQl7CisJCQkJCQkJVUNIQVIJaTsKKworCQkJCQkJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfAorCQkJCQkJCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJcEFkLT5OZXh0UnhCdWxrSW5Qb3NpdGlvbiA9IHBBZC0+UnhDb250ZXh0W3BBZC0+TmV4dFJ4QnVsa0luSW5kZXhdLkJ1bGtJbk9mZnNldDsKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCVUxLX0lOX1JFU0VUOiBOQklJZHg9MHgleCxOQklSSWR4PTB4JXgsIEJJUlBvcz0weCVseC4gQklSZXE9eCVseCwgQklDb21wbGV0ZT0weCVseCwgQklDRmFpbDB4JWx4XG4iLAorCQkJCQkJCQkJcEFkLT5OZXh0UnhCdWxrSW5JbmRleCwgIHBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4LCBwQWQtPk5leHRSeEJ1bGtJblBvc2l0aW9uLCBwQWQtPkJ1bGtJblJlcSwgcEFkLT5CdWxrSW5Db21wbGV0ZSwgcEFkLT5CdWxrSW5Db21wbGV0ZUZhaWwpKTsKKwkJCQkJCQlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspCisJCQkJCQkJeworIAkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiXHRSeENvbnRleHRbJWRdOiBJUlBQZW5kaW5nPSVkLCBJblVzZT0lZCwgUmVhZGFibGU9JWQhXG4iCisJCQkJCQkJCQksIGksIHBBZC0+UnhDb250ZXh0W2ldLklSUFBlbmRpbmcsIHBBZC0+UnhDb250ZXh0W2ldLkluVXNlLCBwQWQtPlJ4Q29udGV4dFtpXS5SZWFkYWJsZSkpOworCQkJCQkJCX0KKyAJCQkJCQkJLyoKKworCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpKTsKKworCQkJCQkJCXBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4ID0gMDsJLy8gTmV4dCBSeCBSZWFkIGluZGV4CisJCQkJCQkJcEFkLT5OZXh0UnhCdWxrSW5JbmRleAkJPSAwOwkvLyBSeCBCdWxrIHBvaW50ZXIKKwkJCQkJCQlmb3IgKGkgPSAwOyBpIDwgKFJYX1JJTkdfU0laRSk7IGkrKykKKwkJCQkJCQl7CisJCQkJCQkJCVBSWF9DT05URVhUICBwUnhDb250ZXh0ID0gJihwQWQtPlJ4Q29udGV4dFtpXSk7CisKKwkJCQkJCQkJcFJ4Q29udGV4dC0+cEFkCT0gcEFkOworCQkJCQkJCQlwUnhDb250ZXh0LT5JblVzZQkJPSBGQUxTRTsKKwkJCQkJCQkJcFJ4Q29udGV4dC0+SVJQUGVuZGluZwk9IEZBTFNFOworCQkJCQkJCQlwUnhDb250ZXh0LT5SZWFkYWJsZQk9IEZBTFNFOworCQkJCQkJCQlwUnhDb250ZXh0LT5SZW9yZGVySW5Vc2UgPSBGQUxTRTsKKworCQkJCQkJCX0qLworCQkJCQkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS0lOX1JFU0VUKTsKKwkJCQkJCQlmb3IgKGkgPSAwOyBpIDwgcEFkLT5Db21tb25DZmcuTnVtT2ZCdWxrSW5JUlA7IGkrKykKKwkJCQkJCQl7CisJCQkJCQkJCS8vUlRVU0JCdWxrUmVjZWl2ZShwQWQpOworCQkJCQkJCQlQUlhfQ09OVEVYVAkJcFJ4Q29udGV4dDsKKwkJCQkJCQkJUFVSQgkJCXBVcmI7CisJCQkJCQkJCWludAkJCQlyZXQgPSAwOworCQkJCQkJCQl1bnNpZ25lZCBsb25nCUlycUZsYWdzOworCisKKwkJCQkJCQkJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisJCQkJCQkJCXBSeENvbnRleHQgPSAmKHBBZC0+UnhDb250ZXh0W3BBZC0+TmV4dFJ4QnVsa0luSW5kZXhdKTsKKwkJCQkJCQkJaWYgKChwQWQtPlBlbmRpbmdSeCA+IDApIHx8IChwUnhDb250ZXh0LT5SZWFkYWJsZSA9PSBUUlVFKSB8fCAocFJ4Q29udGV4dC0+SW5Vc2UgPT0gVFJVRSkpCisJCQkJCQkJCXsKKwkJCQkJCQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJfQorCQkJCQkJCQlwUnhDb250ZXh0LT5JblVzZSA9IFRSVUU7CisJCQkJCQkJCXBSeENvbnRleHQtPklSUFBlbmRpbmcgPSBUUlVFOworCQkJCQkJCQlwQWQtPlBlbmRpbmdSeCsrOworCQkJCQkJCQlwQWQtPkJ1bGtJblJlcSsrOworCQkJCQkJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOworCisJCQkJCQkJCS8vIEluaXQgUnggY29udGV4dCBkZXNjcmlwdG9yCisJCQkJCQkJCVJUVVNCSW5pdFJ4RGVzYyhwQWQsIHBSeENvbnRleHQpOworCQkJCQkJCQlwVXJiID0gcFJ4Q29udGV4dC0+cFVyYjsKKwkJCQkJCQkJaWYgKChyZXQgPSBSVFVTQl9TVUJNSVRfVVJCKHBVcmIpKSE9MCkKKwkJCQkJCQkJewkvLyBmYWlsCisKKwkJCQkJCQkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOworCQkJCQkJCQkJcFJ4Q29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKKwkJCQkJCQkJCXBSeENvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwkJCQkJCQkJCXBBZC0+UGVuZGluZ1J4LS07CisJCQkJCQkJCQlwQWQtPkJ1bGtJblJlcS0tOworCQkJCQkJCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKwkJCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkNNRFRIUkVBRF9SRVNFVF9CVUxLX0lOOiBTdWJtaXQgUnggVVJCIGZhaWxlZCglZCksIHN0YXR1cz0lZFxuIiwgcmV0LCBwVXJiLT5zdGF0dXMpKTsKKwkJCQkJCQkJfQorCQkJCQkJCQllbHNlCisJCQkJCQkJCXsJLy8gc3VjY2VzcworI2lmIDAKKwkJCQkJCQkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOworCQkJCQkJCQkJcFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9IFRSVUU7CisJCQkJCQkJCQkvL05kaXNJbnRlcmxvY2tlZEluY3JlbWVudCgmcEFkLT5QZW5kaW5nUngpOworCQkJCQkJCQkJcEFkLT5QZW5kaW5nUngrKzsKKwkJCQkJCQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisJCQkJCQkJCQlwQWQtPkJ1bGtJblJlcSsrOworI2VuZGlmCisJCQkJCQkJCQkvL3ByaW50aygiQklEb25lLCBQZW5kPSVkLEJJSWR4PSVkLEJJUklkeD0lZCFcbiIsIHBBZC0+UGVuZGluZ1J4LCBwQWQtPk5leHRSeEJ1bGtJbkluZGV4LCBwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleCk7CisJCQkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQ01EVEhSRUFEX1JFU0VUX0JVTEtfSU46IFN1Ym1pdCBSeCBVUkIgRG9uZSwgc3RhdHVzPSVkIVxuIiwgcFVyYi0+c3RhdHVzKSk7CisJCQkJCQkJCQlBU1NFUlQoKHBSeENvbnRleHQtPkluVXNlID09IHBSeENvbnRleHQtPklSUFBlbmRpbmcpKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCS8vIENhcmQgbXVzdCBiZSByZW1vdmVkCisJCQkJCQkJaWYgKE5UX1NVQ0NFU1MobnRTdGF0dXMpICE9IFRSVUUpCisJCQkJCQkJeworCQkJCQkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpOworCQkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQ01EVEhSRUFEX1JFU0VUX0JVTEtfSU46IFJlYWQgUmVnaXN0ZXIgRmFpbGVkIUNhcmQgbXVzdCBiZSByZW1vdmVkISFcblxuIikpOworCQkJCQkJCX0KKwkJCQkJCQllbHNlCisJCQkJCQkJeworCQkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQ01EVEhSRUFEX1JFU0VUX0JVTEtfSU46IENhbm5vdCBkbyBidWxrIGluIGJlY2F1c2UgZmxhZ3MoMHglbHgpIG9uICFcbiIsIHBBZC0+RmxhZ3MpKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQl9CisJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJDbWRUaHJlYWQgOiBDTURUSFJFQURfUkVTRVRfQlVMS19JTiA8PT09XG4iKSk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBDTURUSFJFQURfU0VUX0FTSUNfV0NJRDoKKwkJCQkJeworCQkJCQkJUlRfU0VUX0FTSUNfV0NJRAlTZXRBc2ljV2NpZDsKKwkJCQkJCVVTSE9SVAkJb2Zmc2V0OworCQkJCQkJVUlOVDMyCQlNQUNWYWx1ZSwgTUFDUlZhbHVlID0gMDsKKwkJCQkJCVNldEFzaWNXY2lkID0gKigoUFJUX1NFVF9BU0lDX1dDSUQpKHBEYXRhKSk7CisKKwkJCQkJCWlmIChTZXRBc2ljV2NpZC5XQ0lEID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCQkJCQkJCXJldHVybjsKKworCQkJCQkJb2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArICgoVUNIQVIpU2V0QXNpY1djaWQuV0NJRCkqSFdfV0NJRF9FTlRSWV9TSVpFOworCisJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQ21kVGhyZWFkIDogQ01EVEhSRUFEX1NFVF9BU0lDX1dDSUQgOiBXQ0lEID0gJWxkLCBTZXRUaWQgID0gJWx4LCBEZWxldGVUaWQgPSAlbHguXG4iLCBTZXRBc2ljV2NpZC5XQ0lELCBTZXRBc2ljV2NpZC5TZXRUaWQsIFNldEFzaWNXY2lkLkRlbGV0ZVRpZCkpOworCQkJCQkJTUFDVmFsdWUgPSAocEFkLT5NYWNUYWIuQ29udGVudFtTZXRBc2ljV2NpZC5XQ0lEXS5BZGRyWzNdPDwyNCkrKHBBZC0+TWFjVGFiLkNvbnRlbnRbU2V0QXNpY1djaWQuV0NJRF0uQWRkclsyXTw8MTYpKyhwQWQtPk1hY1RhYi5Db250ZW50W1NldEFzaWNXY2lkLldDSURdLkFkZHJbMV08PDgpKyhwQWQtPk1hY1RhYi5Db250ZW50W1NldEFzaWNXY2lkLldDSURdLkFkZHJbMF0pOworCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIjEtTUFDVmFsdWU9ICV4LFxuIiwgTUFDVmFsdWUpKTsKKwkJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIG9mZnNldCwgTUFDVmFsdWUpOworCQkJCQkJLy8gUmVhZCBiaXRtYXNrCisJCQkJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIG9mZnNldCs0LCAmTUFDUlZhbHVlKTsKKwkJCQkJCWlmICggU2V0QXNpY1djaWQuRGVsZXRlVGlkICE9IDB4ZmZmZmZmZmYpCisJCQkJCQkJTUFDUlZhbHVlICY9ICh+U2V0QXNpY1djaWQuRGVsZXRlVGlkKTsKKwkJCQkJCWlmIChTZXRBc2ljV2NpZC5TZXRUaWQgIT0gMHhmZmZmZmZmZikKKwkJCQkJCQlNQUNSVmFsdWUgfD0gKFNldEFzaWNXY2lkLlNldFRpZCk7CisJCQkJCQlNQUNSVmFsdWUgJj0gMHhmZmZmMDAwMDsKKworCQkJCQkJTUFDVmFsdWUgPSAocEFkLT5NYWNUYWIuQ29udGVudFtTZXRBc2ljV2NpZC5XQ0lEXS5BZGRyWzVdPDw4KStwQWQtPk1hY1RhYi5Db250ZW50W1NldEFzaWNXY2lkLldDSURdLkFkZHJbNF07CisJCQkJCQlNQUNWYWx1ZSB8PSBNQUNSVmFsdWU7CisJCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQrNCwgTUFDVmFsdWUpOworCisJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiMi1NQUNWYWx1ZT0gJXgsXG4iLCBNQUNWYWx1ZSkpOworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBDTURUSFJFQURfU0VUX0FTSUNfV0NJRF9DSVBIRVI6CisJCQkJCXsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQkJCVJUX1NFVF9BU0lDX1dDSURfQVRUUkkJU2V0QXNpY1djaWRBdHRyaTsKKwkJCQkJCVVTSE9SVAkJb2Zmc2V0OworCQkJCQkJVUlOVDMyCQlNQUNSVmFsdWUgPSAwOworCQkJCQkJU0hBUkVES0VZX01PREVfU1RSVUMgY3NyMTsKKwkJCQkJCVNldEFzaWNXY2lkQXR0cmkgPSAqKChQUlRfU0VUX0FTSUNfV0NJRF9BVFRSSSkocERhdGEpKTsKKworCQkJCQkJaWYgKFNldEFzaWNXY2lkQXR0cmkuV0NJRCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJCQkJCQlyZXR1cm47CisKKwkJCQkJCW9mZnNldCA9IE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsgKChVQ0hBUilTZXRBc2ljV2NpZEF0dHJpLldDSUQpKkhXX1dDSURfQVRUUklfU0laRTsKKworCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkNtZCA6IENNRFRIUkVBRF9TRVRfQVNJQ19XQ0lEX0NJUEhFUiA6IFdDSUQgPSAlbGQsIENpcGhlciA9ICVseC5cbiIsIFNldEFzaWNXY2lkQXR0cmkuV0NJRCwgU2V0QXNpY1djaWRBdHRyaS5DaXBoZXIpKTsKKwkJCQkJCS8vIFJlYWQgYml0bWFzaworCQkJCQkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQsICZNQUNSVmFsdWUpOworCQkJCQkJTUFDUlZhbHVlID0gMDsKKwkJCQkJCU1BQ1JWYWx1ZSB8PSAoKChVQ0hBUilTZXRBc2ljV2NpZEF0dHJpLkNpcGhlcikgPDwgMSk7CisKKwkJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIG9mZnNldCwgTUFDUlZhbHVlKTsKKwkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIyLW9mZnNldCA9ICV4ICwgTUFDVmFsdWU9ICV4LFxuIiwgb2Zmc2V0LCBNQUNSVmFsdWUpKTsKKworCQkJCQkJb2Zmc2V0ID0gUEFJUldJU0VfSVZFSVZfVEFCTEVfQkFTRSArICgoVUNIQVIpU2V0QXNpY1djaWRBdHRyaS5XQ0lEKSpIV19JVkVJVl9FTlRSWV9TSVpFOworCQkJCQkJTUFDUlZhbHVlID0gMDsKKwkJCQkJCWlmICggKFNldEFzaWNXY2lkQXR0cmkuQ2lwaGVyIDw9IENJUEhFUl9XRVAxMjgpKQorCQkJCQkJCU1BQ1JWYWx1ZSB8PSAoIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA8PCAzMCk7CisJCQkJCQllbHNlCisJCQkJCQkJTUFDUlZhbHVlIHw9ICgweDIwMDAwMDAwKTsKKwkJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIG9mZnNldCwgTUFDUlZhbHVlKTsKKwkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIyLW9mZnNldCA9ICV4ICwgTUFDVmFsdWU9ICV4LFxuIiwgb2Zmc2V0LCBNQUNSVmFsdWUpKTsKKworCQkJCQkJLy8KKwkJCQkJCS8vIFVwZGF0ZSBjaXBoZXIgYWxnb3JpdGhtLiBXU1RBIGFsd2F5cyB1c2UgQlNTMAorCQkJCQkJLy8KKwkJCQkJCS8vIGZvciBhZGhvYyBtb2RlIG9ubHkgLGJlY2F1c2Ugd2VwIHN0YXR1cyBzbG93IHRoYW4gYWRkIGtleSwgd2hlbiB1c2UgemVybyBjb25maWcKKwkJCQkJCWlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQyApCisJCQkJCQl7CisJCQkJCQkJb2Zmc2V0ID0gTUFDX1dDSURfQVRUUklCVVRFX0JBU0U7CisKKwkJCQkJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIG9mZnNldCwgJk1BQ1JWYWx1ZSk7CisJCQkJCQkJTUFDUlZhbHVlICY9ICh+MHhlKTsKKwkJCQkJCQlNQUNSVmFsdWUgfD0gKCgoVUNIQVIpU2V0QXNpY1djaWRBdHRyaS5DaXBoZXIpIDw8IDEpOworCisJCQkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgb2Zmc2V0LCBNQUNSVmFsdWUpOworCisJCQkJCQkJLy9VcGRhdGUgZ3JvdXAga2V5IGNpcGhlciwsYmVjYXVzZSB3ZXAgc3RhdHVzIHNsb3cgdGhhbiBhZGQga2V5LCB3aGVuIHVzZSB6ZXJvIGNvbmZpZworCQkJCQkJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UrNCooMC8yKSwgJmNzcjEud29yZCk7CisKKwkJCQkJCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gU2V0QXNpY1djaWRBdHRyaS5DaXBoZXI7CisJCQkJCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IFNldEFzaWNXY2lkQXR0cmkuQ2lwaGVyOworCisJCQkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UrNCooMC8yKSwgY3NyMS53b3JkKTsKKwkJCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCQkJfQorCQkJCQlicmVhazsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkJCS8vIGF2b2lkIGluIGludGVycnVwdCB3aGVuIHdyaXRlIGtleQorCQkJCWNhc2UgUlRfQ01EX1NFVF9LRVlfVEFCTEU6IC8vR2VuZXJhbCBjYWxsIGZvciBBc2ljQWRkUGFpcndpc2VLZXlFbnRyeSgpCisJCQkJCXsKKwkJCQkJCVJUX0FERF9QQUlSV0lTRV9LRVlfRU5UUlkgS2V5SW5mbzsKKwkJCQkJCUtleUluZm8gID0gKigoUFJUX0FERF9QQUlSV0lTRV9LRVlfRU5UUlkpKHBEYXRhKSk7CisJCQkJCQlBc2ljQWRkUGFpcndpc2VLZXlFbnRyeShwQWQsCisJCQkJCQkJCQkJCQlLZXlJbmZvLk1hY0FkZHIsCisJCQkJCQkJCQkJCQkoVUNIQVIpS2V5SW5mby5NYWNUYWJNYXRjaFdDSUQsCisJCQkJCQkJCQkJCQkmS2V5SW5mby5DaXBoZXJLZXkpOworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBSVF9DTURfU0VUX1JYX1dDSURfVEFCTEU6IC8vR2VuZXJhbCBjYWxsIGZvciBSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KCkKKwkJCQkJeworCQkJCQkJUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgOworCQkJCQkJcEVudHJ5ID0gKFBNQUNfVEFCTEVfRU5UUlkpKHBEYXRhKTsKKwkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorCQkJCQkJCQkJCQkJCUJTUzAsCisJCQkJCQkJCQkJCQkJMCwKKwkJCQkJCQkJCQkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZywKKwkJCQkJCQkJCQkJCQlwRW50cnkpOworCQkJCQl9CisJCQkJCWJyZWFrOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCQkJY2FzZSBDTURUSFJFQURfU0VUX0NMSUVOVF9NQUNfRU5UUlk6CisJCQkJCXsKKwkJCQkJCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCQkJCQkJcEVudHJ5ID0gKE1BQ19UQUJMRV9FTlRSWSAqKXBEYXRhOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJCQl7CisJCQkJCQkJQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkocEFkLCBwRW50cnktPmFwaWR4LCAoVUNIQVIpcEVudHJ5LT5BaWQpOworCQkJCQkJCWlmICgocEVudHJ5LT5BdXRoTW9kZSA8PSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoKSAmJiAocEVudHJ5LT5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkpCisJCQkJCQkJeworCQkJCQkJCQlVSU5UMzIgdUlWID0gMDsKKwkJCQkJCQkJUFVDSEFSICBwdHI7CisKKwkJCQkJCQkJcHRyID0gKFBVQ0hBUikgJnVJVjsKKwkJCQkJCQkJKihwdHIgKyAzKSA9IChwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPDwgNik7CisJCQkJCQkJCUFzaWNVcGRhdGVXQ0lESVZFSVYocEFkLCBwRW50cnktPkFpZCwgdUlWLCAwKTsKKwkJCQkJCQkJQXNpY1VwZGF0ZVdDSURBdHRyaWJ1dGUocEFkLCBwRW50cnktPkFpZCwgQlNTMCwgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcsIEZBTFNFKTsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZSBpZiAocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorCQkJCQkJCXsKKwkJCQkJCQkJVUlOVDMyIHVJViA9IDA7CisJCQkJCQkJCVBVQ0hBUiAgcHRyOworCisJCQkJCQkJCXB0ciA9IChQVUNIQVIpICZ1SVY7CisJCQkJCQkJCSoocHRyICsgMykgPSAocEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkIDw8IDYpOworCQkJCQkJCQlBc2ljVXBkYXRlV0NJRElWRUlWKHBBZCwgcEVudHJ5LT5BaWQsIHVJViwgMCk7CisJCQkJCQkJCUFzaWNVcGRhdGVXQ0lEQXR0cmlidXRlKHBBZCwgcEVudHJ5LT5BaWQsIEJTUzAsIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLCBGQUxTRSk7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCS8vCisJCQkJCQkJCS8vIE90aGVyIGNhc2UsIGRpc2FibGUgZW5naW5lLgorCQkJCQkJCQkvLyBEb24ndCB3b3JyeSBXUEEga2V5LCB3ZSB3aWxsIGFkZCBXUEEgS2V5IGFmdGVyIDQtV2F5IGhhbmRzaGFraW5nLgorCQkJCQkJCQkvLworCQkJCQkJCQlVU0hPUlQgICBvZmZzZXQ7CisJCQkJCQkJCW9mZnNldCA9IE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsgKHBFbnRyeS0+QWlkICogSFdfV0NJRF9BVFRSSV9TSVpFKTsKKwkJCQkJCQkJLy8gUlhfUEtFWV9NT0RFOjAgZm9yIG5vIHNlY3VyaXR5OyBSWF9LRVlfVEFCOjAgZm9yIHNoYXJlZCBrZXkgdGFibGU7IEJTU19JRFg6MAorCQkJCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQsIDApOworCQkJCQkJCX0KKwkJCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkJCQkJQXNpY1VwZGF0ZVJ4V0NJRFRhYmxlKHBBZCwgcEVudHJ5LT5BaWQsIHBFbnRyeS0+QWRkcik7CisJCQkJCQlwcmludGsoIlVwZGF0ZVJ4V0NJRFRhYmxlKCk6IEFpZD0lZCwgQWRkcj0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCFcbiIsIHBFbnRyeS0+QWlkLAorCQkJCQkJCQlwRW50cnktPkFkZHJbMF0sIHBFbnRyeS0+QWRkclsxXSwgcEVudHJ5LT5BZGRyWzJdLCBwRW50cnktPkFkZHJbM10sIHBFbnRyeS0+QWRkcls0XSwgcEVudHJ5LT5BZGRyWzVdKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCWNhc2UgT0lEXzgwMl8xMV9BRERfV0VQOgorCQkJCQl7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkJCQlVSU5UCWk7CisJCQkJCQlVSU5UMzIJS2V5SWR4OworCQkJCQkJUE5ESVNfODAyXzExX1dFUAlwV2VwS2V5OworCisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbWRUaHJlYWQ6Ok9JRF84MDJfMTFfQUREX1dFUCAgXG4iKSk7CisKKwkJCQkJCXBXZXBLZXkgPSAoUE5ESVNfODAyXzExX1dFUClwRGF0YTsKKwkJCQkJCUtleUlkeCA9IHBXZXBLZXktPktleUluZGV4ICYgMHgwZmZmZmZmZjsKKworCQkJCQkJLy8gaXQgaXMgYSBzaGFyZWQga2V5CisJCQkJCQlpZiAoKEtleUlkeCA+PSA0KSB8fCAoKHBXZXBLZXktPktleUxlbmd0aCAhPSA1KSAmJiAocFdlcEtleS0+S2V5TGVuZ3RoICE9IDEzKSkpCisJCQkJCQl7CisJCQkJCQkJTmRpc1N0YXR1cyA9IE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQTsKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJDbWRUaHJlYWQ6Ok9JRF84MDJfMTFfQUREX1dFUCwgSU5WQUxJRF9EQVRBISFcbiIpKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlVQ0hBUiBDaXBoZXJBbGc7CisJCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPSAoVUNIQVIpIHBXZXBLZXktPktleUxlbmd0aDsKKwkJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleSwgJnBXZXBLZXktPktleU1hdGVyaWFsLCBwV2VwS2V5LT5LZXlMZW5ndGgpOworCQkJCQkJCUNpcGhlckFsZyA9IChwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9PSA1KT8gQ0lQSEVSX1dFUDY0IDogQ0lQSEVSX1dFUDEyODsKKworCQkJCQkJCS8vCisJCQkJCQkJLy8gQ2hhbmdlIHRoZSBXRVAgY2lwaGVyIHRvIENLSVAgY2lwaGVyIGlmIENLSVAgS1Agb24uCisJCQkJCQkJLy8gRnVuayBVSSBvciBNZWV0aW5naG91c2UgVUkgd2lsbCBhZGQgY2tpcCBrZXkgZnJvbSB0aGlzIHBhdGguCisJCQkJCQkJLy8KKworCQkJCQkJCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorCQkJCQkJIAl7CisJCQkJCQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGc7CisJCQkJCQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuS2V5TGVuID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW47CisJCQkJCQkgCX0KKwkJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJCQkJCQlpZiAocFdlcEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKQorCQkJCQkJCXsKKwkJCQkJCQkJLy8gRGVmYXVsdCBrZXkgZm9yIHR4IChzaGFyZWQga2V5KQorCQkJCQkJCQlVQ0hBUglJVkVJVls4XTsKKwkJCQkJCQkJVUlOVDMyCVdDSURBdHRyaSwgVmFsdWU7CisJCQkJCQkJCVVTSE9SVAlvZmZzZXQsIG9mZnNldDI7CisJCQkJCQkJCU5kaXNaZXJvTWVtb3J5KElWRUlWLCA4KTsKKwkJCQkJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKFVDSEFSKSBLZXlJZHg7CisJCQkJCQkJCS8vIEFkZCBCU1NJRCB0byBXQ1RhYmxlLiBiZWNhdXNlIHRoaXMgaXMgVHggd2VwIGtleS4KKwkJCQkJCQkJLy8gV0NJRCBBdHRyaWJ1dGUgVURGOjMsIEJTU0lkeDozLCBBbGc6MywgS2V5dGFibGU6MT1QQUlSV0lTRSBLRVksIEJTU0lkeCBpcyAwCisJCQkJCQkJCVdDSURBdHRyaSA9IChDaXBoZXJBbGc8PDEpfFNIQVJFREtFWVRBQkxFOworCisJCQkJCQkJCW9mZnNldCA9IE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsgKEJTU0lEX1dDSUQqIEhXX1dDSURfQVRUUklfU0laRSk7CisJCQkJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIG9mZnNldCwgV0NJREF0dHJpKTsKKwkJCQkJCQkJLy8gMS4gSVYvRUlWCisJCQkJCQkJCS8vIFNwZWNpZnkga2V5IGluZGV4IHRvIGZpbmQgc2hhcmVkIGtleS4KKwkJCQkJCQkJSVZFSVZbM10gPSAoVUNIQVIpKEtleUlkeDw8IDYpOwkvL1dFUCBFaXYgYml0IG9mZi4gZ3JvdXBrZXkgaW5kZXggaXMgbm90IDAKKwkJCQkJCQkJb2Zmc2V0ID0gUEFJUldJU0VfSVZFSVZfVEFCTEVfQkFTRSArIChCU1MwTWNhc3RfV0NJRCAqIEhXX0lWRUlWX0VOVFJZX1NJWkUpOworCQkJCQkJCQlvZmZzZXQyID0gUEFJUldJU0VfSVZFSVZfVEFCTEVfQkFTRSArIChCU1NJRF9XQ0lEKiBIV19JVkVJVl9FTlRSWV9TSVpFKTsKKwkJCQkJCQkJZm9yIChpPTA7IGk8ODspCisJCQkJCQkJCXsKKwkJCQkJCQkJCVZhbHVlID0gSVZFSVZbaV07CisJCQkJCQkJCQlWYWx1ZSArPSAoSVZFSVZbaSsxXTw8OCk7CisJCQkJCQkJCQlWYWx1ZSArPSAoSVZFSVZbaSsyXTw8MTYpOworCQkJCQkJCQkJVmFsdWUgKz0gKElWRUlWW2krM108PDI0KTsKKwkJCQkJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIG9mZnNldCtpLCBWYWx1ZSk7CisJCQkJCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQyK2ksIFZhbHVlKTsKKwkJCQkJCQkJCWkrPTQ7CisJCQkJCQkJCX0KKworCQkJCQkJCQkvLyAyLiBXQ0lEIEF0dHJpYnV0ZSBVREY6MywgQlNTSWR4OjMsIEFsZzozLCBLZXl0YWJsZTp1c2Ugc2hhcmUga2V5LCBCU1NJZHggaXMgMAorCQkJCQkJCQlXQ0lEQXR0cmkgPSAocEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGc8PDEpfFNIQVJFREtFWVRBQkxFOworCQkJCQkJCQlvZmZzZXQgPSBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSArIChCU1MwTWNhc3RfV0NJRCogSFdfV0NJRF9BVFRSSV9TSVpFKTsKKwkJCQkJCQkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJTUzBNY2FzdF9XQ0lEIDogb2Zmc2V0ID0gJXgsIFdDSURBdHRyaSA9ICV4XG4iLCBvZmZzZXQsIFdDSURBdHRyaSkpOworCQkJCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQsIFdDSURBdHRyaSk7CisKKwkJCQkJCQl9CisJCQkJCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwgQlNTMCwgKFVDSEFSKUtleUlkeCwgQ2lwaGVyQWxnLCBwV2VwS2V5LT5LZXlNYXRlcmlhbCwgTlVMTCwgTlVMTCk7CisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ21kVGhyZWFkOjpPSURfODAyXzExX0FERF9XRVAgKEtleUlkeD0lZCwgTGVuPSVkLWJ5dGUpXG4iLCBLZXlJZHgsIHBXZXBLZXktPktleUxlbmd0aCkpOworCQkJCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBDTURUSFJFQURfODAyXzExX0NPVU5URVJfTUVBU1VSRToKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiLS0+IENvbnRyb2wgVGhyZWFkICEhIEVSUk9SICEhIFVua25vd24oY21kcWVsbXQtPmNvbW1hbmQ9MHgleCkgISEgXG4iLCBjbWRxZWxtdC0+Y29tbWFuZCkpOworCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChjbWRxZWxtdC0+Q21kRnJvbU5kaXMgPT0gVFJVRSkKKwkJeworCQkJCWlmIChjbWRxZWxtdC0+YnVmZmVyICE9IE5VTEwpCisJCQkJCU5kaXNGcmVlTWVtb3J5KGNtZHFlbG10LT5idWZmZXIsIGNtZHFlbG10LT5idWZmZXJsZW5ndGgsIDApOworCisJCQlOZGlzRnJlZU1lbW9yeShjbWRxZWxtdCwgc2l6ZW9mKENtZFFFbG10KSwgMCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoKGNtZHFlbG10LT5idWZmZXIgIT0gTlVMTCkgJiYgKGNtZHFlbG10LT5idWZmZXJsZW5ndGggIT0gMCkpCisJCQkJTmRpc0ZyZWVNZW1vcnkoY21kcWVsbXQtPmJ1ZmZlciwgY21kcWVsbXQtPmJ1ZmZlcmxlbmd0aCwgMCk7CisgICAgICAgICAgICB7CisJCQkJTmRpc0ZyZWVNZW1vcnkoY21kcWVsbXQsIHNpemVvZihDbWRRRWxtdCksIDApOworCQkJfQorCQl9CisJfQkvKiBlbmQgb2Ygd2hpbGUgKi8KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vc3BlY3RydW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3NwZWN0cnVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM3ODJjZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3NwZWN0cnVtLmMKQEAgLTAsMCArMSwxODc2IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorCWFjdGlvbi5jCisKKyAgICBBYnN0cmFjdDoKKyAgICBIYW5kbGUgYXNzb2NpYXRpb24gcmVsYXRlZCByZXF1ZXN0cyBlaXRoZXIgZnJvbSBXU1RBIG9yIGZyb20gbG9jYWwgTUxNRQorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUZvbmNoaSBXdSAgICAyMDA4CSAgCSAgIGNyZWF0ZWQgZm9yIDgwMi4xMWgKKyAqLworCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisjaW5jbHVkZSAiYWN0aW9uLmgiCisKK1ZPSUQgTWVhc3VyZVJlcVRhYkluaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+Q29tbW9uQ2ZnLk1lYXN1cmVSZXFUYWJMb2NrKTsKKworCXBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiID0ga21hbGxvYyhzaXplb2YoTUVBU1VSRV9SRVFfVEFCKSwgR0ZQX0FUT01JQyk7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiKQorCQlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYiwgc2l6ZW9mKE1FQVNVUkVfUkVRX1RBQikpOworCWVsc2UKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgRmFpbCB0byBhbGxvYyBtZW1vcnkgZm9yIHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiLlxuIiwgX19mdW5jX18pKTsKKworCXJldHVybjsKK30KKworVk9JRCBNZWFzdXJlUmVxVGFiRXhpdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlOZGlzRnJlZVNwaW5Mb2NrKHBBZC0+Q29tbW9uQ2ZnLk1lYXN1cmVSZXFUYWJMb2NrKTsKKworCWlmIChwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYikKKwkJa2ZyZWUocEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWIpOworCXBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiID0gTlVMTDsKKworCXJldHVybjsKK30KKworc3RhdGljIFBNRUFTVVJFX1JFUV9FTlRSWSBNZWFzdXJlUmVxTG9va1VwKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVJTlQ4CQkJRGlhbG9nVG9rZW4pCit7CisJVUlOVCBIYXNoSWR4OworCVBNRUFTVVJFX1JFUV9UQUIgcFRhYiA9IHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiOworCVBNRUFTVVJFX1JFUV9FTlRSWSBwRW50cnkgPSBOVUxMOworCVBNRUFTVVJFX1JFUV9FTlRSWSBwUHJldkVudHJ5ID0gTlVMTDsKKworCWlmIChwVGFiID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcE1lYXN1cmVSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fZnVuY19fKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCVJUTVBfU0VNX0xPQ0soJnBBZC0+Q29tbW9uQ2ZnLk1lYXN1cmVSZXFUYWJMb2NrKTsKKworCUhhc2hJZHggPSBNUV9ESUFMT0dUT0tFTl9IQVNIX0lOREVYKERpYWxvZ1Rva2VuKTsKKwlwRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOworCisJd2hpbGUgKHBFbnRyeSkKKwl7CisJCWlmIChwRW50cnktPkRpYWxvZ1Rva2VuID09IERpYWxvZ1Rva2VuKQorCQkJYnJlYWs7CisJCWVsc2UKKwkJeworCQkJcFByZXZFbnRyeSA9IHBFbnRyeTsKKwkJCXBFbnRyeSA9IHBFbnRyeS0+cE5leHQ7CisJCX0KKwl9CisKKwlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+Q29tbW9uQ2ZnLk1lYXN1cmVSZXFUYWJMb2NrKTsKKworCXJldHVybiBwRW50cnk7Cit9CisKK3N0YXRpYyBQTUVBU1VSRV9SRVFfRU5UUlkgTWVhc3VyZVJlcUluc2VydCgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVSU5UOAkJCURpYWxvZ1Rva2VuKQoreworCUlOVCBpOworCVVMT05HIEhhc2hJZHg7CisJUE1FQVNVUkVfUkVRX1RBQiBwVGFiID0gcEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWI7CisJUE1FQVNVUkVfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEwsIHBDdXJyRW50cnk7CisJVUxPTkcgTm93OworCisJaWYocFRhYiA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBNZWFzdXJlUmVxVGFiIGRvZXNuJ3QgZXhpc3QuXG4iLCBfX2Z1bmNfXykpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwRW50cnkgPSBNZWFzdXJlUmVxTG9va1VwKHBBZCwgRGlhbG9nVG9rZW4pOworCWlmIChwRW50cnkgPT0gTlVMTCkKKwl7CisJCVJUTVBfU0VNX0xPQ0soJnBBZC0+Q29tbW9uQ2ZnLk1lYXN1cmVSZXFUYWJMb2NrKTsKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9NRUFTVVJFX1JFUV9UQUJfU0laRTsgaSsrKQorCQl7CisJCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOworCQkJcEVudHJ5ID0gJnBUYWItPkNvbnRlbnRbaV07CisKKwkJCWlmICgocEVudHJ5LT5WYWxpZCA9PSBUUlVFKQorCQkJCSYmIFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3csICh1bnNpZ25lZCBsb25nKShwRW50cnktPmxhc3RUaW1lICsgTVFfUkVRX0FHRV9PVVQpKSkKKwkJCXsKKwkJCQlQTUVBU1VSRV9SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7CisJCQkJVUxPTkcgSGFzaElkeCA9IE1RX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgocEVudHJ5LT5EaWFsb2dUb2tlbik7CisJCQkJUE1FQVNVUkVfUkVRX0VOVFJZIHBQcm9iZUVudHJ5ID0gcFRhYi0+SGFzaFtIYXNoSWR4XTsKKworCQkJCS8vIHVwZGF0ZSBIYXNoIGxpc3QKKwkJCQlkbworCQkJCXsKKwkJCQkJaWYgKHBQcm9iZUVudHJ5ID09IHBFbnRyeSkKKwkJCQkJeworCQkJCQkJaWYgKHBQcmV2RW50cnkgPT0gTlVMTCkKKwkJCQkJCXsKKwkJCQkJCQlwVGFiLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5LT5wTmV4dDsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlwUHJldkVudHJ5LT5wTmV4dCA9IHBFbnRyeS0+cE5leHQ7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCXBQcmV2RW50cnkgPSBwUHJvYmVFbnRyeTsKKwkJCQkJcFByb2JlRW50cnkgPSBwUHJvYmVFbnRyeS0+cE5leHQ7CisJCQkJfSB3aGlsZSAocFByb2JlRW50cnkpOworCisJCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2YoTUVBU1VSRV9SRVFfRU5UUlkpKTsKKwkJCQlwVGFiLT5TaXplLS07CisKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKHBFbnRyeS0+VmFsaWQgPT0gRkFMU0UpCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaSA8IE1BWF9NRUFTVVJFX1JFUV9UQUJfU0laRSkKKwkJeworCQkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKKwkJCXBFbnRyeS0+bGFzdFRpbWUgPSBOb3c7CisJCQlwRW50cnktPlZhbGlkID0gVFJVRTsKKwkJCXBFbnRyeS0+RGlhbG9nVG9rZW4gPSBEaWFsb2dUb2tlbjsKKwkJCXBUYWItPlNpemUrKzsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBFbnRyeSA9IE5VTEw7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcE1lYXN1cmVSZXFUYWIgdGFiIGZ1bGwuXG4iLCBfX2Z1bmNfXykpOworCQl9CisKKwkJLy8gYWRkIHRoaXMgTmVpZ2hib3IgZW50cnkgaW50byBIQVNIIHRhYmxlCisJCWlmIChwRW50cnkpCisJCXsKKwkJCUhhc2hJZHggPSBNUV9ESUFMT0dUT0tFTl9IQVNIX0lOREVYKERpYWxvZ1Rva2VuKTsKKwkJCWlmIChwVGFiLT5IYXNoW0hhc2hJZHhdID09IE5VTEwpCisJCQl7CisJCQkJcFRhYi0+SGFzaFtIYXNoSWR4XSA9IHBFbnRyeTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlwQ3VyckVudHJ5ID0gcFRhYi0+SGFzaFtIYXNoSWR4XTsKKwkJCQl3aGlsZSAocEN1cnJFbnRyeS0+cE5leHQgIT0gTlVMTCkKKwkJCQkJcEN1cnJFbnRyeSA9IHBDdXJyRW50cnktPnBOZXh0OworCQkJCXBDdXJyRW50cnktPnBOZXh0ID0gcEVudHJ5OworCQkJfQorCQl9CisKKwkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPkNvbW1vbkNmZy5NZWFzdXJlUmVxVGFiTG9jayk7CisJfQorCisJcmV0dXJuIHBFbnRyeTsKK30KKworc3RhdGljIFZPSUQgTWVhc3VyZVJlcURlbGV0ZSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVSU5UOAkJCURpYWxvZ1Rva2VuKQoreworCVBNRUFTVVJFX1JFUV9UQUIgcFRhYiA9IHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiOworCVBNRUFTVVJFX1JFUV9FTlRSWSBwRW50cnkgPSBOVUxMOworCisJaWYocFRhYiA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBNZWFzdXJlUmVxVGFiIGRvZXNuJ3QgZXhpc3QuXG4iLCBfX2Z1bmNfXykpOworCQlyZXR1cm47CisJfQorCisJLy8gaWYgZW1wdHksIHJldHVybgorCWlmIChwVGFiLT5TaXplID09IDApCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJwTWVhc3VyZVJlcVRhYiBlbXB0eS5cbiIpKTsKKwkJcmV0dXJuOworCX0KKworCXBFbnRyeSA9IE1lYXN1cmVSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbik7CisJaWYgKHBFbnRyeSAhPSBOVUxMKQorCXsKKwkJUE1FQVNVUkVfUkVRX0VOVFJZIHBQcmV2RW50cnkgPSBOVUxMOworCQlVTE9ORyBIYXNoSWR4ID0gTVFfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChwRW50cnktPkRpYWxvZ1Rva2VuKTsKKwkJUE1FQVNVUkVfUkVRX0VOVFJZIHBQcm9iZUVudHJ5ID0gcFRhYi0+SGFzaFtIYXNoSWR4XTsKKworCQlSVE1QX1NFTV9MT0NLKCZwQWQtPkNvbW1vbkNmZy5NZWFzdXJlUmVxVGFiTG9jayk7CisJCS8vIHVwZGF0ZSBIYXNoIGxpc3QKKwkJZG8KKwkJeworCQkJaWYgKHBQcm9iZUVudHJ5ID09IHBFbnRyeSkKKwkJCXsKKwkJCQlpZiAocFByZXZFbnRyeSA9PSBOVUxMKQorCQkJCXsKKwkJCQkJcFRhYi0+SGFzaFtIYXNoSWR4XSA9IHBFbnRyeS0+cE5leHQ7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXBQcmV2RW50cnktPnBOZXh0ID0gcEVudHJ5LT5wTmV4dDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXBQcmV2RW50cnkgPSBwUHJvYmVFbnRyeTsKKwkJCXBQcm9iZUVudHJ5ID0gcFByb2JlRW50cnktPnBOZXh0OworCQl9IHdoaWxlIChwUHJvYmVFbnRyeSk7CisKKwkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2YoTUVBU1VSRV9SRVFfRU5UUlkpKTsKKwkJcFRhYi0+U2l6ZS0tOworCisJCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOworCX0KKworCXJldHVybjsKK30KKworVk9JRCBUcGNSZXFUYWJJbml0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkNvbW1vbkNmZy5UcGNSZXFUYWJMb2NrKTsKKworCXBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWIgPSBrbWFsbG9jKHNpemVvZihUUENfUkVRX1RBQiksIEdGUF9BVE9NSUMpOworCWlmIChwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiKQorCQlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiLCBzaXplb2YoVFBDX1JFUV9UQUIpKTsKKwllbHNlCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIEZhaWwgdG8gYWxsb2MgbWVtb3J5IGZvciBwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiLlxuIiwgX19mdW5jX18pKTsKKworCXJldHVybjsKK30KKworVk9JRCBUcGNSZXFUYWJFeGl0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCU5kaXNGcmVlU3BpbkxvY2socEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7CisKKwlpZiAocEFkLT5Db21tb25DZmcucFRwY1JlcVRhYikKKwkJa2ZyZWUocEFkLT5Db21tb25DZmcucFRwY1JlcVRhYik7CisJcEFkLT5Db21tb25DZmcucFRwY1JlcVRhYiA9IE5VTEw7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBQVFBDX1JFUV9FTlRSWSBUcGNSZXFMb29rVXAoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVUlOVDgJCQlEaWFsb2dUb2tlbikKK3sKKwlVSU5UIEhhc2hJZHg7CisJUFRQQ19SRVFfVEFCIHBUYWIgPSBwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiOworCVBUUENfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEw7CisJUFRQQ19SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7CisKKwlpZiAocFRhYiA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBUcGNSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fZnVuY19fKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCVJUTVBfU0VNX0xPQ0soJnBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOworCisJSGFzaElkeCA9IFRQQ19ESUFMT0dUT0tFTl9IQVNIX0lOREVYKERpYWxvZ1Rva2VuKTsKKwlwRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOworCisJd2hpbGUgKHBFbnRyeSkKKwl7CisJCWlmIChwRW50cnktPkRpYWxvZ1Rva2VuID09IERpYWxvZ1Rva2VuKQorCQkJYnJlYWs7CisJCWVsc2UKKwkJeworCQkJcFByZXZFbnRyeSA9IHBFbnRyeTsKKwkJCXBFbnRyeSA9IHBFbnRyeS0+cE5leHQ7CisJCX0KKwl9CisKKwlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOworCisJcmV0dXJuIHBFbnRyeTsKK30KKworCitzdGF0aWMgUFRQQ19SRVFfRU5UUlkgVHBjUmVxSW5zZXJ0KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVJTlQ4CQkJRGlhbG9nVG9rZW4pCit7CisJSU5UIGk7CisJVUxPTkcgSGFzaElkeDsKKwlQVFBDX1JFUV9UQUIgcFRhYiA9IHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWI7CisJUFRQQ19SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTCwgcEN1cnJFbnRyeTsKKwlVTE9ORyBOb3c7CisKKwlpZihwVGFiID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcFRwY1JlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19mdW5jX18pKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcEVudHJ5ID0gVHBjUmVxTG9va1VwKHBBZCwgRGlhbG9nVG9rZW4pOworCWlmIChwRW50cnkgPT0gTlVMTCkKKwl7CisJCVJUTVBfU0VNX0xPQ0soJnBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1RQQ19SRVFfVEFCX1NJWkU7IGkrKykKKwkJeworCQkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKKwkJCXBFbnRyeSA9ICZwVGFiLT5Db250ZW50W2ldOworCisJCQlpZiAoKHBFbnRyeS0+VmFsaWQgPT0gVFJVRSkKKwkJCQkmJiBSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93LCAodW5zaWduZWQgbG9uZykocEVudHJ5LT5sYXN0VGltZSArIFRQQ19SRVFfQUdFX09VVCkpKQorCQkJeworCQkJCVBUUENfUkVRX0VOVFJZIHBQcmV2RW50cnkgPSBOVUxMOworCQkJCVVMT05HIEhhc2hJZHggPSBUUENfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChwRW50cnktPkRpYWxvZ1Rva2VuKTsKKwkJCQlQVFBDX1JFUV9FTlRSWSBwUHJvYmVFbnRyeSA9IHBUYWItPkhhc2hbSGFzaElkeF07CisKKwkJCQkvLyB1cGRhdGUgSGFzaCBsaXN0CisJCQkJZG8KKwkJCQl7CisJCQkJCWlmIChwUHJvYmVFbnRyeSA9PSBwRW50cnkpCisJCQkJCXsKKwkJCQkJCWlmIChwUHJldkVudHJ5ID09IE5VTEwpCisJCQkJCQl7CisJCQkJCQkJcFRhYi0+SGFzaFtIYXNoSWR4XSA9IHBFbnRyeS0+cE5leHQ7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJcFByZXZFbnRyeS0+cE5leHQgPSBwRW50cnktPnBOZXh0OworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQlwUHJldkVudHJ5ID0gcFByb2JlRW50cnk7CisJCQkJCXBQcm9iZUVudHJ5ID0gcFByb2JlRW50cnktPnBOZXh0OworCQkJCX0gd2hpbGUgKHBQcm9iZUVudHJ5KTsKKworCQkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeSwgc2l6ZW9mKFRQQ19SRVFfRU5UUlkpKTsKKwkJCQlwVGFiLT5TaXplLS07CisKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKHBFbnRyeS0+VmFsaWQgPT0gRkFMU0UpCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaSA8IE1BWF9UUENfUkVRX1RBQl9TSVpFKQorCQl7CisJCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOworCQkJcEVudHJ5LT5sYXN0VGltZSA9IE5vdzsKKwkJCXBFbnRyeS0+VmFsaWQgPSBUUlVFOworCQkJcEVudHJ5LT5EaWFsb2dUb2tlbiA9IERpYWxvZ1Rva2VuOworCQkJcFRhYi0+U2l6ZSsrOworCQl9CisJCWVsc2UKKwkJeworCQkJcEVudHJ5ID0gTlVMTDsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwVHBjUmVxVGFiIHRhYiBmdWxsLlxuIiwgX19mdW5jX18pKTsKKwkJfQorCisJCS8vIGFkZCB0aGlzIE5laWdoYm9yIGVudHJ5IGludG8gSEFTSCB0YWJsZQorCQlpZiAocEVudHJ5KQorCQl7CisJCQlIYXNoSWR4ID0gVFBDX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgoRGlhbG9nVG9rZW4pOworCQkJaWYgKHBUYWItPkhhc2hbSGFzaElkeF0gPT0gTlVMTCkKKwkJCXsKKwkJCQlwVGFiLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5OworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXBDdXJyRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOworCQkJCXdoaWxlIChwQ3VyckVudHJ5LT5wTmV4dCAhPSBOVUxMKQorCQkJCQlwQ3VyckVudHJ5ID0gcEN1cnJFbnRyeS0+cE5leHQ7CisJCQkJcEN1cnJFbnRyeS0+cE5leHQgPSBwRW50cnk7CisJCQl9CisJCX0KKworCQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOworCX0KKworCXJldHVybiBwRW50cnk7Cit9CisKK3N0YXRpYyBWT0lEIFRwY1JlcURlbGV0ZSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVSU5UOAkJCURpYWxvZ1Rva2VuKQoreworCVBUUENfUkVRX1RBQiBwVGFiID0gcEFkLT5Db21tb25DZmcucFRwY1JlcVRhYjsKKwlQVFBDX1JFUV9FTlRSWSBwRW50cnkgPSBOVUxMOworCisJaWYocFRhYiA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBUcGNSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fZnVuY19fKSk7CisJCXJldHVybjsKKwl9CisKKwkvLyBpZiBlbXB0eSwgcmV0dXJuCisJaWYgKHBUYWItPlNpemUgPT0gMCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoInBUcGNSZXFUYWIgZW1wdHkuXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwlwRW50cnkgPSBUcGNSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbik7CisJaWYgKHBFbnRyeSAhPSBOVUxMKQorCXsKKwkJUFRQQ19SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7CisJCVVMT05HIEhhc2hJZHggPSBUUENfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChwRW50cnktPkRpYWxvZ1Rva2VuKTsKKwkJUFRQQ19SRVFfRU5UUlkgcFByb2JlRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOworCisJCVJUTVBfU0VNX0xPQ0soJnBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOworCQkvLyB1cGRhdGUgSGFzaCBsaXN0CisJCWRvCisJCXsKKwkJCWlmIChwUHJvYmVFbnRyeSA9PSBwRW50cnkpCisJCQl7CisJCQkJaWYgKHBQcmV2RW50cnkgPT0gTlVMTCkKKwkJCQl7CisJCQkJCXBUYWItPkhhc2hbSGFzaElkeF0gPSBwRW50cnktPnBOZXh0OworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlwUHJldkVudHJ5LT5wTmV4dCA9IHBFbnRyeS0+cE5leHQ7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCQlwUHJldkVudHJ5ID0gcFByb2JlRW50cnk7CisJCQlwUHJvYmVFbnRyeSA9IHBQcm9iZUVudHJ5LT5wTmV4dDsKKwkJfSB3aGlsZSAocFByb2JlRW50cnkpOworCisJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeSwgc2l6ZW9mKFRQQ19SRVFfRU5UUlkpKTsKKwkJcFRhYi0+U2l6ZS0tOworCisJCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7CisJfQorCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUdldCBDdXJyZW50IFRpbWVTIHRhbXAuCisKKwlQYXJhbWV0cnM6CisKKwlSZXR1cm4JOiBDdXJyZW50IFRpbWUgU3RhbXAuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworc3RhdGljIFVJTlQ2NCBHZXRDdXJyZW50VGltZVN0YW1wKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCS8vIGdldCBjdXJyZW50IHRpbWUgc3RhbXAuCisJcmV0dXJuIDA7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJR2V0IEN1cnJlbnQgVHJhbnNtaXQgUG93ZXIuCisKKwlQYXJhbWV0cnM6CisKKwlSZXR1cm4JOiBDdXJyZW50IFRpbWUgU3RhbXAuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworc3RhdGljIFVJTlQ4IEdldEN1clR4UHdyKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVJTlQ4IFdjaWQpCit7CisJcmV0dXJuIDE2OyAvKiAxNiBkQm0gKi8KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlJbnNlcnQgRGlhbG9nIFRva2VuIGludG8gZnJhbWUuCisKKwlQYXJhbWV0cnM6CisJCTEuIGZyYW1lIGJ1ZmZlciBwb2ludGVyLgorCQkyLiBmcmFtZSBsZW5ndGguCisJCTMuIERpYWxvZyB0b2tlbi4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworc3RhdGljIFZPSUQgSW5zZXJ0RGlhbG9nVG9rZW4oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJT1VUIFBVQ0hBUiBwRnJhbWVCdWYsCisJT1VUIFBVTE9ORyBwRnJhbWVMZW4sCisJSU4gVUlOVDggRGlhbG9nVG9rZW4pCit7CisJVUxPTkcgVGVtcExlbjsKKwlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYsCSZUZW1wTGVuLAorCQkJCQkxLAkJCQkmRGlhbG9nVG9rZW4sCisJCQkJCUVORF9PRl9BUkdTKTsKKworCSpwRnJhbWVMZW4gPSAqcEZyYW1lTGVuICsgVGVtcExlbjsKKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlJbnNlcnQgVFBDIFJlcXVlc3QgSUUgaW50byBmcmFtZS4KKworCVBhcmFtZXRyczoKKwkJMS4gZnJhbWUgYnVmZmVyIHBvaW50ZXIuCisJCTIuIGZyYW1lIGxlbmd0aC4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworIHN0YXRpYyBWT0lEIEluc2VydFRwY1JlcUlFKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAorCU9VVCBQVUxPTkcgcEZyYW1lTGVuKQoreworCVVMT05HIFRlbXBMZW47CisJVUxPTkcgTGVuID0gMDsKKwlVSU5UOCBFbGVtZW50SUQgPSBJRV9UUENfUkVRVUVTVDsKKworCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiwJCQkJCSZUZW1wTGVuLAorCQkJCQkJMSwJCQkJCQkJJkVsZW1lbnRJRCwKKwkJCQkJCTEsCQkJCQkJCSZMZW4sCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisKKwkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47CisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJSW5zZXJ0IFRQQyBSZXBvcnQgSUUgaW50byBmcmFtZS4KKworCVBhcmFtZXRyczoKKwkJMS4gZnJhbWUgYnVmZmVyIHBvaW50ZXIuCisJCTIuIGZyYW1lIGxlbmd0aC4KKwkJMy4gVHJhbnNtaXQgUG93ZXIuCisJCTQuIExpbmsgTWFyZ2luLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisgc3RhdGljIFZPSUQgSW5zZXJ0VHBjUmVwb3J0SUUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJT1VUIFBVQ0hBUiBwRnJhbWVCdWYsCisJT1VUIFBVTE9ORyBwRnJhbWVMZW4sCisJSU4gVUlOVDggVHhQd3IsCisJSU4gVUlOVDggTGlua01hcmdpbikKK3sKKwlVTE9ORyBUZW1wTGVuOworCVVMT05HIExlbiA9IHNpemVvZihUUENfUkVQT1JUX0lORk8pOworCVVJTlQ4IEVsZW1lbnRJRCA9IElFX1RQQ19SRVBPUlQ7CisJVFBDX1JFUE9SVF9JTkZPIFRwY1JlcG9ydElFOworCisJVHBjUmVwb3J0SUUuVHhQd3IgPSBUeFB3cjsKKwlUcGNSZXBvcnRJRS5MaW5rTWFyZ2luID0gTGlua01hcmdpbjsKKworCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiwJCQkJCSZUZW1wTGVuLAorCQkJCQkJMSwJCQkJCQkJJkVsZW1lbnRJRCwKKwkJCQkJCTEsCQkJCQkJCSZMZW4sCisJCQkJCQlMZW4sCQkJCQkJJlRwY1JlcG9ydElFLAorCQkJCQkJRU5EX09GX0FSR1MpOworCisJKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOworCisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJSW5zZXJ0IENoYW5uZWwgU3dpdGNoIEFubm91bmNlbWVudCBJRSBpbnRvIGZyYW1lLgorCisJUGFyYW1ldHJzOgorCQkxLiBmcmFtZSBidWZmZXIgcG9pbnRlci4KKwkJMi4gZnJhbWUgbGVuZ3RoLgorCQkzLiBjaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgbW9kZS4KKwkJNC4gbmV3IHNlbGVjdGVkIGNoYW5uZWwuCisJCTUuIGNoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCBjb3VudC4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworc3RhdGljIFZPSUQgSW5zZXJ0Q2hTd0FubklFKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAorCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAorCUlOIFVJTlQ4IENoU3dNb2RlLAorCUlOIFVJTlQ4IE5ld0NoYW5uZWwsCisJSU4gVUlOVDggQ2hTd0NudCkKK3sKKwlVTE9ORyBUZW1wTGVuOworCVVMT05HIExlbiA9IHNpemVvZihDSF9TV19BTk5fSU5GTyk7CisJVUlOVDggRWxlbWVudElEID0gSUVfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UOworCUNIX1NXX0FOTl9JTkZPIENoU3dBbm5JRTsKKworCUNoU3dBbm5JRS5DaFN3TW9kZSA9IENoU3dNb2RlOworCUNoU3dBbm5JRS5DaGFubmVsID0gTmV3Q2hhbm5lbDsKKwlDaFN3QW5uSUUuQ2hTd0NudCA9IENoU3dDbnQ7CisKKwlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYsCQkJCSZUZW1wTGVuLAorCQkJCQkJMSwJCQkJCQkmRWxlbWVudElELAorCQkJCQkJMSwJCQkJCQkmTGVuLAorCQkJCQkJTGVuLAkJCQkJJkNoU3dBbm5JRSwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKworCSpwRnJhbWVMZW4gPSAqcEZyYW1lTGVuICsgVGVtcExlbjsKKworCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUluc2VydCBNZWFzdXJlIFJlcXVlc3QgSUUgaW50byBmcmFtZS4KKworCVBhcmFtZXRyczoKKwkJMS4gZnJhbWUgYnVmZmVyIHBvaW50ZXIuCisJCTIuIGZyYW1lIGxlbmd0aC4KKwkJMy4gTWVhc3VyZSBUb2tlbi4KKwkJNC4gTWVhc3VyZSBSZXF1ZXN0IE1vZGUuCisJCTUuIE1lYXN1cmUgUmVxdWVzdCBUeXBlLgorCQk2LiBNZWFzdXJlIENoYW5uZWwuCisJCTcuIE1lYXN1cmUgU3RhcnQgdGltZS4KKwkJOC4gTWVhc3VyZSBEdXJhdGlvbi4KKworCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitzdGF0aWMgVk9JRCBJbnNlcnRNZWFzdXJlUmVxSUUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJT1VUIFBVQ0hBUiBwRnJhbWVCdWYsCisJT1VUIFBVTE9ORyBwRnJhbWVMZW4sCisJSU4gUE1FQVNVUkVfUkVRX0lORk8gcE1lYXN1cmVSZXFJRSkKK3sKKwlVTE9ORyBUZW1wTGVuOworCVVJTlQ4IExlbiA9IHNpemVvZihNRUFTVVJFX1JFUV9JTkZPKTsKKwlVSU5UOCBFbGVtZW50SUQgPSBJRV9NRUFTVVJFTUVOVF9SRVFVRVNUOworCisJTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmLAkJCQkJJlRlbXBMZW4sCisJCQkJCQkxLAkJCQkJCQkmRWxlbWVudElELAorCQkJCQkJMSwJCQkJCQkJJkxlbiwKKwkJCQkJCUxlbiwJCQkJCQlwTWVhc3VyZVJlcUlFLAorCQkJCQkJRU5EX09GX0FSR1MpOworCisJKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOworCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUluc2VydCBNZWFzdXJlIFJlcG9ydCBJRSBpbnRvIGZyYW1lLgorCisJUGFyYW1ldHJzOgorCQkxLiBmcmFtZSBidWZmZXIgcG9pbnRlci4KKwkJMi4gZnJhbWUgbGVuZ3RoLgorCQkzLiBNZWFzdXJlIFRva2VuLgorCQk0LiBNZWFzdXJlIFJlcXVlc3QgTW9kZS4KKwkJNS4gTWVhc3VyZSBSZXF1ZXN0IFR5cGUuCisJCTYuIExlbmd0aCBvZiBSZXBvcnQgSW5mb21hdGlvbgorCQk3LiBQb2ludGVyIG9mIFJlcG9ydCBJbmZvbWF0aW9uIEJ1ZmZlci4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworc3RhdGljIFZPSUQgSW5zZXJ0TWVhc3VyZVJlcG9ydElFKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAorCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAorCUlOIFBNRUFTVVJFX1JFUE9SVF9JTkZPIHBNZWFzdXJlUmVwb3J0SUUsCisJSU4gVUlOVDggUmVwb3J0TG5mb0xlbiwKKwlJTiBQVUlOVDggcFJlcG9ydEluZm8pCit7CisJVUxPTkcgVGVtcExlbjsKKwlVTE9ORyBMZW47CisJVUlOVDggRWxlbWVudElEID0gSUVfTUVBU1VSRU1FTlRfUkVQT1JUOworCisJTGVuID0gc2l6ZW9mKE1FQVNVUkVfUkVQT1JUX0lORk8pICsgUmVwb3J0TG5mb0xlbjsKKworCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiwJCQkJCSZUZW1wTGVuLAorCQkJCQkJMSwJCQkJCQkJJkVsZW1lbnRJRCwKKwkJCQkJCTEsCQkJCQkJCSZMZW4sCisJCQkJCQlMZW4sCQkJCQkJcE1lYXN1cmVSZXBvcnRJRSwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKworCSpwRnJhbWVMZW4gPSAqcEZyYW1lTGVuICsgVGVtcExlbjsKKworCWlmICgoUmVwb3J0TG5mb0xlbiA+IDApICYmIChwUmVwb3J0SW5mbyAhPSBOVUxMKSkKKwl7CisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiArICpwRnJhbWVMZW4sCQkmVGVtcExlbiwKKwkJCQkJCQlSZXBvcnRMbmZvTGVuLAkJCQlwUmVwb3J0SW5mbywKKwkJCQkJCQlFTkRfT0ZfQVJHUyk7CisKKwkJKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOworCX0KKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBNZWFzdXJlbWVudCByZXF1ZXN0IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCisJCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCisKKwlQYXJhbWV0cnM6CisJCTEuIHRoZSBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyBvZiB0aGUgZnJhbWUuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgRW5xdWV1ZU1lYXN1cmVtZW50UmVxKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBwREEsCisJSU4gVUlOVDggTWVhc3VyZVRva2VuLAorCUlOIFVJTlQ4IE1lYXN1cmVSZXFNb2RlLAorCUlOIFVJTlQ4IE1lYXN1cmVSZXFUeXBlLAorCUlOIFVJTlQ4IE1lYXN1cmVDaCwKKwlJTiBVSU5UMTYgTWVhc3VyZUR1cmF0aW9uKQoreworCVBVQ0hBUiBwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUyBOU3RhdHVzOworCVVMT05HIEZyYW1lTGVuOworCUhFQURFUl84MDJfMTEgQWN0SGRyOworCU1FQVNVUkVfUkVRX0lORk8gTWVhc3VyZVJlcUlFOworCVVJTlQ4IFJtUmVxRGFpbG9nVG9rZW4gPSBSYW5kb21CeXRlKHBBZCk7CisJVUlOVDY0IE1lYXN1cmVTdGFydFRpbWUgPSBHZXRDdXJyZW50VGltZVN0YW1wKHBBZCk7CisKKwkvLyBidWlsZCBhY3Rpb24gZnJhbWUgaGVhZGVyLgorCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQWN0SGRyLCBTVUJUWVBFX0FDVElPTiwgMCwgcERBLAorCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcyk7CisKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcygpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iLCBfX2Z1bmNfXykpOworCQlyZXR1cm47CisJfQorCU5kaXNNb3ZlTWVtb3J5KHBPdXRCdWZmZXIsIChQQ0hBUikmQWN0SGRyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCUZyYW1lTGVuID0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCisJSW5zZXJ0QWN0RmllbGQocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBDQVRFR09SWV9TUEVDVFJVTSwgU1BFQ19NUlEpOworCisJLy8gZmlsbCBEaWFsb2cgVG9rZW4KKwlJbnNlcnREaWFsb2dUb2tlbihwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIE1lYXN1cmVUb2tlbik7CisKKwkvLyBwcmVwYXJlIE1lYXN1cmVtZW50IElFLgorCU5kaXNaZXJvTWVtb3J5KCZNZWFzdXJlUmVxSUUsIHNpemVvZihNRUFTVVJFX1JFUV9JTkZPKSk7CisJTWVhc3VyZVJlcUlFLlRva2VuID0gUm1SZXFEYWlsb2dUb2tlbjsKKwlNZWFzdXJlUmVxSUUuUmVxTW9kZS53b3JkID0gTWVhc3VyZVJlcU1vZGU7CisJTWVhc3VyZVJlcUlFLlJlcVR5cGUgPSBNZWFzdXJlUmVxVHlwZTsKKwlNZWFzdXJlUmVxSUUuTWVhc3VyZVJlcS5DaE51bSA9IE1lYXN1cmVDaDsKKwlNZWFzdXJlUmVxSUUuTWVhc3VyZVJlcS5NZWFzdXJlU3RhcnRUaW1lID0gY3B1MmxlNjQoTWVhc3VyZVN0YXJ0VGltZSk7CisJTWVhc3VyZVJlcUlFLk1lYXN1cmVSZXEuTWVhc3VyZUR1cmF0aW9uID0gY3B1MmxlMTYoTWVhc3VyZUR1cmF0aW9uKTsKKwlJbnNlcnRNZWFzdXJlUmVxSUUocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCAmTWVhc3VyZVJlcUlFKTsKKworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlQcmVwYXJlIE1lYXN1cmVtZW50IHJlcG9ydCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bworCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCisJUGFyYW1ldHJzOgorCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEVucXVldWVNZWFzdXJlbWVudFJlcCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcERBLAorCUlOIFVJTlQ4IERpYWxvZ1Rva2VuLAorCUlOIFVJTlQ4IE1lYXN1cmVUb2tlbiwKKwlJTiBVSU5UOCBNZWFzdXJlUmVxTW9kZSwKKwlJTiBVSU5UOCBNZWFzdXJlUmVxVHlwZSwKKwlJTiBVSU5UOCBSZXBvcnRJbmZvTGVuLAorCUlOIFBVSU5UOCBwUmVwb3J0SW5mbykKK3sKKwlQVUNIQVIgcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMgTlN0YXR1czsKKwlVTE9ORyBGcmFtZUxlbjsKKwlIRUFERVJfODAyXzExIEFjdEhkcjsKKwlNRUFTVVJFX1JFUE9SVF9JTkZPIE1lYXN1cmVSZXBJRTsKKworCS8vIGJ1aWxkIGFjdGlvbiBmcmFtZSBoZWFkZXIuCisJTWd0TWFjSGVhZGVySW5pdChwQWQsICZBY3RIZHIsIFNVQlRZUEVfQUNUSU9OLCAwLCBwREEsCisJCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIsIF9fZnVuY19fKSk7CisJCXJldHVybjsKKwl9CisJTmRpc01vdmVNZW1vcnkocE91dEJ1ZmZlciwgKFBDSEFSKSZBY3RIZHIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJRnJhbWVMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisKKwlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIENBVEVHT1JZX1NQRUNUUlVNLCBTUEVDX01SUCk7CisKKwkvLyBmaWxsIERpYWxvZyBUb2tlbgorCUluc2VydERpYWxvZ1Rva2VuKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgRGlhbG9nVG9rZW4pOworCisJLy8gcHJlcGFyZSBNZWFzdXJlbWVudCBJRS4KKwlOZGlzWmVyb01lbW9yeSgmTWVhc3VyZVJlcElFLCBzaXplb2YoTUVBU1VSRV9SRVBPUlRfSU5GTykpOworCU1lYXN1cmVSZXBJRS5Ub2tlbiA9IE1lYXN1cmVUb2tlbjsKKwlNZWFzdXJlUmVwSUUuUmVwb3J0TW9kZS53b3JkID0gTWVhc3VyZVJlcU1vZGU7CisJTWVhc3VyZVJlcElFLlJlcG9ydFR5cGUgPSBNZWFzdXJlUmVxVHlwZTsKKwlJbnNlcnRNZWFzdXJlUmVwb3J0SUUocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCAmTWVhc3VyZVJlcElFLCBSZXBvcnRJbmZvTGVuLCBwUmVwb3J0SW5mbyk7CisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBUUEMgUmVxdWVzdCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bworCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCisJUGFyYW1ldHJzOgorCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEVucXVldWVUUENSZXEoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBVQ0hBUiBEaWFsb2dUb2tlbikKK3sKKwlQVUNIQVIgcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMgTlN0YXR1czsKKwlVTE9ORyBGcmFtZUxlbjsKKworCUhFQURFUl84MDJfMTEgQWN0SGRyOworCisJLy8gYnVpbGQgYWN0aW9uIGZyYW1lIGhlYWRlci4KKwlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkFjdEhkciwgU1VCVFlQRV9BQ1RJT04sIDAsIHBEQSwKKwkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MpOworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19mdW5jX18pKTsKKwkJcmV0dXJuOworCX0KKwlOZGlzTW92ZU1lbW9yeShwT3V0QnVmZmVyLCAoUENIQVIpJkFjdEhkciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwlGcmFtZUxlbiA9IHNpemVvZihIRUFERVJfODAyXzExKTsKKworCUluc2VydEFjdEZpZWxkKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgQ0FURUdPUllfU1BFQ1RSVU0sIFNQRUNfVFBDUlEpOworCisJLy8gZmlsbCBEaWFsb2cgVG9rZW4KKwlJbnNlcnREaWFsb2dUb2tlbihwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIERpYWxvZ1Rva2VuKTsKKworCS8vIEluc2VydCBUUEMgUmVxdWVzdCBJRS4KKwlJbnNlcnRUcGNSZXFJRShwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4pOworCisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVByZXBhcmUgVFBDIFJlcG9ydCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bworCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCisJUGFyYW1ldHJzOgorCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEVucXVldWVUUENSZXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBVSU5UOCBEaWFsb2dUb2tlbiwKKwlJTiBVSU5UOCBUeFB3ciwKKwlJTiBVSU5UOCBMaW5rTWFyZ2luKQoreworCVBVQ0hBUiBwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUyBOU3RhdHVzOworCVVMT05HIEZyYW1lTGVuOworCisJSEVBREVSXzgwMl8xMSBBY3RIZHI7CisKKwkvLyBidWlsZCBhY3Rpb24gZnJhbWUgaGVhZGVyLgorCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQWN0SGRyLCBTVUJUWVBFX0FDVElPTiwgMCwgcERBLAorCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcyk7CisKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcygpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iLCBfX2Z1bmNfXykpOworCQlyZXR1cm47CisJfQorCU5kaXNNb3ZlTWVtb3J5KHBPdXRCdWZmZXIsIChQQ0hBUikmQWN0SGRyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCUZyYW1lTGVuID0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCisJSW5zZXJ0QWN0RmllbGQocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBDQVRFR09SWV9TUEVDVFJVTSwgU1BFQ19UUENSUCk7CisKKwkvLyBmaWxsIERpYWxvZyBUb2tlbgorCUluc2VydERpYWxvZ1Rva2VuKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgRGlhbG9nVG9rZW4pOworCisJLy8gSW5zZXJ0IFRQQyBSZXF1ZXN0IElFLgorCUluc2VydFRwY1JlcG9ydElFKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgVHhQd3IsIExpbmtNYXJnaW4pOworCisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisJcmV0dXJuOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVByZXBhcmUgQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCisJCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCisKKwlQYXJhbWV0cnM6CisJCTEuIHRoZSBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyBvZiB0aGUgZnJhbWUuCisJCTIuIENoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCBtb2RlLgorCQkyLiBhIE5ldyBzZWxlY3RlZCBjaGFubmVsLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEVucXVldWVDaFN3QW5uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBwREEsCisJSU4gVUlOVDggQ2hTd01vZGUsCisJSU4gVUlOVDggTmV3Q2gpCit7CisJUFVDSEFSIHBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTIE5TdGF0dXM7CisJVUxPTkcgRnJhbWVMZW47CisKKwlIRUFERVJfODAyXzExIEFjdEhkcjsKKworCS8vIGJ1aWxkIGFjdGlvbiBmcmFtZSBoZWFkZXIuCisJTWd0TWFjSGVhZGVySW5pdChwQWQsICZBY3RIZHIsIFNVQlRZUEVfQUNUSU9OLCAwLCBwREEsCisJCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIsIF9fZnVuY19fKSk7CisJCXJldHVybjsKKwl9CisJTmRpc01vdmVNZW1vcnkocE91dEJ1ZmZlciwgKFBDSEFSKSZBY3RIZHIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJRnJhbWVMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisKKwlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIENBVEVHT1JZX1NQRUNUUlVNLCBTUEVDX0NIQU5ORUxfU1dJVENIKTsKKworCUluc2VydENoU3dBbm5JRShwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIENoU3dNb2RlLCBOZXdDaCwgMCk7CisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBCT09MRUFOIERmc1JlcXVpcmVtZW50Q2hlY2soCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUlOVDggQ2hhbm5lbCkKK3sKKwlCT09MRUFOIFJlc3VsdCA9IEZBTFNFOworCUlOVCBpOworCisJZG8KKwl7CisJCS8vIGNoZWNrIERGUyBwcm9jZWR1cmUgaXMgcnVubmluZy4KKwkJLy8gbWFrZSBzdXJlIERGUyBwcm9jZWR1cmUgd29uJ3Qgc3RhcnQgdHdpY2UuCisJCWlmIChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgIT0gUkRfTk9STUFMX01PREUpCisJCXsKKwkJCVJlc3VsdCA9IEZBTFNFOworCQkJYnJlYWs7CisJCX0KKworCQkvLyBjaGVjayB0aGUgbmV3IGNoYW5uZWwgY2FycmllZCBmcm9tIENoYW5uZWwgU3dpdGNoIEFubm91bmNlbW5ldCBpcyB2YWxpZC4KKwkJZm9yIChpPTA7IGk8cEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKQorCQl7CisJCQlpZiAoKENoYW5uZWwgPT0gcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsKQorCQkJCSYmKHBBZC0+Q2hhbm5lbExpc3RbaV0uUmVtYWluaW5nVGltZUZvclVzZSA9PSAwKSkKKwkJCXsKKwkJCQkvLyBmb3VuZCByYWRhciBzaWduYWwgaW4gdGhlIGNoYW5uZWwuIHRoZSBjaGFubmVsIGNhbid0IHVzZSBhdCBsZWFzdCBmb3IgMzAgbWludXRlcy4KKwkJCQlwQWQtPkNoYW5uZWxMaXN0W2ldLlJlbWFpbmluZ1RpbWVGb3JVc2UgPSAxODAwOy8vMzAgbWluID0gMTgwMCBzZWMKKwkJCQlSZXN1bHQgPSBUUlVFOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfSB3aGlsZShGQUxTRSk7CisKKwlyZXR1cm4gUmVzdWx0OworfQorCitWT0lEIE5vdGlmeUNoU3dBbm5Ub1BlZXJBUHMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBSQSwKKwlJTiBQVUNIQVIgcFRBLAorCUlOIFVJTlQ4IENoU3dNb2RlLAorCUlOIFVJTlQ4IENoYW5uZWwpCit7CisjaWZkZWYgV0RTX1NVUFBPUlQKKwlpZiAoISgocFJBWzBdICYgMHhmZikgPT0gMHhmZikpIC8vIGlzIHBSQSBhIGJyb2FkY2FzZSBhZGRyZXNzLgorCXsKKwkJSU5UIGk7CisJCS8vIGluZm8gbmVpZ2hib3IgQVBzIHRoYXQgUmFkYXIgc2lnbmFsIGZvdW5kIHRocm9naCBXRFMgbGluay4KKwkJZm9yIChpID0gMDsgaSA8IE1BWF9XRFNfRU5UUlk7IGkrKykKKwkJeworCQkJaWYgKFZhbGlkV2RzRW50cnkocEFkLCBpKSkKKwkJCXsKKwkJCQlQVUNIQVIgcERBID0gcEFkLT5XZHNUYWIuV2RzRW50cnlbaV0uUGVlcldkc0FkZHI7CisKKwkJCQkvLyBEQSBlcXVhbCB0byBTQS4gaGF2ZSBubyBuZWNlc3Nhcnkgb3JpZ25hbCBBUCB3aGljaCBmb3VuZCBSYWRhciBzaWduYWwuCisJCQkJaWYgKE1BQ19BRERSX0VRVUFMKHBUQSwgcERBKSkKKwkJCQkJY29udGludWU7CisKKwkJCQkvLyBzZW5kIENoYW5uZWwgU3dpdGNoIEFjdGlvbiBmcmFtZSB0byBpbmZvIE5laWdoYnJvIEFQcy4KKwkJCQlFbnF1ZXVlQ2hTd0FubihwQWQsIHBEQSwgQ2hTd01vZGUsIENoYW5uZWwpOworCQkJfQorCQl9CisJfQorI2VuZGlmIC8vIFdEU19TVVBQT1JUIC8vCit9CisKK3N0YXRpYyBWT0lEIFN0YXJ0REZTUHJvY2VkdXJlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSIENoYW5uZWwsCisJSU4gVUlOVDggQ2hTd01vZGUpCit7CisJLy8gc3RhcnQgREZTIHByb2NlZHVyZQorCXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSBDaGFubmVsOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCU5fQ2hhbm5lbENoZWNrKHBBZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlID0gUkRfU1dJVENISU5HX01PREU7CisJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ1NDb3VudCA9IDA7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IGFjdGlvbiBmcmFtZSBzYW5pdHkgY2hlY2suCisKKwlQYXJhbWV0cnM6CisJCTEuIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQorCQkyLiBtZXNzYWdlIGxlbmd0aC4KKwkJMy4gQ2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IGluZm9tYXRpb24gYnVmZmVyLgorCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyoKKyAgQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IElFLgorICArLS0tLSstLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rCisgIHwgSUQgfCBMZW4gfENoIFN3IE1vZGUgfCBOZXcgQ2ggTnVtIHwgQ2ggU3cgQ250IHwKKyAgKy0tLS0rLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKworICAgIDEgICAgMSAgICAgICAgMSAgICAgICAgICAgMSAgICAgICAgICAgIDEKKyovCitzdGF0aWMgQk9PTEVBTiBQZWVyQ2hTd0FublNhbml0eSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBWT0lEICpwTXNnLAorCUlOIFVMT05HIE1zZ0xlbiwKKwlPVVQgUENIX1NXX0FOTl9JTkZPIHBDaFN3QW5uSW5mbykKK3sKKwlQRlJBTUVfODAyXzExIEZyID0gKFBGUkFNRV84MDJfMTEpcE1zZzsKKwlQVUNIQVIgcEZyYW1lUHRyID0gRnItPk9jdGV0OworCUJPT0xFQU4gcmVzdWx0ID0gRkFMU0U7CisJUEVJRF9TVFJVQ1QgZWlkX3B0cjsKKworCS8vIHNraXAgODAyLjExIGhlYWRlci4KKwlNc2dMZW4gLT0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCisJLy8gc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuCisJcEZyYW1lUHRyICs9IDI7CisJTXNnTGVuIC09IDI7CisKKwlpZiAocENoU3dBbm5JbmZvID09IE5VTEwpCisJCXJldHVybiByZXN1bHQ7CisKKwllaWRfcHRyID0gKFBFSURfU1RSVUNUKXBGcmFtZVB0cjsKKwl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChQVUNIQVIpcEZyYW1lUHRyICsgTXNnTGVuKSkKKwl7CisJCXN3aXRjaChlaWRfcHRyLT5FaWQpCisJCXsKKwkJCWNhc2UgSUVfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UOgorCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQ2hTd0FubkluZm8tPkNoU3dNb2RlLCBlaWRfcHRyLT5PY3RldCwgMSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBDaFN3QW5uSW5mby0+Q2hhbm5lbCwgZWlkX3B0ci0+T2N0ZXQgKyAxLCAxKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcENoU3dBbm5JbmZvLT5DaFN3Q250LCBlaWRfcHRyLT5PY3RldCArIDIsIDEpOworCisJCQkJcmVzdWx0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJfQorCQllaWRfcHRyID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKWVpZF9wdHIgKyAyICsgZWlkX3B0ci0+TGVuKTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCU1lYXN1cmVtZW50IHJlcXVlc3QgYWN0aW9uIGZyYW1lIHNhbml0eSBjaGVjay4KKworCVBhcmFtZXRyczoKKwkJMS4gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisJCTIuIG1lc3NhZ2UgbGVuZ3RoLgorCQkzLiBNZWFzdXJlbWVudCByZXF1ZXN0IGluZm9tYXRpb24gYnVmZmVyLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitzdGF0aWMgQk9PTEVBTiBQZWVyTWVhc3VyZVJlcVNhbml0eSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBWT0lEICpwTXNnLAorCUlOIFVMT05HIE1zZ0xlbiwKKwlPVVQgUFVJTlQ4IHBEaWFsb2dUb2tlbiwKKwlPVVQgUE1FQVNVUkVfUkVRX0lORk8gcE1lYXN1cmVSZXFJbmZvKQoreworCVBGUkFNRV84MDJfMTEgRnIgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOworCVBVQ0hBUiBwRnJhbWVQdHIgPSBGci0+T2N0ZXQ7CisJQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKKwlQRUlEX1NUUlVDVCBlaWRfcHRyOworCVBVQ0hBUiBwdHI7CisJVUlOVDY0IE1lYXN1cmVTdGFydFRpbWU7CisJVUlOVDE2IE1lYXN1cmVEdXJhdGlvbjsKKworCS8vIHNraXAgODAyLjExIGhlYWRlci4KKwlNc2dMZW4gLT0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCisJLy8gc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuCisJcEZyYW1lUHRyICs9IDI7CisJTXNnTGVuIC09IDI7CisKKwlpZiAocE1lYXN1cmVSZXFJbmZvID09IE5VTEwpCisJCXJldHVybiByZXN1bHQ7CisKKwlOZGlzTW92ZU1lbW9yeShwRGlhbG9nVG9rZW4sIHBGcmFtZVB0ciwgMSk7CisJcEZyYW1lUHRyICs9IDE7CisJTXNnTGVuIC09IDE7CisKKwllaWRfcHRyID0gKFBFSURfU1RSVUNUKXBGcmFtZVB0cjsKKwl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChQVUNIQVIpcEZyYW1lUHRyICsgTXNnTGVuKSkKKwl7CisJCXN3aXRjaChlaWRfcHRyLT5FaWQpCisJCXsKKwkJCWNhc2UgSUVfTUVBU1VSRU1FTlRfUkVRVUVTVDoKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXFJbmZvLT5Ub2tlbiwgZWlkX3B0ci0+T2N0ZXQsIDEpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcUluZm8tPlJlcU1vZGUud29yZCwgZWlkX3B0ci0+T2N0ZXQgKyAxLCAxKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXFJbmZvLT5SZXFUeXBlLCBlaWRfcHRyLT5PY3RldCArIDIsIDEpOworCQkJCXB0ciA9IGVpZF9wdHItPk9jdGV0ICsgMzsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXFJbmZvLT5NZWFzdXJlUmVxLkNoTnVtLCBwdHIsIDEpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZNZWFzdXJlU3RhcnRUaW1lLCBwdHIgKyAxLCA4KTsKKwkJCQlwTWVhc3VyZVJlcUluZm8tPk1lYXN1cmVSZXEuTWVhc3VyZVN0YXJ0VGltZSA9IFNXQVA2NChNZWFzdXJlU3RhcnRUaW1lKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmTWVhc3VyZUR1cmF0aW9uLCBwdHIgKyA5LCAyKTsKKwkJCQlwTWVhc3VyZVJlcUluZm8tPk1lYXN1cmVSZXEuTWVhc3VyZUR1cmF0aW9uID0gU1dBUDE2KE1lYXN1cmVEdXJhdGlvbik7CisKKwkJCQlyZXN1bHQgPSBUUlVFOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisJCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopZWlkX3B0ciArIDIgKyBlaWRfcHRyLT5MZW4pOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJTWVhc3VyZW1lbnQgcmVwb3J0IGFjdGlvbiBmcmFtZSBzYW5pdHkgY2hlY2suCisKKwlQYXJhbWV0cnM6CisJCTEuIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQorCQkyLiBtZXNzYWdlIGxlbmd0aC4KKwkJMy4gTWVhc3VyZW1lbnQgcmVwb3J0IGluZm9tYXRpb24gYnVmZmVyLgorCQk0LiBiYXNpYyByZXBvcnQgaW5mb21hdGlvbiBidWZmZXIuCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyoKKyAgTWVhc3VyZW1lbnQgUmVwb3J0IElFLgorICArLS0tLSstLS0tLSstLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAgfCBJRCB8IExlbiB8IFRva2VuIHwgUmVwb3J0IE1vZGUgfCBNZWFzdXJlIFR5cGUgfCBNZWFzdXJlIFJlcG9ydCB8CisgICstLS0tKy0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICAgIDEgICAgIDEgICAgICAxICAgICAgICAgIDEgICAgICAgICAgICAgMSAgICAgICAgICAgIHZhcmlhYmxlCisKKyAgQmFzaWMgUmVwb3J0LgorICArLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0rCisgIHwgQ2ggTnVtIHwgU3RhcnQgVGltZSB8IER1cmF0aW9uIHwgTWFwIHwKKyAgKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tKworICAgICAgMSAgICAgICAgICA4ICAgICAgICAgICAyICAgICAgICAxCisKKyAgTWFwIEZpZWxkIEJpdCBGb3JtYXQuCisgICstLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rCisgIHwgQnNzIHwgT0ZETSBQcmVhbWJsZSB8IFVuaWRlbnRpZmllZCBzaWduYWwgfCBSYWRhciB8IFVubWVhc3VyZWQgfCBSZXNlcnZlZCB8CisgICstLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rCisgICAgIDAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgIDMgICAgICAgICA0ICAgICAgICAgIDUtNworKi8KK3N0YXRpYyBCT09MRUFOIFBlZXJNZWFzdXJlUmVwb3J0U2FuaXR5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFZPSUQgKnBNc2csCisJSU4gVUxPTkcgTXNnTGVuLAorCU9VVCBQVUlOVDggcERpYWxvZ1Rva2VuLAorCU9VVCBQTUVBU1VSRV9SRVBPUlRfSU5GTyBwTWVhc3VyZVJlcG9ydEluZm8sCisJT1VUIFBVSU5UOCBwUmVwb3J0QnVmKQoreworCVBGUkFNRV84MDJfMTEgRnIgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOworCVBVQ0hBUiBwRnJhbWVQdHIgPSBGci0+T2N0ZXQ7CisJQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKKwlQRUlEX1NUUlVDVCBlaWRfcHRyOworCVBVQ0hBUiBwdHI7CisKKwkvLyBza2lwIDgwMi4xMSBoZWFkZXIuCisJTXNnTGVuIC09IHNpemVvZihIRUFERVJfODAyXzExKTsKKworCS8vIHNraXAgY2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlLgorCXBGcmFtZVB0ciArPSAyOworCU1zZ0xlbiAtPSAyOworCisJaWYgKHBNZWFzdXJlUmVwb3J0SW5mbyA9PSBOVUxMKQorCQlyZXR1cm4gcmVzdWx0OworCisJTmRpc01vdmVNZW1vcnkocERpYWxvZ1Rva2VuLCBwRnJhbWVQdHIsIDEpOworCXBGcmFtZVB0ciArPSAxOworCU1zZ0xlbiAtPSAxOworCisJZWlkX3B0ciA9IChQRUlEX1NUUlVDVClwRnJhbWVQdHI7CisJd2hpbGUgKCgoVUNIQVIqKWVpZF9wdHIgKyBlaWRfcHRyLT5MZW4gKyAxKSA8ICgoUFVDSEFSKXBGcmFtZVB0ciArIE1zZ0xlbikpCisJeworCQlzd2l0Y2goZWlkX3B0ci0+RWlkKQorCQl7CisJCQljYXNlIElFX01FQVNVUkVNRU5UX1JFUE9SVDoKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXBvcnRJbmZvLT5Ub2tlbiwgZWlkX3B0ci0+T2N0ZXQsIDEpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcG9ydEluZm8tPlJlcG9ydE1vZGUsIGVpZF9wdHItPk9jdGV0ICsgMSwgMSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBNZWFzdXJlUmVwb3J0SW5mby0+UmVwb3J0VHlwZSwgZWlkX3B0ci0+T2N0ZXQgKyAyLCAxKTsKKwkJCQlpZiAocE1lYXN1cmVSZXBvcnRJbmZvLT5SZXBvcnRUeXBlID09IFJNX0JBU0lDKQorCQkJCXsKKwkJCQkJUE1FQVNVUkVfQkFTSUNfUkVQT1JUIHBSZXBvcnQgPSAoUE1FQVNVUkVfQkFTSUNfUkVQT1JUKXBSZXBvcnRCdWY7CisJCQkJCXB0ciA9IGVpZF9wdHItPk9jdGV0ICsgMzsKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPkNoTnVtLCBwdHIsIDEpOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWVhc3VyZVN0YXJ0VGltZSwgcHRyICsgMSwgOCk7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlRHVyYXRpb24sIHB0ciArIDksIDIpOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWFwLCBwdHIgKyAxMSwgMSk7CisKKwkJCQl9CisJCQkJZWxzZSBpZiAocE1lYXN1cmVSZXBvcnRJbmZvLT5SZXBvcnRUeXBlID09IFJNX0NDQSkKKwkJCQl7CisJCQkJCVBNRUFTVVJFX0NDQV9SRVBPUlQgcFJlcG9ydCA9IChQTUVBU1VSRV9DQ0FfUkVQT1JUKXBSZXBvcnRCdWY7CisJCQkJCXB0ciA9IGVpZF9wdHItPk9jdGV0ICsgMzsKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPkNoTnVtLCBwdHIsIDEpOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWVhc3VyZVN0YXJ0VGltZSwgcHRyICsgMSwgOCk7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlRHVyYXRpb24sIHB0ciArIDksIDIpOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+Q0NBX0J1c3lfRnJhY3Rpb24sIHB0ciArIDExLCAxKTsKKworCQkJCX0KKwkJCQllbHNlIGlmIChwTWVhc3VyZVJlcG9ydEluZm8tPlJlcG9ydFR5cGUgPT0gUk1fUlBJX0hJU1RPR1JBTSkKKwkJCQl7CisJCQkJCVBNRUFTVVJFX1JQSV9SRVBPUlQgcFJlcG9ydCA9IChQTUVBU1VSRV9SUElfUkVQT1JUKXBSZXBvcnRCdWY7CisJCQkJCXB0ciA9IGVpZF9wdHItPk9jdGV0ICsgMzsKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPkNoTnVtLCBwdHIsIDEpOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWVhc3VyZVN0YXJ0VGltZSwgcHRyICsgMSwgOCk7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlRHVyYXRpb24sIHB0ciArIDksIDIpOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+UlBJX0RlbnNpdHksIHB0ciArIDExLCA4KTsKKwkJCQl9CisJCQkJcmVzdWx0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJfQorCQllaWRfcHRyID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKWVpZF9wdHIgKyAyICsgZWlkX3B0ci0+TGVuKTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRQQyBSZXF1ZXN0IGFjdGlvbiBmcmFtZSBzYW5pdHkgY2hlY2suCisKKwlQYXJhbWV0cnM6CisJCTEuIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQorCQkyLiBtZXNzYWdlIGxlbmd0aC4KKwkJMy4gRGlhbG9nIFRva2VuLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitzdGF0aWMgQk9PTEVBTiBQZWVyVHBjUmVxU2FuaXR5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFZPSUQgKnBNc2csCisJSU4gVUxPTkcgTXNnTGVuLAorCU9VVCBQVUlOVDggcERpYWxvZ1Rva2VuKQoreworCVBGUkFNRV84MDJfMTEgRnIgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOworCVBVQ0hBUiBwRnJhbWVQdHIgPSBGci0+T2N0ZXQ7CisJQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKKwlQRUlEX1NUUlVDVCBlaWRfcHRyOworCisJTXNnTGVuIC09IHNpemVvZihIRUFERVJfODAyXzExKTsKKworCS8vIHNraXAgY2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlLgorCXBGcmFtZVB0ciArPSAyOworCU1zZ0xlbiAtPSAyOworCisJaWYgKHBEaWFsb2dUb2tlbiA9PSBOVUxMKQorCQlyZXR1cm4gcmVzdWx0OworCisJTmRpc01vdmVNZW1vcnkocERpYWxvZ1Rva2VuLCBwRnJhbWVQdHIsIDEpOworCXBGcmFtZVB0ciArPSAxOworCU1zZ0xlbiAtPSAxOworCisJZWlkX3B0ciA9IChQRUlEX1NUUlVDVClwRnJhbWVQdHI7CisJd2hpbGUgKCgoVUNIQVIqKWVpZF9wdHIgKyBlaWRfcHRyLT5MZW4gKyAxKSA8ICgoUFVDSEFSKXBGcmFtZVB0ciArIE1zZ0xlbikpCisJeworCQlzd2l0Y2goZWlkX3B0ci0+RWlkKQorCQl7CisJCQljYXNlIElFX1RQQ19SRVFVRVNUOgorCQkJCXJlc3VsdCA9IFRSVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KKwkJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKillaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUUEMgUmVwb3J0IGFjdGlvbiBmcmFtZSBzYW5pdHkgY2hlY2suCisKKwlQYXJhbWV0cnM6CisJCTEuIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQorCQkyLiBtZXNzYWdlIGxlbmd0aC4KKwkJMy4gRGlhbG9nIFRva2VuLgorCQk0LiBUUEMgUmVwb3J0IElFLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitzdGF0aWMgQk9PTEVBTiBQZWVyVHBjUmVwU2FuaXR5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFZPSUQgKnBNc2csCisJSU4gVUxPTkcgTXNnTGVuLAorCU9VVCBQVUlOVDggcERpYWxvZ1Rva2VuLAorCU9VVCBQVFBDX1JFUE9SVF9JTkZPIHBUcGNSZXBJbmZvKQoreworCVBGUkFNRV84MDJfMTEgRnIgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOworCVBVQ0hBUiBwRnJhbWVQdHIgPSBGci0+T2N0ZXQ7CisJQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKKwlQRUlEX1NUUlVDVCBlaWRfcHRyOworCisJTXNnTGVuIC09IHNpemVvZihIRUFERVJfODAyXzExKTsKKworCS8vIHNraXAgY2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlLgorCXBGcmFtZVB0ciArPSAyOworCU1zZ0xlbiAtPSAyOworCisJaWYgKHBEaWFsb2dUb2tlbiA9PSBOVUxMKQorCQlyZXR1cm4gcmVzdWx0OworCisJTmRpc01vdmVNZW1vcnkocERpYWxvZ1Rva2VuLCBwRnJhbWVQdHIsIDEpOworCXBGcmFtZVB0ciArPSAxOworCU1zZ0xlbiAtPSAxOworCisJZWlkX3B0ciA9IChQRUlEX1NUUlVDVClwRnJhbWVQdHI7CisJd2hpbGUgKCgoVUNIQVIqKWVpZF9wdHIgKyBlaWRfcHRyLT5MZW4gKyAxKSA8ICgoUFVDSEFSKXBGcmFtZVB0ciArIE1zZ0xlbikpCisJeworCQlzd2l0Y2goZWlkX3B0ci0+RWlkKQorCQl7CisJCQljYXNlIElFX1RQQ19SRVBPUlQ6CisJCQkJTmRpc01vdmVNZW1vcnkoJnBUcGNSZXBJbmZvLT5UeFB3ciwgZWlkX3B0ci0+T2N0ZXQsIDEpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwVHBjUmVwSW5mby0+TGlua01hcmdpbiwgZWlkX3B0ci0+T2N0ZXQgKyAxLCAxKTsKKwkJCQlyZXN1bHQgPSBUUlVFOworICAgICAgICAgICAgICAgIGJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisJCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopZWlkX3B0ciArIDIgKyBlaWRfcHRyLT5MZW4pOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IGFjdGlvbiBmcmFtZSBoYW5kbGVyLgorCisJUGFyYW1ldHJzOgorCQlFbG1lIC0gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBWT0lEIFBlZXJDaFN3QW5uQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlDSF9TV19BTk5fSU5GTyBDaFN3QW5uSW5mbzsKKwlQRlJBTUVfODAyXzExIHBGciA9IChQRlJBTUVfODAyXzExKUVsZW0tPk1zZzsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlVQ0hBUiBpbmRleCA9IDAsIENoYW5uZWwgPSAwLCBOZXdDaGFubmVsID0gMDsKKwlVTE9ORyBCc3NpZHggPSAwOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJTmRpc1plcm9NZW1vcnkoJkNoU3dBbm5JbmZvLCBzaXplb2YoQ0hfU1dfQU5OX0lORk8pKTsKKwlpZiAoISBQZWVyQ2hTd0FublNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmQ2hTd0FubkluZm8pKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSW52YWxpZCBDaGFubmVsIFN3aXRjaCBBY3Rpb24gRnJhbWUuXG4iKSk7CisJCXJldHVybjsKKwl9CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorCXsKKwkJQnNzaWR4ID0gQnNzVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgcEZyLT5IZHIuQWRkcjMsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQlpZiAoQnNzaWR4ID09IEJTU19OT1RfRk9VTkQpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJDaFN3QW5uQWN0aW9uIC0gQnNzaWR4IGlzIG5vdCBmb3VuZFxuIikpOworCQkJcmV0dXJuOworCQl9CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiXG4qKioqQnNzaWR4IGlzICVkLCBDaGFubmVsID0gJWRcbiIsIGluZGV4LCBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5DaGFubmVsKSk7CisJCWhleF9kdW1wKCJTU0lEIixwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5Cc3NpZCAsNik7CisKKwkJQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJCU5ld0NoYW5uZWwgPSBDaFN3QW5uSW5mby5DaGFubmVsOworCisJCWlmICgocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkgJiYgKE5ld0NoYW5uZWwgIT0gMCkgJiYgKENoYW5uZWwgIT0gTmV3Q2hhbm5lbCkpCisJCXsKKwkJCS8vIFN3aXRjaGluZyB0byBjaGFubmVsIDEgY2FuIHByZXZlbnQgZnJvbSByZXNjYW5uaW5nIHRoZSBjdXJyZW50IGNoYW5uZWwgaW1tZWRpYXRlbHkgKGJ5IGF1dG8gcmVjb25uZWN0aW9uKS4KKwkJCS8vIEluIGFkZGl0aW9uLCBjbGVhciB0aGUgTUxNRSBxdWV1ZSBhbmQgdGhlIHNjYW4gdGFibGUgdG8gZGlzY2FyZCB0aGUgUlggcGFja2V0cyBhbmQgcHJldmlvdXMgc2Nhbm5pbmcgcmVzdWx0cy4KKwkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgMSwgRkFMU0UpOworCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgMSk7CisJCSAgICBMaW5rRG93bihwQWQsIEZBTFNFKTsKKwkJCU1sbWVRdWV1ZUluaXQoJnBBZC0+TWxtZS5RdWV1ZSk7CisJCQlCc3NUYWJsZUluaXQoJnBBZC0+U2NhblRhYik7CisJCSAgICBSVE1QdXNlY0RlbGF5KDEwMDAwMDApOwkJLy8gdXNlIGRlbGF5IHRvIHByZXZlbnQgU1RBIGRvIHJlYXNzb2MKKworCQkJLy8gY2hhbm5lbCBzYW5pdHkgY2hlY2sKKwkJCWZvciAoaW5kZXggPSAwIDsgaW5kZXggPCBwQWQtPkNoYW5uZWxMaXN0TnVtOyBpbmRleCsrKQorCQkJeworCQkJCWlmIChwQWQtPkNoYW5uZWxMaXN0W2luZGV4XS5DaGFubmVsID09IE5ld0NoYW5uZWwpCisJCQkJeworCQkJCQlwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5DaGFubmVsID0gTmV3Q2hhbm5lbDsKKwkJCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IE5ld0NoYW5uZWw7CisJCQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOworCQkJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJiYmJiYmJiYmJiYmJiYmJlBlZXJDaFN3QW5uQWN0aW9uIC0gU1RBIHJlY2VpdmUgY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IElFIChOZXcgQ2hhbm5lbCA9JWQpXG4iLCBOZXdDaGFubmVsKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGluZGV4ID49IHBBZC0+Q2hhbm5lbExpc3ROdW0pCisJCQl7CisJCQkJREJHUFJJTlRfRVJSKCgiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiZQZWVyQ2hTd0FubkFjdGlvbihjYW4gbm90IGZpbmQgTmV3IENoYW5uZWw9JWQgaW4gQ2hhbm5lbExpc3RbJWRdXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPkNoYW5uZWxMaXN0TnVtKSk7CisJCQl9CisJCX0KKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlyZXR1cm47Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlNZWFzdXJlbWVudCBSZXF1ZXN0IGFjdGlvbiBmcmFtZSBoYW5kbGVyLgorCisJUGFyYW1ldHJzOgorCQlFbG1lIC0gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBWT0lEIFBlZXJNZWFzdXJlUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlQRlJBTUVfODAyXzExIHBGciA9IChQRlJBTUVfODAyXzExKUVsZW0tPk1zZzsKKwlVSU5UOCBEaWFsb2dUb2tlbjsKKwlNRUFTVVJFX1JFUV9JTkZPIE1lYXN1cmVSZXFJbmZvOworCU1FQVNVUkVfUkVQT1JUX01PREUgUmVwb3J0TW9kZTsKKworCWlmKFBlZXJNZWFzdXJlUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZEaWFsb2dUb2tlbiwgJk1lYXN1cmVSZXFJbmZvKSkKKwl7CisJCVJlcG9ydE1vZGUud29yZCA9IDA7CisJCVJlcG9ydE1vZGUuZmllbGQuSW5jYXBhYmxlID0gMTsKKwkJRW5xdWV1ZU1lYXN1cmVtZW50UmVwKHBBZCwgcEZyLT5IZHIuQWRkcjIsIERpYWxvZ1Rva2VuLCBNZWFzdXJlUmVxSW5mby5Ub2tlbiwgUmVwb3J0TW9kZS53b3JkLCBNZWFzdXJlUmVxSW5mby5SZXFUeXBlLCAwLCBOVUxMKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJTWVhc3VyZW1lbnQgUmVwb3J0IGFjdGlvbiBmcmFtZSBoYW5kbGVyLgorCisJUGFyYW1ldHJzOgorCQlFbG1lIC0gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3N0YXRpYyBWT0lEIFBlZXJNZWFzdXJlUmVwb3J0QWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlNRUFTVVJFX1JFUE9SVF9JTkZPIE1lYXN1cmVSZXBvcnRJbmZvOworCVBGUkFNRV84MDJfMTEgcEZyID0gKFBGUkFNRV84MDJfMTEpRWxlbS0+TXNnOworCVVJTlQ4IERpYWxvZ1Rva2VuOworCVBVSU5UOCBwTWVhc3VyZVJlcG9ydEluZm87CisKKy8vCWlmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCAhPSBUUlVFKQorLy8JCXJldHVybjsKKworCWlmICgocE1lYXN1cmVSZXBvcnRJbmZvID0ga21hbGxvYyhzaXplb2YoTUVBU1VSRV9SUElfUkVQT1JUKSwgR0ZQX0FUT01JQykpID09IE5VTEwpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyB1bmFibGUgdG8gYWxsb2MgbWVtb3J5IGZvciBtZWFzdXJlIHJlcG9ydCBidWZmZXIgKHNpemU9JWQpLlxuIiwgX19mdW5jX18sIHNpemVvZihNRUFTVVJFX1JQSV9SRVBPUlQpKSk7CisJCXJldHVybjsKKwl9CisKKwlOZGlzWmVyb01lbW9yeSgmTWVhc3VyZVJlcG9ydEluZm8sIHNpemVvZihNRUFTVVJFX1JFUE9SVF9JTkZPKSk7CisJTmRpc1plcm9NZW1vcnkocE1lYXN1cmVSZXBvcnRJbmZvLCBzaXplb2YoTUVBU1VSRV9SUElfUkVQT1JUKSk7CisJaWYgKFBlZXJNZWFzdXJlUmVwb3J0U2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZEaWFsb2dUb2tlbiwgJk1lYXN1cmVSZXBvcnRJbmZvLCBwTWVhc3VyZVJlcG9ydEluZm8pKQorCXsKKwkJZG8geworCQkJUE1FQVNVUkVfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEw7CisKKwkJCS8vIE5vdCBhIGF1dG9ub21vdXMgbWVhc3VyZSByZXBvcnQuCisJCQkvLyBjaGVjayB0aGUgZGlhbG9nIHRva2VuIGZpZWxkLiBkcm9wIGl0IGlmIHRoZSBkaWFsb2cgdG9rZW4gZG9lc24ndCBtYXRjaC4KKwkJCWlmICgoRGlhbG9nVG9rZW4gIT0gMCkKKwkJCQkmJiAoKHBFbnRyeSA9IE1lYXN1cmVSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbikpID09IE5VTEwpKQorCQkJCWJyZWFrOworCisJCQlpZiAocEVudHJ5ICE9IE5VTEwpCisJCQkJTWVhc3VyZVJlcURlbGV0ZShwQWQsIHBFbnRyeS0+RGlhbG9nVG9rZW4pOworCisJCQlpZiAoTWVhc3VyZVJlcG9ydEluZm8uUmVwb3J0VHlwZSA9PSBSTV9CQVNJQykKKwkJCXsKKwkJCQlQTUVBU1VSRV9CQVNJQ19SRVBPUlQgcEJhc2ljUmVwb3J0ID0gKFBNRUFTVVJFX0JBU0lDX1JFUE9SVClwTWVhc3VyZVJlcG9ydEluZm87CisJCQkJaWYgKChwQmFzaWNSZXBvcnQtPk1hcC5maWVsZC5SYWRhcikKKwkJCQkJJiYgKERmc1JlcXVpcmVtZW50Q2hlY2socEFkLCBwQmFzaWNSZXBvcnQtPkNoTnVtKSA9PSBUUlVFKSkKKwkJCQl7CisJCQkJCU5vdGlmeUNoU3dBbm5Ub1BlZXJBUHMocEFkLCBwRnItPkhkci5BZGRyMSwgcEZyLT5IZHIuQWRkcjIsIDEsIHBCYXNpY1JlcG9ydC0+Q2hOdW0pOworCQkJCQlTdGFydERGU1Byb2NlZHVyZShwQWQsIHBCYXNpY1JlcG9ydC0+Q2hOdW0sIDEpOworCQkJCX0KKwkJCX0KKwkJfSB3aGlsZSAoRkFMU0UpOworCX0KKwllbHNlCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkludmFsaWQgTWVhc3VyZW1lbnQgUmVwb3J0IEZyYW1lLlxuIikpOworCisJa2ZyZWUocE1lYXN1cmVSZXBvcnRJbmZvKTsKKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUUEMgUmVxdWVzdCBhY3Rpb24gZnJhbWUgaGFuZGxlci4KKworCVBhcmFtZXRyczoKKwkJRWxtZSAtIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitzdGF0aWMgVk9JRCBQZWVyVHBjUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlQRlJBTUVfODAyXzExIHBGciA9IChQRlJBTUVfODAyXzExKUVsZW0tPk1zZzsKKwlQVUNIQVIgcEZyYW1lUHRyID0gcEZyLT5PY3RldDsKKwlVSU5UOCBEaWFsb2dUb2tlbjsKKwlVSU5UOCBUeFB3ciA9IEdldEN1clR4UHdyKHBBZCwgRWxlbS0+V2NpZCk7CisJVUlOVDggTGlua01hcmdpbiA9IDA7CisJQ0hBUiBSZWFsUnNzaTsKKworCS8vIGxpbmsgbWFyZ2luOiBSYXRpbyBvZiB0aGUgcmVjZWl2ZWQgc2lnbmFsIHBvd2VyIHRvIHRoZSBtaW5pbXVtIGRlc2lyZWQgYnkgdGhlIHN0YXRpb24gKFNUQSkuIFRoZQorCS8vCQkJCVNUQSBtYXkgaW5jb3Jwb3JhdGUgcmF0ZSBpbmZvcm1hdGlvbiBhbmQgY2hhbm5lbCBjb25kaXRpb25zLCBpbmNsdWRpbmcgaW50ZXJmZXJlbmNlLCBpbnRvIGl0cyBjb21wdXRhdGlvbgorCS8vCQkJCW9mIGxpbmsgbWFyZ2luLgorCisJUmVhbFJzc2kgPSBSVE1QTWF4UnNzaShwQWQsIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMCwgUlNTSV8wKSwKKwkJCQkJCQkJQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kxLCBSU1NJXzEpLAorCQkJCQkJCQlDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTIsIFJTU0lfMikpOworCisJLy8gc2tpcCBDYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuCisJcEZyYW1lUHRyICs9IDI7CisKKwkvLyBEaWFsb2cgdG9rZW4uCisJTmRpc01vdmVNZW1vcnkoJkRpYWxvZ1Rva2VuLCBwRnJhbWVQdHIsIDEpOworCisJTGlua01hcmdpbiA9IChSZWFsUnNzaSAvIE1JTl9SQ1ZfUFdSKTsKKwlpZiAoUGVlclRwY1JlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmRGlhbG9nVG9rZW4pKQorCQlFbnF1ZXVlVFBDUmVwKHBBZCwgcEZyLT5IZHIuQWRkcjIsIERpYWxvZ1Rva2VuLCBUeFB3ciwgTGlua01hcmdpbik7CisKKwlyZXR1cm47Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVFBDIFJlcG9ydCBhY3Rpb24gZnJhbWUgaGFuZGxlci4KKworCVBhcmFtZXRyczoKKwkJRWxtZSAtIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitzdGF0aWMgVk9JRCBQZWVyVHBjUmVwQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVSU5UOCBEaWFsb2dUb2tlbjsKKwlUUENfUkVQT1JUX0lORk8gVHBjUmVwSW5mbzsKKwlQVFBDX1JFUV9FTlRSWSBwRW50cnkgPSBOVUxMOworCisJTmRpc1plcm9NZW1vcnkoJlRwY1JlcEluZm8sIHNpemVvZihUUENfUkVQT1JUX0lORk8pKTsKKwlpZiAoUGVlclRwY1JlcFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmRGlhbG9nVG9rZW4sICZUcGNSZXBJbmZvKSkKKwl7CisJCWlmICgocEVudHJ5ID0gVHBjUmVxTG9va1VwKHBBZCwgRGlhbG9nVG9rZW4pKSAhPSBOVUxMKQorCQl7CisJCQlUcGNSZXFEZWxldGUocEFkLCBwRW50cnktPkRpYWxvZ1Rva2VuKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOiBEaWFsb2dUb2tlbj0leCwgVHhQd3I9JWQsIExpbmtNYXJnaW49JWRcbiIsCisJCQkJX19mdW5jX18sIERpYWxvZ1Rva2VuLCBUcGNSZXBJbmZvLlR4UHdyLCBUcGNSZXBJbmZvLkxpbmtNYXJnaW4pKTsKKwkJfQorCX0KKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlTcGVjdHJ1biBhY3Rpb24gZnJhbWVzIEhhbmRsZXIgc3VjaCBhcyBjaGFubmVsIHN3aXRjaCBhbm5vdWNlbWVudCwKKwkJbWVhc3VyZW1lbnQgcmVwb3J0LCBtZWFzdXJlbWVudCByZXF1ZXN0IGFjdGlvbnMgZnJhbWVzLgorCisJUGFyYW1ldHJzOgorCQlFbG1lIC0gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUGVlclNwZWN0cnVtQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKworCVVDSEFSCUFjdGlvbiA9IEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzFdOworCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIICE9IFRSVUUpCisJCXJldHVybjsKKworCXN3aXRjaChBY3Rpb24pCisJeworCQljYXNlIFNQRUNfTVJROgorCQkJLy8gY3VycmVudCBydDI4NjAgdW5hYmxlIGRvIHN1Y2ggbWVhc3VyZSBzcGVjaWZpZWQgaW4gTWVhc3VyZW1lbnQgUmVxdWVzdC4KKwkJCS8vIHJlamVjdCBhbGwgbWVhc3VyZW1lbnQgcmVxdWVzdC4KKwkJCVBlZXJNZWFzdXJlUmVxQWN0aW9uKHBBZCwgRWxlbSk7CisJCQlicmVhazsKKworCQljYXNlIFNQRUNfTVJQOgorCQkJUGVlck1lYXN1cmVSZXBvcnRBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU1BFQ19UUENSUToKKwkJCVBlZXJUcGNSZXFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU1BFQ19UUENSUDoKKwkJCVBlZXJUcGNSZXBBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU1BFQ19DSEFOTkVMX1NXSVRDSDoKK3sKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJCQkJU0VDX0NIQV9PRkZTRVRfSUUJU2Vjb25kYXJ5OworCQkJCUNIQV9TV0lUQ0hfQU5OT1VOQ0VfSUUJQ2hhbm5lbFN3aXRjaDsKKworCQkJCS8vIDgwMi4xMWggb25seSBoYXMgQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IElFLgorCQkJCVJUTVBNb3ZlTWVtb3J5KCZDaGFubmVsU3dpdGNoLCAmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErNF0sIHNpemVvZiAoQ0hBX1NXSVRDSF9BTk5PVU5DRV9JRSkpOworCisJCQkJLy8gODAyLjExbiBEMy4wMyBhZGRzIHNlY29uZGFyeSBjaGFubmVsIG9mZnNldCBlbGVtZW50IGluIHRoZSBlbmQuCisJCQkJaWYgKEVsZW0tPk1zZ0xlbiA9PSAgKExFTkdUSF84MDJfMTEgKyAyICsgc2l6ZW9mIChDSEFfU1dJVENIX0FOTk9VTkNFX0lFKSArIHNpemVvZiAoU0VDX0NIQV9PRkZTRVRfSUUpKSkKKwkJCQl7CisJCQkJCVJUTVBNb3ZlTWVtb3J5KCZTZWNvbmRhcnksICZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSs5XSwgc2l6ZW9mIChTRUNfQ0hBX09GRlNFVF9JRSkpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlTZWNvbmRhcnkuU2Vjb25kYXJ5Q2hhbm5lbE9mZnNldCA9IDA7CisJCQkJfQorCisJCQkJaWYgKChFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsyXSA9PSBJRV9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlQpICYmIChFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSszXSA9PSAzKSkKKwkJCQl7CisJCQkJCUNoYW5uZWxTd2l0Y2hBY3Rpb24ocEFkLCBFbGVtLT5XY2lkLCBDaGFubmVsU3dpdGNoLk5ld0NoYW5uZWwsIFNlY29uZGFyeS5TZWNvbmRhcnlDaGFubmVsT2Zmc2V0KTsKKwkJCQl9CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworfQorCQkJUGVlckNoU3dBbm5BY3Rpb24ocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCX0KKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJUGFyYW1ldHJzOgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitJTlQgU2V0X01lYXN1cmVSZXFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUlOVCBBaWQgPSAxOworCVVJTlQgQXJnSWR4OworCVBVQ0hBUiB0aGlzQ2hhcjsKKworCU1FQVNVUkVfUkVRX01PREUgTWVhc3VyZVJlcU1vZGU7CisJVUlOVDggTWVhc3VyZVJlcVRva2VuID0gUmFuZG9tQnl0ZShwQWQpOworCVVJTlQ4IE1lYXN1cmVSZXFUeXBlID0gUk1fQkFTSUM7CisJVUlOVDggTWVhc3VyZUNoID0gMTsKKworCUFyZ0lkeCA9IDE7CisJd2hpbGUgKCh0aGlzQ2hhciA9IHN0cnNlcCgoY2hhciAqKikmYXJnLCAiLSIpKSAhPSBOVUxMKQorCXsKKwkJc3dpdGNoKEFyZ0lkeCkKKwkJeworCQkJY2FzZSAxOgkvLyBBaWQuCisJCQkJQWlkID0gc2ltcGxlX3N0cnRvbCh0aGlzQ2hhciwgMCwgMTYpOworCQkJCWJyZWFrOworCisJCQljYXNlIDI6IC8vIE1lYXN1cmVtZW50IFJlcXVlc3QgVHlwZS4KKwkJCQlNZWFzdXJlUmVxVHlwZSA9IHNpbXBsZV9zdHJ0b2wodGhpc0NoYXIsIDAsIDE2KTsKKwkJCQlpZiAoTWVhc3VyZVJlcVR5cGUgPiAzKQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHVua25vdyBNZWFzdXJlUmVxVHlwZSglZClcbiIsIF9fZnVuY19fLCBNZWFzdXJlUmVxVHlwZSkpOworCQkJCQlyZXR1cm4gVFJVRTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMzogLy8gTWVhc3VyZW1lbnQgY2hhbm5lbC4KKwkJCQlNZWFzdXJlQ2ggPSBzaW1wbGVfc3RydG9sKHRoaXNDaGFyLCAwLCAxNik7CisJCQkJYnJlYWs7CisJCX0KKwkJQXJnSWR4Kys7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OkFpZCA9ICVkLCBNZWFzdXJlUmVxVHlwZT0lZCBNZWFzdXJlQ2g9JWRcbiIsIF9fZnVuY19fLCBBaWQsIE1lYXN1cmVSZXFUeXBlLCBNZWFzdXJlQ2gpKTsKKwlpZiAoIVZBTElEX1dDSUQoQWlkKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiB1bmtub3cgc3RhIG9mIEFpZCglZClcbiIsIF9fZnVuY19fLCBBaWQpKTsKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJTWVhc3VyZVJlcU1vZGUud29yZCA9IDA7CisJTWVhc3VyZVJlcU1vZGUuZmllbGQuRW5hYmxlID0gMTsKKworCU1lYXN1cmVSZXFJbnNlcnQocEFkLCBNZWFzdXJlUmVxVG9rZW4pOworCisJRW5xdWV1ZU1lYXN1cmVtZW50UmVxKHBBZCwgcEFkLT5NYWNUYWIuQ29udGVudFtBaWRdLkFkZHIsCisJCU1lYXN1cmVSZXFUb2tlbiwgTWVhc3VyZVJlcU1vZGUud29yZCwgTWVhc3VyZVJlcVR5cGUsIE1lYXN1cmVDaCwgMjAwMCk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UIFNldF9UcGNSZXFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUlOVCBBaWQ7CisKKwlVSU5UOCBUcGNSZXFUb2tlbiA9IFJhbmRvbUJ5dGUocEFkKTsKKworCUFpZCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxNik7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6QWlkID0gJWRcbiIsIF9fZnVuY19fLCBBaWQpKTsKKwlpZiAoIVZBTElEX1dDSUQoQWlkKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiB1bmtub3cgc3RhIG9mIEFpZCglZClcbiIsIF9fZnVuY19fLCBBaWQpKTsKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJVHBjUmVxSW5zZXJ0KHBBZCwgVHBjUmVxVG9rZW4pOworCisJRW5xdWV1ZVRQQ1JlcShwQWQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5BZGRyLCBUcGNSZXFUb2tlbik7CisKKwlyZXR1cm4gVFJVRTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9kZnMuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvZGZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUyYTYzNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvZGZzLmgKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgZGZzLmgKKworICAgIEFic3RyYWN0OgorICAgIFN1cHBvcnQgREZTIGZ1bmN0aW9uLgorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgV2hlbiAgICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgLS0tLS0tLS0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBGb25jaGkgICAgMDMtMTItMjAwNyAgICAgIGNyZWF0ZWQKKyovCisKKyNkZWZpbmUgUkFEQVJfUFVMU0UgMQorI2RlZmluZSBSQURBUl9XSURUSCAyCisKKyNkZWZpbmUgV0lEVEhfUkRfSURMRSAwCisjZGVmaW5lIFdJRFRIX1JEX0NIRUNLIDEKKworCitWT0lEIEJicFJhZGFyRGV0ZWN0aW9uU3RhcnQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIEJicFJhZGFyRGV0ZWN0aW9uU3RvcCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgUmFkYXJEZXRlY3Rpb25TdGFydCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBCT09MRUFOIENUU19Qcm90ZWN0LAorCUlOIFVJTlQ4IENUU1BlcmlvZCk7CisKK1ZPSUQgUmFkYXJEZXRlY3Rpb25TdG9wKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBSYWRhckRldGVjdFBlcmlvZGljKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworCitCT09MRUFOIFJhZGFyQ2hhbm5lbENoZWNrKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFVDSEFSCQkJQ2gpOworCitVTE9ORyBKYXBSYWRhclR5cGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitVTE9ORyBSVE1QQmJwUmVhZFJhZGFyRHVyYXRpb24oCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCitVTE9ORyBSVE1QUmVhZFJhZGFyRHVyYXRpb24oCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIFJUTVBDbGVhblJhZGFyRHVyYXRpb24oCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIFJUTVBQcmVwYXJlUkRDVFNGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwREEsCisJSU4JVUxPTkcJCQlEdXJhdGlvbiwKKwlJTiAgVUNIQVIgICAgICAgICAgIFJUU1JhdGUsCisJSU4gIFVMT05HICAgICAgICAgICBDVFNCYXNlQWRkciwKKwlJTiAgVUNIQVIJCQlGcmFtZUdhcCk7CisKK1ZPSUQgUlRNUFByZXBhcmVSYWRhckRldGVjdFBhcmFtcygKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCk7CisKKworSU5UIFNldF9DaE1vdmluZ1RpbWVfUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgYXJnKTsKKworSU5UIFNldF9Mb25nUHVsc2VSYWRhclRoX1Byb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIGFyZyk7CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9sZWFwLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2xlYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODE4YzFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9sZWFwLmgKQEAgLTAsMCArMSwyMTUgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJbGVhcC5oCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCisqLworI2lmbmRlZiBfX0xFQVBfSF9fCisjZGVmaW5lIF9fTEVBUF9IX18KKworLy8gTWVzc2FnZXMgZm9yIEFzc29jaWF0ZSBzdGF0ZSBtYWNoaW5lCisjZGVmaW5lIExFQVBfTUFDSElORV9CQVNFICAgICAgICAgICAgICAgICAgIDMwCisKKyNkZWZpbmUgTEVBUF9NU0dfUkVRVUVTVF9JREVOVElUWSAgICAgICAgICAgMzEKKyNkZWZpbmUgTEVBUF9NU0dfUkVRVUVTVF9MRUFQICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgTEVBUF9NU0dfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgMzMKKyNkZWZpbmUgTEVBUF9NU0dfRkFJTEVEICAgICAgICAgICAgICAgICAgICAgMzQKKyNkZWZpbmUgTEVBUF9NU0dfUkVTUE9OU0VfTEVBUCAgICAgICAgICAgICAgMzUKKyNkZWZpbmUgTEVBUF9NU0dfRUFQT0xLRVkgICAgICAgICAgICAgICAgICAgMzYKKyNkZWZpbmUgTEVBUF9NU0dfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAgMzcKKyNkZWZpbmUgTEVBUF9NU0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzgKKy8vISBhc3NvYyBzdGF0ZS1tYWNoaW5lIHN0YXRlcworI2RlZmluZSBMRUFQX0lETEUgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIExFQVBfV0FJVF9JREVOVElUWV9SRVFVRVNUICAgICAgICAgIDEKKyNkZWZpbmUgTEVBUF9XQUlUX0NIQU5MTEVOR0VfUkVRVUVTVCAgICAgICAgMgorI2RlZmluZSBMRUFQX1dBSVRfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIExFQVBfV0FJVF9DSEFOTExFTkdFX1JFU1BPTlNFICAgICAgIDQKKyNkZWZpbmUgTEVBUF9XQUlUX0VBUE9MS0VZICAgICAgICAgICAgICAgICAgNQorCisjZGVmaW5lIExFQVBfUkVBU09OX0lOVkFMSURfQVVUSCAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBMRUFQX1JFQVNPTl9BVVRIX1RJTUVPVVQgICAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgTEVBUF9SRUFTT05fQ0hBTExFTkdFX0ZST01fQVBfRkFJTEVEICAgICAgICAweDAzCisjZGVmaW5lIExFQVBfUkVBU09OX0NIQUxMRU5HRV9UT19BUF9GQUlMRUQgICAgICAgICAgMHgwNAorCisjZGVmaW5lIENJU0NPX0F1dGhNb2RlTEVBUCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MAorI2RlZmluZSBDSVNDT19BdXRoTW9kZUxFQVBOb25lICAgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgTEVBUF9BVVRIX1RJTUVPVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDAwMAorI2RlZmluZSBMRUFQX0NIQUxMRU5HRV9SRVNQT05TRV9MRU5HVEggICAgICAgICAgICAgIDI0CisjZGVmaW5lIExFQVBfQ0hBTExFTkdFX1JFUVVFU1RfTEVOR1RIICAgICAgICAgICAgICAgOAorCit0eXBlZGVmIHN0cnVjdCBfTEVBUF9FQVBPTF9IRUFERVJfIHsKKyAgICBVQ0hBUiAgICAgICBWZXJzaW9uOworICAgIFVDSEFSICAgICAgIFR5cGU7CisgICAgVUNIQVIgICAgICAgTGVuZ3RoWzJdOworfSBMRUFQX0VBUE9MX0hFQURFUiwgKlBMRUFQX0VBUE9MX0hFQURFUjsKKwordHlwZWRlZiBzdHJ1Y3QgX0xFQVBfRUFQT0xfUEFDS0VUXyB7CisgICAgVUNIQVIgICAgICAgQ29kZTsKKyAgICBVQ0hBUiAgICAgICBJZGVudGlmaWVyOworICAgIFVDSEFSICAgICAgIExlbmd0aFsyXTsKKyAgICBVQ0hBUiAgICAgICBUeXBlOworfSBMRUFQX0VBUE9MX1BBQ0tFVCwgKlBMRUFQX0VBUE9MX1BBQ0tFVDsKKwordHlwZWRlZiBzdHJ1Y3QgX0xFQVBfRUFQX0NPTlRFTlRTXyB7CisgICAgVUNIQVIgICAgICAgVmVyc2lvbjsKKyAgICBVQ0hBUiAgICAgICBSZXNlcnZlZDsKKyAgICBVQ0hBUiAgICAgICBMZW5ndGg7Cit9IExFQVBfRUFQX0NPTlRFTlRTLCAqUExFQVBfRUFQX0NPTlRFTlRTOworCisvKioqIEVBUE9MIGtleSAqKiovCit0eXBlZGVmIHN0cnVjdCBfRUFQT0xfS0VZX0hFQURFUl8geworICAgIFVDSEFSICAgICAgIFR5cGU7CisgICAgVUNIQVIgICAgICAgTGVuZ3RoWzJdOworICAgIFVDSEFSICAgICAgIENvdW50ZXJbOF07CisgICAgVUNIQVIgICAgICAgSVZbMTZdOworICAgIFVDSEFSICAgICAgIEluZGV4OworICAgIFVDSEFSICAgICAgIFNpZ25hdHVyZVsxNl07Cit9IEVBUE9MX0tFWV9IRUFERVIsICpQRUFQT0xfS0VZX0hFQURFUjsKKworQk9PTEVBTiBMZWFwTXNnVHlwZVN1YnN0KAorICAgIElOICBVQ0hBUiAgIEVBUFR5cGUsCisgICAgT1VUIFVMT05HICAgKk1zZ1R5cGUpOworCitWT0lEIExlYXBNYWNoaW5lUGVyZm9ybUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKyAgICBJTiBTVEFURV9NQUNISU5FICAgICpTLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAgKkVsZW0pOworCitWT0lEIExlYXBNYWNIZWFkZXJJbml0KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCwKKyAgICBJTiAgT1VUIFBIRUFERVJfODAyXzExICBwSGRyODAyMTEsCisgICAgSU4gIFVDSEFSICAgICAgICAgICAgICAgd2VwLAorICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIHBBZGRyMyk7CisKK1ZPSUQgTGVhcFN0YXJ0QWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAgKkVsZW0pOworCitWT0lEIExlYXBJZGVudGl0eUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKTsKKworVk9JRCBMZWFwUGVlckNoYWxsZW5nZUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKTsKKworVk9JRCBIYXNoUHdkKAorICAgIElOICBQVUNIQVIgIHB3ZCwKKyAgICBJTiAgSU5UICAgICBwd2RsZW4sCisgICAgT1VUIFBVQ0hBUiAgaGFzaCk7CisKK1ZPSUQgUGVlckNoYWxsZW5nZVJlc3BvbnNlKAorICAgIElOICBQVUNIQVIgIHN6Q2hhbGxlbmdlLAorICAgIElOICBQVUNIQVIgIHNtYlBhc3N3ZCwKKyAgICBPVVQgUFVDSEFSICBzelJlc3BvbnNlKTsKKworVk9JRCBQYXJpdHlLZXkoCisgICAgT1VUIFBVQ0hBUiAgc3pPdXQsCisgICAgSU4gIFBVQ0hBUiAgc3pJbik7CisKK1ZPSUQgRGVzS2V5KAorICAgIE9VVCBVTE9ORyAgIGtbMTZdWzJdLAorICAgIElOICBQVUNIQVIgIGtleSwKKyAgICBJTiAgSU5UICAgICBkZWNyeXB0KTsKKworVk9JRCBEZXMoCisgICAgSU4gIFVMT05HICAga3NbMTZdWzJdLAorICAgIE9VVCBVQ0hBUiAgIGJsb2NrWzhdKTsKKworVk9JRCBEZXNFbmNyeXB0KAorICAgIElOICBQVUNIQVIgIHN6Q2xlYXIsCisgICAgSU4gIFBVQ0hBUiAgc3pLZXksCisgICAgT1VUIFBVQ0hBUiAgc3pPdXQpOworCitWT0lEIExlYXBOZXR3b3JrQ2hhbGxlbmdlQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAgKkVsZW0pOworCitWT0lEIExlYXBOZXR3b3JrQ2hhbGxlbmdlUmVzcG9uc2UoCisgICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICAqRWxlbSk7CisKK1ZPSUQgSGFzaHB3ZEhhc2goCisgICAgSU4gIFBVQ0hBUiAgaGFzaCwKKyAgICBJTiAgUFVDSEFSICBoYXNoaGFzaCk7CisKK1ZPSUQgUHJvY2Vzc1Nlc3Npb25LZXkoCisgICAgT1VUIFBVQ0hBUiAgU2Vzc2lvbktleSwKKyAgICBJTiAgUFVDSEFSICBoYXNoMiwKKyAgICBJTiAgUFVDSEFSICBDaGFsbGVuZ2VUb1JhZGl1cywKKyAgICBJTiAgUFVDSEFSICBDaGFsbGVuZ2VSZXNwb25zZUZyb21SYWRpdXMsCisgICAgSU4gIFBVQ0hBUiAgQ2hhbGxlbmdlRnJvbVJhZGl1cywKKyAgICBJTiAgUFVDSEFSICBDaGFsbGVuZ2VSZXNwb25zZVRvUmFkaXVzKTsKKworVk9JRCBMZWFwRWFwb2xLZXlBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICAqRWxlbSk7CisKK1ZPSUQgUm9ndWVBcFRhYmxlSW5pdCgKKyAgICBJTiBST0dVRUFQX1RBQkxFICAgICpUYWIpOworCitVTE9ORyBSb2d1ZUFwVGFibGVTZWFyY2goCisgICAgSU4gUk9HVUVBUF9UQUJMRSAgICAqVGFiLAorICAgIElOIFBVQ0hBUiAgICAgICAgICAgcEFkZHIpOworCitWT0lEIFJvZ3VlQXBFbnRyeVNldCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBPVVQgUk9HVUVBUF9FTlRSWSAgICpwUm9ndWVBcCwKKyAgICBJTiBQVUNIQVIgICAgICAgICAgIHBBZGRyLAorICAgIElOIFVDSEFSICAgICAgICAgICAgRmFpbGVDb2RlKTsKKworVUxPTkcgUm9ndWVBcFRhYmxlU2V0RW50cnkoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgT1VUIFJPR1VFQVBfVEFCTEUgICpUYWIsCisgICAgSU4gUFVDSEFSICAgICAgICAgICBwQWRkciwKKyAgICBJTiBVQ0hBUiAgICAgICAgICAgIEZhaWxlQ29kZSk7CisKK1ZPSUQgUm9ndWVBcFRhYmxlRGVsZXRlRW50cnkoCisgICAgSU4gT1VUIFJPR1VFQVBfVEFCTEUgKlRhYiwKKyAgICBJTiBQVUNIQVIgICAgICAgICAgcEFkZHIpOworCitWT0lEIExlYXBBdXRoVGltZW91dCgKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisgICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIExlYXBTZW5kUm9ndWVBUFJlcG9ydCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK0JPT0xFQU4gQ0NLTUFzc29jUnNwU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorICAgIElOIFZPSUQgICAgICAgICAgICAgKk1zZywKKyAgICBJTiBVTE9ORyAgICAgICAgICAgIE1zZ0xlbik7CisKKyNlbmRpZiAgLy8gX19MRUFQX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9saW5rX2xpc3QuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvbGlua19saXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1MjExMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvbGlua19saXN0LmgKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpZm5kZWYgX19MSU5LX0xJU1RfSF9fCisjZGVmaW5lIF9fTElOS19MSVNUX0hfXworCit0eXBlZGVmIHN0cnVjdCBfTElTVF9FTlRSWQoreworCXN0cnVjdCBfTElTVF9FTlRSWSAqcE5leHQ7Cit9IExJU1RfRU5UUlksICpQTElTVF9FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgX0xJU1RfSEVBRFIKK3sKKwlQTElTVF9FTlRSWSBwSGVhZDsKKwlQTElTVF9FTlRSWSBwVGFpbDsKKwlVQ0hBUiBzaXplOworfSBMSVNUX0hFQURFUiwgKlBMSVNUX0hFQURFUjsKKworc3RhdGljIGlubGluZSBWT0lEIGluaXRMaXN0KAorCUlOIFBMSVNUX0hFQURFUiBwTGlzdCkKK3sKKwlwTGlzdC0+cEhlYWQgPSBwTGlzdC0+cFRhaWwgPSBOVUxMOworCXBMaXN0LT5zaXplID0gMDsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgVk9JRCBpbnNlcnRUYWlsTGlzdCgKKwlJTiBQTElTVF9IRUFERVIgcExpc3QsCisJSU4gUExJU1RfRU5UUlkgcEVudHJ5KQoreworCXBFbnRyeS0+cE5leHQgPSBOVUxMOworCWlmIChwTGlzdC0+cFRhaWwpCisJCXBMaXN0LT5wVGFpbC0+cE5leHQgPSBwRW50cnk7CisJZWxzZQorCQlwTGlzdC0+cEhlYWQgPSBwRW50cnk7CisJcExpc3QtPnBUYWlsID0gcEVudHJ5OworCXBMaXN0LT5zaXplKys7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgUExJU1RfRU5UUlkgcmVtb3ZlSGVhZExpc3QoCisJSU4gUExJU1RfSEVBREVSIHBMaXN0KQoreworCVBMSVNUX0VOVFJZIHBOZXh0OworCVBMSVNUX0VOVFJZIHBFbnRyeTsKKworCXBFbnRyeSA9IHBMaXN0LT5wSGVhZDsKKwlpZiAocExpc3QtPnBIZWFkICE9IE5VTEwpCisJeworCQlwTmV4dCA9IHBMaXN0LT5wSGVhZC0+cE5leHQ7CisJCXBMaXN0LT5wSGVhZCA9IHBOZXh0OworCQlpZiAocE5leHQgPT0gTlVMTCkKKwkJCXBMaXN0LT5wVGFpbCA9IE5VTEw7CisJCXBMaXN0LT5zaXplLS07CisJfQorCXJldHVybiBwRW50cnk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdldExpc3RTaXplKAorCUlOIFBMSVNUX0hFQURFUiBwTGlzdCkKK3sKKwlyZXR1cm4gcExpc3QtPnNpemU7Cit9CisKK3N0YXRpYyBpbmxpbmUgUExJU1RfRU5UUlkgZGVsRW50cnlMaXN0KAorCUlOIFBMSVNUX0hFQURFUiBwTGlzdCwKKwlJTiBQTElTVF9FTlRSWSBwRW50cnkpCit7CisJUExJU1RfRU5UUlkgcEN1ckVudHJ5OworCVBMSVNUX0VOVFJZIHBQcnZFbnRyeTsKKworCWlmKHBMaXN0LT5wSGVhZCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWlmKHBFbnRyeSA9PSBwTGlzdC0+cEhlYWQpCisJeworCQlwQ3VyRW50cnkgPSBwTGlzdC0+cEhlYWQ7CisJCXBMaXN0LT5wSGVhZCA9IHBDdXJFbnRyeS0+cE5leHQ7CisKKwkJaWYocExpc3QtPnBIZWFkID09IE5VTEwpCisJCQlwTGlzdC0+cFRhaWwgPSBOVUxMOworCisJCXBMaXN0LT5zaXplLS07CisJCXJldHVybiBwQ3VyRW50cnk7CisJfQorCisJcFBydkVudHJ5ID0gcExpc3QtPnBIZWFkOworCXBDdXJFbnRyeSA9IHBQcnZFbnRyeS0+cE5leHQ7CisJd2hpbGUocEN1ckVudHJ5ICE9IE5VTEwpCisJeworCQlpZiAocEVudHJ5ID09IHBDdXJFbnRyeSkKKwkJeworCQkJcFBydkVudHJ5LT5wTmV4dCA9IHBDdXJFbnRyeS0+cE5leHQ7CisKKwkJCWlmKHBFbnRyeSA9PSBwTGlzdC0+cFRhaWwpCisJCQkJcExpc3QtPnBUYWlsID0gcFBydkVudHJ5OworCisJCQlwTGlzdC0+c2l6ZS0tOworCQkJYnJlYWs7CisJCX0KKwkJcFBydkVudHJ5ID0gcEN1ckVudHJ5OworCQlwQ3VyRW50cnkgPSBwUHJ2RW50cnktPnBOZXh0OworCX0KKworCXJldHVybiBwQ3VyRW50cnk7Cit9CisKKyNlbmRpZiAvLyBfX19MSU5LX0xJU1RfSF9fIC8vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvbWQ0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL21kNC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZTViNTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL21kNC5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpZm5kZWYgX19NRDRfSF9fCisjZGVmaW5lIF9fTUQ0X0hfXworCisvKiBNRDQgY29udGV4dC4gKi8KK3R5cGVkZWYJc3RydWN0CV9NRDRfQ1RYXwl7CisJVUxPTkcJc3RhdGVbNF07ICAgICAgICAvKiBzdGF0ZSAoQUJDRCkgKi8KKwlVTE9ORwljb3VudFsyXTsgICAgICAgIC8qIG51bWJlciBvZiBiaXRzLCBtb2R1bG8gMl42NCAobHNiIGZpcnN0KSAqLworCVVDSEFSCWJ1ZmZlcls2NF07ICAgICAgLyogaW5wdXQgYnVmZmVyICovCit9CU1ENF9DVFg7CisKK1ZPSUQgTUQ0SW5pdCAoTUQ0X0NUWCAqKTsKK1ZPSUQgTUQ0VXBkYXRlIChNRDRfQ1RYICosIFBVQ0hBUiwgVUlOVCk7CitWT0lEIE1ENEZpbmFsIChVQ0hBUiBbMTZdLCBNRDRfQ1RYICopOworCisjZW5kaWYgLy9fX01ENF9IX18KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL21kNS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9tZDUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODVkYjEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9tZDUuaApAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwltZDUuaAorCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCU5hbWUJCURhdGUJCQlNb2RpZmljYXRpb24gbG9ncworCWphbgkJCTEwLTI4LTAzCQlJbml0aWFsCisJUml0YSAgICAJMTEtMjMtMDQJCU1vZGlmeSBNRDUgYW5kIFNIQS0xCisqLworCisjaWZuZGVmCXVpbnQ4CisjZGVmaW5lCXVpbnQ4ICB1bnNpZ25lZAljaGFyCisjZW5kaWYKKworI2lmbmRlZgl1aW50MzIKKyNkZWZpbmUJdWludDMyIHVuc2lnbmVkCWxvbmcgaW50CisjZW5kaWYKKworCisjaWZuZGVmCV9fTUQ1X0hfXworI2RlZmluZQlfX01ENV9IX18KKworI2RlZmluZSBNRDVfTUFDX0xFTiAxNgorCit0eXBlZGVmIHN0cnVjdCBfTUQ1X0NUWCB7CisgICAgVUlOVDMyICAgQnVmWzRdOyAgICAgICAgICAgICAvLyBidWZmZXJzIG9mIGZvdXIgc3RhdGVzCisJVUNIQVIgICBJbnB1dFs2NF07ICAgICAgICAgIC8vIGlucHV0IG1lc3NhZ2UKKwlVSU5UMzIgICBMZW5JbkJpdENvdW50WzJdOyAgIC8vIGxlbmd0aCBjb3VudGVyIGZvciBpbnB1dCBtZXNzYWdlLCAwIHVwIHRvIDY0IGJpdHMKK30gICBNRDVfQ1RYOworCitWT0lEIE1ENUluaXQoTUQ1X0NUWCAqcEN0eCk7CitWT0lEIE1ENVVwZGF0ZShNRDVfQ1RYICpwQ3R4LCBVQ0hBUiAqcERhdGEsIFVJTlQzMiBMZW5JbkJ5dGVzKTsKK1ZPSUQgTUQ1RmluYWwoVUNIQVIgRGlnZXN0WzE2XSwgTUQ1X0NUWCAqcEN0eCk7CitWT0lEIE1ENVRyYW5zZm9ybShVSU5UMzIgQnVmWzRdLCBVSU5UMzIgTWVzWzE2XSk7CisKK3ZvaWQgbWQ1X21hYyh1OCAqa2V5LCBzaXplX3Qga2V5X2xlbiwgdTggKmRhdGEsIHNpemVfdCBkYXRhX2xlbiwgdTggKm1hYyk7Cit2b2lkIGhtYWNfbWQ1KHU4ICprZXksIHNpemVfdCBrZXlfbGVuLCB1OCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuLCB1OCAqbWFjKTsKKworLy8KKy8vIFNIQSBjb250ZXh0CisvLwordHlwZWRlZglzdHJ1Y3QgX1NIQV9DVFgKK3sKKwlVSU5UMzIgICBCdWZbNV07ICAgICAgICAgICAgIC8vIGJ1ZmZlcnMgb2YgZml2ZSBzdGF0ZXMKKwlVQ0hBUiAgIElucHV0WzgwXTsgICAgICAgICAgLy8gaW5wdXQgbWVzc2FnZQorCVVJTlQzMiAgIExlbkluQml0Q291bnRbMl07ICAgLy8gbGVuZ3RoIGNvdW50ZXIgZm9yIGlucHV0IG1lc3NhZ2UsIDAgdXAgdG8gNjQgYml0cworCit9CVNIQV9DVFg7CisKK1ZPSUQgU0hBSW5pdChTSEFfQ1RYICpwQ3R4KTsKK1VDSEFSIFNIQVVwZGF0ZShTSEFfQ1RYICpwQ3R4LCBVQ0hBUiAqcERhdGEsIFVJTlQzMiBMZW5JbkJ5dGVzKTsKK1ZPSUQgU0hBRmluYWwoU0hBX0NUWCAqcEN0eCwgVUNIQVIgRGlnZXN0WzIwXSk7CitWT0lEIFNIQVRyYW5zZm9ybShVSU5UMzIgQnVmWzVdLCBVSU5UMzIgTWVzWzIwXSk7CisKKyNkZWZpbmUgU0hBX0RJR0VTVF9MRU4gMjAKKyNlbmRpZiAvLyBfX01ENV9IX18KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYJX0FFU19ICisjZGVmaW5lCV9BRVNfSAorCit0eXBlZGVmCXN0cnVjdAoreworCXVpbnQzMiBlcmtbNjRdOwkJLyogZW5jcnlwdGlvbiByb3VuZAlrZXlzICovCisJdWludDMyIGRya1s2NF07CQkvKiBkZWNyeXB0aW9uIHJvdW5kCWtleXMgKi8KKwlpbnQJbnI7CQkJCS8qIG51bWJlciBvZiByb3VuZHMJKi8KK30KK2Flc19jb250ZXh0OworCitpbnQJIHJ0bXBfYWVzX3NldF9rZXkoIGFlc19jb250ZXh0ICpjdHgsCXVpbnQ4ICprZXksCWludAluYml0cyApOwordm9pZCBydG1wX2Flc19lbmNyeXB0KCBhZXNfY29udGV4dCAqY3R4LAl1aW50OCBpbnB1dFsxNl0sIHVpbnQ4IG91dHB1dFsxNl0gKTsKK3ZvaWQgcnRtcF9hZXNfZGVjcnlwdCggYWVzX2NvbnRleHQgKmN0eCwJdWludDggaW5wdXRbMTZdLCB1aW50OCBvdXRwdXRbMTZdICk7CisKK3ZvaWQgRihjaGFyICpwYXNzd29yZCwgdW5zaWduZWQgY2hhciAqc3NpZCwgaW50IHNzaWRsZW5ndGgsIGludCBpdGVyYXRpb25zLCBpbnQgY291bnQsIHVuc2lnbmVkIGNoYXIgKm91dHB1dCk7CitpbnQgUGFzc3dvcmRIYXNoKGNoYXIgKnBhc3N3b3JkLCB1bnNpZ25lZCBjaGFyICpzc2lkLCBpbnQgc3NpZGxlbmd0aCwgdW5zaWduZWQgY2hhciAqb3V0cHV0KTsKKworI2VuZGlmIC8qIGFlcy5oCSovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvbWxtZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9tbG1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJmYjhlMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvbWxtZS5oCkBAIC0wLDAgKzEsMTQ3MSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwltbG1lLmgKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlKb2huIENoYW5nCTIwMDMtMDgtMjgJCUNyZWF0ZWQKKwlKb2huIENoYW5nICAyMDA0LTA5LTA2ICAgICAgbW9kaWZpZWQgZm9yIFJUMjYwMAorCisqLworI2lmbmRlZiBfX01MTUVfSF9fCisjZGVmaW5lIF9fTUxNRV9IX18KKworLy9leHRlcm4gVUNIQVIgQlJPQURDQVNUX0FERFJbXTsKKworLy8gbWF4aW11bSBzdXBwb3J0ZWQgY2FwYWJpbGl0eSBpbmZvcm1hdGlvbiAtCisvLyBFU1MsIElCU1MsIFByaXZhY3ksIFNob3J0IFByZWFtYmxlLCBTcGVjdHJ1bSBtZ210LCBTaG9ydCBTbG90CisjZGVmaW5lIFNVUFBPUlRFRF9DQVBBQklMSVRZX0lORk8gICAweDA1MzMKKworI2RlZmluZSBFTkRfT0ZfQVJHUyAgICAgICAgICAgICAgICAgLTEKKyNkZWZpbmUgTEZTUl9NQVNLICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwNTcKKyNkZWZpbmUgTUxNRV9UQVNLX0VYRUNfSU5UViAgICAgICAgIDEwMC8qMjAwKi8gICAgICAgLy8KKyNkZWZpbmUgTEVBRF9USU1FICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgTUxNRV9UQVNLX0VYRUNfTVVMVElQTEUgICAgICAgMTAgIC8qNSovICAgICAgIC8vIE1MTUVfVEFTS19FWEVDX01VTFRJUExFICogTUxNRV9UQVNLX0VYRUNfSU5UViA9IDEgc2VjCisjZGVmaW5lIFJFT1JERVJfRVhFQ19JTlRWICAgICAgICAgCTEwMCAgICAgICAvLyAwLjEgc2VjCisvLyNkZWZpbmUgVEJUVF9QUkVMT0FEX1RJTUUgICAgICAgICAzODQgICAgICAgIC8vIHVzZWMuIExvbWdQcmVhbWJsZSArIDI0LWJ5dGUgYXQgMU1icHMKKworLy8gVGhlIGRlZmluaXRpb24gb2YgUmFkYXIgZGV0ZWN0aW9uIGR1cmF0aW9uIHJlZ2lvbgorI2RlZmluZSBDRQkJMAorI2RlZmluZSBGQ0MJCTEKKyNkZWZpbmUgSkFQCQkyCisjZGVmaW5lIEpBUF9XNTMJMworI2RlZmluZSBKQVBfVzU2CTQKKyNkZWZpbmUgTUFYX1JEX1JFR0lPTiA1CisKKyNpZmRlZglORElTNTFfTUlOSVBPUlQKKyNkZWZpbmUgQkVBQ09OX0xPU1RfVElNRSAgICAgICAgICAgIDQwMDAgICAgICAgLy8gMjA0OCBtc2VjID0gMiBzZWMKKyNlbHNlCisjZGVmaW5lIEJFQUNPTl9MT1NUX1RJTUUgICAgICAgICAgICA0ICogT1NfSFogICAgLy8gMjA0OCBtc2VjID0gMiBzZWMKKyNlbmRpZgorCisjZGVmaW5lIERMU19USU1FT1VUICAgICAgICAgICAgICAgICAxMjAwICAgICAgLy8gdW5pdDogbXNlYworI2RlZmluZSBBVVRIX1RJTUVPVVQgICAgICAgICAgICAgICAgMzAwICAgICAgIC8vIHVuaXQ6IG1zZWMKKyNkZWZpbmUgQVNTT0NfVElNRU9VVCAgICAgICAgICAgICAgIDMwMCAgICAgICAvLyB1bml0OiBtc2VjCisjZGVmaW5lIEpPSU5fVElNRU9VVCAgICAgICAgICAgICAgICAyICogT1NfSFogICAgICAvLyB1bml0OiBtc2VjCisjZGVmaW5lIFNIT1JUX0NIQU5ORUxfVElNRSAgICAgICAgICA5MCAgICAgICAgLy8gdW5pdDogbXNlYworI2RlZmluZSBNSU5fQ0hBTk5FTF9USU1FICAgICAgICAgICAgMTEwICAgICAgICAvLyB1bml0OiBtc2VjLCBmb3IgZHVhbCBiYW5kIHNjYW4KKyNkZWZpbmUgTUFYX0NIQU5ORUxfVElNRSAgICAgICAgICAgIDE0MCAgICAgICAvLyB1bml0OiBtc2VjLCBmb3Igc2luZ2xlIGJhbmQgc2NhbgorI2RlZmluZQlGQVNUX0FDVElWRV9TQ0FOX1RJTUUJICAgIDMwIAkJICAvLyBBY3RpdmUgc2NhbiB3YWl0aW5nIGZvciBwcm9iZSByZXNwb25zZSB0aW1lCisjZGVmaW5lIENXX01JTl9JTl9CSVRTICAgICAgICAgICAgICA0ICAgICAgICAgLy8gYWN0dWFsIEN3TWluID0gMl5DV19NSU5fSU5fQklUUyAtIDEKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZuZGVmIENPTkZJR19BUF9TVVBQT1JUCisjZGVmaW5lIENXX01BWF9JTl9CSVRTICAgICAgICAgICAgICAxMCAgICAgICAgLy8gYWN0dWFsIEN3TWF4ID0gMl5DV19NQVhfSU5fQklUUyAtIDEKKyNlbmRpZgorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQKK2V4dGVybiBVSU5UMzIgQ1dfTUFYX0lOX0JJVFM7CisjZW5kaWYgLy8gQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQgLy8KKworLy8gTm90ZTogUlNTSV9UT19EQk1fT0ZGU0VUIGhhcyBiZWVuIGNoYW5nZWQgdG8gdmFyaWFibGUgZm9yIG5ldyBSRiAoMjAwNC0wNzIwKS4KKy8vIFNIb3VsZCBub3QgcmVmZXIgdG8gdGhpcyBjb25zdGFudCBhbnltb3JlCisvLyNkZWZpbmUgUlNTSV9UT19EQk1fT0ZGU0VUICAgICAgICAgIDEyMCAvLyBmb3IgUlQyNTMwIFJTU0ktMTE1ID0gZEJtCisjZGVmaW5lIFJTU0lfRk9SX01JRF9UWF9QT1dFUiAgICAgICAtNTUgIC8vIC01NSBkYiBpcyBjb25zaWRlcmVkIG1pZC1kaXN0YW5jZQorI2RlZmluZSBSU1NJX0ZPUl9MT1dfVFhfUE9XRVIgICAgICAgLTQ1ICAvLyAtNDUgZGIgaXMgY29uc2lkZXJlZCB2ZXJ5IHNob3J0IGRpc3RhbmNlIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsaWdpYmxlIHRvIHVzZSBhIGxvd2VyIFRYIHBvd2VyCisjZGVmaW5lIFJTU0lfRk9SX0xPV0VTVF9UWF9QT1dFUiAgICAtMzAKKy8vI2RlZmluZSBNSURfVFhfUE9XRVJfREVMVEEgICAgICAgICAgMCAgIC8vIDAgZGIgZnJvbSBmdWxsIFRYIHBvd2VyIHVwb24gbWlkLWRpc3RhbmNlIHRvIEFQCisjZGVmaW5lIExPV19UWF9QT1dFUl9ERUxUQSAgICAgICAgICA2ICAgIC8vIC0zIGRiIGZyb20gZnVsbCBUWCBwb3dlciB1cG9uIHZlcnkgc2hvcnQgZGlzdGFuY2UuIDEgZ3JhZGUgaXMgMC41IGRiCisjZGVmaW5lIExPV0VTVF9UWF9QT1dFUl9ERUxUQSAgICAgICAxNiAgIC8vIC04IGRiIGZyb20gZnVsbCBUWCBwb3dlciB1cG9uIHNob3J0ZXN0IGRpc3RhbmNlLiAxIGdyYWRlIGlzIDAuNSBkYgorCisjZGVmaW5lIFJTU0lfVFJJR0dFUkVEX1VQT05fQkVMT1dfVEhSRVNIT0xEICAgICAwCisjZGVmaW5lIFJTU0lfVFJJR0dFUkVEX1VQT05fRVhDQ0VFRF9USFJFU0hPTEQgICAxCisjZGVmaW5lIFJTU0lfVEhSRVNIT0xEX0ZPUl9ST0FNSU5HICAgICAgICAgICAgICAyNQorI2RlZmluZSBSU1NJX0RFTFRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNQorCisvLyBDaGFubmVsIFF1YWxpdHkgSW5kaWNhdGlvbgorI2RlZmluZSBDUUlfSVNfR09PRChjcWkpICAgICAgICAgICAgKChjcWkpID49IDUwKQorLy8jZGVmaW5lIENRSV9JU19GQUlSKGNxaSkgICAgICAgICAgKCgoY3FpKSA+PSAyMCkgJiYgKChjcWkpIDwgNTApKQorI2RlZmluZSBDUUlfSVNfUE9PUihjcWkpICAgICAgICAgICAgKGNxaSA8IDUwKSAgLy8oKChjcWkpID49IDUpICYmICgoY3FpKSA8IDIwKSkKKyNkZWZpbmUgQ1FJX0lTX0JBRChjcWkpICAgICAgICAgICAgIChjcWkgPCA1KQorI2RlZmluZSBDUUlfSVNfREVBRChjcWkpICAgICAgICAgICAgKGNxaSA9PSAwKQorCisvLyB3ZWlnaHRpbmcgZmFjdG9yIHRvIGNhbGN1bGF0ZSBDaGFubmVsIHF1YWxpdHksIHRvdGFsIHNob3VsZCBiZSAxMDAlCisjZGVmaW5lIFJTU0lfV0VJR0hUSU5HICAgICAgICAgICAgICAgICAgIDUwCisjZGVmaW5lIFRYX1dFSUdIVElORyAgICAgICAgICAgICAgICAgICAgIDMwCisjZGVmaW5lIFJYX1dFSUdIVElORyAgICAgICAgICAgICAgICAgICAgIDIwCisKKy8vI2RlZmluZSBQRUVSX0tFWV9OT1RfVVNFRCAgICAgICAgICAgICAgICAwCisvLyNkZWZpbmUgUEVFUl9LRVlfNjRfQklUICAgICAgICAgICAgICAgICAgNjQKKy8vI2RlZmluZSBQRUVSX0tFWV8xMjhfQklUICAgICAgICAgICAgICAgICAxMjgKKworLy8jZGVmaW5lIFBFRVJfS0VZXzY0QklUX0xFTiAgICAgICAgICAgICAgIDgKKy8vI2RlZmluZSBQRUVSX0tFWV8xMjhCSVRfTEVOICAgICAgICAgICAgICAxNgorCisjZGVmaW5lIEJTU19OT1RfRk9VTkQgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkYKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZGVmaW5lIE1BWF9MRU5fT0ZfTUxNRV9RVUVVRSAgICAgICAgICAgIDQwIC8vMTAKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2RlZmluZSBTQ0FOX1BBU1NJVkUgICAgICAgICAgICAgICAgICAgICAxOAkJLy8gc2NhbiB3aXRoIG5vIHByb2JlIHJlcXVlc3QsIG9ubHkgd2FpdCBiZWFjb24gYW5kIHByb2JlIHJlc3BvbnNlCisjZGVmaW5lIFNDQU5fQUNUSVZFICAgICAgICAgICAgICAgICAgICAgIDE5CQkvLyBzY2FuIHdpdGggcHJvYmUgcmVxdWVzdCwgYW5kIHdhaXQgYmVhY29uIGFuZCBwcm9iZSByZXNwb25zZQorI2RlZmluZQlTQ0FOX0NJU0NPX1BBU1NJVkUJCQkJIDIwCQkvLyBTaW5nbGUgY2hhbm5lbCBwYXNzaXZlIHNjYW4KKyNkZWZpbmUJU0NBTl9DSVNDT19BQ1RJVkUJCQkJIDIxCQkvLyBTaW5nbGUgY2hhbm5lbCBhY3RpdmUgc2NhbgorI2RlZmluZQlTQ0FOX0NJU0NPX05PSVNFCQkJCSAyMgkJLy8gU2luZ2xlIGNoYW5uZWwgcGFzc2l2ZSBzY2FuIGZvciBub2lzZSBoaXN0b2dyYW0gY29sbGVjdGlvbgorI2RlZmluZQlTQ0FOX0NJU0NPX0NIQU5ORUxfTE9BRAkJCSAyMwkJLy8gU2luZ2xlIGNoYW5uZWwgcGFzc2l2ZSBzY2FuIGZvciBjaGFubmVsIGxvYWQgY29sbGVjdGlvbgorI2RlZmluZSBGQVNUX1NDQU5fQUNUSVZFICAgICAgICAgICAgICAgICAyNAkJLy8gc2NhbiB3aXRoIHByb2JlIHJlcXVlc3QsIGFuZCB3YWl0IGJlYWNvbiBhbmQgcHJvYmUgcmVzcG9uc2UKKworI2lmZGVmIERPVDExTl9EUkFGVDMKKyNkZWZpbmUgU0NBTl8yMDQwX0JTU19DT0VYSVNUICAgICAgICAgICAgICAgICAgMjYKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisKKy8vI2RlZmluZSBCU1NfVEFCTEVfRU1QVFkoeCkgICAgICAgICAgICAgKCh4KS5Cc3NOciA9PSAwKQorI2RlZmluZSBNQUNfQUREUl9JU19HUk9VUChBZGRyKSAgICAgICAoKChBZGRyWzBdKSAmIDB4MDEpKQorI2RlZmluZSBNQUNfQUREUl9IQVNIKEFkZHIpICAgICAgICAgICAgKEFkZHJbMF0gXiBBZGRyWzFdIF4gQWRkclsyXSBeIEFkZHJbM10gXiBBZGRyWzRdIF4gQWRkcls1XSkKKyNkZWZpbmUgTUFDX0FERFJfSEFTSF9JTkRFWChBZGRyKSAgICAgIChNQUNfQUREUl9IQVNIKEFkZHIpICUgSEFTSF9UQUJMRV9TSVpFKQorI2RlZmluZSBUSURfTUFDX0hBU0goQWRkcixUSUQpICAgICAgICAgICAgKFRJRF5BZGRyWzBdIF4gQWRkclsxXSBeIEFkZHJbMl0gXiBBZGRyWzNdIF4gQWRkcls0XSBeIEFkZHJbNV0pCisjZGVmaW5lIFRJRF9NQUNfSEFTSF9JTkRFWChBZGRyLFRJRCkgICAgICAoVElEX01BQ19IQVNIKEFkZHIsVElEKSAlIEhBU0hfVEFCTEVfU0laRSkKKworLy8gTEVEIENvbnRyb2wKKy8vIGFzc29pYXRpb24gT04uIG9uZSBMRUQgT04uIGFub3RoZXIgYmxpbmtpbmcgd2hlbiBUWCwgT0ZGIHdoZW4gaWRsZQorLy8gbm8gYXNzb2NpYXRpb24sIGJvdGggTEVEIG9mZgorI2RlZmluZSBBU0lDX0xFRF9BQ1RfT04ocEFkKSAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0NTUjE0LCAweDAwMDMxZTQ2KQorI2RlZmluZSBBU0lDX0xFRF9BQ1RfT0ZGKHBBZCkgICAgICAgUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0NTUjE0LCAweDAwMDAxZTQ2KQorCisvLyBiaXQgZGVmaW5pdGlvbiBvZiB0aGUgMi1ieXRlIHBCRUFDT04tPkNhcGFiaWxpdHkgZmllbGQKKyNkZWZpbmUgQ0FQX0lTX0VTU19PTih4KSAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDAwMDEpICE9IDApCisjZGVmaW5lIENBUF9JU19JQlNTX09OKHgpICAgICAgICAgICAgICAgICgoKHgpICYgMHgwMDAyKSAhPSAwKQorI2RlZmluZSBDQVBfSVNfQ0ZfUE9MTEFCTEVfT04oeCkgICAgICAgICAoKCh4KSAmIDB4MDAwNCkgIT0gMCkKKyNkZWZpbmUgQ0FQX0lTX0NGX1BPTExfUkVRX09OKHgpICAgICAgICAgKCgoeCkgJiAweDAwMDgpICE9IDApCisjZGVmaW5lIENBUF9JU19QUklWQUNZX09OKHgpICAgICAgICAgICAgICgoKHgpICYgMHgwMDEwKSAhPSAwKQorI2RlZmluZSBDQVBfSVNfU0hPUlRfUFJFQU1CTEVfT04oeCkgICAgICAoKCh4KSAmIDB4MDAyMCkgIT0gMCkKKyNkZWZpbmUgQ0FQX0lTX1BCQ0NfT04oeCkgICAgICAgICAgICAgICAgKCgoeCkgJiAweDAwNDApICE9IDApCisjZGVmaW5lIENBUF9JU19BR0lMSVRZX09OKHgpICAgICAgICAgICAgICgoKHgpICYgMHgwMDgwKSAhPSAwKQorI2RlZmluZSBDQVBfSVNfU1BFQ1RSVU1fTUdNVCh4KSAgICAgICAgICAoKCh4KSAmIDB4MDEwMCkgIT0gMCkgIC8vIDgwMi4xMWUgZDkKKyNkZWZpbmUgQ0FQX0lTX1FPUyh4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDAyMDApICE9IDApICAvLyA4MDIuMTFlIGQ5CisjZGVmaW5lIENBUF9JU19TSE9SVF9TTE9UKHgpICAgICAgICAgICAgICgoKHgpICYgMHgwNDAwKSAhPSAwKQorI2RlZmluZSBDQVBfSVNfQVBTRCh4KSAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MDgwMCkgIT0gMCkgIC8vIDgwMi4xMWUgZDkKKyNkZWZpbmUgQ0FQX0lTX0lNTUVEX0JBKHgpICAgICAgICAgICAgICAgKCgoeCkgJiAweDEwMDApICE9IDApICAvLyA4MDIuMTFlIGQ5CisjZGVmaW5lIENBUF9JU19EU1NTX09GRE0oeCkgICAgICAgICAgICAgICgoKHgpICYgMHgyMDAwKSAhPSAwKQorI2RlZmluZSBDQVBfSVNfREVMQVlfQkEoeCkgICAgICAgICAgICAgICAoKCh4KSAmIDB4NDAwMCkgIT0gMCkgIC8vIDgwMi4xMWUgZDkKKworI2RlZmluZSBDQVBfR0VORVJBVEUoZXNzLGlic3MscHJpdixzX3ByZSxzX3Nsb3Qsc3BlY3RydW0pICAoKChlc3MpID8gMHgwMDAxIDogMHgwMDAwKSB8ICgoaWJzcykgPyAweDAwMDIgOiAweDAwMDApIHwgKChwcml2KSA/IDB4MDAxMCA6IDB4MDAwMCkgfCAoKHNfcHJlKSA/IDB4MDAyMCA6IDB4MDAwMCkgfCAoKHNfc2xvdCkgPyAweDA0MDAgOiAweDAwMDApIHwgKChzcGVjdHJ1bSkgPyAweDAxMDAgOiAweDAwMDApKQorCisvLyNkZWZpbmUgU1RBX1FPU19DQVBBQklMSVRZICAgICAgICAgICAgICAgMCAvLyAxLWJ5dGUuIHNlZSA4MDIuMTFlIGQ5LjAgZm9yIGJpdCBkZWZpbml0aW9uCisKKyNkZWZpbmUgRVJQX0lTX05PTl9FUlBfUFJFU0VOVCh4KSAgICAgICAgKCgoeCkgJiAweDAxKSAhPSAwKSAgICAvLyA4MDIuMTFnCisjZGVmaW5lIEVSUF9JU19VU0VfUFJPVEVDVElPTih4KSAgICAgICAgICgoKHgpICYgMHgwMikgIT0gMCkgICAgLy8gODAyLjExZworI2RlZmluZSBFUlBfSVNfVVNFX0JBUktFUl9QUkVBTUJMRSh4KSAgICAoKCh4KSAmIDB4MDQpICE9IDApICAgIC8vIDgwMi4xMWcKKworI2RlZmluZSBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORCAgICAgICA4Ly8gMyAgLy8ganVzdCB0ZXN0IGJ5IGdhcnkKKyNkZWZpbmUgRFJTX1BFTkFMVFkgICAgICAgICAgICAgICAgICAgICAgOAorCisjZGVmaW5lIEJBX05PVFVTRSAJMgorLy9CQSBQb2xpY3kgc3ViZmlsZWQgdmFsdWUgaW4gQUREQkEgZnJhbWUKKyNkZWZpbmUgSU1NRURfQkEgCTEKKyNkZWZpbmUgREVMQVlfQkEJMAorCisvLyBCQSBJbml0aWF0b3Igc3ViZmllbGQgaW4gREVMQkEgZnJhbWUKKyNkZWZpbmUgT1JJR0lOQVRPUgkxCisjZGVmaW5lIFJFQ0lQSUVOVAkwCisKKy8vIEFEREJBIFN0YXR1cyBDb2RlCisjZGVmaW5lIEFEREJBX1JFU1VMVENPREVfU1VDQ0VTUwkJCQkJMAorI2RlZmluZSBBRERCQV9SRVNVTFRDT0RFX1JFRlVTRUQJCQkJCTM3CisjZGVmaW5lIEFEREJBX1JFU1VMVENPREVfSU5WQUxJRF9QQVJBTUVURVJTCQkJMzgKKworLy8gREVMQkEgUmVhc29uIENvZGUKKyNkZWZpbmUgREVMQkFfUkVBU09OQ09ERV9RU1RBX0xFQVZJTkcJCQkJMzYKKyNkZWZpbmUgREVMQkFfUkVBU09OQ09ERV9FTkRfQkEJCQkJCQkzNworI2RlZmluZSBERUxCQV9SRUFTT05DT0RFX1VOS05PV05fQkEJCQkJCTM4CisjZGVmaW5lIERFTEJBX1JFQVNPTkNPREVfVElNRU9VVAkJCQkJMzkKKworLy8gcmVzZXQgYWxsIE9uZVNlY1R4IGNvdW50ZXJzCisjZGVmaW5lIFJFU0VUX09ORV9TRUNfVFhfQ05UKF9fcEVudHJ5KSBcCitpZiAoKChfX3BFbnRyeSkpICE9IE5VTEwpIFwKK3sgXAorCShfX3BFbnRyeSktPk9uZVNlY1R4UmV0cnlPa0NvdW50ID0gMDsgXAorCShfX3BFbnRyeSktPk9uZVNlY1R4RmFpbENvdW50ID0gMDsgXAorCShfX3BFbnRyeSktPk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgPSAwOyBcCit9CisKKy8vCisvLyA4MDIuMTEgZnJhbWUgZm9ybWF0cworLy8KKy8vICBIVCBDYXBhYmlsaXR5IElORk8gZmllbGQgaW4gSFQgQ2FwIElFIC4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVTSE9SVAlMU0lHVHhvcFByb1N1cDoxOworCVVTSE9SVAlGb3J0eV9NaHpfSW50b2xlcmFudDoxOworCVVTSE9SVAlQU01QOjE7CisJVVNIT1JUCUNDS21vZGVpbjQwOjE7CisJVVNIT1JUCUFNc2R1U2l6ZToxOworCVVTSE9SVAlEZWxheWVkQkE6MTsJLy9ydDI4NjBjIG5vdCBzdXBwb3J0CisJVVNIT1JUCVJ4U1RCQzoyOworCVVTSE9SVAlUeFNUQkM6MTsKKwlVU0hPUlQJU2hvcnRHSWZvcjQwOjE7CS8vZm9yNDBNSHoKKwlVU0hPUlQJU2hvcnRHSWZvcjIwOjE7CisJVVNIT1JUCUdGOjE7CS8vZ3JlZW4gZmllbGQKKwlVU0hPUlQJTWltb1BzOjI7Ly9tb21pIHBvd2VyIHNhZmUKKwlVU0hPUlQJQ2hhbm5lbFdpZHRoOjE7CisJVVNIT1JUCUFkdkNvZGluZzoxOworI2Vsc2UKKwlVU0hPUlQJQWR2Q29kaW5nOjE7CisJVVNIT1JUCUNoYW5uZWxXaWR0aDoxOworCVVTSE9SVAlNaW1vUHM6MjsvL21vbWkgcG93ZXIgc2FmZQorCVVTSE9SVAlHRjoxOwkvL2dyZWVuIGZpZWxkCisJVVNIT1JUCVNob3J0R0lmb3IyMDoxOworCVVTSE9SVAlTaG9ydEdJZm9yNDA6MTsJLy9mb3I0ME1IegorCVVTSE9SVAlUeFNUQkM6MTsKKwlVU0hPUlQJUnhTVEJDOjI7CisJVVNIT1JUCURlbGF5ZWRCQToxOwkvL3J0Mjg2MGMgbm90IHN1cHBvcnQKKwlVU0hPUlQJQU1zZHVTaXplOjE7CS8vIG9ubHkgc3VwcG9ydCBhcyB6ZXJvCisJVVNIT1JUCUNDS21vZGVpbjQwOjE7CisJVVNIT1JUCVBTTVA6MTsKKwlVU0hPUlQJRm9ydHlfTWh6X0ludG9sZXJhbnQ6MTsKKwlVU0hPUlQJTFNJR1R4b3BQcm9TdXA6MTsKKyNlbmRpZgkvKiAhUlRfQklHX0VORElBTiAqLworfSBIVF9DQVBfSU5GTywgKlBIVF9DQVBfSU5GTzsKKworLy8gIEhUIENhcGFiaWxpdHkgSU5GTyBmaWVsZCBpbiBIVCBDYXAgSUUgLgordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVUNIQVIJcnN2OjM7Ly9tb21pIHBvd2VyIHNhZmUKKwlVQ0hBUglNcGR1RGVuc2l0eTozOworCVVDSEFSCU1heFJBbXBkdUZhY3RvcjoyOworI2Vsc2UKKwlVQ0hBUglNYXhSQW1wZHVGYWN0b3I6MjsKKwlVQ0hBUglNcGR1RGVuc2l0eTozOworCVVDSEFSCXJzdjozOy8vbW9taSBwb3dlciBzYWZlCisjZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KK30gSFRfQ0FQX1BBUk0sICpQSFRfQ0FQX1BBUk07CisKKy8vICBIVCBDYXBhYmlsaXR5IElORk8gZmllbGQgaW4gSFQgQ2FwIElFIC4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisJVUNIQVIJTUNTU2V0WzEwXTsKKwlVQ0hBUglTdXBSYXRlWzJdOyAgLy8gdW5pdCA6IDFNYnBzCisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCXJzdjozOworCVVDSEFSCU1wZHVEZW5zaXR5OjE7CisJVUNIQVIJVHhTdHJlYW06MjsKKwlVQ0hBUglUeFJ4Tm90RXF1YWw6MTsKKwlVQ0hBUglUeE1DU1NldERlZmluZWQ6MTsKKyNlbHNlCisJVUNIQVIJVHhNQ1NTZXREZWZpbmVkOjE7CisJVUNIQVIJVHhSeE5vdEVxdWFsOjE7CisJVUNIQVIJVHhTdHJlYW06MjsKKwlVQ0hBUglNcGR1RGVuc2l0eToxOworCVVDSEFSCXJzdjozOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKwlVQ0hBUglyc3YzWzNdOworfSBIVF9NQ1NfU0VULCAqUEhUX01DU19TRVQ7CisKKy8vICBIVCBDYXBhYmlsaXR5IElORk8gZmllbGQgaW4gSFQgQ2FwIElFIC4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVTSE9SVAlyc3YyOjQ7CisJVVNIT1JUCVJER1N1cHBvcnQ6MTsJLy9yZXZlcnNlIERpcmVjdGlvbiBHcmFudCAgc3VwcG9ydAorCVVTSE9SVAlQbHVzSFRDOjE7CS8vK0hUQyBjb250cm9sIGZpZWxkIHN1cHBvcnQKKwlVU0hPUlQJTUNTRmVlZGJhY2s6MjsJLy8wOm5vIE1DUyBmZWVkYmFjaywgMjp1bnNvbGljaXRlZCBNQ1MgZmVlZGJhY2ssIDM6RnVsbCBNQ1MgZmVlZGJhY2ssICAxOnJzdi4KKwlVU0hPUlQJcnN2OjU7Ly9tb21pIHBvd2VyIHNhZmUKKwlVU0hPUlQJVHJhblRpbWU6MjsKKwlVU0hPUlQJUGNvOjE7CisjZWxzZQorCVVTSE9SVAlQY286MTsKKwlVU0hPUlQJVHJhblRpbWU6MjsKKwlVU0hPUlQJcnN2OjU7Ly9tb21pIHBvd2VyIHNhZmUKKwlVU0hPUlQJTUNTRmVlZGJhY2s6MjsJLy8wOm5vIE1DUyBmZWVkYmFjaywgMjp1bnNvbGljaXRlZCBNQ1MgZmVlZGJhY2ssIDM6RnVsbCBNQ1MgZmVlZGJhY2ssICAxOnJzdi4KKwlVU0hPUlQJUGx1c0hUQzoxOwkvLytIVEMgY29udHJvbCBmaWVsZCBzdXBwb3J0CisJVVNIT1JUCVJER1N1cHBvcnQ6MTsJLy9yZXZlcnNlIERpcmVjdGlvbiBHcmFudCAgc3VwcG9ydAorCVVTSE9SVAlyc3YyOjQ7CisjZW5kaWYgLyogUlRfQklHX0VORElBTiAqLworfSBFWFRfSFRfQ0FQX0lORk8sICpQRVhUX0hUX0NBUF9JTkZPOworCisvLyAgSFQgQmVhbWZvcm1pbmcgZmllbGQgaW4gSFQgQ2FwIElFIC4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfSFRfQkZfQ0FQeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVTE9ORwlyc3Y6MzsKKwlVTE9ORwlDaGFuRXN0aW1hdGlvbjoyOworCVVMT05HCUNTSVJvd0JGU3VwOjI7CisJVUxPTkcJQ29tU3RlZXJCRkFudFN1cDoyOworCVVMT05HCU5vQ29tU3RlZXJCRkFudFN1cDoyOworCVVMT05HCUNTSUJGQW50U3VwOjI7CisJVUxPTkcJTWluR3JvdXBpbmc6MjsKKwlVTE9ORwlFeHBDb21CRjoyOworCVVMT05HCUV4cE5vQ29tQkY6MjsKKwlVTE9ORwlFeHBDU0lGYms6MjsKKwlVTE9ORwlFeHBDb21TdGVlckNhcGFibGU6MTsKKwlVTE9ORwlFeHBOb0NvbVN0ZWVyQ2FwYWJsZToxOworCVVMT05HCUV4cENTSUNhcGFibGU6MTsKKwlVTE9ORwlDYWxpYnJhdGlvbjoyOworCVVMT05HCUltcFR4QkZDYXBhYmxlOjE7CisJVUxPTkcJVHhORFBDYXBhYmxlOjE7CisJVUxPTkcJUnhORFBDYXBhYmxlOjE7CisJVUxPTkcJVHhTb3VuZENhcGFibGU6MTsKKwlVTE9ORwlSeFNvdW5kQ2FwYWJsZToxOworCVVMT05HCVR4QkZSZWNDYXBhYmxlOjE7CisjZWxzZQorCVVMT05HCVR4QkZSZWNDYXBhYmxlOjE7CisJVUxPTkcJUnhTb3VuZENhcGFibGU6MTsKKwlVTE9ORwlUeFNvdW5kQ2FwYWJsZToxOworCVVMT05HCVJ4TkRQQ2FwYWJsZToxOworCVVMT05HCVR4TkRQQ2FwYWJsZToxOworCVVMT05HCUltcFR4QkZDYXBhYmxlOjE7CisJVUxPTkcJQ2FsaWJyYXRpb246MjsKKwlVTE9ORwlFeHBDU0lDYXBhYmxlOjE7CisJVUxPTkcJRXhwTm9Db21TdGVlckNhcGFibGU6MTsKKwlVTE9ORwlFeHBDb21TdGVlckNhcGFibGU6MTsKKwlVTE9ORwlFeHBDU0lGYms6MjsKKwlVTE9ORwlFeHBOb0NvbUJGOjI7CisJVUxPTkcJRXhwQ29tQkY6MjsKKwlVTE9ORwlNaW5Hcm91cGluZzoyOworCVVMT05HCUNTSUJGQW50U3VwOjI7CisJVUxPTkcJTm9Db21TdGVlckJGQW50U3VwOjI7CisJVUxPTkcJQ29tU3RlZXJCRkFudFN1cDoyOworCVVMT05HCUNTSVJvd0JGU3VwOjI7CisJVUxPTkcJQ2hhbkVzdGltYXRpb246MjsKKwlVTE9ORwlyc3Y6MzsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCit9IEhUX0JGX0NBUCwgKlBIVF9CRl9DQVA7CisKKy8vICBIVCBhbnRlbm5hIHNlbGVjdGlvbiBmaWVsZCBpbiBIVCBDYXAgSUUgLgordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9IVF9BU19DQVB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCXJzdjoxOworCVVDSEFSCVR4U291bmRQUERVOjE7CisJVUNIQVIJUnhBU2VsOjE7CisJVUNIQVIJQW50SW5kRmJrOjE7CisJVUNIQVIJRXhwQ1NJRmJrOjE7CisJVUNIQVIJQW50SW5kRmJrVHhBU0VMOjE7CisJVUNIQVIJRXhwQ1NJRmJrVHhBU0VMOjE7CisJVUNIQVIJQW50U2VsZWN0OjE7CisjZWxzZQorCVVDSEFSCUFudFNlbGVjdDoxOworCVVDSEFSCUV4cENTSUZia1R4QVNFTDoxOworCVVDSEFSCUFudEluZEZia1R4QVNFTDoxOworCVVDSEFSCUV4cENTSUZiazoxOworCVVDSEFSCUFudEluZEZiazoxOworCVVDSEFSCVJ4QVNlbDoxOworCVVDSEFSCVR4U291bmRQUERVOjE7CisJVUNIQVIJcnN2OjE7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworfSBIVF9BU19DQVAsICpQSFRfQVNfQ0FQOworCisvLyBEcmFmdCAxLjAgc2V0IElFIGxlbmd0aCAyNiwgYnV0IGlzIGV4dGVuc2libGUuLgorI2RlZmluZSBTSVpFX0hUX0NBUF9JRQkJMjYKKy8vIFRoZSBzdHJ1Y3R1cmUgZm9yIEhUIENhcGFiaWxpdHkgSUUuCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0hUX0NBUEFCSUxJVFlfSUV7CisJSFRfQ0FQX0lORk8JCUh0Q2FwSW5mbzsKKwlIVF9DQVBfUEFSTQkJSHRDYXBQYXJtOworLy8JSFRfTUNTX1NFVAkJSHRNQ1NTZXQ7CisJVUNIQVIJCQlNQ1NTZXRbMTZdOworCUVYVF9IVF9DQVBfSU5GTwlFeHRIdENhcEluZm87CisJSFRfQkZfQ0FQCQlUeEJGQ2FwOwkvLyBiZWFtZm9ybWluZyBjYXAuIHJ0Mjg2MGMgbm90IHN1cHBvcnQgYmVhbWZvcm1pbmcuCisJSFRfQVNfQ0FQCQlBU0NhcDsJLy9hbnRlbm5hIHNlbGVjdGlvbi4KK30gSFRfQ0FQQUJJTElUWV9JRSwgKlBIVF9DQVBBQklMSVRZX0lFOworCisKKy8vIDgwMi4xMW4gZHJhZnQzIHJlbGF0ZWQgc3RydWN0dXJlIGRlZmluaXRpb25zLgorLy8gNy4zLjIuNjAKKyNkZWZpbmUgZG90MTFPQlNTU2NhblBhc3NpdmVEd2VsbAkJCQkJCQkyMAkvLyBpbiBUVS4gbWluIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIFNUQSBjb250aW5vdXNseSBzY2FucyBlYWNoIGNoYW5uZWwgd2hlbiBwZXJmb3JtaW5nIGFuIGFjdGl2ZSBPQlNTIHNjYW4uCisjZGVmaW5lIGRvdDExT0JTU1NjYW5BY3RpdmVEd2VsbAkJCQkJCQkxMAkvLyBpbiBUVS5taW4gYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgU1RBIGNvbnRpbm91c2x5IHNjYW5zIGVhY2ggY2hhbm5lbCB3aGVuIHBlcmZvcm1pbmcgYW4gcGFzc2l2ZSBPQlNTIHNjYW4uCisjZGVmaW5lIGRvdDExQlNTV2lkdGhUcmlnZ2VyU2NhbkludGVydmFsCQkJCQkzMDAgIC8vIGluIHNlYy4gbWF4IGludGVydmFsIGJldHdlZW4gc2NhbiBvcGVyYXRpb25zIHRvIGJlIHBlcmZvcm1lZCB0byBkZXRlY3QgQlNTIGNoYW5uZWwgd2lkdGggdHJpZ2dlciBldmVudHMuCisjZGVmaW5lIGRvdDExT0JTU1NjYW5QYXNzaXZlVG90YWxQZXJDaGFubmVsCQkJCQkyMDAJLy8gaW4gVFUuIG1pbiB0b3RhbCBhbW91bnQgb2YgdGltZSB0aGF0IHRoZSBTVEEgc2NhbnMgZWFjaCBjaGFubmVsIHdoZW4gcGVyZm9ybWluZyBhIHBhc3NpdmUgT0JTUyBzY2FuLgorI2RlZmluZSBkb3QxMU9CU1NTY2FuQWN0aXZlVG90YWxQZXJDaGFubmVsCQkJCQkyMAkvL2luIFRVLiBtaW4gdG90YWwgYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgU1RBIHNjYW5zIGVhY2ggY2hhbm5lbCB3aGVuIHBlcmZvcm1pbmcgYSBhY3RpdmUgT0JTUyBzY2FuCisjZGVmaW5lIGRvdDExQlNTV2lkdGhDaGFubmVsVHJhbnNhY3Rpb25EZWxheUZhY3RvcgkJCTUJLy8gbWluIHJhdGlvIGJldHdlZW4gdGhlIGRlbGF5IHRpbWUgaW4gcGVyZm9ybWluZyBhIHN3aXRjaCBmcm9tIDIwTUh6IEJTUyB0byAyMC80MCBCU1Mgb3BlcmF0aW9uIGFuZCB0aGUgbWF4aW1hCisJCQkJCQkJCQkJCQkJCQkJLy8JaW50ZXJ2YWwgYmV0d2VlbiBvdmVybGFwcGluZyBCU1Mgc2NhbiBvcGVyYXRpb25zLgorI2RlZmluZSBkb3QxMUJTU1NjYW5BY3Rpdml0eVRocmVzaG9sZAkJCQkJCTI1CS8vIGluICUlLCBtYXggdG90YWwgdGltZSB0aGF0IGEgU1RBIG1heSBiZSBhY3RpdmUgb24gdGhlIG1lZGl1bSBkdXJpbmcgYSBwZXJpb2Qgb2YKKwkJCQkJCQkJCQkJCQkJCQkvLwkoZG90MTFCU1NXaWR0aENoYW5uZWxUcmFuc2FjdGlvbkRlbGF5RmFjdG9yICogZG90MTFCU1NXaWR0aFRyaWdnZXJTY2FuSW50ZXJ2YWwpIHNlY29uZHMgd2l0aG91dAorCQkJCQkJCQkJCQkJCQkJCS8vCWJlaW5nIG9ibGlnYXRlZCB0byBwZXJmb3JtIE9CU1MgU2NhbiBvcGVyYXRpb25zLiBkZWZhdWx0IGlzIDI1KD09IDAuMjUlKQorCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX09WRVJMQVBfQlNTX1NDQU5fSUV7CisJVVNIT1JUCQlTY2FuUGFzc2l2ZUR3ZWxsOworCVVTSE9SVAkJU2NhbkFjdGl2ZUR3ZWxsOworCVVTSE9SVAkJVHJpZ2dlclNjYW5JbnQ7CQkJCS8vIFRyaWdnZXIgc2NhbiBpbnRlcnZhbAorCVVTSE9SVAkJUGFzc2l2ZVRhbFBlckNoYW5uZWw7CQkvLyBwYXNzaXZlIHRvdGFsIHBlciBjaGFubmVsCisJVVNIT1JUCQlBY3RpdmVUYWxQZXJDaGFubmVsOwkJLy8gYWN0aXZlIHRvdGFsIHBlciBjaGFubmVsCisJVVNIT1JUCQlEZWxheUZhY3RvcjsJCQkJLy8gQlNTIHdpZHRoIGNoYW5uZWwgdHJhbnNpdGlvbiBkZWxheSBmYWN0b3IKKwlVU0hPUlQJCVNjYW5BY3RUaHJlOwkJCQkvLyBTY2FuIEFjdGl2aXR5IHRocmVzaG9sZAorfU9WRVJMQVBfQlNTX1NDQU5fSUUsICpQT1ZFUkxBUF9CU1NfU0NBTl9JRTsKKworCisvLyAgNy4zLjIuNTYuIDIwLzQwIENvZXhpc3RlbmNlIGVsZW1lbnQgdXNlZCBpbiAgRWxlbWVudCBJRCA9IDcyID0gSUVfMjA0MF9CU1NfQ09FWElTVAordHlwZWRlZiB1bmlvbiBQQUNLRUQgX0JTU18yMDQwX0NPRVhJU1RfSUV7Cisgc3RydWN0IFBBQ0tFRCB7CisgI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVQ0hBUglyc3Y6NTsKKwlVQ0hBUglCU1MyMFdpZHRoUmVxOjE7CisJVUNIQVIJSW50b2xlcmFudDQwOjE7CisJVUNIQVIJSW5mb1JlcToxOworICNlbHNlCisJVUNIQVIJSW5mb1JlcToxOworCVVDSEFSCUludG9sZXJhbnQ0MDoxOwkJCS8vIEludGVyLUJTUy4gc2V0IDEgd2hlbiBwcm9oaWJpdHMgYSByZWNlaXZpbmcgQlNTIGZyb20gb3BlcmF0aW5nIGFzIGEgMjAvNDAgTWh6IEJTUy4KKwlVQ0hBUglCU1MyMFdpZHRoUmVxOjE7CQkvLyBJbnRyYS1CU1Mgc2V0IDEgd2hlbiBwcm9oaWJpdHMgYSByZWNlaXZpbmcgQVAgZnJvbSBvcGVyYXRpbmcgaXRzIEJTUyBhcyBhIDIwLzQwTUh6IEJTUy4KKwlVQ0hBUglyc3Y6NTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisgICAgfSBmaWVsZDsKKyBVQ0hBUiAgIHdvcmQ7Cit9IEJTU18yMDQwX0NPRVhJU1RfSUUsICpQQlNTXzIwNDBfQ09FWElTVF9JRTsKKworCit0eXBlZGVmIHN0cnVjdCAgX1RSSUdHRVJfRVZFTlRBeworCUJPT0xFQU4JCQliVmFsaWQ7CisJVUNIQVIJQlNTSURbNl07CisJVUNIQVIJUmVnQ2xhc3M7CS8vIFJlZ3VsYXRvcnkgQ2xhc3MKKwlVU0hPUlQJQ2hhbm5lbDsKKwlVTE9ORwlDRENvdW50ZXI7ICAgLy8gTWFpbnRhaW4gYSBzZXBlcmF0ZSBjb3VudCBkb3duIGNvdW50ZXIgZm9yIGVhY2ggRXZlbnQgQS4KK30gVFJJR0dFUl9FVkVOVEEsICpQVFJJR0dFUl9FVkVOVEE7CisKKy8vIDIwLzQwIHRyaWdnZXIgZXZlbnQgdGFibGUKKy8vIElmIG9uZSBFdmVudCBBIGRlbGV0ZSBvciBjcmVhdGVkLCBvciBpZiBFdmVudCBCIGlzIGRldGVjdGVkIG9yIG5vdCBkZXRlY3RlZCwgU1RBIHNob3VsZCBzZW5kIDIwNDBCU1NDb2V4aXN0ZW5jZSB0byBBUC4KKyNkZWZpbmUgTUFYX1RSSUdHRVJfRVZFTlQJCTY0Cit0eXBlZGVmIHN0cnVjdCAgX1RSSUdHRVJfRVZFTlRfVEFCeworCVVDSEFSCUV2ZW50QU5vOworCVRSSUdHRVJfRVZFTlRBCUV2ZW50QVtNQVhfVFJJR0dFUl9FVkVOVF07CisJVUxPTkcJCQlFdmVudEJDb3VudERvd247CS8vIENvdW50IGRvd24gY291bnRlciBmb3IgRXZlbnQgQi4KK30gVFJJR0dFUl9FVkVOVF9UQUIsICpQVFJJR0dFUl9FVkVOVF9UQUI7CisKKy8vIDcuMy4yNyAyMC80MCBCc3MgQ29leGlzdGVuY2UgTWdtdCBjYXBhYmlsaXR5IHVzZWQgaW4gZXh0ZW5kZWQgY2FwYWJpbGl0aWVzIGluZm9ybWF0aW9uIElFKCBJRCA9IDEyNyA9IElFX0VYVF9DQVBBQklMSVRZKS4KKy8vCVRoaXMgaXMgdGhlIGZpcnN0IG9jdGV0IGFuZCB3YXMgZGVmaW5lZCBpbiA4MDIuMTFuIEQzLjAzIGFuZCA4MDIuMTF5RDkuMAordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9FWFRfQ0FQX0lORk9fRUxFTUVOVHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVUNIQVIJcnN2Mjo1OworCVVDSEFSCUV4dGVuZENoYW5uZWxTd2l0Y2g6MTsKKwlVQ0hBUglyc3Y6MTsKKwlVQ0hBUglCc3NDb2V4aXN0TWdtdFN1cHBvcnQ6MTsKKyNlbHNlCisJVUNIQVIJQnNzQ29leGlzdE1nbXRTdXBwb3J0OjE7CisJVUNIQVIJcnN2OjE7CisJVUNIQVIJRXh0ZW5kQ2hhbm5lbFN3aXRjaDoxOworCVVDSEFSCXJzdjI6NTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCit9RVhUX0NBUF9JTkZPX0VMRU1FTlQsICpQRVhUX0NBUF9JTkZPX0VMRU1FTlQ7CisKKworLy8gODAyLjExbiA3LjMuMi42MQordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9CU1NfMjA0MF9DT0VYSVNUX0VMRU1FTlR7CisJVUNIQVIJCQkJCUVsZW1lbnRJRDsJCS8vIElEID0gSUVfMjA0MF9CU1NfQ09FWElTVCA9IDcyCisJVUNIQVIJCQkJCUxlbjsKKwlCU1NfMjA0MF9DT0VYSVNUX0lFCQlCc3NDb2V4aXN0SWU7Cit9QlNTXzIwNDBfQ09FWElTVF9FTEVNRU5ULCAqUEJTU18yMDQwX0NPRVhJU1RfRUxFTUVOVDsKKworCisvLzgwMi4xMW4gNy4zLjIuNTkKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfQlNTXzIwNDBfSU5UT0xFUkFOVF9DSF9SRVBPUlR7CisJVUNIQVIJCQkJRWxlbWVudElEOwkJLy8gSUQgPSBJRV8yMDQwX0JTU19JTlRPTEVSQU5UX1JFUE9SVCA9IDczCisJVUNIQVIJCQkJTGVuOworCVVDSEFSCQkJCVJlZ3VsYXRvcnlDbGFzczsKKwlVQ0hBUgkJCQlDaExpc3RbMF07Cit9QlNTXzIwNDBfSU5UT0xFUkFOVF9DSF9SRVBPUlQsICpQQlNTXzIwNDBfSU5UT0xFUkFOVF9DSF9SRVBPUlQ7CisKKworLy8gVGhlIHN0cnVjdHVyZSBmb3IgY2hhbm5lbCBzd2l0Y2ggYW5ub3VjZW1lbnQgSUUuIFRoaXMgaXMgaW4gODAyLjExbiBEMy4wMwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9DSEFfU1dJVENIX0FOTk9VTkNFX0lFeworCVVDSEFSCQkJU3dpdGNoTW9kZTsJLy9jaGFubmVsIHN3aXRjaCBtb2RlCisJVUNIQVIJCQlOZXdDaGFubmVsOwkvLworCVVDSEFSCQkJU3dpdGNoQ291bnQ7CS8vCit9IENIQV9TV0lUQ0hfQU5OT1VOQ0VfSUUsICpQQ0hBX1NXSVRDSF9BTk5PVU5DRV9JRTsKKworCisvLyBUaGUgc3RydWN0dXJlIGZvciBjaGFubmVsIHN3aXRjaCBhbm5vdWNlbWVudCBJRS4gVGhpcyBpcyBpbiA4MDIuMTFuIEQzLjAzCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1NFQ19DSEFfT0ZGU0VUX0lFeworCVVDSEFSCQkJU2Vjb25kYXJ5Q2hhbm5lbE9mZnNldDsJIC8vIDE6IFNlY29uZGFyeSBhYm92ZSwgMzogU2Vjb25kYXJ5IGJlbG93LCAwOiBubyBTZWNvbmRhcnkKK30gU0VDX0NIQV9PRkZTRVRfSUUsICpQU0VDX0NIQV9PRkZTRVRfSUU7CisKKworLy8gVGhpcyBzdHJ1Y3R1cmUgaXMgZXh0cmFjdGVkIGZyb20gc3RydWN0IFJUX0hUX0NBUEFCSUxJVFkKK3R5cGVkZWYgc3RydWN0IHsKKwlCT09MRUFOCQkJYkh0RW5hYmxlOwkgLy8gSWYgd2Ugc2hvdWxkIHVzZSBodCByYXRlLgorCUJPT0xFQU4JCQliUHJlTkh0OwkgLy8gSWYgd2Ugc2hvdWxkIHVzZSBodCByYXRlLgorCS8vU3Vic3RyYWN0IGZyb20gSFQgQ2FwYWJpbGl0eSBJRQorCVVDSEFSCQkJTUNTU2V0WzE2XTsJLy9vbmx5IHN1cG9vcnQgTUNTPTAtMTUsMzIgLAorfSBSVF9IVF9QSFlfSU5GTywgKlBSVF9IVF9QSFlfSU5GTzsKKworLy9UaGlzIHN0cnVjdHVyZSBzdWJzdHJhY3RzIHJhbGluayBzdXBwb3J0cyBmcm9tIGFsbCA4MDIuMTFuLXJlbGF0ZWQgZmVhdHVyZXMuCisvL0ZlYXR1cmVzIG5vdCBsaXN0ZWQgaGVyZSBidXQgY29udGFpbmVkIGluIDgwMi4xMW4gc3BlYyBhcmUgbm90IHN1cHBvcnRlZCBpbiBydDI4NjAuCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgMAkvLyBtb3ZlIHRvCisJQk9PTEVBTgkJCWJIdEVuYWJsZTsJIC8vIElmIHdlIHNob3VsZCB1c2UgaHQgcmF0ZS4KKwlCT09MRUFOCQkJYlByZU5IdDsJIC8vIElmIHdlIHNob3VsZCB1c2UgaHQgcmF0ZS4KKwkvL1N1YnN0cmFjdCBmcm9tIEhUIENhcGFiaWxpdHkgSUUKKwlVQ0hBUgkJCU1DU1NldFsxNl07CS8vb25seSBzdXBvb3J0IE1DUz0wLTE1LDMyICwKKyNlbmRpZgorI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVU0hPUlQJcnN2OjU7CisJVVNIT1JUCUFtc2R1U2l6ZToxOwkvLyBNYXggcmVjZWl2aW5nIEEtTVNEVSBzaXplCisJVVNIT1JUCUFtc2R1RW5hYmxlOjE7CS8vIEVuYWJsZSB0byB0cmFuc21pdCBBLU1TRFUuIFN1Z2dlc3QgZGlzYWJsZS4gV2Ugc2hvdWxkIHVzZSBBLU1QRFUgdG8gZ2FpbiBiZXN0IGJlbmlmaXQgb2YgODAyLjExbgorCVVTSE9SVAlSeFNUQkM6MjsJLy8gMiBiaXRzCisJVVNIT1JUCVR4U1RCQzoxOworCVVTSE9SVAlTaG9ydEdJZm9yNDA6MTsJLy9mb3I0ME1IegorCVVTSE9SVAlTaG9ydEdJZm9yMjA6MTsKKwlVU0hPUlQJR0Y6MTsJLy9ncmVlbiBmaWVsZAorCVVTSE9SVAlNaW1vUHM6MjsvL21pbW8gcG93ZXIgc2FmZSBNTVBTXworCVVTSE9SVAlDaGFubmVsV2lkdGg6MTsKKyNlbHNlCisJVVNIT1JUCUNoYW5uZWxXaWR0aDoxOworCVVTSE9SVAlNaW1vUHM6MjsvL21pbW8gcG93ZXIgc2FmZSBNTVBTXworCVVTSE9SVAlHRjoxOwkvL2dyZWVuIGZpZWxkCisJVVNIT1JUCVNob3J0R0lmb3IyMDoxOworCVVTSE9SVAlTaG9ydEdJZm9yNDA6MTsJLy9mb3I0ME1IegorCVVTSE9SVAlUeFNUQkM6MTsKKwlVU0hPUlQJUnhTVEJDOjI7CS8vIDIgYml0cworCVVTSE9SVAlBbXNkdUVuYWJsZToxOwkvLyBFbmFibGUgdG8gdHJhbnNtaXQgQS1NU0RVLiBTdWdnZXN0IGRpc2FibGUuIFdlIHNob3VsZCB1c2UgQS1NUERVIHRvIGdhaW4gYmVzdCBiZW5pZml0IG9mIDgwMi4xMW4KKwlVU0hPUlQJQW1zZHVTaXplOjE7CS8vIE1heCByZWNlaXZpbmcgQS1NU0RVIHNpemUKKwlVU0hPUlQJcnN2OjU7CisjZW5kaWYKKworCS8vU3Vic3RyYWN0IGZyb20gQWRkaW9udCBIVCBJTkZPIElFCisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCVJlY29tV2lkdGg6MTsKKwlVQ0hBUglFeHRDaGFuT2Zmc2V0OjI7CS8vIFBsZWFzZSBub3QgdGhlIGRpZmZlcmVuY2Ugd2l0aCBmb2xsb3dpbmcgCVVDSEFSCU5ld0V4dENoYW5uZWxPZmZzZXQ7IGZyb20gODAyLjExbgorCVVDSEFSCU1wZHVEZW5zaXR5OjM7CisJVUNIQVIJTWF4UkFtcGR1RmFjdG9yOjI7CisjZWxzZQorCVVDSEFSCU1heFJBbXBkdUZhY3RvcjoyOworCVVDSEFSCU1wZHVEZW5zaXR5OjM7CisJVUNIQVIJRXh0Q2hhbk9mZnNldDoyOwkvLyBQbGVhc2Ugbm90IHRoZSBkaWZmZXJlbmNlIHdpdGggZm9sbG93aW5nIAlVQ0hBUglOZXdFeHRDaGFubmVsT2Zmc2V0OyBmcm9tIDgwMi4xMW4KKwlVQ0hBUglSZWNvbVdpZHRoOjE7CisjZW5kaWYKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVU0hPUlQJcnN2MjoxMTsKKwlVU0hPUlQJT0JTU19Ob25IVEV4aXN0OjE7CisJVVNIT1JUCXJzdjM6MTsKKwlVU0hPUlQJTm9uR2ZQcmVzZW50OjE7CisJVVNIT1JUCU9wZXJhaW9uTW9kZToyOworI2Vsc2UKKwlVU0hPUlQJT3BlcmFpb25Nb2RlOjI7CisJVVNIT1JUCU5vbkdmUHJlc2VudDoxOworCVVTSE9SVAlyc3YzOjE7CisJVVNIT1JUCU9CU1NfTm9uSFRFeGlzdDoxOworCVVTSE9SVAlyc3YyOjExOworI2VuZGlmCisKKwkvLyBOZXcgRXh0ZW5zaW9uIENoYW5uZWwgT2Zmc2V0IElFCisJVUNIQVIJTmV3RXh0Q2hhbm5lbE9mZnNldDsKKwkvLyBFeHRlbnNpb24gQ2FwYWJpbGl0eSBJRSA9IDEyNworCVVDSEFSCUJTU0NvZXhpc3QyMDQwOworfSBSVF9IVF9DQVBBQklMSVRZLCAqUFJUX0hUX0NBUEFCSUxJVFk7CisKKy8vICAgZmllbGQgaW4gQWRkdGlvbmFsIEhUIEluZm9ybWF0aW9uIElFIC4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCVNlckludGVyR3JhbnU6MzsKKwlVQ0hBUglTX1BTTVBTdXA6MTsKKwlVQ0hBUglSaWZzTW9kZToxOworCVVDSEFSCVJlY29tV2lkdGg6MTsKKwlVQ0hBUglFeHRDaGFuT2Zmc2V0OjI7CisjZWxzZQorCVVDSEFSCUV4dENoYW5PZmZzZXQ6MjsKKwlVQ0hBUglSZWNvbVdpZHRoOjE7CisJVUNIQVIJUmlmc01vZGU6MTsKKwlVQ0hBUglTX1BTTVBTdXA6MTsJIC8vSW5kaWNhdGUgc3VwcG9ydCBmb3Igc2NoZWR1bGVkIFBTTVAKKwlVQ0hBUglTZXJJbnRlckdyYW51OjM7CSAvL3NlcnZpY2UgaW50ZXJ2YWwgZ3JhbnVsYXJpdHkKKyNlbmRpZgorfSBBRERfSFRJTkZPLCAqUEFERF9IVElORk87CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVVNIT1JUCXJzdjI6MTE7CisJVVNIT1JUCU9CU1NfTm9uSFRFeGlzdDoxOworCVVTSE9SVAlyc3Y6MTsKKwlVU0hPUlQJTm9uR2ZQcmVzZW50OjE7CisJVVNIT1JUCU9wZXJhaW9uTW9kZToyOworI2Vsc2UKKwlVU0hPUlQJT3BlcmFpb25Nb2RlOjI7CisJVVNIT1JUCU5vbkdmUHJlc2VudDoxOworCVVTSE9SVAlyc3Y6MTsKKwlVU0hPUlQJT0JTU19Ob25IVEV4aXN0OjE7CisJVVNIT1JUCXJzdjI6MTE7CisjZW5kaWYKK30gQUREX0hUSU5GTzIsICpQQUREX0hUSU5GTzI7CisKKworLy8gVE9ETzogTmVlZCBzeW5jIHdpdGggc3BlYyBhYm91dCB0aGUgZGVmaW5pdGlvbiBvZiBTdGJjTWNzLiBJbiBEcmFmdCAzLjAzLCBpdCdzIHJlc2VydmVkLgordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVU0hPUlQJcnN2OjQ7CisJVVNIT1JUCVBjb1BoYXNlOjE7CisJVVNIT1JUCVBjb0FjdGl2ZToxOworCVVTSE9SVAlMc2lnVHhvcFByb3Q6MTsKKwlVU0hPUlQJU1RCQ0JlYWNvbjoxOworCVVTSE9SVAlEdWFsQ1RTUHJvdGVjdDoxOworCVVTSE9SVAlEdWFsQmVhY29uOjE7CisJVVNIT1JUCVN0YmNNY3M6NjsKKyNlbHNlCisJVVNIT1JUCVN0YmNNY3M6NjsKKwlVU0hPUlQJRHVhbEJlYWNvbjoxOworCVVTSE9SVAlEdWFsQ1RTUHJvdGVjdDoxOworCVVTSE9SVAlTVEJDQmVhY29uOjE7CisJVVNIT1JUCUxzaWdUeG9wUHJvdDoxOwkvLyBMLVNJRyBUWE9QIHByb3RlY3Rpb24gZnVsbCBzdXBwb3J0CisJVVNIT1JUCVBjb0FjdGl2ZToxOworCVVTSE9SVAlQY29QaGFzZToxOworCVVTSE9SVAlyc3Y6NDsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCit9IEFERF9IVElORk8zLCAqUEFERF9IVElORk8zOworCisjZGVmaW5lIFNJWkVfQUREX0hUX0lORk9fSUUJCTIyCit0eXBlZGVmIHN0cnVjdCAgUEFDS0VEeworCVVDSEFSCQkJCUNvbnRyb2xDaGFuOworCUFERF9IVElORk8JCQlBZGRIdEluZm87CisJQUREX0hUSU5GTzIJCQlBZGRIdEluZm8yOworCUFERF9IVElORk8zCQkJQWRkSHRJbmZvMzsKKwlVQ0hBUgkJCQlNQ1NTZXRbMTZdOwkJLy8gQmFzaWMgTUNTIHNldAorfSBBRERfSFRfSU5GT19JRSwgKlBBRERfSFRfSU5GT19JRTsKKwordHlwZWRlZiBzdHJ1Y3QgIFBBQ0tFRHsKKwlVQ0hBUgkJCQlOZXdFeHRDaGFuT2Zmc2V0OworfSBORVdfRVhUX0NIQU5fSUUsICpQTkVXX0VYVF9DSEFOX0lFOworCisKKy8vIDQtYnl0ZSBIVEMgZmllbGQuICBtYXliZSBpbmNsdWRlZCBpbiBhbnkgZnJhbWUgZXhjZXB0IG5vbi1RT1MgZGF0YSBmcmFtZS4gIFRoZSBPcmRlciBiaXQgbXVzdCBzZXQgMS4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorICAgIFVJTlQzMgkJUkRHOjE7CS8vUkRHIC8gTW9yZSBQUERVCisgICAgVUlOVDMyCQlBQ0NvbnN0cmFpbnQ6MTsJLy9mZWVkYmFjayByZXF1ZXN0CisgICAgVUlOVDMyCQlyc3Y6NTsgIC8vY2FsaWJyYXRpb24gc2VxdWVuY2UKKyAgICBVSU5UMzIJCVpMRkFubm91Y2U6MTsJLy8gWkxGIGFubm91bmNlbWVudAorICAgIFVJTlQzMgkJQ1NJU1RFRVJJTkc6MjsJLy9DU0kvIFNURUVSSU5HCisgICAgVUlOVDMyCQlGQktSZXE6MjsJLy9mZWVkYmFjayByZXF1ZXN0CisgICAgVUlOVDMyCQlDYWxTZXE6MjsgIC8vY2FsaWJyYXRpb24gc2VxdWVuY2UKKyAgICBVSU5UMzIJCUNhbFBvczoyOwkvLyBjYWxpYnJhdGlvbiBwb3NpdGlvbgorICAgIFVJTlQzMgkJTUZCb3JBU0M6NzsJLy9MaW5rIGFkYXB0YXRpb24gZmVlZGJhY2sgY29udGFpbmluZyByZWNvbW1lbmRlZCBNQ1MuIDB4N2YgZm9yIG5vIGZlZWRiYWNrIG9yIG5vdCBhdmFpbGFibGUKKyAgICBVSU5UMzIJCU1GUzozOwkvL1NFVCB0byB0aGUgcmVjZWl2ZWQgdmFsdWUgb2YgTVJTLiAweDExMSBmb3IgdW5zb2xpY2l0ZWQgTUZCLgorICAgIFVJTlQzMgkJTVJTb3JBU0k6MzsJLy8gTVJRIFNlcXVlbmNlIGlkZW50aWZpZXIuIHVuY2hhbmdlZCBkdXJpbmcgZW50aXJlIHByb2NlZHVyZS4gMHgwMDAtMHgxMTAuCisgICAgVUlOVDMyCQlNUlE6MTsJLy9NQ1MgZmVlZGJhY2suIFJlcXVlc3QgZm9yIGEgTUNTIGZlZWRiYWNrCisgICAgVUlOVDMyCQlUUlE6MTsJLy9zb3VuZGluZyByZXF1ZXN0CisgICAgVUlOVDMyCQlNQToxOwkvL21hbmFnZW1lbnQgYWN0aW9uIHBheWxvYWQgZXhpc3QgaW4gKFFvUyBOdWxsK0hUQykKKyNlbHNlCisgICAgVUlOVDMyCQlNQToxOwkvL21hbmFnZW1lbnQgYWN0aW9uIHBheWxvYWQgZXhpc3QgaW4gKFFvUyBOdWxsK0hUQykKKyAgICBVSU5UMzIJCVRSUToxOwkvL3NvdW5kaW5nIHJlcXVlc3QKKyAgICBVSU5UMzIJCU1SUToxOwkvL01DUyBmZWVkYmFjay4gUmVxdWVzdCBmb3IgYSBNQ1MgZmVlZGJhY2sKKyAgICBVSU5UMzIJCU1SU29yQVNJOjM7CS8vIE1SUSBTZXF1ZW5jZSBpZGVudGlmaWVyLiB1bmNoYW5nZWQgZHVyaW5nIGVudGlyZSBwcm9jZWR1cmUuIDB4MDAwLTB4MTEwLgorICAgIFVJTlQzMgkJTUZTOjM7CS8vU0VUIHRvIHRoZSByZWNlaXZlZCB2YWx1ZSBvZiBNUlMuIDB4MTExIGZvciB1bnNvbGljaXRlZCBNRkIuCisgICAgVUlOVDMyCQlNRkJvckFTQzo3OwkvL0xpbmsgYWRhcHRhdGlvbiBmZWVkYmFjayBjb250YWluaW5nIHJlY29tbWVuZGVkIE1DUy4gMHg3ZiBmb3Igbm8gZmVlZGJhY2sgb3Igbm90IGF2YWlsYWJsZQorICAgIFVJTlQzMgkJQ2FsUG9zOjI7CS8vIGNhbGlicmF0aW9uIHBvc2l0aW9uCisgICAgVUlOVDMyCQlDYWxTZXE6MjsgIC8vY2FsaWJyYXRpb24gc2VxdWVuY2UKKyAgICBVSU5UMzIJCUZCS1JlcToyOwkvL2ZlZWRiYWNrIHJlcXVlc3QKKyAgICBVSU5UMzIJCUNTSVNURUVSSU5HOjI7CS8vQ1NJLyBTVEVFUklORworICAgIFVJTlQzMgkJWkxGQW5ub3VjZToxOwkvLyBaTEYgYW5ub3VuY2VtZW50CisgICAgVUlOVDMyCQlyc3Y6NTsgIC8vY2FsaWJyYXRpb24gc2VxdWVuY2UKKyAgICBVSU5UMzIJCUFDQ29uc3RyYWludDoxOwkvL2ZlZWRiYWNrIHJlcXVlc3QKKyAgICBVSU5UMzIJCVJERzoxOwkvL1JERyAvIE1vcmUgUFBEVQorI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCit9IEhUX0NPTlRST0wsICpQSFRfQ09OVFJPTDsKKworLy8gMi1ieXRlIFFPUyBDT05UUk9MIGZpZWxkCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBVU0hPUlQgICAgICBUeG9wX1F1ZXVlU2l6ZTo4OworICAgIFVTSE9SVCAgICAgIEFNc2R1UHJlc2VudDoxOworICAgIFVTSE9SVCAgICAgIEFja1BvbGljeToyOyAgLy8wOiBub3JtYWwgQUNLIDE6Tm8gQUNLIDI6c2NoZWR1bGVkIHVuZGVyIE1UQkEvUFNNUCAgMzogQkEKKyAgICBVU0hPUlQgICAgICBFT1NQOjE7CisgICAgVVNIT1JUICAgICAgVElEOjQ7CisjZWxzZQorICAgIFVTSE9SVCAgICAgIFRJRDo0OworICAgIFVTSE9SVCAgICAgIEVPU1A6MTsKKyAgICBVU0hPUlQgICAgICBBY2tQb2xpY3k6MjsgIC8vMDogbm9ybWFsIEFDSyAxOk5vIEFDSyAyOnNjaGVkdWxlZCB1bmRlciBNVEJBL1BTTVAgIDM6IEJBCisgICAgVVNIT1JUICAgICAgQU1zZHVQcmVzZW50OjE7CisgICAgVVNIT1JUICAgICAgVHhvcF9RdWV1ZVNpemU6ODsKKyNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLworfSBRT1NfQ09OVFJPTCwgKlBRT1NfQ09OVFJPTDsKKworLy8gMi1ieXRlIEZyYW1lIGNvbnRyb2wgZmllbGQKK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVTSE9SVAkJT3JkZXI6MTsJCQkvLyBTdHJpY3Qgb3JkZXIgZXhwZWN0ZWQKKwlVU0hPUlQJCVdlcDoxOwkJCQkvLyBXZXAgZGF0YQorCVVTSE9SVAkJTW9yZURhdGE6MTsJCQkvLyBNb3JlIGRhdGEgYml0CisJVVNIT1JUCQlQd3JNZ210OjE7CQkJLy8gUG93ZXIgbWFuYWdlbWVudCBiaXQKKwlVU0hPUlQJCVJldHJ5OjE7CQkJLy8gUmV0cnkgc3RhdHVzIGJpdAorCVVTSE9SVAkJTW9yZUZyYWc6MTsJCQkvLyBNb3JlIGZyYWdtZW50IGJpdAorCVVTSE9SVAkJRnJEczoxOwkJCQkvLyBGcm9tIERTIGluZGljYXRpb24KKwlVU0hPUlQJCVRvRHM6MTsJCQkJLy8gVG8gRFMgaW5kaWNhdGlvbgorCVVTSE9SVAkJU3ViVHlwZTo0OwkJCS8vIE1TRFUgc3VidHlwZQorCVVTSE9SVAkJVHlwZToyOwkJCQkvLyBNU0RVIHR5cGUKKwlVU0hPUlQJCVZlcjoyOwkJCQkvLyBQcm90b2NvbCB2ZXJzaW9uCisjZWxzZQorCVVTSE9SVAkJVmVyOjI7CQkJCS8vIFByb3RvY29sIHZlcnNpb24KKwlVU0hPUlQJCVR5cGU6MjsJCQkJLy8gTVNEVSB0eXBlCisJVVNIT1JUCQlTdWJUeXBlOjQ7CQkJLy8gTVNEVSBzdWJ0eXBlCisJVVNIT1JUCQlUb0RzOjE7CQkJCS8vIFRvIERTIGluZGljYXRpb24KKwlVU0hPUlQJCUZyRHM6MTsJCQkJLy8gRnJvbSBEUyBpbmRpY2F0aW9uCisJVVNIT1JUCQlNb3JlRnJhZzoxOwkJCS8vIE1vcmUgZnJhZ21lbnQgYml0CisJVVNIT1JUCQlSZXRyeToxOwkJCS8vIFJldHJ5IHN0YXR1cyBiaXQKKwlVU0hPUlQJCVB3ck1nbXQ6MTsJCQkvLyBQb3dlciBtYW5hZ2VtZW50IGJpdAorCVVTSE9SVAkJTW9yZURhdGE6MTsJCQkvLyBNb3JlIGRhdGEgYml0CisJVVNIT1JUCQlXZXA6MTsJCQkJLy8gV2VwIGRhdGEKKwlVU0hPUlQJCU9yZGVyOjE7CQkJLy8gU3RyaWN0IG9yZGVyIGV4cGVjdGVkCisjZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KK30gRlJBTUVfQ09OVFJPTCwgKlBGUkFNRV9DT05UUk9MOworCit0eXBlZGVmCXN0cnVjdAlQQUNLRUQgX0hFQURFUl84MDJfMTEJeworICAgIEZSQU1FX0NPTlRST0wgICBGQzsKKyAgICBVU0hPUlQgICAgICAgICAgRHVyYXRpb247CisgICAgVUNIQVIgICAgICAgICAgIEFkZHIxW01BQ19BRERSX0xFTl07CisgICAgVUNIQVIgICAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07CisJVUNIQVIJCQlBZGRyM1tNQUNfQUREUl9MRU5dOworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVU0hPUlQJCQlTZXF1ZW5jZToxMjsKKwlVU0hPUlQJCQlGcmFnOjQ7CisjZWxzZQorCVVTSE9SVAkJCUZyYWc6NDsKKwlVU0hPUlQJCQlTZXF1ZW5jZToxMjsKKyNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLworCVVDSEFSCQkJT2N0ZXRbMF07Cit9CUhFQURFUl84MDJfMTEsICpQSEVBREVSXzgwMl8xMTsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV84MDJfMTEgeworICAgIEhFQURFUl84MDJfMTEgICBIZHI7CisgICAgVUNIQVIgICAgICAgICAgICBPY3RldFsxXTsKK30gICBGUkFNRV84MDJfMTEsICpQRlJBTUVfODAyXzExOworCisvLyBRb1NOdWxsIGVtYmVkZGluZyBvZiBtYW5hZ2VtZW50IGFjdGlvbi4gV2hlbiBIVCBDb250cm9sIE1BIGZpZWxkIHNldCB0byAxLgordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9NQV9CT0RZIHsKKyAgICBVQ0hBUiAgICAgICAgICAgIENhdGVnb3J5OworICAgIFVDSEFSICAgICAgICAgICAgQWN0aW9uOworICAgIFVDSEFSICAgICAgICAgICAgT2N0ZXRbMV07Cit9ICAgTUFfQk9EWSwgKlBNQV9CT0RZOworCit0eXBlZGVmCXN0cnVjdAlQQUNLRUQgX0hFQURFUl84MDJfMwl7CisgICAgVUNIQVIgICAgICAgICAgIERBQWRkcjFbTUFDX0FERFJfTEVOXTsKKyAgICBVQ0hBUiAgICAgICAgICAgU0FBZGRyMltNQUNfQUREUl9MRU5dOworICAgIFVDSEFSICAgICAgICAgICBPY3RldFsyXTsKK30JSEVBREVSXzgwMl8zLCAqUEhFQURFUl84MDJfMzsKKy8vLy9CbG9jayBBQ0sgcmVsYXRlZCBmb3JtYXQKKy8vIDItYnl0ZSBCQSBQYXJhbWV0ZXIgIGZpZWxkICBpbiAJREVMQkEgZnJhbWVzIHRvIHRlcm1pbmF0ZSBhbiBhbHJlYWR5IHNldCB1cCBiQQordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBVU0hPUlQgICAgICBUSUQ6NDsJLy8gdmFsdWUgb2YgVEMgb3MgVFMKKyAgICBVU0hPUlQgICAgICBJbml0aWF0b3I6MTsJLy8gMTogb3JpZ2luYXRvciAgICAwOnJlY2lwaWVudAorICAgIFVTSE9SVCAgICAgIFJzdjoxMTsJLy8gYWx3YXlzIHNldCB0byAwCisjZWxzZQorICAgIFVTSE9SVCAgICAgIFJzdjoxMTsJLy8gYWx3YXlzIHNldCB0byAwCisgICAgVVNIT1JUICAgICAgSW5pdGlhdG9yOjE7CS8vIDE6IG9yaWdpbmF0b3IgICAgMDpyZWNpcGllbnQKKyAgICBVU0hPUlQgICAgICBUSUQ6NDsJLy8gdmFsdWUgb2YgVEMgb3MgVFMKKyNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLworfSBERUxCQV9QQVJNLCAqUERFTEJBX1BBUk07CisKKy8vIDItYnl0ZSBCQSBQYXJhbWV0ZXIgU2V0IGZpZWxkICBpbiBBRERCQSBmcmFtZXMgdG8gc2lnbmFsIHBhcm0gZm9yIHNldHRpbmcgdXAgYSBCQQordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgVVNIT1JUICAgICAgQnVmU2l6ZToxMDsJLy8gbnVtYmVyIG9mIGJ1ZmZlIG9mIHNpemUgMjMwNCBvY3RldHNyCisgICAgVVNIT1JUICAgICAgVElEOjQ7CS8vIHZhbHVlIG9mIFRDIG9zIFRTCisgICAgVVNIT1JUICAgICAgQkFQb2xpY3k6MTsJLy8gMTogaW1tZWRpYXRlbHkgQkEgICAgMDpkZWxheWVkIEJBCisgICAgVVNIT1JUICAgICAgQU1TRFVTdXBwb3J0ZWQ6MTsJLy8gMDogbm90IHBlcm1pdHRlZAkJMTogcGVybWl0dGVkCisjZWxzZQorICAgIFVTSE9SVCAgICAgIEFNU0RVU3VwcG9ydGVkOjE7CS8vIDA6IG5vdCBwZXJtaXR0ZWQJCTE6IHBlcm1pdHRlZAorICAgIFVTSE9SVCAgICAgIEJBUG9saWN5OjE7CS8vIDE6IGltbWVkaWF0ZWx5IEJBICAgIDA6ZGVsYXllZCBCQQorICAgIFVTSE9SVCAgICAgIFRJRDo0OwkvLyB2YWx1ZSBvZiBUQyBvcyBUUworICAgIFVTSE9SVCAgICAgIEJ1ZlNpemU6MTA7CS8vIG51bWJlciBvZiBidWZmZSBvZiBzaXplIDIzMDQgb2N0ZXRzcgorI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCit9IEJBX1BBUk0sICpQQkFfUEFSTTsKKworLy8gMi1ieXRlIEJBIFN0YXJ0aW5nIFNlcSBDT05UUk9MIGZpZWxkCit0eXBlZGVmIHVuaW9uIFBBQ0tFRCB7CisgICAgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorICAgIFVTSE9SVCAgICAgIFN0YXJ0U2VxOjEyOyAgIC8vIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgMXN0IE1TRFUgZm9yIHdoaWNoIHRoaXMgQkFSIGlzIHNlbnQKKwlVU0hPUlQgICAgICBGcmFnTnVtOjQ7CS8vIGFsd2F5cyBzZXQgdG8gMAorI2Vsc2UKKyAgICBVU0hPUlQgICAgICBGcmFnTnVtOjQ7CS8vIGFsd2F5cyBzZXQgdG8gMAorCVVTSE9SVCAgICAgIFN0YXJ0U2VxOjEyOyAgIC8vIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgMXN0IE1TRFUgZm9yIHdoaWNoIHRoaXMgQkFSIGlzIHNlbnQKKyNlbmRpZiAvKiBSVF9CSUdfRU5ESUFOICovCisgICAgfSAgIGZpZWxkOworICAgIFVTSE9SVCAgICAgICAgICAgd29yZDsKK30gQkFTRVFfQ09OVFJPTCwgKlBCQVNFUV9DT05UUk9MOworCisvL0JBQ29udHJvbCBhbmQgQkFSQ29udHJvbCBhcmUgdGhlIHNhbWUKKy8vIDItYnl0ZSBCQSBDT05UUk9MIGZpZWxkIGluIEJBIGZyYW1lCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBVU0hPUlQgICAgICBUSUQ6NDsKKyAgICBVU0hPUlQgICAgICBSc3Y6OTsKKyAgICBVU0hPUlQgICAgICBDb21wcmVzc2VkOjE7CisgICAgVVNIT1JUICAgICAgTVRJRDoxOwkJLy9FV0MgVjEuMjQKKyAgICBVU0hPUlQgICAgICBBQ0tQb2xpY3k6MTsgLy8gb25seSByZWxhdGVkIHRvIE4tRGVsYXllZCBCQS4gQnV0IG5vdCBzdXBwb3J0IGluIFJUMjg2MGIuIDA6Tm9ybWFsQUNLICAxOk5vIEFDSworI2Vsc2UKKyAgICBVU0hPUlQgICAgICBBQ0tQb2xpY3k6MTsgLy8gb25seSByZWxhdGVkIHRvIE4tRGVsYXllZCBCQS4gQnV0IG5vdCBzdXBwb3J0IGluIFJUMjg2MGIuIDA6Tm9ybWFsQUNLICAxOk5vIEFDSworICAgIFVTSE9SVCAgICAgIE1USUQ6MTsJCS8vRVdDIFYxLjI0CisgICAgVVNIT1JUICAgICAgQ29tcHJlc3NlZDoxOworICAgIFVTSE9SVCAgICAgIFJzdjo5OworICAgIFVTSE9SVCAgICAgIFRJRDo0OworI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCit9IEJBX0NPTlRST0wsICpQQkFfQ09OVFJPTDsKKworLy8gMi1ieXRlIEJBUiBDT05UUk9MIGZpZWxkIGluIEJBUiBmcmFtZQordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgICAgVVNIT1JUICAgICAgVElEOjQ7CisgICAgVVNIT1JUICAgICAgUnN2MTo5OworICAgIFVTSE9SVCAgICAgIENvbXByZXNzZWQ6MTsKKyAgICBVU0hPUlQgICAgICBNVElEOjE7CQkvL2lmIHRoaXMgYml0MSwgdXNlICBGUkFNRV9NVEJBX1JFUSwgIGlmIDAsIHVzZSBGUkFNRV9CQV9SRVEKKyAgICBVU0hPUlQgICAgICBBQ0tQb2xpY3k6MTsKKyNlbHNlCisgICAgVVNIT1JUICAgICAgQUNLUG9saWN5OjE7IC8vIDA6bm9ybWFsIGFjaywgIDE6bm8gYWNrLgorICAgIFVTSE9SVCAgICAgIE1USUQ6MTsJCS8vaWYgdGhpcyBiaXQxLCB1c2UgIEZSQU1FX01UQkFfUkVRLCAgaWYgMCwgdXNlIEZSQU1FX0JBX1JFUQorICAgIFVTSE9SVCAgICAgIENvbXByZXNzZWQ6MTsKKyAgICBVU0hPUlQgICAgICBSc3YxOjk7CisgICAgVVNIT1JUICAgICAgVElEOjQ7CisjZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KK30gQkFSX0NPTlRST0wsICpQQkFSX0NPTlRST0w7CisKKy8vIEJBUkNvbnRyb2wgaW4gTVRCQVIgZnJhbWUKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorICAgIFVTSE9SVCAgICAgIE51bVRJRDo0OworICAgIFVTSE9SVCAgICAgIFJzdjE6OTsKKyAgICBVU0hPUlQgICAgICBDb21wcmVzc2VkOjE7CisgICAgVVNIT1JUICAgICAgTVRJRDoxOworICAgIFVTSE9SVCAgICAgIEFDS1BvbGljeToxOworI2Vsc2UKKyAgICBVU0hPUlQgICAgICBBQ0tQb2xpY3k6MTsKKyAgICBVU0hPUlQgICAgICBNVElEOjE7CisgICAgVVNIT1JUICAgICAgQ29tcHJlc3NlZDoxOworICAgIFVTSE9SVCAgICAgIFJzdjE6OTsKKyAgICBVU0hPUlQgICAgICBOdW1USUQ6NDsKKyNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLworfSBNVEJBUl9DT05UUk9MLCAqUE1UQkFSX0NPTlRST0w7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorICAgIFVTSE9SVCAgICAgIFRJRDo0OworICAgIFVTSE9SVCAgICAgIFJzdjE6MTI7CisjZWxzZQorICAgIFVTSE9SVCAgICAgIFJzdjE6MTI7CisgICAgVVNIT1JUICAgICAgVElEOjQ7CisjZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KK30gUEVSX1RJRF9JTkZPLCAqUFBFUl9USURfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgeworCVBFUl9USURfSU5GTyAgICAgIFBlclRJRDsKKwlCQVNFUV9DT05UUk9MIAkgQkFTdGFydGluZ1NlcTsKK30gRUFDSF9USUQsICpQRUFDSF9USUQ7CisKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9QU1BPTExfRlJBTUUgeworICAgIEZSQU1FX0NPTlRST0wgICBGQzsKKyAgICBVU0hPUlQgICAgICAgICAgQWlkOworICAgIFVDSEFSICAgICAgICAgICBCc3NpZFtNQUNfQUREUl9MRU5dOworICAgIFVDSEFSICAgICAgICAgICBUYVtNQUNfQUREUl9MRU5dOworfSAgIFBTUE9MTF9GUkFNRSwgKlBQU1BPTExfRlJBTUU7CisKK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCBfUlRTX0ZSQU1FCXsKKyAgICBGUkFNRV9DT05UUk9MICAgRkM7CisgICAgVVNIT1JUICAgICAgICAgIER1cmF0aW9uOworICAgIFVDSEFSICAgICAgICAgICBBZGRyMVtNQUNfQUREUl9MRU5dOworICAgIFVDSEFSICAgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworfVJUU19GUkFNRSwgKlBSVFNfRlJBTUU7CisKKy8vIEJBUkVRIEFORCBNVEJBUkVRIGhhdmUgdGhlIHNhbWUgc3VidHlwZSBCQVIsIDgwMi4xMW4gQkFSIHVzZSBjb21wcmVzc2VkIGJpdG1hcC4KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfQkFfUkVRIHsKKwlGUkFNRV9DT05UUk9MICAgRkM7CisJVVNIT1JUICAgICAgICAgIER1cmF0aW9uOworCVVDSEFSICAgICAgICAgICBBZGRyMVtNQUNfQUREUl9MRU5dOworCVVDSEFSICAgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworCUJBUl9DT05UUk9MICBCQVJDb250cm9sOworCUJBU0VRX0NPTlRST0wgCSBCQVN0YXJ0aW5nU2VxOworfSAgIEZSQU1FX0JBX1JFUSwgKlBGUkFNRV9CQV9SRVE7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfTVRCQV9SRVEgeworCUZSQU1FX0NPTlRST0wgICBGQzsKKwlVU0hPUlQgICAgICAgICAgRHVyYXRpb247CisJVUNIQVIgICAgICAgICAgIEFkZHIxW01BQ19BRERSX0xFTl07CisJVUNIQVIgICAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07CisJTVRCQVJfQ09OVFJPTCAgTVRCQVJDb250cm9sOworCVBFUl9USURfSU5GTwlQZXJUSURJbmZvOworCUJBU0VRX0NPTlRST0wgCSBCQVN0YXJ0aW5nU2VxOworfSAgIEZSQU1FX01UQkFfUkVRLCAqUEZSQU1FX01UQkFfUkVROworCisvLyBDb21wcmVzc2VkIGZvcm1hdCBpcyBtYW5kYW50b3J5IGluIEhUIFNUQQordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9NVEJBIHsKKwlGUkFNRV9DT05UUk9MICAgRkM7CisJVVNIT1JUICAgICAgICAgIER1cmF0aW9uOworCVVDSEFSICAgICAgICAgICBBZGRyMVtNQUNfQUREUl9MRU5dOworCVVDSEFSICAgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworCUJBX0NPTlRST0wgIEJBQ29udHJvbDsKKwlCQVNFUV9DT05UUk9MIAkgQkFTdGFydGluZ1NlcTsKKwlVQ0hBUgkJQml0TWFwWzhdOworfSAgIEZSQU1FX01UQkEsICpQRlJBTUVfTVRCQTsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9QU01QX0FDVElPTiB7CisJSEVBREVSXzgwMl8xMSAgIEhkcjsKKwlVQ0hBUglDYXRlZ29yeTsKKwlVQ0hBUglBY3Rpb247CisJVUNIQVIJUHNtcDsJLy8gNy4zLjEuMjUKK30gICBGUkFNRV9QU01QX0FDVElPTiwgKlBGUkFNRV9QU01QX0FDVElPTjsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9BQ1RJT05fSERSIHsKKwlIRUFERVJfODAyXzExICAgSGRyOworCVVDSEFSCUNhdGVnb3J5OworCVVDSEFSCUFjdGlvbjsKK30gICBGUkFNRV9BQ1RJT05fSERSLCAqUEZSQU1FX0FDVElPTl9IRFI7CisKKy8vQWN0aW9uIEZyYW1lCisvL0FjdGlvbiBGcmFtZSAgQ2F0ZWdvcnk6U3BlY3RydW0sICBBY3Rpb246Q2hhbm5lbCBTd2l0Y2guIDcuMy4yLjIwCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0NIQU5fU1dJVENIX0FOTk9VTkNFIHsKKwlVQ0hBUgkJCQkJRWxlbWVudElEOwkvLyBJRCA9IElFX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVCA9IDM3CisJVUNIQVIJCQkJCUxlbjsKKwlDSEFfU1dJVENIX0FOTk9VTkNFX0lFCUNTQW5ub3VuY2VJZTsKK30gICBDSEFOX1NXSVRDSF9BTk5PVU5DRSwgKlBDSEFOX1NXSVRDSF9BTk5PVU5DRTsKKworCisvLzgwMi4xMW4gOiA3LjMuMi4yMGEKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfU0VDT05EX0NIQU5fT0ZGU0VUIHsKKwlVQ0hBUgkJCQlFbGVtZW50SUQ7CQkvLyBJRCA9IElFX1NFQ09OREFSWV9DSF9PRkZTRVQgPSA2MgorCVVDSEFSCQkJCUxlbjsKKwlTRUNfQ0hBX09GRlNFVF9JRQlTZWNDaE9mZnNldEllOworfSAgIFNFQ09ORF9DSEFOX09GRlNFVCwgKlBTRUNPTkRfQ0hBTl9PRkZTRVQ7CisKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9TUEVUUlVNX0NTIHsKKwlIRUFERVJfODAyXzExICAgSGRyOworCVVDSEFSCUNhdGVnb3J5OworCVVDSEFSCUFjdGlvbjsKKwlDSEFOX1NXSVRDSF9BTk5PVU5DRQlDU0Fubm91bmNlOworCVNFQ09ORF9DSEFOX09GRlNFVAkJU2Vjb25kQ2hhbm5lbDsKK30gICBGUkFNRV9TUEVUUlVNX0NTLCAqUEZSQU1FX1NQRVRSVU1fQ1M7CisKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9BRERCQV9SRVEgeworCUhFQURFUl84MDJfMTEgICBIZHI7CisJVUNIQVIJQ2F0ZWdvcnk7CisJVUNIQVIJQWN0aW9uOworCVVDSEFSCVRva2VuOwkvLyAxCisJQkFfUEFSTQkJQmFQYXJtOwkgICAgICAvLyAgMiAtIDEwCisJVVNIT1JUCQlUaW1lT3V0VmFsdWU7CS8vIDAgLSAwCisJQkFTRVFfQ09OVFJPTAlCYVN0YXJ0U2VxOyAvLyAwLTAKK30gICBGUkFNRV9BRERCQV9SRVEsICpQRlJBTUVfQUREQkFfUkVROworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX0FEREJBX1JTUCB7CisJSEVBREVSXzgwMl8xMSAgIEhkcjsKKwlVQ0hBUglDYXRlZ29yeTsKKwlVQ0hBUglBY3Rpb247CisJVUNIQVIJVG9rZW47CisJVVNIT1JUCVN0YXR1c0NvZGU7CisJQkFfUEFSTQkJQmFQYXJtOyAvLzAgLSAyCisJVVNIT1JUCQlUaW1lT3V0VmFsdWU7Cit9ICAgRlJBTUVfQUREQkFfUlNQLCAqUEZSQU1FX0FEREJBX1JTUDsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9ERUxCQV9SRVEgeworCUhFQURFUl84MDJfMTEgICBIZHI7CisJVUNIQVIJQ2F0ZWdvcnk7CisJVUNIQVIJQWN0aW9uOworCURFTEJBX1BBUk0JCURlbGJhUGFybTsKKwlVU0hPUlQJUmVhc29uQ29kZTsKK30gICBGUkFNRV9ERUxCQV9SRVEsICpQRlJBTUVfREVMQkFfUkVROworCisKKy8vNy4yLjEuNwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9CQVIgeworCUZSQU1FX0NPTlRST0wgICBGQzsKKwlVU0hPUlQgICAgICAgICAgRHVyYXRpb247CisJVUNIQVIgICAgICAgICAgIEFkZHIxW01BQ19BRERSX0xFTl07CisJVUNIQVIgICAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07CisJQkFSX0NPTlRST0wJCUJhckNvbnRyb2w7CisJQkFTRVFfQ09OVFJPTAlTdGFydGluZ1NlcTsKK30gICBGUkFNRV9CQVIsICpQRlJBTUVfQkFSOworCisvLzcuMi4xLjcKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfQkEgeworCUZSQU1FX0NPTlRST0wgICBGQzsKKwlVU0hPUlQgICAgICAgICAgRHVyYXRpb247CisJVUNIQVIgICAgICAgICAgIEFkZHIxW01BQ19BRERSX0xFTl07CisJVUNIQVIgICAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07CisJQkFSX0NPTlRST0wJCUJhckNvbnRyb2w7CisJQkFTRVFfQ09OVFJPTAlTdGFydGluZ1NlcTsKKwlVQ0hBUgkJYml0bWFza1s4XTsKK30gICBGUkFNRV9CQSwgKlBGUkFNRV9CQTsKKworCisvLyBSYWRpbyBNZWFzdWVtZW50IFJlcXVlc3QgRnJhbWUgRm9ybWF0Cit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX1JNX1JFUV9BQ1RJT04geworCUhFQURFUl84MDJfMTEgICBIZHI7CisJVUNIQVIJQ2F0ZWdvcnk7CisJVUNIQVIJQWN0aW9uOworCVVDSEFSCVRva2VuOworCVVTSE9SVAlSZXBldGl0aW9uOworCVVDSEFSICAgZGF0YVswXTsKK30gICBGUkFNRV9STV9SRVFfQUNUSU9OLCAqUEZSQU1FX1JNX1JFUV9BQ1RJT047CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCB7CisJVUNIQVIJCUlEOworCVVDSEFSCQlMZW5ndGg7CisJVUNIQVIJCUNoYW5uZWxTd2l0Y2hNb2RlOworCVVDSEFSCQlOZXdSZWdDbGFzczsKKwlVQ0hBUgkJTmV3Q2hhbm5lbE51bTsKKwlVQ0hBUgkJQ2hhbm5lbFN3aXRjaENvdW50OworfSBIVF9FWFRfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UX0lFLCAqUEhUX0VYVF9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlRfSUU7CisKKworLy8KKy8vIF9MaW1pdCBtdXN0IGJlIHRoZSAyKipuIC0gMQorLy8gX1NFUTEgLCBfU0VRMiBtdXN0IGJlIHdpdGhpbiAwIH4gX0xpbWl0CisvLworI2RlZmluZSBTRVFfU1RFUE9ORShfU0VRMSwgX1NFUTIsIF9MaW1pdCkJKChfU0VRMSA9PSAoKF9TRVEyKzEpICYgX0xpbWl0KSkpCisjZGVmaW5lIFNFUV9TTUFMTEVSKF9TRVExLCBfU0VRMiwgX0xpbWl0KQkoKChfU0VRMS1fU0VRMikgJiAoKF9MaW1pdCsxKT4+MSkpKQorI2RlZmluZSBTRVFfTEFSR0VSKF9TRVExLCBfU0VRMiwgX0xpbWl0KQkoKF9TRVExICE9IF9TRVEyKSAmJiAhKCgoX1NFUTEtX1NFUTIpICYgKChfTGltaXQrMSk+PjEpKSkpCisjZGVmaW5lIFNFUV9XSVRISU5fV0lOKF9TRVExLCBfU0VRMiwgX1dJTiwgX0xpbWl0KSAoU0VRX0xBUkdFUihfU0VRMSwgX1NFUTIsIF9MaW1pdCkgJiYgIFwKKwkJCQkJCQkJCQkJCVNFUV9TTUFMTEVSKF9TRVExLCAoKF9TRVEyK19XSU4rMSkmX0xpbWl0KSwgX0xpbWl0KSkKKworLy8KKy8vIENvbnRlbnRpb24tZnJlZSBwYXJhbWV0ZXIgKHdpdGhvdXQgSUQgYW5kIExlbmd0aCkKKy8vCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworICAgIEJPT0xFQU4gICAgIGJWYWxpZDsgICAgICAgICAvLyAxOiB2YXJpYWJsZSBjb250YWlucyB2YWxpZCB2YWx1ZQorICAgIFVDSEFSICAgICAgIENmcENvdW50OworICAgIFVDSEFSICAgICAgIENmcFBlcmlvZDsKKyAgICBVU0hPUlQgICAgICBDZnBNYXhEdXJhdGlvbjsKKyAgICBVU0hPUlQgICAgICBDZnBEdXJSZW1haW5pbmc7Cit9IENGX1BBUk0sICpQQ0ZfUEFSTTsKKwordHlwZWRlZglzdHJ1Y3QJX0NJUEhFUl9TVUlURQl7CisJTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJUGFpckNpcGhlcjsJCS8vIFVuaWNhc3QgY2lwaGVyIDEsIHRoaXMgb25lIGhhcyBtb3JlIHNlY3VyZWQgY2lwaGVyIHN1aXRlCisJTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJUGFpckNpcGhlckF1eDsJLy8gVW5pY2FzdCBjaXBoZXIgMiBpZiBBUCBhbm5vdW5jZSB0d28gdW5pY2FzdCBjaXBoZXIgc3VpdGUKKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwlHcm91cENpcGhlcjsJLy8gR3JvdXAgY2lwaGVyCisJVVNIT1JUCQkJCQkJCVJzbkNhcGFiaWxpdHk7CS8vIFJTTiBjYXBhYmlsaXR5IGZyb20gYmVhY29uCisJQk9PTEVBTgkJCQkJCQliTWl4TW9kZTsJCS8vIEluZGljYXRlIFBhaXIgJiBHcm91cCBjaXBoZXIgbWlnaHQgYmUgZGlmZmVyZW50Cit9CUNJUEhFUl9TVUlURSwgKlBDSVBIRVJfU1VJVEU7CisKKy8vIEVEQ0EgY29uZmlndXJhdGlvbiBmcm9tIEFQJ3MgQkVBQ09OL1Byb2JlUnNwCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQk9PTEVBTiAgICAgYlZhbGlkOyAgICAgICAgIC8vIDE6IHZhcmlhYmxlIGNvbnRhaW5zIHZhbGlkIHZhbHVlCisgICAgQk9PTEVBTiAgICAgYkFkZDsgICAgICAgICAvLyAxOiB2YXJpYWJsZSBjb250YWlucyB2YWxpZCB2YWx1ZQorICAgIEJPT0xFQU4gICAgIGJRQWNrOworICAgIEJPT0xFQU4gICAgIGJRdWV1ZVJlcXVlc3Q7CisgICAgQk9PTEVBTiAgICAgYlR4b3BSZXF1ZXN0OworICAgIEJPT0xFQU4gICAgIGJBUFNEQ2FwYWJsZTsKKy8vICBCT09MRUFOICAgICBiTW9yZURhdGFBY2s7CisgICAgVUNIQVIgICAgICAgRWRjYVVwZGF0ZUNvdW50OworICAgIFVDSEFSICAgICAgIEFpZnNuWzRdOyAgICAgICAvLyAwOkFDX0JLLCAxOkFDX0JFLCAyOkFDX1ZJLCAzOkFDX1ZPCisgICAgVUNIQVIgICAgICAgQ3dtaW5bNF07CisgICAgVUNIQVIgICAgICAgQ3dtYXhbNF07CisgICAgVVNIT1JUICAgICAgVHhvcFs0XTsgICAgICAvLyBpbiB1bml0IG9mIDMyLXVzCisgICAgQk9PTEVBTiAgICAgYkFDTVs0XTsgICAgICAvLyAxOiBBZG1pc3Npb24gQ29udHJvbCBvZiBBQ19CSyBpcyBtYW5kYXR0b3J5Cit9IEVEQ0FfUEFSTSwgKlBFRENBX1BBUk07CisKKy8vIFFCU1MgTE9BRCBpbmZvcm1hdGlvbiBmcm9tIFFBUCdzIEJFQUNPTi9Qcm9iZVJzcAordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJPT0xFQU4gICAgIGJWYWxpZDsgICAgICAgICAgICAgICAgICAgICAvLyAxOiB2YXJpYWJsZSBjb250YWlucyB2YWxpZCB2YWx1ZQorICAgIFVTSE9SVCAgICAgIFN0YU51bTsKKyAgICBVQ0hBUiAgICAgICBDaGFubmVsVXRpbGl6YXRpb247CisgICAgVVNIT1JUICAgICAgUmVtYWluaW5nQWRtaXNzaW9uQ29udHJvbDsgIC8vIGluIHVuaXQgb2YgMzItdXMKK30gUUJTU19MT0FEX1BBUk0sICpQUUJTU19MT0FEX1BBUk07CisKKy8vIFFCU1MgSW5mbyBmaWVsZCBpbiBRU1RBJ3MgYXNzb2MgcmVxCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVQ0hBUgkJUnN2MjoxOworCVVDSEFSCQlNYXhTUExlbmd0aDoyOworCVVDSEFSCQlSc3YxOjE7CisJVUNIQVIJCVVBUFNEX0FDX0JFOjE7CisJVUNIQVIJCVVBUFNEX0FDX0JLOjE7CisJVUNIQVIJCVVBUFNEX0FDX1ZJOjE7CisJVUNIQVIJCVVBUFNEX0FDX1ZPOjE7CisjZWxzZQorICAgIFVDSEFSCQlVQVBTRF9BQ19WTzoxOworCVVDSEFSCQlVQVBTRF9BQ19WSToxOworCVVDSEFSCQlVQVBTRF9BQ19CSzoxOworCVVDSEFSCQlVQVBTRF9BQ19CRToxOworCVVDSEFSCQlSc3YxOjE7CisJVUNIQVIJCU1heFNQTGVuZ3RoOjI7CisJVUNIQVIJCVJzdjI6MTsKKyNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLworfSBRQlNTX1NUQV9JTkZPX1BBUk0sICpQUUJTU19TVEFfSU5GT19QQVJNOworCisvLyBRQlNTIEluZm8gZmllbGQgaW4gUUFQJ3MgQmVhY29uL1Byb2JlUnNwCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlVQ0hBUgkJVUFQU0Q6MTsKKwlVQ0hBUgkJUnN2OjM7CisgICAgVUNIQVIJCVBhcmFtU2V0Q291bnQ6NDsKKyNlbHNlCisgICAgVUNIQVIJCVBhcmFtU2V0Q291bnQ6NDsKKwlVQ0hBUgkJUnN2OjM7CisJVUNIQVIJCVVBUFNEOjE7CisjZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KK30gUUJTU19BUF9JTkZPX1BBUk0sICpQUUJTU19BUF9JTkZPX1BBUk07CisKKy8vIFFPUyBDYXBhYmlsaXR5IHJlcG9ydGVkIGluIFFBUCdzIEJFQUNPTi9Qcm9iZVJzcAorLy8gUU9TIENhcGFiaWxpdHkgc2VudCBvdXQgaW4gUVNUQSdzIEFzc29jaWF0ZVJlcS9SZUFzc29jaWF0ZVJlcQordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJPT0xFQU4gICAgIGJWYWxpZDsgICAgICAgICAgICAgICAgICAgICAvLyAxOiB2YXJpYWJsZSBjb250YWlucyB2YWxpZCB2YWx1ZQorICAgIEJPT0xFQU4gICAgIGJRQWNrOworICAgIEJPT0xFQU4gICAgIGJRdWV1ZVJlcXVlc3Q7CisgICAgQk9PTEVBTiAgICAgYlR4b3BSZXF1ZXN0OworLy8gIEJPT0xFQU4gICAgIGJNb3JlRGF0YUFjazsKKyAgICBVQ0hBUiAgICAgICBFZGNhVXBkYXRlQ291bnQ7Cit9IFFPU19DQVBBQklMSVRZX1BBUk0sICpQUU9TX0NBUEFCSUxJVFlfUEFSTTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVDSEFSICAgICAgIElFTGVuOworICAgIFVDSEFSICAgICAgIElFW01BWF9DVVNUT01fTEVOXTsKK30gV1BBX0lFXzsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUNIQVIgICBCc3NpZFtNQUNfQUREUl9MRU5dOworICAgIFVDSEFSICAgQ2hhbm5lbDsKKwlVQ0hBUiAgIENlbnRyYWxDaGFubmVsOwkvL1N0b3JlIHRoZSB3aWRlLWJhbmQgY2VudHJhbCBjaGFubmVsIGZvciA0ME1Iei4gIC51c2VkIGluIDQwTUh6IEFQLiBPciB0aGlzIGlzIHRoZSBzYW1lIGFzIENoYW5uZWwuCisgICAgVUNIQVIgICBCc3NUeXBlOworICAgIFVTSE9SVCAgQXRpbVdpbjsKKyAgICBVU0hPUlQgIEJlYWNvblBlcmlvZDsKKworICAgIFVDSEFSICAgU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisgICAgVUNIQVIgICBTdXBSYXRlTGVuOworICAgIFVDSEFSICAgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisgICAgVUNIQVIgICBFeHRSYXRlTGVuOworCUhUX0NBUEFCSUxJVFlfSUUgSHRDYXBhYmlsaXR5OworCVVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuOworCUFERF9IVF9JTkZPX0lFIEFkZEh0SW5mbzsJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCisJVUNIQVIJCQlBZGRIdEluZm9MZW47CisJVUNIQVIJCQlOZXdFeHRDaGFuT2Zmc2V0OworCUNIQVIgICAgUnNzaTsKKyAgICBVQ0hBUiAgIFByaXZhY3k7CQkJLy8gSW5kaWNhdGUgc2VjdXJpdHkgZnVuY3Rpb24gT04vT0ZGLiBEb24ndCBtZXNzIHVwIHdpdGggYXV0aCBtb2RlLgorCVVDSEFSCUhpZGRlbjsKKworICAgIFVTSE9SVCAgRHRpbVBlcmlvZDsKKyAgICBVU0hPUlQgIENhcGFiaWxpdHlJbmZvOworCisgICAgVVNIT1JUICBDZnBDb3VudDsKKyAgICBVU0hPUlQgIENmcFBlcmlvZDsKKyAgICBVU0hPUlQgIENmcE1heER1cmF0aW9uOworICAgIFVTSE9SVCAgQ2ZwRHVyUmVtYWluaW5nOworICAgIFVDSEFSICAgU3NpZExlbjsKKyAgICBDSEFSICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKKworICAgIFVMT05HICAgTGFzdEJlYWNvblJ4VGltZTsgLy8gT1MncyB0aW1lc3RhbXAKKworCUJPT0xFQU4JYlNFUzsKKworCS8vIE5ldyBmb3IgV1BBMgorCUNJUEhFUl9TVUlURQkJCQkJV1BBOwkJCS8vIEFQIGFubm91bmNlZCBXUEEgY2lwaGVyIHN1aXRlCisJQ0lQSEVSX1NVSVRFCQkJCQlXUEEyOwkJCS8vIEFQIGFubm91bmNlZCBXUEEyIGNpcGhlciBzdWl0ZQorCisJLy8gTmV3IGZvciBtaWNyb3NvZnQgV1BBIHN1cHBvcnQKKwlORElTXzgwMl8xMV9GSVhFRF9JRXMJRml4SUVzOworCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUJQXV0aE1vZGVBdXg7CS8vIEFkZGl0aW9uIG1vZGUgZm9yIFdQQTIgLyBXUEEgY2FwYWJsZSBBUAorCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUJQXV0aE1vZGU7CisJTkRJU184MDJfMTFfV0VQX1NUQVRVUwlXZXBTdGF0dXM7CQkJCS8vIFVuaWNhc3QgRW5jcnlwdGlvbiBBbGdvcml0aG0gZXh0cmFjdCBmcm9tIFZBUl9JRQorCVVTSE9SVAkJCQkJVmFySUVMZW47CQkJCS8vIExlbmd0aCBvZiBuZXh0IFZJRSBpbmNsdWRlIEVJRCAmIExlbmd0aAorCVVDSEFSCQkJCQlWYXJJRXNbTUFYX1ZJRV9MRU5dOworCisJLy8gQ0NYIENraXAgaW5mb3JtYXRpb24KKyAgICBVQ0hBUiAgIENraXBGbGFnOworCisJLy8gQ0NYIDIgVFNGCisJVUNIQVIJUFRTRls0XTsJCS8vIFBhcmVudCBUU0YKKwlVQ0hBUglUVFNGWzhdOwkJLy8gVGFyZ2V0IFRTRgorCisgICAgLy8gODAyLjExZSBkOSwgYW5kIFdNTQorCUVEQ0FfUEFSTSAgICAgICAgICAgRWRjYVBhcm07CisJUU9TX0NBUEFCSUxJVFlfUEFSTSBRb3NDYXBhYmlsaXR5OworCVFCU1NfTE9BRF9QQVJNICAgICAgUWJzc0xvYWQ7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisgICAgV1BBX0lFXyAgICAgV3BhSUU7CisgICAgV1BBX0lFXyAgICAgUnNuSUU7CisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCVVDSEFSCQlDb3VudHJ5U3RyaW5nWzNdOworCUJPT0xFQU4JCWJIYXNDb3VudHJ5SUU7CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworfSBCU1NfRU5UUlksICpQQlNTX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUNIQVIgICAgICAgICAgIEJzc05yOworICAgIFVDSEFSICAgICAgICAgICBCc3NPdmVybGFwTnI7CisgICAgQlNTX0VOVFJZICAgICAgIEJzc0VudHJ5W01BWF9MRU5fT0ZfQlNTX1RBQkxFXTsKK30gQlNTX1RBQkxFLCAqUEJTU19UQUJMRTsKKworCit0eXBlZGVmIHN0cnVjdCBfTUxNRV9RVUVVRV9FTEVNIHsKKyAgICBVTE9ORyAgICAgICAgICAgICBNYWNoaW5lOworICAgIFVMT05HICAgICAgICAgICAgIE1zZ1R5cGU7CisgICAgVUxPTkcgICAgICAgICAgICAgTXNnTGVuOworICAgIFVDSEFSICAgICAgICAgICAgIE1zZ1tNR01UX0RNQV9CVUZGRVJfU0laRV07CisgICAgTEFSR0VfSU5URUdFUiAgICAgVGltZVN0YW1wOworICAgIFVDSEFSICAgICAgICAgICAgIFJzc2kwOworICAgIFVDSEFSICAgICAgICAgICAgIFJzc2kxOworICAgIFVDSEFSICAgICAgICAgICAgIFJzc2kyOworICAgIFVDSEFSICAgICAgICAgICAgIFNpZ25hbDsKKyAgICBVQ0hBUiAgICAgICAgICAgICBDaGFubmVsOworICAgIFVDSEFSICAgICAgICAgICAgIFdjaWQ7CisgICAgQk9PTEVBTiAgICAgICAgICAgT2NjdXBpZWQ7Cit9IE1MTUVfUVVFVUVfRUxFTSwgKlBNTE1FX1FVRVVFX0VMRU07CisKK3R5cGVkZWYgc3RydWN0IF9NTE1FX1FVRVVFIHsKKyAgICBVTE9ORyAgICAgICAgICAgICBOdW07CisgICAgVUxPTkcgICAgICAgICAgICAgSGVhZDsKKyAgICBVTE9ORyAgICAgICAgICAgICBUYWlsOworICAgIE5ESVNfU1BJTl9MT0NLICAgTG9jazsKKyAgICBNTE1FX1FVRVVFX0VMRU0gIEVudHJ5W01BWF9MRU5fT0ZfTUxNRV9RVUVVRV07Cit9IE1MTUVfUVVFVUUsICpQTUxNRV9RVUVVRTsKKwordHlwZWRlZiBWT0lEICgqU1RBVEVfTUFDSElORV9GVU5DKShWT0lEICpBZGFwdG9yLCBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCit0eXBlZGVmIHN0cnVjdCBfU1RBVEVfTUFDSElORSB7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJTdGF0ZTsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yTXNnOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyclN0YXRlOworICAgIFNUQVRFX01BQ0hJTkVfRlVOQyAgICAgICAgICAgICAqVHJhbnNGdW5jOworfSBTVEFURV9NQUNISU5FLCAqUFNUQVRFX01BQ0hJTkU7CisKKworLy8gTUxNRSBBVVggZGF0YSBzdHJ1Y3R1cmUgdGhhdCBob2xkIHRlbXBvcmFybGl5IHNldHRpbmdzIGR1cmluZyBhIGNvbm5lY3Rpb24gYXR0ZW1wdC4KKy8vIE9uY2UgdGhpcyBhdHRlbXAgc3VjY2VlZHMsIGFsbCBzZXR0aW5ncyB3aWxsIGJlIGNvcHkgdG8gcEFkLT5TdGFBY3RpdmUuCisvLyBBIGNvbm5lY3Rpb24gYXR0ZW1wdCAodXNlciBzZXQgT0lELCByb2FtaW5nLCBDQ1ggZmFzdCByb2FtaW5nLC4uKSBjb25zaXN0cyBvZgorLy8gc2V2ZXJhbCBzdGVwcyAoSk9JTiwgQVVUSCwgQVNTT0Mgb3IgUkVBU1NPQykgYW5kIG1heSBmYWlsIGF0IGFueSBzdGVwLiBXZSBwdXJwb3NlbHkKKy8vIHNlcGFyYXRlIHRoaXMgdW5kZXItdHJpYWwgc2V0dGluZ3MgYXdheSBmcm9tIHBBZC0+U3RhQWN0aXZlIHNvIHRoYXQgb25jZQorLy8gdGhpcyBuZXcgYXR0ZW1wdCBmYWlsZWQsIGRyaXZlciBjYW4gYXV0by1yZWNvdmVyIGJhY2sgdG8gdGhlIGFjdGl2ZSBzZXR0aW5ncy4KK3R5cGVkZWYgc3RydWN0IF9NTE1FX0FVWCB7CisgICAgVUNIQVIgICAgICAgICAgICAgICBCc3NUeXBlOworICAgIFVDSEFSICAgICAgICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOworICAgIFVDSEFSICAgICAgICAgICAgICAgU3NpZExlbjsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIEJzc2lkW01BQ19BRERSX0xFTl07CisJVUNIQVIJCQkJQXV0b1JlY29ubmVjdFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKKwlVQ0hBUgkJCQlBdXRvUmVjb25uZWN0U3NpZExlbjsKKyAgICBVU0hPUlQgICAgICAgICAgICAgIEFsZzsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIFNjYW5UeXBlOworICAgIFVDSEFSICAgICAgICAgICAgICAgQ2hhbm5lbDsKKwlVQ0hBUiAgICAgICAgICAgICAgIENlbnRyYWxDaGFubmVsOworICAgIFVTSE9SVCAgICAgICAgICAgICAgQWlkOworICAgIFVTSE9SVCAgICAgICAgICAgICAgQ2FwYWJpbGl0eUluZm87CisgICAgVVNIT1JUICAgICAgICAgICAgICBCZWFjb25QZXJpb2Q7CisgICAgVVNIT1JUICAgICAgICAgICAgICBDZnBNYXhEdXJhdGlvbjsKKyAgICBVU0hPUlQgICAgICAgICAgICAgIENmcFBlcmlvZDsKKyAgICBVU0hPUlQgICAgICAgICAgICAgIEF0aW1XaW47CisKKwkvLyBDb3B5IHN1cHBvcnRlZCByYXRlIGZyb20gZGVzaXJlZCBBUCdzIGJlYWNvbi4gV2UgYXJlIHRyeWluZyB0byBtYXRjaAorCS8vIEFQJ3Mgc3VwcG9ydGVkIGFuZCBleHRlbmRlZCByYXRlIHNldHRpbmdzLgorCVVDSEFSCQkgICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSCQkgICAgICAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSCQkgICAgICAgIFN1cFJhdGVMZW47CisJVUNIQVIJCSAgICAgICAgRXh0UmF0ZUxlbjsKKwlIVF9DQVBBQklMSVRZX0lFCQlIdENhcGFiaWxpdHk7CisJVUNIQVIJCSAgICAgICAgCUh0Q2FwYWJpbGl0eUxlbjsKKwlBRERfSFRfSU5GT19JRQkJQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKwlVQ0hBUgkJCU5ld0V4dENoYW5uZWxPZmZzZXQ7CisJLy9SVF9IVF9DQVBBQklMSVRZCVN1cHBvcnRlZEh0UGh5OworCisgICAgLy8gbmV3IGZvciBRT1MKKyAgICBRT1NfQ0FQQUJJTElUWV9QQVJNIEFQUW9zQ2FwYWJpbGl0eTsgICAgLy8gUU9TIGNhcGFiaWxpdHkgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAorICAgIEVEQ0FfUEFSTSAgICAgICAgICAgQVBFZGNhUGFybTsgICAgICAgICAvLyBFRENBIHBhcmFtZXRlcnMgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAorICAgIFFCU1NfTE9BRF9QQVJNICAgICAgQVBRYnNzTG9hZDsgICAgICAgICAvLyBRQlNTIGxvYWQgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAorCisgICAgLy8gbmV3IHRvIGtlZXAgUmFsaW5rIHNwZWNpZmljIGZlYXR1cmUKKyAgICBVTE9ORyAgICAgICAgICAgICAgIEFQUmFsaW5rSWU7CisKKyAgICBCU1NfVEFCTEUgICAgICAgICAgIFNzaWRCc3NUYWI7ICAgICAvLyBBUCBsaXN0IGZvciB0aGUgc2FtZSBTU0lECisgICAgQlNTX1RBQkxFICAgICAgICAgICBSb2FtVGFiOyAgICAgICAgLy8gQVAgbGlzdCBlbGlnaWJsZSBmb3Igcm9hbWluZworICAgIFVMT05HICAgICAgICAgICAgICAgQnNzSWR4OworICAgIFVMT05HICAgICAgICAgICAgICAgUm9hbUlkeDsKKworCUJPT0xFQU4JCQkJQ3VyclJlcUlzRnJvbU5kaXM7CisKKyAgICBSQUxJTktfVElNRVJfU1RSVUNUIEJlYWNvblRpbWVyLCBTY2FuVGltZXI7CisgICAgUkFMSU5LX1RJTUVSX1NUUlVDVCBBdXRoVGltZXI7CisgICAgUkFMSU5LX1RJTUVSX1NUUlVDVCBBc3NvY1RpbWVyLCBSZWFzc29jVGltZXIsIERpc2Fzc29jVGltZXI7Cit9IE1MTUVfQVVYLCAqUE1MTUVfQVVYOworCit0eXBlZGVmIHN0cnVjdCBfTUxNRV9BRERCQV9SRVFfU1RSVUNUeworCVVDSEFSICAgV2NpZDsJLy8KKwlVQ0hBUiAgIHBBZGRyW01BQ19BRERSX0xFTl07CisJVUNIQVIgICBCYUJ1ZlNpemU7CisJVVNIT1JUCVRpbWVPdXRWYWx1ZTsKKwlVQ0hBUiAgIFRJRDsKKwlVQ0hBUiAgIFRva2VuOworCVVTSE9SVAlCYVN0YXJ0U2VxOworfSBNTE1FX0FEREJBX1JFUV9TVFJVQ1QsICpQTUxNRV9BRERCQV9SRVFfU1RSVUNUOworCisKK3R5cGVkZWYgc3RydWN0IF9NTE1FX0RFTEJBX1JFUV9TVFJVQ1R7CisJVUNIQVIgICBXY2lkOwkvLworCVVDSEFSICAgICBBZGRyW01BQ19BRERSX0xFTl07CisJVUNIQVIgICBUSUQ7CisJVUNIQVIJSW5pdGlhdG9yOworfSBNTE1FX0RFTEJBX1JFUV9TVFJVQ1QsICpQTUxNRV9ERUxCQV9SRVFfU1RSVUNUOworCisvLyBhc3NvYyBzdHJ1Y3QgaXMgZXF1YWwgdG8gcmVhc3NvYwordHlwZWRlZiBzdHJ1Y3QgX01MTUVfQVNTT0NfUkVRX1NUUlVDVHsKKyAgICBVQ0hBUiAgICAgQWRkcltNQUNfQUREUl9MRU5dOworICAgIFVTSE9SVCAgICBDYXBhYmlsaXR5SW5mbzsKKyAgICBVU0hPUlQgICAgTGlzdGVuSW50djsKKyAgICBVTE9ORyAgICAgVGltZW91dDsKK30gTUxNRV9BU1NPQ19SRVFfU1RSVUNULCAqUE1MTUVfQVNTT0NfUkVRX1NUUlVDVCwgTUxNRV9SRUFTU09DX1JFUV9TVFJVQ1QsICpQTUxNRV9SRUFTU09DX1JFUV9TVFJVQ1Q7CisKK3R5cGVkZWYgc3RydWN0IF9NTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1R7CisgICAgVUNIQVIgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKKyAgICBVU0hPUlQgICAgUmVhc29uOworfSBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QsICpQTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUOworCit0eXBlZGVmIHN0cnVjdCBfTUxNRV9BVVRIX1JFUV9TVFJVQ1QgeworICAgIFVDSEFSICAgICAgICBBZGRyW01BQ19BRERSX0xFTl07CisgICAgVVNIT1JUICAgICAgIEFsZzsKKyAgICBVTE9ORyAgICAgICAgVGltZW91dDsKK30gTUxNRV9BVVRIX1JFUV9TVFJVQ1QsICpQTUxNRV9BVVRIX1JFUV9TVFJVQ1Q7CisKK3R5cGVkZWYgc3RydWN0IF9NTE1FX0RFQVVUSF9SRVFfU1RSVUNUIHsKKyAgICBVQ0hBUiAgICAgICAgQWRkcltNQUNfQUREUl9MRU5dOworICAgIFVTSE9SVCAgICAgICBSZWFzb247Cit9IE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QsICpQTUxNRV9ERUFVVEhfUkVRX1NUUlVDVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVMT05HICAgICAgQnNzSWR4OworfSBNTE1FX0pPSU5fUkVRX1NUUlVDVDsKKwordHlwZWRlZiBzdHJ1Y3QgX01MTUVfU0NBTl9SRVFfU1RSVUNUIHsKKyAgICBVQ0hBUiAgICAgIEJzc2lkW01BQ19BRERSX0xFTl07CisgICAgVUNIQVIgICAgICBCc3NUeXBlOworICAgIFVDSEFSICAgICAgU2NhblR5cGU7CisgICAgVUNIQVIgICAgICBTc2lkTGVuOworICAgIENIQVIgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOworfSBNTE1FX1NDQU5fUkVRX1NUUlVDVCwgKlBNTE1FX1NDQU5fUkVRX1NUUlVDVDsKKwordHlwZWRlZiBzdHJ1Y3QgX01MTUVfU1RBUlRfUkVRX1NUUlVDVCB7CisgICAgQ0hBUiAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOworICAgIFVDSEFSICAgICAgIFNzaWRMZW47Cit9IE1MTUVfU1RBUlRfUkVRX1NUUlVDVCwgKlBNTE1FX1NUQVJUX1JFUV9TVFJVQ1Q7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKy8vIHN0cnVjdHVyZSBmb3IgRExTCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0RMUyB7CisJVVNIT1JUCQkJCQkJVGltZU91dDsJCS8vIFVzZSB0byB0aW1lIG91dCB3aGlsZSBzbGllbmNlLCB1bml0OiBzZWNvbmQgLCBzZXQgYnkgVUkKKwlVU0hPUlQJCQkJCQlDb3VudERvd25UaW1lcjsJLy8gVXNlIHRvIHRpbWUgb3V0IHdoaWxlIHNsaWVuY2UsdW5pdDogc2Vjb25kICwgdXNlZCBieSBkcml2ZXIgb25seQorCU5ESVNfODAyXzExX01BQ19BRERSRVNTCQlNYWNBZGRyOwkJLy8gc2V0IGJ5IFVJCisJVUNIQVIJCQkJCQlTdGF0dXM7CQkJLy8gMDogbm9uZSAsIDE6IHdhaXQgU1RBa2V5LCAyOiBmaW5pc2ggRExTIHNldHVwICwgc2V0IGJ5IGRyaXZlciBvbmx5CisJQk9PTEVBTgkJCQkJCVZhbGlkOwkJCS8vIDE6IHZhbGlkICwgMDogaW52YWxpZCAsIHNldCBieSBVSSwgdXNlIHRvIHNldHVwIG9yIHRlYXIgZG93biBETFMgbGluaworCVJBTElOS19USU1FUl9TVFJVQ1QJCQlUaW1lcjsJCQkvLyBVc2UgdG8gdGltZSBvdXQgd2hpbGUgaGFuZHNoYWtlCisJVVNIT1JUCQkJCQkJU2VxdWVuY2U7CisJVVNIT1JUCQkJCQkJTWFjVGFiTWF0Y2hXQ0lEOwkvLyBBU0lDCisJQk9PTEVBTgkJCQkJCWJIVENhcDsKKwlQVk9JRAkJCQkJCXBBZDsKK30gUlRfODAyXzExX0RMUywgKlBSVF84MDJfMTFfRExTOworCit0eXBlZGVmIHN0cnVjdCBfTUxNRV9ETFNfUkVRX1NUUlVDVCB7CisgICAgUFJUXzgwMl8xMV9ETFMJcERMUzsKKyAgICBVU0hPUlQJCQlSZWFzb247Cit9IE1MTUVfRExTX1JFUV9TVFJVQ1QsICpQTUxNRV9ETFNfUkVRX1NUUlVDVDsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKKyAgICBVQ0hBUiAgIEVpZDsKKyAgICBVQ0hBUiAgIExlbjsKKyAgICBDSEFSICAgT2N0ZXRbMV07Cit9IEVJRF9TVFJVQ1QsKlBFSURfU1RSVUNULCBCRUFDT05fRUlEX1NUUlVDVCwgKlBCRUFDT05fRUlEX1NUUlVDVDsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SVE1QX1RYX1JBVEVfU1dJVENICit7CisJVUNIQVIgICBJdGVtTm87CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCVJzdjI6MjsKKwlVQ0hBUglNb2RlOjI7CisJVUNIQVIJUnN2MToxOworCVVDSEFSCUJXOjE7CisJVUNIQVIJU2hvcnRHSToxOworCVVDSEFSCVNUQkM6MTsKKyNlbHNlCisJVUNIQVIJU1RCQzoxOworCVVDSEFSCVNob3J0R0k6MTsKKwlVQ0hBUglCVzoxOworCVVDSEFSCVJzdjE6MTsKKwlVQ0hBUglNb2RlOjI7CisJVUNIQVIJUnN2MjoyOworI2VuZGlmCisJVUNIQVIgICBDdXJyTUNTOworCVVDSEFSICAgVHJhaW5VcDsKKwlVQ0hBUiAgIFRyYWluRG93bjsKK30gUlJUTVBfVFhfUkFURV9TV0lUQ0gsICpQUlRNUF9UWF9SQVRFX1NXSVRDSDsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gQVAgbWxtZS5oID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgVEJUVF9QUkVMT0FEX1RJTUUgICAgICAgMzg0ICAgICAgICAvLyB1c2VjLiBMb21nUHJlYW1ibGUgKyAyNC1ieXRlIGF0IDFNYnBzCisjZGVmaW5lIERFRkFVTFRfRFRJTV9QRVJJT0QgICAgIDEKKworLy8gd2VpZ2h0aW5nIGZhY3RvciB0byBjYWxjdWxhdGUgQ2hhbm5lbCBxdWFsaXR5LCB0b3RhbCBzaG91bGQgYmUgMTAwJQorLy8jZGVmaW5lIFJTU0lfV0VJR0hUSU5HICAgICAgICAgICAgICAgICAgIDAKKy8vI2RlZmluZSBUWF9XRUlHSFRJTkcgICAgICAgICAgICAgICAgICAgICA0MAorLy8jZGVmaW5lIFJYX1dFSUdIVElORyAgICAgICAgICAgICAgICAgICAgIDYwCisKKyNkZWZpbmUgTUFDX1RBQkxFX0FHRU9VVF9USU1FCQkJMzAwCQkJLy8gdW5pdDogc2VjCisjZGVmaW5lIE1BQ19UQUJMRV9BU1NPQ19USU1FT1VUCQkJNQkJCS8vIHVuaXQ6IHNlYworI2RlZmluZSBNQUNfVEFCTEVfRlVMTChUYWIpCQkJCSgoVGFiKS5zaXplID09IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCisvLyBBUCBzaGFsbCBkcm9wIHRoZSBzdGEgaWYgY29udGluZSBUeCBmYWlsIGNvdW50IHJlYWNoIGl0LgorI2RlZmluZSBNQUNfRU5UUllfTElGRV9DSEVDS19DTlQJCTIwCQkJLy8gcGFja2V0IGNudC4KKworLy8gVmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+U3N0Cit0eXBlZGVmIGVudW0gX1NzdCB7CisgICAgU1NUX05PVF9BVVRILCAgIC8vIDA6IGVxdWl2YWxlbnQgdG8gSUVFRSA4MDIuMTEvMTk5OSBzdGF0ZSAxCisgICAgU1NUX0FVVEgsICAgICAgIC8vIDE6IGVxdWl2YWxlbnQgdG8gSUVFRSA4MDIuMTEvMTk5OSBzdGF0ZSAyCisgICAgU1NUX0FTU09DICAgICAgIC8vIDI6IGVxdWl2YWxlbnQgdG8gSUVFRSA4MDIuMTEvMTk5OSBzdGF0ZSAzCit9IFNTVDsKKworLy8gdmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+QXV0aFN0YXRlCit0eXBlZGVmIGVudW0gX0F1dGhTdGF0ZSB7CisgICAgQVNfTk9UX0FVVEgsCisgICAgQVNfQVVUSF9PUEVOLCAgICAgICAvLyBTVEEgaGFzIGJlZW4gYXV0aGVudGljYXRlZCB1c2luZyBPUEVOIFNZU1RFTQorICAgIEFTX0FVVEhfS0VZLCAgICAgICAgLy8gU1RBIGhhcyBiZWVuIGF1dGhlbnRpY2F0ZWQgdXNpbmcgU0hBUkVEIEtFWQorICAgIEFTX0FVVEhFTlRJQ0FUSU5HICAgLy8gU1RBIGlzIHdhaXRpbmcgZm9yIEFVVEggc2VxIzMgdXNpbmcgU0hBUkVEIEtFWQorfSBBVVRIX1NUQVRFOworCisvL2Zvci13cGEgdmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+V3BhU3RhdGUgIDgwMi4xaSBEMyAgIHAuMTE0Cit0eXBlZGVmIGVudW0gX0FwV3BhU3RhdGUgeworICAgIEFTX05PVFVTRSwgICAgICAgICAgICAgIC8vIDAKKyAgICBBU19ESVNDT05ORUNULCAgICAgICAgICAvLyAxCisgICAgQVNfRElTQ09OTkVDVEVELCAgICAgICAgLy8gMgorICAgIEFTX0lOSVRJQUxJWkUsICAgICAgICAgIC8vIDMKKyAgICBBU19BVVRIRU5USUNBVElPTiwgICAgICAvLyA0CisgICAgQVNfQVVUSEVOVElDQVRJT04yLCAgICAgLy8gNQorICAgIEFTX0lOSVRQTUssICAgICAgICAgICAgIC8vIDYKKyAgICBBU19JTklUUFNLLCAgICAgICAgICAgICAvLyA3CisgICAgQVNfUFRLU1RBUlQsICAgICAgICAgICAgLy8gOAorICAgIEFTX1BUS0lOSVRfTkVHT1RJQVRJTkcsIC8vIDkKKyAgICBBU19QVEtJTklURE9ORSwgICAgICAgICAvLyAxMAorICAgIEFTX1VQREFURUtFWVMsICAgICAgICAgIC8vIDExCisgICAgQVNfSU5URUdSSVRZX0ZBSUxVUkUsICAgLy8gMTIKKyAgICBBU19LRVlVUERBVEUsICAgICAgICAgICAvLyAxMworfSBBUF9XUEFfU1RBVEU7CisKKy8vIGZvci13cGEgdmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+V3BhU3RhdGUgIDgwMi4xaSBEMyAgIHAuMTE0Cit0eXBlZGVmIGVudW0gX0dUS1N0YXRlIHsKKyAgICBSRUtFWV9ORUdPVElBVElORywKKyAgICBSRUtFWV9FU1RBQkxJU0hFRCwKKyAgICBLRVlFUlJPUiwKK30gR1RLX1NUQVRFOworCisvLyAgZm9yLXdwYSAgdmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+V3BhU3RhdGUgIDgwMi4xaSBEMyAgIHAuMTE0Cit0eXBlZGVmIGVudW0gX1dwYUdUS1N0YXRlIHsKKyAgICBTRVRLRVlTLAorICAgIFNFVEtFWVNfRE9ORSwKK30gV1BBX0dUS19TVEFURTsKKy8vID09PT09PT09PT09PT09PT09PT09PT0gZW5kIG9mIEFQIG1sbWUuaCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworI2VuZGlmCS8vIE1MTUVfSF9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL25ldGlmX2Jsb2NrLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL25ldGlmX2Jsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU1MTUxYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvbmV0aWZfYmxvY2suaApAQCAtMCwwICsxLDU4IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaWZuZGVmIF9fTkVUX0lGX0JMT0NLX0hfXworI2RlZmluZSBfX05FVF9JRl9CTE9DS19IX18KKworLy8jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSAibGlua19saXN0LmgiCisjaW5jbHVkZSAicnRtcC5oIgorCisjZGVmaW5lIEZSRUVfTkVUSUZfUE9PTF9TSVpFIDMyCisKK3R5cGVkZWYgc3RydWN0IF9ORVRJRl9FTlRSWQoreworCXN0cnVjdCBfTkVUSUZfRU5UUlkgKnBOZXh0OworCVBORVRfREVWIHBOZXREZXY7Cit9IE5FVElGX0VOVFJZLCAqUE5FVElGX0VOVFJZOworCit2b2lkIGluaXRibG9ja1F1ZXVlVGFiKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworQk9PTEVBTiBibG9ja05ldElmKAorCUlOIFBCTE9DS19RVUVVRV9FTlRSWSBwQmxvY2tRdWV1ZUVudHJ5LAorCUlOIFBORVRfREVWIHBOZXREZXYpOworCitWT0lEIHJlbGVhc2VOZXRJZigKKwlJTiBQQkxPQ0tfUVVFVUVfRU5UUlkgcEJsb2NrUXVldWVFbnRyeSk7CisKK1ZPSUQgU3RvcE5ldElmUXVldWUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgUXVlSWR4LAorCUlOIFBORElTX1BBQ0tFVCBwUGFja2V0KTsKKyNlbmRpZiAvLyBfX05FVF9JRl9CTE9DS19IX18KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9vaWQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvb2lkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc4OGRiNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvb2lkLmgKQEAgLTAsMCArMSwxMDkxIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCW9pZC5oCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCisqLworI2lmbmRlZiBfT0lEX0hfCisjZGVmaW5lIF9PSURfSF8KKworI2RlZmluZSBUUlVFCQkJCTEKKyNkZWZpbmUgRkFMU0UJCQkJMAorLy8KKy8vIElFRUUgODAyLjExIFN0cnVjdHVyZXMgYW5kIGRlZmluaXRpb25zCisvLworI2RlZmluZSBNQVhfVFhfUE9XRVJfTEVWRUwgICAgICAgICAgICAgIDEwMCAgIC8qIG1XICovCisjZGVmaW5lIE1BWF9SU1NJX1RSSUdHRVIgICAgICAgICAgICAgICAgLTEwICAgIC8qIGRCbSAqLworI2RlZmluZSBNSU5fUlNTSV9UUklHR0VSICAgICAgICAgICAgICAgIC0yMDAgICAvKiBkQm0gKi8KKyNkZWZpbmUgTUFYX0ZSQUdfVEhSRVNIT0xEICAgICAgICAgICAgICAyMzQ2ICAvKiBieXRlIGNvdW50ICovCisjZGVmaW5lIE1JTl9GUkFHX1RIUkVTSE9MRCAgICAgICAgICAgICAgMjU2ICAgLyogYnl0ZSBjb3VudCAqLworI2RlZmluZSBNQVhfUlRTX1RIUkVTSE9MRCAgICAgICAgICAgICAgIDIzNDcgIC8qIGJ5dGUgY291bnQgKi8KKworLy8gbmV3IHR5cGVzIGZvciBNZWRpYSBTcGVjaWZpYyBJbmRpY2F0aW9ucworLy8gRXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0CisjZGVmaW5lIEVYVENIQV9OT05FCQkJMAorI2RlZmluZSBFWFRDSEFfQUJPVkUJCTB4MQorI2RlZmluZSBFWFRDSEFfQkVMT1cJCTB4MworCisvLyBCVworI2RlZmluZSBCQU5EX1dJRFRIXzIwCQkwCisjZGVmaW5lIEJBTkRfV0lEVEhfNDAJCTEKKyNkZWZpbmUgQkFORF9XSURUSF9CT1RICQkyCisjZGVmaW5lIEJBTkRfV0lEVEhfMTAJCTMJLy8gODAyLjExaiBoYXMgMTBNSHouIFRoaXMgZGVmaW5pdGlvbiBpcyBmb3IgaW50ZXJuYWwgdXNhZ2UuIGRvZXNuJ3QgZmlsbCBpbiB0aGUgSUUgb3Igb3RoZXIgZmllbGQuCisvLyBTSE9SVEdJCisjZGVmaW5lIEdBUF9JTlRFUlZBTF80MDAJMQkvLyBvbmx5IHN1cHBvcnQgaW4gSFQgbW9kZQorI2RlZmluZSBHQVBfSU5URVJWQUxfODAwCTAKKyNkZWZpbmUgR0FQX0lOVEVSVkFMX0JPVEgJMgorCisjZGVmaW5lIE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkCQkJMQorI2RlZmluZSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZAkJMAorCisjZGVmaW5lIE5ESVNfODAyXzExX0xFTkdUSF9TU0lEICAgICAgICAgMzIKKyNkZWZpbmUgTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTICAgICAgICA4CisjZGVmaW5lIE5ESVNfODAyXzExX0xFTkdUSF9SQVRFU19FWCAgICAgMTYKKyNkZWZpbmUgTUFDX0FERFJfTEVOR1RIICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIE1BWF9OVU1fT0ZfQ0hTCQkJCQk0OSAvLyAxNCBjaGFubmVscyBAMi40RyArICAxMkBVTklJICsgNCBATU1BQyArIDExIEBIaXBlckxBTjIgKyA3IEBKYXBhbiArIDEgYXMgTlVMTCB0ZXJtaW5hdGlvbmMKKyNkZWZpbmUgTUFYX05VTUJFUl9PRl9FVkVOVAkJCQkxMCAgLy8gZW50cnkgIyBpbiBFVkVOVCB0YWJsZQorI2RlZmluZSBNQVhfTlVNQkVSX09GX01BQwkJCQkzMiAvLyBpZiBNQVhfTUJTU0lEX05VTSBpcyA4LCB0aGlzIHZhbHVlIGNhbid0IGJlIGxhcmdlciB0aGFuIDIxMQorI2RlZmluZSBNQVhfTlVNQkVSX09GX0FDTAkJCQk2NAorI2RlZmluZSBNQVhfTEVOR1RIX09GX1NVUFBPUlRfUkFURVMJCTEyICAgIC8vIDEsIDIsIDUuNSwgMTEsIDYsIDksIDEyLCAxOCwgMjQsIDM2LCA0OCwgNTQKKyNkZWZpbmUgTUFYX05VTUJFUl9PRl9ETFNfRU5UUlkJCQk0CisKKyNpZm5kZWYgVU5ERVJfQ0UKKy8vIE9JRCBkZWZpbml0aW9uLCBzaW5jZSBORElTIDUuMCBkaWRuJ3QgZGVmaW5lIHRoZXNlLCB3ZSBuZWVkIHRvIGRlZmluZSBmb3Igb3VyIG93bgorLy8jaWYgX1dJTjMyX1dJTk5UPD0weDA1MDAKKworI2RlZmluZSBPSURfR0VOX01BQ0hJTkVfTkFNRSAgICAgICAgICAgICAgIDB4MDAwMTAyMUEKKworI2lmZGVmIFJBTElOS19BVEUKKyNkZWZpbmUgUlRfUVVFUllfQVRFX1RYRE9ORV9DT1VOVAkJCTB4MDQwMQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKyNkZWZpbmUgUlRfUVVFUllfU0lHTkFMX0NPTlRFWFQJCQkJMHgwNDAyCisjZGVmaW5lIFJUX1NFVF9JQVBQX1BJRCAgICAgICAgICAgICAgICAgCTB4MDQwNAorI2RlZmluZSBSVF9TRVRfQVBEX1BJRAkJCQkJCTB4MDQwNQorI2RlZmluZSBSVF9TRVRfREVMX01BQ19FTlRSWQkJCQkweDA0MDYKKworLy8KKy8vIElFRUUgODAyLjExIE9JRHMKKy8vCisjZGVmaW5lCU9JRF9HRVRfU0VUX1RPR0dMRQkJCTB4ODAwMAorCisjZGVmaW5lCU9JRF84MDJfMTFfTkVUV09SS19UWVBFU19TVVBQT1JURUQJCQkweDAxMDMKKyNkZWZpbmUJT0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVfSU5fVVNFCQkJCTB4MDEwNAorI2RlZmluZQlPSURfODAyXzExX1JTU0lfVFJJR0dFUgkJCQkJCTB4MDEwNworI2RlZmluZQlSVF9PSURfODAyXzExX1JTU0kJCQkJCQkJMHgwMTA4IC8vcnQyODYwCW9ubHkgLCBrYXRoeQorI2RlZmluZQlSVF9PSURfODAyXzExX1JTU0lfMQkJCQkJCTB4MDEwOSAvL3J0Mjg2MAlvbmx5ICwga2F0aHkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9SU1NJXzIJCQkJCQkweDAxMEEgLy9ydDI4NjAJb25seSAsIGthdGh5CisjZGVmaW5lCU9JRF84MDJfMTFfTlVNQkVSX09GX0FOVEVOTkFTCQkJCTB4MDEwQgorI2RlZmluZQlPSURfODAyXzExX1JYX0FOVEVOTkFfU0VMRUNURUQJCQkJMHgwMTBDCisjZGVmaW5lCU9JRF84MDJfMTFfVFhfQU5URU5OQV9TRUxFQ1RFRAkJCQkweDAxMEQKKyNkZWZpbmUJT0lEXzgwMl8xMV9TVVBQT1JURURfUkFURVMJCQkJCTB4MDEwRQorI2RlZmluZQlPSURfODAyXzExX0FERF9XRVAJCQkJCQkJMHgwMTEyCisjZGVmaW5lCU9JRF84MDJfMTFfUkVNT1ZFX1dFUAkJCQkJCTB4MDExMworI2RlZmluZQlPSURfODAyXzExX0RJU0FTU09DSUFURQkJCQkJCTB4MDExNAorI2RlZmluZQlPSURfODAyXzExX1BSSVZBQ1lfRklMVEVSCQkJCQkweDAxMTgKKyNkZWZpbmUJT0lEXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTgkJCTB4MDExRQorI2RlZmluZQlPSURfODAyXzExX1RFU1QJCQkJCQkJCTB4MDExRgorI2RlZmluZQlSVF9PSURfODAyXzExX0NPVU5UUllfUkVHSU9OCQkJCTB4MDUwNworI2RlZmluZQlPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTgkJCQkJMHgwNTA4CisjZGVmaW5lCU9JRF84MDJfMTFfU1NJRAkJCQkJCQkJMHgwNTA5CisjZGVmaW5lCU9JRF84MDJfMTFfQlNTSUQJCQkJCQkJMHgwNTBBCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUkFESU8JCQkJCQkJMHgwNTBCCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUEhZX01PREUJCQkJCQkweDA1MEMKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHCQkJCQkweDA1MEQKKyNkZWZpbmUJT0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTCQkJCQkweDA1MEUKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9QUkVBTUJMRQkJCQkJCTB4MDUwRgorI2RlZmluZQlPSURfODAyXzExX1dFUF9TVEFUVVMJCQkJCQkweDA1MTAKKyNkZWZpbmUJT0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFCQkJCTB4MDUxMQorI2RlZmluZQlPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREUJCQkJMHgwNTEyCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUkVTRVRfQ09VTlRFUlMJCQkJMHgwNTEzCisjZGVmaW5lCU9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRAkJCQkJMHgwNTE0CisjZGVmaW5lCU9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQJCQkweDA1MTUKKyNkZWZpbmUJT0lEXzgwMl8xMV9QT1dFUl9NT0RFCQkJCQkJMHgwNTE2CisjZGVmaW5lCU9JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUwJCQkJCTB4MDUxNworI2RlZmluZQlSVF9PSURfODAyXzExX0FERF9XUEEJCQkJCQkweDA1MTgKKyNkZWZpbmUJT0lEXzgwMl8xMV9SRU1PVkVfS0VZCQkJCQkJMHgwNTE5CisjZGVmaW5lCU9JRF84MDJfMTFfQUREX0tFWQkJCQkJCQkweDA1MjAKKyNkZWZpbmUJT0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OCQkJCQkweDA1MjEKKyNkZWZpbmUJT0lEXzgwMl8xMV9UWF9QQUNLRVRfQlVSU1QJCQkJCTB4MDUyMgorI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX05PSVNFX0xFVkVMCQkJCTB4MDUyMworI2RlZmluZQlSVF9PSURfODAyXzExX0VYVFJBX0lORk8JCQkJCTB4MDUyNAorI2lmZGVmCURCRworI2RlZmluZQlSVF9PSURfODAyXzExX0hBUkRXQVJFX1JFR0lTVEVSCQkJCTB4MDUyNQorI2VuZGlmCisjZGVmaW5lIE9JRF84MDJfMTFfRU5DUllQVElPTl9TVEFUVVMgICAgICAgICAgICBPSURfODAyXzExX1dFUF9TVEFUVVMKKyNkZWZpbmUgT0lEXzgwMl8xMV9ERUFVVEhFTlRJQ0FUSU9OICAgICAgICAgICAgICAgICAweDA1MjYKKyNkZWZpbmUgT0lEXzgwMl8xMV9EUk9QX1VORU5DUllQVEVEICAgICAgICAgICAgICAgICAweDA1MjcKKyNkZWZpbmUgT0lEXzgwMl8xMV9NSUNfRkFJTFVSRV9SRVBPUlRfRlJBTUUgICAgICAgICAweDA1MjgKKworLy8gRm9yIDgwMi4xeCBkYWVtaW4gdXNpbmcgdG8gcmVxdWlyZSBjdXJyZW50IGRyaXZlciBjb25maWd1cmF0aW9uCisjZGVmaW5lIE9JRF84MDJfMTFfUkFESVVTX1FVRVJZX1NFVFRJTkcJCQkJMHgwNTQwCisKKyNkZWZpbmUJUlRfT0lEX0RFVklDRV9OQU1FCQkJCQkJCTB4MDYwNworI2RlZmluZQlSVF9PSURfVkVSU0lPTl9JTkZPCQkJCQkJCTB4MDYwOAorI2RlZmluZQlPSURfODAyXzExX0JTU0lEX0xJU1QJCQkJCQkweDA2MDkKKyNkZWZpbmUJT0lEXzgwMl8zX0NVUlJFTlRfQUREUkVTUwkJCQkJMHgwNjBBCisjZGVmaW5lCU9JRF9HRU5fTUVESUFfQ09OTkVDVF9TVEFUVVMJCQkJMHgwNjBCCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfTElOS19TVEFUVVMJCQkJMHgwNjBDCisjZGVmaW5lCU9JRF84MDJfMTFfUlNTSQkJCQkJCQkJMHgwNjBECisjZGVmaW5lCU9JRF84MDJfMTFfU1RBVElTVElDUwkJCQkJCTB4MDYwRQorI2RlZmluZQlPSURfR0VOX1JDVl9PSwkJCQkJCQkJMHgwNjBGCisjZGVmaW5lCU9JRF9HRU5fUkNWX05PX0JVRkZFUgkJCQkJCTB4MDYxMAorI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0VFUFJPTV9WRVJTSU9OCQkJMHgwNjExCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfRklSTVdBUkVfVkVSU0lPTgkJMHgwNjEyCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfTEFTVF9SWF9SQVRFCQkJMHgwNjEzCisjZGVmaW5lCVJUX09JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUxfMQkJCQkweDA2MTQKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9QSURWSUQJCQkJCTB4MDYxNQorLy9mb3IgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2RlZmluZSBPSURfU0VUX0NPVU5URVJNRUFTVVJFUyAgICAgICAgICAgICAgICAgICAgIDB4MDYxNgorI2RlZmluZSBPSURfODAyXzExX1NFVF9JRUVFODAyMVggICAgICAgICAgICAgICAgICAgIDB4MDYxNworI2RlZmluZSBPSURfODAyXzExX1NFVF9JRUVFODAyMVhfUkVRVUlSRV9LRVkgICAgICAgIDB4MDYxOAorI2RlZmluZSBPSURfODAyXzExX1BNS0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYyMAorI2RlZmluZSBSVF9PSURfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAgICAgICAgICAgICAgIDB4MDYyMQorI2RlZmluZSBSVF9PSURfV0VfVkVSU0lPTl9DT01QSUxFRCAgICAgICAgICAgICAgICAgIDB4MDYyMgorI2RlZmluZSBSVF9PSURfTkVXX0RSSVZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYyMworCisKKy8vcnQyODYwICwga2F0aHkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TTlJfMAkJCQkJCQkweDA2MzAKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TTlJfMQkJCQkJCQkweDA2MzEKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9MQVNUX1RYX1JBVEUJCQkweDA2MzIKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9IVF9QSFlNT0RFCQkJCTB4MDYzMworI2RlZmluZQlSVF9PSURfODAyXzExX1NFVF9IVF9QSFlNT0RFCQkJCTB4MDYzNAorI2RlZmluZQlPSURfODAyXzExX1JFTE9BRF9ERUZBVUxUUwkJCQkJMHgwNjM1CisjZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfQVBTRF9TRVRUSU5HCQkJMHgwNjM2CisjZGVmaW5lCVJUX09JRF84MDJfMTFfU0VUX0FQU0RfU0VUVElORwkJCQkweDA2MzcKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9BUFNEX1BTTQkJCQkweDA2MzgKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TRVRfQVBTRF9QU00JCQkJCTB4MDYzOQorI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0RMUwkJCQkJCTB4MDYzQQorI2RlZmluZQlSVF9PSURfODAyXzExX1NFVF9ETFMJCQkJCQkweDA2M0IKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9ETFNfUEFSQU0JCQkJMHgwNjNDCisjZGVmaW5lCVJUX09JRF84MDJfMTFfU0VUX0RMU19QQVJBTQkJCQkJMHgwNjNECisjZGVmaW5lIFJUX09JRF84MDJfMTFfUVVFUllfV01NICAgICAgICAgICAgICAJCTB4MDYzRQorI2RlZmluZSBSVF9PSURfODAyXzExX1NFVF9XTU0gICAgICAJCQkJCTB4MDYzRgorI2RlZmluZSBSVF9PSURfODAyXzExX1FVRVJZX0lNTUVfQkFfQ0FQCQkJCTB4MDY0MAorI2RlZmluZSBSVF9PSURfODAyXzExX1NFVF9JTU1FX0JBX0NBUAkJCQkweDA2NDEKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9RVUVSWV9CQVRBQkxFCQkJCQkweDA2NDIKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9BRERfSU1NRV9CQQkJCQkJMHgwNjQzCisjZGVmaW5lIFJUX09JRF84MDJfMTFfVEVBUl9JTU1FX0JBCQkJCQkweDA2NDQKKyNkZWZpbmUgUlRfT0lEX0RSSVZFUl9ERVZJQ0VfTkFNRSAgICAgICAgICAgICAgICAgICAweDA2NDUKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9RVUVSWV9EQVRfSFRfUEhZTU9ERSAgICAgICAgICAweDA2NDYKKyNkZWZpbmUgUlRfT0lEX1FVRVJZX01VTFRJUExFX0NBUkRfU1VQUE9SVCAgICAgICAgICAweDA2NDcKKworLy8gUmFsaW5rIGRlZmluZWQgT0lEcworLy8gRGVubmlzIExlZSBtb3ZlIHRvIHBsYXRmb3JtIHNwZWNpZmljCisKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9CU1NJRAkJCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9CU1NJRCkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TU0lECQkJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1NTSUQpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfSU5GUkFTVFJVQ1RVUkVfTU9ERQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREUpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfQUREX1dFUAkJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0FERF9XRVApCisjZGVmaW5lCVJUX09JRF84MDJfMTFfQUREX0tFWQkJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0FERF9LRVkpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUkVNT1ZFX1dFUAkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfUkVNT1ZFX1dFUCkKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9SRU1PVkVfS0VZCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9SRU1PVkVfS0VZKQorI2RlZmluZQlSVF9PSURfODAyXzExX0RJU0FTU09DSUFURQkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfRElTQVNTT0NJQVRFKQorI2RlZmluZQlSVF9PSURfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFKQorI2RlZmluZQlSVF9PSURfODAyXzExX1BSSVZBQ1lfRklMVEVSCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1BSSVZBQ1lfRklMVEVSKQorI2RlZmluZQlSVF9PSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTgkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU4pCisjZGVmaW5lCVJUX09JRF84MDJfMTFfV0VQX1NUQVRVUwkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfV0VQX1NUQVRVUykKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9SRUxPQURfREVGQVVMVFMJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfUkVMT0FEX0RFRkFVTFRTKQorI2RlZmluZQlSVF9PSURfODAyXzExX05FVFdPUktfVFlQRV9JTl9VU0UJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVfSU5fVVNFKQorI2RlZmluZQlSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1RYX1BPV0VSX0xFVkVMKQorI2RlZmluZQlSVF9PSURfODAyXzExX1JTU0lfVFJJR0dFUgkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfUlNTSV9UUklHR0VSKQorI2RlZmluZQlSVF9PSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEKQorI2RlZmluZQlSVF9PSURfODAyXzExX1JUU19USFJFU0hPTEQJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1JUU19USFJFU0hPTEQpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUlhfQU5URU5OQV9TRUxFQ1RFRAkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1JYX0FOVEVOTkFfU0VMRUNURUQpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfVFhfQU5URU5OQV9TRUxFQ1RFRAkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1RYX0FOVEVOTkFfU0VMRUNURUQpCisjZGVmaW5lCVJUX09JRF84MDJfMTFfU1VQUE9SVEVEX1JBVEVTCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1NVUFBPUlRFRF9SQVRFUykKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTKQorI2RlZmluZQlSVF9PSURfODAyXzExX0NPTkZJR1VSQVRJT04JCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0NPTkZJR1VSQVRJT04pCisjZGVmaW5lCVJUX09JRF84MDJfMTFfUE9XRVJfTU9ERQkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfUE9XRVJfTU9ERSkKKwordHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9TVEFUVVNfVFlQRQoreworICAgIE5kaXM4MDJfMTFTdGF0dXNUeXBlX0F1dGhlbnRpY2F0aW9uLAorICAgIE5kaXM4MDJfMTFTdGF0dXNUeXBlX01lZGlhU3RyZWFtTW9kZSwKKyAgICBOZGlzODAyXzExU3RhdHVzVHlwZV9QTUtJRF9DYW5kaWRhdGVMaXN0LAorICAgIE5kaXM4MDJfMTFTdGF0dXNUeXBlTWF4ICAgIC8vIG5vdCBhIHJlYWwgdHlwZSwgZGVmaW5lZCBhcyBhbiB1cHBlciBib3VuZAorfSBORElTXzgwMl8xMV9TVEFUVVNfVFlQRSwgKlBORElTXzgwMl8xMV9TVEFUVVNfVFlQRTsKKwordHlwZWRlZiBVQ0hBUiAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTWzZdOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfU1RBVFVTX0lORElDQVRJT04KK3sKKyAgICBORElTXzgwMl8xMV9TVEFUVVNfVFlQRSBTdGF0dXNUeXBlOworfSBORElTXzgwMl8xMV9TVEFUVVNfSU5ESUNBVElPTiwgKlBORElTXzgwMl8xMV9TVEFUVVNfSU5ESUNBVElPTjsKKworLy8gbWFzayBmb3IgYXV0aGVudGljYXRpb24vaW50ZWdyaXR5IGZpZWxkcworI2RlZmluZSBORElTXzgwMl8xMV9BVVRIX1JFUVVFU1RfQVVUSF9GSUVMRFMgICAgICAgIDB4MGYKKworI2RlZmluZSBORElTXzgwMl8xMV9BVVRIX1JFUVVFU1RfUkVBVVRIICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgTkRJU184MDJfMTFfQVVUSF9SRVFVRVNUX0tFWVVQREFURSAgICAgICAgICAweDAyCisjZGVmaW5lIE5ESVNfODAyXzExX0FVVEhfUkVRVUVTVF9QQUlSV0lTRV9FUlJPUiAgICAgMHgwNgorI2RlZmluZSBORElTXzgwMl8xMV9BVVRIX1JFUVVFU1RfR1JPVVBfRVJST1IgICAgICAgIDB4MEUKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX1JFUVVFU1QKK3sKKyAgICBVTE9ORyBMZW5ndGg7ICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHN0cnVjdHVyZQorICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTIEJzc2lkOworICAgIFVMT05HIEZsYWdzOworfSBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9SRVFVRVNULCAqUE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX1JFUVVFU1Q7CisKKy8vQWRkZWQgbmV3IHR5cGVzIGZvciBQTUtJRCBDYW5kaWRhdGUgbGlzdHMuCit0eXBlZGVmIHN0cnVjdCBfUE1LSURfQ0FORElEQVRFIHsKKyAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCU1NJRDsKKyAgICBVTE9ORyBGbGFnczsKK30gUE1LSURfQ0FORElEQVRFLCAqUFBNS0lEX0NBTkRJREFURTsKKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX1BNS0lEX0NBTkRJREFURV9MSVNUCit7CisgICAgVUxPTkcgVmVyc2lvbjsgICAgICAgLy8gVmVyc2lvbiBvZiB0aGUgc3RydWN0dXJlCisgICAgVUxPTkcgTnVtQ2FuZGlkYXRlczsgLy8gTm8uIG9mIHBta2lkIGNhbmRpZGF0ZXMKKyAgICBQTUtJRF9DQU5ESURBVEUgQ2FuZGlkYXRlTGlzdFsxXTsKK30gTkRJU184MDJfMTFfUE1LSURfQ0FORElEQVRFX0xJU1QsICpQTkRJU184MDJfMTFfUE1LSURfQ0FORElEQVRFX0xJU1Q7CisKKy8vRmxhZ3MgZm9yIFBNS0lEIENhbmRpZGF0ZSBsaXN0IHN0cnVjdHVyZQorI2RlZmluZSBORElTXzgwMl8xMV9QTUtJRF9DQU5ESURBVEVfUFJFQVVUSF9FTkFCTEVECTB4MDEKKworLy8gQWRkZWQgbmV3IHR5cGVzIGZvciBPRkRNIDVHIGFuZCAyLjRHCit0eXBlZGVmIGVudW0gX05ESVNfODAyXzExX05FVFdPUktfVFlQRQoreworICAgTmRpczgwMl8xMUZILAorICAgTmRpczgwMl8xMURTLAorICAgIE5kaXM4MDJfMTFPRkRNNSwKKyAgICBOZGlzODAyXzExT0ZETTVfTiwKKyAgICBOZGlzODAyXzExT0ZETTI0LAorICAgIE5kaXM4MDJfMTFPRkRNMjRfTiwKKyAgIE5kaXM4MDJfMTFBdXRvbW9kZSwKKyAgICBOZGlzODAyXzExTmV0d29ya1R5cGVNYXggICAgLy8gbm90IGEgcmVhbCB0eXBlLCBkZWZpbmVkIGFzIGFuIHVwcGVyIGJvdW5kCit9IE5ESVNfODAyXzExX05FVFdPUktfVFlQRSwgKlBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEU7CisKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9ORVRXT1JLX1RZUEVfTElTVAoreworICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgIE51bWJlck9mSXRlbXM7ICAvLyBpbiBsaXN0IGJlbG93LCBhdCBsZWFzdCAxCisgICBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgICAgTmV0d29ya1R5cGUgWzFdOworfSBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEVfTElTVCwgKlBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEVfTElTVDsKKwordHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9QT1dFUl9NT0RFCit7CisgICAgTmRpczgwMl8xMVBvd2VyTW9kZUNBTSwKKyAgICBOZGlzODAyXzExUG93ZXJNb2RlTUFYX1BTUCwKKyAgICBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1AsCisgICAgTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1AsCisgICAgTmRpczgwMl8xMVBvd2VyTW9kZU1heCAgICAgIC8vIG5vdCBhIHJlYWwgbW9kZSwgZGVmaW5lZCBhcyBhbiB1cHBlciBib3VuZAorfSBORElTXzgwMl8xMV9QT1dFUl9NT0RFLCAqUE5ESVNfODAyXzExX1BPV0VSX01PREU7CisKK3R5cGVkZWYgVUxPTkcgICBORElTXzgwMl8xMV9UWF9QT1dFUl9MRVZFTDsgLy8gaW4gbWlsbGl3YXR0cworCisvLworLy8gUmVjZWl2ZWQgU2lnbmFsIFN0cmVuZ3RoIEluZGljYXRpb24KKy8vCit0eXBlZGVmIExPTkcgICAgTkRJU184MDJfMTFfUlNTSTsgICAgICAgICAgIC8vIGluIGRCbQorCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQ09ORklHVVJBVElPTl9GSAoreworICAgVUxPTkcgICAgICAgICAgIExlbmd0aDsgICAgICAgICAgICAvLyBMZW5ndGggb2Ygc3RydWN0dXJlCisgICBVTE9ORyAgICAgICAgICAgSG9wUGF0dGVybjsgICAgICAgIC8vIEFzIGRlZmluZWQgYnkgODAyLjExLCBNU0Igc2V0CisgICBVTE9ORyAgICAgICAgICAgSG9wU2V0OyAgICAgICAgICAgIC8vIHRvIG9uZSBpZiBub24tODAyLjExCisgICBVTE9ORyAgICAgICAgICAgRHdlbGxUaW1lOyAgICAgICAgIC8vIHVuaXRzIGFyZSBLdXNlYworfSBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OX0ZILCAqUE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT05fRkg7CisKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OCit7CisgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIExlbmd0aDsgICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHN0cnVjdHVyZQorICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICBCZWFjb25QZXJpb2Q7ICAgICAgIC8vIHVuaXRzIGFyZSBLdXNlYworICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICBBVElNV2luZG93OyAgICAgICAgIC8vIHVuaXRzIGFyZSBLdXNlYworICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICBEU0NvbmZpZzsgICAgICAgICAgIC8vIEZyZXF1ZW5jeSwgdW5pdHMgYXJlIGtIegorICAgTkRJU184MDJfMTFfQ09ORklHVVJBVElPTl9GSCAgICBGSENvbmZpZzsKK30gTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiwgKlBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfU1RBVElTVElDUworeworICAgVUxPTkcgICAgICAgICAgIExlbmd0aDsgICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHN0cnVjdHVyZQorICAgTEFSR0VfSU5URUdFUiAgIFRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudDsKKyAgIExBUkdFX0lOVEVHRVIgICBNdWx0aWNhc3RUcmFuc21pdHRlZEZyYW1lQ291bnQ7CisgICBMQVJHRV9JTlRFR0VSICAgRmFpbGVkQ291bnQ7CisgICBMQVJHRV9JTlRFR0VSICAgUmV0cnlDb3VudDsKKyAgIExBUkdFX0lOVEVHRVIgICBNdWx0aXBsZVJldHJ5Q291bnQ7CisgICBMQVJHRV9JTlRFR0VSICAgUlRTU3VjY2Vzc0NvdW50OworICAgTEFSR0VfSU5URUdFUiAgIFJUU0ZhaWx1cmVDb3VudDsKKyAgIExBUkdFX0lOVEVHRVIgICBBQ0tGYWlsdXJlQ291bnQ7CisgICBMQVJHRV9JTlRFR0VSICAgRnJhbWVEdXBsaWNhdGVDb3VudDsKKyAgIExBUkdFX0lOVEVHRVIgICBSZWNlaXZlZEZyYWdtZW50Q291bnQ7CisgICBMQVJHRV9JTlRFR0VSICAgTXVsdGljYXN0UmVjZWl2ZWRGcmFtZUNvdW50OworICAgTEFSR0VfSU5URUdFUiAgIEZDU0Vycm9yQ291bnQ7CisgICBMQVJHRV9JTlRFR0VSICAgVEtJUExvY2FsTUlDRmFpbHVyZXM7CisgICBMQVJHRV9JTlRFR0VSICAgVEtJUFJlbW90ZU1JQ0Vycm9yczsKKyAgIExBUkdFX0lOVEVHRVIgICBUS0lQSUNWRXJyb3JzOworICAgTEFSR0VfSU5URUdFUiAgIFRLSVBDb3VudGVyTWVhc3VyZXNJbnZva2VkOworICAgTEFSR0VfSU5URUdFUiAgIFRLSVBSZXBsYXlzOworICAgTEFSR0VfSU5URUdFUiAgIENDTVBGb3JtYXRFcnJvcnM7CisgICBMQVJHRV9JTlRFR0VSICAgQ0NNUFJlcGxheXM7CisgICBMQVJHRV9JTlRFR0VSICAgQ0NNUERlY3J5cHRFcnJvcnM7CisgICBMQVJHRV9JTlRFR0VSICAgRm91cldheUhhbmRzaGFrZUZhaWx1cmVzOworfSBORElTXzgwMl8xMV9TVEFUSVNUSUNTLCAqUE5ESVNfODAyXzExX1NUQVRJU1RJQ1M7CisKK3R5cGVkZWYgIFVMT05HICBORElTXzgwMl8xMV9LRVlfSU5ERVg7Cit0eXBlZGVmIFVMT05HTE9ORyAgIE5ESVNfODAyXzExX0tFWV9SU0M7CisKKyNkZWZpbmUgTUFYX1JBRElVU19TUlZfTlVNCQkJMgkgIC8vIDgwMi4xeCBmYWlsb3ZlciBudW1iZXIKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SQURJVVNfU1JWX0lORk8geworCVVJTlQzMgkJCXJhZGl1c19pcDsKKwlVSU5UMzIJCQlyYWRpdXNfcG9ydDsKKwlVQ0hBUgkJCXJhZGl1c19rZXlbNjRdOworCVVDSEFSCQkJcmFkaXVzX2tleV9sZW47Cit9IFJBRElVU19TUlZfSU5GTywgKlBSQURJVVNfU1JWX0lORk87CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUkFESVVTX0tFWV9JTkZPCit7CisJVUNIQVIJCQlyYWRpdXNfc3J2X251bTsKKwlSQURJVVNfU1JWX0lORk8JcmFkaXVzX3Nydl9pbmZvW01BWF9SQURJVVNfU1JWX05VTV07CisJVUNIQVIJCQlpZWVlODAyMXhXRVA7CQkgLy8gZHluYW1pYyBXRVAKKyAgICBVQ0hBUiAgICAgICAgICAga2V5X2luZGV4OworICAgIFVDSEFSICAgICAgICAgICBrZXlfbGVuZ3RoOyAgICAgICAgICAvLyBsZW5ndGggb2Yga2V5IGluIGJ5dGVzCisgICAgVUNIQVIgICAgICAgICAgIGtleV9tYXRlcmlhbFsxM107Cit9IFJBRElVU19LRVlfSU5GTywgKlBSQURJVVNfS0VZX0lORk87CisKKy8vIEl0J3MgdXNlZCBieSA4MDIuMXggZGFlbW9uIHRvIHJlcXVpcmUgcmVsYXRpdmUgY29uZmlndXJhdGlvbgordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SQURJVVNfQ09ORgoreworICAgIFVJTlQzMiAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZQorICAgIFVDSEFSCQkJbWJzc19udW07CQkJLy8gaW5kaWNhdGUgbXVsdGlwbGUgQlNTIG51bWJlcgorCVVJTlQzMgkJCW93bl9pcF9hZGRyOworCVVJTlQzMgkJCXJldHJ5X2ludGVydmFsOworCVVJTlQzMgkJCXNlc3Npb25fdGltZW91dF9pbnRlcnZhbDsKKwlVQ0hBUgkJCUVBUGlmbmFtZVtJRk5BTVNJWl07CisJVUNIQVIJCQlFQVBpZm5hbWVfbGVuOworCVVDSEFSIAkJCVByZUF1dGhpZm5hbWVbSUZOQU1TSVpdOworCVVDSEFSCQkJUHJlQXV0aGlmbmFtZV9sZW47CisJUkFESVVTX0tFWV9JTkZPCVJhZGl1c0luZm9bOC8qTUFYX01CU1NJRF9OVU0qL107Cit9IFJBRElVU19DT05GLCAqUFJBRElVU19DT05GOworCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorLy8gS2V5IG1hcHBpbmcga2V5cyByZXF1aXJlIGEgQlNTSUQKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9LRVkKK3sKKyAgICBVSU5UICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZQorICAgIFVJTlQgICAgICAgICAgIEtleUluZGV4OworICAgIFVJTlQgICAgICAgICAgIEtleUxlbmd0aDsgICAgICAgICAgLy8gbGVuZ3RoIG9mIGtleSBpbiBieXRlcworICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTIEJTU0lEOworICAgIE5ESVNfODAyXzExX0tFWV9SU0MgS2V5UlNDOworICAgIFVDSEFSICAgICAgICAgICBLZXlNYXRlcmlhbFsxXTsgICAgIC8vIHZhcmlhYmxlIGxlbmd0aCBkZXBlbmRpbmcgb24gYWJvdmUgZmllbGQKK30gTkRJU184MDJfMTFfS0VZLCAqUE5ESVNfODAyXzExX0tFWTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwordHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX1JFTU9WRV9LRVkKK3sKKyAgICBVSU5UICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZQorICAgIFVJTlQgICAgICAgICAgIEtleUluZGV4OworICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTIEJTU0lEOworfSBORElTXzgwMl8xMV9SRU1PVkVfS0VZLCAqUE5ESVNfODAyXzExX1JFTU9WRV9LRVk7CisKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9XRVAKK3sKKyAgIFVJTlQgICAgIExlbmd0aDsgICAgICAgIC8vIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZQorICAgVUlOVCAgICAgS2V5SW5kZXg7ICAgICAgICAgICAvLyAwIGlzIHRoZSBwZXItY2xpZW50IGtleSwgMS1OIGFyZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnbG9iYWwga2V5cworICAgVUlOVCAgICAgS2V5TGVuZ3RoOyAgICAgLy8gbGVuZ3RoIG9mIGtleSBpbiBieXRlcworICAgVUNIQVIgICAgIEtleU1hdGVyaWFsWzFdOy8vIHZhcmlhYmxlIGxlbmd0aCBkZXBlbmRpbmcgb24gYWJvdmUgZmllbGQKK30gTkRJU184MDJfMTFfV0VQLCAqUE5ESVNfODAyXzExX1dFUDsKKworCit0eXBlZGVmIGVudW0gX05ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUKK3sKKyAgIE5kaXM4MDJfMTFJQlNTLAorICAgTmRpczgwMl8xMUluZnJhc3RydWN0dXJlLAorICAgTmRpczgwMl8xMUF1dG9Vbmtub3duLAorICAgTmRpczgwMl8xMU1vbml0b3IsCisgICBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmVNYXggICAgIC8vIE5vdCBhIHJlYWwgdmFsdWUsIGRlZmluZWQgYXMgdXBwZXIgYm91bmQKK30gTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSwgKlBORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFOworCisvLyBBZGQgbmV3IGF1dGhlbnRpY2F0aW9uIG1vZGVzCit0eXBlZGVmIGVudW0gX05ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUKK3sKKyAgIE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4sCisgICBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQsCisgICBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoLAorICAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQSwKKyAgICBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0ssCisgICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSwKKyAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIsCisgICBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLLAorICAgCU5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyLAorCU5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLLAorICAgTmRpczgwMl8xMUF1dGhNb2RlTWF4ICAgICAgICAgICAvLyBOb3QgYSByZWFsIG1vZGUsIGRlZmluZWQgYXMgdXBwZXIgYm91bmQKK30gTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSwgKlBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFOworCit0eXBlZGVmIFVDSEFSICAgTkRJU184MDJfMTFfUkFURVNbTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTXTsgICAgICAgIC8vIFNldCBvZiA4IGRhdGEgcmF0ZXMKK3R5cGVkZWYgVUNIQVIgICBORElTXzgwMl8xMV9SQVRFU19FWFtORElTXzgwMl8xMV9MRU5HVEhfUkFURVNfRVhdOyAgLy8gU2V0IG9mIDE2IGRhdGEgcmF0ZXMKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9ORElTXzgwMl8xMV9TU0lECit7CisgICAgVUlOVCAgIFNzaWRMZW5ndGg7ICAgICAgICAgLy8gbGVuZ3RoIG9mIFNTSUQgZmllbGQgYmVsb3csIGluIGJ5dGVzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGNhbiBiZSB6ZXJvLgorICAgIFVDSEFSICAgU3NpZFtORElTXzgwMl8xMV9MRU5HVEhfU1NJRF07ICAgICAgICAgICAvLyBTU0lEIGluZm9ybWF0aW9uIGZpZWxkCit9IE5ESVNfODAyXzExX1NTSUQsICpQTkRJU184MDJfMTFfU1NJRDsKKworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX05ESVNfV0xBTl9CU1NJRAoreworICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoOyAgICAgLy8gTGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlCisgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyAgICAgICAgICAgICBNYWNBZGRyZXNzOyAvLyBCU1NJRAorICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWRbMl07CisgICBORElTXzgwMl8xMV9TU0lEICAgICAgICAgICAgICAgICAgICBTc2lkOyAgICAgICAvLyBTU0lECisgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcml2YWN5OyAgICAvLyBXRVAgZW5jcnlwdGlvbiByZXF1aXJlbWVudAorICAgTkRJU184MDJfMTFfUlNTSSAgICAgICAgICAgICAgICAgICAgUnNzaTsgICAgICAgLy8gcmVjZWl2ZSBzaWduYWwgc3RyZW5ndGggaW4gZEJtCisgICBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgICAgICAgICAgICBOZXR3b3JrVHlwZUluVXNlOworICAgTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiAgICAgICAgICAgQ29uZmlndXJhdGlvbjsKKyAgIE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgIEluZnJhc3RydWN0dXJlTW9kZTsKKyAgIE5ESVNfODAyXzExX1JBVEVTICAgICAgICAgICAgICAgICAgIFN1cHBvcnRlZFJhdGVzOworfSBORElTX1dMQU5fQlNTSUQsICpQTkRJU19XTEFOX0JTU0lEOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX05ESVNfODAyXzExX0JTU0lEX0xJU1QKK3sKKyAgIFVJTlQgICAgICAgICAgIE51bWJlck9mSXRlbXM7ICAgICAgLy8gaW4gbGlzdCBiZWxvdywgYXQgbGVhc3QgMQorICAgTkRJU19XTEFOX0JTU0lEIEJzc2lkWzFdOworfSBORElTXzgwMl8xMV9CU1NJRF9MSVNULCAqUE5ESVNfODAyXzExX0JTU0lEX0xJU1Q7CisKKy8vIEFkZGVkIENhcGFiaWxpdGllcywgSUVMZW5ndGggYW5kIElFcyBmb3IgZWFjaCBCU1NJRAordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9ORElTX1dMQU5fQlNTSURfRVgKK3sKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZQorICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTICAgICAgICAgICAgIE1hY0FkZHJlc3M7ICAgICAgICAgLy8gQlNTSUQKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZFsyXTsKKyAgICBORElTXzgwMl8xMV9TU0lEICAgICAgICAgICAgICAgICAgICBTc2lkOyAgICAgICAgICAgICAgIC8vIFNTSUQKKyAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcml2YWN5OyAgICAgICAgICAgIC8vIFdFUCBlbmNyeXB0aW9uIHJlcXVpcmVtZW50CisgICAgTkRJU184MDJfMTFfUlNTSSAgICAgICAgICAgICAgICAgICAgUnNzaTsgICAgICAgICAgICAgICAvLyByZWNlaXZlIHNpZ25hbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RyZW5ndGggaW4gZEJtCisgICAgTkRJU184MDJfMTFfTkVUV09SS19UWVBFICAgICAgICAgICAgTmV0d29ya1R5cGVJblVzZTsKKyAgICBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OICAgICAgICAgICBDb25maWd1cmF0aW9uOworICAgIE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgIEluZnJhc3RydWN0dXJlTW9kZTsKKyAgICBORElTXzgwMl8xMV9SQVRFU19FWCAgICAgICAgICAgICAgICBTdXBwb3J0ZWRSYXRlczsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUxlbmd0aDsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRXNbMV07Cit9IE5ESVNfV0xBTl9CU1NJRF9FWCwgKlBORElTX1dMQU5fQlNTSURfRVg7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTkRJU184MDJfMTFfQlNTSURfTElTVF9FWAoreworICAgIFVJTlQgICAgICAgICAgICAgICAgICAgTnVtYmVyT2ZJdGVtczsgICAgICAvLyBpbiBsaXN0IGJlbG93LCBhdCBsZWFzdCAxCisgICAgTkRJU19XTEFOX0JTU0lEX0VYICAgICAgQnNzaWRbMV07Cit9IE5ESVNfODAyXzExX0JTU0lEX0xJU1RfRVgsICpQTkRJU184MDJfMTFfQlNTSURfTElTVF9FWDsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9ORElTXzgwMl8xMV9GSVhFRF9JRXMKK3sKKyAgICBVQ0hBUiBUaW1lc3RhbXBbOF07CisgICAgVVNIT1JUIEJlYWNvbkludGVydmFsOworICAgIFVTSE9SVCBDYXBhYmlsaXRpZXM7Cit9IE5ESVNfODAyXzExX0ZJWEVEX0lFcywgKlBORElTXzgwMl8xMV9GSVhFRF9JRXM7CisKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMKK3sKKyAgICBVQ0hBUiBFbGVtZW50SUQ7CisgICAgVUNIQVIgTGVuZ3RoOyAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgaW4gZGF0YSBmaWVsZAorICAgIFVDSEFSIGRhdGFbMV07Cit9IE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcywgKlBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXM7CisKK3R5cGVkZWYgIFVMT05HICAgTkRJU184MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQ7CisKK3R5cGVkZWYgIFVMT05HICAgTkRJU184MDJfMTFfUlRTX1RIUkVTSE9MRDsKKwordHlwZWRlZiAgVUxPTkcgICBORElTXzgwMl8xMV9BTlRFTk5BOworCit0eXBlZGVmIGVudW0gX05ESVNfODAyXzExX1BSSVZBQ1lfRklMVEVSCit7CisgICBOZGlzODAyXzExUHJpdkZpbHRlckFjY2VwdEFsbCwKKyAgIE5kaXM4MDJfMTFQcml2RmlsdGVyODAyMXhXRVAKK30gTkRJU184MDJfMTFfUFJJVkFDWV9GSUxURVIsICpQTkRJU184MDJfMTFfUFJJVkFDWV9GSUxURVI7CisKKy8vIEFkZGVkIG5ldyBlbmNyeXB0aW9uIHR5cGVzCisvLyBBbHNvIGFsaWFzZWQgdHlwZWRlZiB0byBuZXcgbmFtZQordHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9XRVBfU1RBVFVTCit7CisgICBOZGlzODAyXzExV0VQRW5hYmxlZCwKKyAgICBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkID0gTmRpczgwMl8xMVdFUEVuYWJsZWQsCisgICBOZGlzODAyXzExV0VQRGlzYWJsZWQsCisgICAgTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCwKKyAgIE5kaXM4MDJfMTFXRVBLZXlBYnNlbnQsCisgICAgTmRpczgwMl8xMUVuY3J5cHRpb24xS2V5QWJzZW50ID0gTmRpczgwMl8xMVdFUEtleUFic2VudCwKKyAgIE5kaXM4MDJfMTFXRVBOb3RTdXBwb3J0ZWQsCisgICAgTmRpczgwMl8xMUVuY3J5cHRpb25Ob3RTdXBwb3J0ZWQgPSBOZGlzODAyXzExV0VQTm90U3VwcG9ydGVkLAorICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQsCisgICAgTmRpczgwMl8xMUVuY3J5cHRpb24yS2V5QWJzZW50LAorICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQsCisgICAgTmRpczgwMl8xMUVuY3J5cHRpb24zS2V5QWJzZW50LAorICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQsCS8vIFRLSVAgb3IgQUVTIG1peAorICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uNEtleUFic2VudCwKKyAgICBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQsCisJTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZCwKK30gTkRJU184MDJfMTFfV0VQX1NUQVRVUywgKlBORElTXzgwMl8xMV9XRVBfU1RBVFVTLAorICBORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUywgKlBORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUzsKKwordHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9SRUxPQURfREVGQVVMVFMKK3sKKyAgIE5kaXM4MDJfMTFSZWxvYWRXRVBLZXlzCit9IE5ESVNfODAyXzExX1JFTE9BRF9ERUZBVUxUUywgKlBORElTXzgwMl8xMV9SRUxPQURfREVGQVVMVFM7CisKKyNkZWZpbmUgTkRJU184MDJfMTFfQUlfUkVRRklfQ0FQQUJJTElUSUVTICAgICAgMQorI2RlZmluZSBORElTXzgwMl8xMV9BSV9SRVFGSV9MSVNURU5JTlRFUlZBTCAgICAyCisjZGVmaW5lIE5ESVNfODAyXzExX0FJX1JFUUZJX0NVUlJFTlRBUEFERFJFU1MgIDQKKworI2RlZmluZSBORElTXzgwMl8xMV9BSV9SRVNGSV9DQVBBQklMSVRJRVMgICAgICAxCisjZGVmaW5lIE5ESVNfODAyXzExX0FJX1JFU0ZJX1NUQVRVU0NPREUgICAgICAgIDIKKyNkZWZpbmUgTkRJU184MDJfMTFfQUlfUkVTRklfQVNTT0NJQVRJT05JRCAgICAgNAorCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQUlfUkVRRkkKK3sKKyAgICBVU0hPUlQgQ2FwYWJpbGl0aWVzOworICAgIFVTSE9SVCBMaXN0ZW5JbnRlcnZhbDsKKyAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyAgQ3VycmVudEFQQWRkcmVzczsKK30gTkRJU184MDJfMTFfQUlfUkVRRkksICpQTkRJU184MDJfMTFfQUlfUkVRRkk7CisKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9BSV9SRVNGSQoreworICAgIFVTSE9SVCBDYXBhYmlsaXRpZXM7CisgICAgVVNIT1JUIFN0YXR1c0NvZGU7CisgICAgVVNIT1JUIEFzc29jaWF0aW9uSWQ7Cit9IE5ESVNfODAyXzExX0FJX1JFU0ZJLCAqUE5ESVNfODAyXzExX0FJX1JFU0ZJOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04KK3sKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICBMZW5ndGg7CisgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgQXZhaWxhYmxlUmVxdWVzdEZpeGVkSUVzOworICAgIE5ESVNfODAyXzExX0FJX1JFUUZJICAgIFJlcXVlc3RGaXhlZElFczsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICBSZXF1ZXN0SUVMZW5ndGg7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgT2Zmc2V0UmVxdWVzdElFczsKKyAgICBVU0hPUlQgICAgICAgICAgICAgICAgICBBdmFpbGFibGVSZXNwb25zZUZpeGVkSUVzOworICAgIE5ESVNfODAyXzExX0FJX1JFU0ZJICAgIFJlc3BvbnNlRml4ZWRJRXM7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgUmVzcG9uc2VJRUxlbmd0aDsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICBPZmZzZXRSZXNwb25zZUlFczsKK30gTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04sICpQTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT047CisKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FVkVOVAoreworICAgIE5ESVNfODAyXzExX1NUQVRVU19JTkRJQ0FUSU9OICAgICAgIFN0YXR1czsKKyAgICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9SRVFVRVNUICBSZXF1ZXN0WzFdOworfSBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FVkVOVCwgKlBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FVkVOVDsKKworLyoKK3R5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9URVNUCit7CisgICAgVUxPTkcgTGVuZ3RoOworICAgIFVMT05HIFR5cGU7CisgICAgdW5pb24KKyAgICB7CisgICAgICAgIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX0VWRU5UIEF1dGhlbnRpY2F0aW9uRXZlbnQ7CisgICAgICAgIE5ESVNfODAyXzExX1JTU0kgUnNzaVRyaWdnZXI7CisgICAgfTsKK30gTkRJU184MDJfMTFfVEVTVCwgKlBORElTXzgwMl8xMV9URVNUOworICovCisKKy8vIDgwMi4xMSBNZWRpYSBzdHJlYW0gY29uc3RyYWludHMsIGFzc29jaWF0ZWQgd2l0aCBPSURfODAyXzExX01FRElBX1NUUkVBTV9NT0RFCit0eXBlZGVmIGVudW0gX05ESVNfODAyXzExX01FRElBX1NUUkVBTV9NT0RFCit7CisgICAgTmRpczgwMl8xMU1lZGlhU3RyZWFtT2ZmLAorICAgIE5kaXM4MDJfMTFNZWRpYVN0cmVhbU9uLAorfSBORElTXzgwMl8xMV9NRURJQV9TVFJFQU1fTU9ERSwgKlBORElTXzgwMl8xMV9NRURJQV9TVFJFQU1fTU9ERTsKKworLy8gUE1LSUQgU3RydWN0dXJlcwordHlwZWRlZiBVQ0hBUiAgIE5ESVNfODAyXzExX1BNS0lEX1ZBTFVFWzE2XTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAordHlwZWRlZiBzdHJ1Y3QgX0JTU0lEX0lORk8KK3sKKyAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCU1NJRDsKKyAgICBORElTXzgwMl8xMV9QTUtJRF9WQUxVRSBQTUtJRDsKK30gQlNTSURfSU5GTywgKlBCU1NJRF9JTkZPOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfUE1LSUQKK3sKKyAgICBVSU5UICAgIExlbmd0aDsKKyAgICBVSU5UICAgIEJTU0lESW5mb0NvdW50OworICAgIEJTU0lEX0lORk8gQlNTSURJbmZvWzFdOworfSBORElTXzgwMl8xMV9QTUtJRCwgKlBORElTXzgwMl8xMV9QTUtJRDsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fRU5DUllQVElPTgoreworICAgIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgQXV0aE1vZGVTdXBwb3J0ZWQ7CisgICAgTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMgRW5jcnlwdFN0YXR1c1N1cHBvcnRlZDsKK30gTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fRU5DUllQVElPTiwgKlBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FTkNSWVBUSU9OOworCit0eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQ0FQQUJJTElUWQoreworICAgICBVTE9ORyBMZW5ndGg7CisgICAgIFVMT05HIFZlcnNpb247CisgICAgIFVMT05HIE5vT2ZQTUtJRHM7CisgICAgIFVMT05HIE5vT2ZBdXRoRW5jcnlwdFBhaXJzU3VwcG9ydGVkOworICAgICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FTkNSWVBUSU9OIEF1dGhlbnRpY2F0aW9uRW5jcnlwdGlvblN1cHBvcnRlZFsxXTsKK30gTkRJU184MDJfMTFfQ0FQQUJJTElUWSwgKlBORElTXzgwMl8xMV9DQVBBQklMSVRZOworCisvLyNlbmRpZiAvL29mIFdJTiAyaworI2VuZGlmIC8vVU5ERVJfQ0UKKworI2lmIFdJUkVMRVNTX0VYVCA8PSAxMQorI2lmbmRlZiBTSU9DREVWUFJJVkFURQorI2RlZmluZSBTSU9DREVWUFJJVkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEJFMAorI2VuZGlmCisjZGVmaW5lIFNJT0NJV0ZJUlNUUFJJVgkJCQkJCQkJU0lPQ0RFVlBSSVZBVEUKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZGVmaW5lIFJUUFJJVl9JT0NUTF9TRVQJCQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MDIpCisKKyNpZmRlZiBEQkcKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX0JCUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwMykKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX01BQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwNSkKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX0UyUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwNykKKyNlbmRpZgorCisjaWZkZWYgUkFMSU5LX0FURQorI2lmZGVmIFJBTElOS18yOHh4X1FBCisjZGVmaW5lIFJUUFJJVl9JT0NUTF9BVEUJCQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MDgpCisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX1NUQVRJU1RJQ1MgICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwOSkKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX0FERF9QTUtJRF9DQUNIRSAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwQSkKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX1JBRElVU19EQVRBICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwQykKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX0dTSVRFU1VSVkVZCQkJCQkoU0lPQ0lXRklSU1RQUklWICsgMHgwRCkKKyNkZWZpbmUgUlRfUFJJVl9JT0NUTAkJCQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MEUpIC8vIFN5bmMuIHdpdGggUlQ2MSAoZm9yIHdwYV9zdXBwbGljYW50KQorI2RlZmluZSBSVFBSSVZfSU9DVExfR0VUX01BQ19UQUJMRQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MEYpCisKKyNkZWZpbmUgUlRQUklWX0lPQ1RMX1NIT1cJCQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MTEpCitlbnVtIHsKKyAgICBTSE9XX0NPTk5fU1RBVFVTID0gNCwKKyAgICBTSE9XX0RSVklFUl9WRVJJT04gPSA1LAorICAgIFNIT1dfQkFfSU5GTyA9IDYsCisJU0hPV19ERVNDX0lORk8gPSA3LAorI2lmZGVmIFJUMjg3MAorCVNIT1dfUlhCVUxLX0lORk8gPSA4LAorCVNIT1dfVFhCVUxLX0lORk8gPSA5LAorI2VuZGlmIC8vIFJUMjg3MCAvLworICAgIFJBSU9fT0ZGID0gMTAsCisgICAgUkFJT19PTiA9IDExLAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCVNIT1dfRExTX0VOVFJZX0lORk8gPSAxOSwKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwlTSE9XX0NGR19WQUxVRSA9IDIwLAorCVNIT1dfQURIT0NfRU5UUllfSU5GTyA9IDIxLAorfTsKKworCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBTTk1QX1NVUFBPUlQKKy8vU05NUCBpZWVlIDgwMmRvdDExLCBrYXRoeSAsIDIwMDhfMDIyMAorLy8gZG90MTFyZXMoMykKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRVJPVUkJCQkweDA3MDAKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRVJOQU1FCQkJMHgwNzAxCisjZGVmaW5lIFJUX09JRF84MDJfMTFfUkVTT1VSQ0VUWVBFSUROQU1FCQkweDA3MDIKKworLy8gZG90MTFzbXQoMSkKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9QUklWQUNZT1BUSU9OSU1QTEVNRU5URUQJMHgwNzAzCisjZGVmaW5lIFJUX09JRF84MDJfMTFfUE9XRVJNQU5BR0VNRU5UTU9ERQkJMHgwNzA0CisjZGVmaW5lIE9JRF84MDJfMTFfV0VQREVGQVVMVEtFWVZBTFVFCQkJMHgwNzA1IC8vIHJlYWQgLCB3cml0ZQorI2RlZmluZSBPSURfODAyXzExX1dFUERFRkFVTFRLRVlJRAkJCQkweDA3MDYKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9XRVBLRVlNQVBQSU5HTEVOR1RICQkweDA3MDcKKyNkZWZpbmUgT0lEXzgwMl8xMV9TSE9SVFJFVFJZTElNSVQJCQkJMHgwNzA4CisjZGVmaW5lIE9JRF84MDJfMTFfTE9OR1JFVFJZTElNSVQJCQkJMHgwNzA5CisjZGVmaW5lIFJUX09JRF84MDJfMTFfUFJPRFVDVElECQkJCQkweDA3MTAKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRUlECQkJCTB4MDcxMQorCisvLyAvL2RvdDExUGh5KDQpCisjZGVmaW5lIE9JRF84MDJfMTFfQ1VSUkVOVENIQU5ORUwJCQkJMHgwNzEyCisKKy8vZG90MTFtYWMKKyNkZWZpbmUgUlRfT0lEXzgwMl8xMV9NQUNfQUREUkVTUwkJCQkweDA3MTMKKyNlbmRpZiAvLyBTTk1QX1NVUFBPUlQgLy8KKworI2RlZmluZSBPSURfODAyXzExX0JVSUxEX0NIQU5ORUxfRVgJCQkJMHgwNzE0CisjZGVmaW5lIE9JRF84MDJfMTFfR0VUX0NIX0xJU1QJCQkJCTB4MDcxNQorI2RlZmluZSBPSURfODAyXzExX0dFVF9DT1VOVFJZX0NPREUJCQkJMHgwNzE2CisjZGVmaW5lIE9JRF84MDJfMTFfR0VUX0NIQU5ORUxfR0VPR1JBUEhZCQkweDA3MTcKKworI2lmZGVmIExMVERfU1VQUE9SVAorLy8gZm9yIGNvbnNpc3RlbmN5IHdpdGggUlQ2MQorI2RlZmluZSBSVF9PSURfR0VUX1BIWV9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgIDB4NzYxCisjZW5kaWYgLy8gTExURF9TVVBQT1JUIC8vCisKKy8vIE1JTU8gVHggcGFyYW1ldGVyLCBTaG9ydEdJLCBNQ1MsIFNUQkMsIGV0Yy4gIHRoZXNlIGFyZSBmaWVsZHMgaW4gVFhXSS4gRG9uJ3QgY2hhbmdlIHRoaXMgZGVmaW5pdGlvbiEhIQordHlwZWRlZiB1bmlvbiAgX0hUVFJBTlNNSVRfU0VUVElORyB7CisjaWZkZWYgUlRfQklHX0VORElBTgorCXN0cnVjdAl7CisJVVNIT1JUCQlNT0RFOjI7CS8vIFVzZSBkZWZpbml0aW9uIE1PREVfeHh4LgorLy8JVVNIT1JUCQlyc3Y6MzsKKwlVU0hPUlQJCVR4QkY6MTsKKwlVU0hPUlQJCXJzdjoyOworCVVTSE9SVAkJU1RCQzoyOwkvL1NQQUNFCisJVVNIT1JUCQlTaG9ydEdJOjE7CisJVVNIT1JUCQlCVzoxOwkvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegorCVVTSE9SVCAgIAlNQ1M6NzsgICAgICAgICAgICAgICAgIC8vIE1DUworCX0JZmllbGQ7CisjZWxzZQorCXN0cnVjdAl7CisJVVNIT1JUICAgCU1DUzo3OyAgICAgICAgICAgICAgICAgLy8gTUNTCisJVVNIT1JUCQlCVzoxOwkvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegorCVVTSE9SVAkJU2hvcnRHSToxOworCVVTSE9SVAkJU1RCQzoyOwkvL1NQQUNFCisvLwlVU0hPUlQJCXJzdjozOworCVVTSE9SVAkJcnN2OjI7CisJVVNIT1JUCQlUeEJGOjE7CisJVVNIT1JUCQlNT0RFOjI7CS8vIFVzZSBkZWZpbml0aW9uIE1PREVfeHh4LgorCX0JZmllbGQ7CisjZW5kaWYKKwlVU0hPUlQJCXdvcmQ7CisgfSBIVFRSQU5TTUlUX1NFVFRJTkcsICpQSFRUUkFOU01JVF9TRVRUSU5HOworCit0eXBlZGVmIGVudW0gX1JUXzgwMl8xMV9QUkVBTUJMRSB7CisgICAgUnQ4MDJfMTFQcmVhbWJsZUxvbmcsCisgICAgUnQ4MDJfMTFQcmVhbWJsZVNob3J0LAorICAgIFJ0ODAyXzExUHJlYW1ibGVBdXRvCit9IFJUXzgwMl8xMV9QUkVBTUJMRSwgKlBSVF84MDJfMTFfUFJFQU1CTEU7CisKKy8vIE9ubHkgZm9yIFNUQSwgbmVlZCB0byBzeW5jIHdpdGggQVAKK3R5cGVkZWYgZW51bSBfUlRfODAyXzExX1BIWV9NT0RFIHsKKwlQSFlfMTFCR19NSVhFRCA9IDAsCisJUEhZXzExQiwKKwlQSFlfMTFBLAorCVBIWV8xMUFCR19NSVhFRCwKKwlQSFlfMTFHLAorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCVBIWV8xMUFCR05fTUlYRUQsCS8vIGJvdGggYmFuZCAgIDUKKwlQSFlfMTFOXzJfNEcsCQkvLyAxMW4tb25seSB3aXRoIDIuNEcgYmFuZCAgIAk2CisJUEhZXzExR05fTUlYRUQsCS8vIDIuNEcgYmFuZCAgICAgIDcKKwlQSFlfMTFBTl9NSVhFRCwJLy8gNUcgIGJhbmQgICAgICAgOAorCVBIWV8xMUJHTl9NSVhFRCwJLy8gaWYgY2hlY2sgODAyLjExYi4gICAgICA5CisJUEhZXzExQUdOX01JWEVELAkvLyBpZiBjaGVjayA4MDIuMTFiLiAgICAgIDEwCisJUEhZXzExTl81RywJCQkvLyAxMW4tb25seSB3aXRoIDVHIGJhbmQJCTExCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCit9IFJUXzgwMl8xMV9QSFlfTU9ERTsKKworLy8gcHV0IGFsbCBwcm9wcmlldGVyeSBmb3ItcXVlcnkgb2JqZWN0cyBoZXJlIHRvIHJlZHVjZSAjIG9mIFF1ZXJ5X09JRAordHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9MSU5LX1NUQVRVUyB7CisgICAgVUxPTkcgICBDdXJyVHhSYXRlOyAgICAgICAgIC8vIGluIHVuaXRzIG9mIDAuNU1icHMKKyAgICBVTE9ORyAgIENoYW5uZWxRdWFsaXR5OyAgICAgLy8gMC4uMTAwICUKKyAgICBVTE9ORyAgIFR4Qnl0ZUNvdW50OyAgICAgICAgLy8gYm90aCBvayBhbmQgZmFpbAorICAgIFVMT05HICAgUnhCeXRlQ291bnQ7ICAgICAgICAvLyBib3RoIG9rIGFuZCBmYWlsCisgICAgVUxPTkcJQ2VudHJhbENoYW5uZWw7CQkvLyA0ME1IeiBjZW50cmFsIGNoYW5uZWwgbnVtYmVyCit9IFJUXzgwMl8xMV9MSU5LX1NUQVRVUywgKlBSVF84MDJfMTFfTElOS19TVEFUVVM7CisKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfRVZFTlRfTE9HIHsKKyAgICBMQVJHRV9JTlRFR0VSICAgU3lzdGVtVGltZTsgIC8vIHRpbWVzdGFtbXAgdmlhIE5kaXNHZXRDdXJyZW50U3lzdGVtVGltZSgpCisgICAgVUNIQVIgICAgICAgICAgIEFkZHJbTUFDX0FERFJfTEVOR1RIXTsKKyAgICBVU0hPUlQgICAgICAgICAgRXZlbnQ7ICAgICAgIC8vIEVWRU5UX3h4eAorfSBSVF84MDJfMTFfRVZFTlRfTE9HLCAqUFJUXzgwMl8xMV9FVkVOVF9MT0c7CisKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfRVZFTlRfVEFCTEUgeworICAgIFVMT05HICAgICAgIE51bTsKKyAgICBVTE9ORyAgICAgICBSc3Y7ICAgICAvLyB0byBhbGlnbiBMb2dbXSBhdCBMQVJHRV9JTkVHRVIgYm91bmRhcnkKKyAgICBSVF84MDJfMTFfRVZFTlRfTE9HICAgTG9nW01BWF9OVU1CRVJfT0ZfRVZFTlRdOworfSBSVF84MDJfMTFfRVZFTlRfVEFCTEUsIFBSVF84MDJfMTFfRVZFTlRfVEFCTEU7CisKKy8vIE1JTU8gVHggcGFyYW1ldGVyLCBTaG9ydEdJLCBNQ1MsIFNUQkMsIGV0Yy4gIHRoZXNlIGFyZSBmaWVsZHMgaW4gVFhXSS4gRG9uJ3QgY2hhbmdlIHRoaXMgZGVmaW5pdGlvbiEhIQordHlwZWRlZiB1bmlvbiAgX01BQ0hUVFJBTlNNSVRfU0VUVElORyB7CisJc3RydWN0CXsKKwlVU0hPUlQgICAJTUNTOjc7ICAgICAgICAgICAgICAgICAvLyBNQ1MKKwlVU0hPUlQJCUJXOjE7CS8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6CisJVVNIT1JUCQlTaG9ydEdJOjE7CisJVVNIT1JUCQlTVEJDOjI7CS8vU1BBQ0UKKwlVU0hPUlQJCXJzdjozOworCVVTSE9SVAkJTU9ERToyOwkvLyBVc2UgZGVmaW5pdGlvbiBNT0RFX3h4eC4KKwl9CWZpZWxkOworCVVTSE9SVAkJd29yZDsKKyB9IE1BQ0hUVFJBTlNNSVRfU0VUVElORywgKlBNQUNIVFRSQU5TTUlUX1NFVFRJTkc7CisKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfTUFDX0VOVFJZIHsKKyAgICBVQ0hBUiAgICAgICBBZGRyW01BQ19BRERSX0xFTkdUSF07CisgICAgVUNIQVIgICAgICAgQWlkOworICAgIFVDSEFSICAgICAgIFBzbTsgICAgIC8vIDA6UFdSX0FDVElWRSwgMTpQV1JfU0FWRQorICAgIFVDSEFSCQlNaW1vUHM7ICAvLyAwOk1NUFNfU1RBVElDLCAxOk1NUFNfRFlOQU1JQywgMzpNTVBTX0VuYWJsZWQKKyAgICBDSEFSCQlBdmdSc3NpMDsKKwlDSEFSCQlBdmdSc3NpMTsKKwlDSEFSCQlBdmdSc3NpMjsKKwlVSU5UMzIJCUNvbm5lY3RlZFRpbWU7CisgICAgTUFDSFRUUkFOU01JVF9TRVRUSU5HCVR4UmF0ZTsKK30gUlRfODAyXzExX01BQ19FTlRSWSwgKlBSVF84MDJfMTFfTUFDX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX01BQ19UQUJMRSB7CisgICAgVUxPTkcgICAgICAgTnVtOworICAgIFJUXzgwMl8xMV9NQUNfRU5UUlkgRW50cnlbTUFYX05VTUJFUl9PRl9NQUNdOworfSBSVF84MDJfMTFfTUFDX1RBQkxFLCAqUFJUXzgwMl8xMV9NQUNfVEFCTEU7CisKKy8vIHN0cnVjdHVyZSBmb3IgcXVlcnkvc2V0IGhhcmR3YXJlIHJlZ2lzdGVyIC0gTUFDLCBCQlAsIFJGIHJlZ2lzdGVyCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0hBUkRXQVJFX1JFR0lTVEVSIHsKKyAgICBVTE9ORyAgIEhhcmR3YXJlVHlwZTsgICAgICAgLy8gMDpNQUMsIDE6QkJQLCAyOlJGIHJlZ2lzdGVyLCAzOkVFUFJPTQorICAgIFVMT05HICAgT2Zmc2V0OyAgICAgICAgICAgICAvLyBRL1MgcmVnaXN0ZXIgb2Zmc2V0IGFkZHIKKyAgICBVTE9ORyAgIERhdGE7ICAgICAgICAgICAgICAgLy8gUi9XIGRhdGEgYnVmZmVyCit9IFJUXzgwMl8xMV9IQVJEV0FSRV9SRUdJU1RFUiwgKlBSVF84MDJfMTFfSEFSRFdBUkVfUkVHSVNURVI7CisKKy8vIHN0cnVjdHVyZSB0byB0dW5lIEJCUCBSMTcgIlJYIEFHQyBWR0MgaW5pdCIKKy8vdHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9SWF9BR0NfVkdDX1RVTklORyB7CisvLyAgICBVQ0hBUiAgIEZhbHNlQ2NhTG93ZXJUaHJlc2hvbGQ7ICAvLyAwLTI1NSwgZGVmIDEwCisvLyAgICBVQ0hBUiAgIEZhbHNlQ2NhVXBwZXJUaHJlc2hvbGQ7ICAvLyAwLTI1NSwgZGVmIDEwMAorLy8gICAgVUNIQVIgICBWZ2NEZWx0YTsgICAgICAgICAgICAgICAgLy8gUjE3ICstPSBWZ2NEZWx0YSB3aGVuZXZlciBmbGFzZSBDQ0Egb3ZlciBVcHByVGhyZXNob2xkCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBsb3dlciB0aGFuIExvd2VyVGhyZXNob2xkdXBwZXIgdGhyZXNob2xkCisvLyAgICBVQ0hBUiAgIFZnY1VwcGVyQm91bmQ7ICAgICAgICAgICAvLyBtYXggdmFsdWUgb2YgUjE3CisvL30gUlRfODAyXzExX1JYX0FHQ19WR0NfVFVOSU5HLCAqUFJUXzgwMl8xMV9SWF9BR0NfVkdDX1RVTklORzsKKwordHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9BUF9DT05GSUcgeworICAgIFVMT05HICAgRW5hYmxlVHhCdXJzdDsgICAgICAvLyAwLWRpc2FibGUsIDEtZW5hYmxlCisgICAgVUxPTkcgICBFbmFibGVUdXJib1JhdGU7ICAgIC8vIDAtZGlzYWJsZSwgMS1lbmFibGUgNzIvMTAwbWJwcyB0dXJibyByYXRlCisgICAgVUxPTkcgICBJc29sYXRlSW50ZXJTdGFUcmFmZmljOyAgICAgLy8gMC1kaXNhYmxlLCAxLWVuYWJsZSBpc29sYXRpb24KKyAgICBVTE9ORyAgIEhpZGVTc2lkOyAgICAgICAgICAgLy8gMC1kaXNhYmxlLCAxLWVuYWJsZSBoaWRpbmcKKyAgICBVTE9ORyAgIFVzZUJHUHJvdGVjdGlvbjsgICAgLy8gMC1BVVRPLCAxLWFsd2F5cyBPTiwgMi1hbHdheXMgT0ZGCisgICAgVUxPTkcgICBVc2VTaG9ydFNsb3RUaW1lOyAgIC8vIDAtbm8gdXNlLCAxLXVzZSA5LXVzIHNob3J0IHNsb3QgdGltZQorICAgIFVMT05HICAgUnN2MTsgICAgICAgICAgICAgICAvLyBtdXN0IGJlIDAKKyAgICBVTE9ORyAgIFN5c3RlbUVycm9yQml0bWFwOyAgLy8gaWdub3JlIHVwb24gU0VULCByZXR1cm4gc3lzdGVtIGVycm9yIHVwb24gUVVFUlkKK30gUlRfODAyXzExX0FQX0NPTkZJRywgKlBSVF84MDJfMTFfQVBfQ09ORklHOworCisvLyBzdHJ1Y3R1cmUgdG8gcXVlcnkvc2V0IFNUQV9DT05GSUcKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfU1RBX0NPTkZJRyB7CisgICAgVUxPTkcgICBFbmFibGVUeEJ1cnN0OyAgICAgIC8vIDAtZGlzYWJsZSwgMS1lbmFibGUKKyAgICBVTE9ORyAgIEVuYWJsZVR1cmJvUmF0ZTsgICAgLy8gMC1kaXNhYmxlLCAxLWVuYWJsZSA3Mi8xMDBtYnBzIHR1cmJvIHJhdGUKKyAgICBVTE9ORyAgIFVzZUJHUHJvdGVjdGlvbjsgICAgLy8gMC1BVVRPLCAxLWFsd2F5cyBPTiwgMi1hbHdheXMgT0ZGCisgICAgVUxPTkcgICBVc2VTaG9ydFNsb3RUaW1lOyAgIC8vIDAtbm8gdXNlLCAxLXVzZSA5LXVzIHNob3J0IHNsb3QgdGltZSB3aGVuIGFwcGxpY2FibGUKKyAgICBVTE9ORyAgIEFkaG9jTW9kZTsgCQkJLy8gMC0xMWIgcmF0ZXMgb25seSAoV0lGSSBzcGVjKSwgMSAtIGIvZyBtaXhlZCwgMiAtIGcgb25seQorICAgIFVMT05HICAgSHdSYWRpb1N0YXR1czsgICAgICAvLyAwLU9GRiwgMS1PTiwgZGVmYXVsdCBpcyAxLCBSZWFkLU9ubHkKKyAgICBVTE9ORyAgIFJzdjE7ICAgICAgICAgICAgICAgLy8gbXVzdCBiZSAwCisgICAgVUxPTkcgICBTeXN0ZW1FcnJvckJpdG1hcDsgIC8vIGlnbm9yZSB1cG9uIFNFVCwgcmV0dXJuIHN5c3RlbSBlcnJvciB1cG9uIFFVRVJZCit9IFJUXzgwMl8xMV9TVEFfQ09ORklHLCAqUFJUXzgwMl8xMV9TVEFfQ09ORklHOworCisvLworLy8gIEZvciBPSUQgUXVlcnkgb3IgU2V0IGFib3V0IEJBIHN0cnVjdHVyZQorLy8KK3R5cGVkZWYJc3RydWN0CV9PSURfQkFDQVBfU1RSVUMJeworCQlVQ0hBUgkJUnhCQVdpbkxpbWl0OworCQlVQ0hBUgkJVHhCQVdpbkxpbWl0OworCQlVQ0hBUgkJUG9saWN5OwkvLyAwOiBERUxBWV9CQSAxOklNTUVEX0JBICAoLy9CQSBQb2xpY3kgc3ViZmlsZWQgdmFsdWUgaW4gQUREQkEgZnJhbWUpICAgMjpCQS1ub3QgdXNlLiBvdGhlciB2YWx1ZSBpbnZhbGlkCisJCVVDSEFSCQlNcGR1RGVuc2l0eTsJLy8gMDogREVMQVlfQkEgMTpJTU1FRF9CQSAgKC8vQkEgUG9saWN5IHN1YmZpbGVkIHZhbHVlIGluIEFEREJBIGZyYW1lKSAgIDI6QkEtbm90IHVzZS4gb3RoZXIgdmFsdWUgaW52YWxpZAorCQlVQ0hBUiAgICAgICAJQW1zZHVFbmFibGU7CS8vRW5hYmxlIEFNU0RVIHRyYW5zbWlzc3Rpb24KKwkJVUNIQVIgICAgICAgCUFtc2R1U2l6ZTsJLy8gMDozODM5LCAxOjc5MzUgYnl0ZXMuIFVJTlQgIE1TRFVTaXplVG9CeXRlc1tdCT0geyAzODM5LCA3OTM1fTsKKwkJVUNIQVIgICAgICAgCU1NUFNtb2RlOwkvLyBNSU1PIHBvd2VyIHNhdmUgbW9yZSwgMDpzdGF0aWMsIDE6ZHluYW1pYywgMjpyc3YsIDM6bWltbyBlbmFibGUKKwkJQk9PTEVBTgkJQXV0b0JBOwkvLyBBdXRvIEJBIHdpbGwgYXV0b21hdGljYWxseQorfSBPSURfQkFDQVBfU1RSVUMsICpQT0lEX0JBQ0FQX1NUUlVDOworCit0eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0FDTF9FTlRSWSB7CisgICAgVUNIQVIgICBBZGRyW01BQ19BRERSX0xFTkdUSF07CisgICAgVVNIT1JUICBSc3Y7Cit9IFJUXzgwMl8xMV9BQ0xfRU5UUlksICpQUlRfODAyXzExX0FDTF9FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SVF84MDJfMTFfQUNMIHsKKyAgICBVTE9ORyAgIFBvbGljeTsgICAgICAgICAgICAgLy8gMC1kaXNhYmxlLCAxLXBvc2l0aXZlIGxpc3QsIDItbmVnYXRpdmUgbGlzdAorICAgIFVMT05HICAgTnVtOworICAgIFJUXzgwMl8xMV9BQ0xfRU5UUlkgRW50cnlbTUFYX05VTUJFUl9PRl9BQ0xdOworfSBSVF84MDJfMTFfQUNMLCAqUFJUXzgwMl8xMV9BQ0w7CisKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfV0RTIHsKKyAgICBVTE9ORwkJCQkJCU51bTsKKyAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUwkJRW50cnlbMjQvKk1BWF9OVU1fT0ZfV0RTX0xJTksqL107CisJVUxPTkcJCQkJCQlLZXlMZW5ndGg7CisJVUNIQVIJCQkJCQlLZXlNYXRlcmlhbFszMl07Cit9IFJUXzgwMl8xMV9XRFMsICpQUlRfODAyXzExX1dEUzsKKwordHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9UWF9SQVRFU18geworICAgIFVDSEFSICAgICAgIFN1cFJhdGVMZW47CisgICAgVUNIQVIgICAgICAgU3VwUmF0ZVtNQVhfTEVOR1RIX09GX1NVUFBPUlRfUkFURVNdOworICAgIFVDSEFSICAgICAgIEV4dFJhdGVMZW47CisgICAgVUNIQVIgICAgICAgRXh0UmF0ZVtNQVhfTEVOR1RIX09GX1NVUFBPUlRfUkFURVNdOworfSBSVF84MDJfMTFfVFhfUkFURVMsICpQUlRfODAyXzExX1RYX1JBVEVTOworCisKKy8vIERlZmluaXRpb24gb2YgZXh0cmEgaW5mb3JtYXRpb24gY29kZQorI2RlZmluZQlHRU5FUkFMX0xJTktfVVAJCQkweDAJCQkvLyBMaW5rIGlzIFVwCisjZGVmaW5lCUdFTkVSQUxfTElOS19ET1dOCQkweDEJCQkvLyBMaW5rIGlzIERvd24KKyNkZWZpbmUJSFdfUkFESU9fT0ZGCQkJMHgyCQkJLy8gSGFyZHdhcmUgcmFkaW8gb2ZmCisjZGVmaW5lCVNXX1JBRElPX09GRgkJCTB4MwkJCS8vIFNvZnR3YXJlIHJhZGlvIG9mZgorI2RlZmluZQlBVVRIX0ZBSUwJCQkJMHg0CQkJLy8gT3BlbiBhdXRoZW50aWNhdGlvbiBmYWlsCisjZGVmaW5lCUFVVEhfRkFJTF9LRVlTCQkJMHg1CQkJLy8gU2hhcmVkIGF1dGhlbnRpY2F0aW9uIGZhaWwKKyNkZWZpbmUJQVNTT0NfRkFJTAkJCQkweDYJCQkvLyBBc3NvY2lhdGlvbiBmYWlsZWQKKyNkZWZpbmUJRUFQX01JQ19GQUlMVVJFCQkJMHg3CQkJLy8gRGVhdXRoZW5jYXRpb24gYmVjYXVzZSBNSUMgZmFpbHVyZQorI2RlZmluZQlFQVBfNFdBWV9USU1FT1VUCQkweDgJCQkvLyBEZWF1dGhlbmNhdGlvbiBvbiA0LXdheSBoYW5kc2hha2UgdGltZW91dAorI2RlZmluZQlFQVBfR1JPVVBfS0VZX1RJTUVPVVQJMHg5CQkJLy8gRGVhdXRoZW5jYXRpb24gb24gZ3JvdXAga2V5IGhhbmRzaGFrZSB0aW1lb3V0CisjZGVmaW5lCUVBUF9TVUNDRVNTCQkJCTB4YQkJCS8vIEVBUCBzdWNjZWVkCisjZGVmaW5lCURFVEVDVF9SQURBUl9TSUdOQUwJCTB4YiAgICAgICAgIC8vIFJhZGFyIHNpZ25hbCBvY2N1ciBpbiBjdXJyZW50IGNoYW5uZWwKKyNkZWZpbmUgRVhUUkFfSU5GT19NQVgJCQkweGIJCQkvLyBJbmRpY2F0ZSBMYXN0IE9JRAorCisjZGVmaW5lIEVYVFJBX0lORk9fQ0xFQVIJCTB4ZmZmZmZmZmYKKworLy8gVGhpcyBpcyBPSUQgc2V0dGluZyBzdHJ1Y3R1cmUuIFNvIG9ubHkgR0Ygb3IgTU0gYXMgTW9kZS4gVGhpcyBpcyB2YWxpZCB3aGVuIG91ciB3aXJlbHNzIG1vZGUgaGFzIDgwMi4xMW4gaW4gdXNlLgordHlwZWRlZiBzdHJ1Y3QgeworCVJUXzgwMl8xMV9QSFlfTU9ERQkJUGh5TW9kZTsgCS8vCisJVUNIQVIJCVRyYW5zbWl0Tm87CisJVUNIQVIJCUh0TW9kZTsgCS8vSFRNT0RFX0dGIG9yIEhUTU9ERV9NTQorCVVDSEFSCQlFeHRPZmZzZXQ7CS8vZXh0ZW5zaW9uIGNoYW5uZWwgYWJvdmUgb3IgYmVsb3cKKwlVQ0hBUgkJTUNTOworCVVDSEFSICAgCUJXOworCVVDSEFSCQlTVEJDOworCVVDSEFSCQlTSE9SVEdJOworCVVDSEFSCQlyc3Y7Cit9IE9JRF9TRVRfSFRfUEhZTU9ERSwgKlBPSURfU0VUX0hUX1BIWU1PREU7CisKKyNpZmRlZiBOSU5URU5ET19BUAorI2RlZmluZSBOSU5URU5ET19NQVhfRU5UUlkgMTYKKyNkZWZpbmUgTklOVEVORE9fU1NJRF9OQU1FX0xOIDgKKyNkZWZpbmUgTklOVEVORE9fU1NJRF9OQU1FICJOV0NVU0JBUCIKKyNkZWZpbmUgTklOVEVORE9fUFJPQkVfUkVRX0ZMQUdfTUFTSyAweDAzCisjZGVmaW5lIE5JTlRFTkRPX1BST0JFX1JFUV9PTiAweDAxCisjZGVmaW5lIE5JTlRFTkRPX1BST0JFX1JFUV9TSUdOQUwgMHgwMgorI2RlZmluZSBOSU5URU5ET19QUk9CRV9SU1BfT04gMHgwMQorI2RlZmluZSBOSU5URU5ET19TU0lEX05JQ0tOQU1FX0xOIDIwCisKKyNkZWZpbmUgTklOVEVORE9fV0VQS0VZX0xOIDEzCisKK3R5cGVkZWYgc3RydWN0IF9OSU5URU5ET19TU0lECit7CisJVUNIQVIJTklOVEVORE9GaXhDaGFyW05JTlRFTkRPX1NTSURfTkFNRV9MTl07CisJVUNIQVIJemVybzE7CisJVUNIQVIJcmVnaXN0ZTsKKwlVQ0hBUglJRDsKKwlVQ0hBUgl6ZXJvMjsKKwlVQ0hBUglOSUNLbmFtZVtOSU5URU5ET19TU0lEX05JQ0tOQU1FX0xOXTsKK30gUlRfTklOVEVORE9fU1NJRCwgKlBSVF9OSU5URU5ET19TU0lEOworCit0eXBlZGVmIHN0cnVjdCBfTklOVEVORE9fRU5UUlkKK3sKKwlVQ0hBUglOSUNLbmFtZVtOSU5URU5ET19TU0lEX05JQ0tOQU1FX0xOXTsKKyAgICBVQ0hBUiAgIERTX0FkZHJbRVRIX0xFTkdUSF9PRl9BRERSRVNTXTsKKwlVQ0hBUglyZWdpc3RlOworCVVDSEFSCVVzZXJTcGFjZUFjazsKK30gUlRfTklOVEVORE9fRU5UUlksICpQUlRfTklOVEVORE9fRU5UUlk7CisKKy8vUlRQUklWX0lPQ1RMX05JTlRFTkRPX0dFVF9UQUJMRQorLy9SVFBSSVZfSU9DVExfTklOVEVORE9fU0VUX1RBQkxFCit0eXBlZGVmIHN0cnVjdCBfTklOVEVORE9fVEFCTEUKK3sKKwlVSU5UCQkJCW51bWJlcjsKKwlSVF9OSU5URU5ET19FTlRSWQllbnRyeVtOSU5URU5ET19NQVhfRU5UUlldOworfSBSVF9OSU5URU5ET19UQUJMRSwgKlBSVF9OSU5URU5ET19UQUJMRTsKKworLy9SVFBSSVZfSU9DVExfTklOVEVORE9fU0VFRF9XRVBLRVkKK3R5cGVkZWYgc3RydWN0IF9OSU5URU5ET19TRUVEX1dFUEtFWQoreworCVVDSEFSCXNlZWRbTklOVEVORE9fU1NJRF9OSUNLTkFNRV9MTl07CisJVUNIQVIJd2Vwa2V5WzE2XTsvL3VzZSAxMyBmb3IgMTA0IGJpdHMgd2VwIGtleQorfSBSVF9OSU5URU5ET19TRUVEX1dFUEtFWSwgKlBSVF9OSU5URU5ET19TRUVEX1dFUEtFWTsKKyNlbmRpZiAvLyBOSU5URU5ET19BUCAvLworCisjaWZkZWYgTExURF9TVVBQT1JUCit0eXBlZGVmIHN0cnVjdCBfUlRfTExURF9BU1NPSUNBVElPTl9FTlRSWSB7CisgICAgVUNIQVIgICAgICAgICAgIEFkZHJbRVRIX0xFTkdUSF9PRl9BRERSRVNTXTsKKyAgICB1bnNpZ25lZCBzaG9ydCAgTU9SOyAgICAgICAgLy8gbWF4aW11bSBvcGVyYXRpb25hbCByYXRlCisgICAgVUNIQVIgICAgICAgICAgIHBoeU1vZGU7Cit9IFJUX0xMVERfQVNTT0lDQVRJT05fRU5UUlksICpQUlRfTExURF9BU1NPSUNBVElPTl9FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgX1JUX0xMVERfQVNTT0lDQVRJT05fVEFCTEUgeworICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICBOdW07CisgICAgUlRfTExURF9BU1NPSUNBVElPTl9FTlRSWSAgIEVudHJ5W01BWF9OVU1CRVJfT0ZfTUFDXTsKK30gUlRfTExURF9BU1NPSUNBVElPTl9UQUJMRSwgKlBSVF9MTFREX0FTU09JQ0FUSU9OX1RBQkxFOworI2VuZGlmIC8vIExMVERfU1VQUE9SVCAvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisvL3J0Mjg2MCwga2F0aHkgMjAwNy0wMTE4CisvLyBzdHJ1Y3R1cmUgZm9yIERMUwordHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9ETFNfVUkgeworCVVTSE9SVAkJCQkJCVRpbWVPdXQ7CQkvLyB1bml0OiBzZWNvbmQgLCBzZXQgYnkgVUkKKwlVU0hPUlQJCQkJCQlDb3VudERvd25UaW1lcjsJLy8gdW5pdDogc2Vjb25kICwgdXNlZCBieSBkcml2ZXIgb25seQorCU5ESVNfODAyXzExX01BQ19BRERSRVNTCQlNYWNBZGRyOwkJLy8gc2V0IGJ5IFVJCisJVUNIQVIJCQkJCQlTdGF0dXM7CQkJLy8gMDogbm9uZSAsIDE6IHdhaXQgU1RBa2V5LCAyOiBmaW5pc2ggRExTIHNldHVwICwgc2V0IGJ5IGRyaXZlciBvbmx5CisJQk9PTEVBTgkJCQkJCVZhbGlkOwkJCS8vIDE6IHZhbGlkICwgMDogaW52YWxpZCAsIHNldCBieSBVSSwgdXNlIHRvIHNldHVwIG9yIHRlYXIgZG93biBETFMgbGluaworfSBSVF84MDJfMTFfRExTX1VJLCAqUFJUXzgwMl8xMV9ETFNfVUk7CisKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfRExTX0lORk8geworCVJUXzgwMl8xMV9ETFNfVUkJRW50cnlbTUFYX05VTUJFUl9PRl9ETFNfRU5UUlldOworCVVDSEFSCQkJCW51bTsKK30gUlRfODAyXzExX0RMU19JTkZPLCAqUFJUXzgwMl8xMV9ETFNfSU5GTzsKKwordHlwZWRlZiBlbnVtIF9SVF84MDJfMTFfRExTX01PREUgeworICAgIERMU19OT05FLAorICAgIERMU19XQUlUX0tFWSwKKyAgICBETFNfRklOSVNICit9IFJUXzgwMl8xMV9ETFNfTU9ERTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNpZm5kZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNkZWZpbmUJUlRfQVNTT0NfRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDEKKyNkZWZpbmUJUlRfRElTQVNTT0NfRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAweDAxMDIKKyNkZWZpbmUJUlRfUkVRSUVfRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDMKKyNkZWZpbmUJUlRfUkVTUElFX0VWRU5UX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDQKKyNkZWZpbmUJUlRfQVNTT0NJTkZPX0VWRU5UX0ZMQUcgICAgICAgICAgICAgICAgICAgICAweDAxMDUKKyNkZWZpbmUgUlRfUE1LSURDQU5EX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDYKKyNkZWZpbmUgUlRfSU5URVJGQUNFX0RPV04gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDcKKyNkZWZpbmUgUlRfSU5URVJGQUNFX1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDgKKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisjZGVmaW5lIE1BWF9DVVNUT01fTEVOIDEyOAorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCit0eXBlZGVmIGVudW0gX1JUXzgwMl8xMV9EX0NMSUVOVF9NT0RFCit7CisgICBSdDgwMl8xMV9EX05vbmUsCisgICBSdDgwMl8xMV9EX0ZsZXhpYmxlLAorICAgUnQ4MDJfMTFfRF9TdHJpY3QsCit9IFJUXzgwMl8xMV9EX0NMSUVOVF9NT0RFLCAqUFJUXzgwMl8xMV9EX0NMSUVOVF9NT0RFOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCit0eXBlZGVmIHN0cnVjdCBfUlRfQ0hBTk5FTF9MSVNUX0lORk8KK3sKKwlVQ0hBUiBDaGFubmVsTGlzdFtNQVhfTlVNX09GX0NIU107ICAgLy8gbGlzdCBhbGwgc3VwcG9ydGVkIGNoYW5uZWxzIGZvciBzaXRlIHN1cnZleQorCVVDSEFSIENoYW5uZWxMaXN0TnVtOyAvLyBudW1iZXIgb2YgY2hhbm5lbCBpbiBDaGFubmVsTGlzdFtdCit9IFJUX0NIQU5ORUxfTElTVF9JTkZPLCAqUFJUX0NIQU5ORUxfTElTVF9JTkZPOworCisvLyBXU0MgY29uZmlndXJlZCBjcmVkZW50aWFsCit0eXBlZGVmCXN0cnVjdAlfV1NDX0NSRURFTlRJQUwKK3sKKwlORElTXzgwMl8xMV9TU0lECVNTSUQ7CQkJCS8vIG1hbmRhdG9yeQorCVVTSE9SVAkJCQlBdXRoVHlwZTsJCQkvLyBtYW5kYXRvcnksIDE6IG9wZW4sIDI6IHdwYS1wc2ssIDQ6IHNoYXJlZCwgODp3cGEsIDB4MTA6IHdwYTIsIDB4MjA6IHdwYTItcHNrCisJVVNIT1JUCQkJCUVuY3JUeXBlOwkJCS8vIG1hbmRhdG9yeSwgMTogbm9uZSwgMjogd2VwLCA0OiB0a2lwLCA4OiBhZXMKKwlVQ0hBUgkJCQlLZXlbNjRdOwkJCS8vIG1hbmRhdG9yeSwgTWF4aW11bSA2NCBieXRlCisJVVNIT1JUCQkJCUtleUxlbmd0aDsKKwlVQ0hBUgkJCQlNYWNBZGRyWzZdOwkJCS8vIG1hbmRhdG9yeSwgQVAgTUFDIGFkZHJlc3MKKwlVQ0hBUgkJCQlLZXlJbmRleDsJCQkvLyBvcHRpb25hbCwgZGVmYXVsdCBpcyAxCisJVUNIQVIJCQkJUnN2ZFszXTsJCQkvLyBNYWtlIGFsaWdubWVudAorfQlXU0NfQ1JFREVOVElBTCwgKlBXU0NfQ1JFREVOVElBTDsKKworLy8gV1NDIGNvbmZpZ3VyZWQgcHJvZmlsZXMKK3R5cGVkZWYJc3RydWN0CV9XU0NfUFJPRklMRQoreworCVVJTlQJCQlQcm9maWxlQ250OworCVdTQ19DUkVERU5USUFMCVByb2ZpbGVbOF07CQkJCS8vIFN1cHBvcnQgdXAgdG8gOCBwcm9maWxlcworfQlXU0NfUFJPRklMRSwgKlBXU0NfUFJPRklMRTsKKworCisjZW5kaWYgLy8gX09JRF9IXworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0Mjg3MC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydDI4NzAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGFmNGI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydDI4NzAuaApAQCAtMCwwICsxLDc2MSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2lmbmRlZiBfX1JUMjg3MF9IX18KKyNkZWZpbmUgX19SVDI4NzBfSF9fCisKKy8vdXNiIGhlYWRlciBmaWxlcworI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisvKiBydG1wX2RlZi5oICovCisvLworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKyNkZWZpbmUgQlVMS0FHR1JFX1pJU0UgICAgICAgICAgMTAwCisjZGVmaW5lIFJUMjhYWF9EUlZEQVRBX1NFVChfYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Jfc2V0X2ludGZkYXRhKF9hLCBwQWQpOworI2RlZmluZSBSVDI4WFhfUFVUX0RFVklDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNiX3B1dF9kZXYKKyNkZWZpbmUgUlRVU0JfQUxMT0NfVVJCKGlzbykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9hbGxvY191cmIoaXNvLCBHRlBfQVRPTUlDKQorI2RlZmluZSBSVFVTQl9TVUJNSVRfVVJCKHBVcmIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNiX3N1Ym1pdF91cmIocFVyYiwgR0ZQX0FUT01JQykKKyNkZWZpbmUJUlRVU0JfVVJCX0FMTE9DX0JVRkZFUihwVXNiX0RldiwgQnVmU2l6ZSwgcERtYV9hZGRyKSAgICAgICAgICAgICAgIHVzYl9idWZmZXJfYWxsb2MocFVzYl9EZXYsIEJ1ZlNpemUsIEdGUF9BVE9NSUMsIHBEbWFfYWRkcikKKyNkZWZpbmUJUlRVU0JfVVJCX0ZSRUVfQlVGRkVSKHBVc2JfRGV2LCBCdWZTaXplLCBwVHJhbnNmZXJCdWYsIERtYV9hZGRyKSAgIHVzYl9idWZmZXJfZnJlZShwVXNiX0RldiwgQnVmU2l6ZSwgcFRyYW5zZmVyQnVmLCBEbWFfYWRkcikKKyNlbHNlCisjZGVmaW5lIEJVTEtBR0dSRV9aSVNFICAgICAgICAgIDYwCisjZGVmaW5lIFJUMjhYWF9EUlZEQVRBX1NFVChfYSkKKyNkZWZpbmUgUlQyOFhYX1BVVF9ERVZJQ0UoZGV2X3ApCisjZGVmaW5lIFJUVVNCX0FMTE9DX1VSQihpc28pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2JfYWxsb2NfdXJiKGlzbykKKyNkZWZpbmUgUlRVU0JfU1VCTUlUX1VSQihwVXJiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9zdWJtaXRfdXJiKHBVcmIpCisjZGVmaW5lIFJUVVNCX1VSQl9BTExPQ19CVUZGRVIocFVzYl9EZXYsIEJ1ZlNpemUsIHBEbWFfYWRkcikgICAgICAgICAgICAgICBrbWFsbG9jKEJ1ZlNpemUsIEdGUF9BVE9NSUMpCisjZGVmaW5lCVJUVVNCX1VSQl9GUkVFX0JVRkZFUihwVXNiX0RldiwgQnVmU2l6ZSwgcFRyYW5zZmVyQnVmLCBEbWFfYWRkcikgICBrZnJlZShwVHJhbnNmZXJCdWYpCisjZW5kaWYKKworI2RlZmluZSBSWEJVTEtBR0dSRV9aSVNFICAgICAgICAxMgorI2RlZmluZSBNQVhfVFhCVUxLX0xJTUlUICAgICAgICAoTE9DQUxfVFhCVUZfU0laRSooQlVMS0FHR1JFX1pJU0UtMSkpCisjZGVmaW5lIE1BWF9UWEJVTEtfU0laRSAgICAgICAgIChMT0NBTF9UWEJVRl9TSVpFKkJVTEtBR0dSRV9aSVNFKQorI2RlZmluZSBNQVhfUlhCVUxLX1NJWkUgICAgICAgICAoTE9DQUxfVFhCVUZfU0laRSpSWEJVTEtBR0dSRV9aSVNFKQorI2RlZmluZSBNQVhfTUxNRV9IQU5ETEVSX01FTU9SWSAyMAorI2RlZmluZQlSRVRSWV9MSU1JVCAgICAgICAgICAgICAxMAorI2RlZmluZSBCVUZGRVJfU0laRQkJCQkyNDAwCS8vMjA0OAorI2RlZmluZQlUWF9SSU5HCQkJCQkweGEKKyNkZWZpbmUJUFJJT19SSU5HCQkJCTB4YworCisKKy8vIEZsYWdzIGZvciBCdWxrZmxhZ3MgY29udHJvbCBmb3IgYnVsayBvdXQgZGF0YQorLy8KKyNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX0RBVEFfTlVMTAkJCQkweDAwMDAwMDAxCisjZGVmaW5lIGZSVFVTQl9CVUxLX09VVF9SVFMJCQkJCQkweDAwMDAwMDAyCisjZGVmaW5lCWZSVFVTQl9CVUxLX09VVF9NTE1FCQkJCQkweDAwMDAwMDA0CisKKyNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMCQkJCTB4MDAwMTAwMDAKKyNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMXzIJCQkweDAwMDIwMDAwCisjZGVmaW5lCWZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTF8zCQkJMHgwMDA0MDAwMAorI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUxfNAkJCTB4MDAwODAwMDAKKworI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfUFNQT0xMCQkJCQkweDAwMDAwMDIwCisjZGVmaW5lCWZSVFVTQl9CVUxLX09VVF9EQVRBX0ZSQUcJCQkJMHgwMDAwMDA0MAorI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHXzIJCQkJMHgwMDAwMDA4MAorI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHXzMJCQkJMHgwMDAwMDEwMAorI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHXzQJCQkJMHgwMDAwMDIwMAorCisjaWZkZWYgUkFMSU5LX0FURQorI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9BVEUJCQkJMHgwMDEwMDAwMAorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworI2RlZmluZSBSVDI4NzBfVVNCX0RFVklDRVMJXAorewlcCisJe1VTQl9ERVZJQ0UoMHgxNDhGLDB4Mjc3MCl9LCAvKiBSYWxpbmsgKi8JCVwKKwl7VVNCX0RFVklDRSgweDE0OEYsMHgyODcwKX0sIC8qIFJhbGluayAqLwkJXAorCXtVU0JfREVWSUNFKDB4MTQ4RiwweDMwNzApfSwgLyogUmFsaW5rICovCQlcCisJe1VTQl9ERVZJQ0UoMHgwQjA1LDB4MTczMSl9LCAvKiBBc3VzICovCQkJXAorCXtVU0JfREVWSUNFKDB4MEIwNSwweDE3MzIpfSwgLyogQXN1cyAqLwkJCVwKKwl7VVNCX0RFVklDRSgweDBCMDUsMHgxNzQyKX0sIC8qIEFzdXMgKi8JCQlcCisJe1VTQl9ERVZJQ0UoMHgwREY2LDB4MDAxNyl9LCAvKiBTaXRlY29tICovCQlcCisJe1VTQl9ERVZJQ0UoMHgwREY2LDB4MDAyQil9LCAvKiBTaXRlY29tICovCQlcCisJe1VTQl9ERVZJQ0UoMHgwREY2LDB4MDAyQyl9LCAvKiBTaXRlY29tICovCQlcCisJe1VTQl9ERVZJQ0UoMHgwREY2LDB4MDAyRCl9LCAvKiBTaXRlY29tICovCQlcCisJe1VTQl9ERVZJQ0UoMHgxNEIyLDB4M0MwNil9LCAvKiBDb25jZXB0cm9uaWMgKi8JCVwKKwl7VVNCX0RFVklDRSgweDE0QjIsMHgzQzI4KX0sIC8qIENvbmNlcHRyb25pYyAqLwkJXAorCXtVU0JfREVWSUNFKDB4MjAxOSwweEVEMDYpfSwgLyogUGxhbmV4IENvbW11bmljYXRpb25zLCBJbmMuICovCQlcCisJe1VTQl9ERVZJQ0UoMHgyMDE5LDB4QUIyNSl9LCAvKiBQbGFuZXggQ29tbXVuaWNhdGlvbnMsIEluYy4gUlQzMDcwICovCQlcCisJe1VTQl9ERVZJQ0UoMHgwN0QxLDB4M0MwOSl9LCAvKiBELUxpbmsgKi8JCVwKKwl7VVNCX0RFVklDRSgweDA3RDEsMHgzQzExKX0sIC8qIEQtTGluayAqLwkJXAorCXtVU0JfREVWSUNFKDB4MTRCMiwweDNDMDcpfSwgLyogQUwgKi8JCQlcCisJe1VTQl9ERVZJQ0UoMHgxNEIyLDB4M0MxMil9LCAvKiBBTCAqLyAgICAgICAgICAgXAorCXtVU0JfREVWSUNFKDB4MDUwRCwweDgwNTMpfSwgLyogQmVsa2luICovCQlcCisJe1VTQl9ERVZJQ0UoMHgxNEIyLDB4M0MyMyl9LCAvKiBBaXJsaW5rICovCQlcCisJe1VTQl9ERVZJQ0UoMHgxNEIyLDB4M0MyNyl9LCAvKiBBaXJsaW5rICovCQlcCisJe1VTQl9ERVZJQ0UoMHgwN0FBLDB4MDAyRil9LCAvKiBDb3JlZ2EgKi8JCVwKKwl7VVNCX0RFVklDRSgweDA3QUEsMHgwMDNDKX0sIC8qIENvcmVnYSAqLwkJXAorCXtVU0JfREVWSUNFKDB4MDdBQSwweDAwM0YpfSwgLyogQ29yZWdhICovCQlcCisJe1VTQl9ERVZJQ0UoMHgxOEM1LDB4MDAxMil9LCAvKiBDb3JlZ2EgKi8JCVwKKwl7VVNCX0RFVklDRSgweDEwNDQsMHg4MDBCKX0sIC8qIEdpZ2FieXRlICovCQlcCisJe1VTQl9ERVZJQ0UoMHgxNUE5LDB4MDAwNil9LCAvKiBTcGFya2xhbiAqLwkJXAorCXtVU0JfREVWSUNFKDB4MDgzQSwweEI1MjIpfSwgLyogU01DICovCQkJXAorCXtVU0JfREVWSUNFKDB4MDgzQSwweEE2MTgpfSwgLyogU01DICovCQkJXAorCXtVU0JfREVWSUNFKDB4MDgzQSwweDc1MjIpfSwgLyogQXJjYWR5YW4gKi8JCVwKKwl7VVNCX0RFVklDRSgweDBDREUsMHgwMDIyKX0sIC8qIFpDT00gKi8JCQlcCisJe1VTQl9ERVZJQ0UoMHgwNTg2LDB4MzQxNil9LCAvKiBaeXhlbCAqLwkJXAorCXtVU0JfREVWSUNFKDB4MENERSwweDAwMjUpfSwgLyogWnl4ZWwgKi8JCVwKKwl7VVNCX0RFVklDRSgweDE3NDAsMHg5NzAxKX0sIC8qIEVuR2VuaXVzICovCQlcCisJe1VTQl9ERVZJQ0UoMHgxNzQwLDB4OTcwMil9LCAvKiBFbkdlbml1cyAqLwkJXAorCXtVU0JfREVWSUNFKDB4MDQ3MSwweDIwMGYpfSwgLyogUGhpbGlwcyAqLwkJXAorCXtVU0JfREVWSUNFKDB4MTRCMiwweDNDMjUpfSwgLyogRHJheXRlayAqLwkJXAorCXtVU0JfREVWSUNFKDB4MTNEMywweDMyNDcpfSwgLyogQXp1cmVXYXZlICovCVwKKwl7VVNCX0RFVklDRSgweDA4M0EsMHg2NjE4KX0sIC8qIEFjY3RvbiAqLwkJXAorCXtVU0JfREVWSUNFKDB4MTVjNSwweDAwMDgpfSwgLyogQW1pdCAqLwkJCVwKKwl7VVNCX0RFVklDRSgweDBFNjYsMHgwMDAxKX0sIC8qIEhhd2tpbmcgKi8JCVwKKwl7VVNCX0RFVklDRSgweDBFNjYsMHgwMDAzKX0sIC8qIEhhd2tpbmcgKi8JCVwKKwl7VVNCX0RFVklDRSgweDEyOUIsMHgxODI4KX0sIC8qIFNpZW1lbnMgKi8JCVwKKwl7VVNCX0RFVklDRSgweDE1N0UsMHgzMDBFKX0sCS8qIFUtTWVkaWEgKi8JXAorCXtVU0JfREVWSUNFKDB4MDUwZCwweDgwNWMpfSwJCQkJCVwKKwl7VVNCX0RFVklDRSgweDE0ODIsMHgzQzA5KX0sIC8qIEFib2NvbSovCQlcCisJe1VTQl9ERVZJQ0UoMHgxNEIyLDB4M0MwOSl9LCAvKiBBbHBoYSAqLwkJXAorCXtVU0JfREVWSUNFKDB4MDRFOCwweDIwMTgpfSwgLyogc2Ftc3VuZyAqLyAgCVwKKwl7VVNCX0RFVklDRSgweDA3QjgsMHgzMDcwKX0sIC8qIEFib0NvbSAqLwkJXAorCXtVU0JfREVWSUNFKDB4MDdCOCwweDMwNzEpfSwgLyogQWJvQ29tICovCQlcCisJe1VTQl9ERVZJQ0UoMHgwN0I4LDB4Mjg3MCl9LCAvKiBBYm9Db20gKi8JCVwKKwl7VVNCX0RFVklDRSgweDA3QjgsMHgyNzcwKX0sIC8qIEFib0NvbSAqLwkJXAorCXtVU0JfREVWSUNFKDB4NzM5MiwweDc3MTEpfSwgLyogRWRpbWF4ICovCQlcCisJe1VTQl9ERVZJQ0UoMHg1QTU3LDB4MDI4MCl9LCAvKiBaaW53ZWxsICovCQlcCisJe1VTQl9ERVZJQ0UoMHg1QTU3LDB4MDI4Mil9LCAvKiBaaW53ZWxsICovCQlcCisJe1VTQl9ERVZJQ0UoMHgwNzg5LDB4MDE2Mil9LCAvKiBMb2dpdGVjICovCQlcCisJe1VTQl9ERVZJQ0UoMHgwNzg5LDB4MDE2Myl9LCAvKiBMb2dpdGVjICovCQlcCisJe1VTQl9ERVZJQ0UoMHgwNzg5LDB4MDE2NCl9LCAvKiBMb2dpdGVjICovCQlcCisJeyB9LyogVGVybWluYXRpbmcgZW50cnkgKi8gICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lCUZSRUVfSFRUWF9SSU5HKF9wLCBfYiwgX3QpCQkJXAorewkJCQkJCQkJCQlcCisJaWYgKChfdCktPkVOZXh0QnVsa091dFBvc2l0aW9uID09IChfdCktPkN1cldyaXRlUG9zaXRpb24pCQkJCVwKKwl7CQkJCQkJCQkJCQkJCQkJCQlcCisJCShfdCktPmJSaW5nRW1wdHkgPSBUUlVFOwkJCVwKKwl9CQkJCQkJCQkJCQkJCQkJCQlcCisJLypOZGlzSW50ZXJsb2NrZWREZWNyZW1lbnQoJihfcCktPlR4Q291bnQpOyAqL1wKK30KKworLy8KKy8vIFJYSU5GTyBhcHBlbmRzIGF0IHRoZSBlbmQgb2YgZWFjaCByeCBwYWNrZXQuCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCBfUlhJTkZPX1NUUlVDIHsKKwlVSU5UMzIJCVBsY3BTaWduYWw6MTI7CisJVUlOVDMyCQlMYXN0QU1TRFU6MTsKKwlVSU5UMzIJCUNpcGhlckFsZzoxOworCVVJTlQzMgkJUGxjcFJzc2lsOjE7CisJVUlOVDMyCQlEZWNyeXB0ZWQ6MTsKKwlVSU5UMzIJCUFNUERVOjE7CQkvLyBUbyBiZSBtb3ZlZAorCVVJTlQzMgkJTDJQQUQ6MTsKKwlVSU5UMzIJCVJTU0k6MTsKKwlVSU5UMzIJCUhUQzoxOworCVVJTlQzMgkJQU1TRFU6MTsJCS8vIHJ4IHdpdGggODAyLjMgaGVhZGVyLCBub3QgODAyLjExIGhlYWRlci4KKwlVSU5UMzIJCUNpcGhlckVycjoyOyAgICAgICAgLy8gMDogZGVjcnlwdGlvbiBva2F5LCAxOklDViBlcnJvciwgMjpNSUMgZXJyb3IsIDM6S0VZIG5vdCB2YWxpZAorCVVJTlQzMgkJQ3JjOjE7ICAgICAgICAgICAgICAvLyAxOiBDUkMgZXJyb3IKKwlVSU5UMzIJCU15QnNzOjE7ICAJLy8gMTogdGhpcyBmcmFtZSBiZWxvbmdzIHRvIHRoZSBzYW1lIEJTU0lECisJVUlOVDMyCQlCY2FzdDoxOyAgICAgICAgICAgIC8vIDE6IHRoaXMgaXMgYSBicm9hZGNhc3QgZnJhbWUKKwlVSU5UMzIJCU1jYXN0OjE7ICAgICAgICAgICAgLy8gMTogdGhpcyBpcyBhIG11bHRpY2FzdCBmcmFtZQorCVVJTlQzMgkJVTJNOjE7ICAgICAgICAgICAgICAvLyAxOiB0aGlzIFJYIGZyYW1lIGlzIHVuaWNhc3QgdG8gbWUKKwlVSU5UMzIJCUZSQUc6MTsKKwlVSU5UMzIJCU5VTExEQVRBOjE7CisJVUlOVDMyCQlEQVRBOjE7CisJVUlOVDMyCQlCQToxOworfQlSWElORk9fU1RSVUMsICpQUlhJTkZPX1NUUlVDLCBSVDI4WFhfUlhEX1NUUlVDLCAqUFJUMjhYWF9SWERfU1RSVUM7CisjZWxzZQordHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9SWElORk9fU1RSVUMgeworCVVJTlQzMgkJQkE6MTsKKwlVSU5UMzIJCURBVEE6MTsKKwlVSU5UMzIJCU5VTExEQVRBOjE7CisJVUlOVDMyCQlGUkFHOjE7CisJVUlOVDMyCQlVMk06MTsgICAgICAgICAgICAgIC8vIDE6IHRoaXMgUlggZnJhbWUgaXMgdW5pY2FzdCB0byBtZQorCVVJTlQzMgkJTWNhc3Q6MTsgICAgICAgICAgICAvLyAxOiB0aGlzIGlzIGEgbXVsdGljYXN0IGZyYW1lCisJVUlOVDMyCQlCY2FzdDoxOyAgICAgICAgICAgIC8vIDE6IHRoaXMgaXMgYSBicm9hZGNhc3QgZnJhbWUKKwlVSU5UMzIJCU15QnNzOjE7ICAJLy8gMTogdGhpcyBmcmFtZSBiZWxvbmdzIHRvIHRoZSBzYW1lIEJTU0lECisJVUlOVDMyCQlDcmM6MTsgICAgICAgICAgICAgIC8vIDE6IENSQyBlcnJvcgorCVVJTlQzMgkJQ2lwaGVyRXJyOjI7ICAgICAgICAvLyAwOiBkZWNyeXB0aW9uIG9rYXksIDE6SUNWIGVycm9yLCAyOk1JQyBlcnJvciwgMzpLRVkgbm90IHZhbGlkCisJVUlOVDMyCQlBTVNEVToxOwkJLy8gcnggd2l0aCA4MDIuMyBoZWFkZXIsIG5vdCA4MDIuMTEgaGVhZGVyLgorCVVJTlQzMgkJSFRDOjE7CisJVUlOVDMyCQlSU1NJOjE7CisJVUlOVDMyCQlMMlBBRDoxOworCVVJTlQzMgkJQU1QRFU6MTsJCS8vIFRvIGJlIG1vdmVkCisJVUlOVDMyCQlEZWNyeXB0ZWQ6MTsKKwlVSU5UMzIJCVBsY3BSc3NpbDoxOworCVVJTlQzMgkJQ2lwaGVyQWxnOjE7CisJVUlOVDMyCQlMYXN0QU1TRFU6MTsKKwlVSU5UMzIJCVBsY3BTaWduYWw6MTI7Cit9CVJYSU5GT19TVFJVQywgKlBSWElORk9fU1RSVUMsIFJUMjhYWF9SWERfU1RSVUMsICpQUlQyOFhYX1JYRF9TVFJVQzsKKyNlbmRpZgorCisKKy8vCisvLyBUWElORk8KKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZglzdHJ1Y3QJX1RYSU5GT19TVFJVQyB7CisJLy8gV29yZAkwCisJVUlOVDMyCQlVU0JETUFUeGJ1cnN0OjE7Ly91c2VkIE9OTFkgaW4gVVNCIGJ1bGsgQWdncmUuIEZvcmNlIFVTQiBETUEgdHJhbnNtaXQgZnJhbWUgZnJvbSBjdXJyZW50IHNlbGVjdGVkIGVuZHBvaW50CisJVUlOVDMyCQlVU0JETUFOZXh0VkxEOjE7CS8vdXNlZCBPTkxZIGluIFVTQiBidWxrIEFnZ3JlZ2F0aW9uLCBOZXh0VmFsaWQKKwlVSU5UMzIJCXJzdjI6MjsgIC8vIFNvZnR3YXJlIHVzZS4KKwlVSU5UMzIJCVN3VXNlTGFzdFJvdW5kOjE7IC8vIFNvZnR3YXJlIHVzZS4KKwlVSU5UMzIJCVFTRUw6MjsJLy8gc2VsZWN0IG9uLWNoaXAgRklGTyBJRCBmb3IgMm5kLXN0YWdlIG91dHB1dCBzY2hlZHVsZXIuMDpNR01ULCAxOkhDQ0EgMjpFRENBCisJVUlOVDMyCQlXSVY6MTsJLy8gV2lyZWxlc3MgSW5mbyBWYWxpZC4gMSBpZiBEcml2ZXIgYWxyZWFkeSBmaWxsIFdJLCAgbyBpZiBETUEgbmVlZHMgdG8gY29weSBXSSB0byBjb3JyZWN0cG9zaXRpb24KKwlVSU5UMzIJCXJzdjo4OworCVVJTlQzMgkJVVNCRE1BVHhQa3RMZW46MTY7CS8vdXNlZCBPTkxZIGluIFVTQiBidWxrIEFnZ3JlZ2F0aW9uLCAgVG90YWwgYnl0ZSBjb3VudHMgb2YgYWxsIHN1Yi1mcmFtZS4KK30JVFhJTkZPX1NUUlVDLCAqUFRYSU5GT19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXN0cnVjdAlfVFhJTkZPX1NUUlVDIHsKKwkvLyBXb3JkCTAKKwlVSU5UMzIJCVVTQkRNQVR4UGt0TGVuOjE2OwkvL3VzZWQgT05MWSBpbiBVU0IgYnVsayBBZ2dyZWdhdGlvbiwgIFRvdGFsIGJ5dGUgY291bnRzIG9mIGFsbCBzdWItZnJhbWUuCisJVUlOVDMyCQlyc3Y6ODsKKwlVSU5UMzIJCVdJVjoxOwkvLyBXaXJlbGVzcyBJbmZvIFZhbGlkLiAxIGlmIERyaXZlciBhbHJlYWR5IGZpbGwgV0ksICBvIGlmIERNQSBuZWVkcyB0byBjb3B5IFdJIHRvIGNvcnJlY3Rwb3NpdGlvbgorCVVJTlQzMgkJUVNFTDoyOwkvLyBzZWxlY3Qgb24tY2hpcCBGSUZPIElEIGZvciAybmQtc3RhZ2Ugb3V0cHV0IHNjaGVkdWxlci4wOk1HTVQsIDE6SENDQSAyOkVEQ0EKKwlVSU5UMzIJCVN3VXNlTGFzdFJvdW5kOjE7IC8vIFNvZnR3YXJlIHVzZS4KKwlVSU5UMzIJCXJzdjI6MjsgIC8vIFNvZnR3YXJlIHVzZS4KKwlVSU5UMzIJCVVTQkRNQU5leHRWTEQ6MTsJLy91c2VkIE9OTFkgaW4gVVNCIGJ1bGsgQWdncmVnYXRpb24sIE5leHRWYWxpZAorCVVJTlQzMgkJVVNCRE1BVHhidXJzdDoxOy8vdXNlZCBPTkxZIGluIFVTQiBidWxrIEFnZ3JlLiBGb3JjZSBVU0IgRE1BIHRyYW5zbWl0IGZyYW1lIGZyb20gY3VycmVudCBzZWxlY3RlZCBlbmRwb2ludAorfQlUWElORk9fU1RSVUMsICpQVFhJTkZPX1NUUlVDOworI2VuZGlmCisKKyNkZWZpbmUgVFhJTkZPX1NJWkUJCQkJNAorI2RlZmluZSBSWElORk9fU0laRQkJCQk0CisjZGVmaW5lIFRYUEFERElOR19TSVpFCQkJMTEKKworLy8KKy8vIE1hbmFnZW1lbnQgcmluZyBidWZmZXIgZm9ybWF0CisvLwordHlwZWRlZglzdHJ1Y3QJX01HTVRfU1RSVUMJeworCUJPT0xFQU4JCVZhbGlkOworCVBVQ0hBUgkJcEJ1ZmZlcjsKKwlVTE9ORwkJTGVuZ3RoOworfQlNR01UX1NUUlVDLCAqUE1HTVRfU1RSVUM7CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0gRUVQUk9NIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBvZmZzZXQsIHZhcikJCQkJCVwKKwlkbyB7CQkJCQkJCQkJCQkJCQlcCisJCVJUVVNCUmVhZEVFUFJPTShwQWQsIG9mZnNldCwgKFBVQ0hBUikmKHZhciksIDIpOwkJXAorCQl2YXIgPSBsZTJjcHUxNih2YXIpOwkJCQkJCQkJCVwKKwl9d2hpbGUoMCkKKworI2RlZmluZSBSVDI4eHhfRUVQUk9NX1dSSVRFMTYocEFkLCBvZmZzZXQsIHZhcikJCQkJCVwKKwlkb3sJCQkJCQkJCQkJCQkJCQlcCisJCVVTSE9SVCBfdG1wVmFyOwkJCQkJCQkJCQkJXAorCQlfdG1wVmFyID0gY3B1MmxlMTYodmFyKTsJCQkJCQkJCVwKKwkJUlRVU0JXcml0ZUVFUFJPTShwQWQsIG9mZnNldCwgKFBVQ0hBUikmKF90bXBWYXIpLCAyKTsJXAorCX13aGlsZSgwKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLSBUQVNLL1RIUkVBRCBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIFJUMjhYWF9UQVNLX1RIUkVBRF9JTklUKHBBZCwgU3RhdHVzKQkJXAorCVN0YXR1cyA9IENyZWF0ZVRocmVhZHMobmV0X2Rldik7CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0gRnJpbXdhcmUgUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLworI2lmIDAKKyNkZWZpbmUgUlQyOFhYX0ZJUk1VRF9JTklUKHBBZCkJCVwKKwl7CVVJTlQzMglNYWNSZWc7CQkJCVwKKwkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBNQUNfQ1NSMCwgJk1hY1JlZyk7IH0KKworI2RlZmluZSBSVDI4WFhfRklSTVVEX0VORChwQWQpCVwKKwlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCAweDcwMTQsIDB4ZmZmZmZmZmYpOwlcCisJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgMHg3MDFjLCAweGZmZmZmZmZmKTsJXAorCVJUVVNCRmlybXdhcmVSdW4ocEFkKTsKKyNlbHNlCisjZGVmaW5lIFJUMjhYWF9XUklURV9GSVJNV0FSRShfcEFkLCBfcEZ3SW1hZ2UsIF9Gd0xlbikJCVwKKwlSVFVTQkZpcm13YXJlV3JpdGUoX3BBZCwgX3BGd0ltYWdlLCBfRndMZW4pCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0gVFggUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBSVDI4WFhfU1RBUlRfREVRVUVVRShwQWQsIFF1ZUlkeCwgaXJxRmxhZ3MpCQkJCVwKKwkJCXsJCQkJCQkJCQkJCQkJXAorCQkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+RGVRdWV1ZUxvY2tbUXVlSWR4XSwgaXJxRmxhZ3MpOwkJXAorCQkJCWlmIChwQWQtPkRlUXVldWVSdW5uaW5nW1F1ZUlkeF0pCQkJCQkJXAorCQkJCXsJCQkJCQkJCQkJCQkJCVwKKwkJCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkRlUXVldWVMb2NrW1F1ZUlkeF0sIGlycUZsYWdzKTtcCisJCQkJCXByaW50aygiRGVRdWV1ZVJ1bm5pbmdbJWRdPSBUUlVFIVxuIiwgUXVlSWR4KTsJCVwKKwkJCQkJY29udGludWU7CQkJCQkJCQkJCQlcCisJCQkJfQkJCQkJCQkJCQkJCQkJXAorCQkJCWVsc2UJCQkJCQkJCQkJCQkJXAorCQkJCXsJCQkJCQkJCQkJCQkJCVwKKwkJCQkJcEFkLT5EZVF1ZXVlUnVubmluZ1tRdWVJZHhdID0gVFJVRTsJCQkJCVwKKwkJCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkRlUXVldWVMb2NrW1F1ZUlkeF0sIGlycUZsYWdzKTtcCisJCQkJfQkJCQkJCQkJCQkJCQkJXAorCQkJfQorI2RlZmluZSBSVDI4WFhfU1RPUF9ERVFVRVVFKHBBZCwgUXVlSWR4LCBpcnFGbGFncykJCQkJCQlcCisJCQlkb3sJCQkJCQkJCQkJCQkJCQlcCisJCQkJUlRNUF9JUlFfTE9DSygmcEFkLT5EZVF1ZXVlTG9ja1tRdWVJZHhdLCBpcnFGbGFncyk7CQlcCisJCQkJcEFkLT5EZVF1ZXVlUnVubmluZ1tRdWVJZHhdID0gRkFMU0U7CQkJCQlcCisJCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkRlUXVldWVMb2NrW1F1ZUlkeF0sIGlycUZsYWdzKTsJXAorCQkJfXdoaWxlKDApCisKKworI2RlZmluZQlSVDI4WFhfSEFTX0VOT1VHSF9GUkVFX0RFU0MocEFkLCBwVHhCbGssIGZyZWVOdW0sIHBQYWNrZXQpIFwKKwkJKFJUVVNCRnJlZURlc2NyaXB0b3JSZXF1ZXN0KHBBZCwgcFR4QmxrLT5RdWVJZHgsIChwVHhCbGstPlRvdGFsRnJhbWVMZW4gKyBHRVRfT1NfUEtUX0xFTihwUGFja2V0KSkpID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisKKyNkZWZpbmUgUlQyOFhYX1JFTEVBU0VfREVTQ19SRVNPVVJDRShwQWQsIFF1ZUlkeCkJCQlcCisJCWRve313aGlsZSgwKQorCisjZGVmaW5lIE5FRURfUVVFVUVfQkFDS19GT1JfQUdHKF9wQWQsIF9RdWVJZHgsIF9mcmVlTnVtLCBfVHhGcmFtZVR5cGUpIAkJXAorCQkoKF9UeEZyYW1lVHlwZSA9PSBUWF9SQUxJTktfRlJBTUUpICYmIChSVFVTQk5lZWRRdWV1ZUJhY2tGb3JBZ2coX3BBZCwgX1F1ZUlkeCkpKQorCisKKworI2RlZmluZSBmUlRNUF9BREFQVEVSX05FRURfU1RPUF9UWAkJXAorCQkoZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUIHwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwJXAorCQkgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCB8IFwKKwkJIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGIHwgZlJUTVBfQURBUFRFUl9SRU1PVkVfSU5fUFJPR1JFU1MpCisKKworI2RlZmluZSBIQUxfV3JpdGVTdWJUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBiSXNMYXN0LCBwRnJlZU51bWJlcikJXAorCQkJUnRtcFVTQl9Xcml0ZVN1YlR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGJJc0xhc3QsIHBGcmVlTnVtYmVyKQorCisjZGVmaW5lIEhBTF9Xcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssYklzTGFzdCwgcEZyZWVOdW1iZXIpCVwKKwkJCVJ0bXBVU0JfV3JpdGVTaW5nbGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLGJJc0xhc3QsIHBGcmVlTnVtYmVyKQorCisjZGVmaW5lIEhBTF9Xcml0ZUZyYWdUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFnTnVtLCBwRnJlZU51bWJlcikgXAorCQkJUnRtcFVTQl9Xcml0ZUZyYWdUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFnTnVtLCBwRnJlZU51bWJlcikKKworI2RlZmluZSBIQUxfV3JpdGVNdWx0aVR4UmVzb3VyY2UocEFkLCBwVHhCbGssZnJhbWVOdW0sIHBGcmVlTnVtYmVyKQlcCisJCQlSdG1wVVNCX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLGZyYW1lTnVtLCBwRnJlZU51bWJlcikKKworI2RlZmluZSBIQUxfRmluYWxXcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIHRvdGFsTVBEVVNpemUsIFR4SWR4KQlcCisJCQlSdG1wVVNCX0ZpbmFsV3JpdGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLCB0b3RhbE1QRFVTaXplLCBUeElkeCkKKworI2RlZmluZSBIQUxfTGFzdFR4SWR4KHBBZCwgUXVlSWR4LFR4SWR4KSBcCisJCQkvKlJ0bXBVU0JEYXRhTGFzdFR4SWR4KHBBZCwgUXVlSWR4LFR4SWR4KSovCisKKyNkZWZpbmUgSEFMX0tpY2tPdXRUeChwQWQsIHBUeEJsaywgUXVlSWR4KQlcCisJCQlSdG1wVVNCRGF0YUtpY2tPdXQocEFkLCBwVHhCbGssIFF1ZUlkeCkKKworCisjZGVmaW5lIEhBTF9LaWNrT3V0TWdtdFR4KHBBZCwgUXVlSWR4LCBwUGFja2V0LCBwU3JjQnVmVkEsIFNyY0J1ZkxlbikJXAorCQkJUnRtcFVTQk1nbXRLaWNrT3V0KHBBZCwgUXVlSWR4LCBwUGFja2V0LCBwU3JjQnVmVkEsIFNyY0J1ZkxlbikKKworI2RlZmluZSBIQUxfS2lja091dE51bGxGcmFtZVR4KF9wQWQsIF9RdWVJZHgsIF9wTnVsbEZyYW1lLCBfZnJhbWVMZW4pCVwKKwkJCVJ0bXBVU0JOdWxsRnJhbWVLaWNrT3V0KF9wQWQsIF9RdWVJZHgsIF9wTnVsbEZyYW1lLCBfZnJhbWVMZW4pCisKKyNkZWZpbmUgUlRNUF9QS1RfVEFJTF9QQURESU5HIAkxMSAvLyAzKG1heCA0IGJ5dGUgcGFkZGluZykgKyA0IChsYXN0IHBhY2tldCBwYWRkaW5nKSArIDQgKE1heEJ1bGtPdXRzaXplIGFsaWduIHBhZGRpbmcpCisKK2V4dGVybiBVQ0hBUiBFcFRvUXVldWVbNl07CisKKworI2lmZGVmIFJUMjg3MAorI2RlZmluZSBHRVRfVFhSSU5HX0ZSRUVOTyhfcEFkLCBfUXVlSWR4KSAJKF9RdWVJZHgpIC8vKF9wQWQtPlR4UmluZ1tfUXVlSWR4XS5UeFN3RnJlZUlkeCkKKyNkZWZpbmUgR0VUX01HTVRSSU5HX0ZSRUVOTyhfcEFkKSAJCQkoX3BBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHgpCisjZW5kaWYgLy8gUlQyODcwIC8vCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0gUlggUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLworLy8jZGVmaW5lIFJUMjhYWF9SWF9FUlJPUl9DSEVDSwkJCQlSVE1QQ2hlY2tSeFdJCisKKyNpZiAwCisjZGVmaW5lIFJUMjhYWF9SQ1ZfSU5JVChwQWQpCQkJCQlcCisJcEFkLT5UcmFuc2ZlckJ1ZmZlckxlbmd0aCA9IDA7CQkJCVwKKwlwQWQtPlJlYWRQb3NpdGlvbiA9IDA7CQkJCQkJXAorCXBBZC0+cEN1cnJSeENvbnRleHQgPSBOVUxMOworI2VuZGlmCisKKyNkZWZpbmUgUlQyOFhYX1JWX0FMTF9CVUZfRU5EKGJCdWxrUmVjZWl2ZSkJCVwKKwkvKiBXZSByZXR1cm4gU1RBVFVTX01PUkVfUFJPQ0VTU0lOR19SRVFVSVJFRCBzbyB0aGF0IHRoZSBjb21wbGV0aW9uICovCVwKKwkvKiByb3V0aW5lIChJb2ZDb21wbGV0ZVJlcXVlc3QpIHdpbGwgc3RvcCB3b3JraW5nIG9uIHRoZSBpcnAuICovCQlcCisJaWYgKGJCdWxrUmVjZWl2ZSA9PSBUUlVFKQlSVFVTQkJ1bGtSZWNlaXZlKHBBZCk7CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0gQVNJQyBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCisjaWYgMAorI2RlZmluZSBSVDI4WFhfRE1BX1dSSVRFX0lOSVQoR2xvQ2ZnKQkJCVwKKwl7CUdsb0NmZy5maWVsZC5FblRYV3JpdGVCYWNrRERPTkUgPSAxOwlcCisJCUdsb0NmZy5maWVsZC5FbmFibGVSeERNQSA9IDE7CQkJXAorCQlHbG9DZmcuZmllbGQuRW5hYmxlVHhETUEgPSAxOyB9CisKKyNkZWZpbmUgUlQyOFhYX0RNQV9QT1NUX1dSSVRFKF9wQWQpCQkJCVwKKwlkb3sJVVNCX0RNQV9DRkdfU1RSVUMJVXNiQ2ZnOwkJCQlcCisJCVVzYkNmZy53b3JkID0gMDsJCQkJCQlcCisJCS8qIGZvciBsYXN0IHBhY2tldCwgUEJGIG1pZ2h0IHVzZSBtb3JlIHRoYW4gbGltaXRlZCwgc28gbWludXMgMiB0byBwcmV2ZW50IGZyb20gZXJyb3IgKi8gXAorCQlVc2JDZmcuZmllbGQuUnhCdWxrQWdnTG10ID0gKE1BWF9SWEJVTEtfU0laRSAvMTAyNCktMzsJXAorCQlVc2JDZmcuZmllbGQucGh5Y2xlYXIgPSAwOwkJCQkJCQkJXAorCQkvKiB1c2IgdmVyc2lvbiBpcyAxLjEsZG8gbm90IHVzZSBidWxrIGluIGFnZ3JlZ2F0aW9uICovCVwKKwkJaWYgKF9wQWQtPkJ1bGtJbk1heFBhY2tldFNpemUgPT0gNTEyKQkJCQkJXAorCQkJVXNiQ2ZnLmZpZWxkLlJ4QnVsa0FnZ0VuID0gMTsJCQkJCQlcCisJCVVzYkNmZy5maWVsZC5SeEJ1bGtFbiA9IDE7CQkJCQkJCQlcCisJCVVzYkNmZy5maWVsZC5UeEJ1bGtFbiA9IDE7CQkJCQkJCQlcCisJCVVzYkNmZy5maWVsZC5SeEJ1bGtBZ2dUT3V0ID0gMHg4MDsgLyogMjAwNi0xMC0xOCAqLwkJXAorCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIoX3BBZCwgVVNCX0RNQV9DRkcsIFVzYkNmZy53b3JkKTsgCVwKKwl9d2hpbGUoMCkKKyNlbmRpZgorCisvLyByZXNldCBNQUMgb2YgYSBzdGF0aW9uIGVudHJ5IHRvIDB4RkZGRkZGRkZGRkZGCisjZGVmaW5lIFJUMjhYWF9TVEFfRU5UUllfTUFDX1JFU0VUKHBBZCwgV2NpZCkJCQkJCVwKKwl7CVJUX1NFVF9BU0lDX1dDSUQJU2V0QXNpY1djaWQ7CQkJCQkJXAorCQlTZXRBc2ljV2NpZC5XQ0lEID0gV2NpZDsJCQkJCQkJCVwKKwkJU2V0QXNpY1djaWQuU2V0VGlkID0gMHhmZmZmZmZmZjsJCQkJCQlcCisJCVNldEFzaWNXY2lkLkRlbGV0ZVRpZCA9IDB4ZmZmZmZmZmY7CQkJCQkJXAorCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9TRVRfQVNJQ19XQ0lELCAJXAorCQkJCSZTZXRBc2ljV2NpZCwgc2l6ZW9mKFJUX1NFVF9BU0lDX1dDSUQpKTsJfQorCisvLyBhZGQgdGhpcyBlbnRyeSBpbnRvIEFTSUMgUlggV0NJRCBzZWFyY2ggdGFibGUKKyNkZWZpbmUgUlQyOFhYX1NUQV9FTlRSWV9BREQocEFkLCBwRW50cnkpCQkJCQkJCVwKKwlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9TRVRfQ0xJRU5UX01BQ19FTlRSWSwgCVwKKwkJCQkJCQlwRW50cnksIHNpemVvZihNQUNfVEFCTEVfRU5UUlkpKTsKKworLy8gcmVtb3ZlIFBhaXItd2lzZSBrZXkgbWF0ZXJpYWwgZnJvbSBBU0lDCisvLyB5ZXQgaW1wbGVtZW50CisjZGVmaW5lIFJUMjhYWF9TVEFfRU5UUllfS0VZX0RFTChwQWQsIEJzc0lkeCwgV2NpZCkKKworLy8gYWRkIENsaWVudCBzZWN1cml0eSBpbmZvcm1hdGlvbiBpbnRvIEFTSUMgV0NJRCB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKyNkZWZpbmUgUlQyOFhYX1NUQV9TRUNVUklUWV9JTkZPX0FERChwQWQsIGFwaWR4LCBLZXlJRCwgcEVudHJ5KQkJCQkJCVwKKwl7CVJUMjhYWF9TVEFfRU5UUllfTUFDX1JFU0VUKHBBZCwgcEVudHJ5LT5BaWQpOwkJCQkJCQkJXAorCQlpZiAocEVudHJ5LT5BaWQgPj0gMSkgewkJCQkJCQkJCQkJCQkJXAorCQkJUlRfU0VUX0FTSUNfV0NJRF9BVFRSSQlTZXRBc2ljV2NpZEF0dHJpOwkJCQkJCQkJXAorCQkJU2V0QXNpY1djaWRBdHRyaS5XQ0lEID0gcEVudHJ5LT5BaWQ7CQkJCQkJCQkJXAorCQkJaWYgKChwRW50cnktPkF1dGhNb2RlIDw9IE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gpICYmCQkJCVwKKwkJCQkocEVudHJ5LT5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkpCQkJCVwKKwkJCXsJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJU2V0QXNpY1djaWRBdHRyaS5DaXBoZXIgPSBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SURdLkNpcGhlckFsZzsJXAorCQkJfQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCWVsc2UgaWYgKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkJCQkJCVwKKwkJCXsJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJU2V0QXNpY1djaWRBdHRyaS5DaXBoZXIgPSBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SURdLkNpcGhlckFsZzsJXAorCQkJfQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCWVsc2UgU2V0QXNpY1djaWRBdHRyaS5DaXBoZXIgPSAwOwkJCQkJCQkJCQlcCisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJhaWQgY2lwaGVyID0gJWxkXG4iLFNldEFzaWNXY2lkQXR0cmkuQ2lwaGVyKSk7ICAgICAgIFwKKwkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1NFVF9BU0lDX1dDSURfQ0lQSEVSLCAJCQlcCisJCQkJCQkJJlNldEFzaWNXY2lkQXR0cmksIHNpemVvZihSVF9TRVRfQVNJQ19XQ0lEX0FUVFJJKSk7IH0gfQorCisvLyBJbnNlcnQgdGhlIEJBIGJpdG1hcCB0byBBU0lDIGZvciB0aGUgV2NpZCBlbnRyeQorI2RlZmluZSBSVDI4WFhfQUREX0JBX1NFU1NJT05fVE9fQVNJQyhfcEFkLCBfQWlkLCBfVElEKQkJCQkJXAorCQlkb3sJCQkJCQkJCQkJCQkJCQkJXAorCQkJUlRfU0VUX0FTSUNfV0NJRAlTZXRBc2ljV2NpZDsJCQkJCQkJXAorCQkJU2V0QXNpY1djaWQuV0NJRCA9IChfQWlkKTsJCQkJCQkJCQlcCisJCQlTZXRBc2ljV2NpZC5TZXRUaWQgPSAoMHgxMDAwMDw8KF9USUQpKTsJCQkJCQlcCisJCQlTZXRBc2ljV2NpZC5EZWxldGVUaWQgPSAweGZmZmZmZmZmOwkJCQkJCQlcCisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZCgoX3BBZCksIENNRFRIUkVBRF9TRVRfQVNJQ19XQ0lELCAmU2V0QXNpY1djaWQsIHNpemVvZihSVF9TRVRfQVNJQ19XQ0lEKSk7CVwKKwkJfXdoaWxlKDApCisKKy8vIFJlbW92ZSB0aGUgQkEgYml0bWFwIGZyb20gQVNJQyBmb3IgdGhlIFdjaWQgZW50cnkKKyNkZWZpbmUgUlQyOFhYX0RFTF9CQV9TRVNTSU9OX0ZST01fQVNJQyhfcEFkLCBfV2NpZCwgX1RJRCkJCQkJXAorCQlkb3sJCQkJCQkJCQkJCQkJCQkJXAorCQkJUlRfU0VUX0FTSUNfV0NJRAlTZXRBc2ljV2NpZDsJCQkJCQkJXAorCQkJU2V0QXNpY1djaWQuV0NJRCA9IChfV2NpZCk7CQkJCQkJCQkJXAorCQkJU2V0QXNpY1djaWQuU2V0VGlkID0gKDB4ZmZmZmZmZmYpOwkJCQkJCQlcCisJCQlTZXRBc2ljV2NpZC5EZWxldGVUaWQgPSAoMHgxMDAwMDw8KF9USUQpICk7CQkJCQlcCisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZCgoX3BBZCksIENNRFRIUkVBRF9TRVRfQVNJQ19XQ0lELCAmU2V0QXNpY1djaWQsIHNpemVvZihSVF9TRVRfQVNJQ19XQ0lEKSk7CVwKKwkJfXdoaWxlKDApCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0gUENJL1VTQiBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIFJUMjhYWF9IQU5ETEVfREVWX0FTU0lHTihoYW5kbGUsIGRldl9wKQkJCVwKKwkoKFBPU19DT09LSUUpaGFuZGxlKS0+cFVzYl9EZXYgPSBkZXZfcDsKKworLy8gbm8gdXNlCisjZGVmaW5lIFJUMjhYWF9VTk1BUCgpCisjZGVmaW5lIFJUMjhYWF9JUlFfUkVRVUVTVChuZXRfZGV2KQorI2RlZmluZSBSVDI4WFhfSVJRX1JFTEVBU0UobmV0X2RldikKKyNkZWZpbmUgUlQyOFhYX0lSUV9JTklUKHBBZCkKKyNkZWZpbmUgUlQyOFhYX0lSUV9FTkFCTEUocEFkKQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIE1MTUUgUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCkJCQlSVFVTQk1sbWVVcChwQWQpCisKKyNkZWZpbmUgUlQyOFhYX01MTUVfUFJFX1NBTklUWV9DSEVDSyhwQWQpCQkJCQkJCQlcCisJewlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJIYXJkd2FyZVJhZGlvID09IFRSVUUpICYmIAkJCQkJXAorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpICYmCQlcCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkpIHsJXAorCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfQ0hFQ0tfR1BJTywgTlVMTCwgMCk7IH0gfQorCisjZGVmaW5lIFJUMjhYWF9NTE1FX1NUQV9RVUlDS19SU1BfV0FLRV9VUChwQWQpCVwKKwl7CVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1FLRVJJT0RJQ19FWEVDVVQsIE5VTEwsIDApOwlcCisJCVJUVVNCTWxtZVVwKHBBZCk7IH0KKworI2RlZmluZSBSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZCkJXAorCQkgICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9SRVNFVF9DT05GLCAwLCBOVUxMKTsJXAorCQkgICAgICAgIFJUVVNCTWxtZVVwKHBBZCk7CisKKyNkZWZpbmUgUlQyOFhYX0hBTkRMRV9DT1VOVEVSX01FQVNVUkUoX3BBZCwgX3BFbnRyeSkJCVwKKwl7CVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKF9wQWQsIENNRFRIUkVBRF84MDJfMTFfQ09VTlRFUl9NRUFTVVJFLCBfcEVudHJ5LCBzaXplb2YoTUFDX1RBQkxFX0VOVFJZKSk7CVwKKwkJUlRVU0JNbG1lVXAoX3BBZCk7CQkJCQkJCQkJXAorCX0KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLSBQb3dlciBTYXZlIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgUlQyOFhYX1BTX1BPTExfRU5RVUVVRShwQWQpCQkJCQkJXAorCXsJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9QU1BPTEwpOwlcCisJCVJUVVNCS2lja0J1bGtPdXQocEFkKTsgfQorCisjZGVmaW5lIFJUMjh4eF9DSElQX05BTUUgICAgICAgICAgICAiUlQyODcwIgorI2RlZmluZSBVU0JfQ1lDX0NGRyAgICAgICAgICAgICAgICAgMHgwMmE0CisjZGVmaW5lIFNUQVRVU19TVUNDRVNTCQkJCTB4MDAKKyNkZWZpbmUgU1RBVFVTX1VOU1VDQ0VTU0ZVTCAJCTB4MDEKKyNkZWZpbmUgTlRfU1VDQ0VTUyhzdGF0dXMpCQkJKCgoc3RhdHVzKSA+IDApID8gKDEpOigwKSkKKyNkZWZpbmUgSW50ZXJsb2NrZWRJbmNyZW1lbnQgCSAJYXRvbWljX2luYworI2RlZmluZSBOZGlzSW50ZXJsb2NrZWRJbmNyZW1lbnQgCWF0b21pY19pbmMKKyNkZWZpbmUgSW50ZXJsb2NrZWREZWNyZW1lbnQJCWF0b21pY19kZWMKKyNkZWZpbmUgTmRpc0ludGVybG9ja2VkRGVjcmVtZW50IAlhdG9taWNfZGVjCisjZGVmaW5lIEludGVybG9ja2VkRXhjaGFuZ2UJCQlhdG9taWNfc2V0CisvLyNkZWZpbmUgTmRpc01TZW5kQ29tcGxldGUJCQlSVE1QX1NlbmRDb21wbGV0ZQorI2RlZmluZSBOZGlzTUNhbmNlbFRpbWVyCQkJUlRNUENhbmNlbFRpbWVyCisjZGVmaW5lIE5kaXNBbGxvY01lbW9yeShfcHRyLCBfc2l6ZSwgX2ZsYWcpCVwKKwkJCQkJCQkJCWRve19wdHIgPSBrbWFsbG9jKChfc2l6ZSksKF9mbGFnKSk7fXdoaWxlKDApCisjZGVmaW5lIE5kaXNGcmVlTWVtb3J5KGEsIGIsIGMpIAlrZnJlZSgoYSkpCisjZGVmaW5lIE5kaXNNU2xlZXAJCQkJCVJUTVB1c2VjRGVsYXkJCS8qIHVuaXQ6IG1pY3Jvc2Vjb25kICovCisKKworI2RlZmluZSBVU0JEX1RSQU5TRkVSX0RJUkVDVElPTl9PVVQJCTAKKyNkZWZpbmUgVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fSU4JCTAKKyNkZWZpbmUgVVNCRF9TSE9SVF9UUkFOU0ZFUl9PSwkJCTAKKyNkZWZpbmUgUFVSQgkJCXB1cmJiX3QKKworI2RlZmluZSBSVFVTQl9GUkVFX1VSQihwVXJiKQl1c2JfZnJlZV91cmIocFVyYikKKworLy8jdW5kZWYgTWxtZUFsbG9jYXRlTWVtb3J5CisvLyN1bmRlZiBNbG1lRnJlZU1lbW9yeQorCit0eXBlZGVmIGludAkJCQlOVFNUQVRVUzsKK3R5cGVkZWYgc3RydWN0IHVzYl9kZXZpY2UJKiBQVVNCX0RFVjsKKworLyogTUFDUk8gZm9yIGxpbnV4IHVzYiAqLwordHlwZWRlZiBzdHJ1Y3QgdXJiICpwdXJiYl90OwordHlwZWRlZiBzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0IGRldmN0cmxyZXF1ZXN0OworI2RlZmluZSBQSVJQCQlQVk9JRAorI2RlZmluZSBQTURMCQlQVk9JRAorI2RlZmluZSBORElTX09JRAlVSU5UCisjaWZuZGVmIFVTQl9TVF9OT0VSUk9SCisjZGVmaW5lIFVTQl9TVF9OT0VSUk9SICAgICAwCisjZW5kaWYKKworLy8gdmVuZG9yLXNwZWNpZmljIGNvbnRyb2wgb3BlcmF0aW9ucworI2RlZmluZSBDT05UUk9MX1RJTUVPVVRfSklGRklFUyAoICgxMDAgKiBIWikgLyAxMDAwKQorI2RlZmluZSBVTkxJTktfVElNRU9VVF9NUwkJMworCisvKiB1bmxpbmsgdXJiCSovCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiw3KQorI2RlZmluZSBSVFVTQl9VTkxJTktfVVJCKHBVcmIpCQl1c2Jfa2lsbF91cmIocFVyYikKKyNlbHNlCisjZGVmaW5lIFJUVVNCX1VOTElOS19VUkIocFVyYikJCXVzYl91bmxpbmtfdXJiKHBVcmIpCisjZW5kaWYKKworLy8gUHJvdG90eXBlcyBvZiBjb21wbGV0aW9uIGZ1bnVjLgorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorI2RlZmluZSBSVFVTQkJ1bGtPdXREYXRhUGFja2V0Q29tcGxldGUocHVyYiwgcHRfcmVncykgICAgUlRVU0JCdWxrT3V0RGF0YVBhY2tldENvbXBsZXRlKHB1cmIpCisjZGVmaW5lIFJUVVNCQnVsa091dE1MTUVQYWNrZXRDb21wbGV0ZShwVXJiLCBwdF9yZWdzKSAgICBSVFVTQkJ1bGtPdXRNTE1FUGFja2V0Q29tcGxldGUocFVyYikKKyNkZWZpbmUgUlRVU0JCdWxrT3V0TnVsbEZyYW1lQ29tcGxldGUocFVyYiwgcHRfcmVncykgICAgIFJUVVNCQnVsa091dE51bGxGcmFtZUNvbXBsZXRlKHBVcmIpCisjZGVmaW5lIFJUVVNCQnVsa091dFJUU0ZyYW1lQ29tcGxldGUocFVyYiwgcHRfcmVncykgICAgICBSVFVTQkJ1bGtPdXRSVFNGcmFtZUNvbXBsZXRlKHBVcmIpCisjZGVmaW5lIFJUVVNCQnVsa091dFBzUG9sbENvbXBsZXRlKHBVcmIsIHB0X3JlZ3MpICAgICAgICBSVFVTQkJ1bGtPdXRQc1BvbGxDb21wbGV0ZShwVXJiKQorI2RlZmluZSBSVFVTQkJ1bGtSeENvbXBsZXRlKHBVcmIsIHB0X3JlZ3MpICAgICAgICAgICAgICAgUlRVU0JCdWxrUnhDb21wbGV0ZShwVXJiKQorI2VuZGlmCisKKworVk9JRCBSVFVTQkJ1bGtPdXREYXRhUGFja2V0Q29tcGxldGUocHVyYmJfdCBwdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncyk7CitWT0lEIFJUVVNCQnVsa091dE1MTUVQYWNrZXRDb21wbGV0ZShwdXJiYl90IHBVcmIsIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKTsKK1ZPSUQgUlRVU0JCdWxrT3V0TnVsbEZyYW1lQ29tcGxldGUocHVyYmJfdCBwVXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncyk7CitWT0lEIFJUVVNCQnVsa091dFJUU0ZyYW1lQ29tcGxldGUocHVyYmJfdCBwVXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncyk7CitWT0lEIFJUVVNCQnVsa091dFBzUG9sbENvbXBsZXRlKHB1cmJiX3QgcFVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpOworVk9JRCBSVFVTQkJ1bGtSeENvbXBsZXRlKHB1cmJiX3QgcFVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpOworCisKKyNkZWZpbmUgUlRVU0JNbG1lVXAocEFkKQkgICAgICAgIFwKK3sJCQkJCQkJCSAgICBcCisJUE9TX0NPT0tJRSBwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwlcCisJQ0hFQ0tfUElEX0xFR0FMSVRZKHBPYmotPk1MTUVUaHJfcGlkKQkJICAgIFwKKyAgICAgICAgdXAoJihwQWQtPm1sbWVfc2VtYXBob3JlKSk7IFwKK30KKworI2RlZmluZSBSVFVTQkNNRFVwKHBBZCkJICAgICAgICAgICAgICAgIFwKK3sJCQkJCQkJCQkgICAgXAorCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsJXAorCUNIRUNLX1BJRF9MRUdBTElUWShwT2JqLT5SVFVTQkNtZFRocl9waWQpCSAgICBcCisJICAgIHVwKCYocEFkLT5SVFVTQkNtZF9zZW1hcGhvcmUpKTsgXAorfQorCisKK3N0YXRpYyBpbmxpbmUgTkRJU19TVEFUVVMgUlRNUEFsbG9jYXRlTWVtb3J5KAorCU9VVCBQVk9JRCAqcHRyLAorCUlOIHNpemVfdCBzaXplKQoreworCSpwdHIgPSBrbWFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOworCWlmKCpwdHIpCisJCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworCWVsc2UKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKK30KKworLyogcnRtcC5oICovCisjZGVmaW5lCUJFQUNPTl9SSU5HX1NJWkUgICAgICAgICAgICAgICAgMgorI2RlZmluZSBERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VUICAgICAgIDB4NDAKKyNkZWZpbmUgREVWSUNFX1ZFTkRPUl9SRVFVRVNUX0lOICAgICAgICAweGMwCisjZGVmaW5lIElOVEVSRkFDRV9WRU5ET1JfUkVRVUVTVF9PVVQgICAgMHg0MQorI2RlZmluZSBJTlRFUkZBQ0VfVkVORE9SX1JFUVVFU1RfSU4gICAgIDB4YzEKKyNkZWZpbmUgTUdNVFBJUEVJRFgJCQkJCQkwCS8vIEVQNiBpcyBoaWdoZXN0IHByaW9yaXR5CisKKyNkZWZpbmUgQlVMS09VVF9NR01UX1JFU0VUX0ZMQUcJCQkJMHg4MAorCisjZGVmaW5lIFJUVVNCX1NFVF9CVUxLX0ZMQUcoX00sIF9GKQkJCQkoKF9NKS0+QnVsa0ZsYWdzIHw9IChfRikpCisjZGVmaW5lIFJUVVNCX0NMRUFSX0JVTEtfRkxBRyhfTSwgX0YpCQkJKChfTSktPkJ1bGtGbGFncyAmPSB+KF9GKSkKKyNkZWZpbmUgUlRVU0JfVEVTVF9CVUxLX0ZMQUcoX00sIF9GKQkJCSgoKF9NKS0+QnVsa0ZsYWdzICYgKF9GKSkgIT0gMCkKKworI2RlZmluZSBFbnF1ZXVlQ21kKGNtZHEsIGNtZHFlbG10KQkJXAorewkJCQkJCQkJCQlcCisJaWYgKGNtZHEtPnNpemUgPT0gMCkJCQkJXAorCQljbWRxLT5oZWFkID0gY21kcWVsbXQ7CQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJY21kcS0+dGFpbC0+bmV4dCA9IGNtZHFlbG10OwlcCisJY21kcS0+dGFpbCA9IGNtZHFlbG10OwkJCQlcCisJY21kcWVsbXQtPm5leHQgPSBOVUxMOwkJCQlcCisJY21kcS0+c2l6ZSsrOwkJCQkJCVwKK30KKwordHlwZWRlZiBzdHJ1Y3QgICBfUlRfU0VUX0FTSUNfV0NJRCB7CisJVUxPTkcgV0NJRDsgICAgICAgICAgLy8gbWVjaGFuaXNtIGZvciByZWtleWluZzogMDpkaXNhYmxlLCAxOiB0aW1lLWJhc2VkLCAyOiBwYWNrZXQtYmFzZWQKKwlVTE9ORyBTZXRUaWQ7ICAgICAgICAvLyB0aW1lLWJhc2VkOiBzZWNvbmRzLCBwYWNrZXQtYmFzZWQ6IGtpbG8tcGFja2V0cworCVVMT05HIERlbGV0ZVRpZDsgICAgICAgIC8vIHRpbWUtYmFzZWQ6IHNlY29uZHMsIHBhY2tldC1iYXNlZDoga2lsby1wYWNrZXRzCisJVUNIQVIgQWRkcltNQUNfQUREUl9MRU5dOwkvLyBhdm9pZCBpbiBpbnRlcnJ1cHQgd2hlbiB3cml0ZSBrZXkKK30gUlRfU0VUX0FTSUNfV0NJRCwqUFJUX1NFVF9BU0lDX1dDSUQ7CisKK3R5cGVkZWYgc3RydWN0ICAgX1JUX1NFVF9BU0lDX1dDSURfQVRUUkkgeworCVVMT05HCVdDSUQ7ICAgICAgICAgIC8vIG1lY2hhbmlzbSBmb3IgcmVrZXlpbmc6IDA6ZGlzYWJsZSwgMTogdGltZS1iYXNlZCwgMjogcGFja2V0LWJhc2VkCisJVUxPTkcJQ2lwaGVyOyAgICAgICAgLy8gQVNJQyBDaXBoZXIgZGVmaW5pdGlvbgorCVVDSEFSCUFkZHJbRVRIX0xFTkdUSF9PRl9BRERSRVNTXTsKK30gUlRfU0VUX0FTSUNfV0NJRF9BVFRSSSwqUFJUX1NFVF9BU0lDX1dDSURfQVRUUkk7CisKK3R5cGVkZWYgc3RydWN0IF9NTE1FX01FTU9SWV9TVFJVQ1QgeworCVBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2NWYTsgICAgLy9Qb2ludGVyIHRvIHRoZSBiYXNlIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgYWxsb2NhdGVkIG1lbW9yeQorCXN0cnVjdCBfTUxNRV9NRU1PUllfU1RSVUNUICAgICAgKk5leHQ7ICAgICAgLy9Qb2ludGVyIHRvIHRoZSBuZXh0IHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgYWxsb2NhdGVkIG1lbW9yeQorfSAgIE1MTUVfTUVNT1JZX1NUUlVDVCwgKlBNTE1FX01FTU9SWV9TVFJVQ1Q7CisKK3R5cGVkZWYgc3RydWN0ICBfTUxNRV9NRU1PUllfSEFORExFUiB7CisJQk9PTEVBTiAgICAgICAgICAgICAgICAgTWVtUnVubmluZzsgICAgICAgICAvL1RoZSBmbGFnIG9mIHRoZSBNbG1lIG1lbW9yeSBoYW5kbGVyJ3Mgc3RhdHVzCisJVUlOVCAgICAgICAgICAgICAgICAgICAgTWVtb3J5Q291bnQ7ICAgICAgICAvL1RvdGFsIG5vbnBhZ2VkIHN5c3RlbS1zcGFjZSBtZW1vcnkgbm90IHNpemUKKwlVSU5UICAgICAgICAgICAgICAgICAgICBJblVzZUNvdW50OyAgICAgICAgIC8vTm9ucGFnZWQgc3lzdGVtLXNwYWNlIG1lbW9yeSBpbiB1c2VkIGNvdW50cworCVVJTlQgICAgICAgICAgICAgICAgICAgIFVuVXNlQ291bnQ7ICAgICAgICAgLy9Ob25wYWdlZCBzeXN0ZW0tc3BhY2UgbWVtb3J5IGF2YWlsYWJsZSBjb3VudHMKKwlJTlQgICAgICAgICAgICAgICAgICAgIFBlbmRpbmdDb3VudDsgICAgICAgLy9Ob25wYWdlZCBzeXN0ZW0tc3BhY2UgbWVtb3J5IGZvciBmcmVlIGNvdW50cworCVBNTE1FX01FTU9SWV9TVFJVQ1QgICAgIHBJblVzZUhlYWQ7ICAgICAgICAgLy9Qb2ludGVyIHRvIHRoZSBmaXJzdCBub25wYWVkIG1lbW9yeSBub3QgdXNlZAorCVBNTE1FX01FTU9SWV9TVFJVQ1QgICAgIHBJblVzZVRhaWw7ICAgICAgICAgLy9Qb2ludGVyIHRvIHRoZSBsYXN0IG5vbnBhZ2VkIG1lbW9yeSBub3QgdXNlZAorCVBNTE1FX01FTU9SWV9TVFJVQ1QgICAgIHBVblVzZUhlYWQ7ICAgICAgICAgLy9Qb2ludGVyIHRvIHRoZSBmaXJzdCBub25wYWdlZCBtZW1vcnkgaW4gdXNlZAorCVBNTE1FX01FTU9SWV9TVFJVQ1QgICAgIHBVblVzZVRhaWw7ICAgICAgICAgLy9Qb2ludGVyIHRvIHRoZSBsYXN0IG5vbnBhZ2VkIG1lbW9yeSBpbiB1c2VkCisJUFVMT05HICAgICAgICAgICAgICAgICAgTWVtRnJlZVBlbmRpbmdbTUFYX01MTUVfSEFORExFUl9NRU1PUlldOyAgIC8vYW4gYXJyYXkgdG8ga2VlcCBwZW5kaW5nIGZyZWUtbWVtb3J5J3MgcG9pbnRlciAoMzJiaXRzKQorfSAgIE1MTUVfTUVNT1JZX0hBTkRMRVIsICpQTUxNRV9NRU1PUllfSEFORExFUjsKKwordHlwZWRlZglzdHJ1Y3QgX0NtZFFFbG10CXsKKwlVSU5UCQkJCWNvbW1hbmQ7CisJUFZPSUQJCQkJYnVmZmVyOworCVVMT05HCQkJCWJ1ZmZlcmxlbmd0aDsKKwlCT09MRUFOCQkJCUNtZEZyb21OZGlzOworCUJPT0xFQU4JCQkJU2V0T3BlcmF0aW9uOworCXN0cnVjdCBfQ21kUUVsbXQJKm5leHQ7Cit9CUNtZFFFbG10LCAqUENtZFFFbG10OworCit0eXBlZGVmCXN0cnVjdAlfQ21kUQl7CisJVUlOVAkJc2l6ZTsKKwlDbWRRRWxtdAkqaGVhZDsKKwlDbWRRRWxtdAkqdGFpbDsKKwlVSU5UMzIJCUNtZFFTdGF0ZTsKK31DbWRRLCAqUENtZFE7CisKKy8vCisvLyBGb3IgV1BBIFNVUFBMSUNBTlQ6IFdJUkVMRVNTIEVYVCBzdXBwb3J0IHdpcmVsZXNzIGV2ZW50czogdjE0IG9yIG5ld2VyCisvLworI2lmIFdJUkVMRVNTX0VYVCA+PSAxNAorLy8jZGVmaW5lIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgIDEKKyNlbmRpZgorCisvKiBvaWQuaCAqLworLy8gQ2lwaGVyIHN1aXRlIHR5cGUgZm9yIG1peGVkIG1vZGUgZ3JvdXAgY2lwaGVyLCBQODAyLjExaS0yMDA0Cit0eXBlZGVmIGVudW0gX1JUXzgwMl8xMV9DSVBIRVJfU1VJVEVfVFlQRSB7CisJQ2lwaGVyX1R5cGVfTk9ORSwKKwlDaXBoZXJfVHlwZV9XRVA0MCwKKwlDaXBoZXJfVHlwZV9US0lQLAorCUNpcGhlcl9UeXBlX1JTVkQsCisJQ2lwaGVyX1R5cGVfQ0NNUCwKKwlDaXBoZXJfVHlwZV9XRVAxMDQKK30gUlRfODAyXzExX0NJUEhFUl9TVUlURV9UWVBFLCAqUFJUXzgwMl8xMV9DSVBIRVJfU1VJVEVfVFlQRTsKKworLy9DTURUSFJFQURfTVVMVElfUkVBRF9NQUMKKy8vQ01EVEhSRUFEX01VTFRJX1dSSVRFX01BQworLy9DTURUSFJFQURfVkVORE9SX0VFUFJPTV9SRUFECisvL0NNRFRIUkVBRF9WRU5ET1JfRUVQUk9NX1dSSVRFCit0eXBlZGVmCXN0cnVjdAlfQ01ESGFuZGxlcl9UTFYJeworCVVTSE9SVAkJT2Zmc2V0OworCVVTSE9SVAkJTGVuZ3RoOworCVVDSEFSCQlEYXRhRmlyc3Q7Cit9CUNNREhhbmRsZXJfVExWLCAqUENNREhhbmRsZXJfVExWOworCisvLyBOZXcgZm9yIE1lZXRpbmdIb3VzZSBBcGkgc3VwcG9ydAorI2RlZmluZSBDTURUSFJFQURfVkVORE9SX1JFU0VUICAgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAxMDEJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9WRU5ET1JfVU5QTFVHICAgICAgICAgICAgICAgICAgICAgMHgwRDczMDEwMgkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEX1ZFTkRPUl9TV0lUQ0hfRlVOQ1RJT04gICAgICAgICAgICAweDBENzMwMTAzCS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfTVVMVElfV1JJVEVfTUFDICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAxMDcJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9NVUxUSV9SRUFEX01BQyAgICAgICAgICAgICAgICAgICAgMHgwRDczMDEwOAkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEX1ZFTkRPUl9FRVBST01fV1JJVEUgICAgICAgICAgICAgICAweDBENzMwMTBBCS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfVkVORE9SX0VFUFJPTV9SRUFEICAgICAgICAgICAgICAgIDB4MEQ3MzAxMEIJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9WRU5ET1JfRU5URVJfVEVTVE1PREUgICAgICAgICAgICAgMHgwRDczMDEwQwkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEX1ZFTkRPUl9FWElUX1RFU1RNT0RFICAgICAgICAgICAgICAweDBENzMwMTBECS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfVkVORE9SX1dSSVRFX0JCUCAgICAgICAgICAgICAgICAgIDB4MEQ3MzAxMTkJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9WRU5ET1JfUkVBRF9CQlAgICAgICAgICAgICAgICAgICAgMHgwRDczMDExOAkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEX1ZFTkRPUl9XUklURV9SRiAgICAgICAgICAgICAgICAgICAweDBENzMwMTFBCS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfVkVORE9SX0ZMSVBfSVEgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAxMUQJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIxMAkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEX1JFU0VUX0JVTEtfSU4gICAgICAgICAgICAgICAgICAgICAweDBENzMwMjExCS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfU0VUX1BTTV9CSVRfU0FWRSAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMTIJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9TRVRfUkFESU8gICAgICAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIxNAkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEX1VQREFURV9UWF9SQVRFICAgICAgICAgICAgICAgICAgICAweDBENzMwMjE2CS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfODAyXzExX0FERF9LRVlfV0VQICAgICAgICAgICAgICAgIDB4MEQ3MzAyMTgJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9SRVNFVF9GUk9NX0VSUk9SICAgICAgICAgICAgICAgICAgMHgwRDczMDIxQQkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEX0xJTktfRE9XTiAgICAgICAgICAgICAgICAgICAgICAgICAweDBENzMwMjFCCS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfUkVTRVRfRlJPTV9ORElTICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMUMJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9DSEVDS19HUElPICAgICAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIxNQkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEX0ZPUkNFX1dBS0VfVVAgICAgICAgICAgICAgICAgICAgICAweDBENzMwMjIyCS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfU0VUX0JXICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMjUJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9TRVRfQVNJQ19XQ0lEICAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIyNgkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEX1NFVF9BU0lDX1dDSURfQ0lQSEVSICAgICAgICAgICAgICAweDBENzMwMjI3CS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfUUtFUklPRElDX0VYRUNVVCAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyM0QJLy8gY21kCisjZGVmaW5lIFJUX0NNRF9TRVRfS0VZX1RBQkxFICAgICAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIyOCAgLy8gY21kCisjZGVmaW5lIFJUX0NNRF9TRVRfUlhfV0NJRF9UQUJMRSAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIyOSAgLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF9TRVRfQ0xJRU5UX01BQ19FTlRSWSAgICAgICAgICAgICAgMHgwRDczMDIzRQkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEXzgwMl8xMV9RVUVSWV9IQVJEV0FSRV9SRUdJU1RFUiAgICAweDBENzEwMTA1CS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfODAyXzExX1NFVF9QSFlfTU9ERSAgICAgICAgICAgICAgIDB4MEQ3OTAxMEMJLy8gY21kCisjZGVmaW5lIENNRFRIUkVBRF84MDJfMTFfU0VUX1NUQV9DT05GSUcgICAgICAgICAgICAgMHgwRDc5MDExMQkvLyBjbWQKKyNkZWZpbmUgQ01EVEhSRUFEXzgwMl8xMV9TRVRfUFJFQU1CTEUgICAgICAgICAgICAgICAweDBENzkwMTAxCS8vIGNtZAorI2RlZmluZSBDTURUSFJFQURfODAyXzExX0NPVU5URVJfTUVBU1VSRQkJCTB4MEQ3OTAxMDIJLy8gY21kCisKKworI2RlZmluZSBXUEExQUtNQklUCSAgICAweDAxCisjZGVmaW5lIFdQQTJBS01CSVQJICAgIDB4MDIKKyNkZWZpbmUgV1BBMVBTS0FLTUJJVCAgIDB4MDQKKyNkZWZpbmUgV1BBMlBTS0FLTUJJVCAgIDB4MDgKKyNkZWZpbmUgVEtJUEJJVCAgICAgICAgIDB4MDEKKyNkZWZpbmUgQ0NNUEJJVCAgICAgICAgIDB4MDIKKworCisjZGVmaW5lIFJUMjhYWF9TVEFfRk9SQ0VfV0FLRVVQKHBBZCwgYkZyb21UeCkgXAorICAgIFJUMjh4eFVzYlN0YUFzaWNGb3JjZVdha2V1cChwQWQsIGJGcm9tVHgpOworCisjZGVmaW5lIFJUMjhYWF9TVEFfU0xFRVBfVEhFTl9BVVRPX1dBS0VVUChwQWQsIFRidHROdW1Ub05leHRXYWtlVXApIFwKKyAgICBSVDI4eHhVc2JTdGFBc2ljU2xlZXBUaGVuQXV0b1dha2V1cChwQWQsIFRidHROdW1Ub05leHRXYWtlVXApOworCisjZGVmaW5lIFJUMjhYWF9NTE1FX1JBRElPX09OKHBBZCkgXAorICAgIFJUMjh4eFVzYk1sbWVSYWRpb09uKHBBZCk7CisKKyNkZWZpbmUgUlQyOFhYX01MTUVfUkFESU9fT0ZGKHBBZCkgXAorICAgIFJUMjh4eFVzYk1sbWVSYWRpb09GRihwQWQpOworCisjZW5kaWYgLy9fX1JUMjg3MF9IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnQyOHh4LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0Mjh4eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MjdkMjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0Mjh4eC5oCkBAIC0wLDAgKzEsMjY4OSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwlydDI4eHguaAorCisJQWJzdHJhY3Q6CisJUlQyOHh4IEFTSUMgcmVsYXRlZCBkZWZpbml0aW9uICYgc3RydWN0dXJlcworCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkgIFdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgIEphbiBMZWUgICAgICAgICAgIEphbi0zLTIwMDYgICAgIGNyZWF0ZWQgZm9yIFJUMjg2MGMKKyovCisKKyNpZm5kZWYJX19SVDI4WFhfSF9fCisjZGVmaW5lCV9fUlQyOFhYX0hfXworCisKKy8vCisvLyBQQ0kgcmVnaXN0ZXJzIC0gYmFzZSBhZGRyZXNzIDB4MDAwMAorLy8KKyNkZWZpbmUgUENJX0NGRwkJCTB4MDAwMAorI2RlZmluZSBQQ0lfRUVDVFJMCQkJMHgwMDA0CisjZGVmaW5lIFBDSV9NQ1VDVFJMCQkJMHgwMDA4CisKKy8vCisvLyBTQ0gvRE1BIHJlZ2lzdGVycyAtIGJhc2UgYWRkcmVzcyAweDAyMDAKKy8vCisvLyBJTlRfU09VUkNFX0NTUjogSW50ZXJydXB0IHNvdXJjZSByZWdpc3Rlci4gV3JpdGUgb25lIHRvIGNsZWFyIGNvcnJlc3BvbmRpbmcgYml0CisvLworI2RlZmluZSBETUFfQ1NSMCAgICAgIDB4MjAwCisjZGVmaW5lIElOVF9TT1VSQ0VfQ1NSICAgICAgMHgyMDAKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9JTlRfU09VUkNFX0NTUl9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyICAgICAgIAk6MTQ7CisJCVVJTlQzMiAgICAgICAJVHhDb2hlcmVudDoxOworCQlVSU5UMzIgICAgICAgCVJ4Q29oZXJlbnQ6MTsKKwkJVUlOVDMyICAgICAgIAlHUFRpbWVyOjE7CisJCVVJTlQzMiAgICAgICAJQXV0b1dha2V1cDoxOy8vYml0MTQKKwkJVUlOVDMyICAgICAgIAlUWEZpZm9TdGF0dXNJbnQ6MTsvL0ZJRk8gU3RhdGlzdGljcyBpcyBmdWxsLCBzdyBzaG91bGQgcmVhZCAweDE3MWMKKwkJVUlOVDMyICAgICAgIAlQcmVUQlRUOjE7CisJCVVJTlQzMiAgICAgICAJVEJUVEludDoxOworCQlVSU5UMzIgICAgICAgCVJ4VHhDb2hlcmVudDoxOworCQlVSU5UMzIgICAgICAgCU1DVUNvbW1hbmRJTlQ6MTsKKwkJVUlOVDMyICAgICAgIAlNZ210RG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUhjY2FEbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJQWMzRG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUFjMkRtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlBYzFEbWFEb25lOjE7CisJCVVJTlQzMgkJQWMwRG1hRG9uZToxOworCQlVSU5UMzIJCVJ4RG9uZToxOworCQlVSU5UMzIJCVR4RGVsYXlJTlQ6MTsJLy9kZWxheWVkIGludGVycnVwdCwgbm90IGludGVycnVwdCB1bnRpbCBzZXZlcmFsIGludCBvciB0aW1lIGxpbWl0IGhpdAorCQlVSU5UMzIJCVJ4RGVsYXlJTlQ6MTsgLy9kZWFseWVkIGludGVycnVwdAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JSU5UX1NPVVJDRV9DU1JfU1RSVUMsICpQSU5UX1NPVVJDRV9DU1JfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfSU5UX1NPVVJDRV9DU1JfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJUnhEZWxheUlOVDoxOworCQlVSU5UMzIJCVR4RGVsYXlJTlQ6MTsKKwkJVUlOVDMyCQlSeERvbmU6MTsKKwkJVUlOVDMyCQlBYzBEbWFEb25lOjE7Ly80CisJCVVJTlQzMiAgICAgICAJQWMxRG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUFjMkRtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlBYzNEbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJSGNjYURtYURvbmU6MTsgLy8gYml0NworCQlVSU5UMzIgICAgICAgCU1nbXREbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJTUNVQ29tbWFuZElOVDoxOy8vYml0IDkKKwkJVUlOVDMyICAgICAgIAlSeFR4Q29oZXJlbnQ6MTsKKwkJVUlOVDMyICAgICAgIAlUQlRUSW50OjE7CisJCVVJTlQzMiAgICAgICAJUHJlVEJUVDoxOworCQlVSU5UMzIgICAgICAgCVRYRmlmb1N0YXR1c0ludDoxOy8vRklGTyBTdGF0aXN0aWNzIGlzIGZ1bGwsIHN3IHNob3VsZCByZWFkIDB4MTcxYworCQlVSU5UMzIgICAgICAgCUF1dG9XYWtldXA6MTsvL2JpdDE0CisJCVVJTlQzMiAgICAgICAJR1BUaW1lcjoxOworCQlVSU5UMzIgICAgICAgCVJ4Q29oZXJlbnQ6MTsvL2JpdDE2CisJCVVJTlQzMiAgICAgICAJVHhDb2hlcmVudDoxOworCQlVSU5UMzIgICAgICAgCToxNDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9IElOVF9TT1VSQ0VfQ1NSX1NUUlVDLCAqUElOVF9TT1VSQ0VfQ1NSX1NUUlVDOworI2VuZGlmCisKKy8vCisvLyBJTlRfTUFTS19DU1I6ICAgSW50ZXJydXB0IE1BU0sgcmVnaXN0ZXIuICAgMTogdGhlIGludGVycnVwdCBpcyBtYXNrIE9GRgorLy8KKyNkZWZpbmUgSU5UX01BU0tfQ1NSICAgICAgICAweDIwNAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0lOVF9NQVNLX0NTUl9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyICAgICAgIAlUeENvaGVyZW50OjE7CisJCVVJTlQzMiAgICAgICAJUnhDb2hlcmVudDoxOworCQlVSU5UMzIgICAgICAgCToyMDsKKwkJVUlOVDMyICAgICAgIAlNQ1VDb21tYW5kSU5UOjE7CisJCVVJTlQzMiAgICAgICAJTWdtdERtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlIY2NhRG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUFjM0RtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlBYzJEbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJQWMxRG1hRG9uZToxOworCQlVSU5UMzIJCUFjMERtYURvbmU6MTsKKwkJVUlOVDMyCQlSeERvbmU6MTsKKwkJVUlOVDMyCQlUeERlbGF5OjE7CisJCVVJTlQzMgkJUlhEZWxheV9JTlRfTVNLOjE7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfUlOVF9NQVNLX0NTUl9TVFJVQywgKlBJTlRfTUFTS19DU1JfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfSU5UX01BU0tfQ1NSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVJYRGVsYXlfSU5UX01TSzoxOworCQlVSU5UMzIJCVR4RGVsYXk6MTsKKwkJVUlOVDMyCQlSeERvbmU6MTsKKwkJVUlOVDMyCQlBYzBEbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJQWMxRG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCUFjMkRtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlBYzNEbWFEb25lOjE7CisJCVVJTlQzMiAgICAgICAJSGNjYURtYURvbmU6MTsKKwkJVUlOVDMyICAgICAgIAlNZ210RG1hRG9uZToxOworCQlVSU5UMzIgICAgICAgCU1DVUNvbW1hbmRJTlQ6MTsKKwkJVUlOVDMyICAgICAgIAk6MjA7CisJCVVJTlQzMiAgICAgICAJUnhDb2hlcmVudDoxOworCQlVSU5UMzIgICAgICAgCVR4Q29oZXJlbnQ6MTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9IElOVF9NQVNLX0NTUl9TVFJVQywgKlBJTlRfTUFTS19DU1JfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgV1BETUFfR0xPX0NGRyAJMHgyMDgKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9XUERNQV9HTE9fQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIgICAgICAgCUhEUl9TRUdfTEVOOjE2OworCQlVSU5UMzIgICAgICAgCVJYSGRyU2NhdGVyOjg7CisJCVVJTlQzMiAgICAgICAJQmlnRW5kaWFuOjE7CisJCVVJTlQzMiAgICAgICAJRW5UWFdyaXRlQmFja0RET05FOjE7CisJCVVJTlQzMiAgICAgICAJV1BETUFCdXJzdFNJWkU6MjsKKwkJVUlOVDMyCQlSeERNQUJ1c3k6MTsKKwkJVUlOVDMyCQlFbmFibGVSeERNQToxOworCQlVSU5UMzIJCVR4RE1BQnVzeToxOworCQlVSU5UMzIJCUVuYWJsZVR4RE1BOjE7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfVdQRE1BX0dMT19DRkdfU1RSVUMsICpQV1BETUFfR0xPX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9XUERNQV9HTE9fQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCUVuYWJsZVR4RE1BOjE7CisJCVVJTlQzMgkJVHhETUFCdXN5OjE7CisJCVVJTlQzMgkJRW5hYmxlUnhETUE6MTsKKwkJVUlOVDMyCQlSeERNQUJ1c3k6MTsKKwkJVUlOVDMyICAgICAgIAlXUERNQUJ1cnN0U0laRToyOworCQlVSU5UMzIgICAgICAgCUVuVFhXcml0ZUJhY2tERE9ORToxOworCQlVSU5UMzIgICAgICAgCUJpZ0VuZGlhbjoxOworCQlVSU5UMzIgICAgICAgCVJYSGRyU2NhdGVyOjg7CisJCVVJTlQzMiAgICAgICAJSERSX1NFR19MRU46MTY7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfSBXUERNQV9HTE9fQ0ZHX1NUUlVDLCAqUFdQRE1BX0dMT19DRkdfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgV1BETUFfUlNUX0lEWCAJMHgyMGMKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9XUERNQV9SU1RfSURYX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIgICAgICAgCToxNTsKKwkJVUlOVDMyICAgICAgIAlSU1RfRFJYX0lEWDA6MTsKKwkJVUlOVDMyICAgICAgIAlyc3Y6MTA7CisJCVVJTlQzMiAgICAgICAJUlNUX0RUWF9JRFg1OjE7CisJCVVJTlQzMiAgICAgICAJUlNUX0RUWF9JRFg0OjE7CisJCVVJTlQzMgkJUlNUX0RUWF9JRFgzOjE7CisJCVVJTlQzMgkJUlNUX0RUWF9JRFgyOjE7CisJCVVJTlQzMgkJUlNUX0RUWF9JRFgxOjE7CisJCVVJTlQzMgkJUlNUX0RUWF9JRFgwOjE7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfVdQRE1BX1JTVF9JRFhfU1RSVUMsICpQV1BETUFfUlNUX0lEWF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9XUERNQV9SU1RfSURYX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVJTVF9EVFhfSURYMDoxOworCQlVSU5UMzIJCVJTVF9EVFhfSURYMToxOworCQlVSU5UMzIJCVJTVF9EVFhfSURYMjoxOworCQlVSU5UMzIJCVJTVF9EVFhfSURYMzoxOworCQlVSU5UMzIgICAgICAgCVJTVF9EVFhfSURYNDoxOworCQlVSU5UMzIgICAgICAgCVJTVF9EVFhfSURYNToxOworCQlVSU5UMzIgICAgICAgCXJzdjoxMDsKKwkJVUlOVDMyICAgICAgIAlSU1RfRFJYX0lEWDA6MTsKKwkJVUlOVDMyICAgICAgIAk6MTU7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfSBXUERNQV9SU1RfSURYX1NUUlVDLCAqUFdQRE1BX1JTVF9JRFhfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgREVMQVlfSU5UX0NGRyAgMHgwMjEwCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfREVMQVlfSU5UX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyICAgICAgIAlUWERMWV9JTlRfRU46MTsKKwkJVUlOVDMyICAgICAgIAlUWE1BWF9QSU5UOjc7CisJCVVJTlQzMiAgICAgICAJVFhNQVhfUFRJTUU6ODsKKwkJVUlOVDMyICAgICAgIAlSWERMWV9JTlRfRU46MTsKKwkJVUlOVDMyICAgICAgIAlSWE1BWF9QSU5UOjc7CisJCVVJTlQzMgkJUlhNQVhfUFRJTUU6ODsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9REVMQVlfSU5UX0NGR19TVFJVQywgKlBERUxBWV9JTlRfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0RFTEFZX0lOVF9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJUlhNQVhfUFRJTUU6ODsKKwkJVUlOVDMyICAgICAgIAlSWE1BWF9QSU5UOjc7CisJCVVJTlQzMiAgICAgICAJUlhETFlfSU5UX0VOOjE7CisJCVVJTlQzMiAgICAgICAJVFhNQVhfUFRJTUU6ODsKKwkJVUlOVDMyICAgICAgIAlUWE1BWF9QSU5UOjc7CisJCVVJTlQzMiAgICAgICAJVFhETFlfSU5UX0VOOjE7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfSBERUxBWV9JTlRfQ0ZHX1NUUlVDLCAqUERFTEFZX0lOVF9DRkdfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgV01NX0FJRlNOX0NGRyAgIDB4MDIxNAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0FJRlNOX0NTUl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgUnN2OjE2OworCSAgICBVSU5UMzIgICBBaWZzbjM6NDsgICAgICAgLy8gZm9yIEFDX1ZPCisJICAgIFVJTlQzMiAgIEFpZnNuMjo0OyAgICAgICAvLyBmb3IgQUNfVkkKKwkgICAgVUlOVDMyICAgQWlmc24xOjQ7ICAgICAgIC8vIGZvciBBQ19CSworCSAgICBVSU5UMzIgICBBaWZzbjA6NDsgICAgICAgLy8gZm9yIEFDX0JFCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlBSUZTTl9DU1JfU1RSVUMsICpQQUlGU05fQ1NSX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0FJRlNOX0NTUl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgQWlmc24wOjQ7ICAgICAgIC8vIGZvciBBQ19CRQorCSAgICBVSU5UMzIgICBBaWZzbjE6NDsgICAgICAgLy8gZm9yIEFDX0JLCisJICAgIFVJTlQzMiAgIEFpZnNuMjo0OyAgICAgICAvLyBmb3IgQUNfVkkKKwkgICAgVUlOVDMyICAgQWlmc24zOjQ7ICAgICAgIC8vIGZvciBBQ19WTworCSAgICBVSU5UMzIgICBSc3Y6MTY7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlBSUZTTl9DU1JfU1RSVUMsICpQQUlGU05fQ1NSX1NUUlVDOworI2VuZGlmCisvLworLy8gQ1dNSU5fQ1NSOiBDV21pbiBmb3IgZWFjaCBFRENBIEFDCisvLworI2RlZmluZSBXTU1fQ1dNSU5fQ0ZHICAgMHgwMjE4CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfQ1dNSU5fQ1NSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICBSc3Y6MTY7CisJICAgIFVJTlQzMiAgIEN3bWluMzo0OyAgICAgICAvLyBmb3IgQUNfVk8KKwkgICAgVUlOVDMyICAgQ3dtaW4yOjQ7ICAgICAgIC8vIGZvciBBQ19WSQorCSAgICBVSU5UMzIgICBDd21pbjE6NDsgICAgICAgLy8gZm9yIEFDX0JLCisJICAgIFVJTlQzMiAgIEN3bWluMDo0OyAgICAgICAvLyBmb3IgQUNfQkUKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUNXTUlOX0NTUl9TVFJVQywgKlBDV01JTl9DU1JfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfQ1dNSU5fQ1NSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICBDd21pbjA6NDsgICAgICAgLy8gZm9yIEFDX0JFCisJICAgIFVJTlQzMiAgIEN3bWluMTo0OyAgICAgICAvLyBmb3IgQUNfQksKKwkgICAgVUlOVDMyICAgQ3dtaW4yOjQ7ICAgICAgIC8vIGZvciBBQ19WSQorCSAgICBVSU5UMzIgICBDd21pbjM6NDsgICAgICAgLy8gZm9yIEFDX1ZPCisJICAgIFVJTlQzMiAgIFJzdjoxNjsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUNXTUlOX0NTUl9TVFJVQywgKlBDV01JTl9DU1JfU1RSVUM7CisjZW5kaWYKKworLy8KKy8vIENXTUFYX0NTUjogQ1dtaW4gZm9yIGVhY2ggRURDQSBBQworLy8KKyNkZWZpbmUgV01NX0NXTUFYX0NGRyAgIDB4MDIxYworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0NXTUFYX0NTUl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgUnN2OjE2OworCSAgICBVSU5UMzIgICBDd21heDM6NDsgICAgICAgLy8gZm9yIEFDX1ZPCisJICAgIFVJTlQzMiAgIEN3bWF4Mjo0OyAgICAgICAvLyBmb3IgQUNfVkkKKwkgICAgVUlOVDMyICAgQ3dtYXgxOjQ7ICAgICAgIC8vIGZvciBBQ19CSworCSAgICBVSU5UMzIgICBDd21heDA6NDsgICAgICAgLy8gZm9yIEFDX0JFCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlDV01BWF9DU1JfU1RSVUMsICpQQ1dNQVhfQ1NSX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0NXTUFYX0NTUl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgQ3dtYXgwOjQ7ICAgICAgIC8vIGZvciBBQ19CRQorCSAgICBVSU5UMzIgICBDd21heDE6NDsgICAgICAgLy8gZm9yIEFDX0JLCisJICAgIFVJTlQzMiAgIEN3bWF4Mjo0OyAgICAgICAvLyBmb3IgQUNfVkkKKwkgICAgVUlOVDMyICAgQ3dtYXgzOjQ7ICAgICAgIC8vIGZvciBBQ19WTworCSAgICBVSU5UMzIgICBSc3Y6MTY7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlDV01BWF9DU1JfU1RSVUMsICpQQ1dNQVhfQ1NSX1NUUlVDOworI2VuZGlmCisKKworLy8KKy8vIEFDX1RYT1BfQ1NSMDogQUNfQksvQUNfQkUgVFhPUCByZWdpc3RlcgorLy8KKyNkZWZpbmUgV01NX1RYT1AwX0NGRyAgICAweDAyMjAKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9BQ19UWE9QX0NTUjBfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWMxVHhvcDsgICAgICAgIC8vIGZvciBBQ19CRSwgaW4gdW5pdCBvZiAzMnVzCisJICAgIFVTSE9SVCAgQWMwVHhvcDsgICAgICAgIC8vIGZvciBBQ19CSywgaW4gdW5pdCBvZiAzMnVzCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlBQ19UWE9QX0NTUjBfU1RSVUMsICpQQUNfVFhPUF9DU1IwX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0FDX1RYT1BfQ1NSMF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBYzBUeG9wOyAgICAgICAgLy8gZm9yIEFDX0JLLCBpbiB1bml0IG9mIDMydXMKKwkgICAgVVNIT1JUICBBYzFUeG9wOyAgICAgICAgLy8gZm9yIEFDX0JFLCBpbiB1bml0IG9mIDMydXMKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUFDX1RYT1BfQ1NSMF9TVFJVQywgKlBBQ19UWE9QX0NTUjBfU1RSVUM7CisjZW5kaWYKKworLy8KKy8vIEFDX1RYT1BfQ1NSMTogQUNfVk8vQUNfVkkgVFhPUCByZWdpc3RlcgorLy8KKyNkZWZpbmUgV01NX1RYT1AxX0NGRyAgICAweDAyMjQKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9BQ19UWE9QX0NTUjFfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWMzVHhvcDsgICAgICAgIC8vIGZvciBBQ19WTywgaW4gdW5pdCBvZiAzMnVzCisJICAgIFVTSE9SVCAgQWMyVHhvcDsgICAgICAgIC8vIGZvciBBQ19WSSwgaW4gdW5pdCBvZiAzMnVzCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlBQ19UWE9QX0NTUjFfU1RSVUMsICpQQUNfVFhPUF9DU1IxX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0FDX1RYT1BfQ1NSMV9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBYzJUeG9wOyAgICAgICAgLy8gZm9yIEFDX1ZJLCBpbiB1bml0IG9mIDMydXMKKwkgICAgVVNIT1JUICBBYzNUeG9wOyAgICAgICAgLy8gZm9yIEFDX1ZPLCBpbiB1bml0IG9mIDMydXMKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUFDX1RYT1BfQ1NSMV9TVFJVQywgKlBBQ19UWE9QX0NTUjFfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgUklOR1JFR19ESUZGCQkJMHgxMAorI2RlZmluZSBHUElPX0NUUkxfQ0ZHICAgIDB4MDIyOAkvL01BQ19DU1IxMworI2RlZmluZSBNQ1VfQ01EX0NGRyAgICAweDAyMmMKKyNkZWZpbmUgVFhfQkFTRV9QVFIwICAgICAweDAyMzAJLy9BQ19CSyBiYXNlIGFkZHJlc3MKKyNkZWZpbmUgVFhfTUFYX0NOVDAgICAgICAweDAyMzQKKyNkZWZpbmUgVFhfQ1RYX0lEWDAgICAgICAgMHgwMjM4CisjZGVmaW5lIFRYX0RUWF9JRFgwICAgICAgMHgwMjNjCisjZGVmaW5lIFRYX0JBU0VfUFRSMSAgICAgMHgwMjQwIAkvL0FDX0JFIGJhc2UgYWRkcmVzcworI2RlZmluZSBUWF9NQVhfQ05UMSAgICAgIDB4MDI0NAorI2RlZmluZSBUWF9DVFhfSURYMSAgICAgICAweDAyNDgKKyNkZWZpbmUgVFhfRFRYX0lEWDEgICAgICAweDAyNGMKKyNkZWZpbmUgVFhfQkFTRV9QVFIyICAgICAweDAyNTAgCS8vQUNfVkkgYmFzZSBhZGRyZXNzCisjZGVmaW5lIFRYX01BWF9DTlQyICAgICAgMHgwMjU0CisjZGVmaW5lIFRYX0NUWF9JRFgyICAgICAgIDB4MDI1OAorI2RlZmluZSBUWF9EVFhfSURYMiAgICAgIDB4MDI1YworI2RlZmluZSBUWF9CQVNFX1BUUjMgICAgIDB4MDI2MCAJLy9BQ19WTyBiYXNlIGFkZHJlc3MKKyNkZWZpbmUgVFhfTUFYX0NOVDMgICAgICAweDAyNjQKKyNkZWZpbmUgVFhfQ1RYX0lEWDMgICAgICAgMHgwMjY4CisjZGVmaW5lIFRYX0RUWF9JRFgzICAgICAgMHgwMjZjCisjZGVmaW5lIFRYX0JBU0VfUFRSNCAgICAgMHgwMjcwIAkvL0hDQ0EgYmFzZSBhZGRyZXNzCisjZGVmaW5lIFRYX01BWF9DTlQ0ICAgICAgMHgwMjc0CisjZGVmaW5lIFRYX0NUWF9JRFg0ICAgICAgIDB4MDI3OAorI2RlZmluZSBUWF9EVFhfSURYNCAgICAgIDB4MDI3YworI2RlZmluZSBUWF9CQVNFX1BUUjUgICAgIDB4MDI4MCAJLy9NR01UIGJhc2UgYWRkcmVzcworI2RlZmluZSAgVFhfTUFYX0NOVDUgICAgIDB4MDI4NAorI2RlZmluZSBUWF9DVFhfSURYNSAgICAgICAweDAyODgKKyNkZWZpbmUgVFhfRFRYX0lEWDUgICAgICAweDAyOGMKKyNkZWZpbmUgVFhfTUdNVE1BWF9DTlQgICAgICBUWF9NQVhfQ05UNQorI2RlZmluZSBUWF9NR01UQ1RYX0lEWCAgICAgICBUWF9DVFhfSURYNQorI2RlZmluZSBUWF9NR01URFRYX0lEWCAgICAgIFRYX0RUWF9JRFg1CisjZGVmaW5lIFJYX0JBU0VfUFRSICAgICAweDAyOTAgCS8vUlggYmFzZSBhZGRyZXNzCisjZGVmaW5lIFJYX01BWF9DTlQgICAgICAweDAyOTQKKyNkZWZpbmUgUlhfQ1JYX0lEWCAgICAgICAweDAyOTgKKyNkZWZpbmUgUlhfRFJYX0lEWCAgICAgIDB4MDI5YworI2RlZmluZSBVU0JfRE1BX0NGRyAgICAgIDB4MDJhMAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1VTQl9ETUFfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgIFR4QnVzeToxOyAgIAkvL1VTQiBETUEgVFggRlNNIGJ1c3kgLiBkZWJ1ZyBvbmx5CisJICAgIFVJTlQzMiAgUnhCdXN5OjE7ICAgICAgICAvL1VTQiBETUEgUlggRlNNIGJ1c3kgLiBkZWJ1ZyBvbmx5CisJICAgIFVJTlQzMiAgRXBvdXRWYWxpZDo2OyAgICAgICAgLy9PVVQgZW5kcG9pbnQgZGF0YSB2YWxpZC4gZGVidWcgb25seQorCSAgICBVSU5UMzIgIFR4QnVsa0VuOjE7ICAgICAgICAvL0VuYWJsZSBVU0IgRE1BIFR4CisJICAgIFVJTlQzMiAgUnhCdWxrRW46MTsgICAgICAgIC8vRW5hYmxlIFVTQiBETUEgUngKKwkgICAgVUlOVDMyICBSeEJ1bGtBZ2dFbjoxOyAgICAgICAgLy9FbmFibGUgUnggQnVsayBBZ2dyZWdhdGlvbgorCSAgICBVSU5UMzIgIFR4b3BIYWx0OjE7ICAgICAgICAvL0hhbHQgVFhPUCBjb3VudCBkb3duIHdoZW4gVFggYnVmZmVyIGlzIGZ1bGwuCisJICAgIFVJTlQzMiAgVHhDbGVhcjoxOyAgICAgICAgLy9DbGVhciBVU0IgRE1BIFRYIHBhdGgKKwkgICAgVUlOVDMyICByc3Y6MjsKKwkgICAgVUlOVDMyICBwaHljbGVhcjoxOyAgICAgICAgCQkvL3BoeSB3YXRjaCBkb2cgZW5hYmxlLiB3cml0ZSAxCisJICAgIFVJTlQzMiAgUnhCdWxrQWdnTG10Ojg7ICAgICAgICAvL1J4IEJ1bGsgQWdncmVnYXRpb24gTGltaXQgIGluIHVuaXQgb2YgMTAyNCBieXRlcworCSAgICBVSU5UMzIgIFJ4QnVsa0FnZ1RPdXQ6ODsgICAgICAgIC8vUnggQnVsayBBZ2dyZWdhdGlvbiBUaW1lT3V0ICBpbiB1bml0IG9mIDMzbnMKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVVTQl9ETUFfQ0ZHX1NUUlVDLCAqUFVTQl9ETUFfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1VTQl9ETUFfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgIFJ4QnVsa0FnZ1RPdXQ6ODsgICAgICAgIC8vUnggQnVsayBBZ2dyZWdhdGlvbiBUaW1lT3V0ICBpbiB1bml0IG9mIDMzbnMKKwkgICAgVUlOVDMyICBSeEJ1bGtBZ2dMbXQ6ODsgICAgICAgIC8vUnggQnVsayBBZ2dyZWdhdGlvbiBMaW1pdCAgaW4gdW5pdCBvZiAyNTYgYnl0ZXMKKwkgICAgVUlOVDMyICBwaHljbGVhcjoxOyAgICAgICAgCQkvL3BoeSB3YXRjaCBkb2cgZW5hYmxlLiB3cml0ZSAxCisJICAgIFVJTlQzMiAgcnN2OjI7CisJICAgIFVJTlQzMiAgVHhDbGVhcjoxOyAgICAgICAgLy9DbGVhciBVU0IgRE1BIFRYIHBhdGgKKwkgICAgVUlOVDMyICBUeG9wSGFsdDoxOyAgICAgICAgLy9IYWx0IFRYT1AgY291bnQgZG93biB3aGVuIFRYIGJ1ZmZlciBpcyBmdWxsLgorCSAgICBVSU5UMzIgIFJ4QnVsa0FnZ0VuOjE7ICAgICAgICAvL0VuYWJsZSBSeCBCdWxrIEFnZ3JlZ2F0aW9uCisJICAgIFVJTlQzMiAgUnhCdWxrRW46MTsgICAgICAgIC8vRW5hYmxlIFVTQiBETUEgUngKKwkgICAgVUlOVDMyICBUeEJ1bGtFbjoxOyAgICAgICAgLy9FbmFibGUgVVNCIERNQSBUeAorCSAgICBVSU5UMzIgIEVwb3V0VmFsaWQ6NjsgICAgICAgIC8vT1VUIGVuZHBvaW50IGRhdGEgdmFsaWQKKwkgICAgVUlOVDMyICBSeEJ1c3k6MTsgICAgICAgIC8vVVNCIERNQSBSWCBGU00gYnVzeQorCSAgICBVSU5UMzIgIFR4QnVzeToxOyAgIAkvL1VTQiBETUEgVFggRlNNIGJ1c3kKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVVTQl9ETUFfQ0ZHX1NUUlVDLCAqUFVTQl9ETUFfQ0ZHX1NUUlVDOworI2VuZGlmCisKKy8vCisvLyAgMyAgUEJGICByZWdpc3RlcnMKKy8vCisvLworLy8gTW9zdCBhcmUgZm9yIGRlYnVnLiBEcml2ZXIgZG9lc24ndCB0b3VjaCBQQkYgcmVnaXN0ZXIuCisjZGVmaW5lIAlQQkZfU1lTX0NUUkwgCSAweDA0MDAKKyNkZWZpbmUgICAgIFBCRl9DRkcgICAgICAgICAgICAgICAgIDB4MDQwOAorI2RlZmluZSAJUEJGX01BWF9QQ05UIAkgMHgwNDBDCisjZGVmaW5lIAlQQkZfQ1RSTAkgCTB4MDQxMAorI2RlZmluZSAJUEJGX0lOVF9TVEEJIDB4MDQxNAorI2RlZmluZSAJUEJGX0lOVF9FTkEJIDB4MDQxOAorI2RlZmluZSAJVFhSWFFfUENOVCAgCSAweDA0MzgKKyNkZWZpbmUgCVBCRl9EQkcgCSAJIDB4MDQzYworI2RlZmluZSAgICAgUEJGX0NBUF9DVFJMICAgICAweDA0NDAKKworLy8KKy8vICA0ICBNQUMgIHJlZ2lzdGVycworLy8KKy8vCisvLyAgNC4xIE1BQyBTWVNURU0gIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIChvZmZzZXQ6MHgxMDAwKQorLy8KKyNkZWZpbmUgTUFDX0NTUjAgICAgICAgICAgICAweDEwMDAKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9BU0lDX1ZFUl9JRF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBU0lDVmVyOyAgICAgICAgLy8gdmVyc2lvbiA6IDI4NjAKKwkgICAgVVNIT1JUICBBU0lDUmV2OyAgICAgICAgLy8gcmV2ZXJzaW9uICA6IDAKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUFTSUNfVkVSX0lEX1NUUlVDLCAqUEFTSUNfVkVSX0lEX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0FTSUNfVkVSX0lEX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFTSUNSZXY7ICAgICAgICAvLyByZXZlcnNpb24gIDogMAorCSAgICBVU0hPUlQgIEFTSUNWZXI7ICAgICAgICAvLyB2ZXJzaW9uIDogMjg2MAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQVNJQ19WRVJfSURfU1RSVUMsICpQQVNJQ19WRVJfSURfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgTUFDX1NZU19DVFJMICAgICAgICAgICAgMHgxMDA0CQkvL01BQ19DU1IxCisjZGVmaW5lIE1BQ19BRERSX0RXMCAgICAgICAgICAgIAkJMHgxMDA4CQkvLyBNQUMgQUREUiBEVzAKKyNkZWZpbmUgTUFDX0FERFJfRFcxICAgICAgICAgICAJCSAweDEwMGMJCS8vIE1BQyBBRERSIERXMQorLy8KKy8vIE1BQ19DU1IyOiBTVEEgTUFDIHJlZ2lzdGVyIDAKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfTUFDX0RXMF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUNIQVIJCUJ5dGUzOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAzCisJCVVDSEFSCQlCeXRlMjsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMgorCQlVQ0hBUgkJQnl0ZTE7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDEKKwkJVUNIQVIJCUJ5dGUwOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAwCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlNQUNfRFcwX1NUUlVDLCAqUE1BQ19EVzBfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfTUFDX0RXMF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUNIQVIJCUJ5dGUwOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAwCisJCVVDSEFSCQlCeXRlMTsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMQorCQlVQ0hBUgkJQnl0ZTI7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDIKKwkJVUNIQVIJCUJ5dGUzOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAzCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlNQUNfRFcwX1NUUlVDLCAqUE1BQ19EVzBfU1RSVUM7CisjZW5kaWYKKworLy8KKy8vIE1BQ19DU1IzOiBTVEEgTUFDIHJlZ2lzdGVyIDEKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfTUFDX0RXMV9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUNIQVIJCVJzdmQxOworCQlVQ0hBUgkJVTJNZU1hc2s7CisJCVVDSEFSCQlCeXRlNTsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgNQorCQlVQ0hBUgkJQnl0ZTQ7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDQKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CU1BQ19EVzFfU1RSVUMsICpQTUFDX0RXMV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9NQUNfRFcxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUgkJQnl0ZTQ7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDQKKwkJVUNIQVIJCUJ5dGU1OwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSA1CisJCVVDSEFSCQlVMk1lTWFzazsKKwkJVUNIQVIJCVJzdmQxOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTUFDX0RXMV9TVFJVQywgKlBNQUNfRFcxX1NUUlVDOworI2VuZGlmCisKKyNkZWZpbmUgTUFDX0JTU0lEX0RXMCAgICAgICAgICAgIAkJMHgxMDEwCQkvLyBNQUMgQlNTSUQgRFcwCisjZGVmaW5lIE1BQ19CU1NJRF9EVzEgICAgICAgICAgICAJCTB4MTAxNAkJLy8gTUFDIEJTU0lEIERXMQorCisvLworLy8gTUFDX0NTUjU6IEJTU0lEIHJlZ2lzdGVyIDEKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfTUFDX0NTUjVfU1RSVUMJeworCXN0cnVjdAl7CisJCVVTSE9SVAkJUnN2ZDoxMTsKKwkJVVNIT1JUCQlNQnNzQmNuTnVtOjM7CisJCVVTSE9SVAkJQnNzSWRNb2RlOjI7IC8vIDA6IG9uZSBCU1NJRCwgMTA6IDQgQlNTSUQsICAwMTogMiBCU1NJRCAsIDExOiA4QlNTSUQKKwkJVUNIQVIJCUJ5dGU1OwkJIC8vIEJTU0lEIGJ5dGUgNQorCQlVQ0hBUgkJQnl0ZTQ7CQkgLy8gQlNTSUQgYnl0ZSA0CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlNQUNfQ1NSNV9TVFJVQywgKlBNQUNfQ1NSNV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9NQUNfQ1NSNV9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUNIQVIJCUJ5dGU0OwkJIC8vIEJTU0lEIGJ5dGUgNAorCQlVQ0hBUgkJQnl0ZTU7CQkgLy8gQlNTSUQgYnl0ZSA1CisJCVVTSE9SVCAgICAgIAlCc3NJZE1hc2s6MjsgLy8gMDogb25lIEJTU0lELCAxMDogNCBCU1NJRCwgIDAxOiAyIEJTU0lEICwgMTE6IDhCU1NJRAorCQlVU0hPUlQJCU1Cc3NCY25OdW06MzsKKwkJVVNIT1JUCQlSc3ZkOjExOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTUFDX0NTUjVfU1RSVUMsICpQTUFDX0NTUjVfU1RSVUM7CisjZW5kaWYKKworI2RlZmluZSBNQVhfTEVOX0NGRyAgICAgICAgICAgICAgMHgxMDE4CQkvLyBydDI4NjBiIG1heCAxNmsgYnl0ZXMuIGJpdDEyOjEzIE1heGltdW0gUFNEVSBsZW5ndGggKHBvd2VyIGZhY3RvcikgMDoyXjEzLCAxOjJeMTQsIDI6Ml4xNSwgMzoyXjE2CisjZGVmaW5lIEJCUF9DU1JfQ0ZHICAgICAgICAgICAgCQkweDEwMWMJCS8vCisvLworLy8gQkJQX0NTUl9DRkc6IEJCUCBzZXJpYWwgY29udHJvbCByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9CQlBfQ1NSX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQk6MTI7CisJCVVJTlQzMgkJQkJQX1JXX01PREU6MTsJCS8vIDA6IHVzZSBzZXJpYWwgbW9kZSAgMTpwYXJhbGxlbAorCQlVSU5UMzIJCUJCUF9QQVJfRFVSOjE7CQkgICAgLy8gMDogNCBNQUMgY2xvY2sgY3ljbGVzICAxOiA4IE1BQyBjbG9jayBjeWNsZXMKKwkJVUlOVDMyCQlCdXN5OjE7CQkJCS8vIDE6IEFTSUMgaXMgYnVzeSBleGVjdXRlIEJCUCBwcm9ncmFtbWluZy4KKwkJVUlOVDMyCQlmUmVhZDoxOwkJICAgIC8vIDA6IFdyaXRlCUJCUCwgMToJUmVhZCBCQlAKKwkJVUlOVDMyCQlSZWdOdW06ODsJCQkvLyBTZWxlY3RlZAlCQlAJcmVnaXN0ZXIKKwkJVUlOVDMyCQlWYWx1ZTo4OwkJCS8vIFJlZ2lzdGVyCXZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUJCUF9DU1JfQ0ZHX1NUUlVDLCAqUEJCUF9DU1JfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0JCUF9DU1JfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVZhbHVlOjg7CQkJLy8gUmVnaXN0ZXIJdmFsdWUgdG8gcHJvZ3JhbSBpbnRvIEJCUAorCQlVSU5UMzIJCVJlZ051bTo4OwkJCS8vIFNlbGVjdGVkCUJCUAlyZWdpc3RlcgorCQlVSU5UMzIJCWZSZWFkOjE7CQkgICAgLy8gMDogV3JpdGUJQkJQLCAxOglSZWFkIEJCUAorCQlVSU5UMzIJCUJ1c3k6MTsJCQkJLy8gMTogQVNJQyBpcyBidXN5IGV4ZWN1dGUgQkJQIHByb2dyYW1taW5nLgorCQlVSU5UMzIJCUJCUF9QQVJfRFVSOjE7CQkgICAgIC8vIDA6IDQgTUFDIGNsb2NrIGN5Y2xlcyAgMTogOCBNQUMgY2xvY2sgY3ljbGVzCisJCVVJTlQzMgkJQkJQX1JXX01PREU6MTsJCS8vIDA6IHVzZSBzZXJpYWwgbW9kZSAgMTpwYXJhbGxlbAorCQlVSU5UMzIJCToxMjsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUJCUF9DU1JfQ0ZHX1NUUlVDLCAqUEJCUF9DU1JfQ0ZHX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFJGX0NTUl9DRkcwICAgICAgICAgICAgCQkweDEwMjAKKy8vCisvLyBSRl9DU1JfQ0ZHOiBSRiBjb250cm9sIHJlZ2lzdGVyCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1JGX0NTUl9DRkcwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCUJ1c3k6MTsJCSAgICAvLyAwOiBpZGxlIDE6IDhidXN5CisJCVVJTlQzMgkJU2VsOjE7CQkJCS8vIDA6UkZfTEUwIGFjdGl2YXRlICAxOlJGX0xFMSBhY3RpdmF0ZQorCQlVSU5UMzIJCVN0YW5kYnlNb2RlOjE7CQkgICAgLy8gMDogaGlnaCB3aGVuIHN0YW5kIGJ5IDE6CWxvdyB3aGVuIHN0YW5kYnkKKwkJVUlOVDMyCQliaXR3aWR0aDo1OwkJCS8vIFNlbGVjdGVkCUJCUAlyZWdpc3RlcgorCQlVSU5UMzIJCVJlZ0lkQW5kQ29udGVudDoyNDsJCQkvLyBSZWdpc3Rlcgl2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlSRl9DU1JfQ0ZHMF9TVFJVQywgKlBSRl9DU1JfQ0ZHMF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHMF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlSZWdJZEFuZENvbnRlbnQ6MjQ7CQkJLy8gUmVnaXN0ZXIJdmFsdWUgdG8gcHJvZ3JhbSBpbnRvIEJCUAorCQlVSU5UMzIJCWJpdHdpZHRoOjU7CQkJLy8gU2VsZWN0ZWQJQkJQCXJlZ2lzdGVyCisJCVVJTlQzMgkJU3RhbmRieU1vZGU6MTsJCSAgICAvLyAwOiBoaWdoIHdoZW4gc3RhbmQgYnkgMToJbG93IHdoZW4gc3RhbmRieQorCQlVSU5UMzIJCVNlbDoxOwkJCQkvLyAwOlJGX0xFMCBhY3RpdmF0ZSAgMTpSRl9MRTEgYWN0aXZhdGUKKwkJVUlOVDMyCQlCdXN5OjE7CQkgICAgLy8gMDogaWRsZSAxOiA4YnVzeQorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUkZfQ1NSX0NGRzBfU1RSVUMsICpQUkZfQ1NSX0NGRzBfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgUkZfQ1NSX0NGRzEgICAgICAgICAgIAkJMHgxMDI0CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfUkZfQ1NSX0NGRzFfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJcnN2Ojc7CQkgICAgLy8gMDogaWRsZSAxOiA4YnVzeQorCQlVSU5UMzIJCVJGR2FwOjU7CQkJLy8gR2FwIGJldHdlZW4gQkJfQ09OVFJPTF9SRiBhbmQgUkZfTEUuIDA6IDMgc3lzdGVtIGNsb2NrIGN5Y2xlICgzNy41dXNlYykgMTogNSBzeXN0ZW0gY2xvY2sgY3ljbGUgKDYyLjV1c2VjKQorCQlVSU5UMzIJCVJlZ0lkQW5kQ29udGVudDoyNDsJCQkvLyBSZWdpc3Rlcgl2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlSRl9DU1JfQ0ZHMV9TVFJVQywgKlBSRl9DU1JfQ0ZHMV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHMV9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlSZWdJZEFuZENvbnRlbnQ6MjQ7CQkJLy8gUmVnaXN0ZXIJdmFsdWUgdG8gcHJvZ3JhbSBpbnRvIEJCUAorCQlVSU5UMzIJCVJGR2FwOjU7CQkJLy8gR2FwIGJldHdlZW4gQkJfQ09OVFJPTF9SRiBhbmQgUkZfTEUuIDA6IDMgc3lzdGVtIGNsb2NrIGN5Y2xlICgzNy41dXNlYykgMTogNSBzeXN0ZW0gY2xvY2sgY3ljbGUgKDYyLjV1c2VjKQorCQlVSU5UMzIJCXJzdjo3OwkJICAgIC8vIDA6IGlkbGUgMTogOGJ1c3kKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJGX0NTUl9DRkcxX1NUUlVDLCAqUFJGX0NTUl9DRkcxX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFJGX0NTUl9DRkcyICAgICAgICAgICAJCTB4MTAyOAkJLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHMl9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlyc3Y6ODsJCSAgICAvLyAwOiBpZGxlIDE6IDhidXN5CisJCVVJTlQzMgkJUmVnSWRBbmRDb250ZW50OjI0OwkJCS8vIFJlZ2lzdGVyCXZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJGX0NTUl9DRkcyX1NUUlVDLCAqUFJGX0NTUl9DRkcyX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1JGX0NTUl9DRkcyX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVJlZ0lkQW5kQ29udGVudDoyNDsJCQkvLyBSZWdpc3Rlcgl2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQCisJCVVJTlQzMgkJcnN2Ojg7CQkgICAgLy8gMDogaWRsZSAxOiA4YnVzeQorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUkZfQ1NSX0NGRzJfU1RSVUMsICpQUkZfQ1NSX0NGRzJfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgTEVEX0NGRyAgICAgICAgICAgCQkweDEwMmMJCS8vICBNQUNfQ1NSMTQKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9MRURfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCToxOworCQlVSU5UMzIJCUxlZFBvbGFyOjE7CQkJLy8gTGVkIFBvbGFyaXR5LiAgMDogYWN0aXZlIGxvdzE6IGFjdGl2ZSBoaWdoCisJCVVJTlQzMgkJWUxlZE1vZGU6MjsJCQkvLyB5ZWxsb3cgTGVkIE1vZGUKKwkJVUlOVDMyCQlHTGVkTW9kZToyOwkJCS8vIGdyZWVuIExlZCBNb2RlCisJCVVJTlQzMgkJUkxlZE1vZGU6MjsJCQkvLyByZWQgTGVkIE1vZGUgICAgMDogb2ZmMTogYmxpbmtpbmcgdXBvbiBUWDI6IHBlcmlvZGljIHNsb3cgYmxpbmtpbmczOiBhbHdheXMgb24KKwkJVUlOVDMyCQlyc3Y6MjsKKwkJVUlOVDMyCQlTbG93QmxpbmtQZXJpb2Q6NjsJCQkvLyBzbG93IGJsaW5raW5nIHBlcmlvZC4gdW5pdDoxbXMKKwkJVUlOVDMyCQlPZmZQZXJpb2Q6ODsJCQkvLyBibGlua2luZyBvZmYgcGVyaW9kIHVuaXQgMW1zCisJCVVJTlQzMgkJT25QZXJpb2Q6ODsJCQkvLyBibGlua2luZyBvbiBwZXJpb2QgdW5pdCAxbXMKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUxFRF9DRkdfU1RSVUMsICpQTEVEX0NGR19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9MRURfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCU9uUGVyaW9kOjg7CQkJLy8gYmxpbmtpbmcgb24gcGVyaW9kIHVuaXQgMW1zCisJCVVJTlQzMgkJT2ZmUGVyaW9kOjg7CQkJLy8gYmxpbmtpbmcgb2ZmIHBlcmlvZCB1bml0IDFtcworCQlVSU5UMzIJCVNsb3dCbGlua1BlcmlvZDo2OwkJCS8vIHNsb3cgYmxpbmtpbmcgcGVyaW9kLiB1bml0OjFtcworCQlVSU5UMzIJCXJzdjoyOworCQlVSU5UMzIJCVJMZWRNb2RlOjI7CQkJLy8gcmVkIExlZCBNb2RlICAgIDA6IG9mZjE6IGJsaW5raW5nIHVwb24gVFgyOiBwZXJpb2RpYyBzbG93IGJsaW5raW5nMzogYWx3YXlzIG9uCisJCVVJTlQzMgkJR0xlZE1vZGU6MjsJCQkvLyBncmVlbiBMZWQgTW9kZQorCQlVSU5UMzIJCVlMZWRNb2RlOjI7CQkJLy8geWVsbG93IExlZCBNb2RlCisJCVVJTlQzMgkJTGVkUG9sYXI6MTsJCQkvLyBMZWQgUG9sYXJpdHkuICAwOiBhY3RpdmUgbG93MTogYWN0aXZlIGhpZ2gKKwkJVUlOVDMyCQk6MTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUxFRF9DRkdfU1RSVUMsICpQTEVEX0NGR19TVFJVQzsKKyNlbmRpZgorLy8KKy8vICA0LjIgTUFDIFRJTUlORyAgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKG9mZnNldDoweDExMDApCisvLworI2RlZmluZSBYSUZTX1RJTUVfQ0ZHICAgICAgICAgICAgIDB4MTEwMAkJIC8vIE1BQ19DU1I4ICBNQUNfQ1NSOQorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0lGU19TTE9UX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICByc3Y6MjsKKwkgICAgVUlOVDMyICBCQlJ4ZW5kRW5hYmxlOjE7ICAgICAgICAvLyAgcmVmZXJlbmNlIFJYRU5EIHNpZ25hbCB0byBiZWdpbiBYSUZTIGRlZmVyCisJICAgIFVJTlQzMiAgRUlGUzo5OyAgICAgICAgLy8gIHVuaXQgMXVzCisJICAgIFVJTlQzMiAgT2ZkbVhpZnNUaW1lOjQ7ICAgICAgICAvL09GRE0gU0lGUy4gdW5pdCAxdXMuIEFwcGxpZWQgYWZ0ZXIgT0ZETSBSWCB3aGVuIE1BQyBkb2Vzbid0IHJlZmVyZW5jZSBCQlAgc2lnbmFsIEJCUlhFTkQKKwkgICAgVUlOVDMyICBPZmRtU2lmc1RpbWU6ODsgICAgICAgIC8vICB1bml0IDF1cy4gQXBwbGllZCBhZnRlciBPRkRNIFJYL1RYCisJICAgIFVJTlQzMiAgQ2NrbVNpZnNUaW1lOjg7ICAgICAgICAvLyAgdW5pdCAxdXMuIEFwcGxpZWQgYWZ0ZXIgQ0NLIFJYL1RYCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlJRlNfU0xPVF9DRkdfU1RSVUMsICpQSUZTX1NMT1RfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0lGU19TTE9UX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICBDY2ttU2lmc1RpbWU6ODsgICAgICAgIC8vICB1bml0IDF1cy4gQXBwbGllZCBhZnRlciBDQ0sgUlgvVFgKKwkgICAgVUlOVDMyICBPZmRtU2lmc1RpbWU6ODsgICAgICAgIC8vICB1bml0IDF1cy4gQXBwbGllZCBhZnRlciBPRkRNIFJYL1RYCisJICAgIFVJTlQzMiAgT2ZkbVhpZnNUaW1lOjQ7ICAgICAgICAvL09GRE0gU0lGUy4gdW5pdCAxdXMuIEFwcGxpZWQgYWZ0ZXIgT0ZETSBSWCB3aGVuIE1BQyBkb2Vzbid0IHJlZmVyZW5jZSBCQlAgc2lnbmFsIEJCUlhFTkQKKwkgICAgVUlOVDMyICBFSUZTOjk7ICAgICAgICAvLyAgdW5pdCAxdXMKKwkgICAgVUlOVDMyICBCQlJ4ZW5kRW5hYmxlOjE7ICAgICAgICAvLyAgcmVmZXJlbmNlIFJYRU5EIHNpZ25hbCB0byBiZWdpbiBYSUZTIGRlZmVyCisJICAgIFVJTlQzMiAgcnN2OjI7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlJRlNfU0xPVF9DRkdfU1RSVUMsICpQSUZTX1NMT1RfQ0ZHX1NUUlVDOworI2VuZGlmCisKKyNkZWZpbmUgQktPRkZfU0xPVF9DRkcgICAgICAgICAgICAgMHgxMTA0CQkgLy8gIG1hY19jc3I5IGxhc3QgOCBiaXRzCisjZGVmaW5lIE5BVl9USU1FX0NGRyAgICAgICAgICAgICAweDExMDgJCSAvLyBOQVYgIChNQUNfQ1NSMTUpCisjZGVmaW5lIENIX1RJTUVfQ0ZHICAgICAgICAgICAgIDB4MTEwQwkJIAkvLyBDb3VudCBhcyBjaGFubmVsIGJ1c3kKKyNkZWZpbmUgUEJGX0xJRkVfVElNRVIgICAgICAgICAgICAgMHgxMTEwCQkgLy9UWC9SWCBNUERVIHRpbWVzdGFtcCB0aW1lciAoZnJlZSBydW4pVW5pdDogMXVzCisjZGVmaW5lIEJDTl9USU1FX0NGRyAgICAgICAgICAgICAweDExMTQJCSAvLyBUWFJYX0NTUjkKKworI2RlZmluZSBCQ05fT0ZGU0VUMAkJCQkweDA0MkMKKyNkZWZpbmUgQkNOX09GRlNFVDEJCQkJMHgwNDMwCisKKy8vCisvLyBCQ05fVElNRV9DRkcgOiBTeW5jaHJvbml6YXRpb24gY29udHJvbCByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9CQ05fVElNRV9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJVHhUaW1lc3RhbXBDb21wZW5zYXRlOjg7CisgICAgICAgIFVJTlQzMiAgICAgICA6MzsKKwkJVUlOVDMyCQliQmVhY29uR2VuOjE7CQkvLyBFbmFibGUgYmVhY29uIGdlbmVyYXRvcgorICAgICAgICBVSU5UMzIgICAgICAgYlRCVFRFbmFibGU6MTsKKwkJVUlOVDMyCQlUc2ZTeW5jTW9kZToyOwkJLy8gRW5hYmxlIFRTRiBzeW5jLCAwMDogZGlzYWJsZSwgMDE6IGluZnJhIG1vZGUsIDEwOiBhZC1ob2MgbW9kZQorCQlVSU5UMzIJCWJUc2ZUaWNraW5nOjE7CQkvLyBFbmFibGUgVFNGIGF1dG8gY291bnRpbmcKKwkJVUlOVDMyICAgICAgIEJlYWNvbkludGVydmFsOjE2OyAgLy8gaW4gdW5pdCBvZiAxLzE2IFRVCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlCQ05fVElNRV9DRkdfU1RSVUMsICpQQkNOX1RJTUVfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0JDTl9USU1FX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyICAgICAgIEJlYWNvbkludGVydmFsOjE2OyAgLy8gaW4gdW5pdCBvZiAxLzE2IFRVCisJCVVJTlQzMgkJYlRzZlRpY2tpbmc6MTsJCS8vIEVuYWJsZSBUU0YgYXV0byBjb3VudGluZworCQlVSU5UMzIJCVRzZlN5bmNNb2RlOjI7CQkvLyBFbmFibGUgVFNGIHN5bmMsIDAwOiBkaXNhYmxlLCAwMTogaW5mcmEgbW9kZSwgMTA6IGFkLWhvYyBtb2RlCisgICAgICAgIFVJTlQzMiAgICAgICBiVEJUVEVuYWJsZToxOworCQlVSU5UMzIJCWJCZWFjb25HZW46MTsJCS8vIEVuYWJsZSBiZWFjb24gZ2VuZXJhdG9yCisgICAgICAgIFVJTlQzMiAgICAgICA6MzsKKwkJVUlOVDMyCQlUeFRpbWVzdGFtcENvbXBlbnNhdGU6ODsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUJDTl9USU1FX0NGR19TVFJVQywgKlBCQ05fVElNRV9DRkdfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgVEJUVF9TWU5DX0NGRyAgICAgICAgICAgIDB4MTExOCAgCQkvLyB0eHJ4X2NzcjEwCisjZGVmaW5lIFRTRl9USU1FUl9EVzAgICAgICAgICAgICAgMHgxMTFDICAJCS8vIExvY2FsIFRTRiB0aW1lciBsc2IgMzIgYml0cy4gUmVhZC1vbmx5CisjZGVmaW5lIFRTRl9USU1FUl9EVzEgICAgICAgICAgICAgMHgxMTIwICAJCS8vIG1zYiAzMiBiaXRzLiBSZWFkLW9ubHkuCisjZGVmaW5lIFRCVFRfVElNRVIgICAgICAgICAgICAgCTB4MTEyNCAgCQkvLyBUSW1lciByZW1haW5zIHRpbGwgbmV4dCBUQlRULiBSZWFkLW9ubHkuICBUWFJYX0NTUjE0CisjZGVmaW5lIElOVF9USU1FUl9DRkcgICAgICAgICAgICAgIAkweDExMjggIAkJLy8KKyNkZWZpbmUgSU5UX1RJTUVSX0VOICAgICAgICAgICAgIAkweDExMmMgIAkJLy8gIEdQLXRpbWVyIGFuZCBwcmUtdGJ0dCBJbnQgZW5hYmxlCisjZGVmaW5lIENIX0lETEVfU1RBICAgICAgICAgICAgICAJMHgxMTMwICAJCS8vICBjaGFubmVsIGlkbGUgdGltZQorI2RlZmluZSBDSF9CVVNZX1NUQSAgICAgICAgICAgICAgCTB4MTEzNCAgCQkvLyAgY2hhbm5sZSBidXN5IHRpbWUKKy8vCisvLyAgNC4yIE1BQyBQT1dFUiAgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKG9mZnNldDoweDEyMDApCisvLworI2RlZmluZSBNQUNfU1RBVFVTX0NGRyAgICAgICAgICAgICAweDEyMDAJCSAvLyBvbGQgTUFDX0NTUjEyCisjZGVmaW5lIFBXUl9QSU5fQ0ZHICAgICAgICAgICAgIDB4MTIwNAkJIC8vIG9sZCBNQUNfQ1NSMTIKKyNkZWZpbmUgQVVUT19XQUtFVVBfQ0ZHICAgICAgICAgICAgIDB4MTIwOAkJIC8vIG9sZCBNQUNfQ1NSMTAKKy8vCisvLyBBVVRPX1dBS0VVUF9DRkc6IE1hbnVhbCBwb3dlciBjb250cm9sIC8gc3RhdHVzIHJlZ2lzdGVyCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0FVVE9fV0FLRVVQX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCToxNjsKKwkJVUlOVDMyCQlFbmFibGVBdXRvV2FrZXVwOjE7CS8vIDA6c2xlZXAsIDE6YXdha2UKKwkJVUlOVDMyICAgICAgIE51bW9mU2xlZXBpbmdUYnR0Ojc7ICAgICAgICAgIC8vIEZvcmNlV2FrZSBoYXMgaGlnaCBwcml2aWxlZ2UgdGhhbiBQdXRUb1NsZWVwIHdoZW4gYm90aCBzZXQKKwkJVUlOVDMyICAgICAgIEF1dG9MZWFkVGltZTo4OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JQVVUT19XQUtFVVBfU1RSVUMsICpQQVVUT19XQUtFVVBfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfQVVUT19XQUtFVVBfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMiAgICAgICBBdXRvTGVhZFRpbWU6ODsKKwkJVUlOVDMyICAgICAgIE51bW9mU2xlZXBpbmdUYnR0Ojc7ICAgICAgICAgIC8vIEZvcmNlV2FrZSBoYXMgaGlnaCBwcml2aWxlZ2UgdGhhbiBQdXRUb1NsZWVwIHdoZW4gYm90aCBzZXQKKwkJVUlOVDMyCQlFbmFibGVBdXRvV2FrZXVwOjE7CS8vIDA6c2xlZXAsIDE6YXdha2UKKwkJVUlOVDMyCQk6MTY7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlBVVRPX1dBS0VVUF9TVFJVQywgKlBBVVRPX1dBS0VVUF9TVFJVQzsKKyNlbmRpZgorLy8KKy8vICA0LjMgTUFDIFRYICBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAob2Zmc2V0OjB4MTMwMCkKKy8vCisKKyNkZWZpbmUgRURDQV9BQzBfQ0ZHCTB4MTMwMAkJLy9BQ19UWE9QX0NTUjAgMHgzNDc0CisjZGVmaW5lIEVEQ0FfQUMxX0NGRwkweDEzMDQKKyNkZWZpbmUgRURDQV9BQzJfQ0ZHCTB4MTMwOAorI2RlZmluZSBFRENBX0FDM19DRkcJMHgxMzBjCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfRURDQV9BQ19DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgOjEyOyAgICAgICAgLy8KKwkgICAgVUlOVDMyICBDd21heDo0OyAgICAgICAgLy91bml0IHBvd2VyIG9mIDIKKwkgICAgVUlOVDMyICBDd21pbjo0OyAgICAgICAgLy8KKwkgICAgVUlOVDMyICBBaWZzbjo0OyAgICAgICAgLy8gIyBvZiBzbG90IHRpbWUKKwkgICAgVUlOVDMyICBBY1R4b3A6ODsgICAgICAgIC8vICBpbiB1bml0IG9mIDMydXMKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUVEQ0FfQUNfQ0ZHX1NUUlVDLCAqUEVEQ0FfQUNfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0VEQ0FfQUNfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgIEFjVHhvcDo4OyAgICAgICAgLy8gIGluIHVuaXQgb2YgMzJ1cworCSAgICBVSU5UMzIgIEFpZnNuOjQ7ICAgICAgICAvLyAjIG9mIHNsb3QgdGltZQorCSAgICBVSU5UMzIgIEN3bWluOjQ7ICAgICAgICAvLworCSAgICBVSU5UMzIgIEN3bWF4OjQ7ICAgICAgICAvL3VuaXQgcG93ZXIgb2YgMgorCSAgICBVSU5UMzIgIDoxMjsgICAgICAgLy8KKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUVEQ0FfQUNfQ0ZHX1NUUlVDLCAqUEVEQ0FfQUNfQ0ZHX1NUUlVDOworI2VuZGlmCisKKyNkZWZpbmUgRURDQV9USURfQUNfTUFQCTB4MTMxMAorI2RlZmluZSBUWF9QV1JfQ0ZHXzAJMHgxMzE0CisjZGVmaW5lIFRYX1BXUl9DRkdfMQkweDEzMTgKKyNkZWZpbmUgVFhfUFdSX0NGR18yCTB4MTMxQworI2RlZmluZSBUWF9QV1JfQ0ZHXzMJMHgxMzIwCisjZGVmaW5lIFRYX1BXUl9DRkdfNAkweDEzMjQKKyNkZWZpbmUgVFhfUElOX0NGRwkJMHgxMzI4CisjZGVmaW5lIFRYX0JBTkRfQ0ZHCTB4MTMyYwkJLy8gMHgxIHVzZSB1cHBlciAyME1Iei4gMCBqdXNlIGxvd2VyIDIwTUh6CisjZGVmaW5lIFRYX1NXX0NGRzAJCTB4MTMzMAorI2RlZmluZSBUWF9TV19DRkcxCQkweDEzMzQKKyNkZWZpbmUgVFhfU1dfQ0ZHMgkJMHgxMzM4CisjZGVmaW5lIFRYT1BfVEhSRVNfQ0ZHCQkweDEzM2MKKyNkZWZpbmUgVFhPUF9DVFJMX0NGRwkJMHgxMzQwCisjZGVmaW5lIFRYX1JUU19DRkcJCTB4MTM0NAorCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfUlRTX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIHJzdjo3OworCSAgICBVSU5UMzIgICAgICAgUnRzRmJrRW46MTsgICAgLy8gZW5hYmxlIHJ0cyByYXRlIGZhbGxiYWNrCisJICAgIFVJTlQzMiAgICAgICBSdHNUaHJlczoxNjsgICAgLy8gdW5pdDpieXRlCisJICAgIFVJTlQzMiAgICAgICBBdXRvUnRzUmV0cnlMaW1pdDo4OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfUlRTX0NGR19TVFJVQywgKlBUWF9SVFNfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1RYX1JUU19DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICBBdXRvUnRzUmV0cnlMaW1pdDo4OworCSAgICBVSU5UMzIgICAgICAgUnRzVGhyZXM6MTY7ICAgIC8vIHVuaXQ6Ynl0ZQorCSAgICBVSU5UMzIgICAgICAgUnRzRmJrRW46MTsgICAgLy8gZW5hYmxlIHJ0cyByYXRlIGZhbGxiYWNrCisJICAgIFVJTlQzMiAgICAgICByc3Y6NzsgICAgIC8vIDE6IEhUIG5vbi1TVEJDIGNvbnRyb2wgZnJhbWUgZW5hYmxlCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9SVFNfQ0ZHX1NUUlVDLCAqUFRYX1JUU19DRkdfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgVFhfVElNRU9VVF9DRkcJMHgxMzQ4CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfVElNRU9VVF9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICByc3YyOjg7CisJICAgIFVJTlQzMiAgICAgICBUeG9wVGltZW91dDo4OwkvL1RYT1AgdGltZW91dCB2YWx1ZSBmb3IgVFhPUCB0cnVuY2F0aW9uLiAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCAoU0xPVF9USU1FKSA+IChUWF9PUF9USU1FT1VUKSA+IChSWF9BQ0tfVElNRU9VVCkKKwkgICAgVUlOVDMyICAgICAgIFJ4QWNrVGltZW91dDo4OwkvLyB1bml0OnNsb3QuIFVzZWQgZm9yIFRYIHByZWNlZHVyZQorCSAgICBVSU5UMzIgICAgICAgTXBkdUxpZmVUaW1lOjQ7ICAgIC8vICBleHBpcmF0aW9uIHRpbWUgPSAyXig5K01QRFUgTElGRSBUSU1FKSAgdXMKKwkgICAgVUlOVDMyICAgICAgIHJzdjo0OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfVElNRU9VVF9DRkdfU1RSVUMsICpQVFhfVElNRU9VVF9DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfVElNRU9VVF9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICByc3Y6NDsKKwkgICAgVUlOVDMyICAgICAgIE1wZHVMaWZlVGltZTo0OyAgICAvLyAgZXhwaXJhdGlvbiB0aW1lID0gMl4oOStNUERVIExJRkUgVElNRSkgIHVzCisJICAgIFVJTlQzMiAgICAgICBSeEFja1RpbWVvdXQ6ODsJLy8gdW5pdDpzbG90LiBVc2VkIGZvciBUWCBwcmVjZWR1cmUKKwkgICAgVUlOVDMyICAgICAgIFR4b3BUaW1lb3V0Ojg7CS8vVFhPUCB0aW1lb3V0IHZhbHVlIGZvciBUWE9QIHRydW5jYXRpb24uICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IChTTE9UX1RJTUUpID4gKFRYX09QX1RJTUVPVVQpID4gKFJYX0FDS19USU1FT1VUKQorCSAgICBVSU5UMzIgICAgICAgcnN2Mjo4OyAgICAgLy8gMTogSFQgbm9uLVNUQkMgY29udHJvbCBmcmFtZSBlbmFibGUKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1RJTUVPVVRfQ0ZHX1NUUlVDLCAqUFRYX1RJTUVPVVRfQ0ZHX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFRYX1JUWV9DRkcJMHgxMzRjCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbiBQQUNLRUQgX1RYX1JUWV9DRkdfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICByc3Y6MTsKKwkgICAgVUlOVDMyICAgICAgIFR4YXV0b0ZCRW5hYmxlOjE7ICAgIC8vIFR4IHJldHJ5IFBIWSByYXRlIGF1dG8gZmFsbGJhY2sgZW5hYmxlCisJICAgIFVJTlQzMiAgICAgICBBZ2dSdHlNb2RlOjE7CS8vIEFnZ3JlZ2F0ZSBNUERVIHJldHJ5IG1vZGUuICAwOmV4cGlyZWQgYnkgcmV0cnkgbGltaXQsIDE6IGV4cGlyZWQgYnkgbXBkdSBsaWZlIHRpbWVyCisJICAgIFVJTlQzMiAgICAgICBOb25BZ2dSdHlNb2RlOjE7CS8vIE5vbi1BZ2dyZWdhdGUgTVBEVSByZXRyeSBtb2RlLiAgMDpleHBpcmVkIGJ5IHJldHJ5IGxpbWl0LCAxOiBleHBpcmVkIGJ5IG1wZHUgbGlmZSB0aW1lcgorCSAgICBVSU5UMzIgICAgICAgTG9uZ1J0eVRocmU6MTI7CS8vIExvbmcgcmV0cnkgdGhyZXNob29sZAorCSAgICBVSU5UMzIgICAgICAgTG9uZ1J0eUxpbWl0Ojg7CS8vbG9uZyByZXRyeSBsaW1pdAorCSAgICBVSU5UMzIgICAgICAgU2hvcnRSdHlMaW1pdDo4OwkvLyAgc2hvcnQgcmV0cnkgbGltaXQKKworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfUlRZX0NGR19TVFJVQywgKlBUWF9SVFlfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24gUEFDS0VEIF9UWF9SVFlfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgU2hvcnRSdHlMaW1pdDo4OwkvLyAgc2hvcnQgcmV0cnkgbGltaXQKKwkgICAgVUlOVDMyICAgICAgIExvbmdSdHlMaW1pdDo4OwkvL2xvbmcgcmV0cnkgbGltaXQKKwkgICAgVUlOVDMyICAgICAgIExvbmdSdHlUaHJlOjEyOwkvLyBMb25nIHJldHJ5IHRocmVzaG9vbGQKKwkgICAgVUlOVDMyICAgICAgIE5vbkFnZ1J0eU1vZGU6MTsJLy8gTm9uLUFnZ3JlZ2F0ZSBNUERVIHJldHJ5IG1vZGUuICAwOmV4cGlyZWQgYnkgcmV0cnkgbGltaXQsIDE6IGV4cGlyZWQgYnkgbXBkdSBsaWZlIHRpbWVyCisJICAgIFVJTlQzMiAgICAgICBBZ2dSdHlNb2RlOjE7CS8vIEFnZ3JlZ2F0ZSBNUERVIHJldHJ5IG1vZGUuICAwOmV4cGlyZWQgYnkgcmV0cnkgbGltaXQsIDE6IGV4cGlyZWQgYnkgbXBkdSBsaWZlIHRpbWVyCisJICAgIFVJTlQzMiAgICAgICBUeGF1dG9GQkVuYWJsZToxOyAgICAvLyBUeCByZXRyeSBQSFkgcmF0ZSBhdXRvIGZhbGxiYWNrIGVuYWJsZQorCSAgICBVSU5UMzIgICAgICAgcnN2OjE7ICAgICAvLyAxOiBIVCBub24tU1RCQyBjb250cm9sIGZyYW1lIGVuYWJsZQorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfUlRZX0NGR19TVFJVQywgKlBUWF9SVFlfQ0ZHX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFRYX0xJTktfQ0ZHCTB4MTM1MAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JUEFDS0VEIF9UWF9MSU5LX0NGR19TVFJVQwl7CisJc3RydWN0IFBBQ0tFRCB7CisJICAgIFVJTlQzMiAgICAgICBSZW1vdE1GUzo4OwkvL3JlbW90ZSBNQ1MgZmVlZGJhY2sgc2VxdWVuY2UgbnVtYmVyCisJICAgIFVJTlQzMiAgICAgICBSZW1vdE1GQjo4OyAgICAvLyAgcmVtb3RlIE1DUyBmZWVkYmFjaworCSAgICBVSU5UMzIgICAgICAgcnN2OjM7CS8vCisJICAgIFVJTlQzMiAgICAgICBUeENGQWNrRW46MTsJLy8gICBQaWdneWJhY2sgQ0YtQUNLIGVuYWJsZQorCSAgICBVSU5UMzIgICAgICAgVHhSREdFbjoxOwkvLyBSREcgVFggZW5hYmxlCisJICAgIFVJTlQzMiAgICAgICBUeE1SUUVuOjE7CS8vICBNQ1MgcmVxdWVzdCBUWCBlbmFibGUKKwkgICAgVUlOVDMyICAgICAgIFJlbW90ZVVNRlNFbmFibGU6MTsJLy8gIHJlbW90ZSB1bnNvbGljaXQgIE1GQiBlbmFibGUuICAwOiBub3QgYXBwbHkgcmVtb3RlIHJlbW90ZSB1bnNvbGljaXQgKE1GUz03KQorCSAgICBVSU5UMzIgICAgICAgTUZCRW5hYmxlOjE7CS8vICBUWCBhcHBseSByZW1vdGUgTUZCIDE6ZW5hYmxlCisJICAgIFVJTlQzMiAgICAgICBSZW1vdGVNRkJMaWZlVGltZTo4OwkvL3JlbW90ZSBNRkIgbGlmZSB0aW1lLiB1bml0IDogMzJ1cworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfTElOS19DRkdfU1RSVUMsICpQVFhfTElOS19DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglQQUNLRUQgX1RYX0xJTktfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QgUEFDS0VEIHsKKwkgICAgVUlOVDMyICAgICAgIFJlbW90ZU1GQkxpZmVUaW1lOjg7CS8vcmVtb3RlIE1GQiBsaWZlIHRpbWUuIHVuaXQgOiAzMnVzCisJICAgIFVJTlQzMiAgICAgICBNRkJFbmFibGU6MTsJLy8gIFRYIGFwcGx5IHJlbW90ZSBNRkIgMTplbmFibGUKKwkgICAgVUlOVDMyICAgICAgIFJlbW90ZVVNRlNFbmFibGU6MTsJLy8gIHJlbW90ZSB1bnNvbGljaXQgIE1GQiBlbmFibGUuICAwOiBub3QgYXBwbHkgcmVtb3RlIHJlbW90ZSB1bnNvbGljaXQgKE1GUz03KQorCSAgICBVSU5UMzIgICAgICAgVHhNUlFFbjoxOwkvLyAgTUNTIHJlcXVlc3QgVFggZW5hYmxlCisJICAgIFVJTlQzMiAgICAgICBUeFJER0VuOjE7CS8vIFJERyBUWCBlbmFibGUKKwkgICAgVUlOVDMyICAgICAgIFR4Q0ZBY2tFbjoxOwkvLyAgIFBpZ2d5YmFjayBDRi1BQ0sgZW5hYmxlCisJICAgIFVJTlQzMiAgICAgICByc3Y6MzsJLy8KKwkgICAgVUlOVDMyICAgICAgIFJlbW90TUZCOjg7ICAgIC8vICByZW1vdGUgTUNTIGZlZWRiYWNrCisJICAgIFVJTlQzMiAgICAgICBSZW1vdE1GUzo4OwkvL3JlbW90ZSBNQ1MgZmVlZGJhY2sgc2VxdWVuY2UgbnVtYmVyCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9MSU5LX0NGR19TVFJVQywgKlBUWF9MSU5LX0NGR19TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBIVF9GQktfQ0ZHMAkweDEzNTQKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uIFBBQ0tFRCBfSFRfRkJLX0NGRzBfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzdGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTNkZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1M1RkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzRGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTM0ZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MyRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzFGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMEZCSzo0OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JSFRfRkJLX0NGRzBfU1RSVUMsICpQSFRfRkJLX0NGRzBfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbiBQQUNLRUQgX0hUX0ZCS19DRkcwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MwRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzFGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMkZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MzRkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzRGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTNUZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1M2RkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzdGQks6NDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUhUX0ZCS19DRkcwX1NUUlVDLCAqUEhUX0ZCS19DRkcwX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIEhUX0ZCS19DRkcxCTB4MTM1OAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0hUX0ZCS19DRkcxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxNUZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxNEZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxM0ZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxMkZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxMUZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxMEZCSzo0OworCSAgICBVSU5UMzIgICAgICAgSFRNQ1M5RkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzhGQks6NDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUhUX0ZCS19DRkcxX1NUUlVDLCAqUEhUX0ZCS19DRkcxX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0hUX0ZCS19DRkcxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgSFRNQ1M4RkJLOjQ7CisJICAgIFVJTlQzMiAgICAgICBIVE1DUzlGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMTBGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMTFGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMTJGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMTNGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMTRGQks6NDsKKwkgICAgVUlOVDMyICAgICAgIEhUTUNTMTVGQks6NDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUhUX0ZCS19DRkcxX1NUUlVDLCAqUEhUX0ZCS19DRkcxX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIExHX0ZCS19DRkcwCTB4MTM1YworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0xHX0ZCS19DRkcwX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzdGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDYKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1M2RkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyA1CisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTNUZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgNAorCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzRGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDMKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MzRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAyCisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTMkZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMQorCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzFGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDAKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MwRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlMR19GQktfQ0ZHMF9TVFJVQywgKlBMR19GQktfQ0ZHMF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9MR19GQktfQ0ZHMF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MwRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTMUZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMAorCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzJGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDEKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MzRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAyCisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTNEZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMworCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzVGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDQKKwkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1M2RkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyA1CisJICAgIFVJTlQzMiAgICAgICBPRkRNTUNTN0ZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgNgorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTEdfRkJLX0NGRzBfU1RSVUMsICpQTEdfRkJLX0NGRzBfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgTEdfRkJLX0NGRzEJCTB4MTM2MAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0xHX0ZCS19DRkcxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgcnN2OjE2OworCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTM0ZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMgorCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTMkZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMQorCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTMUZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMAorCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTMEZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTEdfRkJLX0NGRzFfU1RSVUMsICpQTEdfRkJLX0NGRzFfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfTEdfRkJLX0NGRzFfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MwRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCisJICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MxRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCisJICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MyRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAxCisJICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MzRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAyCisJICAgIFVJTlQzMiAgICAgICByc3Y6MTY7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlMR19GQktfQ0ZHMV9TVFJVQywgKlBMR19GQktfQ0ZHMV9TVFJVQzsKKyNlbmRpZgorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vPT09PT09PT09PT09PT09PSBQcm90ZWN0aW9uIFBhcmFtYXRlcj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgQ0NLX1BST1RfQ0ZHCTB4MTM2NAkJLy9DQ0sgUHJvdGVjdGlvbgorI2RlZmluZSBBU0lDX1NIT1JUTkFWCQkxCisjZGVmaW5lIEFTSUNfTE9OR05BVgkJMgorI2RlZmluZSBBU0lDX1JUUwkJMQorI2RlZmluZSBBU0lDX0NUUwkJMgorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1BST1RfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgcnN2OjU7CisJICAgIFVJTlQzMiAgICAgICBSVFNUaEVuOjE7CS8vUlRTIHRocmVzaG9sZCBlbmFibGUgb24gQ0NLIFRYCisJICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dHRjQwOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCisJICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dHRjIwOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCisJICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dNTTQwOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCisJICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dNTTIwOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLiAwOmRpc2FsbG93LgorCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93T2ZkbToxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LgorCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93Q2NrOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCisJICAgIFVJTlQzMiAgICAgICBQcm90ZWN0TmF2OjI7CS8vVFhPUCBwcm90ZWN0aW9uIHR5cGUgZm9yIENDSyBUWC4gMDpOb25lLCAxOlNob3J0TkFWcHJvdGVjdCwgIDI6TG9uZ05BVlByb3RlY3QsIDM6cnN2CisJICAgIFVJTlQzMiAgICAgICBQcm90ZWN0Q3RybDoyOwkvL1Byb3RlY3Rpb24gY29udHJvbCBmcmFtZSB0eXBlIGZvciBDQ0sgVFguIDE6UlRTL0NUUywgMjpDVFMtdG8tc2VsZiwgMDpOb25lLCAzOnJzdgorCSAgICBVSU5UMzIgICAgICAgUHJvdGVjdFJhdGU6MTY7CS8vUHJvdGVjdGlvbiBjb250cm9sIGZyYW1lIHJhdGUgZm9yIENDSyBUWChSVFMvQ1RTL0NGRW5kKS4KKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVBST1RfQ0ZHX1NUUlVDLCAqUFBST1RfQ0ZHX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1BST1RfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICAgICAgUHJvdGVjdFJhdGU6MTY7CS8vUHJvdGVjdGlvbiBjb250cm9sIGZyYW1lIHJhdGUgZm9yIENDSyBUWChSVFMvQ1RTL0NGRW5kKS4KKwkgICAgVUlOVDMyICAgICAgIFByb3RlY3RDdHJsOjI7CS8vUHJvdGVjdGlvbiBjb250cm9sIGZyYW1lIHR5cGUgZm9yIENDSyBUWC4gMTpSVFMvQ1RTLCAyOkNUUy10by1zZWxmLCAwOk5vbmUsIDM6cnN2CisJICAgIFVJTlQzMiAgICAgICBQcm90ZWN0TmF2OjI7CS8vVFhPUCBwcm90ZWN0aW9uIHR5cGUgZm9yIENDSyBUWC4gMDpOb25lLCAxOlNob3J0TkFWcHJvdGVjdCwgIDI6TG9uZ05BVlByb3RlY3QsIDM6cnN2CisJICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dDY2s6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KKwkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd09mZG06MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KKwkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd01NMjA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuIDA6ZGlzYWxsb3cuCisJICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dNTTQwOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCisJICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dHRjIwOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCisJICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dHRjQwOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCisJICAgIFVJTlQzMiAgICAgICBSVFNUaEVuOjE7CS8vUlRTIHRocmVzaG9sZCBlbmFibGUgb24gQ0NLIFRYCisJICAgIFVJTlQzMiAgICAgICByc3Y6NTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVBST1RfQ0ZHX1NUUlVDLCAqUFBST1RfQ0ZHX1NUUlVDOworI2VuZGlmCisKKyNkZWZpbmUgT0ZETV9QUk9UX0NGRwkweDEzNjgJCS8vT0ZETSBQcm90ZWN0aW9uCisjZGVmaW5lIE1NMjBfUFJPVF9DRkcJMHgxMzZDCQkvL01NMjAgUHJvdGVjdGlvbgorI2RlZmluZSBNTTQwX1BST1RfQ0ZHCTB4MTM3MAkJLy9NTTQwIFByb3RlY3Rpb24KKyNkZWZpbmUgR0YyMF9QUk9UX0NGRwkweDEzNzQJCS8vR0YyMCBQcm90ZWN0aW9uCisjZGVmaW5lIEdGNDBfUFJPVF9DRkcJMHgxMzc4CQkvL0dSNDAgUHJvdGVjdGlvbgorI2RlZmluZSBFWFBfQ1RTX1RJTUUJMHgxMzdDCQkvLworI2RlZmluZSBFWFBfQUNLX1RJTUUJMHgxMzgwCQkvLworCisvLworLy8gIDQuNCBNQUMgUlggY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKG9mZnNldDoweDE0MDApCisvLworI2RlZmluZSBSWF9GSUxUUl9DRkcJMHgxNDAwCQkJLy9UWFJYX0NTUjAKKyNkZWZpbmUgQVVUT19SU1BfQ0ZHCTB4MTQwNAkJCS8vVFhSWF9DU1I0CisvLworLy8gVFhSWF9DU1I0OiBBdXRvLVJlc3BvbmRlci8KKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZiB1bmlvbiBfQVVUT19SU1BfQ0ZHX1NUUlVDIHsKKyBzdHJ1Y3QgeworICAgICBVSU5UMzIgICAgICAgIDoyNDsKKyAgICAgVUlOVDMyICAgICAgIEFja0N0c1BzbUJpdDoxOyAgIC8vIFBvd2VyIGJpdCB2YWx1ZSBpbiBjb25ydHJvbCBmcmFtZQorICAgICBVSU5UMzIgICAgICAgRHVhbENUU0VuOjE7ICAgLy8gUG93ZXIgYml0IHZhbHVlIGluIGNvbnJ0cm9sIGZyYW1lCisgICAgIFVJTlQzMiAgICAgICByc3Y6MTsgICAvLyBQb3dlciBiaXQgdmFsdWUgaW4gY29ucnRyb2wgZnJhbWUKKyAgICAgVUlOVDMyICAgICAgIEF1dG9SZXNwb25kZXJQcmVhbWJsZToxOyAgICAvLyAwOmxvbmcsIDE6c2hvcnQgcHJlYW1ibGUKKyAgICAgVUlOVDMyICAgICAgIENUUzQwTVJlZjoxOyAgLy8gUmVzcG9uc2UgQ1RTIDQwTUh6IGR1cGxpY2F0ZSBtb2RlCisgICAgIFVJTlQzMiAgICAgICBDVFM0ME1Nb2RlOjE7ICAvLyBSZXNwb25zZSBDVFMgNDBNSHogZHVwbGljYXRlIG1vZGUKKyAgICAgVUlOVDMyICAgICAgIEJBQ0Fja1BvbGljeUVuYWJsZToxOyAgICAvLyAwOmxvbmcsIDE6c2hvcnQgcHJlYW1ibGUKKyAgICAgVUlOVDMyICAgICAgIEF1dG9SZXNwb25kZXJFbmFibGU6MTsKKyB9IGZpZWxkOworIFVJTlQzMiAgIHdvcmQ7Cit9IEFVVE9fUlNQX0NGR19TVFJVQywgKlBBVVRPX1JTUF9DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZiB1bmlvbiBfQVVUT19SU1BfQ0ZHX1NUUlVDIHsKKyBzdHJ1Y3QgeworICAgICBVSU5UMzIgICAgICAgQXV0b1Jlc3BvbmRlckVuYWJsZToxOworICAgICBVSU5UMzIgICAgICAgQkFDQWNrUG9saWN5RW5hYmxlOjE7ICAgIC8vIDA6bG9uZywgMTpzaG9ydCBwcmVhbWJsZQorICAgICBVSU5UMzIgICAgICAgQ1RTNDBNTW9kZToxOyAgLy8gUmVzcG9uc2UgQ1RTIDQwTUh6IGR1cGxpY2F0ZSBtb2RlCisgICAgIFVJTlQzMiAgICAgICBDVFM0ME1SZWY6MTsgIC8vIFJlc3BvbnNlIENUUyA0ME1IeiBkdXBsaWNhdGUgbW9kZQorICAgICBVSU5UMzIgICAgICAgQXV0b1Jlc3BvbmRlclByZWFtYmxlOjE7ICAgIC8vIDA6bG9uZywgMTpzaG9ydCBwcmVhbWJsZQorICAgICBVSU5UMzIgICAgICAgcnN2OjE7ICAgLy8gUG93ZXIgYml0IHZhbHVlIGluIGNvbnJ0cm9sIGZyYW1lCisgICAgIFVJTlQzMiAgICAgICBEdWFsQ1RTRW46MTsgICAvLyBQb3dlciBiaXQgdmFsdWUgaW4gY29ucnRyb2wgZnJhbWUKKyAgICAgVUlOVDMyICAgICAgIEFja0N0c1BzbUJpdDoxOyAgIC8vIFBvd2VyIGJpdCB2YWx1ZSBpbiBjb25ydHJvbCBmcmFtZQorICAgICBVSU5UMzIgICAgICAgIDoyNDsKKyB9IGZpZWxkOworIFVJTlQzMiAgIHdvcmQ7Cit9IEFVVE9fUlNQX0NGR19TVFJVQywgKlBBVVRPX1JTUF9DRkdfU1RSVUM7CisjZW5kaWYKKworI2RlZmluZSBMRUdBQ1lfQkFTSUNfUkFURQkweDE0MDgJLy8gIFRYUlhfQ1NSNSAgICAgICAgICAgMHgzMDU0CisjZGVmaW5lIEhUX0JBU0lDX1JBVEUJCTB4MTQwYworI2RlZmluZSBIVF9DVFJMX0NGRwkJMHgxNDEwCisjZGVmaW5lIFNJRlNfQ09TVF9DRkcJCTB4MTQxNAorI2RlZmluZSBSWF9QQVJTRVJfQ0ZHCQkweDE0MTgJLy9TZXQgTkFWIGZvciBhbGwgcmVjZWl2ZWQgZnJhbWVzCisKKy8vCisvLyAgNC41IE1BQyBTZWN1cml0eSBjb25maWd1cmF0aW9uIChvZmZzZXQ6MHgxNTAwKQorLy8KKyNkZWZpbmUgVFhfU0VDX0NOVDAJCTB4MTUwMAkJLy8KKyNkZWZpbmUgUlhfU0VDX0NOVDAJCTB4MTUwNAkJLy8KKyNkZWZpbmUgQ0NNUF9GQ19NVVRFCQkweDE1MDgJCS8vCisvLworLy8gIDQuNiBIQ0NBL1BTTVAgKG9mZnNldDoweDE2MDApCisvLworI2RlZmluZSBUWE9QX0hMRFJfQUREUjAJCTB4MTYwMAorI2RlZmluZSBUWE9QX0hMRFJfQUREUjEJCTB4MTYwNAorI2RlZmluZSBUWE9QX0hMRFJfRVQJCTB4MTYwOAorI2RlZmluZSBRT1NfQ0ZQT0xMX1JBX0RXMAkJMHgxNjBjCisjZGVmaW5lIFFPU19DRlBPTExfQTFfRFcxCQkweDE2MTAKKyNkZWZpbmUgUU9TX0NGUE9MTF9RQwkJMHgxNjE0CisvLworLy8gIDQuNyBNQUMgU3RhdGlzdGlzIHJlZ2lzdGVycyAob2Zmc2V0OjB4MTcwMCkKKy8vCisjZGVmaW5lIFJYX1NUQV9DTlQwCQkweDE3MDAJCS8vCisjZGVmaW5lIFJYX1NUQV9DTlQxCQkweDE3MDQJCS8vCisjZGVmaW5lIFJYX1NUQV9DTlQyCQkweDE3MDgJCS8vCisKKy8vCisvLyBSWF9TVEFfQ05UMF9TVFJVQzogUlggUExDUCBlcnJvciBjb3VudCAmIFJYIENSQyBlcnJvciBjb3VudAorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9SWF9TVEFfQ05UMF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBQaHlFcnI7CisJICAgIFVTSE9SVCAgQ3JjRXJyOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUlhfU1RBX0NOVDBfU1RSVUMsICpQUlhfU1RBX0NOVDBfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUlhfU1RBX0NOVDBfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQ3JjRXJyOworCSAgICBVU0hPUlQgIFBoeUVycjsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJYX1NUQV9DTlQwX1NUUlVDLCAqUFJYX1NUQV9DTlQwX1NUUlVDOworI2VuZGlmCisKKy8vCisvLyBSWF9TVEFfQ05UMV9TVFJVQzogUlggRmFsc2UgQ0NBIGNvdW50ICYgUlggTE9ORyBmcmFtZSBjb3VudAorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9SWF9TVEFfQ05UMV9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBQbGNwRXJyOworCSAgICBVU0hPUlQgIEZhbHNlQ2NhOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUlhfU1RBX0NOVDFfU1RSVUMsICpQUlhfU1RBX0NOVDFfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUlhfU1RBX0NOVDFfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgRmFsc2VDY2E7CisJICAgIFVTSE9SVCAgUGxjcEVycjsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJYX1NUQV9DTlQxX1NUUlVDLCAqUFJYX1NUQV9DTlQxX1NUUlVDOworI2VuZGlmCisKKy8vCisvLyBSWF9TVEFfQ05UMl9TVFJVQzoKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfUlhfU1RBX0NOVDJfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgUnhGaWZvT3ZlcmZsb3dDb3VudDsKKwkgICAgVVNIT1JUICBSeER1cGxpQ291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlSWF9TVEFfQ05UMl9TVFJVQywgKlBSWF9TVEFfQ05UMl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9SWF9TVEFfQ05UMl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBSeER1cGxpQ291bnQ7CisJICAgIFVTSE9SVCAgUnhGaWZvT3ZlcmZsb3dDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJYX1NUQV9DTlQyX1NUUlVDLCAqUFJYX1NUQV9DTlQyX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFRYX1NUQV9DTlQwCQkweDE3MEMJCS8vCisvLworLy8gU1RBX0NTUjM6IFRYIEJlYWNvbiBjb3VudAorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9UWF9TVEFfQ05UMF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBUeEJlYWNvbkNvdW50OworCSAgICBVU0hPUlQgIFR4RmFpbENvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfU1RBX0NOVDBfU1RSVUMsICpQVFhfU1RBX0NOVDBfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfU1RBX0NOVDBfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgVHhGYWlsQ291bnQ7CisJICAgIFVTSE9SVCAgVHhCZWFjb25Db3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1NUQV9DTlQwX1NUUlVDLCAqUFRYX1NUQV9DTlQwX1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFRYX1NUQV9DTlQxCQkweDE3MTAJCS8vCisvLworLy8gVFhfU1RBX0NOVDE6IFRYIHR4IGNvdW50CisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1RYX1NUQV9DTlQxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIFR4UmV0cmFuc21pdDsKKwkgICAgVVNIT1JUICBUeFN1Y2Nlc3M7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9TVEFfQ05UMV9TVFJVQywgKlBUWF9TVEFfQ05UMV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9UWF9TVEFfQ05UMV9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBUeFN1Y2Nlc3M7CisJICAgIFVTSE9SVCAgVHhSZXRyYW5zbWl0OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfU1RBX0NOVDFfU1RSVUMsICpQVFhfU1RBX0NOVDFfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgVFhfU1RBX0NOVDIJCTB4MTcxNAkJLy8KKy8vCisvLyBUWF9TVEFfQ05UMjogVFggdHggY291bnQKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfU1RBX0NOVDJfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgVHhVbmRlckZsb3dDb3VudDsKKwkgICAgVVNIT1JUICBUeFplcm9MZW5Db3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1NUQV9DTlQyX1NUUlVDLCAqUFRYX1NUQV9DTlQyX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1RYX1NUQV9DTlQyX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIFR4WmVyb0xlbkNvdW50OworCSAgICBVU0hPUlQgIFR4VW5kZXJGbG93Q291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9TVEFfQ05UMl9TVFJVQywgKlBUWF9TVEFfQ05UMl9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBUWF9TVEFfRklGTwkJMHgxNzE4CQkvLworLy8KKy8vIFRYX1NUQV9GSUZPX1NUUlVDOiBUWCBSZXN1bHQgZm9yIHNwZWNpZmljIFBJRCBzdGF0dXMgZmlmbyByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uIFBBQ0tFRCBfVFhfU1RBX0ZJRk9fU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJUmVzZXJ2ZToyOworCQlVSU5UMzIJCVR4QkY6MTsgLy8gMyozCisJCVVJTlQzMgkJU3VjY2Vzc1JhdGU6MTM7CS8vaW5jbHVkZSBNQ1MsIG1vZGUgLHNob3J0R0ksIEJXIHNldHRpbmdTYW1lIGZvcm1hdCBhcyBUWFdJIFdvcmQgMCBCaXQgMzEtMTYuCisvLwkJVUlOVDMyCQlTdWNjZXNzUmF0ZToxNjsJLy9pbmNsdWRlIE1DUywgbW9kZSAsc2hvcnRHSSwgQlcgc2V0dGluZ1NhbWUgZm9ybWF0IGFzIFRYV0kgV29yZCAwIEJpdCAzMS0xNi4KKwkJVUlOVDMyCQl3Y2lkOjg7CQkvL3dpcmVsZXNzIGNsaWVudCBpbmRleAorCQlVSU5UMzIgICAgICAgCVR4QWNrUmVxdWlyZWQ6MTsgICAgLy8gYWNrIHJlcXVpcmVkCisJCVVJTlQzMiAgICAgICAJVHhBZ2dyZToxOyAgICAvLyBUeCBpcyBhZ2dyZWdhdGVkCisJCVVJTlQzMiAgICAgICAJVHhTdWNjZXNzOjE7ICAgLy8gVHggc3VjY2Vzcy4gd2hldGhlciBzdWNjZXNzIG9yIG5vdAorCQlVSU5UMzIgICAgICAgCVBpZFR5cGU6NDsKKwkJVUlOVDMyICAgICAgIAliVmFsaWQ6MTsgICAvLyAxOlRoaXMgcmVnaXN0ZXIgY29udGFpbnMgYSB2YWxpZCBUWCByZXN1bHQKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX1NUQV9GSUZPX1NUUlVDLCAqUFRYX1NUQV9GSUZPX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24gUEFDS0VEIF9UWF9TVEFfRklGT19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyICAgICAgIAliVmFsaWQ6MTsgICAvLyAxOlRoaXMgcmVnaXN0ZXIgY29udGFpbnMgYSB2YWxpZCBUWCByZXN1bHQKKwkJVUlOVDMyICAgICAgIAlQaWRUeXBlOjQ7CisJCVVJTlQzMiAgICAgICAJVHhTdWNjZXNzOjE7ICAgLy8gVHggTm8gcmV0cnkgc3VjY2VzcworCQlVSU5UMzIgICAgICAgCVR4QWdncmU6MTsgICAgLy8gVHggUmV0cnkgU3VjY2VzcworCQlVSU5UMzIgICAgICAgCVR4QWNrUmVxdWlyZWQ6MTsgICAgLy8gVHggZmFpbAorCQlVSU5UMzIJCXdjaWQ6ODsJCS8vd2lyZWxlc3MgY2xpZW50IGluZGV4CisvLwkJVUlOVDMyCQlTdWNjZXNzUmF0ZToxNjsJLy9pbmNsdWRlIE1DUywgbW9kZSAsc2hvcnRHSSwgQlcgc2V0dGluZ1NhbWUgZm9ybWF0IGFzIFRYV0kgV29yZCAwIEJpdCAzMS0xNi4KKwkJVUlOVDMyCQlTdWNjZXNzUmF0ZToxMzsJLy9pbmNsdWRlIE1DUywgbW9kZSAsc2hvcnRHSSwgQlcgc2V0dGluZ1NhbWUgZm9ybWF0IGFzIFRYV0kgV29yZCAwIEJpdCAzMS0xNi4KKwkJVUlOVDMyCQlUeEJGOjE7CisJCVVJTlQzMgkJUmVzZXJ2ZToyOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfU1RBX0ZJRk9fU1RSVUMsICpQVFhfU1RBX0ZJRk9fU1RSVUM7CisjZW5kaWYKKy8vIERlYnVnIGNvdW50ZXIKKyNkZWZpbmUgVFhfQUdHX0NOVAkweDE3MWMKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1R4Q291bnQ7CisJICAgIFVTSE9SVCAgTm9uQWdnVHhDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlRfU1RSVUMsICpQVFhfQUdHX0NOVF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIE5vbkFnZ1R4Q291bnQ7CisJICAgIFVTSE9SVCAgQWdnVHhDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlRfU1RSVUMsICpQVFhfQUdHX0NOVF9TVFJVQzsKKyNlbmRpZgorLy8gRGVidWcgY291bnRlcgorI2RlZmluZSBUWF9BR0dfQ05UMAkweDE3MjAKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UMF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplMkNvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemUxQ291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UMF9TVFJVQywgKlBUWF9BR0dfQ05UMF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UMF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplMUNvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemUyQ291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UMF9TVFJVQywgKlBUWF9BR0dfQ05UMF9TVFJVQzsKKyNlbmRpZgorLy8gRGVidWcgY291bnRlcgorI2RlZmluZSBUWF9BR0dfQ05UMQkweDE3MjQKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UMV9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplNENvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemUzQ291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UMV9TVFJVQywgKlBUWF9BR0dfQ05UMV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UMV9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplM0NvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemU0Q291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UMV9TVFJVQywgKlBUWF9BR0dfQ05UMV9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBUWF9BR0dfQ05UMgkweDE3MjgKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UMl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplNkNvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemU1Q291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UMl9TVFJVQywgKlBUWF9BR0dfQ05UMl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UMl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplNUNvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemU2Q291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UMl9TVFJVQywgKlBUWF9BR0dfQ05UMl9TVFJVQzsKKyNlbmRpZgorLy8gRGVidWcgY291bnRlcgorI2RlZmluZSBUWF9BR0dfQ05UMwkweDE3MmMKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UM19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplOENvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemU3Q291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UM19TVFJVQywgKlBUWF9BR0dfQ05UM19TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UM19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplN0NvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemU4Q291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UM19TVFJVQywgKlBUWF9BR0dfQ05UM19TVFJVQzsKKyNlbmRpZgorLy8gRGVidWcgY291bnRlcgorI2RlZmluZSBUWF9BR0dfQ05UNAkweDE3MzAKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UNF9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplMTBDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplOUNvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDRfU1RSVUMsICpQVFhfQUdHX0NOVDRfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDRfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTlDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplMTBDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlQ0X1NUUlVDLCAqUFRYX0FHR19DTlQ0X1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFRYX0FHR19DTlQ1CTB4MTczNAorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQ1X1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1NpemUxMkNvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemUxMUNvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDVfU1RSVUMsICpQVFhfQUdHX0NOVDVfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDVfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTExQ291bnQ7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTEyQ291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UNV9TVFJVQywgKlBUWF9BR0dfQ05UNV9TVFJVQzsKKyNlbmRpZgorI2RlZmluZSBUWF9BR0dfQ05UNgkJMHgxNzM4CisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDZfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTE0Q291bnQ7CisJICAgIFVTSE9SVCAgQWdnU2l6ZTEzQ291bnQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlUWF9BR0dfQ05UNl9TVFJVQywgKlBUWF9BR0dfQ05UNl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UNl9TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplMTNDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplMTRDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlQ2X1NUUlVDLCAqUFRYX0FHR19DTlQ2X1NUUlVDOworI2VuZGlmCisjZGVmaW5lIFRYX0FHR19DTlQ3CQkweDE3M2MKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UN19TVFJVQwl7CisJc3RydWN0CXsKKwkgICAgVVNIT1JUICBBZ2dTaXplMTZDb3VudDsKKwkgICAgVVNIT1JUICBBZ2dTaXplMTVDb3VudDsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVRYX0FHR19DTlQ3X1NUUlVDLCAqUFRYX0FHR19DTlQ3X1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQ3X1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIEFnZ1NpemUxNUNvdW50OworCSAgICBVU0hPUlQgIEFnZ1NpemUxNkNvdW50OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JVFhfQUdHX0NOVDdfU1RSVUMsICpQVFhfQUdHX0NOVDdfU1RSVUM7CisjZW5kaWYKKyNkZWZpbmUgTVBEVV9ERU5TSVRZX0NOVAkJMHgxNzQwCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfTVBEVV9ERU5fQ05UX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVU0hPUlQgIFJYWmVyb0RlbENvdW50OwkvL1JYIHplcm8gbGVuZ3RoIGRlbGltaXRlciBjb3VudAorCSAgICBVU0hPUlQgIFRYWmVyb0RlbENvdW50OwkvL1RYIHplcm8gbGVuZ3RoIGRlbGltaXRlciBjb3VudAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTVBEVV9ERU5fQ05UX1NUUlVDLCAqUE1QRFVfREVOX0NOVF9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9NUERVX0RFTl9DTlRfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVTSE9SVCAgVFhaZXJvRGVsQ291bnQ7CS8vVFggemVybyBsZW5ndGggZGVsaW1pdGVyIGNvdW50CisJICAgIFVTSE9SVCAgUlhaZXJvRGVsQ291bnQ7CS8vUlggemVybyBsZW5ndGggZGVsaW1pdGVyIGNvdW50CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlNUERVX0RFTl9DTlRfU1RSVUMsICpQTVBEVV9ERU5fQ05UX1NUUlVDOworI2VuZGlmCisvLworLy8gVFhSWCBjb250cm9sIHJlZ2lzdGVycyAtIGJhc2UgYWRkcmVzcyAweDMwMDAKKy8vCisvLyBydDI4NjBiICBVTktOT1dOIHJlZyB1c2UgUi9PIFJlZyBBZGRyIDB4NzdkMCBmaXJzdC4uCisjZGVmaW5lIFRYUlhfQ1NSMSAgICAgICAgICAgMHg3N2QwCisKKy8vCisvLyBTZWN1cml0eSBrZXkgdGFibGUgbWVtb3J5LCBiYXNlIGFkZHJlc3MgPSAweDEwMDAKKy8vCisjZGVmaW5lIE1BQ19XQ0lEX0JBU0UJCTB4MTgwMCAvLzgtYnl0ZXModXNlIG9ubHkgNi1ieXRlcykgKiAyNTYgZW50cnkgPQorI2RlZmluZSBIV19XQ0lEX0VOVFJZX1NJWkUgICA4CisjZGVmaW5lIFBBSVJXSVNFX0tFWV9UQUJMRV9CQVNFICAgICAweDQwMDAgICAgICAvLyAzMi1ieXRlICogMjU2LWVudHJ5ID0gIC1ieXRlCisjZGVmaW5lIEhXX0tFWV9FTlRSWV9TSVpFICAgICAgICAgICAweDIwCisjZGVmaW5lIFBBSVJXSVNFX0lWRUlWX1RBQkxFX0JBU0UgICAgIDB4NjAwMCAgICAgIC8vIDgtYnl0ZSAqIDI1Ni1lbnRyeSA9ICAtYnl0ZQorI2RlZmluZSBNQUNfSVZFSVZfVEFCTEVfQkFTRSAgICAgMHg2MDAwICAgICAgLy8gOC1ieXRlICogMjU2LWVudHJ5ID0gIC1ieXRlCisjZGVmaW5lIEhXX0lWRUlWX0VOVFJZX1NJWkUgICA4CisjZGVmaW5lIE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICAgICAweDY4MDAgICAgICAvLyA0LWJ5dGUgKiAyNTYtZW50cnkgPSAgLWJ5dGUKKyNkZWZpbmUgSFdfV0NJRF9BVFRSSV9TSVpFICAgNAorI2RlZmluZSBXQ0lEX1JFU0VSVkVEICAgICAgICAgIAkJMHg2YmZjCisjZGVmaW5lIFNIQVJFRF9LRVlfVEFCTEVfQkFTRSAgICAgICAweDZjMDAgICAgICAvLyAzMi1ieXRlICogMTYtZW50cnkgPSA1MTItYnl0ZQorI2RlZmluZSBTSEFSRURfS0VZX01PREVfQkFTRSAgICAgICAweDcwMDAgICAgICAvLyAzMi1ieXRlICogMTYtZW50cnkgPSA1MTItYnl0ZQorI2RlZmluZSBIV19TSEFSRURfS0VZX01PREVfU0laRSAgIDQKKyNkZWZpbmUgU0hBUkVES0VZVEFCTEUJCQkwCisjZGVmaW5lIFBBSVJXSVNFS0VZVEFCTEUJCQkxCisKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX1NIQVJFREtFWV9NT0RFX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MxS2V5M0NpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MxS2V5MkNpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MxS2V5MUNpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MxS2V5MENpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MwS2V5M0NpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MwS2V5MkNpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MwS2V5MUNpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MwS2V5MENpcGhlckFsZzozOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JU0hBUkVES0VZX01PREVfU1RSVUMsICpQU0hBUkVES0VZX01PREVfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfU0hBUkVES0VZX01PREVfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMiAgICAgICBCc3MwS2V5MENpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MwS2V5MUNpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MwS2V5MkNpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MwS2V5M0NpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MxS2V5MENpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MxS2V5MUNpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MxS2V5MkNpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJCVVJTlQzMiAgICAgICBCc3MxS2V5M0NpcGhlckFsZzozOworCQlVSU5UMzIgICAgICAgOjE7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlTSEFSRURLRVlfTU9ERV9TVFJVQywgKlBTSEFSRURLRVlfTU9ERV9TVFJVQzsKKyNlbmRpZgorLy8gNjQtZW50cnkgZm9yIHBhaXJ3aXNlIGtleSB0YWJsZQordHlwZWRlZiBzdHJ1Y3QgX0hXX1dDSURfRU5UUlkgeyAgLy8gOC1ieXRlIHBlciBlbnRyeQorICAgIFVDSEFSICAgQWRkcmVzc1s2XTsKKyAgICBVQ0hBUiAgIFJzdlsyXTsKK30gSFdfV0NJRF9FTlRSWSwgUEhXX1dDSURfRU5UUlk7CisKKworCisvLworLy8gT3RoZXIgb24tY2hpcCBzaGFyZWQgbWVtb3J5IHNwYWNlLCBiYXNlID0gMHgyMDAwCisvLworCisvLyBDSVMgc3BhY2UgLSBiYXNlIGFkZHJlc3MgPSAweDIwMDAKKyNkZWZpbmUgSFdfQ0lTX0JBU0UgICAgICAgICAgICAgMHgyMDAwCisKKy8vIENhcnJpZXItc2Vuc2UgQ1RTIGZyYW1lIGJhc2UgYWRkcmVzcy4gSXQncyB3aGVyZSBtYWMgc3RvcmVzIGNhcnJpZXItc2Vuc2UgZnJhbWUgZm9yIGNhcnJpZXItc2Vuc2UgZnVuY3Rpb24uCisjZGVmaW5lIEhXX0NTX0NUU19CQVNFCQkJMHg3NzAwCisvLyBERlMgQ1RTIGZyYW1lIGJhc2UgYWRkcmVzcy4gSXQncyB3aGVyZSBtYWMgc3RvcmVzIENUUyBmcmFtZSBmb3IgREZTLgorI2RlZmluZSBIV19ERlNfQ1RTX0JBU0UJCQkweDc3ODAKKyNkZWZpbmUgSFdfQ1RTX0ZSQU1FX1NJWkUJCTB4ODAKKworLy8gMjAwNC0xMS0wOCBqb2huIC0gc2luY2UgTlVMTCBmcmFtZSB3b24ndCBiZSB0aGF0IGxvbmcgKDI1NiBieXRlKS4gV2Ugc3RlYWwgMTYgdGFpbCBieXRlcworLy8gdG8gc2F2ZSBkZWJ1Z2dpbmcgc2V0dGluZ3MKKyNkZWZpbmUgSFdfREVCVUdfU0VUVElOR19CQVNFICAgMHg3N2YwICAvLyAweDc3ZjB+MHg3N2ZmIHRvdGFsIDE2IGJ5dGVzCisjZGVmaW5lIEhXX0RFQlVHX1NFVFRJTkdfQkFTRTIgICAweDc3NzAgIC8vIDB4NzdmMH4weDc3ZmYgdG90YWwgMTYgYnl0ZXMKKworI2lmIDAKKy8vIG9uLWNoaXAgQkVBQ09OIGZyYW1lIHNwYWNlIC0gYmFzZSBhZGRyZXNzID0gMHg3ODAwCisjZGVmaW5lIEhXX0JFQUNPTl9NQVhfU0laRSAgICAgIDB4MDgwMCAvKiB1bml0OiBieXRlICovCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFMCAgICAgICAgIDB4NzgwMAorI2RlZmluZSBIV19CRUFDT05fQkFTRTEgICAgICAgICAweDc5MDAKKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0UyICAgICAgICAgMHg3YTAwCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFMyAgICAgICAgIDB4N2IwMAorI2RlZmluZSBIV19CRUFDT05fQkFTRTQgICAgICAgICAweDdjMDAKKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0U1ICAgICAgICAgMHg3ZDAwCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFNiAgICAgICAgIDB4N2UwMAorI2RlZmluZSBIV19CRUFDT05fQkFTRTcgICAgICAgICAweDdmMDAKKy8qIDEuIEhXX0JFQUNPTl9PRkZTRVQvNjRCIG11c3QgYmUgMDsKKyAgIDIuIEJDTl9PRkZTRVQwIG11c3QgYWxzbyBiZSBjaGFuZ2VkIGluIE5JQ0luaXRpYWxpemVBc2ljKCk7CisgICAzLiBtYXggMHgwODAwIGZvciA4IGJlYWNvbiBmcmFtZXM7ICovCisjZWxzZQorLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCBtYXhpbXVtIDggTUJTUyBhbmQgaXRzIG1heGltdW0gbGVuZ3RoIGlzIDUxMiBmb3IgZWFjaCBiZWFjb24KKy8vIFRocmVlIHNlY3Rpb24gZGlzY29udGludWUgbWVtb3J5IHNlZ21lbnRzIHdpbGwgYmUgdXNlZC4KKy8vIDEuIFRoZSBvcmlnaW5hbCByZWdpb24gZm9yIEJDTiAwfjMKKy8vIDIuIEV4dHJhY3QgbWVtb3J5IGZyb20gRkNFIHRhYmxlIGZvciBCQ04gNH41CisvLyAzLiBFeHRyYWN0IG1lbW9yeSBmcm9tIFBhaXItd2lzZSBrZXkgdGFibGUgZm9yIEJDTiA2fjcKKy8vCSAgSXQgb2NjdXBpZWQgdGhvc2UgbWVtb3J5IG9mIHdjaWQgMjM4fjI1MyBmb3IgQkNOIDYKKy8vCQkJCQkJICAgICAgYW5kIHdjaWQgMjIyfjIzNyBmb3IgQkNOIDcKKyNkZWZpbmUgSFdfQkVBQ09OX01BWF9TSVpFICAgICAgMHgxMDAwIC8qIHVuaXQ6IGJ5dGUgKi8KKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0UwICAgICAgICAgMHg3ODAwCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFMSAgICAgICAgIDB4N0EwMAorI2RlZmluZSBIV19CRUFDT05fQkFTRTIgICAgICAgICAweDdDMDAKKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0UzICAgICAgICAgMHg3RTAwCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFNCAgICAgICAgIDB4NzIwMAorI2RlZmluZSBIV19CRUFDT05fQkFTRTUgICAgICAgICAweDc0MDAKKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0U2ICAgICAgICAgMHg1REMwCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFNyAgICAgICAgIDB4NUJDMAorI2VuZGlmCisKKyNkZWZpbmUgSFdfQkVBQ09OX01BWF9DT1VOVCAgICAgOAorI2RlZmluZSBIV19CRUFDT05fT0ZGU0VUCQkweDAyMDAKKyNkZWZpbmUgSFdfQkVBQ09OX0NPTlRFTlRfTEVOCShIV19CRUFDT05fT0ZGU0VUIC0gVFhXSV9TSVpFKQorCisvLyBIT1NULU1DVSBzaGFyZWQgbWVtb3J5IC0gYmFzZSBhZGRyZXNzID0gMHgyMTAwCisjZGVmaW5lIEhPU1RfQ01EX0NTUgkJMHg0MDQKKyNkZWZpbmUgSDJNX01BSUxCT1hfQ1NSICAgICAgICAgMHg3MDEwCisjZGVmaW5lIEgyTV9NQUlMQk9YX0NJRCAgICAgICAgIDB4NzAxNAorI2RlZmluZSBIMk1fTUFJTEJPWF9TVEFUVVMgICAgICAweDcwMWMKKyNkZWZpbmUgSDJNX0lOVF9TUkMgICAgICAgICAgICAgMHg3MDI0CisjZGVmaW5lIEgyTV9CQlBfQUdFTlQgICAgICAgICAgIDB4NzAyOAorI2RlZmluZSBNMkhfQ01EX0RPTkVfQ1NSICAgICAgICAweDAwMGMKKyNkZWZpbmUgTUNVX1RYT1BfQVJSQVlfQkFTRSAgICAgMHgwMDBjICAgLy8gVE9ETzogdG8gYmUgcHJvdmlkZWQgYnkgQWxiZXJ0CisjZGVmaW5lIE1DVV9UWE9QX0VOVFJZX1NJWkUgICAgIDMyICAgICAgIC8vIFRPRE86IHRvIGJlIHByb3ZpZGVkIGJ5IEFsYmVydAorI2RlZmluZSBNQVhfTlVNX09GX1RYT1BfRU5UUlkgICAxNiAgICAgICAvLyBUT0RPOiBtdXN0IGJlIHNhbWUgd2l0aCA4MDUxIGZpcm13YXJlCisjZGVmaW5lIE1DVV9NQk9YX1ZFUlNJT04gICAgICAgIDB4MDEgICAgIC8vIFRPRE86IHRvIGJlIGNvbmZpcm1lZCBieSBBbGJlcnQKKyNkZWZpbmUgTUNVX01CT1hfVkVSU0lPTl9PRkZTRVQgNSAgICAgICAgLy8gVE9ETzogdG8gYmUgcHJvdmlkZWQgYnkgQWxiZXJ0CisKKy8vCisvLyBIb3N0IERNQSByZWdpc3RlcnMgLSBiYXNlIGFkZHJlc3MgMHgyMDAgLiAgVFgwLTM9RURDQVFpZDAtMywgVFg0PUhDQ0EsIFRYNT1NR01ULAorLy8KKy8vCisvLyAgRE1BIFJJTkcgREVTQ1JJUFRPUgorLy8KKyNkZWZpbmUgRTJQUk9NX0NTUiAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgSU9fQ05UTF9DU1IgICAgICAgICAweDc3ZDAKKworI2lmZGVmIFJUMjg3MAorLy8gODA1MSBmaXJtd2FyZSBpbWFnZSBmb3IgdXNiIC0gdXNlIGxhc3QtaGFsZiBiYXNlIGFkZHJlc3MgPSAweDMwMDAKKyNkZWZpbmUgRklSTVdBUkVfSU1BR0VfQkFTRSAgICAgMHgzMDAwCisjZGVmaW5lIE1BWF9GSVJNV0FSRV9JTUFHRV9TSVpFIDB4MTAwMCAgICAvLyA0a2J5dGUKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworLy8gVE9ETzogPz8/Pz8gb2xkIFJUMjU2MCByZWdpc3RlcnMuIHRvIGtlZXAgdGhlbSBvciByZW1vdmUgdGhlbT8KKy8vI2RlZmluZSBNQ0FTVDAgICAgICAgICAgICAgICAgICAweDAxNzggIC8vIG11bHRpY2FzdCBmaWx0ZXIgcmVnaXN0ZXIgMAorLy8jZGVmaW5lIE1DQVNUMSAgICAgICAgICAgICAgICAgIDB4MDE3YyAgLy8gbXVsdGljYXN0IGZpbHRlciByZWdpc3RlciAxCisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gVHggLwlSeCAvIE1nbXQgcmluZyBkZXNjcmlwdG9yIGRlZmluaXRpb24KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gdGhlIGZvbGxvd2luZyBQSUQgdmFsdWVzIGFyZSB1c2VkIHRvIG1hcmsgb3V0Z29pbmcgZnJhbWUgdHlwZSBpbiBUWEQtPlBJRCBzbyB0aGF0CisvLyBwcm9wZXIgVFggc3RhdGlzdGljcyBjYW4gYmUgY29sbGVjdGVkIGJhc2VkIG9uIHRoZXNlIGNhdGVnb3JpZXMKKy8vIGIzLTIgb2YgUElEIGZpZWxkIC0KKyNkZWZpbmUgUElEX01HTVQJCQkweDA1CisjZGVmaW5lIFBJRF9CRUFDT04JCQkweDBjCisjZGVmaW5lIFBJRF9EQVRBX05PUk1BTFVDQVNUCSAJMHgwMgorI2RlZmluZSBQSURfREFUQV9BTVBEVQkgCTB4MDQKKyNkZWZpbmUgUElEX0RBVEFfTk9fQUNLICAgIAkweDA4CisjZGVmaW5lIFBJRF9EQVRBX05PVF9OT1JNX0FDSwkgCTB4MDMKKyNpZiAwCisjZGVmaW5lIFBUWVBFX0RBVEFfUkVRVUlSRV9BQ0sgIDB4MDAgLy8gYjctNjowMCwgYjUtMDogMH41OSBpcyBNQUMgdGFibGUgaW5kZXggKEFJRD8pLCA2MH42MyBpcyBXRFMgaW5kZXgKKyNkZWZpbmUgUFRZUEVfTlVMTF9BVF9ISUdIX1JBVEUgMHgwNCAvLyBiNy02OjAxLCBiNS0wOiAwfjU5IGlzIE1BQyB0YWJsZSBpbmRleCAoQUlEPyksIDYwfjYzIGlzIFdEUyBpbmRleAorI2RlZmluZSBQVFlQRV9SRVNFUlZFRCAgICAgICAgICAweDA4IC8vIGI3LTY6MTAKKyNkZWZpbmUgUFRZUEVfU1BFQ0lBTCAgICAgICAgICAgMHgwYyAvLyBiNy02OjExCisKKy8vIHdoZW4gYjMtMj0xMSAoUFRZUEVfU1BFQ0lBTCksIGIxLTAgY291YmUgYmUgLi4uCisjZGVmaW5lIFBTVUJUWVBFX0RBVEFfTk9fQUNLICAgIDB4MDAKKyNkZWZpbmUgUFNVQlRZUEVfTUdNVCAgICAgICAgICAgMHgwMQorI2RlZmluZSBQU1VCVFlQRV9PVEhFUl9DTlRMICAgICAweDAyCisjZGVmaW5lIFBTVUJUWVBFX1JUUyAgICAgICAgICAgIDB4MDMKKyNlbmRpZgorLy8gdmFsdWUgZG9tYWluIG9mIHBUeEQtPkhvc3RRSWQgKDQtYml0OiAwfjE1KQorI2RlZmluZSBRSURfQUNfQksgICAgICAgICAgICAgICAxICAgLy8gbWVldCBBQ0kgZGVmaW5pdGlvbiBpbiA4MDIuMTFlCisjZGVmaW5lIFFJRF9BQ19CRSAgICAgICAgICAgICAgIDAgICAvLyBtZWV0IEFDSSBkZWZpbml0aW9uIGluIDgwMi4xMWUKKyNkZWZpbmUgUUlEX0FDX1ZJICAgICAgICAgICAgICAgMgorI2RlZmluZSBRSURfQUNfVk8gICAgICAgICAgICAgICAzCisjZGVmaW5lIFFJRF9IQ0NBICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTlVNX09GX1RYX1JJTkcgICAgICAgICAgNQorI2RlZmluZSBRSURfTUdNVCAgICAgICAgICAgICAgICAxMworI2RlZmluZSBRSURfUlggICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBRSURfT1RIRVIgICAgICAgICAgICAgICAxNQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQkJQICYgUkYJZGVmaW5pdGlvbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lCUJVU1kJCSAgICAgICAgICAgICAgICAxCisjZGVmaW5lCUlETEUJCSAgICAgICAgICAgICAgICAwCisKKyNkZWZpbmUJUkZfUjAwCQkJCQkgICAgMAorI2RlZmluZQlSRl9SMDEJCQkJCSAgICAxCisjZGVmaW5lCVJGX1IwMgkJCQkJICAgIDIKKyNkZWZpbmUJUkZfUjAzCQkJCQkgICAgMworI2RlZmluZQlSRl9SMDQJCQkJCSAgICA0CisjZGVmaW5lCVJGX1IwNQkJCQkJICAgIDUKKyNkZWZpbmUJUkZfUjA2CQkJCQkgICAgNgorI2RlZmluZQlSRl9SMDcJCQkJCSAgICA3CisjZGVmaW5lCVJGX1IwOAkJCQkJICAgIDgKKyNkZWZpbmUJUkZfUjA5CQkJCQkgICAgOQorI2RlZmluZQlSRl9SMTAJCQkJCSAgICAxMAorI2RlZmluZQlSRl9SMTEJCQkJCSAgICAxMQorI2RlZmluZQlSRl9SMTIJCQkJCSAgICAxMgorI2RlZmluZQlSRl9SMTMJCQkJCSAgICAxMworI2RlZmluZQlSRl9SMTQJCQkJCSAgICAxNAorI2RlZmluZQlSRl9SMTUJCQkJCSAgICAxNQorI2RlZmluZQlSRl9SMTYJCQkJCSAgICAxNgorI2RlZmluZQlSRl9SMTcJCQkJCSAgICAxNworI2RlZmluZQlSRl9SMTgJCQkJCSAgICAxOAorI2RlZmluZQlSRl9SMTkJCQkJCSAgICAxOQorI2RlZmluZQlSRl9SMjAJCQkJCSAgICAyMAorI2RlZmluZQlSRl9SMjEJCQkJCSAgICAyMQorI2RlZmluZQlSRl9SMjIJCQkJCSAgICAyMgorI2RlZmluZQlSRl9SMjMJCQkJCSAgICAyMworI2RlZmluZQlSRl9SMjQJCQkJCSAgICAyNAorI2RlZmluZQlSRl9SMjUJCQkJCSAgICAyNQorI2RlZmluZQlSRl9SMjYJCQkJCSAgICAyNgorI2RlZmluZQlSRl9SMjcJCQkJCSAgICAyNworI2RlZmluZQlSRl9SMjgJCQkJCSAgICAyOAorI2RlZmluZQlSRl9SMjkJCQkJCSAgICAyOQorI2RlZmluZQlSRl9SMzAJCQkJCSAgICAzMAorI2RlZmluZQlSRl9SMzEJCQkJCSAgICAzMQorCisjZGVmaW5lCUJCUF9SMAkJCQkJICAgIDAgIC8vIHZlcnNpb24KKyNkZWZpbmUJQkJQX1IxCQkJCSAgICAgICAgMSAgLy8gVFNTSQorI2RlZmluZQlCQlBfUjIgICAgICAgICAgCQkJMiAgLy8gVFggY29uZmlndXJlCisjZGVmaW5lIEJCUF9SMyAgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIEJCUF9SNCAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIEJCUF9SNSAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIEJCUF9SNiAgICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lCUJCUF9SMTQJCQkgICAgICAgICAgICAxNCAvLyBSWCBjb25maWd1cmUKKyNkZWZpbmUgQkJQX1IxNiAgICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIEJCUF9SMTcgICAgICAgICAgICAgICAgICAgICAxNyAvLyBSWCBzZW5zaWJpbGl0eQorI2RlZmluZSBCQlBfUjE4ICAgICAgICAgICAgICAgICAgICAgMTgKKyNkZWZpbmUgQkJQX1IyMSAgICAgICAgICAgICAgICAgICAgIDIxCisjZGVmaW5lIEJCUF9SMjIgICAgICAgICAgICAgICAgICAgICAyMgorI2RlZmluZSBCQlBfUjI0ICAgICAgICAgICAgICAgICAgICAgMjQKKyNkZWZpbmUgQkJQX1IyNSAgICAgICAgICAgICAgICAgICAgIDI1CisjZGVmaW5lIEJCUF9SNDkgICAgICAgICAgICAgICAgICAgICA0OSAvL1RTU0kKKyNkZWZpbmUgQkJQX1I1MCAgICAgICAgICAgICAgICAgICAgIDUwCisjZGVmaW5lIEJCUF9SNTEgICAgICAgICAgICAgICAgICAgICA1MQorI2RlZmluZSBCQlBfUjUyICAgICAgICAgICAgICAgICAgICAgNTIKKyNkZWZpbmUgQkJQX1I1NSAgICAgICAgICAgICAgICAgICAgIDU1CisjZGVmaW5lIEJCUF9SNjIgICAgICAgICAgICAgICAgICAgICA2MiAvLyBSeCBTUTAgVGhyZXNob2xkIEhJR0gKKyNkZWZpbmUgQkJQX1I2MyAgICAgICAgICAgICAgICAgICAgIDYzCisjZGVmaW5lIEJCUF9SNjQgICAgICAgICAgICAgICAgICAgICA2NAorI2RlZmluZSBCQlBfUjY1ICAgICAgICAgICAgICAgICAgICAgNjUKKyNkZWZpbmUgQkJQX1I2NiAgICAgICAgICAgICAgICAgICAgIDY2CisjZGVmaW5lIEJCUF9SNjcgICAgICAgICAgICAgICAgICAgICA2NworI2RlZmluZSBCQlBfUjY4ICAgICAgICAgICAgICAgICAgICAgNjgKKyNkZWZpbmUgQkJQX1I2OSAgICAgICAgICAgICAgICAgICAgIDY5CisjZGVmaW5lIEJCUF9SNzAgICAgICAgICAgICAgICAgICAgICA3MCAvLyBSeCBBR0MgU1EgQ0NLIFhjb3JyIHRocmVzaG9sZAorI2RlZmluZSBCQlBfUjczICAgICAgICAgICAgICAgICAgICAgNzMKKyNkZWZpbmUgQkJQX1I3NQkJCQkJCTc1CisjZGVmaW5lIEJCUF9SNzcgICAgICAgICAgICAgICAgICAgICA3NworI2RlZmluZSBCQlBfUjgxICAgICAgICAgICAgICAgICAgICAgODEKKyNkZWZpbmUgQkJQX1I4MiAgICAgICAgICAgICAgICAgICAgIDgyCisjZGVmaW5lIEJCUF9SODMgICAgICAgICAgICAgICAgICAgICA4MworI2RlZmluZSBCQlBfUjg0ICAgICAgICAgICAgICAgICAgICAgODQKKyNkZWZpbmUgQkJQX1I4NgkJCQkJCTg2CisjZGVmaW5lIEJCUF9SOTEJCQkJCQk5MQorI2RlZmluZSBCQlBfUjkyCQkJCQkJOTIKKyNkZWZpbmUgQkJQX1I5NCAgICAgICAgICAgICAgICAgICAgIDk0IC8vIFR4IEdhaW4gQ29udHJvbAorI2RlZmluZSBCQlBfUjEwMyAgICAgICAgICAgICAgICAgICAgMTAzCisjZGVmaW5lIEJCUF9SMTA1ICAgICAgICAgICAgICAgICAgICAxMDUKKyNkZWZpbmUgQkJQX1IxMTMgICAgICAgICAgICAgICAgICAgIDExMworI2RlZmluZSBCQlBfUjExNCAgICAgICAgICAgICAgICAgICAgMTE0CisjZGVmaW5lIEJCUF9SMTE1ICAgICAgICAgICAgICAgICAgICAxMTUKKyNkZWZpbmUgQkJQX1IxMTYgICAgICAgICAgICAgICAgICAgIDExNgorI2RlZmluZSBCQlBfUjExNyAgICAgICAgICAgICAgICAgICAgMTE3CisjZGVmaW5lIEJCUF9SMTE4ICAgICAgICAgICAgICAgICAgICAxMTgKKyNkZWZpbmUgQkJQX1IxMTkgICAgICAgICAgICAgICAgICAgIDExOQorI2RlZmluZSBCQlBfUjEyMCAgICAgICAgICAgICAgICAgICAgMTIwCisjZGVmaW5lIEJCUF9SMTIxICAgICAgICAgICAgICAgICAgICAxMjEKKyNkZWZpbmUgQkJQX1IxMjIgICAgICAgICAgICAgICAgICAgIDEyMgorI2RlZmluZSBCQlBfUjEyMyAgICAgICAgICAgICAgICAgICAgMTIzCisKKworI2RlZmluZSBCQlBSOTRfREVGQVVMVCAgICAgICAgICAgICAgMHgwNiAvLyBBZGQgMSB2YWx1ZSB3aWxsIGdhaW4gMWRiCisKKy8vI2RlZmluZSBQSFlfVFJfU1dJVENIX1RJTUUgICAgICAgICAgNSAgLy8gdXNlYworCisvLyNkZWZpbmUgQkJQX1IxN19MT1dfU0VOU0lCSUxJVFkgICAgIDB4NTAKKy8vI2RlZmluZSBCQlBfUjE3X01JRF9TRU5TSUJJTElUWSAgICAgMHg0MQorLy8jZGVmaW5lIEJCUF9SMTdfRFlOQU1JQ19VUF9CT1VORCAgICAweDQwCisjZGVmaW5lIFJTU0lfRk9SX1ZFUllfTE9XX1NFTlNJQklMSVRZIC0zNQorI2RlZmluZSBSU1NJX0ZPUl9MT1dfU0VOU0lCSUxJVFkgICAgICAtNTgKKyNkZWZpbmUgUlNTSV9GT1JfTUlEX0xPV19TRU5TSUJJTElUWSAgLTgwCisjZGVmaW5lIFJTU0lfRk9SX01JRF9TRU5TSUJJTElUWSAgICAgIC05MAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVFUFJPTSBkZWZpbml0aW9uCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRUVETyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgRUVESSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgRUVDUyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgRUVTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgRUVSTCAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAKKworI2RlZmluZSBFRVBST01fV1JJVEVfT1BDT0RFICAgICAgICAgMHgwNQorI2RlZmluZSBFRVBST01fUkVBRF9PUENPREUgICAgICAgICAgMHgwNgorI2RlZmluZSBFRVBST01fRVdEU19PUENPREUgICAgICAgICAgMHgxMAorI2RlZmluZSBFRVBST01fRVdFTl9PUENPREUgICAgICAgICAgMHgxMworCisjZGVmaW5lCU5VTV9FRVBST01fQkJQX1BBUk1TCQkxOQkJCS8vIEluY2x1ZGUgTklDIENvbmZpZyAwLCAxLCBDUiwgVFggQUxDIHN0ZXAsIEJCUHMKKyNkZWZpbmUJTlVNX0VFUFJPTV9UWF9HX1BBUk1TCQk3CisjZGVmaW5lCUVFUFJPTV9OSUMxX09GRlNFVCAgICAgICAgICAweDM0CQkvLyBUaGUgYWRkcmVzcyBpcyBmcm9tIE5JQyBjb25maWcgMCwgbm90IEJCUCByZWdpc3RlciBJRAorI2RlZmluZQlFRVBST01fTklDMl9PRkZTRVQgICAgICAgICAgMHgzNgkJLy8gVGhlIGFkZHJlc3MgaXMgZnJvbSBOSUMgY29uZmlnIDAsIG5vdCBCQlAgcmVnaXN0ZXIgSUQKKyNkZWZpbmUJRUVQUk9NX0JCUF9CQVNFX09GRlNFVAkJMHhmMAkJLy8gVGhlIGFkZHJlc3MgaXMgZnJvbSBOSUMgY29uZmlnIDAsIG5vdCBCQlAgcmVnaXN0ZXIgSUQKKyNkZWZpbmUJRUVQUk9NX0dfVFhfUFdSX09GRlNFVAkJMHg1MgorI2RlZmluZQlFRVBST01fR19UWDJfUFdSX09GRlNFVAkJMHg2MAorI2RlZmluZSBFRVBST01fTEVEMV9PRkZTRVQJCQkweDNjCisjZGVmaW5lIEVFUFJPTV9MRUQyX09GRlNFVAkJCTB4M2UKKyNkZWZpbmUgRUVQUk9NX0xFRDNfT0ZGU0VUCQkJMHg0MAorI2RlZmluZSBFRVBST01fTE5BX09GRlNFVAkJCTB4NDQKKyNkZWZpbmUgRUVQUk9NX1JTU0lfQkdfT0ZGU0VUCQkweDQ2CisjZGVmaW5lIEVFUFJPTV9SU1NJX0FfT0ZGU0VUCQkweDRhCisjZGVmaW5lIEVFUFJPTV9ERUZJTkVfTUFYX1RYUFdSCQkweDRlCisjZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0JZUkFURV8yME1IWl8yXzRHCTB4ZGUJLy8gMjBNSFogMi40RyB0eCBwb3dlci4KKyNkZWZpbmUgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzQwTUhaXzJfNEcJMHhlZQkvLyA0ME1IWiAyLjRHIHR4IHBvd2VyLgorI2RlZmluZSBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfNUcJCTB4ZmEJLy8gMjBNSFogNUcgdHggcG93ZXIuCisjZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0JZUkFURV80ME1IWl81RwkJMHgxMGEJLy8gNDBNSFogNUcgdHggcG93ZXIuCisjZGVmaW5lIEVFUFJPTV9BX1RYX1BXUl9PRkZTRVQgICAgICAweDc4CisjZGVmaW5lIEVFUFJPTV9BX1RYMl9QV1JfT0ZGU0VUICAgICAgMHhhNgorLy8jZGVmaW5lIEVFUFJPTV9KYXBhbl9UWF9QV1JfT0ZGU0VUICAgICAgMHg5MCAvLyA4MDIuMTFqCisvLyNkZWZpbmUgRUVQUk9NX0phcGFuX1RYMl9QV1JfT0ZGU0VUICAgICAgMHhiZQorLy8jZGVmaW5lIEVFUFJPTV9UU1NJX1JFRl9PRkZTRVQJMHg1NAorLy8jZGVmaW5lIEVFUFJPTV9UU1NJX0RFTFRBX09GRlNFVAkweDI0CisvLyNkZWZpbmUgRUVQUk9NX0NDS19UWF9QV1JfT0ZGU0VUICAweDYyCisvLyNkZWZpbmUgRUVQUk9NX0NBTElCUkFURV9PRkZTRVQJMHg3YworI2RlZmluZSBFRVBST01fVkVSU0lPTl9PRkZTRVQgICAgICAgMHgwMgorI2RlZmluZQlFRVBST01fRlJFUV9PRkZTRVQJCQkweDNhCisjZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0JZUkFURSAJMHhkZQkvLyAyME1IWiBwb3dlci4KKyNkZWZpbmUgRUVQUk9NX1RYUE9XRVJfREVMVEEJCTB4NTAJLy8gMjBNSFogQU5EIDQwIE1IWiB1c2UgZGlmZmVyZW50IHBvd2VyLiBUaGlzIGlzIGRlbHRhIGluIDQwTUhaLgorI2RlZmluZSBWQUxJRF9FRVBST01fVkVSU0lPTiAgICAgICAgMQorCisvLyBQYWlyS2V5TW9kZSBkZWZpbml0aW9uCisjZGVmaW5lIFBLTU9ERV9OT05FICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFBLTU9ERV9XRVA2NCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFBLTU9ERV9XRVAxMjggICAgICAgICAgICAgICAyCisjZGVmaW5lIFBLTU9ERV9US0lQICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFBLTU9ERV9BRVMgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFBLTU9ERV9DS0lQNjQgICAgICAgICAgICAgICA1CisjZGVmaW5lIFBLTU9ERV9DS0lQMTI4ICAgICAgICAgICAgICA2CisjZGVmaW5lIFBLTU9ERV9US0lQX05PX01JQyAgICAgICAgICA3ICAgICAgIC8vIE1JQyBhcHBlbmRlZCBieSBkcml2ZXI6IG5vdCBhIHZhbGlkIHZhbHVlIGluIGhhcmR3YXJlIGtleSB0YWJsZQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFdDSUQgIGZvcm1hdAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLzcuMQlXQ0lEICBFTlRSWSAgZm9ybWF0ICA6IDhieXRlcwordHlwZWRlZglzdHJ1Y3QJX1dDSURfRU5UUllfU1RSVUMgeworCVVDSEFSCQlSWEJBQml0bWFwNzsgICAgLy8gYml0MCBmb3IgVElEOCwgYml0NyBmb3IgVElEIDE1CisJVUNIQVIJCVJYQkFCaXRtYXAwOyAgICAvLyBiaXQwIGZvciBUSUQwLCBiaXQ3IGZvciBUSUQgNworCVVDSEFSCQlNQUNbNl07CS8vIDAgZm9yIHNoYXJlZCBrZXkgdGFibGUuICAxIGZvciBwYWlyd2lzZSBrZXkgdGFibGUKK30JV0NJRF9FTlRSWV9TVFJVQywgKlBXQ0lEX0VOVFJZX1NUUlVDOworCisvLzguMS4xCVNFQ1VSSVRZICBLRVkgIGZvcm1hdCAgOiA4RFcKKy8vIDMyLWJ5dGUgcGVyIGVudHJ5LCB0b3RhbCAxNi1lbnRyeSBmb3Igc2hhcmVkIGtleSB0YWJsZSwgNjQtZW50cnkgZm9yIHBhaXJ3aXNlIGtleSB0YWJsZQordHlwZWRlZiBzdHJ1Y3QgX0hXX0tFWV9FTlRSWSB7ICAgICAgICAgIC8vIDMyLWJ5dGUgcGVyIGVudHJ5CisgICAgVUNIQVIgICBLZXlbMTZdOworICAgIFVDSEFSICAgVHhNaWNbOF07CisgICAgVUNIQVIgICBSeE1pY1s4XTsKK30gSFdfS0VZX0VOVFJZLCAqUEhXX0tFWV9FTlRSWTsKKworLy84LjEuMglJVi9FSVYgIGZvcm1hdCAgOiAyRFcKKworLy84LjEuMwlSWCBhdHRyaWJ1dGUgZW50cnkgZm9ybWF0ICA6IDFEVworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJc3RydWN0CV9NQUNfQVRUUklCVVRFX1NUUlVDIHsKKwlVSU5UMzIJCXJzdjoyMjsKKwlVSU5UMzIJCVJYV0lVREY6MzsKKwlVSU5UMzIJCUJTU0lESWR4OjM7IC8vbXVsdGlwbGVCU1MgaW5kZXggZm9yIHRoZSBXQ0lECisJVUlOVDMyCQlQYWlyS2V5TW9kZTozOworCVVJTlQzMgkJS2V5VGFiOjE7CS8vIDAgZm9yIHNoYXJlZCBrZXkgdGFibGUuICAxIGZvciBwYWlyd2lzZSBrZXkgdGFibGUKK30JTUFDX0FUVFJJQlVURV9TVFJVQywgKlBNQUNfQVRUUklCVVRFX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJc3RydWN0CV9NQUNfQVRUUklCVVRFX1NUUlVDIHsKKwlVSU5UMzIJCUtleVRhYjoxOwkvLyAwIGZvciBzaGFyZWQga2V5IHRhYmxlLiAgMSBmb3IgcGFpcndpc2Uga2V5IHRhYmxlCisJVUlOVDMyCQlQYWlyS2V5TW9kZTozOworCVVJTlQzMgkJQlNTSURJZHg6MzsgLy9tdWx0aXBsZUJTUyBpbmRleCBmb3IgdGhlIFdDSUQKKwlVSU5UMzIJCVJYV0lVREY6MzsKKwlVSU5UMzIJCXJzdjoyMjsKK30JTUFDX0FUVFJJQlVURV9TVFJVQywgKlBNQUNfQVRUUklCVVRFX1NUUlVDOworI2VuZGlmCisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBUWCAvIFJYIHJpbmcgZGVzY3JpcHRvciBmb3JtYXQKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyB0aGUgZmlyc3QgMjQtYnl0ZSBpbiBUWEQgaXMgY2FsbGVkIFRYSU5GTyBhbmQgd2lsbCBiZSBETUFlZCB0byBNQUMgYmxvY2sgdGhyb3VnaCBUWEZJRk8uCisvLyBNQUMgYmxvY2sgdXNlIHRoaXMgVFhJTkZPIHRvIGNvbnRyb2wgdGhlIHRyYW5zbWlzc2lvbiBiZWhhdmlvciBvZiB0aGlzIGZyYW1lLgorI2RlZmluZSBGSUZPX01HTVQgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgRklGT19IQ0NBICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEZJRk9fRURDQSAgICAgICAgICAgICAgICAgMgorCisvLworLy8gVFggZGVzY3JpcHRvciBmb3JtYXQsIFR4CXJpbmcsIE1nbXQgUmluZworLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXN0cnVjdAlQQUNLRUQgX1RYRF9TVFJVQyB7CisJLy8gV29yZCAwCisJVUlOVDMyCQlTRFB0cjA7CisJLy8gV29yZCAxCisJVUlOVDMyCQlETUFET05FOjE7CisJVUlOVDMyCQlMYXN0U2VjMDoxOworCVVJTlQzMgkJU0RMZW4wOjE0OworCVVJTlQzMgkJQnVyc3Q6MTsKKwlVSU5UMzIJCUxhc3RTZWMxOjE7CisJVUlOVDMyCQlTRExlbjE6MTQ7CisJLy8gV29yZCAyCisJVUlOVDMyCQlTRFB0cjE7CisJLy8gV29yZCAzCisJVUlOVDMyCQlJQ086MTsKKwlVSU5UMzIJCVVDTzoxOworCVVJTlQzMgkJVENPOjE7CisJVUlOVDMyCQlyc3Y6MjsKKwlVSU5UMzIJCVFTRUw6MjsJLy8gc2VsZWN0IG9uLWNoaXAgRklGTyBJRCBmb3IgMm5kLXN0YWdlIG91dHB1dCBzY2hlZHVsZXIuMDpNR01ULCAxOkhDQ0EgMjpFRENBCisJVUlOVDMyCQlXSVY6MTsJLy8gV2lyZWxlc3MgSW5mbyBWYWxpZC4gMSBpZiBEcml2ZXIgYWxyZWFkeSBmaWxsIFdJLCAgbyBpZiBETUEgbmVlZHMgdG8gY29weSBXSSB0byBjb3JyZWN0cG9zaXRpb24KKwlVSU5UMzIJCXJzdjI6MjQ7Cit9CVRYRF9TVFJVQywgKlBUWERfU1RSVUM7CisjZWxzZQordHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9UWERfU1RSVUMgeworCS8vIFdvcmQJMAorCVVJTlQzMgkJU0RQdHIwOworCS8vIFdvcmQJMQorCVVJTlQzMgkJU0RMZW4xOjE0OworCVVJTlQzMgkJTGFzdFNlYzE6MTsKKwlVSU5UMzIJCUJ1cnN0OjE7CisJVUlOVDMyCQlTRExlbjA6MTQ7CisJVUlOVDMyCQlMYXN0U2VjMDoxOworCVVJTlQzMgkJRE1BRE9ORToxOworCS8vV29yZDIKKwlVSU5UMzIJCVNEUHRyMTsKKwkvL1dvcmQzCisJVUlOVDMyCQlyc3YyOjI0OworCVVJTlQzMgkJV0lWOjE7CS8vIFdpcmVsZXNzIEluZm8gVmFsaWQuIDEgaWYgRHJpdmVyIGFscmVhZHkgZmlsbCBXSSwgIG8gaWYgRE1BIG5lZWRzIHRvIGNvcHkgV0kgdG8gY29ycmVjdHBvc2l0aW9uCisJVUlOVDMyCQlRU0VMOjI7CS8vIHNlbGVjdCBvbi1jaGlwIEZJRk8gSUQgZm9yIDJuZC1zdGFnZSBvdXRwdXQgc2NoZWR1bGVyLjA6TUdNVCwgMTpIQ0NBIDI6RURDQQorCVVJTlQzMgkJcnN2OjI7CisJVUlOVDMyCQlUQ086MTsJLy8KKwlVSU5UMzIJCVVDTzoxOwkvLworCVVJTlQzMgkJSUNPOjE7CS8vCit9CVRYRF9TVFJVQywgKlBUWERfU1RSVUM7CisjZW5kaWYKKworCisvLworLy8gVFhEIFdpcmVsZXNzIEluZm9ybWF0aW9uIGZvcm1hdCBmb3IgVHggcmluZyBhbmQgTWdtdCBSaW5nCisvLworLy90eG9wIDogZm9yIHR4b3AgbW9kZQorLy8gMDp0eG9wIGZvciB0aGUgTVBEVSBmcmFtZSB3aWxsIGJlIGhhbmRsZXMgYnkgQVNJQyBieSByZWdpc3RlcgorLy8gMS8yLzM6dGhlIE1QRFUgZnJhbWUgaXMgc2VuZCBhZnRlciBQSUZTL2JhY2tvZmYvU0lGUworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCBfVFhXSV9TVFJVQyB7CisJLy8gV29yZCAwCisJVUlOVDMyCQlQSFlNT0RFOjI7CisJVUlOVDMyCQlUeEJGOjE7CS8vIDMqMworCVVJTlQzMgkJcnN2MjoxOworLy8JVUlOVDMyCQlyc3YyOjI7CisJVUlOVDMyCQlJZnM6MTsJLy8KKwlVSU5UMzIJCVNUQkM6MjsJLy9jaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHoKKwlVSU5UMzIJCVNob3J0R0k6MTsKKwlVSU5UMzIJCUJXOjE7CS8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6CisJVUlOVDMyCQlNQ1M6NzsKKworCVVJTlQzMgkJcnN2OjY7CisJVUlOVDMyCQl0eG9wOjI7CS8vdHggYmFjayBvZmYgbW9kZSAwOkhUIFRYT1AgcnVsZSAsIDE6UElGUyBUWCAsMjpCYWNrb2ZmLCAzOnNpZnMgb25seSB3aGVuIHByZXZpb3VzIGZyYW1lIGV4Y2hhbmdlIGlzIHN1Y2Nlc3NmdWwuCisJVUlOVDMyCQlNcGR1RGVuc2l0eTozOworCVVJTlQzMgkJQU1QRFU6MTsKKworCVVJTlQzMgkJVFM6MTsKKwlVSU5UMzIJCUNGQUNLOjE7CisJVUlOVDMyCQlNSU1PcHM6MTsJLy8gdGhlIHJlbW90ZSBwZWVyIGlzIGluIGR5bmFtaWMgTUlNTy1QUyBtb2RlCisJVUlOVDMyCQlGUkFHOjE7CQkvLyAxIHRvIGluZm9ybSBUS0lQIGVuZ2luZSB0aGlzIGlzIGEgZnJhZ21lbnQuCisJLy8gV29yZCAxCisJVUlOVDMyCQlQYWNrZXRJZDo0OworCVVJTlQzMgkJTVBEVXRvdGFsQnl0ZUNvdW50OjEyOworCVVJTlQzMgkJV2lyZWxlc3NDbGlJRDo4OworCVVJTlQzMgkJQkFXaW5TaXplOjY7CisJVUlOVDMyCQlOU0VROjE7CisJVUlOVDMyCQlBQ0s6MTsKKwkvLyBXb3JkIDIKKwlVSU5UMzIJCUlWOworCS8vIFdvcmQgMworCVVJTlQzMgkJRUlWOworfQlUWFdJX1NUUlVDLCAqUFRYV0lfU1RSVUM7CisjZWxzZQordHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9UWFdJX1NUUlVDIHsKKwkvLyBXb3JkCTAKKwlVSU5UMzIJCUZSQUc6MTsJCS8vIDEgdG8gaW5mb3JtIFRLSVAgZW5naW5lIHRoaXMgaXMgYSBmcmFnbWVudC4KKwlVSU5UMzIJCU1JTU9wczoxOwkvLyB0aGUgcmVtb3RlIHBlZXIgaXMgaW4gZHluYW1pYyBNSU1PLVBTIG1vZGUKKwlVSU5UMzIJCUNGQUNLOjE7CisJVUlOVDMyCQlUUzoxOworCisJVUlOVDMyCQlBTVBEVToxOworCVVJTlQzMgkJTXBkdURlbnNpdHk6MzsKKwlVSU5UMzIJCXR4b3A6MjsJLy9GT1IgIlRISVMiIGZyYW1lLiAwOkhUIFRYT1AgcnVsZSAsIDE6UElGUyBUWCAsMjpCYWNrb2ZmLCAzOnNpZnMgb25seSB3aGVuIHByZXZpb3VzIGZyYW1lIGV4Y2hhbmdlIGlzIHN1Y2Nlc3NmdWwuCisJVUlOVDMyCQlyc3Y6NjsKKworCVVJTlQzMgkJTUNTOjc7CisJVUlOVDMyCQlCVzoxOwkvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegorCVVJTlQzMgkJU2hvcnRHSToxOworCVVJTlQzMgkJU1RCQzoyOwkvLyAxOiBTVEJDIHN1cHBvcnQgTUNTID0wLTcsICAgMiwzIDogUkVTRVJWRQorCVVJTlQzMgkJSWZzOjE7CS8vCisvLwlVSU5UMzIJCXJzdjI6MjsJLy9jaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHoKKwlVSU5UMzIJCXJzdjI6MTsKKwlVSU5UMzIJCVR4QkY6MTsJLy8gMyozCisJVUlOVDMyCQlQSFlNT0RFOjI7CisJLy8gV29yZAkxCisJVUlOVDMyCQlBQ0s6MTsKKwlVSU5UMzIJCU5TRVE6MTsKKwlVSU5UMzIJCUJBV2luU2l6ZTo2OworCVVJTlQzMgkJV2lyZWxlc3NDbGlJRDo4OworCVVJTlQzMgkJTVBEVXRvdGFsQnl0ZUNvdW50OjEyOworCVVJTlQzMgkJUGFja2V0SWQ6NDsKKwkvL1dvcmQyCisJVUlOVDMyCQlJVjsKKwkvL1dvcmQzCisJVUlOVDMyCQlFSVY7Cit9CVRYV0lfU1RSVUMsICpQVFhXSV9TVFJVQzsKKyNlbmRpZgorLy8KKy8vIFJ4IGRlc2NyaXB0b3IgZm9ybWF0LCBSeAlSaW5nCisvLworLy8KKy8vIFJYV0kgd2lyZWxlc3MgaW5mb3JtYXRpb24gZm9ybWF0LCBpbiBQQkYuIGludmlzaWJsZSBpbiBkcml2ZXIuCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJc3RydWN0CVBBQ0tFRCBfUlhXSV9TVFJVQyB7CisJLy8gV29yZCAwCisJVUlOVDMyCQlUSUQ6NDsKKwlVSU5UMzIJCU1QRFV0b3RhbEJ5dGVDb3VudDoxMjsKKwlVSU5UMzIJCVVERjozOworCVVJTlQzMgkJQlNTSUQ6MzsKKwlVSU5UMzIJCUtleUluZGV4OjI7CisJVUlOVDMyCQlXaXJlbGVzc0NsaUlEOjg7CisJLy8gV29yZCAxCisJVUlOVDMyCQlQSFlNT0RFOjI7ICAgICAgICAgICAgICAvLyAxOiB0aGlzIFJYIGZyYW1lIGlzIHVuaWNhc3QgdG8gbWUKKwlVSU5UMzIJCXJzdjozOworCVVJTlQzMgkJU1RCQzoyOworCVVJTlQzMgkJU2hvcnRHSToxOworCVVJTlQzMgkJQlc6MTsKKwlVSU5UMzIJCU1DUzo3OworCVVJTlQzMgkJU0VRVUVOQ0U6MTI7CisJVUlOVDMyCQlGUkFHOjQ7CisJLy8gV29yZCAyCisJVUlOVDMyCQlyc3YxOjg7CisJVUlOVDMyCQlSU1NJMjo4OworCVVJTlQzMgkJUlNTSTE6ODsKKwlVSU5UMzIJCVJTU0kwOjg7CisJLy8gV29yZCAzCisJVUlOVDMyCQlyc3YyOjE2OworCVVJTlQzMgkJU05SMTo4OworCVVJTlQzMgkJU05SMDo4OworfQlSWFdJX1NUUlVDLCAqUFJYV0lfU1RSVUM7CisjZWxzZQordHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9SWFdJX1NUUlVDIHsKKwkvLyBXb3JkCTAKKwlVSU5UMzIJCVdpcmVsZXNzQ2xpSUQ6ODsKKwlVSU5UMzIJCUtleUluZGV4OjI7CisJVUlOVDMyCQlCU1NJRDozOworCVVJTlQzMgkJVURGOjM7CisJVUlOVDMyCQlNUERVdG90YWxCeXRlQ291bnQ6MTI7CisJVUlOVDMyCQlUSUQ6NDsKKwkvLyBXb3JkCTEKKwlVSU5UMzIJCUZSQUc6NDsKKwlVSU5UMzIJCVNFUVVFTkNFOjEyOworCVVJTlQzMgkJTUNTOjc7CisJVUlOVDMyCQlCVzoxOworCVVJTlQzMgkJU2hvcnRHSToxOworCVVJTlQzMgkJU1RCQzoyOworCVVJTlQzMgkJcnN2OjM7CisJVUlOVDMyCQlQSFlNT0RFOjI7ICAgICAgICAgICAgICAvLyAxOiB0aGlzIFJYIGZyYW1lIGlzIHVuaWNhc3QgdG8gbWUKKwkvL1dvcmQyCisJVUlOVDMyCQlSU1NJMDo4OworCVVJTlQzMgkJUlNTSTE6ODsKKwlVSU5UMzIJCVJTU0kyOjg7CisJVUlOVDMyCQlyc3YxOjg7CisJLy9Xb3JkMworCVVJTlQzMgkJU05SMDo4OworCVVJTlQzMgkJU05SMTo4OworCVVJTlQzMgkJcnN2MjoxNjsKK30JUlhXSV9TVFJVQywgKlBSWFdJX1NUUlVDOworI2VuZGlmCisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBIT1NULU1DVSBjb21tdW5pY2F0aW9uIGRhdGEgc3RydWN0dXJlCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8KKy8vIEgyTV9NQUlMQk9YX0NTUjogSG9zdC10by1NQ1UgTWFpbGJveAorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmIHVuaW9uICBfSDJNX01BSUxCT1hfU1RSVUMgeworICAgIHN0cnVjdCB7CisgICAgICAgIFVJTlQzMiAgICAgICBPd25lcjo4OworICAgICAgICBVSU5UMzIgICAgICAgQ21kVG9rZW46ODsgICAgLy8gMHhmZiB0ZWxscyBNQ1Ugbm90IHRvIHJlcG9ydCBDbWREb25lSW50IGFmdGVyIGV4Y3V0aW5nIHRoZSBjb21tYW5kCisgICAgICAgIFVJTlQzMiAgICAgICBIaWdoQnl0ZTo4OworICAgICAgICBVSU5UMzIgICAgICAgTG93Qnl0ZTo4OworICAgIH0gICBmaWVsZDsKKyAgICBVSU5UMzIgICAgICAgICAgIHdvcmQ7Cit9IEgyTV9NQUlMQk9YX1NUUlVDLCAqUEgyTV9NQUlMQk9YX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYgdW5pb24gIF9IMk1fTUFJTEJPWF9TVFJVQyB7CisgICAgc3RydWN0IHsKKyAgICAgICAgVUlOVDMyICAgICAgIExvd0J5dGU6ODsKKyAgICAgICAgVUlOVDMyICAgICAgIEhpZ2hCeXRlOjg7CisgICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjo4OworICAgICAgICBVSU5UMzIgICAgICAgT3duZXI6ODsKKyAgICB9ICAgZmllbGQ7CisgICAgVUlOVDMyICAgICAgICAgICB3b3JkOworfSBIMk1fTUFJTEJPWF9TVFJVQywgKlBIMk1fTUFJTEJPWF9TVFJVQzsKKyNlbmRpZgorCisvLworLy8gTTJIX0NNRF9ET05FX0NTUjogTUNVLXRvLUhvc3QgY29tbWFuZCBjb21wbGV0ZSBpbmRpY2F0aW9uCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYgdW5pb24gX00ySF9DTURfRE9ORV9TVFJVQyB7CisgICAgc3RydWN0ICB7CisgICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjM7CisgICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjI7CisgICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjE7CisgICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjA7CisgICAgfSBmaWVsZDsKKyAgICBVSU5UMzIgICAgICAgICAgIHdvcmQ7Cit9IE0ySF9DTURfRE9ORV9TVFJVQywgKlBNMkhfQ01EX0RPTkVfU1RSVUM7CisjZWxzZQordHlwZWRlZiB1bmlvbiBfTTJIX0NNRF9ET05FX1NUUlVDIHsKKyAgICBzdHJ1Y3QgIHsKKyAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMDsKKyAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMTsKKyAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMjsKKyAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMzsKKyAgICB9IGZpZWxkOworICAgIFVJTlQzMiAgICAgICAgICAgd29yZDsKK30gTTJIX0NNRF9ET05FX1NUUlVDLCAqUE0ySF9DTURfRE9ORV9TVFJVQzsKKyNlbmRpZgorCisKKworLy8KKy8vIE1DVV9MRURDUzogTUNVIExFRCBDb250cm9sIFNldHRpbmcuCisvLworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYgdW5pb24gIF9NQ1VfTEVEQ1NfU1RSVUMgeworCXN0cnVjdAl7CisJCVVDSEFSCQlQb2xhcml0eToxOworCQlVQ0hBUgkJTGVkTW9kZTo3OworCX0gZmllbGQ7CisJVUNIQVIJCQkJd29yZDsKK30gTUNVX0xFRENTX1NUUlVDLCAqUE1DVV9MRURDU19TVFJVQzsKKyNlbHNlCit0eXBlZGVmIHVuaW9uICBfTUNVX0xFRENTX1NUUlVDIHsKKwlzdHJ1Y3QJeworCQlVQ0hBUgkJTGVkTW9kZTo3OworCQlVQ0hBUgkJUG9sYXJpdHk6MTsKKwl9IGZpZWxkOworCVVDSEFSCQkJd29yZDsKK30gTUNVX0xFRENTX1NUUlVDLCAqUE1DVV9MRURDU19TVFJVQzsKKyNlbmRpZgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBSZWdpc3RlciBmb3JtYXQKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKworLy9OQVZfVElNRV9DRkcgOk5BVgorI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX05BVl9USU1FX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVVNIT1JUCQlyc3Y6NjsKKwkJVVNIT1JUCQlaZXJvU2lmczoxOyAgICAgICAgICAgICAgIC8vIEFwcGxpZWQgemVybyBTSUZTIHRpbWVyIGFmdGVyIE9GRE0gUlggMDogZGlzYWJsZQorCQlVU0hPUlQJCUVpZnM6OTsgICAgICAgICAgICAgICAvLyBpbiB1bml0IG9mIDEtdXMKKwkJVUNIQVIgICAgICAgU2xvdFRpbWU7ICAgIC8vIGluIHVuaXQgb2YgMS11cworCQlVQ0hBUgkJU2lmczsgICAgICAgICAgICAgICAvLyBpbiB1bml0IG9mIDEtdXMKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CU5BVl9USU1FX0NGR19TVFJVQywgKlBOQVZfVElNRV9DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfTkFWX1RJTUVfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUgkJU2lmczsgICAgICAgICAgICAgICAvLyBpbiB1bml0IG9mIDEtdXMKKwkJVUNIQVIgICAgICAgU2xvdFRpbWU7ICAgIC8vIGluIHVuaXQgb2YgMS11cworCQlVU0hPUlQJCUVpZnM6OTsgICAgICAgICAgICAgICAvLyBpbiB1bml0IG9mIDEtdXMKKwkJVVNIT1JUCQlaZXJvU2lmczoxOyAgICAgICAgICAgICAgIC8vIEFwcGxpZWQgemVybyBTSUZTIHRpbWVyIGFmdGVyIE9GRE0gUlggMDogZGlzYWJsZQorCQlVU0hPUlQJCXJzdjo2OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JTkFWX1RJTUVfQ0ZHX1NUUlVDLCAqUE5BVl9USU1FX0NGR19TVFJVQzsKKyNlbmRpZgorCisKKworCisKKy8vCisvLyBSWF9GSUxUUl9DRkc6ICAvUlggY29uZmlndXJhdGlvbiByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCVJYX0ZJTFRSX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQk6MTU7CisJCVVJTlQzMiAgICAgICBEcm9wUnN2Q250bFR5cGU6MTsKKworICAgICAgICAJVUlOVDMyICAgICAgIAlEcm9wQkFSOjE7ICAgICAgIC8vCisJCVVJTlQzMgkJRHJvcEJBOjE7CQkvLworCQlVSU5UMzIJCURyb3BQc1BvbGw6MTsJCS8vIERyb3AgUHMtUG9sbAorCQlVSU5UMzIJCURyb3BSdHM6MTsJCS8vIERyb3AgUHMtUG9sbAorCisJCVVJTlQzMgkJRHJvcEN0czoxOwkJLy8gRHJvcCBQcy1Qb2xsCisJCVVJTlQzMgkJRHJvcEFjazoxOwkJLy8gRHJvcCBQcy1Qb2xsCisJCVVJTlQzMgkJRHJvcENGRW5kOjE7CQkvLyBEcm9wIFBzLVBvbGwKKwkJVUlOVDMyCQlEcm9wQ0ZFbmRBY2s6MTsJCS8vIERyb3AgUHMtUG9sbAorCisJCVVJTlQzMgkJRHJvcER1cGxpY2F0ZToxOwkJLy8gRHJvcCBkdXBsaWNhdGUgZnJhbWUKKwkJVUlOVDMyCQlEcm9wQmNhc3Q6MTsJCS8vIERyb3AgYnJvYWRjYXN0IGZyYW1lcworCQlVSU5UMzIJCURyb3BNY2FzdDoxOwkJLy8gRHJvcCBtdWx0aWNhc3QgZnJhbWVzCisJCVVJTlQzMgkJRHJvcFZlckVycjoxOwkgICAgLy8gRHJvcCB2ZXJzaW9uIGVycm9yIGZyYW1lCisKKwkJVUlOVDMyCQlEcm9wTm90TXlCU1NJRDoxOwkJCS8vIERyb3AgZnJhbSBUb0RzIGJpdCBpcyB0cnVlCisJCVVJTlQzMgkJRHJvcE5vdFRvTWU6MTsJCS8vIERyb3Agbm90IHRvIG1lIHVuaWNhc3QgZnJhbWUKKwkJVUlOVDMyCQlEcm9wUGh5RXJyOjE7CQkvLyBEcm9wIHBoeXNpY2FsIGVycm9yCisJCVVJTlQzMgkJRHJvcENSQ0VycjoxOwkJLy8gRHJvcCBDUkMgZXJyb3IKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJYX0ZJTFRSX0NGR19TVFJVQywgKlBSWF9GSUxUUl9DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUlhfRklMVFJfQ0ZHX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCURyb3BDUkNFcnI6MTsJCS8vIERyb3AgQ1JDIGVycm9yCisJCVVJTlQzMgkJRHJvcFBoeUVycjoxOwkJLy8gRHJvcCBwaHlzaWNhbCBlcnJvcgorCQlVSU5UMzIJCURyb3BOb3RUb01lOjE7CQkvLyBEcm9wIG5vdCB0byBtZSB1bmljYXN0IGZyYW1lCisJCVVJTlQzMgkJRHJvcE5vdE15QlNTSUQ6MTsJCQkvLyBEcm9wIGZyYW0gVG9EcyBiaXQgaXMgdHJ1ZQorCisJCVVJTlQzMgkJRHJvcFZlckVycjoxOwkgICAgLy8gRHJvcCB2ZXJzaW9uIGVycm9yIGZyYW1lCisJCVVJTlQzMgkJRHJvcE1jYXN0OjE7CQkvLyBEcm9wIG11bHRpY2FzdCBmcmFtZXMKKwkJVUlOVDMyCQlEcm9wQmNhc3Q6MTsJCS8vIERyb3AgYnJvYWRjYXN0IGZyYW1lcworCQlVSU5UMzIJCURyb3BEdXBsaWNhdGU6MTsJCS8vIERyb3AgZHVwbGljYXRlIGZyYW1lCisKKwkJVUlOVDMyCQlEcm9wQ0ZFbmRBY2s6MTsJCS8vIERyb3AgUHMtUG9sbAorCQlVSU5UMzIJCURyb3BDRkVuZDoxOwkJLy8gRHJvcCBQcy1Qb2xsCisJCVVJTlQzMgkJRHJvcEFjazoxOwkJLy8gRHJvcCBQcy1Qb2xsCisJCVVJTlQzMgkJRHJvcEN0czoxOwkJLy8gRHJvcCBQcy1Qb2xsCisKKwkJVUlOVDMyCQlEcm9wUnRzOjE7CQkvLyBEcm9wIFBzLVBvbGwKKwkJVUlOVDMyCQlEcm9wUHNQb2xsOjE7CQkvLyBEcm9wIFBzLVBvbGwKKwkJVUlOVDMyCQlEcm9wQkE6MTsJCS8vCisgICAgICAgIAlVSU5UMzIgICAgICAgCURyb3BCQVI6MTsgICAgICAgLy8KKworCQlVSU5UMzIgICAgICAgCURyb3BSc3ZDbnRsVHlwZToxOworCQlVSU5UMzIJCToxNTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVJYX0ZJTFRSX0NGR19TVFJVQywgKlBSWF9GSUxUUl9DRkdfU1RSVUM7CisjZW5kaWYKKworCisKKworLy8KKy8vIFBIWV9DU1I0OiBSRiBzZXJpYWwgY29udHJvbCByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9QSFlfQ1NSNF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlCdXN5OjE7CQkJCS8vIDE6IEFTSUMgaXMgYnVzeSBleGVjdXRlIFJGIHByb2dyYW1taW5nLgorCQlVSU5UMzIJCVBMTF9MRDoxOwkJCS8vIFJGIFBMTF9MRCBzdGF0dXMKKwkJVUlOVDMyCQlJRlNlbGVjdDoxOwkJCS8vIDE6IHNlbGVjdCBJRgl0byBwcm9ncmFtLAkwOiBzZWxlY3QgUkYgdG8JcHJvZ3JhbQorCQlVSU5UMzIJCU51bWJlck9mQml0czo1OwkJLy8gTnVtYmVyIG9mIGJpdHMgdXNlZCBpbiBSRlJlZ1ZhbHVlIChJOjIwLAlSRk1EOjIyKQorCQlVSU5UMzIJCVJGUmVnVmFsdWU6MjQ7CQkvLyBSZWdpc3Rlcgl2YWx1ZSAoaW5jbHVkZSByZWdpc3RlcglpZCkJc2VyaWFsIG91dCB0byBSRi9JRgljaGlwLgorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUEhZX0NTUjRfU1RSVUMsICpQUEhZX0NTUjRfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUEhZX0NTUjRfU1RSVUMJeworCXN0cnVjdAl7CisJCVVJTlQzMgkJUkZSZWdWYWx1ZToyNDsJCS8vIFJlZ2lzdGVyCXZhbHVlIChpbmNsdWRlIHJlZ2lzdGVyCWlkKQlzZXJpYWwgb3V0IHRvIFJGL0lGCWNoaXAuCisJCVVJTlQzMgkJTnVtYmVyT2ZCaXRzOjU7CQkvLyBOdW1iZXIgb2YgYml0cyB1c2VkIGluIFJGUmVnVmFsdWUgKEk6MjAsCVJGTUQ6MjIpCisJCVVJTlQzMgkJSUZTZWxlY3Q6MTsJCQkvLyAxOiBzZWxlY3QgSUYJdG8gcHJvZ3JhbSwJMDogc2VsZWN0IFJGIHRvCXByb2dyYW0KKwkJVUlOVDMyCQlQTExfTEQ6MTsJCQkvLyBSRiBQTExfTEQgc3RhdHVzCisJCVVJTlQzMgkJQnVzeToxOwkJCQkvLyAxOiBBU0lDIGlzIGJ1c3kgZXhlY3V0ZSBSRiBwcm9ncmFtbWluZy4KKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVBIWV9DU1I0X1NUUlVDLCAqUFBIWV9DU1I0X1NUUlVDOworI2VuZGlmCisKKworLy8KKy8vIFNFQ19DU1I1OiBzaGFyZWQga2V5IHRhYmxlIHNlY3VyaXR5IG1vZGUgcmVnaXN0ZXIKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfU0VDX0NTUjVfU1RSVUMJeworCXN0cnVjdAl7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkzQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkyQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkxQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkwQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkzQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkyQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkxQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkwQ2lwaGVyQWxnOjM7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlTRUNfQ1NSNV9TVFJVQywgKlBTRUNfQ1NSNV9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9TRUNfQ1NSNV9TVFJVQwl7CisJc3RydWN0CXsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkwQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkxQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkyQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczJLZXkzQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkwQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkxQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkyQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKyAgICAgICAgVUlOVDMyICAgICAgIEJzczNLZXkzQ2lwaGVyQWxnOjM7CisgICAgICAgIFVJTlQzMiAgICAgICA6MTsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVNFQ19DU1I1X1NUUlVDLCAqUFNFQ19DU1I1X1NUUlVDOworI2VuZGlmCisKKworLy8KKy8vIEhPU1RfQ01EX0NTUjogRm9yIEhPU1QgdG8gaW50ZXJydXB0IGVtYmVkZGVkIHByb2Nlc3NvcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9IT1NUX0NNRF9DU1JfU1RSVUMJeworCXN0cnVjdAl7CisJICAgIFVJTlQzMiAgIFJzdjoyNDsKKwkgICAgVUlOVDMyICAgSG9zdENvbW1hbmQ6ODsKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CUhPU1RfQ01EX0NTUl9TVFJVQywgKlBIT1NUX0NNRF9DU1JfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfSE9TVF9DTURfQ1NSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCSAgICBVSU5UMzIgICBIb3N0Q29tbWFuZDo4OworCSAgICBVSU5UMzIgICBSc3Y6MjQ7CisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlIT1NUX0NNRF9DU1JfU1RSVUMsICpQSE9TVF9DTURfQ1NSX1NUUlVDOworI2VuZGlmCisKKworLy8KKy8vIEFJRlNOX0NTUjogQUlGU04gZm9yIGVhY2ggRURDQSBBQworLy8KKworCisKKy8vCisvLyBFMlBST01fQ1NSOiBFRVBST00gY29udHJvbCByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9FMlBST01fQ1NSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVSU5UMzIJCVJzdmQ6MjU7CisJCVVJTlQzMiAgICAgICBMb2FkU3RhdHVzOjE7ICAgLy8gMTpsb2FkaW5nLCAwOmRvbmUKKwkJVUlOVDMyCQlUeXBlOjE7CQkJLy8gMTogOTNDNDYsIDA6OTNDNjYKKwkJVUlOVDMyCQlFZXByb21ETzoxOworCQlVSU5UMzIJCUVlcHJvbURJOjE7CisJCVVJTlQzMgkJRWVwcm9tQ1M6MTsKKwkJVUlOVDMyCQlFZXByb21TSzoxOworCQlVSU5UMzIJCVJlbG9hZDoxOwkJLy8gUmVsb2FkIEVFUFJPTSBjb250ZW50LCB3cml0ZSBvbmUgdG8gcmVsb2FkLCBzZWxmLWNsZWFyZWQuCisJfQlmaWVsZDsKKwlVSU5UMzIJCQl3b3JkOworfQlFMlBST01fQ1NSX1NUUlVDLCAqUEUyUFJPTV9DU1JfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfRTJQUk9NX0NTUl9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVDMyCQlSZWxvYWQ6MTsJCS8vIFJlbG9hZCBFRVBST00gY29udGVudCwgd3JpdGUgb25lIHRvIHJlbG9hZCwgc2VsZi1jbGVhcmVkLgorCQlVSU5UMzIJCUVlcHJvbVNLOjE7CisJCVVJTlQzMgkJRWVwcm9tQ1M6MTsKKwkJVUlOVDMyCQlFZXByb21ESToxOworCQlVSU5UMzIJCUVlcHJvbURPOjE7CisJCVVJTlQzMgkJVHlwZToxOwkJCS8vIDE6IDkzQzQ2LCAwOjkzQzY2CisJCVVJTlQzMiAgICAgICBMb2FkU3RhdHVzOjE7ICAgLy8gMTpsb2FkaW5nLCAwOmRvbmUKKwkJVUlOVDMyCQlSc3ZkOjI1OworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JRTJQUk9NX0NTUl9TVFJVQywgKlBFMlBST01fQ1NSX1NUUlVDOworI2VuZGlmCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEUyUFJPTSBkYXRhIGxheW91dAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLworLy8gRUVQUk9NIGFudGVubmEgc2VsZWN0IGZvcm1hdAorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9FRVBST01fQU5URU5OQV9TVFJVQwl7CisJc3RydWN0CXsKKwkJVVNIT1JUICAgICAgUnN2OjQ7CisJCVVTSE9SVCAgICAgIFJmSWNUeXBlOjQ7ICAgICAgICAgICAgIC8vIHNlZSBFMlBST00gZG9jdW1lbnQKKwkJVVNIT1JUCQlUeFBhdGg6NDsJLy8gMTogMVQsIDI6IDJUCisJCVVTSE9SVAkJUnhQYXRoOjQ7CS8vIDE6IDFSLCAyOiAyUiwgMzogM1IKKwl9CWZpZWxkOworCVVTSE9SVAkJCXdvcmQ7Cit9CUVFUFJPTV9BTlRFTk5BX1NUUlVDLCAqUEVFUFJPTV9BTlRFTk5BX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0VFUFJPTV9BTlRFTk5BX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVU0hPUlQJCVJ4UGF0aDo0OwkvLyAxOiAxUiwgMjogMlIsIDM6IDNSCisJCVVTSE9SVAkJVHhQYXRoOjQ7CS8vIDE6IDFULCAyOiAyVAorCQlVU0hPUlQgICAgICBSZkljVHlwZTo0OyAgICAgICAgICAgICAvLyBzZWUgRTJQUk9NIGRvY3VtZW50CisJCVVTSE9SVCAgICAgIFJzdjo0OworCX0JZmllbGQ7CisJVVNIT1JUCQkJd29yZDsKK30JRUVQUk9NX0FOVEVOTkFfU1RSVUMsICpQRUVQUk9NX0FOVEVOTkFfU1RSVUM7CisjZW5kaWYKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24gX0VFUFJPTV9OSUNfQ0lORklHMl9TVFJVQwl7CisJc3RydWN0CXsKKyAgICAgICAgVVNIT1JUCQlSc3YyOjY7CQkJCQkvLyBtdXN0IGJlIDAKKwkJVVNIT1JUCQlCVzQwTUF2YWlsRm9yQToxOwkJCS8vIDA6ZW5hYmxlLCAxOmRpc2FibGUKKwkJVVNIT1JUCQlCVzQwTUF2YWlsRm9yRzoxOwkJCS8vIDA6ZW5hYmxlLCAxOmRpc2FibGUKKwkJVVNIT1JUCQlFbmFibGVXUFNQQkM6MTsgICAgICAgICAgICAgICAgIC8vIFdQUyBQQkMgQ29udHJvbCBiaXQKKwkJVVNIT1JUCQlCVzQwTVNpZGViYW5kRm9yQToxOworCQlVU0hPUlQJCUJXNDBNU2lkZWJhbmRGb3JHOjE7CisJCVVTSE9SVAkJQ2FyZGJ1c0FjY2VsZXJhdGlvbjoxOwkvLyAhISEgTk9URTogMCAtIGVuYWJsZSwgMSAtIGRpc2FibGUKKwkJVVNIT1JUCQlFeHRlcm5hbExOQUZvckE6MTsJCQkvLyBleHRlcm5hbCBMTkEgZW5hYmxlIGZvciA1RworCQlVU0hPUlQJCUV4dGVybmFsTE5BRm9yRzoxOwkJCS8vIGV4dGVybmFsIExOQSBlbmFibGUgZm9yIDIuNEcKKwkJVVNIT1JUCQlEeW5hbWljVHhBZ2NDb250cm9sOjE7CQkJLy8KKwkJVVNIT1JUCQlIYXJkd2FyZVJhZGlvQ29udHJvbDoxOwkvLyBXaGV0aGVyIFJGIGlzIGNvbnRyb2xsZWQgYnkgZHJpdmVyIG9yIEhXLiAxOmVuYWJsZSBodyBjb250cm9sLCAwOmRpc2FibGUKKwl9CWZpZWxkOworCVVTSE9SVAkJCXdvcmQ7Cit9CUVFUFJPTV9OSUNfQ09ORklHMl9TVFJVQywgKlBFRVBST01fTklDX0NPTkZJRzJfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbiBfRUVQUk9NX05JQ19DSU5GSUcyX1NUUlVDCXsKKwlzdHJ1Y3QgeworCQlVU0hPUlQJCUhhcmR3YXJlUmFkaW9Db250cm9sOjE7CS8vIDE6ZW5hYmxlLCAwOmRpc2FibGUKKwkJVVNIT1JUCQlEeW5hbWljVHhBZ2NDb250cm9sOjE7CQkJLy8KKwkJVVNIT1JUCQlFeHRlcm5hbExOQUZvckc6MTsJCQkJLy8KKwkJVVNIT1JUCQlFeHRlcm5hbExOQUZvckE6MTsJCQkvLyBleHRlcm5hbCBMTkEgZW5hYmxlIGZvciAyLjRHCisJCVVTSE9SVAkJQ2FyZGJ1c0FjY2VsZXJhdGlvbjoxOwkvLyAhISEgTk9URTogMCAtIGVuYWJsZSwgMSAtIGRpc2FibGUKKwkJVVNIT1JUCQlCVzQwTVNpZGViYW5kRm9yRzoxOworCQlVU0hPUlQJCUJXNDBNU2lkZWJhbmRGb3JBOjE7CisJCVVTSE9SVAkJRW5hYmxlV1BTUEJDOjE7ICAgICAgICAgICAgICAgICAvLyBXUFMgUEJDIENvbnRyb2wgYml0CisJCVVTSE9SVAkJQlc0ME1BdmFpbEZvckc6MTsJCQkvLyAwOmVuYWJsZSwgMTpkaXNhYmxlCisJCVVTSE9SVAkJQlc0ME1BdmFpbEZvckE6MTsJCQkvLyAwOmVuYWJsZSwgMTpkaXNhYmxlCisJCVVTSE9SVAkJUnN2Mjo2OyAgICAgICAgICAgICAgICAgLy8gbXVzdCBiZSAwCisJfQlmaWVsZDsKKwlVU0hPUlQJCQl3b3JkOworfQlFRVBST01fTklDX0NPTkZJRzJfU1RSVUMsICpQRUVQUk9NX05JQ19DT05GSUcyX1NUUlVDOworI2VuZGlmCisKKy8vCisvLyBUWF9QV1IgVmFsdWUgdmFsaWQgcmFuZ2UgMHhGQSgtNikgfiAweDI0KDM2KQorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9FRVBST01fVFhfUFdSX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlDSEFSCUJ5dGUxOwkJCQkvLyBIaWdoIEJ5dGUKKwkJQ0hBUglCeXRlMDsJCQkJLy8gTG93IEJ5dGUKKwl9CWZpZWxkOworCVVTSE9SVAl3b3JkOworfQlFRVBST01fVFhfUFdSX1NUUlVDLCAqUEVFUFJPTV9UWF9QV1JfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfRUVQUk9NX1RYX1BXUl9TVFJVQwl7CisJc3RydWN0CXsKKwkJQ0hBUglCeXRlMDsJCQkJLy8gTG93IEJ5dGUKKwkJQ0hBUglCeXRlMTsJCQkJLy8gSGlnaCBCeXRlCisJfQlmaWVsZDsKKwlVU0hPUlQJd29yZDsKK30JRUVQUk9NX1RYX1BXUl9TVFJVQywgKlBFRVBST01fVFhfUFdSX1NUUlVDOworI2VuZGlmCisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9FRVBST01fVkVSU0lPTl9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUNIQVIJVmVyc2lvbjsJCQkvLyBIaWdoIEJ5dGUKKwkJVUNIQVIJRmFlUmVsZWFzZU51bWJlcjsJLy8gTG93IEJ5dGUKKwl9CWZpZWxkOworCVVTSE9SVAl3b3JkOworfQlFRVBST01fVkVSU0lPTl9TVFJVQywgKlBFRVBST01fVkVSU0lPTl9TVFJVQzsKKyNlbHNlCit0eXBlZGVmCXVuaW9uCV9FRVBST01fVkVSU0lPTl9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUNIQVIJRmFlUmVsZWFzZU51bWJlcjsJLy8gTG93IEJ5dGUKKwkJVUNIQVIJVmVyc2lvbjsJCQkvLyBIaWdoIEJ5dGUKKwl9CWZpZWxkOworCVVTSE9SVAl3b3JkOworfQlFRVBST01fVkVSU0lPTl9TVFJVQywgKlBFRVBST01fVkVSU0lPTl9TVFJVQzsKKyNlbmRpZgorCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfRUVQUk9NX0xFRF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVVNIT1JUCVJzdmQ6MzsJCQkJLy8gUmVzZXJ2ZWQKKwkJVVNIT1JUCUxlZE1vZGU6NTsJCQkvLyBMZWQgbW9kZS4KKwkJVVNIT1JUCVBvbGFyaXR5R1BJT180OjE7CS8vIFBvbGFyaXR5IEdQSU8jNCBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlHUElPXzM6MTsJLy8gUG9sYXJpdHkgR1BJTyMzIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eUdQSU9fMjoxOwkvLyBQb2xhcml0eSBHUElPIzIgc2V0dGluZy4KKwkJVVNIT1JUCVBvbGFyaXR5R1BJT18xOjE7CS8vIFBvbGFyaXR5IEdQSU8jMSBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlHUElPXzA6MTsJLy8gUG9sYXJpdHkgR1BJTyMwIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eUFDVDoxOwkJLy8gUG9sYXJpdHkgQUNUIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eVJEWV9BOjE7CQkvLyBQb2xhcml0eSBSRFlfQSBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlSRFlfRzoxOwkJLy8gUG9sYXJpdHkgUkRZX0cgc2V0dGluZy4KKwl9CWZpZWxkOworCVVTSE9SVAl3b3JkOworfQlFRVBST01fTEVEX1NUUlVDLCAqUEVFUFJPTV9MRURfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfRUVQUk9NX0xFRF9TVFJVQwl7CisJc3RydWN0CXsKKwkJVVNIT1JUCVBvbGFyaXR5UkRZX0c6MTsJCS8vIFBvbGFyaXR5IFJEWV9HIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eVJEWV9BOjE7CQkvLyBQb2xhcml0eSBSRFlfQSBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlBQ1Q6MTsJCS8vIFBvbGFyaXR5IEFDVCBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlHUElPXzA6MTsJLy8gUG9sYXJpdHkgR1BJTyMwIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eUdQSU9fMToxOwkvLyBQb2xhcml0eSBHUElPIzEgc2V0dGluZy4KKwkJVVNIT1JUCVBvbGFyaXR5R1BJT18yOjE7CS8vIFBvbGFyaXR5IEdQSU8jMiBzZXR0aW5nLgorCQlVU0hPUlQJUG9sYXJpdHlHUElPXzM6MTsJLy8gUG9sYXJpdHkgR1BJTyMzIHNldHRpbmcuCisJCVVTSE9SVAlQb2xhcml0eUdQSU9fNDoxOwkvLyBQb2xhcml0eSBHUElPIzQgc2V0dGluZy4KKwkJVVNIT1JUCUxlZE1vZGU6NTsJCQkvLyBMZWQgbW9kZS4KKwkJVVNIT1JUCVJzdmQ6MzsJCQkJLy8gUmVzZXJ2ZWQKKwl9CWZpZWxkOworCVVTSE9SVAl3b3JkOworfQlFRVBST01fTEVEX1NUUlVDLCAqUEVFUFJPTV9MRURfU1RSVUM7CisjZW5kaWYKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3R5cGVkZWYJdW5pb24JX0VFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUglUeFBvd2VyRW5hYmxlOjE7Ly8gRW5hYmxlCisJCVVDSEFSCVR5cGU6MTsJCQkvLyAxOiBwbHVzIHRoZSBkZWx0YSB2YWx1ZSwgMDogbWludXMgdGhlIGRlbHRhIHZhbHVlCisJCVVDSEFSCURlbHRhVmFsdWU6NjsJLy8gVHggUG93ZXIgZGFsdGEgdmFsdWUgKE1BWD00KQorCX0JZmllbGQ7CisJVUNIQVIJdmFsdWU7Cit9CUVFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDLCAqUEVFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX0VFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUglEZWx0YVZhbHVlOjY7CS8vIFR4IFBvd2VyIGRhbHRhIHZhbHVlIChNQVg9NCkKKwkJVUNIQVIJVHlwZToxOwkJCS8vIDE6IHBsdXMgdGhlIGRlbHRhIHZhbHVlLCAwOiBtaW51cyB0aGUgZGVsdGEgdmFsdWUKKwkJVUNIQVIJVHhQb3dlckVuYWJsZToxOy8vIEVuYWJsZQorCX0JZmllbGQ7CisJVUNIQVIJdmFsdWU7Cit9CUVFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDLCAqUEVFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDOworI2VuZGlmCisKKy8vCisvLyBRT1NfQ1NSMDogVFhPUCBob2xkZXIgYWRkcmVzczAgcmVnaXN0ZXIKKy8vCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfUU9TX0NTUjBfU1RSVUMJeworCXN0cnVjdAl7CisJCVVDSEFSCQlCeXRlMzsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMworCQlVQ0hBUgkJQnl0ZTI7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDIKKwkJVUNIQVIJCUJ5dGUxOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAxCisJCVVDSEFSCQlCeXRlMDsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMAorCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUU9TX0NTUjBfU1RSVUMsICpQUU9TX0NTUjBfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUU9TX0NTUjBfU1RSVUMJeworCXN0cnVjdAl7CisJCVVDSEFSCQlCeXRlMDsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMAorCQlVQ0hBUgkJQnl0ZTE7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDEKKwkJVUNIQVIJCUJ5dGUyOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAyCisJCVVDSEFSCQlCeXRlMzsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUU9TX0NTUjBfU1RSVUMsICpQUU9TX0NTUjBfU1RSVUM7CisjZW5kaWYKKworLy8KKy8vIFFPU19DU1IxOiBUWE9QIGhvbGRlciBhZGRyZXNzMSByZWdpc3RlcgorLy8KKyNpZmRlZiBSVF9CSUdfRU5ESUFOCit0eXBlZGVmCXVuaW9uCV9RT1NfQ1NSMV9TVFJVQwl7CisJc3RydWN0CXsKKwkJVUNIQVIJCVJzdmQxOworCQlVQ0hBUgkJUnN2ZDA7CisJCVVDSEFSCQlCeXRlNTsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgNQorCQlVQ0hBUgkJQnl0ZTQ7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDQKKwl9CWZpZWxkOworCVVJTlQzMgkJCXdvcmQ7Cit9CVFPU19DU1IxX1NUUlVDLCAqUFFPU19DU1IxX1NUUlVDOworI2Vsc2UKK3R5cGVkZWYJdW5pb24JX1FPU19DU1IxX1NUUlVDCXsKKwlzdHJ1Y3QJeworCQlVQ0hBUgkJQnl0ZTQ7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDQKKwkJVUNIQVIJCUJ5dGU1OwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSA1CisJCVVDSEFSCQlSc3ZkMDsKKwkJVUNIQVIJCVJzdmQxOworCX0JZmllbGQ7CisJVUlOVDMyCQkJd29yZDsKK30JUU9TX0NTUjFfU1RSVUMsICpQUU9TX0NTUjFfU1RSVUM7CisjZW5kaWYKKworI2RlZmluZQlSRl9DU1JfQ0ZHCTB4NTAwCisjaWZkZWYgUlRfQklHX0VORElBTgordHlwZWRlZgl1bmlvbglfUkZfQ1NSX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVAlSc3ZkMToxNDsJCQkJLy8gUmVzZXJ2ZWQKKwkJVUlOVAlSRl9DU1JfS0lDSzoxOwkJCS8vIGtpY2sgUkYgcmVnaXN0ZXIgcmVhZC93cml0ZQorCQlVSU5UCVJGX0NTUl9XUjoxOwkJCS8vIDA6IHJlYWQgIDE6IHdyaXRlCisJCVVJTlQJUnN2ZDI6MzsJCQkJLy8gUmVzZXJ2ZWQKKwkJVUlOVAlURVNUQ1NSX1JGQUNDX1JFR05VTTo1OwkvLyBSRiByZWdpc3RlciBJRAorCQlVSU5UCVJGX0NTUl9EQVRBOjg7CQkJLy8gREFUQQorCX0JZmllbGQ7CisJVUlOVAl3b3JkOworfQlSRl9DU1JfQ0ZHX1NUUlVDLCAqUFJGX0NTUl9DRkdfU1RSVUM7CisjZWxzZQordHlwZWRlZgl1bmlvbglfUkZfQ1NSX0NGR19TVFJVQwl7CisJc3RydWN0CXsKKwkJVUlOVAlSRl9DU1JfREFUQTo4OwkJCS8vIERBVEEKKwkJVUlOVAlURVNUQ1NSX1JGQUNDX1JFR05VTTo1OwkvLyBSRiByZWdpc3RlciBJRAorCQlVSU5UCVJzdmQyOjM7CQkJCS8vIFJlc2VydmVkCisJCVVJTlQJUkZfQ1NSX1dSOjE7CQkJLy8gMDogcmVhZCAgMTogd3JpdGUKKwkJVUlOVAlSRl9DU1JfS0lDSzoxOwkJCS8vIGtpY2sgUkYgcmVnaXN0ZXIgcmVhZC93cml0ZQorCQlVSU5UCVJzdmQxOjE0OwkJCQkvLyBSZXNlcnZlZAorCX0JZmllbGQ7CisJVUlOVAl3b3JkOworfQlSRl9DU1JfQ0ZHX1NUUlVDLCAqUFJGX0NTUl9DRkdfU1RSVUM7CisjZW5kaWYKKworI2VuZGlmCS8vIF9fUlQyOFhYX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF9hdGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdjNzYzZWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0X2F0ZS5jCkBAIC0wLDAgKzEsNjQ1MiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2luY2x1ZGUgInJ0X2NvbmZpZy5oIgorCisjaWZkZWYgVUNPUworSU5UIElvY3RsUmVzcG9uc2UoUFVDSEFSIHBheWxvYWQsIFBVQ0hBUiBtc2csIElOVCBsZW4pOworI2VuZGlmIC8vIFVDT1MgLy8KKworI2lmZGVmIFJBTElOS19BVEUKK1VDSEFSIFRlbXBsYXRlRnJhbWVbMjRdID0gezB4MDgvKiBEYXRhIHR5cGUgKi8sMHgwMCwweDAwLDB4MDAsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHgwMCwweEFBLDB4QkIsMHgxMiwweDM0LDB4NTYsMHgwMCwweDExLDB4MjIsMHhBQSwweEJCLDB4Q0MsMHgwMCwweDAwfTsJLy8gODAyLjExIE1BQyBIZWFkZXIsIFR5cGU6RGF0YSwgTGVuZ3RoOjI0Ynl0ZXMKK2V4dGVybiBSVE1QX1JGX1JFR1MgUkYyODUwUmVnVGFibGVbXTsKK2V4dGVybiBVQ0hBUiBOVU1fT0ZfMjg1MF9DSE5MOworCisjaWZkZWYgUlQyODcwCitleHRlcm4gVUNIQVIgRXBUb1F1ZXVlW107CitleHRlcm4gVk9JRAlSVFVTQlJlamVjdFBlbmRpbmdQYWNrZXRzKAlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKyNpZmRlZiBVQ09TCitleHRlcm4gSU5UIENvbnNvbGVSZXNwb25zZShJTiBQVUNIQVIgYnVmZik7CitleHRlcm4gaW50ICgqcmVtb3RlX2Rpc3BsYXkpKGNoYXIgKik7CisjZW5kaWYgLy8gVUNPUyAvLworCitzdGF0aWMgQ0hBUiBDQ0tSYXRlVGFibGVbXSA9IHswLCAxLCAyLCAzLCA4LCA5LCAxMCwgMTEsIC0xfTsgLyogQ0NLIE1vZGUuICovCitzdGF0aWMgQ0hBUiBPRkRNUmF0ZVRhYmxlW10gPSB7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgLTF9OyAvKiBPRkRNIE1vZGUuICovCitzdGF0aWMgQ0hBUiBIVE1JWFJhdGVUYWJsZVtdID0gezAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIC0xfTsgLyogSFQgTWl4IE1vZGUuICovCisKK3N0YXRpYyBJTlQgVHhEbWFCdXN5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworc3RhdGljIElOVCBSeERtYUJ1c3koCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitzdGF0aWMgVk9JRCBSdG1wRG1hRW5hYmxlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIElOVCBFbmFibGUpOworCitzdGF0aWMgVk9JRCBCYnBTb2Z0UmVzZXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitzdGF0aWMgVk9JRCBSdG1wUmZJb1dyaXRlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworc3RhdGljIElOVCBBVEVTZXRVcEZyYW1lKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVJTlQzMiBUeElkeCk7CisKK3N0YXRpYyBJTlQgQVRFVHhQd3JIYW5kbGVyKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIGNoYXIgaW5kZXgpOworCitzdGF0aWMgSU5UIEFURUNtZEhhbmRsZXIoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworc3RhdGljIGludCBDaGVja01DU1ZhbGlkKAorCUlOIFVDSEFSIE1vZGUsCisJSU4gVUNIQVIgTWNzKTsKKworCisjaWZkZWYgUlQyODcwCitzdGF0aWMgVk9JRCBBVEVXcml0ZVR4SW5mbygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVFhJTkZPX1NUUlVDIAlwVHhJbmZvLAorCUlOCSAgVVNIT1JUCQlVU0JETUFwa3RMZW4sCisJSU4JICBCT09MRUFOCQliV2l2LAorCUlOCSAgVUNIQVIJCQlRdWV1ZVNlbCwKKwlJTgkgIFVDSEFSCQkJTmV4dFZhbGlkLAorCUlOCSAgVUNIQVIJCQlUeEJ1cnN0KTsKKworc3RhdGljIFZPSUQgQVRFV3JpdGVUeFdJKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBUWFdJX1NUUlVDIAlwVHhXSSwKKwlJTglCT09MRUFOCQkJRlJBRywKKwlJTglCT09MRUFOCQkJSW5zVGltZXN0YW1wLAorCUlOCUJPT0xFQU4gCQlBTVBEVSwKKwlJTglCT09MRUFOIAkJQWNrLAorCUlOCUJPT0xFQU4gCQlOU2VxLAkJLy8gSFcgbmV3IGEgc2VxdWVuY2UuCisJSU4JVUNIQVIJCQlCQVNpemUsCisJSU4JVUNIQVIJCQlXQ0lELAorCUlOCVVMT05HCQkJTGVuZ3RoLAorCUlOCVVDSEFSIAkJCVBJRCwKKwlJTglVQ0hBUgkJCU1JTU9wcywKKwlJTglVQ0hBUgkJCVR4b3Btb2RlLAorCUlOCUJPT0xFQU4JCQlDZkFjaywKKwlJTglIVFRSQU5TTUlUX1NFVFRJTkcJVHJhbnNtaXQpOworCisjZW5kaWYgLy8gUlQyODcwIC8vCisKK3N0YXRpYyBWT0lEIFNldEphcGFuRmlsdGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09ZW5kIG9mIHByb3RvdHlwZT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKyNpZmRlZiBSVDI4NzAKK3N0YXRpYyBJTlQgVHhEbWFCdXN5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCUlOVCByZXN1bHQ7CisJVVNCX0RNQV9DRkdfU1RSVUMgVXNiQ2ZnOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBVU0JfRE1BX0NGRywgJlVzYkNmZy53b3JkKTsJLy8gZGlzYWJsZSBETUEKKwlpZiAoVXNiQ2ZnLmZpZWxkLlR4QnVzeSkKKwkJcmVzdWx0ID0gMTsKKwllbHNlCisJCXJlc3VsdCA9IDA7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgSU5UIFJ4RG1hQnVzeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlJTlQgcmVzdWx0OworCVVTQl9ETUFfQ0ZHX1NUUlVDIFVzYkNmZzsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVVNCX0RNQV9DRkcsICZVc2JDZmcud29yZCk7CS8vIGRpc2FibGUgRE1BCisJaWYgKFVzYkNmZy5maWVsZC5SeEJ1c3kpCisJCXJlc3VsdCA9IDE7CisJZWxzZQorCQlyZXN1bHQgPSAwOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIFZPSUQgUnRtcERtYUVuYWJsZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBJTlQgRW5hYmxlKQoreworCUJPT0xFQU4gdmFsdWU7CisJVUxPTkcgV2FpdENudDsKKwlVU0JfRE1BX0NGR19TVFJVQyBVc2JDZmc7CisKKwl2YWx1ZSA9IEVuYWJsZSA+IDAgPyAxIDogMDsKKworCS8vIGNoZWNrIERNQSBpcyBpbiBidXN5IG1vZGUuCisJV2FpdENudCA9IDA7CisJd2hpbGUgKFR4RG1hQnVzeShwQWQpIHx8IFJ4RG1hQnVzeShwQWQpKQorCXsKKwkJUlRNUHVzZWNEZWxheSgxMCk7CisJCWlmIChXYWl0Q250KysgPiAxMDApCisJCQlicmVhazsKKwl9CisKKwkvL1doeSBub3QgdG8gY2xlYXIgVVNCIERNQSBUWCBwYXRoIGZpcnN0ID8/PworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVVNCX0RNQV9DRkcsICZVc2JDZmcud29yZCk7CS8vIGRpc2FibGUgRE1BCisJVXNiQ2ZnLmZpZWxkLlR4QnVsa0VuID0gdmFsdWU7CisJVXNiQ2ZnLmZpZWxkLlJ4QnVsa0VuID0gdmFsdWU7CisJUlRNUF9JT19XUklURTMyKHBBZCwgVVNCX0RNQV9DRkcsIFVzYkNmZy53b3JkKTsJLy8gYWJvcnQgYWxsIFRYIHJpbmdzCisJUlRNUHVzZWNEZWxheSg1MDAwKTsKKworCXJldHVybjsKK30KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworc3RhdGljIFZPSUQgQmJwU29mdFJlc2V0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVVDSEFSIEJicERhdGEgPSAwOworCisJLy8gU29mdCByZXNldCwgc2V0IEJCUCBSMjEgYml0MD0xLT4wCisJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIxLCAmQmJwRGF0YSk7CisJQmJwRGF0YSB8PSAweDAwMDAwMDAxOyAvL3NldCBiaXQwPTEKKwlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIxLCBCYnBEYXRhKTsKKworCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyMSwgJkJicERhdGEpOworCUJicERhdGEgJj0gfigweDAwMDAwMDAxKTsgLy9zZXQgYml0MD0wCisJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMSwgQmJwRGF0YSk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBWT0lEIFJ0bXBSZklvV3JpdGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJLy8gU2V0IFJGIHZhbHVlIDEncyBzZXQgUjNbYml0Ml0gPSBbMF0KKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIxKTsKKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIyKTsKKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCAocEFkLT5MYXRjaFJmUmVncy5SMyAmICh+MHgwNCkpKTsKKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlI0KTsKKworCVJUTVB1c2VjRGVsYXkoMjAwKTsKKworCS8vIFNldCBSRiB2YWx1ZSAyJ3Mgc2V0IFIzW2JpdDJdID0gWzFdCisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMSk7CisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMik7CisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgfCAweDA0KSk7CisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SNCk7CisKKwlSVE1QdXNlY0RlbGF5KDIwMCk7CisKKwkvLyBTZXQgUkYgdmFsdWUgMydzIHNldCBSM1tiaXQyXSA9IFswXQorCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjEpOworCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjIpOworCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIChwQWQtPkxhdGNoUmZSZWdzLlIzICYgKH4weDA0KSkpOworCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IENoZWNrTUNTVmFsaWQoCisJVUNIQVIgTW9kZSwKKwlVQ0hBUiBNY3MpCit7CisJaW50IGk7CisJUENIQVIgcFJhdGVUYWI7CisKKwlzd2l0Y2goTW9kZSkKKwl7CisJCWNhc2UgMDoKKwkJCXBSYXRlVGFiID0gQ0NLUmF0ZVRhYmxlOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXBSYXRlVGFiID0gT0ZETVJhdGVUYWJsZTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCWNhc2UgMzoKKwkJCXBSYXRlVGFiID0gSFRNSVhSYXRlVGFibGU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoInVucmVjb2duaXphYmxlIFR4IE1vZGUgJWRcbiIsIE1vZGUpKTsKKwkJCXJldHVybiAtMTsKKwkJCWJyZWFrOworCX0KKworCWkgPSAwOworCXdoaWxlKHBSYXRlVGFiW2ldICE9IC0xKQorCXsKKwkJaWYgKHBSYXRlVGFiW2ldID09IE1jcykKKwkJCXJldHVybiAwOworCQlpKys7CisJfQorCisJcmV0dXJuIC0xOworfQorCisjaWYgMQorc3RhdGljIElOVCBBVEVUeFB3ckhhbmRsZXIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gY2hhciBpbmRleCkKK3sKKwlVTE9ORyBSOworCUNIQVIgVHhQb3dlcjsKKwlVQ0hBUiBCYnA5NCA9IDA7CisJQk9PTEVBTiBiUG93ZXJSZWR1Y2UgPSBGQUxTRTsKKworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJaWYgKChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpIHx8IChwQWQtPmF0ZS5iUUFSeFN0YXJ0ID09IFRSVUUpKQorCXsKKwkJLyogV2hlbiBRQSBpcyB1c2VkIGZvciBUeCwgcEFkLT5hdGUuVHhQb3dlcjAvMSBhbmQgcmVhbCB0eCBwb3dlcgorCQkqKiBhcmUgbm90IHN5bmNocm9uaXplZC4KKwkJKi8KKy8qCisJCXBBZC0+YXRlLlR4UG93ZXIwID0gcEFkLT5MYXRjaFJmUmVncy54eHg7CisJCXBBZC0+YXRlLlR4UG93ZXIxID0gcEFkLT5MYXRjaFJmUmVncy54eHg7CisqLworCQlyZXR1cm4gMDsKKwl9CisJZWxzZQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisJeworCQlUeFBvd2VyID0gaW5kZXggPT0gMCA/IHBBZC0+YXRlLlR4UG93ZXIwIDogcEFkLT5hdGUuVHhQb3dlcjE7CisKKwkJaWYgKHBBZC0+YXRlLkNoYW5uZWwgPD0gMTQpCisJCXsKKwkJCWlmIChUeFBvd2VyID4gMzEpCisJCQl7CisJCQkJLy8KKwkJCQkvLyBSMywgUjQgY2FuJ3QgbGFyZ2UgdGhhbiAzMSAoMHgyNCksIDMxIH4gMzYgdXNlZCBieSBCQlAgOTQKKwkJCQkvLworCQkJCVIgPSAzMTsKKwkJCQlpZiAoVHhQb3dlciA8PSAzNikKKwkJCQkJQmJwOTQgPSBCQlBSOTRfREVGQVVMVCArIChVQ0hBUikoVHhQb3dlciAtIDMxKTsKKwkJCX0KKwkJCWVsc2UgaWYgKFR4UG93ZXIgPCAwKQorCQkJeworCQkJCS8vCisJCQkJLy8gUjMsIFI0IGNhbid0IGxlc3MgdGhhbiAwLCAtMSB+IC02IHVzZWQgYnkgQkJQIDk0CisJCQkJLy8KKwkJCQlSID0gMDsKKwkJCQlpZiAoVHhQb3dlciA+PSAtNikKKwkJCQkJQmJwOTQgPSBCQlBSOTRfREVGQVVMVCArIFR4UG93ZXI7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gMCB+IDMxCisJCQkJUiA9IChVTE9ORykgVHhQb3dlcjsKKwkJCQlCYnA5NCA9IEJCUFI5NF9ERUZBVUxUOworCQkJfQorCisJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAoVHhQb3dlcj0lZCwgUj0lbGQsIEJCUF9SOTQ9JWQpXG4iLCBfX2Z1bmNfXywgVHhQb3dlciwgUiwgQmJwOTQpKTsKKwkJfQorCQllbHNlLy8gNS41IEdIegorCQl7CisJCQlpZiAoVHhQb3dlciA+IDE1KQorCQkJeworCQkJCS8vCisJCQkJLy8gUjMsIFI0IGNhbid0IGxhcmdlIHRoYW4gMTUgKDB4MEYpCisJCQkJLy8KKwkJCQlSID0gMTU7CisJCQl9CisJCQllbHNlIGlmIChUeFBvd2VyIDwgMCkKKwkJCXsKKwkJCQkvLworCQkJCS8vIFIzLCBSNCBjYW4ndCBsZXNzIHRoYW4gMAorCQkJCS8vCisJCQkJLy8gLTEgfiAtNworCQkJCUFTU0VSVCgoVHhQb3dlciA+PSAtNykpOworCQkJCVIgPSAoVUxPTkcpKFR4UG93ZXIgKyA3KTsKKwkJCQliUG93ZXJSZWR1Y2UgPSBUUlVFOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIDAgfiAxNQorCQkJCVIgPSAoVUxPTkcpIFR4UG93ZXI7CisJCQl9CisKKwkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIChUeFBvd2VyPSVkLCBSPSVsdSlcbiIsIF9fZnVuY19fLCBUeFBvd2VyLCBSKSk7CisJCX0KKworCQlpZiAocEFkLT5hdGUuQ2hhbm5lbCA8PSAxNCkKKwkJeworCQkJaWYgKGluZGV4ID09IDApCisJCQl7CisJCQkJUiA9IFIgPDwgOTsJCS8vIHNoaWZ0IFRYIHBvd2VyIGNvbnRyb2wgdG8gY29ycmVjdCBSRihSMykgcmVnaXN0ZXIgYml0IHBvc2l0aW9uCisJCQkJUiB8PSAocEFkLT5MYXRjaFJmUmVncy5SMyAmIDB4ZmZmZmMxZmYpOworCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjMgPSBSOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCVIgPSBSIDw8IDY7CQkvLyBzaGlmdCBUWCBwb3dlciBjb250cm9sIHRvIGNvcnJlY3QgUkYoUjQpIHJlZ2lzdGVyIGJpdCBwb3NpdGlvbgorCQkJCVIgfD0gKHBBZC0+TGF0Y2hSZlJlZ3MuUjQgJiAweGZmZmZmODNmKTsKKwkJCQlwQWQtPkxhdGNoUmZSZWdzLlI0ID0gUjsKKwkJCX0KKwkJfQorCQllbHNlLy8gNS41R0h6CisJCXsKKwkJCWlmIChiUG93ZXJSZWR1Y2UgPT0gRkFMU0UpCisJCQl7CisJCQkJaWYgKGluZGV4ID09IDApCisJCQkJeworCQkJCQlSID0gKFIgPDwgMTApIHwgKDEgPDwgOSk7CQkvLyBzaGlmdCBUWCBwb3dlciBjb250cm9sIHRvIGNvcnJlY3QgUkYoUjMpIHJlZ2lzdGVyIGJpdCBwb3NpdGlvbgorCQkJCQlSIHw9IChwQWQtPkxhdGNoUmZSZWdzLlIzICYgMHhmZmZmYzFmZik7CisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjMgPSBSOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSID0gKFIgPDwgNykgfCAoMSA8PCA2KTsJCS8vIHNoaWZ0IFRYIHBvd2VyIGNvbnRyb2wgdG8gY29ycmVjdCBSRihSNCkgcmVnaXN0ZXIgYml0IHBvc2l0aW9uCisJCQkJCVIgfD0gKHBBZC0+TGF0Y2hSZlJlZ3MuUjQgJiAweGZmZmZmODNmKTsKKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5SNCA9IFI7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmIChpbmRleCA9PSAwKQorCQkJCXsKKwkJCQkJUiA9IChSIDw8IDEwKTsJCS8vIHNoaWZ0IFRYIHBvd2VyIGNvbnRyb2wgdG8gY29ycmVjdCBSRihSMykgcmVnaXN0ZXIgYml0IHBvc2l0aW9uCisJCQkJCVIgfD0gKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgJiAweGZmZmZjMWZmKTsKKworCQkJCQkvKiBDbGVhciBiaXQgOSBvZiBSMyB0byByZWR1Y2UgN2RCLiAqLworCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIzID0gKFIgJiAofigxIDw8IDkpKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVIgPSAoUiA8PCA3KTsJCS8vIHNoaWZ0IFRYIHBvd2VyIGNvbnRyb2wgdG8gY29ycmVjdCBSRihSNCkgcmVnaXN0ZXIgYml0IHBvc2l0aW9uCisJCQkJCVIgfD0gKHBBZC0+TGF0Y2hSZlJlZ3MuUjQgJiAweGZmZmZmODNmKTsKKworCQkJCQkvKiBDbGVhciBiaXQgNiBvZiBSNCB0byByZWR1Y2UgN2RCLiAqLworCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlI0ID0gKFIgJiAofigxIDw8IDYpKSk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJUnRtcFJmSW9Xcml0ZShwQWQpOworCisJCXJldHVybiAwOworCX0KK30KKyNlbHNlLy8gMSAvLworc3RhdGljIElOVCBBVEVUeFB3ckhhbmRsZXIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gY2hhciBpbmRleCkKK3sKKwlVTE9ORyBSOworCUNIQVIgVHhQb3dlcjsKKwlVQ0hBUiBCYnA5NCA9IDA7CisKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCWlmICgocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKSB8fCAocEFkLT5hdGUuYlFBUnhTdGFydCA9PSBUUlVFKSkKKwl7CisJCS8vIFRPRE86IGhvdyB0byBnZXQgY3VycmVudCBUeFBvd2VyMC8xIGZyb20gcEFkLT5MYXRjaFJmUmVncyA/CisJCS8qIFdoZW4gUUEgaXMgdXNlZCBmb3IgVHgsIHBBZC0+YXRlLlR4UG93ZXIwLzEgYW5kIHJlYWwgdHggcG93ZXIKKwkJKiogYXJlIG5vdCBzeW5jaHJvbml6ZWQuCisJCSovCisvKgorCQlwQWQtPmF0ZS5UeFBvd2VyMCA9IHBBZC0+TGF0Y2hSZlJlZ3MueHh4OworCQlwQWQtPmF0ZS5UeFBvd2VyMSA9IHBBZC0+TGF0Y2hSZlJlZ3MueHh4OworKi8KKwkJcmV0dXJuIDA7CisJfQorCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCXsKKwkJVHhQb3dlciA9IGluZGV4ID09IDAgPyBwQWQtPmF0ZS5UeFBvd2VyMCA6IHBBZC0+YXRlLlR4UG93ZXIxOworCisJaWYgKFR4UG93ZXIgPiAzMSkKKwl7CisJCS8vCisJCS8vIFIzLCBSNCBjYW4ndCBsYXJnZSB0aGFuIDM2ICgweDI0KSwgMzEgfiAzNiB1c2VkIGJ5IEJCUCA5NAorCQkvLworCQlSID0gMzE7CisJCWlmIChUeFBvd2VyIDw9IDM2KQorCQkJQmJwOTQgPSBCQlBSOTRfREVGQVVMVCArIChVQ0hBUikoVHhQb3dlciAtIDMxKTsKKwl9CisJZWxzZSBpZiAoVHhQb3dlciA8IDApCisJeworCQkvLworCQkvLyBSMywgUjQgY2FuJ3QgbGVzcyB0aGFuIDAsIC0xIH4gLTYgdXNlZCBieSBCQlAgOTQKKwkJLy8KKwkJUiA9IDA7CisJCWlmIChUeFBvd2VyID49IC02KQorCQkJQmJwOTQgPSBCQlBSOTRfREVGQVVMVCArIFR4UG93ZXI7CisJfQorCWVsc2UKKwl7CisJCS8vIDAgfiAzMQorCQlSID0gKFVMT05HKSBUeFBvd2VyOworCQlCYnA5NCA9IEJCUFI5NF9ERUZBVUxUOworCX0KKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIChUeFBvd2VyPSVkLCBSMz0lbGQsIEJCUF9SOTQ9JWQpXG4iLCBfX2Z1bmNfXywgVHhQb3dlciwgUiwgQmJwOTQpKTsKKworCQlpZiAocEFkLT5hdGUuQ2hhbm5lbCA8PSAxNCkKKwkJeworCWlmIChpbmRleCA9PSAwKQorCXsKKwkJUiA9IFIgPDwgOTsJCS8vIHNoaWZ0IFRYIHBvd2VyIGNvbnRyb2wgdG8gY29ycmVjdCBSRihSMykgcmVnaXN0ZXIgYml0IHBvc2l0aW9uCisJCVIgfD0gKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgJiAweGZmZmZjMWZmKTsKKwkJcEFkLT5MYXRjaFJmUmVncy5SMyA9IFI7CisJfQorCWVsc2UKKwl7CisJCVIgPSBSIDw8IDY7CQkvLyBzaGlmdCBUWCBwb3dlciBjb250cm9sIHRvIGNvcnJlY3QgUkYoUjQpIHJlZ2lzdGVyIGJpdCBwb3NpdGlvbgorCQlSIHw9IChwQWQtPkxhdGNoUmZSZWdzLlI0ICYgMHhmZmZmZjgzZik7CisJCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgPSBSOworCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWlmIChpbmRleCA9PSAwKQorCQkJeworCQkJCVIgPSAoUiA8PCAxMCkgfCAoMSA8PCA5KTsJCS8vIHNoaWZ0IFRYIHBvd2VyIGNvbnRyb2wgdG8gY29ycmVjdCBSRihSMykgcmVnaXN0ZXIgYml0IHBvc2l0aW9uCisJCQkJUiB8PSAocEFkLT5MYXRjaFJmUmVncy5SMyAmIDB4ZmZmZmMxZmYpOworCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjMgPSBSOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCVIgPSAoUiA8PCA3KSB8ICgxIDw8IDYpOwkJLy8gc2hpZnQgVFggcG93ZXIgY29udHJvbCB0byBjb3JyZWN0IFJGKFI0KSByZWdpc3RlciBiaXQgcG9zaXRpb24KKwkJCQlSIHw9IChwQWQtPkxhdGNoUmZSZWdzLlI0ICYgMHhmZmZmZjgzZik7CisJCQkJcEFkLT5MYXRjaFJmUmVncy5SNCA9IFI7CisJCQl9CisJCX0KKworCVJ0bXBSZklvV3JpdGUocEFkKTsKKworCXJldHVybiAwOworCX0KK30KKyNlbmRpZiAvLyAxIC8vCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgb3BlcmF0aW9uIG1vZGUgdG8KKyAgICAgICAgMC4gQVRFU1RBUlQgID0gU3RhcnQgQVRFIE1vZGUKKyAgICAgICAgMS4gQVRFU1RPUCAgID0gU3RvcCBBVEUgTW9kZQorICAgICAgICAyLiBUWENPTlQgICAgPSBDb250aW51b3VzIFRyYW5zbWl0CisgICAgICAgIDMuIFRYQ0FSUiAgICA9IFRyYW5zbWl0IENhcnJpZXIKKyAgICAgICAgNC4gVFhGUkFNRSAgID0gVHJhbnNtaXQgRnJhbWVzCisgICAgICAgIDUuIFJYRlJBTUUgICA9IFJlY2VpdmUgRnJhbWVzCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKyAgICAgICAgNi4gVFhTVE9QICAgID0gU3RvcCBBbnkgVHlwZSBvZiBUcmFuc21pdGlvbgorICAgICAgICA3LiBSWFNUT1AgICAgPSBTdG9wIFJlY2VpdmluZyBGcmFtZXMKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT1FbmQgb2YgUlQyODYwPT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PVN0YXJ0IG9mIFJUMjg3MD09PT09PT09PT09PT09PT09PT09PT0qLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2lmZGVmIFJUMjg3MAorc3RhdGljIElOVAlBVEVDbWRIYW5kbGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVSU5UMzIJCQlWYWx1ZTsKKwlVQ0hBUgkJCUJicERhdGE7CisJVUlOVDMyICAgICAgICAgIE1hY0RhdGE7CisJVUlOVAkJCWk9MCwgYXRlbW9kZTsKKwkvL05ESVNfU1RBVFVTCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCS8vUFVDSEFSCQkJcERlc3Q7CisJVUlOVDMyIAkJCXRlbXA7CisJVUxPTkcJCQlJcnFGbGFnczsKKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gQVRFQ21kSGFuZGxlcigpXG4iKSk7CisJQVRFQXNpY1N3aXRjaENoYW5uZWwocEFkKTsKKwkvKiBBc2ljTG9ja0NoYW5uZWwoKSBpcyBlbXB0eSBmdW5jdGlvbiBzbyBmYXIgaW4gZmFjdCAqLworCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+YXRlLkNoYW5uZWwpOworCisJUlRNUHVzZWNEZWxheSg1MDAwKTsKKworCS8vIERlZmF1bHQgdmFsdWUgaW4gQkJQIFIyMiBpcyAweDAuCisJQmJwRGF0YSA9IDA7CisKKwkvKiBFbnRlciBBVEUgbW9kZSBhbmQgc2V0IFR4L1J4IElkbGUgKi8KKwlpZiAoIXN0cmNtcChhcmcsICJBVEVTVEFSVCIpKQorCXsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJQk9PTEVBTiAgICAgICBDYW5jZWxsZWQ7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURTogQVRFU1RBUlRcbiIpKTsKKworCQluZXRpZl9zdG9wX3F1ZXVlKHBBZC0+bmV0X2Rldik7CisKKwkJYXRlbW9kZSA9IHBBZC0+YXRlLk1vZGU7CisJCXBBZC0+YXRlLk1vZGUgPSBBVEVfU1RBUlQ7CisvLwkJcEFkLT5hdGUuVHhEb25lQ291bnQgPSBwQWQtPmF0ZS5UeENvdW50OworCQkvLyBEaXNhYmxlIFJ4CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQlWYWx1ZSAmPSB+KDEgPDwgMyk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCisJCS8vIERpc2FibGUgYXV0byByZXNwb25kZXIKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBBVVRPX1JTUF9DRkcsICZ0ZW1wKTsKKwkJdGVtcCA9IHRlbXAgJiAweEZGRkZGRkZFOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1JTUF9DRkcsIHRlbXApOworCisJCS8vIHJlYWQgTUFDX1NZU19DVFJMIGFuZCBiYWNrdXAgTUFDX1NZU19DVFJMIHZhbHVlLgorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJk1hY0RhdGEpOworCQkvLyBjbGVhbiBiaXQ0IHRvIHN0b3AgY29udGludW91cyBUeCBwcm9kdWN0aW9uIHRlc3QuCisJCU1hY0RhdGEgJj0gMHhGRkZGRkZFRjsKKwkJLy8gU3RvcCBjb250aW51b3VzIFRYIHByb2R1Y3Rpb24gdGVzdC4KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBNYWNEYXRhKTsvL2Rpc2FibGUgb3IgY2FuY2VsIHBlbmRpbmcgaXJwIGZpcnN0ID8/PworCisgICAgICAgIGlmIChhdGVtb2RlICYgQVRFX1RYQ0FSUikKKwkJeworCQkJLy8gTm8gQ2FycmllciBUZXN0IHNldCBCQlAgUjIyIGJpdDc9MCwgYml0Nj0wLCBiaXRbNX4wXT0weDAKKwkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgJkJicERhdGEpOworCQkJQmJwRGF0YSAmPSAweEZGRkZGRjAwOyAvL2NsZWFyIGJpdDcsIGJpdDYsIGJpdFs1fjBdCisJCSAgICBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKKwkJfQorCQllbHNlIGlmIChhdGVtb2RlICYgQVRFX1RYQ0FSUlNVUFApCisJCXsKKwkJCS8vIE5vIENvbnQuIFRYIHNldCBCQlAgUjIyIGJpdDc9MAorCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCAmQmJwRGF0YSk7CisJCQlCYnBEYXRhICY9IH4oMSA8PCA3KTsgLy9zZXQgYml0Nz0wCisJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKKworCQkJLy8gTm8gQ2FycmllciBTdXBwcmVzc2lvbiBzZXQgQkJQIFIyNCBiaXQwPTAKKwkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyNCwgJkJicERhdGEpOworCQkJQmJwRGF0YSAmPSAweEZGRkZGRkZFOyAvL2NsZWFyIGJpdDAKKwkJICAgIEFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjQsIEJicERhdGEpOworCQl9CisJCS8vIFdlIHNob3VsZCBmcmVlIHNvbWUgcmVzb3VyY2Ugd2hpY2ggYWxsb2NhdGUgd2hlbiBBVEVfVFhGUkFNRSAsIEFURV9TVE9QLCBhbmQgQVRFX1RYQ09OVC4KKwkJLy8gVE9ETzpTaG91bGQgd2UgZnJlZSBzb21lIHJlc291cmNlIHdoaWNoIHdhcyBhbGxvY2F0ZWQgd2hlbiBMb29wQmFjayBhbmQgQVRFX1NUT1AgPworCQllbHNlIGlmICgoYXRlbW9kZSAmIEFURV9UWEZSQU1FKSB8fCAoYXRlbW9kZSA9PSBBVEVfU1RPUCkpCisJCXsKKwkJCWlmIChhdGVtb2RlICYgQVRFX1RYQ09OVCkKKwkJCXsKKwkJCQkvLyBOb3QgQ29udC4gVFggYW55bW9yZSwgc28gc2V0IEJCUCBSMjIgYml0Nz0wCisJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCAmQmJwRGF0YSk7CisJCQkJQmJwRGF0YSAmPSB+KDEgPDwgNyk7IC8vc2V0IGJpdDc9MAorCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsIEJicERhdGEpOworCQkJfQorCQkJLy8gQWJvcnQgVHgsIFJ4IERNQS4KKwkJCVJ0bXBEbWFFbmFibGUocEFkLCAwKTsKKworCQkJeworCQkJCS8vIEl0IHNlZW1zIG5vdGhpbmcgdG8gZnJlZSwKKwkJCQkvLyBiZWNhdXNlIHdlIGRpZG4ndCBhbGxvY2F0ZSBhbnkgcmVzb3VyY2Ugd2hlbiB3ZSBlbnRlcmVkIEFURV9UWEZSQU1FIG1vZGUgbGF0ZXN0bHkuCisJCQl9CisKKwkJCS8vIFN0YXJ0IFR4LCBSWCBETUEKKwkJCVJ0bXBEbWFFbmFibGUocEFkLCAxKTsKKwkJfQorCisJCVJUVVNCUmVqZWN0UGVuZGluZ1BhY2tldHMocEFkKTsKKwkJUlRVU0JDbGVhblVwRGF0YUJ1bGtPdXRRdWV1ZShwQWQpOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCS8vCisJCS8vIEl0IHdpbGwgYmUgY2FsbGVkIGluIE1sbWVTdXNwZW5kKCkuCisJCS8vCisJCS8vIENhbmNlbCBwZW5kaW5nIHRpbWVycworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5Bc3NvY1RpbWVyLCAgICAgJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlJlYXNzb2NUaW1lciwgICAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguRGlzYXNzb2NUaW1lciwgICAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLCAgICAgICAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsICAgICAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCAgICAgICAmQ2FuY2VsbGVkKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkvL1JUVVNCQ2xlYW5VcE1MTUVXYWl0UXVldWUocEFkKTsJLyogbm90IHVzZWQgaW4gUlQyOHh4ICovCisJCVJUVVNCQ2xlYW5VcE1MTUVCdWxrT3V0UXVldWUocEFkKTsKKworCQkvLyBTb21ldGltZXMga2VybmVsIHdpbGwgaGFuZyBvbiwgc28gd2UgYXZvaWQgY2FsbGluZyBNbG1lU3VzcGVuZCgpLgorLy8JCU1sbWVTdXNwZW5kKHBBZCwgVFJVRSk7CisJCS8vUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUGVyaW9kaWNUaW1lciwgJkNhbmNlbGxlZCk7CisKKwkJLy8gRGlzYWJsZSBSeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gfigxIDw8IDMpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKworCQkvLyBBYm9ydCBUeCwgUlggRE1BLgorCQlSdG1wRG1hRW5hYmxlKHBBZCwgMCk7CisKKwkJLy8gRGlzYWJsZSBUeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gfigxIDw8IDIpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKworCQkvLyBNYWtlIHN1cmUgdGhlcmUgYXJlIG5vIHBlbmRpbmcgYnVsayBpbi9vdXQgSVJQcyBiZWZvcmUgd2UgZ28gb24uCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCQkvKiBwQWQtPlBlbmRpbmdSeCBpcyBub3Qgb2YgdHlwZSBhdG9taWNfdCBhbnltb3JlIGluIDI4eHggKi8KKy8vCQl3aGlsZSAoKGF0b21pY19yZWFkKCZwQWQtPlBlbmRpbmdSeCkgPiAwKSkJLy9wQWQtPkJ1bGtGbGFncyAhPSAwIHdhaXQgYnVsayBvdXQgZmluaXNoCisJCXdoaWxlICgocEFkLT5QZW5kaW5nUnggPiAwKSkJLy9wQWQtPkJ1bGtGbGFncyAhPSAwIHdhaXQgYnVsayBvdXQgZmluaXNoCisJCXsKKyNpZiAxCisJCQlBVEVfUlRVU0JDYW5jZWxQZW5kaW5nQnVsa0luSVJQKHBBZCk7CisjZWxzZQorCQkJTmRpc0ludGVybG9ja2VkRGVjcmVtZW50KCZwQWQtPlBlbmRpbmdSeCk7CisjZW5kaWYKKwkJCS8qIGRlbGF5IDAuNSBzZWNvbmRzICovCisJCQlSVE1QdXNlY0RlbGF5KDUwMDAwMCk7CisJCQlwQWQtPlBlbmRpbmdSeCA9IDA7CisJCX0KKwkJLyogcGV0ZXIgOiB3aHkgZG9uJ3Qgd2UgaGF2ZSB0byBnZXQgQnVsa091dExvY2sgZmlyc3QgPyAqLworCQl3aGlsZSAoKChwQWQtPkJ1bGtPdXRQZW5kaW5nWzBdID09IFRSVUUpIHx8CisJCQkJKHBBZC0+QnVsa091dFBlbmRpbmdbMV0gPT0gVFJVRSkgfHwKKwkJCQkocEFkLT5CdWxrT3V0UGVuZGluZ1syXSA9PSBUUlVFKSB8fAorCQkJCShwQWQtPkJ1bGtPdXRQZW5kaW5nWzNdID09IFRSVUUpKSAmJiAocEFkLT5CdWxrRmxhZ3MgIT0gMCkpCS8vcEFkLT5CdWxrRmxhZ3MgIT0gMCB3YWl0IGJ1bGsgb3V0IGZpbmlzaAorCQl7CisJCQlkbworCQkJeworCQkJCS8qIHBBZC0+QnVsa091dFBlbmRpbmdbeV0gd2lsbCBiZSBzZXQgdG8gRkFMU0UgaW4gUlRVU0JDYW5jZWxQZW5kaW5nQnVsa091dElSUChwQWQpICovCisJCQkJUlRVU0JDYW5jZWxQZW5kaW5nQnVsa091dElSUChwQWQpOworCQkJfSB3aGlsZSAoRkFMU0UpOworCisJCQkvKiB3ZSBoYXZlIGVub3VnaCB0aW1lIGRlbGF5IGluIFJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtPdXRJUlAocEFkKQorCQkJKiogc28gdGhpcyBpcyBub3QgbmVjZXNzYXJ5CisJCQkqLworLy8JCQlSVE1QdXNlY0RlbGF5KDUwMDAwMCk7CisJCX0KKworCQkvKiBwQWQtPlBlbmRpbmdSeCBpcyBub3Qgb2YgdHlwZSBhdG9taWNfdCBhbnltb3JlIGluIDI4eHggKi8KKy8vCQlBU1NFUlQoYXRvbWljX3JlYWQoJnBBZC0+UGVuZGluZ1J4KSA9PSAwKTsKKwkJQVNTRVJUKHBBZC0+UGVuZGluZ1J4ID09IDApOworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCQkvLyByZXNldCBSeCBzdGF0aXN0aWNzLgorCQlwQWQtPmF0ZS5MYXN0U05SMCA9IDA7CisJCXBBZC0+YXRlLkxhc3RTTlIxID0gMDsKKwkJcEFkLT5hdGUuTGFzdFJzc2kwID0gMDsKKwkJcEFkLT5hdGUuTGFzdFJzc2kxID0gMDsKKwkJcEFkLT5hdGUuTGFzdFJzc2kyID0gMDsKKwkJcEFkLT5hdGUuQXZnUnNzaTAgPSAwOworCQlwQWQtPmF0ZS5BdmdSc3NpMSA9IDA7CisJCXBBZC0+YXRlLkF2Z1Jzc2kyID0gMDsKKwkJcEFkLT5hdGUuQXZnUnNzaTBYOCA9IDA7CisJCXBBZC0+YXRlLkF2Z1Jzc2kxWDggPSAwOworCQlwQWQtPmF0ZS5BdmdSc3NpMlg4ID0gMDsKKwkJcEFkLT5hdGUuTnVtT2ZBdmdSc3NpU2FtcGxlID0gMDsKKworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJCS8vIFR4IGZyYW1lCisJCXBBZC0+YXRlLmJRQVR4U3RhcnQgPSBGQUxTRTsKKwkJcEFkLT5hdGUuYlFBUnhTdGFydCA9IEZBTFNFOworCQlwQWQtPmF0ZS5zZXEgPSAwOworCisJCS8vIGNvdW50ZXJzCisJCXBBZC0+YXRlLlUyTSA9IDA7CisJCXBBZC0+YXRlLk90aGVyRGF0YSA9IDA7CisJCXBBZC0+YXRlLkJlYWNvbiA9IDA7CisJCXBBZC0+YXRlLk90aGVyQ291bnQgPSAwOworCQlwQWQtPmF0ZS5UeEFjMCA9IDA7CisJCXBBZC0+YXRlLlR4QWMxID0gMDsKKwkJcEFkLT5hdGUuVHhBYzIgPSAwOworCQlwQWQtPmF0ZS5UeEFjMyA9IDA7CisJCXBBZC0+YXRlLlR4SENDQSA9IDA7CisJCXBBZC0+YXRlLlR4TWdtdCA9IDA7CisJCXBBZC0+YXRlLlJTU0kwID0gMDsKKwkJcEFkLT5hdGUuUlNTSTEgPSAwOworCQlwQWQtPmF0ZS5SU1NJMiA9IDA7CisJCXBBZC0+YXRlLlNOUjAgPSAwOworCQlwQWQtPmF0ZS5TTlIxID0gMDsKKworCQkvLyBjb250cm9sCisJCXBBZC0+YXRlLlR4RG9uZUNvdW50ID0gMDsKKwkJcEFkLT5hdGUuVHhTdGF0dXMgPSAwOyAvLyB0YXNrIFR4IHN0YXR1cyAvLyAwIC0tPiB0YXNrIGlzIGlkbGUsIDEgLS0+IHRhc2sgaXMgcnVubmluZworI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisKKwkJLy8gU29mdCByZXNldCBCQlAuCisJCUJicFNvZnRSZXNldChwQWQpOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJQXNpY0Rpc2FibGVTeW5jKHBBZCk7CisKKwkJLyoKKwkJKiogSWYgd2Ugc2tpcCAiTGlua0Rvd24oKSIsIHdlIHNob3VsZCBkaXNhYmxlIHByb3RlY3Rpb24KKwkJKiogdG8gcHJldmVudCBmcm9tIHNlbmRpbmcgb3V0IFJUUyBvciBDVFMtdG8tc2VsZi4KKwkJKi8KKwkJQVRFRGlzYWJsZUFzaWNQcm90ZWN0KHBBZCk7CisJCVJUTVBTdGF0aW9uU3RvcChwQWQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCS8vIERlZmF1bHQgdmFsdWUgaW4gQkJQIFIyMiBpcyAweDAuCisJCUJicERhdGEgPSAwOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJk1hY0RhdGEpOworCisJCS8vIENsZWFuIGJpdDQgdG8gc3RvcCBjb250aW51b3VzIFR4IHByb2R1Y3Rpb24gdGVzdC4KKwkJTWFjRGF0YSAmPSAweEZGRkZGRkVGOworCSAgIAlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKKwkgICAgCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7CisJCS8vQ2xlYW4gQVRFIEJ1bGsgaW4vb3V0IGNvdW50ZXIgYW5kIGNvbnRpbnVlIHNldHVwCisJCUludGVybG9ja2VkRXhjaGFuZ2UoJnBBZC0+QnVsa091dFJlbWFpbmVkLCAwKTsKKworCQkvKiBOZGlzQWNxdWlyZVNwaW5Mb2NrKCkvTmRpc1JlbGVhc2VTcGluTG9jaygpIG5lZWQgb25seSBvbmUgYXJndW1lbnQgaW4gUlQyOHh4ICovCisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+R2VuZXJpY0xvY2spOworCQlwQWQtPkNvbnRpbkJ1bGtPdXQgPSBGQUxTRTsKKwkJcEFkLT5Db250aW5CdWxrSW4gPSBGQUxTRTsKKwkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5HZW5lcmljTG9jayk7CisKKwkJUlRVU0JfQ0xFQVJfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfQVRFKTsKKwl9CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICJBVEVTVE9QIikpCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVEUgOiBBVEVTVE9QID09PT5cbiIpKTsKKworCQkvLyBEZWZhdWx0IHZhbHVlIGluIEJCUCBSMjIgaXMgMHgwLgorCQlCYnBEYXRhID0gMDsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZNYWNEYXRhKTsvLzA4MjAKKwkJLy8gQ2xlYW4gYml0NCB0byBzdG9wIGNvbnRpbnVvdXMgVHggcHJvZHVjdGlvbiB0ZXN0LgorCQlNYWNEYXRhICY9IDB4RkZGRkZGRUY7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsIEJicERhdGEpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIE1hY0RhdGEpOyAvLyByZWNvdmVyIHRoZSBNQUNfU1lTX0NUUkwgcmVnaXN0ZXIgYmFjay4KKworCQkvLyBEaXNhYmxlIFJ4CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQlWYWx1ZSAmPSB+KDEgPDwgMyk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCisJCS8qCisJCSoqIEFib3J0IFR4LCBSWCBETUEuCisJCSoqIFEgICA6IEhvdyB0byBkbyB0aGUgZm9sbG93aW5nIEkvTyBpZiBUeCwgUnggRE1BIGlzIGFib3J0ZWQgPworCQkqKiBBbnMgOiBCdWxrIGVuZHBvaW50cyBhcmUgYWJvcnRlZCwgd2hpbGUgdGhlIGNvbnRyb2wgZW5kcG9pbnQgaXMgbm90LgorCQkqLworCQlSdG1wRG1hRW5hYmxlKHBBZCwgMCk7CisKKwkJLy8gRGlzYWJsZSBUeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gfigxIDw8IDIpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKworCQkvKiBNYWtlIHN1cmUgdGhlcmUgYXJlIG5vIHBlbmRpbmcgYnVsayBpbi9vdXQgSVJQcyBiZWZvcmUgd2UgZ28gb24uICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLy8JCXdoaWxlICgoYXRvbWljX3JlYWQoJnBBZC0+UGVuZGluZ1J4KSA+IDApKQkvL3BBZC0+QnVsa0ZsYWdzICE9IDAgd2FpdCBidWxrIG91dCBmaW5pc2gKKwkJd2hpbGUgKHBBZC0+UGVuZGluZ1J4ID4gMCkKKwkJeworI2lmIDEKKwkJCUFURV9SVFVTQkNhbmNlbFBlbmRpbmdCdWxrSW5JUlAocEFkKTsKKyNlbHNlCisvLwkJCU5kaXNJbnRlcmxvY2tlZERlY3JlbWVudCgmcEFkLT5QZW5kaW5nUngpOworCQkJcEFkLT5QZW5kaW5nUngtLTsKKyNlbmRpZgorCQkJUlRNUHVzZWNEZWxheSg1MDAwMDApOworCQl9CisKKwkJd2hpbGUgKCgocEFkLT5CdWxrT3V0UGVuZGluZ1swXSA9PSBUUlVFKSB8fAorCQkJCShwQWQtPkJ1bGtPdXRQZW5kaW5nWzFdID09IFRSVUUpIHx8CisJCQkJKHBBZC0+QnVsa091dFBlbmRpbmdbMl0gPT0gVFJVRSkgfHwKKwkJCQkocEFkLT5CdWxrT3V0UGVuZGluZ1szXSA9PSBUUlVFKSkgJiYgKHBBZC0+QnVsa0ZsYWdzICE9IDApKQkvL3BBZC0+QnVsa0ZsYWdzICE9IDAgd2FpdCBidWxrIG91dCBmaW5pc2gKKwkJeworCQkJZG8KKwkJCXsKKwkJCQlSVFVTQkNhbmNlbFBlbmRpbmdCdWxrT3V0SVJQKHBBZCk7CisJCQl9IHdoaWxlIChGQUxTRSk7CisKKwkJCVJUTVB1c2VjRGVsYXkoNTAwMDAwKTsKKwkJfQorCisvLwkJQVNTRVJUKGF0b21pY19yZWFkKCZwQWQtPlBlbmRpbmdSeCkgPT0gMCk7CisJCUFTU0VSVChwQWQtPlBlbmRpbmdSeCA9PSAwKTsKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiAgICAgIFJlc2V0IFJ4IFJJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8vCQlJbnRlcmxvY2tlZEV4Y2hhbmdlKCZwQWQtPlBlbmRpbmdSeCwgMCk7CisJCXBBZC0+UGVuZGluZ1J4ID0gMDsKKwkJcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXggPSAwOwkvLyBOZXh0IFJ4IFJlYWQgaW5kZXgKKwkJcEFkLT5OZXh0UnhCdWxrSW5JbmRleCA9IFJYX1JJTkdfU0laRSAtIDE7CS8vIFJ4IEJ1bGsgcG9pbnRlcgorCQlwQWQtPk5leHRSeEJ1bGtJblBvc2l0aW9uID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IChSWF9SSU5HX1NJWkUpOyBpKyspCisJCXsKKwkJCVBSWF9DT05URVhUICBwUnhDb250ZXh0ID0gJihwQWQtPlJ4Q29udGV4dFtpXSk7CisJCQlOZGlzWmVyb01lbW9yeShwUnhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciwgTUFYX1JYQlVMS19TSVpFKTsKKwkJCS8qIHBldGVyIDogd2h5IGRvbid0IHdlIGhhdmUgdG8gZ2V0IEJ1bGtJbkxvY2sgZmlyc3QgPyAqLworCQkJcFJ4Q29udGV4dC0+cEFkCT0gcEFkOworCQkJcFJ4Q29udGV4dC0+cElycCA9IE5VTEw7CisgICAgICAgICAgICAvKiBwZXRlciBkZWJ1ZyArKyAqLworCQkJcFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0ID0gMDsKKwkJCXBSeENvbnRleHQtPmJSeEhhbmRsaW5nID0gRkFMU0U7CisgICAgICAgICAgICAvKiBwZXRlciBkZWJ1ZyAtLSAqLworCQkJcFJ4Q29udGV4dC0+SW5Vc2UJCT0gRkFMU0U7CisJCQlwUnhDb250ZXh0LT5JUlBQZW5kaW5nCT0gRkFMU0U7CisJCQlwUnhDb250ZXh0LT5SZWFkYWJsZQk9IEZBTFNFOworLy8JCQlwUnhDb250ZXh0LT5SZW9yZGVySW5Vc2UgPSBGQUxTRTsKKy8vCQkJcFJ4Q29udGV4dC0+UmVhZFBvc09mZnNldCA9IDA7CisJCX0KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qICAgICAgUmVzZXQgVHggUklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCQlkbworCQl7CisJCQlSVFVTQkNhbmNlbFBlbmRpbmdCdWxrT3V0SVJQKHBBZCk7CisJCX0gd2hpbGUgKEZBTFNFKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwkJLy8gRW5hYmxlIGF1dG8gcmVzcG9uZGVyLgorCQlSVE1QX0lPX1JFQUQzMihwQWQsIEFVVE9fUlNQX0NGRywgJnRlbXApOworCQl0ZW1wID0gdGVtcCB8ICgweDAxKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19SU1BfQ0ZHLCB0ZW1wKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCQlBc2ljRW5hYmxlQnNzU3luYyhwQWQpOworCisJCS8qIFNvZnQgcmVzZXQgQkJQLiovCisJCS8qIEluIDI4NzAgY2hpcHNldCwgQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQoKSA9PSBSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQoKSAqLworCQkvKiBCb3RoIHJ0Mjg3MGFwIGFuZCBydDI4NzBzdGEgdXNlIEJicFNvZnRSZXNldChwQWQpIHRvIGRvIEJCUCBzb2Z0IHJlc2V0ICovCisJCUJicFNvZnRSZXNldChwQWQpOworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCQl7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkvLyBTZXQgYWxsIHN0YXRlIG1hY2hpbmVzIGJhY2sgSURMRQorCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAgICA9IENOVExfSURMRTsKKwkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlICAgPSBBU1NPQ19JRExFOworCQkJcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSAgICA9IEFVVEhfUkVRX0lETEU7CisJCQlwQWQtPk1sbWUuQXV0aFJzcE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SU1BfSURMRTsKKwkJCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgICAgPSBTWU5DX0lETEU7CisJCQlwQWQtPk1sbWUuQWN0TWFjaGluZS5DdXJyU3RhdGUgICAgPSBBQ1RfSURMRTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkJLy8KKwkJCS8vID09PT4gcmVmZXIgdG8gTWxtZVJlc3RhcnRTdGF0ZU1hY2hpbmUoKS4KKwkJCS8vIFdoZW4gd2UgZW50ZXJlZCBBVEVfU1RBUlQgbW9kZSwgUGVyaW9kaWNUaW1lciB3YXMgbm90IGNhbmNlbGxlZC4KKwkJCS8vIFNvIHdlIGRvbid0IGhhdmUgdG8gc2V0IGl0IGhlcmUuCisJCQkvLworCQkJLy9SVE1QU2V0VGltZXIocEFkLCAmcEFkLT5NbG1lLlBlcmlvZGljVGltZXIsIE1MTUVfVEFTS19FWEVDX0lOVFYpOworCisJCQlBU1NFUlQocEFkLT5Db21tb25DZmcuQ2hhbm5lbCAhPSAwKTsKKworCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCSAgICBSVE1QU3RhdGlvblN0YXJ0KHBBZCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCX0KKy8vCisvLyBUaGVzZSB0d28gc3RlcHMgaGF2ZSBiZWVuIGRvbmUgd2hlbiBlbnRlcmluZyBBVEVfU1RPUCBtb2RlLgorLy8KKyNpZiAwCisJICAgIFJUVVNCV3JpdGVCQlBSZWdpc3RlcihwQWQsIEJCUF9SMjIsIEJicERhdGEpOworCSAgIAlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBNQUNfU1lTX0NUUkwsIE1hY0RhdGEpOworI2VuZGlmCisJCS8vIENsZWFuIEFURSBCdWxrIGluL291dCBjb3VudGVyIGFuZCBjb250aW51ZSBzZXR1cC4KKwkJSW50ZXJsb2NrZWRFeGNoYW5nZSgmcEFkLT5CdWxrT3V0UmVtYWluZWQsIDApOworCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkdlbmVyaWNMb2NrKTsKKwkJcEFkLT5Db250aW5CdWxrT3V0ID0gRkFMU0U7CisJCXBBZC0+Q29udGluQnVsa0luID0gRkFMU0U7CisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+R2VuZXJpY0xvY2spOworCisJCS8qIFdhaXQgNTBtcyB0byBwcmV2ZW50IG5leHQgVVJCIHRvIGJ1bGtvdXQgZHVyaW5nIEhXIHJlc2V0LiAqLworCQkvKiB0b2RvIDogcmVtb3ZlIHRoaXMgaWYgbm90IG5lY2Vzc2FyeSAqLworCQlOZGlzTVNsZWVwKDUwMDAwKTsKKworCQlwQWQtPmF0ZS5Nb2RlID0gQVRFX1NUT1A7CisKKwkJLy8gRW5hYmxlIFR4CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQlWYWx1ZSB8PSAoMSA8PCAyKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisJCS8qIHJlc3RvcmUgUlhfRklMVFJfQ0ZHICovCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCS8qIHJlc3RvcmUgUlhfRklMVFJfQ0ZHIGluIG9yZGVyIHRoYXQgUUEgbWF5YmUgc2V0IGl0IHRvIDB4MyAqLworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9GSUxUUl9DRkcsIFNUQU5PUk1BTCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisJCS8vIEVuYWJsZSBUeCwgUlggRE1BLgorCQlSdG1wRG1hRW5hYmxlKHBBZCwgMSk7CisKKwkJLy8gRW5hYmxlIFJ4CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQlWYWx1ZSB8PSAoMSA8PCAzKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKwkJLy8gV2FpdCAxMG1zIHRvIHdhaXQgYWxsIG9mIHRoZSBidWxrLWluIFVSQnMgdG8gY29tcGxldGUuCisJCS8qIHRvZG8gOiByZW1vdmUgdGhpcyBpZiBub3QgbmVjZXNzYXJ5ICovCisJCU5kaXNNU2xlZXAoMTAwMDApOworCisJCS8vIEV2ZXJ5dGhpbmcgaXMgcmVhZHkgdG8gc3RhcnQgbm9ybWFsIFR4L1J4LgorCQlSVFVTQkJ1bGtSZWNlaXZlKHBBZCk7CisJCW5ldGlmX3N0YXJ0X3F1ZXVlKHBBZC0+bmV0X2Rldik7CisKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PSBBVEUgOiBBVEVTVE9QIFxuIikpOworCX0KKwllbHNlIGlmICghc3RyY21wKGFyZywgIlRYQ0FSUiIpKQkvLyBUeCBDYXJyaWVyCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVEU6IFRYQ0FSUlxuIikpOworCQlwQWQtPmF0ZS5Nb2RlIHw9IEFURV9UWENBUlI7CisKKwkJLy8gRGlzYWJsZSBSeAorCQkvLyBNYXkgYmUgd2UgbmVlZCBub3QgdG8gZG8gdGhpcywgYmVjYXVzZSB0aGVzZSBoYXZlIGJlZW4gZG9uZSBpbiBBVEVfU1RBUlQgbW9kZSA/Pz8KKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlICY9IH4oMSA8PCAzKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKwkJLy8gUUEgaGFzIGRvbmUgdGhlIGZvbGxvd2luZyBzdGVwcyBpZiBpdCBpcyB1c2VkLgorCQlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBGQUxTRSkKKwkJeworCQkJLy8gU29mdCByZXNldCBCQlAuCisJCQlCYnBTb2Z0UmVzZXQocEFkKTsKKworCQkJLy8gQ2FycmllciBUZXN0IHNldCBCQlAgUjIyIGJpdDc9MSwgYml0Nj0xLCBiaXRbNX4wXT0weDAxCisJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsICZCYnBEYXRhKTsKKwkJCUJicERhdGEgJj0gMHhGRkZGRkYwMDsgLy9jbGVhciBiaXQ3LCBiaXQ2LCBiaXRbNX4wXQorCQkJQmJwRGF0YSB8PSAweDAwMDAwMEMxOyAvL3NldCBiaXQ3PTEsIGJpdDY9MSwgYml0WzV+MF09MHgwMQorCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisKKwkJCS8vIHNldCBNQUNfU1lTX0NUUkwoMHgxMDA0KSBDb250aW51b3VzIFR4IFByb2R1Y3Rpb24gVGVzdCAoYml0NCkgPSAxCisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJCVZhbHVlID0gVmFsdWUgfCAweDAwMDAwMDEwOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisJCX0KKwl9CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICJUWENPTlQiKSkJLy8gVHggQ29udGludWUKKwl7CisJCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpCisJCXsKKwkJCS8qIHNldCBNQUNfU1lTX0NUUkwoMHgxMDA0KSBiaXQ0KENvbnRpbnVvdXMgVHggUHJvZHVjdGlvbiBUZXN0KQorCQkJICAgYW5kIGJpdDIoTUFDIFRYIGVuYWJsZSkgYmFjayB0byB6ZXJvLiAqLworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZNYWNEYXRhKTsKKwkJCU1hY0RhdGEgJj0gMHhGRkZGRkZFQjsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7CisKKwkJCS8vIHNldCBCQlAgUjIyIGJpdDc9MAorCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCAmQmJwRGF0YSk7CisJCQlCYnBEYXRhICY9IDB4RkZGRkZGN0Y7IC8vc2V0IGJpdDc9MAorCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisJCX0KKworCQkvKiBmb3IgVHhDb250IG1vZGUuCisJCSoqIFN0ZXAgMTogU2VuZCA1MCBwYWNrZXRzIGZpcnN0IHRoZW4gd2FpdCBmb3IgYSBtb21lbnQuCisJCSoqIFN0ZXAgMjogU2VuZCBtb3JlIDUwIHBhY2tldCB0aGVuIHN0YXJ0IGNvbnRpbnVlIG1vZGUuCisJCSovCisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURTogVFhDT05UXG4iKSk7CisJCS8vIFN0ZXAgMTogc2VuZCA1MCBwYWNrZXRzIGZpcnN0LgorCQlwQWQtPmF0ZS5Nb2RlIHw9IEFURV9UWENPTlQ7CisJCXBBZC0+YXRlLlR4Q291bnQgPSA1MDsKKwkJcEFkLT5hdGUuVHhEb25lQ291bnQgPSAwOworCisJCS8vIFNvZnQgcmVzZXQgQkJQLgorCQlCYnBTb2Z0UmVzZXQocEFkKTsKKworCQkvLyBBYm9ydCBUeCwgUlggRE1BLgorCQlSdG1wRG1hRW5hYmxlKHBBZCwgMCk7CisKKworCQkvKiBPbmx5IG5lZWRlZCBpZiB3ZSBoYXZlIHRvIHNlbmQgc29tZSBub3JtYWwgZnJhbWVzLiAqLworCQlTZXRKYXBhbkZpbHRlcihwQWQpOworCisJCS8vIFNldHVwIGZyYW1lIGZvcm1hdC4KKwkJQVRFU2V0VXBGcmFtZShwQWQsIDApOworCisJCS8vIEVuYWJsZSBUeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgfD0gKDEgPDwgMik7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCisJCS8vIERpc2FibGUgUngKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlICY9IH4oMSA8PCAzKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKwkJLy8gU3RhcnQgVHgsIFJYIERNQS4KKwkJUnRtcERtYUVuYWJsZShwQWQsIDEpOworCisJCUludGVybG9ja2VkRXhjaGFuZ2UoJnBBZC0+QnVsa091dFJlbWFpbmVkLCBwQWQtPmF0ZS5UeENvdW50KTsKKworI2lmZGVmCVJBTElOS18yOHh4X1FBCisJCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpCisJCXsKKwkJCXBBZC0+YXRlLlR4U3RhdHVzID0gMTsKKwkJCS8vcEFkLT5hdGUuUmVwZWF0ID0gMDsKKwkJfQorI2VuZGlmCS8vIFJBTElOS18yOHh4X1FBIC8vCisKKwkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5HZW5lcmljTG9jayk7Ly8wODIwCisJCXBBZC0+Q29udGluQnVsa091dCA9IEZBTFNFOworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkdlbmVyaWNMb2NrKTsKKworCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfQVRFKTsKKworCQkvLyBLaWNrIGJ1bGsgb3V0CisJCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKKworCQkvKiBUbyBtYWtlIHN1cmUgYWxsIHRoZSA1MCBmcmFtZXMgaGF2ZSBiZWVuIGJ1bGsgb3V0IGJlZm9yZSBleGVjdXRpbmcgc3RlcCAyICovCisJCXdoaWxlIChhdG9taWNfcmVhZCgmcEFkLT5CdWxrT3V0UmVtYWluZWQpID4gMCkKKwkJeworCQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKKwkJfQorCisJCS8vIFN0ZXAgMjogc2VuZCBtb3JlIDUwIHBhY2tldHMgdGhlbiBzdGFydCBjb250aW51ZSBtb2RlLgorCQkvLyBBYm9ydCBUeCwgUlggRE1BLgorCQlSdG1wRG1hRW5hYmxlKHBBZCwgMCk7CisKKwkJLy8gQ29udC4gVFggc2V0IEJCUCBSMjIgYml0Nz0xCisJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgJkJicERhdGEpOworCQlCYnBEYXRhIHw9IDB4MDAwMDAwODA7IC8vc2V0IGJpdDc9MQorCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKKworCQlwQWQtPmF0ZS5UeENvdW50ID0gNTA7CisJCXBBZC0+YXRlLlR4RG9uZUNvdW50ID0gMDsKKworCQlTZXRKYXBhbkZpbHRlcihwQWQpOworCisJCS8vIFNldHVwIGZyYW1lIGZvcm1hdC4KKwkJQVRFU2V0VXBGcmFtZShwQWQsIDApOworCisJCS8vIEVuYWJsZSBUeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgfD0gKDEgPDwgMik7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCisJCS8vIERpc2FibGUgUngKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlICY9IH4oMSA8PCAzKTsKKworCQkvLyBTdGFydCBUeCwgUlggRE1BLgorCQlSdG1wRG1hRW5hYmxlKHBBZCwgMSk7CisKKwkJSW50ZXJsb2NrZWRFeGNoYW5nZSgmcEFkLT5CdWxrT3V0UmVtYWluZWQsIHBBZC0+YXRlLlR4Q291bnQpOworCisjaWZkZWYJUkFMSU5LXzI4eHhfUUEKKwkJaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKKwkJeworCQkJcEFkLT5hdGUuVHhTdGF0dXMgPSAxOworCQkJLy9wQWQtPmF0ZS5SZXBlYXQgPSAwOworCQl9CisjZW5kaWYJLy8gUkFMSU5LXzI4eHhfUUEgLy8KKworCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkdlbmVyaWNMb2NrKTsvLzA4MjAKKwkJcEFkLT5Db250aW5CdWxrT3V0ID0gRkFMU0U7CisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+R2VuZXJpY0xvY2spOworCisJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9BVEUpOworCQkvLyBLaWNrIGJ1bGsgb3V0CisJCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKKworI2lmIDEKKwkJUlRNUHVzZWNEZWxheSg1MDApOworI2Vsc2UKKwkJd2hpbGUgKGF0b21pY19yZWFkKCZwQWQtPkJ1bGtPdXRSZW1haW5lZCkgPiAwKQorCQl7CisJCQlSVE1QdXNlY0RlbGF5KDUwMDApOworCQl9CisjZW5kaWYgLy8gMSAvLworCisJCS8vIFNldCBNQUNfU1lTX0NUUkwoMHgxMDA0KSBDb250aW51b3VzIFR4IFByb2R1Y3Rpb24gVGVzdCAoYml0NCkgPSAxLgorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJk1hY0RhdGEpOworCQlNYWNEYXRhIHw9IDB4MDAwMDAwMTA7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7CisJfQorCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiVFhGUkFNRSIpKQkvLyBUeCBGcmFtZXMKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURTogVFhGUkFNRShDb3VudD0weCUwOHgpXG4iLCBwQWQtPmF0ZS5UeENvdW50KSk7CisJCXBBZC0+YXRlLk1vZGUgfD0gQVRFX1RYRlJBTUU7CisKKwkJLy8gU29mdCByZXNldCBCQlAuCisJCUJicFNvZnRSZXNldChwQWQpOworCisJCS8vIERlZmF1bHQgdmFsdWUgaW4gQkJQIFIyMiBpcyAweDAuCisJCUJicERhdGEgPSAwOworCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmTWFjRGF0YSk7CisKKwkJLy8gQ2xlYW4gYml0NCB0byBzdG9wIGNvbnRpbnVvdXMgVHggcHJvZHVjdGlvbiB0ZXN0LgorCQlNYWNEYXRhICY9IDB4RkZGRkZGRUY7CisKKwkgICAJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7CisKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCQkvLyBhZGQgdGhpcyBmb3IgTG9vcEJhY2sgbW9kZQorCQlpZiAocEFkLT5hdGUuYlFBUnhTdGFydCA9PSBGQUxTRSkKKwkJeworCQkJLy8gRGlzYWJsZSBSeAorCQkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCQlWYWx1ZSAmPSB+KDEgPDwgMyk7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKwkJfQorCisJCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpCisJCXsKKwkJCXBBZC0+YXRlLlR4U3RhdHVzID0gMTsKKwkJCS8vcEFkLT5hdGUuUmVwZWF0ID0gMDsKKwkJfQorI2Vsc2UKKwkJLy8gRGlzYWJsZSBSeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gfigxIDw8IDMpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCisJCS8vIEVuYWJsZSBUeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgfD0gKDEgPDwgMik7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCisgICAgICAgIFNldEphcGFuRmlsdGVyKHBBZCk7CisKKwkJLy8gQWJvcnQgVHgsIFJYIERNQS4KKwkJUnRtcERtYUVuYWJsZShwQWQsIDApOworCisJCXBBZC0+YXRlLlR4RG9uZUNvdW50ID0gMDsKKworICAgICAgICAvLyBTZXR1cCBmcmFtZSBmb3JtYXQKKwkJQVRFU2V0VXBGcmFtZShwQWQsIDApOworCisJCS8vIFN0YXJ0IFR4LCBSWCBETUEuCisJCVJ0bXBEbWFFbmFibGUocEFkLCAxKTsKKworCQkvLyBDaGVjayBjb3VudCBpcyBjb250aW51b3VzIG9yIG5vdCB5ZXQuCisJCS8vCisJCS8vIER1ZSB0byB0aGUgdHlwZSBtaXNtYXRjaCBiZXR3ZWVuICJwQWQtPkJ1bGtPdXRSZW1haW5lZCIoYXRvbWljX3QpIGFuZCAicEFkLT5hdGUuVHhDb3VudCIoVUlOVDMyKQorCQkvLworCQlpZiAocEFkLT5hdGUuVHhDb3VudCA9PSAwKQorCQl7CisJCQlJbnRlcmxvY2tlZEV4Y2hhbmdlKCZwQWQtPkJ1bGtPdXRSZW1haW5lZCwgMCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlJbnRlcmxvY2tlZEV4Y2hhbmdlKCZwQWQtPkJ1bGtPdXRSZW1haW5lZCwgcEFkLT5hdGUuVHhDb3VudCk7CisJCX0KKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiYnVsayBvdXQgY291bnQgPSAlZFxuIiwgYXRvbWljX3JlYWQoJnBBZC0+QnVsa091dFJlbWFpbmVkKSkpOworCQlBU1NFUlQoKGF0b21pY19yZWFkKCZwQWQtPkJ1bGtPdXRSZW1haW5lZCkgPj0gMCkpOworCisJCWlmIChhdG9taWNfcmVhZCgmcEFkLT5CdWxrT3V0UmVtYWluZWQpID09IDApCisJCXsKKwkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNlbmQgcGFja2V0IGNvdW50aW51b3VzbHlcbiIpKTsKKworCQkJLyogSW4gMjh4eCwgTmRpc0FjcXVpcmVTcGluTG9jaygpID09IHNwaW5fbG9ja19iaCgpICovCisJCQkvKiBOZGlzQWNxdWlyZVNwaW5Mb2NrIG9ubHkgbmVlZCBvbmUgYXJndW1lbnQgaW4gMjh4eC4gKi8KKwkJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+R2VuZXJpY0xvY2spOworCQkJcEFkLT5Db250aW5CdWxrT3V0ID0gVFJVRTsKKwkJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+R2VuZXJpY0xvY2spOworCisJCQkvKiBJbiAyOHh4LCBCVUxLX09VVF9MT0NLKCkgPT0gc3Bpbl9sb2NrX2lycXNhdmUoKSAqLworCQkJQlVMS19PVVRfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgSXJxRmxhZ3MpOy8vIHBldGVyIDogTmRpc0FjcXVpcmVTcGluTG9jayA9PT4gQlVMS19PVVRfTE9DSworCQkJcEFkLT5CdWxrT3V0UGVuZGluZ1swXSA9IEZBTFNFOworCQkJQlVMS19PVVRfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBJcnFGbGFncyk7Ly8gcGV0ZXIgOiBOZGlzQWNxdWlyZVNwaW5Mb2NrID09PiBCVUxLX09VVF9MT0NLCisJCX0KKwkJZWxzZQorCQl7CisJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZW5kIHBhY2tldHMgZGVwZW5kIG9uIGNvdW50ZXJcbiIpKTsKKworCQkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5HZW5lcmljTG9jayk7CisJCQlwQWQtPkNvbnRpbkJ1bGtPdXQgPSBGQUxTRTsKKwkJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+R2VuZXJpY0xvY2spOworCisJCQlCVUxLX09VVF9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBJcnFGbGFncyk7CisJCQlwQWQtPkJ1bGtPdXRQZW5kaW5nWzBdID0gRkFMU0U7CisJCQlCVUxLX09VVF9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIElycUZsYWdzKTsKKwkJfQorCisJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9BVEUpOworCisJCS8vIEtpY2sgYnVsayBvdXQKKwkJUlRVU0JLaWNrQnVsa091dChwQWQpOworCX0KKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiVFhTVE9QIikpIAkJLy9FbnRlciBBVEUgbW9kZSBhbmQgc2V0IFR4L1J4IElkbGUKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURTogVFhTVE9QXG4iKSk7CisKKwkJYXRlbW9kZSA9IHBBZC0+YXRlLk1vZGU7CisJCXBBZC0+YXRlLk1vZGUgJj0gQVRFX1RYU1RPUDsKKwkJcEFkLT5hdGUuYlFBVHhTdGFydCA9IEZBTFNFOworLy8JCXBBZC0+YXRlLlR4RG9uZUNvdW50ID0gcEFkLT5hdGUuVHhDb3VudDsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwkJaWYgKGF0ZW1vZGUgJiBBVEVfVFhDQVJSKQorCQl7CisJCQkvLyBObyBDYXJyaWVyIFRlc3Qgc2V0IEJCUCBSMjIgYml0Nz0wLCBiaXQ2PTAsIGJpdFs1fjBdPTB4MAorCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCAmQmJwRGF0YSk7CisJCQlCYnBEYXRhICY9IDB4RkZGRkZGMDA7IC8vY2xlYXIgYml0NywgYml0NiwgYml0WzV+MF0KKwkJICAgIEFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsIEJicERhdGEpOworCQl9CisJCWVsc2UgaWYgKGF0ZW1vZGUgJiBBVEVfVFhDQVJSU1VQUCkKKwkJeworCQkJLy8gTm8gQ29udC4gVFggc2V0IEJCUCBSMjIgYml0Nz0wCisJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsICZCYnBEYXRhKTsKKwkJCUJicERhdGEgJj0gfigxIDw8IDcpOyAvL3NldCBiaXQ3PTAKKwkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsIEJicERhdGEpOworCisJCQkvLyBObyBDYXJyaWVyIFN1cHByZXNzaW9uIHNldCBCQlAgUjI0IGJpdDA9MAorCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjI0LCAmQmJwRGF0YSk7CisJCQlCYnBEYXRhICY9IDB4RkZGRkZGRkU7IC8vY2xlYXIgYml0MAorCQkgICAgQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyNCwgQmJwRGF0YSk7CisJCX0KKwkJZWxzZSBpZiAoKGF0ZW1vZGUgJiBBVEVfVFhGUkFNRSkgfHwgKGF0ZW1vZGUgPT0gQVRFX1NUT1ApKQorCQl7CisJCQlpZiAoYXRlbW9kZSAmIEFURV9UWENPTlQpCisJCQl7CisJCQkJLy8gTm8gQ29udC4gVFggc2V0IEJCUCBSMjIgYml0Nz0wCisJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCAmQmJwRGF0YSk7CisJCQkJQmJwRGF0YSAmPSB+KDEgPDwgNyk7IC8vc2V0IGJpdDc9MAorCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsIEJicERhdGEpOworCQkJfQorCQl9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisJCVJUVVNCUmVqZWN0UGVuZGluZ1BhY2tldHMocEFkKTsKKwkJUlRVU0JDbGVhblVwRGF0YUJ1bGtPdXRRdWV1ZShwQWQpOworCisJCS8qIG5vdCB1c2VkIGluIFJUMjh4eCAqLworCQkvL1JUVVNCQ2xlYW5VcE1MTUVXYWl0UXVldWUocEFkKTsKKwkJLyogZW1wdHkgZnVuY3Rpb24gc28gZmFyICovCisJCVJUVVNCQ2xlYW5VcE1MTUVCdWxrT3V0UXVldWUocEFkKTsKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisJCS8vIEFib3J0IFR4LCBSWCBETUEuCisJCVJ0bXBEbWFFbmFibGUocEFkLCAwKTsKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKwkJLyogSW4gMjh4eCwgcEFkLT5QZW5kaW5nUnggaXMgbm90IG9mIHR5cGUgYXRvbWljX3QgYW55bW9yZSAqLworLy8JCXdoaWxlICgoYXRvbWljX3JlYWQoJnBBZC0+UGVuZGluZ1J4KSA+IDApKQkvL3BBZC0+QnVsa0ZsYWdzICE9IDAgd2FpdCBidWxrIG91dCBmaW5pc2gKKwkJLyogcGV0ZXIgdG9kbyA6IEJ1bGtJbkxvY2sgKi8KKwkJd2hpbGUgKHBBZC0+UGVuZGluZ1J4ID4gMCkKKwkJeworI2lmIDEKKwkJCUFURV9SVFVTQkNhbmNlbFBlbmRpbmdCdWxrSW5JUlAocEFkKTsKKyNlbHNlCisvLwkJCU5kaXNJbnRlcmxvY2tlZERlY3JlbWVudCgmcEFkLT5QZW5kaW5nUngpOworCQkJcEFkLT5QZW5kaW5nUngtLTsKKyNlbmRpZgorCQkJUlRNUHVzZWNEZWxheSg1MDAwMDApOworCQl9CisKKwkJd2hpbGUgKCgocEFkLT5CdWxrT3V0UGVuZGluZ1swXSA9PSBUUlVFKSB8fAorCQkJCShwQWQtPkJ1bGtPdXRQZW5kaW5nWzFdID09IFRSVUUpIHx8CisJCQkJKHBBZC0+QnVsa091dFBlbmRpbmdbMl0gPT0gVFJVRSkgfHwKKwkJCQkocEFkLT5CdWxrT3V0UGVuZGluZ1szXSA9PSBUUlVFKSkgJiYgKHBBZC0+QnVsa0ZsYWdzICE9IDApKQkvL3BBZC0+QnVsa0ZsYWdzICE9IDAgd2FpdCBidWxrIG91dCBmaW5pc2gKKwkJeworCQkJZG8KKwkJCXsKKwkJCQlSVFVTQkNhbmNlbFBlbmRpbmdCdWxrT3V0SVJQKHBBZCk7CisJCQl9IHdoaWxlIChGQUxTRSk7CisKKwkJCVJUTVB1c2VjRGVsYXkoNTAwMDAwKTsKKwkJfQorCisJCUFTU0VSVChwQWQtPlBlbmRpbmdSeCA9PSAwKTsKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisJCS8vIEVuYWJsZSBUeCwgUnggRE1BLgorCQlSdG1wRG1hRW5hYmxlKHBBZCwgMSk7CisKKwkJLyogdGFzayBUeCBzdGF0dXMgOiAwIC0tPiB0YXNrIGlzIGlkbGUsIDEgLS0+IHRhc2sgaXMgcnVubmluZyAqLworCQlwQWQtPmF0ZS5UeFN0YXR1cyA9IDA7CisKKwkJLy8gU29mdCByZXNldCBCQlAuCisJCUJicFNvZnRSZXNldChwQWQpOworCisJCS8vIERpc2FibGUgVHgKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZNYWNEYXRhKTsKKwkJTWFjRGF0YSAmPSAoMHhmZmZmZmZmYik7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7CisKKwkJLy9DbGVhbiBBVEUgQnVsayBpbi9vdXQgY291bnRlciBhbmQgY29udGludWUgc2V0dXAKKwkJSW50ZXJsb2NrZWRFeGNoYW5nZSgmcEFkLT5CdWxrT3V0UmVtYWluZWQsIDApOworCisJCXBBZC0+Q29udGluQnVsa091dCA9IEZBTFNFOworCX0KKwllbHNlIGlmICghc3RyY21wKGFyZywgIlJYU1RPUCIpKQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFOiBSWFNUT1BcbiIpKTsKKwkJYXRlbW9kZSA9IHBBZC0+YXRlLk1vZGU7CisKKwkJLy8gRGlzYWJsZSBSeAorCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gfigxIDw8IDMpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKworCQlwQWQtPmF0ZS5Nb2RlICY9IEFURV9SWFNUT1A7CisJCXBBZC0+YXRlLmJRQVJ4U3RhcnQgPSBGQUxTRTsKKy8vCQlwQWQtPmF0ZS5UeERvbmVDb3VudCA9IHBBZC0+YXRlLlR4Q291bnQ7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisJCVJUVVNCUmVqZWN0UGVuZGluZ1BhY2tldHMocEFkKTsKKwkJUlRVU0JDbGVhblVwRGF0YUJ1bGtPdXRRdWV1ZShwQWQpOworCisJCS8qIG5vdCB1c2VkIGluIFJUMjh4eCAqLworCQkvL1JUVVNCQ2xlYW5VcE1MTUVXYWl0UXVldWUocEFkKTsKKwkJUlRVU0JDbGVhblVwTUxNRUJ1bGtPdXRRdWV1ZShwQWQpOworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCQkvLyBBYm9ydCBUeCwgUlggRE1BLgorCQlSdG1wRG1hRW5hYmxlKHBBZCwgMCk7CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLy8JCXdoaWxlICgoYXRvbWljX3JlYWQoJnBBZC0+UGVuZGluZ1J4KSA+IDApKQorCQl3aGlsZSAocEFkLT5QZW5kaW5nUnggPiAwKQorCQl7CisjaWYgMQorCQkJQVRFX1JUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUChwQWQpOworI2Vsc2UKKy8vCQkJTmRpc0ludGVybG9ja2VkRGVjcmVtZW50KCZwQWQtPlBlbmRpbmdSeCk7CisJCQlwQWQtPlBlbmRpbmdSeC0tOworI2VuZGlmCisJCQlSVE1QdXNlY0RlbGF5KDUwMDAwMCk7CisJCX0KKworCQl3aGlsZSAoKChwQWQtPkJ1bGtPdXRQZW5kaW5nWzBdID09IFRSVUUpIHx8CisJCQkJKHBBZC0+QnVsa091dFBlbmRpbmdbMV0gPT0gVFJVRSkgfHwKKwkJCQkocEFkLT5CdWxrT3V0UGVuZGluZ1syXSA9PSBUUlVFKSB8fAorCQkJCShwQWQtPkJ1bGtPdXRQZW5kaW5nWzNdID09IFRSVUUpKSAmJiAocEFkLT5CdWxrRmxhZ3MgIT0gMCkpCS8vcEFkLT5CdWxrRmxhZ3MgIT0gMCB3YWl0IGJ1bGsgb3V0IGZpbmlzaAorCQl7CisJCQlkbworCQkJeworCQkJCVJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtPdXRJUlAocEFkKTsKKwkJCX0gd2hpbGUgKEZBTFNFKTsKKworCQkJUlRNUHVzZWNEZWxheSg1MDAwMDApOworCQl9CisKKwkJQVNTRVJUKHBBZC0+UGVuZGluZ1J4ID09IDApOworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCQkvLyBTb2Z0IHJlc2V0IEJCUC4KKwkJQmJwU29mdFJlc2V0KHBBZCk7CisJCXBBZC0+Q29udGluQnVsa0luID0gRkFMU0U7CisJfQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICJSWEZSQU1FIikpIC8vIFJ4IEZyYW1lcworCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFOiBSWEZSQU1FXG4iKSk7CisKKwkJLy8gRGlzYWJsZSBSeCBvZiBNQUMgYmxvY2sKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlICY9IH4oMSA8PCAzKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKwkJLy8gRGVmYXVsdCB2YWx1ZSBpbiBCQlAgUjIyIGlzIDB4MC4KKwkJQmJwRGF0YSA9IDA7CisKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZNYWNEYXRhKTsKKwkJLy8gQ2xlYW4gYml0NCB0byBzdG9wIGNvbnRpbnVvdXMgVHggcHJvZHVjdGlvbiB0ZXN0LgorCQlNYWNEYXRhICY9IDB4RkZGRkZGRUY7CisKKwkgICAJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgTWFjRGF0YSk7CisKKwkJcEFkLT5hdGUuTW9kZSB8PSBBVEVfUlhGUkFNRTsKKworCQkvLyBBYm9ydCBUeCwgUlggRE1BLgorCQlSdG1wRG1hRW5hYmxlKHBBZCwgMCk7CisKKwkJLy8gRGlzYWJsZSBUWCBvZiBNQUMgYmxvY2sKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCVZhbHVlICY9IH4oMSA8PCAyKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisKKyAgICAgICAgLy8gUmVzZXQgUnggUklORy4KKwkJZm9yICggaSA9IDA7IGkgPCAoUlhfUklOR19TSVpFKTsgaSsrKQorCQl7CisJCQlQUlhfQ09OVEVYVCAgcFJ4Q29udGV4dCA9ICYocEFkLT5SeENvbnRleHRbaV0pOworCisJCQlwUnhDb250ZXh0LT5JblVzZSA9IEZBTFNFOworCQkJcFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCQkJcFJ4Q29udGV4dC0+UmVhZGFibGUgPSBGQUxTRTsKKworCQkJLy8KKwkJCS8vIEdldCB0aGUgdXJiIGZyb20ga2VybmVsIGJhY2sgdG8gZHJpdmVyLgorCQkJLy8KKwkJCVJUVVNCX1VOTElOS19VUkIocFJ4Q29udGV4dC0+cFVyYik7CisKKwkJCS8qIFNsZWVwIDIwMCBtaWNyb3NlY3MgdG8gZ2l2ZSBjYW5jZWxsYXRpb24gdGltZSB0byB3b3JrLiAqLworCQkJTmRpc01TbGVlcCgyMDApOworCQkJcEFkLT5CdWxrSW5SZXEgPSAwOworCisvLwkJCUludGVybG9ja2VkRXhjaGFuZ2UoJnBBZC0+UGVuZGluZ1J4LCAwKTsKKwkJCXBBZC0+UGVuZGluZ1J4ID0gMDsKKwkJCXBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4ID0gMDsJLy8gTmV4dCBSeCBSZWFkIGluZGV4CisJCQlwQWQtPk5leHRSeEJ1bGtJbkluZGV4CQk9IFJYX1JJTkdfU0laRSAtIDE7CS8vIFJ4IEJ1bGsgcG9pbnRlcgorCQkJcEFkLT5OZXh0UnhCdWxrSW5Qb3NpdGlvbiA9IDA7CisJCX0KKworCQkvLyByZWFkIHRvIGNsZWFyIGNvdW50ZXJzCisJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgUlhfU1RBX0NOVDAsICZ0ZW1wKTsgLy9SWCBQSFkgJiBSWCBDUkMgY291bnQKKwkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBSWF9TVEFfQ05UMSwgJnRlbXApOyAvL1JYIFBMQ1AgZXJyb3IgY291bnQgJiBDQ0EgZmFsc2UgYWxhcm0gY291bnQKKwkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBSWF9TVEFfQ05UMiwgJnRlbXApOyAvL1JYIEZJRk8gb3ZlcmZsb3cgZnJhbWUgY291bnQgJiBSWCBkdXBsaWNhdGVkIGZpbHRlcmVkIGZyYW1lIGNvdW50CisKKwkJcEFkLT5Db250aW5CdWxrSW4gPSBUUlVFOworCisJCS8vIEVuYWJsZSBUeCwgUlggRE1BLgorCQlSdG1wRG1hRW5hYmxlKHBBZCwgMSk7CisKKwkJLy8gRW5hYmxlIFJYIG9mIE1BQyBibG9jaworCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJVmFsdWUgfD0gKDEgPDwgMyk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCisJCS8vIEtpY2sgYnVsayBpbgorCQlSVFVTQkJ1bGtSZWNlaXZlKHBBZCk7CisJfQorCWVsc2UKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURTogSW52YWxpZCBhcmchXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJUlRNUHVzZWNEZWxheSg1MDAwKTsKKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gQVRFQ21kSGFuZGxlcigpXG4iKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworSU5UCVNldF9BVEVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJaWYgKEFURUNtZEhhbmRsZXIocEFkLCBhcmcpKQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1Byb2MgU3VjY2Vzc1xuIikpOworCisKKwkJcmV0dXJuIFRSVUU7CisJfQorCWVsc2UKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9Qcm9jIEZhaWxlZFxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgQUREUjE9REEgZm9yIFR4RnJhbWUoQVAgIDogVG8gRFMgPSAwIDsgRnJvbSBEUyA9IDEpCisgICAgICAgIG9yCisgICAgICAgIFNldCBBVEUgQUREUjM9REEgZm9yIFR4RnJhbWUoU1RBIDogVG8gRFMgPSAxIDsgRnJvbSBEUyA9IDApCisKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQVRFX0RBX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCUNIQVIJCQkJKnZhbHVlOworCUlOVAkJCQkJaTsKKworCWlmKHN0cmxlbihhcmcpICE9IDE3KSAgLy9NYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcKKwkJcmV0dXJuIEZBTFNFOworCisgICAgZm9yIChpPTAsIHZhbHVlID0gcnN0cnRvayhhcmcsICI6Iik7IHZhbHVlOyB2YWx1ZSA9IHJzdHJ0b2soTlVMTCwgIjoiKSkKKwl7CisJCWlmKChzdHJsZW4odmFsdWUpICE9IDIpIHx8ICghaXN4ZGlnaXQoKnZhbHVlKSkgfHwgKCFpc3hkaWdpdCgqKHZhbHVlKzEpKSkgKQorCQkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlBdG9IKHZhbHVlLCAmcEFkLT5hdGUuQWRkcjNbaSsrXSwgMSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfQorCisJaWYoaSAhPSA2KQorCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9EQV9Qcm9jIChEQSA9ICUyWDolMlg6JTJYOiUyWDolMlg6JTJYKVxuIiwgcEFkLT5hdGUuQWRkcjNbMF0sCisJCXBBZC0+YXRlLkFkZHIzWzFdLCBwQWQtPmF0ZS5BZGRyM1syXSwgcEFkLT5hdGUuQWRkcjNbM10sIHBBZC0+YXRlLkFkZHIzWzRdLCBwQWQtPmF0ZS5BZGRyM1s1XSkpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX0RBX1Byb2MgU3VjY2Vzc1xuIikpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBBRERSMz1TQSBmb3IgVHhGcmFtZShBUCAgOiBUbyBEUyA9IDAgOyBGcm9tIERTID0gMSkKKyAgICAgICAgb3IKKyAgICAgICAgU2V0IEFURSBBRERSMj1TQSBmb3IgVHhGcmFtZShTVEEgOiBUbyBEUyA9IDEgOyBGcm9tIERTID0gMCkKKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfU0FfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJQ0hBUgkJCQkqdmFsdWU7CisJSU5UCQkJCQlpOworCisJaWYoc3RybGVuKGFyZykgIT0gMTcpICAvL01hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNworCQlyZXR1cm4gRkFMU0U7CisKKyAgICBmb3IgKGk9MCwgdmFsdWUgPSByc3RydG9rKGFyZywgIjoiKTsgdmFsdWU7IHZhbHVlID0gcnN0cnRvayhOVUxMLCAiOiIpKQorCXsKKwkJaWYoKHN0cmxlbih2YWx1ZSkgIT0gMikgfHwgKCFpc3hkaWdpdCgqdmFsdWUpKSB8fCAoIWlzeGRpZ2l0KCoodmFsdWUrMSkpKSApCisJCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCUF0b0godmFsdWUsICZwQWQtPmF0ZS5BZGRyMltpKytdLCAxKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl9CisKKwlpZihpICE9IDYpCisJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZAorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1NBX1Byb2MgKFNBID0gJTJYOiUyWDolMlg6JTJYOiUyWDolMlgpXG4iLCBwQWQtPmF0ZS5BZGRyMlswXSwKKwkJcEFkLT5hdGUuQWRkcjJbMV0sIHBBZC0+YXRlLkFkZHIyWzJdLCBwQWQtPmF0ZS5BZGRyMlszXSwgcEFkLT5hdGUuQWRkcjJbNF0sIHBBZC0+YXRlLkFkZHIyWzVdKSk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfU0FfUHJvYyBTdWNjZXNzXG4iKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIEFERFIyPUJTU0lEIGZvciBUeEZyYW1lKEFQICA6IFRvIERTID0gMCA7IEZyb20gRFMgPSAxKQorICAgICAgICBvcgorICAgICAgICBTZXQgQVRFIEFERFIxPUJTU0lEIGZvciBUeEZyYW1lKFNUQSA6IFRvIERTID0gMSA7IEZyb20gRFMgPSAwKQorCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9CU1NJRF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlDSEFSCQkJCSp2YWx1ZTsKKwlJTlQJCQkJCWk7CisKKwlpZihzdHJsZW4oYXJnKSAhPSAxNykgIC8vTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgMDE6MDI6MDM6MDQ6MDU6MDYgbGVuZ3RoIDE3CisJCXJldHVybiBGQUxTRTsKKworICAgIGZvciAoaT0wLCB2YWx1ZSA9IHJzdHJ0b2soYXJnLCAiOiIpOyB2YWx1ZTsgdmFsdWUgPSByc3RydG9rKE5VTEwsICI6IikpCisJeworCQlpZigoc3RybGVuKHZhbHVlKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCp2YWx1ZSkpIHx8ICghaXN4ZGlnaXQoKih2YWx1ZSsxKSkpICkKKwkJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZAorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJQXRvSCh2YWx1ZSwgJnBBZC0+YXRlLkFkZHIxW2krK10sIDEpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KKworCWlmKGkgIT0gNikKKwkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfQlNTSURfUHJvYyAoQlNTSUQgPSAlMlg6JTJYOiUyWDolMlg6JTJYOiUyWClcbiIsCXBBZC0+YXRlLkFkZHIxWzBdLAorCQlwQWQtPmF0ZS5BZGRyMVsxXSwgcEFkLT5hdGUuQWRkcjFbMl0sIHBBZC0+YXRlLkFkZHIxWzNdLCBwQWQtPmF0ZS5BZGRyMVs0XSwgcEFkLT5hdGUuQWRkcjFbNV0pKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9CU1NJRF9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgVHggQ2hhbm5lbAorCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9DSEFOTkVMX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVDSEFSIGNoYW5uZWw7CisKKwljaGFubmVsID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmICgoY2hhbm5lbCA8IDEpIHx8IChjaGFubmVsID4gMjE2KSkvLyB0byBhbGxvdyBBIGJhbmQgY2hhbm5lbCA6ICgoY2hhbm5lbCA8IDEpIHx8IChjaGFubmVsID4gMTQpKQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9DSEFOTkVMX1Byb2M6Ok91dCBvZiByYW5nZSwgaXQgc2hvdWxkIGJlIGluIHJhbmdlIG9mIDF+MTQuXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJcEFkLT5hdGUuQ2hhbm5lbCA9IGNoYW5uZWw7CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX0NIQU5ORUxfUHJvYyAoQVRFIENoYW5uZWwgPSAlZClcbiIsIHBBZC0+YXRlLkNoYW5uZWwpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfQ0hBTk5FTF9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBUeCBQb3dlcjAKKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfVFhfUE9XRVIwX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCUNIQVIgVHhQb3dlcjsKKworCVR4UG93ZXIgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKHBBZC0+YXRlLkNoYW5uZWwgPD0gMTQpCisJeworCQlpZiAoKFR4UG93ZXIgPiAzMSkgfHwgKFR4UG93ZXIgPCAwKSkKKwkJeworCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9UWF9QT1dFUjBfUHJvYzo6T3V0IG9mIHJhbmdlIChWYWx1ZT0lZClcbiIsIFR4UG93ZXIpKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCX0KKwllbHNlLy8gNS41R0h6CisJeworCQlpZiAoKFR4UG93ZXIgPiAxNSkgfHwgKFR4UG93ZXIgPCAtNykpCisJCXsKKwkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfUE9XRVIwX1Byb2M6Ok91dCBvZiByYW5nZSAoVmFsdWU9JWQpXG4iLCBUeFBvd2VyKSk7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwl9CisKKwlwQWQtPmF0ZS5UeFBvd2VyMCA9IFR4UG93ZXI7CisJQVRFVHhQd3JIYW5kbGVyKHBBZCwgMCk7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1RYX1BPV0VSMF9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBUeCBQb3dlcjEKKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfVFhfUE9XRVIxX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCUNIQVIgVHhQb3dlcjsKKworCVR4UG93ZXIgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKHBBZC0+YXRlLkNoYW5uZWwgPD0gMTQpCisJeworCWlmICgoVHhQb3dlciA+IDMxKSB8fCAoVHhQb3dlciA8IDApKQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9UWF9QT1dFUjFfUHJvYzo6T3V0IG9mIHJhbmdlIChWYWx1ZT0lZClcbiIsIFR4UG93ZXIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwl9CisJZWxzZQorCXsKKwkJaWYgKChUeFBvd2VyID4gMTUpIHx8IChUeFBvd2VyIDwgLTcpKQorCQl7CisJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX1BPV0VSMV9Qcm9jOjpPdXQgb2YgcmFuZ2UgKFZhbHVlPSVkKVxuIiwgVHhQb3dlcikpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJfQorCisJcEFkLT5hdGUuVHhQb3dlcjEgPSBUeFBvd2VyOworCUFURVR4UHdySGFuZGxlcihwQWQsIDEpOworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9UWF9QT1dFUjFfUHJvYyBTdWNjZXNzXG4iKSk7CisKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgVHggQW50ZW5uYQorCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9UWF9BbnRlbm5hX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCUNIQVIgdmFsdWU7CisKKwl2YWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoKHZhbHVlID4gMikgfHwgKHZhbHVlIDwgMCkpCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX0FudGVubmFfUHJvYzo6T3V0IG9mIHJhbmdlIChWYWx1ZT0lZClcbiIsIHZhbHVlKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlwQWQtPmF0ZS5UeEFudGVubmFTZWwgPSB2YWx1ZTsKKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfVFhfQW50ZW5uYV9Qcm9jIChBbnRlbm5hID0gJWQpXG4iLCBwQWQtPmF0ZS5UeEFudGVubmFTZWwpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJhbGluazogU2V0X0FURV9UWF9BbnRlbm5hX1Byb2MgU3VjY2Vzc1xuIikpOworCisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIFJ4IEFudGVubmEKKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfUlhfQW50ZW5uYV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlDSEFSIHZhbHVlOworCisJdmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKCh2YWx1ZSA+IDMpIHx8ICh2YWx1ZSA8IDApKQorCXsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9SWF9BbnRlbm5hX1Byb2M6Ok91dCBvZiByYW5nZSAoVmFsdWU9JWQpXG4iLCB2YWx1ZSkpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJcEFkLT5hdGUuUnhBbnRlbm5hU2VsID0gdmFsdWU7CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1JYX0FudGVubmFfUHJvYyAoQW50ZW5uYSA9ICVkKVxuIiwgcEFkLT5hdGUuUnhBbnRlbm5hU2VsKSk7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1JYX0FudGVubmFfUHJvYyBTdWNjZXNzXG4iKSk7CisKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgUkYgZnJlcXVlbmNlIG9mZnNldAorCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9UWF9GUkVRT0ZGU0VUX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVDSEFSIFJGRnJlcU9mZnNldDsKKwlVTE9ORyBSNDsKKworCVJGRnJlcU9mZnNldCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZihSRkZyZXFPZmZzZXQgPj0gNjQpCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX0ZSRVFPRkZTRVRfUHJvYzo6T3V0IG9mIHJhbmdlLCBpdCBzaG91bGQgYmUgaW4gcmFuZ2Ugb2YgMH42My5cbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXBBZC0+YXRlLlJGRnJlcU9mZnNldCA9IFJGRnJlcU9mZnNldDsKKwlSNCA9IHBBZC0+YXRlLlJGRnJlcU9mZnNldCA8PCAxNTsJCS8vIHNoaWZ0IFRYIHBvd2VyIGNvbnRyb2wgdG8gY29ycmVjdCBSRiByZWdpc3RlciBiaXQgcG9zaXRpb24KKwlSNCB8PSAocEFkLT5MYXRjaFJmUmVncy5SNCAmICgofjB4MDAxZjgwMDApKSk7CisJcEFkLT5MYXRjaFJmUmVncy5SNCA9IFI0OworCisJUnRtcFJmSW9Xcml0ZShwQWQpOworCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9UWF9GUkVRT0ZGU0VUX1Byb2MgKFJGRnJlcU9mZnNldCA9ICVkKVxuIiwgcEFkLT5hdGUuUkZGcmVxT2Zmc2V0KSk7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1RYX0ZSRVFPRkZTRVRfUHJvYyBTdWNjZXNzXG4iKSk7CisKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgUkYgQlcKKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfVFhfQldfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJaW50IGk7CisJVUNIQVIgdmFsdWUgPSAwOworCVVDSEFSIEJCUEN1cnJlbnRCVzsKKworCUJCUEN1cnJlbnRCVyA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZihCQlBDdXJyZW50QlcgPT0gMCkKKwkJcEFkLT5hdGUuVHhXSS5CVyA9IEJXXzIwOworCWVsc2UKKwkJcEFkLT5hdGUuVHhXSS5CVyA9IEJXXzQwOworCisJaWYocEFkLT5hdGUuVHhXSS5CVyA9PSBCV18yMCkKKwl7CisJCWlmKHBBZC0+YXRlLkNoYW5uZWwgPD0gMTQpCisJCXsKKyAJCWZvciAoaT0wOyBpPDU7IGkrKykKKyAJCXsKKwkJCQlpZiAocEFkLT5UeDIwTVB3ckNmZ0dCYW5kW2ldICE9IDB4ZmZmZmZmZmYpCisJCQkJeworCQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QV1JfQ0ZHXzAgKyBpKjQsIHBBZC0+VHgyME1Qd3JDZmdHQmFuZFtpXSk7CisJCQkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJZm9yIChpPTA7IGk8NTsgaSsrKQorCQkJeworCQkJCWlmIChwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbaV0gIT0gMHhmZmZmZmZmZikKKyAJCQl7CisJCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BXUl9DRkdfMCArIGkqNCwgcEFkLT5UeDIwTVB3ckNmZ0FCYW5kW2ldKTsKKyAJCQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKKyAJCQl9CisgCQl9CisJCX0KKworCQkvL1NldCBCQlAgUjQgYml0WzQ6M109MDowCisgCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJnZhbHVlKTsKKyAJCXZhbHVlICY9ICh+MHgxOCk7CisgCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIHZhbHVlKTsKKworICAJCS8vU2V0IEJCUCBSNjY9MHgzQworIAkJdmFsdWUgPSAweDNDOworIAkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgdmFsdWUpOworCQkvL1NldCBCQlAgUjY4PTB4MEIKKwkJLy90byBpbXByb3ZlIFJ4IHNlbnNpdGl2aXR5LgorCQl2YWx1ZSA9IDB4MEI7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjgsIHZhbHVlKTsKKwkJLy9TZXQgQkJQIFI2OT0weDE2CisJCXZhbHVlID0gMHgxNjsKKyAJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIHZhbHVlKTsKKwkJLy9TZXQgQkJQIFI3MD0weDA4CisJCXZhbHVlID0gMHgwODsKKyAJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsIHZhbHVlKTsKKwkJLy9TZXQgQkJQIFI3Mz0weDExCisJCXZhbHVlID0gMHgxMTsKKyAJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzMsIHZhbHVlKTsKKworCSAgICAvLyBJZiBDaGFubmVsPTE0LCBCYW5kd2lkdGg9MjBNIGFuZCBNb2RlPUNDSywgU2V0IEJCUCBSNCBiaXQ1PTEKKwkgICAgLy8gKEphcGFuIGZpbHRlciBjb2VmZmljaWVudHMpCisJICAgIC8vIFRoaXMgc2VnbWVudCBvZiBjb2RlIHdpbGwgb25seSB3b3JrcyB3aGVuIEFURVRYTU9ERSBhbmQgQVRFQ0hBTk5FTAorCSAgICAvLyB3ZXJlIHNldCB0byBNT0RFX0NDSyBhbmQgMTQgcmVzcGVjdGl2ZWx5IGJlZm9yZSBBVEVUWEJXIGlzIHNldCB0byAwLgorCSAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQlpZiAocEFkLT5hdGUuQ2hhbm5lbCA9PSAxNCkKKwkJeworCQkJaW50IFR4TW9kZSA9IHBBZC0+YXRlLlR4V0kuUEhZTU9ERTsKKwkJCWlmIChUeE1vZGUgPT0gTU9ERV9DQ0spCisJCQl7CisJCQkJLy8gd2hlbiBDaGFubmVsPT0xNCAmJiBNb2RlPT1DQ0sgJiYgQmFuZFdpZHRoPT0yME0sIEJCUCBSNCBiaXQ1PTEKKyAJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZ2YWx1ZSk7CisJCQkJdmFsdWUgfD0gMHgyMDsgLy9zZXQgYml0NT0xCisgCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgdmFsdWUpOworCQkJfQorCQl9CisKKwkgICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gSWYgYmFuZHdpZHRoICE9IDQwTSwgUkYgUmVnNCBiaXQgMjEgPSAwLgorCQlwQWQtPkxhdGNoUmZSZWdzLlI0ICY9IH4weDAwMjAwMDAwOworCQlSdG1wUmZJb1dyaXRlKHBBZCk7CisJfQorCWVsc2UgaWYocEFkLT5hdGUuVHhXSS5CVyA9PSBCV180MCkKKwl7CisJCWlmKHBBZC0+YXRlLkNoYW5uZWwgPD0gMTQpCisJCXsKKwkJCWZvciAoaT0wOyBpPDU7IGkrKykKKwkJCXsKKwkJCQlpZiAocEFkLT5UeDQwTVB3ckNmZ0dCYW5kW2ldICE9IDB4ZmZmZmZmZmYpCisJCQkJeworCQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QV1JfQ0ZHXzAgKyBpKjQsIHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFtpXSk7CisJCQkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJZm9yIChpPTA7IGk8NTsgaSsrKQorCQkJeworCQkJCWlmIChwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbaV0gIT0gMHhmZmZmZmZmZikKKwkJCQl7CisJCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BXUl9DRkdfMCArIGkqNCwgcEFkLT5UeDQwTVB3ckNmZ0FCYW5kW2ldKTsKKwkJCQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKKwkJCQl9CisJCQl9CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlpZiAoKHBBZC0+YXRlLlR4V0kuUEhZTU9ERSA+PSBNT0RFX0hUTUlYKSAmJiAocEFkLT5hdGUuVHhXSS5NQ1MgPT0gNykpCisJCQl7CisgICAgCQkJdmFsdWUgPSAweDI4OworICAgIAkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjcsIHZhbHVlKTsKKwkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJfQorCisJCS8vU2V0IEJCUCBSNCBiaXRbNDozXT0xOjAKKwkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZ2YWx1ZSk7CisJCXZhbHVlICY9ICh+MHgxOCk7CisJCXZhbHVlIHw9IDB4MTA7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgdmFsdWUpOworCisJCS8vU2V0IEJCUCBSNjY9MHgzQworCQl2YWx1ZSA9IDB4M0M7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIHZhbHVlKTsKKwkJLy9TZXQgQkJQIFI2OD0weDBDCisJCS8vdG8gaW1wcm92ZSBSeCBzZW5zaXRpdml0eS4KKwkJdmFsdWUgPSAweDBDOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY4LCB2YWx1ZSk7CisJCS8vU2V0IEJCUCBSNjk9MHgxQQorCQl2YWx1ZSA9IDB4MUE7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIHZhbHVlKTsKKwkJLy9TZXQgQkJQIFI3MD0weDBBCisJCXZhbHVlID0gMHgwQTsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgdmFsdWUpOworCQkvL1NldCBCQlAgUjczPTB4MTYKKwkJdmFsdWUgPSAweDE2OworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjczLCB2YWx1ZSk7CisKKwkJLy8gSWYgYmFuZHdpZHRoID0gNDBNLCBzZXQgUkYgUmVnNCBiaXQgMjEgPSAxLgorCQlwQWQtPkxhdGNoUmZSZWdzLlI0IHw9IDB4MDAyMDAwMDA7CisJCVJ0bXBSZklvV3JpdGUocEFkKTsKKwl9CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1RYX0JXX1Byb2MgKEJCUEN1cnJlbnRCVyA9ICVkKVxuIiwgcEFkLT5hdGUuVHhXSS5CVykpOworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9UWF9CV19Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBUeCBmcmFtZSBsZW5ndGgKKworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfVFhfTEVOR1RIX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCXBBZC0+YXRlLlR4TGVuZ3RoID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmKChwQWQtPmF0ZS5UeExlbmd0aCA8IDI0KSB8fCAocEFkLT5hdGUuVHhMZW5ndGggPiAoTUFYX0ZSQU1FX1NJWkUgLSAzNC8qID09IDIzMTIgKi8pKSkKKwl7CisJCXBBZC0+YXRlLlR4TGVuZ3RoID0gKE1BWF9GUkFNRV9TSVpFIC0gMzQvKiA9PSAyMzEyICovKTsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9UWF9MRU5HVEhfUHJvYzo6T3V0IG9mIHJhbmdlLCBpdCBzaG91bGQgYmUgaW4gcmFuZ2Ugb2YgMjR+JWQuXG4iLCAoTUFYX0ZSQU1FX1NJWkUgLSAzNC8qID09IDIzMTIgKi8pKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1RYX0xFTkdUSF9Qcm9jIChUeExlbmd0aCA9ICVkKVxuIiwgcEFkLT5hdGUuVHhMZW5ndGgpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfVFhfTEVOR1RIX1Byb2MgU3VjY2Vzc1xuIikpOworCisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIFR4IGZyYW1lIGNvdW50CisKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQVRFX1RYX0NPVU5UX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCXBBZC0+YXRlLlR4Q291bnQgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9UWF9DT1VOVF9Qcm9jIChUeENvdW50ID0gJWQpXG4iLCBwQWQtPmF0ZS5UeENvdW50KSk7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1RYX0NPVU5UX1Byb2MgU3VjY2Vzc1xuIikpOworCisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQVRFIFR4IGZyYW1lIE1DUworCisgICAgICAgIFJldHVybjoKKyAgICAgICAgCVRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfQVRFX1RYX01DU19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVQ0hBUiBNQ1M7CisJaW50IHJlc3VsdDsKKworCU1DUyA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisJcmVzdWx0ID0gQ2hlY2tNQ1NWYWxpZChwQWQtPmF0ZS5UeFdJLlBIWU1PREUsIE1DUyk7CisKKwlpZiAocmVzdWx0ICE9IC0xKQorCXsKKwkJcEFkLT5hdGUuVHhXSS5NQ1MgPSAoVUNIQVIpTUNTOworCX0KKwllbHNlCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX01DU19Qcm9jOjpPdXQgb2YgcmFuZ2UsIHJlZmVyIHRvIHJhdGUgdGFibGUuXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1RYX01DU19Qcm9jIChNQ1MgPSAlZClcbiIsIHBBZC0+YXRlLlR4V0kuTUNTKSk7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1RYX01DU19Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEFURSBUeCBmcmFtZSBNb2RlCisgICAgICAgIDA6IE1PREVfQ0NLCisgICAgICAgIDE6IE1PREVfT0ZETQorICAgICAgICAyOiBNT0RFX0hUTUlYCisgICAgICAgIDM6IE1PREVfSFRHUkVFTkZJRUxECisKKyAgICAgICAgUmV0dXJuOgorICAgICAgICAJVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9BVEVfVFhfTU9ERV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlwQWQtPmF0ZS5UeFdJLlBIWU1PREUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYocEFkLT5hdGUuVHhXSS5QSFlNT0RFID4gMykKKwl7CisJCXBBZC0+YXRlLlR4V0kuUEhZTU9ERSA9IDA7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfTU9ERV9Qcm9jOjpPdXQgb2YgcmFuZ2UuIGl0IHNob3VsZCBiZSBpbiByYW5nZSBvZiAwfjNcbiIpKTsKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiMDogQ0NLLCAxOiBPRkRNLCAyOiBIVF9NSVgsIDM6IEhUX0dSRUVOX0ZJRUxELlxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9UWF9NT0RFX1Byb2MgKFR4TW9kZSA9ICVkKVxuIiwgcEFkLT5hdGUuVHhXSS5QSFlNT0RFKSk7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1RYX01PREVfUHJvYyBTdWNjZXNzXG4iKSk7CisKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBVEUgVHggZnJhbWUgR0kKKworICAgICAgICBSZXR1cm46CisgICAgICAgIAlUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X0FURV9UWF9HSV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlwQWQtPmF0ZS5UeFdJLlNob3J0R0kgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYocEFkLT5hdGUuVHhXSS5TaG9ydEdJID4gMSkKKwl7CisJCXBBZC0+YXRlLlR4V0kuU2hvcnRHSSA9IDA7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfR0lfUHJvYzo6T3V0IG9mIHJhbmdlXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1RYX0dJX1Byb2MgKEdJID0gJWQpXG4iLCBwQWQtPmF0ZS5UeFdJLlNob3J0R0kpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfVFhfR0lfUHJvYyBTdWNjZXNzXG4iKSk7CisKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworSU5UCVNldF9BVEVfUlhfRkVSX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCXBBZC0+YXRlLmJSeEZlciA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAocEFkLT5hdGUuYlJ4RmVyID09IDEpCisJeworCQlwQWQtPmF0ZS5SeENudFBlclNlYyA9IDA7CisJCXBBZC0+YXRlLlJ4VG90YWxDbnQgPSAwOworCX0KKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfUlhfRkVSX1Byb2MgKGJSeEZlciA9ICVkKVxuIiwgcEFkLT5hdGUuYlJ4RmVyKSk7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1JYX0ZFUl9Qcm9jIFN1Y2Nlc3NcbiIpKTsKKworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVCBTZXRfQVRFX1JlYWRfUkZfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJYXRlX3ByaW50KEtFUk5fRU1FUkcgIlIxID0gJWx4XG4iLCBwQWQtPkxhdGNoUmZSZWdzLlIxKTsKKwlhdGVfcHJpbnQoS0VSTl9FTUVSRyAiUjIgPSAlbHhcbiIsIHBBZC0+TGF0Y2hSZlJlZ3MuUjIpOworCWF0ZV9wcmludChLRVJOX0VNRVJHICJSMyA9ICVseFxuIiwgcEFkLT5MYXRjaFJmUmVncy5SMyk7CisJYXRlX3ByaW50KEtFUk5fRU1FUkcgIlI0ID0gJWx4XG4iLCBwQWQtPkxhdGNoUmZSZWdzLlI0KTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQgU2V0X0FURV9Xcml0ZV9SRjFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUlOVDMyIHZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDE2KTsKKworCXBBZC0+TGF0Y2hSZlJlZ3MuUjEgPSB2YWx1ZTsKKwlSdG1wUmZJb1dyaXRlKHBBZCk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UIFNldF9BVEVfV3JpdGVfUkYyX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVJTlQzMiB2YWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxNik7CisKKwlwQWQtPkxhdGNoUmZSZWdzLlIyID0gdmFsdWU7CisJUnRtcFJmSW9Xcml0ZShwQWQpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVCBTZXRfQVRFX1dyaXRlX1JGM19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVSU5UMzIgdmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTYpOworCisJcEFkLT5MYXRjaFJmUmVncy5SMyA9IHZhbHVlOworCVJ0bXBSZklvV3JpdGUocEFkKTsKKworCXJldHVybiBUUlVFOworfQorCitJTlQgU2V0X0FURV9Xcml0ZV9SRjRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVUlOVDMyIHZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDE2KTsKKworCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgPSB2YWx1ZTsKKwlSdG1wUmZJb1dyaXRlKHBBZCk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBMb2FkIGFuZCBXcml0ZSBFRVBST00gZnJvbSBhIGJpbmFyeSBmaWxlIHByZXBhcmVkIGluIGFkdmFuY2UuCisKKyAgICAgICAgUmV0dXJuOgorICAgICAgICAJVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworI2lmbmRlZiBVQ09TCitJTlQgU2V0X0FURV9Mb2FkX0UyUF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlCT09MRUFOCQkgICAgcmV0ID0gRkFMU0U7CisJUFVDSEFSCQkJc3JjID0gRUVQUk9NX0JJTl9GSUxFX05BTUU7CisJc3RydWN0IGZpbGUJCSpzcmNmOworCUlOVDMyIAkJCXJldHZhbCwgb3JnZnN1aWQsIG9yZ2ZzZ2lkOworICAgCW1tX3NlZ21lbnRfdAlvcmdmczsKKwlVU0hPUlQgCQkJV3JpdGVFRVBST01bKEVFUFJPTV9TSVpFLzIpXTsKKwlVSU5UMzIJCQlGaWxlTGVuZ3RoID0gMDsKKwlVSU5UMzIgCQkJdmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiPT09PiAlcyAodmFsdWU9JWQpXG5cbiIsIF9fZnVuY19fLCB2YWx1ZSkpOworCisJaWYgKHZhbHVlID4gMCkKKwl7CisJCS8qIHplcm8gdGhlIGUycCBidWZmZXIgKi8KKwkJTmRpc1plcm9NZW1vcnkoKFBVQ0hBUilXcml0ZUVFUFJPTSwgRUVQUk9NX1NJWkUpOworCisJCS8qIHNhdmUgdWlkIGFuZCBnaWQgdXNlZCBmb3IgZmlsZXN5c3RlbSBhY2Nlc3MuCisJICAgICoqIHNldCB1c2VyIGFuZCBncm91cCB0byAwIChyb290KQorCSAgICAqLworCQlvcmdmc3VpZCA9IGN1cnJlbnQtPmZzdWlkOworCQlvcmdmc2dpZCA9IGN1cnJlbnQtPmZzZ2lkOworCQkvKiBhcyByb290ICovCisJCWN1cnJlbnQtPmZzdWlkID0gY3VycmVudC0+ZnNnaWQgPSAwOworICAgIAlvcmdmcyA9IGdldF9mcygpOworICAgIAlzZXRfZnMoS0VSTkVMX0RTKTsKKworCQlkbworCQl7CisJCQkvKiBvcGVuIHRoZSBiaW4gZmlsZSAqLworCQkJc3JjZiA9IGZpbHBfb3BlbihzcmMsIE9fUkRPTkxZLCAwKTsKKworCQkJaWYgKElTX0VSUihzcmNmKSkKKwkJCXsKKwkJCQlhdGVfcHJpbnQoIiVzIC0gRXJyb3IgJWxkIG9wZW5pbmcgJXNcbiIsIF9fZnVuY19fLCAtUFRSX0VSUihzcmNmKSwgc3JjKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogdGhlIG9iamVjdCBtdXN0IGhhdmUgYSByZWFkIG1ldGhvZCAqLworCQkJaWYgKChzcmNmLT5mX29wID09IE5VTEwpIHx8IChzcmNmLT5mX29wLT5yZWFkID09IE5VTEwpKQorCQkJeworCQkJCWF0ZV9wcmludCgiJXMgLSAlcyBkb2VzIG5vdCBoYXZlIGEgcmVhZCBtZXRob2RcbiIsIF9fZnVuY19fLCBzcmMpOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiByZWFkIHRoZSBmaXJtd2FyZSBmcm9tIHRoZSBmaWxlICouYmluICovCisJCQlGaWxlTGVuZ3RoID0gc3JjZi0+Zl9vcC0+cmVhZChzcmNmLAorCQkJCQkJCQkJCSAgKFBVQ0hBUilXcml0ZUVFUFJPTSwKKwkJCQkJCQkJCQkgIEVFUFJPTV9TSVpFLAorCQkJCQkJCQkJCSAgJnNyY2YtPmZfcG9zKTsKKworCQkJaWYgKEZpbGVMZW5ndGggIT0gRUVQUk9NX1NJWkUpCisJCQl7CisJCQkJYXRlX3ByaW50KCIlczogZXJyb3IgZmlsZSBsZW5ndGggKD0lZCkgaW4gZTJwLmJpblxuIiwKKwkJCQkJICAgX19mdW5jX18sIEZpbGVMZW5ndGgpOworCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8qIHdyaXRlIHRoZSBjb250ZW50IG9mIC5iaW4gZmlsZSB0byBFRVBST00gKi8KKwkJCQlydF9lZV93cml0ZV9hbGwocEFkLCBXcml0ZUVFUFJPTSk7CisJCQkJcmV0ID0gVFJVRTsKKwkJCX0KKwkJCWJyZWFrOworCQl9IHdoaWxlKFRSVUUpOworCisJCS8qIGNsb3NlIGZpcm13YXJlIGZpbGUgKi8KKwkJaWYgKElTX0VSUihzcmNmKSkKKwkJeworCQkJCTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHZhbCA9IGZpbHBfY2xvc2Uoc3JjZiwgTlVMTCk7CisJCQlpZiAocmV0dmFsKQorCQkJeworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIi0tPiBFcnJvciAlZCBjbG9zaW5nICVzXG4iLCAtcmV0dmFsLCBzcmMpKTsKKworCQkJfQorCQl9CisKKwkJLyogcmVzdG9yZSAqLworCQlzZXRfZnMob3JnZnMpOworCQljdXJyZW50LT5mc3VpZCA9IG9yZ2ZzdWlkOworCQljdXJyZW50LT5mc2dpZCA9IG9yZ2ZzZ2lkOworCX0KKyAgICBBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCI8PT09ICVzIChyZXQ9JWQpXG4iLCBfX2Z1bmNfXywgcmV0KSk7CisKKyAgICByZXR1cm4gcmV0OworCit9CisjZWxzZQorSU5UIFNldF9BVEVfTG9hZF9FMlBfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVVNIT1JUIAkJCVdyaXRlRUVQUk9NWyhFRVBST01fU0laRS8yKV07CisJc3RydWN0IGl3cmVxCSp3cnEgPSAoc3RydWN0IGl3cmVxICopYXJnOworCisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiAlcyAod3JxLT51LmRhdGEubGVuZ3RoID0gJWQpXG5cbiIsIF9fZnVuY19fLCB3cnEtPnUuZGF0YS5sZW5ndGgpKTsKKworCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gRUVQUk9NX1NJWkUpCisJeworCQlhdGVfcHJpbnQoIiVzOiBlcnJvciBsZW5ndGggKD0lZCkgZnJvbSBob3N0XG4iLAorCQkJICAgX19mdW5jX18sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJZWxzZS8qICh3cnEtPnUuZGF0YS5sZW5ndGggPT0gRUVQUk9NX1NJWkUpICovCisJeworCQkvKiB6ZXJvIHRoZSBlMnAgYnVmZmVyICovCisJCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpV3JpdGVFRVBST00sIEVFUFJPTV9TSVpFKTsKKworCQkvKiBmaWxsIHRoZSBsb2NhbCBidWZmZXIgKi8KKwkJTmRpc01vdmVNZW1vcnkoKFBVQ0hBUilXcml0ZUVFUFJPTSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCQlkbworCQl7CisJCQkJLyogd3JpdGUgdGhlIGNvbnRlbnQgb2YgLmJpbiBmaWxlIHRvIEVFUFJPTSAqLworCQkJCXJ0X2VlX3dyaXRlX2FsbChwQWQsIFdyaXRlRUVQUk9NKTsKKworCQl9IHdoaWxlKEZBTFNFKTsKKwkJfQorCisgICAgQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PSAlc1xuIiwgX19mdW5jX18pKTsKKworICAgIHJldHVybiBUUlVFOworCit9CisjZW5kaWYgLy8gIVVDT1MgLy8KKworSU5UIFNldF9BVEVfUmVhZF9FMlBfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVVNIT1JUIGJ1ZmZlcltFRVBST01fU0laRS8yXTsKKwlVU0hPUlQgKnA7CisJaW50IGk7CisKKwlydF9lZV9yZWFkX2FsbChwQWQsIChVU0hPUlQgKilidWZmZXIpOworCXAgPSBidWZmZXI7CisJZm9yIChpID0gMDsgaSA8IChFRVBST01fU0laRS8yKTsgaSsrKQorCXsKKwkJYXRlX3ByaW50KCIlNC40eCAiLCAqcCk7CisJCWlmICgoKGkrMSkgJSAxNikgPT0gMCkKKwkJCWF0ZV9wcmludCgiXG4iKTsKKwkJcCsrOworCX0KKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9BVEVfU2hvd19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlhdGVfcHJpbnQoIk1vZGU9JWRcbiIsIHBBZC0+YXRlLk1vZGUpOworCWF0ZV9wcmludCgiVHhQb3dlcjA9JWRcbiIsIHBBZC0+YXRlLlR4UG93ZXIwKTsKKwlhdGVfcHJpbnQoIlR4UG93ZXIxPSVkXG4iLCBwQWQtPmF0ZS5UeFBvd2VyMSk7CisJYXRlX3ByaW50KCJUeEFudGVubmFTZWw9JWRcbiIsIHBBZC0+YXRlLlR4QW50ZW5uYVNlbCk7CisJYXRlX3ByaW50KCJSeEFudGVubmFTZWw9JWRcbiIsIHBBZC0+YXRlLlJ4QW50ZW5uYVNlbCk7CisJYXRlX3ByaW50KCJCQlBDdXJyZW50Qlc9JWRcbiIsIHBBZC0+YXRlLlR4V0kuQlcpOworCWF0ZV9wcmludCgiR0k9JWRcbiIsIHBBZC0+YXRlLlR4V0kuU2hvcnRHSSk7CisJYXRlX3ByaW50KCJNQ1M9JWRcbiIsIHBBZC0+YXRlLlR4V0kuTUNTKTsKKwlhdGVfcHJpbnQoIlR4TW9kZT0lZFxuIiwgcEFkLT5hdGUuVHhXSS5QSFlNT0RFKTsKKwlhdGVfcHJpbnQoIkFkZHIxPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQlwQWQtPmF0ZS5BZGRyMVswXSwgcEFkLT5hdGUuQWRkcjFbMV0sIHBBZC0+YXRlLkFkZHIxWzJdLCBwQWQtPmF0ZS5BZGRyMVszXSwgcEFkLT5hdGUuQWRkcjFbNF0sIHBBZC0+YXRlLkFkZHIxWzVdKTsKKwlhdGVfcHJpbnQoIkFkZHIyPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQlwQWQtPmF0ZS5BZGRyMlswXSwgcEFkLT5hdGUuQWRkcjJbMV0sIHBBZC0+YXRlLkFkZHIyWzJdLCBwQWQtPmF0ZS5BZGRyMlszXSwgcEFkLT5hdGUuQWRkcjJbNF0sIHBBZC0+YXRlLkFkZHIyWzVdKTsKKwlhdGVfcHJpbnQoIkFkZHIzPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQlwQWQtPmF0ZS5BZGRyM1swXSwgcEFkLT5hdGUuQWRkcjNbMV0sIHBBZC0+YXRlLkFkZHIzWzJdLCBwQWQtPmF0ZS5BZGRyM1szXSwgcEFkLT5hdGUuQWRkcjNbNF0sIHBBZC0+YXRlLkFkZHIzWzVdKTsKKwlhdGVfcHJpbnQoIkNoYW5uZWw9JWRcbiIsIHBBZC0+YXRlLkNoYW5uZWwpOworCWF0ZV9wcmludCgiVHhMZW5ndGg9JWRcbiIsIHBBZC0+YXRlLlR4TGVuZ3RoKTsKKwlhdGVfcHJpbnQoIlR4Q291bnQ9JXVcbiIsIHBBZC0+YXRlLlR4Q291bnQpOworCWF0ZV9wcmludCgiUkZGcmVxT2Zmc2V0PSVkXG4iLCBwQWQtPmF0ZS5SRkZyZXFPZmZzZXQpOworCWF0ZV9wcmludChLRVJOX0VNRVJHICJTZXRfQVRFX1Nob3dfUHJvYyBTdWNjZXNzXG4iKTsKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UCVNldF9BVEVfSGVscF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlhdGVfcHJpbnQoIkFURT1BVEVTVEFSVCwgQVRFU1RPUCwgVFhDT05ULCBUWENBUlIsIFRYRlJBTUUsIFJYRlJBTUVcbiIpOworCWF0ZV9wcmludCgiQVRFREFcbiIpOworCWF0ZV9wcmludCgiQVRFU0FcbiIpOworCWF0ZV9wcmludCgiQVRFQlNTSURcbiIpOworCWF0ZV9wcmludCgiQVRFQ0hBTk5FTCwgcmFuZ2U6MH4xNCh1bmxlc3MgQSBiYW5kICEpXG4iKTsKKwlhdGVfcHJpbnQoIkFURVRYUE9XMCwgc2V0IHBvd2VyIGxldmVsIG9mIGFudGVubmEgMS5cbiIpOworCWF0ZV9wcmludCgiQVRFVFhQT1cxLCBzZXQgcG93ZXIgbGV2ZWwgb2YgYW50ZW5uYSAyLlxuIik7CisJYXRlX3ByaW50KCJBVEVUWEFOVCwgc2V0IFRYIGFudGVubmEuIDA6YWxsLCAxOmFudGVubmEgb25lLCAyOmFudGVubmEgdHdvLlxuIik7CisJYXRlX3ByaW50KCJBVEVSWEFOVCwgc2V0IFJYIGFudGVubmEuMDphbGwsIDE6YW50ZW5uYSBvbmUsIDI6YW50ZW5uYSB0d28sIDM6YW50ZW5uYSB0aHJlZS5cbiIpOworCWF0ZV9wcmludCgiQVRFVFhGUkVRT0ZGU0VULCBzZXQgZnJlcXVlbmN5IG9mZnNldCwgcmFuZ2UgMH42M1xuIik7CisJYXRlX3ByaW50KCJBVEVUWEJXLCBzZXQgQmFuZFdpZHRoLCAwOjIwTUh6LCAxOjQwTUh6LlxuIik7CisJYXRlX3ByaW50KCJBVEVUWExFTiwgc2V0IEZyYW1lIGxlbmd0aCwgcmFuZ2UgMjR+JWRcbiIsIChNQVhfRlJBTUVfU0laRSAtIDM0LyogPT0gMjMxMiAqLykpOworCWF0ZV9wcmludCgiQVRFVFhDTlQsIHNldCBob3cgbWFueSBmcmFtZSBnb2luZyB0byB0cmFuc21pdC5cbiIpOworCWF0ZV9wcmludCgiQVRFVFhNQ1MsIHNldCBNQ1MsIHJlZmVyZW5jZSB0byByYXRlIHRhYmxlLlxuIik7CisJYXRlX3ByaW50KCJBVEVUWE1PREUsIHNldCBNb2RlIDA6Q0NLLCAxOk9GRE0sIDI6SFQtTWl4LCAzOkdyZWVuRmllbGQsIHJlZmVyZW5jZSB0byByYXRlIHRhYmxlLlxuIik7CisJYXRlX3ByaW50KCJBVEVUWEdJLCBzZXQgR0kgaW50ZXJ2YWwsIDA6TG9uZywgMTpTaG9ydFxuIik7CisJYXRlX3ByaW50KCJBVEVSWEZFUiwgMDpkaXNhYmxlIFJ4IEZyYW1lIGVycm9yIHJhdGUuIDE6ZW5hYmxlIFJ4IEZyYW1lIGVycm9yIHJhdGUuXG4iKTsKKwlhdGVfcHJpbnQoIkFURVJSRiwgc2hvdyBhbGwgUkYgcmVnaXN0ZXJzLlxuIik7CisJYXRlX3ByaW50KCJBVEVXUkYxLCBzZXQgUkYxIHJlZ2lzdGVyLlxuIik7CisJYXRlX3ByaW50KCJBVEVXUkYyLCBzZXQgUkYyIHJlZ2lzdGVyLlxuIik7CisJYXRlX3ByaW50KCJBVEVXUkYzLCBzZXQgUkYzIHJlZ2lzdGVyLlxuIik7CisJYXRlX3ByaW50KCJBVEVXUkY0LCBzZXQgUkY0IHJlZ2lzdGVyLlxuIik7CisJYXRlX3ByaW50KCJBVEVMREUyUCwgbG9hZCBFRVBST00gZnJvbSAuYmluIGZpbGUuXG4iKTsKKwlhdGVfcHJpbnQoIkFURVJFMlAsIGRpc3BsYXkgYWxsIEVFUFJPTSBjb250ZW50LlxuIik7CisJYXRlX3ByaW50KCJBVEVTSE9XLCBkaXNwbGF5IGFsbCBwYXJhbWV0ZXJzIG9mIEFURS5cbiIpOworCWF0ZV9wcmludCgiQVRFSEVMUCwgb25saW5lIGhlbHAuXG4iKTsKKworCXJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlBc2ljU3dpdGNoQ2hhbm5lbCgpIGRlZGljYXRlZCBmb3IgQVRFLgorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEFURUFzaWNTd2l0Y2hDaGFubmVsKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkKQoreworCVVJTlQzMiBSMiA9IDAsIFIzID0gREVGQVVMVF9SRl9UWF9QT1dFUiwgUjQgPSAwLCBWYWx1ZSA9IDA7CisJQ0hBUiBUeFB3ZXIgPSAwLCBUeFB3ZXIyID0gMDsKKwlVQ0hBUiBpbmRleCwgQmJwVmFsdWUgPSAwLCBSNjYgPSAweDMwOworCVJUTVBfUkZfUkVHUyAqUkZSZWdUYWJsZTsKKwlVQ0hBUiBDaGFubmVsOworCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwlpZiAoKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkgfHwgKHBBZC0+YXRlLmJRQVJ4U3RhcnQgPT0gVFJVRSkpCisJeworCQlpZiAocEFkLT5hdGUuQ2hhbm5lbCAhPSBwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwpCisJCXsKKwkJCXBBZC0+YXRlLkNoYW5uZWwgPSBwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWw7CisJCX0KKwkJcmV0dXJuOworCX0KKwllbHNlCisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKwlDaGFubmVsID0gcEFkLT5hdGUuQ2hhbm5lbDsKKworCS8vIFNlbGVjdCBhbnRlbm5hCisJQXNpY0FudGVubmFTZWxlY3QocEFkLCBDaGFubmVsKTsKKworCS8vIGZpbGwgVHggcG93ZXIgdmFsdWUKKwlUeFB3ZXIgPSBwQWQtPmF0ZS5UeFBvd2VyMDsKKwlUeFB3ZXIyID0gcEFkLT5hdGUuVHhQb3dlcjE7CisKKwlSRlJlZ1RhYmxlID0gUkYyODUwUmVnVGFibGU7CisKKwlzd2l0Y2ggKHBBZC0+UmZJY1R5cGUpCisJeworCQkvKiBCdXQgb25seSAyODUwIGFuZCAyNzUwIHN1cHBvcnQgNS41R0h6IGJhbmQuLi4gKi8KKwkJY2FzZSBSRklDXzI4MjA6CisJCWNhc2UgUkZJQ18yODUwOgorCQljYXNlIFJGSUNfMjcyMDoKKwkJY2FzZSBSRklDXzI3NTA6CisKKwkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9PRl8yODUwX0NITkw7IGluZGV4KyspCisJCQl7CisJCQkJaWYgKENoYW5uZWwgPT0gUkZSZWdUYWJsZVtpbmRleF0uQ2hhbm5lbCkKKwkJCQl7CisJCQkJCVIyID0gUkZSZWdUYWJsZVtpbmRleF0uUjI7CisJCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCisJCQkJCXsKKwkJCQkJCVIyIHw9IDB4NDAwMDsJLy8gSWYgVFhwYXRoIGlzIDEsIGJpdCAxNCA9IDE7CisJCQkJCX0KKworCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKQorCQkJCQl7CisJCQkJCQlzd2l0Y2ggKHBBZC0+YXRlLlJ4QW50ZW5uYVNlbCkKKwkJCQkJCXsKKwkJCQkJCQljYXNlIDE6CisJCQkJCQkJCVIyIHw9IDB4MjAwNDA7CisJCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQmJwVmFsdWUpOworCQkJCQkJCQlCYnBWYWx1ZSAmPSAweEU0OworCQkJCQkJCQlCYnBWYWx1ZSB8PSAweDAwOworCQkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJicFZhbHVlKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAyOgorCQkJCQkJCQlSMiB8PSAweDEwMDQwOworCQkJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJicFZhbHVlKTsKKwkJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNDsKKwkJCQkJCQkJQmJwVmFsdWUgfD0gMHgwMTsKKwkJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCYnBWYWx1ZSk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCVIyIHw9IDB4NDA7CisJCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQmJwVmFsdWUpOworCQkJCQkJCQlCYnBWYWx1ZSAmPSAweEU0OworCQkJCQkJCQkvKiBPbmx5IGVuYWJsZSB0d28gQW50ZW5uYSB0byByZWNlaXZlLiAqLworCQkJCQkJCQlCYnBWYWx1ZSB8PSAweDA4OworCQkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJicFZhbHVlKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZSBpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQorCQkJCQl7CisJCQkJCQlSMiB8PSAweDIwMDQwOwkvLyB3cml0ZSAxIHRvIG9mZiBSeFBhdGgKKwkJCQkJfQorCisJCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpCisJCQkJCXsKKwkJCQkJCWlmIChwQWQtPmF0ZS5UeEFudGVubmFTZWwgPT0gMSkKKwkJCQkJCXsKKwkJCQkJCQlSMiB8PSAweDQwMDA7CS8vIElmIFRYIEFudGVubmEgc2VsZWN0IGlzIDEgLCBiaXQgMTQgPSAxOyBEaXNhYmxlIEFudCAyCisJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsICZCYnBWYWx1ZSk7CisJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNzsJCS8vMTExMDAxMTFCCisJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBCYnBWYWx1ZSk7CisJCQkJCQl9CisJCQkJCQllbHNlIGlmIChwQWQtPmF0ZS5UeEFudGVubmFTZWwgPT0gMikKKwkJCQkJCXsKKwkJCQkJCQlSMiB8PSAweDgwMDA7CS8vIElmIFRYIEFudGVubmEgc2VsZWN0IGlzIDIgLCBiaXQgMTUgPSAxOyBEaXNhYmxlIEFudCAxCisJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsICZCYnBWYWx1ZSk7CisJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNzsKKwkJCQkJCQlCYnBWYWx1ZSB8PSAweDA4OworCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgQmJwVmFsdWUpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCAmQmJwVmFsdWUpOworCQkJCQkJCUJicFZhbHVlICY9IDB4RTc7CisJCQkJCQkJQmJwVmFsdWUgfD0gMHgxMDsKKwkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsIEJicFZhbHVlKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKQorCQkJCQl7CisJCQkJCQlzd2l0Y2ggKHBBZC0+YXRlLlJ4QW50ZW5uYVNlbCkKKwkJCQkJCXsKKwkJCQkJCQljYXNlIDE6CisJCQkJCQkJCVIyIHw9IDB4MjAwNDA7CisJCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQmJwVmFsdWUpOworCQkJCQkJCQlCYnBWYWx1ZSAmPSAweEU0OworCQkJCQkJCQlCYnBWYWx1ZSB8PSAweDAwOworCQkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJicFZhbHVlKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAyOgorCQkJCQkJCQlSMiB8PSAweDEwMDQwOworCQkJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJicFZhbHVlKTsKKwkJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNDsKKwkJCQkJCQkJQmJwVmFsdWUgfD0gMHgwMTsKKwkJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCYnBWYWx1ZSk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMzoKKwkJCQkJCQkJUjIgfD0gMHgzMDAwMDsKKwkJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCYnBWYWx1ZSk7CisJCQkJCQkJCUJicFZhbHVlICY9IDB4RTQ7CisJCQkJCQkJCUJicFZhbHVlIHw9IDB4MDI7CisJCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQmJwVmFsdWUpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJicFZhbHVlKTsKKwkJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNDsKKwkJCQkJCQkJQmJwVmFsdWUgfD0gMHgxMDsKKwkJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCYnBWYWx1ZSk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJaWYgKENoYW5uZWwgPiAxNCkKKwkJCQkJeworCQkJCQkJLy8gaW5pdGlhbGl6ZSBSMywgUjQKKwkJCQkJCVIzID0gKFJGUmVnVGFibGVbaW5kZXhdLlIzICYgMHhmZmZmYzFmZik7CisJCQkJCQlSNCA9IChSRlJlZ1RhYmxlW2luZGV4XS5SNCAmICh+MHgwMDFmODdjMCkpIHwgKHBBZC0+YXRlLlJGRnJlcU9mZnNldCA8PCAxNSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFjY29yZGluZyB0aGUgUm9yeSdzIHN1Z2dlc3Rpb24gdG8gc29sdmUgdGhlIG1pZGRsZSByYW5nZSBpc3N1ZS4KKwkJCQkJCS8vIDUuNUcgYmFuZCBwb3dlciByYW5nZTogMHhGOX4wWDBGLCBUWDAgUmVnMyBiaXQ5L1RYMSBSZWc0IGJpdDY9IjAiIG1lYW5zIHRoZSBUWCBwb3dlciByZWR1Y2UgN2RCCisJCQkJCQkvLyBSMworCQkJCQkJaWYgKChUeFB3ZXIgPj0gLTcpICYmIChUeFB3ZXIgPCAwKSkKKwkJCQkJCXsKKwkJCQkJCQlUeFB3ZXIgPSAoNytUeFB3ZXIpOworCQkJCQkJCVR4UHdlciA9IChUeFB3ZXIgPiAweEYpID8gKDB4RikgOiAoVHhQd2VyKTsKKwkJCQkJCQlSMyB8PSAoVHhQd2VyIDw8IDEwKTsKKwkJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVEVBc2ljU3dpdGNoQ2hhbm5lbDogVHhQd2VyPSVkIFxuIiwgVHhQd2VyKSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJVHhQd2VyID0gKFR4UHdlciA+IDB4RikgPyAoMHhGKSA6IChUeFB3ZXIpOworCQkJCQkJCVIzIHw9IChUeFB3ZXIgPDwgMTApIHwgKDEgPDwgOSk7CisJCQkJCQl9CisKKwkJCQkJCS8vIFI0CisJCQkJCQlpZiAoKFR4UHdlcjIgPj0gLTcpICYmIChUeFB3ZXIyIDwgMCkpCisJCQkJCQl7CisJCQkJCQkJVHhQd2VyMiA9ICg3K1R4UHdlcjIpOworCQkJCQkJCVR4UHdlcjIgPSAoVHhQd2VyMiA+IDB4RikgPyAoMHhGKSA6IChUeFB3ZXIyKTsKKwkJCQkJCQlSNCB8PSAoVHhQd2VyMiA8PCA3KTsKKwkJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVEVBc2ljU3dpdGNoQ2hhbm5lbDogVHhQd2VyMj0lZCBcbiIsIFR4UHdlcjIpKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlUeFB3ZXIyID0gKFR4UHdlcjIgPiAweEYpID8gKDB4RikgOiAoVHhQd2VyMik7CisJCQkJCQkJUjQgfD0gKFR4UHdlcjIgPDwgNykgfCAoMSA8PCA2KTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCVIzID0gKFJGUmVnVGFibGVbaW5kZXhdLlIzICYgMHhmZmZmYzFmZikgfCAoVHhQd2VyIDw8IDkpOyAvLyBzZXQgVFggcG93ZXIwCisJCQkJCQlSNCA9IChSRlJlZ1RhYmxlW2luZGV4XS5SNCAmICh+MHgwMDFmODdjMCkpIHwgKHBBZC0+YXRlLlJGRnJlcU9mZnNldCA8PCAxNSkgfCAoVHhQd2VyMiA8PDYpOy8vIFNldCBmcmVxIG9mZnNldCAmIFR4UHdyMQorCQkJCQl9CisKKwkJCQkJLy8gQmFzZWQgb24gQkJQIGN1cnJlbnQgbW9kZSBiZWZvcmUgY2hhbmdpbmcgUkYgY2hhbm5lbC4KKwkJCQkJaWYgKHBBZC0+YXRlLlR4V0kuQlcgPT0gQldfNDApCisJCQkJCXsKKwkJCQkJCVI0IHw9MHgyMDAwMDA7CisJCQkJCX0KKworCQkJCQkvLyBVcGRhdGUgdmFyaWFibGVzCisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA9IENoYW5uZWw7CisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjEgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMTsKKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5SMiA9IFIyOworCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIzID0gUjM7CisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgPSBSNDsKKworCQkJCQlSdG1wUmZJb1dyaXRlKHBBZCk7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworCS8vIENoYW5nZSBCQlAgc2V0dGluZyBkdXJpbmcgc3dpdGNoIGZyb20gYS0+ZywgZy0+YQorCWlmIChDaGFubmVsIDw9IDE0KQorCXsKKwkgICAgVUxPTkcJVHhQaW5DZmcgPSAweDAwMDUwRjBBOy8vIDIwMDcuMTAuMDkgYnkgQnJpYW4gOiAweDAwMDUwNTBBID09PiAweDAwMDUwRjBBCisKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2MiwgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjYzLCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjQsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKKworCQkvKiBGb3IgMVQvMlIgY2hpcCBvbmx5Li4uICovCisJICAgIGlmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuRXh0ZXJuYWxMTkFGb3JHKQorCSAgICB7CisJICAgICAgICBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgyLCAweDYyKTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkgICAgICAgIEFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODIsIDB4ODQpOworCSAgICB9CisKKyAgICAgICAgLy8gQWNjb3JkaW5nIHRoZSBSb3J5J3Mgc3VnZ2VzdGlvbiB0byBzb2x2ZSB0aGUgbWlkZGxlIHJhbmdlIGlzc3VlLgorCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SODYsICZCYnBWYWx1ZSk7CisJCUFTU0VSVCgoQmJwVmFsdWUgPT0gMHgwMCkpOworCQlpZiAoKEJicFZhbHVlICE9IDB4MDApKQorCQl7CisJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjg2LCAweDAwKTsKKwkJfQorCisJCS8vIDUuNUdIeiBiYW5kIHNlbGVjdGlvbiBQSU4sIGJpdDEgYW5kIGJpdDIgYXJlIGNvbXBsZW1lbnQKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJlZhbHVlKTsKKwkJVmFsdWUgJj0gKH4weDYpOworCQlWYWx1ZSB8PSAoMHgwNCk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7CisKKyAgICAgICAgLy8gVHVybiBvZmYgdW51c2VkIFBBIG9yIExOQSB3aGVuIG9ubHkgMVQgb3IgMVIuCisJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCisJCXsKKwkJCVR4UGluQ2ZnICY9IDB4RkZGRkZGRjM7CisJCX0KKwkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKKwkJeworCQkJVHhQaW5DZmcgJj0gMHhGRkZGRjNGRjsKKwkJfQorCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BJTl9DRkcsIFR4UGluQ2ZnKTsKKwl9CisJZWxzZQorCXsKKwkgICAgVUxPTkcJVHhQaW5DZmcgPSAweDAwMDUwRjA1Oy8vMjAwNy4xMC4wOSBieSBCcmlhbiA6IDB4MDAwNTA1MDUgPT0+IDB4MDAwNTBGMDUKKworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjYyLCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjMsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NCwgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgyLCAweEYyKTsKKworICAgICAgICAvLyBBY2NvcmRpbmcgdGhlIFJvcnkncyBzdWdnZXN0aW9uIHRvIHNvbHZlIHRoZSBtaWRkbGUgcmFuZ2UgaXNzdWUuCisJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I4NiwgJkJicFZhbHVlKTsKKwkJQVNTRVJUKChCYnBWYWx1ZSA9PSAweDAwKSk7CisJCWlmICgoQmJwVmFsdWUgIT0gMHgwMCkpCisJCXsKKwkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODYsIDB4MDApOworCQl9CisJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I5MSwgJkJicFZhbHVlKTsKKwkJQVNTRVJUKChCYnBWYWx1ZSA9PSAweDA0KSk7CisKKwkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjkyLCAmQmJwVmFsdWUpOworCQlBU1NFUlQoKEJicFZhbHVlID09IDB4MDApKTsKKworCQkvLyA1LjVHSHogYmFuZCBzZWxlY3Rpb24gUElOLCBiaXQxIGFuZCBiaXQyIGFyZSBjb21wbGVtZW50CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZWYWx1ZSk7CisJCVZhbHVlICY9ICh+MHg2KTsKKwkJVmFsdWUgfD0gKDB4MDIpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgVmFsdWUpOworCisgICAgICAgIC8vIFR1cm4gb2ZmIHVudXNlZCBQQSBvciBMTkEgd2hlbiBvbmx5IDFUIG9yIDFSLgorCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKQorCQl7CisJCQlUeFBpbkNmZyAmPSAweEZGRkZGRkYzOworCSAgICB9CisJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCisJCXsKKwkJCVR4UGluQ2ZnICY9IDB4RkZGRkYzRkY7CisJCX0KKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QSU5fQ0ZHLCBUeFBpbkNmZyk7CisJfQorCisgICAgLy8gUjY2IHNob3VsZCBiZSBzZXQgYWNjb3JkaW5nIHRvIENoYW5uZWwgYW5kIHVzZSAyME1IeiB3aGVuIHNjYW5uaW5nCisJaWYgKENoYW5uZWwgPD0gMTQpCisJeworCQkvLyBCRyBiYW5kCisJCVI2NiA9IDB4MkUgKyBHRVRfTE5BX0dBSU4ocEFkKTsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwl9CisJZWxzZQorCXsKKwkJLy8gNS41IEdIeiBiYW5kCisJCWlmIChwQWQtPmF0ZS5UeFdJLkJXID09IEJXXzIwKQorCQl7CisJCQlSNjYgPSAoVUNIQVIpKDB4MzIgKyAoR0VUX0xOQV9HQUlOKHBBZCkqNSkvMyk7CisgICAgCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQl9CisJCWVsc2UKKwkJeworCQkJUjY2ID0gKFVDSEFSKSgweDNBICsgKEdFVF9MTkFfR0FJTihwQWQpKjUpLzMpOworCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJfQorCX0KKworCS8vCisJLy8gT24gMTFBLCBXZSBzaG91bGQgZGVsYXkgYW5kIHdhaXQgUkYvQkJQIHRvIGJlIHN0YWJsZQorCS8vIGFuZCB0aGUgYXBwcm9wcmlhdGUgdGltZSBzaG91bGQgYmUgMTAwMCBtaWNybyBzZWNvbmRzCisJLy8gMjAwNS8wNi8wNSAtIE9uIDExRywgV2UgYWxzbyBuZWVkIHRoaXMgZGVsYXkgdGltZS4gT3RoZXJ3aXNlIGl0J3MgZGlmZmljdWx0IHRvIHBhc3MgdGhlIFdIUUwuCisJLy8KKwlSVE1QdXNlY0RlbGF5KDEwMDApOworCisJaWYgKENoYW5uZWwgPiAxNCkKKwl7CisJCS8vIFdoZW4gNS41R0h6IGJhbmQgdGhlIExTQiBvZiBUeFB3ciB3aWxsIGJlIHVzZWQgdG8gcmVkdWNlZCA3ZEIgb3Igbm90LgorCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTd2l0Y2hDaGFubmVsIyVkKFJGPSVkLCAlZFQpIHRvICwgUjE9MHglMDhseCwgUjI9MHglMDhseCwgUjM9MHglMDhseCwgUjQ9MHglMDhseFxuIiwKKwkJCQkJCQkJICBDaGFubmVsLAorCQkJCQkJCQkgIHBBZC0+UmZJY1R5cGUsCisJCQkJCQkJCSAgcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCwKKwkJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlIxLAorCQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjIsCisJCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMywKKwkJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlI0KSk7CisJfQorCWVsc2UKKwl7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN3aXRjaENoYW5uZWwjJWQoUkY9JWQsIFB3cjA9JXUsIFB3cjE9JXUsICVkVCkgdG8gLCBSMT0weCUwOGx4LCBSMj0weCUwOGx4LCBSMz0weCUwOGx4LCBSND0weCUwOGx4XG4iLAorCQkJCQkJCQkgIENoYW5uZWwsCisJCQkJCQkJCSAgcEFkLT5SZkljVHlwZSwKKwkJCQkJCQkJICAoUjMgJiAweDAwMDAzZTAwKSA+PiA5LAorCQkJCQkJCQkgIChSNCAmIDB4MDAwMDA3YzApID4+IDYsCisJCQkJCQkJCSAgcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCwKKwkJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlIxLAorCQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjIsCisJCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMywKKwkJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlI0KSk7CisgICAgfQorfQorCisvLworLy8gSW4gZmFjdCwgbm8gb25lIHdpbGwgY2FsbCB0aGlzIHJvdXRpbmUgc28gZmFyICEKKy8vCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUdpdmVzIENDSyBUWCByYXRlIDIgbW9yZSBkQiBUWCBwb3dlci4KKwkJVGhpcyByb3V0aW5lIHdvcmtzIG9ubHkgaW4gQVRFIG1vZGUuCisKKwkJY2FsY3VsYXRlIGRlc2lyZWQgVHggcG93ZXIgaW4gUkYgUjMuVHgwfjUsCXNob3VsZCBjb25zaWRlciAtCisJCTAuIGlmIGN1cnJlbnQgcmFkaW8gaXMgYSBub2lzeSBlbnZpcm9ubWVudCAocEFkLT5EcnNDb3VudGVycy5mTm9pc3lFbnZpcm9ubWVudCkKKwkJMS4gVHhQb3dlclBlcmNlbnRhZ2UKKwkJMi4gYXV0byBjYWxpYnJhdGlvbiBiYXNlZCBvbiBUU1NJIGZlZWRiYWNrCisJCTMuIGV4dHJhIDIgZGIgZm9yIENDSworCQk0LiAtMTAgZGIgdXBvbiB2ZXJ5LXNob3J0IGRpc3RhbmNlIChBdmdSU1NJID49IC00MGRiKSB0byBBUAorCisJTk9URTogU2luY2UgdGhpcyByb3V0aW5lIHJlcXVpcmVzIHRoZSB2YWx1ZSBvZiAocEFkLT5EcnNDb3VudGVycy5mTm9pc3lFbnZpcm9ubWVudCksCisJCWl0IHNob3VsZCBiZSBjYWxsZWQgQUZURVIgTWxtZUR5bmFtaWNUeFJhdGVTd2l0Y2hpbmcoKQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQVRFQXNpY0FkanVzdFR4UG93ZXIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJSU5UCQkJaSwgajsKKwlDSEFSCQlEZWx0YVB3ciA9IDA7CisJQk9PTEVBTgkJYkF1dG9UeEFnYyA9IEZBTFNFOworCVVDSEFSCQlUc3NpUmVmLCAqcFRzc2lNaW51c0JvdW5kYXJ5LCAqcFRzc2lQbHVzQm91bmRhcnksIFR4QWdjU3RlcDsKKwlVQ0hBUgkJQmJwUjQ5ID0gMCwgaWR4OworCVBDSEFSCQlwVHhBZ2NDb21wZW5zYXRlOworCVVMT05HCQlUeFB3cls1XTsKKwlDSEFSCQlWYWx1ZTsKKworCS8qIG5vIG9uZSBjYWxscyB0aGlzIHByb2NlZHVyZSBzbyBmYXIgKi8KKwlpZiAocEFkLT5hdGUuVHhXSS5CVyA9PSBCV180MCkKKwl7CisJCWlmIChwQWQtPmF0ZS5DaGFubmVsID4gMTQpCisJCXsKKwkJCVR4UHdyWzBdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzBdOworCQkJVHhQd3JbMV0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbMV07CisJCQlUeFB3clsyXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFsyXTsKKwkJCVR4UHdyWzNdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzNdOworCQkJVHhQd3JbNF0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbNF07CisJCX0KKwkJZWxzZQorCQl7CisJCQlUeFB3clswXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFswXTsKKwkJCVR4UHdyWzFdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzFdOworCQkJVHhQd3JbMl0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbMl07CisJCQlUeFB3clszXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFszXTsKKwkJCVR4UHdyWzRdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzRdOworCQl9CisJfQorCWVsc2UKKwl7CisJCWlmIChwQWQtPmF0ZS5DaGFubmVsID4gMTQpCisJCXsKKwkJCVR4UHdyWzBdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzBdOworCQkJVHhQd3JbMV0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbMV07CisJCQlUeFB3clsyXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFsyXTsKKwkJCVR4UHdyWzNdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzNdOworCQkJVHhQd3JbNF0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbNF07CisJCX0KKwkJZWxzZQorCQl7CisJCQlUeFB3clswXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFswXTsKKwkJCVR4UHdyWzFdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzFdOworCQkJVHhQd3JbMl0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbMl07CisJCQlUeFB3clszXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFszXTsKKwkJCVR4UHdyWzRdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzRdOworCQl9CisJfQorCisJLy8gVFggcG93ZXIgY29tcGVuc2F0aW9uIGZvciB0ZW1wZXJhdHVyZSB2YXJpYXRpb24gYmFzZWQgb24gVFNTSS4KKwkvLyBEbyBpdCBwZXIgNCBzZWNvbmRzLgorCWlmIChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDQgPT0gMCkKKwl7CisJCWlmIChwQWQtPmF0ZS5DaGFubmVsIDw9IDE0KQorCQl7CisJCQkvKiBiZyBjaGFubmVsICovCisJCQliQXV0b1R4QWdjICAgICAgICAgPSBwQWQtPmJBdXRvVHhBZ2NHOworCQkJVHNzaVJlZiAgICAgICAgICAgID0gcEFkLT5Uc3NpUmVmRzsKKwkJCXBUc3NpTWludXNCb3VuZGFyeSA9ICZwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1swXTsKKwkJCXBUc3NpUGx1c0JvdW5kYXJ5ICA9ICZwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzBdOworCQkJVHhBZ2NTdGVwICAgICAgICAgID0gcEFkLT5UeEFnY1N0ZXBHOworCQkJcFR4QWdjQ29tcGVuc2F0ZSAgID0gJnBBZC0+VHhBZ2NDb21wZW5zYXRlRzsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIGEgY2hhbm5lbCAqLworCQkJYkF1dG9UeEFnYyAgICAgICAgID0gcEFkLT5iQXV0b1R4QWdjQTsKKwkJCVRzc2lSZWYgICAgICAgICAgICA9IHBBZC0+VHNzaVJlZkE7CisJCQlwVHNzaU1pbnVzQm91bmRhcnkgPSAmcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbMF07CisJCQlwVHNzaVBsdXNCb3VuZGFyeSAgPSAmcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVswXTsKKwkJCVR4QWdjU3RlcCAgICAgICAgICA9IHBBZC0+VHhBZ2NTdGVwQTsKKwkJCXBUeEFnY0NvbXBlbnNhdGUgICA9ICZwQWQtPlR4QWdjQ29tcGVuc2F0ZUE7CisJCX0KKworCQlpZiAoYkF1dG9UeEFnYykKKwkJeworCQkJLyogQmJwUjQ5IGlzIHVuc2lnbmVkIGNoYXIgKi8KKwkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0OSwgJkJicFI0OSk7CisKKwkJCS8qIChwKSBUc3NpUGx1c0JvdW5kYXJ5R1swXSA9IDAgPSAobSkgVHNzaU1pbnVzQm91bmRhcnlHWzBdICovCisJCQkvKiBjb21wZW5zYXRlOiArNCAgICAgKzMgICArMiAgICsxICAgIDAgICAtMSAgIC0yICAgLTMgICAtNCAqIHN0ZXBzICovCisJCQkvKiBzdGVwIHZhbHVlIGlzIGRlZmluZWQgaW4gcEFkLT5UeEFnY1N0ZXBHIGZvciB0eCBwb3dlciB2YWx1ZSAqLworCisJCQkvKiBbNF0rMStbNF0gICBwNCAgICAgcDMgICBwMiAgIHAxICAgbzEgICBtMSAgIG0yICAgbTMgICBtNCAqLworCQkJLyogZXg6ICAgICAgICAgMHgwMCAweDE1IDB4MjUgMHg0NSAweDg4IDB4QTAgMHhCNSAweEQwIDB4RjAKKwkJCSAgIGFib3ZlIHZhbHVlIGFyZSBleGFtaW5lZCBpbiBtYXNzIGZhY3RvcnkgcHJvZHVjdGlvbiAqLworCQkJLyogICAgICAgICAgICAgWzRdICAgIFszXSAgWzJdICBbMV0gIFswXSAgWzFdICBbMl0gIFszXSAgWzRdICovCisKKwkJCS8qIHBsdXMgaXMgMHgxMCB+IDB4NDAsIG1pbnVzIGlzIDB4NjAgfiAweDkwICovCisJCQkvKiBpZiB2YWx1ZSBpcyBiZXR3ZWVuIHAxIH4gbzEgb3IgbzEgfiBzMSwgbm8gbmVlZCB0byBhZGp1c3QgdHggcG93ZXIgKi8KKwkJCS8qIGlmIHZhbHVlIGlzIDB4NjUsIHR4IHBvd2VyIHdpbGwgYmUgLT0gVHhBZ2NTdGVwKigyLTEpICovCisKKwkJCWlmIChCYnBSNDkgPiBwVHNzaU1pbnVzQm91bmRhcnlbMV0pCisJCQl7CisJCQkJLy8gUmVhZGluZyBpcyBsYXJnZXIgdGhhbiB0aGUgcmVmZXJlbmNlIHZhbHVlLgorCQkJCS8vIENoZWNrIGZvciBob3cgbGFyZ2Ugd2UgbmVlZCB0byBkZWNyZWFzZSB0aGUgVHggcG93ZXIuCisJCQkJZm9yIChpZHggPSAxOyBpZHggPCA1OyBpZHgrKykKKwkJCQl7CisJCQkJCWlmIChCYnBSNDkgPD0gcFRzc2lNaW51c0JvdW5kYXJ5W2lkeF0pICAvLyBGb3VuZCB0aGUgcmFuZ2UKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvLyBUaGUgaW5kZXggaXMgdGhlIHN0ZXAgd2Ugc2hvdWxkIGRlY3JlYXNlLCBpZHggPSAwIG1lYW5zIHRoZXJlIGlzIG5vdGhpbmcgdG8gY29tcGVuc2F0ZQorLy8JCQkJaWYgKFIzID4gKFVMT05HKSAoVHhBZ2NTdGVwICogKGlkeC0xKSkpCisJCQkJCSpwVHhBZ2NDb21wZW5zYXRlID0gLShUeEFnY1N0ZXAgKiAoaWR4LTEpKTsKKy8vCQkJCWVsc2UKKy8vCQkJCQkqcFR4QWdjQ29tcGVuc2F0ZSA9IC0oKFVDSEFSKVIzKTsKKworCQkJCURlbHRhUHdyICs9ICgqcFR4QWdjQ29tcGVuc2F0ZSk7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0gVHggUG93ZXIsIEJCUCBSMT0leCwgVHNzaVJlZj0leCwgVHhBZ2NTdGVwPSV4LCBzdGVwID0gLSVkXG4iLAorCQkJCQlCYnBSNDksIFRzc2lSZWYsIFR4QWdjU3RlcCwgaWR4LTEpKTsKKwkJCX0KKwkJCWVsc2UgaWYgKEJicFI0OSA8IHBUc3NpUGx1c0JvdW5kYXJ5WzFdKQorCQkJeworCQkJCS8vIFJlYWRpbmcgaXMgc21hbGxlciB0aGFuIHRoZSByZWZlcmVuY2UgdmFsdWUKKwkJCQkvLyBjaGVjayBmb3IgaG93IGxhcmdlIHdlIG5lZWQgdG8gaW5jcmVhc2UgdGhlIFR4IHBvd2VyCisJCQkJZm9yIChpZHggPSAxOyBpZHggPCA1OyBpZHgrKykKKwkJCQl7CisJCQkJCWlmIChCYnBSNDkgPj0gcFRzc2lQbHVzQm91bmRhcnlbaWR4XSkgICAvLyBGb3VuZCB0aGUgcmFuZ2UKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvLyBUaGUgaW5kZXggaXMgdGhlIHN0ZXAgd2Ugc2hvdWxkIGluY3JlYXNlLCBpZHggPSAwIG1lYW5zIHRoZXJlIGlzIG5vdGhpbmcgdG8gY29tcGVuc2F0ZQorCQkJCSpwVHhBZ2NDb21wZW5zYXRlID0gVHhBZ2NTdGVwICogKGlkeC0xKTsKKwkJCQlEZWx0YVB3ciArPSAoKnBUeEFnY0NvbXBlbnNhdGUpOworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIisrIFR4IFBvd2VyLCBCQlAgUjE9JXgsIFRzc2lSZWY9JXgsIFR4QWdjU3RlcD0leCwgc3RlcCA9ICslZFxuIiwKKwkJCQkJQmJwUjQ5LCBUc3NpUmVmLCBUeEFnY1N0ZXAsIGlkeC0xKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJKnBUeEFnY0NvbXBlbnNhdGUgPSAwOworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiAgIFR4IFBvd2VyLCBCQlAgUjE9JXgsIFRzc2lSZWY9JXgsIFR4QWdjU3RlcD0leCwgc3RlcCA9ICslZFxuIiwKKwkJCQkJQmJwUjQ5LCBUc3NpUmVmLCBUeEFnY1N0ZXAsIDApKTsKKwkJCX0KKwkJfQorCX0KKwllbHNlCisJeworCQlpZiAocEFkLT5hdGUuQ2hhbm5lbCA8PSAxNCkKKwkJeworCQkJYkF1dG9UeEFnYyAgICAgICAgID0gcEFkLT5iQXV0b1R4QWdjRzsKKwkJCXBUeEFnY0NvbXBlbnNhdGUgICA9ICZwQWQtPlR4QWdjQ29tcGVuc2F0ZUc7CisJCX0KKwkJZWxzZQorCQl7CisJCQliQXV0b1R4QWdjICAgICAgICAgPSBwQWQtPmJBdXRvVHhBZ2NBOworCQkJcFR4QWdjQ29tcGVuc2F0ZSAgID0gJnBBZC0+VHhBZ2NDb21wZW5zYXRlQTsKKwkJfQorCisJCWlmIChiQXV0b1R4QWdjKQorCQkJRGVsdGFQd3IgKz0gKCpwVHhBZ2NDb21wZW5zYXRlKTsKKwl9CisKKwkvKiBjYWxjdWxhdGUgZGVsdGEgcG93ZXIgYmFzZWQgb24gdGhlIHBlcmNlbnRhZ2Ugc3BlY2lmaWVkIGZyb20gVUkgKi8KKwkvLyBFMlBST00gc2V0dGluZyBpcyBjYWxpYnJhdGVkIGZvciBtYXhpbXVtIFRYIHBvd2VyIChpLmUuIDEwMCUpCisJLy8gV2UgbG93ZXIgVFggcG93ZXIgaGVyZSBhY2NvcmRpbmcgdG8gdGhlIHBlcmNlbnRhZ2Ugc3BlY2lmaWVkIGZyb20gVUkKKwlpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPT0gMHhmZmZmZmZmZikgICAgICAgLy8gQVVUTyBUWCBQT1dFUiBjb250cm9sCisJCTsKKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDkwKSAgLy8gOTEgfiAxMDAlICYgQVVUTywgdHJlYXQgYXMgMTAwJSBpbiB0ZXJtcyBvZiBtVworCQk7CisJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiA2MCkgIC8vIDYxIH4gOTAlLCB0cmVhdCBhcyA3NSUgaW4gdGVybXMgb2YgbVcKKwl7CisJCURlbHRhUHdyIC09IDE7CisJfQorCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gMzApICAvLyAzMSB+IDYwJSwgdHJlYXQgYXMgNTAlIGluIHRlcm1zIG9mIG1XCisJeworCQlEZWx0YVB3ciAtPSAzOworCX0KKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDE1KSAgLy8gMTYgfiAzMCUsIHRyZWF0IGFzIDI1JSBpbiB0ZXJtcyBvZiBtVworCXsKKwkJRGVsdGFQd3IgLT0gNjsKKwl9CisJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiA5KSAgIC8vIDEwIH4gMTUlLCB0cmVhdCBhcyAxMi41JSBpbiB0ZXJtcyBvZiBtVworCXsKKwkJRGVsdGFQd3IgLT0gOTsKKwl9CisJZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwIH4gOSAlLCB0cmVhdCBhcyBNSU4ofjMlKSBpbiB0ZXJtcyBvZiBtVworCXsKKwkJRGVsdGFQd3IgLT0gMTI7CisJfQorCisJLyogcmVzZXQgZGlmZmVyZW50IG5ldyB0eCBwb3dlciBmb3IgZGlmZmVyZW50IFRYIHJhdGUgKi8KKwlmb3IoaT0wOyBpPDU7IGkrKykKKwl7CisJCWlmIChUeFB3cltpXSAhPSAweGZmZmZmZmZmKQorCQl7CisJCQlmb3IgKGo9MDsgajw4OyBqKyspCisJCQl7CisJCQkJVmFsdWUgPSAoQ0hBUikoKFR4UHdyW2ldID4+IGoqNCkgJiAweDBGKTsgLyogMCB+IDE1ICovCisKKwkJCQlpZiAoKFZhbHVlICsgRGVsdGFQd3IpIDwgMCkKKwkJCQl7CisJCQkJCVZhbHVlID0gMDsgLyogbWluICovCisJCQkJfQorCQkJCWVsc2UgaWYgKChWYWx1ZSArIERlbHRhUHdyKSA+IDB4RikKKwkJCQl7CisJCQkJCVZhbHVlID0gMHhGOyAvKiBtYXggKi8KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJVmFsdWUgKz0gRGVsdGFQd3I7IC8qIHRlbXBlcmF0dXJlIGNvbXBlbnNhdGlvbiAqLworCQkJCX0KKworCQkJCS8qIGZpbGwgbmV3IHZhbHVlIHRvIENTUiBvZmZzZXQgKi8KKwkJCQlUeFB3cltpXSA9IChUeFB3cltpXSAmIH4oMHgwMDAwMDAwRiA8PCBqKjQpKSB8IChWYWx1ZSA8PCBqKjQpOworCQkJfQorCisJCQkvKiB3cml0ZSB0eCBwb3dlciB2YWx1ZSB0byBDU1IgKi8KKwkJCS8qIFRYX1BXUl9DRkdfMCAoOCB0eCByYXRlKSBmb3IJVFggcG93ZXIgZm9yIE9GRE0gMTJNLzE4TQorCQkJCQkJCQkJCQlUWCBwb3dlciBmb3IgT0ZETSA2TS85TQorCQkJCQkJCQkJCQlUWCBwb3dlciBmb3IgQ0NLNS41TS8xMU0KKwkJCQkJCQkJCQkJVFggcG93ZXIgZm9yIENDSzFNLzJNICovCisJCQkvKiBUWF9QV1JfQ0ZHXzEgfiBUWF9QV1JfQ0ZHXzQgKi8KKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BXUl9DRkdfMCArIGkqNCwgVHhQd3JbaV0pOworCisKKwkJfQorCX0KKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVdyaXRlIFR4V0kgZm9yIEFURSBtb2RlLgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisjaWZkZWYgUlQyODcwCitzdGF0aWMgVk9JRCBBVEVXcml0ZVR4V0koCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFRYV0lfU1RSVUMgCXBUeFdJLAorCUlOCUJPT0xFQU4JCQlGUkFHLAorCUlOCUJPT0xFQU4JCQlJbnNUaW1lc3RhbXAsCisJSU4JQk9PTEVBTiAJCUFNUERVLAorCUlOCUJPT0xFQU4gCQlBY2ssCisJSU4JQk9PTEVBTiAJCU5TZXEsCQkvLyBIVyBuZXcgYSBzZXF1ZW5jZS4KKwlJTglVQ0hBUgkJCUJBU2l6ZSwKKwlJTglVQ0hBUgkJCVdDSUQsCisJSU4JVUxPTkcJCQlMZW5ndGgsCisJSU4JVUNIQVIgCQkJUElELAorCUlOCVVDSEFSCQkJTUlNT3BzLAorCUlOCVVDSEFSCQkJVHhvcG1vZGUsCisJSU4JQk9PTEVBTgkJCUNmQWNrLAorCUlOCUhUVFJBTlNNSVRfU0VUVElORwlUcmFuc21pdCkKK3sKKwkvLworCS8vIEFsd2F5cyB1c2UgTG9uZyBwcmVhbWJsZSBiZWZvcmUgdmVyaWZpYXRpb24gc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcyB3ZWxsLgorCS8vIFRvZG86IHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUgaWYgc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcworCS8vCisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsKKwlwVHhXSS0+RlJBRz0gRlJBRzsKKwlwVHhXSS0+VFM9IEluc1RpbWVzdGFtcDsKKwlwVHhXSS0+QU1QRFUgPSBBTVBEVTsKKworCXBUeFdJLT5NSU1PcHMgPSBQV1JfQUNUSVZFOworCXBUeFdJLT5NcGR1RGVuc2l0eSA9IDQ7CisJcFR4V0ktPkFDSyA9IEFjazsKKwlwVHhXSS0+dHhvcCA9IFR4b3Btb2RlOworCXBUeFdJLT5OU0VRID0gTlNlcTsKKwlwVHhXSS0+QkFXaW5TaXplID0gQkFTaXplOworCisJcFR4V0ktPldpcmVsZXNzQ2xpSUQgPSBXQ0lEOworCXBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPSBMZW5ndGg7CisJcFR4V0ktPlBhY2tldElkID0gUElEOworCisJcFR4V0ktPkJXID0gVHJhbnNtaXQuZmllbGQuQlc7CisJcFR4V0ktPlNob3J0R0kgPSBUcmFuc21pdC5maWVsZC5TaG9ydEdJOworCXBUeFdJLT5TVEJDPSBUcmFuc21pdC5maWVsZC5TVEJDOworCisJcFR4V0ktPk1DUyA9IFRyYW5zbWl0LmZpZWxkLk1DUzsKKwlwVHhXSS0+UEhZTU9ERT0gVHJhbnNtaXQuZmllbGQuTU9ERTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCS8vCisJLy8gTU1QUyBpcyA4MDIuMTFuIGZlYXR1cmVzLiBCZWNhdXNlIFR4V0ktPk1DUyA+IDcgbXVzdCBiZSBIVCBtb2RlLAorCS8vIHNvIG5lZWQgbm90IGNoZWNrIGlmIGl0J3MgSFQgcmF0ZS4KKwkvLworCWlmICgoTUlNT3BzID09IE1NUFNfU1RBVElDKSAmJiAocFR4V0ktPk1DUyA+IDcpKQorCQlwVHhXSS0+TUNTID0gNzsKKworCWlmICgoTUlNT3BzID09IE1NUFNfRFlOQU1JQykgJiYgKHBUeFdJLT5NQ1MgPiA3KSkgLy8gU01QUyBwcm90ZWN0IDIgc3BhdGlhbC4KKwkJcFR4V0ktPk1JTU9wcyA9IDE7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlwVHhXSS0+Q0ZBQ0sgPSBDZkFjazsKKworCXJldHVybjsKK30KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlEaXNhYmxlIHByb3RlY3Rpb24gZm9yIEFURS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIEFURURpc2FibGVBc2ljUHJvdGVjdCgKKwlJTgkJUFJUTVBfQURBUFRFUglwQWQpCit7CisJUFJPVF9DRkdfU1RSVUMJUHJvdENmZywgUHJvdENmZzQ7CisJVUlOVDMyIFByb3RlY3RbNl07CisJVVNIT1JUCQkJb2Zmc2V0OworCVVDSEFSCQkJaTsKKwlVSU5UMzIgTWFjUmVnID0gMDsKKworCS8vIENvbmZpZyBBU0lDIFJUUyB0aHJlc2hvbGQgcmVnaXN0ZXIKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1JUU19DRkcsICZNYWNSZWcpOworCU1hY1JlZyAmPSAweEZGMDAwMEZGOworCU1hY1JlZyB8PSAocEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkIDw8IDgpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1JUU19DRkcsIE1hY1JlZyk7CisKKwkvLyBJbml0aWFsIGNvbW1vbiBwcm90ZWN0aW9uIHNldHRpbmdzCisJUlRNUFplcm9NZW1vcnkoUHJvdGVjdCwgc2l6ZW9mKFByb3RlY3QpKTsKKwlQcm90Q2ZnNC53b3JkID0gMDsKKwlQcm90Q2ZnLndvcmQgPSAwOworCVByb3RDZmcuZmllbGQuVHhvcEFsbG93R0Y0MCA9IDE7CisJUHJvdENmZy5maWVsZC5UeG9wQWxsb3dHRjIwID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd01NNDAgPSAxOworCVByb3RDZmcuZmllbGQuVHhvcEFsbG93TU0yMCA9IDE7CisJUHJvdENmZy5maWVsZC5UeG9wQWxsb3dPZmRtID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd0NjayA9IDE7CisJUHJvdENmZy5maWVsZC5SVFNUaEVuID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOworCisJLy8gSGFuZGxlIGxlZ2FjeShCL0cpIHByb3RlY3Rpb24KKwlQcm90Q2ZnLmZpZWxkLlByb3RlY3RSYXRlID0gcEFkLT5Db21tb25DZmcuUnRzUmF0ZTsKKwlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gMDsKKwlQcm90ZWN0WzBdID0gUHJvdENmZy53b3JkOworCVByb3RlY3RbMV0gPSBQcm90Q2ZnLndvcmQ7CisKKwkvLyBOTyBQUk9URUNUCisJLy8gMS5BbGwgU1RBcyBpbiB0aGUgQlNTIGFyZSAyMC80MCBNSHogSFQKKwkvLyAyLiBpbiBhaSAyMC80ME1IeiBCU1MKKwkvLyAzLiBhbGwgU1RBcyBhcmUgMjBNSHogaW4gYSAyME1IeiBCU1MKKwkvLyBQdXJlIEhULiBubyBwcm90ZWN0aW9uLgorCisJLy8gTU0yMF9QUk9UX0NGRworCS8vCVJlc2VydmVkICgzMToyNykKKwkvLyAJUFJPVF9UWE9QKDI1OjIwKSAtLSAwMTAxMTEKKwkvLwlQUk9UX05BVigxOToxOCkgIC0tIDAxIChTaG9ydCBOQVYgcHJvdGVjdGlvbikKKwkvLyAgUFJPVF9DVFJMKDE3OjE2KSAtLSAwMCAoTm9uZSkKKwkvLyAJUFJPVF9SQVRFKDE1OjApICAtLSAweDQwMDQgKE9GRE0gMjRNKQorCVByb3RlY3RbMl0gPSAweDAxNzQ0MDA0OworCisJLy8gTU00MF9QUk9UX0NGRworCS8vCVJlc2VydmVkICgzMToyNykKKwkvLyAJUFJPVF9UWE9QKDI1OjIwKSAtLSAxMTExMTEKKwkvLwlQUk9UX05BVigxOToxOCkgIC0tIDAxIChTaG9ydCBOQVYgcHJvdGVjdGlvbikKKwkvLyAgUFJPVF9DVFJMKDE3OjE2KSAtLSAwMCAoTm9uZSkKKwkvLyAJUFJPVF9SQVRFKDE1OjApICAtLSAweDQwODQgKGR1cGxpY2F0ZSBPRkRNIDI0TSkKKwlQcm90ZWN0WzNdID0gMHgwM2Y0NDA4NDsKKworCS8vIENGMjBfUFJPVF9DRkcKKwkvLwlSZXNlcnZlZCAoMzE6MjcpCisJLy8gCVBST1RfVFhPUCgyNToyMCkgLS0gMDEwMTExCisJLy8JUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pCisJLy8gIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpCisJLy8gCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDA0IChPRkRNIDI0TSkKKwlQcm90ZWN0WzRdID0gMHgwMTc0NDAwNDsKKworCS8vIENGNDBfUFJPVF9DRkcKKwkvLwlSZXNlcnZlZCAoMzE6MjcpCisJLy8gCVBST1RfVFhPUCgyNToyMCkgLS0gMTExMTExCisJLy8JUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pCisJLy8gIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpCisJLy8gCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDg0IChkdXBsaWNhdGUgT0ZETSAyNE0pCisJUHJvdGVjdFs1XSA9IDB4MDNmNDQwODQ7CisKKwlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJSVFNMb25nUHJvdE9uID0gRkFMU0U7CisKKwlvZmZzZXQgPSBDQ0tfUFJPVF9DRkc7CisJZm9yIChpID0gMDtpIDwgNjtpKyspCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCArIGkqNCwgUHJvdGVjdFtpXSk7CisKK30KKworI2lmZGVmIFJUMjg3MAorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlXcml0ZSBUeEluZm8gZm9yIEFURSBtb2RlLgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIFZPSUQgQVRFV3JpdGVUeEluZm8oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFRYSU5GT19TVFJVQyAJcFR4SW5mbywKKwlJTglVU0hPUlQJCVVTQkRNQXBrdExlbiwKKwlJTglCT09MRUFOCQliV2l2LAorCUlOCVVDSEFSCQkJUXVldWVTZWwsCisJSU4JVUNIQVIJCQlOZXh0VmFsaWQsCisJSU4JVUNIQVIJCQlUeEJ1cnN0KQoreworCXBUeEluZm8tPlVTQkRNQVR4UGt0TGVuID0gVVNCRE1BcGt0TGVuOworCXBUeEluZm8tPlFTRUwgPSBRdWV1ZVNlbDsKKworCWlmIChRdWV1ZVNlbCAhPSBGSUZPX0VEQ0EpCisJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT09PT0+IFF1ZXVlU2VsICE9IEZJRk9fRURDQTw9PT09PT09XG4iKSk7CisKKwlwVHhJbmZvLT5VU0JETUFOZXh0VkxEID0gTmV4dFZhbGlkOworCXBUeEluZm8tPlVTQkRNQVR4YnVyc3QgPSBUeEJ1cnN0OworCXBUeEluZm8tPldJViA9IGJXaXY7CisJcFR4SW5mby0+U3dVc2VMYXN0Um91bmQgPSAwOworCXBUeEluZm8tPnJzdiA9IDA7CisJcFR4SW5mby0+cnN2MiA9IDA7CisKKwlyZXR1cm47Cit9CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKy8qIFRoZXJlIGFyZSB0d28gd2F5cyB0byBjb252ZXJ0IFJzc2kgKi8KKyNpZiAxCisvLworLy8gVGhlIHdheSB1c2VkIHdpdGggR0VUX0xOQV9HQUlOKCkuCisvLworQ0hBUiBBVEVDb252ZXJ0VG9Sc3NpKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOCUNIQVIJUnNzaSwKKwlJTiAgVUNIQVIgICBSc3NpTnVtYmVyKQoreworCVVDSEFSCVJzc2lPZmZzZXQsIExOQUdhaW47CisKKwkvLyBSc3NpIGVxdWFscyB0byB6ZXJvIHNob3VsZCBiZSBhbiBpbnZhbGlkIHZhbHVlCisJaWYgKFJzc2kgPT0gMCkKKwkJcmV0dXJuIC05OTsKKworCUxOQUdhaW4gPSBHRVRfTE5BX0dBSU4ocEFkKTsKKwlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsID4gMTQpCisJeworCQlpZiAoUnNzaU51bWJlciA9PSAwKQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QVJzc2lPZmZzZXQwOworCQllbHNlIGlmIChSc3NpTnVtYmVyID09IDEpCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5BUnNzaU9mZnNldDE7CisJCWVsc2UKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkFSc3NpT2Zmc2V0MjsKKwl9CisJZWxzZQorCXsKKwkJaWYgKFJzc2lOdW1iZXIgPT0gMCkKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkJHUnNzaU9mZnNldDA7CisJCWVsc2UgaWYgKFJzc2lOdW1iZXIgPT0gMSkKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkJHUnNzaU9mZnNldDE7CisJCWVsc2UKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkJHUnNzaU9mZnNldDI7CisJfQorCisJcmV0dXJuICgtMTIgLSBSc3NpT2Zmc2V0IC0gTE5BR2FpbiAtIFJzc2kpOworfQorI2Vsc2UKKy8vCisvLyBUaGUgd2F5IG9yaWdpbmFsbHkgdXNlZCBpbiBBVEUgb2YgcnQyODYwYXAuCisvLworQ0hBUiBBVEVDb252ZXJ0VG9Sc3NpKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOCUNIQVIJCQlSc3NpLAorCUlOICBVQ0hBUiAgIFJzc2lOdW1iZXIpCit7CisJVUNIQVIJUnNzaU9mZnNldCwgTE5BR2FpbjsKKworCS8vIFJzc2kgZXF1YWxzIHRvIHplcm8gc2hvdWxkIGJlIGFuIGludmFsaWQgdmFsdWUKKwlpZiAoUnNzaSA9PSAwKQorCQlyZXR1cm4gLTk5OworCisgICAgaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA+IDE0KQorICAgIHsKKyAgICAgICAgTE5BR2FpbiA9IHBBZC0+QUxOQUdhaW47CisgICAgICAgIGlmIChSc3NpTnVtYmVyID09IDApCisJCQlSc3NpT2Zmc2V0ID0gcEFkLT5BUnNzaU9mZnNldDA7CisJCWVsc2UgaWYgKFJzc2lOdW1iZXIgPT0gMSkKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkFSc3NpT2Zmc2V0MTsKKwkJZWxzZQorCQkJUnNzaU9mZnNldCA9IHBBZC0+QVJzc2lPZmZzZXQyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBMTkFHYWluID0gcEFkLT5CTE5BR2FpbjsKKyAgICAgICAgaWYgKFJzc2lOdW1iZXIgPT0gMCkKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkJHUnNzaU9mZnNldDA7CisJCWVsc2UgaWYgKFJzc2lOdW1iZXIgPT0gMSkKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkJHUnNzaU9mZnNldDE7CisJCWVsc2UKKwkJCVJzc2lPZmZzZXQgPSBwQWQtPkJHUnNzaU9mZnNldDI7CisgICAgfQorCisgICAgcmV0dXJuICgtMzIgLSBSc3NpT2Zmc2V0ICsgTE5BR2FpbiAtIFJzc2kpOworfQorI2VuZGlmIC8qIGVuZCBvZiAjaWYgMSAqLworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJU2V0IEphcGFuIGZpbHRlciBjb2VmZmljaWVudHMgaWYgbmVlZGVkLgorCU5vdGU6CisJCVRoaXMgcm91dGluZSBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbgorCQllbnRlcmluZyBUWEZSQU1FIG1vZGUgb3IgVFhDT05UIG1vZGUuCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgVk9JRCBTZXRKYXBhbkZpbHRlcigKKwlJTgkJUFJUTVBfQURBUFRFUglwQWQpCit7CisJVUNIQVIJCQlCYnBEYXRhID0gMDsKKworCS8vCisJLy8gSWYgQ2hhbm5lbD0xNCBhbmQgQmFuZHdpZHRoPTIwTSBhbmQgTW9kZT1DQ0ssIHNldCBCQlAgUjQgYml0NT0xCisJLy8gKEphcGFuIFR4IGZpbHRlciBjb2VmZmljaWVudHMpd2hlbiAoVFhGUkFNRSBvciBUWENPTlQpLgorCS8vCisJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCYnBEYXRhKTsKKworICAgIGlmICgocEFkLT5hdGUuVHhXSS5QSFlNT0RFID09IE1PREVfQ0NLKSAmJiAocEFkLT5hdGUuQ2hhbm5lbCA9PSAxNCkgJiYgKHBBZC0+YXRlLlR4V0kuQlcgPT0gQldfMjApKQorICAgIHsKKyAgICAgICAgQmJwRGF0YSB8PSAweDIwOyAgICAvLyB0dXJuIG9uCisgICAgICAgIEFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldEphcGFuRmlsdGVyISEhXG4iKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJCUJicERhdGEgJj0gMHhkZjsgICAgLy8gdHVybiBvZmYKKwkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2xlYXJKYXBhbkZpbHRlciEhIVxuIikpOworICAgIH0KKworCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQmJwRGF0YSk7Cit9CisKK1ZPSUQgQVRFU2FtcGxlUnNzaSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBQUlhXSV9TVFJVQwkJcFJ4V0kpCit7CisJLyogVGhlcmUgYXJlIHR3byB3YXlzIHRvIGNvbGxlY3QgUlNTSS4gKi8KKyNpZiAxCisJLy9wQWQtPkxhc3RSeFJhdGUgPSAoVVNIT1JUKSgocFJ4V0ktPk1DUykgKyAocFJ4V0ktPkJXIDw8NykgKyAocFJ4V0ktPlNob3J0R0kgPDw4KSsgKHBSeFdJLT5QSFlNT0RFIDw8MTQpKSA7CisJaWYgKHBSeFdJLT5SU1NJMCAhPSAwKQorCXsKKwkJcEFkLT5hdGUuTGFzdFJzc2kwCT0gQVRFQ29udmVydFRvUnNzaShwQWQsIChDSEFSKSBwUnhXSS0+UlNTSTAsIFJTU0lfMCk7CisJCXBBZC0+YXRlLkF2Z1Jzc2kwWDgJPSAocEFkLT5hdGUuQXZnUnNzaTBYOCAtIHBBZC0+YXRlLkF2Z1Jzc2kwKSArIHBBZC0+YXRlLkxhc3RSc3NpMDsKKwkJcEFkLT5hdGUuQXZnUnNzaTAgIAk9IHBBZC0+YXRlLkF2Z1Jzc2kwWDggPj4gMzsKKwl9CisJaWYgKHBSeFdJLT5SU1NJMSAhPSAwKQorCXsKKwkJcEFkLT5hdGUuTGFzdFJzc2kxCT0gQVRFQ29udmVydFRvUnNzaShwQWQsIChDSEFSKSBwUnhXSS0+UlNTSTEsIFJTU0lfMSk7CisJCXBBZC0+YXRlLkF2Z1Jzc2kxWDgJPSAocEFkLT5hdGUuQXZnUnNzaTFYOCAtIHBBZC0+YXRlLkF2Z1Jzc2kxKSArIHBBZC0+YXRlLkxhc3RSc3NpMTsKKwkJcEFkLT5hdGUuQXZnUnNzaTEJPSBwQWQtPmF0ZS5BdmdSc3NpMVg4ID4+IDM7CisJfQorCWlmIChwUnhXSS0+UlNTSTIgIT0gMCkKKwl7CisJCXBBZC0+YXRlLkxhc3RSc3NpMgk9IEFURUNvbnZlcnRUb1Jzc2kocEFkLCAoQ0hBUikgcFJ4V0ktPlJTU0kyLCBSU1NJXzIpOworCQlwQWQtPmF0ZS5BdmdSc3NpMlg4CT0gKHBBZC0+YXRlLkF2Z1Jzc2kyWDggLSBwQWQtPmF0ZS5BdmdSc3NpMikgKyBwQWQtPmF0ZS5MYXN0UnNzaTI7CisJCXBBZC0+YXRlLkF2Z1Jzc2kyCT0gcEFkLT5hdGUuQXZnUnNzaTJYOCA+PiAzOworCX0KKworCXBBZC0+YXRlLkxhc3RTTlIwID0gKENIQVIpKHBSeFdJLT5TTlIwKTsvLyBDSEFSID09PiBVQ0hBUiA/CisJcEFkLT5hdGUuTGFzdFNOUjEgPSAoQ0hBUikocFJ4V0ktPlNOUjEpOy8vIENIQVIgPT0+IFVDSEFSID8KKworCXBBZC0+YXRlLk51bU9mQXZnUnNzaVNhbXBsZSArKzsKKyNlbHNlCisJcEFkLT5hdGUuTGFzdFNOUjAgPSAoQ0hBUikocFJ4V0ktPlNOUjApOworCXBBZC0+YXRlLkxhc3RTTlIxID0gKENIQVIpKHBSeFdJLT5TTlIxKTsKKwlwQWQtPmF0ZS5SeENudFBlclNlYysrOworCXBBZC0+YXRlLkxhc3RSc3NpMCA9IEFURUNvbnZlcnRUb1Jzc2kocEFkLCAoQ0hBUikgcFJ4V0ktPlJTU0kwLCBSU1NJXzApOworCXBBZC0+YXRlLkxhc3RSc3NpMSA9IEFURUNvbnZlcnRUb1Jzc2kocEFkLCAoQ0hBUikgcFJ4V0ktPlJTU0kxLCBSU1NJXzEpOworCXBBZC0+YXRlLkxhc3RSc3NpMiA9IEFURUNvbnZlcnRUb1Jzc2kocEFkLCAoQ0hBUikgcFJ4V0ktPlJTU0kyLCBSU1NJXzIpOworCXBBZC0+YXRlLkF2Z1Jzc2kwWDggPSAocEFkLT5hdGUuQXZnUnNzaTBYOCAtIHBBZC0+YXRlLkF2Z1Jzc2kwKSArIHBBZC0+YXRlLkxhc3RSc3NpMDsKKwlwQWQtPmF0ZS5BdmdSc3NpMCA9IHBBZC0+YXRlLkF2Z1Jzc2kwWDggPj4gMzsKKwlwQWQtPmF0ZS5BdmdSc3NpMVg4ID0gKHBBZC0+YXRlLkF2Z1Jzc2kxWDggLSBwQWQtPmF0ZS5BdmdSc3NpMSkgKyBwQWQtPmF0ZS5MYXN0UnNzaTE7CisJcEFkLT5hdGUuQXZnUnNzaTEgPSBwQWQtPmF0ZS5BdmdSc3NpMVg4ID4+IDM7CisJcEFkLT5hdGUuQXZnUnNzaTJYOCA9IChwQWQtPmF0ZS5BdmdSc3NpMlg4IC0gcEFkLT5hdGUuQXZnUnNzaTIpICsgcEFkLT5hdGUuTGFzdFJzc2kyOworCXBBZC0+YXRlLkF2Z1Jzc2kyID0gcEFkLT5hdGUuQXZnUnNzaTJYOCA+PiAzOworCXBBZC0+YXRlLk51bU9mQXZnUnNzaVNhbXBsZSArKzsKKyNlbmRpZgorfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitWT0lEIFJUTVBTdGF0aW9uU3RvcCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCkKK3sKKy8vCUJPT0xFQU4gICAgICAgQ2FuY2VsbGVkOworCisgICAgQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IFJUTVBTdGF0aW9uU3RvcFxuIikpOworCisjaWYgMAorCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkFzc29jVGltZXIsICAgICAgJkNhbmNlbGxlZCk7CisJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLCAgICAmQ2FuY2VsbGVkKTsKKwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLCAgICZDYW5jZWxsZWQpOworCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwgICAgICAgJkNhbmNlbGxlZCk7CisJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsICAgICAmQ2FuY2VsbGVkKTsKKwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsICAgICAgICZDYW5jZWxsZWQpOworI2VuZGlmCisJLy8gRm9yIHJ4IHN0YXRpc3RpY3MsIHdlIG5lZWQgdG8ga2VlcCB0aGlzIHRpbWVyIHJ1bm5pbmcuCisvLwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5QZXJpb2RpY1RpbWVyLCAgICAgICZDYW5jZWxsZWQpOworCisgICAgQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IFJUTVBTdGF0aW9uU3RvcFxuIikpOworfQorCitWT0lEIFJUTVBTdGF0aW9uU3RhcnQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpCit7CisgICAgQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IFJUTVBTdGF0aW9uU3RhcnRcbiIpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gUlRNUFN0YXRpb25TdGFydFxuIikpOworfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVNldHVwIEZyYW1lIGZvcm1hdC4KKwlOT1RFOgorCQlUaGlzIHJvdXRpbmUgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiBBVEUgbW9kZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpZmRlZiBSVDI4NzAKKy8qPT09PT09PT09PT09PT09PT09PT09PVN0YXJ0IG9mIFJUMjg3MD09PT09PT09PT09PT09PT09PT09PT0qLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3N0YXRpYyBJTlQgQVRFU2V0VXBGcmFtZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVSU5UMzIgVHhJZHgpCit7CisJVUlOVCBqOworCVBUWF9DT05URVhUCXBOdWxsQ29udGV4dDsKKwlQVUNIQVIJCQlwRGVzdDsKKwlIVFRSQU5TTUlUX1NFVFRJTkcJVHhIVFBoeU1vZGU7CisJUFRYV0lfU1RSVUMJCXBUeFdJOworCVBUWElORk9fU1RSVUMJCXBUeEluZm87CisJVUlOVDMyCQkJVHJhbnNmZXJCdWZmZXJMZW5ndGgsIE9yZ0J1ZmZlckxlbmd0aCA9IDA7CisJVUNIQVIJCQlwYWRMZW4gPSAwOworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJUEhFQURFUl84MDJfMTEJcEhlYWRlcjgwMjExID0gTlVMTDsKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCisJaWYgKChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpKSB8fAorCQkoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpKSB8fAorCQkoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKSB8fAorCQkoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKKwl7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBXZSBhbHdheXMgdXNlIFFJRF9BQ19CRSBhbmQgRklGT19FRENBIGluIEFURSBtb2RlLiAqLworCisJcE51bGxDb250ZXh0ID0gJihwQWQtPk51bGxDb250ZXh0KTsKKwlBU1NFUlQocE51bGxDb250ZXh0ICE9IE5VTEwpOworCisJaWYgKHBOdWxsQ29udGV4dC0+SW5Vc2UgPT0gRkFMU0UpCisJeworCQkvLyBTZXQgdGhlIGluIHVzZSBiaXQKKwkJcE51bGxDb250ZXh0LT5JblVzZSA9IFRSVUU7CisJCU5kaXNaZXJvTWVtb3J5KCYocEFkLT5OdWxsRnJhbWUpLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCisJCS8vIEZpbGwgODAyLjExIGhlYWRlci4KKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCQlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKQorCQl7CisJCQlwSGVhZGVyODAyMTEgPSBOZGlzTW92ZU1lbW9yeSgmKHBBZC0+TnVsbEZyYW1lKSwgcEFkLT5hdGUuSGVhZGVyLCBwQWQtPmF0ZS5ITGVuKTsKKy8vCQkJcERlc3QgPSBOZGlzTW92ZU1lbW9yeSgmKHBBZC0+TnVsbEZyYW1lKSwgcEFkLT5hdGUuSGVhZGVyLCBwQWQtPmF0ZS5ITGVuKTsKKy8vCQkJcEhlYWRlcjgwMjExID0gKFBIRUFERVJfODAyXzExKXBEZXN0OworCQl9CisJCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworCQl7CisJCQkvLyBGaWxsIDgwMi4xMSBoZWFkZXIuCisJCQlOZGlzTW92ZU1lbW9yeSgmKHBBZC0+TnVsbEZyYW1lKSwgVGVtcGxhdGVGcmFtZSwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwkJfQorI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUikmKHBBZC0+TnVsbEZyYW1lKSwgRElSX1JFQUQsIEZBTFNFKTsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCQlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKQorCQl7CisJCQkvKiBtb2RpZnkgc2VxdWVuY2UgbnVtYmVyLi4uLiAqLworCQkJaWYgKHBBZC0+YXRlLlR4RG9uZUNvdW50ID09IDApCisJCQl7CisJCQkJcEFkLT5hdGUuc2VxID0gcEhlYWRlcjgwMjExLT5TZXF1ZW5jZTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlwSGVhZGVyODAyMTEtPlNlcXVlbmNlID0gKytwQWQtPmF0ZS5zZXE7CisJCQl9CisJCQkvKiBXZSBhbHJlYWR5IGdvdCBhbGwgdGhlIGFkZHIuIGZpZWxkcyBmcm9tIFFBIEdVSS4gKi8KKwkJfQorCQllbHNlCisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKwkJeworCQkJQ09QWV9NQUNfQUREUihwQWQtPk51bGxGcmFtZS5BZGRyMSwgcEFkLT5hdGUuQWRkcjEpOworCQkJQ09QWV9NQUNfQUREUihwQWQtPk51bGxGcmFtZS5BZGRyMiwgcEFkLT5hdGUuQWRkcjIpOworCQkJQ09QWV9NQUNfQUREUihwQWQtPk51bGxGcmFtZS5BZGRyMywgcEFkLT5hdGUuQWRkcjMpOworCQl9CisKKwkJUlRNUFplcm9NZW1vcnkoJnBBZC0+TnVsbENvbnRleHQuVHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0WzBdLCBUWF9CVUZGRVJfTk9STVNJWkUpOy8vPz8/CisJCXBUeEluZm8gPSAoUFRYSU5GT19TVFJVQykmcEFkLT5OdWxsQ29udGV4dC5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbMF07CisKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCQlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKQorCQl7CisJCQkvLyBBdm9pZCB0byBleGNlZWQgdGhlIHJhbmdlIG9mIFdpcmVsZXNzUGFja2V0W10uCisJCQlBU1NFUlQocEFkLT5hdGUuVHhJbmZvLlVTQkRNQVR4UGt0TGVuIDw9IChNQVhfRlJBTUVfU0laRSAtIDM0LyogPT0gMjMxMiAqLykpOworCQkJTmRpc01vdmVNZW1vcnkocFR4SW5mbywgJihwQWQtPmF0ZS5UeEluZm8pLCBzaXplb2YocEFkLT5hdGUuVHhJbmZvKSk7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisJCXsKKwkJCS8vIEF2b2lkIHRvIGV4Y2VlZCB0aGUgcmFuZ2Ugb2YgV2lyZWxlc3NQYWNrZXRbXS4KKwkJCUFTU0VSVChwQWQtPmF0ZS5UeExlbmd0aCA8PSAoTUFYX0ZSQU1FX1NJWkUgLSAzNC8qID09IDIzMTIgKi8pKTsKKworCQkJLy8gcFR4SW5mby0+VVNCRE1BVHhQa3RMZW4gd2lsbCBiZSB1cGRhdGVkIHRvIGluY2x1ZGUgcGFkZGluZyBsYXRlci4KKwkJCUFURVdyaXRlVHhJbmZvKHBBZCwgcFR4SW5mbywgKFVTSE9SVCkoVFhXSV9TSVpFICsgcEFkLT5hdGUuVHhMZW5ndGgpLCBUUlVFLCBFcFRvUXVldWVbTUdNVFBJUEVJRFhdLCBGQUxTRSwgIEZBTFNFKTsKKwkJCXBUeEluZm8tPlFTRUwgPSBGSUZPX0VEQ0E7CisJCX0KKworCQlwVHhXSSA9IChQVFhXSV9TVFJVQykmcEFkLT5OdWxsQ29udGV4dC5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbVFhJTkZPX1NJWkVdOworCisJCS8vIEZpbGwgVHhXSS4KKwkJaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKKwkJeworCQkJVHhIVFBoeU1vZGUuZmllbGQuQlcgPSBwQWQtPmF0ZS5UeFdJLkJXOworCQkJVHhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IHBBZC0+YXRlLlR4V0kuU2hvcnRHSTsKKwkJCVR4SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSBwQWQtPmF0ZS5UeFdJLlNUQkM7CisJCQlUeEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwQWQtPmF0ZS5UeFdJLk1DUzsKKwkJCVR4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBwQWQtPmF0ZS5UeFdJLlBIWU1PREU7CisJCQlBVEVXcml0ZVR4V0kocEFkLCBwVHhXSSwgcEFkLT5hdGUuVHhXSS5GUkFHLCBwQWQtPmF0ZS5UeFdJLlRTLCBwQWQtPmF0ZS5UeFdJLkFNUERVLCBwQWQtPmF0ZS5UeFdJLkFDSywgcEFkLT5hdGUuVHhXSS5OU0VRLAorCQkJCXBBZC0+YXRlLlR4V0kuQkFXaW5TaXplLCBCU1NJRF9XQ0lELCBwQWQtPmF0ZS5UeFdJLk1QRFV0b3RhbEJ5dGVDb3VudC8qIGluY2x1ZGUgODAyLjExIGhlYWRlciAqLywgcEFkLT5hdGUuVHhXSS5QYWNrZXRJZCwgMCwgcEFkLT5hdGUuVHhXSS50eG9wLypJRlNfSFRUWE9QKi8sIHBBZC0+YXRlLlR4V0kuQ0ZBQ0svKkZBTFNFKi8sIFR4SFRQaHlNb2RlKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVR4SFRQaHlNb2RlLmZpZWxkLkJXID0gcEFkLT5hdGUuVHhXSS5CVzsKKwkJCVR4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBwQWQtPmF0ZS5UeFdJLlNob3J0R0k7CisJCQlUeEhUUGh5TW9kZS5maWVsZC5TVEJDID0gMDsKKwkJCVR4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBBZC0+YXRlLlR4V0kuTUNTOworCQkJVHhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IHBBZC0+YXRlLlR4V0kuUEhZTU9ERTsKKworCQkJQVRFV3JpdGVUeFdJKHBBZCwgcFR4V0ksICBGQUxTRSwgRkFMU0UsIEZBTFNFLCBGQUxTRS8qIE5vIGFjayByZXF1aXJlZC4gKi8sIEZBTFNFLCAwLCBCU1NJRF9XQ0lELCBwQWQtPmF0ZS5UeExlbmd0aCwKKwkJCQkwLCAwLCBJRlNfSFRUWE9QLCBGQUxTRSwgVHhIVFBoeU1vZGUpOy8vICJNTVBTX1NUQVRJQyIgaW5zdGVhZCBvZiAiTU1QU19EWU5BTUlDIiA/Pz8KKwkJfQorCisJCVJUTVBNb3ZlTWVtb3J5KCZwQWQtPk51bGxDb250ZXh0LlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtUWElORk9fU0laRStUWFdJX1NJWkVdLCAmcEFkLT5OdWxsRnJhbWUsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisKKwkJcERlc3QgPSAmKHBBZC0+TnVsbENvbnRleHQuVHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0W1RYSU5GT19TSVpFK1RYV0lfU0laRStzaXplb2YoSEVBREVSXzgwMl8xMSldKTsKKworCQkvLyBQcmVwYXJlIGZyYW1lIHBheWxvYWQKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCQlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKQorCQl7CisJCQkvLyBjb3B5IHBhdHRlcm4KKwkJCWlmICgocEFkLT5hdGUuUExlbiAhPSAwKSkKKwkJCXsKKwkJCQlmb3IgKGogPSAwOyBqIDwgcEFkLT5hdGUuRExlbjsgais9cEFkLT5hdGUuUExlbikKKwkJCQl7CisJCQkJCVJUTVBNb3ZlTWVtb3J5KHBEZXN0LCBwQWQtPmF0ZS5QYXR0ZXJuLCBwQWQtPmF0ZS5QTGVuKTsKKwkJCQkJcERlc3QgKz0gcEFkLT5hdGUuUExlbjsKKwkJCQl9CisJCQl9CisJCQlUcmFuc2ZlckJ1ZmZlckxlbmd0aCA9IFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgcEFkLT5hdGUuVHhXSS5NUERVdG90YWxCeXRlQ291bnQ7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisJCXsKKwkJICAgIGZvciAoaiA9IDA7IGogPCAocEFkLT5hdGUuVHhMZW5ndGggLSBzaXplb2YoSEVBREVSXzgwMl8xMSkpOyBqKyspCisJCSAgICB7CisJCQkJKnBEZXN0ID0gMHhBNTsKKwkJCQlwRGVzdCArPSAxOworCQkgICAgfQorCQkJVHJhbnNmZXJCdWZmZXJMZW5ndGggPSBUWElORk9fU0laRSArIFRYV0lfU0laRSArIHBBZC0+YXRlLlR4TGVuZ3RoOworCQl9CisKKyNpZiAxCisJCU9yZ0J1ZmZlckxlbmd0aCA9IFRyYW5zZmVyQnVmZmVyTGVuZ3RoOworCQlUcmFuc2ZlckJ1ZmZlckxlbmd0aCA9IChUcmFuc2ZlckJ1ZmZlckxlbmd0aCArIDMpICYgKH4zKTsKKworCQkvLyBBbHdheXMgYWRkIDQgZXh0cmEgYnl0ZXMgYXQgZXZlcnkgcGFja2V0LgorCQlwYWRMZW4gPSBUcmFuc2ZlckJ1ZmZlckxlbmd0aCAtIE9yZ0J1ZmZlckxlbmd0aCArIDQ7LyogNCA9PSBsYXN0IHBhY2tldCBwYWRkaW5nICovCisJCUFTU0VSVCgocGFkTGVuIDw9IChSVE1QX1BLVF9UQUlMX1BBRERJTkcgLSA0LyogNCA9PSBNYXhCdWxrT3V0c2l6ZSBhbGlnbm1lbnQgcGFkZGluZyAqLykpKTsKKworCQkvKiBOb3cgbWVtemVybyBhbGwgZXh0cmEgcGFkZGluZyBieXRlcy4gKi8KKwkJTmRpc1plcm9NZW1vcnkocERlc3QsIHBhZExlbik7CisJCXBEZXN0ICs9IHBhZExlbjsKKyNlbHNlCisJCWlmICgoVHJhbnNmZXJCdWZmZXJMZW5ndGggJSA0KSA9PSAxKQorCQl7CisJCQlOZGlzWmVyb01lbW9yeShwRGVzdCwgNyk7CisJCQlwRGVzdCArPSA3OworCQkJVHJhbnNmZXJCdWZmZXJMZW5ndGggICs9IDM7CisJCX0KKwkJZWxzZSBpZiAoKFRyYW5zZmVyQnVmZmVyTGVuZ3RoICUgNCkgPT0gMikKKwkJeworCQkJTmRpc1plcm9NZW1vcnkocERlc3QsIDYpOworCQkJcERlc3QgKz0gNjsKKwkJCVRyYW5zZmVyQnVmZmVyTGVuZ3RoICArPSAyOworCQl9CisJCWVsc2UgaWYgKChUcmFuc2ZlckJ1ZmZlckxlbmd0aCAlIDQpID09IDMpCisJCXsKKwkJCU5kaXNaZXJvTWVtb3J5KHBEZXN0LCA1KTsKKwkJCXBEZXN0ICs9IDU7CisJCQlUcmFuc2ZlckJ1ZmZlckxlbmd0aCAgKz0gMTsKKwkJfQorI2VuZGlmIC8vIDEgLy8KKworCQkvLyBVcGRhdGUgcFR4SW5mby0+VVNCRE1BVHhQa3RMZW4gdG8gaW5jbHVkZSBwYWRkaW5nLgorCQlwVHhJbmZvLT5VU0JETUFUeFBrdExlbiA9IFRyYW5zZmVyQnVmZmVyTGVuZ3RoIC0gVFhJTkZPX1NJWkU7CisKKwkJVHJhbnNmZXJCdWZmZXJMZW5ndGggKz0gNDsKKworCQkvLyBJZiBUcmFuc2ZlckJ1ZmZlckxlbmd0aCBpcyBtdWx0aXBsZSBvZiA2NCwgYWRkIGV4dHJhIDQgYnl0ZXMgYWdhaW4uCisJCWlmICgoVHJhbnNmZXJCdWZmZXJMZW5ndGggJSBwQWQtPkJ1bGtPdXRNYXhQYWNrZXRTaXplKSA9PSAwKQorCQl7CisJCQlOZGlzWmVyb01lbW9yeShwRGVzdCwgNCk7CisJCQlUcmFuc2ZlckJ1ZmZlckxlbmd0aCArPSA0OworCQl9CisKKwkJLy8gRmlsbCBvdXQgZnJhbWUgbGVuZ3RoIGluZm9ybWF0aW9uIGZvciBnbG9iYWwgQnVsayBvdXQgYXJiaXRvcgorCQlwQWQtPk51bGxDb250ZXh0LkJ1bGtPdXRTaXplID0gVHJhbnNmZXJCdWZmZXJMZW5ndGg7CisJfQorI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlSVE1QV0lFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhXSSwgVFlQRV9UWFdJKTsKKwlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoKChQVUNIQVIpcFR4SW5mbykrVFhXSV9TSVpFK1RYSU5GT19TSVpFKSwgRElSX1dSSVRFLCBGQUxTRSk7CisgICAgUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhJbmZvLCBUWVBFX1RYSU5GTyk7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCXJldHVybiAwOworfQorCitWT0lEIEFURV9SVFVTQkJ1bGtPdXREYXRhUGFja2V0Q29tcGxldGUocHVyYmJfdCBwVXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncykKK3sKKwlQUlRNUF9BREFQVEVSCQlwQWQ7CisJUFRYX0NPTlRFWFQJCSAgICBwTnVsbENvbnRleHQ7CisJVUNIQVIJCQkJQnVsa091dFBpcGVJZDsKKwlOVFNUQVRVUwkJCVN0YXR1czsKKwl1bnNpZ25lZCBsb25nCQlJcnFGbGFnczsKKwlVTE9ORwkJCSAgICBPbGRWYWx1ZTsKKworCXBOdWxsQ29udGV4dCA9IChQVFhfQ09OVEVYVClwVXJiLT5jb250ZXh0OworCXBBZCA9IHBOdWxsQ29udGV4dC0+cEFkOworCisKKwkvLyBSZXNldCBOdWxsIGZyYW1lIGNvbnRleHQgZmxhZ3MKKwlwTnVsbENvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwlwTnVsbENvbnRleHQtPkluVXNlID0gRkFMU0U7CisJU3RhdHVzID0gcFVyYi0+c3RhdHVzOworCisJLy8gU3RvcmUgQnVsa091dCBQaXBlSWQKKwlCdWxrT3V0UGlwZUlkID0gcE51bGxDb250ZXh0LT5CdWxrT3V0UGlwZUlkOworCXBBZC0+QnVsa091dERhdGFPbmVTZWNDb3VudCsrOworCisJaWYgKFN0YXR1cyA9PSBVU0JfU1RfTk9FUlJPUikKKwl7CisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwkJaWYgKChBVEVfT04ocEFkKSkgJiYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkpCisJCXsKKwkJCWlmIChwQWQtPmF0ZS5RSUQgPT0gQnVsa091dFBpcGVJZCkKKwkJCXsKKwkJCQkvLyBMZXQgUnggY2FuIGhhdmUgYSBjaGFuY2UgdG8gYnJlYWsgaW4gZHVyaW5nIFR4IHByb2Nlc3MsCisJCQkJLy8gZXNwZWNpYWxseSBmb3IgbG9vcGJhY2sgbW9kZSBpbiBRQSBBVEUuCisJCQkJLy8gVG8gdHJhZGUgb2ZmIGJldHdlZW4gdHggcGVyZm9ybWFuY2UgYW5kIGxvb3BiYWNrIG1vZGUgaW50ZWdyaXR5LgorCQkJCS8qIFEgICA6IE5vdyBSeCBpcyBoYW5kbGVkIGJ5IHRhc2tsZXQsIGRvIHdlIHN0aWxsIG5lZWQgdGhpcyBkZWxheSA/ICovCisJCQkJLyogQW5zIDogRXZlbiB0YXNrbGV0IGlzIHVzZWQsIFJ4L1R4IDwgMSBpZiB3ZSBkbyBub3QgZGVsYXkgZm9yIGEgd2hpbGUgcmlnaHQgaGVyZS4gKi8KKwkJCQlSVE1QdXNlY0RlbGF5KDUwMCk7CisJCQkJcEFkLT5hdGUuVHhEb25lQ291bnQrKzsKKwkJCQlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7CisJCQkJQVNTRVJUKHBBZC0+YXRlLlFJRCA9PSAwKTsKKwkJCQlwQWQtPmF0ZS5UeEFjMCsrOworCQkJfQorCQl9CisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKwkJcEFkLT5CdWxrT3V0Q29tcGxldGUrKzsKKworCQlwQWQtPkNvdW50ZXJzODAyMy5Hb29kVHJhbnNtaXRzKys7CisKKwkJLyogRG9uJ3Qgd29ycnkgYWJvdXQgdGhlIHF1ZXVlIGlzIGVtcHR5IG9yIG5vdC4gVGhpcyBmdW5jdGlvbiB3aWxsIGNoZWNrIGl0c2VsZi4gKi8KKwkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBUUlVFLCBCdWxrT3V0UGlwZUlkLCBNQVhfVFhfUFJPQ0VTUyk7CisKKwkJLyogSW4gMjh4eCwgU2VuZFR4V2FpdFF1ZXVlID09PiBUeFN3UXVldWUgICovCisvKgorCQlpZiAocEFkLT5TZW5kVHhXYWl0UXVldWVbQnVsa091dFBpcGVJZF0uTnVtYmVyID4gMCkKKwkJeworCQkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBCdWxrT3V0UGlwZUlkKTsKKwkJfQorKi8KKwl9CisJZWxzZQkvLyBTVEFUVVNfT1RIRVIKKwl7CisJCXBBZC0+QnVsa091dENvbXBsZXRlT3RoZXIrKzsKKworCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJCdWxrT3V0RGF0YVBhY2tldCBGYWlsZWQgU1RBVFVTX09USEVSID0gMHgleCAuIFxuIiwgU3RhdHVzKSk7CisJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIj4+QnVsa091dFJlcT0weCVseCwgQnVsa091dENvbXBsZXRlPTB4JWx4XG4iLCBwQWQtPkJ1bGtPdXRSZXEsIHBBZC0+QnVsa091dENvbXBsZXRlKSk7CisKKwkJaWYgKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKSAmJgorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpICYmCisJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKSkpCisJCXsKKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpOworCQkJLyogSW4gMjh4eCwgUlRfT0lEX1VTQl9SRVNFVF9CVUxLX09VVCA9PT4gQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VUICovCisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCwgTlVMTCwgMCk7CisJCQkvLyBDaGVjaworCQkJQlVMS19PVVRfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCQkJcEFkLT5CdWxrT3V0UGVuZGluZ1tCdWxrT3V0UGlwZUlkXSA9IEZBTFNFOworCQkJcEFkLT5idWxrUmVzZXRQaXBlaWQgPSBCdWxrT3V0UGlwZUlkOworCQkJQlVMS19PVVRfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKworCisJaWYgKGF0b21pY19yZWFkKCZwQWQtPkJ1bGtPdXRSZW1haW5lZCkgPiAwKQorCXsKKwkJYXRvbWljX2RlYygmcEFkLT5CdWxrT3V0UmVtYWluZWQpOworCX0KKworCS8vIDFzdCAtIFRyYW5zbWl0IFN1Y2Nlc3MKKwlPbGRWYWx1ZSA9IHBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC51Lkxvd1BhcnQ7CisJcEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LnUuTG93UGFydCsrOworCisJaWYgKHBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC51Lkxvd1BhcnQgPCBPbGRWYWx1ZSkKKwl7CisJCXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC51LkhpZ2hQYXJ0Kys7CisJfQorCisJaWYoKChwQWQtPkNvbnRpbkJ1bGtPdXQgPT0gVFJVRSApIHx8KGF0b21pY19yZWFkKCZwQWQtPkJ1bGtPdXRSZW1haW5lZCkgPiAwKSkgJiYgKHBBZC0+YXRlLk1vZGUgJiBBVEVfVFhGUkFNRSkpCisJeworCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfQVRFKTsKKwl9CisJZWxzZQorCXsKKwkJUlRVU0JfQ0xFQVJfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfQVRFKTsKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCQlwQWQtPmF0ZS5UeFN0YXR1cyA9IDA7CisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKwl9CisKKwlCVUxLX09VVF9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisJcEFkLT5CdWxrT3V0UGVuZGluZ1tCdWxrT3V0UGlwZUlkXSA9IEZBTFNFOworCUJVTEtfT1VUX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCisJLy8gQWx3YXlzIGNhbGwgQnVsayByb3V0aW5lLCBldmVuIHJlc2V0IGJ1bGsuCisJLy8gVGhlIHByb3RlY3Rpb24gb2YgcmVzdCBidWxrIHNob3VsZCBiZSBpbiBCdWxrT3V0IHJvdXRpbmUuCisJUlRVU0JLaWNrQnVsa091dChwQWQpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFURV9SVFVTQkJ1bGtPdXREYXRhUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJQnVsa091dFBpcGVJZCkKK3sKKwlQVFhfQ09OVEVYVAkJcE51bGxDb250ZXh0ID0gJihwQWQtPk51bGxDb250ZXh0KTsKKwlQVVJCCQkJcFVyYjsKKwlpbnQJCQkJcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nCUlycUZsYWdzOworCisKKwlBU1NFUlQoQnVsa091dFBpcGVJZCA9PSAwKTsKKworCS8qIEJ1aWxkIHVwIHRoZSBmcmFtZSBmaXJzdC4gKi8KKy8vCUFURVNldFVwRnJhbWUocEFkLCAwKTsKKworCUJVTEtfT1VUX0xPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKworCWlmIChwQWQtPkJ1bGtPdXRQZW5kaW5nW0J1bGtPdXRQaXBlSWRdID09IFRSVUUpCisJeworCQlCVUxLX09VVF9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCXBBZC0+QnVsa091dFBlbmRpbmdbQnVsa091dFBpcGVJZF0gPSBUUlVFOworCUJVTEtfT1VUX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOworCisJLy8gSW5jcmVhc2UgVG90YWwgdHJhbnNtaXQgYnl0ZSBjb3VudGVyCisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUcmFuc21pdHRlZEJ5dGVDb3VudCArPSAgcE51bGxDb250ZXh0LT5CdWxrT3V0U2l6ZTsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQnl0ZUNvdW50ICs9ICBwTnVsbENvbnRleHQtPkJ1bGtPdXRTaXplOworCisJLy8gQ2xlYXIgQVRFIGZyYW1lIGJ1bGsgb3V0IGZsYWcKKwlSVFVTQl9DTEVBUl9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9BVEUpOworCisJLy8gSW5pdCBUeCBjb250ZXh0IGRlc2NyaXB0b3IKKwlwTnVsbENvbnRleHQtPklSUFBlbmRpbmcgPSBUUlVFOworCVJUVVNCSW5pdFR4RGVzYyhwQWQsIHBOdWxsQ29udGV4dCwgQnVsa091dFBpcGVJZCwgKHVzYl9jb21wbGV0ZV90KUFURV9SVFVTQkJ1bGtPdXREYXRhUGFja2V0Q29tcGxldGUpOworCXBVcmIgPSBwTnVsbENvbnRleHQtPnBVcmI7CisKKwlpZigocmV0ID0gUlRVU0JfU1VCTUlUX1VSQihwVXJiKSkhPTApCisJeworCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBVEVfUlRVU0JCdWxrT3V0RGF0YVBhY2tldDogU3VibWl0IFR4IFVSQiBmYWlsZWQgJWRcbiIsIHJldCkpOworCQlyZXR1cm47CisJfQorCisJcEFkLT5CdWxrT3V0UmVxKys7CisJcmV0dXJuOworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQVRFX1JUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3sKKwlQUlhfQ09OVEVYVAkJcFJ4Q29udGV4dDsKKwlVSU5UCQkJaTsKKworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tLT5BVEVfUlRVU0JDYW5jZWxQZW5kaW5nQnVsa0luSVJQXG4iKSk7CisjaWYgMQorCWZvciAoIGkgPSAwOyBpIDwgKFJYX1JJTkdfU0laRSk7IGkrKykKKwl7CisJCXBSeENvbnRleHQgPSAmKHBBZC0+UnhDb250ZXh0W2ldKTsKKwkJaWYocFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9PSBUUlVFKQorCQl7CisJCQlSVFVTQl9VTkxJTktfVVJCKHBSeENvbnRleHQtPnBVcmIpOworCQkJcFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCQkJcFJ4Q29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKKwkJCS8vTmRpc0ludGVybG9ja2VkRGVjcmVtZW50KCZwQWQtPlBlbmRpbmdSeCk7CisJCQkvL3BBZC0+UGVuZGluZ1J4LS07CisJCX0KKwl9CisjZWxzZQorCWZvciAoIGkgPSAwOyBpIDwgKFJYX1JJTkdfU0laRSk7IGkrKykKKwl7CisJCXBSeENvbnRleHQgPSAmKHBBZC0+UnhDb250ZXh0W2ldKTsKKwkJaWYoYXRvbWljX3JlYWQoJnBSeENvbnRleHQtPklycExvY2spID09IElSUExPQ0tfQ0FOQ0VMQUJMRSkKKwkJeworCQkJUlRVU0JfVU5MSU5LX1VSQihwUnhDb250ZXh0LT5wVXJiKTsKKwkJfQorCQlJbnRlcmxvY2tlZEV4Y2hhbmdlKCZwUnhDb250ZXh0LT5JcnBMb2NrLCBJUlBMT0NLX0NBTkNFX1NUQVJUKTsKKwl9CisjZW5kaWYgLy8gMSAvLworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLS1BVEVfUlRVU0JDYW5jZWxQZW5kaW5nQnVsa0luSVJQXG4iKSk7CisJcmV0dXJuOworfQorI2VuZGlmIC8vIFJUMjg3MCAvLworCitWT0lEIHJ0X2VlX3JlYWRfYWxsKFBSVE1QX0FEQVBURVIgcEFkLCBVU0hPUlQgKkRhdGEpCit7CisJVVNIT1JUIGk7CisJVVNIT1JUIHZhbHVlOworCisJZm9yIChpID0gMCA7IGkgPCBFRVBST01fU0laRS8yIDsgKQorCXsKKwkJLyogInZhbHVlIiBpcyBleHBlY2lhbGx5IGZvciBzb21lIGNvbXBpbGVycy4uLiAqLworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIGkqMiwgdmFsdWUpOworCQlEYXRhW2ldID0gdmFsdWU7CisJCWkrKzsKKwl9Cit9CisKK1ZPSUQgcnRfZWVfd3JpdGVfYWxsKFBSVE1QX0FEQVBURVIgcEFkLCBVU0hPUlQgKkRhdGEpCit7CisJVVNIT1JUIGk7CisJVVNIT1JUIHZhbHVlOworCisJZm9yIChpID0gMCA7IGkgPCBFRVBST01fU0laRS8yIDsgKQorCXsKKwkJLyogInZhbHVlIiBpcyBleHBlY2lhbGx5IGZvciBzb21lIGNvbXBpbGVycy4uLiAqLworCQl2YWx1ZSA9IERhdGFbaV07CisJCVJUMjh4eF9FRVBST01fV1JJVEUxNihwQWQsIGkqMiwgdmFsdWUpOworCQlpICsrOworCX0KK30KKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorVk9JRCBBVEVfUUFfU3RhdGlzdGljcygKKwlJTiBQUlRNUF9BREFQVEVSCQkJcEFkLAorCUlOIFBSWFdJX1NUUlVDCQkJCXBSeFdJLAorCUlOIFBSVDI4WFhfUlhEX1NUUlVDCQlwUnhELAorCUlOIFBIRUFERVJfODAyXzExCQkJcEhlYWRlcikKK3sKKwkvLyB1cGRhdGUgY291bnRlciBmaXJzdAorCWlmIChwSGVhZGVyICE9IE5VTEwpCisJeworCQlpZiAocEhlYWRlci0+RkMuVHlwZSA9PSBCVFlQRV9EQVRBKQorCQl7CisJCQlpZiAocFJ4RC0+VTJNKQorCQkJCXBBZC0+YXRlLlUyTSsrOworCQkJZWxzZQorCQkJCXBBZC0+YXRlLk90aGVyRGF0YSsrOworCQl9CisJCWVsc2UgaWYgKHBIZWFkZXItPkZDLlR5cGUgPT0gQlRZUEVfTUdNVCkKKwkJeworCQkJaWYgKHBIZWFkZXItPkZDLlN1YlR5cGUgPT0gU1VCVFlQRV9CRUFDT04pCisJCQkJcEFkLT5hdGUuQmVhY29uKys7CisJCQllbHNlCisJCQkJcEFkLT5hdGUuT3RoZXJDb3VudCsrOworCQl9CisJCWVsc2UgaWYgKHBIZWFkZXItPkZDLlR5cGUgPT0gQlRZUEVfQ05UTCkKKwkJeworCQkJcEFkLT5hdGUuT3RoZXJDb3VudCsrOworCQl9CisJfQorCXBBZC0+YXRlLlJTU0kwID0gcFJ4V0ktPlJTU0kwOworCXBBZC0+YXRlLlJTU0kxID0gcFJ4V0ktPlJTU0kxOworCXBBZC0+YXRlLlJTU0kyID0gcFJ4V0ktPlJTU0kyOworCXBBZC0+YXRlLlNOUjAgPSBwUnhXSS0+U05SMDsKKwlwQWQtPmF0ZS5TTlIxID0gcFJ4V0ktPlNOUjE7Cit9CisKKy8qIGNvbW1hbmQgaWQgd2l0aCBDbWQgVHlwZSA9PSAweDAwMDgoZm9yIDI4eHgpLzB4MDAwNShmb3IgaU5JQykgKi8KKyNkZWZpbmUgUkFDRkdfQ01EX1JGX1dSSVRFX0FMTAkJMHgwMDAwCisjZGVmaW5lIFJBQ0ZHX0NNRF9FMlBST01fUkVBRDE2CQkweDAwMDEKKyNkZWZpbmUgUkFDRkdfQ01EX0UyUFJPTV9XUklURTE2CTB4MDAwMgorI2RlZmluZSBSQUNGR19DTURfRTJQUk9NX1JFQURfQUxMCTB4MDAwMworI2RlZmluZSBSQUNGR19DTURfRTJQUk9NX1dSSVRFX0FMTAkweDAwMDQKKyNkZWZpbmUgUkFDRkdfQ01EX0lPX1JFQUQJCQkweDAwMDUKKyNkZWZpbmUgUkFDRkdfQ01EX0lPX1dSSVRFCQkJMHgwMDA2CisjZGVmaW5lIFJBQ0ZHX0NNRF9JT19SRUFEX0JVTEsJCTB4MDAwNworI2RlZmluZSBSQUNGR19DTURfQkJQX1JFQUQ4CQkJMHgwMDA4CisjZGVmaW5lIFJBQ0ZHX0NNRF9CQlBfV1JJVEU4CQkweDAwMDkKKyNkZWZpbmUgUkFDRkdfQ01EX0JCUF9SRUFEX0FMTAkJMHgwMDBhCisjZGVmaW5lIFJBQ0ZHX0NNRF9HRVRfQ09VTlRFUgkJMHgwMDBiCisjZGVmaW5lIFJBQ0ZHX0NNRF9DTEVBUl9DT1VOVEVSCQkweDAwMGMKKworI2RlZmluZSBSQUNGR19DTURfUlNWMQkJCQkweDAwMGQKKyNkZWZpbmUgUkFDRkdfQ01EX1JTVjIJCQkJMHgwMDBlCisjZGVmaW5lIFJBQ0ZHX0NNRF9SU1YzCQkJCTB4MDAwZgorCisjZGVmaW5lIFJBQ0ZHX0NNRF9UWF9TVEFSVAkJCTB4MDAxMAorI2RlZmluZSBSQUNGR19DTURfR0VUX1RYX1NUQVRVUwkJMHgwMDExCisjZGVmaW5lIFJBQ0ZHX0NNRF9UWF9TVE9QCQkJMHgwMDEyCisjZGVmaW5lIFJBQ0ZHX0NNRF9SWF9TVEFSVAkJCTB4MDAxMworI2RlZmluZSBSQUNGR19DTURfUlhfU1RPUAkJCTB4MDAxNAorI2RlZmluZSBSQUNGR19DTURfR0VUX05PSVNFX0xFVkVMCTB4MDAxNQorCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU1RBUlQJCQkweDAwODAKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TVE9QCQkJMHgwMDgxCisKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DQVJSSUVSCQkweDAxMDAKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DT05UCQkJMHgwMTAxCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfRlJBTUUJCTB4MDEwMgorI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9CVwkgICAgICAgICAgICAweDAxMDMKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIwCSAgICAgICAgMHgwMTA0CisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMQkJCTB4MDEwNQorI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9GUkVRX09GRlNFVAkJMHgwMTA2CisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfR0VUX1NUQVRJU1RJQ1MJCTB4MDEwNworI2RlZmluZSBSQUNGR19DTURfQVRFX1JFU0VUX0NPVU5URVIJCQkweDAxMDgKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRUxfVFhfQU5URU5OQQkJMHgwMTA5CisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VMX1JYX0FOVEVOTkEJCTB4MDEwYQorI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9QUkVBTUJMRQkJCTB4MDEwYgorI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9DSEFOTkVMCQkJMHgwMTBjCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIxCQkJCTB4MDEwZAorI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9BRERSMgkJCQkweDAxMGUKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfQUREUjMJCQkJMHgwMTBmCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX1JBVEUJCQkJMHgwMTEwCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0xFTgkJMHgwMTExCisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0NPVU5UCTB4MDExMgorI2RlZmluZSBSQUNGR19DTURfQVRFX1NUQVJUX1JYX0ZSQU1FCQkweDAxMTMKKyNkZWZpbmUgUkFDRkdfQ01EX0FURV9FMlBST01fUkVBRF9CVUxLCTB4MDExNAorI2RlZmluZSBSQUNGR19DTURfQVRFX0UyUFJPTV9XUklURV9CVUxLCTB4MDExNQorI2RlZmluZSBSQUNGR19DTURfQVRFX0lPX1dSSVRFX0JVTEsJCTB4MDExNgorI2RlZmluZSBSQUNGR19DTURfQVRFX0JCUF9SRUFEX0JVTEsJCTB4MDExNworI2RlZmluZSBSQUNGR19DTURfQVRFX0JCUF9XUklURV9CVUxLCTB4MDExOAorI2RlZmluZSBSQUNGR19DTURfQVRFX1JGX1JFQURfQlVMSwkJMHgwMTE5CisjZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfUkZfV1JJVEVfQlVMSwkJMHgwMTFhCisKKworCisjZGVmaW5lIEEySGV4KF9YLCBfcCkgCQkJCVwKK3sJCQkJCQkJCQlcCisJVUNIQVIgKnA7CQkJCQkJXAorCV9YID0gMDsJCQkJCQkJXAorCXAgPSBfcDsJCQkJCQkJXAorCXdoaWxlICgoKCpwID49ICdhJykgJiYgKCpwIDw9ICdmJykpIHx8ICgoKnAgPj0gJ0EnKSAmJiAoKnAgPD0gJ0YnKSkgfHwgKCgqcCA+PSAnMCcpICYmICgqcCA8PSAnOScpKSkJCVwKKwl7CQkJCQkJCQkJCQkJXAorCQlpZiAoKCpwID49ICdhJykgJiYgKCpwIDw9ICdmJykpCQkJCVwKKwkJCV9YID0gX1ggKiAxNiArICpwIC0gODc7CQkJCQlcCisJCWVsc2UgaWYgKCgqcCA+PSAnQScpICYmICgqcCA8PSAnRicpKQkJXAorCQkJX1ggPSBfWCAqIDE2ICsgKnAgLSA1NTsJCQkJCVwKKwkJZWxzZSBpZiAoKCpwID49ICcwJykgJiYgKCpwIDw9ICc5JykpCQlcCisJCQlfWCA9IF9YICogMTYgKyAqcCAtIDQ4OwkJCQkJXAorCQlwKys7CQkJCQkJCQkJCVwKKwl9CQkJCQkJCQkJCQkJXAorfQorCisKK3N0YXRpYyBWT0lEIG1lbWNweV9leGwoUFJUTVBfQURBUFRFUiBwQWQsIFVDSEFSICpkc3QsIFVDSEFSICpzcmMsIFVMT05HIGxlbik7CitzdGF0aWMgVk9JRCBtZW1jcHlfZXhzKFBSVE1QX0FEQVBURVIgcEFkLCBVQ0hBUiAqZHN0LCBVQ0hBUiAqc3JjLCBVTE9ORyBsZW4pOworc3RhdGljIFZPSUQgUlRNUF9JT19SRUFEX0JVTEsoUFJUTVBfQURBUFRFUiBwQWQsIFVDSEFSICpkc3QsIFVDSEFSICpzcmMsIFVJTlQzMiBsZW4pOworCisjaWZkZWYgVUNPUworaW50IGF0ZV9jb3B5X3RvX3VzZXIoCisJSU4gUFVDSEFSIHBheWxvYWQsCisJSU4gUFVDSEFSIG1zZywKKwlJTiBJTlQgICAgbGVuKQoreworCW1lbW1vdmUocGF5bG9hZCwgbXNnLCBsZW4pOworCXJldHVybiAwOworfQorCisjdW5kZWYJY29weV90b191c2VyCisjZGVmaW5lIGNvcHlfdG9fdXNlcih4LHkseikgYXRlX2NvcHlfdG9fdXNlcigoUFVDSEFSKXgsIChQVUNIQVIpeSwgeikKKyNlbmRpZiAvLyBVQ09TIC8vCisKKyNkZWZpbmUJTEVOX09GX0FSRyAxNgorCitWT0lEIFJ0bXBEb0F0ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCXN0cnVjdCBpd3JlcQkqd3JxKQoreworCXVuc2lnbmVkIHNob3J0IENvbW1hbmRfSWQ7CisJc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnOworCUlOVAlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCisKKworCWlmKChwUmFDZmcgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXRlX3JhY2ZnaGRyKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJeworCQlTdGF0dXMgPSAtRUlOVkFMOworCQlyZXR1cm47CisJfQorCisJTmRpc1plcm9NZW1vcnkocFJhQ2ZnLCBzaXplb2Yoc3RydWN0IGF0ZV9yYWNmZ2hkcikpOworCisgICAgaWYgKGNvcHlfZnJvbV91c2VyKChQVUNIQVIpcFJhQ2ZnLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorCXsKKwkJU3RhdHVzID0gLUVGQVVMVDsKKwkJa2ZyZWUocFJhQ2ZnKTsKKwkJcmV0dXJuOworCX0KKworCisJQ29tbWFuZF9JZCA9IG50b2hzKHBSYUNmZy0+Y29tbWFuZF9pZCk7CisKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlxuJXM6IENvbW1hbmRfSWQgPSAweCUwNHggIVxuIiwgX19mdW5jX18sIENvbW1hbmRfSWQpKTsKKworCXN3aXRjaCAoQ29tbWFuZF9JZCkKKwl7CisgCQkvLyBXZSB3aWxsIGdldCB0aGlzIGNvbW1hbmQgd2hlbiBRQSBzdGFydHMuCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TVEFSVDoKKwkJCXsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU1RBUlRcbiIpKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sgYXMgc29vbiBhcyB3ZSBjYW4gdG8gYXZvaWQgUUEgdGltZW91dC4KKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ3cnEtPnUuZGF0YS5sZW5ndGggPSAlZFxuIiwgd3JxLT51LmRhdGEubGVuZ3RoKSk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NUQVJUXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU1RBUlQgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIkFURVNUQVJUIik7CisJCQl9CisJCQlicmVhazsKKworIAkJLy8gV2Ugd2lsbCBnZXQgdGhpcyBjb21tYW5kIGVpdGhlciBRQSBpcyBjbG9zZWQgb3IgYXRlZCBpcyBraWxsZWQgYnkgdXNlci4KKwkJY2FzZSBSQUNGR19DTURfQVRFX1NUT1A6CisJCQl7CisjaWZuZGVmIFVDT1MKKwkJCQlJTlQzMiByZXQ7CisjZW5kaWYgLy8gIVVDT1MgLy8KKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TVE9QXG4iKSk7CisKKwkJCQkvLyBEaXN0aW5ndWlzaCB0aGlzIGNvbW1hbmQgY2FtZSBmcm9tIFFBKHZpYSBhdGVkKQorCQkJCS8vIG9yIGF0ZSBkYWVtb24gYWNjb3JkaW5nIHRvIHRoZSBleGlzdGVuY2Ugb2YgcGlkIGluIHBheWxvYWQuCisJCQkJLy8gTm8gbmVlZCB0byBwcmVwYXJlIGZlZWRiYWNrIGlmIHRoaXMgY21kIGNhbWUgZGlyZWN0bHkgZnJvbSBhdGUgZGFlbW9uLgorCQkJCXBSYUNmZy0+bGVuZ3RoID0gbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisJCQkJaWYgKHBSYUNmZy0+bGVuZ3RoID09IHNpemVvZihwQWRhcHRlci0+YXRlLkF0ZVBpZCkpCisJCQkJeworCQkJCQkvLyBUaGlzIGNvbW1hbmQgY2FtZSBmcm9tIFFBLgorCQkJCQkvLyBHZXQgdGhlIHBpZCBvZiBBVEUgZGFlbW9uLgorCQkJCQltZW1jcHkoKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuQXRlUGlkLAorCQkJCQkJKCZwUmFDZmctPmRhdGFbMF0pIC0gMi8qID09ICYocFJhQ2ZnLT5zdGF0dXMpICovLAorCQkJCQkJc2l6ZW9mKHBBZGFwdGVyLT5hdGUuQXRlUGlkKSk7CisKKwkJCQkJLy8gcHJlcGFyZSBmZWVkYmFjayBhcyBzb29uIGFzIHdlIGNhbiB0byBhdm9pZCBRQSB0aW1lb3V0LgorCQkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCisJCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIndycS0+dS5kYXRhLmxlbmd0aCA9ICVkXG4iLCB3cnEtPnUuZGF0YS5sZW5ndGgpKTsKKworCSAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKwkgICAgICAgICAgICAJeworCSAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU1RPUFxuIikpOworCSAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKwkgICAgICAgICAgICAJfQorCisJCQkJCS8vCisJCQkJCS8vIGtpbGwgQVRFIGRhZW1vbiB3aGVuIGxlYXZpbmcgQVRFIG1vZGUuCisJCQkJCS8vIFdlIG11c3Qga2lsbCBBVEUgZGFlbW9uIGZpcnN0IGJlZm9yZSBzZXR0aW5nIEFURVNUT1AsCisJCQkJCS8vIG9yIE1pY3Jvc29mdCB3aWxsIHJlcG9ydCBzdGguIHdyb25nLgorI2lmbmRlZiBVQ09TCisJCQkJCXJldCA9IEtJTExfVEhSRUFEX1BJRChwQWRhcHRlci0+YXRlLkF0ZVBpZCwgU0lHVEVSTSwgMSk7CisJCQkJCWlmIChyZXQpCisJCQkJCXsKKwkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiB1bmFibGUgdG8gc2lnbmFsIHRocmVhZFxuIiwgcEFkYXB0ZXItPm5ldF9kZXYtPm5hbWUpKTsKKwkJCQkJfQorI2VuZGlmIC8vICFVQ09TIC8vCisJCQkJfQorCisJCQkJLy8gQVAgbWlnaHQgaGF2ZSBpbiBBVEVfU1RPUCBtb2RlIGR1ZSB0byBjbWQgZnJvbSBRQS4KKwkJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCQl7CisJCQkJCS8vIFNvbWVvbmUgaGFzIGtpbGxlZCBhdGUgZGFlbW9uIHdoaWxlIFFBIEdVSSBpcyBzdGlsbCBvcGVuLgorCQkJCQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJBVEVTVE9QIik7CisJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BUF9TVEFSVCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9SRl9XUklURV9BTEw6CisJCQl7CisJCQkJVUlOVDMyIFIxLCBSMiwgUjMsIFI0OworCQkJCVVTSE9SVCBjaGFubmVsOworCisJCQkJbWVtY3B5KCZSMSwgcFJhQ2ZnLT5kYXRhLTIsIDQpOworCQkJCW1lbWNweSgmUjIsIHBSYUNmZy0+ZGF0YSsyLCA0KTsKKwkJCQltZW1jcHkoJlIzLCBwUmFDZmctPmRhdGErNiwgNCk7CisJCQkJbWVtY3B5KCZSNCwgcFJhQ2ZnLT5kYXRhKzEwLCA0KTsKKwkJCQltZW1jcHkoJmNoYW5uZWwsIHBSYUNmZy0+ZGF0YSsxNCwgMik7CisKKwkJCQlwQWRhcHRlci0+TGF0Y2hSZlJlZ3MuUjEgPSBudG9obChSMSk7CisJCQkJcEFkYXB0ZXItPkxhdGNoUmZSZWdzLlIyID0gbnRvaGwoUjIpOworCQkJCXBBZGFwdGVyLT5MYXRjaFJmUmVncy5SMyA9IG50b2hsKFIzKTsKKwkJCQlwQWRhcHRlci0+TGF0Y2hSZlJlZ3MuUjQgPSBudG9obChSNCk7CisJCQkJcEFkYXB0ZXItPkxhdGNoUmZSZWdzLkNoYW5uZWwgPSBudG9ocyhjaGFubmVsKTsKKworCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWRhcHRlciwgcEFkYXB0ZXItPkxhdGNoUmZSZWdzLlIxKTsKKwkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkYXB0ZXIsIHBBZGFwdGVyLT5MYXRjaFJmUmVncy5SMik7CisJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZGFwdGVyLCBwQWRhcHRlci0+TGF0Y2hSZlJlZ3MuUjMpOworCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWRhcHRlciwgcEFkYXB0ZXItPkxhdGNoUmZSZWdzLlI0KTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ3cnEtPnUuZGF0YS5sZW5ndGggPSAlZFxuIiwgd3JxLT51LmRhdGEubGVuZ3RoKSk7CisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX1JGX1dSSVRFX0FMTFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfUkZfV1JJVEVfQUxMIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKyAgICAgICAgICAgIGJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0UyUFJPTV9SRUFEMTY6CisJCQl7CisJCQkJVVNIT1JUCW9mZnNldCwgdmFsdWUsIHRtcDsKKworCQkJCW9mZnNldCA9IG50b2hzKHBSYUNmZy0+c3RhdHVzKTsKKwkJCQkvKiAidG1wIiBpcyBleHBlY2lhbGx5IGZvciBzb21lIGNvbXBpbGVycy4uLiAqLworCQkJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZGFwdGVyLCBvZmZzZXQsIHRtcCk7CisJCQkJdmFsdWUgPSB0bXA7CisJCQkJdmFsdWUgPSBodG9ucyh2YWx1ZSk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkVFUFJPTSBSZWFkIG9mZnNldCA9IDB4JTA0eCwgdmFsdWUgPSAweCUwNHhcbiIsIG9mZnNldCwgdmFsdWUpKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDQpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJbWVtY3B5KHBSYUNmZy0+ZGF0YSwgJnZhbHVlLCAyKTsKKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInNpemVvZihzdHJ1Y3QgYXRlX3JhY2ZnaGRyKSA9ICVkXG4iLCBzaXplb2Yoc3RydWN0IGF0ZV9yYWNmZ2hkcikpKTsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ3cnEtPnUuZGF0YS5sZW5ndGggPSAlZFxuIiwgd3JxLT51LmRhdGEubGVuZ3RoKSk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfRTJQUk9NX1JFQUQxNlxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfRTJQUk9NX1JFQUQxNiBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisgICAgICAgICAgIAl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9FMlBST01fV1JJVEUxNjoKKwkJCXsKKwkJCQlVU0hPUlQJb2Zmc2V0LCB2YWx1ZTsKKworCQkJCW9mZnNldCA9IG50b2hzKHBSYUNmZy0+c3RhdHVzKTsKKwkJCQltZW1jcHkoJnZhbHVlLCBwUmFDZmctPmRhdGEsIDIpOworCQkJCXZhbHVlID0gbnRvaHModmFsdWUpOworCQkJCVJUMjh4eF9FRVBST01fV1JJVEUxNihwQWRhcHRlciwgb2Zmc2V0LCB2YWx1ZSk7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9FMlBST01fV1JJVEUxNlxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfRTJQUk9NX1dSSVRFMTYgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfRTJQUk9NX1JFQURfQUxMOgorCQkJeworCQkJCVVTSE9SVCBidWZmZXJbRUVQUk9NX1NJWkUvMl07CisKKwkJCQlydF9lZV9yZWFkX2FsbChwQWRhcHRlciwoVVNIT1JUICopYnVmZmVyKTsKKwkJCQltZW1jcHlfZXhzKHBBZGFwdGVyLCBwUmFDZmctPmRhdGEsIChVQ0hBUiAqKWJ1ZmZlciwgRUVQUk9NX1NJWkUpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMitFRVBST01fU0laRSk7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfRTJQUk9NX1JFQURfQUxMXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9FMlBST01fUkVBRF9BTEwgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfRTJQUk9NX1dSSVRFX0FMTDoKKwkJCXsKKwkJCQlVU0hPUlQgYnVmZmVyW0VFUFJPTV9TSVpFLzJdOworCisJCQkJTmRpc1plcm9NZW1vcnkoKFVDSEFSICopYnVmZmVyLCBFRVBST01fU0laRSk7CisJCQkJbWVtY3B5X2V4cyhwQWRhcHRlciwgKFVDSEFSICopYnVmZmVyLCAoVUNIQVIgKikmcFJhQ2ZnLT5zdGF0dXMsIEVFUFJPTV9TSVpFKTsKKwkJCQlydF9lZV93cml0ZV9hbGwocEFkYXB0ZXIsKFVTSE9SVCAqKWJ1ZmZlcik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9FMlBST01fV1JJVEVfQUxMXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJBQ0ZHX0NNRF9FMlBST01fV1JJVEVfQUxMIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfSU9fUkVBRDoKKwkJCXsKKwkJCQlVSU5UMzIJb2Zmc2V0OworCQkJCVVJTlQzMgl2YWx1ZTsKKworCQkJCW1lbWNweSgmb2Zmc2V0LCAmcFJhQ2ZnLT5zdGF0dXMsIDQpOworCQkJCW9mZnNldCA9IG50b2hsKG9mZnNldCk7CisKKwkJCQkvLyBXZSBkbyBub3QgbmVlZCB0aGUgYmFzZSBhZGRyZXNzLgorCQkJCS8vIFNvIGp1c3QgZXh0cmFjdCB0aGUgb2Zmc2V0IG91dC4KKwkJCQlvZmZzZXQgJj0gMHgwMDAwRkZGRjsKKwkJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgb2Zmc2V0LCAmdmFsdWUpOworCQkJCXZhbHVlID0gaHRvbmwodmFsdWUpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoNik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQltZW1jcHkocFJhQ2ZnLT5kYXRhLCAmdmFsdWUsIDQpOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0lPX1JFQURcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0lPX1JFQUQgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfSU9fV1JJVEU6CisJCQl7CisJCQkJVUlOVDMyCW9mZnNldCwgdmFsdWU7CisKKwkJCQltZW1jcHkoJm9mZnNldCwgcFJhQ2ZnLT5kYXRhLTIsIDQpOworCQkJCW1lbWNweSgmdmFsdWUsIHBSYUNmZy0+ZGF0YSsyLCA0KTsKKworCQkJCW9mZnNldCA9IG50b2hsKG9mZnNldCk7CisKKwkJCQkvLyBXZSBkbyBub3QgbmVlZCB0aGUgYmFzZSBhZGRyZXNzLgorCQkJCS8vIFNvIGp1c3QgZXh0cmFjdCBvdXQgdGhlIG9mZnNldC4KKwkJCQlvZmZzZXQgJj0gMHgwMDAwRkZGRjsKKwkJCQl2YWx1ZSA9IG50b2hsKHZhbHVlKTsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9JT19XUklURTogb2Zmc2V0ID0gJXgsIHZhbHVlID0gJXhcbiIsIG9mZnNldCwgdmFsdWUpKTsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIG9mZnNldCwgdmFsdWUpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfSU9fV1JJVEVcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0lPX1dSSVRFIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0lPX1JFQURfQlVMSzoKKwkJCXsKKwkJCQlVSU5UMzIJb2Zmc2V0OworCQkJCVVTSE9SVAlsZW47CisKKwkJCQltZW1jcHkoJm9mZnNldCwgJnBSYUNmZy0+c3RhdHVzLCA0KTsKKwkJCQlvZmZzZXQgPSBudG9obChvZmZzZXQpOworCisJCQkJLy8gV2UgZG8gbm90IG5lZWQgdGhlIGJhc2UgYWRkcmVzcy4KKwkJCQkvLyBTbyBqdXN0IGV4dHJhY3QgdGhlIG9mZnNldC4KKwkJCQlvZmZzZXQgJj0gMHgwMDAwRkZGRjsKKwkJCQltZW1jcHkoJmxlbiwgcFJhQ2ZnLT5kYXRhKzIsIDIpOworCQkJCWxlbiA9IG50b2hzKGxlbik7CisKKwkJCQlpZiAobGVuID4gMzcxKQorCQkJCXsKKwkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJsZW4gaXMgdG9vIGxhcmdlLCBtYWtlIGl0IHNtYWxsZXJcbiIpKTsKKwkJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygxKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJUlRNUF9JT19SRUFEX0JVTEsocEFkYXB0ZXIsIHBSYUNmZy0+ZGF0YSwgKFVDSEFSICopb2Zmc2V0LCBsZW4qNCk7Ly8gdW5pdCBpbiBmb3VyIGJ5dGVzCisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyK2xlbio0KTsvLyB1bml0IGluIGZvdXIgYnl0ZXMKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9JT19SRUFEX0JVTEtcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0lPX1JFQURfQlVMSyBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9CQlBfUkVBRDg6CisJCQl7CisJCQkJVVNIT1JUCW9mZnNldDsKKwkJCQlVQ0hBUgl2YWx1ZTsKKworCQkJCXZhbHVlID0gMDsKKwkJCQlvZmZzZXQgPSBudG9ocyhwUmFDZmctPnN0YXR1cyk7CisKKwkJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCQl7CisJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBvZmZzZXQsICAmdmFsdWUpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIG9mZnNldCwgICZ2YWx1ZSk7CisJCQkJfQorCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDMpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJcFJhQ2ZnLT5kYXRhWzBdID0gdmFsdWU7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJCUCB2YWx1ZSA9ICV4XG4iLCB2YWx1ZSkpOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0JCUF9SRUFEOFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQkJQX1JFQUQ4IGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFJBQ0ZHX0NNRF9CQlBfV1JJVEU4OgorCQkJeworCQkJCVVTSE9SVAlvZmZzZXQ7CisJCQkJVUNIQVIJdmFsdWU7CisKKwkJCQlvZmZzZXQgPSBudG9ocyhwUmFDZmctPnN0YXR1cyk7CisJCQkJbWVtY3B5KCZ2YWx1ZSwgcFJhQ2ZnLT5kYXRhLCAxKTsKKworCQkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJCXsKKwkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBvZmZzZXQsICB2YWx1ZSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIG9mZnNldCwgIHZhbHVlKTsKKwkJCQl9CisKKwkJCQlpZiAoKG9mZnNldCA9PSBCQlBfUjEpIHx8IChvZmZzZXQgPT0gQkJQX1IzKSkKKwkJCQl7CisJCQkJCVN5bmNUeFJ4Q29uZmlnKHBBZGFwdGVyLCBvZmZzZXQsIHZhbHVlKTsKKwkJCQl9CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9CQlBfV1JJVEU4XG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9CQlBfV1JJVEU4IGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0JCUF9SRUFEX0FMTDoKKwkJCXsKKwkJCQlVU0hPUlQgajsKKworCQkJCWZvciAoaiA9IDA7IGogPCAxMzc7IGorKykKKwkJCQl7CisJCQkJCXBSYUNmZy0+ZGF0YVtqXSA9IDA7CisKKwkJCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQkJCXsKKwkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBqLCAgJnBSYUNmZy0+ZGF0YVtqXSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGosICAmcFJhQ2ZnLT5kYXRhW2pdKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIrMTM3KTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0JCUF9SRUFEX0FMTFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQkJQX1JFQURfQUxMIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKworCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX0UyUFJPTV9SRUFEX0JVTEs6CisJCXsKKwkJCVVTSE9SVCBvZmZzZXQ7CisJCQlVU0hPUlQgbGVuOworCQkJVVNIT1JUIGJ1ZmZlcltFRVBST01fU0laRS8yXTsKKworCQkJb2Zmc2V0ID0gbnRvaHMocFJhQ2ZnLT5zdGF0dXMpOworCQkJbWVtY3B5KCZsZW4sIHBSYUNmZy0+ZGF0YSwgMik7CisJCQlsZW4gPSBudG9ocyhsZW4pOworCisJCQlydF9lZV9yZWFkX2FsbChwQWRhcHRlciwoVVNIT1JUICopYnVmZmVyKTsKKwkJCWlmIChvZmZzZXQgKyBsZW4gPD0gRUVQUk9NX1NJWkUpCisJCQkJbWVtY3B5X2V4cyhwQWRhcHRlciwgcFJhQ2ZnLT5kYXRhLCAoVUNIQVIgKilidWZmZXIrb2Zmc2V0LCBsZW4pOworCQkJZWxzZQorCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImV4Y2VlZCBFRVBST00gc2l6ZVxuIikpOworCisJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIrbGVuKTsKKwkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX0UyUFJPTV9SRUFEX0JVTEtcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorCQkJZWxzZQorCQkJeworICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfRTJQUk9NX1JFQURfQlVMSyBpcyBkb25lICFcbiIpKTsKKwkJCX0KKworCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfRTJQUk9NX1dSSVRFX0JVTEs6CisJCXsKKwkJCVVTSE9SVCBvZmZzZXQ7CisJCQlVU0hPUlQgbGVuOworCQkJVVNIT1JUIGJ1ZmZlcltFRVBST01fU0laRS8yXTsKKworCQkJb2Zmc2V0ID0gbnRvaHMocFJhQ2ZnLT5zdGF0dXMpOworCQkJbWVtY3B5KCZsZW4sIHBSYUNmZy0+ZGF0YSwgMik7CisJCQlsZW4gPSBudG9ocyhsZW4pOworCisJCQlydF9lZV9yZWFkX2FsbChwQWRhcHRlciwoVVNIT1JUICopYnVmZmVyKTsKKwkJCW1lbWNweV9leHMocEFkYXB0ZXIsIChVQ0hBUiAqKWJ1ZmZlciArIG9mZnNldCwgKFVDSEFSICopcFJhQ2ZnLT5kYXRhICsgMiwgbGVuKTsKKwkJCXJ0X2VlX3dyaXRlX2FsbChwQWRhcHRlciwoVVNIT1JUICopYnVmZmVyKTsKKworCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfRTJQUk9NX1dSSVRFX0JVTEtcbiIpKTsKKyAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorCQkJZWxzZQorCQkJeworICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJBQ0ZHX0NNRF9BVEVfRTJQUk9NX1dSSVRFX0JVTEsgaXMgZG9uZSAhXG4iKSk7CisJCQl9CisKKwkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX0lPX1dSSVRFX0JVTEs6CisJCXsKKwkJCVVJTlQzMiBvZmZzZXQsIGksIHZhbHVlOworCQkJVVNIT1JUIGxlbjsKKworCQkJbWVtY3B5KCZvZmZzZXQsICZwUmFDZmctPnN0YXR1cywgNCk7CisJCQlvZmZzZXQgPSBudG9obChvZmZzZXQpOworCQkJbWVtY3B5KCZsZW4sIHBSYUNmZy0+ZGF0YSsyLCAyKTsKKwkJCWxlbiA9IG50b2hzKGxlbik7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkKKwkJCXsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAoVUNIQVIgKikmdmFsdWUsIHBSYUNmZy0+ZGF0YSs0K2ksIDQpOworCQkJCXByaW50aygiV3JpdGUgJXggJXhcbiIsIG9mZnNldCArIGksIHZhbHVlKTsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIChvZmZzZXQgK2kpICYgMHhmZmZmLCB2YWx1ZSk7CisJCQl9CisKKwkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX0lPX1dSSVRFX0JVTEtcbiIpKTsKKyAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorCQkJZWxzZQorCQkJeworICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJBQ0ZHX0NNRF9BVEVfSU9fV1JJVEVfQlVMSyBpcyBkb25lICFcbiIpKTsKKwkJCX0KKworCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfQkJQX1JFQURfQlVMSzoKKwkJeworCQkJVVNIT1JUIG9mZnNldDsKKwkJCVVTSE9SVCBsZW47CisJCQlVU0hPUlQgajsKKworCQkJb2Zmc2V0ID0gbnRvaHMocFJhQ2ZnLT5zdGF0dXMpOworCQkJbWVtY3B5KCZsZW4sIHBSYUNmZy0+ZGF0YSwgMik7CisJCQlsZW4gPSBudG9ocyhsZW4pOworCisKKwkJCWZvciAoaiA9IG9mZnNldDsgaiA8IChvZmZzZXQrbGVuKTsgaisrKQorCQkJeworCQkJCXBSYUNmZy0+ZGF0YVtqIC0gb2Zmc2V0XSA9IDA7CisKKwkJCQlpZiAocEFkYXB0ZXItPmF0ZS5Nb2RlID09IEFURV9TVE9QKQorCQkJCXsKKwkJCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBqLCAgJnBSYUNmZy0+ZGF0YVtqIC0gb2Zmc2V0XSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBqLCAgJnBSYUNmZy0+ZGF0YVtqIC0gb2Zmc2V0XSk7CisJCQkJfQorCQkJfQorCisJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIrbGVuKTsKKwkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICBpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9CQlBfUkVBRF9CVUxLXG4iKSk7CisgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKwkJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX0JCUF9SRUFEX0JVTEsgaXMgZG9uZSAhXG4iKSk7CisJCQl9CisKKwkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX0JCUF9XUklURV9CVUxLOgorCQl7CisJCQlVU0hPUlQgb2Zmc2V0OworCQkJVVNIT1JUIGxlbjsKKwkJCVVTSE9SVCBqOworCQkJVUNIQVIgKnZhbHVlOworCisJCQlvZmZzZXQgPSBudG9ocyhwUmFDZmctPnN0YXR1cyk7CisJCQltZW1jcHkoJmxlbiwgcFJhQ2ZnLT5kYXRhLCAyKTsKKwkJCWxlbiA9IG50b2hzKGxlbik7CisKKwkJCWZvciAoaiA9IG9mZnNldDsgaiA8IChvZmZzZXQrbGVuKTsgaisrKQorCQkJeworCQkJCXZhbHVlID0gcFJhQ2ZnLT5kYXRhICsgMiArIChqIC0gb2Zmc2V0KTsKKwkJCQlpZiAocEFkYXB0ZXItPmF0ZS5Nb2RlID09IEFURV9TVE9QKQorCQkJCXsKKwkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgaiwgICp2YWx1ZSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgaiwgICp2YWx1ZSk7CisJCQkJfQorCQkJfQorCisJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX0JCUF9XUklURV9CVUxLXG4iKSk7CisgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKwkJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX0JCUF9XUklURV9CVUxLIGlzIGRvbmUgIVxuIikpOworCQkJfQorCQl9CisJCQlicmVhazsKKworI2lmZGVmIENPTkZJR19SQUxJTktfUlQzMDUyCisJCWNhc2UgUkFDRkdfQ01EX0FURV9SRl9SRUFEX0JVTEs6CisJCXsKKwkJCVVTSE9SVCBvZmZzZXQ7CisJCQlVU0hPUlQgbGVuOworCQkJVVNIT1JUIGo7CisKKwkJCW9mZnNldCA9IG50b2hzKHBSYUNmZy0+c3RhdHVzKTsKKwkJCW1lbWNweSgmbGVuLCBwUmFDZmctPmRhdGEsIDIpOworCQkJbGVuID0gbnRvaHMobGVuKTsKKworCQkJZm9yIChqID0gb2Zmc2V0OyBqIDwgKG9mZnNldCtsZW4pOyBqKyspCisJCQl7CisJCQkJcFJhQ2ZnLT5kYXRhW2ogLSBvZmZzZXRdID0gMDsKKwkJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWRhcHRlciwgaiwgICZwUmFDZmctPmRhdGFbaiAtIG9mZnNldF0pOworCQkJfQorCisJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIrbGVuKTsKKwkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICBpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9SRl9SRUFEX0JVTEtcbiIpKTsKKyAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorCQkJZWxzZQorCQkJeworICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfUkZfUkVBRF9CVUxLIGlzIGRvbmUgIVxuIikpOworCQkJfQorCisJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9SRl9XUklURV9CVUxLOgorCQl7CisJCQlVU0hPUlQgb2Zmc2V0OworCQkJVVNIT1JUIGxlbjsKKwkJCVVTSE9SVCBqOworCQkJVUNIQVIgKnZhbHVlOworCisJCQlvZmZzZXQgPSBudG9ocyhwUmFDZmctPnN0YXR1cyk7CisJCQltZW1jcHkoJmxlbiwgcFJhQ2ZnLT5kYXRhLCAyKTsKKwkJCWxlbiA9IG50b2hzKGxlbik7CisKKwkJCWZvciAoaiA9IG9mZnNldDsgaiA8IChvZmZzZXQrbGVuKTsgaisrKQorCQkJeworCQkJCXZhbHVlID0gcFJhQ2ZnLT5kYXRhICsgMiArIChqIC0gb2Zmc2V0KTsKKwkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkYXB0ZXIsIGosICAqdmFsdWUpOworCQkJfQorCisJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1JGX1dSSVRFX0JVTEtcbiIpKTsKKyAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorCQkJZWxzZQorCQkJeworICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfUkZfV1JJVEVfQlVMSyBpcyBkb25lICFcbiIpKTsKKwkJCX0KKworCQl9CisJCQlicmVhazsKKyNlbmRpZgorCisKKwkJY2FzZSBSQUNGR19DTURfR0VUX05PSVNFX0xFVkVMOgorCQkJeworCQkJCVVDSEFSCWNoYW5uZWw7CisJCQkJSU5UMzIgICBidWZmZXJbM11bMTBdOy8qIDMgOiBSeFBhdGggOyAxMCA6IG5vLiBvZiBwZXIgcnNzaSBzYW1wbGVzICovCisKKwkJCQljaGFubmVsID0gKG50b2hzKHBSYUNmZy0+c3RhdHVzKSAmIDB4MDBGRik7CisJCQkJQ2FsTm9pc2VMZXZlbChwQWRhcHRlciwgY2hhbm5lbCwgYnVmZmVyKTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAoVUNIQVIgKilwUmFDZmctPmRhdGEsIChVQ0hBUiAqKSYoYnVmZmVyWzBdWzBdKSwgKHNpemVvZihJTlQzMikqMyoxMCkpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMiArIChzaXplb2YoSU5UMzIpKjMqMTApKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9HRVRfTk9JU0VfTEVWRUxcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0dFVF9OT0lTRV9MRVZFTCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9HRVRfQ09VTlRFUjoKKwkJCXsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzBdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5VMk0sIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLk90aGVyRGF0YSwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs4XSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuQmVhY29uLCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzEyXSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuT3RoZXJDb3VudCwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVsxNl0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlR4QWMwLCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzIwXSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuVHhBYzEsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMjRdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5UeEFjMiwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVsyOF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlR4QWMzLCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzMyXSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuVHhIQ0NBLCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzM2XSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuVHhNZ210LCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzQwXSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuUlNTSTAsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNDRdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5SU1NJMSwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs0OF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlJTU0kyLCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzUyXSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuU05SMCwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs1Nl0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlNOUjEsIDQpOworCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKzYwKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9HRVRfQ09VTlRFUlxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfR0VUX0NPVU5URVIgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQ0xFQVJfQ09VTlRFUjoKKwkJCXsKKwkJCQlwQWRhcHRlci0+YXRlLlUyTSA9IDA7CisJCQkJcEFkYXB0ZXItPmF0ZS5PdGhlckRhdGEgPSAwOworCQkJCXBBZGFwdGVyLT5hdGUuQmVhY29uID0gMDsKKwkJCQlwQWRhcHRlci0+YXRlLk90aGVyQ291bnQgPSAwOworCQkJCXBBZGFwdGVyLT5hdGUuVHhBYzAgPSAwOworCQkJCXBBZGFwdGVyLT5hdGUuVHhBYzEgPSAwOworCQkJCXBBZGFwdGVyLT5hdGUuVHhBYzIgPSAwOworCQkJCXBBZGFwdGVyLT5hdGUuVHhBYzMgPSAwOworCQkJCXBBZGFwdGVyLT5hdGUuVHhIQ0NBID0gMDsKKwkJCQlwQWRhcHRlci0+YXRlLlR4TWdtdCA9IDA7CisJCQkJcEFkYXB0ZXItPmF0ZS5UeERvbmVDb3VudCA9IDA7CisKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQ0xFQVJfQ09VTlRFUlxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQ0xFQVJfQ09VTlRFUiBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisKKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX1RYX1NUQVJUOgorCQkJeworCQkJCVVTSE9SVCAqcDsKKwkJCQlVU0hPUlQJZXJyID0gMTsKKwkJCQlVQ0hBUiAgIEJicDIyVmFsdWUgPSAwLCBCYnAyNFZhbHVlID0gMDsKKworCQkJCWlmICgocEFkYXB0ZXItPmF0ZS5UeFN0YXR1cyAhPSAwKSAmJiAocEFkYXB0ZXItPmF0ZS5Nb2RlICYgQVRFX1RYRlJBTUUpKQorCQkJCXsKKwkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBdGUgVHggaXMgYWxyZWFkeSBydW5uaW5nLCB0byBydW4gbmV4dCBUeCwgeW91IG11c3Qgc3RvcCBpdCBmaXJzdFxuIikpOworCQkJCQllcnIgPSAyOworCQkJCQlnb3RvIFRYX1NUQVJUX0VSUk9SOworCQkJCX0KKwkJCQllbHNlIGlmICgocEFkYXB0ZXItPmF0ZS5UeFN0YXR1cyAhPSAwKSAmJiAhKHBBZGFwdGVyLT5hdGUuTW9kZSAmIEFURV9UWEZSQU1FKSkKKwkJCQl7CisJCQkJCWludCBpID0gMDsKKworCQkJCQl3aGlsZSAoKGkrKyA8IDEwKSAmJiAocEFkYXB0ZXItPmF0ZS5UeFN0YXR1cyAhPSAwKSkKKwkJCQkJeworCQkJCQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKKwkJCQkJfQorCisJCQkJCS8vIGZvcmNlIGl0IHRvIHN0b3AKKwkJCQkJcEFkYXB0ZXItPmF0ZS5UeFN0YXR1cyA9IDA7CisJCQkJCXBBZGFwdGVyLT5hdGUuVHhEb25lQ291bnQgPSAwOworCQkJCQkvL3BBZGFwdGVyLT5hdGUuUmVwZWF0ID0gMDsKKwkJCQkJcEFkYXB0ZXItPmF0ZS5iUUFUeFN0YXJ0ID0gRkFMU0U7CisJCQkJfQorCisJCQkJLy8gSWYgcFJhQ2ZnLT5sZW5ndGggPT0gMCwgdGhpcyAiUkFDRkdfQ01EX1RYX1NUQVJUIiBpcyBmb3IgQ2FycmllciB0ZXN0IG9yIENhcnJpZXIgU3VwcHJlc3Npb24uCisJCQkJaWYgKG50b2hzKHBSYUNmZy0+bGVuZ3RoKSAhPSAwKQorCQkJCXsKKwkJCQkJLy8gR2V0IGZyYW1lIGluZm8KKyNpZmRlZiBSVDI4NzAKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZGFwdGVyLT5hdGUuVHhJbmZvLCBwUmFDZmctPmRhdGEgLSAyLCA0KTsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJCQkJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpICZwQWRhcHRlci0+YXRlLlR4SW5mbywgVFlQRV9UWElORk8pOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPmF0ZS5UeFdJLCBwUmFDZmctPmRhdGEgKyAyLCAxNik7CisjaWZkZWYgUlRfQklHX0VORElBTgorCQkJCQlSVE1QV0lFbmRpYW5DaGFuZ2UoKFBVQ0hBUikmcEFkYXB0ZXItPmF0ZS5UeFdJLCBUWVBFX1RYV0kpOworI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPmF0ZS5UeENvdW50LCBwUmFDZmctPmRhdGEgKyAxOCwgNCk7CisJCQkJCXBBZGFwdGVyLT5hdGUuVHhDb3VudCA9IG50b2hsKHBBZGFwdGVyLT5hdGUuVHhDb3VudCk7CisKKwkJCQkJcCA9IChVU0hPUlQgKikoJnBSYUNmZy0+ZGF0YVsyMl0pOworCQkJCQkvL3AgPSBwUmFDZmctPmRhdGEgKyAyMjsKKwkJCQkJLy8gYWx3YXlzIHVzZSBRSURfQUNfQkUKKwkJCQkJcEFkYXB0ZXItPmF0ZS5RSUQgPSAwOworCQkJCQlwID0gKFVTSE9SVCAqKSgmcFJhQ2ZnLT5kYXRhWzI0XSk7CisJCQkJCS8vcCA9IHBSYUNmZy0+ZGF0YSArIDI0OworCQkJCQlwQWRhcHRlci0+YXRlLkhMZW4gPSBudG9ocygqcCk7CisKKwkJCQkJaWYgKHBBZGFwdGVyLT5hdGUuSExlbiA+IDMyKQorCQkJCQl7CisJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoInBBZGFwdGVyLT5hdGUuSExlbiA+IDMyXG4iKSk7CisJCQkJCQllcnIgPSAzOworCQkJCQkJZ290byBUWF9TVEFSVF9FUlJPUjsKKwkJCQkJfQorCisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWRhcHRlci0+YXRlLkhlYWRlciwgcFJhQ2ZnLT5kYXRhICsgMjYsIHBBZGFwdGVyLT5hdGUuSExlbik7CisKKworCQkJCQlwQWRhcHRlci0+YXRlLlBMZW4gPSBudG9ocyhwUmFDZmctPmxlbmd0aCkgLSAocEFkYXB0ZXItPmF0ZS5ITGVuICsgMjgpOworCisJCQkJCWlmIChwQWRhcHRlci0+YXRlLlBMZW4gPiAzMikKKwkJCQkJeworCQkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJwQWRhcHRlci0+YXRlLlBMZW4gPiAzMlxuIikpOworCQkJCQkJZXJyID0gNDsKKwkJCQkJCWdvdG8gVFhfU1RBUlRfRVJST1I7CisJCQkJCX0KKworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPmF0ZS5QYXR0ZXJuLCBwUmFDZmctPmRhdGEgKyAyNiArIHBBZGFwdGVyLT5hdGUuSExlbiwgcEFkYXB0ZXItPmF0ZS5QTGVuKTsKKwkJCQkJcEFkYXB0ZXItPmF0ZS5ETGVuID0gcEFkYXB0ZXItPmF0ZS5UeFdJLk1QRFV0b3RhbEJ5dGVDb3VudCAtIHBBZGFwdGVyLT5hdGUuSExlbjsKKwkJCQl9CisKKwkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IyMiwgJkJicDIyVmFsdWUpOworCisJCQkJc3dpdGNoIChCYnAyMlZhbHVlKQorCQkJCXsKKwkJCQkJY2FzZSBCQlAyMl9UWEZSQU1FOgorCQkJCQkJeworCQkJCQkJCWlmIChwQWRhcHRlci0+YXRlLlR4Q291bnQgPT0gMCkKKwkJCQkJCQl7CisJCQkJCQkJfQorCQkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU1RBUlQgVFhGUkFNRVxuIikpOworCQkJCQkJCXBBZGFwdGVyLT5hdGUuYlFBVHhTdGFydCA9IFRSVUU7CisJCQkJCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiVFhGUkFNRSIpOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBCQlAyMl9UWENPTlRfT1JfQ0FSUlNVUFA6CisJCQkJCQl7CisJCQkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQlAyMl9UWENPTlRfT1JfQ0FSUlNVUFBcbiIpKTsKKwkJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgMjQsICZCYnAyNFZhbHVlKTsKKworCQkJCQkJCXN3aXRjaCAoQmJwMjRWYWx1ZSkKKwkJCQkJCQl7CisJCQkJCQkJCWNhc2UgQkJQMjRfVFhDT05UOgorCQkJCQkJCQkJeworCQkJCQkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU1RBUlQgVFhDT05UXG4iKSk7CisJCQkJCQkJCQkJcEFkYXB0ZXItPmF0ZS5iUUFUeFN0YXJ0ID0gVFJVRTsKKwkJCQkJCQkJCQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJUWENPTlQiKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCWJyZWFrOworCisJCQkJCQkJCWNhc2UgQkJQMjRfQ0FSUlNVUFA6CisJCQkJCQkJCQl7CisJCQkJCQkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTVEFSVCBUWENBUlJTVVBQXG4iKSk7CisJCQkJCQkJCQkJcEFkYXB0ZXItPmF0ZS5iUUFUeFN0YXJ0ID0gVFJVRTsKKwkJCQkJCQkJCQlwQWRhcHRlci0+YXRlLk1vZGUgfD0gQVRFX1RYQ0FSUlNVUFA7CisJCQkJCQkJCQl9CisJCQkJCQkJCQlicmVhazsKKworCQkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQkJeworCQkJCQkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiVW5rbm93biBTdGFydCBUWCBzdWJ0eXBlICEiKSk7CisJCQkJCQkJCQl9CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIEJCUDIyX1RYQ0FSUjoKKwkJCQkJCXsKKwkJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNUQVJUIFRYQ0FSUlxuIikpOworCQkJCQkJCXBBZGFwdGVyLT5hdGUuYlFBVHhTdGFydCA9IFRSVUU7CisJCQkJCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiVFhDQVJSIik7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKworCQkJCQlkZWZhdWx0OgorCQkJCQkJeworCQkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiVW5rbm93biBTdGFydCBUWCBzdWJ0eXBlICEiKSk7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlpZiAocEFkYXB0ZXItPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpCisJCQkJeworCQkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisKKwkJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKwkgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisJICAgICAgICAgICAgCXsKKwkgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIHdhcyBmYWlsZWQgaW4gY2FzZSBSQUNGR19DTURfVFhfU1RBUlRcbiIpKTsKKwkgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisJICAgICAgICAgICAgCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfVFhfU1RBUlQgaXMgZG9uZSAhXG4iKSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCitUWF9TVEFSVF9FUlJPUjoKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKGVycik7CisKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX1RYX1NUQVJUXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImZlZWRiYWNrIG9mIFRYX1NUQVJUX0VSUk9SIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0dFVF9UWF9TVEFUVVM6CisJCQl7CisJCQkJVUlOVDMyIGNvdW50OworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoNik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQljb3VudCA9IGh0b25sKHBBZGFwdGVyLT5hdGUuVHhEb25lQ291bnQpOworCQkJCU5kaXNNb3ZlTWVtb3J5KHBSYUNmZy0+ZGF0YSwgJmNvdW50LCA0KTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfR0VUX1RYX1NUQVRVU1xuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfR0VUX1RYX1NUQVRVUyBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9UWF9TVE9QOgorCQkJeworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX1RYX1NUT1BcbiIpKTsKKworCQkJCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIlRYU1RPUCIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfVFhfU1RPUFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfVFhfU1RPUCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9SWF9TVEFSVDoKKwkJCXsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9SWF9TVEFSVFxuIikpOworCisJCQkJcEFkYXB0ZXItPmF0ZS5iUUFSeFN0YXJ0ID0gVFJVRTsKKwkJCQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJSWEZSQU1FIik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9SWF9TVEFSVFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfUlhfU1RBUlQgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfUlhfU1RPUDoKKwkJCXsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9SWF9TVE9QXG4iKSk7CisKKwkJCQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJSWFNUT1AiKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX1JYX1NUT1BcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX1JYX1NUT1AgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJLyogVGhlIGZvbGxvd2luZyBjYXNlcyBhcmUgZm9yIG5ldyBBVEUgR1VJKG5vdCBRQSkuICovCisJCS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ0FSUklFUjoKKwkJCXsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ0FSUklFUlxuIikpOworCisJCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiVFhDQVJSIik7CisKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ3cnEtPnUuZGF0YS5sZW5ndGggPSAlZFxuIiwgd3JxLT51LmRhdGEubGVuZ3RoKSk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NUQVJUX1RYX0NBUlJJRVJcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DQVJSSUVSIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DT05UOgorCQkJeworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DT05UXG4iKSk7CisKKwkJCQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJUWENPTlQiKTsKKworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIndycS0+dS5kYXRhLmxlbmd0aCA9ICVkXG4iLCB3cnEtPnUuZGF0YS5sZW5ndGgpKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfQ09OVFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NUQVJUX1RYX0NPTlQgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NUQVJUX1RYX0ZSQU1FOgorCQkJeworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9GUkFNRVxuIikpOworCisJCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiVFhGUkFNRSIpOworCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgid3JxLT51LmRhdGEubGVuZ3RoID0gJWRcbiIsIHdycS0+dS5kYXRhLmxlbmd0aCkpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9GUkFNRVxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NUQVJUX1RYX0ZSQU1FIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfQlc6CisJCQl7CisJCQkJU0hPUlQgICAgdmFsdWUgPSAwOworCQkJCVVDSEFSICAgIHN0cltMRU5fT0ZfQVJHXTsKKworCQkJCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX0JXXG4iKSk7CisKKwkJCQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOworCQkJCXZhbHVlID0gbnRvaHModmFsdWUpOworCQkJCXNwcmludGYoKFBDSEFSKXN0ciwgIiVkIiwgdmFsdWUpOworCisJCQkJU2V0X0FURV9UWF9CV19Qcm9jKHBBZGFwdGVyLCBzdHIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFVF9CV1xuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NFVF9CVyBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMDoKKwkJCXsKKwkJCQlTSE9SVCAgICB2YWx1ZSA9IDA7CisJCQkJVUNIQVIgICAgc3RyW0xFTl9PRl9BUkddOworCisJCQkJTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIwXG4iKSk7CisKKwkJCQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOworCQkJCXZhbHVlID0gbnRvaHModmFsdWUpOworCQkJCXNwcmludGYoKFBDSEFSKXN0ciwgIiVkIiwgdmFsdWUpOworCQkJCVNldF9BVEVfVFhfUE9XRVIwX1Byb2MocEFkYXB0ZXIsIHN0cik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NFVF9UWF9QT1dFUjAgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9UWF9QT1dFUjE6CisJCQl7CisJCQkJU0hPUlQgICAgdmFsdWUgPSAwOworCQkJCVVDSEFSICAgIHN0cltMRU5fT0ZfQVJHXTsKKworCQkJCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMVxuIikpOworCisJCQkJbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKwkJCQlzcHJpbnRmKChQQ0hBUilzdHIsICIlZCIsIHZhbHVlKTsKKwkJCQlTZXRfQVRFX1RYX1BPV0VSMV9Qcm9jKHBBZGFwdGVyLCBzdHIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFVF9UWF9QT1dFUjFcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIxIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfRlJFUV9PRkZTRVQ6CisJCQl7CisJCQkJU0hPUlQgICAgdmFsdWUgPSAwOworCQkJCVVDSEFSICAgIHN0cltMRU5fT0ZfQVJHXTsKKworCQkJCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX0ZSRVFfT0ZGU0VUXG4iKSk7CisKKwkJCQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOworCQkJCXZhbHVlID0gbnRvaHModmFsdWUpOworCQkJCXNwcmludGYoKFBDSEFSKXN0ciwgIiVkIiwgdmFsdWUpOworCQkJCVNldF9BVEVfVFhfRlJFUU9GRlNFVF9Qcm9jKHBBZGFwdGVyLCBzdHIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFVF9GUkVRX09GRlNFVFxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NFVF9GUkVRX09GRlNFVCBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfR0VUX1NUQVRJU1RJQ1M6CisJCQl7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX0dFVF9TVEFUSVNUSUNTXG4iKSk7CisKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzBdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5UeERvbmVDb3VudCwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs0XSwgKFVDSEFSICopJnBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC51Lkxvd1BhcnQsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbOF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkZhaWxlZENvdW50LnUuTG93UGFydCwgNCk7CisJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVsxMl0sIChVQ0hBUiAqKSZwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJUU1N1Y2Nlc3NDb3VudC51Lkxvd1BhcnQsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMTZdLCAoVUNIQVIgKikmcEFkYXB0ZXItPldsYW5Db3VudGVycy5SVFNGYWlsdXJlQ291bnQudS5Mb3dQYXJ0LCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzIwXSwgKFVDSEFSICopJnBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUmVjZWl2ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0LCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzI0XSwgKFVDSEFSICopJnBBZGFwdGVyLT5XbGFuQ291bnRlcnMuRkNTRXJyb3JDb3VudC51Lkxvd1BhcnQsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMjhdLCAoVUNIQVIgKikmcEFkYXB0ZXItPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyLCA0KTsKKwkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzMyXSwgKFVDSEFSICopJnBBZGFwdGVyLT5XbGFuQ291bnRlcnMuRnJhbWVEdXBsaWNhdGVDb3VudC51Lkxvd1BhcnQsIDQpOworCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMzZdLCAoVUNIQVIgKikmcEFkYXB0ZXItPlJhbGlua0NvdW50ZXJzLk9uZVNlY0ZhbHNlQ0NBQ250LCA0KTsKKworCQkJCWlmIChwQWRhcHRlci0+YXRlLlJ4QW50ZW5uYVNlbCA9PSAwKQorCQkJCXsKKwkJCQkJSU5UMzIgUlNTSTAgPSAwOworCQkJCQlJTlQzMiBSU1NJMSA9IDA7CisJCQkJCUlOVDMyIFJTU0kyID0gMDsKKworCQkJCQlSU1NJMCA9IChJTlQzMikocEFkYXB0ZXItPmF0ZS5MYXN0UnNzaTAgLSBwQWRhcHRlci0+QmJwUnNzaVRvRGJtRGVsdGEpOworCQkJCQlSU1NJMSA9IChJTlQzMikocEFkYXB0ZXItPmF0ZS5MYXN0UnNzaTEgLSBwQWRhcHRlci0+QmJwUnNzaVRvRGJtRGVsdGEpOworCQkJCQlSU1NJMiA9IChJTlQzMikocEFkYXB0ZXItPmF0ZS5MYXN0UnNzaTIgLSBwQWRhcHRlci0+QmJwUnNzaVRvRGJtRGVsdGEpOworCQkJCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzQwXSwgKFVDSEFSICopJlJTU0kwLCA0KTsKKwkJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs0NF0sIChVQ0hBUiAqKSZSU1NJMSwgNCk7CisJCQkJCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNDhdLCAoVUNIQVIgKikmUlNTSTIsIDQpOworCQkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIrNTIpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlJTlQzMiBSU1NJMCA9IDA7CisKKwkJCQkJUlNTSTAgPSAoSU5UMzIpKHBBZGFwdGVyLT5hdGUuTGFzdFJzc2kwIC0gcEFkYXB0ZXItPkJicFJzc2lUb0RibURlbHRhKTsKKwkJCQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs0MF0sIChVQ0hBUiAqKSZSU1NJMCwgNCk7CisJCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMis0NCk7CisJCQkJfQorCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9HRVRfU1RBVElTVElDU1xuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX0dFVF9TVEFUSVNUSUNTIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9SRVNFVF9DT1VOVEVSOgorCQkJeworCQkJCVNIT1JUICAgIHZhbHVlID0gMTsKKwkJCQlVQ0hBUiAgICBzdHJbTEVOX09GX0FSR107CisKKwkJCQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1JFU0VUX0NPVU5URVJcbiIpKTsKKworCQkJCXNwcmludGYoKFBDSEFSKXN0ciwgIiVkIiwgdmFsdWUpOworCQkJCVNldF9SZXNldFN0YXRDb3VudGVyX1Byb2MocEFkYXB0ZXIsIHN0cik7CisKKwkJCQlwQWRhcHRlci0+YXRlLlR4RG9uZUNvdW50ID0gMDsKKworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfUkVTRVRfQ09VTlRFUlxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1JFU0VUX0NPVU5URVIgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VMX1RYX0FOVEVOTkE6CisJCQl7CisJCQkJU0hPUlQgICAgdmFsdWUgPSAwOworCQkJCVVDSEFSICAgIHN0cltMRU5fT0ZfQVJHXTsKKworCQkJCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VMX1RYX0FOVEVOTkFcbiIpKTsKKworCQkJCW1lbWNweSgoUFVDSEFSKSZ2YWx1ZSwgKFBVQ0hBUikmKHBSYUNmZy0+c3RhdHVzKSwgMik7CisJCQkJdmFsdWUgPSBudG9ocyh2YWx1ZSk7CisJCQkJc3ByaW50ZigoUENIQVIpc3RyLCAiJWQiLCB2YWx1ZSk7CisJCQkJU2V0X0FURV9UWF9BbnRlbm5hX1Byb2MocEFkYXB0ZXIsIHN0cik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU0VMX1RYX0FOVEVOTkFcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRUxfVFhfQU5URU5OQSBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VMX1JYX0FOVEVOTkE6CisJCQl7CisJCQkJU0hPUlQgICAgdmFsdWUgPSAwOworCQkJCVVDSEFSICAgIHN0cltMRU5fT0ZfQVJHXTsKKworCQkJCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VMX1JYX0FOVEVOTkFcbiIpKTsKKworCQkJCW1lbWNweSgoUFVDSEFSKSZ2YWx1ZSwgKFBVQ0hBUikmKHBSYUNmZy0+c3RhdHVzKSwgMik7CisJCQkJdmFsdWUgPSBudG9ocyh2YWx1ZSk7CisJCQkJc3ByaW50ZigoUENIQVIpc3RyLCAiJWQiLCB2YWx1ZSk7CisJCQkJU2V0X0FURV9SWF9BbnRlbm5hX1Byb2MocEFkYXB0ZXIsIHN0cik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU0VMX1JYX0FOVEVOTkFcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRUxfUlhfQU5URU5OQSBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX1BSRUFNQkxFOgorCQkJeworCQkJCVNIT1JUICAgIHZhbHVlID0gMDsKKwkJCQlVQ0hBUiAgICBzdHJbTEVOX09GX0FSR107CisKKwkJCQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9QUkVBTUJMRVxuIikpOworCisJCQkJbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKKwkJCQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKKwkJCQlzcHJpbnRmKChQQ0hBUilzdHIsICIlZCIsIHZhbHVlKTsKKwkJCQlTZXRfQVRFX1RYX01PREVfUHJvYyhwQWRhcHRlciwgc3RyKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TRVRfUFJFQU1CTEVcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRVRfUFJFQU1CTEUgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9DSEFOTkVMOgorCQkJeworCQkJCVNIT1JUICAgIHZhbHVlID0gMDsKKwkJCQlVQ0hBUiAgICBzdHJbTEVOX09GX0FSR107CisKKwkJCQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9DSEFOTkVMXG4iKSk7CisKKwkJCQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOworCQkJCXZhbHVlID0gbnRvaHModmFsdWUpOworCQkJCXNwcmludGYoKFBDSEFSKXN0ciwgIiVkIiwgdmFsdWUpOworCQkJCVNldF9BVEVfQ0hBTk5FTF9Qcm9jKHBBZGFwdGVyLCBzdHIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFVF9DSEFOTkVMXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU0VUX0NIQU5ORUwgaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9BRERSMToKKwkJCXsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIxXG4iKSk7CisKKwkJCQkvLyBBZGRyIGlzIGFuIGFycmF5IG9mIFVDSEFSLAorCQkJCS8vIHNvIG5vIG5lZWQgdG8gcGVyZm9ybSBlbmRpYW4gc3dhcC4KKwkJCQltZW1jcHkocEFkYXB0ZXItPmF0ZS5BZGRyMSwgKFBVQ0hBUikocFJhQ2ZnLT5kYXRhIC0gMiksIE1BQ19BRERSX0xFTik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIxXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIxIGlzIGRvbmUgIVxuIChBRERSMSA9ICUyWDolMlg6JTJYOiUyWDolMlg6JTJYKVxuIiwgcEFkYXB0ZXItPmF0ZS5BZGRyMVswXSwKKwkJCQkJCXBBZGFwdGVyLT5hdGUuQWRkcjFbMV0sIHBBZGFwdGVyLT5hdGUuQWRkcjFbMl0sIHBBZGFwdGVyLT5hdGUuQWRkcjFbM10sIHBBZGFwdGVyLT5hdGUuQWRkcjFbNF0sIHBBZGFwdGVyLT5hdGUuQWRkcjFbNV0pKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIyOgorCQkJeworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfQUREUjJcbiIpKTsKKworCQkJCS8vIEFkZHIgaXMgYW4gYXJyYXkgb2YgVUNIQVIsCisJCQkJLy8gc28gbm8gbmVlZCB0byBwZXJmb3JtIGVuZGlhbiBzd2FwLgorCQkJCW1lbWNweShwQWRhcHRlci0+YXRlLkFkZHIyLCAoUFVDSEFSKShwUmFDZmctPmRhdGEgLSAyKSwgTUFDX0FERFJfTEVOKTsKKworCQkJCS8vIHByZXBhcmUgZmVlZGJhY2sKKwkJCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOworCQkJCXBSYUNmZy0+c3RhdHVzID0gaHRvbnMoMCk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBSYUNmZy0+bWFnaWNfbm8pICsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF90eXBlKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX2lkKSArIHNpemVvZihwUmFDZmctPmxlbmd0aCkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+c2VxdWVuY2UpICsgbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOworCisgICAgICAgICAgICAJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwUmFDZmcsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjb3B5X3RvX3VzZXIoKSBmYWlsIGluIGNhc2UgUkFDRkdfQ01EX0FURV9TRVRfQUREUjJcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRVRfQUREUjIgaXMgZG9uZSAhXG4gKEFERFIyID0gJTJYOiUyWDolMlg6JTJYOiUyWDolMlgpXG4iLCBwQWRhcHRlci0+YXRlLkFkZHIyWzBdLAorCQkJCQkJcEFkYXB0ZXItPmF0ZS5BZGRyMlsxXSwgcEFkYXB0ZXItPmF0ZS5BZGRyMlsyXSwgcEFkYXB0ZXItPmF0ZS5BZGRyMlszXSwgcEFkYXB0ZXItPmF0ZS5BZGRyMls0XSwgcEFkYXB0ZXItPmF0ZS5BZGRyMls1XSkpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfQUREUjM6CisJCQl7CisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9BRERSM1xuIikpOworCisJCQkJLy8gQWRkciBpcyBhbiBhcnJheSBvZiBVQ0hBUiwKKwkJCQkvLyBzbyBubyBuZWVkIHRvIHBlcmZvcm0gZW5kaWFuIHN3YXAuCisJCQkJbWVtY3B5KHBBZGFwdGVyLT5hdGUuQWRkcjMsIChQVUNIQVIpKHBSYUNmZy0+ZGF0YSAtIDIpLCBNQUNfQUREUl9MRU4pOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfQVRFX1NFVF9BRERSM1xuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NFVF9BRERSMyBpcyBkb25lICFcbiAoQUREUjMgPSAlMlg6JTJYOiUyWDolMlg6JTJYOiUyWClcbiIsIHBBZGFwdGVyLT5hdGUuQWRkcjNbMF0sCisJCQkJCQlwQWRhcHRlci0+YXRlLkFkZHIzWzFdLCBwQWRhcHRlci0+YXRlLkFkZHIzWzJdLCBwQWRhcHRlci0+YXRlLkFkZHIzWzNdLCBwQWRhcHRlci0+YXRlLkFkZHIzWzRdLCBwQWRhcHRlci0+YXRlLkFkZHIzWzVdKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9SQVRFOgorCQkJeworCQkJCVNIT1JUICAgIHZhbHVlID0gMDsKKwkJCQlVQ0hBUiAgICBzdHJbTEVOX09GX0FSR107CisKKwkJCQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOworCisJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9SQVRFXG4iKSk7CisKKwkJCQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOworCQkJCXZhbHVlID0gbnRvaHModmFsdWUpOworCQkJCXNwcmludGYoKFBDSEFSKXN0ciwgIiVkIiwgdmFsdWUpOworCQkJCVNldF9BVEVfVFhfTUNTX1Byb2MocEFkYXB0ZXIsIHN0cik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX1JBVEVcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FURV9TRVRfUkFURSBpcyBkb25lICFcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0xFTjoKKwkJCXsKKwkJCQlTSE9SVCAgICB2YWx1ZSA9IDA7CisJCQkJVUNIQVIgICAgc3RyW0xFTl9PRl9BUkddOworCisJCQkJTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKKworCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfVFhfRlJBTUVfTEVOXG4iKSk7CisKKwkJCQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOworCQkJCXZhbHVlID0gbnRvaHModmFsdWUpOworCQkJCXNwcmludGYoKFBDSEFSKXN0ciwgIiVkIiwgdmFsdWUpOworCQkJCVNldF9BVEVfVFhfTEVOR1RIX1Byb2MocEFkYXB0ZXIsIHN0cik7CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0xFTlxuIikpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgCX0KKwkJCQllbHNlCisJCQkJeworICAgICAgICAgICAgICAgIAlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9MRU4gaXMgZG9uZSAhXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9DT1VOVDoKKwkJCXsKKwkJCQlVU0hPUlQgICAgdmFsdWUgPSAwOworCQkJCVVDSEFSICAgIHN0cltMRU5fT0ZfQVJHXTsKKworCQkJCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7CisKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0NPVU5UXG4iKSk7CisKKwkJCQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOworCQkJCXZhbHVlID0gbnRvaHModmFsdWUpOworCQkJCXsKKwkJCQkJc3ByaW50ZigoUENIQVIpc3RyLCAiJWQiLCB2YWx1ZSk7CisJCQkJCVNldF9BVEVfVFhfQ09VTlRfUHJvYyhwQWRhcHRlciwgc3RyKTsKKwkJCQl9CisKKwkJCQkvLyBwcmVwYXJlIGZlZWRiYWNrCisJCQkJcFJhQ2ZnLT5sZW5ndGggPSBodG9ucygyKTsKKwkJCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDApOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwUmFDZmctPm1hZ2ljX25vKSArIHNpemVvZihwUmFDZmctPmNvbW1hbmRfdHlwZSkKKwkJCQkJCQkJCSsgc2l6ZW9mKHBSYUNmZy0+Y29tbWFuZF9pZCkgKyBzaXplb2YocFJhQ2ZnLT5sZW5ndGgpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPnNlcXVlbmNlKSArIG50b2hzKHBSYUNmZy0+bGVuZ3RoKTsKKworICAgICAgICAgICAgCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFJhQ2ZnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY29weV90b191c2VyKCkgZmFpbCBpbiBjYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0NPVU5UXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICAJfQorCQkJCWVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0NPVU5UIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkFDRkdfQ01EX0FURV9TVEFSVF9SWF9GUkFNRToKKwkJCXsKKwkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9SWF9TVEFSVFxuIikpOworCisJCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiUlhGUkFNRSIpOworCisJCQkJLy8gcHJlcGFyZSBmZWVkYmFjaworCQkJCXBSYUNmZy0+bGVuZ3RoID0gaHRvbnMoMik7CisJCQkJcFJhQ2ZnLT5zdGF0dXMgPSBodG9ucygwKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocFJhQ2ZnLT5tYWdpY19ubykgKyBzaXplb2YocFJhQ2ZnLT5jb21tYW5kX3R5cGUpCisJCQkJCQkJCQkrIHNpemVvZihwUmFDZmctPmNvbW1hbmRfaWQpICsgc2l6ZW9mKHBSYUNmZy0+bGVuZ3RoKQorCQkJCQkJCQkJKyBzaXplb2YocFJhQ2ZnLT5zZXF1ZW5jZSkgKyBudG9ocyhwUmFDZmctPmxlbmd0aCk7CisKKyAgICAgICAgICAgIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBSYUNmZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gY2FzZSBSQUNGR19DTURfUlhfU1RBUlRcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIAl9CisJCQkJZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX1JYX1NUQVJUIGlzIGRvbmUgIVxuIikpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorICAgIEFTU0VSVChwUmFDZmcgIT0gTlVMTCk7CisgICAgaWYgKHBSYUNmZyAhPSBOVUxMKQorICAgIHsKKyAgICBrZnJlZShwUmFDZmcpOworICAgIH0KKwlyZXR1cm47Cit9CisKK1ZPSUQgQnViYmxlU29ydChJTlQzMiBuLCBJTlQzMiBhW10pCit7CisJSU5UMzIgaywgaiwgdGVtcDsKKworCWZvciAoayA9IG4tMTsgIGs+MDsgIGstLSkKKwl7CisJCWZvciAoaiA9IDA7IGo8azsgaisrKQorCQl7CisJCQlpZihhW2pdID4gYVtqKzFdKQorCQkJeworCQkJCXRlbXAgPSBhW2pdOworCQkJCWFbal09YVtqKzFdOworCQkJCWFbaisxXT10ZW1wOworCQkJfQorCQl9CisJfQorfQorCitWT0lEIENhbE5vaXNlTGV2ZWwoUFJUTVBfQURBUFRFUiBwQWQsIFVDSEFSIGNoYW5uZWwsIElOVDMyIFJTU0lbM11bMTBdKQoreworCUlOVDMyCQlSU1NJMCwgUlNTSTEsIFJTU0kyOworIAlDSEFSCQlSc3NpME9mZnNldCwgUnNzaTFPZmZzZXQsIFJzc2kyT2Zmc2V0OworCVVDSEFSCQlCYnBSNTBSc3NpMCA9IDAsIEJicFI1MVJzc2kxID0gMCwgQmJwUjUyUnNzaTIgPSAwOworCVVDSEFSCQlPcmdfQkJQNjZ2YWx1ZSA9IDAsIE9yZ19CQlA2OXZhbHVlID0gMCwgT3JnX0JCUDcwdmFsdWUgPSAwLCBkYXRhID0gMDsKKwlVU0hPUlQJCUxOQV9HYWluID0gMDsKKwlJTlQzMiAgICAgICBqID0gMDsKKwlVQ0hBUgkJT3JnX0NoYW5uZWwgPSBwQWQtPmF0ZS5DaGFubmVsOworCVVTSE9SVAkgICAgR2FpblZhbHVlID0gMCwgT2Zmc2V0VmFsdWUgPSAwOworCisJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCAmT3JnX0JCUDY2dmFsdWUpOworCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgJk9yZ19CQlA2OXZhbHVlKTsKKwlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsICZPcmdfQkJQNzB2YWx1ZSk7CisKKwkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkvLyBSZWFkIHRoZSB2YWx1ZSBvZiBMTkEgZ2FpbiBhbmQgUnNzaSBvZmZzZXQKKwkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9MTkFfT0ZGU0VULCBHYWluVmFsdWUpOworCisJLy8gZm9yIE5vaXNlIExldmVsCisJaWYgKGNoYW5uZWwgPD0gMTQpCisJeworCQlMTkFfR2FpbiA9IEdhaW5WYWx1ZSAmIDB4MDBGRjsKKworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9SU1NJX0JHX09GRlNFVCwgT2Zmc2V0VmFsdWUpOworCQlSc3NpME9mZnNldCA9IE9mZnNldFZhbHVlICYgMHgwMEZGOworCQlSc3NpMU9mZnNldCA9IChPZmZzZXRWYWx1ZSAmIDB4RkYwMCkgPj4gODsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAoRUVQUk9NX1JTU0lfQkdfT0ZGU0VUICsgMikvKiAweDQ4ICovLCBPZmZzZXRWYWx1ZSk7CisJCVJzc2kyT2Zmc2V0ID0gT2Zmc2V0VmFsdWUgJiAweDAwRkY7CisJfQorCWVsc2UKKwl7CisJCUxOQV9HYWluID0gKEdhaW5WYWx1ZSAmIDB4RkYwMCkgPj4gODsKKworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9SU1NJX0FfT0ZGU0VULCBPZmZzZXRWYWx1ZSk7CisJCVJzc2kwT2Zmc2V0ID0gT2Zmc2V0VmFsdWUgJiAweDAwRkY7CisJCVJzc2kxT2Zmc2V0ID0gKE9mZnNldFZhbHVlICYgMHhGRjAwKSA+PiA4OworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIChFRVBST01fUlNTSV9BX09GRlNFVCArIDIpLyogMHg0QyAqLywgT2Zmc2V0VmFsdWUpOworCQlSc3NpMk9mZnNldCA9IE9mZnNldFZhbHVlICYgMHgwMEZGOworCX0KKwkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwl7CisJCXBBZC0+YXRlLkNoYW5uZWwgPSBjaGFubmVsOworCQlBVEVBc2ljU3dpdGNoQ2hhbm5lbChwQWQpOworCQltZGVsYXkoNSk7CisKKwkJZGF0YSA9IDB4MTA7CisJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIGRhdGEpOworCQlkYXRhID0gMHg0MDsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgZGF0YSk7CisJCWRhdGEgPSAweDQwOworCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCBkYXRhKTsKKwkJbWRlbGF5KDUpOworCisJCS8vIFN0YXJ0IFJ4CisJCXBBZC0+YXRlLmJRQVJ4U3RhcnQgPSBUUlVFOworCQlTZXRfQVRFX1Byb2MocEFkLCAiUlhGUkFNRSIpOworCisJCW1kZWxheSg1KTsKKworCQlmb3IgKGogPSAwOyBqIDwgMTA7IGorKykKKwkJeworCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjUwLCAmQmJwUjUwUnNzaTApOworCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjUxLCAmQmJwUjUxUnNzaTEpOworCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjUyLCAmQmJwUjUyUnNzaTIpOworCisJCQltZGVsYXkoMTApOworCisJCQkvLyBDYWxjdWxhdGUgUlNTSSAwCisJCQlpZiAoQmJwUjUwUnNzaTAgPT0gMCkKKwkJCXsKKwkJCQlSU1NJMCA9IC0xMDA7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJUlNTSTAgPSAoSU5UMzIpKC0xMiAtIEJicFI1MFJzc2kwIC0gTE5BX0dhaW4gLSBSc3NpME9mZnNldCk7CisJCQl9CisJCQlSU1NJWzBdW2pdID0gUlNTSTA7CisKKwkJCWlmICggcEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+PSAyICkgLy8gMlIKKwkJCXsKKwkJCQkvLyBDYWxjdWxhdGUgUlNTSSAxCisJCQkJaWYgKEJicFI1MVJzc2kxID09IDApCisJCQkJeworCQkJCQlSU1NJMSA9IC0xMDA7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVJTU0kxID0gKElOVDMyKSgtMTIgLSBCYnBSNTFSc3NpMSAtIExOQV9HYWluIC0gUnNzaTFPZmZzZXQpOworCQkJCX0KKwkJCQlSU1NJWzFdW2pdID0gUlNTSTE7CisJCQl9CisKKwkJCWlmICggcEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+PSAzICkgLy8gM1IKKwkJCXsKKwkJCQkvLyBDYWxjdWxhdGUgUlNTSSAyCisJCQkJaWYgKEJicFI1MlJzc2kyID09IDApCisJCQkJCVJTU0kyID0gLTEwMDsKKwkJCQllbHNlCisJCQkJCVJTU0kyID0gKElOVDMyKSgtMTIgLSBCYnBSNTJSc3NpMiAtIExOQV9HYWluIC0gUnNzaTJPZmZzZXQpOworCisJCQkJUlNTSVsyXVtqXSA9IFJTU0kyOworCQkJfQorCQl9CisKKwkJLy8gU3RvcCBSeAorCQlTZXRfQVRFX1Byb2MocEFkLCAiUlhTVE9QIik7CisKKwkJbWRlbGF5KDUpOworCisjaWYgMC8vIERlYnVnIE1lc3NhZ2UuLi4uLi4uLi4uLi4uLi4uCisJCWF0ZV9wcmludCgiXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKKwkJYXRlX3ByaW50KCJOb2lzZSBMZXZlbDogQ2hhbm5lbCAlZFxuIiwgY2hhbm5lbCk7CisJCWF0ZV9wcmludCgiUlNTSTAgPSAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZFxuIiwKKwkJCVJTU0lbMF1bMF0sIFJTU0lbMF1bMV0sIFJTU0lbMF1bMl0sCisJCQlSU1NJWzBdWzNdLCBSU1NJWzBdWzRdLCBSU1NJWzBdWzVdLAorCQkJUlNTSVswXVs2XSwgUlNTSVswXVs3XSwgUlNTSVswXVs4XSwKKwkJCVJTU0lbMF1bOV0pOworCQlpZiAoIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMiApIC8vIDJSCisJCXsKKwkJCWF0ZV9wcmludCgiUlNTSTEgPSAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZFxuIiwKKwkJCQlSU1NJWzFdWzBdLCBSU1NJWzFdWzFdLCBSU1NJWzFdWzJdLAorCQkJCVJTU0lbMV1bM10sIFJTU0lbMV1bNF0sIFJTU0lbMV1bNV0sCisJCQkJUlNTSVsxXVs2XSwgUlNTSVsxXVs3XSwgUlNTSVsxXVs4XSwKKwkJCQlSU1NJWzFdWzldKTsKKwkJfQorCQlpZiAoIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMyApIC8vIDNSCisJCXsKKwkJCWF0ZV9wcmludCgiUlNTSTIgPSAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZFxuIiwKKwkJCQlSU1NJWzJdWzBdLCBSU1NJWzJdWzFdLCBSU1NJWzJdWzJdLAorCQkJCVJTU0lbMl1bM10sIFJTU0lbMl1bNF0sIFJTU0lbMl1bNV0sCisJCQkJUlNTSVsyXVs2XSwgUlNTSVsyXVs3XSwgUlNTSVsyXVs4XSwKKwkJCQlSU1NJWzJdWzldKTsKKwkJfQorI2VuZGlmIC8vIDAgLy8KKwkJQnViYmxlU29ydCgxMCwgUlNTSVswXSk7CS8vIDFSCisKKwkJaWYgKCBwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID49IDIgKSAvLyAyUgorCQl7CisJCQlCdWJibGVTb3J0KDEwLCBSU1NJWzFdKTsKKwkJfQorCisJCWlmICggcEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+PSAzICkgLy8gM1IKKwkJeworCQkJQnViYmxlU29ydCgxMCwgUlNTSVsyXSk7CisJCX0KKworI2lmIDAvLyBEZWJ1ZyBNZXNzYWdlLi4uLi4uLi4uLi4uLi4uLgorCQlhdGVfcHJpbnQoIlxuQWZ0ZXIgU29ydGluZy4uLi5DaGFubmVsICVkXG4iLCBjaGFubmVsKTsKKwkJYXRlX3ByaW50KCJSU1NJMCA9ICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkXG4iLAorCQkJUlNTSVswXVswXSwgUlNTSVswXVsxXSwgUlNTSVswXVsyXSwKKwkJCVJTU0lbMF1bM10sIFJTU0lbMF1bNF0sIFJTU0lbMF1bNV0sCisJCQlSU1NJWzBdWzZdLCBSU1NJWzBdWzddLCBSU1NJWzBdWzhdLAorCQkJUlNTSVswXVs5XSk7CisJCWlmICggcEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+PSAyICkgLy8gMlIKKwkJeworCQkJYXRlX3ByaW50KCJSU1NJMSA9ICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkXG4iLAorCQkJCVJTU0lbMV1bMF0sIFJTU0lbMV1bMV0sIFJTU0lbMV1bMl0sCisJCQkJUlNTSVsxXVszXSwgUlNTSVsxXVs0XSwgUlNTSVsxXVs1XSwKKwkJCQlSU1NJWzFdWzZdLCBSU1NJWzFdWzddLCBSU1NJWzFdWzhdLAorCQkJCVJTU0lbMV1bOV0pOworCQl9CisJCWlmICggcEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+PSAzICkgLy8gM1IKKwkJeworCQkJYXRlX3ByaW50KCJSU1NJMiA9ICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkXG4iLAorCQkJCVJTU0lbMl1bMF0sIFJTU0lbMl1bMV0sIFJTU0lbMl1bMl0sCisJCQkJUlNTSVsyXVszXSwgUlNTSVsyXVs0XSwgUlNTSVsyXVs1XSwKKwkJCQlSU1NJWzJdWzZdLCBSU1NJWzJdWzddLCBSU1NJWzJdWzhdLAorCQkJCVJTU0lbMl1bOV0pOworCQl9CisJCWF0ZV9wcmludCgiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CisjZW5kaWYgLy8gMCAvLworCX0KKworCXBBZC0+YXRlLkNoYW5uZWwgPSBPcmdfQ2hhbm5lbDsKKwlBVEVBc2ljU3dpdGNoQ2hhbm5lbChwQWQpOworCisJLy8gUmVzdG9yZSBvcmlnaW5hbCB2YWx1ZQorICAgIEFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIE9yZ19CQlA2NnZhbHVlKTsKKyAgICBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY5LCBPcmdfQkJQNjl2YWx1ZSk7CisgICAgQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgT3JnX0JCUDcwdmFsdWUpOworCisJcmV0dXJuOworfQorCitCT09MRUFOIFN5bmNUeFJ4Q29uZmlnKFBSVE1QX0FEQVBURVIgcEFkLCBVU0hPUlQgb2Zmc2V0LCBVQ0hBUiB2YWx1ZSkKK3sKKwlVQ0hBUiB0bXAgPSAwLCBiYnBfZGF0YSA9IDA7CisKKwlpZiAoQVRFX09OKHBBZCkpCisJeworCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIG9mZnNldCwgJmJicF9kYXRhKTsKKwl9CisJZWxzZQorCXsKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgb2Zmc2V0LCAmYmJwX2RhdGEpOworCX0KKworCS8qIGNvbmZpcm0gYWdhaW4gKi8KKwlBU1NFUlQoYmJwX2RhdGEgPT0gdmFsdWUpOworCisJc3dpdGNoKG9mZnNldCkKKwl7CisJCWNhc2UgQkJQX1IxOgorCQkJLyogTmVlZCB0byBzeW5jLiB0eCBjb25maWd1cmF0aW9uIHdpdGggbGVnYWN5IEFURS4gKi8KKwkJCXRtcCA9IChiYnBfZGF0YSAmICgoMSA8PCA0KSB8ICgxIDw8IDMpKS8qIDB4MTggKi8pID4+IDM7CisJCSAgICBzd2l0Y2godG1wKQorCQkgICAgeworCQkJCS8qIFRoZSBCQlAgUjEgYml0WzQ6M10gPSAyIDo6IEJvdGggREFDcyB3aWxsIGJlIHVzZWQgYnkgUUEuICovCisJCSAgICAgICAgY2FzZSAyOgorCQkJCQkvKiBBbGwgKi8KKwkJCQkJcEFkLT5hdGUuVHhBbnRlbm5hU2VsID0gMDsKKwkJICAgICAgICAgICAgYnJlYWs7CisJCQkJLyogVGhlIEJCUCBSMSBiaXRbNDozXSA9IDAgOjogREFDIDAgd2lsbCBiZSB1c2VkIGJ5IFFBLiAqLworCQkgICAgICAgIGNhc2UgMDoKKwkJCQkJLyogQW50ZW5uYSBvbmUgKi8KKwkJCQkJcEFkLT5hdGUuVHhBbnRlbm5hU2VsID0gMTsKKwkJICAgICAgICAgICAgYnJlYWs7CisJCQkJLyogVGhlIEJCUCBSMSBiaXRbNDozXSA9IDEgOjogREFDIDEgd2lsbCBiZSB1c2VkIGJ5IFFBLiAqLworCQkgICAgICAgIGNhc2UgMToKKwkJCQkJLyogQW50ZW5uYSB0d28gKi8KKwkJCQkJcEFkLT5hdGUuVHhBbnRlbm5hU2VsID0gMjsKKwkJICAgICAgICAgICAgYnJlYWs7CisJCSAgICAgICAgZGVmYXVsdDoKKwkJICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgLS0gU3RoLiB3cm9uZyEgIDogcmV0dXJuIEZBTFNFOyBcbiIsIF9fZnVuY19fKSk7CisJCSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKwkJICAgIH0KKwkJCWJyZWFrOy8qIGNhc2UgQkJQX1IxICovCisKKwkJY2FzZSBCQlBfUjM6CisJCQkvKiBOZWVkIHRvIHN5bmMuIHJ4IGNvbmZpZ3VyYXRpb24gd2l0aCBsZWdhY3kgQVRFLiAqLworCQkJdG1wID0gKGJicF9kYXRhICYgKCgxIDw8IDEpIHwgKDEgPDwgMCkpLyogMHgwMyAqLyk7CisJCSAgICBzd2l0Y2godG1wKQorCQkgICAgeworCQkJCS8qIFRoZSBCQlAgUjMgYml0WzE6MF0gPSAzIDo6IEFsbCBBRENzIHdpbGwgYmUgdXNlZCBieSBRQS4gKi8KKwkJICAgICAgICBjYXNlIDM6CisJCQkJCS8qIEFsbCAqLworCQkJCQlwQWQtPmF0ZS5SeEFudGVubmFTZWwgPSAwOworCQkgICAgICAgICAgICBicmVhazsKKwkJCQkvKiBUaGUgQkJQIFIzIGJpdFsxOjBdID0gMCA6OiBBREMgMCB3aWxsIGJlIHVzZWQgYnkgUUEsICovCisJCQkJLyogdW5sZXNzIHRoZSBCQlAgUjMgYml0WzQ6M10gPSAyICovCisJCSAgICAgICAgY2FzZSAwOgorCQkJCQkvKiBBbnRlbm5hIG9uZSAqLworCQkJCQlwQWQtPmF0ZS5SeEFudGVubmFTZWwgPSAxOworCQkJCQl0bXAgPSAoKGJicF9kYXRhICYgKCgxIDw8IDQpIHwgKDEgPDwgMykpLyogMHgwMyAqLykgPj4gMyk7CisJCQkJCWlmICh0bXAgPT0gMikvLyAzUgorCQkJCQl7CisJCQkJCQkvKiBEZWZhdWx0IDogQWxsIEFEQ3Mgd2lsbCBiZSB1c2VkIGJ5IFFBICovCisJCQkJCQlwQWQtPmF0ZS5SeEFudGVubmFTZWwgPSAwOworCQkJCQl9CisJCSAgICAgICAgICAgIGJyZWFrOworCQkJCS8qIFRoZSBCQlAgUjMgYml0WzE6MF0gPSAxIDo6IEFEQyAxIHdpbGwgYmUgdXNlZCBieSBRQS4gKi8KKwkJICAgICAgICBjYXNlIDE6CisJCQkJCS8qIEFudGVubmEgdHdvICovCisJCQkJCXBBZC0+YXRlLlJ4QW50ZW5uYVNlbCA9IDI7CisJCSAgICAgICAgICAgIGJyZWFrOworCQkJCS8qIFRoZSBCQlAgUjMgYml0WzE6MF0gPSAyIDo6IEFEQyAyIHdpbGwgYmUgdXNlZCBieSBRQS4gKi8KKwkJICAgICAgICBjYXNlIDI6CisJCQkJCS8qIEFudGVubmEgdGhyZWUgKi8KKwkJCQkJcEFkLT5hdGUuUnhBbnRlbm5hU2VsID0gMzsKKwkJICAgICAgICAgICAgYnJlYWs7CisJCSAgICAgICAgZGVmYXVsdDoKKwkJICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgLS0gSW1wb3NzaWJsZSEgIDogcmV0dXJuIEZBTFNFOyBcbiIsIF9fZnVuY19fKSk7CisJCSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKwkJICAgIH0KKwkJCWJyZWFrOy8qIGNhc2UgQkJQX1IzICovCisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIC0tIFN0aC4gd3JvbmchICA6IHJldHVybiBGQUxTRTsgXG4iLCBfX2Z1bmNfXykpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisJfQorCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgVk9JRCBtZW1jcHlfZXhsKFBSVE1QX0FEQVBURVIgcEFkLCBVQ0hBUiAqZHN0LCBVQ0hBUiAqc3JjLCBVTE9ORyBsZW4pCit7CisJVUxPTkcgaSwgVmFsdWUgPSAwOworCVVMT05HICpwRHN0LCAqcFNyYzsKKwlVQ0hBUiAqcDg7CisKKwlwOCA9IHNyYzsKKwlwRHN0ID0gKFVMT05HICopIGRzdDsKKwlwU3JjID0gKFVMT05HICopIHNyYzsKKworCWZvciAoaSA9IDAgOyBpIDwgKGxlbi80KTsgaSsrKQorCXsKKwkJLyogRm9yIGFsaWdubWVudCBpc3N1ZSwgd2UgbmVlZCBhIHZhcmlhYmxlICJWYWx1ZSIuICovCisJCW1lbW1vdmUoJlZhbHVlLCBwU3JjLCA0KTsKKwkJVmFsdWUgPSBodG9ubChWYWx1ZSk7CisJCW1lbW1vdmUocERzdCwgJlZhbHVlLCA0KTsKKwkJcERzdCsrOworCQlwU3JjKys7CisJfQorCWlmICgobGVuICUgNCkgIT0gMCkKKwl7CisJCS8qIHdpc2ggdGhhdCBpdCB3aWxsIG5ldmVyIHJlYWNoIGhlcmUgKi8KKwkJbWVtbW92ZSgmVmFsdWUsIHBTcmMsIChsZW4gJSA0KSk7CisJCVZhbHVlID0gaHRvbmwoVmFsdWUpOworCQltZW1tb3ZlKHBEc3QsICZWYWx1ZSwgKGxlbiAlIDQpKTsKKwl9Cit9CisKK3N0YXRpYyBWT0lEIG1lbWNweV9leHMoUFJUTVBfQURBUFRFUiBwQWQsIFVDSEFSICpkc3QsIFVDSEFSICpzcmMsIFVMT05HIGxlbikKK3sKKwlVTE9ORyBpOworCVVDSEFSICpwRHN0LCAqcFNyYzsKKworCXBEc3QgPSBkc3Q7CisJcFNyYyA9IHNyYzsKKworCWZvciAoaSA9IDA7IGkgPCAobGVuLzIpOyBpKyspCisJeworCQltZW1tb3ZlKHBEc3QsIHBTcmMsIDIpOworCQkqKChVU0hPUlQgKilwRHN0KSA9IGh0b25zKCooKFVTSE9SVCAqKXBEc3QpKTsKKwkJcERzdCs9MjsKKwkJcFNyYys9MjsKKwl9CisKKwlpZiAoKGxlbiAlIDIpICE9IDApCisJeworCQltZW1tb3ZlKHBEc3QsIHBTcmMsIDEpOworCX0KK30KKworc3RhdGljIFZPSUQgUlRNUF9JT19SRUFEX0JVTEsoUFJUTVBfQURBUFRFUiBwQWQsIFVDSEFSICpkc3QsIFVDSEFSICpzcmMsIFVJTlQzMiBsZW4pCit7CisJVUlOVDMyIGksIFZhbHVlOworCVVJTlQzMiAqcERzdCwgKnBTcmM7CisKKwlwRHN0ID0gKFVJTlQzMiAqKSBkc3Q7CisJcFNyYyA9IChVSU5UMzIgKikgc3JjOworCisJZm9yIChpID0gMCA7IGkgPCAobGVuLzQpOyBpKyspCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIChVTE9ORylwU3JjLCAmVmFsdWUpOworCQlWYWx1ZSA9IGh0b25sKFZhbHVlKTsKKwkJbWVtbW92ZShwRHN0LCAmVmFsdWUsIDQpOworCQlwRHN0Kys7CisJCXBTcmMrKzsKKwl9CisJcmV0dXJuOworfQorCisvLyBUT0RPOgorI2lmIDAKKy8qIFRoZXNlIHdvcmsgb25seSB3aGVuIFJBTElOS19BVEUgaXMgZGVmaW5lZCAqLworSU5UIFNldF9UeFN0YXJ0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVMT05HIHZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKwlVQ0hBUiBidWZmZXJbMjZdID0gezB4ODgsIDB4MDIsIDB4MmMsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MTEsIDB4MjIsIDB4MzMsIDB4NDQsIDB4NTUsIDB4MDAsIDB4NTUsIDB4NDQsIDB4MzMsIDB4MjIsIDB4MTEsIDB4YzAsIDB4MjIsIDB4MDAsIDB4MDB9OworCVBPU19DT09LSUUgcE9iajsKKworCWlmIChwQWQtPmF0ZS5UeFN0YXR1cyAhPSAwKQorCQlyZXR1cm4gRkFMU0U7CisKKwlwQWQtPmF0ZS5UeEluZm8gPSAweDA0MDAwMDAwOworCWJ6ZXJvKCZwQWQtPmF0ZS5UeFdJLCBzaXplb2YoVFhXSV9TVFJVQykpOworCXBBZC0+YXRlLlR4V0kuUEhZTU9ERSA9IDA7Ly8gTU9ERV9DQ0sKKwlwQWQtPmF0ZS5UeFdJLk1QRFV0b3RhbEJ5dGVDb3VudCA9IDEyMjY7CisJcEFkLT5hdGUuVHhXSS5NQ1MgPSAzOworCS8vcEFkLT5hdGUuTW9kZSA9IEFURV9TVEFSVDsKKwlwQWQtPmF0ZS5Nb2RlIHw9IEFURV9UWEZSQU1FOworCXBBZC0+YXRlLlR4Q291bnQgPSB2YWx1ZTsKKwlwQWQtPmF0ZS5RSUQgPSAwOworCXBBZC0+YXRlLkhMZW4gPSAyNjsKKwlwQWQtPmF0ZS5QTGVuID0gMDsKKwlwQWQtPmF0ZS5ETGVuID0gMTIwMDsKKwltZW1jcHkocEFkLT5hdGUuSGVhZGVyLCBidWZmZXIsIDI2KTsKKwlwQWQtPmF0ZS5iUUFUeFN0YXJ0ID0gVFJVRTsKKwkvL3BPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisJLy90YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5BdGVUeFRhc2spOworCXJldHVybiBUUlVFOworfQorI2VuZGlmICAvKiBlbmQgb2YgI2lmIDAgKi8KKworSU5UIFNldF9UeFN0b3BfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTZXRfVHhTdG9wX1Byb2NcbiIpKTsKKworCWlmIChTZXRfQVRFX1Byb2MocEFkLCAiVFhTVE9QIikpCisJeworCXJldHVybiBUUlVFOworfQorCWVsc2UKKwl7CisJCXJldHVybiBGQUxTRTsKKwl9Cit9CisKK0lOVCBTZXRfUnhTdG9wX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU2V0X1J4U3RvcF9Qcm9jXG4iKSk7CisKKwlpZiAoU2V0X0FURV9Qcm9jKHBBZCwgIlJYU1RPUCIpKQorCXsKKwlyZXR1cm4gVFJVRTsKK30KKwllbHNlCisJeworCQlyZXR1cm4gRkFMU0U7CisJfQorfQorCisjaWYgMAorSU5UIFNldF9FRVdyaXRlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVTSE9SVCBvZmZzZXQgPSAwLCB2YWx1ZTsKKwlQVUNIQVIgcDIgPSBhcmc7CisKKwl3aGlsZSgoKnAyICE9ICc6JykgJiYgKCpwMiAhPSAnXDAnKSkKKwl7CisJCXAyKys7CisJfQorCisJaWYgKCpwMiA9PSAnOicpCisJeworCQlBMkhleChvZmZzZXQsIGFyZyk7CisJCUEySGV4KHZhbHVlLCBwMisgMSk7CisJfQorCWVsc2UKKwl7CisJCUEySGV4KHZhbHVlLCBhcmcpOworCX0KKworCWlmIChvZmZzZXQgPj0gRUVQUk9NX1NJWkUpCisJeworCQlhdGVfcHJpbnQoIk9mZnNldCBjYW4gbm90IGV4Y2VlZCBFRVBST01fU0laRSggPT0gMHglMDR4KVxuIiwgRUVQUk9NX1NJWkUpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJUlRNUF9FRVBST01fV1JJVEUxNihwQWQsIG9mZnNldCwgdmFsdWUpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVCBTZXRfQkJQUmVhZF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVQ0hBUiB2YWx1ZSA9IDAsIG9mZnNldDsKKworCUEySGV4KG9mZnNldCwgYXJnKTsKKworCWlmIChBVEVfT04ocEFkKSkKKwl7CisJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgb2Zmc2V0LCAgJnZhbHVlKTsKKwl9CisJZWxzZQorCXsKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgb2Zmc2V0LCAgJnZhbHVlKTsKKwl9CisKKwlhdGVfcHJpbnQoIiV4XG4iLCB2YWx1ZSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworCitJTlQgU2V0X0JCUFdyaXRlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVVTSE9SVCBvZmZzZXQgPSAwOworCVBVQ0hBUiBwMiA9IGFyZzsKKwlVQ0hBUiB2YWx1ZTsKKworCXdoaWxlKCgqcDIgIT0gJzonKSAmJiAoKnAyICE9ICdcMCcpKQorCXsKKwkJcDIrKzsKKwl9CisKKwlpZiAoKnAyID09ICc6JykKKwl7CisJCUEySGV4KG9mZnNldCwgYXJnKTsKKwkJQTJIZXgodmFsdWUsIHAyKyAxKTsKKwl9CisJZWxzZQorCXsKKwkJQTJIZXgodmFsdWUsIGFyZyk7CisJfQorCisJaWYgKEFURV9PTihwQWQpKQorCXsKKwkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgb2Zmc2V0LCAgdmFsdWUpOworCX0KKwllbHNlCisJeworCQlSVE5QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgb2Zmc2V0LCAgdmFsdWUpOworCX0KKworCXJldHVybiBUUlVFOworfQorCitJTlQgU2V0X1JGV3JpdGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJUFVDSEFSIHAyLCBwMywgcDQ7CisJVUxPTkcgUjEsIFIyLCBSMywgUjQ7CisKKwlwMiA9IGFyZzsKKworCXdoaWxlKCgqcDIgIT0gJzonKSAmJiAoKnAyICE9ICdcMCcpKQorCXsKKwkJcDIrKzsKKwl9CisKKwlpZiAoKnAyICE9ICc6JykKKwkJcmV0dXJuIEZBTFNFOworCisJcDMgPSBwMiArIDE7CisKKwl3aGlsZSgoKnAzICE9ICc6JykgJiYgKCpwMyAhPSAnXDAnKSkKKwl7CisJCXAzKys7CisJfQorCisJaWYgKCpwMyAhPSAnOicpCisJCXJldHVybiBGQUxTRTsKKworCXA0ID0gcDMgKyAxOworCisJd2hpbGUoKCpwNCAhPSAnOicpICYmICgqcDQgIT0gJ1wwJykpCisJeworCQlwNCsrOworCX0KKworCWlmICgqcDQgIT0gJzonKQorCQlyZXR1cm4gRkFMU0U7CisKKworCUEySGV4KFIxLCBhcmcpOworCUEySGV4KFIyLCBwMiArIDEpOworCUEySGV4KFIzLCBwMyArIDEpOworCUEySGV4KFI0LCBwNCArIDEpOworCisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjEpOworCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIyKTsKKwlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMyk7CisJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjQpOworCisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgIC8vIGVuZCBvZiAjaWYgMCAvLworI2VuZGlmCS8vIFJBTElOS18yOHh4X1FBIC8vCisKKyNlbmRpZgkvLyBSQUxJTktfQVRFIC8vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfYXRlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0X2F0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MThjZTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0X2F0ZS5oCkBAIC0wLDAgKzEsMzE1IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaWZuZGVmIF9fQVRFX0hfXworI2RlZmluZSBfX0FURV9IX18KKworI2lmbmRlZiBVQ09TCisjZGVmaW5lIGF0ZV9wcmludCBwcmludGsKKyNkZWZpbmUgQVRFREJHUFJJTlQgREJHUFJJTlQKKworI2lmZGVmIFJUMjg3MAorI2RlZmluZSBFRVBST01fU0laRQkJCQkJCQkJMHg0MDAKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNkZWZpbmUgRUVQUk9NX0JJTl9GSUxFX05BTUUgICIvZXRjL1dpcmVsZXNzL1JUMjg3MFNUQS9lMnAuYmluIgorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworI2VuZGlmIC8vIFJUMjg3MCAvLworI2Vsc2UgLy8gIVVDT1MgLy8KKyNkZWZpbmUgZkFURV9MT0FEX0VFUFJPTQkJCQkJCTB4MEM0MworI2lmZGVmIENPTkZJR19QUklOVEsKK2V4dGVybiBJTlQgQ29uc29sZVJlc3BvbnNlKElOIFBVQ0hBUiBidWZmKTsKK2V4dGVybiBpbnQgKCpyZW1vdGVfZGlzcGxheSkoY2hhciAqKTsKK2V4dGVybiB2b2lkIHB1dHMgKGNvbnN0IGNoYXIgKnMpOworCisvKiBzcGVjaWZpY2x5IGRlZmluZWQgdG8gcmVkaXJlY3QgYW5kIHNob3cgYXRlLXJlbGF0ZWQgbWVzc2FnZXMgdG8gaG9zdC4gKi8KKy8qIFRyeSB0byBkZWZpbmUgYXRlX3ByaW50IGFzIGEgbWFjcm8uICovCisjZGVmaW5lIGF0ZV9wcmludChmbXQsIGFyZ3MuLi4pICAgICAgICAgICAgICAgICBcCitkb3sgICBpbnQgKCpvcmdfcmVtb3RlX2Rpc3BsYXkpKGNoYXIgKikgPSBOVUxMOyAgIFwKKwlvcmdfcmVtb3RlX2Rpc3BsYXkgPSByZW1vdGVfZGlzcGxheTtcCisJLyogU2F2ZSBvcmlnaW5hbCAicmVtb3RlX2Rpc3BsYXkiICovXAorCXJlbW90ZV9kaXNwbGF5ID0gKGludCAoKikoY2hhciAqKSlDb25zb2xlUmVzcG9uc2U7ICAgICAgICAgICBcCisJcHJpbnRrKGZtdCwgIyMgYXJncyk7ICAgICAgICAgICAgICAgICAgICAgICBcCisJLyogUmVzdG9yZSB0aGUgcmVtb3RlX2Rpc3BsYXkgZnVuY3Rpb24gcG9pbnRlciAqLyAgICAgICAgXAorCXJlbW90ZV9kaXNwbGF5ID0gb3JnX3JlbW90ZV9kaXNwbGF5OyB9d2hpbGUoMCkKKworI2RlZmluZSBBVEVEQkdQUklOVChMZXZlbCwgRm10KSAgICAJXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoTGV2ZWwpIDw9IFJURGVidWdMZXZlbCkgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGF0ZV9wcmludCBGbXQ7CQkJCQlcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZW5kaWYgLy8gQ09ORklHX1BSSU5USyAvLworI2VuZGlmIC8vICFVQ09TIC8vCisKKyNkZWZpbmUgQVRFX09OKF9wKSAgICAgICAgICAgICAgKCgoX3ApLT5hdGUuTW9kZSkgIT0gQVRFX1NUT1ApCisKKy8qIFJUMjg4MF9pTklDIHdpbGwgZGVmaW5lICJSVDI4NjAiLiAqLworCisvKiBSVDI4ODBfaU5JQyB3aWxsIGRlZmluZSBSVDI4NjAuICovCisKKyNpZmRlZiBSVDI4NzAKKyNkZWZpbmUgRUVQUk9NX1NJWkUJCQkJCQkJCTB4NDAwCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZGVmaW5lIEVFUFJPTV9CSU5fRklMRV9OQU1FICAiL2V0Yy9XaXJlbGVzcy9SVDI4NzBTVEEvZTJwLmJpbiIKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworI2lmZGVmIFJUMjg3MAorI2RlZmluZSBBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChfQSwgX0ksIF9wVikgICAgUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKF9BLCBfSSwgX3BWKQorI2RlZmluZSBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQoX0EsIF9JLCBfVikgICAgUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChfQSwgX0ksIF9WKQorCisjZGVmaW5lIEJVTEtfT1VUX0xPQ0socExvY2ssIElycUZsYWdzKQlcCisJCWlmKDEgLyohKGluX2ludGVycnVwdCgpICYgMHhmZmZmMDAwMCkqLykJXAorCQkJUlRNUF9JUlFfTE9DSygocExvY2spLCBJcnFGbGFncyk7CisKKyNkZWZpbmUgQlVMS19PVVRfVU5MT0NLKHBMb2NrLCBJcnFGbGFncykJXAorCQlpZigxIC8qIShpbl9pbnRlcnJ1cHQoKSAmIDB4ZmZmZjAwMDApKi8pCVwKKwkJCVJUTVBfSVJRX1VOTE9DSygocExvY2spLCBJcnFGbGFncyk7CisKKy8vIFByb3RvdHlwZXMgb2YgY29tcGxldGlvbiBmdW51Yy4KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKyNkZWZpbmUgQVRFX1JUVVNCQnVsa091dERhdGFQYWNrZXRDb21wbGV0ZShwdXJiLCBwdF9yZWdzKSAgICBBVEVfUlRVU0JCdWxrT3V0RGF0YVBhY2tldENvbXBsZXRlKHB1cmIpCisjZW5kaWYKKworVk9JRCBBVEVfUlRVU0JCdWxrT3V0RGF0YVBhY2tldENvbXBsZXRlKAorCUlOIHB1cmJiX3QgcHVyYiwKKwlPVVQgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpOworCitWT0lEIEFURV9SVFVTQkJ1bGtPdXREYXRhUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJQnVsa091dFBpcGVJZCk7CisKK1ZPSUQgQVRFX1JUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKK1ZPSUQgcnRfZWVfcmVhZF9hbGwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJT1VUIFVTSE9SVCAqRGF0YSk7CisKKworVk9JRCBydF9lZV93cml0ZV9hbGwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVTSE9SVCAqRGF0YSk7CisKK0lOVCBTZXRfQVRFX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfREFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9TQV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQVRFX0JTU0lEX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfQ0hBTk5FTF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQVRFX1RYX1BPV0VSMF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQVRFX1RYX1BPV0VSMV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQVRFX1RYX0FudGVubmFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9SWF9BbnRlbm5hX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfVFhfRlJFUU9GRlNFVF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQVRFX1RYX0JXX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfVFhfTEVOR1RIX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfVFhfQ09VTlRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9UWF9NQ1NfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0FURV9UWF9NT0RFX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfVFhfR0lfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCisKK0lOVAlTZXRfQVRFX1JYX0ZFUl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQVRFX1JlYWRfUkZfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0FURV9Xcml0ZV9SRjFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0FURV9Xcml0ZV9SRjJfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0FURV9Xcml0ZV9SRjNfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0FURV9Xcml0ZV9SRjRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0FURV9Mb2FkX0UyUF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfQVRFX1JlYWRfRTJQX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9BVEVfU2hvd19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQVRFX0hlbHBfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCisjaWZkZWYgUkFMSU5LX0FURQorI2lmZGVmIFJBTElOS18yOHh4X1FBCitWT0lEIEFURV9RQV9TdGF0aXN0aWNzKAorCUlOIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiBQUlhXSV9TVFJVQwkJCXBSeFdJLAorCUlOIFBSVDI4WFhfUlhEX1NUUlVDICAgIHAyOHh4UnhELAorCUlOIFBIRUFERVJfODAyXzExCQlwSGVhZGVyKTsKKworVk9JRCBSdG1wRG9BdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglzdHJ1Y3QgaXdyZXEJKndycSk7CisKK1ZPSUQgQnViYmxlU29ydCgKKwlJTiAgSU5UMzIgbiwKKwlJTiAgSU5UMzIgYVtdKTsKKworVk9JRCBDYWxOb2lzZUxldmVsKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisJSU4gIFVDSEFSICAgICAgICAgICBjaGFubmVsLAorCU9VVCBJTlQzMiAgICAgICAgICAgYnVmZmVyWzNdWzEwXSk7CisKK0JPT0xFQU4gU3luY1R4UnhDb25maWcoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglVU0hPUlQJCQlvZmZzZXQsCisJSU4JVUNIQVIJCQl2YWx1ZSk7CisKKyNpZiAwCitJTlQgU2V0X1R4U3RhcnRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworI2VuZGlmICAvLyAwIC8vCisKK0lOVCBTZXRfVHhTdG9wX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9SeFN0b3BfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCisjaWYgMAorSU5UIFNldF9FRVJlYWRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0VFV3JpdGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0JCUFJlYWRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0JCUFdyaXRlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9SRldyaXRlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKyNlbmRpZiAvLyBlbmQgb2YgI2lmIDAgLy8KKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworVk9JRCBBVEVBc2ljU3dpdGNoQ2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgQVRFQXNpY0FkanVzdFR4UG93ZXIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIEFURURpc2FibGVBc2ljUHJvdGVjdCgKKwlJTgkJUFJUTVBfQURBUFRFUglwQWQpOworCitDSEFSIEFURUNvbnZlcnRUb1Jzc2koCisJSU4gUFJUTVBfQURBUFRFUiAgcEFkLAorCUlOIENIQVIJCQkJUnNzaSwKKwlJTiBVQ0hBUiAgICBSc3NpTnVtYmVyKTsKKworVk9JRCBBVEVTYW1wbGVSc3NpKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFBSWFdJX1NUUlVDCQlwUnhXSSk7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorVk9JRCBSVE1QU3RhdGlvblN0b3AoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIFJUTVBTdGF0aW9uU3RhcnQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworI2VuZGlmIC8vIF9fQVRFX0hfXyAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF9jb25maWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNmZTI2NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfY29uZmlnLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJcnRfY29uZmlnLmgKKworCUFic3RyYWN0OgorCUNlbnRyYWwgaGVhZGVyIGZpbGUgdG8gbWFpbnRhaW4gYWxsIGluY2x1ZGUgZmlsZXMgZm9yIGFsbCBORElTCisJbWluaXBvcnQgZHJpdmVyIHJvdXRpbmVzLgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKwktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlQYXVsIExpbiAgICAwOC0wMS0yMDAyICAgIGNyZWF0ZWQKKworKi8KKyNpZm5kZWYJX19SVF9DT05GSUdfSF9fCisjZGVmaW5lCV9fUlRfQ09ORklHX0hfXworCisjaW5jbHVkZSAgICAicnRtcF90eXBlLmgiCisjaWZkZWYgVUNPUworI2luY2x1ZGUgImluY2x1ZGVzLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIAkicnRfdWNvcy5oIgorI2VuZGlmCisKKyNpZmRlZiBMSU5VWAorI2luY2x1ZGUJInJ0X2xpbnV4LmgiCisjZW5kaWYKKyNpbmNsdWRlICAgICJydG1wX2RlZi5oIgorI2luY2x1ZGUgICAgInJ0Mjh4eC5oIgorCisKKyNpZmRlZiBSVDI4NzAKKyNpbmNsdWRlCSJydDI4NzAuaCIKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworI2luY2x1ZGUgICAgIm9pZC5oIgorI2luY2x1ZGUgICAgIm1sbWUuaCIKKyNpbmNsdWRlICAgICJ3cGEuaCIKKyNpbmNsdWRlICAgICJtZDUuaCIKKyNpbmNsdWRlICAgICJydG1wLmgiCisjaW5jbHVkZQkiYXAuaCIKKyNpbmNsdWRlCSJkZnMuaCIKKyNpbmNsdWRlCSJjaGxpc3QuaCIKKyNpbmNsdWRlCSJzcGVjdHJ1bS5oIgorCisKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKyNpbmNsdWRlICAgICJsZWFwLmgiCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisKKyNpZmRlZiBCTE9DS19ORVRfSUYKKyNpbmNsdWRlICJuZXRpZl9ibG9jay5oIgorI2VuZGlmIC8vIEJMT0NLX05FVF9JRiAvLworCisjaWZkZWYgSUdNUF9TTk9PUF9TVVBQT1JUCisjaW5jbHVkZSAiaWdtcF9zbm9vcC5oIgorI2VuZGlmIC8vIElHTVBfU05PT1BfU1VQUE9SVCAvLworCisjaWZkZWYgUkFMSU5LX0FURQorI2luY2x1ZGUgInJ0X2F0ZS5oIgorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2lmbmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjZXJyb3IgIkJ1aWxkIGZvciBiZWluZyBjb250cm9sbGVkIGJ5IE5ldHdvcmtNYW5hZ2VyIG9yIHdleHQsIHBsZWFzZSBzZXQgSEFTX1dQQV9TVVBQTElDQU5UPXkgYW5kIEhBU19OQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVD15IgorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBJS0FOT1NfVlhfMVgwCisjaW5jbHVkZQkidnJfaWthbnMuaCIKKyNlbmRpZiAvLyBJS0FOT1NfVlhfMVgwIC8vCisKKyNlbmRpZgkvLyBfX1JUX0NPTkZJR19IX18KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF9saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF9saW51eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MmUzZDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0X2xpbnV4LmMKQEAgLTAsMCArMSwxMDk1IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaW5jbHVkZSAicnRfY29uZmlnLmgiCisKK1VMT05HCVJURGVidWdMZXZlbCA9IFJUX0RFQlVHX0VSUk9SOworCitCVUlMRF9USU1FUl9GVU5DVElPTihNbG1lUGVyaW9kaWNFeGVjKTsKKy8vQlVJTERfVElNRVJfRlVOQ1RJT04oTWxtZVJzc2lSZXBvcnRFeGVjKTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKEFzaWNSeEFudEV2YWxUaW1lb3V0KTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKEFQU0RQZXJpb2RpY0V4ZWMpOworQlVJTERfVElNRVJfRlVOQ1RJT04oQXNpY1JmVHVuaW5nRXhlYyk7CisjaWZkZWYgUlQyODcwCitCVUlMRF9USU1FUl9GVU5DVElPTihCZWFjb25VcGRhdGVFeGVjKTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitCVUlMRF9USU1FUl9GVU5DVElPTihCZWFjb25UaW1lb3V0KTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKFNjYW5UaW1lb3V0KTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKEF1dGhUaW1lb3V0KTsKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKEFzc29jVGltZW91dCk7CitCVUlMRF9USU1FUl9GVU5DVElPTihSZWFzc29jVGltZW91dCk7CitCVUlMRF9USU1FUl9GVU5DVElPTihEaXNhc3NvY1RpbWVvdXQpOworQlVJTERfVElNRVJfRlVOQ1RJT04oTGlua0Rvd25FeGVjKTsKKyNpZmRlZiBMRUFQX1NVUFBPUlQKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKExlYXBBdXRoVGltZW91dCk7CisjZW5kaWYKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMpOworQlVJTERfVElNRVJfRlVOQ1RJT04oV3BhRGlzYXNzb2NBcEFuZEJsb2NrQXNzb2MpOworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorQlVJTERfVElNRVJfRlVOQ1RJT04oRGxzVGltZW91dEFjdGlvbik7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKy8vIGZvciB3aXJlbGVzcyBzeXN0ZW0gZXZlbnQgbWVzc2FnZQorY2hhciBjb25zdCAqcFdpcmVsZXNzU3lzRXZlbnRUZXh0W0lXX1NZU19FVkVOVF9UWVBFX05VTV0gPSB7CisJLy8gc3lzdGVtIHN0YXR1cyBldmVudAorICAgICJoYWQgYXNzb2NpYXRlZCBzdWNjZXNzZnVsbHkiLAkJCQkJCQkvKiBJV19BU1NPQ19FVkVOVF9GTEFHICovCisgICAgImhhZCBkaXNhc3NvY2lhdGVkIiwJCQkJCQkJCQkvKiBJV19ESVNBU1NPQ19FVkVOVF9GTEFHICovCisgICAgImhhZCBkZWF1dGhlbnRpY2F0ZWQiLAkJCQkJCQkJCS8qIElXX0RFQVVUSF9FVkVOVF9GTEFHICovCisgICAgImhhZCBiZWVuIGFnZWQtb3V0IGFuZCBkaXNhc3NvY2lhdGVkIiwJCQkJCS8qIElXX0FHRU9VVF9FVkVOVF9GTEFHICovCisgICAgIm9jY3VycmVkIENvdW50ZXJNZWFzdXJlcyBhdHRhY2siLAkJCQkJCS8qIElXX0NPVU5URVJfTUVBU1VSRVNfRVZFTlRfRkxBRyAqLworICAgICJvY2N1cnJlZCByZXBsYXkgY291bnRlciBkaWZmZXJlbnQgaW4gS2V5IEhhbmRzaGFraW5nIiwJLyogSVdfUkVQTEFZX0NPVU5URVJfRElGRl9FVkVOVF9GTEFHICovCisgICAgIm9jY3VycmVkIFJTTklFIGRpZmZlcmVudCBpbiBLZXkgSGFuZHNoYWtpbmciLAkJCS8qIElXX1JTTklFX0RJRkZfRVZFTlRfRkxBRyAqLworICAgICJvY2N1cnJlZCBNSUMgZGlmZmVyZW50IGluIEtleSBIYW5kc2hha2luZyIsCQkJLyogSVdfTUlDX0RJRkZfRVZFTlRfRkxBRyAqLworICAgICJvY2N1cnJlZCBJQ1YgZXJyb3IgaW4gUlgiLAkJCQkJCQkJLyogSVdfSUNWX0VSUk9SX0VWRU5UX0ZMQUcgKi8KKyAgICAib2NjdXJyZWQgTUlDIGVycm9yIGluIFJYIiwJCQkJCQkJCS8qIElXX01JQ19FUlJPUl9FVkVOVF9GTEFHICovCisJIkdyb3VwIEtleSBIYW5kc2hha2luZyB0aW1lb3V0IiwJCQkJCQkvKiBJV19HUk9VUF9IU19USU1FT1VUX0VWRU5UX0ZMQUcgKi8KKwkiUGFpcndpc2UgS2V5IEhhbmRzaGFraW5nIHRpbWVvdXQiLAkJCQkJCS8qIElXX1BBSVJXSVNFX0hTX1RJTUVPVVRfRVZFTlRfRkxBRyAqLworCSJSU04gSUUgc2FuaXR5IGNoZWNrIGZhaWx1cmUiLAkJCQkJCQkvKiBJV19SU05JRV9TQU5JVFlfRkFJTF9FVkVOVF9GTEFHICovCisJInNldCBrZXkgZG9uZSBpbiBXUEEvV1BBUFNLIiwJCQkJCQkJLyogSVdfU0VUX0tFWV9ET05FX1dQQTFfRVZFTlRfRkxBRyAqLworCSJzZXQga2V5IGRvbmUgaW4gV1BBMi9XUEEyUFNLIiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogSVdfU0VUX0tFWV9ET05FX1dQQTJfRVZFTlRfRkxBRyAqLworCSJjb25uZWN0cyB3aXRoIG91ciB3aXJlbGVzcyBjbGllbnQiLCAgICAgICAgICAgICAgICAgICAgLyogSVdfU1RBX0xJTktVUF9FVkVOVF9GTEFHICovCisJImRpc2Nvbm5lY3RzIHdpdGggb3VyIHdpcmVsZXNzIGNsaWVudCIsICAgICAgICAgICAgICAgICAvKiBJV19TVEFfTElOS0RPV05fRVZFTlRfRkxBRyAqLworCSJzY2FuIGNvbXBsZXRlZCIJCQkJCQkJCQkJLyogSVdfU0NBTl9DT01QTEVURURfRVZFTlRfRkxBRyAqLworCSJzY2FuIHRlcm1pbmF0ZSEhIEJ1c3khISBFbnF1ZXVlIGZhaWwhISIJCQkJLyogSVdfU0NBTl9FTlFVRVVFX0ZBSUxfRVZFTlRfRkxBRyAqLworCX07CisKKy8vIGZvciB3aXJlbGVzcyBJRFNfc3Bvb2ZfYXR0YWNrIGV2ZW50IG1lc3NhZ2UKK2NoYXIgY29uc3QgKnBXaXJlbGVzc1Nwb29mRXZlbnRUZXh0W0lXX1NQT09GX0VWRU5UX1RZUEVfTlVNXSA9IHsKKyAgICAiZGV0ZWN0ZWQgY29uZmxpY3QgU1NJRCIsCQkJCQkJCQkvKiBJV19DT05GTElDVF9TU0lEX0VWRU5UX0ZMQUcgKi8KKyAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBhc3NvY2lhdGlvbiByZXNwb25zZSIsCQkJCS8qIElXX1NQT09GX0FTU09DX1JFU1BfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBzcG9vZmVkIHJlYXNzb2NpYXRpb24gcmVzcG9uc2VzIiwJCQkJLyogSVdfU1BPT0ZfUkVBU1NPQ19SRVNQX0VWRU5UX0ZMQUcgKi8KKyAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBwcm9iZSByZXNwb25zZSIsCQkJCQkJLyogSVdfU1BPT0ZfUFJPQkVfUkVTUF9FVkVOVF9GTEFHICovCisgICAgImRldGVjdGVkIHNwb29mZWQgYmVhY29uIiwJCQkJCQkJCS8qIElXX1NQT09GX0JFQUNPTl9FVkVOVF9GTEFHICovCisgICAgImRldGVjdGVkIHNwb29mZWQgZGlzYXNzb2NpYXRpb24iLAkJCQkJCS8qIElXX1NQT09GX0RJU0FTU09DX0VWRU5UX0ZMQUcgKi8KKyAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBhdXRoZW50aWNhdGlvbiIsCQkJCQkJLyogSVdfU1BPT0ZfQVVUSF9FVkVOVF9GTEFHICovCisgICAgImRldGVjdGVkIHNwb29mZWQgZGVhdXRoZW50aWNhdGlvbiIsCQkJCQkvKiBJV19TUE9PRl9ERUFVVEhfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBzcG9vZmVkIHVua25vd24gbWFuYWdlbWVudCBmcmFtZSIsCQkJLyogSVdfU1BPT0ZfVU5LTk9XTl9NR01UX0VWRU5UX0ZMQUcgKi8KKwkiZGV0ZWN0ZWQgcmVwbGF5IGF0dGFjayIJCQkJCQkJCS8qIElXX1JFUExBWV9BVFRBQ0tfRVZFTlRfRkxBRyAqLworCX07CisKKy8vIGZvciB3aXJlbGVzcyBJRFNfZmxvb2RpbmdfYXR0YWNrIGV2ZW50IG1lc3NhZ2UKK2NoYXIgY29uc3QgKnBXaXJlbGVzc0Zsb29kRXZlbnRUZXh0W0lXX0ZMT09EX0VWRU5UX1RZUEVfTlVNXSA9IHsKKwkiZGV0ZWN0ZWQgYXV0aGVudGljYXRpb24gZmxvb2RpbmciLAkJCQkJCS8qIElXX0ZMT09EX0FVVEhfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBhc3NvY2lhdGlvbiByZXF1ZXN0IGZsb29kaW5nIiwJCQkJLyogSVdfRkxPT0RfQVNTT0NfUkVRX0VWRU5UX0ZMQUcgKi8KKyAgICAiZGV0ZWN0ZWQgcmVhc3NvY2lhdGlvbiByZXF1ZXN0IGZsb29kaW5nIiwJCQkJLyogSVdfRkxPT0RfUkVBU1NPQ19SRVFfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBwcm9iZSByZXF1ZXN0IGZsb29kaW5nIiwJCQkJCQkvKiBJV19GTE9PRF9QUk9CRV9SRVFfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBkaXNhc3NvY2lhdGlvbiBmbG9vZGluZyIsCQkJCQkJLyogSVdfRkxPT0RfRElTQVNTT0NfRVZFTlRfRkxBRyAqLworICAgICJkZXRlY3RlZCBkZWF1dGhlbnRpY2F0aW9uIGZsb29kaW5nIiwJCQkJCS8qIElXX0ZMT09EX0RFQVVUSF9FVkVOVF9GTEFHICovCisgICAgImRldGVjdGVkIDgwMi4xeCBlYXAtcmVxdWVzdCBmbG9vZGluZyIJCQkJCS8qIElXX0ZMT09EX0VBUF9SRVFfRVZFTlRfRkxBRyAqLworCX07CisKKy8qIHRpbWVvdXQgLS0gbXMgKi8KK1ZPSUQgUlRNUF9TZXRQZXJpb2RpY1RpbWVyKAorCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIgKnBUaW1lciwKKwlJTgl1bnNpZ25lZCBsb25nIHRpbWVvdXQpCit7CisJdGltZW91dCA9ICgodGltZW91dCpIWikgLyAxMDAwKTsKKwlwVGltZXItPmV4cGlyZXMgPSBqaWZmaWVzICsgdGltZW91dDsKKwlhZGRfdGltZXIocFRpbWVyKTsKK30KKworLyogY29udmVydCBOZGlzTUluaXRpYWxpemVUaW1lciAtLT4gUlRNUF9PU19Jbml0X1RpbWVyICovCitWT0lEIFJUTVBfT1NfSW5pdF9UaW1lcigKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglORElTX01JTklQT1JUX1RJTUVSICpwVGltZXIsCisJSU4JVElNRVJfRlVOQ1RJT04gZnVuY3Rpb24sCisJSU4JUFZPSUQgZGF0YSkKK3sKKwlpbml0X3RpbWVyKHBUaW1lcik7CisgICAgcFRpbWVyLT5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGF0YTsKKyAgICBwVGltZXItPmZ1bmN0aW9uID0gZnVuY3Rpb247Cit9CisKKworVk9JRCBSVE1QX09TX0FkZF9UaW1lcigKKwlJTglORElTX01JTklQT1JUX1RJTUVSCQkqcFRpbWVyLAorCUlOCXVuc2lnbmVkIGxvbmcgdGltZW91dCkKK3sKKwlpZiAodGltZXJfcGVuZGluZyhwVGltZXIpKQorCQlyZXR1cm47CisKKwl0aW1lb3V0ID0gKCh0aW1lb3V0KkhaKSAvIDEwMDApOworCXBUaW1lci0+ZXhwaXJlcyA9IGppZmZpZXMgKyB0aW1lb3V0OworCWFkZF90aW1lcihwVGltZXIpOworfQorCitWT0lEIFJUTVBfT1NfTW9kX1RpbWVyKAorCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIJCSpwVGltZXIsCisJSU4JdW5zaWduZWQgbG9uZyB0aW1lb3V0KQoreworCXRpbWVvdXQgPSAoKHRpbWVvdXQqSFopIC8gMTAwMCk7CisJbW9kX3RpbWVyKHBUaW1lciwgamlmZmllcyArIHRpbWVvdXQpOworfQorCitWT0lEIFJUTVBfT1NfRGVsX1RpbWVyKAorCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIJCSpwVGltZXIsCisJT1VUCUJPT0xFQU4JCQkJCSpwQ2FuY2VsbGVkKQoreworCWlmICh0aW1lcl9wZW5kaW5nKHBUaW1lcikpCisJeworCQkqcENhbmNlbGxlZCA9IGRlbF90aW1lcl9zeW5jKHBUaW1lcik7CisJfQorCWVsc2UKKwl7CisJCSpwQ2FuY2VsbGVkID0gVFJVRTsKKwl9CisKK30KKworVk9JRCBSVE1QX09TX1JlbGVhc2VfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVBRVUVVRV9FTlRSWSAgcEVudHJ5KQoreworCS8vUlRNUEZyZWVOZGlzUGFja2V0KHBBZCwgKHN0cnVjdCBza19idWZmICopcEVudHJ5KTsKK30KKworLy8gVW5pZnkgYWxsIGRlbGF5IHJvdXRpbmUgYnkgdXNpbmcgdWRlbGF5CitWT0lEIFJUTVB1c2VjRGVsYXkoCisJSU4JVUxPTkcJdXNlYykKK3sKKwlVTE9ORwlpOworCisJZm9yIChpID0gMDsgaSA8ICh1c2VjIC8gNTApOyBpKyspCisJCXVkZWxheSg1MCk7CisKKwlpZiAodXNlYyAlIDUwKQorCQl1ZGVsYXkodXNlYyAlIDUwKTsKK30KKwordm9pZCBSVE1QX0dldEN1cnJlbnRTeXN0ZW1UaW1lKExBUkdFX0lOVEVHRVIgKnRpbWUpCit7CisJdGltZS0+dS5Mb3dQYXJ0ID0gamlmZmllczsKK30KKworLy8gcEFkIE1VU1QgYWxsb3cgdG8gYmUgTlVMTAorTkRJU19TVEFUVVMgb3NfYWxsb2NfbWVtKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCU9VVAlQVUNIQVIgKm1lbSwKKwlJTglVTE9ORyAgc2l6ZSkKK3sKKwkqbWVtID0gKFBVQ0hBUikga21hbGxvYyhzaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAoKm1lbSkKKwkJcmV0dXJuIChORElTX1NUQVRVU19TVUNDRVNTKTsKKwllbHNlCisJCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7Cit9CisKKy8vIHBBZCBNVVNUIGFsbG93IHRvIGJlIE5VTEwKK05ESVNfU1RBVFVTIG9zX2ZyZWVfbWVtKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVBVQ0hBUiBtZW0pCit7CisKKwlBU1NFUlQobWVtKTsKKwlrZnJlZShtZW0pOworCXJldHVybiAoTkRJU19TVEFUVVNfU1VDQ0VTUyk7Cit9CisKKworUE5ESVNfUEFDS0VUIFJUTVBfQWxsb2NhdGVGcmFnUGFja2V0QnVmZmVyKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVMT05HCUxlbmd0aCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OworCisJcGt0ID0gZGV2X2FsbG9jX3NrYihMZW5ndGgpOworCisJaWYgKHBrdCA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY2FuJ3QgYWxsb2NhdGUgZnJhZyByeCAlbGQgc2l6ZSBwYWNrZXRcbiIsTGVuZ3RoKSk7CisJfQorCisJaWYgKHBrdCkKKwl7CisJCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UoT1NQS1RfVE9fUlRQS1QocGt0KSwgUEtUU1JDX05ESVMpOworCX0KKworCXJldHVybiAoUE5ESVNfUEFDS0VUKSBwa3Q7Cit9CisKKworUE5ESVNfUEFDS0VUIFJUTVBfQWxsb2NhdGVUeFBhY2tldEJ1ZmZlcigKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVTE9ORwlMZW5ndGgsCisJSU4JQk9PTEVBTglDYWNoZWQsCisJT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OworCisJcGt0ID0gZGV2X2FsbG9jX3NrYihMZW5ndGgpOworCisJaWYgKHBrdCA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY2FuJ3QgYWxsb2NhdGUgdHggJWxkIHNpemUgcGFja2V0XG4iLExlbmd0aCkpOworCX0KKworCWlmIChwa3QpCisJeworCQlSVE1QX1NFVF9QQUNLRVRfU09VUkNFKE9TUEtUX1RPX1JUUEtUKHBrdCksIFBLVFNSQ19ORElTKTsKKwkJKlZpcnR1YWxBZGRyZXNzID0gKFBWT0lEKSBwa3QtPmRhdGE7CisJfQorCWVsc2UKKwl7CisJCSpWaXJ0dWFsQWRkcmVzcyA9IChQVk9JRCkgTlVMTDsKKwl9CisKKwlyZXR1cm4gKFBORElTX1BBQ0tFVCkgcGt0OworfQorCisKK1ZPSUQgYnVpbGRfdHhfcGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAorCUlOCVBVQ0hBUglwRnJhbWUsCisJSU4JVUxPTkcJRnJhbWVMZW4pCit7CisKKwlzdHJ1Y3Qgc2tfYnVmZgkqcFR4UGt0OworCisJQVNTRVJUKHBQYWNrZXQpOworCXBUeFBrdCA9IFJUUEtUX1RPX09TUEtUKHBQYWNrZXQpOworCisJTmRpc01vdmVNZW1vcnkoc2tiX3B1dChwVHhQa3QsIEZyYW1lTGVuKSwgcEZyYW1lLCBGcmFtZUxlbik7Cit9CisKK1ZPSUQJUlRNUEZyZWVBZGFwdGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworICAgIFBPU19DT09LSUUgb3NfY29va2llOworCWludCBpbmRleDsKKworCW9zX2Nvb2tpZT0oUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKKworCWtmcmVlKHBBZC0+QmVhY29uQnVmKTsKKworCisJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5NZ210UmluZ0xvY2spOworCisKKwlmb3IgKGluZGV4ID0wIDsgaW5kZXggPCBOVU1fT0ZfVFhfUklORzsgaW5kZXgrKykKKwl7CisgICAgCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+VHhTd1F1ZXVlTG9ja1tpbmRleF0pOworCQlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPkRlUXVldWVMb2NrW2luZGV4XSk7CisJCXBBZC0+RGVRdWV1ZVJ1bm5pbmdbaW5kZXhdID0gRkFMU0U7CisJfQorCisJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5pcnFfbG9jayk7CisKKworCXZmcmVlKHBBZCk7IC8vIHBjaV9mcmVlX2NvbnNpc3RlbnQob3NfY29va2llLT5wY2lfZGV2LHNpemVvZihSVE1QX0FEQVBURVIpLHBBZCxvc19jb29raWUtPnBBZF9wYSk7CisJa2ZyZWUob3NfY29va2llKTsKK30KKworQk9PTEVBTiBPU19OZWVkX0Nsb25lX1BhY2tldCh2b2lkKQoreworCXJldHVybiAoRkFMU0UpOworfQorCisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCWNsb25lIGFuIGlucHV0IE5ESVMgUEFDS0VUIHRvIGFub3RoZXIgb25lLiBUaGUgbmV3IGludGVybmFsbHkgY3JlYXRlZCBORElTIFBBQ0tFVAorCQltdXN0IGhhdmUgb25seSBvbmUgTkRJUyBCVUZGRVIKKwkJcmV0dXJuIC0gYnl0ZSBjb3BpZWQuIDAgbWVhbnMgY2FuJ3QgY3JlYXRlIE5ESVMgUEFDS0VUCisJCU5PVEU6IGludGVybmFsbHkgY3JlYXRlZCBORElTX1BBQ0tFVCBzaG91bGQgYmUgZGVzdHJveWVkIGJ5IFJUTVBGcmVlTmRpc1BhY2tldAorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcEluc0FNU0RVSGRyCUVXQyBBLU1TRFUgZm9ybWF0IGhhcyBleHRyYSAxNC1ieXRlcyBoZWFkZXIuIGlmIFRSVUUsIGluc2VydCB0aGlzIDE0LWJ5dGUgaGRyIGluIGZyb250IG9mIE1TRFUuCisJCSpwU3JjVG90YWxMZW4JCQlyZXR1cm4gdG90YWwgcGFja2V0IGxlbmd0aC4gVGhpcyBsZW5naHQgaXMgY2FsY3VsYXRlZCB3aXRoIDgwMi4zIGZvcm1hdCBwYWNrZXQuCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX1NVQ0NFU1MKKwkJTkRJU19TVEFUVVNfRkFJTFVSRQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK05ESVNfU1RBVFVTIFJUTVBDbG9uZU5kaXNQYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JQk9PTEVBTgkJCXBJbnNBTVNEVUhkciwKKwlJTglQTkRJU19QQUNLRVQJcEluUGFja2V0LAorCU9VVCBQTkRJU19QQUNLRVQgICAqcHBPdXRQYWNrZXQpCit7CisKKwlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OworCisJQVNTRVJUKHBJblBhY2tldCk7CisJQVNTRVJUKHBwT3V0UGFja2V0KTsKKworCS8vIDEuIEFsbG9jYXRlIGEgcGFja2V0CisJcGt0ID0gZGV2X2FsbG9jX3NrYigyMDQ4KTsKKworCWlmIChwa3QgPT0gTlVMTCkKKwl7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworIAlza2JfcHV0KHBrdCwgR0VUX09TX1BLVF9MRU4ocEluUGFja2V0KSk7CisJTmRpc01vdmVNZW1vcnkocGt0LT5kYXRhLCBHRVRfT1NfUEtUX0RBVEFQVFIocEluUGFja2V0KSwgR0VUX09TX1BLVF9MRU4ocEluUGFja2V0KSk7CisJKnBwT3V0UGFja2V0ID0gT1NQS1RfVE9fUlRQS1QocGt0KTsKKworCisJUlRNUF9TRVRfUEFDS0VUX1NPVVJDRShPU1BLVF9UT19SVFBLVChwa3QpLCBQS1RTUkNfTkRJUyk7CisKKwlwcmludGsoIiMjI0Nsb25lIyMjXG4iKTsKKworCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworfQorCisKKy8vIHRoZSBhbGxvY2F0ZWQgTkRJUyBQQUNLRVQgbXVzdCBiZSBmcmVlZCB2aWEgUlRNUEZyZWVOZGlzUGFja2V0KCkKK05ESVNfU1RBVFVTIFJUTVBBbGxvY2F0ZU5kaXNQYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUIFBORElTX1BBQ0tFVCAgICpwcFBhY2tldCwKKwlJTglQVUNIQVIJCQlwSGVhZGVyLAorCUlOCVVJTlQJCQlIZWFkZXJMZW4sCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUlOVAkJCURhdGFMZW4pCit7CisJUE5ESVNfUEFDS0VUCXBQYWNrZXQ7CisJQVNTRVJUKHBEYXRhKTsKKwlBU1NFUlQoRGF0YUxlbik7CisKKwkvLyAxLiBBbGxvY2F0ZSBhIHBhY2tldAorCXBQYWNrZXQgPSAoUE5ESVNfUEFDS0VUICopIGRldl9hbGxvY19za2IoSGVhZGVyTGVuICsgRGF0YUxlbiArIFRYUEFERElOR19TSVpFKTsKKwlpZiAocFBhY2tldCA9PSBOVUxMKQorIAl7CisJCSpwcFBhY2tldCA9IE5VTEw7CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJSVE1QQWxsb2NhdGVOZGlzUGFja2V0IEZhaWxcblxuIik7CisjZW5kaWYKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCisJLy8gMi4gY2xvbmUgdGhlIGZyYW1lIGNvbnRlbnQKKwlpZiAoSGVhZGVyTGVuID4gMCkKKwkJTmRpc01vdmVNZW1vcnkoR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpLCBwSGVhZGVyLCBIZWFkZXJMZW4pOworCWlmIChEYXRhTGVuID4gMCkKKwkJTmRpc01vdmVNZW1vcnkoR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpICsgSGVhZGVyTGVuLCBwRGF0YSwgRGF0YUxlbik7CisKKwkvLyAzLiB1cGRhdGUgbGVuZ3RoIG9mIHBhY2tldAorIAlza2JfcHV0KEdFVF9PU19QS1RfVFlQRShwUGFja2V0KSwgSGVhZGVyTGVuK0RhdGFMZW4pOworCisJUlRNUF9TRVRfUEFDS0VUX1NPVVJDRShwUGFja2V0LCBQS1RTUkNfTkRJUyk7CisvLwlwcmludGsoIiVzIDogcFBhY2tldCA9ICVwLCBsZW4gPSAlZFxuIiwgX19mdW5jX18sIHBQYWNrZXQsIEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpKTsKKwkqcHBQYWNrZXQgPSBwUGFja2V0OworCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworfQorCisvKgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRGVzY3JpcHRpb246CisJVGhpcyByb3V0aW5lIGZyZWVzIGEgbWluaXBvcnQgaW50ZXJuYWxseSBhbGxvY2F0ZWQgTkRJU19QQUNLRVQgYW5kIGl0cworCWNvcnJlc3BvbmRpbmcgTkRJU19CVUZGRVIgYW5kIGFsbG9jYXRlZCBtZW1vcnkuCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUEZyZWVOZGlzUGFja2V0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBORElTX1BBQ0tFVCAgcFBhY2tldCkKK3sKKwlkZXZfa2ZyZWVfc2tiX2FueShSVFBLVF9UT19PU1BLVChwUGFja2V0KSk7Cit9CisKKworLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCisvLyBOT1RFOiB3ZSBkbyBoYXZlIGFuIGFzc3VtcHRpb24gaGVyZSwgdGhhdCBCeXRlMCBhbmQgQnl0ZTEgYWx3YXlzIHJlYXNpZCBhdCB0aGUgc2FtZQorLy8JCQkgc2NhdHRlciBnYXRoZXIgYnVmZmVyCitORElTX1NUQVRVUyBTbmlmZjJCeXRlc0Zyb21OZGlzQnVmZmVyKAorCUlOCVBORElTX0JVRkZFUglwRmlyc3RCdWZmZXIsCisJSU4JVUNIQVIJCQlEZXNpcmVkT2Zmc2V0LAorCU9VVCBQVUNIQVIJCQlwQnl0ZTAsCisJT1VUIFBVQ0hBUgkJCXBCeXRlMSkKK3sKKyAgICAqcEJ5dGUwID0gKihQVUNIQVIpKHBGaXJzdEJ1ZmZlciArIERlc2lyZWRPZmZzZXQpOworICAgICpwQnl0ZTEgPSAqKFBVQ0hBUikocEZpcnN0QnVmZmVyICsgRGVzaXJlZE9mZnNldCArIDEpOworCisJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKwordm9pZCBSVE1QX1F1ZXJ5UGFja2V0SW5mbygKKwlJTiAgUE5ESVNfUEFDS0VUIHBQYWNrZXQsCisJT1VUIFBBQ0tFVF9JTkZPICAqcFBhY2tldEluZm8sCisJT1VUIFBVQ0hBUgkJICpwU3JjQnVmVkEsCisJT1VUCVVJTlQJCSAqcFNyY0J1ZkxlbikKK3sKKwlwUGFja2V0SW5mby0+QnVmZmVyQ291bnQgPSAxOworCXBQYWNrZXRJbmZvLT5wRmlyc3RCdWZmZXIgPSBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CisJcFBhY2tldEluZm8tPlBoeXNpY2FsQnVmZmVyQ291bnQgPSAxOworCXBQYWNrZXRJbmZvLT5Ub3RhbFBhY2tldExlbmd0aCA9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOworCisJKnBTcmNCdWZWQSA9IEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKKwkqcFNyY0J1ZkxlbiA9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOworfQorCit2b2lkIFJUTVBfUXVlcnlOZXh0UGFja2V0SW5mbygKKwlJTiAgUE5ESVNfUEFDS0VUICpwcFBhY2tldCwKKwlPVVQgUEFDS0VUX0lORk8gICpwUGFja2V0SW5mbywKKwlPVVQgUFVDSEFSCQkgKnBTcmNCdWZWQSwKKwlPVVQJVUlOVAkJICpwU3JjQnVmTGVuKQoreworCVBORElTX1BBQ0tFVCBwUGFja2V0ID0gTlVMTDsKKworCWlmICgqcHBQYWNrZXQpCisJCXBQYWNrZXQgPSBHRVRfT1NfUEtUX05FWFQoKnBwUGFja2V0KTsKKworCWlmIChwUGFja2V0KQorCXsKKwkJcFBhY2tldEluZm8tPkJ1ZmZlckNvdW50ID0gMTsKKwkJcFBhY2tldEluZm8tPnBGaXJzdEJ1ZmZlciA9IEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKKwkJcFBhY2tldEluZm8tPlBoeXNpY2FsQnVmZmVyQ291bnQgPSAxOworCQlwUGFja2V0SW5mby0+VG90YWxQYWNrZXRMZW5ndGggPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKKworCQkqcFNyY0J1ZlZBID0gR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOworCQkqcFNyY0J1ZkxlbiA9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOworCQkqcHBQYWNrZXQgPSBHRVRfT1NfUEtUX05FWFQocFBhY2tldCk7CisJfQorCWVsc2UKKwl7CisJCXBQYWNrZXRJbmZvLT5CdWZmZXJDb3VudCA9IDA7CisJCXBQYWNrZXRJbmZvLT5wRmlyc3RCdWZmZXIgPSBOVUxMOworCQlwUGFja2V0SW5mby0+UGh5c2ljYWxCdWZmZXJDb3VudCA9IDA7CisJCXBQYWNrZXRJbmZvLT5Ub3RhbFBhY2tldExlbmd0aCA9IDA7CisKKwkJKnBTcmNCdWZWQSA9IE5VTEw7CisJCSpwU3JjQnVmTGVuID0gMDsKKwkJKnBwUGFja2V0ID0gTlVMTDsKKwl9Cit9CisKKy8vIG5vdCB5ZXQgc3VwcG9ydCBNQlNTCitQTkVUX0RFViBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKyAgICBQTkVUX0RFViBkZXZfcCA9IE5VTEw7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlkZXZfcCA9IHBBZC0+bmV0X2RldjsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlBU1NFUlQoZGV2X3ApOworCXJldHVybiBkZXZfcDsgLyogcmV0dXJuIG9uZSBvZiBNQlNTICovCit9CisKK1BORElTX1BBQ0tFVCBEdXBsaWNhdGVQYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZgkqc2tiOworCVBORElTX1BBQ0tFVAlwUmV0UGFja2V0ID0gTlVMTDsKKwlVU0hPUlQJCQlEYXRhU2l6ZTsKKwlVQ0hBUgkJCSpwRGF0YTsKKworCURhdGFTaXplID0gKFVTSE9SVCkgR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7CisJcERhdGEgPSAoUFVDSEFSKSBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CisKKworCXNrYiA9IHNrYl9jbG9uZShSVFBLVF9UT19PU1BLVChwUGFja2V0KSwgTUVNX0FMTE9DX0ZMQUcpOworCWlmIChza2IpCisJeworCQlza2ItPmRldiA9IGdldF9uZXRkZXZfZnJvbV9ic3NpZChwQWQsIEZyb21XaGljaEJTU0lEKTsKKwkJcFJldFBhY2tldCA9IE9TUEtUX1RPX1JUUEtUKHNrYik7CisJfQorCisjaWYgMAorCWlmICgoc2tiID0gX19kZXZfYWxsb2Nfc2tiKERhdGFTaXplICsgMiszMiwgTUVNX0FMTE9DX0ZMQUcpKSAhPSBOVUxMKQorCXsKKwkJc2tiX3Jlc2VydmUoc2tiLCAyKzMyKTsKKwkJTmRpc01vdmVNZW1vcnkoc2tiLT50YWlsLCBwRGF0YSwgRGF0YVNpemUpOworCQlza2JfcHV0KHNrYiwgRGF0YVNpemUpOworCQlza2ItPmRldiA9IGdldF9uZXRkZXZfZnJvbV9ic3NpZChwQWQsIEZyb21XaGljaEJTU0lEKTsKKwkJcFJldFBhY2tldCA9IE9TUEtUX1RPX1JUUEtUKHNrYik7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gcFJldFBhY2tldDsKKworfQorCitQTkRJU19QQUNLRVQgZHVwbGljYXRlX3BrdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwSGVhZGVyODAyXzMsCisgICAgSU4gIFVJTlQgICAgICAgICAgICBIZHJMZW4sCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEYXRhU2l6ZSwKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQoreworCXN0cnVjdCBza19idWZmCSpza2I7CisJUE5ESVNfUEFDS0VUCXBQYWNrZXQgPSBOVUxMOworCisKKwlpZiAoKHNrYiA9IF9fZGV2X2FsbG9jX3NrYihIZHJMZW4gKyBEYXRhU2l6ZSArIDIsIE1FTV9BTExPQ19GTEFHKSkgIT0gTlVMTCkKKwl7CisJCXNrYl9yZXNlcnZlKHNrYiwgMik7CisJCU5kaXNNb3ZlTWVtb3J5KHNrYi0+dGFpbCwgcEhlYWRlcjgwMl8zLCBIZHJMZW4pOworCQlza2JfcHV0KHNrYiwgSGRyTGVuKTsKKwkJTmRpc01vdmVNZW1vcnkoc2tiLT50YWlsLCBwRGF0YSwgRGF0YVNpemUpOworCQlza2JfcHV0KHNrYiwgRGF0YVNpemUpOworCQlza2ItPmRldiA9IGdldF9uZXRkZXZfZnJvbV9ic3NpZChwQWQsIEZyb21XaGljaEJTU0lEKTsKKwkJcFBhY2tldCA9IE9TUEtUX1RPX1JUUEtUKHNrYik7CisJfQorCisJcmV0dXJuIHBQYWNrZXQ7Cit9CisKKworI2RlZmluZSBUS0lQX1RYX01JQ19TSVpFCQk4CitQTkRJU19QQUNLRVQgZHVwbGljYXRlX3BrdF93aXRoX1RLSVBfTUlDKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQoreworCXN0cnVjdCBza19idWZmCSpza2IsICpuZXdza2I7CisKKworCXNrYiA9IFJUUEtUX1RPX09TUEtUKHBQYWNrZXQpOworCWlmIChza2JfdGFpbHJvb20oc2tiKSA8IFRLSVBfVFhfTUlDX1NJWkUpCisJeworCQkvLyBhbGxvYyBhIG5ldyBza2IgYW5kIGNvcHkgdGhlIHBhY2tldAorCQluZXdza2IgPSBza2JfY29weV9leHBhbmQoc2tiLCBza2JfaGVhZHJvb20oc2tiKSwgVEtJUF9UWF9NSUNfU0laRSwgR0ZQX0FUT01JQyk7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCWlmIChuZXdza2IgPT0gTlVMTCkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRXh0ZW5kIFR4Lk1JQyBmb3IgcGFja2V0IGZhaWxlZCEsIGRyb3BwaW5nIHBhY2tldCFcbiIpKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXNrYiA9IG5ld3NrYjsKKwl9CisKKwlyZXR1cm4gT1NQS1RfVE9fUlRQS1Qoc2tiKTsKKworI2lmIDAKKwlpZiAoKGRhdGEgPSBza2JfcHV0KHNrYiwgVEtJUF9UWF9NSUNfU0laRSkpICE9IE5VTEwpCisJewkvLyBJZiB3ZSBjYW4gZXh0ZW5kIGl0LCB3ZWxsLCBjb3B5IGl0IGZpcnN0LgorCQlOZGlzTW92ZU1lbW9yeShkYXRhLCBwQWQtPlByaXZhdGVJbmZvLlR4Lk1JQywgVEtJUF9UWF9NSUNfU0laRSk7CisJfQorCWVsc2UKKwl7CisJCS8vIE90aGVyd2lzZSwgY29weSB0aGUgcGFja2V0LgorCQluZXdza2IgPSBza2JfY29weV9leHBhbmQoc2tiLCBza2JfaGVhZHJvb20oc2tiKSwgVEtJUF9UWF9NSUNfU0laRSwgR0ZQX0FUT01JQyk7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCWlmIChuZXdza2IgPT0gTlVMTCkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRXh0ZW5kIFR4Lk1JQyB0byBwYWNrZXQgZmFpbGVkISwgZHJvcHBpbmcgcGFja2V0XG4iKSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlza2IgPSBuZXdza2I7CisKKwkJTmRpc01vdmVNZW1vcnkoc2tiLT50YWlsLCBwQWQtPlByaXZhdGVJbmZvLlR4Lk1JQywgVEtJUF9UWF9NSUNfU0laRSk7CisJCXNrYl9wdXQoc2tiLCBUS0lQX1RYX01JQ19TSVpFKTsKKwl9CisKKwlyZXR1cm4gT1NQS1RfVE9fUlRQS1Qoc2tiKTsKKyNlbmRpZgorCit9CisKKworCisKK1BORElTX1BBQ0tFVCBDbG9uZVBhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVTE9ORwkJCURhdGFTaXplKQoreworCXN0cnVjdCBza19idWZmCSpwUnhQa3Q7CisJc3RydWN0IHNrX2J1ZmYJKnBDbG9uZWRQa3Q7CisKKwlBU1NFUlQocFBhY2tldCk7CisJcFJ4UGt0ID0gUlRQS1RfVE9fT1NQS1QocFBhY2tldCk7CisKKwkvLyBjbG9uZSB0aGUgcGFja2V0CisJcENsb25lZFBrdCA9IHNrYl9jbG9uZShwUnhQa3QsIE1FTV9BTExPQ19GTEFHKTsKKworCWlmIChwQ2xvbmVkUGt0KQorCXsKKyAgICAJLy8gc2V0IHRoZSBjb3JyZWN0IGRhdGFwdHIgYW5kIGRhdGEgbGVuCisgICAgCXBDbG9uZWRQa3QtPmRldiA9IHBSeFBrdC0+ZGV2OworICAgIAlwQ2xvbmVkUGt0LT5kYXRhID0gcERhdGE7CisgICAgCXBDbG9uZWRQa3QtPmxlbiA9IERhdGFTaXplOworICAgIAlwQ2xvbmVkUGt0LT50YWlsID0gcENsb25lZFBrdC0+ZGF0YSArIHBDbG9uZWRQa3QtPmxlbjsKKwkJQVNTRVJUKERhdGFTaXplIDwgMTUzMCk7CisJfQorCXJldHVybiBwQ2xvbmVkUGt0OworfQorCisvLworLy8gY2hhbmdlIE9TIHBhY2tldCBEYXRhUHRyIGFuZCBEYXRhTGVuCisvLwordm9pZCAgdXBkYXRlX29zX3BhY2tldF9pbmZvKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4gIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJc3RydWN0IHNrX2J1ZmYJKnBPU1BrdDsKKworCUFTU0VSVChwUnhCbGstPnBSeFBhY2tldCk7CisJcE9TUGt0ID0gUlRQS1RfVE9fT1NQS1QocFJ4QmxrLT5wUnhQYWNrZXQpOworCisJcE9TUGt0LT5kZXYgPSBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBGcm9tV2hpY2hCU1NJRCk7CisJcE9TUGt0LT5kYXRhID0gcFJ4QmxrLT5wRGF0YTsKKwlwT1NQa3QtPmxlbiA9IHBSeEJsay0+RGF0YVNpemU7CisJcE9TUGt0LT50YWlsID0gcE9TUGt0LT5kYXRhICsgcE9TUGt0LT5sZW47Cit9CisKKwordm9pZCB3bGFuXzgwMl8xMV90b184MDJfM19wYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglQVUNIQVIJCQlwSGVhZGVyODAyXzMsCisJSU4gIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJc3RydWN0IHNrX2J1ZmYJKnBPU1BrdDsKKworCUFTU0VSVChwUnhCbGstPnBSeFBhY2tldCk7CisJQVNTRVJUKHBIZWFkZXI4MDJfMyk7CisKKwlwT1NQa3QgPSBSVFBLVF9UT19PU1BLVChwUnhCbGstPnBSeFBhY2tldCk7CisKKwlwT1NQa3QtPmRldiA9IGdldF9uZXRkZXZfZnJvbV9ic3NpZChwQWQsIEZyb21XaGljaEJTU0lEKTsKKwlwT1NQa3QtPmRhdGEgPSBwUnhCbGstPnBEYXRhOworCXBPU1BrdC0+bGVuID0gcFJ4QmxrLT5EYXRhU2l6ZTsKKwlwT1NQa3QtPnRhaWwgPSBwT1NQa3QtPmRhdGEgKyBwT1NQa3QtPmxlbjsKKworCS8vCisJLy8gY29weSA4MDIuMyBoZWFkZXIKKwkvLworCS8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQlOZGlzTW92ZU1lbW9yeShza2JfcHVzaChwT1NQa3QsIExFTkdUSF84MDJfMyksIHBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl9CisKKworCit2b2lkIGFubm91bmNlXzgwMl8zX3BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCkKK3sKKworCXN0cnVjdCBza19idWZmCSpwUnhQa3Q7CisKKwlBU1NFUlQocFBhY2tldCk7CisKKwlwUnhQa3QgPSBSVFBLVF9UT19PU1BLVChwUGFja2V0KTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisgICAgLyogUHVzaCB1cCB0aGUgcHJvdG9jb2wgc3RhY2sgKi8KKyNpZmRlZiBJS0FOT1NfVlhfMVgwCisJSUtBTk9TX0RhdGFGcmFtZVJ4KHBBZCwgcFJ4UGt0LT5kZXYsIHBSeFBrdCwgcFJ4UGt0LT5sZW4pOworI2Vsc2UKKwlwUnhQa3QtPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMocFJ4UGt0LCBwUnhQa3QtPmRldik7CisKKy8vI2lmZGVmIENPTkZJR181VlRfRU5IQU5DRQorLy8JKihpbnQqKShwUnhQa3QtPmNiKSA9IEJSSURHRV9UQUc7CisvLyNlbmRpZgorCW5ldGlmX3J4KHBSeFBrdCk7CisjZW5kaWYgLy8gSUtBTk9TX1ZYXzFYMCAvLworfQorCisKK1BSVE1QX1NDQVRURVJfR0FUSEVSX0xJU1QKK3J0X2dldF9zZ19saXN0X2Zyb21fcGFja2V0KFBORElTX1BBQ0tFVCBwUGFja2V0LCBSVE1QX1NDQVRURVJfR0FUSEVSX0xJU1QgKnNnKQoreworCXNnLT5OdW1iZXJPZkVsZW1lbnRzID0gMTsKKwlzZy0+RWxlbWVudHNbMF0uQWRkcmVzcyA9ICBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CisJc2ctPkVsZW1lbnRzWzBdLkxlbmd0aCA9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOworCXJldHVybiAoc2cpOworfQorCit2b2lkIGhleF9kdW1wKGNoYXIgKnN0ciwgdW5zaWduZWQgY2hhciAqcFNyY0J1ZlZBLCB1bnNpZ25lZCBpbnQgU3JjQnVmTGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnB0OworCWludCB4OworCisJaWYgKFJURGVidWdMZXZlbCA8IFJUX0RFQlVHX1RSQUNFKQorCQlyZXR1cm47CisKKwlwdCA9IHBTcmNCdWZWQTsKKwlwcmludGsoIiVzOiAlcCwgbGVuID0gJWRcbiIsc3RyLCAgcFNyY0J1ZlZBLCBTcmNCdWZMZW4pOworCWZvciAoeD0wOyB4PFNyY0J1ZkxlbjsgeCsrKQorCXsKKwkJaWYgKHggJSAxNiA9PSAwKQorCQkJcHJpbnRrKCIweCUwNHggOiAiLCB4KTsKKwkJcHJpbnRrKCIlMDJ4ICIsICgodW5zaWduZWQgY2hhcilwdFt4XSkpOworCQlpZiAoeCUxNiA9PSAxNSkgcHJpbnRrKCJcbiIpOworCX0KKwlwcmludGsoIlxuIik7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlTZW5kIGxvZyBtZXNzYWdlIHRocm91Z2ggd2lyZWxlc3MgZXZlbnQKKworCQlTdXBwb3J0IHN0YW5kYXJkIGl3X2V2ZW50IHdpdGggSVdFVkNVU1RPTS4gSXQgaXMgdXNlZCBiZWxvdy4KKworCQlpd3JlcV9kYXRhLmRhdGEuZmxhZ3MgaXMgdXNlZCB0byBzdG9yZSBldmVudF9mbGFnIHRoYXQgaXMgZGVmaW5lZCBieSB1c2VyLgorCQlpd3JlcV9kYXRhLmRhdGEubGVuZ3RoIGlzIHRoZSBsZW5ndGggb2YgdGhlIGV2ZW50IGxvZy4KKworCQlUaGUgZm9ybWF0IG9mIHRoZSBldmVudCBsb2cgaXMgY29tcG9zZWQgb2YgdGhlIGVudHJ5J3MgTUFDIGFkZHJlc3MgYW5kCisJCXRoZSBkZXNpcmVkIGxvZyBtZXNzYWdlIChyZWZlciB0byBwV2lyZWxlc3NFdmVudFRleHQpLgorCisJCQlleDogMTE6MjI6MzM6NDQ6NTU6NjYgaGFzIGFzc29jaWF0ZWQgc3VjY2Vzc2Z1bGx5CisKKwkJcC5zLiBUaGUgcmVxdWlyZW1lbnQgb2YgV2lyZWxlc3MgRXh0ZW5zaW9uIGlzIHYxNSBvciBuZXdlci4KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUFNlbmRXaXJlbGVzc0V2ZW50KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVTSE9SVAkJCUV2ZW50X2ZsYWcsCisJSU4JUFVDSEFSIAkJCXBBZGRyLAorCUlOCVVDSEFSCQkJQnNzSWR4LAorCUlOCUNIQVIJCQlSc3NpKQoreworI2lmIFdJUkVMRVNTX0VYVCA+PSAxNQorCisJdW5pb24gCWl3cmVxX2RhdGEgICAgICB3cnF1OworCVBVQ0hBUiAJcEJ1ZiA9IE5VTEwsIHBCdWZQdHIgPSBOVUxMOworCVVTSE9SVAlldmVudCwgdHlwZSwgQnVmTGVuOworCVVDSEFSCWV2ZW50X3RhYmxlX2xlbiA9IDA7CisKKwl0eXBlID0gRXZlbnRfZmxhZyAmIDB4RkYwMDsKKwlldmVudCA9IEV2ZW50X2ZsYWcgJiAweDAwRkY7CisKKwlzd2l0Y2ggKHR5cGUpCisJeworCQljYXNlIElXX1NZU19FVkVOVF9GTEFHX1NUQVJUOgorCQkJZXZlbnRfdGFibGVfbGVuID0gSVdfU1lTX0VWRU5UX1RZUEVfTlVNOworCQkJYnJlYWs7CisKKwkJY2FzZSBJV19TUE9PRl9FVkVOVF9GTEFHX1NUQVJUOgorCQkJZXZlbnRfdGFibGVfbGVuID0gSVdfU1BPT0ZfRVZFTlRfVFlQRV9OVU07CisJCQlicmVhazsKKworCQljYXNlIElXX0ZMT09EX0VWRU5UX0ZMQUdfU1RBUlQ6CisJCQlldmVudF90YWJsZV9sZW4gPSBJV19GTE9PRF9FVkVOVF9UWVBFX05VTTsKKwkJCWJyZWFrOworCX0KKworCWlmIChldmVudF90YWJsZV9sZW4gPT0gMCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogVGhlIHR5cGUoJTB4MDJ4KSBpcyBub3QgdmFsaWQuXG4iLCBfX2Z1bmNfXywgdHlwZSkpOworCQlyZXR1cm47CisJfQorCisJaWYgKGV2ZW50ID49IGV2ZW50X3RhYmxlX2xlbikKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogVGhlIGV2ZW50KCUweDAyeCkgaXMgbm90IHZhbGlkLlxuIiwgX19mdW5jX18sIGV2ZW50KSk7CisJCXJldHVybjsKKwl9CisKKwkvL0FsbG9jYXRlIG1lbW9yeSBhbmQgY29weSB0aGUgbXNnLgorCWlmKChwQnVmID0ga21hbGxvYyhJV19DVVNUT01fTUFYX0xFTiwgR0ZQX0FUT01JQykpICE9IE5VTEwpCisJeworCQkvL1ByZXBhcmUgdGhlIHBheWxvYWQKKwkJbWVtc2V0KHBCdWYsIDAsIElXX0NVU1RPTV9NQVhfTEVOKTsKKworCQlwQnVmUHRyID0gcEJ1ZjsKKworCQlpZiAocEFkZHIpCisJCQlwQnVmUHRyICs9IHNwcmludGYocEJ1ZlB0ciwgIihSVDI4NjApIFNUQSglMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCkgIiwgUFJJTlRfTUFDKHBBZGRyKSk7CisJCWVsc2UgaWYgKEJzc0lkeCA8IE1BWF9NQlNTSURfTlVNKQorCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIoUlQyODYwKSBCU1MocmElZCkgIiwgQnNzSWR4KTsKKwkJZWxzZQorCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIoUlQyODYwKSAiKTsKKworCQlpZiAodHlwZSA9PSBJV19TWVNfRVZFTlRfRkxBR19TVEFSVCkKKwkJCXBCdWZQdHIgKz0gc3ByaW50ZihwQnVmUHRyLCAiJXMiLCBwV2lyZWxlc3NTeXNFdmVudFRleHRbZXZlbnRdKTsKKwkJZWxzZSBpZiAodHlwZSA9PSBJV19TUE9PRl9FVkVOVF9GTEFHX1NUQVJUKQorCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIlcyAoUlNTST0lZCkiLCBwV2lyZWxlc3NTcG9vZkV2ZW50VGV4dFtldmVudF0sIFJzc2kpOworCQllbHNlIGlmICh0eXBlID09IElXX0ZMT09EX0VWRU5UX0ZMQUdfU1RBUlQpCisJCQlwQnVmUHRyICs9IHNwcmludGYocEJ1ZlB0ciwgIiVzIiwgcFdpcmVsZXNzRmxvb2RFdmVudFRleHRbZXZlbnRdKTsKKwkJZWxzZQorCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIlcyIsICJ1bmtub3duIGV2ZW50Iik7CisKKwkJcEJ1ZlB0cltwQnVmUHRyIC0gcEJ1Zl0gPSAnXDAnOworCQlCdWZMZW4gPSBwQnVmUHRyIC0gcEJ1ZjsKKworCQltZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisJICAgIHdycXUuZGF0YS5mbGFncyA9IEV2ZW50X2ZsYWc7CisJCXdycXUuZGF0YS5sZW5ndGggPSBCdWZMZW47CisKKwkJLy9zZW5kIHdpcmVsZXNzIGV2ZW50CisJICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgcEJ1Zik7CisKKwkJLy9EQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyA6ICVzXG4iLCBfX2Z1bmNfXywgcEJ1ZikpOworCisJCWtmcmVlKHBCdWYpOworCX0KKwllbHNlCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciB3aXJlbGVzcyBldmVudC5cbiIsIF9fZnVuY19fKSk7CisjZWxzZQorCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogVGhlIFdpcmVsZXNzIEV4dGVuc2lvbiBNVVNUIGJlIHYxNSBvciBuZXdlci5cbiIsIF9fZnVuY19fKSk7CisjZW5kaWYgIC8qIFdJUkVMRVNTX0VYVCA+PSAxNSAqLworfQorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK3ZvaWQgc2VuZF9tb25pdG9yX3BhY2tldHMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaykKK3sKKyAgICBzdHJ1Y3Qgc2tfYnVmZgkqcE9TUGt0OworICAgIHdsYW5fbmdfcHJpc20yX2hlYWRlciAqcGg7CisgICAgaW50IHJhdGVfaW5kZXggPSAwOworICAgIFVTSE9SVCBoZWFkZXJfbGVuID0gMDsKKyAgICBVQ0hBUiB0ZW1wX2hlYWRlcls0MF0gPSB7MH07CisKKyAgICB1X2ludDMyX3QgcmFsaW5rcmF0ZVsyNTZdID0gezIsNCwxMSwyMiwgMTIsMTgsMjQsMzYsNDgsNzIsOTYsICAxMDgsICAgMTA5LCAxMTAsIDExMSwgMTEyLCAxMywgMjYsIDM5LCA1Miw3OCwxMDQsIDExNywgMTMwLCAyNiwgNTIsIDc4LDEwNCwgMTU2LCAyMDgsIDIzNCwgMjYwLCAyNywgNTQsODEsMTA4LDE2MiwgMjE2LCAyNDMsIDI3MCwgLy8gTGFzdCAzOAorCTU0LCAxMDgsIDE2MiwgMjE2LCAzMjQsIDQzMiwgNDg2LCA1NDAsICAxNCwgMjksIDQzLCA1NywgODcsIDExNSwgMTMwLCAxNDQsIDI5LCA1OSw4NywxMTUsIDE3MywgMjMwLDI2MCwgMjg4LCAzMCwgNjAsOTAsMTIwLDE4MCwyNDAsMjcwLDMwMCw2MCwxMjAsMTgwLDI0MCwzNjAsNDgwLDU0MCw2MDAsIDAsMSwyLDMsNCw1LDYsNyw4LDksMTAsCisJMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsNDEsNDIsNDMsNDQsNDUsNDYsNDcsNDgsNDksNTAsNTEsNTIsNTMsNTQsNTUsNTYsNTcsNTgsNTksNjAsNjEsNjIsNjMsNjQsNjUsNjYsNjcsNjgsNjksNzAsNzEsNzIsNzMsNzQsNzUsNzYsNzcsNzgsNzksODB9OworCisKKyAgICBBU1NFUlQocFJ4QmxrLT5wUnhQYWNrZXQpOworICAgIGlmIChwUnhCbGstPkRhdGFTaXplIDwgMTApCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFNpemUgaXMgdG9vIHNtYWxsISAoJWQpXG4iLCBfX2Z1bmNfXywgcFJ4QmxrLT5EYXRhU2l6ZSkpOworCQlnb3RvIGVycl9mcmVlX3NrX2J1ZmY7CisgICAgfQorCisgICAgaWYgKHBSeEJsay0+RGF0YVNpemUgKyBzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKSA+IFJYX0JVRkZFUl9BR0dSRVNJWkUpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFNpemUgaXMgdG9vIGxhcmdlISAoJWQpXG4iLCBfX2Z1bmNfXywgcFJ4QmxrLT5EYXRhU2l6ZSArIHNpemVvZih3bGFuX25nX3ByaXNtMl9oZWFkZXIpKSk7CisJCWdvdG8gZXJyX2ZyZWVfc2tfYnVmZjsKKyAgICB9CisKKyAgICBwT1NQa3QgPSBSVFBLVF9UT19PU1BLVChwUnhCbGstPnBSeFBhY2tldCk7CisJcE9TUGt0LT5kZXYgPSBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBCU1MwKTsKKyAgICBpZiAocFJ4QmxrLT5wSGVhZGVyLT5GQy5UeXBlID09IEJUWVBFX0RBVEEpCisgICAgeworICAgICAgICBwUnhCbGstPkRhdGFTaXplIC09IExFTkdUSF84MDJfMTE7CisgICAgICAgIGlmICgocFJ4QmxrLT5wSGVhZGVyLT5GQy5Ub0RzID09IDEpICYmCisgICAgICAgICAgICAocFJ4QmxrLT5wSGVhZGVyLT5GQy5GckRzID09IDEpKQorICAgICAgICAgICAgaGVhZGVyX2xlbiA9IExFTkdUSF84MDJfMTFfV0lUSF9BRERSNDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaGVhZGVyX2xlbiA9IExFTkdUSF84MDJfMTE7CisKKyAgICAgICAgLy8gUU9TCisgICAgCWlmIChwUnhCbGstPnBIZWFkZXItPkZDLlN1YlR5cGUgJiAweDA4KQorICAgIAl7CisgICAgCSAgICBoZWFkZXJfbGVuICs9IDI7CisgICAgCQkvLyBEYXRhIHNraXAgUU9TIGNvbnRvcmwgZmllbGQKKyAgICAJCXBSeEJsay0+RGF0YVNpemUgLT0yOworICAgIAl9CisKKyAgICAJLy8gT3JkZXIgYml0OiBBLVJhbGluayBvciBIVEMrCisgICAgCWlmIChwUnhCbGstPnBIZWFkZXItPkZDLk9yZGVyKQorICAgIAl7CisgICAgCSAgICBoZWFkZXJfbGVuICs9IDQ7CisJCQkvLyBEYXRhIHNraXAgSFRDIGNvbnRvcmwgZmllbGQKKwkJCXBSeEJsay0+RGF0YVNpemUgLT0gNDsKKyAgICAJfQorCisgICAgICAgIC8vIENvcHkgSGVhZGVyCisgICAgICAgIGlmIChoZWFkZXJfbGVuIDw9IDQwKQorICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkodGVtcF9oZWFkZXIsIHBSeEJsay0+cERhdGEsIGhlYWRlcl9sZW4pOworCisgICAgICAgIC8vIHNraXAgSFcgcGFkZGluZworICAgIAlpZiAocFJ4QmxrLT5SeEQuTDJQQUQpCisgICAgCSAgICBwUnhCbGstPnBEYXRhICs9IChoZWFkZXJfbGVuICsgMik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBSeEJsay0+cERhdGEgKz0gaGVhZGVyX2xlbjsKKyAgICB9IC8vZW5kIGlmCisKKworCWlmIChwUnhCbGstPkRhdGFTaXplIDwgcE9TUGt0LT5sZW4pIHsKKyAgICAgICAgc2tiX3RyaW0ocE9TUGt0LHBSeEJsay0+RGF0YVNpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNrYl9wdXQocE9TUGt0LChwUnhCbGstPkRhdGFTaXplIC0gcE9TUGt0LT5sZW4pKTsKKyAgICB9IC8vZW5kIGlmCisKKyAgICBpZiAoKHBSeEJsay0+cERhdGEgLSBwT1NQa3QtPmRhdGEpID4gMCkgeworCSAgICBza2JfcHV0KHBPU1BrdCwocFJ4QmxrLT5wRGF0YSAtIHBPU1BrdC0+ZGF0YSkpOworCSAgICBza2JfcHVsbChwT1NQa3QsKHBSeEJsay0+cERhdGEgLSBwT1NQa3QtPmRhdGEpKTsKKyAgICB9IC8vZW5kIGlmCisKKyAgICBpZiAoc2tiX2hlYWRyb29tKHBPU1BrdCkgPCAoc2l6ZW9mKHdsYW5fbmdfcHJpc20yX2hlYWRlcikrIGhlYWRlcl9sZW4pKSB7CisgICAgICAgIGlmIChwc2tiX2V4cGFuZF9oZWFkKHBPU1BrdCwgKHNpemVvZih3bGFuX25nX3ByaXNtMl9oZWFkZXIpICsgaGVhZGVyX2xlbiksIDAsIEdGUF9BVE9NSUMpKSB7CisJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFJlYWxsb2NhdGUgaGVhZGVyIHNpemUgb2Ygc2tfYnVmZiBmYWlsIVxuIiwgX19mdW5jX18pKTsKKwkJCWdvdG8gZXJyX2ZyZWVfc2tfYnVmZjsKKwkgICAgfSAvL2VuZCBpZgorICAgIH0gLy9lbmQgaWYKKworICAgIGlmIChoZWFkZXJfbGVuID4gMCkKKyAgICAgICAgTmRpc01vdmVNZW1vcnkoc2tiX3B1c2gocE9TUGt0LCBoZWFkZXJfbGVuKSwgdGVtcF9oZWFkZXIsIGhlYWRlcl9sZW4pOworCisgICAgcGggPSAod2xhbl9uZ19wcmlzbTJfaGVhZGVyICopIHNrYl9wdXNoKHBPU1BrdCwgc2l6ZW9mKHdsYW5fbmdfcHJpc20yX2hlYWRlcikpOworCU5kaXNaZXJvTWVtb3J5KHBoLCBzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKSk7CisKKyAgICBwaC0+bXNnY29kZQkJICAgID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybTsKKwlwaC0+bXNnbGVuCQkgICAgPSBzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKTsKKwlzdHJjcHkocGgtPmRldm5hbWUsIHBBZC0+bmV0X2Rldi0+bmFtZSk7CisKKyAgICBwaC0+aG9zdHRpbWUuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9ob3N0dGltZTsKKwlwaC0+aG9zdHRpbWUuc3RhdHVzID0gMDsKKwlwaC0+aG9zdHRpbWUubGVuID0gNDsKKwlwaC0+aG9zdHRpbWUuZGF0YSA9IGppZmZpZXM7CisKKwlwaC0+bWFjdGltZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX21hY3RpbWU7CisJcGgtPm1hY3RpbWUuc3RhdHVzID0gMDsKKwlwaC0+bWFjdGltZS5sZW4gPSAwOworCXBoLT5tYWN0aW1lLmRhdGEgPSAwOworCisgICAgcGgtPmlzdHguZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9pc3R4OworCXBoLT5pc3R4LnN0YXR1cyA9IDA7CisJcGgtPmlzdHgubGVuID0gMDsKKwlwaC0+aXN0eC5kYXRhID0gMDsKKworICAgIHBoLT5jaGFubmVsLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fY2hhbm5lbDsKKwlwaC0+Y2hhbm5lbC5zdGF0dXMgPSAwOworCXBoLT5jaGFubmVsLmxlbiA9IDQ7CisKKyAgICBwaC0+Y2hhbm5lbC5kYXRhID0gKHVfaW50MzJfdClwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCisgICAgcGgtPnJzc2kuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9yc3NpOworCXBoLT5yc3NpLnN0YXR1cyA9IDA7CisJcGgtPnJzc2kubGVuID0gNDsKKyAgICBwaC0+cnNzaS5kYXRhID0gKHVfaW50MzJfdClSVE1QTWF4UnNzaShwQWQsIENvbnZlcnRUb1Jzc2kocEFkLCBwUnhCbGstPnBSeFdJLT5SU1NJMCwgUlNTSV8wKSwgQ29udmVydFRvUnNzaShwQWQsIHBSeEJsay0+cFJ4V0ktPlJTU0kxLCBSU1NJXzEpLCBDb252ZXJ0VG9Sc3NpKHBBZCwgcFJ4QmxrLT5wUnhXSS0+UlNTSTIsIFJTU0lfMikpOzsKKworCXBoLT5zaWduYWwuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9zaWduYWw7CisJcGgtPnNpZ25hbC5zdGF0dXMgPSAwOworCXBoLT5zaWduYWwubGVuID0gNDsKKwlwaC0+c2lnbmFsLmRhdGEgPSAwOyAvL3Jzc2kgKyBub2lzZTsKKworCXBoLT5ub2lzZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX25vaXNlOworCXBoLT5ub2lzZS5zdGF0dXMgPSAwOworCXBoLT5ub2lzZS5sZW4gPSA0OworCXBoLT5ub2lzZS5kYXRhID0gMDsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgIGlmIChwUnhCbGstPnBSeFdJLT5QSFlNT0RFID49IE1PREVfSFRNSVgpCisgICAgeworICAgIAlyYXRlX2luZGV4ID0gMTYgKyAoKFVDSEFSKXBSeEJsay0+cFJ4V0ktPkJXICoxNikgKyAoKFVDSEFSKXBSeEJsay0+cFJ4V0ktPlNob3J0R0kgKjMyKSArICgoVUNIQVIpcFJ4QmxrLT5wUnhXSS0+TUNTKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCWlmIChwUnhCbGstPnBSeFdJLT5QSFlNT0RFID09IE1PREVfT0ZETSkKKyAgICAJcmF0ZV9pbmRleCA9IChVQ0hBUikocFJ4QmxrLT5wUnhXSS0+TUNTKSArIDQ7CisgICAgZWxzZQorICAgIAlyYXRlX2luZGV4ID0gKFVDSEFSKShwUnhCbGstPnBSeFdJLT5NQ1MpOworICAgIGlmIChyYXRlX2luZGV4IDwgMCkKKyAgICAgICAgcmF0ZV9pbmRleCA9IDA7CisgICAgaWYgKHJhdGVfaW5kZXggPiAyNTUpCisgICAgICAgIHJhdGVfaW5kZXggPSAyNTU7CisKKwlwaC0+cmF0ZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3JhdGU7CisJcGgtPnJhdGUuc3RhdHVzID0gMDsKKwlwaC0+cmF0ZS5sZW4gPSA0OworICAgIHBoLT5yYXRlLmRhdGEgPSByYWxpbmtyYXRlW3JhdGVfaW5kZXhdOworCisJcGgtPmZybWxlbi5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2ZybWxlbjsKKyAgICBwaC0+ZnJtbGVuLnN0YXR1cyA9IDA7CisJcGgtPmZybWxlbi5sZW4gPSA0OworCXBoLT5mcm1sZW4uZGF0YQk9ICh1X2ludDMyX3QpcFJ4QmxrLT5EYXRhU2l6ZTsKKworCisgICAgcE9TUGt0LT5wa3RfdHlwZSA9IFBBQ0tFVF9PVEhFUkhPU1Q7CisgICAgcE9TUGt0LT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHBPU1BrdCwgcE9TUGt0LT5kZXYpOworICAgIHBPU1BrdC0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKyAgICBuZXRpZl9yeChwT1NQa3QpOworCisgICAgcmV0dXJuOworCitlcnJfZnJlZV9za19idWZmOgorCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJcmV0dXJuOworCit9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwordm9pZCBydG1wX29zX3RocmVhZF9pbml0KFBVQ0hBUiBwVGhyZWFkTmFtZSwgUFZPSUQgcE5vdGlmeSkKK3sKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwlkYWVtb25pemUocFRocmVhZE5hbWUgLyoiJXMiLHBBZC0+bmV0X2Rldi0+bmFtZSovKTsKKworCWFsbG93X3NpZ25hbChTSUdURVJNKTsKKwlhbGxvd19zaWduYWwoU0lHS0lMTCk7CisJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CisjZWxzZQorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkYWVtb25pemUoKTsKKwlyZXBhcmVudF90b19pbml0KCk7CisJc3RyY3B5KGN1cnJlbnQtPmNvbW0sIHBUaHJlYWROYW1lKTsKKworCXNpZ2luaXRzZXRpbnYoJmN1cnJlbnQtPmJsb2NrZWQsIHNpZ21hc2soU0lHVEVSTSkgfCBzaWdtYXNrKFNJR0tJTEwpKTsKKworCS8qIEFsbG93IGludGVyY2VwdGlvbiBvZiBTSUdLSUxMIG9ubHkKKwkgKiBEb24ndCBhbGxvdyBvdGhlciBzaWduYWxzIHRvIGludGVycnVwdCB0aGUgdHJhbnNtaXNzaW9uICovCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw0LDIyKQorCXNwaW5fbG9ja19pcnFzYXZlKCZjdXJyZW50LT5zaWdtYXNrX2xvY2ssIGZsYWdzKTsKKwlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOworCXJlY2FsY19zaWdwZW5kaW5nKGN1cnJlbnQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN1cnJlbnQtPnNpZ21hc2tfbG9jaywgZmxhZ3MpOworI2VuZGlmCisjZW5kaWYKKworICAgIC8qIHNpZ25hbCB0aGF0IHdlJ3ZlIHN0YXJ0ZWQgdGhlIHRocmVhZCAqLworCWNvbXBsZXRlKHBOb3RpZnkpOworCit9CisKK3ZvaWQgUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCXsKKwkJaWYgKHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID09IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkKQorCQl7CisJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TVEFfTElOS1VQX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TVEFfTElOS0RPV05fRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKwkJfQorCX0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF9saW51eC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF9saW51eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1OWY5Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0X2xpbnV4LmgKQEAgLTAsMCArMSw5MDggQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgUHJvZ3JhbTogICAgcnRfbGludXguYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQ3JlYXRlZDogICAgNC8yMS8yMDA2IDE6MTc6MzggUE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQXV0aG9yOiAgICAgV3UgWGktS3VuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQ29tbWVudHM6ICAgYGRlc2NyaXB0aW9uYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEhpc3Rvcnk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFJldmlzaW9uIDEuMSA0LzIxLzIwMDYgMToxNzozOCBQTSAgeHNpa3VuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEluaXRpYWwgcmV2aXNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInJ0bXBfdHlwZS5oIgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworCisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorCisvLyBsb2FkIGZpcm13YXJlCisjZGVmaW5lIF9fS0VSTkVMX1NZU0NBTExTX18KKyNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisKKyNkZWZpbmUgTUVNX0FMTE9DX0ZMQUcgICAgICAoR0ZQX0FUT01JQykgLy8oR0ZQX0RNQSB8IEdGUF9BVE9NSUMpCisKKyNpZm5kZWYgSUZOQU1TSVoKKyNkZWZpbmUgSUZOQU1TSVogMTYKKyNlbmRpZgorCisvLyNkZWZpbmUgQ09ORklHX0NLSVBfU1VQUE9SVAorCisjdW5kZWYgX19pbmxpbmUKKyNkZWZpbmUgX19pbmxpbmUJICAgc3RhdGljIGlubGluZQorCit0eXBlZGVmIGludCAoKkhBUkRfU1RBUlRfWE1JVF9GVU5DKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CisKKy8vIGFkZCBieSBrYXRoeQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisKKyNpZmRlZiBSVDI4NzAKKyNkZWZpbmUgU1RBX1BST0ZJTEVfUEFUSAkJCSIvZXRjL1dpcmVsZXNzL1JUMjg3MFNUQS9SVDI4NzBTVEEuZGF0IgorI2RlZmluZSBTVEFfUlQyODcwX0lNQUdFX0ZJTEVfTkFNRSAgIi9ldGMvV2lyZWxlc3MvUlQyODcwU1RBL3J0Mjg3MC5iaW4iCisjZGVmaW5lIFNUQV9OSUNfREVWSUNFX05BTUUJCQkiUlQyODcwU1RBIgorI2RlZmluZSBTVEFfRFJJVkVSX1ZFUlNJT04JCQkiMS40LjAuMCIKKyNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKKyNkZWZpbmUgQ0FSRF9JTkZPX1BBVEgJCQkiL2V0Yy9XaXJlbGVzcy9SVDI4NzBTVEEvUlQyODcwU1RBQ2FyZC5kYXQiCisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisjZW5kaWYgLy8gUlQyODcwIC8vCisKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCisjZGVmaW5lIFJUTVBfVElNRV9BRlRFUihhLGIpCQlcCisJKHR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCAodW5zaWduZWQgbG9uZylhKSAmJiBcCisJIHR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCAodW5zaWduZWQgbG9uZyliKSAmJiBcCisJICgobG9uZykoYikgLSAobG9uZykoYSkgPCAwKSkKKworI2RlZmluZSBSVE1QX1RJTUVfQUZURVJfRVEoYSxiKQlcCisJKHR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCAodW5zaWduZWQgbG9uZylhKSAmJiBcCisJIHR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCAodW5zaWduZWQgbG9uZyliKSAmJiBcCisJICgobG9uZykoYSkgLSAobG9uZykoYikgPj0gMCkpCisjZGVmaW5lIFJUTVBfVElNRV9CRUZPUkUoYSxiKQlSVE1QX1RJTUVfQUZURVJfRVEoYixhKQorI2Vsc2UKKyNkZWZpbmUgUlRNUF9USU1FX0FGVEVSKGEsYikgdGltZV9hZnRlcihhLCBiKQorI2VuZGlmCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisjZGVmaW5lIFJUX01PRF9JTkNfVVNFX0NPVU5UKCkgXAorCWlmICghdHJ5X21vZHVsZV9nZXQoVEhJU19NT0RVTEUpKSBcCisJeyBcCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBjYW5ub3QgcmVzZXJ2ZSBtb2R1bGVcbiIsIF9fZnVuY19fKSk7IFwKKwkJcmV0dXJuIC0xOyBcCisJfQorCisjZGVmaW5lIFJUX01PRF9ERUNfVVNFX0NPVU5UKCkgbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CisjZWxzZQorI2RlZmluZSBSVF9NT0RfSU5DX1VTRV9DT1VOVCgpCU1PRF9JTkNfVVNFX0NPVU5UOworI2RlZmluZSBSVF9NT0RfREVDX1VTRV9DT1VOVCgpIE1PRF9ERUNfVVNFX0NPVU5UOworI2VuZGlmCisKKyNkZWZpbmUgT1NfSFoJCQlIWgorCisjZGVmaW5lIEVUSF9MRU5HVEhfT0ZfQUREUkVTUwk2CisKKyNkZWZpbmUgSU4KKyNkZWZpbmUgT1VUCisKKyNkZWZpbmUgTkRJU19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVAorI2RlZmluZSBORElTX1NUQVRVU19TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBORElTX1NUQVRVU19GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBORElTX1NUQVRVU19JTlZBTElEX0RBVEEJCQkJMHgwMgorI2RlZmluZSBORElTX1NUQVRVU19SRVNPVVJDRVMgICAgICAgICAgICAgICAgICAgMHgwMworCisjZGVmaW5lIE1JTl9ORVRfREVWSUNFX0ZPUl9BSUQJCQkweDAwCQkvLzB4MDB+MHgzZgorI2RlZmluZSBNSU5fTkVUX0RFVklDRV9GT1JfTUJTU0lECQkweDAwCQkvLzB4MDAsMHgxMCwweDIwLDB4MzAKKyNkZWZpbmUgTUlOX05FVF9ERVZJQ0VfRk9SX1dEUwkJCTB4MTAJCS8vMHg0MCwweDUwLDB4NjAsMHg3MAorI2RlZmluZSBNSU5fTkVUX0RFVklDRV9GT1JfQVBDTEkJCTB4MjAKKyNkZWZpbmUgTUlOX05FVF9ERVZJQ0VfRk9SX01FU0gJCQkweDMwCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZGVmaW5lIE1JTl9ORVRfREVWSUNFX0ZPUl9ETFMJCQkweDQwCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2RlZmluZSBORElTX1BBQ0tFVF9UWVBFX0RJUkVDVEVECQkwCisjZGVmaW5lIE5ESVNfUEFDS0VUX1RZUEVfTVVMVElDQVNUCQkxCisjZGVmaW5lIE5ESVNfUEFDS0VUX1RZUEVfQlJPQURDQVNUCQkyCisjZGVmaW5lIE5ESVNfUEFDS0VUX1RZUEVfQUxMX01VTFRJQ0FTVAkzCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KQordHlwZWRlZglzdHJ1Y3QgcGlkICoJVEhSRUFEX1BJRDsKKyNkZWZpbmUJVEhSRUFEX1BJRF9JTklUX1ZBTFVFCU5VTEwKKyNkZWZpbmUJR0VUX1BJRChfdikJZmluZF9nZXRfcGlkKF92KQorI2RlZmluZQlHRVRfUElEX05VTUJFUihfdikJcGlkX25yKF92KQorI2RlZmluZSBDSEVDS19QSURfTEVHQUxJVFkoX3BpZCkJaWYgKHBpZF9ucihfcGlkKSA+PSAwKQorI2RlZmluZSBLSUxMX1RIUkVBRF9QSUQoX0EsIF9CLCBfQykJa2lsbF9waWQoX0EsIF9CLCBfQykKKyNlbHNlCit0eXBlZGVmCXBpZF90CVRIUkVBRF9QSUQ7CisjZGVmaW5lCVRIUkVBRF9QSURfSU5JVF9WQUxVRQktMQorI2RlZmluZQlHRVRfUElEKF92KQlfdgorI2RlZmluZQlHRVRfUElEX05VTUJFUihfdikJX3YKKyNkZWZpbmUgQ0hFQ0tfUElEX0xFR0FMSVRZKF9waWQpCWlmIChfcGlkID49IDApCisjZGVmaW5lIEtJTExfVEhSRUFEX1BJRChfQSwgX0IsIF9DKQlraWxsX3Byb2MoX0EsIF9CLCBfQykKKyNlbmRpZgorCitzdHJ1Y3Qgb3NfbG9jayAgeworCXNwaW5sb2NrX3QJCWxvY2s7CisJdW5zaWduZWQgbG9uZyAgCWZsYWdzOworfTsKKworCitzdHJ1Y3Qgb3NfY29va2llIHsKKworI2lmZGVmIFJUMjg3MAorCXN0cnVjdCB1c2JfZGV2aWNlCQkqcFVzYl9EZXY7CisKKwlUSFJFQURfUElECQkJCU1MTUVUaHJfcGlkOworCVRIUkVBRF9QSUQJCQkJUlRVU0JDbWRUaHJfcGlkOworCVRIUkVBRF9QSUQJCQkJVGltZXJRVGhyX3BpZDsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAJcnhfZG9uZV90YXNrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAJbWdtdF9kbWFfZG9uZV90YXNrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAJYWMwX2RtYV9kb25lX3Rhc2s7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IAlhYzFfZG1hX2RvbmVfdGFzazsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgCWFjMl9kbWFfZG9uZV90YXNrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAJYWMzX2RtYV9kb25lX3Rhc2s7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IAloY2NhX2RtYV9kb25lX3Rhc2s7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0CXRidHRfdGFzazsKKyNpZmRlZiBSVDI4NzAKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJbnVsbF9mcmFtZV9jb21wbGV0ZV90YXNrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAlydHNfZnJhbWVfY29tcGxldGVfdGFzazsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJcHNwb2xsX2ZyYW1lX2NvbXBsZXRlX3Rhc2s7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKworCXVuc2lnbmVkIGxvbmcJCQlhcGRfcGlkOyAvLzgwMi4xeCBkYWVtb24gcGlkCisJSU5UCQkJCQkJaW9jdGxfaWZfdHlwZTsKKwlJTlQgCQkJCQlpb2N0bF9pZjsKK307CisKK3R5cGVkZWYgc3RydWN0IF9WSVJUVUFMX0FEQVBURVIKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZQkJKlJ0bXBEZXY7CisJc3RydWN0IG5ldF9kZXZpY2UJCSpWaXJ0dWFsRGV2OworfSBWSVJUVUFMX0FEQVBURVIsIFBWSVJUVUFMX0FEQVBURVI7CisKKyN1bmRlZiAgQVNTRVJUCisjZGVmaW5lIEFTU0VSVCh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghKHgpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyBfX0ZJTEVfXyAiOiVkIGFzc2VydCAiICN4ICJmYWlsZWRcbiIsIF9fTElORV9fKTsgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK3R5cGVkZWYgc3RydWN0IG9zX2Nvb2tpZQkqIFBPU19DT09LSUU7Cit0eXBlZGVmIHN0cnVjdCBwY2lfZGV2IAkJKiBQUENJX0RFVjsKK3R5cGVkZWYgc3RydWN0IG5ldF9kZXZpY2UJKiBQTkVUX0RFVjsKK3R5cGVkZWYgdm9pZAkJCQkqIFBORElTX1BBQ0tFVDsKK3R5cGVkZWYgY2hhcgkJCQlORElTX1BBQ0tFVDsKK3R5cGVkZWYgUE5ESVNfUEFDS0VUCQkqIFBQTkRJU19QQUNLRVQ7Cit0eXBlZGVmCWRtYV9hZGRyX3QJCQlORElTX1BIWVNJQ0FMX0FERFJFU1M7Cit0eXBlZGVmCWRtYV9hZGRyX3QJCQkqIFBORElTX1BIWVNJQ0FMX0FERFJFU1M7CisvL3R5cGVkZWYgc3RydWN0IHRpbWVyX2xpc3QJUkFMSU5LX1RJTUVSX1NUUlVDVDsKKy8vdHlwZWRlZiBzdHJ1Y3QgdGltZXJfbGlzdAkqIFBSQUxJTktfVElNRVJfU1RSVUNUOworLy90eXBlZGVmIHN0cnVjdCBvc19sb2NrCQlORElTX1NQSU5fTE9DSzsKK3R5cGVkZWYgc3BpbmxvY2tfdAkJCU5ESVNfU1BJTl9MT0NLOwordHlwZWRlZiBzdHJ1Y3QgdGltZXJfbGlzdAlORElTX01JTklQT1JUX1RJTUVSOwordHlwZWRlZiB2b2lkCQkJCSogTkRJU19IQU5ETEU7Cit0eXBlZGVmIGNoYXIgCQkJCSogUE5ESVNfQlVGRkVSOworCisKKwordm9pZCBoZXhfZHVtcChjaGFyICpzdHIsIHVuc2lnbmVkIGNoYXIgKnBTcmNCdWZWQSwgdW5zaWduZWQgaW50IFNyY0J1Zkxlbik7CisKK2RtYV9hZGRyX3QgbGludXhfcGNpX21hcF9zaW5nbGUodm9pZCAqaGFuZGxlLCB2b2lkICpwdHIsIHNpemVfdCBzaXplLCBpbnQgc2RfaWR4LCBpbnQgZGlyZWN0aW9uKTsKK3ZvaWQgbGludXhfcGNpX3VubWFwX3NpbmdsZSh2b2lkICpoYW5kbGUsIGRtYV9hZGRyX3QgZG1hX2FkZHIsIHNpemVfdCBzaXplLCBpbnQgZGlyZWN0aW9uKTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBNT1ZFIFRPIHJ0bXAuaCA/CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBQS1RTUkNfTkRJUyAgICAgICAgICAgICAweDdmCisjZGVmaW5lIFBLVFNSQ19EUklWRVIgICAgICAgICAgIDB4MGYKKyNkZWZpbmUgUFJJTlRfTUFDKGFkZHIpCVwKKwlhZGRyWzBdLCBhZGRyWzFdLCBhZGRyWzJdLCBhZGRyWzNdLCBhZGRyWzRdLCBhZGRyWzVdCisKKworI2RlZmluZSBSVDI4NjBfUENJX0RFVklDRV9JRAkJMHgwNjAxCisKKworI2lmZGVmIFJUMjg3MAorI2RlZmluZSBQQ0lfTUFQX1NJTkdMRShfaGFuZGxlLCBfcHRyLCBfc2l6ZSwgX2RpcikgKFVMT05HKTAKKworI2RlZmluZSBQQ0lfVU5NQVBfU0lOR0xFKF9oYW5kbGUsIF9wdHIsIF9zaXplLCBfZGlyKQorI2VuZGlmIC8vIFJUMjg3MCAvLworCisKKyNkZWZpbmUgQkVBQ09OX0ZSQU1FX0RNQV9DQUNIRV9XQkFDSyhfcHRyLCBfc2l6ZSkJXAorCWRtYV9jYWNoZV93YmFjayhfcHRyLCBfc2l6ZSkKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCisjZGVmaW5lIE5kaXNNSW5kaWNhdGVTdGF0dXMoX3csIF94LCBfeSwgX3opCisKK3R5cGVkZWYgc3RydWN0IHRpbWVyX2xpc3QJUlRNUF9PU19USU1FUjsKKworI2lmZGVmIFJUMjg3MAorLyogLS0tLS0tLS0tLS0tLS0tLS0gVGltZXIgUmVsYXRlZCBNQVJDTyAtLS0tLS0tLS0tLS0tLS0qLworLy8gSW4gUlQyODcwLCB3ZSBoYXZlIGEgbG90IG9mIHRpbWVyIGZ1bmN0aW9ucyBhbmQgd2lsbCByZWFkL3dyaXRlIHJlZ2lzdGVyLCBpdCdzCisvLwlub3QgYWxsb3dlZCBpbiBMaW51eCBVU0Igc3ViLXN5c3RlbSB0byBkbyBpdCAoIGJlY2F1c2Ugb2Ygc2xlZXAgaXNzdWUgd2hlbiBzdWJtaXQKKy8vICB0byBjdHJsIHBpcGUpLiBTbyB3ZSBuZWVkIGEgd3JhcHBlciBmdW5jdGlvbiB0byB0YWtlIGNhcmUgaXQuCisKK3R5cGVkZWYgVk9JRCAoKlJUMjg3MF9USU1FUl9IQU5ETEUpKAorCUlOICBQVk9JRCAgIFN5c3RlbVNwZWNpZmljMSwKKwlJTiAgUFZPSUQgICBGdW5jdGlvbkNvbnRleHQsCisJSU4gIFBWT0lEICAgU3lzdGVtU3BlY2lmaWMyLAorCUlOICBQVk9JRCAgIFN5c3RlbVNwZWNpZmljMyk7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwordHlwZWRlZiBzdHJ1Y3QgIF9SQUxJTktfVElNRVJfU1RSVUNUICAgIHsKKyAgICBSVE1QX09TX1RJTUVSCQlUaW1lck9iajsgICAgICAgLy8gTmRpcyBUaW1lciBvYmplY3QKKwlCT09MRUFOCQkJCVZhbGlkOwkJCS8vIFNldCB0byBUcnVlIHdoZW4gY2FsbCBSVE1QSW5pdFRpbWVyCisgICAgQk9PTEVBTiAgICAgICAgICAgICBTdGF0ZTsgICAgICAgICAgLy8gVHJ1ZSBpZiB0aW1lciBjYW5jZWxsZWQKKyAgICBCT09MRUFOCSAgICAgIAkJUGVyaW9kaWNUeXBlOwkvLyBUcnVlIGlmIHRpbWVyIGlzIHBlcmlvZGljIHRpbWVyCisgICAgQk9PTEVBTiAgICAgICAgICAgICBSZXBlYXQ7ICAgICAgICAgLy8gVHJ1ZSBpZiBwZXJpb2RpYyB0aW1lcgorICAgIFVMT05HICAgICAgICAgICAgICAgVGltZXJWYWx1ZTsgICAgIC8vIFRpbWVyIHZhbHVlIGluIG1pbGxpc2Vjb25kcworCVVMT05HCQkJCWNvb2tpZTsJCQkvLyBvcyBzcGVjaWZpYyBvYmplY3QKKyNpZmRlZiBSVDI4NzAKKwlSVDI4NzBfVElNRVJfSEFORExFCWhhbmRsZTsKKwl2b2lkCQkJCSpwQWQ7CisjZW5kaWYgLy8gUlQyODcwIC8vCit9ICAgUkFMSU5LX1RJTUVSX1NUUlVDVCwgKlBSQUxJTktfVElNRVJfU1RSVUNUOworCisKKyNpZmRlZiBSVDI4NzAKKwordHlwZWRlZiBlbnVtIF9SVDI4NzBfS0VSTkVMX1RIUkVBRF9TVEFUVVNfCit7CisJUlQyODcwX1RIUkVBRF9VTktOT1dOID0gMCwKKwlSVDI4NzBfVEhSRUFEX0lOSVRFRCA9IDEsCisJUlQyODcwX1RIUkVBRF9SVU5OSU5HID0gMiwKKwlSVDI4NzBfVEhSRUFEX1NUT1BFRCA9IDQsCit9UlQyODcwX0tFUk5FTF9USFJFQURfU1RBVFVTOworCisjZGVmaW5lIFJUMjg3MF9USFJFQURfQ0FOX0RPX0lOU0VSVAkJKFJUMjg3MF9USFJFQURfSU5JVEVEIHxSVDI4NzBfVEhSRUFEX1JVTk5JTkcpCisKK3R5cGVkZWYgc3RydWN0IF9SVDI4NzBfVElNRVJfRU5UUllfCit7CisJUkFMSU5LX1RJTUVSX1NUUlVDVCAJCQkqcFJhVGltZXI7CisJc3RydWN0IF9SVDI4NzBfVElNRVJfRU5UUllfIAkqcE5leHQ7Cit9UlQyODcwX1RJTUVSX0VOVFJZOworCisKKyNkZWZpbmUgVElNRVJfUVVFVUVfU0laRV9NQVgJMTI4Cit0eXBlZGVmIHN0cnVjdCBfUlQyODcwX1RJTUVSX1FVRVVFXworeworCXVuc2lnbmVkIGludAkJc3RhdHVzOworCS8vd2FpdF9xdWV1ZV9oZWFkX3QgCXRpbWVyV2FpdFE7CisJLy9hdG9taWNfdAkJCWNvdW50OworCVVDSEFSCQkJCSpwVGltZXJRUG9sbDsKKwlSVDI4NzBfVElNRVJfRU5UUlkJKnBRUG9sbEZyZWVMaXN0OworCVJUMjg3MF9USU1FUl9FTlRSWSAJKnBRSGVhZDsKKwlSVDI4NzBfVElNRVJfRU5UUlkgCSpwUVRhaWw7Cit9UlQyODcwX1RJTUVSX1FVRVVFOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisKKy8vI2RlZmluZSBEQkcJMQorCisvLworLy8gIE1BQ1JPIGZvciBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KKy8vCisKKyNpZmRlZiBEQkcKK2V4dGVybiBVTE9ORyAgICBSVERlYnVnTGV2ZWw7CisKKyNkZWZpbmUgREJHUFJJTlRfUkFXKExldmVsLCBGbXQpICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoTGV2ZWwgPD0gUlREZWJ1Z0xldmVsKSAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcHJpbnRrIEZtdDsgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgREJHUFJJTlQoTGV2ZWwsIEZtdCkgICAgREJHUFJJTlRfUkFXKExldmVsLCBGbXQpCisKKworI2RlZmluZSBEQkdQUklOVF9FUlIoRm10KSAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHByaW50aygiRVJST1IhISEgIik7ICAgICAgICAgIFwKKyAgICBwcmludGsgRm10OyAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBEQkdQUklOVF9TKFN0YXR1cywgRm10KQkJXAorewkJCQkJCQkJCVwKKwlwcmludGsgRm10OwkJCQkJXAorfQorCisKKyNlbHNlCisjZGVmaW5lIERCR1BSSU5UKExldmVsLCBGbXQpCisjZGVmaW5lIERCR1BSSU5UX1JBVyhMZXZlbCwgRm10KQorI2RlZmluZSBEQkdQUklOVF9TKFN0YXR1cywgRm10KQorI2RlZmluZSBEQkdQUklOVF9FUlIoRm10KQorI2VuZGlmCisKKworLy8KKy8vICBzcGluX2xvY2sgZW5oYW5jZWQgZm9yIE5lc3RlZCBzcGluIGxvY2sKKy8vCisjZGVmaW5lIE5kaXNBbGxvY2F0ZVNwaW5Mb2NrKF9fbG9jaykgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNwaW5fbG9ja19pbml0KChzcGlubG9ja190ICopKF9fbG9jaykpOyAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBOZGlzRnJlZVNwaW5Mb2NrKGxvY2spICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSBSVE1QX1NFTV9MT0NLKF9fbG9jaykJCQkJCVwKK3sJCQkJCQkJCQkJCQlcCisJc3Bpbl9sb2NrX2JoKChzcGlubG9ja190ICopKF9fbG9jaykpOwkJCQlcCit9CisKKyNkZWZpbmUgUlRNUF9TRU1fVU5MT0NLKF9fbG9jaykJCQkJCVwKK3sJCQkJCQkJCQkJCQlcCisJc3Bpbl91bmxvY2tfYmgoKHNwaW5sb2NrX3QgKikoX19sb2NrKSk7CQkJCVwKK30KKworI2lmIDAgLy8gc2FtcGxlLCBJUlEgTE9DSworI2RlZmluZSBSVE1QX0lSUV9MT0NLKF9fbG9jaywgX19pcnFmbGFncykJCQkJCVwKK3sJCQkJCQkJCQkJCQkJXAorCXNwaW5fbG9ja19pcnFzYXZlKChzcGlubG9ja190ICopX19sb2NrLCBfX2lycWZsYWdzKTsJXAorCXBBZC0+aXJxX2Rpc2FibGVkIHw9IDE7IFwKK30KKworI2RlZmluZSBSVE1QX0lSUV9VTkxPQ0soX19sb2NrLCBfX2lycWZsYWcpCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJXAorCXBBZC0+aXJxX2Rpc2FibGVkICY9IDA7IFwKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKChzcGlubG9ja190ICopKF9fbG9jayksICgodW5zaWduZWQgbG9uZylfX2lycWZsYWcpKTsJXAorfQorI2Vsc2UKKworLy8gc2FtcGxlLCB1c2Ugc2VtYXBob3JlIGxvY2sgdG8gcmVwbGFjZSBJUlEgbG9jaywgMjAwNy8xMS8xNQorI2RlZmluZSBSVE1QX0lSUV9MT0NLKF9fbG9jaywgX19pcnFmbGFncykJCQlcCit7CQkJCQkJCQkJCQkJCVwKKwlfX2lycWZsYWdzID0gMDsJCQkJCQkJCQlcCisJc3Bpbl9sb2NrX2JoKChzcGlubG9ja190ICopKF9fbG9jaykpOwkJCVwKKwlwQWQtPmlycV9kaXNhYmxlZCB8PSAxOyBcCit9CisKKyNkZWZpbmUgUlRNUF9JUlFfVU5MT0NLKF9fbG9jaywgX19pcnFmbGFnKQkJCVwKK3sJCQkJCQkJCQkJCQkJXAorCXBBZC0+aXJxX2Rpc2FibGVkICY9IDA7IFwKKwlzcGluX3VubG9ja19iaCgoc3BpbmxvY2tfdCAqKShfX2xvY2spKTsJCQlcCit9CisKKyNkZWZpbmUgUlRNUF9JTlRfTE9DSyhfX2xvY2ssIF9faXJxZmxhZ3MpCQkJXAorewkJCQkJCQkJCQkJCQlcCisJc3Bpbl9sb2NrX2lycXNhdmUoKHNwaW5sb2NrX3QgKilfX2xvY2ssIF9faXJxZmxhZ3MpOwlcCit9CisKKyNkZWZpbmUgUlRNUF9JTlRfVU5MT0NLKF9fbG9jaywgX19pcnFmbGFnKQkJCVwKK3sJCQkJCQkJCQkJCQkJXAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoKHNwaW5sb2NrX3QgKikoX19sb2NrKSwgKCh1bnNpZ25lZCBsb25nKV9faXJxZmxhZykpOwlcCit9CisjZW5kaWYKKworCisKKyNpZmRlZiBSVDI4NzAKKy8vUGF0Y2ggZm9yIEFTSUMgdHVyc3QgcmVhZC93cml0ZSBidWcsIG5lZWRzIHRvIHJlbW92ZSBhZnRlciBtZXRlbCBmaXgKKyNkZWZpbmUgUlRNUF9JT19SRUFEMzIoX0EsIF9SLCBfcFYpCQkJCQkJCQlcCisJUlRVU0JSZWFkTUFDUmVnaXN0ZXIoX0EsIF9SLCBfcFYpCisKKyNkZWZpbmUgUlRNUF9JT19SRUFEOChfQSwgX1IsIF9wVikJCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJXAorfQorCisjZGVmaW5lIFJUTVBfSU9fV1JJVEUzMihfQSwgX1IsIF9WKQkJCQkJCQkJXAorCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihfQSwgX1IsIF9WKQorCisKKyNkZWZpbmUgUlRNUF9JT19XUklURTgoX0EsIF9SLCBfVikJCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJXAorCVVTSE9SVAlfVmFsID0gX1Y7CQkJCQkJCQkJCQlcCisJUlRVU0JTaW5nbGVXcml0ZShfQSwgX1IsIF9WYWwpOwkJCQkJCQkJXAorfQorCisKKyNkZWZpbmUgUlRNUF9JT19XUklURTE2KF9BLCBfUiwgX1YpCQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJCVwKKwlSVFVTQlNpbmdsZVdyaXRlKF9BLCBfUiwgX1YpOwkJCQkJCQkJXAorfQorI2VuZGlmIC8vIFJUMjg3MCAvLworCisjaWZuZGVmIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0CisjZGVmaW5lIF9fd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQod3EsIGNvbmRpdGlvbiwgcmV0KSBcCitkbyB7IFwKKyAgICAgICAgd2FpdF9xdWV1ZV90IF9fd2FpdDsgXAorICAgICAgICBpbml0X3dhaXRxdWV1ZV9lbnRyeSgmX193YWl0LCBjdXJyZW50KTsgXAorICAgICAgICBhZGRfd2FpdF9xdWV1ZSgmd3EsICZfX3dhaXQpOyBcCisgICAgICAgIGZvciAoOzspIHsgXAorICAgICAgICAgICAgICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7IFwKKyAgICAgICAgICAgICAgICBpZiAoY29uZGl0aW9uKSBcCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgXAorICAgICAgICAgICAgICAgIGlmICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gc2NoZWR1bGVfdGltZW91dChyZXQpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJldCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgXAorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICByZXQgPSAtRVJFU1RBUlRTWVM7IFwKKyAgICAgICAgICAgICAgICBicmVhazsgXAorICAgICAgICB9IFwKKyAgICAgICAgY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7IFwKKyAgICAgICAgcmVtb3ZlX3dhaXRfcXVldWUoJndxLCAmX193YWl0KTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh3cSwgY29uZGl0aW9uLCB0aW1lb3V0KSBcCisoeyBcCisgICAgICAgIGxvbmcgX19yZXQgPSB0aW1lb3V0OyBcCisgICAgICAgIGlmICghKGNvbmRpdGlvbikpIFwKKyAgICAgICAgICAgICAgICBfX3dhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHdxLCBjb25kaXRpb24sIF9fcmV0KTsgXAorICAgICAgICBfX3JldDsgXAorfSkKKyNlbmRpZgorI2RlZmluZSBPTkVfVElDSyAxCisjZGVmaW5lIE9TX1dBSVQoX3RpbWUpIFwKK3sJaW50IF9pOyBcCisJbG9uZyBfbG9vcCA9ICgoX3RpbWUpLygxMDAwL09TX0haKSkgPiAwID8gKChfdGltZSkvKDEwMDAvT1NfSFopKSA6IDE7XAorCXdhaXRfcXVldWVfaGVhZF90IF93YWl0OyBcCisJaW5pdF93YWl0cXVldWVfaGVhZCgmX3dhaXQpOyBcCisJZm9yIChfaT0wOyBfaTwoX2xvb3ApOyBfaSsrKSBcCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KF93YWl0LCAwLCBPTkVfVElDSyk7IH0KKworCit0eXBlZGVmIHZvaWQgKCpUSU1FUl9GVU5DVElPTikodW5zaWduZWQgbG9uZyk7CisKKyNkZWZpbmUgQ09QWV9NQUNfQUREUihBZGRyMSwgQWRkcjIpICAgICAgICAgICAgIG1lbWNweSgoQWRkcjEpLCAoQWRkcjIpLCBNQUNfQUREUl9MRU4pCisKKyNkZWZpbmUgTWxtZUFsbG9jYXRlTWVtb3J5KF9wQWQsIF9wcFZBKSBvc19hbGxvY19tZW0oX3BBZCwgX3BwVkEsIE1HTVRfRE1BX0JVRkZFUl9TSVpFKQorI2RlZmluZSBNbG1lRnJlZU1lbW9yeShfcEFkLCBfcFZBKSAgICAgb3NfZnJlZV9tZW0oX3BBZCwgX3BWQSkKKworCisjaWZkZWYgUlQyODcwCisjZGVmaW5lIEJVSUxEX1RJTUVSX0ZVTkNUSU9OKF9mdW5jKQkJCQkJCQkJCQkJCQlcCit2b2lkIGxpbnV4XyMjX2Z1bmModW5zaWduZWQgbG9uZyBkYXRhKQkJCQkJCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJUFJBTElOS19USU1FUl9TVFJVQ1QJX3BUaW1lciA9IChQUkFMSU5LX1RJTUVSX1NUUlVDVClkYXRhOwkJCQkJXAorCVJUMjg3MF9USU1FUl9FTlRSWQkJKl9wUU5vZGU7CQkJCQkJCQkJCQkJXAorCVJUTVBfQURBUFRFUgkJCSpfcEFkOwkJCQkJCQkJCQkJCQlcCisJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwlfcFRpbWVyLT5oYW5kbGUgPSBfZnVuYzsJCQkJCQkJCQkJCQkJCQlcCisJX3BBZCA9IChSVE1QX0FEQVBURVIgKilfcFRpbWVyLT5wQWQ7CQkJCQkJCQkJCQkJXAorCV9wUU5vZGUgPSBSVDI4NzBfVGltZXJRX0luc2VydChfcEFkLCBfcFRpbWVyKTsgCQkJCQkJCQkJXAorCWlmICgoX3BRTm9kZSA9PSBOVUxMKSAmJiAoX3BBZC0+VGltZXJRLnN0YXR1cyAmIFJUMjg3MF9USFJFQURfQ0FOX0RPX0lOU0VSVCkpCVwKKwkJUlRNUF9PU19BZGRfVGltZXIoJl9wVGltZXItPlRpbWVyT2JqLCBIWik7ICAgICAgICAgICAgICAgCQkJCQlcCit9CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKworI2RlZmluZSBERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKF9mdW5jKQkJCVwKK3ZvaWQgbGludXhfIyNfZnVuYyh1bnNpZ25lZCBsb25nIGRhdGEpCisKKyNkZWZpbmUgR0VUX1RJTUVSX0ZVTkNUSU9OKF9mdW5jKQkJCQlcCisJCWxpbnV4XyMjX2Z1bmMKKworREVDTEFSRV9USU1FUl9GVU5DVElPTihNbG1lUGVyaW9kaWNFeGVjKTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oTWxtZVJzc2lSZXBvcnRFeGVjKTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oQXNpY1J4QW50RXZhbFRpbWVvdXQpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihBUFNEUGVyaW9kaWNFeGVjKTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oQXNpY1JmVHVuaW5nRXhlYyk7CisjaWZkZWYgUlQyODcwCitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKEJlYWNvblVwZGF0ZUV4ZWMpOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oQmVhY29uVGltZW91dCk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKFNjYW5UaW1lb3V0KTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oQXV0aFRpbWVvdXQpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihBc3NvY1RpbWVvdXQpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihSZWFzc29jVGltZW91dCk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKERpc2Fzc29jVGltZW91dCk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKExpbmtEb3duRXhlYyk7CisjaWZkZWYgTEVBUF9TVVBQT1JUCitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKExlYXBBdXRoVGltZW91dCk7CisjZW5kaWYKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwRXhlYyk7CitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKFdwYURpc2Fzc29jQXBBbmRCbG9ja0Fzc29jKTsKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oUHNQb2xsV2FrZUV4ZWMpOworREVDTEFSRV9USU1FUl9GVU5DVElPTihSYWRpb09uRXhlYyk7CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oRGxzVGltZW91dEFjdGlvbik7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK3ZvaWQgUlRNUF9HZXRDdXJyZW50U3lzdGVtVGltZShMQVJHRV9JTlRFR0VSICp0aW1lKTsKKworCisvKgorICogcGFja2V0IGhlbHBlcgorICogCS0gY29udmVydCBpbnRlcm5hbCBydCBwYWNrZXQgdG8gb3MgcGFja2V0IG9yCisgKiAgICAgICAgICAgICBvcyBwYWNrZXQgdG8gcnQgcGFja2V0CisgKi8KKyNkZWZpbmUgUlRQS1RfVE9fT1NQS1QoX3ApCQkoKHN0cnVjdCBza19idWZmICopKF9wKSkKKyNkZWZpbmUgT1NQS1RfVE9fUlRQS1QoX3ApCQkoKFBORElTX1BBQ0tFVCkoX3ApKQorCisjZGVmaW5lIEdFVF9PU19QS1RfREFUQVBUUihfcGt0KSBcCisJCShSVFBLVF9UT19PU1BLVChfcGt0KS0+ZGF0YSkKKworI2RlZmluZSBHRVRfT1NfUEtUX0xFTihfcGt0KSBcCisJCShSVFBLVF9UT19PU1BLVChfcGt0KS0+bGVuKQorCisjZGVmaW5lIEdFVF9PU19QS1RfREFUQVRBSUwoX3BrdCkgXAorCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCktPnRhaWwpCisKKyNkZWZpbmUgR0VUX09TX1BLVF9IRUFEKF9wa3QpIFwKKwkJKFJUUEtUX1RPX09TUEtUKF9wa3QpLT5oZWFkKQorCisjZGVmaW5lIEdFVF9PU19QS1RfRU5EKF9wa3QpIFwKKwkJKFJUUEtUX1RPX09TUEtUKF9wa3QpLT5lbmQpCisKKyNkZWZpbmUgR0VUX09TX1BLVF9ORVRERVYoX3BrdCkgXAorCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCktPmRldikKKworI2RlZmluZSBHRVRfT1NfUEtUX1RZUEUoX3BrdCkgXAorCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCkpCisKKyNkZWZpbmUgR0VUX09TX1BLVF9ORVhUKF9wa3QpIFwKKwkJKFJUUEtUX1RPX09TUEtUKF9wa3QpLT5uZXh0KQorCisKKyNkZWZpbmUgT1NfTlRPSFMoX1ZhbCkgXAorCQkobnRvaHMoX1ZhbCkpCisjZGVmaW5lIE9TX0hUT05TKF9WYWwpIFwKKwkJKGh0b25zKF9WYWwpKQorI2RlZmluZSBPU19OVE9ITChfVmFsKSBcCisJCShudG9obChfVmFsKSkKKyNkZWZpbmUgT1NfSFRPTkwoX1ZhbCkgXAorCQkoaHRvbmwoX1ZhbCkpCisKKy8qIHN0YXRpc3RpY3MgY291bnRlciAqLworI2RlZmluZSBTVEFUU19JTkNfUlhfUEFDS0VUUyhfcEFkLCBfZGV2KQorI2RlZmluZSBTVEFUU19JTkNfVFhfUEFDS0VUUyhfcEFkLCBfZGV2KQorCisjZGVmaW5lIFNUQVRTX0lOQ19SWF9CWVRFU1MoX3BBZCwgX2RldiwgbGVuKQorI2RlZmluZSBTVEFUU19JTkNfVFhfQllURVNTKF9wQWQsIF9kZXYsIGxlbikKKworI2RlZmluZSBTVEFUU19JTkNfUlhfRVJST1JTKF9wQWQsIF9kZXYpCisjZGVmaW5lIFNUQVRTX0lOQ19UWF9FUlJPUlMoX3BBZCwgX2RldikKKworI2RlZmluZSBTVEFUU19JTkNfUlhfRFJPUFBFRChfcEFkLCBfZGV2KQorI2RlZmluZSBTVEFUU19JTkNfVFhfRFJPUFBFRChfcEFkLCBfZGV2KQorCisKKyNkZWZpbmUgQ0JfT0ZGICAxMAorCisKKy8vICAgY2hlY2sgRERLIE5ESVNfUEFDS0VUIGRhdGEgc3RydWN0dXJlIGFuZCBmaW5kIG91dCBvbmx5IE1pbmlwb3J0UmVzZXJ2ZWRFeFswLi43XSBjYW4gYmUgdXNlZCBieSBvdXIgZHJpdmVyIHdpdGhvdXQKKy8vICAgYW1iaWd1aXR5LiBGaWVsZHMgYWZ0ZXIgcFBhY2tldC0+TWluaXBvcnRSZXNlcnZlZEV4WzhdIG1heSBiZSB1c2VkIGJ5IG90aGVyIHdyYXBwZXIgbGF5ZXIgdGh1cyBjcmFzaGVzIHRoZSBkcml2ZXIKKy8vCisvLyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX01SKF9wKQkJCShSVFBLVF9UT19PU1BLVChfcCkpCisKKy8vIFVzZXIgUHJpb3JpdHkKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX1VQKF9wLCBfcHJpbykJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMF0gPSBfcHJpbykKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX1VQKF9wKQkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzBdKQorCisvLyBGcmFnbWVudCAjCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9GUkFHTUVOVFMoX3AsIF9udW0pCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMV0gPSBfbnVtKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfRlJBR01FTlRTKF9wKQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxXSkKKworLy8gMHgwIH4weDdmOiBUWCB0byBBUCdzIG93biBCU1Mgd2hpY2ggaGFzIHRoZSBzcGVjaWZpZWQgQUlELiBpZiBBSUQ+MTI3LCBzZXQgYml0IDcgaW4gUlRNUF9TRVRfUEFDS0VUX0VNQUNUQUIgdG9vLgorLy8odGhpcyB2YWx1ZSBhbHNvIGFzIE1BQyhvbi1jaGlwIFdDSUQpIHRhYmxlIGluZGV4KQorLy8gMHg4MH4weGZmOiBUWCB0byBhIFdEUyBsaW5rLiBiMH42OiBXRFMgaW5kZXgKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX1dDSUQoX3AsIF93ZHNpZHgpCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMl0gPSBfd2RzaWR4KQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfV0NJRChfcCkgICAgICAgICAgCQkoKFVDSEFSKShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisyXSkpCisKKy8vIDB4ZmY6IFBLVFNSQ19ORElTLCBvdGhlcnM6IGxvY2FsIFRYIGJ1ZmZlciBpbmRleC4gVGhpcyB2YWx1ZSBhZmZlY3RzIGhvdyB0byBhIHBhY2tldAorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfU09VUkNFKF9wLCBfcGt0c3JjKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzNdID0gX3BrdHNyYykKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX1NPVVJDRShfcCkgICAgICAgCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrM10pCisKKy8vIFJUUy9DVFMtdG8tc2VsZiBwcm90ZWN0aW9uIG1ldGhvZAorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfUlRTKF9wLCBfbnVtKSAgICAgIAkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzRdID0gX251bSkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX1JUUyhfcCkgICAgICAgICAgCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrNF0pCisvLyBzZWUgUlRNUF9TKEcpRVRfUEFDS0VUX0VNQUNUQUIKKworLy8gVFggcmF0ZSBpbmRleAorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfVFhSQVRFKF9wLCBfcmF0ZSkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis1XSA9IF9yYXRlKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfVFhSQVRFKF9wKQkJICAJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis1XSkKKworLy8gRnJvbSB3aGljaCBJbnRlcmZhY2UKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX0lGKF9wLCBfaWZkeCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis2XSA9IF9pZmR4KQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfSUYoX3ApCQkgIAkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzZdKQorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfTkVUX0RFVklDRV9NQlNTSUQoX3AsIF9ic3MpCQlSVE1QX1NFVF9QQUNLRVRfSUYoKF9wKSwgKF9ic3MpKQorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfTkVUX0RFVklDRV9XRFMoX3AsIF9ic3MpCQlSVE1QX1NFVF9QQUNLRVRfSUYoKF9wKSwgKChfYnNzKSArIE1JTl9ORVRfREVWSUNFX0ZPUl9XRFMpKQorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfTkVUX0RFVklDRV9BUENMSShfcCwgX2lkeCkgICAJUlRNUF9TRVRfUEFDS0VUX0lGKChfcCksICgoX2lkeCkgKyBNSU5fTkVUX0RFVklDRV9GT1JfQVBDTEkpKQorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfTkVUX0RFVklDRV9NRVNIKF9wLCBfaWR4KSAgIAlSVE1QX1NFVF9QQUNLRVRfSUYoKF9wKSwgKChfaWR4KSArIE1JTl9ORVRfREVWSUNFX0ZPUl9NRVNIKSkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX05FVF9ERVZJQ0VfTUJTU0lEKF9wKQkJCVJUTVBfR0VUX1BBQ0tFVF9JRigoX3ApKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfTkVUX0RFVklDRShfcCkJCQkJCVJUTVBfR0VUX1BBQ0tFVF9JRigoX3ApKQorCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9NT1JFREFUQShfcCwgX21vcmViaXQpCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrN10gPSBfbW9yZWJpdCkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX01PUkVEQVRBKF9wKQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrN10pCisKKy8vI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfTkVUX0RFVklDRV9NQlNTSUQoX3AsIF9ic3MpCShSVFBLVF9UT19PU1BLVChfcCktPmNiWzhdID0gX2JzcykKKy8vI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfTkVUX0RFVklDRV9NQlNTSUQoX3ApCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYls4XSkKKworCisKKworI2lmIDAKKy8vI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfREhDUChfcCwgX2ZsZykgICAJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSA9IF9mbGcpCisvLyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0RIQ1AoX3ApICAgICAgICAgCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pCisjZWxzZQorLy8KKy8vCVNlcGNpZmljIFBha2NldCBUeXBlIGRlZmluaXRpb24KKy8vCisjZGVmaW5lIFJUTVBfUEFDS0VUX1NQRUNJRklDX0NCX09GRlNFVAkxMQorCisjZGVmaW5lIFJUTVBfUEFDS0VUX1NQRUNJRklDX0RIQ1AJCTB4MDEKKyNkZWZpbmUgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfRUFQT0wJCTB4MDIKKyNkZWZpbmUgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfSVBWNAkJMHgwNAorI2RlZmluZSBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19XQUkJCTB4MDgKKyNkZWZpbmUgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfVkxBTgkJMHgxMAorI2RlZmluZSBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19MTENTTkFQCTB4MjAKKworLy9TcGVjaWZpYworI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfU1BFQ0lGSUMoX3AsIF9mbGcpCSAgIAkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdID0gX2ZsZykKKworLy9ESENQCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9ESENQKF9wLCBfZmxnKSAgIAkJCQkJCQkJCQkJCQlcCisJCQlkb3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQlpZiAoX2ZsZykJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgfD0gKFJUTVBfUEFDS0VUX1NQRUNJRklDX0RIQ1ApOwkJXAorCQkJCWVsc2UJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pICY9ICghUlRNUF9QQUNLRVRfU1BFQ0lGSUNfREhDUCk7CVwKKwkJCX13aGlsZSgwKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfREhDUChfcCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gJiBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19ESENQKQorCisvL0VBUE9MCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9FQVBPTChfcCwgX2ZsZykgICAJCQkJCQkJCQkJCQkJXAorCQkJZG97CQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJaWYgKF9mbGcpCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pIHw9IChSVE1QX1BBQ0tFVF9TUEVDSUZJQ19FQVBPTCk7CQlcCisJCQkJZWxzZQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgJj0gKCFSVE1QX1BBQ0tFVF9TUEVDSUZJQ19FQVBPTCk7CVwKKwkJCX13aGlsZSgwKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfRUFQT0woX3ApCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdICYgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfRUFQT0wpCisKKy8vV0FJCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9XQUkoX3AsIF9mbGcpICAgCQkJCQkJCQkJCQkJCVwKKwkJCWRvewkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCWlmIChfZmxnKQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKSB8PSAoUlRNUF9QQUNLRVRfU1BFQ0lGSUNfV0FJKTsJCVwKKwkJCQllbHNlCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKSAmPSAoIVJUTVBfUEFDS0VUX1NQRUNJRklDX1dBSSk7CVwKKwkJCX13aGlsZSgwKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfV0FJKF9wKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSAmIFJUTVBfUEFDS0VUX1NQRUNJRklDX1dBSSkKKworI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfTE9XUkFURShfcCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gJiAoUlRNUF9QQUNLRVRfU1BFQ0lGSUNfRUFQT0wgfCBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19ESENQIHwgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfV0FJKSkKKworLy9WTEFOCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9WTEFOKF9wLCBfZmxnKSAgIAkJCQkJCQkJCQkJCQlcCisJCQlkb3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQlpZiAoX2ZsZykJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgfD0gKFJUTVBfUEFDS0VUX1NQRUNJRklDX1ZMQU4pOwkJXAorCQkJCWVsc2UJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pICY9ICghUlRNUF9QQUNLRVRfU1BFQ0lGSUNfVkxBTik7CVwKKwkJCX13aGlsZSgwKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfVkxBTihfcCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gJiBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19WTEFOKQorCisvL0xMQy9TTkFQCisjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9MTENTTkFQKF9wLCBfZmxnKSAgIAkJCQkJCQkJCQkJCQlcCisJCQlkb3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQlpZiAoX2ZsZykJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgfD0gKFJUTVBfUEFDS0VUX1NQRUNJRklDX0xMQ1NOQVApOwkJXAorCQkJCWVsc2UJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pICY9ICghUlRNUF9QQUNLRVRfU1BFQ0lGSUNfTExDU05BUCk7CQlcCisJCQl9d2hpbGUoMCkKKworI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfTExDU05BUChfcCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gJiBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19MTENTTkFQKQorCisvLyBJUAorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfSVBWNChfcCwgX2ZsZykJCQkJCQkJCQkJCQkJCVwKKwkJCWRvewkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCWlmIChfZmxnKQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKSB8PSAoUlRNUF9QQUNLRVRfU1BFQ0lGSUNfSVBWNCk7CQlcCisJCQkJZWxzZQkJCQkJCQkJCQkJCQkJCQkJCVwKKwkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgJj0gKCFSVE1QX1BBQ0tFVF9TUEVDSUZJQ19JUFY0KTsJXAorCQkJfXdoaWxlKDApCisKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0lQVjQoX3ApCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdICYgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfSVBWNCkKKworI2VuZGlmCisKKworLy8gSWYgdGhpcyBmbGFnIGlzIHNldCwgaXQgaW5kaWNhdGVzIHRoYXQgdGhpcyBFQVBvTCBmcmFtZSBNVVNUIGJlIGNsZWFyLgorI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfQ0xFQVJfRUFQX0ZSQU1FKF9wLCBfZmxnKSAgIChSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMl0gPSBfZmxnKQorI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfQ0xFQVJfRUFQX0ZSQU1FKF9wKSAgICAgICAgIChSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMl0pCisKKyNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUXzVWVChfcCwgX2ZsZykgICAoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMjJdID0gX2ZsZykKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUXzVWVChfcCkgICAgICAgICAoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMjJdKQorCisKKyNpZmRlZiBDT05GSUdfNVZUX0VOSEFOQ0UKKyNkZWZpbmUgQlJJREdFX1RBRyAweDM1NTY0MjUyICAgIC8vIGRlcGVuZHMgb24gNVZUIGRlZmluZSBpbiBicl9pbnB1dC5jCisjZW5kaWYKKworCisjZGVmaW5lIE5ESVNfU0VUX1BBQ0tFVF9TVEFUVVMoX3AsIF9zdGF0dXMpCisKKworI2RlZmluZSBHRVRfU0dfTElTVF9GUk9NX1BBQ0tFVChfcCwgX3NjKQlcCisgICAgcnRfZ2V0X3NnX2xpc3RfZnJvbV9wYWNrZXQoX3AsIF9zYykKKworCisjZGVmaW5lIE5kaXNNb3ZlTWVtb3J5KERlc3RpbmF0aW9uLCBTb3VyY2UsIExlbmd0aCkgbWVtbW92ZShEZXN0aW5hdGlvbiwgU291cmNlLCBMZW5ndGgpCisjZGVmaW5lIE5kaXNaZXJvTWVtb3J5KERlc3RpbmF0aW9uLCBMZW5ndGgpICAgICAgICAgbWVtc2V0KERlc3RpbmF0aW9uLCAwLCBMZW5ndGgpCisjZGVmaW5lIE5kaXNGaWxsTWVtb3J5KERlc3RpbmF0aW9uLCBMZW5ndGgsIEZpbGwpICAgbWVtc2V0KERlc3RpbmF0aW9uLCBGaWxsLCBMZW5ndGgpCisjZGVmaW5lIE5kaXNFcXVhbE1lbW9yeShTb3VyY2UxLCBTb3VyY2UyLCBMZW5ndGgpICAgKCFtZW1jbXAoU291cmNlMSwgU291cmNlMiwgTGVuZ3RoKSkKKyNkZWZpbmUgUlRNUEVxdWFsTWVtb3J5KFNvdXJjZTEsIFNvdXJjZTIsIExlbmd0aCkJKCFtZW1jbXAoU291cmNlMSwgU291cmNlMiwgTGVuZ3RoKSkKKworCisjZGVmaW5lIFJUTVBfSU5DX1JFRihfQSkJCTAKKyNkZWZpbmUgUlRNUF9ERUNfUkVGKF9BKQkJMAorI2RlZmluZSBSVE1QX0dFVF9SRUYoX0EpCQkwCisKKworCisvKgorICogVUxPTkcKKyAqIFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KAorICogICBJTiBORElTX1BIWVNJQ0FMX0FERFJFU1MgIFBoeXNpY2FsQWRkcmVzcyk7CisgKi8KKyNkZWZpbmUgUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3coUGh5c2ljYWxBZGRyZXNzKQkJKFBoeXNpY2FsQWRkcmVzcykKKworLyoKKyAqIFVMT05HCisgKiBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2goCisgKiAgIElOIE5ESVNfUEhZU0lDQUxfQUREUkVTUyAgUGh5c2ljYWxBZGRyZXNzKTsKKyAqLworI2RlZmluZSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2goUGh5c2ljYWxBZGRyZXNzKQkJKDApCisKKy8qCisgKiBWT0lECisgKiBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdygKKyAqICAgSU4gTkRJU19QSFlTSUNBTF9BRERSRVNTICBQaHlzaWNhbEFkZHJlc3MsCisgKiAgIElOIFVMT05HICBWYWx1ZSk7CisgKi8KKyNkZWZpbmUgUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NMb3coUGh5c2ljYWxBZGRyZXNzLCBWYWx1ZSkJXAorCQkJUGh5c2ljYWxBZGRyZXNzID0gVmFsdWU7CisKKy8qCisgKiBWT0lECisgKiBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0hpZ2goCisgKiAgIElOIE5ESVNfUEhZU0lDQUxfQUREUkVTUyAgUGh5c2ljYWxBZGRyZXNzLAorICogICBJTiBVTE9ORyAgVmFsdWUpOworICovCisjZGVmaW5lIFJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaChQaHlzaWNhbEFkZHJlc3MsIFZhbHVlKQorCisKKy8vQ09OVEFJTklOR19SRUNPUkQocEVudHJ5LCBORElTX1BBQ0tFVCwgTWluaXBvcnRSZXNlcnZlZEV4KTsKKyNkZWZpbmUgUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBFbnRyeSkgXAorCShQTkRJU19QQUNLRVQpKHBFbnRyeSkKKworI2RlZmluZSBQQUNLRVRfVE9fUVVFVUVfRU5UUlkocFBhY2tldCkgXAorCShQUVVFVUVfRU5UUlkpKHBQYWNrZXQpCisKKworI2lmbmRlZiBDT05UQUlOSU5HX1JFQ09SRAorI2RlZmluZSBDT05UQUlOSU5HX1JFQ09SRChhZGRyZXNzLCB0eXBlLCBmaWVsZCkJCQlcCisoKHR5cGUgKikoKFBDSEFSKShhZGRyZXNzKSAtIG9mZnNldG9mKHR5cGUsIGZpZWxkKSkpCisjZW5kaWYKKworCisjZGVmaW5lIFJFTEVBU0VfTkRJU19QQUNLRVQoX3BBZCwgX3BQYWNrZXQsIF9TdGF0dXMpICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFJUTVBGcmVlTmRpc1BhY2tldChfcEFkLCBfcFBhY2tldCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSBTV0lUQ0hfUGh5QUIoX3BBQSwgX3BCQikgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBVTE9ORwlBQUJhc2VQYUhpZ2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVMT05HCUFBQmFzZVBhTG93OyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBVTE9ORwlCQkJhc2VQYUhpZ2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVMT05HCUJCQmFzZVBhTG93OyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCQkJhc2VQYUhpZ2ggPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2goX3BCQik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCQkJhc2VQYUxvdyA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KF9wQkIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQUFCYXNlUGFIaWdoID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NIaWdoKF9wQUEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQUFCYXNlUGFMb3cgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhfcEFBKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaChfcEFBLCBCQkJhc2VQYUhpZ2gpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NMb3coX3BBQSwgQkJCYXNlUGFMb3cpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NIaWdoKF9wQkIsIEFBQmFzZVBhSGlnaCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdyhfcEJCLCBBQUJhc2VQYUxvdyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIE5kaXNXcml0ZUVycm9yTG9nRW50cnkoX2EsIF9iLCBfYywgX2QpCisjZGVmaW5lIE5kaXNNQWxsb2NhdGVNYXBSZWdpc3RlcnMoX2EsIF9iLCBfYywgX2QsIF9lKQkJTkRJU19TVEFUVVNfU1VDQ0VTUworCisKKyNkZWZpbmUgTmRpc0FjcXVpcmVTcGluTG9jawkJUlRNUF9TRU1fTE9DSworI2RlZmluZSBOZGlzUmVsZWFzZVNwaW5Mb2NrCQlSVE1QX1NFTV9VTkxPQ0sKKworc3RhdGljIGlubGluZSB2b2lkIE5kaXNHZXRTeXN0ZW1VcFRpbWUoVUxPTkcgKnRpbWUpCit7CisJKnRpbWUgPSBqaWZmaWVzOworfQorCisvL3BQYWNrZXQgPSBDT05UQUlOSU5HX1JFQ09SRChwRW50cnksIE5ESVNfUEFDS0VULCBNaW5pcG9ydFJlc2VydmVkRXgpOworI2RlZmluZSBRVUVVRV9FTlRSWV9UT19QS1QocEVudHJ5KSBcCisJCSgoUE5ESVNfUEFDS0VUKSAocEVudHJ5KSkKKworaW50IHJ0Mjh4eF9wYWNrZXRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworCisKK3ZvaWQgcnRtcF9vc190aHJlYWRfaW5pdChQVUNIQVIgcFRocmVhZE5hbWUsIFBWT0lEIHBOb3RpZnkpOworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfbWFpbl9kZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfbWFpbl9kZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTNlY2VhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF9tYWluX2Rldi5jCkBAIC0wLDAgKzEsMTg2MyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICBydF9tYWluX2Rldi5jCisKKyAgICBBYnN0cmFjdDoKKyAgICBDcmVhdGUgYW5kIHJlZ2lzdGVyIG5ldHdvcmsgaW50ZXJmYWNlLgorCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJU2FtcGxlCQlNYXIvMjEvMDcJCU1lcmdlIFJUMjg3MCBhbmQgUlQyODYwIGRyaXZlcnMuCisqLworCisjaW5jbHVkZSAicnRfY29uZmlnLmgiCisKKyNkZWZpbmUgRk9SVFlfTUhaX0lOVE9MRVJBTlRfSU5URVJWQUwJKDYwKjEwMDApIC8vIDEgbWluCisKKyNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKKy8vIHJlY29yZCB3aGV0aGVyIHRoZSBjYXJkIGluIHRoZSBjYXJkIGxpc3QgaXMgdXNlZCBpbiB0aGUgY2FyZCBmaWxlCitVSU5UOCAgTUNfQ2FyZFVzZWRbTUFYX05VTV9PRl9NVUxUSVBMRV9DQVJEXTsKKy8vIHJlY29yZCB1c2VkIGNhcmQgbWFjIGFkZHJlc3MgaW4gdGhlIGNhcmQgbGlzdAorc3RhdGljIFVJTlQ4ICBNQ19DYXJkTWFjW01BWF9OVU1fT0ZfTVVMVElQTEVfQ0FSRF1bNl07CisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgVmFyaWFibGVzIFVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8vc3RhdGljIFJBTElOS19USU1FUl9TVFJVQ1QgICAgIFBlcmlvZGljVGltZXI7CisKK2NoYXIgKm1hYyA9ICIiOwkJICAgLy8gZGVmYXVsdCAwMDowMDowMDowMDowMDowMAorY2hhciAqaG9zdG5hbWUgPSAiIjsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPD0gS0VSTkVMX1ZFUlNJT04oMiw2LDEyKQorTU9EVUxFX1BBUk0gKG1hYywgInMiKTsKKyNlbHNlCittb2R1bGVfcGFyYW0gKG1hYywgY2hhcnAsIDApOworI2VuZGlmCitNT0RVTEVfUEFSTV9ERVNDIChtYWMsICJydDI4eHg6IHdpcmVsZXNzIG1hYyBhZGRyIik7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJvdG90eXBlcyBvZiBGdW5jdGlvbnMgVXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIERPVDExX05fU1VQUE9SVAorZXh0ZXJuIEJPT0xFQU4gYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9pbml0KFBSVE1QX0FEQVBURVIgcEFkLCBpbnQgbnVtKTsKK2V4dGVybiB2b2lkIGJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfcmVsZWFzZShQUlRNUF9BREFQVEVSIHBBZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCitleHRlcm4gTkRJU19TVEFUVVMgTklDTG9hZFJhdGVTd2l0Y2hpbmdQYXJhbXMoSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCisKKy8vIHB1YmxpYyBmdW5jdGlvbiBwcm90b3R5cGUKK0lOVCBfX2RldmluaXQgcnQyOHh4X3Byb2JlKElOIHZvaWQgKl9kZXZfcCwgSU4gdm9pZCAqX2Rldl9pZF9wLAorCQkJCQkJCUlOIFVJTlQgYXJnYywgT1VUIFBSVE1QX0FEQVBURVIgKnBwQWQpOworCisvLyBwcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZQorc3RhdGljIGludCBydDI4eHhfaW5pdChJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CitJTlQgcnQyOHh4X3NlbmRfcGFja2V0cyhJTiBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX3AsIElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8PSAweDIwNDAyCS8vIFJlZCBIYXQgNy4xCitzdHJ1Y3QgbmV0X2RldmljZSAqYWxsb2NfbmV0ZGV2KAorCWludCBzaXplb2ZfcHJpdiwKKwljb25zdCBjaGFyICptYXNrLAorCXZvaWQgKCpzZXR1cCkoc3RydWN0IG5ldF9kZXZpY2UgKikpOworI2VuZGlmIC8vIExJTlVYX1ZFUlNJT05fQ09ERSAvLworCitzdGF0aWMgdm9pZCBDZmdJbml0SG9vayhQUlRNUF9BREFQVEVSIHBBZCk7CisvL3N0YXRpYyBCT09MRUFOIFJUMjhYWEF2YWlsUkFOYW1lQXNzaWduKElOIENIQVIgKm5hbWVfcCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK2V4dGVybgljb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgcnQyOHh4X2l3X2hhbmRsZXJfZGVmOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWYgV0lSRUxFU1NfRVhUID49IDEyCisvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW4gcXVlcnkgL3Byb2MKK3N0cnVjdCBpd19zdGF0aXN0aWNzICpydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzKAorICAgIElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKKyNlbmRpZgorCitzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqUlQyOHh4X2dldF9ldGhlcl9zdGF0cygKKyAgICBJTiAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIENsb3NlIHJheHggaW50ZXJmYWNlLgorCitBcmd1bWVudHM6CisJKm5ldF9kZXYJCQl0aGUgcmF4eCBpbnRlcmZhY2UgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisgICAgMAkJCQkJT3BlbiBPSworCW90aGVyd2lzZQkJCU9wZW4gRmFpbAorCitOb3RlOgorCTEuIGlmIG9wZW4gZmFpbCwga2VybmVsIHdpbGwgbm90IGNhbGwgdGhlIGNsb3NlIGZ1bmN0aW9uLgorCTIuIEZyZWUgbWVtb3J5IGZvcgorCQkoMSkgTWxtZSBNZW1vcnkgSGFuZGxlcjoJCU1sbWVIYWx0KCkKKwkJKDIpIFRYICYgUlg6CQkJCQlSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KCkKKwkJKDMpIEJBIFJlb3JkZXJpbmc6IAkJCQliYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2UoKQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IE1haW5WaXJ0dWFsSUZfY2xvc2UoSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisgICAgUlRNUF9BREFQVEVSICpwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCisJLy8gU2FuaXR5IGNoZWNrIGZvciBwQWQKKwlpZiAocEFkID09IE5VTEwpCisJCXJldHVybiAwOyAvLyBjbG9zZSBvaworCisJbmV0aWZfY2Fycmllcl9vZmYocEFkLT5uZXRfZGV2KTsKKwluZXRpZl9zdG9wX3F1ZXVlKHBBZC0+bmV0X2Rldik7CisKKworCisJVklSVFVBTF9JRl9ET1dOKHBBZCk7CisKKwlSVF9NT0RfREVDX1VTRV9DT1VOVCgpOworCisJcmV0dXJuIDA7IC8vIGNsb3NlIG9rCit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgT3BlbiByYXh4IGludGVyZmFjZS4KKworQXJndW1lbnRzOgorCSpuZXRfZGV2CQkJdGhlIHJheHggaW50ZXJmYWNlIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorICAgIDAJCQkJCU9wZW4gT0sKKwlvdGhlcndpc2UJCQlPcGVuIEZhaWwKKworTm90ZToKKwkxLiBpZiBvcGVuIGZhaWwsIGtlcm5lbCB3aWxsIG5vdCBjYWxsIHRoZSBjbG9zZSBmdW5jdGlvbi4KKwkyLiBGcmVlIG1lbW9yeSBmb3IKKwkJKDEpIE1sbWUgTWVtb3J5IEhhbmRsZXI6CQlNbG1lSGFsdCgpCisJCSgyKSBUWCAmIFJYOgkJCQkJUlRNUEZyZWVUeFJ4UmluZ01lbW9yeSgpCisJCSgzKSBCQSBSZW9yZGVyaW5nOiAJCQkJYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9yZWxlYXNlKCkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK2ludCBNYWluVmlydHVhbElGX29wZW4oSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisgICAgUlRNUF9BREFQVEVSICpwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCisJLy8gU2FuaXR5IGNoZWNrIGZvciBwQWQKKwlpZiAocEFkID09IE5VTEwpCisJCXJldHVybiAwOyAvLyBjbG9zZSBvaworCisJaWYgKFZJUlRVQUxfSUZfVVAocEFkKSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwkvLyBpbmNyZWFzZSBNT0RVTEUgdXNlIGNvdW50CisJUlRfTU9EX0lOQ19VU0VfQ09VTlQoKTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldF9kZXYpOworCW5ldGlmX2NhcnJpZXJfb24obmV0X2Rldik7CisJbmV0aWZfd2FrZV9xdWV1ZShuZXRfZGV2KTsKKworCXJldHVybiAwOworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIENsb3NlIHJheHggaW50ZXJmYWNlLgorCitBcmd1bWVudHM6CisJKm5ldF9kZXYJCQl0aGUgcmF4eCBpbnRlcmZhY2UgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisgICAgMAkJCQkJT3BlbiBPSworCW90aGVyd2lzZQkJCU9wZW4gRmFpbAorCitOb3RlOgorCTEuIGlmIG9wZW4gZmFpbCwga2VybmVsIHdpbGwgbm90IGNhbGwgdGhlIGNsb3NlIGZ1bmN0aW9uLgorCTIuIEZyZWUgbWVtb3J5IGZvcgorCQkoMSkgTWxtZSBNZW1vcnkgSGFuZGxlcjoJCU1sbWVIYWx0KCkKKwkJKDIpIFRYICYgUlg6CQkJCQlSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KCkKKwkJKDMpIEJBIFJlb3JkZXJpbmc6IAkJCQliYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2UoKQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IHJ0Mjh4eF9jbG9zZShJTiBQTkVUX0RFViBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKiBuZXRfZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2OworICAgIFJUTVBfQURBUFRFUgkqcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKwlCT09MRUFOIAkJQ2FuY2VsbGVkID0gRkFMU0U7CisJVUlOVDMyCQkJaSA9IDA7CisjaWZkZWYgUlQyODcwCisJREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQodW5saW5rX3dha2V1cCk7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwkvL1JUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFTU9WRV9JTl9QUk9HUkVTUyk7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnQyOHh4X2Nsb3NlXG4iKSk7CisKKwkvLyBTYW5pdHkgY2hlY2sgZm9yIHBBZAorCWlmIChwQWQgPT0gTlVMTCkKKwkJcmV0dXJuIDA7IC8vIGNsb3NlIG9rCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCisJCS8vIElmIGRpcnZlciBkb2Vzbid0IHdha2UgdXAgZmlybXdhcmUgaGVyZSwKKwkJLy8gTklDTG9hZEZpcm13YXJlIHdpbGwgaGFuZyBmb3JldmVyIHdoZW4gaW50ZXJmYWNlIGlzIHVwIGFnYWluLgorCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKyAgICAgICAgeworCQkgICAgQXNpY0ZvcmNlV2FrZXVwKHBBZCwgVFJVRSk7CisgICAgICAgIH0KKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkvLyBzZW5kIERMUy1URUFSX0RPV04gbWVzc2FnZSwKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQorCQl7CisJCQlVQ0hBUiBpOworCisJCQkvLyB0ZWFyIGRvd24gbG9jYWwgZGxzIHRhYmxlIGVudHJ5CisJCQlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCisJCQl7CisJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkpCisJCQkJeworCQkJCQlSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJfQorCQkJfQorCisJCQkvLyB0ZWFyIGRvd24gcGVlciBkbHMgdGFibGUgZW50cnkKKwkJCWZvciAoaT1NQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJCQl7CisJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkpCisJCQkJeworCQkJCQlSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX05PTkU7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJfQorCQkJfQorCQkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCQl9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKwkJaWYgKElORlJBX09OKHBBZCkgJiYKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKKwkJeworCQkJTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUCURpc1JlcTsKKwkJCU1MTUVfUVVFVUVfRUxFTSAqTXNnRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOworCisJCQlDT1BZX01BQ19BRERSKERpc1JlcS5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQlEaXNSZXEuUmVhc29uID0gIFJFQVNPTl9ERUFVVEhfU1RBX0xFQVZJTkc7CisKKwkJCU1zZ0VsZW0tPk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOworCQkJTXNnRWxlbS0+TXNnVHlwZSA9IE1UMl9NTE1FX0RJU0FTU09DX1JFUTsKKwkJCU1zZ0VsZW0tPk1zZ0xlbiA9IHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpOworCQkJTmRpc01vdmVNZW1vcnkoTXNnRWxlbS0+TXNnLCAmRGlzUmVxLCBzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSk7CisKKwkJCS8vIFByZXZlbnQgdG8gY29ubmVjdCBBUCBhZ2FpbiBpbiBTVEFNbG1lUGVyaW9kaWNFeGVjCisJCQlwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW49IDMyOworCQkJTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pOworCisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9ESVNBU1NPQzsKKwkJCU1sbWVEaXNhc3NvY1JlcUFjdGlvbihwQWQsIE1zZ0VsZW0pOworCQkJa2ZyZWUoTXNnRWxlbSk7CisKKwkJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJCX0KKworI2lmZGVmIFJUMjg3MAorCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFTU9WRV9JTl9QUk9HUkVTUyk7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKyNpZmRlZiBDQ1hfU1VQUE9SVAorCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkxlYXBBdXRoVGltZXIsICZDYW5jZWxsZWQpOworI2VuZGlmCisKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lciwgJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuV3BhRGlzYXNzb2NBbmRCbG9ja0Fzc29jVGltZXIsICZDYW5jZWxsZWQpOworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2lmbmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQl7CisJCQl1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisJCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IHRvIHdwYV9zdXBwbGljYW50IGZvciBpbmZyb21pbmcgaW50ZXJmYWNlIGRvd24uCisJCQltZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisJCQl3cnF1LmRhdGEuZmxhZ3MgPSBSVF9JTlRFUkZBQ0VfRE9XTjsKKwkJCXdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgTlVMTCk7CisJCX0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCQlNbG1lUmFkaW9PZmYocEFkKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKTsKKworCWZvciAoaSA9IDAgOyBpIDwgTlVNX09GX1RYX1JJTkc7IGkrKykKKwl7CisJCXdoaWxlIChwQWQtPkRlUXVldWVSdW5uaW5nW2ldID09IFRSVUUpCisJCXsKKwkJCXByaW50aygiV2FpdGluZyBmb3IgVHhRdWV1ZVslZF0gZG9uZS4uLi4uLi4uLi5cbiIsIGkpOworCQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKwkJfQorCX0KKworI2lmZGVmIFJUMjg3MAorCS8vIGVuc3VyZSB0aGVyZSBhcmUgbm8gbW9yZSBhY3RpdmUgdXJicy4KKwlhZGRfd2FpdF9xdWV1ZSAoJnVubGlua193YWtldXAsICZ3YWl0KTsKKwlwQWQtPndhaXQgPSAmdW5saW5rX3dha2V1cDsKKworCS8vIG1heWJlIHdhaXQgZm9yIGRlbGV0aW9ucyB0byBmaW5pc2guCisJaSA9IDA7CisJLy93aGlsZSgoaSA8IDI1KSAmJiBhdG9taWNfcmVhZCgmcEFkLT5QZW5kaW5nUngpID4gMCkKKwl3aGlsZShpIDwgMjUpCisJeworCQl1bnNpZ25lZCBsb25nIElycUZsYWdzOworCisJCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOworCQlpZiAocEFkLT5QZW5kaW5nUnggPT0gMCkKKwkJeworCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKwkJCWJyZWFrOworCQl9CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsOSkKKwkJbXNsZWVwKFVOTElOS19USU1FT1VUX01TKTsJLy9UaW1lIGluIG1pbGxpc2Vjb25kCisjZWxzZQorCQlSVE1QdXNlY0RlbGF5KFVOTElOS19USU1FT1VUX01TKjEwMDApOwkvL1RpbWUgaW4gbWljcm9zZWNvbmQKKyNlbmRpZgorCQlpKys7CisJfQorCXBBZC0+d2FpdCA9IE5VTEw7CisJcmVtb3ZlX3dhaXRfcXVldWUgKCZ1bmxpbmtfd2FrZXVwLCAmd2FpdCk7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwkvL1JUVVNCQ2xlYW5VcE1MTUVXYWl0UXVldWUocEFkKTsJLypub3QgdXNlZCBpbiBSVDI4eHgqLworCisKKyNpZmRlZiBSVDI4NzAKKwkvLyBXZSBuZWVkIGNsZWFyIHRpbWVyUSByZWxhdGVkIHN0cnVjdHVyZSBiZWZvcmUgZXhpdHMgb2YgdGhlIHRpbWVyIHRocmVhZC4KKwlSVDI4NzBfVGltZXJRX0V4aXQocEFkKTsKKwkvLyBDbG9zZSBrZXJuZWwgdGhyZWFkcyBvciB0YXNrbGV0cworCVJUMjh4eFRocmVhZFRlcm1pbmF0ZShwQWQpOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisJLy8gU3RvcCBNbG1lIHN0YXRlIG1hY2hpbmUKKwlNbG1lSGFsdChwQWQpOworCisJLy8gQ2xvc2Uga2VybmVsIHRocmVhZHMgb3IgdGFza2xldHMKKwlraWxsX3RocmVhZF90YXNrKHBBZCk7CisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlNYWNUYWJsZVJlc2V0KHBBZCk7CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKKwlNZWFzdXJlUmVxVGFiRXhpdChwQWQpOworCVRwY1JlcVRhYkV4aXQocEFkKTsKKworCisKKworCS8vIEZyZWUgUmluZyBvciBVU0IgYnVmZmVycworCVJUTVBGcmVlVHhSeFJpbmdNZW1vcnkocEFkKTsKKworCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkvLyBGcmVlIEJBIHJlb3JkZXIgcmVzb3VyY2UKKwliYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2UocEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2lmZGVmIFJUMjg3MAorI2lmZGVmIElORl9BTUFaT05fU0UKKwlpZiAocEFkLT5Vc2JWZW5kb3JSZXFCdWYpCisJCW9zX2ZyZWVfbWVtKHBBZCwgcEFkLT5Vc2JWZW5kb3JSZXFCdWYpOworI2VuZGlmIC8vIElORl9BTUFaT05fU0UgLy8KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfU1RBUlRfVVApOworCisJcmV0dXJuIDA7IC8vIGNsb3NlIG9rCit9IC8qIEVuZCBvZiBydDI4eHhfY2xvc2UgKi8KKworc3RhdGljIGludCBydDI4eHhfaW5pdChJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlQUlRNUF9BREFQVEVSIAkJCXBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisJVUlOVAkJCQkJaW5kZXg7CisJVUNIQVIJCQkJCVRtcFBoeTsKKwlORElTX1NUQVRVUwkJCQlTdGF0dXM7CisJVUlOVDMyIAkJTWFjQ3NyMCA9IDA7CisKKyNpZmRlZiBSVDI4NzAKKyNpZmRlZiBJTkZfQU1BWk9OX1NFCisJaW5pdF9NVVRFWCgmKHBBZC0+VXNiVmVuZG9yUmVxX3NlbWFwaG9yZSkpOworCW9zX2FsbG9jX21lbShwQWQsIChQVUNIQVIpJnBBZC0+VXNiVmVuZG9yUmVxQnVmLCBNQVhfUEFSQU1fQlVGRkVSX1NJWkUgLSAxKTsKKwlpZiAocEFkLT5Vc2JWZW5kb3JSZXFCdWYgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFsbG9jYXRlIHZlbmRvciByZXF1ZXN0IHRlbXAgYnVmZmVyIGZhaWxlZCFcbiIpKTsKKwkJZ290byBlcnIwOworCX0KKyNlbmRpZiAvLyBJTkZfQU1BWk9OX1NFIC8vCisjZW5kaWYgLy8gUlQyODcwIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkvLyBBbGxvY2F0ZSBCQSBSZW9yZGVyaW5nIG1lbW9yeQorCWJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfaW5pdChwQWQsIE1BWF9SRU9SREVSSU5HX01QRFVfTlVNKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCS8vIE1ha2Ugc3VyZSBNQUMgZ2V0cyByZWFkeS4KKwlpbmRleCA9IDA7CisJZG8KKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX0NTUjAsICZNYWNDc3IwKTsKKwkJcEFkLT5NQUNWZXJzaW9uID0gTWFjQ3NyMDsKKworCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAhPSAweDAwKSAmJiAocEFkLT5NQUNWZXJzaW9uICE9IDB4RkZGRkZGRkYpKQorCQkJYnJlYWs7CisKKwkJUlRNUHVzZWNEZWxheSgxMCk7CisJfSB3aGlsZSAoaW5kZXgrKyA8IDEwMCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNQUNfQ1NSMCAgWyBWZXI6UmV2PTB4JTA4eF1cbiIsIHBBZC0+TUFDVmVyc2lvbikpOworCisJLy8gRGlzYWJsZSBETUEKKwlSVDI4WFhETUFEaXNhYmxlKHBBZCk7CisKKworCS8vIExvYWQgODA1MSBmaXJtd2FyZQorCVN0YXR1cyA9IE5JQ0xvYWRGaXJtd2FyZShwQWQpOworCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UX0VSUigoIk5JQ0xvYWRGaXJtd2FyZSBmYWlsZWQsIFN0YXR1c1s9MHglMDh4XVxuIiwgU3RhdHVzKSk7CisJCWdvdG8gZXJyMTsKKwl9CisKKwlOSUNMb2FkUmF0ZVN3aXRjaGluZ1BhcmFtcyhwQWQpOworCisJLy8gRGlzYWJsZSBpbnRlcnJ1cHRzIGhlcmUgd2hpY2ggaXMgYXMgc29vbiBhcyBwb3NzaWJsZQorCS8vIFRoaXMgc3RhdGVtZW50IHNob3VsZCBuZXZlciBiZSB0cnVlLiBXZSBtaWdodCBjb25zaWRlciB0byByZW1vdmUgaXQgbGF0ZXIKKworCVN0YXR1cyA9IFJUTVBBbGxvY1R4UnhSaW5nTWVtb3J5KHBBZCk7CisJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlRfRVJSKCgiUlRNUEFsbG9jRE1BTWVtb3J5IGZhaWxlZCwgU3RhdHVzWz0weCUwOHhdXG4iLCBTdGF0dXMpKTsKKwkJZ290byBlcnIxOworCX0KKworCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpOworCisJLy8gaW5pdGlhbGl6ZSBNTE1FCisJLy8KKworCVN0YXR1cyA9IE1sbWVJbml0KHBBZCk7CisJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlRfRVJSKCgiTWxtZUluaXQgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsIFN0YXR1cykpOworCQlnb3RvIGVycjI7CisJfQorCisJLy8gSW5pdGlhbGl6ZSBwQWQtPlN0YUNmZywgcEFkLT5BcENmZywgcEFkLT5Db21tb25DZmcgdG8gbWFudWZhY3R1cmUgZGVmYXVsdAorCS8vCisJVXNlckNmZ0luaXQocEFkKTsKKworI2lmZGVmIFJUMjg3MAorCS8vIFdlIG5lZWQgaW5pdCB0aW1lclEgcmVsYXRlZCBzdHJ1Y3R1cmUgYmVmb3JlIGNyZWF0ZSB0aGUgdGltZXIgdGhyZWFkLgorCVJUMjg3MF9UaW1lclFfSW5pdChwQWQpOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisJUlQyOFhYX1RBU0tfVEhSRUFEX0lOSVQocEFkLCBTdGF0dXMpOworCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJZ290byBlcnIxOworCisvLwlDT1BZX01BQ19BRERSKHBBZC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5Cc3NpZCwgbmV0aWYtPmh3YWRkcik7CisvLwlwQWQtPmJGb3JjZVByaW50VFggPSBUUlVFOworCisJQ2ZnSW5pdEhvb2socEFkKTsKKworCisjaWZkZWYgQkxPQ0tfTkVUX0lGCisJaW5pdGJsb2NrUXVldWVUYWIocEFkKTsKKyNlbmRpZiAvLyBCTE9DS19ORVRfSUYgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJTWVhc3VyZVJlcVRhYkluaXQocEFkKTsKKwlUcGNSZXFUYWJJbml0KHBBZCk7CisKKwkvLworCS8vIEluaXQgdGhlIGhhcmR3YXJlLCB3ZSBuZWVkIHRvIGluaXQgYXNpYyBiZWZvcmUgcmVhZCByZWdpc3RyeSwgb3RoZXJ3aXNlIG1hYyByZWdpc3RlciB3aWxsIGJlIHJlc2V0CisJLy8KKwlTdGF0dXMgPSBOSUNJbml0aWFsaXplQWRhcHRlcihwQWQsIFRSVUUpOworCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UX0VSUigoIk5JQ0luaXRpYWxpemVBZGFwdGVyIGZhaWxlZCwgU3RhdHVzWz0weCUwOHhdXG4iLCBTdGF0dXMpKTsKKwkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQlnb3RvIGVycjM7CisJfQorCisJLy8gUmVhZCBwYXJhbWV0ZXJzIGZyb20gQ29uZmlnIEZpbGUKKwlTdGF0dXMgPSBSVE1QUmVhZFBhcmFtZXRlcnNIb29rKHBBZCk7CisKKwlwcmludGsoIjEuIFBoeSBNb2RlID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpOworCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UX0VSUigoIk5JQ1JlYWRSZWdQYXJhbWV0ZXJzIGZhaWxlZCwgU3RhdHVzWz0weCUwOHhdXG4iLFN0YXR1cykpOworCQlnb3RvIGVycjQ7CisJfQorCisjaWZkZWYgUlQyODcwCisJcEFkLT5Db21tb25DZmcuYk11bHRpcGxlSVJQID0gRkFMU0U7CisKKwlpZiAocEFkLT5Db21tb25DZmcuYk11bHRpcGxlSVJQKQorCQlwQWQtPkNvbW1vbkNmZy5OdW1PZkJ1bGtJbklSUCA9IFJYX1JJTkdfU0laRTsKKwllbHNlCisJCXBBZC0+Q29tbW9uQ2ZnLk51bU9mQnVsa0luSVJQID0gMTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCisgICAJLy9Jbml0IEJhIENhcGFiaWxpdHkgcGFyYW1ldGVycy4KKy8vCVJUMjhYWF9CQV9JTklUKHBBZCk7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5ID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eTsKKwlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUgPSAoVVNIT1JUKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZTsKKwlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVTaXplOworCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHMgPSAoVVNIT1JUKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZTsKKwkvLyBVUGRhdGEgdG8gSFQgSUUKKwlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QcyA9IChVU0hPUlQpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlOworCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVTaXplOworCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHkgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5OworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJLy8gYWZ0ZXIgcmVhZGluZyBSZWdpc3RyeSwgd2Ugbm93IGtub3cgaWYgaW4gQVAgbW9kZSBvciBTVEEgbW9kZQorCisJLy8gTG9hZCA4MDUxIGZpcm13YXJlOyBjcmFzaCB3aGVuIEZXIGltYWdlIG5vdCBleGlzdGVudAorCS8vIFN0YXR1cyA9IE5JQ0xvYWRGaXJtd2FyZShwQWQpOworCS8vIGlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkvLyAgICBicmVhazsKKworCXByaW50aygiMi4gUGh5IE1vZGUgPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSk7CisKKwkvLyBXZSBzaG91bGQgcmVhZCBFRVBST00gZm9yIGFsbCBjYXNlcy4gIHJ0Mjg2MGIKKwlOSUNSZWFkRUVQUk9NUGFyYW1ldGVycyhwQWQsIG1hYyk7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlwcmludGsoIjMuIFBoeSBNb2RlID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpOworCisJTklDSW5pdEFzaWNGcm9tRUVQUk9NKHBBZCk7IC8vcnQyODYwYgorCisJLy8gU2V0IFBIWSB0byBhcHByb3ByaWF0ZSBtb2RlCisJVG1wUGh5ID0gcEFkLT5Db21tb25DZmcuUGh5TW9kZTsKKwlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gMHhmZjsKKwlSVE1QU2V0UGh5TW9kZShwQWQsIFRtcFBoeSk7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJU2V0Q29tbW9uSFQocEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCS8vIE5vIHZhbGlkIGNoYW5uZWxzLgorCWlmIChwQWQtPkNoYW5uZWxMaXN0TnVtID09IDApCisJeworCQlwcmludGsoIldyb25nIGNvbmZpZ3VyYXRpb24uIE5vIHZhbGlkIGNoYW5uZWwgZm91bmQuIENoZWNrIFwiQ29udHJ5Q29kZVwiIGFuZCBcIkNoYW5uZWxHZW9ncmFwaHlcIiBzZXR0aW5nLlxuIik7CisJCWdvdG8gZXJyNDsKKwl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlwcmludGsoIk1DUyBTZXQgPSAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0sCisgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0sIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMl0sCisgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbM10sIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbNF0pOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjaWZkZWYgUlQyODcwCisgICAgLy9Jbml0IFJUMzB4eCBSRlJlZ2lzdGVycyBhZnRlciByZWFkIFJGSUMgdHlwZSBmcm9tIEVFUFJPTQorCU5JQ0luaXRSVDMweHhSRlJlZ2lzdGVycyhwQWQpOworI2VuZGlmIC8vIFJUMjg3MCAvLworCisjaWYgMAorCS8vIFBhdGNoIGNhcmRidXMgY29udHJvbGxlciBpZiBFRVBST00gc2FpZCBzby4KKwlpZiAocEFkLT5iVGVzdDEgPT0gRkFMU0UpCisJCVJUTVBQYXRjaENhcmRCdXMocEFkKTsKKyNlbmRpZgorCisKKy8vCQlBUEluaXRpYWxpemUocEFkKTsKKworI2lmZGVmIElLQU5PU19WWF8xWDAKKwlWUl9JS0FOT1NfRlBfSW5pdChwQWQtPkFwQ2ZnLkJzc2lkTnVtLCBwQWQtPlBlcm1hbmVudEFkZHJlc3MpOworI2VuZGlmIC8vIElLQU5PU19WWF8xWDAgLy8KKworCQkvLworCS8vIEluaXRpYWxpemUgUkYgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQorCS8vCisJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisKKwkvLyA4MDUxIGZpcm13YXJlIHJlcXVpcmUgdGhlIHNpZ25hbCBkdXJpbmcgYm9vdGluZyB0aW1lLgorCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg3MiwgMHhGRiwgMHgwMCwgMHgwMCk7CisKKwlpZiAocEFkICYmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykpCisJeworCQkvLworCQkvLyBVbmRvIGV2ZXJ5dGhpbmcgaWYgaXQgZmFpbGVkCisJCS8vCisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJCXsKKy8vCQkJTmRpc01EZXJlZ2lzdGVySW50ZXJydXB0KCZwQWQtPkludGVycnVwdCk7CisJCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpOworCQl9CisvLwkJUlRNUEZyZWVBZGFwdGVyKHBBZCk7IC8vIHdlIHdpbGwgZnJlZSBpdCBpbiBkaXNjb25uZWN0KCkKKwl9CisJZWxzZSBpZiAocEFkKQorCXsKKwkJLy8gTWljcm9zb2Z0IEhDVCByZXF1aXJlIGRyaXZlciBzZW5kIGEgZGlzY29ubmVjdCBldmVudCBhZnRlciBkcml2ZXIgaW5pdGlhbGl6YXRpb24uCisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisvLwkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKKwkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTUVESUFfU1RBVEVfQ0hBTkdFKTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJORElTX1NUQVRVU19NRURJQV9ESVNDT05ORUNUIEV2ZW50IEIhXG4iKSk7CisKKworI2lmZGVmIFJUMjg3MAorCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKTsKKwkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRU1PVkVfSU5fUFJPR1JFU1MpOworCisJCS8vCisJCS8vIFN1cHBvcnQgbXVsdGlwbGUgQnVsa0luIElSUCwKKwkJLy8gdGhlIHZhbHVlIG9uIHBBZC0+Q29tbW9uQ2ZnLk51bU9mQnVsa0luSVJQIG1heSBiZSBsYXJnZSB0aGFuIDEuCisJCS8vCisJCWZvcihpbmRleD0wOyBpbmRleDxwQWQtPkNvbW1vbkNmZy5OdW1PZkJ1bGtJbklSUDsgaW5kZXgrKykKKwkJeworCQkJUlRVU0JCdWxrUmVjZWl2ZShwQWQpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRVU0JCdWxrUmVjZWl2ZSFcbiIgKSk7CisJCX0KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwl9Ly8gZW5kIG9mIGVsc2UKKworCisJREJHUFJJTlRfUyhTdGF0dXMsICgiPD09PT0gUlRNUEluaXRpYWxpemUsIFN0YXR1cz0leFxuIiwgU3RhdHVzKSk7CisKKwlyZXR1cm4gVFJVRTsKKworCitlcnI0OgorZXJyMzoKKwlNbG1lSGFsdChwQWQpOworZXJyMjoKKwlSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KHBBZCk7CisvLwlSVE1QRnJlZUFkYXB0ZXIocEFkKTsKK2VycjE6CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlvc19mcmVlX21lbShwQWQsIHBBZC0+bXBkdV9ibGtfcG9vbC5tZW0pOyAvLyBmcmVlIEJBIHBvb2wKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwlSVDI4WFhfSVJRX1JFTEVBU0UobmV0X2Rldik7CisKKwkvLyBzaGFsbCBub3Qgc2V0IG1sX3ByaXYgdG8gTlVMTCBoZXJlIGJlY2F1c2UgdGhlIG1sX3ByaXYgZGlkbid0IGJlZW4gZnJlZSB5ZXQuCisJLy9uZXRfZGV2LT5tbF9wcml2ID0gMDsKKyNpZmRlZiBJTkZfQU1BWk9OX1NFCitlcnIwOgorI2VuZGlmIC8vIElORl9BTUFaT05fU0UgLy8KKwlwcmludGsoIiEhISAlcyBJbml0aWFsaXplZCBmYWlsICEhIVxuIiwgUlQyOHh4X0NISVBfTkFNRSk7CisJcmV0dXJuIEZBTFNFOworfSAvKiBFbmQgb2YgcnQyOHh4X2luaXQgKi8KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIE9wZW4gcmF4eCBpbnRlcmZhY2UuCisKK0FyZ3VtZW50czoKKwkqbmV0X2RldgkJCXRoZSByYXh4IGludGVyZmFjZSBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKyAgICAwCQkJCQlPcGVuIE9LCisJb3RoZXJ3aXNlCQkJT3BlbiBGYWlsCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitpbnQgcnQyOHh4X29wZW4oSU4gUE5FVF9ERVYgZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICogbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldjsKKwlQUlRNUF9BREFQVEVSIHBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisJaW50IHJldHZhbCA9IDA7CisgCVBPU19DT09LSUUgcE9iajsKKworCisJLy8gU2FuaXR5IGNoZWNrIGZvciBwQWQKKwlpZiAocEFkID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC0xOworCX0KKworI2lmZGVmIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUCisJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkKKwl7CisJCUNXX01BWF9JTl9CSVRTID0gNjsKKwl9CisJZWxzZSBpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKKwl7CisJCUNXX01BWF9JTl9CSVRTID0gMTA7CisJfQorCisjaWYgV0lSRUxFU1NfRVhUID49IDEyCisJaWYgKG5ldF9kZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX0FQKQorCQkJbmV0X2Rldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAoc3RydWN0IGl3X2hhbmRsZXJfZGVmICopICZydDI4eHhfYXBfaXdfaGFuZGxlcl9kZWY7CisJCWVsc2UgaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCisJCQluZXRfZGV2LT53aXJlbGVzc19oYW5kbGVycyA9IChzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgKikgJnJ0Mjh4eF9pd19oYW5kbGVyX2RlZjsKKwl9CisjZW5kaWYgLy8gV0lSRUxFU1NfRVhUID49IDEyIC8vCisjZW5kaWYgLy8gQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8gSW5pdAorIAlwT2JqID0gKFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7CisKKwkvLyByZXNldCBBZGFwdGVyIGZsYWdzCisJUlRNUF9DTEVBUl9GTEFHUyhwQWQpOworCisJLy8gUmVxdWVzdCBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIGZvciBQQ0kgZGV2aWNlCisJLy8gcmVnaXN0ZXIgdGhlIGludGVycnVwdCByb3V0aW5lIHdpdGggdGhlIG9zCisJUlQyOFhYX0lSUV9SRVFVRVNUKG5ldF9kZXYpOworCisKKwkvLyBJbml0IEJzc1RhYiAmIENoYW5uZWxJbmZvIHRhYmJsZXMgZm9yIGF1dG8gY2hhbm5lbCBzZWxlY3QuCisKKworCS8vIENoaXAgJiBvdGhlciBpbml0CisJaWYgKHJ0Mjh4eF9pbml0KG5ldF9kZXYpID09IEZBTFNFKQorCQlnb3RvIGVycjsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5kZXZfbmFtZSwgMTYpOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5kZXZfbmFtZSwgbmV0X2Rldi0+bmFtZSwgc3RybGVuKG5ldF9kZXYtPm5hbWUpKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwkvLyBTZXQgdXAgdGhlIE1hYyBhZGRyZXNzCisJTmRpc01vdmVNZW1vcnkobmV0X2Rldi0+ZGV2X2FkZHIsICh2b2lkICopIHBBZC0+Q3VycmVudEFkZHJlc3MsIDYpOworCisJLy8gSW5pdCBJUlEgcGFyYW1ldGVycworCVJUMjhYWF9JUlFfSU5JVChwQWQpOworCisJLy8gVmFyaW91cyBBUCBmdW5jdGlvbiBpbml0CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJCXsKKwkJCXVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKwkJCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgdG8gd3BhX3N1cHBsaWNhbnQgZm9yIGluZnJvbWluZyBpbnRlcmZhY2UgZG93bi4KKwkJCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKwkJCXdycXUuZGF0YS5mbGFncyA9IFJUX0lOVEVSRkFDRV9VUDsKKwkJCXdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgTlVMTCk7CisJCX0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIEVuYWJsZSBJbnRlcnJ1cHQKKwlSVDI4WFhfSVJRX0VOQUJMRShwQWQpOworCisJLy8gTm93IEVuYWJsZSBSeFR4CisJUlRNUEVuYWJsZVJ4VHgocEFkKTsKKwlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCk7CisKKwl7CisJVUlOVDMyIHJlZyA9IDA7CisJUlRNUF9JT19SRUFEMzIocEFkLCAweDEzMDAsICZyZWcpOyAgLy8gY2xlYXIgZ2FyYmFnZSBpbnRlcnJ1cHRzCisJcHJpbnRrKCIweDEzMDAgPSAlMDh4XG4iLCByZWcpOworCX0KKworCXsKKy8vCXUzMiByZWc7CisvLwl1OCAgYnl0ZTsKKy8vCXUxNiB0bXA7CisKKy8vCVJUTVBfSU9fUkVBRDMyKHBBZCwgWElGU19USU1FX0NGRywgJnJlZyk7CisKKy8vCXRtcCA9IDB4MDgwNTsKKy8vCXJlZyAgPSAocmVnICYgMHhmZmZmMDAwMCkgfCB0bXA7CisvLwlSVE1QX0lPX1dSSVRFMzIocEFkLCBYSUZTX1RJTUVfQ0ZHLCByZWcpOworCisJfQorCisjaWYgMAorCS8qCisJICogZGVidWdnaW5nIGhlbHBlcgorCSAqIAkJc2hvdyB0aGUgc2l6ZSBvZiBtYWluIHRhYmxlIGluIEFkYXB0ZXIgc3RydWN0dXJlCisJICoJCU1hY1RhYiAgLS0gMTg1SworCSAqCQlCQVRhYmxlIC0tIDEzN0sKKwkgKiAJCVRvdGFsIAktLSAzODVLICAhISEhISAoNS8yNi8yMDA2KQorCSAqLworCXByaW50aygic2l6ZW9mKHBBZC0+TWFjVGFiKSA9ICVsZFxuIiwgc2l6ZW9mKHBBZC0+TWFjVGFiKSk7CisJcHJpbnRrKCJzaXplb2YocEFkLT5BY2Nlc3NDb250cm9sTGlzdCkgPSAlbGRcbiIsIHNpemVvZihwQWQtPkFjY2Vzc0NvbnRyb2xMaXN0KSk7CisJcHJpbnRrKCJzaXplb2YocEFkLT5BcENmZykgPSAlbGRcbiIsIHNpemVvZihwQWQtPkFwQ2ZnKSk7CisJcHJpbnRrKCJzaXplb2YocEFkLT5CQVRhYmxlKSA9ICVsZFxuIiwgc2l6ZW9mKHBBZC0+QkFUYWJsZSkpOworCUJVRygpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCXJldHVybiAocmV0dmFsKTsKKworZXJyOgorCXJldHVybiAoLTEpOworfSAvKiBFbmQgb2YgcnQyOHh4X29wZW4gKi8KKworCisvKiBNdXN0IG5vdCBiZSBjYWxsZWQgZm9yIG1kZXYgYW5kIGFwZGV2ICovCitzdGF0aWMgTkRJU19TVEFUVVMgcnRfaWVlZTgwMjExX2lmX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIFBSVE1QX0FEQVBURVIgcEFkKQoreworCU5ESVNfU1RBVFVTIFN0YXR1czsKKwlJTlQgICAgIGk9MDsKKwlDSEFSICAgIHNsb3RfbmFtZVtJRk5BTVNJWl07CisJc3RydWN0IG5ldF9kZXZpY2UgICAqZGV2aWNlOworCisKKwkvL2V0aGVyX3NldHVwKGRldik7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBydDI4eHhfc2VuZF9wYWNrZXRzOworCisjaWZkZWYgSUtBTk9TX1ZYXzFYMAorCWRldi0+aGFyZF9zdGFydF94bWl0ID0gSUtBTk9TX0RhdGFGcmFtZXNUeDsKKyNlbmRpZiAvLyBJS0FOT1NfVlhfMVgwIC8vCisKKy8vCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gaWVlZTgwMjExX3NldF9tdWx0aWNhc3RfbGlzdDsKKy8vCWRldi0+Y2hhbmdlX210dSA9IGllZWU4MDIxMV9jaGFuZ2VfbXR1OworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmIFdJUkVMRVNTX0VYVCA+PSAxMgorCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorCXsKKwkJZGV2LT53aXJlbGVzc19oYW5kbGVycyA9ICZydDI4eHhfaXdfaGFuZGxlcl9kZWY7CisJfQorI2VuZGlmIC8vV0lSRUxFU1NfRVhUID49IDEyCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVAorI2lmIFdJUkVMRVNTX0VYVCA+PSAxMgorCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApCisJeworCQlkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gJnJ0Mjh4eF9hcF9pd19oYW5kbGVyX2RlZjsKKwl9CisjZW5kaWYgLy9XSVJFTEVTU19FWFQgPj0gMTIKKyNlbmRpZiAvLyBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVCAvLworCisjaWYgV0lSRUxFU1NfRVhUIDwgMjEKKwkJZGV2LT5nZXRfd2lyZWxlc3Nfc3RhdHMgPSBydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzOworI2VuZGlmCisJZGV2LT5nZXRfc3RhdHMgPSBSVDI4eHhfZ2V0X2V0aGVyX3N0YXRzOworCWRldi0+b3BlbiA9IE1haW5WaXJ0dWFsSUZfb3BlbjsgLy9ydDI4eHhfb3BlbjsKKwlkZXYtPnN0b3AgPSBNYWluVmlydHVhbElGX2Nsb3NlOyAvL3J0Mjh4eF9jbG9zZTsKKy8vCWRldi0+dW5pbml0ID0gaWVlZTgwMjExX2lmX3JlaW5pdDsKKy8vCWRldi0+ZGVzdHJ1Y3RvciA9IGllZWU4MDIxMV9pZl9mcmVlOworCWRldi0+cHJpdl9mbGFncyA9IElOVF9NQUlOOworCWRldi0+ZG9faW9jdGwgPSBydDI4eHhfaW9jdGw7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkKKyAgICBkZXYtPnZhbGlkYXRlX2FkZHIgPSBOVUxMOworI2VuZGlmCisJLy8gZmluZCBhdmFpbGFibGUgZGV2aWNlIG5hbWUKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCXsKKyNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKKwkJaWYgKHBBZC0+TUNfUm93SUQgPj0gMCkKKwkJCXNwcmludGYoc2xvdF9uYW1lLCAicmElMDJkXyVkIiwgcEFkLT5NQ19Sb3dJRCwgaSk7CisJCWVsc2UKKyNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KKwkJc3ByaW50ZihzbG90X25hbWUsICJyYSVkIiwgaSk7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI2KQorICAgICAgICBkZXZpY2UgPSBkZXZfZ2V0X2J5X25hbWUoZGV2X25ldChkZXYpLCBzbG90X25hbWUpOworI2Vsc2UKKyAgICAgICAgZGV2aWNlID0gZGV2X2dldF9ieV9uYW1lKGRldi0+bmRfbmV0LCBzbG90X25hbWUpOworI2VuZGlmCisjZWxzZQorCQlkZXZpY2UgPSBkZXZfZ2V0X2J5X25hbWUoc2xvdF9uYW1lKTsKKyNlbmRpZgorCQlpZiAoZGV2aWNlICE9IE5VTEwpIGRldl9wdXQoZGV2aWNlKTsKKyNlbHNlCisJCWZvciAoZGV2aWNlID0gZGV2X2Jhc2U7IGRldmljZSAhPSBOVUxMOyBkZXZpY2UgPSBkZXZpY2UtPm5leHQpCisJCXsKKwkJCWlmIChzdHJuY21wKGRldmljZS0+bmFtZSwgc2xvdF9uYW1lLCA0KSA9PSAwKQorCQkJCWJyZWFrOworCQl9CisjZW5kaWYKKwkJaWYoZGV2aWNlID09IE5VTEwpCisJCQlicmVhazsKKwl9CisKKwlpZihpID09IDgpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJObyBhdmFpbGFibGUgc2xvdCBuYW1lXG4iKSk7CisJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCWVsc2UKKwl7CisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisJCWlmIChwQWQtPk1DX1Jvd0lEID49IDApCisJICAgICAgICBzcHJpbnRmKGRldi0+bmFtZSwgInJhJTAyZF8lZCIsIHBBZC0+TUNfUm93SUQsIGkpOworCQllbHNlCisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisJCXNwcmludGYoZGV2LT5uYW1lLCAicmElZCIsIGkpOworCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCX0KKworCXJldHVybiBTdGF0dXM7CisKK30KKworCisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIEdldCBjYXJkIHByb2ZpbGUgcGF0aC4KKworQXJndW1lbnRzOgorICAgIHBBZAorCitSZXR1cm4gVmFsdWU6CisgICAgVFJVRQkJLSBGaW5kIGEgY2FyZCBwcm9maWxlCisJRkFMU0UJCS0gdXNlIGRlZmF1bHQgcHJvZmlsZQorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworZXh0ZXJuIElOVCBSVE1QR2V0S2V5UGFyYW1ldGVyKAorICAgIElOICBQQ0hBUiAgIGtleSwKKyAgICBPVVQgUENIQVIgICBkZXN0LAorICAgIElOICBJTlQgICAgIGRlc3RzaXplLAorICAgIElOICBQQ0hBUiAgIGJ1ZmZlcik7CisKK0JPT0xFQU4gUlRNUF9DYXJkSW5mb1JlYWQoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQpCit7CisjZGVmaW5lIE1DX1NFTEVDVF9DQVJESUQJCTAJLyogdXNlIENBUkQgSUQgKDAgfiAzMSkgdG8gaWRlbnRpZnkgZGlmZmVyZW50IGNhcmRzICovCisjZGVmaW5lIE1DX1NFTEVDVF9NQUMJCQkxCS8qIHVzZSBDQVJEIE1BQyB0byBpZGVudGlmeSBkaWZmZXJlbnQgY2FyZHMgKi8KKyNkZWZpbmUgTUNfU0VMRUNUX0NBUkRUWVBFCQkyCS8qIHVzZSBDQVJEIHR5cGUgKGFiZ24gb3IgYmduKSB0byBpZGVudGlmeSBkaWZmZXJlbnQgY2FyZHMgKi8KKworI2RlZmluZSBMRVRURVJfQ0FTRV9UUkFOU0xBVEUodHh0X3AsIGNhcmRfaWQpCQkJXAorCXsJVUlOVDMyIF9sZW47IGNoYXIgX2NoYXI7CQkJCQkJXAorCQlmb3IoX2xlbj0wOyBfbGVuPHN0cmxlbihjYXJkX2lkKTsgX2xlbisrKSB7CQlcCisJCQlfY2hhciA9ICoodHh0X3AgKyBfbGVuKTsJCQkJCVwKKwkJCWlmICgoJ0EnIDw9IF9jaGFyKSAmJiAoX2NoYXIgPD0gJ1onKSkJCVwKKwkJCQkqKHR4dF9wK19sZW4pID0gJ2EnKyhfY2hhci0nQScpOwkJXAorCQl9IH0KKworCXN0cnVjdCBmaWxlICpzcmNmOworCUlOVCByZXR2YWwsIG9yZ2ZzdWlkLCBvcmdmc2dpZDsKKyAgIAltbV9zZWdtZW50X3Qgb3JnZnM7CisJQ0hBUiAqYnVmZmVyLCAqdG1wYnVmLCBjYXJkX2lkX2J1ZlszMF0sIFJGSUNfd29yZFszMF07CisJQk9PTEVBTiBmbGdfbWF0Y2hfb2sgPSBGQUxTRTsKKwlJTlQzMiBjYXJkX3NlbGVjdF9tZXRob2Q7CisJSU5UMzIgY2FyZF9mcmVlX2lkLCBjYXJkX25vdXNlX2lkLCBjYXJkX3NhbWVfbWFjX2lkLCBjYXJkX21hdGNoX2lkOworCUVFUFJPTV9BTlRFTk5BX1NUUlVDIGFudGVubmE7CisJVVNIT1JUIGFkZHIwMSwgYWRkcjIzLCBhZGRyNDU7CisJVUlOVDggbWFjWzZdOworCVVJTlQzMiBkYXRhLCBjYXJkX2luZGV4OworCVVDSEFSICpzdGFydF9wdHI7CisKKworCS8vIGluaXQKKwlidWZmZXIgPSBrbWFsbG9jKE1BWF9JTklfQlVGRkVSX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKKwlpZiAoYnVmZmVyID09IE5VTEwpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworCXRtcGJ1ZiA9IGttYWxsb2MoTUFYX1BBUkFNX0JVRkZFUl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7CisJaWYodG1wYnVmID09IE5VTEwpCisJeworCQlrZnJlZShidWZmZXIpOworICAgICAgICByZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKwlvcmdmc3VpZCA9IGN1cnJlbnQtPmZzdWlkOworCW9yZ2ZzZ2lkID0gY3VycmVudC0+ZnNnaWQ7CisJY3VycmVudC0+ZnN1aWQgPSBjdXJyZW50LT5mc2dpZCA9IDA7CisgICAgb3JnZnMgPSBnZXRfZnMoKTsKKyAgICBzZXRfZnMoS0VSTkVMX0RTKTsKKworCS8vIGdldCBSRiBJQyB0eXBlCisJUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmZGF0YSk7CisKKwlpZiAoKGRhdGEgJiAweDMwKSA9PSAwKQorCQlwQWQtPkVFUFJPTUFkZHJlc3NOdW0gPSA2OwkvLyA5M0M0NgorCWVsc2UgaWYgKChkYXRhICYgMHgzMCkgPT0gMHgxMCkKKwkJcEFkLT5FRVBST01BZGRyZXNzTnVtID0gODsJLy8gOTNDNjYKKwllbHNlCisJCXBBZC0+RUVQUk9NQWRkcmVzc051bSA9IDg7CS8vIDkzQzg2CisKKwkvL2FudGVubmEud29yZCA9IFJUTVBfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9OSUMxX09GRlNFVCk7CisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTklDMV9PRkZTRVQsIGFudGVubmEud29yZCk7CisKKwlpZiAoKGFudGVubmEuZmllbGQuUmZJY1R5cGUgPT0gUkZJQ18yODUwKSB8fAorCQkoYW50ZW5uYS5maWVsZC5SZkljVHlwZSA9PSBSRklDXzI3NTApKQorCXsKKwkJLyogQUJHTiBjYXJkICovCisJCXN0cmNweShSRklDX3dvcmQsICJhYmduIik7CisJfQorCWVsc2UKKwl7CisJCS8qIEJHTiBjYXJkICovCisJCXN0cmNweShSRklDX3dvcmQsICJiZ24iKTsKKwl9CisKKwkvLyBnZXQgTUFDIGFkZHJlc3MKKwkvL2FkZHIwMSA9IFJUTVBfRUVQUk9NX1JFQUQxNihwQWQsIDB4MDQpOworCS8vYWRkcjIzID0gUlRNUF9FRVBST01fUkVBRDE2KHBBZCwgMHgwNik7CisJLy9hZGRyNDUgPSBSVE1QX0VFUFJPTV9SRUFEMTYocEFkLCAweDA4KTsKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MDQsIGFkZHIwMSk7CisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDA2LCBhZGRyMjMpOworCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHgwOCwgYWRkcjQ1KTsKKworCW1hY1swXSA9IChVQ0hBUikoYWRkcjAxICYgMHhmZik7CisJbWFjWzFdID0gKFVDSEFSKShhZGRyMDEgPj4gOCk7CisJbWFjWzJdID0gKFVDSEFSKShhZGRyMjMgJiAweGZmKTsKKwltYWNbM10gPSAoVUNIQVIpKGFkZHIyMyA+PiA4KTsKKwltYWNbNF0gPSAoVUNIQVIpKGFkZHI0NSAmIDB4ZmYpOworCW1hY1s1XSA9IChVQ0hBUikoYWRkcjQ1ID4+IDgpOworCisJLy8gb3BlbiBjYXJkIGluZm9ybWF0aW9uIGZpbGUKKwlzcmNmID0gZmlscF9vcGVuKENBUkRfSU5GT19QQVRILCBPX1JET05MWSwgMCk7CisJaWYgKElTX0VSUihzcmNmKSkKKwl7CisJCS8qIGNhcmQgaW5mb3JtYXRpb24gZmlsZSBkb2VzIG5vdCBleGlzdCAqLworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJKCItLT4gRXJyb3IgJWxkIG9wZW5pbmcgJXNcbiIsIC1QVFJfRVJSKHNyY2YpLCBDQVJEX0lORk9fUEFUSCkpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYgKHNyY2YtPmZfb3AgJiYgc3JjZi0+Zl9vcC0+cmVhZCkKKwl7CisJCS8qIGNhcmQgaW5mb3JtYXRpb24gZmlsZSBleGlzdHMgc28gcmVhZGluZyB0aGUgY2FyZCBpbmZvcm1hdGlvbiAqLworCQltZW1zZXQoYnVmZmVyLCAweDAwLCBNQVhfSU5JX0JVRkZFUl9TSVpFKTsKKwkJcmV0dmFsID0gc3JjZi0+Zl9vcC0+cmVhZChzcmNmLCBidWZmZXIsIE1BWF9JTklfQlVGRkVSX1NJWkUsICZzcmNmLT5mX3Bvcyk7CisJCWlmIChyZXR2YWwgPCAwKQorCQl7CisJCQkvKiByZWFkIGZhaWwgKi8KKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJKCItLT4gUmVhZCAlcyBlcnJvciAlZFxuIiwgQ0FSRF9JTkZPX1BBVEgsIC1yZXR2YWwpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIGdldCBjYXJkIHNlbGVjdGlvbiBtZXRob2QgKi8KKwkJCW1lbXNldCh0bXBidWYsIDB4MDAsIE1BWF9QQVJBTV9CVUZGRVJfU0laRSk7CisJCQljYXJkX3NlbGVjdF9tZXRob2QgPSBNQ19TRUxFQ1RfQ0FSRFRZUEU7IC8vIGRlZmF1bHQKKworCQkJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlNFTEVDVCIsIHRtcGJ1ZiwgMjU2LCBidWZmZXIpKQorCQkJeworCQkJCWlmIChzdHJjbXAodG1wYnVmLCAiQ0FSRElEIikgPT0gMCkKKwkJCQkJY2FyZF9zZWxlY3RfbWV0aG9kID0gTUNfU0VMRUNUX0NBUkRJRDsKKwkJCQllbHNlIGlmIChzdHJjbXAodG1wYnVmLCAiTUFDIikgPT0gMCkKKwkJCQkJY2FyZF9zZWxlY3RfbWV0aG9kID0gTUNfU0VMRUNUX01BQzsKKwkJCQllbHNlIGlmIChzdHJjbXAodG1wYnVmLCAiQ0FSRFRZUEUiKSA9PSAwKQorCQkJCQljYXJkX3NlbGVjdF9tZXRob2QgPSBNQ19TRUxFQ1RfQ0FSRFRZUEU7CisJCQl9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkoIk1DPiBDYXJkIFNlbGVjdGlvbiA9ICVkXG4iLCBjYXJkX3NlbGVjdF9tZXRob2QpKTsKKworCQkJLy8gaW5pdAorCQkJY2FyZF9mcmVlX2lkID0gLTE7CisJCQljYXJkX25vdXNlX2lkID0gLTE7CisJCQljYXJkX3NhbWVfbWFjX2lkID0gLTE7CisJCQljYXJkX21hdGNoX2lkID0gLTE7CisKKwkJCS8vIHNlYXJjaCBjdXJyZW50IGNhcmQgaW5mb3JtYXRpb24gcmVjb3JkcworCQkJZm9yKGNhcmRfaW5kZXg9MDsKKwkJCQljYXJkX2luZGV4PE1BWF9OVU1fT0ZfTVVMVElQTEVfQ0FSRDsKKwkJCQljYXJkX2luZGV4KyspCisJCQl7CisJCQkJaWYgKCgqKFVJTlQzMiAqKSZNQ19DYXJkTWFjW2NhcmRfaW5kZXhdWzBdID09IDApICYmCisJCQkJCSgqKFVJTlQxNiAqKSZNQ19DYXJkTWFjW2NhcmRfaW5kZXhdWzRdID09IDApKQorCQkJCXsKKwkJCQkJLy8gTUFDIGlzIGFsbC0wIHNvIHRoZSBlbnRyeSBpcyBhdmFpbGFibGUKKwkJCQkJTUNfQ2FyZFVzZWRbY2FyZF9pbmRleF0gPSAwOworCisJCQkJCWlmIChjYXJkX2ZyZWVfaWQgPCAwKQorCQkJCQkJY2FyZF9mcmVlX2lkID0gY2FyZF9pbmRleDsgLy8gMXN0IGZyZWUgZW50cnkKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJaWYgKG1lbWNtcChNQ19DYXJkTWFjW2NhcmRfaW5kZXhdLCBtYWMsIDYpID09IDApCisJCQkJCXsKKwkJCQkJCS8vIHdlIGZpbmQgdGhlIGVudHJ5IHdpdGggc2FtZSBNQUMKKwkJCQkJCWlmIChjYXJkX3NhbWVfbWFjX2lkIDwgMCkKKwkJCQkJCQljYXJkX3NhbWVfbWFjX2lkID0gY2FyZF9pbmRleDsgLy8gMXN0IHNhbWUgZW50cnkKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCS8vIE1BQyBpcyBub3QgYWxsLTAgYnV0IHVzZWQgZmxhZyA9PSAwCisJCQkJCQlpZiAoKE1DX0NhcmRVc2VkW2NhcmRfaW5kZXhdID09IDApICYmCisJCQkJCQkJKGNhcmRfbm91c2VfaWQgPCAwKSkKKwkJCQkJCXsKKwkJCQkJCQljYXJkX25vdXNlX2lkID0gY2FyZF9pbmRleDsgLy8gMXN0IGF2YWlsYWJsZSBlbnRyeQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJKCJNQz4gRnJlZSA9ICVkLCBTYW1lID0gJWQsIE5PVVNFID0gJWRcbiIsCisJCQkJCWNhcmRfZnJlZV9pZCwgY2FyZF9zYW1lX21hY19pZCwgY2FyZF9ub3VzZV9pZCkpOworCisJCQlpZiAoKGNhcmRfc2FtZV9tYWNfaWQgPj0gMCkgJiYKKwkJCQkoKGNhcmRfc2VsZWN0X21ldGhvZCA9PSBNQ19TRUxFQ1RfQ0FSRElEKSB8fAorCQkJCShjYXJkX3NlbGVjdF9tZXRob2QgPT0gTUNfU0VMRUNUX0NBUkRUWVBFKSkpCisJCQl7CisJCQkJLy8gc2FtZSBNQUMgZW50cnkgaXMgZm91bmQKKwkJCQljYXJkX21hdGNoX2lkID0gY2FyZF9zYW1lX21hY19pZDsKKworCQkJCWlmIChjYXJkX3NlbGVjdF9tZXRob2QgPT0gTUNfU0VMRUNUX0NBUkRUWVBFKQorCQkJCXsKKwkJCQkJLy8gZm9yIENBUkRUWVBFCisJCQkJCXNwcmludGYoY2FyZF9pZF9idWYsICIlMDJkQ0FSRFRZUEUlcyIsCisJCQkJCQkJY2FyZF9tYXRjaF9pZCwgUkZJQ193b3JkKTsKKworCQkJCQlpZiAoKHN0YXJ0X3B0cj1ydHN0cnN0cnVuY2FzZWNtcChidWZmZXIsIGNhcmRfaWRfYnVmKSkgIT0gTlVMTCkKKwkJCQkJeworCQkJCQkJLy8gd2UgZm91bmQgdGhlIGNhcmQgSUQKKwkJCQkJCUxFVFRFUl9DQVNFX1RSQU5TTEFURShzdGFydF9wdHIsIGNhcmRfaWRfYnVmKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyB0aGUgY2FyZCBpcyAxc3QgcGx1Zy1pbiwgdHJ5IHRvIGZpbmQgdGhlIG1hdGNoIGNhcmQgcHJvZmlsZQorCQkJCXN3aXRjaChjYXJkX3NlbGVjdF9tZXRob2QpCisJCQkJeworCQkJCQljYXNlIE1DX1NFTEVDVF9DQVJESUQ6IC8vIENBUkRJRAorCQkJCQlkZWZhdWx0OgorCQkJCQkJaWYgKGNhcmRfZnJlZV9pZCA+PSAwKQorCQkJCQkJCWNhcmRfbWF0Y2hfaWQgPSBjYXJkX2ZyZWVfaWQ7CisJCQkJCQllbHNlCisJCQkJCQkJY2FyZF9tYXRjaF9pZCA9IGNhcmRfbm91c2VfaWQ7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIE1DX1NFTEVDVF9NQUM6IC8vIE1BQworCQkJCQkJc3ByaW50ZihjYXJkX2lkX2J1ZiwgIk1BQyUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiwKKwkJCQkJCQkJbWFjWzBdLCBtYWNbMV0sIG1hY1syXSwKKwkJCQkJCQkJbWFjWzNdLCBtYWNbNF0sIG1hY1s1XSk7CisKKwkJCQkJCS8qIHRyeSB0byBmaW5kIHRoZSBrZXkgd29yZCBpbiB0aGUgY2FyZCBmaWxlICovCisJCQkJCQlpZiAoKHN0YXJ0X3B0cj1ydHN0cnN0cnVuY2FzZWNtcChidWZmZXIsIGNhcmRfaWRfYnVmKSkgIT0gTlVMTCkKKwkJCQkJCXsKKwkJCQkJCQlMRVRURVJfQ0FTRV9UUkFOU0xBVEUoc3RhcnRfcHRyLCBjYXJkX2lkX2J1Zik7CisKKwkJCQkJCQkvKiBnZXQgdGhlIHJvdyBJRCAoMiBBU0NJSSBjaGFyYWN0ZXJzKSAqLworCQkJCQkJCXN0YXJ0X3B0ciAtPSAyOworCQkJCQkJCWNhcmRfaWRfYnVmWzBdID0gKihzdGFydF9wdHIpOworCQkJCQkJCWNhcmRfaWRfYnVmWzFdID0gKihzdGFydF9wdHIrMSk7CisJCQkJCQkJY2FyZF9pZF9idWZbMl0gPSAweDAwOworCisJCQkJCQkJY2FyZF9tYXRjaF9pZCA9IHNpbXBsZV9zdHJ0b2woY2FyZF9pZF9idWYsIDAsIDEwKTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgTUNfU0VMRUNUX0NBUkRUWVBFOiAvLyBDQVJEVFlQRQorCQkJCQkJY2FyZF9ub3VzZV9pZCA9IC0xOworCisJCQkJCQlmb3IoY2FyZF9pbmRleD0wOworCQkJCQkJCWNhcmRfaW5kZXg8TUFYX05VTV9PRl9NVUxUSVBMRV9DQVJEOworCQkJCQkJCWNhcmRfaW5kZXgrKykKKwkJCQkJCXsKKwkJCQkJCQlzcHJpbnRmKGNhcmRfaWRfYnVmLCAiJTAyZENBUkRUWVBFJXMiLAorCQkJCQkJCQkJY2FyZF9pbmRleCwgUkZJQ193b3JkKTsKKworCQkJCQkJCWlmICgoc3RhcnRfcHRyPXJ0c3Ryc3RydW5jYXNlY21wKGJ1ZmZlciwKKwkJCQkJCQkJCQkJCQkJY2FyZF9pZF9idWYpKSAhPSBOVUxMKQorCQkJCQkJCXsKKwkJCQkJCQkJTEVUVEVSX0NBU0VfVFJBTlNMQVRFKHN0YXJ0X3B0ciwgY2FyZF9pZF9idWYpOworCisJCQkJCQkJCWlmIChNQ19DYXJkVXNlZFtjYXJkX2luZGV4XSA9PSAwKQorCQkJCQkJCQl7CisJCQkJCQkJCQkvKiBjdXJyZW50IHRoZSBjYXJkIHByb2ZpbGUgaXMgbm90IHVzZWQgKi8KKwkJCQkJCQkJCWlmICgoKihVSU5UMzIgKikmTUNfQ2FyZE1hY1tjYXJkX2luZGV4XVswXSA9PSAwKSAmJgorCQkJCQkJCQkJCSgqKFVJTlQxNiAqKSZNQ19DYXJkTWFjW2NhcmRfaW5kZXhdWzRdID09IDApKQorCQkJCQkJCQkJeworCQkJCQkJCQkJCS8vIGZpbmQgaXQgYW5kIG5vIHByZXZpb3VzIGNhcmQgdXNlIGl0CisJCQkJCQkJCQkJY2FyZF9tYXRjaF9pZCA9IGNhcmRfaW5kZXg7CisJCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCQl9CisJCQkJCQkJCQllbHNlCisJCQkJCQkJCQl7CisJCQkJCQkJCQkJLy8gZXZlciBhIGNhcmQgdXNlIGl0CisJCQkJCQkJCQkJaWYgKGNhcmRfbm91c2VfaWQgPCAwKQorCQkJCQkJCQkJCQljYXJkX25vdXNlX2lkID0gY2FyZF9pbmRleDsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQkJLy8gaWYgbm90IGZpbmQgYSBmcmVlIG9uZSwgdXNlIHRoZSBhdmFpbGFibGUgb25lCisJCQkJCQlpZiAoY2FyZF9tYXRjaF9pZCA8IDApCisJCQkJCQkJY2FyZF9tYXRjaF9pZCA9IGNhcmRfbm91c2VfaWQ7CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChjYXJkX21hdGNoX2lkID49IDApCisJCQl7CisJCQkJLy8gbWFrZSB1cCBzZWFyY2gga2V5d29yZAorCQkJCXN3aXRjaChjYXJkX3NlbGVjdF9tZXRob2QpCisJCQkJeworCQkJCQljYXNlIE1DX1NFTEVDVF9DQVJESUQ6IC8vIENBUkRJRAorCQkJCQkJc3ByaW50ZihjYXJkX2lkX2J1ZiwgIiUwMmRDQVJESUQiLCBjYXJkX21hdGNoX2lkKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgTUNfU0VMRUNUX01BQzogLy8gTUFDCisJCQkJCQlzcHJpbnRmKGNhcmRfaWRfYnVmLAorCQkJCQkJCQkiJTAyZG1hYyUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiwKKwkJCQkJCQkJY2FyZF9tYXRjaF9pZCwKKwkJCQkJCQkJbWFjWzBdLCBtYWNbMV0sIG1hY1syXSwKKwkJCQkJCQkJbWFjWzNdLCBtYWNbNF0sIG1hY1s1XSk7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIE1DX1NFTEVDVF9DQVJEVFlQRTogLy8gQ0FSRFRZUEUKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCXNwcmludGYoY2FyZF9pZF9idWYsICIlMDJkY2FyZHR5cGUlcyIsCisJCQkJCQkJCWNhcmRfbWF0Y2hfaWQsIFJGSUNfd29yZCk7CisJCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZWFyY2ggS2V5d29yZCA9ICVzXG4iLCBjYXJkX2lkX2J1ZikpOworCisJCQkJLy8gcmVhZCBjYXJkIGZpbGUgcGF0aAorCQkJCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKGNhcmRfaWRfYnVmLCB0bXBidWYsIDI1NiwgYnVmZmVyKSkKKwkJCQl7CisJCQkJCWlmIChzdHJsZW4odG1wYnVmKSA8IHNpemVvZihwQWQtPk1DX0ZpbGVOYW1lKSkKKwkJCQkJeworCQkJCQkJLy8gYmFja3VwIGNhcmQgaW5mb3JtYXRpb24KKwkJCQkJCXBBZC0+TUNfUm93SUQgPSBjYXJkX21hdGNoX2lkOyAvKiBiYXNlIDAgKi8KKwkJCQkJCU1DX0NhcmRVc2VkW2NhcmRfbWF0Y2hfaWRdID0gMTsKKwkJCQkJCW1lbWNweShNQ19DYXJkTWFjW2NhcmRfbWF0Y2hfaWRdLCBtYWMsIHNpemVvZihtYWMpKTsKKworCQkJCQkJLy8gYmFja3VwIGNhcmQgZmlsZSBwYXRoCisJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1DX0ZpbGVOYW1lLCB0bXBidWYgLCBzdHJsZW4odG1wYnVmKSk7CisJCQkJCQlwQWQtPk1DX0ZpbGVOYW1lW3N0cmxlbih0bXBidWYpXSA9ICdcMCc7CisJCQkJCQlmbGdfbWF0Y2hfb2sgPSBUUlVFOworCisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCQkJKCJDYXJkIFByb2ZpbGUgTmFtZSA9ICVzXG4iLCBwQWQtPk1DX0ZpbGVOYW1lKSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkJCQkJKCJDYXJkIFByb2ZpbGUgTmFtZSBsZW5ndGggdG9vIGxhcmdlIVxuIikpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkJCSgiQ2FuIG5vdCBmaW5kIHNlYXJjaCBrZXkgd29yZCBpbiBjYXJkLmRhdCFcbiIpKTsKKwkJCQl9CisKKwkJCQlpZiAoKGZsZ19tYXRjaF9vayAhPSBUUlVFKSAmJgorCQkJCQkoY2FyZF9tYXRjaF9pZCA8IE1BWF9OVU1fT0ZfTVVMVElQTEVfQ0FSRCkpCisJCQkJeworCQkJCQlNQ19DYXJkVXNlZFtjYXJkX21hdGNoX2lkXSA9IDA7CisJCQkJCW1lbXNldChNQ19DYXJkTWFjW2NhcmRfbWF0Y2hfaWRdLCAwLCBzaXplb2YobWFjKSk7CisJCQkJfQorCQkJfSAvLyBpZiAoY2FyZF9tYXRjaF9pZCA+PSAwKQorCQl9CisJfQorCisJLy8gY2xvc2UgZmlsZQorCXJldHZhbCA9IGZpbHBfY2xvc2Uoc3JjZiwgTlVMTCk7CisJc2V0X2ZzKG9yZ2ZzKTsKKwljdXJyZW50LT5mc3VpZCA9IG9yZ2ZzdWlkOworCWN1cnJlbnQtPmZzZ2lkID0gb3JnZnNnaWQ7CisJa2ZyZWUoYnVmZmVyKTsKKwlrZnJlZSh0bXBidWYpOworCXJldHVybiBmbGdfbWF0Y2hfb2s7Cit9CisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBQcm9iZSBSVDI4WFggY2hpcHNldC4KKworQXJndW1lbnRzOgorICAgIF9kZXZfcAkJCQlQb2ludCB0byB0aGUgUENJIG9yIFVTQiBkZXZpY2UKKwlfZGV2X2lkX3AJCQlQb2ludCB0byB0aGUgUENJIG9yIFVTQiBkZXZpY2UgSUQKKworUmV0dXJuIFZhbHVlOgorICAgIDAJCQkJCVByb2JlIE9LCisJLUVOT0RFVgkJCQlQcm9iZSBGYWlsCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgX19kZXZpbml0ICAgcnQyOHh4X3Byb2JlKAorICAgIElOICB2b2lkICpfZGV2X3AsCisgICAgSU4gIHZvaWQgKl9kZXZfaWRfcCwKKwlJTiAgVUlOVCBhcmdjLAorCU9VVCBQUlRNUF9BREFQVEVSICpwcEFkKQoreworICAgIHN0cnVjdCAgbmV0X2RldmljZQkqbmV0X2RldjsKKyAgICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCA9IChQUlRNUF9BREFQVEVSKSBOVUxMOworICAgIElOVCAgICAgICAgICAgICAgICAgc3RhdHVzOworCVBWT0lECQkJCWhhbmRsZTsKKyNpZmRlZiBSVDI4NzAKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkJLyoga2VybmVsIDIuNCBzZXJpZXMgKi8KKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2X3AgPSAoc3RydWN0IHVzYl9kZXZpY2UgKilfZGV2X3A7CisjZWxzZQorCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gKHN0cnVjdCB1c2JfaW50ZXJmYWNlICopX2Rldl9wOworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXZfcCA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisKKwlkZXZfcCA9IHVzYl9nZXRfZGV2KGRldl9wKTsKKyNlbmRpZiAvLyBMSU5VWF9WRVJTSU9OX0NPREUgLy8KKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1RBIERyaXZlciB2ZXJzaW9uLSVzXG4iLCBTVEFfRFJJVkVSX1ZFUlNJT04pKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCS8vIENoZWNrIGNoaXBzZXQgdmVuZG9yL3Byb2R1Y3QgSUQKKy8vCWlmIChSVDI4WFhDaGlwc2V0Q2hlY2soX2Rldl9wKSA9PSBGQUxTRSkKKy8vCQlnb3RvIGVycl9vdXQ7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPD0gMHgyMDQwMiAgICAgICAvLyBSZWQgSGF0IDcuMQorICAgIG5ldF9kZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKFBSVE1QX0FEQVBURVIpLCAiZXRoJWQiLCBldGhlcl9zZXR1cCk7CisjZWxzZQorICAgIG5ldF9kZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoUFJUTVBfQURBUFRFUikpOworI2VuZGlmCisgICAgaWYgKG5ldF9kZXYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHByaW50aygiYWxsb2NfbmV0ZGV2IGZhaWxlZFxuIik7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDE1KQorCQltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKKyNlbmRpZiAvL0xJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwxNSkKKyNlbHNlCisJCU1PRF9ERUNfVVNFX0NPVU5UOworI2VuZGlmCisgICAgICAgIGdvdG8gZXJyX291dDsKKyAgICB9CisKKy8vIHNhbXBsZQorLy8JaWYgKHJ0X2llZWU4MDIxMV9pZl9zZXR1cChuZXRfZGV2KSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorLy8JCWdvdG8gZXJyX291dDsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkKKyAgICBTRVRfTU9EVUxFX09XTkVSKG5ldF9kZXYpOworI2VuZGlmCisKKwluZXRpZl9zdG9wX3F1ZXVlKG5ldF9kZXYpOworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisvKiBmb3Igc3VwcG9ydGluZyBOZXR3b3JrIE1hbmFnZXIgKi8KKy8qIFNldCB0aGUgc3lzZnMgcGh5c2ljYWwgZGV2aWNlIHJlZmVyZW5jZSBmb3IgdGhlIG5ldHdvcmsgbG9naWNhbCBkZXZpY2UKKyAqIGlmIHNldCBwcmlvciB0byByZWdpc3RyYXRpb24gd2lsbCBjYXVzZSBhIHN5bWxpbmsgZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkpCisgICAgU0VUX05FVERFVl9ERVYobmV0X2RldiwgJihkZXZfcC0+ZGV2KSk7CisjZW5kaWYKKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisJLy8gQWxsb2NhdGUgUlRNUF9BREFQVEVSIG1pbmlwb3J0IGFkYXB0ZXIgc3RydWN0dXJlCisJaGFuZGxlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG9zX2Nvb2tpZSksIEdGUF9LRVJORUwpOworCVJUMjhYWF9IQU5ETEVfREVWX0FTU0lHTihoYW5kbGUsIGRldl9wKTsKKworCXN0YXR1cyA9IFJUTVBBbGxvY0FkYXB0ZXJCbG9jayhoYW5kbGUsICZwQWQpOworCWlmIChzdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJZ290byBlcnJfb3V0X2ZyZWVfbmV0ZGV2OworCisJbmV0X2Rldi0+bWxfcHJpdiA9IChQVk9JRClwQWQ7CisgICAgcEFkLT5uZXRfZGV2ID0gbmV0X2RldjsgLy8gbXVzdCBiZSBiZWZvcmUgUlQyOFhYTmV0RGV2SW5pdCgpCisKKwlSVDI4WFhOZXREZXZJbml0KF9kZXZfcCwgbmV0X2RldiwgcEFkKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorICAgIHBBZC0+U3RhQ2ZnLk9yaURldlR5cGUgPSBuZXRfZGV2LT50eXBlOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJLy8gRmluZCBhbmQgYXNzaWduIGEgZnJlZSBpbnRlcmZhY2UgbmFtZSwgcmF4eAorLy8JUlQyOFhYQXZhaWxSQU5hbWVBc3NpZ24obmV0X2Rldi0+bmFtZSk7CisKKwkvLyBQb3N0IGNvbmZpZworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorCWlmIChSVDI4WFhQcm9iZVBvc3RDb25maWcoX2Rldl9wLCBwQWQsIGFyZ2MpID09IEZBTFNFKQorCQlnb3RvIGVycl9vdXRfdW5tYXA7CisjZWxzZQorCWlmIChSVDI4WFhQcm9iZVBvc3RDb25maWcoX2Rldl9wLCBwQWQsIDApID09IEZBTFNFKQorCQlnb3RvIGVycl9vdXRfdW5tYXA7CisjZW5kaWYgLy8gTElOVVhfVkVSU0lPTl9DT0RFIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlwQWQtPk9wTW9kZSA9IE9QTU9ERV9TVEE7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAorCS8vIGZpbmQgaXRzIHByb2ZpbGUgcGF0aAorCXBBZC0+TUNfUm93SUQgPSAtMTsgLy8gdXNlIGRlZmF1bHQgcHJvZmlsZSBwYXRoCisJUlRNUF9DYXJkSW5mb1JlYWQocEFkKTsKKworCWlmIChwQWQtPk1DX1Jvd0lEID09IC0xKQorI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlzdHJjcHkocEFkLT5NQ19GaWxlTmFtZSwgU1RBX1BST0ZJTEVfUEFUSCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSgiTUM+IFJPVyA9ICVkLCBQQVRIID0gJXNcbiIsIHBBZC0+TUNfUm93SUQsIHBBZC0+TUNfRmlsZU5hbWUpKTsKKyNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KKworCS8vIHNhbXBsZSBtb3ZlCisJaWYgKHJ0X2llZWU4MDIxMV9pZl9zZXR1cChuZXRfZGV2LCBwQWQpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCWdvdG8gZXJyX291dF91bm1hcDsKKworICAgIC8vIFJlZ2lzdGVyIHRoaXMgZGV2aWNlCisgICAgc3RhdHVzID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldF9kZXYpOworICAgIGlmIChzdGF0dXMpCisgICAgICAgIGdvdG8gZXJyX291dF91bm1hcDsKKworICAgIC8vIFNldCBkcml2ZXIgZGF0YQorCVJUMjhYWF9EUlZEQVRBX1NFVChfZGV2X3ApOworCisKKworCSpwcEFkID0gcEFkOworICAgIHJldHVybiAwOyAvLyBwcm9iZSBvaworCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRVJST1IgSEFORExFIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworZXJyX291dF91bm1hcDoKKwlSVE1QRnJlZUFkYXB0ZXIocEFkKTsKKwlSVDI4WFhfVU5NQVAoKTsKKworZXJyX291dF9mcmVlX25ldGRldjoKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCisgICAgZnJlZV9uZXRkZXYobmV0X2Rldik7CisjZWxzZQorCWtmcmVlKG5ldF9kZXYpOworI2VuZGlmCisKK2Vycl9vdXQ6CisJUlQyOFhYX1BVVF9ERVZJQ0UoZGV2X3ApOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCisJcmV0dXJuIChMT05HKU5VTEw7CisjZWxzZQorICAgIHJldHVybiAtRU5PREVWOyAvKiBwcm9iZSBmYWlsICovCisjZW5kaWYgLy8gTElOVVhfVkVSU0lPTl9DT0RFIC8vCit9IC8qIEVuZCBvZiBydDI4eHhfcHJvYmUgKi8KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIFRoZSBlbnRyeSBwb2ludCBmb3IgTGludXgga2VybmVsIHNlbnQgcGFja2V0IHRvIG91ciBkcml2ZXIuCisKK0FyZ3VtZW50czoKKyAgICBza19idWZmICpza2IJCXRoZSBwb2ludGVyIHJlZmVyIHRvIGEgc2tfYnVmZmVyLgorCitSZXR1cm4gVmFsdWU6CisgICAgMAorCitOb3RlOgorCVRoaXMgZnVuY3Rpb24gaXMgdGhlIGVudHJ5IHBvaW50IG9mIFR4IFBhdGggZm9yIE9zIGRlbGl2ZXJ5IHBhY2tldCB0bworCW91ciBkcml2ZXIuIFlvdSBvbmx5IGNhbiBwdXQgT1MtZGVwZW5lZCAmIFNUQS9BUCBjb21tb24gaGFuZGxlIHByb2NlZHVyZXMKKwlpbiBoZXJlLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IHJ0Mjh4eF9wYWNrZXRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gc2tiLT5kZXY7CisJUFJUTVBfQURBUFRFUiBwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCWludCBzdGF0dXMgPSAwOworCVBORElTX1BBQ0tFVCBwUGFja2V0ID0gKFBORElTX1BBQ0tFVCkgc2tiOworCisJLyogUlQyODcwU1RBIGRvZXMgdGhpcyBpbiBSVE1QU2VuZFBhY2tldHMoKSAqLworI2lmZGVmIFJBTElOS19BVEUKKwlpZiAoQVRFX09OKHBBZCkpCisJeworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfUkVTT1VSQ0VTKTsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJeworCQkvLyBEcm9wIHNlbmQgcmVxdWVzdCBzaW5jZSB3ZSBhcmUgaW4gbW9uaXRvciBtb2RlCisJCWlmIChNT05JVE9SX09OKHBBZCkpCisJCXsKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworICAgICAgICAvLyBFYXBvbFN0YXJ0IHNpemUgaXMgMTgKKwlpZiAoc2tiLT5sZW4gPCAxNCkKKwl7CisJCS8vcHJpbnRrKCJiYWQgcGFja2V0IHNpemU6ICVkXG4iLCBwa3QtPmxlbik7CisJCWhleF9kdW1wKCJiYWQgcGFja2V0Iiwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJZ290byBkb25lOworCX0KKworI2lmIDAKKy8vCWlmICgocGt0LT5kYXRhWzBdICYgMHgxKSA9PSAwKQorCXsKKwkJLy9oZXhfZHVtcChfX2Z1bmNfXywgcGt0LT5kYXRhLCBwa3QtPmxlbik7CisJCXByaW50aygicFBhY2tldCA9ICV4XG4iLCBwUGFja2V0KTsKKwl9CisjZW5kaWYKKworCVJUTVBfU0VUX1BBQ0tFVF81VlQocFBhY2tldCwgMCk7CisvLwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIHBrdC0+ZGF0YSwgcGt0LT5sZW4pOworI2lmZGVmIENPTkZJR181VlRfRU5IQU5DRQorICAgIGlmICgqKGludCopKHNrYi0+Y2IpID09IEJSSURHRV9UQUcpIHsKKwkJUlRNUF9TRVRfUEFDS0VUXzVWVChwUGFja2V0LCAxKTsKKyAgICB9CisjZW5kaWYKKworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKworCQlTVEFTZW5kUGFja2V0cygoTkRJU19IQU5ETEUpcEFkLCAoUFBORElTX1BBQ0tFVCkgJnBQYWNrZXQsIDEpOworCX0KKworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJc3RhdHVzID0gMDsKK2RvbmU6CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgU2VuZCBhIHBhY2tldCB0byBXTEFOLgorCitBcmd1bWVudHM6CisgICAgc2tiX3AgICAgICAgICAgIHBvaW50cyB0byBvdXIgYWRhcHRlcgorICAgIGRldl9wICAgICAgICAgICB3aGljaCBXTEFOIG5ldHdvcmsgaW50ZXJmYWNlCisKK1JldHVybiBWYWx1ZToKKyAgICAwOiB0cmFuc21pdCBzdWNjZXNzZnVsbHkKKyAgICBvdGhlcndpc2U6IHRyYW5zbWl0IGZhaWwKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBydDI4eHhfc2VuZF9wYWNrZXRzKAorCUlOIHN0cnVjdCBza19idWZmIAkJKnNrYl9wLAorCUlOIHN0cnVjdCBuZXRfZGV2aWNlIAkqbmV0X2RldikKK3sKKyAgICBSVE1QX0FEQVBURVIgKnBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisKKwlpZiAoIShuZXRfZGV2LT5mbGFncyAmIElGRl9VUCkpCisJeworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgKFBORElTX1BBQ0tFVClza2JfcCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybiAwOworCX0KKworCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpJnNrYl9wLT5jYltDQl9PRkZdLCAxNSk7CisJUlRNUF9TRVRfUEFDS0VUX05FVF9ERVZJQ0VfTUJTU0lEKHNrYl9wLCBNQUlOX01CU1NJRCk7CisKKwlyZXR1cm4gcnQyOHh4X3BhY2tldF94bWl0KHNrYl9wKTsKK30gLyogRW5kIG9mIE1CU1NfVmlydHVhbElGX1BhY2tldFNlbmQgKi8KKworCisKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8PSAweDIwNDAyCS8vIFJlZCBIYXQgNy4xCisvL3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqYWxsb2NfbmV0ZGV2KGludCBzaXplb2ZfcHJpdiwgY29uc3QgY2hhciAqbWFzaywgdm9pZCAoKnNldHVwKShzdHJ1Y3QgbmV0X2RldmljZSAqKSkgLy9zYW1wbGUKK3N0cnVjdCBuZXRfZGV2aWNlICphbGxvY19uZXRkZXYoCisJaW50IHNpemVvZl9wcml2LAorCWNvbnN0IGNoYXIgKm1hc2ssCisJdm9pZCAoKnNldHVwKShzdHJ1Y3QgbmV0X2RldmljZSAqKSkKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZQkqZGV2OworICAgIElOVAkJCQkJYWxsb2Nfc2l6ZTsKKworCisgICAgLyogZW5zdXJlIDMyLWJ5dGUgYWxpZ25tZW50IG9mIHRoZSBwcml2YXRlIGFyZWEgKi8KKyAgICBhbGxvY19zaXplID0gc2l6ZW9mICgqZGV2KSArIHNpemVvZl9wcml2ICsgMzE7CisKKyAgICBkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikga21hbGxvYyhhbGxvY19zaXplLCBHRlBfS0VSTkVMKTsKKyAgICBpZiAoZGV2ID09IE5VTEwpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkoImFsbG9jX25ldGRldjogVW5hYmxlIHRvIGFsbG9jYXRlIGRldmljZSBtZW1vcnkuXG4iKSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIG1lbXNldChkZXYsIDAsIGFsbG9jX3NpemUpOworCisgICAgaWYgKHNpemVvZl9wcml2KQorICAgICAgICBkZXYtPnByaXYgPSAodm9pZCAqKSAoKChsb25nKShkZXYgKyAxKSArIDMxKSAmIH4zMSk7CisKKyAgICBzZXR1cChkZXYpOworICAgIHN0cmNweShkZXYtPm5hbWUsIG1hc2spOworCisgICAgcmV0dXJuIGRldjsKK30KKyNlbmRpZiAvLyBMSU5VWF9WRVJTSU9OX0NPREUgLy8KKworCit2b2lkIENmZ0luaXRIb29rKFBSVE1QX0FEQVBURVIgcEFkKQoreworCXBBZC0+YkJyb2FkQ29tSFQgPSBUUlVFOworfSAvKiBFbmQgb2YgQ2ZnSW5pdEhvb2sgKi8KKworCisjaWYgMAkvLyBOb3QgdXNlZCBub3csIHNob3VsZCBrZWVwIGl0IGluIG91ciBzb3VyY2UgdHJlZT8/CisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIEZpbmQgYW5kIGFzc2lnbiBhIGZyZWUgaW50ZXJmYWNlIG5hbWUgKHJheHgpLgorCitBcmd1bWVudHM6CisgICAgKm5hbWVfcAkJCQl0aGUgaW50ZXJmYWNlIG5hbWUgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisJVFJVRQkJCQlPSworCUZBTFNFCQkJCUZBSUwKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyBCT09MRUFOIFJUMjhYWEF2YWlsUkFOYW1lQXNzaWduKAorCUlOIENIQVIJCQkqbmFtZV9wKQoreworICAgIENIQVIJCQkJc2xvdF9uYW1lW0lGTkFNU0laXTsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZQkqZGV2aWNlOworCVVJTlQzMgkJCQlpZl9pZDsKKworCisgICAgZm9yKGlmX2lkPTA7IGlmX2lkPDg7IGlmX2lkKyspCisgICAgeworICAgICAgICBzcHJpbnRmKHNsb3RfbmFtZSwgInJhJWQiLCBpZl9pZCk7CisKKyAgICAgICAgZm9yKGRldmljZT1kZXZfYmFzZTsgZGV2aWNlIT1OVUxMOyBkZXZpY2U9ZGV2aWNlLT5uZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3RybmNtcChkZXZpY2UtPm5hbWUsIHNsb3RfbmFtZSwgNCkgPT0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZXZpY2UgPT0gTlVMTCkKKwkJCWJyZWFrOworICAgIH0KKworICAgIGlmIChpZl9pZCA9PSA4KQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTm8gYXZhaWxhYmxlIHNsb3QgbmFtZVxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgc3ByaW50ZihuYW1lX3AsICJyYSVkIiwgaWZfaWQpOworCXJldHVybiBUUlVFOworfSAvKiBFbmQgb2YgUlQyOFhYQXZhaWxSQU5hbWVBc3NpZ24gKi8KKyNlbmRpZgorCisjaWYgV0lSRUxFU1NfRVhUID49IDEyCisvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW4gcXVlcnkgL3Byb2MKK3N0cnVjdCBpd19zdGF0aXN0aWNzICpydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzKAorICAgIElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworCVBSVE1QX0FEQVBURVIgcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnQyOHh4X2dldF93aXJlbGVzc19zdGF0cyAtLS0+XG4iKSk7CisKKwlwQWQtPml3X3N0YXRzLnN0YXR1cyA9IDA7IC8vIFN0YXR1cyAtIGRldmljZSBkZXBlbmRlbnQgZm9yIG5vdworCisJLy8gbGluayBxdWFsaXR5CisJcEFkLT5pd19zdGF0cy5xdWFsLnF1YWwgPSAoKHBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSAqIDEyKS8xMCArIDEwKTsKKwlpZihwQWQtPml3X3N0YXRzLnF1YWwucXVhbCA+IDEwMCkKKwkJcEFkLT5pd19zdGF0cy5xdWFsLnF1YWwgPSAxMDA7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKKwkJcEFkLT5pd19zdGF0cy5xdWFsLmxldmVsID0gUlRNUE1heFJzc2kocEFkLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCXBBZC0+aXdfc3RhdHMucXVhbC5ub2lzZSA9IHBBZC0+QmJwV3JpdGVMYXRjaFs2Nl07IC8vIG5vaXNlIGxldmVsIChkQm0pCisKKwlwQWQtPml3X3N0YXRzLnF1YWwubm9pc2UgKz0gMjU2IC0gMTQzOworCXBBZC0+aXdfc3RhdHMucXVhbC51cGRhdGVkID0gMTsgICAgIC8vIEZsYWdzIHRvIGtub3cgaWYgdXBkYXRlZAorI2lmZGVmIElXX1FVQUxfREJNCisJcEFkLT5pd19zdGF0cy5xdWFsLnVwZGF0ZWQgfD0gSVdfUVVBTF9EQk07CS8vIExldmVsICsgTm9pc2UgYXJlIGRCbQorI2VuZGlmIC8vIElXX1FVQUxfREJNIC8vCisKKwlwQWQtPml3X3N0YXRzLmRpc2NhcmQubndpZCA9IDA7ICAgICAvLyBSeCA6IFdyb25nIG53aWQvZXNzaWQKKwlwQWQtPml3X3N0YXRzLm1pc3MuYmVhY29uID0gMDsgICAgICAvLyBNaXNzZWQgYmVhY29ucy9zdXBlcmZyYW1lCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0tIHJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHNcbiIpKTsKKwlyZXR1cm4gJnBBZC0+aXdfc3RhdHM7Cit9IC8qIEVuZCBvZiBydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzICovCisjZW5kaWYgLy8gV0lSRUxFU1NfRVhUIC8vCisKKworCit2b2lkIHRidHRfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisjZGVmaW5lIE1BWF9UWF9JTl9UQlRUCQkoMTYpCisKK30KKworSU5UIHJ0Mjh4eF9pb2N0bCgKKwlJTglzdHJ1Y3QgbmV0X2RldmljZQkqbmV0X2RldiwKKwlJTglPVVQJc3RydWN0IGlmcmVxCSpycSwKKwlJTglJTlQJCQkJCWNtZCkKK3sKKwlWSVJUVUFMX0FEQVBURVIJKnBWaXJ0dWFsQWQgPSBOVUxMOworCVJUTVBfQURBUFRFUgkqcEFkID0gTlVMTDsKKwlJTlQJCQkJcmV0ID0gMDsKKworCWlmIChuZXRfZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisJCXBBZCA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPm1sX3ByaXY7CisJfQorCisJaWYgKHBBZCA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPm1sX3ByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCXsKKwkJcmV0ID0gcnQyOHh4X3N0YV9pb2N0bChuZXRfZGV2LCBycSwgY21kKTsKKwl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICAgICAgcmV0dXJuIGV0aGVybmV0IHN0YXRpc3RpY3MgY291bnRlcgorCisgICAgQXJndW1lbnRzOgorICAgICAgICBuZXRfZGV2ICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBuZXRfZGV2aWNlCisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIG5ldF9kZXZpY2Vfc3RhdHMqCisKKyAgICBOb3RlOgorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKlJUMjh4eF9nZXRfZXRoZXJfc3RhdHMoCisgICAgSU4gIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworICAgIFJUTVBfQURBUFRFUiAqcEFkID0gTlVMTDsKKworCWlmIChuZXRfZGV2KQorCQlwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCisJaWYgKHBBZCkKKwl7CisKKwkJcEFkLT5zdGF0cy5yeF9wYWNrZXRzID0gcEFkLT5XbGFuQ291bnRlcnMuUmVjZWl2ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0OworCQlwQWQtPnN0YXRzLnR4X3BhY2tldHMgPSBwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQ7CisKKwkJcEFkLT5zdGF0cy5yeF9ieXRlcyA9IHBBZC0+UmFsaW5rQ291bnRlcnMuUmVjZWl2ZWRCeXRlQ291bnQ7CisJCXBBZC0+c3RhdHMudHhfYnl0ZXMgPSBwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQnl0ZUNvdW50OworCisJCXBBZC0+c3RhdHMucnhfZXJyb3JzID0gcEFkLT5Db3VudGVyczgwMjMuUnhFcnJvcnM7CisJCXBBZC0+c3RhdHMudHhfZXJyb3JzID0gcEFkLT5Db3VudGVyczgwMjMuVHhFcnJvcnM7CisKKwkJcEFkLT5zdGF0cy5yeF9kcm9wcGVkID0gMDsKKwkJcEFkLT5zdGF0cy50eF9kcm9wcGVkID0gMDsKKworCSAgICBwQWQtPnN0YXRzLm11bHRpY2FzdCA9IHBBZC0+V2xhbkNvdW50ZXJzLk11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudC5RdWFkUGFydDsgICAvLyBtdWx0aWNhc3QgcGFja2V0cyByZWNlaXZlZAorCSAgICBwQWQtPnN0YXRzLmNvbGxpc2lvbnMgPSBwQWQtPkNvdW50ZXJzODAyMy5PbmVDb2xsaXNpb24gKyBwQWQtPkNvdW50ZXJzODAyMy5Nb3JlQ29sbGlzaW9uczsgIC8vIENvbGxpc2lvbiBwYWNrZXRzCisKKwkgICAgcEFkLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzID0gMDsKKwkgICAgcEFkLT5zdGF0cy5yeF9vdmVyX2Vycm9ycyA9IHBBZC0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXI7ICAgICAgICAgICAgICAgICAgIC8vIHJlY2VpdmVyIHJpbmcgYnVmZiBvdmVyZmxvdworCSAgICBwQWQtPnN0YXRzLnJ4X2NyY19lcnJvcnMgPSAwOy8vcEFkLT5XbGFuQ291bnRlcnMuRkNTRXJyb3JDb3VudDsgICAgIC8vIHJlY3ZlZCBwa3Qgd2l0aCBjcmMgZXJyb3IKKwkgICAgcEFkLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMgPSBwQWQtPkNvdW50ZXJzODAyMy5SY3ZBbGlnbm1lbnRFcnJvcnM7ICAgICAgICAgIC8vIHJlY3YnZCBmcmFtZSBhbGlnbm1lbnQgZXJyb3IKKwkgICAgcEFkLT5zdGF0cy5yeF9maWZvX2Vycm9ycyA9IHBBZC0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXI7ICAgICAgICAgICAgICAgICAgIC8vIHJlY3YnciBmaWZvIG92ZXJydW4KKwkgICAgcEFkLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY2VpdmVyIG1pc3NlZCBwYWNrZXQKKworCSAgICAvLyBkZXRhaWxlZCB0eF9lcnJvcnMKKwkgICAgcEFkLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycyA9IDA7CisJICAgIHBBZC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMgPSAwOworCSAgICBwQWQtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzID0gMDsKKwkgICAgcEFkLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzID0gMDsKKwkgICAgcEFkLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzID0gMDsKKworCSAgICAvLyBmb3IgY3NsaXAgZXRjCisJICAgIHBBZC0+c3RhdHMucnhfY29tcHJlc3NlZCA9IDA7CisJICAgIHBBZC0+c3RhdHMudHhfY29tcHJlc3NlZCA9IDA7CisKKwkJcmV0dXJuICZwQWQtPnN0YXRzOworCX0KKwllbHNlCisgICAgCXJldHVybiBOVUxMOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0X3Byb2ZpbGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfcHJvZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2N2ZlYTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0X3Byb2ZpbGUuYwpAQCAtMCwwICsxLDIwMjAgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpbmNsdWRlICJydF9jb25maWcuaCIKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorc3RhdGljIHZvaWQgSFRQYXJhbWV0ZXJzSG9vaygKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglDSEFSCQkgICpwVmFsdWVTdHIsCisJSU4JQ0hBUgkJICAqcElucHV0KTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2RlZmluZSBFVEhfTUFDX0FERFJfU1RSX0xFTiAxNyAgLy8gaW4gZm9ybWF0IG9mIHh4Onh4Onh4Onh4Onh4Onh4CisKKy8vIFdlIGFzc3VtZSB0aGUgczEgaXMgYSBzdGluZywgczIgaXMgYSBtZW1vcnkgc3BhY2Ugd2l0aCA2IGJ5dGVzLiBhbmQgY29udGVudCBvZiBzMSB3aWxsIGJlIGNoYW5nZWQuCitCT09MRUFOIHJ0c3RybWFjdG9oZXgoY2hhciAqczEsIGNoYXIgKnMyKQoreworCWludCBpID0gMDsKKwljaGFyICpwdG9rUyA9IHMxLCAqcHRva0UgPSBzMTsKKworCWlmIChzdHJsZW4oczEpICE9IEVUSF9NQUNfQUREUl9TVFJfTEVOKQorCQlyZXR1cm4gRkFMU0U7CisKKwl3aGlsZSgoKnB0b2tTKSAhPSAnXDAnKQorCXsKKwkJaWYoKHB0b2tFID0gc3RyY2hyKHB0b2tTLCAnOicpKSAhPSBOVUxMKQorCQkJKnB0b2tFKysgPSAnXDAnOworCQlpZiAoKHN0cmxlbihwdG9rUykgIT0gMikgfHwgKCFpc3hkaWdpdCgqcHRva1MpKSB8fCAoIWlzeGRpZ2l0KCoocHRva1MrMSkpKSkKKwkJCWJyZWFrOyAvLyBmYWlsCisJCUF0b0gocHRva1MsICZzMltpKytdLCAxKTsKKwkJcHRva1MgPSBwdG9rRTsKKwkJaWYgKGkgPT0gNikKKwkJCWJyZWFrOyAvLyBwYXJzaW5nIGZpbmlzaGVkCisJfQorCisJcmV0dXJuICggaSA9PSA2ID8gVFJVRSA6IEZBTFNFKTsKKworfQorCisKKy8vIHdlIGFzc3VtZSB0aGUgczEgYW5kIHMyIGJvdGggYXJlIHN0cmluZ3MuCitCT09MRUFOIHJ0c3RyY2FzZWNtcChjaGFyICpzMSwgY2hhciAqczIpCit7CisJY2hhciAqcDEgPSBzMSwgKnAyID0gczI7CisKKwlpZiAoc3RybGVuKHMxKSAhPSBzdHJsZW4oczIpKQorCQlyZXR1cm4gRkFMU0U7CisKKwl3aGlsZSgqcDEgIT0gJ1wwJykKKwl7CisJCWlmKCgqcDEgIT0gKnAyKSAmJiAoKCpwMSBeICpwMikgIT0gMHgyMCkpCisJCQlyZXR1cm4gRkFMU0U7CisJCXAxKys7CisJCXAyKys7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKKy8vIHdlIGFzc3VtZSB0aGUgczEgKGJ1ZmZlcikgYW5kIHMyIChrZXkpIGJvdGggYXJlIHN0cmluZ3MuCitjaGFyICogcnRzdHJzdHJ1bmNhc2VjbXAoY2hhciAqIHMxLCBjaGFyICogczIpCit7CisJSU5UIGwxLCBsMiwgaTsKKwljaGFyIHRlbXAxLCB0ZW1wMjsKKworCWwyID0gc3RybGVuKHMyKTsKKwlpZiAoIWwyKQorCQlyZXR1cm4gKGNoYXIgKikgczE7CisKKwlsMSA9IHN0cmxlbihzMSk7CisKKwl3aGlsZSAobDEgPj0gbDIpCisJeworCQlsMS0tOworCisJCWZvcihpPTA7IGk8bDI7IGkrKykKKwkJeworCQkJdGVtcDEgPSAqKHMxK2kpOworCQkJdGVtcDIgPSAqKHMyK2kpOworCisJCQlpZiAoKCdhJyA8PSB0ZW1wMSkgJiYgKHRlbXAxIDw9ICd6JykpCisJCQkJdGVtcDEgPSAnQScrKHRlbXAxLSdhJyk7CisJCQlpZiAoKCdhJyA8PSB0ZW1wMikgJiYgKHRlbXAyIDw9ICd6JykpCisJCQkJdGVtcDIgPSAnQScrKHRlbXAyLSdhJyk7CisKKwkJCWlmICh0ZW1wMSAhPSB0ZW1wMikKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChpID09IGwyKQorCQkJcmV0dXJuIChjaGFyICopIHMxOworCisJCXMxKys7CisJfQorCisJcmV0dXJuIE5VTEw7IC8vIG5vdCBmb3VuZAorfQorCisvL2FkZCBieSBrYXRoeQorCisgLyoqCisgICogc3Ryc3RyIC0gRmluZCB0aGUgZmlyc3Qgc3Vic3RyaW5nIGluIGEgJU5VTCB0ZXJtaW5hdGVkIHN0cmluZworICAqIEBzMTogVGhlIHN0cmluZyB0byBiZSBzZWFyY2hlZAorICAqIEBzMjogVGhlIHN0cmluZyB0byBzZWFyY2ggZm9yCisgICovCitjaGFyICogcnRzdHJzdHIoY29uc3QgY2hhciAqIHMxLGNvbnN0IGNoYXIgKiBzMikKK3sKKwlJTlQgbDEsIGwyOworCisJbDIgPSBzdHJsZW4oczIpOworCWlmICghbDIpCisJCXJldHVybiAoY2hhciAqKSBzMTsKKworCWwxID0gc3RybGVuKHMxKTsKKworCXdoaWxlIChsMSA+PSBsMikKKwl7CisJCWwxLS07CisJCWlmICghbWVtY21wKHMxLHMyLGwyKSkKKwkJCXJldHVybiAoY2hhciAqKSBzMTsKKwkJczErKzsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiByc3RydG9rIC0gU3BsaXQgYSBzdHJpbmcgaW50byB0b2tlbnMKKyAqIEBzOiBUaGUgc3RyaW5nIHRvIGJlIHNlYXJjaGVkCisgKiBAY3Q6IFRoZSBjaGFyYWN0ZXJzIHRvIHNlYXJjaCBmb3IKKyAqICogV0FSTklORzogc3RydG9rIGlzIGRlcHJlY2F0ZWQsIHVzZSBzdHJzZXAgaW5zdGVhZC4gSG93ZXZlciBzdHJzZXAgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBvbGQgYXJjaGl0ZWN0dXJlLgorICovCitjaGFyICogX19yc3RydG9rOworY2hhciAqIHJzdHJ0b2soY2hhciAqIHMsY29uc3QgY2hhciAqIGN0KQoreworCWNoYXIgKnNiZWdpbiwgKnNlbmQ7CisKKwlzYmVnaW4gID0gcyA/IHMgOiBfX3JzdHJ0b2s7CisJaWYgKCFzYmVnaW4pCisJeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzYmVnaW4gKz0gc3Ryc3BuKHNiZWdpbixjdCk7CisJaWYgKCpzYmVnaW4gPT0gJ1wwJykKKwl7CisJCV9fcnN0cnRvayA9IE5VTEw7CisJCXJldHVybiggTlVMTCApOworCX0KKworCXNlbmQgPSBzdHJwYnJrKCBzYmVnaW4sIGN0KTsKKwlpZiAoc2VuZCAmJiAqc2VuZCAhPSAnXDAnKQorCQkqc2VuZCsrID0gJ1wwJzsKKworCV9fcnN0cnRvayA9IHNlbmQ7CisKKwlyZXR1cm4gKHNiZWdpbik7Cit9CisKKy8qKgorICogZGVsaW1pdGNudCAtIHJldHVybiB0aGUgY291bnQgb2YgYSBnaXZlbiBkZWxpbWl0ZXIgaW4gYSBnaXZlbiBzdHJpbmcuCisgKiBAczogVGhlIHN0cmluZyB0byBiZSBzZWFyY2hlZC4KKyAqIEBjdDogVGhlIGRlbGltaXRlciB0byBzZWFyY2ggZm9yLgorICogTm90aWNlIDogV2Ugc3VwcG9zZSB0aGUgZGVsaW1pdGVyIGlzIGEgc2luZ2xlLWNoYXIgc3RyaW5nKGZvciBleGFtcGxlIDogIjsiKS4KKyAqLworSU5UIGRlbGltaXRjbnQoY2hhciAqIHMsY29uc3QgY2hhciAqIGN0KQoreworCUlOVCBjb3VudCA9IDA7CisJLyogcG9pbnQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSAqLworCWNvbnN0IGNoYXIgKnRva2VuID0gczsKKworCWZvciAoIDs7ICkKKwl7CisJCXRva2VuID0gc3RycGJyayh0b2tlbiwgY3QpOyAvKiBzZWFyY2ggZm9yIGRlbGltaXRlcnMgKi8KKworICAgICAgICBpZiAoIHRva2VuID09IE5VTEwgKQorCQl7CisJCQkvKiBhZHZhbmNlZCB0byB0aGUgdGVybWluYXRpbmcgbnVsbCBjaGFyYWN0ZXIgKi8KKwkJCWJyZWFrOworCQl9CisJCS8qIHNraXAgdGhlIGRlbGltaXRlciAqLworCSAgICArK3Rva2VuOworCisJCS8qCisJCSAqIFByaW50IHRoZSBmb3VuZCB0ZXh0OiB1c2UgbGVuIHdpdGggJS4qcyB0byBzcGVjaWZ5IGZpZWxkIHdpZHRoLgorCQkgKi8KKworCQkvKiBhY2N1bXVsYXRlIGRlbGltaXRlciBjb3VudCAqLworCSAgICArK2NvdW50OworCX0KKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qCisgICogY29udmVydHMgdGhlIEludGVybmV0IGhvc3QgYWRkcmVzcyBmcm9tIHRoZSBzdGFuZGFyZCBudW1iZXJzLWFuZC1kb3RzIG5vdGF0aW9uCisgICogaW50byBiaW5hcnkgZGF0YS4KKyAgKiByZXR1cm5zIG5vbnplcm8gaWYgdGhlIGFkZHJlc3MgaXMgdmFsaWQsIHplcm8gaWYgbm90LgorICAqLworaW50IHJ0aW5ldF9hdG9uKGNvbnN0IGNoYXIgKmNwLCB1bnNpZ25lZCBpbnQgKmFkZHIpCit7CisJdW5zaWduZWQgaW50IAl2YWw7CisJaW50ICAgICAgICAgCWJhc2UsIG47CisJY2hhciAgICAgICAgCWM7CisJdW5zaWduZWQgaW50ICAgIHBhcnRzWzRdOworCXVuc2lnbmVkIGludCAgICAqcHAgPSBwYXJ0czsKKworCWZvciAoOzspCisgICAgeworICAgICAgICAgLyoKKyAgICAgICAgICAqIENvbGxlY3QgbnVtYmVyIHVwIHRvIGBgLicnLgorICAgICAgICAgICogVmFsdWVzIGFyZSBzcGVjaWZpZWQgYXMgZm9yIEM6CisgICAgICAgICAgKgkweD1oZXgsIDA9b2N0YWwsIG90aGVyPWRlY2ltYWwuCisgICAgICAgICAgKi8KKyAgICAgICAgIHZhbCA9IDA7CisgICAgICAgICBiYXNlID0gMTA7CisgICAgICAgICBpZiAoKmNwID09ICcwJykKKyAgICAgICAgIHsKKyAgICAgICAgICAgICBpZiAoKisrY3AgPT0gJ3gnIHx8ICpjcCA9PSAnWCcpCisgICAgICAgICAgICAgICAgIGJhc2UgPSAxNiwgY3ArKzsKKyAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgIGJhc2UgPSA4OworICAgICAgICAgfQorICAgICAgICAgd2hpbGUgKChjID0gKmNwKSAhPSAnXDAnKQorICAgICAgICAgeworICAgICAgICAgICAgIGlmIChpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSBjKSkKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIHZhbCA9ICh2YWwgKiBiYXNlKSArIChjIC0gJzAnKTsKKyAgICAgICAgICAgICAgICAgY3ArKzsKKyAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGlmIChiYXNlID09IDE2ICYmIGlzeGRpZ2l0KCh1bnNpZ25lZCBjaGFyKSBjKSkKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIHZhbCA9ICh2YWwgPDwgNCkgKworICAgICAgICAgICAgICAgICAgICAgKGMgKyAxMCAtIChpc2xvd2VyKCh1bnNpZ25lZCBjaGFyKSBjKSA/ICdhJyA6ICdBJykpOworICAgICAgICAgICAgICAgICBjcCsrOworICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICAgICBpZiAoKmNwID09ICcuJykKKyAgICAgICAgIHsKKyAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAqIEludGVybmV0IGZvcm1hdDogYS5iLmMuZCBhLmIuYyAgICh3aXRoIGMgdHJlYXRlZCBhcyAxNi1iaXRzKQorICAgICAgICAgICAgICAqIGEuYiAgICAgKHdpdGggYiB0cmVhdGVkIGFzIDI0IGJpdHMpCisgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgaWYgKHBwID49IHBhcnRzICsgMyB8fCB2YWwgPiAweGZmKQorICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAqcHArKyA9IHZhbCwgY3ArKzsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgfQorCisgICAgIC8qCisgICAgICAqIENoZWNrIGZvciB0cmFpbGluZyBqdW5rLgorICAgICAgKi8KKyAgICAgd2hpbGUgKCpjcCkKKyAgICAgICAgIGlmICghaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKmNwKyspKQorICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgIC8qCisgICAgICAqIENvbmNvY3QgdGhlIGFkZHJlc3MgYWNjb3JkaW5nIHRvIHRoZSBudW1iZXIgb2YgcGFydHMgc3BlY2lmaWVkLgorICAgICAgKi8KKyAgICAgbiA9IHBwIC0gcGFydHMgKyAxOworICAgICBzd2l0Y2ggKG4pCisgICAgIHsKKworICAgICAgICAgY2FzZSAxOiAgICAgICAgIC8qIGEgLS0gMzIgYml0cyAqLworICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIDI6ICAgICAgICAgLyogYS5iIC0tIDguMjQgYml0cyAqLworICAgICAgICAgICAgIGlmICh2YWwgPiAweGZmZmZmZikKKyAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgdmFsIHw9IHBhcnRzWzBdIDw8IDI0OworICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIDM6ICAgICAgICAgLyogYS5iLmMgLS0gOC44LjE2IGJpdHMgKi8KKyAgICAgICAgICAgICBpZiAodmFsID4gMHhmZmZmKQorICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICB2YWwgfD0gKHBhcnRzWzBdIDw8IDI0KSB8IChwYXJ0c1sxXSA8PCAxNik7CisgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGNhc2UgNDogICAgICAgICAvKiBhLmIuYy5kIC0tIDguOC44LjggYml0cyAqLworICAgICAgICAgICAgIGlmICh2YWwgPiAweGZmKQorICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICB2YWwgfD0gKHBhcnRzWzBdIDw8IDI0KSB8IChwYXJ0c1sxXSA8PCAxNikgfCAocGFydHNbMl0gPDwgOCk7CisgICAgICAgICAgICAgYnJlYWs7CisgICAgIH0KKworICAgICAqYWRkciA9IGh0b25sKHZhbCk7CisgICAgIHJldHVybiAxOworCit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgICAgICBGaW5kIGtleSBzZWN0aW9uIGZvciBHZXQga2V5IHBhcmFtZXRlci4KKworICAgIEFyZ3VtZW50czoKKyAgICAgICAgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byBzdGFydCBmaW5kIHRoZSBrZXkgc2VjdGlvbgorICAgICAgICBzZWN0aW9uICAgICAgICAgICAgICAgICAgICAgdGhlIGtleSBvZiB0aGUgc2VjaW9uIHRvIGJlIGZpbmQKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgIEZhaWwKKyAgICAgICAgT3RoZXJzICAgICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitQVUNIQVIgIFJUTVBGaW5kU2VjdGlvbigKKyAgICBJTiAgUENIQVIgICBidWZmZXIpCit7CisgICAgQ0hBUiB0ZW1wX2J1ZlszMl07CisgICAgUFVDSEFSICBwdHI7CisKKyAgICBzdHJjcHkodGVtcF9idWYsICJEZWZhdWx0Iik7CisKKyAgICBpZigocHRyID0gcnRzdHJzdHIoYnVmZmVyLCB0ZW1wX2J1ZikpICE9IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gKHB0citzdHJsZW4oIlxuIikpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgICAgIEdldCBrZXkgcGFyYW1ldGVyLgorCisgICAgQXJndW1lbnRzOgorICAgICAgICBrZXkgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBrZXkgc3RyaW5nCisgICAgICAgIGRlc3QgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGRlc3RpbmF0aW9uCisgICAgICAgIGRlc3RzaXplICAgICAgICAgICAgICAgICAgICBUaGUgZGF0YXNpemUgb2YgdGhlIGRlc3RpbmF0aW9uCisgICAgICAgIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gc3RhcnQgZmluZCB0aGUga2V5CisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIFRSVUUgICAgICAgICAgICAgICAgICAgICAgICBTdWNjZXNzCisgICAgICAgIEZBTFNFICAgICAgICAgICAgICAgICAgICAgICBGYWlsCisKKyAgICBOb3RlOgorICAgICAgICBUaGlzIHJvdXRpbmUgZ2V0IHRoZSB2YWx1ZSB3aXRoIHRoZSBtYXRjaGVkIGtleSAoY2FzZSBjYXNlLXNlbnNpdGl2ZSkKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgUlRNUEdldEtleVBhcmFtZXRlcigKKyAgICBJTiAgUENIQVIgICBrZXksCisgICAgT1VUIFBDSEFSICAgZGVzdCwKKyAgICBJTiAgSU5UICAgICBkZXN0c2l6ZSwKKyAgICBJTiAgUENIQVIgICBidWZmZXIpCit7CisgICAgVUNIQVIgKnRlbXBfYnVmMSA9IE5VTEw7CisgICAgVUNIQVIgKnRlbXBfYnVmMiA9IE5VTEw7CisgICAgQ0hBUiAqc3RhcnRfcHRyOworICAgIENIQVIgKmVuZF9wdHI7CisgICAgQ0hBUiAqcHRyOworICAgIENIQVIgKm9mZnNldCA9IDA7CisgICAgSU5UICBsZW47CisKKwkvL3RlbXBfYnVmMSA9IGttYWxsb2MoTUFYX1BBUkFNX0JVRkZFUl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7CisJb3NfYWxsb2NfbWVtKE5VTEwsICZ0ZW1wX2J1ZjEsIE1BWF9QQVJBTV9CVUZGRVJfU0laRSk7CisKKwlpZih0ZW1wX2J1ZjEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisKKwkvL3RlbXBfYnVmMiA9IGttYWxsb2MoTUFYX1BBUkFNX0JVRkZFUl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7CisJb3NfYWxsb2NfbWVtKE5VTEwsICZ0ZW1wX2J1ZjIsIE1BWF9QQVJBTV9CVUZGRVJfU0laRSk7CisJaWYodGVtcF9idWYyID09IE5VTEwpCisJeworCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKwl9CisKKyAgICAvL2ZpbmQgc2VjdGlvbgorICAgIGlmKChvZmZzZXQgPSBSVE1QRmluZFNlY3Rpb24oYnVmZmVyKSkgPT0gTlVMTCkKKyAgICB7CisgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKworICAgIHN0cmNweSh0ZW1wX2J1ZjEsICJcbiIpOworICAgIHN0cmNhdCh0ZW1wX2J1ZjEsIGtleSk7CisgICAgc3RyY2F0KHRlbXBfYnVmMSwgIj0iKTsKKworICAgIC8vc2VhcmNoIGtleQorICAgIGlmKChzdGFydF9wdHI9cnRzdHJzdHIob2Zmc2V0LCB0ZW1wX2J1ZjEpKT09TlVMTCkKKyAgICB7CisJCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKworICAgIHN0YXJ0X3B0cis9c3RybGVuKCJcbiIpOworICAgIGlmKChlbmRfcHRyPXJ0c3Ryc3RyKHN0YXJ0X3B0ciwgIlxuIikpPT1OVUxMKQorICAgICAgIGVuZF9wdHI9c3RhcnRfcHRyK3N0cmxlbihzdGFydF9wdHIpOworCisgICAgaWYgKGVuZF9wdHI8c3RhcnRfcHRyKQorICAgIHsKKwkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorCisgICAgTmRpc01vdmVNZW1vcnkodGVtcF9idWYyLCBzdGFydF9wdHIsIGVuZF9wdHItc3RhcnRfcHRyKTsKKyAgICB0ZW1wX2J1ZjJbZW5kX3B0ci1zdGFydF9wdHJdPSdcMCc7CisgICAgbGVuID0gc3RybGVuKHRlbXBfYnVmMik7CisgICAgc3RyY3B5KHRlbXBfYnVmMSwgdGVtcF9idWYyKTsKKyAgICBpZigoc3RhcnRfcHRyPXJ0c3Ryc3RyKHRlbXBfYnVmMSwgIj0iKSkgPT0gTlVMTCkKKyAgICB7CisJCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKworICAgIHN0cmNweSh0ZW1wX2J1ZjIsIHN0YXJ0X3B0cisxKTsKKyAgICBwdHIgPSB0ZW1wX2J1ZjI7CisgICAgLy90cmltIHNwYWNlIG9yIHRhYgorICAgIHdoaWxlKCpwdHIgIT0gMHgwMCkKKyAgICB7CisgICAgICAgIGlmKCAoKnB0ciA9PSAnICcpIHx8ICgqcHRyID09ICdcdCcpICkKKyAgICAgICAgICAgIHB0cisrOworICAgICAgICBlbHNlCisgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGxlbiA9IHN0cmxlbihwdHIpOworICAgIG1lbXNldChkZXN0LCAweDAwLCBkZXN0c2l6ZSk7CisgICAgc3RybmNweShkZXN0LCBwdHIsIGxlbiA+PSBkZXN0c2l6ZSA/ICBkZXN0c2l6ZTogbGVuKTsKKworCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgICAgIEdldCBrZXkgcGFyYW1ldGVyLgorCisgICAgQXJndW1lbnRzOgorICAgICAgICBrZXkgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBrZXkgc3RyaW5nCisgICAgICAgIGRlc3QgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGRlc3RpbmF0aW9uCisgICAgICAgIGRlc3RzaXplICAgICAgICAgICAgICAgICAgICBUaGUgZGF0YXNpemUgb2YgdGhlIGRlc3RpbmF0aW9uCisgICAgICAgIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gc3RhcnQgZmluZCB0aGUga2V5CisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIFRSVUUgICAgICAgICAgICAgICAgICAgICAgICBTdWNjZXNzCisgICAgICAgIEZBTFNFICAgICAgICAgICAgICAgICAgICAgICBGYWlsCisKKyAgICBOb3RlOgorICAgICAgICBUaGlzIHJvdXRpbmUgZ2V0IHRoZSB2YWx1ZSB3aXRoIHRoZSBtYXRjaGVkIGtleSAoY2FzZSBjYXNlLXNlbnNpdGl2ZSkuCisgICAgICAgIEl0IGlzIGNhbGxlZCBmb3IgcGFyc2luZyBTU0lEIGFuZCBhbnkga2V5IHN0cmluZy4KKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgUlRNUEdldENyaXRpY2FsUGFyYW1ldGVyKAorICAgIElOICBQQ0hBUiAgIGtleSwKKyAgICBPVVQgUENIQVIgICBkZXN0LAorICAgIElOICBJTlQgICAgIGRlc3RzaXplLAorICAgIElOICBQQ0hBUiAgIGJ1ZmZlcikKK3sKKyAgICBVQ0hBUiAqdGVtcF9idWYxID0gTlVMTDsKKyAgICBVQ0hBUiAqdGVtcF9idWYyID0gTlVMTDsKKyAgICBDSEFSICpzdGFydF9wdHI7CisgICAgQ0hBUiAqZW5kX3B0cjsKKyAgICBDSEFSICpwdHI7CisgICAgQ0hBUiAqb2Zmc2V0ID0gMDsKKyAgICBJTlQgIGxlbjsKKworCS8vdGVtcF9idWYxID0ga21hbGxvYyhNQVhfUEFSQU1fQlVGRkVSX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKKwlvc19hbGxvY19tZW0oTlVMTCwgJnRlbXBfYnVmMSwgTUFYX1BBUkFNX0JVRkZFUl9TSVpFKTsKKworCWlmKHRlbXBfYnVmMSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gKEZBTFNFKTsKKworCS8vdGVtcF9idWYyID0ga21hbGxvYyhNQVhfUEFSQU1fQlVGRkVSX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKKwlvc19hbGxvY19tZW0oTlVMTCwgJnRlbXBfYnVmMiwgTUFYX1BBUkFNX0JVRkZFUl9TSVpFKTsKKwlpZih0ZW1wX2J1ZjIgPT0gTlVMTCkKKwl7CisJCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworCX0KKworICAgIC8vZmluZCBzZWN0aW9uCisgICAgaWYoKG9mZnNldCA9IFJUTVBGaW5kU2VjdGlvbihidWZmZXIpKSA9PSBOVUxMKQorICAgIHsKKyAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorCisgICAgc3RyY3B5KHRlbXBfYnVmMSwgIlxuIik7CisgICAgc3RyY2F0KHRlbXBfYnVmMSwga2V5KTsKKyAgICBzdHJjYXQodGVtcF9idWYxLCAiPSIpOworCisgICAgLy9zZWFyY2gga2V5CisgICAgaWYoKHN0YXJ0X3B0cj1ydHN0cnN0cihvZmZzZXQsIHRlbXBfYnVmMSkpPT1OVUxMKQorICAgIHsKKwkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorCisgICAgc3RhcnRfcHRyKz1zdHJsZW4oIlxuIik7CisgICAgaWYoKGVuZF9wdHI9cnRzdHJzdHIoc3RhcnRfcHRyLCAiXG4iKSk9PU5VTEwpCisgICAgICAgZW5kX3B0cj1zdGFydF9wdHIrc3RybGVuKHN0YXJ0X3B0cik7CisKKyAgICBpZiAoZW5kX3B0cjxzdGFydF9wdHIpCisgICAgeworCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICB9CisKKyAgICBOZGlzTW92ZU1lbW9yeSh0ZW1wX2J1ZjIsIHN0YXJ0X3B0ciwgZW5kX3B0ci1zdGFydF9wdHIpOworICAgIHRlbXBfYnVmMltlbmRfcHRyLXN0YXJ0X3B0cl09J1wwJzsKKyAgICBsZW4gPSBzdHJsZW4odGVtcF9idWYyKTsKKyAgICBzdHJjcHkodGVtcF9idWYxLCB0ZW1wX2J1ZjIpOworICAgIGlmKChzdGFydF9wdHI9cnRzdHJzdHIodGVtcF9idWYxLCAiPSIpKSA9PSBOVUxMKQorICAgIHsKKwkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorCisgICAgc3RyY3B5KHRlbXBfYnVmMiwgc3RhcnRfcHRyKzEpOworICAgIHB0ciA9IHRlbXBfYnVmMjsKKworICAgIC8vdHJpbSB0YWIKKyAgICAvKiBXZSBjYW5ub3QgdHJpbSBzcGFjZSgnICcpIGZvciBTU0lEIGFuZCBrZXkgc3RyaW5nLiAqLworICAgIHdoaWxlKCpwdHIgIT0gMHgwMCkKKyAgICB7CisgICAgICAgIC8vaWYoICgqcHRyID09ICcgJykgfHwgKCpwdHIgPT0gJ1x0JykgKQorICAgICAgICBpZiggKCpwdHIgPT0gJ1x0JykgKQorICAgICAgICAgICAgcHRyKys7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgbGVuID0gc3RybGVuKHB0cik7CisgICAgbWVtc2V0KGRlc3QsIDB4MDAsIGRlc3RzaXplKTsKKyAgICBzdHJuY3B5KGRlc3QsIHB0ciwgbGVuID49IGRlc3RzaXplID8gIGRlc3RzaXplOiBsZW4pOworCisJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICBvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICAgICAgR2V0IG11bHRpcGxlIGtleSBwYXJhbWV0ZXIuCisKKyAgICBBcmd1bWVudHM6CisgICAgICAgIGtleSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGtleSBzdHJpbmcKKyAgICAgICAgZGVzdCAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gZGVzdGluYXRpb24KKyAgICAgICAgZGVzdHNpemUgICAgICAgICAgICAgICAgICAgIFRoZSBkYXRhc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24KKyAgICAgICAgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byBzdGFydCBmaW5kIHRoZSBrZXkKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgVFJVRSAgICAgICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MKKyAgICAgICAgRkFMU0UgICAgICAgICAgICAgICAgICAgICAgIEZhaWwKKworICAgIE5vdGU6CisgICAgICAgIFRoaXMgcm91dGluZSBnZXQgdGhlIHZhbHVlIHdpdGggdGhlIG1hdGNoZWQga2V5IChjYXNlIGNhc2Utc2Vuc2l0aXZlKQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBSVE1QR2V0S2V5UGFyYW1ldGVyV2l0aE9mZnNldCgKKyAgICBJTiAgUENIQVIgICBrZXksCisgICAgT1VUIFBDSEFSICAgZGVzdCwKKyAgICBPVVQJVVNIT1JUCSplbmRfb2Zmc2V0LAorICAgIElOICBJTlQgICAgIGRlc3RzaXplLAorICAgIElOICBQQ0hBUiAgIGJ1ZmZlciwKKyAgICBJTglCT09MRUFOCWJUcmltU3BhY2UpCit7CisgICAgVUNIQVIgKnRlbXBfYnVmMSA9IE5VTEw7CisgICAgVUNIQVIgKnRlbXBfYnVmMiA9IE5VTEw7CisgICAgQ0hBUiAqc3RhcnRfcHRyOworICAgIENIQVIgKmVuZF9wdHI7CisgICAgQ0hBUiAqcHRyOworICAgIENIQVIgKm9mZnNldCA9IDA7CisgICAgSU5UICBsZW47CisKKwlpZiAoKmVuZF9vZmZzZXQgPj0gTUFYX0lOSV9CVUZGRVJfU0laRSkKKwkJcmV0dXJuIChGQUxTRSk7CisKKwlvc19hbGxvY19tZW0oTlVMTCwgJnRlbXBfYnVmMSwgTUFYX1BBUkFNX0JVRkZFUl9TSVpFKTsKKworCWlmKHRlbXBfYnVmMSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gKEZBTFNFKTsKKworCW9zX2FsbG9jX21lbShOVUxMLCAmdGVtcF9idWYyLCBNQVhfUEFSQU1fQlVGRkVSX1NJWkUpOworCWlmKHRlbXBfYnVmMiA9PSBOVUxMKQorCXsKKwkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisJfQorCisgICAgLy9maW5kIHNlY3Rpb24KKwlpZigqZW5kX29mZnNldCA9PSAwKQorICAgIHsKKwkJaWYgKChvZmZzZXQgPSBSVE1QRmluZFNlY3Rpb24oYnVmZmVyKSkgPT0gTlVMTCkKKwkJeworCQkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKKwkgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgCSAgICByZXR1cm4gKEZBTFNFKTsKKwkJfQorICAgIH0KKwllbHNlCisJCW9mZnNldCA9IGJ1ZmZlciArICgqZW5kX29mZnNldCk7CisKKyAgICBzdHJjcHkodGVtcF9idWYxLCAiXG4iKTsKKyAgICBzdHJjYXQodGVtcF9idWYxLCBrZXkpOworICAgIHN0cmNhdCh0ZW1wX2J1ZjEsICI9Iik7CisKKyAgICAvL3NlYXJjaCBrZXkKKyAgICBpZigoc3RhcnRfcHRyPXJ0c3Ryc3RyKG9mZnNldCwgdGVtcF9idWYxKSk9PU5VTEwpCisgICAgeworCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICB9CisKKyAgICBzdGFydF9wdHIrPXN0cmxlbigiXG4iKTsKKyAgICBpZigoZW5kX3B0cj1ydHN0cnN0cihzdGFydF9wdHIsICJcbiIpKT09TlVMTCkKKyAgICAgICBlbmRfcHRyPXN0YXJ0X3B0citzdHJsZW4oc3RhcnRfcHRyKTsKKworICAgIGlmIChlbmRfcHRyPHN0YXJ0X3B0cikKKyAgICB7CisJCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7CisgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKworCSplbmRfb2Zmc2V0ID0gZW5kX3B0ciAtIGJ1ZmZlcjsKKworICAgIE5kaXNNb3ZlTWVtb3J5KHRlbXBfYnVmMiwgc3RhcnRfcHRyLCBlbmRfcHRyLXN0YXJ0X3B0cik7CisgICAgdGVtcF9idWYyW2VuZF9wdHItc3RhcnRfcHRyXT0nXDAnOworICAgIGxlbiA9IHN0cmxlbih0ZW1wX2J1ZjIpOworICAgIHN0cmNweSh0ZW1wX2J1ZjEsIHRlbXBfYnVmMik7CisgICAgaWYoKHN0YXJ0X3B0cj1ydHN0cnN0cih0ZW1wX2J1ZjEsICI9IikpID09IE5VTEwpCisgICAgeworCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICB9CisKKyAgICBzdHJjcHkodGVtcF9idWYyLCBzdGFydF9wdHIrMSk7CisgICAgcHRyID0gdGVtcF9idWYyOworICAgIC8vdHJpbSBzcGFjZSBvciB0YWIKKyAgICB3aGlsZSgqcHRyICE9IDB4MDApCisgICAgeworICAgICAgICBpZigoYlRyaW1TcGFjZSAmJiAoKnB0ciA9PSAnICcpKSB8fCAoKnB0ciA9PSAnXHQnKSApCisgICAgICAgICAgICBwdHIrKzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBsZW4gPSBzdHJsZW4ocHRyKTsKKyAgICBtZW1zZXQoZGVzdCwgMHgwMCwgZGVzdHNpemUpOworICAgIHN0cm5jcHkoZGVzdCwgcHRyLCBsZW4gPj0gZGVzdHNpemUgPyAgZGVzdHNpemU6IGxlbik7CisKKwlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOworICAgIG9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworc3RhdGljIGludCBydG1wX3BhcnNlX2tleV9idWZmZXJfZnJvbV9maWxlKElOICBQUlRNUF9BREFQVEVSIHBBZCxJTiAgY2hhciAqYnVmZmVyLElOICBVTE9ORyBLZXlUeXBlLElOICBJTlQgQlNTSWR4LElOICBJTlQgS2V5SWR4KQoreworCVBVQ0hBUgkJa2V5YnVmZjsKKwlJTlQJCQlpID0gQlNTSWR4LCBpZHggPSBLZXlJZHg7CisJVUxPTkcJCUtleUxlbjsKKwlVQ0hBUgkJQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCisJa2V5YnVmZiA9IGJ1ZmZlcjsKKwlLZXlMZW4gPSBzdHJsZW4oa2V5YnVmZik7CisKKwlpZiAoS2V5VHlwZSA9PSAxKQorCXsvL0FzY2lpCisJCWlmKCAoS2V5TGVuID09IDUpIHx8IChLZXlMZW4gPT0gMTMpKQorCQl7CisJCQlwQWQtPlNoYXJlZEtleVtpXVtpZHhdLktleUxlbiA9IEtleUxlbjsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W2ldW2lkeF0uS2V5LCBrZXlidWZmLCBLZXlMZW4pOworCQkJaWYgKEtleUxlbiA9PSA1KQorCQkJCUNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJCWVsc2UKKwkJCQlDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCQkJcEFkLT5TaGFyZWRLZXlbaV1baWR4XS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkkvRihyYSVkKSBLZXklZFN0cj0lcyBhbmQgdHlwZT0lc1xuIiwgaSwgaWR4KzEsIGtleWJ1ZmYsIChLZXlUeXBlID09IDApID8gIkhleCI6IkFzY2lpIikpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJZWxzZQorCQl7Ly9JbnZhbGlkIGtleSBsZW5ndGgKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIktleSVkU3RyIGlzIEludmFsaWQga2V5IGxlbmd0aCEgS2V5TGVuID0gJWxkIVxuIiwgaWR4KzEsIEtleUxlbikpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJZWxzZQorCXsvL0hleCB0eXBlCisJCWlmKCAoS2V5TGVuID09IDEwKSB8fCAoS2V5TGVuID09IDI2KSkKKwkJeworCQkJcEFkLT5TaGFyZWRLZXlbaV1baWR4XS5LZXlMZW4gPSBLZXlMZW4gLyAyOworCQkJQXRvSChrZXlidWZmLCBwQWQtPlNoYXJlZEtleVtpXVtpZHhdLktleSwgS2V5TGVuIC8gMik7CisJCQlpZiAoS2V5TGVuID09IDEwKQorCQkJCUNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJCWVsc2UKKwkJCQlDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCQkJcEFkLT5TaGFyZWRLZXlbaV1baWR4XS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkkvRihyYSVkKSBLZXklZFN0cj0lcyBhbmQgdHlwZT0lc1xuIiwgaSwgaWR4KzEsIGtleWJ1ZmYsIChLZXlUeXBlID09IDApID8gIkhleCI6IkFzY2lpIikpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJZWxzZQorCQl7Ly9JbnZhbGlkIGtleSBsZW5ndGgKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkkvRihyYSVkKSBLZXklZFN0ciBpcyBJbnZhbGlkIGtleSBsZW5ndGghIEtleUxlbiA9ICVsZCFcbiIsIGksIGlkeCsxLCBLZXlMZW4pKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorfQorc3RhdGljIHZvaWQgcnRtcF9yZWFkX2tleV9wYXJtc19mcm9tX2ZpbGUoSU4gIFBSVE1QX0FEQVBURVIgcEFkLCBjaGFyICp0bXBidWYsIGNoYXIgKmJ1ZmZlcikKK3sKKwljaGFyCQl0b2tfc3RyWzE2XTsKKwlQVUNIQVIJCW1hY3B0cjsKKwlJTlQJCQlpID0gMCwgaWR4OworCVVMT05HCQlLZXlUeXBlW01BWF9NQlNTSURfTlVNXTsKKwlVTE9ORwkJS2V5SWR4OworCisJTmRpc1plcm9NZW1vcnkoS2V5VHlwZSwgTUFYX01CU1NJRF9OVU0pOworCisJLy9EZWZhdWx0S2V5SUQKKwlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJEZWZhdWx0S2V5SUQiLCB0bXBidWYsIDI1LCBidWZmZXIpKQorCXsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQlLZXlJZHggPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCQkJaWYoKEtleUlkeCA+PSAxICkgJiYgKEtleUlkeCA8PSA0KSkKKwkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAoVUNIQVIpIChLZXlJZHggLSAxKTsKKwkJCWVsc2UKKwkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAwOworCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEZWZhdWx0S2V5SUQoMH4zKT0lZFxuIiwgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkKSk7CisJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwl9CisKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgNDsgaWR4KyspCisJeworCQlzcHJpbnRmKHRva19zdHIsICJLZXklZFR5cGUiLCBpZHggKyAxKTsKKwkJLy9LZXkxVHlwZQorCQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcih0b2tfc3RyLCB0bXBidWYsIDEyOCwgYnVmZmVyKSkKKwkJeworCQkgICAgZm9yIChpID0gMCwgbWFjcHRyID0gcnN0cnRvayh0bXBidWYsIjsiKTsgbWFjcHRyOyBtYWNwdHIgPSByc3RydG9rKE5VTEwsIjsiKSwgaSsrKQorCQkgICAgeworCQkJICAgIEtleVR5cGVbaV0gPSBzaW1wbGVfc3RydG9sKG1hY3B0ciwgMCwgMTApOworCQkgICAgfQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJeworCQkJCXNwcmludGYodG9rX3N0ciwgIktleSVkU3RyIiwgaWR4ICsgMSk7CisJCQkJaWYgKFJUTVBHZXRDcml0aWNhbFBhcmFtZXRlcih0b2tfc3RyLCB0bXBidWYsIDEyOCwgYnVmZmVyKSkKKwkJCQl7CisJCQkJCXJ0bXBfcGFyc2Vfa2V5X2J1ZmZlcl9mcm9tX2ZpbGUocEFkLCB0bXBidWYsIEtleVR5cGVbQlNTMF0sIEJTUzAsIGlkeCk7CisJCQkJfQorCQkJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQl9CisJfQorfQorCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK3N0YXRpYyB2b2lkIHJ0bXBfcmVhZF9zdGFfd21tX3Bhcm1zX2Zyb21fZmlsZShJTiAgUFJUTVBfQURBUFRFUiBwQWQsIGNoYXIgKnRtcGJ1ZiwgY2hhciAqYnVmZmVyKQoreworCVBVQ0hBUgkJCQkJbWFjcHRyOworCUlOVAkJCQkJCWk9MDsKKwlCT09MRUFOCQkJCQliV21tRW5hYmxlID0gRkFMU0U7CisKKwkvL1dtbUNhcGFibGUKKwlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJXbW1DYXBhYmxlIiwgdG1wYnVmLCAzMiwgYnVmZmVyKSkKKwl7CisJCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkgLy9FbmFibGUKKwkJeworCQkJcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUgPSBUUlVFOworCQkJYldtbUVuYWJsZSA9IFRSVUU7CisJCX0KKwkJZWxzZSAvL0Rpc2FibGUKKwkJeworCQkJcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUgPSBGQUxTRTsKKwkJfQorCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldtbUNhcGFibGU9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKSk7CisJfQorCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJLy9ETFNDYXBhYmxlCisJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiRExTQ2FwYWJsZSIsIHRtcGJ1ZiwgMzIsIGJ1ZmZlcikpCisJeworCQlpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApICE9IDApICAvL0VuYWJsZQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSA9IFRSVUU7CisJCX0KKwkJZWxzZSAvL0Rpc2FibGUKKwkJeworCQkJcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUgPSBGQUxTRTsKKwkJfQorCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImJETFNDYXBhYmxlPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkpOworCX0KKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCS8vQWNrUG9saWN5IGZvciBBQ19CSywgQUNfQkUsIEFDX1ZJLCBBQ19WTworCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkFja1BvbGljeSIsIHRtcGJ1ZiwgMzIsIGJ1ZmZlcikpCisJeworCQlmb3IgKGkgPSAwLCBtYWNwdHIgPSByc3RydG9rKHRtcGJ1ZiwiOyIpOyBtYWNwdHI7IG1hY3B0ciA9IHJzdHJ0b2soTlVMTCwiOyIpLCBpKyspCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkFja1BvbGljeVtpXSA9IChVQ0hBUilzaW1wbGVfc3RydG9sKG1hY3B0ciwgMCwgMTApOworCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBY2tQb2xpY3lbJWRdPSVkXG4iLCBpLCBwQWQtPkNvbW1vbkNmZy5BY2tQb2xpY3lbaV0pKTsKKwkJfQorCX0KKworCWlmIChiV21tRW5hYmxlKQorCXsKKwkJLy9BUFNEQ2FwYWJsZQorCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJBUFNEQ2FwYWJsZSIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCXsKKwkJCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkgIC8vRW5hYmxlCisJCQkJcEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlID0gVFJVRTsKKwkJCWVsc2UKKwkJCQlwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgPSBGQUxTRTsKKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVBTRENhcGFibGU9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSkpOworCQl9CisKKwkJLy9BUFNEQUMgZm9yIEFDX0JFLCBBQ19CSywgQUNfVkksIEFDX1ZPCisJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkFQU0RBQyIsIHRtcGJ1ZiwgMzIsIGJ1ZmZlcikpCisJCXsKKwkJCUJPT0xFQU4gYXBzZF9hY1s0XTsKKworCQkJZm9yIChpID0gMCwgbWFjcHRyID0gcnN0cnRvayh0bXBidWYsIjsiKTsgbWFjcHRyOyBtYWNwdHIgPSByc3RydG9rKE5VTEwsIjsiKSwgaSsrKQorCQkJeworCQkJCWFwc2RfYWNbaV0gPSAoQk9PTEVBTilzaW1wbGVfc3RydG9sKG1hY3B0ciwgMCwgMTApOworCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVBTREFDJWQgICVkXG4iLCBpLCAgYXBzZF9hY1tpXSkpOworCQkJfQorCisJCQlwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JFID0gYXBzZF9hY1swXTsKKwkJCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQksgPSBhcHNkX2FjWzFdOworCQkJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WSSA9IGFwc2RfYWNbMl07CisJCQlwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZPID0gYXBzZF9hY1szXTsKKwkJfQorCX0KKworfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKK05ESVNfU1RBVFVTCVJUTVBSZWFkUGFyYW1ldGVyc0hvb2soCisJSU4JUFJUTVBfQURBUFRFUiBwQWQpCit7CisJUFVDSEFSCQkJCQlzcmMgPSBOVUxMOworCXN0cnVjdCBmaWxlCQkJCSpzcmNmOworCUlOVCAJCQkJCXJldHZhbCwgb3JnZnN1aWQsIG9yZ2ZzZ2lkOworICAgCW1tX3NlZ21lbnRfdAkJCW9yZ2ZzOworCUNIQVIJCQkJCSpidWZmZXI7CisJQ0hBUgkJCQkJKnRtcGJ1ZjsKKwlVTE9ORwkJCQkJUnRzVGhyZXNoOworCVVMT05HCQkJCQlGcmFnVGhyZXNoOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCVVDSEFSCSAgICAgICAgICAgICAgICBrZXlNYXRlcmlhbFs0MF07CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworCVBVQ0hBUgkJCQkJbWFjcHRyOworCUlOVAkJCQkJCWkgPSAwOworCisJYnVmZmVyID0ga21hbGxvYyhNQVhfSU5JX0JVRkZFUl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7CisJaWYoYnVmZmVyID09IE5VTEwpCisgICAgICAgIHJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCisJdG1wYnVmID0ga21hbGxvYyhNQVhfUEFSQU1fQlVGRkVSX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKKwlpZih0bXBidWYgPT0gTlVMTCkKKwl7CisJCWtmcmVlKGJ1ZmZlcik7CisgICAgICAgIHJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCXNyYyA9IFNUQV9QUk9GSUxFX1BBVEg7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisJc3JjID0gcEFkLT5NQ19GaWxlTmFtZTsKKyNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KKworCS8vIFNhdmUgdWlkIGFuZCBnaWQgdXNlZCBmb3IgZmlsZXN5c3RlbSBhY2Nlc3MuCisJLy8gU2V0IHVzZXIgYW5kIGdyb3VwIHRvIDAgKHJvb3QpCisJb3JnZnN1aWQgPSBjdXJyZW50X2ZzdWlkKCk7CisJb3JnZnNnaWQgPSBjdXJyZW50X2ZzZ2lkKCk7CisJLyogSG0sIGNhbid0IHJlYWxseSBkbyB0aGlzIG5pY2VseSBhbnltb3JlLCBzbyByZWx5IG9uIHRoZXNlIGZpbGVzCisJICogYmVpbmcgc2V0IHRvIHRoZSBwcm9wZXIgcGVybWlzc2lvbiB0byByZWFkIHRoZW0uLi4gKi8KKwkvKiBjdXJyZW50LT5jcmVkLT5mc3VpZCA9IGN1cnJlbnQtPmNyZWQtPmZzZ2lkID0gMDsgKi8KKyAgICBvcmdmcyA9IGdldF9mcygpOworICAgIHNldF9mcyhLRVJORUxfRFMpOworCisJaWYgKHNyYyAmJiAqc3JjKQorCXsKKwkJc3JjZiA9IGZpbHBfb3BlbihzcmMsIE9fUkRPTkxZLCAwKTsKKwkJaWYgKElTX0VSUihzcmNmKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiLS0+IEVycm9yICVsZCBvcGVuaW5nICVzXG4iLCAtUFRSX0VSUihzcmNmKSxzcmMpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIFRoZSBvYmplY3QgbXVzdCBoYXZlIGEgcmVhZCBtZXRob2QKKwkJCWlmIChzcmNmLT5mX29wICYmIHNyY2YtPmZfb3AtPnJlYWQpCisJCQl7CisJCQkJbWVtc2V0KGJ1ZmZlciwgMHgwMCwgTUFYX0lOSV9CVUZGRVJfU0laRSk7CisJCQkJcmV0dmFsPXNyY2YtPmZfb3AtPnJlYWQoc3JjZiwgYnVmZmVyLCBNQVhfSU5JX0JVRkZFUl9TSVpFLCAmc3JjZi0+Zl9wb3MpOworCQkJCWlmIChyZXR2YWwgPCAwKQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFJlYWQgJXMgZXJyb3IgJWRcbiIsIHNyYywgLXJldHZhbCkpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQkvLyBzZXQgZmlsZSBwYXJhbWV0ZXIgdG8gcG9ydGNmZworCQkJCQkvL0NvdW50cnlSZWdpb24KKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQ291bnRyeVJlZ2lvbiIsIHRtcGJ1ZiwgMjUsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gPSAoVUNIQVIpIHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDb3VudHJ5UmVnaW9uPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uKSk7CisJCQkJCX0KKwkJCQkJLy9Db3VudHJ5UmVnaW9uQUJhbmQKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQ291bnRyeVJlZ2lvbkFCYW5kIiwgdG1wYnVmLCAyNSwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkJcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kPSAoVUNIQVIpIHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDb3VudHJ5UmVnaW9uQUJhbmQ9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCkpOworCQkJCQl9CisJCQkJCS8vQ291bnRyeUNvZGUKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQ291bnRyeUNvZGUiLCB0bXBidWYsIDI1LCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZSwgdG1wYnVmICwgMik7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCQkJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5TdGFPcmlDb3VudHJ5Q29kZSwgdG1wYnVmICwgMik7CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJCQkJaWYgKHN0cmxlbihwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZSkgIT0gMCkKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iQ291bnRyeUZsYWcgPSBUUlVFOworCQkJCQkJfQorCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ291bnRyeUNvZGU9JXNcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlKSk7CisJCQkJCX0KKwkJCQkJLy9DaGFubmVsR2VvZ3JhcGh5CisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkNoYW5uZWxHZW9ncmFwaHkiLCB0bXBidWYsIDI1LCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlVQ0hBUiBHZW9ncmFwaHkgPSAoVUNIQVIpIHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7CisJCQkJCQlpZiAoR2VvZ3JhcGh5IDw9IEJPVEgpCisJCQkJCQl7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5ID0gR2VvZ3JhcGh5OworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlWzJdID0KKwkJCQkJCQkJKHBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSA9PSBCT1RIKSA/ICcgJyA6ICgocEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5ID09IElET1IpID8gJ0knIDogJ08nKTsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQkJCXBBZC0+U3RhQ2ZnLlN0YU9yaUdlb2dyYXBoeSA9IHBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeTsKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hhbm5lbEdlb2dyYXBoeT0lZFxuIiwgcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5KSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPSBCT1RIOworCQkJCQkJcEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGVbMl0gPSAnICc7CisJCQkJCX0KKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJCXsKKwkJCQkJCS8vU1NJRAorCQkJCQkJaWYgKFJUTVBHZXRDcml0aWNhbFBhcmFtZXRlcigiU1NJRCIsIHRtcGJ1ZiwgMjU2LCBidWZmZXIpKQorCQkJCQkJeworCQkJCQkJCWlmIChzdHJsZW4odG1wYnVmKSA8PSAzMikKKwkJCQkJCQl7CisJCQkgCQkJCQlwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuID0gKFVDSEFSKSBzdHJsZW4odG1wYnVmKTsKKwkJCQkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcuU3NpZCwgTkRJU184MDJfMTFfTEVOR1RIX1NTSUQpOworCQkJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPkNvbW1vbkNmZy5Tc2lkLCB0bXBidWYsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pOworCQkJCQkJCQlwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4gPSBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuOworCQkJCQkJCQlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIE5ESVNfODAyXzExX0xFTkdUSF9TU0lEKTsKKwkJCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCB0bXBidWYsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7CisJCQkJCQkJCXBBZC0+TWxtZUF1eC5Tc2lkTGVuID0gcEFkLT5Db21tb25DZmcuU3NpZExlbjsKKwkJCQkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIE5ESVNfODAyXzExX0xFTkdUSF9TU0lEKTsKKwkJCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIHRtcGJ1ZiwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOworCQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6KFNTSUQ9JXMpXG4iLCBfX2Z1bmNfXywgdG1wYnVmKSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQkJeworCQkJCQkJLy9OZXR3b3JrVHlwZQorCQkJCQkJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIk5ldHdvcmtUeXBlIiwgdG1wYnVmLCAyNSwgYnVmZmVyKSkKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKKwkJCQkJCQlpZiAoc3RyY21wKHRtcGJ1ZiwgIkFkaG9jIikgPT0gMCkKKwkJCQkJCQkJcEFkLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19BREhPQzsKKwkJCQkJCQllbHNlIC8vRGVmYXVsdCBJbmZyYXN0cnVjdHVyZSBtb2RlCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfSU5GUkE7CisJCQkJCQkJLy8gUmVzZXQgUmFsaW5rIHN1cHBsaWNhbnQgdG8gbm90IHVzZSwgaXQgd2lsbCBiZSBzZXQgdG8gc3RhcnQgd2hlbiBVSSBzZXQgUE1LIGtleQorCQkJCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjooTmV0d29ya1R5cGU9JWQpXG4iLCBfX2Z1bmNfXywgcEFkLT5TdGFDZmcuQnNzVHlwZSkpOworCQkJCQkJfQorCQkJCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJCQkJCS8vQ2hhbm5lbAorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJDaGFubmVsIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IChVQ0hBUikgc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNoYW5uZWw9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJCQkJfQorCQkJCQkvL1dpcmVsZXNzTW9kZQorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJXaXJlbGVzc01vZGUiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlpbnQgdmFsdWUgID0gMCwgbWF4UGh5TW9kZSA9IFBIWV8xMUc7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQkJCW1heFBoeU1vZGUgPSBQSFlfMTFOXzVHOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCQkJCQl2YWx1ZSA9IHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7CisKKwkJCQkJCWlmICh2YWx1ZSA8PSBtYXhQaHlNb2RlKQorCQkJCQkJeworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSB2YWx1ZTsKKwkJCQkJCX0KKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBoeU1vZGU9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpKTsKKwkJCQkJfQorICAgICAgICAgICAgICAgICAgICAvL0Jhc2ljUmF0ZQorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJCYXNpY1JhdGUiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlwQWQtPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXAgPSAoVUxPTkcpIHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCYXNpY1JhdGU9JWxkXG4iLCBwQWQtPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXApKTsKKwkJCQkJfQorCQkJCQkvL0JlYWNvblBlcmlvZAorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJCZWFjb25QZXJpb2QiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPSAoVVNIT1JUKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQmVhY29uUGVyaW9kPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QpKTsKKwkJCQkJfQorICAgICAgICAgICAgICAgICAgICAvL1R4UG93ZXIKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiVHhQb3dlciIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gKFVMT05HKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdCA9IHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhQb3dlcj0lbGRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlKSk7CisJCQkJCX0KKwkJCQkJLy9CR1Byb3RlY3Rpb24KKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQkdQcm90ZWN0aW9uIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkJc3dpdGNoIChzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApKQorCQkJCQkJeworCQkJCQkJCWNhc2UgMTogLy9BbHdheXMgT24KKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAyOiAvL0Fsd2F5cyBPRkYKKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMjsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAwOiAvL0FVVE8KKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSAwOworCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJHUHJvdGVjdGlvbj0lbGRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbikpOworCQkJCQl9CisJCQkJCS8vT0xCQ0RldGVjdGlvbgorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJEaXNhYmxlT0xCQyIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCXN3aXRjaCAoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSkKKwkJCQkJCXsKKwkJCQkJCQljYXNlIDE6IC8vZGlzYWJsZSBPTEJDIERldGVjdGlvbgorCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5EaXNhYmxlT0xCQ0RldGVjdCA9IDE7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMDogLy9lbmFibGUgT0xCQyBEZXRlY3Rpb24KKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuRGlzYWJsZU9MQkNEZXRlY3QgPSAwOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5EaXNhYmxlT0xCQ0RldGVjdD0gMDsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJPTEJDRGV0ZWN0aW9uPSVsZFxuIiwgcEFkLT5Db21tb25DZmcuRGlzYWJsZU9MQkNEZXRlY3QpKTsKKwkJCQkJfQorCQkJCQkvL1R4UHJlYW1ibGUKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiVHhQcmVhbWJsZSIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCXN3aXRjaCAoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSkKKwkJCQkJCXsKKwkJCQkJCQljYXNlIFJ0ODAyXzExUHJlYW1ibGVTaG9ydDoKKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFJ0ODAyXzExUHJlYW1ibGVTaG9ydDsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSBSdDgwMl8xMVByZWFtYmxlTG9uZzoKKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUnQ4MDJfMTFQcmVhbWJsZUxvbmc7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhQcmVhbWJsZT0lbGRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUpKTsKKwkJCQkJfQorCQkJCQkvL1JUU1RocmVzaG9sZAorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJSVFNUaHJlc2hvbGQiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlSdHNUaHJlc2ggPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCQkJCQkJaWYoIChSdHNUaHJlc2ggPj0gMSkgJiYgKFJ0c1RocmVzaCA8PSBNQVhfUlRTX1RIUkVTSE9MRCkgKQorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCAgPSAoVVNIT1JUKVJ0c1RocmVzaDsKKwkJCQkJCWVsc2UKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPSBNQVhfUlRTX1RIUkVTSE9MRDsKKworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRTVGhyZXNob2xkPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQpKTsKKwkJCQkJfQorCQkJCQkvL0ZyYWdUaHJlc2hvbGQKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiRnJhZ1RocmVzaG9sZCIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCUZyYWdUaHJlc2ggPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCQkJCQkJcEFkLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9IEZBTFNFOworCisJCQkJCQlpZiAoRnJhZ1RocmVzaCA+IE1BWF9GUkFHX1RIUkVTSE9MRCB8fCBGcmFnVGhyZXNoIDwgTUlOX0ZSQUdfVEhSRVNIT0xEKQorCQkJCQkJeyAvL2lsbGVnYWwgRnJhZ1RocmVzaCBzbyB3ZSBzZXQgaXQgdG8gZGVmYXVsdAorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gTUFYX0ZSQUdfVEhSRVNIT0xEOworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBUUlVFOworCQkJCQkJfQorCQkJCQkJZWxzZSBpZiAoRnJhZ1RocmVzaCAlIDIgPT0gMSkKKwkJCQkJCXsKKwkJCQkJCQkvLyBUaGUgbGVuZ3RoIG9mIGVhY2ggZnJhZ21lbnQgc2hhbGwgYWx3YXlzIGJlIGFuIGV2ZW4gbnVtYmVyIG9mIG9jdGV0cywgZXhjZXB0IGZvciB0aGUgbGFzdCBmcmFnbWVudAorCQkJCQkJCS8vIG9mIGFuIE1TRFUgb3IgTU1QRFUsIHdoaWNoIG1heSBiZSBlaXRoZXIgYW4gZXZlbiBvciBhbiBvZGQgbnVtYmVyIG9mIG9jdGV0cy4KKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IChVU0hPUlQpKEZyYWdUaHJlc2ggLSAxKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IChVU0hPUlQpRnJhZ1RocmVzaDsKKwkJCQkJCX0KKwkJCQkJCS8vcEFkLT5Db21tb25DZmcuQWxsb3dGcmFnU2l6ZSA9IChwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCkgLSBMRU5HVEhfODAyXzExIC0gTEVOR1RIX0NSQzsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkZyYWdUaHJlc2hvbGQ9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkKSk7CisJCQkJCX0KKwkJCQkJLy9UeEJ1cnN0CisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlR4QnVyc3QiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisvLyNpZmRlZiBXSUZJX1RFU1QKKy8vCQkJCQkJcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBGQUxTRTsKKy8vI2Vsc2UKKwkJCQkJCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkgIC8vRW5hYmxlCisJCQkJCQkJcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBUUlVFOworCQkJCQkJZWxzZSAvL0Rpc2FibGUKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCA9IEZBTFNFOworLy8jZW5kaWYKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4QnVyc3Q9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0KSk7CisJCQkJCX0KKworI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKKwkJCQkJLy9Qa3RBZ2dyZWdhdGUKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiUGt0QWdncmVnYXRlIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworCQkJCQkJaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKSAgLy9FbmFibGUKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID0gVFJVRTsKKwkJCQkJCWVsc2UgLy9EaXNhYmxlCisJCQkJCQkJcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSA9IEZBTFNFOworI2lmZGVmIFBJR0dZQkFDS19TVVBQT1JUCisJCQkJCQlwQWQtPkNvbW1vbkNmZy5iUGlnZ3lCYWNrQ2FwYWJsZSA9IHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGU7CisjZW5kaWYgLy8gUElHR1lCQUNLX1NVUFBPUlQgLy8KKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBrdEFnZ3JlZ2F0ZT0lZFxuIiwgcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSkpOworCQkJCQl9CisjZWxzZQorCQkJCQlwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID0gRkFMU0U7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJQaWdneUJhY2tDYXBhYmxlID0gRkFMU0U7CisjZW5kaWYgLy8gQUdHUkVHQVRJT05fU1VQUE9SVCAvLworCisJCQkJCS8vIFdtbUNhcGFibGUKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQkJcnRtcF9yZWFkX3N0YV93bW1fcGFybXNfZnJvbV9maWxlKHBBZCwgdG1wYnVmLCBidWZmZXIpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJCQkJCS8vU2hvcnRTbG90CisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlNob3J0U2xvdCIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkgIC8vRW5hYmxlCisJCQkJCQkJcEFkLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUgPSBUUlVFOworCQkJCQkJZWxzZSAvL0Rpc2FibGUKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSA9IEZBTFNFOworCisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTaG9ydFNsb3Q9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lKSk7CisJCQkJCX0KKwkJCQkJLy9JRUVFODAyMTFICisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIklFRUU4MDIxMUgiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCSAgICBmb3IgKGkgPSAwLCBtYWNwdHIgPSByc3RydG9rKHRtcGJ1ZiwiOyIpOyBtYWNwdHI7IG1hY3B0ciA9IHJzdHJ0b2soTlVMTCwiOyIpLCBpKyspCisJCQkJCSAgICB7CisgICAgCQkJCQkJaWYoc2ltcGxlX3N0cnRvbChtYWNwdHIsIDAsIDEwKSAhPSAwKSAgLy9FbmFibGUKKyAgICAJCQkJCQkJcEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPSBUUlVFOworICAgIAkJCQkJCWVsc2UgLy9EaXNhYmxlCisgICAgCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID0gRkFMU0U7CisKKyAgICAJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRUVFODAyMTFIPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCkpOworCQkJCQkgICAgfQorCQkJCQl9CisJCQkJCS8vQ1NQZXJpb2QKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQ1NQZXJpb2QiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCSAgICBpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApICE9IDApCisJCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ1NQZXJpb2QgPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCQkJCQkJZWxzZQorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNTUGVyaW9kID0gMDsKKworICAgCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ1NQZXJpb2Q9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNTUGVyaW9kKSk7CisJCQkJCX0KKworCQkJCQkvL1JEUmVnaW9uCisJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlJEUmVnaW9uIiwgdG1wYnVmLCAxMjgsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJCWlmICgoc3RybmNtcCh0bXBidWYsICJKQVBfVzUzIiwgNykgPT0gMCkgfHwgKHN0cm5jbXAodG1wYnVmLCAiamFwX3c1MyIsIDcpID09IDApKQorCQkJCQkJeworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uID0gSkFQX1c1MzsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSA9IDE1OworCQkJCQkJfQorCQkJCQkJZWxzZSBpZiAoKHN0cm5jbXAodG1wYnVmLCAiSkFQX1c1NiIsIDcpID09IDApIHx8IChzdHJuY21wKHRtcGJ1ZiwgImphcF93NTYiLCA3KSA9PSAwKSkKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9IEpBUF9XNTY7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgPSAxMzsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgaWYgKChzdHJuY21wKHRtcGJ1ZiwgIkpBUCIsIDMpID09IDApIHx8IChzdHJuY21wKHRtcGJ1ZiwgImphcCIsIDMpID09IDApKQorCQkJCQkJeworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uID0gSkFQOworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkRmc1Nlc3Npb25UaW1lID0gNTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgIGlmICgoc3RybmNtcCh0bXBidWYsICJGQ0MiLCAzKSA9PSAwKSB8fCAoc3RybmNtcCh0bXBidWYsICJmY2MiLCAzKSA9PSAwKSkKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9IEZDQzsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSA9IDU7CisJCQkJCQl9CisJCQkJCQllbHNlIGlmICgoc3RybmNtcCh0bXBidWYsICJDRSIsIDIpID09IDApIHx8IChzdHJuY21wKHRtcGJ1ZiwgImNlIiwgMikgPT0gMCkpCisJCQkJCQl7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24gPSBDRTsKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSA9IDEzOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uID0gQ0U7CisJCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgPSAxMzsKKwkJCQkJCX0KKworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkRSZWdpb249JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uKSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9IENFOworCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgPSAxMzsKKwkJCQkJfQorCisJCQkJCS8vV2lyZWxlc3NFdmVudAorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJXaXJlbGVzc0V2ZW50IiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJeworI2lmIFdJUkVMRVNTX0VYVCA+PSAxNQorCQkJCQkgICAgaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKQorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50ID0gc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCA9IDA7CS8vIGRpc2FibGUKKyNlbHNlCisJCQkJCQlwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCA9IDA7CS8vIGRpc2FibGUKKyNlbmRpZgorICAgCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV2lyZWxlc3NFdmVudD0lZFxuIiwgcEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpKTsKKwkJCQkJfQorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJXaUZpVGVzdCIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCisJCQkJCXsKKwkJCQkJICAgIGlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iV2lGaVRlc3Q9IHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7CisJCQkJCQllbHNlCisJCQkJCQkJcEFkLT5Db21tb25DZmcuYldpRmlUZXN0ID0gMDsJLy8gZGlzYWJsZQorCisgICAJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXaUZpVGVzdD0lZFxuIiwgcEFkLT5Db21tb25DZmcuYldpRmlUZXN0KSk7CisJCQkJCX0KKwkJCQkJLy9BdXRoTW9kZQorCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJBdXRoTW9kZSIsIHRtcGJ1ZiwgMTI4LCBidWZmZXIpKQorCQkJCQl7CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQkJeworCQkJCQkJCWlmICgoc3RyY21wKHRtcGJ1ZiwgIldFUEFVVE8iKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIndlcGF1dG8iKSA9PSAwKSkKKwkJCQkJCQkgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoOworCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiU0hBUkVEIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJzaGFyZWQiKSA9PSAwKSkKKwkJCQkJCQkgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQ7CisJCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJXUEFQU0siKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIndwYXBzayIpID09IDApKQorCQkJCQkJCSAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzsKKwkJCQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIldQQU5PTkUiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIndwYW5vbmUiKSA9PSAwKSkKKwkJCQkJCQkgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOworCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiV1BBMlBTSyIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAid3BhMnBzayIpID09IDApKQorCQkJCQkJCSAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiV1BBIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJ3cGEiKSA9PSAwKSkKKwkJCQkJCQkgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEE7CisJCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJXUEEyIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJ3cGEyIikgPT0gMCkpCisJCQkJCQkJICAgIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMjsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjooRW5jcnlwVHlwZT0lZClcbiIsIF9fZnVuY19fLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMpKTsKKwkJCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCQkJfQorCQkJCQkvL0VuY3J5cFR5cGUKKwkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiRW5jcnlwVHlwZSIsIHRtcGJ1ZiwgMTI4LCBidWZmZXIpKQorCQkJCQl7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwkJCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJCQl7CisJCQkJCQkJaWYgKChzdHJjbXAodG1wYnVmLCAiV0VQIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJ3ZXAiKSA9PSAwKSkKKwkJCQkJCQkJcEFkLT5TdGFDZmcuV2VwU3RhdHVzCT0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisJCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJUS0lQIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJ0a2lwIikgPT0gMCkpCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLldlcFN0YXR1cwk9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJBRVMiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgImFlcyIpID09IDApKQorCQkJCQkJCQlwQWQtPlN0YUNmZy5XZXBTdGF0dXMJPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworCQkJCQkJCWVsc2UKKwkJCQkJCQkJcEFkLT5TdGFDZmcuV2VwU3RhdHVzCT0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCisJCQkJCQkJLy8gVXBkYXRlIGFsbCB3ZXBzdGF0dXMgcmVsYXRlZAorCQkJCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIJCT0gcEFkLT5TdGFDZmcuV2VwU3RhdHVzOworCQkJCQkJCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyIAk9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKKwkJCQkJCQlwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzIAk9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKKwkJCQkJCQlwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyIAkJPSBGQUxTRTsKKworCQkJCQkJCS8vUlRNUE1ha2VSU05JRShwQWQsIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMsIDApOworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjooRW5jcnlwVHlwZT0lZClcbiIsIF9fZnVuY19fLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMpKTsKKwkJCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKwkJCQkJfQorCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQkJCQl7CisJCQkJCQlpZihSVE1QR2V0Q3JpdGljYWxQYXJhbWV0ZXIoIldQQVBTSyIsIHRtcGJ1ZiwgNTEyLCBidWZmZXIpKQorCQkJCQkJeworCQkJCQkJCWludCAgICAgZXJyPTA7CisKKwkJCQkJCQl0bXBidWZbc3RybGVuKHRtcGJ1ZildID0gJ1wwJzsgLy8gbWFrZSBTVEEgY2FuIHByb2Nlc3MgLiReJiBmb3IgV1BBUFNLIGlucHV0CisKKwkJCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgJiYKKwkJCQkJCQkJKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spICYmCisJCQkJCQkJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorCQkJCQkJCQkpCisJCQkJCQkJeworCQkJCQkJCQllcnIgPSAxOworCQkJCQkJCX0KKwkJCQkJCQllbHNlIGlmICgoc3RybGVuKHRtcGJ1ZikgPj0gOCkgJiYgKHN0cmxlbih0bXBidWYpIDwgNjQpKQorCQkJCQkJCXsKKwkJCQkJCQkJUGFzc3dvcmRIYXNoKChjaGFyICopdG1wYnVmLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLCBrZXlNYXRlcmlhbCk7CisJCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlBNSywga2V5TWF0ZXJpYWwsIDMyKTsKKworCQkJCQkJCX0KKwkJCQkJCQllbHNlIGlmIChzdHJsZW4odG1wYnVmKSA9PSA2NCkKKwkJCQkJCQl7CisJCQkJCQkJCUF0b0godG1wYnVmLCBrZXlNYXRlcmlhbCwgMzIpOworCQkJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5QTUssIGtleU1hdGVyaWFsLCAzMik7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCWVyciA9IDE7CisJCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOjooV1BBUFNLIGtleS1zdHJpbmcgcmVxdWlyZWQgOCB+IDY0IGNoYXJhY3RlcnMhKVxuIiwgX19mdW5jX18pKTsKKwkJCQkJCQl9CisKKwkJCQkJCQlpZiAoZXJyID09IDApCisJICAgICAgICAgICAgICAgICAgICAgICAgCQkJeworCSAgICAgICAgICAgICAgICAgICAgICAgIAkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKKwkJCQkJCQkJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKKwkJCQkJCQkJeworCQkJCQkJCQkJLy8gU3RhcnQgU1RBIHN1cHBsaWNhbnQgc3RhdGUgbWFjaGluZQorCQkJCQkJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19TVEFSVDsKKwkJCQkJCQkJfQorCQkJCQkJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorCQkJCQkJCQl7CisJLyoKKwkJCQkJCQkJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVswXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKwkJCQkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IExFTl9US0lQX0VLOworCQkJCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBwQWQtPlN0YUNmZy5QTUssIExFTl9US0lQX0VLKTsKKwkJCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCAmcEFkLT5TdGFDZmcuUE1LWzE2XSwgTEVOX1RLSVBfUlhNSUNLKTsKKwkJCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLCAmcEFkLT5TdGFDZmcuUE1LWzE2XSwgTEVOX1RLSVBfVFhNSUNLKTsKKworCQkJCQkJCQkJLy8gRGVjaWRlIGl0cyBDaGlwZXJBbGcKKwkJCQkJCQkJCWlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJCQkJCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7CisJCQkJCQkJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCQkJCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKwkJCQkJCQkJCWVsc2UKKwkJCQkJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkqLworCQkJCQkJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7CisJCQkJCQkJCX0KKworCQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6KFdQQVBTSz0lcylcbiIsIF9fZnVuY19fLCB0bXBidWYpKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCQkJCQkvL0RlZmF1bHRLZXlJRCwgS2V5VHlwZSwgS2V5U3RyCisJCQkJCXJ0bXBfcmVhZF9rZXlfcGFybXNfZnJvbV9maWxlKHBBZCwgdG1wYnVmLCBidWZmZXIpOworCisKKwkJCQkJLy9IU0NvdW50ZXIKKwkJCQkJLyppZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJIU0NvdW50ZXIiLCB0bXBidWYsIDEwLCBidWZmZXIpKQorCQkJCQl7CisJCQkJCQlzd2l0Y2ggKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkpCisJCQkJCQl7CisJCQkJCQkJY2FzZSAxOiAvL0VuYWJsZQorCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iRW5hYmxlSFNDb3VudGVyID0gVFJVRTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAwOiAvL0Rpc2FibGUKKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iRW5hYmxlSFNDb3VudGVyID0gRkFMU0U7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICJIU0NvdW50ZXI9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVIU0NvdW50ZXIpOworCQkJCQl9Ki8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCQlIVFBhcmFtZXRlcnNIb29rKHBBZCwgdG1wYnVmLCBidWZmZXIpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisKKyNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCisJCQkJCQkvL0NhcnJpZXJEZXRlY3QKKwkJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkNhcnJpZXJEZXRlY3QiLCB0bXBidWYsIDEyOCwgYnVmZmVyKSkKKwkJCQkJCXsKKwkJCQkJCQlpZiAoKHN0cm5jbXAodG1wYnVmLCAiMCIsIDEpID09IDApKQorCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9IEZBTFNFOworCQkJCQkJCWVsc2UgaWYgKChzdHJuY21wKHRtcGJ1ZiwgIjEiLCAxKSA9PSAwKSkKKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPSBUUlVFOworCQkJCQkJCWVsc2UKKwkJCQkJCQkJcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPSBGQUxTRTsKKworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNhcnJpZXJEZXRlY3QuRW5hYmxlPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSkpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID0gRkFMU0U7CisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCisJCQkJCXsKKwkJCQkJCS8vUFNNb2RlCisJCQkJCQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiUFNNb2RlIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJCXsKKwkJCQkJCQlpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfSU5GUkEpCisJCQkJCQkJeworCQkJCQkJCQlpZiAoKHN0cmNtcCh0bXBidWYsICJNQVhfUFNQIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJtYXhfcHNwIikgPT0gMCkpCisJCQkJCQkJCXsKKwkJCQkJCQkJCS8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tGb3JQc21DaGFuZ2UoKQorCQkJCQkJCQkJLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCisJCQkJCQkJCQkvLwkgICBNbG1lU2V0UHNtKHBBZCwgUFdSX1NBVkUpOworCQkJCQkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7CisJCQkJCQkJCQlpZiAocEFkLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKKwkJCQkJCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1A7CisJCQkJCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQOworCQkJCQkJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gNTsKKwkJCQkJCQkJfQorCQkJCQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIkZhc3RfUFNQIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJmYXN0X3BzcCIpID09IDApCisJCQkJCQkJCQl8fCAoc3RyY21wKHRtcGJ1ZiwgIkZBU1RfUFNQIikgPT0gMCkpCisJCQkJCQkJCXsKKwkJCQkJCQkJCS8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tGb3JQc21DaGFuZ2UoKQorCQkJCQkJCQkJLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCisJCQkJCQkJCQkvLwkgICBNbG1lU2V0UHNtQml0KHBBZCwgUFdSX1NBVkUpOworCQkJCQkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7CisJCQkJCQkJCQlpZiAocEFkLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKKwkJCQkJCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQOworCQkJCQkJCQkJcEFkLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1A7CisJCQkJCQkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSAzOworCQkJCQkJCQl9CisJCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiTGVnYWN5X1BTUCIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAibGVnYWN5X3BzcCIpID09IDApCisJCQkJCQkJCQl8fCAoc3RyY21wKHRtcGJ1ZiwgIkxFR0FDWV9QU1AiKSA9PSAwKSkKKwkJCQkJCQkJeworCQkJCQkJCQkJLy8gZG8gTk9UIHR1cm4gb24gUFNNIGJpdCBoZXJlLCB3YWl0IHVudGlsIE1sbWVDaGVja0ZvclBzbUNoYW5nZSgpCisJCQkJCQkJCQkvLyB0byBleGNsdWRlIGNlcnRhaW4gc2l0dWF0aW9ucy4KKwkJCQkJCQkJCS8vCSAgIE1sbWVTZXRQc21CaXQocEFkLCBQV1JfU0FWRSk7CisJCQkJCQkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKKwkJCQkJCQkJCWlmIChwQWQtPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQorCQkJCQkJCQkJCXBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlTGVnYWN5X1BTUDsKKwkJCQkJCQkJCXBBZC0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1A7CisJCQkJCQkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSAzOworCQkJCQkJCQl9CisJCQkJCQkJCWVsc2UKKwkJCQkJCQkJeyAvL0RlZmF1bHQgTmRpczgwMl8xMVBvd2VyTW9kZUNBTQorCQkJCQkJCQkJLy8gY2xlYXIgUFNNIGJpdCBpbW1lZGlhdGVseQorCQkJCQkJCQkJTWxtZVNldFBzbUJpdChwQWQsIFBXUl9BQ1RJVkUpOworCQkJCQkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7CisJCQkJCQkJCQlpZiAocEFkLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKKwkJCQkJCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTTsKKwkJCQkJCQkJCXBBZC0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTTsKKwkJCQkJCQkJfQorCQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQU01vZGU9JWxkXG4iLCBwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlKSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJLy8gRmFzdFJvYW1pbmcKKwkJCQkJCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJGYXN0Um9hbWluZyIsIHRtcGJ1ZiwgMzIsIGJ1ZmZlcikpCisJCQkJCQl7CisJCQkJCQkJaWYgKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgPT0gMCkKKwkJCQkJCQkJcEFkLT5TdGFDZmcuYkZhc3RSb2FtaW5nID0gRkFMU0U7CisJCQkJCQkJZWxzZQorCQkJCQkJCQlwQWQtPlN0YUNmZy5iRmFzdFJvYW1pbmcgPSBUUlVFOworCisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRmFzdFJvYW1pbmc9JWRcbiIsIHBBZC0+U3RhQ2ZnLmJGYXN0Um9hbWluZykpOworCQkJCQkJfQorCQkJCQkJLy8gUm9hbVRocmVzaG9sZAorCQkJCQkJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlJvYW1UaHJlc2hvbGQiLCB0bXBidWYsIDMyLCBidWZmZXIpKQorCQkJCQkJeworCQkJCQkJCWxvbmcgbEluZm8gPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOworCisJCQkJCQkJaWYgKGxJbmZvID4gOTAgfHwgbEluZm8gPCA2MCkKKwkJCQkJCQkJcEFkLT5TdGFDZmcuZEJtVG9Sb2FtID0gLTcwOworCQkJCQkJCWVsc2UKKwkJCQkJCQkJcEFkLT5TdGFDZmcuZEJtVG9Sb2FtID0gKENIQVIpKC0xKSpsSW5mbzsKKworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJvYW1UaHJlc2hvbGQ9JWQgIGRCbVxuIiwgcEFkLT5TdGFDZmcuZEJtVG9Sb2FtKSk7CisJCQkJCQl9CisKKwkJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlRHbldpZmlUZXN0IiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKKwkJCQkJCXsKKwkJCQkJCQlpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApID09IDApCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCA9IEZBTFNFOworCQkJCQkJCWVsc2UKKwkJCQkJCQkJcEFkLT5TdGFDZmcuYlRHbldpZmlUZXN0ID0gVFJVRTsKKwkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVEduV2lmaVRlc3Q9JWRcbiIsIHBBZC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCkpOworCQkJCQkJfQorCQkJCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworCisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiAlcyBkb2VzIG5vdCBoYXZlIGEgd3JpdGUgbWV0aG9kXG4iLCBzcmMpKTsKKwkJCX0KKworCQkJcmV0dmFsPWZpbHBfY2xvc2Uoc3JjZixOVUxMKTsKKworCQkJaWYgKHJldHZhbCkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gRXJyb3IgJWQgY2xvc2luZyAlc1xuIiwgLXJldHZhbCwgc3JjKSk7CisJCQl9CisJCX0KKwl9CisKKwlzZXRfZnMob3JnZnMpOworI2lmIDAKKwljdXJyZW50LT5mc3VpZCA9IG9yZ2ZzdWlkOworCWN1cnJlbnQtPmZzZ2lkID0gb3JnZnNnaWQ7CisjZW5kaWYKKworCWtmcmVlKGJ1ZmZlcik7CisJa2ZyZWUodG1wYnVmKTsKKworCXJldHVybiAoTkRJU19TVEFUVVNfU1VDQ0VTUyk7Cit9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK3N0YXRpYyB2b2lkCUhUUGFyYW1ldGVyc0hvb2soCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JQ0hBUgkJICAqcFZhbHVlU3RyLAorCUlOCUNIQVIJCSAgKnBJbnB1dCkKK3sKKworCUlOVCBWYWx1ZTsKKworICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9QUk9URUNUIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKyAgICB7CisgICAgICAgIFZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKyAgICAgICAgaWYgKFZhbHVlID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QgPSBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QgPSBUUlVFOworICAgICAgICB9CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBQcm90ZWN0aW9uICA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSIpKTsKKyAgICB9CisKKyAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfTUlNT1BTRW5hYmxlIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKyAgICB7CisgICAgICAgIFZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKyAgICAgICAgaWYgKFZhbHVlID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUgPSBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUgPSBUUlVFOworICAgICAgICB9CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBNSU1PUFNFbmFibGUgID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlIikpOworICAgIH0KKworCisgICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX01JTU9QU01vZGUiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorICAgIHsKKyAgICAgICAgVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworICAgICAgICBpZiAoVmFsdWUgPiBNTVBTX0VOQUJMRSkKKyAgICAgICAgeworCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gTU1QU19FTkFCTEU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvL1RPRE86IGFkZCBtaW1vIHBvd2VyIHNhdmluZyBtZWNoYW5pc20KKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSA9IE1NUFNfRU5BQkxFOworCQkJLy9wQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSBWYWx1ZTsKKyAgICAgICAgfQorICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogTUlNT1BTIE1vZGUgID0gJWRcbiIsIFZhbHVlKSk7CisgICAgfQorCisgICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0JBRGVjbGluZSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisgICAgeworICAgICAgICBWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisgICAgICAgIGlmIChWYWx1ZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iQkFEZWNsaW5lID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iQkFEZWNsaW5lID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogQkEgRGVjbGluZSAgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUiKSk7CisgICAgfQorCisKKyAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfRGlzYWJsZVJlb3JkZXJpbmciLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQorICAgIHsKKyAgICAgICAgVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOworICAgICAgICBpZiAoVmFsdWUgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYkRpc2FibGVSZW9yZGVyaW5nID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iRGlzYWJsZVJlb3JkZXJpbmcgPSBUUlVFOworICAgICAgICB9CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBEaXNhYmxlUmVvcmRlcmluZyAgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUiKSk7CisgICAgfQorCisgICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0F1dG9CQSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisgICAgeworICAgICAgICBWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisgICAgICAgIGlmIChWYWx1ZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQTsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IEF1dG8gQkEgID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlIikpOworICAgIH0KKworCS8vIFR4XytIVEMgZnJhbWUKKyAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfSFRDIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKwl7CisJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKwkJaWYgKFZhbHVlID09IDApCisJCXsKKwkJCXBBZC0+SFRDRW5hYmxlID0gRkFMU0U7CisJCX0KKwkJZWxzZQorCQl7CisgICAgICAgICAgICAJCXBBZC0+SFRDRW5hYmxlID0gVFJVRTsKKwkJfQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogVHggK0hUQyBmcmFtZSA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSIpKTsKKwl9CisKKwkvLyBFbmFibGUgSFQgTGluayBBZGFwdGF0aW9uIENvbnRyb2wKKwlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfTGlua0FkYXB0IiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKwl7CisJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKwkJaWYgKFZhbHVlID09IDApCisJCXsKKwkJCXBBZC0+YkxpbmtBZGFwdCA9IEZBTFNFOworCQl9CisJCWVsc2UKKwkJeworCQkJcEFkLT5IVENFbmFibGUgPSBUUlVFOworCQkJcEFkLT5iTGlua0FkYXB0ID0gVFJVRTsKKwkJfQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogTGluayBBZGFwdGF0aW9uIENvbnRyb2wgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUoK0hUQykiKSk7CisJfQorCisJLy8gUmV2ZXJzZSBEaXJlY3Rpb24gTWVjaGFuaXNtCisgICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX1JERyIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisJeworCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisJCWlmIChWYWx1ZSA9PSAwKQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5iUmRnID0gRkFMU0U7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwQWQtPkhUQ0VuYWJsZSA9IFRSVUU7CisgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iUmRnID0gVFJVRTsKKwkJfQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogUkRHID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlKCtIVEMpIikpOworCX0KKworCisKKworCS8vIFR4IEEtTVNVRCA/CisgICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0FNU0RVIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKwl7CisJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKwkJaWYgKFZhbHVlID09IDApCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZSA9IEZBTFNFOworCQl9CisJCWVsc2UKKwkJeworICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1RW5hYmxlID0gVFJVRTsKKwkJfQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogVHggQS1NU0RVID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlIikpOworCX0KKworCS8vIE1QRFUgRGVuc2l0eQorICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9NcGR1RGVuc2l0eSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisJeworCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisJCWlmIChWYWx1ZSA8PTcgJiYgVmFsdWUgPj0gMCkKKwkJeworCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gVmFsdWU7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogTVBEVSBEZW5zaXR5ID0gJWRcbiIsIFZhbHVlKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkgPSA0OworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IE1QRFUgRGVuc2l0eSA9ICVkIChEZWZhdWx0KVxuIiwgNCkpOworCQl9CisJfQorCisJLy8gTWF4IFJ4IEJBIFdpbmRvdyBTaXplCisgICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0JBV2luU2l6ZSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisJeworCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisKKwkJaWYgKFZhbHVlID49MSAmJiBWYWx1ZSA8PSA2NCkKKwkJeworCQkJcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IFZhbHVlOworCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IFZhbHVlOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IEJBIFdpbmR3IFNpemUgPSAlZFxuIiwgVmFsdWUpKTsKKwkJfQorCQllbHNlCisJCXsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSA2NDsKKwkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSA2NDsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBCQSBXaW5kdyBTaXplID0gNjQgKERlZnVhbHQpXG4iKSk7CisJCX0KKworCX0KKworCS8vIEd1YXJkIEludGVydmFsCisJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0dJIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKwl7CisJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKworCQlpZiAoVmFsdWUgPT0gR0lfNDAwKQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSSA9IEdJXzQwMDsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJID0gR0lfODAwOworCQl9CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IEd1YXJkIEludGVydmFsID0gJXNcbiIsIChWYWx1ZT09R0lfNDAwKSA/ICI0MDAiIDogIjgwMCIgKSk7CisJfQorCisJLy8gSFQgT3BlcmF0aW9uIE1vZGUgOiBNaXhlZCBNb2RlICwgR3JlZW4gRmllbGQKKwlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfT3BNb2RlIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKwl7CisJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKworCQlpZiAoVmFsdWUgPT0gSFRNT0RFX0dGKQorCQl7CisKKwkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREUgID0gSFRNT0RFX0dGOworCQl9CisJCWVsc2UKKwkJeworCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERSAgPSBIVE1PREVfTU07CisJCX0KKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogT3BlcmF0ZSBNb2RlID0gJXNcbiIsIChWYWx1ZT09SFRNT0RFX0dGKSA/ICJHcmVlbiBGaWVsZCIgOiAiTWl4ZWQgTW9kZSIgKSk7CisJfQorCisJLy8gRml4ZWQgVHggbW9kZSA6IENDSywgT0ZETQorCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJGaXhlZFR4TW9kZSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisJeworCQlVQ0hBUglmaXhfdHhfbW9kZTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQlmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9IVDsKKworCQkJaWYgKHN0cmNtcChwVmFsdWVTdHIsICJPRkRNIikgPT0gMCB8fCBzdHJjbXAocFZhbHVlU3RyLCAib2ZkbSIpID09IDApCisJCQl7CisJCQkJZml4X3R4X21vZGUgPSBGSVhFRF9UWE1PREVfT0ZETTsKKwkJCX0KKwkJCWVsc2UgaWYgKHN0cmNtcChwVmFsdWVTdHIsICJDQ0siKSA9PSAwIHx8IHN0cmNtcChwVmFsdWVTdHIsICJjY2siKSA9PSAwKQorCQkJeworCQkgICAgICAgIGZpeF90eF9tb2RlID0gRklYRURfVFhNT0RFX0NDSzsKKwkJCX0KKwkJCWVsc2UgaWYgKHN0cmNtcChwVmFsdWVTdHIsICJIVCIpID09IDAgfHwgc3RyY21wKHBWYWx1ZVN0ciwgImh0IikgPT0gMCkKKwkJCXsKKwkJICAgICAgICBmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9IVDsKKwkJfQorCQllbHNlCisJCXsKKwkJCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisJCQkJLy8gMSA6IENDSworCQkJCS8vIDIgOiBPRkRNCisJCQkJLy8gb3RoZXJ3aXNlIDogSFQKKwkJCQlpZiAoVmFsdWUgPT0gRklYRURfVFhNT0RFX0NDSyB8fCBWYWx1ZSA9PSBGSVhFRF9UWE1PREVfT0ZETSkKKwkJCQkJZml4X3R4X21vZGUgPSBWYWx1ZTsKKwkJCQllbHNlCisJCQkJCWZpeF90eF9tb2RlID0gRklYRURfVFhNT0RFX0hUOworCQl9CisKKwkJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGUgPSBmaXhfdHhfbW9kZTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkZpeGVkIFR4IE1vZGUgPSAlZFxuIiwgZml4X3R4X21vZGUpKTsKKworCQl9CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJfQorCisKKwkvLyBDaGFubmVsIFdpZHRoCisJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0JXIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKwl7CisJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKworCQlpZiAoVmFsdWUgPT0gQldfNDApCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPSBCV180MDsKKwkJfQorCQllbHNlCisJCXsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPSBCV18yMDsKKwkJfQorCisjaWZkZWYgTUNBU1RfUkFURV9TUEVDSUZJQworCQlwQWQtPkNvbW1vbkNmZy5NQ2FzdFBoeU1vZGUuZmllbGQuQlcgPSBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlc7CisjZW5kaWYgLy8gTUNBU1RfUkFURV9TUEVDSUZJQyAvLworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBDaGFubmVsIFdpZHRoID0gJXNcbiIsIChWYWx1ZT09QldfNDApID8gIjQwIE1IeiIgOiAiMjAgTUh6IiApKTsKKwl9CisKKwlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfRVhUQ0hBIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKKwl7CisJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKKworCQlpZiAoVmFsdWUgPT0gMCkKKwkJeworCisJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBICA9IEVYVENIQV9CRUxPVzsKKwkJfQorCQllbHNlCisJCXsKKyAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfQUJPVkU7CisJCX0KKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogRXh0IENoYW5uZWwgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJCRUxPVyIgOiAiQUJPVkUiICkpOworCX0KKworCS8vIE1TQworCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9NQ1MiLCBwVmFsdWVTdHIsIDUwLCBwSW5wdXQpKQorCXsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQorCQl7CisJCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisKKy8vCQkJaWYgKChWYWx1ZSA+PSAwICYmIFZhbHVlIDw9IDE1KSB8fCAoVmFsdWUgPT0gMzIpKQorCQkJaWYgKChWYWx1ZSA+PSAwICYmIFZhbHVlIDw9IDIzKSB8fCAoVmFsdWUgPT0gMzIpKSAvLyAzKjMKKwkJeworCQkJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICA9IFZhbHVlOworCQkJCXBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gRkFMU0U7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IE1DUyA9ICVkXG4iLCBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUykpOworCQl9CisJCWVsc2UKKwkJeworCQkJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICA9IE1DU19BVVRPOworCQkJCXBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gVFJVRTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogTUNTID0gQVVUT1xuIikpOworCQl9CisJfQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCX0KKworCS8vIFNUQkMKKyAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfU1RCQyIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisJeworCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisJCWlmIChWYWx1ZSA9PSBTVEJDX1VTRSkKKwkJeworCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkMgPSBTVEJDX1VTRTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDID0gU1RCQ19OT05FOworCQl9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBTVEJDID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDKSk7CisJfQorCisJLy8gNDBfTWh6X0ludG9sZXJhbnQKKwlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfNDBNSFpfSU5UT0xFUkFOVCIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCisJeworCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7CisJCWlmIChWYWx1ZSA9PSAwKQorCQl7CisJCQlwQWQtPkNvbW1vbkNmZy5iRm9ydHlfTWh6X0ludG9sZXJhbnQgPSBGQUxTRTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBBZC0+Q29tbW9uQ2ZnLmJGb3J0eV9NaHpfSW50b2xlcmFudCA9IFRSVUU7CisJCX0KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IDQwTUhaIElOVE9MRVJBTlQgPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuYkZvcnR5X01oel9JbnRvbGVyYW50KSk7CisJfQorCS8vSFRfVHhTdHJlYW0KKwlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9UeFN0cmVhbSIsIHBWYWx1ZVN0ciwgMTAsIHBJbnB1dCkpCisJeworCQlzd2l0Y2ggKHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCkpCisJCXsKKwkJCWNhc2UgMToKKwkJCQlwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJcEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPSAyOworCQkJCWJyZWFrOworCQkJY2FzZSAzOiAvLyAzKjMKKwkJCWRlZmF1bHQ6CisJCQkJcEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPSAzOworCisJCQkJaWYgKHBBZC0+TUFDVmVyc2lvbiA8IFJBTElOS18yODgzX1ZFUlNJT04pCisJCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID0gMjsgLy8gb25seSAyIHR4IHN0cmVhbXMgZm9yIFJUMjg2MCBzZXJpZXMKKwkJCQlicmVhazsKKwkJfQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogVHggU3RyZWFtID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtKSk7CisJfQorCS8vSFRfUnhTdHJlYW0KKwlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9SeFN0cmVhbSIsIHBWYWx1ZVN0ciwgMTAsIHBJbnB1dCkpCisJeworCQlzd2l0Y2ggKHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCkpCisJCXsKKwkJCWNhc2UgMToKKwkJCQlwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSAyOworCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJZGVmYXVsdDoKKwkJCQlwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA9IDM7CisKKwkJCQlpZiAocEFkLT5NQUNWZXJzaW9uIDwgUkFMSU5LXzI4ODNfVkVSU0lPTikKKwkJCQkJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSAyOyAvLyBvbmx5IDIgcnggc3RyZWFtcyBmb3IgUlQyODYwIHNlcmllcworCQkJCWJyZWFrOworCQl9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBSeCBTdHJlYW0gPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuUnhTdHJlYW0pKTsKKwl9CisKK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydG1wLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0bXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmE0Nzg0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydG1wLmgKQEAgLTAsMCArMSw3NTg2IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorICAgIHJ0bXAuaAorCisgICAgQWJzdHJhY3Q6CisgICAgTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFBhdWwgTGluICAgIDIwMDItMDgtMDEgICAgY3JlYXRlZAorICAgIEphbWVzIFRhbiAgIDIwMDItMDktMDYgICAgbW9kaWZpZWQgKFJldmlzZSBOVENSZWdUYWJsZSkKKyAgICBKb2huIENoYW5nICAyMDA0LTA5LTA2ICAgIG1vZGlmaWVkIGZvciBSVDI2MDAKKyovCisjaWZuZGVmIF9fUlRNUF9IX18KKyNkZWZpbmUgX19SVE1QX0hfXworCisjaW5jbHVkZSAibGlua19saXN0LmgiCisjaW5jbHVkZSAic3BlY3RydW1fZGVmLmgiCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2luY2x1ZGUgImFpcm9uZXQuaCIKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworLy8jZGVmaW5lIERCRwkJMQorCisvLyNkZWZpbmUgREJHX0RJQUdOT1NFCQkxCisKKyNpZiBkZWZpbmVkKENPTkZJR19BUF9TVVBQT1JUKSAmJiBkZWZpbmVkKENPTkZJR19TVEFfU1VQUE9SVCkKKyNkZWZpbmUgSUZfREVWX0NPTkZJR19PUE1PREVfT05fQVAoX3BBZCkJaWYoX3BBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkKKyNkZWZpbmUgSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKF9wQWQpCWlmKF9wQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorI2Vsc2UKKyNkZWZpbmUgSUZfREVWX0NPTkZJR19PUE1PREVfT05fQVAoX3BBZCkKKyNkZWZpbmUgSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKF9wQWQpCisjZW5kaWYKKworI2RlZmluZSBWSVJUVUFMX0lGX0lOQyhfX3BBZCkgKChfX3BBZCktPlZpcnR1YWxJZkNudCsrKQorI2RlZmluZSBWSVJUVUFMX0lGX0RFQyhfX3BBZCkgKChfX3BBZCktPlZpcnR1YWxJZkNudC0tKQorI2RlZmluZSBWSVJUVUFMX0lGX05VTShfX3BBZCkgKChfX3BBZCktPlZpcnR1YWxJZkNudCkKKworI2lmZGVmIFJUMjg3MAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVGhlIFRYX0JVRkZFUiBzdHJ1Y3R1cmUgZm9ybXMgdGhlIHRyYW5zbWl0dGVkIFVTQiBwYWNrZXQgdG8gdGhlIGRldmljZQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwordHlwZWRlZiBzdHJ1Y3QgX19UWF9CVUZGRVJ7CisJdW5pb24JeworCQlVQ0hBUgkJCVdpcmVsZXNzUGFja2V0W1RYX0JVRkZFUl9OT1JNU0laRV07CisJCUhFQURFUl84MDJfMTEJTnVsbEZyYW1lOworCQlQU1BPTExfRlJBTUUJUHNQb2xsUGFja2V0OworCQlSVFNfRlJBTUUJCVJUU0ZyYW1lOworCX1maWVsZDsKKwlVQ0hBUgkJCUFnZ3JlZ2F0aW9uWzRdOyAgLy9CdWZmZXIgZm9yIHNhdmUgQWdncmVnYXRpb24gc2l6ZS4KK30gVFhfQlVGRkVSLCAqUFRYX0JVRkZFUjsKKwordHlwZWRlZiBzdHJ1Y3QgX19IVFRYX0JVRkZFUnsKKwl1bmlvbgl7CisJCVVDSEFSCQkJV2lyZWxlc3NQYWNrZXRbTUFYX1RYQlVMS19TSVpFXTsKKwkJSEVBREVSXzgwMl8xMQlOdWxsRnJhbWU7CisJCVBTUE9MTF9GUkFNRQlQc1BvbGxQYWNrZXQ7CisJCVJUU19GUkFNRQkJUlRTRnJhbWU7CisJfWZpZWxkOworCVVDSEFSCQkJQWdncmVnYXRpb25bNF07ICAvL0J1ZmZlciBmb3Igc2F2ZSBBZ2dyZWdhdGlvbiBzaXplLgorfSBIVFRYX0JVRkZFUiwgKlBIVFRYX0JVRkZFUjsKKworCisvLyB1c2VkIHRvIHRyYWNrIGRyaXZlci1nZW5lcmF0ZWQgd3JpdGUgaXJwcwordHlwZWRlZiBzdHJ1Y3QgX1RYX0NPTlRFWFQKK3sKKwlQVk9JRAkJCXBBZDsJCS8vSW5pdGlhbGl6ZWQgaW4gTWluaXBvcnRJbml0aWFsaXplCisJUFVSQgkJCXBVcmI7CQkJLy9Jbml0aWFsaXplZCBpbiBNaW5pcG9ydEluaXRpYWxpemUKKwlQSVJQCQkJcElycDsJCQkvL3VzZWQgdG8gY2FuY2VsIHBlbmRpbmcgYnVsayBvdXQuCisJCQkJCQkJCQkvL0luaXRpYWxpemVkIGluIE1pbmlwb3J0SW5pdGlhbGl6ZQorCVBUWF9CVUZGRVIJCVRyYW5zZmVyQnVmZmVyOwkvL0luaXRpYWxpemVkIGluIE1pbmlwb3J0SW5pdGlhbGl6ZQorCVVMT05HCQkJQnVsa091dFNpemU7CisJVUNIQVIJCQlCdWxrT3V0UGlwZUlkOworCVVDSEFSCQkJU2VsZklkeDsKKwlCT09MRUFOCQkJSW5Vc2U7CisJQk9PTEVBTgkJCWJXYWl0aW5nQnVsa091dDsgLy8gYXQgbGVhc3Qgb25lIHBhY2tldCBpcyBpbiB0aGlzIFR4Q29udGV4dCwgcmVhZHkgZm9yIG1ha2luZyBJUlAgYW55dGltZS4KKwlCT09MRUFOCQkJYkZ1bGxGb3JCdWxrT3V0OyAvLyBhbGwgdHggYnVmZmVyIGFyZSBmdWxsICwgc28gd2FpdGluZyBmb3IgdHggYnVsa291dC4KKwlCT09MRUFOCQkJSVJQUGVuZGluZzsKKwlCT09MRUFOCQkJTGFzdE9uZTsKKwlCT09MRUFOCQkJYkFnZ3JlZ2F0aWJsZTsKKwlVQ0hBUgkJCUhlYWRlcl84MDJfM1tMRU5HVEhfODAyXzNdOworCVVDSEFSCQkJUnN2WzJdOworCVVMT05HCQkJRGF0YU9mZnNldDsKKwlVSU5UCQkJVHhSYXRlOworCWRtYV9hZGRyX3QJCWRhdGFfZG1hOwkJLy8gdXJiIGRtYSBvbiBsaW51eAorCit9CVRYX0NPTlRFWFQsICpQVFhfQ09OVEVYVCwgKipQUFRYX0NPTlRFWFQ7CisKKworLy8gdXNlZCB0byB0cmFjayBkcml2ZXItZ2VuZXJhdGVkIHdyaXRlIGlycHMKK3R5cGVkZWYgc3RydWN0IF9IVF9UWF9DT05URVhUCit7CisJUFZPSUQJCQlwQWQ7CQkvL0luaXRpYWxpemVkIGluIE1pbmlwb3J0SW5pdGlhbGl6ZQorCVBVUkIJCQlwVXJiOwkJCS8vSW5pdGlhbGl6ZWQgaW4gTWluaXBvcnRJbml0aWFsaXplCisJUElSUAkJCXBJcnA7CQkJLy91c2VkIHRvIGNhbmNlbCBwZW5kaW5nIGJ1bGsgb3V0LgorCQkJCQkJCQkJLy9Jbml0aWFsaXplZCBpbiBNaW5pcG9ydEluaXRpYWxpemUKKwlQSFRUWF9CVUZGRVIJVHJhbnNmZXJCdWZmZXI7CS8vSW5pdGlhbGl6ZWQgaW4gTWluaXBvcnRJbml0aWFsaXplCisJVUxPTkcJCQlCdWxrT3V0U2l6ZTsJLy8gSW5kaWNhdGUgdGhlIHRvdGFsIGJ1bGstb3V0IHNpemUgaW4gYnl0ZXMgaW4gb25lIGJ1bGstdHJhbnNtaXNzaW9uCisJVUNIQVIJCQlCdWxrT3V0UGlwZUlkOworCUJPT0xFQU4JCQlJUlBQZW5kaW5nOworCUJPT0xFQU4JCQlMYXN0T25lOworCUJPT0xFQU4JCQliQ3VyV3JpdGluZzsKKwlCT09MRUFOCQkJYlJpbmdFbXB0eTsKKwlCT09MRUFOCQkJYkNvcHlTYXZlUGFkOworCVVDSEFSCQkJU2F2ZWRQYWRbOF07CisJVUNIQVIJCQlIZWFkZXJfODAyXzNbTEVOR1RIXzgwMl8zXTsKKwlVTE9ORwkJCUN1cldyaXRlUG9zaXRpb247CQkvLyBJbmRpY2F0ZSB0aGUgYnVmZmVyIG9mZnNldCB3aGljaCBwYWNrZXQgd2lsbCBiZSBpbnNlcnRlZCBzdGFydCBmcm9tLgorCVVMT05HCQkJQ3VyV3JpdGVSZWFsUG9zOwkJLy8gSW5kaWNhdGUgdGhlIGJ1ZmZlciBvZmZzZXQgd2hpY2ggcGFja2V0IG5vdyBhcmUgd3JpdGluZyB0by4KKwlVTE9ORwkJCU5leHRCdWxrT3V0UG9zaXRpb247CS8vIEluZGljYXRlIHRoZSBidWZmZXIgc3RhcnQgb2Zmc2V0IG9mIGEgYnVsay10cmFuc21pc3Npb24KKwlVTE9ORwkJCUVOZXh0QnVsa091dFBvc2l0aW9uOwkvLyBJbmRpY2F0ZSB0aGUgYnVmZmVyIGVuZCBvZmZzZXQgb2YgYSBidWxrLXRyYW5zbWlzc2lvbgorCVVJTlQJCQlUeFJhdGU7CisJZG1hX2FkZHJfdAkJZGF0YV9kbWE7CQkvLyB1cmIgZG1hIG9uIGxpbnV4Cit9CUhUX1RYX0NPTlRFWFQsICpQSFRfVFhfQ09OVEVYVCwgKipQUEhUX1RYX0NPTlRFWFQ7CisKKworLy8KKy8vIFN0cnVjdHVyZSB0byBrZWVwIHRyYWNrIG9mIHJlY2VpdmUgcGFja2V0cyBhbmQgYnVmZmVycyB0byBpbmRpY2F0ZQorLy8gcmVjZWl2ZSBkYXRhIHRvIHRoZSBwcm90b2NvbC4KKy8vCit0eXBlZGVmIHN0cnVjdCBfUlhfQ09OVEVYVAoreworCVBVQ0hBUgkJCQlUcmFuc2ZlckJ1ZmZlcjsKKwlQVk9JRAkJCQlwQWQ7CisJUElSUAkJCQlwSXJwOy8vdXNlZCB0byBjYW5jZWwgcGVuZGluZyBidWxrIGluLgorCVBVUkIJCQkJcFVyYjsKKwkvL1RoZXNlIDIgQm9vbGVhbiBzaG91bGRuJ3QgYm90aCBiZSAxIGF0IHRoZSBzYW1lIHRpbWUuCisJVUxPTkcJCQkJQnVsa0luT2Zmc2V0OwkvLyBudW1iZXIgb2YgcGFja2V0cyB3YWl0aW5nIGZvciByZW9yZGVyaW5nIC4KKy8vCUJPT0xFQU4JCQkJUmVvcmRlckluVXNlOwkvLyBBdCBsZWFzdCBvbmUgcGFja2V0IGluIHRoaXMgYnVmZmVyIGFyZSBpbiByZW9yZGVyaW5nIGJ1ZmZlciBhbmQgd2FpdCBmb3IgcmVjZWl2ZSBpbmRpY2F0aW9uCisJQk9PTEVBTgkJCQliUnhIYW5kbGluZzsJLy8gTm90aWZ5IHRoaXMgcGFja2V0IGlzIGJlaW5nIHByb2Nlc3Mgbm93LgorCUJPT0xFQU4JCQkJSW5Vc2U7CQkJLy8gVVNCIEhhcmR3YXJlIE9jY3VwaWVkLiBXYWl0IGZvciBVU0IgSFcgdG8gcHV0IHBhY2tldC4KKwlCT09MRUFOCQkJCVJlYWRhYmxlOwkJLy8gUmVjZWl2ZSBDb21wbGV0ZSBiYWNrLiBPSyBmb3IgZHJpdmVyIHRvIGluZGljYXRlIHJlY2VpdmluZyBwYWNrZXQuCisJQk9PTEVBTgkJCQlJUlBQZW5kaW5nOwkJLy8gVE9ETzogVG8gYmUgcmVtb3ZlZAorCWF0b21pY190CQkJSXJwTG9jazsKKwlORElTX1NQSU5fTE9DSwkJUnhDb250ZXh0TG9jazsKKwlkbWFfYWRkcl90CQkJZGF0YV9kbWE7CQkvLyB1cmIgZG1hIG9uIGxpbnV4Cit9CVJYX0NPTlRFWFQsICpQUlhfQ09OVEVYVDsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCisvLworLy8gIE5ESVMgVmVyc2lvbiBkZWZpbml0aW9ucworLy8KKyNpZmRlZiAgTkRJUzUwX01JTklQT1JUCisjZGVmaW5lIFJUTVBfTkRJU19NQUpPUl9WRVJTSU9OICAgICA1CisjZGVmaW5lIFJUTVBfTkRJU19NSU5PUl9WRVJTSU9OICAgICAwCisjZW5kaWYKKworI2lmZGVmICBORElTNTFfTUlOSVBPUlQKKyNkZWZpbmUgUlRNUF9ORElTX01BSk9SX1ZFUlNJT04gICAgIDUKKyNkZWZpbmUgUlRNUF9ORElTX01JTk9SX1ZFUlNJT04gICAgIDEKKyNlbmRpZgorCitleHRlcm4gIGNoYXIgICAgTklDX1ZFTkRPUl9ERVNDW107CitleHRlcm4gIGludCAgICAgTklDX1ZFTkRPUl9ERVNDX0xFTjsKKworZXh0ZXJuICB1bnNpZ25lZCBjaGFyICAgU05BUF9BSVJPTkVUW107CitleHRlcm4gIHVuc2lnbmVkIGNoYXIgICBDaXBoZXJTdWl0ZUNpc2NvQ0NLTVtdOworZXh0ZXJuICB1bnNpZ25lZCBjaGFyICAgQ2lwaGVyU3VpdGVDaXNjb0NDS01MZW47CitleHRlcm4JdW5zaWduZWQgY2hhcglDaXBoZXJTdWl0ZUNpc2NvQ0NLTTI0W107CitleHRlcm4JdW5zaWduZWQgY2hhcglDaXBoZXJTdWl0ZUNpc2NvQ0NLTTI0TGVuOworZXh0ZXJuICB1bnNpZ25lZCBjaGFyICAgQ2lwaGVyU3VpdGVDQ1hUa2lwW107CitleHRlcm4gIHVuc2lnbmVkIGNoYXIgICBDaXBoZXJTdWl0ZUNDWFRraXBMZW47CitleHRlcm4gIHVuc2lnbmVkIGNoYXIgICBDSVNDT19PVUlbXTsKK2V4dGVybiAgVUNIQVIJQmFTaXplQXJyYXlbNF07CisKK2V4dGVybiBVQ0hBUiBCUk9BRENBU1RfQUREUltNQUNfQUREUl9MRU5dOworZXh0ZXJuIFVDSEFSIE1VTFRJQ0FTVF9BRERSW01BQ19BRERSX0xFTl07CitleHRlcm4gVUNIQVIgWkVST19NQUNfQUREUltNQUNfQUREUl9MRU5dOworZXh0ZXJuIFVMT05HIEJJVDMyWzMyXTsKK2V4dGVybiBVQ0hBUiBCSVQ4WzhdOworZXh0ZXJuIGNoYXIqIENpcGhlck5hbWVbXTsKK2V4dGVybiBjaGFyKiBNQ1NUb01icHNbXTsKK2V4dGVybiBVQ0hBUgkgUnh3aU1DU1RvT2ZkbVJhdGVbMTJdOworZXh0ZXJuIFVDSEFSIFNOQVBfODAyXzFIWzZdOworZXh0ZXJuIFVDSEFSIFNOQVBfQlJJREdFX1RVTk5FTFs2XTsKK2V4dGVybiBVQ0hBUiBTTkFQX0FJUk9ORVRbOF07CitleHRlcm4gVUNIQVIgQ0tJUF9MTENfU05BUFs4XTsKK2V4dGVybiBVQ0hBUiBFQVBPTF9MTENfU05BUFs4XTsKK2V4dGVybiBVQ0hBUiBFQVBPTFsyXTsKK2V4dGVybiBVQ0hBUiBJUFhbMl07CitleHRlcm4gVUNIQVIgQVBQTEVfVEFMS1syXTsKK2V4dGVybiBVQ0hBUiBSYXRlSWRUb1BsY3BTaWduYWxbMTJdOyAvLyBzZWUgSUVFRTgwMi4xMWEtMTk5OSBwLjE0CitleHRlcm4gVUNIQVIJIE9mZG1SYXRlVG9SeHdpTUNTW107CitleHRlcm4gVUNIQVIgT2ZkbVNpZ25hbFRvUmF0ZUlkWzE2XSA7CitleHRlcm4gVUNIQVIgZGVmYXVsdF9jd21pbls0XTsKK2V4dGVybiBVQ0hBUiBkZWZhdWx0X2N3bWF4WzRdOworZXh0ZXJuIFVDSEFSIGRlZmF1bHRfc3RhX2FpZnNuWzRdOworZXh0ZXJuIFVDSEFSIE1hcFVzZXJQcmlvcml0eVRvQWNjZXNzQ2F0ZWdvcnlbOF07CisKK2V4dGVybiBVU0hPUlQgUmF0ZVVwUEVSW107CitleHRlcm4gVVNIT1JUIFJhdGVEb3duUEVSW107CitleHRlcm4gVUNIQVIgIFBoeTExQk5leHRSYXRlRG93bndhcmRbXTsKK2V4dGVybiBVQ0hBUiAgUGh5MTFCTmV4dFJhdGVVcHdhcmRbXTsKK2V4dGVybiBVQ0hBUiAgUGh5MTFCR05leHRSYXRlRG93bndhcmRbXTsKK2V4dGVybiBVQ0hBUiAgUGh5MTFCR05leHRSYXRlVXB3YXJkW107CitleHRlcm4gVUNIQVIgIFBoeTExQU5leHRSYXRlRG93bndhcmRbXTsKK2V4dGVybiBVQ0hBUiAgUGh5MTFBTmV4dFJhdGVVcHdhcmRbXTsKK2V4dGVybiBDSEFSICAgUnNzaVNhZmVMZXZlbEZvclR4UmF0ZVtdOworZXh0ZXJuIFVDSEFSICBSYXRlSWRUb01icHNbXTsKK2V4dGVybiBVU0hPUlQgUmF0ZUlkVG81MDBLYnBzW107CisKK2V4dGVybiBVQ0hBUiAgQ2lwaGVyU3VpdGVXcGFOb25lVGtpcFtdOworZXh0ZXJuIFVDSEFSICBDaXBoZXJTdWl0ZVdwYU5vbmVUa2lwTGVuOworCitleHRlcm4gVUNIQVIgIENpcGhlclN1aXRlV3BhTm9uZUFlc1tdOworZXh0ZXJuIFVDSEFSICBDaXBoZXJTdWl0ZVdwYU5vbmVBZXNMZW47CisKK2V4dGVybiBVQ0hBUiAgU3NpZEllOworZXh0ZXJuIFVDSEFSICBTdXBSYXRlSWU7CitleHRlcm4gVUNIQVIgIEV4dFJhdGVJZTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorZXh0ZXJuIFVDSEFSICBIdENhcEllOworZXh0ZXJuIFVDSEFSICBBZGRIdEluZm9JZTsKK2V4dGVybiBVQ0hBUiAgTmV3RXh0Q2hhbkllOworI2lmZGVmIERPVDExTl9EUkFGVDMKK2V4dGVybiBVQ0hBUiAgRXh0SHRDYXBJZTsKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK2V4dGVybiBVQ0hBUiAgRXJwSWU7CitleHRlcm4gVUNIQVIgIERzSWU7CitleHRlcm4gVUNIQVIgIFRpbUllOworZXh0ZXJuIFVDSEFSICBXcGFJZTsKK2V4dGVybiBVQ0hBUiAgV3BhMkllOworZXh0ZXJuIFVDSEFSICBJYnNzSWU7CitleHRlcm4gVUNIQVIgIENjeDJJZTsKKworZXh0ZXJuIFVDSEFSICBXUEFfT1VJW107CitleHRlcm4gVUNIQVIgIFJTTl9PVUlbXTsKK2V4dGVybiBVQ0hBUiAgV01FX0lORk9fRUxFTVtdOworZXh0ZXJuIFVDSEFSICBXTUVfUEFSTV9FTEVNW107CitleHRlcm4gVUNIQVIgIENjeDJRb3NJbmZvW107CitleHRlcm4gVUNIQVIgIENjeDJJZUluZm9bXTsKK2V4dGVybiBVQ0hBUiAgUkFMSU5LX09VSVtdOworZXh0ZXJuIFVDSEFSICBQb3dlckNvbnN0cmFpbnRJRVtdOworCisKK2V4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlW107CitleHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExQltdOworZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGUxMUdbXTsKK2V4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFCR1tdOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitleHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExQkdOMVNbXTsKK2V4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFCR04yU1tdOworZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGUxMUJHTjJTRm9yQUJhbmRbXTsKK2V4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFOMVNbXTsKK2V4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFOMlNbXTsKK2V4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZFtdOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitleHRlcm4gVUNIQVIgIFBSRV9OX0hUX09VSVtdOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjZGVmaW5lCU1BWFNFUQkJKDB4RkZGKQorCisjaWZkZWYgUkFMSU5LX0FURQordHlwZWRlZglzdHJ1Y3QgX0FURV9JTkZPIHsKKwlVQ0hBUglNb2RlOworCUNIQVIJVHhQb3dlcjA7CisJQ0hBUglUeFBvd2VyMTsKKwlDSEFSICAgIFR4QW50ZW5uYVNlbDsKKwlDSEFSICAgIFJ4QW50ZW5uYVNlbDsKKwlUWFdJX1NUUlVDICBUeFdJOyAJICAvLyBUWFdJCisJVVNIT1JUCVFJRDsKKwlVQ0hBUglBZGRyMVtNQUNfQUREUl9MRU5dOworCVVDSEFSCUFkZHIyW01BQ19BRERSX0xFTl07CisJVUNIQVIJQWRkcjNbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUglDaGFubmVsOworCVVJTlQzMglUeExlbmd0aDsKKwlVSU5UMzIJVHhDb3VudDsKKwlVSU5UMzIJVHhEb25lQ291bnQ7IC8vIFR4IERNQSBEb25lCisJVUlOVDMyCVJGRnJlcU9mZnNldDsKKwlCT09MRUFOCWJSeEZlcjsKKwlCT09MRUFOCWJRQVR4U3RhcnQ7IC8vIEhhdmUgY29tcGlsZWQgUUEgaW4gYW5kIHVzZSBpdCB0byBBVEUgdHguCisJQk9PTEVBTgliUUFSeFN0YXJ0OwkvLyBIYXZlIGNvbXBpbGVkIFFBIGluIGFuZCB1c2UgaXQgdG8gQVRFIHJ4LgorCVVJTlQzMglSeFRvdGFsQ250OworCVVJTlQzMglSeENudFBlclNlYzsKKworCUNIQVIJTGFzdFNOUjA7ICAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgU05SCisJQ0hBUiAgICBMYXN0U05SMTsgICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBTTlIgZm9yIDJuZCAgYW50ZW5uYQorCUNIQVIgICAgTGFzdFJzc2kwOyAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgUlNTSQorCUNIQVIgICAgTGFzdFJzc2kxOyAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgUlNTSSBmb3IgMm5kICBhbnRlbm5hCisJQ0hBUiAgICBMYXN0UnNzaTI7ICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBSU1NJIGZvciAzcmQgIGFudGVubmEKKwlDSEFSICAgIEF2Z1Jzc2kwOyAgICAgICAgICAgICAvLyBsYXN0IDggZnJhbWVzJyBhdmVyYWdlIFJTU0kKKwlDSEFSICAgIEF2Z1Jzc2kxOyAgICAgICAgICAgICAvLyBsYXN0IDggZnJhbWVzJyBhdmVyYWdlIFJTU0kKKwlDSEFSICAgIEF2Z1Jzc2kyOyAgICAgICAgICAgICAvLyBsYXN0IDggZnJhbWVzJyBhdmVyYWdlIFJTU0kKKwlTSE9SVCAgIEF2Z1Jzc2kwWDg7ICAgICAgICAgICAvLyBzdW0gb2YgbGFzdCA4IGZyYW1lcycgUlNTSQorCVNIT1JUICAgQXZnUnNzaTFYODsgICAgICAgICAgIC8vIHN1bSBvZiBsYXN0IDggZnJhbWVzJyBSU1NJCisJU0hPUlQgICBBdmdSc3NpMlg4OyAgICAgICAgICAgLy8gc3VtIG9mIGxhc3QgOCBmcmFtZXMnIFJTU0kKKworCVVJTlQzMglOdW1PZkF2Z1Jzc2lTYW1wbGU7CisKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCS8vIFR4IGZyYW1lCisjaWZkZWYgUlQyODcwCisJLyogbm90IHVzZWQgaW4gUlQyODYwICovCisJVFhJTkZPX1NUUlVDCQlUeEluZm87IC8vIFR4SW5mbworI2VuZGlmIC8vIFJUMjg3MCAvLworCVVTSE9SVAkJSExlbjsgLy8gSGVhZGVyIExlbmd0aAorCVVTSE9SVAkJUExlbjsgLy8gUGF0dGVybiBMZW5ndGgKKwlVQ0hBUiAJCUhlYWRlclszMl07IC8vIEhlYWRlciBidWZmZXIKKwlVQ0hBUgkJUGF0dGVyblszMl07IC8vIFBhdHRlcm4gYnVmZmVyCisJVVNIT1JUCQlETGVuOyAvLyBEYXRhIExlbmd0aAorCVVTSE9SVAkJc2VxOworCVVJTlQzMgkJQ0lEOworCVRIUkVBRF9QSUQgCQlBdGVQaWQ7CisJLy8gY291bnRlcnMKKwlVSU5UMzIJCVUyTTsKKwlVSU5UMzIJCU90aGVyRGF0YTsKKwlVSU5UMzIJCUJlYWNvbjsKKwlVSU5UMzIJCU90aGVyQ291bnQ7CisJVUlOVDMyCQlUeEFjMDsKKwlVSU5UMzIJCVR4QWMxOworCVVJTlQzMgkJVHhBYzI7CisJVUlOVDMyCQlUeEFjMzsKKwlVSU5UMzIJCVR4SENDQTsKKwlVSU5UMzIJCVR4TWdtdDsKKwlVSU5UMzIJCVJTU0kwOworCVVJTlQzMgkJUlNTSTE7CisJVUlOVDMyCQlSU1NJMjsKKwlVSU5UMzIJCVNOUjA7CisJVUlOVDMyCQlTTlIxOworCS8vIGNvbnRyb2wKKwkvL1VJTlQzMgkJUmVwZWF0OyAvLyBUeCBDcHUgY291bnQKKwlVQ0hBUgkJVHhTdGF0dXM7IC8vIHRhc2sgVHggc3RhdHVzIC8vIDAgLS0+IHRhc2sgaXMgaWRsZSwgMSAtLT4gdGFzayBpcyBydW5uaW5nCisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KK30JQVRFX0lORk8sICpQQVRFX0lORk87CisKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorc3RydWN0IGF0ZV9yYWNmZ2hkciB7CisgCVVJTlQzMgkJbWFnaWNfbm87CisJVVNIT1JUCQljb21tYW5kX3R5cGU7CisJVVNIT1JUCQljb21tYW5kX2lkOworCVVTSE9SVAkJbGVuZ3RoOworCVVTSE9SVAkJc2VxdWVuY2U7CisJVVNIT1JUCQlzdGF0dXM7CisJVUNIQVIJCWRhdGFbMjA0Nl07Cit9ICBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorc3RydWN0IHJlb3JkZXJpbmdfbXBkdQoreworCXN0cnVjdCByZW9yZGVyaW5nX21wZHUJKm5leHQ7CisJUE5ESVNfUEFDS0VUCQkJcFBhY2tldDsJCS8qIGNvdmVydGVkIHRvIDgwMi4zIGZyYW1lICovCisJaW50CQkJCQkJU2VxdWVuY2U7CQkvKiBzZXF1ZW5jZSBudW1iZXIgb2YgTVBEVSAqLworCUJPT0xFQU4JCQkJCWJBTVNEVTsKK307CisKK3N0cnVjdCByZW9yZGVyaW5nX2xpc3QKK3sKKwlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICpuZXh0OworCWludCAJcWxlbjsKK307CisKK3N0cnVjdCByZW9yZGVyaW5nX21wZHVfcG9vbAoreworCVBWT0lECQkJCQltZW07CisJTkRJU19TUElOX0xPQ0sJCQlsb2NrOworCXN0cnVjdCByZW9yZGVyaW5nX2xpc3QgCWZyZWVsaXN0OworfTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwordHlwZWRlZiBzdHJ1Y3QgCV9SU1NJX1NBTVBMRSB7CisJQ0hBUgkJCUxhc3RSc3NpMDsgICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBSU1NJCisJQ0hBUgkJCUxhc3RSc3NpMTsgICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBSU1NJCisJQ0hBUgkJCUxhc3RSc3NpMjsgICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBSU1NJCisJQ0hBUgkJCUF2Z1Jzc2kwOworCUNIQVIJCQlBdmdSc3NpMTsKKwlDSEFSCQkJQXZnUnNzaTI7CisJU0hPUlQJCQlBdmdSc3NpMFg4OworCVNIT1JUCQkJQXZnUnNzaTFYODsKKwlTSE9SVAkJCUF2Z1Jzc2kyWDg7Cit9IFJTU0lfU0FNUExFOworCisvLworLy8gIFF1ZXVlIHN0cnVjdHVyZSBhbmQgbWFjcm9zCisvLwordHlwZWRlZiBzdHJ1Y3QgIF9RVUVVRV9FTlRSWSAgICB7CisJc3RydWN0IF9RVUVVRV9FTlRSWSAgICAgKk5leHQ7Cit9ICAgUVVFVUVfRU5UUlksICpQUVVFVUVfRU5UUlk7CisKKy8vIFF1ZXVlIHN0cnVjdHVyZQordHlwZWRlZiBzdHJ1Y3QgIF9RVUVVRV9IRUFERVIgICB7CisJUFFVRVVFX0VOVFJZICAgIEhlYWQ7CisJUFFVRVVFX0VOVFJZICAgIFRhaWw7CisJVUxPTkcgICAgICAgICAgIE51bWJlcjsKK30gICBRVUVVRV9IRUFERVIsICpQUVVFVUVfSEVBREVSOworCisjZGVmaW5lIEluaXRpYWxpemVRdWV1ZUhlYWRlcihRdWV1ZUhlYWRlcikgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCShRdWV1ZUhlYWRlciktPkhlYWQgPSAoUXVldWVIZWFkZXIpLT5UYWlsID0gTlVMTDsgICBcCisJKFF1ZXVlSGVhZGVyKS0+TnVtYmVyID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBSZW1vdmVIZWFkUXVldWUoUXVldWVIZWFkZXIpICAgICAgICAgICAgICAgIFwKKyhRdWV1ZUhlYWRlciktPkhlYWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCVBRVUVVRV9FTlRSWSBwTmV4dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpZiAoKFF1ZXVlSGVhZGVyKS0+SGVhZCAhPSBOVUxMKQkJCQlcCisJewkJCQkJCQkJCQkJCVwKKwkJcE5leHQgPSAoUXVldWVIZWFkZXIpLT5IZWFkLT5OZXh0OyAgICAgICAgICBcCisJCShRdWV1ZUhlYWRlciktPkhlYWQgPSBwTmV4dDsgICAgICAgICAgICAgICAgXAorCQlpZiAocE5leHQgPT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCShRdWV1ZUhlYWRlciktPlRhaWwgPSBOVUxMOyAgICAgICAgICAgICBcCisJCShRdWV1ZUhlYWRlciktPk51bWJlci0tOyAgICAgICAgICAgICAgICAgICAgXAorCX0JCQkJCQkJCQkJCQlcCit9CisKKyNkZWZpbmUgSW5zZXJ0SGVhZFF1ZXVlKFF1ZXVlSGVhZGVyLCBRdWV1ZUVudHJ5KSAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJKChQUVVFVUVfRU5UUlkpUXVldWVFbnRyeSktPk5leHQgPSAoUXVldWVIZWFkZXIpLT5IZWFkOyBcCisJCShRdWV1ZUhlYWRlciktPkhlYWQgPSAoUFFVRVVFX0VOVFJZKShRdWV1ZUVudHJ5KTsgICAgICAgXAorCQlpZiAoKFF1ZXVlSGVhZGVyKS0+VGFpbCA9PSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCShRdWV1ZUhlYWRlciktPlRhaWwgPSAoUFFVRVVFX0VOVFJZKShRdWV1ZUVudHJ5KTsgICBcCisJCShRdWV1ZUhlYWRlciktPk51bWJlcisrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIEluc2VydFRhaWxRdWV1ZShRdWV1ZUhlYWRlciwgUXVldWVFbnRyeSkgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoKFBRVUVVRV9FTlRSWSlRdWV1ZUVudHJ5KS0+TmV4dCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICBcCisJaWYgKChRdWV1ZUhlYWRlciktPlRhaWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkoUXVldWVIZWFkZXIpLT5UYWlsLT5OZXh0ID0gKFBRVUVVRV9FTlRSWSkoUXVldWVFbnRyeSk7IFwKKwllbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCShRdWV1ZUhlYWRlciktPkhlYWQgPSAoUFFVRVVFX0VOVFJZKShRdWV1ZUVudHJ5KTsgICAgICAgXAorCShRdWV1ZUhlYWRlciktPlRhaWwgPSAoUFFVRVVFX0VOVFJZKShRdWV1ZUVudHJ5KTsgICAgICAgICAgIFwKKwkoUXVldWVIZWFkZXIpLT5OdW1iZXIrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vCisvLyAgTWFjcm9zIGZvciBmbGFnIGFuZCByZWYgY291bnQgb3BlcmF0aW9ucworLy8KKyNkZWZpbmUgUlRNUF9TRVRfRkxBRyhfTSwgX0YpICAgICAgICgoX00pLT5GbGFncyB8PSAoX0YpKQorI2RlZmluZSBSVE1QX0NMRUFSX0ZMQUcoX00sIF9GKSAgICAgKChfTSktPkZsYWdzICY9IH4oX0YpKQorI2RlZmluZSBSVE1QX0NMRUFSX0ZMQUdTKF9NKSAgICAgICAgKChfTSktPkZsYWdzID0gMCkKKyNkZWZpbmUgUlRNUF9URVNUX0ZMQUcoX00sIF9GKSAgICAgICgoKF9NKS0+RmxhZ3MgJiAoX0YpKSAhPSAwKQorI2RlZmluZSBSVE1QX1RFU1RfRkxBR1MoX00sIF9GKSAgICAgKCgoX00pLT5GbGFncyAmIChfRikpID09IChfRikpCisKKyNkZWZpbmUgT1BTVEFUVVNfU0VUX0ZMQUcoX3BBZCwgX0YpICAgICAoKF9wQWQpLT5Db21tb25DZmcuT3BTdGF0dXNGbGFncyB8PSAoX0YpKQorI2RlZmluZSBPUFNUQVRVU19DTEVBUl9GTEFHKF9wQWQsIF9GKSAgICgoX3BBZCktPkNvbW1vbkNmZy5PcFN0YXR1c0ZsYWdzICY9IH4oX0YpKQorI2RlZmluZSBPUFNUQVRVU19URVNUX0ZMQUcoX3BBZCwgX0YpICAgICgoKF9wQWQpLT5Db21tb25DZmcuT3BTdGF0dXNGbGFncyAmIChfRikpICE9IDApCisKKyNkZWZpbmUgQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhfcEVudHJ5LF9GKSAgICAgICgoX3BFbnRyeSktPkNsaWVudFN0YXR1c0ZsYWdzIHw9IChfRikpCisjZGVmaW5lIENMSUVOVF9TVEFUVVNfQ0xFQVJfRkxBRyhfcEVudHJ5LF9GKSAgICAoKF9wRW50cnkpLT5DbGllbnRTdGF0dXNGbGFncyAmPSB+KF9GKSkKKyNkZWZpbmUgQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcoX3BFbnRyeSxfRikgICAgICgoKF9wRW50cnkpLT5DbGllbnRTdGF0dXNGbGFncyAmIChfRikpICE9IDApCisKKyNkZWZpbmUgUlhfRklMVEVSX1NFVF9GTEFHKF9wQWQsIF9GKSAgICAoKF9wQWQpLT5Db21tb25DZmcuUGFja2V0RmlsdGVyIHw9IChfRikpCisjZGVmaW5lIFJYX0ZJTFRFUl9DTEVBUl9GTEFHKF9wQWQsIF9GKSAgKChfcEFkKS0+Q29tbW9uQ2ZnLlBhY2tldEZpbHRlciAmPSB+KF9GKSkKKyNkZWZpbmUgUlhfRklMVEVSX1RFU1RfRkxBRyhfcEFkLCBfRikgICAoKChfcEFkKS0+Q29tbW9uQ2ZnLlBhY2tldEZpbHRlciAmIChfRikpICE9IDApCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKyNkZWZpbmUgU1RBX05PX1NFQ1VSSVRZX09OKF9wKSAgICAgICAgICAoX3AtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCkKKyNkZWZpbmUgU1RBX1dFUF9PTihfcCkgICAgICAgICAgICAgICAgICAoX3AtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkKKyNkZWZpbmUgU1RBX1RLSVBfT04oX3ApICAgICAgICAgICAgICAgICAoX3AtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKyNkZWZpbmUgU1RBX0FFU19PTihfcCkgICAgICAgICAgICAgICAgICAoX3AtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKworI2RlZmluZSBTVEFfVEdOX1dJRklfT04oX3ApICAgICAgICAgICAgIChfcC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCA9PSBUUlVFKQorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjZGVmaW5lIENLSVBfS1BfT04oX3ApCQkJCSgoKChfcCktPlN0YUNmZy5Da2lwRmxhZykgJiAweDEwKSAmJiAoKF9wKS0+U3RhQ2ZnLmJDa2lwQ21pY09uID09IFRSVUUpKQorI2RlZmluZSBDS0lQX0NNSUNfT04oX3ApCQkJKCgoKF9wKS0+U3RhQ2ZnLkNraXBGbGFnKSAmIDB4MDgpICYmICgoX3ApLT5TdGFDZmcuYkNraXBDbWljT24gPT0gVFJVRSkpCisKKworI2RlZmluZSBJTkNfUklOR19JTkRFWChfaWR4LCBfUmluZ1NpemUpICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKF9pZHgpID0gKF9pZHgrMSkgJSAoX1JpbmdTaXplKTsgICAgICAgXAorfQorCisjZGVmaW5lIElTX1JUMzA3MChfcEFkKQkJCQkoKChfcEFkKS0+TUFDVmVyc2lvbiAmIDB4ZmZmZjAwMDApID09IDB4MzA3MDAwMDApCisKKyNkZWZpbmUgUklOR19QQUNLRVRfSU5JVChfVHhSaW5nLCBfaWR4KSAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9UeFJpbmctPkNlbGxbX2lkeF0ucE5kaXNQYWNrZXQgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfVHhSaW5nLT5DZWxsW19pZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIFRYRFRfSU5JVChfVHhEKSAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCU5kaXNaZXJvTWVtb3J5KF9UeEQsIFRYRF9TSVpFKTsJXAorCV9UeEQtPkRNQURPTkUgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy9TZXQgbGFzdCBkYXRhIHNlZ21lbnQKKyNkZWZpbmUgUklOR19TRVRfTEFTVERTKF9UeEQsIF9Jc1NEMCkgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoX0lzU0QwKSB7X1R4RC0+TGFzdFNlYzAgPSAxO30gICAgIFwKKyAgICBlbHNlIHtfVHhELT5MYXN0U2VjMSA9IDE7fSAgICAgXAorfQorCisvLyBJbmNyZWFzZSBUeFRzYyB2YWx1ZSBmb3IgbmV4dCB0cmFuc21pc3Npb24KKy8vIFRPRE86CisvLyBXaGVuIGk9PTYsIG1lYW5zIFRTQyBoYXMgZG9uZSBvbmUgZnVsbCBjeWNsZSwgZG8gcmUta2V5aW5nIHN0dWZmIGZvbGxvdyBzcGVjcworLy8gU2hvdWxkIHNlbmQgYSBzcGVjaWFsIGV2ZW50IG1pY3Jvc29mdCBkZWZpbmVkIHRvIHJlcXVlc3QgcmUta2V5CisjZGVmaW5lIElOQ19UWF9UU0MoX3RzYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2hpbGUgKCsrX3RzY1tpXSA9PSAweDApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChpID09IDYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKy8vIFN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5NQ1NTZXQgaXMgY29waWVkIGZyb20gQVAgYmVhY29uLiAgRG9uJ3QgbmVlZCB0byB1cGRhdGUgaGVyZS4KKyNkZWZpbmUgQ09QWV9IVFNFVFRJTkdTX0ZST01fTUxNRV9BVVhfVE9fQUNUSVZFX0NGRyhfcEFkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LkNoYW5uZWxXaWR0aCA9IF9wQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGg7ICAgICAgXAorCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5NaW1vUHMgPSBfcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzOyAgICAgIFwKKwlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuR0YgPSBfcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uR0Y7ICAgICAgXAorCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5TaG9ydEdJZm9yMjAgPSBfcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjIwOyAgICAgIFwKKwlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuU2hvcnRHSWZvcjQwID0gX3BBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3I0MDsgICAgICBcCisJX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LlR4U1RCQyA9IF9wQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5UeFNUQkM7ICAgICAgXAorCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5SeFNUQkMgPSBfcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uUnhTVEJDOyAgICAgIFwKKwlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuRXh0Q2hhbk9mZnNldCA9IF9wQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0OyAgICAgIFwKKwlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuUmVjb21XaWR0aCA9IF9wQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mby5SZWNvbVdpZHRoOyAgICAgIFwKKwlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuT3BlcmFpb25Nb2RlID0gX3BBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGU7ICAgICAgXAorCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5Ob25HZlByZXNlbnQgPSBfcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudDsgICAgICBcCisJTmRpc01vdmVNZW1vcnkoKF9wQWQpLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVENhcGFiaWxpdHkuTUNTU2V0LCAoX3BBZCktPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldCwgc2l6ZW9mKFVDSEFSKSAqIDE2KTtcCit9CisKKyNkZWZpbmUgQ09QWV9BUF9IVFNFVFRJTkdTX0ZST01fQkVBQ09OKF9wQWQsIF9wSHRDYXBhYmlsaXR5KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJX3BBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQU1zZHVTaXplID0gKFVDSEFSKShfcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkFNc2R1U2l6ZSk7CVwKKwlfcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NbXBzTW9kZT0gKFVDSEFSKShfcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLk1pbW9Qcyk7CVwKKwlfcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NYXhSQW1wZHVGYWN0b3IgPSAoVUNIQVIpKF9wSHRDYXBhYmlsaXR5LT5IdENhcFBhcm0uTWF4UkFtcGR1RmFjdG9yKTsJXAorfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisvLworLy8gQkJQICYgUkYgYXJlIHVzaW5nIGluZGlyZWN0IGFjY2Vzcy4gQmVmb3JlIHdyaXRlIGFueSB2YWx1ZSBpbnRvIGl0LgorLy8gV2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhlcmUgaXMgbm8gb3V0c3RhbmRpbmcgY29tbWFuZCBwZW5kaW5nIHZpYSBjaGVja2luZyBidXN5IGJpdC4KKy8vCisjZGVmaW5lIE1BWF9CVVNZX0NPVU5UICAxMDAgICAgICAgICAvLyBOdW1iZXIgb2YgcmV0cnkgYmVmb3JlIGZhaWxpbmcgYWNjZXNzIEJCUCAmIFJGIGluZGlyZWN0IHJlZ2lzdGVyCisvLworCisjaWZkZWYgUlQyODcwCisjZGVmaW5lIFJUTVBfUkZfSU9fV1JJVEUzMihfQSwgX1YpICAgICAgICAgICAgICAgICBSVFVTQldyaXRlUkZSZWdpc3RlcihfQSwgX1YpCisjZGVmaW5lIFJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChfQSwgX0ksIF9wVikgICBSVFVTQlJlYWRCQlBSZWdpc3RlcihfQSwgX0ksIF9wVikKKyNkZWZpbmUgUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChfQSwgX0ksIF9WKSAgIFJUVVNCV3JpdGVCQlBSZWdpc3RlcihfQSwgX0ksIF9WKQorCisjZGVmaW5lIEJCUF9JT19XUklURThfQllfUkVHX0lEKF9BLCBfSSwgX1YpCQkJUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKF9BLCBfSSwgX1YpCisjZGVmaW5lIEJCUF9JT19SRUFEOF9CWV9SRUdfSUQoX0EsIF9JLCBfcFYpICAgCQlSVFVTQlJlYWRCQlBSZWdpc3RlcihfQSwgX0ksIF9wVikKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworI2RlZmluZSAgICAgTUFQX0NIQU5ORUxfSURfVE9fS0haKGNoLCBraHopICB7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN3aXRjaCAoY2gpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDE6ICAgICBraHogPSAyNDEyMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDI6ICAgICBraHogPSAyNDE3MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDM6ICAgICBraHogPSAyNDIyMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6ICAgICBraHogPSAyNDI3MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU6ICAgICBraHogPSAyNDMyMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDY6ICAgICBraHogPSAyNDM3MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDc6ICAgICBraHogPSAyNDQyMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDg6ICAgICBraHogPSAyNDQ3MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDk6ICAgICBraHogPSAyNDUyMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOiAgICBraHogPSAyNDU3MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDExOiAgICBraHogPSAyNDYyMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOiAgICBraHogPSAyNDY3MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOiAgICBraHogPSAyNDcyMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OiAgICBraHogPSAyNDg0MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDM2OiAgLyogVU5JSSAqLyAga2h6ID0gNTE4MDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDogIC8qIFVOSUkgKi8gIGtoeiA9IDUyMDAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDQ6ICAvKiBVTklJICovICBraHogPSA1MjIwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDQ4OiAgLyogVU5JSSAqLyAga2h6ID0gNTI0MDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MjogIC8qIFVOSUkgKi8gIGtoeiA9IDUyNjAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTY6ICAvKiBVTklJICovICBraHogPSA1MjgwMDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDYwOiAgLyogVU5JSSAqLyAga2h6ID0gNTMwMDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA2NDogIC8qIFVOSUkgKi8gIGtoeiA9IDUzMjAwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ5OiAvKiBVTklJICovICBraHogPSA1NzQ1MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDE1MzogLyogVU5JSSAqLyAga2h6ID0gNTc2NTAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTc6IC8qIFVOSUkgKi8gIGtoeiA9IDU3ODUwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTYxOiAvKiBVTklJICovICBraHogPSA1ODA1MDAwOyAgIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDE2NTogLyogVU5JSSAqLyAga2h6ID0gNTgyNTAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDA6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTUwMDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDQ6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTUyMDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDg6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTU0MDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTI6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTU2MDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTY6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTU4MDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjA6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTYwMDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjQ6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTYyMDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjg6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTY0MDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzI6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTY2MDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzY6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTY4MDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDA6IC8qIEhpcGVyTEFOMiAqLyAga2h6ID0gNTcwMDAwMDsgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzNDogIC8qIEphcGFuIE1NQUMgKi8gICBraHogPSA1MTcwMDAwOyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzODogIC8qIEphcGFuIE1NQUMgKi8gICBraHogPSA1MTkwMDAwOyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0MjogIC8qIEphcGFuIE1NQUMgKi8gICBraHogPSA1MjEwMDAwOyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0NjogIC8qIEphcGFuIE1NQUMgKi8gICBraHogPSA1MjMwMDAwOyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxODQ6IC8qIEphcGFuICovICAga2h6ID0gNDkyMDAwMDsgICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg4OiAvKiBKYXBhbiAqLyAgIGtoeiA9IDQ5NDAwMDA7ICAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDE5MjogLyogSmFwYW4gKi8gICBraHogPSA0OTYwMDAwOyAgIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOTY6IC8qIEphcGFuICovICAga2h6ID0gNDk4MDAwMDsgICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjA4OiAvKiBKYXBhbiwgbWVhbnMgSjA4ICovICAga2h6ID0gNTA0MDAwMDsgICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjEyOiAvKiBKYXBhbiwgbWVhbnMgSjEyICovICAga2h6ID0gNTA2MDAwMDsgICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjE2OiAvKiBKYXBhbiwgbWVhbnMgSjE2ICovICAga2h6ID0gNTA4MDAwMDsgICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICAgIGtoeiA9IDI0MTIwMDA7ICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9CisKKyNkZWZpbmUgICAgIE1BUF9LSFpfVE9fQ0hBTk5FTF9JRChraHosIGNoKSAgeyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGtoeikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDEyMDAwOiAgICBjaCA9IDE7ICAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDE3MDAwOiAgICBjaCA9IDI7ICAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDIyMDAwOiAgICBjaCA9IDM7ICAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDI3MDAwOiAgICBjaCA9IDQ7ICAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDMyMDAwOiAgICBjaCA9IDU7ICAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDM3MDAwOiAgICBjaCA9IDY7ICAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDQyMDAwOiAgICBjaCA9IDc7ICAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDQ3MDAwOiAgICBjaCA9IDg7ICAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDUyMDAwOiAgICBjaCA9IDk7ICAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDU3MDAwOiAgICBjaCA9IDEwOyAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDYyMDAwOiAgICBjaCA9IDExOyAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDY3MDAwOiAgICBjaCA9IDEyOyAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDcyMDAwOiAgICBjaCA9IDEzOyAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDg0MDAwOiAgICBjaCA9IDE0OyAgICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MTgwMDAwOiAgICBjaCA9IDM2OyAgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTIwMDAwMDogICAgY2ggPSA0MDsgIC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDUyMjAwMDA6ICAgIGNoID0gNDQ7ICAvKiBVTklJICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MjQwMDAwOiAgICBjaCA9IDQ4OyAgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTI2MDAwMDogICAgY2ggPSA1MjsgIC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDUyODAwMDA6ICAgIGNoID0gNTY7ICAvKiBVTklJICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MzAwMDAwOiAgICBjaCA9IDYwOyAgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTMyMDAwMDogICAgY2ggPSA2NDsgIC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU3NDUwMDA6ICAgIGNoID0gMTQ5OyAvKiBVTklJICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1NzY1MDAwOiAgICBjaCA9IDE1MzsgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTc4NTAwMDogICAgY2ggPSAxNTc7IC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDU4MDUwMDA6ICAgIGNoID0gMTYxOyAvKiBVTklJICovICBicmVhazsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1ODI1MDAwOiAgICBjaCA9IDE2NTsgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTUwMDAwMDogICAgY2ggPSAxMDA7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTUyMDAwMDogICAgY2ggPSAxMDQ7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTU0MDAwMDogICAgY2ggPSAxMDg7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTU2MDAwMDogICAgY2ggPSAxMTI7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTU4MDAwMDogICAgY2ggPSAxMTY7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTYwMDAwMDogICAgY2ggPSAxMjA7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTYyMDAwMDogICAgY2ggPSAxMjQ7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTY0MDAwMDogICAgY2ggPSAxMjg7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTY2MDAwMDogICAgY2ggPSAxMzI7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTY4MDAwMDogICAgY2ggPSAxMzY7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTcwMDAwMDogICAgY2ggPSAxNDA7IC8qIEhpcGVyTEFOMiAqLyAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTE3MDAwMDogICAgY2ggPSAzNDsgIC8qIEphcGFuIE1NQUMgKi8gICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTE5MDAwMDogICAgY2ggPSAzODsgIC8qIEphcGFuIE1NQUMgKi8gICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTIxMDAwMDogICAgY2ggPSA0MjsgIC8qIEphcGFuIE1NQUMgKi8gICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTIzMDAwMDogICAgY2ggPSA0NjsgIC8qIEphcGFuIE1NQUMgKi8gICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDkyMDAwMDogICAgY2ggPSAxODQ7IC8qIEphcGFuICovICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDk0MDAwMDogICAgY2ggPSAxODg7IC8qIEphcGFuICovICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDk2MDAwMDogICAgY2ggPSAxOTI7IC8qIEphcGFuICovICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDk4MDAwMDogICAgY2ggPSAxOTY7IC8qIEphcGFuICovICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTA0MDAwMDogICAgY2ggPSAyMDg7IC8qIEphcGFuLCBtZWFucyBKMDggKi8gIGJyZWFrOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1MDYwMDAwOiAgICBjaCA9IDIxMjsgLyogSmFwYW4sIG1lYW5zIEoxMiAqLyAgYnJlYWs7ICAgXAorICAgICAgICAgICAgICAgICAgICBjYXNlIDUwODAwMDA6ICAgIGNoID0gMjE2OyAvKiBKYXBhbiwgbWVhbnMgSjE2ICovICBicmVhazsgICBcCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgY2ggPSAxOyAgICAgYnJlYWs7ICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9CisKKy8vCisvLyBDb21tb24gZnJhZ21lbnQgbGlzdCBzdHJ1Y3R1cmUgLSAgSWRlbnRpY2FsIHRvIHRoZSBzY2F0dGVyIGdhdGhlciBmcmFnIGxpc3Qgc3RydWN0dXJlCisvLworLy8jZGVmaW5lIFJUTVBfU0NBVFRFUl9HQVRIRVJfRUxFTUVOVCAgICAgICAgIFNDQVRURVJfR0FUSEVSX0VMRU1FTlQKKy8vI2RlZmluZSBQUlRNUF9TQ0FUVEVSX0dBVEhFUl9FTEVNRU5UICAgICAgICBQU0NBVFRFUl9HQVRIRVJfRUxFTUVOVAorI2RlZmluZSBOSUNfTUFYX1BIWVNfQlVGX0NPVU5UICAgICAgICAgICAgICA4CisKK3R5cGVkZWYgc3RydWN0IF9SVE1QX1NDQVRURVJfR0FUSEVSX0VMRU1FTlQgeworICAgIFBWT0lECQlBZGRyZXNzOworICAgIFVMT05HCQlMZW5ndGg7CisgICAgUFVMT05HCQlSZXNlcnZlZDsKK30gUlRNUF9TQ0FUVEVSX0dBVEhFUl9FTEVNRU5ULCAqUFJUTVBfU0NBVFRFUl9HQVRIRVJfRUxFTUVOVDsKKworCit0eXBlZGVmIHN0cnVjdCBfUlRNUF9TQ0FUVEVSX0dBVEhFUl9MSVNUIHsKKyAgICBVTE9ORyAgTnVtYmVyT2ZFbGVtZW50czsKKyAgICBQVUxPTkcgUmVzZXJ2ZWQ7CisgICAgUlRNUF9TQ0FUVEVSX0dBVEhFUl9FTEVNRU5UIEVsZW1lbnRzW05JQ19NQVhfUEhZU19CVUZfQ09VTlRdOworfSBSVE1QX1NDQVRURVJfR0FUSEVSX0xJU1QsICpQUlRNUF9TQ0FUVEVSX0dBVEhFUl9MSVNUOworCisvLworLy8gIFNvbWUgdXRpbGl0eSBtYWNyb3MKKy8vCisjaWZuZGVmIG1pbgorI2RlZmluZSBtaW4oX2EsIF9iKSAgICAgKCgoX2EpIDwgKF9iKSkgPyAoX2EpIDogKF9iKSkKKyNlbmRpZgorCisjaWZuZGVmIG1heAorI2RlZmluZSBtYXgoX2EsIF9iKSAgICAgKCgoX2EpID4gKF9iKSkgPyAoX2EpIDogKF9iKSkKKyNlbmRpZgorCisjZGVmaW5lIEdFVF9MTkFfR0FJTihfcEFkKQkoKF9wQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpID8gKF9wQWQtPkJMTkFHYWluKSA6ICgoX3BBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSA2NCkgPyAoX3BBZC0+QUxOQUdhaW4wKSA6ICgoX3BBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxMjgpID8gKF9wQWQtPkFMTkFHYWluMSkgOiAoX3BBZC0+QUxOQUdhaW4yKSkpKQorCisjZGVmaW5lIElOQ19DT1VOVEVSNjQoVmFsKSAgICAgICAgICAoVmFsLlF1YWRQYXJ0KyspCisKKyNkZWZpbmUgSU5GUkFfT04oX3ApICAgICAgICAgICAgICAgIChPUFNUQVRVU19URVNUX0ZMQUcoX3AsIGZPUF9TVEFUVVNfSU5GUkFfT04pKQorI2RlZmluZSBBREhPQ19PTihfcCkgICAgICAgICAgICAgICAgKE9QU1RBVFVTX1RFU1RfRkxBRyhfcCwgZk9QX1NUQVRVU19BREhPQ19PTikpCisjZGVmaW5lIE1PTklUT1JfT04oX3ApICAgICAgICAgICAgICAoKChfcCktPlN0YUNmZy5Cc3NUeXBlKSA9PSBCU1NfTU9OSVRPUikKKyNkZWZpbmUgSURMRV9PTihfcCkgICAgICAgICAgICAgICAgICghSU5GUkFfT04oX3ApICYmICFBREhPQ19PTihfcCkpCisKKy8vIENoZWNrIExFQVAgJiBDQ0tNIGZsYWdzCisjZGVmaW5lIExFQVBfT04oX3ApICAgICAgICAgICAgICAgICAoKChfcCktPlN0YUNmZy5MZWFwQXV0aE1vZGUpID09IENJU0NPX0F1dGhNb2RlTEVBUCkKKyNkZWZpbmUgTEVBUF9DQ0tNX09OKF9wKSAgICAgICAgICAgICgoKChfcCktPlN0YUNmZy5MZWFwQXV0aE1vZGUpID09IENJU0NPX0F1dGhNb2RlTEVBUCkgJiYgKChfcCktPlN0YUNmZy5MZWFwQXV0aEluZm8uQ0NLTSA9PSBUUlVFKSkKKworLy8gaWYgb3JnaW5hbCBFdGhlcm5ldCBmcmFtZSBjb250YWlucyBubyBMTEMvU05BUCwgdGhlbiBhbiBleHRyYSBMTEMvU05BUCBlbmNhcCBpcyByZXF1aXJlZAorI2RlZmluZSBFWFRSQV9MTENTTkFQX0VOQ0FQX0ZST01fUEtUX1NUQVJUKF9wQnVmVkEsIF9wRXh0cmFMbGNTbmFwRW5jYXApCQlcCit7CQkJCQkJCQkJCQkJCQkJCVwKKwlpZiAoKCgqKF9wQnVmVkEgKyAxMikgPDwgOCkgKyAqKF9wQnVmVkEgKyAxMykpID4gMTUwMCkJCVwKKwl7CQkJCQkJCQkJCQkJCQkJXAorCQlfcEV4dHJhTGxjU25hcEVuY2FwID0gU05BUF84MDJfMUg7CQkJCQkJXAorCQlpZiAoTmRpc0VxdWFsTWVtb3J5KElQWCwgX3BCdWZWQSArIDEyLCAyKSB8fCAJCQlcCisJCQlOZGlzRXF1YWxNZW1vcnkoQVBQTEVfVEFMSywgX3BCdWZWQSArIDEyLCAyKSkJCVwKKwkJewkJCQkJCQkJCQkJCQkJXAorCQkJX3BFeHRyYUxsY1NuYXBFbmNhcCA9IFNOQVBfQlJJREdFX1RVTk5FTDsJCQlcCisJCX0JCQkJCQkJCQkJCQkJCVwKKwl9CQkJCQkJCQkJCQkJCQkJXAorCWVsc2UJCQkJCQkJCQkJCQkJCVwKKwl7CQkJCQkJCQkJCQkJCQkJXAorCQlfcEV4dHJhTGxjU25hcEVuY2FwID0gTlVMTDsJCQkJCQkJCVwKKwl9CQkJCQkJCQkJCQkJCQkJXAorfQorCisvLyBOZXcgRGVmaW5lIGZvciBuZXcgVHggUGF0aC4KKyNkZWZpbmUgRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9PRkZTRVQoX3BCdWZWQSwgX3BFeHRyYUxsY1NuYXBFbmNhcCkJXAorewkJCQkJCQkJCQkJCQkJCQlcCisJaWYgKCgoKihfcEJ1ZlZBKSA8PCA4KSArICooX3BCdWZWQSArIDEpKSA+IDE1MDApCQkJXAorCXsJCQkJCQkJCQkJCQkJCQlcCisJCV9wRXh0cmFMbGNTbmFwRW5jYXAgPSBTTkFQXzgwMl8xSDsJCQkJCQlcCisJCWlmIChOZGlzRXF1YWxNZW1vcnkoSVBYLCBfcEJ1ZlZBLCAyKSB8fCAJCQkJXAorCQkJTmRpc0VxdWFsTWVtb3J5KEFQUExFX1RBTEssIF9wQnVmVkEsIDIpKQkJCVwKKwkJewkJCQkJCQkJCQkJCQkJXAorCQkJX3BFeHRyYUxsY1NuYXBFbmNhcCA9IFNOQVBfQlJJREdFX1RVTk5FTDsJCQlcCisJCX0JCQkJCQkJCQkJCQkJCVwKKwl9CQkJCQkJCQkJCQkJCQkJXAorCWVsc2UJCQkJCQkJCQkJCQkJCVwKKwl7CQkJCQkJCQkJCQkJCQkJXAorCQlfcEV4dHJhTGxjU25hcEVuY2FwID0gTlVMTDsJCQkJCQkJCVwKKwl9CQkJCQkJCQkJCQkJCQkJXAorfQorCisKKyNkZWZpbmUgTUFLRV84MDJfM19IRUFERVIoX3AsIF9wTWFjMSwgX3BNYWMyLCBfcFR5cGUpICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBOZGlzTW92ZU1lbW9yeShfcCwgX3BNYWMxLCBNQUNfQUREUl9MRU4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBOZGlzTW92ZU1lbW9yeSgoX3AgKyBNQUNfQUREUl9MRU4pLCBfcE1hYzIsIE1BQ19BRERSX0xFTik7ICAgICAgICAgIFwKKyAgICBOZGlzTW92ZU1lbW9yeSgoX3AgKyBNQUNfQUREUl9MRU4gKiAyKSwgX3BUeXBlLCBMRU5HVEhfODAyXzNfVFlQRSk7IFwKK30KKworLy8gaWYgcERhdGEgaGFzIG5vIExMQy9TTkFQIChuZWl0aGVyIFJGQzEwNDIgbm9yIEJyaWRnZSB0dW5uZWwpLCBrZWVwIGl0IHRoYXQgd2F5LgorLy8gZWxzZSBpZiB0aGUgcmVjZWl2ZWQgZnJhbWUgaXMgTExDL1NOQVAtZW5jYXBlZCBJUFggb3IgQVBQTEVUQUxLLCBwcmVzZXJ2ZSB0aGUgTExDL1NOQVAgZmllbGQKKy8vIGVsc2UgcmVtb3ZlIHRoZSBMTEMvU05BUCBmaWVsZCBmcm9tIHRoZSByZXN1bHQgRXRoZXJuZXQgZnJhbWUKKy8vIFBhdGNoIGZvciBXSFFMIG9ubHksIHdoaWNoIGRpZCBub3QgdHVybiBvbiBOZXRiaW9zIGJ1dCB1c2UgSVBYIHdpdGhpbiBpdHMgcGF5bG9hZAorLy8gTm90ZToKKy8vICAgICBfcERhdGEgJiBfRGF0YVNpemUgbWF5IGJlIGFsdGVyZWQgKHJlbW92ZSA4LWJ5dGUgTExDL1NOQVApIGJ5IHRoaXMgTUFDUk8KKy8vICAgICBfcFJlbW92ZWRMTENTTkFQOiBwb2ludGVyIHRvIHJlbW92ZWQgTExDL1NOQVA7IE5VTEwgaXMgbm90IHJlbW92ZWQKKyNkZWZpbmUgQ09OVkVSVF9UT184MDJfMyhfcDgwMjNoZHIsIF9wREEsIF9wU0EsIF9wRGF0YSwgX0RhdGFTaXplLCBfcFJlbW92ZWRMTENTTkFQKSAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjaGFyIExMQ19MZW5bMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfcFJlbW92ZWRMTENTTkFQID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KFNOQVBfODAyXzFILCBfcERhdGEsIDYpICB8fCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTmRpc0VxdWFsTWVtb3J5KFNOQVBfQlJJREdFX1RVTk5FTCwgX3BEYXRhLCA2KSkgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUFVDSEFSIHBQcm90byA9IF9wRGF0YSArIDY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChOZGlzRXF1YWxNZW1vcnkoSVBYLCBwUHJvdG8sIDIpIHx8IE5kaXNFcXVhbE1lbW9yeShBUFBMRV9UQUxLLCBwUHJvdG8sIDIpKSAmJiAgXAorICAgICAgICAgICAgTmRpc0VxdWFsTWVtb3J5KFNOQVBfODAyXzFILCBfcERhdGEsIDYpKSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTExDX0xlblswXSA9IChVQ0hBUikoX0RhdGFTaXplIC8gMjU2KTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTExDX0xlblsxXSA9IChVQ0hBUikoX0RhdGFTaXplICUgMjU2KTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTUFLRV84MDJfM19IRUFERVIoX3A4MDIzaGRyLCBfcERBLCBfcFNBLCBMTENfTGVuKTsgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTUFLRV84MDJfM19IRUFERVIoX3A4MDIzaGRyLCBfcERBLCBfcFNBLCBwUHJvdG8pOyAgICAgICAgICAgXAorICAgICAgICAgICAgX3BSZW1vdmVkTExDU05BUCA9IF9wRGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX0RhdGFTaXplIC09IExFTkdUSF84MDJfMV9IOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX3BEYXRhICs9IExFTkdUSF84MDJfMV9IOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBMTENfTGVuWzBdID0gKFVDSEFSKShfRGF0YVNpemUgLyAyNTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBMTENfTGVuWzFdID0gKFVDSEFSKShfRGF0YVNpemUgJSAyNTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNQUtFXzgwMl8zX0hFQURFUihfcDgwMjNoZHIsIF9wREEsIF9wU0EsIExMQ19MZW4pOyAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIFNXSVRDSF9BQiggX3BBQSwgX3BCQikgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQVk9JRCBwQ0M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwQ0MgPSBfcEJCOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX3BCQiA9IF9wQUE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfcEFBID0gcENDOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIEVucXVldWUgdGhpcyBmcmFtZSB0byBNTE1FIGVuZ2luZQorLy8gV2UgbmVlZCB0byBlbnF1ZXVlIHRoZSB3aG9sZSBmcmFtZSBiZWNhdXNlIE1MTUUgbmVlZCB0byBwYXNzIGRhdGEgdHlwZQorLy8gaW5mb3JtYXRpb24gZnJvbSA4MDIuMTEgaGVhZGVyCisjaWZkZWYgUlQyODcwCisjZGVmaW5lIFJFUE9SVF9NR01UX0ZSQU1FX1RPX01MTUUoX3BBZCwgV2NpZCwgX3BGcmFtZSwgX0ZyYW1lU2l6ZSwgX1Jzc2kwLCBfUnNzaTEsIF9Sc3NpMiwgX1BsY3BTaWduYWwpICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVJTlQzMiBIaWdoMzJUU0Y9MCwgTG93MzJUU0Y9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE1sbWVFbnF1ZXVlRm9yUmVjdihfcEFkLCBXY2lkLCBIaWdoMzJUU0YsIExvdzMyVFNGLCAoVUNIQVIpX1Jzc2kwLCAoVUNIQVIpX1Jzc2kxLChVQ0hBUilfUnNzaTIsX0ZyYW1lU2l6ZSwgX3BGcmFtZSwgKFVDSEFSKV9QbGNwU2lnbmFsKTsgICBcCit9CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKyNkZWZpbmUgTkRJU19RVUVSWV9CVUZGRVIoX05kaXNCdWYsIF9wcFZBLCBfcEJ1ZkxlbikgICAgICAgICAgICAgICAgICAgIFwKKyAgICBOZGlzUXVlcnlCdWZmZXIoX05kaXNCdWYsIF9wcFZBLCBfcEJ1ZkxlbikKKworI2RlZmluZSBNQUNfQUREUl9FUVVBTChwQWRkcjEscEFkZHIyKSAgICAgICAgICAgUlRNUEVxdWFsTWVtb3J5KChQVk9JRCkocEFkZHIxKSwgKFBWT0lEKShwQWRkcjIpLCBNQUNfQUREUl9MRU4pCisjZGVmaW5lIFNTSURfRVFVQUwoc3NpZDEsIGxlbjEsIHNzaWQyLCBsZW4yKSAgICAoKGxlbjE9PWxlbjIpICYmIChSVE1QRXF1YWxNZW1vcnkoc3NpZDEsIHNzaWQyLCBsZW4xKSkpCisKKy8vCisvLyBDaGVjayBpZiBpdCBpcyBKYXBhbiBXNTMoY2g1Miw1Niw2MCw2NCkgY2hhbm5lbC4KKy8vCisjZGVmaW5lIEphcGFuQ2hhbm5lbENoZWNrKGNoYW5uZWwpICAoKGNoYW5uZWwgPT0gNTIpIHx8IChjaGFubmVsID09IDU2KSB8fCAoY2hhbm5lbCA9PSA2MCkgfHwgKGNoYW5uZWwgPT0gNjQpKQorCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZGVmaW5lIFNUQV9QT1JUX1NFQ1VSRUQoX3BBZCkgXAoreyBcCisJX3BBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7IFwKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZfcEFkLT5NYWNUYWJMb2NrKTsgXAorCV9wQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBvcnRTZWN1cmVkID0gX3BBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkOyBcCisJTmRpc1JlbGVhc2VTcGluTG9jaygmX3BBZC0+TWFjVGFiTG9jayk7IFwKK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCisvLworLy8gUmVnaXN0ZXIgc2V0IHBhaXIgZm9yIGluaXRpYWx6YXRpb24gcmVnaXN0ZXIgc2V0IGRlZmluaXRpb24KKy8vCit0eXBlZGVmIHN0cnVjdCAgX1JUTVBfUkVHX1BBSVIKK3sKKwlVTE9ORyAgIFJlZ2lzdGVyOworCVVMT05HICAgVmFsdWU7Cit9IFJUTVBfUkVHX1BBSVIsICpQUlRNUF9SRUdfUEFJUjsKKwordHlwZWRlZiBzdHJ1Y3QgIF9SRUdfUEFJUgoreworCVVDSEFSICAgUmVnaXN0ZXI7CisJVUNIQVIgICBWYWx1ZTsKK30gUkVHX1BBSVIsICpQUkVHX1BBSVI7CisKKy8vCisvLyBSZWdpc3RlciBzZXQgcGFpciBmb3IgaW5pdGlhbHphdGlvbiByZWdpc3RlciBzZXQgZGVmaW5pdGlvbgorLy8KK3R5cGVkZWYgc3RydWN0ICBfUlRNUF9SRl9SRUdTCit7CisJVUNIQVIgICBDaGFubmVsOworCVVMT05HICAgUjE7CisJVUxPTkcgICBSMjsKKwlVTE9ORyAgIFIzOworCVVMT05HICAgUjQ7Cit9IFJUTVBfUkZfUkVHUywgKlBSVE1QX1JGX1JFR1M7CisKK3R5cGVkZWYgc3RydWN0IF9GUkVRVUVOQ1lfSVRFTSB7CisJVUNIQVIJQ2hhbm5lbDsKKwlVQ0hBUglOOworCVVDSEFSCVI7CisJVUNIQVIJSzsKK30gRlJFUVVFTkNZX0lURU0sICpQRlJFUVVFTkNZX0lURU07CisKKy8vCisvLyAgRGF0YSBidWZmZXIgZm9yIERNQSBvcGVyYXRpb24sIHRoZSBidWZmZXIgbXVzdCBiZSBjb250aWd1b3VzIHBoeXNpY2FsIG1lbW9yeQorLy8gIEJvdGggRE1BIHRvIC8gZnJvbSBDUFUgdXNlIHRoZSBzYW1lIHN0cnVjdHVyZS4KKy8vCit0eXBlZGVmIHN0cnVjdCAgX1JUTVBfRE1BQlVGCit7CisJVUxPTkcgICAgICAgICAgICAgICAgICAgQWxsb2NTaXplOworCVBWT0lEICAgICAgICAgICAgICAgICAgIEFsbG9jVmE7ICAgICAgICAgICAgLy8gVHhCdWYgdmlydHVhbCBhZGRyZXNzCisJTkRJU19QSFlTSUNBTF9BRERSRVNTICAgQWxsb2NQYTsgICAgICAgICAgICAvLyBUeEJ1ZiBwaHlzaWNhbCBhZGRyZXNzCit9IFJUTVBfRE1BQlVGLCAqUFJUTVBfRE1BQlVGOworCisKK3R5cGVkZWYJdW5pb24JX0hFQURFUl84MDJfMTFfU0VReworI2lmZGVmIFJUX0JJR19FTkRJQU4KKyAgICBzdHJ1Y3QgeworICAgCVVTSE9SVAkJCVNlcXVlbmNlOjEyOworCVVTSE9SVAkJCUZyYWc6NDsKKyAgICB9ICAgZmllbGQ7CisjZWxzZQorICAgIHN0cnVjdCB7CisJVVNIT1JUCQkJRnJhZzo0OworCVVTSE9SVAkJCVNlcXVlbmNlOjEyOworICAgIH0gICBmaWVsZDsKKyNlbmRpZgorICAgIFVTSE9SVCAgICAgICAgICAgdmFsdWU7Cit9CUhFQURFUl84MDJfMTFfU0VRLCAqUEhFQURFUl84MDJfMTFfU0VROworCisvLworLy8gIERhdGEgYnVmZmVyIGZvciBETUEgb3BlcmF0aW9uLCB0aGUgYnVmZmVyIG11c3QgYmUgY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnkKKy8vICBCb3RoIERNQSB0byAvIGZyb20gQ1BVIHVzZSB0aGUgc2FtZSBzdHJ1Y3R1cmUuCisvLwordHlwZWRlZiBzdHJ1Y3QgIF9SVE1QX1JFT1JERVJCVUYKK3sKKwlCT09MRUFOCQkJSXNGdWxsOworCVBWT0lEICAgICAgICAgICAgICAgICAgIEFsbG9jVmE7ICAgICAgICAgICAgLy8gVHhCdWYgdmlydHVhbCBhZGRyZXNzCisJVUNIQVIJCQlIZWFkZXI4MDJfM1sxNF07CisJSEVBREVSXzgwMl8xMV9TRVEJCQlTZXF1ZW5jZTsJLy9zdXBwb3J0IGNvbXByZXNzZWQgYml0bWFwIEJBLCBzbyBubyBjb25zaWRlciBmcmFnbWVudCBpbiBCQQorCVVDSEFSIAkJRGF0YU9mZnNldDsKKwlVU0hPUlQgCQlEYXRhc2l6ZTsKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBBbGxvY1NpemU7CisjaWZkZWYgUlQyODcwCisJUFVDSEFSCQkJCQlBbGxvY1BhOworI2VuZGlmIC8vIFJUMjg3MCAvLworfSAgIFJUTVBfUkVPUkRFUkJVRiwgKlBSVE1QX1JFT1JERVJCVUY7CisKKy8vCisvLyBDb250cm9sIGJsb2NrIChEZXNjcmlwdG9yKSBmb3IgYWxsIHJpbmcgZGVzY3JpcHRvciBETUEgb3BlcmF0aW9uLCBidWZmZXIgbXVzdCBiZQorLy8gY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnkuIE5ESVNfUEFDS0VUIHN0b3JlZCB0aGUgYmluZGluZyBSeCBwYWNrZXQgZGVzY3JpcHRvcgorLy8gd2hpY2ggd29uJ3QgYmUgcmVsZWFzZWQsIGRyaXZlciBoYXMgdG8gd2FpdCB1bnRpbCB1cHBlciBsYXllciByZXR1cm4gdGhlIHBhY2tldAorLy8gYmVmb3JlIGdpdmVpbmcgdXAgdGhpcyByeCByaW5nIGRlc2NyaXB0b3IgdG8gQVNJQy4gTkRJU19CVUZGRVIgaXMgYXNzb2NhaXRlZCBwYWlyCisvLyB0byBkZXNjcmliZSB0aGUgcGFja2V0IGJ1ZmZlci4gRm9yIFR4LCBORElTX1BBQ0tFVCBzdG9yZWQgdGhlIHR4IHBhY2tldCBkZXNjcmlwdG9yCisvLyB3aGljaCBkcml2ZXIgc2hvdWxkIEFDSyB1cHBlciBsYXllciB3aGVuIHRoZSB0eCBpcyBwaHlzaWNhbGx5IGRvbmUgb3IgZmFpbGVkLgorLy8KK3R5cGVkZWYgc3RydWN0IF9SVE1QX0RNQUNCCit7CisJVUxPTkcgICAgICAgICAgICAgICAgICAgQWxsb2NTaXplOyAgICAgICAgICAvLyBDb250cm9sIGJsb2NrIHNpemUKKwlQVk9JRCAgICAgICAgICAgICAgICAgICBBbGxvY1ZhOyAgICAgICAgICAgIC8vIENvbnRyb2wgYmxvY2sgdmlydHVhbCBhZGRyZXNzCisJTkRJU19QSFlTSUNBTF9BRERSRVNTICAgQWxsb2NQYTsgICAgICAgICAgICAvLyBDb250cm9sIGJsb2NrIHBoeXNpY2FsIGFkZHJlc3MKKwlQTkRJU19QQUNLRVQgcE5kaXNQYWNrZXQ7CisJUE5ESVNfUEFDS0VUIHBOZXh0TmRpc1BhY2tldDsKKworCVJUTVBfRE1BQlVGICAgICAgICAgICAgIERtYUJ1ZjsgICAgICAgICAgICAgLy8gQXNzb2NpYXRlZCBETUEgYnVmZmVyIHN0cnVjdHVyZQorfSBSVE1QX0RNQUNCLCAqUFJUTVBfRE1BQ0I7CisKK3R5cGVkZWYgc3RydWN0IF9SVE1QX1RYX0JVRgoreworCVBRVUVVRV9FTlRSWSAgICBOZXh0OworCVVDSEFSICAgICAgICAgICBJbmRleDsKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBBbGxvY1NpemU7ICAgICAgICAgIC8vIENvbnRyb2wgYmxvY2sgc2l6ZQorCVBWT0lEICAgICAgICAgICAgICAgICAgIEFsbG9jVmE7ICAgICAgICAgICAgLy8gQ29udHJvbCBibG9jayB2aXJ0dWFsIGFkZHJlc3MKKwlORElTX1BIWVNJQ0FMX0FERFJFU1MgICBBbGxvY1BhOyAgICAgICAgICAgIC8vIENvbnRyb2wgYmxvY2sgcGh5c2ljYWwgYWRkcmVzcworfSBSVE1QX1RYQlVGLCAqUFJUTVBfVFhCVUY7CisKK3R5cGVkZWYgc3RydWN0IF9SVE1QX1JYX0JVRgoreworCUJPT0xFQU4gICAgICAgICAgIEluVXNlOworCVVMT05HICAgICAgICAgICAJQnlCYVJlY0luZGV4OworCVJUTVBfUkVPUkRFUkJVRglNQVBfUlhCdWZbTUFYX1JYX1JFT1JERVJCVUZdOworfSBSVE1QX1JYQlVGLCAqUFJUTVBfUlhCVUY7Cit0eXBlZGVmIHN0cnVjdCBfUlRNUF9UWF9SSU5HCit7CisJUlRNUF9ETUFDQiAgQ2VsbFtUWF9SSU5HX1NJWkVdOworCVVJTlQzMgkJVHhDcHVJZHg7CisJVUlOVDMyCQlUeERtYUlkeDsKKwlVSU5UMzIJCVR4U3dGcmVlSWR4OyAJLy8gc29mdHdhcmUgbmV4dCBmcmVlIHR4IGluZGV4Cit9IFJUTVBfVFhfUklORywgKlBSVE1QX1RYX1JJTkc7CisKK3R5cGVkZWYgc3RydWN0IF9SVE1QX1JYX1JJTkcKK3sKKwlSVE1QX0RNQUNCICBDZWxsW1JYX1JJTkdfU0laRV07CisJVUlOVDMyCQlSeENwdUlkeDsKKwlVSU5UMzIJCVJ4RG1hSWR4OworCUlOVDMyCQlSeFN3UmVhZElkeDsgCS8vIHNvZnR3YXJlIG5leHQgcmVhZCBpbmRleAorfSBSVE1QX1JYX1JJTkcsICpQUlRNUF9SWF9SSU5HOworCit0eXBlZGVmIHN0cnVjdCBfUlRNUF9NR01UX1JJTkcKK3sKKwlSVE1QX0RNQUNCICBDZWxsW01HTVRfUklOR19TSVpFXTsKKwlVSU5UMzIJCVR4Q3B1SWR4OworCVVJTlQzMgkJVHhEbWFJZHg7CisJVUlOVDMyCQlUeFN3RnJlZUlkeDsgLy8gc29mdHdhcmUgbmV4dCBmcmVlIHR4IGluZGV4Cit9IFJUTVBfTUdNVF9SSU5HLCAqUFJUTVBfTUdNVF9SSU5HOworCisvLworLy8gIFN0YXRpc3RpYyBjb3VudGVyIHN0cnVjdHVyZQorLy8KK3R5cGVkZWYgc3RydWN0IF9DT1VOVEVSXzgwMl8zCit7CisJLy8gR2VuZXJhbCBTdGF0cworCVVMT05HICAgICAgIEdvb2RUcmFuc21pdHM7CisJVUxPTkcgICAgICAgR29vZFJlY2VpdmVzOworCVVMT05HICAgICAgIFR4RXJyb3JzOworCVVMT05HICAgICAgIFJ4RXJyb3JzOworCVVMT05HICAgICAgIFJ4Tm9CdWZmZXI7CisKKwkvLyBFdGhlcm5ldCBTdGF0cworCVVMT05HICAgICAgIFJjdkFsaWdubWVudEVycm9yczsKKwlVTE9ORyAgICAgICBPbmVDb2xsaXNpb247CisJVUxPTkcgICAgICAgTW9yZUNvbGxpc2lvbnM7CisKK30gQ09VTlRFUl84MDJfMywgKlBDT1VOVEVSXzgwMl8zOworCit0eXBlZGVmIHN0cnVjdCBfQ09VTlRFUl84MDJfMTEgeworCVVMT05HICAgICAgICAgICBMZW5ndGg7CisJTEFSR0VfSU5URUdFUiAgIExhc3RUcmFuc21pdHRlZEZyYWdtZW50Q291bnQ7CisJTEFSR0VfSU5URUdFUiAgIFRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgTXVsdGljYXN0VHJhbnNtaXR0ZWRGcmFtZUNvdW50OworCUxBUkdFX0lOVEVHRVIgICBGYWlsZWRDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgUmV0cnlDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgTXVsdGlwbGVSZXRyeUNvdW50OworCUxBUkdFX0lOVEVHRVIgICBSVFNTdWNjZXNzQ291bnQ7CisJTEFSR0VfSU5URUdFUiAgIFJUU0ZhaWx1cmVDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgQUNLRmFpbHVyZUNvdW50OworCUxBUkdFX0lOVEVHRVIgICBGcmFtZUR1cGxpY2F0ZUNvdW50OworCUxBUkdFX0lOVEVHRVIgICBSZWNlaXZlZEZyYWdtZW50Q291bnQ7CisJTEFSR0VfSU5URUdFUiAgIE11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgRkNTRXJyb3JDb3VudDsKK30gQ09VTlRFUl84MDJfMTEsICpQQ09VTlRFUl84MDJfMTE7CisKK3R5cGVkZWYgc3RydWN0IF9DT1VOVEVSX1JBTElOSyB7CisJVUxPTkcgICAgICAgICAgIFRyYW5zbWl0dGVkQnl0ZUNvdW50OyAgIC8vIGJvdGggc3VjY2Vzc2Z1bCBhbmQgZmFpbHVyZSwgdXNlZCB0byBjYWxjdWxhdGUgVFggdGhyb3VnaHB1dAorCVVMT05HICAgICAgICAgICBSZWNlaXZlZEJ5dGVDb3VudDsgICAgICAvLyBib3RoIENSQyBva2F5IGFuZCBDUkMgZXJyb3IsIHVzZWQgdG8gY2FsY3VsYXRlIFJYIHRocm91Z2hwdXQKKwlVTE9ORyAgICAgICAgICAgQmVlbkRpc2Fzc29jaWF0ZWRDb3VudDsKKwlVTE9ORyAgICAgICAgICAgQmFkQ1FJQXV0b1JlY292ZXJ5Q291bnQ7CisJVUxPTkcgICAgICAgICAgIFBvb3JDUUlSb2FtaW5nQ291bnQ7CisJVUxPTkcgICAgICAgICAgIE1nbXRSaW5nRnVsbENvdW50OworCVVMT05HICAgICAgICAgICBSeENvdW50U2luY2VMYXN0TlVMTDsKKwlVTE9ORyAgICAgICAgICAgUnhDb3VudDsKKwlVTE9ORyAgICAgICAgICAgUnhSaW5nRXJyQ291bnQ7CisJVUxPTkcgICAgICAgICAgIEtpY2tUeENvdW50OworCVVMT05HICAgICAgICAgICBUeFJpbmdFcnJDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgUmVhbEZjc0VyckNvdW50OworCVVMT05HICAgICAgICAgICBQZW5kaW5nTmRpc1BhY2tldENvdW50OworCisJVUxPTkcgICAgICAgICAgIE9uZVNlY09zVHhDb3VudFtOVU1fT0ZfVFhfUklOR107CisJVUxPTkcgICAgICAgICAgIE9uZVNlY0RtYURvbmVDb3VudFtOVU1fT0ZfVFhfUklOR107CisJVUlOVDMyICAgICAgICAgIE9uZVNlY1R4RG9uZUNvdW50OworCVVMT05HICAgICAgICAgICBPbmVTZWNSeENvdW50OworCVVJTlQzMiAgICAgICAgICBPbmVTZWNUeEFnZ3JlZ2F0aW9uQ291bnQ7CisJVUlOVDMyICAgICAgICAgIE9uZVNlY1J4QWdncmVnYXRpb25Db3VudDsKKworCVVJTlQzMiAgIAkJT25lU2VjRnJhbWVEdXBsaWNhdGVDb3VudDsKKworI2lmZGVmIFJUMjg3MAorCVVMT05HICAgICAgICAgICBPbmVTZWNUcmFuc21pdHRlZEJ5dGVDb3VudDsgICAvLyBib3RoIHN1Y2Nlc3NmdWwgYW5kIGZhaWx1cmUsIHVzZWQgdG8gY2FsY3VsYXRlIFRYIHRocm91Z2hwdXQKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworCVVJTlQzMiAgICAgICAgICBPbmVTZWNUeE5vUmV0cnlPa0NvdW50OworCVVJTlQzMiAgICAgICAgICBPbmVTZWNUeFJldHJ5T2tDb3VudDsKKwlVSU5UMzIgICAgICAgICAgT25lU2VjVHhGYWlsQ291bnQ7CisJVUlOVDMyICAgICAgICAgIE9uZVNlY0ZhbHNlQ0NBQ250OyAgICAgIC8vIENDQSBlcnJvciBjb3VudCwgZm9yIGRlYnVnIHB1cnBvc2UsIG1pZ2h0IG1vdmUgdG8gZ2xvYmFsIGNvdW50ZXIKKwlVSU5UMzIgICAgICAgICAgT25lU2VjUnhPa0NudDsgICAgICAgICAgLy8gUlggd2l0aG91dCBlcnJvcgorCVVJTlQzMiAgICAgICAgICBPbmVTZWNSeE9rRGF0YUNudDsgICAgICAvLyB1bmljYXN0LXRvLW1lIERBVEEgZnJhbWUgY291bnQKKwlVSU5UMzIgICAgICAgICAgT25lU2VjUnhGY3NFcnJDbnQ7ICAgICAgLy8gQ1JDIGVycm9yCisJVUlOVDMyICAgICAgICAgIE9uZVNlY0JlYWNvblNlbnRDbnQ7CisJVUlOVDMyICAgICAgICAgIExhc3RPbmVTZWNUb3RhbFR4Q291bnQ7IC8vIE9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKyBPbmVTZWNUeFJldHJ5T2tDb3VudCArIE9uZVNlY1R4RmFpbENvdW50CisJVUlOVDMyICAgICAgICAgIExhc3RPbmVTZWNSeE9rRGF0YUNudDsgIC8vIE9uZVNlY1J4T2tEYXRhQ250CisJVUxPTkcJCUR1cGxpY2F0ZVJjdjsKKwlVTE9ORwkJVHhBZ2dDb3VudDsKKwlVTE9ORwkJVHhOb25BZ2dDb3VudDsKKwlVTE9ORwkJVHhBZ2cxTVBEVUNvdW50OworCVVMT05HCQlUeEFnZzJNUERVQ291bnQ7CisJVUxPTkcJCVR4QWdnM01QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2c0TVBEVUNvdW50OworCVVMT05HCQlUeEFnZzVNUERVQ291bnQ7CisJVUxPTkcJCVR4QWdnNk1QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2c3TVBEVUNvdW50OworCVVMT05HCQlUeEFnZzhNUERVQ291bnQ7CisJVUxPTkcJCVR4QWdnOU1QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2cxME1QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2cxMU1QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2cxMk1QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2cxM01QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2cxNE1QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2cxNU1QRFVDb3VudDsKKwlVTE9ORwkJVHhBZ2cxNk1QRFVDb3VudDsKKworCUxBUkdFX0lOVEVHRVIgICAgICAgVHJhbnNtaXR0ZWRPY3RldHNJbkFNU0RVOworCUxBUkdFX0lOVEVHRVIgICAgICAgVHJhbnNtaXR0ZWRBTVNEVUNvdW50OworCUxBUkdFX0lOVEVHRVIgICAgICAgUmVjZWl2ZWRPY3Rlc0luQU1TRFVDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgICAgIFJlY2VpdmVkQU1TRFVDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgICAgIFRyYW5zbWl0dGVkQU1QRFVDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgICAgIFRyYW5zbWl0dGVkTVBEVXNJbkFNUERVQ291bnQ7CisJTEFSR0VfSU5URUdFUiAgICAgICBUcmFuc21pdHRlZE9jdGV0c0luQU1QRFVDb3VudDsKKwlMQVJHRV9JTlRFR0VSICAgICAgIE1QRFVJblJlY2VpdmVkQU1QRFVDb3VudDsKK30gQ09VTlRFUl9SQUxJTkssICpQQ09VTlRFUl9SQUxJTks7CisKK3R5cGVkZWYgc3RydWN0IF9QSURfQ09VTlRFUiB7CisJVUxPTkcgICAgICAgICAgIFR4QWNrUmVxdWlyZWRDb3VudDsgICAgICAvLyBDUkMgZXJyb3IKKwlVTE9ORyAgICAgICAgICAgVHhBZ2dyZUNvdW50OworCVVMT05HICAgICAgICAgICBUeFN1Y2Nlc3NDb3VudDsgLy8gT25lU2VjVHhOb1JldHJ5T2tDb3VudCArIE9uZVNlY1R4UmV0cnlPa0NvdW50ICsgT25lU2VjVHhGYWlsQ291bnQKKwlVTE9ORwkJTGFzdFN1Y2Nlc3NSYXRlOworfSBQSURfQ09VTlRFUiwgKlBQSURfQ09VTlRFUjsKKwordHlwZWRlZiBzdHJ1Y3QgX0NPVU5URVJfRFJTIHsKKwkvLyB0byByZWNvcmQgdGhlIGVhY2ggVFggcmF0ZSdzIHF1YWxpdHkuIDAgaXMgYmVzdCwgdGhlIGJpZ2dlciB0aGUgd29yc2UuCisJVVNIT1JUICAgICAgICAgIFR4UXVhbGl0eVtNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSF07CisJVUNIQVIgICAgICAgICAgIFBFUltNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSF07CisJVUNIQVIgICAgICAgICAgIFR4UmF0ZVVwUGVuYWx0eTsgICAgICAvLyBleHRyYSAjIG9mIHNlY29uZCBwZW5hbHR5IGR1ZSB0byBsYXN0IHVuc3RhYmxlIGNvbmRpdGlvbgorCVVMT05HICAgICAgICAgICBDdXJyVHhSYXRlU3RhYmxlVGltZTsgLy8gIyBvZiBzZWNvbmQgaW4gY3VycmVudCBUWCByYXRlCisJQk9PTEVBTiAgICAgICAgIGZOb2lzeUVudmlyb25tZW50OworCUJPT0xFQU4gICAgICAgICBmTGFzdFNlY0FjY29yZGluZ1JTU0k7CisJVUNIQVIgICAgICAgICAgIExhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb247IC8vIDA6IG5vIGNoYW5nZSwgMTpyYXRlIFVQLCAyOnJhdGUgZG93bgorCVVDSEFSCQkJTGFzdFRpbWVUeFJhdGVDaGFuZ2VBY3Rpb247IC8vS2VlcCBsYXN0IHRpbWUgdmFsdWUgb2YgTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbgorCVVMT05HCQkJTGFzdFR4T2tDb3VudDsKK30gQ09VTlRFUl9EUlMsICpQQ09VTlRFUl9EUlM7CisKKy8vCisvLyAgQXJjZm91ciBTdHJ1Y3R1cmUgQWRkZWQgYnkgUGF1bFd1CisvLwordHlwZWRlZiBzdHJ1Y3QgIF9BUkNGT1VSCit7CisJVUlOVCAgICAgICAgICAgIFg7CisJVUlOVCAgICAgICAgICAgIFk7CisJVUNIQVIgICAgICAgICAgIFNUQVRFWzI1Nl07Cit9IEFSQ0ZPVVJDT05URVhULCAqUEFSQ0ZPVVJDT05URVhUOworCisvLyBNSU1PIFR4IHBhcmFtZXRlciwgU2hvcnRHSSwgTUNTLCBTVEJDLCBldGMuICB0aGVzZSBhcmUgZmllbGRzIGluIFRYV0kgdG9vLiBqdXN0IGNvcHkgdG8gVFhXSS4KK3R5cGVkZWYgc3RydWN0ICBfUkVDRUlWRV9TRVRUSU5HIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJVVNIT1JUCQlNSU1POjE7CisJVVNIT1JUCQlPRkRNOjE7CisJVVNIT1JUCQlyc3Y6MzsKKwlVU0hPUlQJCVNUQkM6MjsJLy9TUEFDRQorCVVTSE9SVAkJU2hvcnRHSToxOworCVVTSE9SVAkJTW9kZToyOwkvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegorCVVTSE9SVCAgIAlOdW1PZlJYOjI7ICAgICAgICAgICAgICAgICAvLyBNSU1PLiBXRSBIQVZFIDNSCisjZWxzZQorCVVTSE9SVCAgIAlOdW1PZlJYOjI7ICAgICAgICAgICAgICAgICAvLyBNSU1PLiBXRSBIQVZFIDNSCisJVVNIT1JUCQlNb2RlOjI7CS8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6CisJVVNIT1JUCQlTaG9ydEdJOjE7CisJVVNIT1JUCQlTVEJDOjI7CS8vU1BBQ0UKKwlVU0hPUlQJCXJzdjozOworCVVTSE9SVAkJT0ZETToxOworCVVTSE9SVAkJTUlNTzoxOworI2VuZGlmCisgfSBSRUNFSVZFX1NFVFRJTkcsICpQUkVDRUlWRV9TRVRUSU5HOworCisvLyBTaGFyZWQga2V5IGRhdGEgc3RydWN0dXJlCit0eXBlZGVmIHN0cnVjdCAgX1dFUF9LRVkgeworCVVDSEFSICAgS2V5TGVuOyAgICAgICAgICAgICAgICAgICAgIC8vIEtleSBsZW5ndGggZm9yIGVhY2gga2V5LCAwOiBlbnRyeSBpcyBpbnZhbGlkCisJVUNIQVIgICBLZXlbTUFYX0xFTl9PRl9LRVldOyAgICAgICAgLy8gcmlnaHQgbm93IHdlIGltcGxlbWVudCA0IGtleXMsIDEyOCBiaXRzIG1heAorfSBXRVBfS0VZLCAqUFdFUF9LRVk7CisKK3R5cGVkZWYgc3RydWN0IF9DSVBIRVJfS0VZIHsKKwlVQ0hBUiAgIEtleVsxNl07ICAgICAgICAgICAgLy8gcmlnaHQgbm93IHdlIGltcGxlbWVudCA0IGtleXMsIDEyOCBiaXRzIG1heAorCVVDSEFSICAgUnhNaWNbOF07CQkJLy8gbWFrZSBhbGlnbm1lbnQKKwlVQ0hBUiAgIFR4TWljWzhdOworCVVDSEFSICAgVHhUc2NbNl07ICAgICAgICAgICAvLyA0OGJpdCBUU0MgdmFsdWUKKwlVQ0hBUiAgIFJ4VHNjWzZdOyAgICAgICAgICAgLy8gNDhiaXQgVFNDIHZhbHVlCisJVUNIQVIgICBDaXBoZXJBbGc7ICAgICAgICAgIC8vIDAtbm9uZSwgMTpXRVA2NCwgMjpXRVAxMjgsIDM6VEtJUCwgNDpBRVMsIDU6Q0tJUDY0LCA2OkNLSVAxMjgKKwlVQ0hBUiAgIEtleUxlbjsKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKwlVQ0hBUiAgIEJzc0lkWzZdOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworICAgICAgICAgICAgLy8gS2V5IGxlbmd0aCBmb3IgZWFjaCBrZXksIDA6IGVudHJ5IGlzIGludmFsaWQKKwlVQ0hBUiAgIFR5cGU7ICAgICAgICAgICAgICAgLy8gSW5kaWNhdGUgUGFpcndpc2UvR3JvdXAgd2hlbiByZXBvcnRpbmcgTUlDIGVycm9yCit9IENJUEhFUl9LRVksICpQQ0lQSEVSX0tFWTsKKwordHlwZWRlZiBzdHJ1Y3QgX0JCUF9UVU5JTkdfU1RSVUNUIHsKKwlCT09MRUFOICAgICBFbmFibGU7CisJVUNIQVIgICAgICAgRmFsc2VDY2FDb3VudFVwcGVyQm91bmQ7ICAvLyAxMDAgcGVyIHNlYworCVVDSEFSICAgICAgIEZhbHNlQ2NhQ291bnRMb3dlckJvdW5kOyAgLy8gMTAgcGVyIHNlYworCVVDSEFSICAgICAgIFIxN0xvd2VyQm91bmQ7ICAgICAgICAgICAgLy8gc3BlY2lmaWVkIGluIEUyUFJPTQorCVVDSEFSICAgICAgIFIxN1VwcGVyQm91bmQ7ICAgICAgICAgICAgLy8gMHg2OCBhY2NvcmRpbmcgdG8gRGF2aWQgVHVuZworCVVDSEFSICAgICAgIEN1cnJlbnRSMTdWYWx1ZTsKK30gQkJQX1RVTklORywgKlBCQlBfVFVOSU5HOworCit0eXBlZGVmIHN0cnVjdCBfU09GVF9SWF9BTlRfRElWRVJTSVRZX1NUUlVDVCB7CisJVUNIQVIgICAgIEV2YWx1YXRlUGVyaW9kOwkJIC8vIDA6bm90IGV2YWx1dGUgc3RhdHVzLCAxOiBldmFsdWF0ZSBzdGF0dXMsIDI6IHN3aXRjaGluZyBzdGF0dXMKKwlVQ0hBUiAgICAgUGFpcjFQcmltYXJ5UnhBbnQ7ICAgICAvLyAwOkFudC1FMSwgMTpBbnQtRTIKKwlVQ0hBUiAgICAgUGFpcjFTZWNvbmRhcnlSeEFudDsgICAvLyAwOkFudC1FMSwgMTpBbnQtRTIKKwlVQ0hBUiAgICAgUGFpcjJQcmltYXJ5UnhBbnQ7ICAgICAvLyAwOkFudC1FMywgMTpBbnQtRTQKKwlVQ0hBUiAgICAgUGFpcjJTZWNvbmRhcnlSeEFudDsgICAvLyAwOkFudC1FMywgMTpBbnQtRTQKKwlTSE9SVCAgICAgUGFpcjFBdmdSc3NpWzJdOyAgICAgICAvLyBBdmdSc3NpWzBdOkUxLCBBdmdSc3NpWzFdOkUyCisJU0hPUlQgICAgIFBhaXIyQXZnUnNzaVsyXTsgICAgICAgLy8gQXZnUnNzaVswXTpFMywgQXZnUnNzaVsxXTpFNAorCVNIT1JUICAgICBQYWlyMUxhc3RBdmdSc3NpOyAgICAgIC8vCisJU0hPUlQgICAgIFBhaXIyTGFzdEF2Z1Jzc2k7ICAgICAgLy8KKwlVTE9ORyAgICAgUmN2UGt0TnVtV2hlbkV2YWx1YXRlOworCUJPT0xFQU4gICBGaXJzdFBrdEFycml2ZWRXaGVuRXZhbHVhdGU7CisJUkFMSU5LX1RJTUVSX1NUUlVDVCAgICBSeEFudERpdmVyc2l0eVRpbWVyOworfSBTT0ZUX1JYX0FOVF9ESVZFUlNJVFksICpQU09GVF9SWF9BTlRfRElWRVJTSVRZOworCit0eXBlZGVmIHN0cnVjdCBfTEVBUF9BVVRIX0lORk8geworCUJPT0xFQU4gICAgICAgICBFbmFibGVkOyAgICAgICAgLy9UdXJlOiBFbmFibGUgTEVBUCBBdXRoZW50aWNhdGlvbgorCUJPT0xFQU4gICAgICAgICBDQ0tNOyAgICAgICAgICAgLy9UdXJlOiBVc2UgRmFzdCBSZWF1dGhlbnRpY2F0aW9uIHdpdGggQ0NLTQorCVVDSEFSICAgICAgICAgICBSZXNlcnZlWzJdOworCVVDSEFSICAgICAgICAgICBVc2VyTmFtZVsyNTZdOyAgLy9MRUFQLCBVc2VyIG5hbWUKKwlVTE9ORyAgICAgICAgICAgVXNlck5hbWVMZW47CisJVUNIQVIgICAgICAgICAgIFBhc3N3b3JkWzI1Nl07ICAvL0xFQVAsIFVzZXIgUGFzc3dvcmQKKwlVTE9ORyAgICAgICAgICAgUGFzc3dvcmRMZW47Cit9IExFQVBfQVVUSF9JTkZPLCAqUExFQVBfQVVUSF9JTkZPOworCit0eXBlZGVmIHN0cnVjdCB7CisJVUNIQVIgICAgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUiAgICAgICAgRXJyb3JDb2RlWzJdOyAgLy8wMCAwMS1JbnZhbGlkIGF1dGhlbnRpY2F0aW9uIHR5cGUKKwkJCQkJCQkJLy8wMCAwMi1BdXRoZW50aWNhdGlvbiB0aW1lb3V0CisJCQkJCQkJCS8vMDAgMDMtQ2hhbGxlbmdlIGZyb20gQVAgZmFpbGVkCisJCQkJCQkJCS8vMDAgMDQtQ2hhbGxlbmdlIHRvIEFQIGZhaWxlZAorCUJPT0xFQU4gICAgICBSZXBvcnRlZDsKK30gUk9HVUVBUF9FTlRSWSwgKlBST0dVRUFQX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCB7CisJVUNIQVIgICAgICAgICAgICAgICBSb2d1ZUFwTnI7CisJUk9HVUVBUF9FTlRSWSAgICAgICBSb2d1ZUFwRW50cnlbTUFYX0xFTl9PRl9CU1NfVEFCTEVdOworfSBST0dVRUFQX1RBQkxFLCAqUFJPR1VFQVBfVEFCTEU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlCT09MRUFOICAgICBFbmFibGU7CisJVUNIQVIgICAgICAgRGVsdGE7CisJQk9PTEVBTiAgICAgUGx1c1NpZ247Cit9IENDS19UWF9QT1dFUl9DQUxJQlJBVEUsICpQQ0NLX1RYX1BPV0VSX0NBTElCUkFURTsKKworLy8KKy8vIFJlY2VpdmUgVHVwbGUgQ2FjaGUgRm9ybWF0CisvLwordHlwZWRlZiBzdHJ1Y3QgIF9UVVBMRV9DQUNIRSAgICB7CisJQk9PTEVBTiAgICAgICAgIFZhbGlkOworCVVDSEFSICAgICAgICAgICBNYWNBZGRyZXNzW01BQ19BRERSX0xFTl07CisJVVNIT1JUICAgICAgICAgIFNlcXVlbmNlOworCVVTSE9SVCAgICAgICAgICBGcmFnOworfSBUVVBMRV9DQUNIRSwgKlBUVVBMRV9DQUNIRTsKKworLy8KKy8vIEZyYWdtZW50IEZyYW1lIHN0cnVjdHVyZQorLy8KK3R5cGVkZWYgc3RydWN0ICBfRlJBR01FTlRfRlJBTUUgeworCVBORElTX1BBQ0tFVCAgICBwRnJhZ1BhY2tldDsKKwlVTE9ORyAgICAgICBSeFNpemU7CisJVVNIT1JUICAgICAgU2VxdWVuY2U7CisJVVNIT1JUICAgICAgTGFzdEZyYWc7CisJVUxPTkcgICAgICAgRmxhZ3M7ICAgICAgICAgIC8vIFNvbWUgZXh0cmEgZnJhbWUgaW5mb3JtYXRpb24uIGJpdCAwOiBMTEMgcHJlc2VudGVkCit9IEZSQUdNRU5UX0ZSQU1FLCAqUEZSQUdNRU5UX0ZSQU1FOworCisKKy8vCisvLyBQYWNrZXQgaW5mb3JtYXRpb24gZm9yIE5kaXNRdWVyeVBhY2tldAorLy8KK3R5cGVkZWYgc3RydWN0ICBfUEFDS0VUX0lORk8gICAgeworCVVJTlQgICAgICAgICAgICBQaHlzaWNhbEJ1ZmZlckNvdW50OyAgICAvLyBQaHlzaWNhbCBicmVha3Mgb2YgYnVmZmVyIGRlc2NyaXBvciBjaGFpbmVkCisJVUlOVCAgICAgICAgICAgIEJ1ZmZlckNvdW50IDsgICAgICAgICAgIC8vIE51bWJlciBvZiBCdWZmZXIgZGVzY3JpcHRvciBjaGFpbmVkCisJVUlOVCAgICAgICAgICAgIFRvdGFsUGFja2V0TGVuZ3RoIDsgICAgIC8vIFNlbGYgZXhwbGFpbmVkCisJUE5ESVNfQlVGRkVSICAgIHBGaXJzdEJ1ZmZlcjsgICAgICAgICAgIC8vIFBvaW50ZXIgdG8gZmlyc3QgYnVmZmVyIGRlc2NyaXB0b3IKK30gUEFDS0VUX0lORk8sICpQUEFDS0VUX0lORk87CisKKy8vCisvLyBUa2lwIEtleSBzdHJ1Y3R1cmUgd2hpY2ggUkM0IGtleSAmIE1JQyBjYWxjdWxhdGlvbgorLy8KK3R5cGVkZWYgc3RydWN0ICBfVEtJUF9LRVlfSU5GTyAgeworCVVJTlQgICAgICAgIG5CeXRlc0luTTsgIC8vICMgYnl0ZXMgaW4gTSBmb3IgTUlDS0VZCisJVUxPTkcgICAgICAgSVYxNjsKKwlVTE9ORyAgICAgICBJVjMyOworCVVMT05HICAgICAgIEswOyAgICAgICAgIC8vIGZvciBNSUNLRVkgTG93CisJVUxPTkcgICAgICAgSzE7ICAgICAgICAgLy8gZm9yIE1JQ0tFWSBIaWcKKwlVTE9ORyAgICAgICBMOyAgICAgICAgICAvLyBDdXJyZW50IHN0YXRlIGZvciBNSUNLRVkKKwlVTE9ORyAgICAgICBSOyAgICAgICAgICAvLyBDdXJyZW50IHN0YXRlIGZvciBNSUNLRVkKKwlVTE9ORyAgICAgICBNOyAgICAgICAgICAvLyBNZXNzYWdlIGFjY3VtdWxhdG9yIGZvciBNSUNLRVkKKwlVQ0hBUiAgICAgICBSQzRLRVlbMTZdOworCVVDSEFSICAgICAgIE1JQ1s4XTsKK30gVEtJUF9LRVlfSU5GTywgKlBUS0lQX0tFWV9JTkZPOworCisvLworLy8gUHJpdmF0ZSAvIE1pc2MgZGF0YSwgY291bnRlcnMgZm9yIGRyaXZlciBpbnRlcm5hbCB1c2UKKy8vCit0eXBlZGVmIHN0cnVjdCAgX19QUklWQVRFX1NUUlVDIHsKKwlVSU5UICAgICAgIFN5c3RlbVJlc2V0Q250OyAgICAgICAgIC8vIFN5c3RlbSByZXNldCBjb3VudGVyCisJVUlOVCAgICAgICBUeFJpbmdGdWxsQ250OyAgICAgICAgICAvLyBUeCByaW5nIGZ1bGwgb2NjdXJyYW5jZSBudW1iZXIKKwlVSU5UICAgICAgIFBoeVJ4RXJyQ250OyAgICAgICAgICAgIC8vIFBIWSBSeCBlcnJvciBjb3VudCwgZm9yIGRlYnVnIHB1cnBvc2UsIG1pZ2h0IG1vdmUgdG8gZ2xvYmFsIGNvdW50ZXIKKwkvLyBWYXJpYWJsZXMgZm9yIFdFUCBlbmNyeXB0aW9uIC8gZGVjcnlwdGlvbiBpbiBydG1wX3dlcC5jCisJVUlOVCAgICAgICBGQ1NDUkMzMjsKKwlBUkNGT1VSQ09OVEVYVCAgV0VQQ09OVEVYVDsKKwkvLyBUa2lwIHN0dWZmCisJVEtJUF9LRVlfSU5GTyAgIFR4OworCVRLSVBfS0VZX0lORk8gICBSeDsKK30gUFJJVkFURV9TVFJVQywgKlBQUklWQVRFX1NUUlVDOworCisvLyBzdHJ1Y3R1cmUgdG8gdHVuZSBCQlAgUjY2IChCQlAgVFVOSU5HKQordHlwZWRlZiBzdHJ1Y3QgX0JCUF9SNjZfVFVOSU5HIHsKKwlCT09MRUFOICAgICBiRW5hYmxlOworCVVTSE9SVCAgICAgIEZhbHNlQ2NhTG93ZXJUaHJlc2hvbGQ7ICAvLyBkZWZhdWx0IDEwMAorCVVTSE9SVCAgICAgIEZhbHNlQ2NhVXBwZXJUaHJlc2hvbGQ7ICAvLyBkZWZhdWx0IDUxMgorCVVDSEFSICAgICAgIFI2NkRlbHRhOworCVVDSEFSICAgICAgIFI2NkN1cnJlbnRWYWx1ZTsKKwlCT09MRUFOCQlSNjZMb3dlclVwcGVyU2VsZWN0OyAvL0JlZm9yZSBMaW5rVXAsIFVzZWQgTG93ZXJCb3VuZCBvciBVcHBlckJvdW5kIGFzIFI2NiB2YWx1ZS4KK30gQkJQX1I2Nl9UVU5JTkcsICpQQkJQX1I2Nl9UVU5JTkc7CisKKy8vIHN0cnVjdHVyZSB0byBzdG9yZSBjaGFubmVsIFRYIHBvd2VyCit0eXBlZGVmIHN0cnVjdCBfQ0hBTk5FTF9UWF9QT1dFUiB7CisJVVNIT1JUICAgICBSZW1haW5pbmdUaW1lRm9yVXNlOwkJLy91bml0OiBzZWMKKwlVQ0hBUiAgICAgIENoYW5uZWw7CisjaWZkZWYgRE9UMTFOX0RSQUZUMworCUJPT0xFQU4gICAgICAgYkVmZmVjdGVkQ2hhbm5lbDsJLy8gRm9yIEJXIDQwIG9wZXJhdGluZyBpbiAyLjRHSHogLCB0aGUgImVmZmVjdGVkIGNoYW5uZWwiIGlzIHRoZSBjaGFubmVsIHRoYXQgaXMgY292ZXJlZCBpbiA0ME1oei4KKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisJQ0hBUiAgICAgICBQb3dlcjsKKwlDSEFSICAgICAgIFBvd2VyMjsKKwlVQ0hBUiAgICAgIE1heFR4UHdyOworCVVDSEFSICAgICAgRGZzUmVxOworfSBDSEFOTkVMX1RYX1BPV0VSLCAqUENIQU5ORUxfVFhfUE9XRVI7CisKKy8vIHN0cnVjdHVyZSB0byBzdG9yZSA4MDIuMTFqIGNoYW5uZWwgVFggcG93ZXIKK3R5cGVkZWYgc3RydWN0IF9DSEFOTkVMXzExSl9UWF9QT1dFUiB7CisJVUNIQVIgICAgICBDaGFubmVsOworCVVDSEFSICAgICAgQlc7CS8vIEJXXzEwIG9yIEJXXzIwCisJQ0hBUiAgICAgICBQb3dlcjsKKwlDSEFSICAgICAgIFBvd2VyMjsKKwlVU0hPUlQgICAgIFJlbWFpbmluZ1RpbWVGb3JVc2U7CQkvL3VuaXQ6IHNlYworfSBDSEFOTkVMXzExSl9UWF9QT1dFUiwgKlBDSEFOTkVMXzExSl9UWF9QT1dFUjsKKwordHlwZWRlZiBlbnVtIF9BQkdCQU5EX1NUQVRFXyB7CisJVU5LTk9XTl9CQU5ELAorCUJHX0JBTkQsCisJQV9CQU5ELAorfSBBQkdCQU5EX1NUQVRFOworCit0eXBlZGVmIHN0cnVjdCBfTUxNRV9TVFJVQ1QgeworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorCS8vIFNUQSBzdGF0ZSBtYWNoaW5lcworCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIENudGxNYWNoaW5lOworCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIEFzc29jTWFjaGluZTsKKwlTVEFURV9NQUNISU5FICAgICAgICAgICBBdXRoTWFjaGluZTsKKwlTVEFURV9NQUNISU5FICAgICAgICAgICBBdXRoUnNwTWFjaGluZTsKKwlTVEFURV9NQUNISU5FICAgICAgICAgICBTeW5jTWFjaGluZTsKKwlTVEFURV9NQUNISU5FICAgICAgICAgICBXcGFQc2tNYWNoaW5lOworCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIExlYXBNYWNoaW5lOworCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIEFpcm9uZXRNYWNoaW5lOworCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIEFzc29jRnVuY1tBU1NPQ19GVU5DX1NJWkVdOworCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIEF1dGhGdW5jW0FVVEhfRlVOQ19TSVpFXTsKKwlTVEFURV9NQUNISU5FX0ZVTkMgICAgICBBdXRoUnNwRnVuY1tBVVRIX1JTUF9GVU5DX1NJWkVdOworCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIFN5bmNGdW5jW1NZTkNfRlVOQ19TSVpFXTsKKwlTVEFURV9NQUNISU5FX0ZVTkMgICAgICBXcGFQc2tGdW5jW1dQQV9QU0tfRlVOQ19TSVpFXTsKKwlTVEFURV9NQUNISU5FX0ZVTkMgICAgICBBaXJvbmV0RnVuY1tBSVJPTkVUX0ZVTkNfU0laRV07CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisJU1RBVEVfTUFDSElORV9GVU5DICAgICAgQWN0RnVuY1tBQ1RfRlVOQ19TSVpFXTsKKwkvLyBBY3Rpb24KKwlTVEFURV9NQUNISU5FICAgICAgICAgICBBY3RNYWNoaW5lOworCisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwlTVEFURV9NQUNISU5FCQkJRGxzTWFjaGluZTsKKwlTVEFURV9NQUNISU5FX0ZVTkMgICAgICBEbHNGdW5jW0RMU19GVU5DX1NJWkVdOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisKKworCisJVUxPTkcgICAgICAgICAgICAgICAgICAgQ2hhbm5lbFF1YWxpdHk7ICAvLyAwLi4xMDAsIENoYW5uZWwgUXVhbGl0eSBJbmRpY2F0aW9uIGZvciBSb2FtaW5nCisJVUxPTkcgICAgICAgICAgICAgICAgICAgTm93MzI7ICAgICAgICAgICAvLyBsYXRjaCB0aGUgdmFsdWUgb2YgTmRpc0dldFN5c3RlbVVwVGltZSgpCisJVUxPTkcgICAgICAgICAgICAgICAgICAgTGFzdFNlbmROVUxMcHNtVGltZTsKKworCUJPT0xFQU4gICAgICAgICAgICAgICAgIGJSdW5uaW5nOworCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIFRhc2tMb2NrOworCU1MTUVfUVVFVUUgICAgICAgICAgICAgIFF1ZXVlOworCisJVUlOVCAgICAgICAgICAgICAgICAgICAgU2hpZnRSZWc7CisKKwlSQUxJTktfVElNRVJfU1RSVUNUICAgICBQZXJpb2RpY1RpbWVyOworCVJBTElOS19USU1FUl9TVFJVQ1QgICAgIEFQU0RQZXJpb2RpY1RpbWVyOworCVJBTElOS19USU1FUl9TVFJVQ1QgICAgIExpbmtEb3duVGltZXI7CisJUkFMSU5LX1RJTUVSX1NUUlVDVCAgICAgTGlua1VwVGltZXI7CisJVUxPTkcgICAgICAgICAgICAgICAgICAgUGVyaW9kaWNSb3VuZDsKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBPbmVTZWNQZXJpb2RpY1JvdW5kOworCisJVUNIQVIJCQkJCVJlYWxSeFBhdGg7CisJQk9PTEVBTgkJCQkJYkxvd1Rocm91Z2hwdXQ7CisJQk9PTEVBTgkJCQkJYkVuYWJsZUF1dG9BbnRlbm5hQ2hlY2s7CisJUkFMSU5LX1RJTUVSX1NUUlVDVAkJUnhBbnRFdmFsVGltZXI7CisKKyNpZmRlZiBSVDI4NzAKKwlVQ0hBUiBDYWxpQlc0MFJmUjI0OworCVVDSEFSIENhbGlCVzIwUmZSMjQ7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKK30gTUxNRV9TVFJVQ1QsICpQTUxNRV9TVFJVQ1Q7CisKKy8vIHN0cnVjdHVyZSBmb3IgcmFkYXIgZGV0ZWN0aW9uIGFuZCBjaGFubmVsIHN3aXRjaAordHlwZWRlZiBzdHJ1Y3QgX1JBREFSX0RFVEVDVF9TVFJVQ1QgeworICAgIC8vQk9PTEVBTgkJSUVFRTgwMjExSDsJCQkvLyAwOiBkaXNhYmxlLCAxOiBlbmFibGUgSUVFRTgwMi4xMWgKKwlVQ0hBUgkJQ1NDb3VudDsJCQkvL0NoYW5uZWwgc3dpdGNoIGNvdW50ZXIKKwlVQ0hBUgkJQ1NQZXJpb2Q7CQkJLy9DaGFubmVsIHN3aXRjaCBwZXJpb2QgKGJlYWNvbiBjb3VudCkKKwlVQ0hBUgkJUkRDb3VudDsJCQkvL1JhZGFyIGRldGVjdGlvbiBjb3VudGVyCisJVUNIQVIJCVJETW9kZTsJCQkJLy9SYWRhciBEZXRlY3Rpb24gbW9kZQorCVVDSEFSCQlSRER1clJlZ2lvbjsJCS8vUmFkYXIgZGV0ZWN0aW9uIGR1cmF0aW9uIHJlZ2lvbgorCVVDSEFSCQlCQlBSMTY7CisJVUNIQVIJCUJCUFIxNzsKKwlVQ0hBUgkJQkJQUjE4OworCVVDSEFSCQlCQlBSMjE7CisJVUNIQVIJCUJCUFIyMjsKKwlVQ0hBUgkJQkJQUjY0OworCVVMT05HCQlJblNlcnZpY2VNb25pdG9yQ291bnQ7IC8vIHVuaXQ6IHNlYworCVVJTlQ4CQlEZnNTZXNzaW9uVGltZTsKKwlCT09MRUFOCQliRmFzdERmczsKKwlVSU5UOAkJQ2hNb3ZpbmdUaW1lOworCVVJTlQ4CQlMb25nUHVsc2VSYWRhclRoOworfSBSQURBUl9ERVRFQ1RfU1RSVUNULCAqUFJBREFSX0RFVEVDVF9TVFJVQ1Q7CisKKyNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCit0eXBlZGVmIGVudW0gQ0RfU1RBVEVfbgoreworCUNEX05PUk1BTCwKKwlDRF9TSUxFTkNFLAorCUNEX01BWF9TVEFURQorfSBDRF9TVEFURTsKKwordHlwZWRlZiBzdHJ1Y3QgQ0FSUklFUl9ERVRFQ1RJT05fcworeworCUJPT0xFQU4JCQkJCUVuYWJsZTsKKwlVSU5UOAkJCQkJQ0RTZXNzaW9uVGltZTsKKwlVSU5UOAkJCQkJQ0RQZXJpb2Q7CisJQ0RfU1RBVEUJCQkJQ0RfU3RhdGU7Cit9IENBUlJJRVJfREVURUNUSU9OLCAqUENBUlJJRVJfREVURUNUSU9OOworI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKwordHlwZWRlZiBlbnVtIF9SRUNfQkxPQ0tBQ0tfU1RBVFVTCit7CisgICAgUmVjaXBpZW50X05PTkU9MCwKKwlSZWNpcGllbnRfVVNFRCwKKwlSZWNpcGllbnRfSGFuZGxlUmVzLAorICAgIFJlY2lwaWVudF9BY2NlcHQKK30gUkVDX0JMT0NLQUNLX1NUQVRVUywgKlBSRUNfQkxPQ0tBQ0tfU1RBVFVTOworCit0eXBlZGVmIGVudW0gX09SSV9CTE9DS0FDS19TVEFUVVMKK3sKKyAgICBPcmlnaW5hdG9yX05PTkU9MCwKKwlPcmlnaW5hdG9yX1VTRUQsCisgICAgT3JpZ2luYXRvcl9XYWl0UmVzLAorICAgIE9yaWdpbmF0b3JfRG9uZQorfSBPUklfQkxPQ0tBQ0tfU1RBVFVTLCAqUE9SSV9CTE9DS0FDS19TVEFUVVM7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK3R5cGVkZWYgc3RydWN0IF9CQV9PUklfRU5UUll7CisJVUNIQVIgICBXY2lkOworCVVDSEFSICAgVElEOworCVVDSEFSICAgQkFXaW5TaXplOworCVVDSEFSICAgVG9rZW47CisvLyBTZXF1ZW5jZSBpcyB0byBmaWxsIGV2ZXJ5IG91dGdvaW5nIFFvUyBEQVRBIGZyYW1lJ3Mgc2VxdWVuY2UgZmllbGQgaW4gODAyLjExIGhlYWRlci4KKwlVU0hPUlQJU2VxdWVuY2U7CisJVVNIT1JUCVRpbWVPdXRWYWx1ZTsKKwlPUklfQkxPQ0tBQ0tfU1RBVFVTICBPUklfQkFfU3RhdHVzOworCVJBTElOS19USU1FUl9TVFJVQ1QgT1JJQkFUaW1lcjsKKwlQVk9JRAlwQWRhcHRlcjsKK30gQkFfT1JJX0VOVFJZLCAqUEJBX09SSV9FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgX0JBX1JFQ19FTlRSWSB7CisJVUNIQVIgICBXY2lkOworCVVDSEFSICAgVElEOworCVVDSEFSICAgQkFXaW5TaXplOwkvLyA3LjMuMS4xNC4gZWFjaCBidWZmZXIgaXMgY2FwYWJsZSBvZiBob2xkaW5nIGEgbWF4IEFNU0RVIG9yIE1TRFUuCisJLy9VQ0hBUglOdW1PZlJ4UGt0OworCS8vVUNIQVIgICAgQ3VyaW5kaWR4OyAvLyB0aGUgaGVhZCBpbiB0aGUgUlggcmVvcmRlcmluZyBidWZmZXIKKwlVU0hPUlQJCUxhc3RJbmRTZXE7CisvLwlVU0hPUlQJCUxhc3RJbmRTZXFBdFRpbWVyOworCVVTSE9SVAkJVGltZU91dFZhbHVlOworCVJBTElOS19USU1FUl9TVFJVQ1QgUkVDQkFUaW1lcjsKKwlVTE9ORwkJTGFzdEluZFNlcUF0VGltZXI7CisJVUxPTkcJCW5Ecm9wUGFja2V0OworCVVMT05HCQlyY3ZTZXE7CisJUkVDX0JMT0NLQUNLX1NUQVRVUyAgUkVDX0JBX1N0YXR1czsKKy8vCVVDSEFSCVJ4QnVmSWR4VXNlZDsKKwkvLyBjb3JyZXNwb25kaW5nIHZpcnR1YWwgYWRkcmVzcyBmb3IgUlggcmVvcmRlcmluZyBwYWNrZXQgc3RvcmFnZS4KKwkvL1JUTVBfUkVPUkRFUkRNQUJVRiBNQVBfUlhCdWZbTUFYX1JYX1JFT1JERVJCVUZdOworCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIFJ4UmVSaW5nTG9jazsgICAgICAgICAgICAgICAgIC8vIFJ4IFJpbmcgc3BpbmxvY2sKKy8vCXN0cnVjdCBfQkFfUkVDX0VOVFJZICpwTmV4dDsKKwlQVk9JRAlwQWRhcHRlcjsKKwlzdHJ1Y3QgcmVvcmRlcmluZ19saXN0CWxpc3Q7Cit9IEJBX1JFQ19FTlRSWSwgKlBCQV9SRUNfRU5UUlk7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworCVVMT05HCQludW1Bc1JlY2lwaWVudDsJCS8vIEkgYW0gcmVjaXBpZW50IG9mIG51bUFzUmVjaXBpZW50IGNsaWVudHMuIFRoZXNlIGNsaWVudCBhcmUgaW4gdGhlIEJBUmVjRW50cnlbXQorCVVMT05HCQludW1Bc09yaWdpbmF0b3I7CS8vIEkgYW0gb3JpZ2luYXRvciBvZiAJbnVtQXNPcmlnaW5hdG9yIGNsaWVudHMuIFRoZXNlIGNsaWVudHMgYXJlIGluIHRoZSBCQU9yaUVudHJ5W10KKwlCQV9PUklfRU5UUlkgICAgICAgQkFPcmlFbnRyeVtNQVhfTEVOX09GX0JBX09SSV9UQUJMRV07CisJQkFfUkVDX0VOVFJZICAgICAgIEJBUmVjRW50cnlbTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEVdOworfSBCQV9UQUJMRSwgKlBCQV9UQUJMRTsKKworLy9Gb3IgUXVyZXlCQVRhYmxlT0lEIHVzZTsKK3R5cGVkZWYgc3RydWN0ICBQQUNLRUQgX09JRF9CQV9SRUNfRU5UUll7CisJVUNIQVIgICBNQUNBZGRyW01BQ19BRERSX0xFTl07CisJVUNIQVIgICBCYUJpdG1hcDsgICAvLyBpZiAoQmFCaXRtYXAmKDE8PFRJRCkpLCB0aGlzIHNlc3Npb24gd2l0aHtNQUNBZGRyLCBUSUR9ZXhpc3RzLCBzbyByZWFkIEJ1ZlNpemVbVElEXSBmb3IgQnVmZmVyU2l6ZQorCVVDSEFSICAgcnN2OworCVVDSEFSICAgQnVmU2l6ZVs4XTsKKwlSRUNfQkxPQ0tBQ0tfU1RBVFVTCVJFQ19CQV9TdGF0dXNbOF07Cit9IE9JRF9CQV9SRUNfRU5UUlksICpQT0lEX0JBX1JFQ19FTlRSWTsKKworLy9Gb3IgUXVyZXlCQVRhYmxlT0lEIHVzZTsKK3R5cGVkZWYgc3RydWN0ICBQQUNLRUQgX09JRF9CQV9PUklfRU5UUll7CisJVUNIQVIgICBNQUNBZGRyW01BQ19BRERSX0xFTl07CisJVUNIQVIgICBCYUJpdG1hcDsgIC8vIGlmIChCYUJpdG1hcCYoMTw8VElEKSksIHRoaXMgc2Vzc2lvbiB3aXRoe01BQ0FkZHIsIFRJRH1leGlzdHMsIHNvIHJlYWQgQnVmU2l6ZVtUSURdIGZvciBCdWZmZXJTaXplLCByZWFkIE9SSV9CQV9TdGF0dXNbVElEXSBmb3Igc3RhdHVzCisJVUNIQVIgICByc3Y7CisJVUNIQVIgICBCdWZTaXplWzhdOworCU9SSV9CTE9DS0FDS19TVEFUVVMgIE9SSV9CQV9TdGF0dXNbOF07Cit9IE9JRF9CQV9PUklfRU5UUlksICpQT0lEX0JBX09SSV9FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgX1FVRVJZQkFfVEFCTEV7CisJT0lEX0JBX09SSV9FTlRSWSAgICAgICBCQU9yaUVudHJ5WzMyXTsKKwlPSURfQkFfUkVDX0VOVFJZICAgICAgIEJBUmVjRW50cnlbMzJdOworCVVDSEFSICAgT3JpTnVtOy8vIE51bWJlciBvZiBiZWxvdyBCQU9yaUVudHJ5CisJVUNIQVIgICBSZWNOdW07Ly8gTnVtYmVyIG9mIGJlbG93IEJBUmVjRW50cnkKK30gUVVFUllCQV9UQUJMRSwgKlBRVUVSWUJBX1RBQkxFOworCit0eXBlZGVmCXVuaW9uCV9CQUNBUF9TVFJVQwl7CisjaWZkZWYgUlRfQklHX0VORElBTgorCXN0cnVjdAl7CisJCVVJTlQzMiAgICAgOjQ7CisJCVVJTlQzMiAgICAgYjIwNDBDb2V4aXN0U2NhblN1cDoxOwkJLy9BcyBTdGEsIHN1cHBvcnQgZG8gMjA0MCBjb2V4aXN0ZW5jZSBzY2FuIGZvciBBUC4gQXMgQXAsIHN1cHBvcnQgbW9uaXRvciB0cmlnZ2VyIGV2ZW50IHRvIGNoZWNrIGlmIGNhbiB1c2UgQlcgNDBNSHouCisJCVVJTlQzMiAgICAgYkh0QWRob2M6MTsJCQkvLyBhZGhvYyBjYW4gdXNlIGh0IHJhdGUuCisJCVVJTlQzMiAgICAgTU1QU21vZGU6MjsJLy8gTUlNTyBwb3dlciBzYXZlIG1vcmUsIDA6c3RhdGljLCAxOmR5bmFtaWMsIDI6cnN2LCAzOm1pbW8gZW5hYmxlCisJCVVJTlQzMiAgICAgQW1zZHVTaXplOjE7CS8vIDA6MzgzOSwgMTo3OTM1IGJ5dGVzLiBVSU5UICBNU0RVU2l6ZVRvQnl0ZXNbXQk9IHsgMzgzOSwgNzkzNX07CisJCVVJTlQzMiAgICAgQW1zZHVFbmFibGU6MTsJLy9FbmFibGUgQU1TRFUgdHJhbnNtaXNzdGlvbgorCQlVSU5UMzIJCU1wZHVEZW5zaXR5OjM7CisJCVVJTlQzMgkJUG9saWN5OjI7CS8vIDA6IERFTEFZX0JBIDE6SU1NRURfQkEgICgvL0JBIFBvbGljeSBzdWJmaWxlZCB2YWx1ZSBpbiBBRERCQSBmcmFtZSkgICAyOkJBLW5vdCB1c2UKKwkJVUlOVDMyCQlBdXRvQkE6MTsJLy8gYXV0b21hdGljYWxseSBCQQorCQlVSU5UMzIJCVR4QkFXaW5MaW1pdDo4OworCQlVSU5UMzIJCVJ4QkFXaW5MaW1pdDo4OworCX0JZmllbGQ7CisjZWxzZQorCXN0cnVjdAl7CisJCVVJTlQzMgkJUnhCQVdpbkxpbWl0Ojg7CisJCVVJTlQzMgkJVHhCQVdpbkxpbWl0Ojg7CisJCVVJTlQzMgkJQXV0b0JBOjE7CS8vIGF1dG9tYXRpY2FsbHkgQkEKKwkJVUlOVDMyCQlQb2xpY3k6MjsJLy8gMDogREVMQVlfQkEgMTpJTU1FRF9CQSAgKC8vQkEgUG9saWN5IHN1YmZpbGVkIHZhbHVlIGluIEFEREJBIGZyYW1lKSAgIDI6QkEtbm90IHVzZQorCQlVSU5UMzIJCU1wZHVEZW5zaXR5OjM7CisJCVVJTlQzMiAgICAgICAJQW1zZHVFbmFibGU6MTsJLy9FbmFibGUgQU1TRFUgdHJhbnNtaXNzdGlvbgorCQlVSU5UMzIgICAgICAgCUFtc2R1U2l6ZToxOwkvLyAwOjM4MzksIDE6NzkzNSBieXRlcy4gVUlOVCAgTVNEVVNpemVUb0J5dGVzW10JPSB7IDM4MzksIDc5MzV9OworCQlVSU5UMzIgICAgICAgCU1NUFNtb2RlOjI7CS8vIE1JTU8gcG93ZXIgc2F2ZSBtb3JlLCAwOnN0YXRpYywgMTpkeW5hbWljLCAyOnJzdiwgMzptaW1vIGVuYWJsZQorCQlVSU5UMzIgICAgICAgCWJIdEFkaG9jOjE7CQkJLy8gYWRob2MgY2FuIHVzZSBodCByYXRlLgorCQlVSU5UMzIgICAgICAgCWIyMDQwQ29leGlzdFNjYW5TdXA6MTsJCS8vQXMgU3RhLCBzdXBwb3J0IGRvIDIwNDAgY29leGlzdGVuY2Ugc2NhbiBmb3IgQVAuIEFzIEFwLCBzdXBwb3J0IG1vbml0b3IgdHJpZ2dlciBldmVudCB0byBjaGVjayBpZiBjYW4gdXNlIEJXIDQwTUh6LgorCQlVSU5UMzIgICAgICAgCTo0OworCX0JZmllbGQ7CisjZW5kaWYKKwlVSU5UMzIJCQl3b3JkOworfSBCQUNBUF9TVFJVQywgKlBCQUNBUF9TVFJVQzsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworLy9UaGlzIHN0cnVjdHVyZSBpcyBmb3IgYWxsIDgwMi4xMW4gY2FyZCBJbnRlck9wdGliaWxpdHlUZXN0IGFjdGlvbi4gUmVzZXQgYWxsIE51bSBldmVyeSBuIHNlY29uZC4gIChEZXRhaWxzIHNlZSBNTE1FUGVyaW9kaWMpCit0eXBlZGVmCXN0cnVjdAlfSU9UX1NUUlVDCXsKKwlVQ0hBUgkJCVRocmVzaG9sZFsyXTsKKwlVQ0hBUgkJCVJlb3JkZXJUaW1lT3V0TnVtW01BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFXTsJLy8gY29tcGFyZSB3aXRoIHRocmVzaG9sZFswXQorCVVDSEFSCQkJUmVmcmVzaE51bVtNQVhfTEVOX09GX0JBX1JFQ19UQUJMRV07CS8vIGNvbXBhcmUgd2l0aCB0aHJlc2hvbGRbMV0KKwlVTE9ORwkJCU9uZVNlY0luV2luZG93Q291bnQ7CisJVUxPTkcJCQlPbmVTZWNGcmFtZUR1cGxpY2F0ZUNvdW50OworCVVMT05HCQkJT25lU2VjT3V0V2luZG93Q291bnQ7CisJVUNIQVIJCQlEZWxPcmlBY3Q7CisJVUNIQVIJCQlEZWxSZWNBY3Q7CisJVUNIQVIJCQlSVFNTaG9ydFByb3Q7CisJVUNIQVIJCQlSVFNMb25nUHJvdDsKKwlCT09MRUFOCQkJYlJUU0xvbmdQcm90T247CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJQk9PTEVBTgkJCWJMYXN0QXRoZXJvczsKKyAgICBCT09MRUFOCQkJYkN1cnJlbnRBdGhlcm9zOworICAgIEJPT0xFQU4gICAgICAgICBiTm93QXRoZXJvc0J1cnN0T247CisJQk9PTEVBTgkJCWJOZXh0RGlzYWJsZVJ4QkE7CisgICAgQk9PTEVBTgkJCWJUb2dnbGU7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCit9IElPVF9TVFJVQywgKlBJT1RfU1RSVUM7CisKKy8vIFRoaXMgaXMgdGhlIHJlZ2lzdHJ5IHNldHRpbmcgZm9yIDgwMi4xMW4gdHJhbnNtaXQgc2V0dGluZy4gIFVzZWQgaW4gYWR2YW5jZWQgcGFnZS4KK3R5cGVkZWYgdW5pb24gX1JFR19UUkFOU01JVF9TRVRUSU5HIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisgc3RydWN0IHsKKyAgICAgICAgIFVJTlQzMiAgcnN2OjEzOworCQkgVUlOVDMyICBFWFRDSEE6MjsKKwkJIFVJTlQzMiAgSFRNT0RFOjE7CisJCSBVSU5UMzIgIFRSQU5TTk86MjsKKwkJIFVJTlQzMiAgU1RCQzoxOyAvL1NQQUNFCisJCSBVSU5UMzIgIFNob3J0R0k6MTsKKwkJIFVJTlQzMiAgQlc6MTsgLy9jaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHoKKwkJIFVJTlQzMiAgVHhCRjoxOyAvLyAzKjMKKwkJIFVJTlQzMiAgcnN2MDoxMDsKKwkJIC8vVUlOVDMyICBNQ1M6NzsgICAgICAgICAgICAgICAgIC8vIE1DUworICAgICAgICAgLy9VSU5UMzIgIFBoeU1vZGU6NDsKKyAgICB9IGZpZWxkOworI2Vsc2UKKyBzdHJ1Y3QgeworICAgICAgICAgLy9VSU5UMzIgIFBoeU1vZGU6NDsKKyAgICAgICAgIC8vVUlOVDMyICBNQ1M6NzsgICAgICAgICAgICAgICAgIC8vIE1DUworCQkgVUlOVDMyICByc3YwOjEwOworCQkgVUlOVDMyICBUeEJGOjE7CisgICAgICAgICBVSU5UMzIgIEJXOjE7IC8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6CisgICAgICAgICBVSU5UMzIgIFNob3J0R0k6MTsKKyAgICAgICAgIFVJTlQzMiAgU1RCQzoxOyAvL1NQQUNFCisgICAgICAgICBVSU5UMzIgIFRSQU5TTk86MjsKKyAgICAgICAgIFVJTlQzMiAgSFRNT0RFOjE7CisgICAgICAgICBVSU5UMzIgIEVYVENIQToyOworICAgICAgICAgVUlOVDMyICByc3Y6MTM7CisgICAgfSBmaWVsZDsKKyNlbmRpZgorIFVJTlQzMiAgIHdvcmQ7Cit9IFJFR19UUkFOU01JVF9TRVRUSU5HLCAqUFJFR19UUkFOU01JVF9TRVRUSU5HOworCit0eXBlZGVmIHVuaW9uICBfREVTSVJFRF9UUkFOU01JVF9TRVRUSU5HIHsKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJc3RydWN0CXsKKwkJCVVTSE9SVAkJcnN2OjM7CisJCQlVU0hPUlQJCUZpeGVkVHhNb2RlOjI7CQkJLy8gSWYgTUNTIGlzbid0IEFVVE8sIGZpeCByYXRlIGluIENDSywgT0ZETSBvciBIVCBtb2RlLgorCQkJVVNIT1JUCQlQaHlNb2RlOjQ7CisJCQlVU0hPUlQgICAJTUNTOjc7ICAgICAgICAgICAgICAgICAvLyBNQ1MKKwl9CWZpZWxkOworI2Vsc2UKKwlzdHJ1Y3QJeworCQkJVVNIT1JUICAgCU1DUzo3OyAgICAgICAgICAgICAgICAgCS8vIE1DUworCQkJVVNIT1JUCQlQaHlNb2RlOjQ7CisJCQlVU0hPUlQJIAlGaXhlZFR4TW9kZToyOwkJCS8vIElmIE1DUyBpc24ndCBBVVRPLCBmaXggcmF0ZSBpbiBDQ0ssIE9GRE0gb3IgSFQgbW9kZS4KKwkJCVVTSE9SVAkJcnN2OjM7CisJfQlmaWVsZDsKKyNlbmRpZgorCVVTSE9SVAkJd29yZDsKKyB9IERFU0lSRURfVFJBTlNNSVRfU0VUVElORywgKlBERVNJUkVEX1RSQU5TTUlUX1NFVFRJTkc7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlCT09MRUFOCQlJc1JlY2lwaWVudDsKKwlVQ0hBUiAgIE1BQ0FkZHJbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUiAgIFRJRDsKKwlVQ0hBUiAgIG5NU0RVOworCVVTSE9SVCAgIFRpbWVPdXQ7CisJQk9PTEVBTiBiQWxsVGlkOyAgLy8gSWYgVHJ1ZSwgZGVsZXRlIGFsbCBUSUQgZm9yIEJBIHNlc3Npb25zIHdpdGggdGhpcyBNQUNhZGRyLgorfSBPSURfQUREX0JBX0VOVFJZLCAqUE9JRF9BRERfQkFfRU5UUlk7CisKKy8vCisvLyBNdWx0aXBsZSBTU0lEIHN0cnVjdHVyZQorLy8KKyNkZWZpbmUgV0xBTl9NQVhfTlVNX09GX1RJTQkJCSgoTUFYX0xFTl9PRl9NQUNfVEFCTEUgPj4gMykgKyAxKSAvKiAvOCArIDEgKi8KKyNkZWZpbmUgV0xBTl9DVF9USU1fQkNNQ19PRkZTRVQJCTAgLyogdW5pdDogMzJCICovCisKKy8qIGNsZWFyIGJjbWMgVElNIGJpdCAqLworI2RlZmluZSBXTEFOX01SX1RJTV9CQ01DX0NMRUFSKGFwaWR4KSBcCisJcEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLlRpbUJpdG1hcHNbV0xBTl9DVF9USU1fQkNNQ19PRkZTRVRdICY9IH5CSVQ4WzBdOworCisvKiBzZXQgYmNtYyBUSU0gYml0ICovCisjZGVmaW5lIFdMQU5fTVJfVElNX0JDTUNfU0VUKGFwaWR4KSBcCisJcEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLlRpbUJpdG1hcHNbV0xBTl9DVF9USU1fQkNNQ19PRkZTRVRdIHw9IEJJVDhbMF07CisKKy8qIGNsZWFyIGEgc3RhdGlvbiBQUyBUSU0gYml0ICovCisjZGVmaW5lIFdMQU5fTVJfVElNX0JJVF9DTEVBUihhZF9wLCBhcGlkeCwgd2NpZCkgXAorCXsJVUNIQVIgdGltX29mZnNldCA9IHdjaWQgPj4gMzsgXAorCQlVQ0hBUiBiaXRfb2Zmc2V0ID0gd2NpZCAmIDB4NzsgXAorCQlhZF9wLT5BcENmZy5NQlNTSURbYXBpZHhdLlRpbUJpdG1hcHNbdGltX29mZnNldF0gJj0gKH5CSVQ4W2JpdF9vZmZzZXRdKTsgfQorCisvKiBzZXQgYSBzdGF0aW9uIFBTIFRJTSBiaXQgKi8KKyNkZWZpbmUgV0xBTl9NUl9USU1fQklUX1NFVChhZF9wLCBhcGlkeCwgd2NpZCkgXAorCXsJVUNIQVIgdGltX29mZnNldCA9IHdjaWQgPj4gMzsgXAorCQlVQ0hBUiBiaXRfb2Zmc2V0ID0gd2NpZCAmIDB4NzsgXAorCQlhZF9wLT5BcENmZy5NQlNTSURbYXBpZHhdLlRpbUJpdG1hcHNbdGltX29mZnNldF0gfD0gQklUOFtiaXRfb2Zmc2V0XTsgfQorCisjaWZkZWYgUlQyODcwCisjZGVmaW5lIEJFQUNPTl9CSVRNQVBfTUFTSwkJMHhmZgordHlwZWRlZiBzdHJ1Y3QgX0JFQUNPTl9TWU5DX1NUUlVDVF8KK3sKKwlVQ0hBUiAgICAgICAgCQkJQmVhY29uQnVmW0hXX0JFQUNPTl9NQVhfQ09VTlRdW0hXX0JFQUNPTl9PRkZTRVRdOworCVVDSEFSCQkJCQlCZWFjb25UeFdJW0hXX0JFQUNPTl9NQVhfQ09VTlRdW1RYV0lfU0laRV07CisJVUxPTkcgCQkJCQlUaW1JRUxvY2F0aW9uSW5CZWFjb25bSFdfQkVBQ09OX01BWF9DT1VOVF07CisJVUxPTkcJCQkJCUNhcGFiaWxpdHlJbmZvTG9jYXRpb25JbkJlYWNvbltIV19CRUFDT05fTUFYX0NPVU5UXTsKKwlCT09MRUFOCQkJCQlFbmFibGVCZWFjb247CQkvLyB0cmlnZ2VyIHRvIGVuYWJsZSBiZWFjb24gdHJhbnNtaXNzaW9uLgorCVVDSEFSCQkJCQlCZWFjb25CaXRNYXA7CQkvLyBOT1RFOiBJZiB0aGUgTUFYX01CU1NJRF9OVU0gaXMgbGFyZ2VyIHRoYW4gOCwgdGhpcyBwYXJhbWV0ZXIgbmVlZCB0byBjaGFuZ2UuCisJVUNIQVIJCQkJCUR0aW1CaXRPbjsJCQkvLyBOT1RFOiBJZiB0aGUgTUFYX01CU1NJRF9OVU0gaXMgbGFyZ2VyIHRoYW4gOCwgdGhpcyBwYXJhbWV0ZXIgbmVlZCB0byBjaGFuZ2UuCit9QkVBQ09OX1NZTkNfU1RSVUNUOworI2VuZGlmIC8vIFJUMjg3MCAvLworCit0eXBlZGVmIHN0cnVjdCBfTVVMVElTU0lEX1NUUlVDVCB7CisJVUNIQVIJCQkJCQkJCUJzc2lkW01BQ19BRERSX0xFTl07CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3NpZExlbjsKKyAgICBDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07CisgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwYWJpbGl0eUluZm87CisKKyAgICBQTkVUX0RFViAgICAgICAgICAgICAgICAgICAJCQlNU1NJRERldjsKKworCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgICAgIEF1dGhNb2RlOworCU5ESVNfODAyXzExX1dFUF9TVEFUVVMgICAgICAgICAgICAgIFdlcFN0YXR1czsKKwlORElTXzgwMl8xMV9XRVBfU1RBVFVTCQkJCUdyb3VwS2V5V2VwU3RhdHVzOworCVdQQV9NSVhfUEFJUl9DSVBIRVIJCQkJCVdwYU1peFBhaXJDaXBoZXI7CisKKwlVTE9ORwkJCQkJCQkJVHhDb3VudDsKKwlVTE9ORwkJCQkJCQkJUnhDb3VudDsKKwlVTE9ORwkJCQkJCQkJUmVjZWl2ZWRCeXRlQ291bnQ7CisJVUxPTkcJCQkJCQkJCVRyYW5zbWl0dGVkQnl0ZUNvdW50OworCVVMT05HCQkJCQkJCQlSeEVycm9yQ291bnQ7CisJVUxPTkcJCQkJCQkJCVJ4RHJvcENvdW50OworCisJSFRUUkFOU01JVF9TRVRUSU5HCQkJCQlIVFBoeU1vZGUsIE1heEhUUGh5TW9kZSwgTWluSFRQaHlNb2RlOy8vIEZvciB0cmFuc21pdCBwaHkgc2V0dGluZyBpbiBUWFdJLgorCVJUX0hUX1BIWV9JTkZPCQkJCQkJRGVzaXJlZEh0UGh5SW5mbzsKKwlERVNJUkVEX1RSQU5TTUlUX1NFVFRJTkcgICAgICAgIAlEZXNpcmVkVHJhbnNtaXRTZXR0aW5nOyAvLyBEZXNpcmVkIHRyYW5zbWl0IHNldHRpbmcuIHRoaXMgaXMgZm9yIHJlYWRpbmcgcmVnaXN0cnkgc2V0dGluZyBvbmx5LiBub3QgdXNlZnVsLgorCUJPT0xFQU4JCQkJCQkJCWJBdXRvVHhSYXRlU3dpdGNoOworCisJLy9DSVBIRVJfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICBTaGFyZWRLZXlbU0hBUkVfS0VZX05VTV07IC8vIHJlZiBwQWQtPlNoYXJlZEtleVtCU1NdWzRdCisJVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdEtleUlkOworCisJVUNIQVIJCQkJCQkJCVR4UmF0ZTsgICAgICAgLy8gUkFURV8xLCBSQVRFXzIsIFJBVEVfNV81LCBSQVRFXzExLCAuLi4KKwlVQ0hBUiAgICAgCQkJCQkJCURlc2lyZWRSYXRlc1tNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107Ly8gT0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTCisJVUNIQVIJCQkJCQkJCURlc2lyZWRSYXRlc0luZGV4OworCVVDSEFSICAgICAJCQkJCQkJTWF4VHhSYXRlOyAgICAgICAgICAgIC8vIFJBVEVfMSwgUkFURV8yLCBSQVRFXzVfNSwgUkFURV8xMQorCisvLwlVTE9ORyAgICAgICAgICAgCQkJCQlUaW1CaXRtYXA7ICAgICAgLy8gYml0MCBmb3IgYnJvYWRjYXN0LCAxIGZvciBBSUQxLCAyIGZvciBBSUQyLCAuLi5zbyBvbgorLy8gICAgVUxPTkcgICAgICAgICAgIAkJCQkJVGltQml0bWFwMjsgICAgIC8vIGIwIGZvciBBSUQzMiwgYjEgZm9yIEFJRDMzLCAuLi4gYW5kIHNvIG9uCisJVUNIQVIJCQkJCQkJCVRpbUJpdG1hcHNbV0xBTl9NQVhfTlVNX09GX1RJTV07CisKKyAgICAvLyBXUEEKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTUtbMzJdOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNS1szMl07CisJVUNIQVIJCQkJCQkJCUdUS1szMl07CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTgwMjFYOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZUF1dGg7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR05vbmNlWzMyXTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0U2VjdXJlZDsKKyAgICBORElTXzgwMl8xMV9QUklWQUNZX0ZJTFRFUiAgICAgICAgICBQcml2YWN5RmlsdGVyOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBTkNsYXNzM0RhdGE7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNvbGF0ZUludGVyU3RhVHJhZmZpYzsKKworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJTTklFX0xlblsyXTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSU05fSUVbMl1bTUFYX0xFTl9PRl9SU05JRV07CisKKworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgIAkJCVRpbUlFTG9jYXRpb25JbkJlYWNvbjsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAJCQlDYXBhYmlsaXR5SW5mb0xvY2F0aW9uSW5CZWFjb247CisgICAgLy8gb3V0Z29pbmcgQkVBQ09OIGZyYW1lIGJ1ZmZlciBhbmQgY29ycmVzcG9uZGluZyBUWFdJCisJLy8gUFRYV0lfU1RSVUMgICAgICAgICAgICAgICAgICAgICAgICAgICBCZWFjb25UeFdJOyAvLworICAgIENIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJlYWNvbkJ1ZltNQVhfQkVBQ09OX1NJWkVdOyAvLyBOT1RFOiBCZWFjb25CdWYgc2hvdWxkIGJlIDQtYnl0ZSBhbGlnbmVkCisKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSGlkZVNzaWQ7CisJVUlOVDE2CQkJCQkJCQlTdGF0aW9uS2VlcEFsaXZlVGltZTsgLy8gdW5pdDogc2Vjb25kCisKKyAgICBVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWTEFOX1ZJRDsKKyAgICBVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWTEFOX1ByaW9yaXR5OworCisgICAgUlRfODAyXzExX0FDTAkJCQkJCUFjY2Vzc0NvbnRyb2xMaXN0OworCisJLy8gRURDQSBRb3MKKyAgICBCT09MRUFOCQkJCQkJCQliV21tQ2FwYWJsZTsJLy8gMDpkaXNhYmxlIFdNTSwgMTplbmFibGUgV01NCisgICAgQk9PTEVBTgkJCQkJCQkJYkRMU0NhcGFibGU7CS8vIDA6ZGlzYWJsZSBETFMsIDE6ZW5hYmxlIERMUworCisJVUNIQVIgICAgICAgICAgIAkJCQkJRGxzUFRLWzY0XTsJCS8vIER1ZSB0byB3aW5kb3dzIGRpcnZlciBjb3VudCBvbiBtZWV0aW5naG91c2UgdG8gaGFuZGxlIDQtd2F5IHNoYWtlCisKKwkvLyBGb3IgODAyLjF4IGRhZW1vbiBzZXR0aW5nIHBlciBCU1MKKwlVQ0hBUgkJCQkJCQkJcmFkaXVzX3Nydl9udW07CisJUkFESVVTX1NSVl9JTkZPCQkJCQkJcmFkaXVzX3Nydl9pbmZvW01BWF9SQURJVVNfU1JWX05VTV07CisKKyNpZmRlZiBSVEw4NjVYX1NPQworCXVuc2lnbmVkIGludAkJCQkJCW15bGlua2lkOworI2VuZGlmCisKKworCVVJTlQzMgkJCQkJUmN2ZENvbmZsaWN0U3NpZENvdW50OworCVVJTlQzMgkJCQkJUmN2ZFNwb29mZWRBc3NvY1Jlc3BDb3VudDsKKwlVSU5UMzIJCQkJCVJjdmRTcG9vZmVkUmVhc3NvY1Jlc3BDb3VudDsKKwlVSU5UMzIJCQkJCVJjdmRTcG9vZmVkUHJvYmVSZXNwQ291bnQ7CisJVUlOVDMyCQkJCQlSY3ZkU3Bvb2ZlZEJlYWNvbkNvdW50OworCVVJTlQzMgkJCQkJUmN2ZFNwb29mZWREaXNhc3NvY0NvdW50OworCVVJTlQzMgkJCQkJUmN2ZFNwb29mZWRBdXRoQ291bnQ7CisJVUlOVDMyCQkJCQlSY3ZkU3Bvb2ZlZERlYXV0aENvdW50OworCVVJTlQzMgkJCQkJUmN2ZFNwb29mZWRVbmtub3duTWdtdENvdW50OworCVVJTlQzMgkJCQkJUmN2ZFJlcGxheUF0dGFja0NvdW50OworCisJQ0hBUgkJCQkJUnNzaU9mUmN2ZENvbmZsaWN0U3NpZDsKKwlDSEFSCQkJCQlSc3NpT2ZSY3ZkU3Bvb2ZlZEFzc29jUmVzcDsKKwlDSEFSCQkJCQlSc3NpT2ZSY3ZkU3Bvb2ZlZFJlYXNzb2NSZXNwOworCUNIQVIJCQkJCVJzc2lPZlJjdmRTcG9vZmVkUHJvYmVSZXNwOworCUNIQVIJCQkJCVJzc2lPZlJjdmRTcG9vZmVkQmVhY29uOworCUNIQVIJCQkJCVJzc2lPZlJjdmRTcG9vZmVkRGlzYXNzb2M7CisJQ0hBUgkJCQkJUnNzaU9mUmN2ZFNwb29mZWRBdXRoOworCUNIQVIJCQkJCVJzc2lPZlJjdmRTcG9vZmVkRGVhdXRoOworCUNIQVIJCQkJCVJzc2lPZlJjdmRTcG9vZmVkVW5rbm93bk1nbXQ7CisJQ0hBUgkJCQkJUnNzaU9mUmN2ZFJlcGxheUF0dGFjazsKKworCUJPT0xFQU4JCQkJCWJCY25TbnRSZXE7CisJVUNIQVIJCQkJCUJjbkJ1ZklkeDsKK30gTVVMVElTU0lEX1NUUlVDVCwgKlBNVUxUSVNTSURfU1RSVUNUOworCisKKworI2lmZGVmIERPVDExTl9EUkFGVDMKK3R5cGVkZWYgZW51bSBfQlNTMjA0MENPRVhJU1RfRkxBR3sKKwlCU1NfMjA0MF9DT0VYSVNUX0RJU0FCTEUgPSAwLAorCUJTU18yMDQwX0NPRVhJU1RfVElNRVJfRklSRUQgID0gMSwKKwlCU1NfMjA0MF9DT0VYSVNUX0lORk9fU1lOQyA9IDIsCisJQlNTXzIwNDBfQ09FWElTVF9JTkZPX05PVElGWSA9IDQsCit9QlNTMjA0MENPRVhJU1RfRkxBRzsKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisKKy8vIGNvbmZpZ3VyYXRpb24gY29tbW9uIHRvIE9QTU9ERV9BUCBhcyB3ZWxsIGFzIE9QTU9ERV9TVEEKK3R5cGVkZWYgc3RydWN0IF9DT01NT05fQ09ORklHIHsKKworCUJPT0xFQU4JCWJDb3VudHJ5RmxhZzsKKwlVQ0hBUgkJQ291bnRyeUNvZGVbM107CisJVUNIQVIJCUdlb2dyYXBoeTsKKwlVQ0hBUiAgICAgICBDb3VudHJ5UmVnaW9uOyAgICAgIC8vIEVudW0gb2YgY291bnRyeSByZWdpb24sIDA6RkNDLCAxOklDLCAyOkVUU0ksIDM6U1BBSU4sIDQ6RnJhbmNlLCA1Ok1LSywgNjpNS0sxLCA3OklzcmFlbAorCVVDSEFSICAgICAgIENvdW50cnlSZWdpb25Gb3JBQmFuZDsJLy8gRW51bSBvZiBjb3VudHJ5IHJlZ2lvbiBmb3IgQSBiYW5kCisJVUNIQVIgICAgICAgUGh5TW9kZTsgICAgICAgICAgICAvLyBQSFlfMTFBLCBQSFlfMTFCLCBQSFlfMTFCR19NSVhFRCwgUEhZX0FCR19NSVhFRAorCVVTSE9SVCAgICAgIERzaWZzOyAgICAgICAgICAgICAgLy8gaW4gdW5pdHMgb2YgdXNlYworCVVMT05HICAgICAgIFBhY2tldEZpbHRlcjsgICAgICAgLy8gUGFja2V0IGZpbHRlciBmb3IgcmVjZWl2aW5nCisKKwlDSEFSICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07IC8vIE5PVCBOVUxMLXRlcm1pbmF0ZWQKKwlVQ0hBUiAgICAgICBTc2lkTGVuOyAgICAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgc3NpZCBsZW5ndGggaW4gdXNlZAorCVVDSEFSICAgICAgIExhc3RTc2lkTGVuOyAgICAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgc3NpZCBsZW5ndGggaW4gdXNlZAorCUNIQVIgICAgICAgIExhc3RTc2lkW01BWF9MRU5fT0ZfU1NJRF07IC8vIE5PVCBOVUxMLXRlcm1pbmF0ZWQKKwlVQ0hBUgkJTGFzdEJzc2lkW01BQ19BRERSX0xFTl07CisKKwlVQ0hBUiAgICAgICBCc3NpZFtNQUNfQUREUl9MRU5dOworCVVTSE9SVCAgICAgIEJlYWNvblBlcmlvZDsKKwlVQ0hBUiAgICAgICBDaGFubmVsOworCVVDSEFSICAgICAgIENlbnRyYWxDaGFubmVsOyAgICAJLy8gQ2VudHJhbCBDaGFubmVsIHdoZW4gdXNpbmcgNDBNSHogaXMgaW5kaWNhdGluZy4gbm90IHJlYWwgY2hhbm5lbC4KKworI2lmIDAJLy8gbW92ZSB0byBTVEFfQURNSU5fQ09ORklHCisJVUNIQVIgICAgICAgRGVmYXVsdEtleUlkOworCisJTkRJU184MDJfMTFfUFJJVkFDWV9GSUxURVIgICAgICAgICAgUHJpdmFjeUZpbHRlcjsgIC8vIFByaXZhY3lGaWx0ZXIgZW51bSBmb3IgODAyLjFYCisJTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSAgICAgQXV0aE1vZGU7ICAgICAgIC8vIFRoaXMgc2hvdWxkIG1hdGNoIHRvIHdoYXRldmVyIG1pY3Jvc29mdCBkZWZpbmVkCisJTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgV2VwU3RhdHVzOworCU5ESVNfODAyXzExX1dFUF9TVEFUVVMJCQkJT3JpZ1dlcFN0YXR1czsJLy8gT3JpZ2luYWwgd2VwIHN0YXR1cyBzZXQgZnJvbSBPSUQKKworCS8vIEFkZCB0byBzdXBwb3J0IGRpZmZlcmVudCBjaXBoZXIgc3VpdGUgZm9yIFdQQTIvV1BBIG1vZGUKKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwkJR3JvdXBDaXBoZXI7CQkvLyBNdWx0aWNhc3QgY2lwaGVyIHN1aXRlCisJTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJCVBhaXJDaXBoZXI7CQkJLy8gVW5pY2FzdCBjaXBoZXIgc3VpdGUKKwlCT09MRUFOCQkJCQkJCQliTWl4Q2lwaGVyOwkJCS8vIEluZGljYXRlIGN1cnJlbnQgUGFpciAmIEdyb3VwIHVzZSBkaWZmZXJlbnQgY2lwaGVyIHN1aXRlcworCVVTSE9SVAkJCQkJCQkJUnNuQ2FwYWJpbGl0eTsKKworCU5ESVNfODAyXzExX1dFUF9TVEFUVVMgICAgICAgICAgICAgIEdyb3VwS2V5V2VwU3RhdHVzOworI2VuZGlmCisKKwlVQ0hBUiAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwlVQ0hBUiAgICAgICBTdXBSYXRlTGVuOworCVVDSEFSICAgICAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSICAgICAgIEV4dFJhdGVMZW47CisJVUNIQVIgICAgICAgRGVzaXJlUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107ICAgICAgLy8gT0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTCisJVUNIQVIgICAgICAgTWF4RGVzaXJlZFJhdGU7CisJVUNIQVIgICAgICAgRXhwZWN0ZWRBQ0tSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKworCVVMT05HICAgICAgIEJhc2ljUmF0ZUJpdG1hcDsgICAgICAgIC8vIGJhY2t1cCBiYXNpYyByYXRlYml0bWFwCisKKwlCT09MRUFOCQliQVBTRENhcGFibGU7CisJQk9PTEVBTgkJYkluU2VydmljZVBlcmlvZDsKKwlCT09MRUFOCQliQVBTREFDX0JFOworCUJPT0xFQU4JCWJBUFNEQUNfQks7CisJQk9PTEVBTgkJYkFQU0RBQ19WSTsKKwlCT09MRUFOCQliQVBTREFDX1ZPOworCUJPT0xFQU4JCWJOZWVkU2VuZFRyaWdnZXJGcmFtZTsKKwlCT09MRUFOCQliQVBTREZvcmNlUG93ZXJTYXZlOwkvLyBGb3JjZSBwb3dlciBzYXZlIG1vZGUsIHNob3VsZCBvbmx5IHVzZSBpbiBBUFNELVNUQVVUCisJVUxPTkcJCVRyaWdnZXJUaW1lckNvdW50OworCVVDSEFSCQlNYXhTUExlbmd0aDsKKwlVQ0hBUgkJQkJQQ3VycmVudEJXOwkvLyBCV18xMCwgCUJXXzIwLCBCV180MAorCS8vIG1vdmUgdG8gTVVMVElTU0lEX1NUUlVDVCBmb3IgTUJTUworCS8vSFRUUkFOU01JVF9TRVRUSU5HCUhUUGh5TW9kZSwgTWF4SFRQaHlNb2RlLCBNaW5IVFBoeU1vZGU7Ly8gRm9yIHRyYW5zbWl0IHBoeSBzZXR0aW5nIGluIFRYV0kuCisJUkVHX1RSQU5TTUlUX1NFVFRJTkcgICAgICAgIFJlZ1RyYW5zbWl0U2V0dGluZzsgLy9yZWdpc3RyeSB0cmFuc21pdCBzZXR0aW5nLiB0aGlzIGlzIGZvciByZWFkaW5nIHJlZ2lzdHJ5IHNldHRpbmcgb25seS4gbm90IHVzZWZ1bC4KKwkvL1VDSEFSICAgICAgIEZpeGVkVHhNb2RlOyAgICAgICAgICAgICAgLy8gRml4ZWQgVHggTW9kZSAoQ0NLLCBPRkRNKSwgZm9yIEhUIGZpeGVkIHR4IG1vZGUgKEdGLCBNSVgpICwgcmVmZXIgdG8gUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTW9kZQorCVVDSEFSICAgICAgIFR4UmF0ZTsgICAgICAgICAgICAgICAgIC8vIFNhbWUgdmFsdWUgdG8gZmlsbCBpbiBUWEQuIFR4UmF0ZSBpcyA2LWJpdAorCVVDSEFSICAgICAgIE1heFR4UmF0ZTsgICAgICAgICAgICAgIC8vIFJBVEVfMSwgUkFURV8yLCBSQVRFXzVfNSwgUkFURV8xMQorCVVDSEFSICAgICAgIFR4UmF0ZUluZGV4OyAgICAgICAgICAgIC8vIFR4IHJhdGUgaW5kZXggaW4gUmF0ZVN3aXRjaFRhYmxlCisJVUNIQVIgICAgICAgVHhSYXRlVGFibGVTaXplOyAgICAgICAgLy8gVmFsaWQgVHggcmF0ZSB0YWJsZSBzaXplIGluIFJhdGVTd2l0Y2hUYWJsZQorCS8vQk9PTEVBTgkJYkF1dG9UeFJhdGVTd2l0Y2g7CisJVUNIQVIgICAgICAgTWluVHhSYXRlOyAgICAgICAgICAgICAgLy8gUkFURV8xLCBSQVRFXzIsIFJBVEVfNV81LCBSQVRFXzExCisJVUNIQVIgICAgICAgUnRzUmF0ZTsgICAgICAgICAgICAgICAgLy8gUkFURV94eHgKKwlIVFRSQU5TTUlUX1NFVFRJTkcJTWxtZVRyYW5zbWl0OyAgIC8vIE1HTVQgZnJhbWUgUEhZIHJhdGUgc2V0dGluZyB3aGVuIG9wZXJhdGluIGF0IEh0IHJhdGUuCisJVUNIQVIgICAgICAgTWxtZVJhdGU7ICAgICAgICAgICAgICAgLy8gUkFURV94eHgsIHVzZWQgdG8gc2VuZCBNTE1FIGZyYW1lcworCVVDSEFSICAgICAgIEJhc2ljTWxtZVJhdGU7ICAgICAgICAgIC8vIERlZmF1bHQgUmF0ZSBmb3Igc2VuZGluZyBNTE1FIGZyYW1lcworCisJVVNIT1JUICAgICAgUnRzVGhyZXNob2xkOyAgICAgICAgICAgLy8gaW4gdW5pdCBvZiBCWVRFCisJVVNIT1JUICAgICAgRnJhZ21lbnRUaHJlc2hvbGQ7ICAgICAgLy8gaW4gdW5pdCBvZiBCWVRFCisKKwlVQ0hBUiAgICAgICBUeFBvd2VyOyAgICAgICAgICAgICAgICAvLyBpbiB1bml0IG9mIG1XCisJVUxPTkcgICAgICAgVHhQb3dlclBlcmNlbnRhZ2U7ICAgICAgLy8gMH4xMDAgJQorCVVMT05HICAgICAgIFR4UG93ZXJEZWZhdWx0OyAgICAgICAgIC8vIGtlZXAgZm9yIFR4UG93ZXJQZXJjZW50YWdlCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlCQUNBUF9TVFJVQyAgICAgICAgQkFDYXBhYmlsaXR5OyAvLyAgIE5PIFVTRSA9IDBYRkYgIDsgIElNTUVEX0JBID0xICA7ICBERUxBWV9CQT0wCisJQkFDQVBfU1RSVUMgICAgICAgIFJFR0JBQ2FwYWJpbGl0eTsgLy8gICBOTyBVU0UgPSAwWEZGICA7ICBJTU1FRF9CQSA9MSAgOyAgREVMQVlfQkE9MAorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCUlPVF9TVFJVQwkJSU9UZXN0UGFybTsJLy8gODAyLjExbiBJbnRlck9wYmlsaXR5IFRlc3QgUGFyYW1ldGVyOworCVVMT05HICAgICAgIFR4UHJlYW1ibGU7ICAgICAgICAgICAgIC8vIFJ0ODAyXzExUHJlYW1ibGVMb25nLCBSdDgwMl8xMVByZWFtYmxlU2hvcnQsIFJ0ODAyXzExUHJlYW1ibGVBdXRvCisJQk9PTEVBTiAgICAgYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudDsgICAgIC8vIE1pY3Jvc29mdCB1c2UgMCBhcyBkaXNhYmxlCisJVUxPTkcgICAgICAgVXNlQkdQcm90ZWN0aW9uOyAgICAgICAgLy8gMDogYXV0bywgMTogYWx3YXlzIHVzZSwgMjogYWx3YXlzIG5vdCB1c2UKKwlCT09MRUFOICAgICBiVXNlU2hvcnRTbG90VGltZTsgICAgICAvLyAwOiBkaXNhYmxlLCAxIC0gdXNlIHNob3J0IHNsb3QgKDl1cykKKwlCT09MRUFOICAgICBiRW5hYmxlVHhCdXJzdDsgICAgICAgICAvLyAxOiBlbmJsZSBUWCBQQUNLRVQgQlVSU1QsIDA6IGRpc2FibGUgVFggUEFDS0VUIEJVUlNUCisJQk9PTEVBTiAgICAgYkFnZ3JlZ2F0aW9uQ2FwYWJsZTsgICAgICAvLyAxOiBlbmFibGUgVFggYWdncmVnYXRpb24gd2hlbiB0aGUgcGVlciBzdXBwb3J0cyBpdAorCUJPT0xFQU4gICAgIGJQaWdneUJhY2tDYXBhYmxlOwkJLy8gMTogZW5hYmxlIFRYIHBpZ2d5LWJhY2sgYWNjb3JkaW5nIE1BQydzIHZlcnNpb24KKwlCT09MRUFOICAgICBiSUVFRTgwMjExSDsJCQkvLyAxOiBlbmFibGUgSUVFRTgwMi4xMWggc3BlYy4KKwlVTE9ORwkJRGlzYWJsZU9MQkNEZXRlY3Q7CQkvLyAwOiBlbmFibGUgT0xCQyBkZXRlY3Q7IDEgZGlzYWJsZSBPTEJDIGRldGVjdAorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJQk9PTEVBTgkJCQliUmRnOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCUJPT0xFQU4gICAgICAgICAgICAgYldtbUNhcGFibGU7ICAgICAgICAvLyAwOmRpc2FibGUgV01NLCAxOmVuYWJsZSBXTU0KKwlRT1NfQ0FQQUJJTElUWV9QQVJNIEFQUW9zQ2FwYWJpbGl0eTsgICAgLy8gUU9TIGNhcGFiaWxpdHkgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAorCUVEQ0FfUEFSTSAgICAgICAgICAgQVBFZGNhUGFybTsgICAgICAgICAvLyBFRENBIHBhcmFtZXRlcnMgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAorCVFCU1NfTE9BRF9QQVJNICAgICAgQVBRYnNzTG9hZDsgICAgICAgICAvLyBRQlNTIGxvYWQgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAorCVVDSEFSICAgICAgICAgICAgICAgQWNrUG9saWN5WzRdOyAgICAgICAvLyBBQ0sgcG9saWN5IG9mIHRoZSBzcGVjaWZpZWQgQUMuIHNlZSBBQ0tfeHh4CisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJQk9PTEVBTgkJCQliRExTQ2FwYWJsZTsJCS8vIDA6ZGlzYWJsZSBETFMsIDE6ZW5hYmxlIERMUworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCS8vIGEgYml0bWFwIG9mIEJPT0xFQU4gZmxhZ3MuIGVhY2ggYml0IHJlcHJlc2VudCBhbiBvcGVyYXRpb24gc3RhdHVzIG9mIGEgcGFydGljdWxhcgorCS8vIEJPT0xFQU4gY29udHJvbCwgZWl0aGVyIE9OIG9yIE9GRi4gVGhlc2UgZmxhZ3Mgc2hvdWxkIGFsd2F5cyBiZSBhY2Nlc3NlZCB2aWEKKwkvLyBPUFNUQVRVU19URVNUX0ZMQUcoKSwgT1BTVEFUVVNfU0VUX0ZMQUcoKSwgT1BfU1RBVFVTX0NMRUFSX0ZMQUcoKSBtYWNyb3MuCisJLy8gc2VlIGZPUF9TVEFUVVNfeHh4IGluIFJUTVBfREVGLkMgZm9yIGRldGFpbCBiaXQgZGVmaW5pdGlvbgorCVVMT05HICAgICAgICAgICAgICAgT3BTdGF0dXNGbGFnczsKKworCUJPT0xFQU4JCQkJTmRpc1JhZGlvU3RhdGVPZmY7IC8vRm9yIEhDVCAxMi4wLCBzZXQgdGhpcyBmbGFnIHRvIFRSVUUgaW5zdGVhZCBvZiBjYWxsZWQgTWxtZVJhZGlvT2ZmLgorCUFCR0JBTkRfU1RBVEUJCUJhbmRTdGF0ZTsJCS8vIEZvciBzZXR0aW5nIEJCUCB1c2VkIG9uIEIvRyBvciBBIG1vZGUuCisKKwkvLyBJRUVFODAyLjExSC0tREZTLgorCVJBREFSX0RFVEVDVF9TVFJVQ1QJUmFkYXJEZXRlY3Q7CisKKyNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCisJQ0FSUklFUl9ERVRFQ1RJT04JCUNhcnJpZXJEZXRlY3Q7CisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJLy8gSFQKKwlVQ0hBUgkJCUJBU2l6ZTsJCS8vIFVTZXIgZGVzaXJlZCBCQVdpbmRvd1NpemUuIFNob3VsZCBub3QgZXhjZWVkIG91ciBtYXggY2FwYWJpbGl0eQorCS8vUlRfSFRfQ0FQQUJJTElUWQlTdXBwb3J0ZWRIdFBoeTsKKwlSVF9IVF9DQVBBQklMSVRZCURlc2lyZWRIdFBoeTsKKwlIVF9DQVBBQklMSVRZX0lFCQlIdENhcGFiaWxpdHk7CisJQUREX0hUX0lORk9fSUUJCUFkZEhUSW5mbzsJLy8gVXNlZnVsIGFzIEFQLgorCS8vVGhpcyBJRSBpcyB1c2VkIHdpdGggY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IGVsZW1lbnQgd2hlbiBjaGFuZ2luZyB0byBhIG5ldyA0ME1Iei4KKwkvL1RoaXMgSUUgaXMgaW5jbHVkZWQgaW4gY2hhbm5lbCBzd2l0Y2ggYW1tb3VuY2VtZW50IGZyYW1lcyA3LjQuMS41LCBiZWFjb25zLCBwcm9iZSBSc3AuCisJTkVXX0VYVF9DSEFOX0lFCU5ld0V4dENoYW5PZmZzZXQ7CS8vNy4zLjIuMjBBLCAxIGlmIGV4dGVuc2lvbiBjaGFubmVsIGlzIGFib3ZlIHRoZSBjb250cm9sIGNoYW5uZWwsIDMgaWYgYmVsb3csIDAgaWYgbm90IHByZXNlbnQKKworI2lmZGVmIERPVDExTl9EUkFGVDMKKwlVQ0hBUgkJCQkJQnNzMjA0MENvZXhpc3RGbGFnOwkJLy8gYml0IDA6IGJCc3NDb2V4aXN0VGltZXJSdW5uaW5nLCBiaXQgMTogTmVlZFN5bmNBZGRIdEluZm8uCisJUkFMSU5LX1RJTUVSX1NUUlVDVAlCc3MyMDQwQ29leGlzdFRpbWVyOworCisJLy9UaGlzIElFIGlzIHVzZWQgZm9yIDIwLzQwIEJTUyBDb2V4aXN0ZW5jZS4KKwlCU1NfMjA0MF9DT0VYSVNUX0lFCQlCU1MyMDQwQ29leGlzdEluZm87CisJLy8gPT09PT09IDExbiBEMy4wID09PT09PT09PT09PT09PT09PT09PT09PgorCVVTSE9SVAkJCQkJRG90MTFPQnNzU2NhblBhc3NpdmVEd2VsbDsJCQkJLy8gVW5pdCA6IFRVLiA1fjEwMDAKKwlVU0hPUlQJCQkJCURvdDExT0Jzc1NjYW5BY3RpdmVEd2VsbDsJCQkJLy8gVW5pdCA6IFRVLiAxMH4xMDAwCisJVVNIT1JUCQkJCQlEb3QxMUJzc1dpZHRoVHJpZ2dlclNjYW5JbnQ7CQkJLy8gVW5pdCA6IFNlY29uZAorCVVTSE9SVAkJCQkJRG90MTFPQnNzU2NhblBhc3NpdmVUb3RhbFBlckNoYW5uZWw7CS8vIFVuaXQgOiBUVS4gMjAwfjEwMDAwCisJVVNIT1JUCQkJCQlEb3QxMU9Cc3NTY2FuQWN0aXZlVG90YWxQZXJDaGFubmVsOwkvLyBVbml0IDogVFUuIDIwfjEwMDAwCisJVVNIT1JUCQkJCQlEb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheUZhY3RvcjsKKwlVU0hPUlQJCQkJCURvdDExT0Jzc1NjYW5BY3Rpdml0eVRocmU7CQkJCS8vIFVuaXQgOiBwZXJjZW50YWdlCisKKwlVTE9ORwkJCQkJRG90MTFCc3NXaWR0aENoYW5UcmFuRGVsYXk7CQkJLy8gbXVsdGlwbGUgb2YgKERvdDExQnNzV2lkdGhUcmlnZ2VyU2NhbkludCAqIERvdDExQnNzV2lkdGhDaGFuVHJhbkRlbGF5RmFjdG9yKQorCVVMT05HCQkJCQlDb3VudERvd25DdHI7CS8vIENvdW50RG93biBDb3VudGVyIGZyb20gKERvdDExQnNzV2lkdGhUcmlnZ2VyU2NhbkludCAqIERvdDExQnNzV2lkdGhDaGFuVHJhbkRlbGF5RmFjdG9yKQorCisJTkRJU19TUElOX0xPQ0sgICAgICAgICAgVHJpZ2dlckV2ZW50VGFiTG9jazsKKwlCU1NfMjA0MF9DT0VYSVNUX0lFCQlMYXN0QlNTQ29leGlzdDIwNDA7CisJQlNTXzIwNDBfQ09FWElTVF9JRQkJQlNTQ29leGlzdDIwNDA7CisJVFJJR0dFUl9FVkVOVF9UQUIJCVRyaWdnZXJFdmVudFRhYjsKKwlVQ0hBUgkJCQkJQ2hhbm5lbExpc3RJZHg7CisJLy8gPD09PT09PSAxMW4gRDMuMCA9PT09PT09PT09PT09PT09PT09PT09PQorCUJPT0xFQU4JCQkJCWJPdmVybGFwU2Nhbm5pbmc7CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworCisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgYkhUUHJvdGVjdDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICBiTUlNT1BTRW5hYmxlOworICAgIEJPT0xFQU4JCQkJCWJCQURlY2xpbmU7CisJQk9PTEVBTgkJCQkJYkRpc2FibGVSZW9yZGVyaW5nOworCUJPT0xFQU4JCQkJCWJGb3J0eV9NaHpfSW50b2xlcmFudDsKKwlCT09MRUFOCQkJCQliRXh0Q2hhbm5lbFN3aXRjaEFubm91bmNlbWVudDsKKwlCT09MRUFOCQkJCQliUmN2QlNTV2lkdGhUcmlnZ2VyRXZlbnRzOworCVVMT05HCQkJCQlMYXN0UmN2QlNTV2lkdGhUcmlnZ2VyRXZlbnRzVGltZTsKKworCVVDSEFSCQkJCQlUeEJBU2l6ZTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCS8vIEVuYWJsZSB3aXJlbGVzcyBldmVudAorCUJPT0xFQU4JCQkJYldpcmVsZXNzRXZlbnQ7CisJQk9PTEVBTgkJCQliV2lGaVRlc3Q7CQkJCS8vIEVuYWJsZSB0aGlzIHBhcmFtZXRlciBmb3IgV2lGaSB0ZXN0CisKKwkvLyBUeCAmIFJ4IFN0cmVhbSBudW1iZXIgc2VsZWN0aW9uCisJVUNIQVIJCQkJVHhTdHJlYW07CisJVUNIQVIJCQkJUnhTdHJlYW07CisKKwkvLyB0cmFuc21pdCBwaHkgbW9kZSwgdHJhc21pdCByYXRlIGZvciBNdWx0aWNhc3QuCisjaWZkZWYgTUNBU1RfUkFURV9TUEVDSUZJQworCVVDSEFSCQkJCU1jYXN0VHJhbnNtaXRNY3M7CisJVUNIQVIJCQkJTWNhc3RUcmFuc21pdFBoeU1vZGU7CisjZW5kaWYgLy8gTUNBU1RfUkFURV9TUEVDSUZJQyAvLworCisJQk9PTEVBTiAgICAgCQliSGFyZHdhcmVSYWRpbzsgICAgIC8vIEhhcmR3YXJlIGNvbnRyb2xsZWQgUmFkaW8gZW5hYmxlZAorCisjaWZkZWYgUlQyODcwCisJQk9PTEVBTiAgICAgCQliTXVsdGlwbGVJUlA7ICAgICAgIC8vIE11bHRpcGxlIEJ1bGsgSU4gZmxhZworCVVDSEFSICAgICAgIAkJTnVtT2ZCdWxrSW5JUlA7ICAgICAvLyBpZiBiTXVsdGlwbGVJUlAgPT0gVFJVRSwgTnVtT2ZCdWxrSW5JUlAgd2lsbCBiZSA0IG90aGVyd2lzZSBiZSAxCisgCVJUX0hUX0NBUEFCSUxJVFkJU3VwcG9ydGVkSHRQaHk7CisJVUxPTkcJCQkJTWF4UGt0T25lVHhCdWxrOworCVVDSEFSCQkJCVR4QnVsa0ZhY3RvcjsKKwlVQ0hBUgkJCQlSeEJ1bGtGYWN0b3I7CisKKwlCRUFDT05fU1lOQ19TVFJVQ1QJKnBCZWFjb25TeW5jOworCVJBTElOS19USU1FUl9TVFJVQ1QJQmVhY29uVXBkYXRlVGltZXI7CisJVUlOVDMyCQkJCUJlYWNvbkFkanVzdDsKKwlVSU5UMzIJCQkJQmVhY29uRmFjdG9yOworCVVJTlQzMgkJCQlCZWFjb25SZW1haW47CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKworIAlORElTX1NQSU5fTE9DSwkJCU1lYXN1cmVSZXFUYWJMb2NrOworCVBNRUFTVVJFX1JFUV9UQUIJCXBNZWFzdXJlUmVxVGFiOworCisJTkRJU19TUElOX0xPQ0sJCQlUcGNSZXFUYWJMb2NrOworCVBUUENfUkVRX1RBQgkJCXBUcGNSZXFUYWI7CisKKwkvLyB0cmFuc21pdCBwaHkgbW9kZSwgdHJhc21pdCByYXRlIGZvciBNdWx0aWNhc3QuCisjaWZkZWYgTUNBU1RfUkFURV9TUEVDSUZJQworCUhUVFJBTlNNSVRfU0VUVElORwkJTUNhc3RQaHlNb2RlOworI2VuZGlmIC8vIE1DQVNUX1JBVEVfU1BFQ0lGSUMgLy8KKworI2lmZGVmIFNJTkdMRV9TS1UKKwlVSU5UMTYJCQkJCURlZmluZU1heFR4UHdyOworI2VuZGlmIC8vIFNJTkdMRV9TS1UgLy8KKworCit9IENPTU1PTl9DT05GSUcsICpQQ09NTU9OX0NPTkZJRzsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisvKiBNb2RpZmllZCBieSBXdSBYaS1LdW4gNC8yMS8yMDA2ICovCisvLyBTVEEgY29uZmlndXJhdGlvbiBhbmQgc3RhdHVzCit0eXBlZGVmIHN0cnVjdCBfU1RBX0FETUlOX0NPTkZJRyB7CisJLy8gR1JPVVAgMSAtCisJLy8gICBVc2VyIGNvbmZpZ3VyYXRpb24gbG9hZGVkIGZyb20gUmVnaXN0cnksIEUyUFJPTSBvciBPSURfeHh4LiBUaGVzZSBzZXR0aW5ncyBkZXNjcmliZQorCS8vICAgdGhlIHVzZXIgaW50ZW5kZWQgY29uZmlndXJhdGlvbiwgYnV0IG5vdCBuZWNlc3NhcnkgZnVsbHkgZXF1YWwgdG8gdGhlIGZpbmFsCisJLy8gICBzZXR0aW5ncyBpbiBBQ1RJVkUgQlNTIGFmdGVyIG5lZ290aWF0aW9uL2NvbXByb21pemUgd2l0aCB0aGUgQlNTIGhvbGRlciAoZWl0aGVyCisJLy8gICBBUCBvciBJQlNTIGhvbGRlcikuCisJLy8gICBPbmNlIGluaXRpYWxpemVkLCB1c2VyIGNvbmZpZ3VyYXRpb24gY2FuIG9ubHkgYmUgY2hhbmdlZCB2aWEgT0lEX3h4eAorCVVDSEFSICAgICAgIEJzc1R5cGU7ICAgICAgICAgICAgICAvLyBCU1NfSU5GUkEgb3IgQlNTX0FESE9DCisJVVNIT1JUICAgICAgQXRpbVdpbjsgICAgICAgICAgLy8gdXNlZCB3aGVuIHN0YXJ0aW5nIGEgbmV3IElCU1MKKworCS8vIEdST1VQIDIgLQorCS8vICAgVXNlciBjb25maWd1cmF0aW9uIGxvYWRlZCBmcm9tIFJlZ2lzdHJ5LCBFMlBST00gb3IgT0lEX3h4eC4gVGhlc2Ugc2V0dGluZ3MgZGVzY3JpYmUKKwkvLyAgIHRoZSB1c2VyIGludGVuZGVkIGNvbmZpZ3VyYXRpb24sIGFuZCBzaG91bGQgYmUgYWx3YXlzIGFwcGxpZWQgdG8gdGhlIGZpbmFsCisJLy8gICBzZXR0aW5ncyBpbiBBQ1RJVkUgQlNTIHdpdGhvdXQgY29tcHJvbWlzaW5nIHdpdGggdGhlIEJTUyBob2xkZXIuCisJLy8gICBPbmNlIGluaXRpYWxpemVkLCB1c2VyIGNvbmZpZ3VyYXRpb24gY2FuIG9ubHkgYmUgY2hhbmdlZCB2aWEgT0lEX3h4eAorCVVDSEFSICAgICAgIFJzc2lUcmlnZ2VyOworCVVDSEFSICAgICAgIFJzc2lUcmlnZ2VyTW9kZTsgICAgICAvLyBSU1NJX1RSSUdHRVJFRF9VUE9OX0JFTE9XX1RIUkVTSE9MRCBvciBSU1NJX1RSSUdHRVJFRF9VUE9OX0VYQ0NFRURfVEhSRVNIT0xECisJVVNIT1JUICAgICAgRGVmYXVsdExpc3RlbkNvdW50OyAgIC8vIGRlZmF1bHQgbGlzdGVuIGNvdW50OworCVVMT05HICAgICAgIFdpbmRvd3NQb3dlck1vZGU7ICAgICAgICAgICAvLyBQb3dlciBtb2RlIGZvciBBQyBwb3dlcgorCVVMT05HICAgICAgIFdpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlOyAgICAvLyBQb3dlciBtb2RlIGZvciBiYXR0ZXJ5IGlmIGV4aXN0cworCUJPT0xFQU4gICAgIGJXaW5kb3dzQUNDQU1FbmFibGU7ICAgICAgICAvLyBFbmFibGUgQ0FNIHBvd2VyIG1vZGUgd2hlbiBBQyBvbgorCUJPT0xFQU4gICAgIGJBdXRvUmVjb25uZWN0OyAgICAgICAgIC8vIFNldCB0byBUUlVFIHdoZW4gc2V0dGluZyBPSURfODAyXzExX1NTSUQgd2l0aCBubyBtYXRjaGluZyBCU1NJRAorCVVMT05HICAgICAgIFdpbmRvd3NQb3dlclByb2ZpbGU7ICAgIC8vIFdpbmRvd3MgcG93ZXIgcHJvZmlsZSwgZm9yIE5ESVM1LjEgUG5QCisKKwkvLyBNSUI6aWVlZTgwMmRvdDExLmRvdDExc210KDEpLmRvdDExU3RhdGlvbkNvbmZpZ1RhYmxlKDEpCisJVVNIT1JUICAgICAgUHNtOyAgICAgICAgICAgICAgICAgIC8vIHBvd2VyIG1hbmFnZW1lbnQgbW9kZSAgIChQV1JfQUNUSVZFfFBXUl9TQVZFKQorCVVTSE9SVCAgICAgIERpc2Fzc29jUmVhc29uOworCVVDSEFSICAgICAgIERpc2Fzc29jU3RhW01BQ19BRERSX0xFTl07CisJVVNIT1JUICAgICAgRGVhdXRoUmVhc29uOworCVVDSEFSICAgICAgIERlYXV0aFN0YVtNQUNfQUREUl9MRU5dOworCVVTSE9SVCAgICAgIEF1dGhGYWlsUmVhc29uOworCVVDSEFSICAgICAgIEF1dGhGYWlsU3RhW01BQ19BRERSX0xFTl07CisKKwlORElTXzgwMl8xMV9QUklWQUNZX0ZJTFRFUiAgICAgICAgICBQcml2YWN5RmlsdGVyOyAgLy8gUHJpdmFjeUZpbHRlciBlbnVtIGZvciA4MDIuMVgKKwlORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFICAgICBBdXRoTW9kZTsgICAgICAgLy8gVGhpcyBzaG91bGQgbWF0Y2ggdG8gd2hhdGV2ZXIgbWljcm9zb2Z0IGRlZmluZWQKKwlORElTXzgwMl8xMV9XRVBfU1RBVFVTICAgICAgICAgICAgICBXZXBTdGF0dXM7CisJTkRJU184MDJfMTFfV0VQX1NUQVRVUwkJCQlPcmlnV2VwU3RhdHVzOwkvLyBPcmlnaW5hbCB3ZXAgc3RhdHVzIHNldCBmcm9tIE9JRAorCisJLy8gQWRkIHRvIHN1cHBvcnQgZGlmZmVyZW50IGNpcGhlciBzdWl0ZSBmb3IgV1BBMi9XUEEgbW9kZQorCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCQlHcm91cENpcGhlcjsJCS8vIE11bHRpY2FzdCBjaXBoZXIgc3VpdGUKKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwkJUGFpckNpcGhlcjsJCQkvLyBVbmljYXN0IGNpcGhlciBzdWl0ZQorCUJPT0xFQU4JCQkJCQkJCWJNaXhDaXBoZXI7CQkJLy8gSW5kaWNhdGUgY3VycmVudCBQYWlyICYgR3JvdXAgdXNlIGRpZmZlcmVudCBjaXBoZXIgc3VpdGVzCisJVVNIT1JUCQkJCQkJCQlSc25DYXBhYmlsaXR5OworCisJTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgR3JvdXBLZXlXZXBTdGF0dXM7CisKKwlVQ0hBUgkJUE1LWzMyXTsgICAgICAgICAgICAgICAgLy8gV1BBIFBTSyBtb2RlIFBNSworCVVDSEFSICAgICAgIFBUS1s2NF07ICAgICAgICAgICAgICAgIC8vIFdQQSBQU0sgbW9kZSBQVEsKKwlVQ0hBUgkJR1RLWzMyXTsJCQkJLy8gR1RLIGZyb20gYXV0aGVudGljYXRvcgorCUJTU0lEX0lORk8JU2F2ZWRQTUtbUE1LSURfTk9dOworCVVJTlQJCVNhdmVkUE1LTnVtOwkJCS8vIFNhdmVkIFBNS0lEIG51bWJlcgorCisJVUNIQVIJCURlZmF1bHRLZXlJZDsKKworCisJLy8gV1BBIDgwMi4xeCBwb3J0IGNvbnRyb2wsIFdQQV84MDJfMVhfUE9SVF9TRUNVUkVELCBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQKKwlVQ0hBUiAgICAgICBQb3J0U2VjdXJlZDsKKworCS8vIEZvciBXUEEgY291bnRlcm1lYXN1cmVzCisJVUxPTkcgICAgICAgTGFzdE1pY0Vycm9yVGltZTsgICAvLyByZWNvcmQgbGFzdCBNSUMgZXJyb3IgdGltZQorCVVMT05HICAgICAgIE1pY0VyckNudDsgICAgICAgICAgLy8gU2hvdWxkIGJlIDAsIDEsIDIsIHRoZW4gcmVzZXQgdG8gemVybyAoYWZ0ZXIgZGlzYXNzb2ljaWF0aW9uKS4KKwlCT09MRUFOICAgICBiQmxvY2tBc3NvYzsgICAgICAgIC8vIEJsb2NrIGFzc29jaWF0ZSBhdHRlbXB0IGZvciA2MCBzZWNvbmRzIGFmdGVyIGNvdW50ZXIgbWVhc3VyZSBvY2N1cnJlZC4KKwkvLyBGb3IgV1BBLVBTSyBzdXBwbGljYW50IHN0YXRlCisJV1BBX1NUQVRFICAgV3BhU3RhdGU7ICAgICAgICAgICAvLyBEZWZhdWx0IGlzIFNTX05PVFVTRSBhbmQgaGFuZGxlZCBieSBtaWNyb3NvZnQgODAyLjF4CisJVUNIQVIgICAgICAgUmVwbGF5Q291bnRlcls4XTsKKwlVQ0hBUiAgICAgICBBTm9uY2VbMzJdOyAgICAgICAgIC8vIEFOb25jZSBmb3IgV1BBLVBTSyBmcm9tIGF1cmhlbnRpY2F0b3IKKwlVQ0hBUiAgICAgICBTTm9uY2VbMzJdOyAgICAgICAgIC8vIFNOb25jZSBmb3IgV1BBLVBTSworCisJVUNIQVIgICAgICAgTGFzdFNOUjA7ICAgICAgICAgICAgIC8vIGxhc3QgcmVjZWl2ZWQgQkVBQ09OJ3MgU05SCisJVUNIQVIgICAgICAgTGFzdFNOUjE7ICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBCRUFDT04ncyBTTlIgZm9yIDJuZCAgYW50ZW5uYQorCVJTU0lfU0FNUExFIFJzc2lTYW1wbGU7CisJVUxPTkcgICAgICAgTnVtT2ZBdmdSc3NpU2FtcGxlOworCisJVUxPTkcgICAgICAgTGFzdEJlYWNvblJ4VGltZTsgICAgIC8vIE9TJ3MgdGltZXN0YW1wIG9mIHRoZSBsYXN0IEJFQUNPTiBSWCB0aW1lCisJVUxPTkcgICAgICAgTGFzdDExYkJlYWNvblJ4VGltZTsgIC8vIE9TJ3MgdGltZXN0YW1wIG9mIHRoZSBsYXN0IDExQiBCRUFDT04gUlggdGltZQorCVVMT05HCQlMYXN0MTFnQmVhY29uUnhUaW1lOwkvLyBPUydzIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCAxMUcgQkVBQ09OIFJYIHRpbWUKKwlVTE9ORwkJTGFzdDIwTkJlYWNvblJ4VGltZTsJLy8gT1MncyB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgMjBNSHogTiBCRUFDT04gUlggdGltZQorCisJVUxPTkcgICAgICAgTGFzdFNjYW5UaW1lOyAgICAgICAvLyBSZWNvcmQgbGFzdCBzY2FuIHRpbWUgZm9yIGlzc3VlIEJTU0lEX1NDQU5fTElTVAorCVVMT05HICAgICAgIFNjYW5DbnQ7ICAgICAgICAgICAgLy8gU2NhbiBjb3VudHMgc2luY2UgbW9zdCByZWNlbnQgU1NJRCwgQlNTSUQsIFNDQU4gT0lEIHJlcXVlc3QKKwlCT09MRUFOICAgICBiU3dSYWRpbzsgICAgICAgICAgIC8vIFNvZnR3YXJlIGNvbnRyb2xsZWQgUmFkaW8gT24vT2ZmLCBUUlVFOiBPbgorCUJPT0xFQU4gICAgIGJId1JhZGlvOyAgICAgICAgICAgLy8gSGFyZHdhcmUgY29udHJvbGxlZCBSYWRpbyBPbi9PZmYsIFRSVUU6IE9uCisJQk9PTEVBTiAgICAgYlJhZGlvOyAgICAgICAgICAgICAvLyBSYWRpbyBzdGF0ZSwgQW5kIG9mIFN3ICYgSHcgcmFkaW8gc3RhdGUKKwlCT09MRUFOICAgICBiSGFyZHdhcmVSYWRpbzsgICAgIC8vIEhhcmR3YXJlIGNvbnRyb2xsZWQgUmFkaW8gZW5hYmxlZAorCUJPT0xFQU4gICAgIGJTaG93SGlkZGVuU1NJRDsgICAgLy8gU2hvdyBhbGwga25vd24gU1NJRCBpbiBTU0lEIGxpc3QgZ2V0IG9wZXJhdGlvbgorCisKKwkvLyBOZXcgZm9yIFdQQSwgd2luZG93cyB3YW50IHVzIHRvIHRvIGtlZXAgYXNzb2NpYXRpb24gaW5mb3JtYXRpb24gYW5kCisJLy8gRml4ZWQgSUVzIGZyb20gbGFzdCBhc3NvY2lhdGlvbiByZXNwb25zZQorCU5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OICAgICBBc3NvY0luZm87CisJVVNIT1JUICAgICAgIFJlcVZhcklFTGVuOyAgICAgICAgICAgICAgICAvLyBMZW5ndGggb2YgbmV4dCBWSUUgaW5jbHVkZSBFSUQgJiBMZW5ndGgKKwlVQ0hBUiAgICAgICBSZXFWYXJJRXNbTUFYX1ZJRV9MRU5dOwkJLy8gVGhlIGNvbnRlbnQgc2F2ZWQgaGVyZSBzaG91bGQgYmUgbGl0dGxlLWVuZGlhbiBmb3JtYXQuCisJVVNIT1JUICAgICAgIFJlc1ZhcklFTGVuOyAgICAgICAgICAgICAgICAvLyBMZW5ndGggb2YgbmV4dCBWSUUgaW5jbHVkZSBFSUQgJiBMZW5ndGgKKwlVQ0hBUiAgICAgICBSZXNWYXJJRXNbTUFYX1ZJRV9MRU5dOworCisJVUNIQVIgICAgICAgUlNOSUVfTGVuOworCVVDSEFSICAgICAgIFJTTl9JRVtNQVhfTEVOX09GX1JTTklFXTsJLy8gVGhlIGNvbnRlbnQgc2F2ZWQgaGVyZSBzaG91bGQgYmUgbGl0dGxlLWVuZGlhbiBmb3JtYXQuCisKKwkvLyBOZXcgdmFyaWFibGVzIHVzZWQgZm9yIENDWCAxLjAKKwlCT09MRUFOICAgICAgICAgICAgIGJDa2lwT247CisJQk9PTEVBTiAgICAgICAgICAgICBiQ2tpcENtaWNPbjsKKwlVQ0hBUiAgICAgICAgICAgICAgIENraXBGbGFnOworCVVDSEFSICAgICAgICAgICAgICAgR0lWWzNdOyAgLy9mb3IgQ0NYIGl2CisJVUNIQVIgICAgICAgICAgICAgICBSeFNFUVs0XTsKKwlVQ0hBUiAgICAgICAgICAgICAgIFR4U0VRWzRdOworCVVDSEFSICAgICAgICAgICAgICAgQ0tJUE1JQ1s0XTsKKwlVQ0hBUiAgICAgICAgICAgICAgIExlYXBBdXRoTW9kZTsKKwlMRUFQX0FVVEhfSU5GTyAgICAgIExlYXBBdXRoSW5mbzsKKwlVQ0hBUiAgICAgICAgICAgICAgIEhhc2hQd2RbMTZdOworCVVDSEFSICAgICAgICAgICAgICAgTmV0d29ya0NoYWxsZW5nZVs4XTsKKwlVQ0hBUiAgICAgICAgICAgICAgIE5ldHdvcmtDaGFsbGVuZ2VSZXNwb25zZVsyNF07CisJVUNIQVIgICAgICAgICAgICAgICBQZWVyQ2hhbGxlbmdlWzhdOworCisJVUNIQVIgICAgICAgICAgICAgICBQZWVyQ2hhbGxlbmdlUmVzcG9uc2VbMjRdOworCVVDSEFSICAgICAgICAgICAgICAgU2Vzc2lvbktleVsxNl07IC8vTmV0d29yayBzZXNzaW9uIGtleXMgKE5TSykKKwlSQUxJTktfVElNRVJfU1RSVUNUIExlYXBBdXRoVGltZXI7CisJUk9HVUVBUF9UQUJMRSAgICAgICBSb2d1ZUFwVGFiOyAgIC8vQ2lzY28gQ0NYMSBSb2d1ZSBBUCBEZXRlY3Rpb24KKworCS8vIE5ldyBjb250cm9sIGZsYWdzIGZvciBDQ1gKKwlDQ1hfQ09OVFJPTCAgICAgICAgIENDWENvbnRyb2w7ICAgICAgICAgICAgICAgICAvLyBNYXN0ZXIgYWRtaW5pc3RyYXRpb24gc3RhdGUKKwlCT09MRUFOICAgICAgICAgICAgIENDWEVuYWJsZTsgICAgICAgICAgICAgICAgICAvLyBBY3R1YWwgQ0NYIHN0YXRlCisJVUNIQVIgICAgICAgICAgICAgICBDQ1hTY2FuQ2hhbm5lbDsgICAgICAgICAgICAgLy8gU2VsZWN0ZWQgY2hhbm5lbCBmb3IgQ0NYIGJlYWNvbiByZXF1ZXN0CisJVVNIT1JUICAgICAgICAgICAgICBDQ1hTY2FuVGltZTsgICAgICAgICAgICAgICAgLy8gVGltZSBvdXQgdG8gd2FpdCBmb3IgYmVhY29uIGFuZCBwcm9iZSByZXNwb25zZQorCVVDSEFSICAgICAgICAgICAgICAgQ0NYUmVxVHlwZTsgICAgICAgICAgICAgICAgIC8vIEN1cnJlbnQgcHJvY2Vzc2luZyBDQ1ggcmVxdWVzdCB0eXBlCisJQlNTX1RBQkxFICAgICAgICAgICBDQ1hCc3NUYWI7ICAgICAgICAgICAgICAgICAgLy8gQlNTIFRhYmxlCisJVUNIQVIgICAgICAgICAgICAgICBGcmFtZVJlcG9ydEJ1ZlsyMDQ4XTsgICAgICAgLy8gQnVmZmVyIGZvciBjcmVhdGluZyBmcmFtZSByZXBvcnQKKwlVU0hPUlQgICAgICAgICAgICAgIEZyYW1lUmVwb3J0TGVuOyAgICAgICAgICAgICAvLyBDdXJyZW50IEZyYW1lIHJlcG9ydCBsZW5ndGgKKwlVTE9ORyAgICAgICAgICAgICAgIENMQnVzeUJ5dGVzOyAgICAgICAgICAgICAgICAvLyBTYXZlIHRoZSB0b3RhbCBieXRlcyByZWNlaXZlZCBkdXJuaW5nIGNoYW5uZWwgbG9hZCBzY2FuIHRpbWUKKwlVU0hPUlQgICAgICAgICAgICAgIFJQSURlbnNpdHlbOF07ICAgICAgICAgICAgICAvLyBBcnJheSBmb3IgUlBJIGRlbnNpdHkgY29sbGVjdGlvbgorCS8vIFN0YXJ0IGFkZHJlc3Mgb2YgZWFjaCBCU1MgdGFibGUgd2l0aGluIEZyYW1lUmVwb3J0QnVmCisJLy8gSXQncyBpbXBvcnRhbnQgdG8gdXBkYXRlIHRoZSBSeFBvd2VyIG9mIHRoZSBjb3JyZXNwb25kaW5nIEJzcworCVVTSE9SVCAgICAgICAgICAgICAgQnNzUmVwb3J0T2Zmc2V0W01BWF9MRU5fT0ZfQlNTX1RBQkxFXTsKKwlVU0hPUlQgICAgICAgICAgICAgIEJlYWNvblRva2VuOyAgICAgICAgICAgICAgICAvLyBUb2tlbiBmb3IgYmVhY29uIHJlcG9ydAorCVVMT05HICAgICAgICAgICAgICAgTGFzdEJzc0luZGV4OyAgICAgICAgICAgICAgIC8vIE1vc3QgY3VycmVudCByZXBvcnRlZCBCc3MgaW5kZXgKKwlSTV9SRVFVRVNUX0FDVElPTiAgIE1lYXN1cmVtZW50UmVxdWVzdFsxNl07ICAgICAvLyBTYXZlZCBtZWFzdXJlbWVudCByZXF1ZXN0CisJVUNIQVIgICAgICAgICAgICAgICBSTVJlcUNudDsgICAgICAgICAgICAgICAgICAgLy8gTnVtYmVyIG9mIG1lYXN1cmVtZW50IHJlcXVlc3Qgc2F2ZWQuCisJVUNIQVIgICAgICAgICAgICAgICBDdXJyZW50Uk1SZXFJZHg7ICAgICAgICAgICAgLy8gTnVtYmVyIG9mIG1lYXN1cmVtZW50IHJlcXVlc3Qgc2F2ZWQuCisJQk9PTEVBTiAgICAgICAgICAgICBQYXJhbGxlbFJlcTsgICAgICAgICAgICAgICAgLy8gUGFyYWxsZWwgbWVhc3VyZW1lbnQsIG9ubHkgb25lIHJlcXVlc3QgcGVyZm9ybWVkLAorCQkJCQkJCQkJCQkJCS8vIEl0IG11c3QgYmUgdGhlIHNhbWUgY2hhbm5lbCB3aXRoIG1heGltdW0gZHVyYXRpb24KKwlVU0hPUlQgICAgICAgICAgICAgIFBhcmFsbGVsRHVyYXRpb247ICAgICAgICAgICAvLyBNYXhpbXVtIGR1cmF0aW9uIGZvciBwYXJhbGxlbCBtZWFzdXJlbWVudAorCVVDSEFSICAgICAgICAgICAgICAgUGFyYWxsZWxDaGFubmVsOyAgICAgICAgICAgIC8vIE9ubHkgb25lIGNoYW5uZWwgd2l0aCBwYXJhbGxlbCBtZWFzdXJlbWVudAorCVVTSE9SVCAgICAgICAgICAgICAgSUFQUFRva2VuOyAgICAgICAgICAgICAgICAgIC8vIElBUFAgZGlhbG9nIHRva2VuCisJVUNIQVIgICAgICAgICAgICAgICBDQ1hRb3NFQ1dNaW47ICAgICAgICAgICAgICAgLy8gQ2lzY28gUU9TIEVDV01pbiBmb3IgQUMgMAorCVVDSEFSICAgICAgICAgICAgICAgQ0NYUW9zRUNXTWF4OyAgICAgICAgICAgICAgIC8vIENpc2NvIFFPUyBFQ1dNYXggZm9yIEFDIDAKKwkvLyBIYWNrIGZvciBjaGFubmVsIGxvYWQgYW5kIG5vaXNlIGhpc3RvZ3JhbSBwYXJhbWV0ZXJzCisJVUNIQVIgICAgICAgICAgICAgICBOSEZhY3RvcjsgICAgICAgICAgICAgICAgICAgLy8gUGFyYW1ldGVyIGZvciBOb2lzZSBoaXN0b2dyYW0KKwlVQ0hBUiAgICAgICAgICAgICAgIENMRmFjdG9yOyAgICAgICAgICAgICAgICAgICAvLyBQYXJhbWV0ZXIgZm9yIGNoYW5uZWwgbG9hZAorCisJVUNIQVIgICAgICAgICAgICAgICBLUktbMTZdOyAgICAgICAgLy9LZXkgUmVmcmVzaCBLZXkuCisJVUNIQVIgICAgICAgICAgICAgICBCVEtbMzJdOyAgICAgICAgLy9CYXNlIFRyYW5zaWVudCBLZXkKKwlCT09MRUFOICAgICAgICAgICAgIENDS01MaW5rVXBGbGFnOworCVVMT05HICAgICAgICAgICAgICAgQ0NLTVJOOyAgICAvLyhSZSlBc3NvY2lhdGlvbiByZXF1ZXN0IG51bWJlci4KKwlMQVJHRV9JTlRFR0VSICAgICAgIENDS01CZWFjb25BdEpvaW5UaW1lU3RhbXA7ICAvL1RTRiB0aW1lciBmb3IgUmUtYXNzb2NhaXRlIHRvIHRoZSBuZXcgQVAKKwlVQ0hBUiAgICAgICAgICAgICAgIEFpcm9uZXRDZWxsUG93ZXJMaW1pdDsgICAgICAvL2luIGRCbQorCVVDSEFSICAgICAgICAgICAgICAgQWlyb25ldElQQWRkcmVzc1s0XTsgICAgICAgIC8vZWcuIDE5Mi4xNjguMS4xCisJQk9PTEVBTiAgICAgICAgICAgICBDQ1hBZGphY2VudEFQUmVwb3J0RmxhZzsgICAgLy9mbGFnIGZvciBkZXRlcm1pbmluZyByZXBvcnQgQXNzb2MgTG9zdCB0aW1lCisJQ0hBUiAgICAgICAgICAgICAgICBDQ1hBZGphY2VudEFQU3NpZFtNQVhfTEVOX09GX1NTSURdOyAvL0FkamFjZW50IEFQJ3MgU1NJRCByZXBvcnQKKwlVQ0hBUiAgICAgICAgICAgICAgIENDWEFkamFjZW50QVBTc2lkTGVuOyAgICAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgc3NpZCBsZW5ndGggaW4gdXNlZAorCVVDSEFSICAgICAgICAgICAgICAgQ0NYQWRqYWNlbnRBUEJzc2lkW01BQ19BRERSX0xFTl07ICAgICAgICAgLy9BZGphY2VudCBBUCdzIEJTU0lEIHJlcG9ydAorCVVTSE9SVCAgICAgICAgICAgICAgQ0NYQWRqYWNlbnRBUENoYW5uZWw7CisJVUxPTkcgICAgICAgICAgICAgICBDQ1hBZGphY2VudEFQTGlua0Rvd25UaW1lOyAgLy9mb3IgU3BlYyBTMzIuCisKKwlSQUxJTktfVElNRVJfU1RSVUNUCVN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyOworCUJPT0xFQU4JCQkJU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nOworCisJVUNIQVIgICAgICAgICAgIAlEdGltQ291bnQ7ICAgICAgLy8gMC4uIER0aW1QZXJpb2QtMQorCVVDSEFSICAgICAgICAgICAJRHRpbVBlcmlvZDsgICAgIC8vIGRlZmF1bHQgPSAzCisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwlSVF84MDJfMTFfRExTCQlETFNFbnRyeVtNQVhfTlVNX09GX0RMU19FTlRSWV07CisJVUNIQVIJCQkJRGxzUmVwbGF5Q291bnRlcls4XTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gVGhpcyBpcyBvbmx5IGZvciBXSFFMIHRlc3QuCisJQk9PTEVBTgkJCQlXaHFsVGVzdDsKKwkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBSQUxJTktfVElNRVJfU1RSVUNUIFdwYURpc2Fzc29jQW5kQmxvY2tBc3NvY1RpbWVyOworICAgIC8vIEZhc3QgUm9hbWluZworCUJPT0xFQU4JCSAgICAgICAgYkZhc3RSb2FtaW5nOyAgICAgICAvLyAwOmRpc2FibGUgZmFzdCByb2FtaW5nLCAxOmVuYWJsZSBmYXN0IHJvYW1pbmcKKwlDSEFSCQkgICAgICAgIGRCbVRvUm9hbTsgICAgICAgICAgLy8gdGhlIGNvbmRpdGlvbiB0byByb2FtIHdoZW4gcmVjZWl2aW5nIFJzc2kgbGVzcyB0aGFuIHRoaXMgdmFsdWUuIEl0J3MgbmVnYXRpdmUgdmFsdWUuCisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgQk9PTEVBTiAgICAgICAgICAgICBJRUVFODAyMVg7CisgICAgQk9PTEVBTiAgICAgICAgICAgICBJRUVFODAyMXhfcmVxdWlyZWRfa2V5czsKKyAgICBDSVBIRVJfS0VZCSAgICAgICAgRGVzaXJlU2hhcmVkS2V5WzRdOwkvLyBSZWNvcmQgdXNlciBkZXNpcmVkIFdFUCBrZXlzCisgICAgVUNIQVIgICAgICAgICAgICAgICBEZXNpcmVTaGFyZWRLZXlJZDsKKworICAgIC8vIDA6IGRyaXZlciBpZ25vcmVzIHdwYV9zdXBwbGljYW50CisgICAgLy8gMTogd3BhX3N1cHBsaWNhbnQgaW5pdGlhdGVzIHNjYW5uaW5nIGFuZCBBUCBzZWxlY3Rpb24KKyAgICAvLyAyOiBkcml2ZXIgdGFrZXMgY2FyZSBvZiBzY2FubmluZywgQVAgc2VsZWN0aW9uLCBhbmQgSUVFRSA4MDIuMTEgYXNzb2NpYXRpb24gcGFyYW1ldGVycworICAgIFVDSEFSICAgICAgICAgICAgICAgV3BhU3VwcGxpY2FudFVQOworCVVDSEFSCQkJCVdwYVN1cHBsaWNhbnRTY2FuQ291bnQ7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisgICAgQ0hBUiAgICAgICAgICAgICAgICBkZXZfbmFtZVsxNl07CisgICAgVVNIT1JUICAgICAgICAgICAgICBPcmlEZXZUeXBlOworCisgICAgQk9PTEVBTiAgICAgICAgICAgICBiVEduV2lmaVRlc3Q7CisJQk9PTEVBTgkJCSAgICBiU2NhblJlcUlzRnJvbVdlYlVJOworCisJSFRUUkFOU01JVF9TRVRUSU5HCQkJCUhUUGh5TW9kZSwgTWF4SFRQaHlNb2RlLCBNaW5IVFBoeU1vZGU7Ly8gRm9yIHRyYW5zbWl0IHBoeSBzZXR0aW5nIGluIFRYV0kuCisJREVTSVJFRF9UUkFOU01JVF9TRVRUSU5HICAgICAgIAlEZXNpcmVkVHJhbnNtaXRTZXR0aW5nOworCVJUX0hUX1BIWV9JTkZPCQkJCQlEZXNpcmVkSHRQaHlJbmZvOworCUJPT0xFQU4JCQkJCQkJYkF1dG9UeFJhdGVTd2l0Y2g7CisKKworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwlVQ0hBUgkJCQlJRUVFODAyMTFkQ2xpZW50TW9kZTsKKwlVQ0hBUgkJCQlTdGFPcmlDb3VudHJ5Q29kZVszXTsKKwlVQ0hBUgkJCQlTdGFPcmlHZW9ncmFwaHk7CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworfSBTVEFfQURNSU5fQ09ORklHLCAqUFNUQV9BRE1JTl9DT05GSUc7CisKKy8vIFRoaXMgZGF0YSBzdHJ1Y3R1cmUga2VlcCB0aGUgY3VycmVudCBhY3RpdmUgQlNTL0lCU1MncyBjb25maWd1cmF0aW9uIHRoYXQgdGhpcyBTVEEKKy8vIGhhZCBhZ3JlZWQgdXBvbiBqb2luaW5nIHRoZSBuZXR3b3JrLiBXaGljaCBtZWFucyB0aGVzZSBwYXJhbWV0ZXJzIGFyZSB1c3VhbGx5IGRlY2lkZWQKKy8vIGJ5IHRoZSBCU1MvSUJTUyBjcmVhdG9yIGluc3RlYWQgb2YgdXNlciBjb25maWd1cmF0aW9uLiBEYXRhIGluIHRoaXMgZGF0YSBzdHJ1Y3R1cnJlCisvLyBpcyB2YWxpZCBvbmx5IHdoZW4gZWl0aGVyIEFESE9DX09OKHBBZCkgb3IgSU5GUkFfT04ocEFkKSBpcyBUUlVFLgorLy8gTm9ybWFsbHksIGFmdGVyIFNDQU4gb3IgZmFpbGVkIHJvYW1pbmcgYXR0ZW1wdHMsIHdlIG5lZWQgdG8gcmVjb3ZlciBiYWNrIHRvCisvLyB0aGUgY3VycmVudCBhY3RpdmUgc2V0dGluZ3MuCit0eXBlZGVmIHN0cnVjdCBfU1RBX0FDVElWRV9DT05GSUcgeworCVVTSE9SVCAgICAgIEFpZDsKKwlVU0hPUlQgICAgICBBdGltV2luOyAgICAgICAgICAgICAgICAvLyBpbiBrdXNlYzsgSUJTUyBwYXJhbWV0ZXIgc2V0IGVsZW1lbnQKKwlVU0hPUlQgICAgICBDYXBhYmlsaXR5SW5mbzsKKwlVU0hPUlQgICAgICBDZnBNYXhEdXJhdGlvbjsKKwlVU0hPUlQgICAgICBDZnBQZXJpb2Q7CisKKwkvLyBDb3B5IHN1cHBvcnRlZCByYXRlIGZyb20gZGVzaXJlZCBBUCdzIGJlYWNvbi4gV2UgYXJlIHRyeWluZyB0byBtYXRjaAorCS8vIEFQJ3Mgc3VwcG9ydGVkIGFuZCBleHRlbmRlZCByYXRlIHNldHRpbmdzLgorCVVDSEFSICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSICAgICAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSICAgICAgIFN1cFJhdGVMZW47CisJVUNIQVIgICAgICAgRXh0UmF0ZUxlbjsKKwkvLyBDb3B5IHN1cHBvcnRlZCBodCBmcm9tIGRlc2lyZWQgQVAncyBiZWFjb24uIFdlIGFyZSB0cnlpbmcgdG8gbWF0Y2gKKwlSVF9IVF9QSFlfSU5GTwkJU3VwcG9ydGVkUGh5SW5mbzsKKwlSVF9IVF9DQVBBQklMSVRZCVN1cHBvcnRlZEh0UGh5OworfSBTVEFfQUNUSVZFX0NPTkZJRywgKlBTVEFfQUNUSVZFX0NPTkZJRzsKKworI2lmZGVmIFJUMjg3MAorLy8gZm9yIFVTQiBpbnRlcmZhY2UsIGF2b2lkIGluIGludGVycnVwdCB3aGVuIHdyaXRlIGtleQordHlwZWRlZiBzdHJ1Y3QgICBSVF9BRERfUEFJUldJU0VfS0VZX0VOVFJZIHsKKyAgICAgICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgICAgICAgICBNYWNBZGRyOworICAgICAgICBVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY1RhYk1hdGNoV0NJRDsgICAgICAgIC8vIEFTSUMKKyAgICAgICAgQ0lQSEVSX0tFWSAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJLZXk7Cit9IFJUX0FERF9QQUlSV0lTRV9LRVlfRU5UUlksKlBSVF9BRERfUEFJUldJU0VfS0VZX0VOVFJZOworI2VuZGlmIC8vIFJUMjg3MCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisvLyAtLS0tLS0tLS0tLSBzdGFydCBvZiBBUCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQVVUSC1SU1AgU3RhdGUgTWFjaGluZSBBdXggZGF0YSBzdHJ1Y3R1cmUKK3R5cGVkZWYgc3RydWN0IF9BUF9NTE1FX0FVWCB7CisJVUNIQVIgICAgICAgICAgICAgICBBZGRyW01BQ19BRERSX0xFTl07CisJVVNIT1JUICAgICAgICAgICAgICBBbGc7CisJQ0hBUiAgICAgICAgICAgICAgICBDaGFsbGVuZ2VbQ0lQSEVSX1RFWFRfTEVOXTsKK30gQVBfTUxNRV9BVVgsICpQQVBfTUxNRV9BVVg7CisKKy8vIHN0cnVjdHVyZSB0byBkZWZpbmUgV1BBIEdyb3VwIEtleSBSZWtleSBJbnRlcnZhbAordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SVF84MDJfMTFfV1BBX1JFS0VZIHsKKwlVTE9ORyBSZUtleU1ldGhvZDsgICAgICAgICAgLy8gbWVjaGFuaXNtIGZvciByZWtleWluZzogMDpkaXNhYmxlLCAxOiB0aW1lLWJhc2VkLCAyOiBwYWNrZXQtYmFzZWQKKwlVTE9ORyBSZUtleUludGVydmFsOyAgICAgICAgLy8gdGltZS1iYXNlZDogc2Vjb25kcywgcGFja2V0LWJhc2VkOiBraWxvLXBhY2tldHMKK30gUlRfV1BBX1JFS0VZLCpQUlRfV1BBX1JFS0VZLCBSVF84MDJfMTFfV1BBX1JFS0VZLCAqUFJUXzgwMl8xMV9XUEFfUkVLRVk7CisKK3R5cGVkZWYgc3RydWN0IF9NQUNfVEFCTEVfRU5UUlkgeworCS8vQ2hvb3NlIDEgZnJvbSBWYWxpZEFzV0RTIGFuZCBWYWxpZEFzQ0xJICB0byB2YWxpZGl6ZS4KKwlCT09MRUFOCQlWYWxpZEFzQ0xJOwkJLy8gU3RhIG1vZGUsIHNldCB0aGlzIFRSVUUgYWZ0ZXIgTGlua3VwLHRvby4KKwlCT09MRUFOCQlWYWxpZEFzV0RTOwkvLyBUaGlzIGlzIFdEUyBFbnRyeS4gb25seSBmb3IgQVAgbW9kZS4KKwlCT09MRUFOCQlWYWxpZEFzQXBDbGk7ICAgLy9UaGlzIGlzIGEgQVAtQ2xpZW50IGVudHJ5LCBvbmx5IGZvciBBUCBtb2RlIHdoaWNoIGVuYWJsZSBBUC1DbGllbnQgZnVuY3Rpb25zLgorCUJPT0xFQU4JCVZhbGlkQXNNZXNoOworCUJPT0xFQU4JCVZhbGlkQXNEbHM7CS8vIFRoaXMgaXMgRExTIEVudHJ5LiBvbmx5IGZvciBTVEEgbW9kZS4KKwlCT09MRUFOCQlpc0NhY2hlZDsKKwlCT09MRUFOCQliSUFtQmFkQXRoZXJvczsJLy8gRmxhZyBpZiB0aGlzIGlzIEF0aGVyb3MgY2hpcCB0aGF0IGhhcyBJT1QgcHJvYmxlbS4gIFdlIG5lZWQgdG8gdHVybiBvbiBSVFMvQ1RTIHByb3RlY3Rpb24uCisKKwlVQ0hBUiAgICAgICAgIAlFbnF1ZXVlRWFwb2xTdGFydFRpbWVyUnVubmluZzsgIC8vIEVucXVldWUgRUFQb0wtU3RhcnQgZm9yIHRyaWdnZXJpbmcgRUFQIFNNCisJLy9qYW4gZm9yIHdwYQorCS8vIHJlY29yZCB3aGljaCBlbnRyeSByZXZva2UgTUlDIEZhaWx1cmUgLCBpZiBpdCBsZWF2ZXMgdGhlIEJTUyBpdHNlbGYsIEFQIHdvbid0IHVwZGF0ZSBhTUlDRmFpbFRpbWUgTUlCCisJVUNIQVIgICAgICAgICAgIENNVGltZXJSdW5uaW5nOworCVVDSEFSICAgICAgICAgICBhcGlkeDsJCQkvLyBNQlNTIG51bWJlcgorCVVDSEFSICAgICAgICAgICBSU05JRV9MZW47CisJVUNIQVIgICAgICAgICAgIFJTTl9JRVtNQVhfTEVOX09GX1JTTklFXTsKKwlVQ0hBUiAgICAgICAgICAgQU5vbmNlW0xFTl9LRVlfREVTQ19OT05DRV07CisJVUNIQVIgICAgICAgICAgIFJfQ291bnRlcltMRU5fS0VZX0RFU0NfUkVQTEFZXTsKKwlVQ0hBUiAgICAgICAgICAgUFRLWzY0XTsKKwlVQ0hBUiAgICAgICAgICAgUmVUcnlDb3VudGVyOworCVJBTElOS19USU1FUl9TVFJVQ1QgICAgICAgICAgICAgICAgIFJldHJ5VGltZXI7CisJUkFMSU5LX1RJTUVSX1NUUlVDVAkJCQkJRW5xdWV1ZVN0YXJ0Rm9yUFNLVGltZXI7CS8vIEEgdGltZXIgd2hpY2ggZW5xdWV1ZSBFQVBvTC1TdGFydCBmb3IgdHJpZ2dlcmluZyBQU0sgU00KKwlORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFICAgICBBdXRoTW9kZTsgICAvLyBUaGlzIHNob3VsZCBtYXRjaCB0byB3aGF0ZXZlciBtaWNyb3NvZnQgZGVmaW5lZAorCU5ESVNfODAyXzExX1dFUF9TVEFUVVMgICAgICAgICAgICAgIFdlcFN0YXR1czsKKwlBUF9XUEFfU1RBVEUgICAgV3BhU3RhdGU7CisJR1RLX1NUQVRFICAgICAgIEdUS1N0YXRlOworCVVTSE9SVCAgICAgICAgICBQb3J0U2VjdXJlZDsKKwlORElTXzgwMl8xMV9QUklWQUNZX0ZJTFRFUiAgUHJpdmFjeUZpbHRlcjsgICAgICAvLyBQcml2YWN5RmlsdGVyIGVudW0gZm9yIDgwMi4xWAorCUNJUEhFUl9LRVkgICAgICBQYWlyd2lzZUtleTsKKwlQVk9JRCAgICAgICAgICAgcEFkOworICAgIElOVAkJCQlQTUtJRF9DYWNoZUlkeDsKKyAgICBVQ0hBUgkJCVBNS0lEW0xFTl9QTUtJRF07CisKKworCVVDSEFSICAgICAgICAgICBBZGRyW01BQ19BRERSX0xFTl07CisJVUNIQVIgICAgICAgICAgIFBzTW9kZTsKKwlTU1QgICAgICAgICAgICAgU3N0OworCUFVVEhfU1RBVEUgICAgICBBdXRoU3RhdGU7IC8vIGZvciBTSEFSRUQgS0VZIGF1dGhlbnRpY2F0aW9uIHN0YXRlIG1hY2hpbmUgdXNlZCBvbmx5CisJQk9PTEVBTgkJCUlzUmVhc3NvY1N0YTsJLy8gSW5kaWNhdGUgd2hldGhlciB0aGlzIGlzIGEgcmVhc3NvY2lhdGlvbiBwcm9jZWR1cmUKKwlVU0hPUlQgICAgICAgICAgQWlkOworCVVTSE9SVCAgICAgICAgICBDYXBhYmlsaXR5SW5mbzsKKwlVQ0hBUiAgICAgICAgICAgTGFzdFJzc2k7CisJVUxPTkcgICAgICAgICAgIE5vRGF0YUlkbGVDb3VudDsKKwlVSU5UMTYJCQlTdGF0aW9uS2VlcEFsaXZlQ291bnQ7IC8vIHVuaXQ6IHNlY29uZAorCVVMT05HICAgICAgICAgICBQc1FJZGxlQ291bnQ7CisJUVVFVUVfSEVBREVSICAgIFBzUXVldWU7CisKKwlVSU5UMzIJCQlTdGFDb25uZWN0VGltZTsJCS8vIHRoZSBsaXZlIHRpbWUgb2YgdGhpcyBzdGF0aW9uIHNpbmNlIGFzc29jaWF0ZWQgd2l0aCBBUAorCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlCT09MRUFOCQkJYlNlbmRCQVI7CisJVVNIT1JUCQkJTm9CQURhdGFDb3VudERvd247CisKKwlVSU5UMzIgICAJCUNhY2hlZEJ1ZlsxNl07CQkvLyBVSU5UICg0IGJ5dGVzKSBmb3IgYWxpZ25tZW50CisJVUlOVAkJCVR4QkZDb3VudDsgLy8gMyozCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJVUlOVAkJCUZJRk9Db3VudDsKKwlVSU5UCQkJRGVidWdGSUZPQ291bnQ7CisJVUlOVAkJCURlYnVnVHhDb3VudDsKKyAgICBCT09MRUFOCQkJYkRsc0luaXQ7CisKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvL1dEUyBlbnRyeSBuZWVkcyB0aGVzZQorLy8gcnQyODYwIGFkZCB0aGlzLiBpZiBWYWxpZEFzV0RTPT1UUlVFLCBNYXRjaFdEU1RhYklkeCBpcyB0aGUgaW5kZXggaW4gV2RzVGFiLk1hY1RhYgorCVVJTlQJCQlNYXRjaFdEU1RhYklkeDsKKwlVQ0hBUiAgICAgICAgICAgTWF4U3VwcG9ydGVkUmF0ZTsKKwlVQ0hBUiAgICAgICAgICAgQ3VyclR4UmF0ZTsKKwlVQ0hBUiAgICAgICAgICAgQ3VyclR4UmF0ZUluZGV4OworCS8vIHRvIHJlY29yZCB0aGUgZWFjaCBUWCByYXRlJ3MgcXVhbGl0eS4gMCBpcyBiZXN0LCB0aGUgYmlnZ2VyIHRoZSB3b3JzZS4KKwlVU0hPUlQgICAgICAgICAgVHhRdWFsaXR5W01BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIXTsKKy8vCVVTSE9SVCAgICAgICAgICBPbmVTZWNUeE9rQ291bnQ7CisJVUlOVDMyCQkJT25lU2VjVHhOb1JldHJ5T2tDb3VudDsKKwlVSU5UMzIgICAgICAgICAgT25lU2VjVHhSZXRyeU9rQ291bnQ7CisJVUlOVDMyICAgICAgICAgIE9uZVNlY1R4RmFpbENvdW50OworCVVJTlQzMgkJCUNvbnRpbnVlVHhGYWlsQ250OworCVVJTlQzMiAgICAgICAgICBDdXJyVHhSYXRlU3RhYmxlVGltZTsgLy8gIyBvZiBzZWNvbmQgaW4gY3VycmVudCBUWCByYXRlCisJVUNIQVIgICAgICAgICAgIFR4UmF0ZVVwUGVuYWx0eTsgICAgICAvLyBleHRyYSAjIG9mIHNlY29uZCBwZW5hbHR5IGR1ZSB0byBsYXN0IHVuc3RhYmxlIGNvbmRpdGlvbgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJVUlOVAkJCU1hdGNoRGxzRW50cnlJZHg7IC8vIGluZGljYXRlIHRoZSBpbmRleCBpbiBwQWQtPlN0YUNmZy5ETFNFbnRyeQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisJQk9PTEVBTiAgICAgICAgIGZOb2lzeUVudmlyb25tZW50OworCUJPT0xFQU4JCQlmTGFzdFNlY0FjY29yZGluZ1JTU0k7CisJVUNIQVIgICAgICAgICAgIExhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb247IC8vIDA6IG5vIGNoYW5nZSwgMTpyYXRlIFVQLCAyOnJhdGUgZG93bgorCUNIQVIJCQlMYXN0VGltZVR4UmF0ZUNoYW5nZUFjdGlvbjsgLy9LZWVwIGxhc3QgdGltZSB2YWx1ZSBvZiBMYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uCisJVUxPTkcJCQlMYXN0VHhPa0NvdW50OworCVVDSEFSICAgICAgICAgICBQRVJbTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0hdOworCisJLy8gYSBiaXRtYXAgb2YgQk9PTEVBTiBmbGFncy4gZWFjaCBiaXQgcmVwcmVzZW50IGFuIG9wZXJhdGlvbiBzdGF0dXMgb2YgYSBwYXJ0aWN1bGFyCisJLy8gQk9PTEVBTiBjb250cm9sLCBlaXRoZXIgT04gb3IgT0ZGLiBUaGVzZSBmbGFncyBzaG91bGQgYWx3YXlzIGJlIGFjY2Vzc2VkIHZpYQorCS8vIENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKCksIENMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoKSwgQ0xJRU5UX1NUQVRVU19DTEVBUl9GTEFHKCkgbWFjcm9zLgorCS8vIHNlZSBmT1BfU1RBVFVTX3h4eCBpbiBSVE1QX0RFRi5DIGZvciBkZXRhaWwgYml0IGRlZmluaXRpb24uIGZDTElFTlRfU1RBVFVTX0FNU0RVX0lOVVNFRAorCVVMT05HICAgICAgICAgICBDbGllbnRTdGF0dXNGbGFnczsKKworCS8vIFRPRE86IFNoYWxsIHdlIG1vdmUgdGhhdCB0byBET1QxMV9OX1NVUFBPUlQ/Pz8KKwlIVFRSQU5TTUlUX1NFVFRJTkcJSFRQaHlNb2RlLCBNYXhIVFBoeU1vZGUsIE1pbkhUUGh5TW9kZTsvLyBGb3IgdHJhbnNtaXQgcGh5IHNldHRpbmcgaW4gVFhXSS4KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCS8vIEhUIEVXQyBNSU1PLU4gdXNlZCBwYXJhbWV0ZXJzCisJVVNIT1JUCQlSWEJBYml0bWFwOwkvLyBmaWxsIHRvIG9uLWNoaXAgIFJYV0lfQkFfQklUTUFTSyBpbiA4LjEuM1JYIGF0dHJpYnV0ZSBlbnRyeSBmb3JtYXQKKwlVU0hPUlQJCVRYQkFiaXRtYXA7CS8vIFRoaXMgYml0bWFwIGFzIG9yaWdpbmF0b3IsIG9ubHkga2VlcCBpbiBzb2Z0d2FyZSB1c2VkIHRvIG1hcmsgQU1QRFUgYml0IGluIFRYV0kKKwlVU0hPUlQJCVRYQXV0b0JBYml0bWFwOworCVVTSE9SVAkJQkFEZWNsaW5lQml0bWFwOworCVVTSE9SVAkJQkFSZWNXY2lkQXJyYXlbTlVNX09GX1RJRF07CS8vIFRoZSBtYXBwaW5nIHdjaWQgb2YgcmVjaXBpZW50IHNlc3Npb24uIGlmIFJYQkFiaXRtYXAgYml0IGlzIG1hc2tlZAorCVVTSE9SVAkJQkFPcmlXY2lkQXJyYXlbTlVNX09GX1RJRF07IC8vIFRoZSBtYXBwaW5nIHdjaWQgb2Ygb3JpZ2luYXRvciBzZXNzaW9uLiBpZiBUWEJBYml0bWFwIGJpdCBpcyBtYXNrZWQKKwlVU0hPUlQJCUJBT3JpU2VxdWVuY2VbTlVNX09GX1RJRF07IC8vIFRoZSBtYXBwaW5nIHdjaWQgb2Ygb3JpZ2luYXRvciBzZXNzaW9uLiBpZiBUWEJBYml0bWFwIGJpdCBpcyBtYXNrZWQKKworCS8vIDgwMi4xMW4gZmVhdHVyZXMuCisJVUNIQVIJCU1wZHVEZW5zaXR5OworCVVDSEFSCQlNYXhSQW1wZHVGYWN0b3I7CisJVUNIQVIJCUFNc2R1U2l6ZTsKKwlVQ0hBUgkJTW1wc01vZGU7CS8vIE1JTU8gcG93ZXIgc2F2ZSBtb3JlLgorCisJSFRfQ0FQQUJJTElUWV9JRQkJSFRDYXBhYmlsaXR5OworCisjaWZkZWYgRE9UMTFOX0RSQUZUMworCVVDSEFSCQlCU1MyMDQwQ29leGlzdGVuY2VNZ210U3VwcG9ydDsKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlCT09MRUFOCQliQXV0b1R4UmF0ZVN3aXRjaDsKKworCVVDSEFSICAgICAgIFJhdGVMZW47CisJc3RydWN0IF9NQUNfVEFCTEVfRU5UUlkgKnBOZXh0OworICAgIFVTSE9SVCAgICAgIFR4U2VxW05VTV9PRl9USURdOworCVVTSE9SVAkJTm9uUW9zRGF0YVNlcTsKKworCVJTU0lfU0FNUExFCVJzc2lTYW1wbGU7CisKKwlVSU5UMzIJCQlUWE1DU0V4cGVjdGVkWzE2XTsKKwlVSU5UMzIJCQlUWE1DU1N1Y2Nlc3NmdWxbMTZdOworCVVJTlQzMgkJCVRYTUNTRmFpbGVkWzE2XTsKKwlVSU5UMzIJCQlUWE1DU0F1dG9GYWxsQmFja1sxNl1bMTZdOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJVUxPTkcgICAJCUxhc3RCZWFjb25SeFRpbWU7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCit9IE1BQ19UQUJMRV9FTlRSWSwgKlBNQUNfVEFCTEVfRU5UUlk7CisKK3R5cGVkZWYgc3RydWN0IF9NQUNfVEFCTEUgeworCVVTSE9SVAkJCVNpemU7CisJTUFDX1RBQkxFX0VOVFJZICpIYXNoW0hBU0hfVEFCTEVfU0laRV07CisJTUFDX1RBQkxFX0VOVFJZIENvbnRlbnRbTUFYX0xFTl9PRl9NQUNfVEFCTEVdOworCVFVRVVFX0hFQURFUiAgICBNY2FzdFBzUXVldWU7CisJVUxPTkcgICAgICAgICAgIFBzUUlkbGVDb3VudDsKKwlCT09MRUFOICAgICAgICAgZkFueVN0YXRpb25JblBzbTsKKwlCT09MRUFOICAgICAgICAgZkFueVN0YXRpb25CYWRBdGhlcm9zOwkvLyBDaGVjayBpZiBhbnkgU3RhdGlvbiBpcyBhdGhlcm9zIDgwMi4xMW4gQ2hpcC4gIFdlIG5lZWQgdG8gdXNlIFJUUy9DVFMgd2l0aCBBdGhlcm9zIDgwMiwuMTFuIGNoaXAuCisJQk9PTEVBTgkJCWZBbnlUeE9QRm9yY2VEaXNhYmxlOwkvLyBDaGVjayBpZiBpdCBpcyBuZWNlc3NhcnkgdG8gZGlzYWJsZSBCRSBUeE9QCisJQk9PTEVBTgkJCWZBbGxTdGF0aW9uQXNSYWxpbms7IAkvLyBDaGVjayBpZiBhbGwgc3RhdGlvbnMgYXJlIHJhbGluay1jaGlwc2V0CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJQk9PTEVBTiAgICAgICAgIGZBbnlTdGF0aW9uSXNMZWdhY3k7CS8vIENoZWNrIGlmIEkgdXNlIGxlZ2FjeSByYXRlIHRvIHRyYW5zbWl0IHRvIG15IEJTUyBTdGF0aW9uLworCUJPT0xFQU4gICAgICAgICBmQW55U3RhdGlvbk5vbkdGOwkJLy8gQ2hlY2sgaWYgYW55IFN0YXRpb24gY2FuJ3Qgc3VwcG9ydCBHRi4KKwlCT09MRUFOICAgICAgICAgZkFueVN0YXRpb24yME9ubHk7CQkvLyBDaGVjayBpZiBhbnkgU3RhdGlvbiBjYW4ndCBzdXBwb3J0IEdGLgorCUJPT0xFQU4JCQlmQW55U3RhdGlvbk1JTU9QU0R5bmFtaWM7IC8vIENoZWNrIGlmIGFueSBTdGF0aW9uIGlzIE1JTU8gRHluYW1pYworCUJPT0xFQU4gICAgICAgICBmQW55QkFTZXNzaW9uOyAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIEJBIHNlc3Npb24uICBGb3JjZSB0dXJuIG9uIFJUUy9DVFMKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KK30gTUFDX1RBQkxFLCAqUE1BQ19UQUJMRTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorI2RlZmluZSBJU19IVF9TVEEoX3BNYWNFbnRyeSkJXAorCShfcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYKQorCisjZGVmaW5lIElTX0hUX1JBVEUoX3BNYWNFbnRyeSkJXAorCShfcE1hY0VudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYKQorCisjZGVmaW5lIFBFRVJfSVNfSFRfUkFURShfcE1hY0VudHJ5KQlcCisJKF9wTWFjRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID49IE1PREVfSFRNSVgpCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK3R5cGVkZWYgc3RydWN0IF9XRFNfRU5UUlkgeworCUJPT0xFQU4gICAgICAgICBWYWxpZDsKKwlVQ0hBUiAgICAgICAgICAgQWRkcltNQUNfQUREUl9MRU5dOworCVVMT05HICAgICAgICAgICBOb0RhdGFJZGxlQ291bnQ7CisJc3RydWN0IF9XRFNfRU5UUlkgKnBOZXh0OworfSBXRFNfRU5UUlksICpQV0RTX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCAgX1dEU19UQUJMRV9FTlRSWSB7CisJVVNIT1JUCQkJU2l6ZTsKKwlVQ0hBUiAgICAgICAgICAgV2RzQWRkcltNQUNfQUREUl9MRU5dOworCVdEU19FTlRSWSAgICAgICAqSGFzaFtIQVNIX1RBQkxFX1NJWkVdOworCVdEU19FTlRSWSAgICAgICBDb250ZW50W01BWF9MRU5fT0ZfTUFDX1RBQkxFXTsKKwlVQ0hBUiAgICAgICAgICAgTWF4U3VwcG9ydGVkUmF0ZTsKKwlVQ0hBUiAgICAgICAgICAgQ3VyclR4UmF0ZTsKKwlVU0hPUlQgICAgICAgICAgVHhRdWFsaXR5W01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwlVU0hPUlQgICAgICAgICAgT25lU2VjVHhPa0NvdW50OworCVVTSE9SVCAgICAgICAgICBPbmVTZWNUeFJldHJ5T2tDb3VudDsKKwlVU0hPUlQgICAgICAgICAgT25lU2VjVHhGYWlsQ291bnQ7CisJVUxPTkcgICAgICAgICAgIEN1cnJUeFJhdGVTdGFibGVUaW1lOyAvLyAjIG9mIHNlY29uZCBpbiBjdXJyZW50IFRYIHJhdGUKKwlVQ0hBUiAgICAgICAgICAgVHhSYXRlVXBQZW5hbHR5OyAgICAgIC8vIGV4dHJhICMgb2Ygc2Vjb25kIHBlbmFsdHkgZHVlIHRvIGxhc3QgdW5zdGFibGUgY29uZGl0aW9uCit9IFdEU19UQUJMRV9FTlRSWSwgKlBXRFNfVEFCTEVfRU5UUlk7CisKK3R5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfV0RTX0VOVFJZIHsKKwlQTkVUX0RFVgkJCWRldjsKKwlVQ0hBUgkJCQlWYWxpZDsKKwlVQ0hBUgkJCQlQaHlNb2RlOworCVVDSEFSCQkJCVBlZXJXZHNBZGRyW01BQ19BRERSX0xFTl07CisJVUNIQVIJCQkJTWFjVGFiTWF0Y2hXQ0lEOwkvLyBBU0lDCisJTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgV2VwU3RhdHVzOworCVVDSEFSCQkJCQlLZXlJZHg7CisJQ0lQSEVSX0tFWSAgICAgICAgICAJV2RzS2V5OworCUhUVFJBTlNNSVRfU0VUVElORwkJCQlIVFBoeU1vZGUsIE1heEhUUGh5TW9kZSwgTWluSFRQaHlNb2RlOworCVJUX0hUX1BIWV9JTkZPCQkJCQlEZXNpcmVkSHRQaHlJbmZvOworCUJPT0xFQU4JCQkJCQkJYkF1dG9UeFJhdGVTd2l0Y2g7CisJREVTSVJFRF9UUkFOU01JVF9TRVRUSU5HICAgICAgIAlEZXNpcmVkVHJhbnNtaXRTZXR0aW5nOyAvLyBEZXNpcmVkIHRyYW5zbWl0IHNldHRpbmcuCit9IFJUXzgwMl8xMV9XRFNfRU5UUlksICpQUlRfODAyXzExX1dEU19FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgX1dEU19UQUJMRSB7CisJVUNIQVIgICAgICAgICAgICAgICBNb2RlOworCVVMT05HICAgICAgICAgICAgICAgU2l6ZTsKKwlSVF84MDJfMTFfV0RTX0VOVFJZCVdkc0VudHJ5W01BWF9XRFNfRU5UUlldOworfSBXRFNfVEFCTEUsICpQV0RTX1RBQkxFOworCit0eXBlZGVmIHN0cnVjdCBfQVBDTElfU1RSVUNUIHsKKwlQTkVUX0RFVgkJCQlkZXY7CisjaWZkZWYgUlRMODY1WF9TT0MKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICBteWxpbmtpZDsKKyNlbmRpZgorCUJPT0xFQU4gICAgICAgICAgICAgICAgIEVuYWJsZTsJLy8gU2V0IGl0IGFzIDEgaWYgdGhlIGFwY2xpIGludGVyZmFjZSB3YXMgY29uZmlndXJlZCB0byAiMSIgIG9yIGJ5IGl3cHJpdiBjbWQgIkFwQ2xpRW5hYmxlIgorCUJPT0xFQU4gICAgICAgICAgICAgICAgIFZhbGlkOwkvLyBTZXQgaXQgYXMgMSBpZiB0aGUgYXBjbGkgaW50ZXJmYWNlIGFzc29jaWF0ZWQgc3VjY2VzcyB0byByZW1vdGUgQVAuCisJVUNIQVIJCQkJCU1hY1RhYldDSUQ7CS8vV0NJRCB2YWx1ZSwgd2hpY2ggcG9pbnQgdG8gdGhlIGVudHJ5IG9mIEFTSUMgTWFjIHRhYmxlLgorCVVDSEFSICAgICAgICAgICAgICAgICAgIFNzaWRMZW47CisJQ0hBUiAgICAgICAgICAgICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOworCisJVUNIQVIgICAgICAgICAgICAgICAgICAgQ2ZnU3NpZExlbjsKKwlDSEFSICAgICAgICAgICAgICAgICAgICBDZmdTc2lkW01BWF9MRU5fT0ZfU1NJRF07CisJVUNIQVIgICAgICAgICAgICAgICAgICAgQ2ZnQXBDbGlCc3NpZFtFVEhfTEVOR1RIX09GX0FERFJFU1NdOworCVVDSEFSICAgICAgICAgICAgICAgICAgIEN1cnJlbnRBZGRyZXNzW0VUSF9MRU5HVEhfT0ZfQUREUkVTU107CisKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBBcENsaVJjdkJlYWNvblRpbWU7CisKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBDdHJsQ3VyclN0YXRlOworCVVMT05HICAgICAgICAgICAgICAgICAgIFN5bmNDdXJyU3RhdGU7CisJVUxPTkcgICAgICAgICAgICAgICAgICAgQXV0aEN1cnJTdGF0ZTsKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBBc3NvY0N1cnJTdGF0ZTsKKwlVTE9ORwkJCQkJV3BhUHNrQ3VyclN0YXRlOworCisJVVNIT1JUICAgICAgICAgICAgICAgICAgQXV0aFJlcUNudDsKKwlVU0hPUlQgICAgICAgICAgICAgICAgICBBc3NvY1JlcUNudDsKKworCVVMT05HICAgICAgICAgICAgICAgICAgIENsaWVudFN0YXR1c0ZsYWdzOworCVVDSEFSICAgICAgICAgICAgICAgICAgIE1wZHVEZW5zaXR5OworCisJTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSAgICAgQXV0aE1vZGU7ICAgLy8gVGhpcyBzaG91bGQgbWF0Y2ggdG8gd2hhdGV2ZXIgbWljcm9zb2Z0IGRlZmluZWQKKwlORElTXzgwMl8xMV9XRVBfU1RBVFVTICAgICAgICAgICAgICBXZXBTdGF0dXM7CisKKwkvLyBBZGQgdG8gc3VwcG9ydCBkaWZmZXJlbnQgY2lwaGVyIHN1aXRlIGZvciBXUEEyL1dQQSBtb2RlCisJTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJCUdyb3VwQ2lwaGVyOwkJLy8gTXVsdGljYXN0IGNpcGhlciBzdWl0ZQorCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCQlQYWlyQ2lwaGVyOwkJCS8vIFVuaWNhc3QgY2lwaGVyIHN1aXRlCisJQk9PTEVBTgkJCQkJCQkJYk1peENpcGhlcjsJCQkvLyBJbmRpY2F0ZSBjdXJyZW50IFBhaXIgJiBHcm91cCB1c2UgZGlmZmVyZW50IGNpcGhlciBzdWl0ZXMKKwlVU0hPUlQJCQkJCQkJCVJzbkNhcGFiaWxpdHk7CisKKwlVQ0hBUgkJUFNLWzEwMF07CQkJCS8vIHJlc2VydmUgUFNLIGtleSBtYXRlcmlhbAorCVVDSEFSICAgICAgIFBTS0xlbjsKKwlVQ0hBUiAgICAgICBQTUtbMzJdOyAgICAgICAgICAgICAgICAvLyBXUEEgUFNLIG1vZGUgUE1LCisJLy9VQ0hBUiAgICAgICBQVEtbNjRdOyAgICAgICAgICAgICAgICAvLyBXUEEgUFNLIG1vZGUgUFRLCisJVUNIQVIJCUdUS1szMl07CQkJCS8vIEdUSyBmcm9tIGF1dGhlbnRpY2F0b3IKKworCS8vQ0lQSEVSX0tFWQkJUGFpcndpc2VLZXk7CisJQ0lQSEVSX0tFWSAgICAgIFNoYXJlZEtleVtTSEFSRV9LRVlfTlVNXTsKKwlVQ0hBUiAgICAgICAgICAgRGVmYXVsdEtleUlkOworCisJLy8gV1BBIDgwMi4xeCBwb3J0IGNvbnRyb2wsIFdQQV84MDJfMVhfUE9SVF9TRUNVUkVELCBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQKKwkvL1VDSEFSICAgICAgIFBvcnRTZWN1cmVkOworCisJLy8gc3RvcmUgUlNOX0lFIGJ1aWx0IGJ5IGRyaXZlcgorCVVDSEFSCQlSU05fSUVbTUFYX0xFTl9PRl9SU05JRV07ICAvLyBUaGUgY29udGVudCBzYXZlZCBoZXJlIHNob3VsZCBiZSBjb252ZXJ0IHRvIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgorCVVDSEFSCQlSU05JRV9MZW47CisKKwkvLyBGb3IgV1BBIGNvdW50ZXJtZWFzdXJlcworCVVMT05HICAgICAgIExhc3RNaWNFcnJvclRpbWU7ICAgLy8gcmVjb3JkIGxhc3QgTUlDIGVycm9yIHRpbWUKKwkvL1VMT05HICAgICAgIE1pY0VyckNudDsgICAgICAgICAgLy8gU2hvdWxkIGJlIDAsIDEsIDIsIHRoZW4gcmVzZXQgdG8gemVybyAoYWZ0ZXIgZGlzYXNzb2ljaWF0aW9uKS4KKwlCT09MRUFOICAgICAgICAgICAgICAgICBiQmxvY2tBc3NvYzsgLy8gQmxvY2sgYXNzb2NpYXRlIGF0dGVtcHQgZm9yIDYwIHNlY29uZHMgYWZ0ZXIgY291bnRlciBtZWFzdXJlIG9jY3VycmVkLgorCisJLy8gRm9yIFdQQS1QU0sgc3VwcGxpY2FudCBzdGF0ZQorCS8vV1BBX1NUQVRFICAgCVdwYVN0YXRlOyAgICAgICAgICAgLy8gRGVmYXVsdCBpcyBTU19OT1RVU0UKKwkvL1VDSEFSICAgICAgIAlSZXBsYXlDb3VudGVyWzhdOworCS8vVUNIQVIgICAgICAgCUFOb25jZVszMl07ICAgICAgICAgLy8gQU5vbmNlIGZvciBXUEEtUFNLIGZyb20gYXV0aGVudGljYXRvcgorCVVDSEFSICAgICAgIAlTTm9uY2VbMzJdOyAgICAgICAgIC8vIFNOb25jZSBmb3IgV1BBLVBTSworCVVDSEFSCQkJR05vbmNlWzMyXTsJCQkvLyBHTm9uY2UgZm9yIFdQQS1QU0sgZnJvbSBhdXRoZW50aWNhdG9yCisKKwlIVFRSQU5TTUlUX1NFVFRJTkcJCQkJSFRQaHlNb2RlLCBNYXhIVFBoeU1vZGUsIE1pbkhUUGh5TW9kZTsKKwlSVF9IVF9QSFlfSU5GTwkJCQkJRGVzaXJlZEh0UGh5SW5mbzsKKwlCT09MRUFOCQkJCQkJCWJBdXRvVHhSYXRlU3dpdGNoOworCURFU0lSRURfVFJBTlNNSVRfU0VUVElORyAgICAgICAJRGVzaXJlZFRyYW5zbWl0U2V0dGluZzsgLy8gRGVzaXJlZCB0cmFuc21pdCBzZXR0aW5nLgorfSBBUENMSV9TVFJVQ1QsICpQQVBDTElfU1RSVUNUOworCisvLyAtLS0tLS0tLS0tLSBlbmQgb2YgQVAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgQkxPQ0tfTkVUX0lGCit0eXBlZGVmIHN0cnVjdCBfQkxPQ0tfUVVFVUVfRU5UUlkKK3sKKwlCT09MRUFOIFN3VHhRdWV1ZUJsb2NrRmxhZzsKKwlMSVNUX0hFQURFUiBOZXRJZkxpc3Q7Cit9IEJMT0NLX1FVRVVFX0VOVFJZLCAqUEJMT0NLX1FVRVVFX0VOVFJZOworI2VuZGlmIC8vIEJMT0NLX05FVF9JRiAvLworCitzdHJ1Y3Qgd2lmaWNvbmYKK3sKKwlCT09MRUFOCWJTaG9ydEdJOworCUJPT0xFQU4gYkdyZWVuRmllbGQ7Cit9OworCisKKwordHlwZWRlZiBzdHJ1Y3QgX0lORl9QQ0lfQ09ORklHCit7CisJUFVDSEFSICAgICAgICAgICAgICAgICAgQ1NSQmFzZUFkZHJlc3M7ICAgICAvLyBQQ0kgTU1JTyBCYXNlIEFkZHJlc3MsIGFsbCBhY2Nlc3Mgd2lsbCB1c2UKK31JTkZfUENJX0NPTkZJRzsKKwordHlwZWRlZiBzdHJ1Y3QgX0lORl9VU0JfQ09ORklHCit7CisJVUlOVCAgICAgICAgICAgICAgICBCdWxrSW5FcEFkZHI7CQkvLyBidWxrLWluIGVuZHBvaW50IGFkZHJlc3MKKwlVSU5UICAgICAgICAgICAgICAgIEJ1bGtPdXRFcEFkZHJbNl07CS8vIGJ1bGstb3V0IGVuZHBvaW50IGFkZHJlc3MKKworfUlORl9VU0JfQ09ORklHOworCisjaWZkZWYgSUtBTk9TX1ZYXzFYMAorCXR5cGVkZWYgdm9pZCAoKklrYW5vc1dsYW5UeENiRnVuY1ApKHZvaWQgKiwgdm9pZCAqKTsKKworCXN0cnVjdCBJS0FOT1NfVFhfSU5GTworCXsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwkJSWthbm9zV2xhblR4Q2JGdW5jUCAqZnA7CisJfTsKKyNlbmRpZiAvLyBJS0FOT1NfVlhfMVgwIC8vCisKKyNpZmRlZiBOSU5URU5ET19BUAordHlwZWRlZiBzdHJ1Y3QgX05JTkRPX0NUUkxfQkxPQ0sgeworCisJUlRfTklOVEVORE9fVEFCTEUJRFNfVEFCTEU7CisKKyNpZmRlZiBDSElQMjVYWAorCXNwaW5sb2NrX3QJCQlOSU5URU5ET19UQUJMRV9Mb2NrOworI2Vsc2UKKwlORElTX1NQSU5fTE9DSwkJTklOVEVORE9fVEFCTEVfTG9jazsKKyNlbmRpZiAvLyBDSElQMjVYWCAvLworCisJVUNIQVIJCQkJTklOVEVORE9fVVBfQlVGRkVSWzUxMl07CisJVUNIQVIJCQkJTG9jYWxfS2V5SWR4OworCUNJUEhFUl9LRVkJCQlMb2NhbF9TaGFyZWRLZXk7CisJVUNIQVIJCQkJTG9jYWxfYkhpZGVTc2lkOworCVVDSEFSCQkJCUxvY2FsX0F1dGhNb2RlOworCVVDSEFSCQkJCUxvY2FsX1dlcFN0YXR1czsKKwlVU0hPUlQJCQkJTG9jYWxfQ2FwYWJpbGl0eUluZm87Cit9IE5JTkRPX0NUUkxfQkxPQ0s7CisjZW5kaWYgLy8gTklOVEVORE9fQVAgLy8KKworCisjaWZkZWYgREJHX0RJQUdOT1NFCisjZGVmaW5lIERJQUdOT1NFX1RJTUUJMTAgICAvLyAxMCBzZWMKK3R5cGVkZWYgc3RydWN0IF9SdG1wRGlhZ1N0cmN1dF8KK3sJLy8gRGlhZ25vc2lzIFJlbGF0ZWQgZWxlbWVudAorCXVuc2lnbmVkIGNoYXIJCWluaXRlZDsKKwl1bnNpZ25lZCBjaGFyIAlxSWR4OworCXVuc2lnbmVkIGNoYXIgCUFycmF5U3RhcnRJZHg7CisJdW5zaWduZWQgY2hhcgkJQXJyYXlDdXJJZHg7CisJLy8gVHggUmVsYXRlZCBDb3VudAorCVVTSE9SVAkJCVR4RGF0YUNudFtESUFHTk9TRV9USU1FXTsKKwlVU0hPUlQJCQlUeEZhaWxDbnRbRElBR05PU0VfVElNRV07CisvLwlVU0hPUlQJCQlUeERlc2NDbnRbRElBR05PU0VfVElNRV1bMTZdOwkJLy8gVHhEZXNjIHF1ZXVlIGxlbmd0aCBpbiBzY2FsZSBvZiAwfjE0LCA+PTE1CisJVVNIT1JUCQkJVHhEZXNjQ250W0RJQUdOT1NFX1RJTUVdWzI0XTsgLy8gMyozCS8vIFR4RGVzYyBxdWV1ZSBsZW5ndGggaW4gc2NhbGUgb2YgMH4xNCwgPj0xNQorLy8JVVNIT1JUCQkJVHhNY3NDbnRbRElBR05PU0VfVElNRV1bMTZdOwkJCS8vIFR4RGF0ZSBNQ1MgQ291bnQgaW4gcmFuZ2UgZnJvbSAwIHRvIDE1LCBzdGVwIGluIDEuCisJVVNIT1JUCQkJVHhNY3NDbnRbRElBR05PU0VfVElNRV1bMjRdOyAvLyAzKjMKKwlVU0hPUlQJCQlUeFNXUXVlQ250W0RJQUdOT1NFX1RJTUVdWzldOwkJLy8gVHhTd1F1ZXVlIGxlbmd0aCBpbiBzY2FsZSBvZiAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA+PTgKKworCVVTSE9SVAkJCVR4QWdnQ250W0RJQUdOT1NFX1RJTUVdOworCVVTSE9SVAkJCVR4Tm9uQWdnQ250W0RJQUdOT1NFX1RJTUVdOworLy8JVVNIT1JUCQkJVHhBTVBEVUNudFtESUFHTk9TRV9USU1FXVsxNl07CQkvLyAxMCBzZWMsIFR4RE1BIEFQTURVIEFnZ3JlZ2F0aW9uIGNvdW50IGluIHJhbmdlIGZyb20gMCB0byAxNSwgaW4gc2V0cCBvZiAxLgorCVVTSE9SVAkJCVR4QU1QRFVDbnRbRElBR05PU0VfVElNRV1bMjRdOyAvLyAzKjMgLy8gMTAgc2VjLCBUeERNQSBBUE1EVSBBZ2dyZWdhdGlvbiBjb3VudCBpbiByYW5nZSBmcm9tIDAgdG8gMTUsIGluIHNldHAgb2YgMS4KKwlVU0hPUlQJCQlUeFJhbGlua0NudFtESUFHTk9TRV9USU1FXTsJCQkvLyBUeFJhbGluayBBZ2dyZWdhdGlvbiBDb3VudCBpbiAxIHNlYyBzY2FsZS4KKwlVU0hPUlQJCQlUeEFNU0RVQ250W0RJQUdOT1NFX1RJTUVdOwkJCS8vIFR4QU1TVUQgQWdncmVnYXRpb24gQ291bnQgaW4gMSBzZWMgc2NhbGUuCisKKwkvLyBSeCBSZWxhdGVkIENvdW50CisJVVNIT1JUCQkJUnhEYXRhQ250W0RJQUdOT1NFX1RJTUVdOwkJCS8vIFJ4IFRvdGFsIERhdGEgY291bnQuCisJVVNIT1JUCQkJUnhDcmNFcnJDbnRbRElBR05PU0VfVElNRV07CisvLwlVU0hPUlQJCQlSeE1jc0NudFtESUFHTk9TRV9USU1FXVsxNl07CQkvLyBSeCBNQ1MgQ291bnQgaW4gcmFuZ2UgZnJvbSAwIHRvIDE1LCBzdGVwIGluIDEuCisJVVNIT1JUCQkJUnhNY3NDbnRbRElBR05PU0VfVElNRV1bMjRdOyAvLyAzKjMKK31SdG1wRGlhZ1N0cnVjdDsKKyNlbmRpZiAvLyBEQkdfRElBR05PU0UgLy8KKworCisvLworLy8gIFRoZSBtaW5pcG9ydCBhZGFwdGVyIHN0cnVjdHVyZQorLy8KK3R5cGVkZWYgc3RydWN0IF9SVE1QX0FEQVBURVIKK3sKKwlQVk9JRAkJCQkJT1NfQ29va2llOwkvLyBzYXZlIHNwZWNpZmljIHN0cnVjdHVyZSByZWxhdGl2ZSB0byBPUworCVBORVRfREVWCQkJCW5ldF9kZXY7CisJVUxPTkcJCQkJCVZpcnR1YWxJZkNudDsKKworCisKKwlORElTX1NQSU5fTE9DSyAgICAgICAgICBpcnFfbG9jazsKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBpcnFfZGlzYWJsZWQ7CisKKyNpZmRlZiBSVDI4NzAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgVVNCIHJlbGF0ZWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlzdHJ1Y3QgdXNiX2NvbmZpZ19kZXNjcmlwdG9yCQkqY29uZmlnOworCVVJTlQJCQkJCQkJCUJ1bGtJbkVwQWRkcjsJCS8vIGJ1bGstaW4gZW5kcG9pbnQgYWRkcmVzcworCVVJTlQJCQkJCQkJCUJ1bGtPdXRFcEFkZHJbNl07CS8vIGJ1bGstb3V0IGVuZHBvaW50IGFkZHJlc3MKKworCVVJTlQJCQkJCQkJCU51bWJlck9mUGlwZXM7CisJVVNIT1JUCQkJCQkJCQlCdWxrT3V0TWF4UGFja2V0U2l6ZTsKKwlVU0hPUlQJCQkJCQkJCUJ1bGtJbk1heFBhY2tldFNpemU7CisKKwkvLz09PT09PUNvbnRyb2wgRmxhZ3MKKwlMT05HICAgICAgICAgICAgICAgICAgICAJUGVuZGluZ0lvQ291bnQ7CisJVUxPTkcJCQkJCQlCdWxrRmxhZ3M7CisJQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgIGJVc2JUeEJ1bGtBZ2dyZTsJLy8gRmxhZ3MgZm9yIGJ1bGsgb3V0IGRhdGEgcHJpb3JpdHkKKworCisJLy89PT09PT1UaW1lciBUaHJlYWQKKwlSVDI4NzBfVElNRVJfUVVFVUUJCVRpbWVyUTsKKwlORElTX1NQSU5fTE9DSwkJCVRpbWVyUUxvY2s7CisKKworCS8vPT09PT09Q21kIFRocmVhZAorCUNtZFEJCQkJCUNtZFE7CisJTkRJU19TUElOX0xPQ0sJCQlDbWRRTG9jazsJCQkJLy8gQ21kUUxvY2sgc3BpbmxvY2sKKworCUJPT0xFQU4JCQkJCVRpbWVyRnVuY19raWxsOworCUJPT0xFQU4JCQkJCW1sbWVfa2lsbDsKKworCisJLy89PT09PT1TZW1hcGhvcmVzIChldmVudCkKKwlzdHJ1Y3Qgc2VtYXBob3JlCQkJbWxtZV9zZW1hcGhvcmU7CQkJLyogdG8gc2xlZXAgdGhyZWFkIG9uCSovCisJc3RydWN0IHNlbWFwaG9yZQkJCVJUVVNCQ21kX3NlbWFwaG9yZTsJCS8qIHRvIHNsZWVwIHRocmVhZCBvbgkqLworCXN0cnVjdCBzZW1hcGhvcmUJCQlSVFVTQlRpbWVyX3NlbWFwaG9yZTsKKyNpZmRlZiBJTkZfQU1BWk9OX1NFCisJc3RydWN0IHNlbWFwaG9yZQkJCVVzYlZlbmRvclJlcV9zZW1hcGhvcmU7CisJUFZPSUQJCQkJCQlVc2JWZW5kb3JSZXFCdWY7CisjZW5kaWYgLy8gSU5GX0FNQVpPTl9TRSAvLworCXN0cnVjdCBjb21wbGV0aW9uCQkJVGltZXJRQ29tcGxldGU7CisJc3RydWN0IGNvbXBsZXRpb24JCQltbG1lQ29tcGxldGU7CisJc3RydWN0IGNvbXBsZXRpb24JCQlDbWRRQ29tcGxldGU7CisJd2FpdF9xdWV1ZV9oZWFkX3QJCQkqd2FpdDsKKworCS8vPT09PT09TG9jayBmb3IgMjg3MCBBVEUKKyNpZmRlZiBSQUxJTktfQVRFCisJTkRJU19TUElOX0xPQ0sJCQlHZW5lcmljTG9jazsJCS8vIEFURSBUeC9SeCBnZW5lcmljIHNwaW5sb2NrCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisjZW5kaWYgLy8gUlQyODcwIC8vCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCS8qICAgICAgQm90aCBQQ0kvVVNCIHJlbGF0ZWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgIFR4IHJlbGF0ZWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlCT09MRUFOICAgICAgICAgICAgICAgICBEZVF1ZXVlUnVubmluZ1tOVU1fT0ZfVFhfUklOR107ICAvLyBmb3IgZW5zdXJpbmcgUlRVU0JEZVF1ZXVlUGFja2V0IGdldCBjYWxsIG9uY2UKKwlORElTX1NQSU5fTE9DSyAgICAgICAgICBEZVF1ZXVlTG9ja1tOVU1fT0ZfVFhfUklOR107CisKKyNpZmRlZiBSVDI4NzAKKwkvLyBEYXRhIHJlbGF0ZWQgY29udGV4dCBhbmQgQUMgc3BlY2lmaWVkLCA0IEFDIHN1cHBvcnRlZAorCU5ESVNfU1BJTl9MT0NLCQkJQnVsa091dExvY2tbNl07CQkJLy8gQnVsa091dCBzcGlubG9jayBmb3IgNCBBQ3MKKwlORElTX1NQSU5fTE9DSwkJCU1MTUVCdWxrT3V0TG9jazsJLy8gTUxNRSBCdWxrT3V0IGxvY2sKKworCUhUX1RYX0NPTlRFWFQJCQlUeENvbnRleHRbTlVNX09GX1RYX1JJTkddOworCU5ESVNfU1BJTl9MT0NLCQkJVHhDb250ZXh0UXVldWVMb2NrW05VTV9PRl9UWF9SSU5HXTsJCS8vIFR4Q29udGV4dFF1ZXVlIHNwaW5sb2NrCisKKwkvLyA0IHNldHMgb2YgQnVsayBPdXQgaW5kZXggYW5kIHBlbmRpbmcgZmxhZworCVVDSEFSCQkJCQlOZXh0QnVsa091dEluZGV4WzRdOwkvLyBvbmx5IHVzZWQgZm9yIDQgRURDQSBidWxrb3V0IHBpcGUKKworCUJPT0xFQU4JCQkJCUJ1bGtPdXRQZW5kaW5nWzZdOwkvLyB1c2VkIGZvciB0b3RhbCA2IGJ1bGtvdXQgcGlwZQorCVVDSEFSCQkJCQlidWxrUmVzZXRQaXBlaWQ7CisJQk9PTEVBTgkJCQkJTWdtdEJ1bGtQZW5kaW5nOworCVVMT05HCQkJCQlidWxrUmVzZXRSZXFbNl07CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwkvLyByZXNvdXJjZSBmb3Igc29mdHdhcmUgYmFja2xvZyBxdWV1ZXMKKwlRVUVVRV9IRUFERVIgICAgICAgICAgICBUeFN3UXVldWVbTlVNX09GX1RYX1JJTkddOyAgLy8gNCBBQyArIDEgSENDQQorCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIFR4U3dRdWV1ZUxvY2tbTlVNX09GX1RYX1JJTkddOwkvLyBUeFN3UXVldWUgc3BpbmxvY2sKKworCVJUTVBfRE1BQlVGICAgICAgICAgICAgIE1nbXREZXNjUmluZzsgICAgICAgICAgICAgICAJLy8gU2hhcmVkIG1lbW9yeSBmb3IgTUdNVCBkZXNjcmlwdG9ycworCVJUTVBfTUdNVF9SSU5HICAgICAgICAgIE1nbXRSaW5nOworCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIE1nbXRSaW5nTG9jazsgICAgICAgICAgICAgICAJLy8gUHJpbyBSaW5nIHNwaW5sb2NrCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICBSeCByZWxhdGVkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmZGVmIFJUMjg3MAorCVJYX0NPTlRFWFQJCQkJUnhDb250ZXh0W1JYX1JJTkdfU0laRV07ICAvLyAxIGZvciByZWR1bmRhbnQgbXVsdGlwbGUgSVJQIGJ1bGsgaW4uCisJTkRJU19TUElOX0xPQ0sJCQlCdWxrSW5Mb2NrOwkJCQkvLyBCdWxrSW4gc3BpbmxvY2sgZm9yIDQgQUNzCisJVUNIQVIJCQkJCVBlbmRpbmdSeDsJCQkJLy8gVGhlIE1heGltYSBwZW5kaW5nIFJ4IHZhbHVlIHNob3VsZCBiZSAJUlhfUklOR19TSVpFLgorCVVDSEFSCQkJCQlOZXh0UnhCdWxrSW5JbmRleDsJCS8vIEluZGljYXRlIHRoZSBjdXJyZW50IFJ4Q29udGV4dCBJbmRleCB3aGljaCBob2xkIGJ5IEhvc3QgY29udHJvbGxlci4KKwlVQ0hBUgkJCQkJTmV4dFJ4QnVsa0luUmVhZEluZGV4OwkvLyBJbmRpY2F0ZSB0aGUgY3VycmVudCBSeENvbnRleHQgSW5kZXggd2hpY2ggZHJpdmVyIGNhbiByZWFkICYgcHJvY2VzcyBpdC4KKwlVTE9ORwkJCQkJTmV4dFJ4QnVsa0luUG9zaXRpb247ICAgLy8gV2FudCB0byBjb250YXRlbmF0ZSAyIFVSQiBidWZmZXIgd2hpbGUgMXN0IGlzIGJ1bGtpbiBmYWlsZWQgVVJCLiBUaGlzIFBvc2l0aW9uIGlzIDFzdCBVUkIgVHJhbnNmZXJMZW5ndGguCisJVUxPTkcJCQkJCVRyYW5zZmVyQnVmZmVyTGVuZ3RoOwkvLyBjdXJyZW50IGxlbmd0aCBvZiB0aGUgcGFja2V0IGJ1ZmZlcgorCVVMT05HCQkJCQlSZWFkUG9zaXRpb247CQkJLy8gY3VycmVudCByZWFkIHBvc2l0aW9uIGluIGEgcGFja2V0IGJ1ZmZlcgorI2VuZGlmIC8vIFJUMjg3MCAvLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgQVNJQyByZWxhdGVkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlVSU5UMzIgICAgICAgICAgICAgICAJTUFDVmVyc2lvbjsgICAgICAJLy8gTUFDIHZlcnNpb24uIFJlY29yZCBydDI4NjBDKDB4Mjg2MDAxMDApIG9yIHJ0Mjg2MEQgKDB4Mjg2MDAxMDEpLi4KKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIEUyUFJPTQorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVVMT05HICAgICAgICAgICAgICAgICAgIEVlcHJvbVZlcnNpb247ICAgICAgICAgIC8vIGJ5dGUgMDogdmVyc2lvbiwgYnl0ZSAxOiByZXZpc2lvbiwgYnl0ZSAyfjM6IHVudXNlZAorCVVDSEFSICAgICAgICAgICAgICAgICAgIEVFUFJPTUFkZHJlc3NOdW07ICAgICAgIC8vIDkzYzQ2PTYgIDkzYzY2PTgKKwlVU0hPUlQgICAgICAgICAgICAgICAgICBFRVBST01EZWZhdWx0VmFsdWVbTlVNX0VFUFJPTV9CQlBfUEFSTVNdOworCVVMT05HICAgICAgICAgICAgICAgICAgIEZpcm13YXJlVmVyc2lvbjsgICAgICAgIC8vIGJ5dGUgMDogTWlub3IgdmVyc2lvbiwgYnl0ZSAxOiBNYWpvciB2ZXJzaW9uLCBvdGhlcndpc2UgdW51c2VkLgorCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gQkJQIENvbnRyb2wKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBCYnBXcml0ZUxhdGNoWzE0MF07ICAgICAvLyByZWNvcmQgbGFzdCBCQlAgcmVnaXN0ZXIgdmFsdWUgd3JpdHRlbiB2aWEgQkJQX0lPX1dSSVRFL0JCUF9JT19XUklURV9WWV9SRUdfSUQKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBCYnBSc3NpVG9EYm1EZWx0YTsKKwlCQlBfUjY2X1RVTklORyAgICAgICAgICBCYnBUdW5pbmc7CisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gUkZJQyBjb250cm9sCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVVDSEFSICAgICAgICAgICAgICAgICAgIFJmSWNUeXBlOyAgICAgICAvLyBSRklDX3h4eAorCVVMT05HICAgICAgICAgICAgICAgICAgIFJmRnJlcU9mZnNldDsgICAvLyBGcmVxdWVuY3kgb2Zmc2V0IGZvciBjaGFubmVsIHN3aXRjaGluZworCVJUTVBfUkZfUkVHUyAgICAgICAgICAgIExhdGNoUmZSZWdzOyAgICAvLyBsYXRjaCB0aCBsYXRlc3QgUkYgcHJvZ3JhbW1pbmcgdmFsdWUgc2luY2UgUkYgSUMgZG9lc24ndCBzdXBwb3J0IFJFQUQKKworCUVFUFJPTV9BTlRFTk5BX1NUUlVDICAgIEFudGVubmE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbmNlIEFOdGVubmEgZGVmaW5pdGlvbiBpcyBkaWZmZXJlbnQgZm9yIGEgJiBnLiBXZSBuZWVkIHRvIHNhdmUgaXQgZm9yIGZ1dHVyZSByZWZlcmVuY2UuCisJRUVQUk9NX05JQ19DT05GSUcyX1NUUlVDICAgIE5pY0NvbmZpZzI7CisKKwkvLyBUaGlzIHNvZnQgUnggQW50ZW5uYSBEaXZlcnNpdHkgbWVjaGFuaXNtIGlzIHVzZWQgb25seSB3aGVuIHVzZXIgc2V0CisJLy8gUlggQW50ZW5uYSA9IERJVkVSU0lUWSBPTgorCVNPRlRfUlhfQU5UX0RJVkVSU0lUWSAgIFJ4QW50OworCisJVUNIQVIgICAgICAgICAgICAgICAgICAgUkZQcm9nU2VxOworCUNIQU5ORUxfVFhfUE9XRVIgICAgICAgIFR4UG93ZXJbTUFYX05VTV9PRl9DSEFOTkVMU107ICAgICAgIC8vIFN0b3JlIFR4IHBvd2VyIHZhbHVlIGZvciBhbGwgY2hhbm5lbHMuCisJQ0hBTk5FTF9UWF9QT1dFUiAgICAgICAgQ2hhbm5lbExpc3RbTUFYX05VTV9PRl9DSEFOTkVMU107ICAgLy8gbGlzdCBhbGwgc3VwcG9ydGVkIGNoYW5uZWxzIGZvciBzaXRlIHN1cnZleQorCUNIQU5ORUxfMTFKX1RYX1BPV0VSICAgIFR4UG93ZXIxMUpbTUFYX05VTV9PRl8xMUpDSEFOTkVMU107ICAgICAgIC8vIDgwMi4xMWogY2hhbm5lbCBhbmQgYncKKwlDSEFOTkVMXzExSl9UWF9QT1dFUiAgICBDaGFubmVsTGlzdDExSltNQVhfTlVNX09GXzExSkNIQU5ORUxTXTsgICAvLyBsaXN0IGFsbCBzdXBwb3J0ZWQgY2hhbm5lbHMgZm9yIHNpdGUgc3VydmV5CisKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBDaGFubmVsTGlzdE51bTsgICAgICAgICAgICAgICAgICAgICAvLyBudW1iZXIgb2YgY2hhbm5lbCBpbiBDaGFubmVsTGlzdFtdCisJVUNIQVIJCQkJCUJicDk0OworCUJPT0xFQU4JCQkJCUJicEZvckNDSzsKKwlVTE9ORwkJVHgyME1Qd3JDZmdBQmFuZFs1XTsKKwlVTE9ORwkJVHgyME1Qd3JDZmdHQmFuZFs1XTsKKwlVTE9ORwkJVHg0ME1Qd3JDZmdBQmFuZFs1XTsKKwlVTE9ORwkJVHg0ME1Qd3JDZmdHQmFuZFs1XTsKKworCUJPT0xFQU4gICAgIGJBdXRvVHhBZ2NBOyAgICAgICAgICAgICAgICAvLyBFbmFibGUgZHJpdmVyIGF1dG8gVHggQWdjIGNvbnRyb2wKKwlVQ0hBUgkgICAgVHNzaVJlZkE7CQkJCQkvLyBTdG9yZSBUc3NpIHJlZmVyZW5jZSB2YWx1ZSBhcyAyNSB0ZW1wZXJhdHVyZS4KKwlVQ0hBUgkgICAgVHNzaVBsdXNCb3VuZGFyeUFbNV07CQkvLyBUc3NpIGJvdW5kYXJ5IGZvciBpbmNyZWFzZSBUeCBwb3dlciB0byBjb21wZW5zYXRlLgorCVVDSEFSCSAgICBUc3NpTWludXNCb3VuZGFyeUFbNV07CQkvLyBUc3NpIGJvdW5kYXJ5IGZvciBkZWNyZWFzZSBUeCBwb3dlciB0byBjb21wZW5zYXRlLgorCVVDSEFSCSAgICBUeEFnY1N0ZXBBOwkJCQkJLy8gU3RvcmUgVHggVFNTSSBkZWx0YSBpbmNyZW1lbnQgLyBkZWNyZW1lbnQgdmFsdWUKKwlDSEFSCQlUeEFnY0NvbXBlbnNhdGVBOwkJCS8vIFN0b3JlIHRoZSBjb21wZW5zYXRpb24gKFR4QWdjU3RlcCAqIChpZHgtMSkpCisKKwlCT09MRUFOICAgICBiQXV0b1R4QWdjRzsgICAgICAgICAgICAgICAgLy8gRW5hYmxlIGRyaXZlciBhdXRvIFR4IEFnYyBjb250cm9sCisJVUNIQVIJICAgIFRzc2lSZWZHOwkJCQkJLy8gU3RvcmUgVHNzaSByZWZlcmVuY2UgdmFsdWUgYXMgMjUgdGVtcGVyYXR1cmUuCisJVUNIQVIJICAgIFRzc2lQbHVzQm91bmRhcnlHWzVdOwkJLy8gVHNzaSBib3VuZGFyeSBmb3IgaW5jcmVhc2UgVHggcG93ZXIgdG8gY29tcGVuc2F0ZS4KKwlVQ0hBUgkgICAgVHNzaU1pbnVzQm91bmRhcnlHWzVdOwkJLy8gVHNzaSBib3VuZGFyeSBmb3IgZGVjcmVhc2UgVHggcG93ZXIgdG8gY29tcGVuc2F0ZS4KKwlVQ0hBUgkgICAgVHhBZ2NTdGVwRzsJCQkJCS8vIFN0b3JlIFR4IFRTU0kgZGVsdGEgaW5jcmVtZW50IC8gZGVjcmVtZW50IHZhbHVlCisJQ0hBUgkJVHhBZ2NDb21wZW5zYXRlRzsJCQkvLyBTdG9yZSB0aGUgY29tcGVuc2F0aW9uIChUeEFnY1N0ZXAgKiAoaWR4LTEpKQorCisJLy8rKytGb3IgUlQyODcwLCB0aGUgcGFyYW1ldGVyZXMgaXMgc3RhcnQgZnJvbSBCR1Jzc2lPZmZzZXQxIH4gQkdSc3NpT2Zmc2V0MworCUNIQVIJCUJHUnNzaU9mZnNldDA7CQkJCS8vIFN0b3JlIEIvRyBSU1NJIzAgT2Zmc2V0IHZhbHVlIG9uIEVFUFJPTSAweDQ2aAorCUNIQVIJCUJHUnNzaU9mZnNldDE7CQkJCS8vIFN0b3JlIEIvRyBSU1NJIzEgT2Zmc2V0IHZhbHVlCisJQ0hBUgkJQkdSc3NpT2Zmc2V0MjsJCQkJLy8gU3RvcmUgQi9HIFJTU0kjMiBPZmZzZXQgdmFsdWUKKwkvLy0tLQorCisJLy8rKytGb3IgUlQyODcwLCB0aGUgcGFyYW1ldGVyZXMgaXMgc3RhcnQgZnJvbSBBUnNzaU9mZnNldDEgfiBBUnNzaU9mZnNldDMKKwlDSEFSCQlBUnNzaU9mZnNldDA7CQkJCS8vIFN0b3JlIEEgUlNTSSMwIE9mZnNldCB2YWx1ZSBvbiBFRVBST00gMHg0QWgKKwlDSEFSCQlBUnNzaU9mZnNldDE7CQkJCS8vIFN0b3JlIEEgUlNTSSMxIE9mZnNldCB2YWx1ZQorCUNIQVIJCUFSc3NpT2Zmc2V0MjsJCQkJLy8gU3RvcmUgQSBSU1NJIzIgT2Zmc2V0IHZhbHVlCisJLy8tLS0KKworCUNIQVIJCUJMTkFHYWluOwkJCQkJLy8gU3RvcmUgQi9HIGV4dGVybmFsIExOQSMwIHZhbHVlIG9uIEVFUFJPTSAweDQ0aAorCUNIQVIJCUFMTkFHYWluMDsJCQkJCS8vIFN0b3JlIEEgZXh0ZXJuYWwgTE5BIzAgdmFsdWUgZm9yIGNoMzZ+NjQKKwlDSEFSCQlBTE5BR2FpbjE7CQkJCQkvLyBTdG9yZSBBIGV4dGVybmFsIExOQSMxIHZhbHVlIGZvciBjaDEwMH4xMjgKKwlDSEFSCQlBTE5BR2FpbjI7CQkJCQkvLyBTdG9yZSBBIGV4dGVybmFsIExOQSMyIHZhbHVlIGZvciBjaDEzMn4xNjUKKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBMRUQgY29udHJvbAorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlNQ1VfTEVEQ1NfU1RSVUMJCUxlZENudGw7CisJVVNIT1JUCQkJCUxlZDE7CS8vIHJlYWQgZnJvbSBFRVBST00gMHgzYworCVVTSE9SVAkJCQlMZWQyOwkvLyBFRVBST00gMHgzZQorCVVTSE9SVAkJCQlMZWQzOwkvLyBFRVBST00gMHg0MAorCVVDSEFSCQkJCUxlZEluZGljYXRvclN0cmVndGg7CisJVUNIQVIJCQkJUnNzaVNpbmdhbHN0cmVuZ3RoT2ZmZXQ7CisgICAgQk9PTEVBTgkJCQliTGVkT25TY2FubmluZzsKKwlVQ0hBUgkJCQlMZWRTdGF0dXM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgODAyLjExIHJlbGF0ZWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvLyBvdXRnb2luZyBCRUFDT04gZnJhbWUgYnVmZmVyIGFuZCBjb3JyZXNwb25kaW5nIFRYRAorCVRYV0lfU1RSVUMgICAgICAgICAgICAgIAlCZWFjb25UeFdJOworCVBVQ0hBUgkJCQkJCUJlYWNvbkJ1ZjsKKwlVU0hPUlQJCQkJCQlCZWFjb25PZmZzZXRbSFdfQkVBQ09OX01BWF9DT1VOVF07CisKKwkvLyBwcmUtYnVpbGQgUFMtUE9MTCBhbmQgTlVMTCBmcmFtZSB1cG9uIGxpbmsgdXAuIGZvciBlZmZpY2llbmN5IHB1cnBvc2UuCisJUFNQT0xMX0ZSQU1FICAgICAgICAgICAgCVBzUG9sbEZyYW1lOworCUhFQURFUl84MDJfMTEgICAgICAgICAgIAlOdWxsRnJhbWU7CisKKyNpZmRlZiBSVDI4NzAKKwlUWF9DT05URVhUCQkJCUJlYWNvbkNvbnRleHRbQkVBQ09OX1JJTkdfU0laRV07CisJVFhfQ09OVEVYVAkJCQlOdWxsQ29udGV4dDsKKwlUWF9DT05URVhUCQkJCVBzUG9sbENvbnRleHQ7CisJVFhfQ09OVEVYVAkJCQlSVFNDb250ZXh0OworI2VuZGlmIC8vIFJUMjg3MCAvLworCisKKworLy89PT09PT09PT1BUD09PT09PT09PT09CisKKworLy89PT09PT09U1RBPT09PT09PT09PT0KKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKy8qIE1vZGlmaWVkIGJ5IFd1IFhpLUt1biA0LzIxLzIwMDYgKi8KKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIFNUQSBzcGVjaWZpYyBjb25maWd1cmF0aW9uICYgb3BlcmF0aW9uIHN0YXR1cworCS8vIHVzZWQgb25seSB3aGVuIHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVNUQV9BRE1JTl9DT05GSUcgICAgICAgIFN0YUNmZzsgICAgICAgICAgIC8vIHVzZXIgZGVzaXJlZCBzZXR0aW5ncworCVNUQV9BQ1RJVkVfQ09ORklHICAgICAgIFN0YUFjdGl2ZTsgICAgICAgICAvLyB2YWxpZCBvbmx5IHdoZW4gQURIT0NfT04ocEFkKSB8fCBJTkZSQV9PTihwQWQpCisJQ0hBUiAgICAgICAgICAgICAgICAgICAgbmlja25hbWVbSVdfRVNTSURfTUFYX1NJWkUrMV07IC8vIG5pY2tuYW1lLCBvbmx5IHVzZWQgaW4gdGhlIGl3Y29uZmlnIGkvZgorCU5ESVNfTUVESUFfU1RBVEUgICAgICAgIFByZU1lZGlhU3RhdGU7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKy8vPT09PT09PUNvbW1vbj09PT09PT09PT09CisJLy8gT1AgbW9kZTogZWl0aGVyIEFQIG9yIFNUQQorCVVDSEFSICAgICAgICAgICAgICAgICAgIE9wTW9kZTsgICAgICAgICAgICAgICAgICAgICAvLyBPUE1PREVfU1RBLCBPUE1PREVfQVAKKworCU5ESVNfTUVESUFfU1RBVEUgICAgICAgIEluZGljYXRlTWVkaWFTdGF0ZTsJCQkvLyBCYXNlIG9uIEluZGljYXRpb24gc3RhdGUsIGRlZmF1bHQgaXMgTmRpc01lZGlhU3RhdGVEaXNDb25uZWN0ZWQKKworCisJLy8gY29uZmlndXJhdGlvbjogcmVhZCBmcm9tIFJlZ2lzdHJ5ICYgRTJQUk9NCisJQk9PTEVBTiAgICAgICAgICAgICAgICAgYkxvY2FsQWRtaW5NQUM7ICAgICAgICAgICAgIC8vIFVzZSB1c2VyIGNoYW5nZWQgTUFDCisJVUNIQVIgICAgICAgICAgICAgICAgICAgUGVybWFuZW50QWRkcmVzc1tNQUNfQUREUl9MRU5dOyAgICAvLyBGYWN0b3J5IGRlZmF1bHQgTUFDIGFkZHJlc3MKKwlVQ0hBUiAgICAgICAgICAgICAgICAgICBDdXJyZW50QWRkcmVzc1tNQUNfQUREUl9MRU5dOyAgICAgIC8vIFVzZXIgY2hhbmdlZCBNQUMgYWRkcmVzcworCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gY29tbW9uIGNvbmZpZ3VyYXRpb24gdG8gYm90aCBPUE1PREVfU1RBIGFuZCBPUE1PREVfQVAKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlDT01NT05fQ09ORklHICAgICAgICAgICBDb21tb25DZmc7CisJTUxNRV9TVFJVQ1QgICAgICAgICAgICAgTWxtZTsKKworCS8vIEFQIG5lZWRzIHRob3NlIHZhaWFibGVzIGZvciBzaXRlIHN1cnZleSBmZWF0dXJlLgorCU1MTUVfQVVYICAgICAgICAgICAgICAgIE1sbWVBdXg7ICAgICAgICAgICAvLyB0ZW1wb3Jhcnkgc2V0dGluZ3MgdXNlZCBkdXJpbmcgTUxNRSBzdGF0ZSBtYWNoaW5lCisJQlNTX1RBQkxFICAgICAgICAgICAgICAgU2NhblRhYjsgICAgICAgICAgIC8vIHN0b3JlIHRoZSBsYXRlc3QgU0NBTiByZXN1bHQKKworCS8vQWJvdXQgTWFjVGFiLCB0aGUgc3RhIGRyaXZlciB3aWxsIHVzZSAjMCBhbmQgIzEgZm9yIG11bHRpY2FzdCBhbmQgQVAuCisJTUFDX1RBQkxFICAgICAgICAgICAgICAgICBNYWNUYWI7ICAgICAvLyBBU0lDIG9uLWNoaXAgV0NJRCBlbnRyeSB0YWJsZS4gIEF0IFRYLCBBU0lDIGFsd2F5cyB1c2Uga2V5IGFjY29yZGluZyB0byB0aGlzIG9uLWNoaXAgdGFibGUuCisJTkRJU19TUElOX0xPQ0sgICAgICAgICAgTWFjVGFiTG9jazsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCUJBX1RBQkxFCQkJQkFUYWJsZTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwlORElTX1NQSU5fTE9DSyAgICAgICAgICBCQVRhYkxvY2s7CisJUkFMSU5LX1RJTUVSX1NUUlVDVCBSRUNCQVRpbWVyOworCisJLy8gZW5jcnlwdGlvbi9kZWNyeXB0aW9uIEtFWSB0YWJsZXMKKwlDSVBIRVJfS0VZICAgICAgICAgICAgICBTaGFyZWRLZXlbTUFYX01CU1NJRF9OVU1dWzRdOyAvLyBTVEEgYWx3YXlzIHVzZSBTaGFyZWRLZXlbQlNTMF1bMC4uM10KKworCQkvLyBSWCByZS1hc3NlbWJseSBidWZmZXIgZm9yIGZyYWdtZW50YXRpb24KKwlGUkFHTUVOVF9GUkFNRSAgICAgICAgICBGcmFnRnJhbWU7ICAgICAgICAgICAgICAgICAgLy8gRnJhbWUgc3RvcmFnZSBmb3IgZnJhZ21lbnQgZnJhbWUKKworCS8vIHZhcmlvdXMgQ291bnRlcnMKKwlDT1VOVEVSXzgwMl8zICAgICAgICAgICBDb3VudGVyczgwMjM7ICAgICAgICAgICAgICAgLy8gODAyLjMgY291bnRlcnMKKwlDT1VOVEVSXzgwMl8xMSAgICAgICAgICBXbGFuQ291bnRlcnM7ICAgICAgICAgICAgICAgLy8gODAyLjExIE1JQiBjb3VudGVycworCUNPVU5URVJfUkFMSU5LICAgICAgICAgIFJhbGlua0NvdW50ZXJzOyAgICAgICAgICAgICAvLyBSYWxpbmsgcHJvcHJpZXR5IGNvdW50ZXJzCisJQ09VTlRFUl9EUlMgICAgICAgICAgICAgRHJzQ291bnRlcnM7ICAgICAgICAgICAgICAgIC8vIGNvdW50ZXJzIGZvciBEeW5hbWljIFRYIFJhdGUgU3dpdGNoaW5nCisJUFJJVkFURV9TVFJVQyAgICAgICAgICAgUHJpdmF0ZUluZm87ICAgICAgICAgICAgICAgIC8vIFByaXZhdGUgaW5mb3JtYXRpb24gJiBjb3VudGVycworCisJLy8gZmxhZ3MsIHNlZSBmUlRNUF9BREFQVEVSX3h4eCBmbGFncworCVVMT05HICAgICAgICAgICAgICAgICAgIEZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAvLyBSZXByZXNlbnQgY3VycmVudCBkZXZpY2Ugc3RhdHVzCisKKwkvLyBjdXJyZW50IFRYIHNlcXVlbmNlICMKKwlVU0hPUlQgICAgICAgICAgICAgICAgICBTZXF1ZW5jZTsKKworCS8vIENvbnRyb2wgZGlzY29ubmVjdCAvIGNvbm5lY3QgZXZlbnQgZ2VuZXJhdGlvbgorCS8vKysrRGlkbid0IHVzZWQgYW55bW9yZQorCVVMT05HICAgICAgICAgICAgICAgICAgIExpbmtEb3duVGltZTsKKwkvLy0tLQorCVVMT05HICAgICAgICAgICAgICAgICAgIExhc3RSeFJhdGU7CisJVUxPTkcgICAgICAgICAgICAgICAgICAgTGFzdFR4UmF0ZTsKKwkvLysrK1VzZWQgb25seSBmb3IgU3RhdGlvbgorCUJPT0xFQU4gICAgICAgICAgICAgICAgIGJDb25maWdDaGFuZ2VkOyAgICAgICAgIC8vIENvbmZpZyBDaGFuZ2UgZmxhZyBmb3IgdGhlIHNhbWUgU1NJRCBzZXR0aW5nCisJLy8tLS0KKworCVVMT05HICAgICAgICAgICAgICAgICAgIEV4dHJhSW5mbzsgICAgICAgICAgICAgIC8vIEV4dHJhIGluZm9ybWF0aW9uIGZvciBkaXNwbGF5aW5nIHN0YXR1cworCVVMT05HICAgICAgICAgICAgICAgICAgIFN5c3RlbUVycm9yQml0bWFwOyAgICAgIC8vIGIwOiBFMlBST00gdmVyc2lvbiBlcnJvcgorCisJLy8rKytEaWRuJ3QgdXNlZCBhbnltb3JlCisJVUxPTkcgICAgICAgICAgICAgICAgICAgTWFjSWNWZXJzaW9uOyAgICAgICAgICAgLy8gTUFDL0JCUCBzZXJpYWwgaW50ZXJmYWNlIGlzc3VlIHNvbHZlZCBhZnRlciB2ZXIuRAorCS8vLS0tCisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBTeXN0ZW0gZXZlbnQgbG9nCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJUlRfODAyXzExX0VWRU5UX1RBQkxFICAgRXZlbnRUYWI7CisKKworCUJPT0xFQU4JCUhUQ0VuYWJsZTsKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvKiAgICAgIFN0YXRpc3RpYyByZWxhdGVkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFJUMjg3MAorCVVMT05HCQkJCQkJQnVsa091dERhdGFPbmVTZWNDb3VudDsKKwlVTE9ORwkJCQkJCUJ1bGtJbkRhdGFPbmVTZWNDb3VudDsKKwlVTE9ORwkJCQkJCUJ1bGtMYXN0T25lU2VjQ291bnQ7IC8vIEJ1bGtPdXREYXRhT25lU2VjQ291bnQgKyBCdWxrSW5EYXRhT25lU2VjQ291bnQKKwlVTE9ORwkJCQkJCXdhdGNoRG9nUnhDbnQ7CisJVUxPTkcJCQkJCQl3YXRjaERvZ1J4T3ZlckZsb3dDbnQ7CisJVUxPTkcJCQkJCQl3YXRjaERvZ1R4UGVuZGluZ0NudFtOVU1fT0ZfVFhfUklOR107CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwlCT09MRUFOCQkJCQkJYlVwZGF0ZUJjbkNudERvbmU7CisJVUxPTkcJCQkJCQl3YXRjaERvZ01hY0RlYWRsb2NrOwkvLyBwcmV2ZW50IE1BQy9CQlAgaW50byBkZWFkbG9jayBjb25kaXRpb24KKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gREVCVUcgcGFyYW1lcnRzCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vVUxPTkcJCURlYnVnU2V0dGluZ1s0XTsKKwlCT09MRUFOCQliQmFuQWxsQmFTZXR1cDsKKwlCT09MRUFOCQliUHJvbWlzY3VvdXM7CisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gcnQyODYwYyBlbXVsYXRpb24tdXNlIFBhcmFtZXRlcnMKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJVUxPTkcJCXJ0c2FjY3VbMzBdOworCVVMT05HCQljdHNhY2N1WzMwXTsKKwlVTE9ORwkJY2ZlbmRhY2N1WzMwXTsKKwlVTE9ORwkJYmFjb250ZW50WzE2XTsKKwlVTE9ORwkJcnhpbnRbUlhfUklOR19TSVpFKzFdOworCVVDSEFSCQlyY3ZiYVs2MF07CisJQk9PTEVBTgkJYkxpbmtBZGFwdDsKKwlCT09MRUFOCQliRm9yY2VQcmludFRYOworCUJPT0xFQU4JCWJGb3JjZVByaW50Ulg7CisJQk9PTEVBTgkJYkRpc2FibGVzY2FubmluZzsJCS8vZGVmaW5lZCBpbiBSVDI4NzAgVVNCCisJQk9PTEVBTgkJYlN0YUZpZm9UZXN0OworCUJPT0xFQU4JCWJQcm90ZWN0aW9uVGVzdDsKKwlCT09MRUFOCQliSENDQVRlc3Q7CisJQk9PTEVBTgkJYkdlbk9uZUhDQ0E7CisJQk9PTEVBTgkJYkJyb2FkQ29tSFQ7CisJLy8rKytGb2xsb3dpbmcgYWRkIGZyb20gUlQyODcwIFVTQi4KKwlVTE9ORwkJQnVsa091dFJlcTsKKwlVTE9ORwkJQnVsa091dENvbXBsZXRlOworCVVMT05HCQlCdWxrT3V0Q29tcGxldGVPdGhlcjsKKwlVTE9ORwkJQnVsa091dENvbXBsZXRlQ2FuY2VsOwkvLyBzZWVtcyBub3QgdXNlIG5vdz8KKwlVTE9ORwkJQnVsa0luUmVxOworCVVMT05HCQlCdWxrSW5Db21wbGV0ZTsKKwlVTE9ORwkJQnVsa0luQ29tcGxldGVGYWlsOworCS8vLS0tCisKKyAgICBzdHJ1Y3Qgd2lmaWNvbmYJCQlXSUZJdGVzdGJlZDsKKworI2lmZGVmIFJBTElOS19BVEUKKwlBVEVfSU5GTwkJCQlhdGU7CisjaWZkZWYgUlQyODcwCisJQk9PTEVBTgkJCQkJQ29udGluQnVsa091dDsJCS8vQVRFIGJ1bGsgb3V0IGNvbnRyb2wKKwlCT09MRUFOCQkJCQlDb250aW5CdWxrSW47CQkvL0FURSBidWxrIGluIGNvbnRyb2wKKwlhdG9taWNfdAkJCQlCdWxrT3V0UmVtYWluZWQ7CisJYXRvbWljX3QJCQkJQnVsa0luUmVtYWluZWQ7CisjZW5kaWYgLy8gUlQyODcwIC8vCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJc3RydWN0IHJlb3JkZXJpbmdfbXBkdV9wb29sIG1wZHVfYmxrX3Bvb2w7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlVTE9ORwkJCQkJT25lU2Vjb25kbm9uQkVwYWNrZXRzOwkJLy8gcmVjb3JkIG5vbiBCRSBwYWNrZXRzIHBlciBzZWNvbmQKKworI2lmIFdJUkVMRVNTX0VYVCA+PSAxMgorICAgIHN0cnVjdCBpd19zdGF0aXN0aWNzICAgIGl3X3N0YXRzOworI2VuZGlmCisKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cwlzdGF0czsKKworI2lmZGVmIEJMT0NLX05FVF9JRgorCUJMT0NLX1FVRVVFX0VOVFJZCQlibG9ja1F1ZXVlVGFiW05VTV9PRl9UWF9SSU5HXTsKKyNlbmRpZiAvLyBCTE9DS19ORVRfSUYgLy8KKworCisKKyNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKKwlJTlQzMgkJCQkJTUNfUm93SUQ7CisJVUNIQVIJCQkJCU1DX0ZpbGVOYW1lWzI1Nl07CisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisKKwlVTE9ORwkJCQkJVGJ0dFRpY2tDb3VudDsKKyNpZmRlZiBQQ0lfTVNJX1NVUFBPUlQKKwlCT09MRUFOCQkJCQlIYXZlTXNpOworI2VuZGlmIC8vIFBDSV9NU0lfU1VQUE9SVCAvLworCisKKwlVQ0hBUgkJCQkJaXNfb247CisKKyNkZWZpbmUgVElNRV9CQVNFCQkJKDEwMDAwMDAvT1NfSFopCisjZGVmaW5lIFRJTUVfT05FX1NFQ09ORAkJKDEwMDAwMDAvVElNRV9CQVNFKQorCVVDSEFSCQkJCQlmbGdfYmVfYWRqdXN0OworCVVMT05HCQkJCQliZV9hZGp1c3RfbGFzdF90aW1lOworCisKKyNpZmRlZiBJS0FOT1NfVlhfMVgwCisJc3RydWN0IElLQU5PU19UWF9JTkZPCUlrYW5vc1R4SW5mbzsKKwlzdHJ1Y3QgSUtBTk9TX1RYX0lORk8JSWthbm9zUnhJbmZvW01BWF9NQlNTSURfTlVNICsgTUFYX1dEU19FTlRSWSArIE1BWF9BUENMSV9OVU0gKyBNQVhfTUVTSF9OVU1dOworI2VuZGlmIC8vIElLQU5PU19WWF8xWDAgLy8KKworCisjaWZkZWYgREJHX0RJQUdOT1NFCisJUnRtcERpYWdTdHJ1Y3QJRGlhZ1N0cnVjdDsKKyNlbmRpZiAvLyBEQkdfRElBR05PU0UgLy8KKworCisJVUlOVDgJCQkJCVBNX0ZsZ1N1c3BlbmQ7Cit9IFJUTVBfQURBUFRFUiwgKlBSVE1QX0FEQVBURVI7CisKKy8vCisvLyBDaXNjbyBJQVBQIGZvcm1hdAorLy8KK3R5cGVkZWYgc3RydWN0ICBfQ0lTQ09fSUFQUF9DT05URU5UXworeworCVVTSE9SVCAgICAgTGVuZ3RoOyAgICAgICAgLy9JQVBQIExlbmd0aAorCVVDSEFSICAgICAgTWVzc2FnZVR5cGU7ICAgICAgLy9JQVBQIHR5cGUKKwlVQ0hBUiAgICAgIEZ1bmN0aW9uQ29kZTsgICAgIC8vSUFQUCBmdW5jdGlvbiB0eXBlCisJVUNIQVIgICAgICBEZXN0aW5haW9uTUFDW01BQ19BRERSX0xFTl07CisJVUNIQVIgICAgICBTb3VyY2VNQUNbTUFDX0FERFJfTEVOXTsKKwlVU0hPUlQgICAgIFRhZzsgICAgICAgICAgIC8vVGFnKGVsZW1lbnQgSUUpIC0gQWRqYWNlbnQgQVAgcmVwb3J0CisJVVNIT1JUICAgICBUYWdMZW5ndGg7ICAgICAvL0xlbmd0aCBvZiBlbGVtZW50IG5vdCBpbmNsdWRpbmcgNCBieXRlIGhlYWRlcgorCVVDSEFSICAgICAgT1VJWzRdOyAgICAgICAgICAgLy8weDAwLCAweDQwLCAweDk2LCAweDAwCisJVUNIQVIgICAgICBQcmV2aW91c0FQW01BQ19BRERSX0xFTl07ICAgICAgIC8vTUFDIEFkZHJlc3Mgb2YgYWNjZXNzIHBvaW50CisJVVNIT1JUICAgICBDaGFubmVsOworCVVTSE9SVCAgICAgU3NpZExlbjsKKwlVQ0hBUiAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKKwlVU0hPUlQgICAgIFNlY29uZHM7ICAgICAgICAgIC8vU2Vjb25kcyB0aGF0IHRoZSBjbGllbnQgaGFzIGJlZW4gZGlzYXNzb2NpYXRlZC4KK30gQ0lTQ09fSUFQUF9DT05URU5ULCAqUENJU0NPX0lBUFBfQ09OVEVOVDsKKworI2RlZmluZSBERUxBWUlOVE1BU0sJCTB4MDAwM2ZmZmIKKyNkZWZpbmUgSU5UTUFTSwkJCQkweDAwMDNmZmZiCisjZGVmaW5lIEluZE1hc2sJCQkJMHgwMDAzZmZmYworI2RlZmluZSBSeElOVAkJCQkweDAwMDAwMDA1CS8vIERlbGF5ZWQgUnggb3IgaW5kaXZpIHJ4CisjZGVmaW5lIFR4RGF0YUludAkJCTB4MDAwMDAwZmEJLy8gRGVsYXllZCBUeCBvciBpbmRpdmkgdHgKKyNkZWZpbmUgVHhNZ210SW50CQkJMHgwMDAwMDEwMgkvLyBEZWxheWVkIFR4IG9yIGluZGl2aSB0eAorI2RlZmluZSBUeENvaGVyZW50CQkJMHgwMDAyMDAwMAkvLyB0eCBjb2hlcmVudAorI2RlZmluZSBSeENvaGVyZW50CQkJMHgwMDAxMDAwMAkvLyByeCBjb2hlcmVudAorI2RlZmluZSBNY3VDb21tYW5kCQkJMHgwMDAwMDIwMAkvLyBtY3UKKyNkZWZpbmUgUHJlVEJUVEludAkJCTB4MDAwMDEwMDAJLy8gUHJlLVRCVFQgaW50ZXJydXB0CisjZGVmaW5lIFRCVFRJbnQJCQkJMHgwMDAwMDgwMAkJLy8gVEJUVCBpbnRlcnJ1cHQKKyNkZWZpbmUgR1BUaW1lT3V0SW50CQkJMHgwMDAwODAwMAkJLy8gR1B0aW1lb3V0IGludGVycnVwdAorI2RlZmluZSBBdXRvV2FrZXVwSW50CQkweDAwMDA0MDAwCQkvLyBBdXRvV2FrZXVwSW50IGludGVycnVwdAorI2RlZmluZSBGaWZvU3RhRnVsbEludAkJCTB4MDAwMDIwMDAJLy8gIGZpZm8gc3RhdGlzdGljcyBmdWxsIGludGVycnVwdAorCisKK3R5cGVkZWYgc3RydWN0IF9SWF9CTEtfCit7CisvLwlSWERfU1RSVUMJCVJ4RDsgLy8gc2FtcGxlCisJUlQyOFhYX1JYRF9TVFJVQwlSeEQ7CisJUFJYV0lfU1RSVUMJCQlwUnhXSTsKKwlQSEVBREVSXzgwMl8xMQkJcEhlYWRlcjsKKwlQTkRJU19QQUNLRVQJCXBSeFBhY2tldDsKKwlVQ0hBUgkJCQkqcERhdGE7CisJVVNIT1JUCQkJCURhdGFTaXplOworCVVTSE9SVAkJCQlGbGFnczsKKwlVQ0hBUgkJCQlVc2VyUHJpb3JpdHk7CS8vIGZvciBjYWxjdWxhdGUgVEtJUCBNSUMgdXNpbmcKK30gUlhfQkxLOworCisKKyNkZWZpbmUgUlhfQkxLX1NFVF9GTEFHKF9wUnhCbGssIF9mbGFnKQkJKF9wUnhCbGstPkZsYWdzIHw9IF9mbGFnKQorI2RlZmluZSBSWF9CTEtfVEVTVF9GTEFHKF9wUnhCbGssIF9mbGFnKQkoX3BSeEJsay0+RmxhZ3MgJiBfZmxhZykKKyNkZWZpbmUgUlhfQkxLX0NMRUFSX0ZMQUcoX3BSeEJsaywgX2ZsYWcpCShfcFJ4QmxrLT5GbGFncyAmPSB+KF9mbGFnKSkKKworCisjZGVmaW5lIGZSWF9XRFMJCQkweDAwMDEKKyNkZWZpbmUgZlJYX0FNU0RVICAgICAgIDB4MDAwMgorI2RlZmluZSBmUlhfQVJBTElOSyAgICAgMHgwMDA0CisjZGVmaW5lIGZSWF9IVEMgICAgICAgICAweDAwMDgKKyNkZWZpbmUgZlJYX1BBRCAgICAgICAgIDB4MDAxMAorI2RlZmluZSBmUlhfQU1QRFUgICAgICAgMHgwMDIwCisjZGVmaW5lIGZSWF9RT1MJCQkweDAwNDAKKyNkZWZpbmUgZlJYX0lORlJBCQkweDAwODAKKyNkZWZpbmUgZlJYX0VBUAkJCTB4MDEwMAorI2RlZmluZSBmUlhfTUVTSAkJMHgwMjAwCisjZGVmaW5lIGZSWF9BUENMSQkJMHgwNDAwCisjZGVmaW5lIGZSWF9ETFMJCQkweDA4MDAKKyNkZWZpbmUgZlJYX1dQSQkJCTB4MTAwMAorCisjZGVmaW5lIExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQJMTQKKyNkZWZpbmUgTEVOR1RIX0FSQUxJTktfU1VCRlJBTUVIRUFECTE0CisjZGVmaW5lIExFTkdUSF9BUkFMSU5LX0hFQURFUl9GSUVMRAkgMgorCisjZGVmaW5lIFRYX1VOS09XTl9GUkFNRQkJCTB4MDAKKyNkZWZpbmUgVFhfTUNBU1RfRlJBTUUJCQkweDAxCisjZGVmaW5lIFRYX0xFR0FDWV9GUkFNRQkJCTB4MDIKKyNkZWZpbmUgVFhfQU1QRFVfRlJBTUUJCQkweDA0CisjZGVmaW5lIFRYX0FNU0RVX0ZSQU1FCQkJMHgwOAorI2RlZmluZSBUWF9SQUxJTktfRlJBTUUJCQkweDEwCisjZGVmaW5lIFRYX0ZSQUdfRlJBTUUJCQkweDIwCisKKworLy8JQ3VycmVudGx5IHRoZSBzaXplb2YoVFhfQkxLKSBpcyAxNDggYnl0ZXMuCit0eXBlZGVmIHN0cnVjdCBfVFhfQkxLXworeworCVVDSEFSCQkJCVF1ZUlkeDsKKwlVQ0hBUgkJCQlUeEZyYW1lVHlwZTsJCQkJLy8gSW5kaWNhdGUgdGhlIFRyYW5zbWlzc2lvbiB0eXBlIG9mIHRoZSBhbGwgZnJhbWVzIGluIG9uZSBiYXRjaAorCVVDSEFSCQkJCVRvdGFsRnJhbWVOdW07CQkJCS8vIFRvdGFsIGZyYW1lIG51bWJlciB3YW50IHRvIHNlbmQtb3V0IGluIG9uZSBiYXRjaAorCVVTSE9SVAkJCQlUb3RhbEZyYWdOdW07CQkJCS8vIFRvdGFsIGZyYW1lIGZyYWdtZW50cyByZXF1aXJlZCBpbiBvbmUgYmF0Y2gKKwlVU0hPUlQJCQkJVG90YWxGcmFtZUxlbjsJCQkJLy8gVG90YWwgbGVuZ3RoIG9mIGFsbCBmcmFtZXMgd2FudCB0byBzZW5kLW91dCBpbiBvbmUgYmF0Y2gKKworCVFVRVVFX0hFQURFUgkJVHhQYWNrZXRMaXN0OworCU1BQ19UQUJMRV9FTlRSWQkJKnBNYWNFbnRyeTsJCQkJCS8vIE5VTEw6IHBhY2tldCB3aXRoIDgwMi4xMSBSQSBmaWVsZCBpcyBtdWx0aWNhc3QvYnJvYWRjYXN0IGFkZHJlc3MKKwlIVFRSQU5TTUlUX1NFVFRJTkcJKnBUcmFuc21pdDsKKworCS8vIEZvbGxvd2luZyBzdHJ1Y3R1cmUgdXNlZCBmb3IgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiBhIHNwZWNpZmljIHBhY2tldC4KKwlQTkRJU19QQUNLRVQJCXBQYWNrZXQ7CisJUFVDSEFSCQkJCXBTcmNCdWZIZWFkZXI7CQkJCS8vIFJlZmVyZW5jZSB0byB0aGUgaGVhZCBvZiBza19idWZmLT5kYXRhCisJUFVDSEFSCQkJCXBTcmNCdWZEYXRhOwkJCQkvLyBSZWZlcmVuY2UgdG8gdGhlIHNrX2J1ZmYtPmRhdGEsIHdpbGwgY2hhbmdlZCBkZXBlbmRzIG9uIGhhbmxkaW5nIHByb2dyZXNzcworCVVJTlQJCQkJU3JjQnVmTGVuOwkJCQkJLy8gTGVuZ3RoIG9mIHBhY2tldCBwYXlsb2FkIHdoaWNoIG5vdCBpbmNsdWRpbmcgTGF5ZXIgMiBoZWFkZXIKKwlQVUNIQVIJCQkJcEV4dHJhTGxjU25hcEVuY2FwOwkJCS8vIE5VTEwgbWVhbnMgbm8gZXh0cmEgTExDL1NOQVAgaXMgcmVxdWlyZWQKKwlVQ0hBUgkJCQlIZWFkZXJCdWZbODBdOwkJCQkvLyBUZW1wQnVmZmVyIGZvciBUWF9JTkZPICsgVFhfV0kgKyA4MDIuMTEgSGVhZGVyICsgcGFkZGluZyArIEFNU0RVIFN1YkhlYWRlciArIExMQy9TTkFQCisJVUNIQVIJCQkJTXBkdUhlYWRlckxlbjsJCQkJLy8gODAyLjExIGhlYWRlciBsZW5ndGggTk9UIGluY2x1ZGluZyB0aGUgcGFkZGluZworCVVDSEFSCQkJCUhkclBhZExlbjsJCQkJCS8vIHJlY29yZGluZyBIZWFkZXIgUGFkZGluZyBMZW5ndGg7CisJVUNIQVIJCQkJYXBpZHg7CQkJCQkJLy8gVGhlIGludGVyZmFjZSBhc3NvY2lhdGVkIHRvIHRoaXMgcGFja2V0CisJVUNIQVIJCQkJV2NpZDsJCQkJCQkvLyBUaGUgTUFDIGVudHJ5IGFzc29jaWF0ZWQgdG8gdGhpcyBwYWNrZXQKKwlVQ0hBUgkJCQlVc2VyUHJpb3JpdHk7CQkJCS8vIHByaW9yaXR5IGNsYXNzIG9mIHBhY2tldAorCVVDSEFSCQkJCUZyYW1lR2FwOwkJCQkJLy8gd2hhdCBraW5kIG9mIElGUyB0aGlzIHBhY2tldCB1c2UKKwlVQ0hBUgkJCQlNcGR1UmVxTnVtOwkJCQkJLy8gbnVtYmVyIG9mIGZyYWdtZW50cyBvZiB0aGlzIGZyYW1lCisJVUNIQVIJCQkJVHhSYXRlOwkJCQkJCS8vIFRPRE86IE9ic29sZXRlZD8gU2hvdWxkIGNoYW5nZSB0byBNQ1M/CisJVUNIQVIJCQkJQ2lwaGVyQWxnOwkJCQkJLy8gY2lwaGVyIGFsb2dyaXRobQorCVBDSVBIRVJfS0VZCQkJcEtleTsKKworCisKKwlVU0hPUlQJCQkJRmxhZ3M7CQkJCQkJLy9TZWUgZm9sbG93aW5nIGRlZmluaXRpb25zIGZvciBkZXRhaWwuCisKKwkvL1lPVSBTSE9VTEQgTk9UIFRPVUNIIElUISBGb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgdXNlZCBmb3IgaGFyZHdhcmUtZGVwZW5kZWQgbGF5ZXIuCisJVUxPTkcJCQkJUHJpdjsJCQkJCQkvLyBIYXJkd2FyZSBzcGVjaWZpYyB2YWx1ZSBzYXZlZCBpbiBoZXJlLgorfSBUWF9CTEssICpQVFhfQkxLOworCisKKyNkZWZpbmUgZlRYX2JSdHNSZXF1aXJlZAkJMHgwMDAxCS8vIEluZGljYXRlIGlmIG5lZWQgc2VuZCBSVFMgZnJhbWUgZm9yIHByb3RlY3Rpb24uIE5vdCB1c2VkIGluIFJUMjg2MC9SVDI4NzAuCisjZGVmaW5lIGZUWF9iQWNrUmVxdWlyZWQgICAgICAgCTB4MDAwMgkvLyB0aGUgcGFja2V0IG5lZWQgYWNrIHJlc3BvbnNlCisjZGVmaW5lIGZUWF9iUGlnZ3lCYWNrICAgICAJCTB4MDAwNAkvLyBMZWdhY3kgZGV2aWNlIHVzZSBQaWdnYmFjayBvciBub3QKKyNkZWZpbmUgZlRYX2JIVFJhdGUgICAgICAgICAJMHgwMDA4CS8vIGFsbG93IHRvIHVzZSBIVCByYXRlCisvLyNkZWZpbmUgZlRYX2JGb3JjZUxvd1JhdGUgICAgICAgMHgwMDEwCS8vIGZvcmNlIHRvIHVzZSBMb3cgUmF0ZQorI2RlZmluZSBmVFhfYkZvcmNlTm9uUW9TICAgICAgIAkweDAwMTAJLy8gZm9yY2UgdG8gdHJhbnNtaXQgZnJhbWUgd2l0aG91dCBXTU0tUW9TIGluIEhUIG1vZGUKKyNkZWZpbmUgZlRYX2JBbGxvd0ZyYWcgICAgICAgCTB4MDAyMAkvLyBhbGxvdyB0byBmcmFnbWVudCB0aGUgcGFja2V0LCBBLU1QRFUsIEEtTVNEVSwgQS1SYWxpbmsgaXMgbm90IGFsbG93ZWQgdG8gZnJhZ21lbnQKKyNkZWZpbmUgZlRYX2JNb3JlRGF0YQkJCTB4MDA0MAkvLyB0aGVyZSBhcmUgbW9yZSBkYXRhIHBhY2tldHMgaW4gUG93ZXJTYXZlIFF1ZXVlCisjZGVmaW5lIGZUWF9iV01NCQkJCTB4MDA4MAkvLyBRT1MgRGF0YQorCisjZGVmaW5lIGZUWF9iQ2xlYXJFQVBGcmFtZQkJMHgwMTAwCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisKKworI2RlZmluZSBUWF9CTEtfQVNTSUdOX0ZMQUcoX3BUeEJsaywgX2ZsYWcsIHZhbHVlKQlcCisJCWRvIHsJCQkJCQkJCQkJXAorCQkJaWYgKHZhbHVlKSAJCQkJCQkJCVwKKwkJCQkoX3BUeEJsay0+RmxhZ3MgfD0gX2ZsYWcpIAkJCVwKKwkJCWVsc2UgCQkJCQkJCQkJXAorCQkJCShfcFR4QmxrLT5GbGFncyAmPSB+KF9mbGFnKSkJCVwKKwkJfXdoaWxlKDApCisKKyNkZWZpbmUgVFhfQkxLX1NFVF9GTEFHKF9wVHhCbGssIF9mbGFnKQkJKF9wVHhCbGstPkZsYWdzIHw9IF9mbGFnKQorI2RlZmluZSBUWF9CTEtfVEVTVF9GTEFHKF9wVHhCbGssIF9mbGFnKQkoKChfcFR4QmxrLT5GbGFncyAmIF9mbGFnKSA9PSBfZmxhZykgPyAxIDogMCkKKyNkZWZpbmUgVFhfQkxLX0NMRUFSX0ZMQUcoX3BUeEJsaywgX2ZsYWcpCShfcFR4QmxrLT5GbGFncyAmPSB+KF9mbGFnKSkKKworCisKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KK3N0YXRpYyBpbmxpbmUgVk9JRAlXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoCisJSU4gIFBVQ0hBUgkJCURlc3QsCisgCUlOCVBVQ0hBUgkJCVNyYywKKyAgICBJTiAgQk9PTEVBTgkJCURvRW5jcnlwdCwKKwlJTiAgVUxPTkcgICAgICAgICAgIERlc2NyaXB0b3JUeXBlKQoreworCVVJTlQzMiAqcDEsICpwMjsKKworCXAxID0gKChVSU5UMzIgKilEZXN0KTsKKwlwMiA9ICgoVUlOVDMyICopU3JjKTsKKworCSpwMSA9ICpwMjsKKwkqKHAxKzIpID0gKihwMisyKTsKKwkqKHAxKzMpID0gKihwMiszKTsKKwkqKHAxKzEpID0gKihwMisxKTsgLy8gV29yZCAxOyB0aGlzIG11c3QgYmUgd3JpdHRlbiBiYWNrIGxhc3QKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUVuZGlhbiBjb252ZXJzaW9uIG9mIFR4L1J4IGRlc2NyaXB0b3IgLgorCisJQXJndW1lbnRzOgorCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcERhdGEJCQlQb2ludGVyIHRvIFR4L1J4IGRlc2NyaXB0b3IKKwkJRGVzY3JpcHRvclR5cGUJRGlyZWN0aW9uIG9mIHRoZSBmcmFtZQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCQlDYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiByZWFkIG9yIHVwZGF0ZSBkZXNjcmlwdG9yCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIGlubGluZSBWT0lECVJUTVBXSUVuZGlhbkNoYW5nZSgKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVTE9ORwkJCURlc2NyaXB0b3JUeXBlKQoreworCWludCBzaXplOworCWludCBpOworCisJc2l6ZSA9ICgoRGVzY3JpcHRvclR5cGUgPT0gVFlQRV9UWFdJKSA/IFRYV0lfU0laRSA6IFJYV0lfU0laRSk7CisKKwlpZihEZXNjcmlwdG9yVHlwZSA9PSBUWVBFX1RYV0kpCisJeworCQkqKChVSU5UMzIgKikocERhdGEpKSA9IFNXQVAzMigqKChVSU5UMzIgKikocERhdGEpKSk7CQkvLyBCeXRlIDB+MworCQkqKChVSU5UMzIgKikocERhdGEgKyA0KSkgPSBTV0FQMzIoKigoVUlOVDMyICopKHBEYXRhKzQpKSk7CS8vIEJ5dGUgNH43CisJfQorCWVsc2UKKwl7CisJCWZvcihpPTA7IGkgPCBzaXplLzQgOyBpKyspCisJCQkqKCgoVUlOVDMyICopcERhdGEpICtpKSA9IFNXQVAzMigqKCgoVUlOVDMyICopcERhdGEpK2kpKTsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlFbmRpYW4gY29udmVyc2lvbiBvZiBUeC9SeCBkZXNjcmlwdG9yIC4KKworCUFyZ3VtZW50czoKKwkJcEFkIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBEYXRhCQkJUG9pbnRlciB0byBUeC9SeCBkZXNjcmlwdG9yCisJCURlc2NyaXB0b3JUeXBlCURpcmVjdGlvbiBvZiB0aGUgZnJhbWUKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKwkJQ2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gcmVhZCBvciB1cGRhdGUgZGVzY3JpcHRvcgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworI2lmZGVmIFJUMjg3MAorc3RhdGljIGlubGluZSBWT0lECVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVMT05HCQkJRGVzY3JpcHRvclR5cGUpCit7CisJKigoVUlOVDMyICopKHBEYXRhKSkgPSBTV0FQMzIoKigoVUlOVDMyICopKHBEYXRhKSkpOworfQorI2VuZGlmIC8vIFJUMjg3MCAvLworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUVuZGlhbiBjb252ZXJzaW9uIG9mIGFsbCBraW5kcyBvZiA4MDIuMTEgZnJhbWVzIC4KKworCUFyZ3VtZW50czoKKwkJcEFkIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCXBEYXRhCQkJUG9pbnRlciB0byB0aGUgODAyLjExIGZyYW1lIHN0cnVjdHVyZQorCQlEaXIgCQkJRGlyZWN0aW9uIG9mIHRoZSBmcmFtZQorCQlGcm9tUnhEb25lSW50CUNhbGxlciBpcyBmcm9tIFJ4RG9uZSBpbnRlcnJ1cHQKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKwkJQ2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gcmVhZCBvciB1cGRhdGUgYnVmZmVyIGRhdGEKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgaW5saW5lIFZPSUQJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVMT05HCQkJRGlyLAorCUlOCUJPT0xFQU4gCQlGcm9tUnhEb25lSW50KQoreworCVBIRUFERVJfODAyXzExIHBGcmFtZTsKKwlQVUNIQVIJcE1hY0hkcjsKKworCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIEZyYW1lIENvbnRyb2wgZmllbGQKKwlpZihEaXIgPT0gRElSX1JFQUQpCisJeworCQkqKFVTSE9SVCAqKXBEYXRhID0gU1dBUDE2KCooVVNIT1JUICopcERhdGEpOworCX0KKworCXBGcmFtZSA9IChQSEVBREVSXzgwMl8xMSkgcERhdGE7CisJcE1hY0hkciA9IChQVUNIQVIpIHBGcmFtZTsKKworCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIER1cmF0aW9uL0lEIGZpZWxkCisJKihVU0hPUlQgKikocE1hY0hkciArIDIpID0gU1dBUDE2KCooVVNIT1JUICopKHBNYWNIZHIgKyAyKSk7CisKKwkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBTZXF1ZW5jZSBDb250cm9sIGZpZWxkCisJKihVU0hPUlQgKikocE1hY0hkciArIDIyKSA9IFNXQVAxNigqKFVTSE9SVCAqKShwTWFjSGRyICsgMjIpKTsKKworCWlmKHBGcmFtZS0+RkMuVHlwZSA9PSBCVFlQRV9NR01UKQorCXsKKwkJc3dpdGNoKHBGcmFtZS0+RkMuU3ViVHlwZSkKKwkJeworCQkJY2FzZSBTVUJUWVBFX0FTU09DX1JFUToKKwkJCWNhc2UgU1VCVFlQRV9SRUFTU09DX1JFUToKKwkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBDYXBhYmlsaXR5SW5mbyBmaWVsZAorCQkJCXBNYWNIZHIgKz0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOworCisJCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gTGlzdGVuIEludGVydmFsIGZpZWxkCisJCQkJcE1hY0hkciArPSAyOworCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOworCQkJCWJyZWFrOworCisJCQljYXNlIFNVQlRZUEVfQVNTT0NfUlNQOgorCQkJY2FzZSBTVUJUWVBFX1JFQVNTT0NfUlNQOgorCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIENhcGFiaWxpdHlJbmZvIGZpZWxkCisJCQkJcE1hY0hkciArPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisJCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7CisKKwkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBTdGF0dXMgQ29kZSBmaWVsZAorCQkJCXBNYWNIZHIgKz0gMjsKKwkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKKworCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIEFJRCBmaWVsZAorCQkJCXBNYWNIZHIgKz0gMjsKKwkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTVUJUWVBFX0FVVEg6CisJCQkJLy8gSWYgZnJvbSBBUEhhbmRsZVJ4RG9uZUludGVycnVwdCByb3V0aW5lLCBpdCBpcyBzdGlsbCBhIGVuY3J5cHQgZm9ybWF0LgorCQkJCS8vIFRoZSBjb252ZXJ0aW9uIGlzIGRlbGF5ZWQgdG8gUlRNUEhhbmRsZURlY3J5cHRpb25Eb25lSW50ZXJydXB0LgorCQkJCWlmKCFGcm9tUnhEb25lSW50ICYmIHBGcmFtZS0+RkMuV2VwID09IDEpCisJCQkJCWJyZWFrOworCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIEF1dGggQWxnIE5vLiBmaWVsZAorCQkJCQlwTWFjSGRyICs9IHNpemVvZihIRUFERVJfODAyXzExKTsKKwkJCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7CisKKwkJCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gQXV0aCBTZXEgTm8uIGZpZWxkCisJCQkJCXBNYWNIZHIgKz0gMjsKKwkJCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7CisKKwkJCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gU3RhdHVzIENvZGUgZmllbGQKKwkJCQkJcE1hY0hkciArPSAyOworCQkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU1VCVFlQRV9CRUFDT046CisJCQljYXNlIFNVQlRZUEVfUFJPQkVfUlNQOgorCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIEJlYWNvbkludGVydmFsIGZpZWxkCisJCQkJcE1hY0hkciArPSAoc2l6ZW9mKEhFQURFUl84MDJfMTEpICsgVElNRVNUQU1QX0xFTik7CisJCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7CisKKwkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBDYXBhYmlsaXR5SW5mbyBmaWVsZAorCQkJCXBNYWNIZHIgKz0gc2l6ZW9mKFVTSE9SVCk7CisJCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU1VCVFlQRV9ERUFVVEg6CisJCQljYXNlIFNVQlRZUEVfRElTQVNTT0M6CisJCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gUmVhc29uIGNvZGUgZmllbGQKKwkJCQlwTWFjSGRyICs9IHNpemVvZihIRUFERVJfODAyXzExKTsKKwkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKKwkJCQlicmVhazsKKwkJfQorCX0KKwllbHNlIGlmKCBwRnJhbWUtPkZDLlR5cGUgPT0gQlRZUEVfREFUQSApCisJeworCX0KKwllbHNlIGlmKHBGcmFtZS0+RkMuVHlwZSA9PSBCVFlQRV9DTlRMKQorCXsKKwkJc3dpdGNoKHBGcmFtZS0+RkMuU3ViVHlwZSkKKwkJeworCQkJY2FzZSBTVUJUWVBFX0JMT0NLX0FDS19SRVE6CisJCQkJeworCQkJCQlQRlJBTUVfQkFfUkVRIHBCQVJlcSA9IChQRlJBTUVfQkFfUkVRKXBGcmFtZTsKKwkJCQkJKihVU0hPUlQgKikoJnBCQVJlcS0+QkFSQ29udHJvbCkgPSBTV0FQMTYoKihVU0hPUlQgKikoJnBCQVJlcS0+QkFSQ29udHJvbCkpOworCQkJCQlwQkFSZXEtPkJBU3RhcnRpbmdTZXEud29yZCA9IFNXQVAxNihwQkFSZXEtPkJBU3RhcnRpbmdTZXEud29yZCk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBTVUJUWVBFX0JMT0NLX0FDSzoKKwkJCQkvLyBGb3IgQmxvY2sgQWNrIHBhY2tldCwgdGhlIEhUX0NPTlRST0wgZmllbGQgaXMgaW4gdGhlIHNhbWUgb2Zmc2V0IHdpdGggQWRkcjMKKwkJCQkqKFVJTlQzMiAqKSgmcEZyYW1lLT5BZGRyM1swXSkgPSBTV0FQMzIoKihVSU5UMzIgKikoJnBGcmFtZS0+QWRkcjNbMF0pKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTVUJUWVBFX0FDSzoKKwkJCQkvL0ZvciBBQ0sgcGFja2V0LCB0aGUgSFRfQ09OVFJPTCBmaWVsZCBpcyBpbiB0aGUgc2FtZSBvZmZzZXQgd2l0aCBBZGRyMgorCQkJCSooVUlOVDMyICopKCZwRnJhbWUtPkFkZHIyWzBdKT0JU1dBUDMyKCooVUlOVDMyICopKCZwRnJhbWUtPkFkZHIyWzBdKSk7CisJCQkJYnJlYWs7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJJbnZhbGlkIEZyYW1lIFR5cGUhISFcbiIpKTsKKwl9CisKKwkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBGcmFtZSBDb250cm9sCisJaWYoRGlyID09IERJUl9XUklURSkKKwl7CisJCSooVVNIT1JUICopcERhdGEgPSBTV0FQMTYoKihVU0hPUlQgKilwRGF0YSk7CisJfQorfQorI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KKworCitzdGF0aWMgaW5saW5lIFZPSUQgQ29udmVydE11bHRpY2FzdElQMk1BQygKKwlJTiBQVUNIQVIgcElwQWRkciwKKwlJTiBQVUNIQVIgKnBwTWFjQWRkciwKKwlJTiBVSU5UMTYgUHJvdG9UeXBlKQoreworCWlmIChwSXBBZGRyID09IE5VTEwpCisJCXJldHVybjsKKworCWlmIChwcE1hY0FkZHIgPT0gTlVMTCB8fCAqcHBNYWNBZGRyID09IE5VTEwpCisJCXJldHVybjsKKworCXN3aXRjaCAoUHJvdG9UeXBlKQorCXsKKwkJY2FzZSBFVEhfUF9JUFY2OgorLy8JCQltZW1zZXQoKnBwTWFjQWRkciwgMCwgRVRIX0xFTkdUSF9PRl9BRERSRVNTKTsKKwkJCSooKnBwTWFjQWRkcikgPSAweDMzOworCQkJKigqcHBNYWNBZGRyICsgMSkgPSAweDMzOworCQkJKigqcHBNYWNBZGRyICsgMikgPSBwSXBBZGRyWzEyXTsKKwkJCSooKnBwTWFjQWRkciArIDMpID0gcElwQWRkclsxM107CisJCQkqKCpwcE1hY0FkZHIgKyA0KSA9IHBJcEFkZHJbMTRdOworCQkJKigqcHBNYWNBZGRyICsgNSkgPSBwSXBBZGRyWzE1XTsKKwkJCWJyZWFrOworCisJCWNhc2UgRVRIX1BfSVA6CisJCWRlZmF1bHQ6CisvLwkJCW1lbXNldCgqcHBNYWNBZGRyLCAwLCBFVEhfTEVOR1RIX09GX0FERFJFU1MpOworCQkJKigqcHBNYWNBZGRyKSA9IDB4MDE7CisJCQkqKCpwcE1hY0FkZHIgKyAxKSA9IDB4MDA7CisJCQkqKCpwcE1hY0FkZHIgKyAyKSA9IDB4NWU7CisJCQkqKCpwcE1hY0FkZHIgKyAzKSA9IHBJcEFkZHJbMV0gJiAweDdmOworCQkJKigqcHBNYWNBZGRyICsgNCkgPSBwSXBBZGRyWzJdOworCQkJKigqcHBNYWNBZGRyICsgNSkgPSBwSXBBZGRyWzNdOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuOworfQorCitCT09MRUFOIFJUTVBDaGVja0ZvckhhbmcoCisJSU4gIE5ESVNfSEFORExFIE1pbmlwb3J0QWRhcHRlckNvbnRleHQKKwkpOworCitWT0lEICBSVE1QSGFsdCgKKwlJTiAgTkRJU19IQU5ETEUgTWluaXBvcnRBZGFwdGVyQ29udGV4dAorCSk7CisKKy8vCisvLyAgUHJpdmF0ZSByb3V0aW5lcyBpbiBydG1wX2luaXQuYworLy8KK05ESVNfU1RBVFVTIFJUTVBBbGxvY0FkYXB0ZXJCbG9jaygKKwlJTiBQVk9JRAkJCWhhbmRsZSwKKwlPVVQgUFJUTVBfQURBUFRFUiAgICpwcEFkYXB0ZXIKKwkpOworCitORElTX1NUQVRVUyBSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZAorCSk7CisKK05ESVNfU1RBVFVTIFJUTVBGaW5kQWRhcHRlcigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTkRJU19IQU5ETEUgICAgIFdyYXBwZXJDb25maWd1cmF0aW9uQ29udGV4dAorCSk7CisKK05ESVNfU1RBVFVTCVJUTVBSZWFkUGFyYW1ldGVyc0hvb2soCisJSU4JUFJUTVBfQURBUFRFUiBwQWQKKwkpOworCitWT0lEIFJUTVBGcmVlQWRhcHRlcigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZAorCSk7CisKK05ESVNfU1RBVFVTIE5JQ1JlYWRSZWdQYXJhbWV0ZXJzKAorCUlOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCwKKwlJTiAgTkRJU19IQU5ETEUgICAgICAgICBXcmFwcGVyQ29uZmlndXJhdGlvbkNvbnRleHQKKwkpOworCisjaWZkZWYgUlQyODcwCitWT0lEIE5JQ0luaXRSVDMweHhSRlJlZ2lzdGVycygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKK1ZPSUQgTklDUmVhZEVFUFJPTVBhcmFtZXRlcnMoCisJSU4gIFBSVE1QX0FEQVBURVIgICAgICAgcEFkLAorCUlOCVBVQ0hBUgkJCQltYWNfYWRkcik7CisKK1ZPSUQgTklDSW5pdEFzaWNGcm9tRUVQUk9NKAorCUlOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCk7CisKK1ZPSUQgTklDSW5pdFR4UnhSaW5nQW5kQmFja2xvZ1F1ZXVlKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworTkRJU19TVEFUVVMgTklDSW5pdGlhbGl6ZUFkYXB0ZXIoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gICBCT09MRUFOICAgIGJIYXJkUmVzZXQpOworCitORElTX1NUQVRVUyBOSUNJbml0aWFsaXplQXNpYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgQk9PTEVBTgkJYkhhcmRSZXNldCk7CisKK1ZPSUQgTklDSXNzdWVSZXNldCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgUlRNUFJpbmdDbGVhblVwKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUiAgICAgICAgICAgUmluZ1R5cGUpOworCitWT0lEIFJ4VGVzdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK05ESVNfU1RBVFVTIERiZ1NlbmRQYWNrZXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBORElTX1BBQ0tFVCAgICBwUGFja2V0KTsKKworVk9JRCBVc2VyQ2ZnSW5pdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgTklDUmVzZXRGcm9tRXJyb3IoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIE5JQ0VyYXNlRmlybXdhcmUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitORElTX1NUQVRVUyBOSUNMb2FkRmlybXdhcmUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitORElTX1NUQVRVUyBOSUNMb2FkUmF0ZVN3aXRjaGluZ1BhcmFtcygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK0JPT0xFQU4gTklDQ2hlY2tGb3JIYW5nKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIE5JQ1VwZGF0ZVJhd0NvdW50ZXJzKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworI2lmIDAKK1VMT05HIFJUTVBFcXVhbE1lbW9yeSgKKwlJTiAgUFZPSUQgICBwU3JjMSwKKwlJTiAgUFZPSUQgICBwU3JjMiwKKwlJTiAgVUxPTkcgICBMZW5ndGgpOworI2VuZGlmCisKK1VMT05HCVJUTVBOb3RBbGxaZXJvKAorCUlOCVBWT0lECXBTcmMxLAorCUlOCVVMT05HCUxlbmd0aCk7CisKK1ZPSUQgUlRNUFplcm9NZW1vcnkoCisJSU4gIFBWT0lEICAgcFNyYywKKwlJTiAgVUxPTkcgICBMZW5ndGgpOworCitVTE9ORyBSVE1QQ29tcGFyZU1lbW9yeSgKKwlJTiAgUFZPSUQgICBwU3JjMSwKKwlJTiAgUFZPSUQgICBwU3JjMiwKKwlJTiAgVUxPTkcgICBMZW5ndGgpOworCitWT0lEIFJUTVBNb3ZlTWVtb3J5KAorCU9VVCBQVk9JRCAgIHBEZXN0LAorCUlOICBQVk9JRCAgIHBTcmMsCisJSU4gIFVMT05HICAgTGVuZ3RoKTsKKworVk9JRCBBdG9IKAorCWNoYXIJKnNyYywKKwlVQ0hBUgkqZGVzdCwKKwlpbnQJCWRlc3RsZW4pOworCitVQ0hBUiBCdG9IKAorCWNoYXIgY2gpOworCitWT0lEIFJUTVBQYXRjaE1hY0JicEJ1ZygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgUlRNUFBhdGNoQ2FyZEJ1cygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyKTsKKworVk9JRCBSVE1QUGF0Y2hSYWxpbmtDYXJkQnVzKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4JVUxPTkcJCQlCdXMpOworCitVTE9ORyBSVE1QUmVhZENCQ29uZmlnKAorCUlOCVVMT05HCUJ1cywKKwlJTglVTE9ORwlTbG90LAorCUlOCVVMT05HCUZ1bmMsCisJSU4JVUxPTkcJT2Zmc2V0KTsKKworVk9JRCBSVE1QV3JpdGVDQkNvbmZpZygKKwlJTglVTE9ORwlCdXMsCisJSU4JVUxPTkcJU2xvdCwKKwlJTglVTE9ORwlGdW5jLAorCUlOCVVMT05HCU9mZnNldCwKKwlJTglVTE9ORwlWYWx1ZSk7CisKK1ZPSUQgUlRNUEluaXRUaW1lcigKKwlJTiAgUFJUTVBfQURBUFRFUiAgICAgICAgICAgcEFkLAorCUlOICBQUkFMSU5LX1RJTUVSX1NUUlVDVCAgICBwVGltZXIsCisJSU4gIFBWT0lEICAgICAgICAgICAgICAgICAgIHBUaW1lckZ1bmMsCisJSU4JUFZPSUQJCQkJCXBEYXRhLAorCUlOICBCT09MRUFOICAgICAgICAgICAgICAgICBSZXBlYXQpOworCitWT0lEIFJUTVBTZXRUaW1lcigKKwlJTiAgUFJBTElOS19USU1FUl9TVFJVQ1QgICAgcFRpbWVyLAorCUlOICBVTE9ORyAgICAgICAgICAgICAgICAgICBWYWx1ZSk7CisKKworVk9JRCBSVE1QTW9kVGltZXIoCisJSU4JUFJBTElOS19USU1FUl9TVFJVQ1QJcFRpbWVyLAorCUlOCVVMT05HCQkJCQlWYWx1ZSk7CisKK1ZPSUQgUlRNUENhbmNlbFRpbWVyKAorCUlOICBQUkFMSU5LX1RJTUVSX1NUUlVDVCAgICBwVGltZXIsCisJT1VUIEJPT0xFQU4gICAgICAgICAgICAgICAgICpwQ2FuY2VsbGVkKTsKKworVk9JRCBSVE1QU2V0TEVEKAorCUlOIFBSVE1QX0FEQVBURVIgCXBBZCwKKwlJTiBVQ0hBUgkJCVN0YXR1cyk7CisKK1ZPSUQgUlRNUFNldFNpZ25hbExFRCgKKwlJTiBQUlRNUF9BREFQVEVSIAlwQWQsCisJSU4gTkRJU184MDJfMTFfUlNTSSBEYm0pOworCitWT0lEIFJUTVBFbmFibGVSeFR4KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworLy8KKy8vIHByb3RvdHlwZSBpbiBhY3Rpb24uYworLy8KK1ZPSUQgQWN0aW9uU3RhdGVNYWNoaW5lSW5pdCgKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiAgU1RBVEVfTUFDSElORSAqUywKKyAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCitWT0lEIE1sbWVBRERCQUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIE1sbWVERUxCQUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIE1sbWVETFNBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBNbG1lSW52YWxpZEFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIE1sbWVRT1NBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVk9JRCBQZWVyQWRkQkFSZXFBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyQWRkQkFSc3BBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyRGVsQkFBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyQkFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBTZW5kUFNNUEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBVQ0hBUgkJCVdjaWQsCisJSU4gVUNIQVIJCQlQc21wKTsKKworCisjaWZkZWYgRE9UMTFOX0RSQUZUMworVk9JRCBTZW5kQlNTMjA0MENvZXhpc3RNZ210QWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCVdjaWQsCisJSU4JVUNIQVIJYXBpZHgsCisJSU4JVUNIQVIJSW5mb1JlcSk7CisKK1ZPSUQgU2VuZE5vdGlmeUJXQWN0aW9uRnJhbWUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgIFdjaWQsCisJSU4gVUNIQVIgYXBpZHgpOworCitCT09MRUFOIENoYW5uZWxTd2l0Y2hTYW5pdHlDaGVjaygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgICBVQ0hBUiAgV2NpZCwKKwlJTiAgICBVQ0hBUiAgTmV3Q2hhbm5lbCwKKwlJTiAgICBVQ0hBUiAgU2Vjb25kYXJ5KTsKKworVk9JRCBDaGFubmVsU3dpdGNoQWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICAgIFVDSEFSICBXY2lkLAorCUlOICAgIFVDSEFSICBDaGFubmVsLAorCUlOICAgIFVDSEFSICBTZWNvbmRhcnkpOworCitVTE9ORyBCdWlsZEludG9sZXJhbnRDaGFubmVsUmVwKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICAgIFBVQ0hBUiAgcERlc3QpOworCitWT0lEIFVwZGF0ZTIwNDBDb2V4aXN0RnJhbWVBbmROb3RpZnkoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gICAgVUNIQVIgIFdjaWQsCisJSU4JQk9PTEVBTgliQWRkSW50b2xlcmFudENoYSk7CisKK1ZPSUQgU2VuZDIwNDBDb2V4aXN0QWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICAgIFVDSEFSICBXY2lkLAorCUlOCUJPT0xFQU4JYkFkZEludG9sZXJhbnRDaGEpOworI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKworVk9JRCBQZWVyUk1BY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyUHVibGljQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK1ZPSUQgU3RhUHVibGljQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSIEJzczIwNDBDb2V4aXN0KTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCitWT0lEIFBlZXJCU1NUcmFuQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK1ZPSUQgUGVlckhUQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK1ZPSUQgUGVlclFPU0FjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCitWT0lEIFBlZXJETFNBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorVk9JRCBEbHNQYXJtRmlsbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBPVVQgTUxNRV9ETFNfUkVRX1NUUlVDVCAqcERsc1JlcSwKKwlJTiBQUlRfODAyXzExX0RMUyBwRGxzLAorCUlOIFVTSE9SVCByZWFzb24pOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitWT0lEIFJFQ0JBVGltZXJUaW1lb3V0KAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKyAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgT1JJQkFUaW1lclRpbWVvdXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIFNlbmRSZWZyZXNoQkFSKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5KTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBBY3RIZWFkZXJJbml0KAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorICAgIElOIE9VVCBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCisgICAgSU4gUFVDSEFSIEFkZHIxLAorICAgIElOIFBVQ0hBUiBBZGRyMiwKKyAgICBJTiBQVUNIQVIgQWRkcjMpOworCitWT0lEIEJhckhlYWRlckluaXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gT1VUIFBGUkFNRV9CQVIgcENudGxCYXIsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBQVUNIQVIgcFNBKTsKKworVk9JRCBJbnNlcnRBY3RGaWVsZCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKKwlPVVQgUFVMT05HIHBGcmFtZUxlbiwKKwlJTiBVSU5UOCBDYXRlZ29yeSwKKwlJTiBVSU5UOCBBY3RDb2RlKTsKKworQk9PTEVBTiBRb3NCQURhdGFQYXJzZSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBCT09MRUFOIGJBTVNEVSwKKwlJTiBQVUNIQVIgcDgwMjNIZWFkZXIsCisJSU4gVUNIQVIJV0NJRCwKKwlJTiBVQ0hBUglUSUQsCisJSU4gVVNIT1JUIFNlcXVlbmNlLAorCUlOIFVDSEFSIERhdGFPZmZzZXQsCisJSU4gVVNIT1JUIERhdGFzaXplLAorCUlOIFVJTlQgICBDdXJSeEluZGV4KTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorQk9PTEVBTiBDbnRsRW5xdWV1ZUZvclJlY3YoCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVUxPTkcgV2NpZCwKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisJSU4gUEZSQU1FX0JBX1JFUSBwTXNnKTsKKworVk9JRCBCYUF1dG9NYW5Td2l0Y2goCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitWT0lEIEhUSU9UQ2hlY2soCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gICAgVUNIQVIgICAgIEJhdFJlY0lkeCk7CisKKy8vCisvLyBQcml2YXRlIHJvdXRpbmVzIGluIHJ0bXBfZGF0YS5jCisvLworQk9PTEVBTiBSVE1QSGFuZGxlUnhEb25lSW50ZXJydXB0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBSVE1QSGFuZGxlVHhEb25lSW50ZXJydXB0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworQk9PTEVBTiBSVE1QSGFuZGxlVHhSaW5nRG1hRG9uZUludGVycnVwdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgSU5UX1NPVVJDRV9DU1JfU1RSVUMgVHhSaW5nQml0bWFwKTsKKworVk9JRCBSVE1QSGFuZGxlTWdtdFJpbmdEbWFEb25lSW50ZXJydXB0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBSVE1QSGFuZGxlVEJUVEludGVycnVwdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgUlRNUEhhbmRsZVByZVRCVFRJbnRlcnJ1cHQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCit2b2lkIFJUTVBIYW5kbGVUd2FrZXVwSW50ZXJydXB0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRAlSVE1QSGFuZGxlUnhDb2hlcmVudEludGVycnVwdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK0JPT0xFQU4gVHhGcmFtZUlzQWdncmVnYXRpYmxlKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcFByZXZBZGRyMSwKKwlJTiAgUFVDSEFSICAgICAgICAgIHA4MDIzaGRyKTsKKworQk9PTEVBTiBQZWVySXNBZ2dyZU9uKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBVTE9ORyAgICAgICAgICBUeFJhdGUsCisgICAgSU4gIFBNQUNfVEFCTEVfRU5UUlkgcE1hY0VudHJ5KTsKKworI2lmIDAJLy8gSXQncyBub3QgYmUgdXNlZAorSFRUUkFOU01JVF9TRVRUSU5HICAqR2V0VHhNb2RlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGspOworI2VuZGlmCisKK05ESVNfU1RBVFVTIFNuaWZmMkJ5dGVzRnJvbU5kaXNCdWZmZXIoCisJSU4gIFBORElTX0JVRkZFUiAgICBwRmlyc3RCdWZmZXIsCisJSU4gIFVDSEFSICAgICAgICAgICBEZXNpcmVkT2Zmc2V0LAorCU9VVCBQVUNIQVIgICAgICAgICAgcEJ5dGUwLAorCU9VVCBQVUNIQVIgICAgICAgICAgcEJ5dGUxKTsKKworTkRJU19TVEFUVVMgU1RBU2VuZFBhY2tldCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQpOworCitWT0lEIFNUQVNlbmRQYWNrZXRzKAorCUlOICBORElTX0hBTkRMRSAgICAgTWluaXBvcnRBZGFwdGVyQ29udGV4dCwKKwlJTiAgUFBORElTX1BBQ0tFVCAgIHBwUGFja2V0QXJyYXksCisJSU4gIFVJTlQgICAgICAgICAgICBOdW1iZXJPZlBhY2tldHMpOworCitWT0lEIFJUTVBEZVF1ZXVlUGFja2V0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgCUlOCUJPT0xFQU4JCQliSW50Q29udGV4dCwKKwlJTiAgVUNIQVIJCQlRdWVJZHgsCisJSU4JVUNIQVIJCQlNYXhfVHhfUGFja2V0cyk7CisKK05ESVNfU1RBVFVTCVJUTVBIYXJkVHJhbnNtaXQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gUE5ESVNfUEFDS0VUCQlwUGFja2V0LAorCUlOICBVQ0hBUgkJCVF1ZUlkeCwKKwlPVVQJUFVMT05HCQkJcEZyZWVUWERMZWZ0KTsKKworTkRJU19TVEFUVVMJU1RBSGFyZFRyYW5zbWl0KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFRYX0JMSwkJCSpwVHhCbGssCisJSU4gIFVDSEFSCQkJUXVlSWR4KTsKKworVk9JRCBTVEFSeEVBUE9MRnJhbWVJbmRpY2F0ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCitORElTX1NUQVRVUyBSVE1QRnJlZVRYRFJlcXVlc3QoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSICAgICAgICAgICBSaW5nVHlwZSwKKwlJTiAgVUNIQVIgICAgICAgICAgIE51bWJlclJlcXVpcmVkLAorCUlOIAlQVUNIQVIgICAgICAgICAgRnJlZU51bWJlcklzKTsKKworTkRJU19TVEFUVVMgTWxtZUhhcmRUcmFuc21pdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIJUXVlSWR4LAorCUlOICBQTkRJU19QQUNLRVQgICAgcFBhY2tldCk7CisKK05ESVNfU1RBVFVTIE1sbWVIYXJkVHJhbnNtaXRNZ210UmluZygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIJUXVlSWR4LAorCUlOICBQTkRJU19QQUNLRVQgICAgcFBhY2tldCk7CisKK05ESVNfU1RBVFVTIE1sbWVIYXJkVHJhbnNtaXRUeFJpbmcoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSCVF1ZUlkeCwKKwlJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQpOworCitVU0hPUlQgIFJUTVBDYWxjRHVyYXRpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSICAgICAgICAgICBSYXRlLAorCUlOICBVTE9ORyAgICAgICAgICAgU2l6ZSk7CisKK1ZPSUQgUlRNUFdyaXRlVHhXSSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVFhXSV9TVFJVQwkJcFR4V0ksCisJSU4gIEJPT0xFQU4gICAgCQlGUkFHLAorCUlOICBCT09MRUFOICAgIAkJQ0ZBQ0ssCisJSU4gIEJPT0xFQU4gICAgCQlJbnNUaW1lc3RhbXAsCisJSU4JQk9PTEVBTgkJCUFNUERVLAorCUlOCUJPT0xFQU4JCQlBY2ssCisJSU4JQk9PTEVBTgkJCU5TZXEsCQkvLyBIVyBuZXcgYSBzZXF1ZW5jZS4KKwlJTglVQ0hBUgkJCUJBU2l6ZSwKKwlJTglVQ0hBUgkJCVdDSUQsCisJSU4JVUxPTkcJCQlMZW5ndGgsCisJSU4gIFVDSEFSICAgICAgCQlQSUQsCisJSU4JVUNIQVIJCQlUSUQsCisJSU4JVUNIQVIJCQlUeFJhdGUsCisJSU4JVUNIQVIJCQlUeG9wbW9kZSwKKwlJTglCT09MRUFOCQkJQ2ZBY2ssCisJSU4JSFRUUkFOU01JVF9TRVRUSU5HCSpwVHJhbnNtaXQpOworCisKK1ZPSUQgUlRNUFdyaXRlVHhXSV9EYXRhKAorCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTglPVVQgUFRYV0lfU1RSVUMJCXBUeFdJLAorCUlOCVRYX0JMSwkJCQkqcFR4QmxrKTsKKworCitWT0lEIFJUTVBXcml0ZVR4V0lfQ2FjaGUoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCU9VVCBQVFhXSV9TVFJVQwkJcFR4V0ksCisJSU4JVFhfQkxLCQkJCSpwVHhCbGspOworCitWT0lEIFJUTVBXcml0ZVR4RGVzY3JpcHRvcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVFhEX1NUUlVDCQlwVHhELAorCUlOCUJPT0xFQU4JCQliV0lWLAorCUlOCVVDSEFSCQkJUVNFTCk7CisKK1ZPSUQgUlRNUFN1c3BlbmRNc2R1VHJhbnNtaXNzaW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBSVE1QUmVzdW1lTXNkdVRyYW5zbWlzc2lvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK05ESVNfU1RBVFVTIE1pbmlwb3J0TU1SZXF1ZXN0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCVVDSEFSCQkJUXVlSWR4LAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOICBVSU5UICAgICAgICAgICAgTGVuZ3RoKTsKKworTkRJU19TVEFUVVMgTWluaXBvcnREYXRhTU1SZXF1ZXN0KAorCSBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwkgSU4gIFVDSEFSICAgICAgICAgICBRdWVJZHgsCisJIElOICBQVUNIQVIgICAgICAgICAgcERhdGEsCisJIElOICBVSU5UICAgICAgICAgICAgTGVuZ3RoKTsKKworVk9JRCBSVE1QU2VuZE51bGxGcmFtZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIgICAgICAgICAgIFR4UmF0ZSwKKwlJTglCT09MRUFOCQkJYlFvc051bGwpOworCitWT0lEIFJUTVBTZW5kRGlzYXNzb2NpYXRpb25GcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgUlRNUFNlbmRSVFNGcmFtZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEQSwKKwlJTgl1bnNpZ25lZCBpbnQJTmV4dE1wZHVTaXplLAorCUlOICBVQ0hBUiAgICAgICAgICAgVHhSYXRlLAorCUlOICBVQ0hBUiAgICAgICAgICAgUlRTUmF0ZSwKKwlJTiAgVVNIT1JUICAgICAgICAgIEFja0R1cmF0aW9uLAorCUlOICBVQ0hBUiAgICAgICAgICAgUXVlSWR4LAorCUlOICBVQ0hBUgkJCUZyYW1lR2FwKTsKKworCitORElTX1NUQVRVUyBSVE1QQXBwbHlQYWNrZXRGaWx0ZXIoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBSVDI4WFhfUlhEX1NUUlVDICAgICAgcFJ4RCwKKwlJTiAgUEhFQURFUl84MDJfMTEgIHBIZWFkZXIpOworCitQUVVFVUVfSEVBREVSICAgUlRNUENoZWNrVHhTd1F1ZXVlKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCU9VVCBVQ0hBUiAgICAgICAgICAgKlF1ZUlkeCk7CisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKK1ZPSUQgUlRNUFJlcG9ydE1pY0Vycm9yKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQQ0lQSEVSX0tFWSAgICAgcFdwYUtleSk7CisKK1ZPSUQJV3BhTWljRmFpbHVyZVJlcG9ydEZyYW1lKAorCUlOICBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgICBXcGFEaXNhc3NvY0FwQW5kQmxvY2tBc3NvYygKKyAgICBJTiAgUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOICBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisgICAgSU4gIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKyAgICBJTiAgUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworTkRJU19TVEFUVVMgUlRNUENsb25lTmRpc1BhY2tldCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTglCT09MRUFOICAgIHBJbnNBTVNEVUhkciwKKwlJTiAgUE5ESVNfUEFDS0VUICAgIHBJblBhY2tldCwKKwlPVVQgUE5ESVNfUEFDS0VUICAgKnBwT3V0UGFja2V0KTsKKworTkRJU19TVEFUVVMgUlRNUEFsbG9jYXRlTmRpc1BhY2tldCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUE5ESVNfUEFDS0VUICAgICpwUGFja2V0LAorCUlOICBQVUNIQVIgICAgICAgICAgcEhlYWRlciwKKwlJTiAgVUlOVCAgICAgICAgICAgIEhlYWRlckxlbiwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEYXRhLAorCUlOICBVSU5UICAgICAgICAgICAgRGF0YUxlbik7CisKK1ZPSUQgUlRNUEZyZWVOZGlzUGFja2V0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQTkRJU19QQUNLRVQgICAgcFBhY2tldCk7CisKK0JPT0xFQU4gUlRNUEZyZWVUWERVcG9uVHhEbWFEb25lKAorCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCUlOIFVDSEFSICAgICAgICAgICAgUXVlSWR4KTsKKworQk9PTEVBTiBSVE1QQ2hlY2tESENQRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpOworCisKK0JPT0xFQU4gUlRNUENoZWNrRXRoZXJUeXBlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KTsKKworCitWT0lEIFJUTVBDY2tCYnBUdW5pbmcoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUlOVAkJCVR4UmF0ZSk7CisKKy8vCisvLyBQcml2YXRlIHJvdXRpbmVzIGluIHJ0bXBfd2VwLmMKKy8vCitWT0lEIFJUTVBJbml0V2VwRW5naW5lKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcEtleSwKKwlJTiAgVUNIQVIgICAgICAgICAgIEtleUlkLAorCUlOICBVQ0hBUiAgICAgICAgICAgS2V5TGVuLAorCUlOICBQVUNIQVIgICAgICAgICAgcERlc3QpOworCitWT0lEIFJUTVBFbmNyeXB0RGF0YSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBTcmMsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRGVzdCwKKwlJTiAgVUlOVCAgICAgICAgICAgIExlbik7CisKK0JPT0xFQU4JUlRNUERlY3J5cHREYXRhKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4JUFVDSEFSCQkJcFNyYywKKwlJTglVSU5UCQkJTGVuLAorCUlOCVVJTlQJCQlpZHgpOworCitCT09MRUFOCVJUTVBTb2Z0RGVjcnlwdFdFUCgKKwlJTiBQUlRNUF9BREFQVEVSIAlwQWQsCisJSU4gUFVDSEFSCQkJcERhdGEsCisJSU4gVUxPTkcJCQlEYXRhQnl0ZUNudCwKKwlJTiBQQ0lQSEVSX0tFWQkJcEdyb3VwS2V5KTsKKworVk9JRCBSVE1QU2V0SUNWKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcERlc3QpOworCitWT0lEIEFSQ0ZPVVJfSU5JVCgKKwlJTiAgUEFSQ0ZPVVJDT05URVhUIEN0eCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBLZXksCisJSU4gIFVJTlQgICAgICAgICAgICBLZXlMZW4pOworCitVQ0hBUiAgIEFSQ0ZPVVJfQllURSgKKwlJTiAgUEFSQ0ZPVVJDT05URVhUICAgICBDdHgpOworCitWT0lEIEFSQ0ZPVVJfREVDUllQVCgKKwlJTiAgUEFSQ0ZPVVJDT05URVhUIEN0eCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEZXN0LAorCUlOICBQVUNIQVIgICAgICAgICAgcFNyYywKKwlJTiAgVUlOVCAgICAgICAgICAgIExlbik7CisKK1ZPSUQgQVJDRk9VUl9FTkNSWVBUKAorCUlOICBQQVJDRk9VUkNPTlRFWFQgQ3R4LAorCUlOICBQVUNIQVIgICAgICAgICAgcERlc3QsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwU3JjLAorCUlOICBVSU5UICAgICAgICAgICAgTGVuKTsKKworVk9JRCBXUEFBUkNGT1VSX0VOQ1JZUFQoCisJSU4gIFBBUkNGT1VSQ09OVEVYVCBDdHgsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRGVzdCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBTcmMsCisJSU4gIFVJTlQgICAgICAgICAgICBMZW4pOworCitVSU5UIFJUTVBfQ0FMQ19GQ1MzMigKKwlJTiAgVUlOVCAgIEZjcywKKwlJTiAgUFVDSEFSICBDcCwKKwlJTiAgSU5UICAgICBMZW4pOworCisvLworLy8gTUxNRSByb3V0aW5lcworLy8KKworLy8gQXNpYy9SRi9CQlAgcmVsYXRlZCBmdW5jdGlvbnMKKworVk9JRCBBc2ljQWRqdXN0VHhQb3dlcigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgCUFzaWNVcGRhdGVQcm90ZWN0KAorCUlOCQlQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAJCVVTSE9SVAkJCU9wZXJhaW9uTW9kZSwKKwlJTiAJCVVDSEFSCQkJU2V0TWFzaywKKwlJTgkJQk9PTEVBTgkJCWJEaXNhYmxlQkdQcm90ZWN0LAorCUlOCQlCT09MRUFOCQkJYk5vbkdGRXhpc3QpOworCitWT0lEIEFzaWNTd2l0Y2hDaGFubmVsKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCVVDSEFSCQkJQ2hhbm5lbCwKKwlJTglCT09MRUFOCQkJYlNjYW4pOworCitWT0lEIEFzaWNMb2NrQ2hhbm5lbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiBDaGFubmVsKSA7CisKK1ZPSUQgQXNpY0FudGVubmFTZWxlY3QoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSICAgICAgICAgICBDaGFubmVsKTsKKworVk9JRCBBc2ljQW50ZW5uYVNldHRpbmcoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JQUJHQkFORF9TVEFURQlCYW5kU3RhdGUpOworCitWT0lEIEFzaWNSZlR1bmluZ0V4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorVk9JRCBBc2ljU2xlZXBUaGVuQXV0b1dha2V1cCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVVNIT1JUIFRidHROdW1Ub05leHRXYWtlVXApOworCitWT0lEIEFzaWNGb3JjZVNsZWVwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBBc2ljRm9yY2VXYWtldXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gQk9PTEVBTiAgICBiRnJvbVR4KTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworVk9JRCBBc2ljU2V0QnNzaWQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiBwQnNzaWQpOworCitWT0lEIEFzaWNTZXRNY2FzdFdDKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworI2lmIDAJLy8gcmVtb3ZlZCBieSBBbGJlcnRZCitWT0lEIEFzaWNTZXRCc3NpZFdDKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBwQnNzaWQpOworI2VuZGlmCisKK1ZPSUQgQXNpY0RlbFdjaWRUYWIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIJV2NpZCk7CisKK1ZPSUQgQXNpY0VuYWJsZVJERygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgQXNpY0Rpc2FibGVSREcoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIEFzaWNEaXNhYmxlU3luYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgQXNpY0VuYWJsZUJzc1N5bmMoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIEFzaWNFbmFibGVJYnNzU3luYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgQXNpY1NldEVkY2FQYXJtKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBFRENBX1BBUk0gICAgcEVkY2FQYXJtKTsKKworVk9JRCBBc2ljU2V0U2xvdFRpbWUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gQk9PTEVBTiBiVXNlU2hvcnRTbG90VGltZSk7CisKKyNpZiAwCitWT0lEIEFzaWNBZGRXY2lkQ2lwaGVyRW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIJCSBXQ0lELAorCUlOIFVDSEFSCQkgQnNzSW5kZXgsCisJSU4gVUNIQVIJCSBLZXlUYWJsZSwKKwlJTiBVQ0hBUgkJIENpcGhlckFsZywKKwlJTiBQVUNIQVIJCSBwQWRkciwKKwlJTiBDSVBIRVJfS0VZCQkgKnBDaXBoZXJLZXkpOworI2VuZGlmCisKK1ZPSUQgQXNpY0FkZFNoYXJlZEtleUVudHJ5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSICAgICAgICAgQnNzSW5kZXgsCisJSU4gVUNIQVIgICAgICAgICBLZXlJZHgsCisJSU4gVUNIQVIgICAgICAgICBDaXBoZXJBbGcsCisJSU4gUFVDSEFSICAgICAgICBwS2V5LAorCUlOIFBVQ0hBUiAgICAgICAgcFR4TWljLAorCUlOIFBVQ0hBUiAgICAgICAgcFJ4TWljKTsKKworVk9JRCBBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIgICAgICAgICBCc3NJbmRleCwKKwlJTiBVQ0hBUiAgICAgICAgIEtleUlkeCk7CisKK1ZPSUQgQXNpY1VwZGF0ZVdDSURBdHRyaWJ1dGUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUCQlXQ0lELAorCUlOIFVDSEFSCQlCc3NJbmRleCwKKwlJTiBVQ0hBUiAgICAgICAgQ2lwaGVyQWxnLAorCUlOIEJPT0xFQU4JCWJVc2VQYWlyZXdpc2VLZXlUYWJsZSk7CisKK1ZPSUQgQXNpY1VwZGF0ZVdDSURJVkVJVigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQJCVdDSUQsCisJSU4gVUxPTkcgICAgICAgIHVJViwKKwlJTiBVTE9ORyAgICAgICAgdUVJVik7CisKK1ZPSUQgQXNpY1VwZGF0ZVJ4V0NJRFRhYmxlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVAkJV0NJRCwKKwlJTiBQVUNIQVIgICAgICAgIHBBZGRyKTsKKworVk9JRCBBc2ljQWRkS2V5RW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUCQlXQ0lELAorCUlOIFVDSEFSCQlCc3NJbmRleCwKKwlJTiBVQ0hBUgkJS2V5SWR4LAorCUlOIFBDSVBIRVJfS0VZCXBDaXBoZXJLZXksCisJSU4gQk9PTEVBTgkJYlVzZVBhaXJld2lzZUtleVRhYmxlLAorCUlOIEJPT0xFQU4JCWJUeEtleSk7CisKK1ZPSUQgQXNpY0FkZFBhaXJ3aXNlS2V5RW50cnkoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSICAgICAgICBwQWRkciwKKwlJTiBVQ0hBUgkJV0NJRCwKKwlJTiBDSVBIRVJfS0VZCQkgKnBDaXBoZXJLZXkpOworCitWT0lEIEFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KAorCUlOIFBSVE1QX0FEQVBURVIgIHBBZCwKKwlJTiBVQ0hBUgkJIEJzc0lkeCwKKwlJTiBVQ0hBUgkJIFdjaWQpOworCitCT09MRUFOIEFzaWNTZW5kQ29tbWFuZFRvTWN1KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSICAgICAgICAgQ29tbWFuZCwKKwlJTiBVQ0hBUiAgICAgICAgIFRva2VuLAorCUlOIFVDSEFSICAgICAgICAgQXJnMCwKKwlJTiBVQ0hBUiAgICAgICAgIEFyZzEpOworCisKK1ZPSUQgTWFjQWRkclJhbmRvbUJzc2lkKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCU9VVCBQVUNIQVIgcEFkZHIpOworCitWT0lEIE1ndE1hY0hlYWRlckluaXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICAgIHBBZCwKKwlJTiBPVVQgUEhFQURFUl84MDJfMTEgcEhkcjgwMjExLAorCUlOIFVDSEFSIFN1YlR5cGUsCisJSU4gVUNIQVIgVG9EcywKKwlJTiBQVUNIQVIgcERBLAorCUlOIFBVQ0hBUiBwQnNzaWQpOworCitWT0lEIE1sbWVSYWRpb09mZigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgTWxtZVJhZGlvT24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCisKK1ZPSUQgQnNzVGFibGVJbml0KAorCUlOIEJTU19UQUJMRSAqVGFiKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVk9JRCBCQVRhYmxlSW5pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBCQV9UQUJMRSAqVGFiKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVUxPTkcgQnNzVGFibGVTZWFyY2goCisJSU4gQlNTX1RBQkxFICpUYWIsCisJSU4gUFVDSEFSIHBCc3NpZCwKKwlJTiBVQ0hBUiBDaGFubmVsKTsKKworVUxPTkcgQnNzU3NpZFRhYmxlU2VhcmNoKAorCUlOIEJTU19UQUJMRSAqVGFiLAorCUlOIFBVQ0hBUiAgICBwQnNzaWQsCisJSU4gUFVDSEFSICAgIHBTc2lkLAorCUlOIFVDSEFSICAgICBTc2lkTGVuLAorCUlOIFVDSEFSICAgICBDaGFubmVsKTsKKworVUxPTkcgQnNzVGFibGVTZWFyY2hXaXRoU1NJRCgKKwlJTiBCU1NfVEFCTEUgKlRhYiwKKwlJTiBQVUNIQVIgICAgQnNzaWQsCisJSU4gUFVDSEFSICAgIHBTc2lkLAorCUlOIFVDSEFSICAgICBTc2lkTGVuLAorCUlOIFVDSEFSICAgICBDaGFubmVsKTsKKworVk9JRCBCc3NUYWJsZURlbGV0ZUVudHJ5KAorCUlOIE9VVCAgUEJTU19UQUJMRSBwVGFiLAorCUlOICAgICAgUFVDSEFSIHBCc3NpZCwKKwlJTiAgICAgIFVDSEFSIENoYW5uZWwpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitWT0lEIEJBVGFibGVEZWxldGVPUklFbnRyeSgKKwlJTiBPVVQJUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JCUJBX09SSV9FTlRSWQkqcEJBT1JJRW50cnkpOworCitWT0lEIEJBVGFibGVEZWxldGVSRUNFbnRyeSgKKwlJTiBPVVQJUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JCUJBX1JFQ19FTlRSWQkqcEJBUkVDRW50cnkpOworCitWT0lEIEJBVGFibGVUZWFyT1JJRW50cnkoCisJSU4gT1VUCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCQlVQ0hBUiBUSUQsCisJSU4JCVVDSEFSIFdjaWQsCisJSU4JCUJPT0xFQU4gYkZvcmNlRGVsZXRlLAorCUlOCQlCT09MRUFOIEFMTCk7CisKK1ZPSUQgQkFUYWJsZVRlYXJSRUNFbnRyeSgKKwlJTiBPVVQJUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JCVVDSEFSIFRJRCwKKwlJTgkJVUNIQVIgV0NJRCwKKwlJTgkJQk9PTEVBTiBBTEwpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitWT0lEICBCc3NFbnRyeVNldCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlPVVQgUEJTU19FTlRSWSBwQnNzLAorCUlOIFBVQ0hBUiBwQnNzaWQsCisJSU4gQ0hBUiBTc2lkW10sCisJSU4gVUNIQVIgU3NpZExlbiwKKwlJTiBVQ0hBUiBCc3NUeXBlLAorCUlOIFVTSE9SVCBCZWFjb25QZXJpb2QsCisJSU4gUENGX1BBUk0gQ2ZQYXJtLAorCUlOIFVTSE9SVCBBdGltV2luLAorCUlOIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKKwlJTiBVQ0hBUiBTdXBSYXRlW10sCisJSU4gVUNIQVIgU3VwUmF0ZUxlbiwKKwlJTiBVQ0hBUiBFeHRSYXRlW10sCisJSU4gVUNIQVIgRXh0UmF0ZUxlbiwKKwlJTiBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAorCUlOIEFERF9IVF9JTkZPX0lFICpwQWRkSHRJbmZvLAkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKwlJTiBVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbiwKKwlJTiBVQ0hBUgkJCUFkZEh0SW5mb0xlbiwKKwlJTiBVQ0hBUgkJCU5ld0V4dENoYW5PZmZzZXQsCisJSU4gVUNIQVIgQ2hhbm5lbCwKKwlJTiBDSEFSIFJzc2ksCisJSU4gTEFSR0VfSU5URUdFUiBUaW1lU3RhbXAsCisJSU4gVUNIQVIgQ2tpcEZsYWcsCisJSU4gUEVEQ0FfUEFSTSBwRWRjYVBhcm0sCisJSU4gUFFPU19DQVBBQklMSVRZX1BBUk0gcFFvc0NhcGFiaWxpdHksCisJSU4gUFFCU1NfTE9BRF9QQVJNIHBRYnNzTG9hZCwKKwlJTiBVU0hPUlQgTGVuZ3RoVklFLAorCUlOIFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMgcFZJRSk7CisKK1VMT05HICBCc3NUYWJsZVNldEVudHJ5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCU9VVCBQQlNTX1RBQkxFIHBUYWIsCisJSU4gUFVDSEFSIHBCc3NpZCwKKwlJTiBDSEFSIFNzaWRbXSwKKwlJTiBVQ0hBUiBTc2lkTGVuLAorCUlOIFVDSEFSIEJzc1R5cGUsCisJSU4gVVNIT1JUIEJlYWNvblBlcmlvZCwKKwlJTiBDRl9QQVJNICpDZlBhcm0sCisJSU4gVVNIT1JUIEF0aW1XaW4sCisJSU4gVVNIT1JUIENhcGFiaWxpdHlJbmZvLAorCUlOIFVDSEFSIFN1cFJhdGVbXSwKKwlJTiBVQ0hBUiBTdXBSYXRlTGVuLAorCUlOIFVDSEFSIEV4dFJhdGVbXSwKKwlJTiBVQ0hBUiBFeHRSYXRlTGVuLAorCUlOIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCisJSU4gQUREX0hUX0lORk9fSUUgKnBBZGRIdEluZm8sCS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQorCUlOIFVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuLAorCUlOIFVDSEFSCQkJQWRkSHRJbmZvTGVuLAorCUlOIFVDSEFSCQkJTmV3RXh0Q2hhbk9mZnNldCwKKwlJTiBVQ0hBUiBDaGFubmVsLAorCUlOIENIQVIgUnNzaSwKKwlJTiBMQVJHRV9JTlRFR0VSIFRpbWVTdGFtcCwKKwlJTiBVQ0hBUiBDa2lwRmxhZywKKwlJTiBQRURDQV9QQVJNIHBFZGNhUGFybSwKKwlJTiBQUU9TX0NBUEFCSUxJVFlfUEFSTSBwUW9zQ2FwYWJpbGl0eSwKKwlJTiBQUUJTU19MT0FEX1BBUk0gcFFic3NMb2FkLAorCUlOIFVTSE9SVCBMZW5ndGhWSUUsCisJSU4gUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcyBwVklFKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVk9JRCBCQVRhYmxlSW5zZXJ0RW50cnkoCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVVNIT1JUIEFpZCwKKyAgICBJTiBVU0hPUlQJCVRpbWVPdXRWYWx1ZSwKKwlJTiBVU0hPUlQJCVN0YXJ0aW5nU2VxLAorICAgIElOIFVDSEFSIFRJRCwKKwlJTiBVQ0hBUiBCQVdpblNpemUsCisJSU4gVUNIQVIgT3JpZ2luYXRvclN0YXR1cywKKyAgICBJTiBCT09MRUFOIElzUmVjaXBpZW50KTsKKworI2lmZGVmIERPVDExTl9EUkFGVDMKK1ZPSUQgQnNzMjA0MENvZXhpc3RUaW1lT3V0KAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKKworVk9JRCAgVHJpRXZlbnRJbml0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworVUxPTkcgVHJpRXZlbnRUYWJsZVNldEVudHJ5KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCU9VVCBUUklHR0VSX0VWRU5UX1RBQiAqVGFiLAorCUlOIFBVQ0hBUiBwQnNzaWQsCisJSU4gSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKKwlJTiBVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbiwKKwlJTiBVQ0hBUgkJCVJlZ0NsYXNzLAorCUlOIFVDSEFSIENoYW5uZWxObyk7CisKK1ZPSUQgVHJpRXZlbnRDb3VudGVyTWFpbnRlbmFuY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBCc3NUYWJsZVNzaWRTb3J0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCU9VVCBCU1NfVEFCTEUgKk91dFRhYiwKKwlJTiAgQ0hBUiBTc2lkW10sCisJSU4gIFVDSEFSIFNzaWRMZW4pOworCitWT0lEICBCc3NUYWJsZVNvcnRCeVJzc2koCisJSU4gT1VUIEJTU19UQUJMRSAqT3V0VGFiKTsKKworVk9JRCBCc3NDaXBoZXJQYXJzZSgKKwlJTiBPVVQgIFBCU1NfRU5UUlkgIHBCc3MpOworCitORElTX1NUQVRVUyAgTWxtZVF1ZXVlSW5pdCgKKwlJTiBNTE1FX1FVRVVFICpRdWV1ZSk7CisKK1ZPSUQgIE1sbWVRdWV1ZURlc3Ryb3koCisJSU4gTUxNRV9RVUVVRSAqUXVldWUpOworCitCT09MRUFOIE1sbWVFbnF1ZXVlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVMT05HIE1hY2hpbmUsCisJSU4gVUxPTkcgTXNnVHlwZSwKKwlJTiBVTE9ORyBNc2dMZW4sCisJSU4gVk9JRCAqTXNnKTsKKworQk9PTEVBTiBNbG1lRW5xdWV1ZUZvclJlY3YoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gVUxPTkcgV2NpZCwKKwlJTiBVTE9ORyBUaW1lU3RhbXBIaWdoLAorCUlOIFVMT05HIFRpbWVTdGFtcExvdywKKwlJTiBVQ0hBUiBSc3NpMCwKKwlJTiBVQ0hBUiBSc3NpMSwKKwlJTiBVQ0hBUiBSc3NpMiwKKwlJTiBVTE9ORyBNc2dMZW4sCisJSU4gUFZPSUQgTXNnLAorCUlOIFVDSEFSIFNpZ25hbCk7CisKKworQk9PTEVBTiBNbG1lRGVxdWV1ZSgKKwlJTiBNTE1FX1FVRVVFICpRdWV1ZSwKKwlPVVQgTUxNRV9RVUVVRV9FTEVNICoqRWxlbSk7CisKK1ZPSUQgICAgTWxtZVJlc3RhcnRTdGF0ZU1hY2hpbmUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitCT09MRUFOICBNbG1lUXVldWVFbXB0eSgKKwlJTiBNTE1FX1FVRVVFICpRdWV1ZSk7CisKK0JPT0xFQU4gIE1sbWVRdWV1ZUZ1bGwoCisJSU4gTUxNRV9RVUVVRSAqUXVldWUpOworCitCT09MRUFOICBNc2dUeXBlU3Vic3QoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUEZSQU1FXzgwMl8xMSBwRnJhbWUsCisJT1VUIElOVCAqTWFjaGluZSwKKwlPVVQgSU5UICpNc2dUeXBlKTsKKworVk9JRCBTdGF0ZU1hY2hpbmVJbml0KAorCUlOIFNUQVRFX01BQ0hJTkUgKlNtLAorCUlOIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdLAorCUlOIFVMT05HIFN0TnIsCisJSU4gVUxPTkcgTXNnTnIsCisJSU4gU1RBVEVfTUFDSElORV9GVU5DIERlZkZ1bmMsCisJSU4gVUxPTkcgSW5pdFN0YXRlLAorCUlOIFVMT05HIEJhc2UpOworCitWT0lEIFN0YXRlTWFjaGluZVNldEFjdGlvbigKKwlJTiBTVEFURV9NQUNISU5FICpTLAorCUlOIFVMT05HIFN0LAorCVVMT05HIE1zZywKKwlJTiBTVEFURV9NQUNISU5FX0ZVTkMgRik7CisKK1ZPSUQgU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiBTVEFURV9NQUNISU5FICpTLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgRHJvcCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFzc29jU3RhdGVNYWNoaW5lSW5pdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgU1RBVEVfTUFDSElORSAqU20sCisJT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKKworVk9JRCBSZWFzc29jVGltZW91dCgKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIEFzc29jVGltZW91dCgKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIERpc2Fzc29jVGltZW91dCgKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1ZPSUQgTWxtZURpc2Fzc29jUmVxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIE1sbWVBc3NvY1JlcUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBNbG1lUmVhc3NvY1JlcUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBNbG1lRGlzYXNzb2NSZXFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckFzc29jUnNwQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJSZWFzc29jUnNwQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJEaXNhc3NvY0FjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBEaXNhc3NvY1RpbWVvdXRBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQXNzb2NUaW1lb3V0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICBSZWFzc29jVGltZW91dEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgQ2xzM2VyckFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSIHBBZGRyKTsKKworVk9JRCBTd2l0Y2hCZXR3ZWVuV2VwQW5kQ2tpcCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgIEludmFsaWRTdGF0ZVdoZW5Bc3NvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgSW52YWxpZFN0YXRlV2hlblJlYXNzb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jaWF0ZSgKKwlJTiAgUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKKyNpZmRlZiBSVDI4NzAKK1ZPSUQgTWxtZUNudGxDb25maXJtKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVMT05HIE1zZ1R5cGUsCisJSU4gVVNIT1JUIE1zZyk7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKK1ZPSUQgIENvbXBvc2VQc1BvbGwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEICBDb21wb3NlTnVsbEZyYW1lKAorCUlOICBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgIEFzc29jUG9zdFByb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiBwQWRkcjIsCisJSU4gIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKKwlJTiAgVVNIT1JUIEFpZCwKKwlJTiAgVUNIQVIgU3VwUmF0ZVtdLAorCUlOICBVQ0hBUiBTdXBSYXRlTGVuLAorCUlOICBVQ0hBUiBFeHRSYXRlW10sCisJSU4gIFVDSEFSIEV4dFJhdGVMZW4sCisJSU4gUEVEQ0FfUEFSTSBwRWRjYVBhcm0sCisJSU4gSFRfQ0FQQUJJTElUWV9JRQkJKnBIdENhcGFiaWxpdHksCisJSU4gIFVDSEFSIEh0Q2FwYWJpbGl0eUxlbiwKKwlJTiBBRERfSFRfSU5GT19JRQkJKnBBZGRIdEluZm8pOworCitWT0lEIEF1dGhTdGF0ZU1hY2hpbmVJbml0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOIFBTVEFURV9NQUNISU5FIHNtLAorCU9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CisKK1ZPSUQgQXV0aFRpbWVvdXQoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBNbG1lQXV0aFJlcUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyQXV0aFJzcEF0U2VxMkFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyQXV0aFJzcEF0U2VxNEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBdXRoVGltZW91dEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBDbHMyZXJyQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgcEFkZHIpOworCitWT0lEIE1sbWVEZWF1dGhSZXFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgSW52YWxpZFN0YXRlV2hlbkF1dGgoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1ZPSUQgQXV0aFJzcFN0YXRlTWFjaGluZUluaXQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBTVEFURV9NQUNISU5FIFNtLAorCUlOICBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CisKK1ZPSUQgUGVlckRlYXV0aEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJBdXRoU2ltcGxlUnNwR2VuQW5kU2VuZCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUEhFQURFUl84MDJfMTEgIHBIZHI4MDIxMSwKKwlJTiAgVVNIT1JUIEFsZywKKwlJTiAgVVNIT1JUIFNlcSwKKwlJTiAgVVNIT1JUIFJlYXNvbiwKKwlJTiAgVVNIT1JUIFN0YXR1cyk7CisKKy8vCisvLyBQcml2YXRlIHJvdXRpbmVzIGluIGRscy5jCisvLworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCit2b2lkIERsc1N0YXRlTWFjaGluZUluaXQoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gU1RBVEVfTUFDSElORSAqU20sCisgICAgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKKworVk9JRCBNbG1lRGxzUmVxQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckRsc1JlcUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSCXBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0JKkVsZW0pOworCitWT0lEIFBlZXJEbHNSc3BBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUglwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNCSpFbGVtKTsKKworVk9JRCBNbG1lRGxzVGVhckRvd25BY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyRGxzVGVhckRvd25BY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUglwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNCSpFbGVtKTsKKworVk9JRCBSVE1QQ2hlY2tETFNUaW1lT3V0KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworQk9PTEVBTiBSVE1QUmN2RnJhbWVETFNDaGVjaygKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiBQSEVBREVSXzgwMl8xMQlwSGVhZGVyLAorCUlOIFVMT05HCQkJTGVuLAorCUlOIFBSVDI4WFhfUlhEX1NUUlVDCXBSeEQpOworCitJTlQJUlRNUENoZWNrRExTRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwREEpOworCitWT0lEIFJUTVBTZW5kRExTVGVhckRvd25GcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEQSk7CisKK05ESVNfU1RBVFVTIFJUTVBTZW5kU1RBS2V5UmVxdWVzdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwREEpOworCitORElTX1NUQVRVUyBSVE1QU2VuZFNUQUtleUhhbmRTaGFrZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwREEpOworCitWT0lEIERsc1RpbWVvdXRBY3Rpb24oCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworQk9PTEVBTiBNbG1lRGxzUmVxU2FuaXR5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBSVF84MDJfMTFfRExTICpwRExTLAorICAgIE9VVCBQVVNIT1JUIHBSZWFzb24pOworCitJTlQgU2V0X0Rsc0VudHJ5SW5mb19EaXNwbGF5X1Byb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIGFyZyk7CisKK01BQ19UQUJMRV9FTlRSWSAqTWFjVGFibGVJbnNlcnREbHNFbnRyeSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSCXBBZGRyLAorCUlOICBVSU5UCURsc0VudHJ5SWR4KTsKKworQk9PTEVBTiBNYWNUYWJsZURlbGV0ZURsc0VudHJ5KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVTSE9SVCB3Y2lkLAorCUlOIFBVQ0hBUiBwQWRkcik7CisKK01BQ19UQUJMRV9FTlRSWSAqRGxzRW50cnlUYWJsZUxvb2t1cCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIJcEFkZHIsCisJSU4gQk9PTEVBTgliUmVzZXRJZGVsQ291bnQpOworCitNQUNfVEFCTEVfRU5UUlkgKkRsc0VudHJ5VGFibGVMb29rdXBCeVdjaWQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIJd2NpZCwKKwlJTiBQVUNIQVIJcEFkZHIsCisJSU4gQk9PTEVBTgliUmVzZXRJZGVsQ291bnQpOworCitJTlQJU2V0X0Rsc0FkZEVudHJ5X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9EbHNUZWFyRG93bkVudHJ5X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorQk9PTEVBTiBQZWVyRGxzUmVxU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwREEsCisgICAgT1VUIFBVQ0hBUiBwU0EsCisgICAgT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAorICAgIE9VVCBVU0hPUlQgKnBEbHNUaW1lb3V0LAorICAgIE9VVCBVQ0hBUiAqcFJhdGVzTGVuLAorICAgIE9VVCBVQ0hBUiBSYXRlc1tdLAorICAgIE9VVCBVQ0hBUiAqcEh0Q2FwYWJpbGl0eUxlbiwKKyAgICBPVVQgSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSk7CisKK0JPT0xFQU4gUGVlckRsc1JzcFNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcERBLAorICAgIE9VVCBQVUNIQVIgcFNBLAorICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKKyAgICBPVVQgVVNIT1JUICpwU3RhdHVzLAorICAgIE9VVCBVQ0hBUiAqcFJhdGVzTGVuLAorICAgIE9VVCBVQ0hBUiBSYXRlc1tdLAorICAgIE9VVCBVQ0hBUiAqcEh0Q2FwYWJpbGl0eUxlbiwKKyAgICBPVVQgSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSk7CisKK0JPT0xFQU4gUGVlckRsc1RlYXJEb3duU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFZPSUQgKk1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwREEsCisgICAgT1VUIFBVQ0hBUiBwU0EsCisgICAgT1VUIFVTSE9SVCAqcFJlYXNvbik7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitWT0lEIFN5bmNTdGF0ZU1hY2hpbmVJbml0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBTVEFURV9NQUNISU5FICpTbSwKKwlPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCitWT0lEIEJlYWNvblRpbWVvdXQoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBTY2FuVGltZW91dCgKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIE1sbWVTY2FuUmVxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEludmFsaWRTdGF0ZVdoZW5TY2FuKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEludmFsaWRTdGF0ZVdoZW5Kb2luKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEludmFsaWRTdGF0ZVdoZW5TdGFydCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyQmVhY29uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEVucXVldWVQcm9iZVJlcXVlc3QoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitCT09MRUFOIFNjYW5SdW5uaW5nKAorCQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1ZPSUQgTWxtZUNudGxJbml0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBTVEFURV9NQUNISU5FICpTLAorCU9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CisKK1ZPSUQgTWxtZUNudGxNYWNoaW5lUGVyZm9ybUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgU1RBVEVfTUFDSElORSAqUywKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBDbnRsSWRsZVByb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQ250bE9pZFNjYW5Qcm9jKAorCUlOICBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBDbnRsT2lkU3NpZFByb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqIEVsZW0pOworCitWT0lEIENudGxPaWRSVEJzc2lkUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICogRWxlbSk7CisKK1ZPSUQgQ250bE1sbWVSb2FtaW5nUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICogRWxlbSk7CisKK1ZPSUQgQ250bFdhaXREaXNhc3NvY1Byb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQ250bFdhaXRKb2luUHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBDbnRsV2FpdFJlYXNzb2NQcm9jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIENudGxXYWl0U3RhcnRQcm9jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIENudGxXYWl0QXV0aFByb2MoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQ250bFdhaXRBdXRoUHJvYzIoCisJSU4gIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIENudGxXYWl0QXNzb2NQcm9jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCitWT0lEIENudGxPaWRETFNTZXR1cFByb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworVk9JRCBMaW5rVXAoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSIEJzc1R5cGUpOworCitWT0lEIExpbmtEb3duKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBCT09MRUFOICAgICAgICAgSXNSZXFGcm9tQVApOworCitWT0lEIEl0ZXJhdGVPbkJzc1RhYigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgSXRlcmF0ZU9uQnNzVGFiMigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7OworCitWT0lEIEpvaW5QYXJtRmlsbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgT1VUIE1MTUVfSk9JTl9SRVFfU1RSVUNUICpKb2luUmVxLAorCUlOICBVTE9ORyBCc3NJZHgpOworCitWT0lEIEFzc29jUGFybUZpbGwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gT1VUIE1MTUVfQVNTT0NfUkVRX1NUUlVDVCAqQXNzb2NSZXEsCisJSU4gIFBVQ0hBUiBwQWRkciwKKwlJTiAgVVNIT1JUIENhcGFiaWxpdHlJbmZvLAorCUlOICBVTE9ORyBUaW1lb3V0LAorCUlOICBVU0hPUlQgTGlzdGVuSW50dik7CisKK1ZPSUQgU2NhblBhcm1GaWxsKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBPVVQgTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgKlNjYW5SZXEsCisJSU4gIENIQVIgU3NpZFtdLAorCUlOICBVQ0hBUiBTc2lkTGVuLAorCUlOICBVQ0hBUiBCc3NUeXBlLAorCUlOICBVQ0hBUiBTY2FuVHlwZSk7CisKK1ZPSUQgRGlzYXNzb2NQYXJtRmlsbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgT1VUIE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCAqRGlzYXNzb2NSZXEsCisJSU4gIFBVQ0hBUiBwQWRkciwKKwlJTiAgVVNIT1JUIFJlYXNvbik7CisKK1ZPSUQgU3RhcnRQYXJtRmlsbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgT1VUIE1MTUVfU1RBUlRfUkVRX1NUUlVDVCAqU3RhcnRSZXEsCisJSU4gIENIQVIgU3NpZFtdLAorCUlOICBVQ0hBUiBTc2lkTGVuKTsKKworVk9JRCBBdXRoUGFybUZpbGwoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE9VVCBNTE1FX0FVVEhfUkVRX1NUUlVDVCAqQXV0aFJlcSwKKwlJTiAgUFVDSEFSIHBBZGRyLAorCUlOICBVU0hPUlQgQWxnKTsKKworVk9JRCBFbnF1ZXVlUHNQb2xsKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBFbnF1ZXVlQmVhY29uRnJhbWUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIE1sbWVKb2luUmVxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIE1sbWVTY2FuUmVxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIE1sbWVTdGFydFJlcUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBTY2FuVGltZW91dEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBCZWFjb25UaW1lb3V0QXRKb2luQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJCZWFjb25BdFNjYW5BY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgUGVlckJlYWNvbkF0Sm9pbkFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBQZWVyQmVhY29uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJQcm9iZVJlcUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgU2Nhbk5leHRDaGFubmVsKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVUxPTkcgTWFrZUlic3NCZWFjb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIENDWEFkamFjZW50QVBSZXBvcnQoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitCT09MRUFOIE1sbWVTY2FuUmVxU2FuaXR5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBWT0lEICpNc2csCisJSU4gIFVMT05HIE1zZ0xlbiwKKwlPVVQgVUNIQVIgKkJzc1R5cGUsCisJT1VUIENIQVIgc3NpZFtdLAorCU9VVCBVQ0hBUiAqU3NpZExlbiwKKwlPVVQgVUNIQVIgKlNjYW5UeXBlKTsKKworQk9PTEVBTiBQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFZPSUQgKk1zZywKKwlJTiAgVUxPTkcgTXNnTGVuLAorCUlOICBVQ0hBUiBNc2dDaGFubmVsLAorCU9VVCBQVUNIQVIgcEFkZHIyLAorCU9VVCBQVUNIQVIgcEJzc2lkLAorCU9VVCBDSEFSIFNzaWRbXSwKKwlPVVQgVUNIQVIgKnBTc2lkTGVuLAorCU9VVCBVQ0hBUiAqcEJzc1R5cGUsCisJT1VUIFVTSE9SVCAqcEJlYWNvblBlcmlvZCwKKwlPVVQgVUNIQVIgKnBDaGFubmVsLAorCU9VVCBVQ0hBUiAqcE5ld0NoYW5uZWwsCisJT1VUIExBUkdFX0lOVEVHRVIgKnBUaW1lc3RhbXAsCisJT1VUIENGX1BBUk0gKnBDZlBhcm0sCisJT1VUIFVTSE9SVCAqcEF0aW1XaW4sCisJT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAorCU9VVCBVQ0hBUiAqcEVycCwKKwlPVVQgVUNIQVIgKnBEdGltQ291bnQsCisJT1VUIFVDSEFSICpwRHRpbVBlcmlvZCwKKwlPVVQgVUNIQVIgKnBCY2FzdEZsYWcsCisJT1VUIFVDSEFSICpwTWVzc2FnZVRvTWUsCisJT1VUIFVDSEFSIFN1cFJhdGVbXSwKKwlPVVQgVUNIQVIgKnBTdXBSYXRlTGVuLAorCU9VVCBVQ0hBUiBFeHRSYXRlW10sCisJT1VUIFVDSEFSICpwRXh0UmF0ZUxlbiwKKwlPVVQJVUNIQVIgKnBDa2lwRmxhZywKKwlPVVQJVUNIQVIgKnBBaXJvbmV0Q2VsbFBvd2VyTGltaXQsCisJT1VUIFBFRENBX1BBUk0gICAgICAgcEVkY2FQYXJtLAorCU9VVCBQUUJTU19MT0FEX1BBUk0gIHBRYnNzTG9hZCwKKwlPVVQgUFFPU19DQVBBQklMSVRZX1BBUk0gcFFvc0NhcGFiaWxpdHksCisJT1VUIFVMT05HICpwUmFsaW5rSWUsCisJT1VUIFVDSEFSCQkgKnBIdENhcGFiaWxpdHlMZW4sCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisJT1VUIFVDSEFSCQkgKnBQcmVOSHRDYXBhYmlsaXR5TGVuLAorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCU9VVCBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAorCU9VVCBVQ0hBUgkJICpBZGRIdEluZm9MZW4sCisJT1VUIEFERF9IVF9JTkZPX0lFICpBZGRIdEluZm8sCisJT1VUIFVDSEFSICpOZXdFeHRDaGFubmVsLAorCU9VVCBVU0hPUlQgKkxlbmd0aFZJRSwKKwlPVVQgUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcyBwVklFKTsKKworQk9PTEVBTiBQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqcE1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisJT1VUIFBVQ0hBUiBwQWRkcjIpOworCitCT09MRUFOIFBlZXJBZGRCQVJzcEFjdGlvblNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpwTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbik7CisKK0JPT0xFQU4gUGVlckRlbEJBQWN0aW9uU2FuaXR5KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFVDSEFSIFdjaWQsCisgICAgSU4gVk9JRCAqcE1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4pOworCitCT09MRUFOIE1sbWVBc3NvY1JlcVNhbml0eSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVk9JRCAqTXNnLAorCUlOICBVTE9ORyBNc2dMZW4sCisJT1VUIFBVQ0hBUiBwQXBBZGRyLAorCU9VVCBVU0hPUlQgKkNhcGFiaWxpdHlJbmZvLAorCU9VVCBVTE9ORyAqVGltZW91dCwKKwlPVVQgVVNIT1JUICpMaXN0ZW5JbnR2KTsKKworQk9PTEVBTiBNbG1lQXV0aFJlcVNhbml0eSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVk9JRCAqTXNnLAorCUlOICBVTE9ORyBNc2dMZW4sCisJT1VUIFBVQ0hBUiBwQWRkciwKKwlPVVQgVUxPTkcgKlRpbWVvdXQsCisJT1VUIFVTSE9SVCAqQWxnKTsKKworQk9PTEVBTiBNbG1lU3RhcnRSZXFTYW5pdHkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFZPSUQgKk1zZywKKwlJTiAgVUxPTkcgTXNnTGVuLAorCU9VVCBDSEFSIFNzaWRbXSwKKwlPVVQgVUNIQVIgKlNzaWRsZW4pOworCitCT09MRUFOIFBlZXJBdXRoU2FuaXR5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBWT0lEICpNc2csCisJSU4gIFVMT05HIE1zZ0xlbiwKKwlPVVQgUFVDSEFSIHBBZGRyLAorCU9VVCBVU0hPUlQgKkFsZywKKwlPVVQgVVNIT1JUICpTZXEsCisJT1VUIFVTSE9SVCAqU3RhdHVzLAorCU9VVCBDSEFSIENobGdUZXh0W10pOworCitCT09MRUFOIFBlZXJBc3NvY1JzcFNhbml0eSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiBWT0lEICpwTXNnLAorCUlOICBVTE9ORyBNc2dMZW4sCisJT1VUIFBVQ0hBUiBwQWRkcjIsCisJT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAorCU9VVCBVU0hPUlQgKnBTdGF0dXMsCisJT1VUIFVTSE9SVCAqcEFpZCwKKwlPVVQgVUNIQVIgU3VwUmF0ZVtdLAorCU9VVCBVQ0hBUiAqcFN1cFJhdGVMZW4sCisJT1VUIFVDSEFSIEV4dFJhdGVbXSwKKwlPVVQgVUNIQVIgKnBFeHRSYXRlTGVuLAorICAgIE9VVCBIVF9DQVBBQklMSVRZX0lFCQkqcEh0Q2FwYWJpbGl0eSwKKyAgICBPVVQgQUREX0hUX0lORk9fSUUJCSpwQWRkSHRJbmZvLAkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKyAgICBPVVQgVUNIQVIJCQkqcEh0Q2FwYWJpbGl0eUxlbiwKKyAgICBPVVQgVUNIQVIJCQkqcEFkZEh0SW5mb0xlbiwKKyAgICBPVVQgVUNIQVIJCQkqcE5ld0V4dENoYW5uZWxPZmZzZXQsCisJT1VUIFBFRENBX1BBUk0gcEVkY2FQYXJtLAorCU9VVCBVQ0hBUiAqcENraXBGbGFnKTsKKworQk9PTEVBTiBQZWVyRGlzYXNzb2NTYW5pdHkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFZPSUQgKk1zZywKKwlJTiAgVUxPTkcgTXNnTGVuLAorCU9VVCBQVUNIQVIgcEFkZHIyLAorCU9VVCBVU0hPUlQgKlJlYXNvbik7CisKK0JPT0xFQU4gUGVlcldwYU1lc3NhZ2VTYW5pdHkoCisgICAgSU4gCVBSVE1QX0FEQVBURVIgCQlwQWQsCisgICAgSU4gCVBFQVBPTF9QQUNLRVQgCQlwTXNnLAorICAgIElOIAlVTE9ORyAJCQkJTXNnTGVuLAorICAgIElOIAlVQ0hBUgkJCQlNc2dUeXBlLAorICAgIElOIAlNQUNfVEFCTEVfRU5UUlkgIAkqcEVudHJ5KTsKKworQk9PTEVBTiBQZWVyRGVhdXRoU2FuaXR5KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBWT0lEICpNc2csCisJSU4gIFVMT05HIE1zZ0xlbiwKKwlPVVQgUFVDSEFSIHBBZGRyMiwKKwlPVVQgVVNIT1JUICpSZWFzb24pOworCitCT09MRUFOIFBlZXJQcm9iZVJlcVNhbml0eSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVk9JRCAqTXNnLAorCUlOICBVTE9ORyBNc2dMZW4sCisJT1VUIFBVQ0hBUiBwQWRkcjIsCisJT1VUIENIQVIgU3NpZFtdLAorCU9VVCBVQ0hBUiAqcFNzaWRMZW4pOworCitCT09MRUFOIEdldFRpbUJpdCgKKwlJTiAgQ0hBUiAqUHRyLAorCUlOICBVU0hPUlQgQWlkLAorCU9VVCBVQ0hBUiAqVGltTGVuLAorCU9VVCBVQ0hBUiAqQmNhc3RGbGFnLAorCU9VVCBVQ0hBUiAqRHRpbUNvdW50LAorCU9VVCBVQ0hBUiAqRHRpbVBlcmlvZCwKKwlPVVQgVUNIQVIgKk1lc3NhZ2VUb01lKTsKKworVUNIQVIgQ2hhbm5lbFNhbml0eSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUiBjaGFubmVsKTsKKworTkRJU184MDJfMTFfTkVUV09SS19UWVBFIE5ldHdvcmtUeXBlSW5Vc2VTYW5pdHkoCisJSU4gUEJTU19FTlRSWSBwQnNzKTsKKworI2lmIDAJLy8gSXQncyBvbWl0dGVkCitORElTX1NUQVRVUwlSVE1QV2VwS2V5U2FuaXR5KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4JUFZPSUQJCQlwQnVmKTsKKyNlbmRpZgorCitCT09MRUFOIE1sbWVEZWxCQVJlcVNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuKTsKKworQk9PTEVBTiBNbG1lQWRkQkFSZXFTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqTXNnLAorICAgIElOIFVMT05HIE1zZ0xlbiwKKyAgICBPVVQgUFVDSEFSIHBBZGRyMik7CisKK1VMT05HIE1ha2VPdXRnb2luZ0ZyYW1lKAorCU9VVCBDSEFSICpCdWZmZXIsCisJT1VUIFVMT05HICpMZW5ndGgsIC4uLik7CisKK1ZPSUQgIExmc3JJbml0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVTE9ORyBTZWVkKTsKKworVUNIQVIgUmFuZG9tQnl0ZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgQXNpY1VwZGF0ZUF1dG9GYWxsQmFja1RhYmxlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBUeFJhdGUpOworCitWT0lEICBNbG1lUGVyaW9kaWNFeGVjKAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgTGlua0Rvd25FeGVjKAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisKK1ZPSUQgTGlua1VwRXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIFNUQU1sbWVQZXJpb2RpY0V4ZWMoCisJUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIE1sbWVBdXRvU2NhbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK0JPT0xFQU4gTWxtZVZhbGlkYXRlU1NJRCgKKwlJTiBQVUNIQVIgcFNzaWQsCisJSU4gVUNIQVIgIFNzaWRMZW4pOworCitWT0lEIE1sbWVDaGVja0ZvclJvYW1pbmcoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUxPTkcgICAgTm93MzIpOworCitWT0lEIE1sbWVDaGVja0ZvckZhc3RSb2FtaW5nKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVTE9ORyAgICAgICAgICAgTm93KTsKKworVk9JRCBNbG1lRHluYW1pY1R4UmF0ZVN3aXRjaGluZygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgTWxtZVNldFR4UmF0ZSgKKwlJTiBQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4gUE1BQ19UQUJMRV9FTlRSWQkJcEVudHJ5LAorCUlOIFBSVE1QX1RYX1JBVEVfU1dJVENICXBUeFJhdGUpOworCitWT0lEIE1sbWVTZWxlY3RUeFJhdGVUYWJsZSgKKwlJTiBQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4gUE1BQ19UQUJMRV9FTlRSWQkJcEVudHJ5LAorCUlOIFBVQ0hBUgkJCQkqcHBUYWJsZSwKKwlJTiBQVUNIQVIJCQkJcFRhYmxlU2l6ZSwKKwlJTiBQVUNIQVIJCQkJcEluaXRUeFJhdGVJZHgpOworCitWT0lEIE1sbWVDYWxjdWxhdGVDaGFubmVsUXVhbGl0eSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVTE9ORyBOb3cpOworCitWT0lEIE1sbWVDaGVja1BzbUNoYW5nZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVTE9ORyAgICBOb3czMik7CisKK1ZPSUQgTWxtZVNldFBzbUJpdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQgcHNtKTsKKworVk9JRCBNbG1lU2V0VHhQcmVhbWJsZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQgVHhQcmVhbWJsZSk7CisKK1ZPSUQgVXBkYXRlQmFzaWNSYXRlQml0bWFwKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBNbG1lVXBkYXRlVHhSYXRlcygKKwlJTiBQUlRNUF9BREFQVEVSIAlwQWQsCisJSU4gCUJPT0xFQU4JCSAJYkxpbmtVcCwKKwlJTglVQ0hBUgkJCWFwaWR4KTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorVk9JRCBNbG1lVXBkYXRlSHRUeFJhdGVzKAorCUlOIFBSVE1QX0FEQVBURVIgCQlwQWQsCisJSU4JVUNIQVIJCQkJYXBpZHgpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCitWT0lEICAgIFJUTVBDaGVja1JhdGVzKAorCUlOICAgICAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiBPVVQgIFVDSEFSICAgICAgICAgICBTdXBSYXRlW10sCisJSU4gT1VUICBVQ0hBUiAgICAgICAgICAgKlN1cFJhdGVMZW4pOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitCT09MRUFOIFJUTVBDaGVja0NoYW5uZWwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVUNIQVIJCUNlbnRyYWxDaGFubmVsLAorCUlOIFVDSEFSCQlDaGFubmVsKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworQk9PTEVBTiAJUlRNUENoZWNrSHQoCisJSU4JCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCQlVQ0hBUglXY2lkLAorCUlOIE9VVAlIVF9DQVBBQklMSVRZX0lFCQkJKnBIdENhcGFiaWxpdHksCisJSU4gT1VUCUFERF9IVF9JTkZPX0lFCQkJKnBBZGRIdEluZm8pOworCitWT0lEIFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBBc2ljQmJwVHVuaW5nMSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgQXNpY0JicFR1bmluZzIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIFJUTVBVcGRhdGVNbG1lUmF0ZSgKKwlJTiBQUlRNUF9BREFQVEVSCXBBZCk7CisKK0NIQVIgUlRNUE1heFJzc2koCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gQ0hBUgkJCQlSc3NpMCwKKwlJTiBDSEFSCQkJCVJzc2kxLAorCUlOIENIQVIJCQkJUnNzaTIpOworCitWT0lEIEFzaWNFdmFsdWF0ZVJ4QW50KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBBc2ljUnhBbnRFdmFsVGltZW91dCgKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIEFQU0RQZXJpb2RpY0V4ZWMoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworQk9PTEVBTiBSVE1QQ2hlY2tFbnRyeUVuYWJsZUF1dG9SYXRlU3dpdGNoKAorCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCUlOIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5KTsKKworVUNIQVIgUlRNUFN0YUZpeGVkVHhNb2RlKAorCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCUlOIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5KTsKKworVk9JRCBSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nKAorCQlVQ0hBUgkJCQlmaXhlZF90eF9tb2RlLAorCQlQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSk7CisKK0JPT0xFQU4gUlRNUEF1dG9SYXRlU3dpdGNoQ2hlY2soCisJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQpOworCitORElTX1NUQVRVUyBNbG1lSW5pdCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgTWxtZUhhbmRsZXIoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIE1sbWVIYWx0KAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBNbG1lUmVzZXRSYWxpbmtDb3VudGVycygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgQnVpbGRDaGFubmVsTGlzdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1VDSEFSIEZpcnN0Q2hhbm5lbCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1VDSEFSIE5leHRDaGFubmVsKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUiBjaGFubmVsKTsKKworVk9JRCBDaGFuZ2VUb0NlbGxQb3dlckxpbWl0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSICAgICAgICAgQWlyb25ldENlbGxQb3dlckxpbWl0KTsKKworVk9JRCBSYWlzZUNsb2NrKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVSU5UMzIgKngpOworCitWT0lEIExvd2VyQ2xvY2soCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVJTlQzMiAqeCk7CisKK1VTSE9SVCBTaGlmdEluQml0cygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisKK1ZPSUQgU2hpZnRPdXRCaXRzKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVU0hPUlQgZGF0YSwKKwlJTiAgVVNIT1JUIGNvdW50KTsKKworVk9JRCBFRXByb21DbGVhbnVwKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBFV0RTKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCBFV0VOKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVVNIT1JUIFJUTVBfRUVQUk9NX1JFQUQxNigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVVNIT1JUIE9mZnNldCk7CisKK1ZPSUQgUlRNUF9FRVBST01fV1JJVEUxNigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVVNIT1JUIE9mZnNldCwKKwlJTiAgVVNIT1JUIERhdGEpOworCisvLworLy8gUHJvdG90eXBlcyBvZiBmdW5jdGlvbiBkZWZpbml0aW9uIGluIHJ0bXBfdGtpcC5jCisvLworVk9JRCAgICBSVE1QSW5pdFRraXBFbmdpbmUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwVEtleSwKKwlJTiAgVUNIQVIgICAgICAgICAgIEtleUlkLAorCUlOICBQVUNIQVIgICAgICAgICAgcFRBLAorCUlOICBQVUNIQVIgICAgICAgICAgcE1JQ0tleSwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBUU0MsCisJT1VUIFBVTE9ORyAgICAgICAgICBwSVYxNiwKKwlPVVQgUFVMT05HICAgICAgICAgIHBJVjMyKTsKKworVk9JRCAgICBSVE1QSW5pdE1JQ0VuZ2luZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBLZXksCisJSU4gIFBVQ0hBUiAgICAgICAgICBwREEsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwU0EsCisJSU4gIFVDSEFSICAgICAgICAgICBVc2VyUHJpb3JpdHksCisJSU4gIFBVQ0hBUiAgICAgICAgICBwTUlDS2V5KTsKKworQk9PTEVBTiBSVE1QVGtpcENvbXBhcmVNSUNWYWx1ZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBTcmMsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwREEsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwU0EsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwTUlDS2V5LAorCUlOCVVDSEFSCQkJVXNlclByaW9yaXR5LAorCUlOICBVSU5UICAgICAgICAgICAgTGVuKTsKKworVk9JRCAgICBSVE1QQ2FsY3VsYXRlTUlDVmFsdWUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBORElTX1BBQ0tFVCAgICBwUGFja2V0LAorCUlOICBQVUNIQVIgICAgICAgICAgcEVuY2FwLAorCUlOICBQQ0lQSEVSX0tFWSAgICAgcEtleSwKKwlJTglVQ0hBUgkJCWFwaWR4KTsKKworQk9PTEVBTiBSVE1QVGtpcENvbXBhcmVNSUNWYWx1ZVdpdGhMTEMoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwTExDLAorCUlOICBQVUNIQVIgICAgICAgICAgcFNyYywKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEQSwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBTQSwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBNSUNLZXksCisJSU4gIFVJTlQgICAgICAgICAgICBMZW4pOworCitWT0lEICAgIFJUTVBUa2lwQXBwZW5kQnl0ZSgKKwlJTiAgUFRLSVBfS0VZX0lORk8gIHBUa2lwLAorCUlOICBVQ0hBUiAgICAgICAgICAgdUNoYXIpOworCitWT0lEICAgIFJUTVBUa2lwQXBwZW5kKAorCUlOICBQVEtJUF9LRVlfSU5GTyAgcFRraXAsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwU3JjLAorCUlOICBVSU5UICAgICAgICAgICAgbkJ5dGVzKTsKKworVk9JRCAgICBSVE1QVGtpcEdldE1JQygKKwlJTiAgUFRLSVBfS0VZX0lORk8gIHBUa2lwKTsKKworQk9PTEVBTiBSVE1QU29mdERlY3J5cHRUS0lQKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUglwRGF0YSwKKwlJTiBVTE9ORwlEYXRhQnl0ZUNudCwKKwlJTiBVQ0hBUiAgICBVc2VyUHJpb3JpdHksCisJSU4gUENJUEhFUl9LRVkJcFdwYUtleSk7CisKK0JPT0xFQU4gUlRNUFNvZnREZWNyeXB0QUVTKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUglwRGF0YSwKKwlJTiBVTE9ORwlEYXRhQnl0ZUNudCwKKwlJTiBQQ0lQSEVSX0tFWQlwV3BhS2V5KTsKKworI2lmIDAJLy8gcmVtb3ZlZCBieSBBbGJlcnRZCitORElTX1NUQVRVUyBSVE1QV1BBQWRkS2V5UHJvYygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFZPSUQgICAgICAgICAgIHBCdWYpOworI2VuZGlmCisKKy8vCisvLyBQcm90b3R5cGVzIG9mIGZ1bmN0aW9uIGRlZmluaXRpb24gaW4gY21tX2luZm8uYworLy8KK05ESVNfU1RBVFVTIFJUTVBXUEFSZW1vdmVLZXlQcm9jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVk9JRCAgICAgICAgICAgcEJ1Zik7CisKK1ZPSUQgICAgUlRNUFdQQVJlbW92ZUFsbEtleXMoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitCT09MRUFOIFJUTVBDaGVja1N0clByaW50QWJsZSgKKyAgICBJTiAgQ0hBUiAqcEluUHV0U3RyLAorICAgIElOICBVQ0hBUiBzdHJMZW4pOworCitWT0lEICAgIFJUTVBTZXRQaHlNb2RlKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVTE9ORyBwaHltb2RlKTsKKworVk9JRAlSVE1QVXBkYXRlSFRJRSgKKwlJTglSVF9IVF9DQVBBQklMSVRZCSpwUnRIdCwKKwlJTgkJVUNIQVIJCQkJKnBNY3NTZXQsCisJT1VUCQlIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAorCU9VVAkJQUREX0hUX0lORk9fSUUJCSpwQWRkSHRJbmZvKTsKKworVk9JRAlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJQnNzSWR4LAorCUlOIAlVQ0hBUgkJIAlLZXlJZHgsCisJSU4gCVVDSEFSCQkgCUNpcGhlckFsZywKKwlJTiAJTUFDX1RBQkxFX0VOVFJZICpwRW50cnkpOworCitDSEFSICpHZXRFbmNyeXB0VHlwZSgKKwlDSEFSIGVuYyk7CisKK0NIQVIgKkdldEF1dGhNb2RlKAorCUNIQVIgYXV0aCk7CisKK1ZPSUQgUlRNUElvY3RsR2V0U2l0ZVN1cnZleSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCXN0cnVjdCBpd3JlcQkqd3JxKTsKKworVk9JRCBSVE1QSW9jdGxHZXRNYWNUYWJsZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBzdHJ1Y3QgaXdyZXEgKndycSk7CisKK1ZPSUQgUlRNUEluZGljYXRlV1BBMlN0YXR1cygKKwlJTiAgUFJUTVBfQURBUFRFUiAgcEFkYXB0ZXIpOworCitWT0lECVJUTVBPUE1vZGVTd2l0Y2hpbmcoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitWT0lEICAgIFJUTVBBZGRCU1NJRENpcGhlcigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTglVQ0hBUglBaWQsCisgICAgSU4gIFBORElTXzgwMl8xMV9LRVkgICAgcEtleSwKKyAgICBJTiAgVUNIQVIgICBDaXBoZXJBbGcpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitWT0lECVJUTVBTZXRIVCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglPSURfU0VUX0hUX1BIWU1PREUgKnBIVFBoeU1vZGUpOworCitWT0lECVJUTVBTZXRJbmRpdmlkdWFsSFQoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCVVDSEFSCQkJCWFwaWR4KTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBSVE1QU2VuZFdpcmVsZXNzRXZlbnQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVVNIT1JUCQkJRXZlbnRfZmxhZywKKwlJTglQVUNIQVIgCQkJcEFkZHIsCisJSU4gIFVDSEFSCQkJQnNzSWR4LAorCUlOCUNIQVIJCQlSc3NpKTsKKworVk9JRAlOSUNVcGRhdGVDbnRsQ291bnRlcnMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUEhFQURFUl84MDJfMTEJcEhlYWRlciwKKwlJTiAgICBVQ0hBUgkJCVN1YlR5cGUsCisJSU4JUFJYV0lfU1RSVUMgCXBSeFdJKTsKKy8vCisvLyBwcm90b3R5cGUgaW4gd3BhLmMKKy8vCitCT09MRUFOIFdwYU1zZ1R5cGVTdWJzdCgKKwlJTiAgVUNIQVIgICBFQVBUeXBlLAorCU9VVCBJTlQJCSpNc2dUeXBlKTsKKworVk9JRCBXcGFQc2tTdGF0ZU1hY2hpbmVJbml0KAorCUlOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCwKKwlJTiAgU1RBVEVfTUFDSElORSAgICAgICAqUywKKwlPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworCitWT0lEIFdwYUVBUE9MS2V5QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICAgIFdwYVBhaXJNc2cxQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICAgIFdwYVBhaXJNc2czQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICAgIFdwYUdyb3VwTXNnMUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgICBXcGFNYWNIZWFkZXJJbml0KAorCUlOICAgICAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiBPVVQgIFBIRUFERVJfODAyXzExICBwSGRyODAyMTEsCisJSU4gICAgICBVQ0hBUiAgICAgICAgICAgd2VwLAorCUlOICAgICAgUFVDSEFSICAgICAgICAgIHBBZGRyMSk7CisKK1ZPSUQgICAgV3BhMlBhaXJNc2cxQWN0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICAgIFdwYTJQYWlyTXNnM0FjdGlvbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworQk9PTEVBTiBQYXJzZUtleURhdGEoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBwS2V5RGF0YSwKKyAgICBJTiAgVUNIQVIgICAgICAgICAgIEtleURhdGFMZW4sCisJSU4JVUNIQVIJCQliUGFpcmV3aXNlKTsKKworVk9JRCAgICBSVE1QVG9XaXJlbGVzc1N0YSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBIZWFkZXI4MDJfMywKKyAgICBJTiAgVUlOVCAgICAgICAgICAgIEhkckxlbiwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBEYXRhLAorICAgIElOICBVSU5UICAgICAgICAgICAgRGF0YUxlbiwKKyAgICBJTglCT09MRUFOCQkJaXM0d2F5RnJhbWUpOworCitWT0lEICAgIEhNQUNfU0hBMSgKKwlJTiAgVUNIQVIgICAqdGV4dCwKKwlJTiAgVUlOVCAgICB0ZXh0X2xlbiwKKwlJTiAgVUNIQVIgICAqa2V5LAorCUlOICBVSU5UICAgIGtleV9sZW4sCisJSU4gIFVDSEFSICAgKmRpZ2VzdCk7CisKK1ZPSUQgICAgUFJGKAorCUlOICBVQ0hBUiAgICprZXksCisJSU4gIElOVCAgICAga2V5X2xlbiwKKwlJTiAgVUNIQVIgICAqcHJlZml4LAorCUlOICBJTlQgICAgIHByZWZpeF9sZW4sCisJSU4gIFVDSEFSICAgKmRhdGEsCisJSU4gIElOVCAgICAgZGF0YV9sZW4sCisJT1VUIFVDSEFSICAgKm91dHB1dCwKKwlJTiAgSU5UICAgICBsZW4pOworCitWT0lEICAgIENDS01QUkYoCisJSU4gIFVDSEFSICAgKmtleSwKKwlJTiAgSU5UICAgICBrZXlfbGVuLAorCUlOICBVQ0hBUiAgICpkYXRhLAorCUlOICBJTlQgICAgIGRhdGFfbGVuLAorCU9VVCBVQ0hBUiAgICpvdXRwdXQsCisJSU4gIElOVCAgICAgbGVuKTsKKworVk9JRCBXcGFDb3VudFBUSygKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIgICAqUE1LLAorCUlOICBVQ0hBUiAgICpBTm9uY2UsCisJSU4gIFVDSEFSICAgKkFBLAorCUlOICBVQ0hBUiAgICpTTm9uY2UsCisJSU4gIFVDSEFSICAgKlNBLAorCU9VVCBVQ0hBUiAgICpvdXRwdXQsCisJSU4gIFVJTlQgICAgbGVuKTsKKworVk9JRCAgICBHZW5SYW5kb20oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4JVUNIQVIJCQkqbWFjQWRkciwKKwlPVVQJVUNIQVIJCQkqcmFuZG9tKTsKKworLy8KKy8vIHByb3RvdHlwZSBpbiBhaXJvbmV0LmMKKy8vCitWT0lEICAgIEFpcm9uZXRTdGF0ZU1hY2hpbmVJbml0KAorCUlOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCwKKwlJTiAgU1RBVEVfTUFDSElORSAgICAgICAqUywKKwlPVVQgU1RBVEVfTUFDSElORV9GVU5DICBUcmFuc1tdKTsKKworVk9JRCAgICBBaXJvbmV0TXNnQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICAgIEFpcm9uZXRSZXF1ZXN0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEICAgIENoYW5uZWxMb2FkUmVxdWVzdEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIgICAgICAgICAgIEluZGV4KTsKKworVk9JRCAgICBOb2lzZUhpc3RSZXF1ZXN0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVQ0hBUiAgICAgICAgICAgSW5kZXgpOworCitWT0lEICAgIEJlYWNvblJlcXVlc3RBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSICAgICAgICAgICBJbmRleCk7CisKK1ZPSUQgICAgQWlyb25ldFJlcG9ydEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCAgICBDaGFubmVsTG9hZFJlcG9ydEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUNIQVIgICAgICAgICAgIEluZGV4KTsKKworVk9JRCAgICBOb2lzZUhpc3RSZXBvcnRBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSICAgICAgICAgICBJbmRleCk7CisKK1ZPSUQgICAgQWlyb25ldEZpbmFsUmVwb3J0QWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworVk9JRCAgICBCZWFjb25SZXBvcnRBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFVDSEFSICAgICAgICAgICBJbmRleCk7CisKK1ZPSUQgICAgQWlyb25ldEFkZEJlYWNvblJlcG9ydCgKKwlJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQsCisJSU4gIFVMT05HICAgICAgICAgICAgICAgSW5kZXgsCisJSU4gIFBNTE1FX1FVRVVFX0VMRU0gICAgcEVsZW0pOworCitWT0lEICAgIEFpcm9uZXRDcmVhdGVCZWFjb25SZXBvcnRGcm9tQnNzVGFibGUoCisJSU4gIFBSVE1QX0FEQVBURVIgICAgICAgcEFkKTsKKworVk9JRCAgICBEQkdQUklOVF9UWF9SSU5HKAorCUlOIFBSVE1QX0FEQVBURVIgIHBBZCwKKwlJTiBVQ0hBUiAgICAgICAgICBRdWVJZHgpOworCitWT0lEIERCR1BSSU5UX1JYX1JJTkcoCisJSU4gUFJUTVBfQURBUFRFUiAgcEFkKTsKKworQ0hBUiAgICBDb252ZXJ0VG9Sc3NpKAorCUlOIFBSVE1QX0FEQVBURVIgIHBBZCwKKwlJTiBDSEFSCQkJCVJzc2ksCisJSU4gVUNIQVIgICAgUnNzaU51bWJlcik7CisKKworI2lmZGVmIERPVDExTl9EUkFGVDMKK1ZPSUQgQnVpbGRFZmZlY3RlZENoYW5uZWxMaXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisKKworVk9JRCBBUEFzaWNFdmFsdWF0ZVJ4QW50KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKKworCitWT0lEIEFQQXNpY1J4QW50RXZhbFRpbWVvdXQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQpOworCisvLworLy8gZnVuY3Rpb24gcHJvdG90eXBlIGluIGNtbV93cGEuYworLy8KK0JPT0xFQU4gUlRNUENoZWNrV1BBZnJhbWUoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUE1BQ19UQUJMRV9FTlRSWQlwRW50cnksCisJSU4gUFVDSEFSIAkJCXBEYXRhLAorCUlOIFVMT05HIAkJCURhdGFCeXRlQ291bnQsCisJSU4gVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKK1ZPSUQgQUVTX0dUS19LRVlfVU5XUkFQKAorCUlOICBVQ0hBUiAgICprZXksCisJT1VUIFVDSEFSICAgKnBsYWludGV4dCwKKwlJTglVQ0hBUgljX2xlbiwKKwlJTiAgVUNIQVIgICAqY2lwaGVydGV4dCk7CisKK0JPT0xFQU4gUlRNUENoZWNrUlNOSUUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRGF0YSwKKwlJTiAgVUNIQVIgICAgICAgICAgIERhdGFMZW4sCisJSU4gIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5LAorCU9VVAlVQ0hBUgkJCSpPZmZzZXQpOworCitCT09MRUFOIFJUTVBQYXJzZUVhcG9sS2V5RGF0YSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgUFVDSEFSICAgICAgICAgIHBLZXlEYXRhLAorCUlOICBVQ0hBUiAgICAgICAgICAgS2V5RGF0YUxlbiwKKwlJTglVQ0hBUgkJCUdyb3VwS2V5SW5kZXgsCisJSU4JVUNIQVIJCQlNc2dUeXBlLAorCUlOCUJPT0xFQU4JCQliV1BBMiwKKwlJTiAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnkpOworCitWT0lECUNvbnN0cnVjdEVhcG9sTXNnKAorCUlOIAlQUlRNUF9BREFQVEVSICAgIAlwQWQsCisgICAgSU4gCVVDSEFSCQkJCVBlZXJBdXRoTW9kZSwKKyAgICBJTiAJVUNIQVIJCQkJUGVlcldlcFN0YXR1cywKKyAgICBJTiAJVUNIQVIJCQkJTXlHcm91cEtleVdlcFN0YXR1cywKKyAgICBJTiAJVUNIQVIJCQkJTXNnVHlwZSwKKyAgICBJTglVQ0hBUgkJCQlEZWZhdWx0S2V5SWR4LAorICAgIElOIAlVQ0hBUgkJCQkqUmVwbGF5Q291bnRlciwKKwlJTiAJVUNIQVIJCQkJKktleU5vbmNlLAorCUlOCVVDSEFSCQkJCSpUeFJTQywKKwlJTglVQ0hBUgkJCQkqUFRLLAorCUlOCVVDSEFSCQkJCSpHVEssCisJSU4JVUNIQVIJCQkJKlJTTklFLAorCUlOCVVDSEFSCQkJCVJTTklFX0xlbiwKKyAgICBPVVQgUEVBUE9MX1BBQ0tFVCAgICAgICBwTXNnKTsKKworVk9JRAlDYWxjdWxhdGVNSUMoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlQZWVyV2VwU3RhdHVzLAorCUlOCVVDSEFSCQkJKlBUSywKKwlPVVQgUEVBUE9MX1BBQ0tFVCAgIHBNc2cpOworCitORElTX1NUQVRVUwlSVE1QU29mdERlY3J5cHRCcm9hZENhc3REYXRhKAorCUlOCVBSVE1QX0FEQVBURVIJCQkJCXBBZCwKKwlJTglSWF9CTEsJCQkJCQkJKnBSeEJsaywKKwlJTiAgTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMgCUdyb3VwQ2lwaGVyLAorCUlOICBQQ0lQSEVSX0tFWQkJCQkJCXBTaGFyZF9rZXkpOworCitWT0lECUNvbnN0cnVjdEVhcG9sS2V5RGF0YSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCVBlZXJBdXRoTW9kZSwKKwlJTglVQ0hBUgkJCVBlZXJXZXBTdGF0dXMsCisJSU4JVUNIQVIJCQlHcm91cEtleVdlcFN0YXR1cywKKwlJTiAJVUNIQVIJCQlNc2dUeXBlLAorCUlOCVVDSEFSCQkJRGVmYXVsdEtleUlkeCwKKwlJTglCT09MRUFOCQkJYldQQTJDYXBhYmxlLAorCUlOCVVDSEFSCQkJKlBUSywKKwlJTglVQ0hBUgkJCSpHVEssCisJSU4JVUNIQVIJCQkqUlNOSUUsCisJSU4JVUNIQVIJCQlSU05JRV9MRU4sCisJT1VUIFBFQVBPTF9QQUNLRVQgICBwTXNnKTsKKworVk9JRCBSVE1QTWFrZVJTTklFKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBVSU5UICAgICAgICAgICAgQXV0aE1vZGUsCisJSU4gIFVJTlQgICAgICAgICAgICBXZXBTdGF0dXMsCisJSU4JVUNIQVIJCQlhcGlkeCk7CisKKy8vCisvLyBmdW5jdGlvbiBwcm90b3R5cGUgaW4gYXBfd3BhLmMKKy8vCisKK0JPT0xFQU4gQVBXcGFNc2dUeXBlU3Vic3QoCisJSU4gVUNIQVIgICAgRUFQVHlwZSwKKwlPVVQgSU5UICpNc2dUeXBlKSA7CisKK01BQ19UQUJMRV9FTlRSWSAqUEFDSW5xdWlyeSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVUxPTkcgICAgICAgICAgIFdjaWQpOworCitCT09MRUFOIFJUTVBDaGVja01jYXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBFSURfU1RSVUNUICAgICAgZWlkX3B0ciwKKwlJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnkpOworCitCT09MRUFOIFJUTVBDaGVja1VjYXN0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBFSURfU1RSVUNUICAgICAgZWlkX3B0ciwKKwlJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnkpOworCitCT09MRUFOIFJUTVBDaGVja0FVVEgoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUEVJRF9TVFJVQ1QgICAgICBlaWRfcHRyLAorCUlOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSk7CisKK1ZPSUQgV1BBU3RhcnQ0V2F5SFMoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5LAorCUlOCVVMT05HCQkJVGltZUludGVydmFsKTsKKworVk9JRCBXUEFTdGFydDJXYXlHcm91cEhTKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSk7CisKK1ZPSUQgQVBXcGFFQVBQYWNrZXRBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBUFdwYUVBUE9MU3RhcnRBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBBUFdwYUVBUE9MTG9nb2ZmQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKK1ZPSUQgQVBXcGFFQVBPTEtleUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIEFQV3BhRUFQT0xBU0ZBbGVydEFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAgKkVsZW0pOworCitWT0lEIEhhbmRsZUNvdW50ZXJNZWFzdXJlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSk7CisKK1ZPSUQgUGVlclBhaXJNc2cyQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFBlZXJQYWlyTXNnNEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnksCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKKworVk9JRCBDTVRpbWVyRXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIFdQQVJldHJ5RXhlYygKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIEVucXVldWVTdGFydEZvclBTS0V4ZWMoCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKKworVk9JRCBSVE1QSGFuZGxlU1RBS2V5KAorICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkYXB0ZXIsCisgICAgSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5LAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAgKkVsZW0pOworCisjaWYgMCAvLyBtZXJnZSBpbnRvIFBlZXJQYWlyTXNnNEFjdGlvbgorVk9JRCBXcGExUGVlclBhaXJNc2c0QWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworCitWT0lEIFdwYTJQZWVyUGFpck1zZzRBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCUlOICBQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICAqRWxlbSk7CisjZW5kaWYgLy8gMCAvLworCitWT0lEIFBlZXJHcm91cE1zZzJBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCUlOICBQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSwKKwlJTiAgVk9JRCAgICAgICAgICAgICAqTXNnLAorCUlOICBVSU5UICAgICAgICAgICAgIE1zZ0xlbik7CisKKyNpZiAwCS8vIHJlcGxhY2VkIGJ5IFdQQVN0YXJ0MldheUdyb3VwSFMKK05ESVNfU1RBVFVTIEFQV3BhSGFyZFRyYW5zbWl0KAorCUlOICBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwlJTiAgUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkpOworI2VuZGlmIC8vIDAgLy8KKworVk9JRCBQYWlyRGlzQXNzb2NBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCUlOICBQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSwKKwlJTiAgVVNIT1JUICAgICAgICAgICBSZWFzb24pOworCitWT0lEIE1sbWVEZUF1dGhBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICAgcEFkLAorCUlOICBQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSwKKwlJTiAgVVNIT1JUICAgICAgICAgICBSZWFzb24pOworCitWT0lEIEdSRUtFWVBlcmlvZGljRXhlYygKKwlJTiAgUFZPSUQgICBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gIFBWT0lEICAgRnVuY3Rpb25Db250ZXh0LAorCUlOICBQVk9JRCAgIFN5c3RlbVNwZWNpZmljMiwKKwlJTiAgUFZPSUQgICBTeXN0ZW1TcGVjaWZpYzMpOworCitWT0lEIENvdW50R1RLKAorCUlOICBVQ0hBUiAgICpQTUssCisJSU4gIFVDSEFSICAgKkdOb25jZSwKKwlJTiAgVUNIQVIgICAqQUEsCisJT1VUIFVDSEFSICAgKm91dHB1dCwKKwlJTiAgVUlOVCAgICBsZW4pOworCitWT0lEICAgIEdldFNtYWxsKAorCUlOICBQVk9JRCAgIHBTcmMxLAorCUlOICBQVk9JRCAgIHBTcmMyLAorCU9VVCBQVUNIQVIgIG91dCwKKwlJTiAgVUxPTkcgICBMZW5ndGgpOworCitWT0lEICAgIEdldExhcmdlKAorCUlOICBQVk9JRCAgIHBTcmMxLAorCUlOICBQVk9JRCAgIHBTcmMyLAorCU9VVCBQVUNIQVIgIG91dCwKKwlJTiAgVUxPTkcgICBMZW5ndGgpOworCitWT0lEIEFQR2VuUmFuZG9tKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBVQ0hBUiAgICAgICAqcmFuZG9tKTsKKworVk9JRCBBRVNfR1RLX0tFWV9XUkFQKAorCUlOIFVDSEFSICprZXksCisJSU4gVUNIQVIgKnBsYWludGV4dCwKKwlJTiBVQ0hBUiBwX2xlbiwKKwlPVVQgVUNIQVIgKmNpcGhlcnRleHQpOworCitWT0lEICAgIFdwYVNlbmQoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIHBQYWNrZXQsCisgICAgSU4gIFVMT05HICAgICAgICAgICBMZW4pOworCitWT0lEICAgIEFQVG9XaXJlbGVzc1N0YSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnksCisJSU4gIFBVQ0hBUiAgICAgICAgICBwSGVhZGVyODAyXzMsCisJSU4gIFVJTlQgICAgICAgICAgICBIZHJMZW4sCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRGF0YSwKKwlJTiAgVUlOVCAgICAgICAgICAgIERhdGFMZW4sCisgICAgSU4JQk9PTEVBTgkJCWJDbGVhckZyYW1lKTsKKworVk9JRCBSVE1QQWRkUE1LSURDYWNoZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIAkJcEFkLAorCUlOCUlOVAkJCQkJCWFwaWR4LAorCUlOCVBVQ0hBUgkJCQlwQWRkciwKKwlJTglVQ0hBUgkJCQkJKlBNS0lELAorCUlOCVVDSEFSCQkJCQkqUE1LKTsKKworSU5UIFJUTVBTZWFyY2hQTUtJRENhY2hlKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOCUlOVAkJCQlhcGlkeCwKKwlJTglQVUNIQVIJCXBBZGRyKTsKKworVk9JRCBSVE1QRGVsZXRlUE1LSURDYWNoZSgKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTglJTlQJCQkJYXBpZHgsCisJSU4gIElOVAkJCQlpZHgpOworCitWT0lEIFJUTVBNYWludGFpblBNS0lEQ2FjaGUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lECVJUTVBTZW5kVHJpZ2dlckZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBWT0lECQkJcEJ1ZmZlciwKKwlJTglVTE9ORwkJCUxlbmd0aCwKKwlJTiAgVUNIQVIgICAgICAgICAgIFR4UmF0ZSwKKwlJTglCT09MRUFOCQkJYlFvc051bGwpOworCisKKy8vdHlwZWRlZiB2b2lkICgqVElNRVJfRlVOQ1RJT04pKHVuc2lnbmVkIGxvbmcpOworCisKKy8qIHRpbWVvdXQgLS0gbXMgKi8KK1ZPSUQgUlRNUF9TZXRQZXJpb2RpY1RpbWVyKAorCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIgKnBUaW1lciwKKwlJTgl1bnNpZ25lZCBsb25nIHRpbWVvdXQpOworCitWT0lEIFJUTVBfT1NfSW5pdF9UaW1lcigKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglORElTX01JTklQT1JUX1RJTUVSICpwVGltZXIsCisJSU4JVElNRVJfRlVOQ1RJT04gZnVuY3Rpb24sCisJSU4JUFZPSUQgZGF0YSk7CisKK1ZPSUQgUlRNUF9PU19BZGRfVGltZXIoCisJSU4JTkRJU19NSU5JUE9SVF9USU1FUgkqcFRpbWVyLAorCUlOCXVuc2lnbmVkIGxvbmcgdGltZW91dCk7CisKK1ZPSUQgUlRNUF9PU19Nb2RfVGltZXIoCisJSU4JTkRJU19NSU5JUE9SVF9USU1FUgkqcFRpbWVyLAorCUlOCXVuc2lnbmVkIGxvbmcgdGltZW91dCk7CisKKworVk9JRCBSVE1QX09TX0RlbF9UaW1lcigKKwlJTglORElTX01JTklQT1JUX1RJTUVSCSpwVGltZXIsCisJT1VUCUJPT0xFQU4JCQkJICpwQ2FuY2VsbGVkKTsKKworCitWT0lEIFJUTVBfT1NfUmVsZWFzZV9QYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JUFFVRVVFX0VOVFJZICBwRW50cnkpOworCitWT0lEIFJUTVB1c2VjRGVsYXkoCisJSU4JVUxPTkcJdXNlYyk7CisKK05ESVNfU1RBVFVTIG9zX2FsbG9jX21lbSgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlPVVQJUFVDSEFSICptZW0sCisJSU4JVUxPTkcgIHNpemUpOworCitORElTX1NUQVRVUyBvc19mcmVlX21lbSgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglQVUNIQVIgbWVtKTsKKworCit2b2lkIFJUTVBfQWxsb2NhdGVTaGFyZWRNZW1vcnkoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCUJPT0xFQU4JQ2FjaGVkLAorCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCisJT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKTsKKworVk9JRCBSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKKworTkRJU19TVEFUVVMgQWRhcHRlckJsb2NrQWxsb2NhdGVNZW1vcnkoCisJSU4gUFZPSUQJaGFuZGxlLAorCU9VVAlQVk9JRAkqcHBBZCk7CisKK3ZvaWQgUlRNUF9BbGxvY2F0ZVR4RGVzY01lbW9yeSgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVSU5UCUluZGV4LAorCUlOCVVMT05HCUxlbmd0aCwKKwlJTglCT09MRUFOCUNhY2hlZCwKKwlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAorCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcyk7CisKK3ZvaWQgUlRNUF9BbGxvY2F0ZUZpcnN0VHhCdWZmZXIoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUlOVAlJbmRleCwKKwlJTglVTE9ORwlMZW5ndGgsCisJSU4JQk9PTEVBTglDYWNoZWQsCisJT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKKwlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpOworCit2b2lkIFJUTVBfQWxsb2NhdGVNZ210RGVzY01lbW9yeSgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVTE9ORwlMZW5ndGgsCisJSU4JQk9PTEVBTglDYWNoZWQsCisJT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKKwlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpOworCit2b2lkIFJUTVBfQWxsb2NhdGVSeERlc2NNZW1vcnkoCisJSU4JUFJUTVBfQURBUFRFUiBwQWQsCisJSU4JVUxPTkcJTGVuZ3RoLAorCUlOCUJPT0xFQU4JQ2FjaGVkLAorCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCisJT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKTsKKworUE5ESVNfUEFDS0VUIFJUTVBfQWxsb2NhdGVSeFBhY2tldEJ1ZmZlcigKKwlJTglQUlRNUF9BREFQVEVSIHBBZCwKKwlJTglVTE9ORwlMZW5ndGgsCisJSU4JQk9PTEVBTglDYWNoZWQsCisJT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKKwlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpOworCitQTkRJU19QQUNLRVQgUlRNUF9BbGxvY2F0ZVR4UGFja2V0QnVmZmVyKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVMT05HCUxlbmd0aCwKKwlJTglCT09MRUFOCUNhY2hlZCwKKwlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzKTsKKworUE5ESVNfUEFDS0VUIFJUTVBfQWxsb2NhdGVGcmFnUGFja2V0QnVmZmVyKAorCUlOCVBSVE1QX0FEQVBURVIgcEFkLAorCUlOCVVMT05HCUxlbmd0aCk7CisKK3ZvaWQgUlRNUF9RdWVyeVBhY2tldEluZm8oCisJSU4gIFBORElTX1BBQ0tFVCBwUGFja2V0LAorCU9VVCBQQUNLRVRfSU5GTyAgKnBQYWNrZXRJbmZvLAorCU9VVCBQVUNIQVIJCSAqcFNyY0J1ZlZBLAorCU9VVAlVSU5UCQkgKnBTcmNCdWZMZW4pOworCit2b2lkIFJUTVBfUXVlcnlOZXh0UGFja2V0SW5mbygKKwlJTiAgUE5ESVNfUEFDS0VUICpwcFBhY2tldCwKKwlPVVQgUEFDS0VUX0lORk8gICpwUGFja2V0SW5mbywKKwlPVVQgUFVDSEFSCQkgKnBTcmNCdWZWQSwKKwlPVVQJVUlOVAkJICpwU3JjQnVmTGVuKTsKKworCitCT09MRUFOIFJUTVBfRmlsbFR4QmxrSW5mbygKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCwKKwlJTiBUWF9CTEsgKnBUeEJsayk7CisKKworUFJUTVBfU0NBVFRFUl9HQVRIRVJfTElTVAorcnRfZ2V0X3NnX2xpc3RfZnJvbV9wYWNrZXQoUE5ESVNfUEFDS0VUIHBQYWNrZXQsIFJUTVBfU0NBVFRFUl9HQVRIRVJfTElTVCAqc2cpOworCisKKyB2b2lkIGFubm91bmNlXzgwMl8zX3BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCk7CisKKworVUlOVCBCQV9SZW9yZGVyX0FNU0RVX0Fubm5vdW5jZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCk7CisKKworVUlOVCBIYW5kbGVfQU1TRFVfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVMT05HCQkJRGF0YVNpemUsCisJSU4gIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCisKK3ZvaWQgY29udmVydF84MDJfMTFfdG9fODAyXzNfcGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAorCUlOCVBVQ0hBUgkJCXA4MDIzaGRyLAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVMT05HCQkJRGF0YVNpemUsCisJSU4gIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCisKK1BORVRfREVWIGdldF9uZXRkZXZfZnJvbV9ic3NpZCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworCitQTkRJU19QQUNLRVQgZHVwbGljYXRlX3BrdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwSGVhZGVyODAyXzMsCisgICAgSU4gIFVJTlQgICAgICAgICAgICBIZHJMZW4sCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEYXRhU2l6ZSwKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworCitQTkRJU19QQUNLRVQgZHVwbGljYXRlX3BrdF93aXRoX1RLSVBfTUlDKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwT2xkUGt0KTsKKworUE5ESVNfUEFDS0VUIGR1cGxpY2F0ZV9wa3Rfd2l0aF9WTEFOKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBIZWFkZXI4MDJfMywKKyAgICBJTiAgVUlOVCAgICAgICAgICAgIEhkckxlbiwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVTE9ORwkJCURhdGFTaXplLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCitQTkRJU19QQUNLRVQgZHVwbGljYXRlX3BrdF93aXRoX1dQSSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKKwlJTglVSU5UMzIJCQlleHRfaGVhZF9sZW4sCisJSU4JVUlOVDMyCQkJZXh0X3RhaWxfbGVuKTsKKworVUNIQVIgVkxBTl84MDIzX0hlYWRlcl9Db3B5KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBIZWFkZXI4MDJfMywKKwlJTglVSU5UICAgICAgICAgICAgSGRyTGVuLAorCU9VVCBQVUNIQVIJCQlwRGF0YSwKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAordm9pZCBiYV9mbHVzaF9yZW9yZGVyaW5nX3RpbWVvdXRfbXBkdXMoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gUEJBX1JFQ19FTlRSWQlwQkFFbnRyeSwKKwlJTiBVTE9ORwkJCU5vdzMyKTsKKworCitWT0lEIEJBT3JpU2Vzc2lvblNldFVwKAorCQkJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCisJCQlJTiBNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSwKKwkJCUlOIFVDSEFSCQkJVElELAorCQkJSU4gVVNIT1JUCQkJVGltZU91dCwKKwkJCUlOIFVMT05HCQkJRGVsYXlUaW1lLAorCQkJSU4gQk9PTEVBTgkJaXNGb3JjZWQpOworCitWT0lEIEJBU2Vzc2lvblRlYXJEb3duQUxMKAorCUlOIE9VVAlQUlRNUF9BREFQVEVSIHBBZCwKKwlJTgkJVUNIQVIgV2NpZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK0JPT0xFQU4gT1NfTmVlZF9DbG9uZV9QYWNrZXQodm9pZCk7CisKKworVk9JRCBidWlsZF90eF9wYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCisJSU4JUFVDSEFSCXBGcmFtZSwKKwlJTglVTE9ORwlGcmFtZUxlbik7CisKKworVk9JRCBCQU9yaVNlc3Npb25UZWFyRG93bigKKwlJTiBPVVQJUFJUTVBfQURBUFRFUglwQWQsCisJSU4JCVVDSEFSCQkJV2NpZCwKKwlJTgkJVUNIQVIJCQlUSUQsCisJSU4JCUJPT0xFQU4JCQliUGFzc2l2ZSwKKwlJTgkJQk9PTEVBTgkJCWJGb3JjZVNlbmQpOworCitWT0lEIEJBUmVjU2Vzc2lvblRlYXJEb3duKAorCUlOIE9VVAlQUlRNUF9BREFQVEVSCXBBZCwKKwlJTgkJVUNIQVIJCQlXY2lkLAorCUlOCQlVQ0hBUgkJCVRJRCwKKwlJTgkJQk9PTEVBTgkJCWJQYXNzaXZlKTsKKworQk9PTEVBTiBiYV9yZW9yZGVyaW5nX3Jlc291cmNlX2luaXQoUFJUTVBfQURBUFRFUiBwQWQsIGludCBudW0pOwordm9pZCBiYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2UoUFJUTVBfQURBUFRFUiBwQWQpOworCitVTE9ORyBBdXRvQ2hCc3NJbnNlcnRFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcEJzc2lkLAorCUlOIENIQVIgU3NpZFtdLAorCUlOIFVDSEFSIFNzaWRMZW4sCisJSU4gVUNIQVIgQ2hhbm5lbE5vLAorCUlOIENIQVIgUnNzaSk7CisKK3ZvaWQgQXV0b0NoQnNzVGFibGVJbml0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKwordm9pZCBDaGFubmVsSW5mb0luaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCit2b2lkIEF1dG9DaEJzc1RhYmxlRGVzdHJveSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK3ZvaWQgQ2hhbm5lbEluZm9EZXN0cm95KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVUNIQVIgTmV3X0FwQXV0b1NlbGVjdENoYW5uZWwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitCT09MRUFOIHJ0c3RybWFjdG9oZXgoCisJSU4gY2hhciAqczEsCisJSU4gY2hhciAqczIpOworCitCT09MRUFOIHJ0c3RyY2FzZWNtcCgKKwlJTiBjaGFyICpzMSwKKwlJTiBjaGFyICpzMik7CisKK2NoYXIgKnJ0c3Ryc3RydW5jYXNlY21wKAorCUlOIGNoYXIgKnMxLAorCUlOIGNoYXIgKnMyKTsKKworY2hhciAgICAqcnRzdHJzdHIoCisJSU4JY29uc3QgY2hhciAqIHMxLAorCUlOCWNvbnN0IGNoYXIgKiBzMik7CisKK2NoYXIgKnJzdHJ0b2soCisJSU4gY2hhciAqIHMsCisJSU4gY29uc3QgY2hhciAqIGN0KTsKKworaW50IHJ0aW5ldF9hdG9uKAorCWNvbnN0IGNoYXIgKmNwLAorCXVuc2lnbmVkIGludCAqYWRkcik7CisKKy8vLy8vLy8vLy8gY29tbW9uIGlvY3RsIGZ1bmN0aW9ucyAvLy8vLy8vLy8vCitJTlQgU2V0X0RyaXZlclZlcnNpb25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0NvdW50cnlSZWdpb25fUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0NvdW50cnlSZWdpb25BQmFuZF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfV2lyZWxlc3NNb2RlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9DaGFubmVsX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9TaG9ydFNsb3RfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X1R4UG93ZXJfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQgU2V0X0JHUHJvdGVjdGlvbl9Qcm9jKAorCUlOICBQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4gIFBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfVHhQcmVhbWJsZV9Qcm9jKAorCUlOICBQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4gIFBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfUlRTVGhyZXNob2xkX1Byb2MoCisJSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiAgUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9GcmFnVGhyZXNob2xkX1Byb2MoCisJSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiAgUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9UeEJ1cnN0X1Byb2MoCisJSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiAgUFVDSEFSCQkJYXJnKTsKKworI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKK0lOVAlTZXRfUGt0QWdncmVnYXRlX1Byb2MoCisJSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKKwlJTiAgUFVDSEFSCQkJYXJnKTsKKyNlbmRpZgorCitJTlQJU2V0X0lFRUU4MDIxMUhfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCisjaWZkZWYgREJHCitJTlQJU2V0X0RlYnVnX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKyNlbmRpZgorCitJTlQJU2hvd19EZXNjSW5mb19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfUmVzZXRTdGF0Q291bnRlcl9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK0lOVAlTZXRfQkFTZXR1cF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfQkFEZWNsaW5lX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9CQU9yaVRlYXJEb3duX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9CQVJlY1RlYXJEb3duX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdEJ3X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdE1jc19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRHaV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRPcE1vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0U3RiY19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRIdGNfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0RXh0Y2hhX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdE1wZHVEZW5zaXR5X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdEJhV2luU2l6ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRSZGdfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0h0TGlua0FkYXB0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdEFtc2R1X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdEF1dG9CYV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVAlTZXRfSHRQcm90ZWN0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdE1pbW9Qc19Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKKworSU5UCVNldF9Gb3JjZVNob3J0R0lfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0X0ZvcmNlR0ZfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitJTlQJU2V0Q29tbW9uSFQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitJTlQJU2V0X1NlbmRQU01QQWN0aW9uX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UCVNldF9IdE1JTU9QU21vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCisKK0lOVAlTZXRfSHRUeEJBU2l6ZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisvL0RscyAsCWthdGh5CitWT0lEIFJUTVBTZW5kRExTVGVhckRvd25GcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwREEpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisvL0Jsb2NrIEFDSworVk9JRCBRdWVyeUJBVEFCTEUoCisJSU4gIFBSVE1QX0FEQVBURVIgcEFkLAorCU9VVCBQUVVFUllCQV9UQUJMRSBwQkFUKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKK0lOVAkgICAgV3BhQ2hlY2tFYXBDb2RlKAorCUlOICBQUlRNUF9BREFQVEVSICAgCXBBZCwKKwlJTiAgUFVDSEFSCQkJCXBGcmFtZSwKKwlJTiAgVVNIT1JUCQkJCUZyYW1lTGVuLAorCUlOICBVU0hPUlQJCQkJT2ZmU2V0KTsKKworVk9JRCAgICBXcGFTZW5kTWljRmFpbHVyZVRvV3BhU3VwcGxpY2FudCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQsCisgICAgSU4gIEJPT0xFQU4gICAgICAgICAgICAgYlVuaWNhc3QpOworCitWT0lEICAgIFNlbmRBc3NvY0lFc1RvV3BhU3VwcGxpY2FudCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQpOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCitpbnQgd2V4dF9ub3RpZnlfZXZlbnRfYXNzb2MoCisJSU4gIFJUTVBfQURBUFRFUiAqcEFkKTsKKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitWT0lEIEhhbmRsZV9CU1NfV2lkdGhfVHJpZ2dlcl9FdmVudHMoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCit2b2lkIGJ1aWxkX2V4dF9jaGFubmVsX3N3aXRjaF9pZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBIVF9FWFRfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UX0lFICpwSUUpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisKK0JPT0xFQU4gQVBSeERvbmVJbnRlcnJ1cHRIYW5kbGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitCT09MRUFOIFNUQVJ4RG9uZUludGVycnVwdEhhbmRsZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglCT09MRUFOCQkJYXJnYyk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKy8vIEFNUERVIHBhY2tldCBpbmRpY2F0aW9uCitWT0lEIEluZGljYXRlX0FNUERVX1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCisvLyBBTVNEVSBwYWNrZXQgaW5kaWNhdGlvbgorVk9JRCBJbmRpY2F0ZV9BTVNEVV9QYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworLy8gTm9ybWFsIGxlZ2FjeSBSeCBwYWNrZXQgaW5kaWNhdGlvbgorVk9JRCBJbmRpY2F0ZV9MZWdhY3lfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKK1ZPSUQgSW5kaWNhdGVfRUFQT0xfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKK3ZvaWQgIHVwZGF0ZV9vc19wYWNrZXRfaW5mbygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCit2b2lkIHdsYW5fODAyXzExX3RvXzgwMl8zX3BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrLAorCUlOCVBVQ0hBUgkJCXBIZWFkZXI4MDJfMywKKwlJTiAgVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7CisKK1VJTlQgZGVhZ2dyZWdhdGVfQU1TRFVfYW5ub3VuY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJUE5ESVNfUEFDS0VUCQlwUGFja2V0LAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVMT05HCQkJRGF0YVNpemUpOworCisKKyNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKKy8vIHJlbW92ZSBMTEMgYW5kIGdldCA4MDJfMyBIZWFkZXIKKyNkZWZpbmUgIFJUTVBfODAyXzExX1JFTU9WRV9MTENfQU5EX0NPTlZFUlRfVE9fODAyXzMoX3BSeEJsaywgX3BIZWFkZXI4MDJfMykJXAorewkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCVBVQ0hBUiBfcFJlbW92ZWRMTENTTkFQID0gTlVMTCwgX3BEQSwgX3BTQTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwlpZiAoUlhfQkxLX1RFU1RfRkxBRyhfcFJ4QmxrLCBmUlhfTUVTSCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCV9wREEgPSBfcFJ4QmxrLT5wSGVhZGVyLT5BZGRyMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJX3BTQSA9IChQVUNIQVIpX3BSeEJsay0+cEhlYWRlciArIHNpemVvZihIRUFERVJfODAyXzExKTsgICAgICAgICAgICAgICAgXAorCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlpZiAoUlhfQkxLX1RFU1RfRkxBRyhfcFJ4QmxrLCBmUlhfSU5GUkEpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlcCisJCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCV9wREEgPSBfcFJ4QmxrLT5wSGVhZGVyLT5BZGRyMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlpZiAoUlhfQkxLX1RFU1RfRkxBRyhfcFJ4QmxrLCBmUlhfRExTKSkJCQkJCQkJCQlcCisJCQlfcFNBID0gX3BSeEJsay0+cEhlYWRlci0+QWRkcjI7CQkJCQkJCQkJCVwKKwkJZWxzZQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJX3BTQSA9IF9wUnhCbGstPnBIZWFkZXItPkFkZHIzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlfcERBID0gX3BSeEJsay0+cEhlYWRlci0+QWRkcjE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCV9wU0EgPSBfcFJ4QmxrLT5wSGVhZGVyLT5BZGRyMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJXAorCUNPTlZFUlRfVE9fODAyXzMoX3BIZWFkZXI4MDJfMywgX3BEQSwgX3BTQSwgX3BSeEJsay0+cERhdGEsIAkJCQlcCisJCV9wUnhCbGstPkRhdGFTaXplLCBfcFJlbW92ZWRMTENTTkFQKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworCitCT09MRUFOIEFQRm93YXJkV2lyZWxlc3NTdGFUb1dpcmVsZXNzU3RhKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAorCUlOCVVMT05HCQkJRnJvbVdoaWNoQlNTSUQpOworCitWT0lEIEFubm91bmNlX29yX0ZvcndhcmRfODAyXzNfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworCitWT0lEIFN0YV9Bbm5vdW5jZV9vcl9Gb3J3YXJkXzgwMl8zX1BhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCisjZGVmaW5lIEFOTk9VTkNFX09SX0ZPUldBUkRfODAyXzNfUEFDS0VUKF9wQWQsIF9wUGFja2V0LCBfRnJvbVdoaWNoQlNTKVwKKwkJCVN0YV9Bbm5vdW5jZV9vcl9Gb3J3YXJkXzgwMl8zX1BhY2tldChfcEFkLCBfcFBhY2tldCwgX0Zyb21XaGljaEJTUyk7CisJCQkvL2Fubm91bmNlXzgwMl8zX3BhY2tldChfcEFkLCBfcFBhY2tldCk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKKworUE5ESVNfUEFDS0VUIER1cGxpY2F0ZVBhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworCitQTkRJU19QQUNLRVQgQ2xvbmVQYWNrZXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCisJSU4JUFVDSEFSCQkJcERhdGEsCisJSU4JVUxPTkcJCQlEYXRhU2l6ZSk7CisKKworLy8gTm9ybWFsLCBBTVBEVSBvciBBTVNEVQorVk9JRCBDbW1SeG5vblJhbGlua0ZyYW1lSW5kaWNhdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworVk9JRCBDbW1SeFJhbGlua0ZyYW1lSW5kaWNhdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnksCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKKworVk9JRCBVcGRhdGVfUnNzaV9TYW1wbGUoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gUlNTSV9TQU1QTEUJCSpwUnNzaSwKKwlJTiBQUlhXSV9TVFJVQwkJcFJ4V0kpOworCitQTkRJU19QQUNLRVQgR2V0UGFja2V0RnJvbVJ4UmluZygKKwlJTgkJUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCQlQUlQyOFhYX1JYRF9TVFJVQwkJcFNhdmVSeEQsCisJT1VUCQlCT09MRUFOCQkJKnBiUmVzY2hlZHVsZSwKKwlJTiBPVVQJVUlOVDMyCQkJKnBSeFBlbmRpbmcpOworCitQTkRJU19QQUNLRVQgUlRNUERlRnJhZ21lbnREYXRhRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUlhfQkxLCQkJKnBSeEJsayk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCisKKworCisjaWZkZWYgU05NUF9TVVBQT1JUCisvL2ZvciBzbm1wICwga2F0aHkKK3R5cGVkZWYgc3RydWN0IF9EZWZhdWx0S2V5SWR4VmFsdWUKK3sKKwlVQ0hBUglLZXlJZHg7CisJVUNIQVIJVmFsdWVbMTZdOworfSBEZWZhdWx0S2V5SWR4VmFsdWUsICpQRGVmYXVsdEtleUlkeFZhbHVlOworI2VuZGlmCisKKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorZW51bSB7CisJRElEbXNnX2xueGluZF93bGFuc25pZmZybQkJPSAweDAwMDAwMDQ0LAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1faG9zdHRpbWUJPSAweDAwMDEwMDQ0LAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fbWFjdGltZQk9IDB4MDAwMjAwNDQsCisJRElEbXNnX2xueGluZF93bGFuc25pZmZybV9jaGFubmVsCT0gMHgwMDAzMDA0NCwKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3Jzc2kJCT0gMHgwMDA0MDA0NCwKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3NxCQk9IDB4MDAwNTAwNDQsCisJRElEbXNnX2xueGluZF93bGFuc25pZmZybV9zaWduYWwJPSAweDAwMDYwMDQ0LAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fbm9pc2UJCT0gMHgwMDA3MDA0NCwKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3JhdGUJCT0gMHgwMDA4MDA0NCwKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2lzdHgJCT0gMHgwMDA5MDA0NCwKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2ZybWxlbgk9IDB4MDAwQTAwNDQKK307CitlbnVtIHsKKwlQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX25vX3ZhbHVlCT0gMHgwMAorfTsKK2VudW0geworCVA4MDIxMUVOVU1fdHJ1dGhfZmFsc2UJCQk9IDB4MDAsCisJUDgwMjExRU5VTV90cnV0aF90cnVlCQkJPSAweDAxCit9OworCisvKiBEZWZpbml0aW9uIGZyb20gbWFkd2lmaSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBVSU5UMzIgZGlkOworICAgICAgICBVSU5UMTYgc3RhdHVzOworICAgICAgICBVSU5UMTYgbGVuOworICAgICAgICBVSU5UMzIgZGF0YTsKK30gcDgwMjExaXRlbV91aW50MzJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBVSU5UMzIgbXNnY29kZTsKKyAgICAgICAgVUlOVDMyIG1zZ2xlbjsKKyNkZWZpbmUgV0xBTl9ERVZOQU1FTEVOX01BWCAxNgorICAgICAgICBVSU5UOCBkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdOworICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IGhvc3R0aW1lOworICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IG1hY3RpbWU7CisgICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3QgY2hhbm5lbDsKKyAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCByc3NpOworICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IHNxOworICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IHNpZ25hbDsKKyAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCBub2lzZTsKKyAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCByYXRlOworICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IGlzdHg7CisgICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3QgZnJtbGVuOworfSB3bGFuX25nX3ByaXNtMl9oZWFkZXI7CisKKy8qIFRoZSByYWRpbyBjYXB0dXJlIGhlYWRlciBwcmVjZWRlcyB0aGUgODAyLjExIGhlYWRlci4gKi8KK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfaWVlZTgwMjExX3JhZGlvdGFwX2hlYWRlciB7CisgICAgVUlOVDgJaXRfdmVyc2lvbjsJLyogVmVyc2lvbiAwLiBPbmx5IGluY3JlYXNlcworCQkJCSAqIGZvciBkcmFzdGljIGNoYW5nZXMsCisJCQkJICogaW50cm9kdWN0aW9uIG9mIGNvbXBhdGlibGUKKwkJCQkgKiBuZXcgZmllbGRzIGRvZXMgbm90IGNvdW50LgorCQkJCSAqLworICAgIFVJTlQ4CWl0X3BhZDsKKyAgICBVSU5UMTYgICAgIGl0X2xlbjsgICAgICAgICAvKiBsZW5ndGggb2YgdGhlIHdob2xlCisJCQkJICogaGVhZGVyIGluIGJ5dGVzLCBpbmNsdWRpbmcKKwkJCQkgKiBpdF92ZXJzaW9uLCBpdF9wYWQsCisJCQkJICogaXRfbGVuLCBhbmQgZGF0YSBmaWVsZHMuCisJCQkJICovCisgICAgVUlOVDMyICAgaXRfcHJlc2VudDsJLyogQSBiaXRtYXAgdGVsbGluZyB3aGljaAorCQkJCQkgKiBmaWVsZHMgYXJlIHByZXNlbnQuIFNldCBiaXQgMzEKKwkJCQkJICogKDB4ODAwMDAwMDApIHRvIGV4dGVuZCB0aGUKKwkJCQkJICogYml0bWFwIGJ5IGFub3RoZXIgMzIgYml0cy4KKwkJCQkJICogQWRkaXRpb25hbCBleHRlbnNpb25zIGFyZSBtYWRlCisJCQkJCSAqIGJ5IHNldHRpbmcgYml0IDMxLgorCQkJCQkgKi8KK31pZWVlODAyMTFfcmFkaW90YXBfaGVhZGVyIDsKKworZW51bSBpZWVlODAyMTFfcmFkaW90YXBfdHlwZSB7CisgICAgSUVFRTgwMjExX1JBRElPVEFQX1RTRlQgPSAwLAorICAgIElFRUU4MDIxMV9SQURJT1RBUF9GTEFHUyA9IDEsCisgICAgSUVFRTgwMjExX1JBRElPVEFQX1JBVEUgPSAyLAorICAgIElFRUU4MDIxMV9SQURJT1RBUF9DSEFOTkVMID0gMywKKyAgICBJRUVFODAyMTFfUkFESU9UQVBfRkhTUyA9IDQsCisgICAgSUVFRTgwMjExX1JBRElPVEFQX0RCTV9BTlRTSUdOQUwgPSA1LAorICAgIElFRUU4MDIxMV9SQURJT1RBUF9EQk1fQU5UTk9JU0UgPSA2LAorICAgIElFRUU4MDIxMV9SQURJT1RBUF9MT0NLX1FVQUxJVFkgPSA3LAorICAgIElFRUU4MDIxMV9SQURJT1RBUF9UWF9BVFRFTlVBVElPTiA9IDgsCisgICAgSUVFRTgwMjExX1JBRElPVEFQX0RCX1RYX0FUVEVOVUFUSU9OID0gOSwKKyAgICBJRUVFODAyMTFfUkFESU9UQVBfREJNX1RYX1BPV0VSID0gMTAsCisgICAgSUVFRTgwMjExX1JBRElPVEFQX0FOVEVOTkEgPSAxMSwKKyAgICBJRUVFODAyMTFfUkFESU9UQVBfREJfQU5UU0lHTkFMID0gMTIsCisgICAgSUVFRTgwMjExX1JBRElPVEFQX0RCX0FOVE5PSVNFID0gMTMKK307CisKKyNkZWZpbmUgV0xBTl9SQURJT1RBUF9QUkVTRU5UICgJCQlcCisJKDEgPDwgSUVFRTgwMjExX1JBRElPVEFQX1RTRlQpCXwJXAorCSgxIDw8IElFRUU4MDIxMV9SQURJT1RBUF9GTEFHUykgfAlcCisJKDEgPDwgSUVFRTgwMjExX1JBRElPVEFQX1JBVEUpICB8IAlcCisJIDApCisKK3R5cGVkZWYgc3RydWN0IF93bGFuX3JhZGlvdGFwX2hlYWRlciB7CisJaWVlZTgwMjExX3JhZGlvdGFwX2hlYWRlciB3dF9paGRyOworCUlOVDY0IHd0X3RzZnQ7CisJVUlOVDggd3RfZmxhZ3M7CisJVUlOVDggd3RfcmF0ZTsKK30gd2xhbl9yYWRpb3RhcF9oZWFkZXI7CisvKiBEZWZpbml0aW9uIGZyb20gbWFkd2lmaSAqLworCit2b2lkIHNlbmRfbW9uaXRvcl9wYWNrZXRzKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVJYX0JMSwkJCSpwUnhCbGspOworCisjaWYgV0lSRUxFU1NfRVhUID49IDEyCisvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW4gcXVlcnkgL3Byb2MKK3N0cnVjdCBpd19zdGF0aXN0aWNzICpydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzKAorICAgIElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKKyNlbmRpZgorCitWT0lEICAgIFJUTVBTZXREZXNpcmVkUmF0ZXMoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgTE9ORyAgICAgICAgICAgIFJhdGVzKTsKKyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KKworSU5UCVNldF9GaXhlZFR4TW9kZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKKyNpZmRlZiBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVAorSU5UCVNldF9PcE1vZGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworI2VuZGlmIC8vIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUIC8vCisKK3N0YXRpYyBpbmxpbmUgY2hhciogR2V0UGh5TW9kZSgKKwlpbnQgTW9kZSkKK3sKKwlzd2l0Y2goTW9kZSkKKwl7CisJCWNhc2UgTU9ERV9DQ0s6CisJCQlyZXR1cm4gIkNDSyI7CisKKwkJY2FzZSBNT0RFX09GRE06CisJCQlyZXR1cm4gIk9GRE0iOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQljYXNlIE1PREVfSFRNSVg6CisJCQlyZXR1cm4gIkhUTUlYIjsKKworCQljYXNlIE1PREVfSFRHUkVFTkZJRUxEOgorCQkJcmV0dXJuICJHUkVFTiI7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gIk4vQSI7CisJfQorfQorCisKK3N0YXRpYyBpbmxpbmUgY2hhciogR2V0QlcoCisJaW50IEJXKQoreworCXN3aXRjaChCVykKKwl7CisJCWNhc2UgQldfMTA6CisJCQlyZXR1cm4gIjEwTSI7CisKKwkJY2FzZSBCV18yMDoKKwkJCXJldHVybiAiMjBNIjsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJY2FzZSBCV180MDoKKwkJCXJldHVybiAiNDBNIjsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJZGVmYXVsdDoKKwkJCXJldHVybiAiTi9BIjsKKwl9Cit9CisKKworVk9JRCBSVDI4eHhUaHJlYWRUZXJtaW5hdGUoCisJSU4gUlRNUF9BREFQVEVSICpwQWQpOworCitCT09MRUFOIFJUMjhYWENoaXBzZXRDaGVjaygKKwlJTiB2b2lkICpfZGV2X3ApOworCitCT09MRUFOIFJUMjhYWE5ldERldkluaXQoCisJSU4gdm9pZCAJCQkJKl9kZXZfcCwKKwlJTiBzdHJ1Y3QgIG5ldF9kZXZpY2UJKm5ldF9kZXYsCisJSU4gUlRNUF9BREFQVEVSIAkJKnBBZCk7CisKK0JPT0xFQU4gUlQyOFhYUHJvYmVQb3N0Q29uZmlnKAorCUlOIHZvaWQgCQkJCSpfZGV2X3AsCisJSU4gUlRNUF9BREFQVEVSIAkJKnBBZCwKKwlJTiBJTlQzMgkJCQlhcmdjKTsKKworVk9JRCBSVDI4WFhETUFEaXNhYmxlKAorCUlOIFJUTVBfQURBUFRFUiAJCSpwQWQpOworCitWT0lEIFJUMjhYWERNQUVuYWJsZSgKKwlJTiBSVE1QX0FEQVBURVIgCQkqcEFkKTsKKworVk9JRCBSVDI4eHhfVXBkYXRlQmVhY29uVG9Bc2ljKAorCUlOIFJUTVBfQURBUFRFUiAqIHBBZCwKKwlJTiBJTlQgYXBpZHgsCisJSU4gVUxPTkcgQmVhY29uTGVuLAorCUlOIFVMT05HIFVwZGF0ZVBvcyk7CisKK0lOVCBydDI4eHhfaW9jdGwoCisJSU4Jc3RydWN0IG5ldF9kZXZpY2UJKm5ldF9kZXYsCisJSU4JT1VUCXN0cnVjdCBpZnJlcQkqcnEsCisJSU4JSU5UCQkJY21kKTsKKworCisjaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCitJTlQgcnQyOHh4X3N0YV9pb2N0bCgKKwlJTglzdHJ1Y3QgbmV0X2RldmljZQkqbmV0X2RldiwKKwlJTglPVVQJc3RydWN0IGlmcmVxCSpycSwKKwlJTglJTlQJCQljbWQpOworI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCitCT09MRUFOIFJUMjhYWFNlY3VyaXR5S2V5QWRkKAorCUlOCQlQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4JCVVMT05HCQkJCWFwaWR4LAorCUlOCQlVTE9ORwkJCQlLZXlJZHgsCisJSU4JCU1BQ19UQUJMRV9FTlRSWSAJKnBFbnRyeSk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK1BORElTX1BBQ0tFVCBHZXRQYWNrZXRGcm9tUnhSaW5nKAorCUlOCQlQUlRNUF9BREFQVEVSCXBBZCwKKwlPVVQJCVBSVDI4WFhfUlhEX1NUUlVDCXBTYXZlUnhELAorCU9VVAkJQk9PTEVBTgkJCSpwYlJlc2NoZWR1bGUsCisJSU4gT1VUCVVJTlQzMgkJCSpwUnhQZW5kaW5nKTsKKworCit2b2lkIGtpbGxfdGhyZWFkX3Rhc2soUFJUTVBfQURBUFRFUiBwQWQpOworCit2b2lkIHRidHRfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworCisKK1ZPSUQgQXNpY1R1cm5PZmZSRkNsaygKKwlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKKwlJTglVQ0hBUiAgICAgICAgICAgQ2hhbm5lbCk7CisKK1ZPSUQgQXNpY1R1cm5PblJGQ2xrKAorCUlOIFBSVE1QX0FEQVBURVIgCXBBZCwKKwlJTglVQ0hBUgkJCUNoYW5uZWwpOworCisjaWZkZWYgUlQyODcwCisvLworLy8gRnVuY3Rpb24gUHJvdG90eXBlIGluIHJ0dXNiX2J1bGsuYworLy8KK1ZPSUQJUlRVU0JJbml0VHhEZXNjKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBUWF9DT05URVhUCQlwVHhDb250ZXh0LAorCUlOCVVDSEFSCQkJQnVsa091dFBpcGVJZCwKKwlJTgl1c2JfY29tcGxldGVfdAlGdW5jKTsKKworVk9JRAlSVFVTQkluaXRIVFR4RGVzYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQSFRfVFhfQ09OVEVYVAlwVHhDb250ZXh0LAorCUlOCVVDSEFSCQkJQnVsa091dFBpcGVJZCwKKwlJTglVTE9ORwkJCUJ1bGtPdXRTaXplLAorCUlOCXVzYl9jb21wbGV0ZV90CUZ1bmMpOworCitWT0lECVJUVVNCSW5pdFJ4RGVzYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQUlhfQ09OVEVYVAkJcFJ4Q29udGV4dCk7CisKK1ZPSUQgUlRVU0JDbGVhblVwRGF0YUJ1bGtPdXRRdWV1ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgUlRVU0JDYW5jZWxQZW5kaW5nQnVsa091dElSUCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgUlRVU0JCdWxrT3V0RGF0YVBhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUJ1bGtPdXRQaXBlSWQsCisJSU4JVUNIQVIJCQlJbmRleCk7CisKK1ZPSUQgUlRVU0JCdWxrT3V0TnVsbEZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBSVFVTQkJ1bGtPdXRSVFNGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgUlRVU0JDYW5jZWxQZW5kaW5nQnVsa0luSVJQKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBSVFVTQkNhbmNlbFBlbmRpbmdJUlBzKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworVk9JRCBSVFVTQkJ1bGtPdXRNTE1FUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJSW5kZXgpOworCitWT0lEIFJUVVNCQnVsa091dFBzUG9sbCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgUlRVU0JDbGVhblVwTUxNRUJ1bGtPdXRRdWV1ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgUlRVU0JLaWNrQnVsa091dCgKKwlJTglQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQJUlRVU0JCdWxrUmVjZWl2ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgRG9CdWxrSW4oCisJSU4gUlRNUF9BREFQVEVSICpwQWQpOworCitWT0lEIFJUVVNCSW5pdFJ4RGVzYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgUFJYX0NPTlRFWFQJCXBSeENvbnRleHQpOworCitWT0lEIFJUVVNCQnVsa1J4SGFuZGxlKAorCUlOIHVuc2lnbmVkIGxvbmcgZGF0YSk7CisKKy8vCisvLyBGdW5jdGlvbiBQcm90b3R5cGUgaW4gcnR1c2JfaW8uYworLy8KK05UU1RBVFVTIFJUVVNCTXVsdGlSZWFkKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVTSE9SVAkJCU9mZnNldCwKKwlPVVQJUFVDSEFSCQkJcERhdGEsCisJSU4JVVNIT1JUCQkJbGVuZ3RoKTsKKworTlRTVEFUVVMgUlRVU0JNdWx0aVdyaXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVTSE9SVAkJCU9mZnNldCwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVU0hPUlQJCQlsZW5ndGgpOworCitOVFNUQVRVUyBSVFVTQk11bHRpV3JpdGVfT25lQnl0ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVU0hPUlQJCQlPZmZzZXQsCisJSU4JUFVDSEFSCQkJcERhdGEpOworCitOVFNUQVRVUyBSVFVTQlJlYWRCQlBSZWdpc3RlcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUlkLAorCUlOCVBVQ0hBUgkJCXBWYWx1ZSk7CisKK05UU1RBVFVTIFJUVVNCV3JpdGVCQlBSZWdpc3RlcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUlkLAorCUlOCVVDSEFSCQkJVmFsdWUpOworCitOVFNUQVRVUyBSVFVTQldyaXRlUkZSZWdpc3RlcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVSU5UMzIJCQlWYWx1ZSk7CisKK05UU1RBVFVTCVJUMzB4eFdyaXRlUkZSZWdpc3RlcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCVJlZ0lELAorCUlOCVVDSEFSCQkJVmFsdWUpOworCitOVFNUQVRVUwlSVDMweHhSZWFkUkZSZWdpc3RlcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCVJlZ0lELAorCUlOCVBVQ0hBUgkJCXBWYWx1ZSk7CisKK05UU1RBVFVTIFJUVVNCX1ZlbmRvclJlcXVlc3QoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUlOVDMyCQkJVHJhbnNmZXJGbGFncywKKwlJTglVQ0hBUgkJCVJlc2VydmVkQml0cywKKwlJTglVQ0hBUgkJCVJlcXVlc3QsCisJSU4JVVNIT1JUCQkJVmFsdWUsCisJSU4JVVNIT1JUCQkJSW5kZXgsCisJSU4JUFZPSUQJCQlUcmFuc2ZlckJ1ZmZlciwKKwlJTglVSU5UMzIJCQlUcmFuc2ZlckJ1ZmZlckxlbmd0aCk7CisKK05UU1RBVFVTIFJUVVNCUmVhZEVFUFJPTSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVU0hPUlQJCQlPZmZzZXQsCisJT1VUCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVTSE9SVAkJCWxlbmd0aCk7CisKK05UU1RBVFVTIFJUVVNCV3JpdGVFRVBST00oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVVNIT1JUCQkJT2Zmc2V0LAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVTSE9SVAkJCWxlbmd0aCk7CisKK1ZPSUQgUlRVU0JQdXRUb1NsZWVwKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworTlRTVEFUVVMgUlRVU0JXYWtlVXAoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIFJUVVNCSW5pdGlhbGl6ZUNtZFEoCisJSU4JUENtZFEJY21kcSk7CisKK05ESVNfU1RBVFVTCVJUVVNCRW5xdWV1ZUNtZEZyb21OZGlzKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU5ESVNfT0lECQlPaWQsCisJSU4JQk9PTEVBTgkJCVNldEluZm9ybWF0aW9uLAorCUlOCVBWT0lECQkJcEluZm9ybWF0aW9uQnVmZmVyLAorCUlOCVVJTlQzMgkJCUluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoKTsKKworTkRJU19TVEFUVVMgUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gTkRJU19PSUQJCQlPaWQsCisJSU4gUFZPSUQJCQlwSW5mb3JtYXRpb25CdWZmZXIsCisJSU4gVUlOVDMyCQkJSW5mb3JtYXRpb25CdWZmZXJMZW5ndGgpOworCitWT0lEIFJUVVNCRGVxdWV1ZUNtZCgKKwlJTglQQ21kUQkJY21kcSwKKwlPVVQJUENtZFFFbG10CSpwY21kcWVsbXQpOworCitJTlQgUlRVU0JDbWRUaHJlYWQoCisJSU4gT1VUIFBWT0lEIENvbnRleHQpOworCitJTlQgVGltZXJRVGhyZWFkKAorCUlOIE9VVCBQVk9JRCBDb250ZXh0KTsKKworUlQyODcwX1RJTUVSX0VOVFJZICpSVDI4NzBfVGltZXJRX0luc2VydCgKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCwKKwlJTiBSQUxJTktfVElNRVJfU1RSVUNUICpwVGltZXIpOworCitCT09MRUFOIFJUMjg3MF9UaW1lclFfUmVtb3ZlKAorCUlOIFJUTVBfQURBUFRFUiAqcEFkLAorCUlOIFJBTElOS19USU1FUl9TVFJVQ1QgKnBUaW1lcik7CisKK3ZvaWQgUlQyODcwX1RpbWVyUV9FeGl0KAorCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKKwordm9pZCBSVDI4NzBfVGltZXJRX0luaXQoCisJSU4gUlRNUF9BREFQVEVSICpwQWQpOworCitWT0lEIFJUMjg3MF9Cc3NCZWFjb25FeGl0KAorCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKKworVk9JRCBSVDI4NzBfQnNzQmVhY29uU3RvcCgKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCk7CisKK1ZPSUQgUlQyODcwX0Jzc0JlYWNvblN0YXJ0KAorCUlOIFJUTVBfQURBUFRFUiAqIHBBZCk7CisKK1ZPSUQgUlQyODcwX0Jzc0JlYWNvbkluaXQoCisJSU4gUlRNUF9BREFQVEVSICpwQWQpOworCitWT0lEIFJUMjg3MF9XYXRjaERvZygKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCk7CisKK05UU1RBVFVTIFJUVVNCV3JpdGVNQUNSZWdpc3RlcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVU0hPUlQJCQlPZmZzZXQsCisJSU4JVUlOVDMyCQkJVmFsdWUpOworCitOVFNUQVRVUyBSVFVTQlJlYWRNQUNSZWdpc3RlcigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVU0hPUlQJCQlPZmZzZXQsCisJT1VUCVBVSU5UMzIJCQlwVmFsdWUpOworCitOVFNUQVRVUyBSVFVTQlNpbmdsZVdyaXRlKAorCUlOIAlSVE1QX0FEQVBURVIgCSpwQWQsCisJSU4JVVNIT1JUCQkJT2Zmc2V0LAorCUlOCVVTSE9SVAkJCVZhbHVlKTsKKworTlRTVEFUVVMgUlRVU0JGaXJtd2FyZVJ1bigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK05UU1RBVFVTIFJUVVNCRmlybXdhcmVXcml0ZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIJCXBGd0ltYWdlLAorCUlOIFVMT05HCQlGd0xlbik7CisKK05UU1RBVFVTCVJUVVNCRmlybXdhcmVPcG1vZGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJT1VUCVBVSU5UMzIJCQlwVmFsdWUpOworCitOVFNUQVRVUwlSVFVTQlZlbmRlclJlc2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKworTkRJU19TVEFUVVMgUlRVU0JTZXRIYXJkV2FyZVJlZ2lzdGVyKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4JUFZPSUQJCQlwQnVmKTsKKworTkRJU19TVEFUVVMgUlRVU0JRdWVyeUhhcmRXYXJlUmVnaXN0ZXIoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglQVk9JRAkJCXBCdWYpOworCitWT0lEIENNREhhbmRsZXIoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCisKK05ESVNfU1RBVFVTCSBDcmVhdGVUaHJlYWRzKAorCUlOCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ICk7CisKKworVk9JRCBNYWNUYWJsZUluaXRpYWxpemUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIE1sbWVTZXRQc20oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gVVNIT1JUIHBzbSk7CisKK05ESVNfU1RBVFVTIFJUTVBXUEFBZGRLZXlQcm9jKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVk9JRCAgICAgICAgICAgcEJ1Zik7CisKK1ZPSUQgQXNpY1J4QW50RXZhbEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKKyNpZiAwIC8vIE1hcmsgYmVjYXVzZSBub3QgdXNlZCBpbiBSVDI4eHguCitOVFNUQVRVUyBSVFVTQlJ4UGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIgIHBBZCwKKwlJTiAgICBCT09MRUFOICAgICAgICAgIGJCdWxrUmVjZWl2ZSk7CisKK1ZPSUQgUlRVU0JEZXF1ZXVlTUxNRVBhY2tldCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgUlRVU0JDbGVhblVwTUxNRVdhaXRRdWV1ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisjZW5kaWYKKwordm9pZCBhcHBlbmRfcGt0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBIZWFkZXI4MDJfMywKKyAgICBJTiAgVUlOVCAgICAgICAgICAgIEhkckxlbiwKKwlJTglQVUNIQVIJCQlwRGF0YSwKKwlJTglVTE9ORwkJCURhdGFTaXplLAorCU9VVCAgUE5ESVNfUEFDS0VUCSpwcFBhY2tldCk7CisKK1VJTlQgZGVhZ2dyZWdhdGVfQU1TRFVfYW5ub3VuY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJUE5ESVNfUEFDS0VUCQlwUGFja2V0LAorCUlOCVBVQ0hBUgkJCXBEYXRhLAorCUlOCVVMT05HCQkJRGF0YVNpemUpOworCitORElTX1NUQVRVUwlSVE1QQ2hlY2tSeEVycm9yKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBIRUFERVJfODAyXzExCXBIZWFkZXIsCisJSU4JUFJYV0lfU1RSVUMJcFJ4V0ksCisJSU4JUFJUMjhYWF9SWERfU1RSVUMJcFJ4SU5GTyk7CisKKworVk9JRCBSVFVTQk1sbWVIYXJkVHJhbnNtaXQoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUE1HTVRfU1RSVUMJCXBNZ210KTsKKworSU5UIE1sbWVUaHJlYWQoCisJSU4gUFZPSUQgQ29udGV4dCk7CisKKyNpZiAwCitWT0lEICAgIFJUVVNCUmVzdW1lTXNkdVRyYW5zbWlzc2lvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisKK1ZPSUQgICAgUlRVU0JTdXNwZW5kTXNkdVRyYW5zbWlzc2lvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCk7CisjZW5kaWYKKworLy8KKy8vIEZ1bmN0aW9uIFByb3RvdHlwZSBpbiBydHVzYl9kYXRhLmMKKy8vCitORElTX1NUQVRVUwlSVFVTQkZyZWVEZXNjcmlwdG9yUmVxdWVzdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUJ1bGtPdXRQaXBlSWQsCisJSU4JVUlOVDMyCQkJTnVtYmVyUmVxdWlyZWQpOworCisKK0JPT0xFQU4JUlRVU0JOZWVkUXVldWVCYWNrRm9yQWdnKAorCUlOIFJUTVBfQURBUFRFUiAqcEFkLAorCUlOIFVDSEFSCQlCdWxrT3V0UGlwZUlkKTsKKworCitWT0lEIFJUTVBXcml0ZVR4SW5mbygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVFhJTkZPX1NUUlVDIAlwVHhJbmZvLAorCUlOCSAgVVNIT1JUCQlVU0JETUFwa3RMZW4sCisJSU4JICBCT09MRUFOCQliV2l2LAorCUlOCSAgVUNIQVIJCQlRdWV1ZVNlbCwKKwlJTgkgIFVDSEFSCQkJTmV4dFZhbGlkLAorCUlOCSAgVUNIQVIJCQlUeEJ1cnN0KTsKKworLy8KKy8vIEZ1bmN0aW9uIFByb3RvdHlwZSBpbiBjbW1fZGF0YV8yODcwLmMKKy8vCitVU0hPUlQgUnRtcFVTQl9Xcml0ZVN1YlR4UmVzb3VyY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaywKKwlJTglCT09MRUFOCQkJYklzTGFzdCwKKwlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpOworCitVU0hPUlQgUnRtcFVTQl9Xcml0ZVNpbmdsZVR4UmVzb3VyY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaywKKwlJTglCT09MRUFOCQkJYklzTGFzdCwKKwlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpOworCitVU0hPUlQJUnRtcFVTQl9Xcml0ZUZyYWdUeFJlc291cmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGssCisJSU4JVUNIQVIJCQlmcmFnTnVtLAorCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcik7CisKK1VTSE9SVCBSdG1wVVNCX1dyaXRlTXVsdGlUeFJlc291cmNlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGssCisJSU4JVUNIQVIJCQlmcmFtZU51bSwKKwlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpOworCitWT0lEIFJ0bXBVU0JfRmluYWxXcml0ZVR4UmVzb3VyY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaywKKwlJTglVU0hPUlQJCQl0b3RhbE1QRFVTaXplLAorCUlOCVVTSE9SVAkJCVR4SWR4KTsKKworVk9JRCBSdG1wVVNCRGF0YUxhc3RUeElkeCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCVF1ZUlkeCwKKwlJTglVU0hPUlQJCQlUeElkeCk7CisKK1ZPSUQgUnRtcFVTQkRhdGFLaWNrT3V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGssCisJSU4JVUNIQVIJCQlRdWVJZHgpOworCisKK2ludCBSdG1wVVNCTWdtdEtpY2tPdXQoCisJSU4gUlRNUF9BREFQVEVSIAkqcEFkLAorCUlOIFVDSEFSIAkJCVF1ZUlkeCwKKwlJTiBQTkRJU19QQUNLRVQJCXBQYWNrZXQsCisJSU4gUFVDSEFSCQkJcFNyY0J1ZlZBLAorCUlOIFVJTlQgCQkJU3JjQnVmTGVuKTsKKworVk9JRCBSdG1wVVNCTnVsbEZyYW1lS2lja091dCgKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCwKKwlJTiBVQ0hBUgkJUXVlSWR4LAorCUlOIFVDSEFSCQkqcE51bGxGcmFtZSwKKwlJTiBVSU5UMzIJCWZyYW1lTGVuKTsKKworVk9JRCBSVDI4eHhVc2JTdGFBc2ljRm9yY2VXYWtldXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gQk9PTEVBTiAgICAgICBiRnJvbVR4KTsKKworVk9JRCBSVDI4eHhVc2JTdGFBc2ljU2xlZXBUaGVuQXV0b1dha2V1cCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQgVGJ0dE51bVRvTmV4dFdha2VVcCk7CisKK1ZPSUQgUlQyOHh4VXNiTWxtZVJhZGlvT24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpOworCitWT0lEIFJUMjh4eFVzYk1sbWVSYWRpb09GRigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworVk9JRCBRQlNTX0xvYWRJbml0KAorIAlJTgkJUlRNUF9BREFQVEVSCSpwQWQpOworCitVSU5UMzIgUUJTU19Mb2FkRWxlbWVudEFwcGVuZCgKKyAJSU4JCVJUTVBfQURBUFRFUgkqcEFkLAorCU9VVAkJVUlOVDgJCQkqYnVmX3ApOworCitWT0lEIFFCU1NfTG9hZFVwZGF0ZSgKKyAJSU4JCVJUTVBfQURBUFRFUgkqcEFkKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitJTlQgUlRNUFNob3dDZmdWYWx1ZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwTmFtZSwKKwlJTglQVUNIQVIJCQlwQnVmKTsKKworUENIQVIgICBSVE1QR2V0UmFsaW5rQXV0aE1vZGVTdHIoCisgICAgSU4gIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgYXV0aE1vZGUpOworCitQQ0hBUiAgIFJUTVBHZXRSYWxpbmtFbmNyeU1vZGVTdHIoCisgICAgSU4gIFVTSE9SVCBlbmNyeU1vZGUpOworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorVk9JRCBBc2ljU3RhQmJwVHVuaW5nKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworQk9PTEVBTiBTdGFBZGRNYWNUYWJsZUVudHJ5KAorCUlOICBQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4gIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5LAorCUlOICBVQ0hBUgkJCQlNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzLAorCUlOICBIVF9DQVBBQklMSVRZX0lFCSpwSHRDYXBhYmlsaXR5LAorCUlOICBVQ0hBUgkJCQlIdENhcGFiaWxpdHlMZW4sCisJSU4gIFVTSE9SVCAgICAgICAgCQlDYXBhYmlsaXR5SW5mbyk7CisjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCisKK3ZvaWQgUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQpOworCitWT0lEIFJlU3luY0JlYWNvblRpbWUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworCitWT0lEIFJUTVBTZXRBR0NJbml0VmFsdWUoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVUNIQVIJCQlCYW5kV2lkdGgpOworCitpbnQgcnQyOHh4X2Nsb3NlKElOIFBORVRfREVWIGRldik7CitpbnQgcnQyOHh4X29wZW4oSU4gUE5FVF9ERVYgZGV2KTsKKworX19pbmxpbmUgSU5UIFZJUlRVQUxfSUZfVVAoUFJUTVBfQURBUFRFUiBwQWQpCit7CitleHRlcm4gVk9JRCBNZXNoTWFrZUJlYWNvbihJTiBQUlRNUF9BREFQVEVSIHBBZCwgSU4gVUNIQVIgaWR4KTsKK2V4dGVybiBWT0lEIE1lc2hVcGRhdGVCZWFjb25GcmFtZShJTiBQUlRNUF9BREFQVEVSIHBBZCwgSU4gVUNIQVIgaWR4KTsKKworCWlmIChWSVJUVUFMX0lGX05VTShwQWQpID09IDApCisJeworCQlpZiAocnQyOHh4X29wZW4ocEFkLT5uZXRfZGV2KSAhPSAwKQorCQkJcmV0dXJuIC0xOworCX0KKwllbHNlCisJeworCX0KKwlWSVJUVUFMX0lGX0lOQyhwQWQpOworCXJldHVybiAwOworfQorCitfX2lubGluZSBWT0lEIFZJUlRVQUxfSUZfRE9XTihQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlWSVJUVUFMX0lGX0RFQyhwQWQpOworCWlmIChWSVJUVUFMX0lGX05VTShwQWQpID09IDApCisJCXJ0Mjh4eF9jbG9zZShwQWQtPm5ldF9kZXYpOworCXJldHVybjsKK30KKworCisjZW5kaWYgIC8vIF9fUlRNUF9IX18KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydG1wX2NraXBtaWMuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRtcF9ja2lwbWljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNkOTQ5YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRtcF9ja2lwbWljLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJcnRtcF9ja2lwbWljLmgKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlOYW1lCQlEYXRlCQkJTW9kaWZpY2F0aW9uIGxvZ3MKKyovCisjaWZuZGVmCV9fUlRNUF9DS0lQTUlDX0hfXworI2RlZmluZQlfX1JUTVBfQ0tJUE1JQ19IX18KKwordHlwZWRlZglzdHJ1Y3QJX01JQ19DT05URVhUCXsKKwkvKiAtLS0gTU1IIGNvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlVQ0hBUgkJQ0tbMTZdOwkJCQkvKiB0aGUga2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlVQ0hBUgkJY29lZmZpY2llbnRbMTZdOwkvKiBjdXJyZW50IGFlcyBjb3VudGVyIG1vZGUgY29lZmZpY2llbnRzICAgICAgKi8KKwlVTE9OR0xPTkcJYWNjdW07CQkJCS8qIGFjY3VtdWxhdGVkIG1pYywgcmVkdWNlZCB0byB1MzIgaW4gZmluYWwoKSAqLworCVVJTlQJCXBvc2l0aW9uOwkJCS8qIGN1cnJlbnQgcG9zaXRpb24gKGJ5dGUgb2Zmc2V0KSBpbiBtZXNzYWdlICAqLworCVVDSEFSCQlwYXJ0WzRdOwkJCS8qIGZvciBjb252ZXJzaW9uIG9mIG1lc3NhZ2UgdG8gdTMyIGZvciBtbWggICAqLworfQlNSUNfQ09OVEVYVCwgKlBNSUNfQ09OVEVYVDsKKworVk9JRAlDS0lQX2tleV9wZXJtdXRlKAorCU9VVAlVQ0hBUgkqUEssCQkJLyogb3V0cHV0IHBlcm11dGVkIGtleSAqLworCUlOCVVDSEFSCSpDSywJCQkvKiBpbnB1dCBDS0lQIGtleSAqLworCUlOCVVDSEFSCXRvRHNGcm9tRHMsCQkvKiBpbnB1dCB0b0RzL0Zyb21EcyBiaXRzICovCisJSU4JVUNIQVIJKnBpdik7CQkJLyogaW5wdXQgcG9pbnRlciB0byBJViAqLworCitWT0lECVJUTVBDa2lwTWljSW5pdCgKKwlJTglQTUlDX0NPTlRFWFQJCXBDb250ZXh0LAorCUlOCVBVQ0hBUgkJCQlDSyk7CisKK1ZPSUQgUlRNUE1pY1VwZGF0ZSgKKyAgICBJTiAgUE1JQ19DT05URVhUICAgICAgICBwQ29udGV4dCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBwT2N0ZXRzLAorICAgIElOICBJTlQgICAgICAgICAgICAgICAgIGxlbik7CisKK1VMT05HIFJUTVBNaWNHZXRDb2VmZmljaWVudCgKKyAgICBJTiAgUE1JQ19DT05URVhUICAgICAgICAgcENvbnRleHQpOworCitWT0lEIHhvcl8xMjgoCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgYSwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBiLAorICAgIE9VVCBQVUNIQVIgICAgICAgICAgICAgIG91dCk7CisKK1VDSEFSIFJUTVBDa2lwU2JveCgKKyAgICBJTiAgVUNIQVIgICAgICAgICAgICAgICBhKTsKKworVk9JRCB4b3JfMzIoCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgYSwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBiLAorICAgIE9VVCBQVUNIQVIgICAgICAgICAgICAgIG91dCk7CisKK1ZPSUQgbmV4dF9rZXkoCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAga2V5LAorICAgIElOICBJTlQgICAgICAgICAgICAgICAgIHJvdW5kKTsKKworVk9JRCBieXRlX3N1YigKKyAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBpbiwKKyAgICBPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOworCitWT0lEIHNoaWZ0X3JvdygKKyAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBpbiwKKyAgICBPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOworCitWT0lEIG1peF9jb2x1bW4oCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgaW4sCisgICAgT1VUIFBVQ0hBUiAgICAgICAgICAgICAgb3V0KTsKKworVk9JRCBSVE1QQWVzRW5jcnlwdCgKKyAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBrZXksCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgZGF0YSwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBjaXBoZXJ0ZXh0KTsKKworVk9JRCBSVE1QTWljRmluYWwoCisgICAgSU4gIFBNSUNfQ09OVEVYVCAgICAgICAgcENvbnRleHQsCisgICAgT1VUIFVDSEFSICAgICAgICAgICAgICAgZGlnZXN0WzRdKTsKKworVk9JRCBSVE1QQ2tpcEluc2VydENNSUMoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgT1VUIFBVQ0hBUiAgICAgICAgICBwTUlDLAorICAgIElOICBQVUNIQVIgICAgICAgICAgcDgwMjExaGRyLAorICAgIElOICBQTkRJU19QQUNLRVQgICAgcFBhY2tldCwKKyAgICBJTiAgUENJUEhFUl9LRVkgICAgIHBLZXksCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBtaWNfc25hcCk7CisKKyNlbmRpZiAvL19fUlRNUF9DS0lQTUlDX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydG1wX2RlZi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydG1wX2RlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZjc1NjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0bXBfZGVmLmgKQEAgLTAsMCArMSwxNjIyIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorICAgIHJ0bXBfZGVmLmgKKworICAgIEFic3RyYWN0OgorICAgIE1pbmlwb3J0IHJlbGF0ZWQgZGVmaW5pdGlvbiBoZWFkZXIKKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgUGF1bCBMaW4gICAgMDgtMDEtMjAwMiAgICBjcmVhdGVkCisgICAgSm9obiBDaGFuZyAgMDgtMDUtMjAwMyAgICBhZGQgZGVmaW5pdGlvbiBmb3IgMTFnICYgb3RoZXIgZHJhZnRzCisqLworI2lmbmRlZiBfX1JUTVBfREVGX0hfXworI2RlZmluZSBfX1JUTVBfREVGX0hfXworCisjaW5jbHVkZSAib2lkLmgiCisKKy8vCisvLyAgRGVidWcgaW5mb3JtYXRpb24gdmVyYm9zaXR5OiBsb3dlciB2YWx1ZXMgaW5kaWNhdGUgaGlnaGVyIHVyZ2VuY3kKKy8vCisjZGVmaW5lIFJUX0RFQlVHX09GRiAgICAgICAgMAorI2RlZmluZSBSVF9ERUJVR19FUlJPUiAgICAgIDEKKyNkZWZpbmUgUlRfREVCVUdfV0FSTiAgICAgICAyCisjZGVmaW5lIFJUX0RFQlVHX1RSQUNFICAgICAgMworI2RlZmluZSBSVF9ERUJVR19JTkZPICAgICAgIDQKKyNkZWZpbmUgUlRfREVCVUdfTE9VRCAgICAgICA1CisKKyNkZWZpbmUgTklDX1RBRyAgICAgICAgICAgICAoKFVMT05HKScwNjgyJykKKyNkZWZpbmUgTklDX0RCR19TVFJJTkcgICAgICAoIioqUlQyOHh4KioiKQorCisjaWZkZWYgU05NUF9TVVBQT1JUCisvLyBmb3Igc25tcAorLy8gdG8gZ2V0IG1hbnVmYWN0dXJlciBPVUksIGthdGh5LCAyMDA4XzAyMjAKKyNkZWZpbmUgTWFudWZhY3R1cmVyT1VJX0xFTgkJCTMKKyNkZWZpbmUgTWFudWZhY3R1cmVyTkFNRQkJCSgiUmFsaW5rIFRlY2hub2xvZ3kgQ29tcGFueS4iKQorI2RlZmluZQlSZXNvdXJjZVR5cGVJZE5hbWUJCQkoIlJhbGlua19JRCIpCisjZW5kaWYKKworCisvLyNkZWZpbmUgUEFDS0VECisKKyNkZWZpbmUgUkFMSU5LXzI4ODNfVkVSU0lPTgkJKChVSU5UMzIpMHgyODgzMDMwMCkKKyNkZWZpbmUgUkFMSU5LXzI4ODBFX1ZFUlNJT04JKChVSU5UMzIpMHgyODcyMDIwMCkKKyNkZWZpbmUgUkFMSU5LXzMwNzBfVkVSU0lPTgkJKChVSU5UMzIpMHgzMDcwMDIwMCkKKworLy8KKy8vIE5ESVMgdmVyc2lvbiBpbiB1c2UgYnkgdGhlIE5JQyBkcml2ZXIuCisvLyBUaGUgaGlnaCBieXRlIGlzIHRoZSBtYWpvciB2ZXJzaW9uLiBUaGUgbG93IGJ5dGUgaXMgdGhlIG1pbm9yIHZlcnNpb24uCisvLworI2lmZGVmICBORElTNTFfTUlOSVBPUlQKKyNkZWZpbmUgTklDX0RSSVZFUl9WRVJTSU9OICAgICAgMHgwNTAxCisjZWxzZQorI2RlZmluZSBOSUNfRFJJVkVSX1ZFUlNJT04gICAgICAweDA1MDAKKyNlbmRpZgorCisvLworLy8gTkRJUyBtZWRpYSB0eXBlLCBjdXJyZW50IGlzIGV0aGVybmV0LCBjaGFuZ2UgaWYgbmF0aXZlIHdpcmVsZXNzIHN1cHBvcnRlZAorLy8KKyNkZWZpbmUgTklDX01FRElBX1RZUEUgICAgICAgICAgTmRpc01lZGl1bTgwMl8zCisjZGVmaW5lIE5JQ19QQ0lfSERSX0xFTkdUSCAgICAgIDB4ZTIKKyNkZWZpbmUgTklDX01BWF9QQUNLRVRfU0laRSAgICAgMjMwNAorI2RlZmluZSBOSUNfSEVBREVSX1NJWkUgICAgICAgICAxNAorI2RlZmluZSBNQVhfTUFQX1JFR0lTVEVSU19ORUVERUQgMzIKKyNkZWZpbmUgTUlOX01BUF9SRUdJU1RFUlNfTkVFREVEIDIgICAvL1RvZG86IHNob3VsZCBjb25zaWRlciBmcmFnbWVudCBpc3N1ZS4KKworLy8KKy8vIGludGVyZmFjZSB0eXBlLCB3ZSB1c2UgUENJCisvLworI2RlZmluZSBOSUNfSU5URVJGQUNFX1RZUEUgICAgICBOZGlzSW50ZXJmYWNlUGNpCisjZGVmaW5lIE5JQ19JTlRFUlJVUFRfTU9ERSAgICAgIE5kaXNJbnRlcnJ1cHRMZXZlbFNlbnNpdGl2ZQorCisvLworLy8gYnVmZmVyIHNpemUgcGFzc2VkIGluIE5kaXNNUXVlcnlBZGFwdGVyUmVzb3VyY2VzCisvLyBXZSBzaG91bGQgb25seSBuZWVkIHRocmVlIGFkYXB0ZXIgcmVzb3VyY2VzIChJTywgaW50ZXJydXB0IGFuZCBtZW1vcnkpLAorLy8gU29tZSBkZXZpY2VzIGdldCBleHRyYSByZXNvdXJjZXMsIHNvIGhhdmUgcm9vbSBmb3IgMTAgcmVzb3VyY2VzCisvLyAgICAgICAgICAgICAgICAgICAgVUZfU0laRSAgIChzaXplb2YoTkRJU19SRVNPVVJDRV9MSVNUKSArICgxMCpzaXplb2YoQ01fUEFSVElBTF9SRVNPVVJDRV9ERVNDUklQVE9SKSkpCisKKworI2RlZmluZSBOSUNfUkVTT1VSQ0VfQi8vCisvLyBJTyBzcGFjZSBsZW5ndGgKKy8vCisjZGVmaW5lIE5JQ19NQVBfSU9TUEFDRV9MRU5HVEggIHNpemVvZihDU1JfU1RSVUMpCisKKyNkZWZpbmUgTUFYX1JYX1BLVF9MRU4JMTUyMAorCisvLworLy8gRW50cnkgbnVtYmVyIGZvciBlYWNoIERNQSBkZXNjcmlwdG9yIHJpbmcKKy8vCisKKworI2lmZGVmIFJUMjg3MAorI2RlZmluZSBUWF9SSU5HX1NJWkUgICAgICAgICAgICA4IC8vIDEKKyNkZWZpbmUgUFJJT19SSU5HX1NJWkUgICAgICAgICAgOAorI2RlZmluZSBNR01UX1JJTkdfU0laRSAgICAgICAzMiAvLyBQUklPX1JJTkdfU0laRQorI2RlZmluZSBSWF9SSU5HX1NJWkUgICAgICAgICAgICA4CisjZGVmaW5lIE1BWF9UWF9QUk9DRVNTICAgICAgICAgIDQKKyNkZWZpbmUgTE9DQUxfVFhCVUZfU0laRSAgICAgICAgMjA0OAorI2VuZGlmIC8vIFJUMjg3MCAvLworCisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisvLyBNQzogTXVsdHBsZSBDYXJkcworI2RlZmluZSBNQVhfTlVNX09GX01VTFRJUExFX0NBUkQJCTMyCisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisKKyNkZWZpbmUgTUFYX1JYX1BST0NFU1MgICAgICAgICAgMTI4IC8vNjQgLy8zMgorI2RlZmluZSBOVU1fT0ZfTE9DQUxfVFhCVUYgICAgICAyCisjZGVmaW5lIFRYRF9TSVpFICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFRYV0lfU0laRSAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFJYRF9TSVpFICAgICAgICAgICAgICAgCTE2CisjZGVmaW5lIFJYV0lfU0laRSAgICAgICAgICAgICAJMTYKKy8vIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgODAyLjExIEhlYWRlciBTaXplICsgQU1TRFUgc3ViIGZyYW1lIGhlYWRlcgorI2RlZmluZSBUWF9ETUFfMVNUX0JVRkZFUl9TSVpFICA5NiAgICAvLyBvbmx5IHRoZSAxc3QgcGh5c2ljYWwgYnVmZmVyIGlzIHByZS1hbGxvY2F0ZWQKKyNkZWZpbmUgTUdNVF9ETUFfQlVGRkVSX1NJWkUgICAgMTUzNiAvLzIwNDgKKyNkZWZpbmUgUlhfQlVGRkVSX0FHR1JFU0laRSAgICAgMzg0MCAvLzM5MDQgLy8zOTY4IC8vNDA5NiAvLzIwNDggLy80MDk2CisjZGVmaW5lIFJYX0JVRkZFUl9OT1JNU0laRSAgICAgIDM4NDAgLy8zOTA0IC8vMzk2OCAvLzQwOTYgLy8yMDQ4IC8vNDA5NgorI2RlZmluZSBUWF9CVUZGRVJfTk9STVNJWkUJCVJYX0JVRkZFUl9OT1JNU0laRQorI2RlZmluZSBNQVhfRlJBTUVfU0laRSAgICAgICAgICAyMzQ2ICAgICAgICAgICAgICAgICAgICAvLyBNYXhpbXVtIDgwMi4xMSBmcmFtZSBzaXplCisjZGVmaW5lIE1BWF9BR0dSRUdBVElPTl9TSVpFICAgIDM4NDAgLy8zOTA0IC8vMzk2OCAvLzQwOTYKKyNkZWZpbmUgTUFYX05VTV9PRl9UVVBMRV9DQUNIRSAgMgorI2RlZmluZSBNQVhfTUNBU1RfTElTVF9TSVpFICAgICAzMgorI2RlZmluZSBNQVhfTEVOX09GX1ZFTkRPUl9ERVNDICA2NAorLy8jZGVmaW5lIE1BWF9TSVpFX09GX01DQVNUX1BTUSAgIChOVU1fT0ZfTE9DQUxfVFhCVUYgPj4gMikgLy8gQVAgd29uJ3Qgc3BlbmQgbW9yZSB0aGFuIDEvNCBvZiB0b3RhbCBidWZmZXJzIG9uIE0vQkNBU1QgUFNRCisjZGVmaW5lIE1BWF9TSVpFX09GX01DQVNUX1BTUSAgICAgICAgICAgICAgIDMyCisKKyNkZWZpbmUgTUFYX1JYX1BST0NFU1NfQ05UCShSWF9SSU5HX1NJWkUpCisKKworI2RlZmluZSBNQVhfUEFDS0VUU19JTl9RVUVVRQkJCQkoNTEyKSAvLyg1MTIpICAgIC8vIHRvIHBhc3MgV01NIEE1LVdQQVBTSworI2RlZmluZSBNQVhfUEFDS0VUU19JTl9NQ0FTVF9QU19RVUVVRQkJMzIKKyNkZWZpbmUgTUFYX1BBQ0tFVFNfSU5fUFNfUVVFVUUJCQkJMTI4CS8vMzIKKyNkZWZpbmUgV01NX05VTV9PRl9BQyAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogQUMwLCBBQzEsIEFDMiwgYW5kIEFDMyAqLworCisKKworLy8gUnhGaWx0ZXIKKyNkZWZpbmUgU1RBTk9STUFMCSAweDE3Zjk3CisjZGVmaW5lIEFQTk9STUFMCSAweDE1Zjk3CisvLworLy8gIFJUTVBfQURBUFRFUiBmbGFncworLy8KKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9NQVBfUkVHSVNURVIgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfSEFSRFdBUkVfRVJST1IgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9TQ0FUVEVSX0dBVEhFUiAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBmUlRNUF9BREFQVEVSX1NFTkRfUEFDS0VUX0VSUk9SICAgICAweDAwMDAwMDEwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfTUxNRV9SRVNFVF9JTl9QUk9HUkVTUyAweDAwMDAwMDIwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfVFhfUklOR19BTExPQ0FURUQgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9SRU1PVkVfSU5fUFJPR1JFU1MgICAgMHgwMDAwMDQwMAorI2RlZmluZSBmUlRNUF9BREFQVEVSX01JTU9SQVRFX0lOVVNFRCAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfUlhfUklOR19BTExPQ0FURUQgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfQUNUSVZFICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTICAweDAwMDA0MDAwCisjZGVmaW5lCWZSVE1QX0FEQVBURVJfUkVBU1NPQ19JTl9QUk9HUkVTUwkweDAwMDA4MDAwCisjZGVmaW5lCWZSVE1QX0FEQVBURVJfTUVESUFfU1RBVEVfUEVORElORwkweDAwMDEwMDAwCisjZGVmaW5lCWZSVE1QX0FEQVBURVJfUkFESU9fT0ZGCQkJCTB4MDAwMjAwMDAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUCQkJMHgwMDA0MDAwMAorI2RlZmluZQlmUlRNUF9BREFQVEVSX0JVTEtJTl9SRVNFVAkJCTB4MDAwODAwMDAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9SREdfQUNUSVZFCQkJMHgwMDEwMDAwMAorI2RlZmluZSBmUlRNUF9BREFQVEVSX0RZTkFNSUNfQkVfVFhPUF9BQ1RJVkUgMHgwMDIwMDAwMAorI2RlZmluZSBmUlRNUF9BREFQVEVSX1NDQU5fMjA0MCAJCQkweDA0MDAwMDAwCisjZGVmaW5lCWZSVE1QX0FEQVBURVJfUkFESU9fTUVBU1VSRU1FTlQJCTB4MDgwMDAwMDAKKworI2RlZmluZSBmUlRNUF9BREFQVEVSX1NUQVJUX1VQICAgICAgICAgCQkweDEwMDAwMDAwCS8vRGV2aXZlIGFscmVhZHkgaW5pdGlhbGl6ZWQgYW5kIGVuYWJsZWQgVHgvUnguCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfTUVESUFfU1RBVEVfQ0hBTkdFICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRiAgICAgICAgMHg0MDAwMDAwMAorCisvLyBMb2NrIGJpdCBmb3IgYWNjZXNzaW5nIGRpZmZlcmVudCByaW5nIGJ1ZmZlcnMKKy8vI2RlZmluZSBmUlRNUF9BREFQVEVSX1RYX1JJTkdfQlVTWSAgICAgICAgMHg4MDAwMDAwMAorLy8jZGVmaW5lIGZSVE1QX0FEQVBURVJfTUdNVF9SSU5HX0JVU1kgICAgICAweDQwMDAwMDAwCisvLyNkZWZpbmUgZlJUTVBfQURBUFRFUl9BVElNX1JJTkdfQlVTWSAgICAgIDB4MjAwMDAwMDAKKy8vI2RlZmluZSBmUlRNUF9BREFQVEVSX1JYX1JJTkdfQlVTWSAgICAgICAgMHgxMDAwMDAwMAorCisvLyBMb2NrIGJpdCBmb3IgYWNjZXNzaW5nIGRpZmZlcmVudCBxdWV1ZQorLy8jZGVmaW5lICAgZlJUTVBfQURBUFRFUl9UWF9RVUVVRV9CVVNZICAgICAweDA4MDAwMDAwCisvLyNkZWZpbmUgICBmUlRNUF9BREFQVEVSX01HTVRfUVVFVUVfQlVTWSAgIDB4MDQwMDAwMDAKKworLy8KKy8vICBTVEEgb3BlcmF0aW9uIHN0YXR1cyBmbGFncworLy8KKyNkZWZpbmUgZk9QX1NUQVRVU19JTkZSQV9PTiAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBmT1BfU1RBVFVTX0FESE9DX09OICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgZk9QX1NUQVRVU19TSE9SVF9TTE9UX0lOVVNFRCAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCAgICAweDAwMDAwMDEwCisjZGVmaW5lIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNICAgICAgICAgICAgIDB4MDAwMDAwMjAKKy8vI2RlZmluZSBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQgICAweDAwMDAwMDQwCisjZGVmaW5lIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgZk9QX1NUQVRVU19XTU1fSU5VU0VEICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIGZPUF9TVEFUVVNfRE9aRSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAgIC8vIGRlYnVnIHB1cnBvc2UKKyNkZWZpbmUgZk9QX1NUQVRVU19QSUdHWUJBQ0tfSU5VU0VEICAgICAgICAgMHgwMDAwMDgwMCAgLy8gcGlnZ3ktYmFjaywgYW5kIGFnZ3JlZ2F0aW9uCisjZGVmaW5lIGZPUF9TVEFUVVNfQVBTRF9JTlVTRUQJCQkJMHgwMDAwMTAwMAorI2RlZmluZSBmT1BfU1RBVFVTX1RYX0FNU0RVX0lOVVNFRAkJCTB4MDAwMDIwMDAKKyNkZWZpbmUgZk9QX1NUQVRVU19NQVhfUkVUUllfRU5BQkxFRAkJMHgwMDAwNDAwMAorI2RlZmluZSBmT1BfU1RBVFVTX1dBS0VVUF9OT1cgICAgICAgICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFICAgICAgIDB4MDAwMjAwMDAKKworI2lmZGVmIERPVDExTl9EUkFGVDMKKyNkZWZpbmUgZk9QX1NUQVRVU19TQ0FOXzIwNDAgICAgICAgICAgICAgICAJICAgIDB4MDAwNDAwMDAKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisKKyNkZWZpbmUgQ0NLU0VUUFJPVEVDVAkJMHgxCisjZGVmaW5lIE9GRE1TRVRQUk9URUNUCQkweDIKKyNkZWZpbmUgTU0yMFNFVFBST1RFQ1QJCTB4NAorI2RlZmluZSBNTTQwU0VUUFJPVEVDVAkJMHg4CisjZGVmaW5lIEdGMjBTRVRQUk9URUNUCQkweDEwCisjZGVmaW5lIEdSNDBTRVRQUk9URUNUCQkweDIwCisjZGVmaW5lIEFMTE5fU0VUUFJPVEVDVAkJKEdSNDBTRVRQUk9URUNUIHwgR0YyMFNFVFBST1RFQ1QgfCBNTTQwU0VUUFJPVEVDVCB8IE1NMjBTRVRQUk9URUNUKQorCisvLworLy8gIEFQJ3MgY2xpZW50IHRhYmxlIG9wZXJhdGlvbiBzdGF0dXMgZmxhZ3MKKy8vCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFICAgICAgICAgIDB4MDAwMDAwMDEgIC8vIENMSUVOVCBjYW4gcGFyc2UgUU9TIERBVEEgZnJhbWUKKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfQUdHUkVHQVRJT05fQ0FQQUJMRSAgMHgwMDAwMDAwMiAgLy8gQ0xJRU5UIGNhbiByZWNlaXZlIFJhbGluaydzIHByb3ByaWV0YXJ5IFRYIGFnZ3JlZ2F0aW9uIGZyYW1lCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX1BJR0dZQkFDS19DQVBBQkxFICAgIDB4MDAwMDAwMDQgIC8vIENMSUVOVCBzdXBwb3J0IHBpZ2d5LWJhY2sKKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfQU1TRFVfSU5VU0VECQkJMHgwMDAwMDAwOAorI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19TR0kyMF9DQVBBQkxFCQkweDAwMDAwMDEwCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX1NHSTQwX0NBUEFCTEUJCTB4MDAwMDAwMjAKKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfVHhTVEJDX0NBUEFCTEUJCTB4MDAwMDAwNDAKKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfUnhTVEJDX0NBUEFCTEUJCTB4MDAwMDAwODAKKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfSFRDX0NBUEFCTEUJCQkweDAwMDAwMTAwCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFCQkJMHgwMDAwMDIwMAorI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19NQ1NGRUVEQkFDS19DQVBBQkxFICAweDAwMDAwNDAwCisjZGVmaW5lIGZDTElFTlRfU1RBVFVTX0FQU0RfQ0FQQUJMRSAgICAgICAgIDB4MDAwMDA4MDAgIC8qIFVBUFNEIFNUQVRJT04gKi8KKworI2lmZGVmIERPVDExTl9EUkFGVDMKKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfQlNTQ09FWElTVF9DQVBBQkxFCTB4MDAwMDEwMDAKKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisKKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfUkFMSU5LX0NISVBTRVQJCTB4MDAxMDAwMDAKKy8vCisvLyAgU1RBIGNvbmZpZ3VyYXRpb24gZmxhZ3MKKy8vCisvLyNkZWZpbmUgZlNUQV9DRkdfRU5BQkxFX1RYX0JVUlNUICAgICAgICAgIDB4MDAwMDAwMDEKKworLy8gODAyLjExbiBPcGVyYXRpbmcgTW9kZSBEZWZpbml0aW9uLiAwLTMgYWxzbyB1c2VkIGluIEFTSUNVUGRhdGVQcm90ZWN0IHN3aXRjaCBjYXNlCisjZGVmaW5lIEhUX05PX1BST1RFQ1QJMAorI2RlZmluZSBIVF9MRUdBQ1lfUFJPVEVDVAkxCisjZGVmaW5lIEhUXzQwX1BST1RFQ1QJMgorI2RlZmluZSBIVF8yMDQwX1BST1RFQ1QJMworI2RlZmluZSBIVF9SVFNDVFNfNk0JNworLy9mb2xsb3dpbmcgaXMgb3VyIG93biBkZWZpbml0aW9uIGluIG9yZGVyIHRvIHR1cm4gb24gb3VyIEFTSUMgcHJvdGVjdGlvbiByZWdpc3RlciBpbiBJTkZSQVNUUlVDVFVSRS4KKyNkZWZpbmUgSFRfQVRIRVJPUwk4CS8vIHJ0Mjg2MGMgaGFzIHByb2JsZW0gd2l0aCBhdGhlcm9zIGNoaXAuIHdlIG5lZWQgdG8gdHVybiBvbiBSVFMvQ1RTIC4KKyNkZWZpbmUgSFRfRk9SQ0VSVFNDVFMJOQkvLyBGb3JjZSB0dXJuIG9uIFJUUy9DVFMgZmlyc3QuIHRoZW4gZ28gdG8gZXZhbHVhdGUgaWYgdGhpcyBmb3JjZSBSVFMgaXMgbmVjZXNzYXJ5LgorCisvLworLy8gUlggUGFja2V0IEZpbHRlciBjb250cm9sIGZsYWdzLiBBcHBseSBvbiBwQWQtPlBhY2tldEZpbHRlcgorLy8KKyNkZWZpbmUgZlJYX0ZJTFRFUl9BQ0NFUFRfRElSRUNUICAgICAgICAgICAgTkRJU19QQUNLRVRfVFlQRV9ESVJFQ1RFRAorI2RlZmluZSBmUlhfRklMVEVSX0FDQ0VQVF9NVUxUSUNBU1QgICAgICAgICBORElTX1BBQ0tFVF9UWVBFX01VTFRJQ0FTVAorI2RlZmluZSBmUlhfRklMVEVSX0FDQ0VQVF9CUk9BRENBU1QgICAgICAgICBORElTX1BBQ0tFVF9UWVBFX0JST0FEQ0FTVAorI2RlZmluZSBmUlhfRklMVEVSX0FDQ0VQVF9BTExfTVVMVElDQVNUICAgICBORElTX1BBQ0tFVF9UWVBFX0FMTF9NVUxUSUNBU1QKKworLy8KKy8vIEVycm9yIGNvZGUgc2VjdGlvbgorLy8KKy8vIE5ESVNfRVJST1JfQ09ERV9BREFQVEVSX05PVF9GT1VORAorI2RlZmluZSBFUlJMT0dfUkVBRF9QQ0lfU0xPVF9GQUlMRUQgICAgIDB4MDAwMDAxMDFMCisjZGVmaW5lIEVSUkxPR19XUklURV9QQ0lfU0xPVF9GQUlMRUQgICAgMHgwMDAwMDEwMkwKKyNkZWZpbmUgRVJSTE9HX1ZFTkRPUl9ERVZJQ0VfTk9NQVRDSCAgICAweDAwMDAwMTAzTAorCisvLyBORElTX0VSUk9SX0NPREVfQURBUFRFUl9ESVNBQkxFRAorI2RlZmluZSBFUlJMT0dfQlVTX01BU1RFUl9ESVNBQkxFRCAgICAgIDB4MDAwMDAyMDFMCisKKy8vIE5ESVNfRVJST1JfQ09ERV9VTlNVUFBPUlRFRF9DT05GSUdVUkFUSU9OCisjZGVmaW5lIEVSUkxPR19JTlZBTElEX1NQRUVEX0RVUExFWCAgICAgMHgwMDAwMDMwMUwKKyNkZWZpbmUgRVJSTE9HX1NFVF9TRUNPTkRBUllfRkFJTEVEICAgICAweDAwMDAwMzAyTAorCisvLyBORElTX0VSUk9SX0NPREVfT1VUX09GX1JFU09VUkNFUworI2RlZmluZSBFUlJMT0dfT1VUX09GX01FTU9SWSAgICAgICAgICAgIDB4MDAwMDA0MDFMCisjZGVmaW5lIEVSUkxPR19PVVRfT0ZfU0hBUkVEX01FTU9SWSAgICAgMHgwMDAwMDQwMkwKKyNkZWZpbmUgRVJSTE9HX09VVF9PRl9NQVBfUkVHSVNURVJTICAgICAweDAwMDAwNDAzTAorI2RlZmluZSBFUlJMT0dfT1VUX09GX0JVRkZFUl9QT09MICAgICAgIDB4MDAwMDA0MDRMCisjZGVmaW5lIEVSUkxPR19PVVRfT0ZfTkRJU19CVUZGRVIgICAgICAgMHgwMDAwMDQwNUwKKyNkZWZpbmUgRVJSTE9HX09VVF9PRl9QQUNLRVRfUE9PTCAgICAgICAweDAwMDAwNDA2TAorI2RlZmluZSBFUlJMT0dfT1VUX09GX05ESVNfUEFDS0VUICAgICAgIDB4MDAwMDA0MDdMCisjZGVmaW5lIEVSUkxPR19PVVRfT0ZfTE9PS0FTSURFX01FTU9SWSAgMHgwMDAwMDQwOEwKKworLy8gTkRJU19FUlJPUl9DT0RFX0hBUkRXQVJFX0ZBSUxVUkUKKyNkZWZpbmUgRVJSTE9HX1NFTEZURVNUX0ZBSUxFRCAgICAgICAgICAweDAwMDAwNTAxTAorI2RlZmluZSBFUlJMT0dfSU5JVElBTElaRV9BREFQVEVSICAgICAgIDB4MDAwMDA1MDJMCisjZGVmaW5lIEVSUkxPR19SRU1PVkVfTUlOSVBPUlQgICAgICAgICAgMHgwMDAwMDUwM0wKKworLy8gTkRJU19FUlJPUl9DT0RFX1JFU09VUkNFX0NPTkZMSUNUCisjZGVmaW5lIEVSUkxPR19NQVBfSU9fU1BBQ0UgICAgICAgICAgICAgMHgwMDAwMDYwMUwKKyNkZWZpbmUgRVJSTE9HX1FVRVJZX0FEQVBURVJfUkVTT1VSQ0VTICAweDAwMDAwNjAyTAorI2RlZmluZSBFUlJMT0dfTk9fSU9fUkVTT1VSQ0UgICAgICAgICAgIDB4MDAwMDA2MDNMCisjZGVmaW5lIEVSUkxPR19OT19JTlRFUlJVUFRfUkVTT1VSQ0UgICAgMHgwMDAwMDYwNEwKKyNkZWZpbmUgRVJSTE9HX05PX01FTU9SWV9SRVNPVVJDRSAgICAgICAweDAwMDAwNjA1TAorCisKKy8vIFdEUyBkZWZpbml0aW9uCisjZGVmaW5lCU1BWF9XRFNfRU5UUlkgICAgICAgICAgICAgICA0CisjZGVmaW5lIFdEU19QQUlSV0lTRV9LRVlfT0ZGU0VUICAgICA2MCAgICAvLyBXRFMgbGlua3MgdXNlcyBwYWlyd2lzZSBrZXkjNjAgfiA2MyBpbiBBU0lDIHBhaXJ3aXNlIGtleSB0YWJsZQorCisjZGVmaW5lCVdEU19ESVNBQkxFX01PREUgICAgICAgICAgICAwCisjZGVmaW5lCVdEU19SRVNUUklDVF9NT0RFICAgICAgICAgICAxCisjZGVmaW5lCVdEU19CUklER0VfTU9ERSAgICAgICAgICAgICAyCisjZGVmaW5lCVdEU19SRVBFQVRFUl9NT0RFICAgICAgICAgICAzCisjZGVmaW5lCVdEU19MQVpZX01PREUgICAgICAgICAgICAgICA0CisKKworI2RlZmluZSBNQVhfTUVTSF9OVU0JCQkJMAorCisjZGVmaW5lIE1BWF9BUENMSV9OVU0JCQkJMAorI2lmZGVmIEFQQ0xJX1NVUFBPUlQKKyN1bmRlZglNQVhfQVBDTElfTlVNCisjZGVmaW5lIE1BWF9BUENMSV9OVU0JCQkJMQorI2VuZGlmIC8vIEFQQ0xJX1NVUFBPUlQgLy8KKworI2RlZmluZSBNQVhfTUJTU0lEX05VTQkJCQkxCisKKy8qIHNhbml0eSBjaGVjayBmb3IgYXBpZHggKi8KKyNkZWZpbmUgTUJTU19NUl9BUElEWF9TQU5JVFlfQ0hFQ0soYXBpZHgpIFwKKyAgICB7IGlmIChhcGlkeCA+IE1BWF9NQlNTSURfTlVNKSB7IFwKKyAgICAgICAgICBwcmludGsoIiVzPiBFcnJvciEgYXBpZHggPSAlZCA+IE1BWF9NQlNTSURfTlVNIVxuIiwgX19mdW5jX18sIGFwaWR4KTsgXAorCSAgYXBpZHggPSBNQUlOX01CU1NJRDsgfSB9CisKKyNkZWZpbmUgVkFMSURfV0NJRChfd2NpZCkJKChfd2NpZCkgPiAwICYmIChfd2NpZCkgPCBNQVhfTEVOX09GX01BQ19UQUJMRSApCisKKyNkZWZpbmUgTUFJTl9NQlNTSUQgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgRklSU1RfTUJTU0lEICAgICAgICAgICAgICAgIDEKKworCisjZGVmaW5lIE1BWF9CRUFDT05fU0laRQkJCQk1MTIKKy8vIElmIHRoZSBNQVhfTUJTU0lEX05VTSBpcyBsYXJnZXIgdGhhbiA2LAorLy8gaXQgc2hhbGwgcmVzZXJ2ZSBzb21lIFdDSUQgc3BhY2Uod2NpZCAyMjJ+MjUzKSBmb3IgYmVhY29uIGZyYW1lcy4KKy8vIC0JdGhlc2Ugd2NpZCAyMzh+MjUzIGFyZSByZXNlcnZlZCBmb3IgYmVhY29uIzYocmE2KS4KKy8vIC0JdGhlc2Ugd2NpZCAyMjJ+MjM3IGFyZSByZXNlcnZlZCBmb3IgYmVhY29uIzcocmE3KS4KKyNpZiBkZWZpbmVkKE1BWF9NQlNTSURfTlVNKSAmJiAoTUFYX01CU1NJRF9OVU0gPT0gOCkKKyNkZWZpbmUgSFdfUkVTRVJWRURfV0NJRAkyMjIKKyNlbGlmIGRlZmluZWQoTUFYX01CU1NJRF9OVU0pICYmIChNQVhfTUJTU0lEX05VTSA9PSA3KQorI2RlZmluZSBIV19SRVNFUlZFRF9XQ0lECTIzOAorI2Vsc2UKKyNkZWZpbmUgSFdfUkVTRVJWRURfV0NJRAkyNTUKKyNlbmRpZgorCisvLyBUaGVuIGRlZGljYXRlIHdjaWQgb2YgREZTIGFuZCBDYXJyaWVyLVNlbnNlLgorI2RlZmluZSBERlNfQ1RTX1dDSUQgCQkoSFdfUkVTRVJWRURfV0NJRCAtIDEpCisjZGVmaW5lIENTX0NUU19XQ0lEIAkJKEhXX1JFU0VSVkVEX1dDSUQgLSAyKQorI2RlZmluZSBMQVNUX1NQRUNJRklDX1dDSUQJKEhXX1JFU0VSVkVEX1dDSUQgLSAyKQorCisvLyBJZiBNQVhfTUJTU0lEX05VTSBpcyA4LCB0aGUgbWF4aW11bSBhdmFpbGFibGUgd2NpZCBmb3IgdGhlIGFzc29jaWF0ZWQgU1RBIGlzIDIxMS4KKy8vIElmIE1BWF9NQlNTSURfTlVNIGlzIDcsIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSB3Y2lkIGZvciB0aGUgYXNzb2NpYXRlZCBTVEEgaXMgMjI4LgorI2RlZmluZSBNQVhfQVZBSUxBQkxFX0NMSUVOVF9XQ0lECShMQVNUX1NQRUNJRklDX1dDSUQgLSBNQVhfTUJTU0lEX05VTSAtIDEpCisKKy8vIFRYIG5lZWQgV0NJRCB0byBmaW5kIENpcGhlciBLZXkKKy8vIHRoZXNlIHdjaWQgMjEyIH4gMjE5IGFyZSByZXNlcnZlZCBmb3IgYmMvbWMgcGFja2V0cyBpZiBNQVhfTUJTU0lEX05VTSBpcyA4LgorI2RlZmluZSBHRVRfR3JvdXBLZXlfV0NJRChfX3djaWQsIF9fYnNzaWR4KSBcCisJewkJCQkJCQkJCQlcCisJCV9fd2NpZCA9IExBU1RfU1BFQ0lGSUNfV0NJRCAtIChNQVhfTUJTU0lEX05VTSkgKyBfX2Jzc2lkeDsJXAorCX0KKworI2RlZmluZSBJc0dyb3VwS2V5V0NJRChfX3djaWQpICgoKF9fd2NpZCkgPCBMQVNUX1NQRUNJRklDX1dDSUQpICYmICgoX193Y2lkKSA+PSAoTEFTVF9TUEVDSUZJQ19XQ0lEIC0gKE1BWF9NQlNTSURfTlVNKSkpKQorCisKKy8vIGRlZmluaXRpb24gdG8gc3VwcG9ydCBtdWx0aXBsZSBCU1NJRAorI2RlZmluZSBCU1MwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQlNTMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEJTUzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBCU1MzICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQlNTNCAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIEJTUzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBCU1M2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgQlNTNyAgICAgICAgICAgICAgICAgICAgICAgICAgICA3CisKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIExlbmd0aCBkZWZpbml0aW9ucworI2RlZmluZSBQRUVSX0tFWV9OTyAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTUFDX0FERFJfTEVOICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFRJTUVTVEFNUF9MRU4gICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyAgICAgIE1BWF9MRU5HVEhfT0ZfU1VQUE9SVF9SQVRFUyAvLyAxLCAyLCA1LjUsIDExLCA2LCA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0CisjZGVmaW5lIE1BWF9MRU5fT0ZfS0VZICAgICAgICAgICAgICAgICAgMzIgICAgICAvLyAzMiBvY3RldHMgPT0gMjU2IGJpdHMsIFJlZGVmaW5lIGZvciBXUEEKKyNkZWZpbmUgTUFYX05VTV9PRl9DSEFOTkVMUyAgICAgICAgICAgICBNQVhfTlVNX09GX0NIUyAgICAgIC8vIDE0IGNoYW5uZWxzIEAyLjRHICsgIDEyQFVOSUkgKyA0IEBNTUFDICsgMTEgQEhpcGVyTEFOMiArIDcgQEphcGFuICsgMSBhcyBOVUxMIHRlcm1pbmF0aW9uCisjZGVmaW5lIE1BWF9OVU1fT0ZfMTFKQ0hBTk5FTFMgICAgICAgICAgICAgMjAgICAgICAvLyAxNCBjaGFubmVscyBAMi40RyArICAxMkBVTklJICsgNCBATU1BQyArIDExIEBIaXBlckxBTjIgKyA3IEBKYXBhbiArIDEgYXMgTlVMTCB0ZXJtaW5hdGlvbgorI2RlZmluZSBNQVhfTEVOX09GX1NTSUQgICAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIENJUEhFUl9URVhUX0xFTiAgICAgICAgICAgICAgICAgMTI4CisjZGVmaW5lIEhBU0hfVEFCTEVfU0laRSAgICAgICAgICAgICAgICAgMjU2CisjZGVmaW5lIE1BWF9WSUVfTEVOICAgICAgICAgICAgICAgICAgICAgMTAyNCAgIC8vIE5ldyBmb3IgV1BBIGNpcGhlciBzdWl0ZSB2YXJpYWJsZSBJRSBzaXplcy4KKyNkZWZpbmUgTUFYX1NVUFBPUlRfTUNTICAgICAgICAgICAgIDMyCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBBU0lDIFdDSUQgVGFibGUgZGVmaW5pdGlvbi4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIEJTU0lEX1dDSUQJCTEJLy8gaW4gaW5mcmEgbW9kZSwgYWx3YXlzIHB1dCBic3NpZCB3aXRoIHRoaXMgV0NJRAorI2RlZmluZSBNQ0FTVF9XQ0lECTB4MAorI2RlZmluZSBCU1MwTWNhc3RfV0NJRAkweDAKKyNkZWZpbmUgQlNTMU1jYXN0X1dDSUQJMHhmOAorI2RlZmluZSBCU1MyTWNhc3RfV0NJRAkweGY5CisjZGVmaW5lIEJTUzNNY2FzdF9XQ0lECTB4ZmEKKyNkZWZpbmUgQlNTNE1jYXN0X1dDSUQJMHhmYgorI2RlZmluZSBCU1M1TWNhc3RfV0NJRAkweGZjCisjZGVmaW5lIEJTUzZNY2FzdF9XQ0lECTB4ZmQKKyNkZWZpbmUgQlNTN01jYXN0X1dDSUQJMHhmZQorI2RlZmluZSBSRVNFUlZFRF9XQ0lECQkweGZmCisKKyNkZWZpbmUgTUFYX05VTV9PRl9BQ0xfTElTVAkJCQlNQVhfTlVNQkVSX09GX0FDTAorCisjZGVmaW5lIE1BWF9MRU5fT0ZfTUFDX1RBQkxFICAgICAgICAgICAgTUFYX05VTUJFUl9PRl9NQUMgLy8gaWYgTUFYX01CU1NJRF9OVU0gaXMgOCwgdGhpcyB2YWx1ZSBjYW4ndCBiZSBsYXJnZXIgdGhhbiAyMTEKKworI2lmIE1BWF9MRU5fT0ZfTUFDX1RBQkxFPk1BWF9BVkFJTEFCTEVfQ0xJRU5UX1dDSUQKKyNlcnJvciBNQVhfTEVOX09GX01BQ19UQUJMRSBjYW4gbm90IGJlIGxhcmdlciB0aGFuIE1BWF9BVkFJTEFCTEVfQ0xJRU5UX1dDSUQhISEhCisjZW5kaWYKKworI2RlZmluZSBNQVhfTlVNX09GX1dEU19MSU5LX1BFUkJTU0lECSAgICAgICAgICAgIDMKKyNkZWZpbmUgTUFYX05VTV9PRl9XRFNfTElOSwkgICAgICAgICAgICAoTUFYX05VTV9PRl9XRFNfTElOS19QRVJCU1NJRCpNQVhfTUJTU0lEX05VTSkKKyNkZWZpbmUgTUFYX05VTV9PRl9FVkVOVCAgICAgICAgICAgICAgICBNQVhfTlVNQkVSX09GX0VWRU5UCisjZGVmaW5lIFdEU19MSU5LX1NUQVJUX1dDSUQJCQkJKE1BWF9MRU5fT0ZfTUFDX1RBQkxFLTEpCisKKyNkZWZpbmUgTlVNX09GX1RJRAkJCTgKKyNkZWZpbmUgTUFYX0FJRF9CQSAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBNQVhfTEVOX09GX0JBX1JFQ19UQUJMRSAgICAgICAgICAoKE5VTV9PRl9USUQgKiBNQVhfTEVOX09GX01BQ19UQUJMRSkvMikvLyAgIChOVU1fT0ZfVElEKk1BWF9BSURfQkEgKyAzMikJIC8vQmxvY2sgQUNLIHJlY2lwaWVudAorI2RlZmluZSBNQVhfTEVOX09GX0JBX09SSV9UQUJMRSAgICAgICAgICAoKE5VTV9PRl9USUQgKiBNQVhfTEVOX09GX01BQ19UQUJMRSkvMikvLyAgIChOVU1fT0ZfVElEKk1BWF9BSURfQkEgKyAzMikgICAvLyBCbG9jayBBQ0sgb3JpZ2luYXRvcgorI2RlZmluZSBNQVhfTEVOX09GX0JTU19UQUJMRSAgICAgICAgICAgICA2NAorI2RlZmluZSBNQVhfUkVPUkRFUklOR19NUERVX05VTQkJCSA1MTIKKworLy8ga2V5IHJlbGF0ZWQgZGVmaW5pdGlvbnMKKyNkZWZpbmUgU0hBUkVfS0VZX05VTSAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIE1BWF9MRU5fT0ZfU0hBUkVfS0VZICAgICAgICAgICAgMTYgICAgLy8gYnl0ZSBjb3VudAorI2RlZmluZSBNQVhfTEVOX09GX1BFRVJfS0VZICAgICAgICAgICAgIDE2ICAgIC8vIGJ5dGUgY291bnQKKyNkZWZpbmUgUEFJUldJU0VfS0VZX05VTSAgICAgICAgICAgICAgICA2NCAgICAvLyBpbiBNQUMgQVNJQyBwYWlyd2lzZSBrZXkgdGFibGUKKyNkZWZpbmUgR1JPVVBfS0VZX05VTSAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFBNS19MRU4gICAgICAgICAgICAgICAgICAgICAgICAgMzIKKyNkZWZpbmUgV0RTX1BBSVJXSVNFX0tFWV9PRkZTRVQgICAgICAgICA2MCAgICAvLyBXRFMgbGlua3MgdXNlcyBwYWlyd2lzZSBrZXkjNjAgfiA2MyBpbiBBU0lDIHBhaXJ3aXNlIGtleSB0YWJsZQorI2RlZmluZQlQTUtJRF9OTyAgICAgICAgICAgICAgICAgICAgICAgIDQgICAgIC8vIE51bWJlciBvZiBQTUtJRCBzYXZlZCBzdXBwb3J0ZWQKKyNkZWZpbmUgTUFYX0xFTl9PRl9NTE1FX0JVRkZFUiAgICAgICAgICAyMDQ4CisKKy8vIHBvd2VyIHN0YXR1cyByZWxhdGVkIGRlZmluaXRpb25zCisjZGVmaW5lIFBXUl9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQV1JfU0FWRSAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUFdSX01NUFMgICAgICAgICAgICAgICAgICAgICAgICAyCQkJLy9NSU1PIHBvd2VyIHNhdmUKKy8vI2RlZmluZSBQV1JfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAyCisKKy8vIEF1dGggYW5kIEFzc29jIG1vZGUgcmVsYXRlZCBkZWZpbml0aW9ucworI2RlZmluZSBBVVRIX01PREVfT1BFTiAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgQVVUSF9NT0RFX0tFWSAgICAgICAgICAgICAgICAgICAweDAxCisvLyNkZWZpbmUgQVVUSF9NT0RFX0FVVE9fU1dJVENIICAgICAgICAgMHgwMworLy8jZGVmaW5lIEFVVEhfTU9ERV9ERUFVVEggICAgICAgICAgICAgIDB4MDQKKy8vI2RlZmluZSBBVVRIX01PREVfVVBMQVlFUiAgICAgICAgICAgICAweDA1IC8vIHJlc2VydmVkIGZvciA4MDIuMTFpIHVzZQorCisvLyBCU1MgVHlwZSBkZWZpbml0aW9ucworI2RlZmluZSBCU1NfQURIT0MgICAgICAgICAgICAgICAgICAgICAgIDAgIC8vID0gTmRpczgwMl8xMUlCU1MKKyNkZWZpbmUgQlNTX0lORlJBICAgICAgICAgICAgICAgICAgICAgICAxICAvLyA9IE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZQorI2RlZmluZSBCU1NfQU5ZICAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8vID0gTmRpczgwMl8xMUF1dG9Vbmtub3duCisjZGVmaW5lIEJTU19NT05JVE9SCQkJICAgICAgICAgICAgMyAgLy8gPSBOZGlzODAyXzExTW9uaXRvcgorCisKKy8vIFJlYXNvbiBjb2RlIGRlZmluaXRpb25zCisjZGVmaW5lIFJFQVNPTl9SRVNFUlZFRCAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBSRUFTT05fVU5TUEVDSUZZICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUkVBU09OX05PX0xPTkdFUl9WQUxJRCAgICAgICAgICAyCisjZGVmaW5lIFJFQVNPTl9ERUFVVEhfU1RBX0xFQVZJTkcgICAgICAgMworI2RlZmluZSBSRUFTT05fRElTQVNTT0NfSU5BQ1RJVkUgICAgICAgIDQKKyNkZWZpbmUgUkVBU09OX0RJU0FTU1BDX0FQX1VOQUJMRSAgICAgICA1CisjZGVmaW5lIFJFQVNPTl9DTFMyRVJSICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBSRUFTT05fQ0xTM0VSUiAgICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgUkVBU09OX0RJU0FTU09DX1NUQV9MRUFWSU5HICAgICA4CisjZGVmaW5lIFJFQVNPTl9TVEFfUkVRX0FTU09DX05PVF9BVVRIICAgOQorI2RlZmluZSBSRUFTT05fSU5WQUxJRF9JRSAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIFJFQVNPTl9NSUNfRkFJTFVSRSAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgUkVBU09OXzRfV0FZX1RJTUVPVVQgICAgICAgICAgICAxNQorI2RlZmluZSBSRUFTT05fR1JPVVBfS0VZX0hTX1RJTUVPVVQgICAgIDE2CisjZGVmaW5lIFJFQVNPTl9JRV9ESUZGRVJFTlQgICAgICAgICAgICAgMTcKKyNkZWZpbmUgUkVBU09OX01DSVBIRVJfTk9UX1ZBTElEICAgICAgICAxOAorI2RlZmluZSBSRUFTT05fVUNJUEhFUl9OT1RfVkFMSUQgICAgICAgIDE5CisjZGVmaW5lIFJFQVNPTl9BS01QX05PVF9WQUxJRCAgICAgICAgICAgMjAKKyNkZWZpbmUgUkVBU09OX1VOU1VQUE9SVF9SU05FX1ZFUiAgICAgICAyMQorI2RlZmluZSBSRUFTT05fSU5WQUxJRF9SU05FX0NBUCAgICAgICAgIDIyCisjZGVmaW5lIFJFQVNPTl84MDIxWF9BVVRIX0ZBSUwgICAgICAgICAgMjMKKyNkZWZpbmUgUkVBU09OX0NJUEhFUl9TVUlURV9SRUpFQ1RFRCAgICAyNAorI2RlZmluZSBSRUFTT05fREVDTElORUQgICAgICAgICAgICAgICAgIDM3CisKKyNkZWZpbmUgUkVBU09OX1FPU19VTlNQRUNJRlkgICAgICAgICAgICAgIDMyCisjZGVmaW5lIFJFQVNPTl9RT1NfTEFDS19CQU5EV0lEVEggICAgICAgICAzMworI2RlZmluZSBSRUFTT05fUE9PUl9DSEFOTkVMX0NPTkRJVElPTiAgICAgMzQKKyNkZWZpbmUgUkVBU09OX1FPU19PVVRTSURFX1RYT1BfTElNSVRJT04gIDM1CisjZGVmaW5lIFJFQVNPTl9RT1NfUVNUQV9MRUFWSU5HX1FCU1MgICAgICAzNgorI2RlZmluZSBSRUFTT05fUU9TX1VOV0FOVEVEX01FQ0hBTklTTSAgICAgMzcKKyNkZWZpbmUgUkVBU09OX1FPU19NRUNIX1NFVFVQX1JFUVVJUkVEICAgIDM4CisjZGVmaW5lIFJFQVNPTl9RT1NfUkVRVUVTVF9USU1FT1VUICAgICAgICAzOQorI2RlZmluZSBSRUFTT05fUU9TX0NJUEhFUl9OT1RfU1VQUE9SVCAgICAgNDUKKworLy8gU3RhdHVzIGNvZGUgZGVmaW5pdGlvbnMKKyNkZWZpbmUgTUxNRV9TVUNDRVNTICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1MTUVfVU5TUEVDSUZZX0ZBSUwgICAgICAgICAgICAgMQorI2RlZmluZSBNTE1FX0NBTk5PVF9TVVBQT1JUX0NBUCAgICAgICAgIDEwCisjZGVmaW5lIE1MTUVfUkVBU1NPQ19ERU5ZX0FTU09DX0VYSVNUICAgMTEKKyNkZWZpbmUgTUxNRV9BU1NPQ19ERU5ZX09VVF9TQ09QRSAgICAgICAxMgorI2RlZmluZSBNTE1FX0FMR19OT1RfU1VQUE9SVCAgICAgICAgICAgIDEzCisjZGVmaW5lIE1MTUVfU0VRX05SX09VVF9PRl9TRVFVRU5DRSAgICAgMTQKKyNkZWZpbmUgTUxNRV9SRUpfQ0hBTExFTkdFX0ZBSUxVUkUgICAgICAxNQorI2RlZmluZSBNTE1FX1JFSl9USU1FT1VUICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgTUxNRV9BU1NPQ19SRUpfVU5BQkxFX0hBTkRMRV9TVEEgIDE3CisjZGVmaW5lIE1MTUVfQVNTT0NfUkVKX0RBVEFfUkFURSAgICAgICAgICAxOAorCisjZGVmaW5lIE1MTUVfQVNTT0NfUkVKX05PX0VYVF9SQVRFICAgICAgICAyMgorI2RlZmluZSBNTE1FX0FTU09DX1JFSl9OT19FWFRfUkFURV9QQkNDICAgMjMKKyNkZWZpbmUgTUxNRV9BU1NPQ19SRUpfTk9fQ0NLX09GRE0gICAgICAgIDI0CisKKyNkZWZpbmUgTUxNRV9RT1NfVU5TUEVDSUZZICAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIE1MTUVfUkVRVUVTVF9ERUNMSU5FRCAgICAgICAgICAgICAzNworI2RlZmluZSBNTE1FX1JFUVVFU1RfV0lUSF9JTlZBTElEX1BBUkFNICAgMzgKKyNkZWZpbmUgTUxNRV9ETFNfTk9UX0FMTE9XX0lOX1FCU1MgICAgICAgIDQ4CisjZGVmaW5lIE1MTUVfREVTVF9TVEFfTk9UX0lOX1FCU1MgICAgICAgICA0OQorI2RlZmluZSBNTE1FX0RFU1RfU1RBX0lTX05PVF9BX1FTVEEgICAgICAgNTAKKworI2RlZmluZSBNTE1FX0lOVkFMSURfRk9STUFUICAgICAgICAgICAgIDB4NTEKKyNkZWZpbmUgTUxNRV9GQUlMX05PX1JFU09VUkNFICAgICAgICAgICAweDUyCisjZGVmaW5lIE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1QgICAgICAgMHg1MworI2RlZmluZSBNTE1FX01BQ19UQUJMRV9GQUlMICAgICAgICAgICAgIDB4NTQKKworLy8gSUUgY29kZQorI2RlZmluZSBJRV9TU0lEICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSUVfU1VQUF9SQVRFUyAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElFX0ZIX1BBUk0gICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBJRV9EU19QQVJNICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgSUVfQ0ZfUEFSTSAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIElFX1RJTSAgICAgICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBJRV9JQlNTX1BBUk0gICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgSUVfQ09VTlRSWSAgICAgICAgICAgICAgICAgICAgICA3ICAgICAvLyA4MDIuMTFkCisjZGVmaW5lIElFXzgwMl8xMURfUkVRVUVTVCAgICAgICAgICAgICAgMTAgICAgLy8gODAyLjExZAorI2RlZmluZSBJRV9RQlNTX0xPQUQgICAgICAgICAgICAgICAgICAgIDExICAgIC8vIDgwMi4xMWUgZDkKKyNkZWZpbmUgSUVfRURDQV9QQVJBTUVURVIgICAgICAgICAgICAgICAxMiAgICAvLyA4MDIuMTFlIGQ5CisjZGVmaW5lIElFX1RTUEVDICAgICAgICAgICAgICAgICAgICAgICAgMTMgICAgLy8gODAyLjExZSBkOQorI2RlZmluZSBJRV9UQ0xBUyAgICAgICAgICAgICAgICAgICAgICAgIDE0ICAgIC8vIDgwMi4xMWUgZDkKKyNkZWZpbmUgSUVfU0NIRURVTEUgICAgICAgICAgICAgICAgICAgICAxNSAgICAvLyA4MDIuMTFlIGQ5CisjZGVmaW5lIElFX0NIQUxMRU5HRV9URVhUICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgSUVfUE9XRVJfQ09OU1RSQUlOVCAgICAgICAgICAgICAzMiAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfUE9XRVJfQ0FQQUJJTElUWSAgICAgICAgICAgICAzMyAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfVFBDX1JFUVVFU1QgICAgICAgICAgICAgICAgICAzNCAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfVFBDX1JFUE9SVCAgICAgICAgICAgICAgICAgICAzNSAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfU1VQUF9DSEFOTkVMUyAgICAgICAgICAgICAgICAzNiAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UICAzNyAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfTUVBU1VSRU1FTlRfUkVRVUVTVCAgICAgICAgICAzOCAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfTUVBU1VSRU1FTlRfUkVQT1JUICAgICAgICAgICAzOSAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfUVVJRVQgICAgICAgICAgICAgICAgICAgICAgICA0MCAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfSUJTU19ERlMgICAgICAgICAgICAgICAgICAgICA0MSAgICAvLyA4MDIuMTFoIGQzLjMKKyNkZWZpbmUgSUVfRVJQICAgICAgICAgICAgICAgICAgICAgICAgICA0MiAgICAvLyA4MDIuMTFnCisjZGVmaW5lIElFX1RTX0RFTEFZICAgICAgICAgICAgICAgICAgICAgNDMgICAgLy8gODAyLjExZSBkOQorI2RlZmluZSBJRV9UQ0xBU19QUk9DRVNTSU5HICAgICAgICAgICAgIDQ0ICAgIC8vIDgwMi4xMWUgZDkKKyNkZWZpbmUgSUVfUU9TX0NBUEFCSUxJVFkgICAgICAgICAgICAgICA0NiAgICAvLyA4MDIuMTFlIGQ2CisjZGVmaW5lIElFX0hUX0NBUCAgICAgICAgICAgICAgICAgICAgICAgNDUgICAgLy8gODAyLjExbiBkMS4gSFQgQ0FQQUJJTElUWS4gRUxFTUVOVCBJRCBUQkQKKyNkZWZpbmUgSUVfQVBfQ0hBTk5FTF9SRVBPUlQJCQk1MSAgICAvLyA4MDIuMTFrIGQ2CisjZGVmaW5lIElFX0hUX0NBUDIgICAgICAgICAgICAgICAgICAgICAgICAgNTIgICAgLy8gODAyLjExbiBkMS4gSFQgQ0FQQUJJTElUWS4gRUxFTUVOVCBJRCBUQkQKKyNkZWZpbmUgSUVfUlNOICAgICAgICAgICAgICAgICAgICAgICAgICA0OCAgICAvLyA4MDIuMTFpIGQzLjAKKyNkZWZpbmUgSUVfV1BBMiAgICAgICAgICAgICAgICAgICAgICAgICA0OCAgICAvLyBXUEEyCisjZGVmaW5lIElFX0VYVF9TVVBQX1JBVEVTICAgICAgICAgICAgICAgNTAgICAgLy8gODAyLjExZworI2RlZmluZSBJRV9TVVBQX1JFR19DTEFTUyAgICAgICAgICAgICAgIDU5ICAgIC8vIDgwMi4xMXkuIFN1cHBvcnRlZCByZWd1bGF0b3J5IGNsYXNzZXMuCisjZGVmaW5lIElFX0VYVF9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlQJNjAJLy8gODAyLjExbgorI2RlZmluZSBJRV9BRERfSFQgICAgICAgICAgICAgICAgICAgICAgICAgNjEgICAgLy8gODAyLjExbiBkMS4gQURESVRJT05BTCBIVCBDQVBBQklMSVRZLiBFTEVNRU5UIElEIFRCRAorI2RlZmluZSBJRV9BRERfSFQyICAgICAgICAgICAgICAgICAgICAgICAgNTMgICAgLy8gODAyLjExbiBkMS4gQURESVRJT05BTCBIVCBDQVBBQklMSVRZLiBFTEVNRU5UIElEIFRCRAorCisKKy8vIEZvciA4MDIuMTFuIEQzLjAzCisvLyNkZWZpbmUgSUVfTkVXX0VYVF9DSEFfT0ZGU0VUICAgICAgICAgICAgIDYyICAgIC8vIDgwMi4xMW4gZDEuIE5ldyBleHRlbnNpb24gY2hhbm5lbCBvZmZzZXQgZWxlbWV0CisjZGVmaW5lIElFX1NFQ09OREFSWV9DSF9PRkZTRVQJCTYyCS8vIDgwMi4xMW4gRDMuMDMJU2Vjb25kYXJ5IENoYW5uZWwgT2Zmc2V0IGVsZW1lbnQKKyNkZWZpbmUgSUVfV0FQSQkJCQkJCQk2OAkJLy8gV0FQSSBpbmZvcm1hdGlvbiBlbGVtZW50CisjZGVmaW5lIElFXzIwNDBfQlNTX0NPRVhJU1QgICAgICAgICAgICAgICA3MiAgICAvLyA4MDIuMTFuIEQzLjAuMworI2RlZmluZSBJRV8yMDQwX0JTU19JTlRPTEVSQU5UX1JFUE9SVCAgICAgNzMgICAgLy8gODAyLjExbiBEMy4wMworI2RlZmluZSBJRV9PVkVSTEFQQlNTX1NDQU5fUEFSTSAgICAgICAgICAgNzQgICAgLy8gODAyLjExbiBEMy4wMworI2RlZmluZSBJRV9FWFRfQ0FQQUJJTElUWSAgICAgICAgICAgICAgICAxMjcgICAvLyA4MDIuMTFuIEQzLjAzCisKKworI2RlZmluZSBJRV9XUEEgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMSAgIC8vIFdQQQorI2RlZmluZSBJRV9WRU5ET1JfU1BFQ0lGSUMgICAgICAgICAgICAgIDIyMSAgIC8vIFdpZmkgV01NIChXTUUpCisKKyNkZWZpbmUgT1VJX0JST0FEQ09NX0hUICAgICAgICAgICAgICA1MSAgIC8vCisjZGVmaW5lIE9VSV9CUk9BRENPTV9IVEFERCAgICAgICAgICAgICAgNTIgICAvLworI2RlZmluZSBPVUlfUFJFTl9IVF9DQVAgICAgICAgICAgICAgIDUxICAgLy8KKyNkZWZpbmUgT1VJX1BSRU5fQUREX0hUICAgICAgICAgICAgICA1MiAgIC8vCisKKy8vIENDWCBpbmZvcm1hdGlvbgorI2RlZmluZSBJRV9BSVJPTkVUX0NLSVAgICAgICAgICAgICAgICAgIDEzMyAgIC8vIENDWDEuMCBJRCA4NUggZm9yIENLSVAKKyNkZWZpbmUgSUVfQVBfVFhfUE9XRVIgICAgICAgICAgICAgICAgICAxNTAgICAvLyBDQ1ggMi4wIGZvciBBUCB0cmFuc21pdCBwb3dlcgorI2RlZmluZSBJRV9NRUFTVVJFTUVOVF9DQVBBQklMSVRZICAgICAgIDIyMSAgIC8vIENDWCAyLjAKKyNkZWZpbmUgSUVfQ0NYX1YyICAgICAgICAgICAgICAgICAgICAgICAyMjEKKyNkZWZpbmUgSUVfQUlST05FVF9JUEFERFJFU1MgICAgICAgICAgICAxNDkgICAvLyBDQ1ggSUQgOTVIIGZvciBJUCBBZGRyZXNzCisjZGVmaW5lIElFX0FJUk9ORVRfQ0NLTVJFQVNTT0MgICAgICAgICAgMTU2ICAgLy8gQ0NYIElEIDlDSCBmb3IgQ0NLTSBSZWFzc29jaWF0aW9uIFJlcXVlc3QgZWxlbWVudAorI2RlZmluZSBDS0lQX05FR09USUFUSU9OX0xFTkdUSCAgICAgICAgIDMwCisjZGVmaW5lIEFJUk9ORVRfSVBBRERSRVNTX0xFTkdUSCAgICAgICAgMTAKKyNkZWZpbmUgQUlST05FVF9DQ0tNUkVBU1NPQ19MRU5HVEggICAgICAyNAorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gTUxNRSBzdGF0ZSBtYWNoaW5lIGRlZmluaXRpb24KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIFNUQSBNTE1FIHN0YXRlIG1haGNpbmVzCisjZGVmaW5lIEFTU09DX1NUQVRFX01BQ0hJTkUgICAgICAgICAgICAgMQorI2RlZmluZSBBVVRIX1NUQVRFX01BQ0hJTkUgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQVVUSF9SU1BfU1RBVEVfTUFDSElORSAgICAgICAgICAzCisjZGVmaW5lIFNZTkNfU1RBVEVfTUFDSElORSAgICAgICAgICAgICAgNAorI2RlZmluZSBNTE1FX0NOVExfU1RBVEVfTUFDSElORSAgICAgICAgIDUKKyNkZWZpbmUgV1BBX1BTS19TVEFURV9NQUNISU5FICAgICAgICAgICA2CisjZGVmaW5lIExFQVBfU1RBVEVfTUFDSElORSAgICAgICAgICAgICAgNworI2RlZmluZSBBSVJPTkVUX1NUQVRFX01BQ0hJTkUgICAgICAgICAgIDgKKyNkZWZpbmUgQUNUSU9OX1NUQVRFX01BQ0hJTkUgICAgICAgICAgIDkKKworLy8gQVAgTUxNRSBzdGF0ZSBtYWNoaW5lcworI2RlZmluZSBBUF9BU1NPQ19TVEFURV9NQUNISU5FICAgICAgICAgIDExCisjZGVmaW5lIEFQX0FVVEhfU1RBVEVfTUFDSElORSAgICAgICAgICAgMTIKKyNkZWZpbmUgQVBfQVVUSF9SU1BfU1RBVEVfTUFDSElORSAgICAgICAxMworI2RlZmluZSBBUF9TWU5DX1NUQVRFX01BQ0hJTkUgICAgICAgICAgIDE0CisjZGVmaW5lIEFQX0NOVExfU1RBVEVfTUFDSElORSAgICAgICAgICAgMTUKKyNkZWZpbmUgQVBfV1BBX1NUQVRFX01BQ0hJTkUgICAgICAgICAgICAxNgorCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisjZGVmaW5lIERMU19TVEFURV9NQUNISU5FICAgICAgICAgICAgICAgMjYKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworLy8KKy8vIFNUQSdzIENPTlRST0wvQ09OTkVDVCBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgQ05UTF9JRExFICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENOVExfV0FJVF9ESVNBU1NPQyAgICAgICAgICAgICAgMQorI2RlZmluZSBDTlRMX1dBSVRfSk9JTiAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQ05UTF9XQUlUX1JFQVNTT0MgICAgICAgICAgICAgICAzCisjZGVmaW5lIENOVExfV0FJVF9TVEFSVCAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBDTlRMX1dBSVRfQVVUSCAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgQ05UTF9XQUlUX0FTU09DICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIENOVExfV0FJVF9BVVRIMiAgICAgICAgICAgICAgICAgNworI2RlZmluZSBDTlRMX1dBSVRfT0lEX0xJU1RfU0NBTiAgICAgICAgIDgKKyNkZWZpbmUgQ05UTF9XQUlUX09JRF9ESVNBU1NPQyAgICAgICAgICA5CisjaWZkZWYgUlQyODcwCisjZGVmaW5lIENOVExfV0FJVF9TQ0FOX0ZPUl9DT05ORUNUICAgICAgMTAKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKworI2RlZmluZSBNVDJfQVNTT0NfQ09ORiAgICAgICAgICAgICAgICAgIDM0CisjZGVmaW5lIE1UMl9BVVRIX0NPTkYgICAgICAgICAgICAgICAgICAgMzUKKyNkZWZpbmUgTVQyX0RFQVVUSF9DT05GICAgICAgICAgICAgICAgICAzNgorI2RlZmluZSBNVDJfRElTQVNTT0NfQ09ORiAgICAgICAgICAgICAgIDM3CisjZGVmaW5lIE1UMl9SRUFTU09DX0NPTkYgICAgICAgICAgICAgICAgMzgKKyNkZWZpbmUgTVQyX1BXUl9NR01UX0NPTkYgICAgICAgICAgICAgICAzOQorI2RlZmluZSBNVDJfSk9JTl9DT05GICAgICAgICAgICAgICAgICAgIDQwCisjZGVmaW5lIE1UMl9TQ0FOX0NPTkYgICAgICAgICAgICAgICAgICAgNDEKKyNkZWZpbmUgTVQyX1NUQVJUX0NPTkYgICAgICAgICAgICAgICAgICA0MgorI2RlZmluZSBNVDJfR0VUX0NPTkYgICAgICAgICAgICAgICAgICAgIDQzCisjZGVmaW5lIE1UMl9TRVRfQ09ORiAgICAgICAgICAgICAgICAgICAgNDQKKyNkZWZpbmUgTVQyX1JFU0VUX0NPTkYgICAgICAgICAgICAgICAgICA0NQorI2RlZmluZSBNVDJfTUxNRV9ST0FNSU5HX1JFUSAgICAgICAgICAgIDUyCisKKyNkZWZpbmUgQ05UTF9GVU5DX1NJWkUgICAgICAgICAgICAgICAgICAxCisKKy8vCisvLyBTVEEncyBBU1NPQyBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgQVNTT0NfSURMRSAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFTU09DX1dBSVRfUlNQICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBSRUFTU09DX1dBSVRfUlNQICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgRElTQVNTT0NfV0FJVF9SU1AgICAgICAgICAgICAgICAzCisjZGVmaW5lIE1BWF9BU1NPQ19TVEFURSAgICAgICAgICAgICAgICAgNAorCisjZGVmaW5lIEFTU09DX01BQ0hJTkVfQkFTRSAgICAgICAgICAgICAgMAorI2RlZmluZSBNVDJfTUxNRV9BU1NPQ19SRVEgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTVQyX01MTUVfUkVBU1NPQ19SRVEgICAgICAgICAgICAxCisjZGVmaW5lIE1UMl9NTE1FX0RJU0FTU09DX1JFUSAgICAgICAgICAgMgorI2RlZmluZSBNVDJfUEVFUl9ESVNBU1NPQ19SRVEgICAgICAgICAgIDMKKyNkZWZpbmUgTVQyX1BFRVJfQVNTT0NfUkVRICAgICAgICAgICAgICA0CisjZGVmaW5lIE1UMl9QRUVSX0FTU09DX1JTUCAgICAgICAgICAgICAgNQorI2RlZmluZSBNVDJfUEVFUl9SRUFTU09DX1JFUSAgICAgICAgICAgIDYKKyNkZWZpbmUgTVQyX1BFRVJfUkVBU1NPQ19SU1AgICAgICAgICAgICA3CisjZGVmaW5lIE1UMl9ESVNBU1NPQ19USU1FT1VUICAgICAgICAgICAgOAorI2RlZmluZSBNVDJfQVNTT0NfVElNRU9VVCAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgTVQyX1JFQVNTT0NfVElNRU9VVCAgICAgICAgICAgICAxMAorI2RlZmluZSBNQVhfQVNTT0NfTVNHICAgICAgICAgICAgICAgICAgIDExCisKKyNkZWZpbmUgQVNTT0NfRlVOQ19TSVpFICAgICAgICAgICAgICAgICAoTUFYX0FTU09DX1NUQVRFICogTUFYX0FTU09DX01TRykKKworLy8KKy8vIEFDVCBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgQUNUX0lETEUgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNQVhfQUNUX1NUQVRFICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgQUNUX01BQ0hJTkVfQkFTRSAgICAgICAgICAgICAgMAorCisvL1Rob3NlIFBFRVJfeHhfQ0FURSBudW1iZXIgaXMgYmFzZWQgb24gcmVhbCBDYXRlZ2FyeSB2YWx1ZSBpbiBJRUVFIHNwZWMuIFBsZWFzZSBkb24nZXMgbW9kaWZ5IGl0IGJ5IHlvdXIgc2VsZi4KKy8vQ2F0ZWdvcnkKKyNkZWZpbmUgTVQyX1BFRVJfU1BFQ1RSVU1fQ0FURSAgICAgICAgICAgICAgMAorI2RlZmluZSBNVDJfUEVFUl9RT1NfQ0FURSAgICAgICAgICAgICAgMQorI2RlZmluZSBNVDJfUEVFUl9ETFNfQ0FURSAgICAgICAgICAgICAyCisjZGVmaW5lIE1UMl9QRUVSX0JBX0NBVEUgICAgICAgICAgICAgMworI2RlZmluZSBNVDJfUEVFUl9QVUJMSUNfQ0FURSAgICAgICAgICAgICA0CisjZGVmaW5lIE1UMl9QRUVSX1JNX0NBVEUgICAgICAgICAgICAgNQorI2RlZmluZSBNVDJfUEVFUl9IVF9DQVRFICAgICAgICAgICAgIDcJLy8JNy40LjcKKyNkZWZpbmUgTUFYX1BFRVJfQ0FURV9NU0cgICAgICAgICAgICAgICAgICAgNworI2RlZmluZSBNVDJfTUxNRV9BRERfQkFfQ0FURSAgICAgICAgICAgICA4CisjZGVmaW5lIE1UMl9NTE1FX09SSV9ERUxCQV9DQVRFICAgICAgICAgICAgIDkKKyNkZWZpbmUgTVQyX01MTUVfUkVDX0RFTEJBX0NBVEUgICAgICAgICAgICAgMTAKKyNkZWZpbmUgTVQyX01MTUVfUU9TX0NBVEUgICAgICAgICAgICAgIDExCisjZGVmaW5lIE1UMl9NTE1FX0RMU19DQVRFICAgICAgICAgICAgIDEyCisjZGVmaW5lIE1UMl9BQ1RfSU5WQUxJRCAgICAgICAgICAgICAxMworI2RlZmluZSBNQVhfQUNUX01TRyAgICAgICAgICAgICAgICAgICAxNAorCisvL0NhdGVnb3J5IGZpZWxkCisjZGVmaW5lIENBVEVHT1JZX1NQRUNUUlVNCQkwCisjZGVmaW5lIENBVEVHT1JZX1FPUwkJCTEKKyNkZWZpbmUgQ0FURUdPUllfRExTCQkJMgorI2RlZmluZSBDQVRFR09SWV9CQQkJCTMKKyNkZWZpbmUgQ0FURUdPUllfUFVCTElDCQk0CisjZGVmaW5lIENBVEVHT1JZX1JNCQkJNQorI2RlZmluZSBDQVRFR09SWV9IVAkJCTcKKworCisvLyBETFMgQWN0aW9uIGZyYW1lIGRlZmluaXRpb24KKyNkZWZpbmUgQUNUSU9OX0RMU19SRVFVRVNUCQkJMAorI2RlZmluZSBBQ1RJT05fRExTX1JFU1BPTlNFCQkJMQorI2RlZmluZSBBQ1RJT05fRExTX1RFQVJET1dOCQkJMgorCisvL1NwZWN0cnVtICBBY3Rpb24gZmllbGQgdmFsdWUgODAyLjExaCA3LjQuMQorI2RlZmluZSBTUEVDX01SUQkwCS8vIFJlcXVlc3QKKyNkZWZpbmUgU1BFQ19NUlAJMQkvL1JlcG9ydAorI2RlZmluZSBTUEVDX1RQQ1JRCTIKKyNkZWZpbmUgU1BFQ19UUENSUAkzCisjZGVmaW5lIFNQRUNfQ0hBTk5FTF9TV0lUQ0gJNAorCisKKy8vQkEgIEFjdGlvbiBmaWVsZCB2YWx1ZQorI2RlZmluZSBBRERCQV9SRVEJMAorI2RlZmluZSBBRERCQV9SRVNQCTEKKyNkZWZpbmUgREVMQkEgICAyCisKKy8vUHVibGljJ3MgIEFjdGlvbiBmaWVsZCB2YWx1ZSBpbiBQdWJsaWMgQ2F0ZWdvcnkuICBTb21lIGluIDgwMi4xMXkgYW5kIHNvbWUgaW4gMTFuCisjZGVmaW5lIEFDVElPTl9CU1NfMjA0MF9DT0VYSVNUCQkJCTAJLy8gMTFuCisjZGVmaW5lIEFDVElPTl9EU0VfRU5BQkxFTUVOVAkJCQkJMQkvLyAxMXkgRDkuMAorI2RlZmluZSBBQ1RJT05fRFNFX0RFRU5BQkxFTUVOVAkJCQkyCS8vIDExeSBEOS4wCisjZGVmaW5lIEFDVElPTl9EU0VfUkVHX0xPQ0FUSU9OX0FOTk9VTkNFCTMJLy8gMTF5IEQ5LjAKKyNkZWZpbmUgQUNUSU9OX0VYVF9DSF9TV0lUQ0hfQU5OT1VOQ0UJCTQJLy8gMTF5IEQ5LjAKKyNkZWZpbmUgQUNUSU9OX0RTRV9NRUFTVVJFTUVOVF9SRVEJCQk1CS8vIDExeSBEOS4wCisjZGVmaW5lIEFDVElPTl9EU0VfTUVBU1VSRU1FTlRfUkVQT1JUCQk2CS8vIDExeSBEOS4wCisjZGVmaW5lIEFDVElPTl9NRUFTVVJFTUVOVF9QSUxPVF9BQ1RJT04JCTcgIAkvLyAxMXkgRDkuMAorI2RlZmluZSBBQ1RJT05fRFNFX1BPV0VSX0NPTlNUUkFJTlQJCQk4CS8vIDExeSBEOS4wCisKKworLy9IVCAgQWN0aW9uIGZpZWxkIHZhbHVlCisjZGVmaW5lIE5PVElGWV9CV19BQ1RJT04JCQkJMAorI2RlZmluZSBTTVBTX0FDVElPTgkJCQkJCTEKKyNkZWZpbmUgUFNNUF9BQ1RJT04gICAJCQkJCTIKKyNkZWZpbmUgU0VUUENPX0FDVElPTgkJCQkJMworI2RlZmluZSBNSU1PX0NIQV9NRUFTVVJFX0FDVElPTgkJCTQKKyNkZWZpbmUgTUlNT19OX0JFQUNPTkZPUk0JCQkJNQorI2RlZmluZSBNSU1PX0JFQUNPTkZPUk0JCQkJCTYKKyNkZWZpbmUgQU5URU5OQV9TRUxFQ1QJCQkJCTcKKyNkZWZpbmUgSFRfSU5GT19FWENIQU5HRQkJCQk4CisKKyNkZWZpbmUgQUNUX0ZVTkNfU0laRSAgICAgICAgICAgICAgICAgKE1BWF9BQ1RfU1RBVEUgKiBNQVhfQUNUX01TRykKKy8vCisvLyBTVEEncyBBVVRIRU5USUNBVElPTiBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2dmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIEFVVEhfUkVRX0lETEUgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBVVRIX1dBSVRfU0VRMiAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQVVUSF9XQUlUX1NFUTQgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIE1BWF9BVVRIX1NUQVRFICAgICAgICAgICAgICAgICAgMworCisjZGVmaW5lIEFVVEhfTUFDSElORV9CQVNFICAgICAgICAgICAgICAgMAorI2RlZmluZSBNVDJfTUxNRV9BVVRIX1JFUSAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTVQyX1BFRVJfQVVUSF9FVkVOICAgICAgICAgICAgICAxCisjZGVmaW5lIE1UMl9BVVRIX1RJTUVPVVQgICAgICAgICAgICAgICAgMgorI2RlZmluZSBNQVhfQVVUSF9NU0cgICAgICAgICAgICAgICAgICAgIDMKKworI2RlZmluZSBBVVRIX0ZVTkNfU0laRSAgICAgICAgICAgICAgICAgIChNQVhfQVVUSF9TVEFURSAqIE1BWF9BVVRIX01TRykKKworLy8KKy8vIFNUQSdzIEFVVEhfUlNQIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCisvLworI2RlZmluZSBBVVRIX1JTUF9JRExFICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVVUSF9SU1BfV0FJVF9DSEFMICAgICAgICAgICAgICAxCisjZGVmaW5lIE1BWF9BVVRIX1JTUF9TVEFURSAgICAgICAgICAgICAgMgorCisjZGVmaW5lIEFVVEhfUlNQX01BQ0hJTkVfQkFTRSAgICAgICAgICAgMAorI2RlZmluZSBNVDJfQVVUSF9DSEFMTEVOR0VfVElNRU9VVCAgICAgIDAKKyNkZWZpbmUgTVQyX1BFRVJfQVVUSF9PREQgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1UMl9QRUVSX0RFQVVUSCAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBNQVhfQVVUSF9SU1BfTVNHICAgICAgICAgICAgICAgIDMKKworI2RlZmluZSBBVVRIX1JTUF9GVU5DX1NJWkUgICAgICAgICAgICAgIChNQVhfQVVUSF9SU1BfU1RBVEUgKiBNQVhfQVVUSF9SU1BfTVNHKQorCisvLworLy8gU1RBJ3MgU1lOQyBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgU1lOQ19JRExFICAgICAgICAgICAgICAgICAgICAgICAwICAvLyBtZXJnZSBOT19CU1MsSUJTU19JRExFLElCU1NfQUNUSVZFIGFuZCBCU1MgaW4gdG8gMSBzdGF0ZQorI2RlZmluZSBKT0lOX1dBSVRfQkVBQ09OICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgU0NBTl9MSVNURU4gICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIE1BWF9TWU5DX1NUQVRFICAgICAgICAgICAgICAgICAgMworCisjZGVmaW5lIFNZTkNfTUFDSElORV9CQVNFICAgICAgICAgICAgICAgMAorI2RlZmluZSBNVDJfTUxNRV9TQ0FOX1JFUSAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTVQyX01MTUVfSk9JTl9SRVEgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1UMl9NTE1FX1NUQVJUX1JFUSAgICAgICAgICAgICAgMgorI2RlZmluZSBNVDJfUEVFUl9CRUFDT04gICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgTVQyX1BFRVJfUFJPQkVfUlNQICAgICAgICAgICAgICA0CisjZGVmaW5lIE1UMl9QRUVSX0FUSU0gICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBNVDJfU0NBTl9USU1FT1VUICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgTVQyX0JFQUNPTl9USU1FT1VUICAgICAgICAgICAgICA3CisjZGVmaW5lIE1UMl9BVElNX1RJTUVPVVQgICAgICAgICAgICAgICAgOAorI2RlZmluZSBNVDJfUEVFUl9QUk9CRV9SRVEgICAgICAgICAgICAgIDkKKyNkZWZpbmUgTUFYX1NZTkNfTVNHICAgICAgICAgICAgICAgICAgICAxMAorCisjZGVmaW5lIFNZTkNfRlVOQ19TSVpFICAgICAgICAgICAgICAgICAgKE1BWF9TWU5DX1NUQVRFICogTUFYX1NZTkNfTVNHKQorCisvL01lc3NhZ2VzIGZvciB0aGUgRExTIHN0YXRlIG1hY2hpbmUKKyNkZWZpbmUgRExTX0lETEUJCQkJCQkwCisjZGVmaW5lIE1BWF9ETFNfU1RBVEUJCQkJCTEKKworI2RlZmluZSBETFNfTUFDSElORV9CQVNFCQkJCTAKKyNkZWZpbmUgTVQyX01MTUVfRExTX1JFUQkJCSAgICAwCisjZGVmaW5lIE1UMl9QRUVSX0RMU19SRVEJCQkgICAgMQorI2RlZmluZSBNVDJfUEVFUl9ETFNfUlNQCQkJICAgIDIKKyNkZWZpbmUgTVQyX01MTUVfRExTX1RFQVJfRE9XTgkJICAgIDMKKyNkZWZpbmUgTVQyX1BFRVJfRExTX1RFQVJfRE9XTgkJICAgIDQKKyNkZWZpbmUgTUFYX0RMU19NU0cJCQkJICAgICAgICA1CisKKyNkZWZpbmUgRExTX0ZVTkNfU0laRQkJCQkJKE1BWF9ETFNfU1RBVEUgKiBNQVhfRExTX01TRykKKworLy8KKy8vIFNUQSdzIFdQQS1QU0sgU3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIFdQQV9QU0tfSURMRQkJCQkJMAorI2RlZmluZSBNQVhfV1BBX1BTS19TVEFURQkJCQkxCisKKyNkZWZpbmUgV1BBX01BQ0hJTkVfQkFTRSAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1UMl9FQVBQYWNrZXQgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNVDJfRUFQT0xTdGFydCAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTVQyX0VBUE9MTG9nb2ZmICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIE1UMl9FQVBPTEtleSAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBNVDJfRUFQT0xBU0ZBbGVydCAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTUFYX1dQQV9QU0tfTVNHICAgICAgICAgICAgICAgICA1CisKKyNkZWZpbmUJV1BBX1BTS19GVU5DX1NJWkUJCQkJKE1BWF9XUEFfUFNLX1NUQVRFICogTUFYX1dQQV9QU0tfTVNHKQorCisvLworLy8gU1RBJ3MgQ0lTQ08tQUlST05FVCBTdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgQUlST05FVF9JRExFCQkJCQkwCisjZGVmaW5lCUFJUk9ORVRfU0NBTk5JTkcJCQkJMQorI2RlZmluZSBNQVhfQUlST05FVF9TVEFURQkJCQkyCisKKyNkZWZpbmUgQUlST05FVF9NQUNISU5FX0JBU0UJCSAgICAwCisjZGVmaW5lIE1UMl9BSVJPTkVUX01TRwkJCQkgICAgMAorI2RlZmluZSBNVDJfQUlST05FVF9TQ0FOX1JFUQkJICAgIDEKKyNkZWZpbmUgTVQyX0FJUk9ORVRfU0NBTl9ET05FCQkgICAgMgorI2RlZmluZSBNQVhfQUlST05FVF9NU0cJCQkJICAgIDMKKworI2RlZmluZQlBSVJPTkVUX0ZVTkNfU0laRQkJCQkoTUFYX0FJUk9ORVRfU1RBVEUgKiBNQVhfQUlST05FVF9NU0cpCisKKy8vCisvLyBBUCdzIENPTlRST0wvQ09OTkVDVCBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgQVBfQ05UTF9GVU5DX1NJWkUgICAgICAgICAgICAgICAxCisKKy8vCisvLyBBUCdzIEFTU09DIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCisvLworI2RlZmluZSBBUF9BU1NPQ19JRExFICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBfTUFYX0FTU09DX1NUQVRFICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgQVBfQVNTT0NfTUFDSElORV9CQVNFICAgICAgICAgICAwCisjZGVmaW5lIEFQTVQyX01MTUVfRElTQVNTT0NfUkVRICAgICAgICAgMAorI2RlZmluZSBBUE1UMl9QRUVSX0RJU0FTU09DX1JFUSAgICAgICAgIDEKKyNkZWZpbmUgQVBNVDJfUEVFUl9BU1NPQ19SRVEgICAgICAgICAgICAyCisjZGVmaW5lIEFQTVQyX1BFRVJfUkVBU1NPQ19SRVEgICAgICAgICAgMworI2RlZmluZSBBUE1UMl9DTFMzRVJSICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgQVBfTUFYX0FTU09DX01TRyAgICAgICAgICAgICAgICA1CisKKyNkZWZpbmUgQVBfQVNTT0NfRlVOQ19TSVpFICAgICAgICAgICAgICAoQVBfTUFYX0FTU09DX1NUQVRFICogQVBfTUFYX0FTU09DX01TRykKKworLy8KKy8vIEFQJ3MgQVVUSEVOVElDQVRJT04gc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIEFQX0FVVEhfUkVRX0lETEUgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUF9NQVhfQVVUSF9TVEFURSAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBBUF9BVVRIX01BQ0hJTkVfQkFTRSAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBNVDJfTUxNRV9ERUFVVEhfUkVRICAgICAgICAgICAwCisjZGVmaW5lIEFQTVQyX0NMUzJFUlIgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBBUF9NQVhfQVVUSF9NU0cgICAgICAgICAgICAgICAgIDIKKworI2RlZmluZSBBUF9BVVRIX0ZVTkNfU0laRSAgICAgICAgICAgICAgIChBUF9NQVhfQVVUSF9TVEFURSAqIEFQX01BWF9BVVRIX01TRykKKworLy8KKy8vIEFQJ3MgQVVUSC1SU1Agc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIEFQX0FVVEhfUlNQX0lETEUgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUF9NQVhfQVVUSF9SU1BfU1RBVEUgICAgICAgICAgIDEKKworI2RlZmluZSBBUF9BVVRIX1JTUF9NQUNISU5FX0JBU0UgICAgICAgIDAKKyNkZWZpbmUgQVBNVDJfQVVUSF9DSEFMTEVOR0VfVElNRU9VVCAgICAwCisjZGVmaW5lIEFQTVQyX1BFRVJfQVVUSF9PREQgICAgICAgICAgICAgMQorI2RlZmluZSBBUE1UMl9QRUVSX0RFQVVUSCAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQVBfTUFYX0FVVEhfUlNQX01TRyAgICAgICAgICAgICAzCisKKyNkZWZpbmUgQVBfQVVUSF9SU1BfRlVOQ19TSVpFICAgICAgICAgICAoQVBfTUFYX0FVVEhfUlNQX1NUQVRFICogQVBfTUFYX0FVVEhfUlNQX01TRykKKworLy8KKy8vIEFQJ3MgU1lOQyBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIworLy8KKyNkZWZpbmUgQVBfU1lOQ19JRExFICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFQX1NDQU5fTElTVEVOCQkJCQkxCisjZGVmaW5lIEFQX01BWF9TWU5DX1NUQVRFICAgICAgICAgICAgICAgMgorCisjZGVmaW5lIEFQX1NZTkNfTUFDSElORV9CQVNFICAgICAgICAgICAgMAorI2RlZmluZSBBUE1UMl9QRUVSX1BST0JFX1JFUSAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBNVDJfUEVFUl9CRUFDT04gICAgICAgICAgICAgICAxCisjZGVmaW5lIEFQTVQyX01MTUVfU0NBTl9SRVEJCQkJMgorI2RlZmluZSBBUE1UMl9QRUVSX1BST0JFX1JTUAkJCTMKKyNkZWZpbmUgQVBNVDJfU0NBTl9USU1FT1VUCQkJCTQKKyNkZWZpbmUgQVBNVDJfTUxNRV9TQ0FOX0NOQ0wJCQk1CisjZGVmaW5lIEFQX01BWF9TWU5DX01TRyAgICAgICAgICAgICAgICAgNgorCisjZGVmaW5lIEFQX1NZTkNfRlVOQ19TSVpFICAgICAgICAgICAgICAgKEFQX01BWF9TWU5DX1NUQVRFICogQVBfTUFYX1NZTkNfTVNHKQorCisvLworLy8gQVAncyBXUEEgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKKy8vCisjZGVmaW5lIEFQX1dQQV9QVEsgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUF9NQVhfV1BBX1BUS19TVEFURSAgICAgICAgICAgIDEKKworI2RlZmluZSBBUF9XUEFfTUFDSElORV9CQVNFICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBNVDJfRUFQUGFja2V0ICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFQTVQyX0VBUE9MU3RhcnQgICAgICAgICAgICAgICAgMQorI2RlZmluZSBBUE1UMl9FQVBPTExvZ29mZiAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQVBNVDJfRUFQT0xLZXkgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIEFQTVQyX0VBUE9MQVNGQWxlcnQgICAgICAgICAgICAgNAorI2RlZmluZSBBUF9NQVhfV1BBX01TRyAgICAgICAgICAgICAgICAgIDUKKworI2RlZmluZSBBUF9XUEFfRlVOQ19TSVpFICAgICAgICAgICAgICAgIChBUF9NQVhfV1BBX1BUS19TVEFURSAqIEFQX01BWF9XUEFfTVNHKQorCisjaWZkZWYgQVBDTElfU1VQUE9SVAorLy9BcENsaSBhdXRoZW50aWNhdGlvbiBzdGF0ZSBtYWNoaW5lCisjZGVmaW5lIEFQQ0xJX0FVVEhfUkVRX0lETEUgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUENMSV9BVVRIX1dBSVRfU0VRMiAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQVBDTElfQVVUSF9XQUlUX1NFUTQgICAgICAgICAgICAgICAyCisjZGVmaW5lIEFQQ0xJX01BWF9BVVRIX1NUQVRFICAgICAgICAgICAgICAgMworCisjZGVmaW5lIEFQQ0xJX0FVVEhfTUFDSElORV9CQVNFICAgICAgICAgICAgMAorI2RlZmluZSBBUENMSV9NVDJfTUxNRV9BVVRIX1JFUSAgICAgICAgICAgIDAKKyNkZWZpbmUgQVBDTElfTVQyX01MTUVfREVBVVRIX1JFUSAgICAgICAgICAxCisjZGVmaW5lIEFQQ0xJX01UMl9QRUVSX0FVVEhfRVZFTiAgICAgICAgICAgMgorI2RlZmluZSBBUENMSV9NVDJfUEVFUl9ERUFVVEggICAgICAgICAgICAgIDMKKyNkZWZpbmUgQVBDTElfTVQyX0FVVEhfVElNRU9VVCAgICAgICAgICAgICA0CisjZGVmaW5lIEFQQ0xJX01BWF9BVVRIX01TRyAgICAgICAgICAgICAgICAgNQorCisjZGVmaW5lIEFQQ0xJX0FVVEhfRlVOQ19TSVpFICAgICAgICAgICAgICAgKEFQQ0xJX01BWF9BVVRIX1NUQVRFICogQVBDTElfTUFYX0FVVEhfTVNHKQorCisvL0FwQ2xpIGFzc29jaWF0aW9uIHN0YXRlIG1hY2hpbmUKKyNkZWZpbmUgQVBDTElfQVNTT0NfSURMRSAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFQQ0xJX0FTU09DX1dBSVRfUlNQICAgICAgICAgICAgICAgMQorI2RlZmluZSBBUENMSV9NQVhfQVNTT0NfU1RBVEUgICAgICAgICAgICAgIDIKKworI2RlZmluZSBBUENMSV9BU1NPQ19NQUNISU5FX0JBU0UgICAgICAgICAgIDAKKyNkZWZpbmUgQVBDTElfTVQyX01MTUVfQVNTT0NfUkVRICAgICAgICAgICAwCisjZGVmaW5lIEFQQ0xJX01UMl9NTE1FX0RJU0FTU09DX1JFUSAgICAgICAgMQorI2RlZmluZSBBUENMSV9NVDJfUEVFUl9ESVNBU1NPQ19SRVEgICAgICAgIDIKKyNkZWZpbmUgQVBDTElfTVQyX1BFRVJfQVNTT0NfUlNQICAgICAgICAgICAzCisjZGVmaW5lIEFQQ0xJX01UMl9BU1NPQ19USU1FT1VUICAgICAgICAgICAgNAorI2RlZmluZSBBUENMSV9NQVhfQVNTT0NfTVNHICAgICAgICAgICAgICAgIDUKKworI2RlZmluZSBBUENMSV9BU1NPQ19GVU5DX1NJWkUgICAgICAgICAgICAgIChBUENMSV9NQVhfQVNTT0NfU1RBVEUgKiBBUENMSV9NQVhfQVNTT0NfTVNHKQorCisvL0FwQ2xpIHN5bmMgc3RhdGUgbWFjaGluZQorI2RlZmluZSBBUENMSV9TWU5DX0lETEUgICAgICAgICAgICAgICAgICAgMCAgLy8gbWVyZ2UgTk9fQlNTLElCU1NfSURMRSxJQlNTX0FDVElWRSBhbmQgQlNTIGluIHRvIDEgc3RhdGUKKyNkZWZpbmUgQVBDTElfSk9JTl9XQUlUX1BST0JFX1JTUCAgICAgICAgIDEKKyNkZWZpbmUgQVBDTElfTUFYX1NZTkNfU1RBVEUgICAgICAgICAgICAgIDIKKworI2RlZmluZSBBUENMSV9TWU5DX01BQ0hJTkVfQkFTRSAgICAgICAgICAgMAorI2RlZmluZSBBUENMSV9NVDJfTUxNRV9QUk9CRV9SRVEgICAgICAgICAgMAorI2RlZmluZSBBUENMSV9NVDJfUEVFUl9QUk9CRV9SU1AgICAgICAgICAgMQorI2RlZmluZSBBUENMSV9NVDJfUFJPQkVfVElNRU9VVCAgICAgICAgICAgMgorI2RlZmluZSBBUENMSV9NQVhfU1lOQ19NU0cgICAgICAgICAgICAgICAgMworCisjZGVmaW5lIEFQQ0xJX1NZTkNfRlVOQ19TSVpFICAgICAgICAgICAgICAoQVBDTElfTUFYX1NZTkNfU1RBVEUgKiBBUENMSV9NQVhfU1lOQ19NU0cpCisKKy8vQXBDbGkgY3RybCBzdGF0ZSBtYWNoaW5lCisjZGVmaW5lIEFQQ0xJX0NUUkxfRElTQ09OTkVDVEVEICAgICAgICAgICAwICAvLyBtZXJnZSBOT19CU1MsSUJTU19JRExFLElCU1NfQUNUSVZFIGFuZCBCU1MgaW4gdG8gMSBzdGF0ZQorI2RlZmluZSBBUENMSV9DVFJMX1BST0JFICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBBUENMSV9DVFJMX0FVVEggICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBBUENMSV9DVFJMX0FVVEhfMiAgICAgICAgICAgICAgICAgMworI2RlZmluZSBBUENMSV9DVFJMX0FTU09DICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBBUENMSV9DVFJMX0RFQVNTT0MgICAgICAgICAgICAgICAgNQorI2RlZmluZSBBUENMSV9DVFJMX0NPTk5FQ1RFRCAgICAgICAgICAgICAgNgorI2RlZmluZSBBUENMSV9NQVhfQ1RSTF9TVEFURSAgICAgICAgICAgICAgNworCisjZGVmaW5lIEFQQ0xJX0NUUkxfTUFDSElORV9CQVNFICAgICAgICAgICAwCisjZGVmaW5lIEFQQ0xJX0NUUkxfSk9JTl9SRVEgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFQQ0xJX0NUUkxfUFJPQkVfUlNQICAgICAgICAgICAgICAxCisjZGVmaW5lIEFQQ0xJX0NUUkxfQVVUSF9SU1AgICAgICAgICAgICAgICAyCisjZGVmaW5lIEFQQ0xJX0NUUkxfRElTQ09OTkVDVF9SRVEgICAgICAgICAzCisjZGVmaW5lIEFQQ0xJX0NUUkxfUEVFUl9ESVNDT05ORUNUX1JFUSAgICA0CisjZGVmaW5lIEFQQ0xJX0NUUkxfQVNTT0NfUlNQICAgICAgICAgICAgICA1CisjZGVmaW5lIEFQQ0xJX0NUUkxfREVBU1NPQ19SU1AgICAgICAgICAgICA2CisjZGVmaW5lIEFQQ0xJX0NUUkxfSk9JTl9SRVFfVElNRU9VVCAgICAgICA3CisjZGVmaW5lIEFQQ0xJX0NUUkxfQVVUSF9SRVFfVElNRU9VVCAgICAgICA4CisjZGVmaW5lIEFQQ0xJX0NUUkxfQVNTT0NfUkVRX1RJTUVPVVQgICAgICA5CisjZGVmaW5lIEFQQ0xJX01BWF9DVFJMX01TRyAgICAgICAgICAgICAgICAxMAorCisjZGVmaW5lIEFQQ0xJX0NUUkxfRlVOQ19TSVpFICAgICAgICAgICAgICAoQVBDTElfTUFYX0NUUkxfU1RBVEUgKiBBUENMSV9NQVhfQ1RSTF9NU0cpCisKKyNpZiAwCS8vIHJlbW92ZSB0aG9zZSB2YXJpYWJsZXMgYnkgQWxiZXJ0WQorLy8gQXBDbGkgV1BBIHN0YXRlIG1hY2hpbmUKKyNkZWZpbmUgQVBDTElfV1BBX1BTS19JRExFCQkJCTAKKyNkZWZpbmUgQVBDTElfTUFYX1dQQV9QU0tfU1RBVEUJCQkxCisKKy8vIEFwQ2xpIFdQQSBNU0cgVHlwZQorI2RlZmluZSBBUENMSV9XUEFfTUFDSElORV9CQVNFCQkJMAorI2RlZmluZSBBUENMSV9NVDJfRUFQUGFja2V0CQkJCTAKKyNkZWZpbmUgQVBDTElfTVQyX0VBUE9MU3RhcnQJCQkxCisjZGVmaW5lIEFQQ0xJX01UMl9FQVBPTExvZ29mZgkJCTIKKyNkZWZpbmUgQVBDTElfTVQyX0VBUE9MS2V5CQkJCTMKKyNkZWZpbmUgQVBDTElfTVQyX0VBUE9MQVNGQWxlcnQJCQk0CisjZGVmaW5lIEFQQ0xJX01BWF9XUEFfUFNLX01TRwkJCTUKKworI2RlZmluZQlBUENMSV9XUEFfUFNLX0ZVTkNfU0laRQkJCShBUENMSV9NQVhfV1BBX1BTS19TVEFURSAqIEFQQ0xJX01BWF9XUEFfUFNLX01TRykKKyNlbmRpZiAvLyBlbmQgLSAwIC8vCisKKyNlbmRpZgkvLyBBUENMSV9TVVBQT1JUIC8vCisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gdmFsdWUgZG9tYWluIG9mIDgwMi4xMSBoZWFkZXIgRkMuVHl0ZSwgd2hpY2ggaXMgYjMuLmIyIG9mIHRoZSAxc3QtYnl0ZSBvZiBNQUMgaGVhZGVyCisjZGVmaW5lIEJUWVBFX01HTVQgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEJUWVBFX0NOVEwgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEJUWVBFX0RBVEEgICAgICAgICAgICAgICAgICAyCisKKy8vIHZhbHVlIGRvbWFpbiBvZiA4MDIuMTEgTUdNVCBmcmFtZSdzIEZDLnN1YnR5cGUsIHdoaWNoIGlzIGI3Li40IG9mIHRoZSAxc3QtYnl0ZSBvZiBNQUMgaGVhZGVyCisjZGVmaW5lIFNVQlRZUEVfQVNTT0NfUkVRICAgICAgICAgICAwCisjZGVmaW5lIFNVQlRZUEVfQVNTT0NfUlNQICAgICAgICAgICAxCisjZGVmaW5lIFNVQlRZUEVfUkVBU1NPQ19SRVEgICAgICAgICAyCisjZGVmaW5lIFNVQlRZUEVfUkVBU1NPQ19SU1AgICAgICAgICAzCisjZGVmaW5lIFNVQlRZUEVfUFJPQkVfUkVRICAgICAgICAgICA0CisjZGVmaW5lIFNVQlRZUEVfUFJPQkVfUlNQICAgICAgICAgICA1CisjZGVmaW5lIFNVQlRZUEVfQkVBQ09OICAgICAgICAgICAgICA4CisjZGVmaW5lIFNVQlRZUEVfQVRJTSAgICAgICAgICAgICAgICA5CisjZGVmaW5lIFNVQlRZUEVfRElTQVNTT0MgICAgICAgICAgICAxMAorI2RlZmluZSBTVUJUWVBFX0FVVEggICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgU1VCVFlQRV9ERUFVVEggICAgICAgICAgICAgIDEyCisjZGVmaW5lIFNVQlRZUEVfQUNUSU9OICAgICAgICAgICAgICAxMworI2RlZmluZSBTVUJUWVBFX0FDVElPTl9OT19BQ0sgICAgICAgICAgICAgIDE0CisKKy8vIHZhbHVlIGRvbWFpbiBvZiA4MDIuMTEgQ05UTCBmcmFtZSdzIEZDLnN1YnR5cGUsIHdoaWNoIGlzIGI3Li40IG9mIHRoZSAxc3QtYnl0ZSBvZiBNQUMgaGVhZGVyCisjZGVmaW5lIFNVQlRZUEVfV1JBUFBFUiAgICAgICAJNworI2RlZmluZSBTVUJUWVBFX0JMT0NLX0FDS19SRVEgICAgICAgOAorI2RlZmluZSBTVUJUWVBFX0JMT0NLX0FDSyAgICAgICAgICAgOQorI2RlZmluZSBTVUJUWVBFX1BTX1BPTEwgICAgICAgICAgICAgMTAKKyNkZWZpbmUgU1VCVFlQRV9SVFMgICAgICAgICAgICAgICAgIDExCisjZGVmaW5lIFNVQlRZUEVfQ1RTICAgICAgICAgICAgICAgICAxMgorI2RlZmluZSBTVUJUWVBFX0FDSyAgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgU1VCVFlQRV9DRkVORCAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIFNVQlRZUEVfQ0ZFTkRfQ0ZBQ0sgICAgICAgICAxNQorCisvLyB2YWx1ZSBkb21haW4gb2YgODAyLjExIERBVEEgZnJhbWUncyBGQy5zdWJ0eXBlLCB3aGljaCBpcyBiNy4uNCBvZiB0aGUgMXN0LWJ5dGUgb2YgTUFDIGhlYWRlcgorI2RlZmluZSBTVUJUWVBFX0RBVEEgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTVUJUWVBFX0RBVEFfQ0ZBQ0sgICAgICAgICAgMQorI2RlZmluZSBTVUJUWVBFX0RBVEFfQ0ZQT0xMICAgICAgICAgMgorI2RlZmluZSBTVUJUWVBFX0RBVEFfQ0ZBQ0tfQ0ZQT0xMICAgMworI2RlZmluZSBTVUJUWVBFX05VTExfRlVOQyAgICAgICAgICAgNAorI2RlZmluZSBTVUJUWVBFX0NGQUNLICAgICAgICAgICAgICAgNQorI2RlZmluZSBTVUJUWVBFX0NGUE9MTCAgICAgICAgICAgICAgNgorI2RlZmluZSBTVUJUWVBFX0NGQUNLX0NGUE9MTCAgICAgICAgNworI2RlZmluZSBTVUJUWVBFX1FEQVRBICAgICAgICAgICAgICAgOAorI2RlZmluZSBTVUJUWVBFX1FEQVRBX0NGQUNLICAgICAgICAgOQorI2RlZmluZSBTVUJUWVBFX1FEQVRBX0NGUE9MTCAgICAgICAgMTAKKyNkZWZpbmUgU1VCVFlQRV9RREFUQV9DRkFDS19DRlBPTEwgIDExCisjZGVmaW5lIFNVQlRZUEVfUU9TX05VTEwgICAgICAgICAgICAxMgorI2RlZmluZSBTVUJUWVBFX1FPU19DRkFDSyAgICAgICAgICAgMTMKKyNkZWZpbmUgU1VCVFlQRV9RT1NfQ0ZQT0xMICAgICAgICAgIDE0CisjZGVmaW5lIFNVQlRZUEVfUU9TX0NGQUNLX0NGUE9MTCAgICAxNQorCisvLyBBQ0sgcG9saWN5IG9mIFFPUyBDb250cm9sIGZpZWxkIGJpdCA2OjUKKyNkZWZpbmUgTk9STUFMX0FDSyAgICAgICAgICAgICAgICAgIDB4MDAgIC8vIGI2OjUgPSAwMAorI2RlZmluZSBOT19BQ0sgICAgICAgICAgICAgICAgICAgICAgMHgyMCAgLy8gYjY6NSA9IDAxCisjZGVmaW5lIE5PX0VYUExJQ0lUX0FDSyAgICAgICAgICAgICAweDQwICAvLyBiNjo1ID0gMTAKKyNkZWZpbmUgQkxPQ0tfQUNLICAgICAgICAgICAgICAgICAgIDB4NjAgIC8vIGI2OjUgPSAxMQorCisvLworLy8gcnRtcF9kYXRhLmMgdXNlIHRoZXNlIGRlZmluaXRpb24KKy8vCisjZGVmaW5lIExFTkdUSF84MDJfMTEgICAgICAgICAgICAgICAyNAorI2RlZmluZSBMRU5HVEhfODAyXzExX0FORF9IICAgICAgICAgMzAKKyNkZWZpbmUgTEVOR1RIXzgwMl8xMV9DUkNfSCAgICAgICAgIDM0CisjZGVmaW5lIExFTkdUSF84MDJfMTFfQ1JDICAgICAgICAgICAyOAorI2RlZmluZSBMRU5HVEhfODAyXzExX1dJVEhfQUREUjQgICAgMzAKKyNkZWZpbmUgTEVOR1RIXzgwMl8zICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIExFTkdUSF84MDJfM19UWVBFICAgICAgICAgICAyCisjZGVmaW5lIExFTkdUSF84MDJfMV9IICAgICAgICAgICAgICA4CisjZGVmaW5lIExFTkdUSF9FQVBPTF9IICAgICAgICAgICAgICA0CisjZGVmaW5lIExFTkdUSF9XTU1RT1NfSAkJCQkyCisjZGVmaW5lIExFTkdUSF9DUkMgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIE1BWF9TRVFfTlVNQkVSICAgICAgICAgICAgICAweDBmZmYKKyNkZWZpbmUgTEVOR1RIXzgwMl8zX05PX1RZUEUJCTEyCisjZGVmaW5lIExFTkdUSF84MDJfMVEJCQkJNCAvKiBWTEFOIHJlbGF0ZWQgKi8KKworLy8gU1RBX0NTUjQuZmllbGQuVHhSZXN1bHQKKyNkZWZpbmUgVFhfUkVTVUxUX1NVQ0NFU1MgICAgICAgICAgIDAKKyNkZWZpbmUgVFhfUkVTVUxUX1pFUk9fTEVOR1RIICAgICAgIDEKKyNkZWZpbmUgVFhfUkVTVUxUX1VOREVSX1JVTiAgICAgICAgIDIKKyNkZWZpbmUgVFhfUkVTVUxUX09IWV9FUlJPUiAgICAgICAgIDQKKyNkZWZpbmUgVFhfUkVTVUxUX1JFVFJZX0ZBSUwgICAgICAgIDYKKworLy8gQWxsIFBIWSByYXRlIHN1bW1hcnkgaW4gVFhECisvLyBQcmVhbWJsZSBNT0RFIGluIFR4RAorI2RlZmluZSBNT0RFX0NDSwkwCisjZGVmaW5lIE1PREVfT0ZETSAgIDEKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyNkZWZpbmUgTU9ERV9IVE1JWAkyCisjZGVmaW5lIE1PREVfSFRHUkVFTkZJRUxECTMKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKy8vIE1DUyBmb3IgQ0NLLiAgQlcuU0dJLlNUQkMgYXJlIHJlc2VydmVkCisjZGVmaW5lIE1DU19MT05HUF9SQVRFXzEgICAgICAgICAgICAgICAgICAgICAgMAkgLy8gbG9uZyBwcmVhbWJsZSBDQ0sgMU1icHMKKyNkZWZpbmUgTUNTX0xPTkdQX1JBVEVfMiAgICAgICAgICAgICAgICAgICAgICAxCS8vIGxvbmcgcHJlYW1ibGUgQ0NLIDFNYnBzCisjZGVmaW5lIE1DU19MT05HUF9SQVRFXzVfNSAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBNQ1NfTE9OR1BfUkFURV8xMSAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgTUNTX1NIT1JUUF9SQVRFXzEgICAgICAgICAgICAgICAgICAgICAgNAkgLy8gbG9uZyBwcmVhbWJsZSBDQ0sgMU1icHMuIHNob3J0IGlzIGZvcmJpZGRlbiBpbiAxTWJwcworI2RlZmluZSBNQ1NfU0hPUlRQX1JBVEVfMiAgICAgICAgICAgICAgICAgICAgICA1CS8vIHNob3J0IHByZWFtYmxlIENDSyAyTWJwcworI2RlZmluZSBNQ1NfU0hPUlRQX1JBVEVfNV81ICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIE1DU19TSE9SVFBfUkFURV8xMSAgICAgICAgICAgICAgICAgICAgIDcKKy8vIFRvIHNlbmQgZHVwbGljYXRlIGxlZ2FjeSBPRkRNLiBzZXQgQlc9QldfNDAuICBTR0kuU1RCQyBhcmUgcmVzZXJ2ZWQKKyNkZWZpbmUgTUNTX1JBVEVfNiAgICAgICAgICAgICAgICAgICAgICAwICAgLy8gbGVnYWN5IE9GRE0KKyNkZWZpbmUgTUNTX1JBVEVfOSAgICAgICAgICAgICAgICAgICAgICAxICAgLy8gT0ZETQorI2RlZmluZSBNQ1NfUkFURV8xMiAgICAgICAgICAgICAgICAgICAgIDIgICAvLyBPRkRNCisjZGVmaW5lIE1DU19SQVRFXzE4ICAgICAgICAgICAgICAgICAgICAgMyAgIC8vIE9GRE0KKyNkZWZpbmUgTUNTX1JBVEVfMjQgICAgICAgICAgICAgICAgICAgICA0ICAvLyBPRkRNCisjZGVmaW5lIE1DU19SQVRFXzM2ICAgICAgICAgICAgICAgICAgICAgNSAgIC8vIE9GRE0KKyNkZWZpbmUgTUNTX1JBVEVfNDggICAgICAgICAgICAgICAgICAgICA2ICAvLyBPRkRNCisjZGVmaW5lIE1DU19SQVRFXzU0ICAgICAgICAgICAgICAgICAgICAgNyAvLyBPRkRNCisvLyBIVAorI2RlZmluZSBNQ1NfMAkJMAkvLyAxUworI2RlZmluZSBNQ1NfMQkJMQorI2RlZmluZSBNQ1NfMgkJMgorI2RlZmluZSBNQ1NfMwkJMworI2RlZmluZSBNQ1NfNAkJNAorI2RlZmluZSBNQ1NfNQkJNQorI2RlZmluZSBNQ1NfNgkJNgorI2RlZmluZSBNQ1NfNwkJNworI2RlZmluZSBNQ1NfOAkJOAkvLyAyUworI2RlZmluZSBNQ1NfOQkJOQorI2RlZmluZSBNQ1NfMTAJCTEwCisjZGVmaW5lIE1DU18xMQkJMTEKKyNkZWZpbmUgTUNTXzEyCQkxMgorI2RlZmluZSBNQ1NfMTMJCTEzCisjZGVmaW5lIE1DU18xNAkJMTQKKyNkZWZpbmUgTUNTXzE1CQkxNQorI2RlZmluZSBNQ1NfMTYJCTE2CS8vIDMqMworI2RlZmluZSBNQ1NfMTcJCTE3CisjZGVmaW5lIE1DU18xOAkJMTgKKyNkZWZpbmUgTUNTXzE5CQkxOQorI2RlZmluZSBNQ1NfMjAJCTIwCisjZGVmaW5lIE1DU18yMQkJMjEKKyNkZWZpbmUgTUNTXzIyCQkyMgorI2RlZmluZSBNQ1NfMjMJCTIzCisjZGVmaW5lIE1DU18zMgkJMzIKKyNkZWZpbmUgTUNTX0FVVE8JCTMzCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKy8vIE9JRF9IVFBIWU1PREUKKy8vIE1PREUKKyNkZWZpbmUgSFRNT0RFX01NCTAKKyNkZWZpbmUgSFRNT0RFX0dGCTEKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworLy8gRml4ZWQgVHggTU9ERSAtIEhULCBDQ0sgb3IgT0ZETQorI2RlZmluZSBGSVhFRF9UWE1PREVfSFQJCTAKKyNkZWZpbmUgRklYRURfVFhNT0RFX0NDSwkxCisjZGVmaW5lIEZJWEVEX1RYTU9ERV9PRkRNIAkyCisvLyBCVworI2RlZmluZSBCV18yMAkJQkFORF9XSURUSF8yMAorI2RlZmluZSBCV180MAkJQkFORF9XSURUSF80MAorI2RlZmluZSBCV19CT1RICQlCQU5EX1dJRFRIX0JPVEgKKyNkZWZpbmUgQldfMTAJCUJBTkRfV0lEVEhfMTAJLy8gODAyLjExaiBoYXMgMTBNSHouIFRoaXMgZGVmaW5pdGlvbiBpcyBmb3IgaW50ZXJuYWwgdXNhZ2UuIGRvZXNuJ3QgZmlsbCBpbiB0aGUgSUUgb3Igb3RoZXIgZmllbGQuCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKy8vIFNIT1JUR0kKKyNkZWZpbmUgR0lfNDAwCQlHQVBfSU5URVJWQUxfNDAwCS8vIG9ubHkgc3VwcG9ydCBpbiBIVCBtb2RlCisjZGVmaW5lIEdJX0JPVEgJCUdBUF9JTlRFUlZBTF9CT1RICisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisjZGVmaW5lIEdJXzgwMAkJR0FQX0lOVEVSVkFMXzgwMAorLy8gU1RCQworI2RlZmluZSBTVEJDX05PTkUJMAorI2lmZGVmIERPVDExX05fU1VQUE9SVAorI2RlZmluZSBTVEJDX1VTRQkxCS8vIGxpbWl0ZWQgdXNlIGluIHJ0Mjg2MGIgcGh5CisjZGVmaW5lIFJYU1RCQ19PTkUJMQkvLyByeCBzdXBwb3J0IG9mIG9uZSBzcGF0aWFsIHN0cmVhbQorI2RlZmluZSBSWFNUQkNfVFdPCTIJLy8gcnggc3VwcG9ydCBvZiAxIGFuZCAyIHNwYXRpYWwgc3RyZWFtCisjZGVmaW5lIFJYU1RCQ19USFIJMwkvLyByeCBzdXBwb3J0IG9mIDF+MyBzcGF0aWFsIHN0cmVhbQorLy8gTUNTIEZFRURCQUNLCisjZGVmaW5lIE1DU0ZCS19OT05FCTAgIC8vIG5vdCBzdXBwb3J0IG1jcyBmZWVkYmFjayAvCisjZGVmaW5lIE1DU0ZCS19SU1YJMQkvLyByZXNlcnZlZAorI2RlZmluZSBNQ1NGQktfVU5TT0xJQ0lUCTIJLy8gb25seSBzdXBwb3J0IHVuc29saWN0IG1jcyBmZWVkYmFjaworI2RlZmluZSBNQ1NGQktfTVJRCTMJLy8gcmVzcG9uc2UgdG8gYm90aCBNUlEgYW5kIHVuc29saWN0IG1jcyBmZWVkYmFjaworCisvLyBNSU1PIHBvd2VyIHNhZmUKKyNkZWZpbmUJTU1QU19TVEFUSUMJMAorI2RlZmluZQlNTVBTX0RZTkFNSUMJCTEKKyNkZWZpbmUgICBNTVBTX1JTVgkJMgorI2RlZmluZSBNTVBTX0VOQUJMRQkJMworCisKKy8vIEEtTVNEVSBzaXplCisjZGVmaW5lCUFNU0RVXzAJMAorI2RlZmluZQlBTVNEVV8xCQkxCisKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworLy8gTUNTIHVzZSA3IGJpdHMKKyNkZWZpbmUgVFhSQVRFTUlNTwkJMHg4MAorI2RlZmluZSBUWFJBVEVNQ1MJCTB4N0YKKyNkZWZpbmUgVFhSQVRFT0ZETQkJMHg3RgorI2RlZmluZSBSQVRFXzEgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBSQVRFXzIgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBSQVRFXzVfNSAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBSQVRFXzExICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBSQVRFXzYgICAgICAgICAgICAgICAgICAgICAgNCAgIC8vIE9GRE0KKyNkZWZpbmUgUkFURV85ICAgICAgICAgICAgICAgICAgICAgIDUgICAvLyBPRkRNCisjZGVmaW5lIFJBVEVfMTIgICAgICAgICAgICAgICAgICAgICA2ICAgLy8gT0ZETQorI2RlZmluZSBSQVRFXzE4ICAgICAgICAgICAgICAgICAgICAgNyAgIC8vIE9GRE0KKyNkZWZpbmUgUkFURV8yNCAgICAgICAgICAgICAgICAgICAgIDggICAvLyBPRkRNCisjZGVmaW5lIFJBVEVfMzYgICAgICAgICAgICAgICAgICAgICA5ICAgLy8gT0ZETQorI2RlZmluZSBSQVRFXzQ4ICAgICAgICAgICAgICAgICAgICAgMTAgIC8vIE9GRE0KKyNkZWZpbmUgUkFURV81NCAgICAgICAgICAgICAgICAgICAgIDExICAvLyBPRkRNCisjZGVmaW5lIFJBVEVfRklSU1RfT0ZETV9SQVRFICAgICAgICBSQVRFXzYKKyNkZWZpbmUgUkFURV9MQVNUX09GRE1fUkFURSAgICAgICAgCVJBVEVfNTQKKyNkZWZpbmUgUkFURV82XzUgICAgICAgICAgICAgICAgICAgIDEyICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV8xMyAgICAgICAgICAgICAgICAgICAgIDEzICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV8xOV81ICAgICAgICAgICAgICAgICAgIDE0ICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV8yNiAgICAgICAgICAgICAgICAgICAgIDE1ICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV8zOSAgICAgICAgICAgICAgICAgICAgIDE2ICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV81MiAgICAgICAgICAgICAgICAgICAgIDE3ICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV81OF81ICAgICAgICAgICAgICAgICAgIDE4ICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV82NSAgICAgICAgICAgICAgICAgICAgIDE5ICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV83OCAgICAgICAgICAgICAgICAgICAgIDIwICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV8xMDQgICAgICAgICAgICAgICAgICAgIDIxICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV8xMTcgICAgICAgICAgICAgICAgICAgIDIyICAvLyBIVCBtaXgKKyNkZWZpbmUgUkFURV8xMzAgICAgICAgICAgICAgICAgICAgIDIzICAvLyBIVCBtaXgKKy8vI2RlZmluZSBSQVRFX0FVVE9fU1dJVENIICAgICAgICAgICAgMjU1IC8vIGZvciBTdGFDZmcuRml4ZWRUeFJhdGUgb25seQorI2RlZmluZSBIVFJBVEVfMCAgICAgICAgICAgICAgICAgICAgICAxMgorI2RlZmluZSBSQVRFX0ZJUlNUX01NX1JBVEUgICAgICAgIEhUUkFURV8wCisjZGVmaW5lIFJBVEVfRklSU1RfSFRfUkFURSAgICAgICAgSFRSQVRFXzAKKyNkZWZpbmUgUkFURV9MQVNUX0hUX1JBVEUgICAgICAgIEhUUkFURV8wCisKKy8vIHBUeFdJLT50eG9wCisjZGVmaW5lIElGU19IVFRYT1AgICAgICAgICAgICAgICAgIDAJLy8gVGhlIHR4b3Agd2lsbCBiZSBoYW5kbGVzIGJ5IEFTSUMuCisjZGVmaW5lIElGU19QSUZTICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElGU19TSUZTICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIElGU19CQUNLT0ZGICAgICAgICAgICAgICAgICAzCisKKy8vIHBUeEQtPlJldHJ5TW9kZQorI2RlZmluZSBMT05HX1JFVFJZICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBTSE9SVF9SRVRSWSAgICAgICAgICAgICAgICAgMAorCisvLyBDb3VudHJ5IFJlZ2lvbiBkZWZpbml0aW9uCisjZGVmaW5lIFJFR0lPTl9NSU5JTVVNX0JHX0JBTkQgICAgICAgICAgICAwCisjZGVmaW5lIFJFR0lPTl8wX0JHX0JBTkQgICAgICAgICAgICAgICAgICAwICAgICAgIC8vIDEtMTEKKyNkZWZpbmUgUkVHSU9OXzFfQkdfQkFORCAgICAgICAgICAgICAgICAgIDEgICAgICAgLy8gMS0xMworI2RlZmluZSBSRUdJT05fMl9CR19CQU5EICAgICAgICAgICAgICAgICAgMiAgICAgICAvLyAxMC0xMQorI2RlZmluZSBSRUdJT05fM19CR19CQU5EICAgICAgICAgICAgICAgICAgMyAgICAgICAvLyAxMC0xMworI2RlZmluZSBSRUdJT05fNF9CR19CQU5EICAgICAgICAgICAgICAgICAgNCAgICAgICAvLyAxNAorI2RlZmluZSBSRUdJT05fNV9CR19CQU5EICAgICAgICAgICAgICAgICAgNSAgICAgICAvLyAxLTE0CisjZGVmaW5lIFJFR0lPTl82X0JHX0JBTkQgICAgICAgICAgICAgICAgICA2ICAgICAgIC8vIDMtOQorI2RlZmluZSBSRUdJT05fN19CR19CQU5EICAgICAgICAgICAgICAgICAgNyAgICAgICAvLyA1LTEzCisjZGVmaW5lIFJFR0lPTl8zMV9CR19CQU5EICAgICAgICAgICAgICAgICAzMSAgICAgICAvLyA1LTEzCisjZGVmaW5lIFJFR0lPTl9NQVhJTVVNX0JHX0JBTkQgICAgICAgICAgICA3CisKKyNkZWZpbmUgUkVHSU9OX01JTklNVU1fQV9CQU5EICAgICAgICAgICAgIDAKKyNkZWZpbmUgUkVHSU9OXzBfQV9CQU5EICAgICAgICAgICAgICAgICAgIDAgICAgICAgLy8gMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NQorI2RlZmluZSBSRUdJT05fMV9BX0JBTkQgICAgICAgICAgICAgICAgICAgMSAgICAgICAvLyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwCisjZGVmaW5lIFJFR0lPTl8yX0FfQkFORCAgICAgICAgICAgICAgICAgICAyICAgICAgIC8vIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NAorI2RlZmluZSBSRUdJT05fM19BX0JBTkQgICAgICAgICAgICAgICAgICAgMyAgICAgICAvLyA1MiwgNTYsIDYwLCA2NCwgMTQ5LCAxNTMsIDE1NywgMTYxCisjZGVmaW5lIFJFR0lPTl80X0FfQkFORCAgICAgICAgICAgICAgICAgICA0ICAgICAgIC8vIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1CisjZGVmaW5lIFJFR0lPTl81X0FfQkFORCAgICAgICAgICAgICAgICAgICA1ICAgICAgIC8vIDE0OSwgMTUzLCAxNTcsIDE2MQorI2RlZmluZSBSRUdJT05fNl9BX0JBTkQgICAgICAgICAgICAgICAgICAgNiAgICAgICAvLyAzNiwgNDAsIDQ0LCA0OAorI2RlZmluZSBSRUdJT05fN19BX0JBTkQgICAgICAgICAgICAgICAgICAgNyAgICAgICAvLyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwLCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NQorI2RlZmluZSBSRUdJT05fOF9BX0JBTkQgICAgICAgICAgICAgICAgICAgOCAgICAgICAvLyA1MiwgNTYsIDYwLCA2NAorI2RlZmluZSBSRUdJT05fOV9BX0JBTkQgICAgICAgICAgICAgICAgICAgOSAgICAgICAvLyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMzIsIDEzNiwgMTQwLCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NQorI2RlZmluZSBSRUdJT05fMTBfQV9CQU5EICAgICAgICAgICAgICAgICAgMTAJICAvLyAzNiwgNDAsIDQ0LCA0OCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUKKyNkZWZpbmUgUkVHSU9OXzExX0FfQkFORCAgICAgICAgICAgICAgICAgIDExCSAgLy8gMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxNDksIDE1MywgMTU3LCAxNjEKKyNkZWZpbmUgUkVHSU9OX01BWElNVU1fQV9CQU5EICAgICAgICAgICAgIDExCisKKy8vIHBUeEQtPkNpcGhlckFsZworI2RlZmluZSBDSVBIRVJfTk9ORSAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDSVBIRVJfV0VQNjQgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDSVBIRVJfV0VQMTI4ICAgICAgICAgICAgICAgMgorI2RlZmluZSBDSVBIRVJfVEtJUCAgICAgICAgICAgICAgICAgMworI2RlZmluZSBDSVBIRVJfQUVTICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBDSVBIRVJfQ0tJUDY0ICAgICAgICAgICAgICAgNQorI2RlZmluZSBDSVBIRVJfQ0tJUDEyOCAgICAgICAgICAgICAgNgorI2RlZmluZSBDSVBIRVJfVEtJUF9OT19NSUMgICAgICAgICAgNyAgICAgICAvLyBNSUMgYXBwZW5kZWQgYnkgZHJpdmVyOiBub3QgYSB2YWxpZCB2YWx1ZSBpbiBoYXJkd2FyZSBrZXkgdGFibGUKKyNkZWZpbmUgQ0lQSEVSX1NNUzQJCQkJCTgKKworLy8gdmFsdWUgZG9tYWluIG9mIHBBZC0+UmZJY1R5cGUKKyNkZWZpbmUgUkZJQ18yODIwICAgICAgICAgICAgICAgICAgIDEgICAgICAgLy8gMi40RyAyVDNSCisjZGVmaW5lIFJGSUNfMjg1MCAgICAgICAgICAgICAgICAgICAyICAgICAgIC8vIDIuNEcvNUcgMlQzUgorI2RlZmluZSBSRklDXzI3MjAgICAgICAgICAgICAgICAgICAgMyAgICAgICAvLyAyLjRHIDFUMlIKKyNkZWZpbmUgUkZJQ18yNzUwICAgICAgICAgICAgICAgICAgIDQgICAgICAgLy8gMi40Ry81RyAxVDJSCisjZGVmaW5lIFJGSUNfMzAyMCAgICAgICAgICAgICAgICAgICA1ICAgICAgIC8vIDIuNEcgMVQxUgorI2RlZmluZSBSRklDXzIwMjAgICAgICAgICAgICAgICAgICAgNiAgICAgICAvLyAyLjRHIEIvRworCisvLyBMRUQgU3RhdHVzLgorI2RlZmluZSBMRURfTElOS19ET1dOICAgICAgICAgICAgICAgMAorI2RlZmluZSBMRURfTElOS19VUCAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBMRURfUkFESU9fT0ZGICAgICAgICAgICAgICAgMgorI2RlZmluZSBMRURfUkFESU9fT04gICAgICAgICAgICAgICAgMworI2RlZmluZSBMRURfSEFMVCAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBMRURfV1BTICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBMRURfT05fU0lURV9TVVJWRVkgICAgICAgICAgNgorI2RlZmluZSBMRURfUE9XRVJfVVAgICAgICAgICAgICAgICAgNworCisvLyB2YWx1ZSBkb21haW4gb2YgcEFkLT5MZWRDbnRsLkxlZE1vZGUgYW5kIEUyUFJPTQorI2RlZmluZSBMRURfTU9ERV9ERUZBVUxUICAgICAgICAgICAgMAorI2RlZmluZSBMRURfTU9ERV9UV09fTEVECQkJMQorI2RlZmluZSBMRURfTU9ERV9TSUdOQUxfU1RSRUdUSAkJOCAgLy8gRUVQUk9NIGRlZmluZSA9OAorCisvLyBSQzQgaW5pdCB2YWx1ZSwgdXNlZCBmcm8gV0VQICYgVEtJUAorI2RlZmluZSBQUFBJTklURkNTMzIgICAgICAgICAgICAgICAgMHhmZmZmZmZmZiAgIC8qIEluaXRpYWwgRkNTIHZhbHVlICovCisKKy8vIHZhbHVlIGRvbWFpbiBvZiBwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZC4gODAyLjFYIGNvbnRyb2xsZWQgcG9ydCBkZWZpbml0aW9uCisjZGVmaW5lIFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEICAgICAxCisjZGVmaW5lIFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCAyCisKKyNkZWZpbmUgUEFJUldJU0VfS0VZICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1JPVVBfS0VZICAgICAgICAgICAgICAgICAgIDIKKworLy9kZWZpbml0aW9uIG9mIERSUworI2RlZmluZSBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSAkzMgorCisKKy8vIHByZS1hbGxvY2F0ZWQgZnJlZSBORElTIFBBQ0tFVC9CVUZGRVIgcG9sbCBmb3IgaW50ZXJuYWwgdXNhZ2UKKyNkZWZpbmUgTUFYX05VTV9PRl9GUkVFX05ESVNfUEFDS0VUIDEyOAorCisvL0Jsb2NrIEFDSworI2RlZmluZSBNQVhfVFhfUkVPUkRFUkJVRiAgIDY0CisjZGVmaW5lIE1BWF9SWF9SRU9SREVSQlVGICAgNjQKKyNkZWZpbmUgREVGQVVMVF9UWF9USU1FT1VUICAgMzAKKyNkZWZpbmUgREVGQVVMVF9SWF9USU1FT1VUICAgMzAKKworLy8gZGVmaW5pdGlvbiBvZiBSZWNpcGllbnQgb3IgT3JpZ2luYXRvcgorI2RlZmluZSBJX1JFQ0lQSUVOVCAgICAgICAgICAgICAgICAgIFRSVUUKKyNkZWZpbmUgSV9PUklHSU5BVE9SICAgICAgICAgICAgICAgICAgIEZBTFNFCisKKyNkZWZpbmUgREVGQVVMVF9CQlBfVFhfUE9XRVIgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9SRl9UWF9QT1dFUiAgICAgICAgIDUKKworI2RlZmluZSBNQVhfSU5JX0JVRkZFUl9TSVpFCQkJNDA5NgorI2RlZmluZSBNQVhfUEFSQU1fQlVGRkVSX1NJWkUJCSgyMDQ4KSAvLyBlbm91Z2ggZm9yIEFDTCAoMTgqNjQpCisJCQkJCQkJCQkJCS8vMTggOiB0aGUgbGVuZ3RoIG9mIE1hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0ICIwMTowMjowMzowNDowNTowNjsiKQorCQkJCQkJCQkJCQkvLzY0IDogTUFYX05VTV9PRl9BQ0xfTElTVAorLy8gZGVmaW5pdGlvbiBvZiBwQWQtPk9wTW9kZQorI2RlZmluZSBPUE1PREVfU1RBICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBPUE1PREVfQVAgICAgICAgICAgICAgICAgICAgMQorLy8jZGVmaW5lIE9QTU9ERV9MM19CUkcgICAgICAgICAgICAgICAyICAgICAgIC8vIGFzIEFQIGFuZCBTVEEgYXQgdGhlIHNhbWUgdGltZQorCisjaWZkZWYgUlRfQklHX0VORElBTgorI2RlZmluZSBESVJfUkVBRCAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBESVJfV1JJVEUgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBUWVBFX1RYRCAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBUWVBFX1JYRCAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBUWVBFX1RYSU5GTwkJCQkJMAorI2RlZmluZSBUWVBFX1JYSU5GTwkJCQkJMQorI2RlZmluZSBUWVBFX1RYV0kJCQkJCTAKKyNkZWZpbmUgVFlQRV9SWFdJCQkJCQkxCisjZW5kaWYKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBBUCBydG1wX2RlZi5oID09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gdmFsdWUgZG9tYWluIGZvciBwQWQtPkV2ZW50VGFiLkxvZ1tdLkV2ZW50CisjZGVmaW5lIEVWRU5UX1JFU0VUX0FDQ0VTU19QT0lOVCAgICAwIC8vIExvZyA9ICJoaDptbTpzcyAgIFJlc3RhcnQgQWNjZXNzIFBvaW50IgorI2RlZmluZSBFVkVOVF9BU1NPQ0lBVEVEICAgICAgICAgICAgMSAvLyBMb2cgPSAiaGg6bW06c3MgICBTVEEgMDA6MDE6MDI6MDM6MDQ6MDUgYXNzb2NpYXRlZCIKKyNkZWZpbmUgRVZFTlRfRElTQVNTT0NJQVRFRCAgICAgICAgIDIgLy8gTG9nID0gImhoOm1tOnNzICAgU1RBIDAwOjAxOjAyOjAzOjA0OjA1IGxlZnQgdGhpcyBCU1MiCisjZGVmaW5lIEVWRU5UX0FHRURfT1VUICAgICAgICAgICAgICAzIC8vIExvZyA9ICJoaDptbTpzcyAgIFNUQSAwMDowMTowMjowMzowNDowNSB3YXMgYWdlZC1vdXQgYW5kIHJlbW92ZWQgZnJvbSB0aGlzIEJTUyIKKyNkZWZpbmUgRVZFTlRfQ09VTlRFUl9NICAgICAgICAgICAgIDQKKyNkZWZpbmUgRVZFTlRfSU5WQUxJRF9QU0sgICAgICAgICAgIDUKKyNkZWZpbmUgRVZFTlRfTUFYX0VWRU5UX1RZUEUgICAgICAgIDYKKy8vID09PT0gZW5kIG9mIEFQIHJ0bXBfZGVmLmggPT09PT09PT09PT09CisKKy8vIGRlZmluaXRpb24gUlNTSSBOdW1iZXIKKyNkZWZpbmUgUlNTSV8wCQkJCQkwCisjZGVmaW5lIFJTU0lfMQkJCQkJMQorI2RlZmluZSBSU1NJXzIJCQkJCTIKKworLy8gZGVmaW5pdGlvbiBvZiByYWRhciBkZXRlY3Rpb24KKyNkZWZpbmUgUkRfTk9STUFMX01PREUJCQkJMAkvLyBOb3QgZm91bmQgcmFkYXIgc2lnbmFsCisjZGVmaW5lIFJEX1NXSVRDSElOR19NT0RFCQkJMQkvLyBGb3VuZCByYWRhciBzaWduYWwsIGFuZCBkb2luZyBjaGFubmVsIHN3aXRjaAorI2RlZmluZSBSRF9TSUxFTkNFX01PREUJCQkJMgkvLyBBZnRlciBjaGFubmVsIHN3aXRjaCwgbmVlZCB0byBiZSBzaWxlbmNlIGEgd2hpbGUgdG8gZW5zdXJlIHJhZGFyIG5vdCBmb3VuZAorCisvL0RyaXZlciBkZWZpbmVkIGNpZCBmb3IgbWFwcGluZyBzdGF0dXMgYW5kIGNvbW1hbmQuCisjZGVmaW5lICBTTEVFUENJRAkweDExCisjZGVmaW5lICBXQUtFQ0lECTB4MjIKKyNkZWZpbmUgIFFVRVJZUE9XRVJDSUQJMHgzMworI2RlZmluZSAgT1dORVJNQ1UJMHgxCisjZGVmaW5lICBPV05FUkNQVQkweDAKKworLy8gTUJTU0lEIGRlZmluaXRpb24KKyNkZWZpbmUgRU5UUllfTk9UX0ZPVU5EICAgICAgICAgICAgIDB4RkYKKworCisvKiBBZnRlciBMaW51eCAyLjYuOSwKKyAqIFZMQU4gbW9kdWxlIHVzZSBQcml2YXRlIChmcm9tIHVzZXIpIGludGVyZmFjZSBmbGFncyAobmV0ZGV2aWNlLT5wcml2X2ZsYWdzKS4KKyAqICNkZWZpbmUgSUZGXzgwMl8xUV9WTEFOIDB4MSAgICAgICAgIC0tICAgIDgwMi4xUSBWTEFOIGRldmljZS4gIGluIGlmLmgKKyAqIHJlZiB0byBpcF9zYWJvdGFnZV9vdXQoKSBbIG91dC0+cHJpdl9mbGFncyAmIElGRl84MDJfMVFfVkxBTiBdIGluIGJyX25ldGZpbHRlci5jCisgKgorICogRm9yIHRoaXMgcmVhc29uLCB3ZSBNVVNUIHVzZSBFVkVOIHZhbHVlIGluIHByaXZfZmxhZ3MKKyAqLworI2RlZmluZSBJTlRfTUFJTiAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIElOVF9NQlNTSUQgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgSU5UX1dEUyAgICAgICAgICAgICAgICAgICAgIDB4MDMwMAorI2RlZmluZSBJTlRfQVBDTEkgICAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIElOVF9NRVNIICAgICAgICAgICAgICAgICAgIAkweDA1MDAKKworLy8gVXNlIGJpdG1hcCB0byBhbGxvdyBjb2V4aXN0IG9mIEFURV9UWEZSQU1FIGFuZCBBVEVfUlhGUkFNRShpLmUuLHRvIHN1cHBvcnQgTG9vcEJhY2sgbW9kZSkKKyNpZmRlZiBSQUxJTktfQVRFCisjZGVmaW5lCUFURV9TVEFSVCAgICAgICAgICAgICAgICAgICAweDAwICAgLy8gU3RhcnQgQVRFCisjZGVmaW5lCUFURV9TVE9QICAgICAgICAgICAgICAgICAgICAweDgwICAgLy8gU3RvcCBBVEUKKyNkZWZpbmUJQVRFX1RYQ09OVCAgICAgICAgICAgICAgICAgIDB4MDUgICAvLyBDb250aW51b3VzIFRyYW5zbWl0CisjZGVmaW5lCUFURV9UWENBUlIgICAgICAgICAgICAgICAgICAweDA5ICAgLy8gVHJhbnNtaXQgQ2FycmllcgorI2RlZmluZQlBVEVfVFhDQVJSU1VQUCAgICAgICAgICAgICAgMHgxMSAgIC8vIFRyYW5zbWl0IENhcnJpZXIgU3VwcHJlc3Npb24KKyNkZWZpbmUJQVRFX1RYRlJBTUUgICAgICAgICAgICAgICAgIDB4MDEgICAvLyBUcmFuc21pdCBGcmFtZXMKKyNkZWZpbmUJQVRFX1JYRlJBTUUgICAgICAgICAgICAgICAgIDB4MDIgICAvLyBSZWNlaXZlIEZyYW1lcworI2lmZGVmIFJBTElOS18yOHh4X1FBCisjZGVmaW5lIEFURV9UWFNUT1AgICAgICAgICAgICAgICAgICAweGUyICAgLy8gU3RvcCBUcmFuc21pdGlvbihpLmUuLCBUWENPTlQsIFRYQ0FSUiwgVFhDQVJSU1VQUCwgYW5kIFRYRlJBTUUpCisjZGVmaW5lIEFURV9SWFNUT1AJCQkJCTB4ZmQgICAvLyBTdG9wIHJlY2VpdmluZyBGcmFtZXMKKyNkZWZpbmUJQkJQMjJfVFhGUkFNRSAgICAgCQkJMHgwMCAgIC8vIFRyYW5zbWl0IEZyYW1lcworI2RlZmluZQlCQlAyMl9UWENPTlRfT1JfQ0FSUlNVUFAgICAgMHg4MCAgIC8vIENvbnRpbnVvdXMgVHJhbnNtaXQgb3IgQ2FycmllciBTdXBwcmVzc2lvbgorI2RlZmluZQlCQlAyMl9UWENBUlIgICAgICAgICAgICAgICAgMHhjMSAgIC8vIFRyYW5zbWl0IENhcnJpZXIKKyNkZWZpbmUJQkJQMjRfVFhDT05UICAgICAgICAgICAgICAgIDB4MDAgICAvLyBDb250aW51b3VzIFRyYW5zbWl0CisjZGVmaW5lCUJCUDI0X0NBUlJTVVBQICAgICAgICAgICAgICAweDAxICAgLy8gQ2FycmllciBTdXBwcmVzc2lvbgorI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisvLyBXRVAgS2V5IFRZUEUKKyNkZWZpbmUgV0VQX0hFWEFERUNJTUFMX1RZUEUgICAgMAorI2RlZmluZSBXRVBfQVNDSUlfVFlQRSAgICAgICAgICAxCisKKworCisvLyBXSVJFTEVTUyBFVkVOVFMgZGVmaW5pdGlvbgorLyogTWF4IG51bWJlciBvZiBjaGFyIGluIGN1c3RvbSBldmVudCwgcmVmZXIgdG8gd2lyZWxlc3NfdG9vbHMuMjgvd2lyZWxlc3MuMjAuaCAqLworI2RlZmluZSBJV19DVVNUT01fTUFYX0xFTgkJCQkgIAkJCTI1NQkvKiBJbiBieXRlcyAqLworCisvLyBGb3Igc3lzdGVtIGV2ZW50IC0gc3RhcnQKKyNkZWZpbmUJSVdfU1lTX0VWRU5UX0ZMQUdfU1RBUlQgICAgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUJSVdfQVNTT0NfRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUJSVdfRElTQVNTT0NfRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAweDAyMDEKKyNkZWZpbmUJSVdfREVBVVRIX0VWRU5UX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgCTB4MDIwMgorI2RlZmluZQlJV19BR0VPVVRfRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAJMHgwMjAzCisjZGVmaW5lCUlXX0NPVU5URVJfTUVBU1VSRVNfRVZFTlRfRkxBRyAgICAgICAgICAgICAgMHgwMjA0CisjZGVmaW5lCUlXX1JFUExBWV9DT1VOVEVSX0RJRkZfRVZFTlRfRkxBRyAgICAgICAgICAgMHgwMjA1CisjZGVmaW5lCUlXX1JTTklFX0RJRkZfRVZFTlRfRkxBRyAgICAgICAgICAgCQkJMHgwMjA2CisjZGVmaW5lCUlXX01JQ19ESUZGX0VWRU5UX0ZMQUcgICAgICAgICAgIAkJCTB4MDIwNworI2RlZmluZSBJV19JQ1ZfRVJST1JfRVZFTlRfRkxBRwkJCQkJCTB4MDIwOAorI2RlZmluZSBJV19NSUNfRVJST1JfRVZFTlRfRkxBRwkJCQkJCTB4MDIwOQorI2RlZmluZSBJV19HUk9VUF9IU19USU1FT1VUX0VWRU5UX0ZMQUcJCQkJMHgwMjBBCisjZGVmaW5lCUlXX1BBSVJXSVNFX0hTX1RJTUVPVVRfRVZFTlRfRkxBRwkJCTB4MDIwQgorI2RlZmluZSBJV19SU05JRV9TQU5JVFlfRkFJTF9FVkVOVF9GTEFHCQkJCTB4MDIwQworI2RlZmluZSBJV19TRVRfS0VZX0RPTkVfV1BBMV9FVkVOVF9GTEFHCQkJCTB4MDIwRAorI2RlZmluZSBJV19TRVRfS0VZX0RPTkVfV1BBMl9FVkVOVF9GTEFHCQkJCTB4MDIwRQorI2RlZmluZSBJV19TVEFfTElOS1VQX0VWRU5UX0ZMQUcJCQkJCTB4MDIwRgorI2RlZmluZSBJV19TVEFfTElOS0RPV05fRVZFTlRfRkxBRwkJCQkJMHgwMjEwCisjZGVmaW5lIElXX1NDQU5fQ09NUExFVEVEX0VWRU5UX0ZMQUcJCQkJMHgwMjExCisjZGVmaW5lIElXX1NDQU5fRU5RVUVVRV9GQUlMX0VWRU5UX0ZMQUcJCQkJMHgwMjEyCisvLyBpZiBhZGQgbmV3IHN5c3RlbSBldmVudCBmbGFnLCBwbGVhc2UgdXBhZHRlIHRoZSBJV19TWVNfRVZFTlRfRkxBR19FTkQKKyNkZWZpbmUJSVdfU1lTX0VWRU5UX0ZMQUdfRU5EICAgICAgICAgICAgICAgICAgICAgICAweDAyMTIKKyNkZWZpbmUJSVdfU1lTX0VWRU5UX1RZUEVfTlVNCQkJCQkJKElXX1NZU19FVkVOVF9GTEFHX0VORCAtIElXX1NZU19FVkVOVF9GTEFHX1NUQVJUICsgMSkKKy8vIEZvciBzeXN0ZW0gZXZlbnQgLSBlbmQKKworLy8gRm9yIHNwb29mIGF0dGFjayBldmVudCAtIHN0YXJ0CisjZGVmaW5lCUlXX1NQT09GX0VWRU5UX0ZMQUdfU1RBUlQgICAgICAgICAgICAgICAgICAgMHgwMzAwCisjZGVmaW5lIElXX0NPTkZMSUNUX1NTSURfRVZFTlRfRkxBRwkJCQkJMHgwMzAwCisjZGVmaW5lIElXX1NQT09GX0FTU09DX1JFU1BfRVZFTlRfRkxBRwkJCQkweDAzMDEKKyNkZWZpbmUgSVdfU1BPT0ZfUkVBU1NPQ19SRVNQX0VWRU5UX0ZMQUcJCQkweDAzMDIKKyNkZWZpbmUgSVdfU1BPT0ZfUFJPQkVfUkVTUF9FVkVOVF9GTEFHCQkJCTB4MDMwMworI2RlZmluZSBJV19TUE9PRl9CRUFDT05fRVZFTlRfRkxBRwkJCQkJMHgwMzA0CisjZGVmaW5lIElXX1NQT09GX0RJU0FTU09DX0VWRU5UX0ZMQUcJCQkJMHgwMzA1CisjZGVmaW5lIElXX1NQT09GX0FVVEhfRVZFTlRfRkxBRwkJCQkJMHgwMzA2CisjZGVmaW5lIElXX1NQT09GX0RFQVVUSF9FVkVOVF9GTEFHCQkJCQkweDAzMDcKKyNkZWZpbmUgSVdfU1BPT0ZfVU5LTk9XTl9NR01UX0VWRU5UX0ZMQUcJCQkweDAzMDgKKyNkZWZpbmUgSVdfUkVQTEFZX0FUVEFDS19FVkVOVF9GTEFHCQkJCQkweDAzMDkKKy8vIGlmIGFkZCBuZXcgc3Bvb2YgYXR0YWNrIGV2ZW50IGZsYWcsIHBsZWFzZSB1cGFkdGUgdGhlIElXX1NQT09GX0VWRU5UX0ZMQUdfRU5ECisjZGVmaW5lCUlXX1NQT09GX0VWRU5UX0ZMQUdfRU5EICAgICAgICAgICAgICAgICAgICAgMHgwMzA5CisjZGVmaW5lCUlXX1NQT09GX0VWRU5UX1RZUEVfTlVNCQkJCQkJKElXX1NQT09GX0VWRU5UX0ZMQUdfRU5EIC0gSVdfU1BPT0ZfRVZFTlRfRkxBR19TVEFSVCArIDEpCisvLyBGb3Igc3Bvb2YgYXR0YWNrIGV2ZW50IC0gZW5kCisKKy8vIEZvciBmbG9vZGluZyBhdHRhY2sgZXZlbnQgLSBzdGFydAorI2RlZmluZQlJV19GTE9PRF9FVkVOVF9GTEFHX1NUQVJUICAgICAgICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBJV19GTE9PRF9BVVRIX0VWRU5UX0ZMQUcJCQkJCTB4MDQwMAorI2RlZmluZSBJV19GTE9PRF9BU1NPQ19SRVFfRVZFTlRfRkxBRwkJCQkweDA0MDEKKyNkZWZpbmUgSVdfRkxPT0RfUkVBU1NPQ19SRVFfRVZFTlRfRkxBRwkJCQkweDA0MDIKKyNkZWZpbmUgSVdfRkxPT0RfUFJPQkVfUkVRX0VWRU5UX0ZMQUcJCQkJMHgwNDAzCisjZGVmaW5lIElXX0ZMT09EX0RJU0FTU09DX0VWRU5UX0ZMQUcJCQkJMHgwNDA0CisjZGVmaW5lIElXX0ZMT09EX0RFQVVUSF9FVkVOVF9GTEFHCQkJCQkweDA0MDUKKyNkZWZpbmUgSVdfRkxPT0RfRUFQX1JFUV9FVkVOVF9GTEFHCQkJCQkweDA0MDYKKy8vIGlmIGFkZCBuZXcgZmxvb2RpbmcgYXR0YWNrIGV2ZW50IGZsYWcsIHBsZWFzZSB1cGFkdGUgdGhlIElXX0ZMT09EX0VWRU5UX0ZMQUdfRU5ECisjZGVmaW5lCUlXX0ZMT09EX0VWRU5UX0ZMQUdfRU5EICAgICAgICAgICAgICAgICAgIAkweDA0MDYKKyNkZWZpbmUJSVdfRkxPT0RfRVZFTlRfVFlQRV9OVU0JCQkJCQkoSVdfRkxPT0RfRVZFTlRfRkxBR19FTkQgLSBJV19GTE9PRF9FVkVOVF9GTEFHX1NUQVJUICsgMSkKKy8vIEZvciBmbG9vZGluZyBhdHRhY2sgLSBlbmQKKworLy8gRW5kIC0gV0lSRUxFU1MgRVZFTlRTIGRlZmluaXRpb24KKworI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAorLy8gZGVmaW5pdGlvbiBmb3IgRExTLCBrYXRoeQorI2RlZmluZQlNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZICAgMQorI2RlZmluZQlNQVhfTlVNX09GX0RMU19FTlRSWSAgICAgICAgTUFYX05VTUJFUl9PRl9ETFNfRU5UUlkKKworLy9CbG9jayBBQ0sgLCBydDI4NjAsIGthdGh5CisjZGVmaW5lIE1BWF9UWF9SRU9SREVSQlVGCQk2NAorI2RlZmluZSBNQVhfUlhfUkVPUkRFUkJVRgkJNjQKKyNkZWZpbmUgREVGQVVMVF9UWF9USU1FT1VUCQkzMAorI2RlZmluZSBERUZBVUxUX1JYX1RJTUVPVVQJCTMwCisjaWZuZGVmIENPTkZJR19BUF9TVVBQT1JUCisjZGVmaW5lIE1BWF9CQVJFQ0lfU0VTU0lPTgkJOAorI2VuZGlmCisKKyNpZm5kZWYgSVdfRVNTSURfTUFYX1NJWkUKKy8qIE1heGltdW0gc2l6ZSBvZiB0aGUgRVNTSUQgYW5kIHBBZC0+bmlja25hbWUgc3RyaW5ncyAqLworI2RlZmluZSBJV19FU1NJRF9NQVhfU0laRSAgIAkJMzIKKyNlbmRpZgorI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLworCisjaWZkZWYgTUNBU1RfUkFURV9TUEVDSUZJQworI2RlZmluZSBNQ0FTVF9ESVNBQkxFCTAKKyNkZWZpbmUgTUNBU1RfQ0NLCQkxCisjZGVmaW5lIE1DQVNUX09GRE0JCTIKKyNkZWZpbmUgTUNBU1RfSFRNSVgJCTMKKyNlbmRpZiAvLyBNQ0FTVF9SQVRFX1NQRUNJRklDIC8vCisKKy8vIEZvciBBc2ljUmFkaW9PZmYvQXNpY1JhZGlvT24gZnVuY3Rpb24KKyNkZWZpbmUgRE9UMTFQT1dFUlNBVkUJCTAKKyNkZWZpbmUgR1VJUkFESU9fT0ZGCQkxCisjZGVmaW5lIFJUTVBfSEFMVAkJICAgIDIKKyNkZWZpbmUgR1VJX0lETEVfUE9XRVJfU0FWRQkJMworLy8gLS0KKworCisvLyBkZWZpbml0aW9uIGZvciBXcGFTdXBwb3J0IGZsYWcKKyNkZWZpbmUgV1BBX1NVUFBMSUNBTlRfRElTQUJMRQkJCQkwCisjZGVmaW5lIFdQQV9TVVBQTElDQU5UX0VOQUJMRQkJCQkxCisjZGVmaW5lCVdQQV9TVVBQTElDQU5UX0VOQUJMRV9XSVRIX1dFQl9VSQkyCisKKy8vIEVuZGlhbiBieXRlIHN3YXBwaW5nIGNvZGVzCisjZGVmaW5lIFNXQVAxNih4KSBcCisgICAgKChVSU5UMTYpKCBcCisgICAgKCgoVUlOVDE2KSh4KSAmIChVSU5UMTYpIDB4MDBmZlUpIDw8IDgpIHwgXAorICAgICgoKFVJTlQxNikoeCkgJiAoVUlOVDE2KSAweGZmMDBVKSA+PiA4KSApKQorCisjZGVmaW5lIFNXQVAzMih4KSBcCisgICAgKChVSU5UMzIpKCBcCisgICAgKCgoVUlOVDMyKSh4KSAmIChVSU5UMzIpIDB4MDAwMDAwZmZVTCkgPDwgMjQpIHwgXAorICAgICgoKFVJTlQzMikoeCkgJiAoVUlOVDMyKSAweDAwMDBmZjAwVUwpIDw8ICA4KSB8IFwKKyAgICAoKChVSU5UMzIpKHgpICYgKFVJTlQzMikgMHgwMGZmMDAwMFVMKSA+PiAgOCkgfCBcCisgICAgKCgoVUlOVDMyKSh4KSAmIChVSU5UMzIpIDB4ZmYwMDAwMDBVTCkgPj4gMjQpICkpCisKKyNkZWZpbmUgU1dBUDY0KHgpIFwKKyAgICAoKFVJTlQ2NCkoIFwKKyAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDAwMDAwMDAwMDAwZmZVTEwpIDw8IDU2KSB8IFwKKyAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDAwMDAwMDAwMGZmMDBVTEwpIDw8IDQwKSB8IFwKKyAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDAwMDAwMDBmZjAwMDBVTEwpIDw8IDI0KSB8IFwKKyAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDAwMDAwZmYwMDAwMDBVTEwpIDw8ICA4KSB8IFwKKyAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDAwMGZmMDAwMDAwMDBVTEwpID4+ICA4KSB8IFwKKyAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwMDBmZjAwMDAwMDAwMDBVTEwpID4+IDI0KSB8IFwKKyAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweDAwZmYwMDAwMDAwMDAwMDBVTEwpID4+IDQwKSB8IFwKKyAgICAoVUlOVDY0KSgoKFVJTlQ2NCkoeCkgJiAoVUlOVDY0KSAweGZmMDAwMDAwMDAwMDAwMDBVTEwpID4+IDU2KSApKQorCisjaWZkZWYgUlRfQklHX0VORElBTgorCisjZGVmaW5lIGNwdTJsZTY0KHgpIFNXQVA2NCgoeCkpCisjZGVmaW5lIGxlMmNwdTY0KHgpIFNXQVA2NCgoeCkpCisjZGVmaW5lIGNwdTJsZTMyKHgpIFNXQVAzMigoeCkpCisjZGVmaW5lIGxlMmNwdTMyKHgpIFNXQVAzMigoeCkpCisjZGVmaW5lIGNwdTJsZTE2KHgpIFNXQVAxNigoeCkpCisjZGVmaW5lIGxlMmNwdTE2KHgpIFNXQVAxNigoeCkpCisjZGVmaW5lIGNwdTJiZTY0KHgpICgoVUlOVDY0KSh4KSkKKyNkZWZpbmUgYmUyY3B1NjQoeCkgKChVSU5UNjQpKHgpKQorI2RlZmluZSBjcHUyYmUzMih4KSAoKFVJTlQzMikoeCkpCisjZGVmaW5lIGJlMmNwdTMyKHgpICgoVUlOVDMyKSh4KSkKKyNkZWZpbmUgY3B1MmJlMTYoeCkgKChVSU5UMTYpKHgpKQorI2RlZmluZSBiZTJjcHUxNih4KSAoKFVJTlQxNikoeCkpCisKKyNlbHNlICAgLy8gTGl0dGxlX0VuZGlhbgorCisjZGVmaW5lIGNwdTJsZTY0KHgpICgoVUlOVDY0KSh4KSkKKyNkZWZpbmUgbGUyY3B1NjQoeCkgKChVSU5UNjQpKHgpKQorI2RlZmluZSBjcHUybGUzMih4KSAoKFVJTlQzMikoeCkpCisjZGVmaW5lIGxlMmNwdTMyKHgpICgoVUlOVDMyKSh4KSkKKyNkZWZpbmUgY3B1MmxlMTYoeCkgKChVSU5UMTYpKHgpKQorI2RlZmluZSBsZTJjcHUxNih4KSAoKFVJTlQxNikoeCkpCisjZGVmaW5lIGNwdTJiZTY0KHgpIFNXQVA2NCgoeCkpCisjZGVmaW5lIGJlMmNwdTY0KHgpIFNXQVA2NCgoeCkpCisjZGVmaW5lIGNwdTJiZTMyKHgpIFNXQVAzMigoeCkpCisjZGVmaW5lIGJlMmNwdTMyKHgpIFNXQVAzMigoeCkpCisjZGVmaW5lIGNwdTJiZTE2KHgpIFNXQVAxNigoeCkpCisjZGVmaW5lIGJlMmNwdTE2KHgpIFNXQVAxNigoeCkpCisKKyNlbmRpZiAgLy8gUlRfQklHX0VORElBTgorCisjZW5kaWYgIC8vIF9fUlRNUF9ERUZfSF9fCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydG1wX3R5cGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRtcF90eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZkN2RmMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRtcF90eXBlLmgKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICBydG1wX3R5cGUuaAorCisgICAgQWJzdHJhY3Q6CisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBOYW1lICAgICAgICBEYXRlICAgICAgICAgICAgTW9kaWZpY2F0aW9uIGxvZ3MKKyAgICBQYXVsIExpbiAgICAxLTItMjAwNAorKi8KKyNpZm5kZWYgX19SVE1QX1RZUEVfSF9fCisjZGVmaW5lIF9fUlRNUF9UWVBFX0hfXworCisjZGVmaW5lIFBBQ0tFRCAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCisKKy8vIFB1dCBwbGF0Zm9ybSBkZXBlbmRlbnQgZGVjbGFyYXRpb24gaGVyZQorLy8gRm9yIGV4YW1wbGUsIGxpbnV4IHR5cGUgZGVmaW5pdGlvbgordHlwZWRlZiB1bnNpZ25lZCBjaGFyCQlVSU5UODsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJCVVJTlQxNjsKK3R5cGVkZWYgdW5zaWduZWQgaW50CQlVSU5UMzI7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZwlVSU5UNjQ7Cit0eXBlZGVmIGludAkJCQkJSU5UMzI7Cit0eXBlZGVmIGxvbmcgbG9uZyAJCQlJTlQ2NDsKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICoJCQlQVUlOVDg7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICoJCVBVSU5UMTY7Cit0eXBlZGVmIHVuc2lnbmVkIGludCAqCQkJUFVJTlQzMjsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nICoJUFVJTlQ2NDsKK3R5cGVkZWYgaW50CSoJCQkJCVBJTlQzMjsKK3R5cGVkZWYgbG9uZyBsb25nICogCQkJUElOVDY0OworCit0eXBlZGVmIHNpZ25lZCBjaGFyCQkJQ0hBUjsKK3R5cGVkZWYgc2lnbmVkIHNob3J0CQlTSE9SVDsKK3R5cGVkZWYgc2lnbmVkIGludAkJCUlOVDsKK3R5cGVkZWYgc2lnbmVkIGxvbmcJCQlMT05HOwordHlwZWRlZiBzaWduZWQgbG9uZyBsb25nCUxPTkdMT05HOworCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhcgkJVUNIQVI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CQlVU0hPUlQ7Cit0eXBlZGVmIHVuc2lnbmVkIGludAkJVUlOVDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwkJVUxPTkc7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZwlVTE9OR0xPTkc7CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhcgkJQk9PTEVBTjsKK3R5cGVkZWYgdm9pZAkJCQlWT0lEOworCit0eXBlZGVmIFZPSUQgKgkJCQlQVk9JRDsKK3R5cGVkZWYgQ0hBUiAqCQkJCVBDSEFSOwordHlwZWRlZiBVQ0hBUiAqIAkJCVBVQ0hBUjsKK3R5cGVkZWYgVVNIT1JUICoJCQlQVVNIT1JUOwordHlwZWRlZiBMT05HICoJCQkJUExPTkc7Cit0eXBlZGVmIFVMT05HICoJCQkJUFVMT05HOwordHlwZWRlZiBVSU5UICoJCQkJUFVJTlQ7CisKK3R5cGVkZWYgdW5zaWduZWQgaW50CU5ESVNfTUVESUFfU1RBVEU7CisKK3R5cGVkZWYgdW5pb24gX0xBUkdFX0lOVEVHRVIgeworICAgIHN0cnVjdCB7CisgICAgICAgIFVJTlQgTG93UGFydDsKKyAgICAgICAgSU5UMzIgSGlnaFBhcnQ7CisgICAgfSB1OworICAgIElOVDY0IFF1YWRQYXJ0OworfSBMQVJHRV9JTlRFR0VSOworCisjZW5kaWYgIC8vIF9fUlRNUF9UWVBFX0hfXworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3NwZWN0cnVtLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3NwZWN0cnVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRjZmE1YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3BlY3RydW0uaApAQCAtMCwwICsxLDMyMiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2lmbmRlZiBfX1NQRUNUUlVNX0hfXworI2RlZmluZSBfX1NQRUNUUlVNX0hfXworCisjaW5jbHVkZSAicnRtcF90eXBlLmgiCisjaW5jbHVkZSAic3BlY3RydW1fZGVmLmgiCisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfVFBDX1JFUE9SVF9JTkZPCit7CisJVUlOVDggVHhQd3I7CisJVUlOVDggTGlua01hcmdpbjsKK30gVFBDX1JFUE9SVF9JTkZPLCAqUFRQQ19SRVBPUlRfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9DSF9TV19BTk5fSU5GTworeworCVVJTlQ4IENoU3dNb2RlOworCVVJTlQ4IENoYW5uZWw7CisJVUlOVDggQ2hTd0NudDsKK30gQ0hfU1dfQU5OX0lORk8sICpQQ0hfU1dfQU5OX0lORk87CisKK3R5cGVkZWYgdW5pb24gUEFDS0VEIF9NRUFTVVJFX1JFUV9NT0RFCit7CisjaWZkZWYgUlRfQklHX0VORElBTgorCXN0cnVjdCBQQUNLRUQKKwl7CisJCVVJTlQ4IFJldjE6NDsKKwkJVUlOVDggUmVwb3J0OjE7CisJCVVJTlQ4IFJlcXVlc3Q6MTsKKwkJVUlOVDggRW5hYmxlOjE7CisJCVVJTlQ4IFJldjA6MTsKKwl9IGZpZWxkOworI2Vsc2UKKwlzdHJ1Y3QgUEFDS0VECisJeworCQlVSU5UOCBSZXYwOjE7CisJCVVJTlQ4IEVuYWJsZToxOworCQlVSU5UOCBSZXF1ZXN0OjE7CisJCVVJTlQ4IFJlcG9ydDoxOworCQlVSU5UOCBSZXYxOjQ7CisJfSBmaWVsZDsKKyNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCisJVUlOVDggd29yZDsKK30gTUVBU1VSRV9SRVFfTU9ERSwgKlBNRUFTVVJFX1JFUV9NT0RFOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX01FQVNVUkVfUkVRCit7CisJVUlOVDggQ2hOdW07CisJVUlOVDY0IE1lYXN1cmVTdGFydFRpbWU7CisJVUlOVDE2IE1lYXN1cmVEdXJhdGlvbjsKK30gTUVBU1VSRV9SRVEsICpQTUVBU1VSRV9SRVE7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTUVBU1VSRV9SRVFfSU5GTworeworCVVJTlQ4IFRva2VuOworCU1FQVNVUkVfUkVRX01PREUgUmVxTW9kZTsKKwlVSU5UOCBSZXFUeXBlOworCU1FQVNVUkVfUkVRIE1lYXN1cmVSZXE7Cit9IE1FQVNVUkVfUkVRX0lORk8sICpQTUVBU1VSRV9SRVFfSU5GTzsKKwordHlwZWRlZiB1bmlvbiBQQUNLRUQgX01FQVNVUkVfQkFTSUNfUkVQT1JUX01BUAoreworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwlzdHJ1Y3QgUEFDS0VECisJeworCQlVSU5UOCBSZXY6MzsKKwkJVUlOVDggVW5tZWFzdXJlOjE7CisJCVVJTlQ4IFJhZGFyOjE7CisJCVVJTlQ4IFVuaWRlbnRpZmllZFNpZ25hbDoxOworCQlVSU5UOCBPZmRtUHJlYW1ibGU6MTsKKwkJVUlOVDggQlNTOjE7CisJfSBmaWVsZDsKKyNlbHNlCisJc3RydWN0IFBBQ0tFRAorCXsKKwkJVUlOVDggQlNTOjE7CisJCVVJTlQ4IE9mZG1QcmVhbWJsZToxOworCQlVSU5UOCBVbmlkZW50aWZpZWRTaWduYWw6MTsKKwkJVUlOVDggUmFkYXI6MTsKKwkJVUlOVDggVW5tZWFzdXJlOjE7CisJCVVJTlQ4IFJldjozOworCX0gZmllbGQ7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCVVJTlQ4IHdvcmQ7Cit9IE1FQVNVUkVfQkFTSUNfUkVQT1JUX01BUCwgKlBNRUFTVVJFX0JBU0lDX1JFUE9SVF9NQVA7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTUVBU1VSRV9CQVNJQ19SRVBPUlQKK3sKKwlVSU5UOCBDaE51bTsKKwlVSU5UNjQgTWVhc3VyZVN0YXJ0VGltZTsKKwlVSU5UMTYgTWVhc3VyZUR1cmF0aW9uOworCU1FQVNVUkVfQkFTSUNfUkVQT1JUX01BUCBNYXA7Cit9IE1FQVNVUkVfQkFTSUNfUkVQT1JULCAqUE1FQVNVUkVfQkFTSUNfUkVQT1JUOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX01FQVNVUkVfQ0NBX1JFUE9SVAoreworCVVJTlQ4IENoTnVtOworCVVJTlQ2NCBNZWFzdXJlU3RhcnRUaW1lOworCVVJTlQxNiBNZWFzdXJlRHVyYXRpb247CisJVUlOVDggQ0NBX0J1c3lfRnJhY3Rpb247Cit9IE1FQVNVUkVfQ0NBX1JFUE9SVCwgKlBNRUFTVVJFX0NDQV9SRVBPUlQ7CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTUVBU1VSRV9SUElfUkVQT1JUCit7CisJVUlOVDggQ2hOdW07CisJVUlOVDY0IE1lYXN1cmVTdGFydFRpbWU7CisJVUlOVDE2IE1lYXN1cmVEdXJhdGlvbjsKKwlVSU5UOCBSUElfRGVuc2l0eVs4XTsKK30gTUVBU1VSRV9SUElfUkVQT1JULCAqUE1FQVNVUkVfUlBJX1JFUE9SVDsKKwordHlwZWRlZiB1bmlvbiBQQUNLRUQgX01FQVNVUkVfUkVQT1JUX01PREUKK3sKKwlzdHJ1Y3QgUEFDS0VECisJeworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkJVUlOVDggUmV2OjU7CisJCVVJTlQ4IFJlZnVzZWQ6MTsKKwkJVUlOVDggSW5jYXBhYmxlOjE7CisJCVVJTlQ4IExhdGU6MTsKKyNlbHNlCisJCVVJTlQ4IExhdGU6MTsKKwkJVUlOVDggSW5jYXBhYmxlOjE7CisJCVVJTlQ4IFJlZnVzZWQ6MTsKKwkJVUlOVDggUmV2OjU7CisjZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLworCX0gZmllbGQ7CisJVUlOVDggd29yZDsKK30gTUVBU1VSRV9SRVBPUlRfTU9ERSwgKlBNRUFTVVJFX1JFUE9SVF9NT0RFOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX01FQVNVUkVfUkVQT1JUX0lORk8KK3sKKwlVSU5UOCBUb2tlbjsKKwlNRUFTVVJFX1JFUE9SVF9NT0RFIFJlcG9ydE1vZGU7CisJVUlOVDggUmVwb3J0VHlwZTsKKwlVSU5UOCBPY3RlY3RbMF07Cit9IE1FQVNVUkVfUkVQT1JUX0lORk8sICpQTUVBU1VSRV9SRVBPUlRfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9RVUlFVF9JTkZPCit7CisJVUlOVDggUXVpZXRDbnQ7CisJVUlOVDggUXVpZXRQZXJpb2Q7CisJVUlOVDggUXVpZXREdXJhdGlvbjsKKwlVSU5UOCBRdWlldE9mZnNldDsKK30gUVVJRVRfSU5GTywgKlBRVUlFVF9JTkZPOworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVByZXBhcmUgTWVhc3VyZW1lbnQgcmVxdWVzdCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bworCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCisJUGFyYW1ldHJzOgorCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEVucXVldWVNZWFzdXJlbWVudFJlcSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcERBLAorCUlOIFVJTlQ4IE1lYXN1cmVUb2tlbiwKKwlJTiBVSU5UOCBNZWFzdXJlUmVxTW9kZSwKKwlJTiBVSU5UOCBNZWFzdXJlUmVxVHlwZSwKKwlJTiBVSU5UOCBNZWFzdXJlQ2gsCisJSU4gVUlOVDE2IE1lYXN1cmVEdXJhdGlvbik7CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBNZWFzdXJlbWVudCByZXBvcnQgYWN0aW9uIGZyYW1lIGFuZCBlbnF1ZXVlIGl0IGludG8KKwkJbWFuYWdlbWVudCBxdWV1ZSB3YWl0aW5nIGZvciB0cmFuc21pdGlvbi4KKworCVBhcmFtZXRyczoKKwkJMS4gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZS4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBFbnF1ZXVlTWVhc3VyZW1lbnRSZXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBVSU5UOCBEaWFsb2dUb2tlbiwKKwlJTiBVSU5UOCBNZWFzdXJlVG9rZW4sCisJSU4gVUlOVDggTWVhc3VyZVJlcU1vZGUsCisJSU4gVUlOVDggTWVhc3VyZVJlcVR5cGUsCisJSU4gVUlOVDggUmVwb3J0SW5mb0xlbiwKKwlJTiBQVUlOVDggcFJlcG9ydEluZm8pOworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVByZXBhcmUgVFBDIFJlcXVlc3QgYWN0aW9uIGZyYW1lIGFuZCBlbnF1ZXVlIGl0IGludG8KKwkJbWFuYWdlbWVudCBxdWV1ZSB3YWl0aW5nIGZvciB0cmFuc21pdGlvbi4KKworCVBhcmFtZXRyczoKKwkJMS4gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZS4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBFbnF1ZXVlVFBDUmVxKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFBVQ0hBUiBwREEsCisJSU4gVUNIQVIgRGlhbG9nVG9rZW4pOworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVByZXBhcmUgVFBDIFJlcG9ydCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bworCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCisJUGFyYW1ldHJzOgorCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgorCisJUmV0dXJuCTogTm9uZS4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEVucXVldWVUUENSZXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gUFVDSEFSIHBEQSwKKwlJTiBVSU5UOCBEaWFsb2dUb2tlbiwKKwlJTiBVSU5UOCBUeFB3ciwKKwlJTiBVSU5UOCBMaW5rTWFyZ2luKTsKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlQcmVwYXJlIENoYW5uZWwgU3dpdGNoIEFubm91bmNlbWVudCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bworCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCisJUGFyYW1ldHJzOgorCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgorCQkyLiBDaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgbW9kZS4KKwkJMi4gYSBOZXcgc2VsZWN0ZWQgY2hhbm5lbC4KKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBFbnF1ZXVlQ2hTd0FubigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcERBLAorCUlOIFVJTlQ4IENoU3dNb2RlLAorCUlOIFVJTlQ4IE5ld0NoKTsKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlTcGVjdHJ1biBhY3Rpb24gZnJhbWVzIEhhbmRsZXIgc3VjaCBhcyBjaGFubmVsIHN3aXRjaCBhbm5vdWNlbWVudCwKKwkJbWVhc3VyZW1lbnQgcmVwb3J0LCBtZWFzdXJlbWVudCByZXF1ZXN0IGFjdGlvbnMgZnJhbWVzLgorCisJUGFyYW1ldHJzOgorCQlFbG1lIC0gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCisKKwlSZXR1cm4JOiBOb25lLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUGVlclNwZWN0cnVtQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCVBhcmFtZXRyczoKKworCVJldHVybgk6IE5vbmUuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworSU5UIFNldF9NZWFzdXJlUmVxX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9UcGNSZXFfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworCitWT0lEIE1lYXN1cmVSZXFUYWJJbml0KAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKKworVk9JRCBNZWFzdXJlUmVxVGFiRXhpdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgVHBjUmVxVGFiSW5pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgVHBjUmVxVGFiRXhpdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisKK1ZPSUQgTm90aWZ5Q2hTd0FublRvUGVlckFQcygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcFJBLAorCUlOIFBVQ0hBUiBwVEEsCisJSU4gVUlOVDggQ2hTd01vZGUsCisJSU4gVUlOVDggQ2hhbm5lbCk7CisjZW5kaWYgLy8gX19TUEVDVFJVTV9IX18gLy8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zcGVjdHJ1bV9kZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3BlY3RydW1fZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNhNDgxNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3BlY3RydW1fZGVmLmgKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKwlzcGVjdHJ1bV9kZWYuaAorCisgICAgQWJzdHJhY3Q6CisgICAgSGFuZGxlIGFzc29jaWF0aW9uIHJlbGF0ZWQgcmVxdWVzdHMgZWl0aGVyIGZyb20gV1NUQSBvciBmcm9tIGxvY2FsIE1MTUUKKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlGb25jaGkgV3UgICAgMjAwOAkgIAkgICBjcmVhdGVkIGZvciA4MDIuMTFoCisgKi8KKworI2lmbmRlZiBfX1NQRUNUUlVNX0RFRl9IX18KKyNkZWZpbmUgX19TUEVDVFJVTV9ERUZfSF9fCisKKyNkZWZpbmUgTUFYX01FQVNVUkVfUkVRX1RBQl9TSVpFCQkzCisjZGVmaW5lIE1BWF9IQVNIX01FQVNVUkVfUkVRX1RBQl9TSVpFCU1BWF9NRUFTVVJFX1JFUV9UQUJfU0laRQorCisjZGVmaW5lIE1BWF9UUENfUkVRX1RBQl9TSVpFCQkJMworI2RlZmluZSBNQVhfSEFTSF9UUENfUkVRX1RBQl9TSVpFCQlNQVhfVFBDX1JFUV9UQUJfU0laRQorCisjZGVmaW5lIE1JTl9SQ1ZfUFdSCQkJCTEwMAkJLyogTmVnYXRpdmUgdmFsdWUgKChkQm0pICovCisKKyNkZWZpbmUgUk1fVFBDX1JFUQkJCQkwCisjZGVmaW5lIFJNX01FQVNVUkVfUkVRCQkJMQorCisjZGVmaW5lIFJNX0JBU0lDCQkJCTAKKyNkZWZpbmUgUk1fQ0NBCQkJCQkxCisjZGVmaW5lIFJNX1JQSV9ISVNUT0dSQU0JCTIKKworI2RlZmluZSBUUENfUkVRX0FHRV9PVVQJCQk1MDAJCS8qIG1zICovCisjZGVmaW5lIE1RX1JFUV9BR0VfT1VUCQkJNTAwCQkvKiBtcyAqLworCisjZGVmaW5lIFRQQ19ESUFMT0dUT0tFTl9IQVNIX0lOREVYKF9EaWFsb2dUb2tlbikJKChfRGlhbG9nVG9rZW4pICUgTUFYX0hBU0hfVFBDX1JFUV9UQUJfU0laRSkKKyNkZWZpbmUgTVFfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChfRGlhbG9nVG9rZW4pCQkoKF9EaWFsb2dUb2tlbikgJSBNQVhfTUVBU1VSRV9SRVFfVEFCX1NJWkUpCisKK3R5cGVkZWYgc3RydWN0IF9NRUFTVVJFX1JFUV9FTlRSWQoreworCXN0cnVjdCBfTUVBU1VSRV9SRVFfRU5UUlkgKnBOZXh0OworCVVMT05HIGxhc3RUaW1lOworCUJPT0xFQU4JVmFsaWQ7CisJVUlOVDggRGlhbG9nVG9rZW47CisJVUlOVDggTWVhc3VyZURpYWxvZ1Rva2VuWzNdOwkvLyAwOmJhc2ljIG1lYXN1cmUsIDE6IENDQSBtZWFzdXJlLCAyOiBSUElfSGlzdG9ncmFtIG1lYXN1cmUuCit9IE1FQVNVUkVfUkVRX0VOVFJZLCAqUE1FQVNVUkVfUkVRX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCBfTUVBU1VSRV9SRVFfVEFCCit7CisJVUNIQVIgU2l6ZTsKKwlQTUVBU1VSRV9SRVFfRU5UUlkgSGFzaFtNQVhfSEFTSF9NRUFTVVJFX1JFUV9UQUJfU0laRV07CisJTUVBU1VSRV9SRVFfRU5UUlkgQ29udGVudFtNQVhfTUVBU1VSRV9SRVFfVEFCX1NJWkVdOworfSBNRUFTVVJFX1JFUV9UQUIsICpQTUVBU1VSRV9SRVFfVEFCOworCit0eXBlZGVmIHN0cnVjdCBfVFBDX1JFUV9FTlRSWQoreworCXN0cnVjdCBfVFBDX1JFUV9FTlRSWSAqcE5leHQ7CisJVUxPTkcgbGFzdFRpbWU7CisJQk9PTEVBTiBWYWxpZDsKKwlVSU5UOCBEaWFsb2dUb2tlbjsKK30gVFBDX1JFUV9FTlRSWSwgKlBUUENfUkVRX0VOVFJZOworCit0eXBlZGVmIHN0cnVjdCBfVFBDX1JFUV9UQUIKK3sKKwlVQ0hBUiBTaXplOworCVBUUENfUkVRX0VOVFJZIEhhc2hbTUFYX0hBU0hfVFBDX1JFUV9UQUJfU0laRV07CisJVFBDX1JFUV9FTlRSWSBDb250ZW50W01BWF9UUENfUkVRX1RBQl9TSVpFXTsKK30gVFBDX1JFUV9UQUIsICpQVFBDX1JFUV9UQUI7CisKKyNlbmRpZiAvLyBfX1NQRUNUUlVNX0RFRl9IX18gLy8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvYWlyb25ldC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvYWlyb25ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZjRhMTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS9haXJvbmV0LmMKQEAgLTAsMCArMSwxMzEyIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCWFpcm9uZXQuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVBhdWwgTGluCTA0LTA2LTE1CQlJbml0aWFsCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCWFzc29jaWF0aW9uCXN0YXRlIG1hY2hpbmUgaW5pdCwJaW5jbHVkaW5nIHN0YXRlCXRyYW5zaXRpb24gYW5kIHRpbWVyIGluaXQKKwlQYXJhbWV0ZXJzOgorCQlTIC0JcG9pbnRlcgl0byB0aGUgYXNzb2NpYXRpb24gc3RhdGUgbWFjaGluZQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQJQWlyb25ldFN0YXRlTWFjaGluZUluaXQoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCVNUQVRFX01BQ0hJTkUJCSpTLAorCU9VVAlTVEFURV9NQUNISU5FX0ZVTkMJVHJhbnNbXSkKK3sKKwlTdGF0ZU1hY2hpbmVJbml0KFMsCVRyYW5zLCBNQVhfQUlST05FVF9TVEFURSwgTUFYX0FJUk9ORVRfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIEFJUk9ORVRfSURMRSwgQUlST05FVF9NQUNISU5FX0JBU0UpOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBSVJPTkVUX0lETEUsIE1UMl9BSVJPTkVUX01TRywgKFNUQVRFX01BQ0hJTkVfRlVOQylBaXJvbmV0TXNnQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUlST05FVF9JRExFLCBNVDJfQUlST05FVF9TQ0FOX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylBaXJvbmV0UmVxdWVzdEFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFJUk9ORVRfU0NBTk5JTkcsIE1UMl9BSVJPTkVUX1NDQU5fRE9ORSwgKFNUQVRFX01BQ0hJTkVfRlVOQylBaXJvbmV0UmVwb3J0QWN0aW9uKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIGlzCXN0YXRlIG1hY2hpbmUgZnVuY3Rpb24uCisJCVdoZW4gcmVjZWl2aW5nIEVBUE9MIHBhY2tldHMgd2hpY2ggaXMgIGZvciA4MDIuMXgga2V5IG1hbmFnZW1lbnQuCisJCVVzZQlib3RoIGluCVdQQSwgYW5kIFdQQVBTSwljYXNlLgorCQlJbiB0aGlzCWZ1bmN0aW9uLCBmdXJ0aGVyIGRpc3BhdGNoIHRvIGRpZmZlcmVudAlmdW5jdGlvbnMgYWNjb3JkaW5nCXRvIHRoZSByZWNlaXZlZAlwYWNrZXQuCSAzIGNhdGVnb3JpZXMgYXJlIDoKKwkJICAxLiAgbm9ybWFsIDQtd2F5IHBhaXJ3aXNla2V5IGFuZCAyLXdheSBncm91cGtleSBoYW5kc2hha2UKKwkJICAyLiAgTUlDIGVycm9yCShDb3VudGVybWVhc3VyZXMgYXR0YWNrKSAgcmVwb3J0IHBhY2tldAlmcm9tIFNUQS4KKwkJICAzLiAgUmVxdWVzdCBmb3IgcGFpcndpc2UvZ3JvdXAga2V5IHVwZGF0ZQlmcm9tIFNUQQorCVJldHVybjoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQWlyb25ldE1zZ0FjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglNTE1FX1FVRVVFX0VMRU0JKkVsZW0pCit7CisJVVNIT1JUCQkJCQkJCUxlbmd0aDsKKwlVQ0hBUgkJCQkJCQlJbmRleCwgaTsKKwlQVUNIQVIJCQkJCQkJcERhdGE7CisJUEFJUk9ORVRfUk1fUkVRVUVTVF9GUkFNRQkJcFJNUmVxOworCVBSTV9SRVFVRVNUX0FDVElPTgkJCQlwUmVxRWxlbTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tLS0tPiBBaXJvbmV0TXNnQWN0aW9uXG4iKSk7CisKKwkvLyAwLiBHZXQgQWlyb25ldCBJQVBQIGhlYWRlciBmaXJzdAorCXBSTVJlcSA9IChQQUlST05FVF9STV9SRVFVRVNUX0ZSQU1FKSAmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTFdOworCXBEYXRhICA9IChQVUNIQVIpICZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMV07CisKKwkvLyAxLiBDaGFuZ2UgZW5kaWFuIGZvcm1hdCBmb3JtIG5ldHdvcmsgdG8gbGl0dGxlIGVuZGlhbgorCUxlbmd0aCA9IGJlMmNwdTE2KHBSTVJlcS0+SUFQUC5MZW5ndGgpOworCisJLy8gMi4wIFNhbml0eSBjaGVjaywgdGhpcyBzaG91bGQgb25seSBoYXBwZW4gd2hlbiBDQ1ggMi4wIHN1cHBvcnQgaXMgZW5hYmxlZAorCWlmIChwQWQtPlN0YUNmZy5DQ1hFbmFibGUgIT0gVFJVRSkKKwkJcmV0dXJuOworCisJLy8gMi4xIFJhZGlvIG1lYXN1cmVtZW50IG11c3QgYmUgb24KKwlpZiAocEFkLT5TdGFDZmcuQ0NYQ29udHJvbC5maWVsZC5STUVuYWJsZSAhPSAxKQorCQlyZXR1cm47CisKKwkvLyAyLjIuIERlYnVnIHByaW50IGFsbCBiaXQgaW5mb3JtYXRpb24KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJQVBQIElEICYgTGVuZ3RoICVkXG4iLCBMZW5ndGgpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJQVBQIFR5cGUgJXhcbiIsIHBSTVJlcS0+SUFQUC5UeXBlKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUFQUCBTdWJUeXBlICV4XG4iLCBwUk1SZXEtPklBUFAuU3ViVHlwZSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklBUFAgRGlhbG9nIFRva2VuICV4XG4iLCBwUk1SZXEtPklBUFAuVG9rZW4pKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJQVBQIEFjdGl2YXRpb24gRGVsYXkgJXhcbiIsIHBSTVJlcS0+RGVsYXkpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJQVBQIE1lYXN1cmVtZW50IE9mZnNldCAleFxuIiwgcFJNUmVxLT5PZmZzZXQpKTsKKworCS8vIDMuIENoZWNrIElBUFAgZnJhbWUgdHlwZSwgaXQgbXVzdCBiZSAweDMyIGZvciBDaXNjbyBBaXJvbmV0IGV4dGVuc2lvbgorCWlmIChwUk1SZXEtPklBUFAuVHlwZSAhPSBBSVJPTkVUX0lBUFBfVFlQRSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIldyb25nIElBUFAgdHlwZSBmb3IgQ2lzY28gQWlyb25ldCBleHRlbnNpb25cbiIpKTsKKwkJcmV0dXJuOworCX0KKworCS8vIDQuIENoZWNrIElBUFAgZnJhbWUgc3VidHlwZSwgaXQgbXVzdCBiZSAweDAxIGZvciBDaXNjbyBBaXJvbmV0IGV4dGVuc2lvbiByZXF1ZXN0LgorCS8vICAgIFNpbmNlIHdlIGFyZSBhY3RpbmcgYXMgY2xpZW50IG9ubHksIHdlIHdpbGwgZGlzcmVnYXJkcyByZXBseSBzdWJ0eXBlLgorCWlmIChwUk1SZXEtPklBUFAuU3ViVHlwZSAhPSBBSVJPTkVUX0lBUFBfU1VCVFlQRV9SRVFVRVNUKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiV3JvbmcgSUFQUCBzdWJ0eXBlIGZvciBDaXNjbyBBaXJvbmV0IGV4dGVuc2lvblxuIikpOworCQlyZXR1cm47CisJfQorCisJLy8gNS4gVmVyaWZ5IERlc3RpbmF0aW9uIE1BQyBhbmQgU291cmNlIE1BQywgYm90aCBzaG91bGQgYmUgYWxsIHplcm9zLgorCWlmICghIE1BQ19BRERSX0VRVUFMKHBSTVJlcS0+SUFQUC5EQSwgWkVST19NQUNfQUREUikpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJXcm9uZyBJQVBQIERBIGZvciBDaXNjbyBBaXJvbmV0IGV4dGVuc2lvbiwgaXQncyBub3QgWmVyb1xuIikpOworCQlyZXR1cm47CisJfQorCisJaWYgKCEgTUFDX0FERFJfRVFVQUwocFJNUmVxLT5JQVBQLlNBLCBaRVJPX01BQ19BRERSKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIldyb25nIElBUFAgU0EgZm9yIENpc2NvIEFpcm9uZXQgZXh0ZW5zaW9uLCBpdCdzIG5vdCBaZXJvXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwkvLyA2LiBSZWluaXQgYWxsIHJlcG9ydCByZWxhdGVkIGZpZWxkcworCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0QnVmLCAyMDQ4KTsKKwlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5Cc3NSZXBvcnRPZmZzZXQsIHNpemVvZihVU0hPUlQpICogTUFYX0xFTl9PRl9CU1NfVEFCTEUpOworCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdCwgc2l6ZW9mKFJNX1JFUVVFU1RfQUNUSU9OKSAqIDQpOworCisJLy8gNy4gUG9pbnQgdG8gdGhlIHN0YXJ0IG9mIGZpcnN0IGVsZW1lbnQgcmVwb3J0IGVsZW1lbnQKKwlwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbiAgID0gTEVOR1RIXzgwMl8xMSArIHNpemVvZihBSVJPTkVUX0lBUFBfSEVBREVSKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGUiBsZW4gPSAlZFxuIiwgcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4pKTsKKwlwQWQtPlN0YUNmZy5MYXN0QnNzSW5kZXggICAgID0gMHhmZjsKKwlwQWQtPlN0YUNmZy5STVJlcUNudCAgICAgICAgID0gMDsKKwlwQWQtPlN0YUNmZy5QYXJhbGxlbFJlcSAgICAgID0gRkFMU0U7CisJcEFkLT5TdGFDZmcuUGFyYWxsZWxEdXJhdGlvbiA9IDA7CisJcEFkLT5TdGFDZmcuUGFyYWxsZWxDaGFubmVsICA9IDA7CisJcEFkLT5TdGFDZmcuSUFQUFRva2VuICAgICAgICA9IHBSTVJlcS0+SUFQUC5Ub2tlbjsKKwlwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHggID0gMDsKKwlwQWQtPlN0YUNmZy5DTEJ1c3lCeXRlcyAgICAgID0gMDsKKwkvLyBSZXNldCB0aGUgc3RhdGlzdGljcworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbaV0gPSAwOworCisJSW5kZXggPSAwOworCisJLy8gOC4gU2F2ZSBkaWFsb2cgdG9rZW4gZm9yIHJlcG9ydAorCXBBZC0+U3RhQ2ZnLklBUFBUb2tlbiA9IHBSTVJlcS0+SUFQUC5Ub2tlbjsKKworCS8vIFNhdmUgQWN0aXZhdGlvbiBkZWxheSAmIG1lYXN1cmVtZW50IG9mZnNldCwgTm90IHJlYWxseSBuZWVkZWQKKworCS8vIDkuIFBvaW50IHRvIHRoZSBmaXJzdCByZXF1ZXN0IGVsZW1lbnQKKwlwRGF0YSArPSBzaXplb2YoQUlST05FVF9STV9SRVFVRVNUX0ZSQU1FKTsKKwkvLyAgICBMZW5ndGggc2hvdWxkIGV4Y2x1ZGUgdGhlIENJU0NPIEFpcm9uZXQgU05BUCBoZWFkZXIKKwlMZW5ndGggLT0gKHNpemVvZihBSVJPTkVUX1JNX1JFUVVFU1RfRlJBTUUpIC0gTEVOR1RIXzgwMl8xX0gpOworCisJLy8gMTAuIFN0YXJ0IFBhcnNpbmcgdGhlIE1lYXN1cmVtZW50IGVsZW1lbnRzLgorCS8vICAgIEJlIGNhcmVmdWwgYWJvdXQgbXVsdGlwbGUgTVIgZWxlbWVudHMgd2l0aGluIG9uZSBmcmFtZXMuCisJd2hpbGUgKExlbmd0aCA+IDApCisJeworCQlwUmVxRWxlbSA9IChQUk1fUkVRVUVTVF9BQ1RJT04pIHBEYXRhOworCQlzd2l0Y2ggKHBSZXFFbGVtLT5SZXFFbGVtLkVpZCkKKwkJeworCQkJY2FzZSBJRV9NRUFTVVJFTUVOVF9SRVFVRVNUOgorCQkJCS8vIEZyb20gdGhlIGV4YW1wbGUsIGl0IHNlZW1zIHdlIG9ubHkgbmVlZCB0byBzdXBwb3J0IG9uZSByZXF1ZXN0IGluIG9uZSBmcmFtZQorCQkJCS8vIFRoZXJlIGlzIG5vIG11bHRpcGxlIHJlcXVlc3QgaW4gb25lIGZyYW1lLgorCQkJCS8vIEJlc2lkZXMsIGxvb2tzIGxpa2Ugd2UgbmVlZCB0byB0YWtlIGNhcmUgdGhlIG1lYXN1cmVtZW50IHJlcXVlc3Qgb25seS4KKwkJCQkvLyBUaGUgbWVhc3VyZW1lbnQgcmVxdWVzdCBpcyBhbHdheXMgNCBieXRlcy4KKworCQkJCS8vIFN0YXJ0IHBhcnNpbmcgdGhpcyB0eXBlIG9mIHJlcXVlc3QuCisJCQkJLy8gMC4gRWlkIGlzIElFX01FQVNVUkVNRU5UX1JFUVVFU1QKKwkJCQkvLyAxLiBMZW5ndGggZGlkbid0IGluY2x1ZGUgRWlkIGFuZCBMZW5ndGggZmllbGQsIGl0IGFsd2F5cyBiZSA4LgorCQkJCS8vIDIuIE1lYXN1cmVtZW50IFRva2VuLCB3ZSBubmVkIHRvIHNhdmUgaXQgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHJlcG9ydC4KKwkJCQkvLyAzLiBNZWFzdXJlbWVudCBNb2RlLCBBbHRob3VnaCB0aGVyZSBhcmUgZGVmaW5pdGlvbnMsIGJ1dCB3ZSBkaW4ndCBzZWUgdmFsdWUgb3RoZXIgdGhhbgorCQkJCS8vICAgIDAgZnJvbSB0ZXN0IHNwZWNzIGV4YW1wbGVzLgorCQkJCS8vIDQuIE1lYXN1cmVtZW50IFR5cGUsIHRoaXMgaXMgd2hhdCB3ZSBuZWVkIHRvIGRvLgorCQkJCXN3aXRjaCAocFJlcUVsZW0tPlJlcUVsZW0uVHlwZSkKKwkJCQl7CisJCQkJCWNhc2UgTVNSTl9UWVBFX0NIQU5ORUxfTE9BRF9SRVE6CisJCQkJCWNhc2UgTVNSTl9UWVBFX05PSVNFX0hJU1RfUkVROgorCQkJCQljYXNlIE1TUk5fVFlQRV9CRUFDT05fUkVROgorCQkJCQkJLy8gQ2hlY2sgdGhlIEVuYWJsZSBub24tc2VydmluZyBjaGFubmVsIG1lYXN1cmVtZW50IGNvbnRyb2wKKwkJCQkJCWlmIChwQWQtPlN0YUNmZy5DQ1hDb250cm9sLmZpZWxkLkRDUk1FbmFibGUgPT0gMCkKKwkJCQkJCXsKKwkJCQkJCQkvLyBDaGVjayBjaGFubmVsIGJlZm9yZSBlbnF1ZXVlIHRoZSBhY3Rpb24KKwkJCQkJCQlpZiAocFJlcUVsZW0tPk1lYXN1cmVtZW50LkNoYW5uZWwgIT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJLy8gSWYgb2ZmIGNoYW5uZWwgbWVhc3VyZW1lbnQsIGNoZWNrIHRoZSBUVSBkdXJhdGlvbiBsaW1pdAorCQkJCQkJCWlmIChwUmVxRWxlbS0+TWVhc3VyZW1lbnQuQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQkJCQkJCQlpZiAocFJlcUVsZW0tPk1lYXN1cmVtZW50LkR1cmF0aW9uID4gcEFkLT5TdGFDZmcuQ0NYQ29udHJvbC5maWVsZC5UdUxpbWl0KQorCQkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisKKwkJCQkJCS8vIFNhdmUgcmVxdWVzdHMgYW5kIGV4ZWN1dGUgYWN0aW9ucyBsYXRlcgorCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF0sIHBSZXFFbGVtLCBzaXplb2YoUk1fUkVRVUVTVF9BQ1RJT04pKTsKKwkJCQkJCUluZGV4ICs9IDE7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIE1TUk5fVFlQRV9GUkFNRV9SRVE6CisJCQkJCQkvLyBTaW5jZSBpdCdzIG9wdGlvbiwgd2Ugd2lsbCBzdXBwb3J0IGxhdGVyCisJCQkJCQkvLyBGcmFtZVJlcXVlc3RBY3Rpb24ocEFkLCBwRGF0YSk7CisJCQkJCQlicmVhazsKKworCQkJCQlkZWZhdWx0OgorCQkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLy8gUG9pbnQgdG8gbmV4dCBNZWFzdXJlbWVudCByZXF1ZXN0CisJCQkJcERhdGEgICs9IHNpemVvZihSTV9SRVFVRVNUX0FDVElPTik7CisJCQkJTGVuZ3RoIC09IHNpemVvZihSTV9SRVFVRVNUX0FDVElPTik7CisJCQkJYnJlYWs7CisKKwkJCS8vIFdlIGFjY2VwdCByZXF1ZXN0IG9ubHksIGFsbCBvdGhlcnMgYXJlIGRyb3BwZWQKKwkJCWNhc2UgSUVfTUVBU1VSRU1FTlRfUkVQT1JUOgorCQkJY2FzZSBJRV9BUF9UWF9QT1dFUjoKKwkJCWNhc2UgSUVfTUVBU1VSRU1FTlRfQ0FQQUJJTElUWToKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuOworCQl9CisJfQorCisJLy8gMTEuIFVwZGF0ZSBzb21lIGZsYWdzIGFuZCBpbmRleAorCXBBZC0+U3RhQ2ZnLlJNUmVxQ250ID0gSW5kZXg7CisKKwlpZiAoSW5kZXgpCisJeworCQlNbG1lRW5xdWV1ZShwQWQsIEFJUk9ORVRfU1RBVEVfTUFDSElORSwgTVQyX0FJUk9ORVRfU0NBTl9SRVEsIDAsIE5VTEwpOworCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tLS0tIEFpcm9uZXRNc2dBY3Rpb25cbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFpcm9uZXRSZXF1ZXN0QWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1MTUVfUVVFVUVfRUxFTQkqRWxlbSkKK3sKKwlQUk1fUkVRVUVTVF9BQ1RJT04JcFJlcTsKKworCS8vIDEuIFBvaW50IHRvIG5leHQgcmVxdWVzdCBlbGVtZW50CisJcFJlcSA9IChQUk1fUkVRVUVTVF9BQ1RJT04pICZwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4XTsKKworCS8vIDIuIFBhcnNlIG1lYXN1cmVtZW50IHR5cGUgYW5kIGNhbGwgYXBwcm9wcmlhdGUgZnVuY3Rpb25zCisJaWYgKHBSZXEtPlJlcUVsZW0uVHlwZSA9PSBNU1JOX1RZUEVfQ0hBTk5FTF9MT0FEX1JFUSkKKwkJLy8gQ2hhbm5lbCBMb2FkIG1lYXN1cmVtZW50IHJlcXVlc3QKKwkJQ2hhbm5lbExvYWRSZXF1ZXN0QWN0aW9uKHBBZCwgcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4KTsKKwllbHNlIGlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX05PSVNFX0hJU1RfUkVRKQorCQkvLyBOb2lzZSBIaXN0b2dyYW0gbWVhc3VyZW1lbnQgcmVxdWVzdAorCQlOb2lzZUhpc3RSZXF1ZXN0QWN0aW9uKHBBZCwgcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4KTsKKwllbHNlIGlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX0JFQUNPTl9SRVEpCisJCS8vIEJlYWNvbiBtZWFzdXJlbWVudCByZXF1ZXN0CisJCUJlYWNvblJlcXVlc3RBY3Rpb24ocEFkLCBwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHgpOworCWVsc2UKKwkJLy8gVW5rbm93bi4gRG8gbm90aGluZyBhbmQgcmV0dXJuLCB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4KKwkJcmV0dXJuOworCisJLy8gMy4gUGVlayBpbnRvIHRoZSBuZXh0IHJlcXVlc3QsIGlmIGl0J3MgcGFyYWxsZWwsIHdlIHdpbGwgdXBkYXRlIHRoZSBzY2FuIHRpbWUgdG8gdGhlIGxhcmdlc3Qgb25lCisJaWYgKChwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHggKyAxKSA8IHBBZC0+U3RhQ2ZnLlJNUmVxQ250KQorCXsKKwkJcFJlcSA9IChQUk1fUkVRVUVTVF9BQ1RJT04pICZwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4ICsgMV07CisJCS8vIENoZWNrIGZvciBwYXJhbGxlbCBiaXQKKwkJaWYgKChwUmVxLT5SZXFFbGVtLk1vZGUgJiAweDAxKSAmJiAocFJlcS0+TWVhc3VyZW1lbnQuQ2hhbm5lbCA9PSBwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCkpCisJCXsKKwkJCS8vIFVwZGF0ZSBwYXJhbGxlbCBtb2RlIHJlcXVlc3QgaW5mb3JtYXRpb24KKwkJCXBBZC0+U3RhQ2ZnLlBhcmFsbGVsUmVxID0gVFJVRTsKKwkJCXBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lID0gKChwUmVxLT5NZWFzdXJlbWVudC5EdXJhdGlvbiA+IHBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lKSA/CisJCQkocFJlcS0+TWVhc3VyZW1lbnQuRHVyYXRpb24pIDogKHBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lKSk7CisJCX0KKwl9CisKKwkvLyA0LiBDYWxsIFJUMjhYWF9NTE1FX0hBTkRMRVIgdG8gZXhlY3V0ZSB0aGUgcmVxdWVzdCBtbG1lIGNvbW1hbmRzLCBTY2FuIHJlcXVlc3QgaXMgdGhlIG9ubHkgb25lIHVzZWQKKwlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBjaGFubmVsIGxvYWQgcmVwb3J0IGFjdGlvbiwgc3BlY2lhbCBzY2FuIG9wZXJhdGlvbiBhZGRlZAorCQl0byBzdXBwb3J0CisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCXBEYXRhCQlTdGFydCBmcm9tIGVsZW1lbnQgSUQKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQ2hhbm5lbExvYWRSZXF1ZXN0QWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJSW5kZXgpCit7CisJUFJNX1JFUVVFU1RfQUNUSU9OCQkJCXBSZXE7CisJTUxNRV9TQ0FOX1JFUV9TVFJVQ1QJCQlTY2FuUmVxOworCVVDSEFSCQkJCQkJCVplcm9Tc2lkWzMyXTsKKwlORElTX1NUQVRVUwkJCQkJCU5TdGF0dXM7CisJUFVDSEFSCQkJCQkJCXBPdXRCdWZmZXIgPSBOVUxMOworCVBIRUFERVJfODAyXzExCQkJCQlwTnVsbEZyYW1lOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hhbm5lbExvYWRSZXF1ZXN0QWN0aW9uIC0tLS0tPlxuIikpOworCisJcFJlcSA9IChQUk1fUkVRVUVTVF9BQ1RJT04pICZwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdOworCU5kaXNaZXJvTWVtb3J5KFplcm9Tc2lkLCAzMik7CisKKwkvLyBQcmVwYXJlIGZvciBzcGVjaWFsIHNjYW4gcmVxdWVzdAorCS8vIFRoZSBzY2FuIGRlZmluaXRpb24gaXMgZGlmZmVyZW50IHdpdGggb3VyIEFjdGl2ZSwgUGFzc2l2ZSBzY2FuIGRlZmluaXRpb24uCisJLy8gRm9yIENDWDIsIEFjdGl2ZSBtZWFucyBzZW5kIG91dCBwcm9iZSByZXF1ZXN0IHdpdGggYnJvYWRjYXN0IEJTU0lELgorCS8vIFBhc3NpdmUgbWVhbnMgbm8gcHJvYmUgcmVxdWVzdCBzZW50LCBvbmx5IGxpc3RlbiB0byB0aGUgYmVhY29ucy4KKwkvLyBUaGUgY2hhbm5lbCBzY2FubmVkIGlzIGZpeGVkIGFzIHNwZWNpZmllZCwgbm8gbmVlZCB0byBzY2FuIGFsbCBjaGFubmVscy4KKwkvLyBUaGUgc2NhbiB3YWl0IHRpbWUgaXMgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0IHRvby4KKwkvLyBQYXNzaXZlIHNjYW4gTW9kZQorCisJLy8gQ29udHJvbCBzdGF0ZSBtYWNoaW5lIGlzIG5vdCBpZGxlLCByZWplY3QgdGhlIHJlcXVlc3QKKwlpZiAoKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKSAmJiAoSW5kZXggPT0gMCkpCisJCXJldHVybjsKKworCS8vIEZpbGwgb3V0IHN0dWZmIGZvciBzY2FuIHJlcXVlc3QKKwlTY2FuUGFybUZpbGwocEFkLCAmU2NhblJlcSwgWmVyb1NzaWQsIDAsIEJTU19BTlksIFNDQU5fQ0lTQ09fQ0hBTk5FTF9MT0FEKTsKKwlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsIHNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKKwlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47CisKKwkvLyBSZXNldCBzb21lIGludGVybmFsIGNvbnRyb2wgZmxhZ3MgdG8gbWFrZSBzdXJlIHRoaXMgc2NhbiB3b3Jrcy4KKwlCc3NUYWJsZUluaXQoJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYik7CisJcEFkLT5TdGFDZmcuU2NhbkNudCAgICAgICAgPSAwOworCXBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsID0gcFJlcS0+TWVhc3VyZW1lbnQuQ2hhbm5lbDsKKwlwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSAgICA9IHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRHVyYXRpb24gJWQsIENoYW5uZWwgJWQhXG4iLCBwUmVxLT5NZWFzdXJlbWVudC5EdXJhdGlvbiwgcFJlcS0+TWVhc3VyZW1lbnQuQ2hhbm5lbCkpOworCisJLy8gSWYgaXQncyBub24gc2VydmluZyBjaGFubmVsIHNjYW4sIHNlbmQgb3V0IGEgbnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24uCisJaWYgKHBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJeworCQkvLyBVc2UgTUxNRSBlbnF1ZXVlIG1ldGhvZAorCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwkJaWYgKE5TdGF0dXMJIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCXJldHVybjsKKworCQlwTnVsbEZyYW1lID0gKFBIRUFERVJfODAyXzExKSBwT3V0QnVmZmVyOzsKKwkJLy8gTWFrZSB0aGUgcG93ZXIgc2F2ZSBOdWxsIGZyYW1lIHdpdGggUFNNIGJpdCBvbgorCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgcE51bGxGcmFtZSwgU1VCVFlQRV9OVUxMX0ZVTkMsIDEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCXBOdWxsRnJhbWUtPkR1cmF0aW9uIAk9IDA7CisJCXBOdWxsRnJhbWUtPkZDLlR5cGUgCT0gQlRZUEVfREFUQTsKKwkJcE51bGxGcmFtZS0+RkMuUHdyTWdtdAk9IFBXUl9TQVZFOworCisJCS8vIFNlbmQgdXNpbmcgcHJpb3JpdHkgcXVldWUKKwkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZW5kIFBTTSBEYXRhIGZyYW1lIGZvciBvZmYgY2hhbm5lbCBSTVxuIikpOworCQlSVE1QdXNlY0RlbGF5KDUwMDApOworCX0KKworCXBBZC0+U3RhQ2ZnLkNDWFJlcVR5cGUgICAgID0gTVNSTl9UWVBFX0NIQU5ORUxfTE9BRF9SRVE7CisJcEFkLT5TdGFDZmcuQ0xCdXN5Qnl0ZXMgICAgPSAwOworCS8vIEVuYWJsZSBSeCB3aXRoIHByb21pc2N1b3VzIHJlY2VwdGlvbgorCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0ZJTFRSX0NGRywgMHgxMDEwKTsKKworCS8vIFNldCBjaGFubmVsIGxvYWQgbWVhc3VyZW1lbnQgZmxhZworCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX01FQVNVUkVNRU5UKTsKKworCXBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZS5DdXJyU3RhdGUgPSBBSVJPTkVUX1NDQU5OSU5HOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hhbm5lbExvYWRSZXF1ZXN0QWN0aW9uIDwtLS0tLVxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBub2lzZSBoaXN0b2dyYW0gcmVwb3J0IGFjdGlvbiwgc3BlY2lhbCBzY2FuIG9wZXJhdGlvbiBhZGRlZAorCQl0byBzdXBwb3J0CisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCXBEYXRhCQlTdGFydCBmcm9tIGVsZW1lbnQgSUQKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJTm9pc2VIaXN0UmVxdWVzdEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUluZGV4KQoreworCVBSTV9SRVFVRVNUX0FDVElPTgkJCQlwUmVxOworCU1MTUVfU0NBTl9SRVFfU1RSVUNUCQkJU2NhblJlcTsKKwlVQ0hBUgkJCQkJCQlaZXJvU3NpZFszMl0sIGk7CisJTkRJU19TVEFUVVMJCQkJCQlOU3RhdHVzOworCVBVQ0hBUgkJCQkJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlQSEVBREVSXzgwMl8xMQkJCQkJcE51bGxGcmFtZTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5vaXNlSGlzdFJlcXVlc3RBY3Rpb24gLS0tLS0+XG4iKSk7CisKKwlwUmVxID0gKFBSTV9SRVFVRVNUX0FDVElPTikgJnBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF07CisJTmRpc1plcm9NZW1vcnkoWmVyb1NzaWQsIDMyKTsKKworCS8vIFByZXBhcmUgZm9yIHNwZWNpYWwgc2NhbiByZXF1ZXN0CisJLy8gVGhlIHNjYW4gZGVmaW5pdGlvbiBpcyBkaWZmZXJlbnQgd2l0aCBvdXIgQWN0aXZlLCBQYXNzaXZlIHNjYW4gZGVmaW5pdGlvbi4KKwkvLyBGb3IgQ0NYMiwgQWN0aXZlIG1lYW5zIHNlbmQgb3V0IHByb2JlIHJlcXVlc3Qgd2l0aCBicm9hZGNhc3QgQlNTSUQuCisJLy8gUGFzc2l2ZSBtZWFucyBubyBwcm9iZSByZXF1ZXN0IHNlbnQsIG9ubHkgbGlzdGVuIHRvIHRoZSBiZWFjb25zLgorCS8vIFRoZSBjaGFubmVsIHNjYW5uZWQgaXMgZml4ZWQgYXMgc3BlY2lmaWVkLCBubyBuZWVkIHRvIHNjYW4gYWxsIGNoYW5uZWxzLgorCS8vIFRoZSBzY2FuIHdhaXQgdGltZSBpcyBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QgdG9vLgorCS8vIFBhc3NpdmUgc2NhbiBNb2RlCisKKwkvLyBDb250cm9sIHN0YXRlIG1hY2hpbmUgaXMgbm90IGlkbGUsIHJlamVjdCB0aGUgcmVxdWVzdAorCWlmICgocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpICYmIChJbmRleCA9PSAwKSkKKwkJcmV0dXJuOworCisJLy8gRmlsbCBvdXQgc3R1ZmYgZm9yIHNjYW4gcmVxdWVzdAorCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCBaZXJvU3NpZCwgMCwgQlNTX0FOWSwgU0NBTl9DSVNDT19OT0lTRSk7CisJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NDQU5fUkVRLCBzaXplb2YoTUxNRV9TQ0FOX1JFUV9TVFJVQ1QpLCAmU2NhblJlcSk7CisJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOworCisJLy8gUmVzZXQgc29tZSBpbnRlcm5hbCBjb250cm9sIGZsYWdzIHRvIG1ha2Ugc3VyZSB0aGlzIHNjYW4gd29ya3MuCisJQnNzVGFibGVJbml0KCZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIpOworCXBBZC0+U3RhQ2ZnLlNjYW5DbnQgICAgICAgID0gMDsKKwlwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCA9IHBSZXEtPk1lYXN1cmVtZW50LkNoYW5uZWw7CisJcEFkLT5TdGFDZmcuQ0NYU2NhblRpbWUgICAgPSBwUmVxLT5NZWFzdXJlbWVudC5EdXJhdGlvbjsKKwlwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlICAgICA9IE1TUk5fVFlQRV9OT0lTRV9ISVNUX1JFUTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkR1cmF0aW9uICVkLCBDaGFubmVsICVkIVxuIiwgcFJlcS0+TWVhc3VyZW1lbnQuRHVyYXRpb24sIHBSZXEtPk1lYXN1cmVtZW50LkNoYW5uZWwpKTsKKworCS8vIElmIGl0J3Mgbm9uIHNlcnZpbmcgY2hhbm5lbCBzY2FuLCBzZW5kIG91dCBhIG51bGwgZnJhbWUgd2l0aCBQU00gYml0IG9uLgorCWlmIChwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCXsKKwkJLy8gVXNlIE1MTUUgZW5xdWV1ZSBtZXRob2QKKwkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCWlmIChOU3RhdHVzCSE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQlyZXR1cm47CisKKwkJcE51bGxGcmFtZSA9IChQSEVBREVSXzgwMl8xMSkgcE91dEJ1ZmZlcjsKKwkJLy8gTWFrZSB0aGUgcG93ZXIgc2F2ZSBOdWxsIGZyYW1lIHdpdGggUFNNIGJpdCBvbgorCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgcE51bGxGcmFtZSwgU1VCVFlQRV9OVUxMX0ZVTkMsIDEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCXBOdWxsRnJhbWUtPkR1cmF0aW9uIAk9IDA7CisJCXBOdWxsRnJhbWUtPkZDLlR5cGUgIAk9IEJUWVBFX0RBVEE7CisJCXBOdWxsRnJhbWUtPkZDLlB3ck1nbXQJPSBQV1JfU0FWRTsKKworCQkvLyBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCisJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2VuZCBQU00gRGF0YSBmcmFtZSBmb3Igb2ZmIGNoYW5uZWwgUk1cbiIpKTsKKwkJUlRNUHVzZWNEZWxheSg1MDAwKTsKKwl9CisKKwkvLyBSZXNldCB0aGUgc3RhdGlzdGljcworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbaV0gPSAwOworCisJLy8gRW5hYmxlIFJ4IHdpdGggcHJvbWlzY3VvdXMgcmVjZXB0aW9uCisJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfRklMVFJfQ0ZHLCAweDEwMTApOworCisJLy8gU2V0IGNoYW5uZWwgbG9hZCBtZWFzdXJlbWVudCBmbGFnCisJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fTUVBU1VSRU1FTlQpOworCisJcEFkLT5NbG1lLkFpcm9uZXRNYWNoaW5lLkN1cnJTdGF0ZSA9IEFJUk9ORVRfU0NBTk5JTkc7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOb2lzZUhpc3RSZXF1ZXN0QWN0aW9uIDwtLS0tLVxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJlcGFyZSBCZWFjb24gcmVwb3J0IGFjdGlvbiwgc3BlY2lhbCBzY2FuIG9wZXJhdGlvbiBhZGRlZAorCQl0byBzdXBwb3J0CisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCXBEYXRhCQlTdGFydCBmcm9tIGVsZW1lbnQgSUQKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQmVhY29uUmVxdWVzdEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUluZGV4KQoreworCVBSTV9SRVFVRVNUX0FDVElPTgkJCQlwUmVxOworCU5ESVNfU1RBVFVTCQkJCQkJTlN0YXR1czsKKwlQVUNIQVIJCQkJCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisJUEhFQURFUl84MDJfMTEJCQkJCXBOdWxsRnJhbWU7CisJTUxNRV9TQ0FOX1JFUV9TVFJVQ1QJCQlTY2FuUmVxOworCVVDSEFSCQkJCQkJCVplcm9Tc2lkWzMyXTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJlYWNvblJlcXVlc3RBY3Rpb24gLS0tLS0+XG4iKSk7CisKKwlwUmVxID0gKFBSTV9SRVFVRVNUX0FDVElPTikgJnBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF07CisJTmRpc1plcm9NZW1vcnkoWmVyb1NzaWQsIDMyKTsKKworCS8vIFByZXBhcmUgZm9yIHNwZWNpYWwgc2NhbiByZXF1ZXN0CisJLy8gVGhlIHNjYW4gZGVmaW5pdGlvbiBpcyBkaWZmZXJlbnQgd2l0aCBvdXIgQWN0aXZlLCBQYXNzaXZlIHNjYW4gZGVmaW5pdGlvbi4KKwkvLyBGb3IgQ0NYMiwgQWN0aXZlIG1lYW5zIHNlbmQgb3V0IHByb2JlIHJlcXVlc3Qgd2l0aCBicm9hZGNhc3QgQlNTSUQuCisJLy8gUGFzc2l2ZSBtZWFucyBubyBwcm9iZSByZXF1ZXN0IHNlbnQsIG9ubHkgbGlzdGVuIHRvIHRoZSBiZWFjb25zLgorCS8vIFRoZSBjaGFubmVsIHNjYW5uZWQgaXMgZml4ZWQgYXMgc3BlY2lmaWVkLCBubyBuZWVkIHRvIHNjYW4gYWxsIGNoYW5uZWxzLgorCS8vIFRoZSBzY2FuIHdhaXQgdGltZSBpcyBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QgdG9vLgorCWlmIChwUmVxLT5NZWFzdXJlbWVudC5TY2FuTW9kZSA9PSBNU1JOX1NDQU5fTU9ERV9QQVNTSVZFKQorCXsKKwkJLy8gUGFzc2l2ZSBzY2FuIE1vZGUKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGFzc2l2ZSBTY2FuIE1vZGUhXG4iKSk7CisKKwkJLy8gQ29udHJvbCBzdGF0ZSBtYWNoaW5lIGlzIG5vdCBpZGxlLCByZWplY3QgdGhlIHJlcXVlc3QKKwkJaWYgKChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkgJiYgKEluZGV4ID09IDApKQorCQkJcmV0dXJuOworCisJCS8vIEZpbGwgb3V0IHN0dWZmIGZvciBzY2FuIHJlcXVlc3QKKwkJU2NhblBhcm1GaWxsKHBBZCwgJlNjYW5SZXEsIFplcm9Tc2lkLCAwLCBCU1NfQU5ZLCBTQ0FOX0NJU0NPX1BBU1NJVkUpOworCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsIHNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOworCisJCS8vIFJlc2V0IHNvbWUgaW50ZXJuYWwgY29udHJvbCBmbGFncyB0byBtYWtlIHN1cmUgdGhpcyBzY2FuIHdvcmtzLgorCQlCc3NUYWJsZUluaXQoJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYik7CisJCXBBZC0+U3RhQ2ZnLlNjYW5DbnQgICAgICAgID0gMDsKKwkJcEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWwgPSBwUmVxLT5NZWFzdXJlbWVudC5DaGFubmVsOworCQlwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSAgICA9IHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uOworCQlwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlICAgICA9IE1TUk5fVFlQRV9CRUFDT05fUkVROworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEdXJhdGlvbiAlZCFcbiIsIHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uKSk7CisKKwkJLy8gSWYgaXQncyBub24gc2VydmluZyBjaGFubmVsIHNjYW4sIHNlbmQgb3V0IGEgbnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24uCisJCWlmIChwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQl7CisJCQkvLyBVc2UgTUxNRSBlbnF1ZXVlIG1ldGhvZAorCQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCQlpZiAoTlN0YXR1cwkhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCXJldHVybjsKKworCQkJcE51bGxGcmFtZSA9IChQSEVBREVSXzgwMl8xMSkgcE91dEJ1ZmZlcjsKKwkJCS8vIE1ha2UgdGhlIHBvd2VyIHNhdmUgTnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24KKwkJCU1ndE1hY0hlYWRlckluaXQocEFkLCBwTnVsbEZyYW1lLCBTVUJUWVBFX05VTExfRlVOQywgMSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCXBOdWxsRnJhbWUtPkR1cmF0aW9uIAk9IDA7CisJCQlwTnVsbEZyYW1lLT5GQy5UeXBlICAgICA9IEJUWVBFX0RBVEE7CisJCQlwTnVsbEZyYW1lLT5GQy5Qd3JNZ210ICA9IFBXUl9TQVZFOworCisJCQkvLyBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCisJCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2VuZCBQU00gRGF0YSBmcmFtZSBmb3Igb2ZmIGNoYW5uZWwgUk1cbiIpKTsKKwkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisJCX0KKworCQlwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUuQ3VyclN0YXRlID0gQUlST05FVF9TQ0FOTklORzsKKwl9CisJZWxzZSBpZiAocFJlcS0+TWVhc3VyZW1lbnQuU2Nhbk1vZGUgPT0gTVNSTl9TQ0FOX01PREVfQUNUSVZFKQorCXsKKwkJLy8gQWN0aXZlIHNjYW4gTW9kZQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBY3RpdmUgU2NhbiBNb2RlIVxuIikpOworCisJCS8vIENvbnRyb2wgc3RhdGUgbWFjaGluZSBpcyBub3QgaWRsZSwgcmVqZWN0IHRoZSByZXF1ZXN0CisJCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKKwkJCXJldHVybjsKKworCQkvLyBGaWxsIG91dCBzdHVmZiBmb3Igc2NhbiByZXF1ZXN0CisJCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCBaZXJvU3NpZCwgMCwgQlNTX0FOWSwgU0NBTl9DSVNDT19BQ1RJVkUpOworCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsIHNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOworCisJCS8vIFJlc2V0IHNvbWUgaW50ZXJuYWwgY29udHJvbCBmbGFncyB0byBtYWtlIHN1cmUgdGhpcyBzY2FuIHdvcmtzLgorCQlCc3NUYWJsZUluaXQoJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYik7CisJCXBBZC0+U3RhQ2ZnLlNjYW5DbnQgICAgICAgID0gMDsKKwkJcEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWwgPSBwUmVxLT5NZWFzdXJlbWVudC5DaGFubmVsOworCQlwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSAgICA9IHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uOworCQlwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlICAgICA9IE1TUk5fVFlQRV9CRUFDT05fUkVROworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEdXJhdGlvbiAlZCFcbiIsIHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uKSk7CisKKwkJLy8gSWYgaXQncyBub24gc2VydmluZyBjaGFubmVsIHNjYW4sIHNlbmQgb3V0IGEgbnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24uCisJCWlmIChwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQl7CisJCQkvLyBVc2UgTUxNRSBlbnF1ZXVlIG1ldGhvZAorCQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCQlpZiAoTlN0YXR1cwkhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCXJldHVybjsKKworCQkJcE51bGxGcmFtZSA9IChQSEVBREVSXzgwMl8xMSkgcE91dEJ1ZmZlcjsKKwkJCS8vIE1ha2UgdGhlIHBvd2VyIHNhdmUgTnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24KKwkJCU1ndE1hY0hlYWRlckluaXQocEFkLCBwTnVsbEZyYW1lLCBTVUJUWVBFX05VTExfRlVOQywgMSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCXBOdWxsRnJhbWUtPkR1cmF0aW9uIAk9IDA7CisJCQlwTnVsbEZyYW1lLT5GQy5UeXBlICAgICA9IEJUWVBFX0RBVEE7CisJCQlwTnVsbEZyYW1lLT5GQy5Qd3JNZ210ICA9IFBXUl9TQVZFOworCisJCQkvLyBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCisJCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2VuZCBQU00gRGF0YSBmcmFtZSBmb3Igb2ZmIGNoYW5uZWwgUk1cbiIpKTsKKwkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisJCX0KKworCQlwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUuQ3VyclN0YXRlID0gQUlST05FVF9TQ0FOTklORzsKKwl9CisJZWxzZSBpZiAocFJlcS0+TWVhc3VyZW1lbnQuU2Nhbk1vZGUgPT0gTVNSTl9TQ0FOX01PREVfQkVBQ09OX1RBQkxFKQorCXsKKwkJLy8gQmVhY29uIHJlcG9ydCBNb2RlLCByZXBvcnQgYWxsIHRoZSBBUFMgaW4gY3VycmVudCBic3MgdGFibGUKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQmVhY29uIFJlcG9ydCBNb2RlIVxuIikpOworCisJCS8vIENvcHkgY3VycmVudCBCU1MgdGFibGUgdG8gQ0NYIHRhYmxlLCB3ZSBjYW4gb21pdCB0aGlzIHN0ZXAgbGF0ZXIgb24uCisJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIsICZwQWQtPlNjYW5UYWIsIHNpemVvZihCU1NfVEFCTEUpKTsKKworCQkvLyBDcmVhdGUgYmVhY29uIHJlcG9ydCBmcm9tIEJzcyB0YWJsZQorCQlBaXJvbmV0Q3JlYXRlQmVhY29uUmVwb3J0RnJvbUJzc1RhYmxlKHBBZCk7CisKKwkJLy8gU2V0IHN0YXRlIHRvIHNjYW5uaW5nCisJCXBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZS5DdXJyU3RhdGUgPSBBSVJPTkVUX1NDQU5OSU5HOworCisJCS8vIEVucXVldWUgcmVwb3J0IHJlcXVlc3QKKwkJLy8gQ2lzY28gc2NhbiByZXF1ZXN0IGlzIGZpbmlzaGVkLCBwcmVwYXJlIGJlYWNvbiByZXBvcnQKKwkJTWxtZUVucXVldWUocEFkLCBBSVJPTkVUX1NUQVRFX01BQ0hJTkUsIE1UMl9BSVJPTkVUX1NDQU5fRE9ORSwgMCwgTlVMTCk7CisJfQorCWVsc2UKKwl7CisJCS8vIFdyb25nIHNjYW4gTW9kZQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcm9uZyBTY2FuIE1vZGUhXG4iKSk7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQmVhY29uUmVxdWVzdEFjdGlvbiA8LS0tLS1cbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFpcm9uZXRSZXBvcnRBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTUxNRV9RVUVVRV9FTEVNCSpFbGVtKQoreworCVBSTV9SRVFVRVNUX0FDVElPTglwUmVxOworCVVMT05HCQkJCU5vdzMyOworCisgICAgTmRpc0dldFN5c3RlbVVwVGltZSgmTm93MzIpOworCXBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWUgPSBOb3czMjsKKworCXBSZXEgPSAoUFJNX1JFUVVFU1RfQUNUSU9OKSAmcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W3BBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeF07CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBaXJvbmV0UmVwb3J0QWN0aW9uIC0tLS0tPlxuIikpOworCisJLy8gMS4gUGFyc2UgbWVhc3VyZW1lbnQgdHlwZSBhbmQgY2FsbCBhcHByb3ByaWF0ZSBmdW5jdGlvbnMKKwlpZiAocFJlcS0+UmVxRWxlbS5UeXBlID09IE1TUk5fVFlQRV9DSEFOTkVMX0xPQURfUkVRKQorCQkvLyBDaGFubmVsIExvYWQgbWVhc3VyZW1lbnQgcmVxdWVzdAorCQlDaGFubmVsTG9hZFJlcG9ydEFjdGlvbihwQWQsIHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCk7CisJZWxzZSBpZiAocFJlcS0+UmVxRWxlbS5UeXBlID09IE1TUk5fVFlQRV9OT0lTRV9ISVNUX1JFUSkKKwkJLy8gTm9pc2UgSGlzdG9ncmFtIG1lYXN1cmVtZW50IHJlcXVlc3QKKwkJTm9pc2VIaXN0UmVwb3J0QWN0aW9uKHBBZCwgcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4KTsKKwllbHNlIGlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX0JFQUNPTl9SRVEpCisJCS8vIEJlYWNvbiBtZWFzdXJlbWVudCByZXF1ZXN0CisJCUJlYWNvblJlcG9ydEFjdGlvbihwQWQsIHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCk7CisJZWxzZQorCQkvLyBVbmtub3duLiBEbyBub3RoaW5nIGFuZCByZXR1cm4KKwkJOworCisJLy8gMi4gUG9pbnQgdG8gdGhlIGNvcnJlY3QgaW5kZXggb2YgYWN0aW9uIGVsZW1lbnQsIHN0YXJ0IGZyb20gMAorCXBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCsrOworCisJLy8gMy4gQ2hlY2sgZm9yIHBhcmFsbGVsIGFjdGlvbnMKKwlpZiAocEFkLT5TdGFDZmcuUGFyYWxsZWxSZXEgPT0gVFJVRSkKKwl7CisJCXBSZXEgPSAoUFJNX1JFUVVFU1RfQUNUSU9OKSAmcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W3BBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeF07CisKKwkJLy8gUHJvY2VzcyBuZXh0IGFjdGlvbiByaWdodCBhd2F5CisJCWlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX0NIQU5ORUxfTE9BRF9SRVEpCisJCQkvLyBDaGFubmVsIExvYWQgbWVhc3VyZW1lbnQgcmVxdWVzdAorCQkJQ2hhbm5lbExvYWRSZXBvcnRBY3Rpb24ocEFkLCBwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHgpOworCQllbHNlIGlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX05PSVNFX0hJU1RfUkVRKQorCQkJLy8gTm9pc2UgSGlzdG9ncmFtIG1lYXN1cmVtZW50IHJlcXVlc3QKKwkJCU5vaXNlSGlzdFJlcG9ydEFjdGlvbihwQWQsIHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCk7CisKKwkJcEFkLT5TdGFDZmcuUGFyYWxsZWxSZXEgPSBGQUxTRTsKKwkJcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4Kys7CisJfQorCisJaWYgKHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCA+PSBwQWQtPlN0YUNmZy5STVJlcUNudCkKKwl7CisJCS8vIDQuIFRoZXJlIGlzIG5vIG1vcmUgdW5wcm9jZXNzZWQgbWVhc3VyZW1lbnQgcmVxdWVzdCwgZ28gZm9yIHRyYW5zbWl0IHRoaXMgcmVwb3J0CisJCUFpcm9uZXRGaW5hbFJlcG9ydEFjdGlvbihwQWQpOworCQlwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUuQ3VyclN0YXRlID0gQUlST05FVF9JRExFOworCX0KKwllbHNlCisJeworCQlwUmVxID0gKFBSTV9SRVFVRVNUX0FDVElPTikgJnBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHhdOworCisJCWlmIChwUmVxLT5NZWFzdXJlbWVudC5DaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJCXsKKwkJCVJUTVB1c2VjRGVsYXkoMTAwMDAwKTsKKwkJfQorCisJCS8vIDUuIFRoZXJlIGFyZSBtb3JlIHJlcXVlc3RzIHRvIGJlIG1lYXN1cmUKKwkJTWxtZUVucXVldWUocEFkLCBBSVJPTkVUX1NUQVRFX01BQ0hJTkUsIE1UMl9BSVJPTkVUX1NDQU5fUkVRLCAwLCBOVUxMKTsKKwkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFpcm9uZXRSZXBvcnRBY3Rpb24gPC0tLS0tXG4iKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlBaXJvbmV0RmluYWxSZXBvcnRBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQpCit7CisJUFVDSEFSCQkJCQlwRGVzdDsKKwlQQUlST05FVF9JQVBQX0hFQURFUglwSUFQUDsKKwlQSEVBREVSXzgwMl8xMQkJCXBIZWFkZXI7CisJVUNIQVIJCQkJCUFja1JhdGUgPSBSQVRFXzI7CisJVVNIT1JUCQkJCQlBY2tEdXJhdGlvbiA9IDA7CisJTkRJU19TVEFUVVMJCQkJTlN0YXR1czsKKwlQVUNIQVIJCQkJCXBPdXRCdWZmZXIgPSBOVUxMOworCVVMT05HCQkJCQlGcmFtZUxlbiA9IDA7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBaXJvbmV0RmluYWxSZXBvcnRBY3Rpb24gLS0tLS0+XG4iKSk7CisKKwkvLyAwLiBTZXQgdXAgdGhlIGZyYW1lIHBvaW50ZXIsIEZyYW1lIHdhcyBpbml0ZWQgYXQgdGhlIGVuZCBvZiBtZXNzYWdlIGFjdGlvbgorCXBEZXN0ID0gJnBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0QnVmW0xFTkdUSF84MDJfMTFdOworCisJLy8gMS4gVXBkYXRlIHJlcG9ydCBJQVBQIGZpZWxkcworCXBJQVBQID0gKFBBSVJPTkVUX0lBUFBfSEVBREVSKSBwRGVzdDsKKworCS8vIDIuIENvcHkgQ2lzY28gU05BUCBoZWFkZXIKKwlOZGlzTW92ZU1lbW9yeShwSUFQUC0+Q2lzY29TbmFwSGVhZGVyLCBTTkFQX0FJUk9ORVQsIExFTkdUSF84MDJfMV9IKTsKKworCS8vIDMuIG5ldHdvcmsgb3JkZXIgZm9yIHRoaXMgMTZiaXQgbGVuZ3RoCisJcElBUFAtPkxlbmd0aCAgPSBjcHUyYmUxNihwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbiAtIExFTkdUSF84MDJfMTEgLSBMRU5HVEhfODAyXzFfSCk7CisKKwkvLyAzLjEgc2FuaXR5IGNoZWNrIHRoZSByZXBvcnQgbGVuZ3RoLCBpZ25vcmUgaXQgaWYgdGhlcmUgaXMgbm90aGluZyB0byByZXBvcnQKKwlpZiAoYmUyY3B1MTYocElBUFAtPkxlbmd0aCkgPD0gMTgpCisJCXJldHVybjsKKworCS8vIDQuIFR5cGUgbXVzdCBiZSAweDMyCisJcElBUFAtPlR5cGUgICAgPSBBSVJPTkVUX0lBUFBfVFlQRTsKKworCS8vIDUuIFN1YlR5cGUgZm9yIHJlcG9ydCBtdXN0IGJlIDB4ODEKKwlwSUFQUC0+U3ViVHlwZSA9IEFJUk9ORVRfSUFQUF9TVUJUWVBFX1JFUE9SVDsKKworCS8vIDYuIERBIGlzIG5vdCB1c2VkIGFuZCBtdXN0IGJlIHplcm8sIGFsdGhvdWdoIHRoZSB3aG9sZSBmcmFtZSB3YXMgY2xlYXJlZCBhdCB0aGUgc3RhcnQgb2YgZnVuY3Rpb24KKwkvLyAgICBXZSB3aWxsIGRvIGl0IGFnYWluIGhlcmUuIFdlIGNhbiB1c2UgQlNTSUQgaW5zdGVhZAorCUNPUFlfTUFDX0FERFIocElBUFAtPkRBLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisKKwkvLyA3LiBTQSBpcyB0aGUgY2xpZW50IHJlcG9ydGluZyB3aGljaCBtdXN0IGJlIG91ciBNQUMKKwlDT1BZX01BQ19BRERSKHBJQVBQLT5TQSwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisKKwkvLyA4LiBDb3B5IHRoZSBzYXZlZCBkaWFsb2cgdG9rZW4KKwlwSUFQUC0+VG9rZW4gPSBwQWQtPlN0YUNmZy5JQVBQVG9rZW47CisKKwkvLyA5LiBNYWtlIHRoZSBSZXBvcnQgZnJhbWUgODAyLjExIGhlYWRlcgorCS8vICAgIFJldXNlIGZ1bmN0aW9uIGluIHdwYS5jCisJcEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkgcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRCdWY7CisJcEFkLT5TZXF1ZW5jZSArKzsKKwlXcGFNYWNIZWFkZXJJbml0KHBBZCwgcEhlYWRlciwgMCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCisJLy8gQUNLIHNpemUJaXMgMTQgaW5jbHVkZSBDUkMsIGFuZCBpdHMgcmF0ZQlpcyBiYXNlZCBvbiByZWFsIHRpbWUgaW5mb3JtYXRpb24KKwlBY2tSYXRlICAgICA9IHBBZC0+Q29tbW9uQ2ZnLkV4cGVjdGVkQUNLUmF0ZVtwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07CisJQWNrRHVyYXRpb24gPSBSVE1QQ2FsY0R1cmF0aW9uKHBBZCwgQWNrUmF0ZSwgMTQpOworCXBIZWFkZXItPkR1cmF0aW9uID0gcEFkLT5Db21tb25DZmcuRHNpZnMgKyBBY2tEdXJhdGlvbjsKKworCS8vIFVzZSBNTE1FIGVucXVldWUgbWV0aG9kCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZiAoTlN0YXR1cwkhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQlyZXR1cm47CisKKwkvLyAxMC4gUHJlcGFyZSByZXBvcnQgZnJhbWUgd2l0aCBkeW5hbWljIG91dGJ1ZmZlci4gSnVzdCBzaW1wbHkgY29weSBldmVyeXRoaW5nLgorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgICAgICAgICAmRnJhbWVMZW4sCisJICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4sIHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0QnVmLAorCQkgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKworCS8vIDExLiBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCXBBZC0+U3RhQ2ZnLkNDWFJlcVR5cGUgPSBNU1JOX1RZUEVfVU5VU0VEOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQWlyb25ldEZpbmFsUmVwb3J0QWN0aW9uIDwtLS0tLVxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJQ2hhbm5lbExvYWRSZXBvcnRBY3Rpb24oCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVUNIQVIJCQlJbmRleCkKK3sKKwlQTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQJcFJlcG9ydDsKKwlQQ0hBTk5FTF9MT0FEX1JFUE9SVAkJcExvYWQ7CisJUFVDSEFSCQkJCQkJcERlc3Q7CisJVUNIQVIJCQkJCQlDQ0FCdXN5RnJhY3Rpb247CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGFubmVsTG9hZFJlcG9ydEFjdGlvbiAtLS0tLT5cbiIpKTsKKworCS8vIERpc2FibGUgUnggd2l0aCBwcm9taXNjdW91cyByZWNlcHRpb24sIG1ha2UgaXQgYmFjayB0byBub3JtYWwKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9GSUxUUl9DRkcsIFNUQU5PUk1BTCk7IC8vIFN0YWlvbiBub3QgZHJvcCBjb250cm9sIGZyYW1lIHdpbGwgZmFpbCBXaUZpIENlcnRpZmljYXRpb24uCisKKwkvLyAwLiBTZXR1cCBwb2ludGVyIGZvciBwcm9jZXNzaW5nIGJlYWNvbiAmIHByb2JlIHJlc3BvbnNlCisJcERlc3QgPSAoUFVDSEFSKSAmcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRCdWZbcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW5dOworCXBSZXBvcnQgPSAoUE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKSBwRGVzdDsKKworCS8vIDEuIEZpbGwgTWVhc3VyZW1lbnQgcmVwb3J0IGVsZW1lbnQgZmllbGQuCisJcFJlcG9ydC0+RWlkICAgID0gSUVfTUVBU1VSRU1FTlRfUkVQT1JUOworCS8vIEZpeGVkIExlbmd0aCBhdCA5LCBub3QgaW5jbHVkZSBFaWQgYW5kIGxlbmd0aCBmaWVsZHMKKwlwUmVwb3J0LT5MZW5ndGggPSA5OworCXBSZXBvcnQtPlRva2VuICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF0uUmVxRWxlbS5Ub2tlbjsKKwlwUmVwb3J0LT5Nb2RlICAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdLlJlcUVsZW0uTW9kZTsKKwlwUmVwb3J0LT5UeXBlICAgPSBNU1JOX1RZUEVfQ0hBTk5FTF9MT0FEX1JFUTsKKworCS8vIDIuIEZpbGwgY2hhbm5lbCByZXBvcnQgbWVhc3VyZW1lbnQgZGF0YQorCXBEZXN0ICs9IHNpemVvZihNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCk7CisJcExvYWQgID0gKFBDSEFOTkVMX0xPQURfUkVQT1JUKSBwRGVzdDsKKwlwTG9hZC0+Q2hhbm5lbCAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdLk1lYXN1cmVtZW50LkNoYW5uZWw7CisJcExvYWQtPlNwYXJlICAgID0gMDsKKwlwTG9hZC0+RHVyYXRpb24gPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdLk1lYXN1cmVtZW50LkR1cmF0aW9uOworCisJLy8gMy4gQ2FsY3VsYXRlIHRoZSBDQ0EgQnVzeSBGcmFjdGlvbgorCS8vICAgIChCeXRlcyArIEFDSyBzaXplKSAqIDggLyBUeCBzcGVlZCAqIDI1NSAvIDEwMDAgLyBtZWFzdXJlbWVudCBkdXJhdGlvbiwgdXNlIDI0IHVzIFR4IHNwZWVkCisJLy8gICAgID0gIChCeXRlcyArIEFDSykgLyAxMiAvIGR1cmF0aW9uCisJLy8gICAgIDkgaXMgdGhlIGdvb2QgdmFsdWUgZm9yIHBBZC0+U3RhQ2ZnLkNMRmFjdG9yCisJLy8gQ0NBQnVzeUZyYWN0aW9uID0gKFVDSEFSKSAocEFkLT5TdGFDZmcuQ0xCdXN5Qnl0ZXMgLyA5IC8gcExvYWQtPkR1cmF0aW9uKTsKKwlDQ0FCdXN5RnJhY3Rpb24gPSAoVUNIQVIpIChwQWQtPlN0YUNmZy5DTEJ1c3lCeXRlcyAvIHBBZC0+U3RhQ2ZnLkNMRmFjdG9yIC8gcExvYWQtPkR1cmF0aW9uKTsKKwlpZiAoQ0NBQnVzeUZyYWN0aW9uIDwgMTApCisJCQlDQ0FCdXN5RnJhY3Rpb24gPSAoVUNIQVIpIChwQWQtPlN0YUNmZy5DTEJ1c3lCeXRlcyAvIDMgLyBwTG9hZC0+RHVyYXRpb24pICsgMTsKKworCXBMb2FkLT5DQ0FCdXN5ID0gQ0NBQnVzeUZyYWN0aW9uOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNMQnVzeUJ5dGUgJWxkLCBEdXJhdGlvbiAlZCwgUmVzdWx0LCAlZFxuIiwgcEFkLT5TdGFDZmcuQ0xCdXN5Qnl0ZXMsIHBMb2FkLT5EdXJhdGlvbiwgQ0NBQnVzeUZyYWN0aW9uKSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGcmFtZVJlcG9ydExlbiAlZFxuIiwgcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4pKTsKKwlwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbiArPSAoc2l6ZW9mKE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKSArIHNpemVvZihDSEFOTkVMX0xPQURfUkVQT1JUKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRnJhbWVSZXBvcnRMZW4gJWRcbiIsIHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuKSk7CisKKwkvLyA0LiBDbGVhciBjaGFubmVsIGxvYWQgbWVhc3VyZW1lbnQgZmxhZworCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fTUVBU1VSRU1FTlQpOworCisJLy8gNS4gcmVzZXQgdG8gaWRsZSBzdGF0ZQorCXBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZS5DdXJyU3RhdGUgPSBBSVJPTkVUX0lETEU7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGFubmVsTG9hZFJlcG9ydEFjdGlvbiA8LS0tLS1cbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECU5vaXNlSGlzdFJlcG9ydEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUluZGV4KQoreworCVBNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVAlwUmVwb3J0OworCVBOT0lTRV9ISVNUX1JFUE9SVAkJCXBOb2lzZTsKKwlQVUNIQVIJCQkJCQlwRGVzdDsKKwlVQ0hBUgkJCQkJCWksTm9pc2VDbnQ7CisJVVNIT1JUCQkJCQkJVG90YWxSUElDbnQsIFRvdGFsUlBJU3VtOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTm9pc2VIaXN0UmVwb3J0QWN0aW9uIC0tLS0tPlxuIikpOworCisJLy8gMC4gRGlzYWJsZSBSeCB3aXRoIHByb21pc2N1b3VzIHJlY2VwdGlvbiwgbWFrZSBpdCBiYWNrIHRvIG5vcm1hbAorCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0ZJTFRSX0NGRywgU1RBTk9STUFMKTsgLy8gU3RhaW9uIG5vdCBkcm9wIGNvbnRyb2wgZnJhbWUgd2lsbCBmYWlsIFdpRmkgQ2VydGlmaWNhdGlvbi4KKwkvLyAxLiBTZXR1cCBwb2ludGVyIGZvciBwcm9jZXNzaW5nIGJlYWNvbiAmIHByb2JlIHJlc3BvbnNlCisJcERlc3QgPSAoUFVDSEFSKSAmcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRCdWZbcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW5dOworCXBSZXBvcnQgPSAoUE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKSBwRGVzdDsKKworCS8vIDIuIEZpbGwgTWVhc3VyZW1lbnQgcmVwb3J0IGVsZW1lbnQgZmllbGQuCisJcFJlcG9ydC0+RWlkICAgID0gSUVfTUVBU1VSRU1FTlRfUkVQT1JUOworCS8vIEZpeGVkIExlbmd0aCBhdCAxNiwgbm90IGluY2x1ZGUgRWlkIGFuZCBsZW5ndGggZmllbGRzCisJcFJlcG9ydC0+TGVuZ3RoID0gMTY7CisJcFJlcG9ydC0+VG9rZW4gID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W0luZGV4XS5SZXFFbGVtLlRva2VuOworCXBSZXBvcnQtPk1vZGUgICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF0uUmVxRWxlbS5Nb2RlOworCXBSZXBvcnQtPlR5cGUgICA9IE1TUk5fVFlQRV9OT0lTRV9ISVNUX1JFUTsKKworCS8vIDMuIEZpbGwgbm9pc2UgaGlzdG9ncmFtIHJlcG9ydCBtZWFzdXJlbWVudCBkYXRhCisJcERlc3QgKz0gc2l6ZW9mKE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKTsKKwlwTm9pc2UgID0gKFBOT0lTRV9ISVNUX1JFUE9SVCkgcERlc3Q7CisJcE5vaXNlLT5DaGFubmVsICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF0uTWVhc3VyZW1lbnQuQ2hhbm5lbDsKKwlwTm9pc2UtPlNwYXJlICAgID0gMDsKKwlwTm9pc2UtPkR1cmF0aW9uID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W0luZGV4XS5NZWFzdXJlbWVudC5EdXJhdGlvbjsKKwkvLyA0LiBGaWxsIE5vaXNlIGhpc3RvZ3JhbSwgdGhlIHRvdGFsIFJQSSBjb3VudHMgc2hvdWxkIGJlIDAuNCAqIFRVCisJLy8gICAgV2UgZXN0aW1hdGUgNDAwMCBub3JtYWwgcGFja2V0cyByZWNlaXZlZCBkdXJuaW5nIDEwIHNlY29uZHMgdGVzdC4KKwkvLyAgICBBZGp1c3QgaXQgaWYgcmVxdWlyZWQuCisJLy8gMyBpcyBhIGdvb2QgdmFsdWUgZm9yIHBBZC0+U3RhQ2ZnLk5IRmFjdG9yCisJLy8gVG90YWxSUElDbnQgPSBwTm9pc2UtPkR1cmF0aW9uICogMyAvIDEwOworCVRvdGFsUlBJQ250ID0gcE5vaXNlLT5EdXJhdGlvbiAqIHBBZC0+U3RhQ2ZnLk5IRmFjdG9yIC8gMTA7CisJVG90YWxSUElTdW0gPSAwOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwl7CisJCVRvdGFsUlBJU3VtICs9IHBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbaV07CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJQSSAlZCBDb251dHMgJWRcbiIsIGksIHBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbaV0pKTsKKwl9CisKKwkvLyBEb3VibGUgY2hlY2sgaWYgdGhlIGNvdW50ZXIgaXMgbGFyZ2VyIHRoYW4gb3VyIGV4cGVjdGF0aW9uLgorCS8vIFdlIHdpbGwgcmVwbGFjZSBpdCB3aXRoIHRoZSB0b3RhbCBudW1iZXIgcGx1cyBhIGZyYWN0aW9uLgorCWlmIChUb3RhbFJQSVN1bSA+IFRvdGFsUlBJQ250KQorCQlUb3RhbFJQSUNudCA9IFRvdGFsUlBJU3VtICsgcE5vaXNlLT5EdXJhdGlvbiAvIDIwOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVG90YWwgUlBJIENvbnV0cyAlZFxuIiwgVG90YWxSUElDbnQpKTsKKworCS8vIDUuIEluaXRpYWxpemUgbm9pc2UgY291bnQgZm9yIHRoZSB0b3RhbCBzdW1tYXRpb24gb2YgMHhmZgorCU5vaXNlQ250ID0gMDsKKwlmb3IgKGkgPSAxOyBpIDwgODsgaSsrKQorCXsKKwkJcE5vaXNlLT5EZW5zaXR5W2ldID0gKFVDSEFSKSAocEFkLT5TdGFDZmcuUlBJRGVuc2l0eVtpXSAqIDI1NSAvIFRvdGFsUlBJQ250KTsKKwkJaWYgKChwTm9pc2UtPkRlbnNpdHlbaV0gPT0gMCkgJiYgKHBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbaV0gIT0gMCkpCisJCQlwTm9pc2UtPkRlbnNpdHlbaV0rKzsKKwkJTm9pc2VDbnQgKz0gcE5vaXNlLT5EZW5zaXR5W2ldOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZXBvcnRlZCBSUElbJWRdICA9IDB4JTAyeFxuIiwgaSwgcE5vaXNlLT5EZW5zaXR5W2ldKSk7CisJfQorCisJLy8gNi4gUlBJWzBdIHJlcHJlc2VudHMgdGhlIHJlc3Qgb2YgY291bnRzCisJcE5vaXNlLT5EZW5zaXR5WzBdID0gMHhmZiAtIE5vaXNlQ250OworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlcG9ydGVkIFJQSVswXSAgPSAweCUwMnhcbiIsIHBOb2lzZS0+RGVuc2l0eVswXSkpOworCisJcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4gKz0gKHNpemVvZihNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCkgKyBzaXplb2YoTk9JU0VfSElTVF9SRVBPUlQpKTsKKworCS8vIDcuIENsZWFyIGNoYW5uZWwgbG9hZCBtZWFzdXJlbWVudCBmbGFnCisJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19NRUFTVVJFTUVOVCk7CisKKwkvLyA4LiByZXNldCB0byBpZGxlIHN0YXRlCisJcEFkLT5NbG1lLkFpcm9uZXRNYWNoaW5lLkN1cnJTdGF0ZSA9IEFJUk9ORVRfSURMRTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5vaXNlSGlzdFJlcG9ydEFjdGlvbiA8LS0tLS1cbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVByZXBhcmUgQmVhY29uIHJlcG9ydCBhY3Rpb24sCisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUJlYWNvblJlcG9ydEFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglVQ0hBUgkJCUluZGV4KQoreworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJlYWNvblJlcG9ydEFjdGlvbiAtLS0tLT5cbiIpKTsKKworCS8vIExvb2tzIGxpa2Ugd2UgZG9uJ3QgaGF2ZSBhbnl0aGluZyB0aGluZyBuZWVkIHRvIGRvIGhlcmUuCisJLy8gQWxsIG1lYXN1cmVtZW50IHJlcG9ydCBhbHJlYWR5IGZpbmlzaGVkIGluIEFkZEJlYWNvblJlcG9ydAorCS8vIFRoZSBsZW5ndGggaXMgaW4gdGhlIEZyYW1lUmVwb3J0TGVuCisKKwkvLyByZXNldCBCZWFjb24gaW5kZXggZm9yIG5leHQgYmVhY29uIHJlcXVlc3QKKwlwQWQtPlN0YUNmZy5MYXN0QnNzSW5kZXggPSAweGZmOworCisJLy8gcmVzZXQgdG8gaWRsZSBzdGF0ZQorCXBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZS5DdXJyU3RhdGUgPSBBSVJPTkVUX0lETEU7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCZWFjb25SZXBvcnRBY3Rpb24gPC0tLS0tXG4iKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCQlJbmRleAkJQ3VycmVudCBCU1NJRCBpbiBDQ1hCc3N0YWIgZW50cnkgaW5kZXgKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFpcm9uZXRBZGRCZWFjb25SZXBvcnQoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkLAorCUlOCVVMT05HCQkJCUluZGV4LAorCUlOCVBNTE1FX1FVRVVFX0VMRU0JcEVsZW0pCit7CisJUFZPSUQJCQkJCQlwTXNnOworCVBVQ0hBUgkJCQkJCXBTcmMsIHBEZXN0OworCVVDSEFSCQkJCQkJUmVxSWR4OworCVVMT05HCQkJCQkJTXNnTGVuOworCVVTSE9SVAkJCQkJCUxlbmd0aDsKKwlQRlJBTUVfODAyXzExCQkJCXBGcmFtZTsKKwlQTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQJcFJlcG9ydDsKKwlQRUlEX1NUUlVDVAkJCSAgICAgICAgcEVpZDsKKwlQQkVBQ09OX1JFUE9SVAkJCQlwQmVhY29uUmVwb3J0OworCVBCU1NfRU5UUlkJCQkJCXBCc3M7CisKKwkvLyAwLiBTZXR1cCBwb2ludGVyIGZvciBwcm9jZXNzaW5nIGJlYWNvbiAmIHByb2JlIHJlc3BvbnNlCisJcE1zZyAgID0gcEVsZW0tPk1zZzsKKwlNc2dMZW4gPSBwRWxlbS0+TXNnTGVuOworCXBGcmFtZSA9IChQRlJBTUVfODAyXzExKSBwTXNnOworCXBTcmMgICA9IHBGcmFtZS0+T2N0ZXQ7CQkJCS8vIFN0YXJ0IGZyb20gQVAgVFNGCisJcEJzcyAgID0gKFBCU1NfRU5UUlkpICZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIuQnNzRW50cnlbSW5kZXhdOworCVJlcUlkeCA9IHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeDsKKworCS8vIDEgQ2hlY2sgdGhlIEluZGV4LCBpZiB3ZSBhbHJlYWR5IGNyZWF0ZSB0aGlzIGVudHJ5LCBvbmx5IHVwZGF0ZSB0aGUgYXZlcmFnZSBSU1NJCisJaWYgKChJbmRleCA8PSBwQWQtPlN0YUNmZy5MYXN0QnNzSW5kZXgpICYmIChwQWQtPlN0YUNmZy5MYXN0QnNzSW5kZXggIT0gMHhmZikpCisJeworCQlwRGVzdCAgPSAoUFVDSEFSKSAmcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRCdWZbcEFkLT5TdGFDZmcuQnNzUmVwb3J0T2Zmc2V0W0luZGV4XV07CisJCS8vIFBvaW50IHRvIGJzcyByZXBvcnQgaW5mb3JtYXRpb24KKwkJcERlc3QgKz0gc2l6ZW9mKE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKTsKKwkJcEJlYWNvblJlcG9ydCA9IChQQkVBQ09OX1JFUE9SVCkgcERlc3Q7CisKKwkJLy8gVXBkYXRlIFJ4IHBvd2VyLCBpbiBkQm0KKwkJLy8gR2V0IHRoZSBvcmlnaW5hbCBSU1NJIHJlYWRiYWNrIGZyb20gQkJQCisJCXBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgKz0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YTsKKwkJLy8gQXZlcmFnZSB0aGUgUnNzaSByZWFkaW5nCisJCXBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgID0gKHBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgKyBwQnNzLT5Sc3NpKSAvIDI7CisJCS8vIEdldCB0byBkQm0gZm9ybWF0CisJCXBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgLT0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCc3NpZCAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAiLAorCQkJcEJzcy0+QnNzaWRbMF0sIHBCc3MtPkJzc2lkWzFdLCBwQnNzLT5Cc3NpZFsyXSwKKwkJCXBCc3MtPkJzc2lkWzNdLCBwQnNzLT5Cc3NpZFs0XSwgcEJzcy0+QnNzaWRbNV0pKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUnhQb3dlclslbGRdIFJzc2kgJWQsIEF2ZyBSc3NpICVkXG4iLCBJbmRleCwgKHBCc3MtPlJzc2kgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSwgcEJlYWNvblJlcG9ydC0+UnhQb3dlciAtIDI1NikpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGcmFtZVJlcG9ydExlbiA9ICVkXG4iLCBwQWQtPlN0YUNmZy5Cc3NSZXBvcnRPZmZzZXRbSW5kZXhdKSk7CisKKwkJLy8gVXBkYXRlIG90aGVyIGluZm9ybWF0aW9uIGhlcmUKKworCQkvLyBEb25lCisJCXJldHVybjsKKwl9CisKKwkvLyAyLiBVcGRhdGUgcmVwb3J0ZWQgSW5kZXgKKwlwQWQtPlN0YUNmZy5MYXN0QnNzSW5kZXggPSBJbmRleDsKKworCS8vIDMuIFNldHVwIHRoZSBidWZmZXIgYWRkcmVzcyBmb3IgY29weWluZyB0aGlzIEJTU0lEIGludG8gcmVwb3J0aW5nIGZyYW1lCisJLy8gICAgVGhlIG9mZnNldCBzaG91bGQgc3RhcnQgYWZ0ZXIgODAyLjExIGhlYWRlciBhbmQgcmVwb3J0IGZyYW1lIGhlYWRlci4KKwlwRGVzdCA9IChQVUNIQVIpICZwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydEJ1ZltwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbl07CisKKwkvLyA0LiBTYXZlIHRoZSBzdGFydCBvZmZzZXQgb2YgZWFjaCBCc3MgaW4gcmVwb3J0IGZyYW1lCisJcEFkLT5TdGFDZmcuQnNzUmVwb3J0T2Zmc2V0W0luZGV4XSA9IHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuOworCisJLy8gNS4gRmlsbCBNZWFzdXJlbWVudCByZXBvcnQgZmllbGRzCisJcFJlcG9ydCA9IChQTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpIHBEZXN0OworCXBSZXBvcnQtPkVpZCA9IElFX01FQVNVUkVNRU5UX1JFUE9SVDsKKwlwUmVwb3J0LT5MZW5ndGggPSAwOworCXBSZXBvcnQtPlRva2VuICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtSZXFJZHhdLlJlcUVsZW0uVG9rZW47CisJcFJlcG9ydC0+TW9kZSAgID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W1JlcUlkeF0uUmVxRWxlbS5Nb2RlOworCXBSZXBvcnQtPlR5cGUgICA9IE1TUk5fVFlQRV9CRUFDT05fUkVROworCUxlbmd0aCAgICAgICAgICA9IHNpemVvZihNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCk7CisJcERlc3QgICAgICAgICAgKz0gc2l6ZW9mKE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKTsKKworCS8vIDYuIFN0YXJ0IHRoZWJlYWNvbiByZXBvcnQgZm9ybWF0CisJcEJlYWNvblJlcG9ydCA9IChQQkVBQ09OX1JFUE9SVCkgcERlc3Q7CisJcERlc3QgICAgICAgICs9IHNpemVvZihCRUFDT05fUkVQT1JUKTsKKwlMZW5ndGggICAgICAgKz0gc2l6ZW9mKEJFQUNPTl9SRVBPUlQpOworCisJLy8gNy4gQ29weSBDaGFubmVsIG51bWJlcgorCXBCZWFjb25SZXBvcnQtPkNoYW5uZWwgICAgICAgID0gcEJzcy0+Q2hhbm5lbDsKKwlwQmVhY29uUmVwb3J0LT5TcGFyZSAgICAgICAgICA9IDA7CisJcEJlYWNvblJlcG9ydC0+RHVyYXRpb24gICAgICAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbUmVxSWR4XS5NZWFzdXJlbWVudC5EdXJhdGlvbjsKKwlwQmVhY29uUmVwb3J0LT5QaHlUeXBlICAgICAgICA9ICgocEJzcy0+U3VwUmF0ZUxlbitwQnNzLT5FeHRSYXRlTGVuID4gNCkgPyBQSFlfRVJQIDogUEhZX0RTUyk7CisJLy8gOC4gUnggcG93ZXIsIGluIGRCbQorCXBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgICAgICAgID0gcEJzcy0+UnNzaSAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGE7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCc3NpZCAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAiLAorCQlwQnNzLT5Cc3NpZFswXSwgcEJzcy0+QnNzaWRbMV0sIHBCc3MtPkJzc2lkWzJdLAorCQlwQnNzLT5Cc3NpZFszXSwgcEJzcy0+QnNzaWRbNF0sIHBCc3MtPkJzc2lkWzVdKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUnhQb3dlclslbGRdLCBSc3NpICVkXG4iLCBJbmRleCwgcEJlYWNvblJlcG9ydC0+UnhQb3dlciAtIDI1NikpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkZyYW1lUmVwb3J0TGVuID0gJWRcbiIsIHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuKSk7CisKKwlwQmVhY29uUmVwb3J0LT5CZWFjb25JbnRlcnZhbCA9IHBCc3MtPkJlYWNvblBlcmlvZDsKKwlDT1BZX01BQ19BRERSKHBCZWFjb25SZXBvcnQtPkJTU0lELCBwRnJhbWUtPkhkci5BZGRyMyk7CisJTmRpc01vdmVNZW1vcnkocEJlYWNvblJlcG9ydC0+UGFyZW50VFNGLCBwU3JjLCA0KTsKKwlOZGlzTW92ZU1lbW9yeShwQmVhY29uUmVwb3J0LT5UYXJnZXRUU0YsICZwRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7CisJTmRpc01vdmVNZW1vcnkoJnBCZWFjb25SZXBvcnQtPlRhcmdldFRTRls0XSwgJnBFbGVtLT5UaW1lU3RhbXAudS5IaWdoUGFydCwgNCk7CisKKwkvLyA5LiBTa2lwIHRoZSBiZWFjb24gZnJhbWUgYW5kIG9mZnNldCB0byBzdGFydCBvZiBjYXBhYmlsaXR5aW5mbyBzaW5jZSB3ZSBhbHJlYWR5IHByb2Nlc3NlZCBjYXBhYmlsaXR5aW5mbworCXBTcmMgKz0gKFRJTUVTVEFNUF9MRU4gKyAyKTsKKwlwQmVhY29uUmVwb3J0LT5DYXBhYmlsaXR5SW5mbyA9ICooVVNIT1JUICopcFNyYzsKKworCS8vIDEwLiBQb2ludCB0byBzdGFydCBvZiBlbGVtZW50IElECisJcFNyYyArPSAyOworCXBFaWQgPSAoUEVJRF9TVFJVQ1QpIHBTcmM7CisKKwkvLyAxMS4gU3RhcnQgcHJvY2VzcyBhbGwgdmFyaWFibGUgRWlkIG9heWxvYWQgYW5kIGFkZCB0aGUgYXBwcm9wcmlhdGUgdG8gdGhlIGZyYW1lIHJlcG9ydAorCXdoaWxlICgoKFBVQ0hBUikgcEVpZCArIHBFaWQtPkxlbiArIDEpIDwgKChQVUNIQVIpIHBGcmFtZSArIE1zZ0xlbikpCisJeworCQkvLyBPbmx5IGxpbWl0ZWQgRUlEIGFyZSByZXF1aXJlZCB0byByZXBvcnQgZm9yIENDWCAyLiBJdCBpbmNsdWRlcyBTU0lELCBTdXBwb3J0ZWQgcmF0ZSwKKwkJLy8gRkggcGFyYW1lbnRlciBzZXQsIERTIHBhcmFtZXRlciBzZXQsIENGIHBhcmFtZXRlciBzZXQsIElCU1MgcGFyYW1ldGVyIHNldCwKKwkJLy8gVElNIChyZXBvcnQgZmlyc3QgNCBieXRlcyBvbmx5LCByYWRpbyBtZWFzdXJlbWVudCBjYXBhYmlsaXR5CisJCXN3aXRjaCAocEVpZC0+RWlkKQorCQl7CisJCQljYXNlIElFX1NTSUQ6CisJCQljYXNlIElFX1NVUFBfUkFURVM6CisJCQljYXNlIElFX0ZIX1BBUk06CisJCQljYXNlIElFX0RTX1BBUk06CisJCQljYXNlIElFX0NGX1BBUk06CisJCQljYXNlIElFX0lCU1NfUEFSTToKKwkJCQlOZGlzTW92ZU1lbW9yeShwRGVzdCwgcEVpZCwgcEVpZC0+TGVuICsgMik7CisJCQkJcERlc3QgICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJCQlMZW5ndGggKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCWJyZWFrOworCisJCQljYXNlIElFX01FQVNVUkVNRU5UX0NBUEFCSUxJVFk6CisJCQkJLy8gU2luY2UgdGhpcyBJRSBpcyBkdXBsaWNhdGVkIHdpdGggV1BBIHNlY3VyaXR5IElFLCB3ZSBoYXMgdG8gZG8gc2FuaXR5IGNoZWNrIGJlZm9yZQorCQkJCS8vIHJlY29nbml6ZSBpdC4KKwkJCQkvLyAxLiBJdCBhbHNvIGhhcyBmaXhlZCA2IGJ5dGVzIElFIGxlbmd0aC4KKwkJCQlpZiAocEVpZC0+TGVuICE9IDYpCisJCQkJCWJyZWFrOworCQkJCS8vIDIuIENoZWNrIHRoZSBDaXNjbyBBaXJvbmV0IE9VSQorCQkJCWlmIChOZGlzRXF1YWxNZW1vcnkoQ0lTQ09fT1VJLCAocFNyYyArIDIpLCAzKSkKKwkJCQl7CisJCQkJCS8vIE1hdGNoZWQsIHRoaXMgaXMgd2hhdCB3ZSB3YW50CisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBEZXN0LCBwRWlkLCBwRWlkLT5MZW4gKyAyKTsKKwkJCQkJcERlc3QgICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJCQkJTGVuZ3RoICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSUVfVElNOgorCQkJCWlmIChwRWlkLT5MZW4gPiA0KQorCQkJCXsKKwkJCQkJLy8gTWF5IHRydW5jYXRlIGFuZCByZXBvcnQgdGhlIGZpcnN0IDQgYnl0ZXMgb25seSwgd2l0aCB0aGUgZWlkICYgbGVuLCB0b3RhbCBzaG91bGQgYmUgNgorCQkJCQlOZGlzTW92ZU1lbW9yeShwRGVzdCwgcEVpZCwgNik7CisJCQkJCXBEZXN0ICArPSA2OworCQkJCQlMZW5ndGggKz0gNjsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJTmRpc01vdmVNZW1vcnkocERlc3QsIHBFaWQsIHBFaWQtPkxlbiArIDIpOworCQkJCQlwRGVzdCAgKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCQlMZW5ndGggKz0gKHBFaWQtPkxlbiArIDIpOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJfQorCQkvLyAxMi4gTW92ZSB0byBuZXh0IGVsZW1lbnQgSUQKKwkJcFNyYyArPSAoMiArIHBFaWQtPkxlbik7CisJCXBFaWQgPSAoUEVJRF9TVFJVQ1QpIHBTcmM7CisJfQorCisJLy8gMTMuIFVwZGF0ZSB0aGUgbGVuZ3RoIGluIHRoZSBoZWFkZXIsIG5vdCBpbmNsdWRlIEVJRCBhbmQgbGVuZ3RoCisJcFJlcG9ydC0+TGVuZ3RoID0gTGVuZ3RoIC0gNDsKKworCS8vIDE0LiBVcGRhdGUgdGhlIGZyYW1lIHJlcG9ydCBidWZmZXIgZGF0YSBsZW5ndGgKKwlwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbiArPSBMZW5ndGg7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRlIgbGVuID0gJWRcbiIsIHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuKSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCisJQXJndW1lbnRzOgorCQlJbmRleAkJQ3VycmVudCBCU1NJRCBpbiBDQ1hCc3N0YWIgZW50cnkgaW5kZXgKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECUFpcm9uZXRDcmVhdGVCZWFjb25SZXBvcnRGcm9tQnNzVGFibGUoCisJSU4JUFJUTVBfQURBUFRFUgkJcEFkKQoreworCVBNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVAlwUmVwb3J0OworCVBCRUFDT05fUkVQT1JUCQkJCXBCZWFjb25SZXBvcnQ7CisJVUNIQVIJCQkJCQlJbmRleCwgUmVxSWR4OworCVVTSE9SVAkJCQkJCUxlbmd0aDsKKwlQVUNIQVIJCQkJCQlwRGVzdDsKKwlQQlNTX0VOVFJZCQkJCQlwQnNzOworCisJLy8gMC4gc2V0dXAgYmFzZSBwb2ludGVyCisJUmVxSWR4ID0gcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4OworCisJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgcEFkLT5TdGFDZmcuQ0NYQnNzVGFiLkJzc05yOyBJbmRleCsrKQorCXsKKwkJLy8gMS4gU2V0dXAgdGhlIGJ1ZmZlciBhZGRyZXNzIGZvciBjb3B5aW5nIHRoaXMgQlNTSUQgaW50byByZXBvcnRpbmcgZnJhbWUKKwkJLy8gICAgVGhlIG9mZnNldCBzaG91bGQgc3RhcnQgYWZ0ZXIgODAyLjExIGhlYWRlciBhbmQgcmVwb3J0IGZyYW1lIGhlYWRlci4KKwkJcERlc3QgID0gKFBVQ0hBUikgJnBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0QnVmW3BBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuXTsKKwkJcEJzcyAgID0gKFBCU1NfRU5UUlkpICZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIuQnNzRW50cnlbSW5kZXhdOworCQlMZW5ndGggPSAwOworCisJCS8vIDIuIEZpbGwgTWVhc3VyZW1lbnQgcmVwb3J0IGZpZWxkcworCQlwUmVwb3J0ICAgICAgICAgPSAoUE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKSBwRGVzdDsKKwkJcFJlcG9ydC0+RWlkICAgID0gSUVfTUVBU1VSRU1FTlRfUkVQT1JUOworCQlwUmVwb3J0LT5MZW5ndGggPSAwOworCQlwUmVwb3J0LT5Ub2tlbiAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbUmVxSWR4XS5SZXFFbGVtLlRva2VuOworCQlwUmVwb3J0LT5Nb2RlICAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbUmVxSWR4XS5SZXFFbGVtLk1vZGU7CisJCXBSZXBvcnQtPlR5cGUgICA9IE1TUk5fVFlQRV9CRUFDT05fUkVROworCQlMZW5ndGggICAgICAgICAgPSBzaXplb2YoTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpOworCQlwRGVzdCAgICAgICAgICArPSBzaXplb2YoTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpOworCisJCS8vIDMuIFN0YXJ0IHRoZSBiZWFjb24gcmVwb3J0IGZvcm1hdAorCQlwQmVhY29uUmVwb3J0ID0gKFBCRUFDT05fUkVQT1JUKSBwRGVzdDsKKwkJcERlc3QgICAgICAgICs9IHNpemVvZihCRUFDT05fUkVQT1JUKTsKKwkJTGVuZ3RoICAgICAgICs9IHNpemVvZihCRUFDT05fUkVQT1JUKTsKKworCQkvLyA0LiBDb3B5IENoYW5uZWwgbnVtYmVyCisJCXBCZWFjb25SZXBvcnQtPkNoYW5uZWwgICAgICAgID0gcEJzcy0+Q2hhbm5lbDsKKwkJcEJlYWNvblJlcG9ydC0+U3BhcmUgICAgICAgICAgPSAwOworCQlwQmVhY29uUmVwb3J0LT5EdXJhdGlvbiAgICAgICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtSZXFJZHhdLk1lYXN1cmVtZW50LkR1cmF0aW9uOworCQlwQmVhY29uUmVwb3J0LT5QaHlUeXBlICAgICAgICA9ICgocEJzcy0+U3VwUmF0ZUxlbitwQnNzLT5FeHRSYXRlTGVuID4gNCkgPyBQSFlfRVJQIDogUEhZX0RTUyk7CisJCXBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgICAgICAgID0gcEJzcy0+UnNzaSAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGE7CisJCXBCZWFjb25SZXBvcnQtPkJlYWNvbkludGVydmFsID0gcEJzcy0+QmVhY29uUGVyaW9kOworCQlwQmVhY29uUmVwb3J0LT5DYXBhYmlsaXR5SW5mbyA9IHBCc3MtPkNhcGFiaWxpdHlJbmZvOworCQlDT1BZX01BQ19BRERSKHBCZWFjb25SZXBvcnQtPkJTU0lELCBwQnNzLT5Cc3NpZCk7CisJCU5kaXNNb3ZlTWVtb3J5KHBCZWFjb25SZXBvcnQtPlBhcmVudFRTRiwgcEJzcy0+UFRTRiwgNCk7CisJCU5kaXNNb3ZlTWVtb3J5KHBCZWFjb25SZXBvcnQtPlRhcmdldFRTRiwgcEJzcy0+VFRTRiwgOCk7CisKKwkJLy8gNS4gQ3JlYXRlIFNTSUQKKwkJKnBEZXN0KysgPSAweDAwOworCQkqcERlc3QrKyA9IHBCc3MtPlNzaWRMZW47CisJCU5kaXNNb3ZlTWVtb3J5KHBEZXN0LCBwQnNzLT5Tc2lkLCBwQnNzLT5Tc2lkTGVuKTsKKwkJcERlc3QgICs9IHBCc3MtPlNzaWRMZW47CisJCUxlbmd0aCArPSAoMiArIHBCc3MtPlNzaWRMZW4pOworCisJCS8vIDYuIENyZWF0ZSBTdXBwb3J0UmF0ZXMKKwkJKnBEZXN0KysgPSAweDAxOworCQkqcERlc3QrKyA9IHBCc3MtPlN1cFJhdGVMZW47CisJCU5kaXNNb3ZlTWVtb3J5KHBEZXN0LCBwQnNzLT5TdXBSYXRlLCBwQnNzLT5TdXBSYXRlTGVuKTsKKwkJcERlc3QgICs9IHBCc3MtPlN1cFJhdGVMZW47CisJCUxlbmd0aCArPSAoMiArIHBCc3MtPlN1cFJhdGVMZW4pOworCisJCS8vIDcuIERTIFBhcmFtZXRlcgorCQkqcERlc3QrKyA9IDB4MDM7CisJCSpwRGVzdCsrID0gMTsKKwkJKnBEZXN0KysgPSBwQnNzLT5DaGFubmVsOworCQlMZW5ndGggICs9IDM7CisKKwkJLy8gOC4gSUJTUyBwYXJhbWV0ZXIgaWYgcHJlc2VudHMKKwkJaWYgKHBCc3MtPkJzc1R5cGUgPT0gQlNTX0FESE9DKQorCQl7CisJCQkqcERlc3QrKyA9IDB4MDY7CisJCQkqcERlc3QrKyA9IDI7CisJCQkqKFBVU0hPUlQpIHBEZXN0ID0gcEJzcy0+QXRpbVdpbjsKKwkJCXBEZXN0ICAgKz0gMjsKKwkJCUxlbmd0aCAgKz0gNDsKKwkJfQorCisJCS8vIDkuIFVwZGF0ZSBsZW5ndGggZmllbGQsIG5vdCBpbmNsdWRlIEVJRCBhbmQgbGVuZ3RoCisJCXBSZXBvcnQtPkxlbmd0aCA9IExlbmd0aCAtIDQ7CisKKwkJLy8gMTAuIFVwZGF0ZSB0b3RhbCBmcmFtZSBzaXplCisJCXBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuICs9IExlbmd0aDsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS9hc3NvYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvYXNzb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzZkYWI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvYXNzb2MuYwpAQCAtMCwwICsxLDIwMzkgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJYXNzb2MuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUpvaG4JCTIwMDQtOS0zCQlwb3J0aW5nIGZyb20gUlQyNTAwCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCitVQ0hBUglDaXBoZXJXcGFUZW1wbGF0ZVtdID0geworCQkweGRkLCAJCQkJCS8vIFdQQSBJRQorCQkweDE2LAkJCQkJLy8gTGVuZ3RoCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEsCS8vIG91aQorCQkweDAxLCAweDAwLAkJCQkvLyBWZXJzaW9uCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8vIE11bHRpY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBOdW1iZXIgb2YgdW5pY2FzdAorCQkweDAwLCAweDUwLCAweGYyLCAweDAyLAkvLyB1bmljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMQkvLyBhdXRoZW50aWNhdGlvbgorCQl9OworCitVQ0hBUglDaXBoZXJXcGEyVGVtcGxhdGVbXSA9IHsKKwkJMHgzMCwJCQkJCS8vIFJTTiBJRQorCQkweDE0LAkJCQkJLy8gTGVuZ3RoCisJCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KKwkJMHgwMCwgMHgwZiwgMHhhYywgMHgwMiwJLy8gZ3JvdXAgY2lwaGVyLCBUS0lQCisJCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBwYWlyd2lzZQorCQkweDAwLCAweDBmLCAweGFjLCAweDAyLAkvLyB1bmljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QKKwkJMHgwMCwgMHgwZiwgMHhhYywgMHgwMiwJLy8gYXV0aGVudGljYXRpb24KKwkJMHgwMCwgMHgwMCwJCQkJLy8gUlNOIGNhcGFiaWxpdHkKKwkJfTsKKworVUNIQVIJQ2N4MkllSW5mb1tdID0geyAweDAwLCAweDQwLCAweDk2LCAweDAzLCAweDAyfTsKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlhc3NvY2lhdGlvbiBzdGF0ZSBtYWNoaW5lIGluaXQsIGluY2x1ZGluZyBzdGF0ZSB0cmFuc2l0aW9uIGFuZCB0aW1lciBpbml0CisJUGFyYW1ldGVyczoKKwkJUyAtIHBvaW50ZXIgdG8gdGhlIGFzc29jaWF0aW9uIHN0YXRlIG1hY2hpbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEFzc29jU3RhdGVNYWNoaW5lSW5pdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTiAgU1RBVEVfTUFDSElORSAqUywKKwlPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCit7CisJU3RhdGVNYWNoaW5lSW5pdChTLCBUcmFucywgTUFYX0FTU09DX1NUQVRFLCBNQVhfQVNTT0NfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIEFTU09DX0lETEUsIEFTU09DX01BQ0hJTkVfQkFTRSk7CisKKwkvLyBmaXJzdCBjb2x1bW4KKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfSURMRSwgTVQyX01MTUVfQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVBc3NvY1JlcUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX0lETEUsIE1UMl9NTE1FX1JFQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVSZWFzc29jUmVxQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfSURMRSwgTVQyX01MTUVfRElTQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVEaXNhc3NvY1JlcUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX0lETEUsIE1UMl9QRUVSX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGlzYXNzb2NBY3Rpb24pOworCisJLy8gc2Vjb25kIGNvbHVtbgorCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5Bc3NvYyk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9SRUFTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuUmVhc3NvYyk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jaWF0ZSk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRpc2Fzc29jQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX0FTU09DX1JTUCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQXNzb2NSc3BBY3Rpb24pOworCS8vCisJLy8gUGF0Y2ggM0NvbSBBUCBNT2RlOjNDUldFNDU0RzcyCisJLy8gV2Ugc2VuZCBBc3NvYyByZXF1ZXN0IGZyYW1lIHRvIHRoaXMgQVAsIGl0IGFsd2F5cyBzZW5kIFJlYXNzb2MgUnNwIG5vdCBBc3NvY2lhdGUgUnNwLgorCS8vCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9SRUFTU09DX1JTUCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQXNzb2NSc3BBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19XQUlUX1JTUCwgTVQyX0FTU09DX1RJTUVPVVQsIChTVEFURV9NQUNISU5FX0ZVTkMpQXNzb2NUaW1lb3V0QWN0aW9uKTsKKworCS8vIHRoaXJkIGNvbHVtbgorCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9BU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkFzc29jKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfUkVBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlblJlYXNzb2MpOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jaWF0ZSk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGlzYXNzb2NBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9SRUFTU09DX1JTUCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyUmVhc3NvY1JzcEFjdGlvbik7CisJLy8KKwkvLyBQYXRjaCwgQVAgZG9lc24ndCBzZW5kIFJlYXNzb2NpYXRlIFJzcCBmcmFtZSB0byBTdGF0aW9uLgorCS8vCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX0FTU09DX1JTUCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyUmVhc3NvY1JzcEFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9SRUFTU09DX1RJTUVPVVQsIChTVEFURV9NQUNISU5FX0ZVTkMpUmVhc3NvY1RpbWVvdXRBY3Rpb24pOworCisJLy8gZm91cnRoIGNvbHVtbgorCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBESVNBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5Bc3NvYyk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIERJU0FTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9SRUFTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuUmVhc3NvYyk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIERJU0FTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jaWF0ZSk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIERJU0FTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRpc2Fzc29jQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgRElTQVNTT0NfV0FJVF9SU1AsIE1UMl9ESVNBU1NPQ19USU1FT1VULCAoU1RBVEVfTUFDSElORV9GVU5DKURpc2Fzc29jVGltZW91dEFjdGlvbik7CisKKwkvLyBpbml0aWFsaXplIHRoZSB0aW1lcgorCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LkFzc29jVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihBc3NvY1RpbWVvdXQpLCBwQWQsIEZBTFNFKTsKKwlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZUF1eC5SZWFzc29jVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihSZWFzc29jVGltZW91dCksIHBBZCwgRkFMU0UpOworCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LkRpc2Fzc29jVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihEaXNhc3NvY1RpbWVvdXQpLCBwQWQsIEZBTFNFKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlBc3NvY2lhdGlvbiB0aW1lb3V0IHByb2NlZHVyZS4gQWZ0ZXIgYXNzb2NpYXRpb24gdGltZW91dCwgdGhpcyBmdW5jdGlvbgorCQl3aWxsIGJlIGNhbGxlZCBhbmQgaXQgd2lsbCBwdXQgYSBtZXNzYWdlIGludG8gdGhlIE1MTUUgcXVldWUKKwlQYXJhbWV0ZXJzOgorCQlTdGFuZGFyZCB0aW1lciBwYXJhbWV0ZXJzCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNzb2NUaW1lb3V0KElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwkJCQkgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCQkJCSBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJCQkJIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKwlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQlyZXR1cm47CisKKwlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9BU1NPQ19USU1FT1VULCAwLCBOVUxMKTsKKwlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUmVhc3NvY2lhdGlvbiB0aW1lb3V0IHByb2NlZHVyZS4gQWZ0ZXIgcmVhc3NvY2lhdGlvbiB0aW1lb3V0LCB0aGlzCisJCWZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFuZCBwdXQgYSBtZXNzYWdlIGludG8gdGhlIE1MTUUgcXVldWUKKwlQYXJhbWV0ZXJzOgorCQlTdGFuZGFyZCB0aW1lciBwYXJhbWV0ZXJzCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUmVhc3NvY1RpbWVvdXQoSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCQkJCQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCisJCQkJCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwkJCQkJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCVJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCXJldHVybjsKKworCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfVElNRU9VVCwgMCwgTlVMTCk7CisJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCURpc2Fzc29jaWF0aW9uIHRpbWVvdXQgcHJvY2VkdXJlLiBBZnRlciBkaXNhc3NvY2lhdGlvbiB0aW1lb3V0LCB0aGlzCisJCWZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFuZCBwdXQgYSBtZXNzYWdlIGludG8gdGhlIE1MTUUgcXVldWUKKwlQYXJhbWV0ZXJzOgorCQlTdGFuZGFyZCB0aW1lciBwYXJhbWV0ZXJzCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgRGlzYXNzb2NUaW1lb3V0KElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKKwkJCQkJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCQkJCQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJCQkJCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3sKKwlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQlyZXR1cm47CisKKwlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9ESVNBU1NPQ19USU1FT1VULCAwLCBOVUxMKTsKKwlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJbWxtZSBhc3NvYyByZXEgaGFuZGxpbmcgcHJvY2VkdXJlCisJUGFyYW1ldGVyczoKKwkJQWRhcHRlciAtIEFkYXB0ZXIgcG9pbnRlcgorCQlFbGVtIC0gTUxNRSBRdWV1ZSBFbGVtZW50CisJUHJlOgorCQl0aGUgc3RhdGlvbiBoYXMgYmVlbiBhdXRoZW50aWNhdGVkIGFuZCB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbiB0aGUgY29uZmlnCisJCQktIyBTU0lECisJCQktIyBzdXBwb3J0ZWQgcmF0ZXMgYW5kIHRoZWlyIGxlbmd0aAorCQkJLSMgbGlzdGVuIGludGVydmFsIChBZGFwdGVyLT5TdGFDZmcuZGVmYXVsdF9saXN0ZW5fY291bnQpCisJCQktIyBUcmFuc21pdCBwb3dlciAgKEFkYXB0ZXItPlN0YUNmZy50eF9wb3dlcikKKwlQb3N0ICA6CisJCS0jIEFuIGFzc29jaWF0aW9uIHJlcXVlc3QgZnJhbWUgaXMgZ2VuZXJhdGVkIGFuZCBzZW50IHRvIHRoZSBhaXIKKwkJLSMgQXNzb2NpYXRpb24gdGltZXIgc3RhcnRzCisJCS0jIEFzc29jaWF0aW9uIHN0YXRlIC0+IEFTU09DX1dBSVRfUlNQCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZUFzc29jUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUgkJCUFwQWRkcls2XTsKKwlIRUFERVJfODAyXzExCUFzc29jSGRyOworCVVDSEFSCQkJQ2N4MkxlbiA9IDU7CisJVUNIQVIJCQlXbWVJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDB4MDcsIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDB9OworCVVTSE9SVAkJCUxpc3RlbkludHY7CisJVUxPTkcJCQlUaW1lb3V0OworCVVTSE9SVAkJCUNhcGFiaWxpdHlJbmZvOworCUJPT0xFQU4JCQlUaW1lckNhbmNlbGxlZDsKKwlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlORElTX1NUQVRVUwkJTlN0YXR1czsKKwlVTE9ORwkJCUZyYW1lTGVuID0gMDsKKwlVTE9ORwkJCXRtcDsKKwlVU0hPUlQJCQlWYXJJZXNPZmZzZXQ7CisJVUNIQVIJCQlDa2lwRmxhZzsKKwlVQ0hBUgkJCUNraXBOZWdvdGlhdGlvbkJ1ZmZlcltDS0lQX05FR09USUFUSU9OX0xFTkdUSF07CisJVUNIQVIJCQlBaXJvbmV0Q2tpcEllID0gSUVfQUlST05FVF9DS0lQOworCVVDSEFSCQkJQWlyb25ldENraXBMZW4gPSBDS0lQX05FR09USUFUSU9OX0xFTkdUSDsKKwlVQ0hBUgkJCUFpcm9uZXRJUEFkZHJlc3NJRSA9IElFX0FJUk9ORVRfSVBBRERSRVNTOworCVVDSEFSCQkJQWlyb25ldElQQWRkcmVzc0xlbiA9IEFJUk9ORVRfSVBBRERSRVNTX0xFTkdUSDsKKwlVQ0hBUgkJCUFpcm9uZXRJUEFkZHJlc3NCdWZmZXJbQUlST05FVF9JUEFERFJFU1NfTEVOR1RIXSA9IHsweDAwLCAweDQwLCAweDk2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwfTsKKwlVU0hPUlQJCQlTdGF0dXM7CisKKwkvLyBCbG9jayBhbGwgYXV0aGVudGljYXRpb24gcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QKKwlpZiAocEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPT0gVFJVRSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gQmxvY2sgQXNzb2MgcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QhXG4iKSk7CisJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOworCX0KKwkvLyBjaGVjayBzYW5pdHkgZmlyc3QKKwllbHNlIGlmIChNbG1lQXNzb2NSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQXBBZGRyLCAmQ2FwYWJpbGl0eUluZm8sICZUaW1lb3V0LCAmTGlzdGVuSW50dikpCisJeworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5Bc3NvY1RpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQlDT1BZX01BQ19BRERSKHBBZC0+TWxtZUF1eC5Cc3NpZCwgQXBBZGRyKTsKKworCQkvLyBHZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOworCQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFTU09DIC0gTWxtZUFzc29jUmVxQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJCVN0YXR1cyA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIEFkZCBieSBKYW1lcyAwMy8wNi8yNworCQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uTGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OKTsKKwkJLy8gQXNzb2NpYXRpb24gZG9uJ3QgbmVlZCB0byByZXBvcnQgTUFDIGFkZHJlc3MKKwkJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLkF2YWlsYWJsZVJlcXVlc3RGaXhlZElFcyA9CisJCQlORElTXzgwMl8xMV9BSV9SRVFGSV9DQVBBQklMSVRJRVMgfCBORElTXzgwMl8xMV9BSV9SRVFGSV9MSVNURU5JTlRFUlZBTDsKKwkJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLlJlcXVlc3RGaXhlZElFcy5DYXBhYmlsaXRpZXMgPSBDYXBhYmlsaXR5SW5mbzsKKwkJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLlJlcXVlc3RGaXhlZElFcy5MaXN0ZW5JbnRlcnZhbCA9IExpc3RlbkludHY7CisJCS8vIE9ubHkgcmVhc3NvY2lhdGUgbmVlZCB0aGlzCisJCS8vQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5Bc3NvY0luZm8uUmVxdWVzdEZpeGVkSUVzLkN1cnJlbnRBUEFkZHJlc3MsIEFwQWRkcik7CisJCXBBZC0+U3RhQ2ZnLkFzc29jSW5mby5PZmZzZXRSZXF1ZXN0SUVzID0gc2l6ZW9mKE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OKTsKKworICAgICAgICBOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMsIE1BWF9WSUVfTEVOKTsKKwkJLy8gRmlyc3QgYWRkIFNTSUQKKwkJVmFySWVzT2Zmc2V0ID0gMDsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCAmU3NpZEllLCAxKTsKKwkJVmFySWVzT2Zmc2V0ICs9IDE7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgJnBBZC0+TWxtZUF1eC5Tc2lkTGVuLCAxKTsKKwkJVmFySWVzT2Zmc2V0ICs9IDE7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKKwkJVmFySWVzT2Zmc2V0ICs9IHBBZC0+TWxtZUF1eC5Tc2lkTGVuOworCisJCS8vIFNlY29uZCBhZGQgU3VwcG9ydGVkIHJhdGVzCisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgJlN1cFJhdGVJZSwgMSk7CisJCVZhckllc09mZnNldCArPSAxOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsICZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwgMSk7CisJCVZhckllc09mZnNldCArPSAxOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsIHBBZC0+TWxtZUF1eC5TdXBSYXRlLCBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbik7CisJCVZhckllc09mZnNldCArPSBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbjsKKwkJLy8gRW5kIEFkZCBieSBKYW1lcworCisgICAgICAgIGlmICgocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KSAmJgorICAgICAgICAgICAgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IFRSVUUpKQorICAgICAgICAgICAgQ2FwYWJpbGl0eUluZm8gfD0gMHgwMTAwOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gU2VuZCBBU1NPQyByZXF1ZXN0Li4uXG4iKSk7CisJCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQXNzb2NIZHIsIFNVQlRZUEVfQVNTT0NfUkVRLCAwLCBBcEFkZHIsIEFwQWRkcik7CisKKwkJLy8gQnVpbGQgYmFzaWMgZnJhbWUgZmlyc3QKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAorCQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksCSZBc3NvY0hkciwKKwkJCQkJCSAgMiwJCQkJCQkmQ2FwYWJpbGl0eUluZm8sCisJCQkJCQkgIDIsCQkJCQkJJkxpc3RlbkludHYsCisJCQkJCQkgIDEsCQkJCQkJJlNzaWRJZSwKKwkJCQkJCSAgMSwJCQkJCQkmcEFkLT5NbG1lQXV4LlNzaWRMZW4sCisJCQkJCQkgIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCAJcEFkLT5NbG1lQXV4LlNzaWQsCisJCQkJCQkgIDEsCQkJCQkJJlN1cFJhdGVJZSwKKwkJCQkJCSAgMSwJCQkJCQkmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sCisJCQkJCQkgIHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLCAgcEFkLT5NbG1lQXV4LlN1cFJhdGUsCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKKworCQlpZiAocEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gIT0gMCkKKwkJeworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAmdG1wLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmRXh0UmF0ZUllLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4sCisJCQkJCQkJICBwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiwgIHBBZC0+TWxtZUF1eC5FeHRSYXRlLAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gdG1wOworCQl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJLy8gSFQKKwkJaWYgKChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuID4gMCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCisJCXsKKwkJCVVMT05HIFRtcExlbjsKKwkJCVVDSEFSIEh0TGVuOworCQkJVUNIQVIgQlJPQURDT01bNF0gPSB7MHgwLCAweDkwLCAweDRjLCAweDMzfTsKKwkJCWlmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJQcmVOSHQgPT0gVFJVRSkKKwkJCXsKKwkJCQlIdExlbiA9IFNJWkVfSFRfQ0FQX0lFICsgNDsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcExlbiwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmV3BhSWUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0TGVuLAorCQkJCQkJCSAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCUk9BRENPTVswXSwKKwkJCQkJCQkgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwgICAgICAgICAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQl9CisJCQllbHNlCisJCQl7CisjaWZkZWYgUlRfQklHX0VORElBTgorCQkgICAgICAgIEhUX0NBUEFCSUxJVFlfSUUgSHRDYXBhYmlsaXR5VG1wOworI2VuZGlmCisKKyNpZm5kZWYgUlRfQklHX0VORElBTgorCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wTGVuLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcEllLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJCSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLCAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkoJkh0Q2FwYWJpbGl0eVRtcCwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeSgmSHRDYXBhYmlsaXR5VG1wLCAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbik7CisgICAgICAgIAkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSk7CisgICAgICAgIAkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSk7CisKKyAgICAgICAgCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgJlRtcExlbiwKKyAgICAgICAgCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0Q2FwSWUsCisgICAgICAgIAkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLAorICAgICAgICAJCQkJCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwmSHRDYXBhYmlsaXR5VG1wLAorICAgICAgICAJCQkJCQkJRU5EX09GX0FSR1MpOworI2VuZGlmCisJCQl9CisJCQlGcmFtZUxlbiArPSBUbXBMZW47CisJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkvLyBhZGQgUmFsaW5rIHByb3ByaWV0YXJ5IElFIHRvIGluZm9ybSBBUCB0aGlzIFNUQSBpcyBnb2luZyB0byB1c2UgQUdHUkVHQVRJT04gb3IgUElHR1ktQkFDSytBR0dSRUdBVElPTgorCQkvLyBDYXNlIEk6IChBZ2dyZWdhdGlvbiArIFBpZ2d5LUJhY2spCisJCS8vIDEuIHVzZXIgZW5hYmxlIGFnZ3JlZ2F0aW9uLCBBTkQKKwkJLy8gMi4gTWFjIHN1cHBvcnQgcGlnZ3ktYmFjaworCQkvLyAzLiBBUCBhbm5vdWNlcyBpdCdzIFBJR0dZLUJBQ0srQUdHUkVHQVRJT04tY2FwYWJsZSBpbiBCRUFDT04KKwkJLy8gQ2FzZSBJSTogKEFnZ3JlZ2F0aW9uKQorCQkvLyAxLiB1c2VyIGVuYWJsZSBhZ2dyZWdhdGlvbiwgQU5ECisJCS8vIDIuIEFQIGFubm91Y2VzIGl0J3MgQUdHUkVHQVRJT04tY2FwYWJsZSBpbiBCRUFDT04KKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUpCisJCXsKKwkJCWlmICgocEFkLT5Db21tb25DZmcuYlBpZ2d5QmFja0NhcGFibGUpICYmICgocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgJiAweDAwMDAwMDAzKSA9PSAzKSkKKwkJCXsKKwkJCQlVTE9ORyBUbXBMZW47CisJCQkJVUNIQVIgUmFsaW5rSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDAzLCAweDAwLCAweDAwLCAweDAwfTsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLCAgICAgICAgICAgJlRtcExlbiwKKwkJCQkJCQkJICA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFsaW5rSWUsCisJCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJCX0KKwkJCWVsc2UgaWYgKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICYgMHgwMDAwMDAwMSkKKwkJCXsKKwkJCQlVTE9ORyBUbXBMZW47CisJCQkJVUNIQVIgUmFsaW5rSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDAxLCAweDAwLCAweDAwLCAweDAwfTsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLCAgICAgICAgICAgJlRtcExlbiwKKwkJCQkJCQkJICA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFsaW5rSWUsCisJCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCVVMT05HIFRtcExlbjsKKwkJCVVDSEFSIFJhbGlua0llWzldID0ge0lFX1ZFTkRPUl9TUEVDSUZJQywgNywgMHgwMCwgMHgwYywgMHg0MywgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMH07CisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLAkJICZUbXBMZW4sCisJCQkJCQkJICA5LAkJCQkJCSBSYWxpbmtJZSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJfQorCisJCWlmIChwQWQtPk1sbWVBdXguQVBFZGNhUGFybS5iVmFsaWQpCisJCXsKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgJiYgcEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlKQorCQkJeworCQkJCVFCU1NfU1RBX0lORk9fUEFSTSBRb3NJbmZvOworCisJCQkJTmRpc1plcm9NZW1vcnkoJlFvc0luZm8sIHNpemVvZihRQlNTX1NUQV9JTkZPX1BBUk0pKTsKKwkJCQlRb3NJbmZvLlVBUFNEX0FDX0JFID0gcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CRTsKKwkJCQlRb3NJbmZvLlVBUFNEX0FDX0JLID0gcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CSzsKKwkJCQlRb3NJbmZvLlVBUFNEX0FDX1ZJID0gcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WSTsKKwkJCQlRb3NJbmZvLlVBUFNEX0FDX1ZPID0gcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WTzsKKwkJCQlRb3NJbmZvLk1heFNQTGVuZ3RoID0gcEFkLT5Db21tb25DZmcuTWF4U1BMZW5ndGg7CisJCQkJV21lSWVbOF0gfD0gKihQVUNIQVIpJlFvc0luZm87CisJCQl9CisJCQllbHNlCisJCQl7CisgICAgICAgICAgICAgICAgLy8gVGhlIFBhcmFtZXRlciBTZXQgQ291bnQgaXMgc2V0IHRvIKGnMKGoIGluIHRoZSBhc3NvY2lhdGlvbiByZXF1ZXN0IGZyYW1lcworICAgICAgICAgICAgICAgIC8vIFdtZUllWzhdIHw9IChwQWQtPk1sbWVBdXguQVBFZGNhUGFybS5FZGNhVXBkYXRlQ291bnQgJiAweDBmKTsKKwkJCX0KKworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAmdG1wLAorCQkJCQkJCSAgOSwgICAgICAgICAgICAgICAgICAgICAgICAmV21lSWVbMF0sCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSB0bXA7CisJCX0KKworCQkvLworCQkvLyBMZXQgV1BBKCMyMjEpIEVsZW1lbnQgSUQgb24gdGhlIGVuZCBvZiB0aGlzIGFzc29jaWF0aW9uIGZyYW1lLgorCQkvLyBPdGhlcndpc2Ugc29tZSBBUCB3aWxsIGZhaWwgb24gcGFyc2luZyBFbGVtZW50IElEIGFuZCBzZXQgc3RhdHVzIGZhaWwgb24gQXNzb2MgUnNwLgorCQkvLyBGb3IgZXhhbXBsZTogUHV0IFZlbmRvciBTcGVjaWZpYyBJRSBvbiB0aGUgZnJvbnQgb2YgV1BBIElFLgorCQkvLyBUaGlzIGhhcHBlbnMgb24gQVAgKE1vZGVsIE5vOkxpbmtzeXMgV1JLNTRHKQorCQkvLworCQlpZiAoKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8CisgICAgICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgfHwKKyAgICAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8CisgICAgICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKKwkJCSkKKyAgICAgICAgICAgICkKKwkJeworCQkJVUNIQVIgUlNOSWUgPSBJRV9XUEE7CisKKwkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgfHwKKyAgICAgICAgICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikpCisJCQl7CisJCQkJUlNOSWUgPSBJRV9XUEEyOworCQkJfQorCisgICAgICAgICAgICAJUlRNUE1ha2VSU05JRShwQWQsIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMsIEJTUzApOworCisgICAgICAgICAgICAvLyBDaGVjayBmb3IgV1BBIFBNSyBjYWNoZSBsaXN0CisJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKKwkJCXsKKwkJCSAgICBJTlQgICAgIGlkeDsKKyAgICAgICAgICAgICAgICBCT09MRUFOIEZvdW5kUE1LID0gRkFMU0U7CisJCQkJLy8gU2VhcmNoIGNoY2hlZCBQTUtJRCwgYXBwZW5kIGl0IGlmIGV4aXN0ZWQKKwkJCQlmb3IgKGlkeCA9IDA7IGlkeCA8IFBNS0lEX05POyBpZHgrKykKKwkJCQl7CisJCQkJCWlmIChOZGlzRXF1YWxNZW1vcnkoQXBBZGRyLCAmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4XS5CU1NJRCwgNikpCisJCQkJCXsKKwkJCQkJCUZvdW5kUE1LID0gVFJVRTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKEZvdW5kUE1LKQorCQkJCXsKKwkJCQkJLy8gU2V0IFBNSyBudW1iZXIKKwkJCQkJKihQVVNIT1JUKSAmcEFkLT5TdGFDZmcuUlNOX0lFW3BBZC0+U3RhQ2ZnLlJTTklFX0xlbl0gPSAxOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuUlNOX0lFW3BBZC0+U3RhQ2ZnLlJTTklFX0xlbiArIDJdLCAmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4XS5QTUtJRCwgMTYpOworICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5SU05JRV9MZW4gKz0gMTg7CisJCQkJfQorCQkJfQorCisJCQl7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAJCSZ0bXAsCisJCQkJICAgICAgICAgICAgICAJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlJTTkllLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5TdGFDZmcuUlNOSUVfTGVuLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAJcEFkLT5TdGFDZmcuUlNOSUVfTGVuLAkJCXBBZC0+U3RhQ2ZnLlJTTl9JRSwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgCUVORF9PRl9BUkdTKTsKKwkJCX0KKworCQkJRnJhbWVMZW4gKz0gdG1wOworCisJCQl7CisJICAgICAgICAgICAgLy8gQXBwZW5kIFZhcmlhYmxlIElFCisJICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCAmUlNOSWUsIDEpOworCSAgICAgICAgICAgIFZhckllc09mZnNldCArPSAxOworCSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgJnBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwgMSk7CisJICAgICAgICAgICAgVmFySWVzT2Zmc2V0ICs9IDE7CisJCQl9CisJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsIHBBZC0+U3RhQ2ZnLlJTTl9JRSwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKKwkJCVZhckllc09mZnNldCArPSBwQWQtPlN0YUNmZy5SU05JRV9MZW47CisKKwkJCS8vIFNldCBWYXJpYWJsZSBJRXMgTGVuZ3RoCisJCQlwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiA9IFZhckllc09mZnNldDsKKwkJfQorCisJCS8vIFdlIGhhdmUgdXBkYXRlIHRoYXQgYXQgUGVlckJlYWNvbkF0Sm9pblJlcXVlc3QoKQorCQlDa2lwRmxhZyA9IHBBZC0+U3RhQ2ZnLkNraXBGbGFnOworCQlpZiAoQ2tpcEZsYWcgIT0gMCkKKwkJeworCQkJTmRpc1plcm9NZW1vcnkoQ2tpcE5lZ290aWF0aW9uQnVmZmVyLCBDS0lQX05FR09USUFUSU9OX0xFTkdUSCk7CisJCQlDa2lwTmVnb3RpYXRpb25CdWZmZXJbMl0gPSAweDY2OworCQkJLy8gTWFrZSBpdCB0cnkgS1AgJiBNSUMsIHNpbmNlIHdlIGhhdmUgdG8gZm9sbG93IHRoZSByZXN1bHQgZnJvbSBBc3NvY1JzcAorCQkJQ2tpcE5lZ290aWF0aW9uQnVmZmVyWzhdID0gMHgxODsKKwkJCUNraXBOZWdvdGlhdGlvbkJ1ZmZlcltDS0lQX05FR09USUFUSU9OX0xFTkdUSCAtIDFdID0gMHgyMjsKKwkJCUNraXBGbGFnID0gMHgxODsKKworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAJJnRtcCwKKwkJCQkJCTEsCQkJCQkJICAJCSZBaXJvbmV0Q2tpcEllLAorCQkJCQkJMSwJCQkJCQkgIAkJJkFpcm9uZXRDa2lwTGVuLAorCQkJCQkJQWlyb25ldENraXBMZW4sIAkJICAJCUNraXBOZWdvdGlhdGlvbkJ1ZmZlciwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKwkJCUZyYW1lTGVuICs9IHRtcDsKKwkJfQorCisJCS8vIEFkZCBDQ1ggdjIgcmVxdWVzdCBpZiBDQ1gyIGFkbWluIHN0YXRlIGlzIG9uCisJCWlmIChwQWQtPlN0YUNmZy5DQ1hDb250cm9sLmZpZWxkLkVuYWJsZSA9PSAxKQorCQl7CisKKwkJCS8vCisJCQkvLyBBZGQgQWlyb25ldElQQWRkcmVzc0lFIGZvciBDaXNjbyBDQ1ggMi5YCisJCQkvLyBBZGQgQ0NYIFZlcnNpb24KKwkJCS8vCisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICZ0bXAsCisJCQkJCQkxLAkJCQkJCQkmQWlyb25ldElQQWRkcmVzc0lFLAorCQkJCQkJMSwJCQkJCQkJJkFpcm9uZXRJUEFkZHJlc3NMZW4sCisJCQkJCQlBaXJvbmV0SVBBZGRyZXNzTGVuLAkJQWlyb25ldElQQWRkcmVzc0J1ZmZlciwKKwkJCQkJCTEsCQkJCQkJCSZDY3gySWUsCisJCQkJCQkxLAkJCQkJCQkmQ2N4MkxlbiwKKwkJCQkJCUNjeDJMZW4sCQkJCSAgICBDY3gySWVJbmZvLAorCQkJCQkJRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gdG1wOworCisJCQkvLworCQkJLy8gQWRkIENpcGhlclN1aXRlIENDS00gb3IgTGVhcFRraXAgaWYgc2V0dGluZy4KKwkJCS8vCisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQlpZiAoTEVBUF9DQ0tNX09OKHBBZCkpCisJCQl7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAkmdG1wLAorCQkJCQkJQ2lwaGVyU3VpdGVDaXNjb0NDS01MZW4sCQlDaXBoZXJTdWl0ZUNpc2NvQ0NLTSwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKwkJCQlGcmFtZUxlbiArPSB0bXA7CisKKwkJCQkvLyBUaGlyZCBhZGQgUlNOCisJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCBDaXBoZXJTdWl0ZUNpc2NvQ0NLTSwgQ2lwaGVyU3VpdGVDaXNjb0NDS01MZW4pOyAvL1NhdmUgQ2lwaGVyU3VpdGUKKwkJCQlWYXJJZXNPZmZzZXQgKz0gQ2lwaGVyU3VpdGVDaXNjb0NDS01MZW47CisJCQl9CisJCQllbHNlIGlmICgocEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID09IENJU0NPX0F1dGhNb2RlTEVBUCkgJiYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSkKKwkJCXsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICZ0bXAsCisJCQkJCQlDaXBoZXJTdWl0ZUNDWFRraXBMZW4sCSAgICBDaXBoZXJTdWl0ZUNDWFRraXAsCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisJCQkJRnJhbWVMZW4gKz0gdG1wOworCisJCQkJLy8gVGhpcmQgYWRkIFJTTgorCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgQ2lwaGVyU3VpdGVDQ1hUa2lwLCBDaXBoZXJTdWl0ZUNDWFRraXBMZW4pOworCQkJCVZhckllc09mZnNldCArPSBDaXBoZXJTdWl0ZUNDWFRraXBMZW47CisJCQl9CisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisKKwkJCS8vIEFkZCBieSBKYW1lcyAwMy8wNi8yNworCQkJLy8gU2V0IFZhcmlhYmxlIElFcyBMZW5ndGgKKwkJCXBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuID0gVmFySWVzT2Zmc2V0OworCQkJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLlJlcXVlc3RJRUxlbmd0aCA9IFZhckllc09mZnNldDsKKworCQkJLy8gT2Zmc2V0UmVzcG9uc2VJRXMgZm9sbG93IFJlcVZhcklFCisJCQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uT2Zmc2V0UmVzcG9uc2VJRXMgPSBzaXplb2YoTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04pICsgcEFkLT5TdGFDZmcuUmVxVmFySUVMZW47CisJCQkvLyBFbmQgQWRkIGJ5IEphbWVzCisJCX0KKworCisJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LkFzc29jVGltZXIsIFRpbWVvdXQpOworCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX1dBSVRfUlNQOworCX0KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFTU09DIC0gTWxtZUFzc29jUmVxQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxlZC4gQlVHISEhISEhIFxuIikpOworCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJCVN0YXR1cyA9IE1MTUVfSU5WQUxJRF9GT1JNQVQ7CisJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwl9CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQltbG1lIHJlYXNzb2MgcmVxIGhhbmRsaW5nIHByb2NlZHVyZQorCVBhcmFtZXRlcnM6CisJCUVsZW0gLQorCVByZToKKwkJLSMgU1NJRCAgKEFkYXB0ZXItPlN0YUNmZy5zc2lkW10pCisJCS0jIEJTU0lEIChBUCBhZGRyZXNzLCBBZGFwdGVyLT5TdGFDZmcuYnNzaWQpCisJCS0jIFN1cHBvcnRlZCByYXRlcyAoQWRhcHRlci0+U3RhQ2ZnLnN1cHBvcnRlZF9yYXRlc1tdKQorCQktIyBTdXBwb3J0ZWQgcmF0ZXMgbGVuZ3RoIChBZGFwdGVyLT5TdGFDZmcuc3VwcG9ydGVkX3JhdGVzX2xlbikKKwkJLSMgVHggcG93ZXIgKEFkYXB0ZXItPlN0YUNmZy50eF9wb3dlcikKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lUmVhc3NvY1JlcUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVUNIQVIJCQlBcEFkZHJbNl07CisJSEVBREVSXzgwMl8xMQlSZWFzc29jSGRyOworCVVDSEFSCQkJQ2N4MkxlbiA9IDU7CisJVUNIQVIJCQlXbWVJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDB4MDcsIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDB9OworCVVTSE9SVAkJCUNhcGFiaWxpdHlJbmZvLCBMaXN0ZW5JbnR2OworCVVMT05HCQkJVGltZW91dDsKKwlVTE9ORwkJCUZyYW1lTGVuID0gMDsKKwlCT09MRUFOCQkJVGltZXJDYW5jZWxsZWQ7CisJTkRJU19TVEFUVVMJCU5TdGF0dXM7CisJVUxPTkcJCQl0bXA7CisJUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisvL0NDWCAyLlgKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwlVQ0hBUgkJCUNraXBGbGFnOworCVVDSEFSCQkJQ2tpcE5lZ290aWF0aW9uQnVmZmVyW0NLSVBfTkVHT1RJQVRJT05fTEVOR1RIXTsKKwlVQ0hBUgkJCUFpcm9uZXRDa2lwSWUgPSBJRV9BSVJPTkVUX0NLSVA7CisJVUNIQVIJCQlBaXJvbmV0Q2tpcExlbiA9IENLSVBfTkVHT1RJQVRJT05fTEVOR1RIOworCVVDSEFSCQkJQWlyb25ldElQQWRkcmVzc0lFID0gSUVfQUlST05FVF9JUEFERFJFU1M7CisJVUNIQVIJCQlBaXJvbmV0SVBBZGRyZXNzTGVuID0gQUlST05FVF9JUEFERFJFU1NfTEVOR1RIOworCVVDSEFSCQkJQWlyb25ldElQQWRkcmVzc0J1ZmZlcltBSVJPTkVUX0lQQUREUkVTU19MRU5HVEhdID0gezB4MDAsIDB4NDAsIDB4OTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDB9OworCVVDSEFSCQkJQWlyb25ldENDS01SZWFzc29jSUUgPSBJRV9BSVJPTkVUX0NDS01SRUFTU09DOworCVVDSEFSCQkJQWlyb25ldENDS01SZWFzc29jTGVuID0gQUlST05FVF9DQ0tNUkVBU1NPQ19MRU5HVEg7CisJVUNIQVIJCQlBaXJvbmV0Q0NLTVJlYXNzb2NCdWZmZXJbQUlST05FVF9DQ0tNUkVBU1NPQ19MRU5HVEhdOworCVVDSEFSCQkJQWlyb25ldE9VSVtdID0gezB4MDAsIDB4NDAsIDB4OTYsIDB4MDB9OworCVVDSEFSCQkJTUlDTU5bMTZdOworCVVDSEFSCQkJQ2FsY01pY0J1ZmZlcls4MF07CisJVUxPTkcJCQlDYWxjTWljQnVmZmVyTGVuID0gMDsKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKwlVU0hPUlQJCQlTdGF0dXM7CisKKwkvLyBCbG9jayBhbGwgYXV0aGVudGljYXRpb24gcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QKKwlpZiAocEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPT0gVFJVRSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gQmxvY2sgUmVBc3NvYyByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZCFcbiIpKTsKKwkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCQlTdGF0dXMgPSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUOworCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwl9CisJLy8gdGhlIHBhcmFtZXRlcnMgYXJlIHRoZSBzYW1lIGFzIHRoZSBhc3NvY2lhdGlvbgorCWVsc2UgaWYoTWxtZUFzc29jUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFwQWRkciwgJkNhcGFiaWxpdHlJbmZvLCAmVGltZW91dCwgJkxpc3RlbkludHYpKQorCXsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCisJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBU1NPQyAtIE1sbWVSZWFzc29jUmVxQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJCVN0YXR1cyA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9SRUFTU09DX0NPTkYsIDIsICZTdGF0dXMpOworCQkJcmV0dXJuOworCQl9CisKKwkJQ09QWV9NQUNfQUREUihwQWQtPk1sbWVBdXguQnNzaWQsIEFwQWRkcik7CisKKwkJLy8gbWFrZSBmcmFtZSwgdXNlIGJzc2lkIGFzIHRoZSBBUCBhZGRyZXNzPz8KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBTZW5kIFJFLUFTU09DIHJlcXVlc3QuLi5cbiIpKTsKKwkJTWd0TWFjSGVhZGVySW5pdChwQWQsICZSZWFzc29jSGRyLCBTVUJUWVBFX1JFQVNTT0NfUkVRLCAwLCBBcEFkZHIsIEFwQWRkcik7CisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAorCQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksICAgICZSZWFzc29jSGRyLAorCQkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgICAgICZDYXBhYmlsaXR5SW5mbywKKwkJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAmTGlzdGVuSW50diwKKwkJCQkJCSAgTUFDX0FERFJfTEVOLCAgICAgICAgICAgICBBcEFkZHIsCisJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRJZSwKKwkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5NbG1lQXV4LlNzaWRMZW4sCisJCQkJCQkgIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCAgICAgcEFkLT5NbG1lQXV4LlNzaWQsCisJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlN1cFJhdGVJZSwKKwkJCQkJCSAgMSwJCQkJCQkmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sCisJCQkJCQkgIHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLCAgcEFkLT5NbG1lQXV4LlN1cFJhdGUsCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKKworCQlpZiAocEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gIT0gMCkKKwkJeworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgJnRtcCwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlSWUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4sCisJCQkJCQkJICBwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiwJICAgIHBBZC0+TWxtZUF1eC5FeHRSYXRlLAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gdG1wOworCQl9CisKKwkJaWYgKHBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLmJWYWxpZCkKKwkJeworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSAmJiBwQWQtPk1sbWVBdXguQVBFZGNhUGFybS5iQVBTRENhcGFibGUpCisJCQl7CisJCQkJUUJTU19TVEFfSU5GT19QQVJNIFFvc0luZm87CisKKwkJCQlOZGlzWmVyb01lbW9yeSgmUW9zSW5mbywgc2l6ZW9mKFFCU1NfU1RBX0lORk9fUEFSTSkpOworCQkJCVFvc0luZm8uVUFQU0RfQUNfQkUgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JFOworCQkJCVFvc0luZm8uVUFQU0RfQUNfQksgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JLOworCQkJCVFvc0luZm8uVUFQU0RfQUNfVkkgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZJOworCQkJCVFvc0luZm8uVUFQU0RfQUNfVk8gPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZPOworCQkJCVFvc0luZm8uTWF4U1BMZW5ndGggPSBwQWQtPkNvbW1vbkNmZy5NYXhTUExlbmd0aDsKKwkJCQlXbWVJZVs4XSB8PSAqKFBVQ0hBUikmUW9zSW5mbzsKKwkJCX0KKworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAmdG1wLAorCQkJCQkJCSAgOSwgICAgICAgICAgICAgICAgICAgICAgICAmV21lSWVbMF0sCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSB0bXA7CisJCX0KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkvLyBIVAorCQlpZiAoKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPiAwKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKKwkJeworCQkJVUxPTkcgVG1wTGVuOworCQkJVUNIQVIgSHRMZW47CisJCQlVQ0hBUiBCUk9BRENPTVs0XSA9IHsweDAsIDB4OTAsIDB4NGMsIDB4MzN9OworCQkJaWYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYlByZU5IdCA9PSBUUlVFKQorCQkJeworCQkJCUh0TGVuID0gU0laRV9IVF9DQVBfSUUgKyA0OworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wTGVuLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZXcGFJZSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRMZW4sCisJCQkJCQkJICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkJST0FEQ09NWzBdLAorCQkJCQkJCSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLCAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcExlbiwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRDYXBJZSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwKKwkJCQkJCQkgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwgICAgICAgICAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQl9CisJCQlGcmFtZUxlbiArPSBUbXBMZW47CisJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkvLyBhZGQgUmFsaW5rIHByb3ByaWV0YXJ5IElFIHRvIGluZm9ybSBBUCB0aGlzIFNUQSBpcyBnb2luZyB0byB1c2UgQUdHUkVHQVRJT04gb3IgUElHR1ktQkFDSytBR0dSRUdBVElPTgorCQkvLyBDYXNlIEk6IChBZ2dyZWdhdGlvbiArIFBpZ2d5LUJhY2spCisJCS8vIDEuIHVzZXIgZW5hYmxlIGFnZ3JlZ2F0aW9uLCBBTkQKKwkJLy8gMi4gTWFjIHN1cHBvcnQgcGlnZ3ktYmFjaworCQkvLyAzLiBBUCBhbm5vdWNlcyBpdCdzIFBJR0dZLUJBQ0srQUdHUkVHQVRJT04tY2FwYWJsZSBpbiBCRUFDT04KKwkJLy8gQ2FzZSBJSTogKEFnZ3JlZ2F0aW9uKQorCQkvLyAxLiB1c2VyIGVuYWJsZSBhZ2dyZWdhdGlvbiwgQU5ECisJCS8vIDIuIEFQIGFubm91Y2VzIGl0J3MgQUdHUkVHQVRJT04tY2FwYWJsZSBpbiBCRUFDT04KKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUpCisJCXsKKwkJCWlmICgocEFkLT5Db21tb25DZmcuYlBpZ2d5QmFja0NhcGFibGUpICYmICgocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgJiAweDAwMDAwMDAzKSA9PSAzKSkKKwkJCXsKKwkJCQlVTE9ORyBUbXBMZW47CisJCQkJVUNIQVIgUmFsaW5rSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDAzLCAweDAwLCAweDAwLCAweDAwfTsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLCAgICAgICAgICAgJlRtcExlbiwKKwkJCQkJCQkJICA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFsaW5rSWUsCisJCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJCX0KKwkJCWVsc2UgaWYgKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICYgMHgwMDAwMDAwMSkKKwkJCXsKKwkJCQlVTE9ORyBUbXBMZW47CisJCQkJVUNIQVIgUmFsaW5rSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDAxLCAweDAwLCAweDAwLCAweDAwfTsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLCAgICAgICAgICAgJlRtcExlbiwKKwkJCQkJCQkJICA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFsaW5rSWUsCisJCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCVVMT05HIFRtcExlbjsKKwkJCVVDSEFSIFJhbGlua0llWzldID0ge0lFX1ZFTkRPUl9TUEVDSUZJQywgNywgMHgwMCwgMHgwYywgMHg0MywgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMH07CisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLAkJICZUbXBMZW4sCisJCQkJCQkJICA5LAkJCQkJCSBSYWxpbmtJZSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJfQorI2lmZGVmIExFQVBfU1VQUE9SVAorCQlpZiAoTEVBUF9DQ0tNX09OKHBBZCkgJiYgKHBBZC0+U3RhQ2ZnLkNDS01MaW5rVXBGbGFnID09IFRSVUUpKQorCQl7CisJCQlDa2lwRmxhZyA9IHBBZC0+U3RhQ2ZnLkNraXBGbGFnOwkvLyBXZSBoYXZlIHVwZGF0ZSB0aGF0IGF0IFBlZXJCZWFjb25BdEpvaW5SZXF1ZXN0KCkKKwkJCWlmIChDa2lwRmxhZyAhPSAwKQorCQkJeworCQkJCU5kaXNaZXJvTWVtb3J5KENraXBOZWdvdGlhdGlvbkJ1ZmZlciwgQ0tJUF9ORUdPVElBVElPTl9MRU5HVEgpOworCQkJCUNraXBOZWdvdGlhdGlvbkJ1ZmZlclsyXSA9IDB4NjY7CisJCQkJLy8gTWFrZSBpdCB0cnkgS1AgJiBNSUMsIHNpbmNlIHdlIGhhdmUgdG8gZm9sbG93IHRoZSByZXN1bHQgZnJvbSBBc3NvY1JzcAorCQkJCUNraXBOZWdvdGlhdGlvbkJ1ZmZlcls4XSA9IDB4MTg7CisJCQkJQ2tpcE5lZ290aWF0aW9uQnVmZmVyW0NLSVBfTkVHT1RJQVRJT05fTEVOR1RIIC0gMV0gPSAweDIyOworCisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAgICZ0bXAsCisJCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBaXJvbmV0Q2tpcEllLAorCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWlyb25ldENraXBMZW4sCisJCQkJCQkJCQlBaXJvbmV0Q2tpcExlbiwgICAgICAgICAgICAgICAgIENraXBOZWdvdGlhdGlvbkJ1ZmZlciwKKwkJCQkJCQkJCUVORF9PRl9BUkdTKTsKKwkJCQlGcmFtZUxlbiArPSB0bXA7CisJCQl9CisKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJnRtcCwKKwkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBaXJvbmV0SVBBZGRyZXNzSUUsCisJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWlyb25ldElQQWRkcmVzc0xlbiwKKwkJCQkJCQlBaXJvbmV0SVBBZGRyZXNzTGVuLCAgICAgICAgICAgIEFpcm9uZXRJUEFkZHJlc3NCdWZmZXIsCisJCQkJCQkJRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gdG1wOworCisJCQkvLworCQkJLy8gVGhlIFJOIGlzIGluY3JlbWVudGVkIGJlZm9yZSBlYWNoIHJlYXNzb2NpYXRpb24gcmVxdWVzdC4KKwkJCS8vCisJCQlwQWQtPlN0YUNmZy5DQ0tNUk4rKzsKKwkJCS8vCisJCQkvLyBDYWxjdWxhdGUgTUlDID0gaG1hYy1tZDUoa3JrLCBTVEEtSUR8QlNTSUR8UlNOSUV8VFNGfFJOKTsKKwkJCS8vCisJCQlDT1BZX01BQ19BRERSKENhbGNNaWNCdWZmZXIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworCQkJQ2FsY01pY0J1ZmZlckxlbiA9IE1BQ19BRERSX0xFTjsKKwkJCUNPUFlfTUFDX0FERFIoQ2FsY01pY0J1ZmZlciArIENhbGNNaWNCdWZmZXJMZW4sIHBBZC0+TWxtZUF1eC5Cc3NpZCk7CisJCQlDYWxjTWljQnVmZmVyTGVuICs9IE1BQ19BRERSX0xFTjsKKwkJCU5kaXNNb3ZlTWVtb3J5KENhbGNNaWNCdWZmZXIgKyBDYWxjTWljQnVmZmVyTGVuLCBDaXBoZXJTdWl0ZUNpc2NvQ0NLTSwgQ2lwaGVyU3VpdGVDaXNjb0NDS01MZW4pOworCQkJQ2FsY01pY0J1ZmZlckxlbiArPSBDaXBoZXJTdWl0ZUNpc2NvQ0NLTUxlbjsKKwkJCU5kaXNNb3ZlTWVtb3J5KENhbGNNaWNCdWZmZXIgKyBDYWxjTWljQnVmZmVyTGVuLCAoUFVDSEFSKSAmcEFkLT5TdGFDZmcuQ0NLTUJlYWNvbkF0Sm9pblRpbWVTdGFtcCwgc2l6ZW9mKHBBZC0+U3RhQ2ZnLkNDS01CZWFjb25BdEpvaW5UaW1lU3RhbXApKTsKKwkJCUNhbGNNaWNCdWZmZXJMZW4gKz0gc2l6ZW9mKHBBZC0+U3RhQ2ZnLkNDS01CZWFjb25BdEpvaW5UaW1lU3RhbXApOworCQkJTmRpc01vdmVNZW1vcnkoQ2FsY01pY0J1ZmZlciArIENhbGNNaWNCdWZmZXJMZW4sIChQVUNIQVIpJnBBZC0+U3RhQ2ZnLkNDS01STiwgc2l6ZW9mKHBBZC0+U3RhQ2ZnLkNDS01STikpOworCQkJQ2FsY01pY0J1ZmZlckxlbiArPSBzaXplb2YocEFkLT5TdGFDZmcuQ0NLTVJOKTsKKwkJCWhtYWNfbWQ1KHBBZC0+U3RhQ2ZnLktSSywgTEVOX0VBUF9NSUNLLCBDYWxjTWljQnVmZmVyLCBDYWxjTWljQnVmZmVyTGVuLCBNSUNNTik7CisKKwkJCS8vCisJCQkvLyBmaWxsIHVwIENDS00gcmVhc3NvY2lhdGlvbiByZXF1ZXN0IGVsZW1lbnQKKwkJCS8vCisJCQlOZGlzTW92ZU1lbW9yeShBaXJvbmV0Q0NLTVJlYXNzb2NCdWZmZXIsIEFpcm9uZXRPVUksIDQpOworCQkJTmRpc01vdmVNZW1vcnkoQWlyb25ldENDS01SZWFzc29jQnVmZmVyICsgNCwgKFBVQ0hBUikmcEFkLT5TdGFDZmcuQ0NLTUJlYWNvbkF0Sm9pblRpbWVTdGFtcCwgOCk7CisJCQlOZGlzTW92ZU1lbW9yeShBaXJvbmV0Q0NLTVJlYXNzb2NCdWZmZXIgKyAxMiwgKFBVQ0hBUikgJnBBZC0+U3RhQ2ZnLkNDS01STiwgNCk7CisJCQlOZGlzTW92ZU1lbW9yeShBaXJvbmV0Q0NLTVJlYXNzb2NCdWZmZXIgKzE2LCBNSUNNTiwgOCk7CisKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJnRtcCwKKwkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAmQWlyb25ldENDS01SZWFzc29jSUUsCisJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgJkFpcm9uZXRDQ0tNUmVhc3NvY0xlbiwKKwkJCQkJCQlBaXJvbmV0Q0NLTVJlYXNzb2NMZW4sICBBaXJvbmV0Q0NLTVJlYXNzb2NCdWZmZXIsCisJCQkJCQkJRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gdG1wOworCisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICZ0bXAsCisJCQkJCQkJQ2lwaGVyU3VpdGVDaXNjb0NDS01MZW4sQ2lwaGVyU3VpdGVDaXNjb0NDS00sCisJCQkJCQkJRU5EX09GX0FSR1MpOworCQkJRnJhbWVMZW4gKz0gdG1wOworCQl9CisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisKKwkJLy8gQWRkIENDWCB2MiByZXF1ZXN0IGlmIENDWDIgYWRtaW4gc3RhdGUgaXMgb24KKwkJaWYgKHBBZC0+U3RhQ2ZnLkNDWENvbnRyb2wuZmllbGQuRW5hYmxlID09IDEpCisJCXsKKwkJCS8vCisJCQkvLyBBZGQgQ0NYIFZlcnNpb24KKwkJCS8vCisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICZ0bXAsCisJCQkJCQkxLAkJCQkJCQkmQ2N4MkllLAorCQkJCQkJMSwJCQkJCQkJJkNjeDJMZW4sCisJCQkJCQlDY3gyTGVuLAkJCQkgICAgQ2N4MkllSW5mbywKKwkJCQkJCUVORF9PRl9BUkdTKTsKKwkJCUZyYW1lTGVuICs9IHRtcDsKKwkJfQorCisJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LlJlYXNzb2NUaW1lciwgVGltZW91dCk7IC8qIGluIG1TZWMgKi8KKwkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBSRUFTU09DX1dBSVRfUlNQOworCX0KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFTU09DIC0gTWxtZVJlYXNzb2NSZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbGVkLiBCVUchISEhIFxuIikpOworCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJCVN0YXR1cyA9IE1MTUVfSU5WQUxJRF9GT1JNQVQ7CisJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9SRUFTU09DX0NPTkYsIDIsICZTdGF0dXMpOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlVcHBlciBsYXllciBpc3N1ZXMgZGlzYXNzb2MgcmVxdWVzdAorCVBhcmFtZXRlcnM6CisJCUVsZW0gLQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZURpc2Fzc29jUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlQTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUIHBEaXNhc3NvY1JlcTsKKwlIRUFERVJfODAyXzExICAgICAgICAgRGlzYXNzb2NIZHI7CisJUEhFQURFUl84MDJfMTEgICAgICAgIHBEaXNhc3NvY0hkcjsKKwlQVUNIQVIgICAgICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJVUxPTkcgICAgICAgICAgICAgICAgIEZyYW1lTGVuID0gMDsKKwlORElTX1NUQVRVUyAgICAgICAgICAgTlN0YXR1czsKKwlCT09MRUFOICAgICAgICAgICAgICAgVGltZXJDYW5jZWxsZWQ7CisJVUxPTkcgICAgICAgICAgICAgICAgIFRpbWVvdXQgPSAwOworCVVTSE9SVCAgICAgICAgICAgICAgICBTdGF0dXM7CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkvLyBzZW5kIERMUy1URUFSX0RPV04gbWVzc2FnZSwKKwlpZiAocEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJeworCQlVQ0hBUiBpOworCisJCS8vIHRlYXIgZG93biBsb2NhbCBkbHMgdGFibGUgZW50cnkKKwkJZm9yIChpPTA7IGk8TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQorCQl7CisJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSkKKwkJCXsKKwkJCQlSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJfQorCQl9CisKKwkJLy8gdGVhciBkb3duIHBlZXIgZGxzIHRhYmxlIGVudHJ5CisJCWZvciAoaT1NQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJCXsKKwkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpKQorCQkJeworCQkJCVJUTVBTZW5kRExTVGVhckRvd25GcmFtZShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19OT05FOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQl9CisJCX0KKwl9CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKwkvLyBza2lwIHNhbml0eSBjaGVjaworCXBEaXNhc3NvY1JlcSA9IChQTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKShFbGVtLT5Nc2cpOworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBNbG1lRGlzYXNzb2NSZXFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkXG4iKSk7CisJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJU3RhdHVzID0gTUxNRV9GQUlMX05PX1JFU09VUkNFOworCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfRElTQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CisJCXJldHVybjsKKwl9CisKKworCisJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguRGlzYXNzb2NUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gU2VuZCBESVNBU1NPQyByZXF1ZXN0W0JTU0lEOjolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAoUmVhc29uPSVkKVxuIiwKKwkJCQlwRGlzYXNzb2NSZXEtPkFkZHJbMF0sIHBEaXNhc3NvY1JlcS0+QWRkclsxXSwgcERpc2Fzc29jUmVxLT5BZGRyWzJdLAorCQkJCXBEaXNhc3NvY1JlcS0+QWRkclszXSwgcERpc2Fzc29jUmVxLT5BZGRyWzRdLCBwRGlzYXNzb2NSZXEtPkFkZHJbNV0sIHBEaXNhc3NvY1JlcS0+UmVhc29uKSk7CisJTWd0TWFjSGVhZGVySW5pdChwQWQsICZEaXNhc3NvY0hkciwgU1VCVFlQRV9ESVNBU1NPQywgMCwgcERpc2Fzc29jUmVxLT5BZGRyLCBwRGlzYXNzb2NSZXEtPkFkZHIpOwkvLyBwYXRjaCBwZWFwIHR0bHMgc3dpdGNoaW5nIGlzc3VlCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKwkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksJkRpc2Fzc29jSGRyLAorCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAmcERpc2Fzc29jUmVxLT5SZWFzb24sCisJCQkJCSAgRU5EX09GX0FSR1MpOworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCisJLy8gVG8gcGF0Y2ggSW5zdGFuY2UgYW5kIEJ1ZmZhbG8oTikgQVAKKwkvLyBEcml2ZXIgaGFzIHRvIHNlbmQgZGVhdXRoIHRvIEluc3RhbmNlIEFQLCBidXQgQnVmZmFsbyhOKSBuZWVkcyB0byBzZW5kIGRpc2Fzc29jIHRvIHJlc2V0IEF1dGhlbnRpY2F0b3IncyBzdGF0ZSBtYWNoaW5lCisJLy8gVGhlcmVmb3JlLCB3ZSBzZW5kIGJvdGggb2YgdGhlbS4KKwlwRGlzYXNzb2NIZHIgPSAoUEhFQURFUl84MDJfMTEpcE91dEJ1ZmZlcjsKKwlwRGlzYXNzb2NIZHItPkZDLlN1YlR5cGUgPSBTVUJUWVBFX0RFQVVUSDsKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwlwQWQtPlN0YUNmZy5EaXNhc3NvY1JlYXNvbiA9IFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORzsKKwlDT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkRpc2Fzc29jU3RhLCBwRGlzYXNzb2NSZXEtPkFkZHIpOworCisJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguRGlzYXNzb2NUaW1lciwgVGltZW91dCk7IC8qIGluIG1TZWMgKi8KKwlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IERJU0FTU09DX1dBSVRfUlNQOworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2lmbmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkKKwl7CisgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKyAgICAgICAgLy9zZW5kIGRpc2Fzc29jaWF0ZSBldmVudCB0byB3cGFfc3VwcGxpY2FudAorICAgICAgICBtZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisgICAgICAgIHdycXUuZGF0YS5mbGFncyA9IFJUX0RJU0FTU09DX0VWRU5UX0ZMQUc7CisgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgTlVMTCk7CisgICAgfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICB7CisgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKyAgICAgICAgbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBNQUNfQUREUl9MRU4pOworICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisgICAgfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlwZWVyIHNlbmRzIGFzc29jIHJzcCBiYWNrCisJUGFyYW1ldGVyczoKKwkJRWxtZSAtIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFBlZXJBc3NvY1JzcEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUICAgICAgICBDYXBhYmlsaXR5SW5mbywgU3RhdHVzLCBBaWQ7CisJVUNIQVIgICAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwgU3VwUmF0ZUxlbjsKKwlVQ0hBUiAgICAgICAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBFeHRSYXRlTGVuOworCVVDSEFSICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlCT09MRUFOICAgICAgIFRpbWVyQ2FuY2VsbGVkOworCVVDSEFSICAgICAgICAgQ2tpcEZsYWc7CisJRURDQV9QQVJNICAgICBFZGNhUGFybTsKKwlIVF9DQVBBQklMSVRZX0lFCQlIdENhcGFiaWxpdHk7CisJQUREX0hUX0lORk9fSUUJCUFkZEh0SW5mbzsJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCisJVUNIQVIJCQlIdENhcGFiaWxpdHlMZW47CisJVUNIQVIJCQlBZGRIdEluZm9MZW47CisJVUNIQVIJCQlOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKKworCWlmIChQZWVyQXNzb2NSc3BTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZDYXBhYmlsaXR5SW5mbywgJlN0YXR1cywgJkFpZCwgU3VwUmF0ZSwgJlN1cFJhdGVMZW4sIEV4dFJhdGUsICZFeHRSYXRlTGVuLAorCQkmSHRDYXBhYmlsaXR5LCZBZGRIdEluZm8sICZIdENhcGFiaWxpdHlMZW4sJkFkZEh0SW5mb0xlbiwmTmV3RXh0Q2hhbm5lbE9mZnNldCwgJkVkY2FQYXJtLCAmQ2tpcEZsYWcpKQorCXsKKwkJLy8gVGhlIGZyYW1lIGlzIGZvciBtZSA/CisJCWlmKE1BQ19BRERSX0VRVUFMKEFkZHIyLCBwQWQtPk1sbWVBdXguQnNzaWQpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQXNzb2NSc3BBY3Rpb24oKTpBU1NPQyAtIHJlY2VpdmUgQVNTT0NfUlNQIHRvIG1lIChzdGF0dXM9JWQpXG4iLCBTdGF0dXMpKTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJBc3NvY1JzcEFjdGlvbigpOk1hY1RhYmxlIFslZF0uQU1zZHVTaXplID0gJWQuIENsaWVudFN0YXR1c0ZsYWdzID0gMHglbHggXG4iLEVsZW0tPldjaWQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQU1zZHVTaXplLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkNsaWVudFN0YXR1c0ZsYWdzKSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5Bc3NvY1RpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQkJaWYoU3RhdHVzID09IE1MTUVfU1VDQ0VTUykKKwkJCXsKKwkJCQlVQ0hBUgkJCU1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSAwOworCQkJCVVDSEFSCQkJaWR4OworCisJCQkJLy8gc3VwcG9ydGVkIHJhdGVzIGFycmF5IG1heSBub3QgYmUgc29ydGVkLiBzb3J0IGl0IGFuZCBmaW5kIHRoZSBtYXhpbXVtIHJhdGUKKwkJCSAgICBmb3IgKGlkeD0wOyBpZHg8U3VwUmF0ZUxlbjsgaWR4KyspCisJCQkgICAgeworCQkJICAgICAgICBpZiAoTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA8IChTdXBSYXRlW2lkeF0gJiAweDdmKSkKKwkJCSAgICAgICAgICAgIE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSBTdXBSYXRlW2lkeF0gJiAweDdmOworCQkJICAgIH0KKworCQkJCWZvciAoaWR4PTA7IGlkeDxFeHRSYXRlTGVuOyBpZHgrKykKKwkJCSAgICB7CisJCQkgICAgICAgIGlmIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzIDwgKEV4dFJhdGVbaWR4XSAmIDB4N2YpKQorCQkJICAgICAgICAgICAgTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9IEV4dFJhdGVbaWR4XSAmIDB4N2Y7CisJCQkgICAgfQorCQkJCS8vIGdvIHRvIHByb2NlZHVyZSBsaXN0ZWQgb24gcGFnZSAzNzYKKwkJCQlBc3NvY1Bvc3RQcm9jKHBBZCwgQWRkcjIsIENhcGFiaWxpdHlJbmZvLCBBaWQsIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4sCisJCQkJCSZFZGNhUGFybSwgJkh0Q2FwYWJpbGl0eSwgSHRDYXBhYmlsaXR5TGVuLCAmQWRkSHRJbmZvKTsKKworCQkJCVN0YUFkZE1hY1RhYmxlRW50cnkocEFkLCAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXSwgTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcywgJkh0Q2FwYWJpbGl0eSwgSHRDYXBhYmlsaXR5TGVuLCBDYXBhYmlsaXR5SW5mbyk7CisKKwkJCQlwQWQtPlN0YUNmZy5Da2lwRmxhZyA9IENraXBGbGFnOworCQkJCWlmIChDa2lwRmxhZyAmIDB4MTgpCisJCQkJeworCQkJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5UeFNFUSwgNCk7CisJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlJ4U0VRLCA0KTsKKwkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuQ0tJUE1JQywgNCk7CisJCQkJCXBBZC0+U3RhQ2ZnLkdJVlswXSA9IFJhbmRvbUJ5dGUocEFkKTsKKwkJCQkJcEFkLT5TdGFDZmcuR0lWWzFdID0gUmFuZG9tQnl0ZShwQWQpOworCQkJCQlwQWQtPlN0YUNmZy5HSVZbMl0gPSBSYW5kb21CeXRlKHBBZCk7CisJCQkJCXBBZC0+U3RhQ2ZnLmJDa2lwT24gPSBUUlVFOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8Q0NYPiBwQWQtPlN0YUNmZy5Da2lwRmxhZyA9IDB4JTAyeFxuIiwgcEFkLT5TdGFDZmcuQ2tpcEZsYWcpKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gRmFpbGUgb24gQXNzb2NpYXRpb24sIHdlIG5lZWQgdG8gY2hlY2sgdGhlIHN0YXR1cyBjb2RlCisJCQkJLy8gSXMgdGhhdCBhIFJvZ3VlIEFQPworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJCWlmICgocEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID09IENJU0NPX0F1dGhNb2RlTEVBUCkgJiYgKFN0YXR1cyA9PSBNTE1FX0FMR19OT1RfU1VQUE9SVCkpCisJCQkJeyAvL1Bvc3NpYmx5IFJvZ3VlIEFQCisJCQkJCVJvZ3VlQXBUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+U3RhQ2ZnLlJvZ3VlQXBUYWIsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTEVBUF9SRUFTT05fSU5WQUxJRF9BVVRIKTsKKwkJCQl9CisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCQl9CisJCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBQZWVyQXNzb2NSc3BBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlwZWVyIHNlbmRzIHJlYXNzb2MgcnNwCisJUGFyYW1ldHJzOgorCQlFbGVtIC0gTUxNRSBtZXNzYWdlIGNudGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyUmVhc3NvY1JzcEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUICAgICAgQ2FwYWJpbGl0eUluZm87CisJVVNIT1JUICAgICAgU3RhdHVzOworCVVTSE9SVCAgICAgIEFpZDsKKwlVQ0hBUiAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwgU3VwUmF0ZUxlbjsKKwlVQ0hBUiAgICAgICBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwgRXh0UmF0ZUxlbjsKKwlVQ0hBUiAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOworCVVDSEFSICAgICAgIENraXBGbGFnOworCUJPT0xFQU4gICAgIFRpbWVyQ2FuY2VsbGVkOworCUVEQ0FfUEFSTSAgIEVkY2FQYXJtOworCUhUX0NBUEFCSUxJVFlfSUUJCUh0Q2FwYWJpbGl0eTsKKwlBRERfSFRfSU5GT19JRQkJQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKwlVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbjsKKwlVQ0hBUgkJCUFkZEh0SW5mb0xlbjsKKwlVQ0hBUgkJCU5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOworCisJaWYoUGVlckFzc29jUnNwU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIyLCAmQ2FwYWJpbGl0eUluZm8sICZTdGF0dXMsICZBaWQsIFN1cFJhdGUsICZTdXBSYXRlTGVuLCBFeHRSYXRlLCAmRXh0UmF0ZUxlbiwKKwkJCQkJCQkJJkh0Q2FwYWJpbGl0eSwJJkFkZEh0SW5mbywgJkh0Q2FwYWJpbGl0eUxlbiwgJkFkZEh0SW5mb0xlbiwmTmV3RXh0Q2hhbm5lbE9mZnNldCwgJkVkY2FQYXJtLCAmQ2tpcEZsYWcpKQorCXsKKwkJaWYoTUFDX0FERFJfRVFVQUwoQWRkcjIsIHBBZC0+TWxtZUF1eC5Cc3NpZCkpIC8vIFRoZSBmcmFtZSBpcyBmb3IgbWUgPworCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIHJlY2VpdmUgUkVBU1NPQ19SU1AgdG8gbWUgKHN0YXR1cz0lZClcbiIsIFN0YXR1cykpOworCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCisJCQlpZihTdGF0dXMgPT0gTUxNRV9TVUNDRVNTKQorCQkJeworCQkJCS8vIGdvIHRvIHByb2NlZHVyZSBsaXN0ZWQgb24gcGFnZSAzNzYKKwkJCQlBc3NvY1Bvc3RQcm9jKHBBZCwgQWRkcjIsIENhcGFiaWxpdHlJbmZvLCBBaWQsIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4sCisJCQkJCSAmRWRjYVBhcm0sICZIdENhcGFiaWxpdHksIEh0Q2FwYWJpbGl0eUxlbiwgJkFkZEh0SW5mbyk7CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworCisgICAgICAgICAgICAgICAgICAgIFNlbmRBc3NvY0lFc1RvV3BhU3VwcGxpY2FudChwQWQpOworICAgICAgICAgICAgICAgICAgICBtZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisgICAgICAgICAgICAgICAgICAgIHdycXUuZGF0YS5mbGFncyA9IFJUX0FTU09DX0VWRU5UX0ZMQUc7CisgICAgICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgTlVMTCk7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKyAgICAgICAgICAgICAgICAgICAgd2V4dF9ub3RpZnlfZXZlbnRfYXNzb2MocEFkKTsKKworICAgICAgICAgICAgICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweSh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBNQUNfQUREUl9MRU4pOworICAgICAgICAgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCQkJfQorCisJCQkvLworCQkJLy8gQ2lzY28gTGVhcCBDQ0tNIHN1cHBvcnRlZCBSZS1hc3NvY2lhdGlvbi4KKwkJCS8vCisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQlpZiAoTEVBUF9DQ0tNX09OKHBBZCkgJiYgKHBBZC0+U3RhQ2ZnLkNDS01MaW5rVXBGbGFnID09IFRSVUUpKQorCQkJeworCQkJCWlmIChDQ0tNQXNzb2NSc3BTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbikgPT0gVFJVRSkKKwkJCQl7CisJCQkJCXBBZC0+U3RhQ2ZnLkNraXBGbGFnID0gQ2tpcEZsYWc7CisJCQkJCWlmIChDa2lwRmxhZyAmIDB4MTgpCisJCQkJCXsKKwkJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlR4U0VRLCA0KTsKKwkJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlJ4U0VRLCA0KTsKKwkJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLkNLSVBNSUMsIDQpOworCQkJCQkJcEFkLT5TdGFDZmcuR0lWWzBdID0gUmFuZG9tQnl0ZShwQWQpOworCQkJCQkJcEFkLT5TdGFDZmcuR0lWWzFdID0gUmFuZG9tQnl0ZShwQWQpOworCQkJCQkJcEFkLT5TdGFDZmcuR0lWWzJdID0gUmFuZG9tQnl0ZShwQWQpOworCQkJCQkJcEFkLT5TdGFDZmcuYkNraXBPbiA9IFRSVUU7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8Q0NYPiBwQWQtPlN0YUNmZy5Da2lwRmxhZyA9IDB4JTAyeFxuIiwgcEFkLT5TdGFDZmcuQ2tpcEZsYWcpKTsKKwkJCQkJfQorCisJCQkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gQ0NLTUFzc29jUnNwU2FuaXR5KCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCQl7CisJCQkJLy8gQ2tpcEZsYWcgaXMgbm8gdXNlIGZvciByZWFzc29jaWF0ZQorCQkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwkJCX0KKwkJfQorCX0KKwllbHNlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIFBlZXJSZWFzc29jUnNwQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKKwl9CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlwcm9jZWR1cmVzIG9uIElFRUUgODAyLjExLzE5OTkgcC4zNzYKKwlQYXJhbWV0cnM6CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNzb2NQb3N0UHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgcEFkZHIyLAorCUlOIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKKwlJTiBVU0hPUlQgQWlkLAorCUlOIFVDSEFSIFN1cFJhdGVbXSwKKwlJTiBVQ0hBUiBTdXBSYXRlTGVuLAorCUlOIFVDSEFSIEV4dFJhdGVbXSwKKwlJTiBVQ0hBUiBFeHRSYXRlTGVuLAorCUlOIFBFRENBX1BBUk0gcEVkY2FQYXJtLAorCUlOIEhUX0NBUEFCSUxJVFlfSUUJCSpwSHRDYXBhYmlsaXR5LAorCUlOIFVDSEFSIEh0Q2FwYWJpbGl0eUxlbiwKKwlJTiBBRERfSFRfSU5GT19JRQkJKnBBZGRIdEluZm8pCS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQoreworCVVMT05HIElkeDsKKworCXBBZC0+TWxtZUF1eC5Cc3NUeXBlID0gQlNTX0lORlJBOworCUNPUFlfTUFDX0FERFIocEFkLT5NbG1lQXV4LkJzc2lkLCBwQWRkcjIpOworCXBBZC0+TWxtZUF1eC5BaWQgPSBBaWQ7CisJcEFkLT5NbG1lQXV4LkNhcGFiaWxpdHlJbmZvID0gQ2FwYWJpbGl0eUluZm8gJiBTVVBQT1JURURfQ0FQQUJJTElUWV9JTkZPOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCS8vIFNvbWUgSFQgQVAgbWlnaHQgbG9zdCBXTU0gSUUuIFdlIGFkZCBXTU0gb3Vyc2VsdmVzLiBiZWFjdWFzZSBIVCByZXF1aXJlcyBRb1Mgb24uCisJaWYgKChIdENhcGFiaWxpdHlMZW4gPiAwKSAmJiAocEVkY2FQYXJtLT5iVmFsaWQgPT0gRkFMU0UpKQorCXsKKwkJcEVkY2FQYXJtLT5iVmFsaWQgPSBUUlVFOworCQlwRWRjYVBhcm0tPkFpZnNuWzBdID0gMzsKKwkJcEVkY2FQYXJtLT5BaWZzblsxXSA9IDc7CisJCXBFZGNhUGFybS0+QWlmc25bMl0gPSAyOworCQlwRWRjYVBhcm0tPkFpZnNuWzNdID0gMjsKKworCQlwRWRjYVBhcm0tPkN3bWluWzBdID0gNDsKKwkJcEVkY2FQYXJtLT5Dd21pblsxXSA9IDQ7CisJCXBFZGNhUGFybS0+Q3dtaW5bMl0gPSAzOworCQlwRWRjYVBhcm0tPkN3bWluWzNdID0gMjsKKworCQlwRWRjYVBhcm0tPkN3bWF4WzBdID0gMTA7CisJCXBFZGNhUGFybS0+Q3dtYXhbMV0gPSAxMDsKKwkJcEVkY2FQYXJtLT5Dd21heFsyXSA9IDQ7CisJCXBFZGNhUGFybS0+Q3dtYXhbM10gPSAzOworCisJCXBFZGNhUGFybS0+VHhvcFswXSAgPSAwOworCQlwRWRjYVBhcm0tPlR4b3BbMV0gID0gMDsKKwkJcEVkY2FQYXJtLT5UeG9wWzJdICA9IDk2OworCQlwRWRjYVBhcm0tPlR4b3BbM10gID0gNDg7CisKKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0sIHBFZGNhUGFybSwgc2l6ZW9mKEVEQ0FfUEFSTSkpOworCisJLy8gZmlsdGVyIG91dCB1bi1zdXBwb3J0ZWQgcmF0ZXMKKwlwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiA9IFN1cFJhdGVMZW47CisJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlN1cFJhdGUsIFN1cFJhdGUsIFN1cFJhdGVMZW4pOworCVJUTVBDaGVja1JhdGVzKHBBZCwgcEFkLT5NbG1lQXV4LlN1cFJhdGUsICZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbik7CisKKwkvLyBmaWx0ZXIgb3V0IHVuLXN1cHBvcnRlZCByYXRlcworCXBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuID0gRXh0UmF0ZUxlbjsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguRXh0UmF0ZSwgRXh0UmF0ZSwgRXh0UmF0ZUxlbik7CisJUlRNUENoZWNrUmF0ZXMocEFkLCBwQWQtPk1sbWVBdXguRXh0UmF0ZSwgJnBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmIChIdENhcGFiaWxpdHlMZW4gPiAwKQorCXsKKwkJUlRNUENoZWNrSHQocEFkLCBCU1NJRF9XQ0lELCBwSHRDYXBhYmlsaXR5LCBwQWRkSHRJbmZvKTsKKwl9CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNzb2NQb3N0UHJvYz09PT4gIEFQLkFNc2R1U2l6ZSA9ICVkLiBDbGllbnRTdGF0dXNGbGFncyA9IDB4JWx4IFxuIiwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BTXNkdVNpemUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQ2xpZW50U3RhdHVzRmxhZ3MpKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzc29jUG9zdFByb2M9PT0+ICAgIChNbXBzPSVkLCBBbXNkdVNpemU9JWQsIClcbiIsCisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTW1wc01vZGUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQU1zZHVTaXplKSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkvLyBTZXQgTmV3IFdQQSBpbmZvcm1hdGlvbgorCUlkeCA9IEJzc1RhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIHBBZGRyMiwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpOworCWlmIChJZHggPT0gQlNTX05PVF9GT1VORCkKKwl7CisJCURCR1BSSU5UX0VSUigoIkFTU09DIC0gQ2FuJ3QgZmluZCBCU1MgYWZ0ZXIgcmVjZWl2aW5nIEFzc29jIHJlc3BvbnNlXG4iKSk7CisJfQorCWVsc2UKKwl7CisJCS8vIEluaXQgdmFyaWFibGUKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4gPSAwOworCQlOZGlzWmVyb01lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgTUFYX0xFTl9PRl9SU05JRSk7CisKKwkJLy8gU3RvcmUgYXBwcm9wcmlhdGUgUlNOX0lFIGZvciBXUEEgU00gbmVnb3RpYXRpb24gbGF0ZXIKKwkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpICYmIChwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5WYXJJRUxlbiAhPSAwKSkKKwkJeworCQkJUFVDSEFSICAgICAgICAgICAgICBwVklFOworCQkJVVNIT1JUICAgICAgICAgICAgICBsZW47CisJCQlQRUlEX1NUUlVDVCAgICAgICAgIHBFaWQ7CisKKwkJCXBWSUUgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5WYXJJRXM7CisJCQlsZW4JID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uVmFySUVMZW47CisKKwkJCXdoaWxlIChsZW4gPiAwKQorCQkJeworCQkJCXBFaWQgPSAoUEVJRF9TVFJVQ1QpIHBWSUU7CisJCQkJLy8gRm9yIFdQQS9XUEFQU0sKKwkJCQlpZiAoKHBFaWQtPkVpZCA9PSBJRV9XUEEpICYmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdQQV9PVUksIDQpKQorCQkJCQkmJiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBIHx8IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpCisJCQkJeworCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgcFZJRSwgKHBFaWQtPkxlbiArIDIpKTsKKwkJCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4gPSAocEVpZC0+TGVuICsgMik7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzc29jUG9zdFByb2M9PT0+IFN0b3JlIFJTTl9JRSBmb3IgV1BBIFNNIG5lZ290aWF0aW9uIFxuIikpOworCQkJCX0KKwkJCQkvLyBGb3IgV1BBMi9XUEEyUFNLCisJCQkJZWxzZSBpZiAoKHBFaWQtPkVpZCA9PSBJRV9SU04pICYmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQgKyAyLCBSU05fT1VJLCAzKSkKKwkJCQkJJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIgfHwgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCisJCQkJeworCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgcFZJRSwgKHBFaWQtPkxlbiArIDIpKTsKKwkJCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4gPSAocEVpZC0+TGVuICsgMik7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzc29jUG9zdFByb2M9PT0+IFN0b3JlIFJTTl9JRSBmb3IgV1BBMiBTTSBuZWdvdGlhdGlvbiBcbiIpKTsKKwkJCQl9CisKKwkJCQlwVklFICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJCQlsZW4gIC09IChwRWlkLT5MZW4gKyAyKTsKKwkJCX0KKwkJfQorCisJCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbiA9PSAwKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc3NvY1Bvc3RQcm9jPT09PiBubyBSU05fSUUgXG4iKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQloZXhfZHVtcCgiUlNOX0lFIiwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05fSUUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuKTsKKwkJfQorCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlsZWZ0IHBhcnQgb2YgSUVFRSA4MDIuMTEvMTk5OSBwLjM3NAorCVBhcmFtZXRlcnM6CisJCUVsZW0gLSBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyRGlzYXNzb2NBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlVU0hPUlQgICAgICAgIFJlYXNvbjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gUGVlckRpc2Fzc29jQWN0aW9uKClcbiIpKTsKKwlpZihQZWVyRGlzYXNzb2NTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZSZWFzb24pKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBQZWVyRGlzYXNzb2NBY3Rpb24oKSBSZWFzb24gPSAlZFxuIiwgUmVhc29uKSk7CisJCWlmIChJTkZSQV9PTihwQWQpICYmIE1BQ19BRERSX0VRVUFMKHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBBZGRyMikpCisJCXsKKworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQkJeworCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0RJU0FTU09DX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJCQl9CisKKworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJaWYgKHBBZC0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSA9PSBDSVNDT19BdXRoTW9kZUxFQVApCisJCQl7CisJCQkJLy8gQ2lzY29fTEVBUCBoYXMgc3RhcnQgYSB0aW1lcgorCQkJCS8vIFdlIHNob3VsZCBjYW5jZWwgaXQgaWYgdXNpbmcgTEVBUAorCQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuTGVhcEF1dGhUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJCQkvL0NoZWNrIGlzIGl0IG1hY2ggdGhlIExFQVAgQXV0aGVudGljYXRpb24gZmFpbGVkIGFzIHBvc3NpYmxlIGEgUm9ndWUgQVAKKwkJCQkvL29uIGl0J3MgUG9ydFNlY3VyZWQgbm90IGVxdWFsIHRvIFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEIHdoaWxlIHByb2Nlc3MgdGhlIEFzc29jaWF0aW9uLgorCQkJCWlmICgocEFkLT5NbG1lLkxlYXBNYWNoaW5lLkN1cnJTdGF0ZSAhPSBMRUFQX0lETEUpICYmIChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCAhPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkpCisJCQkJeworCQkJCQlSb2d1ZUFwVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlN0YUNmZy5Sb2d1ZUFwVGFiLCBBZGRyMiwgTEVBUF9SRUFTT05fQVVUSF9USU1FT1VUKTsKKwkJCQl9CisJCQl9CisjZW5kaWYJLy8gTEVBUF9TVVBQT1JUIC8vCisJCQkvLworCQkJLy8gR2V0IEN1cnJlbnQgU3lzdGVtIHRpbWUgYW5kIFR1cm4gb24gQWRqYWNlbnRBUFJlcG9ydAorCQkJLy8KKwkJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJnBBZC0+U3RhQ2ZnLkNDWEFkamFjZW50QVBMaW5rRG93blRpbWUpOworCQkJcEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUFJlcG9ydEZsYWcgPSBUUlVFOworCQkJTGlua0Rvd24ocEFkLCBUUlVFKTsKKwkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNpZm5kZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkKKwkJCXsKKyAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisgICAgICAgICAgICAgICAgLy9zZW5kIGRpc2Fzc29jaWF0ZSBldmVudCB0byB3cGFfc3VwcGxpY2FudAorICAgICAgICAgICAgICAgIG1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKyAgICAgICAgICAgICAgICB3cnF1LmRhdGEuZmxhZ3MgPSBSVF9ESVNBU1NPQ19FVkVOVF9GTEFHOworICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgTlVMTCk7CisgICAgICAgICAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKyAgICAgICAgICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7CisgICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOworICAgICAgICAgICAgfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJCX0KKwl9CisJZWxzZQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBQZWVyRGlzYXNzb2NBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOworCX0KKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCXdoYXQgdGhlIHN0YXRlIG1hY2hpbmUgd2lsbCBkbyBhZnRlciBhc3NvYyB0aW1lb3V0CisJUGFyYW1ldGVyczoKKwkJRWxtZSAtCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXNzb2NUaW1lb3V0QWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgIFN0YXR1czsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIEFzc29jVGltZW91dEFjdGlvblxuIikpOworCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwlTdGF0dXMgPSBNTE1FX1JFSl9USU1FT1VUOworCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQl3aGF0IHRoZSBzdGF0ZSBtYWNoaW5lIHdpbGwgZG8gYWZ0ZXIgcmVhc3NvYyB0aW1lb3V0CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUmVhc3NvY1RpbWVvdXRBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCAgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gUmVhc3NvY1RpbWVvdXRBY3Rpb25cbiIpKTsKKwlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJU3RhdHVzID0gTUxNRV9SRUpfVElNRU9VVDsKKwlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQl3aGF0IHRoZSBzdGF0ZSBtYWNoaW5lIHdpbGwgZG8gYWZ0ZXIgZGlzYXNzb2MgdGltZW91dAorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIERpc2Fzc29jVGltZW91dEFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUICBTdGF0dXM7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBEaXNhc3NvY1RpbWVvdXRBY3Rpb25cbiIpKTsKKwlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJU3RhdHVzID0gTUxNRV9TVUNDRVNTOworCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9ESVNBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKK30KKworVk9JRCBJbnZhbGlkU3RhdGVXaGVuQXNzb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCAgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gSW52YWxpZFN0YXRlV2hlbkFzc29jKHN0YXRlPSVsZCksIHJlc2V0IEFTU09DIHN0YXRlIG1hY2hpbmVcbiIsCisJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlKSk7CisJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CisJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOworfQorCitWT0lEIEludmFsaWRTdGF0ZVdoZW5SZWFzc29jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gSW52YWxpZFN0YXRlV2hlblJlYXNzb2Moc3RhdGU9JWxkKSwgcmVzZXQgQVNTT0Mgc3RhdGUgbWFjaGluZVxuIiwKKwkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUpKTsKKwlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKKwlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKK30KKworVk9JRCBJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2NpYXRlKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jKHN0YXRlPSVsZCksIHJlc2V0IEFTU09DIHN0YXRlIG1hY2hpbmVcbiIsCisJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlKSk7CisJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CisJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0RJU0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCXJpZ2h0IHBhcnQgb2YgSUVFRSA4MDIuMTEvMTk5OSBwYWdlIDM3NAorCU5vdGU6CisJCVRoaXMgZXZlbnQgc2hvdWxkIG5ldmVyIGNhdXNlIEFTU09DIHN0YXRlIG1hY2hpbmUgcGVyZm9ybSBzdGF0ZQorCQl0cmFuc2l0aW9uLCBhbmQgaGFzIG5vIHJlbGF0aW9uc2hpcCB3aXRoIENOVEwgbWFjaGluZS4gU28gd2Ugc2VwYXJhdGUKKwkJdGhpcyByb3V0aW5lIGFzIGEgc2VydmljZSBvdXRzaWRlIG9mIEFTU09DIHN0YXRlIHRyYW5zaXRpb24gdGFibGUuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQ2xzM2VyckFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgICAgICAgIHBBZGRyKQoreworCUhFQURFUl84MDJfMTEgICAgICAgICBEaXNhc3NvY0hkcjsKKwlQSEVBREVSXzgwMl8xMSAgICAgICAgcERpc2Fzc29jSGRyOworCVBVQ0hBUiAgICAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlVTE9ORyAgICAgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOworCU5ESVNfU1RBVFVTICAgICAgICAgICBOU3RhdHVzOworCVVTSE9SVCAgICAgICAgICAgICAgICBSZWFzb24gPSBSRUFTT05fQ0xTM0VSUjsKKworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJcmV0dXJuOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBDbGFzcyAzIEVycm9yLCBTZW5kIERJU0FTU09DIGZyYW1lXG4iKSk7CisJTWd0TWFjSGVhZGVySW5pdChwQWQsICZEaXNhc3NvY0hkciwgU1VCVFlQRV9ESVNBU1NPQywgMCwgcEFkZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsJLy8gcGF0Y2ggcGVhcCB0dGxzIHN3aXRjaGluZyBpc3N1ZQorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCisJCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCZEaXNhc3NvY0hkciwKKwkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgJlJlYXNvbiwKKwkJCQkJICBFTkRfT0ZfQVJHUyk7CisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisKKwkvLyBUbyBwYXRjaCBJbnN0YW5jZSBhbmQgQnVmZmFsbyhOKSBBUAorCS8vIERyaXZlciBoYXMgdG8gc2VuZCBkZWF1dGggdG8gSW5zdGFuY2UgQVAsIGJ1dCBCdWZmYWxvKE4pIG5lZWRzIHRvIHNlbmQgZGlzYXNzb2MgdG8gcmVzZXQgQXV0aGVudGljYXRvcidzIHN0YXRlIG1hY2hpbmUKKwkvLyBUaGVyZWZvcmUsIHdlIHNlbmQgYm90aCBvZiB0aGVtLgorCXBEaXNhc3NvY0hkciA9IChQSEVBREVSXzgwMl8xMSlwT3V0QnVmZmVyOworCXBEaXNhc3NvY0hkci0+RkMuU3ViVHlwZSA9IFNVQlRZUEVfREVBVVRIOworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCXBBZC0+U3RhQ2ZnLkRpc2Fzc29jUmVhc29uID0gUkVBU09OX0NMUzNFUlI7CisJQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5EaXNhc3NvY1N0YSwgcEFkZHIpOworfQorCisgLyoKKwkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkgRGVzY3JpcHRpb246CisJCSBTd2l0Y2ggYmV0d2VlbiBXRVAgYW5kIENLSVAgdXBvbiBuZXcgYXNzb2NpYXRpb24gdXAuCisJIFBhcmFtZXRlcnM6CisKKwkgSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgKi8KK1ZPSUQgU3dpdGNoQmV0d2VlbldlcEFuZENraXAoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJaW50ICAgICAgICAgICAgaTsKKwlTSEFSRURLRVlfTU9ERV9TVFJVQyAgY3NyMTsKKworCS8vIGlmIEtQIGlzIHJlcXVpcmVkLiBjaGFuZ2UgdGhlIENpcGhlckFsZyBpbiBoYXJkd2FyZSBzaGFyZCBrZXkgdGFibGUgZnJvbSBXRVAKKwkvLyB0byBDS0lQLiBlbHNlIHJlbWFpbiBhcyBXRVAKKwlpZiAocEFkLT5TdGFDZmcuYkNraXBPbiAmJiAocEFkLT5TdGFDZmcuQ2tpcEZsYWcgJiAweDEwKSkKKwl7CisJCS8vIG1vZGlmeSBoYXJkd2FyZSBrZXkgdGFibGUgc28gdGhhdCBNQUMgdXNlIGNvcnJlY3QgYWxnb3JpdGhtIHRvIGRlY3J5cHQgUlgKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSwgJmNzcjEud29yZCk7CisJCWlmIChjc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID09IENJUEhFUl9XRVA2NCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDY0OworCQllbHNlIGlmIChjc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID09IENJUEhFUl9XRVAxMjgpCisJCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gQ0lQSEVSX0NLSVAxMjg7CisKKwkJaWYgKGNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDY0KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IENJUEhFUl9DS0lQNjQ7CisJCWVsc2UgaWYgKGNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDEyOCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDEyODsKKworCQlpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9PSBDSVBIRVJfV0VQNjQpCisJCQljc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID0gQ0lQSEVSX0NLSVA2NDsKKwkJZWxzZSBpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9PSBDSVBIRVJfV0VQMTI4KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9IENJUEhFUl9DS0lQMTI4OworCisJCWlmIChjc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID09IENJUEhFUl9XRVA2NCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDY0OworCQllbHNlIGlmIChjc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID09IENJUEhFUl9XRVAxMjgpCisJCQljc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID0gQ0lQSEVSX0NLSVAxMjg7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFLCBjc3IxLndvcmQpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTd2l0Y2hCZXR3ZWVuV2VwQW5kQ2tpcDogbW9kaWZ5IEJTUzAgY2lwaGVyIHRvICVzXG4iLCBDaXBoZXJOYW1lW2NzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGddKSk7CisKKwkJLy8gbW9kaWZ5IHNvZnR3YXJlIGtleSB0YWJsZSBzbyB0aGF0IGRyaXZlciBjYW4gc3BlY2lmeSBjb3JyZWN0IGFsZ29yaXRobSBpbiBUWEQgdXBvbiBUWAorCQlmb3IgKGk9MDsgaTxTSEFSRV9LRVlfTlVNOyBpKyspCisJCXsKKwkJCWlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDY0KQorCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkNpcGhlckFsZyA9IENJUEhFUl9DS0lQNjQ7CisJCQllbHNlIGlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDEyOCkKKwkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDEyODsKKwkJfQorCX0KKworCS8vIGVsc2UgaWYgS1AgTk9UIGludXNlZC4gY2hhbmdlIHRoZSBDaXBoZXJBbGcgaW4gaGFyZHdhcmUgc2hhcmQga2V5IHRhYmxlIGZyb20gQ0tJUAorCS8vIHRvIFdFUC4KKwllbHNlCisJeworCQkvLyBtb2RpZnkgaGFyZHdhcmUga2V5IHRhYmxlIHNvIHRoYXQgTUFDIHVzZSBjb3JyZWN0IGFsZ29yaXRobSB0byBkZWNyeXB0IFJYCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UsICZjc3IxLndvcmQpOworCQlpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDY0KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJZWxzZSBpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDEyOCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCisJCWlmIChjc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQNjQpCisJCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQllbHNlIGlmIChjc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQMTI4KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisKKwkJaWYgKGNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPT0gQ0lQSEVSX0NLSVA2NCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCWVsc2UgaWYgKGNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPT0gQ0lQSEVSX0NLSVAxMjgpCisJCQljc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKworCQlpZiAoY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDY0KQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJZWxzZSBpZiAoY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDEyOCkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCisJCS8vIG1vZGlmeSBzb2Z0d2FyZSBrZXkgdGFibGUgc28gdGhhdCBkcml2ZXIgY2FuIHNwZWNpZnkgY29ycmVjdCBhbGdvcml0aG0gaW4gVFhEIHVwb24gVFgKKwkJZm9yIChpPTA7IGk8U0hBUkVfS0VZX05VTTsgaSsrKQorCQl7CisJCQlpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQNjQpCisJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQkJZWxzZSBpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQMTI4KQorCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisJCX0KKworCQkvLworCQkvLyBPbiBXUEEtTk9ORSwgbXVzdCB1cGRhdGUgQ2lwaGVyQWxnLgorCQkvLyBCZWNhdXNlIHRoZSBPSURfODAyXzExX1dFUF9TVEFUVVMgd2FzIGJlZW4gc2V0IGFmdGVyIE9JRF84MDJfMTFfQUREX0tFWQorCQkvLyBhbmQgQ2lwaGVyQWxnIHdpbGwgYmUgQ0lQSEVSX05PTkUgYnkgV2luZG93cyBaZXJvQ29uZmlnLgorCQkvLyBTbyB3ZSBuZWVkIHRvIHVwZGF0ZSBDaXBoZXJBbGcgYWZ0ZXIgY29ubmVjdC4KKwkJLy8KKwkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisJCXsKKwkJCWZvciAoaSA9IDA7IGkgPCBTSEFSRV9LRVlfTlVNOyBpKyspCisJCQl7CisJCQkJaWYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLktleUxlbiAhPSAwKQorCQkJCXsKKwkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQkJCQl7CisJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJCQkJeworCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJCQl9CisJCQl9CisKKwkJCWNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGc7CisJCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bMV0uQ2lwaGVyQWxnOworCQkJY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdWzJdLkNpcGhlckFsZzsKKwkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVszXS5DaXBoZXJBbGc7CisJCX0KKwkJUlRNUF9JT19XUklURTMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UsIGNzcjEud29yZCk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN3aXRjaEJldHdlZW5XZXBBbmRDa2lwOiBtb2RpZnkgQlNTMCBjaXBoZXIgdG8gJXNcbiIsIENpcGhlck5hbWVbY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZ10pKTsKKwl9Cit9CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCitWT0lEICAgIFNlbmRBc3NvY0lFc1RvV3BhU3VwcGxpY2FudCgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiBwQWQpCit7CisgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgIHVuc2lnbmVkIGNoYXIgY3VzdG9tW0lXX0NVU1RPTV9NQVhdID0gezB9OworCisgICAgaWYgKChwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiArIDE3KSA8PSBJV19DVVNUT01fTUFYKQorICAgIHsKKyAgICAgICAgc3ByaW50ZihjdXN0b20sICJBU1NPQ0lORk9fUmVxSUVzPSIpOworCSAgICBOZGlzTW92ZU1lbW9yeShjdXN0b20rMTcsIHBBZC0+U3RhQ2ZnLlJlcVZhcklFcywgcEFkLT5TdGFDZmcuUmVxVmFySUVMZW4pOworCSAgICBtZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisgICAgICAgIHdycXUuZGF0YS5sZW5ndGggPSBwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiArIDE3OworICAgICAgICB3cnF1LmRhdGEuZmxhZ3MgPSBSVF9SRVFJRV9FVkVOVF9GTEFHOworICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkNVU1RPTSwgJndycXUsIGN1c3RvbSk7CisKKyAgICAgICAgbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworICAgICAgICB3cnF1LmRhdGEuZmxhZ3MgPSBSVF9BU1NPQ0lORk9fRVZFTlRfRkxBRzsKKyAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBOVUxMKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiArIDE3ID4gTUFYX0NVU1RPTV9MRU5cbiIpKTsKKworICAgIHJldHVybjsKK30KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCitpbnQgd2V4dF9ub3RpZnlfZXZlbnRfYXNzb2MoCisJSU4gIFJUTVBfQURBUFRFUiAqcEFkKQoreworICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKyAgICBjaGFyIGN1c3RvbVtJV19DVVNUT01fTUFYXSA9IHswfTsKKworI2lmIFdJUkVMRVNTX0VYVCA+IDE3CisgICAgaWYgKHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuIDw9IElXX0NVU1RPTV9NQVgpCisgICAgeworICAgICAgICB3cnF1LmRhdGEubGVuZ3RoID0gcEFkLT5TdGFDZmcuUmVxVmFySUVMZW47CisgICAgICAgIG1lbWNweShjdXN0b20sIHBBZC0+U3RhQ2ZnLlJlcVZhcklFcywgcEFkLT5TdGFDZmcuUmVxVmFySUVMZW4pOworICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkFTU09DUkVRSUUsICZ3cnF1LCBjdXN0b20pOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuID4gTUFYX0NVU1RPTV9MRU5cbiIpKTsKKyNlbHNlCisgICAgaWYgKCgocEFkLT5TdGFDZmcuUmVxVmFySUVMZW4qMikgKyAxNykgPD0gSVdfQ1VTVE9NX01BWCkKKyAgICB7CisgICAgICAgIFVDSEFSICAgaWR4OworICAgICAgICB3cnF1LmRhdGEubGVuZ3RoID0gKHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuKjIpICsgMTc7CisgICAgICAgIHNwcmludGYoY3VzdG9tLCAiQVNTT0NJTkZPKFJlcUlFcz0iKTsKKyAgICAgICAgZm9yIChpZHg9MDsgaWR4PHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuOyBpZHgrKykKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGN1c3RvbSwgIiVzJTAyeCIsIGN1c3RvbSwgcEFkLT5TdGFDZmcuUmVxVmFySUVzW2lkeF0pOworICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkNVU1RPTSwgJndycXUsIGN1c3RvbSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiKHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuKjIpICsgMTcgPiBNQVhfQ1VTVE9NX0xFTlxuIikpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKKworfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKworQk9PTEVBTiBTdGFBZGRNYWNUYWJsZUVudHJ5KAorCUlOICBQUlRNUF9BREFQVEVSCQlwQWQsCisJSU4gIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5LAorCUlOICBVQ0hBUgkJCQlNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzLAorCUlOICBIVF9DQVBBQklMSVRZX0lFCSpwSHRDYXBhYmlsaXR5LAorCUlOICBVQ0hBUgkJCQlIdENhcGFiaWxpdHlMZW4sCisJSU4gIFVTSE9SVCAgICAgICAgCQlDYXBhYmlsaXR5SW5mbykKK3sKKwlVQ0hBUiAgICAgICAgICAgIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOworCisJaWYgKEFESE9DX09OKHBBZCkpCisJCUNMSUVOVF9TVEFUVVNfQ0xFQVJfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKTsKKworCXN3aXRjaCAoTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcykKKyAgICB7CisgICAgICAgIGNhc2UgMTA4OiBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV81NDsgICBicmVhazsKKyAgICAgICAgY2FzZSA5NjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzQ4OyAgIGJyZWFrOworICAgICAgICBjYXNlIDcyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMzY7ICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDg6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8yNDsgICBicmVhazsKKyAgICAgICAgY2FzZSAzNjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzE4OyAgIGJyZWFrOworICAgICAgICBjYXNlIDI0OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTI7ICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTg6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV85OyAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzY7ICAgIGJyZWFrOworICAgICAgICBjYXNlIDIyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7ICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTE6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV81XzU7ICBicmVhazsKKyAgICAgICAgY2FzZSA0OiAgIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzI7ICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6ICAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTsgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExRykgJiYgKE1heFN1cHBvcnRlZFJhdGUgPCBSQVRFX0ZJUlNUX09GRE1fUkFURSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCS8vIDExbiBvbmx5CisJaWYgKCgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzJfNEcpIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fNUcpKSYmIChIdENhcGFiaWxpdHlMZW4gPT0gMCkpCisJCXJldHVybiBGQUxTRTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCWlmICghcEVudHJ5KQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCWlmIChwRW50cnkpCisJeworCQlwRW50cnktPlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCWlmICgoTWF4U3VwcG9ydGVkUmF0ZSA8IFJBVEVfRklSU1RfT0ZETV9SQVRFKSB8fAorCQkJKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikpCisJCXsKKwkJCXBFbnRyeS0+UmF0ZUxlbiA9IDQ7CisJCQlpZiAoTWF4U3VwcG9ydGVkUmF0ZSA+PSBSQVRFX0ZJUlNUX09GRE1fUkFURSkKKwkJCQlNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsKKwkJfQorCQllbHNlCisJCQlwRW50cnktPlJhdGVMZW4gPSAxMjsKKworCQlwRW50cnktPk1heEhUUGh5TW9kZS53b3JkID0gMDsKKwkJcEVudHJ5LT5NaW5IVFBoeU1vZGUud29yZCA9IDA7CisJCXBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSAwOworCQlwRW50cnktPk1heFN1cHBvcnRlZFJhdGUgPSBNYXhTdXBwb3J0ZWRSYXRlOworCQlpZiAocEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlIDwgUkFURV9GSVJTVF9PRkRNX1JBVEUpCisJCXsKKwkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOworCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07CisJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKKwkJfQorCQlwRW50cnktPkNhcGFiaWxpdHlJbmZvID0gQ2FwYWJpbGl0eUluZm87CisJCUNMSUVOVF9TVEFUVVNfQ0xFQVJfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX0FHR1JFR0FUSU9OX0NBUEFCTEUpOworCQlDTElFTlRfU1RBVFVTX0NMRUFSX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19QSUdHWUJBQ0tfQ0FQQUJMRSk7CisJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJLy8gSWYgdGhpcyBFbnRyeSBzdXBwb3J0cyA4MDIuMTFuLCB1cGdyYWRlIHRvIEhUIHJhdGUuCisJaWYgKChIdENhcGFiaWxpdHlMZW4gIT0gMCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCisJeworCQlVQ0hBUglqLCBiaXRtYXNrOyAvL2ssYml0bWFzazsKKwkJQ0hBUiAgICBpOworCisJCWlmIChBREhPQ19PTihwQWQpKQorCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKTsKKwkJaWYgKChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uR0YpICYmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuR0YpKQorCQl7CisJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVEdSRUVORklFTEQ7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVE1JWDsKKwkJCXBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uTm9uR0YgPSBUUlVFOworCQkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID0gMTsKKwkJfQorCisJCWlmICgocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkNoYW5uZWxXaWR0aCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGgpKQorCQl7CisJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVz0gQldfNDA7CisJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjQwKSYocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3I0MCkpOworCQl9CisJCWVsc2UKKwkJeworCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKKwkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yMjApJihwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjIwKSk7CisJCQlwQWQtPk1hY1RhYi5mQW55U3RhdGlvbjIwT25seSA9IFRSVUU7CisJCX0KKworCQkvLyAzKjMKKwkJaWYgKHBBZC0+TUFDVmVyc2lvbiA+PSBSQUxJTktfMjg4M19WRVJTSU9OICYmIHBBZC0+TUFDVmVyc2lvbiA8IFJBTElOS18zMDcwX1ZFUlNJT04pCisJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5UeEJGID0gcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlR4QkY7CisKKwkJLy8gZmluZCBtYXggZml4ZWQgcmF0ZQorCQlmb3IgKGk9MjM7IGk+PTA7IGktLSkgLy8gMyozCisJCXsKKwkJCWogPSBpLzg7CisJCQliaXRtYXNrID0gKDE8PChpLShqKjgpKSk7CisJCQlpZiAoKHBBZC0+U3RhQ2ZnLkRlc2lyZWRIdFBoeUluZm8uTUNTU2V0W2pdICYgYml0bWFzaykgJiYgKHBIdENhcGFiaWxpdHktPk1DU1NldFtqXSAmIGJpdG1hc2spKQorCQkJeworCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IGk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoaT09MCkKKwkJCQlicmVhazsKKwkJfQorCisKKwkJaWYgKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICE9IE1DU19BVVRPKQorCQl7CisJCQlpZiAocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPT0gMzIpCisJCQl7CisJCQkJLy8gRml4IE1DUyBhcyBIVCBEdXBsaWNhdGVkIE1vZGUKKwkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IDE7CisJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRNSVg7CisJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IDA7CisJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IDA7CisJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gMzI7CisJCQl9CisJCQllbHNlIGlmIChwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPiBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTKQorCQkJeworCQkJCS8vIFNUQSBzdXBwb3J0cyBmaXhlZCBNQ1MKKwkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOworCQkJfQorCQl9CisKKwkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uUnhTVEJDICYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMpKTsKKwkJcEVudHJ5LT5NcGR1RGVuc2l0eSA9IHBIdENhcGFiaWxpdHktPkh0Q2FwUGFybS5NcGR1RGVuc2l0eTsKKwkJcEVudHJ5LT5NYXhSQW1wZHVGYWN0b3IgPSBwSHRDYXBhYmlsaXR5LT5IdENhcFBhcm0uTWF4UkFtcGR1RmFjdG9yOworCQlwRW50cnktPk1tcHNNb2RlID0gKFVDSEFSKXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5NaW1vUHM7CisJCXBFbnRyeS0+QU1zZHVTaXplID0gKFVDSEFSKXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5BTXNkdVNpemU7CisJCXBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSBwRW50cnktPk1heEhUUGh5TW9kZS53b3JkOworCisJCWlmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUgJiYgKHBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPT0gRkFMU0UpKQorCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX0FNU0RVX0lOVVNFRCk7CisJCWlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjIwKQorCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTIwX0NBUEFCTEUpOworCQlpZiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3I0MCkKKwkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0k0MF9DQVBBQkxFKTsKKwkJaWYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5UeFNUQkMpCisJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfVHhTVEJDX0NBUEFCTEUpOworCQlpZiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlJ4U1RCQykKKwkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19SeFNUQkNfQ0FQQUJMRSk7CisJCWlmIChwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8uUGx1c0hUQykKKwkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19IVENfQ0FQQUJMRSk7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5iUmRnICYmIHBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0KQorCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKTsKKwkJaWYgKHBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mby5NQ1NGZWVkYmFjayA9PSAweDAzKQorCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX01DU0ZFRURCQUNLX0NBUEFCTEUpOworCX0KKwllbHNlCisJeworCQlwQWQtPk1hY1RhYi5mQW55U3RhdGlvbklzTGVnYWN5ID0gVFJVRTsKKwl9CisKKwlOZGlzTW92ZU1lbW9yeSgmcEVudHJ5LT5IVENhcGFiaWxpdHksIHBIdENhcGFiaWxpdHksIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZDsKKwlwRW50cnktPkN1cnJUeFJhdGUgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7CisKKwkvLyBTZXQgYXNpYyBhdXRvIGZhbGwgYmFjaworCWlmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBUUlVFKQorCXsKKwkJUFVDSEFSCQkJCQlwVGFibGU7CisJCVVDSEFSCQkJCQlUYWJsZVNpemUgPSAwOworCisJCU1sbWVTZWxlY3RUeFJhdGVUYWJsZShwQWQsIHBFbnRyeSwgJnBUYWJsZSwgJlRhYmxlU2l6ZSwgJnBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4KTsKKwkJcEVudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCA9IFRSVUU7CisJfQorCWVsc2UKKwl7CisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERTsKKwkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKKwkJcEVudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCA9IEZBTFNFOworCisJCS8vIElmIHRoZSBsZWdhY3kgbW9kZSBpcyBzZXQsIG92ZXJ3cml0ZSB0aGUgdHJhbnNtaXQgc2V0dGluZyBvZiB0aGlzIGVudHJ5LgorCQlSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nKChVQ0hBUilwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlLCBwRW50cnkpOworCX0KKworCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwlwRW50cnktPlNzdCA9IFNTVF9BU1NPQzsKKwlwRW50cnktPkF1dGhTdGF0ZSA9IEFTX0FVVEhfT1BFTjsKKwlwRW50cnktPkF1dGhNb2RlID0gcEFkLT5TdGFDZmcuQXV0aE1vZGU7CisJcEVudHJ5LT5XZXBTdGF0dXMgPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7CisKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2lmbmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIGlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApCisgICAgeworICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisKKyAgICAgICAgU2VuZEFzc29jSUVzVG9XcGFTdXBwbGljYW50KHBBZCk7CisgICAgICAgIG1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKyAgICAgICAgd3JxdS5kYXRhLmZsYWdzID0gUlRfQVNTT0NfRVZFTlRfRkxBRzsKKyAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBOVUxMKTsKKyAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIHsKKyAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OworICAgICAgICB3ZXh0X25vdGlmeV9ldmVudF9hc3NvYyhwQWQpOworCisgICAgICAgIG1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKKyAgICAgICAgbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBwQWQtPk1sbWVBdXguQnNzaWQsIE1BQ19BRERSX0xFTik7CisgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKKworICAgIH0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCXJldHVybiBUUlVFOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhL2F1dGguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhL2F1dGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2ZiOGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvYXV0aC5jCkBAIC0wLDAgKzEsNDc0IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCWF1dGguYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUpvaG4JCTIwMDQtOS0zCQlwb3J0aW5nIGZyb20gUlQyNTAwCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIGF1dGhlbnRpY2F0ZSBzdGF0ZSBtYWNoaW5lIGluaXQsIGluY2x1ZGluZyBzdGF0ZSB0cmFuc2l0aW9uIGFuZCB0aW1lciBpbml0CisgICAgUGFyYW1ldGVyczoKKyAgICAgICAgU20gLSBwb2ludGVyIHRvIHRoZSBhdXRoIHN0YXRlIG1hY2hpbmUKKyAgICBOb3RlOgorICAgICAgICBUaGUgc3RhdGUgbWFjaGluZSBsb29rcyBsaWtlIHRoaXMKKworICAgICAgICAgICAgICAgICAgICAgICAgQVVUSF9SRVFfSURMRSAgICAgICAgICAgQVVUSF9XQUlUX1NFUTIgICAgICAgICAgICAgICAgICAgQVVUSF9XQUlUX1NFUTQKKyAgICBNVDJfTUxNRV9BVVRIX1JFUSAgIG1sbWVfYXV0aF9yZXFfYWN0aW9uICAgIGludmFsaWRfc3RhdGVfd2hlbl9hdXRoICAgICAgICAgIGludmFsaWRfc3RhdGVfd2hlbl9hdXRoCisgICAgTVQyX1BFRVJfQVVUSF9FVkVOICBkcm9wICAgICAgICAgICAgICAgICAgICBwZWVyX2F1dGhfZXZlbl9hdF9zZXEyX2FjdGlvbiAgICBwZWVyX2F1dGhfZXZlbl9hdF9zZXE0X2FjdGlvbgorICAgIE1UMl9BVVRIX1RJTUVPVVQgICAgRHJvcCAgICAgICAgICAgICAgICAgICAgYXV0aF90aW1lb3V0X2FjdGlvbiAgICAgICAgICAgICAgYXV0aF90aW1lb3V0X2FjdGlvbgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKwordm9pZCBBdXRoU3RhdGVNYWNoaW5lSW5pdCgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBTVEFURV9NQUNISU5FICpTbSwKKyAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCit7CisgICAgU3RhdGVNYWNoaW5lSW5pdChTbSwgVHJhbnMsIE1BWF9BVVRIX1NUQVRFLCBNQVhfQVVUSF9NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpRHJvcCwgQVVUSF9SRVFfSURMRSwgQVVUSF9NQUNISU5FX0JBU0UpOworCisgICAgLy8gdGhlIGZpcnN0IGNvbHVtbgorICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9SRVFfSURMRSwgTVQyX01MTUVfQVVUSF9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZUF1dGhSZXFBY3Rpb24pOworCisgICAgLy8gdGhlIHNlY29uZCBjb2x1bW4KKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfV0FJVF9TRVEyLCBNVDJfTUxNRV9BVVRIX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuQXV0aCk7CisgICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRMiwgTVQyX1BFRVJfQVVUSF9FVkVOLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJBdXRoUnNwQXRTZXEyQWN0aW9uKTsKKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfV0FJVF9TRVEyLCBNVDJfQVVUSF9USU1FT1VULCAoU1RBVEVfTUFDSElORV9GVU5DKUF1dGhUaW1lb3V0QWN0aW9uKTsKKworICAgIC8vIHRoZSB0aGlyZCBjb2x1bW4KKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfV0FJVF9TRVE0LCBNVDJfTUxNRV9BVVRIX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuQXV0aCk7CisgICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRNCwgTVQyX1BFRVJfQVVUSF9FVkVOLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJBdXRoUnNwQXRTZXE0QWN0aW9uKTsKKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfV0FJVF9TRVE0LCBNVDJfQVVUSF9USU1FT1VULCAoU1RBVEVfTUFDSElORV9GVU5DKUF1dGhUaW1lb3V0QWN0aW9uKTsKKworCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKEF1dGhUaW1lb3V0KSwgcEFkLCBGQUxTRSk7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYXQgdGltZXIgdGhyZWFkIHdoZW4gYXV0aCB0aW1lciBleHBpcmVzCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXV0aFRpbWVvdXQoCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisgICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworICAgIFJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQVVUSCAtIEF1dGhUaW1lb3V0XG4iKSk7CisKKwkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KKwkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQlyZXR1cm47CisKKwkvLyBzZW5kIGEgZGUtYXV0aCB0byByZXNldCBBUCdzIHN0YXRlIG1hY2hpbmUgKFBhdGNoIEFQLURpcjYzNSkKKwlpZiAocEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9PSBBVVRIX1dBSVRfU0VRMikKKwkJQ2xzMmVyckFjdGlvbihwQWQsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7CisKKworICAgIE1sbWVFbnF1ZXVlKHBBZCwgQVVUSF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9USU1FT1VULCAwLCBOVUxMKTsKKyAgICBSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7Cit9CisKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVBdXRoUmVxQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKyAgICBVQ0hBUiAgICAgICAgICAgICAgQWRkcls2XTsKKyAgICBVU0hPUlQgICAgICAgICAgICAgQWxnLCBTZXEsIFN0YXR1czsKKyAgICBVTE9ORyAgICAgICAgICAgICAgVGltZW91dDsKKyAgICBIRUFERVJfODAyXzExICAgICAgQXV0aEhkcjsKKyAgICBCT09MRUFOICAgICAgICAgICAgVGltZXJDYW5jZWxsZWQ7CisgICAgTkRJU19TVEFUVVMgICAgICAgIE5TdGF0dXM7CisgICAgUFVDSEFSICAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworICAgIFVMT05HICAgICAgICAgICAgICBGcmFtZUxlbiA9IDA7CisKKwkvLyBCbG9jayBhbGwgYXV0aGVudGljYXRpb24gcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QKKwlpZiAocEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPT0gVFJVRSkKKwl7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBCbG9jayBBdXRoIHJlcXVlc3QgZHVybmluZyBXUEEgYmxvY2sgcGVyaW9kIVxuIikpOworICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKKyAgICAgICAgU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKKyAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7CisJfQorICAgIGVsc2UgaWYoTWxtZUF1dGhSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkciwgJlRpbWVvdXQsICZBbGcpKQorICAgIHsKKyAgICAgICAgLy8gcmVzZXQgdGltZXIKKyAgICAgICAgUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworICAgICAgICBDT1BZX01BQ19BRERSKHBBZC0+TWxtZUF1eC5Cc3NpZCwgQWRkcik7CisgICAgICAgIHBBZC0+TWxtZUF1eC5BbGcgID0gQWxnOworICAgICAgICBTZXEgPSAxOworICAgICAgICBTdGF0dXMgPSBNTE1FX1NVQ0NFU1M7CisKKyAgICAgICAgTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKyAgICAgICAgaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gTWxtZUF1dGhSZXFBY3Rpb24oQWxnOiVkKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkXG4iLCBBbGcpKTsKKyAgICAgICAgICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworICAgICAgICAgICAgU3RhdHVzID0gTUxNRV9GQUlMX05PX1JFU09VUkNFOworICAgICAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gU2VuZCBBVVRIIHJlcXVlc3Qgc2VxIzEgKEFsZz0lZCkuLi5cbiIsIEFsZykpOworICAgICAgICBNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkF1dGhIZHIsIFNVQlRZUEVfQVVUSCwgMCwgQWRkciwgcEFkLT5NbG1lQXV4LkJzc2lkKTsKKyAgICAgICAgTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCZBdXRoSGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgJkFsZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICZTZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAmU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7CisgICAgICAgIE1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworICAgIAlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisgICAgICAgIFJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwgVGltZW91dCk7CisgICAgICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1dBSVRfU0VRMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgREJHUFJJTlRfRVJSKCgiQVVUSCAtIE1sbWVBdXRoUmVxQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxlZFxuIikpOworICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKKyAgICAgICAgU3RhdHVzID0gTUxNRV9JTlZBTElEX0ZPUk1BVDsKKyAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7CisgICAgfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUGVlckF1dGhSc3BBdFNlcTJBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworICAgIFVDSEFSICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKKyAgICBVU0hPUlQgICAgICAgIFNlcSwgU3RhdHVzLCBSZW1vdGVTdGF0dXMsIEFsZzsKKyAgICBVQ0hBUiAgICAgICAgIENobGdUZXh0W0NJUEhFUl9URVhUX0xFTl07CisgICAgVUNIQVIgICAgICAgICBDeXBlckNobGdUZXh0W0NJUEhFUl9URVhUX0xFTiArIDggKyA4XTsKKyAgICBVQ0hBUiAgICAgICAgIEVsZW1lbnRbMl07CisgICAgSEVBREVSXzgwMl8xMSBBdXRoSGRyOworICAgIEJPT0xFQU4gICAgICAgVGltZXJDYW5jZWxsZWQ7CisgICAgUFVDSEFSICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKyAgICBORElTX1NUQVRVUyAgIE5TdGF0dXM7CisgICAgVUxPTkcgICAgICAgICBGcmFtZUxlbiA9IDA7CisgICAgVVNIT1JUICAgICAgICBTdGF0dXMyOworCisgICAgaWYgKFBlZXJBdXRoU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIyLCAmQWxnLCAmU2VxLCAmU3RhdHVzLCBDaGxnVGV4dCkpCisgICAgeworICAgICAgICBpZiAoTUFDX0FERFJfRVFVQUwocEFkLT5NbG1lQXV4LkJzc2lkLCBBZGRyMikgJiYgU2VxID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBSZWNlaXZlIEFVVEhfUlNQIHNlcSMyIHRvIG1lIChBbGc9JWQsIFN0YXR1cz0lZClcbiIsIEFsZywgU3RhdHVzKSk7CisgICAgICAgICAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisKKyAgICAgICAgICAgIGlmIChTdGF0dXMgPT0gTUxNRV9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEF1dGhlbnRpY2F0aW9uIE1vZGUgIkxFQVAiIGhhcyBhbGxvdyBmb3IgQ0NYIDEuWAorICAgICAgICAgICAgICAgIGlmICgocEFkLT5NbG1lQXV4LkFsZyA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQorI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJCQl8fCAocEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID09IENJU0NPX0F1dGhNb2RlTEVBUCkKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKwkJCQkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgcEFkLT5NbG1lLkxlYXBNYWNoaW5lLkN1cnJTdGF0ZSA9IExFQVBfSURMRTsKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIDIuIHNoYXJlZCBrZXksIG5lZWQgdG8gYmUgY2hhbGxlbmdlZAorICAgICAgICAgICAgICAgICAgICBTZXErKzsKKyAgICAgICAgICAgICAgICAgICAgUmVtb3RlU3RhdHVzID0gTUxNRV9TVUNDRVNTOworCisJCQkJCS8vIEdldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisgICAgICAgICAgICAgICAgICAgIE5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIGlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIFBlZXJBdXRoUnNwQXRTZXEyQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzMiA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBTZW5kIEFVVEggcmVxdWVzdCBzZXEjMy4uLlxuIikpOworICAgICAgICAgICAgICAgICAgICBNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkF1dGhIZHIsIFNVQlRZUEVfQVVUSCwgMCwgQWRkcjIsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7CisgICAgICAgICAgICAgICAgICAgIEF1dGhIZHIuRkMuV2VwID0gMTsKKyAgICAgICAgICAgICAgICAgICAgLy8gRW5jcnlwdCBjaGFsbGVuZ2UgdGV4dCAmIGF1dGggaW5mb3JtYXRpb24KKyAgICAgICAgICAgICAgICAgICAgUlRNUEluaXRXZXBFbmdpbmUoCisgICAgICAgICAgICAgICAgICAgIAlwQWQsCisgICAgICAgICAgICAgICAgICAgIAlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwKKyAgICAgICAgICAgICAgICAgICAgCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKKyAgICAgICAgICAgICAgICAgICAgCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuLAorICAgICAgICAgICAgICAgICAgICAJQ3lwZXJDaGxnVGV4dCk7CisKKwkJCQkJQWxnID0gY3B1MmxlMTYoKihVU0hPUlQgKikmQWxnKTsKKwkJCQkJU2VxID0gY3B1MmxlMTYoKihVU0hPUlQgKikmU2VxKTsKKwkJCQkJUmVtb3RlU3RhdHVzPSBjcHUybGUxNigqKFVTSE9SVCAqKSZSZW1vdGVTdGF0dXMpOworCisJCQkJCVJUTVBFbmNyeXB0RGF0YShwQWQsIChQVUNIQVIpICZBbGcsIEN5cGVyQ2hsZ1RleHQgKyA0LCAyKTsKKwkJCQkJUlRNUEVuY3J5cHREYXRhKHBBZCwgKFBVQ0hBUikgJlNlcSwgQ3lwZXJDaGxnVGV4dCArIDYsIDIpOworCQkJCQlSVE1QRW5jcnlwdERhdGEocEFkLCAoUFVDSEFSKSAmUmVtb3RlU3RhdHVzLCBDeXBlckNobGdUZXh0ICsgOCwgMik7CisJCQkJCUVsZW1lbnRbMF0gPSAxNjsKKwkJCQkJRWxlbWVudFsxXSA9IDEyODsKKwkJCQkJUlRNUEVuY3J5cHREYXRhKHBBZCwgRWxlbWVudCwgQ3lwZXJDaGxnVGV4dCArIDEwLCAyKTsKKwkJCQkJUlRNUEVuY3J5cHREYXRhKHBBZCwgQ2hsZ1RleHQsIEN5cGVyQ2hsZ1RleHQgKyAxMiwgMTI4KTsKKwkJCQkJUlRNUFNldElDVihwQWQsIEN5cGVyQ2hsZ1RleHQgKyAxNDApOworICAgICAgICAgICAgICAgICAgICBNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCAgICAmQXV0aEhkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0lQSEVSX1RFWFRfTEVOICsgMTYsICAgICBDeXBlckNobGdUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7CisgICAgICAgICAgICAgICAgICAgIE1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworICAgICAgICAgICAgICAgIAlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCisgICAgICAgICAgICAgICAgICAgIFJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwgQVVUSF9USU1FT1VUKTsKKyAgICAgICAgICAgICAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfV0FJVF9TRVE0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKyAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID09IENJU0NPX0F1dGhNb2RlTEVBUCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vSW52YWxpZCBBdXRoZW50aWNhdGlvbiBwb3NzaWJsZSByb2d1ZSBBUAorICAgICAgICAgICAgICAgICAgICAvL0FkZCB0aGlzIEFwIHRvIFJvZ3VlIEFQLgorICAgICAgICAgICAgICAgICAgICBSb2d1ZUFwVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlN0YUNmZy5Sb2d1ZUFwVGFiLCBBZGRyMiwgTEVBUF9SRUFTT05fSU5WQUxJRF9BVVRIKTsKKwkJCQl9CisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuQXV0aEZhaWxSZWFzb24gPSBTdGF0dXM7CisgICAgICAgICAgICAgICAgQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5BdXRoRmFpbFN0YSwgQWRkcjIpOworICAgICAgICAgICAgICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworICAgICAgICAgICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBQZWVyQXV0aFNhbml0eSgpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7CisgICAgfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUGVlckF1dGhSc3BBdFNlcTRBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworICAgIFVDSEFSICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKKyAgICBVU0hPUlQgICAgICAgIEFsZywgU2VxLCBTdGF0dXM7CisgICAgQ0hBUiAgICAgICAgICBDaGxnVGV4dFtDSVBIRVJfVEVYVF9MRU5dOworICAgIEJPT0xFQU4gICAgICAgVGltZXJDYW5jZWxsZWQ7CisKKyAgICBpZihQZWVyQXV0aFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgJkFsZywgJlNlcSwgJlN0YXR1cywgQ2hsZ1RleHQpKQorICAgIHsKKyAgICAgICAgaWYoTUFDX0FERFJfRVFVQUwocEFkLT5NbG1lQXV4LkJzc2lkLCBBZGRyMikgJiYgU2VxID09IDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBSZWNlaXZlIEFVVEhfUlNQIHNlcSM0IHRvIG1lXG4iKSk7CisgICAgICAgICAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisKKyAgICAgICAgICAgIGlmIChTdGF0dXMgIT0gTUxNRV9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkF1dGhGYWlsUmVhc29uID0gU3RhdHVzOworICAgICAgICAgICAgICAgIENPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuQXV0aEZhaWxTdGEsIEFkZHIyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisgICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gUGVlckF1dGhSc3BBdFNlcTRBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOworICAgIH0KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVEZWF1dGhSZXFBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworICAgIE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QgKnBJbmZvOworICAgIEhFQURFUl84MDJfMTEgRGVhdXRoSGRyOworICAgIFBVQ0hBUiAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisgICAgTkRJU19TVEFUVVMgICBOU3RhdHVzOworICAgIFVMT05HICAgICAgICAgRnJhbWVMZW4gPSAwOworICAgIFVTSE9SVCAgICAgICAgU3RhdHVzOworCisgICAgcEluZm8gPSAoTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCAqKUVsZW0tPk1zZzsKKworICAgIE5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisgICAgaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBNbG1lRGVhdXRoUmVxQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxcbiIpKTsKKyAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisgICAgICAgIFN0YXR1cyA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKKyAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0RFQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBTZW5kIERFLUFVVEggcmVxdWVzdCAoUmVhc29uPSVkKS4uLlxuIiwgcEluZm8tPlJlYXNvbikpOworICAgIE1ndE1hY0hlYWRlckluaXQocEFkLCAmRGVhdXRoSGRyLCBTVUJUWVBFX0RFQVVUSCwgMCwgcEluZm8tPkFkZHIsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7CisgICAgTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSEVBREVSXzgwMl8xMSksJkRlYXV0aEhkciwKKyAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgJnBJbmZvLT5SZWFzb24sCisgICAgICAgICAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworICAgIE1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKyAgICBwQWQtPlN0YUNmZy5EZWF1dGhSZWFzb24gPSBwSW5mby0+UmVhc29uOworICAgIENPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuRGVhdXRoU3RhLCBwSW5mby0+QWRkcik7CisgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisgICAgU3RhdHVzID0gTUxNRV9TVUNDRVNTOworICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9ERUFVVEhfQ09ORiwgMiwgJlN0YXR1cyk7CisKKwkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIGRlYXV0aGVudGljYXRpb24KKwlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0RFQVVUSF9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgQXV0aFRpbWVvdXRBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworICAgIFVTSE9SVCBTdGF0dXM7CisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIEF1dGhUaW1lb3V0QWN0aW9uXG4iKSk7CisgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisgICAgU3RhdHVzID0gTUxNRV9SRUpfVElNRU9VVDsKKyAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEludmFsaWRTdGF0ZVdoZW5BdXRoKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKyAgICBVU0hPUlQgU3RhdHVzOworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBJbnZhbGlkU3RhdGVXaGVuQXV0aCAoc3RhdGU9JWxkKSwgcmVzZXQgQVVUSCBzdGF0ZSBtYWNoaW5lXG4iLCBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlKSk7CisgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisgICAgU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKKyAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTb21lIFNUQS9BUAorICAgIE5vdGU6CisgICAgICAgIFRoaXMgYWN0aW9uIHNob3VsZCBuZXZlciB0cmlnZ2VyIEFVVEggc3RhdGUgdHJhbnNpdGlvbiwgdGhlcmVmb3JlIHdlCisgICAgICAgIHNlcGFyYXRlIGl0IGZyb20gQVVUSCBzdGF0ZSBtYWNoaW5lLCBhbmQgbWFrZSBpdCBhcyBhIHN0YW5kYWxvbmUgc2VydmljZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIENsczJlcnJBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gUFVDSEFSIHBBZGRyKQoreworICAgIEhFQURFUl84MDJfMTEgRGVhdXRoSGRyOworICAgIFBVQ0hBUiAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisgICAgTkRJU19TVEFUVVMgICBOU3RhdHVzOworICAgIFVMT05HICAgICAgICAgRnJhbWVMZW4gPSAwOworICAgIFVTSE9SVCAgICAgICAgUmVhc29uID0gUkVBU09OX0NMUzJFUlI7CisKKyAgICBOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorICAgIGlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisgICAgICAgIHJldHVybjsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBDbGFzcyAyIGVycm9yLCBTZW5kIERFQVVUSCBmcmFtZS4uLlxuIikpOworICAgIE1ndE1hY0hlYWRlckluaXQocEFkLCAmRGVhdXRoSGRyLCBTVUJUWVBFX0RFQVVUSCwgMCwgcEFkZHIsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7CisgICAgTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSEVBREVSXzgwMl8xMSksJkRlYXV0aEhkciwKKyAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgJlJlYXNvbiwKKyAgICAgICAgICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7CisgICAgTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworICAgIHBBZC0+U3RhQ2ZnLkRlYXV0aFJlYXNvbiA9IFJlYXNvbjsKKyAgICBDT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkRlYXV0aFN0YSwgcEFkZHIpOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhL2F1dGhfcnNwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS9hdXRoX3JzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlM2MyZDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS9hdXRoX3JzcC5jCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCWF1dGhfcnNwLmMKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlKb2huCQkyMDA0LTEwLTEJCWNvcHkgZnJvbSBSVDI1NjAKKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgYXV0aGVudGljYXRpb24gc3RhdGUgbWFjaGluZSBpbml0IHByb2NlZHVyZQorICAgIFBhcmFtZXRlcnM6CisgICAgICAgIFNtIC0gdGhlIHN0YXRlIG1hY2hpbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEF1dGhSc3BTdGF0ZU1hY2hpbmVJbml0KAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFBTVEFURV9NQUNISU5FIFNtLAorICAgIElOIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQoreworICAgIFN0YXRlTWFjaGluZUluaXQoU20sIFRyYW5zLCBNQVhfQVVUSF9SU1BfU1RBVEUsIE1BWF9BVVRIX1JTUF9NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpRHJvcCwgQVVUSF9SU1BfSURMRSwgQVVUSF9SU1BfTUFDSElORV9CQVNFKTsKKworICAgIC8vIGNvbHVtbiAxCisgICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1JTUF9JRExFLCBNVDJfUEVFUl9ERUFVVEgsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRlYXV0aEFjdGlvbik7CisKKyAgICAvLyBjb2x1bW4gMgorICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9SU1BfV0FJVF9DSEFMLCBNVDJfUEVFUl9ERUFVVEgsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRlYXV0aEFjdGlvbik7CisKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUGVlckF1dGhTaW1wbGVSc3BHZW5BbmRTZW5kKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIFBIRUFERVJfODAyXzExIHBIZHI4MDIxMSwKKyAgICBJTiBVU0hPUlQgQWxnLAorICAgIElOIFVTSE9SVCBTZXEsCisgICAgSU4gVVNIT1JUIFJlYXNvbiwKKyAgICBJTiBVU0hPUlQgU3RhdHVzKQoreworICAgIEhFQURFUl84MDJfMTEgICAgIEF1dGhIZHI7CisgICAgVUxPTkcgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOworICAgIFBVQ0hBUiAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworICAgIE5ESVNfU1RBVFVTICAgICAgIE5TdGF0dXM7CisKKyAgICBpZiAoUmVhc29uICE9IE1MTUVfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXIgQVVUSCBmYWlsLi4uXG4iKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKwkvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisgICAgTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsKKyAgICBpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorICAgICAgICByZXR1cm47CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZW5kIEFVVEggcmVzcG9uc2UgKHNlcSMyKS4uLlxuIikpOworICAgIE1ndE1hY0hlYWRlckluaXQocEFkLCAmQXV0aEhkciwgU1VCVFlQRV9BVVRILCAwLCBwSGRyODAyMTEtPkFkZHIyLCBwQWQtPk1sbWVBdXguQnNzaWQpOworICAgIE1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgJkF1dGhIZHIsCisgICAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAmQWxnLAorICAgICAgICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgJlNlcSwKKyAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICZSZWFzb24sCisgICAgICAgICAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworICAgIE1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFBlZXJEZWF1dGhBY3Rpb24oCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gUE1MTUVfUVVFVUVfRUxFTSBFbGVtKQoreworICAgIFVDSEFSICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07CisgICAgVVNIT1JUICAgICAgUmVhc29uOworCisgICAgaWYgKFBlZXJEZWF1dGhTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZSZWFzb24pKQorICAgIHsKKyAgICAgICAgaWYgKElORlJBX09OKHBBZCkgJiYgTUFDX0FERFJfRVFVQUwoQWRkcjIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBVVRIX1JTUCAtIHJlY2VpdmUgREUtQVVUSCBmcm9tIG91ciBBUCAoUmVhc29uPSVkKVxuIiwgUmVhc29uKSk7CisKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKyAgICAgICAgICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7CisgICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOworICAgICAgICAgICAgfQorI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKworCQkJLy8gc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciBkZWF1dGhlbnRpY2F0aW9uCisJCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfREVBVVRIX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisKKyAgICAgICAgICAgIExpbmtEb3duKHBBZCwgVFJVRSk7CisKKyAgICAgICAgICAgIC8vIEF1dGhlbnRpY2F0aW9uIE1vZGUgQ2lzY29fTEVBUCBoYXMgc3RhcnQgYSB0aW1lcgorICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIGNhbmNlbCBpdCBpZiB1c2luZyBMRUFQCisjaWZkZWYgTEVBUF9TVVBQT1JUCisgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID09IENJU0NPX0F1dGhNb2RlTEVBUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkxlYXBBdXRoVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisgICAgICAgICAgICAgICAgLy9DaGVjayBpcyBpdCBtYWNoIHRoZSBMRUFQIEF1dGhlbnRpY2F0aW9uIGZhaWxlZCBhcyBwb3NzaWJsZSBhIFJvZ3VlIEFQCisgICAgICAgICAgICAgICAgLy9vbiBpdCdzIFBvcnRTZWN1cmVkIG5vdCBlcXVhbCB0byBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCB3aGlsZSBwcm9jZXNzIHRoZSBBdXRoZW50aWNhdG9uLgorICAgICAgICAgICAgICAgIGlmICgocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgIT0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQpICYmIChwQWQtPk1sbWUuTGVhcE1hY2hpbmUuQ3VyclN0YXRlICE9IExFQVBfSURMRSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBSb2d1ZUFwVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlN0YUNmZy5Sb2d1ZUFwVGFiLCBBZGRyMiwgTEVBUF9SRUFTT05fQVVUSF9USU1FT1VUKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBVVRIX1JTUCAtIFBlZXJEZWF1dGhBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvY29ubmVjdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvY29ubmVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MzE0MGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS9jb25uZWN0LmMKQEAgLTAsMCArMSwyODIyIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCWNvbm5lY3QuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUpvaG4JCQkyMDA0LTA4LTA4CQkJTWFqb3IgbW9kaWZpY2F0aW9uIGZyb20gUlQyNTYwCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCitVQ0hBUglDaXBoZXJTdWl0ZVdwYU5vbmVUa2lwW10gPSB7CisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEsCS8vIG91aQorCQkweDAxLCAweDAwLAkJCQkvLyBWZXJzaW9uCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8vIE11bHRpY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBOdW1iZXIgb2YgdW5pY2FzdAorCQkweDAwLCAweDUwLCAweGYyLCAweDAyLAkvLyB1bmljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMAkvLyBhdXRoZW50aWNhdGlvbgorCQl9OworVUNIQVIJQ2lwaGVyU3VpdGVXcGFOb25lVGtpcExlbiA9IChzaXplb2YoQ2lwaGVyU3VpdGVXcGFOb25lVGtpcCkgLyBzaXplb2YoVUNIQVIpKTsKKworVUNIQVIJQ2lwaGVyU3VpdGVXcGFOb25lQWVzW10gPSB7CisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEsCS8vIG91aQorCQkweDAxLCAweDAwLAkJCQkvLyBWZXJzaW9uCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDQsCS8vIE11bHRpY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBOdW1iZXIgb2YgdW5pY2FzdAorCQkweDAwLCAweDUwLCAweGYyLCAweDA0LAkvLyB1bmljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMAkvLyBhdXRoZW50aWNhdGlvbgorCQl9OworVUNIQVIJQ2lwaGVyU3VpdGVXcGFOb25lQWVzTGVuID0gKHNpemVvZihDaXBoZXJTdWl0ZVdwYU5vbmVBZXMpIC8gc2l6ZW9mKFVDSEFSKSk7CisKKy8vIFRoZSBmb2xsb3dpbmcgTUFDUk8gaXMgY2FsbGVkIGFmdGVyIDEuIHN0YXJ0aW5nIGFuIG5ldyBJQlNTLCAyLiBzdWNjZXNmdWxseSBKT0lOIGFuIElCU1MsCisvLyBvciAzLiBzdWNjZXNmdWxseSBBU1NPQ0lBVEUgdG8gYSBCU1MsIDQuIHN1Y2Nlc3NmdWxseSBSRV9BU1NPQ0lBVEUgdG8gYSBCU1MKKy8vIEFsbCBzZXR0aW5ncyBzdWNjZXNzZnVseSBuZWdvdGlhdGVkIGZ1cmluZyBNTE1FIHN0YXRlIG1hY2hpbmVzIGJlY29tZSBmaW5hbCBzZXR0aW5ncworLy8gYW5kIGFyZSBjb3BpZWQgdG8gcEFkLT5TdGFBY3RpdmUKKyNkZWZpbmUgQ09QWV9TRVRUSU5HU19GUk9NX01MTUVfQVVYX1RPX0FDVElWRV9DRkcoX3BBZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCShfcEFkKS0+Q29tbW9uQ2ZnLlNzaWRMZW4gPSAoX3BBZCktPk1sbWVBdXguU3NpZExlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlOZGlzTW92ZU1lbW9yeSgoX3BBZCktPkNvbW1vbkNmZy5Tc2lkLCAoX3BBZCktPk1sbWVBdXguU3NpZCwgKF9wQWQpLT5NbG1lQXV4LlNzaWRMZW4pOyBcCisJQ09QWV9NQUNfQUREUigoX3BBZCktPkNvbW1vbkNmZy5Cc3NpZCwgKF9wQWQpLT5NbG1lQXV4LkJzc2lkKTsgICAgICAgICAgICAgICAgICAgICAgXAorCShfcEFkKS0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSAoX3BBZCktPk1sbWVBdXguQ2hhbm5lbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoX3BBZCktPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IChfcEFkKS0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbDsgICAgICAgICAgICAgICAgICBcCisJKF9wQWQpLT5TdGFBY3RpdmUuQWlkID0gKF9wQWQpLT5NbG1lQXV4LkFpZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCShfcEFkKS0+U3RhQWN0aXZlLkF0aW1XaW4gPSAoX3BBZCktPk1sbWVBdXguQXRpbVdpbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoX3BBZCktPlN0YUFjdGl2ZS5DYXBhYmlsaXR5SW5mbyA9IChfcEFkKS0+TWxtZUF1eC5DYXBhYmlsaXR5SW5mbzsgICAgICAgICAgICAgICAgICBcCisJKF9wQWQpLT5Db21tb25DZmcuQmVhY29uUGVyaW9kID0gKF9wQWQpLT5NbG1lQXV4LkJlYWNvblBlcmlvZDsgICAgICAgICAgICAgICAgICAgICAgXAorCShfcEFkKS0+U3RhQWN0aXZlLkNmcE1heER1cmF0aW9uID0gKF9wQWQpLT5NbG1lQXV4LkNmcE1heER1cmF0aW9uOyAgICAgICAgICAgICAgICAgIFwKKwkoX3BBZCktPlN0YUFjdGl2ZS5DZnBQZXJpb2QgPSAoX3BBZCktPk1sbWVBdXguQ2ZwUGVyaW9kOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKF9wQWQpLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiA9IChfcEFkKS0+TWxtZUF1eC5TdXBSYXRlTGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCU5kaXNNb3ZlTWVtb3J5KChfcEFkKS0+U3RhQWN0aXZlLlN1cFJhdGUsIChfcEFkKS0+TWxtZUF1eC5TdXBSYXRlLCAoX3BBZCktPk1sbWVBdXguU3VwUmF0ZUxlbik7XAorCShfcEFkKS0+U3RhQWN0aXZlLkV4dFJhdGVMZW4gPSAoX3BBZCktPk1sbWVBdXguRXh0UmF0ZUxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlOZGlzTW92ZU1lbW9yeSgoX3BBZCktPlN0YUFjdGl2ZS5FeHRSYXRlLCAoX3BBZCktPk1sbWVBdXguRXh0UmF0ZSwgKF9wQWQpLT5NbG1lQXV4LkV4dFJhdGVMZW4pO1wKKwlOZGlzTW92ZU1lbW9yeSgmKF9wQWQpLT5Db21tb25DZmcuQVBFZGNhUGFybSwgJihfcEFkKS0+TWxtZUF1eC5BUEVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7XAorCU5kaXNNb3ZlTWVtb3J5KCYoX3BBZCktPkNvbW1vbkNmZy5BUFFvc0NhcGFiaWxpdHksICYoX3BBZCktPk1sbWVBdXguQVBRb3NDYXBhYmlsaXR5LCBzaXplb2YoUU9TX0NBUEFCSUxJVFlfUEFSTSkpO1wKKwlOZGlzTW92ZU1lbW9yeSgmKF9wQWQpLT5Db21tb25DZmcuQVBRYnNzTG9hZCwgJihfcEFkKS0+TWxtZUF1eC5BUFFic3NMb2FkLCBzaXplb2YoUUJTU19MT0FEX1BBUk0pKTtcCisJQ09QWV9NQUNfQUREUigoX3BBZCktPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIChfcEFkKS0+TWxtZUF1eC5Cc3NpZCk7ICAgICAgXAorCShfcEFkKS0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWlkID0gKF9wQWQpLT5NbG1lQXV4LkFpZDsgICAgICAgICAgICAgICAgICAgICAgIFwKKwkoX3BBZCktPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IChfcEFkKS0+U3RhQ2ZnLlBhaXJDaXBoZXI7XAorCUNPUFlfTUFDX0FERFIoKF9wQWQpLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS5Cc3NJZCwgKF9wQWQpLT5NbG1lQXV4LkJzc2lkKTtcCisJKF9wQWQpLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SYXRlTGVuID0gKF9wQWQpLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiArIChfcEFkKS0+U3RhQWN0aXZlLkV4dFJhdGVMZW47XAorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIE1sbWVDbnRsSW5pdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBTVEFURV9NQUNISU5FICpTLAorCU9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKK3sKKwkvLyBDb250cm9sIHN0YXRlIG1hY2hpbmUgZGlmZmVycyBmcm9tIG90aGVyIHN0YXRlIG1hY2hpbmVzLCB0aGUgaW50ZXJmYWNlCisJLy8gZm9sbG93cyB0aGUgc3RhbmRhcmQgaW50ZXJmYWNlCisJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgTWxtZUNudGxNYWNoaW5lUGVyZm9ybUFjdGlvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBTVEFURV9NQUNISU5FICpTLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlzd2l0Y2gocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSkKKwl7CisJCWNhc2UgQ05UTF9JRExFOgorCQkJCUNudGxJZGxlUHJvYyhwQWQsIEVsZW0pOworCQkJYnJlYWs7CisJCWNhc2UgQ05UTF9XQUlUX0RJU0FTU09DOgorCQkJQ250bFdhaXREaXNhc3NvY1Byb2MocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCQljYXNlIENOVExfV0FJVF9KT0lOOgorCQkJQ250bFdhaXRKb2luUHJvYyhwQWQsIEVsZW0pOworCQkJYnJlYWs7CisKKwkJLy8gQ05UTF9XQUlUX1JFQVNTT0MgaXMgdGhlIG9ubHkgc3RhdGUgaW4gQ05UTCBtYWNoaW5lIHRoYXQgZG9lcworCQkvLyBub3QgdHJpZ2dlcmVkIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgYnkgIlJUTVBTZXRJbmZvcm1hdGlvbihPSURfeHh4KSIuCisJCS8vIFRoZXJlZm9yZSBub3QgcHJvdGVjdGVkIGJ5IE5ESVMncyAib25seSBvbmUgb3V0c3RhbmRpbmcgT0lEIHJlcXVlc3QiCisJCS8vIHJ1bGUuIFdoaWNoIG1lYW5zIE5ESVMgbWF5IFNFVCBPSUQgaW4gdGhlIG1pZGRsZSBvZiBST0FNaW5nIGF0dGVtcHRzLgorCQkvLyBDdXJyZW50IGFwcHJvYWNoIGlzIHRvIGJsb2NrIG5ldyBTRVQgcmVxdWVzdCBhdCBSVE1QU2V0SW5mb3JtYXRpb24oKQorCQkvLyB3aGVuIENudGxNYWNoaW5lLkN1cnJTdGF0ZSBpcyBub3QgQ05UTF9JRExFCisJCWNhc2UgQ05UTF9XQUlUX1JFQVNTT0M6CisJCQlDbnRsV2FpdFJlYXNzb2NQcm9jKHBBZCwgRWxlbSk7CisJCQlicmVhazsKKworCQljYXNlIENOVExfV0FJVF9TVEFSVDoKKwkJCUNudGxXYWl0U3RhcnRQcm9jKHBBZCwgRWxlbSk7CisJCQlicmVhazsKKwkJY2FzZSBDTlRMX1dBSVRfQVVUSDoKKwkJCUNudGxXYWl0QXV0aFByb2MocEFkLCBFbGVtKTsKKwkJCWJyZWFrOworCQljYXNlIENOVExfV0FJVF9BVVRIMjoKKwkJCUNudGxXYWl0QXV0aFByb2MyKHBBZCwgRWxlbSk7CisJCQlicmVhazsKKwkJY2FzZSBDTlRMX1dBSVRfQVNTT0M6CisJCQlDbnRsV2FpdEFzc29jUHJvYyhwQWQsIEVsZW0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBDTlRMX1dBSVRfT0lEX0xJU1RfU0NBTjoKKwkJCWlmKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX1NDQU5fQ09ORikKKwkJCXsKKwkJCQkvLyBSZXN1bWUgVHhSaW5nIGFmdGVyIFNDQU5JTkcgY29tcGxldGUuIFdlIGhvcGUgdGhlIG91dC1vZi1zZXJ2aWNlIHRpbWUKKwkJCQkvLyB3b24ndCBiZSB0b28gbG9uZyB0byBsZXQgdXBwZXIgbGF5ZXIgdGltZS1vdXQgdGhlIHdhaXRpbmcgZnJhbWVzCisJCQkJUlRNUFJlc3VtZU1zZHVUcmFuc21pc3Npb24ocEFkKTsKKwkJCQlpZiAocEFkLT5TdGFDZmcuQ0NYUmVxVHlwZSAhPSBNU1JOX1RZUEVfVU5VU0VEKQorCQkJCXsKKwkJCQkJLy8gQ2lzY28gc2NhbiByZXF1ZXN0IGlzIGZpbmlzaGVkLCBwcmVwYXJlIGJlYWNvbiByZXBvcnQKKwkJCQkJTWxtZUVucXVldWUocEFkLCBBSVJPTkVUX1NUQVRFX01BQ0hJTkUsIE1UMl9BSVJPTkVUX1NDQU5fRE9ORSwgMCwgTlVMTCk7CisJCQkJfQorCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisKKyAgICAgICAgICAgICAgICAvLworCQkJCS8vIFNldCBMRUQgc3RhdHVzIHRvIHByZXZpb3VzIHN0YXR1cy4KKwkJCQkvLworCQkJCWlmIChwQWQtPmJMZWRPblNjYW5uaW5nKQorCQkJCXsKKwkJCQkJcEFkLT5iTGVkT25TY2FubmluZyA9IEZBTFNFOworCQkJCQlSVE1QU2V0TEVEKHBBZCwgcEFkLT5MZWRTdGF0dXMpOworCQkJCX0KKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJCQkJLy8gQVAgc2VudCBhIDIwNDBDb2V4aXN0ZW5jZSBtZ210IGZyYW1lLCB0aGVuIHN0YXRpb24gcGVyZm9ybSBhIHNjYW4sIGFuZCB0aGVuIHNlbmQgYmFjayB0aGUgcmVzcG9uZS4KKwkJCQlpZiAocEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAuZmllbGQuSW5mb1JlcSA9PSAxKQorCQkJCXsKKwkJCQkJVXBkYXRlMjA0MENvZXhpc3RGcmFtZUFuZE5vdGlmeShwQWQsIEJTU0lEX1dDSUQsIFRSVUUpOworCQkJCX0KKyNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCisJCQl9CisJCQlicmVhazsKKworCQljYXNlIENOVExfV0FJVF9PSURfRElTQVNTT0M6CisJCQlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfRElTQVNTT0NfQ09ORikKKwkJCXsKKwkJCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKKwkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworCQkJfQorCQkJYnJlYWs7CisjaWZkZWYgUlQyODcwCisJCS8vCisJCS8vIFRoaXMgc3RhdGUgaXMgZm9yIHRoYXQgd2Ugd2FudCB0byBjb25uZWN0IHRvIGFuIEFQIGJ1dAorCQkvLyBpdCBkaWRuJ3QgZmluZCBvbiBCU1MgTGlzdCB0YWJsZS4gU28gd2UgbmVlZCB0byBzY2FuIHRoZSBhaXIgZmlyc3QsCisJCS8vIGFmdGVyIHRoYXQgd2UgY2FuIHRyeSB0byBjb25uZWN0IHRvIHRoZSBkZXNpcmVkIEFQIGlmIGF2YWlsYWJsZS4KKwkJLy8KKwkJY2FzZSBDTlRMX1dBSVRfU0NBTl9GT1JfQ09OTkVDVDoKKwkJCWlmKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX1NDQU5fQ09ORikKKwkJCXsKKwkJCQkvLyBSZXN1bWUgVHhSaW5nIGFmdGVyIFNDQU5JTkcgY29tcGxldGUuIFdlIGhvcGUgdGhlIG91dC1vZi1zZXJ2aWNlIHRpbWUKKwkJCQkvLyB3b24ndCBiZSB0b28gbG9uZyB0byBsZXQgdXBwZXIgbGF5ZXIgdGltZS1vdXQgdGhlIHdhaXRpbmcgZnJhbWVzCisJCQkJUlRNUFJlc3VtZU1zZHVUcmFuc21pc3Npb24ocEFkKTsKKyNpZmRlZiBDQ1hfU1VQUE9SVAorCQkJCWlmIChwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlICE9IE1TUk5fVFlQRV9VTlVTRUQpCisJCQkJeworCQkJCQkvLyBDaXNjbyBzY2FuIHJlcXVlc3QgaXMgZmluaXNoZWQsIHByZXBhcmUgYmVhY29uIHJlcG9ydAorCQkJCQlNbG1lRW5xdWV1ZShwQWQsIEFJUk9ORVRfU1RBVEVfTUFDSElORSwgTVQyX0FJUk9ORVRfU0NBTl9ET05FLCAwLCBOVUxMKTsKKwkJCQl9CisjZW5kaWYgLy8gQ0NYX1NVUFBPUlQgLy8KKwkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworCisJCQkJLy8KKwkJCQkvLyBDaGVjayBpZiB3ZSBjYW4gY29ubmVjdCB0by4KKwkJCQkvLworCQkJCUJzc1RhYmxlU3NpZFNvcnQocEFkLCAmcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKKwkJCQlpZiAocEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIgPiAwKQorCQkJCXsKKwkJCQkJTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRChwQWQpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8vIFJUMjg3MCAvLworCQlkZWZhdWx0OgorCQkJREJHUFJJTlRfRVJSKCgiIUVSUk9SISBDTlRMIC0gSWxsZWdhbCBtZXNzYWdlIHR5cGUoPSVsZCkiLCBFbGVtLT5Nc2dUeXBlKSk7CisJCQlicmVhazsKKwl9Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQ250bElkbGVQcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QgICBEaXNhc3NvY1JlcTsKKworCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkKKwkJcmV0dXJuOworCisJc3dpdGNoKEVsZW0tPk1zZ1R5cGUpCisJeworCQljYXNlIE9JRF84MDJfMTFfU1NJRDoKKwkJCUNudGxPaWRTc2lkUHJvYyhwQWQsIEVsZW0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0JTU0lEOgorCQkJQ250bE9pZFJUQnNzaWRQcm9jKHBBZCxFbGVtKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU46CisJCQlDbnRsT2lkU2NhblByb2MocEFkLEVsZW0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0RJU0FTU09DSUFURToKKyNpZmRlZiBSQUxJTktfQVRFCisJCQlpZihBVEVfT04ocEFkKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUaGUgZHJpdmVyIGlzIGluIEFURSBtb2RlIG5vd1xuIikpOworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwkJCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkcpOworCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsIHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpLCAmRGlzYXNzb2NSZXEpOworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfRElTQVNTT0M7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9FTkFCTEVfV0lUSF9XRUJfVUkpCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgeworICAgIAkJCS8vIFNldCB0aGUgQXV0b1JlY29ubmVjdFNzaWQgdG8gcHJldmVudCBpdCByZWNvbm5lY3QgdG8gb2xkIFNTSUQKKyAgICAJCQkvLyBTaW5jZSBjYWxsaW5nIHRoaXMgaW5kaWNhdGUgdXNlciBkb24ndCB3YW50IHRvIGNvbm5lY3QgdG8gdGhhdCBTU0lEIGFueW1vcmUuCisgICAgCQkJcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuPSAzMjsKKyAgICAJCQlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7CisgICAgICAgICAgICB9CisJCQlicmVhazsKKworCQljYXNlIE1UMl9NTE1FX1JPQU1JTkdfUkVROgorCQkJQ250bE1sbWVSb2FtaW5nUHJvYyhwQWQsIEVsZW0pOworCQkJYnJlYWs7CisKKyAgICAgICAgY2FzZSBPSURfODAyXzExX01JQ19GQUlMVVJFX1JFUE9SVF9GUkFNRToKKyAgICAgICAgICAgIFdwYU1pY0ZhaWx1cmVSZXBvcnRGcmFtZShwQWQsIEVsZW0pOworICAgICAgICAgICAgYnJlYWs7CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9ETFNfUEFSQU06CisJCQlDbnRsT2lkRExTU2V0dXBQcm9jKHBBZCwgRWxlbSk7CisJCQlicmVhazsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCQlkZWZhdWx0OgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIElsbGVnYWwgbWVzc2FnZSBpbiBDbnRsSWRsZVByb2MoTXNnVHlwZT0lbGQpXG4iLEVsZW0tPk1zZ1R5cGUpKTsKKwkJCWJyZWFrOworCX0KK30KKworVk9JRCBDbnRsT2lkU2NhblByb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCU1MTUVfU0NBTl9SRVFfU1RSVUNUICAgICAgIFNjYW5SZXE7CisJVUxPTkcgICAgICAgICAgICAgICAgICAgICAgQnNzSWR4ID0gQlNTX05PVF9GT1VORDsKKwlCU1NfRU5UUlkgICAgICAgICAgICAgICAgICBDdXJyQnNzOworCisjaWZkZWYgUkFMSU5LX0FURQorLyogRGlzYWJsZSBzY2FubmluZyB3aGVuIEFURSBpcyBydW5uaW5nLiAqLworCWlmIChBVEVfT04ocEFkKSkKKwkJcmV0dXJuOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCisJLy8gcmVjb3JkIGN1cnJlbnQgQlNTIGlmIG5ldHdvcmsgaXMgY29ubmVjdGVkLgorCS8vIDIwMDMtMi0xMyBkbyBub3QgaW5jbHVkZSBjdXJyZW50IElCU1MgaWYgdGhpcyBpcyB0aGUgb25seSBTVEEgaW4gdGhpcyBJQlNTLgorCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJeworCQlCc3NJZHggPSBCc3NTc2lkVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQlpZiAoQnNzSWR4ICE9IEJTU19OT1RfRk9VTkQpCisJCXsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZDdXJyQnNzLCAmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0sIHNpemVvZihCU1NfRU5UUlkpKTsKKwkJfQorCX0KKworCS8vIGNsZWFuIHVwIHByZXZpb3VzIFNDQU4gcmVzdWx0LCBhZGQgY3VycmVudCBCU1MgYmFjayB0byB0YWJsZSBpZiBhbnkKKwlCc3NUYWJsZUluaXQoJnBBZC0+U2NhblRhYik7CisJaWYgKEJzc0lkeCAhPSBCU1NfTk9UX0ZPVU5EKQorCXsKKwkJLy8gRERLIE5vdGU6IElmIHRoZSBOSUMgaXMgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBCU1NJRCBhbmQgU1NJRAorCQkvLyAgICB0aGF0IGFyZSBub3QgY29udGFpbmVkIGluIHRoZSBsaXN0IG9mIEJTU0lEcyBnZW5lcmF0ZWQgYnkgdGhpcyBzY2FuLCB0aGUKKwkJLy8gICAgQlNTSUQgZGVzY3JpcHRpb24gb2YgdGhlIGN1cnJlbnRseSBhc3NvY2lhdGVkIEJTU0lEIGFuZCBTU0lEIHNob3VsZCBiZQorCQkvLyAgICBhcHBlbmRlZCB0byB0aGUgbGlzdCBvZiBCU1NJRHMgaW4gdGhlIE5JQydzIGRhdGFiYXNlLgorCQkvLyBUbyBlbnN1cmUgdGhpcywgd2UgYXBwZW5kIHRoaXMgQlNTIGFzIHRoZSBmaXJzdCBlbnRyeSBpbiBTQ0FOIHJlc3VsdAorCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TY2FuVGFiLkJzc0VudHJ5WzBdLCAmQ3VyckJzcywgc2l6ZW9mKEJTU19FTlRSWSkpOworCQlwQWQtPlNjYW5UYWIuQnNzTnIgPSAxOworCX0KKworCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCAiIiwgMCwgQlNTX0FOWSwgU0NBTl9BQ1RJVkUpOworCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TQ0FOX1JFUSwKKwkJc2l6ZW9mKE1MTUVfU0NBTl9SRVFfU1RSVUNUKSwgJlNjYW5SZXEpOworCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0xJU1RfU0NBTjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlCZWZvcmUgY2FsbGluZyB0aGlzIHJvdXRpbmUsIHVzZXIgZGVzaXJlZCBTU0lEIHNob3VsZCBhbHJlYWR5IGJlZW4KKwkJcmVjb3JkZWQgaW4gQ29tbW9uQ2ZnLlNzaWRbXQorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIENudGxPaWRTc2lkUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKiBFbGVtKQoreworCVBORElTXzgwMl8xMV9TU0lEICAgICAgICAgIHBPaWRTc2lkID0gKE5ESVNfODAyXzExX1NTSUQgKilFbGVtLT5Nc2c7CisJTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUICAgRGlzYXNzb2NSZXE7CisJVUxPTkcJCQkJCSAgIE5vdzsKKworCS8vIFN0ZXAgMS4gcmVjb3JkIHRoZSBkZXNpcmVkIHVzZXIgc2V0dGluZ3MgdG8gTWxtZUF1eAorCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBNQVhfTEVOX09GX1NTSUQpOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBwT2lkU3NpZC0+U3NpZCwgcE9pZFNzaWQtPlNzaWRMZW5ndGgpOworCXBBZC0+TWxtZUF1eC5Tc2lkTGVuID0gKFVDSEFSKXBPaWRTc2lkLT5Tc2lkTGVuZ3RoOworCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKKwlwQWQtPk1sbWVBdXguQnNzVHlwZSA9IHBBZC0+U3RhQ2ZnLkJzc1R5cGU7CisKKworCS8vCisJLy8gVXBkYXRlIFJlY29ubmVjdCBTc2lkLCB0aGF0IHVzZXIgZGVzaXJlZCB0byBjb25uZWN0LgorCS8vCisJTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBNQVhfTEVOX09GX1NTSUQpOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKKwlwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4gPSBwQWQtPk1sbWVBdXguU3NpZExlbjsKKworCS8vIHN0ZXAgMi4gZmluZCBhbGwgbWF0Y2hpbmcgQlNTIGluIHRoZSBsYXN0ZXN0IFNDQU4gcmVzdWx0IChpbkJzc1RhYikKKwkvLyAgICAmIGxvZyB0aGVtIGludG8gTWxtZUF1eC5Tc2lkQnNzVGFiIGZvciBsYXRlci1vbiBpdGVyYXRpb24uIFNvcnQgYnkgUlNTSSBvcmRlcgorCUJzc1RhYmxlU3NpZFNvcnQocEFkLCAmcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIsIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbik7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbnRsT2lkU3NpZFByb2MoKTpDTlRMIC0gJWQgQlNTIG9mICVkIEJTUyBtYXRjaCB0aGUgZGVzaXJlICglZClTU0lEIC0gJXNcbiIsCisJCQlwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOciwgcEFkLT5TY2FuVGFiLkJzc05yLCBwQWQtPk1sbWVBdXguU3NpZExlbiwgcEFkLT5NbG1lQXV4LlNzaWQpKTsKKwlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOworCisJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSAmJgorCQkocEFkLT5Db21tb25DZmcuU3NpZExlbiA9PSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVswXS5Tc2lkTGVuKSAmJgorCQlOZGlzRXF1YWxNZW1vcnkocEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbMF0uU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbikgJiYKKwkJTUFDX0FERFJfRVFVQUwocEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5WzBdLkJzc2lkKSkKKwl7CisJCS8vIENhc2UgMS4gYWxyZWFkeSBjb25uZWN0ZWQgd2l0aCBhbiBBUCB3aG8gaGFzIHRoZSBkZXNpcmVkIFNTSUQKKwkJLy8gICAgICAgICB3aXRoIGhpZ2hlc3QgUlNTSQorCisJCS8vIEFkZCBjaGVja2luZyBNb2RlICJMRUFQIiBmb3IgQ0NYIDEuMAorCQlpZiAoKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8CisJCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKKwkJCSAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwKKwkJCSAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJCSB8fCAocEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID09IENJU0NPX0F1dGhNb2RlTEVBUCkKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKwkJCSApICYmCisJCQkocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkKKwkJeworCQkJLy8gY2FzZSAxLjEgRm9yIFdQQSwgV1BBLVBTSywgaWYgdGhlIDF4IHBvcnQgaXMgbm90IHNlY3VyZWQsIHdlIGhhdmUgdG8gcmVkbworCQkJLy8gICAgICAgICAgY29ubmVjdGlvbiBwcm9jZXNzCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbnRsT2lkU3NpZFByb2MoKTpDTlRMIC0gZGlzYXNzb2NpYXRlIHdpdGggY3VycmVudCBBUC4uLlxuIikpOworCQkJRGlzYXNzb2NQYXJtRmlsbChwQWQsICZEaXNhc3NvY1JlcSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORyk7CisJCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwKKwkJCQkJCXNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpLCAmRGlzYXNzb2NSZXEpOworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9ESVNBU1NPQzsKKwkJfQorCQllbHNlIGlmIChwQWQtPmJDb25maWdDaGFuZ2VkID09IFRSVUUpCisJCXsKKwkJCS8vIGNhc2UgMS4yIEltcG9ydGFudCBDb25maWcgaGFzIGNoYW5nZWQsIHdlIGhhdmUgdG8gcmVjb25uZWN0IHRvIHRoZSBzYW1lIEFQCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbnRsT2lkU3NpZFByb2MoKTpDTlRMIC0gZGlzYXNzb2NpYXRlIHdpdGggY3VycmVudCBBUCBCZWNhdXNlIGNvbmZpZyBjaGFuZ2VkLi4uXG4iKSk7CisJCQlEaXNhc3NvY1Bhcm1GaWxsKHBBZCwgJkRpc2Fzc29jUmVxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgUkVBU09OX0RJU0FTU09DX1NUQV9MRUFWSU5HKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRElTQVNTT0NfUkVRLAorCQkJCQkJc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCksICZEaXNhc3NvY1JlcSk7CisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0RJU0FTU09DOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gY2FzZSAxLjMuIGFscmVhZHkgY29ubmVjdGVkIHRvIHRoZSBTU0lEIHdpdGggaGlnaGVzdCBSU1NJLgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIGFscmVhZHkgd2l0aCB0aGlzIEJTU0lELiBpZ25vcmUgdGhpcyBTRVRfU1NJRCByZXF1ZXN0XG4iKSk7CisJCQkvLworCQkJLy8gKEhDVCAxMi4xKSAxY193bGFuX21lZGlhZXZlbnRzIHJlcXVpcmVkCisJCQkvLyBtZWRpYSBjb25uZWN0IGV2ZW50cyBhcmUgaW5kaWNhdGVkIHdoZW4gYXNzb2NpYXRpbmcgd2l0aCB0aGUgc2FtZSBBUAorCQkJLy8KKwkJCWlmIChJTkZSQV9PTihwQWQpKQorCQkJeworCQkJCS8vCisJCQkJLy8gU2luY2UgTWVkaWFTdGF0ZSBhbHJlYWR5IGlzIE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkCisJCQkJLy8gV2UganVzdCBpbmRpY2F0ZSB0aGUgY29ubmVjdCBldmVudCBhZ2FpbiB0byBtZWV0IHRoZSBXSFFMIHJlcXVpcmVkLgorCQkJCS8vCisJCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKwkJCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOworICAgICAgICAgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX1VQOyAgIC8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbiB0byBsaW5rIGlzIHVwCisJCQl9CisKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisjaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisKKyAgICAgICAgICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7CisgICAgICAgICAgICAgICAgbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBwQWQtPk1sbWVBdXguQnNzaWQsIE1BQ19BRERSX0xFTik7CisgICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOworCisgICAgICAgICAgICB9CisjZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwkJfQorCX0KKwllbHNlIGlmIChJTkZSQV9PTihwQWQpKQorCXsKKwkJLy8KKwkJLy8gRm9yIFJUNjEKKwkJLy8gWzg4ODg4XSBPSURfODAyXzExX1NTSUQgc2hvdWxkIGhhdmUgcmV0dXJuZWQgTkRURVNUX1dFUF9BUDIoUmV0dXJuZWQ6ICkKKwkJLy8gUlQ2MSBtYXkgbG9zdCBTU0lELCBhbmQgbm90IGNvbm5lY3QgdG8gTkRURVNUX1dFUF9BUDIgYW5kIHdpbGwgY29ubmVjdCB0byBORFRFU1RfV0VQX0FQMiBieSBBdXRvcmVjb25uZWN0CisJCS8vIEJ1dCBtZWRpYSBzdGF0dXMgaXMgY29ubmVjdGVkLCBzbyB0aGUgU1NJRCBub3QgcmVwb3J0IGNvcnJlY3RseS4KKwkJLy8KKwkJaWYgKCFTU0lEX0VRVUFMKHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbikpCisJCXsKKwkJCS8vCisJCQkvLyBEaWZmZXJlbnQgU1NJRCBtZWFucyBub3QgUm9hbWluZyBjYXNlLCBzbyB3ZSBsZXQgTGlua0Rvd24oKSB0byBJbmRpY2F0ZSBhIGRpc2Nvbm5lY3QgZXZlbnQuCisJCQkvLworCQkJcEFkLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gVFJVRTsKKwkJfQorCQkvLyBjYXNlIDIuIGFjdGl2ZSBJTkZSQSBhc3NvY2lhdGlvbiBleGlzdGVudAorCQkvLyAgICByb2FtaW5nIGlzIGRvbmUgd2l0aGluIG1pbmlwb3J0IGRyaXZlciwgbm90aGluZyB0byBkbyB3aXRoIGNvbmZpZ3VyYXRpb24KKwkJLy8gICAgdXRpbGl0eS4gc28gdXBvbiBhIG5ldyBTRVQoT0lEXzgwMl8xMV9TU0lEKSBpcyByZWNlaXZlZCwgd2UganVzdAorCQkvLyAgICBkaXNhc3NvY2lhdGUgd2l0aCB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQLAorCQkvLyAgICB0aGVuIHBlcmZvcm0gYSBuZXcgYXNzb2NpYXRpb24gd2l0aCB0aGlzIG5ldyBTU0lELCBubyBtYXR0ZXIgdGhlCisJCS8vICAgIG5ldy9vbGQgU1NJRCBhcmUgdGhlIHNhbWUgb3Igbm90LgorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbnRsT2lkU3NpZFByb2MoKTpDTlRMIC0gZGlzYXNzb2NpYXRlIHdpdGggY3VycmVudCBBUC4uLlxuIikpOworCQlEaXNhc3NvY1Bhcm1GaWxsKHBBZCwgJkRpc2Fzc29jUmVxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgUkVBU09OX0RJU0FTU09DX1NUQV9MRUFWSU5HKTsKKwkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsCisJCQkJCXNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpLCAmRGlzYXNzb2NSZXEpOworCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0RJU0FTU09DOworCX0KKwllbHNlCisJeworCQlpZiAoQURIT0NfT04ocEFkKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIGRyb3AgY3VycmVudCBBREhPQ1xuIikpOworCQkJTGlua0Rvd24ocEFkLCBGQUxTRSk7CisJCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKKwkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CisgICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6TkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVCBFdmVudCBDIVxuIikpOworCQl9CisKKwkJaWYgKChwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOciA9PSAwKSAmJgorCQkJKHBBZC0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID09IFRSVUUpICYmCisJCQkocEFkLT5NbG1lQXV4LkJzc1R5cGUgPT0gQlNTX0lORlJBKSAmJgorCQkJKE1sbWVWYWxpZGF0ZVNTSUQocEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKSA9PSBUUlVFKQorCQkJKQorCQl7CisJCQlNTE1FX1NDQU5fUkVRX1NUUlVDVCAgICAgICBTY2FuUmVxOworCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbnRsT2lkU3NpZFByb2MoKTpDTlRMIC0gTm8gbWF0Y2hpbmcgQlNTLCBzdGFydCBhIG5ldyBzY2FuXG4iKSk7CisJCQlTY2FuUGFybUZpbGwocEFkLCAmU2NhblJlcSwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCBCU1NfQU5ZLCBTQ0FOX0FDVElWRSk7CisJCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsIHNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0xJU1RfU0NBTjsKKwkJCS8vIFJlc2V0IE1pc3NlZCBzY2FuIG51bWJlcgorCQkJcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gTm93OworCQl9CisJCWVsc2UKKwkJeworCQkJcEFkLT5NbG1lQXV4LkJzc0lkeCA9IDA7CisJCQlJdGVyYXRlT25Cc3NUYWIocEFkKTsKKwkJfQorCX0KK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBDbnRsT2lkUlRCc3NpZFByb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICogRWxlbSkKK3sKKwlVTE9ORyAgICAgICBCc3NJZHg7CisJUFVDSEFSICAgICAgcE9pZEJzc2lkID0gKFBVQ0hBUilFbGVtLT5Nc2c7CisJTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUICAgIERpc2Fzc29jUmVxOworCU1MTUVfSk9JTl9SRVFfU1RSVUNUICAgICAgICBKb2luUmVxOworCisjaWZkZWYgUkFMSU5LX0FURQorLyogTm8gbmVlZCB0byBwZXJmb3JtIHRoaXMgcm91dGluZSB3aGVuIEFURSBpcyBydW5uaW5nLiAqLworCWlmIChBVEVfT04ocEFkKSkKKwkJcmV0dXJuOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCS8vIHJlY29yZCB1c2VyIGRlc2lyZWQgc2V0dGluZ3MKKwlDT1BZX01BQ19BRERSKHBBZC0+TWxtZUF1eC5Cc3NpZCwgcE9pZEJzc2lkKTsKKwlwQWQtPk1sbWVBdXguQnNzVHlwZSA9IHBBZC0+U3RhQ2ZnLkJzc1R5cGU7CisKKwkvLworCS8vIFVwZGF0ZSBSZWNvbm5lY3QgU3NpZCwgdGhhdCB1c2VyIGRlc2lyZWQgdG8gY29ubmVjdC4KKwkvLworCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKKwlwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4gPSBwQWQtPk1sbWVBdXguU3NpZExlbjsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbik7CisKKwkvLyBmaW5kIHRoZSBkZXNpcmVkIEJTUyBpbiB0aGUgbGF0ZXN0IFNDQU4gcmVzdWx0IHRhYmxlCisJQnNzSWR4ID0gQnNzVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgcE9pZEJzc2lkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCk7CisJaWYgKEJzc0lkeCA9PSBCU1NfTk9UX0ZPVU5EKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEJTU0lEIG5vdCBmb3VuZC4gcmVwbHkgTkRJU19TVEFUVVNfTk9UX0FDQ0VQVEVEXG4iKSk7CisJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJCXJldHVybjsKKwl9CisKKwkvLyBjb3B5IHRoZSBtYXRjaGVkIEJTUyBlbnRyeSBmcm9tIFNjYW5UYWIgdG8gTWxtZUF1eC5Tc2lkQnNzVGFiLiBXaHk/CisJLy8gQmVjYXVzZSB3ZSBuZWVkIHRoaXMgZW50cnkgdG8gYmVjb21lIHRoZSBKT0lOIHRhcmdldCBpbiBsYXRlciBvbiBTWU5DIHN0YXRlIG1hY2hpbmUKKwlwQWQtPk1sbWVBdXguQnNzSWR4ID0gMDsKKwlwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOciA9IDE7CisJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5WzBdLCAmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0sIHNpemVvZihCU1NfRU5UUlkpKTsKKworCS8vcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uU3NpZExlbjsKKwkvL05kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uU3NpZCwgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uU3NpZExlbik7CisKKwkvLyBBZGQgU1NJRCBpbnRvIE1sbWVBdXggZm9yIHNpdGUgc3VyZXkgam9pbmluZyBoaWRkZW4gU1NJRAorCS8vcEFkLT5NbG1lQXV4LlNzaWRMZW4gPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5Tc2lkTGVuOworCS8vTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKKworCS8vIDIwMDItMTEtMjYgc2tpcCB0aGUgZm9sbG93aW5nIGNoZWNraW5nLiBpLmUuIGlmIHVzZXIgd2FudHMgdG8gcmUtY29ubmVjdCB0byBzYW1lIEFQCisJLy8gICB3ZSBqdXN0IGZvbGxvdyBub3JtYWwgcHJvY2VkdXJlLiBUaGUgcmVhc29uIG9mIHVzZXIgZG9pbmcgdGhpcyBtYXkgYmVjYXVzZSBoZS9zaGUgY2hhbmdlZAorCS8vICAgQVAgdG8gYW5vdGhlciBjaGFubmVsLCBidXQgd2Ugc3RpbGwgcmVjZWl2ZWQgQkVBQ09OIGZyb20gaXQgdGh1cyBkb24ndCBjbGFpbSBMaW5rIERvd24uCisJLy8gICBTaW5jZSB1c2VyIGtub3dzIGhlJ3MgY2hhbmdlZCBBUCBjaGFubmVsLCBoZSdsbCByZS1jb25uZWN0IGFnYWluLiBCeSBza2lwcGluZyB0aGUgZm9sbG93aW5nCisJLy8gICBjaGVja2luZywgd2UnbGwgZGlzYXNzb2NpYXRlIHRoZW4gcmUtZG8gbm9ybWFsIGFzc29jaWF0aW9uIHdpdGggdGhpcyBBUCBhdCB0aGUgbmV3IGNoYW5uZWwuCisJLy8gMjAwMy0xLTYgUmUtZW5hYmxlIHRoaXMgZmVhdHVyZSBiYXNlZCBvbiBtaWNyb3NvZnQgcmVxdWlyZW1lbnQgd2hpY2ggcHJlZmVyIG5vdCB0byByZS1kbworCS8vICAgY29ubmVjdGlvbiB3aGVuIHNldHRpbmcgdGhlIHNhbWUgQlNTSUQuCisJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSAmJgorCQlNQUNfQUREUl9FUVVBTChwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcE9pZEJzc2lkKSkKKwl7CisJCS8vIGFscmVhZHkgY29ubmVjdGVkIHRvIHRoZSBzYW1lIEJTU0lELCBnbyBiYWNrIHRvIGlkbGUgc3RhdGUgZGlyZWN0bHkKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIGFscmVhZHkgaW4gdGhpcyBCU1NJRC4gaWdub3JlIHRoaXMgU0VUX0JTU0lEIHJlcXVlc3RcbiIpKTsKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKKworICAgICAgICAgICAgICAgIG1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkod3JxdS5hcF9hZGRyLnNhX2RhdGEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKKyAgICAgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CisKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCX0KKwllbHNlCisJeworCQlpZiAoSU5GUkFfT04ocEFkKSkKKwkJeworCQkJLy8gZGlzYXNzb2MgZnJvbSBjdXJyZW50IEFQIGZpcnN0CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gZGlzYXNzb2NpYXRlIHdpdGggY3VycmVudCBBUCAuLi5cbiIpKTsKKwkJCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkcpOworCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsCisJCQkJCQlzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSwgJkRpc2Fzc29jUmVxKTsKKworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9ESVNBU1NPQzsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmIChBREhPQ19PTihwQWQpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBkcm9wIGN1cnJlbnQgQURIT0NcbiIpKTsKKwkJCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKKwkJCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7CisJCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKKyAgICAgICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQyFcbiIpKTsKKwkJCX0KKworCQkJLy8gQ2hhbmdlIHRoZSB3ZXBzdGF0dXMgdG8gb3JpZ2luYWwgd2Vwc3RhdHVzCisJCQlwQWQtPlN0YUNmZy5XZXBTdGF0dXMgICA9IHBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXM7CisJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyICA9IHBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXM7CisJCQlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9IHBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXM7CisKKwkJCS8vIENoZWNrIGNpcGhlciBzdWl0ZSwgQVAgbXVzdCBoYXZlIG1vcmUgc2VjdXJlZCBjaXBoZXIgdGhhbiBzdGF0aW9uIHNldHRpbmcKKwkJCS8vIFNldCB0aGUgUGFpcndpc2UgYW5kIEdyb3VwIGNpcGhlciB0byBtYXRjaCB0aGUgaW50ZW5kZWQgQVAgc2V0dGluZworCQkJLy8gV2UgY2FuIG9ubHkgY29ubmVjdCB0byBBUCB3aXRoIGxlc3Mgc2VjdXJlZCBjaXBoZXIgc2V0dGluZworCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKQorCQkJeworCQkJCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLkdyb3VwQ2lwaGVyOworCisJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlcikKKwkJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5QYWlyQ2lwaGVyOworCQkJCWVsc2UgaWYgKHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5QYWlyQ2lwaGVyQXV4ICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKKwkJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5QYWlyQ2lwaGVyQXV4OworCQkJCWVsc2UJLy8gVGhlcmUgaXMgbm8gUGFpckNpcGhlciBBdXgsIGRvd25ncmFkZSBvdXIgY2FwYWJpbGl0eSB0byBUS0lQCisJCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCQkJfQorCQkJZWxzZSBpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKKwkJCXsKKwkJCQlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuR3JvdXBDaXBoZXI7CisKKwkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlcikKKwkJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlcjsKKwkJCQllbHNlIGlmIChwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlBhaXJDaXBoZXJBdXggIT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQorCQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5QYWlyQ2lwaGVyQXV4OworCQkJCWVsc2UJLy8gVGhlcmUgaXMgbm8gUGFpckNpcGhlciBBdXgsIGRvd25ncmFkZSBvdXIgY2FwYWJpbGl0eSB0byBUS0lQCisJCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCisJCQkJLy8gUlNOIGNhcGFiaWxpdHkKKwkJCQlwQWQtPlN0YUNmZy5Sc25DYXBhYmlsaXR5ID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5Sc25DYXBhYmlsaXR5OworCQkJfQorCisJCQkvLyBTZXQgTWl4IGNpcGhlciBmbGFnCisJCQlwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyID0gKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIpID8gRkFMU0UgOiBUUlVFOworCQkJaWYgKHBBZC0+U3RhQ2ZnLmJNaXhDaXBoZXIgPT0gVFJVRSkKKwkJCXsKKwkJCQkvLyBJZiBtaXggY2lwaGVyLCByZS1idWlsZCBSU05JRQorCQkJCVJUTVBNYWtlUlNOSUUocEFkLCBwQWQtPlN0YUNmZy5BdXRoTW9kZSwgcEFkLT5TdGFDZmcuV2VwU3RhdHVzLCAwKTsKKwkJCX0KKwkJCS8vIE5vIGFjdGl2ZSBhc3NvY2lhdGlvbiwgam9pbiB0aGUgQlNTIGltbWVkaWF0ZWx5CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gam9pbmluZyAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAuLi5cbiIsCisJCQkJcE9pZEJzc2lkWzBdLHBPaWRCc3NpZFsxXSxwT2lkQnNzaWRbMl0scE9pZEJzc2lkWzNdLHBPaWRCc3NpZFs0XSxwT2lkQnNzaWRbNV0pKTsKKworCQkJSm9pblBhcm1GaWxsKHBBZCwgJkpvaW5SZXEsIHBBZC0+TWxtZUF1eC5Cc3NJZHgpOworCQkJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0pPSU5fUkVRLCBzaXplb2YoTUxNRV9KT0lOX1JFUV9TVFJVQ1QpLCAmSm9pblJlcSk7CisKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfSk9JTjsKKwkJfQorCX0KK30KKworLy8gUm9hbWluZyBpcyB0aGUgb25seSBleHRlcm5hbCByZXF1ZXN0IHRyaWdnZXJpbmcgQ05UTCBzdGF0ZSBtYWNoaW5lCisvLyBkZXNwaXRlIG9mIG90aGVyICJTRVQgT0lEIiBvcGVyYXRpb24uIEFsbCAiU0VUIE9JRCIgcmVsYXRlZCBvZXJhdGlvbnMKKy8vIGhhcHBlbiBpbiBzZXF1ZW5jZSwgYmVjYXVzZSBubyBvdGhlciBTRVQgT0lEIHdpbGwgYmUgc2VudCB0byB0aGlzIGRldmljZQorLy8gdW50aWwgdGhlIHRoZSBwcmV2aW91cyBTRVQgb3BlcmF0aW9uIGlzIGNvbXBsZXRlIChzdWNjZXNzZnVsIG8gZmFpbGVkKS4KKy8vIFNvLCBob3cgZG8gd2UgcXVhcmFudGVlIHRoaXMgUk9BTUlORyByZXF1ZXN0IHdvbid0IGNvcnJ1cHQgb3RoZXIgIlNFVCBPSUQiPworLy8gb3IgYmVlbiBjb3JydXB0ZWQgYnkgb3RoZXIgIlNFVCBPSUQiPworLy8KKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRCBDbnRsTWxtZVJvYW1pbmdQcm9jKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwkvLyBUT0RPOgorCS8vIEFQIGluIGRpZmZlcmVudCBjaGFubmVsIG1heSBzaG93IGxvd2VyIFJTU0kgdGhhbiBhY3R1YWwgdmFsdWU/PworCS8vIHNob3VsZCB3ZSBhZGQgYSB3ZWlnaHRpbmcgZmFjdG9yIHRvIGNvbXBlbnNhdGUgaXQ/CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJDTlRMIC0gUm9hbWluZyBpbiBNbG1lQXV4LlJvYW1UYWIuLi5cbiIpKTsKKworCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguU3NpZEJzc1RhYiwgJnBBZC0+TWxtZUF1eC5Sb2FtVGFiLCBzaXplb2YocEFkLT5NbG1lQXV4LlJvYW1UYWIpKTsKKwlwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOciA9IHBBZC0+TWxtZUF1eC5Sb2FtVGFiLkJzc05yOworCisJQnNzVGFibGVTb3J0QnlSc3NpKCZwQWQtPk1sbWVBdXguU3NpZEJzc1RhYik7CisJcEFkLT5NbG1lQXV4LkJzc0lkeCA9IDA7CisJSXRlcmF0ZU9uQnNzVGFiKHBBZCk7Cit9CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIENudGxPaWRETFNTZXR1cFByb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVBSVF84MDJfMTFfRExTCQlwRExTID0gKFBSVF84MDJfMTFfRExTKUVsZW0tPk1zZzsKKwlNTE1FX0RMU19SRVFfU1RSVUNUCU1sbWVEbHNSZXE7CisJSU5UCQkJCQlpOworCVVTSE9SVAkJCQlyZWFzb24gPSBSRUFTT05fVU5TUEVDSUZZOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJDTlRMIC0gKE9JRCBzZXQgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggd2l0aCBWYWxpZD0lZCwgU3RhdHVzPSVkLCBUaW1lT3V0PSVkLCBDb3VudERvd25UaW1lcj0lZClcbiIsCisJCXBETFMtPk1hY0FkZHJbMF0sIHBETFMtPk1hY0FkZHJbMV0sIHBETFMtPk1hY0FkZHJbMl0sIHBETFMtPk1hY0FkZHJbM10sIHBETFMtPk1hY0FkZHJbNF0sIHBETFMtPk1hY0FkZHJbNV0sCisJCXBETFMtPlZhbGlkLCBwRExTLT5TdGF0dXMsIHBETFMtPlRpbWVPdXQsIHBETFMtPkNvdW50RG93blRpbWVyKSk7CisKKwlpZiAoIXBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQorCQlyZXR1cm47CisKKwkvLyBETFMgd2lsbCBub3QgYmUgc3VwcG9ydGVkIHdoZW4gQWRob2MgbW9kZQorCWlmIChJTkZSQV9PTihwQWQpKQorCXsKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJCXsKKwkJCWlmIChwRExTLT5WYWxpZCAmJiBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpICYmCisJCQkJKHBETFMtPlRpbWVPdXQgPT0gcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dCkgJiYgTUFDX0FERFJfRVFVQUwocERMUy0+TWFjQWRkciwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCQl7CisJCQkJLy8gMS4gU2FtZSBzZXR0aW5nLCBqdXN0IGRyb3AgaXQKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkNOVEwgLSBzZXR0aW5nIHVuY2hhbmdlZFxuIikpOworCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZSBpZiAoIXBETFMtPlZhbGlkICYmIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkgJiYKKwkJCQlNQUNfQUREUl9FUVVBTChwRExTLT5NYWNBZGRyLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJCXsKKwkJCQkvLyAyLiBEaXNhYmxlIERMUyBsaW5rIGNhc2UsIGp1c3QgdGVhciBkb3duIERMUyBsaW5rCisJCQkJcmVhc29uID0gUkVBU09OX1FPU19VTldBTlRFRF9NRUNIQU5JU007CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKKwkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7CisJCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1RFQVJfRE9XTiwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJDTlRMIC0gc3RhcnQgdGVhciBkb3duIHByb2NlZHVyZVxuIikpOworCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZSBpZiAoKGkgPCBNQVhfTlVNX09GX0RMU19FTlRSWSkgJiYgcERMUy0+VmFsaWQgJiYgIXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkKQorCQkJeworCQkJCS8vIDMuIEVuYWJsZSBjYXNlLCBzdGFydCBETFMgc2V0dXAgcHJvY2VkdXJlCisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCBwRExTLCBzaXplb2YoUlRfODAyXzExX0RMU19VSSkpOworCisJCQkJLy9VcGRhdGUgY291bnRkb3duIHRpbWVyCisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgPSBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0OworCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfUkVRLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkNOVEwgLSBETFMgc2V0dXAgY2FzZVxuIikpOworCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZSBpZiAoKGkgPCBNQVhfTlVNX09GX0RMU19FTlRSWSkgJiYgcERMUy0+VmFsaWQgJiYgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYKKwkJCQkocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpICYmICFNQUNfQUREUl9FUVVBTChwRExTLT5NYWNBZGRyLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJCXsKKwkJCQkvLyA0LiB1cGRhdGUgbWFjIGNhc2UsIHRlYXIgZG93biBvbGQgRExTIGFuZCBzZXR1cCBuZXcgRExTCisJCQkJcmVhc29uID0gUkVBU09OX1FPU19VTldBTlRFRF9NRUNIQU5JU007CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKKwkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7CisJCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1RFQVJfRE9XTiwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCBwRExTLCBzaXplb2YoUlRfODAyXzExX0RMU19VSSkpOworCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfUkVRLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkNOVEwgLSBETFMgdGVhciBkb3duIGFuZCByZXN0YXJ0IGNhc2VcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UgaWYgKHBETFMtPlZhbGlkICYmIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmCisJCQkJTUFDX0FERFJfRVFVQUwocERMUy0+TWFjQWRkciwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQgIT0gcERMUy0+VGltZU91dCkpCisJCQl7CisJCQkJLy8gNS4gdXBkYXRlIHRpbWVvdXQgY2FzZSwgc3RhcnQgRExTIHNldHVwIHByb2NlZHVyZSAobm8gdGVhciBkb3duKQorCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQJPSBwRExTLT5UaW1lT3V0OworCQkJCS8vVXBkYXRlIGNvdW50ZG93biB0aW1lcgorCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLkNvdW50RG93blRpbWVyID0gcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dDsKKwkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7CisJCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1JFUSwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJDTlRMIC0gRExTIHVwZGF0ZSB0aW1lb3V0IGNhc2VcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UgaWYgKHBETFMtPlZhbGlkICYmIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmCisJCQkJKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyAhPSBETFNfRklOSVNIKSAmJiBNQUNfQUREUl9FUVVBTChwRExTLT5NYWNBZGRyLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJCXsKKwkJCQkvLyA2LiByZS1zZXR1cCBjYXNlLCBzdGFydCBETFMgc2V0dXAgcHJvY2VkdXJlIChubyB0ZWFyIGRvd24pCisJCQkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCByZWFzb24pOworCQkJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19SRVEsIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQ05UTCAtIERMUyByZXRyeSBzZXR1cCBwcm9jZWR1cmVcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCgiQ05UTCAtIERMUyBub3QgY2hhbmdlZCBpbiBlbnRyeSAtICVkIC0gVmFsaWQ9JWQsIFN0YXR1cz0lZCwgVGltZU91dD0lZFxuIiwKKwkJCQkJaSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cywgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dCkpOworCQkJfQorCQl9CisJfQorfQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBDbnRsV2FpdERpc2Fzc29jUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJTUxNRV9TVEFSVF9SRVFfU1RSVUNUICAgICBTdGFydFJlcTsKKworCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9ESVNBU1NPQ19DT05GKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIERpcy1hc3NvY2lhdGUgc3VjY2Vzc2Z1bFxuIikpOworCisJICAgIGlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJeworCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfRElTQVNTT0NfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKwkJfQorCisJCUxpbmtEb3duKHBBZCwgRkFMU0UpOworCisJCS8vIGNhc2UgMS4gbm8gbWF0Y2hpbmcgQlNTLCBhbmQgdXNlciB3YW50cyBBREhPQywgc28gd2UganVzdCBzdGFydCBhIG5ldyBvbmUKKwkJaWYgKChwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOcj09MCkgJiYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIE5vIG1hdGNoaW5nIEJTUywgc3RhcnQgYSBuZXcgQURIT0MgKFNzaWQ9JXMpLi4uXG4iLHBBZC0+TWxtZUF1eC5Tc2lkKSk7CisJCQlTdGFydFBhcm1GaWxsKHBBZCwgJlN0YXJ0UmVxLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOworCQkJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NUQVJUX1JFUSwgc2l6ZW9mKE1MTUVfU1RBUlRfUkVRX1NUUlVDVCksICZTdGFydFJlcSk7CisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX1NUQVJUOworCQl9CisJCS8vIGNhc2UgMi4gdHJ5IGVhY2ggbWF0Y2hlZCBCU1MKKwkJZWxzZQorCQl7CisJCQlwQWQtPk1sbWVBdXguQnNzSWR4ID0gMDsKKworCQkJSXRlcmF0ZU9uQnNzVGFiKHBBZCk7CisJCX0KKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIENudGxXYWl0Sm9pblByb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCAgICAgICAgICAgICAgICAgICAgICBSZWFzb247CisJTUxNRV9BVVRIX1JFUV9TVFJVQ1QgICAgICAgIEF1dGhSZXE7CisKKwlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfSk9JTl9DT05GKQorCXsKKwkJTmRpc01vdmVNZW1vcnkoJlJlYXNvbiwgRWxlbS0+TXNnLCBzaXplb2YoVVNIT1JUKSk7CisJCWlmIChSZWFzb24gPT0gTUxNRV9TVUNDRVNTKQorCQl7CisJCQkvLyAxLiBqb2luZWQgYW4gSUJTUywgd2UgYXJlIHByZXR0eSBtdWNoIGRvbmUgaGVyZQorCQkJaWYgKHBBZC0+TWxtZUF1eC5Cc3NUeXBlID09IEJTU19BREhPQykKKwkJCXsKKwkJCSAgICAvLworCQkJCS8vIDVHIGJhbmRzIHJ1bGVzIG9mIEphcGFuOgorCQkJCS8vIEFkIGhvYyBtdXN0IGJlIGRpc2FibGVkIGluIFc1MyhjaDUyLDU2LDYwLDY0KSBjaGFubmVscy4KKwkJCQkvLworCQkJCWlmICggKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpICYmCisgICAgICAgICAgICAgICAgICAgICAgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQkJCSAgICkKKwkJCQl7CisJCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBDaGFubmVsPSVkLCBKb2luIGFkaG9jIG9uIFc1Myg1Miw1Niw2MCw2NCkgQ2hhbm5lbHMgYXJlIG5vdCBhY2NlcHRlZFxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCQkJCQlyZXR1cm47CisJCQkJfQorCisJCQkJTGlua1VwKHBBZCwgQlNTX0FESE9DKTsKKwkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBqb2luIHRoZSBJQlNTID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggLi4uXG4iLAorCQkJCXBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzBdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzFdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzJdLAorCQkJCXBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzNdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzRdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzVdKSk7CisKKyAgICAgICAgICAgICAgICBwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworICAgICAgICAgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX1VQOworCQkJfQorCQkJLy8gMi4gam9pbmVkIGEgbmV3IElORlJBIG5ldHdvcmssIHN0YXJ0IGZyb20gYXV0aGVudGljYXRpb24KKwkJCWVsc2UKKwkJCXsKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJCQkvLyBBZGQgQXV0aE1vZGUgIkxFQVAiIGZvciBDQ1ggMS5YCisJCQkJaWYgKHBBZC0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSA9PSBDSVNDT19BdXRoTW9kZUxFQVApCisJCQkJeworCQkJCQlBdXRoUGFybUZpbGwocEFkLCAmQXV0aFJlcSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBDSVNDT19BdXRoTW9kZUxFQVApOworCQkJCX0KKwkJCQllbHNlCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCQkJeworCQkJCQkvLyBlaXRoZXIgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkIG9yIE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gsIHRyeSBzaGFyZWQga2V5IGZpcnN0CisJCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKSB8fAorCQkJCQkJKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gpKQorCQkJCQl7CisJCQkJCQlBdXRoUGFybUZpbGwocEFkLCAmQXV0aFJlcSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJQXV0aFBhcm1GaWxsKHBBZCwgJkF1dGhSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTmRpczgwMl8xMUF1dGhNb2RlT3Blbik7CisJCQkJCX0KKwkJCQl9CisJCQkJTWxtZUVucXVldWUocEFkLCBBVVRIX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0FVVEhfUkVRLAorCQkJCQkJCXNpemVvZihNTE1FX0FVVEhfUkVRX1NUUlVDVCksICZBdXRoUmVxKTsKKworCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfQVVUSDsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIDMuIGZhaWxlZCwgdHJ5IG5leHQgQlNTCisJCQlwQWQtPk1sbWVBdXguQnNzSWR4Kys7CisJCQlJdGVyYXRlT25Cc3NUYWIocEFkKTsKKwkJfQorCX0KK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBDbnRsV2FpdFN0YXJ0UHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUICAgICAgUmVzdWx0OworCisJaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX1NUQVJUX0NPTkYpCisJeworCQlOZGlzTW92ZU1lbW9yeSgmUmVzdWx0LCBFbGVtLT5Nc2csIHNpemVvZihVU0hPUlQpKTsKKwkJaWYgKFJlc3VsdCA9PSBNTE1FX1NVQ0NFU1MpCisJCXsKKwkJICAgIC8vCisJCQkvLyA1RyBiYW5kcyBydWxlcyBvZiBKYXBhbjoKKwkJCS8vIEFkIGhvYyBtdXN0IGJlIGRpc2FibGVkIGluIFc1MyhjaDUyLDU2LDYwLDY0KSBjaGFubmVscy4KKwkJCS8vCisJCQlpZiAoIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJgorICAgICAgICAgICAgICAgICAgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQkJICAgKQorCQkJeworCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIENoYW5uZWw9JWQsIFN0YXJ0IGFkaG9jIG9uIFc1Myg1Miw1Niw2MCw2NCkgQ2hhbm5lbHMgYXJlIG5vdCBhY2NlcHRlZFxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCQkJCXJldHVybjsKKwkJCX0KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpCisJCQl7CisJCQkJTl9DaGFubmVsQ2hlY2socEFkKTsKKwkJCQlTZXRDb21tb25IVChwQWQpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguQWRkSHRJbmZvLCAmcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKKwkJCQlSVE1QQ2hlY2tIdChwQWQsIEJTU0lEX1dDSUQsICZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksICZwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8pOworCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID0gVFJVRTsKKwkJCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0sIDE2KTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0sICZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzBdLCAxNik7CisJCQkJQ09QWV9IVFNFVFRJTkdTX0ZST01fTUxNRV9BVVhfVE9fQUNUSVZFX0NGRyhwQWQpOworCisJCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCAgPT0gQldfNDApICYmCisJCQkJCShwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0gRVhUQ0hBX0FCT1ZFKSkKKwkJCQl7CisJCQkJCXBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgKyAyOworCQkJCX0KKwkJCQllbHNlIGlmICgocEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggID09IEJXXzQwKSAmJgorCQkJCQkJIChwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0gRVhUQ0hBX0JFTE9XKSkKKwkJCQl7CisJCQkJCXBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgLSAyOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCXsKKwkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9IEZBTFNFOworCQkJfQorCQkJTGlua1VwKHBBZCwgQlNTX0FESE9DKTsKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJCQkvLyBCZWZvcmUgc2VuZCBiZWFjb24sIGRyaXZlciBuZWVkIGRvIHJhZGFyIGRldGVjdGlvbgorCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQgKQorCQkJCSYmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKQorCQkJCSYmIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpCisJCQl7CisJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlID0gUkRfU0lMRU5DRV9NT0RFOworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJEQ291bnQgPSAwOworI2lmZGVmIERGU19TVVBQT1JUCisJCQkJQmJwUmFkYXJEZXRlY3Rpb25TdGFydChwQWQpOworI2VuZGlmIC8vIERGU19TVVBQT1JUIC8vCisJCQl9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBzdGFydCBhIG5ldyBJQlNTID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggLi4uXG4iLAorCQkJCXBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzBdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzFdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzJdLAorCQkJCXBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzNdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzRdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzVdKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gU3RhcnQgSUJTUyBmYWlsLiBCVUchISEhIVxuIikpOworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKwkJfQorCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQ250bFdhaXRBdXRoUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICBSZWFzb247CisJTUxNRV9BU1NPQ19SRVFfU1RSVUNUICAgICAgICBBc3NvY1JlcTsKKwlNTE1FX0FVVEhfUkVRX1NUUlVDVCAgICAgICAgIEF1dGhSZXE7CisKKwlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfQVVUSF9DT05GKQorCXsKKwkJTmRpc01vdmVNZW1vcnkoJlJlYXNvbiwgRWxlbS0+TXNnLCBzaXplb2YoVVNIT1JUKSk7CisJCWlmIChSZWFzb24gPT0gTUxNRV9TVUNDRVNTKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQVVUSCBPS1xuIikpOworCQkJQXNzb2NQYXJtRmlsbChwQWQsICZBc3NvY1JlcSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBwQWQtPk1sbWVBdXguQ2FwYWJpbGl0eUluZm8sCisJCQkJCQkgIEFTU09DX1RJTUVPVVQsIHBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCk7CisKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJCS8vCisJCQkvLyBDaXNjbyBMZWFwIENDS00gc3VwcG9ydGVkIFJlLWFzc29jaWF0aW9uLgorCQkJLy8KKwkJCWlmIChMRUFQX0NDS01fT04ocEFkKSAmJiAocEFkLT5TdGFDZmcuQ0NLTUxpbmtVcEZsYWcgPT0gVFJVRSkpCisJCQl7CisJCQkJLy9pZiBDQ0tNIGlzIHR1cm4gb24gLCB0aGF0J3MgbWVhbiBGYXN0IFJlYXV0aGVudGljYXRpb24KKwkJCQkvL1VzZSBDQ0tNIFJlYXNzb2NpYXRpb24gaW5zdGVhZCBvZiBub3JtYWwgYXNzb2NpYXRpb24gZm9yIEZhc3QgUm9hbWluZy4KKwkJCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1JFQVNTT0NfUkVRLAorCQkJCQkJCXNpemVvZihNTE1FX0FTU09DX1JFUV9TVFJVQ1QpLCAmQXNzb2NSZXEpOworCisJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9SRUFTU09DOworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIExFQVBfU1VQUE9SVCAvLworCQkJeworCQkJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfQVNTT0NfUkVRLAorCQkJCQkJCXNpemVvZihNTE1FX0FTU09DX1JFUV9TVFJVQ1QpLCAmQXNzb2NSZXEpOworCisJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9BU1NPQzsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIFRoaXMgZmFpbCBtYXkgYmVjYXVzZSBvZiB0aGUgQVAgYWxyZWFkeSBrZWVwIHVzIGluIGl0cyBNQUMgdGFibGUgd2l0aG91dAorCQkJLy8gYWdlaW5nLW91dC4gVGhlIHByZXZpb3VzIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHQgbXVzdCBoYXZlIGxldCBpdCByZW1vdmUgdXMuCisJCQkvLyBzbyB0cnkgQXV0aGVudGljYXRpb24gYWdhaW4gbWF5IGhlbHAuIEZvciBELUxpbmsgRFdMLTkwMEFQKyBjb21wYXRpYmlsaXR5LgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFVVEggRkFJTCwgdHJ5IGFnYWluLi4uXG4iKSk7CisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQkvL0FkZCBBdXRoTW9kZSAiTEVBUCIgZm9yIENDWCAxLlgKKwkJCWlmIChwQWQtPlN0YUNmZy5MZWFwQXV0aE1vZGUgPT0gQ0lTQ09fQXV0aE1vZGVMRUFQKQorCQkJeworCQkJCUF1dGhQYXJtRmlsbChwQWQsICZBdXRoUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsIENJU0NPX0F1dGhNb2RlTEVBUCk7CisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCQl7CisJCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpIHx8CisJCQkJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoKSkKKwkJCQl7CisJCQkJCS8vIGVpdGhlciBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQgb3IgTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCwgdHJ5IHNoYXJlZCBrZXkgZmlyc3QKKwkJCQkJQXV0aFBhcm1GaWxsKHBBZCwgJkF1dGhSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJQXV0aFBhcm1GaWxsKHBBZCwgJkF1dGhSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTmRpczgwMl8xMUF1dGhNb2RlT3Blbik7CisJCQkJfQorCQkJfQorCQkJTWxtZUVucXVldWUocEFkLCBBVVRIX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0FVVEhfUkVRLAorCQkJCQkJc2l6ZW9mKE1MTUVfQVVUSF9SRVFfU1RSVUNUKSwgJkF1dGhSZXEpOworCisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0FVVEgyOworCQl9CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBDbnRsV2FpdEF1dGhQcm9jMigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICBSZWFzb247CisJTUxNRV9BU1NPQ19SRVFfU1RSVUNUICAgICAgICBBc3NvY1JlcTsKKwlNTE1FX0FVVEhfUkVRX1NUUlVDVCAgICAgICAgIEF1dGhSZXE7CisKKwlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfQVVUSF9DT05GKQorCXsKKwkJTmRpc01vdmVNZW1vcnkoJlJlYXNvbiwgRWxlbS0+TXNnLCBzaXplb2YoVVNIT1JUKSk7CisJCWlmIChSZWFzb24gPT0gTUxNRV9TVUNDRVNTKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQVVUSCBPS1xuIikpOworCQkJQXNzb2NQYXJtRmlsbChwQWQsICZBc3NvY1JlcSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBwQWQtPk1sbWVBdXguQ2FwYWJpbGl0eUluZm8sCisJCQkJCQkgIEFTU09DX1RJTUVPVVQsIHBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCk7CisJCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0FTU09DX1JFUSwKKwkJCQkJCXNpemVvZihNTE1FX0FTU09DX1JFUV9TVFJVQ1QpLCAmQXNzb2NSZXEpOworCisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0FTU09DOworCQl9CisJCWVsc2UKKwkJeworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJLy8gUHJvY2VzcyBMRUFQIGZpcnN0LCBzaW5jZSBpdCB1c2UgZGlmZmVyZW50IGNvbnRyb2wgdmFyaWFibGUKKwkJCS8vIFdlIGRvbid0IHdhbnQgdG8gYWZmZWN0IG90aGVyIHBvdmVuIG9wZXJhdGlvbgorCQkJaWYgKHBBZC0+U3RhQ2ZnLkxlYXBBdXRoTW9kZSA9PSBDSVNDT19BdXRoTW9kZUxFQVApCisJCQl7CisJCQkJLy8gTEVBUCBBdXRoIG5vdCBzdWNjZXNzLCB0cnkgbmV4dCBCU1MKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gKkxFQVAqIEFVVEggRkFJTCwgZ2l2ZSB1cDsgdHJ5IG5leHQgQlNTXG4iKSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVG90YWwgbWF0Y2ggQlNTSUQgWz0lZF1cbiIsIHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc05yKSk7CisJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKwkJCQlwQWQtPk1sbWVBdXguQnNzSWR4Kys7CisJCQkJSXRlcmF0ZU9uQnNzVGFiKHBBZCk7CisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gpICYmCisJCQkJIChwQWQtPk1sbWVBdXguQWxnID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFVVEggRkFJTCwgdHJ5IE9QRU4gc3lzdGVtLi4uXG4iKSk7CisJCQkJQXV0aFBhcm1GaWxsKHBBZCwgJkF1dGhSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTmRpczgwMl8xMUF1dGhNb2RlT3Blbik7CisJCQkJTWxtZUVucXVldWUocEFkLCBBVVRIX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0FVVEhfUkVRLAorCQkJCQkJCXNpemVvZihNTE1FX0FVVEhfUkVRX1NUUlVDVCksICZBdXRoUmVxKTsKKworCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfQVVUSDI7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gbm90IHN1Y2Nlc3MsIHRyeSBuZXh0IEJTUworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBVVRIIEZBSUwsIGdpdmUgdXA7IHRyeSBuZXh0IEJTU1xuIikpOworCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7IC8vPz8/Pz8/PworCQkJCXBBZC0+TWxtZUF1eC5Cc3NJZHgrKzsKKwkJCQlJdGVyYXRlT25Cc3NUYWIocEFkKTsKKwkJCX0KKwkJfQorCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQ250bFdhaXRBc3NvY1Byb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCAgICAgIFJlYXNvbjsKKworCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9BU1NPQ19DT05GKQorCXsKKwkJTmRpc01vdmVNZW1vcnkoJlJlYXNvbiwgRWxlbS0+TXNnLCBzaXplb2YoVVNIT1JUKSk7CisJCWlmIChSZWFzb24gPT0gTUxNRV9TVUNDRVNTKQorCQl7CisJCQlMaW5rVXAocEFkLCBCU1NfSU5GUkEpOworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBc3NvY2lhdGlvbiBzdWNjZXNzZnVsIG9uIEJTUyAjJWxkXG4iLHBBZC0+TWxtZUF1eC5Cc3NJZHgpKTsKKworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQkJeworCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0FTU09DX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBub3Qgc3VjY2VzcywgdHJ5IG5leHQgQlNTCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQXNzb2NpYXRpb24gZmFpbHMgb24gQlNTICMlbGRcbiIscEFkLT5NbG1lQXV4LkJzc0lkeCkpOworCQkJcEFkLT5NbG1lQXV4LkJzc0lkeCsrOworCQkJSXRlcmF0ZU9uQnNzVGFiKHBBZCk7CisJCX0KKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIENudGxXYWl0UmVhc3NvY1Byb2MoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCAgICAgIFJlc3VsdDsKKworCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9SRUFTU09DX0NPTkYpCisJeworCQlOZGlzTW92ZU1lbW9yeSgmUmVzdWx0LCBFbGVtLT5Nc2csIHNpemVvZihVU0hPUlQpKTsKKwkJaWYgKFJlc3VsdCA9PSBNTE1FX1NVQ0NFU1MpCisJCXsKKwkJCS8vCisJCQkvLyBORElTIHJlcXVpcmVzIGEgbmV3IExpbmsgVVAgaW5kaWNhdGlvbiBidXQgbm8gTGluayBEb3duIGZvciBSRS1BU1NPQworCQkJLy8KKwkJCUxpbmtVcChwQWQsIEJTU19JTkZSQSk7CisKKwkJCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3IgYXNzb2NpYXRpb24KKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19BU1NPQ19FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworCisKKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJCWlmIChMRUFQX0NDS01fT04ocEFkKSkKKwkJCXsKKwkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZCk7CisJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19GSU5JU0g7CisJCQl9CisjZW5kaWYgLy8gTEVBUF9TVVBQT1JUIC8vCisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIFJlLWFzc29jaXRpb24gc3VjY2Vzc2Z1bCBvbiBCU1MgIyVsZFxuIiwgcEFkLT5NbG1lQXV4LlJvYW1JZHgpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIHJlYXNzb2MgZmFpbGVkLCB0cnkgdG8gcGljayBuZXh0IEJTUyBpbiB0aGUgQlNTIFRhYmxlCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gUmUtYXNzb2NpdGlvbiBmYWlscyBvbiBCU1MgIyVsZFxuIiwgcEFkLT5NbG1lQXV4LlJvYW1JZHgpKTsKKwkJCXBBZC0+TWxtZUF1eC5Sb2FtSWR4Kys7CisJCQlJdGVyYXRlT25Cc3NUYWIyKHBBZCk7CisJCX0KKwl9Cit9CisKKworVk9JRAlBZGhvY1R1cm5PblFvcygKKwlJTiAgUFJUTVBfQURBUFRFUiBwQWQpCit7CisjZGVmaW5lIEFDMF9ERUZfVFhPUAkJMAorI2RlZmluZSBBQzFfREVGX1RYT1AJCTAKKyNkZWZpbmUgQUMyX0RFRl9UWE9QCQk5NAorI2RlZmluZSBBQzNfREVGX1RYT1AJCTQ3CisKKwkvLyBUdXJuIG9uIFFPcyBpZiB1c2UgSFQgcmF0ZS4KKwlpZiAocEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iVmFsaWQgPT0gRkFMU0UpCisJeworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJWYWxpZCA9IFRSVUU7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQWlmc25bMF0gPSAzOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkFpZnNuWzFdID0gNzsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblsyXSA9IDE7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQWlmc25bM10gPSAxOworCisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtaW5bMF0gPSA0OworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWluWzFdID0gNDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21pblsyXSA9IDM7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtaW5bM10gPSAyOworCisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbMF0gPSAxMDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFsxXSA9IDY7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbMl0gPSA0OworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWF4WzNdID0gMzsKKworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbMF0gID0gMDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzFdICA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFsyXSAgPSBBQzJfREVGX1RYT1A7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFszXSAgPSBBQzNfREVGX1RYT1A7CisJfQorCUFzaWNTZXRFZGNhUGFybShwQWQsICZwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgTGlua1VwKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIFVDSEFSIEJzc1R5cGUpCit7CisJVUxPTkcJTm93OworCVVJTlQzMglEYXRhOworCUJPT0xFQU4JQ2FuY2VsbGVkOworCVVDSEFSCVZhbHVlID0gMCwgaWR4OworCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5ID0gTlVMTCwgKnBDdXJyRW50cnk7CisKKwlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKKworCS8vCisJLy8gQVNTT0MgLSBEaXNhc3NvY1RpbWVvdXRBY3Rpb24KKwkvLyBDTlRMIC0gRGlzLWFzc29jaWF0ZSBzdWNjZXNzZnVsCisJLy8gISEhIExJTksgRE9XTiAhISEKKwkvLyBbODg4ODhdIE9JRF84MDJfMTFfU1NJRCBzaG91bGQgaGF2ZSByZXR1cm5lZCBORFRFU1RfV0VQX0FQMihSZXR1cm5lZDogKQorCS8vCisJLy8gVG8gcHJldmVudCBEaXNhc3NvY1RpbWVvdXRBY3Rpb24gdG8gY2FsbCBMaW5rIGRvd24gYWZ0ZXIgd2UgbGluayB1cCwKKwkvLyBjYW5jZWwgdGhlIERpc2Fzc29jVGltZXIgbm8gbWF0dGVyIHdoYXQgaXQgc3RhcnQgb3Igbm90LgorCS8vCisJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguRGlzYXNzb2NUaW1lciwgICZDYW5jZWxsZWQpOworCisJQ09QWV9TRVRUSU5HU19GUk9NX01MTUVfQVVYX1RPX0FDVElWRV9DRkcocEFkKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCUNPUFlfSFRTRVRUSU5HU19GUk9NX01MTUVfQVVYX1RPX0FDVElWRV9DRkcocEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkvLyBJdCdzIHF1aXRlIGRpZmZpY3VsdCB0byB0ZWxsIGlmIGEgbmV3bHkgYWRkZWQgS0VZIGlzIFdFUCBvciBDS0lQIHVudGlsIGEgbmV3IEJTUworCS8vIGlzIGZvcm1lZCAoZWl0aGVyIEFTU09DL1JFLUFTU09DIGRvbmUgb3IgSUJTUyBzdGFydGVkLiBMaW5rVVAgc2hvdWxkIGJlIGEgc2FmZSBwbGFjZQorCS8vIHRvIGV4YW1pbmUgaWYgY2lwaGVyIGFsZ29yaXRobSBzd2l0Y2hpbmcgaXMgcmVxdWlyZWQuCisJLy9ydDI4NjBiLiBEb24ndCBrbm93IHdoeSBuZWVkIHRoaXMKKwlTd2l0Y2hCZXR3ZWVuV2VwQW5kQ2tpcChwQWQpOworCisKKwlpZiAoQnNzVHlwZSA9PSBCU1NfQURIT0MpCisJeworCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURIT0NfT04pOworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19JTkZSQV9PTik7CisKKyNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vIFJvZ2VyIHN5bmMgQ2FycmllcgorCQkvLyBObyBjYXJyaWVyIGRldGVjdGlvbiB3aGVuIGFkaG9jCisJCS8vIENhcnJpZXJEZXRlY3Rpb25TdG9wKHBBZCk7CisJCXBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuQ0RfU3RhdGUgPSBDRF9OT1JNQUw7CisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpCisJCQlBZGhvY1R1cm5PblFvcyhwQWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhIUFkaG9jIExJTksgVVAgISEhIFxuIiApKTsKKwl9CisJZWxzZQorCXsKKwkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0lORlJBX09OKTsKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURIT0NfT04pOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhIUluZnJhIExJTksgVVAgISEhIFxuIiApKTsKKwl9CisKKwkvLyAzKjMKKwkvLyByZXNldCBUeCBiZWFtZm9ybWluZyBiaXQKKwlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZWYWx1ZSk7CisJVmFsdWUgJj0gKH4weDAxKTsKKwlWYWx1ZSB8PSBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuVHhCRjsKKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBWYWx1ZSk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkvLyBDaGFuZ2UgdG8gQVAgY2hhbm5lbAorICAgIGlmICgocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPiBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSAmJiAocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKKwl7CisJCS8vIE11c3QgdXNpbmcgNDBNSHouCisJCXBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzQwOworCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7CisJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZWYWx1ZSk7CisJCVZhbHVlICY9ICh+MHgxOCk7CisJCVZhbHVlIHw9IDB4MTA7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIFZhbHVlKTsKKworCQkvLyAgUlggOiBjb250cm9sIGNoYW5uZWwgYXQgbG93ZXIKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmVmFsdWUpOworCQlWYWx1ZSAmPSAofjB4MjApOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBWYWx1ZSk7CisKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJkRhdGEpOworCQlEYXRhICY9IDB4ZmZmZmZmZmU7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBEYXRhKTsKKworCQlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCisJCXsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY5LCAweDFBKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCAweDBBKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjczLCAweDE2KTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhIXJ0Mjg2MEMgISEhIFxuIiApKTsKKwkJfQorCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhITQwTUh6IExvd2VyIExJTksgVVAgISEhIENvbnRyb2wgQ2hhbm5lbCBhdCBCZWxvdy4gQ2VudHJhbCA9ICVkIFxuIiwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgKSk7CisJfQorCWVsc2UgaWYgKChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA8IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpICYmIChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQorICAgIHsKKwkgICAgLy8gTXVzdCB1c2luZyA0ME1Iei4KKwkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7CisJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKKwkgICAgQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworCisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gKH4weDE4KTsKKwkJVmFsdWUgfD0gMHgxMDsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgVmFsdWUpOworCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZEYXRhKTsKKwkJRGF0YSB8PSAweDE7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBEYXRhKTsKKworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZWYWx1ZSk7CisJICAgIFZhbHVlIHw9ICgweDIwKTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgVmFsdWUpOworCisJCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKKwkJeworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIDB4MUEpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsIDB4MEEpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzMsIDB4MTYpOworCQkJICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhIXJ0Mjg2MEMgISEhIFxuIiApKTsKKwkJfQorCisJICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISA0ME1IeiBVcHBlciBMSU5LIFVQICEhISBDb250cm9sIENoYW5uZWwgYXQgVXBwZXJDZW50cmFsID0gJWQgXG4iLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCApKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworICAgIHsKKwkgICAgcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfMjA7CisJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKKwkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCisJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJlZhbHVlKTsKKwkJVmFsdWUgJj0gKH4weDE4KTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgVmFsdWUpOworCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZEYXRhKTsKKwkJRGF0YSAmPSAweGZmZmZmZmZlOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgRGF0YSk7CisKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmVmFsdWUpOworCQlWYWx1ZSAmPSAofjB4MjApOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBWYWx1ZSk7CisKKwkJaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKQorCQl7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgMHgxNik7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgMHgwOCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MywgMHgxMSk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISFydDI4NjBDICEhISBcbiIgKSk7CisJCX0KKworCSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgMjBNSHogTElOSyBVUCAhISEgXG4iICkpOworICAgIH0KKworCVJUTVBTZXRBR0NJbml0VmFsdWUocEFkLCBwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcpOworCS8vCisJLy8gU2F2ZSBCQlBfUjY2IHZhbHVlLCBpdCB3aWxsIGJlIHVzZWQgaW4gUlRVU0JSZXN1bWVNc2R1VHJhbnNtaXNzaW9uCisJLy8KKwlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCAmcEFkLT5CYnBUdW5pbmcuUjY2Q3VycmVudFZhbHVlKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMSU5LIFVQICEhISAoQnNzVHlwZT0lZCwgQUlEPSVkLCBzc2lkPSVzLCBDaGFubmVsPSVkLCBDZW50cmFsQ2hhbm5lbCA9ICVkKVxuIiwKKwkJQnNzVHlwZSwgcEFkLT5TdGFBY3RpdmUuQWlkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCkpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExJTksgVVAgISEhIChEZW5zaXR5ID0lZCwgKVxuIiwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NcGR1RGVuc2l0eSkpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCUFzaWNTZXRCc3NpZChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKworCUFzaWNTZXRTbG90VGltZShwQWQsIFRSVUUpOworCUFzaWNTZXRFZGNhUGFybShwQWQsICZwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtKTsKKworCS8vIENhbGwgdGhpcyBmb3IgUlRTIHByb3RlY3Rpb25mb3IgbGVnYWN5IHJhdGUsIHdlIHdpbGwgYWx3YXlzIGVuYWJsZSBSVFMgdGhyZXNob2xkLCBidXQgbm9ybWFsbHkgaXQgd2lsbCBub3QgaGl0CisJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCAwLCAoT0ZETVNFVFBST1RFQ1QgfCBDQ0tTRVRQUk9URUNUKSwgVFJVRSwgRkFMU0UpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBUUlVFKSkKKwl7CisJCS8vIFVwZGF0ZSBIVCBwcm90ZWN0aW9uZm9yIGJhc2VkIG9uIEFQJ3Mgb3BlcmF0aW5nIG1vZGUuCisgICAgCWlmIChwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID09IDEpCisgICAgCXsKKyAgICAJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgIEFMTE5fU0VUUFJPVEVDVCwgRkFMU0UsIFRSVUUpOworICAgIAl9CisgICAgCWVsc2UKKyAgIAkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgIEFMTE5fU0VUUFJPVEVDVCwgRkFMU0UsIEZBTFNFKTsKKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5EcnNDb3VudGVycywgc2l6ZW9mKENPVU5URVJfRFJTKSk7CisKKwlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOworCXBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWUgPSBOb3c7ICAgLy8gbGFzdCBSWCB0aW1lc3RhbXAKKworCWlmICgocEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSAhPSBSdDgwMl8xMVByZWFtYmxlTG9uZykgJiYKKwkJQ0FQX0lTX1NIT1JUX1BSRUFNQkxFX09OKHBBZC0+U3RhQWN0aXZlLkNhcGFiaWxpdHlJbmZvKSkKKwl7CisJCU1sbWVTZXRUeFByZWFtYmxlKHBBZCwgUnQ4MDJfMTFQcmVhbWJsZVNob3J0KTsKKwl9CisKKwlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQpOworCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSA9PSBSRF9TSUxFTkNFX01PREUpCisJeworI2lmZGVmIERGU19TVVBQT1JUCisJCVJhZGFyRGV0ZWN0aW9uU3RvcChwQWQpOworI2VuZGlmIC8vIERGU19TVVBQT1JUIC8vCisJfQorCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSA9IFJEX05PUk1BTF9NT0RFOworCisJaWYgKEJzc1R5cGUgPT0gQlNTX0FESE9DKQorCXsKKwkJTWFrZUlic3NCZWFjb24ocEFkKTsKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCisJCQkmJiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkKKwkJCSYmIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpCisJCXsKKwkJCTsgLy9EbyBub3RoaW5nCisJCX0KKwkJZWxzZQorCQl7CisJCQlBc2ljRW5hYmxlSWJzc1N5bmMocEFkKTsKKwkJfQorCisJCS8vIEluIGFkIGhvYyBtb2RlLCB1c2UgTUFDIHRhYmxlIGZyb20gaW5kZXggMS4KKwkJLy8gcC5zIEFTSUMgdXNlIGFsbCAweGZmIGFzIHRlcm1pbmF0aW9uIG9mIFdDSUQgdGFibGUgc2VhcmNoLlRvIHByZXZlbnQgaXQncyAweGZmLWZmLWZmLWZmLWZmLWZmLCBXcml0ZSAwIGhlcmUuCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19XQ0lEX0JBU0UsIDB4MDApOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCAweDE4MDgsIDB4MDApOworCisJCS8vIElmIFdFUCBpcyBlbmFibGVkLCBhZGQga2V5IG1hdGVyaWFsIGFuZCBjaXBoZXJBbGcgaW50byBBc2ljCisJCS8vIEZpbGwgaW4gU2hhcmVkIEtleSBUYWJsZShvZmZzZXQ6IDB4NmMwMCkgYW5kIFNoYXJlZCBLZXkgTW9kZShvZmZzZXQ6IDB4NzAwMCkKKworCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKQorCQl7CisJCQlQVUNIQVIJS2V5OworCQkJVUNIQVIgCUNpcGhlckFsZzsKKworCQkJZm9yIChpZHg9MDsgaWR4IDwgU0hBUkVfS0VZX05VTTsgaWR4KyspCisgICAgICAgIAl7CisJCQkJQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5DaXBoZXJBbGc7CisgICAgCQkJS2V5ID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXk7CisKKwkJCQlpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlMZW4gPiAwKQorCQkJCXsKKwkJCQkJLy8gU2V0IGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIHRvIEFzaWMKKyAgICAJCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwgQlNTMCwgaWR4LCBDaXBoZXJBbGcsIEtleSwgTlVMTCwgTlVMTCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCA9PSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQpCisJCQkJCXsKKwkJCQkJCS8vIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgZm9yIHRoaXMgZ3JvdXAga2V5IHRhYmxlCisJCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgQlNTMCwgaWR4LCBDaXBoZXJBbGcsIE5VTEwpOworCQkJCQl9CisJCQkJfQorCisKKwkJCX0KKwkJfQorCQkvLyBJZiBXUEFOb25lIGlzIGVuYWJsZWQsIGFkZCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyBpbnRvIEFzaWMKKwkJLy8gRmlsbCBpbiBTaGFyZWQgS2V5IFRhYmxlKG9mZnNldDogMHg2YzAwKSBhbmQgU2hhcmVkIEtleSBNb2RlKG9mZnNldDogMHg3MDAwKQorCQllbHNlIGlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorCQl7CisJCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAwOwkvLyBhbHdheXMgYmUgemVybworCisgICAgICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0sIHNpemVvZihDSVBIRVJfS0VZKSk7CisJCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7CisJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIHBBZC0+U3RhQ2ZnLlBNSywgTEVOX1RLSVBfRUspOworCisgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorICAgICAgICAgICAgeworICAgIAkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCAmcEFkLT5TdGFDZmcuUE1LWzE2XSwgTEVOX1RLSVBfUlhNSUNLKTsKKyAgICAJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywgJnBBZC0+U3RhQ2ZnLlBNS1sxNl0sIExFTl9US0lQX1RYTUlDSyk7CisgICAgICAgICAgICB9CisKKwkJCS8vIERlY2lkZSBpdHMgQ2hpcGVyQWxnCisJCQlpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9US0lQOworCQkJZWxzZSBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7CisJCQllbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVW5rbm93IENpcGhlciAoPSVkKSwgc2V0IENpcGhlciB0byBBRVNcbiIsIHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIpKTsKKwkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworICAgICAgICAgICAgfQorCisJCQkvLyBTZXQga2V5IG1hdGVyaWFsIGFuZCBjaXBoZXJBbGcgdG8gQXNpYworCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKKwkJCQkJCQkJICBCU1MwLAorCQkJCQkJCQkgIDAsCisJCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAorCQkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwKKwkJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywKKwkJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYyk7CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgZm9yIHRoaXMgZ3JvdXAga2V5IHRhYmxlCisJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgQlNTMCwgMCwgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLCBOVUxMKTsKKworCQl9CisKKwl9CisJZWxzZSAvLyBCU1NfSU5GUkEKKwl7CisJCS8vIENoZWNrIHRoZSBuZXcgU1NJRCB3aXRoIGxhc3QgU1NJRAorCQl3aGlsZSAoQ2FuY2VsbGVkID09IFRSVUUpCisJCXsKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5MYXN0U3NpZExlbiA9PSBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuKQorCQkJeworCQkJCWlmIChSVE1QQ29tcGFyZU1lbW9yeShwQWQtPkNvbW1vbkNmZy5MYXN0U3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuTGFzdFNzaWRMZW4pID09IDApCisJCQkJeworCQkJCQkvLyBMaW5rIHRvIHRoZSBvbGQgb25lIG5vIGxpbmtkb3duIGlzIHJlcXVpcmVkLgorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQkvLyBTZW5kIGxpbmsgZG93biBldmVudCBiZWZvcmUgc2V0IHRvIGxpbmsgdXAKKwkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7CisJCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOworICAgICAgICAgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQUEhXG4iKSk7CisJCQlicmVhazsKKwkJfQorCisJCS8vCisJCS8vIE9uIFdQQSBtb2RlLCBSZW1vdmUgQWxsIEtleXMgaWYgbm90IGNvbm5lY3QgdG8gdGhlIGxhc3QgQlNTSUQKKwkJLy8gS2V5IHdpbGwgYmUgc2V0IGFmdGVyIDQtd2F5IGhhbmRzaGFrZS4KKwkJLy8KKwkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpKQorCQl7CisJCQlVTE9ORyAJCUlWOworCisJCQkvLyBSZW1vdmUgYWxsIFdQQSBrZXlzCisJCQlSVE1QV1BBUmVtb3ZlQWxsS2V5cyhwQWQpOworCQkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisJCQlwQWQtPlN0YUNmZy5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXI4MDIxeFdFUDsKKworCQkJLy8gRml4ZWQgY29ubmVjdGlvbiBmYWlsZWQgd2l0aCBSYW5nZSBNYXhpbWl6ZXIgLSA1MTUgQVAgKE1hcnZlbGwgQ2hpcCkgd2hlbiBzZWN1cml0eSBpcyBXUEFQU0svVEtJUAorCQkJLy8gSWYgSVYgcmVsYXRlZCB2YWx1ZXMgYXJlIHRvbyBsYXJnZSBpbiBHcm91cE1zZzIsIEFQIHdvdWxkIGlnbm9yZSB0aGlzIG1lc3NhZ2UuCisJCQlJViA9IDA7CisJCQlJViB8PSAocEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkIDw8IDMwKTsKKwkJCUFzaWNVcGRhdGVXQ0lESVZFSVYocEFkLCBCU1NJRF9XQ0lELCBJViwgMCk7CisJCX0KKwkJLy8gTk9URToKKwkJLy8gdGhlIGRlY2lzaW9uIG9mIHVzaW5nICJzaG9ydCBzbG90IHRpbWUiIG9yIG5vdCBtYXkgY2hhbmdlIGR5bmFtaWNhbGx5IGR1ZSB0bworCQkvLyBuZXcgU1RBIGFzc29jaWF0aW9uIHRvIHRoZSBBUC4gc28gd2UgaGF2ZSB0byBkZWNpZGUgdGhhdCB1cG9uIHBhcnNpbmcgQkVBQ09OLCBub3QgaGVyZQorCisJCS8vIE5PVEU6CisJCS8vIHRoZSBkZWNpc2lvbiB0byB1c2UgIlJUQy9DVFMiIG9yICJDVFMtdG8tc2VsZiIgcHJvdGVjdGlvbiBvciBub3QgbWF5IGNoYW5nZSBkeW5hbWljYWxseQorCQkvLyBkdWUgdG8gbmV3IFNUQSBhc3NvY2lhdGlvbiB0byB0aGUgQVAuIHNvIHdlIGhhdmUgdG8gZGVjaWRlIHRoYXQgdXBvbiBwYXJzaW5nIEJFQUNPTiwgbm90IGhlcmUKKworCQlDb21wb3NlUHNQb2xsKHBBZCk7CisJCUNvbXBvc2VOdWxsRnJhbWUocEFkKTsKKworCQkJQXNpY0VuYWJsZUJzc1N5bmMocEFkKTsKKworCQkvLyBBZGQgQlNTSUQgdG8gV0NJRCBzZWFyY2ggdGFibGUKKwkJQXNpY1VwZGF0ZVJ4V0NJRFRhYmxlKHBBZCwgQlNTSURfV0NJRCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisJCS8vIGFkZCB0aGlzIEJTU0lEIGVudHJ5IGludG8gSEFTSCB0YWJsZQorCQl7CisJCQlVQ0hBUiBIYXNoSWR4OworCisJCQkvL3BFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOworCQkJSGFzaElkeCA9IE1BQ19BRERSX0hBU0hfSU5ERVgocEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJaWYgKHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF0gPT0gTlVMTCkKKwkJCXsKKwkJCQlwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdID0gcEVudHJ5OworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXBDdXJyRW50cnkgPSBwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdOworCQkJCXdoaWxlIChwQ3VyckVudHJ5LT5wTmV4dCAhPSBOVUxMKQorCQkJCQlwQ3VyckVudHJ5ID0gcEN1cnJFbnRyeS0+cE5leHQ7CisJCQkJcEN1cnJFbnRyeS0+cE5leHQgPSBwRW50cnk7CisJCQl9CisJCX0KKwkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKworCisJCS8vIElmIFdFUCBpcyBlbmFibGVkLCBhZGQgcGFpZXdpc2UgYW5kIHNoYXJlZCBrZXkKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgIGlmICgoKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkmJgorICAgICAgICAgICAgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpJiYKKyAgICAgICAgICAgICAocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQpKSB8fAorICAgICAgICAgICAgKChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkmJgorICAgICAgICAgICAgICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKSkpCisjZWxzZQorCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwkJeworCQkJUFVDSEFSCUtleTsKKwkJCVVDSEFSIAlDaXBoZXJBbGc7CisKKwkJCWZvciAoaWR4PTA7IGlkeCA8IFNIQVJFX0tFWV9OVU07IGlkeCsrKQorICAgICAgICAJeworCQkJCUNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uQ2lwaGVyQWxnOworICAgIAkJCUtleSA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5OworCisJCQkJaWYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5TGVuID4gMCkKKwkJCQl7CisJCQkJCS8vIFNldCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyB0byBBc2ljCisgICAgCQkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBLZXksIE5VTEwsIE5VTEwpOworCisJCQkJCWlmIChpZHggPT0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkKQorCQkJCQl7CisJCQkJCQkvLyBBc3NpZ24gZ3JvdXAga2V5IGluZm8KKwkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBCU1MwLCBpZHgsIENpcGhlckFsZywgTlVMTCk7CisKKwkJCQkJCS8vIEFzc2lnbiBwYWlyd2lzZSBrZXkgaW5mbworCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBwRW50cnkpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gb25seSBJTkZSQVNUUlVDVFVSRSBtb2RlIG5lZWQgdG8gaW5kaWNhdGUgY29ubmVjdGl2aXR5IGltbWVkaWF0ZWx5OyBBREhPQyBtb2RlCisJCS8vIHNob3VsZCB3YWl0IHVudGlsIGF0IGxlYXN0IDIgYWN0aXZlIG5vZGVzIGluIHRoaXMgQlNTSUQuCisJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworCisgICAgICAgIC8vIEZvciBHVUkgKysKKwkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorCQl7CisJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworCQkJcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfVVA7CisJCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOworCQl9CisgICAgICAgIC8vIC0tCisKKwkJLy8gQWRkIEJTU0lEIGluIG15IE1BQyBUYWJsZS4KKyAgICAgICAgTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKwkJUlRNUE1vdmVNZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BaWQgPSBCU1NJRF9XQ0lEOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLnBBZCA9IHBBZDsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5WYWxpZEFzQ0xJID0gVFJVRTsJLy9BbHRob3VnaCB0aGlzIGlzIGJzc2lkLi5zdGlsbCBzZXQgVmFsaWRBc0NsCisJCXBBZC0+TWFjVGFiLlNpemUgPSAxOwkvLyBpbmZyYSBtb2RlIGFsd2F5cyBzZXQgTUFDdGFiIHNpemUgPTEuCisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uU3N0ID0gU1NUX0FTU09DOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkF1dGhTdGF0ZSA9IFNTVF9BU1NPQzsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5XZXBTdGF0dXMgPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgIE5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExJTksgVVAgISEhICBDbGllbnRTdGF0dXNGbGFncz0lbHgpXG4iLAorCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5DbGllbnRTdGF0dXNGbGFncykpOworCisJCU1sbWVVcGRhdGVUeFJhdGVzKHBBZCwgVFJVRSwgQlNTMCk7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCU1sbWVVcGRhdGVIdFR4UmF0ZXMocEFkLCBCU1MwKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExJTksgVVAgISEgKFN0YUFjdGl2ZS5iSHRFbmFibGUgPSVkLCApXG4iLCBwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSkpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCS8vCisJCS8vIFJlcG9ydCBBZGphY2VudCBBUCByZXBvcnQuCisJCS8vCisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCUNDWEFkamFjZW50QVBSZXBvcnQocEFkKTsKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKworCQlpZiAocEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSkKKwkJeworCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iUGlnZ3lCYWNrQ2FwYWJsZSkgJiYgKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICYgMHgwMDAwMDAwMykgPT0gMykKKwkJCXsKKworCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QSUdHWUJBQ0tfSU5VU0VEKTsKKwkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKTsKKyAgICAgICAgICAgICAgICBSVE1QU2V0UGlnZ3lCYWNrKHBBZCwgVFJVRSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHVybiBvbiBQaWdneS1CYWNrXG4iKSk7CisJCQl9CisJCQllbHNlIGlmIChwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAmIDB4MDAwMDAwMDEpCisJCQl7CisJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCk7CisJCQl9CisJCX0KKworCQlpZiAocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgIT0gMHgwKQorCQl7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlpZiAoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0sIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKSkKKwkJCXsKKwkJCQlBc2ljRW5hYmxlUkRHKHBBZCk7CisJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZDTElFTlRfU1RBVFVTX1JBTElOS19DSElQU0VUKTsKKwkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0sIGZDTElFTlRfU1RBVFVTX1JBTElOS19DSElQU0VUKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmQ0xJRU5UX1NUQVRVU19SQUxJTktfQ0hJUFNFVCk7CisJCQlDTElFTlRfU1RBVFVTX0NMRUFSX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0sIGZDTElFTlRfU1RBVFVTX1JBTElOS19DSElQU0VUKTsKKwkJfQorCX0KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5ESVNfU1RBVFVTX01FRElBX0NPTk5FQ1QgRXZlbnQgQiEuQkFDYXBhYmlsaXR5ID0gJXguIENsaWVudFN0YXR1c0ZsYWdzID0gJWx4XG4iLCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkud29yZCwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5DbGllbnRTdGF0dXNGbGFncykpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJLy8gU2V0IExFRAorCVJUTVBTZXRMRUQocEFkLCBMRURfTElOS19VUCk7CisKKwlwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCA9IDA7CisJcEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgPSAwOworCXBBZC0+YkNvbmZpZ0NoYW5nZWQgPSBGQUxTRTsgICAgICAgIC8vIFJlc2V0IGNvbmZpZyBmbGFnCisJcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfVVA7ICAgLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uIHRvIGxpbmsgaXMgdXAKKworCS8vIFNldCBhc2ljIGF1dG8gZmFsbCBiYWNrCisJeworCQlQVUNIQVIJCQkJCXBUYWJsZTsKKwkJVUNIQVIJCQkJCVRhYmxlU2l6ZSA9IDA7CisKKwkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0sICZwVGFibGUsICZUYWJsZVNpemUsICZwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCk7CisJCUFzaWNVcGRhdGVBdXRvRmFsbEJhY2tUYWJsZShwQWQsIHBUYWJsZSk7CisJfQorCisJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKyAgICBwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLndvcmQ7CisgICAgcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZCA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS53b3JkOworCWlmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBGQUxTRSkKKwl7CisJCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBGQUxTRTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJaWYgKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9PSAzMikKKwkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7CisKKwkJaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPiBNQ1NfNykgfHwgKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9PSAzMikpCisJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TVEJDID0gU1RCQ19OT05FOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkvLyBJZiB0aGUgbGVnYWN5IG1vZGUgaXMgc2V0LCBvdmVyd3JpdGUgdGhlIHRyYW5zbWl0IHNldHRpbmcgb2YgdGhpcyBlbnRyeS4KKwkJaWYgKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKQorCQkJUlRNUFVwZGF0ZUxlZ2FjeVR4U2V0dGluZygoVUNIQVIpcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSwgcEVudHJ5KTsKKwl9CisJZWxzZQorCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gVFJVRTsKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCisJLy8gIExldCBMaW5rIFN0YXR1cyBQYWdlIGRpc3BsYXkgZmlyc3QgaW5pdGlhbCByYXRlLgorCXBBZC0+TGFzdFR4UmF0ZSA9IChVU0hPUlQpKHBFbnRyeS0+SFRQaHlNb2RlLndvcmQpOworCS8vIFNlbGVjdCBEQUMgYWNjb3JkaW5nIHRvIEhUIG9yIExlZ2FjeQorCWlmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSAhPSAweDAwKQorCXsKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCAmVmFsdWUpOworCQlWYWx1ZSAmPSAofjB4MTgpOworCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKQorCQl7CisJCSAgICBWYWx1ZSB8PSAweDEwOworCQl9CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsIFZhbHVlKTsKKwl9CisJZWxzZQorCXsKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCAmVmFsdWUpOworCQlWYWx1ZSAmPSAofjB4MTgpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBWYWx1ZSk7CisJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IEZBTFNFKQorCXsKKwl9CisJZWxzZSBpZiAocEVudHJ5LT5NYXhSQW1wZHVGYWN0b3IgPT0gMCkKKwl7CisJICAgIC8vIElmIEhUIEFQIGRvZXNuJ3Qgc3VwcG9ydCBNYXhSQW1wZHVGYWN0b3IgPSAxLCB3ZSBuZWVkIHRvIHNldCBtYXggUFNEVSB0byAwLgorCSAgICAvLyBCZWNhdXNlIG91ciBJbml0IHZhbHVlIGlzIDEgYXQgTUFDUmVnVGFibGUuCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BWF9MRU5fQ0ZHLCAweDBmZmYpOworCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCS8vIFBhdGNoIGZvciBNYXJ2ZWwgQVAgdG8gZ2FpbiBoaWdoIHRocm91Z2hwdXQKKwkvLyBOZWVkIHRvIHNldCBhcyBmb2xsb3dpbmcsCisJLy8gMS4gU2V0IHR4b3AgaW4gcmVnaXN0ZXItRURDQV9BQzBfQ0ZHIGFzIDB4NjAKKwkvLyAyLiBTZXQgRW5UWFdyaXRlQmFja0RET05FIGluIHJlZ2lzdGVyLVdQRE1BX0dMT19DRkcgYXMgemVybworCS8vIDMuIFBCRl9NQVhfUENOVCBhcyAweDFGM0ZCRjlGCisJLy8gNC4ga2ljayBwZXIgdHdvIHBhY2tldHMgd2hlbiBkZXF1ZXVlCisJLy8KKwkvLyBUeG9wIGNhbiBvbmx5IGJlIG1vZGlmaWVkIHdoZW4gUkRHIGlzIG9mZiwgV01NIGlzIGRpc2FibGUgYW5kIFR4QnVyc3QgaXMgZW5hYmxlCisJLy8KKwkvLyBpZiAxLiBMZWdhY3kgQVAgV01NIG9uLCAgb3IgMi4gMTFuIEFQLCBBTVBEVSBkaXNhYmxlLiAgRm9yY2UgdHVybiBvZmYgYnVyc3Qgbm8gbWF0dGVyIHdoYXQgYkVuYWJsZVR4QnVyc3QgaXMuCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKCgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gRkFMU0UpICYmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpKSkKKwkJfHwgKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBUUlVFKSAmJiAocEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSA9PSBCQV9OT1RVU0UpKSkKKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgRURDQV9BQzBfQ0ZHLCAmRGF0YSk7CisJCURhdGEgICY9IDB4RkZGRkZGMDA7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgRGF0YSk7CisKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX01BWF9QQ05ULCAweDFGM0Y3RjlGKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhidXJzdCAxXG4iKSk7CisJfQorCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwlpZiAocEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QpCisJeworCQlSVE1QX0lPX1JFQUQzMihwQWQsIEVEQ0FfQUMwX0NGRywgJkRhdGEpOworCQlEYXRhICAmPSAweEZGRkZGRjAwOworCQlEYXRhICB8PSAweDYwOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIERhdGEpOworCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJOb3dBdGhlcm9zQnVyc3RPbiA9IFRSVUU7CisKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX01BWF9QQ05ULCAweDFGM0ZCRjlGKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhidXJzdCAyXG4iKSk7CisJfQorCWVsc2UKKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgRURDQV9BQzBfQ0ZHLCAmRGF0YSk7CisJCURhdGEgICY9IDB4RkZGRkZGMDA7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgRGF0YSk7CisKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX01BWF9QQ05ULCAweDFGM0Y3RjlGKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhidXJzdCAzXG4iKSk7CisJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJLy8gUmUtY2hlY2sgdG8gdHVybiBvbiBUWCBidXJzdCBvciBub3QuCisJaWYgKChwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJMYXN0QXRoZXJvcyA9PSBUUlVFKSAmJiAoKFNUQV9XRVBfT04ocEFkKSl8fChTVEFfVEtJUF9PTihwQWQpKSkpCisJeworCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJOZXh0RGlzYWJsZVJ4QkEgPSBUUlVFOworCQlpZiAocEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QpCisJCXsKKwkJICAgIFVJTlQzMiBNQUNWYWx1ZSA9IDA7CisJCQkvLyBGb3JjZSBkaXNhYmxlICBUWE9QIHZhbHVlIGluIHRoaXMgY2FzZS4gVGhlIHNhbWUgYWN0aW9uIGluIE1MTUVVcGRhdGVQcm90ZWN0IHRvby4KKwkJCS8vIEkgZGlkbid0IGNoYW5nZSBQQkZfTUFYX1BDTlQgc2V0dGluZy4KKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgRURDQV9BQzBfQ0ZHLCAmTUFDVmFsdWUpOworCQkJTUFDVmFsdWUgICY9IDB4RkZGRkZGMDA7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIE1BQ1ZhbHVlKTsKKwkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYk5vd0F0aGVyb3NCdXJzdE9uID0gRkFMU0U7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTmV4dERpc2FibGVSeEJBID0gRkFMU0U7CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTGFzdEF0aGVyb3MgPSBGQUxTRTsKKwlDT1BZX01BQ19BRERSKHBBZC0+Q29tbW9uQ2ZnLkxhc3RCc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhIXBBZC0+Yk5leHREaXNhYmxlUnhCQT0gJWQgXG4iLCBwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJOZXh0RGlzYWJsZVJ4QkEpKTsKKwkvLyBCU1NJRCBhZGQgaW4gb25lIE1BQyBlbnRyeSB0b28uICBCZWNhdXNlIGluIFR4LCBBU0lDIG5lZWQgdG8gY2hlY2sgQ2lwaGVyIGFuZCBJVi9FSVYsIEJBYml0bWFwCisJLy8gUHRoZXIgaW5mb3JtYXRpb24gaW4gTUFDVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0gaXMgbm90IG5lY2Vzc2FyeSBmb3IgZHJpdmVyLgorCS8vIE5vdGU6IEFzIFNUQSwgVGhlIE1BQ1RhYi5Db250ZW50W0JTU0lEX1dDSURdLiBQYWlyd2lzZUtleSBhbmQgU2hhcmVkIEtleSBmb3IgQlNTMCBhcmUgdGhlIHNhbWUuCisKKyAgICBpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzIDw9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKKyAgICB7CisgICAgICAgIHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCXBBZC0+U3RhQ2ZnLlByaXZhY3lGaWx0ZXIgPSBOZGlzODAyXzExUHJpdkZpbHRlckFjY2VwdEFsbDsKKwl9CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZDsKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCisgICAgLy8KKwkvLyBQYXRjaCBBdGhlcm9zIEFQIFRYIHdpbGwgYnJlYWtkb3duIGlzc3VlLgorCS8vIEFQIE1vZGVsOiBETGluayBEV0wtODIwMEFQCisJLy8KKwlpZiAoSU5GUkFfT04ocEFkKSAmJiBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpICYmIFNUQV9US0lQX09OKHBBZCkpCisJeworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9QQVJTRVJfQ0ZHLCAweDAxKTsKKwl9CisJZWxzZQorCXsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfUEFSU0VSX0NGRywgMHgwMCk7CisJfQorCisJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUyk7CisKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorI2lmZGVmIERPVDExTl9EUkFGVDMKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5iMjA0MENvZXhpc3RTY2FuU3VwKSAmJiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA8PSAxMSkpCisJeworCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0NBTl8yMDQwKTsKKwkJQnVpbGRFZmZlY3RlZENoYW5uZWxMaXN0KHBBZCk7CisJfQorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJRGlzY29ubmVjdCBjdXJyZW50IEJTU0lECisKKwlBcmd1bWVudHM6CisJCXBBZAkJCQktIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJSXNSZXFGcm9tQVAJCS0gUmVxdWVzdCBmcm9tIEFQCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKwkJV2UgbmVlZCBtb3JlIGluZm9ybWF0aW9uIHRvIGtub3cgaXQncyB0aGlzIHJlcXVzdCBmcm9tIEFQLgorCQlJZiB5ZXMhIHdlIG5lZWQgdG8gZG8gZXh0cmEgaGFuZGxpbmcsIGZvciBleGFtcGxlLCByZW1vdmUgdGhlIFdQQSBrZXkuCisJCU90aGVyd2lzZSBvbiA0LXdheSBoYW5kc2hha2luZyB3aWxsIGZhaWVkLCBzaW5jZSB0aGUgV1BBIGtleSBkaWRuJ3QgYmUKKwkJcmVtb3ZlIHdoaWxlIGF1dG8gcmVjb25uZWN0LgorCQlEaXNjb25uZWN0IHJlcXVlc3QgZnJvbSBBUCwgaXQgbWVhbnMgd2Ugd2lsbCBzdGFydCBhZnJlc2ggNC13YXkgaGFuZHNoYWtpbmcKKwkJb24gV1BBIG1vZGUuCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgTGlua0Rvd24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gIEJPT0xFQU4gICAgICBJc1JlcUZyb21BUCkKK3sKKwlVQ0hBUgkJCSAgICBpLCBCeXRlVmFsdWUgPSAwOworCisJLy8gRG8gbm90aGluZyBpZiBtb25pdG9yIG1vZGUgaXMgb24KKwlpZiAoTU9OSVRPUl9PTihwQWQpKQorCQlyZXR1cm47CisKKyNpZmRlZiBSQUxJTktfQVRFCisJLy8gTm90aGluZyB0byBkbyBpbiBBVEUgbW9kZS4KKwlpZiAoQVRFX09OKHBBZCkpCisJCXJldHVybjsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKyAgICBpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJeworCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TVEFfTElOS0RPV05fRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTElOSyBET1dOICEhIVxuIikpOworCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCk7CisKKwlpZiAoQURIT0NfT04ocEFkKSkJCS8vIEFkaG9jIG1vZGUgbGluayBkb3duCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTElOSyBET1dOIDEhISFcbiIpKTsKKworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19BREhPQ19PTik7CisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7CisJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CisgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX0RPV047CisJCUJzc1RhYmxlRGVsZXRlRW50cnkoJnBBZC0+U2NhblRhYiwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTWFjVGFiLlNpemU9JWQgISEhXG4iLCBwQWQtPk1hY1RhYi5TaXplKSk7CisJfQorCWVsc2UJCQkJCS8vIEluZnJhIHN0cnVjdHVyZSBtb2RlCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTElOSyBET1dOIDIhISFcbiIpKTsKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkvLyBETFMgdGVhciBkb3duIGZyYW1lIG11c3QgYmUgc2VudCBiZWZvcmUgbGluayBkb3duCisJCS8vIHNlbmQgRExTLVRFQVJfRE9XTiBtZXNzYWdlCisJCWlmIChwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwkJeworCQkJLy8gdGVhciBkb3duIGxvY2FsIGRscyB0YWJsZSBlbnRyeQorCQkJZm9yIChpPTA7IGk8TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQorCQkJeworCQkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpKQorCQkJCXsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX05PTkU7CisJCQkJCVJUTVBTZW5kRExTVGVhckRvd25GcmFtZShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQkJCX0KKwkJCX0KKworCQkJLy8gdGVhciBkb3duIHBlZXIgZGxzIHRhYmxlIGVudHJ5CisJCQlmb3IgKGk9TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCQkJeworCQkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09ICBETFNfRklOSVNIKSkKKwkJCQl7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19OT05FOworCQkJCQlSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJCQl9CisJCQl9CisJCX0KKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19JTkZSQV9PTik7CisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisKKwkJLy8gU2F2ZWQgbGFzdCBTU0lEIGZvciBsaW5rdXAgY29tcGFyaXNvbgorCQlwQWQtPkNvbW1vbkNmZy5MYXN0U3NpZExlbiA9IHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW47CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLkxhc3RTc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5MYXN0U3NpZExlbik7CisJCUNPUFlfTUFDX0FERFIocEFkLT5Db21tb25DZmcuTGFzdEJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCWlmIChwQWQtPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPT0gVFJVRSkKKwkJeworCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKKwkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CisgICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVCBFdmVudCBBIVxuIikpOworCQkJcEFkLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gRkFMU0U7CisJCX0KKwkJZWxzZQorCQl7CisgICAgICAgICAgICAvLworCQkJLy8gSWYgZGlzYXNzb2NpYXRpb24gcmVxdWVzdCBpcyBmcm9tIE5ESVMsIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBkZWxldGUgQlNTSUQgZnJvbSBlbnRyeS4KKwkJCS8vIE90aGVyd2lzZSBsb3N0IGJlYWNvbiBvciByZWNlaXZlIERlLUF1dGhlbnRpY2F0aW9uIGZyb20gQVAsCisJCQkvLyB0aGVuIHdlIHNob3VsZCBkZWxldGUgQlNTSUQgZnJvbSBCc3NUYWJsZS4KKwkJCS8vIElmIHdlIGRvbid0IGRlbGV0ZSBmcm9tIGVudHJ5LCByb2FtaW5nIHdpbGwgZmFpbC4KKwkJCS8vCisJCQlCc3NUYWJsZURlbGV0ZUVudHJ5KCZwQWQtPlNjYW5UYWIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJfQorCisJCS8vIHJlc3RvcmUgYmFjayB0byAtCisJCS8vICAgICAgMS4gbG9uZyBzbG90ICgyMCB1cykgb3Igc2hvcnQgc2xvdCAoOSB1cykgdGltZQorCQkvLyAgICAgIDIuIHR1cm4gb24vb2ZmIFJUUy9DVFMgYW5kL29yIENUUy10by1zZWxmIHByb3RlY3Rpb24KKwkJLy8gICAgICAzLiBzaG9ydCBwcmVhbWJsZQorCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19CR19QUk9URUNUSU9OX0lOVVNFRCk7CisKKwkJaWYgKHBBZC0+U3RhQ2ZnLkNDWEFkamFjZW50QVBSZXBvcnRGbGFnID09IFRSVUUpCisJCXsKKwkJCS8vCisJCQkvLyBSZWNvcmQgY3VycmVudCBBUCdzIGluZm9ybWF0aW9uLgorCQkJLy8gZm9yIGxhdGVyIHVzZWQgcmVwb3J0aW5nIEFkamFjZW50IEFQIHJlcG9ydC4KKwkJCS8vCisJCQlwQWQtPlN0YUNmZy5DQ1hBZGphY2VudEFQQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJCQlwQWQtPlN0YUNmZy5DQ1hBZGphY2VudEFQU3NpZExlbiA9IHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW47CisJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5DQ1hBZGphY2VudEFQU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUFNzaWRMZW4pOworCQkJQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5DQ1hBZGphY2VudEFQQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJfQorCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCQkvLyBDb3VudHJ5IElFIG9mIHRoZSBBUCB3aWxsIGJlIGV2YWx1YXRlZCBhbmQgd2lsbCBiZSB1c2VkLgorCQlpZiAocEFkLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUgIT0gUnQ4MDJfMTFfRF9Ob25lKQorCQl7CisJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGVbMF0sICZwQWQtPlN0YUNmZy5TdGFPcmlDb3VudHJ5Q29kZVswXSwgMik7CisJCQlwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPSBwQWQtPlN0YUNmZy5TdGFPcmlHZW9ncmFwaHk7CisJCQlCdWlsZENoYW5uZWxMaXN0RXgocEFkKTsKKwkJfQorI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKworCX0KKworCWZvciAoaT0xOyBpPE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCisJeworCQlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQ0xJID09IFRSVUUpCisJCQlNYWNUYWJsZURlbGV0ZUVudHJ5KHBBZCwgcEFkLT5NYWNUYWIuQ29udGVudFtpXS5BaWQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uQWRkcik7CisJfQorCisJcEFkLT5TdGFDZmcuQ0NYUW9zRUNXTWluCT0gNDsKKwlwQWQtPlN0YUNmZy5DQ1hRb3NFQ1dNYXgJPSAxMDsKKworCUFzaWNTZXRTbG90VGltZShwQWQsIFRSVUUpOyAvL0ZBTFNFKTsKKwlBc2ljU2V0RWRjYVBhcm0ocEFkLCBOVUxMKTsKKworCS8vIFNldCBMRUQKKwlSVE1QU2V0TEVEKHBBZCwgTEVEX0xJTktfRE9XTik7CisgICAgcEFkLT5MZWRJbmRpY2F0b3JTdHJlZ3RoID0gMHhGMDsKKyAgICBSVE1QU2V0U2lnbmFsTEVEKHBBZCwgLTEwMCk7CS8vIEZvcmNlIHNpZ25hbCBzdHJlbmd0aCBMZWQgdG8gYmUgdHVybmVkIG9mZiwgZmlybXdhcmUgaXMgbm90IGRvbmUgaXQuCisKKwkJQXNpY0Rpc2FibGVTeW5jKHBBZCk7CisKKwlwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCA9IDA7CisJcEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgPSAwOworCisJaWYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0lORlJBKQorCXsKKwkJLy8gUmVtb3ZlIFN0YUNmZyBJbmZvcm1hdGlvbiBhZnRlciBsaW5rIGRvd24KKwkJTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcuQnNzaWQsIE1BQ19BRERSX0xFTik7CisJCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7CisJCXBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4gPSAwOworCX0KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbywgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiA9IDA7CisJcEFkLT5NbG1lQXV4Lk5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJLy8gUmVzZXQgV1BBLVBTSyBzdGF0ZS4gT25seSByZXNldCB3aGVuIHN1cHBsaWNhbnQgZW5hYmxlZAorCWlmIChwQWQtPlN0YUNmZy5XcGFTdGF0ZSAhPSBTU19OT1RVU0UpCisJeworCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1NUQVJUOworCQkvLyBDbGVhciBSZXBsYXkgY291bnRlcgorCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCA4KTsKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQlpZiAocEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5EbHNSZXBsYXlDb3VudGVyLCA4KTsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwl9CisKKworCS8vCisJLy8gaWYgbGluayBkb3duIGNvbWUgZnJvbSBBUCwgd2UgbmVlZCB0byByZW1vdmUgYWxsIFdQQSBrZXlzIG9uIFdQQSBtb2RlLgorCS8vIG90aGVyd2lzZSB3aWxsIGNhdXNlIDQtd2F5IGhhbmRzaGFraW5nIGZhaWxlZCwgc2luY2UgdGhlIFdQQSBrZXkgbm90IGVtcHR5LgorCS8vCisJaWYgKChJc1JlcUZyb21BUCkgJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkpCisJeworCQkvLyBSZW1vdmUgYWxsIFdQQSBrZXlzCisJCVJUTVBXUEFSZW1vdmVBbGxLZXlzKHBBZCk7CisJfQorCisJLy8gODAyLjF4IHBvcnQgY29udHJvbAorI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkvLyBQcmV2ZW50IGNsZWFyIFBvcnRTZWN1cmVkIGhlcmUgd2l0aCBzdGF0aWMgV0VQCisJLy8gTmV0d29ya01hbmdlciBzZXQgc2VjdXJpdHkgcG9saWN5IGZpcnN0IHRoZW4gc2V0IFNTSUQgdG8gY29ubmVjdCBBUC4KKwlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICYmCisJCShwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpICYmCisJCShwQWQtPlN0YUNmZy5JRUVFODAyMVggPT0gRkFMU0UpKQorCXsKKwkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwl9CisJZWxzZQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwl7CisJCXBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworCQlwQWQtPlN0YUNmZy5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXI4MDIxeFdFUDsKKwl9CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUG9ydFNlY3VyZWQgPSBwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZDsKKwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCisJcEFkLT5TdGFDZmcuTWljRXJyQ250ID0gMDsKKworCS8vIFR1cm4gb2ZmIENraXAgY29udHJvbCBmbGFnCisJcEFkLT5TdGFDZmcuYkNraXBPbiA9IEZBTFNFOworCXBBZC0+U3RhQ2ZnLkNDWEVuYWJsZSA9IEZBTFNFOworCisgICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKKwkvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24gdG8gbGluayBpcyB1cAorCXBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX0RPV047CisKKyAgICAvL3BBZC0+U3RhQ2ZnLkFkaG9jQk9ubHlKb2luZWQgPSBGQUxTRTsKKwkvL3BBZC0+U3RhQ2ZnLkFkaG9jQkdKb2luZWQgPSBGQUxTRTsKKwkvL3BBZC0+U3RhQ2ZnLkFkaG9jMjBOSm9pbmVkID0gRkFMU0U7CisgICAgcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBGQUxTRTsKKworCS8vIFJlc2V0IHRoZSBDdXJyZW50IEFQJ3MgSVAgYWRkcmVzcworCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLkFpcm9uZXRJUEFkZHJlc3MsIDQpOworI2lmZGVmIFJUMjg3MAorCXBBZC0+YlVzYlR4QnVsa0FnZ3JlID0gRkFMU0U7CisjZW5kaWYgLy8gUlQyODcwIC8vCisKKwkvLyBDbGVhbiBhc3NvY2lhdGlvbiBpbmZvcm1hdGlvbgorCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlN0YUNmZy5Bc3NvY0luZm8sIHNpemVvZihORElTXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTikpOworCXBBZC0+U3RhQ2ZnLkFzc29jSW5mby5MZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04pOworCXBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuID0gMDsKKwlwQWQtPlN0YUNmZy5SZXNWYXJJRUxlbiA9IDA7CisKKwkvLworCS8vIFJlc2V0IFJTU0kgdmFsdWUgYWZ0ZXIgbGluayBkb3duCisJLy8KKwlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwID0gMDsKKwlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwWDggPSAwOworCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTEgPSAwOworCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTFYOCA9IDA7CisJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMiA9IDA7CisJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMlg4ID0gMDsKKworCS8vIFJlc3RvcmUgTWxtZVJhdGUKKwlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLkJhc2ljTWxtZVJhdGU7CisJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLkJhc2ljTWxtZVJhdGU7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkvLworCS8vIEFmdGVyIExpbmsgZG93biwgcmVzZXQgcGlnZ3ktYmFjayBzZXR0aW5nIGluIEFTSUMuIERpc2FibGUgUkRHLgorCS8vCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkKKwl7CisJCXBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzIwOworCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCeXRlVmFsdWUpOworCQlCeXRlVmFsdWUgJj0gKH4weDE4KTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQnl0ZVZhbHVlKTsKKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJLy8gUmVzZXQgREFDCisJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCAmQnl0ZVZhbHVlKTsKKwlCeXRlVmFsdWUgJj0gKH4weDE4KTsKKwlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKQorCXsKKwkJQnl0ZVZhbHVlIHw9IDB4MTA7CisJfQorCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsIEJ5dGVWYWx1ZSk7CisKKwlSVE1QU2V0UGlnZ3lCYWNrKHBBZCxGQUxTRSk7CisJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUElHR1lCQUNLX0lOVVNFRCk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkud29yZCA9IHBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS53b3JkOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJLy8gUmVzdG9yZSBhbGwgc2V0dGluZ3MgaW4gdGhlIGZvbGxvd2luZy4KKwlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIDAsIChBTExOX1NFVFBST1RFQ1R8Q0NLU0VUUFJPVEVDVHxPRkRNU0VUUFJPVEVDVCksIFRSVUUsIEZBTFNFKTsKKwlBc2ljRGlzYWJsZVJERyhwQWQpOworCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYkN1cnJlbnRBdGhlcm9zID0gRkFMU0U7CisJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTm93QXRoZXJvc0J1cnN0T24gPSBGQUxTRTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorI2lmZGVmIERPVDExTl9EUkFGVDMKKwlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TQ0FOXzIwNDApOworCXBBZC0+Q29tbW9uQ2ZnLkJTU0NvZXhpc3QyMDQwLndvcmQgPSAwOworCVRyaUV2ZW50SW5pdChwQWQpOworCWZvciAoaSA9IDA7IGkgPCAocEFkLT5DaGFubmVsTGlzdE51bSAtIDEpOyBpKyspCisJeworCQlwQWQtPkNoYW5uZWxMaXN0W2ldLmJFZmZlY3RlZENoYW5uZWwgPSBGQUxTRTsKKwl9CisjZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFYX0xFTl9DRkcsIDB4MWZmZik7CisJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUyk7CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkgeworCQl1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisJCS8vc2VuZCBkaXNhc3NvY2lhdGUgZXZlbnQgdG8gd3BhX3N1cHBsaWNhbnQKKwkJbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworCQl3cnF1LmRhdGEuZmxhZ3MgPSBSVF9ESVNBU1NPQ19FVkVOVF9GTEFHOworCQl3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkNVU1RPTSwgJndycXUsIE5VTEwpOworCX0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJeworCQl1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisJCW1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKKwkJd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOworCX0KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBJdGVyYXRlT25Cc3NUYWIoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTUxNRV9TVEFSVF9SRVFfU1RSVUNUICAgU3RhcnRSZXE7CisJTUxNRV9KT0lOX1JFUV9TVFJVQ1QgICAgSm9pblJlcTsKKwlVTE9ORyAgICAgICAgICAgICAgICAgICBCc3NJZHg7CisKKwkvLyBDaGFuZ2UgdGhlIHdlcHN0YXR1cyB0byBvcmlnaW5hbCB3ZXBzdGF0dXMKKwlwQWQtPlN0YUNmZy5XZXBTdGF0dXMgICA9IHBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXM7CisJcEFkLT5TdGFDZmcuUGFpckNpcGhlciAgPSBwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzOworCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gcEFkLT5TdGFDZmcuT3JpZ1dlcFN0YXR1czsKKworCUJzc0lkeCA9IHBBZC0+TWxtZUF1eC5Cc3NJZHg7CisJaWYgKEJzc0lkeCA8IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc05yKQorCXsKKwkJLy8gQ2hlY2sgY2lwaGVyIHN1aXRlLCBBUCBtdXN0IGhhdmUgbW9yZSBzZWN1cmVkIGNpcGhlciB0aGFuIHN0YXRpb24gc2V0dGluZworCQkvLyBTZXQgdGhlIFBhaXJ3aXNlIGFuZCBHcm91cCBjaXBoZXIgdG8gbWF0Y2ggdGhlIGludGVuZGVkIEFQIHNldHRpbmcKKwkJLy8gV2UgY2FuIG9ubHkgY29ubmVjdCB0byBBUCB3aXRoIGxlc3Mgc2VjdXJlZCBjaXBoZXIgc2V0dGluZworCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpCisJCXsKKwkJCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuR3JvdXBDaXBoZXI7CisKKwkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlcikKKwkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlcjsKKwkJCWVsc2UgaWYgKHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLlBhaXJDaXBoZXJBdXggIT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQorCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5QYWlyQ2lwaGVyQXV4OworCQkJZWxzZQkvLyBUaGVyZSBpcyBubyBQYWlyQ2lwaGVyIEF1eCwgZG93bmdyYWRlIG91ciBjYXBhYmlsaXR5IHRvIFRLSVAKKwkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKwkJfQorCQllbHNlIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQorCQl7CisJCQlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5Hcm91cENpcGhlcjsKKworCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlcikKKwkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlBhaXJDaXBoZXI7CisJCQllbHNlIGlmIChwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlckF1eCAhPSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCisJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5QYWlyQ2lwaGVyQXV4OworCQkJZWxzZQkvLyBUaGVyZSBpcyBubyBQYWlyQ2lwaGVyIEF1eCwgZG93bmdyYWRlIG91ciBjYXBhYmlsaXR5IHRvIFRLSVAKKwkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKworCQkJLy8gUlNOIGNhcGFiaWxpdHkKKwkJCXBBZC0+U3RhQ2ZnLlJzbkNhcGFiaWxpdHkgPSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUnNuQ2FwYWJpbGl0eTsKKwkJfQorCisJCS8vIFNldCBNaXggY2lwaGVyIGZsYWcKKwkJcEFkLT5TdGFDZmcuYk1peENpcGhlciA9IChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyKSA/IEZBTFNFIDogVFJVRTsKKwkJaWYgKHBBZC0+U3RhQ2ZnLmJNaXhDaXBoZXIgPT0gVFJVRSkKKwkJeworCQkJLy8gSWYgbWl4IGNpcGhlciwgcmUtYnVpbGQgUlNOSUUKKwkJCVJUTVBNYWtlUlNOSUUocEFkLCBwQWQtPlN0YUNmZy5BdXRoTW9kZSwgcEFkLT5TdGFDZmcuV2VwU3RhdHVzLCAwKTsKKwkJfQorCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBpdGVyYXRlIEJTUyAlbGQgb2YgJWRcbiIsIEJzc0lkeCwgcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIpKTsKKwkJSm9pblBhcm1GaWxsKHBBZCwgJkpvaW5SZXEsIEJzc0lkeCk7CisJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9KT0lOX1JFUSwgc2l6ZW9mKE1MTUVfSk9JTl9SRVFfU1RSVUNUKSwKKwkJCQkJJkpvaW5SZXEpOworCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0pPSU47CisJfQorCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFsbCBCU1MgZmFpbDsgc3RhcnQgYSBuZXcgQURIT0MgKFNzaWQ9JXMpLi4uXG4iLHBBZC0+TWxtZUF1eC5Tc2lkKSk7CisJCVN0YXJ0UGFybUZpbGwocEFkLCAmU3RhcnRSZXEsIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbik7CisJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TVEFSVF9SRVEsIHNpemVvZihNTE1FX1NUQVJUX1JFUV9TVFJVQ1QpLCAmU3RhcnRSZXEpOworCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX1NUQVJUOworCX0KKwllbHNlIC8vIG5vIG1vcmUgQlNTCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQWxsIHJvYW1pbmcgZmFpbGVkLCBzdGF5IEAgY2ggIyVkXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOworCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKwl9Cit9CisKKy8vIGZvciByZS1hc3NvY2lhdGlvbiBvbmx5CisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQgSXRlcmF0ZU9uQnNzVGFiMigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlNTE1FX1JFQVNTT0NfUkVRX1NUUlVDVCBSZWFzc29jUmVxOworCVVMT05HICAgICAgICAgICAgICAgICAgIEJzc0lkeDsKKwlCU1NfRU5UUlkgICAgICAgICAgICAgICAqcEJzczsKKworCUJzc0lkeCA9IHBBZC0+TWxtZUF1eC5Sb2FtSWR4OworCXBCc3MgPSAmcEFkLT5NbG1lQXV4LlJvYW1UYWIuQnNzRW50cnlbQnNzSWR4XTsKKworCWlmIChCc3NJZHggPCBwQWQtPk1sbWVBdXguUm9hbVRhYi5Cc3NOcikKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBpdGVyYXRlIEJTUyAlbGQgb2YgJWRcbiIsIEJzc0lkeCwgcEFkLT5NbG1lQXV4LlJvYW1UYWIuQnNzTnIpKTsKKworCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBCc3MtPkNoYW5uZWwsIEZBTFNFKTsKKwkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEJzcy0+Q2hhbm5lbCk7CisKKwkJLy8gcmVhc3NvY2lhdGUgbWVzc2FnZSBoYXMgdGhlIHNhbWUgc3RydWN0dXJlIGFzIGFzc29jaWF0ZSBtZXNzYWdlCisJCUFzc29jUGFybUZpbGwocEFkLCAmUmVhc3NvY1JlcSwgcEJzcy0+QnNzaWQsIHBCc3MtPkNhcGFiaWxpdHlJbmZvLAorCQkJCQkgIEFTU09DX1RJTUVPVVQsIHBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCk7CisJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfUkVBU1NPQ19SRVEsCisJCQkJCXNpemVvZihNTE1FX1JFQVNTT0NfUkVRX1NUUlVDVCksICZSZWFzc29jUmVxKTsKKworCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX1JFQVNTT0M7CisJfQorCWVsc2UgLy8gbm8gbW9yZSBCU1MKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBbGwgZmFzdCByb2FtaW5nIGZhaWxlZCwgYmFjayB0byBjaCAjJWRcbiIscEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKKwkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBKb2luUGFybUZpbGwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gT1VUIE1MTUVfSk9JTl9SRVFfU1RSVUNUICpKb2luUmVxLAorCUlOIFVMT05HIEJzc0lkeCkKK3sKKwlKb2luUmVxLT5Cc3NJZHggPSBCc3NJZHg7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFNjYW5QYXJtRmlsbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBPVVQgTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgKlNjYW5SZXEsCisJSU4gQ0hBUiBTc2lkW10sCisJSU4gVUNIQVIgU3NpZExlbiwKKwlJTiBVQ0hBUiBCc3NUeXBlLAorCUlOIFVDSEFSIFNjYW5UeXBlKQoreworICAgIE5kaXNaZXJvTWVtb3J5KFNjYW5SZXEtPlNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7CisJU2NhblJlcS0+U3NpZExlbiA9IFNzaWRMZW47CisJTmRpc01vdmVNZW1vcnkoU2NhblJlcS0+U3NpZCwgU3NpZCwgU3NpZExlbik7CisJU2NhblJlcS0+QnNzVHlwZSA9IEJzc1R5cGU7CisJU2NhblJlcS0+U2NhblR5cGUgPSBTY2FuVHlwZTsKK30KKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgRGxzUGFybUZpbGwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gT1VUIE1MTUVfRExTX1JFUV9TVFJVQ1QgKnBEbHNSZXEsCisJSU4gUFJUXzgwMl8xMV9ETFMgcERscywKKwlJTiBVU0hPUlQgcmVhc29uKQoreworCXBEbHNSZXEtPnBETFMgPSBwRGxzOworCXBEbHNSZXEtPlJlYXNvbiA9IHJlYXNvbjsKK30KKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgU3RhcnRQYXJtRmlsbCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBPVVQgTUxNRV9TVEFSVF9SRVFfU1RSVUNUICpTdGFydFJlcSwKKwlJTiBDSEFSIFNzaWRbXSwKKwlJTiBVQ0hBUiBTc2lkTGVuKQoreworCUFTU0VSVChTc2lkTGVuIDw9IE1BWF9MRU5fT0ZfU1NJRCk7CisJTmRpc01vdmVNZW1vcnkoU3RhcnRSZXEtPlNzaWQsIFNzaWQsIFNzaWRMZW4pOworCVN0YXJ0UmVxLT5Tc2lkTGVuID0gU3NpZExlbjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgQXV0aFBhcm1GaWxsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE9VVCBNTE1FX0FVVEhfUkVRX1NUUlVDVCAqQXV0aFJlcSwKKwlJTiBQVUNIQVIgcEFkZHIsCisJSU4gVVNIT1JUIEFsZykKK3sKKwlDT1BZX01BQ19BRERSKEF1dGhSZXEtPkFkZHIsIHBBZGRyKTsKKwlBdXRoUmVxLT5BbGcgPSBBbGc7CisJQXV0aFJlcS0+VGltZW91dCA9IEFVVEhfVElNRU9VVDsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKworI2lmZGVmIFJUMjg3MAorCitWT0lEIE1sbWVDbnRsQ29uZmlybSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVTE9ORyBNc2dUeXBlLAorCUlOIFVTSE9SVCBNc2cpCit7CisJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTXNnVHlwZSwgc2l6ZW9mKFVTSE9SVCksICZNc2cpOworfQorCitWT0lEIENvbXBvc2VQc1BvbGwoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJUFRYSU5GT19TVFJVQwkJcFR4SW5mbzsKKwlQVFhXSV9TVFJVQwkJcFR4V0k7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDb21wb3NlUHNQb2xsXG4iKSk7CisJTmRpc1plcm9NZW1vcnkoJnBBZC0+UHNQb2xsRnJhbWUsIHNpemVvZihQU1BPTExfRlJBTUUpKTsKKworCXBBZC0+UHNQb2xsRnJhbWUuRkMuUHdyTWdtdCA9IDA7CisJcEFkLT5Qc1BvbGxGcmFtZS5GQy5UeXBlID0gQlRZUEVfQ05UTDsKKwlwQWQtPlBzUG9sbEZyYW1lLkZDLlN1YlR5cGUgPSBTVUJUWVBFX1BTX1BPTEw7CisJcEFkLT5Qc1BvbGxGcmFtZS5BaWQgPSBwQWQtPlN0YUFjdGl2ZS5BaWQgfCAweEMwMDA7CisJQ09QWV9NQUNfQUREUihwQWQtPlBzUG9sbEZyYW1lLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJQ09QWV9NQUNfQUREUihwQWQtPlBzUG9sbEZyYW1lLlRhLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKworCVJUTVBaZXJvTWVtb3J5KCZwQWQtPlBzUG9sbENvbnRleHQuVHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0WzBdLCAxMDApOworCXBUeEluZm8gPSAoUFRYSU5GT19TVFJVQykmcEFkLT5Qc1BvbGxDb250ZXh0LlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFswXTsKKwlSVE1QV3JpdGVUeEluZm8ocEFkLCBwVHhJbmZvLCAoVVNIT1JUKShzaXplb2YoUFNQT0xMX0ZSQU1FKStUWFdJX1NJWkUpLCBUUlVFLCBFcFRvUXVldWVbTUdNVFBJUEVJRFhdLCBGQUxTRSwgIEZBTFNFKTsKKwlwVHhXSSA9IChQVFhXSV9TVFJVQykmcEFkLT5Qc1BvbGxDb250ZXh0LlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtUWElORk9fU0laRV07CisJUlRNUFdyaXRlVHhXSShwQWQsIHBUeFdJLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgVFJVRSwgRkFMU0UsIDAsIEJTU0lEX1dDSUQsIChzaXplb2YoUFNQT0xMX0ZSQU1FKSksCisJCTAsICAwLCAoVUNIQVIpcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUywgSUZTX0JBQ0tPRkYsIEZBTFNFLCAmcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0KTsKKwlSVE1QTW92ZU1lbW9yeSgmcEFkLT5Qc1BvbGxDb250ZXh0LlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtUWFdJX1NJWkUrVFhJTkZPX1NJWkVdLCAmcEFkLT5Qc1BvbGxGcmFtZSwgc2l6ZW9mKFBTUE9MTF9GUkFNRSkpOworCS8vIEFwcGVuZCA0IGV4dHJhIHplcm8gYnl0ZXMuCisJcEFkLT5Qc1BvbGxDb250ZXh0LkJ1bGtPdXRTaXplID0gIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgc2l6ZW9mKFBTUE9MTF9GUkFNRSkgKyA0OworfQorCisvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKK1ZPSUQgQ29tcG9zZU51bGxGcmFtZSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlQVFhJTkZPX1NUUlVDCQlwVHhJbmZvOworCVBUWFdJX1NUUlVDCQlwVHhXSTsKKworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk51bGxGcmFtZSwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwlwQWQtPk51bGxGcmFtZS5GQy5UeXBlID0gQlRZUEVfREFUQTsKKwlwQWQtPk51bGxGcmFtZS5GQy5TdWJUeXBlID0gU1VCVFlQRV9OVUxMX0ZVTkM7CisJcEFkLT5OdWxsRnJhbWUuRkMuVG9EcyA9IDE7CisJQ09QWV9NQUNfQUREUihwQWQtPk51bGxGcmFtZS5BZGRyMSwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCUNPUFlfTUFDX0FERFIocEFkLT5OdWxsRnJhbWUuQWRkcjIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworCUNPUFlfTUFDX0FERFIocEFkLT5OdWxsRnJhbWUuQWRkcjMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwlSVE1QWmVyb01lbW9yeSgmcEFkLT5OdWxsQ29udGV4dC5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbMF0sIDEwMCk7CisJcFR4SW5mbyA9IChQVFhJTkZPX1NUUlVDKSZwQWQtPk51bGxDb250ZXh0LlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFswXTsKKwlSVE1QV3JpdGVUeEluZm8ocEFkLCBwVHhJbmZvLCAoVVNIT1JUKShzaXplb2YoSEVBREVSXzgwMl8xMSkrVFhXSV9TSVpFKSwgVFJVRSwgRXBUb1F1ZXVlW01HTVRQSVBFSURYXSwgRkFMU0UsICBGQUxTRSk7CisJcFR4V0kgPSAoUFRYV0lfU1RSVUMpJnBBZC0+TnVsbENvbnRleHQuVHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0W1RYSU5GT19TSVpFXTsKKwlSVE1QV3JpdGVUeFdJKHBBZCwgcFR4V0ksIEZBTFNFLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCBUUlVFLCBGQUxTRSwgMCwgQlNTSURfV0NJRCwgKHNpemVvZihIRUFERVJfODAyXzExKSksCisJCTAsIDAsIChVQ0hBUilwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTLCBJRlNfQkFDS09GRiwgRkFMU0UsICZwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQpOworCVJUTVBNb3ZlTWVtb3J5KCZwQWQtPk51bGxDb250ZXh0LlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtUWFdJX1NJWkUrVFhJTkZPX1NJWkVdLCAmcEFkLT5OdWxsRnJhbWUsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJcEFkLT5OdWxsQ29udGV4dC5CdWxrT3V0U2l6ZSA9ICBUWElORk9fU0laRSArIFRYV0lfU0laRSArIHNpemVvZihwQWQtPk51bGxGcmFtZSkgKyA0OworfQorI2VuZGlmIC8vIFJUMjg3MCAvLworCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJUHJlLWJ1aWxkIGEgQkVBQ09OIGZyYW1lIGluIHRoZSBzaGFyZWQgbWVtb3J5CisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitVTE9ORyBNYWtlSWJzc0JlYWNvbigKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlVQ0hBUiAgICAgICAgIERzTGVuID0gMSwgSWJzc0xlbiA9IDI7CisJVUNIQVIgICAgICAgICBMb2NhbEVycEllWzNdID0ge0lFX0VSUCwgMSwgMHgwNH07CisJSEVBREVSXzgwMl8xMSBCY25IZHI7CisJVVNIT1JUICAgICAgICBDYXBhYmlsaXR5SW5mbzsKKwlMQVJHRV9JTlRFR0VSIEZha2VUaW1lc3RhbXA7CisJVUxPTkcgICAgICAgICBGcmFtZUxlbiA9IDA7CisJUFRYV0lfU1RSVUMJICBwVHhXSSA9ICZwQWQtPkJlYWNvblR4V0k7CisJQ0hBUiAgICAgICAgICpwQmVhY29uRnJhbWUgPSBwQWQtPkJlYWNvbkJ1ZjsKKwlCT09MRUFOICAgICAgIFByaXZhY3k7CisJVUNIQVIgICAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwlVQ0hBUiAgICAgICAgIFN1cFJhdGVMZW4gPSAwOworCVVDSEFSICAgICAgICAgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJVUNIQVIgICAgICAgICBFeHRSYXRlTGVuID0gMDsKKwlVQ0hBUiAgICAgICAgIFJTTkllID0gSUVfV1BBOworCisJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpICYmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KSkKKwl7CisJCVN1cFJhdGVbMF0gPSAweDgyOyAvLyAxIG1icHMKKwkJU3VwUmF0ZVsxXSA9IDB4ODQ7IC8vIDIgbWJwcworCQlTdXBSYXRlWzJdID0gMHg4YjsgLy8gNS41IG1icHMKKwkJU3VwUmF0ZVszXSA9IDB4OTY7IC8vIDExIG1icHMKKwkJU3VwUmF0ZUxlbiA9IDQ7CisJCUV4dFJhdGVMZW4gPSAwOworCX0KKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCisJeworCQlTdXBSYXRlWzBdICA9IDB4OEM7ICAgIC8vIDYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKKwkJU3VwUmF0ZVsxXSAgPSAweDEyOyAgICAvLyA5IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCVN1cFJhdGVbMl0gID0gMHg5ODsgICAgLy8gMTIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKKwkJU3VwUmF0ZVszXSAgPSAweDI0OyAgICAvLyAxOCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQlTdXBSYXRlWzRdICA9IDB4YjA7ICAgIC8vIDI0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCisJCVN1cFJhdGVbNV0gID0gMHg0ODsgICAgLy8gMzYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJU3VwUmF0ZVs2XSAgPSAweDYwOyAgICAvLyA0OCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQlTdXBSYXRlWzddICA9IDB4NmM7ICAgIC8vIDU0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCVN1cFJhdGVMZW4gID0gODsKKwkJRXh0UmF0ZUxlbiAgPSAwOworCisJCS8vCisJCS8vIEFsc28gVXBkYXRlIE1sbWVSYXRlICYgUnRzUmF0ZSBmb3IgRyBvbmx5ICYgQSBvbmx5CisJCS8vCisJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV82OworCQlwQWQtPkNvbW1vbkNmZy5SdHNSYXRlID0gUkFURV82OworCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1MwTWNhc3RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07CisJfQorCWVsc2UKKwl7CisJCVN1cFJhdGVbMF0gPSAweDgyOyAvLyAxIG1icHMKKwkJU3VwUmF0ZVsxXSA9IDB4ODQ7IC8vIDIgbWJwcworCQlTdXBSYXRlWzJdID0gMHg4YjsgLy8gNS41IG1icHMKKwkJU3VwUmF0ZVszXSA9IDB4OTY7IC8vIDExIG1icHMKKwkJU3VwUmF0ZUxlbiA9IDQ7CisKKwkJRXh0UmF0ZVswXSAgPSAweDBDOyAgICAvLyA2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLAorCQlFeHRSYXRlWzFdICA9IDB4MTI7ICAgIC8vIDkgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJRXh0UmF0ZVsyXSAgPSAweDE4OyAgICAvLyAxMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywKKwkJRXh0UmF0ZVszXSAgPSAweDI0OyAgICAvLyAxOCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQlFeHRSYXRlWzRdICA9IDB4MzA7ICAgIC8vIDI0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLAorCQlFeHRSYXRlWzVdICA9IDB4NDg7ICAgIC8vIDM2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCisJCUV4dFJhdGVbNl0gID0gMHg2MDsgICAgLy8gNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKKwkJRXh0UmF0ZVs3XSAgPSAweDZjOyAgICAvLyA1NCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcworCQlFeHRSYXRlTGVuICA9IDg7CisJfQorCisJcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiA9IFN1cFJhdGVMZW47CisJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFBY3RpdmUuU3VwUmF0ZSwgU3VwUmF0ZSwgU3VwUmF0ZUxlbik7CisJcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiA9IEV4dFJhdGVMZW47CisJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFBY3RpdmUuRXh0UmF0ZSwgRXh0UmF0ZSwgRXh0UmF0ZUxlbik7CisKKwkvLyBjb21wb3NlIElCU1MgYmVhY29uIGZyYW1lCisJTWd0TWFjSGVhZGVySW5pdChwQWQsICZCY25IZHIsIFNVQlRZUEVfQkVBQ09OLCAwLCBCUk9BRENBU1RfQUREUiwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCVByaXZhY3kgPSAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpIHx8CisJCQkgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgfHwKKwkJCSAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKTsKKwlDYXBhYmlsaXR5SW5mbyA9IENBUF9HRU5FUkFURSgwLCAxLCBQcml2YWN5LCAocEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9PSBSdDgwMl8xMVByZWFtYmxlU2hvcnQpLCAwLCAwKTsKKworCU1ha2VPdXRnb2luZ0ZyYW1lKHBCZWFjb25GcmFtZSwgICAgICAgICAgICAgICAgJkZyYW1lTGVuLAorCQkJCQkgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgICAgICAgICZCY25IZHIsCisJCQkJCSAgVElNRVNUQU1QX0xFTiwgICAgICAgICAgICAgICAgICAgJkZha2VUaW1lc3RhbXAsCisJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCwKKwkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ2FwYWJpbGl0eUluZm8sCisJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRJZSwKKwkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuU3NpZExlbiwKKwkJCQkJICBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLCAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Tc2lkLAorCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdXBSYXRlSWUsCisJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN1cFJhdGVMZW4sCisJCQkJCSAgU3VwUmF0ZUxlbiwgICAgICAgICAgICAgICAgICAgICAgU3VwUmF0ZSwKKwkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRHNJZSwKKwkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRHNMZW4sCisJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsCisJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJklic3NJZSwKKwkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSWJzc0xlbiwKKwkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5TdGFBY3RpdmUuQXRpbVdpbiwKKwkJCQkJICBFTkRfT0ZfQVJHUyk7CisKKwkvLyBhZGQgRVJQX0lFIGFuZCBFWFRfUkFFIElFIG9mIGluIDgwMi4xMWcKKwlpZiAoRXh0UmF0ZUxlbikKKwl7CisJCVVMT05HCXRtcDsKKworCQlNYWtlT3V0Z29pbmdGcmFtZShwQmVhY29uRnJhbWUgKyBGcmFtZUxlbiwgICAgICAgICAmdG1wLAorCQkJCQkJICAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbEVycEllLAorCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRXh0UmF0ZUllLAorCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRXh0UmF0ZUxlbiwKKwkJCQkJCSAgRXh0UmF0ZUxlbiwgICAgICAgICAgICAgICAgICAgICAgRXh0UmF0ZSwKKwkJCQkJCSAgRU5EX09GX0FSR1MpOworCQlGcmFtZUxlbiArPSB0bXA7CisJfQorCisJLy8gSWYgYWRob2Mgc2VjcnVpdHkgaXMgc2V0IGZvciBXUEEtTm9uZSwgYXBwZW5kIHRoZSBjaXBoZXIgc3VpdGUgSUUKKwlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKwl7CisJCVVMT05HIHRtcDsKKyAgICAgICAgUlRNUE1ha2VSU05JRShwQWQsIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMsIEJTUzApOworCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBCZWFjb25GcmFtZSArIEZyYW1lTGVuLCAgICAgICAgCSZ0bXAsCisJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSZSU05JZSwKKwkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSZwQWQtPlN0YUNmZy5SU05JRV9MZW4sCisJCQkJCQkgIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwgICAgICAJCXBBZC0+U3RhQ2ZnLlJTTl9JRSwKKwkJCQkJCSAgRU5EX09GX0FSR1MpOworCQlGcmFtZUxlbiArPSB0bXA7CisJfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKQorCXsKKwkJVUxPTkcgVG1wTGVuOworCQlVQ0hBUiBIdExlbiwgSHRMZW4xOworCisjaWZkZWYgUlRfQklHX0VORElBTgorCQlIVF9DQVBBQklMSVRZX0lFIEh0Q2FwYWJpbGl0eVRtcDsKKwkJQUREX0hUX0lORk9fSUUJYWRkSFRJbmZvVG1wOworCQlVU0hPUlQJYjJsVG1wLCBiMmxUbXAyOworI2VuZGlmCisKKwkJLy8gYWRkIEhUIENhcGFiaWxpdHkgSUUKKwkJSHRMZW4gPSBzaXplb2YocEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5KTsKKwkJSHRMZW4xID0gc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbyk7CisjaWZuZGVmIFJUX0JJR19FTkRJQU4KKwkJTWFrZU91dGdvaW5nRnJhbWUocEJlYWNvbkZyYW1lK0ZyYW1lTGVuLAkmVG1wTGVuLAorCQkJCQkJICAxLAkJCQkJCSZIdENhcEllLAorCQkJCQkJICAxLAkJCQkJCSZIdExlbiwKKwkJCQkJCSAgSHRMZW4sCQkJCQkmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LAorCQkJCQkJICAxLAkJCQkJCSZBZGRIdEluZm9JZSwKKwkJCQkJCSAgMSwJCQkJCQkmSHRMZW4xLAorCQkJCQkJICBIdExlbjEsCQkJCQkmcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLAorCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisjZWxzZQorCQlOZGlzTW92ZU1lbW9yeSgmSHRDYXBhYmlsaXR5VG1wLCAmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LCBIdExlbik7CisJCSooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykpOworCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pKTsKKworCQlOZGlzTW92ZU1lbW9yeSgmYWRkSFRJbmZvVG1wLCAmcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLCBIdExlbjEpOworCQkqKFVTSE9SVCAqKSgmYWRkSFRJbmZvVG1wLkFkZEh0SW5mbzIpID0gU1dBUDE2KCooVVNIT1JUICopKCZhZGRIVEluZm9UbXAuQWRkSHRJbmZvMikpOworCQkqKFVTSE9SVCAqKSgmYWRkSFRJbmZvVG1wLkFkZEh0SW5mbzMpID0gU1dBUDE2KCooVVNIT1JUICopKCZhZGRIVEluZm9UbXAuQWRkSHRJbmZvMykpOworCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBCZWFjb25GcmFtZStGcmFtZUxlbiwJJlRtcExlbiwKKwkJCQkJCSAgMSwJCQkJCQkmSHRDYXBJZSwKKwkJCQkJCSAgMSwJCQkJCQkmSHRMZW4sCisJCQkJCQkgIEh0TGVuLAkJCQkJJkh0Q2FwYWJpbGl0eVRtcCwKKwkJCQkJCSAgMSwJCQkJCQkmQWRkSHRJbmZvSWUsCisJCQkJCQkgIDEsCQkJCQkJJkh0TGVuMSwKKwkJCQkJCSAgSHRMZW4xLAkJCQkJJmFkZEhUSW5mb1RtcCwKKwkJCQkJCSAgRU5EX09GX0FSR1MpOworI2VuZGlmCisJCUZyYW1lTGVuICs9IFRtcExlbjsKKwl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkvL2JlYWNvbiB1c2UgcmVzZXJ2ZWQgV0NJRCAweGZmCisgICAgaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKKyAgICB7CisJCVJUTVBXcml0ZVR4V0kocEFkLCBwVHhXSSwgRkFMU0UsIEZBTFNFLCAgVFJVRSwgRkFMU0UsIEZBTFNFLCBUUlVFLCAwLCAweGZmLCBGcmFtZUxlbiwKKwkJCVBJRF9NR01ULCBQSURfQkVBQ09OLCBSQVRFXzEsIElGU19IVFRYT1AsIEZBTFNFLCAmcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gU2V0IHRvIHVzZSAxTWJwcyBmb3IgQWRob2MgYmVhY29uLgorCQlIVFRSQU5TTUlUX1NFVFRJTkcgVHJhbnNtaXQ7CisgICAgICAgIFRyYW5zbWl0LndvcmQgPSAwOworICAgICAgICBSVE1QV3JpdGVUeFdJKHBBZCwgcFR4V0ksIEZBTFNFLCBGQUxTRSwgIFRSVUUsIEZBTFNFLCBGQUxTRSwgVFJVRSwgMCwgMHhmZiwgRnJhbWVMZW4sCisgICAgCQlQSURfTUdNVCwgUElEX0JFQUNPTiwgUkFURV8xLCBJRlNfSFRUWE9QLCBGQUxTRSwgJlRyYW5zbWl0KTsKKyAgICB9CisKKyNpZmRlZiBSVF9CSUdfRU5ESUFOCisJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgcEJlYWNvbkZyYW1lLCBESVJfV1JJVEUsIEZBTFNFKTsKKwlSVE1QV0lFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhXSSwgVFlQRV9UWFdJKTsKKyNlbmRpZgorCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWFrZUlic3NCZWFjb24gKGxlbj0lbGQpLCBTdXBSYXRlTGVuPSVkLCBFeHRSYXRlTGVuPSVkLCBDaGFubmVsPSVkLCBQaHlNb2RlPSVkXG4iLAorCQkJCQlGcmFtZUxlbiwgU3VwUmF0ZUxlbiwgRXh0UmF0ZUxlbiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSkpOworCXJldHVybiBGcmFtZUxlbjsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS9kbHMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhL2Rscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YmZiYzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS9kbHMuYwpAQCAtMCwwICsxLDIyMTAgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgZGxzLmMKKworICAgIEFic3RyYWN0OgorICAgIEhhbmRsZSBXTU0tRExTIHN0YXRlIG1hY2hpbmUKKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgUm9yeSBDaGVuICAgMDItMTQtMjAwNgorCUFydmluIFRhaQkwNi0wMy0yMDA4CSAgTW9kaWZpZWQgZm9yIFJUMjh4eAorICovCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBkbHMgc3RhdGUgbWFjaGluZSBpbml0LCBpbmNsdWRpbmcgc3RhdGUgdHJhbnNpdGlvbiBhbmQgdGltZXIgaW5pdAorICAgIFBhcmFtZXRlcnM6CisgICAgICAgIFNtIC0gcG9pbnRlciB0byB0aGUgZGxzIHN0YXRlIG1hY2hpbmUKKyAgICBOb3RlOgorICAgICAgICBUaGUgc3RhdGUgbWFjaGluZSBsb29rcyBsaWtlIHRoaXMKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIERMU19JRExFCisgICAgTVQyX01MTUVfRExTX1JFUVVFU1QgICBNbG1lRGxzUmVxQWN0aW9uCisgICAgTVQyX1BFRVJfRExTX1JFUVVFU1QgICBQZWVyRGxzUmVxQWN0aW9uCisgICAgTVQyX1BFRVJfRExTX1JFU1BPTlNFICBQZWVyRGxzUnNwQWN0aW9uCisgICAgTVQyX01MTUVfRExTX1RFQVJET1dOICBNbG1lVGVhckRvd25BY3Rpb24KKyAgICBNVDJfUEVFUl9ETFNfVEVBUkRPV04gIFBlZXJUZWFyRG93bkFjdGlvbgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3ZvaWQgRGxzU3RhdGVNYWNoaW5lSW5pdCgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBTVEFURV9NQUNISU5FICpTbSwKKyAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCit7CisJVUNIQVIJaTsKKworICAgIFN0YXRlTWFjaGluZUluaXQoU20sIChTVEFURV9NQUNISU5FX0ZVTkMqKVRyYW5zLCBNQVhfRExTX1NUQVRFLCBNQVhfRExTX01TRywgKFNUQVRFX01BQ0hJTkVfRlVOQylEcm9wLCBETFNfSURMRSwgRExTX01BQ0hJTkVfQkFTRSk7CisKKyAgICAvLyB0aGUgZmlyc3QgY29sdW1uCisgICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBETFNfSURMRSwgTVQyX01MTUVfRExTX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lRGxzUmVxQWN0aW9uKTsKKyAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIERMU19JRExFLCBNVDJfUEVFUl9ETFNfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJEbHNSZXFBY3Rpb24pOworICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgRExTX0lETEUsIE1UMl9QRUVSX0RMU19SU1AsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRsc1JzcEFjdGlvbik7CisgICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBETFNfSURMRSwgTVQyX01MTUVfRExTX1RFQVJfRE9XTiwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lRGxzVGVhckRvd25BY3Rpb24pOworICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgRExTX0lETEUsIE1UMl9QRUVSX0RMU19URUFSX0RPV04sIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRsc1RlYXJEb3duQWN0aW9uKTsKKworCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJeworCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5wQWQgPSBwQWQ7CisJCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihEbHNUaW1lb3V0QWN0aW9uKSwgcEFkLCBGQUxTRSk7CisJfQorfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZURsc1JlcUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMJCU5TdGF0dXM7CisJVUxPTkcJCQlGcmFtZUxlbiA9IDA7CisJSEVBREVSXzgwMl8xMQlEbHNSZXFIZHI7CisJUFJUXzgwMl8xMV9ETFMJcERMUyA9IE5VTEw7CisJVUNIQVIJCQlDYXRlZ29yeSA9IENBVEVHT1JZX0RMUzsKKwlVQ0hBUgkJCUFjdGlvbiA9IEFDVElPTl9ETFNfUkVRVUVTVDsKKwlVTE9ORwkJCXRtcDsKKwlVU0hPUlQJCQlyZWFzb247CisJVUxPTkcJCQlUaW1lb3V0OworCUJPT0xFQU4JCQlUaW1lckNhbmNlbGxlZDsKKworCWlmKCFNbG1lRGxzUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZwRExTLCAmcmVhc29uKSkKKwkJcmV0dXJuOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBNbG1lRGxzUmVxQWN0aW9uKCkgXG4iKSk7CisKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkRMUyAtIE1sbWVEbHNSZXFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQlyZXR1cm47CisJfQorCisJQWN0SGVhZGVySW5pdChwQWQsICZEbHNSZXFIZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisKKwkvLyBCdWlsZCBiYXNpYyBmcmFtZSBmaXJzdAorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkJCSZGcmFtZUxlbiwKKwkJCQkJc2l6ZW9mKEhFQURFUl84MDJfMTEpLAkJJkRsc1JlcUhkciwKKwkJCQkJMSwJCQkJCQkJJkNhdGVnb3J5LAorCQkJCQkxLAkJCQkJCQkmQWN0aW9uLAorCQkJCQk2LAkJCQkJCQkmcERMUy0+TWFjQWRkciwKKwkJCQkJNiwJCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcywKKwkJCQkJMiwJCQkJCQkJJnBBZC0+U3RhQWN0aXZlLkNhcGFiaWxpdHlJbmZvLAorCQkJCQkyLAkJCQkJCQkmcERMUy0+VGltZU91dCwKKwkJCQkJMSwJCQkJCQkJJlN1cFJhdGVJZSwKKwkJCQkJMSwJCQkJCQkJJnBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLAorCQkJCQlwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwJcEFkLT5NbG1lQXV4LlN1cFJhdGUsCisJCQkJCUVORF9PRl9BUkdTKTsKKworCWlmIChwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiAhPSAwKQorCXsKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAkmdG1wLAorCQkJCQkJICAxLAkJCQkJCSZFeHRSYXRlSWUsCisJCQkJCQkgIDEsCQkJCQkJJnBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuLAorCQkJCQkJICBwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiwJcEFkLT5NbG1lQXV4LkV4dFJhdGUsCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJRnJhbWVMZW4gKz0gdG1wOworCX0KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKKwl7CisJCVVDSEFSIEh0TGVuOworCisjaWZkZWYgUlRfQklHX0VORElBTgorCQlIVF9DQVBBQklMSVRZX0lFIEh0Q2FwYWJpbGl0eVRtcDsKKyNlbmRpZgorCisJCS8vIGFkZCBIVCBDYXBhYmlsaXR5IElFCisJCUh0TGVuID0gc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpOworI2lmbmRlZiBSVF9CSUdfRU5ESUFOCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwJJnRtcCwKKwkJCQkJCQkxLAkJCQkJCSZIdENhcEllLAorCQkJCQkJCTEsCQkJCQkJJkh0TGVuLAorCQkJCQkJCUh0TGVuLAkJCQkJJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQlFTkRfT0ZfQVJHUyk7CisjZWxzZQorCQlOZGlzTW92ZU1lbW9yeSgmSHRDYXBhYmlsaXR5VG1wLCAmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LCBIdExlbik7CisJCQkJCQkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSk7CisJCQkJCQkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSk7CisKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAkmdG1wLAorCQkJCQkJCTEsCQkJCQkJJkh0Q2FwSWUsCisJCQkJCQkJMSwJCQkJCQkmSHRMZW4sCisJCQkJCQkJSHRMZW4sCQkJCQkmSHRDYXBhYmlsaXR5VG1wLAorCQkJCQkJCUVORF9PRl9BUkdTKTsKKyNlbmRpZgorCQlGcmFtZUxlbiA9IEZyYW1lTGVuICsgdG1wOworCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCVJUTVBDYW5jZWxUaW1lcigmcERMUy0+VGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJVGltZW91dCA9IERMU19USU1FT1VUOworCVJUTVBTZXRUaW1lcigmcERMUy0+VGltZXIsIFRpbWVvdXQpOworCisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgUGVlckRsc1JlcUFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMJCU5TdGF0dXM7CisJVUxPTkcJCQlGcmFtZUxlbiA9IDA7CisJVVNIT1JUCQkJU3RhdHVzQ29kZSA9IE1MTUVfU1VDQ0VTUzsKKwlIRUFERVJfODAyXzExCURsc1JzcEhkcjsKKwlVQ0hBUgkJCUNhdGVnb3J5ID0gQ0FURUdPUllfRExTOworCVVDSEFSCQkJQWN0aW9uID0gQUNUSU9OX0RMU19SRVNQT05TRTsKKwlVTE9ORwkJCXRtcDsKKwlVU0hPUlQJCQlDYXBhYmlsaXR5SW5mbzsKKwlVQ0hBUgkJCURBW01BQ19BRERSX0xFTl0sIFNBW01BQ19BRERSX0xFTl07CisJVVNIT1JUCQkJRExTVGltZU91dDsKKwlTSE9SVAkJCWk7CisJVUxPTkcJCQlUaW1lb3V0OworCUJPT0xFQU4JCQlUaW1lckNhbmNlbGxlZDsKKwlQUlRfODAyXzExX0RMUwlwRExTID0gTlVMTDsKKwlVQ0hBUgkJCU1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSAwOworICAgIFVDSEFSCQkJU3VwcG9ydGVkUmF0ZXNMZW47CisgICAgVUNIQVIJCQlTdXBwb3J0ZWRSYXRlc1tNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJVUNIQVIJCQlIdENhcGFiaWxpdHlMZW47CisJSFRfQ0FQQUJJTElUWV9JRQlIdENhcGFiaWxpdHk7CisKKwlpZiAoIVBlZXJEbHNSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgREEsIFNBLCAmQ2FwYWJpbGl0eUluZm8sICZETFNUaW1lT3V0LAorCQkJCQkJCSZTdXBwb3J0ZWRSYXRlc0xlbiwgJlN1cHBvcnRlZFJhdGVzWzBdLCAmSHRDYXBhYmlsaXR5TGVuLCAmSHRDYXBhYmlsaXR5KSkKKwkJcmV0dXJuOworCisgICAgLy8gc3VwcG9ydGVkIHJhdGVzIGFycmF5IG1heSBub3QgYmUgc29ydGVkLiBzb3J0IGl0IGFuZCBmaW5kIHRoZSBtYXhpbXVtIHJhdGUKKyAgICBmb3IgKGkgPSAwOyBpIDwgU3VwcG9ydGVkUmF0ZXNMZW47IGkrKykKKyAgICB7CisgICAgICAgIGlmIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzIDwgKFN1cHBvcnRlZFJhdGVzW2ldICYgMHg3ZikpCisgICAgICAgICAgICBNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzID0gU3VwcG9ydGVkUmF0ZXNbaV0gJiAweDdmOworICAgIH0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUGVlckRsc1JlcUFjdGlvbigpIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsIFNBWzBdLCBTQVsxXSwgU0FbMl0sIFNBWzNdLCBTQVs0XSwgU0FbNV0pKTsKKworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiRExTIC0gUGVlckRsc1JlcUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIUlORlJBX09OKHBBZCkpCisJeworCQlTdGF0dXNDb2RlID0gTUxNRV9SRVFVRVNUX0RFQ0xJTkVEOworCX0KKwllbHNlIGlmICghcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUpCisJeworCQlTdGF0dXNDb2RlID0gTUxNRV9ERVNUX1NUQV9JU19OT1RfQV9RU1RBOworCX0KKwllbHNlIGlmICghcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJeworCQlTdGF0dXNDb2RlID0gTUxNRV9SRVFVRVNUX0RFQ0xJTkVEOworCX0KKwllbHNlCisJeworCQkvLyBmaW5kIHRhYmxlIHRvIHVwZGF0ZSBwYXJhbWV0ZXJzCisJCWZvciAoaSA9IChNQVhfTlVNX09GX0RMU19FTlRSWS0xKTsgaSA+PSAwOyBpLS0pCisJCXsKKwkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiBNQUNfQUREUl9FUVVBTChTQSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCQl7CisJCQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX1dBSVRfS0VZOworCQkJCWVsc2UKKwkJCQl7CisJCQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19GSU5JU0g7CisJCQkJfQorCisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU2VxdWVuY2UgPSAwOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQgPSBETFNUaW1lT3V0OworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLkNvdW50RG93blRpbWVyID0gRExTVGltZU91dDsKKwkJCQlpZiAoSHRDYXBhYmlsaXR5TGVuICE9IDApCisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLmJIVENhcCA9IFRSVUU7CisJCQkJZWxzZQorCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5iSFRDYXAgPSBGQUxTRTsKKwkJCQlwRExTID0gJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLy8gY2FuIG5vdCBmaW5kIGluIHRhYmxlLCBjcmVhdGUgYSBuZXcgb25lCisJCWlmIChpIDwgMCkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBQZWVyRGxzUmVxQWN0aW9uKCkgY2FuIG5vdCBmaW5kIHNhbWUgZW50cnkgXG4iKSk7CisJCQlmb3IgKGk9KE1BWF9OVU1fT0ZfRExTX0VOVFJZIC0gMSk7IGkgPj0gTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaS0tKQorCQkJeworCQkJCWlmICghcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQpCisJCQkJeworCQkJCQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKwkJCQkJVUNIQVIgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7CisKKwkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKwkJCQkJeworCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX1dBSVRfS0VZOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19GSU5JU0g7CisJCQkJCX0KKworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TZXF1ZW5jZSA9IDA7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkID0gVFJVRTsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dCA9IERMU1RpbWVPdXQ7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLkNvdW50RG93blRpbWVyID0gRExTVGltZU91dDsKKwkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkciwgU0EsIE1BQ19BRERSX0xFTik7CisJCQkJCWlmIChIdENhcGFiaWxpdHlMZW4gIT0gMCkKKwkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLmJIVENhcCA9IFRSVUU7CisJCQkJCWVsc2UKKwkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLmJIVENhcCA9IEZBTFNFOworCQkJCQlwRExTID0gJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldOworCQkJCQlwRW50cnkgPSBNYWNUYWJsZUluc2VydERsc0VudHJ5KHBBZCwgU0EsIGkpOworCisJCQkJCXN3aXRjaCAoTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcykKKwkJCQkJeworCQkJCQkJY2FzZSAxMDg6IE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzU0OyAgIGJyZWFrOworCQkJCQkJY2FzZSA5NjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzQ4OyAgIGJyZWFrOworCQkJCQkJY2FzZSA3MjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzM2OyAgIGJyZWFrOworCQkJCQkJY2FzZSA0ODogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzI0OyAgIGJyZWFrOworCQkJCQkJY2FzZSAzNjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzE4OyAgIGJyZWFrOworCQkJCQkJY2FzZSAyNDogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzEyOyAgIGJyZWFrOworCQkJCQkJY2FzZSAxODogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzk7ICAgIGJyZWFrOworCQkJCQkJY2FzZSAxMjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzY7ICAgIGJyZWFrOworCQkJCQkJY2FzZSAyMjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOyAgIGJyZWFrOworCQkJCQkJY2FzZSAxMTogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzVfNTsgIGJyZWFrOworCQkJCQkJY2FzZSA0OiAgIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzI7ICAgIGJyZWFrOworCQkJCQkJY2FzZSAyOiAgIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzE7ICAgIGJyZWFrOworCQkJCQkJZGVmYXVsdDogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOyAgIGJyZWFrOworCQkJCQl9CisKKwkJCQkJcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlID0gbWluKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSwgTWF4U3VwcG9ydGVkUmF0ZSk7CisKKwkJCQkJaWYgKHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZSA8IFJBVEVfRklSU1RfT0ZETV9SQVRFKQorCQkJCQl7CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7CisJCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7CisJCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKKwkJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOworCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07CisJCQkJCX0KKworCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOworCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJCXBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9IDA7CisJCQkJCXBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9IDA7CisKKwkJCQkJLy8gSWYgdGhpcyBFbnRyeSBzdXBwb3J0cyA4MDIuMTFuLCB1cGdyYWRlIHRvIEhUIHJhdGUuCisJCQkJCWlmICgoSHRDYXBhYmlsaXR5TGVuICE9IDApICYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKQorCQkJCQl7CisJCQkJCQlVQ0hBUglqLCBiaXRtYXNrOyAvL2ssYml0bWFzazsKKwkJCQkJCUNIQVIgICAgaWk7CisKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJETFMgLSBQZWVyRGxzUmVxQWN0aW9uKCkgUmVjZWl2ZSBQZWVyIEhUIENhcGFibGUgU1RBIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQkJCQkJCQlTQVswXSwgU0FbMV0sIFNBWzJdLCBTQVszXSwgU0FbNF0sIFNBWzVdKSk7CisKKwkJCQkJCWlmICgoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5HRikgJiYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRikpCisJCQkJCQl7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRHUkVFTkZJRUxEOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUTUlYOworCQkJCQkJCXBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uTm9uR0YgPSBUUlVFOworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9IDE7CisJCQkJCQl9CisKKwkJCQkJCWlmICgoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGgpICYmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoKSkKKwkJCQkJCXsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVz0gQldfNDA7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9ICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3I0MCkmKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwKSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjIwKSYoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApKTsKKwkJCQkJCQlwQWQtPk1hY1RhYi5mQW55U3RhdGlvbjIwT25seSA9IFRSVUU7CisJCQkJCQl9CisKKwkJCQkJCS8vIGZpbmQgbWF4IGZpeGVkIHJhdGUKKwkJCQkJCWZvciAoaWk9MTU7IGlpPj0wOyBpaS0tKQorCQkJCQkJeworCQkJCQkJCWogPSBpaS84OworCQkJCQkJCWJpdG1hc2sgPSAoMTw8KGlpLShqKjgpKSk7CisJCQkJCQkJaWYgKCAocEFkLT5TdGFDZmcuRGVzaXJlZEh0UGh5SW5mby5NQ1NTZXRbal0mYml0bWFzaykgJiYgKEh0Q2FwYWJpbGl0eS5NQ1NTZXRbal0mYml0bWFzaykpCisJCQkJCQkJeworCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBpaTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJCWlmIChpaT09MCkKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisKKworCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICE9IE1DU19BVVRPKQorCQkJCQkJeworCisJCQkJCQkJcHJpbnRrKCJAQEAgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9ICVkXG4iLAorCQkJCQkJCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyk7CisJCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID09IDMyKQorCQkJCQkJCXsKKwkJCQkJCQkJLy8gRml4IE1DUyBhcyBIVCBEdXBsaWNhdGVkIE1vZGUKKwkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSAxOworCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVE1JWDsKKwkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IDA7CisJCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAwOworCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSAzMjsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZSBpZiAocEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID4gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUykKKwkJCQkJCQl7CisJCQkJCQkJCS8vIFNUQSBzdXBwb3J0cyBmaXhlZCBNQ1MKKwkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKKwkJCQkJCQl9CisJCQkJCQl9CisKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5SeFNUQkMgJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlR4U1RCQykpOworCQkJCQkJcEVudHJ5LT5NcGR1RGVuc2l0eSA9IEh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHk7CisJCQkJCQlwRW50cnktPk1heFJBbXBkdUZhY3RvciA9IEh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTWF4UkFtcGR1RmFjdG9yOworCQkJCQkJcEVudHJ5LT5NbXBzTW9kZSA9IChVQ0hBUilIdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QczsKKwkJCQkJCXBFbnRyeS0+QU1zZHVTaXplID0gKFVDSEFSKUh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplOworCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IHBFbnRyeS0+TWF4SFRQaHlNb2RlLndvcmQ7CisKKwkJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCkKKwkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJMjBfQ0FQQUJMRSk7CisJCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yNDApCisJCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTQwX0NBUEFCTEUpOworCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uVHhTVEJDKQorCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19UeFNUQkNfQ0FQQUJMRSk7CisJCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5SeFNUQkMpCisJCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1J4U1RCQ19DQVBBQkxFKTsKKwkJCQkJCWlmIChIdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlBsdXNIVEMpCisJCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX0hUQ19DQVBBQkxFKTsKKwkJCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5iUmRnICYmIEh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUkRHU3VwcG9ydCkKKwkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUkRHX0NBUEFCTEUpOworCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uTUNTRmVlZGJhY2sgPT0gMHgwMykKKwkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfTUNTRkVFREJBQ0tfQ0FQQUJMRSk7CisKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwRW50cnktPkhUQ2FwYWJpbGl0eSwgJkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKKwkJCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSBwRW50cnktPk1heEhUUGh5TW9kZS53b3JkOworCQkJCQlwRW50cnktPkN1cnJUeFJhdGUgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7CisJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSk7CisKKwkJCQkJaWYgKHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID09IFRSVUUpCisJCQkJCXsKKwkJCQkJCVBVQ0hBUiBwVGFibGU7CisJCQkJCQlVQ0hBUiBUYWJsZVNpemUgPSAwOworCisJCQkJCQlNbG1lU2VsZWN0VHhSYXRlVGFibGUocEFkLCBwRW50cnksICZwVGFibGUsICZUYWJsZVNpemUsICZwRW50cnktPkN1cnJUeFJhdGVJbmRleCk7CisJCQkJCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gVFJVRTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERTsKKwkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUwk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisJCQkJCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gRkFMU0U7CisKKwkJCQkJCVJUTVBVcGRhdGVMZWdhY3lUeFNldHRpbmcoKFVDSEFSKXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGUsIHBFbnRyeSk7CisJCQkJCX0KKwkJCQkJcEVudHJ5LT5SYXRlTGVuID0gU3VwcG9ydGVkUmF0ZXNMZW47CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCVN0YXR1c0NvZGUgPSBNTE1FX1NVQ0NFU1M7CisKKwkJLy8gY2FuIG5vdCBmaW5kIGluIHRhYmxlLCBjcmVhdGUgYSBuZXcgb25lCisJCWlmIChpIDwgMCkKKwkJeworCQkJU3RhdHVzQ29kZSA9IE1MTUVfUU9TX1VOU1BFQ0lGWTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiRExTIC0gUGVlckRsc1JlcUFjdGlvbigpIERMU0VudHJ5IHRhYmxlIGZ1bGwob25seSBjYW4gc3VwcG9ydCAlZCBETFMgc2Vzc2lvbikgXG4iLCBNQVhfTlVNX09GX0RMU19FTlRSWSAtIE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlkpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUGVlckRsc1JlcUFjdGlvbigpIHVzZSBlbnRyeSglZCkgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQkJaSwgU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSkpOworCQl9CisJfQorCisJQWN0SGVhZGVySW5pdChwQWQsICZEbHNSc3BIZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisKKwkvLyBCdWlsZCBiYXNpYyBmcmFtZSBmaXJzdAorCWlmIChTdGF0dXNDb2RlID09IE1MTUVfU1VDQ0VTUykKKwl7CisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkJCSZGcmFtZUxlbiwKKwkJCQkJCXNpemVvZihIRUFERVJfODAyXzExKSwJCSZEbHNSc3BIZHIsCisJCQkJCQkxLAkJCQkJCQkmQ2F0ZWdvcnksCisJCQkJCQkxLAkJCQkJCQkmQWN0aW9uLAorCQkJCQkJMiwJCQkJCQkJJlN0YXR1c0NvZGUsCisJCQkJCQk2LAkJCQkJCQlTQSwKKwkJCQkJCTYsCQkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MsCisJCQkJCQkyLAkJCQkJCQkmcEFkLT5TdGFBY3RpdmUuQ2FwYWJpbGl0eUluZm8sCisJCQkJCQkxLAkJCQkJCQkmU3VwUmF0ZUllLAorCQkJCQkJMSwJCQkJCQkJJnBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLAorCQkJCQkJcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sCXBBZC0+TWxtZUF1eC5TdXBSYXRlLAorCQkJCQkJRU5EX09GX0FSR1MpOworCisJCWlmIChwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiAhPSAwKQorCQl7CisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCSZ0bXAsCisJCQkJCQkJICAxLAkJCQkJCSZFeHRSYXRlSWUsCisJCQkJCQkJICAxLAkJCQkJCSZwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiwKKwkJCQkJCQkgIHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuLCAJcEFkLT5NbG1lQXV4LkV4dFJhdGUsCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSB0bXA7CisJCX0KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCisJCXsKKwkJCVVDSEFSIEh0TGVuOworCisjaWZkZWYgUlRfQklHX0VORElBTgorCQkJSFRfQ0FQQUJJTElUWV9JRSBIdENhcGFiaWxpdHlUbXA7CisjZW5kaWYKKworCQkJLy8gYWRkIEhUIENhcGFiaWxpdHkgSUUKKwkJCUh0TGVuID0gc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpOworI2lmbmRlZiBSVF9CSUdfRU5ESUFOCisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCSZ0bXAsCisJCQkJCQkJCTEsCQkJCQkJJkh0Q2FwSWUsCisJCQkJCQkJCTEsCQkJCQkJJkh0TGVuLAorCQkJCQkJCQlIdExlbiwJCQkJCSZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksCisJCQkJCQkJCUVORF9PRl9BUkdTKTsKKyNlbHNlCisJCQlOZGlzTW92ZU1lbW9yeSgmSHRDYXBhYmlsaXR5VG1wLCAmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LCBIdExlbik7CisJCQkJCQkJCSooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykpOworCQkJCQkJCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pKTsKKworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAkmdG1wLAorCQkJCQkJCQkxLAkJCQkJCSZIdENhcEllLAorCQkJCQkJCQkxLAkJCQkJCSZIdExlbiwKKwkJCQkJCQkJSHRMZW4sCQkJCQkmSHRDYXBhYmlsaXR5VG1wLAorCQkJCQkJCQlFTkRfT0ZfQVJHUyk7CisjZW5kaWYKKwkJCUZyYW1lTGVuID0gRnJhbWVMZW4gKyB0bXA7CisJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQlpZiAocERMUyAmJiAocERMUy0+U3RhdHVzICE9IERMU19GSU5JU0gpKQorCQl7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBETFMtPlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQkJVGltZW91dCA9IERMU19USU1FT1VUOworCQkJUlRNUFNldFRpbWVyKCZwRExTLT5UaW1lciwgVGltZW91dCk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAorCQkJCQkJc2l6ZW9mKEhFQURFUl84MDJfMTEpLAkJJkRsc1JzcEhkciwKKwkJCQkJCTEsCQkJCQkJCSZDYXRlZ29yeSwKKwkJCQkJCTEsCQkJCQkJCSZBY3Rpb24sCisJCQkJCQkyLAkJCQkJCQkmU3RhdHVzQ29kZSwKKwkJCQkJCTYsCQkJCQkJCVNBLAorCQkJCQkJNiwJCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcywKKwkJCQkJCUVORF9PRl9BUkdTKTsKKwl9CisKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyRGxzUnNwQWN0aW9uKAorICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAorICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVU0hPUlQJCUNhcGFiaWxpdHlJbmZvOworCVVDSEFSCQlEQVtNQUNfQUREUl9MRU5dLCBTQVtNQUNfQUREUl9MRU5dOworCVVTSE9SVAkJU3RhdHVzQ29kZTsKKwlTSE9SVAkJaTsKKwlCT09MRUFOCQlUaW1lckNhbmNlbGxlZDsKKwlVQ0hBUgkJTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9IDA7CisgICAgVUNIQVIJCVN1cHBvcnRlZFJhdGVzTGVuOworICAgIFVDSEFSCQlTdXBwb3J0ZWRSYXRlc1tNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJVUNIQVIJCUh0Q2FwYWJpbGl0eUxlbjsKKwlIVF9DQVBBQklMSVRZX0lFCUh0Q2FwYWJpbGl0eTsKKworCWlmICghcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJCXJldHVybjsKKworCWlmICghSU5GUkFfT04ocEFkKSkKKwkJcmV0dXJuOworCisJaWYgKCFQZWVyRGxzUnNwU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIERBLCBTQSwgJkNhcGFiaWxpdHlJbmZvLCAmU3RhdHVzQ29kZSwKKwkJCQkJCQkmU3VwcG9ydGVkUmF0ZXNMZW4sICZTdXBwb3J0ZWRSYXRlc1swXSwgJkh0Q2FwYWJpbGl0eUxlbiwgJkh0Q2FwYWJpbGl0eSkpCisJCXJldHVybjsKKworICAgIC8vIHN1cHBvcnRlZCByYXRlcyBhcnJheSBtYXkgbm90IGJlIHNvcnRlZC4gc29ydCBpdCBhbmQgZmluZCB0aGUgbWF4aW11bSByYXRlCisgICAgZm9yIChpPTA7IGk8U3VwcG9ydGVkUmF0ZXNMZW47IGkrKykKKyAgICB7CisgICAgICAgIGlmIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzIDwgKFN1cHBvcnRlZFJhdGVzW2ldICYgMHg3ZikpCisgICAgICAgICAgICBNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzID0gU3VwcG9ydGVkUmF0ZXNbaV0gJiAweDdmOworICAgIH0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUGVlckRsc1JzcEFjdGlvbigpIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggd2l0aCBTdGF0dXNDb2RlPSVkLCBDYXBhYmlsaXR5SW5mbz0weCV4XG4iLAorCQlTQVswXSwgU0FbMV0sIFNBWzJdLCBTQVszXSwgU0FbNF0sIFNBWzVdLCBTdGF0dXNDb2RlLCBDYXBhYmlsaXR5SW5mbykpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkrKykKKwl7CisJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiBNQUNfQUREUl9FUVVBTChTQSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCXsKKwkJCWlmIChTdGF0dXNDb2RlID09IE1MTUVfU1VDQ0VTUykKKwkJCXsKKwkJCQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKwkJCQlVQ0hBUiBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsKKworCQkJCXBFbnRyeSA9IE1hY1RhYmxlSW5zZXJ0RGxzRW50cnkocEFkLCBTQSwgaSk7CisKKwkJCQlzd2l0Y2ggKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMpCisJCQkJeworCQkJCQljYXNlIDEwODogTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNTQ7ICAgYnJlYWs7CisJCQkJCWNhc2UgOTY6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV80ODsgICBicmVhazsKKwkJCQkJY2FzZSA3MjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzM2OyAgIGJyZWFrOworCQkJCQljYXNlIDQ4OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMjQ7ICAgYnJlYWs7CisJCQkJCWNhc2UgMzY6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xODsgICBicmVhazsKKwkJCQkJY2FzZSAyNDogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzEyOyAgIGJyZWFrOworCQkJCQljYXNlIDE4OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfOTsgICAgYnJlYWs7CisJCQkJCWNhc2UgMTI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV82OyAgICBicmVhazsKKwkJCQkJY2FzZSAyMjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOyAgIGJyZWFrOworCQkJCQljYXNlIDExOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNV81OyAgYnJlYWs7CisJCQkJCWNhc2UgNDogICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8yOyAgICBicmVhazsKKwkJCQkJY2FzZSAyOiAgIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzE7ICAgIGJyZWFrOworCQkJCQlkZWZhdWx0OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7ICAgYnJlYWs7CisJCQkJfQorCisJCQkJcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlID0gbWluKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSwgTWF4U3VwcG9ydGVkUmF0ZSk7CisKKwkJCQlpZiAocEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlIDwgUkFURV9GSVJTVF9PRkRNX1JBVEUpCisJCQkJeworCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CisJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7CisJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOworCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOworCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOworCQkJCX0KKworCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7CisJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCXBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9IDA7CisJCQkJcEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID0gMDsKKworCQkJCS8vIElmIHRoaXMgRW50cnkgc3VwcG9ydHMgODAyLjExbiwgdXBncmFkZSB0byBIVCByYXRlLgorCQkJCWlmICgoSHRDYXBhYmlsaXR5TGVuICE9IDApICYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKQorCQkJCXsKKwkJCQkJVUNIQVIJaiwgYml0bWFzazsgLy9rLGJpdG1hc2s7CisJCQkJCUNIQVIgICAgaWk7CisKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIkRMUyAtIFBlZXJEbHNSc3BBY3Rpb24gUmVjZWl2ZSBQZWVyIEhUIENhcGFibGUgU1RBIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQkJCQkJCVNBWzBdLCBTQVsxXSwgU0FbMl0sIFNBWzNdLCBTQVs0XSwgU0FbNV0pKTsKKworCQkJCQlpZiAoKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uR0YpICYmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuR0YpKQorCQkJCQl7CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVEdSRUVORklFTEQ7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVE1JWDsKKwkJCQkJCXBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uTm9uR0YgPSBUUlVFOworCQkJCQkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID0gMTsKKwkJCQkJfQorCisJCQkJCWlmICgoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGgpICYmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoKSkKKwkJCQkJeworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlc9IEJXXzQwOworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9ICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3I0MCkmKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwKSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9ICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCkmKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjIwKSk7CisJCQkJCQlwQWQtPk1hY1RhYi5mQW55U3RhdGlvbjIwT25seSA9IFRSVUU7CisJCQkJCX0KKworCQkJCQkvLyBmaW5kIG1heCBmaXhlZCByYXRlCisJCQkJCWZvciAoaWk9MTU7IGlpPj0wOyBpaS0tKQorCQkJCQl7CisJCQkJCQlqID0gaWkvODsKKwkJCQkJCWJpdG1hc2sgPSAoMTw8KGlpLShqKjgpKSk7CisJCQkJCQlpZiAoIChwQWQtPlN0YUNmZy5EZXNpcmVkSHRQaHlJbmZvLk1DU1NldFtqXSZiaXRtYXNrKSAmJiAoSHRDYXBhYmlsaXR5Lk1DU1NldFtqXSZiaXRtYXNrKSkKKwkJCQkJCXsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBpaTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCWlmIChpaT09MCkKKwkJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCWlmIChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyAhPSBNQ1NfQVVUTykKKwkJCQkJeworCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID09IDMyKQorCQkJCQkJeworCQkJCQkJCS8vIEZpeCBNQ1MgYXMgSFQgRHVwbGljYXRlZCBNb2RlCisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSAxOworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUTUlYOworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSAwOworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAwOworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IDMyOworCQkJCQkJfQorCQkJCQkJZWxzZSBpZiAocEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID4gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUykKKwkJCQkJCXsKKwkJCQkJCQkvLyBTVEEgc3VwcG9ydHMgZml4ZWQgTUNTCisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5SeFNUQkMgJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlR4U1RCQykpOworCQkJCQlwRW50cnktPk1wZHVEZW5zaXR5ID0gSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eTsKKwkJCQkJcEVudHJ5LT5NYXhSQW1wZHVGYWN0b3IgPSBIdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1heFJBbXBkdUZhY3RvcjsKKwkJCQkJcEVudHJ5LT5NbXBzTW9kZSA9IChVQ0hBUilIdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QczsKKwkJCQkJcEVudHJ5LT5BTXNkdVNpemUgPSAoVUNIQVIpSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemU7CisJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSBwRW50cnktPk1heEhUUGh5TW9kZS53b3JkOworCisJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCkKKwkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0kyMF9DQVBBQkxFKTsKKwkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwKQorCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTQwX0NBUEFCTEUpOworCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5UeFNUQkMpCisJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfVHhTVEJDX0NBUEFCTEUpOworCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5SeFNUQkMpCisJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUnhTVEJDX0NBUEFCTEUpOworCQkJCQlpZiAoSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDKQorCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX0hUQ19DQVBBQkxFKTsKKwkJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJSZGcgJiYgSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0KQorCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKTsKKwkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uTUNTRmVlZGJhY2sgPT0gMHgwMykKKwkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19NQ1NGRUVEQkFDS19DQVBBQkxFKTsKKworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEVudHJ5LT5IVENhcGFiaWxpdHksICZIdENhcGFiaWxpdHksIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSk7CisJCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCXBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSBwRW50cnktPk1heEhUUGh5TW9kZS53b3JkOworCQkJCXBFbnRyeS0+Q3VyclR4UmF0ZSA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpOworCisJCQkJaWYgKHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID09IFRSVUUpCisJCQkJeworCQkJCQlQVUNIQVIgcFRhYmxlOworCQkJCQlVQ0hBUiBUYWJsZVNpemUgPSAwOworCisJCQkJCU1sbWVTZWxlY3RUeFJhdGVUYWJsZShwQWQsIHBFbnRyeSwgJnBUYWJsZSwgJlRhYmxlU2l6ZSwgJnBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4KTsKKwkJCQkJcEVudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCA9IFRSVUU7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERTsKKwkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKKwkJCQkJcEVudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCA9IEZBTFNFOworCisJCQkJCVJUTVBVcGRhdGVMZWdhY3lUeFNldHRpbmcoKFVDSEFSKXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGUsIHBFbnRyeSk7CisJCQkJfQorCQkJCXBFbnRyeS0+UmF0ZUxlbiA9IFN1cHBvcnRlZFJhdGVzTGVuOworCisJCQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKwkJCQl7CisJCQkJCS8vIElmIHN1cHBvcnQgV1BBIG9yIFdQQTIsIHN0YXJ0IFNUQUtleSBoYW5kIHNoYWtlLAorCQkJCQkvLyBJZiBmYWlsZWQgaGFuZCBzaGFrZSwganVzdCB0ZWFyIGRvd24gcGVlciBETFMKKwkJCQkJaWYgKFJUTVBTZW5kU1RBS2V5UmVxdWVzdChwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkJCXsKKwkJCQkJCU1MTUVfRExTX1JFUV9TVFJVQ1QJTWxtZURsc1JlcTsKKwkJCQkJCVVTSE9SVAkJCQlyZWFzb24gPSBSRUFTT05fUU9TX0NJUEhFUl9OT1RfU1VQUE9SVDsKKworCQkJCQkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCByZWFzb24pOworCQkJCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1RFQVJfRE9XTiwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7CisJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfTk9ORTsKKwkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkRMUyAtIFBlZXJEbHNSc3BBY3Rpb24gZmFpbGVkIHdoZW4gY2FsbCBSVE1QU2VuZFNUQUtleVJlcXVlc3QgXG4iKSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfV0FJVF9LRVk7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIHdhaXRpbmcgZm9yIFNUQUtleSBoYW5kc2hha2UgcHJvY2VkdXJlXG4iKSk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX0ZJTklTSDsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBQZWVyRGxzUnNwQWN0aW9uKCkgZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBTdWNjZWVkIHdpdGggV0VQIG9yIG5vIHNlY3VyaXR5XG4iLCBTQVswXSwgU0FbMV0sIFNBWzJdLCBTQVszXSwgU0FbNF0sIFNBWzVdKSk7CisJCQkJfQorCisJCQkJLy9pbml0aWFsaXplIHNlcSBubyBmb3IgRExTIGZyYW1lcy4KKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TZXF1ZW5jZSA9IDA7CisJCQkJaWYgKEh0Q2FwYWJpbGl0eUxlbiAhPSAwKQorCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5iSFRDYXAgPSBUUlVFOworCQkJCWVsc2UKKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uYkhUQ2FwID0gRkFMU0U7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gRExTIHNldHVwIHByb2NlZHVyZSBmYWlsZWQuCisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX05PTkU7CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiRExTIC0gUGVlckRsc1JzcEFjdGlvbiBmYWlsZWQgd2l0aCBTdGF0dXNDb2RlPSVkIFxuIiwgU3RhdHVzQ29kZSkpOworCQkJfQorCQl9CisJfQorCisJaWYgKGkgPj0gTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUGVlckRsc1JzcEFjdGlvbigpIHVwZGF0ZSB0aW1lb3V0IHZhbHVlIFxuIikpOworCQlmb3IgKGk9KE1BWF9OVU1fT0ZfRExTX0VOVFJZLTEpOyBpPj1NQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpLS0pCisJCXsKKwkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiBNQUNfQUREUl9FUVVBTChTQSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCQl7CisJCQkJaWYgKFN0YXR1c0NvZGUgPT0gTUxNRV9TVUNDRVNTKQorCQkJCXsKKwkJCQkJTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7CisJCQkJCVVDSEFSIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOworCisJCQkJCXBFbnRyeSA9IE1hY1RhYmxlSW5zZXJ0RGxzRW50cnkocEFkLCBTQSwgaSk7CisKKwkJCQkJc3dpdGNoIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzKQorCQkJCQl7CisJCQkJCQljYXNlIDEwODogTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNTQ7ICAgYnJlYWs7CisJCQkJCQljYXNlIDk2OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNDg7ICAgYnJlYWs7CisJCQkJCQljYXNlIDcyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMzY7ICAgYnJlYWs7CisJCQkJCQljYXNlIDQ4OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMjQ7ICAgYnJlYWs7CisJCQkJCQljYXNlIDM2OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTg7ICAgYnJlYWs7CisJCQkJCQljYXNlIDI0OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTI7ICAgYnJlYWs7CisJCQkJCQljYXNlIDE4OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfOTsgICAgYnJlYWs7CisJCQkJCQljYXNlIDEyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNjsgICAgYnJlYWs7CisJCQkJCQljYXNlIDIyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7ICAgYnJlYWs7CisJCQkJCQljYXNlIDExOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNV81OyAgYnJlYWs7CisJCQkJCQljYXNlIDQ6ICAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMjsgICAgYnJlYWs7CisJCQkJCQljYXNlIDI6ICAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTsgICAgYnJlYWs7CisJCQkJCQlkZWZhdWx0OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7ICAgYnJlYWs7CisJCQkJCX0KKworCQkJCQlwRW50cnktPk1heFN1cHBvcnRlZFJhdGUgPSBtaW4ocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlLCBNYXhTdXBwb3J0ZWRSYXRlKTsKKworCQkJCQlpZiAocEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlIDwgUkFURV9GSVJTVF9PRkRNX1JBVEUpCisJCQkJCXsKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07CisJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOworCQkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07CisJCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOworCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKKwkJCQkJfQorCisJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7CisJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQkJcEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID0gMDsKKwkJCQkJcEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID0gMDsKKworCQkJCQkvLyBJZiB0aGlzIEVudHJ5IHN1cHBvcnRzIDgwMi4xMW4sIHVwZ3JhZGUgdG8gSFQgcmF0ZS4KKwkJCQkJaWYgKChIdENhcGFiaWxpdHlMZW4gIT0gMCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCisJCQkJCXsKKwkJCQkJCVVDSEFSCWosIGJpdG1hc2s7IC8vayxiaXRtYXNrOworCQkJCQkJQ0hBUiAgICBpaTsKKworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIkRMUyAtIFBlZXJEbHNSc3BBY3Rpb24gUmVjZWl2ZSBQZWVyIEhUIENhcGFibGUgU1RBIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQkJCQkJCQlTQVswXSwgU0FbMV0sIFNBWzJdLCBTQVszXSwgU0FbNF0sIFNBWzVdKSk7CisKKwkJCQkJCWlmICgoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5HRikgJiYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRikpCisJCQkJCQl7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRHUkVFTkZJRUxEOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUTUlYOworCQkJCQkJCXBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uTm9uR0YgPSBUUlVFOworCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9IDE7CisJCQkJCQl9CisKKwkJCQkJCWlmICgoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGgpICYmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoKSkKKwkJCQkJCXsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVz0gQldfNDA7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9ICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3I0MCkmKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwKSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKKwkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjIwKSYoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApKTsKKwkJCQkJCQlwQWQtPk1hY1RhYi5mQW55U3RhdGlvbjIwT25seSA9IFRSVUU7CisJCQkJCQl9CisKKwkJCQkJCS8vIGZpbmQgbWF4IGZpeGVkIHJhdGUKKwkJCQkJCWZvciAoaWk9MTU7IGlpPj0wOyBpaS0tKQorCQkJCQkJeworCQkJCQkJCWogPSBpaS84OworCQkJCQkJCWJpdG1hc2sgPSAoMTw8KGlpLShqKjgpKSk7CisJCQkJCQkJaWYgKCAocEFkLT5TdGFDZmcuRGVzaXJlZEh0UGh5SW5mby5NQ1NTZXRbal0mYml0bWFzaykgJiYgKEh0Q2FwYWJpbGl0eS5NQ1NTZXRbal0mYml0bWFzaykpCisJCQkJCQkJeworCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBpaTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJCWlmIChpaT09MCkKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisKKwkJCQkJCWlmIChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyAhPSBNQ1NfQVVUTykKKwkJCQkJCXsKKwkJCQkJCQlwcmludGsoIkBAQCBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gJWRcbiIsCisJCQkJCQkJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTKTsKKwkJCQkJCQlpZiAocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPT0gMzIpCisJCQkJCQkJeworCQkJCQkJCQkvLyBGaXggTUNTIGFzIEhUIER1cGxpY2F0ZWQgTW9kZQorCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IDE7CisJCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUTUlYOworCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TVEJDID0gMDsKKwkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IDA7CisJCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IDMyOworCQkJCQkJCX0KKwkJCQkJCQllbHNlIGlmIChwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPiBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTKQorCQkJCQkJCXsKKwkJCQkJCQkJLy8gU1RBIHN1cHBvcnRzIGZpeGVkIE1DUworCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOworCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQyAmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSk7CisJCQkJCQlwRW50cnktPk1wZHVEZW5zaXR5ID0gSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eTsKKwkJCQkJCXBFbnRyeS0+TWF4UkFtcGR1RmFjdG9yID0gSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NYXhSQW1wZHVGYWN0b3I7CisJCQkJCQlwRW50cnktPk1tcHNNb2RlID0gKFVDSEFSKUh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzOworCQkJCQkJcEVudHJ5LT5BTXNkdVNpemUgPSAoVUNIQVIpSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemU7CisJCQkJCQlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZDsKKworCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjIwKQorCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0kyMF9DQVBBQkxFKTsKKwkJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3I0MCkKKwkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJNDBfQ0FQQUJMRSk7CisJCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5UeFNUQkMpCisJCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1R4U1RCQ19DQVBBQkxFKTsKKwkJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQykKKwkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUnhTVEJDX0NBUEFCTEUpOworCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQykKKwkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfSFRDX0NBUEFCTEUpOworCQkJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJSZGcgJiYgSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0KQorCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSk7CisJCQkJCQlpZiAoSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5NQ1NGZWVkYmFjayA9PSAweDAzKQorCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19NQ1NGRUVEQkFDS19DQVBBQkxFKTsKKworCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBFbnRyeS0+SFRDYXBhYmlsaXR5LCAmSHRDYXBhYmlsaXR5LCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOworCQkJCQl9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkJCQkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IHBFbnRyeS0+TWF4SFRQaHlNb2RlLndvcmQ7CisJCQkJCXBFbnRyeS0+Q3VyclR4UmF0ZSA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKTsKKworCQkJCQlpZiAocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPT0gVFJVRSkKKwkJCQkJeworCQkJCQkJUFVDSEFSIHBUYWJsZTsKKwkJCQkJCVVDSEFSIFRhYmxlU2l6ZSA9IDA7CisKKwkJCQkJCU1sbWVTZWxlY3RUeFJhdGVUYWJsZShwQWQsIHBFbnRyeSwgJnBUYWJsZSwgJlRhYmxlU2l6ZSwgJnBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4KTsKKwkJCQkJCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBUUlVFOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFOworCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKKwkJCQkJCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBGQUxTRTsKKworCQkJCQkJUlRNUFVwZGF0ZUxlZ2FjeVR4U2V0dGluZygoVUNIQVIpcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSwgcEVudHJ5KTsKKwkJCQkJfQorCQkJCQlwRW50cnktPlJhdGVMZW4gPSBTdXBwb3J0ZWRSYXRlc0xlbjsKKworCQkJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorCQkJCQl7CisJCQkJCQkvLyBJZiBzdXBwb3J0IFdQQSBvciBXUEEyLCBzdGFydCBTVEFLZXkgaGFuZCBzaGFrZSwKKwkJCQkJCS8vIElmIGZhaWxlZCBoYW5kIHNoYWtlLCBqdXN0IHRlYXIgZG93biBwZWVyIERMUworCQkJCQkJaWYgKFJUTVBTZW5kU1RBS2V5UmVxdWVzdChwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkJCQl7CisJCQkJCQkJTUxNRV9ETFNfUkVRX1NUUlVDVAlNbG1lRGxzUmVxOworCQkJCQkJCVVTSE9SVAkJCQlyZWFzb24gPSBSRUFTT05fUU9TX0NJUEhFUl9OT1RfU1VQUE9SVDsKKworCQkJCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKKwkJCQkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfVEVBUl9ET1dOLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKKwkJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfTk9ORTsKKwkJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiRExTIC0gUGVlckRsc1JzcEFjdGlvbiBmYWlsZWQgd2hlbiBjYWxsIFJUTVBTZW5kU1RBS2V5UmVxdWVzdCBcbiIpKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfV0FJVF9LRVk7CisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSB3YWl0aW5nIGZvciBTVEFLZXkgaGFuZHNoYWtlIHByb2NlZHVyZVxuIikpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19GSU5JU0g7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFBlZXJEbHNSc3BBY3Rpb24oKSBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IFN1Y2NlZWQgd2l0aCBXRVAgb3Igbm8gc2VjdXJpdHlcbiIsIFNBWzBdLCBTQVsxXSwgU0FbMl0sIFNBWzNdLCBTQVs0XSwgU0FbNV0pKTsKKwkJCQkJfQorCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TZXF1ZW5jZSA9IDA7CisJCQkJCWlmIChIdENhcGFiaWxpdHlMZW4gIT0gMCkKKwkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLmJIVENhcCA9IFRSVUU7CisJCQkJCWVsc2UKKwkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLmJIVENhcCA9IEZBTFNFOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQkvLyBETFMgc2V0dXAgcHJvY2VkdXJlIGZhaWxlZC4KKwkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX05PTkU7CisJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiRExTIC0gUGVlckRsc1JzcEFjdGlvbiBmYWlsZWQgd2l0aCBTdGF0dXNDb2RlPSVkIFxuIiwgU3RhdHVzQ29kZSkpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVEbHNUZWFyRG93bkFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMJCU5TdGF0dXM7CisJVUxPTkcJCQlGcmFtZUxlbiA9IDA7CisJVUNIQVIJCQlDYXRlZ29yeSA9IENBVEVHT1JZX0RMUzsKKwlVQ0hBUgkJCUFjdGlvbiA9IEFDVElPTl9ETFNfVEVBUkRPV047CisJVVNIT1JUCQkJUmVhc29uQ29kZSA9IFJFQVNPTl9RT1NfVU5TUEVDSUZZOworCUhFQURFUl84MDJfMTEJRGxzVGVhckRvd25IZHI7CisJUFJUXzgwMl8xMV9ETFMJcERMUzsKKwlCT09MRUFOCQkJVGltZXJDYW5jZWxsZWQ7CisJVUNIQVIJCQlpOworCisJaWYoIU1sbWVEbHNSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgJnBETFMsICZSZWFzb25Db2RlKSkKKwkJcmV0dXJuOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBNbG1lRGxzVGVhckRvd25BY3Rpb24oKSB3aXRoIFJlYXNvbkNvZGU9JWQgXG4iLCBSZWFzb25Db2RlKSk7CisKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQorCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkRMUyAtIE1sbWVEbHNUZWFyRG93bkFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwlBY3RIZWFkZXJJbml0KHBBZCwgJkRsc1RlYXJEb3duSGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCisJLy8gQnVpbGQgYmFzaWMgZnJhbWUgZmlyc3QKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJCQkmRnJhbWVMZW4sCisJCQkJCXNpemVvZihIRUFERVJfODAyXzExKSwJCSZEbHNUZWFyRG93bkhkciwKKwkJCQkJMSwJCQkJCQkJJkNhdGVnb3J5LAorCQkJCQkxLAkJCQkJCQkmQWN0aW9uLAorCQkJCQk2LAkJCQkJCQkmcERMUy0+TWFjQWRkciwKKwkJCQkJNiwJCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcywKKwkJCQkJMiwJCQkJCQkJJlJlYXNvbkNvZGUsCisJCQkJCUVORF9PRl9BUkdTKTsKKworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwlSVE1QQ2FuY2VsVGltZXIoJnBETFMtPlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCisJLy8gUmVtb3ZlIGtleSBpbiBsb2NhbCBkbHMgdGFibGUgZW50cnkKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQorCXsKKwkJaWYgKE1BQ19BRERSX0VRVUFMKHBETFMtPk1hY0FkZHIsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQl7CisJCQlNYWNUYWJsZURlbGV0ZURsc0VudHJ5KHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lELCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJfQorCX0KKworCS8vIGNsZWFyIHBlZXIgZGxzIHRhYmxlIGVudHJ5CisJZm9yIChpID0gTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSA8IE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJeworCQlpZiAoTUFDX0FERFJfRVFVQUwocERMUy0+TWFjQWRkciwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCXsKKwkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOworCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJCQlNYWNUYWJsZURlbGV0ZURsc0VudHJ5KHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lELCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJfQorCX0KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFBlZXJEbHNUZWFyRG93bkFjdGlvbigKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit7CisJVUNIQVIJCQlEQVtNQUNfQUREUl9MRU5dLCBTQVtNQUNfQUREUl9MRU5dOworCVVTSE9SVAkJCVJlYXNvbkNvZGU7CisJVUlOVAkJCWk7CisJQk9PTEVBTgkJCVRpbWVyQ2FuY2VsbGVkOworCisJaWYgKCFwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwkJcmV0dXJuOworCisJaWYgKCFJTkZSQV9PTihwQWQpKQorCQlyZXR1cm47CisKKwlpZiAoIVBlZXJEbHNUZWFyRG93blNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBEQSwgU0EsICZSZWFzb25Db2RlKSkKKwkJcmV0dXJuOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBQZWVyRGxzVGVhckRvd25BY3Rpb24oKSBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IHdpdGggUmVhc29uQ29kZT0lZFxuIiwgU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSwgUmVhc29uQ29kZSkpOworCisJLy8gY2xlYXIgbG9jYWwgZGxzIHRhYmxlIGVudHJ5CisJZm9yIChpPTA7IGk8TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIE1BQ19BRERSX0VRVUFMKFNBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKKwkJeworCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJCS8vQXNpY0RlbFdjaWRUYWIocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQpOworCQkJLy9Bc2ljUmVtb3ZlUGFpcndpc2VLZXlFbnRyeShwQWQsIEJTUzAsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRCk7CisJCQlNYWNUYWJsZURlbGV0ZURsc0VudHJ5KHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lELCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJfQorCX0KKworCS8vIGNsZWFyIHBlZXIgZGxzIHRhYmxlIGVudHJ5CisJZm9yIChpPU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwl7CisJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiBNQUNfQUREUl9FUVVBTChTQSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCXsKKwkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOworCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJCQkvL0FzaWNEZWxXY2lkVGFiKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lEKTsKKwkJCS8vQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkocEFkLCBCU1MwLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQpOworCQkJTWFjVGFibGVEZWxldGVEbHNFbnRyeShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCX0KKwl9Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBSVE1QQ2hlY2tETFNUaW1lT3V0KAorCUlOIFBSVE1QX0FEQVBURVIJcEFkKQoreworCVVMT05HCQkJCWk7CisJTUxNRV9ETFNfUkVRX1NUUlVDVAlNbG1lRGxzUmVxOworCVVTSE9SVAkJCQlyZWFzb24gPSBSRUFTT05fUU9TX1VOU1BFQ0lGWTsKKworCWlmICghIHBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQorCQlyZXR1cm47CisKKwlpZiAoISBJTkZSQV9PTihwQWQpKQorCQlyZXR1cm47CisKKwkvLyBJZiB0aW1lb3V0IHZhbHVlIGlzIGVxdWFsZWQgdG8gemVybywgaXQgbWVhbnMgYWx3YXlzIG5vdCBiZSB0aW1lb3V0LgorCisJLy8gdXBkYXRlIGxvY2FsIGRscyB0YWJsZSBlbnRyeQorCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkrKykKKwl7CisJCWlmICgocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQpICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkKKwkJCSYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0ICE9IDApKQorCQl7CisJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5Db3VudERvd25UaW1lciAtLTsKKworCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLkNvdW50RG93blRpbWVyID09IDApCisJCQl7CisJCQkJcmVhc29uID0gUkVBU09OX1FPU19SRVFVRVNUX1RJTUVPVVQ7CisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKKwkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7CisJCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1RFQVJfRE9XTiwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7CisJCQl9CisJCX0KKwl9CisKKwkvLyB1cGRhdGUgcGVlciBkbHMgdGFibGUgZW50cnkKKwlmb3IgKGk9TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCXsKKwkJaWYgKChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCkgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKQorCQkJJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQgIT0gMCkpCisJCXsKKwkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLkNvdW50RG93blRpbWVyIC0tOworCisJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgPT0gMCkKKwkJCXsKKwkJCQlyZWFzb24gPSBSRUFTT05fUU9TX1JFUVVFU1RfVElNRU9VVDsKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOworCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfVEVBUl9ET1dOLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKKwkJCX0KKwkJfQorCX0KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIFJUTVBSY3ZGcmFtZURMU0NoZWNrKAorCUlOIFBSVE1QX0FEQVBURVIJcEFkLAorCUlOIFBIRUFERVJfODAyXzExCXBIZWFkZXIsCisJSU4gVUxPTkcJCQlMZW4sCisJSU4gUFJUMjhYWF9SWERfU1RSVUMJcFJ4RCkKK3sKKwlVTE9ORwkJCWk7CisJQk9PTEVBTgkJCWJGaW5kRW50cnkgPSBGQUxTRTsKKwlCT09MRUFOCQkJYlNUQUtleUZyYW1lID0gRkFMU0U7CisJUEVBUE9MX1BBQ0tFVAlwRWFwOworCVBVQ0hBUgkJCXBQcm90bywgcEFkZHIgPSBOVUxMOworCVBVQ0hBUgkJCXBTVEFLZXkgPSBOVUxMOworCVVDSEFSCQkJWmVyb1JlcGxheVtMRU5fS0VZX0RFU0NfUkVQTEFZXTsKKwlVQ0hBUgkJCU1pY1sxNl0sIE9sZE1pY1sxNl07CisJVUNIQVIJCQlkaWdlc3RbODBdOworCVVDSEFSCQkJRGxzUFRLWzgwXTsKKwlVQ0hBUgkJCXRlbXBbNjRdOworCUJPT0xFQU4JCQlUaW1lckNhbmNlbGxlZDsKKwlDSVBIRVJfS0VZCQlQYWlyd2lzZUtleTsKKworCisJaWYgKCEgcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJCXJldHVybiBiU1RBS2V5RnJhbWU7CisKKwlpZiAoISBJTkZSQV9PTihwQWQpKQorCQlyZXR1cm4gYlNUQUtleUZyYW1lOworCisJaWYgKCEgKHBIZWFkZXItPkZDLlN1YlR5cGUgJiAweDA4KSkKKwkJcmV0dXJuIGJTVEFLZXlGcmFtZTsKKworCWlmIChMZW4gPCBMRU5HVEhfODAyXzExICsgNiArIDIgKyAyKQorCQlyZXR1cm4gYlNUQUtleUZyYW1lOworCisJcFByb3RvCT0gKFBVQ0hBUilwSGVhZGVyICsgTEVOR1RIXzgwMl8xMSArIDIgKyA2OwkvLyBRT1MgQ29udHJvbCBmaWVsZCAsIDB4QUEgMHhBQSAweEFBIDB4MDAgMHgwMCAweDAwCisJcEFkZHIJPSBwSGVhZGVyLT5BZGRyMjsKKworCS8vIEwyUEFEIGJpdCBvbiB3aWxsIHBhZCAyIGJ5dGVzIGF0IExMQworCWlmIChwUnhELT5MMlBBRCkKKwl7CisJCXBQcm90byArPSAyOworCX0KKworCWlmIChSVE1QRXF1YWxNZW1vcnkoRUFQT0wsIHBQcm90bywgMikgJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49ICBOZGlzODAyXzExQXV0aE1vZGVXUEEpKQorCXsKKwkJcEVhcCA9IChQRUFQT0xfUEFDS0VUKSAocFByb3RvICsgMik7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBTbmlmZiBMZW49JWxkLCBEYXRhTGVuPSVkLCBLZXlNaWM9JWQsIEluc3RhbGw9JWQsIEtleUFjaz0lZCwgU2VjdXJlPSVkLCBFS0RfREw9JWQsIEVycm9yPSVkLCBSZXF1ZXN0PSVkXG4iLCBMZW4sCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExFTkdUSF84MDJfMTEgKyA2ICsgMiArIDIgKyBzaXplb2YoRUFQT0xfUEFDS0VUKSAtIE1BWF9MRU5fT0ZfUlNOSUUgKyAxNiksCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLktleU1pYywKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRWFwLT5LZXlEZXNjLktleUluZm8uSW5zdGFsbCwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRWFwLT5LZXlEZXNjLktleUluZm8uS2V5QWNrLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFYXAtPktleURlc2MuS2V5SW5mby5TZWN1cmUsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLkVLRF9ETCwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRWFwLT5LZXlEZXNjLktleUluZm8uRXJyb3IsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLlJlcXVlc3QpKTsKKworCQlpZiAoKExlbiA+PSAoTEVOR1RIXzgwMl8xMSArIDYgKyAyICsgMiArIHNpemVvZihFQVBPTF9QQUNLRVQpIC0gTUFYX0xFTl9PRl9SU05JRSArIDE2KSkgJiYgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLktleU1pYworCQkJJiYgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLkluc3RhbGwgJiYgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLktleUFjayAmJiBwRWFwLT5LZXlEZXNjLktleUluZm8uU2VjdXJlCisJCQkmJiBwRWFwLT5LZXlEZXNjLktleUluZm8uRUtEX0RMICYmICFwRWFwLT5LZXlEZXNjLktleUluZm8uRXJyb3IgJiYgIXBFYXAtPktleURlc2MuS2V5SW5mby5SZXF1ZXN0KQorCQl7CisJCQkvLyBGaXJzdCB2YWxpZGF0ZSByZXBsYXkgY291bnRlciwgb25seSBhY2NlcHQgbWVzc2FnZSB3aXRoIGxhcmdlciByZXBsYXkgY291bnRlcgorCQkJLy8gTGV0IGVxdWFsIHBhc3MsIHNvbWUgQVAgc3RhcnQgd2l0aCBhbGwgemVybyByZXBsYXkgY291bnRlcgorCQkJTmRpc1plcm9NZW1vcnkoWmVyb1JlcGxheSwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisJCQlpZiAoKFJUTVBDb21wYXJlTWVtb3J5KHBFYXAtPktleURlc2MuUmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSkgIT0gMSkgJiYKKwkJCQkoUlRNUENvbXBhcmVNZW1vcnkocEVhcC0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBaZXJvUmVwbGF5LCBMRU5fS0VZX0RFU0NfUkVQTEFZKSAhPSAwKSkKKwkJCQlyZXR1cm4gYlNUQUtleUZyYW1lOworCisJCQkvL1JUTVBNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIHBFYXAtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisJCQlSVE1QTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5EbHNSZXBsYXlDb3VudGVyLCBwRWFwLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBTbmlmZiByZXBsYXkgY291bnRlciAoJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4KSBMZW49JWxkLCBLZXlEYXRhTGVuPSVkXG4iLAorCQkJCXBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbMF0sIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbMV0sIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbMl0sCisJCQkJcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlclszXSwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlcls0XSwJcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlcls1XSwKKwkJCQlwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzZdLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzddLCBMZW4sIHBFYXAtPktleURlc2MuS2V5RGF0YVsxXSkpOworCisJCQkvLyBwdXQgdGhlc2UgY29kZSBzZWdtZW50IHRvIGdldCB0aGUgcmVwbGF5IGNvdW50ZXIKKwkJCWlmIChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpCisJCQkJcmV0dXJuIGJTVEFLZXlGcmFtZTsKKworCQkJLy8gQ2hlY2sgTUlDIHZhbHVlCisJCQkvLyBTYXZlIHRoZSBNSUMgYW5kIHJlcGxhY2Ugd2l0aCB6ZXJvCisJCQkvLyB1c2UgcHJvcHJpZXRhcnkgUFRLCisJCQlOZGlzWmVyb01lbW9yeSh0ZW1wLCA2NCk7CisJCQlOZGlzTW92ZU1lbW9yeSh0ZW1wLCAiSUVFRTgwMi4xMSBXSVJFTEVTUyBBQ0NFU1MgUE9JTlQiLCAzMik7CisJCQlXcGFDb3VudFBUSyhwQWQsIHRlbXAsIHRlbXAsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCB0ZW1wLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBEbHNQVEssIExFTl9QVEspOworCisJCQlOZGlzTW92ZU1lbW9yeShPbGRNaWMsIHBFYXAtPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKwkJCU5kaXNaZXJvTWVtb3J5KHBFYXAtPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKwkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJCXsKKwkJCQkvLyBBRVMKKwkJCQlITUFDX1NIQTEoKFBVQ0hBUikgcEVhcCwgcEVhcC0+Qm9keV9MZW5bMV0gKyA0LCBEbHNQVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJCQlOZGlzTW92ZU1lbW9yeShNaWMsCWRpZ2VzdCwJTEVOX0tFWV9ERVNDX01JQyk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaG1hY19tZDUoRGxzUFRLLCBMRU5fRUFQX01JQ0ssIChQVUNIQVIpIHBFYXAsIHBFYXAtPkJvZHlfTGVuWzFdICsgNCwgTWljKTsKKwkJCX0KKworCQkJaWYgKCFOZGlzRXF1YWxNZW1vcnkoT2xkTWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIk1JQyBEaWZmZXJlbnQgaW4gTXNnMSBvZiBTVEFLZXkgaGFuZHNoYWtlISBcbiIpKTsKKwkJCQlyZXR1cm4gYlNUQUtleUZyYW1lOworCQkJfQorCQkJZWxzZQorCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1JQyBWQUxJRCBpbiBNc2cxIG9mIFNUQUtleSBoYW5kc2hha2UhIFxuIikpOworI2lmIDEKKwkJCWlmICgocEVhcC0+S2V5RGVzYy5LZXlEYXRhWzBdID09IDB4REQpICYmIChwRWFwLT5LZXlEZXNjLktleURhdGFbMl0gPT0gMHgwMCkgJiYgKHBFYXAtPktleURlc2MuS2V5RGF0YVszXSA9PSAweDBDKQorCQkJCSYmIChwRWFwLT5LZXlEZXNjLktleURhdGFbNF0gPT0gMHg0MykgJiYgKHBFYXAtPktleURlc2MuS2V5RGF0YVs1XSA9PSAweDAyKSkKKwkJCXsKKwkJCQlwQWRkcgkJCT0gcEVhcC0+S2V5RGVzYy5LZXlEYXRhICsgODsJCS8vIFRwZSgxKSwgTGVuKDEpLCBPVUkoMyksIERhdGFUeXBlKDEpLCBSZXNlcnZlZCgyKQorCQkJCXBTVEFLZXkJCQk9IHBFYXAtPktleURlc2MuS2V5RGF0YSArIDE0OwkvLyBUcGUoMSksIExlbigxKSwgT1VJKDMpLCBEYXRhVHlwZSgxKSwgUmVzZXJ2ZWQoMiksIFNUQUtleV9NYWNfQWRkcig2KQorCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBSZWNlaXZlIFNUQUtleSBNZXNzYWdlLTEgZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBMZW49JWxkLCBLZXlEYXRhTGVuPSVkXG4iLAorCQkJCQlwQWRkclswXSwgcEFkZHJbMV0sIHBBZGRyWzJdLCBwQWRkclszXSwgcEFkZHJbNF0sIHBBZGRyWzVdLCBMZW4sIHBFYXAtPktleURlc2MuS2V5RGF0YVsxXSkpOworCisJCQkJYlNUQUtleUZyYW1lID0gVFJVRTsKKwkJCX0KKyNlbHNlCisJCQlpZiAoKHBFYXAtPktleURlc2MuS2V5RGF0YVswXSA9PSAweEREKSAmJiAocEVhcC0+S2V5RGVzYy5LZXlEYXRhWzJdID09IDB4MDApICYmIChwRWFwLT5LZXlEZXNjLktleURhdGFbM10gPT0gMHgwRikKKwkJCQkmJiAocEVhcC0+S2V5RGVzYy5LZXlEYXRhWzRdID09IDB4QUMpICYmIChwRWFwLT5LZXlEZXNjLktleURhdGFbNV0gPT0gMHgwMikpCisJCQl7CisJCQkJcEFkZHIJCQk9IHBFYXAtPktleURlc2MuS2V5RGF0YSArIDg7CQkvLyBUcGUoMSksIExlbigxKSwgT1VJKDMpLCBEYXRhVHlwZSgxKSwgUmVzZXJ2ZWQoMikKKwkJCQlwU1RBS2V5CQkJPSBwRWFwLT5LZXlEZXNjLktleURhdGEgKyAxNDsJLy8gVHBlKDEpLCBMZW4oMSksIE9VSSgzKSwgRGF0YVR5cGUoMSksIFJlc2VydmVkKDIpLCBTVEFLZXlfTWFjX0FkZHIoNikKKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUmVjZWl2ZSBTVEFLZXkgTWVzc2FnZS0xIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggTGVuPSVkLCBLZXlEYXRhTGVuPSVkXG4iLAorCQkJCQlwQWRkclswXSwgcEFkZHJbMV0sIHBBZGRyWzJdLCBwQWRkclszXSwgcEFkZHJbNF0sIHBBZGRyWzVdLCBMZW4sIHBFYXAtPktleURlc2MuS2V5RGF0YVsxXSkpOworCisJCQkJYlNUQUtleUZyYW1lID0gVFJVRTsKKwkJCX0KKyNlbmRpZgorCisJCX0KKwkJZWxzZSBpZiAoTGVuID49IChMRU5HVEhfODAyXzExICsgNiArIDIgKyAyICsgc2l6ZW9mKEVBUE9MX1BBQ0tFVCkgLSBNQVhfTEVOX09GX1JTTklFKSkKKwkJeworI2lmIDAKKwkJCVJUTVBNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIHBFYXAtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKyNlbmRpZgorCQkJUlRNUE1vdmVNZW1vcnkocEFkLT5TdGFDZmcuRGxzUmVwbGF5Q291bnRlciwgcEVhcC0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gU25pZmYgcmVwbGF5IGNvdW50ZXIgMiglMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMngpIExlbj0lbGQsIEtleURhdGFMZW49JWRcbiIsCisJCQkJcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlclswXSwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlclsxXSwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlclsyXSwKKwkJCQlwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzNdLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzRdLAlwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzVdLAorCQkJCXBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbNl0sIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbN10sIExlbiwgcEVhcC0+S2V5RGVzYy5LZXlEYXRhWzFdKSk7CisKKwkJfQorCX0KKworCS8vIElmIHRpbWVvdXQgdmFsdWUgaXMgZXF1YWxlZCB0byB6ZXJvLCBpdCBtZWFucyBhbHdheXMgbm90IGJlIHRpbWVvdXQuCisJLy8gdXBkYXRlIGxvY2FsIGRscyB0YWJsZSBlbnRyeQorCWZvciAoaT0gMDsgaSA8IE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkrKykKKwl7CisJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiBNQUNfQUREUl9FUVVBTChwQWRkciwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCXsKKwkJCWlmIChiU1RBS2V5RnJhbWUpCisJCQl7CisJCQkJUE1BQ19UQUJMRV9FTlRSWSBwRW50cnk7CisKKwkJCQkvLyBTVEFLZXkgZnJhbWUsIGFkZCBwYWlyd2lzZSBrZXkgdGFibGUKKwkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfRklOSVNIOworCQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisKKwkJCQlQYWlyd2lzZUtleS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKwkJCQlOZGlzTW92ZU1lbW9yeShQYWlyd2lzZUtleS5LZXksICZwU1RBS2V5WzBdLCBMRU5fVEtJUF9FSyk7CisJCQkJTmRpc01vdmVNZW1vcnkoUGFpcndpc2VLZXkuVHhNaWMsICZwU1RBS2V5WzE2XSwgTEVOX1RLSVBfUlhNSUNLKTsKKwkJCQlOZGlzTW92ZU1lbW9yeShQYWlyd2lzZUtleS5SeE1pYywgJnBTVEFLZXlbMjRdLCBMRU5fVEtJUF9UWE1JQ0spOworCisJCQkJUGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGc7CisKKwkJCQlwRW50cnkgPSBEbHNFbnRyeVRhYmxlTG9va3VwKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkciwgVFJVRSk7CisJCQkJLy9Bc2ljQWRkS2V5RW50cnkocEFkLCAoVVNIT1JUKShpICsgMiksIEJTUzAsIDAsICZQYWlyd2lzZUtleSwgVFJVRSwgVFJVRSk7CS8vIHJlc2VydmUgMCBmb3IgbXVsdGljYXN0LCAxIGZvciB1bmljYXN0CisJCQkJLy9Bc2ljVXBkYXRlUnhXQ0lEVGFibGUocEFkLCAoVVNIT1JUKShpICsgMiksIHBBZGRyKTsKKwkJCQkvLyBBZGQgUGFpci13aXNlIGtleSB0byBBc2ljCisjaWZkZWYgUlQyODcwCisJCQkJeworCQkJCQlSVF9BRERfUEFJUldJU0VfS0VZX0VOVFJZIEtleUluZm87CisJCQkJCUNPUFlfTUFDX0FERFIoS2V5SW5mby5NYWNBZGRyLHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQkJCQlLZXlJbmZvLk1hY1RhYk1hdGNoV0NJRD1wQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQ7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZLZXlJbmZvLkNpcGhlcktleSwgICZQYWlyd2lzZUtleSxzaXplb2YoQ0lQSEVSX0tFWSkpOworCQkJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIFJUX0NNRF9TRVRfS0VZX1RBQkxFLCAmS2V5SW5mbywgc2l6ZW9mKFJUX0FERF9QQUlSV0lTRV9LRVlfRU5UUlkpKTsKKwkJCQl9CisJCQkJeworCQkJCQlQTUFDX1RBQkxFX0VOVFJZIHBETFNFbnRyeTsKKwkJCQkJcERMU0VudHJ5ID0gRGxzRW50cnlUYWJsZUxvb2t1cChwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIsIFRSVUUpOworCQkJCQlwRExTRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZz1QYWlyd2lzZUtleS5DaXBoZXJBbGc7CisJCQkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgUlRfQ01EX1NFVF9SWF9XQ0lEX1RBQkxFLCBwRExTRW50cnksIHNpemVvZihNQUNfVEFCTEVfRU5UUlkpKTsKKwkJCQl9CisjZW5kaWYgLy8gUlQyODcwIC8vCisJCQkJTmRpc01vdmVNZW1vcnkoJnBFbnRyeS0+UGFpcndpc2VLZXksICZQYWlyd2lzZUtleSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFJlY2VpdmUgU1RBS2V5IE1lc3NhZ2UtMSAoUGVlciBTVEEgTUFDIEFkZHJlc3MgU1RBS2V5KSBcbiIpKTsKKworCQkJCVJUTVBTZW5kU1RBS2V5SGFuZFNoYWtlKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIEZpbmlzaCBTVEFLZXkgaGFuZHNoYWtlIHByb2NlZHVyZSAoSW5pdGlhdG9yIHNpZGUpXG4iKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gRGF0YSBmcmFtZSwgdXBkYXRlIHRpbWVvdXQgdmFsdWUKKwkJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpCisJCQkJeworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5Db3VudERvd25UaW1lciA9IHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQ7CisJCQkJCS8vQXNpY1VwZGF0ZVJ4V0NJRFRhYmxlKHBBZCwgKFVTSE9SVCkoaSArIDIpLCBwQWRkcik7CisJCQkJfQorCQkJfQorCisJCQliRmluZEVudHJ5ID0gVFJVRTsKKwkJfQorCX0KKworCS8vIHVwZGF0ZSBwZWVyIGRscyB0YWJsZSBlbnRyeQorCWZvciAoaT1NQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJeworCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgTUFDX0FERFJfRVFVQUwocEFkZHIsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQl7CisJCQlpZiAoYlNUQUtleUZyYW1lKQorCQkJeworCQkJCVBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5ID0gTlVMTDsKKworCQkJCS8vIFNUQUtleSBmcmFtZSwgYWRkIHBhaXJ3aXNlIGtleSB0YWJsZSwgYW5kIHNlbmQgU1RBa2V5IE1zZy0yCisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX0ZJTklTSDsKKwkJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCisJCQkJUGFpcndpc2VLZXkuS2V5TGVuID0gTEVOX1RLSVBfRUs7CisJCQkJTmRpc01vdmVNZW1vcnkoUGFpcndpc2VLZXkuS2V5LCAmcFNUQUtleVswXSwgTEVOX1RLSVBfRUspOworCQkJCU5kaXNNb3ZlTWVtb3J5KFBhaXJ3aXNlS2V5LlR4TWljLCAmcFNUQUtleVsxNl0sIExFTl9US0lQX1JYTUlDSyk7CisJCQkJTmRpc01vdmVNZW1vcnkoUGFpcndpc2VLZXkuUnhNaWMsICZwU1RBS2V5WzI0XSwgTEVOX1RLSVBfVFhNSUNLKTsKKworCQkJCVBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnOworCisJCQkJcEVudHJ5ID0gRGxzRW50cnlUYWJsZUxvb2t1cChwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIsIFRSVUUpOworCQkJCS8vQXNpY0FkZEtleUVudHJ5KHBBZCwgKFVTSE9SVCkoaSArIDIpLCBCU1MwLCAwLCAmUGFpcndpc2VLZXksIFRSVUUsIFRSVUUpOwkvLyByZXNlcnZlIDAgZm9yIG11bHRpY2FzdCwgMSBmb3IgdW5pY2FzdAorCQkJCS8vQXNpY1VwZGF0ZVJ4V0NJRFRhYmxlKHBBZCwgKFVTSE9SVCkoaSArIDIpLCBwQWRkcik7CisJCQkJLy8gQWRkIFBhaXItd2lzZSBrZXkgdG8gQXNpYworI2lmZGVmIFJUMjg3MAorCQkJCXsKKwkJCQkJUlRfQUREX1BBSVJXSVNFX0tFWV9FTlRSWSBLZXlJbmZvOworCQkJCQlDT1BZX01BQ19BRERSKEtleUluZm8uTWFjQWRkcixwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJCQkJS2V5SW5mby5NYWNUYWJNYXRjaFdDSUQ9cEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lEOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmS2V5SW5mby5DaXBoZXJLZXksICAmUGFpcndpc2VLZXksc2l6ZW9mKENJUEhFUl9LRVkpKTsKKwkJCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBSVF9DTURfU0VUX0tFWV9UQUJMRSwgJktleUluZm8sIHNpemVvZihSVF9BRERfUEFJUldJU0VfS0VZX0VOVFJZKSk7CisJCQkJfQorCQkJCXsKKwkJCQkJUE1BQ19UQUJMRV9FTlRSWSBwRExTRW50cnk7CisJCQkJCXBETFNFbnRyeSA9IERsc0VudHJ5VGFibGVMb29rdXAocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyLCBUUlVFKTsKKwkJCQkJcERMU0VudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGc9UGFpcndpc2VLZXkuQ2lwaGVyQWxnOworCQkJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIFJUX0NNRF9TRVRfUlhfV0NJRF9UQUJMRSwgcERMU0VudHJ5LCBzaXplb2YoTUFDX1RBQkxFX0VOVFJZKSk7CisJCQkJfQorI2VuZGlmIC8vIFJUMjg3MCAvLworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwRW50cnktPlBhaXJ3aXNlS2V5LCAmUGFpcndpc2VLZXksIHNpemVvZihDSVBIRVJfS0VZKSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBSZWNlaXZlIFNUQUtleSBNZXNzYWdlLTEgKEluaXRpYXRvciBTVEEgTUFDIEFkZHJlc3MgU1RBS2V5KVxuIikpOworCisJCQkJLy8gSWYgc3VwcG9ydCBXUEEgb3IgV1BBMiwgc3RhcnQgU1RBS2V5IGhhbmQgc2hha2UsCisJCQkJLy8gSWYgZmFpbGVkIGhhbmQgc2hha2UsIGp1c3QgdGVhciBkb3duIHBlZXIgRExTCisJCQkJaWYgKFJUTVBTZW5kU1RBS2V5SGFuZFNoYWtlKHBBZCwgcEFkZHIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkJeworCQkJCQlNTE1FX0RMU19SRVFfU1RSVUNUCU1sbWVEbHNSZXE7CisJCQkJCVVTSE9SVAkJCQlyZWFzb24gPSBSRUFTT05fUU9TX0NJUEhFUl9OT1RfU1VQUE9SVDsKKworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKKwkJCQkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCByZWFzb24pOworCQkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfVEVBUl9ET1dOLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBGaW5pc2ggU1RBS2V5IGhhbmRzaGFrZSBwcm9jZWR1cmUgKFBlZXIgc2lkZSlcbiIpKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gRGF0YSBmcmFtZSwgdXBkYXRlIHRpbWVvdXQgdmFsdWUKKwkJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpCisJCQkJeworCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5Db3VudERvd25UaW1lciA9IHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQ7CisJCQkJfQorCQkJfQorCisJCQliRmluZEVudHJ5ID0gVFJVRTsKKwkJfQorCX0KKworCisJcmV0dXJuIGJTVEFLZXlGcmFtZTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNoZWNrIGlmIHRoZSBmcmFtZSBjYW4gYmUgc2VudCB0aHJvdWdoIERMUyBkaXJlY3QgbGluayBpbnRlcmZhY2UKKworCUFyZ3VtZW50czoKKwkJcEFkCQlQb2ludGVyCXRvIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJRExTIGVudHJ5IGluZGV4CisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVJUTVBDaGVja0RMU0ZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcERBKQoreworCUlOVCBydmFsID0gLTE7CisJSU5UCWk7CisKKwlpZiAoIXBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQorCQlyZXR1cm4gcnZhbDsKKworCWlmICghSU5GUkFfT04ocEFkKSkKKwkJcmV0dXJuIHJ2YWw7CisKKwlkb3sKKwkJLy8gY2hlY2sgbG9jYWwgZGxzIHRhYmxlIGVudHJ5CisJCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkrKykKKwkJeworCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkgJiYKKwkJCQlNQUNfQUREUl9FUVVBTChwREEsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQkJeworCQkJCXJ2YWwgPSBpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLy8gY2hlY2sgcGVlciBkbHMgdGFibGUgZW50cnkKKwkJZm9yIChpPU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwkJeworCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkgJiYKKwkJCQlNQUNfQUREUl9FUVVBTChwREEsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQkJeworCQkJCXJ2YWwgPSBpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfSB3aGlsZSAoRkFMU0UpOworCisJcmV0dXJuIHJ2YWw7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwREEpCit7CisJUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7CisJTkRJU19TVEFUVVMJCU5TdGF0dXM7CisJSEVBREVSXzgwMl8xMQlEbHNUZWFyRG93bkhkcjsKKwlVTE9ORwkJCUZyYW1lTGVuID0gMDsKKwlVU0hPUlQJCQlSZWFzb24gPSBSRUFTT05fUU9TX1FTVEFfTEVBVklOR19RQlNTOworCVVDSEFSCQkJQ2F0ZWdvcnkgPSBDQVRFR09SWV9ETFM7CisJVUNIQVIJCQlBY3Rpb24gPSBBQ1RJT05fRExTX1RFQVJET1dOOworCVVDSEFSCQkJaSA9IDA7CisKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSB8fAorCQlSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpCisJCXJldHVybjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNlbmQgRExTIFRlYXJEb3duIEZyYW1lIFxuIikpOworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJBU1NPQyAtIFJUTVBTZW5kRExTVGVhckRvd25GcmFtZSgpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwlBY3RIZWFkZXJJbml0KHBBZCwgJkRsc1RlYXJEb3duSGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkJCSZGcmFtZUxlbiwKKwkJCQkJc2l6ZW9mKEhFQURFUl84MDJfMTEpLAkJJkRsc1RlYXJEb3duSGRyLAorCQkJCQkxLAkJCQkJCQkmQ2F0ZWdvcnksCisJCQkJCTEsCQkJCQkJCSZBY3Rpb24sCisJCQkJCTYsCQkJCQkJCXBEQSwKKwkJCQkJNiwJCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcywKKwkJCQkJMiwJCQkJCQkJJlJlYXNvbiwKKwkJCQkJRU5EX09GX0FSR1MpOworCisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCS8vIFJlbW92ZSBrZXkgaW4gbG9jYWwgZGxzIHRhYmxlIGVudHJ5CisJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkrKykKKwl7CisJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpCisJCQkmJiBNQUNfQUREUl9FUVVBTChwREEsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQorCQl7CisJCQlNYWNUYWJsZURlbGV0ZURsc0VudHJ5KHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lELCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJfQorCX0KKworCS8vIFJlbW92ZSBrZXkgaW4gcGVlciBkbHMgdGFibGUgZW50cnkKKwlmb3IgKGk9TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCXsKKwkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkKKwkJCSYmIE1BQ19BRERSX0VRVUFMKHBEQSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCisJCXsKKwkJCU1hY1RhYmxlRGVsZXRlRGxzRW50cnkocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQl9CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2VuZCBETFMgVGVhckRvd24gRnJhbWUgYW5kIHJlbW92ZSBrZXkgaW4gKGk9JWQpIFxuIiwgaSkpOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK05ESVNfU1RBVFVTIFJUTVBTZW5kU1RBS2V5UmVxdWVzdCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwREEpCit7CisJVUNIQVIJCQkJSGVhZGVyODAyXzNbMTRdOworCU5ESVNfU1RBVFVTCQkJTlN0YXR1czsKKwlVTE9ORwkJCQlGcmFtZUxlbiA9IDA7CisJRUFQT0xfUEFDS0VUCQlQYWNrZXQ7CisJVUNIQVIJCQkJTWljWzE2XTsKKwlVQ0hBUgkJCQlkaWdlc3RbODBdOworCVBVQ0hBUgkJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlQTkRJU19QQUNLRVQJCXBOZGlzUGFja2V0OworCVVDSEFSCQkJCXRlbXBbNjRdOworCVVDSEFSCQkJCURsc1BUS1s4MF07CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFJUTVBTZW5kU1RBS2V5UmVxdWVzdCgpIHRvICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLCBwREFbMF0sIHBEQVsxXSwgcERBWzJdLCBwREFbM10sIHBEQVs0XSwgcERBWzVdKSk7CisKKwlwQWQtPlNlcXVlbmNlICsrOworCU1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgRUFQT0wpOworCisJLy8gWmVybyBtZXNzYWdlIGJvZHkKKwlOZGlzWmVyb01lbW9yeSgmUGFja2V0LCBzaXplb2YoUGFja2V0KSk7CisJUGFja2V0LlByb1ZlciA9IEVBUE9MX1ZFUjsKKwlQYWNrZXQuUHJvVHlwZSAgICA9IEVBUE9MS2V5OworCVBhY2tldC5Cb2R5X0xlblsxXSAgPSBzaXplb2YoS0VZX0RFU0NSSVBURVIpIC0gTUFYX0xFTl9PRl9SU05JRSArIDYgKyBNQUNfQUREUl9MRU47CQkvLyBkYXRhIGZpZWxkIGNvbnRhaW4gS0RFIGFuZFBlZXIgTUFDIGFkZHJlc3MKKworCS8vIFNUQUtleSBNZXNzYWdlIGlzIGFzIEVBUE9MLUtleSgxLDEsMCwwLEcvMCwwLDAsIE1JQywgMCxQZWVyIE1BQyBLREUpCisJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKQorICAgIHsKKyAgICAgICAgUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTFfS0VZX0RFU0M7CisgICAgfQorICAgIGVsc2UgaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCisgICAgeworICAgICAgICBQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMl9LRVlfREVTQzsKKyAgICB9CisKKwkvLyBLZXkgZGVzY3JpcHRvciB2ZXJzaW9uCisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0KKwkJKCgocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSB8fCAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpID8gKERFU0NfVFlQRV9BRVMpIDogKERFU0NfVFlQRV9US0lQKSk7CisKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleU1pYwk9IDE7CisJUGFja2V0LktleURlc2MuS2V5SW5mby5TZWN1cmUJPSAxOworCVBhY2tldC5LZXlEZXNjLktleUluZm8uUmVxdWVzdAk9IDE7CisKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhTGVuWzFdCT0gMTI7CisKKwkvLyB1c2Ugb3VyIG93biBPVUkgdG8gZGlzdGluZ3Vpc2ggcHJvcHJpZXRhcnkgd2l0aCBzdGFuZGFyZC4KKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzBdCQk9IDB4REQ7CisJUGFja2V0LktleURlc2MuS2V5RGF0YVsxXQkJPSAweDBBOworCVBhY2tldC5LZXlEZXNjLktleURhdGFbMl0JCT0gMHgwMDsKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzNdCQk9IDB4MEM7CisJUGFja2V0LktleURlc2MuS2V5RGF0YVs0XQkJPSAweDQzOworCVBhY2tldC5LZXlEZXNjLktleURhdGFbNV0JCT0gMHgwMzsKKwlOZGlzTW92ZU1lbW9yeSgmUGFja2V0LktleURlc2MuS2V5RGF0YVs2XSwgcERBLCBNQUNfQUREUl9MRU4pOworCisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuUmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuRGxzUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwkvLyBBbGxvY2F0ZSBidWZmZXIgZm9yIHRyYW5zbWl0dGluZyBtZXNzYWdlCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsKKwlpZiAoTlN0YXR1cwkhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQlyZXR1cm4gTlN0YXR1czsKKworCS8vIFByZXBhcmUgRUFQT0wgZnJhbWUgZm9yIE1JQyBjYWxjdWxhdGlvbgorCS8vIEJlIGNhcmVmdWwsIG9ubHkgRUFQT0wgZnJhbWUgaXMgY291bnRlZCBmb3IgTUlDIGNhbGN1bGF0aW9uCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKwkJICAgICAgICAgICAgICBQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAgICAmUGFja2V0LAorCQkgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKworCS8vIHVzZSBwcm9wcmlldGFyeSBQVEsKKwlOZGlzWmVyb01lbW9yeSh0ZW1wLCA2NCk7CisJTmRpc01vdmVNZW1vcnkodGVtcCwgIklFRUU4MDIuMTEgV0lSRUxFU1MgQUNDRVNTIFBPSU5UIiwgMzIpOworCVdwYUNvdW50UFRLKHBBZCwgdGVtcCwgdGVtcCwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHRlbXAsIHBBZC0+Q3VycmVudEFkZHJlc3MsIERsc1BUSywgTEVOX1BUSyk7CisKKwkvLyBjYWxjdWxhdGUgTUlDCisJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJLy8gQUVTCisJCU5kaXNaZXJvTWVtb3J5KGRpZ2VzdCwJc2l6ZW9mKGRpZ2VzdCkpOworCQlITUFDX1NIQTEocE91dEJ1ZmZlciwgRnJhbWVMZW4sIERsc1BUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworCQlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisJfQorCWVsc2UKKwl7CisJCU5kaXNaZXJvTWVtb3J5KE1pYywJc2l6ZW9mKE1pYykpOworCQlobWFjX21kNShEbHNQVEssIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIE1pYyk7CisJCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKwl9CisKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAorCSAgICAgICAgICAgICAgICAgIHNpemVvZihIZWFkZXI4MDJfMyksCUhlYWRlcjgwMl8zLAorCQkgICAgICAgICAgICAgIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsCSZQYWNrZXQsCisJCSAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworCisJTlN0YXR1cyA9IFJUTVBBbGxvY2F0ZU5kaXNQYWNrZXQocEFkLCAmcE5kaXNQYWNrZXQsIE5VTEwsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlpZiAoTlN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJUlRNUF9TRVRfUEFDS0VUX1dDSUQocE5kaXNQYWNrZXQsIEJTU0lEX1dDSUQpOworCQlTVEFTZW5kUGFja2V0KHBBZCwgcE5kaXNQYWNrZXQpOworCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBOVU1fT0ZfVFhfUklORywgTUFYX1RYX1BST0NFU1MpOworCX0KKworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2VuZFNUQUtleVJlcXVlc3QtIFNlbmQgU1RBS2V5IHJlcXVlc3QgKE5TdGF0dXM9JXgsIEZyYW1lTGVuPSVsZClcbiIsIE5TdGF0dXMsIEZyYW1lTGVuKSk7CisKKwlyZXR1cm4gTlN0YXR1czsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitORElTX1NUQVRVUyBSVE1QU2VuZFNUQUtleUhhbmRTaGFrZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwREEpCit7CisJVUNIQVIJCQkJSGVhZGVyODAyXzNbMTRdOworCU5ESVNfU1RBVFVTCQkJTlN0YXR1czsKKwlVTE9ORwkJCQlGcmFtZUxlbiA9IDA7CisJRUFQT0xfUEFDS0VUCQlQYWNrZXQ7CisJVUNIQVIJCQkJTWljWzE2XTsKKwlVQ0hBUgkJCQlkaWdlc3RbODBdOworCVBVQ0hBUgkJCQlwT3V0QnVmZmVyID0gTlVMTDsKKwlQTkRJU19QQUNLRVQJCXBOZGlzUGFja2V0OworCVVDSEFSCQkJCXRlbXBbNjRdOworCVVDSEFSCQkJCURsc1BUS1s4MF07CQkJLy8gRHVlIHRvIGRpcnZlciBjYW4gbm90IGdldCBQVEssIHVzZSBwcm9wcmlldGFyeSBQVEsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUlRNUFNlbmRTVEFLZXlIYW5kU2hha2UoKSB0byAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwgcERBWzBdLCBwREFbMV0sIHBEQVsyXSwgcERBWzNdLCBwREFbNF0sIHBEQVs1XSkpOworCisJcEFkLT5TZXF1ZW5jZSArKzsKKwlNQUtFXzgwMl8zX0hFQURFUihIZWFkZXI4MDJfMywgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIEVBUE9MKTsKKworCS8vIFplcm8gbWVzc2FnZSBib2R5CisJTmRpc1plcm9NZW1vcnkoJlBhY2tldCwgc2l6ZW9mKFBhY2tldCkpOworCVBhY2tldC5Qcm9WZXIgPSBFQVBPTF9WRVI7CisJUGFja2V0LlByb1R5cGUgICAgPSBFQVBPTEtleTsKKwlQYWNrZXQuQm9keV9MZW5bMV0gID0gc2l6ZW9mKEtFWV9ERVNDUklQVEVSKSAtIE1BWF9MRU5fT0ZfUlNOSUUgKyA2ICsgTUFDX0FERFJfTEVOOwkJLy8gZGF0YSBmaWVsZCBjb250YWluIEtERSBhbmQgUGVlciBNQUMgYWRkcmVzcworCisJLy8gU1RBS2V5IE1lc3NhZ2UgaXMgYXMgRUFQT0wtS2V5KDEsMSwwLDAsRy8wLDAsMCwgTUlDLCAwLFBlZXIgTUFDIEtERSkKKwlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpCisgICAgeworICAgICAgICBQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMV9LRVlfREVTQzsKKyAgICB9CisgICAgZWxzZSBpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKKyAgICB7CisgICAgICAgIFBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEEyX0tFWV9ERVNDOworICAgIH0KKworCS8vIEtleSBkZXNjcmlwdG9yIHZlcnNpb24KKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPQorCQkoKChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpIHx8IChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkgPyAoREVTQ19UWVBFX0FFUykgOiAoREVTQ19UWVBFX1RLSVApKTsKKworCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5TWljCT0gMTsKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLlNlY3VyZQk9IDE7CisKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhTGVuWzFdCT0gMTI7CisKKwkvLyB1c2Ugb3VyIG93biBPVUkgdG8gZGlzdGluZ3Vpc2ggcHJvcHJpZXRhcnkgd2l0aCBzdGFuZGFyZC4KKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzBdCQk9IDB4REQ7CisJUGFja2V0LktleURlc2MuS2V5RGF0YVsxXQkJPSAweDBBOworCVBhY2tldC5LZXlEZXNjLktleURhdGFbMl0JCT0gMHgwMDsKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzNdCQk9IDB4MEM7CisJUGFja2V0LktleURlc2MuS2V5RGF0YVs0XQkJPSAweDQzOworCVBhY2tldC5LZXlEZXNjLktleURhdGFbNV0JCT0gMHgwMzsKKwlOZGlzTW92ZU1lbW9yeSgmUGFja2V0LktleURlc2MuS2V5RGF0YVs2XSwgcERBLCBNQUNfQUREUl9MRU4pOworCisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuUmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuRGxzUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwkvLyBBbGxvY2F0ZSBidWZmZXIgZm9yIHRyYW5zbWl0dGluZyBtZXNzYWdlCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsKKwlpZiAoTlN0YXR1cwkhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQlyZXR1cm4gTlN0YXR1czsKKworCS8vIFByZXBhcmUgRUFQT0wgZnJhbWUgZm9yIE1JQyBjYWxjdWxhdGlvbgorCS8vIEJlIGNhcmVmdWwsIG9ubHkgRUFQT0wgZnJhbWUgaXMgY291bnRlZCBmb3IgTUlDIGNhbGN1bGF0aW9uCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKwkJICAgICAgICAgICAgICBQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAgICAmUGFja2V0LAorCQkgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKKworCS8vIHVzZSBwcm9wcmlldGFyeSBQVEsKKwlOZGlzWmVyb01lbW9yeSh0ZW1wLCA2NCk7CisJTmRpc01vdmVNZW1vcnkodGVtcCwgIklFRUU4MDIuMTEgV0lSRUxFU1MgQUNDRVNTIFBPSU5UIiwgMzIpOworCVdwYUNvdW50UFRLKHBBZCwgdGVtcCwgdGVtcCwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHRlbXAsIHBBZC0+Q3VycmVudEFkZHJlc3MsIERsc1BUSywgTEVOX1BUSyk7CisKKwkvLyBjYWxjdWxhdGUgTUlDCisJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJLy8gQUVTCisJCU5kaXNaZXJvTWVtb3J5KGRpZ2VzdCwJc2l6ZW9mKGRpZ2VzdCkpOworCQlITUFDX1NIQTEocE91dEJ1ZmZlciwgRnJhbWVMZW4sIERsc1BUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworCQlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisJfQorCWVsc2UKKwl7CisJCU5kaXNaZXJvTWVtb3J5KE1pYywJc2l6ZW9mKE1pYykpOworCQlobWFjX21kNShEbHNQVEssIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIE1pYyk7CisJCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKwl9CisKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAorCSAgICAgICAgICAgICAgICAgIHNpemVvZihIZWFkZXI4MDJfMyksCUhlYWRlcjgwMl8zLAorCQkgICAgICAgICAgICAgIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsCSZQYWNrZXQsCisJCSAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworCisJTlN0YXR1cyA9IFJUTVBBbGxvY2F0ZU5kaXNQYWNrZXQocEFkLCAmcE5kaXNQYWNrZXQsIE5VTEwsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlpZiAoTlN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCXsKKwkJUlRNUF9TRVRfUEFDS0VUX1dDSUQocE5kaXNQYWNrZXQsIEJTU0lEX1dDSUQpOworCQlTVEFTZW5kUGFja2V0KHBBZCwgcE5kaXNQYWNrZXQpOworCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBOVU1fT0ZfVFhfUklORywgTUFYX1RYX1BST0NFU1MpOworCX0KKworCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2VuZFNUQUtleUhhbmRTaGFrZS0gU2VuZCBTVEFLZXkgTWVzc2FnZS0yIChOU3RhdHVzPSV4LCBGcmFtZUxlbj0lbGQpXG4iLCBOU3RhdHVzLCBGcmFtZUxlbikpOworCisJcmV0dXJuIE5TdGF0dXM7Cit9CisKK1ZPSUQgRGxzVGltZW91dEFjdGlvbigKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisJTUxNRV9ETFNfUkVRX1NUUlVDVAkJTWxtZURsc1JlcTsKKwlVU0hPUlQJCQkJCXJlYXNvbjsKKwlQUlRfODAyXzExX0RMUwkJCXBETFMgPSAoUFJUXzgwMl8xMV9ETFMpRnVuY3Rpb25Db250ZXh0OworCVBSVE1QX0FEQVBURVIJCQlwQWQgPSBwRExTLT5wQWQ7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEbHNUaW1lb3V0IC0gVGVhciBkb3duIERMUyBsaW5rcyAoJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngpXG4iLAorCQlwRExTLT5NYWNBZGRyWzBdLCBwRExTLT5NYWNBZGRyWzFdLCBwRExTLT5NYWNBZGRyWzJdLCBwRExTLT5NYWNBZGRyWzNdLCBwRExTLT5NYWNBZGRyWzRdLCBwRExTLT5NYWNBZGRyWzVdKSk7CisKKwlpZiAoKHBETFMpICYmIChwRExTLT5WYWxpZCkpCisJeworCQlyZWFzb24JCQk9IFJFQVNPTl9RT1NfUkVRVUVTVF9USU1FT1VUOworCQlwRExTLT5WYWxpZAkJPSBGQUxTRTsKKwkJcERMUy0+U3RhdHVzCT0gRExTX05PTkU7CisJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsIHBETFMsIHJlYXNvbik7CisJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19URUFSX0RPV04sIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOworCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisJfQorfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorRGVzY3JpcHRpb24gOiBiZWNhdXNlIERMUyBhbmQgQ0xJIHNoYXJlIHRoZSBzYW1lIFdDSUQgdGFibGUgaW4gQVNJQy4KK01lc2ggZW50cnkgYWxzbyBpbnNlcnQgdG8gcEFkLT5NYWNUYWIuY29udGVudFtdLiAgU3VjaCBpcyBtYXJrZWQgYXMgVmFsaWRBc0RscyA9IFRSVUUuCitBbHNvIGZpbGxzIHRoZSBwYWlyd2lzZSBrZXkuCitCZWNhdXNlIGZyb250IE1BWF9BSURfQkEgZW50cmllcyBoYXZlIGRpcmVjdCBtYXBwaW5nIHRvIEJBRW50cnksIHdoaWNoIGlzIG9ubHkgdXNlZCBhcyBDTEkuIFNvIHdlIGluc2VydCBEbHMKK2Zyb20gaW5kZXggTUFYX0FJRF9CQS4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitNQUNfVEFCTEVfRU5UUlkgKk1hY1RhYmxlSW5zZXJ0RGxzRW50cnkoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUglwQWRkciwKKwlJTiAgVUlOVAlEbHNFbnRyeUlkeCkKK3sKKwlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA9IE5VTEw7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiBNYWNUYWJsZUluc2VydERsc0VudHJ5XG4iKSk7CisJLy8gaWYgRlVMTCwgcmV0dXJuCisJaWYgKHBBZC0+TWFjVGFiLlNpemUgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCisJCXJldHVybiBOVUxMOworCisJZG8KKwl7CisJCWlmKChwRW50cnkgPSBEbHNFbnRyeVRhYmxlTG9va3VwKHBBZCwgcEFkZHIsIFRSVUUpKSAhPSBOVUxMKQorCQkJYnJlYWs7CisKKwkJLy8gYWxsb2NhdGUgb25lIE1BQyBlbnRyeQorCQlwRW50cnkgPSBNYWNUYWJsZUluc2VydEVudHJ5KHBBZCwgcEFkZHIsIERsc0VudHJ5SWR4ICsgTUlOX05FVF9ERVZJQ0VfRk9SX0RMUywgVFJVRSk7CisJCWlmIChwRW50cnkpCisJCXsKKwkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W0Rsc0VudHJ5SWR4XS5NYWNUYWJNYXRjaFdDSUQgPSBwRW50cnktPkFpZDsKKwkJCXBFbnRyeS0+TWF0Y2hEbHNFbnRyeUlkeCA9IERsc0VudHJ5SWR4OworCQkJcEVudHJ5LT5BdXRoTW9kZSA9IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlOworCQkJcEVudHJ5LT5XZXBTdGF0dXMgPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7CisJCQlwRW50cnktPlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1hY1RhYmxlSW5zZXJ0RGxzRW50cnkgLSBhbGxvY2F0ZSBlbnRyeSAjJWQsIFRvdGFsPSAlZFxuIixwRW50cnktPkFpZCwgcEFkLT5NYWNUYWIuU2l6ZSkpOworCisJCQkvLyBJZiBsZWdhY3kgV0VQIGlzIHVzZWQsIHNldCBwYWlyLXdpc2UgY2lwaGVyQWxnIGludG8gV0NJRCBhdHRyaWJ1dGUgdGFibGUgZm9yIHRoaXMgZW50cnkKKwkJCWlmICgocEVudHJ5LT5WYWxpZEFzRGxzKSAmJiAocEVudHJ5LT5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpKQorCQkJeworCQkJCVVDSEFSIEtleUlkeCA9IDA7CisJCQkJVUNIQVIgQ2lwaGVyQWxnID0gMDsKKworCQkJCUtleUlkeAk9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKKworCQkJCUNpcGhlckFsZyAJPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZzsKKworCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorCQkJCQkJCQkJCQlCU1MwLAorCQkJCQkJCQkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCisJCQkJCQkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLAorCQkJCQkJCQkJCQlwRW50cnkpOworCQkJfQorCisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUoRkFMU0UpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PT0gTWFjVGFibGVJbnNlcnREbHNFbnRyeVxuIikpOworCisJcmV0dXJuIHBFbnRyeTsKK30KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCURlbGV0ZSBhbGwgTWVzaCBFbnRyeSBpbiBwQWQtPk1hY1RhYgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gTWFjVGFibGVEZWxldGVEbHNFbnRyeSgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVU0hPUlQgd2NpZCwKKwlJTiBQVUNIQVIgcEFkZHIpCit7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gTWFjVGFibGVEZWxldGVEbHNFbnRyeVxuIikpOworCisJaWYgKCFWQUxJRF9XQ0lEKHdjaWQpKQorCQlyZXR1cm4gRkFMU0U7CisKKwlNYWNUYWJsZURlbGV0ZUVudHJ5KHBBZCwgd2NpZCwgcEFkZHIpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PT0gTWFjVGFibGVEZWxldGVEbHNFbnRyeVxuIikpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK01BQ19UQUJMRV9FTlRSWSAqRGxzRW50cnlUYWJsZUxvb2t1cCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIJcEFkZHIsCisJSU4gQk9PTEVBTgliUmVzZXRJZGVsQ291bnQpCit7CisJVUxPTkcgSGFzaElkeDsKKwlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9IE5VTEw7CisKKwlSVE1QX1NFTV9MT0NLKCZwQWQtPk1hY1RhYkxvY2spOworCUhhc2hJZHggPSBNQUNfQUREUl9IQVNIX0lOREVYKHBBZGRyKTsKKwlwRW50cnkgPSBwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdOworCisJd2hpbGUgKHBFbnRyeSkKKwl7CisJCWlmICgocEVudHJ5LT5WYWxpZEFzRGxzID09IFRSVUUpCisJCQkmJiBNQUNfQUREUl9FUVVBTChwRW50cnktPkFkZHIsIHBBZGRyKSkKKwkJeworCQkJaWYoYlJlc2V0SWRlbENvdW50KQorCQkJCXBFbnRyeS0+Tm9EYXRhSWRsZUNvdW50ID0gMDsKKwkJCWJyZWFrOworCQl9CisJCWVsc2UKKwkJCXBFbnRyeSA9IHBFbnRyeS0+cE5leHQ7CisJfQorCisJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPk1hY1RhYkxvY2spOworCXJldHVybiBwRW50cnk7Cit9CisKK01BQ19UQUJMRV9FTlRSWSAqRGxzRW50cnlUYWJsZUxvb2t1cEJ5V2NpZCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBVQ0hBUgl3Y2lkLAorCUlOIFBVQ0hBUglwQWRkciwKKwlJTiBCT09MRUFOCWJSZXNldElkZWxDb3VudCkKK3sKKwlVTE9ORyBETHNJbmRleDsKKwlQTUFDX1RBQkxFX0VOVFJZIHBDdXJFbnRyeSA9IE5VTEw7CisJUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgPSBOVUxMOworCisJaWYgKCFWQUxJRF9XQ0lEKHdjaWQpKQorCQlyZXR1cm4gTlVMTDsKKworCVJUTVBfU0VNX0xPQ0soJnBBZC0+TWFjVGFiTG9jayk7CisKKwlkbworCXsKKwkJcEN1ckVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbd2NpZF07CisKKwkJRExzSW5kZXggPSAweGZmOworCQlpZiAoKHBDdXJFbnRyeSkgJiYgKHBDdXJFbnRyeS0+VmFsaWRBc0Rscz09IFRSVUUpKQorCQl7CisJCQlETHNJbmRleCA9IHBDdXJFbnRyeS0+TWF0Y2hEbHNFbnRyeUlkeDsKKwkJfQorCisJCWlmIChETHNJbmRleCA9PSAweGZmKQorCQkJYnJlYWs7CisKKwkJaWYgKE1BQ19BRERSX0VRVUFMKHBDdXJFbnRyeS0+QWRkciwgcEFkZHIpKQorCQl7CisJCQlpZihiUmVzZXRJZGVsQ291bnQpCisJCQkJcEN1ckVudHJ5LT5Ob0RhdGFJZGxlQ291bnQgPSAwOworCQkJcEVudHJ5ID0gcEN1ckVudHJ5OworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlKEZBTFNFKTsKKworCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5NYWNUYWJMb2NrKTsKKworCXJldHVybiBwRW50cnk7Cit9CisKK0lOVCBTZXRfRGxzRW50cnlJbmZvX0Rpc3BsYXlfUHJvYygKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCwKKwlJTiBQVUNIQVIgYXJnKQoreworCUlOVCBpOworCisJcHJpbnRrKCJcbiUtMTlzJS04c1xuIiwgIk1BQyIsICJUSU1FT1VUXG4iKTsKKwlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCXsKKwkJaWYgKChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCkgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSkKKwkJeworCQkJUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSURdOworCisJCQlwcmludGsoIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4ICAiLAorCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHJbMF0sIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHJbMV0sIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHJbMl0sCisJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkclszXSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcls0XSwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcls1XSk7CisJCQlwcmludGsoIiUtOGRcbiIsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQpOworCisJCQlwcmludGsoIlxuIik7CisJCQlwcmludGsoIlxuJS0xOXMlLTRzJS00cyUtNHMlLTRzJS03cyUtN3MlLTdzIiwiTUFDIiwgIkFJRCIsICJCU1MiLCAiUFNNIiwgIldNTSIsICJSU1NJMCIsICJSU1NJMSIsICJSU1NJMiIpOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJcHJpbnRrKCIlLThzJS0xMHMlLTZzJS02cyUtNnMlLTZzIiwgIk1JTU9QUyIsICJQaE1kIiwgIkJXIiwgIk1DUyIsICJTR0kiLCAiU1RCQyIpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJcHJpbnRrKCJcbiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYICAiLAorCQkJCXBFbnRyeS0+QWRkclswXSwgcEVudHJ5LT5BZGRyWzFdLCBwRW50cnktPkFkZHJbMl0sCisJCQkJcEVudHJ5LT5BZGRyWzNdLCBwRW50cnktPkFkZHJbNF0sIHBFbnRyeS0+QWRkcls1XSk7CisJCQlwcmludGsoIiUtNGQiLCAoaW50KXBFbnRyeS0+QWlkKTsKKwkJCXByaW50aygiJS00ZCIsIChpbnQpcEVudHJ5LT5hcGlkeCk7CisJCQlwcmludGsoIiUtNGQiLCAoaW50KXBFbnRyeS0+UHNNb2RlKTsKKwkJCXByaW50aygiJS00ZCIsIChpbnQpQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSkpOworCQkJcHJpbnRrKCIlLTdkIiwgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kwKTsKKwkJCXByaW50aygiJS03ZCIsIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMSk7CisJCQlwcmludGsoIiUtN2QiLCBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTIpOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJcHJpbnRrKCIlLThkIiwgKGludClwRW50cnktPk1tcHNNb2RlKTsKKwkJCXByaW50aygiJS0xMHMiLCBHZXRQaHlNb2RlKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUpKTsKKwkJCXByaW50aygiJS02cyIsIEdldEJXKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLkJXKSk7CisJCQlwcmludGsoIiUtNmQiLCBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MpOworCQkJcHJpbnRrKCIlLTZkIiwgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSk7CisJCQlwcmludGsoIiUtNmQiLCBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TVEJDKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCXByaW50aygiJS0xMGQsICVkLCAlZCUlXG4iLCBwRW50cnktPkRlYnVnRklGT0NvdW50LCBwRW50cnktPkRlYnVnVHhDb3VudCwKKwkJCQkJCShwRW50cnktPkRlYnVnVHhDb3VudCkgPyAoKHBFbnRyeS0+RGVidWdUeENvdW50LXBFbnRyeS0+RGVidWdGSUZPQ291bnQpKjEwMC9wRW50cnktPkRlYnVnVHhDb3VudCkgOiAwKTsKKwkJCXByaW50aygiXG4iKTsKKworCQl9CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVAlTZXRfRGxzQWRkRW50cnlfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisgICAgVUNIQVIJbWFjW01BQ19BRERSX0xFTl07CisJVVNIT1JUCVRpbWVvdXQ7CisJY2hhciAqdG9rZW4sIHNlcFZhbHVlW10gPSAiOiIsIERBU0ggPSAnLSc7CisJSU5UIGk7CisgICAgUlRfODAyXzExX0RMUwlEbHM7CisKKyAgICBpZihzdHJsZW4oYXJnKSA8IDE5KSAgLy9NYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcgcGx1cyB0aGUgIi0iIGFuZCB0aW1lb3V0IHZhbHVlIGluIGRlY2ltYWwgZm9ybWF0LgorCQlyZXR1cm4gRkFMU0U7CisKKwl0b2tlbiA9IHN0cmNocihhcmcsIERBU0gpOworCWlmICgodG9rZW4gIT0gTlVMTCkgJiYgKHN0cmxlbih0b2tlbik+MSkpCisJeworCQlUaW1lb3V0ID0gc2ltcGxlX3N0cnRvbCgodG9rZW4rMSksIDAsIDEwKTsKKworCQkqdG9rZW4gPSAnXDAnOworCQlmb3IgKGkgPSAwLCB0b2tlbiA9IHJzdHJ0b2soYXJnLCAmc2VwVmFsdWVbMF0pOyB0b2tlbjsgdG9rZW4gPSByc3RydG9rKE5VTEwsICZzZXBWYWx1ZVswXSksIGkrKykKKwkJeworCQkJaWYoKHN0cmxlbih0b2tlbikgIT0gMikgfHwgKCFpc3hkaWdpdCgqdG9rZW4pKSB8fCAoIWlzeGRpZ2l0KCoodG9rZW4rMSkpKSkKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQlBdG9IKHRva2VuLCAoUFVDSEFSKSgmbWFjW2ldKSwgMSk7CisJCX0KKwkJaWYoaSAhPSA2KQorCQkJcmV0dXJuIEZBTFNFOworCisJICAgIHByaW50aygiXG4lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC0lZCIsIG1hY1swXSwgbWFjWzFdLAorCSAgICAgICAgICAgbWFjWzJdLCBtYWNbM10sIG1hY1s0XSwgbWFjWzVdLCAoaW50KVRpbWVvdXQpOworCisJCU5kaXNaZXJvTWVtb3J5KCZEbHMsIHNpemVvZihSVF84MDJfMTFfRExTKSk7CisJCURscy5UaW1lT3V0ID0gVGltZW91dDsKKwkJQ09QWV9NQUNfQUREUihEbHMuTWFjQWRkciwgbWFjKTsKKwkJRGxzLlZhbGlkID0gMTsKKworCQlNbG1lRW5xdWV1ZShwQWQsCisJCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJCQlSVF9PSURfODAyXzExX1NFVF9ETFNfUEFSQU0sCisJCQkJCXNpemVvZihSVF84MDJfMTFfRExTKSwKKwkJCQkJJkRscyk7CisKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJcmV0dXJuIEZBTFNFOworCit9CisKK0lOVAlTZXRfRGxzVGVhckRvd25FbnRyeV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlVQ0hBUgkJCW1hY0FkZHJbTUFDX0FERFJfTEVOXTsKKwlDSEFSCQkJKnZhbHVlOworCUlOVAkJCQlpOworCVJUXzgwMl8xMV9ETFMJRGxzOworCisJaWYoc3RybGVuKGFyZykgIT0gMTcpICAvL01hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNworCQlyZXR1cm4gRkFMU0U7CisKKwlmb3IgKGk9MCwgdmFsdWUgPSByc3RydG9rKGFyZywiOiIpOyB2YWx1ZTsgdmFsdWUgPSByc3RydG9rKE5VTEwsIjoiKSkKKwl7CisJCWlmKChzdHJsZW4odmFsdWUpICE9IDIpIHx8ICghaXN4ZGlnaXQoKnZhbHVlKSkgfHwgKCFpc3hkaWdpdCgqKHZhbHVlKzEpKSkgKQorCQkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkCisKKwkJQXRvSCh2YWx1ZSwgJm1hY0FkZHJbaSsrXSwgMik7CisJfQorCisJcHJpbnRrKCJcbiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiwgbWFjQWRkclswXSwgbWFjQWRkclsxXSwKKwkgICAgICAgICAgIG1hY0FkZHJbMl0sIG1hY0FkZHJbM10sIG1hY0FkZHJbNF0sIG1hY0FkZHJbNV0pOworCisJTmRpc1plcm9NZW1vcnkoJkRscywgc2l6ZW9mKFJUXzgwMl8xMV9ETFMpKTsKKwlDT1BZX01BQ19BRERSKERscy5NYWNBZGRyLCBtYWNBZGRyKTsKKwlEbHMuVmFsaWQgPSAwOworCisJTWxtZUVucXVldWUocEFkLAorCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJCVJUX09JRF84MDJfMTFfU0VUX0RMU19QQVJBTSwKKwkJCQlzaXplb2YoUlRfODAyXzExX0RMUyksCisJCQkJJkRscyk7CisKKwlyZXR1cm4gVFJVRTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvcnRtcF9kYXRhLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS9ydG1wX2RhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTQyZWNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvcnRtcF9kYXRhLmMKQEAgLTAsMCArMSwyNjE5IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXJ0bXBfZGF0YS5jCisKKwlBYnN0cmFjdDoKKwlEYXRhIHBhdGggc3Vicm91dGluZXMKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvIAkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSm9obgkJICAgICAgQXVnLzE3LzA0CQltYWpvciBtb2RpZmljYXRpb24gZm9yIFJUMjU2MS8yNjYxCisJSmFuIExlZQkgICAgICBNYXIvMTcvMDYJCW1ham9yIG1vZGlmaWNhdGlvbiBmb3IgUlQyODYwIE5ldyBSaW5nIERlc2lnbgorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworCitWT0lEIFNUQVJ4RUFQT0xGcmFtZUluZGljYXRlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAorCUlOCVJYX0JMSwkJCSpwUnhCbGssCisJSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3sKKwlQUlQyOFhYX1JYRF9TVFJVQwlwUnhEID0gJihwUnhCbGstPlJ4RCk7CisJUFJYV0lfU1RSVUMJCXBSeFdJID0gcFJ4QmxrLT5wUnhXSTsKKwlVQ0hBUgkJCSpwVG1wQnVmOworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApCisJeworCQkvLyBBbGwgRUFQb0wgZnJhbWVzIGhhdmUgdG8gcGFzcyB0byB1cHBlciBsYXllciAoZXguIFdQQV9TVVBQTElDQU5UIGRhZW1vbikKKwkJLy8gVEJEIDogcHJvY2VzcyBmcmFnbWVudGVkIEVBUG9sIGZyYW1lcworCQl7CisJCQkvLyBJbiA4MDIuMXggbW9kZSwgaWYgdGhlIHJlY2VpdmVkIGZyYW1lIGlzIEVBUC1TVUNDRVNTIHBhY2tldCwgdHVybiBvbiB0aGUgUG9ydFNlY3VyZWQgdmFyaWFibGUKKwkJCWlmICggcEFkLT5TdGFDZmcuSUVFRTgwMjFYID09IFRSVUUgJiYKKwkJCQkgKEVBUF9DT0RFX1NVQ0NFU1MgPT0gV3BhQ2hlY2tFYXBDb2RlKHBBZCwgcFJ4QmxrLT5wRGF0YSwgcFJ4QmxrLT5EYXRhU2l6ZSwgTEVOR1RIXzgwMl8xX0gpKSkKKwkJCXsKKwkJCQlQVUNIQVIJS2V5OworCQkJCVVDSEFSIAlDaXBoZXJBbGc7CisJCQkJaW50ICAgICBpZHggPSAwOworCisJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQLVNVQ0NFU1MgUGFja2V0XG4iKSk7CisJCQkJLy9wQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKKworICAgICAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5JRUVFODAyMXhfcmVxdWlyZWRfa2V5cyA9PSBGQUxTRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlkeCA9IHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleUlkOworICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGcgPSBwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbaWR4XS5DaXBoZXJBbGc7CisJCQkJCUtleSA9IHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtpZHhdLktleTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uS2V5TGVuID4gMCkKKyAgICAJCQkJeworI2lmZGVmIFJUMjg3MAorCQkJCQkJdW5pb24KKwkJCQkJCXsKKwkJCQkJCQljaGFyIGJ1ZltzaXplb2YoTkRJU184MDJfMTFfV0VQKStNQVhfTEVOX09GX0tFWS0gMV07CisJCQkJCQkJTkRJU184MDJfMTFfV0VQIGtleWluZm87CisJCQkJCQl9ICBXZXBLZXk7CisJCQkJCQlpbnQgbGVuOworCisKKwkJCQkJCU5kaXNaZXJvTWVtb3J5KCZXZXBLZXksIHNpemVvZihXZXBLZXkpKTsKKwkJCQkJCWxlbiA9cEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uS2V5TGVuOworCisJCQkJCQlOZGlzTW92ZU1lbW9yeShXZXBLZXkua2V5aW5mby5LZXlNYXRlcmlhbCwKKwkJCQkJCQlwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbaWR4XS5LZXksCisJCQkJCQkJcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uS2V5TGVuKTsKKworCQkJCQkJV2VwS2V5LmtleWluZm8uS2V5SW5kZXggPSAweDgwMDAwMDAwICsgaWR4OworCQkJCQkJV2VwS2V5LmtleWluZm8uS2V5TGVuZ3RoID0gbGVuOworCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlMZW4gPShVQ0hBUikgKGxlbiA8PSA1ID8gNSA6IDEzKTsKKworCQkJCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKwkJCQkJCXBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX1VQOworCQkJCQkJLy8gbmVlZCB0byBlbnF1ZXVlIGNtZCB0byB0aHJlYWQKKwkJCQkJCVJUVVNCRW5xdWV1ZUNtZEZyb21OZGlzKHBBZCwgT0lEXzgwMl8xMV9BRERfV0VQLCBUUlVFLCAmV2VwS2V5LCBzaXplb2YoV2VwS2V5LmtleWluZm8pICsgbGVuIC0gMSk7CisjZW5kaWYgLy8gUlQyODcwIC8vCisJCQkJCQkvLyBGb3IgUHJldmVudGluZyBTaGFyZEtleSBUYWJsZSBpcyBjbGVhcmVkIGJ5IHJlbW92ZSBrZXkgcHJvY2VkdXJlLgorICAgIAkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleUxlbiA9IHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtpZHhdLktleUxlbjsKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5LAorCQkJCQkJCQkJICAgcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uS2V5LAorCQkJCQkJCQkJICAgcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uS2V5TGVuKTsKKyAgICAJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJSW5kaWNhdGVfTGVnYWN5X1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCQkJcmV0dXJuOworCQl9CisJfQorCWVsc2UKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJeworCQkvLyBTcGVjaWFsIERBVEEgZnJhbWUgdGhhdCBoYXMgdG8gcGFzcyB0byBNTE1FCisJCS8vCSAxLiBDaXNjbyBBaXJvbmV0IGZyYW1lcyBmb3IgQ0NYMi4gV2UgbmVlZCBwYXNzIGl0IHRvIE1MTUUgZm9yIHNwZWNpYWwgcHJvY2VzcworCQkvLwkgMi4gRUFQT0wgaGFuZHNoYWtpbmcgZnJhbWVzIHdoZW4gZHJpdmVyIHN1cHBsaWNhbnQgZW5hYmxlZCwgcGFzcyB0byBNTE1FIGZvciBzcGVjaWFsIHByb2Nlc3MKKwkJeworCQkJcFRtcEJ1ZiA9IHBSeEJsay0+cERhdGEgLSBMRU5HVEhfODAyXzExOworCQkJTmRpc01vdmVNZW1vcnkocFRtcEJ1ZiwgcFJ4QmxrLT5wSGVhZGVyLCBMRU5HVEhfODAyXzExKTsKKwkJCVJFUE9SVF9NR01UX0ZSQU1FX1RPX01MTUUocEFkLCBwUnhXSS0+V2lyZWxlc3NDbGlJRCwgcFRtcEJ1ZiwgcFJ4QmxrLT5EYXRhU2l6ZSArIExFTkdUSF84MDJfMTEsIHBSeFdJLT5SU1NJMCwgcFJ4V0ktPlJTU0kxLCBwUnhXSS0+UlNTSTIsIHBSeEQtPlBsY3BTaWduYWwpOworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiEhISByZXBvcnQgRUFQT0wvQUlST05FVCBEQVRBIHRvIE1MTUUgKGxlbj0lZCkgISEhXG4iLCBwUnhCbGstPkRhdGFTaXplKSk7CisJCX0KKwl9CisKKwlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCXJldHVybjsKKworfQorCitWT0lEIFNUQVJ4RGF0YUZyYW1lQW5ub3VuY2UoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnksCisJSU4JUlhfQkxLCQkJKnBSeEJsaywKKwlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQoreworCisJLy8gbm9uLUVBUCBmcmFtZQorCWlmICghUlRNUENoZWNrV1BBZnJhbWUocEFkLCBwRW50cnksIHBSeEJsay0+cERhdGEsIHBSeEJsay0+RGF0YVNpemUsIEZyb21XaGljaEJTU0lEKSkKKwl7CisJCXsKKwkJCS8vIGRyb3AgYWxsIG5vbi1FQVAgREFUQSBmcmFtZSBiZWZvcmUKKwkJCS8vIHRoaXMgY2xpZW50J3MgUG9ydC1BY2Nlc3MtQ29udHJvbCBpcyBzZWN1cmVkCisJCQlpZiAocFJ4QmxrLT5wSGVhZGVyLT5GQy5XZXApCisJCQl7CisJCQkJLy8gdW5zdXBwb3J0ZWQgY2lwaGVyIHN1aXRlCisJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkKQorCQkJCXsKKwkJCQkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBlbmNyeXB0aW9uIGluLXVzZSBidXQgcmVjZWl2ZSBhIG5vbi1FQVBPTCBjbGVhciB0ZXh0IGZyYW1lLCBkcm9wIGl0CisJCQkJaWYgKChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCkgJiYKKwkJCQkJKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkpCisJCQkJeworCQkJCQkvLyByZWxlYXNlIHBhY2tldAorCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQl9CisJCVJYX0JMS19DTEVBUl9GTEFHKHBSeEJsaywgZlJYX0VBUCk7CisJCWlmICghUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BUkFMSU5LKSkKKwkJeworCQkJLy8gTm9ybWFsIGxlZ2FjeSwgQU1QRFUgb3IgQU1TRFUKKwkJCUNtbVJ4bm9uUmFsaW5rRnJhbWVJbmRpY2F0ZShwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBBUkFMSU5LCisJCQlDbW1SeFJhbGlua0ZyYW1lSW5kaWNhdGUocEFkLCBwRW50cnksIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCQl9CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCVJYX0JMS19DTEVBUl9GTEFHKHBSeEJsaywgZlJYX0RMUyk7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJfQorCWVsc2UKKwl7CisJCVJYX0JMS19TRVRfRkxBRyhwUnhCbGssIGZSWF9FQVApOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAoUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BTVBEVSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLmJEaXNhYmxlUmVvcmRlcmluZyA9PSAwKSkKKwkJeworCQkJSW5kaWNhdGVfQU1QRFVfUGFja2V0KHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQl7CisJCQkvLyBEZXRlcm1pbiB0aGUgZGVzdGluYXRpb24gb2YgdGhlIEVBUCBmcmFtZQorCQkJLy8gIHRvIFdQQSBzdGF0ZSBtYWNoaW5lIG9yIHVwcGVyIGxheWVyCisJCQlTVEFSeEVBUE9MRnJhbWVJbmRpY2F0ZShwQWQsIHBFbnRyeSwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJCX0KKwl9Cit9CisKKworLy8gRm9yIFRLSVAgZnJhbWUsIGNhbGN1bGF0ZSB0aGUgTUlDIHZhbHVlCitCT09MRUFOIFNUQUNoZWNrVGtpcE1JQ1ZhbHVlKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAorCUlOCVJYX0JMSwkJCSpwUnhCbGspCit7CisJUEhFQURFUl84MDJfMTEJcEhlYWRlciA9IHBSeEJsay0+cEhlYWRlcjsKKwlVQ0hBUgkJCSpwRGF0YSA9IHBSeEJsay0+cERhdGE7CisJVVNIT1JUCQkJRGF0YVNpemUgPSBwUnhCbGstPkRhdGFTaXplOworCVVDSEFSCQkJVXNlclByaW9yaXR5ID0gcFJ4QmxrLT5Vc2VyUHJpb3JpdHk7CisJUENJUEhFUl9LRVkJCXBXcGFLZXk7CisJVUNIQVIJCQkqcERBLCAqcFNBOworCisJcFdwYUtleSA9ICZwQWQtPlNoYXJlZEtleVtCU1MwXVtwUnhCbGstPnBSeFdJLT5LZXlJbmRleF07CisKKwlwREEgPSBwSGVhZGVyLT5BZGRyMTsKKwlpZiAoUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9JTkZSQSkpCisJeworCQlwU0EgPSBwSGVhZGVyLT5BZGRyMzsKKwl9CisJZWxzZQorCXsKKwkJcFNBID0gcEhlYWRlci0+QWRkcjI7CisJfQorCisJaWYgKFJUTVBUa2lwQ29tcGFyZU1JQ1ZhbHVlKHBBZCwKKwkJCQkJCQkJcERhdGEsCisJCQkJCQkJCXBEQSwKKwkJCQkJCQkJcFNBLAorCQkJCQkJCQlwV3BhS2V5LT5SeE1pYywKKwkJCQkJCQkJVXNlclByaW9yaXR5LAorCQkJCQkJCQlEYXRhU2l6ZSkgPT0gRkFMU0UpCisJeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJSeCBNSUMgVmFsdWUgZXJyb3IgMlxuIikpOworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKQorCQl7CisJCQlXcGFTZW5kTWljRmFpbHVyZVRvV3BhU3VwcGxpY2FudChwQWQsIChwV3BhS2V5LT5UeXBlID09IFBBSVJXSVNFS0VZKSA/IFRSVUUgOiBGQUxTRSk7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKwkJeworCQkJUlRNUFJlcG9ydE1pY0Vycm9yKHBBZCwgcFdwYUtleSk7CisJCX0KKworCQkvLyByZWxlYXNlIHBhY2tldAorCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKKworLy8KKy8vIEFsbCBSeCByb3V0aW5lcyB1c2UgUlhfQkxLIHN0cnVjdHVyZSB0byBoYW5kZSByeCBldmVudHMKKy8vIEl0IGlzIHZlcnkgaW1wb3J0YW50IHRvIGJ1aWxkIHBSeEJsayBhdHRyaWJ1dGVzCisvLyAgMS4gcEhlYWRlciBwb2ludGVyIHRvIDgwMi4xMSBIZWFkZXIKKy8vICAyLiBwRGF0YSBwb2ludGVyIHRvIHBheWxvYWQgaW5jbHVkaW5nIExMQyAoanVzdCBza2lwIEhlYWRlcikKKy8vICAzLiBzZXQgcGF5bG9hZCBzaXplIGluY2x1ZGluZyBMTEMgdG8gRGF0YVNpemUKKy8vICA0LiBzZXQgc29tZSBmbGFncyB3aXRoIFJYX0JMS19TRVRfRkxBRygpCisvLworVk9JRCBTVEFIYW5kbGVSeERhdGFGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrKQoreworCVBSVDI4WFhfUlhEX1NUUlVDCQkJCXBSeEQgPSAmKHBSeEJsay0+UnhEKTsKKwlQUlhXSV9TVFJVQwkJCQkJCXBSeFdJID0gcFJ4QmxrLT5wUnhXSTsKKwlQSEVBREVSXzgwMl8xMQkJCQkJcEhlYWRlciA9IHBSeEJsay0+cEhlYWRlcjsKKwlQTkRJU19QQUNLRVQJCQkJCXBSeFBhY2tldCA9IHBSeEJsay0+cFJ4UGFja2V0OworCUJPT0xFQU4gCQkJCQkJYkZyYWdtZW50ID0gRkFMU0U7CisJTUFDX1RBQkxFX0VOVFJZCSAgICAJCQkqcEVudHJ5ID0gTlVMTDsKKwlVQ0hBUgkJCQkJCQlGcm9tV2hpY2hCU1NJRCA9IEJTUzA7CisJVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyUHJpb3JpdHkgPSAwOworCisJeworCQkvLyBiZWZvcmUgTElOSyBVUCwgYWxsIERBVEEgZnJhbWVzIGFyZSByZWplY3RlZAorCQlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwkJeworCQkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJcmV0dXJuOworCQl9CisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJLy9pZiAoKHBIZWFkZXItPkZDLkZyRHMgPT0gMCkgJiYgKHBIZWFkZXItPkZDLlRvRHMgPT0gMCkpCisJCWlmIChSVE1QUmN2RnJhbWVETFNDaGVjayhwQWQsIHBIZWFkZXIsIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQsIHBSeEQpKQorCQl7CisJCQlyZXR1cm47CisJCX0KKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCQkvLyBEcm9wIG5vdCBteSBCU1MgZnJhbWVzCisJCWlmIChwUnhELT5NeUJzcyA9PSAwKQorCQl7CisJCQl7CisJCQkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlJ4Q291bnRTaW5jZUxhc3ROVUxMKys7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgJiYgcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iQVBTRENhcGFibGUgJiYgKHBIZWFkZXItPkZDLlN1YlR5cGUgJiAweDA4KSkKKwkJeworCQkJVUNIQVIgKnBEYXRhOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJiQVBTRENhcGFibGVcbiIpKTsKKworCQkJLy8gUW9zIGJpdCA0CisJCQlwRGF0YSA9IChQVUNIQVIpcEhlYWRlciArIExFTkdUSF84MDJfMTE7CisJCQlpZiAoKCpwRGF0YSA+PiA0KSAmIDB4MDEpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSeERvbmUtIFJjdiBFT1NQIGZyYW1lLCBkcml2ZXIgbWF5IGZhbGwgaW50byBzbGVlcFxuIikpOworCQkJCXBBZC0+Q29tbW9uQ2ZnLmJJblNlcnZpY2VQZXJpb2QgPSBGQUxTRTsKKworCQkJCS8vIEZvcmNlIGRyaXZlciB0byBmYWxsIGludG8gc2xlZXAgbW9kZSB3aGVuIHJjdiBFT1NQIGZyYW1lCisJCQkJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQorCQkJCXsKKwkJCQkJVVNIT1JUICBUYnR0TnVtVG9OZXh0V2FrZVVwOworCQkJCQlVU0hPUlQgIE5leHREdGltID0gcEFkLT5TdGFDZmcuRHRpbVBlcmlvZDsKKwkJCQkJVUxPTkcgICBOb3c7CisKKwkJCQkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKKwkJCQkJTmV4dER0aW0gLT0gKFVTSE9SVCkoTm93IC0gcEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSkvcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kOworCisJCQkJCVRidHROdW1Ub05leHRXYWtlVXAgPSBwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQ7CisJCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSkgJiYgKFRidHROdW1Ub05leHRXYWtlVXAgPiBOZXh0RHRpbSkpCisJCQkJCQlUYnR0TnVtVG9OZXh0V2FrZVVwID0gTmV4dER0aW07CisKKwkJCQkJTWxtZVNldFBzbUJpdChwQWQsIFBXUl9TQVZFKTsKKwkJCQkJLy8gaWYgV01NLUFQU0QgaXMgZmFpbGVkLCB0cnkgdG8gZGlzYWJsZSBmb2xsb3dpbmcgbGluZQorCQkJCQlBc2ljU2xlZXBUaGVuQXV0b1dha2V1cChwQWQsIFRidHROdW1Ub05leHRXYWtlVXApOworCQkJCX0KKwkJCX0KKworCQkJaWYgKChwSGVhZGVyLT5GQy5Nb3JlRGF0YSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLmJJblNlcnZpY2VQZXJpb2QpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU2VuZGluZyBhbm90aGVyIHRyaWdnZXIgZnJhbWUgd2hlbiBNb3JlIERhdGEgYml0IGlzIHNldCB0byAxXG4iKSk7CisJCQl9CisJCX0KKworCQkvLyBEcm9wIE5VTEwsIENGLUFDSyhubyBkYXRhKSwgQ0YtUE9MTChubyBkYXRhKSwgYW5kIENGLUFDSytDRi1QT0xMKG5vIGRhdGEpIGRhdGEgZnJhbWUKKwkJaWYgKChwSGVhZGVyLT5GQy5TdWJUeXBlICYgMHgwNCkpIC8vIGJpdCAyIDogbm8gREFUQQorCQl7CisJCQkvLyByZWxlYXNlIHBhY2tldAorCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQlyZXR1cm47CisJCX0KKworCSAgICAvLyBEcm9wIG5vdCBteSBCU1MgZnJhbWUgKHdlIGNhbiBub3Qgb25seSBjaGVjayB0aGUgTXlCc3MgYml0IGluIFJ4RCkKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkgICAgaWYgKCFwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKKwkgICAgeworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQlpZiAoSU5GUkFfT04ocEFkKSkKKwkJeworCQkJLy8gSW5mcmFzdHJ1Y3R1cmUgbW9kZSwgY2hlY2sgYWRkcmVzcyAyIGZvciBCU1NJRAorCQkJaWYgKCFSVE1QRXF1YWxNZW1vcnkoJnBIZWFkZXItPkFkZHIyLCAmcEFkLT5Db21tb25DZmcuQnNzaWQsIDYpKQorCQkJeworCQkJCS8vIFJlY2VpdmUgZnJhbWUgbm90IG15IEJTU0lECisJICAgICAgICAgICAgLy8gcmVsZWFzZSBwYWNrZXQKKwkgICAgICAgICAgICBSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJZWxzZQkvLyBBZC1Ib2MgbW9kZSBvciBOb3QgYXNzb2NpYXRlZAorCQl7CisJCQkvLyBBZC1Ib2MgbW9kZSwgY2hlY2sgYWRkcmVzcyAzIGZvciBCU1NJRAorCQkJaWYgKCFSVE1QRXF1YWxNZW1vcnkoJnBIZWFkZXItPkFkZHIzLCAmcEFkLT5Db21tb25DZmcuQnNzaWQsIDYpKQorCQkJeworCQkJCS8vIFJlY2VpdmUgZnJhbWUgbm90IG15IEJTU0lECisJICAgICAgICAgICAgLy8gcmVsZWFzZSBwYWNrZXQKKwkgICAgICAgICAgICBSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkgICAgfQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisJCS8vCisJCS8vIGZpbmQgcEVudHJ5CisJCS8vCisJCWlmIChwUnhXSS0+V2lyZWxlc3NDbGlJRCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCQl7CisJCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtwUnhXSS0+V2lyZWxlc3NDbGlJRF07CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyAxLiByZWxlYXNlIHBhY2tldCBpZiBpbmZyYSBtb2RlCisJCQkvLyAyLiBuZXcgYSBwRW50cnkgaWYgYWQtaG9jIG1vZGUKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gaW5mcmEgb3IgYWQtaG9jCisJCWlmIChJTkZSQV9PTihwQWQpKQorCQl7CisJCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfSU5GUkEpOworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkJaWYgKChwSGVhZGVyLT5GQy5GckRzID09IDApICYmIChwSGVhZGVyLT5GQy5Ub0RzID09IDApKQorCQkJCVJYX0JMS19TRVRfRkxBRyhwUnhCbGssIGZSWF9ETFMpOworCQkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQkJQVNTRVJUKHBSeFdJLT5XaXJlbGVzc0NsaUlEID09IEJTU0lEX1dDSUQpOworCQl9CisKKwkJLy8gY2hlY2sgQXRoZXJvcyBDbGllbnQKKwkJaWYgKChwRW50cnktPmJJQW1CYWRBdGhlcm9zID09IEZBTFNFKSAmJiAgKHBSeEQtPkFNUERVID09IDEpICYmIChwSGVhZGVyLT5GQy5SZXRyeSApKQorCQl7CisJCQlwRW50cnktPmJJQW1CYWRBdGhlcm9zID0gVFJVRTsKKwkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYkN1cnJlbnRBdGhlcm9zID0gVFJVRTsKKwkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYkxhc3RBdGhlcm9zID0gVFJVRTsKKwkJCWlmICghU1RBX0FFU19PTihwQWQpKQorCQkJeworCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgOCwgQUxMTl9TRVRQUk9URUNULCBUUlVFLCBGQUxTRSk7CisJCQl9CisJCX0KKwl9CisKKwlwUnhCbGstPnBEYXRhID0gKFVDSEFSICopcEhlYWRlcjsKKworCS8vCisJLy8gdXBkYXRlIFJ4QmxrLT5wRGF0YSwgRGF0YVNpemUKKwkvLyA4MDIuMTEgSGVhZGVyLCBRT1MsIEhUQywgSHcgUGFkZGluZworCS8vCisKKwkvLyAxLiBza2lwIDgwMi4xMSBIRUFERVIKKwl7CisJCXBSeEJsay0+cERhdGEgKz0gTEVOR1RIXzgwMl8xMTsKKwkJcFJ4QmxrLT5EYXRhU2l6ZSAtPSBMRU5HVEhfODAyXzExOworCX0KKworCS8vIDIuIFFPUworCWlmIChwSGVhZGVyLT5GQy5TdWJUeXBlICYgMHgwOCkKKwl7CisJCVJYX0JMS19TRVRfRkxBRyhwUnhCbGssIGZSWF9RT1MpOworCQlVc2VyUHJpb3JpdHkgPSAqKHBSeEJsay0+cERhdGEpICYgMHgwZjsKKwkJLy8gYml0IDcgaW4gUW9TIENvbnRyb2wgZmllbGQgc2lnbmFscyB0aGUgSFQgQS1NU0RVIGZvcm1hdAorCQlpZiAoKCpwUnhCbGstPnBEYXRhKSAmIDB4ODApCisJCXsKKwkJCVJYX0JMS19TRVRfRkxBRyhwUnhCbGssIGZSWF9BTVNEVSk7CisJCX0KKworCQkvLyBza2lwIFFPUyBjb250b3JsIGZpZWxkCisJCXBSeEJsay0+cERhdGEgKz0gMjsKKwkJcFJ4QmxrLT5EYXRhU2l6ZSAtPTI7CisJfQorCXBSeEJsay0+VXNlclByaW9yaXR5ID0gVXNlclByaW9yaXR5OworCisJLy8gMy4gT3JkZXIgYml0OiBBLVJhbGluayBvciBIVEMrCisJaWYgKHBIZWFkZXItPkZDLk9yZGVyKQorCXsKKyNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCisJCWlmICgocFJ4V0ktPlBIWU1PREUgPD0gTU9ERV9PRkRNKSAmJiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQpKSkKKwkJeworCQkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX0FSQUxJTkspOworCQl9CisJCWVsc2UKKyNlbmRpZgorCQl7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfSFRDKTsKKwkJCS8vIHNraXAgSFRDIGNvbnRvcmwgZmllbGQKKwkJCXBSeEJsay0+cERhdGEgKz0gNDsKKwkJCXBSeEJsay0+RGF0YVNpemUgLT0gNDsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJfQorCX0KKworCS8vIDQuIHNraXAgSFcgcGFkZGluZworCWlmIChwUnhELT5MMlBBRCkKKwl7CisJCS8vIGp1c3QgbW92ZSBwRGF0YSBwb2ludGVyCisJCS8vIGJlY2F1c2UgRGF0YVNpemUgZXhjbHVkaW5nIEhXIHBhZGRpbmcKKwkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX1BBRCk7CisJCXBSeEJsay0+cERhdGEgKz0gMjsKKwl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlpZiAocFJ4RC0+QkEpCisJeworCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfQU1QRFUpOworCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCisJLy8KKwkvLyBDYXNlIEkgIFByb2Nlc3MgQnJvYWRjYXN0ICYgTXVsdGljYXN0IGRhdGEgZnJhbWUKKwkvLworCWlmIChwUnhELT5CY2FzdCB8fCBwUnhELT5NY2FzdCkKKwl7CisJCUlOQ19DT1VOVEVSNjQocEFkLT5XbGFuQ291bnRlcnMuTXVsdGljYXN0UmVjZWl2ZWRGcmFtZUNvdW50KTsKKworCQkvLyBEcm9wIE1jYXN0L0JjYXN0IGZyYW1lIHdpdGggZnJhZ21lbnQgYml0IG9uCisJCWlmIChwSGVhZGVyLT5GQy5Nb3JlRnJhZykKKwkJeworCQkJLy8gcmVsZWFzZSBwYWNrZXQKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJcmV0dXJuOworCQl9CisKKwkJLy8gRmlsdGVyIG91dCBCY2FzdCBmcmFtZSB3aGljaCBBUCByZWxheWVkIGZvciB1cworCQlpZiAocEhlYWRlci0+RkMuRnJEcyAmJiBNQUNfQUREUl9FUVVBTChwSGVhZGVyLT5BZGRyMywgcEFkLT5DdXJyZW50QWRkcmVzcykpCisJCXsKKwkJCS8vIHJlbGVhc2UgcGFja2V0CisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCXJldHVybjsKKwkJfQorCisJCUluZGljYXRlX0xlZ2FjeV9QYWNrZXQocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwkJcmV0dXJuOworCX0KKwllbHNlIGlmIChwUnhELT5VMk0pCisJeworCQlwQWQtPkxhc3RSeFJhdGUgPSAoVVNIT1JUKSgocFJ4V0ktPk1DUykgKyAocFJ4V0ktPkJXIDw8NykgKyAocFJ4V0ktPlNob3J0R0kgPDw4KSsgKHBSeFdJLT5QSFlNT0RFIDw8MTQpKSA7CisKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorICAgICAgICBpZiAoUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9ETFMpKQorCQl7CisJCQlNQUNfVEFCTEVfRU5UUlkgKnBEbHNFbnRyeSA9IE5VTEw7CisKKwkJCXBEbHNFbnRyeSA9IERsc0VudHJ5VGFibGVMb29rdXBCeVdjaWQocEFkLCBwUnhXSS0+V2lyZWxlc3NDbGlJRCwgcEhlYWRlci0+QWRkcjIsIFRSVUUpOworCQkJCQkJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBEbHNFbnRyeSkKKwkJCVVwZGF0ZV9Sc3NpX1NhbXBsZShwQWQsICZwRGxzRW50cnktPlJzc2lTYW1wbGUsIHBSeFdJKTsKKwkJfQorCQllbHNlCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCWlmIChBREhPQ19PTihwQWQpKQorCQl7CisJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIHBIZWFkZXItPkFkZHIyKTsKKwkJCWlmIChwRW50cnkpCisJCQkJVXBkYXRlX1Jzc2lfU2FtcGxlKHBBZCwgJnBFbnRyeS0+UnNzaVNhbXBsZSwgcFJ4V0kpOworCQl9CisKKworCQlVcGRhdGVfUnNzaV9TYW1wbGUocEFkLCAmcEFkLT5TdGFDZmcuUnNzaVNhbXBsZSwgcFJ4V0kpOworCisJCXBBZC0+U3RhQ2ZnLkxhc3RTTlIwID0gKFVDSEFSKShwUnhXSS0+U05SMCk7CisJCXBBZC0+U3RhQ2ZnLkxhc3RTTlIxID0gKFVDSEFSKShwUnhXSS0+U05SMSk7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeE9rRGF0YUNudCsrOworCisKKyAgICAJaWYgKCEoKHBIZWFkZXItPkZyYWcgPT0gMCkgJiYgKHBIZWFkZXItPkZDLk1vcmVGcmFnID09IDApKSkKKyAgICAJeworICAgIAkJLy8gcmUtYXNzZW1ibGUgdGhlIGZyYWdtZW50ZWQgcGFja2V0cworICAgIAkJLy8gcmV0dXJuIGNvbXBsZXRlIGZyYW1lIChwUnhQYWNrZXQpIG9yIE5VTEwKKyAgICAJCWJGcmFnbWVudCA9IFRSVUU7CisgICAgCQlwUnhQYWNrZXQgPSBSVE1QRGVGcmFnbWVudERhdGFGcmFtZShwQWQsIHBSeEJsayk7CisgICAgCX0KKworICAgIAlpZiAocFJ4UGFja2V0KQorICAgIAl7CisJCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtwUnhXSS0+V2lyZWxlc3NDbGlJRF07CisKKyAgICAJCS8vIHByb2Nlc3MgY29tcGxldGUgZnJhbWUKKyAgICAJCWlmIChiRnJhZ21lbnQgJiYgKHBSeEQtPkRlY3J5cHRlZCkgJiYgKHBFbnRyeS0+V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpKQorICAgIAkJeworCQkJCS8vIE1pbnVzIE1JQyBsZW5ndGgKKwkJCQlwUnhCbGstPkRhdGFTaXplIC09IDg7CisKKyAgICAJCQkvLyBGb3IgVEtJUCBmcmFtZSwgY2FsY3VsYXRlIHRoZSBNSUMgdmFsdWUKKyAgICAJCQlpZiAoU1RBQ2hlY2tUa2lwTUlDVmFsdWUocEFkLCBwRW50cnksIHBSeEJsaykgPT0gRkFMU0UpCisgICAgCQkJeworICAgIAkJCQlyZXR1cm47CisgICAgCQkJfQorICAgIAkJfQorCisgICAgCQlTVEFSeERhdGFGcmFtZUFubm91bmNlKHBBZCwgcEVudHJ5LCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwkJCXJldHVybjsKKyAgICAJfQorICAgIAllbHNlCisgICAgCXsKKyAgICAJCS8vIGp1c3QgcmV0dXJuCisgICAgCQkvLyBiZWNhdXNlIFJUTVBEZUZyYWdtZW50RGF0YUZyYW1lKCkgd2lsbCByZWxlYXNlIHJ4IHBhY2tldCwKKyAgICAJCS8vIGlmIHBhY2tldCBpcyBmcmFnbWVudGVkCisgICAgCQlyZXR1cm47CisgICAgCX0KKwl9CisKKwlBU1NFUlQoMCk7CisJLy8gcmVsZWFzZSBwYWNrZXQKKwlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKK30KKworVk9JRCBTVEFIYW5kbGVSeE1nbXRGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrKQoreworCVBSVDI4WFhfUlhEX1NUUlVDCXBSeEQgPSAmKHBSeEJsay0+UnhEKTsKKwlQUlhXSV9TVFJVQwkJcFJ4V0kgPSBwUnhCbGstPnBSeFdJOworCVBIRUFERVJfODAyXzExCXBIZWFkZXIgPSBwUnhCbGstPnBIZWFkZXI7CisJUE5ESVNfUEFDS0VUCXBSeFBhY2tldCA9IHBSeEJsay0+cFJ4UGFja2V0OworCisJZG8KKwl7CisKKwkJLy8gV2Ugc2hvdWxkIGNvbGxlY3QgUlNTSSBub3Qgb25seSBVMk0gZGF0YSBidXQgYWxzbyBteSBiZWFjb24KKwkJaWYgKChwSGVhZGVyLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfQkVBQ09OKSAmJiAoTUFDX0FERFJfRVFVQUwoJnBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCAmcEhlYWRlci0+QWRkcjIpKSkKKwkJeworCQkJVXBkYXRlX1Jzc2lfU2FtcGxlKHBBZCwgJnBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUsIHBSeFdJKTsKKworCQkJcEFkLT5TdGFDZmcuTGFzdFNOUjAgPSAoVUNIQVIpKHBSeFdJLT5TTlIwKTsKKwkJCXBBZC0+U3RhQ2ZnLkxhc3RTTlIxID0gKFVDSEFSKShwUnhXSS0+U05SMSk7CisJCX0KKworCQkvLyBGaXJzdCBjaGVjayB0aGUgc2l6ZSwgaXQgTVVTVCBub3QgZXhjZWVkIHRoZSBtbG1lIHF1ZXVlIHNpemUKKwkJaWYgKHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPiBNR01UX0RNQV9CVUZGRVJfU0laRSkKKwkJeworCQkJREJHUFJJTlRfRVJSKCgiU1RBSGFuZGxlUnhNZ210RnJhbWU6IGZyYW1lIHRvbyBsYXJnZSwgc2l6ZSA9ICVkIFxuIiwgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCkpOworCQkJYnJlYWs7CisJCX0KKworCQlSRVBPUlRfTUdNVF9GUkFNRV9UT19NTE1FKHBBZCwgcFJ4V0ktPldpcmVsZXNzQ2xpSUQsIHBIZWFkZXIsIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQsCisJCQkJCQkJCQlwUnhXSS0+UlNTSTAsIHBSeFdJLT5SU1NJMSwgcFJ4V0ktPlJTU0kyLCBwUnhELT5QbGNwU2lnbmFsKTsKKwl9IHdoaWxlIChGQUxTRSk7CisKKwlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKK30KKworVk9JRCBTVEFIYW5kbGVSeENvbnRyb2xGcmFtZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglSWF9CTEsJCQkqcFJ4QmxrKQoreworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCVBSWFdJX1NUUlVDCQlwUnhXSSA9IHBSeEJsay0+cFJ4V0k7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJUEhFQURFUl84MDJfMTEJcEhlYWRlciA9IHBSeEJsay0+cEhlYWRlcjsKKwlQTkRJU19QQUNLRVQJcFJ4UGFja2V0ID0gcFJ4QmxrLT5wUnhQYWNrZXQ7CisKKwlzd2l0Y2ggKHBIZWFkZXItPkZDLlN1YlR5cGUpCisJeworCQljYXNlIFNVQlRZUEVfQkxPQ0tfQUNLX1JFUToKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCXsKKwkJCQlDbnRsRW5xdWV1ZUZvclJlY3YocEFkLCBwUnhXSS0+V2lyZWxlc3NDbGlJRCwgKHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQpLCAoUEZSQU1FX0JBX1JFUSlwSGVhZGVyKTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQljYXNlIFNVQlRZUEVfQkxPQ0tfQUNLOgorCQljYXNlIFNVQlRZUEVfQUNLOgorCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Cit9CisKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVByb2Nlc3MgUnhEb25lIGludGVycnVwdCwgcnVubmluZyBpbiBEUEMgbGV2ZWwKKworCUFyZ3VtZW50czoKKwkJcEFkIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCQlUaGlzIHJvdXRpbmUgaGFzIHRvIG1haW50YWluIFJ4IHJpbmcgcmVhZCBwb2ludGVyLgorCQlOZWVkIHRvIGNvbnNpZGVyIFFPUyBEQVRBIGZvcm1hdCB3aGVuIGNvbnZlcnRpbmcgdG8gODAyLjMKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOIFNUQVJ4RG9uZUludGVycnVwdEhhbmRsZSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglCT09MRUFOCQkJYXJnYykKK3sKKwlORElTX1NUQVRVUwkJCVN0YXR1czsKKwlVSU5UMzIJCQlSeFByb2Nlc3NlZCwgUnhQZW5kaW5nOworCUJPT0xFQU4JCQliUmVzY2hlZHVsZSA9IEZBTFNFOworCVJUMjhYWF9SWERfU1RSVUMJKnBSeEQ7CisJVUNIQVIJCQkqcERhdGE7CisJUFJYV0lfU1RSVUMJCXBSeFdJOworCVBORElTX1BBQ0tFVAlwUnhQYWNrZXQ7CisJUEhFQURFUl84MDJfMTEJcEhlYWRlcjsKKwlSWF9CTEsJCQlSeENlbGw7CisKKwlSeFByb2Nlc3NlZCA9IFJ4UGVuZGluZyA9IDA7CisKKwkvLyBwcm9jZXNzIHdob2xlIHJ4IHJpbmcKKwl3aGlsZSAoMSkKKwl7CisKKwkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSB8fAorCQkJIVJUTVBfVEVTVF9GTEFHKHBBZCxmUlRNUF9BREFQVEVSX1NUQVJUX1VQKSkKKwkJeworCQkJYnJlYWs7CisJCX0KKworCisJCVJ4UHJvY2Vzc2VkICsrOyAvLyB0ZXN0CisKKwkJLy8gMS4gYWxsb2NhdGUgYSBuZXcgZGF0YSBwYWNrZXQgaW50byByeCByaW5nIHRvIHJlcGxhY2UgcmVjZWl2ZWQgcGFja2V0CisJCS8vICAgIHRoZW4gcHJvY2Vzc2luZyB0aGUgcmVjZWl2ZWQgcGFja2V0CisJCS8vIDIuIHRoZSBjYWxsZWUgbXVzdCB0YWtlIGNoYXJnZSBvZiByZWxlYXNlIG9mIHBhY2tldAorCQkvLyAzLiBBcyBmYXIgYXMgZHJpdmVyIGlzIGNvbmNlcm5lZCAsCisJCS8vICAgIHRoZSByeCBwYWNrZXQgbXVzdAorCQkvLyAgICAgIGEuIGJlIGluZGljYXRlZCB0byB1cHBlciBsYXllciBvcgorCQkvLyAgICAgIGIuIGJlIHJlbGVhc2VkIGlmIGl0IGlzIGRpc2NhcmRlZAorCQlwUnhQYWNrZXQgPSBHZXRQYWNrZXRGcm9tUnhSaW5nKHBBZCwgJihSeENlbGwuUnhEKSwgJmJSZXNjaGVkdWxlLCAmUnhQZW5kaW5nKTsKKwkJaWYgKHBSeFBhY2tldCA9PSBOVUxMKQorCQl7CisJCQkvLyBubyBtb3JlIHBhY2tldCB0byBwcm9jZXNzCisJCQlicmVhazsKKwkJfQorCisJCS8vIGdldCByeCByaW5nIGRlc2NyaXB0b3IKKwkJcFJ4RCA9ICYoUnhDZWxsLlJ4RCk7CisJCS8vIGdldCByeCBkYXRhIGJ1ZmZlcgorCQlwRGF0YQk9IEdFVF9PU19QS1RfREFUQVBUUihwUnhQYWNrZXQpOworCQlwUnhXSQk9IChQUlhXSV9TVFJVQykgcERhdGE7CisJCXBIZWFkZXIgPSAoUEhFQURFUl84MDJfMTEpIChwRGF0YStSWFdJX1NJWkUpIDsKKworI2lmZGVmIFJUX0JJR19FTkRJQU4KKwkgICAgUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUilwSGVhZGVyLCBESVJfUkVBRCwgVFJVRSk7CisJCVJUTVBXSUVuZGlhbkNoYW5nZSgoUFVDSEFSKXBSeFdJLCBUWVBFX1JYV0kpOworI2VuZGlmCisKKwkJLy8gYnVpbGQgUnhDZWxsCisJCVJ4Q2VsbC5wUnhXSSA9IHBSeFdJOworCQlSeENlbGwucEhlYWRlciA9IHBIZWFkZXI7CisJCVJ4Q2VsbC5wUnhQYWNrZXQgPSBwUnhQYWNrZXQ7CisJCVJ4Q2VsbC5wRGF0YSA9IChVQ0hBUiAqKSBwSGVhZGVyOworCQlSeENlbGwuRGF0YVNpemUgPSBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50OworCQlSeENlbGwuRmxhZ3MgPSAwOworCisJCS8vIEluY3JlYXNlIFRvdGFsIHJlY2VpdmUgYnl0ZSBjb3VudGVyIGFmdGVyIHJlYWwgZGF0YSByZWNlaXZlZCBubyBtYXRlciBhbnkgZXJyb3Igb3Igbm90CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuUmVjZWl2ZWRCeXRlQ291bnQgKz0gIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQ7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuUnhDb3VudCArKzsKKworCQlJTkNfQ09VTlRFUjY0KHBBZC0+V2xhbkNvdW50ZXJzLlJlY2VpdmVkRnJhZ21lbnRDb3VudCk7CisKKwkJaWYgKHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPCAxNCkKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisKKyAgICAgICAgaWYgKE1PTklUT1JfT04ocEFkKSkKKwkJeworICAgICAgICAgICAgc2VuZF9tb25pdG9yX3BhY2tldHMocEFkLCAmUnhDZWxsKTsKKwkJCWJyZWFrOworCQl9CisJCS8qIFJUMjg3MCBpbnZva2VzIFNUQVJ4RG9uZUludGVycnVwdEhhbmRsZSgpIGluIHJ0dXNiX2J1bGsuYyAqLworI2lmZGVmIFJBTElOS19BVEUKKwkJaWYgKEFURV9PTihwQWQpKQorCQl7CisJCQlwQWQtPmF0ZS5SeENudFBlclNlYysrOworCQkJQVRFU2FtcGxlUnNzaShwQWQsIHBSeFdJKTsKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCQkJaWYgKHBBZC0+YXRlLmJRQVJ4U3RhcnQgPT0gVFJVRSkKKwkJCXsKKwkJCQkvKiAoKnBSeEQpIGhhcyBiZWVuIHN3YXBwZWQgaW4gR2V0UGFja2V0RnJvbVJ4UmluZygpICovCisJCQkJQVRFX1FBX1N0YXRpc3RpY3MocEFkLCBwUnhXSSwgcFJ4RCwJcEhlYWRlcik7CisJCQl9CisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkJY29udGludWU7CisJCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKwkJLy8gQ2hlY2sgZm9yIGFsbCBSeEQgZXJyb3JzCisJCVN0YXR1cyA9IFJUTVBDaGVja1J4RXJyb3IocEFkLCBwSGVhZGVyLCBwUnhXSSwgcFJ4RCk7CisKKwkJLy8gSGFuZGxlIHRoZSByZWNlaXZlZCBmcmFtZQorCQlpZiAoU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCXsKKwkJCXN3aXRjaCAocEhlYWRlci0+RkMuVHlwZSkKKwkJCXsKKwkJCQkvLyBDQVNFIEksIHJlY2VpdmUgYSBEQVRBIGZyYW1lCisJCQkJY2FzZSBCVFlQRV9EQVRBOgorCQkJCXsKKwkJCQkJLy8gcHJvY2VzcyBEQVRBIGZyYW1lCisJCQkJCVNUQUhhbmRsZVJ4RGF0YUZyYW1lKHBBZCwgJlJ4Q2VsbCk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJCS8vIENBU0UgSUksIHJlY2VpdmUgYSBNR01UIGZyYW1lCisJCQkJY2FzZSBCVFlQRV9NR01UOgorCQkJCXsKKwkJCQkJU1RBSGFuZGxlUnhNZ210RnJhbWUocEFkLCAmUnhDZWxsKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQkJLy8gQ0FTRSBJSUkuIHJlY2VpdmUgYSBDTlRMIGZyYW1lCisJCQkJY2FzZSBCVFlQRV9DTlRMOgorCQkJCXsKKwkJCQkJU1RBSGFuZGxlUnhDb250cm9sRnJhbWUocEFkLCAmUnhDZWxsKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQkJLy8gZGlzY2FyZCBvdGhlciB0eXBlCisJCQkJZGVmYXVsdDoKKwkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJcEFkLT5Db3VudGVyczgwMjMuUnhFcnJvcnMrKzsKKwkJCS8vIGRpc2NhcmQgdGhpcyBmcmFtZQorCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCX0KKwl9CisKKwlyZXR1cm4gYlJlc2NoZWR1bGU7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCUFyZ3VtZW50czoKKwkJcEFkIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJUlRNUEhhbmRsZVR3YWtldXBJbnRlcnJ1cHQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgRkFMU0UpOworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIEVhcmx5IGNoZWNraW5nIGFuZCBPUy1kZXBlbmVkIHBhcnNpbmcgZm9yIFR4IHBhY2tldCBzZW5kIHRvIG91ciBTVEEgZHJpdmVyLgorCitBcmd1bWVudHM6CisgICAgTkRJU19IQU5ETEUgCU1pbmlwb3J0QWRhcHRlckNvbnRleHQJUG9pbnRlciByZWZlciB0byB0aGUgZGV2aWNlIGhhbmRsZSwgaS5lLiwgdGhlIHBBZC4KKwlQUE5ESVNfUEFDS0VUCXBwUGFja2V0QXJyYXkJCQlUaGUgcGFja2V0IGFycmF5IG5lZWQgdG8gZG8gdHJhbnNtaXNzaW9uLgorCVVJTlQJCQlOdW1iZXJPZlBhY2tldHMJCQlOdW1iZXIgb2YgcGFja2V0IGluIHBhY2tldCBhcnJheS4KKworUmV0dXJuIFZhbHVlOgorCU5PTkUKKworTm90ZToKKwlUaGlzIGZ1bmN0aW9uIGRvIGVhcmx5IGNoZWNraW5nIGFuZCBjbGFzc2lmaWNhdGlvbiBmb3Igc2VuZC1vdXQgcGFja2V0LgorCVlvdSBvbmx5IGNhbiBwdXQgT1MtZGVwZW5lZCAmIFNUQSByZWxhdGVkIGNvZGUgaW4gaGVyZS4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgU1RBU2VuZFBhY2tldHMoCisJSU4JTkRJU19IQU5ETEUJCU1pbmlwb3J0QWRhcHRlckNvbnRleHQsCisJSU4JUFBORElTX1BBQ0tFVAlwcFBhY2tldEFycmF5LAorCUlOCVVJTlQJCQlOdW1iZXJPZlBhY2tldHMpCit7CisJVUlOVAkJCUluZGV4OworCVBSVE1QX0FEQVBURVIJcEFkID0gKFBSVE1QX0FEQVBURVIpIE1pbmlwb3J0QWRhcHRlckNvbnRleHQ7CisJUE5ESVNfUEFDS0VUCXBQYWNrZXQ7CisJQk9PTEVBTgkJCWFsbG93VG9TZW5kID0gRkFMU0U7CisKKworCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IE51bWJlck9mUGFja2V0czsgSW5kZXgrKykKKwl7CisJCXBQYWNrZXQgPSBwcFBhY2tldEFycmF5W0luZGV4XTsKKworCQlkbworCQl7CisJCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSB8fAorCQkJCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSB8fAorCQkJCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpKQorCQkJeworCQkJCS8vIERyb3Agc2VuZCByZXF1ZXN0IHNpbmNlIGhhcmR3YXJlIGlzIGluIHJlc2V0IHN0YXRlCisJCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZSBpZiAoIUlORlJBX09OKHBBZCkgJiYgIUFESE9DX09OKHBBZCkpCisJCQl7CisJCQkJLy8gRHJvcCBzZW5kIHJlcXVlc3Qgc2luY2UgdGhlcmUgYXJlIG5vIHBoeXNpY2FsIGNvbm5lY3Rpb24geWV0CisJCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIFJlY29yZCB0aGF0IG9yaWduYWwgcGFja2V0IHNvdXJjZSBpcyBmcm9tIE5ESVMgbGF5ZXIsc28gdGhhdAorCQkJCS8vIGxhdGVyIG9uIGRyaXZlciBrbm93cyBob3cgdG8gcmVsZWFzZSB0aGlzIE5ESVMgUEFDS0VUCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCQkJTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7CisJCQkJUFVDSEFSIHBTcmNCdWZWQSA9IEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKKworCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgcFNyY0J1ZlZBKTsKKwkJCQlpZiAocEVudHJ5ICYmIChwRW50cnktPlZhbGlkQXNEbHMgPT0gVFJVRSkpCisJCQkJeworCQkJCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwUGFja2V0LCBwRW50cnktPkFpZCk7CisJCQkJfQorCQkJCWVsc2UKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkJCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwUGFja2V0LCAwKTsgLy8gdGhpcyBmaWVsZCBpcyB1c2VsZXNzIHdoZW4gaW4gU1RBIG1vZGUKKwkJCQlSVE1QX1NFVF9QQUNLRVRfU09VUkNFKHBQYWNrZXQsIFBLVFNSQ19ORElTKTsKKwkJCQlORElTX1NFVF9QQUNLRVRfU1RBVFVTKHBQYWNrZXQsIE5ESVNfU1RBVFVTX1BFTkRJTkcpOworCQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuUGVuZGluZ05kaXNQYWNrZXRDb3VudCsrOworCisJCQkJYWxsb3dUb1NlbmQgPSBUUlVFOworCQkJfQorCQl9IHdoaWxlKEZBTFNFKTsKKworCQlpZiAoYWxsb3dUb1NlbmQgPT0gVFJVRSkKKwkJCVNUQVNlbmRQYWNrZXQocEFkLCBwUGFja2V0KTsKKwkJZWxzZQorCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKworCS8vIERlcXVldWUgb3V0Z29pbmcgZnJhbWVzIGZyb20gVHhTd1F1ZXVlW10gYW5kIHByb2Nlc3MgaXQKKwlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBOVU1fT0ZfVFhfUklORywgTUFYX1RYX1BST0NFU1MpOworCit9CisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKwlUaGlzIHJvdXRpbmUgaXMgdXNlZCB0byBkbyBwYWNrZXQgcGFyc2luZyBhbmQgY2xhc3NpZmljYXRpb24gZm9yIFR4IHBhY2tldAorCXRvIFNUQSBkZXZpY2UsIGFuZCBpdCB3aWxsIGVuLXF1ZXVlIHBhY2tldHMgdG8gb3VyIFR4U3dRdWV1ZSBkZXBlbmRzIG9uIEFDCisJY2xhc3MuCisKK0FyZ3VtZW50czoKKwlwQWQgICAgCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJcFBhY2tldCAJUG9pbnRlciB0byBzZW5kIHBhY2tldAorCitSZXR1cm4gVmFsdWU6CisJTkRJU19TVEFUVVNfU1VDQ0VTUwkJCUlmIHN1Y2NlcyB0byBxdWV1ZSB0aGUgcGFja2V0IGludG8gVHhTd1F1ZXVlLgorCU5ESVNfU1RBVFVTX0ZBSUxVUkUJCQlJZiBmYWlsZWQgdG8gZG8gZW4tcXVldWUuCisKK05vdGU6CisJWW91IG9ubHkgY2FuIHB1dCBPUy1pbmRlcGVuZWQgJiBTVEEgcmVsYXRlZCBjb2RlIGluIGhlcmUuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUyBTVEFTZW5kUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQoreworCVBBQ0tFVF9JTkZPIAlQYWNrZXRJbmZvOworCVBVQ0hBUgkJCXBTcmNCdWZWQTsKKwlVSU5UCQkJU3JjQnVmTGVuOworCVVJTlQJCQlBbGxvd0ZyYWdTaXplOworCVVDSEFSCQkJTnVtYmVyT2ZGcmFnOworLy8JVUNIQVIJCQlSVFNSZXF1aXJlZDsKKwlVQ0hBUgkJCVF1ZUlkeCwgVXNlclByaW9yaXR5OworCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5ID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgCUlycUZsYWdzOworCVVDSEFSCQkJRmxnSXNJUCA9IDA7CisJVUNIQVIJCQlSYXRlOworCisJLy8gUHJlcGFyZSBwYWNrZXQgaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciBidWZmZXIgZGVzY3JpcHRvcgorCS8vIGNoYWluZWQgd2l0aGluIGEgc2luZ2xlIE5ESVMgcGFja2V0LgorCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBQYWNrZXQsICZQYWNrZXRJbmZvLCAmcFNyY0J1ZlZBLCAmU3JjQnVmTGVuKTsKKworCWlmIChwU3JjQnVmVkEgPT0gTlVMTCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiU1RBU2VuZFBhY2tldCAtLT4gcFNyY0J1ZlZBID09IE5VTEwgISEhU3JjQnVmTGVuPSV4XG4iLFNyY0J1ZkxlbikpOworCQkvLyBSZXNvdXJlY2UgaXMgbG93LCBzeXN0ZW0gZGlkIG5vdCBhbGxvY2F0ZSB2aXJ0dWFsIGFkZHJlc3MKKwkJLy8gcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkUgZGlyZWN0bHkgdG8gdXBwZXIgbGF5ZXIKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKworCWlmIChTcmNCdWZMZW4gPCAxNCkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiU1RBU2VuZFBhY2tldCAtLT4gTmRpcyBQYWNrZXQgYnVmZmVyIGVycm9yICEhIVxuIikpOworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJfQorCisJLy8gSW4gSFQgcmF0ZSBhZGhvYyBtb2RlLCBBLU1QRFUgaXMgb2Z0ZW4gdXNlZC4gU28gbmVlZCB0byBsb29rdXAgQkEgVGFibGUgYW5kIE1BQyBFbnRyeS4KKwkvLyBOb3RlIG11bHRpY2FzdCBwYWNrZXRzIGluIGFkaG9jIGFsc28gdXNlIEJTU0lEX1dDSUQgaW5kZXguCisJeworCQlpZihJTkZSQV9PTihwQWQpKQorCQl7CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCQlVU0hPUlQJdG1wV2NpZDsKKworCQkJdG1wV2NpZCA9IFJUTVBfR0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQpOworCQkJaWYgKFZBTElEX1dDSUQodG1wV2NpZCkgJiYKKwkJCQkocEFkLT5NYWNUYWIuQ29udGVudFt0bXBXY2lkXS5WYWxpZEFzRGxzPT0gVFJVRSkpCisJCQl7CisJCQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbdG1wV2NpZF07CisJCQkJUmF0ZSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbdG1wV2NpZF0uQ3VyclR4UmF0ZTsKKwkJCX0KKwkJCWVsc2UKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkJCXsKKwkJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOworCQkJUlRNUF9TRVRfUEFDS0VUX1dDSUQocFBhY2tldCwgQlNTSURfV0NJRCk7CisJCQlSYXRlID0gcEFkLT5Db21tb25DZmcuVHhSYXRlOworCQl9CisJCX0KKwkJZWxzZSBpZiAoQURIT0NfT04ocEFkKSkKKwkJeworCQkJaWYgKCpwU3JjQnVmVkEgJiAweDAxKQorCQkJeworCQkJCVJUTVBfU0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQsIE1DQVNUX1dDSUQpOworCQkJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgcFNyY0J1ZlZBKTsKKwkJCX0KKwkJCVJhdGUgPSBwQWQtPkNvbW1vbkNmZy5UeFJhdGU7CisJCX0KKwl9CisKKwlpZiAoIXBFbnRyeSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiU1RBU2VuZFBhY2tldC0+Q2Fubm90IGZpbmQgcEVudHJ5KCUyeDolMng6JTJ4OiUyeDolMng6JTJ4KSBpbiBNYWNUYWIhXG4iLCBQUklOVF9NQUMocFNyY0J1ZlZBKSkpOworCQkvLyBSZXNvdXJlY2UgaXMgbG93LCBzeXN0ZW0gZGlkIG5vdCBhbGxvY2F0ZSB2aXJ0dWFsIGFkZHJlc3MKKwkJLy8gcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkUgZGlyZWN0bHkgdG8gdXBwZXIgbGF5ZXIKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKwlpZiAoQURIT0NfT04ocEFkKQorCQkpCisJeworCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwUGFja2V0LCAoVUNIQVIpcEVudHJ5LT5BaWQpOworCX0KKworCS8vCisJLy8gQ2hlY2sgdGhlIEV0aGVybmV0IEZyYW1lIHR5cGUgb2YgdGhpcyBwYWNrZXQsIGFuZCBzZXQgdGhlIFJUTVBfU0VUX1BBQ0tFVF9TUEVDSUZJQyBmbGFncy4KKwkvLwkJSGVyZSB3ZSBzZXQgdGhlIFBBQ0tFVF9TUEVDSUZJQyBmbGFncyhMTEMsIFZMQU4sIERIQ1AvQVJQLCBFQVBPTCkuCisJUlRNUENoZWNrRXRoZXJUeXBlKHBBZCwgcFBhY2tldCk7CisKKworCisJLy8KKwkvLyBXUEEgODAyLjF4IHNlY3VyZWQgcG9ydCBjb250cm9sIC0gZHJvcCBhbGwgbm9uLTgwMi4xeCBmcmFtZSBiZWZvcmUgcG9ydCBzZWN1cmVkCisJLy8KKwlpZiAoKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8CisJCSAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAorCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8CisJCSAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJCSAgfHwgKHBBZC0+U3RhQ2ZnLklFRUU4MDIxWCA9PSBUUlVFKQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyNpZmRlZiBMRUFQX1NVUFBPUlQKKwkJICB8fCAocEFkLT5TdGFDZmcuTGVhcEF1dGhNb2RlID09IENJU0NPX0F1dGhNb2RlTEVBUCkKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKwkJICApCisJCSAgJiYgKChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpIHx8IChwQWQtPlN0YUNmZy5NaWNFcnJDbnQgPj0gMikpCisJCSAgJiYgKFJUTVBfR0VUX1BBQ0tFVF9FQVBPTChwUGFja2V0KT09IEZBTFNFKQorCQkgICkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU1RBU2VuZFBhY2tldCAtLT4gRHJvcCBwYWNrZXQgYmVmb3JlIHBvcnQgc2VjdXJlZCAhISFcbiIpKTsKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCisJCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJfQorCisKKwkvLyBTVEVQIDEuIERlY2lkZSBudW1iZXIgb2YgZnJhZ21lbnRzIHJlcXVpcmVkIHRvIGRlbGl2ZXIgdGhpcyBNU0RVLgorCS8vCSAgIFRoZSBlc3RpbWF0aW9uIGhlcmUgaXMgbm90IHZlcnkgYWNjdXJhdGUgYmVjYXVzZSBkaWZmaWN1bHQgdG8KKwkvLwkgICB0YWtlIGVuY3J5cHRpb24gb3ZlcmhlYWQgaW50byBjb25zaWRlcmF0aW9uIGhlcmUuIFRoZSByZXN1bHQKKwkvLwkgICAiTnVtYmVyT2ZGcmFnIiBpcyB0aGVuIGp1c3QgdXNlZCB0byBwcmUtY2hlY2sgaWYgZW5vdWdoIGZyZWUKKwkvLwkgICBUWEQgYXJlIGF2YWlsYWJsZSB0byBob2xkIHRoaXMgTVNEVS4KKworCisJaWYgKCpwU3JjQnVmVkEgJiAweDAxKQkvLyBmcmFnbWVudGF0aW9uIG5vdCBhbGxvd2VkIG9uIG11bHRpY2FzdCAmIGJyb2FkY2FzdAorCQlOdW1iZXJPZkZyYWcgPSAxOworCWVsc2UgaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKSkKKwkJTnVtYmVyT2ZGcmFnID0gMTsJLy8gQWdncmVnYXRpb24gb3ZlcndoZWxtcyBmcmFnbWVudGF0aW9uCisJZWxzZSBpZiAoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQpKQorCQlOdW1iZXJPZkZyYWcgPSAxOwkvLyBBZ2dyZWdhdGlvbiBvdmVyd2hlbG1zIGZyYWdtZW50YXRpb24KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwllbHNlIGlmICgocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1PREUgPT0gTU9ERV9IVE1JWCkgfHwgKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFID09IE1PREVfSFRHUkVFTkZJRUxEKSkKKwkJTnVtYmVyT2ZGcmFnID0gMTsJLy8gTUlNTyBSQVRFIG92ZXJ3aGVsbXMgZnJhZ21lbnRhdGlvbgorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCWVsc2UKKwl7CisJCS8vIFRoZSBjYWxjdWxhdGVkICJOdW1iZXJPZkZyYWciIGlzIGEgcm91Z2ggZXN0aW1hdGlvbiBiZWNhdXNlIG9mIHZhcmlvdXMKKwkJLy8gZW5jcnlwdGlvbi9lbmNhcHN1bGF0aW9uIG92ZXJoZWFkIG5vdCB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24uIFRoaXMgbnVtYmVyIGlzIGp1c3QKKwkJLy8gdXNlZCB0byBtYWtlIHN1cmUgZW5vdWdoIGZyZWUgVFhEIGFyZSBhdmFpbGFibGUgYmVmb3JlIGZyYWdtZW50YXRpb24gdGFrZXMgcGxhY2UuCisJCS8vIEluIGNhc2UgdGhlIGFjdHVhbCByZXF1aXJlZCBudW1iZXIgb2YgZnJhZ21lbnRzIG9mIGFuIE5ESVMgcGFja2V0CisJCS8vIGV4Y2NlZWRzICJOdW1iZXJPZkZyYWciY2FjdWxhdGVkIGhlcmUgYW5kIG5vdCBlbm91Z2ggZnJlZSBUWEQgYXZhaWxhYmxlLCB0aGUKKwkJLy8gbGFzdCBmcmFnbWVudCAoaS5lLiBsYXN0IE1QRFUpIHdpbGwgYmUgZHJvcHBlZCBpbiBSVE1QSGFyZFRyYW5zbWl0KCkgZHVlIHRvIG91dCBvZgorCQkvLyByZXNvdXJjZSwgYW5kIHRoZSBORElTIHBhY2tldCB3aWxsIGJlIGluZGljYXRlZCBORElTX1NUQVRVU19GQUlMVVJFLiBUaGlzIHNob3VsZAorCQkvLyByYXJlbHkgaGFwcGVuIGFuZCB0aGUgcGVuYWx0eSBpcyBqdXN0IGxpa2UgYSBUWCBSRVRSWSBmYWlsLiBBZmZvcmRhYmxlLgorCisJCUFsbG93RnJhZ1NpemUgPSAocEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQpIC0gTEVOR1RIXzgwMl8xMSAtIExFTkdUSF9DUkM7CisJCU51bWJlck9mRnJhZyA9ICgoUGFja2V0SW5mby5Ub3RhbFBhY2tldExlbmd0aCAtIExFTkdUSF84MDJfMyArIExFTkdUSF84MDJfMV9IKSAvIEFsbG93RnJhZ1NpemUpICsgMTsKKwkJLy8gVG8gZ2V0IGFjY3VyYXRlIG51bWJlciBvZiBmcmFnbWVudGF0aW9uLCBNaW51cyAxIGlmIHRoZSBzaXplIGp1c3QgbWF0Y2ggdG8gYWxsb3dhYmxlIGZyYWdtZW50IHNpemUKKwkJaWYgKCgoUGFja2V0SW5mby5Ub3RhbFBhY2tldExlbmd0aCAtIExFTkdUSF84MDJfMyArIExFTkdUSF84MDJfMV9IKSAlIEFsbG93RnJhZ1NpemUpID09IDApCisJCXsKKwkJCU51bWJlck9mRnJhZy0tOworCQl9CisJfQorCisJLy8gU2F2ZSBmcmFnbWVudCBudW1iZXIgdG8gTmRpcyBwYWNrZXQgcmVzZXJ2ZWQgZmllbGQKKwlSVE1QX1NFVF9QQUNLRVRfRlJBR01FTlRTKHBQYWNrZXQsIE51bWJlck9mRnJhZyk7CisKKworCS8vIFNURVAgMi4gQ2hlY2sgdGhlIHJlcXVpcmVtZW50IG9mIFJUUzoKKwkvLwkgICBJZiBtdWx0aXBsZSBmcmFnbWVudCByZXF1aXJlZCwgUlRTIGlzIHJlcXVpcmVkIG9ubHkgZm9yIHRoZSBmaXJzdCBmcmFnbWVudAorCS8vCSAgIGlmIHRoZSBmcmFnbWVudCBzaXplIGxhcmdlIHRoYW4gUlRTIHRocmVzaG9sZAorCS8vICAgICBGb3IgUlQyOHh4LCBMZXQgQVNJQyBzZW5kIFJUUy9DVFMKKwlSVE1QX1NFVF9QQUNLRVRfUlRTKHBQYWNrZXQsIDApOworCVJUTVBfU0VUX1BBQ0tFVF9UWFJBVEUocFBhY2tldCwgcEFkLT5Db21tb25DZmcuVHhSYXRlKTsKKworCS8vCisJLy8gU1RFUCAzLiBUcmFmZmljIGNsYXNzaWZpY2F0aW9uLiBvdXRjb21lID0gPFVzZXJQcmlvcml0eSwgUXVlSWR4PgorCS8vCisJVXNlclByaW9yaXR5ID0gMDsKKwlRdWVJZHgJCSA9IFFJRF9BQ19CRTsKKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSAmJgorCQlDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKSkKKwl7CisJCVVTSE9SVCBQcm90b2NvbDsKKwkJVUNIQVIgIExsY1NuYXBMZW4gPSAwLCBCeXRlMCwgQnl0ZTE7CisJCWRvCisJCXsKKwkJCS8vIGdldCBFdGhlcm5ldCBwcm90b2NvbCBmaWVsZAorCQkJUHJvdG9jb2wgPSAoVVNIT1JUKSgocFNyY0J1ZlZBWzEyXSA8PCA4KSArIHBTcmNCdWZWQVsxM10pOworCQkJaWYgKFByb3RvY29sIDw9IDE1MDApCisJCQl7CisJCQkJLy8gZ2V0IEV0aGVybmV0IHByb3RvY29sIGZpZWxkIGZyb20gTExDL1NOQVAKKwkJCQlpZiAoU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcihQYWNrZXRJbmZvLnBGaXJzdEJ1ZmZlciwgTEVOR1RIXzgwMl8zICsgNiwgJkJ5dGUwLCAmQnl0ZTEpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkJCWJyZWFrOworCisJCQkJUHJvdG9jb2wgPSAoVVNIT1JUKSgoQnl0ZTAgPDwgOCkgKyBCeXRlMSk7CisJCQkJTGxjU25hcExlbiA9IDg7CisJCQl9CisKKwkJCS8vIGFsd2F5cyBBQ19CRSBmb3Igbm9uLUlQIHBhY2tldAorCQkJaWYgKFByb3RvY29sICE9IDB4MDgwMCkKKwkJCQlicmVhazsKKworCQkJLy8gZ2V0IElQIGhlYWRlcgorCQkJaWYgKFNuaWZmMkJ5dGVzRnJvbU5kaXNCdWZmZXIoUGFja2V0SW5mby5wRmlyc3RCdWZmZXIsIExFTkdUSF84MDJfMyArIExsY1NuYXBMZW4sICZCeXRlMCwgJkJ5dGUxKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCWJyZWFrOworCisJCQkvLyByZXR1cm4gQUNfQkUgaWYgcGFja2V0IGlzIG5vdCBJUHY0CisJCQlpZiAoKEJ5dGUwICYgMHhmMCkgIT0gMHg0MCkKKwkJCQlicmVhazsKKworCQkJRmxnSXNJUCA9IDE7CisJCQlVc2VyUHJpb3JpdHkgPSAoQnl0ZTEgJiAweGUwKSA+PiA1OworCQkJUXVlSWR4ID0gTWFwVXNlclByaW9yaXR5VG9BY2Nlc3NDYXRlZ29yeVtVc2VyUHJpb3JpdHldOworCisJCQkvLyBUT0RPOiBoYXZlIHRvIGNoZWNrIEFDTSBiaXQuIGFwcGx5IFRTUEVDIGlmIEFDTSBpcyBPTgorCQkJLy8gVE9ETzogZG93bmdyYWRlIFVQICYgUXVlSWR4IGJlZm9yZSBwYXNzaW5nIEFDTQorCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFDTVtRdWVJZHhdKQorCQkJeworCQkJCVVzZXJQcmlvcml0eSA9IDA7CisJCQkJUXVlSWR4CQkgPSBRSURfQUNfQkU7CisJCQl9CisJCX0gd2hpbGUgKEZBTFNFKTsKKwl9CisKKwlSVE1QX1NFVF9QQUNLRVRfVVAocFBhY2tldCwgVXNlclByaW9yaXR5KTsKKworCisKKwkvLyBNYWtlIHN1cmUgU2VuZFR4V2FpdCBxdWV1ZSByZXNvdXJjZSB3b24ndCBiZSB1c2VkIGJ5IG90aGVyIHRocmVhZHMKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7CisJaWYgKHBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0uTnVtYmVyID49IE1BWF9QQUNLRVRTX0lOX1FVRVVFKQorCXsKKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7CisjaWZkZWYgQkxPQ0tfTkVUX0lGCisJCVN0b3BOZXRJZlF1ZXVlKHBBZCwgUXVlSWR4LCBwUGFja2V0KTsKKyNlbmRpZiAvLyBCTE9DS19ORVRfSUYgLy8KKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKwllbHNlCisJeworCQlJbnNlcnRUYWlsUXVldWUoJnBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0sIFBBQ0tFVF9UT19RVUVVRV9FTlRSWShwUGFja2V0KSk7CisJfQorCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgaWYgKChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID09IFRSVUUpJiYKKyAgICAgICAgSVNfSFRfU1RBKHBFbnRyeSkpCisJeworCSAgICAvL1BNQUNfVEFCTEVfRU5UUlkgcE1hY0VudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07CisJCWlmICgoKHBFbnRyeS0+VFhCQWJpdG1hcCAmICgxPDxVc2VyUHJpb3JpdHkpKSA9PSAwKSAmJgorICAgICAgICAgICAgKChwRW50cnktPkJBRGVjbGluZUJpdG1hcCAmICgxPDxVc2VyUHJpb3JpdHkpKSA9PSAwKSAmJgorICAgICAgICAgICAgKHBFbnRyeS0+UG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQpCisJCQkgLy8gRm9yIElPVCBjb21wYXRpYmlsaXR5LCBpZgorCQkJIC8vIDEuIEl0IGlzIFJhbGluayBjaGlwIG9yCisJCQkgLy8gMi4gSXQgaXMgT1BFTiBvciBBRVMgbW9kZSwKKwkJCSAvLyB0aGVuIEJBIHNlc3Npb24gY2FuIGJlIGJ1bGl0LgorCQkJICYmICgocEVudHJ5LT5WYWxpZEFzQ0xJICYmIHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICE9IDB4MCkgfHwKKwkJCSAJIChwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQgfHwgcEVudHJ5LT5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpCisJCQkpCisJCXsKKwkJCUJBT3JpU2Vzc2lvblNldFVwKHBBZCwgcEVudHJ5LCAwLCAwLCAxMCwgRkFMU0UpOworCQl9CisJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNPc1R4Q291bnRbUXVlSWR4XSsrOyAvLyBUT0RPOiBmb3IgZGVidWcgb25seS4gdG8gYmUgcmVtb3ZlZAorCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlUaGlzIHN1YnJvdXRpbmUgd2lsbCBzY2FuIHRocm91Z2ggcmVsZWF0aXZlIHJpbmcgZGVzY3JpcHRvciB0byBmaW5kCisJCW91dCBhdmFsaWFibGUgZnJlZSByaW5nIGRlc2NyaXB0b3IgYW5kIGNvbXBhcmUgd2l0aCByZXF1ZXN0IHNpemUuCisKKwlBcmd1bWVudHM6CisJCXBBZCBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCVF1ZUlkeAkJU2VsZWN0ZWQgVFggUmluZworCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NUQVRVU19GQUlMVVJFIAlOb3QgZW5vdWdoIGZyZWUgZGVzY3JpcHRvcgorCQlORElTX1NUQVRVU19TVUNDRVNTIAlFbm91Z2ggZnJlZSBkZXNjcmlwdG9yCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworI2lmZGVmIFJUMjg3MAorLyoKKwlBY3R1YWxseSwgdGhpcyBmdW5jdGlvbiB1c2VkIHRvIGNoZWNrIGlmIHRoZSBUeEhhcmR3YXJlIFF1ZXVlIHN0aWxsIGhhcyBmcmFtZSBuZWVkIHRvIHNlbmQuCisJSWYgbm8gZnJhbWUgbmVlZCB0byBzZW5kLCBnbyB0byBzbGVlcCwgZWxzZSwgc3RpbGwgd2FrZSB1cC4KKyovCitORElTX1NUQVRVUyBSVE1QRnJlZVRYRFJlcXVlc3QoCisJSU4JCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCQlVQ0hBUgkJCVF1ZUlkeCwKKwlJTgkJVUNIQVIJCQlOdW1iZXJSZXF1aXJlZCwKKwlJTgkJUFVDSEFSCQkJRnJlZU51bWJlcklzKQoreworCS8vVUxPTkcJCUZyZWVOdW1iZXIgPSAwOworCU5ESVNfU1RBVFVTIAlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCXVuc2lnbmVkIGxvbmcgICBJcnFGbGFnczsKKwlIVF9UWF9DT05URVhUCSpwSFRUWENvbnRleHQ7CisKKwlzd2l0Y2ggKFF1ZUlkeCkKKwl7CisJCWNhc2UgUUlEX0FDX0JLOgorCQljYXNlIFFJRF9BQ19CRToKKwkJY2FzZSBRSURfQUNfVkk6CisJCWNhc2UgUUlEX0FDX1ZPOgorCQljYXNlIFFJRF9IQ0NBOgorCQkJeworCQkJCXBIVFRYQ29udGV4dCA9ICZwQWQtPlR4Q29udGV4dFtRdWVJZHhdOworCQkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKKwkJCQlpZiAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiAhPSBwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uKSB8fAorCQkJCQkocEhUVFhDb250ZXh0LT5JUlBQZW5kaW5nID09IFRSVUUpKQorCQkJCXsKKwkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJCQl9CisJCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFFJRF9NR01UOgorCQkJaWYgKHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggIT0gTUdNVF9SSU5HX1NJWkUpCisJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwkJCWVsc2UKKwkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiUlRNUEZyZWVUWERSZXF1ZXN0OjpJbnZhbGlkIFF1ZUlkeCg9JWQpXG4iLCBRdWVJZHgpKTsKKwkJCWJyZWFrOworCX0KKworCXJldHVybiAoU3RhdHVzKTsKKworfQorI2VuZGlmIC8vIFJUMjg3MCAvLworCisKK1ZPSUQgUlRNUFNlbmREaXNhc3NvY2lhdGlvbkZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoreworfQorCitWT0lECVJUTVBTZW5kTnVsbEZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVVDSEFSCQkJVHhSYXRlLAorCUlOCUJPT0xFQU4gCQliUW9zTnVsbCkKK3sKKwlVQ0hBUglOdWxsRnJhbWVbNDhdOworCVVMT05HCUxlbmd0aDsKKwlQSEVBREVSXzgwMl8xMQlwSGVhZGVyXzgwMl8xMTsKKworCisjaWZkZWYgUkFMSU5LX0FURQorCWlmKEFURV9PTihwQWQpKQorCXsKKwkJcmV0dXJuOworCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKyAgICAvLyBXUEEgODAyLjF4IHNlY3VyZWQgcG9ydCBjb250cm9sCisgICAgaWYgKCgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAorICAgICAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKKyAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fAorICAgICAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQkJICB8fCAocEFkLT5TdGFDZmcuSUVFRTgwMjFYID09IFRSVUUpCisjZW5kaWYKKyAgICAgICAgKSAmJgorICAgICAgIChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpKQorCXsKKwkJcmV0dXJuOworCX0KKworCU5kaXNaZXJvTWVtb3J5KE51bGxGcmFtZSwgNDgpOworCUxlbmd0aCA9IHNpemVvZihIRUFERVJfODAyXzExKTsKKworCXBIZWFkZXJfODAyXzExID0gKFBIRUFERVJfODAyXzExKSBOdWxsRnJhbWU7CisKKwlwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSA9IEJUWVBFX0RBVEE7CisJcEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPSBTVUJUWVBFX05VTExfRlVOQzsKKwlwSGVhZGVyXzgwMl8xMS0+RkMuVG9EcyA9IDE7CisJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKworCWlmIChwQWQtPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlKQorCXsKKwkJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSBQV1JfU0FWRTsKKwl9CisJZWxzZQorCXsKKwkJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKSA/IDE6IDA7CisJfQorCXBIZWFkZXJfODAyXzExLT5EdXJhdGlvbiA9IHBBZC0+Q29tbW9uQ2ZnLkRzaWZzICsgUlRNUENhbGNEdXJhdGlvbihwQWQsIFR4UmF0ZSwgMTQpOworCisJcEFkLT5TZXF1ZW5jZSsrOworCXBIZWFkZXJfODAyXzExLT5TZXF1ZW5jZSA9IHBBZC0+U2VxdWVuY2U7CisKKwkvLyBQcmVwYXJlIFFvc051bGwgZnVuY3Rpb24gZnJhbWUKKwlpZiAoYlFvc051bGwpCisJeworCQlwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9IFNVQlRZUEVfUU9TX05VTEw7CisKKwkJLy8gY29weSBRT1MgY29udHJvbCBieXRlcworCQlOdWxsRnJhbWVbTGVuZ3RoXQk9ICAwOworCQlOdWxsRnJhbWVbTGVuZ3RoKzFdID0gIDA7CisJCUxlbmd0aCArPSAyOy8vIGlmIHBhZCB3aXRoIDIgYnl0ZXMgZm9yIGFsaWdubWVudCwgQVBTRCB3aWxsIGZhaWwKKwl9CisKKwlIQUxfS2lja091dE51bGxGcmFtZVR4KHBBZCwgMCwgTnVsbEZyYW1lLCBMZW5ndGgpOworCit9CisKKy8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAorVk9JRAlSVE1QU2VuZFJUU0ZyYW1lKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBEQSwKKwlJTgl1bnNpZ25lZCBpbnQJTmV4dE1wZHVTaXplLAorCUlOCVVDSEFSCQkJVHhSYXRlLAorCUlOCVVDSEFSCQkJUlRTUmF0ZSwKKwlJTglVU0hPUlQJCQlBY2tEdXJhdGlvbiwKKwlJTglVQ0hBUgkJCVF1ZUlkeCwKKwlJTglVQ0hBUgkJCUZyYW1lR2FwKQoreworfQorCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBGSU5EIEVOQ1JZUFQgS0VZIEFORCBERUNJREUgQ0lQSEVSIEFMR09SSVRITQorLy8JCUZpbmQgdGhlIFdQQSBrZXksIGVpdGhlciBHcm91cCBvciBQYWlyd2lzZSBLZXkKKy8vCQlMRUFQICsgVEtJUCBhbHNvIHVzZSBXUEEga2V5LgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERlY2lkZSBXRVAgYml0IGFuZCBjaXBoZXIgc3VpdGUgdG8gYmUgdXNlZC4gU2FtZSBjaXBoZXIgc3VpdGUgc2hvdWxkIGJlIHVzZWQgZm9yIHdob2xlIGZyYWdtZW50IGJ1cnN0CisvLyBJbiBDaXNjbyBDQ1ggMi4wIExlYXAgQXV0aGVudGljYXRpb24KKy8vCQkgICBXZXBTdGF0dXMgaXMgTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCBidXQgdGhlIGtleSB3aWxsIHVzZSBQYWlyd2lzZUtleQorLy8JCSAgIEluc3RlYWQgb2YgdGhlIFNoYXJlZEtleSwgU2hhcmVkS2V5IExlbmd0aCBtYXkgYmUgWmVyby4KK1ZPSUQgU1RBRmluZENpcGhlckFsZ29yaXRobSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrKQoreworCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCUNpcGhlcjsJCQkJLy8gVG8gaW5kaWNhdGUgY2lwaGVyIHVzZWQgZm9yIHRoaXMgcGFja2V0CisJVUNIQVIJCQkJCQkJQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CQkvLyBjaXBoZXIgYWxvZ3JpdGhtCisJVUNIQVIJCQkJCQkJS2V5SWR4ID0gMHhmZjsKKwlQVUNIQVIJCQkJCQkJcFNyY0J1ZlZBOworCVBDSVBIRVJfS0VZCQkJCQkJcEtleSA9IE5VTEw7CisKKwlwU3JjQnVmVkEgPSBHRVRfT1NfUEtUX0RBVEFQVFIocFR4QmxrLT5wUGFja2V0KTsKKworCXsKKwkgICAgLy8gU2VsZWN0IENpcGhlcgorCSAgICBpZiAoKCpwU3JjQnVmVkEgJiAweDAxKSAmJiAoQURIT0NfT04ocEFkKSkpCisJICAgICAgICBDaXBoZXIgPSBwQWQtPlN0YUNmZy5Hcm91cENpcGhlcjsgLy8gQ2lwaGVyIGZvciBNdWx0aWNhc3Qgb3IgQnJvYWRjYXN0CisJICAgIGVsc2UKKwkgICAgICAgIENpcGhlciA9IHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXI7IC8vIENpcGhlciBmb3IgVW5pY2FzdAorCisJCWlmIChSVE1QX0dFVF9QQUNLRVRfRUFQT0wocFR4QmxrLT5wUGFja2V0KSkKKwkJeworCQkJQVNTRVJUKHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA8PSBDSVBIRVJfQ0tJUDEyOCk7CisKKwkJCS8vIDQtd2F5IGhhbmRzaGFraW5nIGZyYW1lIG11c3QgYmUgY2xlYXIKKwkJCWlmICghKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYkNsZWFyRUFQRnJhbWUpKSAmJiAocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnKSAmJgorCQkJCShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4pKQorCQkJeworCQkJCUNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZzsKKwkJCQlLZXlJZHggPSAwOworCQkJfQorCQl9CisJCWVsc2UgaWYgKENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKQorCQl7CisjaWZkZWYgTEVBUF9TVVBQT1JUCisJCQlpZiAocEFkLT5TdGFDZmcuQ2tpcEZsYWcgJiAweDEwKSAvLyBDaXNjbyBDS0lQIEtQIGlzIG9uCisJCQl7CisJCQkJaWYgKExFQVBfQ0NLTV9PTihwQWQpKQorCQkJCXsKKwkJCQkJaWYgKCgoKnBTcmNCdWZWQSAmIDB4MDEpICYmIChBREhPQ19PTihwQWQpKSkpCisJCQkJCQlLZXlJZHggPSAxOworCQkJCQllbHNlCisJCQkJCQlLZXlJZHggPSAwOworCQkJCX0KKwkJCQllbHNlCisJCQkJCUtleUlkeCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKKwkJCX0KKwkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkNraXBGbGFnICYgMHgwOCkgLy8gb25seSBDS0lQIENNSUMKKwkJCQlLZXlJZHggPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CisJCQllbHNlIGlmIChMRUFQX0NDS01fT04ocEFkKSkKKwkJCXsKKwkJCQlpZiAoKCpwU3JjQnVmVkEgJiAweDAxKSAmJiAoQURIT0NfT04ocEFkKSkpCisJCQkJCUtleUlkeCA9IDE7CisJCQkJZWxzZQorCQkJCQlLZXlJZHggPSAwOworCQkJfQorCQkJZWxzZQkvLyBzdGFuZGFyZCBXRVA2NCBvciBXRVAxMjgKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKwkJCQlLZXlJZHggPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CisJCX0KKwkJZWxzZSBpZiAoKENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSB8fAorCQkJCSAoQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpKQorCQl7CisJCQlpZiAoKCpwU3JjQnVmVkEgJiAweDAxKSAmJiAoQURIT0NfT04ocEFkKSkpIC8vIG11bHRpY2FzdAorCQkJCUtleUlkeCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKKwkJCWVsc2UgaWYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbikKKwkJCQlLZXlJZHggPSAwOworCQkJZWxzZQorCQkJCUtleUlkeCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKKwkJfQorCisJCWlmIChLZXlJZHggPT0gMHhmZikKKwkJCUNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQllbHNlIGlmICgoQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQpIHx8IChwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9PSAwKSkKKwkJCUNpcGhlckFsZyA9IENJUEhFUl9OT05FOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkgICAgZWxzZSBpZiAoIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAmJgorCSAgICAgICAgICAgICAoQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpICYmCisJICAgICAgICAgICAgIChwQWQtPlN0YUNmZy5JRUVFODAyMVggPT0gVFJVRSkgJiYKKwkgICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkpCisJICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJCWVsc2UKKwkJeworCQkJLy9IZWFkZXJfODAyXzExLkZDLldlcCA9IDE7CisJCQlDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZzsKKwkJCXBLZXkgPSAmcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XTsKKwkJfQorCX0KKworCXBUeEJsay0+Q2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCXBUeEJsay0+cEtleSA9IHBLZXk7Cit9CisKKworVk9JRCBTVEFCdWlsZENvbW1vbjgwMl8xMUhlYWRlcigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgVFhfQkxLICAgICAgICAgICpwVHhCbGspCit7CisKKwlIRUFERVJfODAyXzExCSpwSGVhZGVyXzgwMl8xMTsKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwlCT09MRUFOCWJETFNGcmFtZSA9IEZBTFNFOworCUlOVAlEbHNFbnRyeUluZGV4ID0gMDsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKworCS8vCisJLy8gTUFLRSBBIENPTU1PTiA4MDIuMTEgSEVBREVSCisJLy8KKworCS8vIG5vcm1hbCB3bGFuIGhlYWRlciBzaXplIDogMjQgb2N0ZXRzCisJcFR4QmxrLT5NcGR1SGVhZGVyTGVuID0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCisJcEhlYWRlcl84MDJfMTEgPSAoSEVBREVSXzgwMl8xMSAqKSAmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdOworCisJTmRpc1plcm9NZW1vcnkocEhlYWRlcl84MDJfMTEsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisKKwlwSGVhZGVyXzgwMl8xMS0+RkMuRnJEcyA9IDA7CisJcEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgPSBCVFlQRV9EQVRBOworCXBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID0gKChUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JXTU0pKSA/IFNVQlRZUEVfUURBVEEgOiBTVUJUWVBFX0RBVEEpOworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJaWYgKElORlJBX09OKHBBZCkpCisJeworCQkvLyBDaGVjayBpZiB0aGUgZnJhbWUgY2FuIGJlIHNlbnQgdGhyb3VnaCBETFMgZGlyZWN0IGxpbmsgaW50ZXJmYWNlCisJCS8vIElmIHBhY2tldCBjYW4gYmUgc2VudCB0aHJvdWdoIERMUywgdGhlbiBmb3JjZSBhZ2dyZWdhdGlvbiBkaXNhYmxlLiAoSGFyZCB0byBkZXRlcm1pbmUgcGVlciBTVEEncyBjYXBhYmlsaXR5KQorCQlEbHNFbnRyeUluZGV4ID0gUlRNUENoZWNrRExTRnJhbWUocEFkLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIpOworCQlpZiAoRGxzRW50cnlJbmRleCA+PSAwKQorCQkJYkRMU0ZyYW1lID0gVFJVRTsKKwkJZWxzZQorCQkJYkRMU0ZyYW1lID0gRkFMU0U7CisJfQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisgICAgaWYgKHBUeEJsay0+cE1hY0VudHJ5KQorCXsKKwkJaWYgKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYkZvcmNlTm9uUW9TKSkKKwkJeworCQkJcEhlYWRlcl84MDJfMTEtPlNlcXVlbmNlID0gcFR4QmxrLT5wTWFjRW50cnktPk5vblFvc0RhdGFTZXE7CisJCQlwVHhCbGstPnBNYWNFbnRyeS0+Tm9uUW9zRGF0YVNlcSA9IChwVHhCbGstPnBNYWNFbnRyeS0+Tm9uUW9zRGF0YVNlcSsxKSAmIE1BWFNFUTsKKwkJfQorCQllbHNlCisJCXsKKyAgICAJICAgIHBIZWFkZXJfODAyXzExLT5TZXF1ZW5jZSA9IHBUeEJsay0+cE1hY0VudHJ5LT5UeFNlcVtwVHhCbGstPlVzZXJQcmlvcml0eV07CisgICAgCSAgICBwVHhCbGstPnBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldID0gKHBUeEJsay0+cE1hY0VudHJ5LT5UeFNlcVtwVHhCbGstPlVzZXJQcmlvcml0eV0rMSkgJiBNQVhTRVE7CisgICAgCX0KKwl9CisJZWxzZQorCXsKKwkJcEhlYWRlcl84MDJfMTEtPlNlcXVlbmNlID0gcEFkLT5TZXF1ZW5jZTsKKwkJcEFkLT5TZXF1ZW5jZSA9IChwQWQtPlNlcXVlbmNlKzEpICYgTUFYU0VROyAvLyBuZXh0IHNlcXVlbmNlCisJfQorCisJcEhlYWRlcl84MDJfMTEtPkZyYWcgPSAwOworCisJcEhlYWRlcl84MDJfMTEtPkZDLk1vcmVEYXRhID0gVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iTW9yZURhdGEpOworCisJeworCQlpZiAoSU5GUkFfT04ocEFkKSkKKwkJeworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQkJaWYgKGJETFNGcmFtZSkKKwkJCXsKKwkJCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMSwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyKTsKKwkJCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCQlwSGVhZGVyXzgwMl8xMS0+RkMuVG9EcyA9IDA7CisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCQl7CisJCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMSwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOworCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjMsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcik7CisJCQlwSGVhZGVyXzgwMl8xMS0+RkMuVG9EcyA9IDE7CisJCX0KKwkJfQorCQllbHNlIGlmIChBREhPQ19PTihwQWQpKQorCQl7CisJCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMSwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyKTsKKwkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKwkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQlwSGVhZGVyXzgwMl8xMS0+RkMuVG9EcyA9IDA7CisJCX0KKwl9CisKKwlpZiAocFR4QmxrLT5DaXBoZXJBbGcgIT0gQ0lQSEVSX05PTkUpCisJCXBIZWFkZXJfODAyXzExLT5GQy5XZXAgPSAxOworCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBTVEVQIDIuIE1BS0UgQSBDT01NT04gODAyLjExIEhFQURFUiBTSEFSRUQgQlkgRU5USVJFIEZSQUdNRU5UIEJVUlNULiBGaWxsIHNlcXVlbmNlIGxhdGVyLgorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpCisgICAgCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7CisJZWxzZQorICAgIAlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpOworfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCitWT0lEIFNUQUJ1aWxkQ2FjaGU4MDJfMTFIZWFkZXIoCisJSU4gUlRNUF9BREFQVEVSCQkqcEFkLAorCUlOIFRYX0JMSwkJCSpwVHhCbGssCisJSU4gVUNIQVIJCQkqcEhlYWRlcikKK3sKKwlNQUNfVEFCTEVfRU5UUlkJKnBNYWNFbnRyeTsKKwlQSEVBREVSXzgwMl8xMQlwSGVhZGVyODAyMTE7CisKKwlwSGVhZGVyODAyMTEgPSAoUEhFQURFUl84MDJfMTEpcEhlYWRlcjsKKwlwTWFjRW50cnkgPSBwVHhCbGstPnBNYWNFbnRyeTsKKworCS8vCisJLy8gVXBkYXRlIHRoZSBjYWNoZWQgODAyLjExIEhFQURFUgorCS8vCisKKwkvLyBub3JtYWwgd2xhbiBoZWFkZXIgc2l6ZSA6IDI0IG9jdGV0cworCXBUeEJsay0+TXBkdUhlYWRlckxlbiA9IHNpemVvZihIRUFERVJfODAyXzExKTsKKworCS8vIE1vcmUgQml0CisJcEhlYWRlcjgwMjExLT5GQy5Nb3JlRGF0YSA9IFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYk1vcmVEYXRhKTsKKworCS8vIFNlcXVlbmNlCisJcEhlYWRlcjgwMjExLT5TZXF1ZW5jZSA9IHBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldOworICAgIHBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldID0gKHBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldKzEpICYgTUFYU0VROworCisJeworCQkvLyBDaGVjayBpZiB0aGUgZnJhbWUgY2FuIGJlIHNlbnQgdGhyb3VnaCBETFMgZGlyZWN0IGxpbmsgaW50ZXJmYWNlCisJCS8vIElmIHBhY2tldCBjYW4gYmUgc2VudCB0aHJvdWdoIERMUywgdGhlbiBmb3JjZSBhZ2dyZWdhdGlvbiBkaXNhYmxlLiAoSGFyZCB0byBkZXRlcm1pbmUgcGVlciBTVEEncyBjYXBhYmlsaXR5KQorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQlCT09MRUFOCWJETFNGcmFtZSA9IEZBTFNFOworCQlJTlQJRGxzRW50cnlJbmRleCA9IDA7CisKKwkJRGxzRW50cnlJbmRleCA9IFJUTVBDaGVja0RMU0ZyYW1lKHBBZCwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyKTsKKwkJaWYgKERsc0VudHJ5SW5kZXggPj0gMCkKKwkJCWJETFNGcmFtZSA9IFRSVUU7CisJCWVsc2UKKwkJCWJETFNGcmFtZSA9IEZBTFNFOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisJCS8vIFRoZSBhZGRyMyBvZiBub3JtYWwgcGFja2V0IHNlbmQgZnJvbSBEUyBpcyBEZXN0IE1hYyBhZGRyZXNzLgorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQlpZiAoYkRMU0ZyYW1lKQorCQl7CisJCQlDT1BZX01BQ19BRERSKHBIZWFkZXI4MDIxMS0+QWRkcjEsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcik7CisJCQlDT1BZX01BQ19BRERSKHBIZWFkZXI4MDIxMS0+QWRkcjMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCXBIZWFkZXI4MDIxMS0+RkMuVG9EcyA9IDA7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCQlpZiAoQURIT0NfT04ocEFkKSkKKwkJCUNPUFlfTUFDX0FERFIocEhlYWRlcjgwMjExLT5BZGRyMywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQllbHNlCisJCQlDT1BZX01BQ19BRERSKHBIZWFkZXI4MDIxMS0+QWRkcjMsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcik7CisJfQorCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBTVEVQIDIuIE1BS0UgQSBDT01NT04gODAyLjExIEhFQURFUiBTSEFSRUQgQlkgRU5USVJFIEZSQUdNRU5UIEJVUlNULiBGaWxsIHNlcXVlbmNlIGxhdGVyLgorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpCisgICAgCXBIZWFkZXI4MDIxMS0+RkMuUHdyTWdtdCA9IFBXUl9TQVZFOworCWVsc2UKKyAgICAJcEhlYWRlcjgwMjExLT5GQy5Qd3JNZ210ID0gKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSk7Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK3N0YXRpYyBpbmxpbmUgUFVDSEFSIFNUQV9CdWlsZF9BUmFsaW5rX0ZyYW1lX0hlYWRlcigKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCwKKwlJTiBUWF9CTEsJCSpwVHhCbGspCit7CisJUFVDSEFSCQkJcEhlYWRlckJ1ZlB0cjsKKwlIRUFERVJfODAyXzExCSpwSGVhZGVyXzgwMl8xMTsKKwlQTkRJU19QQUNLRVQJcE5leHRQYWNrZXQ7CisJVUlOVDMyCQkJbmV4dEJ1ZkxlbjsKKwlQUVVFVUVfRU5UUlkJcFFFbnRyeTsKKworCVNUQUZpbmRDaXBoZXJBbGdvcml0aG0ocEFkLCBwVHhCbGspOworCVNUQUJ1aWxkQ29tbW9uODAyXzExSGVhZGVyKHBBZCwgcFR4QmxrKTsKKworCisJcEhlYWRlckJ1ZlB0ciA9ICZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRSArIFRYV0lfU0laRV07CisJcEhlYWRlcl84MDJfMTEgPSAoSEVBREVSXzgwMl8xMSAqKSBwSGVhZGVyQnVmUHRyOworCisJLy8gc3RlYWwgIm9yZGVyIiBiaXQgdG8gbWFyayAiYWdncmVnYXRpb24iCisJcEhlYWRlcl84MDJfMTEtPkZDLk9yZGVyID0gMTsKKworCS8vIHNraXAgY29tbW9uIGhlYWRlcgorCXBIZWFkZXJCdWZQdHIgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuOworCisJaWYgKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYldNTSkpCisJeworCQkvLworCQkvLyBidWlsZCBRT1MgQ29udHJvbCBieXRlcworCQkvLworCQkqcEhlYWRlckJ1ZlB0ciA9IChwVHhCbGstPlVzZXJQcmlvcml0eSAmIDB4MEYpOworCisJCSoocEhlYWRlckJ1ZlB0cisxKSA9IDA7CisJCXBIZWFkZXJCdWZQdHIgKz0yOworCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gMjsKKwl9CisKKwkvLyBwYWRkaW5nIGF0IGZyb250IG9mIExMQyBoZWFkZXIuIExMQyBoZWFkZXIgc2hvdWxkIGF0IDQtYnl0ZXMgYWxpZ21lbnQuCisJcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpcEhlYWRlckJ1ZlB0cjsKKwlwSGVhZGVyQnVmUHRyID0gKFBDSEFSKVJPVU5EX1VQKHBIZWFkZXJCdWZQdHIsIDQpOworCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKShwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZHJQYWRMZW4pOworCisJLy8gRm9yIFJBIEFnZ3JlZ2F0aW9uLAorCS8vIHB1dCB0aGUgMm5kIE1TRFUgbGVuZ3RoKGV4dHJhIDItYnl0ZSBmaWVsZCkgYWZ0ZXIgUU9TX0NPTlRST0wgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQKKwlwUUVudHJ5ID0gcFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZDsKKwlwTmV4dFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BLVChwUUVudHJ5KTsKKwluZXh0QnVmTGVuID0gR0VUX09TX1BLVF9MRU4ocE5leHRQYWNrZXQpOworCWlmIChSVE1QX0dFVF9QQUNLRVRfVkxBTihwTmV4dFBhY2tldCkpCisJCW5leHRCdWZMZW4gLT0gTEVOR1RIXzgwMl8xUTsKKworCSpwSGVhZGVyQnVmUHRyID0gKFVDSEFSKW5leHRCdWZMZW4gJiAweGZmOworCSoocEhlYWRlckJ1ZlB0cisxKSA9IChVQ0hBUikobmV4dEJ1ZkxlbiA+PiA4KTsKKworCXBIZWFkZXJCdWZQdHIgKz0gMjsKKwlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gMjsKKworCXJldHVybiBwSGVhZGVyQnVmUHRyOworCit9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK3N0YXRpYyBpbmxpbmUgUFVDSEFSIFNUQV9CdWlsZF9BTVNEVV9GcmFtZV9IZWFkZXIoCisJSU4gUlRNUF9BREFQVEVSICpwQWQsCisJSU4gVFhfQkxLCQkqcFR4QmxrKQoreworCVBVQ0hBUgkJCXBIZWFkZXJCdWZQdHI7Ly8sIHBTYXZlQnVmUHRyOworCUhFQURFUl84MDJfMTEJKnBIZWFkZXJfODAyXzExOworCisKKwlTVEFGaW5kQ2lwaGVyQWxnb3JpdGhtKHBBZCwgcFR4QmxrKTsKKwlTVEFCdWlsZENvbW1vbjgwMl8xMUhlYWRlcihwQWQsIHBUeEJsayk7CisKKwlwSGVhZGVyQnVmUHRyID0gJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXTsKKwlwSGVhZGVyXzgwMl8xMSA9IChIRUFERVJfODAyXzExICopIHBIZWFkZXJCdWZQdHI7CisKKwkvLyBza2lwIGNvbW1vbiBoZWFkZXIKKwlwSGVhZGVyQnVmUHRyICs9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKKworCS8vCisJLy8gYnVpbGQgUU9TIENvbnRyb2wgYnl0ZXMKKwkvLworCSpwSGVhZGVyQnVmUHRyID0gKHBUeEJsay0+VXNlclByaW9yaXR5ICYgMHgwRik7CisKKwkvLworCS8vIEEtTVNEVSBwYWNrZXQKKwkvLworCSpwSGVhZGVyQnVmUHRyIHw9IDB4ODA7CisKKwkqKHBIZWFkZXJCdWZQdHIrMSkgPSAwOworCXBIZWFkZXJCdWZQdHIgKz0yOworCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSAyOworCisJLy9wU2F2ZUJ1ZlB0ciA9IHBIZWFkZXJCdWZQdHI7CisKKwkvLworCS8vIHBhZGRpbmcgYXQgZnJvbnQgb2YgTExDIGhlYWRlcgorCS8vIExMQyBoZWFkZXIgc2hvdWxkIGxvY2F0ZSBhdCA0LW9jdGV0cyBhbGlnbWVudAorCS8vCisJLy8gQEBAIE1wZHVIZWFkZXJMZW4gZXhjbHVkaW5nIHBhZGRpbmcgQEBACisJLy8KKwlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORylwSGVhZGVyQnVmUHRyOworCXBIZWFkZXJCdWZQdHIgPSAoUENIQVIpIFJPVU5EX1VQKHBIZWFkZXJCdWZQdHIsIDQpOworCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKShwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZHJQYWRMZW4pOworCisJcmV0dXJuIHBIZWFkZXJCdWZQdHI7CisKK30KKworCitWT0lEIFNUQV9BTVBEVV9GcmFtZV9UeCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrKQoreworCUhFQURFUl84MDJfMTEJKnBIZWFkZXJfODAyXzExOworCVBVQ0hBUgkJCXBIZWFkZXJCdWZQdHI7CisJVVNIT1JUCQkJRnJlZU51bWJlcjsKKwlNQUNfVEFCTEVfRU5UUlkJKnBNYWNFbnRyeTsKKwlCT09MRUFOCQkJYlZMQU5Qa3Q7CisJUFFVRVVFX0VOVFJZCXBRRW50cnk7CisKKwlBU1NFUlQocFR4QmxrKTsKKworCXdoaWxlKHBUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQpCisJeworCQlwUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7CisJCXBUeEJsay0+cFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKKwkJaWYgKCBSVE1QX0ZpbGxUeEJsa0luZm8ocEFkLCBwVHhCbGspICE9IFRSVUUpCisJCXsKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwVHhCbGstPnBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJY29udGludWU7CisJCX0KKworCQliVkxBTlBrdCA9IChSVE1QX0dFVF9QQUNLRVRfVkxBTihwVHhCbGstPnBQYWNrZXQpID8gVFJVRSA6IEZBTFNFKTsKKworCQlwTWFjRW50cnkgPSBwVHhCbGstPnBNYWNFbnRyeTsKKwkJaWYgKHBNYWNFbnRyeS0+aXNDYWNoZWQpCisJCXsKKwkJCS8vIE5PVEU6IFBsZWFzZSBtYWtlIHN1cmUgdGhlIHNpemUgb2YgcE1hY0VudHJ5LT5DYWNoZWRCdWZbXSBpcyBzbWFsbGVyIHRoYW4gcFR4QmxrLT5IZWFkZXJCdWZbXSEhISEKKwkJCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSwgKFBVQ0hBUikmcE1hY0VudHJ5LT5DYWNoZWRCdWZbMF0sIFRYV0lfU0laRSArIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJCQlwSGVhZGVyQnVmUHRyID0gKFBVQ0hBUikoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXSk7CisJCQlTVEFCdWlsZENhY2hlODAyXzExSGVhZGVyKHBBZCwgcFR4QmxrLCBwSGVhZGVyQnVmUHRyKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVNUQUZpbmRDaXBoZXJBbGdvcml0aG0ocEFkLCBwVHhCbGspOworCQkJU1RBQnVpbGRDb21tb244MDJfMTFIZWFkZXIocEFkLCBwVHhCbGspOworCisJCQlwSGVhZGVyQnVmUHRyID0gJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXTsKKwkJfQorCisKKwkJcEhlYWRlcl84MDJfMTEgPSAoSEVBREVSXzgwMl8xMSAqKSBwSGVhZGVyQnVmUHRyOworCisJCS8vIHNraXAgY29tbW9uIGhlYWRlcgorCQlwSGVhZGVyQnVmUHRyICs9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKKworCQkvLworCQkvLyBidWlsZCBRT1MgQ29udHJvbCBieXRlcworCQkvLworCQkqcEhlYWRlckJ1ZlB0ciA9IChwVHhCbGstPlVzZXJQcmlvcml0eSAmIDB4MEYpOworCQkqKHBIZWFkZXJCdWZQdHIrMSkgPSAwOworCQlwSGVhZGVyQnVmUHRyICs9MjsKKwkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IDI7CisKKwkJLy8KKwkJLy8gYnVpbGQgSFRDKworCQkvLyBIVEMgY29udHJvbCBmaWxlZCBmb2xsb3dpbmcgUW9TIGZpZWxkCisJCS8vCisJCWlmICgocEFkLT5Db21tb25DZmcuYlJkZyA9PSBUUlVFKSAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwVHhCbGstPnBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUkRHX0NBUEFCTEUpKQorCQl7CisJCQlpZiAocE1hY0VudHJ5LT5pc0NhY2hlZCA9PSBGQUxTRSkKKwkJCXsKKwkJCQkvLyBtYXJrIEhUQyBiaXQKKwkJCQlwSGVhZGVyXzgwMl8xMS0+RkMuT3JkZXIgPSAxOworCisJCQkJTmRpc1plcm9NZW1vcnkocEhlYWRlckJ1ZlB0ciwgNCk7CisJCQkJKihwSGVhZGVyQnVmUHRyKzMpIHw9IDB4ODA7CisJCQl9CisJCQlwSGVhZGVyQnVmUHRyICs9IDQ7CisJCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gNDsKKwkJfQorCisJCS8vcFR4QmxrLT5NcGR1SGVhZGVyTGVuID0gcEhlYWRlckJ1ZlB0ciAtIHBUeEJsay0+SGVhZGVyQnVmIC0gVFhXSV9TSVpFIC0gVFhJTkZPX1NJWkU7CisJCUFTU0VSVChwVHhCbGstPk1wZHVIZWFkZXJMZW4gPj0gMjQpOworCisJCS8vIHNraXAgODAyLjMgaGVhZGVyCisJCXBUeEJsay0+cFNyY0J1ZkRhdGEgPSBwVHhCbGstPnBTcmNCdWZIZWFkZXIgKyBMRU5HVEhfODAyXzM7CisJCXBUeEJsay0+U3JjQnVmTGVuICAtPSBMRU5HVEhfODAyXzM7CisKKwkJLy8gc2tpcCB2bGFuIHRhZworCQlpZiAoYlZMQU5Qa3QpCisJCXsKKwkJCXBUeEJsay0+cFNyY0J1ZkRhdGEJKz0gTEVOR1RIXzgwMl8xUTsKKwkJCXBUeEJsay0+U3JjQnVmTGVuCS09IExFTkdUSF84MDJfMVE7CisJCX0KKworCQkvLworCQkvLyBwYWRkaW5nIGF0IGZyb250IG9mIExMQyBoZWFkZXIKKwkJLy8gTExDIGhlYWRlciBzaG91bGQgbG9jYXRlIGF0IDQtb2N0ZXRzIGFsaWdtZW50CisJCS8vCisJCS8vIEBAQCBNcGR1SGVhZGVyTGVuIGV4Y2x1ZGluZyBwYWRkaW5nIEBAQAorCQkvLworCQlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORylwSGVhZGVyQnVmUHRyOworCQlwSGVhZGVyQnVmUHRyID0gKFBDSEFSKSBST1VORF9VUChwSGVhZGVyQnVmUHRyLCA0KTsKKwkJcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpKHBIZWFkZXJCdWZQdHIgLSBwVHhCbGstPkhkclBhZExlbik7CisKKwkJeworCisJCQkvLworCQkJLy8gSW5zZXJ0IExMQy1TTkFQIGVuY2Fwc3VsYXRpb24gLSA4IG9jdGV0cworCQkJLy8KKwkJCUVYVFJBX0xMQ1NOQVBfRU5DQVBfRlJPTV9QS1RfT0ZGU0VUKHBUeEJsay0+cFNyY0J1ZkRhdGEtMiwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApOworCQkJaWYgKHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKQorCQkJeworCQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKKwkJCQlwSGVhZGVyQnVmUHRyICs9IDY7CisJCQkJLy8gZ2V0IDIgb2N0ZXRzIChUeXBlb2ZMZW4pCisJCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmRGF0YS0yLCAyKTsKKwkJCQlwSGVhZGVyQnVmUHRyICs9IDI7CisJCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IExFTkdUSF84MDJfMV9IOworCQkJfQorCisJCX0KKworCQlpZiAocE1hY0VudHJ5LT5pc0NhY2hlZCkKKwkJeworICAgICAgICAgICAgUlRNUFdyaXRlVHhXSV9DYWNoZShwQWQsIChQVFhXSV9TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSksIHBUeEJsayk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlSVE1QV3JpdGVUeFdJX0RhdGEocEFkLCAoUFRYV0lfU1RSVUMpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0pLCBwVHhCbGspOworCisJCQlOZGlzWmVyb01lbW9yeSgoUFVDSEFSKSgmcE1hY0VudHJ5LT5DYWNoZWRCdWZbMF0pLCBzaXplb2YocE1hY0VudHJ5LT5DYWNoZWRCdWYpKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpKCZwTWFjRW50cnktPkNhY2hlZEJ1ZlswXSksIChQVUNIQVIpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0pLCAocEhlYWRlckJ1ZlB0ciAtIChQVUNIQVIpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0pKSk7CisJCQlwTWFjRW50cnktPmlzQ2FjaGVkID0gVFJVRTsKKwkJfQorCisJCS8vIGNhbGN1bGF0ZSBUcmFuc21pdHRlZCBBTVBEVSBjb3VudCBhbmQgQnl0ZUNvdW50CisJCXsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRNUERVc0luQU1QRFVDb3VudC51Lkxvd1BhcnQgKys7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkT2N0ZXRzSW5BTVBEVUNvdW50LlF1YWRQYXJ0ICs9IHBUeEJsay0+U3JjQnVmTGVuOworCQl9CisKKwkJLy9GcmVlTnVtYmVyID0gR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOworCisJCUhBTF9Xcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIFRSVUUsICZGcmVlTnVtYmVyKTsKKworCQkvLworCQkvLyBLaWNrIG91dCBUeAorCQkvLworCQlIQUxfS2lja091dFR4KHBBZCwgcFR4QmxrLCBwVHhCbGstPlF1ZUlkeCk7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOworCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RG9uZUNvdW50Kys7CisJfQorCit9CisKKworVk9JRCBTVEFfQU1TRFVfRnJhbWVfVHgoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JVFhfQkxLCQkJKnBUeEJsaykKK3sKKwlQVUNIQVIJCQlwSGVhZGVyQnVmUHRyOworCVVTSE9SVAkJCUZyZWVOdW1iZXI7CisJVVNIT1JUCQkJc3ViRnJhbWVQYXlsb2FkTGVuID0gMDsJLy8gQU1TRFUgU3ViZnJhbWUgbGVuZ3RoIHdpdGhvdXQgQU1TRFUtSGVhZGVyIC8gUGFkZGluZy4KKwlVU0hPUlQJCQl0b3RhbE1QRFVTaXplPTA7CisJVUNIQVIJCQkqc3ViRnJhbWVIZWFkZXI7CisJVUNIQVIJCQlwYWRkaW5nID0gMDsKKwlVU0hPUlQJCQlGaXJzdFR4ID0gMCwgTGFzdFR4SWR4ID0gMDsKKwlCT09MRUFOCQkJYlZMQU5Qa3Q7CisJaW50IAkJCWZyYW1lTnVtID0gMDsKKwlQUVVFVUVfRU5UUlkJcFFFbnRyeTsKKworCisJQVNTRVJUKHBUeEJsayk7CisKKwlBU1NFUlQoKHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlciA+IDEpKTsKKworCXdoaWxlKHBUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQpCisJeworCQlwUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7CisJCXBUeEJsay0+cFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKKwkJaWYgKFJUTVBfRmlsbFR4QmxrSW5mbyhwQWQsIHBUeEJsaykgIT0gVFJVRSkKKwkJeworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWJWTEFOUGt0ID0gKFJUTVBfR0VUX1BBQ0tFVF9WTEFOKHBUeEJsay0+cFBhY2tldCkgPyBUUlVFIDogRkFMU0UpOworCisJCS8vIHNraXAgODAyLjMgaGVhZGVyCisJCXBUeEJsay0+cFNyY0J1ZkRhdGEgPSBwVHhCbGstPnBTcmNCdWZIZWFkZXIgKyBMRU5HVEhfODAyXzM7CisJCXBUeEJsay0+U3JjQnVmTGVuICAtPSBMRU5HVEhfODAyXzM7CisKKwkJLy8gc2tpcCB2bGFuIHRhZworCQlpZiAoYlZMQU5Qa3QpCisJCXsKKwkJCXBUeEJsay0+cFNyY0J1ZkRhdGEJKz0gTEVOR1RIXzgwMl8xUTsKKwkJCXBUeEJsay0+U3JjQnVmTGVuCS09IExFTkdUSF84MDJfMVE7CisJCX0KKworCQlpZiAoZnJhbWVOdW0gPT0gMCkKKwkJeworCQkJcEhlYWRlckJ1ZlB0ciA9IFNUQV9CdWlsZF9BTVNEVV9GcmFtZV9IZWFkZXIocEFkLCBwVHhCbGspOworCisJCQkvLyBOT1RFOiBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQgd2lsbCBiZSB1cGRhdGVkIGFmdGVyIGZpbmFsIGZyYW1lIHdhcyBoYW5kbGVkLgorCQkJUlRNUFdyaXRlVHhXSV9EYXRhKHBBZCwgKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwgcFR4QmxrKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBIZWFkZXJCdWZQdHIgPSAmcFR4QmxrLT5IZWFkZXJCdWZbMF07CisJCQlwYWRkaW5nID0gUk9VTkRfVVAoTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCArIHN1YkZyYW1lUGF5bG9hZExlbiwgNCkgLSAoTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCArIHN1YkZyYW1lUGF5bG9hZExlbik7CisJCQlOZGlzWmVyb01lbW9yeShwSGVhZGVyQnVmUHRyLCBwYWRkaW5nICsgTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCk7CisJCQlwSGVhZGVyQnVmUHRyICs9IHBhZGRpbmc7CisJCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gPSBwYWRkaW5nOworCQl9CisKKwkJLy8KKwkJLy8gQS1NU0RVIHN1YmZyYW1lCisJCS8vICAgREEoNikrU0EoNikrTGVuZ3RoKDIpICsgTExDL1NOQVAgRW5jYXAKKwkJLy8KKwkJc3ViRnJhbWVIZWFkZXIgPSBwSGVhZGVyQnVmUHRyOworCQlzdWJGcmFtZVBheWxvYWRMZW4gPSBwVHhCbGstPlNyY0J1ZkxlbjsKKworCQlOZGlzTW92ZU1lbW9yeShzdWJGcmFtZUhlYWRlciwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyLCAxMik7CisKKworCQlwSGVhZGVyQnVmUHRyICs9IExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQ7CisJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEOworCisKKwkJLy8KKwkJLy8gSW5zZXJ0IExMQy1TTkFQIGVuY2Fwc3VsYXRpb24gLSA4IG9jdGV0cworCQkvLworCQlFWFRSQV9MTENTTkFQX0VOQ0FQX0ZST01fUEtUX09GRlNFVChwVHhCbGstPnBTcmNCdWZEYXRhLTIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKTsKKworCQlzdWJGcmFtZVBheWxvYWRMZW4gPSBwVHhCbGstPlNyY0J1ZkxlbjsKKworCQlpZiAocFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApCisJCXsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKKwkJCXBIZWFkZXJCdWZQdHIgKz0gNjsKKwkJCS8vIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKQorCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmRGF0YS0yLCAyKTsKKwkJCXBIZWFkZXJCdWZQdHIgKz0gMjsKKwkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSBMRU5HVEhfODAyXzFfSDsKKwkJCXN1YkZyYW1lUGF5bG9hZExlbiArPSBMRU5HVEhfODAyXzFfSDsKKwkJfQorCisJCS8vIHVwZGF0ZSBzdWJGcmFtZSBMZW5ndGggZmllbGQKKwkJc3ViRnJhbWVIZWFkZXJbMTJdID0gKHN1YkZyYW1lUGF5bG9hZExlbiAmIDB4RkYwMCkgPj4gODsKKwkJc3ViRnJhbWVIZWFkZXJbMTNdID0gc3ViRnJhbWVQYXlsb2FkTGVuICYgMHhGRjsKKworCQl0b3RhbE1QRFVTaXplICs9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+U3JjQnVmTGVuOworCisJCWlmIChmcmFtZU51bSA9PTApCisJCQlGaXJzdFR4ID0gSEFMX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFtZU51bSwgJkZyZWVOdW1iZXIpOworCQllbHNlCisJCQlMYXN0VHhJZHggPSBIQUxfV3JpdGVNdWx0aVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYW1lTnVtLCAmRnJlZU51bWJlcik7CisKKwkJZnJhbWVOdW0rKzsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQrKzsKKworCQkvLyBjYWxjdWxhdGUgVHJhbnNtaXR0ZWQgQU1TRFUgQ291bnQgYW5kIEJ5dGVDb3VudAorCQl7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1TRFVDb3VudC51Lkxvd1BhcnQgKys7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkT2N0ZXRzSW5BTVNEVS5RdWFkUGFydCArPSB0b3RhbE1QRFVTaXplOworCQl9CisKKwl9CisKKwlIQUxfRmluYWxXcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIHRvdGFsTVBEVVNpemUsIEZpcnN0VHgpOworCUhBTF9MYXN0VHhJZHgocEFkLCBwVHhCbGstPlF1ZUlkeCwgTGFzdFR4SWR4KTsKKworCS8vCisJLy8gS2ljayBvdXQgVHgKKwkvLworCUhBTF9LaWNrT3V0VHgocEFkLCBwVHhCbGssIHBUeEJsay0+UXVlSWR4KTsKK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworVk9JRCBTVEFfTGVnYWN5X0ZyYW1lX1R4KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVRYX0JMSwkJCSpwVHhCbGspCit7CisJSEVBREVSXzgwMl8xMQkqcEhlYWRlcl84MDJfMTE7CisJUFVDSEFSCQkJcEhlYWRlckJ1ZlB0cjsKKwlVU0hPUlQJCQlGcmVlTnVtYmVyOworCUJPT0xFQU4JCQliVkxBTlBrdDsKKwlQUVVFVUVfRU5UUlkJcFFFbnRyeTsKKworCUFTU0VSVChwVHhCbGspOworCisKKwlwUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7CisJcFR4QmxrLT5wUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBRRW50cnkpOworCWlmIChSVE1QX0ZpbGxUeEJsa0luZm8ocEFkLCBwVHhCbGspICE9IFRSVUUpCisJeworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX01DQVNUX0ZSQU1FKQorCXsKKwkJSU5DX0NPVU5URVI2NChwQWQtPldsYW5Db3VudGVycy5NdWx0aWNhc3RUcmFuc21pdHRlZEZyYW1lQ291bnQpOworCX0KKworCWlmIChSVE1QX0dFVF9QQUNLRVRfUlRTKHBUeEJsay0+cFBhY2tldCkpCisJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iUnRzUmVxdWlyZWQpOworCWVsc2UKKwkJVFhfQkxLX0NMRUFSX0ZMQUcocFR4QmxrLCBmVFhfYlJ0c1JlcXVpcmVkKTsKKworCWJWTEFOUGt0ID0gKFJUTVBfR0VUX1BBQ0tFVF9WTEFOKHBUeEJsay0+cFBhY2tldCkgPyBUUlVFIDogRkFMU0UpOworCisJaWYgKHBUeEJsay0+VHhSYXRlIDwgcEFkLT5Db21tb25DZmcuTWluVHhSYXRlKQorCQlwVHhCbGstPlR4UmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZTsKKworCVNUQUZpbmRDaXBoZXJBbGdvcml0aG0ocEFkLCBwVHhCbGspOworCVNUQUJ1aWxkQ29tbW9uODAyXzExSGVhZGVyKHBBZCwgcFR4QmxrKTsKKworCisJLy8gc2tpcCA4MDIuMyBoZWFkZXIKKwlwVHhCbGstPnBTcmNCdWZEYXRhID0gcFR4QmxrLT5wU3JjQnVmSGVhZGVyICsgTEVOR1RIXzgwMl8zOworCXBUeEJsay0+U3JjQnVmTGVuICAtPSBMRU5HVEhfODAyXzM7CisKKwkvLyBza2lwIHZsYW4gdGFnCisJaWYgKGJWTEFOUGt0KQorCXsKKwkJcFR4QmxrLT5wU3JjQnVmRGF0YQkrPSBMRU5HVEhfODAyXzFROworCQlwVHhCbGstPlNyY0J1ZkxlbgktPSBMRU5HVEhfODAyXzFROworCX0KKworCXBIZWFkZXJCdWZQdHIgPSAmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdOworCXBIZWFkZXJfODAyXzExID0gKEhFQURFUl84MDJfMTEgKikgcEhlYWRlckJ1ZlB0cjsKKworCS8vIHNraXAgY29tbW9uIGhlYWRlcgorCXBIZWFkZXJCdWZQdHIgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuOworCisJaWYgKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYldNTSkpCisJeworCQkvLworCQkvLyBidWlsZCBRT1MgQ29udHJvbCBieXRlcworCQkvLworCQkqcEhlYWRlckJ1ZlB0ciA9IChwVHhCbGstPlVzZXJQcmlvcml0eSAmIDB4MEYpOworCQkqKHBIZWFkZXJCdWZQdHIrMSkgPSAwOworCQlwSGVhZGVyQnVmUHRyICs9MjsKKwkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IDI7CisJfQorCisJLy8gVGhlIHJlbWFpbmluZyBjb250ZW50IG9mIE1QRFUgaGVhZGVyIHNob3VsZCBsb2NhdGUgYXQgNC1vY3RldHMgYWxpZ21lbnQKKwlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORylwSGVhZGVyQnVmUHRyOworCXBIZWFkZXJCdWZQdHIgPSAoUENIQVIpIFJPVU5EX1VQKHBIZWFkZXJCdWZQdHIsIDQpOworCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKShwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZHJQYWRMZW4pOworCisJeworCisJCS8vCisJCS8vIEluc2VydCBMTEMtU05BUCBlbmNhcHN1bGF0aW9uIC0gOCBvY3RldHMKKwkJLy8KKwkJLy8KKyAgIAkJLy8gaWYgb3JpZ2luYWwgRXRoZXJuZXQgZnJhbWUgY29udGFpbnMgbm8gTExDL1NOQVAsCisJCS8vIHRoZW4gYW4gZXh0cmEgTExDL1NOQVAgZW5jYXAgaXMgcmVxdWlyZWQKKwkJLy8KKwkJRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9TVEFSVChwVHhCbGstPnBTcmNCdWZIZWFkZXIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKTsKKwkJaWYgKHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKQorCQl7CisJCQlVQ0hBUiB2bGFuX3NpemU7CisKKwkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKKwkJCXBIZWFkZXJCdWZQdHIgKz0gNjsKKwkJCS8vIHNraXAgdmxhbiB0YWcKKwkJCXZsYW5fc2l6ZSA9ICAoYlZMQU5Qa3QpID8gTEVOR1RIXzgwMl8xUSA6IDA7CisJCQkvLyBnZXQgMiBvY3RldHMgKFR5cGVvZkxlbikKKwkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcisxMit2bGFuX3NpemUsIDIpOworCQkJcEhlYWRlckJ1ZlB0ciArPSAyOworCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IExFTkdUSF84MDJfMV9IOworCQl9CisKKwl9CisKKwkvLworCS8vIHByZXBhcmUgZm9yIFRYV0kKKwkvLyB1c2UgV2NpZCBhcyBLZXkgSW5kZXgKKwkvLworCisJUlRNUFdyaXRlVHhXSV9EYXRhKHBBZCwgKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwgcFR4QmxrKTsKKworCS8vRnJlZU51bWJlciA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKKworCUhBTF9Xcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIFRSVUUsICZGcmVlTnVtYmVyKTsKKworCXBBZC0+UmFsaW5rQ291bnRlcnMuS2lja1R4Q291bnQrKzsKKwlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RG9uZUNvdW50Kys7CisKKwkvLworCS8vIEtpY2sgb3V0IFR4CisJLy8KKwlIQUxfS2lja091dFR4KHBBZCwgcFR4QmxrLCBwVHhCbGstPlF1ZUlkeCk7Cit9CisKKworVk9JRCBTVEFfQVJhbGlua19GcmFtZV9UeCgKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglUWF9CTEsJCQkqcFR4QmxrKQoreworCVBVQ0hBUgkJCXBIZWFkZXJCdWZQdHI7CisJVVNIT1JUCQkJRnJlZU51bWJlcjsKKwlVU0hPUlQJCQl0b3RhbE1QRFVTaXplPTA7CisJVVNIT1JUCQkJRmlyc3RUeCwgTGFzdFR4SWR4OworCWludCAJCQlmcmFtZU51bSA9IDA7CisJQk9PTEVBTgkJCWJWTEFOUGt0OworCVBRVUVVRV9FTlRSWQlwUUVudHJ5OworCisKKwlBU1NFUlQocFR4QmxrKTsKKworCUFTU0VSVCgocFR4QmxrLT5UeFBhY2tldExpc3QuTnVtYmVyPT0gMikpOworCisKKwlGaXJzdFR4ID0gTGFzdFR4SWR4ID0gMDsgIC8vIElzIGl0IG9rIGluaXQgdGhleSBhcyAwPworCXdoaWxlKHBUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQpCisJeworCQlwUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7CisJCXBUeEJsay0+cFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKKworCQlpZiAoUlRNUF9GaWxsVHhCbGtJbmZvKHBBZCwgcFR4QmxrKSAhPSBUUlVFKQorCQl7CisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJYlZMQU5Qa3QgPSAoUlRNUF9HRVRfUEFDS0VUX1ZMQU4ocFR4QmxrLT5wUGFja2V0KSA/IFRSVUUgOiBGQUxTRSk7CisKKwkJLy8gc2tpcCA4MDIuMyBoZWFkZXIKKwkJcFR4QmxrLT5wU3JjQnVmRGF0YSA9IHBUeEJsay0+cFNyY0J1ZkhlYWRlciArIExFTkdUSF84MDJfMzsKKwkJcFR4QmxrLT5TcmNCdWZMZW4gIC09IExFTkdUSF84MDJfMzsKKworCQkvLyBza2lwIHZsYW4gdGFnCisJCWlmIChiVkxBTlBrdCkKKwkJeworCQkJcFR4QmxrLT5wU3JjQnVmRGF0YQkrPSBMRU5HVEhfODAyXzFROworCQkJcFR4QmxrLT5TcmNCdWZMZW4JLT0gTEVOR1RIXzgwMl8xUTsKKwkJfQorCisJCWlmIChmcmFtZU51bSA9PSAwKQorCQl7CS8vIEZvciBmaXJzdCBmcmFtZSwgd2UgbmVlZCB0byBjcmVhdGUgdGhlIDgwMi4xMSBoZWFkZXIgKyBwYWRkaW5nKG9wdGlvbmFsKSArIFJBLUFHRy1MRU4gKyBTTkFQIEhlYWRlcgorCisJCQlwSGVhZGVyQnVmUHRyID0gU1RBX0J1aWxkX0FSYWxpbmtfRnJhbWVfSGVhZGVyKHBBZCwgcFR4QmxrKTsKKworCQkJLy8gSXQncyBvayB3cml0ZSB0aGUgVHhXSSBoZXJlLCBiZWNhdXNlIHRoZSBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQKKwkJCS8vCXdpbGwgYmUgdXBkYXRlZCBhZnRlciBmaW5hbCBmcmFtZSB3YXMgaGFuZGxlZC4KKwkJCVJUTVBXcml0ZVR4V0lfRGF0YShwQWQsIChQVFhXSV9TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSksIHBUeEJsayk7CisKKworCQkJLy8KKwkJCS8vIEluc2VydCBMTEMtU05BUCBlbmNhcHN1bGF0aW9uIC0gOCBvY3RldHMKKwkJCS8vCisJCQlFWFRSQV9MTENTTkFQX0VOQ0FQX0ZST01fUEtUX09GRlNFVChwVHhCbGstPnBTcmNCdWZEYXRhLTIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKTsKKworCQkJaWYgKHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKQorCQkJeworCQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKKwkJCQlwSGVhZGVyQnVmUHRyICs9IDY7CisJCQkJLy8gZ2V0IDIgb2N0ZXRzIChUeXBlb2ZMZW4pCisJCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmRGF0YS0yLCAyKTsKKwkJCQlwSGVhZGVyQnVmUHRyICs9IDI7CisJCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IExFTkdUSF84MDJfMV9IOworCQkJfQorCQl9CisJCWVsc2UKKwkJewkvLyBGb3Igc2Vjb25kIGFnZ3JlZ2F0ZWQgZnJhbWUsIHdlIG5lZWQgY3JlYXRlIHRoZSA4MDIuMyBoZWFkZXIgdG8gaGVhZGVyQnVmLCBiZWNhdXNlIFBDSSB3aWxsIGNvcHkgaXQgdG8gU0RQdHIwLgorCisJCQlwSGVhZGVyQnVmUHRyID0gJnBUeEJsay0+SGVhZGVyQnVmWzBdOworCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuID0gMDsKKworCQkJLy8gQS1SYWxpbmsgc3ViLXNlcXVlbnQgZnJhbWUgaGVhZGVyIGlzIHRoZSBzYW1lIGFzIDgwMi4zIGhlYWRlci4KKwkJCS8vICAgREEoNikrU0EoNikrRnJhbWVUeXBlKDIpCisJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIsIDEyKTsKKwkJCXBIZWFkZXJCdWZQdHIgKz0gMTI7CisJCQkvLyBnZXQgMiBvY3RldHMgKFR5cGVvZkxlbikKKwkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cFNyY0J1ZkRhdGEtMiwgMik7CisJCQlwSGVhZGVyQnVmUHRyICs9IDI7CisJCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gPSBMRU5HVEhfQVJBTElOS19TVUJGUkFNRUhFQUQ7CisJCX0KKworCQl0b3RhbE1QRFVTaXplICs9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+U3JjQnVmTGVuOworCisJCS8vRnJlZU51bWJlciA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKKwkJaWYgKGZyYW1lTnVtID09MCkKKwkJCUZpcnN0VHggPSBIQUxfV3JpdGVNdWx0aVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYW1lTnVtLCAmRnJlZU51bWJlcik7CisJCWVsc2UKKwkJCUxhc3RUeElkeCA9IEhBTF9Xcml0ZU11bHRpVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhbWVOdW0sICZGcmVlTnVtYmVyKTsKKworCQlmcmFtZU51bSsrOworCisJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhBZ2dyZWdhdGlvbkNvdW50Kys7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuS2lja1R4Q291bnQrKzsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeERvbmVDb3VudCsrOworCisJfQorCisJSEFMX0ZpbmFsV3JpdGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLCB0b3RhbE1QRFVTaXplLCBGaXJzdFR4KTsKKwlIQUxfTGFzdFR4SWR4KHBBZCwgcFR4QmxrLT5RdWVJZHgsIExhc3RUeElkeCk7CisKKwkvLworCS8vIEtpY2sgb3V0IFR4CisJLy8KKwlIQUxfS2lja091dFR4KHBBZCwgcFR4QmxrLCBwVHhCbGstPlF1ZUlkeCk7CisKK30KKworCitWT0lEIFNUQV9GcmFnbWVudF9GcmFtZV9UeCgKKwlJTiBSVE1QX0FEQVBURVIgKnBBZCwKKwlJTiBUWF9CTEsJCSpwVHhCbGspCit7CisJSEVBREVSXzgwMl8xMQkqcEhlYWRlcl84MDJfMTE7CisJUFVDSEFSCQkJcEhlYWRlckJ1ZlB0cjsKKwlVU0hPUlQJCQlGcmVlTnVtYmVyOworCVVDSEFSIAkJCWZyYWdOdW0gPSAwOworCVBBQ0tFVF9JTkZPCQlQYWNrZXRJbmZvOworCVVTSE9SVAkJCUVuY3J5cHRpb25PdmVyaGVhZCA9IDA7CisJVUlOVDMyCQkJRnJlZU1wZHVTaXplLCBTcmNSZW1haW5pbmdCeXRlczsKKwlVU0hPUlQJCQlBY2tEdXJhdGlvbjsKKwlVSU5UIAkJCU5leHRNcGR1U2l6ZTsKKwlCT09MRUFOCQkJYlZMQU5Qa3Q7CisJUFFVRVVFX0VOVFJZCXBRRW50cnk7CisKKworCUFTU0VSVChwVHhCbGspOworCisJcFFFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QpOworCXBUeEJsay0+cFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKKwlpZiAoUlRNUF9GaWxsVHhCbGtJbmZvKHBBZCwgcFR4QmxrKSAhPSBUUlVFKQorCXsKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCXJldHVybjsKKwl9CisKKwlBU1NFUlQoVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iQWxsb3dGcmFnKSk7CisJYlZMQU5Qa3QgPSAoUlRNUF9HRVRfUEFDS0VUX1ZMQU4ocFR4QmxrLT5wUGFja2V0KSA/IFRSVUUgOiBGQUxTRSk7CisKKwlTVEFGaW5kQ2lwaGVyQWxnb3JpdGhtKHBBZCwgcFR4QmxrKTsKKwlTVEFCdWlsZENvbW1vbjgwMl8xMUhlYWRlcihwQWQsIHBUeEJsayk7CisKKwlpZiAocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApCisJeworCQlwVHhCbGstPnBQYWNrZXQgPSBkdXBsaWNhdGVfcGt0X3dpdGhfVEtJUF9NSUMocEFkLCBwVHhCbGstPnBQYWNrZXQpOworCQlpZiAocFR4QmxrLT5wUGFja2V0ID09IE5VTEwpCisJCQlyZXR1cm47CisJCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBUeEJsay0+cFBhY2tldCwgJlBhY2tldEluZm8sICZwVHhCbGstPnBTcmNCdWZIZWFkZXIsICZwVHhCbGstPlNyY0J1Zkxlbik7CisJfQorCisJLy8gc2tpcCA4MDIuMyBoZWFkZXIKKwlwVHhCbGstPnBTcmNCdWZEYXRhID0gcFR4QmxrLT5wU3JjQnVmSGVhZGVyICsgTEVOR1RIXzgwMl8zOworCXBUeEJsay0+U3JjQnVmTGVuICAtPSBMRU5HVEhfODAyXzM7CisKKworCS8vIHNraXAgdmxhbiB0YWcKKwlpZiAoYlZMQU5Qa3QpCisJeworCQlwVHhCbGstPnBTcmNCdWZEYXRhCSs9IExFTkdUSF84MDJfMVE7CisJCXBUeEJsay0+U3JjQnVmTGVuCS09IExFTkdUSF84MDJfMVE7CisJfQorCisJcEhlYWRlckJ1ZlB0ciA9ICZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRSArIFRYV0lfU0laRV07CisJcEhlYWRlcl84MDJfMTEgPSAoSEVBREVSXzgwMl8xMSAqKXBIZWFkZXJCdWZQdHI7CisKKworCS8vIHNraXAgY29tbW9uIGhlYWRlcgorCXBIZWFkZXJCdWZQdHIgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuOworCisJaWYgKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYldNTSkpCisJeworCQkvLworCQkvLyBidWlsZCBRT1MgQ29udHJvbCBieXRlcworCQkvLworCQkqcEhlYWRlckJ1ZlB0ciA9IChwVHhCbGstPlVzZXJQcmlvcml0eSAmIDB4MEYpOworCisJCSoocEhlYWRlckJ1ZlB0cisxKSA9IDA7CisJCXBIZWFkZXJCdWZQdHIgKz0yOworCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gMjsKKwl9CisKKwkvLworCS8vIHBhZGRpbmcgYXQgZnJvbnQgb2YgTExDIGhlYWRlcgorCS8vIExMQyBoZWFkZXIgc2hvdWxkIGxvY2F0ZSBhdCA0LW9jdGV0cyBhbGlnbWVudAorCS8vCisJcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpcEhlYWRlckJ1ZlB0cjsKKwlwSGVhZGVyQnVmUHRyID0gKFBDSEFSKSBST1VORF9VUChwSGVhZGVyQnVmUHRyLCA0KTsKKwlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORykocEhlYWRlckJ1ZlB0ciAtIHBUeEJsay0+SGRyUGFkTGVuKTsKKworCisKKwkvLworCS8vIEluc2VydCBMTEMtU05BUCBlbmNhcHN1bGF0aW9uIC0gOCBvY3RldHMKKwkvLworCS8vCisgICAJLy8gaWYgb3JpZ2luYWwgRXRoZXJuZXQgZnJhbWUgY29udGFpbnMgbm8gTExDL1NOQVAsCisJLy8gdGhlbiBhbiBleHRyYSBMTEMvU05BUCBlbmNhcCBpcyByZXF1aXJlZAorCS8vCisJRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9TVEFSVChwVHhCbGstPnBTcmNCdWZIZWFkZXIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKTsKKwlpZiAocFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApCisJeworCQlVQ0hBUiB2bGFuX3NpemU7CisKKwkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXAsIDYpOworCQlwSGVhZGVyQnVmUHRyICs9IDY7CisJCS8vIHNraXAgdmxhbiB0YWcKKwkJdmxhbl9zaXplID0gIChiVkxBTlBrdCkgPyBMRU5HVEhfODAyXzFRIDogMDsKKwkJLy8gZ2V0IDIgb2N0ZXRzIChUeXBlb2ZMZW4pCisJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcisxMit2bGFuX3NpemUsIDIpOworCQlwSGVhZGVyQnVmUHRyICs9IDI7CisJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSBMRU5HVEhfODAyXzFfSDsKKwl9CisKKworCS8vIElmIFRLSVAgaXMgdXNlZCBhbmQgZnJhZ21lbnRhdGlvbiBpcyByZXF1aXJlZC4gRHJpdmVyIGhhcyB0bworCS8vCWFwcGVuZCBUS0lQIE1JQyBhdCB0YWlsIG9mIHRoZSBzY2F0dGVyIGJ1ZmZlcgorCS8vCU1BQyBBU0lDIHdpbGwgb25seSBwZXJmb3JtIElWL0VJVi9JQ1YgaW5zZXJ0aW9uIGJ1dCBubyBUS0lQIE1JQworCWlmIChwVHhCbGstPkNpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkKKwl7CisKKwkJLy8gTk9URTogRE9OJ1QgcmVmZXIgdGhlIHNrYi0+bGVuIGRpcmVjdGx5IGFmdGVyIGZvbGxvd2luZyBjb3B5LiBCZWNhc3VlIHRoZSBsZW5ndGggaXMgbm90IGFkanVzdAorCQkvLwkJCXRvIGNvcnJlY3QgbGVuZ2h0LCByZWZlciB0byBwVHhCbGstPlNyY0J1ZkxlbiBmb3IgdGhlIHBhY2tldCBsZW5ndGggaW4gZm9sbG93aW5nIHByb2dyZXNzLgorCQlOZGlzTW92ZU1lbW9yeShwVHhCbGstPnBTcmNCdWZEYXRhICsgcFR4QmxrLT5TcmNCdWZMZW4sICZwQWQtPlByaXZhdGVJbmZvLlR4Lk1JQ1swXSwgOCk7CisJCS8vc2tiX3B1dCgoUlRQS1RfVE9fT1NQS1QocFR4QmxrLT5wUGFja2V0KSktPnRhaWwsIDgpOworCQlwVHhCbGstPlNyY0J1ZkxlbiArPSA4OworCQlwVHhCbGstPlRvdGFsRnJhbWVMZW4gKz0gODsKKwkJcFR4QmxrLT5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUF9OT19NSUM7CisJfQorCisJLy8KKwkvLyBjYWxjdWF0ZSB0aGUgb3ZlcmhlYWQgYnl0ZXMgdGhhdCBlbmNyeXB0aW9uIGFsZ29yaXRobSBtYXkgYWRkLiBUaGlzCisJLy8gYWZmZWN0cyB0aGUgY2FsY3VsYXRlIG9mICJkdXJhdGlvbiIgZmllbGQKKwkvLworCWlmICgocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDY0KSB8fCAocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDEyOCkpCisJCUVuY3J5cHRpb25PdmVyaGVhZCA9IDg7IC8vV0VQOiBJVls0XSArIElDVls0XTsKKwllbHNlIGlmIChwVHhCbGstPkNpcGhlckFsZyA9PSBDSVBIRVJfVEtJUF9OT19NSUMpCisJCUVuY3J5cHRpb25PdmVyaGVhZCA9IDEyOy8vVEtJUDogSVZbNF0gKyBFSVZbNF0gKyBJQ1ZbNF0sIE1JQyB3aWxsIGJlIGFkZGVkIHRvIFRvdGFsUGFja2V0TGVuZ3RoCisJZWxzZSBpZiAocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApCisJCUVuY3J5cHRpb25PdmVyaGVhZCA9IDIwOy8vVEtJUDogSVZbNF0gKyBFSVZbNF0gKyBJQ1ZbNF0gKyBNSUNbOF0KKwllbHNlIGlmIChwVHhCbGstPkNpcGhlckFsZyA9PSBDSVBIRVJfQUVTKQorCQlFbmNyeXB0aW9uT3ZlcmhlYWQgPSAxNjsJLy8gQUVTOiBJVls0XSArIEVJVls0XSArIE1JQ1s4XQorCWVsc2UKKwkJRW5jcnlwdGlvbk92ZXJoZWFkID0gMDsKKworCS8vIGRlY2lkZSBob3cgbXVjaCB0aW1lIGFuIEFDSy9DVFMgZnJhbWUgd2lsbCBjb25zdW1lIGluIHRoZSBhaXIKKwlBY2tEdXJhdGlvbiA9IFJUTVBDYWxjRHVyYXRpb24ocEFkLCBwQWQtPkNvbW1vbkNmZy5FeHBlY3RlZEFDS1JhdGVbcFR4QmxrLT5UeFJhdGVdLCAxNCk7CisKKwkvLyBJbml0IHRoZSB0b3RhbCBwYXlsb2FkIGxlbmd0aCBvZiB0aGlzIGZyYW1lLgorCVNyY1JlbWFpbmluZ0J5dGVzID0gcFR4QmxrLT5TcmNCdWZMZW47CisKKwlwVHhCbGstPlRvdGFsRnJhZ051bSA9IDB4ZmY7CisKKwlkbyB7CisKKwkJRnJlZU1wZHVTaXplID0gcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgLSBMRU5HVEhfQ1JDOworCisJCUZyZWVNcGR1U2l6ZSAtPSBwVHhCbGstPk1wZHVIZWFkZXJMZW47CisKKwkJaWYgKFNyY1JlbWFpbmluZ0J5dGVzIDw9IEZyZWVNcGR1U2l6ZSkKKwkJewkvLyB0aGlzIGlzIHRoZSBsYXN0IG9yIG9ubHkgZnJhZ21lbnQKKworCQkJcFR4QmxrLT5TcmNCdWZMZW4gPSBTcmNSZW1haW5pbmdCeXRlczsKKworCQkJcEhlYWRlcl84MDJfMTEtPkZDLk1vcmVGcmFnID0gMDsKKwkJCXBIZWFkZXJfODAyXzExLT5EdXJhdGlvbiA9IHBBZC0+Q29tbW9uQ2ZnLkRzaWZzICsgQWNrRHVyYXRpb247CisKKwkJCS8vIEluZGljYXRlIHRoZSBsb3dlciBsYXllciB0aGF0IHRoaXMncyB0aGUgbGFzdCBmcmFnbWVudC4KKwkJCXBUeEJsay0+VG90YWxGcmFnTnVtID0gZnJhZ051bTsKKwkJfQorCQllbHNlCisJCXsJLy8gbW9yZSBmcmFnbWVudCBpcyByZXF1aXJlZAorCisJCQlwVHhCbGstPlNyY0J1ZkxlbiA9IEZyZWVNcGR1U2l6ZTsKKworCQkJTmV4dE1wZHVTaXplID0gbWluKCgoVUlOVClTcmNSZW1haW5pbmdCeXRlcyAtIHBUeEJsay0+U3JjQnVmTGVuKSwgKChVSU5UKXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkKSk7CisJCQlwSGVhZGVyXzgwMl8xMS0+RkMuTW9yZUZyYWcgPSAxOworCQkJcEhlYWRlcl84MDJfMTEtPkR1cmF0aW9uID0gKDMgKiBwQWQtPkNvbW1vbkNmZy5Ec2lmcykgKyAoMiAqIEFja0R1cmF0aW9uKSArIFJUTVBDYWxjRHVyYXRpb24ocEFkLCBwVHhCbGstPlR4UmF0ZSwgTmV4dE1wZHVTaXplICsgRW5jcnlwdGlvbk92ZXJoZWFkKTsKKwkJfQorCisJCWlmIChmcmFnTnVtID09IDApCisJCQlwVHhCbGstPkZyYW1lR2FwID0gSUZTX0hUVFhPUDsKKwkJZWxzZQorCQkJcFR4QmxrLT5GcmFtZUdhcCA9IElGU19TSUZTOworCisJCVJUTVBXcml0ZVR4V0lfRGF0YShwQWQsIChQVFhXSV9TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSksIHBUeEJsayk7CisKKwkJSEFMX1dyaXRlRnJhZ1R4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYWdOdW0sICZGcmVlTnVtYmVyKTsKKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQrKzsKKworCQkvLyBVcGRhdGUgdGhlIGZyYW1lIG51bWJlciwgcmVtYWluaW5nIHNpemUgb2YgdGhlIE5ESVMgcGFja2V0IHBheWxvYWQuCisKKwkJLy8gc3BhY2UgZm9yIDgwMi4xMSBoZWFkZXIuCisJCWlmIChmcmFnTnVtID09IDAgJiYgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApCisJCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gLT0gTEVOR1RIXzgwMl8xX0g7CisKKwkJZnJhZ051bSsrOworCQlTcmNSZW1haW5pbmdCeXRlcyAtPSBwVHhCbGstPlNyY0J1ZkxlbjsKKwkJcFR4QmxrLT5wU3JjQnVmRGF0YSArPSBwVHhCbGstPlNyY0J1ZkxlbjsKKworCQlwSGVhZGVyXzgwMl8xMS0+RnJhZysrOwkgLy8gaW5jcmVhc2UgRnJhZyAjCisKKwl9d2hpbGUoU3JjUmVtYWluaW5nQnl0ZXMgPiAwKTsKKworCS8vCisJLy8gS2ljayBvdXQgVHgKKwkvLworCUhBTF9LaWNrT3V0VHgocEFkLCBwVHhCbGssIHBUeEJsay0+UXVlSWR4KTsKK30KKworCisjZGVmaW5lIFJFTEVBU0VfRlJBTUVTX09GX1RYQkxLKF9wQWQsIF9wVHhCbGssIF9wUUVudHJ5LCBfU3RhdHVzKSAJCQkJCQkJCQkJXAorCQl3aGlsZShfcFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZCkJCQkJCQkJCQkJCQkJCVwKKwkJewkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJCQlfcFFFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZSgmX3BUeEJsay0+VHhQYWNrZXRMaXN0KTsJCQkJCQkJCQlcCisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKF9wQWQsIFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChfcFFFbnRyeSksIF9TdGF0dXMpOwlcCisJCX0KKworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ29weSBmcmFtZSBmcm9tIHdhaXRpbmcgcXVldWUgaW50byByZWxhdGl2ZSByaW5nIGJ1ZmZlciBhbmQgc2V0CisJYXBwcm9wcmlhdGUgQVNJQyByZWdpc3RlciB0byBraWNrIGhhcmR3YXJlIGVuY3J5cHRpb24gYmVmb3JlIHJlYWxseQorCXNlbnQgb3V0IHRvIGFpci4KKworCUFyZ3VtZW50czoKKwkJcEFkIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisJCVBORElTX1BBQ0tFVAlQb2ludGVyIHRvIG91dGdvaW5nIE5kaXMgZnJhbWUKKwkJTnVtYmVyT2ZGcmFnCU51bWJlciBvZiBmcmFnbWVudCByZXF1aXJlZAorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitORElTX1NUQVRVUyBTVEFIYXJkVHJhbnNtaXQoCisJSU4gUFJUTVBfQURBUFRFUglwQWQsCisJSU4gVFhfQkxLIAkJCSpwVHhCbGssCisJSU4JVUNIQVIJCQlRdWVJZHgpCit7CisJTkRJU19QQUNLRVQJCSpwUGFja2V0OworCVBRVUVVRV9FTlRSWQlwUUVudHJ5OworCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gU1RFUCAwLiBETyBTQU5JVFkgQ0hFQ0sgQU5EIFNPTUUgRUFSTFkgUFJFUEFSQVRJT04uCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8KKwlBU1NFUlQocFR4QmxrLT5UeFBhY2tldExpc3QuTnVtYmVyKTsKKwlpZiAocFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZCA9PSBOVUxMKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgicFR4QmxrLT5Ub3RhbEZyYW1lTnVtID09ICVsZCFcbiIsIHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlcikpOworCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKwlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQpOworCisjaWYgMCAvL2RlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vIFJvZ2VyIHN5bmMgQ2FycmllcgorCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID09IFRSVUUpICYmIChpc0NhcnJpZXJEZXRlY3RFeGlzdChwQWQpID09IFRSVUUpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfSU5GTywoIlNUQUhhcmRUcmFuc21pdCAtLT4gcmFkYXIgZGV0ZWN0IG5vdCBpbiBub3JtYWwgbW9kZSAhISFcbiIpKTsKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisKKwkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBTVEVQIDEuIFdBS0UgVVAgUEhZCisJLy8JCW91dGdvaW5nIGZyYW1lIGFsd2F5cyB3YWtldXAgUEhZIHRvIHByZXZlbnQgZnJhbWUgbG9zdCBhbmQKKwkvLwkJdHVybiBvZmYgUFNNIGJpdCB0byBpbXByb3ZlIHBlcmZvcm1hbmNlCisJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gbm90IHRvIGNoYW5nZSBQU00gYml0LCBqdXN0IHNlbmQgdGhpcyBmcmFtZSBvdXQ/CisJaWYgKChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpICYmIE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCisJeworCSAgICBEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQXNpY0ZvcmNlV2FrZXVwIEF0IEhhcmRUeFxuIikpOworCQlBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKKwl9CisKKwkvLyBJdCBzaG91bGQgbm90IGNoYW5nZSBQU00gYml0LCB3aGVuIEFQU0QgdHVybiBvbi4KKwlpZiAoKCEocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlKSAmJiAocEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSA9PSBGQUxTRSkpCisJCXx8IChSVE1QX0dFVF9QQUNLRVRfRUFQT0wocFR4QmxrLT5wUGFja2V0KSkKKwkJfHwgKFJUTVBfR0VUX1BBQ0tFVF9XQUkocFR4QmxrLT5wUGFja2V0KSkpCisJeworCQlpZiAoKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkgJiYKKyAgICAgICAgICAgIChwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID09IE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUCkpCisJCQlNbG1lU2V0UHNtQml0KHBBZCwgUFdSX0FDVElWRSk7CisJfQorCisJc3dpdGNoIChwVHhCbGstPlR4RnJhbWVUeXBlKQorCXsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJY2FzZSBUWF9BTVBEVV9GUkFNRToKKwkJCQlTVEFfQU1QRFVfRnJhbWVfVHgocEFkLCBwVHhCbGspOworCQkJYnJlYWs7CisJCWNhc2UgVFhfQU1TRFVfRlJBTUU6CisJCQkJU1RBX0FNU0RVX0ZyYW1lX1R4KHBBZCwgcFR4QmxrKTsKKwkJCWJyZWFrOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQljYXNlIFRYX0xFR0FDWV9GUkFNRToKKwkJCQlTVEFfTGVnYWN5X0ZyYW1lX1R4KHBBZCwgcFR4QmxrKTsKKwkJCWJyZWFrOworCQljYXNlIFRYX01DQVNUX0ZSQU1FOgorCQkJCVNUQV9MZWdhY3lfRnJhbWVfVHgocEFkLCBwVHhCbGspOworCQkJYnJlYWs7CisJCWNhc2UgVFhfUkFMSU5LX0ZSQU1FOgorCQkJCVNUQV9BUmFsaW5rX0ZyYW1lX1R4KHBBZCwgcFR4QmxrKTsKKwkJCWJyZWFrOworCQljYXNlIFRYX0ZSQUdfRlJBTUU6CisJCQkJU1RBX0ZyYWdtZW50X0ZyYW1lX1R4KHBBZCwgcFR4QmxrKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJeworCQkJCS8vIEl0IHNob3VsZCBub3QgaGFwcGVuZWQhCisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2VuZCBhIHBhY2VrdCB3YXMgbm90IGNsYXNzaWZpZWQhISBJdCBzaG91bGQgbm90IGhhcHBlbiFcbiIpKTsKKwkJCQl3aGlsZShwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXIpCisJCQkJeworCQkJCQlwUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7CisJCQkJCXBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocFFFbnRyeSk7CisJCQkJCWlmIChwUGFja2V0KQorCQkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCX0KKworCXJldHVybiAoTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisKK30KKworVUxPTkcgIEhhc2hCeXRlc1BvbHlub21pYWwoVUNIQVIgKnZhbHVlLCB1bnNpZ25lZCBpbnQgbGVuKQoreworICAgdW5zaWduZWQgY2hhciAqd29yZCA9IHZhbHVlOworICAgdW5zaWduZWQgaW50IHJldCA9IDA7CisgICB1bnNpZ25lZCBpbnQgaTsKKworICAgZm9yKGk9MDsgaSA8IGxlbjsgaSsrKQorICAgeworCSAgaW50IG1vZCA9IGkgJSAzMjsKKwkgIHJldCBePSh1bnNpZ25lZCBpbnQpICh3b3JkW2ldKSA8PCBtb2Q7CisJICByZXQgXj0odW5zaWduZWQgaW50KSAod29yZFtpXSkgPj4gKDMyIC0gbW9kKTsKKyAgIH0KKyAgIHJldHVybiByZXQ7Cit9CisKK1ZPSUQgU3RhX0Fubm91bmNlX29yX0ZvcndhcmRfODAyXzNfUGFja2V0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAorCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit7CisJaWYgKFRSVUUKKwkJKQorCXsKKwkJYW5ub3VuY2VfODAyXzNfcGFja2V0KHBBZCwgcFBhY2tldCk7CisJfQorCWVsc2UKKwl7CisJCS8vIHJlbGVhc2UgcGFja2V0CisJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhL3Nhbml0eS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvc2FuaXR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM5ODcyNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhL3Nhbml0eS5jCkBAIC0wLDAgKzEsNDIwIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXNhbml0eS5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSm9obiBDaGFuZyAgMjAwNC0wOS0wMSAgICAgIGFkZCBXTU0gc3VwcG9ydAorKi8KKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworZXh0ZXJuIFVDSEFSCUNJU0NPX09VSVtdOworCitleHRlcm4gVUNIQVIJV1BBX09VSVtdOworZXh0ZXJuIFVDSEFSCVJTTl9PVUlbXTsKK2V4dGVybiBVQ0hBUglXTUVfSU5GT19FTEVNW107CitleHRlcm4gVUNIQVIJV01FX1BBUk1fRUxFTVtdOworZXh0ZXJuIFVDSEFSCUNjeDJRb3NJbmZvW107CitleHRlcm4gVUNIQVIJUkFMSU5LX09VSVtdOworZXh0ZXJuIFVDSEFSCUJST0FEQ09NX09VSVtdOworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIE1sbWVTdGFydFJlcVNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBDSEFSIFNzaWRbXSwKKyAgICBPVVQgVUNIQVIgKnBTc2lkTGVuKQoreworICAgIE1MTUVfU1RBUlRfUkVRX1NUUlVDVCAqSW5mbzsKKworICAgIEluZm8gPSAoTUxNRV9TVEFSVF9SRVFfU1RSVUNUICopKE1zZyk7CisKKyAgICBpZiAoSW5mby0+U3NpZExlbiA+IE1BWF9MRU5fT0ZfU1NJRCkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTdGFydFJlcVNhbml0eSBmYWlsIC0gd3JvbmcgU1NJRCBsZW5ndGhcbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgICpwU3NpZExlbiA9IEluZm8tPlNzaWRMZW47CisgICAgTmRpc01vdmVNZW1vcnkoU3NpZCwgSW5mby0+U3NpZCwgKnBTc2lkTGVuKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKworICAgIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBQZWVyQXNzb2NSc3BTYW5pdHkoCisgICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCisgICAgSU4gVk9JRCAqcE1zZywKKyAgICBJTiBVTE9ORyBNc2dMZW4sCisgICAgT1VUIFBVQ0hBUiBwQWRkcjIsCisgICAgT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAorICAgIE9VVCBVU0hPUlQgKnBTdGF0dXMsCisgICAgT1VUIFVTSE9SVCAqcEFpZCwKKyAgICBPVVQgVUNIQVIgU3VwUmF0ZVtdLAorICAgIE9VVCBVQ0hBUiAqcFN1cFJhdGVMZW4sCisgICAgT1VUIFVDSEFSIEV4dFJhdGVbXSwKKyAgICBPVVQgVUNIQVIgKnBFeHRSYXRlTGVuLAorICAgIE9VVCBIVF9DQVBBQklMSVRZX0lFCQkqcEh0Q2FwYWJpbGl0eSwKKyAgICBPVVQgQUREX0hUX0lORk9fSUUJCSpwQWRkSHRJbmZvLAkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKyAgICBPVVQgVUNIQVIJCQkqcEh0Q2FwYWJpbGl0eUxlbiwKKyAgICBPVVQgVUNIQVIJCQkqcEFkZEh0SW5mb0xlbiwKKyAgICBPVVQgVUNIQVIJCQkqcE5ld0V4dENoYW5uZWxPZmZzZXQsCisgICAgT1VUIFBFRENBX1BBUk0gcEVkY2FQYXJtLAorICAgIE9VVCBVQ0hBUiAqcENraXBGbGFnKQoreworICAgIENIQVIgICAgICAgICAgSWVUeXBlLCAqUHRyOworICAgIFBGUkFNRV84MDJfMTEgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpcE1zZzsKKyAgICBQRUlEX1NUUlVDVCAgIHBFaWQ7CisgICAgVUxPTkcgICAgICAgICBMZW5ndGggPSAwOworCisJKnBOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKKwkqcEh0Q2FwYWJpbGl0eUxlbiA9IDA7CisJKnBBZGRIdEluZm9MZW4gPSAwOworICAgIENPUFlfTUFDX0FERFIocEFkZHIyLCBwRnJhbWUtPkhkci5BZGRyMik7CisgICAgUHRyID0gcEZyYW1lLT5PY3RldDsKKyAgICBMZW5ndGggKz0gTEVOR1RIXzgwMl8xMTsKKworICAgIE5kaXNNb3ZlTWVtb3J5KHBDYXBhYmlsaXR5SW5mbywgJnBGcmFtZS0+T2N0ZXRbMF0sIDIpOworICAgIExlbmd0aCArPSAyOworICAgIE5kaXNNb3ZlTWVtb3J5KHBTdGF0dXMsICAgICAgICAgJnBGcmFtZS0+T2N0ZXRbMl0sIDIpOworICAgIExlbmd0aCArPSAyOworICAgICpwQ2tpcEZsYWcgPSAwOworICAgICpwRXh0UmF0ZUxlbiA9IDA7CisgICAgcEVkY2FQYXJtLT5iVmFsaWQgPSBGQUxTRTsKKworICAgIGlmICgqcFN0YXR1cyAhPSBNTE1FX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiBUUlVFOworCisgICAgTmRpc01vdmVNZW1vcnkocEFpZCwgJnBGcmFtZS0+T2N0ZXRbNF0sIDIpOworICAgIExlbmd0aCArPSAyOworCisgICAgLy8gQWlkIGFscmVhZHkgc3dhcGVkIGJ5dGUgb3JkZXIgaW4gUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKCkgZm9yIGJpZyBlbmRpYW4gcGxhdGZvcm0KKyAgICAqcEFpZCA9ICgqcEFpZCkgJiAweDNmZmY7IC8vIEFJRCBpcyBsb3cgMTQtYml0CisKKyAgICAvLyAtLSBnZXQgc3VwcG9ydGVkIHJhdGVzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIEllVHlwZSA9IHBGcmFtZS0+T2N0ZXRbNl07CisgICAgKnBTdXBSYXRlTGVuID0gcEZyYW1lLT5PY3RldFs3XTsKKyAgICBpZiAoKEllVHlwZSAhPSBJRV9TVVBQX1JBVEVTKSB8fCAoKnBTdXBSYXRlTGVuID4gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckFzc29jUnNwU2FuaXR5IGZhaWwgLSB3cm9uZyBTdXBwb3J0ZWRSYXRlcyBJRVxuIikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgTmRpc01vdmVNZW1vcnkoU3VwUmF0ZSwgJnBGcmFtZS0+T2N0ZXRbOF0sICpwU3VwUmF0ZUxlbik7CisKKyAgICBMZW5ndGggPSBMZW5ndGggKyAyICsgKnBTdXBSYXRlTGVuOworCisgICAgLy8gbWFueSBBUCBpbXBsZW1lbnQgcHJvcHJpZXRhcnkgSUVzIGluIG5vbi1zdGFuZGFyZCBvcmRlciwgd2UnZCBiZXR0ZXIKKyAgICAvLyB0b2xlcmF0ZSBtaXMtb3JkZXJlZCBJRXMgdG8gZ2V0IGJlc3QgY29tcGF0aWJpbGl0eQorICAgIHBFaWQgPSAoUEVJRF9TVFJVQ1QpICZwRnJhbWUtPk9jdGV0WzggKyAoKnBTdXBSYXRlTGVuKV07CisKKyAgICAvLyBnZXQgdmFyaWFibGUgZmllbGRzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgorICAgIHdoaWxlICgoTGVuZ3RoICsgMiArIHBFaWQtPkxlbikgPD0gTXNnTGVuKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChwRWlkLT5FaWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgSUVfRVhUX1NVUFBfUkFURVM6CisgICAgICAgICAgICAgICAgaWYgKHBFaWQtPkxlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KEV4dFJhdGUsIHBFaWQtPk9jdGV0LCBwRWlkLT5MZW4pOworICAgICAgICAgICAgICAgICAgICAqcEV4dFJhdGVMZW4gPSBwRWlkLT5MZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgY2FzZSBJRV9IVF9DQVA6CisgICAgICAgICAgICBjYXNlIElFX0hUX0NBUDI6CisJCQlpZiAocEVpZC0+TGVuID49IFNJWkVfSFRfQ0FQX0lFKSAgLy9Ob3RlOiBhbGxvdyBleHRlbnNpb24uISEKKwkJCXsKKwkJCQlOZGlzTW92ZU1lbW9yeShwSHRDYXBhYmlsaXR5LCBwRWlkLT5PY3RldCwgU0laRV9IVF9DQVBfSUUpOworCisJCQkJKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSk7CisJCQkJKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSk7CisKKwkJCQkqcEh0Q2FwYWJpbGl0eUxlbiA9IFNJWkVfSFRfQ0FQX0lFOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUGVlckFzc29jUnNwU2FuaXR5IC0gd3JvbmcgSUVfSFRfQ0FQLiBcbiIpKTsKKwkJCX0KKworCQlicmVhazsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICAgICAgICAgIGNhc2UgSUVfQUREX0hUOgorICAgICAgICAgICAgY2FzZSBJRV9BRERfSFQyOgorCQkJaWYgKHBFaWQtPkxlbiA+PSBzaXplb2YoQUREX0hUX0lORk9fSUUpKQorCQkJeworCQkJCS8vIFRoaXMgSUUgYWxsb3dzIGV4dGVuc2lvbiwgYnV0IHdlIGNhbiBpZ25vcmUgZXh0cmEgYnl0ZXMgYmV5b25kIG91ciBrbm93bGVkZ2UgLCBzbyBvbmx5CisJCQkJLy8gY29weSBmaXJzdCBzaXplb2YoQUREX0hUX0lORk9fSUUpCisJCQkJTmRpc01vdmVNZW1vcnkocEFkZEh0SW5mbywgcEVpZC0+T2N0ZXQsIHNpemVvZihBRERfSFRfSU5GT19JRSkpOworCisJCQkJKihVU0hPUlQgKikoJnBBZGRIdEluZm8tPkFkZEh0SW5mbzIpID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBBZGRIdEluZm8tPkFkZEh0SW5mbzIpKTsKKwkJCQkqKFVTSE9SVCAqKSgmcEFkZEh0SW5mby0+QWRkSHRJbmZvMykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEFkZEh0SW5mby0+QWRkSHRJbmZvMykpOworCisJCQkJKnBBZGRIdEluZm9MZW4gPSBTSVpFX0FERF9IVF9JTkZPX0lFOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUGVlckFzc29jUnNwU2FuaXR5IC0gd3JvbmcgSUVfQUREX0hULiBcbiIpKTsKKwkJCX0KKworCQlicmVhazsKKyAgICAgICAgICAgIGNhc2UgSUVfU0VDT05EQVJZX0NIX09GRlNFVDoKKwkJCWlmIChwRWlkLT5MZW4gPT0gMSkKKwkJCXsKKwkJCQkqcE5ld0V4dENoYW5uZWxPZmZzZXQgPSBwRWlkLT5PY3RldFswXTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJBc3NvY1JzcFNhbml0eSAtIHdyb25nIElFX1NFQ09OREFSWV9DSF9PRkZTRVQuIFxuIikpOworCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQlicmVhazsKKyAgICAgICAgICAgIGNhc2UgSUVfQUlST05FVF9DS0lQOgorICAgICAgICAgICAgICAgIC8vIDAuIENoZWNrIEFpcm9uZXQgSUUgbGVuZ3RoLCBpdCBtdXN0IGJlIGxhcmdlciBvciBlcXVhbCB0byAyOAorICAgICAgICAgICAgICAgIC8vICAgIENpc2NvJ3MgQVAgVnhXb3JrIHZlcnNpb24od2lsbCBub3QgYmUgc3VwcG9ydGVkKSB1c2VkIHRoaXMgSUUgbGVuZ3RoIGFzIDI4CisgICAgICAgICAgICAgICAgLy8gICAgQ2lzY28ncyBBUCBJT1MgdmVyc2lvbiB1c2VkIHRoaXMgSUUgbGVuZ3RoIGFzIDMwCisgICAgICAgICAgICAgICAgaWYgKHBFaWQtPkxlbiA8IChDS0lQX05FR09USUFUSU9OX0xFTkdUSCAtIDIpKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgLy8gMS4gQ29weSBDS0lQIGZsYWcgYnl0ZSB0byBidWZmZXIgZm9yIHByb2Nlc3MKKyAgICAgICAgICAgICAgICAqcENraXBGbGFnID0gKihwRWlkLT5PY3RldCArIDgpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIElFX0FJUk9ORVRfSVBBRERSRVNTOgorICAgICAgICAgICAgICAgIGlmIChwRWlkLT5MZW4gIT0gMHgwQSkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIC8vIEdldCBDaXNjbyBBaXJvbmV0IElQIGluZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgQ0lTQ09fT1VJLCAzKSA9PSAxKQorICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5BaXJvbmV0SVBBZGRyZXNzLCBwRWlkLT5PY3RldCArIDQsIDQpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvLyBDQ1gyLCBXTU0gdXNlIHRoZSBzYW1lIElFIHZhbHVlCisgICAgICAgICAgICAvLyBjYXNlIElFX0NDWF9WMjoKKyAgICAgICAgICAgIGNhc2UgSUVfVkVORE9SX1NQRUNJRklDOgorICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBXTUUgUEFSQU1URVIgRUxFTUVOVAorICAgICAgICAgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdNRV9QQVJNX0VMRU0sIDYpICYmIChwRWlkLT5MZW4gPT0gMjQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUFVDSEFSIHB0cjsKKyAgICAgICAgICAgICAgICAgICAgaW50IGk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcGFyc2luZyBFRENBIHBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iVmFsaWQgICAgICAgICAgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJRQWNrICAgICAgICAgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4MTA7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlF1ZXVlUmVxdWVzdCAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHgyMDsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iVHhvcFJlcXVlc3QgICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDQwOworICAgICAgICAgICAgICAgICAgICAvL3BFZGNhUGFybS0+Yk1vcmVEYXRhQWNrICAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHg4MDsKKyAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5FZGNhVXBkYXRlQ291bnQgPSBwRWlkLT5PY3RldFs2XSAmIDB4MGY7CisgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFQU0RDYXBhYmxlICAgID0gKHBFaWQtPk9jdGV0WzZdICYgMHg4MCkgPyAxIDogMDsKKyAgICAgICAgICAgICAgICAgICAgcHRyID0gJnBFaWQtPk9jdGV0WzhdOworICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGFjaSA9ICgqcHRyICYgMHg2MCkgPj4gNTsgLy8gYjV+NiBpcyBBQyBJTkRFWAorICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQUNNW2FjaV0gID0gKCgoKnB0cikgJiAweDEwKSA9PSAweDEwKTsgICAvLyBiNSBpcyBBQ00KKyAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+QWlmc25bYWNpXSA9ICgqcHRyKSAmIDB4MGY7ICAgICAgICAgICAgICAgLy8gYjB+MyBpcyBBSUZTTgorICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21pblthY2ldID0gKihwdHIrMSkgJiAweDBmOyAgICAgICAgICAgICAvLyBiMH40IGlzIEN3bWluCisgICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWF4W2FjaV0gPSAqKHB0cisxKSA+PiA0OyAgICAgICAgICAgICAgIC8vIGI1fjggaXMgQ3dtYXgKKyAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+VHhvcFthY2ldICA9ICoocHRyKzIpICsgMjU2ICogKCoocHRyKzMpKTsgLy8gaW4gdW5pdCBvZiAzMi11cworICAgICAgICAgICAgICAgICAgICAgICAgcHRyICs9IDQ7IC8vIHBvaW50IHRvIG5leHQgQUMKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBDQ1ggSUUKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAwLiBDaGVjayB0aGUgc2l6ZSBhbmQgQ0NYIGFkbWluIGNvbnRyb2wKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLkNDWENvbnRyb2wuZmllbGQuRW5hYmxlID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBFaWQtPkxlbiAhPSA1KQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVHVybiBDQ1gyIGlmIG1hdGNoZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgQ2N4MkllSW5mbywgNSkgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkNDWEVuYWJsZSA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQXNzb2NSc3BTYW5pdHkgLSBpZ25vcmUgdW5yZWNvZ25pemVkIEVJRCA9ICVkXG4iLCBwRWlkLT5FaWQpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIExlbmd0aCA9IExlbmd0aCArIDIgKyBwRWlkLT5MZW47CisgICAgICAgIHBFaWQgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopcEVpZCArIDIgKyBwRWlkLT5MZW4pOworICAgIH0KKworICAgIC8vIEZvcmNlIENDWDIgZW5hYmxlIHRvIFRSVUUgZm9yIHRob3NlIEFQIGRpZG4ndCByZXBsYXkgQ0NYIHYyIElFLCB3ZSBzdGlsbCBmb3JjZSBpdCB0byBiZSBvbgorICAgIGlmIChwQWQtPlN0YUNmZy5DQ1hDb250cm9sLmZpZWxkLkVuYWJsZSA9PSAxKQorICAgICAgICBwQWQtPlN0YUNmZy5DQ1hFbmFibGUgPSBUUlVFOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjaworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIFBlZXJQcm9iZVJlcVNhbml0eSgKKyAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKKyAgICBJTiBWT0lEICpNc2csCisgICAgSU4gVUxPTkcgTXNnTGVuLAorICAgIE9VVCBQVUNIQVIgcEFkZHIyLAorICAgIE9VVCBDSEFSIFNzaWRbXSwKKyAgICBPVVQgVUNIQVIgKnBTc2lkTGVuKQoreworICAgIFVDSEFSICAgICAgICAgSWR4OworICAgIFVDSEFSCSAgICAgIFJhdGVMZW47CisgICAgQ0hBUiAgICAgICAgICBJZVR5cGU7CisgICAgUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlNc2c7CisKKyAgICBDT1BZX01BQ19BRERSKHBBZGRyMiwgcEZyYW1lLT5IZHIuQWRkcjIpOworCisgICAgaWYgKChwRnJhbWUtPk9jdGV0WzBdICE9IElFX1NTSUQpIHx8IChwRnJhbWUtPk9jdGV0WzFdID4gTUFYX0xFTl9PRl9TU0lEKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJQcm9iZVJlcVNhbml0eSBmYWlsIC0gd3JvbmcgU1NJRCBJRShUeXBlPSVkLExlbj0lZClcbiIscEZyYW1lLT5PY3RldFswXSxwRnJhbWUtPk9jdGV0WzFdKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAqcFNzaWRMZW4gPSBwRnJhbWUtPk9jdGV0WzFdOworICAgIE5kaXNNb3ZlTWVtb3J5KFNzaWQsICZwRnJhbWUtPk9jdGV0WzJdLCAqcFNzaWRMZW4pOworCisgICAgSWR4ID0gKnBTc2lkTGVuICsgMjsKKworICAgIC8vIC0tIGdldCBzdXBwb3J0ZWQgcmF0ZXMgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCisgICAgSWVUeXBlID0gcEZyYW1lLT5PY3RldFtJZHhdOworICAgIFJhdGVMZW4gPSBwRnJhbWUtPk9jdGV0W0lkeCArIDFdOworICAgIGlmIChJZVR5cGUgIT0gSUVfU1VQUF9SQVRFUykKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJQcm9iZVJlcVNhbml0eSBmYWlsIC0gd3JvbmcgU3VwcG9ydFJhdGVzIElFKFR5cGU9JWQsTGVuPSVkKVxuIixwRnJhbWUtPk9jdGV0W0lkeF0scEZyYW1lLT5PY3RldFtJZHgrMV0pKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExRykgJiYgKFJhdGVMZW4gPCA4KSkKKyAgICAgICAgICAgIHJldHVybiAoRkFMU0UpOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gR2V0VGltQml0KAorICAgIElOIENIQVIgKlB0ciwKKyAgICBJTiBVU0hPUlQgQWlkLAorICAgIE9VVCBVQ0hBUiAqVGltTGVuLAorICAgIE9VVCBVQ0hBUiAqQmNhc3RGbGFnLAorICAgIE9VVCBVQ0hBUiAqRHRpbUNvdW50LAorICAgIE9VVCBVQ0hBUiAqRHRpbVBlcmlvZCwKKyAgICBPVVQgVUNIQVIgKk1lc3NhZ2VUb01lKQoreworICAgIFVDSEFSICAgICAgICAgIEJpdENudGwsIE4xLCBOMiwgTXlCeXRlLCBNeUJpdDsKKyAgICBDSEFSICAgICAgICAgICpJZHhQdHI7CisKKyAgICBJZHhQdHIgPSBQdHI7CisKKyAgICBJZHhQdHIgKys7CisgICAgKlRpbUxlbiA9ICpJZHhQdHI7CisKKyAgICAvLyBnZXQgRFRJTSBDb3VudCBmcm9tIFRJTSBlbGVtZW50CisgICAgSWR4UHRyICsrOworICAgICpEdGltQ291bnQgPSAqSWR4UHRyOworCisgICAgLy8gZ2V0IERUSU0gUGVyaW9kIGZyb20gVElNIGVsZW1lbnQKKyAgICBJZHhQdHIrKzsKKyAgICAqRHRpbVBlcmlvZCA9ICpJZHhQdHI7CisKKyAgICAvLyBnZXQgQml0bWFwIENvbnRyb2wgZnJvbSBUSU0gZWxlbWVudAorICAgIElkeFB0cisrOworICAgIEJpdENudGwgPSAqSWR4UHRyOworCisgICAgaWYgKCgqRHRpbUNvdW50ID09IDApICYmIChCaXRDbnRsICYgMHgwMSkpCisgICAgICAgICpCY2FzdEZsYWcgPSBUUlVFOworICAgIGVsc2UKKyAgICAgICAgKkJjYXN0RmxhZyA9IEZBTFNFOworCisgICAgLy8gUGFyc2UgUGFydGlhbCBWaXJ0dWFsIEJpdG1hcCBmcm9tIFRJTSBlbGVtZW50CisgICAgTjEgPSBCaXRDbnRsICYgMHhmZTsgICAgLy8gTjEgaXMgdGhlIGZpcnN0IGJpdG1hcCBieXRlIworICAgIE4yID0gKlRpbUxlbiAtIDQgKyBOMTsgIC8vIE4yIGlzIHRoZSBsYXN0IGJpdG1hcCBieXRlIworCisgICAgaWYgKChBaWQgPCAoTjEgPDwgMykpIHx8IChBaWQgPj0gKChOMiArIDEpIDw8IDMpKSkKKyAgICAgICAgKk1lc3NhZ2VUb01lID0gRkFMU0U7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgTXlCeXRlID0gKEFpZCA+PiAzKSAtIE4xOyAgICAgICAgICAgICAgICAgICAgICAgLy8gbXkgYnl0ZSBwb3NpdGlvbiBpbiB0aGUgYml0bWFwIGJ5dGUtc3RyZWFtCisgICAgICAgIE15Qml0ID0gQWlkICUgMTYgLSAoKE15Qnl0ZSAmIDB4MDEpPyA4OjApOworCisgICAgICAgIElkeFB0ciArPSAoTXlCeXRlICsgMSk7CisKKyAgICAgICAgLy9pZiAoKklkeFB0cikKKyAgICAgICAgLy8gICAgREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJUSU0gYml0bWFwID0gMHglMDJ4XG4iLCAqSWR4UHRyKSk7CisKKyAgICAgICAgaWYgKCpJZHhQdHIgJiAoMHgwMSA8PCBNeUJpdCkpCisgICAgICAgICAgICAqTWVzc2FnZVRvTWUgPSBUUlVFOworICAgICAgICBlbHNlCisgICAgICAgICAgICAqTWVzc2FnZVRvTWUgPSBGQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvc3luYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvc3luYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ODk3NTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS9zeW5jLmMKQEAgLTAsMCArMSwxNzUzIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXN5bmMuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUpvaG4gQ2hhbmcJMjAwNC0wOS0wMSAgICAgIG1vZGlmaWVkIGZvciBydDI1NjEvMjY2MQorCUphbiBMZWUJCTIwMDYtMDgtMDEgICAgICBtb2RpZmllZCBmb3IgcnQyODYwIGZvciA4MDIuMTFuCisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisjZGVmaW5lIEFESE9DX0VOVFJZX0JFQUNPTl9MT1NUX1RJTUUJKDIqT1NfSFopCS8vIDIgc2VjCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhlIHN5bmMgc3RhdGUgbWFjaGluZSwKKwlQYXJhbWV0ZXJzOgorCQlTbSAtIHBvaW50ZXIgdG8gdGhlIHN0YXRlIG1hY2hpbmUKKwlOb3RlOgorCQl0aGUgc3RhdGUgbWFjaGluZSBsb29rcyBsaWtlIHRoZSBmb2xsb3dpbmcKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgU3luY1N0YXRlTWFjaGluZUluaXQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gU1RBVEVfTUFDSElORSAqU20sCisJT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQoreworCVN0YXRlTWFjaGluZUluaXQoU20sIFRyYW5zLCBNQVhfU1lOQ19TVEFURSwgTUFYX1NZTkNfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIFNZTkNfSURMRSwgU1lOQ19NQUNISU5FX0JBU0UpOworCisJLy8gY29sdW1uIDEKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNZTkNfSURMRSwgTVQyX01MTUVfU0NBTl9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZVNjYW5SZXFBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU1lOQ19JRExFLCBNVDJfTUxNRV9KT0lOX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lSm9pblJlcUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTWU5DX0lETEUsIE1UMl9NTE1FX1NUQVJUX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lU3RhcnRSZXFBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU1lOQ19JRExFLCBNVDJfUEVFUl9CRUFDT04sIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckJlYWNvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTWU5DX0lETEUsIE1UMl9QRUVSX1BST0JFX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyUHJvYmVSZXFBY3Rpb24pOworCisJLy9jb2x1bW4gMgorCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgSk9JTl9XQUlUX0JFQUNPTiwgTVQyX01MTUVfU0NBTl9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlblNjYW4pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgSk9JTl9XQUlUX0JFQUNPTiwgTVQyX01MTUVfSk9JTl9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkpvaW4pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgSk9JTl9XQUlUX0JFQUNPTiwgTVQyX01MTUVfU1RBUlRfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5TdGFydCk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBKT0lOX1dBSVRfQkVBQ09OLCBNVDJfUEVFUl9CRUFDT04sIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckJlYWNvbkF0Sm9pbkFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBKT0lOX1dBSVRfQkVBQ09OLCBNVDJfQkVBQ09OX1RJTUVPVVQsIChTVEFURV9NQUNISU5FX0ZVTkMpQmVhY29uVGltZW91dEF0Sm9pbkFjdGlvbik7CisKKwkvLyBjb2x1bW4gMworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU0NBTl9MSVNURU4sIE1UMl9NTE1FX1NDQU5fUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5TY2FuKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNDQU5fTElTVEVOLCBNVDJfTUxNRV9KT0lOX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuSm9pbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTQ0FOX0xJU1RFTiwgTVQyX01MTUVfU1RBUlRfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5TdGFydCk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTQ0FOX0xJU1RFTiwgTVQyX1BFRVJfQkVBQ09OLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJCZWFjb25BdFNjYW5BY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU0NBTl9MSVNURU4sIE1UMl9QRUVSX1BST0JFX1JTUCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQmVhY29uQXRTY2FuQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNDQU5fTElTVEVOLCBNVDJfU0NBTl9USU1FT1VULCAoU1RBVEVfTUFDSElORV9GVU5DKVNjYW5UaW1lb3V0QWN0aW9uKTsKKworCS8vIHRpbWVyIGluaXQKKwlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZUF1eC5CZWFjb25UaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKEJlYWNvblRpbWVvdXQpLCBwQWQsIEZBTFNFKTsKKwlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihTY2FuVGltZW91dCksIHBBZCwgRkFMU0UpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCUJlYWNvbiB0aW1lb3V0IGhhbmRsZXIsIGV4ZWN1dGVkIGluIHRpbWVyIHRocmVhZAorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEJlYWNvblRpbWVvdXQoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCVJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU1lOQyAtIEJlYWNvblRpbWVvdXRcbiIpKTsKKworCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgorCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpCisJCXJldHVybjsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmICgocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzQwKQorCQkpCisJeworCQlVQ0hBUiAgICAgICAgQkJQVmFsdWUgPSAwOworCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7CisJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOworCQlCQlBWYWx1ZSAmPSAofjB4MTgpOworCQlCQlBWYWx1ZSB8PSAweDEwOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBFbmQgb2YgU0NBTiwgcmVzdG9yZSB0byA0ME1IeiBjaGFubmVsICVkLCBUb3RhbCBCU1NbJTAyZF1cbiIscEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIHBBZC0+U2NhblRhYi5Cc3NOcikpOworCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfQkVBQ09OX1RJTUVPVVQsIDAsIE5VTEwpOworCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlTY2FuIHRpbWVvdXQgaGFuZGxlciwgZXhlY3V0ZWQgaW4gdGltZXIgdGhyZWFkCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgU2NhblRpbWVvdXQoCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAorCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKKwlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCisJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQoreworCVJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKKworCisJLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCisJLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0CisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkKKwkJcmV0dXJuOworCisJaWYgKE1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfU0NBTl9USU1FT1VULCAwLCBOVUxMKSkKKwl7CisJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKwl9CisJZWxzZQorCXsKKwkJLy8gVG8gcHJldmVudCBTeW5jTWFjaGluZS5DdXJyU3RhdGUgaXMgU0NBTl9MSVNURU4gZm9yZXZlci4KKwkJcEFkLT5NbG1lQXV4LkNoYW5uZWwgPSAwOworCQlTY2FuTmV4dENoYW5uZWwocEFkKTsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQl7CisJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TQ0FOX0VOUVVFVUVfRkFJTF9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworCQl9CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCU1MTUUgU0NBTiByZXEgc3RhdGUgbWFjaGluZSBwcm9jZWR1cmUKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIE1sbWVTY2FuUmVxQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUiAgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF0sIFNzaWRMZW4sIFNjYW5UeXBlLCBCc3NUeXBlLCBCQlBWYWx1ZSA9IDA7CisJQk9PTEVBTiAgICAgICAgVGltZXJDYW5jZWxsZWQ7CisJVUxPTkcJCSAgIE5vdzsKKwlVU0hPUlQgICAgICAgICBTdGF0dXM7CisJUEhFQURFUl84MDJfMTEgcEhkcjgwMjExOworCVBVQ0hBUiAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworCU5ESVNfU1RBVFVTICAgIE5TdGF0dXM7CisKKwkvLyBDaGVjayB0aGUgdG90YWwgc2NhbiB0cmllcyBmb3Igb25lIHNpbmdsZSBPSUQgY29tbWFuZAorCS8vIElmIHRoaXMgaXMgdGhlIENDWCAyLjAgQ2FzZSwgc2tpcCB0aGF0IQorCWlmICggIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gTWxtZVNjYW5SZXFBY3Rpb24gYmVmb3JlIFN0YXJ0dXBcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCS8vIEluY3JlYXNlIHRoZSBzY2FuIHJldHJ5IGNvdW50ZXJzLgorCXBBZC0+U3RhQ2ZnLlNjYW5DbnQrKzsKKworCisJLy8gZmlyc3QgY2hlY2sgdGhlIHBhcmFtZXRlciBzYW5pdHkKKwlpZiAoTWxtZVNjYW5SZXFTYW5pdHkocEFkLAorCQkJCQkJICBFbGVtLT5Nc2csCisJCQkJCQkgIEVsZW0tPk1zZ0xlbiwKKwkJCQkJCSAgJkJzc1R5cGUsCisJCQkJCQkgIFNzaWQsCisJCQkJCQkgICZTc2lkTGVuLAorCQkJCQkJICAmU2NhblR5cGUpKQorCXsKKworCQkvLyBDaGVjayBmb3IgY2hhbm5lbCBsb2FkIGFuZCBub2lzZSBoaXN0IHJlcXVlc3QKKwkJLy8gU3VzcGVuZCBNU0RVIG9ubHkgYXQgc2NhbiByZXF1ZXN0LCBub3QgdGhlIGxhc3QgdHdvIG1lbnRpb25lZAorCQlpZiAoKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fTk9JU0UpIHx8IChTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX0NIQU5ORUxfTE9BRCkpCisJCXsKKwkJCWlmIChwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQkJCVJUTVBTdXNwZW5kTXNkdVRyYW5zbWlzc2lvbihwQWQpOwkJCS8vIFN1c3BlbmQgTVNEVSB0cmFuc21pc3Npb24gaGVyZQorCQl9CisJCWVsc2UKKwkJeworCQkJLy8gU3VzcGVuZCBNU0RVIHRyYW5zbWlzc2lvbiBoZXJlCisJCQlSVE1QU3VzcGVuZE1zZHVUcmFuc21pc3Npb24ocEFkKTsKKwkJfQorCisJCS8vCisJCS8vIFRvIHByZXZlbnQgZGF0YSBsb3N0LgorCQkvLyBTZW5kIGFuIE5VTEwgZGF0YSB3aXRoIHR1cm5lZCBQU00gYml0IG9uIHRvIGN1cnJlbnQgYXNzb2NpYXRlZCBBUCBiZWZvcmUgU0NBTiBwcm9ncmVzcy4KKwkJLy8gQW5kIHNob3VsZCBzZW5kIGFuIE5VTEwgZGF0YSB3aXRoIHR1cm5lZCBQU00gYml0IG9mZiB0byBBUCwgd2hlbiBzY2FuIHByb2dyZXNzIGRvbmUKKwkJLy8KKwkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSAmJiAoSU5GUkFfT04ocEFkKSkpCisJCXsKKwkJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOworCQkJaWYgKE5TdGF0dXMJPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCXsKKwkJCQlwSGRyODAyMTEgPSAoUEhFQURFUl84MDJfMTEpIHBPdXRCdWZmZXI7CisJCQkJTWd0TWFjSGVhZGVySW5pdChwQWQsIHBIZHI4MDIxMSwgU1VCVFlQRV9OVUxMX0ZVTkMsIDEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQkJcEhkcjgwMjExLT5EdXJhdGlvbiA9IDA7CisJCQkJcEhkcjgwMjExLT5GQy5UeXBlID0gQlRZUEVfREFUQTsKKwkJCQlwSGRyODAyMTEtPkZDLlB3ck1nbXQgPSBQV1JfU0FWRTsKKworCQkJCS8vIFNlbmQgdXNpbmcgcHJpb3JpdHkgcXVldWUKKwkJCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVNjYW5SZXFBY3Rpb24gLS0gU2VuZCBQU00gRGF0YSBmcmFtZSBmb3Igb2ZmIGNoYW5uZWwgUk1cbiIpKTsKKwkJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CisJCQl9CisJCX0KKworCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOworCQlwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgPSBOb3c7CisJCS8vIHJlc2V0IGFsbCB0aGUgdGltZXJzCisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisKKwkJLy8gcmVjb3JkIGRlc2lyZWQgQlNTIHBhcmFtZXRlcnMKKwkJcEFkLT5NbG1lQXV4LkJzc1R5cGUgPSBCc3NUeXBlOworCQlwQWQtPk1sbWVBdXguU2NhblR5cGUgPSBTY2FuVHlwZTsKKwkJcEFkLT5NbG1lQXV4LlNzaWRMZW4gPSBTc2lkTGVuOworICAgICAgICBOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIFNzaWQsIFNzaWRMZW4pOworCisJCS8vIHN0YXJ0IGZyb20gdGhlIGZpcnN0IGNoYW5uZWwKKwkJcEFkLT5NbG1lQXV4LkNoYW5uZWwgPSBGaXJzdENoYW5uZWwocEFkKTsKKworCQkvLyBDaGFuZ2UgdGhlIHNjYW4gY2hhbm5lbCB3aGVuIGRlYWxpbmcgd2l0aCBDQ1ggYmVhY29uIHJlcG9ydAorCQlpZiAoKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fUEFTU0lWRSkgfHwgKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQUNUSVZFKSB8fAorCQkJKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQ0hBTk5FTF9MT0FEKSB8fCAoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19OT0lTRSkpCisJCQlwQWQtPk1sbWVBdXguQ2hhbm5lbCA9IHBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsOworCisJCS8vIExldCBCQlAgcmVnaXN0ZXIgYXQgMjBNSHogdG8gZG8gc2NhbgorCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7CisJCUJCUFZhbHVlICY9ICh+MHgxOCk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIEJCUCBSNCB0byAyME1Iei5sXG4iKSk7CisJCVNjYW5OZXh0Q2hhbm5lbChwQWQpOworCX0KKwllbHNlCisJeworCQlEQkdQUklOVF9FUlIoKCJTWU5DIC0gTWxtZVNjYW5SZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOworCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOworCQlTdGF0dXMgPSBNTE1FX0lOVkFMSURfRk9STUFUOworCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU0NBTl9DT05GLCAyLCAmU3RhdHVzKTsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJTUxNRSBKT0lOIHJlcSBzdGF0ZSBtYWNoaW5lIHByb2NlZHVyZQorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgTWxtZUpvaW5SZXFBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSICAgICAgICBCQlBWYWx1ZSA9IDA7CisJQlNTX0VOVFJZICAgICpwQnNzOworCUJPT0xFQU4gICAgICAgVGltZXJDYW5jZWxsZWQ7CisJSEVBREVSXzgwMl8xMSBIZHI4MDIxMTsKKwlORElTX1NUQVRVUyAgIE5TdGF0dXM7CisJVUxPTkcgICAgICAgICBGcmFtZUxlbiA9IDA7CisJUFVDSEFSICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlQVUNIQVIgICAgICAgIHBTdXBSYXRlID0gTlVMTDsKKwlVQ0hBUiAgICAgICAgIFN1cFJhdGVMZW47CisJUFVDSEFSICAgICAgICBwRXh0UmF0ZSA9IE5VTEw7CisJVUNIQVIgICAgICAgICBFeHRSYXRlTGVuOworCVVDSEFSICAgICAgICAgQVN1cFJhdGVbXSA9IHsweDhDLCAweDEyLCAweDk4LCAweDI0LCAweGIwLCAweDQ4LCAweDYwLCAweDZDfTsKKwlVQ0hBUiAgICAgICAgIEFTdXBSYXRlTGVuID0gc2l6ZW9mKEFTdXBSYXRlKS9zaXplb2YoVUNIQVIpOworCU1MTUVfSk9JTl9SRVFfU1RSVUNUICpwSW5mbyA9IChNTE1FX0pPSU5fUkVRX1NUUlVDVCAqKShFbGVtLT5Nc2cpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIE1sbWVKb2luUmVxQWN0aW9uKEJTUyAjJWxkKVxuIiwgcEluZm8tPkJzc0lkeCkpOworCisKKwkvLyByZXNldCBhbGwgdGhlIHRpbWVycworCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5CZWFjb25UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKworCXBCc3MgPSAmcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbcEluZm8tPkJzc0lkeF07CisKKwkvLyByZWNvcmQgdGhlIGRlc2lyZWQgU1NJRCAmIEJTU0lEIHdlJ3JlIHdhaXRpbmcgZm9yCisJQ09QWV9NQUNfQUREUihwQWQtPk1sbWVBdXguQnNzaWQsIHBCc3MtPkJzc2lkKTsKKworCS8vIElmIEFQJ3MgU1NJRCBpcyBub3QgaGlkZGVuLCBpdCBpcyBPSyBmb3IgdXBkYXRpbmcgc3NpZCB0byBNbG1lQXV4IGFnYWluLgorCWlmIChwQnNzLT5IaWRkZW4gPT0gMCkKKwl7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBwQnNzLT5Tc2lkLCBwQnNzLT5Tc2lkTGVuKTsKKwkJcEFkLT5NbG1lQXV4LlNzaWRMZW4gPSBwQnNzLT5Tc2lkTGVuOworCX0KKworCXBBZC0+TWxtZUF1eC5Cc3NUeXBlID0gcEJzcy0+QnNzVHlwZTsKKwlwQWQtPk1sbWVBdXguQ2hhbm5lbCA9IHBCc3MtPkNoYW5uZWw7CisJcEFkLT5NbG1lQXV4LkNlbnRyYWxDaGFubmVsID0gcEJzcy0+Q2VudHJhbENoYW5uZWw7CisKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJLy8gQ291bnRyeSBJRSBvZiB0aGUgQVAgd2lsbCBiZSBldmFsdWF0ZWQgYW5kIHdpbGwgYmUgdXNlZC4KKwlpZiAoKHBBZC0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlICE9IFJ0ODAyXzExX0RfTm9uZSkgJiYKKwkJKHBCc3MtPmJIYXNDb3VudHJ5SUUgPT0gVFJVRSkpCisJeworCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGVbMF0sICZwQnNzLT5Db3VudHJ5U3RyaW5nWzBdLCAyKTsKKwkJaWYgKHBCc3MtPkNvdW50cnlTdHJpbmdbMl0gPT0gJ0knKQorCQkJcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5ID0gSURPUjsKKwkJZWxzZSBpZiAocEJzcy0+Q291bnRyeVN0cmluZ1syXSA9PSAnTycpCisJCQlwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPSBPRE9SOworCQllbHNlCisJCQlwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPSBCT1RIOworCQlCdWlsZENoYW5uZWxMaXN0RXgocEFkKTsKKwl9CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworCisJLy8gTGV0IEJCUCByZWdpc3RlciBhdCAyME1IeiB0byBkbyBzY2FuCisJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOworCUJCUFZhbHVlICY9ICh+MHgxOCk7CisJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBCQlAgUjQgdG8gMjBNSHoubFxuIikpOworCisJLy8gc3dpdGNoIGNoYW5uZWwgYW5kIHdhaXRpbmcgZm9yIGJlYWNvbiB0aW1lcgorCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwsIEZBTFNFKTsKKwlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCk7CisJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsIEpPSU5fVElNRU9VVCk7CisKKyAgICBkbworCXsKKwkJaWYgKCgocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkgJiYKKyAgICAgICAgICAgIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA+IDE0KSAmJgorICAgICAgICAgICAgIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpKQorI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8gUm9nZXIgc3luYyBDYXJyaWVyCisgICAgICAgICAgICAgfHwgKHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID09IFRSVUUpCisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworICAgICAgICAgICAgKQorCQl7CisJCQkvLworCQkJLy8gV2UgY2FuJ3Qgc2VuZCBhbnkgUHJvYmUgcmVxdWVzdCBmcmFtZSB0byBtZWV0IDgwMi4xMWguCisJCQkvLworCQkJaWYgKHBCc3MtPkhpZGRlbiA9PSAwKQorCQkJCWJyZWFrOworCQl9CisKKwkJLy8KKwkJLy8gc2VuZCBwcm9iZSByZXF1ZXN0CisJCS8vCisJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CisJCWlmIChOU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCXsKKwkJCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA8PSAxNCkKKwkJCXsKKwkJCQlwU3VwUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGU7CisJCQkJU3VwUmF0ZUxlbiA9IHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVMZW47CisJCQkJcEV4dFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlOworCQkJCUV4dFJhdGVMZW4gPSBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vCisJCQkJLy8gT3ZlcndyaXRlIFN1cHBvcnQgUmF0ZSwgQ0NLIHJhdGUgYXJlIG5vdCBhbGxvd2VkCisJCQkJLy8KKwkJCQlwU3VwUmF0ZSA9IEFTdXBSYXRlOworCQkJCVN1cFJhdGVMZW4gPSBBU3VwUmF0ZUxlbjsKKwkJCQlFeHRSYXRlTGVuID0gMDsKKwkJCX0KKworCQkJaWYgKHBBZC0+TWxtZUF1eC5Cc3NUeXBlID09IEJTU19JTkZSQSkKKwkJCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkhkcjgwMjExLCBTVUJUWVBFX1BST0JFX1JFUSwgMCwgcEFkLT5NbG1lQXV4LkJzc2lkLCBwQWQtPk1sbWVBdXguQnNzaWQpOworCQkJZWxzZQorCQkJCU1ndE1hY0hlYWRlckluaXQocEFkLCAmSGRyODAyMTEsIFNVQlRZUEVfUFJPQkVfUkVRLCAwLCBCUk9BRENBU1RfQUREUiwgQlJPQURDQVNUX0FERFIpOworCisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKwkJCQkJCQkgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgJkhkcjgwMjExLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmU3NpZEllLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5NbG1lQXV4LlNzaWRMZW4sCisJCQkJCQkJICBwQWQtPk1sbWVBdXguU3NpZExlbiwJICAgIHBBZC0+TWxtZUF1eC5Tc2lkLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUllLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUxlbiwKKwkJCQkJCQkgIFN1cFJhdGVMZW4sICAgICAgICAgICAgICAgcFN1cFJhdGUsCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisKKwkJCWlmIChFeHRSYXRlTGVuKQorCQkJeworCQkJCVVMT05HIFRtcDsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcCwKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkV4dFJhdGVJZSwKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkV4dFJhdGVMZW4sCisJCQkJCQkJCSAgRXh0UmF0ZUxlbiwgICAgICAgICAgICAgICAgICAgICAgIHBFeHRSYXRlLAorCQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCQlGcmFtZUxlbiArPSBUbXA7CisJCQl9CisKKworCQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQl9CisgICAgfSB3aGlsZSAoRkFMU0UpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIFN3aXRjaCB0byBjaCAlZCwgV2FpdCBCRUFDT04gZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJcEJzcy0+Q2hhbm5lbCwgcEJzcy0+QnNzaWRbMF0sIHBCc3MtPkJzc2lkWzFdLCBwQnNzLT5Cc3NpZFsyXSwgcEJzcy0+QnNzaWRbM10sIHBCc3MtPkJzc2lkWzRdLCBwQnNzLT5Cc3NpZFs1XSkpOworCisJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IEpPSU5fV0FJVF9CRUFDT047Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJTUxNRSBTVEFSVCBSZXF1ZXN0IHN0YXRlIG1hY2hpbmUgcHJvY2VkdXJlLCBzdGFydGluZyBhbiBJQlNTCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBNbG1lU3RhcnRSZXFBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdLCBTc2lkTGVuOworCUJPT0xFQU4gICAgICAgVGltZXJDYW5jZWxsZWQ7CisKKwkvLyBOZXcgZm9yIFdQQSBzZWN1cml0eSBzdWl0ZXMKKwlVQ0hBUgkJCQkJCVZhcklFW01BWF9WSUVfTEVOXTsgCS8vIFRvdGFsIFZJRSBsZW5ndGggPSBNQVhfVklFX0xFTiAtIC01CisJTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzCSpwVklFID0gTlVMTDsKKwlMQVJHRV9JTlRFR0VSCQkJCVRpbWVTdGFtcDsKKwlCT09MRUFOIFByaXZhY3k7CisJVVNIT1JUIFN0YXR1czsKKworCS8vIEluaXQgVmFyaWFibGUgSUUgc3RydWN0dXJlCisJcFZJRSA9IChQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzKSBWYXJJRTsKKwlwVklFLT5MZW5ndGggPSAwOworCVRpbWVTdGFtcC51Lkxvd1BhcnQgID0gMDsKKwlUaW1lU3RhbXAudS5IaWdoUGFydCA9IDA7CisKKwlpZiAoTWxtZVN0YXJ0UmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIFNzaWQsICZTc2lkTGVuKSkKKwl7CisJCS8vIHJlc2V0IGFsbCB0aGUgdGltZXJzCisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisKKwkJLy8KKwkJLy8gU3RhcnQgYSBuZXcgSUJTUy4gQWxsIElCU1MgcGFyYW1ldGVycyBhcmUgZGVjaWRlZCBub3cuLi4uCisJCS8vCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTdGFydFJlcUFjdGlvbiAtIFN0YXJ0IGEgbmV3IElCU1MuIEFsbCBJQlNTIHBhcmFtZXRlcnMgYXJlIGRlY2lkZWQgbm93Li4uLiBcbiIpKTsKKwkJcEFkLT5NbG1lQXV4LkJzc1R5cGUgICAgICAgICAgID0gQlNTX0FESE9DOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgU3NpZCwgU3NpZExlbik7CisJCXBBZC0+TWxtZUF1eC5Tc2lkTGVuICAgICAgICAgICA9IFNzaWRMZW47CisKKwkJLy8gZ2VuZXJhdGUgYSByYWRvbSBudW1iZXIgYXMgQlNTSUQKKwkJTWFjQWRkclJhbmRvbUJzc2lkKHBBZCwgcEFkLT5NbG1lQXV4LkJzc2lkKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVN0YXJ0UmVxQWN0aW9uIC0gZ2VuZXJhdGUgYSByYWRvbSBudW1iZXIgYXMgQlNTSUQgXG4iKSk7CisKKwkJUHJpdmFjeSA9IChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkgfHwKKwkJCQkgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgfHwKKwkJCQkgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCk7CisJCXBBZC0+TWxtZUF1eC5DYXBhYmlsaXR5SW5mbyAgICA9IENBUF9HRU5FUkFURSgwLDEsUHJpdmFjeSwgKHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZVNob3J0KSwgMSwgMCk7CisJCXBBZC0+TWxtZUF1eC5CZWFjb25QZXJpb2QgICAgICA9IHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZDsKKwkJcEFkLT5NbG1lQXV4LkF0aW1XaW4gICAgICAgICAgID0gcEFkLT5TdGFDZmcuQXRpbVdpbjsKKwkJcEFkLT5NbG1lQXV4LkNoYW5uZWwgICAgICAgICAgID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKKworCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCAgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCQlwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwgICAgPSBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbDsKKworCQlwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbj0gcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbjsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlN1cFJhdGUsIHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKwkJUlRNUENoZWNrUmF0ZXMocEFkLCBwQWQtPk1sbWVBdXguU3VwUmF0ZSwgJnBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuKTsKKwkJcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gPSBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguRXh0UmF0ZSwgcEFkLT5Db21tb25DZmcuRXh0UmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOworCQlSVE1QQ2hlY2tSYXRlcyhwQWQsIHBBZC0+TWxtZUF1eC5FeHRSYXRlLCAmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4pOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQorCQl7CisJCQlSVE1QVXBkYXRlSFRJRSgmcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LCAmcEFkLT5TdGFDZmcuRGVzaXJlZEh0UGh5SW5mby5NQ1NTZXRbMF0sICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LCAmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbyk7CisJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuID0gc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpOworCQkJLy8gTm90IHR1cm4gcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuYkh0RW5hYmxlID0gVFJVRSBoZXJlLgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuYkh0RW5hYmxlID0gVFJVRVxuIikpOworCQl9CisJCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJeworCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiA9IDA7CisJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9IEZBTFNFOworCQl9CisJCS8vIHRlbXBvcmFyaWx5IG5vdCBzdXBwb3J0IFFPUyBpbiBJQlNTCisJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBFZGNhUGFybSwgc2l6ZW9mKEVEQ0FfUEFSTSkpOworCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFQUWJzc0xvYWQsIHNpemVvZihRQlNTX0xPQURfUEFSTSkpOworCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFQUW9zQ2FwYWJpbGl0eSwgc2l6ZW9mKFFPU19DQVBBQklMSVRZX1BBUk0pKTsKKworCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsLCBGQUxTRSk7CisJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsKTsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gTWxtZVN0YXJ0UmVxQWN0aW9uKGNoPSAlZCxzdXAgcmF0ZXM9ICVkLCBleHQgcmF0ZXM9JWQpXG4iLAorCQkJcEFkLT5NbG1lQXV4LkNoYW5uZWwsIHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLCBwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbikpOworCisJCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CisJCVN0YXR1cyA9IE1MTUVfU1VDQ0VTUzsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NUQVJUX0NPTkYsIDIsICZTdGF0dXMpOworCX0KKwllbHNlCisJeworCQlEQkdQUklOVF9FUlIoKCJTWU5DIC0gTWxtZVN0YXJ0UmVxQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWwuXG4iKSk7CisJCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CisJCVN0YXR1cyA9IE1MTUVfSU5WQUxJRF9GT1JNQVQ7CisJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9TVEFSVF9DT05GLCAyLCAmU3RhdHVzKTsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJcGVlciBzZW5kcyBiZWFjb24gYmFjayB3aGVuIHNjYW5uaW5nCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyQmVhY29uQXRTY2FuQWN0aW9uKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkLAorCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlVQ0hBUiAgICAgICAgICAgQnNzaWRbTUFDX0FERFJfTEVOXSwgQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUiAgICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdLCBCc3NUeXBlLCBDaGFubmVsLCBOZXdDaGFubmVsLAorCQkJCQlTc2lkTGVuLCBEdGltQ291bnQsIER0aW1QZXJpb2QsIEJjYXN0RmxhZywgTWVzc2FnZVRvTWU7CisJQ0ZfUEFSTSAgICAgICAgIENmUGFybTsKKwlVU0hPUlQgICAgICAgICAgQmVhY29uUGVyaW9kLCBBdGltV2luLCBDYXBhYmlsaXR5SW5mbzsKKwlQRlJBTUVfODAyXzExICAgcEZyYW1lOworCUxBUkdFX0lOVEVHRVIgICBUaW1lU3RhbXA7CisJVUNIQVIgICAgICAgICAgIEVycDsKKwlVQ0hBUiAgICAgICAgIAlTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJVUNIQVIJCSAgCVN1cFJhdGVMZW4sIEV4dFJhdGVMZW47CisJVVNIT1JUIAkJCUxlblZJRTsKKwlVQ0hBUgkJCUNraXBGbGFnOworCVVDSEFSCQkJQWlyb25ldENlbGxQb3dlckxpbWl0OworCUVEQ0FfUEFSTSAgICAgICBFZGNhUGFybTsKKwlRQlNTX0xPQURfUEFSTSAgUWJzc0xvYWQ7CisJUU9TX0NBUEFCSUxJVFlfUEFSTSBRb3NDYXBhYmlsaXR5OworCVVMT05HCQkJCQkJUmFsaW5rSWU7CisJVUNIQVIJCQkJCQlWYXJJRVtNQVhfVklFX0xFTl07CQkvLyBUb3RhbCBWSUUgbGVuZ3RoID0gTUFYX1ZJRV9MRU4gLSAtNQorCU5ESVNfODAyXzExX1ZBUklBQkxFX0lFcwkqcFZJRSA9IE5VTEw7CisJSFRfQ0FQQUJJTElUWV9JRQkJSHRDYXBhYmlsaXR5OworCUFERF9IVF9JTkZPX0lFCQlBZGRIdEluZm87CS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQorCVVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuID0gMCwgUHJlTkh0Q2FwYWJpbGl0eUxlbiA9IDA7CisJVUNIQVIJCQlBZGRIdEluZm9MZW47CisJVUNIQVIJCQlOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKKworCisJLy8gTmRpc0ZpbGxNZW1vcnkoU3NpZCwgTUFYX0xFTl9PRl9TU0lELCAweDAwKTsKKwlwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSkgRWxlbS0+TXNnOworCS8vIEluaXQgVmFyaWFibGUgSUUgc3RydWN0dXJlCisJcFZJRSA9IChQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzKSBWYXJJRTsKKwlwVklFLT5MZW5ndGggPSAwOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgIFJUTVBaZXJvTWVtb3J5KCZIdENhcGFiaWxpdHksIHNpemVvZihIdENhcGFiaWxpdHkpKTsKKwlSVE1QWmVyb01lbW9yeSgmQWRkSHRJbmZvLCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCWlmIChQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkocEFkLAorCQkJCQkJCQlFbGVtLT5Nc2csCisJCQkJCQkJCUVsZW0tPk1zZ0xlbiwKKwkJCQkJCQkJRWxlbS0+Q2hhbm5lbCwKKwkJCQkJCQkJQWRkcjIsCisJCQkJCQkJCUJzc2lkLAorCQkJCQkJCQlTc2lkLAorCQkJCQkJCQkmU3NpZExlbiwKKwkJCQkJCQkJJkJzc1R5cGUsCisJCQkJCQkJCSZCZWFjb25QZXJpb2QsCisJCQkJCQkJCSZDaGFubmVsLAorCQkJCQkJCQkmTmV3Q2hhbm5lbCwKKwkJCQkJCQkJJlRpbWVTdGFtcCwKKwkJCQkJCQkJJkNmUGFybSwKKwkJCQkJCQkJJkF0aW1XaW4sCisJCQkJCQkJCSZDYXBhYmlsaXR5SW5mbywKKwkJCQkJCQkJJkVycCwKKwkJCQkJCQkJJkR0aW1Db3VudCwKKwkJCQkJCQkJJkR0aW1QZXJpb2QsCisJCQkJCQkJCSZCY2FzdEZsYWcsCisJCQkJCQkJCSZNZXNzYWdlVG9NZSwKKwkJCQkJCQkJU3VwUmF0ZSwKKwkJCQkJCQkJJlN1cFJhdGVMZW4sCisJCQkJCQkJCUV4dFJhdGUsCisJCQkJCQkJCSZFeHRSYXRlTGVuLAorCQkJCQkJCQkmQ2tpcEZsYWcsCisJCQkJCQkJCSZBaXJvbmV0Q2VsbFBvd2VyTGltaXQsCisJCQkJCQkJCSZFZGNhUGFybSwKKwkJCQkJCQkJJlFic3NMb2FkLAorCQkJCQkJCQkmUW9zQ2FwYWJpbGl0eSwKKwkJCQkJCQkJJlJhbGlua0llLAorCQkJCQkJCQkmSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJCQkmUHJlTkh0Q2FwYWJpbGl0eUxlbiwKKwkJCQkJCQkJJkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkJJkFkZEh0SW5mb0xlbiwKKwkJCQkJCQkJJkFkZEh0SW5mbywKKwkJCQkJCQkJJk5ld0V4dENoYW5uZWxPZmZzZXQsCisJCQkJCQkJCSZMZW5WSUUsCisJCQkJCQkJCXBWSUUpKQorCXsKKwkJVUxPTkcgSWR4OworCQlDSEFSIFJzc2kgPSAwOworCisJCUlkeCA9IEJzc1RhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIEJzc2lkLCBDaGFubmVsKTsKKwkJaWYgKElkeCAhPSBCU1NfTk9UX0ZPVU5EKQorCQkJUnNzaSA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLlJzc2k7CisKKwkJUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kwLCBSU1NJXzApLCBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTEsIFJTU0lfMSksIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMiwgUlNTSV8yKSk7CisKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlpZiAoKEh0Q2FwYWJpbGl0eUxlbiA+IDApIHx8IChQcmVOSHRDYXBhYmlsaXR5TGVuID4gMCkpCisJCQlIdENhcGFiaWxpdHlMZW4gPSBTSVpFX0hUX0NBUF9JRTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJaWYgKChwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlICE9IE1TUk5fVFlQRV9VTlVTRUQpICYmIChDaGFubmVsID09IHBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsKSkKKwkJeworCQkJSWR4ID0gQnNzVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIsIEJzc2lkLCBTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsCisJCQkJCQkgJkNmUGFybSwgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsIFN1cFJhdGVMZW4sRXh0UmF0ZSwgRXh0UmF0ZUxlbiwgJkh0Q2FwYWJpbGl0eSwKKwkJCQkJCSAmQWRkSHRJbmZvLCBIdENhcGFiaWxpdHlMZW4sIEFkZEh0SW5mb0xlbiwgTmV3RXh0Q2hhbm5lbE9mZnNldCwgQ2hhbm5lbCwgUnNzaSwgVGltZVN0YW1wLCBDa2lwRmxhZywKKwkJCQkJCSAmRWRjYVBhcm0sICZRb3NDYXBhYmlsaXR5LCAmUWJzc0xvYWQsIExlblZJRSwgcFZJRSk7CisJCQlpZiAoSWR4ICE9IEJTU19OT1RfRk9VTkQpCisJCQl7CisJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuQ0NYQnNzVGFiLkJzc0VudHJ5W0lkeF0uUFRTRiwgJkVsZW0tPk1zZ1syNF0sIDQpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIuQnNzRW50cnlbSWR4XS5UVFNGWzBdLCAmRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYi5Cc3NFbnRyeVtJZHhdLlRUU0ZbNF0sICZFbGVtLT5UaW1lU3RhbXAudS5Mb3dQYXJ0LCA0KTsKKwkJCQlpZiAocEFkLT5TdGFDZmcuQ0NYUmVxVHlwZSA9PSBNU1JOX1RZUEVfQkVBQ09OX1JFUSkKKwkJCQkJQWlyb25ldEFkZEJlYWNvblJlcG9ydChwQWQsIElkeCwgRWxlbSk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlJZHggPSBCc3NUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+U2NhblRhYiwgQnNzaWQsIFNzaWQsIFNzaWRMZW4sIEJzc1R5cGUsIEJlYWNvblBlcmlvZCwKKwkJCQkJCSAgJkNmUGFybSwgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4sICAmSHRDYXBhYmlsaXR5LAorCQkJCQkJICZBZGRIdEluZm8sIEh0Q2FwYWJpbGl0eUxlbiwgQWRkSHRJbmZvTGVuLCBOZXdFeHRDaGFubmVsT2Zmc2V0LCBDaGFubmVsLCBSc3NpLCBUaW1lU3RhbXAsIENraXBGbGFnLAorCQkJCQkJICZFZGNhUGFybSwgJlFvc0NhcGFiaWxpdHksICZRYnNzTG9hZCwgTGVuVklFLCBwVklFKTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyNpZmRlZiBET1QxMU5fRFJBRlQzCisJCQlpZiAocEFkLT5DaGFubmVsTGlzdFtwQWQtPkNvbW1vbkNmZy5DaGFubmVsTGlzdElkeF0uYkVmZmVjdGVkQ2hhbm5lbCA9PSBUUlVFKQorCQkJeworCQkJCVVDSEFSCQlSZWdDbGFzczsKKwkJCQlQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkyKHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZSZWdDbGFzcyk7CisJCQkJVHJpRXZlbnRUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYiwgQnNzaWQsICZIdENhcGFiaWxpdHksIEh0Q2FwYWJpbGl0eUxlbiwgUmVnQ2xhc3MsIENoYW5uZWwpOworCQkJfQorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCWlmIChJZHggIT0gQlNTX05PVF9GT1VORCkKKwkJCXsKKwkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5QVFNGLCAmRWxlbS0+TXNnWzI0XSwgNCk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLlRUU0ZbMF0sICZFbGVtLT5UaW1lU3RhbXAudS5Mb3dQYXJ0LCA0KTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uVFRTRls0XSwgJkVsZW0tPlRpbWVTdGFtcC51Lkxvd1BhcnQsIDQpOworCQkJfQorCQl9CisJfQorCS8vIHNhbml0eSBjaGVjayBmYWlsLCBpZ25vcmVkCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJV2hlbiB3YWl0aW5nIGpvaW5pbmcgdGhlIChJKUJTUywgYmVhY29uIHJlY2VpdmVkIGZyb20gZXh0ZXJuYWwKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFBlZXJCZWFjb25BdEpvaW5BY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSICAgICAgICAgQnNzaWRbTUFDX0FERFJfTEVOXSwgQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlVQ0hBUiAgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXSwgU3NpZExlbiwgQnNzVHlwZSwgQ2hhbm5lbCwgTWVzc2FnZVRvTWUsCisJCQkJICBEdGltQ291bnQsIER0aW1QZXJpb2QsIEJjYXN0RmxhZywgTmV3Q2hhbm5lbDsKKwlMQVJHRV9JTlRFR0VSIFRpbWVTdGFtcDsKKwlVU0hPUlQgICAgICAgIEJlYWNvblBlcmlvZCwgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm87CisJQ0ZfUEFSTSAgICAgICBDZjsKKwlCT09MRUFOICAgICAgIFRpbWVyQ2FuY2VsbGVkOworCVVDSEFSICAgICAgICAgRXJwOworCVVDSEFSICAgICAgICAgU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU10sIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSCQkgIFN1cFJhdGVMZW4sIEV4dFJhdGVMZW47CisJVUNIQVIgICAgICAgICBDa2lwRmxhZzsKKwlVU0hPUlQgCQkgIExlblZJRTsKKwlVQ0hBUgkJICBBaXJvbmV0Q2VsbFBvd2VyTGltaXQ7CisJRURDQV9QQVJNICAgICAgIEVkY2FQYXJtOworCVFCU1NfTE9BRF9QQVJNICBRYnNzTG9hZDsKKwlRT1NfQ0FQQUJJTElUWV9QQVJNIFFvc0NhcGFiaWxpdHk7CisJVVNIT1JUICAgICAgICBTdGF0dXM7CisJVUNIQVIJCQkJCQlWYXJJRVtNQVhfVklFX0xFTl07CQkvLyBUb3RhbCBWSUUgbGVuZ3RoID0gTUFYX1ZJRV9MRU4gLSAtNQorCU5ESVNfODAyXzExX1ZBUklBQkxFX0lFcwkqcFZJRSA9IE5VTEw7CisJVUxPTkcgICAgICAgICAgIFJhbGlua0llOworCVVMT05HICAgICAgICAgSWR4OworCUhUX0NBUEFCSUxJVFlfSUUJCUh0Q2FwYWJpbGl0eTsKKwlBRERfSFRfSU5GT19JRQkJQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKKwlVQ0hBUgkJCQlIdENhcGFiaWxpdHlMZW4gPSAwLCBQcmVOSHRDYXBhYmlsaXR5TGVuID0gMDsKKwlVQ0hBUgkJCUFkZEh0SW5mb0xlbjsKKwlVQ0hBUgkJCU5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCVVDSEFSCQkJQ2VudHJhbENoYW5uZWw7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwkvLyBJbml0IFZhcmlhYmxlIElFIHN0cnVjdHVyZQorCXBWSUUgPSAoUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcykgVmFySUU7CisJcFZJRS0+TGVuZ3RoID0gMDsKKyAgICBSVE1QWmVyb01lbW9yeSgmSHRDYXBhYmlsaXR5LCBzaXplb2YoSHRDYXBhYmlsaXR5KSk7CisJUlRNUFplcm9NZW1vcnkoJkFkZEh0SW5mbywgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7CisKKworCWlmIChQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkocEFkLAorCQkJCQkJCQlFbGVtLT5Nc2csCisJCQkJCQkJCUVsZW0tPk1zZ0xlbiwKKwkJCQkJCQkJRWxlbS0+Q2hhbm5lbCwKKwkJCQkJCQkJQWRkcjIsCisJCQkJCQkJCUJzc2lkLAorCQkJCQkJCQlTc2lkLAorCQkJCQkJCQkmU3NpZExlbiwKKwkJCQkJCQkJJkJzc1R5cGUsCisJCQkJCQkJCSZCZWFjb25QZXJpb2QsCisJCQkJCQkJCSZDaGFubmVsLAorCQkJCQkJCQkmTmV3Q2hhbm5lbCwKKwkJCQkJCQkJJlRpbWVTdGFtcCwKKwkJCQkJCQkJJkNmLAorCQkJCQkJCQkmQXRpbVdpbiwKKwkJCQkJCQkJJkNhcGFiaWxpdHlJbmZvLAorCQkJCQkJCQkmRXJwLAorCQkJCQkJCQkmRHRpbUNvdW50LAorCQkJCQkJCQkmRHRpbVBlcmlvZCwKKwkJCQkJCQkJJkJjYXN0RmxhZywKKwkJCQkJCQkJJk1lc3NhZ2VUb01lLAorCQkJCQkJCQlTdXBSYXRlLAorCQkJCQkJCQkmU3VwUmF0ZUxlbiwKKwkJCQkJCQkJRXh0UmF0ZSwKKwkJCQkJCQkJJkV4dFJhdGVMZW4sCisJCQkJCQkJCSZDa2lwRmxhZywKKwkJCQkJCQkJJkFpcm9uZXRDZWxsUG93ZXJMaW1pdCwKKwkJCQkJCQkJJkVkY2FQYXJtLAorCQkJCQkJCQkmUWJzc0xvYWQsCisJCQkJCQkJCSZRb3NDYXBhYmlsaXR5LAorCQkJCQkJCQkmUmFsaW5rSWUsCisJCQkJCQkJCSZIdENhcGFiaWxpdHlMZW4sCisJCQkJCQkJCSZQcmVOSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJCQkmSHRDYXBhYmlsaXR5LAorCQkJCQkJCQkmQWRkSHRJbmZvTGVuLAorCQkJCQkJCQkmQWRkSHRJbmZvLAorCQkJCQkJCQkmTmV3RXh0Q2hhbm5lbE9mZnNldCwKKwkJCQkJCQkJJkxlblZJRSwKKwkJCQkJCQkJcFZJRSkpCisJeworCQkvLyBEaXNxdWFsaWZ5IDExYiBvbmx5IGFkaG9jIHdoZW4gd2UgYXJlIGluIDExZyBvbmx5IGFkaG9jIG1vZGUKKwkJaWYgKChCc3NUeXBlID09IEJTU19BREhPQykgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExRykgJiYgKChTdXBSYXRlTGVuK0V4dFJhdGVMZW4pPCAxMikpCisJCQlyZXR1cm47CisKKwkJLy8gQkVBQ09OIGZyb20gZGVzaXJlZCBCU1MvSUJTUyBmb3VuZC4gV2Ugc2hvdWxkIGJlIGFibGUgdG8gZGVjaWRlIG1vc3QKKwkJLy8gQlNTIHBhcmFtZXRlcnMgaGVyZS4KKwkJLy8gUS4gQnV0IHdoYXQgaGFwcGVuIGlmIHRoaXMgSk9JTiBkb2Vzbid0IGNvbmNsdWRlIGEgc3VjY2Vzc2Z1bCBBU1NPQ0lBVEVJT04/CisJCS8vICAgIERvIHdlIG5lZWQgdG8gcmVjZW92ZXIgYmFjayBhbGwgcGFyYW1ldGVycyBiZWxvbmdpbmcgdG8gcHJldmlvdXMgQlNTPworCQkvLyBBLiBTaG91bGQgYmUgbm90LiBUaGVyZSdzIG5vIGJhY2stZG9vciByZWNvdmVyIHRvIHByZXZpb3VzIEFQLiBJdCBzdGlsbCBuZWVkCisJCS8vICAgIGEgbmV3IEpPSU4tQVVUSC1BU1NPQyBzZXF1ZW5jZS4KKwkJaWYgKE1BQ19BRERSX0VRVUFMKHBBZC0+TWxtZUF1eC5Cc3NpZCwgQnNzaWQpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gcmVjZWl2ZSBkZXNpcmVkIEJFQUNPTiBhdCBKb2luV2FpdEJlYWNvbi4uLiBDaGFubmVsID0gJWRcbiIsIENoYW5uZWwpKTsKKwkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCisJCQkvLyBVcGRhdGUgUlNTSSB0byBwcmV2ZW50IE5vIHNpZ25hbCBkaXNwbGF5IHdoZW4gY2FyZHMgZmlyc3QgaW5pdGlhbGl6ZWQKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwCT0gQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kwLCBSU1NJXzApOworCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEJPSBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTEsIFJTU0lfMSk7CisJCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMgk9IENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMiwgUlNTSV8yKTsKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAJPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMDsKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTBYOAk9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAgPDwgMzsKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTEJPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMTsKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTFYOAk9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTEgPDwgMzsKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTIJPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMjsKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTJYOAk9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTIgPDwgMzsKKworCQkJLy8KKwkJCS8vIFdlIG5lZWQgdG8gY2hlY2sgaWYgU1NJRCBvbmx5IHNldCB0byBhbnksIHRoZW4gd2UgY2FuIHJlY29yZCB0aGUgY3VycmVudCBTU0lELgorCQkJLy8gT3RoZXJ3aXNlIHdpbGwgY2F1c2UgaGlkZGVuIFNTSUQgYXNzb2NpYXRpb24gZmFpbGVkLgorCQkJLy8KKwkJCWlmIChwQWQtPk1sbWVBdXguU3NpZExlbiA9PSAwKQorCQkJeworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBTc2lkLCBTc2lkTGVuKTsKKwkJCQlwQWQtPk1sbWVBdXguU3NpZExlbiA9IFNzaWRMZW47CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJSWR4ID0gQnNzU3NpZFRhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIEJzc2lkLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4sIENoYW5uZWwpOworCisJCQkJaWYgKElkeCAhPSBCU1NfTk9UX0ZPVU5EKQorCQkJCXsKKwkJCQkJLy8KKwkJCQkJLy8gTXVsdGlwbGUgU1NJRCBjYXNlLCB1c2VkIGNvcnJlY3QgQ2FwYWJpbGl0eUluZm8KKwkJCQkJLy8KKwkJCQkJQ2FwYWJpbGl0eUluZm8gPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5DYXBhYmlsaXR5SW5mbzsKKwkJCQl9CisJCQl9CisJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguQnNzaWQsIEJzc2lkLCBNQUNfQUREUl9MRU4pOworCQkJcEFkLT5NbG1lQXV4LkNhcGFiaWxpdHlJbmZvID0gQ2FwYWJpbGl0eUluZm8gJiBTVVBQT1JURURfQ0FQQUJJTElUWV9JTkZPOworCQkJcEFkLT5NbG1lQXV4LkJzc1R5cGUgPSBCc3NUeXBlOworCQkJcEFkLT5NbG1lQXV4LkJlYWNvblBlcmlvZCA9IEJlYWNvblBlcmlvZDsKKwkJCXBBZC0+TWxtZUF1eC5DaGFubmVsID0gQ2hhbm5lbDsKKwkJCXBBZC0+TWxtZUF1eC5BdGltV2luID0gQXRpbVdpbjsKKwkJCXBBZC0+TWxtZUF1eC5DZnBQZXJpb2QgPSBDZi5DZnBQZXJpb2Q7CisJCQlwQWQtPk1sbWVBdXguQ2ZwTWF4RHVyYXRpb24gPSBDZi5DZnBNYXhEdXJhdGlvbjsKKwkJCXBBZC0+TWxtZUF1eC5BUFJhbGlua0llID0gUmFsaW5rSWU7CisKKwkJCS8vIENvcHkgQVAncyBzdXBwb3J0ZWQgcmF0ZSB0byBNbG1lQXV4IGZvciBjcmVhdGluZyBhc3NvaWNhdGlvbiByZXF1ZXN0CisJCQkvLyBBbHNvIGZpbHRlciBvdXQgbm90IHN1cHBvcnRlZCByYXRlCisJCQlwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiA9IFN1cFJhdGVMZW47CisJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3VwUmF0ZSwgU3VwUmF0ZSwgU3VwUmF0ZUxlbik7CisJCQlSVE1QQ2hlY2tSYXRlcyhwQWQsIHBBZC0+TWxtZUF1eC5TdXBSYXRlLCAmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4pOworCQkJcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gPSBFeHRSYXRlTGVuOworCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LkV4dFJhdGUsIEV4dFJhdGUsIEV4dFJhdGVMZW4pOworCQkJUlRNUENoZWNrUmF0ZXMocEFkLCBwQWQtPk1sbWVBdXguRXh0UmF0ZSwgJnBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuKTsKKworICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXQsIDE2KTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCXBBZC0+TWxtZUF1eC5OZXdFeHRDaGFubmVsT2Zmc2V0ID0gTmV3RXh0Q2hhbm5lbE9mZnNldDsKKwkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPSBIdENhcGFiaWxpdHlMZW47CisKKwkJCS8vIGZpbHRlciBvdXQgdW4tc3VwcG9ydGVkIGh0IHJhdGVzCisJCQlpZiAoKChIdENhcGFiaWxpdHlMZW4gPiAwKSB8fCAoUHJlTkh0Q2FwYWJpbGl0eUxlbiA+IDApKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKKwkJCXsKKwkJCQlSVE1QWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwgU0laRV9IVF9DQVBfSUUpOworICAgCQkJCVJUTVBNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguQWRkSHRJbmZvLCAmQWRkSHRJbmZvLCBTSVpFX0FERF9IVF9JTkZPX0lFKTsKKworCQkJCS8vIFN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5NQ1NTZXQgc3RvcmVzIFBlZXIgQVAncyAxMW4gUnggY2FwYWJpbGl0eQorCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0LCBIdENhcGFiaWxpdHkuTUNTU2V0LCAxNik7CisJCQkJcEFkLT5NbG1lQXV4Lk5ld0V4dENoYW5uZWxPZmZzZXQgPSBOZXdFeHRDaGFubmVsT2Zmc2V0OworCQkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPSBTSVpFX0hUX0NBUF9JRTsKKwkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9IFRSVUU7CisJCQkJaWYgKFByZU5IdENhcGFiaWxpdHlMZW4gPiAwKQorCQkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJQcmVOSHQgPSBUUlVFOworCQkJCVJUTVBDaGVja0h0KHBBZCwgQlNTSURfV0NJRCwgJkh0Q2FwYWJpbGl0eSwgJkFkZEh0SW5mbyk7CisJCQkJLy8gQ29weSBBUCBQYXJhbWV0ZXIgdG8gU3RhQWN0aXZlLiAgVGhpcyBpcyBhbHNvIGluIExpbmtVcC4KKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQXRKb2luQWN0aW9uISAoTXBkdURlbnNpdHk9JWQsIE1heFJBbXBkdUZhY3Rvcj0lZCwgQlc9JWQpXG4iLAorCQkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5NcGR1RGVuc2l0eSwgcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuTWF4UkFtcGR1RmFjdG9yLCBIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCkpOworCisJCQkJaWYgKEFkZEh0SW5mb0xlbiA+IDApCisJCQkJeworCQkJCQlDZW50cmFsQ2hhbm5lbCA9IEFkZEh0SW5mby5Db250cm9sQ2hhbjsKKwkJIAkJCS8vIENoZWNrIGFnYWluIHRoZSBCYW5kd2lkdGggY2FwYWJpbGl0eSBvZiB0aGlzIEFQLgorCQkgCQkJaWYgKChBZGRIdEluZm8uQ29udHJvbENoYW4gPiAyKSYmIChBZGRIdEluZm8uQWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0gRVhUQ0hBX0JFTE9XKSAmJiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQorCQkgCQkJeworCQkgCQkJCUNlbnRyYWxDaGFubmVsID0gQWRkSHRJbmZvLkNvbnRyb2xDaGFuIC0gMjsKKwkJIAkJCX0KKwkJIAkJCWVsc2UgaWYgKChBZGRIdEluZm8uQWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0gRVhUQ0hBX0FCT1ZFKSAmJiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQorCQkgCQkJeworCQkgCQkJCUNlbnRyYWxDaGFubmVsID0gQWRkSHRJbmZvLkNvbnRyb2xDaGFuICsgMjsKKwkJIAkJCX0KKworCQkJCQkvLyBDaGVjayBFcnJvciAuCisJCQkJCWlmIChwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwgIT0gQ2VudHJhbENoYW5uZWwpCisJCSAJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUGVlckJlYWNvbkF0Sm9pbkFjdGlvbiBIVD09PT5CZWFjb24gQ2VudHJhbCBDaGFubmVsID0gJWQsIENvbnRyb2wgQ2hhbm5lbCA9ICVkLiBNbG1lYXV4IENlbnRyYWxDaGFubmVsID0gJWRcbiIsIENlbnRyYWxDaGFubmVsLCBBZGRIdEluZm8uQ29udHJvbENoYW4sIHBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCkpOworCisJCSAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQXRKb2luQWN0aW9uIEhUPT09PkNlbnRyYWwgQ2hhbm5lbCA9ICVkLCBDb250cm9sIENoYW5uZWwgPSAlZCwgIC5cbiIsIENlbnRyYWxDaGFubmVsLCBBZGRIdEluZm8uQ29udHJvbENoYW4pKTsKKworCQkJCX0KKworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJeworICAgCQkJCS8vIFRvIHByZXZlbnQgZXJyb3IsIGxldCBsZWdhY3kgQVAgbXVzdCBoYXZlIHNhbWUgQ2VudHJhbENoYW5uZWwgYW5kIENoYW5uZWwuCisJCQkJaWYgKChIdENhcGFiaWxpdHlMZW4gPT0gMCkgJiYgKFByZU5IdENhcGFiaWxpdHlMZW4gPT0gMCkpCisJCQkJCXBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+TWxtZUF1eC5DaGFubmVsOworCisJCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBGQUxTRTsKKwkJCQlSVE1QWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwgU0laRV9IVF9DQVBfSUUpOworCQkJCVJUTVBaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQWRkSHRJbmZvLCBTSVpFX0FERF9IVF9JTkZPX0lFKTsKKwkJCX0KKworCQkJUlRNUFVwZGF0ZU1sbWVSYXRlKHBBZCk7CisKKwkJCS8vIGNvcHkgUU9TIHJlbGF0ZWQgaW5mb3JtYXRpb24KKwkJCWlmICgocEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUpCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkJKQorCQkJeworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBFZGNhUGFybSwgJkVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5BUFFic3NMb2FkLCAmUWJzc0xvYWQsIHNpemVvZihRQlNTX0xPQURfUEFSTSkpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBRb3NDYXBhYmlsaXR5LCAmUW9zQ2FwYWJpbGl0eSwgc2l6ZW9mKFFPU19DQVBBQklMSVRZX1BBUk0pKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0sIHNpemVvZihFRENBX1BBUk0pKTsKKwkJCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFQUWJzc0xvYWQsIHNpemVvZihRQlNTX0xPQURfUEFSTSkpOworCQkJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBRb3NDYXBhYmlsaXR5LCBzaXplb2YoUU9TX0NBUEFCSUxJVFlfUEFSTSkpOworCQkJfQorCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gYWZ0ZXIgSk9JTiwgU3VwUmF0ZUxlbj0lZCwgRXh0UmF0ZUxlbj0lZFxuIiwKKwkJCQkJCQkJCQlwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwgcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4pKTsKKworI2lmZGVmIExFQVBfU1VQUE9SVAorCQkJLy8gVXBkYXRlIENraXBGbGFnCisJCQlwQWQtPlN0YUNmZy5Da2lwRmxhZyA9IENraXBGbGFnOworCisJCQkvLyBLZWVwIFRpbWVTdGFtcCBmb3IgUmUtQXNzb2NpYXRpb24gdXNlZC4KKwkJCWlmIChMRUFQX0NDS01fT04ocEFkKSAmJiAocEFkLT5TdGFDZmcuQ0NLTUxpbmtVcEZsYWcgPT0gVFJVRSkpCisJCQkJcEFkLT5TdGFDZmcuQ0NLTUJlYWNvbkF0Sm9pblRpbWVTdGFtcCA9IFRpbWVTdGFtcDsKKyNlbmRpZiAvLyBMRUFQX1NVUFBPUlQgLy8KKworCQkJaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCAhPSAweEZGKQorCQkJeworCQkJCS8vV2UgbmVlZCB0byBjaGFuZ2Ugb3VyIFR4UG93ZXIgZm9yIENDWCAyLjAgQVAgQ29udHJvbCBvZiBDbGllbnQgVHJhbnNtaXQgUG93ZXIKKwkJCQlDaGFuZ2VUb0NlbGxQb3dlckxpbWl0KHBBZCwgQWlyb25ldENlbGxQb3dlckxpbWl0KTsKKwkJCX0KKwkJCWVsc2UgIC8vVXNlZCB0aGUgZGVmYXVsdCBUWCBQb3dlciBQZXJjZW50YWdlLgorCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQ7CisKKwkJCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CisJCQlTdGF0dXMgPSBNTE1FX1NVQ0NFU1M7CisJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfSk9JTl9DT05GLCAyLCAmU3RhdHVzKTsKKwkJfQorCQkvLyBub3QgdG8gbWUgQkVBQ09OLCBpZ25vcmVkCisJfQorCS8vIHNhbml0eSBjaGVjayBmYWlsLCBpZ25vcmUgdGhpcyBmcmFtZQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCXJlY2VpdmUgQkVBQ09OIGZyb20gcGVlcgorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIFBlZXJCZWFjb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSICAgICAgICAgQnNzaWRbTUFDX0FERFJfTEVOXSwgQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlDSEFSICAgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKKwlDRl9QQVJNICAgICAgIENmUGFybTsKKwlVQ0hBUiAgICAgICAgIFNzaWRMZW4sIE1lc3NhZ2VUb01lPTAsIEJzc1R5cGUsIENoYW5uZWwsIE5ld0NoYW5uZWwsIGluZGV4PTA7CisJVUNIQVIgICAgICAgICBEdGltQ291bnQ9MCwgRHRpbVBlcmlvZD0wLCBCY2FzdEZsYWc9MDsKKwlVU0hPUlQgICAgICAgIENhcGFiaWxpdHlJbmZvLCBBdGltV2luLCBCZWFjb25QZXJpb2Q7CisJTEFSR0VfSU5URUdFUiBUaW1lU3RhbXA7CisJVVNIT1JUICAgICAgICBUYnR0TnVtVG9OZXh0V2FrZVVwOworCVVDSEFSICAgICAgICAgRXJwOworCVVDSEFSICAgICAgICAgU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU10sIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCVVDSEFSCQkgIFN1cFJhdGVMZW4sIEV4dFJhdGVMZW47CisJVUNIQVIJCSAgQ2tpcEZsYWc7CisJVVNIT1JUICAgICAgICBMZW5WSUU7CisJVUNIQVIJCSAgQWlyb25ldENlbGxQb3dlckxpbWl0OworCUVEQ0FfUEFSTSAgICAgICBFZGNhUGFybTsKKwlRQlNTX0xPQURfUEFSTSAgUWJzc0xvYWQ7CisJUU9TX0NBUEFCSUxJVFlfUEFSTSBRb3NDYXBhYmlsaXR5OworCVVMT05HICAgICAgICAgICBSYWxpbmtJZTsKKwkvLyBOZXcgZm9yIFdQQSBzZWN1cml0eSBzdWl0ZXMKKwlVQ0hBUgkJCQkJCVZhcklFW01BWF9WSUVfTEVOXTsJCS8vIFRvdGFsIFZJRSBsZW5ndGggPSBNQVhfVklFX0xFTiAtIC01CisJTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzCSpwVklFID0gTlVMTDsKKwlIVF9DQVBBQklMSVRZX0lFCQlIdENhcGFiaWxpdHk7CisJQUREX0hUX0lORk9fSUUJCUFkZEh0SW5mbzsJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCisJVUNIQVIJCQlIdENhcGFiaWxpdHlMZW4sIFByZU5IdENhcGFiaWxpdHlMZW47CisJVUNIQVIJCQlBZGRIdEluZm9MZW47CisJVUNIQVIJCQlOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKKworCisjaWZkZWYgUkFMSU5LX0FURQorICAgIGlmIChBVEVfT04ocEFkKSkKKyAgICB7CisJCXJldHVybjsKKyAgICB9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCisJaWYgKCEoSU5GUkFfT04ocEFkKSB8fCBBREhPQ19PTihwQWQpCisJCSkpCisJCXJldHVybjsKKworCS8vIEluaXQgVmFyaWFibGUgSUUgc3RydWN0dXJlCisJcFZJRSA9IChQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzKSBWYXJJRTsKKwlwVklFLT5MZW5ndGggPSAwOworICAgIFJUTVBaZXJvTWVtb3J5KCZIdENhcGFiaWxpdHksIHNpemVvZihIdENhcGFiaWxpdHkpKTsKKwlSVE1QWmVyb01lbW9yeSgmQWRkSHRJbmZvLCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKKworCWlmIChQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkocEFkLAorCQkJCQkJCQlFbGVtLT5Nc2csCisJCQkJCQkJCUVsZW0tPk1zZ0xlbiwKKwkJCQkJCQkJRWxlbS0+Q2hhbm5lbCwKKwkJCQkJCQkJQWRkcjIsCisJCQkJCQkJCUJzc2lkLAorCQkJCQkJCQlTc2lkLAorCQkJCQkJCQkmU3NpZExlbiwKKwkJCQkJCQkJJkJzc1R5cGUsCisJCQkJCQkJCSZCZWFjb25QZXJpb2QsCisJCQkJCQkJCSZDaGFubmVsLAorCQkJCQkJCQkmTmV3Q2hhbm5lbCwKKwkJCQkJCQkJJlRpbWVTdGFtcCwKKwkJCQkJCQkJJkNmUGFybSwKKwkJCQkJCQkJJkF0aW1XaW4sCisJCQkJCQkJCSZDYXBhYmlsaXR5SW5mbywKKwkJCQkJCQkJJkVycCwKKwkJCQkJCQkJJkR0aW1Db3VudCwKKwkJCQkJCQkJJkR0aW1QZXJpb2QsCisJCQkJCQkJCSZCY2FzdEZsYWcsCisJCQkJCQkJCSZNZXNzYWdlVG9NZSwKKwkJCQkJCQkJU3VwUmF0ZSwKKwkJCQkJCQkJJlN1cFJhdGVMZW4sCisJCQkJCQkJCUV4dFJhdGUsCisJCQkJCQkJCSZFeHRSYXRlTGVuLAorCQkJCQkJCQkmQ2tpcEZsYWcsCisJCQkJCQkJCSZBaXJvbmV0Q2VsbFBvd2VyTGltaXQsCisJCQkJCQkJCSZFZGNhUGFybSwKKwkJCQkJCQkJJlFic3NMb2FkLAorCQkJCQkJCQkmUW9zQ2FwYWJpbGl0eSwKKwkJCQkJCQkJJlJhbGlua0llLAorCQkJCQkJCQkmSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJCQkmUHJlTkh0Q2FwYWJpbGl0eUxlbiwKKwkJCQkJCQkJJkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkJJkFkZEh0SW5mb0xlbiwKKwkJCQkJCQkJJkFkZEh0SW5mbywKKwkJCQkJCQkJJk5ld0V4dENoYW5uZWxPZmZzZXQsCisJCQkJCQkJCSZMZW5WSUUsCisJCQkJCQkJCXBWSUUpKQorCXsKKwkJQk9PTEVBTiBpc19teV9ic3NpZCwgaXNfbXlfc3NpZDsKKwkJVUxPTkcgICBCc3NpZHgsIE5vdzsKKwkJQlNTX0VOVFJZICpwQnNzOworCQlDSEFSCQlSZWFsUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kwLCBSU1NJXzApLCBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTEsIFJTU0lfMSksIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMiwgUlNTSV8yKSk7CisKKwkJaXNfbXlfYnNzaWQgPSBNQUNfQUREUl9FUVVBTChCc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpPyBUUlVFIDogRkFMU0U7CisJCWlzX215X3NzaWQgPSBTU0lEX0VRVUFMKFNzaWQsIFNzaWRMZW4sIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pPyBUUlVFOkZBTFNFOworCisKKwkJLy8gaWdub3JlIEJFQUNPTiBub3QgZm9yIG15IFNTSUQKKwkJaWYgKCghIGlzX215X3NzaWQpICYmICghIGlzX215X2Jzc2lkKSkKKwkJCXJldHVybjsKKworCQkvLyBJdCBtZWFucyBTVEEgd2FpdHMgZGlzYXNzb2MgY29tcGxldGVseSBmcm9tIHRoaXMgQVAsIGlnbm9yZXMgdGhpcyBiZWFjb24uCisJCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfV0FJVF9ESVNBU1NPQykKKwkJCXJldHVybjsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkvLyBDb3B5IENvbnRyb2wgY2hhbm5lbCBmb3IgdGhpcyBCU1NJRC4KKwkJaWYgKEFkZEh0SW5mb0xlbiAhPSAwKQorCQkJQ2hhbm5lbCA9IEFkZEh0SW5mby5Db250cm9sQ2hhbjsKKworCQlpZiAoKEh0Q2FwYWJpbGl0eUxlbiA+IDApIHx8IChQcmVOSHRDYXBhYmlsaXR5TGVuID4gMCkpCisJCQlIdENhcGFiaWxpdHlMZW4gPSBTSVpFX0hUX0NBUF9JRTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkvLworCQkvLyBIb3VzZWtlZXBpbmcgIlNzaWRCc3NUYWIiIHRhYmxlIGZvciBsYXRlci1vbiBST0FNaW5nIHVzYWdlLgorCQkvLworCQlCc3NpZHggPSBCc3NUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBCc3NpZCwgQ2hhbm5lbCk7CisJCWlmIChCc3NpZHggPT0gQlNTX05PVF9GT1VORCkKKwkJeworCQkJLy8gZGlzY292ZXIgbmV3IEFQIG9mIHRoaXMgbmV0d29yaywgY3JlYXRlIEJTUyBlbnRyeQorCQkJQnNzaWR4ID0gQnNzVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlNjYW5UYWIsIEJzc2lkLCBTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsCisJCQkJCQkgJkNmUGFybSwgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4sCisJCQkJCQkmSHRDYXBhYmlsaXR5LCAmQWRkSHRJbmZvLEh0Q2FwYWJpbGl0eUxlbixBZGRIdEluZm9MZW4sTmV3RXh0Q2hhbm5lbE9mZnNldCwgQ2hhbm5lbCwKKwkJCQkJCVJlYWxSc3NpLCBUaW1lU3RhbXAsIENraXBGbGFnLCAmRWRjYVBhcm0sICZRb3NDYXBhYmlsaXR5LAorCQkJCQkJJlFic3NMb2FkLCBMZW5WSUUsIHBWSUUpOworCQkJaWYgKEJzc2lkeCA9PSBCU1NfTk9UX0ZPVU5EKSAvLyByZXR1cm4gaWYgQlNTIHRhYmxlIGZ1bGwKKwkJCQlyZXR1cm47CisKKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLlBUU0YsICZFbGVtLT5Nc2dbMjRdLCA0KTsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5UVFNGWzBdLCAmRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7CisJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uVFRTRls0XSwgJkVsZW0tPlRpbWVTdGFtcC51Lkxvd1BhcnQsIDQpOworCisKKworCQl9CisKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJiAoTmV3Q2hhbm5lbCAhPSAwKSAmJiAoQ2hhbm5lbCAhPSBOZXdDaGFubmVsKSkKKwkJeworCQkJLy8gU3dpdGNoaW5nIHRvIGNoYW5uZWwgMSBjYW4gcHJldmVudCBmcm9tIHJlc2Nhbm5pbmcgdGhlIGN1cnJlbnQgY2hhbm5lbCBpbW1lZGlhdGVseSAoYnkgYXV0byByZWNvbm5lY3Rpb24pLgorCQkJLy8gSW4gYWRkaXRpb24sIGNsZWFyIHRoZSBNTE1FIHF1ZXVlIGFuZCB0aGUgc2NhbiB0YWJsZSB0byBkaXNjYXJkIHRoZSBSWCBwYWNrZXRzIGFuZCBwcmV2aW91cyBzY2FubmluZyByZXN1bHRzLgorCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCAxLCBGQUxTRSk7CisJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCAxKTsKKwkJICAgIExpbmtEb3duKHBBZCwgRkFMU0UpOworCQkJTWxtZVF1ZXVlSW5pdCgmcEFkLT5NbG1lLlF1ZXVlKTsKKwkJCUJzc1RhYmxlSW5pdCgmcEFkLT5TY2FuVGFiKTsKKwkJICAgIFJUTVB1c2VjRGVsYXkoMTAwMDAwMCk7CQkvLyB1c2UgZGVsYXkgdG8gcHJldmVudCBTVEEgZG8gcmVhc3NvYworCisJCQkvLyBjaGFubmVsIHNhbml0eSBjaGVjaworCQkJZm9yIChpbmRleCA9IDAgOyBpbmRleCA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGluZGV4KyspCisJCQl7CisJCQkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLkNoYW5uZWwgPT0gTmV3Q2hhbm5lbCkKKwkJCQl7CisJCQkJCXBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLkNoYW5uZWwgPSBOZXdDaGFubmVsOworCQkJCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsID0gTmV3Q2hhbm5lbDsKKwkJCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uIC0gU1RBIHJlY2VpdmUgY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IElFIChOZXcgQ2hhbm5lbCA9JWQpXG4iLCBOZXdDaGFubmVsKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGluZGV4ID49IHBBZC0+Q2hhbm5lbExpc3ROdW0pCisJCQl7CisJCQkJREJHUFJJTlRfRVJSKCgiUGVlckJlYWNvbihjYW4gbm90IGZpbmQgTmV3IENoYW5uZWw9JWQgaW4gQ2hhbm5lbExpc3RbJWRdXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPkNoYW5uZWxMaXN0TnVtKSk7CisJCQl9CisJCX0KKworCQkvLyBpZiB0aGUgc3NpZCBtYXRjaGVkICYgYnNzaWQgdW5tYXRjaGVkLCB3ZSBzaG91bGQgc2VsZWN0IHRoZSBic3NpZCB3aXRoIGxhcmdlIHZhbHVlLgorCQkvLyBUaGlzIG1pZ2h0IGhhcHBlbmVkIHdoZW4gdHdvIFNUQSBzdGFydCBhdCB0aGUgc2FtZSB0aW1lCisJCWlmICgoISBpc19teV9ic3NpZCkgJiYgQURIT0NfT04ocEFkKSkKKwkJeworCQkJSU5UCWk7CisKKwkJCS8vIEFkZCB0aGUgc2FmZWd1YXJkIGFnYWluc3QgdGhlIG1pc21hdGNoIG9mIGFkaG9jIHdlcCBzdGF0dXMKKwkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uV2VwU3RhdHVzKQorCQkJeworCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy8gY29sbGFwc2UgaW50byB0aGUgQURIT0MgbmV0d29yayB3aGljaCBoYXMgYmlnZ2VyIEJTU0lEIHZhbHVlLgorCQkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCXsKKwkJCQlpZiAoQnNzaWRbaV0gPiBwQWQtPkNvbW1vbkNmZy5Cc3NpZFtpXSkKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBtZXJnZSB0byB0aGUgSUJTUyB3aXRoIGJpZ2dlciBCU1NJRD0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCQkJCUJzc2lkWzBdLCBCc3NpZFsxXSwgQnNzaWRbMl0sIEJzc2lkWzNdLCBCc3NpZFs0XSwgQnNzaWRbNV0pKTsKKwkJCQkJQXNpY0Rpc2FibGVTeW5jKHBBZCk7CisJCQkJCUNPUFlfTUFDX0FERFIocEFkLT5Db21tb25DZmcuQnNzaWQsIEJzc2lkKTsKKwkJCQkJQXNpY1NldEJzc2lkKHBBZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJCQlNYWtlSWJzc0JlYWNvbihwQWQpOyAgICAgICAgLy8gcmUtYnVpbGQgQkVBQ09OIGZyYW1lCisJCQkJCUFzaWNFbmFibGVJYnNzU3luYyhwQWQpOyAgICAvLyBjb3B5IEJFQUNPTiBmcmFtZSB0byBvbi1jaGlwIG1lbW9yeQorCQkJCQlpc19teV9ic3NpZCA9IFRSVUU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQllbHNlIGlmIChCc3NpZFtpXSA8IHBBZC0+Q29tbW9uQ2ZnLkJzc2lkW2ldKQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCisKKwkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKKwkJcEJzcyA9ICZwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XTsKKwkJcEJzcy0+UnNzaSA9IFJlYWxSc3NpOyAgICAgICAvLyBsYXN0ZXN0IFJTU0kKKwkJcEJzcy0+TGFzdEJlYWNvblJ4VGltZSA9IE5vdzsgICAvLyBsYXN0IFJYIHRpbWVzdGFtcAorCisJCS8vCisJCS8vIEJFQUNPTiBmcm9tIG15IEJTU0lEIC0gZWl0aGVyIElCU1Mgb3IgSU5GUkEgbmV0d29yaworCQkvLworCQlpZiAoaXNfbXlfYnNzaWQpCisJCXsKKwkJCVJYV0lfU1RSVUMJUnhXSTsKKworCQkJcEFkLT5TdGFDZmcuRHRpbUNvdW50ID0gRHRpbUNvdW50OworCQkJcEFkLT5TdGFDZmcuRHRpbVBlcmlvZCA9IER0aW1QZXJpb2Q7CisJCQlwQWQtPlN0YUNmZy5MYXN0QmVhY29uUnhUaW1lID0gTm93OworCisKKwkJCVJ4V0kuUlNTSTAgPSBFbGVtLT5Sc3NpMDsKKwkJCVJ4V0kuUlNTSTEgPSBFbGVtLT5Sc3NpMTsKKwkJCVJ4V0kuUlNTSTIgPSBFbGVtLT5Sc3NpMjsKKworCQkJVXBkYXRlX1Jzc2lfU2FtcGxlKHBBZCwgJnBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUsICZSeFdJKTsKKwkJCWlmIChBaXJvbmV0Q2VsbFBvd2VyTGltaXQgIT0gMHhGRikKKwkJCXsKKwkJCQkvLworCQkJCS8vIFdlIGdldCB0aGUgQ2lzY28gKGNjeCkgIlR4UG93ZXIgTGltaXQiIHJlcXVpcmVkCisJCQkJLy8gQ2hhbmdlZCB0byBhcHByb3ByaWF0ZSBUeFBvd2VyIExpbWl0IGZvciBDaXNvIENvbXBhdGlibGUgRXh0ZW5zaW9ucworCQkJCS8vCisJCQkJQ2hhbmdlVG9DZWxsUG93ZXJMaW1pdChwQWQsIEFpcm9uZXRDZWxsUG93ZXJMaW1pdCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8KKwkJCQkvLyBBaXJvbmV0Q2VsbFBvd2VyTGltaXQgZXF1YWwgdG8gMHhGRiBtZWFucyB0aGUgQ2lzY28gKGNjeCkgIlR4UG93ZXIgTGltaXQiIG5vdCBleGlzdC4KKwkJCQkvLyBVc2VkIHRoZSBkZWZhdWx0IFRYIFBvd2VyIFBlcmNlbnRhZ2UsIHRoYXQgc2V0IGZyb20gVUkuCisJCQkJLy8KKwkJCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0OworCQkJfQorCisJCQlpZiAoQURIT0NfT04ocEFkKSAmJiAoQ0FQX0lTX0lCU1NfT04oQ2FwYWJpbGl0eUluZm8pKSkKKwkJCXsKKwkJCQlVQ0hBUgkJCU1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSAwOworCQkJCVVDSEFSCQkJaWR4OworCQkJCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCisJCQkJLy8gc3VwcG9ydGVkIHJhdGVzIGFycmF5IG1heSBub3QgYmUgc29ydGVkLiBzb3J0IGl0IGFuZCBmaW5kIHRoZSBtYXhpbXVtIHJhdGUKKwkJCSAgICBmb3IgKGlkeD0wOyBpZHg8U3VwUmF0ZUxlbjsgaWR4KyspCisJCQkgICAgeworCQkJICAgICAgICBpZiAoTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA8IChTdXBSYXRlW2lkeF0gJiAweDdmKSkKKwkJCSAgICAgICAgICAgIE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSBTdXBSYXRlW2lkeF0gJiAweDdmOworCQkJICAgIH0KKworCQkJCWZvciAoaWR4PTA7IGlkeDxFeHRSYXRlTGVuOyBpZHgrKykKKwkJCSAgICB7CisJCQkgICAgICAgIGlmIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzIDwgKEV4dFJhdGVbaWR4XSAmIDB4N2YpKQorCQkJICAgICAgICAgICAgTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9IEV4dFJhdGVbaWR4XSAmIDB4N2Y7CisJCQkgICAgfQorCisJCQkJLy8gbG9vayB1cCB0aGUgZXhpc3RpbmcgdGFibGUKKwkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIEFkZHIyKTsKKworCQkJCS8vIEFkLWhvYyBtb2RlIGlzIHVzaW5nIE1BQyBhZGRyZXNzIGFzIEJBIHNlc3Npb24uIFNvIHdlIG5lZWQgdG8gY29udGludW91c2x5IGZpbmQgbmV3bHkgam9pbmVkIGFkaG9jIHN0YXRpb24gYnkgcmVjZWl2aW5nIGJlYWNvbi4KKwkJCQkvLyBUbyBwcmV2ZW50IGFsd2F5cyBjaGVjayB0aGlzLCB3ZSB1c2Ugd2NpZCA9PSBSRVNFUlZFRF9XQ0lEIHRvIHJlY29nbml6ZSBpdCBhcyBuZXdseSBqb2luZWQgYWRob2Mgc3RhdGlvbi4KKwkJCQlpZiAoKEFESE9DX09OKHBBZCkgJiYgKEVsZW0tPldjaWQgPT0gUkVTRVJWRURfV0NJRCkpIHx8CisJCQkJCShwRW50cnkgJiYgKChwRW50cnktPkxhc3RCZWFjb25SeFRpbWUgKyBBREhPQ19FTlRSWV9CRUFDT05fTE9TVF9USU1FKSA8IE5vdykpKQorCQkJCXsKKwkJCQkJaWYgKHBFbnRyeSA9PSBOVUxMKQorCQkJCQkJLy8gQW5vdGhlciBhZGhvYyBqb2luaW5nLCBhZGQgdG8gb3VyIE1BQyB0YWJsZS4KKwkJCQkJCXBFbnRyeSA9IE1hY1RhYmxlSW5zZXJ0RW50cnkocEFkLCBBZGRyMiwgQlNTMCwgRkFMU0UpOworCisJCQkJCWlmIChTdGFBZGRNYWNUYWJsZUVudHJ5KHBBZCwgcEVudHJ5LCBNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzLCAmSHRDYXBhYmlsaXR5LCBIdENhcGFiaWxpdHlMZW4sIENhcGFiaWxpdHlJbmZvKSA9PSBGQUxTRSkKKwkJCQkJeworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQURIT0MgLSBBZGQgRW50cnkgZmFpbGVkLlxuIikpOworCQkJCQkJcmV0dXJuOworCQkJCQl9CisKKwkJCQkJaWYgKHBFbnRyeSAmJgorCQkJCQkJKEVsZW0tPldjaWQgPT0gUkVTRVJWRURfV0NJRCkpCisJCQkJCXsKKwkJCQkJCWlkeCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKKwkJCQkJCVJUMjhYWF9TVEFfU0VDVVJJVFlfSU5GT19BREQocEFkLCBCU1MwLCBpZHgsIHBFbnRyeSk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAocEVudHJ5ICYmIHBFbnRyeS0+VmFsaWRBc0NMSSkKKwkJCQkJcEVudHJ5LT5MYXN0QmVhY29uUnhUaW1lID0gTm93OworCisJCQkJLy8gQXQgbGVhc3QgYW5vdGhlciBwZWVyIGluIHRoaXMgSUJTUywgZGVjbGFyZSBNZWRpYVN0YXRlIGFzIENPTk5FQ1RFRAorCQkJCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQorCQkJCXsKKwkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisKKwkJCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKwkJCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKKwkgICAgICAgICAgICAgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfVVA7CisJCQkJCUFzaWNTZXRCc3NpZChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKworCQkJCQkvLyAyMDAzLzAzLzEyIC0gam9obgorCQkJCQkvLyBNYWtlIHN1cmUgdGhpcyBlbnRyeSBpbiAiU2NhblRhYiIgdGFibGUsIHRodXMgY29tcGxpZXMgdG8gTWljcm9zb2Z0J3MgcG9saWN5IHRoYXQKKwkJCQkJLy8gInNpdGUgc3VydmV5IiByZXN1bHQgc2hvdWxkIGFsd2F5cyBpbmNsdWRlIHRoZSBjdXJyZW50IGNvbm5lY3RlZCBuZXR3b3JrLgorCQkJCQkvLworCQkJCQlCc3NpZHggPSBCc3NUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBCc3NpZCwgQ2hhbm5lbCk7CisJCQkJCWlmIChCc3NpZHggPT0gQlNTX05PVF9GT1VORCkKKwkJCQkJeworCQkJCQkJQnNzaWR4ID0gQnNzVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlNjYW5UYWIsIEJzc2lkLCBTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsCisJCQkJCQkJCQkmQ2ZQYXJtLCBBdGltV2luLCBDYXBhYmlsaXR5SW5mbywgU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgRXh0UmF0ZUxlbiwgJkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkJCSZBZGRIdEluZm8sIEh0Q2FwYWJpbGl0eUxlbiwgQWRkSHRJbmZvTGVuLCBOZXdFeHRDaGFubmVsT2Zmc2V0LCBDaGFubmVsLCBSZWFsUnNzaSwgVGltZVN0YW1wLCAwLAorCQkJCQkJCQkJJkVkY2FQYXJtLCAmUW9zQ2FwYWJpbGl0eSwgJlFic3NMb2FkLCBMZW5WSUUsIHBWSUUpOworCQkJCQl9CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFESE9DICBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRC5cbiIpKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChJTkZSQV9PTihwQWQpKQorCQkJeworCQkJCUJPT0xFQU4gYlVzZVNob3J0U2xvdCwgYlVzZUJHUHJvdGVjdGlvbjsKKworCQkJCS8vIGRlY2lkZSB0byB1c2UvY2hhbmdlIHRvIC0KKwkJCQkvLyAgICAgIDEuIGxvbmcgc2xvdCAoMjAgdXMpIG9yIHNob3J0IHNsb3QgKDkgdXMpIHRpbWUKKwkJCQkvLyAgICAgIDIuIHR1cm4gb24vb2ZmIFJUUy9DVFMgYW5kL29yIENUUy10by1zZWxmIHByb3RlY3Rpb24KKwkJCQkvLyAgICAgIDMuIHNob3J0IHByZWFtYmxlCisKKwkJCQkvL2JVc2VTaG9ydFNsb3QgPSBwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSAmJiBDQVBfSVNfU0hPUlRfU0xPVChDYXBhYmlsaXR5SW5mbyk7CisJCQkJYlVzZVNob3J0U2xvdCA9IENBUF9JU19TSE9SVF9TTE9UKENhcGFiaWxpdHlJbmZvKTsKKwkJCQlpZiAoYlVzZVNob3J0U2xvdCAhPSBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1NMT1RfSU5VU0VEKSkKKwkJCQkJQXNpY1NldFNsb3RUaW1lKHBBZCwgYlVzZVNob3J0U2xvdCk7CisKKwkJCQliVXNlQkdQcm90ZWN0aW9uID0gKHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9PSAxKSB8fCAgICAvLyBhbHdheXMgdXNlCisJCQkJCQkJCSAgICgocEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID09IDApICYmIEVSUF9JU19VU0VfUFJPVEVDVElPTihFcnApKTsKKworCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpIC8vIGFsd2F5cyBubyBCRyBwcm90ZWN0aW9uIGluIEEtYmFuZC4gZmFsc2VseSBoYXBwZW5lZCB3aGVuIHN3aXRjaGluZyBBL0cgYmFuZCB0byBhIGR1YWwtYmFuZCBBUAorCQkJCQliVXNlQkdQcm90ZWN0aW9uID0gRkFMU0U7CisKKwkJCQlpZiAoYlVzZUJHUHJvdGVjdGlvbiAhPSBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEKSkKKwkJCQl7CisJCQkJCWlmIChiVXNlQkdQcm90ZWN0aW9uKQorCQkJCQl7CisJCQkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQpOworCQkJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCAoT0ZETVNFVFBST1RFQ1R8Q0NLU0VUUFJPVEVDVHxBTExOX1NFVFBST1RFQ1QpLEZBTFNFLChwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID09IDEpKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEKTsKKwkJCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgKE9GRE1TRVRQUk9URUNUfENDS1NFVFBST1RFQ1R8QUxMTl9TRVRQUk9URUNUKSxUUlVFLChwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID09IDEpKTsKKwkJCQkJfQorCisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiU1lOQyAtIEFQIGNoYW5nZWQgQi9HIHByb3RlY3Rpb24gdG8gJWRcbiIsIGJVc2VCR1Byb3RlY3Rpb24pKTsKKwkJCQl9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwkJCQkvLyBjaGVjayBIdCBwcm90ZWN0aW9uIG1vZGUuIGFuZCBhZGhlcmUgdG8gdGhlIE5vbi1HRiBkZXZpY2UgaW5kaWNhdGlvbiBieSBBUC4KKwkJCQlpZiAoKEFkZEh0SW5mb0xlbiAhPSAwKSAmJgorCQkJCQkoKEFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSAhPSBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlKSB8fAorCQkJCQkoQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ICE9IHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQpKSkKKwkJCQl7CisJCQkJCXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPSBBZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQ7CisJCQkJCXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUgPSBBZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGU7CisJCQkJCWlmIChwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID09IDEpCisJCQkJeworCQkJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCBBTExOX1NFVFBST1RFQ1QsIEZBTFNFLCBUUlVFKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsIEFMTE5fU0VUUFJPVEVDVCwgRkFMU0UsIEZBTFNFKTsKKworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gQVAgY2hhbmdlZCBOIE9wZXJhaW9uTW9kZSB0byAlZFxuIiwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSkpOworCQkJCX0KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCkgJiYKKwkJCQkJRVJQX0lTX1VTRV9CQVJLRVJfUFJFQU1CTEUoRXJwKSkKKwkJCQl7CisJCQkJCU1sbWVTZXRUeFByZWFtYmxlKHBBZCwgUnQ4MDJfMTFQcmVhbWJsZUxvbmcpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gQVAgZm9yY2VkIHRvIHVzZSBMT05HIHByZWFtYmxlXG4iKSk7CisJCQkJfQorCisJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkgICAgJiYKKwkJCQkJKEVkY2FQYXJtLmJWYWxpZCA9PSBUUlVFKSAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKwkJCQkJKEVkY2FQYXJtLkVkY2FVcGRhdGVDb3VudCAhPSBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkVkY2FVcGRhdGVDb3VudCkpCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gQVAgY2hhbmdlIEVEQ0EgcGFyYW1ldGVycyhmcm9tICVkIHRvICVkKVxuIiwKKwkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uRWRjYVVwZGF0ZUNvdW50LAorCQkJCQkJRWRjYVBhcm0uRWRjYVVwZGF0ZUNvdW50KSk7CisJCQkJCUFzaWNTZXRFZGNhUGFybShwQWQsICZFZGNhUGFybSk7CisJCQkJfQorCisJCQkJLy8gY29weSBRT1MgcmVsYXRlZCBpbmZvcm1hdGlvbgorCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5BUFFic3NMb2FkLCAmUWJzc0xvYWQsIHNpemVvZihRQlNTX0xPQURfUEFSTSkpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5BUFFvc0NhcGFiaWxpdHksICZRb3NDYXBhYmlsaXR5LCBzaXplb2YoUU9TX0NBUEFCSUxJVFlfUEFSTSkpOworCQkJfQorCisJCQkvLyBvbmx5IElORlJBU1RSVUNUVVJFIG1vZGUgc3VwcG9ydCBwb3dlci1zYXZpbmcgZmVhdHVyZQorCQkJaWYgKChJTkZSQV9PTihwQWQpICYmIChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpKSB8fCAocEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSkpCisJCQl7CisJCQkJVUNIQVIgRnJlZU51bWJlcjsKKwkJCQkvLyAgMS4gQVAgaGFzIGJhY2tsb2dnZWQgdW5pY2FzdC10by1tZSBmcmFtZSwgc3RheSBBV0FLRSwgc2VuZCBQU1BPTEwKKwkJCQkvLyAgMi4gQVAgaGFzIGJhY2tsb2dnZWQgYnJvYWRjYXN0L211bHRpY2FzdCBmcmFtZSBhbmQgd2Ugd2FudCB0aG9zZSBmcmFtZXMsIHN0YXkgQVdBS0UKKwkJCQkvLyAgMy4gd2UgaGF2ZSBvdXRnb2luZyBmcmFtZXMgaW4gVHhSaW5nIG9yIE1nbXRSaW5nLCBiZXR0ZXIgc3RheSBBV0FLRQorCQkJCS8vICA0LiBQc20gY2hhbmdlIHRvIFBXUl9TQVZFLCBidXQgQVAgbm90IGJlZW4gaW5mb3JtZWQgeWV0LCB3ZSBiZXR0ZXIgc3RheSBBV0FLRQorCQkJCS8vICA1LiBvdGhlcndpc2UsIHB1dCBQSFkgYmFjayB0byBzbGVlcCB0byBzYXZlIGJhdHRlcnkuCisJCQkJaWYgKE1lc3NhZ2VUb01lKQorCQkJCXsKKwkJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSAmJiBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSAmJgorCQkJCQkJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CRSAmJiBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JLICYmIHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkgJiYgcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WTykKKwkJCQkJeworCQkJCQkJcEFkLT5Db21tb25DZmcuYk5lZWRTZW5kVHJpZ2dlckZyYW1lID0gVFJVRTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCQlSVDI4WFhfUFNfUE9MTF9FTlFVRVVFKHBBZCk7CisJCQkJfQorCQkJCWVsc2UgaWYgKEJjYXN0RmxhZyAmJiAoRHRpbUNvdW50ID09IDApICYmIE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKSkKKwkJCQl7CisJCQkJfQorCQkJCWVsc2UgaWYgKChwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQktdLk51bWJlciAhPSAwKQkJCQkJCQkJCQkJCQl8fAorCQkJCQkJKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CRV0uTnVtYmVyICE9IDApCQkJCQkJCQkJCQkJCQl8fAorCQkJCQkJKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WSV0uTnVtYmVyICE9IDApCQkJCQkJCQkJCQkJCQl8fAorCQkJCQkJKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WT10uTnVtYmVyICE9IDApCQkJCQkJCQkJCQkJCQl8fAorCQkJCQkJKFJUTVBGcmVlVFhEUmVxdWVzdChwQWQsIFFJRF9BQ19CSywgVFhfUklOR19TSVpFIC0gMSwgJkZyZWVOdW1iZXIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCXx8CisJCQkJCQkoUlRNUEZyZWVUWERSZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBUWF9SSU5HX1NJWkUgLSAxLCAmRnJlZU51bWJlcikgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykJfHwKKwkJCQkJCShSVE1QRnJlZVRYRFJlcXVlc3QocEFkLCBRSURfQUNfVkksIFRYX1JJTkdfU0laRSAtIDEsICZGcmVlTnVtYmVyKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQl8fAorCQkJCQkJKFJUTVBGcmVlVFhEUmVxdWVzdChwQWQsIFFJRF9BQ19WTywgVFhfUklOR19TSVpFIC0gMSwgJkZyZWVOdW1iZXIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCXx8CisJCQkJCQkoUlRNUEZyZWVUWERSZXF1ZXN0KHBBZCwgUUlEX01HTVQsIE1HTVRfUklOR19TSVpFIC0gMSwgJkZyZWVOdW1iZXIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpKQorCQkJCXsKKwkJCQkJLy8gVE9ETzogY29uc2lkZXIgc2NoZWR1bGVkIEhDQ0EuIG1pZ2h0IG5vdCBiZSBwcm9wZXIgdG8gdXNlIHRyYWRpdGlvbmFsIERUSU0tYmFzZWQgcG93ZXItc2F2aW5nIHNjaGVtZQorCQkJCQkvLyBjYW4gd2UgY2hlYXQgaGVyZSAoaS5lLiBqdXN0IGNoZWNrIE1HTVQgJiBBQ19CRSkgZm9yIGJldHRlciBwZXJmb3JtYW5jZT8KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJVVNIT1JUIE5leHREdGltID0gRHRpbUNvdW50OworCisJCQkJCWlmIChOZXh0RHRpbSA9PSAwKQorCQkJCQkJTmV4dER0aW0gPSBEdGltUGVyaW9kOworCisJCQkJCVRidHROdW1Ub05leHRXYWtlVXAgPSBwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQ7CisJCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSkgJiYgKFRidHROdW1Ub05leHRXYWtlVXAgPiBOZXh0RHRpbSkpCisJCQkJCQlUYnR0TnVtVG9OZXh0V2FrZVVwID0gTmV4dER0aW07CisKKwkJCQkJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQorCQkJCQl7CisJCQkJCQlBc2ljU2xlZXBUaGVuQXV0b1dha2V1cChwQWQsIFRidHROdW1Ub05leHRXYWtlVXApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCS8vIG5vdCBteSBCU1NJRCwgaWdub3JlIGl0CisJfQorCS8vIHNhbml0eSBjaGVjayBmYWlsLCBpZ25vcmUgdGhpcyBmcmFtZQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVJlY2VpdmUgUFJPQkUgUkVRIGZyb20gcmVtb3RlIHBlZXIgd2hlbiBvcGVyYXRpbmcgaW4gSUJTUyBtb2RlCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBQZWVyUHJvYmVSZXFBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVDSEFSICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlDSEFSICAgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKKwlVQ0hBUiAgICAgICAgIFNzaWRMZW47CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJVUNIQVIJCSAgSHRMZW4sIEFkZEh0TGVuLCBOZXdFeHRMZW47CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJSEVBREVSXzgwMl8xMSBQcm9iZVJzcEhkcjsKKwlORElTX1NUQVRVUyAgIE5TdGF0dXM7CisJUFVDSEFSICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlVTE9ORyAgICAgICAgIEZyYW1lTGVuID0gMDsKKwlMQVJHRV9JTlRFR0VSIEZha2VUaW1lc3RhbXA7CisJVUNIQVIgICAgICAgICBEc0xlbiA9IDEsIElic3NMZW4gPSAyOworCVVDSEFSICAgICAgICAgTG9jYWxFcnBJZVszXSA9IHtJRV9FUlAsIDEsIDB9OworCUJPT0xFQU4gICAgICAgUHJpdmFjeTsKKwlVU0hPUlQgICAgICAgIENhcGFiaWxpdHlJbmZvOworCVVDSEFSCQkgIFJTTkllID0gSUVfV1BBOworCisJaWYgKCEgQURIT0NfT04ocEFkKSkKKwkJcmV0dXJuOworCisJaWYgKFBlZXJQcm9iZVJlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgU3NpZCwgJlNzaWRMZW4pKQorCXsKKwkJaWYgKChTc2lkTGVuID09IDApIHx8IFNTSURfRVFVQUwoU3NpZCwgU3NpZExlbiwgcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbikpCisJCXsKKwkJCS8vIGFsbG9jYXRlIGFuZCBzZW5kIG91dCBQcm9iZVJzcCBmcmFtZQorCQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwkJCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkJcmV0dXJuOworCisJCQkvL3BBZC0+U3RhQ2ZnLkF0aW1XaW4gPSAwOyAgLy8gPz8/Pz8/CisKKwkJCVByaXZhY3kgPSAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpIHx8CisJCQkJCSAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSB8fAorCQkJCQkgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCk7CisJCQlDYXBhYmlsaXR5SW5mbyA9IENBUF9HRU5FUkFURSgwLCAxLCBQcml2YWN5LCAocEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9PSBSdDgwMl8xMVByZWFtYmxlU2hvcnQpLCAwLCAwKTsKKworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAgICAgJkZyYW1lTGVuLAorCQkJCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCAgICAgICAgJlByb2JlUnNwSGRyLAorCQkJCQkJCSAgVElNRVNUQU1QX0xFTiwgICAgICAgICAgICAgICAgJkZha2VUaW1lc3RhbXAsCisJCQkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kLAorCQkJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNhcGFiaWxpdHlJbmZvLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRJZSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLAorCQkJCQkJCSAgcEFkLT5Db21tb25DZmcuU3NpZExlbiwgICAgICAgcEFkLT5Db21tb25DZmcuU3NpZCwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdXBSYXRlSWUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiwKKwkJCQkJCQkgIHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4sICAgIHBBZC0+U3RhQWN0aXZlLlN1cFJhdGUsCisJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRHNJZSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEc0xlbiwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5DaGFubmVsLAorCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJklic3NJZSwKKwkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJYnNzTGVuLAorCQkJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+U3RhQWN0aXZlLkF0aW1XaW4sCisJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisKKwkJCWlmIChwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuKQorCQkJeworCQkJCVVMT05HIHRtcDsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAmdG1wLAorCQkJCQkJCQkgIDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsRXJwSWUsCisJCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkV4dFJhdGVJZSwKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiwKKwkJCQkJCQkJICBwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuLCAgICAmcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZSwKKwkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQkJRnJhbWVMZW4gKz0gdG1wOworCQkJfQorCisJCQkvLyBJZiBhZGhvYyBzZWNydWl0eSBpcyBzZXQgZm9yIFdQQS1Ob25lLCBhcHBlbmQgdGhlIGNpcGhlciBzdWl0ZSBJRQorCQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisJCQl7CisJCQkJVUxPTkcgdG1wOworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgIAkmdG1wLAorCQkJCQkJICAJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZSU05JZSwKKwkJCQkJCSAgCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSZwQWQtPlN0YUNmZy5SU05JRV9MZW4sCisJCQkJCQkgIAkJCXBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwgICAgICAJcEFkLT5TdGFDZmcuUlNOX0lFLAorCQkJCQkJICAJCQlFTkRfT0ZfQVJHUyk7CisJCQkJRnJhbWVMZW4gKz0gdG1wOworCQkJfQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkKKwkJCXsKKwkJCQlVTE9ORyBUbXBMZW47CisJCQkJVUNIQVIJQlJPQURDT01bNF0gPSB7MHgwLCAweDkwLCAweDRjLCAweDMzfTsKKwkJCQlIdExlbiA9IHNpemVvZihwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkpOworCQkJCUFkZEh0TGVuID0gc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbyk7CisJCQkJTmV3RXh0TGVuID0gMTsKKwkJCQkvL05ldyBleHRlbnNpb24gY2hhbm5lbCBvZmZzZXQgSUUgaXMgaW5jbHVkZWQgaW4gQmVhY29uLCBQcm9iZSBSc3Agb3IgY2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IEZyYW1lCisJCQkJaWYgKHBBZC0+YkJyb2FkQ29tSFQgPT0gVFJVRSkKKwkJCQl7CisJCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wTGVuLAorCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmV3BhSWUsCisJCQkJCQkJCSAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCUk9BRENPTVswXSwKKwkJCQkJCQkJIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sICAgICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LAorCQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcExlbiwKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0Q2FwSWUsCisJCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdExlbiwKKwkJCQkJCQkJIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSwgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFkZEh0SW5mb0llLAorCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWRkSHRMZW4sCisJCQkJCQkJCSBzaXplb2YoQUREX0hUX0lORk9fSUUpLCAgICAgICAgICAmcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLAorCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTmV3RXh0Q2hhbkllLAorCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTmV3RXh0TGVuLAorCQkJCQkJCQkgc2l6ZW9mKE5FV19FWFRfQ0hBTl9JRSksICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5OZXdFeHRDaGFuT2Zmc2V0LAorCQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCQl9CisJCQkJRnJhbWVMZW4gKz0gVG1wTGVuOworCQkJfQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOworCQl9CisJfQorfQorCitWT0lEIEJlYWNvblRpbWVvdXRBdEpvaW5BY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCBTdGF0dXM7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIEJlYWNvblRpbWVvdXRBdEpvaW5BY3Rpb25cbiIpKTsKKwlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOworCVN0YXR1cyA9IE1MTUVfUkVKX1RJTUVPVVQ7CisJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0pPSU5fQ09ORiwgMiwgJlN0YXR1cyk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJU2NhbiB0aW1lb3V0IHByb2NlZHVyZS4gYmFzaWNhbGx5IGFkZCBjaGFubmVsIGluZGV4IGJ5IDEgYW5kIHJlc2NhbgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgU2NhblRpbWVvdXRBY3Rpb24oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCXBBZC0+TWxtZUF1eC5DaGFubmVsID0gTmV4dENoYW5uZWwocEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCk7CisKKwkvLyBPbmx5IG9uZSBjaGFubmVsIHNjYW5uZWQgZm9yIENJU0NPIGJlYWNvbiByZXF1ZXN0CisJaWYgKChwQWQtPk1sbWVBdXguU2NhblR5cGUgPT0gU0NBTl9DSVNDT19BQ1RJVkUpIHx8CisJCShwQWQtPk1sbWVBdXguU2NhblR5cGUgPT0gU0NBTl9DSVNDT19QQVNTSVZFKSB8fAorCQkocEFkLT5NbG1lQXV4LlNjYW5UeXBlID09IFNDQU5fQ0lTQ09fTk9JU0UpIHx8CisJCShwQWQtPk1sbWVBdXguU2NhblR5cGUgPT0gU0NBTl9DSVNDT19DSEFOTkVMX0xPQUQpKQorCQlwQWQtPk1sbWVBdXguQ2hhbm5lbCA9IDA7CisKKwkvLyB0aGlzIHJvdXRpbmUgd2lsbCBzdG9wIGlmIHBBZC0+TWxtZUF1eC5DaGFubmVsID09IDAKKwlTY2FuTmV4dENoYW5uZWwocEFkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgSW52YWxpZFN0YXRlV2hlblNjYW4oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCBTdGF0dXM7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVlOQyAtIEludmFsaWRTdGF0ZVdoZW5TY2FuKHN0YXRlPSVsZCkuIFJlc2V0IFNZTkMgbWFjaGluZVxuIiwgcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSkpOworCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CisJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKKwlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU0NBTl9DT05GLCAyLCAmU3RhdHVzKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK1ZPSUQgSW52YWxpZFN0YXRlV2hlbkpvaW4oCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCBTdGF0dXM7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSW52YWxpZFN0YXRlV2hlbkpvaW4oc3RhdGU9JWxkKS4gUmVzZXQgU1lOQyBtYWNoaW5lXG4iLCBwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlKSk7CisJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKKwlTdGF0dXMgPSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUOworCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9KT0lOX0NPTkYsIDIsICZTdGF0dXMpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBJbnZhbGlkU3RhdGVXaGVuU3RhcnQoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVVTSE9SVCBTdGF0dXM7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSW52YWxpZFN0YXRlV2hlblN0YXJ0KHN0YXRlPSVsZCkuIFJlc2V0IFNZTkMgbWFjaGluZVxuIiwgcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSkpOworCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CisJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKKwlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU1RBUlRfQ09ORiwgMiwgJlN0YXR1cyk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBFbnF1ZXVlUHNQb2xsKAorCUlOIFBSVE1QX0FEQVBURVIgcEFkKQoreworI2lmZGVmIFJBTElOS19BVEUKKyAgICBpZiAoQVRFX09OKHBBZCkpCisgICAgeworCQlyZXR1cm47CisgICAgfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworCisJaWYgKHBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPT0gTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1ApCisgICAgCXBBZC0+UHNQb2xsRnJhbWUuRkMuUHdyTWdtdCA9IFBXUl9TQVZFOworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgKFBVQ0hBUikmcEFkLT5Qc1BvbGxGcmFtZSwgc2l6ZW9mKFBTUE9MTF9GUkFNRSkpOworfQorCisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitWT0lEIEVucXVldWVQcm9iZVJlcXVlc3QoCisJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJTkRJU19TVEFUVVMgICAgIE5TdGF0ZTsKKwlQVUNIQVIgICAgICAgICAgcE91dEJ1ZmZlcjsKKwlVTE9ORyAgICAgICAgICAgRnJhbWVMZW4gPSAwOworCUhFQURFUl84MDJfMTEgICBIZHI4MDIxMTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImZvcmNlIG91dCBhIFByb2JlUmVxdWVzdCAuLi5cbiIpKTsKKworCU5TdGF0ZSA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwlpZiAoTlN0YXRlID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJeworCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkhkcjgwMjExLCBTVUJUWVBFX1BST0JFX1JFUSwgMCwgQlJPQURDQVNUX0FERFIsIEJST0FEQ0FTVF9BRERSKTsKKworCQkvLyB0aGlzIFByb2JlUmVxdWVzdCBleHBsaWNpdGx5IHNwZWNpZnkgU1NJRCB0byByZWR1Y2UgdW53YW50ZWQgUHJvYmVSZXNwb25zZQorCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKwkJCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCAgICAgICAgICAmSGRyODAyMTEsCisJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRJZSwKKwkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuU3NpZExlbiwKKwkJCQkJCSAgcEFkLT5Db21tb25DZmcuU3NpZExlbiwJCSAgcEFkLT5Db21tb25DZmcuU3NpZCwKKwkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUllLAorCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuLAorCQkJCQkJICBwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuLCAgICAgIHBBZC0+U3RhQWN0aXZlLlN1cFJhdGUsCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CisJfQorCit9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyNpZmRlZiBET1QxMU5fRFJBRlQzCitWT0lEIEJ1aWxkRWZmZWN0ZWRDaGFubmVsTGlzdCgKKwlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3sKKwlVQ0hBUgkJRUNoYW5uZWxbMTFdOworCVVDSEFSCQlpLCBqLCBrOworCVVDSEFSCQlVcHBlckNoYW5uZWwgPSAwLCBMb3dlckNoYW5uZWwgPSAwOworCisJUlRNUFplcm9NZW1vcnkoRUNoYW5uZWwsIDExKTsKKwlpID0gMDsKKwkvLyBGaW5kIHVwcGVyIGNoYW5uZWwgYW5kIGxvd2VyIGNoYW5uZWwuCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsIDwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwl7CisJCVVwcGVyQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJCUxvd2VyQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsOworCX0KKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA+IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJeworCQlVcHBlckNoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbDsKKwkJTG93ZXJDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuOworCX0KKworCS8vIFJlY29yZCBjaGFubmVscyB0aGF0IGlzIGJlbG93IGxvd2VyIGNoYW5uZWwuLgorCWlmIChMb3dlckNoYW5uZWwgPiAxKQorCXsKKwkJRUNoYW5uZWxbMF0gPSBMb3dlckNoYW5uZWwgLSAxOworCQlpID0gMTsKKwkJaWYgKExvd2VyQ2hhbm5lbCA+IDIpCisJCXsKKwkJCUVDaGFubmVsWzFdID0gTG93ZXJDaGFubmVsIC0gMjsKKwkJCWkgPSAyOworCQkJaWYgKExvd2VyQ2hhbm5lbCA+IDMpCisJCQl7CisJCQkJRUNoYW5uZWxbMl0gPSBMb3dlckNoYW5uZWwgLSAzOworCQkJCWkgPSAzOworCQkJfQorCQl9CisJfQorCS8vIFJlY29yZCBjaGFubmVscyB0aGF0IGlzIGJldHdlZW4gIGxvd2VyIGNoYW5uZWwgYW5kIHVwcGVyIGNoYW5uZWwuCisJZm9yIChrID0gTG93ZXJDaGFubmVsO2sgPCBVcHBlckNoYW5uZWw7aysrKQorCXsKKwkJRUNoYW5uZWxbaV0gPSBrOworCQlpKys7CisJfQorCS8vIFJlY29yZCBjaGFubmVscyB0aGF0IGlzIGFib3ZlIHVwcGVyIGNoYW5uZWwuLgorCWlmIChMb3dlckNoYW5uZWwgPCAxMSkKKwl7CisJCUVDaGFubmVsW2ldID0gVXBwZXJDaGFubmVsICsgMTsKKwkJaSsrOworCQlpZiAoTG93ZXJDaGFubmVsIDwgMTApCisJCXsKKwkJCUVDaGFubmVsW2ldID0gTG93ZXJDaGFubmVsICsgMjsKKwkJCWkrKzsKKwkJCWlmIChMb3dlckNoYW5uZWwgPCA5KQorCQkJeworCQkJCUVDaGFubmVsW2ldID0gTG93ZXJDaGFubmVsICsgMzsKKwkJCQlpKys7CisJCQl9CisJCX0KKwl9CisJLy8KKwlmb3IgKGogPSAwO2ogPCBpO2orKykKKwl7CisJCWZvciAoayA9IDA7ayA8IHBBZC0+Q2hhbm5lbExpc3ROdW07aysrKQorCQl7CisJCQlpZiAocEFkLT5DaGFubmVsTGlzdFtrXS5DaGFubmVsID09IEVDaGFubmVsW2pdKQorCQkJeworCQkJCXBBZC0+Q2hhbm5lbExpc3Rba10uYkVmZmVjdGVkQ2hhbm5lbCA9IFRSVUU7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIgRWZmZWN0ZWRDaGFubmVsKCA9JWQpXG4iLCBFQ2hhbm5lbFtqXSkpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorfQorI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworQk9PTEVBTiBTY2FuUnVubmluZygKKwkJSU4gUFJUTVBfQURBUFRFUiBwQWQpCit7CisJcmV0dXJuIChwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID09IFNDQU5fTElTVEVOKSA/IFRSVUUgOiBGQUxTRTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvd3BhLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YS93cGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjI2ZGNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGEvd3BhLmMKQEAgLTAsMCArMSwyMTA3IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXdwYS5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSmFuCUxlZQkJMDMtMDctMjIJCUluaXRpYWwKKwlQYXVsIExpbgkwMy0xMS0yOAkJTW9kaWZ5IGZvciBzdXBwbGljYW50CisqLworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisjZGVmaW5lCQlXUEFSU05JRQkweGRkCisjZGVmaW5lCQlXUEEyUlNOSUUJMHgzMAorCisvL2V4dGVybiBVQ0hBUiBCSVQ4W107CitVQ0hBUglDaXBoZXJXcGFQc2tUa2lwW10gPSB7CisJCTB4REQsIDB4MTYsCQkJCS8vIFJTTiBJRQorCQkweDAwLCAweDUwLCAweGYyLCAweDAxLAkvLyBvdWkKKwkJMHgwMSwgMHgwMCwJCQkJLy8gVmVyc2lvbgorCQkweDAwLCAweDUwLCAweGYyLCAweDAyLAkvLyBNdWx0aWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gTnVtYmVyIG9mIHVuaWNhc3QKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLy8gdW5pY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBudW1iZXIgb2YgYXV0aGVudGljYXRpb24gbWV0aG9kCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIJLy8gYXV0aGVudGljYXRpb24KKwkJfTsKK1VDSEFSCUNpcGhlcldwYVBza1RraXBMZW4gPSAoc2l6ZW9mKENpcGhlcldwYVBza1RraXApIC8gc2l6ZW9mKFVDSEFSKSk7CisKK1VDSEFSCUNpcGhlcldwYVBza0Flc1tdID0geworCQkweERELCAweDE2LCAJCQkvLyBSU04gSUUKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwJLy8gb3VpCisJCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwNCwJLy8gTXVsdGljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIE51bWJlciBvZiB1bmljYXN0CisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDQsCS8vIHVuaWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAorCQkweDAwLCAweDUwLCAweGYyLCAweDAyCS8vIGF1dGhlbnRpY2F0aW9uCisJCX07CitVQ0hBUglDaXBoZXJXcGFQc2tBZXNMZW4gPSAoc2l6ZW9mKENpcGhlcldwYVBza0FlcykgLyBzaXplb2YoVUNIQVIpKTsKKworVUNIQVIJQ2lwaGVyU3VpdGVDaXNjb0NDS01bXSA9IHsKKwkJMHhERCwgMHgxNiwJCQkJLy8gUlNOIElFCisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEsIC8vIG91aQorCQkweDAxLCAweDAwLAkJCQkvLyBWZXJzaW9uCisJCTB4MDAsIDB4NDAsIDB4OTYsIDB4MDEsIC8vIE11bHRpY2FzdAorCQkweDAxLCAweDAwLAkJCQkvLyBOdW1iZXIgb2YgdWljYXN0CisJCTB4MDAsIDB4NDAsIDB4OTYsIDB4MDEsIC8vIHVuaWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAorCQkweDAwLCAweDQwLCAweDk2LCAweDAwICAvLyBBdXRoZW50aWNhdGlvbgorCQl9OworVUNIQVIJQ2lwaGVyU3VpdGVDaXNjb0NDS01MZW4gPSAoc2l6ZW9mKENpcGhlclN1aXRlQ2lzY29DQ0tNKSAvIHNpemVvZihVQ0hBUikpOworCitVQ0hBUglDaXBoZXJTdWl0ZUNpc2NvQ0NLTTI0W10gPSB7CisJCTB4REQsIDB4MTgsCQkJCS8vIFJTTiBJRQorCQkweDAwLCAweDUwLCAweGYyLCAweDAxLCAvLyBvdWkKKwkJMHgwMSwgMHgwMCwJCQkJLy8gVmVyc2lvbgorCQkweDAwLCAweDQwLCAweDk2LCAweDAxLCAvLyBNdWx0aWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gTnVtYmVyIG9mIHVpY2FzdAorCQkweDAwLCAweDQwLCAweDk2LCAweDAxLCAvLyB1bmljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QKKwkJMHgwMCwgMHg0MCwgMHg5NiwgMHgwMCwKKwkJMHgyOCwgMHgwMC8vIEF1dGhlbnRpY2F0aW9uCisJCX07CisKK1VDSEFSCUNpcGhlclN1aXRlQ2lzY29DQ0tNMjRMZW4gPSAoc2l6ZW9mKENpcGhlclN1aXRlQ2lzY29DQ0tNMjQpIC8gc2l6ZW9mKFVDSEFSKSk7CisKK1VDSEFSCUNpcGhlclN1aXRlQ0NYVGtpcFtdID0geworCQkweERELCAweDE2LAkJCQkvLyBSU04gSUUKKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwJLy8gb3VpCisJCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KKwkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLy8gTXVsdGljYXN0CisJCTB4MDEsIDB4MDAsCQkJCS8vIE51bWJlciBvZiB1bmljYXN0CisJCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8vIHVuaWNhc3QKKwkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAorCQkweDAwLCAweDUwLCAweGYyLCAweDAxCS8vIGF1dGhlbnRpY2F0aW9uCisJCX07CitVQ0hBUglDaXBoZXJTdWl0ZUNDWFRraXBMZW4gPSAoc2l6ZW9mKENpcGhlclN1aXRlQ0NYVGtpcCkgLyBzaXplb2YoVUNIQVIpKTsKKworVUNIQVIJQ0NYX0xMQ19IRFJbXSA9IHsweEFBLCAweEFBLCAweDAzLCAweDAwLCAweDQwLCAweDk2LCAweDAwLCAweDAyfTsKK1VDSEFSCUxMQ19OT1JNQUxbXSA9IHsweEFBLCAweEFBLCAweDAzLCAweDAwLCAweDAwLCAweDAwfTsKKworVUNIQVIJRUFQT0xfRlJBTUVbXSA9IHsweDg4LCAweDhFfTsKKworQk9PTEVBTiBDaGVja1JTTklFKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBQVUNIQVIgICAgICAgICAgcERhdGEsCisJSU4gIFVDSEFSICAgICAgICAgICBEYXRhTGVuLAorCU9VVAlVQ0hBUgkJCSpPZmZzZXQpOworCit2b2lkIGluY19ieXRlX2FycmF5KFVDSEFSICpjb3VudGVyLCBpbnQgbGVuKTsKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNsYXNzaWZ5IFdQQSBFQVAgbWVzc2FnZSB0eXBlCisKKwlBcmd1bWVudHM6CisJCUVBUFR5cGUJCVZhbHVlIG9mIEVBUCBtZXNzYWdlIHR5cGUKKwkJTXNnVHlwZQkJSW50ZXJuYWwgTWVzc2FnZSBkZWZpbml0aW9uIGZvciBNTE1FIHN0YXRlIG1hY2hpbmUKKworCVJldHVybiBWYWx1ZToKKwkJVFJVRQkJRm91bmQgYXBwcm9wcmlhdGUgbWVzc2FnZSB0eXBlCisJCUZBTFNFCQlObyBhcHByb3ByaWF0ZSBtZXNzYWdlIHR5cGUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKwkJQWxsIHRoZXNlIGNvbnN0YW50cyBhcmUgZGVmaW5lZCBpbiB3cGEuaAorCQlGb3Igc3VwcGxpY2FudCwgdGhlcmUgaXMgb25seSBFQVBPTCBLZXkgbWVzc2FnZSBhdmFsaWFibGUKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4JV3BhTXNnVHlwZVN1YnN0KAorCUlOCVVDSEFSCUVBUFR5cGUsCisJT1VUCUlOVAkJKk1zZ1R5cGUpCit7CisJc3dpdGNoIChFQVBUeXBlKQorCXsKKwkJY2FzZSBFQVBQYWNrZXQ6CisJCQkqTXNnVHlwZSA9IE1UMl9FQVBQYWNrZXQ7CisJCQlicmVhazsKKwkJY2FzZSBFQVBPTFN0YXJ0OgorCQkJKk1zZ1R5cGUgPSBNVDJfRUFQT0xTdGFydDsKKwkJCWJyZWFrOworCQljYXNlIEVBUE9MTG9nb2ZmOgorCQkJKk1zZ1R5cGUgPSBNVDJfRUFQT0xMb2dvZmY7CisJCQlicmVhazsKKwkJY2FzZSBFQVBPTEtleToKKwkJCSpNc2dUeXBlID0gTVQyX0VBUE9MS2V5OworCQkJYnJlYWs7CisJCWNhc2UgRUFQT0xBU0ZBbGVydDoKKwkJCSpNc2dUeXBlID0gTVQyX0VBUE9MQVNGQWxlcnQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBGQUxTRTsKKwl9CisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJYXNzb2NpYXRpb24Jc3RhdGUgbWFjaGluZSBpbml0LAlpbmNsdWRpbmcgc3RhdGUJdHJhbnNpdGlvbiBhbmQgdGltZXIgaW5pdAorCVBhcmFtZXRlcnM6CisJCVMgLQlwb2ludGVyCXRvIHRoZSBhc3NvY2lhdGlvbiBzdGF0ZSBtYWNoaW5lCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworVk9JRCBXcGFQc2tTdGF0ZU1hY2hpbmVJbml0KAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVNUQVRFX01BQ0hJTkUgKlMsCisJT1VUCVNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQoreworCVN0YXRlTWFjaGluZUluaXQoUywJVHJhbnMsIE1BWF9XUEFfUFNLX1NUQVRFLCBNQVhfV1BBX1BTS19NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpRHJvcCwgV1BBX1BTS19JRExFLCBXUEFfTUFDSElORV9CQVNFKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgV1BBX1BTS19JRExFLCBNVDJfRUFQT0xLZXksIChTVEFURV9NQUNISU5FX0ZVTkMpV3BhRUFQT0xLZXlBY3Rpb24pOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJCVRoaXMgaXMJc3RhdGUgbWFjaGluZSBmdW5jdGlvbi4KKwkJV2hlbiByZWNlaXZpbmcgRUFQT0wgcGFja2V0cyB3aGljaCBpcyAgZm9yIDgwMi4xeCBrZXkgbWFuYWdlbWVudC4KKwkJVXNlCWJvdGggaW4JV1BBLCBhbmQgV1BBUFNLCWNhc2UuCisJCUluIHRoaXMJZnVuY3Rpb24sIGZ1cnRoZXIgZGlzcGF0Y2ggdG8gZGlmZmVyZW50CWZ1bmN0aW9ucyBhY2NvcmRpbmcJdG8gdGhlIHJlY2VpdmVkCXBhY2tldC4JIDMgY2F0ZWdvcmllcyBhcmUgOgorCQkgIDEuICBub3JtYWwgNC13YXkgcGFpcndpc2VrZXkgYW5kIDItd2F5IGdyb3Vwa2V5IGhhbmRzaGFrZQorCQkgIDIuICBNSUMgZXJyb3IJKENvdW50ZXJtZWFzdXJlcyBhdHRhY2spICByZXBvcnQgcGFja2V0CWZyb20gU1RBLgorCQkgIDMuICBSZXF1ZXN0IGZvciBwYWlyd2lzZS9ncm91cCBrZXkgdXBkYXRlCWZyb20gU1RBCisJUmV0dXJuOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBXcGFFQVBPTEtleUFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglNTE1FX1FVRVVFX0VMRU0JKkVsZW0pCisKK3sKKwlJTlQgICAgICAgICAgICAgTXNnVHlwZSA9IEVBUE9MX01TR19JTlZBTElEOworCVBLRVlfREVTQ1JJUFRFUiBwS2V5RGVzYzsKKwlQSEVBREVSXzgwMl8xMSAgcEhlYWRlcjsgLy9yZWQKKwlVQ0hBUiAgICAgICAgICAgWmVyb1JlcGxheVtMRU5fS0VZX0RFU0NfUkVQTEFZXTsKKwlVQ0hBUiBFYXBvbFZyOworCUtFWV9JTkZPCQlwZWVyS2V5SW5mbzsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tLS0tPiBXcGFFQVBPTEtleUFjdGlvblxuIikpOworCisJLy8gR2V0IDgwMi4xMSBoZWFkZXIgZmlyc3QKKwlwSGVhZGVyID0gKFBIRUFERVJfODAyXzExKSBFbGVtLT5Nc2c7CisKKwkvLyBHZXQgRUFQb0wtS2V5IERlc2NyaXB0b3IKKwlwS2V5RGVzYyA9IChQS0VZX0RFU0NSSVBURVIpICZFbGVtLT5Nc2dbKExFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSCArIExFTkdUSF9FQVBPTF9IKV07CisKKwlOZGlzWmVyb01lbW9yeSgoUFVDSEFSKSZwZWVyS2V5SW5mbywgc2l6ZW9mKHBlZXJLZXlJbmZvKSk7CisJTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikmcGVlcktleUluZm8sIChQVUNIQVIpJnBLZXlEZXNjLT5LZXlJbmZvLCBzaXplb2YoS0VZX0lORk8pKTsKKworCSooKFVTSE9SVCAqKSZwZWVyS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQgKikmcGVlcktleUluZm8pKTsKKworCisJLy8gMS4gQ2hlY2sgRUFQT0wgZnJhbWUgdmVyc2lvbiBhbmQgdHlwZQorCUVhcG9sVnIJPSAoVUNIQVIpIEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExK0xFTkdUSF84MDJfMV9IXTsKKworICAgIGlmICgoKEVhcG9sVnIgIT0gRUFQT0xfVkVSKSAmJiAoRWFwb2xWciAhPSBFQVBPTF9WRVIyKSkgfHwgKChwS2V5RGVzYy0+VHlwZSAhPSBXUEExX0tFWV9ERVNDKSAmJiAocEtleURlc2MtPlR5cGUgIT0gV1BBMl9LRVlfREVTQykpKQorCXsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiS2V5IGRlc2NyaXB0ZXIgZG9lcyBub3QgbWF0Y2ggd2l0aCBXUEEgcnVsZVxuIikpOworCQkJcmV0dXJuOworCX0KKworCS8vIEZpcnN0IHZhbGlkYXRlIHJlcGxheSBjb3VudGVyLCBvbmx5IGFjY2VwdCBtZXNzYWdlIHdpdGggbGFyZ2VyIHJlcGxheSBjb3VudGVyCisJLy8gTGV0IGVxdWFsIHBhc3MsIHNvbWUgQVAgc3RhcnQgd2l0aCBhbGwgemVybyByZXBsYXkgY291bnRlcgorCU5kaXNaZXJvTWVtb3J5KFplcm9SZXBsYXksIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJaWYoKFJUTVBDb21wYXJlTWVtb3J5KHBLZXlEZXNjLT5SZXBsYXlDb3VudGVyLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKSAhPSAxKSAmJgorCQkoUlRNUENvbXBhcmVNZW1vcnkocEtleURlc2MtPlJlcGxheUNvdW50ZXIsIFplcm9SZXBsYXksIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDApKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiICAgUmVwbGF5Q291bnRlciBub3QgbWF0Y2ggICBcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCS8vIFByb2Nlc3MgV1BBMlBTSyBmcmFtZQorCWlmKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCisJeworCQlpZigocGVlcktleUluZm8uS2V5VHlwZSA9PSBQQUlSV0lTRUtFWSkgJiYKKwkJCShwZWVyS2V5SW5mby5FS0RfREwgPT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5LZXlBY2sgPT0gMSkgJiYKKwkJCShwZWVyS2V5SW5mby5LZXlNaWMgPT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5TZWN1cmUgPT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5FcnJvciA9PSAwKSAmJgorCQkJKHBlZXJLZXlJbmZvLlJlcXVlc3QgPT0gMCkpCisJCXsKKwkJCU1zZ1R5cGUgPSBFQVBPTF9QQUlSX01TR18xOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTCBLZXkgUGFpcndpc2UgTWVzc2FnZSAxXG4iKSk7CisJCX0gZWxzZSBpZigocGVlcktleUluZm8uS2V5VHlwZSA9PSBQQUlSV0lTRUtFWSkgJiYKKwkJCShwZWVyS2V5SW5mby5FS0RfREwgID09IDEpICYmCisJCQkocGVlcktleUluZm8uS2V5QWNrID09IDEpICYmCisJCQkocGVlcktleUluZm8uS2V5TWljID09IDEpICYmCisJCQkocGVlcktleUluZm8uU2VjdXJlID09IDEpICYmCisJCQkocGVlcktleUluZm8uRXJyb3IgPT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5SZXF1ZXN0ID09IDApKQorCQl7CisJCQlNc2dUeXBlID0gRUFQT0xfUEFJUl9NU0dfMzsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQT0wgS2V5IFBhaXJ3aXNlIE1lc3NhZ2UgM1xuIikpOworCQl9IGVsc2UgaWYoKHBlZXJLZXlJbmZvLktleVR5cGUgPT0gR1JPVVBLRVkpICYmCisJCQkocGVlcktleUluZm8uRUtEX0RMID09IDEpICYmCisJCQkocGVlcktleUluZm8uS2V5QWNrID09IDEpICYmCisJCQkocGVlcktleUluZm8uS2V5TWljID09IDEpICYmCisJCQkocGVlcktleUluZm8uU2VjdXJlID09IDEpICYmCisJCQkocGVlcktleUluZm8uRXJyb3IgPT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5SZXF1ZXN0ID09IDApKQorCQl7CisJCQlNc2dUeXBlID0gRUFQT0xfR1JPVVBfTVNHXzE7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUE9MIEtleSBHcm91cCBNZXNzYWdlIDFcbiIpKTsKKwkJfQorCisJCS8vIFdlIHdpbGwgYXNzdW1lIGxpbmsgaXMgdXAgKGFzc29jIHN1Y2Vlc3MgYW5kIHBvcnQgbm90IHNlY3VyZWQpLgorCQkvLyBBbGwgc3RhdGUgaGFzIHRvIGJlIGFibGUgdG8gcHJvY2VzcyBtZXNzYWdlIGZyb20gcHJldmlvdXMgc3RhdGUKKwkJc3dpdGNoKHBBZC0+U3RhQ2ZnLldwYVN0YXRlKQorCQl7CisJCWNhc2UgU1NfU1RBUlQ6CisJCQlpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzEpCisJCQl7CisJCQkJV3BhMlBhaXJNc2cxQWN0aW9uKHBBZCwgRWxlbSk7CisJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX01TR18zOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTU19XQUlUX01TR18zOgorCQkJaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xKQorCQkJeworCQkJCVdwYTJQYWlyTXNnMUFjdGlvbihwQWQsIEVsZW0pOworCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfV0FJVF9NU0dfMzsKKwkJCX0KKwkJCWVsc2UgaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKQorCQkJeworCQkJCVdwYTJQYWlyTXNnM0FjdGlvbihwQWQsIEVsZW0pOworCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfV0FJVF9HUk9VUDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU1NfV0FJVF9HUk9VUDoJCS8vIFdoZW4gZG9pbmcgZ3JvdXAga2V5IGV4Y2hhbmdlCisJCWNhc2UgU1NfRklOSVNIOgkJCS8vIFRoaXMgaGFwcGVuZWQgd2hlbiB1cGRhdGUgZ3JvdXAga2V5CisJCQlpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzEpCisJCQl7CisJCQkgICAgLy8gUmVzZXQgcG9ydCBzZWN1cmVkIHZhcmlhYmxlCisJCQkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisJCQkJV3BhMlBhaXJNc2cxQWN0aW9uKHBBZCwgRWxlbSk7CisJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX01TR18zOworCQkJfQorCQkJZWxzZSBpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpCisJCQl7CisJCQkgICAgLy8gUmVzZXQgcG9ydCBzZWN1cmVkIHZhcmlhYmxlCisJCQkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisJCQkJV3BhMlBhaXJNc2czQWN0aW9uKHBBZCwgRWxlbSk7CisJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX0dST1VQOworCQkJfQorCQkJZWxzZSBpZihNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKQorCQkJeworCQkJCVdwYUdyb3VwTXNnMUFjdGlvbihwQWQsIEVsZW0pOworCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfRklOSVNIOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCS8vIFByb2Nlc3MgV1BBUFNLIEZyYW1lCisJLy8gQ2xhc3NpZnkgbWVzc2FnZSBUeXBlLCBlaXRoZXIgcGFpcndpc2UgbWVzc2FnZSAxLCAzLCBvciBncm91cCBtZXNzYWdlIDEgZm9yIHN1cHBsaWNhbnQKKwllbHNlIGlmKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykKKwl7CisJCWlmKChwZWVyS2V5SW5mby5LZXlUeXBlID09IFBBSVJXSVNFS0VZKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleUluZGV4ID09IDApICYmCisJCQkocGVlcktleUluZm8uS2V5QWNrID09IDEpICYmCisJCQkocGVlcktleUluZm8uS2V5TWljID09IDApICYmCisJCQkocGVlcktleUluZm8uU2VjdXJlID09IDApICYmCisJCQkocGVlcktleUluZm8uRXJyb3IgPT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5SZXF1ZXN0ID09IDApKQorCQl7CisJCQlNc2dUeXBlID0gRUFQT0xfUEFJUl9NU0dfMTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQT0wgS2V5IFBhaXJ3aXNlIE1lc3NhZ2UgMVxuIikpOworCQl9CisJCWVsc2UgaWYoKHBlZXJLZXlJbmZvLktleVR5cGUgPT0gUEFJUldJU0VLRVkpICYmCisJCQkocGVlcktleUluZm8uS2V5SW5kZXggPT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5LZXlBY2sgPT0gMSkgJiYKKwkJCShwZWVyS2V5SW5mby5LZXlNaWMgPT0gMSkgJiYKKwkJCShwZWVyS2V5SW5mby5TZWN1cmUgPT0gMCkgJiYKKwkJCShwZWVyS2V5SW5mby5FcnJvciA9PSAwKSAmJgorCQkJKHBlZXJLZXlJbmZvLlJlcXVlc3QgPT0gMCkpCisJCXsKKwkJCU1zZ1R5cGUgPSBFQVBPTF9QQUlSX01TR18zOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTCBLZXkgUGFpcndpc2UgTWVzc2FnZSAzXG4iKSk7CisJCX0KKwkJZWxzZSBpZigocGVlcktleUluZm8uS2V5VHlwZSA9PSBHUk9VUEtFWSkgJiYKKwkJCShwZWVyS2V5SW5mby5LZXlJbmRleCAhPSAwKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleUFjayA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLktleU1pYyA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLlNlY3VyZSA9PSAxKSAmJgorCQkJKHBlZXJLZXlJbmZvLkVycm9yID09IDApICYmCisJCQkocGVlcktleUluZm8uUmVxdWVzdCA9PSAwKSkKKwkJeworCQkJTXNnVHlwZSA9IEVBUE9MX0dST1VQX01TR18xOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTCBLZXkgR3JvdXAgTWVzc2FnZSAxXG4iKSk7CisJCX0KKworCQkvLyBXZSB3aWxsIGFzc3VtZSBsaW5rIGlzIHVwIChhc3NvYyBzdWNlZXNzIGFuZCBwb3J0IG5vdCBzZWN1cmVkKS4KKwkJLy8gQWxsIHN0YXRlIGhhcyB0byBiZSBhYmxlIHRvIHByb2Nlc3MgbWVzc2FnZSBmcm9tIHByZXZpb3VzIHN0YXRlCisJCXN3aXRjaChwQWQtPlN0YUNmZy5XcGFTdGF0ZSkKKwkJeworCQljYXNlIFNTX1NUQVJUOgorCQkJaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xKQorCQkJeworCQkJCVdwYVBhaXJNc2cxQWN0aW9uKHBBZCwgRWxlbSk7CisJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX01TR18zOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTU19XQUlUX01TR18zOgorCQkJaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xKQorCQkJeworCQkJCVdwYVBhaXJNc2cxQWN0aW9uKHBBZCwgRWxlbSk7CisJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX01TR18zOworCQkJfQorCQkJZWxzZSBpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpCisJCQl7CisJCQkJV3BhUGFpck1zZzNBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1dBSVRfR1JPVVA7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNTX1dBSVRfR1JPVVA6CQkvLyBXaGVuIGRvaW5nIGdyb3VwIGtleSBleGNoYW5nZQorCQljYXNlIFNTX0ZJTklTSDoJCQkvLyBUaGlzIGhhcHBlbmVkIHdoZW4gdXBkYXRlIGdyb3VwIGtleQorCQkJaWYoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xKQorCQkJeworCQkJCVdwYVBhaXJNc2cxQWN0aW9uKHBBZCwgRWxlbSk7CisJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX01TR18zOworCQkJCS8vIFJlc2V0IHBvcnQgc2VjdXJlZCB2YXJpYWJsZQorCQkJCXBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworCQkJfQorCQkJZWxzZSBpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpCisJCQl7CisJCQkJV3BhUGFpck1zZzNBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1dBSVRfR1JPVVA7CisJCQkJLy8gUmVzZXQgcG9ydCBzZWN1cmVkIHZhcmlhYmxlCisJCQkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisJCQl9CisJCQllbHNlIGlmKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpCisJCQl7CisJCQkJV3BhR3JvdXBNc2cxQWN0aW9uKHBBZCwgRWxlbSk7CisJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19GSU5JU0g7CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0tLS0gV3BhRUFQT0xLZXlBY3Rpb25cbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVByb2Nlc3MgUGFpcndpc2Uga2V5IDQtd2F5IGhhbmRzaGFraW5nCisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCUVsZW0JCU1lc3NhZ2UgYm9keQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlXcGFQYWlyTXNnMUFjdGlvbigKKwlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKwlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVBIRUFERVJfODAyXzExICAgICAgcEhlYWRlcjsKKwlVQ0hBUgkJCQkqbXBvb2wsICpQVEssICpkaWdlc3Q7CisJUFVDSEFSICAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlVQ0hBUiAgICAgICAgICAgICAgIEhlYWRlcjgwMl8zWzE0XTsKKwlVTE9ORyAgICAgICAgICAgICAgIEZyYW1lTGVuID0gMDsKKwlQRUFQT0xfUEFDS0VUICAgICAgIHBNc2cxOworCUVBUE9MX1BBQ0tFVCAgICAgICAgUGFja2V0OworCVVDSEFSICAgICAgICAgICAgICAgTWljWzE2XTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYVBhaXJNc2cxQWN0aW9uIC0tLS0tPlxuIikpOworCisJLy8gYWxsb2NhdGUgbWVtb3J5IHBvb2wKKwlvc19hbGxvY19tZW0ocEFkLCAoUFVDSEFSICopJm1wb29sLCAyNTYpOworCisJaWYgKG1wb29sID09IE5VTEwpCisJCXJldHVybjsKKworCS8vIFBUSyBMZW4gPSA4MC4KKwlQVEsgPSAoVUNIQVIgKikgUk9VTkRfVVAobXBvb2wsIDQpOworCS8vIGRpZ2VzdCBMZW4gPSA4MC4KKwlkaWdlc3QgPSAoVUNIQVIgKikgUk9VTkRfVVAoUFRLICsgODAsIDQpOworCisJcEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkgRWxlbS0+TXNnOworCisJLy8gUHJvY2VzcyBtZXNzYWdlIDEgZnJvbSBhdXRoZW50aWNhdG9yCisJcE1zZzEgPSAoUEVBUE9MX1BBQ0tFVCkgJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0hdOworCisJLy8gMS4gU2F2ZSBSZXBsYXkgY291bnRlciwgaXQgd2lsbCB1c2UgdG8gdmVyaWZ5IG1lc3NhZ2UgMyBhbmQgY29uc3RydWN0IG1lc3NhZ2UgMgorCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIHBNc2cxLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLy8gMi4gU2F2ZSBBTm9uY2UKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5BTm9uY2UsIHBNc2cxLT5LZXlEZXNjLktleU5vbmNlLCBMRU5fS0VZX0RFU0NfTk9OQ0UpOworCisJLy8gR2VuZXJhdGUgcmFuZG9tIFNOb25jZQorCUdlblJhbmRvbShwQWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+U3RhQ2ZnLlNOb25jZSk7CisKKwkvLyBDYWxjIFBUSyhBTm9uY2UsIFNOb25jZSkKKwlXcGFDb3VudFBUSyhwQWQsCisJCXBBZC0+U3RhQ2ZnLlBNSywKKwkJcEFkLT5TdGFDZmcuQU5vbmNlLAorCQlwQWQtPkNvbW1vbkNmZy5Cc3NpZCwKKwkJcEFkLT5TdGFDZmcuU05vbmNlLAorCQlwQWQtPkN1cnJlbnRBZGRyZXNzLAorCQlQVEssCisJCUxFTl9QVEspOworCisJLy8gU2F2ZSBrZXkgdG8gUFRLIGVudHJ5CisJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUFRLLCBQVEssIExFTl9QVEspOworCisJLy8gaW5pdCA4MDIuMyBoZWFkZXIgYW5kIEZpbGwgUGFja2V0CisJTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7CisKKwkvLyBaZXJvIE1lc3NhZ2UgMiBib2R5CisJTmRpc1plcm9NZW1vcnkoJlBhY2tldCwgc2l6ZW9mKFBhY2tldCkpOworCVBhY2tldC5Qcm9WZXIJPSBFQVBPTF9WRVI7CisJUGFja2V0LlByb1R5cGUJPSBFQVBPTEtleTsKKwkvLworCS8vIE1lc3NhZ2UgMiBhcyAgRUFQT0wtS2V5KDAsMSwwLDAsMCxQLDAsU05vbmNlLE1JQyxSU04gSUUpCisJLy8KKwlQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMV9LRVlfREVTQzsKKwkvLyAxLiBLZXkgZGVzY3JpcHRvciB2ZXJzaW9uIGFuZCBhcHByb3ByaWF0ZSBSU04gSUUKKwlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJeworCQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPSAyOworCX0KKwllbHNlCSAgLy8gVEtJUAorCXsKKwkJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gMTsKKwl9CisKKwkvLyBmaWxsIGluIERhdGEgTWF0ZXJpYWwgYW5kIGl0cyBsZW5ndGgKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzBdID0gSUVfV1BBOworCVBhY2tldC5LZXlEZXNjLktleURhdGFbMV0gPSBwQWQtPlN0YUNmZy5SU05JRV9MZW47CisJUGFja2V0LktleURlc2MuS2V5RGF0YUxlblsxXSA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiArIDI7CisJTmRpc01vdmVNZW1vcnkoJlBhY2tldC5LZXlEZXNjLktleURhdGFbMl0sIHBBZC0+U3RhQ2ZnLlJTTl9JRSwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKKworCS8vIFVwZGF0ZSBwYWNrZXQgbGVuZ3RoIGFmdGVyIGRlY2lkZSBLZXkgZGF0YSBwYXlsb2FkCisJUGFja2V0LkJvZHlfTGVuWzFdICA9IHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFICsgUGFja2V0LktleURlc2MuS2V5RGF0YUxlblsxXTsKKworCS8vIFVwZGF0ZSBLZXkgbGVuZ3RoCisJUGFja2V0LktleURlc2MuS2V5TGVuZ3RoWzBdID0gcE1zZzEtPktleURlc2MuS2V5TGVuZ3RoWzBdOworCVBhY2tldC5LZXlEZXNjLktleUxlbmd0aFsxXSA9IHBNc2cxLT5LZXlEZXNjLktleUxlbmd0aFsxXTsKKwkvLyAyLiBLZXkgVHlwZSBQZWVyS2V5CisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlUeXBlID0gUEFJUldJU0VLRVk7CisKKwkvLyAzLiBLZXlNaWMgZmllbGQgcHJlc2VudGVkCisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlNaWMgID0gMTsKKworCS8vQ29udmVydCB0byBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KKwkqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykpOworCisKKwkvLyA0LiBGaWxsIFNOb25jZQorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU5vbmNlLCBwQWQtPlN0YUNmZy5TTm9uY2UsIExFTl9LRVlfREVTQ19OT05DRSk7CisKKwkvLyA1LiBLZXkgUmVwbGF5IENvdW50CisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuUmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwkvLyBTZW5kIEVBUE9MKDAsIDEsIDAsIDAsIDAsIFAsIDAsIFNOb25jZSwgTUlDLCBSU05fSUUpCisJLy8gT3V0IGJ1ZmZlciBmb3IgdHJhbnNtaXR0aW5nIG1lc3NhZ2UgMgorCU1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVUNIQVIgKikmcE91dEJ1ZmZlcik7ICAvLyBhbGxvY2F0ZSBtZW1vcnkKKwlpZihwT3V0QnVmZmVyID09IE5VTEwpCisJeworCQlvc19mcmVlX21lbShwQWQsIG1wb29sKTsKKwkJcmV0dXJuOworCX0KKwkvLyBQcmVwYXJlIEVBUE9MIGZyYW1lIGZvciBNSUMgY2FsY3VsYXRpb24KKwkvLyBCZSBjYXJlZnVsLCBvbmx5IEVBUE9MIGZyYW1lIGlzIGNvdW50ZWQgZm9yIE1JQyBjYWxjdWxhdGlvbgorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCisJCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICAgICZQYWNrZXQsCisJCUVORF9PRl9BUkdTKTsKKworCS8vIDYuIFByZXBhcmUgYW5kIEZpbGwgTUlDIHZhbHVlCisJTmRpc1plcm9NZW1vcnkoTWljLCBzaXplb2YoTWljKSk7CisJaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzICA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsJLy8gQUVTCisKKwkJSE1BQ19TSEExKHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBQVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJTmRpc01vdmVNZW1vcnkoTWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKwllbHNlCisJewkvLyBUS0lQCisJCWhtYWNfbWQ1KFBUSywgIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIE1pYyk7CisJfQorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKworCS8vaGV4X2R1bXAoIk1JQyIsIE1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgIAkmRnJhbWVMZW4sCisJCQkgIAkJCUxFTkdUSF84MDJfMywgICAgIAkJCSZIZWFkZXI4MDJfMywKKwkJCQkJCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICAgICZQYWNrZXQsCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisKKworCS8vIDUuIENvcHkgZnJhbWUgdG8gVHggcmluZyBhbmQgc2VuZCBNc2cgMiB0byBhdXRoZW50aWNhdG9yCisJUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zLCAoUFVDSEFSKSZQYWNrZXQsIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsIFRSVUUpOworCisJTWxtZUZyZWVNZW1vcnkocEFkLCAoUFVDSEFSKXBPdXRCdWZmZXIpOworCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGFQYWlyTXNnMUFjdGlvbiA8LS0tLS1cbiIpKTsKK30KKworVk9JRCBXcGEyUGFpck1zZzFBY3Rpb24oCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3sKKwlQSEVBREVSXzgwMl8xMSAgICAgIHBIZWFkZXI7CisJVUNIQVIJCQkJKm1wb29sLCAqUFRLLCAqZGlnZXN0OworCVBVQ0hBUiAgICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJVUNIQVIgICAgICAgICAgICAgICBIZWFkZXI4MDJfM1sxNF07CisJVUxPTkcgICAgICAgICAgICAgICBGcmFtZUxlbiA9IDA7CisJUEVBUE9MX1BBQ0tFVCAgICAgICBwTXNnMTsKKwlFQVBPTF9QQUNLRVQgICAgICAgIFBhY2tldDsKKwlVQ0hBUiAgICAgICAgICAgICAgIE1pY1sxNl07CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGEyUGFpck1zZzFBY3Rpb24gLS0tLS0+XG4iKSk7CisKKwkvLyBhbGxvY2F0ZSBtZW1vcnkgcG9vbAorCW9zX2FsbG9jX21lbShwQWQsIChQVUNIQVIgKikmbXBvb2wsIDI1Nik7CisKKwlpZiAobXBvb2wgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLy8gUFRLIExlbiA9IDgwLgorCVBUSyA9IChVQ0hBUiAqKSBST1VORF9VUChtcG9vbCwgNCk7CisJLy8gZGlnZXN0IExlbiA9IDgwLgorCWRpZ2VzdCA9IChVQ0hBUiAqKSBST1VORF9VUChQVEsgKyA4MCwgNCk7CisKKwlwSGVhZGVyID0gKFBIRUFERVJfODAyXzExKSBFbGVtLT5Nc2c7CisKKwkvLyBQcm9jZXNzIG1lc3NhZ2UgMSBmcm9tIGF1dGhlbnRpY2F0b3IKKwkJcE1zZzEgPSAoUEVBUE9MX1BBQ0tFVCkJJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0hdOworCisJLy8gMS4gU2F2ZSBSZXBsYXkgY291bnRlciwgaXQgd2lsbCB1c2UgdG8gdmVyaWZ5IG1lc3NhZ2UgMyBhbmQgY29uc3RydWN0IG1lc3NhZ2UgMgorCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIHBNc2cxLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLy8gMi4gU2F2ZSBBTm9uY2UKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5BTm9uY2UsIHBNc2cxLT5LZXlEZXNjLktleU5vbmNlLCBMRU5fS0VZX0RFU0NfTk9OQ0UpOworCisJLy8gR2VuZXJhdGUgcmFuZG9tIFNOb25jZQorCUdlblJhbmRvbShwQWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+U3RhQ2ZnLlNOb25jZSk7CisKKwlpZihwTXNnMS0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdID4gMCApCisJeworCQkvLyBjYWNoZWQgUE1LSUQKKwl9CisKKwkvLyBDYWxjIFBUSyhBTm9uY2UsIFNOb25jZSkKKwlXcGFDb3VudFBUSyhwQWQsCisJCXBBZC0+U3RhQ2ZnLlBNSywKKwkJcEFkLT5TdGFDZmcuQU5vbmNlLAorCQlwQWQtPkNvbW1vbkNmZy5Cc3NpZCwKKwkJcEFkLT5TdGFDZmcuU05vbmNlLAorCQlwQWQtPkN1cnJlbnRBZGRyZXNzLAorCQlQVEssCisJCUxFTl9QVEspOworCisJLy8gU2F2ZSBrZXkgdG8gUFRLIGVudHJ5CisJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUFRLLCBQVEssIExFTl9QVEspOworCisJLy8gaW5pdCA4MDIuMyBoZWFkZXIgYW5kIEZpbGwgUGFja2V0CisJTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7CisKKwkvLyBaZXJvIG1lc3NhZ2UgMiBib2R5CisJTmRpc1plcm9NZW1vcnkoJlBhY2tldCwgc2l6ZW9mKFBhY2tldCkpOworCVBhY2tldC5Qcm9WZXIJPSBFQVBPTF9WRVI7CisJUGFja2V0LlByb1R5cGUJPSBFQVBPTEtleTsKKwkvLworCS8vIE1lc3NhZ2UgMiBhcyAgRUFQT0wtS2V5KDAsMSwwLDAsMCxQLDAsU05vbmNlLE1JQyxSU04gSUUpCisJLy8KKwlQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMl9LRVlfREVTQzsKKworCS8vIDEuIEtleSBkZXNjcmlwdG9yIHZlcnNpb24gYW5kIGFwcHJvcHJpYXRlIFJTTiBJRQorCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gMjsKKwl9CisJZWxzZQkgIC8vIFRLSVAKKwl7CisJCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9IDE7CisJfQorCisJLy8gZmlsbCBpbiBEYXRhIE1hdGVyaWFsIGFuZCBpdHMgbGVuZ3RoCisJUGFja2V0LktleURlc2MuS2V5RGF0YVswXSA9IElFX1dQQTI7CisJUGFja2V0LktleURlc2MuS2V5RGF0YVsxXSA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKKwlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhTGVuWzFdID0gcEFkLT5TdGFDZmcuUlNOSUVfTGVuICsgMjsKKwlOZGlzTW92ZU1lbW9yeSgmUGFja2V0LktleURlc2MuS2V5RGF0YVsyXSwgcEFkLT5TdGFDZmcuUlNOX0lFLCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOworCisJLy8gVXBkYXRlIHBhY2tldCBsZW5ndGggYWZ0ZXIgZGVjaWRlIEtleSBkYXRhIHBheWxvYWQKKwlQYWNrZXQuQm9keV9MZW5bMV0gID0gc2l6ZW9mKEtFWV9ERVNDUklQVEVSKSAtIE1BWF9MRU5fT0ZfUlNOSUUgKyBQYWNrZXQuS2V5RGVzYy5LZXlEYXRhTGVuWzFdOworCisJLy8gMi4gS2V5IFR5cGUgUGVlcktleQorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5VHlwZSA9IFBBSVJXSVNFS0VZOworCisJLy8gMy4gS2V5TWljIGZpZWxkIHByZXNlbnRlZAorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5TWljICA9IDE7CisKKwkvLyBVcGRhdGUgS2V5IExlbmd0aAorCVBhY2tldC5LZXlEZXNjLktleUxlbmd0aFswXSA9IDA7CisJUGFja2V0LktleURlc2MuS2V5TGVuZ3RoWzFdID0gcE1zZzEtPktleURlc2MuS2V5TGVuZ3RoWzFdOworCisJLy8gNC4gRmlsbCBTTm9uY2UKKwlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlOb25jZSwgcEFkLT5TdGFDZmcuU05vbmNlLCBMRU5fS0VZX0RFU0NfTk9OQ0UpOworCisJLy8gNS4gS2V5IFJlcGxheSBDb3VudAorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLy8gQ29udmVydCB0byBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KKwkqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykpOworCisJLy8gU2VuZCBFQVBPTC1LZXkoMCwxLDAsMCwwLFAsMCxTTm9uY2UsTUlDLFJTTiBJRSkKKwkvLyBPdXQgYnVmZmVyIGZvciB0cmFuc21pdHRpbmcgbWVzc2FnZSAyCisJTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgIChQVUNIQVIgKikmcE91dEJ1ZmZlcik7ICAvLyBhbGxvY2F0ZSBtZW1vcnkKKwlpZihwT3V0QnVmZmVyID09IE5VTEwpCisJeworCQlvc19mcmVlX21lbShwQWQsIG1wb29sKTsKKwkJcmV0dXJuOworCX0KKworCS8vIFByZXBhcmUgRUFQT0wgZnJhbWUgZm9yIE1JQyBjYWxjdWxhdGlvbgorCS8vIEJlIGNhcmVmdWwsIG9ubHkgRUFQT0wgZnJhbWUgaXMgY291bnRlZCBmb3IgTUlDIGNhbGN1bGF0aW9uCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICZGcmFtZUxlbiwKKwkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgJlBhY2tldCwKKwkJRU5EX09GX0FSR1MpOworCisJLy8gNi4gUHJlcGFyZSBhbmQgRmlsbCBNSUMgdmFsdWUKKwlOZGlzWmVyb01lbW9yeShNaWMsIHNpemVvZihNaWMpKTsKKwlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CisJCS8vIEFFUworCQlITUFDX1NIQTEocE91dEJ1ZmZlciwgRnJhbWVMZW4sIFBUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworCQlOZGlzTW92ZU1lbW9yeShNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisJfQorCWVsc2UKKwl7CisJCWhtYWNfbWQ1KFBUSywgIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIE1pYyk7CisJfQorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKworCisJLy8gTWFrZSAgVHJhbnNtaXR0aW5nIGZyYW1lCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgIAkmRnJhbWVMZW4sCisJCQkgIAkJCUxFTkdUSF84MDJfMywgICAgIAkJJkhlYWRlcjgwMl8zLAorCQkJCQkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgJlBhY2tldCwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKworCisJLy8gNS4gQ29weSBmcmFtZSB0byBUeCByaW5nCisJUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zLCAoUFVDSEFSKSZQYWNrZXQsIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsIFRSVUUpOworCisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwlvc19mcmVlX21lbShwQWQsIG1wb29sKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYTJQYWlyTXNnMUFjdGlvbiA8LS0tLS1cbiIpKTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJvY2VzcyBQYWlyd2lzZSBrZXkgNC13YXkgaGFuZHNoYWtpbmcKKworCUFyZ3VtZW50czoKKwkJcEFkCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKwkJRWxlbQkJTWVzc2FnZSBib2R5CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVdwYVBhaXJNc2czQWN0aW9uKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCU1MTUVfUVVFVUVfRUxFTQkqRWxlbSkKKworeworCVBIRUFERVJfODAyXzExICAgICAgcEhlYWRlcjsKKwlQVUNIQVIgICAgICAgICAgCXBPdXRCdWZmZXIgPSBOVUxMOworCVVDSEFSICAgICAgICAgICAgICAgSGVhZGVyODAyXzNbMTRdOworCVVMT05HICAgICAgICAgICAJRnJhbWVMZW4gPSAwOworCUVBUE9MX1BBQ0tFVCAgICAgICAgUGFja2V0OworCVBFQVBPTF9QQUNLRVQgICAgICAgcE1zZzM7CisJVUNIQVIgICAgICAgICAgIAlNaWNbMTZdLCBPbGRNaWNbMTZdOworCU1BQ19UQUJMRV9FTlRSWSAJKnBFbnRyeSA9IE5VTEw7CisJVUNIQVIJCQkJc2tpcF9vZmZzZXQ7CisJS0VZX0lORk8JCQlwZWVyS2V5SW5mbzsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYVBhaXJNc2czQWN0aW9uIC0tLS0tPlxuIikpOworCisJLy8gUmVjb3JkIDgwMi4xMSBoZWFkZXIgJiB0aGUgcmVjZWl2ZWQgRUFQT0wgcGFja2V0IE1zZzMKKwlwSGVhZGVyID0gKFBIRUFERVJfODAyXzExKSBFbGVtLT5Nc2c7CisJcE1zZzMgPSAoUEVBUE9MX1BBQ0tFVCkJJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0hdOworCisJTmRpc1plcm9NZW1vcnkoKFBVQ0hBUikmcGVlcktleUluZm8sIHNpemVvZihwZWVyS2V5SW5mbykpOworCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpJnBlZXJLZXlJbmZvLCAoUFVDSEFSKSZwTXNnMy0+S2V5RGVzYy5LZXlJbmZvLCBzaXplb2YoS0VZX0lORk8pKTsKKworCSooKFVTSE9SVCopJnBlZXJLZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCopJnBlZXJLZXlJbmZvKSk7CisKKworCS8vIDEuIFZlcmlmeSBjaXBoZXIgdHlwZSBtYXRjaAorCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQgJiYgKHBlZXJLZXlJbmZvLktleURlc2NWZXIgIT0gMikpCisJeworCQlyZXR1cm47CisJfQorCWVsc2UgaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQgJiYgKHBlZXJLZXlJbmZvLktleURlc2NWZXIgIT0gMSkpCisJeworCQlyZXR1cm47CisJfQorCisJLy8gVmVyaWZ5IFJTTiBJRQorCS8vaWYgKCFSVE1QRXF1YWxNZW1vcnkocE1zZzMtPktleURlc2MuS2V5RGF0YSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05fSUUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuKSkKKwlpZiAoIUNoZWNrUlNOSUUocEFkLCBwTXNnMy0+S2V5RGVzYy5LZXlEYXRhLCBwTXNnMy0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdLCAmc2tpcF9vZmZzZXQpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlNOX0lFIERpZmZlcmVudCBpbiBNc2cgMyBvZiBXUEExIDQtd2F5IGhhbmRzaGFrZSEhIFxuIikpOworCQloZXhfZHVtcCgiVGhlIG9yaWdpbmFsIFJTTl9JRSIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOX0lFLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbik7CisJCWhleF9kdW1wKCJUaGUgcmVjZWl2ZWQgUlNOX0lFIiwgcE1zZzMtPktleURlc2MuS2V5RGF0YSwgcE1zZzMtPktleURlc2MuS2V5RGF0YUxlblsxXSk7CisJCXJldHVybjsKKwl9CisJZWxzZQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSU05fSUUgVkFMSUQgaW4gTXNnIDMgb2YgV1BBMSA0LXdheSBoYW5kc2hha2UhISBcbiIpKTsKKworCisJLy8gMi4gQ2hlY2sgTUlDIHZhbHVlCisJLy8gU2F2ZSB0aGUgTUlDIGFuZCByZXBsYWNlIHdpdGggemVybworCU5kaXNNb3ZlTWVtb3J5KE9sZE1pYywgcE1zZzMtPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKwlOZGlzWmVyb01lbW9yeShwTXNnMy0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CisJCS8vIEFFUworCQlVQ0hBUiBkaWdlc3RbODBdOworCisJCUhNQUNfU0hBMSgoUFVDSEFSKSBwTXNnMywgcE1zZzMtPkJvZHlfTGVuWzFdICsgNCwgcEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7CisJCU5kaXNNb3ZlTWVtb3J5KE1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKKwl9CisJZWxzZQkvLyBUS0lQCisJeworCQlobWFjX21kNShwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgKFBVQ0hBUikgcE1zZzMsIHBNc2czLT5Cb2R5X0xlblsxXSArIDQsIE1pYyk7CisJfQorCisJaWYoIU5kaXNFcXVhbE1lbW9yeShPbGRNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQykpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIgTUlDIERpZmZlcmVudCBpbiBtc2cgMyBvZiA0LXdheSBoYW5kc2hha2UhISEhISEhISEhIFxuIikpOworCQlyZXR1cm47CisJfQorCWVsc2UKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIE1JQyBWQUxJRCBpbiBtc2cgMyBvZiA0LXdheSBoYW5kc2hha2UhISEhISEhISEhIFxuIikpOworCisJLy8gMy4gQ2hlY2sgUmVwbGF5IENvdW50ZXIsIGl0IGhhcyB0byBiZSBsYXJnZXIgdGhhbiBsYXN0IG9uZS4gTm8gbmVlZCB0byBiZSBleGFjdCBvbmUgbGFyZ2VyCisJaWYoUlRNUENvbXBhcmVNZW1vcnkocE1zZzMtPktleURlc2MuUmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSkgIT0gMSkKKwkJcmV0dXJuOworCisJLy8gVXBkYXRlIG5ldyByZXBsYXkgY291bnRlcgorCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIHBNc2czLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLy8gNC4gRG91YmxlIGNoZWNrIEFOb25jZQorCWlmKCFOZGlzRXF1YWxNZW1vcnkocEFkLT5TdGFDZmcuQU5vbmNlLCBwTXNnMy0+S2V5RGVzYy5LZXlOb25jZSwgTEVOX0tFWV9ERVNDX05PTkNFKSkKKwkJcmV0dXJuOworCisJLy8gaW5pdCA4MDIuMyBoZWFkZXIgYW5kIEZpbGwgUGFja2V0CisJTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7CisKKwkvLyBaZXJvIE1lc3NhZ2UgNCBib2R5CisJTmRpc1plcm9NZW1vcnkoJlBhY2tldCwgc2l6ZW9mKFBhY2tldCkpOworCVBhY2tldC5Qcm9WZXIJPSBFQVBPTF9WRVI7CisJUGFja2V0LlByb1R5cGUJPSBFQVBPTEtleTsKKwlQYWNrZXQuQm9keV9MZW5bMV0gID0gc2l6ZW9mKEtFWV9ERVNDUklQVEVSKSAtIE1BWF9MRU5fT0ZfUlNOSUU7CQkvLyBObyBkYXRhIGZpZWxkCisKKwkvLworCS8vIE1lc3NhZ2UgNCBhcyAgRUFQT0wtS2V5KDAsMSwwLDAsMCxQLDAsMCxNSUMsMCkKKwkvLworCVBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEExX0tFWV9ERVNDOworCisJLy8gS2V5IGRlc2NyaXB0b3IgdmVyc2lvbiBhbmQgYXBwcm9wcmlhdGUgUlNOIElFCisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gcGVlcktleUluZm8uS2V5RGVzY1ZlcjsKKworCS8vIFVwZGF0ZSBLZXkgTGVuZ3RoCisJUGFja2V0LktleURlc2MuS2V5TGVuZ3RoWzBdID0gcE1zZzMtPktleURlc2MuS2V5TGVuZ3RoWzBdOworCVBhY2tldC5LZXlEZXNjLktleUxlbmd0aFsxXSA9IHBNc2czLT5LZXlEZXNjLktleUxlbmd0aFsxXTsKKworCS8vIEtleSBUeXBlIFBlZXJLZXkKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleVR5cGUgPSBQQUlSV0lTRUtFWTsKKworCS8vIEtleU1pYyBmaWVsZCBwcmVzZW50ZWQKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleU1pYyAgPSAxOworCisJLy8gSW4gTXNnMywgIEtleUluZm8uc2VjdXJlID0wIGlmIEdyb3VwIEtleSBIUyB0byBjb21lLiAxIGlmIG5vIGdyb3VwIGtleSBIUworCS8vIFN0YXRpb24gc2VuZHMgTXNnNCAgS2V5SW5mby5zZWN1cmUgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoYXQgaW4gTXNnLjMKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLlNlY3VyZT0gcGVlcktleUluZm8uU2VjdXJlOworCisJLy8gQ29udmVydCB0byBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KKwkqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykpOworCisJLy8gS2V5IFJlcGxheSBjb3VudAorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBNc2czLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLy8gT3V0IGJ1ZmZlciBmb3IgdHJhbnNtaXR0aW5nIG1lc3NhZ2UgNAorCU1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVUNIQVIgKikmcE91dEJ1ZmZlcik7ICAvLyBhbGxvY2F0ZSBtZW1vcnkKKwlpZihwT3V0QnVmZmVyID09IE5VTEwpCisJCXJldHVybjsKKworCS8vIFByZXBhcmUgRUFQT0wgZnJhbWUgZm9yIE1JQyBjYWxjdWxhdGlvbgorCS8vIEJlIGNhcmVmdWwsIG9ubHkgRUFQT0wgZnJhbWUgaXMgY291bnRlZCBmb3IgTUlDIGNhbGN1bGF0aW9uCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKwkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgICAgJlBhY2tldCwKKwkJRU5EX09GX0FSR1MpOworCisJLy8gUHJlcGFyZSBhbmQgRmlsbCBNSUMgdmFsdWUKKwlOZGlzWmVyb01lbW9yeShNaWMsIHNpemVvZihNaWMpKTsKKwlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJeworCQkvLyBBRVMKKwkJVUNIQVIgZGlnZXN0WzgwXTsKKworCQlITUFDX1NIQTEocE91dEJ1ZmZlciwgRnJhbWVMZW4sIHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworCQlOZGlzTW92ZU1lbW9yeShNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisJfQorCWVsc2UKKwl7CisJCWhtYWNfbWQ1KHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCBwT3V0QnVmZmVyLCBGcmFtZUxlbiwgTWljKTsKKwl9CisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5TWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCisJLy8gVXBkYXRlIFBUSworCS8vIFByZXBhcmUgcGFpci13aXNlIGtleSBpbmZvcm1hdGlvbiBpbnRvIHNoYXJlZCBrZXkgdGFibGUKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0sIHNpemVvZihDSVBIRVJfS0VZKSk7CisJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7CisgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCAmcEFkLT5TdGFDZmcuUFRLWzMyXSwgTEVOX1RLSVBfRUspOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4XSwgTEVOX1RLSVBfUlhNSUNLKTsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywgJnBBZC0+U3RhQ2ZnLlBUS1s0OCtMRU5fVEtJUF9SWE1JQ0tdLCBMRU5fVEtJUF9UWE1JQ0spOworCisJLy8gRGVjaWRlIGl0cyBDaGlwZXJBbGcKKwlpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKwllbHNlIGlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7CisJZWxzZQorCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKworCS8vIFVwZGF0ZSB0aGVzZSByZWxhdGVkIGluZm9ybWF0aW9uIHRvIE1BQ19UQUJMRV9FTlRSWQorCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOworCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuS2V5LCAmcEFkLT5TdGFDZmcuUFRLWzMyXSwgTEVOX1RLSVBfRUspOworCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuUnhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDhdLCBMRU5fVEtJUF9SWE1JQ0spOworCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuVHhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDgrTEVOX1RLSVBfUlhNSUNLXSwgTEVOX1RLSVBfVFhNSUNLKTsKKwlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZzsKKworCS8vIFVwZGF0ZSBwYWlyd2lzZSBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCisJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKKwkJCQkJCSAgQlNTMCwKKwkJCQkJCSAgMCwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYyk7CisKKwkvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKwlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKwkJCQkJCQkgIEJTUzAsCisJCQkJCQkJICAwLAorCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAorCQkJCQkJCSAgcEVudHJ5KTsKKworCS8vIE1ha2UgdHJhbnNtaXR0aW5nIGZyYW1lCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgIAkmRnJhbWVMZW4sCisJCQkgIAkJCUxFTkdUSF84MDJfMywgICAgIAkJJkhlYWRlcjgwMl8zLAorCQkJCQkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgJlBhY2tldCwKKwkJCQkJCUVORF9PRl9BUkdTKTsKKworCisJLy8gQ29weSBmcmFtZSB0byBUeCByaW5nIGFuZCBTZW5kIE1lc3NhZ2UgNCB0byBhdXRoZW50aWNhdG9yCisJUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zLCAoUFVDSEFSKSZQYWNrZXQsIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsIFRSVUUpOworCisJTWxtZUZyZWVNZW1vcnkocEFkLCAoUFVDSEFSKXBPdXRCdWZmZXIpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhUGFpck1zZzNBY3Rpb24gPC0tLS0tXG4iKSk7Cit9CisKK1ZPSUQgICAgV3BhMlBhaXJNc2czQWN0aW9uKAorCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAorCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCisKK3sKKwlQSEVBREVSXzgwMl8xMSAgICAgIHBIZWFkZXI7CisJUFVDSEFSICAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKKwlVQ0hBUiAgICAgICAgICAgICAgIEhlYWRlcjgwMl8zWzE0XTsKKwlVTE9ORyAgICAgICAgICAgICAgIEZyYW1lTGVuID0gMDsKKwlFQVBPTF9QQUNLRVQgICAgICAgIFBhY2tldDsKKwlQRUFQT0xfUEFDS0VUICAgICAgIHBNc2czOworCVVDSEFSICAgICAgICAgICAgICAgTWljWzE2XSwgT2xkTWljWzE2XTsKKwlVQ0hBUiAgICAgICAgICAgICAgICptcG9vbCwgKktFWURBVEEsICpkaWdlc3Q7CisJVUNIQVIgICAgICAgICAgICAgICBLZXlbMzJdOworCU1BQ19UQUJMRV9FTlRSWSAJKnBFbnRyeSA9IE5VTEw7CisJS0VZX0lORk8JCQlwZWVyS2V5SW5mbzsKKworCS8vIGFsbG9jYXRlIG1lbW9yeQorCW9zX2FsbG9jX21lbShwQWQsIChQVUNIQVIgKikmbXBvb2wsIDEwMjQpOworCisJaWYobXBvb2wgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLy8gS0VZREFUQSBMZW4gPSA1MTIuCisJS0VZREFUQSA9IChVQ0hBUiAqKSBST1VORF9VUChtcG9vbCwgNCk7CisJLy8gZGlnZXN0IExlbiA9IDgwLgorCWRpZ2VzdCA9IChVQ0hBUiAqKSBST1VORF9VUChLRVlEQVRBICsgNTEyLCA0KTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYTJQYWlyTXNnM0FjdGlvbiAtLS0tLT5cbiIpKTsKKworCXBIZWFkZXIgPSAoUEhFQURFUl84MDJfMTEpIEVsZW0tPk1zZzsKKworCS8vIFByb2Nlc3MgbWVzc2FnZSAzIGZyYW1lLgorCXBNc2czID0gKFBFQVBPTF9QQUNLRVQpCSZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IXTsKKworCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpJnBlZXJLZXlJbmZvLCBzaXplb2YocGVlcktleUluZm8pKTsKKwlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKSZwZWVyS2V5SW5mbywgKFBVQ0hBUikmcE1zZzMtPktleURlc2MuS2V5SW5mbywgc2l6ZW9mKEtFWV9JTkZPKSk7CisKKwkqKChVU0hPUlQqKSZwZWVyS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQqKSZwZWVyS2V5SW5mbykpOworCisJLy8gMS4gVmVyaWZ5IGNpcGhlciB0eXBlIG1hdGNoCisJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkICYmIChwZWVyS2V5SW5mby5LZXlEZXNjVmVyIT0gMikpCisJeworCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOworCQlyZXR1cm47CisJfQorCWVsc2UgaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQgJiYgKHBlZXJLZXlJbmZvLktleURlc2NWZXIgIT0gMSkpCisJeworCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOworCQlyZXR1cm47CisJfQorCisJLy8gMi4gQ2hlY2sgTUlDIHZhbHVlCisJLy8gU2F2ZSB0aGUgTUlDIGFuZCByZXBsYWNlIHdpdGggemVybworCU5kaXNNb3ZlTWVtb3J5KE9sZE1pYywgcE1zZzMtPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKwlOZGlzWmVyb01lbW9yeShwTXNnMy0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwl7CisJCS8vIEFFUworCQlITUFDX1NIQTEoKFBVQ0hBUikgcE1zZzMsIHBNc2czLT5Cb2R5X0xlblsxXSArIDQsIHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworCQlOZGlzTW92ZU1lbW9yeShNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisJfQorCWVsc2UKKwl7CisJCWhtYWNfbWQ1KHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCAoUFVDSEFSKSBwTXNnMywgcE1zZzMtPkJvZHlfTGVuWzFdICsgNCwgTWljKTsKKwl9CisKKwlpZighTmRpc0VxdWFsTWVtb3J5KE9sZE1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiBNSUMgRGlmZmVyZW50IGluIG1zZyAzIG9mIDQtd2F5IGhhbmRzaGFrZSEhISEhISEhISEgXG4iKSk7CisJCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7CisJCXJldHVybjsKKwl9CisJZWxzZQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgTUlDIFZBTElEIGluIG1zZyAzIG9mIDQtd2F5IGhhbmRzaGFrZSEhISEhISEhISEgXG4iKSk7CisKKwkvLyAzLiBDaGVjayBSZXBsYXkgQ291bnRlciwgaXQgaGFzIHRvIGJlIGxhcmdlciB0aGFuIGxhc3Qgb25lLiBObyBuZWVkIHRvIGJlIGV4YWN0IG9uZSBsYXJnZXIKKwlpZihSVE1QQ29tcGFyZU1lbW9yeShwTXNnMy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKSAhPSAxKQorCXsKKwkJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKwkJcmV0dXJuOworCX0KKworCS8vIFVwZGF0ZSBuZXcgcmVwbGF5IGNvdW50ZXIKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBwTXNnMy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCS8vIDQuIERvdWJsZSBjaGVjayBBTm9uY2UKKwlpZighTmRpc0VxdWFsTWVtb3J5KHBBZC0+U3RhQ2ZnLkFOb25jZSwgcE1zZzMtPktleURlc2MuS2V5Tm9uY2UsIExFTl9LRVlfREVTQ19OT05DRSkpCisJeworCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOworCQlyZXR1cm47CisJfQorCisJLy8gT2J0YWluIEdUSworCS8vIDUuIERlY3J5cHQgR1RLIGZyb20gS2V5IERhdGEKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiRUtEID0gJWRcbiIsIHBlZXJLZXlJbmZvLkVLRF9ETCkpOworCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJLy8gRGVjcnlwdCBBRVMgR1RLCisJCUFFU19HVEtfS0VZX1VOV1JBUCgmcEFkLT5TdGFDZmcuUFRLWzE2XSwgS0VZREFUQSwgcE1zZzMtPktleURlc2MuS2V5RGF0YUxlblsxXSxwTXNnMy0+S2V5RGVzYy5LZXlEYXRhKTsKKwl9CisJZWxzZQkgIC8vIFRLSVAKKwl7CisJCUlOVCBpOworCQkvLyBEZWNyeXB0IFRLSVAgR1RLCisJCS8vIENvbnN0cnVjdCAzMiBieXRlcyBSQzQgS2V5CisJCU5kaXNNb3ZlTWVtb3J5KEtleSwgcE1zZzMtPktleURlc2MuS2V5SXYsIDE2KTsKKwkJTmRpc01vdmVNZW1vcnkoJktleVsxNl0sICZwQWQtPlN0YUNmZy5QVEtbMTZdLCAxNik7CisJCUFSQ0ZPVVJfSU5JVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBLZXksIDMyKTsKKwkJLy9kaXNjYXJkIGZpcnN0IDI1NiBieXRlcworCQlmb3IoaSA9IDA7IGkgPCAyNTY7IGkrKykKKwkJCUFSQ0ZPVVJfQllURSgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhUKTsKKwkJLy8gRGVjcnlwdCBHVEsuIEJlY2FyZWZ1bCwgdGhlcmUgaXMgbm8gSUNWIHRvIGNoZWNrIHRoZSByZXN1bHQgaXMgY29ycmVjdCBvciBub3QKKwkJQVJDRk9VUl9ERUNSWVBUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIEtFWURBVEEsIHBNc2czLT5LZXlEZXNjLktleURhdGEsIHBNc2czLT5LZXlEZXNjLktleURhdGFMZW5bMV0pOworCX0KKworCWlmICghUGFyc2VLZXlEYXRhKHBBZCwgS0VZREFUQSwgcE1zZzMtPktleURlc2MuS2V5RGF0YUxlblsxXSwgMSkpCisJeworCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOworCQlyZXR1cm47CisJfQorCisJLy8gVXBkYXRlIEdUSyB0byBBU0lDCisJLy8gVXBkYXRlIGdyb3VwIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKKwlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAorCQkJCQkJICBCU1MwLAorCQkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5UeE1pYywKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5SeE1pYyk7CisKKwkvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKwlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKwkJCQkJCQkgIEJTUzAsCisJCQkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCisJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZywKKwkJCQkJCQkgIE5VTEwpOworCisJLy8gaW5pdCA4MDIuMyBoZWFkZXIgYW5kIEZpbGwgUGFja2V0CisJTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7CisKKwkvLyBaZXJvIG1lc3NhZ2UgNCBib2R5CisJTmRpc1plcm9NZW1vcnkoJlBhY2tldCwgc2l6ZW9mKFBhY2tldCkpOworCVBhY2tldC5Qcm9WZXIJPSBFQVBPTF9WRVI7CisJUGFja2V0LlByb1R5cGUJPSBFQVBPTEtleTsKKwlQYWNrZXQuQm9keV9MZW5bMV0gIAk9IHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFOwkJLy8gTm8gZGF0YSBmaWVsZAorCisJLy8KKwkvLyBNZXNzYWdlIDQgYXMgIEVBUE9MLUtleSgwLDEsMCwwLDAsUCwwLDAsTUlDLDApCisJLy8KKwlQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMl9LRVlfREVTQzsKKworCS8vIEtleSBkZXNjcmlwdG9yIHZlcnNpb24gYW5kIGFwcHJvcHJpYXRlIFJTTiBJRQorCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9IHBlZXJLZXlJbmZvLktleURlc2NWZXI7CisKKwkvLyBVcGRhdGUgS2V5IExlbmd0aAorCVBhY2tldC5LZXlEZXNjLktleUxlbmd0aFswXSA9IHBNc2czLT5LZXlEZXNjLktleUxlbmd0aFswXTsKKwlQYWNrZXQuS2V5RGVzYy5LZXlMZW5ndGhbMV0gPSBwTXNnMy0+S2V5RGVzYy5LZXlMZW5ndGhbMV07CisKKwkvLyBLZXkgVHlwZSBQZWVyS2V5CisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlUeXBlID0gUEFJUldJU0VLRVk7CisKKwkvLyBLZXlNaWMgZmllbGQgcHJlc2VudGVkCisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlNaWMgID0gMTsKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLlNlY3VyZSA9IDE7CisKKwkvLyBDb252ZXJ0IHRvIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgorCSooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSk7CisKKwkvLyBLZXkgUmVwbGF5IGNvdW50CisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuUmVwbGF5Q291bnRlciwgcE1zZzMtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwkvLyBPdXQgYnVmZmVyIGZvciB0cmFuc21pdHRpbmcgbWVzc2FnZSA0CisJTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBVQ0hBUiAqKSZwT3V0QnVmZmVyKTsgIC8vIGFsbG9jYXRlIG1lbW9yeQorCWlmKHBPdXRCdWZmZXIgPT0gTlVMTCkKKwl7CisJCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7CisJCXJldHVybjsKKwl9CisKKwkvLyBQcmVwYXJlIEVBUE9MIGZyYW1lIGZvciBNSUMgY2FsY3VsYXRpb24KKwkvLyBCZSBjYXJlZnVsLCBvbmx5IEVBUE9MIGZyYW1lIGlzIGNvdW50ZWQgZm9yIE1JQyBjYWxjdWxhdGlvbgorCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCisJCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICAgICZQYWNrZXQsCisJCUVORF9PRl9BUkdTKTsKKworCS8vIFByZXBhcmUgYW5kIEZpbGwgTUlDIHZhbHVlCisJTmRpc1plcm9NZW1vcnkoTWljLCBzaXplb2YoTWljKSk7CisJaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJeworCQkvLyBBRVMKKwkJSE1BQ19TSEExKHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJTmRpc01vdmVNZW1vcnkoTWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKwllbHNlCisJeworCQlobWFjX21kNShwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIE1pYyk7CisJfQorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKworCS8vIFVwZGF0ZSBQVEsKKwkvLyBQcmVwYXJlIHBhaXItd2lzZSBrZXkgaW5mb3JtYXRpb24gaW50byBzaGFyZWQga2V5IHRhYmxlCisJTmRpc1plcm9NZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IExFTl9US0lQX0VLOworICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgJnBBZC0+U3RhQ2ZnLlBUS1szMl0sIExFTl9US0lQX0VLKTsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYywgJnBBZC0+U3RhQ2ZnLlBUS1s0OF0sIExFTl9US0lQX1JYTUlDSyk7CisJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDgrTEVOX1RLSVBfUlhNSUNLXSwgTEVOX1RLSVBfVFhNSUNLKTsKKworCS8vIERlY2lkZSBpdHMgQ2hpcGVyQWxnCisJaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7CisJZWxzZSBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworCWVsc2UKKwkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisKKwkvLyBVcGRhdGUgdGhlc2UgcmVsYXRlZCBpbmZvcm1hdGlvbiB0byBNQUNfVEFCTEVfRU5UUlkKKwlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKKwlOZGlzTW92ZU1lbW9yeSgmcEVudHJ5LT5QYWlyd2lzZUtleS5LZXksICZwQWQtPlN0YUNmZy5QVEtbMzJdLCBMRU5fVEtJUF9FSyk7CisJTmRpc01vdmVNZW1vcnkoJnBFbnRyeS0+UGFpcndpc2VLZXkuUnhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDhdLCBMRU5fVEtJUF9SWE1JQ0spOworCU5kaXNNb3ZlTWVtb3J5KCZwRW50cnktPlBhaXJ3aXNlS2V5LlR4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4K0xFTl9US0lQX1JYTUlDS10sIExFTl9US0lQX1RYTUlDSyk7CisJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGc7CisKKwkvLyBVcGRhdGUgcGFpcndpc2Uga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQorCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCisJCQkJCQkgIEJTUzAsCisJCQkJCQkgIDAsCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMpOworCisJLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCisJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCisJCQkJCQkJICBCU1MwLAorCQkJCQkJCSAgMCwKKwkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKKwkJCQkJCQkgIHBFbnRyeSk7CisKKwkvLyBNYWtlICBUcmFuc21pdHRpbmcgZnJhbWUKKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgCSZGcmFtZUxlbiwKKwkJCSAgCQkJTEVOR1RIXzgwMl8zLCAgICAgCQkmSGVhZGVyODAyXzMsCisJCQkJCQlQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAmUGFja2V0LAorCQkJCQkJRU5EX09GX0FSR1MpOworCisKKwkvLyBDb3B5IGZyYW1lIHRvIFR4IHJpbmcgYW5kIFNlbmQgTWVzc2FnZSA0IHRvIGF1dGhlbnRpY2F0b3IKKwlSVE1QVG9XaXJlbGVzc1N0YShwQWQsIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMsIChQVUNIQVIpJlBhY2tldCwgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgVFJVRSk7CisKKwkvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAorCS8vcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwlTVEFfUE9SVF9TRUNVUkVEKHBBZCk7CisKKyAgICAvLyBJbmRpY2F0ZSBDb25uZWN0ZWQgZm9yIEdVSQorICAgIHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisKKwlNbG1lRnJlZU1lbW9yeShwQWQsIChQVUNIQVIpcE91dEJ1ZmZlcik7CisJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKworCisJLy8gc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciBzZXQga2V5IGRvbmUgV1BBMgorCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfU0VUX0tFWV9ET05FX1dQQTJfRVZFTlRfRkxBRywgcEVudHJ5LT5BZGRyLCBCU1MwLCAwKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIldwYTJQYWlyTXNnM0FjdGlvbiA8LS0tLS1cbiIpKTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJvY2VzcyBHcm91cCBrZXkgMi13YXkgaGFuZHNoYWtpbmcKKworCUFyZ3VtZW50czoKKwkJcEFkCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKwkJRWxlbQkJTWVzc2FnZSBib2R5CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lECVdwYUdyb3VwTXNnMUFjdGlvbigKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglNTE1FX1FVRVVFX0VMRU0JKkVsZW0pCisKK3sKKwlQVUNIQVIgICAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOworCVVDSEFSICAgICAgICAgICAgICAgSGVhZGVyODAyXzNbMTRdOworCVVMT05HICAgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOworCUVBUE9MX1BBQ0tFVCAgICAgICAgUGFja2V0OworCVBFQVBPTF9QQUNLRVQgICAgICAgcEdyb3VwOworCVVDSEFSICAgICAgICAgICAgICAgKm1wb29sLCAqZGlnZXN0LCAqS0VZREFUQTsKKwlVQ0hBUiAgICAgICAgICAgICAgIE1pY1sxNl0sIE9sZE1pY1sxNl07CisJVUNIQVIgICAgICAgICAgICAgICBHVEtbMzJdLCBLZXlbMzJdOworCUtFWV9JTkZPCQkJcGVlcktleUluZm87CisKKwkvLyBhbGxvY2F0ZSBtZW1vcnkKKwlvc19hbGxvY19tZW0ocEFkLCAoUFVDSEFSICopJm1wb29sLCAxMDI0KTsKKworCWlmKG1wb29sID09IE5VTEwpCisJCXJldHVybjsKKworCS8vIGRpZ2VzdCBMZW4gPSA4MC4KKwlkaWdlc3QgPSAoVUNIQVIgKikgUk9VTkRfVVAobXBvb2wsIDQpOworCS8vIEtFWURBVEEgTGVuID0gNTEyLgorCUtFWURBVEEgPSAoVUNIQVIgKikgUk9VTkRfVVAoZGlnZXN0ICsgODAsIDQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhR3JvdXBNc2cxQWN0aW9uIC0tLS0tPlxuIikpOworCisJLy8gUHJvY2VzcyBHcm91cCBNZXNzYWdlIDEgZnJhbWUuIHNraXAgODAyLjExIGhlYWRlcigyNCkgJiBMTENfU05BUCBoZWFkZXIoOCkKKwlwR3JvdXAgPSAoUEVBUE9MX1BBQ0tFVCkgJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0hdOworCisJTmRpc1plcm9NZW1vcnkoKFBVQ0hBUikmcGVlcktleUluZm8sIHNpemVvZihwZWVyS2V5SW5mbykpOworCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpJnBlZXJLZXlJbmZvLCAoUFVDSEFSKSZwR3JvdXAtPktleURlc2MuS2V5SW5mbywgc2l6ZW9mKEtFWV9JTkZPKSk7CisKKwkqKChVU0hPUlQqKSZwZWVyS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQqKSZwZWVyS2V5SW5mbykpOworCisJLy8gMC4gQ2hlY2sgY2lwaGVyIHR5cGUgbWF0Y2gKKwlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQgJiYgKHBlZXJLZXlJbmZvLktleURlc2NWZXIgIT0gMikpCisJeworCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOworCQlyZXR1cm47CisJfQorCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkICYmIChwZWVyS2V5SW5mby5LZXlEZXNjVmVyICE9IDEpKQorCXsKKwkJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKwkJcmV0dXJuOworCX0KKworCS8vIDEuIFZlcmlmeSBSZXBsYXkgY291bnRlcgorCS8vICAgIENoZWNrIFJlcGxheSBDb3VudGVyLCBpdCBoYXMgdG8gYmUgbGFyZ2VyIHRoYW4gbGFzdCBvbmUuIE5vIG5lZWQgdG8gYmUgZXhhY3Qgb25lIGxhcmdlcgorCWlmKFJUTVBDb21wYXJlTWVtb3J5KHBHcm91cC0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKSAhPSAxKQorCXsKKwkJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKKwkJcmV0dXJuOworCX0KKworCS8vIFVwZGF0ZSBuZXcgcmVwbGF5IGNvdW50ZXIKKwlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBwR3JvdXAtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwkvLyAyLiBWZXJpZnkgTUlDIGlzIHZhbGlkCisJLy8gU2F2ZSB0aGUgTUlDIGFuZCByZXBsYWNlIHdpdGggemVybworCU5kaXNNb3ZlTWVtb3J5KE9sZE1pYywgcEdyb3VwLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisJTmRpc1plcm9NZW1vcnkocEdyb3VwLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7CisKKwlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJewkvLyBBRVMKKwkJSE1BQ19TSEExKChQVUNIQVIpIHBHcm91cCwgcEdyb3VwLT5Cb2R5X0xlblsxXSArIDQsIHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworCQlOZGlzTW92ZU1lbW9yeShNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7CisJfQorCWVsc2UKKwl7CS8vIFRLSVAKKwkJaG1hY19tZDUocEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIChQVUNIQVIpIHBHcm91cCwgcEdyb3VwLT5Cb2R5X0xlblsxXSArIDQsIE1pYyk7CisJfQorCisJaWYoIU5kaXNFcXVhbE1lbW9yeShPbGRNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQykpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIgTUlDIERpZmZlcmVudCBpbiBncm91cCBtc2cgMSBvZiAyLXdheSBoYW5kc2hha2UhISEhISEhISEhIFxuIikpOworCQlNbG1lRnJlZU1lbW9yeShwQWQsIChQVUNIQVIpbXBvb2wpOworCQlyZXR1cm47CisJfQorCWVsc2UKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIE1JQyBWQUxJRCBpbiBncm91cCBtc2cgMSBvZiAyLXdheSBoYW5kc2hha2UhISEhISEhISEhIFxuIikpOworCisKKwkvLyAzLiBEZWNyeXB0IEdUSyBmcm9tIEtleSBEYXRhCisJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCXsKKwkJLy8gRGVjcnlwdCBBRVMgR1RLCisJCUFFU19HVEtfS0VZX1VOV1JBUCgmcEFkLT5TdGFDZmcuUFRLWzE2XSwgS0VZREFUQSwgIHBHcm91cC0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdLCBwR3JvdXAtPktleURlc2MuS2V5RGF0YSk7CisJfQorCWVsc2UJLy8gVEtJUAorCXsKKwkJSU5UIGk7CisKKwkJLy8gRGVjcnlwdCBUS0lQIEdUSworCQkvLyBDb25zdHJ1Y3QgMzIgYnl0ZXMgUkM0IEtleQorCQlOZGlzTW92ZU1lbW9yeShLZXksIHBHcm91cC0+S2V5RGVzYy5LZXlJdiwgMTYpOworCQlOZGlzTW92ZU1lbW9yeSgmS2V5WzE2XSwgJnBBZC0+U3RhQ2ZnLlBUS1sxNl0sIDE2KTsKKwkJQVJDRk9VUl9JTklUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIEtleSwgMzIpOworCQkvL2Rpc2NhcmQgZmlyc3QgMjU2IGJ5dGVzCisJCWZvcihpID0gMDsgaSA8IDI1NjsgaSsrKQorCQkJQVJDRk9VUl9CWVRFKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQpOworCQkvLyBEZWNyeXB0IEdUSy4gQmVjYXJlZnVsLCB0aGVyZSBpcyBubyBJQ1YgdG8gY2hlY2sgdGhlIHJlc3VsdCBpcyBjb3JyZWN0IG9yIG5vdAorCQlBUkNGT1VSX0RFQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgS0VZREFUQSwgcEdyb3VwLT5LZXlEZXNjLktleURhdGEsIHBHcm91cC0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdKTsKKwl9CisKKwkvLyBQcm9jZXNzIGRlY3J5cHRlZCBrZXkgZGF0YSBtYXRlcmlhbAorCS8vIFBhcnNlIGtleURhdGEgdG8gaGFuZGxlIEtERSBmb3JtYXQgZm9yIFdQQTJQU0sKKwlpZiAocGVlcktleUluZm8uRUtEX0RMKQorCXsKKwkJaWYgKCFQYXJzZUtleURhdGEocEFkLCBLRVlEQVRBLCBwR3JvdXAtPktleURlc2MuS2V5RGF0YUxlblsxXSwgMCkpCisJCXsKKwkJCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJZWxzZQkvLyBXUEFQU0sKKwl7CisJCS8vIHNldCBrZXkgbWF0ZXJpYWwsIFR4TWljIGFuZCBSeE1pYyBmb3IgV1BBUFNLCisJCU5kaXNNb3ZlTWVtb3J5KEdUSywgS0VZREFUQSwgMzIpOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5HVEssIEdUSywgMzIpOworCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSBwZWVyS2V5SW5mby5LZXlJbmRleDsKKworCQkvLyBQcmVwYXJlIHBhaXItd2lzZSBrZXkgaW5mb3JtYXRpb24gaW50byBzaGFyZWQga2V5IHRhYmxlCisJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbiA9IExFTl9US0lQX0VLOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwgR1RLLCBMRU5fVEtJUF9FSyk7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uUnhNaWMsICZHVEtbMTZdLCBMRU5fVEtJUF9SWE1JQ0spOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLCAmR1RLWzI0XSwgTEVOX1RLSVBfVFhNSUNLKTsKKworCQkvLyBVcGRhdGUgU2hhcmVkIEtleSBDaXBoZXJBbGcKKwkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9US0lQOworCQllbHNlIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworCQllbHNlIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQpCisJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZCkKKwkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKworICAgIAkvL2hleF9kdW1wKCJHcm91cCBLZXkgOiIsIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LCBMRU5fVEtJUF9FSyk7CisJfQorCisJLy8gVXBkYXRlIGdyb3VwIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKKwlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAorCQkJCQkJICBCU1MwLAorCQkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCisJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5UeE1pYywKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5SeE1pYyk7CisKKwkvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKwlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKwkJCQkJCQkgIEJTUzAsCisJCQkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCisJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZywKKwkJCQkJCQkgIE5VTEwpOworCisJLy8gc2V0IDgwMi4xeCBwb3J0IGNvbnRyb2wKKwkvL3BBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJU1RBX1BPUlRfU0VDVVJFRChwQWQpOworCisgICAgLy8gSW5kaWNhdGUgQ29ubmVjdGVkIGZvciBHVUkKKyAgICBwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworCisJLy8gaW5pdCBoZWFkZXIgYW5kIEZpbGwgUGFja2V0CisJTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7CisKKwkvLyBaZXJvIEdyb3VwIG1lc3NhZ2UgMSBib2R5CisJTmRpc1plcm9NZW1vcnkoJlBhY2tldCwgc2l6ZW9mKFBhY2tldCkpOworCVBhY2tldC5Qcm9WZXIJPSBFQVBPTF9WRVI7CisJUGFja2V0LlByb1R5cGUJPSBFQVBPTEtleTsKKwlQYWNrZXQuQm9keV9MZW5bMV0gID0gc2l6ZW9mKEtFWV9ERVNDUklQVEVSKSAtIE1BWF9MRU5fT0ZfUlNOSUU7CQkvLyBObyBkYXRhIGZpZWxkCisKKwkvLworCS8vIEdyb3VwIE1lc3NhZ2UgMiBhcyAgRUFQT0wtS2V5KDEsMCwwLDAsRywwLDAsTUlDLDApCisJLy8KKwlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykKKwl7CisJCVBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEEyX0tFWV9ERVNDOworCX0KKwllbHNlCisJeworCQlQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMV9LRVlfREVTQzsKKwl9CisKKwkvLyBLZXkgZGVzY3JpcHRvciB2ZXJzaW9uIGFuZCBhcHByb3ByaWF0ZSBSU04gSUUKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPSBwZWVyS2V5SW5mby5LZXlEZXNjVmVyOworCisJLy8gVXBkYXRlIEtleSBMZW5ndGgKKwlQYWNrZXQuS2V5RGVzYy5LZXlMZW5ndGhbMF0gPSBwR3JvdXAtPktleURlc2MuS2V5TGVuZ3RoWzBdOworCVBhY2tldC5LZXlEZXNjLktleUxlbmd0aFsxXSA9IHBHcm91cC0+S2V5RGVzYy5LZXlMZW5ndGhbMV07CisKKwkvLyBLZXkgSW5kZXggYXMgRy1Nc2cgMQorCWlmKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykKKwkJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlJbmRleCA9IHBlZXJLZXlJbmZvLktleUluZGV4OworCisJLy8gS2V5IFR5cGUgR3JvdXAga2V5CisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlUeXBlID0gR1JPVVBLRVk7CisKKwkvLyBLZXlNaWMgZmllbGQgcHJlc2VudGVkCisJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlNaWMgID0gMTsKKworCS8vIFNlY3VyZSBiaXQKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLlNlY3VyZSAgPSAxOworCisJLy8gQ29udmVydCB0byBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KKwkqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykpOworCisJLy8gS2V5IFJlcGxheSBjb3VudAorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBHcm91cC0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCS8vIE91dCBidWZmZXIgZm9yIHRyYW5zbWl0dGluZyBncm91cCBtZXNzYWdlIDIKKwlNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFVDSEFSICopJnBPdXRCdWZmZXIpOyAgLy8gYWxsb2NhdGUgbWVtb3J5CisJaWYocE91dEJ1ZmZlciA9PSBOVUxMKQorCXsKKwkJTWxtZUZyZWVNZW1vcnkocEFkLCAoUFVDSEFSKW1wb29sKTsKKwkJcmV0dXJuOworCX0KKworCS8vIFByZXBhcmUgRUFQT0wgZnJhbWUgZm9yIE1JQyBjYWxjdWxhdGlvbgorCS8vIEJlIGNhcmVmdWwsIG9ubHkgRUFQT0wgZnJhbWUgaXMgY291bnRlZCBmb3IgTUlDIGNhbGN1bGF0aW9uCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKKwkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgICAgJlBhY2tldCwKKwkJRU5EX09GX0FSR1MpOworCisJLy8gUHJlcGFyZSBhbmQgRmlsbCBNSUMgdmFsdWUKKwlOZGlzWmVyb01lbW9yeShNaWMsIHNpemVvZihNaWMpKTsKKwlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJeworCQkvLyBBRVMKKwkJSE1BQ19TSEExKHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJTmRpc01vdmVNZW1vcnkoTWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKwllbHNlCisJeworCQlobWFjX21kNShwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIE1pYyk7CisJfQorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKworCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgCQkmRnJhbWVMZW4sCisJCQkJCQlMRU5HVEhfODAyXzMsICAgICAJCSZIZWFkZXI4MDJfMywKKwkJCQkJCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICZQYWNrZXQsCisJCQkJCQlFTkRfT0ZfQVJHUyk7CisKKworCS8vIDUuIENvcHkgZnJhbWUgdG8gVHggcmluZyBhbmQgcHJlcGFyZSBmb3IgZW5jcnlwdGlvbgorCVJUTVBUb1dpcmVsZXNzU3RhKHBBZCwgSGVhZGVyODAyXzMsIExFTkdUSF84MDJfMywgKFBVQ0hBUikmUGFja2V0LCBQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCBGQUxTRSk7CisKKwkvLyA2IEZyZWUgYWxsb2NhdGVkIG1lbW9yeQorCU1sbWVGcmVlTWVtb3J5KHBBZCwgKFBVQ0hBUilwT3V0QnVmZmVyKTsKKwlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOworCisJLy8gc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciBzZXQga2V5IGRvbmUgV1BBMgorCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfU0VUX0tFWV9ET05FX1dQQTJfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYUdyb3VwTXNnMUFjdGlvbiA8LS0tLS1cbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUluaXQgV1BBIE1BQyBoZWFkZXIKKworCUFyZ3VtZW50czoKKwkJcEFkCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQJV3BhTWFjSGVhZGVySW5pdCgKKwlJTgkJUFJUTVBfQURBUFRFUglwQWQsCisJSU4gT1VUCVBIRUFERVJfODAyXzExCXBIZHI4MDIxMSwKKwlJTgkJVUNIQVIJCQl3ZXAsCisJSU4JCVBVQ0hBUgkJICAgIHBBZGRyMSkKK3sKKwlOZGlzWmVyb01lbW9yeShwSGRyODAyMTEsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJcEhkcjgwMjExLT5GQy5UeXBlCT0gQlRZUEVfREFUQTsKKwlwSGRyODAyMTEtPkZDLlRvRHMJPSAxOworCWlmICh3ZXAJPT0gMSkKKwkJcEhkcjgwMjExLT5GQy5XZXAgPSAxOworCisJIC8vCUFkZHIxOiBCU1NJRCwgQWRkcjI6IFNBLCBBZGRyMzoJREEKKwlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjEsIHBBZGRyMSk7CisJQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKwlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwlwSGRyODAyMTEtPlNlcXVlbmNlID0JcEFkLT5TZXF1ZW5jZTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNvcHkgZnJhbWUgZnJvbSB3YWl0aW5nIHF1ZXVlIGludG8gcmVsYXRpdmUgcmluZyBidWZmZXIgYW5kIHNldAorCWFwcHJvcHJpYXRlIEFTSUMgcmVnaXN0ZXIgdG8ga2ljayBoYXJkd2FyZSBlbmNyeXB0aW9uIGJlZm9yZSByZWFsbHkKKwlzZW50IG91dCB0byBhaXIuCisKKwlBcmd1bWVudHM6CisJCXBBZAkJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgorCQlQTkRJU19QQUNLRVQJUG9pbnRlciB0byBvdXRnb2luZyBOZGlzIGZyYW1lCisJCU51bWJlck9mRnJhZwlOdW1iZXIgb2YgZnJhZ21lbnQgcmVxdWlyZWQKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgICAgUlRNUFRvV2lyZWxlc3NTdGEoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwSGVhZGVyODAyXzMsCisgICAgSU4gIFVJTlQgICAgICAgICAgICBIZHJMZW4sCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRGF0YSwKKyAgICBJTiAgVUlOVCAgICAgICAgICAgIERhdGFMZW4sCisgICAgSU4JQk9PTEVBTgkJCWlzNHdheUZyYW1lKQorCit7CisJTkRJU19TVEFUVVMgICAgIFN0YXR1czsKKwlQTkRJU19QQUNLRVQgICAgcFBhY2tldDsKKwlVQ0hBUiAgIEluZGV4OworCisJZG8KKwl7CisJCS8vIDEuIGJ1aWxkIGEgTkRJUyBwYWNrZXQgYW5kIGNhbGwgUlRNUFNlbmRQYWNrZXQoKTsKKwkJLy8gICAgYmUgY2FyZWZ1bCBhYm91dCBob3cvd2hlbiB0byByZWxlYXNlIHRoaXMgaW50ZXJuYWwgYWxsb2NhdGVkIE5ESVMgUEFDS0VUIGJ1ZmZlcgorCQlTdGF0dXMgPSBSVE1QQWxsb2NhdGVOZGlzUGFja2V0KHBBZCwgJnBQYWNrZXQsIHBIZWFkZXI4MDJfMywgSGRyTGVuLCBwRGF0YSwgRGF0YUxlbik7CisJCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCWJyZWFrOworCisJCWlmIChpczR3YXlGcmFtZSkKKwkJCVJUTVBfU0VUX1BBQ0tFVF9DTEVBUl9FQVBfRlJBTUUocFBhY2tldCwgMSk7CisJCWVsc2UKKwkJCVJUTVBfU0VUX1BBQ0tFVF9DTEVBUl9FQVBfRlJBTUUocFBhY2tldCwgMCk7CisKKwkJLy8gMi4gc2VuZCBvdXQgdGhlIHBhY2tldAorCQlTdGF0dXMgPSBTVEFTZW5kUGFja2V0KHBBZCwgcFBhY2tldCk7CisJCWlmKFN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCQl7CisJCQkvLyBEZXF1ZXVlIG9uZSBmcmFtZSBmcm9tIFR4U3dRdWV1ZTAuLjMgcXVldWUgYW5kIHByb2Nlc3MgaXQKKwkJCS8vIFRoZXJlIGFyZSB0aHJlZSBwbGFjZSBjYWxsaW5nIGRlcXVldWUgZm9yIFRYIHJpbmcuCisJCQkvLyAxLiBIZXJlLCByaWdodCBhZnRlciBxdWV1ZWluZyB0aGUgZnJhbWUuCisJCQkvLyAyLiBBdCB0aGUgZW5kIG9mIFR4UmluZ1R4RG9uZSBzZXJ2aWNlIHJvdXRpbmUuCisJCQkvLyAzLiBVcG9uIE5ESVMgY2FsbCBSVE1QU2VuZFBhY2tldHMKKwkJCWlmKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgJiYKKwkJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpKQorCQkJeworCQkJCWZvcihJbmRleCA9IDA7IEluZGV4IDwgNTsgSW5kZXggKyspCisJCQkJCWlmKHBBZC0+VHhTd1F1ZXVlW0luZGV4XS5OdW1iZXIgPiAwKQorCQkJCQkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgSW5kZXgsIE1BWF9UWF9QUk9DRVNTKTsKKwkJCX0KKwkJfQorCX0gd2hpbGUoRkFMU0UpOworCit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIENoZWNrIFNhbml0eSBSU04gSUUgZm9ybSBBUAorCisgICAgQXJndW1lbnRzOgorCisgICAgUmV0dXJuIFZhbHVlOgorCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOIENoZWNrUlNOSUUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwRGF0YSwKKwlJTiAgVUNIQVIgICAgICAgICAgIERhdGFMZW4sCisJT1VUCVVDSEFSCQkJKk9mZnNldCkKK3sKKwlQVUNIQVIgICAgICAgICAgICAgIHBWSUU7CisJVUNIQVIgICAgICAgICAgICAgICBsZW47CisJUEVJRF9TVFJVQ1QgICAgICAgICBwRWlkOworCUJPT0xFQU4JCQkJcmVzdWx0ID0gRkFMU0U7CisKKwlwVklFID0gcERhdGE7CisJbGVuCSA9IERhdGFMZW47CisJKk9mZnNldCA9IDA7CisKKwl3aGlsZSAobGVuID4gc2l6ZW9mKFJTTklFMikpCisJeworCQlwRWlkID0gKFBFSURfU1RSVUNUKSBwVklFOworCQkvLyBXUEEgUlNOIElFCisJCWlmICgocEVpZC0+RWlkID09IElFX1dQQSkgJiYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV1BBX09VSSwgNCkpKQorCQl7CisJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSB8fCBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spICYmCisJCQkJKE5kaXNFcXVhbE1lbW9yeShwVklFLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4pKSAmJgorCQkJCShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbiA9PSAocEVpZC0+TGVuICsgMikpKQorCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGVja1JTTklFID09PiBXUEEvV1BBUFNLIFJTTiBJRSBtYXRjaGVkIGluIE1zZyAzLCBMZW5ndGgoJWQpIFxuIiwgKHBFaWQtPkxlbiArIDIpKSk7CisJCQkJCXJlc3VsdCA9IFRSVUU7CisJCQl9CisKKwkJCSpPZmZzZXQgKz0gKHBFaWQtPkxlbiArIDIpOworCQl9CisJCS8vIFdQQTIgUlNOIElFCisJCWVsc2UgaWYgKChwRWlkLT5FaWQgPT0gSUVfUlNOKSAmJiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0ICsgMiwgUlNOX09VSSwgMykpKQorCQl7CisJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIgfHwgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgJiYKKwkJCQkoTmRpc0VxdWFsTWVtb3J5KHBWSUUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOX0lFLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbikpICYmCisJCQkJKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuID09IChwRWlkLT5MZW4gKyAyKSkpCisJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNoZWNrUlNOSUUgPT0+IFdQQTIvV1BBMlBTSyBSU04gSUUgbWF0Y2hlZCBpbiBNc2cgMywgTGVuZ3RoKCVkKSBcbiIsIChwRWlkLT5MZW4gKyAyKSkpOworCQkJCQlyZXN1bHQgPSBUUlVFOworCQkJfQorCisJCQkqT2Zmc2V0ICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWJyZWFrOworCQl9CisKKwkJcFZJRSArPSAocEVpZC0+TGVuICsgMik7CisJCWxlbiAgLT0gKHBFaWQtPkxlbiArIDIpOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNoZWNrUlNOSUUgPT0+IHNraXBfb2Zmc2V0KCVkKSBcbiIsICpPZmZzZXQpKTsKKworCXJldHVybiByZXN1bHQ7CisKK30KKworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBQYXJzZSBLRVlEQVRBIGZpZWxkLiAgS0VZREFUQVtdIE1heSBjb250YWluIDIgUlNOIElFIGFuZCBvcHRpb25hbGx5IEdUSy4KKyAgICBHVEsgIGlzIGVuY2FwdHVsYXRlZCBpbiBLREUgZm9ybWF0IGF0ICBwLjgzIDgwMi4xMWkgRDEwCisKKyAgICBBcmd1bWVudHM6CisKKyAgICBSZXR1cm4gVmFsdWU6CisKKyAgICBOb3RlOgorICAgICAgICA4MDIuMTFpIEQxMAorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBQYXJzZUtleURhdGEoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gIFBVQ0hBUiAgICAgICAgICBwS2V5RGF0YSwKKwlJTiAgVUNIQVIgICAgICAgICAgIEtleURhdGFMZW4sCisJSU4JVUNIQVIJCQliUGFpcmV3aXNlKQoreworICAgIFBLREVfRU5DQVAgICAgICAgICAgcEtERSA9IE5VTEw7CisgICAgUFVDSEFSICAgICAgICAgICAgICBwTXlLZXlEYXRhID0gcEtleURhdGE7CisgICAgVUNIQVIgICAgICAgICAgICAgICBLZXlEYXRhTGVuZ3RoID0gS2V5RGF0YUxlbjsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIEdUS0xFTjsKKwlVQ0hBUgkJCQlza2lwX29mZnNldDsKKworCS8vIFZlcmlmeSBUaGUgUlNOIElFIGNvbnRhaW5lZCBpbiBQYWlyZXdpc2UtTXNnIDMgYW5kIHNraXAgaXQKKwlpZiAoYlBhaXJld2lzZSkKKyAgICB7CisJCS8vIENoZWNrIFJTTiBJRSB3aGV0aGVyIGl0IGlzIFdQQTIvV1BBMlBTSworCQlpZiAoIUNoZWNrUlNOSUUocEFkLCBwS2V5RGF0YSwgS2V5RGF0YUxlbiwgJnNraXBfb2Zmc2V0KSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUGFyc2VLZXlEYXRhID09PiBXUEEyL1dQQTJQU0sgUlNOIElFIG1pc21hdGNoZWQgXG4iKSk7CisJCQloZXhfZHVtcCgiR2V0IEtFWURBVEEgOiIsIHBLZXlEYXRhLCBLZXlEYXRhTGVuKTsKKwkJCXJldHVybiBGQUxTRTsKKyAgICAJfQorICAgIAllbHNlCisJCXsKKwkJCS8vIHNraXAgUlNOIElFCisJCQlwTXlLZXlEYXRhICs9IHNraXBfb2Zmc2V0OworCQkJS2V5RGF0YUxlbmd0aCAtPSBza2lwX29mZnNldDsKKworCQkJLy9EQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQYXJzZUtleURhdGEgPT0+IFdQQTIvV1BBMlBTSyBSU04gSUUgbWF0Y2hlZCBpbiBNc2cgMywgTGVuZ3RoKCVkKSBcbiIsIHNraXBfb2Zmc2V0KSk7CisJCX0KKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlBhcnNlS2V5RGF0YSA9PT4gS2V5RGF0YUxlbmd0aCAlZCB3aXRob3V0IFJTTl9JRSBcbiIsIEtleURhdGFMZW5ndGgpKTsKKworCS8vIFBhcnNlIEVLRCBmb3JtYXQKKwlpZiAoS2V5RGF0YUxlbmd0aCA+PSA4KQorICAgIHsKKyAgICAgICAgcEtERSA9IChQS0RFX0VOQ0FQKSBwTXlLZXlEYXRhOworICAgIH0KKwllbHNlCisgICAgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUjogS2V5RGF0YUxlbmd0aCBpcyB0b28gc2hvcnQgXG4iKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKworCS8vIFNhbml0eSBjaGVjayAtIHNoYXJlZCBrZXkgaW5kZXggc2hvdWxkIG5vdCBiZSAwCisJaWYgKHBLREUtPkdUS0VuY2FwLktpZCA9PSAwKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1I6IEdUSyBLZXkgaW5kZXggemVybyBcbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworCS8vIFNhbml0eSBjaGVjayAtIEtFRCBsZW5ndGgKKwlpZiAoS2V5RGF0YUxlbmd0aCA8IChwS0RFLT5MZW4gKyAyKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVSUk9SOiBUaGUgbGVuIGZyb20gS0RFIGlzIHRvbyBzaG9ydCBcbiIpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworCS8vIEdldCBHVEsgbGVuZ3RoIC0gcmVmZXIgdG8gSUVFRSA4MDIuMTFpLTIwMDQgcC44MgorCUdUS0xFTiA9IHBLREUtPkxlbiAtNjsKKworCWlmIChHVEtMRU4gPCBNSU5fTEVOX09GX0dUSykKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVSUk9SOiBHVEsgS2V5IGxlbmd0aCBpcyB0b28gc2hvcnQgKCVkKSBcbiIsIEdUS0xFTikpOworICAgICAgICByZXR1cm4gRkFMU0U7CisJfQorCWVsc2UKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiR1RLIEtleSB3aXRoIEtERSBmb3JtZXQgZ290IGluZGV4PSVkLCBsZW49JWQgXG4iLCBwS0RFLT5HVEtFbmNhcC5LaWQsIEdUS0xFTikpOworCisJLy8gVXBkYXRlIEdUSworCS8vIHNldCBrZXkgbWF0ZXJpYWwsIFR4TWljIGFuZCBSeE1pYyBmb3IgV1BBUFNLCisJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuR1RLLCBwS0RFLT5HVEtFbmNhcC5HVEssIDMyKTsKKwlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSBwS0RFLT5HVEtFbmNhcC5LaWQ7CisKKwkvLyBVcGRhdGUgc2hhcmVkIGtleSB0YWJsZQorCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7CisJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksIHBLREUtPkdUS0VuY2FwLkdUSywgTEVOX1RLSVBfRUspOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uUnhNaWMsICZwS0RFLT5HVEtFbmNhcC5HVEtbMTZdLCBMRU5fVEtJUF9SWE1JQ0spOworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uVHhNaWMsICZwS0RFLT5HVEtFbmNhcC5HVEtbMjRdLCBMRU5fVEtJUF9UWE1JQ0spOworCisJLy8gVXBkYXRlIFNoYXJlZCBLZXkgQ2lwaGVyQWxnCisJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwlpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKwllbHNlIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7CisJZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUdyb3VwV0VQNDBFbmFibGVkKQorCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwllbHNlIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkKQorCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisKKwlyZXR1cm4gVFJVRTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ2lzY28gQ0NLTSBQUkYgZnVuY3Rpb24KKworCUFyZ3VtZW50czoKKwkJa2V5CQkJCUNpc2NvIEJhc2UgVHJhbnNpZW50IEtleSAoQlRLKQorCQlrZXlfbGVuCQkJVGhlIGtleSBsZW5ndGggb2YgdGhlIEJUSworCQlkYXRhCQkJUnVxdWVzdCBOdW1iZXIoUk4pICsgQlNTSUQKKwkJZGF0YV9sZW4JCVRoZSBsZW5ndGggb2YgdGhlIGRhdGEKKwkJb3V0cHV0CQkJU3RvcmUgZm9yIFBUSyhQYWlyd2lzZSB0cmFuc2llbnQga2V5cykKKwkJbGVuCQkJCVRoZSBsZW5ndGggb2YgdGhlIG91dHB1dAorCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKwkJODAyLjFpCUFubmV4IEYuOQorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBDQ0tNUFJGKAorCUlOCVVDSEFSCSprZXksCisJSU4JSU5UCQlrZXlfbGVuLAorCUlOCVVDSEFSCSpkYXRhLAorCUlOCUlOVAkJZGF0YV9sZW4sCisJT1VUCVVDSEFSCSpvdXRwdXQsCisJSU4JSU5UCQlsZW4pCit7CisJSU5UCQlpOworCVVDSEFSCWlucHV0WzEwMjRdOworCUlOVAkJY3VycmVudGluZGV4ID0gMDsKKwlJTlQJCXRvdGFsX2xlbjsKKworCU5kaXNNb3ZlTWVtb3J5KGlucHV0LCBkYXRhLCBkYXRhX2xlbik7CisJdG90YWxfbGVuID0gZGF0YV9sZW47CisJaW5wdXRbdG90YWxfbGVuXSA9IDA7CisJdG90YWxfbGVuKys7CisJZm9yCShpID0gMDsJaSA8CShsZW4gKyAxOSkgLyAyMDsgaSsrKQorCXsKKwkJSE1BQ19TSEExKGlucHV0LCB0b3RhbF9sZW4sCWtleSwga2V5X2xlbiwgJm91dHB1dFtjdXJyZW50aW5kZXhdKTsKKwkJY3VycmVudGluZGV4ICs9CTIwOworCQlpbnB1dFt0b3RhbF9sZW4gLSAxXSsrOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVByb2Nlc3MgTUlDIGVycm9yIGluZGljYXRpb24gYW5kIHJlY29yZCBNSUMgZXJyb3IgdGltZXIuCisKKwlBcmd1bWVudHM6CisJCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwV3BhS2V5IAkJUG9pbnRlciB0byB0aGUgV1BBIGtleSBzdHJ1Y3R1cmUKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRAlSVE1QUmVwb3J0TWljRXJyb3IoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUENJUEhFUl9LRVkgCXBXcGFLZXkpCit7CisJVUxPTkcJTm93OworICAgIFVDSEFSICAgdW5pY2FzdEtleSA9IChwV3BhS2V5LT5UeXBlID09IFBBSVJXSVNFX0tFWSA/IDE6MCk7CisKKwkvLyBSZWNvcmQgTGFzdCBNSUMgZXJyb3IgdGltZSBhbmQgY291bnQKKwlOb3cgPSBqaWZmaWVzOworCWlmIChwQWQtPlN0YUNmZy5NaWNFcnJDbnQgPT0gMCkKKwl7CisJCXBBZC0+U3RhQ2ZnLk1pY0VyckNudCsrOworCQlwQWQtPlN0YUNmZy5MYXN0TWljRXJyb3JUaW1lID0gTm93OworICAgICAgICBOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCA4KTsKKwl9CisJZWxzZSBpZiAocEFkLT5TdGFDZmcuTWljRXJyQ250ID09IDEpCisJeworCQlpZiAoKHBBZC0+U3RhQ2ZnLkxhc3RNaWNFcnJvclRpbWUgKyAoNjAgKiBPU19IWikpIDwgTm93KQorCQl7CisJCQkvLyBVcGRhdGUgTGFzdCBNSUMgZXJyb3IgdGltZSwgdGhpcyBkaWQgbm90IHZpb2xhdGUgdHdvIE1JQyBlcnJvcnMgd2l0aGluIDYwIHNlY29uZHMKKwkJCXBBZC0+U3RhQ2ZnLkxhc3RNaWNFcnJvclRpbWUgPSBOb3c7CisJCX0KKwkJZWxzZQorCQl7CisKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19DT1VOVEVSX01FQVNVUkVTX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisKKwkJCXBBZC0+U3RhQ2ZnLkxhc3RNaWNFcnJvclRpbWUgPSBOb3c7CisJCQkvLyBWaW9sYXRlIE1JQyBlcnJvciBjb3VudHMsIE1JQyBjb3VudGVybWVhc3VyZXMga2lja3MgaW4KKwkJCXBBZC0+U3RhQ2ZnLk1pY0VyckNudCsrOworCQkJLy8gV2Ugc2hhbGwgYmxvY2sgYWxsIHJlY2VwdGlvbgorCQkJLy8gV2Ugc2hhbGwgY2xlYW4gYWxsIFR4IHJpbmcgYW5kIGRpc2Fzc29pY2F0ZSBmcm9tIEFQIGFmdGVyIG5leHQgRUFQT0wgZnJhbWUKKwkJCS8vCisJCQkvLyBObyBuZWNlc3NhcnkgdG8gY2xlYW4gYWxsIFR4IHJpbmcsIG9uIFJUTVBIYXJkVHJhbnNtaXQgd2lsbCBzdG9wIHNlbmRpbmcgbm9uLTgwMi4xWCBFQVBPTCBwYWNrZXRzCisJCQkvLyBpZiBwQWQtPlN0YUNmZy5NaWNFcnJDbnQgZ3JlYXRlciB0aGFuIDIuCisJCQkvLworCQkJLy8gUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX0JLKTsKKwkJCS8vIFJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19CRSk7CisJCQkvLyBSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVkkpOworCQkJLy8gUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZPKTsKKwkJCS8vIFJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9IQ0NBKTsKKwkJfQorCX0KKwllbHNlCisJeworCQkvLyBNSUMgZXJyb3IgY291bnQgPj0gMgorCQkvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuCisJCTsKKwl9CisgICAgTWxtZUVucXVldWUocEFkLAorCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJCU9JRF84MDJfMTFfTUlDX0ZBSUxVUkVfUkVQT1JUX0ZSQU1FLAorCQkJCTEsCisJCQkJJnVuaWNhc3RLZXkpOworCisgICAgaWYgKHBBZC0+U3RhQ2ZnLk1pY0VyckNudCA9PSAyKQorICAgIHsKKyAgICAgICAgUlRNUFNldFRpbWVyKCZwQWQtPlN0YUNmZy5XcGFEaXNhc3NvY0FuZEJsb2NrQXNzb2NUaW1lciwgMTAwKTsKKyAgICB9Cit9CisKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyNkZWZpbmUJTEVOR1RIX0VBUF9IICAgIDQKKy8vIElmIHRoZSByZWNlaXZlZCBmcmFtZSBpcyBFQVAtUGFja2V0ICxmaW5kIG91dCBpdHMgRUFQLUNvZGUgKFJlcXVlc3QoMHgwMSksIFJlc3BvbnNlKDB4MDIpLCBTdWNjZXNzKDB4MDMpLCBGYWlsdXJlKDB4MDQpKS4KK0lOVAkgICAgV3BhQ2hlY2tFYXBDb2RlKAorCUlOICBQUlRNUF9BREFQVEVSICAgCQlwQWQsCisJSU4gIFBVQ0hBUgkJCQlwRnJhbWUsCisJSU4gIFVTSE9SVAkJCQlGcmFtZUxlbiwKKwlJTiAgVVNIT1JUCQkJCU9mZlNldCkKK3sKKworCVBVQ0hBUglwRGF0YTsKKwlJTlQJcmVzdWx0ID0gMDsKKworCWlmKCBGcmFtZUxlbiA8IE9mZlNldCArIExFTkdUSF9FQVBPTF9IICsgTEVOR1RIX0VBUF9IICkKKwkJcmV0dXJuIHJlc3VsdDsKKworCXBEYXRhID0gcEZyYW1lICsgT2ZmU2V0OyAvLyBza2lwIG9mZnNldCBieXRlcworCisJaWYoKihwRGF0YSsxKSA9PSBFQVBQYWNrZXQpIAkvLyA4MDIuMXggaGVhZGVyIC0gUGFja2V0IFR5cGUKKwl7CisJCSByZXN1bHQgPSAqKHBEYXRhKzQpOwkJLy8gRUFQIGhlYWRlciAtIENvZGUKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitWT0lEICAgIFdwYVNlbmRNaWNGYWlsdXJlVG9XcGFTdXBwbGljYW50KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgIHBBZCwKKyAgICBJTiAgQk9PTEVBTiAgICAgICAgICBiVW5pY2FzdCkKK3sKKyAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7CisgICAgY2hhciBjdXN0b21bSVdfQ1VTVE9NX01BWF0gPSB7MH07CisKKyAgICBzcHJpbnRmKGN1c3RvbSwgIk1MTUUtTUlDSEFFTE1JQ0ZBSUxVUkUuaW5kaWNhdGlvbiIpOworICAgIGlmIChiVW5pY2FzdCkKKyAgICAgICAgc3ByaW50ZihjdXN0b20sICIlcyB1bmljYXN0IiwgY3VzdG9tKTsKKyAgICB3cnF1LmRhdGEubGVuZ3RoID0gc3RybGVuKGN1c3RvbSk7CisgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBjdXN0b20pOworCisgICAgcmV0dXJuOworfQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworVk9JRAlXcGFNaWNGYWlsdXJlUmVwb3J0RnJhbWUoCisJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisJSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQoreworCVBVQ0hBUiAgICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7CisJVUNIQVIgICAgICAgICAgICAgICBIZWFkZXI4MDJfM1sxNF07CisJVUxPTkcgICAgICAgICAgICAgICBGcmFtZUxlbiA9IDA7CisJRUFQT0xfUEFDS0VUICAgICAgICBQYWNrZXQ7CisJVUNIQVIgICAgICAgICAgICAgICBNaWNbMTZdOworICAgIEJPT0xFQU4gICAgICAgICAgICAgYlVuaWNhc3Q7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGFNaWNGYWlsdXJlUmVwb3J0RnJhbWUgLS0tLS0+XG4iKSk7CisKKyAgICBiVW5pY2FzdCA9IChFbGVtLT5Nc2dbMF0gPT0gMSA/IFRSVUU6RkFMU0UpOworCXBBZC0+U2VxdWVuY2UgPSAoKHBBZC0+U2VxdWVuY2UpICsgMSkgJiAoTUFYX1NFUV9OVU1CRVIpOworCisJLy8gaW5pdCA4MDIuMyBoZWFkZXIgYW5kIEZpbGwgUGFja2V0CisJTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7CisKKwlOZGlzWmVyb01lbW9yeSgmUGFja2V0LCBzaXplb2YoUGFja2V0KSk7CisJUGFja2V0LlByb1Zlcgk9IEVBUE9MX1ZFUjsKKwlQYWNrZXQuUHJvVHlwZQk9IEVBUE9MS2V5OworCisJUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTFfS0VZX0RFU0M7CisKKyAgICAvLyBSZXF1ZXN0IGZpZWxkIHByZXNlbnRlZAorICAgIFBhY2tldC5LZXlEZXNjLktleUluZm8uUmVxdWVzdCA9IDE7CisKKwlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJeworCQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPSAyOworCX0KKwllbHNlCSAgLy8gVEtJUAorCXsKKwkJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gMTsKKwl9CisKKyAgICBQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleVR5cGUgPSAoYlVuaWNhc3QgPyBQQUlSV0lTRUtFWSA6IEdST1VQS0VZKTsKKworCS8vIEtleU1pYyBmaWVsZCBwcmVzZW50ZWQKKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleU1pYyAgPSAxOworCisgICAgLy8gRXJyb3IgZmllbGQgcHJlc2VudGVkCisJUGFja2V0LktleURlc2MuS2V5SW5mby5FcnJvciAgPSAxOworCisJLy8gVXBkYXRlIHBhY2tldCBsZW5ndGggYWZ0ZXIgZGVjaWRlIEtleSBkYXRhIHBheWxvYWQKKwlQYWNrZXQuQm9keV9MZW5bMV0gID0gc2l6ZW9mKEtFWV9ERVNDUklQVEVSKSAtIE1BWF9MRU5fT0ZfUlNOSUU7CisKKwkvLyBLZXkgUmVwbGF5IENvdW50CisJTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuUmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisgICAgaW5jX2J5dGVfYXJyYXkocEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgOCk7CisKKwkvLyBDb252ZXJ0IHRvIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgorCSooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSk7CisKKworCU1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVUNIQVIgKikmcE91dEJ1ZmZlcik7ICAvLyBhbGxvY2F0ZSBtZW1vcnkKKwlpZihwT3V0QnVmZmVyID09IE5VTEwpCisJeworCQlyZXR1cm47CisJfQorCisJLy8gUHJlcGFyZSBFQVBPTCBmcmFtZSBmb3IgTUlDIGNhbGN1bGF0aW9uCisJLy8gQmUgY2FyZWZ1bCwgb25seSBFQVBPTCBmcmFtZSBpcyBjb3VudGVkIGZvciBNSUMgY2FsY3VsYXRpb24KKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKKwkJICAgICAgICAgICAgICBQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAgICZQYWNrZXQsCisJCSAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworCisJLy8gUHJlcGFyZSBhbmQgRmlsbCBNSUMgdmFsdWUKKwlOZGlzWmVyb01lbW9yeShNaWMsIHNpemVvZihNaWMpKTsKKwlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJewkvLyBBRVMKKyAgICAgICAgVUNIQVIgZGlnZXN0WzIwXSA9IHswfTsKKwkJSE1BQ19TSEExKHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKKwkJTmRpc01vdmVNZW1vcnkoTWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCX0KKwllbHNlCisJewkvLyBUS0lQCisJCWhtYWNfbWQ1KHBBZC0+U3RhQ2ZnLlBUSywgIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIE1pYyk7CisJfQorCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKworICAgIE1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAJJkZyYW1lTGVuLAorICAgIAkgIAkJCUxFTkdUSF84MDJfMywgICAgIAkJCSZIZWFkZXI4MDJfMywKKyAgICAJCQkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgICAgICZQYWNrZXQsCisgICAgCQkJCUVORF9PRl9BUkdTKTsKKworCS8vIG9weSBmcmFtZSB0byBUeCByaW5nIGFuZCBzZW5kIE1JQyBmYWlsdXJlIHJlcG9ydCBmcmFtZSB0byBhdXRoZW50aWNhdG9yCisJUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zLCAoUFVDSEFSKSZQYWNrZXQsIFBhY2tldC5Cb2R5X0xlblsxXSArIDQsIEZBTFNFKTsKKworCU1sbWVGcmVlTWVtb3J5KHBBZCwgKFBVQ0hBUilwT3V0QnVmZmVyKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYU1pY0ZhaWx1cmVSZXBvcnRGcmFtZSA8LS0tLS1cbiIpKTsKK30KKworLyoqIGZyb20gd3BhX3N1cHBsaWNhbnQKKyAqIGluY19ieXRlX2FycmF5IC0gSW5jcmVtZW50IGFyYml0cmFyeSBsZW5ndGggYnl0ZSBhcnJheSBieSBvbmUKKyAqIEBjb3VudGVyOiBQb2ludGVyIHRvIGJ5dGUgYXJyYXkKKyAqIEBsZW46IExlbmd0aCBvZiB0aGUgY291bnRlciBpbiBieXRlcworICoKKyAqIFRoaXMgZnVuY3Rpb24gaW5jcmVtZW50cyB0aGUgbGFzdCBieXRlIG9mIHRoZSBjb3VudGVyIGJ5IG9uZSBhbmQgY29udGludWVzCisgKiByb2xsaW5nIG92ZXIgdG8gbW9yZSBzaWduaWZpY2FudCBieXRlcyBpZiB0aGUgYnl0ZSB3YXMgaW5jcmVtZW50ZWQgZnJvbQorICogMHhmZiB0byAweDAwLgorICovCit2b2lkIGluY19ieXRlX2FycmF5KFVDSEFSICpjb3VudGVyLCBpbnQgbGVuKQoreworCWludCBwb3MgPSBsZW4gLSAxOworCXdoaWxlIChwb3MgPj0gMCkgeworCQljb3VudGVyW3Bvc10rKzsKKwkJaWYgKGNvdW50ZXJbcG9zXSAhPSAwKQorCQkJYnJlYWs7CisJCXBvcy0tOworCX0KK30KKworVk9JRCBXcGFEaXNhc3NvY0FwQW5kQmxvY2tBc3NvYygKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCisgICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAorICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKKyAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit7CisgICAgUlRNUF9BREFQVEVSICAgICAgICAgICAgICAgICpwQWQgPSAoUFJUTVBfQURBUFRFUilGdW5jdGlvbkNvbnRleHQ7CisgICAgTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUICAgIERpc2Fzc29jUmVxOworCisJLy8gZGlzYXNzb2MgZnJvbSBjdXJyZW50IEFQIGZpcnN0CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFJlcG9ydE1pY0Vycm9yIC0gZGlzYXNzb2NpYXRlIHdpdGggY3VycmVudCBBUCBhZnRlciBzZW5kaW5nIHNlY29uZCBjb250aW51b3VzIEVBUE9MIGZyYW1lXG4iKSk7CisJRGlzYXNzb2NQYXJtRmlsbChwQWQsICZEaXNhc3NvY1JlcSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIFJFQVNPTl9NSUNfRkFJTFVSRSk7CisJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsIHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpLCAmRGlzYXNzb2NSZXEpOworCisJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9ESVNBU1NPQzsKKwlwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyA9IFRSVUU7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhX2lvY3RsLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YV9pb2N0bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZjBmYWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YV9pb2N0bC5jCkBAIC0wLDAgKzEsNzA2OCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICBzdGFfaW9jdGwuYworCisgICAgQWJzdHJhY3Q6CisgICAgSU9DVEwgcmVsYXRlZCBzdWJyb3V0aW5lcworCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBSb3J5IENoZW4gICAwMS0wMy0yMDAzICAgIGNyZWF0ZWQKKwlSb3J5IENoZW4gICAwMi0xNC0yMDA1ICAgIG1vZGlmeSB0byBzdXBwb3J0IFJUNjEKKyovCisKKyNpbmNsdWRlCSJydF9jb25maWcuaCIKKworI2lmZGVmIERCRworZXh0ZXJuIFVMT05HICAgIFJURGVidWdMZXZlbDsKKyNlbmRpZgorCisjZGVmaW5lIE5SX1dFUF9LRVlTIAkJCQk0CisjZGVmaW5lIFdFUF9TTUFMTF9LRVlfTEVOIAkJCSg0MC84KQorI2RlZmluZSBXRVBfTEFSR0VfS0VZX0xFTiAJCQkoMTA0LzgpCisKKyNkZWZpbmUgR1JPVVBfS0VZX05PICAgICAgICAgICAgICAgIDQKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpCisjZGVmaW5lIElXRV9TVFJFQU1fQUREX0VWRU5UKF9BLCBfQiwgX0MsIF9ELCBfRSkJCWl3ZV9zdHJlYW1fYWRkX2V2ZW50KF9BLCBfQiwgX0MsIF9ELCBfRSkKKyNkZWZpbmUgSVdFX1NUUkVBTV9BRERfUE9JTlQoX0EsIF9CLCBfQywgX0QsIF9FKQkJaXdlX3N0cmVhbV9hZGRfcG9pbnQoX0EsIF9CLCBfQywgX0QsIF9FKQorI2RlZmluZSBJV0VfU1RSRUFNX0FERF9WQUxVRShfQSwgX0IsIF9DLCBfRCwgX0UsIF9GKQlpd2Vfc3RyZWFtX2FkZF92YWx1ZShfQSwgX0IsIF9DLCBfRCwgX0UsIF9GKQorI2Vsc2UKKyNkZWZpbmUgSVdFX1NUUkVBTV9BRERfRVZFTlQoX0EsIF9CLCBfQywgX0QsIF9FKQkJaXdlX3N0cmVhbV9hZGRfZXZlbnQoX0IsIF9DLCBfRCwgX0UpCisjZGVmaW5lIElXRV9TVFJFQU1fQUREX1BPSU5UKF9BLCBfQiwgX0MsIF9ELCBfRSkJCWl3ZV9zdHJlYW1fYWRkX3BvaW50KF9CLCBfQywgX0QsIF9FKQorI2RlZmluZSBJV0VfU1RSRUFNX0FERF9WQUxVRShfQSwgX0IsIF9DLCBfRCwgX0UsIF9GKQlpd2Vfc3RyZWFtX2FkZF92YWx1ZShfQiwgX0MsIF9ELCBfRSwgX0YpCisjZW5kaWYKKworZXh0ZXJuIFVDSEFSICAgIENpcGhlcldwYTJUZW1wbGF0ZVtdOworZXh0ZXJuIFVDSEFSICAgIENpcGhlcldwYVBza1RraXBbXTsKK2V4dGVybiBVQ0hBUiAgICBDaXBoZXJXcGFQc2tUa2lwTGVuOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JUX1ZFUlNJT05fSU5GT3sKKyAgICBVQ0hBUiAgICAgICBEcml2ZXJWZXJzaW9uVzsKKyAgICBVQ0hBUiAgICAgICBEcml2ZXJWZXJzaW9uWDsKKyAgICBVQ0hBUiAgICAgICBEcml2ZXJWZXJzaW9uWTsKKyAgICBVQ0hBUiAgICAgICBEcml2ZXJWZXJzaW9uWjsKKyAgICBVSU5UICAgICAgICBEcml2ZXJCdWlsZFllYXI7CisgICAgVUlOVCAgICAgICAgRHJpdmVyQnVpbGRNb250aDsKKyAgICBVSU5UICAgICAgICBEcml2ZXJCdWlsZERheTsKK30gUlRfVkVSU0lPTl9JTkZPLCAqUFJUX1ZFUlNJT05fSU5GTzsKKworc3RydWN0IGl3X3ByaXZfYXJncyBwcml2dGFiW10gPSB7Cit7IFJUUFJJVl9JT0NUTF9TRVQsCisgIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgMCwKKyAgInNldCJ9LAorCit7IFJUUFJJVl9JT0NUTF9TSE9XLCAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLAorICAiIn0sCit7IFJUUFJJVl9JT0NUTF9TSE9XLCBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssCisgICIifSwKKy8qIC0tLSBzdWItaW9jdGxzIGRlZmluaXRpb25zIC0tLSAqLworICAgIHsgU0hPV19DT05OX1NUQVRVUywKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJjb25uU3RhdHVzIiB9LAorCXsgU0hPV19EUlZJRVJfVkVSSU9OLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImRyaXZlclZlciIgfSwKKyAgICB7IFNIT1dfQkFfSU5GTywKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJiYWluZm8iIH0sCisJeyBTSE9XX0RFU0NfSU5GTywKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJkZXNjaW5mbyIgfSwKKyAgICB7IFJBSU9fT0ZGLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgInJhZGlvX29mZiIgfSwKKwl7IFJBSU9fT04sCisJICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAicmFkaW9fb24iIH0sCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJeyBTSE9XX0RMU19FTlRSWV9JTkZPLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImRsc2VudHJ5aW5mbyIgfSwKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwl7IFNIT1dfQ0ZHX1ZBTFVFLAorCSAgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAic2hvdyIgfSwKKwl7IFNIT1dfQURIT0NfRU5UUllfSU5GTywKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJhZGhvY0VudHJ5IiB9LAorCisvKiAtLS0gc3ViLWlvY3RscyByZWxhdGlvbnMgLS0tICovCisKKyNpZmRlZiBEQkcKK3sgUlRQUklWX0lPQ1RMX0JCUCwKKyAgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywKKyAgImJicCJ9LAoreyBSVFBSSVZfSU9DVExfTUFDLAorICBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwKKyAgIm1hYyJ9LAoreyBSVFBSSVZfSU9DVExfRTJQLAorICBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwKKyAgImUycCJ9LAorI2VuZGlmICAvKiBEQkcgKi8KKworeyBSVFBSSVZfSU9DVExfU1RBVElTVElDUywKKyAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywKKyAgInN0YXQifSwKK3sgUlRQUklWX0lPQ1RMX0dTSVRFU1VSVkVZLAorICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsCisgICJnZXRfc2l0ZV9zdXJ2ZXkifSwKK307CisKK0lOVCBTZXRfU1NJRF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCisjaWZkZWYgV01NX1NVUFBPUlQKK0lOVAlTZXRfV21tQ2FwYWJsZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisjZW5kaWYKKworSU5UIFNldF9OZXR3b3JrVHlwZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0F1dGhNb2RlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfRW5jcnlwVHlwZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0RlZmF1bHRLZXlJRF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0tleTFfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9LZXkyX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfS2V5M19Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0tleTRfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9XUEFQU0tfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworCitJTlQgU2V0X1BTTW9kZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorSU5UIFNldF9XcGFfU3VwcG9ydCgKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIERCRworVk9JRCBSVE1QSW9jdGxCQlAoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglzdHJ1Y3QgaXdyZXEJKndycSk7CisKK1ZPSUQgUlRNUElvY3RsTUFDKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4Jc3RydWN0IGl3cmVxCSp3cnEpOworCitWT0lEIFJUTVBJb2N0bEUyUFJPTSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBzdHJ1Y3QgaXdyZXEgICAgKndycSk7CisjZW5kaWYgLy8gREJHIC8vCisKKworTkRJU19TVEFUVVMgUlRNUFdQQU5vbmVBZGRLZXlQcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOCVBWT0lECQkJcEJ1Zik7CisKK0lOVCBTZXRfRnJhZ1Rlc3RfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorSU5UIFNldF9UR25XaWZpVGVzdF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworSU5UIFNldF9Mb25nUmV0cnlMaW1pdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9TaG9ydFJldHJ5TGltaXRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCitJTlQgU2V0X0llZWU4MDIxMWRDbGllbnRNb2RlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVAorSU5UIFNldF9DYXJyaWVyRGV0ZWN0X1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKworSU5UCVNob3dfQWRob2NfTWFjVGFibGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQQ0hBUgkJCWV4dHJhKTsKKworc3RhdGljIHN0cnVjdCB7CisJQ0hBUiAqbmFtZTsKKwlJTlQgKCpzZXRfcHJvYykoUFJUTVBfQURBUFRFUiBwQWRhcHRlciwgUFVDSEFSIGFyZyk7Cit9ICpQUlRNUF9QUklWQVRFX1NFVF9QUk9DLCBSVE1QX1BSSVZBVEVfU1VQUE9SVF9QUk9DW10gPSB7CisJeyJEcml2ZXJWZXJzaW9uIiwJCQkJU2V0X0RyaXZlclZlcnNpb25fUHJvY30sCisJeyJDb3VudHJ5UmVnaW9uIiwJCQkJU2V0X0NvdW50cnlSZWdpb25fUHJvY30sCisJeyJDb3VudHJ5UmVnaW9uQUJhbmQiLAkJCVNldF9Db3VudHJ5UmVnaW9uQUJhbmRfUHJvY30sCisJeyJTU0lEIiwJCQkJCQlTZXRfU1NJRF9Qcm9jfSwKKwl7IldpcmVsZXNzTW9kZSIsCQkJCVNldF9XaXJlbGVzc01vZGVfUHJvY30sCisJeyJUeEJ1cnN0IiwJCQkJCVNldF9UeEJ1cnN0X1Byb2N9LAorCXsiVHhQcmVhbWJsZSIsCQkJCVNldF9UeFByZWFtYmxlX1Byb2N9LAorCXsiVHhQb3dlciIsCQkJCQlTZXRfVHhQb3dlcl9Qcm9jfSwKKwl7IkNoYW5uZWwiLAkJCQkJU2V0X0NoYW5uZWxfUHJvY30sCisJeyJCR1Byb3RlY3Rpb24iLAkJCQlTZXRfQkdQcm90ZWN0aW9uX1Byb2N9LAorCXsiUlRTVGhyZXNob2xkIiwJCQkJU2V0X1JUU1RocmVzaG9sZF9Qcm9jfSwKKwl7IkZyYWdUaHJlc2hvbGQiLAkJCQlTZXRfRnJhZ1RocmVzaG9sZF9Qcm9jfSwKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwl7Ikh0QnciLAkJICAgICAgICAgICAgICAgIFNldF9IdEJ3X1Byb2N9LAorCXsiSHRNY3MiLAkJICAgICAgICAgICAgICAgIFNldF9IdE1jc19Qcm9jfSwKKwl7Ikh0R2kiLAkJICAgICAgICAgICAgICAgIFNldF9IdEdpX1Byb2N9LAorCXsiSHRPcE1vZGUiLAkJICAgICAgICAgICAgU2V0X0h0T3BNb2RlX1Byb2N9LAorCXsiSHRFeHRjaGEiLAkJICAgICAgICAgICAgU2V0X0h0RXh0Y2hhX1Byb2N9LAorCXsiSHRNcGR1RGVuc2l0eSIsCQkgICAgICAgIFNldF9IdE1wZHVEZW5zaXR5X1Byb2N9LAorCXsiSHRCYVdpblNpemUiLAkJICAgICAgICAJU2V0X0h0QmFXaW5TaXplX1Byb2N9LAorCXsiSHRSZGciLAkJICAgICAgICAJCVNldF9IdFJkZ19Qcm9jfSwKKwl7Ikh0QW1zZHUiLAkJICAgICAgICAJCVNldF9IdEFtc2R1X1Byb2N9LAorCXsiSHRBdXRvQmEiLAkJICAgICAgICAJU2V0X0h0QXV0b0JhX1Byb2N9LAorCXsiSHRCYURlY2xpbmUiLAkJCQkJU2V0X0JBRGVjbGluZV9Qcm9jfSwKKwl7Ikh0UHJvdGVjdCIsCQkgICAgICAgIAlTZXRfSHRQcm90ZWN0X1Byb2N9LAorCXsiSHRNaW1vUHMiLAkJICAgICAgICAJU2V0X0h0TWltb1BzX1Byb2N9LAorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAorCXsiUGt0QWdncmVnYXRlIiwJCQkJU2V0X1BrdEFnZ3JlZ2F0ZV9Qcm9jfSwKKyNlbmRpZgorCisjaWZkZWYgV01NX1NVUFBPUlQKKwl7IldtbUNhcGFibGUiLAkJCQkJU2V0X1dtbUNhcGFibGVfUHJvY30sCisjZW5kaWYKKwl7IklFRUU4MDIxMUgiLAkJCQkJU2V0X0lFRUU4MDIxMUhfUHJvY30sCisgICAgeyJOZXR3b3JrVHlwZSIsICAgICAgICAgICAgICAgICBTZXRfTmV0d29ya1R5cGVfUHJvY30sCisJeyJBdXRoTW9kZSIsCQkJCQlTZXRfQXV0aE1vZGVfUHJvY30sCisJeyJFbmNyeXBUeXBlIiwJCQkJCVNldF9FbmNyeXBUeXBlX1Byb2N9LAorCXsiRGVmYXVsdEtleUlEIiwJCQkJU2V0X0RlZmF1bHRLZXlJRF9Qcm9jfSwKKwl7IktleTEiLAkJCQkJCVNldF9LZXkxX1Byb2N9LAorCXsiS2V5MiIsCQkJCQkJU2V0X0tleTJfUHJvY30sCisJeyJLZXkzIiwJCQkJCQlTZXRfS2V5M19Qcm9jfSwKKwl7IktleTQiLAkJCQkJCVNldF9LZXk0X1Byb2N9LAorCXsiV1BBUFNLIiwJCQkJCQlTZXRfV1BBUFNLX1Byb2N9LAorCXsiUmVzZXRDb3VudGVyIiwJCQkJU2V0X1Jlc2V0U3RhdENvdW50ZXJfUHJvY30sCisJeyJQU01vZGUiLCAgICAgICAgICAgICAgICAgICAgICBTZXRfUFNNb2RlX1Byb2N9LAorI2lmZGVmIERCRworCXsiRGVidWciLAkJCQkJCVNldF9EZWJ1Z19Qcm9jfSwKKyNlbmRpZgorCisjaWZkZWYgUkFMSU5LX0FURQorCXsiQVRFIiwJCQkJCQkJU2V0X0FURV9Qcm9jfSwKKwl7IkFURURBIiwJCQkJCQlTZXRfQVRFX0RBX1Byb2N9LAorCXsiQVRFU0EiLAkJCQkJCVNldF9BVEVfU0FfUHJvY30sCisJeyJBVEVCU1NJRCIsCQkJCQlTZXRfQVRFX0JTU0lEX1Byb2N9LAorCXsiQVRFQ0hBTk5FTCIsCQkJCQlTZXRfQVRFX0NIQU5ORUxfUHJvY30sCisJeyJBVEVUWFBPVzAiLAkJCQkJU2V0X0FURV9UWF9QT1dFUjBfUHJvY30sCisJeyJBVEVUWFBPVzEiLAkJCQkJU2V0X0FURV9UWF9QT1dFUjFfUHJvY30sCisJeyJBVEVUWEFOVCIsCQkJCQlTZXRfQVRFX1RYX0FudGVubmFfUHJvY30sCisJeyJBVEVSWEFOVCIsCQkJCQlTZXRfQVRFX1JYX0FudGVubmFfUHJvY30sCisJeyJBVEVUWEZSRVFPRkZTRVQiLAkJCQlTZXRfQVRFX1RYX0ZSRVFPRkZTRVRfUHJvY30sCisJeyJBVEVUWEJXIiwJCQkJCQlTZXRfQVRFX1RYX0JXX1Byb2N9LAorCXsiQVRFVFhMRU4iLAkJCQkJU2V0X0FURV9UWF9MRU5HVEhfUHJvY30sCisJeyJBVEVUWENOVCIsCQkJCQlTZXRfQVRFX1RYX0NPVU5UX1Byb2N9LAorCXsiQVRFVFhNQ1MiLAkJCQkJU2V0X0FURV9UWF9NQ1NfUHJvY30sCisJeyJBVEVUWE1PREUiLAkJCQkJU2V0X0FURV9UWF9NT0RFX1Byb2N9LAorCXsiQVRFVFhHSSIsCQkJCQkJU2V0X0FURV9UWF9HSV9Qcm9jfSwKKwl7IkFURVJYRkVSIiwJCQkJCVNldF9BVEVfUlhfRkVSX1Byb2N9LAorCXsiQVRFUlJGIiwJCQkJCQlTZXRfQVRFX1JlYWRfUkZfUHJvY30sCisJeyJBVEVXUkYxIiwJCQkJCQlTZXRfQVRFX1dyaXRlX1JGMV9Qcm9jfSwKKwl7IkFURVdSRjIiLAkJCQkJCVNldF9BVEVfV3JpdGVfUkYyX1Byb2N9LAorCXsiQVRFV1JGMyIsCQkJCQkJU2V0X0FURV9Xcml0ZV9SRjNfUHJvY30sCisJeyJBVEVXUkY0IiwJCQkJCQlTZXRfQVRFX1dyaXRlX1JGNF9Qcm9jfSwKKwl7IkFURUxERTJQIiwJCQkJICAgIFNldF9BVEVfTG9hZF9FMlBfUHJvY30sCisJeyJBVEVSRTJQIiwJCQkJCQlTZXRfQVRFX1JlYWRfRTJQX1Byb2N9LAorCXsiQVRFU0hPVyIsCQkJCQkJU2V0X0FURV9TaG93X1Byb2N9LAorCXsiQVRFSEVMUCIsCQkJCQkJU2V0X0FURV9IZWxwX1Byb2N9LAorCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwl7IlR4U3RvcCIsCQkJCQkJU2V0X1R4U3RvcF9Qcm9jfSwKKwl7IlJ4U3RvcCIsCQkJCQkJU2V0X1J4U3RvcF9Qcm9jfSwKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICB7IldwYVN1cHBvcnQiLCAgICAgICAgICAgICAgICAgIFNldF9XcGFfU3VwcG9ydH0sCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisKKworCXsiRml4ZWRUeE1vZGUiLCAgICAgICAgICAgICAgICAgU2V0X0ZpeGVkVHhNb2RlX1Byb2N9LAorI2lmZGVmIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUCisJeyJPcE1vZGUiLAkJCQkJCVNldF9PcE1vZGVfUHJvY30sCisjZW5kaWYgLy8gQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQgLy8KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICB7IlRHbldpZmlUZXN0IiwgICAgICAgICAgICAgICAgIFNldF9UR25XaWZpVGVzdF9Qcm9jfSwKKyAgICB7IkZvcmNlR0YiLAkJICAgICAgICAJCVNldF9Gb3JjZUdGX1Byb2N9LAorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCXsiRGxzQWRkRW50cnkiLAkJCQkJU2V0X0Rsc0FkZEVudHJ5X1Byb2N9LAorCXsiRGxzVGVhckRvd25FbnRyeSIsCQkJU2V0X0Rsc1RlYXJEb3duRW50cnlfUHJvY30sCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJeyJMb25nUmV0cnkiLAkgICAgICAgIAkJU2V0X0xvbmdSZXRyeUxpbWl0X1Byb2N9LAorCXsiU2hvcnRSZXRyeSIsCSAgICAgICAgCQlTZXRfU2hvcnRSZXRyeUxpbWl0X1Byb2N9LAorI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwl7IjExZENsaWVudE1vZGUiLAkJCQlTZXRfSWVlZTgwMjExZENsaWVudE1vZGVfUHJvY30sCisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKKwl7IkNhcnJpZXJEZXRlY3QiLAkJCQlTZXRfQ2FycmllckRldGVjdF9Qcm9jfSwKKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisKKwl7TlVMTCx9Cit9OworCisKK1ZPSUQgUlRNUEFkZEtleSgKKwlJTglQUlRNUF9BREFQVEVSCSAgICBwQWQsCisJSU4JUE5ESVNfODAyXzExX0tFWSAgICBwS2V5KQoreworCVVMT05HCQkJCUtleUlkeDsKKwlNQUNfVEFCTEVfRU5UUlkgIAkqcEVudHJ5OworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUEFkZEtleSAtLS0tLS0+XG4iKSk7CisKKwlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorCXsKKwkJaWYgKHBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkKKwkJeworCQkgICAgaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuUE1LLCAzMik7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUE1LLCBwS2V5LT5LZXlNYXRlcmlhbCwgcEtleS0+S2V5TGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KKwkJICAgIC8vIFVwZGF0ZSBQVEsKKwkJICAgIE5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVswXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKyAgICAgICAgICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IExFTl9US0lQX0VLOworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBwS2V5LT5LZXlNYXRlcmlhbCwgTEVOX1RLSVBfRUspOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssIExFTl9US0lQX1RYTUlDSyk7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgeworICAgICAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLLCBMRU5fVEtJUF9UWE1JQ0spOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLICsgTEVOX1RLSVBfVFhNSUNLLCBMRU5fVEtJUF9SWE1JQ0spOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBEZWNpZGUgaXRzIENoaXBlckFsZworICAgICAgICAJaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKyAgICAgICAgCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKyAgICAgICAgCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKyAgICAgICAgCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworICAgICAgICAJZWxzZQorICAgICAgICAJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCisgICAgICAgICAgICAvLyBVcGRhdGUgdGhlc2UgcmVsYXRlZCBpbmZvcm1hdGlvbiB0byBNQUNfVEFCTEVfRU5UUlkKKyAgICAgICAgCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5LZXksIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgTEVOX1RLSVBfRUspOworICAgICAgICAJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5SeE1pYywgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMsIExFTl9US0lQX1JYTUlDSyk7CisgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LlR4TWljLCBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywgTEVOX1RLSVBfVFhNSUNLKTsKKyAgICAgICAgCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnOworCisgICAgICAgIAkvLyBVcGRhdGUgcGFpcndpc2Uga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQorICAgICAgICAJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKKyAgICAgICAgCQkJCQkJICBCU1MwLAorICAgICAgICAJCQkJCQkgIDAsCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYyk7CisKKyAgICAgICAgCS8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQorICAgICAgICAJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCisgICAgICAgIAkJCQkJCQkgIEJTUzAsCisgICAgICAgIAkJCQkJCQkgIDAsCisgICAgICAgIAkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKKyAgICAgICAgCQkJCQkJCSAgcEVudHJ5KTsKKworICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gc2V0IDgwMi4xeCBwb3J0IGNvbnRyb2wKKwkgICAgICAgICAgICAvL3BBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCQkJU1RBX1BPUlRfU0VDVVJFRChwQWQpOworCisgICAgICAgICAgICAgICAgLy8gSW5kaWNhdGUgQ29ubmVjdGVkIGZvciBHVUkKKyAgICAgICAgICAgICAgICBwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworICAgICAgICAgICAgfQorCQl9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVXBkYXRlIEdUSworICAgICAgICAgICAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKHBLZXktPktleUluZGV4ICYgMHhGRik7CisgICAgICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKyAgICAgICAgICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwgcEtleS0+S2V5TWF0ZXJpYWwsIExFTl9US0lQX0VLKTsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlJ4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLLCBMRU5fVEtJUF9UWE1JQ0spOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uVHhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgeworICAgICAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uVHhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssIExFTl9US0lQX1RYTUlDSyk7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5SeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSyArIExFTl9US0lQX1RYTUlDSywgTEVOX1RLSVBfUlhNSUNLKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVXBkYXRlIFNoYXJlZCBLZXkgQ2lwaGVyQWxnCisgICAgCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworICAgIAkJaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisgICAgCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKyAgICAJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisgICAgCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworCisgICAgICAgICAgICAvLyBVcGRhdGUgZ3JvdXAga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQorICAgICAgICAJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKKyAgICAgICAgCQkJCQkJICBCU1MwLAorICAgICAgICAJCQkJCQkgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZywKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uUnhNaWMpOworCisgICAgICAgIAkvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKyAgICAgICAgCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorICAgICAgICAJCQkJCQkJICBCU1MwLAorICAgICAgICAJCQkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCisgICAgICAgIAkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLAorICAgICAgICAJCQkJCQkJICBOVUxMKTsKKworICAgICAgICAgICAgLy8gc2V0IDgwMi4xeCBwb3J0IGNvbnRyb2wKKwkgICAgICAgIC8vcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKKworICAgICAgICAgICAgLy8gSW5kaWNhdGUgQ29ubmVjdGVkIGZvciBHVUkKKyAgICAgICAgICAgIHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisgICAgICAgIH0KKwl9CisJZWxzZQkvLyBkeW5hbWljIFdFUCBmcm9tIHdwYV9zdXBwbGljYW50CisJeworCQlVQ0hBUglDaXBoZXJBbGc7CisgICAgCVBVQ0hBUglLZXk7CisKKwkJaWYocEtleS0+S2V5TGVuZ3RoID09IDMyKQorCQkJZ290byBlbmQ7CisKKwkJS2V5SWR4ID0gcEtleS0+S2V5SW5kZXggJiAweDBmZmZmZmZmOworCisJCWlmIChLZXlJZHggPCA0KQorCQl7CisJCQkvLyBpdCBpcyBhIGRlZmF1bHQgc2hhcmVkIGtleSwgZm9yIFBhaXJ3aXNlIGtleSBzZXR0aW5nCisJCQlpZiAocEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKQorCQkJeworCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgcEtleS0+QlNTSUQpOworCisJCQkJaWYgKHBFbnRyeSkKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBBZGRLZXk6IFNldCBQYWlyLXdpc2UgS2V5XG4iKSk7CisKKwkJCQkJLy8gc2V0IGtleSBtYXRlcmlhbCBhbmQga2V5IGxlbmd0aAorIAkJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5LZXlMZW4gPSAoVUNIQVIpcEtleS0+S2V5TGVuZ3RoOworCQkJCQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LktleSwgJnBLZXktPktleU1hdGVyaWFsLCBwS2V5LT5LZXlMZW5ndGgpOworCisJCQkJCS8vIHNldCBDaXBoZXIgdHlwZQorCQkJCQlpZiAocEtleS0+S2V5TGVuZ3RoID09IDUpCisJCQkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJCQkJZWxzZQorCQkJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCisJCQkJCS8vIEFkZCBQYWlyLXdpc2Uga2V5IHRvIEFzaWMKKwkJCQkJQXNpY0FkZFBhaXJ3aXNlS2V5RW50cnkoCisJCQkJCQlwQWQsCisJCQkJCQlwRW50cnktPkFkZHIsCisJCQkJCQkoVUNIQVIpcEVudHJ5LT5BaWQsCisgICAgICAgICAgICAgICAgCQkmcEVudHJ5LT5QYWlyd2lzZUtleSk7CisKKwkJCQkJLy8gdXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSBmb3IgdGhpcyBlbnRyeQorCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KAorCQkJCQkJcEFkLAorCQkJCQkJQlNTMCwKKwkJCQkJCUtleUlkeCwgLy8gVGhlIHZhbHVlIG1heSBiZSBub3QgemVybworCQkJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcsCisJCQkJCQlwRW50cnkpOworCisJCQkJfQorCQkJfQorCQkJZWxzZQorICAgICAgICAgICAgeworCQkJCS8vIERlZmF1bHQga2V5IGZvciB0eCAoc2hhcmVkIGtleSkKKwkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAoVUNIQVIpIEtleUlkeDsKKworCQkJCS8vIHNldCBrZXkgbWF0ZXJpYWwgYW5kIGtleSBsZW5ndGgKKwkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9IChVQ0hBUikgcEtleS0+S2V5TGVuZ3RoOworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5LCAmcEtleS0+S2V5TWF0ZXJpYWwsIHBLZXktPktleUxlbmd0aCk7CisKKwkJCQkvLyBTZXQgQ2lwZXIgdHlwZQorCQkJCWlmIChwS2V5LT5LZXlMZW5ndGggPT0gNSkKKwkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCQkJZWxzZQorCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisKKyAgICAJCQlDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZzsKKyAgICAJCQlLZXkgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleTsKKworCQkJCS8vIFNldCBHcm91cCBrZXkgbWF0ZXJpYWwgdG8gQXNpYworICAgIAkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIEtleUlkeCwgQ2lwaGVyQWxnLCBLZXksIE5VTEwsIE5VTEwpOworCisJCQkJLy8gVXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSBmb3IgdGhpcyBncm91cCBrZXkgdGFibGUKKwkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgQlNTMCwgS2V5SWR4LCBDaXBoZXJBbGcsIE5VTEwpOworCisJCQl9CisJCX0KKwl9CitlbmQ6CisJcmV0dXJuOworfQorCitjaGFyICogcnRzdHJjaHIoY29uc3QgY2hhciAqIHMsIGludCBjKQoreworICAgIGZvcig7ICpzICE9IChjaGFyKSBjOyArK3MpCisgICAgICAgIGlmICgqcyA9PSAnXDAnKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIChjaGFyICopIHM7Cit9CisKKy8qCitUaGlzIGlzIHJlcXVpcmVkIGZvciBMaW5FWDIwMDQva2VybmVsMi42LjcgdG8gcHJvdmlkZSBpd2xpc3Qgc2Nhbm5pbmcgZnVuY3Rpb24KKyovCisKK2ludAorcnRfaW9jdGxfZ2l3bmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBjaGFyICpuYW1lLCBjaGFyICpleHRyYSkKK3sKKy8vCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisKKyNpZmRlZiBSVDI4NzAKKwlzdHJuY3B5KG5hbWUsICJSVDI4NzAgV2lyZWxlc3MiLCBJRk5BTVNJWik7CisjZW5kaWYgLy8gUlQyODcwIC8vCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9zaXdmcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X2ZyZXEgKmZyZXEsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJaW50IAljaGFuID0gLTE7CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAgcmV0dXJuIC1FTkVURE9XTjsKKyAgICB9CisKKworCWlmIChmcmVxLT5lID4gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZigoZnJlcS0+ZSA9PSAwKSAmJiAoZnJlcS0+bSA8PSAxMDAwKSkKKwkJY2hhbiA9IGZyZXEtPm07CS8vIFNldHRpbmcgYnkgY2hhbm5lbCBudW1iZXIKKwllbHNlCisJCU1BUF9LSFpfVE9fQ0hBTk5FTF9JRCggKGZyZXEtPm0gLzEwMCkgLCBjaGFuKTsgLy8gU2V0dGluZyBieSBmcmVxdWVuY3kgLSBzZWFyY2ggdGhlIHRhYmxlICwgbGlrZSAyLjQxMkcsIDIuNDIyRywKKworICAgIGlmIChDaGFubmVsU2FuaXR5KHBBZGFwdGVyLCBjaGFuKSA9PSBUUlVFKQorICAgIHsKKwlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSBjaGFuOworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIj09PnJ0X2lvY3RsX3Npd2ZyZXE6OlNJT0NTSVdGUkVRW2NtZD0weCV4XSAoQ2hhbm5lbD0lZClcbiIsIFNJT0NTSVdGUkVRLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQoraW50IHJ0X2lvY3RsX2dpd2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgc3RydWN0IGl3X2ZyZXEgKmZyZXEsIGNoYXIgKmV4dHJhKQoreworICAgIFZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IE5VTEw7CisJVUNIQVIgY2g7CisJVUxPTkcJbTsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+bWxfcHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+bWxfcHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5tbF9wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCQljaCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiPT0+cnRfaW9jdGxfZ2l3ZnJlcSAgJWRcbiIsIGNoKSk7CisKKyAgICBNQVBfQ0hBTk5FTF9JRF9UT19LSFooY2gsIG0pOworCWZyZXEtPm0gPSBtICogMTAwOworCWZyZXEtPmUgPSAxOworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3bW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBfX3UzMiAqbW9kZSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgIAlyZXR1cm4gLUVORVRET1dOOworICAgIH0KKworCXN3aXRjaCAoKm1vZGUpCisJeworCQljYXNlIElXX01PREVfQURIT0M6CisJCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWRhcHRlciwgIkFkaG9jIik7CisJCQlicmVhazsKKwkJY2FzZSBJV19NT0RFX0lORlJBOgorCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJJbmZyYSIpOworCQkJYnJlYWs7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNCwyMCkpCisgICAgICAgIGNhc2UgSVdfTU9ERV9NT05JVE9SOgorCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJNb25pdG9yIik7CisJCQlicmVhazsKKyNlbmRpZgorCQlkZWZhdWx0OgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PnJ0X2lvY3RsX3Npd21vZGU6OlNJT0NTSVdNT0RFICh1bmtub3duICVkKVxuIiwgKm1vZGUpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8vIFJlc2V0IFJhbGluayBzdXBwbGljYW50IHRvIG5vdCB1c2UsIGl0IHdpbGwgYmUgc2V0IHRvIHN0YXJ0IHdoZW4gVUkgc2V0IFBNSyBrZXkKKwlwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIF9fdTMyICptb2RlLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+bWxfcHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+bWxfcHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5tbF9wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWlmIChBREhPQ19PTihwQWRhcHRlcikpCisJCSptb2RlID0gSVdfTU9ERV9BREhPQzsKKyAgICBlbHNlIGlmIChJTkZSQV9PTihwQWRhcHRlcikpCisJCSptb2RlID0gSVdfTU9ERV9JTkZSQTsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw0LDIwKSkKKyAgICBlbHNlIGlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKKyAgICB7CisgICAgICAgICptb2RlID0gSVdfTU9ERV9NT05JVE9SOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UKKyAgICAgICAgKm1vZGUgPSBJV19NT0RFX0FVVE87CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT5ydF9pb2N0bF9naXdtb2RlKG1vZGU9JWQpXG4iLCAqbW9kZSkpOworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3c2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBjaGFyICpuYW1lLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICAJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIAl7CisgICAgICAgIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgIAlyZXR1cm4gLUVORVRET1dOOworICAgIAl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd3NlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgY2hhciAqbmFtZSwgY2hhciAqZXh0cmEpCit7CisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdyYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCXN0cnVjdCBpd19yYW5nZSAqcmFuZ2UgPSAoc3RydWN0IGl3X3JhbmdlICopIGV4dHJhOworCXUxNiB2YWw7CisJaW50IGk7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPm1sX3ByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPm1sX3ByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT0+cnRfaW9jdGxfZ2l3cmFuZ2VcbiIpKTsKKwlkYXRhLT5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKTsKKwltZW1zZXQocmFuZ2UsIDAsIHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpKTsKKworCXJhbmdlLT50eHBvd2VyX2NhcGEgPSBJV19UWFBPV19EQk07CisKKwlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpfHxBREhPQ19PTihwQWRhcHRlcikpCisJeworCQlyYW5nZS0+bWluX3BtcCA9IDEgKiAxMDI0OworCQlyYW5nZS0+bWF4X3BtcCA9IDY1NTM1ICogMTAyNDsKKwkJcmFuZ2UtPm1pbl9wbXQgPSAxICogMTAyNDsKKwkJcmFuZ2UtPm1heF9wbXQgPSAxMDAwICogMTAyNDsKKwkJcmFuZ2UtPnBtcF9mbGFncyA9IElXX1BPV0VSX1BFUklPRDsKKwkJcmFuZ2UtPnBtdF9mbGFncyA9IElXX1BPV0VSX1RJTUVPVVQ7CisJCXJhbmdlLT5wbV9jYXBhID0gSVdfUE9XRVJfUEVSSU9EIHwgSVdfUE9XRVJfVElNRU9VVCB8CisJCQlJV19QT1dFUl9VTklDQVNUX1IgfCBJV19QT1dFUl9BTExfUjsKKwl9CisKKwlyYW5nZS0+d2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKKwlyYW5nZS0+d2VfdmVyc2lvbl9zb3VyY2UgPSAxNDsKKworCXJhbmdlLT5yZXRyeV9jYXBhID0gSVdfUkVUUllfTElNSVQ7CisJcmFuZ2UtPnJldHJ5X2ZsYWdzID0gSVdfUkVUUllfTElNSVQ7CisJcmFuZ2UtPm1pbl9yZXRyeSA9IDA7CisJcmFuZ2UtPm1heF9yZXRyeSA9IDI1NTsKKworCXJhbmdlLT5udW1fY2hhbm5lbHMgPSAgcEFkYXB0ZXItPkNoYW5uZWxMaXN0TnVtOworCisJdmFsID0gMDsKKwlmb3IgKGkgPSAxOyBpIDw9IHJhbmdlLT5udW1fY2hhbm5lbHM7IGkrKykKKwl7CisJCXUzMiBtOworCQlyYW5nZS0+ZnJlcVt2YWxdLmkgPSBwQWRhcHRlci0+Q2hhbm5lbExpc3RbaS0xXS5DaGFubmVsOworCQlNQVBfQ0hBTk5FTF9JRF9UT19LSFoocEFkYXB0ZXItPkNoYW5uZWxMaXN0W2ktMV0uQ2hhbm5lbCwgbSk7CisJCXJhbmdlLT5mcmVxW3ZhbF0ubSA9IG0gKiAxMDA7IC8qIEhaICovCisKKwkJcmFuZ2UtPmZyZXFbdmFsXS5lID0gMTsKKwkJdmFsKys7CisJCWlmICh2YWwgPT0gSVdfTUFYX0ZSRVFVRU5DSUVTKQorCQkJYnJlYWs7CisJfQorCXJhbmdlLT5udW1fZnJlcXVlbmN5ID0gdmFsOworCisJcmFuZ2UtPm1heF9xdWFsLnF1YWwgPSAxMDA7IC8qIHdoYXQgaXMgY29ycmVjdCBtYXg/IFRoaXMgd2FzIG5vdAorCQkJCQkqIGRvY3VtZW50ZWQgZXhhY3RseS4gQXQgbGVhc3QKKwkJCQkJKiA2OSBoYXMgYmVlbiBvYnNlcnZlZC4gKi8KKwlyYW5nZS0+bWF4X3F1YWwubGV2ZWwgPSAwOyAvKiBkQiAqLworCXJhbmdlLT5tYXhfcXVhbC5ub2lzZSA9IDA7IC8qIGRCICovCisKKwkvKiBXaGF0IHdvdWxkIGJlIHN1aXRhYmxlIHZhbHVlcyBmb3IgImF2ZXJhZ2UvdHlwaWNhbCIgcXVhbD8gKi8KKwlyYW5nZS0+YXZnX3F1YWwucXVhbCA9IDIwOworCXJhbmdlLT5hdmdfcXVhbC5sZXZlbCA9IC02MDsKKwlyYW5nZS0+YXZnX3F1YWwubm9pc2UgPSAtOTU7CisJcmFuZ2UtPnNlbnNpdGl2aXR5ID0gMzsKKworCXJhbmdlLT5tYXhfZW5jb2RpbmdfdG9rZW5zID0gTlJfV0VQX0tFWVM7CisJcmFuZ2UtPm51bV9lbmNvZGluZ19zaXplcyA9IDI7CisJcmFuZ2UtPmVuY29kaW5nX3NpemVbMF0gPSA1OworCXJhbmdlLT5lbmNvZGluZ19zaXplWzFdID0gMTM7CisKKwlyYW5nZS0+bWluX3J0cyA9IDA7CisJcmFuZ2UtPm1heF9ydHMgPSAyMzQ3OworCXJhbmdlLT5taW5fZnJhZyA9IDI1NjsKKwlyYW5nZS0+bWF4X2ZyYWcgPSAyMzQ2OworCisjaWYgV0lSRUxFU1NfRVhUID4gMTcKKwkvKiBJV19FTkNfQ0FQQV8qIGJpdCBmaWVsZCAqLworCXJhbmdlLT5lbmNfY2FwYSA9IElXX0VOQ19DQVBBX1dQQSB8IElXX0VOQ19DQVBBX1dQQTIgfAorCQkJCQlJV19FTkNfQ0FQQV9DSVBIRVJfVEtJUCB8IElXX0VOQ19DQVBBX0NJUEhFUl9DQ01QOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX3Npd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgIHN0cnVjdCBzb2NrYWRkciAqYXBfYWRkciwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKyAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCc3NpZDsKKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgIAlyZXR1cm4gLUVORVRET1dOOworICAgIH0KKworCWlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQorICAgIHsKKyAgICAgICAgUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FIGJ1c3ksIHJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKKyAgICB9CisKKyAgICAvLyB0ZWxsIENOVEwgc3RhdGUgbWFjaGluZSB0byBjYWxsIE5kaXNNU2V0SW5mb3JtYXRpb25Db21wbGV0ZSgpIGFmdGVyIGNvbXBsZXRpbmcKKyAgICAvLyB0aGlzIHJlcXVlc3QsIGJlY2F1c2UgdGhpcyByZXF1ZXN0IGlzIGluaXRpYXRlZCBieSBORElTLgorICAgIHBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gRkFMU0U7CisJLy8gUHJldmVudCB0byBjb25uZWN0IEFQIGFnYWluIGluIFNUQU1sbWVQZXJpb2RpY0V4ZWMKKwlwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7CisKKyAgICBtZW1zZXQoQnNzaWQsIDAsIE1BQ19BRERSX0xFTik7CisgICAgbWVtY3B5KEJzc2lkLCBhcF9hZGRyLT5zYV9kYXRhLCBNQUNfQUREUl9MRU4pOworICAgIE1sbWVFbnF1ZXVlKHBBZGFwdGVyLAorICAgICAgICAgICAgICAgIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorICAgICAgICAgICAgICAgIE9JRF84MDJfMTFfQlNTSUQsCisgICAgICAgICAgICAgICAgc2l6ZW9mKE5ESVNfODAyXzExX01BQ19BRERSRVNTKSwKKyAgICAgICAgICAgICAgICAoVk9JRCAqKSZCc3NpZCk7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJT0NUTDo6U0lPQ1NJV0FQICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorICAgICAgICBCc3NpZFswXSwgQnNzaWRbMV0sIEJzc2lkWzJdLCBCc3NpZFszXSwgQnNzaWRbNF0sIEJzc2lkWzVdKSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgIHN0cnVjdCBzb2NrYWRkciAqYXBfYWRkciwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPm1sX3ByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPm1sX3ByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpIHx8IEFESE9DX09OKHBBZGFwdGVyKSkKKwl7CisJCWFwX2FkZHItPnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwkJbWVtY3B5KGFwX2FkZHItPnNhX2RhdGEsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLkJzc2lkLCBFVEhfQUxFTik7CisJfQorI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAvLyBBZGQgZm9yIFJUMjg3MAorICAgIGVsc2UgaWYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpCisgICAgeworICAgICAgICBhcF9hZGRyLT5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisgICAgICAgIG1lbWNweShhcF9hZGRyLT5zYV9kYXRhLCAmcEFkYXB0ZXItPk1sbWVBdXguQnNzaWQsIEVUSF9BTEVOKTsKKyAgICB9CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCWVsc2UKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklPQ1RMOjpTSU9DR0lXQVAoPUVNUFRZKVxuIikpOworCQlyZXR1cm4gLUVOT1RDT05OOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogVW5pdHMgYXJlIGluIGRiIGFib3ZlIHRoZSBub2lzZSBmbG9vci4gVGhhdCBtZWFucyB0aGUKKyAqIHJzc2kgdmFsdWVzIHJlcG9ydGVkIGluIHRoZSB0eC9yeCBkZXNjcmlwdG9ycyBpbiB0aGUKKyAqIGRyaXZlciBhcmUgdGhlIFNOUiBleHByZXNzZWQgaW4gZGIuCisgKgorICogSWYgeW91IGFzc3VtZSB0aGF0IHRoZSBub2lzZSBmbG9vciBpcyAtOTUsIHdoaWNoIGlzIGFuCisgKiBleGNlbGxlbnQgYXNzdW1wdGlvbiA5OS41ICUgb2YgdGhlIHRpbWUsIHRoZW4geW91IGNhbgorICogZGVyaXZlIHRoZSBhYnNvbHV0ZSBzaWduYWwgbGV2ZWwgKGkuZS4gLTk1ICsgcnNzaSkuCisgKiBUaGVyZSBhcmUgc29tZSBvdGhlciBzbGlnaHQgZmFjdG9ycyB0byB0YWtlIGludG8gYWNjb3VudAorICogZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHJzc2kgbWVhc3VyZW1lbnQgaXMgZnJvbSAxMWIsCisgKiAxMWcsIG9yIDExYS4gICBUaGVzZSBkaWZmZXJlbmNlcyBhcmUgYXQgbW9zdCAyZGIgYW5kCisgKiBjYW4gYmUgZG9jdW1lbnRlZC4KKyAqCisgKiBOQjogdmFyaW91cyBjYWxjdWxhdGlvbnMgYXJlIGJhc2VkIG9uIHRoZSBvcmlub2NvL3dhdmVsYW4KKyAqICAgICBkcml2ZXJzIGZvciBjb21wYXRpYmlsaXR5CisgKi8KK3N0YXRpYyB2b2lkIHNldF9xdWFsaXR5KFBSVE1QX0FEQVBURVIgcEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcXVhbGl0eSAqaXEsCisgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgY2hhciByc3NpKQoreworCV9fdTggQ2hhbm5lbFF1YWxpdHk7CisKKwkvLyBOb3JtYWxpemUgUnNzaQorCWlmIChyc3NpID49IC01MCkKKwkJQ2hhbm5lbFF1YWxpdHkgPSAxMDA7CisJZWxzZSBpZiAocnNzaSA+PSAtODApIC8vIGJldHdlZW4gLTUwIH4gLTgwZGJtCisJCUNoYW5uZWxRdWFsaXR5ID0gKF9fdTgpKDI0ICsgKChyc3NpICsgODApICogMjYpLzEwKTsKKwllbHNlIGlmIChyc3NpID49IC05MCkgICAvLyBiZXR3ZWVuIC04MCB+IC05MGRibQorICAgICAgICBDaGFubmVsUXVhbGl0eSA9IChfX3U4KSgocnNzaSArIDkwKSAqIDI2KS8xMDsKKwllbHNlCisJCUNoYW5uZWxRdWFsaXR5ID0gMDsKKworICAgIGlxLT5xdWFsID0gKF9fdTgpQ2hhbm5lbFF1YWxpdHk7CisKKyAgICBpcS0+bGV2ZWwgPSAoX191OCkocnNzaSk7CisgICAgaXEtPm5vaXNlID0gKHBBZGFwdGVyLT5CYnBXcml0ZUxhdGNoWzY2XSA+IHBBZGFwdGVyLT5CYnBUdW5pbmcuRmFsc2VDY2FVcHBlclRocmVzaG9sZCkgPyAoKF9fdTgpcEFkYXB0ZXItPkJicFR1bmluZy5GYWxzZUNjYVVwcGVyVGhyZXNob2xkKSA6ICgoX191OCkgcEFkYXB0ZXItPkJicFdyaXRlTGF0Y2hbNjZdKTsgCS8vIG5vaXNlIGxldmVsIChkQm0pCisgICAgaXEtPm5vaXNlICs9IDI1NiAtIDE0MzsKKyAgICBpcS0+dXBkYXRlZCA9IHBBZGFwdGVyLT5pd19zdGF0cy5xdWFsLnVwZGF0ZWQ7Cit9CisKK2ludCBydF9pb2N0bF9pd2FwbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisgCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisKKwlzdHJ1Y3Qgc29ja2FkZHIgYWRkcltJV19NQVhfQVBdOworCXN0cnVjdCBpd19xdWFsaXR5IHF1YWxbSVdfTUFYX0FQXTsKKwlpbnQgaTsKKworICAgCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworCQlkYXRhLT5sZW5ndGggPSAwOworCQlyZXR1cm4gMDsKKyAgICAgICAgLy9yZXR1cm4gLUVORVRET1dOOworCX0KKworCWZvciAoaSA9IDA7IGkgPElXX01BWF9BUCA7IGkrKykKKwl7CisJCWlmIChpID49ICBwQWRhcHRlci0+U2NhblRhYi5Cc3NOcikKKwkJCWJyZWFrOworCQlhZGRyW2ldLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwkJCW1lbWNweShhZGRyW2ldLnNhX2RhdGEsICZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKKwkJc2V0X3F1YWxpdHkocEFkYXB0ZXIsICZxdWFsW2ldLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc3NpKTsKKwl9CisJZGF0YS0+bGVuZ3RoID0gaTsKKwltZW1jcHkoZXh0cmEsICZhZGRyLCBpKnNpemVvZihhZGRyWzBdKSk7CisJZGF0YS0+ZmxhZ3MgPSAxOwkJLyogc2lnbmFsIHF1YWxpdHkgcHJlc2VudCAoc29ydCBvZikgKi8KKwltZW1jcHkoZXh0cmEgKyBpKnNpemVvZihhZGRyWzBdKSwgJnF1YWwsIGkqc2l6ZW9mKHF1YWxbaV0pKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgU0lPQ0dJV1NDQU4KK2ludCBydF9pb2N0bF9zaXdzY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCisJVUxPTkcJCQkJCQkJCU5vdzsKKwlpbnQgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBEcml2ZXIgaXMgaW4gTW9uaXRvciBNb2RlIG5vdyAhISFcbiIpKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJaWYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0VOQUJMRSkKKwl7CisJCXBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFNjYW5Db3VudCsrOworCX0KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyAgICBwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBUUlVFOworCWlmIChSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisJCXJldHVybiAwOworCWRveworCQlOb3cgPSBqaWZmaWVzOworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQlpZiAoKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0VOQUJMRSkgJiYKKwkJCShwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRTY2FuQ291bnQgPiAzKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIFdwYVN1cHBsaWNhbnRTY2FuQ291bnQgPiAzXG4iKSk7CisJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQkJYnJlYWs7CisJCX0KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKwkJaWYgKChPUFNUQVRVU19URVNUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkgJiYKKwkJCSgocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8CisJCQkocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKSAmJgorCQkJKHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkKKwkJeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExpbmsgVVAsIFBvcnQgTm90IFNlY3VyZWQhIGlnbm9yZSB0aGlzIHNldDo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU5cbiIpKTsKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQorCQl7CisJCQlSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FIGJ1c3ksIHJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKKwkJfQorCisJCS8vIHRlbGwgQ05UTCBzdGF0ZSBtYWNoaW5lIHRvIGNhbGwgTmRpc01TZXRJbmZvcm1hdGlvbkNvbXBsZXRlKCkgYWZ0ZXIgY29tcGxldGluZworCQkvLyB0aGlzIHJlcXVlc3QsIGJlY2F1c2UgdGhpcyByZXF1ZXN0IGlzIGluaXRpYXRlZCBieSBORElTLgorCQlwQWRhcHRlci0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IEZBTFNFOworCQkvLyBSZXNldCBhbGxvd2VkIHNjYW4gcmV0cmllcworCQlwQWRhcHRlci0+U3RhQ2ZnLlNjYW5DbnQgPSAwOworCQlwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTY2FuVGltZSA9IE5vdzsKKworCQlNbG1lRW5xdWV1ZShwQWRhcHRlciwKKwkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU4sCisJCQkwLAorCQkJTlVMTCk7CisKKwkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJUlQyOFhYX01MTUVfSEFORExFUihwQWRhcHRlcik7CisJfXdoaWxlKDApOworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3c2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCWludCBpPTA7CisJY2hhciAqY3VycmVudF9ldiA9IGV4dHJhLCAqcHJldmlvdXNfZXYgPSBleHRyYTsKKwljaGFyICplbmRfYnVmOworCWNoYXIgKmN1cnJlbnRfdmFsLCBjdXN0b21bTUFYX0NVU1RPTV9MRU5dID0gezB9OworI2lmbmRlZiBJV0VWR0VOSUUKKwljaGFyIGlkeDsKKyNlbmRpZiAvLyBJV0VWR0VOSUUgLy8KKwlzdHJ1Y3QgaXdfZXZlbnQgaXdlOworCisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKyAgICB7CisJCS8qCisJCSAqIFN0aWxsIHNjYW5uaW5nLCBpbmRpY2F0ZSB0aGUgY2FsbGVyIHNob3VsZCB0cnkgYWdhaW4uCisJCSAqLworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwlpZiAocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFKQorCXsKKwkJcEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50U2NhbkNvdW50ID0gMDsKKwl9CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yID09IDApCisJeworCQlkYXRhLT5sZW5ndGggPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICBpZiAoZGF0YS0+bGVuZ3RoID4gMCkKKyAgICAgICAgZW5kX2J1ZiA9IGV4dHJhICsgZGF0YS0+bGVuZ3RoOworICAgIGVsc2UKKyAgICAgICAgZW5kX2J1ZiA9IGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQTsKKyNlbHNlCisgICAgZW5kX2J1ZiA9IGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQTsKKyNlbmRpZgorCisJZm9yIChpID0gMDsgaSA8IHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yOyBpKyspCisJeworCQlpZiAoY3VycmVudF9ldiA+PSBlbmRfYnVmKQorICAgICAgICB7CisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisgICAgICAgIH0KKworCQkvL01BQyBhZGRyZXNzCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJaXdlLmNtZCA9IFNJT0NHSVdBUDsKKwkJaXdlLnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJCQkJbWVtY3B5KGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwgJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkLCBFVEhfQUxFTik7CisKKyAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgY3VycmVudF9ldixlbmRfYnVmLCAmaXdlLCBJV19FVl9BRERSX0xFTik7CisgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQlicmVhazsKKyNlbmRpZgorCisJCS8vRVNTSUQKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQlpd2UuY21kID0gU0lPQ0dJV0VTU0lEOworCQlpd2UudS5kYXRhLmxlbmd0aCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWRMZW47CisJCWl3ZS51LmRhdGEuZmxhZ3MgPSAxOworCisgICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKwkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsZW5kX2J1ZiwgJml3ZSwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZCk7CisgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQlicmVhazsKKyNlbmRpZgorCisJCS8vTmV0d29yayBUeXBlCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJaXdlLmNtZCA9IFNJT0NHSVdNT0RFOworCQlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzVHlwZSA9PSBOZGlzODAyXzExSUJTUykKKwkJeworCQkJaXdlLnUubW9kZSA9IElXX01PREVfQURIT0M7CisJCX0KKwkJZWxzZSBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzVHlwZSA9PSBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmUpCisJCXsKKwkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX0lORlJBOworCQl9CisJCWVsc2UKKwkJeworCQkJaXdlLnUubW9kZSA9IElXX01PREVfQVVUTzsKKwkJfQorCQlpd2UubGVuID0gSVdfRVZfVUlOVF9MRU47CisKKyAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgIElXX0VWX1VJTlRfTEVOKTsKKyAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJLy9DaGFubmVsIGFuZCBGcmVxdWVuY3kKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQlpd2UuY21kID0gU0lPQ0dJV0ZSRVE7CisJCWlmIChJTkZSQV9PTihwQWRhcHRlcikgfHwgQURIT0NfT04ocEFkYXB0ZXIpKQorCQkJaXdlLnUuZnJlcS5tID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQ2hhbm5lbDsKKwkJZWxzZQorCQkJaXdlLnUuZnJlcS5tID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQ2hhbm5lbDsKKwkJaXdlLnUuZnJlcS5lID0gMDsKKwkJaXdlLnUuZnJlcS5pID0gMDsKKworCQlwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9FVkVOVChpbmZvLCBjdXJyZW50X2V2LGVuZF9idWYsICZpd2UsIElXX0VWX0ZSRVFfTEVOKTsKKyAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisKKyAgICAgICAgLy9BZGQgcXVhbGl0eSBzdGF0aXN0aWNzCisgICAgICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKyAgICAJaXdlLmNtZCA9IElXRVZRVUFMOworICAgIAlpd2UudS5xdWFsLmxldmVsID0gMDsKKyAgICAJaXdlLnUucXVhbC5ub2lzZSA9IDA7CisgICAgICAgIHNldF9xdWFsaXR5KHBBZGFwdGVyLCAmaXdlLnUucXVhbCwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNzaSk7CisgICAgCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9FVkVOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBJV19FVl9RVUFMX0xFTik7CisgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQlicmVhazsKKyNlbmRpZgorCisJCS8vRW5jeXB0aW9uIGtleQorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBTSU9DR0lXRU5DT0RFOworCQlpZiAoQ0FQX0lTX1BSSVZBQ1lfT04gKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkNhcGFiaWxpdHlJbmZvICkpCisJCQlpd2UudS5kYXRhLmZsYWdzID1JV19FTkNPREVfRU5BQkxFRCB8IElXX0VOQ09ERV9OT0tFWTsKKwkJZWxzZQorCQkJaXdlLnUuZGF0YS5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRDsKKworICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisgICAgICAgIGN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCZpd2UsIChjaGFyICopcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsoaXdlLnUuZGF0YS5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCktMV0uS2V5KTsKKyAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJLy9CaXQgUmF0ZQorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlTGVuKQorICAgICAgICB7CisgICAgICAgICAgICBVQ0hBUiB0bXBSYXRlID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZVtwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlTGVuLTFdOworCQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJCWl3ZS5jbWQgPSBTSU9DR0lXUkFURTsKKyAgICAJCWN1cnJlbnRfdmFsID0gY3VycmVudF9ldiArIElXX0VWX0xDUF9MRU47CisgICAgICAgICAgICBpZiAodG1wUmF0ZSA9PSAweDgyKQorICAgICAgICAgICAgICAgIGl3ZS51LmJpdHJhdGUudmFsdWUgPSAgMSAqIDEwMDAwMDA7CisgICAgICAgICAgICBlbHNlIGlmICh0bXBSYXRlID09IDB4ODQpCisgICAgICAgICAgICAgICAgaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICAyICogMTAwMDAwMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHRtcFJhdGUgPT0gMHg4QikKKyAgICAgICAgICAgICAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gIDUuNSAqIDEwMDAwMDA7CisgICAgICAgICAgICBlbHNlIGlmICh0bXBSYXRlID09IDB4OTYpCisgICAgICAgICAgICAgICAgaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICAxMSAqIDEwMDAwMDA7CisgICAgICAgICAgICBlbHNlCisgICAgCQkgICAgaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICAodG1wUmF0ZS8yKSAqIDEwMDAwMDA7CisKKwkJCWl3ZS51LmJpdHJhdGUuZGlzYWJsZWQgPSAwOworCQkJY3VycmVudF92YWwgPSBJV0VfU1RSRUFNX0FERF9WQUxVRShpbmZvLCBjdXJyZW50X2V2LAorCQkJCWN1cnJlbnRfdmFsLCBlbmRfYnVmLCAmaXdlLAorICAgIAkJCUlXX0VWX1BBUkFNX0xFTik7CisKKyAgICAgICAgCWlmKChjdXJyZW50X3ZhbC1jdXJyZW50X2V2KT5JV19FVl9MQ1BfTEVOKQorICAgICAgICAgICAgCWN1cnJlbnRfZXYgPSBjdXJyZW50X3ZhbDsKKyAgICAgICAgCWVsc2UKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCSAgICBicmVhazsKKyNlbmRpZgorICAgICAgICB9CisKKyNpZmRlZiBJV0VWR0VOSUUKKwkJLy9XUEEgSUUKKwkJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuID4gMCkKKwkJeworCQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJCW1lbXNldCgmY3VzdG9tWzBdLCAwLCBNQVhfQ1VTVE9NX0xFTik7CisJCQltZW1jcHkoY3VzdG9tLCAmKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFWzBdKSwKKwkJCQkJCSAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuKTsKKwkJCWl3ZS5jbWQgPSBJV0VWR0VOSUU7CisJCQlpd2UudS5kYXRhLmxlbmd0aCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuOworCQkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIGN1c3RvbSk7CisJCQlpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCSAgICBicmVhazsKKyNlbmRpZgorCQl9CisKKwkJLy9XUEEyIElFCisgICAgICAgIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbiA+IDApCisgICAgICAgIHsKKyAgICAgICAgCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCQltZW1zZXQoJmN1c3RvbVswXSwgMCwgTUFYX0NVU1RPTV9MRU4pOworCQkJbWVtY3B5KGN1c3RvbSwgJihwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRVswXSksCisJCQkJCQkgICBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbik7CisJCQlpd2UuY21kID0gSVdFVkdFTklFOworCQkJaXdlLnUuZGF0YS5sZW5ndGggPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbjsKKwkJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBjdXN0b20pOworCQkJaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQkgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgLy9XUEEgSUUKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW4gPiAwKQorICAgICAgICB7CisgICAgCQlOZGlzWmVyb01lbW9yeSgmaXdlLCBzaXplb2YoaXdlKSk7CisJCQltZW1zZXQoJmN1c3RvbVswXSwgMCwgTUFYX0NVU1RPTV9MRU4pOworICAgIAkJaXdlLmNtZCA9IElXRVZDVVNUT007CisgICAgICAgICAgICBpd2UudS5kYXRhLmxlbmd0aCA9IChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbiAqIDIpICsgNzsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KGN1c3RvbSwgIndwYV9pZT0iLCA3KTsKKyAgICAgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW47IGlkeCsrKQorICAgICAgICAgICAgICAgIHNwcmludGYoY3VzdG9tLCAiJXMlMDJ4IiwgY3VzdG9tLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRVtpZHhdKTsKKyAgICAgICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKyAgICAJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCAgY3VzdG9tKTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICAvL1dQQTIgSUUKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuID4gMCkKKyAgICAgICAgeworICAgIAkJTmRpc1plcm9NZW1vcnkoJml3ZSwgc2l6ZW9mKGl3ZSkpOworCQkJbWVtc2V0KCZjdXN0b21bMF0sIDAsIE1BWF9DVVNUT01fTEVOKTsKKyAgICAJCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworICAgICAgICAgICAgaXdlLnUuZGF0YS5sZW5ndGggPSAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW4gKiAyKSArIDc7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShjdXN0b20sICJyc25faWU9IiwgNyk7CisJCQlmb3IgKGlkeCA9IDA7IGlkeCA8IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuOyBpZHgrKykKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGN1c3RvbSwgIiVzJTAyeCIsIGN1c3RvbSwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVbaWR4XSk7CisgICAgICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisgICAgCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgIGN1c3RvbSk7CisgICAgICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCSAgICBicmVhazsKKyNlbmRpZgorICAgICAgICB9CisjZW5kaWYgLy8gSVdFVkdFTklFIC8vCisJfQorCisJZGF0YS0+bGVuZ3RoID0gY3VycmVudF9ldiAtIGV4dHJhOworICAgIHBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SICwoIj09PT5ydF9pb2N0bF9naXdzY2FuLiAlZCglZCkgQlNTIHJldHVybmVkLCBkYXRhLT5sZW5ndGggPSAlZFxuIixpICwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnIsIGRhdGEtPmxlbmd0aCkpOworCXJldHVybiAwOworfQorI2VuZGlmCisKK2ludCBydF9pb2N0bF9zaXdlc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICplc3NpZCkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworICAgICAgIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgCXJldHVybiAtRU5FVERPV047CisgICAgfQorCisJaWYgKGRhdGEtPmZsYWdzKQorCXsKKwkJUENIQVIJcFNzaWRTdHJpbmcgPSBOVUxMOworCisJCS8vIEluY2x1ZGVzIG51bGwgY2hhcmFjdGVyLgorCQlpZiAoZGF0YS0+bGVuZ3RoID4gKElXX0VTU0lEX01BWF9TSVpFICsgMSkpCisJCQlyZXR1cm4gLUUyQklHOworCisJCXBTc2lkU3RyaW5nID0gKENIQVIgKikga21hbGxvYyhNQVhfTEVOX09GX1NTSUQrMSwgTUVNX0FMTE9DX0ZMQUcpOworCQlpZiAocFNzaWRTdHJpbmcpCisJCXsKKwkJCU5kaXNaZXJvTWVtb3J5KHBTc2lkU3RyaW5nLCBNQVhfTEVOX09GX1NTSUQrMSk7CisJCQlOZGlzTW92ZU1lbW9yeShwU3NpZFN0cmluZywgZXNzaWQsIGRhdGEtPmxlbmd0aCk7CisJCQlpZiAoU2V0X1NTSURfUHJvYyhwQWRhcHRlciwgcFNzaWRTdHJpbmcpID09IEZBTFNFKQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWVsc2UKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKwllbHNlCisJeworCQkvLyBBTlkgc3NpZAorCQlpZiAoU2V0X1NTSURfUHJvYyhwQWRhcHRlciwgIiIpID09IEZBTFNFKQorCQkJcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3ZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXNzaWQpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPm1sX3ByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPm1sX3ByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlkYXRhLT5mbGFncyA9IDE7CisgICAgaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQorICAgIHsKKyAgICAgICAgZGF0YS0+bGVuZ3RoICA9IDA7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIk1lZGlhU3RhdGUgaXMgY29ubmVjdGVkXG4iKSk7CisJCWRhdGEtPmxlbmd0aCA9IHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbjsKKwkJbWVtY3B5KGVzc2lkLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWQsIHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbik7CisJfQorI2lmZGVmIFJUMjg3MAorI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAvLyBBZGQgZm9yIFJUMjg3MAorICAgIGVsc2UgaWYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpCisgICAgeworICAgICAgICBkYXRhLT5sZW5ndGggPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWRMZW47CisJCW1lbWNweShlc3NpZCwgcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWRMZW4pOworCX0KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisjZW5kaWYgLy8gUlQyODcwIC8vCisJZWxzZQorCXsvL3RoZSBBTlkgc3NpZCB3YXMgc3BlY2lmaWVkCisJCWRhdGEtPmxlbmd0aCAgPSAwOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJNZWRpYVN0YXRlIGlzIG5vdCBjb25uZWN0ZWQsIGVzc1xuIikpOworCX0KKworCXJldHVybiAwOworCit9CisKK2ludCBydF9pb2N0bF9zaXduaWNrbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpuaWNrbmFtZSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgIHJldHVybiAtRU5FVERPV047CisgICAgfQorCisJaWYgKGRhdGEtPmxlbmd0aCA+IElXX0VTU0lEX01BWF9TSVpFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbXNldChwQWRhcHRlci0+bmlja25hbWUsIDAsIElXX0VTU0lEX01BWF9TSVpFICsgMSk7CisJbWVtY3B5KHBBZGFwdGVyLT5uaWNrbmFtZSwgbmlja25hbWUsIGRhdGEtPmxlbmd0aCk7CisKKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3bmlja24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqbmlja25hbWUpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPm1sX3ByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPm1sX3ByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlpZiAoZGF0YS0+bGVuZ3RoID4gc3RybGVuKHBBZGFwdGVyLT5uaWNrbmFtZSkgKyAxKQorCQlkYXRhLT5sZW5ndGggPSBzdHJsZW4ocEFkYXB0ZXItPm5pY2tuYW1lKSArIDE7CisJaWYgKGRhdGEtPmxlbmd0aCA+IDApIHsKKwkJbWVtY3B5KG5pY2tuYW1lLCBwQWRhcHRlci0+bmlja25hbWUsIGRhdGEtPmxlbmd0aC0xKTsKKwkJbmlja25hbWVbZGF0YS0+bGVuZ3RoLTFdID0gJ1wwJzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9zaXdydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKnJ0cywgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwl1MTYgdmFsOworCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgIHJldHVybiAtRU5FVERPV047CisgICAgfQorCisJaWYgKHJ0cy0+ZGlzYWJsZWQpCisJCXZhbCA9IE1BWF9SVFNfVEhSRVNIT0xEOworCWVsc2UgaWYgKHJ0cy0+dmFsdWUgPCAwIHx8IHJ0cy0+dmFsdWUgPiBNQVhfUlRTX1RIUkVTSE9MRCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZWxzZSBpZiAocnRzLT52YWx1ZSA9PSAwKQorCSAgICB2YWwgPSBNQVhfUlRTX1RIUkVTSE9MRDsKKwllbHNlCisJCXZhbCA9IHJ0cy0+dmFsdWU7CisKKwlpZiAodmFsICE9IHBBZGFwdGVyLT5Db21tb25DZmcuUnRzVGhyZXNob2xkKQorCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA9IHZhbDsKKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3cnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICAgc3RydWN0IGl3X3BhcmFtICpydHMsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5tbF9wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5tbF9wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPm1sX3ByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlydHMtPnZhbHVlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQ7CisJcnRzLT5kaXNhYmxlZCA9IChydHMtPnZhbHVlID09IE1BWF9SVFNfVEhSRVNIT0xEKTsKKwlydHMtPmZpeGVkID0gMTsKKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3ZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wYXJhbSAqZnJhZywgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwl1MTYgdmFsOworCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICAJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIAl7CisgICAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAgCXJldHVybiAtRU5FVERPV047CisgICAgCX0KKworCWlmIChmcmFnLT5kaXNhYmxlZCkKKwkJdmFsID0gTUFYX0ZSQUdfVEhSRVNIT0xEOworCWVsc2UgaWYgKGZyYWctPnZhbHVlID49IE1JTl9GUkFHX1RIUkVTSE9MRCB8fCBmcmFnLT52YWx1ZSA8PSBNQVhfRlJBR19USFJFU0hPTEQpCisgICAgICAgIHZhbCA9IF9fY3B1X3RvX2xlMTYoZnJhZy0+dmFsdWUgJiB+MHgxKTsgLyogZXZlbiBudW1iZXJzIG9ubHkgKi8KKwllbHNlIGlmIChmcmFnLT52YWx1ZSA9PSAwKQorCSAgICB2YWwgPSBNQVhfRlJBR19USFJFU0hPTEQ7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBBZGFwdGVyLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSB2YWw7CisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdmcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BhcmFtICpmcmFnLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+bWxfcHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+bWxfcHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5tbF9wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisJfQorCisJZnJhZy0+dmFsdWUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkOworCWZyYWctPmRpc2FibGVkID0gKGZyYWctPnZhbHVlID09IE1BWF9GUkFHX1RIUkVTSE9MRCk7CisJZnJhZy0+Zml4ZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgTUFYX1dFUF9LRVlfU0laRSAxMworI2RlZmluZSBNSU5fV0VQX0tFWV9TSVpFIDUKK2ludCBydF9pb2N0bF9zaXdlbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgc3RydWN0IGl3X3BvaW50ICplcnEsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIAlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgCXsKKyAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICAJfQorCisJaWYgKChlcnEtPmxlbmd0aCA9PSAwKSAmJgorICAgICAgICAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkpCisJeworCQlwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJCXBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJCXBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisgICAgICAgIGdvdG8gZG9uZTsKKwl9CisJZWxzZSBpZiAoKGVycS0+bGVuZ3RoID09IDApICYmCisgICAgICAgICAgICAgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfUkVTVFJJQ1RFRCB8fCBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX09QRU4pKQorCXsKKwkgICAgLy9wQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworCQlwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKwkJcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworCQlwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKwkJaWYgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfUkVTVFJJQ1RFRCkKKwkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQ7CisgICAgCWVsc2UKKwkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworICAgICAgICBnb3RvIGRvbmU7CisJfQorCisgICAgaWYgKGVycS0+bGVuZ3RoID4gMCkKKwl7CisJCWludCBrZXlJZHggPSAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOworCQkvKiBDaGVjayB0aGUgc2l6ZSBvZiB0aGUga2V5ICovCisJCWlmIChlcnEtPmxlbmd0aCA+IE1BWF9XRVBfS0VZX1NJWkUpIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCS8qIENoZWNrIGtleSBpbmRleCAqLworCQlpZiAoKGtleUlkeCA8IDApIHx8IChrZXlJZHggPj0gTlJfV0VQX0tFWVMpKQorICAgICAgICB7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6Oldyb25nIGtleUlkeD0lZCEgVXNpbmcgZGVmYXVsdCBrZXkgaW5zdGVhZCAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleUlkeCwgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQpKTsKKworICAgICAgICAgICAgLy9Vc2luZyBkZWZhdWx0IGtleQorCQkJa2V5SWR4ID0gcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CisgICAgICAgIH0KKworICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCAgMTYpOworCisJCWlmIChlcnEtPmxlbmd0aCA9PSBNQVhfV0VQX0tFWV9TSVpFKQorICAgICAgICB7CisJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gTUFYX1dFUF9LRVlfU0laRTsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCQl9CisJCWVsc2UgaWYgKGVycS0+bGVuZ3RoID09IE1JTl9XRVBfS0VZX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSBNSU5fV0VQX0tFWV9TSVpFOworICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJfQorCQllbHNlCisJCQkvKiBEaXNhYmxlIHRoZSBrZXkgKi8KKwkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSAwOworCisJCS8qIENoZWNrIGlmIHRoZSBrZXkgaXMgbm90IG1hcmtlZCBhcyBpbnZhbGlkICovCisJCWlmKCEoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9OT0tFWSkpIHsKKwkJCS8qIENvcHkgdGhlIGtleSBpbiB0aGUgZHJpdmVyICovCisJCQlOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCBleHRyYSwgZXJxLT5sZW5ndGgpOworICAgICAgICB9CisJfQorICAgIGVsc2UKKwkJCXsKKwkJLyogRG8gd2Ugd2FudCB0byBqdXN0IHNldCB0aGUgdHJhbnNtaXQga2V5IGluZGV4ID8gKi8KKwkJaW50IGluZGV4ID0gKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKwkJaWYgKChpbmRleCA+PSAwKSAmJiAoaW5kZXggPCA0KSkKKyAgICAgICAgeworCQkJcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSBpbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZQorCQkJLyogRG9uJ3QgY29tcGxhaW4gaWYgb25seSBjaGFuZ2UgdGhlIG1vZGUgKi8KKwkJCWlmKCFlcnEtPmZsYWdzICYgSVdfRU5DT0RFX01PREUpIHsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworZG9uZToKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6OmVycS0+ZmxhZ3M9JXhcbiIsZXJxLT5mbGFncykpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6QXV0aE1vZGU9JXhcbiIscEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6RGVmYXVsdEtleUlkPSV4LCBLZXlMZW4gPSAlZFxuIixwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCAsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbikpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6V2VwU3RhdHVzPSV4XG4iLHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzKSk7CisJcmV0dXJuIDA7Cit9CisKK2ludAorcnRfaW9jdGxfZ2l3ZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpd19wb2ludCAqZXJxLCBjaGFyICprZXkpCit7CisJaW50IGtpZDsKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+bWxfcHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+bWxfcHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5tbF9wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisJfQorCisJa2lkID0gZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWDsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+cnRfaW9jdGxfZ2l3ZW5jb2RlICVkXG4iLCBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSk7CisKKwlpZiAocEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQorCXsKKwkJZXJxLT5sZW5ndGggPSAwOworCQllcnEtPmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCX0KKwllbHNlIGlmICgoa2lkID4gMCkgJiYgKGtpZCA8PTQpKQorCXsKKwkJLy8gY29weSB3ZXAga2V5CisJCWVycS0+ZmxhZ3MgPSBraWQgOwkJCS8qIE5COiBiYXNlIDEgKi8KKwkJaWYgKGVycS0+bGVuZ3RoID4gcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtraWQtMV0uS2V5TGVuKQorCQkJZXJxLT5sZW5ndGggPSBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tpZC0xXS5LZXlMZW47CisJCW1lbWNweShrZXksIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2lkLTFdLktleSwgZXJxLT5sZW5ndGgpOworCQkvL2lmICgoa2lkID09IHBBZGFwdGVyLT5Qb3J0Q2ZnLkRlZmF1bHRLZXlJZCkpCisJCS8vZXJxLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsJLyogWFhYICovCisJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkKKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX1JFU1RSSUNURUQ7CQkvKiBYWFggKi8KKwkJZWxzZQorCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfT1BFTjsJCS8qIFhYWCAqLworCisJfQorCWVsc2UgaWYgKGtpZCA9PSAwKQorCXsKKwkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKQorCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfUkVTVFJJQ1RFRDsJCS8qIFhYWCAqLworCQllbHNlCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9PUEVOOwkJLyogWFhYICovCisJCWVycS0+bGVuZ3RoID0gcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuOworCQltZW1jcHkoa2V5LCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksIGVycS0+bGVuZ3RoKTsKKwkJLy8gY29weSBkZWZhdWx0IGtleSBJRAorCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9SRVNUUklDVEVEOwkJLyogWFhYICovCisJCWVsc2UKKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX09QRU47CQkvKiBYWFggKi8KKwkJZXJxLT5mbGFncyA9IHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkICsgMTsJCQkvKiBOQjogYmFzZSAxICovCisJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0VOQUJMRUQ7CS8qIFhYWCAqLworCX0KKworCXJldHVybiAwOworCit9CisKK3N0YXRpYyBpbnQKK3J0X2lvY3RsX3NldHBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgdm9pZCAqdywgY2hhciAqZXh0cmEpCit7CisgICAgVklSVFVBTF9BREFQVEVSCSpwVmlydHVhbEFkID0gTlVMTDsKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyOworCVBPU19DT09LSUUgcE9iajsKKwljaGFyICp0aGlzX2NoYXIgPSBleHRyYTsKKwljaGFyICp2YWx1ZTsKKwlpbnQgIFN0YXR1cz0wOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5tbF9wcml2OworCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPm1sX3ByaXY7CisJfQorCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkYXB0ZXItPk9TX0Nvb2tpZTsKKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPm1sX3ByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJeworCQlwT2JqLT5pb2N0bF9pZl90eXBlID0gSU5UX01BSU47CisgICAgICAgIHBPYmotPmlvY3RsX2lmID0gTUFJTl9NQlNTSUQ7CisJfQorCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICAJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIAl7CisgICAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJCXJldHVybiAtRU5FVERPV047CisgICAgCX0KKworCWlmICghKnRoaXNfY2hhcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKHZhbHVlID0gcnRzdHJjaHIodGhpc19jaGFyLCAnPScpKSAhPSBOVUxMKQorCSAgICAqdmFsdWUrKyA9IDA7CisKKwlpZiAoIXZhbHVlKQorCSAgICByZXR1cm4gLUVJTlZBTDsKKworCS8vIHJlamVjdCBzZXR0aW5nIG5vdGhpbmcgYmVzaWRlcyBBTlkgc3NpZChzc2lkTGVuPTApCisgICAgaWYgKCEqdmFsdWUgJiYgKHN0cmNtcCh0aGlzX2NoYXIsICJTU0lEIikgIT0gMCkpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisJZm9yIChQUlRNUF9QUklWQVRFX1NFVF9QUk9DID0gUlRNUF9QUklWQVRFX1NVUFBPUlRfUFJPQzsgUFJUTVBfUFJJVkFURV9TRVRfUFJPQy0+bmFtZTsgUFJUTVBfUFJJVkFURV9TRVRfUFJPQysrKQorCXsKKwkgICAgaWYgKHN0cmNtcCh0aGlzX2NoYXIsIFBSVE1QX1BSSVZBVEVfU0VUX1BST0MtPm5hbWUpID09IDApCisJICAgIHsKKwkgICAgICAgIGlmKCFQUlRNUF9QUklWQVRFX1NFVF9QUk9DLT5zZXRfcHJvYyhwQWRhcHRlciwgdmFsdWUpKQorCSAgICAgICAgewkvL0ZBTFNFOlNldCBwcml2YXRlIGZhaWxlZCB0aGVuIHJldHVybiBJbnZhbGlkIGFyZ3VtZW50CisJCQkgICAgU3RhdHVzID0gLUVJTlZBTDsKKwkgICAgICAgIH0KKwkJICAgIGJyZWFrOwkvL0V4aXQgZm9yIGxvb3AuCisJICAgIH0KKwl9CisKKwlpZihQUlRNUF9QUklWQVRFX1NFVF9QUk9DLT5uYW1lID09IE5VTEwpCisJeyAgLy9Ob3QgZm91bmQgYXJndW1lbnQKKwkgICAgU3RhdHVzID0gLUVJTlZBTDsKKwkgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PnJ0X2lvY3RsX3NldHBhcmFtOjogKGl3cHJpdikgTm90IFN1cHBvcnQgU2V0IENvbW1hbmQgWyVzPSVzXVxuIiwgdGhpc19jaGFyLCB2YWx1ZSkpOworCX0KKworICAgIHJldHVybiBTdGF0dXM7Cit9CisKKworc3RhdGljIGludAorcnRfcHJpdmF0ZV9nZXRfc3RhdGlzdGljcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQlzdHJ1Y3QgaXdfcG9pbnQgKndycSwgY2hhciAqZXh0cmEpCit7CisJSU5UCQkJCVN0YXR1cyA9IDA7CisgICAgUFJUTVBfQURBUFRFUiAgIHBBZCA9IGRldi0+bWxfcHJpdjsKKworICAgIGlmIChleHRyYSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgd3JxLT5sZW5ndGggPSAwOworICAgICAgICByZXR1cm4gLUVJTzsKKyAgICB9CisKKyAgICBtZW1zZXQoZXh0cmEsIDB4MDAsIElXX1BSSVZfU0laRV9NQVNLKTsKKyAgICBzcHJpbnRmKGV4dHJhLCAiXG5cbiIpOworCisjaWZkZWYgUkFMSU5LX0FURQorCWlmIChBVEVfT04ocEFkKSkKKwl7CisJICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlR4IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPmF0ZS5UeERvbmVDb3VudCk7CisJICAgIC8vc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyB3aXRob3V0IHJldHJ5ICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+YXRlLlR4RG9uZUNvdW50KTsKKwl9CisJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwl7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCk7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyB3aXRob3V0IHJldHJ5ICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCAtIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LlF1YWRQYXJ0KTsKKwl9CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyBhZnRlciByZXRyeSAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQuUXVhZFBhcnQpOworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlR4IGZhaWwgdG8gUmN2IEFDSyBhZnRlciByZXRyeSAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC5RdWFkUGFydCk7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlRTIFN1Y2Nlc3MgUmN2IENUUyAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJUU1N1Y2Nlc3NDb3VudC5RdWFkUGFydCk7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlRTIEZhaWwgUmN2IENUUyAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJUU0ZhaWx1cmVDb3VudC5RdWFkUGFydCk7CisKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSeCBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuUmVjZWl2ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0KTsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSeCB3aXRoIENSQyAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuRkNTRXJyb3JDb3VudC5RdWFkUGFydCk7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUnggZHJvcCBkdWUgdG8gb3V0IG9mIHJlc291cmNlICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXIpOworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJ4IGR1cGxpY2F0ZSBmcmFtZSAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5GcmFtZUR1cGxpY2F0ZUNvdW50LlF1YWRQYXJ0KTsKKworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIkZhbHNlIENDQSAob25lIHNlY29uZCkgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0ZhbHNlQ0NBQ250KTsKKyNpZmRlZiBSQUxJTktfQVRFCisJaWYgKEFURV9PTihwQWQpKQorCXsKKwkJaWYgKHBBZC0+YXRlLlJ4QW50ZW5uYVNlbCA9PSAwKQorCQl7CisgICAgCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUEgICAgICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoTE9ORykocEFkLT5hdGUuTGFzdFJzc2kwIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOworCQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1CIChpZiBhdmFpbGFibGUpICAgICAgICAgICA9ICVsZFxuIiwgKExPTkcpKHBBZC0+YXRlLkxhc3RSc3NpMSAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKwkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQyAoaWYgYXZhaWxhYmxlKSAgICAgICAgICAgPSAlbGRcblxuIiwgKExPTkcpKHBBZC0+YXRlLkxhc3RSc3NpMiAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKwkJfQorCQllbHNlCisJCXsKKyAgICAJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChMT05HKShwQWQtPmF0ZS5MYXN0UnNzaTAgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7CisJCX0KKwl9CisJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwl7CisgICAgCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChMT05HKShwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKyAgICAgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1CIChpZiBhdmFpbGFibGUpICAgICAgICAgICA9ICVsZFxuIiwgKExPTkcpKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOworICAgICAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUMgKGlmIGF2YWlsYWJsZSkgICAgICAgICAgID0gJWxkXG5cbiIsIChMT05HKShwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMiAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKwl9CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIldwYVN1cHBsaWNhbnRVUCAgICAgICAgICAgICAgICAgPSAlZFxuXG4iLCBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCisgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IHJ0X3ByaXZhdGVfZ2V0X3N0YXRpc3RpY3MsIHdycS0+bGVuZ3RoID0gJWRcbiIsIHdycS0+bGVuZ3RoKSk7CisKKyAgICByZXR1cm4gU3RhdHVzOworfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCit2b2lkCWdldEJhSW5mbygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwT3V0QnVmKQoreworCUlOVCBpLCBqOworCUJBX09SSV9FTlRSWSAqcE9yaUJBRW50cnk7CisJQkFfUkVDX0VOVFJZICpwUmVjQkFFbnRyeTsKKworCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCisJeworCQlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W2ldOworCQlpZiAoKChwRW50cnktPlZhbGlkQXNDTEkgfHwgcEVudHJ5LT5WYWxpZEFzQXBDbGkpICYmIChwRW50cnktPlNzdCA9PSBTU1RfQVNTT0MpKQorCQkJfHwgKHBFbnRyeS0+VmFsaWRBc1dEUykgfHwgKHBFbnRyeS0+VmFsaWRBc01lc2gpKQorCQl7CisJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1xuJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlggKEFpZCA9ICVkKSAoQVApIC1cbiIsCisgICAgICAgICAgICAgICAgcE91dEJ1ZiwKKwkJCQlwRW50cnktPkFkZHJbMF0sIHBFbnRyeS0+QWRkclsxXSwgcEVudHJ5LT5BZGRyWzJdLAorCQkJCXBFbnRyeS0+QWRkclszXSwgcEVudHJ5LT5BZGRyWzRdLCBwRW50cnktPkFkZHJbNV0sIHBFbnRyeS0+QWlkKTsKKworCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNbUmVjaXBpZW50XVxuIiwgcE91dEJ1Zik7CisJCQlmb3IgKGo9MDsgaiA8IE5VTV9PRl9USUQ7IGorKykKKwkJCXsKKwkJCQlpZiAocEVudHJ5LT5CQVJlY1djaWRBcnJheVtqXSAhPSAwKQorCQkJCXsKKwkJCQkJcFJlY0JBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtwRW50cnktPkJBUmVjV2NpZEFycmF5W2pdXTsKKwkJCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNUSUQ9JWQsIEJBV2luU2l6ZT0lZCwgTGFzdEluZFNlcT0lZCwgUmVvcmRlcmluZ1BrdHM9JWRcbiIsIHBPdXRCdWYsIGosIHBSZWNCQUVudHJ5LT5CQVdpblNpemUsIHBSZWNCQUVudHJ5LT5MYXN0SW5kU2VxLCBwUmVjQkFFbnRyeS0+bGlzdC5xbGVuKTsKKwkJCQl9CisJCQl9CisJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1xuIiwgcE91dEJ1Zik7CisKKwkJCXNwcmludGYocE91dEJ1ZiwgIiVzW09yaWdpbmF0b3JdXG4iLCBwT3V0QnVmKTsKKwkJCWZvciAoaj0wOyBqIDwgTlVNX09GX1RJRDsgaisrKQorCQkJeworCQkJCWlmIChwRW50cnktPkJBT3JpV2NpZEFycmF5W2pdICE9IDApCisJCQkJeworCQkJCQlwT3JpQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W3BFbnRyeS0+QkFPcmlXY2lkQXJyYXlbal1dOworCQkJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1RJRD0lZCwgQkFXaW5TaXplPSVkLCBTdGFydFNlcT0lZCwgQ3VyVHhTZXE9JWRcbiIsIHBPdXRCdWYsIGosIHBPcmlCQUVudHJ5LT5CQVdpblNpemUsIHBPcmlCQUVudHJ5LT5TZXF1ZW5jZSwgcEVudHJ5LT5UeFNlcVtqXSk7CisJCQkJfQorCQkJfQorCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNcblxuIiwgcE91dEJ1Zik7CisJCX0KKyAgICAgICAgaWYgKHN0cmxlbihwT3V0QnVmKSA+IChJV19QUklWX1NJWkVfTUFTSyAtIDMwKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKwl9CisKKwlyZXR1cm47Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK3N0YXRpYyBpbnQKK3J0X3ByaXZhdGVfc2hvdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQlzdHJ1Y3QgaXdfcG9pbnQgKndycSwgY2hhciAqZXh0cmEpCit7CisgICAgSU5UCQkJCVN0YXR1cyA9IDA7CisgICAgVklSVFVBTF9BREFQVEVSCSpwVmlydHVhbEFkID0gTlVMTDsKKyAgICBQUlRNUF9BREFQVEVSICAgcEFkOworCVBPU19DT09LSUUJCXBPYmo7CisgICAgdTMyICAgICAgICAgICAgIHN1YmNtZCA9IHdycS0+ZmxhZ3M7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCQlwQWQgPSBkZXYtPm1sX3ByaXY7CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+bWxfcHJpdjsKKwkJcEFkID0gcFZpcnR1YWxBZC0+UnRtcERldi0+bWxfcHJpdjsKKwl9CisJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKworCWlmIChwQWQgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5tbF9wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworICAgIGlmIChleHRyYSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgd3JxLT5sZW5ndGggPSAwOworICAgICAgICByZXR1cm4gLUVJTzsKKyAgICB9CisgICAgbWVtc2V0KGV4dHJhLCAweDAwLCBJV19QUklWX1NJWkVfTUFTSyk7CisKKwl7CisJCXBPYmotPmlvY3RsX2lmX3R5cGUgPSBJTlRfTUFJTjsKKyAgICAgICAgcE9iai0+aW9jdGxfaWYgPSBNQUlOX01CU1NJRDsKKwl9CisKKyAgICBzd2l0Y2goc3ViY21kKQorICAgIHsKKworICAgICAgICBjYXNlIFNIT1dfQ09OTl9TVEFUVVM6CisgICAgICAgICAgICBpZiAoTU9OSVRPUl9PTihwQWQpKQorICAgICAgICAgICAgeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgICAgICAgICAgICAgIGlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQgJiYKKyAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXKQorICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiTW9uaXRvciBNb2RlKENlbnRyYWxDaGFubmVsICVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIk1vbml0b3IgTW9kZShDaGFubmVsICVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID09IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgaWYgKElORlJBX09OKHBBZCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIkNvbm5lY3RlZChBUDogJXNbJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhdKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbNV0pOworICAgICAgICAgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJTc2lkPSVzICxTc2lkbGVuID0gJWRcbiIscEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbikpOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQURIT0NfT04ocEFkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJDb25uZWN0ZWRcbiIpOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAllbHNlCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICBzcHJpbnRmKGV4dHJhLCAiRGlzY29ubmVjdGVkXG4iKTsKKyAgICAgICAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiQ29ublN0YXR1cyBpcyBub3QgY29ubmVjdGVkXG4iKSk7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTSE9XX0RSVklFUl9WRVJJT046CisgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiRHJpdmVyIHZlcnNpb24tJXMsICVzICVzXG4iLCBTVEFfRFJJVkVSX1ZFUlNJT04sIF9fREFURV9fLCBfX1RJTUVfXyApOworICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICAgICAgY2FzZSBTSE9XX0JBX0lORk86CisgICAgICAgICAgICBnZXRCYUluZm8ocEFkLCBleHRyYSk7CisgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQljYXNlIFNIT1dfREVTQ19JTkZPOgorCQkJeworCQkJCVNob3dfRGVzY0luZm9fUHJvYyhwQWQsIE5VTEwpOworCQkJCXdycS0+bGVuZ3RoID0gMDsgLy8gMTogc2l6ZSBvZiAnXDAnCisJCQl9CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBSQUlPX09GRjoKKyAgICAgICAgICAgIGlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJTY2FubmluZ1xuIik7CisgICAgICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWQtPlN0YUNmZy5iU3dSYWRpbyA9IEZBTFNFOworICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyAhPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLmJSYWRpbyA9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbyk7CisgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBGQUxTRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE1sbWVSYWRpb09mZihwQWQpOworICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KKwkJCQkJcEFkLT5FeHRyYUluZm8gPSBTV19SQURJT19PRkY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIlJhZGlvIE9mZlxuIik7CisgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJBSU9fT046CisgICAgICAgICAgICBpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiU2Nhbm5pbmdcbiIpOworICAgICAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlN3UmFkaW8gPSBUUlVFOworICAgICAgICAgICAgLy9pZiAocEFkLT5TdGFDZmcuYlJhZGlvICE9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlJhZGlvID0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKTsKKyAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBNbG1lUmFkaW9PbihwQWQpOworICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KKwkJCQkJcEFkLT5FeHRyYUluZm8gPSBFWFRSQV9JTkZPX0NMRUFSOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJSYWRpbyBPblxuIik7CisgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgIGJyZWFrOworCisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJY2FzZSBTSE9XX0RMU19FTlRSWV9JTkZPOgorCQkJeworCQkJCVNldF9EbHNFbnRyeUluZm9fRGlzcGxheV9Qcm9jKHBBZCwgTlVMTCk7CisJCQkJd3JxLT5sZW5ndGggPSAwOyAvLyAxOiBzaXplIG9mICdcMCcKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisJCWNhc2UgU0hPV19DRkdfVkFMVUU6CisJCQl7CisJCQkJU3RhdHVzID0gUlRNUFNob3dDZmdWYWx1ZShwQWQsIHdycS0+cG9pbnRlciwgZXh0cmEpOworCQkJCWlmIChTdGF0dXMgPT0gMCkKKwkJCQkJd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTSE9XX0FESE9DX0VOVFJZX0lORk86CisJCQlTaG93X0FkaG9jX01hY1RhYmxlX1Byb2MocEFkLCBleHRyYSk7CisJCQl3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKwkJCWJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgLSB1bmtub3cgc3ViY21kID0gJWRcbiIsIF9fZnVuY19fLCBzdWJjbWQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBTdGF0dXM7Cit9CisKKyNpZmRlZiBTSU9DU0lXTUxNRQoraW50IHJ0X2lvY3RsX3Npd21sbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAgIHBBZCA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgaXdfbWxtZSAqcE1sbWUgPSAoc3RydWN0IGl3X21sbWUgKil3cnF1LT5kYXRhLnBvaW50ZXI7CisJTUxNRV9RVUVVRV9FTEVNCQkJCU1zZ0VsZW07CisJTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUCURpc0Fzc29jUmVxOworCU1MTUVfREVBVVRIX1JFUV9TVFJVQ1QgICAgICBEZUF1dGhSZXE7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlc1xuIiwgX19mdW5jX18pKTsKKworCWlmIChwTWxtZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaChwTWxtZS0+Y21kKQorCXsKKyNpZmRlZiBJV19NTE1FX0RFQVVUSAorCQljYXNlIElXX01MTUVfREVBVVRIOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gJXMgLSBJV19NTE1FX0RFQVVUSFxuIiwgX19mdW5jX18pKTsKKwkJCUNPUFlfTUFDX0FERFIoRGVBdXRoUmVxLkFkZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCURlQXV0aFJlcS5SZWFzb24gPSBwTWxtZS0+cmVhc29uX2NvZGU7CisJCQlNc2dFbGVtLk1zZ0xlbiA9IHNpemVvZihNTE1FX0RFQVVUSF9SRVFfU1RSVUNUKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KE1zZ0VsZW0uTXNnLCAmRGVBdXRoUmVxLCBzaXplb2YoTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCkpOworCQkJTWxtZURlYXV0aFJlcUFjdGlvbihwQWQsICZNc2dFbGVtKTsKKwkJCWlmIChJTkZSQV9PTihwQWQpKQorCQkJeworCQkJICAgIExpbmtEb3duKHBBZCwgRkFMU0UpOworCQkJICAgIHBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8vIElXX01MTUVfREVBVVRIIC8vCisjaWZkZWYgSVdfTUxNRV9ESVNBU1NPQworCQljYXNlIElXX01MTUVfRElTQVNTT0M6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlcyAtIElXX01MTUVfRElTQVNTT0NcbiIsIF9fZnVuY19fKSk7CisJCQlDT1BZX01BQ19BRERSKERpc0Fzc29jUmVxLkFkZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCURpc0Fzc29jUmVxLlJlYXNvbiA9ICBwTWxtZS0+cmVhc29uX2NvZGU7CisKKwkJCU1zZ0VsZW0uTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7CisJCQlNc2dFbGVtLk1zZ1R5cGUgPSBNVDJfTUxNRV9ESVNBU1NPQ19SRVE7CisJCQlNc2dFbGVtLk1zZ0xlbiA9IHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpOworCQkJTmRpc01vdmVNZW1vcnkoTXNnRWxlbS5Nc2csICZEaXNBc3NvY1JlcSwgc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCkpOworCisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9ESVNBU1NPQzsKKwkJCU1sbWVEaXNhc3NvY1JlcUFjdGlvbihwQWQsICZNc2dFbGVtKTsKKwkJCWJyZWFrOworI2VuZGlmIC8vIElXX01MTUVfRElTQVNTT0MgLy8KKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzIC0gVW5rbm93IENvbW1hbmRcbiIsIF9fZnVuY19fKSk7CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvLyBTSU9DU0lXTUxNRSAvLworCisjaWYgV0lSRUxFU1NfRVhUID4gMTcKK2ludCBydF9pb2N0bF9zaXdhdXRoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgICBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgaXdfcGFyYW0gKnBhcmFtID0gJndycXUtPnBhcmFtOworCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisJc3dpdGNoIChwYXJhbS0+ZmxhZ3MgJiBJV19BVVRIX0lOREVYKSB7CisgICAgCWNhc2UgSVdfQVVUSF9XUEFfVkVSU0lPTjoKKyAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9XUEFfVkVSU0lPTl9XUEEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzsKKwkJCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKKwkJCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9XUEFfVkVSU0lPTl9XUEEyKQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOworCisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9XUEFfVkVSU0lPTiAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9DSVBIRVJfUEFJUldJU0U6CisgICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX05PTkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1dFUDQwIHx8CisgICAgICAgICAgICAgICAgICAgICBwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfV0VQMTA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gRkFMU0U7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1RLSVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfQ0NNUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX0NJUEhFUl9QQUlSV0lTRSAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9DSVBIRVJfR1JPVVA6CisgICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX05PTkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9XRVA0MCB8fAorICAgICAgICAgICAgICAgICAgICAgcGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1dFUDEwNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfVEtJUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9DQ01QKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfQ0lQSEVSX0dST1VQIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAJY2FzZSBJV19BVVRIX0tFWV9NR01UOgorICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0tFWV9NR01UXzgwMl8xWCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBGQUxTRTsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBGQUxTRTsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgICAgICAgICAgICAgfQorI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIC8vIFdFUCAxeAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxWCA9IFRSVUU7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9wQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCQkJU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9LRVlfTUdNVCAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9SWF9VTkVOQ1JZUFRFRF9FQVBPTDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIAljYXNlIElXX0FVVEhfUFJJVkFDWV9JTlZPS0VEOgorICAgICAgICAgICAgLyppZiAocGFyYW0tPnZhbHVlID09IDApCisJCQl7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgICAgICAJICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgICAgICB9Ki8KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRCAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOworICAgIAkJYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9EUk9QX1VORU5DUllQVEVEOgorICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSAhPSAwKQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisJCQllbHNlCisJCQl7CisgICAgICAgICAgICAgICAgLy9wQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCQkJU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisJCQl9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9XUEFfVkVSU0lPTiAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOworICAgIAkJYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF84MDIxMV9BVVRIX0FMRzoKKwkJCWlmIChwYXJhbS0+dmFsdWUgJiBJV19BVVRIX0FMR19TSEFSRURfS0VZKQorICAgICAgICAgICAgeworCQkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQ7CisJCQl9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgJiBJV19BVVRIX0FMR19PUEVOX1NZU1RFTSkKKyAgICAgICAgICAgIHsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKwkJCX0KKyAgICAgICAgICAgIGVsc2UKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIXzgwMjExX0FVVEhfQUxHIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7CisJCQlicmVhazsKKyAgICAJY2FzZSBJV19BVVRIX1dQQV9FTkFCTEVEOgorICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfV1BBX0VOQUJMRUQgLSBEcml2ZXIgc3VwcG9ydHMgV1BBIShwYXJhbS0+dmFsdWUgPSAlZClcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAJCWJyZWFrOworICAgIAlkZWZhdWx0OgorICAgIAkJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdhdXRoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IGl3X3BhcmFtICpwYXJhbSA9ICZ3cnF1LT5wYXJhbTsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisgICAgfQorCisJc3dpdGNoIChwYXJhbS0+ZmxhZ3MgJiBJV19BVVRIX0lOREVYKSB7CisJY2FzZSBJV19BVVRIX0RST1BfVU5FTkNSWVBURUQ6CisgICAgICAgIHBhcmFtLT52YWx1ZSA9IChwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpID8gMCA6IDE7CisJCWJyZWFrOworCisJY2FzZSBJV19BVVRIXzgwMjExX0FVVEhfQUxHOgorICAgICAgICBwYXJhbS0+dmFsdWUgPSAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpID8gSVdfQVVUSF9BTEdfU0hBUkVEX0tFWSA6IElXX0FVVEhfQUxHX09QRU5fU1lTVEVNOworCQlicmVhazsKKworCWNhc2UgSVdfQVVUSF9XUEFfRU5BQkxFRDoKKwkJcGFyYW0tPnZhbHVlID0gKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSA/IDEgOiAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnRfaW9jdGxfZ2l3YXV0aDo6cGFyYW0tPnZhbHVlID0gJWQhXG4iLCBwYXJhbS0+dmFsdWUpKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBmblNldENpcGhlcktleSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBJTlQgICAgICAgICAgICAga2V5SWR4LAorICAgIElOICBVQ0hBUiAgICAgICAgICAgQ2lwaGVyQWxnLAorICAgIElOICBCT09MRUFOICAgICAgICAgYkdUSywKKyAgICBJTiAgc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCkKK3sKKyAgICBOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKyAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCBleHQtPmtleSwgTEVOX1RLSVBfRUspOworICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5UeE1pYywgZXh0LT5rZXkgKyBMRU5fVEtJUF9FSywgTEVOX1RLSVBfVFhNSUNLKTsKKyAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uUnhNaWMsIGV4dC0+a2V5ICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7CisgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworICAgIC8vIFVwZGF0ZSBncm91cCBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCisJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLAorCQkJCQkJICBCU1MwLAorCQkJCQkJICBrZXlJZHgsCisJCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcsCisJCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksCisJCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5UeE1pYywKKwkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLlJ4TWljKTsKKworICAgIGlmIChiR1RLKQorICAgICAgICAvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKyAgICAJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwKKyAgICAJCQkJCQkJICBCU1MwLAorICAgIAkJCQkJCQkgIGtleUlkeCwKKyAgICAJCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnLAorICAgIAkJCQkJCQkgIE5VTEwpOworICAgIGVsc2UKKyAgICAgICAgLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCisgICAgCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkYXB0ZXIsCisgICAgCQkJCQkJCSAgQlNTMCwKKyAgICAJCQkJCQkJICBrZXlJZHgsCisgICAgCQkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZywKKyAgICAJCQkJCQkJICAmcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdKTsKK30KKworaW50IHJ0X2lvY3RsX3Npd2VuY29kZWV4dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICBjaGFyICpleHRyYSkKKwkJCXsKKyAgICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IGl3X3BvaW50ICplbmNvZGluZyA9ICZ3cnF1LT5lbmNvZGluZzsKKwlzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0ID0gKHN0cnVjdCBpd19lbmNvZGVfZXh0ICopZXh0cmE7CisgICAgaW50IGtleUlkeCwgYWxnID0gZXh0LT5hbGc7CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKworICAgIGlmIChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpCisJeworICAgICAgICBrZXlJZHggPSAoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisgICAgICAgIC8vIHNldCBCU1NJRCB3Y2lkIGVudHJ5IG9mIHRoZSBQYWlyLXdpc2UgS2V5IHRhYmxlIGFzIG5vLXNlY3VyaXR5IG1vZGUKKwkgICAgQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkocEFkYXB0ZXIsIEJTUzAsIEJTU0lEX1dDSUQpOworICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gMDsKKwkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIDAsIChVQ0hBUilrZXlJZHgpOworICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6UmVtb3ZlIGFsbCBrZXlzIShlbmNvZGluZy0+ZmxhZ3MgPSAleClcbiIsIF9fZnVuY19fLCBlbmNvZGluZy0+ZmxhZ3MpKTsKKyAgICB9CisJCQkJCWVsc2UKKyAgICB7CisgICAgICAgIC8vIEdldCBLZXkgSW5kZXggYW5kIGNvbnZldCB0byBvdXIgb3duIGRlZmluZWQga2V5IGluZGV4CisgICAgCWtleUlkeCA9IChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKyAgICAJaWYoKGtleUlkeCA8IDApIHx8IChrZXlJZHggPj0gTlJfV0VQX0tFWVMpKQorICAgIAkJcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKQorICAgICAgICB7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IGtleUlkeDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpEZWZhdWx0S2V5SWQgPSAlZFxuIiwgX19mdW5jX18sIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkKSk7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGFsZykgeworICAgIAkJY2FzZSBJV19FTkNPREVfQUxHX05PTkU6CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfTk9ORVxuIiwgX19mdW5jX18pKTsKKyAgICAJCQlicmVhazsKKyAgICAJCWNhc2UgSVdfRU5DT0RFX0FMR19XRVA6CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfV0VQIC0gZXh0LT5rZXlfbGVuID0gJWQsIGtleUlkeCA9ICVkXG4iLCBfX2Z1bmNfXywgZXh0LT5rZXlfbGVuLCBrZXlJZHgpKTsKKyAgICAJCQlpZiAoZXh0LT5rZXlfbGVuID09IE1BWF9XRVBfS0VZX1NJWkUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gTUFYX1dFUF9LRVlfU0laRTsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisJCQkJfQorICAgICAgICAJCWVsc2UgaWYgKGV4dC0+a2V5X2xlbiA9PSBNSU5fV0VQX0tFWV9TSVpFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IE1JTl9XRVBfS0VZX1NJWkU7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCQkJfQorICAgICAgICAJCWVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCAgMTYpOworCQkJICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksIGV4dC0+a2V5LCBleHQtPmtleV9sZW4pOworCisJCQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUdyb3VwV0VQNDBFbmFibGVkIHx8CisJCQkJCXBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZCkKKwkJCQl7CisJCQkJCS8vIFNldCBHcm91cCBrZXkgbWF0ZXJpYWwgdG8gQXNpYworCQkJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIEJTUzAsIGtleUlkeCwgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwgTlVMTCwgTlVMTCk7CisKKwkJCQkJLy8gVXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSBmb3IgdGhpcyBncm91cCBrZXkgdGFibGUKKwkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwgQlNTMCwga2V5SWR4LCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnLCBOVUxMKTsKKworCQkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKworICAgIAkJCQkvLyBJbmRpY2F0ZSBDb25uZWN0ZWQgZm9yIEdVSQorICAgIAkJCQlwQWRhcHRlci0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisJCQkJfQorICAgIAkJCWJyZWFrOworICAgICAgICAgICAgY2FzZSBJV19FTkNPREVfQUxHX1RLSVA6CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfVEtJUCAtIGtleUlkeCA9ICVkLCBleHQtPmtleV9sZW4gPSAlZFxuIiwgX19mdW5jX18sIGtleUlkeCwgZXh0LT5rZXlfbGVuKSk7CisgICAgICAgICAgICAgICAgaWYgKGV4dC0+a2V5X2xlbiA9PSAzMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm5TZXRDaXBoZXJLZXkocEFkYXB0ZXIsIGtleUlkeCwgQ0lQSEVSX1RLSVAsIEZBTFNFLCBleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfR1JPVVBfS0VZKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmblNldENpcGhlcktleShwQWRhcHRlciwga2V5SWR4LCBDSVBIRVJfVEtJUCwgVFJVRSwgZXh0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IDgwMi4xeCBwb3J0IGNvbnRyb2wKKyAgICAgICAgICAgIAkgICAgICAgIC8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworICAgICAgICAgICAgCSAgICAgICAgU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSVdfRU5DT0RFX0FMR19DQ01QOgorICAgICAgICAgICAgICAgIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkKKwkJeworICAgICAgICAgICAgICAgICAgICBmblNldENpcGhlcktleShwQWRhcHRlciwga2V5SWR4LCBDSVBIRVJfQUVTLCBGQUxTRSwgZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKKyAgICAgICAgICAgICAgICAgICAgCS8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworICAgICAgICAgICAgICAgICAgICAJU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9HUk9VUF9LRVkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmblNldENpcGhlcktleShwQWRhcHRlciwga2V5SWR4LCBDSVBIRVJfQUVTLCBUUlVFLCBleHQpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHNldCA4MDIuMXggcG9ydCBjb250cm9sCisgICAgICAgIAkgICAgICAgIC8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworICAgICAgICAJICAgICAgICBTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgCQlkZWZhdWx0OgorICAgIAkJCXJldHVybiAtRUlOVkFMOworCQl9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorcnRfaW9jdGxfZ2l3ZW5jb2RlZXh0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkID0gZGV2LT5tbF9wcml2OworCVBDSEFSIHBLZXkgPSBOVUxMOworCXN0cnVjdCBpd19wb2ludCAqZW5jb2RpbmcgPSAmd3JxdS0+ZW5jb2Rpbmc7CisJc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCA9IChzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqKWV4dHJhOworCWludCBpZHgsIG1heF9rZXlfbGVuOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT09PiBydF9pb2N0bF9naXdlbmNvZGVleHRcbiIpKTsKKworCW1heF9rZXlfbGVuID0gZW5jb2RpbmctPmxlbmd0aCAtIHNpemVvZigqZXh0KTsKKwlpZiAobWF4X2tleV9sZW4gPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlkeCA9IGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWDsKKwlpZiAoaWR4KQorCXsKKwkJaWYgKGlkeCA8IDEgfHwgaWR4ID4gNCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZHgtLTsKKworCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSB8fAorCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkKKwkJeworCQkJaWYgKGlkeCAhPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQpCisJCQl7CisJCQkJZXh0LT5rZXlfbGVuID0gMDsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKwllbHNlCisJCWlkeCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKKworCWVuY29kaW5nLT5mbGFncyA9IGlkeCArIDE7CisJbWVtc2V0KGV4dCwgMCwgc2l6ZW9mKCpleHQpKTsKKworCWV4dC0+a2V5X2xlbiA9IDA7CisJc3dpdGNoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cykgeworCQljYXNlIE5kaXM4MDJfMTFXRVBEaXNhYmxlZDoKKwkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19OT05FOworCQkJZW5jb2RpbmctPmZsYWdzIHw9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwkJCWJyZWFrOworCQljYXNlIE5kaXM4MDJfMTFXRVBFbmFibGVkOgorCQkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX1dFUDsKKwkJCWlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleUxlbiA+IG1heF9rZXlfbGVuKQorCQkJCXJldHVybiAtRTJCSUc7CisJCQllbHNlCisJCQl7CisJCQkJZXh0LT5rZXlfbGVuID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlMZW47CisJCQkJcEtleSA9ICYocEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlbMF0pOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDoKKwkJY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOgorCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19US0lQOworCQkJZWxzZQorCQkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19DQ01QOworCisJCQlpZiAobWF4X2tleV9sZW4gPCAzMikKKwkJCQlyZXR1cm4gLUUyQklHOworCQkJZWxzZQorCQkJeworCQkJCWV4dC0+a2V5X2xlbiA9IDMyOworCQkJCXBLZXkgPSAmcEFkLT5TdGFDZmcuUE1LWzBdOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZXh0LT5rZXlfbGVuICYmIHBLZXkpCisJeworCQllbmNvZGluZy0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0VOQUJMRUQ7CisJCW1lbWNweShleHQtPmtleSwgcEtleSwgZXh0LT5rZXlfbGVuKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIFNJT0NTSVdHRU5JRQoraW50IHJ0X2lvY3RsX3Npd2dlbmllKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgICBwQWQgPSBkZXYtPm1sX3ByaXY7CisKKwlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPiBNQVhfTEVOX09GX1JTTklFIHx8CisJICAgICh3cnF1LT5kYXRhLmxlbmd0aCAmJiBleHRyYSA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAod3JxdS0+ZGF0YS5sZW5ndGgpCisJeworCQlwQWQtPlN0YUNmZy5SU05JRV9MZW4gPSB3cnF1LT5kYXRhLmxlbmd0aDsKKwkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlJTTl9JRVswXSwgZXh0cmEsIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbik7CisJfQorCWVsc2UKKwl7CisJCXBBZC0+U3RhQ2ZnLlJTTklFX0xlbiA9IDA7CisJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlN0YUNmZy5SU05fSUVbMF0sIE1BWF9MRU5fT0ZfUlNOSUUpOworCX0KKworCXJldHVybiAwOworfQorI2VuZGlmIC8vIFNJT0NTSVdHRU5JRSAvLworCitpbnQgcnRfaW9jdGxfZ2l3Z2VuaWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgICBwQWQgPSBkZXYtPm1sX3ByaXY7CisKKwlpZiAoKHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiA9PSAwKSB8fAorCQkocEFkLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpKQorCXsKKwkJd3JxdS0+ZGF0YS5sZW5ndGggPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2lmZGVmIFNJT0NTSVdHRU5JRQorCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFKQorCXsKKwlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pCisJCXJldHVybiAtRTJCSUc7CisKKwl3cnF1LT5kYXRhLmxlbmd0aCA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKKwltZW1jcHkoZXh0cmEsICZwQWQtPlN0YUNmZy5SU05fSUVbMF0sIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbik7CisJfQorCWVsc2UKKyNlbmRpZiAvLyBTSU9DU0lXR0VOSUUgLy8KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCXsKKwkJVUNIQVIgUlNOSWUgPSBJRV9XUEE7CisKKwkJaWYgKHdycXUtPmRhdGEubGVuZ3RoIDwgKHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiArIDIpKSAvLyBJRCwgTGVuCisJCQlyZXR1cm4gLUUyQklHOworCQl3cnF1LT5kYXRhLmxlbmd0aCA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiArIDI7CisKKwkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSB8fAorICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpKQorCQkJUlNOSWUgPSBJRV9SU047CisKKwkJZXh0cmFbMF0gPSAoY2hhcilSU05JZTsKKwkJZXh0cmFbMV0gPSBwQWQtPlN0YUNmZy5SU05JRV9MZW47CisJCW1lbWNweShleHRyYSsyLCAmcEFkLT5TdGFDZmcuUlNOX0lFWzBdLCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3cG1rc2Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAgIHBBZCA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgaXdfcG1rc2EgKnBQbWtzYSA9IChzdHJ1Y3QgaXdfcG1rc2EgKil3cnF1LT5kYXRhLnBvaW50ZXI7CisJSU5UCUNhY2hlZElkeCA9IDAsIGlkeCA9IDA7CisKKwlpZiAocFBta3NhID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT09PiBydF9pb2N0bF9zaXdwbWtzYVxuIikpOworCXN3aXRjaChwUG1rc2EtPmNtZCkKKwl7CisJCWNhc2UgSVdfUE1LU0FfRkxVU0g6CisJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5TYXZlZFBNSywgc2l6ZW9mKEJTU0lEX0lORk8pKlBNS0lEX05PKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoInJ0X2lvY3RsX3Npd3Bta3NhIC0gSVdfUE1LU0FfRkxVU0hcbiIpKTsKKwkJCWJyZWFrOworCQljYXNlIElXX1BNS1NBX1JFTU9WRToKKwkJCWZvciAoQ2FjaGVkSWR4ID0gMDsgQ2FjaGVkSWR4IDwgcEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW07IENhY2hlZElkeCsrKQorCQkJeworCQkgICAgICAgIC8vIGNvbXBhcmUgdGhlIEJTU0lECisJCSAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwUG1rc2EtPmJzc2lkLnNhX2RhdGEsIHBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSUQsIE1BQ19BRERSX0xFTikpCisJCSAgICAgICAgeworCQkgICAgICAgIAlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELCBNQUNfQUREUl9MRU4pOworCQkJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLlBNS0lELCAxNik7CisJCQkJCWZvciAoaWR4ID0gQ2FjaGVkSWR4OyBpZHggPCAocEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW0gLSAxKTsgaWR4KyspCisJCQkJCXsKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHhdLkJTU0lEWzBdLCAmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4KzFdLkJTU0lEWzBdLCBNQUNfQUREUl9MRU4pOworCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW2lkeF0uUE1LSURbMF0sICZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHgrMV0uUE1LSURbMF0sIDE2KTsKKwkJCQkJfQorCQkJCQlwQWQtPlN0YUNmZy5TYXZlZFBNS051bS0tOworCQkJICAgICAgICBicmVhazsKKwkJICAgICAgICB9CisJICAgICAgICB9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoInJ0X2lvY3RsX3Npd3Bta3NhIC0gSVdfUE1LU0FfUkVNT1ZFXG4iKSk7CisJCQlicmVhazsKKwkJY2FzZSBJV19QTUtTQV9BREQ6CisJCQlmb3IgKENhY2hlZElkeCA9IDA7IENhY2hlZElkeCA8IHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtOyBDYWNoZWRJZHgrKykKKwkJCXsKKwkJICAgICAgICAvLyBjb21wYXJlIHRoZSBCU1NJRAorCQkgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocFBta3NhLT5ic3NpZC5zYV9kYXRhLCBwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELCBNQUNfQUREUl9MRU4pKQorCQkJICAgICAgICBicmVhazsKKwkgICAgICAgIH0KKworCSAgICAgICAgLy8gRm91bmQsIHJlcGxhY2UgaXQKKwkgICAgICAgIGlmIChDYWNoZWRJZHggPCBQTUtJRF9OTykKKwkgICAgICAgIHsKKwkJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgiVXBkYXRlIFBNS0lELCBpZHggPSAlZFxuIiwgQ2FjaGVkSWR4KSk7CisJCSAgICAgICAgTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSURbMF0sIHBQbWtzYS0+YnNzaWQuc2FfZGF0YSwgTUFDX0FERFJfTEVOKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5QTUtJRFswXSwgcFBta3NhLT5wbWtpZCwgMTYpOworCQkgICAgICAgIHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtKys7CisJICAgICAgICB9CisJICAgICAgICAvLyBOb3QgZm91bmQsIHJlcGxhY2UgdGhlIGxhc3Qgb25lCisJICAgICAgICBlbHNlCisJICAgICAgICB7CisJCSAgICAgICAgLy8gUmFuZG9tbHkgcmVwbGFjZSBvbmUKKwkJICAgICAgICBDYWNoZWRJZHggPSAocFBta3NhLT5ic3NpZC5zYV9kYXRhWzVdICUgUE1LSURfTk8pOworCQkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJVcGRhdGUgUE1LSUQsIGlkeCA9ICVkXG4iLCBDYWNoZWRJZHgpKTsKKwkJICAgICAgICBOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRFswXSwgcFBta3NhLT5ic3NpZC5zYV9kYXRhLCBNQUNfQUREUl9MRU4pOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLlBNS0lEWzBdLCBwUG1rc2EtPnBta2lkLCAxNik7CisJICAgICAgICB9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoInJ0X2lvY3RsX3Npd3Bta3NhIC0gSVdfUE1LU0FfQUREXG4iKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoInJ0X2lvY3RsX3Npd3Bta3NhIC0gVW5rbm93IENvbW1hbmQhIVxuIikpOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gI2lmIFdJUkVMRVNTX0VYVCA+IDE3CisKKyNpZmRlZiBEQkcKK3N0YXRpYyBpbnQKK3J0X3ByaXZhdGVfaW9jdGxfYmJwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBpd19wb2ludCAqd3JxLCBjaGFyICpleHRyYSkKKwkJCXsKKwlDSEFSCQkJCSp0aGlzX2NoYXI7CisJQ0hBUgkJCQkqdmFsdWUgPSBOVUxMOworCVVDSEFSCQkJCXJlZ0JCUCA9IDA7CisvLwlDSEFSCQkJCWFyZ1syNTVdPXswfTsKKwlVSU5UMzIJCQkJYmJwSWQ7CisJVUlOVDMyCQkJCWJicFZhbHVlOworCUJPT0xFQU4JCQkJYklzUHJpbnRBbGxCQlAgPSBGQUxTRTsKKwlJTlQJCQkJCVN0YXR1cyA9IDA7CisgICAgUFJUTVBfQURBUFRFUiAgICAgICBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKworCisJbWVtc2V0KGV4dHJhLCAweDAwLCBJV19QUklWX1NJWkVfTUFTSyk7CisKKwlpZiAod3JxLT5sZW5ndGggPiAxKSAvL05vIHBhcmFtZXRlcnMuCisJCQkJeworCQlzcHJpbnRmKGV4dHJhLCAiXG4iKTsKKworCQkvL1BhcnNpbmcgUmVhZCBvciBXcml0ZQorCQl0aGlzX2NoYXIgPSB3cnEtPnBvaW50ZXI7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInRoaXNfY2hhcj0lc1xuIiwgdGhpc19jaGFyKSk7CisJCWlmICghKnRoaXNfY2hhcikKKwkJCWdvdG8gbmV4dDsKKworCQlpZiAoKHZhbHVlID0gcnRzdHJjaHIodGhpc19jaGFyLCAnPScpKSAhPSBOVUxMKQorCQkJKnZhbHVlKysgPSAwOworCisJCWlmICghdmFsdWUgfHwgISp2YWx1ZSkKKwkJeyAvL1JlYWQKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInRoaXNfY2hhcj0lcywgdmFsdWU9JXNcbiIsIHRoaXNfY2hhciwgdmFsdWUpKTsKKwkJCWlmIChzc2NhbmYodGhpc19jaGFyLCAiJWQiLCAmKGJicElkKSkgPT0gMSkKKwkJCXsKKwkJCQlpZiAoYmJwSWQgPD0gMTM2KQorCQkJCXsKKyNpZmRlZiBSQUxJTktfQVRFCisJCQkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJCQl7CisJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsICZyZWdCQlApOworCQkJCQl9CisJCQkJCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJCQkJCXsKKwkJCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7CisJCQkJCX0KKwkJCQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUiUwMmRbMHglMDJYXTolMDJYXG4iLCBiYnBJZCwgYmJwSWQqMiwgcmVnQkJQKTsKKyAgICAgICAgICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIm1zZz0lc1xuIiwgZXh0cmEpKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgYmJwCisJCQkJCWJJc1ByaW50QWxsQkJQID0gVFJVRTsKKwkJCQkJZ290byBuZXh0OworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsgLy9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIGJicAorCQkJCWJJc1ByaW50QWxsQkJQID0gVFJVRTsKKwkJCQlnb3RvIG5leHQ7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7IC8vV3JpdGUKKwkJCWlmICgoc3NjYW5mKHRoaXNfY2hhciwgIiVkIiwgJihiYnBJZCkpID09IDEpICYmIChzc2NhbmYodmFsdWUsICIleCIsICYoYmJwVmFsdWUpKSA9PSAxKSkKKwkJCXsKKwkJCQlpZiAoYmJwSWQgPD0gMTM2KQorCQkJCXsKKyNpZmRlZiBSQUxJTktfQVRFCisJCQkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJCQl7CisJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCBiYnBWYWx1ZSk7CisJCQkJCQkvL1JlYWQgaXQgYmFjayBmb3Igc2hvd2luZworCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKKwkJCQkJfQorCQkJCQllbHNlCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCQkJCQl7CisJCQkJCSAgICBSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgYmJwVmFsdWUpOworICAgIAkJCQkJLy9SZWFkIGl0IGJhY2sgZm9yIHNob3dpbmcKKyAgICAJCQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsICZyZWdCQlApOworCQkJfQorCQkJCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSJTAyZFsweCUwMlhdOiUwMlhcbiIsIGJicElkLCBiYnBJZCoyLCByZWdCQlApOworICAgICAgICAgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgibXNnPSVzXG4iLCBleHRyYSkpOworCQkJCX0KKwkJCQllbHNlCisJCQkJey8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBiYnAKKwkJCQkJYklzUHJpbnRBbGxCQlAgPSBUUlVFOworCQkJCQlnb3RvIG5leHQ7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeyAvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgYmJwCisJCQkJYklzUHJpbnRBbGxCQlAgPSBUUlVFOworCQkJCWdvdG8gbmV4dDsKKwkJCX0KKwkJfQorCQl9CisJZWxzZQorCQliSXNQcmludEFsbEJCUCA9IFRSVUU7CisKK25leHQ6CisJaWYgKGJJc1ByaW50QWxsQkJQKQorCXsKKwkJbWVtc2V0KGV4dHJhLCAweDAwLCBJV19QUklWX1NJWkVfTUFTSyk7CisJCXNwcmludGYoZXh0cmEsICJcbiIpOworCQlmb3IgKGJicElkID0gMDsgYmJwSWQgPD0gMTM2OyBiYnBJZCsrKQorCQl7CisJCSAgICBpZiAoc3RybGVuKGV4dHJhKSA+PSAoSVdfUFJJVl9TSVpFX01BU0sgLSAxMCkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgUkFMSU5LX0FURQorCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQl7CisJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKKwkJCX0KKwkJCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKKwkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlIlMDJkWzB4JTAyWF06JTAyWCAgICAiLCBiYnBJZCwgYmJwSWQqMiwgcmVnQkJQKTsKKwkJCWlmIChiYnBJZCU1ID09IDQpCisJCQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiXG4iKTsKKwkJfQorCisgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ3cnEtPmxlbmd0aCA9ICVkXG4iLCB3cnEtPmxlbmd0aCkpOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PXJ0X3ByaXZhdGVfaW9jdGxfYmJwXG5cbiIpKTsKKworICAgIHJldHVybiBTdGF0dXM7Cit9CisjZW5kaWYgLy8gREJHIC8vCisKK2ludCBydF9pb2N0bF9zaXdyYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisgICAgUFJUTVBfQURBUFRFUiAgIHBBZCA9IGRldi0+bWxfcHJpdjsKKyAgICBVSU5UMzIgICAgICAgICAgcmF0ZSA9IHdycXUtPmJpdHJhdGUudmFsdWUsIGZpeGVkID0gd3JxdS0+Yml0cmF0ZS5maXhlZDsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnRfaW9jdGxfc2l3cmF0ZTo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInJ0X2lvY3RsX3Npd3JhdGU6OihyYXRlID0gJWQsIGZpeGVkID0gJWQpXG4iLCByYXRlLCBmaXhlZCkpOworICAgIC8qIHJhdGUgPSAtMSA9PiBhdXRvIHJhdGUKKyAgICAgICByYXRlID0gWCwgZml4ZWQgPSAxID0+IChmaXhlZCByYXRlIFgpCisgICAgKi8KKyAgICBpZiAocmF0ZSA9PSAtMSkKKyAgICB7CisJCS8vQXV0byBSYXRlCisJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTX0FVVE87CisJCXBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gVFJVRTsKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlIDw9IFBIWV8xMUcpIHx8CisJCSAgICAocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pKQorCQkJUlRNUFNldERlc2lyZWRSYXRlcyhwQWQsIC0xKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlTZXRDb21tb25IVChwQWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoZml4ZWQpCisgICAgICAgIHsKKyAgICAgICAgCXBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gRkFMU0U7CisgICAgICAgICAgICBpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPD0gUEhZXzExRykgfHwKKyAgICAgICAgICAgICAgICAocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pKQorICAgICAgICAgICAgICAgIFJUTVBTZXREZXNpcmVkUmF0ZXMocEFkLCByYXRlKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU19BVVRPOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgICAgICAgICAgICAgIFNldENvbW1vbkhUKHBBZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydF9pb2N0bF9zaXdyYXRlOjooSHRNY3M9JWQpXG4iLHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUT0RPOiByYXRlID0gWCwgZml4ZWQgPSAwID0+IChyYXRlcyA8PSBYKQorICAgICAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdyYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKyAgICBQUlRNUF9BREFQVEVSICAgcEFkID0gZGV2LT5tbF9wcml2OworICAgIGludCByYXRlX2luZGV4ID0gMCwgcmF0ZV9jb3VudCA9IDA7CisgICAgSFRUUkFOU01JVF9TRVRUSU5HIGh0X3NldHRpbmc7CisgICAgX19zMzIgcmFsaW5rcmF0ZVtdID0KKwl7MiwgIDQsICAgMTEsICAyMiwgLy8gQ0NLCisJMTIsIDE4LCAgIDI0LCAgMzYsIDQ4LCA3MiwgOTYsIDEwOCwgLy8gT0ZETQorCTEzLCAyNiwgICAzOSwgIDUyLCAgNzgsIDEwNCwgMTE3LCAxMzAsIDI2LCAgNTIsICA3OCwgMTA0LCAxNTYsIDIwOCwgMjM0LCAyNjAsIC8vIDIwTUh6LCA4MDBucyBHSSwgTUNTOiAwIH4gMTUKKwkzOSwgNzgsICAxMTcsIDE1NiwgMjM0LCAzMTIsIDM1MSwgMzkwLAkJCQkJCQkJCQkgIC8vIDIwTUh6LCA4MDBucyBHSSwgTUNTOiAxNiB+IDIzCisJMjcsIDU0LCAgIDgxLCAxMDgsIDE2MiwgMjE2LCAyNDMsIDI3MCwgNTQsIDEwOCwgMTYyLCAyMTYsIDMyNCwgNDMyLCA0ODYsIDU0MCwgLy8gNDBNSHosIDgwMG5zIEdJLCBNQ1M6IDAgfiAxNQorCTgxLCAxNjIsIDI0MywgMzI0LCA0ODYsIDY0OCwgNzI5LCA4MTAsCQkJCQkJCQkJCSAgLy8gNDBNSHosIDgwMG5zIEdJLCBNQ1M6IDE2IH4gMjMKKwkxNCwgMjksICAgNDMsICA1NywgIDg3LCAxMTUsIDEzMCwgMTQ0LCAyOSwgNTksICAgODcsIDExNSwgMTczLCAyMzAsIDI2MCwgMjg4LCAvLyAyME1IeiwgNDAwbnMgR0ksIE1DUzogMCB+IDE1CisJNDMsIDg3LCAgMTMwLCAxNzMsIDI2MCwgMzE3LCAzOTAsIDQzMywJCQkJCQkJCQkJICAvLyAyME1IeiwgNDAwbnMgR0ksIE1DUzogMTYgfiAyMworCTMwLCA2MCwgICA5MCwgMTIwLCAxODAsIDI0MCwgMjcwLCAzMDAsIDYwLCAxMjAsIDE4MCwgMjQwLCAzNjAsIDQ4MCwgNTQwLCA2MDAsIC8vIDQwTUh6LCA0MDBucyBHSSwgTUNTOiAwIH4gMTUKKwk5MCwgMTgwLCAyNzAsIDM2MCwgNTQwLCA3MjAsIDgxMCwgOTAwfTsJCQkJCQkJCQkJICAvLyA0ME1IeiwgNDAwbnMgR0ksIE1DUzogMTYgfiAyMworCisgICAgcmF0ZV9jb3VudCA9IHNpemVvZihyYWxpbmtyYXRlKS9zaXplb2YoX19zMzIpOworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKworICAgIGlmICgocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPT0gRkFMU0UpICYmCisgICAgICAgIChJTkZSQV9PTihwQWQpKSAmJgorICAgICAgICAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPD0gUEhZXzExRykgfHwgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSkpCisgICAgICAgIGh0X3NldHRpbmcud29yZCA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS53b3JkOworICAgIGVsc2UKKyAgICAgICAgaHRfc2V0dGluZy53b3JkID0gcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUud29yZDsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgIGlmIChodF9zZXR0aW5nLmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkKKyAgICB7CisvLyAgICAJcmF0ZV9pbmRleCA9IDEyICsgKChVQ0hBUilodF9zZXR0aW5nLmZpZWxkLkJXICoxNikgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuU2hvcnRHSSAqMzIpICsgKChVQ0hBUilodF9zZXR0aW5nLmZpZWxkLk1DUyk7CisgICAgCXJhdGVfaW5kZXggPSAxMiArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5CVyAqMjQpICsgKChVQ0hBUilodF9zZXR0aW5nLmZpZWxkLlNob3J0R0kgKjQ4KSArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5NQ1MpOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisgICAgaWYgKGh0X3NldHRpbmcuZmllbGQuTU9ERSA9PSBNT0RFX09GRE0pCisgICAgCXJhdGVfaW5kZXggPSAoVUNIQVIpKGh0X3NldHRpbmcuZmllbGQuTUNTKSArIDQ7CisgICAgZWxzZSBpZiAoaHRfc2V0dGluZy5maWVsZC5NT0RFID09IE1PREVfQ0NLKQorICAgIAlyYXRlX2luZGV4ID0gKFVDSEFSKShodF9zZXR0aW5nLmZpZWxkLk1DUyk7CisKKyAgICBpZiAocmF0ZV9pbmRleCA8IDApCisgICAgICAgIHJhdGVfaW5kZXggPSAwOworCisgICAgaWYgKHJhdGVfaW5kZXggPiByYXRlX2NvdW50KQorICAgICAgICByYXRlX2luZGV4ID0gcmF0ZV9jb3VudDsKKworICAgIHdycXUtPmJpdHJhdGUudmFsdWUgPSByYWxpbmtyYXRlW3JhdGVfaW5kZXhdICogNTAwMDAwOworICAgIHdycXUtPmJpdHJhdGUuZGlzYWJsZWQgPSAwOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBpd19oYW5kbGVyIHJ0X2hhbmRsZXJbXSA9Cit7CisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJICAgICAgICAgICAgLyogU0lPQ1NJV0NPTU1JVCAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXduYW1lLAkJCS8qIFNJT0NHSVdOQU1FICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkgICAgICAgICAgICAvKiBTSU9DU0lXTldJRCAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJICAgICAgICAgICAgLyogU0lPQ0dJV05XSUQgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdmcmVxLAkJICAgIC8qIFNJT0NTSVdGUkVRICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZnJlcSwJCSAgICAvKiBTSU9DR0lXRlJFUSAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd21vZGUsCQkgICAgLyogU0lPQ1NJV01PREUgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdtb2RlLAkJICAgIC8qIFNJT0NHSVdNT0RFICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DU0lXU0VOUyAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1NFTlMgICAqLworCShpd19oYW5kbGVyKSBOVUxMIC8qIG5vdCB1c2VkICovLAkJLyogU0lPQ1NJV1JBTkdFICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdyYW5nZSwJCSAgICAvKiBTSU9DR0lXUkFOR0UgICovCisJKGl3X2hhbmRsZXIpIE5VTEwgLyogbm90IHVzZWQgKi8sCQkvKiBTSU9DU0lXUFJJViAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwgLyoga2VybmVsIGNvZGUgKi8sICAgIC8qIFNJT0NHSVdQUklWICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCAvKiBub3QgdXNlZCAqLywJCS8qIFNJT0NTSVdTVEFUUyAgKi8KKwkoaXdfaGFuZGxlcikgcnQyOHh4X2dldF93aXJlbGVzc19zdGF0cyAvKiBrZXJuZWwgY29kZSAqLywgICAgLyogU0lPQ0dJV1NUQVRTICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdTUFkgICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DR0lXU1BZICAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogU0lPQ1NJV1RIUlNQWSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIFNJT0NHSVdUSFJTUFkgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3YXAsICAgICAgICAgICAgLyogU0lPQ1NJV0FQICAgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdhcCwJCSAgICAvKiBTSU9DR0lXQVAgICAgICovCisjaWZkZWYgU0lPQ1NJV01MTUUKKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3bWxtZSwJICAgICAgICAvKiBTSU9DU0lXTUxNRSAgICovCisjZWxzZQorCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIFNJT0NTSVdNTE1FICovCisjZW5kaWYgLy8gU0lPQ1NJV01MTUUgLy8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfaXdhcGxpc3QsCQkgICAgLyogU0lPQ0dJV0FQTElTVCAqLworI2lmZGVmIFNJT0NHSVdTQ0FOCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd3NjYW4sCQkgICAgLyogU0lPQ1NJV1NDQU4gICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdzY2FuLAkJICAgIC8qIFNJT0NHSVdTQ0FOICAgKi8KKyNlbHNlCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogU0lPQ1NJV1NDQU4gICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIFNJT0NHSVdTQ0FOICAgKi8KKyNlbmRpZiAvKiBTSU9DR0lXU0NBTiAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdlc3NpZCwJCSAgICAvKiBTSU9DU0lXRVNTSUQgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2Vzc2lkLAkJICAgIC8qIFNJT0NHSVdFU1NJRCAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3bmlja24sCQkgICAgLyogU0lPQ1NJV05JQ0tOICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXduaWNrbiwJCSAgICAvKiBTSU9DR0lXTklDS04gICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogLS0gaG9sZSAtLSAgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIC0tIGhvbGUgLS0gICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3cmF0ZSwgICAgICAgICAgLyogU0lPQ1NJV1JBVEUgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdyYXRlLCAgICAgICAgICAvKiBTSU9DR0lXUkFURSAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd3J0cywJCSAgICAvKiBTSU9DU0lXUlRTICAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd3J0cywJCSAgICAvKiBTSU9DR0lXUlRTICAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2ZyYWcsCQkgICAgLyogU0lPQ1NJV0ZSQUcgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdmcmFnLAkJICAgIC8qIFNJT0NHSVdGUkFHICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DU0lXVFhQT1cgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1RYUE9XICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdSRVRSWSAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DR0lXUkVUUlkgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2VuY29kZSwJCS8qIFNJT0NTSVdFTkNPREUgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZW5jb2RlLAkJLyogU0lPQ0dJV0VOQ09ERSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdQT1dFUiAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DR0lXUE9XRVIgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCQkJLyogLS0gaG9sZSAtLSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkJCS8qIC0tIGhvbGUgLS0gKi8KKyNpZiBXSVJFTEVTU19FWFQgPiAxNworICAgIChpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdnZW5pZSwgICAgICAgICAvKiBTSU9DU0lXR0VOSUUgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2dlbmllLCAgICAgICAgIC8qIFNJT0NHSVdHRU5JRSAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3YXV0aCwJCSAgICAvKiBTSU9DU0lXQVVUSCAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2F1dGgsCQkgICAgLyogU0lPQ0dJV0FVVEggICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdlbmNvZGVleHQsCSAgICAvKiBTSU9DU0lXRU5DT0RFRVhUICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2VuY29kZWV4dCwJCS8qIFNJT0NHSVdFTkNPREVFWFQgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3cG1rc2EsICAgICAgICAgLyogU0lPQ1NJV1BNS1NBICAqLworI2VuZGlmCit9OworCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlciBydF9wcml2X2hhbmRsZXJzW10gPSB7CisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwMCAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDEgKi8KKyNpZm5kZWYgQ09ORklHX0FQX1NVUFBPUlQKKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2V0cGFyYW0sIC8qICsgMHgwMiAqLworI2Vsc2UKKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDAyICovCisjZW5kaWYgLy8gQ09ORklHX0FQX1NVUFBPUlQgLy8KKyNpZmRlZiBEQkcKKwkoaXdfaGFuZGxlcikgcnRfcHJpdmF0ZV9pb2N0bF9iYnAsIC8qICsgMHgwMyAqLworI2Vsc2UKKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDAzICovCisjZW5kaWYKKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDA0ICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwNSAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDYgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDA3ICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwOCAqLworCShpd19oYW5kbGVyKSBydF9wcml2YXRlX2dldF9zdGF0aXN0aWNzLCAvKiArIDB4MDkgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBBICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwQiAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEMgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBEICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwRSAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEYgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDEwICovCisJKGl3X2hhbmRsZXIpIHJ0X3ByaXZhdGVfc2hvdywgLyogKyAweDExICovCisgICAgKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxMiAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTMgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDE1ICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxNyAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTggKi8KK307CisKK2NvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZiBydDI4eHhfaXdfaGFuZGxlcl9kZWYgPQoreworI2RlZmluZQlOKGEpCShzaXplb2YgKGEpIC8gc2l6ZW9mIChhWzBdKSkKKwkuc3RhbmRhcmQJPSAoaXdfaGFuZGxlciAqKSBydF9oYW5kbGVyLAorCS5udW1fc3RhbmRhcmQJPSBzaXplb2YocnRfaGFuZGxlcikgLyBzaXplb2YoaXdfaGFuZGxlciksCisJLnByaXZhdGUJPSAoaXdfaGFuZGxlciAqKSBydF9wcml2X2hhbmRsZXJzLAorCS5udW1fcHJpdmF0ZQkJPSBOKHJ0X3ByaXZfaGFuZGxlcnMpLAorCS5wcml2YXRlX2FyZ3MJPSAoc3RydWN0IGl3X3ByaXZfYXJncyAqKSBwcml2dGFiLAorCS5udW1fcHJpdmF0ZV9hcmdzCT0gTihwcml2dGFiKSwKKyNpZiBJV19IQU5ETEVSX1ZFUlNJT04gPj0gNworICAgIC5nZXRfd2lyZWxlc3Nfc3RhdHMgPSBydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzLAorI2VuZGlmCit9OworCitJTlQgUlRNUFNldEluZm9ybWF0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSIHBBZGFwdGVyLAorICAgIElOICBPVVQgc3RydWN0IGlmcmVxICAgICpycSwKKyAgICBJTiAgSU5UICAgICAgICAgICAgICAgICBjbWQpCit7CisgICAgc3RydWN0IGl3cmVxICAgICAgICAgICAgICAgICAgICAgICAgKndycSA9IChzdHJ1Y3QgaXdyZXEgKikgcnE7CisgICAgTkRJU184MDJfMTFfU1NJRCAgICAgICAgICAgICAgICAgICAgU3NpZDsKKyAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyAgICAgICAgICAgICBCc3NpZDsKKyAgICBSVF84MDJfMTFfUEhZX01PREUgICAgICAgICAgICAgICAgICBQaHlNb2RlOworICAgIFJUXzgwMl8xMV9TVEFfQ09ORklHICAgICAgICAgICAgICAgIFN0YUNvbmZpZzsKKyAgICBORElTXzgwMl8xMV9SQVRFUyAgICAgICAgICAgICAgICAgICBhcnlSYXRlczsKKyAgICBSVF84MDJfMTFfUFJFQU1CTEUgICAgICAgICAgICAgICAgICBQcmVhbWJsZTsKKyAgICBORElTXzgwMl8xMV9XRVBfU1RBVFVTICAgICAgICAgICAgICBXZXBTdGF0dXM7CisgICAgTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSAgICAgQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVNYXg7CisgICAgTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSAgQnNzVHlwZTsKKyAgICBORElTXzgwMl8xMV9SVFNfVEhSRVNIT0xEICAgICAgICAgICBSdHNUaHJlc2g7CisgICAgTkRJU184MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQgRnJhZ1RocmVzaDsKKyAgICBORElTXzgwMl8xMV9QT1dFUl9NT0RFICAgICAgICAgICAgICBQb3dlck1vZGU7CisgICAgUE5ESVNfODAyXzExX0tFWSAgICAgICAgICAgICAgICAgICAgcEtleSA9IE5VTEw7CisgICAgUE5ESVNfODAyXzExX1dFUAkJCSAgICAgICAgcFdlcEtleSA9TlVMTDsKKyAgICBQTkRJU184MDJfMTFfUkVNT1ZFX0tFWSAgICAgICAgICAgICBwUmVtb3ZlS2V5ID0gTlVMTDsKKyAgICBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OICAgICAgICAgICBDb25maWcsICpwQ29uZmlnID0gTlVMTDsKKyAgICBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgICAgICAgICAgICBOZXRUeXBlOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdzsKKyAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlJZHggPSAwOworICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1MsIE1heFBoeU1vZGUgPSBQSFlfMTFHOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvd2VyVGVtcDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWRpb1N0YXRlOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlTWFjaGluZVRvdWNoZWQgPSBGQUxTRTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlPSURfU0VUX0hUX1BIWU1PREUJCQkJCUhUX1BoeU1vZGU7CS8vMTFuICxrYXRoeQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICBQTkRJU184MDJfMTFfUE1LSUQgICAgICAgICAgICAgICAgICBwUG1rSWQgPSBOVUxMOworICAgIEJPT0xFQU4JCQkJICAgICAgICAgICAgICAgIElFRUU4MDIxeFN0YXRlID0gRkFMU0U7CisgICAgQk9PTEVBTgkJCQkgICAgICAgICAgICAgICAgSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMgPSBGQUxTRTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cGFfc3VwcGxpY2FudF9lbmFibGUgPSAwOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIFNOTVBfU1VQUE9SVAorCVRYX1JUWV9DRkdfU1RSVUMJCQl0eF9ydHlfY2ZnOworCVVMT05HCQkJCQkJU2hvcnRSZXRyeUxpbWl0LCBMb25nUmV0cnlMaW1pdDsKKwlVQ0hBUgkJCQkJCWN0bXA7CisjZW5kaWYgLy8gU05NUF9TVVBQT1JUIC8vCisKKworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJTWF4UGh5TW9kZSA9IFBIWV8xMU5fNUc7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPlJUTVBTZXRJbmZvcm1hdGlvbigpLAkweCUwOHhcbiIsIGNtZCYweDdGRkYpKTsKKyAgICBzd2l0Y2goY21kICYgMHg3RkZGKSB7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9DT1VOVFJZX1JFR0lPTjoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggPCBzaXplb2YoVUNIQVIpKQorICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisJCQkvLyBPbmx5IGF2YWxpYWJsZSB3aGVuIEVFUFJPTSBub3QgcHJvZ3JhbW1pbmcKKyAgICAgICAgICAgIGVsc2UgaWYgKCEocEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uICYgMHg4MCkgJiYgIShwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCAmIDB4ODApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVMT05HICAgQ291bnRyeTsKKyAgICAgICAgICAgICAgICBVQ0hBUglUbXBQaHk7CisKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmQ291bnRyeSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gPSAoVUNIQVIpKENvdW50cnkgJiAweDAwMDAwMEZGKTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCA9IChVQ0hBUikoKENvdW50cnkgPj4gOCkgJiAweDAwMDAwMEZGKTsKKyAgICAgICAgICAgICAgICBUbXBQaHkgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGU7CisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID0gMHhmZjsKKwkJCQkvLyBCdWlsZCBhbGwgY29ycmVzcG9uZGluZyBjaGFubmVsIGluZm9ybWF0aW9uCisJCQkJUlRNUFNldFBoeU1vZGUocEFkYXB0ZXIsIFRtcFBoeSk7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJU2V0Q29tbW9uSFQocEFkYXB0ZXIpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9DT1VOVFJZX1JFR0lPTiAoQTolZCAgQi9HOiVkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQsCisJCQkJICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU46CisgI2lmZGVmIFJBTElOS19BVEUKKwkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRoZSBkcml2ZXIgaXMgaW4gQVRFIG1vZGUgbm93XG4iKSk7CisJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworICAgICAgICAgICAgTm93ID0gamlmZmllczsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU4sIFR4Q250ID0gJWQgXG4iLCBwQWRhcHRlci0+UmFsaW5rQ291bnRlcnMuTGFzdE9uZVNlY1RvdGFsVHhDb3VudCkpOworCisgICAgICAgICAgICBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIERyaXZlciBpcyBpbiBNb25pdG9yIE1vZGUgbm93ICEhIVxuIikpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisJCQkvL0JlbnNvbiBhZGQgMjAwODA1MjcsIHdoZW4gcmFkaW8gb2ZmLCBzdGEgZG9uJ3QgbmVlZCB0byBzY2FuCisJCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkKKwkJCQlicmVhazsKKworCQkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKwkJCXsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgRHJpdmVyIGlzIHNjYW5uaW5nIG5vdyAhISFcbiIpKTsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBUUlVFOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKwkJCWlmIChwQWRhcHRlci0+UmFsaW5rQ291bnRlcnMuTGFzdE9uZVNlY1RvdGFsVHhDb3VudCA+IDEwMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTGluayBVUCwgaWdub3JlIHRoaXMgc2V0OjpPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTlxuIikpOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCQkJcEFkYXB0ZXItPlN0YUNmZy5TY2FuQ250ID0gOTk7CQkvLyBQcmV2ZW50IGF1dG8gc2NhbiB0cmlnZ2VyZWQgYnkgdGhpcyBPSUQKKwkJCQlicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChPUFNUQVRVU19URVNUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkgJiYKKwkJCQkoKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAorCQkJCShwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKKwkJCQkocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fAorCQkJCShwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKSAmJgorICAgICAgICAgICAgICAgIChwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExpbmsgVVAsIFBvcnQgTm90IFNlY3VyZWQhIGlnbm9yZSB0aGlzIHNldDo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU5cbiIpKTsKKwkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQkJCXBBZGFwdGVyLT5TdGFDZmcuU2NhbkNudCA9IDk5OwkJLy8gUHJldmVudCBhdXRvIHNjYW4gdHJpZ2dlcmVkIGJ5IHRoaXMgT0lECisJCQkJYnJlYWs7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB0ZWxsIENOVEwgc3RhdGUgbWFjaGluZSB0byBjYWxsIE5kaXNNU2V0SW5mb3JtYXRpb25Db21wbGV0ZSgpIGFmdGVyIGNvbXBsZXRpbmcKKyAgICAgICAgICAgIC8vIHRoaXMgcmVxdWVzdCwgYmVjYXVzZSB0aGlzIHJlcXVlc3QgaXMgaW5pdGlhdGVkIGJ5IE5ESVMuCisgICAgICAgICAgICBwQWRhcHRlci0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IEZBTFNFOworICAgICAgICAgICAgLy8gUmVzZXQgYWxsb3dlZCBzY2FuIHJldHJpZXMKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuU2NhbkNudCA9IDA7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTY2FuVGltZSA9IE5vdzsKKworCQkJcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gVFJVRTsKKyAgICAgICAgICAgIFJUTVBfU0VUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpOworICAgICAgICAgICAgTWxtZUVucXVldWUocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICAgICAgICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgICAgU3RhdGVNYWNoaW5lVG91Y2hlZCA9IFRSVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1NTSUQ6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9TU0lEKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgCVBDSEFSIHBTc2lkU3RyaW5nID0gTlVMTDsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmU3NpZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9TU0lEIChMZW49JWQsU3NpZD0lcylcbiIsIFNzaWQuU3NpZExlbmd0aCwgU3NpZC5Tc2lkKSk7CisgICAgICAgICAgICAgICAgaWYgKFNzaWQuU3NpZExlbmd0aCA+IE1BWF9MRU5fT0ZfU1NJRCkKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIAlpZiAoU3NpZC5Tc2lkTGVuZ3RoID09IDApCisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCVNldF9TU0lEX1Byb2MocEFkYXB0ZXIsICIiKTsKKyAgICAgICAgICAgICAgICAJfQorCQkJCQllbHNlCisgICAgICAgICAgICAgICAgCXsKKwkgICAgICAgICAgICAgICAgCXBTc2lkU3RyaW5nID0gKENIQVIgKikga21hbGxvYyhNQVhfTEVOX09GX1NTSUQrMSwgTUVNX0FMTE9DX0ZMQUcpOworCQkJCQkJaWYgKHBTc2lkU3RyaW5nKQorCQkJCQkJeworCQkJCQkJCU5kaXNaZXJvTWVtb3J5KHBTc2lkU3RyaW5nLCBNQVhfTEVOX09GX1NTSUQrMSk7CisJCQkJCQkJTmRpc01vdmVNZW1vcnkocFNzaWRTdHJpbmcsIFNzaWQuU3NpZCwgU3NpZC5Tc2lkTGVuZ3RoKTsKKwkgICAgICAgICAgICAgICAgCQlTZXRfU1NJRF9Qcm9jKHBBZGFwdGVyLCBwU3NpZFN0cmluZyk7CisJCQkJCQkJa2ZyZWUocFNzaWRTdHJpbmcpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJCVN0YXR1cyA9IC1FTk9NRU07CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0JTU0lEOgorI2lmZGVmIFJBTElOS19BVEUKKwkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRoZSBkcml2ZXIgaXMgaW4gQVRFIG1vZGUgbm93XG4iKSk7CisJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfTUFDX0FERFJFU1MpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZCc3NpZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworICAgICAgICAgICAgICAgIC8vIHRlbGwgQ05UTCBzdGF0ZSBtYWNoaW5lIHRvIGNhbGwgTmRpc01TZXRJbmZvcm1hdGlvbkNvbXBsZXRlKCkgYWZ0ZXIgY29tcGxldGluZworICAgICAgICAgICAgICAgIC8vIHRoaXMgcmVxdWVzdCwgYmVjYXVzZSB0aGlzIHJlcXVlc3QgaXMgaW5pdGlhdGVkIGJ5IE5ESVMuCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBGQUxTRTsKKworCQkJCS8vIFByZXZlbnQgdG8gY29ubmVjdCBBUCBhZ2FpbiBpbiBTVEFNbG1lUGVyaW9kaWNFeGVjCisJCQkJcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW49IDMyOworCisgICAgICAgICAgICAgICAgLy8gUmVzZXQgYWxsb3dlZCBzY2FuIHJldHJpZXMKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLlNjYW5DbnQgPSAwOworCisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPSURfODAyXzExX0JTU0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihORElTXzgwMl8xMV9NQUNfQUREUkVTUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFZPSUQgKikmQnNzaWQpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgU3RhdGVNYWNoaW5lVG91Y2hlZCA9IFRSVUU7CisKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQlNTSUQgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnNzaWRbMF0sIEJzc2lkWzFdLCBCc3NpZFsyXSwgQnNzaWRbM10sIEJzc2lkWzRdLCBCc3NpZFs1XSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9SQURJTzoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKEJPT0xFQU4pKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZSYWRpb1N0YXRlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9SQURJTyAoPSVkKVxuIiwgUmFkaW9TdGF0ZSkpOworICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJTd1JhZGlvICE9IFJhZGlvU3RhdGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJTd1JhZGlvID0gUmFkaW9TdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYlJhZGlvICE9IChwQWRhcHRlci0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZGFwdGVyLT5TdGFDZmcuYlN3UmFkaW8pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJSYWRpbyA9IChwQWRhcHRlci0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZGFwdGVyLT5TdGFDZmcuYlN3UmFkaW8pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWxtZVJhZGlvT24ocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbgorCQkJCQkJCXBBZGFwdGVyLT5FeHRyYUluZm8gPSBFWFRSQV9JTkZPX0NMRUFSOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1sbWVSYWRpb09mZihwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uCisJCQkJCQkJcEFkYXB0ZXItPkV4dHJhSW5mbyA9IFNXX1JBRElPX09GRjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUEhZX01PREU6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihSVF84MDJfMTFfUEhZX01PREUpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZQaHlNb2RlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCWlmIChQaHlNb2RlIDw9IE1heFBoeU1vZGUpCisJCQkJeworICAgICAgICAgICAgICAgIAlSVE1QU2V0UGh5TW9kZShwQWRhcHRlciwgUGh5TW9kZSk7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJCVNldENvbW1vbkhUKHBBZGFwdGVyKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCQl9CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1BIWV9NT0RFICg9JWQpXG4iLCBQaHlNb2RlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1NUQV9DT05GSUc6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihSVF84MDJfMTFfU1RBX0NPTkZJRykpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlN0YUNvbmZpZywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ID0gU3RhQ29uZmlnLkVuYWJsZVR4QnVyc3Q7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSBTdGFDb25maWcuVXNlQkdQcm90ZWN0aW9uOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUgPSAxOyAvLyAyMDAzLTEwLTMwIGFsd2F5cyBTSE9SVCBTTE9UIGNhcGFibGUKKyAgICAgICAgICAgICAgICBpZiAoKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSAhPSBTdGFDb25maWcuQWRob2NNb2RlKSAmJgorCQkJCQkoU3RhQ29uZmlnLkFkaG9jTW9kZSA8PSBNYXhQaHlNb2RlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IGR5bmFtaWMgY2hhbmdlIG9mICJVU0UgT0ZETSByYXRlIG9yIG5vdCIgaW4gQURIT0MgbW9kZQorICAgICAgICAgICAgICAgICAgICAvLyBpZiBzZXR0aW5nIGNoYW5nZWQsIG5lZWQgdG8gcmVzZXQgY3VycmVudCBUWCByYXRlIGFzIHdlbGwgYXMgQkVBQ09OIGZyYW1lIGZvcm1hdAorICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKKyAgICAgICAgICAgICAgICAgICAgeworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID0gU3RhQ29uZmlnLkFkaG9jTW9kZTsKKyAgICAgICAgICAgICAgICAgICAgCVJUTVBTZXRQaHlNb2RlKHBBZGFwdGVyLCBQaHlNb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1sbWVVcGRhdGVUeFJhdGVzKHBBZGFwdGVyLCBGQUxTRSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBNYWtlSWJzc0JlYWNvbihwQWRhcHRlcik7ICAgICAgICAgICAvLyByZS1idWlsZCBCRUFDT04gZnJhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIEFzaWNFbmFibGVJYnNzU3luYyhwQWRhcHRlcik7ICAgLy8gY29weSB0byBvbi1jaGlwIG1lbW9yeQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfU1RBX0NPTkZJRyAoQnVyc3Q9JWQsIFByb3RlY3Rpb249JWxkLFNob3J0U2xvdD0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfREVTSVJFRF9SQVRFUzoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX1JBVEVTKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmYXJ5UmF0ZXMsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlLCAmYXJ5UmF0ZXMsIHNpemVvZihORElTXzgwMl8xMV9SQVRFUykpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTICglMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngpXG4iLAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMF0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzFdLAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMl0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzNdLAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNF0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzVdLAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNl0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzddICkpOworICAgICAgICAgICAgICAgIC8vIENoYW5naW5nIERlc2lyZWRSYXRlIG1heSBhZmZlY3QgdGhlIE1BWCBUWCByYXRlIHdlIHVzZWQgdG8gVFggZnJhbWVzIG91dAorICAgICAgICAgICAgICAgIE1sbWVVcGRhdGVUeFJhdGVzKHBBZGFwdGVyLCBGQUxTRSwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1BSRUFNQkxFOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoUlRfODAyXzExX1BSRUFNQkxFKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUHJlYW1ibGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVTaG9ydCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFByZWFtYmxlOworICAgICAgICAgICAgICAgICAgICBNbG1lU2V0VHhQcmVhbWJsZShwQWRhcHRlciwgUnQ4MDJfMTFQcmVhbWJsZVNob3J0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVMb25nKSB8fCAoUHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZUF1dG8pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdXNlciB3YW50cyBBVVRPLCBpbml0aWFsaXplIHRvIExPTkcgaGVyZSwgdGhlbiBjaGFuZ2UgYWNjb3JkaW5nIHRvIEFQJ3MKKyAgICAgICAgICAgICAgICAgICAgLy8gY2FwYWJpbGl0eSB1cG9uIGFzc29jaWF0aW9uLgorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPSBQcmVhbWJsZTsKKyAgICAgICAgICAgICAgICAgICAgTWxtZVNldFR4UHJlYW1ibGUocEFkYXB0ZXIsIFJ0ODAyXzExUHJlYW1ibGVMb25nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9QUkVBTUJMRSAoPSVkKVxuIiwgUHJlYW1ibGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfV0VQX1NUQVRVUzoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX1dFUF9TVEFUVVMpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZXZXBTdGF0dXMsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgLy8gU2luY2UgVEtJUCwgQUVTLCBXRVAgYXJlIGFsbCBzdXBwb3J0ZWQuIEl0IHNob3VsZCBub3QgaGF2ZSBhbnkgaW52YWxpZCBzZXR0aW5nCisgICAgICAgICAgICAgICAgaWYgKFdlcFN0YXR1cyA8PSBOZGlzODAyXzExRW5jcnlwdGlvbjNLZXlBYnNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgIT0gV2VwU3RhdHVzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25maWcgaGFzIGNoYW5nZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgICAgID0gV2VwU3RhdHVzOworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBXZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IFdlcFN0YXR1czsKKyAgICAgICAgICAgICAgICAJcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciAgID0gV2VwU3RhdHVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9XRVBfU1RBVFVTICg9JWQpXG4iLFdlcFN0YXR1cykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkF1dGhNb2RlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChBdXRoTW9kZSA+IE5kaXM4MDJfMTFBdXRoTW9kZU1heCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gQXV0aE1vZGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbmZpZyBoYXMgY2hhbmdlZAorICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gQXV0aE1vZGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgKD0lZCkgXG4iLHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfSU5GUkFTVFJVQ1RVUkVfTU9ERToKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZCc3NUeXBlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJCQkJaWYgKEJzc1R5cGUgPT0gTmRpczgwMl8xMUlCU1MpCisJCQkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiQWRob2MiKTsKKwkJCQllbHNlIGlmIChCc3NUeXBlID09IE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZSkKKwkJCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJJbmZyYSIpOworCQkJCWVsc2UgaWYgKEJzc1R5cGUgPT0gTmRpczgwMl8xMU1vbml0b3IpCisJCQkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiTW9uaXRvciIpOworCQkJCWVsc2UKKwkJCQl7CisJCQkJCVN0YXR1cyAgPSAtRUlOVkFMOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfSU5GUkFTVFJVQ1RVUkVfTU9ERSAodW5rbm93bilcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkgY2FzZSBPSURfODAyXzExX1JFTU9WRV9XRVA6CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUkVNT1ZFX1dFUFxuIikpOworICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfS0VZX0lOREVYKSkKKyAgICAgICAgICAgIHsKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworCQkJCUtleUlkeCA9ICooTkRJU184MDJfMTFfS0VZX0lOREVYICopIHdycS0+dS5kYXRhLnBvaW50ZXI7CisKKwkJCQlpZiAoS2V5SWR4ICYgMHg4MDAwMDAwMCkKKwkJCQl7CisJCQkJCS8vIFNob3VsZCBuZXZlciBzZXQgZGVmYXVsdCBiaXQgd2hlbiByZW1vdmUga2V5CisJCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUtleUlkeCA9IEtleUlkeCAmIDB4MGZmZmZmZmY7CisJCQkJCWlmIChLZXlJZHggPj0gNCl7CisJCQkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9IDA7CisJCQkJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJCQkJCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIDAsIChVQ0hBUilLZXlJZHgpOworCQkJCQl9CisJCQkJfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9SRVNFVF9DT1VOVEVSUzoKKyAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWRhcHRlci0+V2xhbkNvdW50ZXJzLCBzaXplb2YoQ09VTlRFUl84MDJfMTEpKTsKKyAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWRhcHRlci0+Q291bnRlcnM4MDIzLCBzaXplb2YoQ09VTlRFUl84MDJfMykpOworICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkoJnBBZGFwdGVyLT5SYWxpbmtDb3VudGVycywgc2l6ZW9mKENPVU5URVJfUkFMSU5LKSk7CisgICAgICAgICAgICBwQWRhcHRlci0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXIgICA9IDA7CisJCQlwQWRhcHRlci0+Q291bnRlcnM4MDIzLkdvb2RSZWNlaXZlcyA9IDA7CisJCQlwQWRhcHRlci0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXIgICA9IDA7CisjaWZkZWYgUlQyODcwCisJCQlwQWRhcHRlci0+QnVsa091dENvbXBsZXRlCT0gMDsKKwkJCXBBZGFwdGVyLT5CdWxrT3V0Q29tcGxldGVPdGhlcj0gMDsKKwkJCXBBZGFwdGVyLT5CdWxrT3V0Q29tcGxldGVDYW5jZWwgPSAwOworCQkJcEFkYXB0ZXItPkJ1bGtPdXRSZXEgPSAwOworCQkJcEFkYXB0ZXItPkJ1bGtJblJlcT0gMDsKKwkJCXBBZGFwdGVyLT5CdWxrSW5Db21wbGV0ZSA9IDA7CisJCQlwQWRhcHRlci0+QnVsa0luQ29tcGxldGVGYWlsID0gMDsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9SRVNFVF9DT1VOVEVSUyBcbiIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX1JUU19USFJFU0hPTEQpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZSdHNUaHJlc2gsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKFJ0c1RocmVzaCA+IE1BWF9SVFNfVEhSRVNIT0xEKQorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUnRzVGhyZXNob2xkID0gKFVTSE9SVClSdHNUaHJlc2g7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRCAoPSVsZClcbiIsUnRzVGhyZXNoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZGcmFnVGhyZXNoLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9IEZBTFNFOworICAgICAgICAgICAgICAgIGlmIChGcmFnVGhyZXNoID4gTUFYX0ZSQUdfVEhSRVNIT0xEIHx8IEZyYWdUaHJlc2ggPCBNSU5fRlJBR19USFJFU0hPTEQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoRnJhZ1RocmVzaCA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gTUFYX0ZSQUdfVEhSRVNIT0xEOworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gKFVTSE9SVClGcmFnVGhyZXNoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEICg9JWxkKSBcbiIsRnJhZ1RocmVzaCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9QT1dFUl9NT0RFOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfUE9XRVJfTU9ERSkpCisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUG93ZXJNb2RlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChQb3dlck1vZGUgPT0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTSkKKyAgICAgICAgICAgICAgICAJU2V0X1BTTW9kZV9Qcm9jKHBBZGFwdGVyLCAiQ0FNIik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoUG93ZXJNb2RlID09IE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQKQorICAgICAgICAgICAgICAgIAlTZXRfUFNNb2RlX1Byb2MocEFkYXB0ZXIsICJNYXhfUFNQIik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoUG93ZXJNb2RlID09IE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUCkKKwkJCQkJU2V0X1BTTW9kZV9Qcm9jKHBBZGFwdGVyLCAiRmFzdF9QU1AiKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChQb3dlck1vZGUgPT0gTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1ApCisJCQkJCVNldF9QU01vZGVfUHJvYyhwQWRhcHRlciwgIkxlZ2FjeV9QU1AiKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUE9XRVJfTU9ERSAoPSVkKVxuIixQb3dlck1vZGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMXzE6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICA8IHNpemVvZihVTE9ORykpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUG93ZXJUZW1wLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCWlmIChQb3dlclRlbXAgPiAxMDApCisJCQkJCVBvd2VyVGVtcCA9IDB4ZmZmZmZmZmY7ICAvLyBBVVRPCisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdCA9IFBvd2VyVGVtcDsgLy9rZWVwIGN1cnJlbnQgc2V0dGluZy4KKwkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQ7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMXzEgKD0lbGQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlKSk7CisJCQl9CisJICAgICAgICBicmVhazsKKwkJY2FzZSBPSURfODAyXzExX05FVFdPUktfVFlQRV9JTl9VU0U6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJk5ldFR5cGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwkJCQlpZiAoTmV0VHlwZSA9PSBOZGlzODAyXzExRFMpCisJCQkJCVJUTVBTZXRQaHlNb2RlKHBBZGFwdGVyLCBQSFlfMTFCKTsKKwkJCQllbHNlIGlmIChOZXRUeXBlID09IE5kaXM4MDJfMTFPRkRNMjQpCisJCQkJCVJUTVBTZXRQaHlNb2RlKHBBZGFwdGVyLCBQSFlfMTFCR19NSVhFRCk7CisJCQkJZWxzZSBpZiAoTmV0VHlwZSA9PSBOZGlzODAyXzExT0ZETTUpCisJCQkJCVJUTVBTZXRQaHlNb2RlKHBBZGFwdGVyLCBQSFlfMTFBKTsKKwkJCQllbHNlCisJCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJaWYgKFN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCQlTZXRDb21tb25IVChwQWRhcHRlcik7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX05FVFdPUktfVFlQRV9JTl9VU0UgKD0lZClcbiIsTmV0VHlwZSkpOworCQkgICAgfQorCQkJYnJlYWs7CisgICAgICAgIC8vIEZvciBXUEEgUFNLIFBNSyBrZXkKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX0FERF9XUEE6CisgICAgICAgICAgICBwS2V5ID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmKHBLZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwS2V5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgaWYgKHBLZXktPkxlbmd0aCAhPSB3cnEtPnUuZGF0YS5sZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX0FERF9XUEEsIEZhaWxlZCEhXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgJiYKKwkJCQkgICAgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgJiYKKwkJCQkgICAgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVPUE5PVFNVUFA7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9BRERfV1BBLCBGYWlsZWQhISBbQXV0aE1vZGUgIT0gV1BBUFNLL1dQQTJQU0svV1BBTk9ORV1cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAorCQkJCQkJIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spIHx8CisJCQkJCQkgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkgKSAgICAgLy8gT25seSBmb3IgV1BBIFBTSyBtb2RlCisJCQkJeworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLlBNSywgJnBLZXktPktleU1hdGVyaWFsLCBwS2V5LT5LZXlMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAvLyBVc2UgUmFDb25maWcgYXMgUFNLIGFnZW50LgorICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCBTVEEgc3VwcGxpY2FudCBzdGF0ZSBtYWNoaW5lCisgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfU1RBUlQ7CisKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX0FERF9XUEEgKGlkPTB4JXgsIExlbj0lZC1ieXRlKVxuIiwgcEtleS0+S2V5SW5kZXgsIHBLZXktPktleUxlbmd0aCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfQUREX1dQQSAoaWQ9MHgleCwgTGVuPSVkLWJ5dGUpXG4iLCBwS2V5LT5LZXlJbmRleCwgcEtleS0+S2V5TGVuZ3RoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAga2ZyZWUocEtleSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1JFTU9WRV9LRVk6CisgICAgICAgICAgICBwUmVtb3ZlS2V5ID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmKHBSZW1vdmVLZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwUmVtb3ZlS2V5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgaWYgKHBSZW1vdmVLZXktPkxlbmd0aCAhPSB3cnEtPnUuZGF0YS5sZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9LRVksIEZhaWxlZCEhXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUlRNUFdQQVJlbW92ZUtleVByb2MocEFkYXB0ZXIsIHBSZW1vdmVLZXkpOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUkVNT1ZFX0tFWSwgUmVtb3ZlIFdQQSBLZXkhIVxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBLZXlJZHggPSBwUmVtb3ZlS2V5LT5LZXlJbmRleDsKKworICAgICAgICAgICAgICAgICAgICBpZiAoS2V5SWR4ICYgMHg4MDAwMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2hvdWxkIG5ldmVyIHNldCBkZWZhdWx0IGJpdCB3aGVuIHJlbW92ZSBrZXkKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9LRVksIEZhaWxlZCEhKFNob3VsZCBuZXZlciBzZXQgZGVmYXVsdCBiaXQgd2hlbiByZW1vdmUga2V5KVxuIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgS2V5SWR4ID0gS2V5SWR4ICYgMHgwZmZmZmZmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChLZXlJZHggPiAzKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfS0VZLCBGYWlsZWQhIShLZXlJZFslZF0gb3V0IG9mIHJhbmdlKVxuIiwgS2V5SWR4KSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwgMCwgKFVDSEFSKUtleUlkeCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9LRVkgKGlkPTB4JXgsIExlbj0lZC1ieXRlKVxuIiwgcFJlbW92ZUtleS0+S2V5SW5kZXgsIHBSZW1vdmVLZXktPkxlbmd0aCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAga2ZyZWUocFJlbW92ZUtleSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLy8gTmV3IGZvciBXUEEKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0FERF9LRVk6CisgICAgICAgICAgICBwS2V5ID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmKHBLZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocEtleSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChwS2V5LT5MZW5ndGggIT0gd3JxLT51LmRhdGEubGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfS0VZLCBGYWlsZWQhIVxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJUTVBBZGRLZXkocEFkYXB0ZXIsIHBLZXkpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfS0VZIChpZD0weCV4LCBMZW49JWQtYnl0ZSlcbiIsIHBLZXktPktleUluZGV4LCBwS2V5LT5LZXlMZW5ndGgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtmcmVlKHBLZXkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfQ09ORklHVVJBVElPTikpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkNvbmZpZywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBwQ29uZmlnID0gJkNvbmZpZzsKKworICAgICAgICAgICAgICAgIGlmICgocENvbmZpZy0+QmVhY29uUGVyaW9kID49IDIwKSAmJiAocENvbmZpZy0+QmVhY29uUGVyaW9kIDw9NDAwKSkKKyAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQmVhY29uUGVyaW9kID0gKFVTSE9SVCkgcENvbmZpZy0+QmVhY29uUGVyaW9kOworCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUFjdGl2ZS5BdGltV2luID0gKFVTSE9SVCkgcENvbmZpZy0+QVRJTVdpbmRvdzsKKyAgICAgICAgICAgICAgICBNQVBfS0haX1RPX0NIQU5ORUxfSUQocENvbmZpZy0+RFNDb25maWcsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCk7CisgICAgICAgICAgICAgICAgLy8KKwkJCQkvLyBTYXZlIHRoZSBjaGFubmVsIG9uIE1sbWVBdXggZm9yIENudGxPaWRSVEJzc2lkUHJvYyB1c2VkLgorCQkJCS8vCisJCQkJcEFkYXB0ZXItPk1sbWVBdXguQ2hhbm5lbCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbDsKKworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OIChCZWFjblBlcmlvZD0lbGQsQXRpbVc9JWxkLENoPSVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgcENvbmZpZy0+QmVhY29uUGVyaW9kLCBwQ29uZmlnLT5BVElNV2luZG93LCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKyAgICAgICAgICAgICAgICAvLyBDb25maWcgaGFzIGNoYW5nZWQKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfSFRfUEhZTU9ERToKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGgJIT0gc2l6ZW9mKE9JRF9TRVRfSFRfUEhZTU9ERSkpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCSAgICBQT0lEX1NFVF9IVF9QSFlNT0RFCXBIVFBoeU1vZGUgPSAmSFRfUGh5TW9kZTsKKworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZIVF9QaHlNb2RlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6cEhUUGh5TW9kZQkoUGh5TW9kZSA9ICVkLFRyYW5zbWl0Tm8gPSAlZCwgSHRNb2RlID0JJWQsCUV4dE9mZnNldCA9CSVkICwgTUNTID0gJWQsIEJXID0JJWQsCVNUQkMgPSAlZCwgU0hPUlRHSSA9ICVkKSBcbiIsCisJCQkJcEhUUGh5TW9kZS0+UGh5TW9kZSwgcEhUUGh5TW9kZS0+VHJhbnNtaXRObyxwSFRQaHlNb2RlLT5IdE1vZGUscEhUUGh5TW9kZS0+RXh0T2Zmc2V0LAorCQkJCXBIVFBoeU1vZGUtPk1DUywgcEhUUGh5TW9kZS0+QlcsIHBIVFBoeU1vZGUtPlNUQkMsCXBIVFBoeU1vZGUtPlNIT1JUR0kpKTsKKwkJCQlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlCT49IFBIWV8xMUFCR05fTUlYRUQpCisJCQkJCVJUTVBTZXRIVChwQWRhcHRlciwJcEhUUGh5TW9kZSk7CisJCQl9CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX0hUX1BIWU1PREUoTUNTPSVkLEJXPSVkLFNHST0lZCxTVEJDPSVkKVxuIiwKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MsIHBBZGFwdGVyLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLkJXLCBwQWRhcHRlci0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJLAorCQkJCXBBZGFwdGVyLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNUQkMpKTsKKwkJCWJyZWFrOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX0FQU0RfU0VUVElORzoKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVMT05HKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVVMT05HIGFwc2QgOworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZhcHNkLCB3cnEtPnUuZGF0YS5wb2ludGVyLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJCQkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJfEIzMX5CNwl8CUI2fkI1CSB8CSBCNAkgfAkgQjMJIHwJQjIJIHwJQjEJIHwJICAgQjAJCXwKKwkJCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQl8IFJzdmQJfCBNYXggU1AgTGVuIHwgQUNfVk8gfCBBQ19WSSB8IEFDX0JLIHwgQUNfQkUgfCBBUFNECUNhcGFibGUJfAorCQkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgPSAoYXBzZCAmIDB4MDAwMDAwMDEpID8gVFJVRSA6CUZBTFNFOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CRSA9ICgoYXBzZAkmIDB4MDAwMDAwMDIpID4+IDEpCT8gVFJVRSA6IEZBTFNFOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CSyA9ICgoYXBzZAkmIDB4MDAwMDAwMDQpID4+IDIpCT8gVFJVRSA6IEZBTFNFOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WSSA9ICgoYXBzZAkmIDB4MDAwMDAwMDgpID4+IDMpCT8gVFJVRSA6IEZBTFNFOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WTyA9ICgoYXBzZAkmIDB4MDAwMDAwMTApID4+IDQpCT8gVFJVRSA6IEZBTFNFOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuTWF4U1BMZW5ndGgJPSAoVUNIQVIpKChhcHNkCSYgMHgwMDAwMDA2MCkgPj4gNSk7CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX0FQU0RfU0VUVElORyAoYXBzZD0weCVseCwgQVBTRENhcD0lZCwgW0JFLEJLLFZJLFZPXT1bJWQvJWQvJWQvJWRdLAlNYXhTUExlbj0lZClcbiIsIGFwc2QsIHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlLAorCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUsCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CSywJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZJLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8sCXBBZGFwdGVyLT5Db21tb25DZmcuTWF4U1BMZW5ndGgpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfQVBTRF9QU006CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoCSE9IHNpemVvZihVTE9ORykpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBEcml2ZXIgbmVlZHMJdG8gbm90aWZ5IEFQIHdoZW4gUFNNIGNoYW5nZXMKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCWlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUJIT0gcEFkYXB0ZXItPlN0YUNmZy5Qc20pCisJCQkJeworCQkJCQlNbG1lU2V0UHNtQml0KHBBZGFwdGVyLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpOworCQkJCQlSVE1QU2VuZE51bGxGcmFtZShwQWRhcHRlciwJcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFJhdGUsCVRSVUUpOworCQkJCX0KKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX0FQU0RfUFNNIChiQVBTREZvcmNlUG93ZXJTYXZlOiVkKVxuIiwJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlKSk7CisJCQl9CisJCQlicmVhazsKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9ETFM6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVTE9ORykpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlCT09MRUFOCW9sZHZhbHVlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5iRExTQ2FwYWJsZTsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmcEFkYXB0ZXItPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlpZiAob2xkdmFsdWUgJiYJIXBBZGFwdGVyLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJCQkJeworCQkJCQlpbnQJaTsKKwkJCQkJLy8gdGVhcglkb3duIGxvY2FsIGRscyB0YWJsZSBlbnRyeQorCQkJCQlmb3IJKGk9MDsgaTxNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCisJCQkJCXsKKwkJCQkJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSkKKwkJCQkJCXsKKwkJCQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOworCQkJCQkJCXBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQkJCQlSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUocEFkYXB0ZXIsIHBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQkvLyB0ZWFyCWRvd24gcGVlciBkbHMgdGFibGUJZW50cnkKKwkJCQkJZm9yCShpPU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwkJCQkJeworCQkJCQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpKQorCQkJCQkJeworCQkJCQkJCXBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQkJCQkJcEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJCQkJCVJUTVBTZW5kRExTVGVhckRvd25GcmFtZShwQWRhcHRlciwgcEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9ETFMgKD0lZClcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuYkRMU0NhcGFibGUpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfRExTX1BBUkFNOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aAkhPSBzaXplb2YoUlRfODAyXzExX0RMU19VSSkpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlSVF84MDJfMTFfRExTCURsczsKKworCQkJCU5kaXNaZXJvTWVtb3J5KCZEbHMsIHNpemVvZihSVF84MDJfMTFfRExTKSk7CisJCQkJUlRNUE1vdmVNZW1vcnkoJkRscywgd3JxLT51LmRhdGEucG9pbnRlciwgc2l6ZW9mKFJUXzgwMl8xMV9ETFNfVUkpKTsKKwkJCQlNbG1lRW5xdWV1ZShwQWRhcHRlciwKKwkJCQkJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCQkJCQlSVF9PSURfODAyXzExX1NFVF9ETFNfUEFSQU0sCisJCQkJCQkJc2l6ZW9mKFJUXzgwMl8xMV9ETFMpLAorCQkJCQkJCSZEbHMpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9ETFNfUEFSQU0gXG4iKSk7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9XTU06CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoCSE9IHNpemVvZihCT09MRUFOKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZwQWRhcHRlci0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfV01NICg9JWQpCVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSkpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0RJU0FTU09DSUFURToKKyNpZmRlZiBSQUxJTktfQVRFCisJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUaGUgZHJpdmVyIGlzIGluIEFURSBtb2RlIG5vd1xuIikpOworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwkJCS8vCisJCQkvLyBTZXQgTmRpc1JhZGlvU3RhdGVPZmYgdG8JVFJVRSwgaW5zdGVhZCBvZiBjYWxsZWQJTWxtZVJhZGlvT2ZmLgorCQkJLy8gTGF0ZXIgb24sIE5ESVNfODAyXzExX0JTU0lEX0xJU1RfRVgtPk51bWJlck9mSXRlbXMgc2hvdWxkIGJlCTAKKwkJCS8vIHdoZW4JcXVlcnkgT0lEXzgwMl8xMV9CU1NJRF9MSVNULgorCQkJLy8KKwkJCS8vIFRSVUU6ICBOdW1iZXJPZkl0ZW1zCXdpbGwgc2V0IHRvCTAuCisJCQkvLyBGQUxTRTogTnVtYmVyT2ZJdGVtcwlubyBjaGFuZ2UuCisJCQkvLworCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5OZGlzUmFkaW9TdGF0ZU9mZiA9CVRSVUU7CisJCQkvLyBTZXQgdG8gaW1tZWRpYXRlbHkgc2VuZCB0aGUgbWVkaWEgZGlzY29ubmVjdAlldmVudAorCQkJcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMJPSBUUlVFOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0RJU0FTU09DSUFURQlcbiIpKTsKKworCQkJaWYgKElORlJBX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQlpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9CUNOVExfSURMRSkKKwkJCQl7CisJCQkJCVJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRQlidXN5LCByZXNldAlNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7CisJCQkJfQorCisJCQkJTWxtZUVucXVldWUocEFkYXB0ZXIsCisJCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJCQlPSURfODAyXzExX0RJU0FTU09DSUFURSwKKwkJCQkJMCwKKwkJCQkJTlVMTCk7CisKKwkJCQlTdGF0ZU1hY2hpbmVUb3VjaGVkCT0gVFJVRTsKKwkJCX0KKwkJCWJyZWFrOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfSU1NRV9CQV9DQVA6CisJCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoT0lEX0JBQ0FQX1NUUlVDKSkKKwkJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCQllbHNlCisJCQkJeworCQkJCQlPSURfQkFDQVBfU1RSVUMgT3JkZSA7CisJCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZPcmRlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCQlpZiAoT3JkZS5Qb2xpY3kgPiBCQV9OT1RVU0UpCisJCQkJCXsKKwkJCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQTsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChPcmRlLlBvbGljeSA9PSBCQV9OT1RVU0UpCisJCQkJCXsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSA9IEJBX05PVFVTRTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlID0gT3JkZS5BbXNkdUVuYWJsZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZT0gT3JkZS5BbXNkdVNpemU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHM9IE9yZGUuTU1QU21vZGU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSA9IE9yZGUuTU1QU21vZGU7CisJCQkJCQkvLyBVUGRhdGEgdG8gSFQgSUUKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHMgPSBPcmRlLk1NUFNtb2RlOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZSA9IE9yZGUuQW1zZHVTaXplOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IE9yZGUuQXV0b0JBOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID0gSU1NRURfQkE7IC8vIHdlIG9ubHkgc3VwcG9ydCBpbW1lZGlhdGUgQkEuCisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdUVuYWJsZSA9IE9yZGUuQW1zZHVFbmFibGU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemU9IE9yZGUuQW1zZHVTaXplOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWltb1BzID0gT3JkZS5NTVBTbW9kZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gT3JkZS5NTVBTbW9kZTsKKworCQkJCQkJLy8gVVBkYXRhIHRvIEhUIElFCisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzID0gT3JkZS5NTVBTbW9kZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemUgPSBPcmRlLkFtc2R1U2l6ZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7CisKKwkJCQkJCWlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPiBNQVhfUlhfUkVPUkRFUkJVRikKKwkJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSBNQVhfUlhfUkVPUkRFUkJVRjsKKworCQkJCQl9CisKKwkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkud29yZCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LndvcmQ7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6KE9yZGUuQXV0b0JBID0gJWQpIChQb2xpY3k9JWQpKFJlQkFXaW5MaW1pdD0lZCkoVHhCQVdpbkxpbWl0PSVkKShBdXRvTW9kZT0lZClcbiIsT3JkZS5BdXRvQkEsIHBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSwKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCxwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5UeEJBV2luTGltaXQsIHBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSkpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OihNaW1vUHMgPSAlZCkoQW1zZHVFbmFibGUgPSAlZCkgKEFtc2R1U2l6ZT0lZCkoTXBkdURlbnNpdHk9JWQpXG4iLHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QcywgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUsCisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemUsIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5KSk7CisJCQkJfQorCisJCQkJYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9BRERfSU1NRV9CQToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBTZXQgOjogUlRfT0lEXzgwMl8xMV9BRERfSU1NRV9CQSBcbiIpKTsKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE9JRF9BRERfQkFfRU5UUlkpKQorCQkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVVDSEFSCQkgICAgICAgIGluZGV4OworCQkJCU9JRF9BRERfQkFfRU5UUlkgICAgQkE7CisJCQkJTUFDX1RBQkxFX0VOVFJZICAgICAqcEVudHJ5OworCisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkJBLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCWlmIChCQS5USUQgPiAxNSkKKwkJCQl7CisJCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8vQkFUYWJsZUluc2VydEVudHJ5CisJCQkJCS8vQXMgYWQtaG9jIG1vZGUsIEJBIHBhaXIgaXMgbm90IGxpbWl0ZWQgdG8gb25seSBCU1NJRC4gc28gYWRkIHZpYSBPSUQuCisJCQkJCWluZGV4ID0gQkEuVElEOworCQkJCQkvLyBpbiBhZCBob2MgbW9kZSwgd2hlbiBhZGRpbmcgQkEgcGFpciwgd2Ugc2hvdWxkIGluc2VydCB0aGlzIGVudHJ5IGludG8gTUFDRW50cnkgdG9vCisJCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZGFwdGVyLCBCQS5NQUNBZGRyKTsKKwkJCQkJaWYgKCFwRW50cnkpCisJCQkJCXsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUX09JRF84MDJfMTFfQUREX0lNTUVfQkEuIGJyZWFrIG9uIG5vIGNvbm5lY3Rpb24uLS0tLToleDoleFxuIiwgQkEuTUFDQWRkcls0XSwgQkEuTUFDQWRkcls1XSkpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJaWYgKEJBLklzUmVjaXBpZW50ID09IEZBTFNFKQorCQkJCQl7CisJCQkJCSAgICBpZiAocEVudHJ5LT5iSUFtQmFkQXRoZXJvcyA9PSBUUlVFKQorCQkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IDB4MTA7CisKKwkJCQkJCUJBT3JpU2Vzc2lvblNldFVwKHBBZGFwdGVyLCBwRW50cnksIGluZGV4LCAwLCAxMDAsIFRSVUUpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJLy9CQVRhYmxlSW5zZXJ0RW50cnkocEFkYXB0ZXIsIHBFbnRyeS0+QWlkLCBCQS5NQUNBZGRyLCAwLCAweGZmZmYsIEJBLlRJRCwgQkEubk1TRFUsIEJBLklzUmVjaXBpZW50KTsKKwkJCQkJfQorCisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9BRERfSU1NRV9CQS4gUmVjID0gJWQuIE1hYyA9ICV4OiV4OiV4OiV4OiV4OiV4IC4gXG4iLAorCQkJCQkJQkEuSXNSZWNpcGllbnQsIEJBLk1BQ0FkZHJbMF0sIEJBLk1BQ0FkZHJbMV0sIEJBLk1BQ0FkZHJbMl0sIEJBLk1BQ0FkZHJbMl0KKwkJCQkJCSwgQkEuTUFDQWRkcls0XSwgQkEuTUFDQWRkcls1XSkpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9URUFSX0lNTUVfQkE6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQgOjogUlRfT0lEXzgwMl8xMV9URUFSX0lNTUVfQkEgXG4iKSk7CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihPSURfQUREX0JBX0VOVFJZKSkKKwkJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlQT0lEX0FERF9CQV9FTlRSWQlwQkE7CisJCQkJTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7CisKKwkJCQlwQkEgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgTUVNX0FMTE9DX0ZMQUcpOworCisJCQkJaWYgKHBCQSA9PSBOVUxMKQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IDo6IFJUX09JRF84MDJfMTFfVEVBUl9JTU1FX0JBIGttYWxsb2MoKSBjYW4ndCBhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5XG4iKSk7CisJCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBCQSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IDo6IFJUX09JRF84MDJfMTFfVEVBUl9JTU1FX0JBKFRJRD0lZCwgYkFsbFRpZD0lZClcbiIsIHBCQS0+VElELCBwQkEtPmJBbGxUaWQpKTsKKworCQkJCQlpZiAoIXBCQS0+YkFsbFRpZCAmJiAocEJBLT5USUQgPiBOVU1fT0ZfVElEKSkKKwkJCQkJeworCQkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQlpZiAocEJBLT5Jc1JlY2lwaWVudCA9PSBGQUxTRSkKKwkJCQkJeworCQkJCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkYXB0ZXIsIHBCQS0+TUFDQWRkcik7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgcEJBLT5Jc1JlY2lwaWVudCA9PSBGQUxTRVxuIikpOworCQkJCQkJaWYgKHBFbnRyeSkKKwkJCQkJCXsKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgcEJBLT5wRW50cnlcbiIpKTsKKwkJCQkJCQlCQU9yaVNlc3Npb25UZWFyRG93bihwQWRhcHRlciwgcEVudHJ5LT5BaWQsIHBCQS0+VElELCBGQUxTRSwgVFJVRSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IDo6IE5vdCBmb3VuZCBwRW50cnkgXG4iKSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWRhcHRlciwgcEJBLT5NQUNBZGRyKTsKKwkJCQkJCWlmIChwRW50cnkpCisJCQkJCQl7CisJCQkJCQkJQkFSZWNTZXNzaW9uVGVhckRvd24oIHBBZGFwdGVyLCAoVUNIQVIpcEVudHJ5LT5BaWQsIHBCQS0+VElELCBUUlVFKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQgOjogTm90IGZvdW5kIHBFbnRyeSBcbiIpKTsKKwkJCQkJfQorCQkJCQlrZnJlZShwQkEpOworCQkJCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisgICAgICAgIC8vIEZvciBXUEFfU1VQUExJQ0FOVCB0byBzZXQgc3RhdGljIHdlcCBrZXkKKyAgICAJY2FzZSBPSURfODAyXzExX0FERF9XRVA6CisgICAgCSAgICBwV2VwS2V5ID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKworICAgIAkgICAgaWYocFdlcEtleSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FTk9NRU07CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9XRVAsIEZhaWxlZCEhXG4iKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwV2VwS2V5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgaWYgKFN0YXR1cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX1dFUCwgRmFpbGVkIChsZW5ndGggbWlzbWF0Y2gpISFcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKwkJICAgICAgICBLZXlJZHggPSBwV2VwS2V5LT5LZXlJbmRleCAmIDB4MGZmZmZmZmY7CisgICAgICAgICAgICAgICAgLy8gS2V5SWR4IG11c3QgYmUgMCB+IDMKKyAgICAgICAgICAgICAgICBpZiAoS2V5SWR4ID4gNCkKKyAgICAJCQl7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX1dFUCwgRmFpbGVkIChLZXlJZHggbXVzdCBiZSBzbWFsbGVyIHRoYW4gNCkhIVxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBVQ0hBUiBDaXBoZXJBbGcgPSAwOworICAgICAgICAgICAgICAgICAgICBQVUNIQVIgS2V5OworCisgICAgICAgICAgICAgICAgICAgIC8vIHNldCBrZXkgbWF0ZXJpYWwgYW5kIGtleSBsZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleSwgMTYpOworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID0gKFVDSEFSKSBwV2VwS2V5LT5LZXlMZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXksICZwV2VwS2V5LT5LZXlNYXRlcmlhbCwgcFdlcEtleS0+S2V5TGVuZ3RoKTsKKworICAgICAgICAgICAgICAgICAgICBzd2l0Y2gocFdlcEtleS0+S2V5TGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX1dFUCwgb25seSBzdXBwb3J0IENJUEhFUl9XRVA2NChsZW46NSkgJiBDSVBIRVJfV0VQMTI4KGxlbjoxMykhIVxuIikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworICAgICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IGtleSBmb3IgdHggKHNoYXJlZCBrZXkpCisgICAgICAgICAgICAgICAgICAgIGlmIChwV2VwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApCisgICAgICAgICAgICAgICAgICAgIHsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQga2V5IG1hdGVyaWFsIGFuZCBrZXkgbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtLZXlJZHhdLktleSwgMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbS2V5SWR4XS5LZXlMZW4gPSAoVUNIQVIpIHBXZXBLZXktPktleUxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W0tleUlkeF0uS2V5LCAmcFdlcEtleS0+S2V5TWF0ZXJpYWwsIHBXZXBLZXktPktleUxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleUlkID0gS2V5SWR4OworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbS2V5SWR4XS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAoVUNIQVIpIEtleUlkeDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCQkJCQlpZiAoKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpICYmCisJCQkJCQkocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpKQorCQkJCQl7CisJCQkJCQlLZXkgPSBwV2VwS2V5LT5LZXlNYXRlcmlhbDsKKworCQkJCQkJLy8gU2V0IEdyb3VwIGtleSBtYXRlcmlhbCB0byBBc2ljCisgICAgCQkJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIEJTUzAsIEtleUlkeCwgQ2lwaGVyQWxnLCBLZXksIE5VTEwsIE5VTEwpOworCisJCQkJCQkvLyBVcGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlIGZvciB0aGlzIGdyb3VwIGtleSB0YWJsZQorCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwgQlNTMCwgS2V5SWR4LCBDaXBoZXJBbGcsIE5VTEwpOworCisJCQkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKworICAgICAgICAJCQkJLy8gSW5kaWNhdGUgQ29ubmVjdGVkIGZvciBHVUkKKyAgICAgICAgCQkJCXBBZGFwdGVyLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKwkJCQkJfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgS2V5ID0gcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIHRvIEFzaWMKKyAgICAgICAgCQkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwgQlNTMCwgS2V5SWR4LCBDaXBoZXJBbGcsIEtleSwgTlVMTCwgTlVMTCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwV2VwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgPSAmcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFzc2lnbiBncm91cCBrZXkgaW5mbworICAgIAkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkYXB0ZXIsIEJTUzAsIEtleUlkeCwgQ2lwaGVyQWxnLCBOVUxMKTsKKyAgICAJCQkJCQkvLyBBc3NpZ24gcGFpcndpc2Uga2V5IGluZm8KKyAgICAJCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZGFwdGVyLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgcEVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX1dFUCAoaWQ9MHgleCwgTGVuPSVkLWJ5dGUpLCAlc1xuIiwgcFdlcEtleS0+S2V5SW5kZXgsIHBXZXBLZXktPktleUxlbmd0aCwgKHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQpID8gIlBvcnQgU2VjdXJlZCI6IlBvcnQgTk9UIFNlY3VyZWQiKSk7CisJCQkJfQorICAgICAgICAgICAgfQorICAgICAgICAgICAga2ZyZWUocFdlcEtleSk7CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJICAgIGNhc2UgT0lEX1NFVF9DT1VOVEVSTUVBU1VSRVM6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihpbnQpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBlbmFibGVkID0gMDsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmZW5hYmxlZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoZW5hYmxlZCA9PSAxKQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJCbG9ja0Fzc29jID0gVFJVRTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIC8vIFdQQSBNSUMgZXJyb3Igc2hvdWxkIGJsb2NrIGFzc29jaWF0aW9uIGF0dGVtcHQgZm9yIDYwIHNlY29uZHMKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iQmxvY2tBc3NvYyA9IEZBTFNFOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEX1NFVF9DT1VOVEVSTUVBU1VSRVMgYkJsb2NrQXNzb2M9JXNcbiIsIHBBZGFwdGVyLT5TdGFDZmcuYkJsb2NrQXNzb2MgPyAiVFJVRSI6IkZBTFNFIikpOworICAgICAgICAgICAgfQorCSAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQ6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVQ0hBUikpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJndwYV9zdXBwbGljYW50X2VuYWJsZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAJCQlwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IHdwYV9zdXBwbGljYW50X2VuYWJsZTsKKyAgICAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUICg9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkpOworCQkJfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9ERUFVVEhFTlRJQ0FUSU9OOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCAgICAgICpwSW5mbzsKKwkJCQlNTE1FX1FVRVVFX0VMRU0gKk1zZ0VsZW0gPSAoTUxNRV9RVUVVRV9FTEVNICopIGttYWxsb2Moc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSksIE1FTV9BTExPQ19GTEFHKTsKKworICAgICAgICAgICAgICAgIHBJbmZvID0gKE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QgKikgTXNnRWxlbS0+TXNnOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBJbmZvLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIE1sbWVEZWF1dGhSZXFBY3Rpb24ocEFkYXB0ZXIsIE1zZ0VsZW0pOworCQkJCWtmcmVlKE1zZ0VsZW0pOworCisgICAgICAgICAgICAgICAgaWYgKElORlJBX09OKHBBZGFwdGVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIExpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfREVBVVRIRU5USUNBVElPTiAoUmVhc29uPSVkKVxuIiwgcEluZm8tPlJlYXNvbikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9EUk9QX1VORU5DUllQVEVEOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoaW50KSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgZW5hYmxlZCA9IDA7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmVuYWJsZWQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKGVuYWJsZWQgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwkJCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWRhcHRlci0+TWFjVGFiTG9jayk7CisJCQkJcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBvcnRTZWN1cmVkID0gcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZDsKKwkJCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWRhcHRlci0+TWFjVGFiTG9jayk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0RST1BfVU5FTkNSWVBURUQgKD0lZClcbiIsIGVuYWJsZWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfU0VUX0lFRUU4MDIxWDoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKEJPT0xFQU4pKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZJRUVFODAyMXhTdGF0ZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxWCA9IElFRUU4MDIxeFN0YXRlOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9TRVRfSUVFRTgwMjFYICg9JWQpXG4iLCBJRUVFODAyMXhTdGF0ZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9TRVRfSUVFRTgwMjFYX1JFUVVJUkVfS0VZOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoQk9PTEVBTikpCisJCQkJIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZJRUVFODAyMXhfcmVxdWlyZWRfa2V5cywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxeF9yZXF1aXJlZF9rZXlzID0gSUVFRTgwMjF4X3JlcXVpcmVkX2tleXM7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1NFVF9JRUVFODAyMVhfUkVRVUlSRV9LRVkgKCVkKVxuIiwgSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMpKTsKKwkJCX0KKwkJCWJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfUE1LSUQ6CisJICAgICAgICBwUG1rSWQgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgTUVNX0FMTE9DX0ZMQUcpOworCisJICAgICAgICBpZihwUG1rSWQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FTk9NRU07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwUG1rSWQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwkgICAgICAgIC8vIGNoZWNrIHRoZSBQTUtJRCBpbmZvcm1hdGlvbgorCSAgICAgICAgaWYgKHBQbWtJZC0+QlNTSURJbmZvQ291bnQgPT0gMCkKKyAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLlNhdmVkUE1LLCBzaXplb2YoQlNTSURfSU5GTykqUE1LSURfTk8pOworCSAgICAgICAgZWxzZQorCSAgICAgICAgeworCQkgICAgICAgIFBCU1NJRF9JTkZPCXBCc3NJZEluZm87CisJCSAgICAgICAgVUlOVAkJQnNzSWR4OworCQkgICAgICAgIFVJTlQJCUNhY2hlZElkeDsKKworCQkgICAgICAgIGZvciAoQnNzSWR4ID0gMDsgQnNzSWR4IDwgcFBta0lkLT5CU1NJREluZm9Db3VudDsgQnNzSWR4KyspCisJCSAgICAgICAgeworCQkJICAgICAgICAvLyBwb2ludCB0byB0aGUgaW5kZXhlZCBCU1NJRF9JTkZPIHN0cnVjdHVyZQorCQkJICAgICAgICBwQnNzSWRJbmZvID0gKFBCU1NJRF9JTkZPKSAoKFBVQ0hBUikgcFBta0lkICsgMiAqIHNpemVvZihVSU5UKSArIEJzc0lkeCAqIHNpemVvZihCU1NJRF9JTkZPKSk7CisJCQkgICAgICAgIC8vIEZpbmQgdGhlIGVudHJ5IGluIHRoZSBzYXZlZCBkYXRhIGJhc2UuCisJCQkgICAgICAgIGZvciAoQ2FjaGVkSWR4ID0gMDsgQ2FjaGVkSWR4IDwgcEFkYXB0ZXItPlN0YUNmZy5TYXZlZFBNS051bTsgQ2FjaGVkSWR4KyspCisJCQkgICAgICAgIHsKKwkJCQkgICAgICAgIC8vIGNvbXBhcmUgdGhlIEJTU0lECisJCQkJICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBCc3NJZEluZm8tPkJTU0lELCBwQWRhcHRlci0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSUQsIHNpemVvZihORElTXzgwMl8xMV9NQUNfQUREUkVTUykpKQorCQkJCQkgICAgICAgIGJyZWFrOworCQkJICAgICAgICB9CisKKwkJCSAgICAgICAgLy8gRm91bmQsIHJlcGxhY2UgaXQKKwkJCSAgICAgICAgaWYgKENhY2hlZElkeCA8IFBNS0lEX05PKQorCQkJICAgICAgICB7CisJCQkJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgiVXBkYXRlIE9JRF84MDJfMTFfUE1LSUQsIGlkeCA9ICVkXG4iLCBDYWNoZWRJZHgpKTsKKwkJCQkgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZwQWRhcHRlci0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0sIHBCc3NJZEluZm8sIHNpemVvZihCU1NJRF9JTkZPKSk7CisJCQkJICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlNhdmVkUE1LTnVtKys7CisJCQkgICAgICAgIH0KKwkJCSAgICAgICAgLy8gTm90IGZvdW5kLCByZXBsYWNlIHRoZSBsYXN0IG9uZQorCQkJICAgICAgICBlbHNlCisJCQkgICAgICAgIHsKKwkJCQkgICAgICAgIC8vIFJhbmRvbWx5IHJlcGxhY2Ugb25lCisJCQkJICAgICAgICBDYWNoZWRJZHggPSAocEJzc0lkSW5mby0+QlNTSURbNV0gJSBQTUtJRF9OTyk7CisJCQkJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgiVXBkYXRlIE9JRF84MDJfMTFfUE1LSUQsIGlkeCA9ICVkXG4iLCBDYWNoZWRJZHgpKTsKKwkJCQkgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZwQWRhcHRlci0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0sIHBCc3NJZEluZm8sIHNpemVvZihCU1NJRF9JTkZPKSk7CisJCQkgICAgICAgIH0KKwkJICAgICAgICB9CisJCQl9CisJCQlpZihwUG1rSWQpCisJCQkJa2ZyZWUocFBta0lkKTsKKwkgICAgICAgIGJyZWFrOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCisKKyNpZmRlZiBTTk1QX1NVUFBPUlQKKwkJY2FzZSBPSURfODAyXzExX1NIT1JUUkVUUllMSU1JVDoKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVMT05HKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZTaG9ydFJldHJ5TGltaXQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOworCQkJCXR4X3J0eV9jZmcuZmllbGQuU2hvcnRSdHlMaW1pdCA9IFNob3J0UmV0cnlMaW1pdDsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsIHR4X3J0eV9jZmcud29yZCk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1NIT1JUUkVUUllMSU1JVCAodHhfcnR5X2NmZy5maWVsZC5TaG9ydFJldHJ5TGltaXQ9JWQsIFNob3J0UmV0cnlMaW1pdD0lbGQpXG4iLCB0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UnR5TGltaXQsIFNob3J0UmV0cnlMaW1pdCkpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0xPTkdSRVRSWUxJTUlUOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0xPTkdSRVRSWUxJTUlUIFxuIikpOworCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUxPTkcpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkxvbmdSZXRyeUxpbWl0LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCAmdHhfcnR5X2NmZy53b3JkKTsKKwkJCQl0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdCA9IExvbmdSZXRyeUxpbWl0OworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgdHhfcnR5X2NmZy53b3JkKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfTE9OR1JFVFJZTElNSVQgKHR4X3J0eV9jZmcuZmllbGQuTG9uZ1JldHJ5TGltaXQ9ICVkLExvbmdSZXRyeUxpbWl0PSVsZClcbiIsIHR4X3J0eV9jZmcuZmllbGQuTG9uZ1J0eUxpbWl0LCBMb25nUmV0cnlMaW1pdCkpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX1dFUERFRkFVTFRLRVlWQUxVRToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZVkFMVUVcbiIpKTsKKwkJCXBLZXkgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgR0ZQX0tFUk5FTCk7CisJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwS2V5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJLy9wS2V5ID0gJldlcEtleTsKKworCQkJaWYgKCBwS2V5LT5MZW5ndGggIT0gd3JxLT51LmRhdGEubGVuZ3RoKQorCQkJeworCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1dFUERFRkFVTFRLRVlWQUxVRSwgRmFpbGVkISFcbiIpKTsKKwkJCX0KKwkJCUtleUlkeCA9IHBLZXktPktleUluZGV4ICYgMHgwZmZmZmZmZjsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgicEtleS0+S2V5SW5kZXggPSVkLCBwS2V5LT5LZXlMZW5ndGg9JWRcbiIsIHBLZXktPktleUluZGV4LCBwS2V5LT5LZXlMZW5ndGgpKTsKKworCQkJLy8gaXQgaXMgYSBzaGFyZWQga2V5CisJCQlpZiAoS2V5SWR4ID4gNCkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbiA9IChVQ0hBUikgcEtleS0+S2V5TGVuZ3RoOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksICZwS2V5LT5LZXlNYXRlcmlhbCwgcEtleS0+S2V5TGVuZ3RoKTsKKwkJCQlpZiAocEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKQorCQkJCXsKKwkJCQkJLy8gRGVmYXVsdCBrZXkgZm9yIHR4IChzaGFyZWQga2V5KQorCQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChVQ0hBUikgS2V5SWR4OworCQkJCX0KKwkJCQkvL1Jlc3RhcnRBUElzUmVxdWlyZWQgPSBUUlVFOworCQkJfQorCQkJYnJlYWs7CisKKworCQljYXNlIE9JRF84MDJfMTFfV0VQREVGQVVMVEtFWUlEOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1dFUERFRkFVTFRLRVlJRCBcbiIpKTsKKworCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUNIQVIpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJnBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJCQlicmVhazsKKworCisJCWNhc2UgT0lEXzgwMl8xMV9DVVJSRU5UQ0hBTk5FTDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9DVVJSRU5UQ0hBTk5FTCBcbiIpKTsKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVDSEFSKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZjdG1wLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCXNwcmludGYoJmN0bXAsIiVkIiwgY3RtcCk7CisJCQkJU2V0X0NoYW5uZWxfUHJvYyhwQWRhcHRlciwgJmN0bXApOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYKKworCisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6dW5rbm93biBJT0NUTCdzIHN1YmNtZCA9IDB4JTA4eFxuIiwgY21kKSk7CisgICAgICAgICAgICBTdGF0dXMgPSAtRU9QTk9UU1VQUDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworCisgICAgcmV0dXJuIFN0YXR1czsKK30KKworSU5UIFJUTVBRdWVyeUluZm9ybWF0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSIHBBZGFwdGVyLAorICAgIElOICBPVVQgc3RydWN0IGlmcmVxICAgICpycSwKKyAgICBJTiAgSU5UICAgICAgICAgICAgICAgICBjbWQpCit7CisgICAgc3RydWN0IGl3cmVxICAgICAgICAgICAgICAgICAgICAgICAgKndycSA9IChzdHJ1Y3QgaXdyZXEgKikgcnE7CisgICAgTkRJU184MDJfMTFfQlNTSURfTElTVF9FWCAgICAgICAgICAgKnBCc3NpZExpc3QgPSBOVUxMOworICAgIFBORElTX1dMQU5fQlNTSURfRVggICAgICAgICAgICAgICAgIHBCc3M7CisgICAgTkRJU184MDJfMTFfU1NJRCAgICAgICAgICAgICAgICAgICAgU3NpZDsKKyAgICBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OICAgICAgICAgICAqcENvbmZpZ3VyYXRpb24gPSBOVUxMOworICAgIFJUXzgwMl8xMV9MSU5LX1NUQVRVUyAgICAgICAgICAgICAgICpwTGlua1N0YXR1cyA9IE5VTEw7CisgICAgUlRfODAyXzExX1NUQV9DT05GSUcgICAgICAgICAgICAgICAgKnBTdGFDb25maWcgPSBOVUxMOworICAgIE5ESVNfODAyXzExX1NUQVRJU1RJQ1MgICAgICAgICAgICAgICpwU3RhdGlzdGljcyA9IE5VTEw7CisgICAgTkRJU184MDJfMTFfUlRTX1RIUkVTSE9MRCAgICAgICAgICAgUnRzVGhyZXNoOworICAgIE5ESVNfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEIEZyYWdUaHJlc2g7CisgICAgTkRJU184MDJfMTFfUE9XRVJfTU9ERSAgICAgICAgICAgICAgUG93ZXJNb2RlOworICAgIE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgIEJzc1R5cGU7CisgICAgUlRfODAyXzExX1BSRUFNQkxFICAgICAgICAgICAgICAgICAgUHJlYW1UeXBlOworICAgIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgICAgIEF1dGhNb2RlOworICAgIE5ESVNfODAyXzExX1dFUF9TVEFUVVMgICAgICAgICAgICAgIFdlcFN0YXR1czsKKyAgICBORElTX01FRElBX1NUQVRFICAgICAgICAgICAgICAgICAgICBNZWRpYVN0YXRlOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJzc0J1ZlNpemUsIHVsSW5mbz0wLCBOZXR3b3JrVHlwZUxpc3RbNF0sIGFwc2QgPSAwOworICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJzc0xlbiA9IDA7CisgICAgUFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZiA9IE5VTEwsIHBQdHI7CisgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKyAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZV92ZXJzaW9uX2NvbXBpbGVkOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIFBhZGRpbmcgPSAwOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhZGlvU3RhdGU7CisJVUNIQVIJZHJpdmVyVmVyc2lvbls4XTsKKyAgICBPSURfU0VUX0hUX1BIWU1PREUJCQkgICAgICAgICpwSFRQaHlNb2RlID0gTlVMTDsKKworCisjaWZkZWYgU05NUF9TVVBQT1JUCisJLy9mb3Igc25tcCwga2F0aHkKKwlEZWZhdWx0S2V5SWR4VmFsdWUJCQkqcEtleUlkeFZhbHVlOworCUlOVAkJCQkJCQl2YWx1ZUxlbjsKKwlUWF9SVFlfQ0ZHX1NUUlVDCQkJdHhfcnR5X2NmZzsKKwlVTE9ORwkJCQkJCVNob3J0UmV0cnlMaW1pdCwgTG9uZ1JldHJ5TGltaXQ7CisJVUNIQVIJCQkJCQl0bXBbNjRdOworI2VuZGlmIC8vU05NUAorCisgICAgc3dpdGNoKGNtZCkKKyAgICB7CisgICAgICAgIGNhc2UgUlRfT0lEX0RFVklDRV9OQU1FOgorICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFNUQV9OSUNfREVWSUNFX05BTUUpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIFNUQV9OSUNfREVWSUNFX05BTUUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfVkVSU0lPTl9JTkZPOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF9WRVJTSU9OX0lORk8gXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSA4KnNpemVvZihVQ0hBUik7CisJCQlzcHJpbnRmKCZkcml2ZXJWZXJzaW9uWzBdLCAiJXMiLCBTVEFfRFJJVkVSX1ZFUlNJT04pOworCQkJZHJpdmVyVmVyc2lvbls3XSA9ICdcMCc7CisJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZkcml2ZXJWZXJzaW9uLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgeworCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBSQUxJTktfQVRFCisJCWNhc2UgUlRfUVVFUllfQVRFX1RYRE9ORV9DT1VOVDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9RVUVSWV9BVEVfVFhET05FX0NPVU5UIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVJTlQzMik7CisJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+YXRlLlR4RG9uZUNvdW50LCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorCQkJeworCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9CU1NJRF9MSVNUOgorICAgICAgICAgICAgaWYgKFJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkvKgorICAgICAgICAgICAgCSAqIFN0aWxsIHNjYW5uaW5nLCBpbmRpY2F0ZSB0aGUgY2FsbGVyIHNob3VsZCB0cnkgYWdhaW4uCisgICAgICAgICAgICAJICovCisgICAgICAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQlNTSURfTElTVCAoU3RpbGwgc2Nhbm5pbmcpXG4iKSk7CisJCQkJcmV0dXJuIC1FQUdBSU47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUICglZCBCU1MgcmV0dXJuZWQpXG4iLHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yKSk7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBGQUxTRTsKKyAgICAgICAgICAgIC8vIENsYWN1bGF0ZSB0b3RhbCBidWZmZXIgc2l6ZSByZXF1aXJlZAorICAgICAgICAgICAgQnNzQnVmU2l6ZSA9IHNpemVvZihVTE9ORyk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwQWRhcHRlci0+U2NhblRhYi5Cc3NOcjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEFsaWduIHBvaW50ZXIgdG8gNCBieXRlcyBib3VuZGFyeS4KKyAgICAgICAgICAgICAgICAvL1BhZGRpbmcgPSA0IC0gKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuICYgMHgwMDAzKTsKKyAgICAgICAgICAgICAgICAvL2lmIChQYWRkaW5nID09IDQpCisgICAgICAgICAgICAgICAgLy8gICAgUGFkZGluZyA9IDA7CisgICAgICAgICAgICAgICAgQnNzQnVmU2l6ZSArPSAoc2l6ZW9mKE5ESVNfV0xBTl9CU1NJRF9FWCkgLSAxICsgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcykgKyBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbiArIFBhZGRpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBGb3Igc2FmZXR5IGlzc3VlLCB3ZSBhZGQgMjU2IGJ5dGVzIGp1c3QgaW4gY2FzZQorICAgICAgICAgICAgQnNzQnVmU2l6ZSArPSAyNTY7CisgICAgICAgICAgICAvLyBBbGxvY2F0ZSB0aGUgc2FtZSBzaXplIGFzIHBhc3NlZCBmcm9tIGhpZ2hlciBsYXllcgorICAgICAgICAgICAgcEJ1ZiA9IGttYWxsb2MoQnNzQnVmU2l6ZSwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYocEJ1ZiA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FTk9NRU07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJbml0IDgwMl8xMV9CU1NJRF9MSVNUX0VYIHN0cnVjdHVyZQorICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEJ1ZiwgQnNzQnVmU2l6ZSk7CisgICAgICAgICAgICBwQnNzaWRMaXN0ID0gKFBORElTXzgwMl8xMV9CU1NJRF9MSVNUX0VYKSBwQnVmOworICAgICAgICAgICAgcEJzc2lkTGlzdC0+TnVtYmVyT2ZJdGVtcyA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yOworCisgICAgICAgICAgICAvLyBDYWxjdWxhdGUgdG90YWwgYnVmZmVyIGxlbmd0aAorICAgICAgICAgICAgQnNzTGVuID0gNDsgLy8gQ29uc2lzdCBvZiBOdW1iZXJPZkl0ZW1zCisgICAgICAgICAgICAvLyBQb2ludCB0byBzdGFydCBvZiBORElTX1dMQU5fQlNTSURfRVgKKyAgICAgICAgICAgIC8vIHBQdHIgPSBwQnVmICsgc2l6ZW9mKFVMT05HKTsKKyAgICAgICAgICAgIHBQdHIgPSAoUFVDSEFSKSAmcEJzc2lkTGlzdC0+QnNzaWRbMF07CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnI7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQnNzID0gKFBORElTX1dMQU5fQlNTSURfRVgpIHBQdHI7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoJnBCc3MtPk1hY0FkZHJlc3MsICZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKKyAgICAgICAgICAgICAgICBpZiAoKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkhpZGRlbiA9PSAxKSAmJiAocEFkYXB0ZXItPlN0YUNmZy5iU2hvd0hpZGRlblNTSUQgPT0gRkFMU0UpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8KKwkJCQkJLy8gV2UgbXVzdCByZXR1cm4gdGhpcyBTU0lEIGR1cmluZyA0d2F5IGhhbmRzaGFraW5nLCBvdGhlcndpc2UgQWVnaXMgd2lsbCBmYWlsZWQgdG8gcGFyc2UgV1BBIGluZm9tYXRpb24KKwkJCQkJLy8gYW5kIHRoZW4gZmFpbGVkIHRvIHNlbmQgRUFQT2wgZmFyYW1lLgorCQkJCQkvLworCQkJCQlpZiAoKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSAmJiAocEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCAhPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkpCisJCQkJCXsKKwkJCQkJCXBCc3MtPlNzaWQuU3NpZExlbmd0aCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWRMZW47CisJCQkJCQlOZGlzTW92ZU1lbW9yeShwQnNzLT5Tc2lkLlNzaWQsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWQsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWRMZW4pOworCQkJCQl9CisJCQkJCWVsc2UKKyAgICAgICAgICAgICAgICAgICAgCXBCc3MtPlNzaWQuU3NpZExlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBCc3MtPlNzaWQuU3NpZExlbmd0aCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWRMZW47CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBCc3MtPlNzaWQuU3NpZCwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZCwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZExlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBCc3MtPlByaXZhY3kgPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Qcml2YWN5OworICAgICAgICAgICAgICAgIHBCc3MtPlJzc2kgPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc3NpIC0gcEFkYXB0ZXItPkJicFJzc2lUb0RibURlbHRhOworICAgICAgICAgICAgICAgIHBCc3MtPk5ldHdvcmtUeXBlSW5Vc2UgPSBOZXR3b3JrVHlwZUluVXNlU2FuaXR5KCZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXSk7CisgICAgICAgICAgICAgICAgcEJzcy0+Q29uZmlndXJhdGlvbi5MZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfQ09ORklHVVJBVElPTik7CisgICAgICAgICAgICAgICAgcEJzcy0+Q29uZmlndXJhdGlvbi5CZWFjb25QZXJpb2QgPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5CZWFjb25QZXJpb2Q7CisgICAgICAgICAgICAgICAgcEJzcy0+Q29uZmlndXJhdGlvbi5BVElNV2luZG93ID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQXRpbVdpbjsKKworICAgICAgICAgICAgICAgIE1BUF9DSEFOTkVMX0lEX1RPX0tIWihwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5DaGFubmVsLCBwQnNzLT5Db25maWd1cmF0aW9uLkRTQ29uZmlnKTsKKworICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NUeXBlID09IEJTU19JTkZSQSkKKyAgICAgICAgICAgICAgICAgICAgcEJzcy0+SW5mcmFzdHJ1Y3R1cmVNb2RlID0gTmRpczgwMl8xMUluZnJhc3RydWN0dXJlOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcEJzcy0+SW5mcmFzdHJ1Y3R1cmVNb2RlID0gTmRpczgwMl8xMUlCU1M7CisKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5TdXBwb3J0ZWRSYXRlcywgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZSwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZUxlbik7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEJzcy0+U3VwcG9ydGVkUmF0ZXMgKyBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkV4dFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uRXh0UmF0ZUxlbik7CisKKyAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4gPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBCc3MtPklFTGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcyk7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBCc3MtPklFcywgJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkZpeElFcywgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcykpOworICAgICAgICAgICAgICAgICAgICBwUHRyID0gcFB0ciArIHNpemVvZihORElTX1dMQU5fQlNTSURfRVgpIC0gMSArIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQnNzLT5JRUxlbmd0aCA9IChVTE9ORykoc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcykgKyBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbik7CisgICAgICAgICAgICAgICAgICAgIHBQdHIgPSBwUHRyICsgc2l6ZW9mKE5ESVNfV0xBTl9CU1NJRF9FWCkgLSAxICsgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcyk7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBCc3MtPklFcywgJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkZpeElFcywgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcykpOworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5JRXMgKyBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKSwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVzLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbik7CisgICAgICAgICAgICAgICAgICAgIHBQdHIgKz0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBCc3MtPkxlbmd0aCA9IChVTE9ORykoc2l6ZW9mKE5ESVNfV0xBTl9CU1NJRF9FWCkgLSAxICsgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcykgKyBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbiArIFBhZGRpbmcpOworCisjaWYgV0lSRUxFU1NfRVhUIDwgMTcKKyAgICAgICAgICAgICAgICBpZiAoKEJzc0xlbiArIHBCc3MtPkxlbmd0aCkgPCB3cnEtPnUuZGF0YS5sZW5ndGgpCisgICAgICAgICAgICAgICAgQnNzTGVuICs9IHBCc3MtPkxlbmd0aDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQnNzaWRMaXN0LT5OdW1iZXJPZkl0ZW1zID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgICAgICBCc3NMZW4gKz0gcEJzcy0+TGVuZ3RoOworI2VuZGlmCisgICAgICAgICAgICB9CisKKyNpZiBXSVJFTEVTU19FWFQgPCAxNworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gQnNzTGVuOworI2Vsc2UKKyAgICAgICAgICAgIGlmIChCc3NMZW4gPiB3cnEtPnUuZGF0YS5sZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAga2ZyZWUocEJzc2lkTGlzdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBCc3NMZW47CisjZW5kaWYKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwQnNzaWRMaXN0LCBCc3NMZW4pOworICAgICAgICAgICAga2ZyZWUocEJzc2lkTGlzdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzNfQ1VSUkVOVF9BRERSRVNTOgorICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gTUFDX0FERFJfTEVOOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q3VycmVudEFkZHJlc3MsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfR0VOX01FRElBX0NPTk5FQ1RfU1RBVFVTOgorICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPT0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQpCisgICAgICAgICAgICAgICAgTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIE1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKKworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKE5ESVNfTUVESUFfU1RBVEUpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZNZWRpYVN0YXRlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9CU1NJRDoKKyNpZmRlZiBSQUxJTktfQVRFCisJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUaGUgZHJpdmVyIGlzIGluIEFURSBtb2RlIG5vd1xuIikpOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisgICAgICAgICAgICBpZiAoSU5GUkFfT04ocEFkYXB0ZXIpIHx8IEFESE9DX09OKHBBZGFwdGVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuQnNzaWQsIHNpemVvZihORElTXzgwMl8xMV9NQUNfQUREUkVTUykpOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQlNTSUQoPUVNUFRZKVxuIikpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FTk9UQ09OTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfU1NJRDoKKwkJCU5kaXNaZXJvTWVtb3J5KCZTc2lkLCBzaXplb2YoTkRJU184MDJfMTFfU1NJRCkpOworCQkJTmRpc1plcm9NZW1vcnkoU3NpZC5Tc2lkLCBNQVhfTEVOX09GX1NTSUQpOworICAgICAgICAgICAgU3NpZC5Tc2lkTGVuZ3RoID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkTGVuOworCQkJbWVtY3B5KFNzaWQuU3NpZCwgcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkLAlTc2lkLlNzaWRMZW5ndGgpOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX1NTSUQpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZTc2lkLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfU1NJRCAoTGVuPSVkLCBzc2lkPSVzKVxuIiwgU3NpZC5Tc2lkTGVuZ3RoLFNzaWQuU3NpZCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9MSU5LX1NUQVRVUzoKKyAgICAgICAgICAgIHBMaW5rU3RhdHVzID0gKFJUXzgwMl8xMV9MSU5LX1NUQVRVUyAqKSBrbWFsbG9jKHNpemVvZihSVF84MDJfMTFfTElOS19TVEFUVVMpLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZiAocExpbmtTdGF0dXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcExpbmtTdGF0dXMtPkN1cnJUeFJhdGUgPSBSYXRlSWRUbzUwMEticHNbcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFJhdGVdOyAgIC8vIHVuaXQgOiA1MDAga2JwcworICAgICAgICAgICAgICAgIHBMaW5rU3RhdHVzLT5DaGFubmVsUXVhbGl0eSA9IHBBZGFwdGVyLT5NbG1lLkNoYW5uZWxRdWFsaXR5OworICAgICAgICAgICAgICAgIHBMaW5rU3RhdHVzLT5SeEJ5dGVDb3VudCA9IHBBZGFwdGVyLT5SYWxpbmtDb3VudGVycy5SZWNlaXZlZEJ5dGVDb3VudDsKKyAgICAgICAgICAgICAgICBwTGlua1N0YXR1cy0+VHhCeXRlQ291bnQgPSBwQWRhcHRlci0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRCeXRlQ291bnQ7CisgICAgICAgIAkJcExpbmtTdGF0dXMtPkNlbnRyYWxDaGFubmVsID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbDsKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUlRfODAyXzExX0xJTktfU1RBVFVTKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcExpbmtTdGF0dXMsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAga2ZyZWUocExpbmtTdGF0dXMpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0xJTktfU1RBVFVTXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfTElOS19TVEFUVVMoa21hbGxvYyBmYWlsZWQpXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQ09ORklHVVJBVElPTjoKKyAgICAgICAgICAgIHBDb25maWd1cmF0aW9uID0gKE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04gKikga21hbGxvYyhzaXplb2YoTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiksIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmIChwQ29uZmlndXJhdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQ29uZmlndXJhdGlvbi0+TGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04pOworICAgICAgICAgICAgICAgIHBDb25maWd1cmF0aW9uLT5CZWFjb25QZXJpb2QgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZDsKKyAgICAgICAgICAgICAgICBwQ29uZmlndXJhdGlvbi0+QVRJTVdpbmRvdyA9IHBBZGFwdGVyLT5TdGFBY3RpdmUuQXRpbVdpbjsKKyAgICAgICAgICAgICAgICBNQVBfQ0hBTk5FTF9JRF9UT19LSFoocEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLCBwQ29uZmlndXJhdGlvbi0+RFNDb25maWcpOworICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcENvbmZpZ3VyYXRpb24sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQ09ORklHVVJBVElPTihCZWFjb25QZXJpb2Q9JWxkLEF0aW1XPSVsZCxDaGFubmVsPSVkKSBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbmZpZ3VyYXRpb24tPkJlYWNvblBlcmlvZCwgcENvbmZpZ3VyYXRpb24tPkFUSU1XaW5kb3csIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCQkJCWtmcmVlKHBDb25maWd1cmF0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OKGttYWxsb2MgZmFpbGVkKVxuIikpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX1NOUl8wOgorCQkJaWYgKChwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTTlIwID4gMCkpCisJCQl7CisJCQkJdWxJbmZvID0gKCgweGViCS0gcEFkYXB0ZXItPlN0YUNmZy5MYXN0U05SMCkgKiAzKSAvCTE2IDsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywJd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TTlJfMCgweD0lbHgpXG4iLCB1bEluZm8pKTsKKwkJCX0KKyAgICAgICAgICAgIGVsc2UKKwkJCSAgICBTdGF0dXMgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TTlJfMToKKwkJCWlmICgocEFkYXB0ZXItPkFudGVubmEuZmllbGQuUnhQYXRoCT4gMSkgJiYKKyAgICAgICAgICAgICAgICAocEFkYXB0ZXItPlN0YUNmZy5MYXN0U05SMSA+IDApKQorCQkJeworCQkJCXVsSW5mbyA9ICgoMHhlYgktIHBBZGFwdGVyLT5TdGFDZmcuTGFzdFNOUjEpICogMykgLwkxNiA7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sCXdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TTlJfMSgweD0lbHgpXG4iLHVsSW5mbykpOworCQkJfQorCQkJZWxzZQorCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NOUl8xKHBBZGFwdGVyLT5TdGFDZmcuTGFzdFNOUjE9JWQpXG4iLHBBZGFwdGVyLT5TdGFDZmcuTGFzdFNOUjEpKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfUlNTSV9UUklHR0VSOgorICAgICAgICAgICAgdWxJbmZvID0gcEFkYXB0ZXItPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCAtIHBBZGFwdGVyLT5CYnBSc3NpVG9EYm1EZWx0YTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9SU1NJX1RSSUdHRVIoPSVsZClcbiIsIHVsSW5mbykpOworICAgICAgICAgICAgYnJlYWs7CisJCWNhc2UgT0lEXzgwMl8xMV9SU1NJOgorICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUlNTSToKKwkJCXVsSW5mbyA9IHBBZGFwdGVyLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTA7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9SU1NJXzE6CisgICAgICAgICAgICB1bEluZm8gPSBwQWRhcHRlci0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywJd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUlNTSV8yOgorICAgICAgICAgICAgdWxJbmZvID0gcEFkYXB0ZXItPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMjsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sCXdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1NUQVRJU1RJQ1M6CisgICAgICAgICAgICBwU3RhdGlzdGljcyA9IChORElTXzgwMl8xMV9TVEFUSVNUSUNTICopIGttYWxsb2Moc2l6ZW9mKE5ESVNfODAyXzExX1NUQVRJU1RJQ1MpLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZiAocFN0YXRpc3RpY3MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfU1RBVElTVElDUyBcbiIpKTsKKyAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIG1vc3QgdXAtdG8tZGF0ZSBoL3cgcmF3IGNvdW50ZXJzIGludG8gc29mdHdhcmUgY291bnRlcnMKKwkJCSAgICBOSUNVcGRhdGVSYXdDb3VudGVycyhwQWRhcHRlcik7CisKKyAgICAgICAgICAgICAgICAvLyBTYW5pdHkgY2hlY2sgZm9yIGNhbGN1bGF0aW9uIG9mIHN1Y2Vzc2Z1bCBjb3VudAorICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCA8IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC5RdWFkUGFydCkKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQuUXVhZFBhcnQ7CisKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+VHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPk11bHRpY2FzdFRyYW5zbWl0dGVkRnJhbWVDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuTXVsdGljYXN0VHJhbnNtaXR0ZWRGcmFtZUNvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5GYWlsZWRDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuRmFpbGVkQ291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPlJldHJ5Q291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPk11bHRpcGxlUmV0cnlDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuTXVsdGlwbGVSZXRyeUNvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5SVFNTdWNjZXNzQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJUU1N1Y2Nlc3NDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+UlRTRmFpbHVyZUNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5SVFNGYWlsdXJlQ291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPkFDS0ZhaWx1cmVDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuQUNLRmFpbHVyZUNvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5GcmFtZUR1cGxpY2F0ZUNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5GcmFtZUR1cGxpY2F0ZUNvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5SZWNlaXZlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJlY2VpdmVkRnJhZ21lbnRDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+TXVsdGljYXN0UmVjZWl2ZWRGcmFtZUNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5NdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQuUXVhZFBhcnQ7CisjaWZkZWYgREJHCisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPkZDU0Vycm9yQ291bnQgPSBwQWRhcHRlci0+UmFsaW5rQ291bnRlcnMuUmVhbEZjc0VyckNvdW50OworI2Vsc2UKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+RkNTRXJyb3JDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuRkNTRXJyb3JDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+RnJhbWVEdXBsaWNhdGVDb3VudC51Lkxvd1BhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkZyYW1lRHVwbGljYXRlQ291bnQudS5Mb3dQYXJ0IC8gMTAwOworI2VuZGlmCisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX1NUQVRJU1RJQ1MpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwU3RhdGlzdGljcywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBrZnJlZShwU3RhdGlzdGljcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfU1RBVElTVElDUyhrbWFsbG9jIGZhaWxlZClcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEX0dFTl9SQ1ZfT0s6CisgICAgICAgICAgICB1bEluZm8gPSBwQWRhcHRlci0+Q291bnRlcnM4MDIzLkdvb2RSZWNlaXZlczsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfR0VOX1JDVl9OT19CVUZGRVI6CisgICAgICAgICAgICB1bEluZm8gPSBwQWRhcHRlci0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXI7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9QSFlfTU9ERToKKyAgICAgICAgICAgIHVsSW5mbyA9IChVTE9ORylwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGU7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUEhZX01PREUgKD0lbGQpXG4iLCB1bEluZm8pKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfU1RBX0NPTkZJRzoKKyAgICAgICAgICAgIHBTdGFDb25maWcgPSAoUlRfODAyXzExX1NUQV9DT05GSUcgKikga21hbGxvYyhzaXplb2YoUlRfODAyXzExX1NUQV9DT05GSUcpLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZiAocFN0YUNvbmZpZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHXG4iKSk7CisgICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+RW5hYmxlVHhCdXJzdCA9IHBBZGFwdGVyLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3Q7CisgICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+RW5hYmxlVHVyYm9SYXRlID0gMDsKKyAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5Vc2VCR1Byb3RlY3Rpb24gPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbjsKKyAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5Vc2VTaG9ydFNsb3RUaW1lID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZTsKKyAgICAgICAgICAgICAgICAvL3BTdGFDb25maWctPkFkaG9jTW9kZSA9IHBBZGFwdGVyLT5TdGFDZmcuQWRob2NNb2RlOworICAgICAgICAgICAgICAgIHBTdGFDb25maWctPkh3UmFkaW9TdGF0dXMgPSAocEFkYXB0ZXItPlN0YUNmZy5iSHdSYWRpbyA9PSBUUlVFKSA/IDEgOiAwOworICAgICAgICAgICAgICAgIHBTdGFDb25maWctPlJzdjEgPSAwOworICAgICAgICAgICAgICAgIHBTdGFDb25maWctPlN5c3RlbUVycm9yQml0bWFwID0gcEFkYXB0ZXItPlN5c3RlbUVycm9yQml0bWFwOworICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSVF84MDJfMTFfU1RBX0NPTkZJRyk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBTdGFDb25maWcsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAga2ZyZWUocFN0YUNvbmZpZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfU1RBX0NPTkZJRyhrbWFsbG9jIGZhaWxlZClcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9SVFNfVEhSRVNIT0xEOgorICAgICAgICAgICAgUnRzVGhyZXNoID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQ7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUnRzVGhyZXNoKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmUnRzVGhyZXNoLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRCg9JWxkKVxuIiwgUnRzVGhyZXNoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEOgorICAgICAgICAgICAgRnJhZ1RocmVzaCA9IHBBZGFwdGVyLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQ7CisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID09IFRSVUUpCisgICAgICAgICAgICAgICAgRnJhZ1RocmVzaCA9IDA7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoRnJhZ1RocmVzaCk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJkZyYWdUaHJlc2gsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCg9JWxkKVxuIiwgRnJhZ1RocmVzaCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9QT1dFUl9NT0RFOgorICAgICAgICAgICAgUG93ZXJNb2RlID0gcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFBvd2VyTW9kZSk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJlBvd2VyTW9kZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1BPV0VSX01PREUoPSVkKVxuIiwgUG93ZXJNb2RlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1JBRElPOgorICAgICAgICAgICAgUmFkaW9TdGF0ZSA9IChCT09MRUFOKSBwQWRhcHRlci0+U3RhQ2ZnLmJTd1JhZGlvOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJhZGlvU3RhdGUpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZSYWRpb1N0YXRlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfUkFESU8gKD0lZClcbiIsIFJhZGlvU3RhdGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfSU5GUkFTVFJVQ1RVUkVfTU9ERToKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKQorICAgICAgICAgICAgICAgIEJzc1R5cGUgPSBOZGlzODAyXzExSUJTUzsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfSU5GUkEpCisgICAgICAgICAgICAgICAgQnNzVHlwZSA9IE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfTU9OSVRPUikKKyAgICAgICAgICAgICAgICBCc3NUeXBlID0gTmRpczgwMl8xMU1vbml0b3I7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQnNzVHlwZSA9IE5kaXM4MDJfMTFBdXRvVW5rbm93bjsKKworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKEJzc1R5cGUpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZCc3NUeXBlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfSU5GUkFTVFJVQ1RVUkVfTU9ERSg9JWQpXG4iLCBCc3NUeXBlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1BSRUFNQkxFOgorICAgICAgICAgICAgUHJlYW1UeXBlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFByZWFtYmxlOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFByZWFtVHlwZSk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJlByZWFtVHlwZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1BSRUFNQkxFKD0lZClcbiIsIFByZWFtVHlwZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFOgorICAgICAgICAgICAgQXV0aE1vZGUgPSBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKEF1dGhNb2RlKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmQXV0aE1vZGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFKD0lZClcbiIsIEF1dGhNb2RlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1dFUF9TVEFUVVM6CisgICAgICAgICAgICBXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihXZXBTdGF0dXMpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZXZXBTdGF0dXMsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9XRVBfU1RBVFVTKD0lZClcbiIsIFdlcFN0YXR1cykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTDoKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1RYX1BPV0VSX0xFVkVMICV4XG4iLHBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlcikpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTF8xOgorICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMXzEgKD0lbGQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlKSk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX05FVFdPUktfVFlQRVNfU1VQUE9SVEVEOgorCQkJaWYgKChwQWRhcHRlci0+UmZJY1R5cGUJPT0gUkZJQ18yODUwKSB8fCAocEFkYXB0ZXItPlJmSWNUeXBlID09CVJGSUNfMjc1MCkpCisJCQl7CisJCQkJTmV0d29ya1R5cGVMaXN0WzBdID0gMzsgICAgICAgICAgICAgICAgIC8vIE51bWJlck9mSXRlbXMgPSAzCisJCQkJTmV0d29ya1R5cGVMaXN0WzFdID0gTmRpczgwMl8xMURTOyAgICAgIC8vIE5ldHdvcmtUeXBlWzFdID0gMTFiCisJCQkJTmV0d29ya1R5cGVMaXN0WzJdID0gTmRpczgwMl8xMU9GRE0yNDsgIC8vIE5ldHdvcmtUeXBlWzJdID0gMTFnCisJCQkJTmV0d29ya1R5cGVMaXN0WzNdID0gTmRpczgwMl8xMU9GRE01OyAgIC8vIE5ldHdvcmtUeXBlWzNdID0gMTFhCisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gMTY7CisJCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZOZXR3b3JrVHlwZUxpc3RbMF0sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJTmV0d29ya1R5cGVMaXN0WzBdID0gMjsgICAgICAgICAgICAgICAgIC8vIE51bWJlck9mSXRlbXMgPSAyCisJCQkJTmV0d29ya1R5cGVMaXN0WzFdID0gTmRpczgwMl8xMURTOyAgICAgIC8vIE5ldHdvcmtUeXBlWzFdID0gMTFiCisJCQkJTmV0d29ya1R5cGVMaXN0WzJdID0gTmRpczgwMl8xMU9GRE0yNDsgIC8vIE5ldHdvcmtUeXBlWzJdID0gMTFnCisJCQkgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gMTI7CisJCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZOZXR3b3JrVHlwZUxpc3RbMF0sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQl9CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVTX1NVUFBPUlRFRFxuIikpOworCQkJCWJyZWFrOworCSAgICBjYXNlIE9JRF84MDJfMTFfTkVUV09SS19UWVBFX0lOX1VTRToKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisJCQlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUEpCisJCQkJdWxJbmZvID0gTmRpczgwMl8xMU9GRE01OworCQkJZWxzZSBpZiAoKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCR19NSVhFRCkgfHwgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFHKSkKKwkJCQl1bEluZm8gPSBOZGlzODAyXzExT0ZETTI0OworCQkJZWxzZQorCQkJCXVsSW5mbyA9IE5kaXM4MDJfMTFEUzsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9MQVNUX1JYX1JBVEU6CisgICAgICAgICAgICB1bEluZm8gPSAoVUxPTkcpcEFkYXB0ZXItPkxhc3RSeFJhdGU7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfTEFTVF9SWF9SQVRFICg9JWxkKVxuIiwgdWxJbmZvKSk7CisJCQlicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfVFhfUkFURToKKwkJCS8vdWxJbmZvID0gKFVMT05HKXBBZGFwdGVyLT5MYXN0VHhSYXRlOworCQkJdWxJbmZvID0gKFVMT05HKXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUud29yZDsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sCXdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9MQVNUX1RYX1JBVEUgKD0lbHgpXG4iLCB1bEluZm8pKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfRUVQUk9NX1ZFUlNJT046CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+RWVwcm9tVmVyc2lvbiwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfRklSTVdBUkVfVkVSU0lPTjoKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5GaXJtd2FyZVZlcnNpb24sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKwkgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX05PSVNFX0xFVkVMOgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkJicFdyaXRlTGF0Y2hbNjZdLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfTk9JU0VfTEVWRUwgKD0lZClcbiIsIHBBZGFwdGVyLT5CYnBXcml0ZUxhdGNoWzY2XSkpOworCQkJYnJlYWs7CisJICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9FWFRSQV9JTkZPOgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkV4dHJhSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX0VYVFJBX0lORk8gKD0lbGQpXG4iLCBwQWRhcHRlci0+RXh0cmFJbmZvKSk7CisJICAgICAgICBicmVhazsKKwkgICAgY2FzZSBSVF9PSURfV0VfVkVSU0lPTl9DT01QSUxFRDoKKwkgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVSU5UKTsKKwkgICAgICAgIHdlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7CisJICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJndlX3ZlcnNpb25fY29tcGlsZWQsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJICAgICAgICBicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0FQU0RfU0VUVElORzoKKwkJCWFwc2QgPSAocEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgfCAocEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX0JFIDw8IDEpIHwgKHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CSyA8PCAyKQorCQkJCXwgKHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WSSA8PCAzKQl8IChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8gPDwgNCkJfCAocEFkYXB0ZXItPkNvbW1vbkNmZy5NYXhTUExlbmd0aCA8PCA1KSk7CisKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJmFwc2QsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9BUFNEX1NFVFRJTkcgKD0weCVseCxBUFNEQ2FwPSVkLEFDX0JFPSVkLEFDX0JLPSVkLEFDX1ZJPSVkLEFDX1ZPPSVkLE1BWFNQTGVuPSVkKVxuIiwKKwkJCQlhcHNkLHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlLHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CRSxwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQksscEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZJLHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WTyxwQWRhcHRlci0+Q29tbW9uQ2ZnLk1heFNQTGVuZ3RoKSk7CisJCQlicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0FQU0RfUFNNOgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfQVBTRF9QU00gKD0lZClcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSkpOworCQkJYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9XTU06CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoQk9PTEVBTik7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuYldtbUNhcGFibGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9XTU0gKD0lZClcbiIsCXBBZGFwdGVyLT5Db21tb25DZmcuYldtbUNhcGFibGUpKTsKKwkJCWJyZWFrOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgY2FzZSBSVF9PSURfTkVXX0RSSVZFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBVQ0hBUiBlbmFibGVkID0gMTsKKyAgICAJICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworICAgIAkgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmZW5hYmxlZCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEX05FV19EUklWRVIgKD0lZClcbiIsIGVuYWJsZWQpKTsKKyAgICAgICAgICAgIH0KKwkgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUOgorCSAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKwkgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgKD0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKSk7CisJICAgICAgICBicmVhazsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyAgICAgICAgY2FzZSBSVF9PSURfRFJJVkVSX0RFVklDRV9OQU1FOgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF9EUklWRVJfREVWSUNFX05BTUUgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAxNjsKKwkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcEFkYXB0ZXItPlN0YUNmZy5kZXZfbmFtZSwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKwkJCXsKKwkJCQlTdGF0dXMgPSAtRUZBVUxUOworCQkJfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9IVF9QSFlNT0RFOgorICAgICAgICAgICAgcEhUUGh5TW9kZSA9IChPSURfU0VUX0hUX1BIWU1PREUgKikga21hbGxvYyhzaXplb2YoT0lEX1NFVF9IVF9QSFlNT0RFKSwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYgKHBIVFBoeU1vZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEhUUGh5TW9kZS0+UGh5TW9kZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZTsKKyAgICAJCQlwSFRQaHlNb2RlLT5IdE1vZGUgPSAoVUNIQVIpcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFOworICAgIAkJCXBIVFBoeU1vZGUtPkJXID0gKFVDSEFSKXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuQlc7CisgICAgCQkJcEhUUGh5TW9kZS0+TUNTPSAoVUNIQVIpcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1M7CisgICAgCQkJcEhUUGh5TW9kZS0+U0hPUlRHST0gKFVDSEFSKXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSTsKKyAgICAJCQlwSFRQaHlNb2RlLT5TVEJDPSAoVUNIQVIpcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5TVEJDOworCisgICAgCQkJcEhUUGh5TW9kZS0+RXh0T2Zmc2V0ID0gKChwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsIDwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSA/IChFWFRDSEFfQkVMT1cpIDogKEVYVENIQV9BQk9WRSkpOworICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihPSURfU0VUX0hUX1BIWU1PREUpOworICAgICAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcEhUUGh5TW9kZSwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAJCQl7CisgICAgCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisgICAgCQkJfQorICAgIAkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0hUX1BIWU1PREUgKFBoeU1vZGUgPSAlZCwgTUNTID0lZCwgQlcgPSAlZCwgU1RCQyA9ICVkLCBFeHRPZmZzZXQ9JWQpXG4iLAorICAgIAkJCQlwSFRQaHlNb2RlLT5IdE1vZGUsIHBIVFBoeU1vZGUtPk1DUywgcEhUUGh5TW9kZS0+QlcsIHBIVFBoeU1vZGUtPlNUQkMsIHBIVFBoeU1vZGUtPkV4dE9mZnNldCkpOworICAgIAkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNbG1lVXBkYXRlVHhSYXRlcyAoLndvcmQgPSAleCApXG4iLCBwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHKGttYWxsb2MgZmFpbGVkKVxuIikpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX0NPVU5UUllfUkVHSU9OOgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfQ09VTlRSWV9SRUdJT04gXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKyAgICAgICAgICAgIHVsSW5mbyA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kOworICAgICAgICAgICAgdWxJbmZvID0gKHVsSW5mbyA8PCA4KXwocEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uKTsKKwkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKwkJCQlTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9EQVRfSFRfUEhZTU9ERToKKyAgICAgICAgICAgIHBIVFBoeU1vZGUgPSAoT0lEX1NFVF9IVF9QSFlNT0RFICopIGttYWxsb2Moc2l6ZW9mKE9JRF9TRVRfSFRfUEhZTU9ERSksIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmIChwSFRQaHlNb2RlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBIVFBoeU1vZGUtPlBoeU1vZGUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGU7CisgICAgCQkJcEhUUGh5TW9kZS0+SHRNb2RlID0gKFVDSEFSKXBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERTsKKyAgICAJCQlwSFRQaHlNb2RlLT5CVyA9IChVQ0hBUilwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVzsKKyAgICAJCQlwSFRQaHlNb2RlLT5NQ1M9IChVQ0hBUilwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTOworICAgIAkJCXBIVFBoeU1vZGUtPlNIT1JUR0k9IChVQ0hBUilwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJOworICAgIAkJCXBIVFBoeU1vZGUtPlNUQkM9IChVQ0hBUilwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDOworCisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKE9JRF9TRVRfSFRfUEhZTU9ERSk7CisgICAgICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwSFRQaHlNb2RlLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgIAkJCXsKKyAgICAJCQkJU3RhdHVzID0gLUVGQVVMVDsKKyAgICAJCQl9CisgICAgCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfSFRfUEhZTU9ERSAoUGh5TW9kZSA9ICVkLCBNQ1MgPSVkLCBCVyA9ICVkLCBTVEJDID0gJWQsIEV4dE9mZnNldD0lZClcbiIsCisgICAgCQkJCXBIVFBoeU1vZGUtPkh0TW9kZSwgcEhUUGh5TW9kZS0+TUNTLCBwSFRQaHlNb2RlLT5CVywgcEhUUGh5TW9kZS0+U1RCQywgcEhUUGh5TW9kZS0+RXh0T2Zmc2V0KSk7CisgICAgCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIE1sbWVVcGRhdGVUeFJhdGVzICgud29yZCA9ICV4IClcbiIsIHBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUud29yZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NUQV9DT05GSUcoa21hbGxvYyBmYWlsZWQpXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF9RVUVSWV9NVUxUSVBMRV9DQVJEX1NVUFBPUlQ6CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworICAgICAgICAgICAgaSA9IDA7CisjaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCisgICAgICAgICAgICBpID0gMTsKKyNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KKwkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJmksIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICB7CisJCQkJU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfUVVFUllfTVVMVElQTEVfQ0FSRF9TVVBQT1JUKD0lZCkgXG4iLCBpKSk7CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBTTk1QX1NVUFBPUlQKKwkJY2FzZSBSVF9PSURfODAyXzExX01BQ19BRERSRVNTOgorICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gTUFDX0FERFJfTEVOOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q3VycmVudEFkZHJlc3MsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVST1VJOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVST1VJIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gTWFudWZhY3R1cmVyT1VJX0xFTjsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkN1cnJlbnRBZGRyZXNzLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX01BTlVGQUNUVVJFUk5BTUU6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRVJOQU1FIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKE1hbnVmYWN0dXJlck5BTUUpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIE1hbnVmYWN0dXJlck5BTUUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfUkVTT1VSQ0VUWVBFSUROQU1FOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUkVTT1VSQ0VUWVBFSUROQU1FIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKFJlc291cmNlVHlwZUlkTmFtZSk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgUmVzb3VyY2VUeXBlSWROYW1lLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1BSSVZBQ1lPUFRJT05JTVBMRU1FTlRFRDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1BSSVZBQ1lPUFRJT05JTVBMRU1FTlRFRCBcbiIpKTsKKwkJCXVsSW5mbyA9IDE7IC8vIDEgaXMgc3VwcG9ydCB3ZXAgZWxzZSAyIGlzIG5vdCBzdXBwb3J0LgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9QT1dFUk1BTkFHRU1FTlRNT0RFOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUE9XRVJNQU5BR0VNRU5UTU9ERSBcbiIpKTsKKwkJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLlBzbSA9PSBQU01QX0FDVElPTikKKwkJCQl1bEluZm8gPSAxOyAvLyAxIGlzIHBvd2VyIGFjdGl2ZSBlbHNlIDIgaXMgcG93ZXIgc2F2ZS4KKwkJCWVsc2UKKwkJCQl1bEluZm8gPSAyOworCisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX1dFUERFRkFVTFRLRVlWQUxVRToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1dFUERFRkFVTFRLRVlWQUxVRSBcbiIpKTsKKwkJCS8vS2V5SWR4VmFsdWUuS2V5SWR4ID0gcEFkLT5Qb3J0Q2ZnLk1CU1NJRFtwQWQtPklvY3RsSUZdLkRlZmF1bHRLZXlJZDsKKwkJCXBLZXlJZHhWYWx1ZSA9IHdycS0+dS5kYXRhLnBvaW50ZXI7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIktleUlkeFZhbHVlLktleUlkeCA9ICVkLCBcbiIscEtleUlkeFZhbHVlLT5LZXlJZHgpKTsKKwkJCXZhbHVlTGVuID0gcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuOworCQkJTmRpc01vdmVNZW1vcnkocEtleUlkeFZhbHVlLT5WYWx1ZSwKKwkJCQkJCSAgICZwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksCisJCQkJCQkgICB2YWx1ZUxlbik7CisJCQlwS2V5SWR4VmFsdWUtPlZhbHVlW3ZhbHVlTGVuXT0nXDAnOworCisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoRGVmYXVsdEtleUlkeFZhbHVlKTsKKworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBLZXlJZHhWYWx1ZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRGVmYXVsdEtleUlkID0gJWQsIHRvdGFsIGxlbiA9ICVkLCBzdHIgbGVuPSVkLCBLZXlWYWx1ZT0gJTAyeCAlMDJ4ICUwMnggJTAyeCBcbiIsIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkLCB3cnEtPnUuZGF0YS5sZW5ndGgsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbiwKKwkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5WzBdLAorCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXlbMF0sCisJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleVswXSwKKwkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5WzBdKSk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfV0VQREVGQVVMVEtFWUlEOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfV0VQREVGQVVMVEtFWUlEIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEZWZhdWx0S2V5SWQgPSVkIFxuIiwgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9XRVBLRVlNQVBQSU5HTEVOR1RIOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfV0VQS0VZTUFQUElOR0xFTkdUSCBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwKKwkJCQkJCQkJCSZwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4sCisJCQkJCQkJCQl3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX1NIT1JUUkVUUllMSU1JVDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1NIT1JUUkVUUllMSU1JVCBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7CisJCQlTaG9ydFJldHJ5TGltaXQgPSB0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UnR5TGltaXQ7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTaG9ydFJldHJ5TGltaXQgPSVsZCwgIHR4X3J0eV9jZmcuZmllbGQuU2hvcnRSZXRyeUxpbWl0PSVkXG4iLCBTaG9ydFJldHJ5TGltaXQsIHR4X3J0eV9jZmcuZmllbGQuU2hvcnRSdHlMaW1pdCkpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZTaG9ydFJldHJ5TGltaXQsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfTE9OR1JFVFJZTElNSVQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9MT05HUkVUUllMSU1JVCBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7CisJCQlMb25nUmV0cnlMaW1pdCA9IHR4X3J0eV9jZmcuZmllbGQuTG9uZ1J0eUxpbWl0OworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTG9uZ1JldHJ5TGltaXQgPSVsZCwgIHR4X3J0eV9jZmcuZmllbGQuTG9uZ1J0eUxpbWl0PSVkXG4iLCBMb25nUmV0cnlMaW1pdCwgdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQpKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmTG9uZ1JldHJ5TGltaXQsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfUFJPRFVDVElEOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUFJPRFVDVElEIFxuIikpOworCisjaWZkZWYgUlQyODcwCisJCQlzcHJpbnRmKHRtcCwgIiUwNHggJTA0eFxuIiwgKChQT1NfQ09PS0lFKXBBZGFwdGVyLT5PU19Db29raWUpLT5wVXNiX0Rldi0+ZGVzY3JpcHRvci5pZFZlbmRvciAsKChQT1NfQ09PS0lFKXBBZGFwdGVyLT5PU19Db29raWUpLT5wVXNiX0Rldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpOworCisjZW5kaWYgLy8gUlQyODcwIC8vCisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4odG1wKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCB0bXAsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVJRDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX01BTlVGQUNUVVJFSUQgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4oTWFudWZhY3R1cmVyTkFNRSk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgTWFudWZhY3R1cmVyTkFNRSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9DVVJSRU5UQ0hBTk5FTDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0NVUlJFTlRDSEFOTkVMIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInNpemVvZiBVQ0hBUj0lZCwgY2hhbm5lbD0lZCBcbiIsIHNpemVvZihVQ0hBUiksIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTdGF0dXM9JWRcbiIsIFN0YXR1cykpOworCQkJYnJlYWs7CisjZW5kaWYgLy9TTk1QX1NVUFBPUlQKKworCQljYXNlIE9JRF84MDJfMTFfQlVJTERfQ0hBTk5FTF9FWDoKKwkJCXsKKwkJCQlVQ0hBUiB2YWx1ZTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9CVUlMRF9DSEFOTkVMX0VYIFxuIikpOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN1cHBvcnQgRVhUX0JVSUxEX0NIQU5ORUxfTElTVC5cbiIpKTsKKwkJCQl2YWx1ZSA9IDE7CisjZWxzZQorCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRvZXNuJ3Qgc3VwcG9ydCBFWFRfQlVJTERfQ0hBTk5FTF9MSVNULlxuIikpOworCQkJCXZhbHVlID0gMDsKKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisJCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ2YWx1ZSwgMSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3RhdHVzPSVkXG4iLCBTdGF0dXMpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9HRVRfQ0hfTElTVDoKKwkJCXsKKwkJCQlQUlRfQ0hBTk5FTF9MSVNUX0lORk8gcENoTGlzdEJ1ZjsKKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0dFVF9DSF9MSVNUIFxuIikpOworCQkJCWlmIChwQWRhcHRlci0+Q2hhbm5lbExpc3ROdW0gPT0gMCkKKwkJCQl7CisJCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDA7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCXBDaExpc3RCdWYgPSAoUlRfQ0hBTk5FTF9MSVNUX0lORk8gKikga21hbGxvYyhzaXplb2YoUlRfQ0hBTk5FTF9MSVNUX0lORk8pLCBNRU1fQUxMT0NfRkxBRyk7CisJCQkJaWYgKHBDaExpc3RCdWYgPT0gTlVMTCkKKwkJCQl7CisJCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDA7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCXBDaExpc3RCdWYtPkNoYW5uZWxMaXN0TnVtID0gcEFkYXB0ZXItPkNoYW5uZWxMaXN0TnVtOworCQkJCWZvciAoaSA9IDA7IGkgPCBwQ2hMaXN0QnVmLT5DaGFubmVsTGlzdE51bTsgaSsrKQorCQkJCQlwQ2hMaXN0QnVmLT5DaGFubmVsTGlzdFtpXSA9IHBBZGFwdGVyLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsOworCisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJUX0NIQU5ORUxfTElTVF9JTkZPKTsKKwkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcENoTGlzdEJ1Ziwgc2l6ZW9mKFJUX0NIQU5ORUxfTElTVF9JTkZPKSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3RhdHVzPSVkXG4iLCBTdGF0dXMpKTsKKworCQkJCWlmIChwQ2hMaXN0QnVmKQorCQkJCQlrZnJlZShwQ2hMaXN0QnVmKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9HRVRfQ09VTlRSWV9DT0RFOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfR0VUX0NPVU5UUllfQ09ERSBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDI7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeUNvZGUsIDIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3RhdHVzPSVkXG4iLCBTdGF0dXMpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9HRVRfQ0hBTk5FTF9HRU9HUkFQSFk6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9HRVRfQ0hBTk5FTF9HRU9HUkFQSFkgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAxOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSwgMSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTdGF0dXM9JWRcbiIsIFN0YXR1cykpOworCQkJYnJlYWs7CisKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfRExTOgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKEJPT0xFQU4pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfRExTKD0lZClcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuYkRMU0NhcGFibGUpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9ETFNfUEFSQU06CisJCQl7CisJCQkJUFJUXzgwMl8xMV9ETFNfSU5GTwlwRGxzSW5mbyA9IGttYWxsb2Moc2l6ZW9mKFJUXzgwMl8xMV9ETFNfSU5GTyksIEdGUF9BVE9NSUMpOworCQkJCWlmIChwRGxzSW5mbyA9PSBOVUxMKQorCQkJCQlicmVhazsKKworCQkJCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJCQkJeworCQkJCQlSVE1QTW92ZU1lbW9yeSgmcERsc0luZm8tPkVudHJ5W2ldLCAmcEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXSwgc2l6ZW9mKFJUXzgwMl8xMV9ETFNfVUkpKTsKKwkJCQl9CisKKwkJCQlwRGxzSW5mby0+bnVtID0gTUFYX05VTV9PRl9ETFNfRU5UUlk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJUXzgwMl8xMV9ETFNfSU5GTyk7CisJCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBEbHNJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0RMU19QQVJBTVxuIikpOworCisJCQkJaWYgKHBEbHNJbmZvKQorCQkJCQlrZnJlZShwRGxzSW5mbyk7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5Ojp1bmtub3duIElPQ1RMJ3Mgc3ViY21kID0gMHglMDh4XG4iLCBjbWQpKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IC1FT1BOT1RTVVBQOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBTdGF0dXM7Cit9CisKK0lOVCBydDI4eHhfc3RhX2lvY3RsKAorCUlOCXN0cnVjdCBuZXRfZGV2aWNlCSpuZXRfZGV2LAorCUlOCU9VVAlzdHJ1Y3QgaWZyZXEJKnJxLAorCUlOCUlOVAkJCQkJY21kKQoreworCVBPU19DT09LSUUJCQlwT2JqOworCVZJUlRVQUxfQURBUFRFUgkJKnBWaXJ0dWFsQWQgPSBOVUxMOworCVJUTVBfQURBUFRFUiAgICAgICAgKnBBZCA9IE5VTEw7CisJc3RydWN0IGl3cmVxICAgICAgICAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKSBycTsKKwlCT09MRUFOCQkJCVN0YXRlTWFjaGluZVRvdWNoZWQgPSBGQUxTRTsKKwlJTlQJCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJVVNIT1JUCQkJCXN1YmNtZDsKKworCWlmIChuZXRfZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IG5ldF9kZXYtPm1sX3ByaXY7CisJCXBBZCA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPm1sX3ByaXY7CisJfQorCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisKKwlpZiAocEFkID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworI2lmZGVmIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUCisJICAgIGlmICh3cnEtPnUuZGF0YS5wb2ludGVyID09IE5VTEwpCisJICAgIHsKKwkJICAgIHJldHVybiBTdGF0dXM7CisJICAgIH0KKworCSAgICBpZiAoc3Ryc3RyKHdycS0+dS5kYXRhLnBvaW50ZXIsICJPcE1vZGUiKSA9PSBOVUxMKQorI2VuZGlmIC8vIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUIC8vCisgICAgICAgIHsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJICAgIHJldHVybiAtRU5FVERPV047CisgICAgICAgIH0KKyAgICB9CisKKwl7CS8vIGRldGVybWluZSB0aGlzIGlvY3RsIGNvbW1hbmQgaXMgY29tbWluZyBmcm9tIHdoaWNoIGludGVyZmFjZS4KKwkJcE9iai0+aW9jdGxfaWZfdHlwZSA9IElOVF9NQUlOOworCQlwT2JqLT5pb2N0bF9pZiA9IE1BSU5fTUJTU0lEOworCX0KKworCXN3aXRjaChjbWQpCisJeworI2lmZGVmIFJBTElOS19BVEUKKyNpZmRlZiBSQUxJTktfMjh4eF9RQQorCQljYXNlIFJUUFJJVl9JT0NUTF9BVEU6CisJCQl7CisJCQkJUnRtcERvQXRlKHBBZCwgd3JxKTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworICAgICAgICBjYXNlIFNJT0NHSUZIV0FERFI6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJT0NUTDo6U0lPQ0dJRkhXQUREUlxuIikpOworCQkJbWVtY3B5KHdycS0+dS5uYW1lLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFVEhfQUxFTik7CisJCQlicmVhazsKKwkJY2FzZSBTSU9DR0lXTkFNRToKKyAgICAgICAgeworICAgICAgICAJY2hhciAqbmFtZT0md3JxLT51Lm5hbWVbMF07CisgICAgICAgIAlydF9pb2N0bF9naXduYW1lKG5ldF9kZXYsIE5VTEwsIG5hbWUsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DR0lXRVNTSUQ6ICAvL0dldCBFU1NJRAorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcG9pbnQgKmVzc2lkPSZ3cnEtPnUuZXNzaWQ7CisgICAgICAgIAlydF9pb2N0bF9naXdlc3NpZChuZXRfZGV2LCBOVUxMLCBlc3NpZCwgZXNzaWQtPnBvaW50ZXIpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DU0lXRVNTSUQ6ICAvL1NldCBFU1NJRAorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcG9pbnQJKmVzc2lkPSZ3cnEtPnUuZXNzaWQ7CisgICAgICAgIAlydF9pb2N0bF9zaXdlc3NpZChuZXRfZGV2LCBOVUxMLCBlc3NpZCwgZXNzaWQtPnBvaW50ZXIpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DU0lXTldJRDogICAvLyBzZXQgbmV0d29yayBpZCAodGhlIGNlbGwpCisJCWNhc2UgU0lPQ0dJV05XSUQ6ICAgLy8gZ2V0IG5ldHdvcmsgaWQKKwkJCVN0YXR1cyA9IC1FT1BOT1RTVVBQOworCQkJYnJlYWs7CisJCWNhc2UgU0lPQ1NJV0ZSRVE6ICAgLy9zZXQgY2hhbm5lbC9mcmVxdWVuY3kgKEh6KQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfZnJlcSAqZnJlcT0md3JxLT51LmZyZXE7CisgICAgICAgIAlydF9pb2N0bF9zaXdmcmVxKG5ldF9kZXYsIE5VTEwsIGZyZXEsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DR0lXRlJFUTogICAvLyBnZXQgY2hhbm5lbC9mcmVxdWVuY3kgKEh6KQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfZnJlcSAqZnJlcT0md3JxLT51LmZyZXE7CisgICAgICAgIAlydF9pb2N0bF9naXdmcmVxKG5ldF9kZXYsIE5VTEwsIGZyZXEsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DU0lXTklDS046IC8vc2V0IG5vZGUgbmFtZS9uaWNrbmFtZQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGE9JndycS0+dS5kYXRhOworICAgICAgICAJcnRfaW9jdGxfc2l3bmlja24obmV0X2RldiwgTlVMTCwgZGF0YSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHSVdOSUNLTjogLy9nZXQgbm9kZSBuYW1lL25pY2tuYW1lCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wb2ludCAqZGF0YT0md3JxLT51LmRhdGE7CisgICAgICAgIAlydF9pb2N0bF9naXduaWNrbihuZXRfZGV2LCBOVUxMLCBkYXRhLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ0dJV1JBVEU6ICAgLy9nZXQgZGVmYXVsdCBiaXQgcmF0ZSAoYnBzKQorCQkgICAgcnRfaW9jdGxfZ2l3cmF0ZShuZXRfZGV2LCBOVUxMLCAmd3JxLT51LCBOVUxMKTsKKyAgICAgICAgICAgIGJyZWFrOworCSAgICBjYXNlIFNJT0NTSVdSQVRFOiAgLy9zZXQgZGVmYXVsdCBiaXQgcmF0ZSAoYnBzKQorCSAgICAgICAgcnRfaW9jdGxfc2l3cmF0ZShuZXRfZGV2LCBOVUxMLCAmd3JxLT51LCBOVUxMKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNJT0NHSVdSVFM6ICAvLyBnZXQgUlRTL0NUUyB0aHJlc2hvbGQgKGJ5dGVzKQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcGFyYW0gKnJ0cz0md3JxLT51LnJ0czsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd3J0cyhuZXRfZGV2LCBOVUxMLCBydHMsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKyAgICAgICAgY2FzZSBTSU9DU0lXUlRTOiAgLy9zZXQgUlRTL0NUUyB0aHJlc2hvbGQgKGJ5dGVzKQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcGFyYW0gKnJ0cz0md3JxLT51LnJ0czsKKyAgICAgICAgCXJ0X2lvY3RsX3Npd3J0cyhuZXRfZGV2LCBOVUxMLCBydHMsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKyAgICAgICAgY2FzZSBTSU9DR0lXRlJBRzogIC8vZ2V0IGZyYWdtZW50YXRpb24gdGhyIChieXRlcykKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BhcmFtICpmcmFnPSZ3cnEtPnUuZnJhZzsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd2ZyYWcobmV0X2RldiwgTlVMTCwgZnJhZywgTlVMTCk7CisJCQlicmVhazsKKwkJfQorICAgICAgICBjYXNlIFNJT0NTSVdGUkFHOiAgLy9zZXQgZnJhZ21lbnRhdGlvbiB0aHIgKGJ5dGVzKQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcGFyYW0gKmZyYWc9JndycS0+dS5mcmFnOworICAgICAgICAJcnRfaW9jdGxfc2l3ZnJhZyhuZXRfZGV2LCBOVUxMLCBmcmFnLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisgICAgICAgIGNhc2UgU0lPQ0dJV0VOQ09ERTogIC8vZ2V0IGVuY29kaW5nIHRva2VuICYgbW9kZQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcG9pbnQgKmVycT0md3JxLT51LmVuY29kaW5nOworICAgICAgICAJaWYoZXJxLT5wb2ludGVyKQorICAgICAgICAJCXJ0X2lvY3RsX2dpd2VuY29kZShuZXRfZGV2LCBOVUxMLCBlcnEsIGVycS0+cG9pbnRlcik7CisJCQlicmVhazsKKwkJfQorICAgICAgICBjYXNlIFNJT0NTSVdFTkNPREU6ICAvL3NldCBlbmNvZGluZyB0b2tlbiAmIG1vZGUKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BvaW50ICplcnE9JndycS0+dS5lbmNvZGluZzsKKyAgICAgICAgCWlmKGVycS0+cG9pbnRlcikKKyAgICAgICAgCQlydF9pb2N0bF9zaXdlbmNvZGUobmV0X2RldiwgTlVMTCwgZXJxLCBlcnEtPnBvaW50ZXIpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DR0lXQVA6ICAgICAvL2dldCBhY2Nlc3MgcG9pbnQgTUFDIGFkZHJlc3NlcworICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3Qgc29ja2FkZHIgKmFwX2FkZHI9JndycS0+dS5hcF9hZGRyOworICAgICAgICAJcnRfaW9jdGxfZ2l3YXAobmV0X2RldiwgTlVMTCwgYXBfYWRkciwgYXBfYWRkci0+c2FfZGF0YSk7CisJCQlicmVhazsKKwkJfQorCSAgICBjYXNlIFNJT0NTSVdBUDogIC8vc2V0IGFjY2VzcyBwb2ludCBNQUMgYWRkcmVzc2VzCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBzb2NrYWRkciAqYXBfYWRkcj0md3JxLT51LmFwX2FkZHI7CisgICAgICAgIAlydF9pb2N0bF9zaXdhcChuZXRfZGV2LCBOVUxMLCBhcF9hZGRyLCBhcF9hZGRyLT5zYV9kYXRhKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ0dJV01PREU6ICAgLy9nZXQgb3BlcmF0aW9uIG1vZGUKKyAgICAgICAgeworICAgICAgICAJX191MzIgKm1vZGU9JndycS0+dS5tb2RlOworICAgICAgICAJcnRfaW9jdGxfZ2l3bW9kZShuZXRfZGV2LCBOVUxMLCBtb2RlLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ1NJV01PREU6ICAgLy9zZXQgb3BlcmF0aW9uIG1vZGUKKyAgICAgICAgeworICAgICAgICAJX191MzIgKm1vZGU9JndycS0+dS5tb2RlOworICAgICAgICAJcnRfaW9jdGxfc2l3bW9kZShuZXRfZGV2LCBOVUxMLCBtb2RlLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ0dJV1NFTlM6ICAgLy9nZXQgc2Vuc2l0aXZpdHkgKGRCbSkKKwkJY2FzZSBTSU9DU0lXU0VOUzoJLy9zZXQgc2Vuc2l0aXZpdHkgKGRCbSkKKwkJY2FzZSBTSU9DR0lXUE9XRVI6ICAvL2dldCBQb3dlciBNYW5hZ2VtZW50IHNldHRpbmdzCisJCWNhc2UgU0lPQ1NJV1BPV0VSOiAgLy9zZXQgUG93ZXIgTWFuYWdlbWVudCBzZXR0aW5ncworCQljYXNlIFNJT0NHSVdUWFBPVzogIC8vZ2V0IHRyYW5zbWl0IHBvd2VyIChkQm0pCisJCWNhc2UgU0lPQ1NJV1RYUE9XOiAgLy9zZXQgdHJhbnNtaXQgcG93ZXIgKGRCbSkKKwkJY2FzZSBTSU9DR0lXUkFOR0U6CS8vR2V0IHJhbmdlIG9mIHBhcmFtZXRlcnMKKwkJY2FzZSBTSU9DR0lXUkVUUlk6CS8vZ2V0IHJldHJ5IGxpbWl0cyBhbmQgbGlmZXRpbWUKKwkJY2FzZSBTSU9DU0lXUkVUUlk6CS8vc2V0IHJldHJ5IGxpbWl0cyBhbmQgbGlmZXRpbWUKKwkJCVN0YXR1cyA9IC1FT1BOT1RTVVBQOworCQkJYnJlYWs7CisJCWNhc2UgUlRfUFJJVl9JT0NUTDoKKwkJCXN1YmNtZCA9IHdycS0+dS5kYXRhLmZsYWdzOworCQkJaWYoIHN1YmNtZCAmIE9JRF9HRVRfU0VUX1RPR0dMRSkKKwkJCQlTdGF0dXMgPSBSVE1QU2V0SW5mb3JtYXRpb24ocEFkLCBycSwgc3ViY21kKTsKKwkJCWVsc2UKKwkJCQlTdGF0dXMgPSBSVE1QUXVlcnlJbmZvcm1hdGlvbihwQWQsIHJxLCBzdWJjbWQpOworCQkJYnJlYWs7CisJCWNhc2UgU0lPQ0dJV1BSSVY6CisJCQlpZiAod3JxLT51LmRhdGEucG9pbnRlcikKKwkJCXsKKwkJCQlpZiAoIGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHNpemVvZihwcml2dGFiKSkgIT0gVFJVRSkKKwkJCQkJYnJlYWs7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHByaXZ0YWIpIC8gc2l6ZW9mKHByaXZ0YWJbMF0pOworCQkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcHJpdnRhYiwgc2l6ZW9mKHByaXZ0YWIpKSkKKwkJCQkJU3RhdHVzID0gLUVGQVVMVDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFJUUFJJVl9JT0NUTF9TRVQ6CisJCQlpZihhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCkgIT0gVFJVRSkKKwkJCQlicmVhazsKKwkJCXJ0X2lvY3RsX3NldHBhcmFtKG5ldF9kZXYsIE5VTEwsIE5VTEwsIHdycS0+dS5kYXRhLnBvaW50ZXIpOworCQkJYnJlYWs7CisJCWNhc2UgUlRQUklWX0lPQ1RMX0dTSVRFU1VSVkVZOgorCQkJUlRNUElvY3RsR2V0U2l0ZVN1cnZleShwQWQsIHdycSk7CisJCSAgICBicmVhazsKKyNpZmRlZiBEQkcKKwkJY2FzZSBSVFBSSVZfSU9DVExfTUFDOgorCQkJUlRNUElvY3RsTUFDKHBBZCwgd3JxKTsKKwkJCWJyZWFrOworCQljYXNlIFJUUFJJVl9JT0NUTF9FMlA6CisJCQlSVE1QSW9jdGxFMlBST00ocEFkLCB3cnEpOworCQkJYnJlYWs7CisjZW5kaWYgLy8gREJHIC8vCisgICAgICAgIGNhc2UgU0lPQ0VUSFRPT0w6CisgICAgICAgICAgICAgICAgYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJJT0NUTDo6dW5rbm93biBJT0NUTCdzIGNtZCA9IDB4JTA4eFxuIiwgY21kKSk7CisJCQlTdGF0dXMgPSAtRU9QTk9UU1VQUDsKKwkJCWJyZWFrOworCX0KKworICAgIGlmKFN0YXRlTWFjaGluZVRvdWNoZWQpIC8vIFVwcGVyIGxheWVyIHNlbnQgYSBNTE1FLXJlbGF0ZWQgb3BlcmF0aW9ucworICAgIAlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisKKwlyZXR1cm4gU3RhdHVzOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBTU0lECisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X1NTSURfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIE5ESVNfODAyXzExX1NTSUQgICAgICAgICAgICAgICAgICAgIFNzaWQsICpwU3NpZD1OVUxMOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlTWFjaGluZVRvdWNoZWQgPSBGQUxTRTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gVFJVRTsKKworICAgIGlmKCBzdHJsZW4oYXJnKSA8PSBNQVhfTEVOX09GX1NTSUQpCisgICAgeworICAgICAgICBOZGlzWmVyb01lbW9yeSgmU3NpZCwgc2l6ZW9mKE5ESVNfODAyXzExX1NTSUQpKTsKKyAgICAgICAgaWYgKHN0cmxlbihhcmcpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFNzaWQuU3NpZCwgYXJnLCBzdHJsZW4oYXJnKSk7CisgICAgICAgICAgICBTc2lkLlNzaWRMZW5ndGggPSBzdHJsZW4oYXJnKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlICAgLy9BTlkgc3NpZAorICAgICAgICB7CisgICAgICAgICAgICBTc2lkLlNzaWRMZW5ndGggPSAwOworCQkgICAgbWVtY3B5KFNzaWQuU3NpZCwgIiIsIDApOworCQkJcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0lORlJBOworCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisJICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkOworCQl9CisgICAgICAgIHBTc2lkID0gJlNzaWQ7CisKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworICAgICAgICB9CisKKyAgICAgICAgcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBUUlVFOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBGQUxTRTsKKwkJcEFkYXB0ZXItPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKKworICAgICAgICBNbG1lRW5xdWV1ZShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisgICAgICAgICAgICAgICAgICAgIE9JRF84MDJfMTFfU1NJRCwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE5ESVNfODAyXzExX1NTSUQpLAorICAgICAgICAgICAgICAgICAgICAoVk9JRCAqKXBTc2lkKTsKKworICAgICAgICBTdGF0ZU1hY2hpbmVUb3VjaGVkID0gVFJVRTsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1NTSURfUHJvYzo6KExlbj0lZCxTc2lkPSVzKVxuIiwgU3NpZC5Tc2lkTGVuZ3RoLCBTc2lkLlNzaWQpKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBzdWNjZXNzID0gRkFMU0U7CisKKyAgICBpZiAoU3RhdGVNYWNoaW5lVG91Y2hlZCkgLy8gVXBwZXIgbGF5ZXIgc2VudCBhIE1MTUUtcmVsYXRlZCBvcGVyYXRpb25zCisgICAgCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkYXB0ZXIpOworCisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CisKKyNpZmRlZiBXTU1fU1VQUE9SVAorLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV21tQ2FwYWJsZSBFbmFibGUgb3IgRGlzYWJsZQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UCVNldF9XbW1DYXBhYmxlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCUJPT0xFQU4JYldtbUNhcGFibGU7CisKKwliV21tQ2FwYWJsZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlpZiAoKGJXbW1DYXBhYmxlID09IDEpCisjaWZkZWYgUlQyODcwCisJCSYmIChwQWQtPk51bWJlck9mUGlwZXMgPj0gNSkKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwkJKQorCQlwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSA9IFRSVUU7CisJZWxzZSBpZiAoYldtbUNhcGFibGUgPT0gMCkKKwkJcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUgPSBGQUxTRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1dtbUNhcGFibGVfUHJvYzo6KGJXbW1DYXBhYmxlPSVkKVxuIiwKKwkJcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUpKTsKKworCXJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIFdNTV9TVVBQT1JUIC8vCisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IE5ldHdvcmsgVHlwZShJbmZyYXN0cnVjdHVyZS9BZGhvYyBtb2RlKQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9OZXR3b3JrVHlwZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgVUlOVDMyCVZhbHVlID0gMDsKKworICAgIGlmIChzdHJjbXAoYXJnLCAiQWRob2MiKSA9PSAwKQorCXsKKwkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSAhPSBCU1NfQURIT0MpCisJCXsKKwkJCS8vIENvbmZpZyBoYXMgY2hhbmdlZAorCQkJcEFkYXB0ZXItPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKKyAgICAgICAgICAgIGlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFJYX0ZJTFRSX0NGRywgU1RBTk9STUFMKTsKKyAgICAgICAgICAgICAgICBSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQkJCVZhbHVlICY9ICh+MHg4MCk7CisJCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKyAgICAgICAgICAgICAgICBPUFNUQVRVU19DTEVBUl9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9IFRSVUU7CisgICAgICAgICAgICAgICAgTGlua0Rvd24ocEFkYXB0ZXIsIEZBTFNFKTsKKyAgICAgICAgICAgIH0KKwkJCWlmIChJTkZSQV9PTihwQWRhcHRlcikpCisJCQl7CisJCQkJLy9CT09MRUFOIENhbmNlbGxlZDsKKwkJCQkvLyBTZXQgdGhlIEF1dG9SZWNvbm5lY3RTc2lkIHRvIHByZXZlbnQgaXQgcmVjb25uZWN0IHRvIG9sZCBTU0lECisJCQkJLy8gU2luY2UgY2FsbGluZyB0aGlzIGluZGljYXRlIHVzZXIgZG9uJ3Qgd2FudCB0byBjb25uZWN0IHRvIHRoYXQgU1NJRCBhbnltb3JlLgorCQkJCXBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuPSAzMjsKKwkJCQlOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pOworCisJCQkJTGlua0Rvd24ocEFkYXB0ZXIsIEZBTFNFKTsKKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQkIhXG4iKSk7CisJCQl9CisJCX0KKwkJcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0FESE9DOworICAgICAgICBwQWRhcHRlci0+bmV0X2Rldi0+dHlwZSA9IHBBZGFwdGVyLT5TdGFDZmcuT3JpRGV2VHlwZTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PlNldF9OZXR3b3JrVHlwZV9Qcm9jOjooQUQtSE9DKVxuIikpOworCX0KKyAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiSW5mcmEiKSA9PSAwKQorCXsKKwkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSAhPSBCU1NfSU5GUkEpCisJCXsKKwkJCS8vIENvbmZpZyBoYXMgY2hhbmdlZAorCQkJcEFkYXB0ZXItPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKKyAgICAgICAgICAgIGlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFJYX0ZJTFRSX0NGRywgU1RBTk9STUFMKTsKKyAgICAgICAgICAgICAgICBSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQkJCVZhbHVlICY9ICh+MHg4MCk7CisJCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKyAgICAgICAgICAgICAgICBPUFNUQVRVU19DTEVBUl9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9IFRSVUU7CisgICAgICAgICAgICAgICAgTGlua0Rvd24ocEFkYXB0ZXIsIEZBTFNFKTsKKyAgICAgICAgICAgIH0KKwkJCWlmIChBREhPQ19PTihwQWRhcHRlcikpCisJCQl7CisJCQkJLy8gU2V0IHRoZSBBdXRvUmVjb25uZWN0U3NpZCB0byBwcmV2ZW50IGl0IHJlY29ubmVjdCB0byBvbGQgU1NJRAorCQkJCS8vIFNpbmNlIGNhbGxpbmcgdGhpcyBpbmRpY2F0ZSB1c2VyIGRvbid0IHdhbnQgdG8gY29ubmVjdCB0byB0aGF0IFNTSUQgYW55bW9yZS4KKwkJCQlwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7CisJCQkJTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKKworCQkJCUxpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7CisJCQl9CisJCX0KKwkJcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0lORlJBOworICAgICAgICBwQWRhcHRlci0+bmV0X2Rldi0+dHlwZSA9IHBBZGFwdGVyLT5TdGFDZmcuT3JpRGV2VHlwZTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PlNldF9OZXR3b3JrVHlwZV9Qcm9jOjooSU5GUkEpXG4iKSk7CisKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0lORlJBOworCX0KKyAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiTW9uaXRvciIpID09IDApCisgICAgeworCQlVQ0hBUgliYnBWYWx1ZSA9IDA7CisJCUJDTl9USU1FX0NGR19TVFJVQyBjc3I7CisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfSU5GUkFfT04pOworICAgICAgICBPUFNUQVRVU19DTEVBUl9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX0FESE9DX09OKTsKKwkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKwkJLy8gZGlzYWJsZSBhbGwgcGVyaW9kaWMgc3RhdGUgbWFjaGluZQorCQlwQWRhcHRlci0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID0gRkFMU0U7CisJCS8vIHJlc2V0IGFsbCBtbG1lIHN0YXRlIG1hY2hpbmUKKwkJUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEIFxuIikpOworICAgICAgICBpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9PSAwKQorICAgICAgICB7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFOX01JWEVEKQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSAzNjsKKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gNjsKKyAgICAgICAgfQorI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgICAgICBlbHNlCisgICAgICAgICAgICBOX0NoYW5uZWxDaGVjayhwQWRhcHRlcik7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQgJiYKKyAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwICYmCisgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPT0gRVhUQ0hBX0FCT1ZFKQorCQl7CisJCQkvLyA0ME1IeiAsY29udHJvbCBjaGFubmVsIGF0IGxvd2VyCisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgJmJicFZhbHVlKTsKKwkJCWJicFZhbHVlICY9ICh+MHgxOCk7CisJCQliYnBWYWx1ZSB8PSAweDEwOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCBiYnBWYWx1ZSk7CisJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzQwOworCQkJLy8gIFJYIDogY29udHJvbCBjaGFubmVsIGF0IGxvd2VyCisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SMywgJmJicFZhbHVlKTsKKwkJCWJicFZhbHVlICY9ICh+MHgyMCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjMsIGJicFZhbHVlKTsKKworCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX0JBTkRfQ0ZHLCAmVmFsdWUpOworCQkJVmFsdWUgJj0gMHhmZmZmZmZmZTsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfQkFORF9DRkcsIFZhbHVlKTsKKwkJCXBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwgKyAyOworICAgICAgICAgICAgQXNpY1N3aXRjaENoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKKwkJICAgIEFzaWNMb2NrQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCV180MCAsY29udHJvbF9jaGFubmVsKCVkKSwgQ2VudHJhbENoYW5uZWwoJWQpIFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpKTsKKwkJfQorCQllbHNlIGlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCAmJgorICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PSBCV180MCAmJgorICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPT0gRVhUQ0hBX0JFTE9XKQorCQl7CisJCQkvLyA0ME1IeiAsY29udHJvbCBjaGFubmVsIGF0IHVwcGVyCisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgJmJicFZhbHVlKTsKKwkJCWJicFZhbHVlICY9ICh+MHgxOCk7CisJCQliYnBWYWx1ZSB8PSAweDEwOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCBiYnBWYWx1ZSk7CisJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzQwOworCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX0JBTkRfQ0ZHLCAmVmFsdWUpOworCQkJVmFsdWUgfD0gMHgxOworCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9CQU5EX0NGRywgVmFsdWUpOworCisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SMywgJmJicFZhbHVlKTsKKwkJCWJicFZhbHVlIHw9ICgweDIwKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SMywgYmJwVmFsdWUpOworCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCAtIDI7CisgICAgICAgICAgICBBc2ljU3dpdGNoQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOworCQkgICAgQXNpY0xvY2tDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJXXzQwICxjb250cm9sX2NoYW5uZWwoJWQpLCBDZW50cmFsQ2hhbm5lbCglZCkgXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCkpOworCQl9CisJCWVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJeworCQkJLy8gMjBNSHoKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCAmYmJwVmFsdWUpOworCQkJYmJwVmFsdWUgJj0gKH4weDE4KTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgYmJwVmFsdWUpOworCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV18yMDsKKwkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKKwkJCUFzaWNMb2NrQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJXXzIwLCBDaGFubmVsKCVkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJCX0KKwkJLy8gRW5hYmxlIFJ4IHdpdGggcHJvbWlzY3VvdXMgcmVjZXB0aW9uCisJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgUlhfRklMVFJfQ0ZHLCAweDMpOworCQkvLyBBU0lDIHN1cHBvcnN0cyBzbmlmZmVyIGZ1bmN0aW9uIHdpdGggcmVwbGFjaW5nIFJTU0kgd2l0aCB0aW1lc3RhbXAuCisJCS8vUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJLy9WYWx1ZSB8PSAoMHg4MCk7CisJCS8vUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKKwkJLy8gZGlzYWJsZSBzeW5jCisJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBCQ05fVElNRV9DRkcsICZjc3Iud29yZCk7CisJCWNzci5maWVsZC5iQmVhY29uR2VuID0gMDsKKwkJY3NyLmZpZWxkLmJUQlRURW5hYmxlID0gMDsKKwkJY3NyLmZpZWxkLlRzZlN5bmNNb2RlID0gMDsKKwkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBCQ05fVElNRV9DRkcsIGNzci53b3JkKTsKKworCQlwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfTU9OSVRPUjsKKyAgICAgICAgcEFkYXB0ZXItPm5ldF9kZXYtPnR5cGUgPSBBUlBIUkRfSUVFRTgwMjExX1BSSVNNOyAvL0FSUEhSRF9JRUVFODAyMTE7IC8vIElFRUU4MDIxMQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+U2V0X05ldHdvcmtUeXBlX1Byb2M6OihNT05JVE9SKVxuIikpOworICAgIH0KKworICAgIC8vIFJlc2V0IFJhbGluayBzdXBwbGljYW50IHRvIG5vdCB1c2UsIGl0IHdpbGwgYmUgc2V0IHRvIHN0YXJ0IHdoZW4gVUkgc2V0IFBNSyBrZXkKKyAgICBwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X05ldHdvcmtUeXBlX1Byb2M6OihOZXR3b3JrVHlwZT0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSkpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEF1dGhlbnRpY2F0aW9uIG1vZGUKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfQXV0aE1vZGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGlmICgoc3RyY21wKGFyZywgIldFUEFVVE8iKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndlcGF1dG8iKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2g7CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJPUEVOIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJvcGVuIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiU0hBUkVEIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJzaGFyZWQiKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZDsKKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldQQVBTSyIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid3BhcHNrIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s7CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXUEFOT05FIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGFub25lIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOworICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV1BBMlBTSyIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid3BhMnBzayIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXUEEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndwYSIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBOworICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV1BBMiIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid3BhMiIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMjsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0F1dGhNb2RlX1Byb2M6OihBdXRoTW9kZT0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUpKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBFbmNyeXB0aW9uIFR5cGUKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfRW5jcnlwVHlwZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaWYgKChzdHJjbXAoYXJnLCAiTk9ORSIpID09IDApIHx8IChzdHJjbXAoYXJnLCAibm9uZSIpID09IDApKQorICAgIHsKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgICAgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwkgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciAgID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgIH0KKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldFUCIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid2VwIikgPT0gMCkpCisgICAgeworICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgICAgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKwkgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciAgID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisgICAgfQorICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiVEtJUCIpID09IDApIHx8IChzdHJjbXAoYXJnLCAidGtpcCIpID09IDApKQorICAgIHsKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisgICAgfQorICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiQUVTIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJhZXMiKSA9PSAwKSkKKyAgICB7CisgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworCSAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0VuY3J5cFR5cGVfUHJvYzo6KEVuY3J5cFR5cGU9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cykpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IERlZmF1bHQgS2V5IElECisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0RlZmF1bHRLZXlJRF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5SWR4OworCisgICAgS2V5SWR4ID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKyAgICBpZigoS2V5SWR4ID49IDEgKSAmJiAoS2V5SWR4IDw9IDQpKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChVQ0hBUikgKEtleUlkeCAtIDEgKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAorCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0RlZmF1bHRLZXlJRF9Qcm9jOjooRGVmYXVsdEtleUlEPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQpKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXRVAgS0VZMQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9LZXkxX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlMZW47CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGc9Q0lQSEVSX1dFUDY0OworCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgS2V5TGVuID0gc3RybGVuKGFyZyk7CisKKyAgICBzd2l0Y2ggKEtleUxlbikKKyAgICB7CisgICAgICAgIGNhc2UgNTogLy93ZXAgNDAgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkxX1Byb2M6OihLZXkxPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMDogLy93ZXAgNDAgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6KEtleTE9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMzogLy93ZXAgMTA0IEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6KEtleTE9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI2OiAvL3dlcCAxMDQgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkxX1Byb2M6OihLZXkxPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8vSW52YWxpZCBhcmd1bWVudAorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6SW52YWxpZCBhcmd1bWVudCAoPSVzKVxuIiwgYXJnKSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisKKyAgICAvLyBTZXQga2V5cyAoaW50byBBU0lDKQorICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgOyAgIC8vIG5vdCBzdXBwb3J0CisgICAgZWxzZSAgICAvLyBPbGQgV0VQIHN0dWZmCisgICAgeworICAgICAgICBBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdFUCBLRVkyCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0tleTJfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUxlbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZz1DSVBIRVJfV0VQNjQ7CisKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICBLZXlMZW4gPSBzdHJsZW4oYXJnKTsKKworICAgIHN3aXRjaCAoS2V5TGVuKQorICAgIHsKKyAgICAgICAgY2FzZSA1OiAvL3dlcCA0MCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTJfUHJvYzo6KEtleTI9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEwOiAvL3dlcCA0MCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjooS2V5Mj0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEzOiAvL3dlcCAxMDQgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjooS2V5Mj0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjY6IC8vd2VwIDEwNCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTJfUHJvYzo6KEtleTI9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogLy9JbnZhbGlkIGFyZ3VtZW50CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjpJbnZhbGlkIGFyZ3VtZW50ICg9JXMpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisKKyAgICAvLyBTZXQga2V5cyAoaW50byBBU0lDKQorICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgOyAgIC8vIG5vdCBzdXBwb3J0CisgICAgZWxzZSAgICAvLyBPbGQgV0VQIHN0dWZmCisgICAgeworICAgICAgICBBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uQ2lwaGVyQWxnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXRVAgS0VZMworICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9LZXkzX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlMZW47CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGc9Q0lQSEVSX1dFUDY0OworCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgS2V5TGVuID0gc3RybGVuKGFyZyk7CisKKyAgICBzd2l0Y2ggKEtleUxlbikKKyAgICB7CisgICAgICAgIGNhc2UgNTogLy93ZXAgNDAgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkzX1Byb2M6OihLZXkzPSVzIGFuZCB0eXBlPUFzY2lpKVxuIiwgYXJnKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMDogLy93ZXAgNDAgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTNfUHJvYzo6KEtleTM9JXMgYW5kIHR5cGU9SGV4KVxuIiwgYXJnKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMzogLy93ZXAgMTA0IEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTNfUHJvYzo6KEtleTM9JXMgYW5kIHR5cGU9QXNjaWkpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI2OiAvL3dlcCAxMDQgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkzX1Byb2M6OihLZXkzPSVzIGFuZCB0eXBlPUhleClcbiIsIGFyZykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8vSW52YWxpZCBhcmd1bWVudAorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTNfUHJvYzo6SW52YWxpZCBhcmd1bWVudCAoPSVzKVxuIiwgYXJnKSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCisgICAgLy8gU2V0IGtleXMgKGludG8gQVNJQykKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIDsgICAvLyBub3Qgc3VwcG9ydAorICAgIGVsc2UgICAgLy8gT2xkIFdFUCBzdHVmZgorICAgIHsKKyAgICAgICAgQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLkNpcGhlckFsZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV0VQIEtFWTQKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfS2V5NF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5TGVuOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnPUNJUEhFUl9XRVA2NDsKKworICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgIEtleUxlbiA9IHN0cmxlbihhcmcpOworCisgICAgc3dpdGNoIChLZXlMZW4pCisgICAgeworICAgICAgICBjYXNlIDU6IC8vd2VwIDQwIEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5NF9Qcm9jOjooS2V5ND0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTA6IC8vd2VwIDQwIEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OihLZXk0PSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTM6IC8vd2VwIDEwNCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OihLZXk0PSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyNjogLy93ZXAgMTA0IEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5NF9Qcm9jOjooS2V5ND0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvL0ludmFsaWQgYXJndW1lbnQKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OkludmFsaWQgYXJndW1lbnQgKD0lcylcbiIsIGFyZykpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworICAgIC8vIFNldCBrZXlzIChpbnRvIEFTSUMpCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICA7ICAgLy8gbm90IHN1cHBvcnQKKyAgICBlbHNlICAgIC8vIE9sZCBXRVAgc3R1ZmYKKyAgICB7CisgICAgICAgIEFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5DaXBoZXJBbGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV1BBIFBTSyBrZXkKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfV1BBUFNLX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICBrZXlNYXRlcmlhbFs0MF07CisKKyAgICBpZiAoKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSAmJgorICAgICAgICAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSAmJgorCSAgICAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorCQkpCisgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfV1BBUFNLX1Byb2M6OihXUEFQU0s9JXMpXG4iLCBhcmcpKTsKKworICAgIE5kaXNaZXJvTWVtb3J5KGtleU1hdGVyaWFsLCA0MCk7CisKKyAgICBpZiAoKHN0cmxlbihhcmcpIDwgOCkgfHwgKHN0cmxlbihhcmcpID4gNjQpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IGZhaWxlZCEhKFdQQVBTSz0lcyksIFdQQVBTSyBrZXktc3RyaW5nIHJlcXVpcmVkIDggfiA2NCBjaGFyYWN0ZXJzIFxuIiwgYXJnKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBpZiAoc3RybGVuKGFyZykgPT0gNjQpCisgICAgeworICAgICAgICBBdG9IKGFyZywga2V5TWF0ZXJpYWwsIDMyKTsKKyAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlN0YUNmZy5QTUssIGtleU1hdGVyaWFsLCAzMik7CisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgUGFzc3dvcmRIYXNoKChjaGFyICopYXJnLCBwQWRhcHRlci0+TWxtZUF1eC5Tc2lkLCBwQWRhcHRlci0+TWxtZUF1eC5Tc2lkTGVuLCBrZXlNYXRlcmlhbCk7CisgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TdGFDZmcuUE1LLCBrZXlNYXRlcmlhbCwgMzIpOworICAgIH0KKworCisKKyAgICBpZihwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DICYmCisgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorICAgIHsKKyAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vIFN0YXJ0IFNUQSBzdXBwbGljYW50IHN0YXRlIG1hY2hpbmUKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1NUQVJUOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBQb3dlciBTYXZpbmcgbW9kZQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9QU01vZGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0lORlJBKQorICAgIHsKKyAgICAgICAgaWYgKChzdHJjbXAoYXJnLCAiTWF4X1BTUCIpID09IDApIHx8CisJCQkoc3RyY21wKGFyZywgIm1heF9wc3AiKSA9PSAwKSB8fAorCQkJKHN0cmNtcChhcmcsICJNQVhfUFNQIikgPT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tGb3JQc21DaGFuZ2UoKQorICAgICAgICAgICAgLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQOworICAgICAgICAgICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gNTsKKworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiRmFzdF9QU1AiKSA9PSAwKSB8fAorCQkJCSAoc3RyY21wKGFyZywgImZhc3RfcHNwIikgPT0gMCkgfHwKKyAgICAgICAgICAgICAgICAgKHN0cmNtcChhcmcsICJGQVNUX1BTUCIpID09IDApKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBkbyBOT1QgdHVybiBvbiBQU00gYml0IGhlcmUsIHdhaXQgdW50aWwgTWxtZUNoZWNrRm9yUHNtQ2hhbmdlKCkKKyAgICAgICAgICAgIC8vIHRvIGV4Y2x1ZGUgY2VydGFpbiBzaXR1YXRpb25zLgorICAgICAgICAgICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUDsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gMzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIkxlZ2FjeV9QU1AiKSA9PSAwKSB8fAorICAgICAgICAgICAgICAgICAoc3RyY21wKGFyZywgImxlZ2FjeV9wc3AiKSA9PSAwKSB8fAorICAgICAgICAgICAgICAgICAoc3RyY21wKGFyZywgIkxFR0FDWV9QU1AiKSA9PSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZG8gTk9UIHR1cm4gb24gUFNNIGJpdCBoZXJlLCB3YWl0IHVudGlsIE1sbWVDaGVja0ZvclBzbUNoYW5nZSgpCisgICAgICAgICAgICAvLyB0byBleGNsdWRlIGNlcnRhaW4gc2l0dWF0aW9ucy4KKyAgICAgICAgICAgIE9QU1RBVFVTX1NFVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7CisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSAzOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy9EZWZhdWx0IE5kaXM4MDJfMTFQb3dlck1vZGVDQU0KKyAgICAgICAgICAgIC8vIGNsZWFyIFBTTSBiaXQgaW1tZWRpYXRlbHkKKyAgICAgICAgICAgIE1sbWVTZXRQc21CaXQocEFkYXB0ZXIsIFBXUl9BQ1RJVkUpOworICAgICAgICAgICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTTsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNOworICAgICAgICB9CisKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1BTTW9kZV9Qcm9jOjooUFNNb2RlPSVsZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSkpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsKKworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXcGFTdXBwb3J0IGZsYWcuCisgICAgVmFsdWU6CisgICAgICAgIDA6IERyaXZlciBpZ25vcmUgd3BhX3N1cHBsaWNhbnQuCisgICAgICAgIDE6IHdwYV9zdXBwbGljYW50IGluaXRpYXRlcyBzY2FubmluZyBhbmQgQVAgc2VsZWN0aW9uLgorICAgICAgICAyOiBkcml2ZXIgdGFrZXMgY2FyZSBvZiBzY2FubmluZywgQVAgc2VsZWN0aW9uLCBhbmQgSUVFRSA4MDIuMTEgYXNzb2NpYXRpb24gcGFyYW1ldGVycy4KKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfV3BhX1N1cHBvcnQoCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCisgICAgaWYgKCBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDApCisgICAgICAgIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEU7CisgICAgZWxzZSBpZiAoIHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMSkKKyAgICAgICAgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFOworICAgIGVsc2UgaWYgKCBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDIpCisgICAgICAgIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IFdQQV9TVVBQTElDQU5UX0VOQUJMRV9XSVRIX1dFQl9VSTsKKyAgICBlbHNlCisgICAgICAgIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEU7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfV3BhX1N1cHBvcnQ6OihXcGFTdXBwbGljYW50VVA9JWQpXG4iLCBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApKTsKKworICAgIHJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIERCRworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBSZWFkIC8gV3JpdGUgTUFDCisgICAgQXJndW1lbnRzOgorICAgICAgICBwQWRhcHRlciAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorICAgICAgICB3cnEgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW9jdGwgYXJndW1lbnQKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgTm9uZQorCisgICAgTm90ZToKKyAgICAgICAgVXNhZ2U6CisgICAgICAgICAgICAgICAxLikgaXdwcml2IHJhMCBtYWMgMCAgICAgICAgPT0+IHJlYWQgTUFDIHdoZXJlIEFkZHI9MHgwCisgICAgICAgICAgICAgICAyLikgaXdwcml2IHJhMCBtYWMgMD0xMiAgICAgPT0+IHdyaXRlIE1BQyB3aGVyZSBBZGRyPTB4MCwgdmFsdWU9MTIKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUElvY3RsTUFDKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4Jc3RydWN0IGl3cmVxCSp3cnEpCit7CisJQ0hBUgkJCQkqdGhpc19jaGFyOworCUNIQVIJCQkJKnZhbHVlOworCUlOVAkJCQkJaiA9IDAsIGsgPSAwOworCUNIQVIJCQkJbXNnWzEwMjRdOworCUNIQVIJCQkJYXJnWzI1NV07CisJVUxPTkcJCQkJbWFjQWRkciA9IDA7CisJVUNIQVIJCQkJdGVtcFsxNl0sIHRlbXAyWzE2XTsKKwlVSU5UMzIJCQkJbWFjVmFsdWUgPSAwOworCUlOVAkJCQkJU3RhdHVzOworCisKKwltZW1zZXQobXNnLCAweDAwLCAxMDI0KTsKKwlpZiAod3JxLT51LmRhdGEubGVuZ3RoID4gMSkgLy9ObyBwYXJhbWV0ZXJzLgorCXsKKwkgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoYXJnLCB3cnEtPnUuZGF0YS5wb2ludGVyLCAod3JxLT51LmRhdGEubGVuZ3RoID4gMjU1KSA/IDI1NSA6IHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCXNwcmludGYobXNnLCAiXG4iKTsKKworCQkvL1BhcnNpbmcgUmVhZCBvciBXcml0ZQorCSAgICB0aGlzX2NoYXIgPSBhcmc7CisJCWlmICghKnRoaXNfY2hhcikKKwkJCWdvdG8gbmV4dDsKKworCQlpZiAoKHZhbHVlID0gcnRzdHJjaHIodGhpc19jaGFyLCAnPScpKSAhPSBOVUxMKQorCQkJKnZhbHVlKysgPSAwOworCisJCWlmICghdmFsdWUgfHwgISp2YWx1ZSkKKwkJeyAvL1JlYWQKKwkJCS8vIFNhbml0eSBjaGVjaworCQkJaWYoc3RybGVuKHRoaXNfY2hhcikgPiA0KQorCQkJCWdvdG8gbmV4dDsKKworCQkJaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQlpZih0aGlzX2NoYXJbal0gPiAnZicgfHwgdGhpc19jaGFyW2pdIDwgJzAnKQorCQkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vIE1hYyBBZGRyCisJCQlrID0gaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQl0aGlzX2NoYXJbNC1rK2pdID0gdGhpc19jaGFyW2pdOworCQkJfQorCisJCQl3aGlsZShrIDwgNCkKKwkJCQl0aGlzX2NoYXJbMy1rKytdPScwJzsKKwkJCXRoaXNfY2hhcls0XT0nXDAnOworCisJCQlpZihzdHJsZW4odGhpc19jaGFyKSA9PSA0KQorCQkJeworCQkJCUF0b0godGhpc19jaGFyLCB0ZW1wLCAyKTsKKwkJCQltYWNBZGRyID0gKnRlbXAqMjU2ICsgdGVtcFsxXTsKKwkJCQlpZiAobWFjQWRkciA8IDB4RkZGRikKKwkJCQl7CisJCQkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBtYWNBZGRyLCAmbWFjVmFsdWUpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYWNBZGRyPSVseCwgTWFjVmFsdWU9JXhcbiIsIG1hY0FkZHIsIG1hY1ZhbHVlKSk7CisJCQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiWzB4JTA4bFhdOiUwOFggICIsIG1hY0FkZHIgLCBtYWNWYWx1ZSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7Ly9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIGJicAorCQkJCQlnb3RvIG5leHQ7CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UKKwkJeyAvL1dyaXRlCisJCQltZW1jcHkoJnRlbXAyLCB2YWx1ZSwgc3RybGVuKHZhbHVlKSk7CisJCQl0ZW1wMltzdHJsZW4odmFsdWUpXSA9ICdcMCc7CisKKwkJCS8vIFNhbml0eSBjaGVjaworCQkJaWYoKHN0cmxlbih0aGlzX2NoYXIpID4gNCkgfHwgc3RybGVuKHRlbXAyKSA+IDgpCisJCQkJZ290byBuZXh0OworCisJCQlqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCWlmKHRoaXNfY2hhcltqXSA+ICdmJyB8fCB0aGlzX2NoYXJbal0gPCAnMCcpCisJCQkJCXJldHVybjsKKwkJCX0KKworCQkJaiA9IHN0cmxlbih0ZW1wMik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCWlmKHRlbXAyW2pdID4gJ2YnIHx8IHRlbXAyW2pdIDwgJzAnKQorCQkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vTUFDIEFkZHIKKwkJCWsgPSBqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCXRoaXNfY2hhcls0LWsral0gPSB0aGlzX2NoYXJbal07CisJCQl9CisKKwkJCXdoaWxlKGsgPCA0KQorCQkJCXRoaXNfY2hhclszLWsrK109JzAnOworCQkJdGhpc19jaGFyWzRdPSdcMCc7CisKKwkJCS8vTUFDIHZhbHVlCisJCQlrID0gaiA9IHN0cmxlbih0ZW1wMik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCXRlbXAyWzgtaytqXSA9IHRlbXAyW2pdOworCQkJfQorCisJCQl3aGlsZShrIDwgOCkKKwkJCQl0ZW1wMls3LWsrK109JzAnOworCQkJdGVtcDJbOF09J1wwJzsKKworCQkJeworCQkJCUF0b0godGhpc19jaGFyLCB0ZW1wLCAyKTsKKwkJCQltYWNBZGRyID0gKnRlbXAqMjU2ICsgdGVtcFsxXTsKKworCQkJCUF0b0godGVtcDIsIHRlbXAsIDQpOworCQkJCW1hY1ZhbHVlID0gKnRlbXAqMjU2KjI1NioyNTYgKyB0ZW1wWzFdKjI1NioyNTYgKyB0ZW1wWzJdKjI1NiArIHRlbXBbM107CisKKwkJCQkvLyBkZWJ1ZyBtb2RlCisJCQkJaWYgKG1hY0FkZHIgPT0gKEhXX0RFQlVHX1NFVFRJTkdfQkFTRSArIDQpKQorCQkJCXsKKwkJCQkJLy8gMHgyYmY0OiBieXRlMCBub24temVybzogZW5hYmxlIFIxNyB0dW5pbmcsIDA6IGRpc2FibGUgUjE3IHR1bmluZworICAgICAgICAgICAgICAgICAgICBpZiAobWFjVmFsdWUgJiAweDAwMDAwMGZmKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+QmJwVHVuaW5nLmJFbmFibGUgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJ0dXJuIG9uIFIxNyB0dW5pbmdcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIFI2NjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5CYnBUdW5pbmcuYkVuYWJsZSA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgUjY2ID0gMHgyNiArIEdFVF9MTkFfR0FJTihwQWRhcHRlcik7CisjaWZkZWYgUkFMSU5LX0FURQorCQkJCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQkJCQl7CisJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjY2LCAoMHgyNiArIEdFVF9MTkFfR0FJTihwQWRhcHRlcikpKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjY2LCAoMHgyNiArIEdFVF9MTkFfR0FJTihwQWRhcHRlcikpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgidHVybiBvZmYgUjE3IHR1bmluZywgcmVzdG9yZSB0byAweCUwMnhcbiIsIFI2NikpOworICAgICAgICAgICAgICAgICAgICB9CisJCQkJCXJldHVybjsKKwkJCQl9CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYWNBZGRyPSUwMmx4LCBNYWNWYWx1ZT0weCV4XG4iLCBtYWNBZGRyLCBtYWNWYWx1ZSkpOworCisJCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBtYWNBZGRyLCBtYWNWYWx1ZSk7CisJCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICJbMHglMDhsWF06JTA4WCAgIiwgbWFjQWRkciwgbWFjVmFsdWUpOworCQkJfQorCQl9CisJfQorbmV4dDoKKwlpZihzdHJsZW4obXNnKSA9PSAxKQorCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIj09PT5FcnJvciBjb21tYW5kIGZvcm1hdCEiKTsKKworCS8vIENvcHkgdGhlIGluZm9ybWF0aW9uIGludG8gdGhlIHVzZXIgYnVmZmVyCisJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKG1zZyk7CisJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIG1zZywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PVJUTVBJb2N0bE1BQ1xuXG4iKSk7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgUmVhZCAvIFdyaXRlIEUyUFJPTQorICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkYXB0ZXIgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKyAgICAgICAgd3JxICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlvY3RsIGFyZ3VtZW50CisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIE5vbmUKKworICAgIE5vdGU6CisgICAgICAgIFVzYWdlOgorICAgICAgICAgICAgICAgMS4pIGl3cHJpdiByYTAgZTJwIDAgICAgIAk9PT4gcmVhZCBFMlBST00gd2hlcmUgQWRkcj0weDAKKyAgICAgICAgICAgICAgIDIuKSBpd3ByaXYgcmEwIGUycCAwPTEyMzQgICAgPT0+IHdyaXRlIEUyUFJPTSB3aGVyZSBBZGRyPTB4MCwgdmFsdWU9MTIzNAorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QSW9jdGxFMlBST00oCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglzdHJ1Y3QgaXdyZXEJKndycSkKK3sKKwlDSEFSCQkJCSp0aGlzX2NoYXI7CisJQ0hBUgkJCQkqdmFsdWU7CisJSU5UCQkJCQlqID0gMCwgayA9IDA7CisJQ0hBUgkJCQltc2dbMTAyNF07CisJQ0hBUgkJCQlhcmdbMjU1XTsKKwlVU0hPUlQJCQkJZWVwQWRkciA9IDA7CisJVUNIQVIJCQkJdGVtcFsxNl0sIHRlbXAyWzE2XTsKKwlVU0hPUlQJCQkJZWVwVmFsdWU7CisJaW50CQkJCQlTdGF0dXM7CisKKworCW1lbXNldChtc2csIDB4MDAsIDEwMjQpOworCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggPiAxKSAvL05vIHBhcmFtZXRlcnMuCisJeworCSAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihhcmcsIHdycS0+dS5kYXRhLnBvaW50ZXIsICh3cnEtPnUuZGF0YS5sZW5ndGggPiAyNTUpID8gMjU1IDogd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJc3ByaW50Zihtc2csICJcbiIpOworCisJICAgIC8vUGFyc2luZyBSZWFkIG9yIFdyaXRlCisJCXRoaXNfY2hhciA9IGFyZzsKKworCisJCWlmICghKnRoaXNfY2hhcikKKwkJCWdvdG8gbmV4dDsKKworCQlpZiAoKHZhbHVlID0gcnRzdHJjaHIodGhpc19jaGFyLCAnPScpKSAhPSBOVUxMKQorCQkJKnZhbHVlKysgPSAwOworCisJCWlmICghdmFsdWUgfHwgISp2YWx1ZSkKKwkJeyAvL1JlYWQKKworCQkJLy8gU2FuaXR5IGNoZWNrCisJCQlpZihzdHJsZW4odGhpc19jaGFyKSA+IDQpCisJCQkJZ290byBuZXh0OworCisJCQlqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCWlmKHRoaXNfY2hhcltqXSA+ICdmJyB8fCB0aGlzX2NoYXJbal0gPCAnMCcpCisJCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy8gRTJQUk9NIGFkZHIKKwkJCWsgPSBqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCXRoaXNfY2hhcls0LWsral0gPSB0aGlzX2NoYXJbal07CisJCQl9CisKKwkJCXdoaWxlKGsgPCA0KQorCQkJCXRoaXNfY2hhclszLWsrK109JzAnOworCQkJdGhpc19jaGFyWzRdPSdcMCc7CisKKwkJCWlmKHN0cmxlbih0aGlzX2NoYXIpID09IDQpCisJCQl7CisJCQkJQXRvSCh0aGlzX2NoYXIsIHRlbXAsIDIpOworCQkJCWVlcEFkZHIgPSAqdGVtcCoyNTYgKyB0ZW1wWzFdOworCQkJCWlmIChlZXBBZGRyIDwgMHhGRkZGKQorCQkJCXsKKwkJCQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkYXB0ZXIsIGVlcEFkZHIsIGVlcFZhbHVlKTsKKwkJCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICJbMHglMDRYXToweCUwNFggICIsIGVlcEFkZHIgLCBlZXBWYWx1ZSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7Ly9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIGJicAorCQkJCQlnb3RvIG5leHQ7CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UKKwkJeyAvL1dyaXRlCisJCQltZW1jcHkoJnRlbXAyLCB2YWx1ZSwgc3RybGVuKHZhbHVlKSk7CisJCQl0ZW1wMltzdHJsZW4odmFsdWUpXSA9ICdcMCc7CisKKwkJCS8vIFNhbml0eSBjaGVjaworCQkJaWYoKHN0cmxlbih0aGlzX2NoYXIpID4gNCkgfHwgc3RybGVuKHRlbXAyKSA+IDgpCisJCQkJZ290byBuZXh0OworCisJCQlqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCWlmKHRoaXNfY2hhcltqXSA+ICdmJyB8fCB0aGlzX2NoYXJbal0gPCAnMCcpCisJCQkJCXJldHVybjsKKwkJCX0KKwkJCWogPSBzdHJsZW4odGVtcDIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQlpZih0ZW1wMltqXSA+ICdmJyB8fCB0ZW1wMltqXSA8ICcwJykKKwkJCQkJcmV0dXJuOworCQkJfQorCisJCQkvL01BQyBBZGRyCisJCQlrID0gaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQl0aGlzX2NoYXJbNC1rK2pdID0gdGhpc19jaGFyW2pdOworCQkJfQorCisJCQl3aGlsZShrIDwgNCkKKwkJCQl0aGlzX2NoYXJbMy1rKytdPScwJzsKKwkJCXRoaXNfY2hhcls0XT0nXDAnOworCisJCQkvL01BQyB2YWx1ZQorCQkJayA9IGogPSBzdHJsZW4odGVtcDIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQl0ZW1wMls0LWsral0gPSB0ZW1wMltqXTsKKwkJCX0KKworCQkJd2hpbGUoayA8IDQpCisJCQkJdGVtcDJbMy1rKytdPScwJzsKKwkJCXRlbXAyWzRdPSdcMCc7CisKKwkJCUF0b0godGhpc19jaGFyLCB0ZW1wLCAyKTsKKwkJCWVlcEFkZHIgPSAqdGVtcCoyNTYgKyB0ZW1wWzFdOworCisJCQlBdG9IKHRlbXAyLCB0ZW1wLCAyKTsKKwkJCWVlcFZhbHVlID0gKnRlbXAqMjU2ICsgdGVtcFsxXTsKKworCQkJUlQyOHh4X0VFUFJPTV9XUklURTE2KHBBZGFwdGVyLCBlZXBBZGRyLCBlZXBWYWx1ZSk7CisJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIlsweCUwMlhdOiUwMlggICIsIGVlcEFkZHIsIGVlcFZhbHVlKTsKKwkJfQorCX0KK25leHQ6CisJaWYoc3RybGVuKG1zZykgPT0gMSkKKwkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICI9PT0+RXJyb3IgY29tbWFuZCBmb3JtYXQhIik7CisKKworCS8vIENvcHkgdGhlIGluZm9ybWF0aW9uIGludG8gdGhlIHVzZXIgYnVmZmVyCisJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKG1zZyk7CisJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIG1zZywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PVJUTVBJb2N0bEUyUFJPTVxuIikpOworfQorI2VuZGlmIC8vIERCRyAvLworCisKKworCitJTlQgU2V0X1RHbldpZmlUZXN0X1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaWYgKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMCkKKyAgICAgICAgcEFkLT5TdGFDZmcuYlRHbldpZmlUZXN0ID0gRkFMU0U7CisgICAgZWxzZQorICAgICAgICBwQWQtPlN0YUNmZy5iVEduV2lmaVRlc3QgPSBUUlVFOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUYgU2V0X1RHbldpZmlUZXN0X1Byb2M6OihiVEduV2lmaVRlc3Q9JWQpXG4iLCBwQWQtPlN0YUNmZy5iVEduV2lmaVRlc3QpKTsKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UIFNldF9Mb25nUmV0cnlMaW1pdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVRYX1JUWV9DRkdfU1RSVUMJdHhfcnR5X2NmZzsKKwlVQ0hBUgkJCQlMb25nUmV0cnlMaW1pdCA9IChVQ0hBUilzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOworCXR4X3J0eV9jZmcuZmllbGQuTG9uZ1J0eUxpbWl0ID0gTG9uZ1JldHJ5TGltaXQ7CisJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCB0eF9ydHlfY2ZnLndvcmQpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklGIFNldF9Mb25nUmV0cnlMaW1pdF9Qcm9jOjoodHhfcnR5X2NmZz0weCV4KVxuIiwgdHhfcnR5X2NmZy53b3JkKSk7CisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVCBTZXRfU2hvcnRSZXRyeUxpbWl0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVFhfUlRZX0NGR19TVFJVQwl0eF9ydHlfY2ZnOworCVVDSEFSCQkJCVNob3J0UmV0cnlMaW1pdCA9IChVQ0hBUilzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOworCXR4X3J0eV9jZmcuZmllbGQuU2hvcnRSdHlMaW1pdCA9IFNob3J0UmV0cnlMaW1pdDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsIHR4X3J0eV9jZmcud29yZCk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUYgU2V0X1Nob3J0UmV0cnlMaW1pdF9Qcm9jOjoodHhfcnR5X2NmZz0weCV4KVxuIiwgdHhfcnR5X2NmZy53b3JkKSk7CisJcmV0dXJuIFRSVUU7Cit9CisKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCitJTlQgU2V0X0llZWU4MDIxMWRDbGllbnRNb2RlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAwKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlID0gUnQ4MDJfMTFfRF9Ob25lOworICAgIGVsc2UgaWYgKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSA9IFJ0ODAyXzExX0RfRmxleGlibGU7CisgICAgZWxzZSBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAyKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlID0gUnQ4MDJfMTFfRF9TdHJpY3Q7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSWVlZTgwMmRNb2RlX1Byb2M6OihJRUVFRTAyMTFkTW9kZT0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUpKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCisKKyNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCitJTlQgU2V0X0NhcnJpZXJEZXRlY3RfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAwKQorICAgICAgICBwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9IEZBTFNFOworICAgIGVsc2UKKyAgICAgICAgcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPSBUUlVFOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUYgU2V0X0NhcnJpZXJEZXRlY3RfUHJvYzo6KENhcnJpZXJEZXRlY3QuRW5hYmxlPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUpKTsKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisKKworSU5UCVNob3dfQWRob2NfTWFjVGFibGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQQ0hBUgkJCWV4dHJhKQoreworCUlOVCBpOworCisJc3ByaW50ZihleHRyYSwgIlxuIik7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlzcHJpbnRmKGV4dHJhLCAiJXNIVCBPcGVyYXRpbmcgTW9kZSA6ICVkXG4iLCBleHRyYSwgcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworCXNwcmludGYoZXh0cmEsICIlc1xuJS0xOXMlLTRzJS00cyUtN3MlLTdzJS03cyUtMTBzJS02cyUtNnMlLTZzJS02c1xuIiwgZXh0cmEsCisJCQkiTUFDIiwgIkFJRCIsICJCU1MiLCAiUlNTSTAiLCAiUlNTSTEiLCAiUlNTSTIiLCAiUGhNZCIsICJCVyIsICJNQ1MiLCAiU0dJIiwgIlNUQkMiKTsKKworCWZvciAoaT0xOyBpPE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCisJeworCQlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W2ldOworCisJCWlmIChzdHJsZW4oZXh0cmEpID4gKElXX1BSSVZfU0laRV9NQVNLIC0gMzApKQorCQkgICAgYnJlYWs7CisJCWlmICgocEVudHJ5LT5WYWxpZEFzQ0xJIHx8IHBFbnRyeS0+VmFsaWRBc0FwQ2xpKSAmJiAocEVudHJ5LT5Tc3QgPT0gU1NUX0FTU09DKSkKKwkJeworCQkJc3ByaW50ZihleHRyYSwgIiVzJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlggICIsIGV4dHJhLAorCQkJCXBFbnRyeS0+QWRkclswXSwgcEVudHJ5LT5BZGRyWzFdLCBwRW50cnktPkFkZHJbMl0sCisJCQkJcEVudHJ5LT5BZGRyWzNdLCBwRW50cnktPkFkZHJbNF0sIHBFbnRyeS0+QWRkcls1XSk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTRkIiwgZXh0cmEsIChpbnQpcEVudHJ5LT5BaWQpOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS00ZCIsIGV4dHJhLCAoaW50KXBFbnRyeS0+YXBpZHgpOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS03ZCIsIGV4dHJhLCBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTApOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS03ZCIsIGV4dHJhLCBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTEpOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS03ZCIsIGV4dHJhLCBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTIpOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS0xMHMiLCBleHRyYSwgR2V0UGh5TW9kZShwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFKSk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTZzIiwgZXh0cmEsIEdldEJXKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLkJXKSk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTZkIiwgZXh0cmEsIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTZkIiwgZXh0cmEsIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kpOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS02ZCIsIGV4dHJhLCBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TVEJDKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtMTBkLCAlZCwgJWQlJVxuIiwgZXh0cmEsIHBFbnRyeS0+RGVidWdGSUZPQ291bnQsIHBFbnRyeS0+RGVidWdUeENvdW50LAorCQkJCQkJKHBFbnRyeS0+RGVidWdUeENvdW50KSA/ICgocEVudHJ5LT5EZWJ1Z1R4Q291bnQtcEVudHJ5LT5EZWJ1Z0ZJRk9Db3VudCkqMTAwL3BFbnRyeS0+RGVidWdUeENvdW50KSA6IDApOworCQkJc3ByaW50ZihleHRyYSwgIiVzXG4iLCBleHRyYSk7CisJCX0KKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YV9pb2N0bC5jLnBhdGNoIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGFfaW9jdGwuYy5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjcyYjE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGFfaW9jdGwuYy5wYXRjaApAQCAtMCwwICsxLDE4IEBACistLS0gc3RhX2lvY3RsLmMJMjAwOC0wOS0xOSAxNDozNzo1Mi4wMDAwMDAwMDAgKzA4MDAKKysrKyBzdGFfaW9jdGwuYy5mYzkJMjAwOC0wOS0xOSAxNDozODoyMC4wMDAwMDAwMDAgKzA4MDAKK0BAIC00OSwxNSArNDksOSBAQAorCisgI2RlZmluZSBHUk9VUF9LRVlfTk8gICAgICAgICAgICAgICAgNAorCistI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpCisgI2RlZmluZSBJV0VfU1RSRUFNX0FERF9FVkVOVChfQSwgX0IsIF9DLCBfRCwgX0UpCQlpd2Vfc3RyZWFtX2FkZF9ldmVudChfQSwgX0IsIF9DLCBfRCwgX0UpCisgI2RlZmluZSBJV0VfU1RSRUFNX0FERF9QT0lOVChfQSwgX0IsIF9DLCBfRCwgX0UpCQlpd2Vfc3RyZWFtX2FkZF9wb2ludChfQSwgX0IsIF9DLCBfRCwgX0UpCisgI2RlZmluZSBJV0VfU1RSRUFNX0FERF9WQUxVRShfQSwgX0IsIF9DLCBfRCwgX0UsIF9GKQlpd2Vfc3RyZWFtX2FkZF92YWx1ZShfQSwgX0IsIF9DLCBfRCwgX0UsIF9GKQorLSNlbHNlCistI2RlZmluZSBJV0VfU1RSRUFNX0FERF9FVkVOVChfQSwgX0IsIF9DLCBfRCwgX0UpCQlpd2Vfc3RyZWFtX2FkZF9ldmVudChfQiwgX0MsIF9ELCBfRSkKKy0jZGVmaW5lIElXRV9TVFJFQU1fQUREX1BPSU5UKF9BLCBfQiwgX0MsIF9ELCBfRSkJCWl3ZV9zdHJlYW1fYWRkX3BvaW50KF9CLCBfQywgX0QsIF9FKQorLSNkZWZpbmUgSVdFX1NUUkVBTV9BRERfVkFMVUUoX0EsIF9CLCBfQywgX0QsIF9FLCBfRikJaXdlX3N0cmVhbV9hZGRfdmFsdWUoX0IsIF9DLCBfRCwgX0UsIF9GKQorLSNlbmRpZgorCisgZXh0ZXJuIFVDSEFSICAgIENpcGhlcldwYTJUZW1wbGF0ZVtdOworIGV4dGVybiBVQ0hBUiAgICBDaXBoZXJXcGFQc2tUa2lwW107CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3RtcDYwIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC90bXA2MApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzVlNDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC90bXA2MApAQCAtMCwwICsxLDcwMzcgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgc3RhX2lvY3RsLmMKKworICAgIEFic3RyYWN0OgorICAgIElPQ1RMIHJlbGF0ZWQgc3Vicm91dGluZXMKKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgUm9yeSBDaGVuICAgMDEtMDMtMjAwMyAgICBjcmVhdGVkCisJUm9yeSBDaGVuICAgMDItMTQtMjAwNSAgICBtb2RpZnkgdG8gc3VwcG9ydCBSVDYxCisqLworCisjaW5jbHVkZQkicnRfY29uZmlnLmgiCisKKyNpZmRlZiBEQkcKK2V4dGVybiBVTE9ORyAgICBSVERlYnVnTGV2ZWw7CisjZW5kaWYKKworI2RlZmluZSBOUl9XRVBfS0VZUyAJCQkJNAorI2RlZmluZSBXRVBfU01BTExfS0VZX0xFTiAJCQkoNDAvOCkKKyNkZWZpbmUgV0VQX0xBUkdFX0tFWV9MRU4gCQkJKDEwNC84KQorCisjZGVmaW5lIEdST1VQX0tFWV9OTyAgICAgICAgICAgICAgICA0CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KQorI2RlZmluZSBJV0VfU1RSRUFNX0FERF9FVkVOVChfQSwgX0IsIF9DLCBfRCwgX0UpCQlpd2Vfc3RyZWFtX2FkZF9ldmVudChfQSwgX0IsIF9DLCBfRCwgX0UpCisjZGVmaW5lIElXRV9TVFJFQU1fQUREX1BPSU5UKF9BLCBfQiwgX0MsIF9ELCBfRSkJCWl3ZV9zdHJlYW1fYWRkX3BvaW50KF9BLCBfQiwgX0MsIF9ELCBfRSkKKyNkZWZpbmUgSVdFX1NUUkVBTV9BRERfVkFMVUUoX0EsIF9CLCBfQywgX0QsIF9FLCBfRikJaXdlX3N0cmVhbV9hZGRfdmFsdWUoX0EsIF9CLCBfQywgX0QsIF9FLCBfRikKKyNlbHNlCisjZGVmaW5lIElXRV9TVFJFQU1fQUREX0VWRU5UKF9BLCBfQiwgX0MsIF9ELCBfRSkJCWl3ZV9zdHJlYW1fYWRkX2V2ZW50KF9CLCBfQywgX0QsIF9FKQorI2RlZmluZSBJV0VfU1RSRUFNX0FERF9QT0lOVChfQSwgX0IsIF9DLCBfRCwgX0UpCQlpd2Vfc3RyZWFtX2FkZF9wb2ludChfQiwgX0MsIF9ELCBfRSkKKyNkZWZpbmUgSVdFX1NUUkVBTV9BRERfVkFMVUUoX0EsIF9CLCBfQywgX0QsIF9FLCBfRikJaXdlX3N0cmVhbV9hZGRfdmFsdWUoX0IsIF9DLCBfRCwgX0UsIF9GKQorI2VuZGlmCisKK2V4dGVybiBVQ0hBUiAgICBDaXBoZXJXcGEyVGVtcGxhdGVbXTsKK2V4dGVybiBVQ0hBUiAgICBDaXBoZXJXcGFQc2tUa2lwW107CitleHRlcm4gVUNIQVIgICAgQ2lwaGVyV3BhUHNrVGtpcExlbjsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SVF9WRVJTSU9OX0lORk97CisgICAgVUNIQVIgICAgICAgRHJpdmVyVmVyc2lvblc7CisgICAgVUNIQVIgICAgICAgRHJpdmVyVmVyc2lvblg7CisgICAgVUNIQVIgICAgICAgRHJpdmVyVmVyc2lvblk7CisgICAgVUNIQVIgICAgICAgRHJpdmVyVmVyc2lvblo7CisgICAgVUlOVCAgICAgICAgRHJpdmVyQnVpbGRZZWFyOworICAgIFVJTlQgICAgICAgIERyaXZlckJ1aWxkTW9udGg7CisgICAgVUlOVCAgICAgICAgRHJpdmVyQnVpbGREYXk7Cit9IFJUX1ZFUlNJT05fSU5GTywgKlBSVF9WRVJTSU9OX0lORk87CisKK3N0cnVjdCBpd19wcml2X2FyZ3MgcHJpdnRhYltdID0geworeyBSVFBSSVZfSU9DVExfU0VULAorICBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIDAsCisgICJzZXQifSwKKworeyBSVFBSSVZfSU9DVExfU0hPVywgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywKKyAgIiJ9LAoreyBSVFBSSVZfSU9DVExfU0hPVywgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLAorICAiIn0sCisvKiAtLS0gc3ViLWlvY3RscyBkZWZpbml0aW9ucyAtLS0gKi8KKyAgICB7IFNIT1dfQ09OTl9TVEFUVVMsCisJICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAiY29ublN0YXR1cyIgfSwKKwl7IFNIT1dfRFJWSUVSX1ZFUklPTiwKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJkcml2ZXJWZXIiIH0sCisgICAgeyBTSE9XX0JBX0lORk8sCisJICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAiYmFpbmZvIiB9LAorCXsgU0hPV19ERVNDX0lORk8sCisJICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAiZGVzY2luZm8iIH0sCisgICAgeyBSQUlPX09GRiwKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJyYWRpb19vZmYiIH0sCisJeyBSQUlPX09OLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgInJhZGlvX29uIiB9LAorI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCXsgU0hPV19ETFNfRU5UUllfSU5GTywKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJkbHNlbnRyeWluZm8iIH0sCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJeyBTSE9XX0NGR19WQUxVRSwKKwkgIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgInNob3ciIH0sCisJeyBTSE9XX0FESE9DX0VOVFJZX0lORk8sCisJICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAiYWRob2NFbnRyeSIgfSwKKworLyogLS0tIHN1Yi1pb2N0bHMgcmVsYXRpb25zIC0tLSAqLworCisjaWZkZWYgREJHCit7IFJUUFJJVl9JT0NUTF9CQlAsCisgIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssCisgICJiYnAifSwKK3sgUlRQUklWX0lPQ1RMX01BQywKKyAgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsCisgICJtYWMifSwKK3sgUlRQUklWX0lPQ1RMX0UyUCwKKyAgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsCisgICJlMnAifSwKKyNlbmRpZiAgLyogREJHICovCisKK3sgUlRQUklWX0lPQ1RMX1NUQVRJU1RJQ1MsCisgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssCisgICJzdGF0In0sCit7IFJUUFJJVl9JT0NUTF9HU0lURVNVUlZFWSwKKyAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LAorICAiZ2V0X3NpdGVfc3VydmV5In0sCit9OworCitJTlQgU2V0X1NTSURfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworI2lmZGVmIFdNTV9TVVBQT1JUCitJTlQJU2V0X1dtbUNhcGFibGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworI2VuZGlmCisKK0lOVCBTZXRfTmV0d29ya1R5cGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9BdXRoTW9kZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0VuY3J5cFR5cGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9EZWZhdWx0S2V5SURfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9LZXkxX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfS2V5Ml9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0tleTNfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9LZXk0X1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfV1BBUFNLX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKKworSU5UIFNldF9QU01vZGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKK0lOVCBTZXRfV3BhX1N1cHBvcnQoCisgICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUFVDSEFSCQkJYXJnKTsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBEQkcKK1ZPSUQgUlRNUElvY3RsQkJQKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4Jc3RydWN0IGl3cmVxCSp3cnEpOworCitWT0lEIFJUTVBJb2N0bE1BQygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCXN0cnVjdCBpd3JlcQkqd3JxKTsKKworVk9JRCBSVE1QSW9jdGxFMlBST00oCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgc3RydWN0IGl3cmVxICAgICp3cnEpOworI2VuZGlmIC8vIERCRyAvLworCisKK05ESVNfU1RBVFVTIFJUTVBXUEFOb25lQWRkS2V5UHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTglQVk9JRAkJCXBCdWYpOworCitJTlQgU2V0X0ZyYWdUZXN0X1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK0lOVCBTZXRfVEduV2lmaVRlc3RfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK0lOVCBTZXRfTG9uZ1JldHJ5TGltaXRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKK0lOVCBTZXRfU2hvcnRSZXRyeUxpbWl0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglQVUNIQVIJCQlhcmcpOworCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorSU5UIFNldF9JZWVlODAyMTFkQ2xpZW50TW9kZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKworI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKK0lOVCBTZXRfQ2FycmllckRldGVjdF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisKK0lOVAlTaG93X0FkaG9jX01hY1RhYmxlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUENIQVIJCQlleHRyYSk7CisKK3N0YXRpYyBzdHJ1Y3QgeworCUNIQVIgKm5hbWU7CisJSU5UICgqc2V0X3Byb2MpKFBSVE1QX0FEQVBURVIgcEFkYXB0ZXIsIFBVQ0hBUiBhcmcpOworfSAqUFJUTVBfUFJJVkFURV9TRVRfUFJPQywgUlRNUF9QUklWQVRFX1NVUFBPUlRfUFJPQ1tdID0geworCXsiRHJpdmVyVmVyc2lvbiIsCQkJCVNldF9Ecml2ZXJWZXJzaW9uX1Byb2N9LAorCXsiQ291bnRyeVJlZ2lvbiIsCQkJCVNldF9Db3VudHJ5UmVnaW9uX1Byb2N9LAorCXsiQ291bnRyeVJlZ2lvbkFCYW5kIiwJCQlTZXRfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2N9LAorCXsiU1NJRCIsCQkJCQkJU2V0X1NTSURfUHJvY30sCisJeyJXaXJlbGVzc01vZGUiLAkJCQlTZXRfV2lyZWxlc3NNb2RlX1Byb2N9LAorCXsiVHhCdXJzdCIsCQkJCQlTZXRfVHhCdXJzdF9Qcm9jfSwKKwl7IlR4UHJlYW1ibGUiLAkJCQlTZXRfVHhQcmVhbWJsZV9Qcm9jfSwKKwl7IlR4UG93ZXIiLAkJCQkJU2V0X1R4UG93ZXJfUHJvY30sCisJeyJDaGFubmVsIiwJCQkJCVNldF9DaGFubmVsX1Byb2N9LAorCXsiQkdQcm90ZWN0aW9uIiwJCQkJU2V0X0JHUHJvdGVjdGlvbl9Qcm9jfSwKKwl7IlJUU1RocmVzaG9sZCIsCQkJCVNldF9SVFNUaHJlc2hvbGRfUHJvY30sCisJeyJGcmFnVGhyZXNob2xkIiwJCQkJU2V0X0ZyYWdUaHJlc2hvbGRfUHJvY30sCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJeyJIdEJ3IiwJCSAgICAgICAgICAgICAgICBTZXRfSHRCd19Qcm9jfSwKKwl7Ikh0TWNzIiwJCSAgICAgICAgICAgICAgICBTZXRfSHRNY3NfUHJvY30sCisJeyJIdEdpIiwJCSAgICAgICAgICAgICAgICBTZXRfSHRHaV9Qcm9jfSwKKwl7Ikh0T3BNb2RlIiwJCSAgICAgICAgICAgIFNldF9IdE9wTW9kZV9Qcm9jfSwKKwl7Ikh0RXh0Y2hhIiwJCSAgICAgICAgICAgIFNldF9IdEV4dGNoYV9Qcm9jfSwKKwl7Ikh0TXBkdURlbnNpdHkiLAkJICAgICAgICBTZXRfSHRNcGR1RGVuc2l0eV9Qcm9jfSwKKwl7Ikh0QmFXaW5TaXplIiwJCSAgICAgICAgCVNldF9IdEJhV2luU2l6ZV9Qcm9jfSwKKwl7Ikh0UmRnIiwJCSAgICAgICAgCQlTZXRfSHRSZGdfUHJvY30sCisJeyJIdEFtc2R1IiwJCSAgICAgICAgCQlTZXRfSHRBbXNkdV9Qcm9jfSwKKwl7Ikh0QXV0b0JhIiwJCSAgICAgICAgCVNldF9IdEF1dG9CYV9Qcm9jfSwKKwl7Ikh0QmFEZWNsaW5lIiwJCQkJCVNldF9CQURlY2xpbmVfUHJvY30sCisJeyJIdFByb3RlY3QiLAkJICAgICAgICAJU2V0X0h0UHJvdGVjdF9Qcm9jfSwKKwl7Ikh0TWltb1BzIiwJCSAgICAgICAgCVNldF9IdE1pbW9Qc19Qcm9jfSwKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKKwl7IlBrdEFnZ3JlZ2F0ZSIsCQkJCVNldF9Qa3RBZ2dyZWdhdGVfUHJvY30sCisjZW5kaWYKKworI2lmZGVmIFdNTV9TVVBQT1JUCisJeyJXbW1DYXBhYmxlIiwJCQkJCVNldF9XbW1DYXBhYmxlX1Byb2N9LAorI2VuZGlmCisJeyJJRUVFODAyMTFIIiwJCQkJCVNldF9JRUVFODAyMTFIX1Byb2N9LAorICAgIHsiTmV0d29ya1R5cGUiLCAgICAgICAgICAgICAgICAgU2V0X05ldHdvcmtUeXBlX1Byb2N9LAorCXsiQXV0aE1vZGUiLAkJCQkJU2V0X0F1dGhNb2RlX1Byb2N9LAorCXsiRW5jcnlwVHlwZSIsCQkJCQlTZXRfRW5jcnlwVHlwZV9Qcm9jfSwKKwl7IkRlZmF1bHRLZXlJRCIsCQkJCVNldF9EZWZhdWx0S2V5SURfUHJvY30sCisJeyJLZXkxIiwJCQkJCQlTZXRfS2V5MV9Qcm9jfSwKKwl7IktleTIiLAkJCQkJCVNldF9LZXkyX1Byb2N9LAorCXsiS2V5MyIsCQkJCQkJU2V0X0tleTNfUHJvY30sCisJeyJLZXk0IiwJCQkJCQlTZXRfS2V5NF9Qcm9jfSwKKwl7IldQQVBTSyIsCQkJCQkJU2V0X1dQQVBTS19Qcm9jfSwKKwl7IlJlc2V0Q291bnRlciIsCQkJCVNldF9SZXNldFN0YXRDb3VudGVyX1Byb2N9LAorCXsiUFNNb2RlIiwgICAgICAgICAgICAgICAgICAgICAgU2V0X1BTTW9kZV9Qcm9jfSwKKyNpZmRlZiBEQkcKKwl7IkRlYnVnIiwJCQkJCQlTZXRfRGVidWdfUHJvY30sCisjZW5kaWYKKworI2lmZGVmIFJBTElOS19BVEUKKwl7IkFURSIsCQkJCQkJCVNldF9BVEVfUHJvY30sCisJeyJBVEVEQSIsCQkJCQkJU2V0X0FURV9EQV9Qcm9jfSwKKwl7IkFURVNBIiwJCQkJCQlTZXRfQVRFX1NBX1Byb2N9LAorCXsiQVRFQlNTSUQiLAkJCQkJU2V0X0FURV9CU1NJRF9Qcm9jfSwKKwl7IkFURUNIQU5ORUwiLAkJCQkJU2V0X0FURV9DSEFOTkVMX1Byb2N9LAorCXsiQVRFVFhQT1cwIiwJCQkJCVNldF9BVEVfVFhfUE9XRVIwX1Byb2N9LAorCXsiQVRFVFhQT1cxIiwJCQkJCVNldF9BVEVfVFhfUE9XRVIxX1Byb2N9LAorCXsiQVRFVFhBTlQiLAkJCQkJU2V0X0FURV9UWF9BbnRlbm5hX1Byb2N9LAorCXsiQVRFUlhBTlQiLAkJCQkJU2V0X0FURV9SWF9BbnRlbm5hX1Byb2N9LAorCXsiQVRFVFhGUkVRT0ZGU0VUIiwJCQkJU2V0X0FURV9UWF9GUkVRT0ZGU0VUX1Byb2N9LAorCXsiQVRFVFhCVyIsCQkJCQkJU2V0X0FURV9UWF9CV19Qcm9jfSwKKwl7IkFURVRYTEVOIiwJCQkJCVNldF9BVEVfVFhfTEVOR1RIX1Byb2N9LAorCXsiQVRFVFhDTlQiLAkJCQkJU2V0X0FURV9UWF9DT1VOVF9Qcm9jfSwKKwl7IkFURVRYTUNTIiwJCQkJCVNldF9BVEVfVFhfTUNTX1Byb2N9LAorCXsiQVRFVFhNT0RFIiwJCQkJCVNldF9BVEVfVFhfTU9ERV9Qcm9jfSwKKwl7IkFURVRYR0kiLAkJCQkJCVNldF9BVEVfVFhfR0lfUHJvY30sCisJeyJBVEVSWEZFUiIsCQkJCQlTZXRfQVRFX1JYX0ZFUl9Qcm9jfSwKKwl7IkFURVJSRiIsCQkJCQkJU2V0X0FURV9SZWFkX1JGX1Byb2N9LAorCXsiQVRFV1JGMSIsCQkJCQkJU2V0X0FURV9Xcml0ZV9SRjFfUHJvY30sCisJeyJBVEVXUkYyIiwJCQkJCQlTZXRfQVRFX1dyaXRlX1JGMl9Qcm9jfSwKKwl7IkFURVdSRjMiLAkJCQkJCVNldF9BVEVfV3JpdGVfUkYzX1Byb2N9LAorCXsiQVRFV1JGNCIsCQkJCQkJU2V0X0FURV9Xcml0ZV9SRjRfUHJvY30sCisJeyJBVEVMREUyUCIsCQkJCSAgICBTZXRfQVRFX0xvYWRfRTJQX1Byb2N9LAorCXsiQVRFUkUyUCIsCQkJCQkJU2V0X0FURV9SZWFkX0UyUF9Qcm9jfSwKKwl7IkFURVNIT1ciLAkJCQkJCVNldF9BVEVfU2hvd19Qcm9jfSwKKwl7IkFURUhFTFAiLAkJCQkJCVNldF9BVEVfSGVscF9Qcm9jfSwKKworI2lmZGVmIFJBTElOS18yOHh4X1FBCisJeyJUeFN0b3AiLAkJCQkJCVNldF9UeFN0b3BfUHJvY30sCisJeyJSeFN0b3AiLAkJCQkJCVNldF9SeFN0b3BfUHJvY30sCisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgeyJXcGFTdXBwb3J0IiwgICAgICAgICAgICAgICAgICBTZXRfV3BhX1N1cHBvcnR9LAorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCisKKwl7IkZpeGVkVHhNb2RlIiwgICAgICAgICAgICAgICAgIFNldF9GaXhlZFR4TW9kZV9Qcm9jfSwKKyNpZmRlZiBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVAorCXsiT3BNb2RlIiwJCQkJCQlTZXRfT3BNb2RlX1Byb2N9LAorI2VuZGlmIC8vIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUIC8vCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgeyJUR25XaWZpVGVzdCIsICAgICAgICAgICAgICAgICBTZXRfVEduV2lmaVRlc3RfUHJvY30sCisgICAgeyJGb3JjZUdGIiwJCSAgICAgICAgCQlTZXRfRm9yY2VHRl9Qcm9jfSwKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwl7IkRsc0FkZEVudHJ5IiwJCQkJCVNldF9EbHNBZGRFbnRyeV9Qcm9jfSwKKwl7IkRsc1RlYXJEb3duRW50cnkiLAkJCVNldF9EbHNUZWFyRG93bkVudHJ5X1Byb2N9LAorI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCXsiTG9uZ1JldHJ5IiwJICAgICAgICAJCVNldF9Mb25nUmV0cnlMaW1pdF9Qcm9jfSwKKwl7IlNob3J0UmV0cnkiLAkgICAgICAgIAkJU2V0X1Nob3J0UmV0cnlMaW1pdF9Qcm9jfSwKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJeyIxMWRDbGllbnRNb2RlIiwJCQkJU2V0X0llZWU4MDIxMWRDbGllbnRNb2RlX1Byb2N9LAorI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKyNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCisJeyJDYXJyaWVyRGV0ZWN0IiwJCQkJU2V0X0NhcnJpZXJEZXRlY3RfUHJvY30sCisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworCisJe05VTEwsfQorfTsKKworCitWT0lEIFJUTVBBZGRLZXkoCisJSU4JUFJUTVBfQURBUFRFUgkgICAgcEFkLAorCUlOCVBORElTXzgwMl8xMV9LRVkgICAgcEtleSkKK3sKKwlVTE9ORwkJCQlLZXlJZHg7CisJTUFDX1RBQkxFX0VOVFJZICAJKnBFbnRyeTsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBBZGRLZXkgLS0tLS0tPlxuIikpOworCisJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKwl7CisJCWlmIChwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApCisJCXsKKwkJICAgIGlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlBNSywgMzIpOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlBNSywgcEtleS0+S2V5TWF0ZXJpYWwsIHBLZXktPktleUxlbmd0aCk7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICB9CisJCSAgICAvLyBVcGRhdGUgUFRLCisJCSAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0sIHNpemVvZihDSVBIRVJfS0VZKSk7CisgICAgICAgICAgICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgcEtleS0+S2V5TWF0ZXJpYWwsIExFTl9US0lQX0VLKTsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLLCBMRU5fVEtJUF9UWE1JQ0spOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLICsgTEVOX1RLSVBfVFhNSUNLLCBMRU5fVEtJUF9SWE1JQ0spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSywgTEVOX1RLSVBfVFhNSUNLKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSyArIExFTl9US0lQX1RYTUlDSywgTEVOX1RLSVBfUlhNSUNLKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRGVjaWRlIGl0cyBDaGlwZXJBbGcKKyAgICAgICAgCWlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisgICAgICAgIAkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7CisgICAgICAgIAllbHNlIGlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisgICAgICAgIAkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKyAgICAgICAgCWVsc2UKKyAgICAgICAgCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKworICAgICAgICAgICAgLy8gVXBkYXRlIHRoZXNlIHJlbGF0ZWQgaW5mb3JtYXRpb24gdG8gTUFDX1RBQkxFX0VOVFJZCisgICAgICAgIAlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuS2V5LCBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIExFTl9US0lQX0VLKTsKKyAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuUnhNaWMsIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCBMRU5fVEtJUF9SWE1JQ0spOworICAgICAgICAJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5UeE1pYywgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsIExFTl9US0lQX1RYTUlDSyk7CisgICAgICAgIAlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZzsKKworICAgICAgICAJLy8gVXBkYXRlIHBhaXJ3aXNlIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKKyAgICAgICAgCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCisgICAgICAgIAkJCQkJCSAgQlNTMCwKKyAgICAgICAgCQkJCQkJICAwLAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMpOworCisgICAgICAgIAkvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKyAgICAgICAgCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorICAgICAgICAJCQkJCQkJICBCU1MwLAorICAgICAgICAJCQkJCQkJICAwLAorICAgICAgICAJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCisgICAgICAgIAkJCQkJCQkgIHBFbnRyeSk7CisKKyAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHNldCA4MDIuMXggcG9ydCBjb250cm9sCisJICAgICAgICAgICAgLy9wQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKKworICAgICAgICAgICAgICAgIC8vIEluZGljYXRlIENvbm5lY3RlZCBmb3IgR1VJCisgICAgICAgICAgICAgICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKyAgICAgICAgICAgIH0KKwkJfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFVwZGF0ZSBHVEsKKyAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChwS2V5LT5LZXlJbmRleCAmIDB4RkYpOworICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0sIHNpemVvZihDSVBIRVJfS0VZKSk7CisgICAgICAgICAgICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbiA9IExFTl9US0lQX0VLOworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksIHBLZXktPktleU1hdGVyaWFsLCBMRU5fVEtJUF9FSyk7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5SeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSywgTEVOX1RLSVBfVFhNSUNLKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLICsgTEVOX1RLSVBfVFhNSUNLLCBMRU5fVEtJUF9SWE1JQ0spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLLCBMRU5fVEtJUF9UWE1JQ0spOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uUnhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSBTaGFyZWQgS2V5IENpcGhlckFsZworICAgIAkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKyAgICAJCWlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorICAgIAkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7CisgICAgCQllbHNlIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorICAgIAkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKworICAgICAgICAgICAgLy8gVXBkYXRlIGdyb3VwIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKKyAgICAgICAgCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCisgICAgICAgIAkJCQkJCSAgQlNTMCwKKyAgICAgICAgCQkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcsCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5UeE1pYywKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlJ4TWljKTsKKworICAgICAgICAJLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCisgICAgICAgIAlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKyAgICAgICAgCQkJCQkJCSAgQlNTMCwKKyAgICAgICAgCQkJCQkJCSAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAorICAgICAgICAJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZywKKyAgICAgICAgCQkJCQkJCSAgTlVMTCk7CisKKyAgICAgICAgICAgIC8vIHNldCA4MDIuMXggcG9ydCBjb250cm9sCisJICAgICAgICAvL3BBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZCk7CisKKyAgICAgICAgICAgIC8vIEluZGljYXRlIENvbm5lY3RlZCBmb3IgR1VJCisgICAgICAgICAgICBwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworICAgICAgICB9CisJfQorCWVsc2UJLy8gZHluYW1pYyBXRVAgZnJvbSB3cGFfc3VwcGxpY2FudAorCXsKKwkJVUNIQVIJQ2lwaGVyQWxnOworICAgIAlQVUNIQVIJS2V5OworCisJCWlmKHBLZXktPktleUxlbmd0aCA9PSAzMikKKwkJCWdvdG8gZW5kOworCisJCUtleUlkeCA9IHBLZXktPktleUluZGV4ICYgMHgwZmZmZmZmZjsKKworCQlpZiAoS2V5SWR4IDwgNCkKKwkJeworCQkJLy8gaXQgaXMgYSBkZWZhdWx0IHNoYXJlZCBrZXksIGZvciBQYWlyd2lzZSBrZXkgc2V0dGluZworCQkJaWYgKHBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkKKwkJCXsKKwkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIHBLZXktPkJTU0lEKTsKKworCQkJCWlmIChwRW50cnkpCisJCQkJeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QQWRkS2V5OiBTZXQgUGFpci13aXNlIEtleVxuIikpOworCisJCQkJCS8vIHNldCBrZXkgbWF0ZXJpYWwgYW5kIGtleSBsZW5ndGgKKyAJCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuS2V5TGVuID0gKFVDSEFSKXBLZXktPktleUxlbmd0aDsKKwkJCQkJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5LZXksICZwS2V5LT5LZXlNYXRlcmlhbCwgcEtleS0+S2V5TGVuZ3RoKTsKKworCQkJCQkvLyBzZXQgQ2lwaGVyIHR5cGUKKwkJCQkJaWYgKHBLZXktPktleUxlbmd0aCA9PSA1KQorCQkJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCQkJCWVsc2UKKwkJCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKworCQkJCQkvLyBBZGQgUGFpci13aXNlIGtleSB0byBBc2ljCisJCQkJCUFzaWNBZGRQYWlyd2lzZUtleUVudHJ5KAorCQkJCQkJcEFkLAorCQkJCQkJcEVudHJ5LT5BZGRyLAorCQkJCQkJKFVDSEFSKXBFbnRyeS0+QWlkLAorICAgICAgICAgICAgICAgIAkJJnBFbnRyeS0+UGFpcndpc2VLZXkpOworCisJCQkJCS8vIHVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgZm9yIHRoaXMgZW50cnkKKwkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeSgKKwkJCQkJCXBBZCwKKwkJCQkJCUJTUzAsCisJCQkJCQlLZXlJZHgsIC8vIFRoZSB2YWx1ZSBtYXkgYmUgbm90IHplcm8KKwkJCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnLAorCQkJCQkJcEVudHJ5KTsKKworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKyAgICAgICAgICAgIHsKKwkJCQkvLyBEZWZhdWx0IGtleSBmb3IgdHggKHNoYXJlZCBrZXkpCisJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKFVDSEFSKSBLZXlJZHg7CisKKwkJCQkvLyBzZXQga2V5IG1hdGVyaWFsIGFuZCBrZXkgbGVuZ3RoCisJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPSAoVUNIQVIpIHBLZXktPktleUxlbmd0aDsKKwkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleSwgJnBLZXktPktleU1hdGVyaWFsLCBwS2V5LT5LZXlMZW5ndGgpOworCisJCQkJLy8gU2V0IENpcGVyIHR5cGUKKwkJCQlpZiAocEtleS0+S2V5TGVuZ3RoID09IDUpCisJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQkJCWVsc2UKKwkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCisgICAgCQkJQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGc7CisgICAgCQkJS2V5ID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXk7CisKKwkJCQkvLyBTZXQgR3JvdXAga2V5IG1hdGVyaWFsIHRvIEFzaWMKKyAgICAJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgS2V5LCBOVUxMLCBOVUxMKTsKKworCQkJCS8vIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgZm9yIHRoaXMgZ3JvdXAga2V5IHRhYmxlCisJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIEtleUlkeCwgQ2lwaGVyQWxnLCBOVUxMKTsKKworCQkJfQorCQl9CisJfQorZW5kOgorCXJldHVybjsKK30KKworY2hhciAqIHJ0c3RyY2hyKGNvbnN0IGNoYXIgKiBzLCBpbnQgYykKK3sKKyAgICBmb3IoOyAqcyAhPSAoY2hhcikgYzsgKytzKQorICAgICAgICBpZiAoKnMgPT0gJ1wwJykKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiAoY2hhciAqKSBzOworfQorCisvKgorVGhpcyBpcyByZXF1aXJlZCBmb3IgTGluRVgyMDA0L2tlcm5lbDIuNi43IHRvIHByb3ZpZGUgaXdsaXN0IHNjYW5uaW5nIGZ1bmN0aW9uCisqLworCitpbnQKK3J0X2lvY3RsX2dpd25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgY2hhciAqbmFtZSwgY2hhciAqZXh0cmEpCit7CisvLwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKworI2lmZGVmIFJUMjg3MAorCXN0cm5jcHkobmFtZSwgIlJUMjg3MCBXaXJlbGVzcyIsIElGTkFNU0laKTsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX3Npd2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfZnJlcSAqZnJlcSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisJaW50IAljaGFuID0gLTE7CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAgcmV0dXJuIC1FTkVURE9XTjsKKyAgICB9CisKKworCWlmIChmcmVxLT5lID4gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZigoZnJlcS0+ZSA9PSAwKSAmJiAoZnJlcS0+bSA8PSAxMDAwKSkKKwkJY2hhbiA9IGZyZXEtPm07CS8vIFNldHRpbmcgYnkgY2hhbm5lbCBudW1iZXIKKwllbHNlCisJCU1BUF9LSFpfVE9fQ0hBTk5FTF9JRCggKGZyZXEtPm0gLzEwMCkgLCBjaGFuKTsgLy8gU2V0dGluZyBieSBmcmVxdWVuY3kgLSBzZWFyY2ggdGhlIHRhYmxlICwgbGlrZSAyLjQxMkcsIDIuNDIyRywKKworICAgIGlmIChDaGFubmVsU2FuaXR5KHBBZGFwdGVyLCBjaGFuKSA9PSBUUlVFKQorICAgIHsKKwlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSBjaGFuOworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIj09PnJ0X2lvY3RsX3Npd2ZyZXE6OlNJT0NTSVdGUkVRW2NtZD0weCV4XSAoQ2hhbm5lbD0lZClcbiIsIFNJT0NTSVdGUkVRLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQoraW50IHJ0X2lvY3RsX2dpd2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgc3RydWN0IGl3X2ZyZXEgKmZyZXEsIGNoYXIgKmV4dHJhKQoreworICAgIFZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IE5VTEw7CisJVUNIQVIgY2g7CisJVUxPTkcJbTsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+cHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+cHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+cHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCQljaCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiPT0+cnRfaW9jdGxfZ2l3ZnJlcSAgJWRcbiIsIGNoKSk7CisKKyAgICBNQVBfQ0hBTk5FTF9JRF9UT19LSFooY2gsIG0pOworCWZyZXEtPm0gPSBtICogMTAwOworCWZyZXEtPmUgPSAxOworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3bW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBfX3UzMiAqbW9kZSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICB9CisKKwlzd2l0Y2ggKCptb2RlKQorCXsKKwkJY2FzZSBJV19NT0RFX0FESE9DOgorCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJBZGhvYyIpOworCQkJYnJlYWs7CisJCWNhc2UgSVdfTU9ERV9JTkZSQToKKwkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiSW5mcmEiKTsKKwkJCWJyZWFrOworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDQsMjApKQorICAgICAgICBjYXNlIElXX01PREVfTU9OSVRPUjoKKwkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiTW9uaXRvciIpOworCQkJYnJlYWs7CisjZW5kaWYKKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5ydF9pb2N0bF9zaXdtb2RlOjpTSU9DU0lXTU9ERSAodW5rbm93biAlZClcbiIsICptb2RlKSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvLyBSZXNldCBSYWxpbmsgc3VwcGxpY2FudCB0byBub3QgdXNlLCBpdCB3aWxsIGJlIHNldCB0byBzdGFydCB3aGVuIFVJIHNldCBQTUsga2V5CisJcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX05PVFVTRTsKKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3bW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBfX3UzMiAqbW9kZSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPnByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPnByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPnByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlpZiAoQURIT0NfT04ocEFkYXB0ZXIpKQorCQkqbW9kZSA9IElXX01PREVfQURIT0M7CisgICAgZWxzZSBpZiAoSU5GUkFfT04ocEFkYXB0ZXIpKQorCQkqbW9kZSA9IElXX01PREVfSU5GUkE7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNCwyMCkpCisgICAgZWxzZSBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCisgICAgeworICAgICAgICAqbW9kZSA9IElXX01PREVfTU9OSVRPUjsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlCisgICAgICAgICptb2RlID0gSVdfTU9ERV9BVVRPOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+cnRfaW9jdGxfZ2l3bW9kZShtb2RlPSVkKVxuIiwgKm1vZGUpKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX3Npd3NlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgY2hhciAqbmFtZSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIAlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgCXsKKyAgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAgCXJldHVybiAtRU5FVERPV047CisgICAgCX0KKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3c2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBjaGFyICpuYW1lLCBjaGFyICpleHRyYSkKK3sKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd3JhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisJc3RydWN0IGl3X3JhbmdlICpyYW5nZSA9IChzdHJ1Y3QgaXdfcmFuZ2UgKikgZXh0cmE7CisJdTE2IHZhbDsKKwlpbnQgaTsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+cHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+cHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+cHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PT5ydF9pb2N0bF9naXdyYW5nZVxuIikpOworCWRhdGEtPmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpOworCW1lbXNldChyYW5nZSwgMCwgc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSkpOworCisJcmFuZ2UtPnR4cG93ZXJfY2FwYSA9IElXX1RYUE9XX0RCTTsKKworCWlmIChJTkZSQV9PTihwQWRhcHRlcil8fEFESE9DX09OKHBBZGFwdGVyKSkKKwl7CisJCXJhbmdlLT5taW5fcG1wID0gMSAqIDEwMjQ7CisJCXJhbmdlLT5tYXhfcG1wID0gNjU1MzUgKiAxMDI0OworCQlyYW5nZS0+bWluX3BtdCA9IDEgKiAxMDI0OworCQlyYW5nZS0+bWF4X3BtdCA9IDEwMDAgKiAxMDI0OworCQlyYW5nZS0+cG1wX2ZsYWdzID0gSVdfUE9XRVJfUEVSSU9EOworCQlyYW5nZS0+cG10X2ZsYWdzID0gSVdfUE9XRVJfVElNRU9VVDsKKwkJcmFuZ2UtPnBtX2NhcGEgPSBJV19QT1dFUl9QRVJJT0QgfCBJV19QT1dFUl9USU1FT1VUIHwKKwkJCUlXX1BPV0VSX1VOSUNBU1RfUiB8IElXX1BPV0VSX0FMTF9SOworCX0KKworCXJhbmdlLT53ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOworCXJhbmdlLT53ZV92ZXJzaW9uX3NvdXJjZSA9IDE0OworCisJcmFuZ2UtPnJldHJ5X2NhcGEgPSBJV19SRVRSWV9MSU1JVDsKKwlyYW5nZS0+cmV0cnlfZmxhZ3MgPSBJV19SRVRSWV9MSU1JVDsKKwlyYW5nZS0+bWluX3JldHJ5ID0gMDsKKwlyYW5nZS0+bWF4X3JldHJ5ID0gMjU1OworCisJcmFuZ2UtPm51bV9jaGFubmVscyA9ICBwQWRhcHRlci0+Q2hhbm5lbExpc3ROdW07CisKKwl2YWwgPSAwOworCWZvciAoaSA9IDE7IGkgPD0gcmFuZ2UtPm51bV9jaGFubmVsczsgaSsrKQorCXsKKwkJdTMyIG07CisJCXJhbmdlLT5mcmVxW3ZhbF0uaSA9IHBBZGFwdGVyLT5DaGFubmVsTGlzdFtpLTFdLkNoYW5uZWw7CisJCU1BUF9DSEFOTkVMX0lEX1RPX0tIWihwQWRhcHRlci0+Q2hhbm5lbExpc3RbaS0xXS5DaGFubmVsLCBtKTsKKwkJcmFuZ2UtPmZyZXFbdmFsXS5tID0gbSAqIDEwMDsgLyogSFogKi8KKworCQlyYW5nZS0+ZnJlcVt2YWxdLmUgPSAxOworCQl2YWwrKzsKKwkJaWYgKHZhbCA9PSBJV19NQVhfRlJFUVVFTkNJRVMpCisJCQlicmVhazsKKwl9CisJcmFuZ2UtPm51bV9mcmVxdWVuY3kgPSB2YWw7CisKKwlyYW5nZS0+bWF4X3F1YWwucXVhbCA9IDEwMDsgLyogd2hhdCBpcyBjb3JyZWN0IG1heD8gVGhpcyB3YXMgbm90CisJCQkJCSogZG9jdW1lbnRlZCBleGFjdGx5LiBBdCBsZWFzdAorCQkJCQkqIDY5IGhhcyBiZWVuIG9ic2VydmVkLiAqLworCXJhbmdlLT5tYXhfcXVhbC5sZXZlbCA9IDA7IC8qIGRCICovCisJcmFuZ2UtPm1heF9xdWFsLm5vaXNlID0gMDsgLyogZEIgKi8KKworCS8qIFdoYXQgd291bGQgYmUgc3VpdGFibGUgdmFsdWVzIGZvciAiYXZlcmFnZS90eXBpY2FsIiBxdWFsPyAqLworCXJhbmdlLT5hdmdfcXVhbC5xdWFsID0gMjA7CisJcmFuZ2UtPmF2Z19xdWFsLmxldmVsID0gLTYwOworCXJhbmdlLT5hdmdfcXVhbC5ub2lzZSA9IC05NTsKKwlyYW5nZS0+c2Vuc2l0aXZpdHkgPSAzOworCisJcmFuZ2UtPm1heF9lbmNvZGluZ190b2tlbnMgPSBOUl9XRVBfS0VZUzsKKwlyYW5nZS0+bnVtX2VuY29kaW5nX3NpemVzID0gMjsKKwlyYW5nZS0+ZW5jb2Rpbmdfc2l6ZVswXSA9IDU7CisJcmFuZ2UtPmVuY29kaW5nX3NpemVbMV0gPSAxMzsKKworCXJhbmdlLT5taW5fcnRzID0gMDsKKwlyYW5nZS0+bWF4X3J0cyA9IDIzNDc7CisJcmFuZ2UtPm1pbl9mcmFnID0gMjU2OworCXJhbmdlLT5tYXhfZnJhZyA9IDIzNDY7CisKKyNpZiBXSVJFTEVTU19FWFQgPiAxNworCS8qIElXX0VOQ19DQVBBXyogYml0IGZpZWxkICovCisJcmFuZ2UtPmVuY19jYXBhID0gSVdfRU5DX0NBUEFfV1BBIHwgSVdfRU5DX0NBUEFfV1BBMiB8CisJCQkJCUlXX0VOQ19DQVBBX0NJUEhFUl9US0lQIHwgSVdfRU5DX0NBUEFfQ0lQSEVSX0NDTVA7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgc3RydWN0IHNvY2thZGRyICphcF9hZGRyLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKyAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCc3NpZDsKKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgIAlyZXR1cm4gLUVORVRET1dOOworICAgIH0KKworCWlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQorICAgIHsKKyAgICAgICAgUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FIGJ1c3ksIHJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKKyAgICB9CisKKyAgICAvLyB0ZWxsIENOVEwgc3RhdGUgbWFjaGluZSB0byBjYWxsIE5kaXNNU2V0SW5mb3JtYXRpb25Db21wbGV0ZSgpIGFmdGVyIGNvbXBsZXRpbmcKKyAgICAvLyB0aGlzIHJlcXVlc3QsIGJlY2F1c2UgdGhpcyByZXF1ZXN0IGlzIGluaXRpYXRlZCBieSBORElTLgorICAgIHBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gRkFMU0U7CisJLy8gUHJldmVudCB0byBjb25uZWN0IEFQIGFnYWluIGluIFNUQU1sbWVQZXJpb2RpY0V4ZWMKKwlwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7CisKKyAgICBtZW1zZXQoQnNzaWQsIDAsIE1BQ19BRERSX0xFTik7CisgICAgbWVtY3B5KEJzc2lkLCBhcF9hZGRyLT5zYV9kYXRhLCBNQUNfQUREUl9MRU4pOworICAgIE1sbWVFbnF1ZXVlKHBBZGFwdGVyLAorICAgICAgICAgICAgICAgIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorICAgICAgICAgICAgICAgIE9JRF84MDJfMTFfQlNTSUQsCisgICAgICAgICAgICAgICAgc2l6ZW9mKE5ESVNfODAyXzExX01BQ19BRERSRVNTKSwKKyAgICAgICAgICAgICAgICAoVk9JRCAqKSZCc3NpZCk7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJT0NUTDo6U0lPQ1NJV0FQICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorICAgICAgICBCc3NpZFswXSwgQnNzaWRbMV0sIEJzc2lkWzJdLCBCc3NpZFszXSwgQnNzaWRbNF0sIEJzc2lkWzVdKSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgIHN0cnVjdCBzb2NrYWRkciAqYXBfYWRkciwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPnByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPnByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPnByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpIHx8IEFESE9DX09OKHBBZGFwdGVyKSkKKwl7CisJCWFwX2FkZHItPnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwkJbWVtY3B5KGFwX2FkZHItPnNhX2RhdGEsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLkJzc2lkLCBFVEhfQUxFTik7CisJfQorI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAvLyBBZGQgZm9yIFJUMjg3MAorICAgIGVsc2UgaWYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpCisgICAgeworICAgICAgICBhcF9hZGRyLT5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisgICAgICAgIG1lbWNweShhcF9hZGRyLT5zYV9kYXRhLCAmcEFkYXB0ZXItPk1sbWVBdXguQnNzaWQsIEVUSF9BTEVOKTsKKyAgICB9CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCWVsc2UKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklPQ1RMOjpTSU9DR0lXQVAoPUVNUFRZKVxuIikpOworCQlyZXR1cm4gLUVOT1RDT05OOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogVW5pdHMgYXJlIGluIGRiIGFib3ZlIHRoZSBub2lzZSBmbG9vci4gVGhhdCBtZWFucyB0aGUKKyAqIHJzc2kgdmFsdWVzIHJlcG9ydGVkIGluIHRoZSB0eC9yeCBkZXNjcmlwdG9ycyBpbiB0aGUKKyAqIGRyaXZlciBhcmUgdGhlIFNOUiBleHByZXNzZWQgaW4gZGIuCisgKgorICogSWYgeW91IGFzc3VtZSB0aGF0IHRoZSBub2lzZSBmbG9vciBpcyAtOTUsIHdoaWNoIGlzIGFuCisgKiBleGNlbGxlbnQgYXNzdW1wdGlvbiA5OS41ICUgb2YgdGhlIHRpbWUsIHRoZW4geW91IGNhbgorICogZGVyaXZlIHRoZSBhYnNvbHV0ZSBzaWduYWwgbGV2ZWwgKGkuZS4gLTk1ICsgcnNzaSkuCisgKiBUaGVyZSBhcmUgc29tZSBvdGhlciBzbGlnaHQgZmFjdG9ycyB0byB0YWtlIGludG8gYWNjb3VudAorICogZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHJzc2kgbWVhc3VyZW1lbnQgaXMgZnJvbSAxMWIsCisgKiAxMWcsIG9yIDExYS4gICBUaGVzZSBkaWZmZXJlbmNlcyBhcmUgYXQgbW9zdCAyZGIgYW5kCisgKiBjYW4gYmUgZG9jdW1lbnRlZC4KKyAqCisgKiBOQjogdmFyaW91cyBjYWxjdWxhdGlvbnMgYXJlIGJhc2VkIG9uIHRoZSBvcmlub2NvL3dhdmVsYW4KKyAqICAgICBkcml2ZXJzIGZvciBjb21wYXRpYmlsaXR5CisgKi8KK3N0YXRpYyB2b2lkIHNldF9xdWFsaXR5KFBSVE1QX0FEQVBURVIgcEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcXVhbGl0eSAqaXEsCisgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgY2hhciByc3NpKQoreworCV9fdTggQ2hhbm5lbFF1YWxpdHk7CisKKwkvLyBOb3JtYWxpemUgUnNzaQorCWlmIChyc3NpID49IC01MCkKKwkJQ2hhbm5lbFF1YWxpdHkgPSAxMDA7CisJZWxzZSBpZiAocnNzaSA+PSAtODApIC8vIGJldHdlZW4gLTUwIH4gLTgwZGJtCisJCUNoYW5uZWxRdWFsaXR5ID0gKF9fdTgpKDI0ICsgKChyc3NpICsgODApICogMjYpLzEwKTsKKwllbHNlIGlmIChyc3NpID49IC05MCkgICAvLyBiZXR3ZWVuIC04MCB+IC05MGRibQorICAgICAgICBDaGFubmVsUXVhbGl0eSA9IChfX3U4KSgocnNzaSArIDkwKSAqIDI2KS8xMDsKKwllbHNlCisJCUNoYW5uZWxRdWFsaXR5ID0gMDsKKworICAgIGlxLT5xdWFsID0gKF9fdTgpQ2hhbm5lbFF1YWxpdHk7CisKKyAgICBpcS0+bGV2ZWwgPSAoX191OCkocnNzaSk7CisgICAgaXEtPm5vaXNlID0gKHBBZGFwdGVyLT5CYnBXcml0ZUxhdGNoWzY2XSA+IHBBZGFwdGVyLT5CYnBUdW5pbmcuRmFsc2VDY2FVcHBlclRocmVzaG9sZCkgPyAoKF9fdTgpcEFkYXB0ZXItPkJicFR1bmluZy5GYWxzZUNjYVVwcGVyVGhyZXNob2xkKSA6ICgoX191OCkgcEFkYXB0ZXItPkJicFdyaXRlTGF0Y2hbNjZdKTsgCS8vIG5vaXNlIGxldmVsIChkQm0pCisgICAgaXEtPm5vaXNlICs9IDI1NiAtIDE0MzsKKyAgICBpcS0+dXBkYXRlZCA9IHBBZGFwdGVyLT5pd19zdGF0cy5xdWFsLnVwZGF0ZWQ7Cit9CisKK2ludCBydF9pb2N0bF9pd2FwbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisgCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCisJc3RydWN0IHNvY2thZGRyIGFkZHJbSVdfTUFYX0FQXTsKKwlzdHJ1Y3QgaXdfcXVhbGl0eSBxdWFsW0lXX01BWF9BUF07CisJaW50IGk7CisKKyAgIAkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJZGF0YS0+bGVuZ3RoID0gMDsKKwkJcmV0dXJuIDA7CisgICAgICAgIC8vcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDxJV19NQVhfQVAgOyBpKyspCisJeworCQlpZiAoaSA+PSAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnIpCisJCQlicmVhazsKKwkJYWRkcltpXS5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJCQltZW1jcHkoYWRkcltpXS5zYV9kYXRhLCAmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWQsIE1BQ19BRERSX0xFTik7CisJCXNldF9xdWFsaXR5KHBBZGFwdGVyLCAmcXVhbFtpXSwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNzaSk7CisJfQorCWRhdGEtPmxlbmd0aCA9IGk7CisJbWVtY3B5KGV4dHJhLCAmYWRkciwgaSpzaXplb2YoYWRkclswXSkpOworCWRhdGEtPmZsYWdzID0gMTsJCS8qIHNpZ25hbCBxdWFsaXR5IHByZXNlbnQgKHNvcnQgb2YpICovCisJbWVtY3B5KGV4dHJhICsgaSpzaXplb2YoYWRkclswXSksICZxdWFsLCBpKnNpemVvZihxdWFsW2ldKSk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIFNJT0NHSVdTQ0FOCitpbnQgcnRfaW9jdGxfc2l3c2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisKKwlVTE9ORwkJCQkJCQkJTm93OworCWludCBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIERyaXZlciBpcyBpbiBNb25pdG9yIE1vZGUgbm93ICEhIVxuIikpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwlpZiAocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFKQorCXsKKwkJcEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50U2NhbkNvdW50Kys7CisJfQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworICAgIHBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IFRSVUU7CisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKwkJcmV0dXJuIDA7CisJZG97CisJCU5vdyA9IGppZmZpZXM7CisKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisJCWlmICgocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFKSAmJgorCQkJKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFNjYW5Db3VudCA+IDMpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgV3BhU3VwcGxpY2FudFNjYW5Db3VudCA+IDNcbiIpKTsKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCQlicmVhazsKKwkJfQorI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCQlpZiAoKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKSAmJgorCQkJKChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwKKwkJCShwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpICYmCisJCQkocEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpKQorCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTGluayBVUCwgUG9ydCBOb3QgU2VjdXJlZCEgaWdub3JlIHRoaXMgc2V0OjpPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTlxuIikpOworCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCisJCXsKKwkJCVJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworCQl9CisKKwkJLy8gdGVsbCBDTlRMIHN0YXRlIG1hY2hpbmUgdG8gY2FsbCBOZGlzTVNldEluZm9ybWF0aW9uQ29tcGxldGUoKSBhZnRlciBjb21wbGV0aW5nCisJCS8vIHRoaXMgcmVxdWVzdCwgYmVjYXVzZSB0aGlzIHJlcXVlc3QgaXMgaW5pdGlhdGVkIGJ5IE5ESVMuCisJCXBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gRkFMU0U7CisJCS8vIFJlc2V0IGFsbG93ZWQgc2NhbiByZXRyaWVzCisJCXBBZGFwdGVyLT5TdGFDZmcuU2NhbkNudCA9IDA7CisJCXBBZGFwdGVyLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gTm93OworCisJCU1sbWVFbnF1ZXVlKHBBZGFwdGVyLAorCQkJTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisJCQlPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTiwKKwkJCTAsCisJCQlOVUxMKTsKKworCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZGFwdGVyKTsKKwl9d2hpbGUoMCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdzY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCWludCBpPTA7CisJY2hhciAqY3VycmVudF9ldiA9IGV4dHJhLCAqcHJldmlvdXNfZXYgPSBleHRyYTsKKwljaGFyICplbmRfYnVmOworCWNoYXIgKmN1cnJlbnRfdmFsLCBjdXN0b21bTUFYX0NVU1RPTV9MRU5dID0gezB9OworI2lmbmRlZiBJV0VWR0VOSUUKKwljaGFyIGlkeDsKKyNlbmRpZiAvLyBJV0VWR0VOSUUgLy8KKwlzdHJ1Y3QgaXdfZXZlbnQgaXdlOworCisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKyAgICB7CisJCS8qCisJCSAqIFN0aWxsIHNjYW5uaW5nLCBpbmRpY2F0ZSB0aGUgY2FsbGVyIHNob3VsZCB0cnkgYWdhaW4uCisJCSAqLworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwlpZiAocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFKQorCXsKKwkJcEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50U2NhbkNvdW50ID0gMDsKKwl9CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yID09IDApCisJeworCQlkYXRhLT5sZW5ndGggPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICBpZiAoZGF0YS0+bGVuZ3RoID4gMCkKKyAgICAgICAgZW5kX2J1ZiA9IGV4dHJhICsgZGF0YS0+bGVuZ3RoOworICAgIGVsc2UKKyAgICAgICAgZW5kX2J1ZiA9IGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQTsKKyNlbHNlCisgICAgZW5kX2J1ZiA9IGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQTsKKyNlbmRpZgorCisJZm9yIChpID0gMDsgaSA8IHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yOyBpKyspCisJeworCQlpZiAoY3VycmVudF9ldiA+PSBlbmRfYnVmKQorICAgICAgICB7CisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisgICAgICAgIH0KKworCQkvL01BQyBhZGRyZXNzCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJaXdlLmNtZCA9IFNJT0NHSVdBUDsKKwkJaXdlLnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJCQkJbWVtY3B5KGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwgJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkLCBFVEhfQUxFTik7CisKKyAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgY3VycmVudF9ldixlbmRfYnVmLCAmaXdlLCBJV19FVl9BRERSX0xFTik7CisgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQlicmVhazsKKyNlbmRpZgorCisJCS8vRVNTSUQKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQlpd2UuY21kID0gU0lPQ0dJV0VTU0lEOworCQlpd2UudS5kYXRhLmxlbmd0aCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWRMZW47CisJCWl3ZS51LmRhdGEuZmxhZ3MgPSAxOworCisgICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKwkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsZW5kX2J1ZiwgJml3ZSwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZCk7CisgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQlicmVhazsKKyNlbmRpZgorCisJCS8vTmV0d29yayBUeXBlCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJaXdlLmNtZCA9IFNJT0NHSVdNT0RFOworCQlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzVHlwZSA9PSBOZGlzODAyXzExSUJTUykKKwkJeworCQkJaXdlLnUubW9kZSA9IElXX01PREVfQURIT0M7CisJCX0KKwkJZWxzZSBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzVHlwZSA9PSBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmUpCisJCXsKKwkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX0lORlJBOworCQl9CisJCWVsc2UKKwkJeworCQkJaXdlLnUubW9kZSA9IElXX01PREVfQVVUTzsKKwkJfQorCQlpd2UubGVuID0gSVdfRVZfVUlOVF9MRU47CisKKyAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgIElXX0VWX1VJTlRfTEVOKTsKKyAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJLy9DaGFubmVsIGFuZCBGcmVxdWVuY3kKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQlpd2UuY21kID0gU0lPQ0dJV0ZSRVE7CisJCWlmIChJTkZSQV9PTihwQWRhcHRlcikgfHwgQURIT0NfT04ocEFkYXB0ZXIpKQorCQkJaXdlLnUuZnJlcS5tID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQ2hhbm5lbDsKKwkJZWxzZQorCQkJaXdlLnUuZnJlcS5tID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQ2hhbm5lbDsKKwkJaXdlLnUuZnJlcS5lID0gMDsKKwkJaXdlLnUuZnJlcS5pID0gMDsKKworCQlwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9FVkVOVChpbmZvLCBjdXJyZW50X2V2LGVuZF9idWYsICZpd2UsIElXX0VWX0ZSRVFfTEVOKTsKKyAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisKKyAgICAgICAgLy9BZGQgcXVhbGl0eSBzdGF0aXN0aWNzCisgICAgICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKyAgICAJaXdlLmNtZCA9IElXRVZRVUFMOworICAgIAlpd2UudS5xdWFsLmxldmVsID0gMDsKKyAgICAJaXdlLnUucXVhbC5ub2lzZSA9IDA7CisgICAgICAgIHNldF9xdWFsaXR5KHBBZGFwdGVyLCAmaXdlLnUucXVhbCwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNzaSk7CisgICAgCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9FVkVOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBJV19FVl9RVUFMX0xFTik7CisgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQlicmVhazsKKyNlbmRpZgorCisJCS8vRW5jeXB0aW9uIGtleQorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBTSU9DR0lXRU5DT0RFOworCQlpZiAoQ0FQX0lTX1BSSVZBQ1lfT04gKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkNhcGFiaWxpdHlJbmZvICkpCisJCQlpd2UudS5kYXRhLmZsYWdzID1JV19FTkNPREVfRU5BQkxFRCB8IElXX0VOQ09ERV9OT0tFWTsKKwkJZWxzZQorCQkJaXdlLnUuZGF0YS5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRDsKKworICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisgICAgICAgIGN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCZpd2UsIChjaGFyICopcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsoaXdlLnUuZGF0YS5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCktMV0uS2V5KTsKKyAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJLy9CaXQgUmF0ZQorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlTGVuKQorICAgICAgICB7CisgICAgICAgICAgICBVQ0hBUiB0bXBSYXRlID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZVtwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlTGVuLTFdOworCQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJCWl3ZS5jbWQgPSBTSU9DR0lXUkFURTsKKyAgICAJCWN1cnJlbnRfdmFsID0gY3VycmVudF9ldiArIElXX0VWX0xDUF9MRU47CisgICAgICAgICAgICBpZiAodG1wUmF0ZSA9PSAweDgyKQorICAgICAgICAgICAgICAgIGl3ZS51LmJpdHJhdGUudmFsdWUgPSAgMSAqIDEwMDAwMDA7CisgICAgICAgICAgICBlbHNlIGlmICh0bXBSYXRlID09IDB4ODQpCisgICAgICAgICAgICAgICAgaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICAyICogMTAwMDAwMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHRtcFJhdGUgPT0gMHg4QikKKyAgICAgICAgICAgICAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gIDUuNSAqIDEwMDAwMDA7CisgICAgICAgICAgICBlbHNlIGlmICh0bXBSYXRlID09IDB4OTYpCisgICAgICAgICAgICAgICAgaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICAxMSAqIDEwMDAwMDA7CisgICAgICAgICAgICBlbHNlCisgICAgCQkgICAgaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICAodG1wUmF0ZS8yKSAqIDEwMDAwMDA7CisKKwkJCWl3ZS51LmJpdHJhdGUuZGlzYWJsZWQgPSAwOworCQkJY3VycmVudF92YWwgPSBJV0VfU1RSRUFNX0FERF9WQUxVRShpbmZvLCBjdXJyZW50X2V2LAorCQkJCWN1cnJlbnRfdmFsLCBlbmRfYnVmLCAmaXdlLAorICAgIAkJCUlXX0VWX1BBUkFNX0xFTik7CisKKyAgICAgICAgCWlmKChjdXJyZW50X3ZhbC1jdXJyZW50X2V2KT5JV19FVl9MQ1BfTEVOKQorICAgICAgICAgICAgCWN1cnJlbnRfZXYgPSBjdXJyZW50X3ZhbDsKKyAgICAgICAgCWVsc2UKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCSAgICBicmVhazsKKyNlbmRpZgorICAgICAgICB9CisKKyNpZmRlZiBJV0VWR0VOSUUKKwkJLy9XUEEgSUUKKwkJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuID4gMCkKKwkJeworCQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJCW1lbXNldCgmY3VzdG9tWzBdLCAwLCBNQVhfQ1VTVE9NX0xFTik7CisJCQltZW1jcHkoY3VzdG9tLCAmKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFWzBdKSwKKwkJCQkJCSAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuKTsKKwkJCWl3ZS5jbWQgPSBJV0VWR0VOSUU7CisJCQlpd2UudS5kYXRhLmxlbmd0aCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuOworCQkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIGN1c3RvbSk7CisJCQlpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCSAgICBicmVhazsKKyNlbmRpZgorCQl9CisKKwkJLy9XUEEyIElFCisgICAgICAgIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbiA+IDApCisgICAgICAgIHsKKyAgICAgICAgCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCQltZW1zZXQoJmN1c3RvbVswXSwgMCwgTUFYX0NVU1RPTV9MRU4pOworCQkJbWVtY3B5KGN1c3RvbSwgJihwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRVswXSksCisJCQkJCQkgICBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbik7CisJCQlpd2UuY21kID0gSVdFVkdFTklFOworCQkJaXdlLnUuZGF0YS5sZW5ndGggPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbjsKKwkJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBjdXN0b20pOworCQkJaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQkgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgLy9XUEEgSUUKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW4gPiAwKQorICAgICAgICB7CisgICAgCQlOZGlzWmVyb01lbW9yeSgmaXdlLCBzaXplb2YoaXdlKSk7CisJCQltZW1zZXQoJmN1c3RvbVswXSwgMCwgTUFYX0NVU1RPTV9MRU4pOworICAgIAkJaXdlLmNtZCA9IElXRVZDVVNUT007CisgICAgICAgICAgICBpd2UudS5kYXRhLmxlbmd0aCA9IChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbiAqIDIpICsgNzsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KGN1c3RvbSwgIndwYV9pZT0iLCA3KTsKKyAgICAgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW47IGlkeCsrKQorICAgICAgICAgICAgICAgIHNwcmludGYoY3VzdG9tLCAiJXMlMDJ4IiwgY3VzdG9tLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRVtpZHhdKTsKKyAgICAgICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKyAgICAJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCAgY3VzdG9tKTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICAvL1dQQTIgSUUKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuID4gMCkKKyAgICAgICAgeworICAgIAkJTmRpc1plcm9NZW1vcnkoJml3ZSwgc2l6ZW9mKGl3ZSkpOworCQkJbWVtc2V0KCZjdXN0b21bMF0sIDAsIE1BWF9DVVNUT01fTEVOKTsKKyAgICAJCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworICAgICAgICAgICAgaXdlLnUuZGF0YS5sZW5ndGggPSAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW4gKiAyKSArIDc7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShjdXN0b20sICJyc25faWU9IiwgNyk7CisJCQlmb3IgKGlkeCA9IDA7IGlkeCA8IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuOyBpZHgrKykKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGN1c3RvbSwgIiVzJTAyeCIsIGN1c3RvbSwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVbaWR4XSk7CisgICAgICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisgICAgCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgIGN1c3RvbSk7CisgICAgICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCSAgICBicmVhazsKKyNlbmRpZgorICAgICAgICB9CisjZW5kaWYgLy8gSVdFVkdFTklFIC8vCisJfQorCisJZGF0YS0+bGVuZ3RoID0gY3VycmVudF9ldiAtIGV4dHJhOworICAgIHBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SICwoIj09PT5ydF9pb2N0bF9naXdzY2FuLiAlZCglZCkgQlNTIHJldHVybmVkLCBkYXRhLT5sZW5ndGggPSAlZFxuIixpICwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnIsIGRhdGEtPmxlbmd0aCkpOworCXJldHVybiAwOworfQorI2VuZGlmCisKK2ludCBydF9pb2N0bF9zaXdlc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICplc3NpZCkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgIAlyZXR1cm4gLUVORVRET1dOOworICAgIH0KKworCWlmIChkYXRhLT5mbGFncykKKwl7CisJCVBDSEFSCXBTc2lkU3RyaW5nID0gTlVMTDsKKworCQkvLyBJbmNsdWRlcyBudWxsIGNoYXJhY3Rlci4KKwkJaWYgKGRhdGEtPmxlbmd0aCA+IChJV19FU1NJRF9NQVhfU0laRSArIDEpKQorCQkJcmV0dXJuIC1FMkJJRzsKKworCQlwU3NpZFN0cmluZyA9IChDSEFSICopIGttYWxsb2MoTUFYX0xFTl9PRl9TU0lEKzEsIE1FTV9BTExPQ19GTEFHKTsKKwkJaWYgKHBTc2lkU3RyaW5nKQorCQl7CisJCQlOZGlzWmVyb01lbW9yeShwU3NpZFN0cmluZywgTUFYX0xFTl9PRl9TU0lEKzEpOworCQkJTmRpc01vdmVNZW1vcnkocFNzaWRTdHJpbmcsIGVzc2lkLCBkYXRhLT5sZW5ndGgpOworCQkJaWYgKFNldF9TU0lEX1Byb2MocEFkYXB0ZXIsIHBTc2lkU3RyaW5nKSA9PSBGQUxTRSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQllbHNlCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZWxzZQorCXsKKwkJLy8gQU5ZIHNzaWQKKwkJaWYgKFNldF9TU0lEX1Byb2MocEFkYXB0ZXIsICIiKSA9PSBGQUxTRSkKKwkJCXJldHVybiAtRUlOVkFMOworICAgIH0KKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmVzc2lkKQoreworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJZGF0YS0+ZmxhZ3MgPSAxOworICAgIGlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKKyAgICB7CisgICAgICAgIGRhdGEtPmxlbmd0aCAgPSAwOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJNZWRpYVN0YXRlIGlzIGNvbm5lY3RlZFxuIikpOworCQlkYXRhLT5sZW5ndGggPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWRMZW47CisJCW1lbWNweShlc3NpZCwgcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWRMZW4pOworCX0KKyNpZmRlZiBSVDI4NzAKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgLy8gQWRkIGZvciBSVDI4NzAKKyAgICBlbHNlIGlmIChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQorICAgIHsKKyAgICAgICAgZGF0YS0+bGVuZ3RoID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkTGVuOworCQltZW1jcHkoZXNzaWQsIHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZCwgcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkTGVuKTsKKwl9CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworI2VuZGlmIC8vIFJUMjg3MCAvLworCWVsc2UKKwl7Ly90aGUgQU5ZIHNzaWQgd2FzIHNwZWNpZmllZAorCQlkYXRhLT5sZW5ndGggID0gMDsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiTWVkaWFTdGF0ZSBpcyBub3QgY29ubmVjdGVkLCBlc3NcbiIpKTsKKwl9CisKKwlyZXR1cm4gMDsKKworfQorCitpbnQgcnRfaW9jdGxfc2l3bmlja24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqbmlja25hbWUpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAgcmV0dXJuIC1FTkVURE9XTjsKKyAgICB9CisKKwlpZiAoZGF0YS0+bGVuZ3RoID4gSVdfRVNTSURfTUFYX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOworCisJbWVtc2V0KHBBZGFwdGVyLT5uaWNrbmFtZSwgMCwgSVdfRVNTSURfTUFYX1NJWkUgKyAxKTsKKwltZW1jcHkocEFkYXB0ZXItPm5pY2tuYW1lLCBuaWNrbmFtZSwgZGF0YS0+bGVuZ3RoKTsKKworCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXduaWNrbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpuaWNrbmFtZSkKK3sKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+cHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+cHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+cHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWlmIChkYXRhLT5sZW5ndGggPiBzdHJsZW4ocEFkYXB0ZXItPm5pY2tuYW1lKSArIDEpCisJCWRhdGEtPmxlbmd0aCA9IHN0cmxlbihwQWRhcHRlci0+bmlja25hbWUpICsgMTsKKwlpZiAoZGF0YS0+bGVuZ3RoID4gMCkgeworCQltZW1jcHkobmlja25hbWUsIHBBZGFwdGVyLT5uaWNrbmFtZSwgZGF0YS0+bGVuZ3RoLTEpOworCQluaWNrbmFtZVtkYXRhLT5sZW5ndGgtMV0gPSAnXDAnOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX3Npd3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgIHN0cnVjdCBpd19wYXJhbSAqcnRzLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKwl1MTYgdmFsOworCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgIHJldHVybiAtRU5FVERPV047CisgICAgfQorCisJaWYgKHJ0cy0+ZGlzYWJsZWQpCisJCXZhbCA9IE1BWF9SVFNfVEhSRVNIT0xEOworCWVsc2UgaWYgKHJ0cy0+dmFsdWUgPCAwIHx8IHJ0cy0+dmFsdWUgPiBNQVhfUlRTX1RIUkVTSE9MRCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZWxzZSBpZiAocnRzLT52YWx1ZSA9PSAwKQorCSAgICB2YWwgPSBNQVhfUlRTX1RIUkVTSE9MRDsKKwllbHNlCisJCXZhbCA9IHJ0cy0+dmFsdWU7CisKKwlpZiAodmFsICE9IHBBZGFwdGVyLT5Db21tb25DZmcuUnRzVGhyZXNob2xkKQorCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA9IHZhbDsKKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3cnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICAgc3RydWN0IGl3X3BhcmFtICpydHMsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlydHMtPnZhbHVlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQ7CisJcnRzLT5kaXNhYmxlZCA9IChydHMtPnZhbHVlID09IE1BWF9SVFNfVEhSRVNIT0xEKTsKKwlydHMtPmZpeGVkID0gMTsKKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3ZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wYXJhbSAqZnJhZywgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisJdTE2IHZhbDsKKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICAJeworICAgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgIAlyZXR1cm4gLUVORVRET1dOOworICAgIAl9CisKKwlpZiAoZnJhZy0+ZGlzYWJsZWQpCisJCXZhbCA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKKwllbHNlIGlmIChmcmFnLT52YWx1ZSA+PSBNSU5fRlJBR19USFJFU0hPTEQgfHwgZnJhZy0+dmFsdWUgPD0gTUFYX0ZSQUdfVEhSRVNIT0xEKQorICAgICAgICB2YWwgPSBfX2NwdV90b19sZTE2KGZyYWctPnZhbHVlICYgfjB4MSk7IC8qIGV2ZW4gbnVtYmVycyBvbmx5ICovCisJZWxzZSBpZiAoZnJhZy0+dmFsdWUgPT0gMCkKKwkgICAgdmFsID0gTUFYX0ZSQUdfVEhSRVNIT0xEOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwQWRhcHRlci0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gdmFsOworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3ZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wYXJhbSAqZnJhZywgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPnByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPnByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPnByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWZyYWctPnZhbHVlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZDsKKwlmcmFnLT5kaXNhYmxlZCA9IChmcmFnLT52YWx1ZSA9PSBNQVhfRlJBR19USFJFU0hPTEQpOworCWZyYWctPmZpeGVkID0gMTsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIE1BWF9XRVBfS0VZX1NJWkUgMTMKKyNkZWZpbmUgTUlOX1dFUF9LRVlfU0laRSA1CitpbnQgcnRfaW9jdGxfc2l3ZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpd19wb2ludCAqZXJxLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICAJeworICAgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgIAlyZXR1cm4gLUVORVRET1dOOworICAgIAl9CisKKwlpZiAoKGVycS0+bGVuZ3RoID09IDApICYmCisgICAgICAgIChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKSkKKwl7CisJCXBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwkJcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwkJcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKyAgICAgICAgZ290byBkb25lOworCX0KKwllbHNlIGlmICgoZXJxLT5sZW5ndGggPT0gMCkgJiYKKyAgICAgICAgICAgICAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEIHx8IGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfT1BFTikpCisJeworCSAgICAvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwkJU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisJCXBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworCQlwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisJCXBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworCQlpZiAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEKQorCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZDsKKyAgICAJZWxzZQorCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisgICAgICAgIGdvdG8gZG9uZTsKKwl9CisKKyAgICBpZiAoZXJxLT5sZW5ndGggPiAwKQorCXsKKwkJaW50IGtleUlkeCA9IChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisJCS8qIENoZWNrIHRoZSBzaXplIG9mIHRoZSBrZXkgKi8KKwkJaWYgKGVycS0+bGVuZ3RoID4gTUFYX1dFUF9LRVlfU0laRSkgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJLyogQ2hlY2sga2V5IGluZGV4ICovCisJCWlmICgoa2V5SWR4IDwgMCkgfHwgKGtleUlkeCA+PSBOUl9XRVBfS0VZUykpCisgICAgICAgIHsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6V3Jvbmcga2V5SWR4PSVkISBVc2luZyBkZWZhdWx0IGtleSBpbnN0ZWFkICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5SWR4LCBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkpOworCisgICAgICAgICAgICAvL1VzaW5nIGRlZmF1bHQga2V5CisJCQlrZXlJZHggPSBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKKyAgICAgICAgfQorCisgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksICAxNik7CisKKwkJaWYgKGVycS0+bGVuZ3RoID09IE1BWF9XRVBfS0VZX1NJWkUpCisgICAgICAgIHsKKwkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSBNQVhfV0VQX0tFWV9TSVpFOworICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisJCX0KKwkJZWxzZSBpZiAoZXJxLT5sZW5ndGggPT0gTUlOX1dFUF9LRVlfU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IE1JTl9XRVBfS0VZX1NJWkU7CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQl9CisJCWVsc2UKKwkJCS8qIERpc2FibGUgdGhlIGtleSAqLworCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IDA7CisKKwkJLyogQ2hlY2sgaWYgdGhlIGtleSBpcyBub3QgbWFya2VkIGFzIGludmFsaWQgKi8KKwkJaWYoIShlcnEtPmZsYWdzICYgSVdfRU5DT0RFX05PS0VZKSkgeworCQkJLyogQ29weSB0aGUga2V5IGluIHRoZSBkcml2ZXIgKi8KKwkJCU5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksIGV4dHJhLCBlcnEtPmxlbmd0aCk7CisgICAgICAgIH0KKwl9CisgICAgZWxzZQorCQkJeworCQkvKiBEbyB3ZSB3YW50IHRvIGp1c3Qgc2V0IHRoZSB0cmFuc21pdCBrZXkgaW5kZXggPyAqLworCQlpbnQgaW5kZXggPSAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOworCQlpZiAoKGluZGV4ID49IDApICYmIChpbmRleCA8IDQpKQorICAgICAgICB7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IGluZGV4OworICAgICAgICAgICAgfQorICAgICAgICBlbHNlCisJCQkvKiBEb24ndCBjb21wbGFpbiBpZiBvbmx5IGNoYW5nZSB0aGUgbW9kZSAqLworCQkJaWYoIWVycS0+ZmxhZ3MgJiBJV19FTkNPREVfTU9ERSkgeworCQkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCitkb25lOgorICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6ZXJxLT5mbGFncz0leFxuIixlcnEtPmZsYWdzKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT0+cnRfaW9jdGxfc2l3ZW5jb2RlOjpBdXRoTW9kZT0leFxuIixwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT0+cnRfaW9jdGxfc2l3ZW5jb2RlOjpEZWZhdWx0S2V5SWQ9JXgsIEtleUxlbiA9ICVkXG4iLHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkICwgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT0+cnRfaW9jdGxfc2l3ZW5jb2RlOjpXZXBTdGF0dXM9JXhcbiIscEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMpKTsKKwlyZXR1cm4gMDsKK30KKworaW50CitydF9pb2N0bF9naXdlbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgc3RydWN0IGl3X3BvaW50ICplcnEsIGNoYXIgKmtleSkKK3sKKwlpbnQga2lkOworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlraWQgPSBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5ydF9pb2N0bF9naXdlbmNvZGUgJWRcbiIsIGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpKTsKKworCWlmIChwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCisJeworCQllcnEtPmxlbmd0aCA9IDA7CisJCWVycS0+ZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7CisJfQorCWVsc2UgaWYgKChraWQgPiAwKSAmJiAoa2lkIDw9NCkpCisJeworCQkvLyBjb3B5IHdlcCBrZXkKKwkJZXJxLT5mbGFncyA9IGtpZCA7CQkJLyogTkI6IGJhc2UgMSAqLworCQlpZiAoZXJxLT5sZW5ndGggPiBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tpZC0xXS5LZXlMZW4pCisJCQllcnEtPmxlbmd0aCA9IHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2lkLTFdLktleUxlbjsKKwkJbWVtY3B5KGtleSwgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtraWQtMV0uS2V5LCBlcnEtPmxlbmd0aCk7CisJCS8vaWYgKChraWQgPT0gcEFkYXB0ZXItPlBvcnRDZmcuRGVmYXVsdEtleUlkKSkKKwkJLy9lcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOwkvKiBYWFggKi8KKwkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKQorCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfUkVTVFJJQ1RFRDsJCS8qIFhYWCAqLworCQllbHNlCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9PUEVOOwkJLyogWFhYICovCisKKwl9CisJZWxzZSBpZiAoa2lkID09IDApCisJeworCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9SRVNUUklDVEVEOwkJLyogWFhYICovCisJCWVsc2UKKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX09QRU47CQkvKiBYWFggKi8KKwkJZXJxLT5sZW5ndGggPSBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW47CisJCW1lbWNweShrZXksIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwgZXJxLT5sZW5ndGgpOworCQkvLyBjb3B5IGRlZmF1bHQga2V5IElECisJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkKKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX1JFU1RSSUNURUQ7CQkvKiBYWFggKi8KKwkJZWxzZQorCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfT1BFTjsJCS8qIFhYWCAqLworCQllcnEtPmZsYWdzID0gcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgKyAxOwkJCS8qIE5COiBiYXNlIDEgKi8KKwkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsJLyogWFhYICovCisJfQorCisJcmV0dXJuIDA7CisKK30KKworc3RhdGljIGludAorcnRfaW9jdGxfc2V0cGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSB2b2lkICp3LCBjaGFyICpleHRyYSkKK3sKKyAgICBWSVJUVUFMX0FEQVBURVIJKnBWaXJ0dWFsQWQgPSBOVUxMOworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXI7CisJUE9TX0NPT0tJRSBwT2JqOworCWNoYXIgKnRoaXNfY2hhciA9IGV4dHJhOworCWNoYXIgKnZhbHVlOworCWludCAgU3RhdHVzPTA7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPnByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPnByaXY7CisJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+cHJpdjsKKwl9CisJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWRhcHRlci0+T1NfQ29va2llOworCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwl7CisJCXBPYmotPmlvY3RsX2lmX3R5cGUgPSBJTlRfTUFJTjsKKyAgICAgICAgcE9iai0+aW9jdGxfaWYgPSBNQUlOX01CU1NJRDsKKwl9CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIAlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgCXsKKyAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworCQkJcmV0dXJuIC1FTkVURE9XTjsKKyAgICAJfQorCisJaWYgKCEqdGhpc19jaGFyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgodmFsdWUgPSBydHN0cmNocih0aGlzX2NoYXIsICc9JykpICE9IE5VTEwpCisJICAgICp2YWx1ZSsrID0gMDsKKworCWlmICghdmFsdWUpCisJICAgIHJldHVybiAtRUlOVkFMOworCisJLy8gcmVqZWN0IHNldHRpbmcgbm90aGluZyBiZXNpZGVzIEFOWSBzc2lkKHNzaWRMZW49MCkKKyAgICBpZiAoISp2YWx1ZSAmJiAoc3RyY21wKHRoaXNfY2hhciwgIlNTSUQiKSAhPSAwKSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKFBSVE1QX1BSSVZBVEVfU0VUX1BST0MgPSBSVE1QX1BSSVZBVEVfU1VQUE9SVF9QUk9DOyBQUlRNUF9QUklWQVRFX1NFVF9QUk9DLT5uYW1lOyBQUlRNUF9QUklWQVRFX1NFVF9QUk9DKyspCisJeworCSAgICBpZiAoc3RyY21wKHRoaXNfY2hhciwgUFJUTVBfUFJJVkFURV9TRVRfUFJPQy0+bmFtZSkgPT0gMCkKKwkgICAgeworCSAgICAgICAgaWYoIVBSVE1QX1BSSVZBVEVfU0VUX1BST0MtPnNldF9wcm9jKHBBZGFwdGVyLCB2YWx1ZSkpCisJICAgICAgICB7CS8vRkFMU0U6U2V0IHByaXZhdGUgZmFpbGVkIHRoZW4gcmV0dXJuIEludmFsaWQgYXJndW1lbnQKKwkJCSAgICBTdGF0dXMgPSAtRUlOVkFMOworCSAgICAgICAgfQorCQkgICAgYnJlYWs7CS8vRXhpdCBmb3IgbG9vcC4KKwkgICAgfQorCX0KKworCWlmKFBSVE1QX1BSSVZBVEVfU0VUX1BST0MtPm5hbWUgPT0gTlVMTCkKKwl7ICAvL05vdCBmb3VuZCBhcmd1bWVudAorCSAgICBTdGF0dXMgPSAtRUlOVkFMOworCSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+cnRfaW9jdGxfc2V0cGFyYW06OiAoaXdwcml2KSBOb3QgU3VwcG9ydCBTZXQgQ29tbWFuZCBbJXM9JXNdXG4iLCB0aGlzX2NoYXIsIHZhbHVlKSk7CisJfQorCisgICAgcmV0dXJuIFN0YXR1czsKK30KKworCitzdGF0aWMgaW50CitydF9wcml2YXRlX2dldF9zdGF0aXN0aWNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBpd19wb2ludCAqd3JxLCBjaGFyICpleHRyYSkKK3sKKwlJTlQJCQkJU3RhdHVzID0gMDsKKyAgICBQUlRNUF9BREFQVEVSICAgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKworICAgIGlmIChleHRyYSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgd3JxLT5sZW5ndGggPSAwOworICAgICAgICByZXR1cm4gLUVJTzsKKyAgICB9CisKKyAgICBtZW1zZXQoZXh0cmEsIDB4MDAsIElXX1BSSVZfU0laRV9NQVNLKTsKKyAgICBzcHJpbnRmKGV4dHJhLCAiXG5cbiIpOworCisjaWZkZWYgUkFMSU5LX0FURQorCWlmIChBVEVfT04ocEFkKSkKKwl7CisJICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlR4IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPmF0ZS5UeERvbmVDb3VudCk7CisJICAgIC8vc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyB3aXRob3V0IHJldHJ5ICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+YXRlLlR4RG9uZUNvdW50KTsKKwl9CisJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwl7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCk7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyB3aXRob3V0IHJldHJ5ICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCAtIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LlF1YWRQYXJ0KTsKKwl9CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyBhZnRlciByZXRyeSAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQuUXVhZFBhcnQpOworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlR4IGZhaWwgdG8gUmN2IEFDSyBhZnRlciByZXRyeSAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC5RdWFkUGFydCk7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlRTIFN1Y2Nlc3MgUmN2IENUUyAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJUU1N1Y2Nlc3NDb3VudC5RdWFkUGFydCk7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlRTIEZhaWwgUmN2IENUUyAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJUU0ZhaWx1cmVDb3VudC5RdWFkUGFydCk7CisKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSeCBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuUmVjZWl2ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0KTsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSeCB3aXRoIENSQyAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuRkNTRXJyb3JDb3VudC5RdWFkUGFydCk7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUnggZHJvcCBkdWUgdG8gb3V0IG9mIHJlc291cmNlICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXIpOworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJ4IGR1cGxpY2F0ZSBmcmFtZSAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5GcmFtZUR1cGxpY2F0ZUNvdW50LlF1YWRQYXJ0KTsKKworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIkZhbHNlIENDQSAob25lIHNlY29uZCkgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0ZhbHNlQ0NBQ250KTsKKyNpZmRlZiBSQUxJTktfQVRFCisJaWYgKEFURV9PTihwQWQpKQorCXsKKwkJaWYgKHBBZC0+YXRlLlJ4QW50ZW5uYVNlbCA9PSAwKQorCQl7CisgICAgCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUEgICAgICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoTE9ORykocEFkLT5hdGUuTGFzdFJzc2kwIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOworCQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1CIChpZiBhdmFpbGFibGUpICAgICAgICAgICA9ICVsZFxuIiwgKExPTkcpKHBBZC0+YXRlLkxhc3RSc3NpMSAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKwkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQyAoaWYgYXZhaWxhYmxlKSAgICAgICAgICAgPSAlbGRcblxuIiwgKExPTkcpKHBBZC0+YXRlLkxhc3RSc3NpMiAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKwkJfQorCQllbHNlCisJCXsKKyAgICAJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChMT05HKShwQWQtPmF0ZS5MYXN0UnNzaTAgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7CisJCX0KKwl9CisJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwl7CisgICAgCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChMT05HKShwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKyAgICAgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1CIChpZiBhdmFpbGFibGUpICAgICAgICAgICA9ICVsZFxuIiwgKExPTkcpKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOworICAgICAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUMgKGlmIGF2YWlsYWJsZSkgICAgICAgICAgID0gJWxkXG5cbiIsIChMT05HKShwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMiAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKwl9CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIldwYVN1cHBsaWNhbnRVUCAgICAgICAgICAgICAgICAgPSAlZFxuXG4iLCBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworCisgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IHJ0X3ByaXZhdGVfZ2V0X3N0YXRpc3RpY3MsIHdycS0+bGVuZ3RoID0gJWRcbiIsIHdycS0+bGVuZ3RoKSk7CisKKyAgICByZXR1cm4gU3RhdHVzOworfQorCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCit2b2lkCWdldEJhSW5mbygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlwT3V0QnVmKQoreworCUlOVCBpLCBqOworCUJBX09SSV9FTlRSWSAqcE9yaUJBRW50cnk7CisJQkFfUkVDX0VOVFJZICpwUmVjQkFFbnRyeTsKKworCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCisJeworCQlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W2ldOworCQlpZiAoKChwRW50cnktPlZhbGlkQXNDTEkgfHwgcEVudHJ5LT5WYWxpZEFzQXBDbGkpICYmIChwRW50cnktPlNzdCA9PSBTU1RfQVNTT0MpKQorCQkJfHwgKHBFbnRyeS0+VmFsaWRBc1dEUykgfHwgKHBFbnRyeS0+VmFsaWRBc01lc2gpKQorCQl7CisJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1xuJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlggKEFpZCA9ICVkKSAoQVApIC1cbiIsCisgICAgICAgICAgICAgICAgcE91dEJ1ZiwKKwkJCQlwRW50cnktPkFkZHJbMF0sIHBFbnRyeS0+QWRkclsxXSwgcEVudHJ5LT5BZGRyWzJdLAorCQkJCXBFbnRyeS0+QWRkclszXSwgcEVudHJ5LT5BZGRyWzRdLCBwRW50cnktPkFkZHJbNV0sIHBFbnRyeS0+QWlkKTsKKworCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNbUmVjaXBpZW50XVxuIiwgcE91dEJ1Zik7CisJCQlmb3IgKGo9MDsgaiA8IE5VTV9PRl9USUQ7IGorKykKKwkJCXsKKwkJCQlpZiAocEVudHJ5LT5CQVJlY1djaWRBcnJheVtqXSAhPSAwKQorCQkJCXsKKwkJCQkJcFJlY0JBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtwRW50cnktPkJBUmVjV2NpZEFycmF5W2pdXTsKKwkJCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNUSUQ9JWQsIEJBV2luU2l6ZT0lZCwgTGFzdEluZFNlcT0lZCwgUmVvcmRlcmluZ1BrdHM9JWRcbiIsIHBPdXRCdWYsIGosIHBSZWNCQUVudHJ5LT5CQVdpblNpemUsIHBSZWNCQUVudHJ5LT5MYXN0SW5kU2VxLCBwUmVjQkFFbnRyeS0+bGlzdC5xbGVuKTsKKwkJCQl9CisJCQl9CisJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1xuIiwgcE91dEJ1Zik7CisKKwkJCXNwcmludGYocE91dEJ1ZiwgIiVzW09yaWdpbmF0b3JdXG4iLCBwT3V0QnVmKTsKKwkJCWZvciAoaj0wOyBqIDwgTlVNX09GX1RJRDsgaisrKQorCQkJeworCQkJCWlmIChwRW50cnktPkJBT3JpV2NpZEFycmF5W2pdICE9IDApCisJCQkJeworCQkJCQlwT3JpQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W3BFbnRyeS0+QkFPcmlXY2lkQXJyYXlbal1dOworCQkJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1RJRD0lZCwgQkFXaW5TaXplPSVkLCBTdGFydFNlcT0lZCwgQ3VyVHhTZXE9JWRcbiIsIHBPdXRCdWYsIGosIHBPcmlCQUVudHJ5LT5CQVdpblNpemUsIHBPcmlCQUVudHJ5LT5TZXF1ZW5jZSwgcEVudHJ5LT5UeFNlcVtqXSk7CisJCQkJfQorCQkJfQorCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNcblxuIiwgcE91dEJ1Zik7CisJCX0KKyAgICAgICAgaWYgKHN0cmxlbihwT3V0QnVmKSA+IChJV19QUklWX1NJWkVfTUFTSyAtIDMwKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKwl9CisKKwlyZXR1cm47Cit9CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKK3N0YXRpYyBpbnQKK3J0X3ByaXZhdGVfc2hvdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQlzdHJ1Y3QgaXdfcG9pbnQgKndycSwgY2hhciAqZXh0cmEpCit7CisgICAgSU5UCQkJCVN0YXR1cyA9IDA7CisgICAgVklSVFVBTF9BREFQVEVSCSpwVmlydHVhbEFkID0gTlVMTDsKKyAgICBQUlRNUF9BREFQVEVSICAgcEFkOworCVBPU19DT09LSUUJCXBPYmo7CisgICAgdTMyICAgICAgICAgICAgIHN1YmNtZCA9IHdycS0+ZmxhZ3M7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCQlwQWQgPSBkZXYtPnByaXY7CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+cHJpdjsKKwkJcEFkID0gcFZpcnR1YWxBZC0+UnRtcERldi0+cHJpdjsKKwl9CisJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKworCWlmIChwQWQgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworICAgIGlmIChleHRyYSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgd3JxLT5sZW5ndGggPSAwOworICAgICAgICByZXR1cm4gLUVJTzsKKyAgICB9CisgICAgbWVtc2V0KGV4dHJhLCAweDAwLCBJV19QUklWX1NJWkVfTUFTSyk7CisKKwl7CisJCXBPYmotPmlvY3RsX2lmX3R5cGUgPSBJTlRfTUFJTjsKKyAgICAgICAgcE9iai0+aW9jdGxfaWYgPSBNQUlOX01CU1NJRDsKKwl9CisKKyAgICBzd2l0Y2goc3ViY21kKQorICAgIHsKKworICAgICAgICBjYXNlIFNIT1dfQ09OTl9TVEFUVVM6CisgICAgICAgICAgICBpZiAoTU9OSVRPUl9PTihwQWQpKQorICAgICAgICAgICAgeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgICAgICAgICAgICAgIGlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQgJiYKKyAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXKQorICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiTW9uaXRvciBNb2RlKENlbnRyYWxDaGFubmVsICVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIk1vbml0b3IgTW9kZShDaGFubmVsICVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID09IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkKQorICAgICAgICAgICAgCXsKKyAgICAgICAgICAgIAkgICAgaWYgKElORlJBX09OKHBBZCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIkNvbm5lY3RlZChBUDogJXNbJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhdKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbNV0pOworICAgICAgICAgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJTc2lkPSVzICxTc2lkbGVuID0gJWRcbiIscEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbikpOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQURIT0NfT04ocEFkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJDb25uZWN0ZWRcbiIpOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAllbHNlCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICBzcHJpbnRmKGV4dHJhLCAiRGlzY29ubmVjdGVkXG4iKTsKKyAgICAgICAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiQ29ublN0YXR1cyBpcyBub3QgY29ubmVjdGVkXG4iKSk7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTSE9XX0RSVklFUl9WRVJJT046CisgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiRHJpdmVyIHZlcnNpb24tJXMsICVzICVzXG4iLCBTVEFfRFJJVkVSX1ZFUlNJT04sIF9fREFURV9fLCBfX1RJTUVfXyApOworICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICAgICAgY2FzZSBTSE9XX0JBX0lORk86CisgICAgICAgICAgICBnZXRCYUluZm8ocEFkLCBleHRyYSk7CisgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQljYXNlIFNIT1dfREVTQ19JTkZPOgorCQkJeworCQkJCVNob3dfRGVzY0luZm9fUHJvYyhwQWQsIE5VTEwpOworCQkJCXdycS0+bGVuZ3RoID0gMDsgLy8gMTogc2l6ZSBvZiAnXDAnCisJCQl9CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBSQUlPX09GRjoKKyAgICAgICAgICAgIGlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJTY2FubmluZ1xuIik7CisgICAgICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWQtPlN0YUNmZy5iU3dSYWRpbyA9IEZBTFNFOworICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyAhPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLmJSYWRpbyA9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbyk7CisgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBGQUxTRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE1sbWVSYWRpb09mZihwQWQpOworICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KKwkJCQkJcEFkLT5FeHRyYUluZm8gPSBTV19SQURJT19PRkY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIlJhZGlvIE9mZlxuIik7CisgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJBSU9fT046CisgICAgICAgICAgICBpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiU2Nhbm5pbmdcbiIpOworICAgICAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlN3UmFkaW8gPSBUUlVFOworICAgICAgICAgICAgLy9pZiAocEFkLT5TdGFDZmcuYlJhZGlvICE9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlJhZGlvID0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKTsKKyAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBNbG1lUmFkaW9PbihwQWQpOworICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KKwkJCQkJcEFkLT5FeHRyYUluZm8gPSBFWFRSQV9JTkZPX0NMRUFSOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJSYWRpbyBPblxuIik7CisgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgIGJyZWFrOworCisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJY2FzZSBTSE9XX0RMU19FTlRSWV9JTkZPOgorCQkJeworCQkJCVNldF9EbHNFbnRyeUluZm9fRGlzcGxheV9Qcm9jKHBBZCwgTlVMTCk7CisJCQkJd3JxLT5sZW5ndGggPSAwOyAvLyAxOiBzaXplIG9mICdcMCcKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworCisJCWNhc2UgU0hPV19DRkdfVkFMVUU6CisJCQl7CisJCQkJU3RhdHVzID0gUlRNUFNob3dDZmdWYWx1ZShwQWQsIHdycS0+cG9pbnRlciwgZXh0cmEpOworCQkJCWlmIChTdGF0dXMgPT0gMCkKKwkJCQkJd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTSE9XX0FESE9DX0VOVFJZX0lORk86CisJCQlTaG93X0FkaG9jX01hY1RhYmxlX1Byb2MocEFkLCBleHRyYSk7CisJCQl3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKwkJCWJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgLSB1bmtub3cgc3ViY21kID0gJWRcbiIsIF9fZnVuY19fLCBzdWJjbWQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBTdGF0dXM7Cit9CisKKyNpZmRlZiBTSU9DU0lXTUxNRQoraW50IHJ0X2lvY3RsX3Npd21sbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAgIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisJc3RydWN0IGl3X21sbWUgKnBNbG1lID0gKHN0cnVjdCBpd19tbG1lICopd3JxdS0+ZGF0YS5wb2ludGVyOworCU1MTUVfUVVFVUVfRUxFTQkJCQlNc2dFbGVtOworCU1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVAlEaXNBc3NvY1JlcTsKKwlNTE1FX0RFQVVUSF9SRVFfU1RSVUNUICAgICAgRGVBdXRoUmVxOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gJXNcbiIsIF9fZnVuY19fKSk7CisKKwlpZiAocE1sbWUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2gocE1sbWUtPmNtZCkKKwl7CisjaWZkZWYgSVdfTUxNRV9ERUFVVEgKKwkJY2FzZSBJV19NTE1FX0RFQVVUSDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzIC0gSVdfTUxNRV9ERUFVVEhcbiIsIF9fZnVuY19fKSk7CisJCQlDT1BZX01BQ19BRERSKERlQXV0aFJlcS5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQlEZUF1dGhSZXEuUmVhc29uID0gcE1sbWUtPnJlYXNvbl9jb2RlOworCQkJTXNnRWxlbS5Nc2dMZW4gPSBzaXplb2YoTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCk7CisJCQlOZGlzTW92ZU1lbW9yeShNc2dFbGVtLk1zZywgJkRlQXV0aFJlcSwgc2l6ZW9mKE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QpKTsKKwkJCU1sbWVEZWF1dGhSZXFBY3Rpb24ocEFkLCAmTXNnRWxlbSk7CisJCQlpZiAoSU5GUkFfT04ocEFkKSkKKwkJCXsKKwkJCSAgICBMaW5rRG93bihwQWQsIEZBTFNFKTsKKwkJCSAgICBwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZiAvLyBJV19NTE1FX0RFQVVUSCAvLworI2lmZGVmIElXX01MTUVfRElTQVNTT0MKKwkJY2FzZSBJV19NTE1FX0RJU0FTU09DOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gJXMgLSBJV19NTE1FX0RJU0FTU09DXG4iLCBfX2Z1bmNfXykpOworCQkJQ09QWV9NQUNfQUREUihEaXNBc3NvY1JlcS5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQlEaXNBc3NvY1JlcS5SZWFzb24gPSAgcE1sbWUtPnJlYXNvbl9jb2RlOworCisJCQlNc2dFbGVtLk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOworCQkJTXNnRWxlbS5Nc2dUeXBlID0gTVQyX01MTUVfRElTQVNTT0NfUkVROworCQkJTXNnRWxlbS5Nc2dMZW4gPSBzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KE1zZ0VsZW0uTXNnLCAmRGlzQXNzb2NSZXEsIHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpKTsKKworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfRElTQVNTT0M7CisJCQlNbG1lRGlzYXNzb2NSZXFBY3Rpb24ocEFkLCAmTXNnRWxlbSk7CisJCQlicmVhazsKKyNlbmRpZiAvLyBJV19NTE1FX0RJU0FTU09DIC8vCisJCWRlZmF1bHQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlcyAtIFVua25vdyBDb21tYW5kXG4iLCBfX2Z1bmNfXykpOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gU0lPQ1NJV01MTUUgLy8KKworI2lmIFdJUkVMRVNTX0VYVCA+IDE3CitpbnQgcnRfaW9jdGxfc2l3YXV0aChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCXN0cnVjdCBpd19wYXJhbSAqcGFyYW0gPSAmd3JxdS0+cGFyYW07CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKwlzd2l0Y2ggKHBhcmFtLT5mbGFncyAmIElXX0FVVEhfSU5ERVgpIHsKKyAgICAJY2FzZSBJV19BVVRIX1dQQV9WRVJTSU9OOgorICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLOworCQkJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKQorCQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQTIpCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7CisKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1dQQV9WRVJTSU9OIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAJY2FzZSBJV19BVVRIX0NJUEhFUl9QQUlSV0lTRToKKyAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfTk9ORSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfV0VQNDAgfHwKKyAgICAgICAgICAgICAgICAgICAgIHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9XRVAxMDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBGQUxTRTsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfVEtJUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9DQ01QKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfQ0lQSEVSX1BBSVJXSVNFIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAJY2FzZSBJV19BVVRIX0NJUEhFUl9HUk9VUDoKKyAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfTk9ORSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1dFUDQwIHx8CisgICAgICAgICAgICAgICAgICAgICBwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfV0VQMTA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9US0lQKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX0NDTVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9DSVBIRVJfR1JPVVAgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIAljYXNlIElXX0FVVEhfS0VZX01HTVQ6CisgICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfS0VZX01HTVRfODAyXzFYKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEE7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxWCA9IEZBTFNFOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxWCA9IEZBTFNFOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICB9CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgLy8gV0VQIDF4CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gVFJVRTsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX0tFWV9NR01UIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAJY2FzZSBJV19BVVRIX1JYX1VORU5DUllQVEVEX0VBUE9MOgorICAgICAgICAgICAgYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9QUklWQUNZX0lOVk9LRUQ6CisgICAgICAgICAgICAvKmlmIChwYXJhbS0+dmFsdWUgPT0gMCkKKwkJCXsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgIAkgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgICAgIH0qLworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfUFJJVkFDWV9JTlZPS0VEIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7CisgICAgCQlicmVhazsKKyAgICAJY2FzZSBJV19BVVRIX0RST1BfVU5FTkNSWVBURUQ6CisgICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlICE9IDApCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKwkJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgICAvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKwkJCX0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1dQQV9WRVJTSU9OIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7CisgICAgCQlicmVhazsKKyAgICAJY2FzZSBJV19BVVRIXzgwMjExX0FVVEhfQUxHOgorCQkJaWYgKHBhcmFtLT52YWx1ZSAmIElXX0FVVEhfQUxHX1NIQVJFRF9LRVkpCisgICAgICAgICAgICB7CisJCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZDsKKwkJCX0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSAmIElXX0FVVEhfQUxHX09QRU5fU1lTVEVNKQorICAgICAgICAgICAgeworCQkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworCQkJfQorICAgICAgICAgICAgZWxzZQorCQkJCXJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfODAyMTFfQVVUSF9BTEcgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKKwkJCWJyZWFrOworICAgIAljYXNlIElXX0FVVEhfV1BBX0VOQUJMRUQ6CisgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9XUEFfRU5BQkxFRCAtIERyaXZlciBzdXBwb3J0cyBXUEEhKHBhcmFtLT52YWx1ZSA9ICVkKVxuIiwgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOworICAgIAkJYnJlYWs7CisgICAgCWRlZmF1bHQ6CisgICAgCQlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd2F1dGgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgICBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisJc3RydWN0IGl3X3BhcmFtICpwYXJhbSA9ICZ3cnF1LT5wYXJhbTsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisgICAgfQorCisJc3dpdGNoIChwYXJhbS0+ZmxhZ3MgJiBJV19BVVRIX0lOREVYKSB7CisJY2FzZSBJV19BVVRIX0RST1BfVU5FTkNSWVBURUQ6CisgICAgICAgIHBhcmFtLT52YWx1ZSA9IChwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpID8gMCA6IDE7CisJCWJyZWFrOworCisJY2FzZSBJV19BVVRIXzgwMjExX0FVVEhfQUxHOgorICAgICAgICBwYXJhbS0+dmFsdWUgPSAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpID8gSVdfQVVUSF9BTEdfU0hBUkVEX0tFWSA6IElXX0FVVEhfQUxHX09QRU5fU1lTVEVNOworCQlicmVhazsKKworCWNhc2UgSVdfQVVUSF9XUEFfRU5BQkxFRDoKKwkJcGFyYW0tPnZhbHVlID0gKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSA/IDEgOiAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnRfaW9jdGxfZ2l3YXV0aDo6cGFyYW0tPnZhbHVlID0gJWQhXG4iLCBwYXJhbS0+dmFsdWUpKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBmblNldENpcGhlcktleSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBJTlQgICAgICAgICAgICAga2V5SWR4LAorICAgIElOICBVQ0hBUiAgICAgICAgICAgQ2lwaGVyQWxnLAorICAgIElOICBCT09MRUFOICAgICAgICAgYkdUSywKKyAgICBJTiAgc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCkKK3sKKyAgICBOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKKyAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCBleHQtPmtleSwgTEVOX1RLSVBfRUspOworICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5UeE1pYywgZXh0LT5rZXkgKyBMRU5fVEtJUF9FSywgTEVOX1RLSVBfVFhNSUNLKTsKKyAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uUnhNaWMsIGV4dC0+a2V5ICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7CisgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworICAgIC8vIFVwZGF0ZSBncm91cCBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCisJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLAorCQkJCQkJICBCU1MwLAorCQkJCQkJICBrZXlJZHgsCisJCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcsCisJCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksCisJCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5UeE1pYywKKwkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLlJ4TWljKTsKKworICAgIGlmIChiR1RLKQorICAgICAgICAvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKyAgICAJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwKKyAgICAJCQkJCQkJICBCU1MwLAorICAgIAkJCQkJCQkgIGtleUlkeCwKKyAgICAJCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnLAorICAgIAkJCQkJCQkgIE5VTEwpOworICAgIGVsc2UKKyAgICAgICAgLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCisgICAgCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkYXB0ZXIsCisgICAgCQkJCQkJCSAgQlNTMCwKKyAgICAJCQkJCQkJICBrZXlJZHgsCisgICAgCQkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZywKKyAgICAJCQkJCQkJICAmcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdKTsKK30KKworaW50IHJ0X2lvY3RsX3Npd2VuY29kZWV4dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICBjaGFyICpleHRyYSkKKwkJCXsKKyAgICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCXN0cnVjdCBpd19wb2ludCAqZW5jb2RpbmcgPSAmd3JxdS0+ZW5jb2Rpbmc7CisJc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCA9IChzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqKWV4dHJhOworICAgIGludCBrZXlJZHgsIGFsZyA9IGV4dC0+YWxnOworCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKyAgICBpZiAoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKQorCXsKKyAgICAgICAga2V5SWR4ID0gKGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOworICAgICAgICAvLyBzZXQgQlNTSUQgd2NpZCBlbnRyeSBvZiB0aGUgUGFpci13aXNlIEtleSB0YWJsZSBhcyBuby1zZWN1cml0eSBtb2RlCisJICAgIEFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KHBBZGFwdGVyLCBCU1MwLCBCU1NJRF9XQ0lEKTsKKyAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IDA7CisJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLCAwLCAoVUNIQVIpa2V5SWR4KTsKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoJnBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OlJlbW92ZSBhbGwga2V5cyEoZW5jb2RpbmctPmZsYWdzID0gJXgpXG4iLCBfX2Z1bmNfXywgZW5jb2RpbmctPmZsYWdzKSk7CisgICAgfQorCQkJCQllbHNlCisgICAgeworICAgICAgICAvLyBHZXQgS2V5IEluZGV4IGFuZCBjb252ZXQgdG8gb3VyIG93biBkZWZpbmVkIGtleSBpbmRleAorICAgIAlrZXlJZHggPSAoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisgICAgCWlmKChrZXlJZHggPCAwKSB8fCAoa2V5SWR4ID49IE5SX1dFUF9LRVlTKSkKKyAgICAJCXJldHVybiAtRUlOVkFMOworCisgICAgICAgIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkKKyAgICAgICAgeworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSBrZXlJZHg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6RGVmYXVsdEtleUlkID0gJWRcbiIsIF9fZnVuY19fLCBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkpOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChhbGcpIHsKKyAgICAJCWNhc2UgSVdfRU5DT0RFX0FMR19OT05FOgorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19FTkNPREVfQUxHX05PTkVcbiIsIF9fZnVuY19fKSk7CisgICAgCQkJYnJlYWs7CisgICAgCQljYXNlIElXX0VOQ09ERV9BTEdfV0VQOgorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19FTkNPREVfQUxHX1dFUCAtIGV4dC0+a2V5X2xlbiA9ICVkLCBrZXlJZHggPSAlZFxuIiwgX19mdW5jX18sIGV4dC0+a2V5X2xlbiwga2V5SWR4KSk7CisgICAgCQkJaWYgKGV4dC0+a2V5X2xlbiA9PSBNQVhfV0VQX0tFWV9TSVpFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IE1BWF9XRVBfS0VZX1NJWkU7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCQkJCX0KKyAgICAgICAgCQllbHNlIGlmIChleHQtPmtleV9sZW4gPT0gTUlOX1dFUF9LRVlfU0laRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSBNSU5fV0VQX0tFWV9TSVpFOworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQkJfQorICAgICAgICAJCWVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCAgMTYpOworCQkJICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksIGV4dC0+a2V5LCBleHQtPmtleV9sZW4pOworICAgIAkJCWJyZWFrOworICAgICAgICAgICAgY2FzZSBJV19FTkNPREVfQUxHX1RLSVA6CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfVEtJUCAtIGtleUlkeCA9ICVkLCBleHQtPmtleV9sZW4gPSAlZFxuIiwgX19mdW5jX18sIGtleUlkeCwgZXh0LT5rZXlfbGVuKSk7CisgICAgICAgICAgICAgICAgaWYgKGV4dC0+a2V5X2xlbiA9PSAzMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm5TZXRDaXBoZXJLZXkocEFkYXB0ZXIsIGtleUlkeCwgQ0lQSEVSX1RLSVAsIEZBTFNFLCBleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfR1JPVVBfS0VZKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmblNldENpcGhlcktleShwQWRhcHRlciwga2V5SWR4LCBDSVBIRVJfVEtJUCwgVFJVRSwgZXh0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IDgwMi4xeCBwb3J0IGNvbnRyb2wKKyAgICAgICAgICAgIAkgICAgICAgIC8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworICAgICAgICAgICAgCSAgICAgICAgU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSVdfRU5DT0RFX0FMR19DQ01QOgorICAgICAgICAgICAgICAgIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkKKwkJeworICAgICAgICAgICAgICAgICAgICBmblNldENpcGhlcktleShwQWRhcHRlciwga2V5SWR4LCBDSVBIRVJfQUVTLCBGQUxTRSwgZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKKyAgICAgICAgICAgICAgICAgICAgCS8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworICAgICAgICAgICAgICAgICAgICAJU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9HUk9VUF9LRVkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmblNldENpcGhlcktleShwQWRhcHRlciwga2V5SWR4LCBDSVBIRVJfQUVTLCBUUlVFLCBleHQpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHNldCA4MDIuMXggcG9ydCBjb250cm9sCisgICAgICAgIAkgICAgICAgIC8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworICAgICAgICAJICAgICAgICBTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgCQlkZWZhdWx0OgorICAgIAkJCXJldHVybiAtRUlOVkFMOworCQl9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorcnRfaW9jdGxfZ2l3ZW5jb2RlZXh0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKwlQQ0hBUiBwS2V5ID0gTlVMTDsKKwlzdHJ1Y3QgaXdfcG9pbnQgKmVuY29kaW5nID0gJndycXUtPmVuY29kaW5nOworCXN0cnVjdCBpd19lbmNvZGVfZXh0ICpleHQgPSAoc3RydWN0IGl3X2VuY29kZV9leHQgKilleHRyYTsKKwlpbnQgaWR4LCBtYXhfa2V5X2xlbjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PT4gcnRfaW9jdGxfZ2l3ZW5jb2RlZXh0XG4iKSk7CisKKwltYXhfa2V5X2xlbiA9IGVuY29kaW5nLT5sZW5ndGggLSBzaXplb2YoKmV4dCk7CisJaWYgKG1heF9rZXlfbGVuIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZHggPSBlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVg7CisJaWYgKGlkeCkKKwl7CisJCWlmIChpZHggPCAxIHx8IGlkeCA+IDQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWR4LS07CisKKwkJaWYgKChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgfHwKKwkJCShwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpCisJCXsKKwkJCWlmIChpZHggIT0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkKQorCQkJeworCQkJCWV4dC0+a2V5X2xlbiA9IDA7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisJZWxzZQorCQlpZHggPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CisKKwllbmNvZGluZy0+ZmxhZ3MgPSBpZHggKyAxOworCW1lbXNldChleHQsIDAsIHNpemVvZigqZXh0KSk7CisKKwlleHQtPmtleV9sZW4gPSAwOworCXN3aXRjaChwQWQtPlN0YUNmZy5XZXBTdGF0dXMpIHsKKwkJY2FzZSBOZGlzODAyXzExV0VQRGlzYWJsZWQ6CisJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfTk9ORTsKKwkJCWVuY29kaW5nLT5mbGFncyB8PSBJV19FTkNPREVfRElTQUJMRUQ7CisJCQlicmVhazsKKwkJY2FzZSBOZGlzODAyXzExV0VQRW5hYmxlZDoKKwkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19XRVA7CisJCQlpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlMZW4gPiBtYXhfa2V5X2xlbikKKwkJCQlyZXR1cm4gLUUyQklHOworCQkJZWxzZQorCQkJeworCQkJCWV4dC0+a2V5X2xlbiA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5TGVuOworCQkJCXBLZXkgPSAmKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5WzBdKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ6CisJCWNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDoKKwkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfVEtJUDsKKwkJCWVsc2UKKwkJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfQ0NNUDsKKworCQkJaWYgKG1heF9rZXlfbGVuIDwgMzIpCisJCQkJcmV0dXJuIC1FMkJJRzsKKwkJCWVsc2UKKwkJCXsKKwkJCQlleHQtPmtleV9sZW4gPSAzMjsKKwkJCQlwS2V5ID0gJnBBZC0+U3RhQ2ZnLlBNS1swXTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGV4dC0+a2V5X2xlbiAmJiBwS2V5KQorCXsKKwkJZW5jb2RpbmctPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOworCQltZW1jcHkoZXh0LT5rZXksIHBLZXksIGV4dC0+a2V5X2xlbik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBTSU9DU0lXR0VOSUUKK2ludCBydF9pb2N0bF9zaXdnZW5pZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSICAgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKworCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA+IE1BWF9MRU5fT0ZfUlNOSUUgfHwKKwkgICAgKHdycXUtPmRhdGEubGVuZ3RoICYmIGV4dHJhID09IE5VTEwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh3cnF1LT5kYXRhLmxlbmd0aCkKKwl7CisJCXBBZC0+U3RhQ2ZnLlJTTklFX0xlbiA9IHdycXUtPmRhdGEubGVuZ3RoOworCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuUlNOX0lFWzBdLCBleHRyYSwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKKwl9CisJZWxzZQorCXsKKwkJcEFkLT5TdGFDZmcuUlNOSUVfTGVuID0gMDsKKwkJTmRpc1plcm9NZW1vcnkoJnBBZC0+U3RhQ2ZnLlJTTl9JRVswXSwgTUFYX0xFTl9PRl9SU05JRSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gU0lPQ1NJV0dFTklFIC8vCisKK2ludCBydF9pb2N0bF9naXdnZW5pZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAgIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisKKwlpZiAoKHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiA9PSAwKSB8fAorCQkocEFkLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpKQorCXsKKwkJd3JxdS0+ZGF0YS5sZW5ndGggPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKyNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorI2lmZGVmIFNJT0NTSVdHRU5JRQorCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFKQorCXsKKwlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pCisJCXJldHVybiAtRTJCSUc7CisKKwl3cnF1LT5kYXRhLmxlbmd0aCA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKKwltZW1jcHkoZXh0cmEsICZwQWQtPlN0YUNmZy5SU05fSUVbMF0sIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbik7CisJfQorCWVsc2UKKyNlbmRpZiAvLyBTSU9DU0lXR0VOSUUgLy8KKyNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCXsKKwkJVUNIQVIgUlNOSWUgPSBJRV9XUEE7CisKKwkJaWYgKHdycXUtPmRhdGEubGVuZ3RoIDwgKHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiArIDIpKSAvLyBJRCwgTGVuCisJCQlyZXR1cm4gLUUyQklHOworCQl3cnF1LT5kYXRhLmxlbmd0aCA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiArIDI7CisKKwkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSB8fAorICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpKQorCQkJUlNOSWUgPSBJRV9SU047CisKKwkJZXh0cmFbMF0gPSAoY2hhcilSU05JZTsKKwkJZXh0cmFbMV0gPSBwQWQtPlN0YUNmZy5SU05JRV9MZW47CisJCW1lbWNweShleHRyYSsyLCAmcEFkLT5TdGFDZmcuUlNOX0lFWzBdLCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3cG1rc2Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAgIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisJc3RydWN0IGl3X3Bta3NhICpwUG1rc2EgPSAoc3RydWN0IGl3X3Bta3NhICopd3JxdS0+ZGF0YS5wb2ludGVyOworCUlOVAlDYWNoZWRJZHggPSAwLCBpZHggPSAwOworCisJaWYgKHBQbWtzYSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PT4gcnRfaW9jdGxfc2l3cG1rc2FcbiIpKTsKKwlzd2l0Y2gocFBta3NhLT5jbWQpCisJeworCQljYXNlIElXX1BNS1NBX0ZMVVNIOgorCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuU2F2ZWRQTUssIHNpemVvZihCU1NJRF9JTkZPKSpQTUtJRF9OTyk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJydF9pb2N0bF9zaXdwbWtzYSAtIElXX1BNS1NBX0ZMVVNIXG4iKSk7CisJCQlicmVhazsKKwkJY2FzZSBJV19QTUtTQV9SRU1PVkU6CisJCQlmb3IgKENhY2hlZElkeCA9IDA7IENhY2hlZElkeCA8IHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtOyBDYWNoZWRJZHgrKykKKwkJCXsKKwkJICAgICAgICAvLyBjb21wYXJlIHRoZSBCU1NJRAorCQkgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocFBta3NhLT5ic3NpZC5zYV9kYXRhLCBwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELCBNQUNfQUREUl9MRU4pKQorCQkgICAgICAgIHsKKwkJICAgICAgICAJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRCwgTUFDX0FERFJfTEVOKTsKKwkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5QTUtJRCwgMTYpOworCQkJCQlmb3IgKGlkeCA9IENhY2hlZElkeDsgaWR4IDwgKHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtIC0gMSk7IGlkeCsrKQorCQkJCQl7CisJCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4XS5CU1NJRFswXSwgJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW2lkeCsxXS5CU1NJRFswXSwgTUFDX0FERFJfTEVOKTsKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHhdLlBNS0lEWzBdLCAmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4KzFdLlBNS0lEWzBdLCAxNik7CisJCQkJCX0KKwkJCQkJcEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW0tLTsKKwkJCSAgICAgICAgYnJlYWs7CisJCSAgICAgICAgfQorCSAgICAgICAgfQorCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJydF9pb2N0bF9zaXdwbWtzYSAtIElXX1BNS1NBX1JFTU9WRVxuIikpOworCQkJYnJlYWs7CisJCWNhc2UgSVdfUE1LU0FfQUREOgorCQkJZm9yIChDYWNoZWRJZHggPSAwOyBDYWNoZWRJZHggPCBwQWQtPlN0YUNmZy5TYXZlZFBNS051bTsgQ2FjaGVkSWR4KyspCisJCQl7CisJCSAgICAgICAgLy8gY29tcGFyZSB0aGUgQlNTSUQKKwkJICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBQbWtzYS0+YnNzaWQuc2FfZGF0YSwgcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRCwgTUFDX0FERFJfTEVOKSkKKwkJCSAgICAgICAgYnJlYWs7CisJICAgICAgICB9CisKKwkgICAgICAgIC8vIEZvdW5kLCByZXBsYWNlIGl0CisJICAgICAgICBpZiAoQ2FjaGVkSWR4IDwgUE1LSURfTk8pCisJICAgICAgICB7CisJCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlVwZGF0ZSBQTUtJRCwgaWR4ID0gJWRcbiIsIENhY2hlZElkeCkpOworCQkgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lEWzBdLCBwUG1rc2EtPmJzc2lkLnNhX2RhdGEsIE1BQ19BRERSX0xFTik7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uUE1LSURbMF0sIHBQbWtzYS0+cG1raWQsIDE2KTsKKwkJICAgICAgICBwQWQtPlN0YUNmZy5TYXZlZFBNS051bSsrOworCSAgICAgICAgfQorCSAgICAgICAgLy8gTm90IGZvdW5kLCByZXBsYWNlIHRoZSBsYXN0IG9uZQorCSAgICAgICAgZWxzZQorCSAgICAgICAgeworCQkgICAgICAgIC8vIFJhbmRvbWx5IHJlcGxhY2Ugb25lCisJCSAgICAgICAgQ2FjaGVkSWR4ID0gKHBQbWtzYS0+YnNzaWQuc2FfZGF0YVs1XSAlIFBNS0lEX05PKTsKKwkJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgiVXBkYXRlIFBNS0lELCBpZHggPSAlZFxuIiwgQ2FjaGVkSWR4KSk7CisJCSAgICAgICAgTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSURbMF0sIHBQbWtzYS0+YnNzaWQuc2FfZGF0YSwgTUFDX0FERFJfTEVOKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5QTUtJRFswXSwgcFBta3NhLT5wbWtpZCwgMTYpOworCSAgICAgICAgfQorCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJydF9pb2N0bF9zaXdwbWtzYSAtIElXX1BNS1NBX0FERFxuIikpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJydF9pb2N0bF9zaXdwbWtzYSAtIFVua25vdyBDb21tYW5kISFcbiIpKTsKKwkJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorI2VuZGlmIC8vICNpZiBXSVJFTEVTU19FWFQgPiAxNworCisjaWZkZWYgREJHCitzdGF0aWMgaW50CitydF9wcml2YXRlX2lvY3RsX2JicChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQlzdHJ1Y3QgaXdfcG9pbnQgKndycSwgY2hhciAqZXh0cmEpCisJCQl7CisJQ0hBUgkJCQkqdGhpc19jaGFyOworCUNIQVIJCQkJKnZhbHVlID0gTlVMTDsKKwlVQ0hBUgkJCQlyZWdCQlAgPSAwOworLy8JQ0hBUgkJCQlhcmdbMjU1XT17MH07CisJVUlOVDMyCQkJCWJicElkOworCVVJTlQzMgkJCQliYnBWYWx1ZTsKKwlCT09MRUFOCQkJCWJJc1ByaW50QWxsQkJQID0gRkFMU0U7CisJSU5UCQkJCQlTdGF0dXMgPSAwOworICAgIFBSVE1QX0FEQVBURVIgICAgICAgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCisKKwltZW1zZXQoZXh0cmEsIDB4MDAsIElXX1BSSVZfU0laRV9NQVNLKTsKKworCWlmICh3cnEtPmxlbmd0aCA+IDEpIC8vTm8gcGFyYW1ldGVycy4KKwkJCQl7CisJCXNwcmludGYoZXh0cmEsICJcbiIpOworCisJCS8vUGFyc2luZyBSZWFkIG9yIFdyaXRlCisJCXRoaXNfY2hhciA9IHdycS0+cG9pbnRlcjsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgidGhpc19jaGFyPSVzXG4iLCB0aGlzX2NoYXIpKTsKKwkJaWYgKCEqdGhpc19jaGFyKQorCQkJZ290byBuZXh0OworCisJCWlmICgodmFsdWUgPSBydHN0cmNocih0aGlzX2NoYXIsICc9JykpICE9IE5VTEwpCisJCQkqdmFsdWUrKyA9IDA7CisKKwkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKQorCQl7IC8vUmVhZAorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgidGhpc19jaGFyPSVzLCB2YWx1ZT0lc1xuIiwgdGhpc19jaGFyLCB2YWx1ZSkpOworCQkJaWYgKHNzY2FuZih0aGlzX2NoYXIsICIlZCIsICYoYmJwSWQpKSA9PSAxKQorCQkJeworCQkJCWlmIChiYnBJZCA8PSAxMzYpCisJCQkJeworI2lmZGVmIFJBTElOS19BVEUKKwkJCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQkJCXsKKwkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7CisJCQkJCX0KKwkJCQkJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwkJCQkJeworCQkJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKKwkJCQkJfQorCQkJCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSJTAyZFsweCUwMlhdOiUwMlhcbiIsIGJicElkLCBiYnBJZCoyLCByZWdCQlApOworICAgICAgICAgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgibXNnPSVzXG4iLCBleHRyYSkpOworCQkJCX0KKwkJCQllbHNlCisJCQkJey8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBiYnAKKwkJCQkJYklzUHJpbnRBbGxCQlAgPSBUUlVFOworCQkJCQlnb3RvIG5leHQ7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeyAvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgYmJwCisJCQkJYklzUHJpbnRBbGxCQlAgPSBUUlVFOworCQkJCWdvdG8gbmV4dDsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsgLy9Xcml0ZQorCQkJaWYgKChzc2NhbmYodGhpc19jaGFyLCAiJWQiLCAmKGJicElkKSkgPT0gMSkgJiYgKHNzY2FuZih2YWx1ZSwgIiV4IiwgJihiYnBWYWx1ZSkpID09IDEpKQorCQkJeworCQkJCWlmIChiYnBJZCA8PSAxMzYpCisJCQkJeworI2lmZGVmIFJBTElOS19BVEUKKwkJCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQkJCXsKKwkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsIGJicFZhbHVlKTsKKwkJCQkJCS8vUmVhZCBpdCBiYWNrIGZvciBzaG93aW5nCisJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsICZyZWdCQlApOworCQkJCQl9CisJCQkJCWVsc2UKKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJCQkJCXsKKwkJCQkJICAgIFJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCBiYnBWYWx1ZSk7CisgICAgCQkJCQkvL1JlYWQgaXQgYmFjayBmb3Igc2hvd2luZworICAgIAkJCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7CisJCQl9CisJCQkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlIlMDJkWzB4JTAyWF06JTAyWFxuIiwgYmJwSWQsIGJicElkKjIsIHJlZ0JCUCk7CisgICAgICAgICAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJtc2c9JXNcbiIsIGV4dHJhKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7Ly9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIGJicAorCQkJCQliSXNQcmludEFsbEJCUCA9IFRSVUU7CisJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7IC8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBiYnAKKwkJCQliSXNQcmludEFsbEJCUCA9IFRSVUU7CisJCQkJZ290byBuZXh0OworCQkJfQorCQl9CisJCX0KKwllbHNlCisJCWJJc1ByaW50QWxsQkJQID0gVFJVRTsKKworbmV4dDoKKwlpZiAoYklzUHJpbnRBbGxCQlApCisJeworCQltZW1zZXQoZXh0cmEsIDB4MDAsIElXX1BSSVZfU0laRV9NQVNLKTsKKwkJc3ByaW50ZihleHRyYSwgIlxuIik7CisJCWZvciAoYmJwSWQgPSAwOyBiYnBJZCA8PSAxMzY7IGJicElkKyspCisJCXsKKwkJICAgIGlmIChzdHJsZW4oZXh0cmEpID49IChJV19QUklWX1NJWkVfTUFTSyAtIDEwKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBSQUxJTktfQVRFCisJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsICZyZWdCQlApOworCQkJfQorCQkJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsICZyZWdCQlApOworCQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUiUwMmRbMHglMDJYXTolMDJYICAgICIsIGJicElkLCBiYnBJZCoyLCByZWdCQlApOworCQkJaWYgKGJicElkJTUgPT0gNCkKKwkJCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJcbiIpOworCQl9CisKKyAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIndycS0+bGVuZ3RoID0gJWRcbiIsIHdycS0+bGVuZ3RoKSk7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09cnRfcHJpdmF0ZV9pb2N0bF9iYnBcblxuIikpOworCisgICAgcmV0dXJuIFN0YXR1czsKK30KKyNlbmRpZiAvLyBEQkcgLy8KKworaW50IHJ0X2lvY3RsX3Npd3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKyAgICBQUlRNUF9BREFQVEVSICAgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKyAgICBVSU5UMzIgICAgICAgICAgcmF0ZSA9IHdycXUtPmJpdHJhdGUudmFsdWUsIGZpeGVkID0gd3JxdS0+Yml0cmF0ZS5maXhlZDsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnRfaW9jdGxfc2l3cmF0ZTo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInJ0X2lvY3RsX3Npd3JhdGU6OihyYXRlID0gJWQsIGZpeGVkID0gJWQpXG4iLCByYXRlLCBmaXhlZCkpOworICAgIC8qIHJhdGUgPSAtMSA9PiBhdXRvIHJhdGUKKyAgICAgICByYXRlID0gWCwgZml4ZWQgPSAxID0+IChmaXhlZCByYXRlIFgpCisgICAgKi8KKyAgICBpZiAocmF0ZSA9PSAtMSkKKyAgICB7CisJCS8vQXV0byBSYXRlCisJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTX0FVVE87CisJCXBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gVFJVRTsKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlIDw9IFBIWV8xMUcpIHx8CisJCSAgICAocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pKQorCQkJUlRNUFNldERlc2lyZWRSYXRlcyhwQWQsIC0xKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQlTZXRDb21tb25IVChwQWQpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoZml4ZWQpCisgICAgICAgIHsKKyAgICAgICAgCXBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gRkFMU0U7CisgICAgICAgICAgICBpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPD0gUEhZXzExRykgfHwKKyAgICAgICAgICAgICAgICAocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pKQorICAgICAgICAgICAgICAgIFJUTVBTZXREZXNpcmVkUmF0ZXMocEFkLCByYXRlKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU19BVVRPOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgICAgICAgICAgICAgIFNldENvbW1vbkhUKHBBZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydF9pb2N0bF9zaXdyYXRlOjooSHRNY3M9JWQpXG4iLHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUT0RPOiByYXRlID0gWCwgZml4ZWQgPSAwID0+IChyYXRlcyA8PSBYKQorICAgICAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdyYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKyAgICBQUlRNUF9BREFQVEVSICAgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKyAgICBpbnQgcmF0ZV9pbmRleCA9IDAsIHJhdGVfY291bnQgPSAwOworICAgIEhUVFJBTlNNSVRfU0VUVElORyBodF9zZXR0aW5nOworICAgIF9fczMyIHJhbGlua3JhdGVbXSA9CisJezIsICA0LCAgIDExLCAgMjIsIC8vIENDSworCTEyLCAxOCwgICAyNCwgIDM2LCA0OCwgNzIsIDk2LCAxMDgsIC8vIE9GRE0KKwkxMywgMjYsICAgMzksICA1MiwgIDc4LCAxMDQsIDExNywgMTMwLCAyNiwgIDUyLCAgNzgsIDEwNCwgMTU2LCAyMDgsIDIzNCwgMjYwLCAvLyAyME1IeiwgODAwbnMgR0ksIE1DUzogMCB+IDE1CisJMzksIDc4LCAgMTE3LCAxNTYsIDIzNCwgMzEyLCAzNTEsIDM5MCwJCQkJCQkJCQkJICAvLyAyME1IeiwgODAwbnMgR0ksIE1DUzogMTYgfiAyMworCTI3LCA1NCwgICA4MSwgMTA4LCAxNjIsIDIxNiwgMjQzLCAyNzAsIDU0LCAxMDgsIDE2MiwgMjE2LCAzMjQsIDQzMiwgNDg2LCA1NDAsIC8vIDQwTUh6LCA4MDBucyBHSSwgTUNTOiAwIH4gMTUKKwk4MSwgMTYyLCAyNDMsIDMyNCwgNDg2LCA2NDgsIDcyOSwgODEwLAkJCQkJCQkJCQkgIC8vIDQwTUh6LCA4MDBucyBHSSwgTUNTOiAxNiB+IDIzCisJMTQsIDI5LCAgIDQzLCAgNTcsICA4NywgMTE1LCAxMzAsIDE0NCwgMjksIDU5LCAgIDg3LCAxMTUsIDE3MywgMjMwLCAyNjAsIDI4OCwgLy8gMjBNSHosIDQwMG5zIEdJLCBNQ1M6IDAgfiAxNQorCTQzLCA4NywgIDEzMCwgMTczLCAyNjAsIDMxNywgMzkwLCA0MzMsCQkJCQkJCQkJCSAgLy8gMjBNSHosIDQwMG5zIEdJLCBNQ1M6IDE2IH4gMjMKKwkzMCwgNjAsICAgOTAsIDEyMCwgMTgwLCAyNDAsIDI3MCwgMzAwLCA2MCwgMTIwLCAxODAsIDI0MCwgMzYwLCA0ODAsIDU0MCwgNjAwLCAvLyA0ME1IeiwgNDAwbnMgR0ksIE1DUzogMCB+IDE1CisJOTAsIDE4MCwgMjcwLCAzNjAsIDU0MCwgNzIwLCA4MTAsIDkwMH07CQkJCQkJCQkJCSAgLy8gNDBNSHosIDQwMG5zIEdJLCBNQ1M6IDE2IH4gMjMKKworICAgIHJhdGVfY291bnQgPSBzaXplb2YocmFsaW5rcmF0ZSkvc2l6ZW9mKF9fczMyKTsKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKyAgICBpZiAoKHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID09IEZBTFNFKSAmJgorICAgICAgICAoSU5GUkFfT04ocEFkKSkgJiYKKyAgICAgICAgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlIDw9IFBIWV8xMUcpIHx8IChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFIDw9IE1PREVfT0ZETSkpKQorICAgICAgICBodF9zZXR0aW5nLndvcmQgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUud29yZDsKKyAgICBlbHNlCisgICAgICAgIGh0X3NldHRpbmcud29yZCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQ7CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICBpZiAoaHRfc2V0dGluZy5maWVsZC5NT0RFID49IE1PREVfSFRNSVgpCisgICAgeworLy8gICAgCXJhdGVfaW5kZXggPSAxMiArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5CVyAqMTYpICsgKChVQ0hBUilodF9zZXR0aW5nLmZpZWxkLlNob3J0R0kgKjMyKSArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5NQ1MpOworICAgIAlyYXRlX2luZGV4ID0gMTIgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuQlcgKjI0KSArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5TaG9ydEdJICo0OCkgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuTUNTKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworICAgIGlmIChodF9zZXR0aW5nLmZpZWxkLk1PREUgPT0gTU9ERV9PRkRNKQorICAgIAlyYXRlX2luZGV4ID0gKFVDSEFSKShodF9zZXR0aW5nLmZpZWxkLk1DUykgKyA0OworICAgIGVsc2UgaWYgKGh0X3NldHRpbmcuZmllbGQuTU9ERSA9PSBNT0RFX0NDSykKKyAgICAJcmF0ZV9pbmRleCA9IChVQ0hBUikoaHRfc2V0dGluZy5maWVsZC5NQ1MpOworCisgICAgaWYgKHJhdGVfaW5kZXggPCAwKQorICAgICAgICByYXRlX2luZGV4ID0gMDsKKworICAgIGlmIChyYXRlX2luZGV4ID4gcmF0ZV9jb3VudCkKKyAgICAgICAgcmF0ZV9pbmRleCA9IHJhdGVfY291bnQ7CisKKyAgICB3cnF1LT5iaXRyYXRlLnZhbHVlID0gcmFsaW5rcmF0ZVtyYXRlX2luZGV4XSAqIDUwMDAwMDsKKyAgICB3cnF1LT5iaXRyYXRlLmRpc2FibGVkID0gMDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlciBydF9oYW5kbGVyW10gPQoreworCShpd19oYW5kbGVyKSBOVUxMLAkJCSAgICAgICAgICAgIC8qIFNJT0NTSVdDT01NSVQgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3bmFtZSwJCQkvKiBTSU9DR0lXTkFNRSAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJICAgICAgICAgICAgLyogU0lPQ1NJV05XSUQgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCSAgICAgICAgICAgIC8qIFNJT0NHSVdOV0lEICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZnJlcSwJCSAgICAvKiBTSU9DU0lXRlJFUSAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2ZyZXEsCQkgICAgLyogU0lPQ0dJV0ZSRVEgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdtb2RlLAkJICAgIC8qIFNJT0NTSVdNT0RFICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3bW9kZSwJCSAgICAvKiBTSU9DR0lXTU9ERSAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1NFTlMgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdTRU5TICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCAvKiBub3QgdXNlZCAqLywJCS8qIFNJT0NTSVdSQU5HRSAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3cmFuZ2UsCQkgICAgLyogU0lPQ0dJV1JBTkdFICAqLworCShpd19oYW5kbGVyKSBOVUxMIC8qIG5vdCB1c2VkICovLAkJLyogU0lPQ1NJV1BSSVYgICAqLworCShpd19oYW5kbGVyKSBOVUxMIC8qIGtlcm5lbCBjb2RlICovLCAgICAvKiBTSU9DR0lXUFJJViAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwgLyogbm90IHVzZWQgKi8sCQkvKiBTSU9DU0lXU1RBVFMgICovCisJKGl3X2hhbmRsZXIpIHJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMgLyoga2VybmVsIGNvZGUgKi8sICAgIC8qIFNJT0NHSVdTVEFUUyAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DU0lXU1BZICAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1NQWSAgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIFNJT0NTSVdUSFJTUFkgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiBTSU9DR0lXVEhSU1BZICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2FwLCAgICAgICAgICAgIC8qIFNJT0NTSVdBUCAgICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3YXAsCQkgICAgLyogU0lPQ0dJV0FQICAgICAqLworI2lmZGVmIFNJT0NTSVdNTE1FCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd21sbWUsCSAgICAgICAgLyogU0lPQ1NJV01MTUUgICAqLworI2Vsc2UKKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiBTSU9DU0lXTUxNRSAqLworI2VuZGlmIC8vIFNJT0NTSVdNTE1FIC8vCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2l3YXBsaXN0LAkJICAgIC8qIFNJT0NHSVdBUExJU1QgKi8KKyNpZmRlZiBTSU9DR0lXU0NBTgorCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdzY2FuLAkJICAgIC8qIFNJT0NTSVdTQ0FOICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3c2NhbiwJCSAgICAvKiBTSU9DR0lXU0NBTiAgICovCisjZWxzZQorCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIFNJT0NTSVdTQ0FOICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiBTSU9DR0lXU0NBTiAgICovCisjZW5kaWYgLyogU0lPQ0dJV1NDQU4gKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZXNzaWQsCQkgICAgLyogU0lPQ1NJV0VTU0lEICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdlc3NpZCwJCSAgICAvKiBTSU9DR0lXRVNTSUQgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd25pY2tuLAkJICAgIC8qIFNJT0NTSVdOSUNLTiAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3bmlja24sCQkgICAgLyogU0lPQ0dJV05JQ0tOICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIC0tIGhvbGUgLS0gICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiAtLSBob2xlIC0tICAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd3JhdGUsICAgICAgICAgIC8qIFNJT0NTSVdSQVRFICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3cmF0ZSwgICAgICAgICAgLyogU0lPQ0dJV1JBVEUgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdydHMsCQkgICAgLyogU0lPQ1NJV1JUUyAgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdydHMsCQkgICAgLyogU0lPQ0dJV1JUUyAgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdmcmFnLAkJICAgIC8qIFNJT0NTSVdGUkFHICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZnJhZywJCSAgICAvKiBTSU9DR0lXRlJBRyAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1RYUE9XICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdUWFBPVyAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DU0lXUkVUUlkgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1JFVFJZICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdlbmNvZGUsCQkvKiBTSU9DU0lXRU5DT0RFICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2VuY29kZSwJCS8qIFNJT0NHSVdFTkNPREUgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DU0lXUE9XRVIgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1BPV0VSICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkJCS8qIC0tIGhvbGUgLS0gKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkJCQkvKiAtLSBob2xlIC0tICovCisjaWYgV0lSRUxFU1NfRVhUID4gMTcKKyAgICAoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3Z2VuaWUsICAgICAgICAgLyogU0lPQ1NJV0dFTklFICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdnZW5pZSwgICAgICAgICAvKiBTSU9DR0lXR0VOSUUgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2F1dGgsCQkgICAgLyogU0lPQ1NJV0FVVEggICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdhdXRoLAkJICAgIC8qIFNJT0NHSVdBVVRIICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZW5jb2RlZXh0LAkgICAgLyogU0lPQ1NJV0VOQ09ERUVYVCAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdlbmNvZGVleHQsCQkvKiBTSU9DR0lXRU5DT0RFRVhUICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd3Bta3NhLCAgICAgICAgIC8qIFNJT0NTSVdQTUtTQSAgKi8KKyNlbmRpZgorfTsKKworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIgcnRfcHJpdl9oYW5kbGVyc1tdID0geworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDAxICovCisjaWZuZGVmIENPTkZJR19BUF9TVVBQT1JUCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3NldHBhcmFtLCAvKiArIDB4MDIgKi8KKyNlbHNlCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwMiAqLworI2VuZGlmIC8vIENPTkZJR19BUF9TVVBQT1JUIC8vCisjaWZkZWYgREJHCisJKGl3X2hhbmRsZXIpIHJ0X3ByaXZhdGVfaW9jdGxfYmJwLCAvKiArIDB4MDMgKi8KKyNlbHNlCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwMyAqLworI2VuZGlmCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwNCAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDUgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDA2ICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwNyAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDggKi8KKwkoaXdfaGFuZGxlcikgcnRfcHJpdmF0ZV9nZXRfc3RhdGlzdGljcywgLyogKyAweDA5ICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwQSAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEIgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBDICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwRCAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEUgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBGICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxMCAqLworCShpd19oYW5kbGVyKSBydF9wcml2YXRlX3Nob3csIC8qICsgMHgxMSAqLworICAgIChpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTIgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDEzICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxNSAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTcgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDE4ICovCit9OworCitjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgcnQyOHh4X2l3X2hhbmRsZXJfZGVmID0KK3sKKyNkZWZpbmUJTihhKQkoc2l6ZW9mIChhKSAvIHNpemVvZiAoYVswXSkpCisJLnN0YW5kYXJkCT0gKGl3X2hhbmRsZXIgKikgcnRfaGFuZGxlciwKKwkubnVtX3N0YW5kYXJkCT0gc2l6ZW9mKHJ0X2hhbmRsZXIpIC8gc2l6ZW9mKGl3X2hhbmRsZXIpLAorCS5wcml2YXRlCT0gKGl3X2hhbmRsZXIgKikgcnRfcHJpdl9oYW5kbGVycywKKwkubnVtX3ByaXZhdGUJCT0gTihydF9wcml2X2hhbmRsZXJzKSwKKwkucHJpdmF0ZV9hcmdzCT0gKHN0cnVjdCBpd19wcml2X2FyZ3MgKikgcHJpdnRhYiwKKwkubnVtX3ByaXZhdGVfYXJncwk9IE4ocHJpdnRhYiksCisjaWYgSVdfSEFORExFUl9WRVJTSU9OID49IDcKKyAgICAuZ2V0X3dpcmVsZXNzX3N0YXRzID0gcnQyOHh4X2dldF93aXJlbGVzc19zdGF0cywKKyNlbmRpZgorfTsKKworSU5UIFJUTVBTZXRJbmZvcm1hdGlvbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiBwQWRhcHRlciwKKyAgICBJTiAgT1VUIHN0cnVjdCBpZnJlcSAgICAqcnEsCisgICAgSU4gIElOVCAgICAgICAgICAgICAgICAgY21kKQoreworICAgIHN0cnVjdCBpd3JlcSAgICAgICAgICAgICAgICAgICAgICAgICp3cnEgPSAoc3RydWN0IGl3cmVxICopIHJxOworICAgIE5ESVNfODAyXzExX1NTSUQgICAgICAgICAgICAgICAgICAgIFNzaWQ7CisgICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgICAgICAgICAgICAgQnNzaWQ7CisgICAgUlRfODAyXzExX1BIWV9NT0RFICAgICAgICAgICAgICAgICAgUGh5TW9kZTsKKyAgICBSVF84MDJfMTFfU1RBX0NPTkZJRyAgICAgICAgICAgICAgICBTdGFDb25maWc7CisgICAgTkRJU184MDJfMTFfUkFURVMgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXM7CisgICAgUlRfODAyXzExX1BSRUFNQkxFICAgICAgICAgICAgICAgICAgUHJlYW1ibGU7CisgICAgTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgV2VwU3RhdHVzOworICAgIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgICAgIEF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlTWF4OworICAgIE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgIEJzc1R5cGU7CisgICAgTkRJU184MDJfMTFfUlRTX1RIUkVTSE9MRCAgICAgICAgICAgUnRzVGhyZXNoOworICAgIE5ESVNfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEIEZyYWdUaHJlc2g7CisgICAgTkRJU184MDJfMTFfUE9XRVJfTU9ERSAgICAgICAgICAgICAgUG93ZXJNb2RlOworICAgIFBORElTXzgwMl8xMV9LRVkgICAgICAgICAgICAgICAgICAgIHBLZXkgPSBOVUxMOworICAgIFBORElTXzgwMl8xMV9XRVAJCQkgICAgICAgIHBXZXBLZXkgPU5VTEw7CisgICAgUE5ESVNfODAyXzExX1JFTU9WRV9LRVkgICAgICAgICAgICAgcFJlbW92ZUtleSA9IE5VTEw7CisgICAgTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiAgICAgICAgICAgQ29uZmlnLCAqcENvbmZpZyA9IE5VTEw7CisgICAgTkRJU184MDJfMTFfTkVUV09SS19UWVBFICAgICAgICAgICAgTmV0VHlwZTsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3c7CisgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5SWR4ID0gMDsKKyAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTLCBNYXhQaHlNb2RlID0gUEhZXzExRzsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3dlclRlbXA7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFkaW9TdGF0ZTsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZU1hY2hpbmVUb3VjaGVkID0gRkFMU0U7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJT0lEX1NFVF9IVF9QSFlNT0RFCQkJCQlIVF9QaHlNb2RlOwkvLzExbiAsa2F0aHkKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgUE5ESVNfODAyXzExX1BNS0lEICAgICAgICAgICAgICAgICAgcFBta0lkID0gTlVMTDsKKyAgICBCT09MRUFOCQkJCSAgICAgICAgICAgICAgICBJRUVFODAyMXhTdGF0ZSA9IEZBTFNFOworICAgIEJPT0xFQU4JCQkJICAgICAgICAgICAgICAgIElFRUU4MDIxeF9yZXF1aXJlZF9rZXlzID0gRkFMU0U7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3BhX3N1cHBsaWNhbnRfZW5hYmxlID0gMDsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBTTk1QX1NVUFBPUlQKKwlUWF9SVFlfQ0ZHX1NUUlVDCQkJdHhfcnR5X2NmZzsKKwlVTE9ORwkJCQkJCVNob3J0UmV0cnlMaW1pdCwgTG9uZ1JldHJ5TGltaXQ7CisJVUNIQVIJCQkJCQljdG1wOworI2VuZGlmIC8vIFNOTVBfU1VQUE9SVCAvLworCisKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCU1heFBoeU1vZGUgPSBQSFlfMTFOXzVHOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT5SVE1QU2V0SW5mb3JtYXRpb24oKSwJMHglMDh4XG4iLCBjbWQmMHg3RkZGKSk7CisgICAgc3dpdGNoKGNtZCAmIDB4N0ZGRikgeworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfQ09VTlRSWV9SRUdJT046CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoIDwgc2l6ZW9mKFVDSEFSKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOworCQkJLy8gT25seSBhdmFsaWFibGUgd2hlbiBFRVBST00gbm90IHByb2dyYW1taW5nCisgICAgICAgICAgICBlbHNlIGlmICghKHBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiAmIDB4ODApICYmICEocEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQgJiAweDgwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBVTE9ORyAgIENvdW50cnk7CisgICAgICAgICAgICAgICAgVUNIQVIJVG1wUGh5OworCisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkNvdW50cnksIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uID0gKFVDSEFSKShDb3VudHJ5ICYgMHgwMDAwMDBGRik7CisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQgPSAoVUNIQVIpKChDb3VudHJ5ID4+IDgpICYgMHgwMDAwMDBGRik7CisgICAgICAgICAgICAgICAgVG1wUGh5ID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9IDB4ZmY7CisJCQkJLy8gQnVpbGQgYWxsIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCBpbmZvcm1hdGlvbgorCQkJCVJUTVBTZXRQaHlNb2RlKHBBZGFwdGVyLCBUbXBQaHkpOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCVNldENvbW1vbkhUKHBBZGFwdGVyKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfQ09VTlRSWV9SRUdJT04gKEE6JWQgIEIvRzolZClcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kLAorCQkJCSAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOOgorICNpZmRlZiBSQUxJTktfQVRFCisJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUaGUgZHJpdmVyIGlzIGluIEFURSBtb2RlIG5vd1xuIikpOworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKyAgICAgICAgICAgIE5vdyA9IGppZmZpZXM7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOLCBUeENudCA9ICVkIFxuIiwgcEFkYXB0ZXItPlJhbGlua0NvdW50ZXJzLkxhc3RPbmVTZWNUb3RhbFR4Q291bnQpKTsKKworICAgICAgICAgICAgaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBEcml2ZXIgaXMgaW4gTW9uaXRvciBNb2RlIG5vdyAhISFcbiIpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworCQkJLy9CZW5zb24gYWRkIDIwMDgwNTI3LCB3aGVuIHJhZGlvIG9mZiwgc3RhIGRvbid0IG5lZWQgdG8gc2NhbgorCQkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpCisJCQkJYnJlYWs7CisKKwkJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisJCQl7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIERyaXZlciBpcyBzY2FubmluZyBub3cgISEhXG4iKSk7CisJCQkJcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gVFJVRTsKKwkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisJCQlpZiAocEFkYXB0ZXItPlJhbGlua0NvdW50ZXJzLkxhc3RPbmVTZWNUb3RhbFR4Q291bnQgPiAxMDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExpbmsgVVAsIGlnbm9yZSB0aGlzIHNldDo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU5cbiIpKTsKKwkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQkJCXBBZGFwdGVyLT5TdGFDZmcuU2NhbkNudCA9IDk5OwkJLy8gUHJldmVudCBhdXRvIHNjYW4gdHJpZ2dlcmVkIGJ5IHRoaXMgT0lECisJCQkJYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpICYmCisJCQkJKChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwKKwkJCQkocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8CisJCQkJKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwKKwkJCQkocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkgJiYKKyAgICAgICAgICAgICAgICAocEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMaW5rIFVQLCBQb3J0IE5vdCBTZWN1cmVkISBpZ25vcmUgdGhpcyBzZXQ6Ok9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOXG4iKSk7CisJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLlNjYW5DbnQgPSA5OTsJCS8vIFByZXZlbnQgYXV0byBzY2FuIHRyaWdnZXJlZCBieSB0aGlzIE9JRAorCQkJCWJyZWFrOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FIGJ1c3ksIHJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gdGVsbCBDTlRMIHN0YXRlIG1hY2hpbmUgdG8gY2FsbCBOZGlzTVNldEluZm9ybWF0aW9uQ29tcGxldGUoKSBhZnRlciBjb21wbGV0aW5nCisgICAgICAgICAgICAvLyB0aGlzIHJlcXVlc3QsIGJlY2F1c2UgdGhpcyByZXF1ZXN0IGlzIGluaXRpYXRlZCBieSBORElTLgorICAgICAgICAgICAgcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBGQUxTRTsKKyAgICAgICAgICAgIC8vIFJlc2V0IGFsbG93ZWQgc2NhbiByZXRyaWVzCisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlNjYW5DbnQgPSAwOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5MYXN0U2NhblRpbWUgPSBOb3c7CisKKwkJCXBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IFRSVUU7CisgICAgICAgICAgICBSVE1QX1NFVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKTsKKyAgICAgICAgICAgIE1sbWVFbnF1ZXVlKHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICBPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgICAgICAgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgICAgIFN0YXRlTWFjaGluZVRvdWNoZWQgPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9TU0lEOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfU1NJRCkpCisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlQQ0hBUiBwU3NpZFN0cmluZyA9IE5VTEw7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlNzaWQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfU1NJRCAoTGVuPSVkLFNzaWQ9JXMpXG4iLCBTc2lkLlNzaWRMZW5ndGgsIFNzaWQuU3NpZCkpOworICAgICAgICAgICAgICAgIGlmIChTc2lkLlNzaWRMZW5ndGggPiBNQVhfTEVOX09GX1NTSUQpCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAJaWYgKFNzaWQuU3NpZExlbmd0aCA9PSAwKQorICAgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgICAgCQlTZXRfU1NJRF9Qcm9jKHBBZGFwdGVyLCAiIik7CisgICAgICAgICAgICAgICAgCX0KKwkJCQkJZWxzZQorICAgICAgICAgICAgICAgIAl7CisJICAgICAgICAgICAgICAgIAlwU3NpZFN0cmluZyA9IChDSEFSICopIGttYWxsb2MoTUFYX0xFTl9PRl9TU0lEKzEsIE1FTV9BTExPQ19GTEFHKTsKKwkJCQkJCWlmIChwU3NpZFN0cmluZykKKwkJCQkJCXsKKwkJCQkJCQlOZGlzWmVyb01lbW9yeShwU3NpZFN0cmluZywgTUFYX0xFTl9PRl9TU0lEKzEpOworCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBTc2lkU3RyaW5nLCBTc2lkLlNzaWQsIFNzaWQuU3NpZExlbmd0aCk7CisJICAgICAgICAgICAgICAgIAkJU2V0X1NTSURfUHJvYyhwQWRhcHRlciwgcFNzaWRTdHJpbmcpOworCQkJCQkJCWtmcmVlKHBTc2lkU3RyaW5nKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCQlTdGF0dXMgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9CU1NJRDoKKyNpZmRlZiBSQUxJTktfQVRFCisJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUaGUgZHJpdmVyIGlzIGluIEFURSBtb2RlIG5vd1xuIikpOworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX01BQ19BRERSRVNTKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmQnNzaWQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKyAgICAgICAgICAgICAgICAvLyB0ZWxsIENOVEwgc3RhdGUgbWFjaGluZSB0byBjYWxsIE5kaXNNU2V0SW5mb3JtYXRpb25Db21wbGV0ZSgpIGFmdGVyIGNvbXBsZXRpbmcKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHJlcXVlc3QsIGJlY2F1c2UgdGhpcyByZXF1ZXN0IGlzIGluaXRpYXRlZCBieSBORElTLgorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gRkFMU0U7CisKKwkJCQkvLyBQcmV2ZW50IHRvIGNvbm5lY3QgQVAgYWdhaW4gaW4gU1RBTWxtZVBlcmlvZGljRXhlYworCQkJCXBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuPSAzMjsKKworICAgICAgICAgICAgICAgIC8vIFJlc2V0IGFsbG93ZWQgc2NhbiByZXRyaWVzCisJCQkJcEFkYXB0ZXItPlN0YUNmZy5TY2FuQ250ID0gMDsKKworICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FIGJ1c3ksIHJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTWxtZUVucXVldWUocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0lEXzgwMl8xMV9CU1NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTkRJU184MDJfMTFfTUFDX0FERFJFU1MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChWT0lEICopJkJzc2lkKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgICAgICAgIFN0YXRlTWFjaGluZVRvdWNoZWQgPSBUUlVFOworCisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0JTU0lEICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJzc2lkWzBdLCBCc3NpZFsxXSwgQnNzaWRbMl0sIEJzc2lkWzNdLCBCc3NpZFs0XSwgQnNzaWRbNV0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUkFESU86CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihCT09MRUFOKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUmFkaW9TdGF0ZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfUkFESU8gKD0lZClcbiIsIFJhZGlvU3RhdGUpKTsKKyAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iU3dSYWRpbyAhPSBSYWRpb1N0YXRlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iU3dSYWRpbyA9IFJhZGlvU3RhdGU7CisgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJSYWRpbyAhPSAocEFkYXB0ZXItPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWRhcHRlci0+U3RhQ2ZnLmJTd1JhZGlvKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iUmFkaW8gPSAocEFkYXB0ZXItPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWRhcHRlci0+U3RhQ2ZnLmJTd1JhZGlvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJSYWRpbyA9PSBUUlVFKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1sbWVSYWRpb09uKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KKwkJCQkJCQlwQWRhcHRlci0+RXh0cmFJbmZvID0gRVhUUkFfSU5GT19DTEVBUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNbG1lUmFkaW9PZmYocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbgorCQkJCQkJCXBBZGFwdGVyLT5FeHRyYUluZm8gPSBTV19SQURJT19PRkY7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1BIWV9NT0RFOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoUlRfODAyXzExX1BIWV9NT0RFKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUGh5TW9kZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlpZiAoUGh5TW9kZSA8PSBNYXhQaHlNb2RlKQorCQkJCXsKKyAgICAgICAgICAgICAgICAJUlRNUFNldFBoeU1vZGUocEFkYXB0ZXIsIFBoeU1vZGUpOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCQlTZXRDb21tb25IVChwQWRhcHRlcik7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCQkJfQorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9QSFlfTU9ERSAoPSVkKVxuIiwgUGh5TW9kZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoUlRfODAyXzExX1NUQV9DT05GSUcpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZTdGFDb25maWcsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCA9IFN0YUNvbmZpZy5FbmFibGVUeEJ1cnN0OworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gU3RhQ29uZmlnLlVzZUJHUHJvdGVjdGlvbjsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lID0gMTsgLy8gMjAwMy0xMC0zMCBhbHdheXMgU0hPUlQgU0xPVCBjYXBhYmxlCisgICAgICAgICAgICAgICAgaWYgKChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgIT0gU3RhQ29uZmlnLkFkaG9jTW9kZSkgJiYKKwkJCQkJKFN0YUNvbmZpZy5BZGhvY01vZGUgPD0gTWF4UGh5TW9kZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBkeW5hbWljIGNoYW5nZSBvZiAiVVNFIE9GRE0gcmF0ZSBvciBub3QiIGluIEFESE9DIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgc2V0dGluZyBjaGFuZ2VkLCBuZWVkIHRvIHJlc2V0IGN1cnJlbnQgVFggcmF0ZSBhcyB3ZWxsIGFzIEJFQUNPTiBmcmFtZSBmb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCisgICAgICAgICAgICAgICAgICAgIHsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9IFN0YUNvbmZpZy5BZGhvY01vZGU7CisgICAgICAgICAgICAgICAgICAgIAlSVE1QU2V0UGh5TW9kZShwQWRhcHRlciwgUGh5TW9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBNbG1lVXBkYXRlVHhSYXRlcyhwQWRhcHRlciwgRkFMU0UsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgTWFrZUlic3NCZWFjb24ocEFkYXB0ZXIpOyAgICAgICAgICAgLy8gcmUtYnVpbGQgQkVBQ09OIGZyYW1lCisgICAgICAgICAgICAgICAgICAgICAgICBBc2ljRW5hYmxlSWJzc1N5bmMocEFkYXB0ZXIpOyAgIC8vIGNvcHkgdG8gb24tY2hpcCBtZW1vcnkKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX1NUQV9DT05GSUcgKEJ1cnN0PSVkLCBQcm90ZWN0aW9uPSVsZCxTaG9ydFNsb3Q9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0RFU0lSRURfUkFURVM6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9SQVRFUykpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmFyeVJhdGVzLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZSwgJmFyeVJhdGVzLCBzaXplb2YoTkRJU184MDJfMTFfUkFURVMpKTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfREVTSVJFRF9SQVRFUyAoJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzBdLHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzJdLHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVszXSwKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzRdLHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs1XSwKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzZdLHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs3XSApKTsKKyAgICAgICAgICAgICAgICAvLyBDaGFuZ2luZyBEZXNpcmVkUmF0ZSBtYXkgYWZmZWN0IHRoZSBNQVggVFggcmF0ZSB3ZSB1c2VkIHRvIFRYIGZyYW1lcyBvdXQKKyAgICAgICAgICAgICAgICBNbG1lVXBkYXRlVHhSYXRlcyhwQWRhcHRlciwgRkFMU0UsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9QUkVBTUJMRToKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFJUXzgwMl8xMV9QUkVBTUJMRSkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlByZWFtYmxlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChQcmVhbWJsZSA9PSBSdDgwMl8xMVByZWFtYmxlU2hvcnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPSBQcmVhbWJsZTsKKyAgICAgICAgICAgICAgICAgICAgTWxtZVNldFR4UHJlYW1ibGUocEFkYXB0ZXIsIFJ0ODAyXzExUHJlYW1ibGVTaG9ydCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKChQcmVhbWJsZSA9PSBSdDgwMl8xMVByZWFtYmxlTG9uZykgfHwgKFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVBdXRvKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHVzZXIgd2FudHMgQVVUTywgaW5pdGlhbGl6ZSB0byBMT05HIGhlcmUsIHRoZW4gY2hhbmdlIGFjY29yZGluZyB0byBBUCdzCisgICAgICAgICAgICAgICAgICAgIC8vIGNhcGFiaWxpdHkgdXBvbiBhc3NvY2lhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUHJlYW1ibGU7CisgICAgICAgICAgICAgICAgICAgIE1sbWVTZXRUeFByZWFtYmxlKHBBZGFwdGVyLCBSdDgwMl8xMVByZWFtYmxlTG9uZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfUFJFQU1CTEUgKD0lZClcbiIsIFByZWFtYmxlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1dFUF9TVEFUVVM6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9XRVBfU1RBVFVTKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmV2VwU3RhdHVzLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIC8vIFNpbmNlIFRLSVAsIEFFUywgV0VQIGFyZSBhbGwgc3VwcG9ydGVkLiBJdCBzaG91bGQgbm90IGhhdmUgYW55IGludmFsaWQgc2V0dGluZworICAgICAgICAgICAgICAgIGlmIChXZXBTdGF0dXMgPD0gTmRpczgwMl8xMUVuY3J5cHRpb24zS2V5QWJzZW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICE9IFdlcFN0YXR1cykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uZmlnIGhhcyBjaGFuZ2VkCisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IFdlcFN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gV2VwU3RhdHVzOworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgICAgPSBXZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgCXBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgICA9IFdlcFN0YXR1czsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfV0VQX1NUQVRVUyAoPSVkKVxuIixXZXBTdGF0dXMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERToKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZBdXRoTW9kZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoQXV0aE1vZGUgPiBOZGlzODAyXzExQXV0aE1vZGVNYXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IEF1dGhNb2RlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25maWcgaGFzIGNoYW5nZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IEF1dGhNb2RlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFICg9JWQpIFxuIixwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREU6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmQnNzVHlwZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCQkJCWlmIChCc3NUeXBlID09IE5kaXM4MDJfMTFJQlNTKQorCQkJCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWRhcHRlciwgIkFkaG9jIik7CisJCQkJZWxzZSBpZiAoQnNzVHlwZSA9PSBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmUpCisJCQkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiSW5mcmEiKTsKKwkJCQllbHNlIGlmIChCc3NUeXBlID09IE5kaXM4MDJfMTFNb25pdG9yKQorCQkJCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWRhcHRlciwgIk1vbml0b3IiKTsKKwkJCQllbHNlCisJCQkJeworCQkJCQlTdGF0dXMgID0gLUVJTlZBTDsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREUgKHVua25vd24pXG4iKSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJIGNhc2UgT0lEXzgwMl8xMV9SRU1PVkVfV0VQOgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9XRVBcbiIpKTsKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX0tFWV9JTkRFWCkpCisgICAgICAgICAgICB7CisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKwkJCQlLZXlJZHggPSAqKE5ESVNfODAyXzExX0tFWV9JTkRFWCAqKSB3cnEtPnUuZGF0YS5wb2ludGVyOworCisJCQkJaWYgKEtleUlkeCAmIDB4ODAwMDAwMDApCisJCQkJeworCQkJCQkvLyBTaG91bGQgbmV2ZXIgc2V0IGRlZmF1bHQgYml0IHdoZW4gcmVtb3ZlIGtleQorCQkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlLZXlJZHggPSBLZXlJZHggJiAweDBmZmZmZmZmOworCQkJCQlpZiAoS2V5SWR4ID49IDQpeworCQkJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPSAwOworCQkJCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQkJCQkJQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLCAwLCAoVUNIQVIpS2V5SWR4KTsKKwkJCQkJfQorCQkJCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUkVTRVRfQ09VTlRFUlM6CisgICAgICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPldsYW5Db3VudGVycywgc2l6ZW9mKENPVU5URVJfODAyXzExKSk7CisgICAgICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPkNvdW50ZXJzODAyMywgc2l6ZW9mKENPVU5URVJfODAyXzMpKTsKKyAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWRhcHRlci0+UmFsaW5rQ291bnRlcnMsIHNpemVvZihDT1VOVEVSX1JBTElOSykpOworICAgICAgICAgICAgcEFkYXB0ZXItPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyICAgPSAwOworCQkJcEFkYXB0ZXItPkNvdW50ZXJzODAyMy5Hb29kUmVjZWl2ZXMgPSAwOworCQkJcEFkYXB0ZXItPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyICAgPSAwOworI2lmZGVmIFJUMjg3MAorCQkJcEFkYXB0ZXItPkJ1bGtPdXRDb21wbGV0ZQk9IDA7CisJCQlwQWRhcHRlci0+QnVsa091dENvbXBsZXRlT3RoZXI9IDA7CisJCQlwQWRhcHRlci0+QnVsa091dENvbXBsZXRlQ2FuY2VsID0gMDsKKwkJCXBBZGFwdGVyLT5CdWxrT3V0UmVxID0gMDsKKwkJCXBBZGFwdGVyLT5CdWxrSW5SZXE9IDA7CisJCQlwQWRhcHRlci0+QnVsa0luQ29tcGxldGUgPSAwOworCQkJcEFkYXB0ZXItPkJ1bGtJbkNvbXBsZXRlRmFpbCA9IDA7CisjZW5kaWYgLy8gUlQyODcwIC8vCisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfUkVTRVRfQ09VTlRFUlMgXG4iKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1JUU19USFJFU0hPTEQ6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9SVFNfVEhSRVNIT0xEKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUnRzVGhyZXNoLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChSdHNUaHJlc2ggPiBNQVhfUlRTX1RIUkVTSE9MRCkKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA9IChVU0hPUlQpUnRzVGhyZXNoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JUU19USFJFU0hPTEQgKD0lbGQpXG4iLFJ0c1RocmVzaCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmRnJhZ1RocmVzaCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBpZiAoRnJhZ1RocmVzaCA+IE1BWF9GUkFHX1RIUkVTSE9MRCB8fCBGcmFnVGhyZXNoIDwgTUlOX0ZSQUdfVEhSRVNIT0xEKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEZyYWdUaHJlc2ggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IChVU0hPUlQpRnJhZ1RocmVzaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCAoPSVsZCkgXG4iLEZyYWdUaHJlc2gpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfUE9XRVJfTU9ERToKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX1BPV0VSX01PREUpKQorICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlBvd2VyTW9kZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoUG93ZXJNb2RlID09IE5kaXM4MDJfMTFQb3dlck1vZGVDQU0pCisgICAgICAgICAgICAgICAgCVNldF9QU01vZGVfUHJvYyhwQWRhcHRlciwgIkNBTSIpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFBvd2VyTW9kZSA9PSBOZGlzODAyXzExUG93ZXJNb2RlTUFYX1BTUCkKKyAgICAgICAgICAgICAgICAJU2V0X1BTTW9kZV9Qcm9jKHBBZGFwdGVyLCAiTWF4X1BTUCIpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFBvd2VyTW9kZSA9PSBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1ApCisJCQkJCVNldF9QU01vZGVfUHJvYyhwQWRhcHRlciwgIkZhc3RfUFNQIik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoUG93ZXJNb2RlID09IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQKQorCQkJCQlTZXRfUFNNb2RlX1Byb2MocEFkYXB0ZXIsICJMZWdhY3lfUFNQIik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1BPV0VSX01PREUgKD0lZClcbiIsUG93ZXJNb2RlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTF8xOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAgPCBzaXplb2YoVUxPTkcpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlBvd2VyVGVtcCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlpZiAoUG93ZXJUZW1wID4gMTAwKQorCQkJCQlQb3dlclRlbXAgPSAweGZmZmZmZmZmOyAgLy8gQVVUTworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQgPSBQb3dlclRlbXA7IC8va2VlcCBjdXJyZW50IHNldHRpbmcuCisJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0OworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTF8xICg9JWxkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSkpOworCQkJfQorCSAgICAgICAgYnJlYWs7CisJCWNhc2UgT0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVfSU5fVVNFOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfTkVUV09SS19UWVBFKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZOZXRUeXBlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJCQkJaWYgKE5ldFR5cGUgPT0gTmRpczgwMl8xMURTKQorCQkJCQlSVE1QU2V0UGh5TW9kZShwQWRhcHRlciwgUEhZXzExQik7CisJCQkJZWxzZSBpZiAoTmV0VHlwZSA9PSBOZGlzODAyXzExT0ZETTI0KQorCQkJCQlSVE1QU2V0UGh5TW9kZShwQWRhcHRlciwgUEhZXzExQkdfTUlYRUQpOworCQkJCWVsc2UgaWYgKE5ldFR5cGUgPT0gTmRpczgwMl8xMU9GRE01KQorCQkJCQlSVE1QU2V0UGh5TW9kZShwQWRhcHRlciwgUEhZXzExQSk7CisJCQkJZWxzZQorCQkJCQlTdGF0dXMgPSAtRUlOVkFMOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQkJCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCQkJU2V0Q29tbW9uSFQocEFkYXB0ZXIpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVfSU5fVVNFICg9JWQpXG4iLE5ldFR5cGUpKTsKKwkJICAgIH0KKwkJCWJyZWFrOworICAgICAgICAvLyBGb3IgV1BBIFBTSyBQTUsga2V5CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9BRERfV1BBOgorICAgICAgICAgICAgcEtleSA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZihwS2V5ID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocEtleSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChwS2V5LT5MZW5ndGggIT0gd3JxLT51LmRhdGEubGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9BRERfV1BBLCBGYWlsZWQhIVxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spICYmCisJCQkJICAgIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spICYmCisJCQkJICAgIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FT1BOT1RTVVBQOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfQUREX1dQQSwgRmFpbGVkISEgW0F1dGhNb2RlICE9IFdQQVBTSy9XUEEyUFNLL1dQQU5PTkVdXG4iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKKwkJCQkJCSAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSB8fAorCQkJCQkJIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpICkgICAgIC8vIE9ubHkgZm9yIFdQQSBQU0sgbW9kZQorCQkJCXsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlN0YUNmZy5QTUssICZwS2V5LT5LZXlNYXRlcmlhbCwgcEtleS0+S2V5TGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVXNlIFJhQ29uZmlnIGFzIFBTSyBhZ2VudC4KKyAgICAgICAgICAgICAgICAgICAgLy8gU3RhcnQgU1RBIHN1cHBsaWNhbnQgc3RhdGUgbWFjaGluZQorICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1NUQVJUOworCisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9BRERfV1BBIChpZD0weCV4LCBMZW49JWQtYnl0ZSlcbiIsIHBLZXktPktleUluZGV4LCBwS2V5LT5LZXlMZW5ndGgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX05PVFVTRTsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX0FERF9XUEEgKGlkPTB4JXgsIExlbj0lZC1ieXRlKVxuIiwgcEtleS0+S2V5SW5kZXgsIHBLZXktPktleUxlbmd0aCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtmcmVlKHBLZXkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9SRU1PVkVfS0VZOgorICAgICAgICAgICAgcFJlbW92ZUtleSA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZihwUmVtb3ZlS2V5ID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocFJlbW92ZUtleSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChwUmVtb3ZlS2V5LT5MZW5ndGggIT0gd3JxLT51LmRhdGEubGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfS0VZLCBGYWlsZWQhIVxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFJUTVBXUEFSZW1vdmVLZXlQcm9jKHBBZGFwdGVyLCBwUmVtb3ZlS2V5KTsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9LRVksIFJlbW92ZSBXUEEgS2V5ISFcbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgS2V5SWR4ID0gcFJlbW92ZUtleS0+S2V5SW5kZXg7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKEtleUlkeCAmIDB4ODAwMDAwMDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNob3VsZCBuZXZlciBzZXQgZGVmYXVsdCBiaXQgd2hlbiByZW1vdmUga2V5CisgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfS0VZLCBGYWlsZWQhIShTaG91bGQgbmV2ZXIgc2V0IGRlZmF1bHQgYml0IHdoZW4gcmVtb3ZlIGtleSlcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtleUlkeCA9IEtleUlkeCAmIDB4MGZmZmZmZmY7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoS2V5SWR4ID4gMykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUkVNT1ZFX0tFWSwgRmFpbGVkISEoS2V5SWRbJWRdIG91dCBvZiByYW5nZSlcbiIsIEtleUlkeCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIDAsIChVQ0hBUilLZXlJZHgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfS0VZIChpZD0weCV4LCBMZW49JWQtYnl0ZSlcbiIsIHBSZW1vdmVLZXktPktleUluZGV4LCBwUmVtb3ZlS2V5LT5MZW5ndGgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtmcmVlKHBSZW1vdmVLZXkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8vIE5ldyBmb3IgV1BBCisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9BRERfS0VZOgorICAgICAgICAgICAgcEtleSA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZihwS2V5ID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBLZXksIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBpZiAocEtleS0+TGVuZ3RoICE9IHdycS0+dS5kYXRhLmxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX0tFWSwgRmFpbGVkISFcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSVE1QQWRkS2V5KHBBZGFwdGVyLCBwS2V5KTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX0tFWSAoaWQ9MHgleCwgTGVuPSVkLWJ5dGUpXG4iLCBwS2V5LT5LZXlJbmRleCwgcEtleS0+S2V5TGVuZ3RoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBrZnJlZShwS2V5KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQ09ORklHVVJBVElPTjoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04pKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZDb25maWcsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgcENvbmZpZyA9ICZDb25maWc7CisKKyAgICAgICAgICAgICAgICBpZiAoKHBDb25maWctPkJlYWNvblBlcmlvZCA+PSAyMCkgJiYgKHBDb25maWctPkJlYWNvblBlcmlvZCA8PTQwMCkpCisgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA9IChVU0hPUlQpIHBDb25maWctPkJlYWNvblBlcmlvZDsKKworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFBY3RpdmUuQXRpbVdpbiA9IChVU0hPUlQpIHBDb25maWctPkFUSU1XaW5kb3c7CisgICAgICAgICAgICAgICAgTUFQX0tIWl9UT19DSEFOTkVMX0lEKHBDb25maWctPkRTQ29uZmlnLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworICAgICAgICAgICAgICAgIC8vCisJCQkJLy8gU2F2ZSB0aGUgY2hhbm5lbCBvbiBNbG1lQXV4IGZvciBDbnRsT2lkUlRCc3NpZFByb2MgdXNlZC4KKwkJCQkvLworCQkJCXBBZGFwdGVyLT5NbG1lQXV4LkNoYW5uZWwgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQ09ORklHVVJBVElPTiAoQmVhY25QZXJpb2Q9JWxkLEF0aW1XPSVsZCxDaD0lZClcbiIsCisgICAgICAgICAgICAgICAgICAgIHBDb25maWctPkJlYWNvblBlcmlvZCwgcENvbmZpZy0+QVRJTVdpbmRvdywgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSk7CisgICAgICAgICAgICAgICAgLy8gQ29uZmlnIGhhcyBjaGFuZ2VkCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX0hUX1BIWU1PREU6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoCSE9IHNpemVvZihPSURfU0VUX0hUX1BIWU1PREUpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkgICAgUE9JRF9TRVRfSFRfUEhZTU9ERQlwSFRQaHlNb2RlID0gJkhUX1BoeU1vZGU7CisKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmSFRfUGh5TW9kZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OnBIVFBoeU1vZGUJKFBoeU1vZGUgPSAlZCxUcmFuc21pdE5vID0gJWQsIEh0TW9kZSA9CSVkLAlFeHRPZmZzZXQgPQklZCAsIE1DUyA9ICVkLCBCVyA9CSVkLAlTVEJDID0gJWQsIFNIT1JUR0kgPSAlZCkgXG4iLAorCQkJCXBIVFBoeU1vZGUtPlBoeU1vZGUsIHBIVFBoeU1vZGUtPlRyYW5zbWl0Tm8scEhUUGh5TW9kZS0+SHRNb2RlLHBIVFBoeU1vZGUtPkV4dE9mZnNldCwKKwkJCQlwSFRQaHlNb2RlLT5NQ1MsIHBIVFBoeU1vZGUtPkJXLCBwSFRQaHlNb2RlLT5TVEJDLAlwSFRQaHlNb2RlLT5TSE9SVEdJKSk7CisJCQkJaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZQk+PSBQSFlfMTFBQkdOX01JWEVEKQorCQkJCQlSVE1QU2V0SFQocEFkYXB0ZXIsCXBIVFBoeU1vZGUpOworCQkJfQorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9IVF9QSFlNT0RFKE1DUz0lZCxCVz0lZCxTR0k9JWQsU1RCQz0lZClcbiIsCisJCQkJcEFkYXB0ZXItPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTLCBwQWRhcHRlci0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5CVywgcEFkYXB0ZXItPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSwKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TVEJDKSk7CisJCQlicmVhazsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9BUFNEX1NFVFRJTkc6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVTE9ORykpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlVTE9ORyBhcHNkIDsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmYXBzZCwgd3JxLT51LmRhdGEucG9pbnRlciwJd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCQkJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCXxCMzF+QjcJfAlCNn5CNQkgfAkgQjQJIHwJIEIzCSB8CUIyCSB8CUIxCSB8CSAgIEIwCQl8CisJCQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJfCBSc3ZkCXwgTWF4IFNQIExlbiB8IEFDX1ZPIHwgQUNfVkkgfCBBQ19CSyB8IEFDX0JFIHwgQVBTRAlDYXBhYmxlCXwKKwkJCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlID0gKGFwc2QgJiAweDAwMDAwMDAxKSA/IFRSVUUgOglGQUxTRTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUgPSAoKGFwc2QJJiAweDAwMDAwMDAyKSA+PiAxKQk/IFRSVUUgOiBGQUxTRTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQksgPSAoKGFwc2QJJiAweDAwMDAwMDA0KSA+PiAyKQk/IFRSVUUgOiBGQUxTRTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkgPSAoKGFwc2QJJiAweDAwMDAwMDA4KSA+PiAzKQk/IFRSVUUgOiBGQUxTRTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8gPSAoKGFwc2QJJiAweDAwMDAwMDEwKSA+PiA0KQk/IFRSVUUgOiBGQUxTRTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLk1heFNQTGVuZ3RoCT0gKFVDSEFSKSgoYXBzZAkmIDB4MDAwMDAwNjApID4+IDUpOworCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9BUFNEX1NFVFRJTkcgKGFwc2Q9MHglbHgsIEFQU0RDYXA9JWQsIFtCRSxCSyxWSSxWT109WyVkLyVkLyVkLyVkXSwJTWF4U1BMZW49JWQpXG4iLCBhcHNkLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSwKKwkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX0JFLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkssCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WSSwJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZPLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLk1heFNQTGVuZ3RoKSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX0FQU0RfUFNNOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aAkhPSBzaXplb2YoVUxPTkcpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJLy8gRHJpdmVyIG5lZWRzCXRvIG5vdGlmeSBBUCB3aGVuIFBTTSBjaGFuZ2VzCisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJnBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlCSE9IHBBZGFwdGVyLT5TdGFDZmcuUHNtKQorCQkJCXsKKwkJCQkJTWxtZVNldFBzbUJpdChwQWRhcHRlciwJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlKTsKKwkJCQkJUlRNUFNlbmROdWxsRnJhbWUocEFkYXB0ZXIsCXBBZGFwdGVyLT5Db21tb25DZmcuVHhSYXRlLAlUUlVFKTsKKwkJCQl9CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9BUFNEX1BTTSAoYkFQU0RGb3JjZVBvd2VyU2F2ZTolZClcbiIsCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSkpOworCQkJfQorCQkJYnJlYWs7CisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfRExTOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUxPTkcpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJQk9PTEVBTglvbGR2YWx1ZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuYkRMU0NhcGFibGU7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJnBBZGFwdGVyLT5Db21tb25DZmcuYkRMU0NhcGFibGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJaWYgKG9sZHZhbHVlICYmCSFwQWRhcHRlci0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQorCQkJCXsKKwkJCQkJaW50CWk7CisJCQkJCS8vIHRlYXIJZG93biBsb2NhbCBkbHMgdGFibGUgZW50cnkKKwkJCQkJZm9yCShpPTA7IGk8TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQorCQkJCQl7CisJCQkJCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkpCisJCQkJCQl7CisJCQkJCQkJcEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKKwkJCQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7CisJCQkJCQkJUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKHBBZGFwdGVyLCBwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJLy8gdGVhcglkb3duIHBlZXIgZGxzIHRhYmxlCWVudHJ5CisJCQkJCWZvcgkoaT1NQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCisJCQkJCXsKKwkJCQkJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSkKKwkJCQkJCXsKKwkJCQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOworCQkJCQkJCXBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQkJCQlSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUocEFkYXB0ZXIsIHBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfRExTICg9JWQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX0RMU19QQVJBTToKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGgJIT0gc2l6ZW9mKFJUXzgwMl8xMV9ETFNfVUkpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJUlRfODAyXzExX0RMUwlEbHM7CisKKwkJCQlOZGlzWmVyb01lbW9yeSgmRGxzLCBzaXplb2YoUlRfODAyXzExX0RMUykpOworCQkJCVJUTVBNb3ZlTWVtb3J5KCZEbHMsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHNpemVvZihSVF84MDJfMTFfRExTX1VJKSk7CisJCQkJTWxtZUVucXVldWUocEFkYXB0ZXIsCisJCQkJCQkJTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisJCQkJCQkJUlRfT0lEXzgwMl8xMV9TRVRfRExTX1BBUkFNLAorCQkJCQkJCXNpemVvZihSVF84MDJfMTFfRExTKSwKKwkJCQkJCQkmRGxzKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfRExTX1BBUkFNIFxuIikpOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfV01NOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aAkhPSBzaXplb2YoQk9PTEVBTikpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmcEFkYXB0ZXItPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX1dNTSAoPSVkKQlcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuYldtbUNhcGFibGUpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9ESVNBU1NPQ0lBVEU6CisjaWZkZWYgUkFMSU5LX0FURQorCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVGhlIGRyaXZlciBpcyBpbiBBVEUgbW9kZSBub3dcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisJCQkvLworCQkJLy8gU2V0IE5kaXNSYWRpb1N0YXRlT2ZmIHRvCVRSVUUsIGluc3RlYWQgb2YgY2FsbGVkCU1sbWVSYWRpb09mZi4KKwkJCS8vIExhdGVyIG9uLCBORElTXzgwMl8xMV9CU1NJRF9MSVNUX0VYLT5OdW1iZXJPZkl0ZW1zIHNob3VsZCBiZQkwCisJCQkvLyB3aGVuCXF1ZXJ5IE9JRF84MDJfMTFfQlNTSURfTElTVC4KKwkJCS8vCisJCQkvLyBUUlVFOiAgTnVtYmVyT2ZJdGVtcwl3aWxsIHNldCB0bwkwLgorCQkJLy8gRkFMU0U6IE51bWJlck9mSXRlbXMJbm8gY2hhbmdlLgorCQkJLy8KKwkJCXBBZGFwdGVyLT5Db21tb25DZmcuTmRpc1JhZGlvU3RhdGVPZmYgPQlUUlVFOworCQkJLy8gU2V0IHRvIGltbWVkaWF0ZWx5IHNlbmQgdGhlIG1lZGlhIGRpc2Nvbm5lY3QJZXZlbnQKKwkJCXBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzCT0gVFJVRTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9ESVNBU1NPQ0lBVEUJXG4iKSk7CisKKwkJCWlmIChJTkZSQV9PTihwQWRhcHRlcikpCisJCQl7CisJCQkJaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPQlDTlRMX0lETEUpCisJCQkJeworCQkJCQlSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUJYnVzeSwgcmVzZXQJTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworCQkJCX0KKworCQkJCU1sbWVFbnF1ZXVlKHBBZGFwdGVyLAorCQkJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCQkJT0lEXzgwMl8xMV9ESVNBU1NPQ0lBVEUsCisJCQkJCTAsCisJCQkJCU5VTEwpOworCisJCQkJU3RhdGVNYWNoaW5lVG91Y2hlZAk9IFRSVUU7CisJCQl9CisJCQlicmVhazsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX0lNTUVfQkFfQ0FQOgorCQkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE9JRF9CQUNBUF9TVFJVQykpCisJCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJT0lEX0JBQ0FQX1NUUlVDIE9yZGUgOworCQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmT3JkZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQkJaWYgKE9yZGUuUG9saWN5ID4gQkFfTk9UVVNFKQorCQkJCQl7CisJCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19JTlZBTElEX0RBVEE7CisJCQkJCX0KKwkJCQkJZWxzZSBpZiAoT3JkZS5Qb2xpY3kgPT0gQkFfTk9UVVNFKQorCQkJCQl7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPSBCQV9OT1RVU0U7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdUVuYWJsZSA9IE9yZGUuQW1zZHVFbmFibGU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemU9IE9yZGUuQW1zZHVTaXplOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWltb1BzPSBPcmRlLk1NUFNtb2RlOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSBPcmRlLk1NUFNtb2RlOworCQkJCQkJLy8gVVBkYXRhIHRvIEhUIElFCisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzID0gT3JkZS5NTVBTbW9kZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemUgPSBPcmRlLkFtc2R1U2l6ZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBPcmRlLkF1dG9CQTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSA9IElNTUVEX0JBOyAvLyB3ZSBvbmx5IHN1cHBvcnQgaW1tZWRpYXRlIEJBLgorCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkgPSBPcmRlLk1wZHVEZW5zaXR5OworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTXBkdURlbnNpdHkgPSBPcmRlLk1wZHVEZW5zaXR5OworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUgPSBPcmRlLkFtc2R1RW5hYmxlOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplPSBPcmRlLkFtc2R1U2l6ZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QcyA9IE9yZGUuTU1QU21vZGU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSA9IE9yZGUuTU1QU21vZGU7CisKKwkJCQkJCS8vIFVQZGF0YSB0byBIVCBJRQorCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QcyA9IE9yZGUuTU1QU21vZGU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplID0gT3JkZS5BbXNkdVNpemU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHkgPSBPcmRlLk1wZHVEZW5zaXR5OworCisJCQkJCQlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID4gTUFYX1JYX1JFT1JERVJCVUYpCisJCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gTUFYX1JYX1JFT1JERVJCVUY7CisKKwkJCQkJfQorCisJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LndvcmQgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS53b3JkOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OihPcmRlLkF1dG9CQSA9ICVkKSAoUG9saWN5PSVkKShSZUJBV2luTGltaXQ9JWQpKFR4QkFXaW5MaW1pdD0lZCkoQXV0b01vZGU9JWQpXG4iLE9yZGUuQXV0b0JBLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3ksCisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQscEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuVHhCQVdpbkxpbWl0LCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEpKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjooTWltb1BzID0gJWQpKEFtc2R1RW5hYmxlID0gJWQpIChBbXNkdVNpemU9JWQpKE1wZHVEZW5zaXR5PSVkKVxuIixwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHMsIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlLAorCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NcGR1RGVuc2l0eSkpOworCQkJCX0KKworCQkJCWJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfQUREX0lNTUVfQkE6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgU2V0IDo6IFJUX09JRF84MDJfMTFfQUREX0lNTUVfQkEgXG4iKSk7CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihPSURfQUREX0JBX0VOVFJZKSkKKwkJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlVQ0hBUgkJICAgICAgICBpbmRleDsKKwkJCQlPSURfQUREX0JBX0VOVFJZICAgIEJBOworCQkJCU1BQ19UQUJMRV9FTlRSWSAgICAgKnBFbnRyeTsKKworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZCQSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlpZiAoQkEuVElEID4gMTUpCisJCQkJeworCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19JTlZBTElEX0RBVEE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQkvL0JBVGFibGVJbnNlcnRFbnRyeQorCQkJCQkvL0FzIGFkLWhvYyBtb2RlLCBCQSBwYWlyIGlzIG5vdCBsaW1pdGVkIHRvIG9ubHkgQlNTSUQuIHNvIGFkZCB2aWEgT0lELgorCQkJCQlpbmRleCA9IEJBLlRJRDsKKwkJCQkJLy8gaW4gYWQgaG9jIG1vZGUsIHdoZW4gYWRkaW5nIEJBIHBhaXIsIHdlIHNob3VsZCBpbnNlcnQgdGhpcyBlbnRyeSBpbnRvIE1BQ0VudHJ5IHRvbworCQkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWRhcHRlciwgQkEuTUFDQWRkcik7CisJCQkJCWlmICghcEVudHJ5KQorCQkJCQl7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVF9PSURfODAyXzExX0FERF9JTU1FX0JBLiBicmVhayBvbiBubyBjb25uZWN0aW9uLi0tLS06JXg6JXhcbiIsIEJBLk1BQ0FkZHJbNF0sIEJBLk1BQ0FkZHJbNV0pKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWlmIChCQS5Jc1JlY2lwaWVudCA9PSBGQUxTRSkKKwkJCQkJeworCQkJCQkgICAgaWYgKHBFbnRyeS0+YklBbUJhZEF0aGVyb3MgPT0gVFJVRSkKKwkJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSAweDEwOworCisJCQkJCQlCQU9yaVNlc3Npb25TZXRVcChwQWRhcHRlciwgcEVudHJ5LCBpbmRleCwgMCwgMTAwLCBUUlVFKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCS8vQkFUYWJsZUluc2VydEVudHJ5KHBBZGFwdGVyLCBwRW50cnktPkFpZCwgQkEuTUFDQWRkciwgMCwgMHhmZmZmLCBCQS5USUQsIEJBLm5NU0RVLCBCQS5Jc1JlY2lwaWVudCk7CisJCQkJCX0KKworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfQUREX0lNTUVfQkEuIFJlYyA9ICVkLiBNYWMgPSAleDoleDoleDoleDoleDoleCAuIFxuIiwKKwkJCQkJCUJBLklzUmVjaXBpZW50LCBCQS5NQUNBZGRyWzBdLCBCQS5NQUNBZGRyWzFdLCBCQS5NQUNBZGRyWzJdLCBCQS5NQUNBZGRyWzJdCisJCQkJCQksIEJBLk1BQ0FkZHJbNF0sIEJBLk1BQ0FkZHJbNV0pKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfVEVBUl9JTU1FX0JBOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IDo6IFJUX09JRF84MDJfMTFfVEVBUl9JTU1FX0JBIFxuIikpOworCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoT0lEX0FERF9CQV9FTlRSWSkpCisJCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJUE9JRF9BRERfQkFfRU5UUlkJcEJBOworCQkJCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OworCisJCQkJcEJBID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKworCQkJCWlmIChwQkEgPT0gTlVMTCkKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCA6OiBSVF9PSURfODAyXzExX1RFQVJfSU1NRV9CQSBrbWFsbG9jKCkgY2FuJ3QgYWxsb2NhdGUgZW5vdWdoIG1lbW9yeVxuIikpOworCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwQkEsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCA6OiBSVF9PSURfODAyXzExX1RFQVJfSU1NRV9CQShUSUQ9JWQsIGJBbGxUaWQ9JWQpXG4iLCBwQkEtPlRJRCwgcEJBLT5iQWxsVGlkKSk7CisKKwkJCQkJaWYgKCFwQkEtPmJBbGxUaWQgJiYgKHBCQS0+VElEID4gTlVNX09GX1RJRCkpCisJCQkJCXsKKwkJCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJaWYgKHBCQS0+SXNSZWNpcGllbnQgPT0gRkFMU0UpCisJCQkJCXsKKwkJCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZGFwdGVyLCBwQkEtPk1BQ0FkZHIpOworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIHBCQS0+SXNSZWNpcGllbnQgPT0gRkFMU0VcbiIpKTsKKwkJCQkJCWlmIChwRW50cnkpCisJCQkJCQl7CisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIHBCQS0+cEVudHJ5XG4iKSk7CisJCQkJCQkJQkFPcmlTZXNzaW9uVGVhckRvd24ocEFkYXB0ZXIsIHBFbnRyeS0+QWlkLCBwQkEtPlRJRCwgRkFMU0UsIFRSVUUpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCA6OiBOb3QgZm91bmQgcEVudHJ5IFxuIikpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkYXB0ZXIsIHBCQS0+TUFDQWRkcik7CisJCQkJCQlpZiAocEVudHJ5KQorCQkJCQkJeworCQkJCQkJCUJBUmVjU2Vzc2lvblRlYXJEb3duKCBwQWRhcHRlciwgKFVDSEFSKXBFbnRyeS0+QWlkLCBwQkEtPlRJRCwgVFJVRSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IDo6IE5vdCBmb3VuZCBwRW50cnkgXG4iKSk7CisJCQkJCX0KKwkJCQkJa2ZyZWUocEJBKTsKKwkJCQl9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworICAgICAgICAvLyBGb3IgV1BBX1NVUFBMSUNBTlQgdG8gc2V0IHN0YXRpYyB3ZXAga2V5CisgICAgCWNhc2UgT0lEXzgwMl8xMV9BRERfV0VQOgorICAgIAkgICAgcFdlcEtleSA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBNRU1fQUxMT0NfRkxBRyk7CisKKyAgICAJICAgIGlmKHBXZXBLZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfV0VQLCBGYWlsZWQhIVxuIikpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocFdlcEtleSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChTdGF0dXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9XRVAsIEZhaWxlZCAobGVuZ3RoIG1pc21hdGNoKSEhXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisJCSAgICAgICAgS2V5SWR4ID0gcFdlcEtleS0+S2V5SW5kZXggJiAweDBmZmZmZmZmOworICAgICAgICAgICAgICAgIC8vIEtleUlkeCBtdXN0IGJlIDAgfiAzCisgICAgICAgICAgICAgICAgaWYgKEtleUlkeCA+IDQpCisgICAgCQkJeworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9XRVAsIEZhaWxlZCAoS2V5SWR4IG11c3QgYmUgc21hbGxlciB0aGFuIDQpISFcbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVUNIQVIgQ2lwaGVyQWxnID0gMDsKKyAgICAgICAgICAgICAgICAgICAgUFVDSEFSIEtleTsKKworICAgICAgICAgICAgICAgICAgICAvLyBzZXQga2V5IG1hdGVyaWFsIGFuZCBrZXkgbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXksIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9IChVQ0hBUikgcFdlcEtleS0+S2V5TGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5LCAmcFdlcEtleS0+S2V5TWF0ZXJpYWwsIHBXZXBLZXktPktleUxlbmd0aCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHBXZXBLZXktPktleUxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9XRVAsIG9ubHkgc3VwcG9ydCBDSVBIRVJfV0VQNjQobGVuOjUpICYgQ0lQSEVSX1dFUDEyOChsZW46MTMpISFcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gRGVmYXVsdCBrZXkgZm9yIHR4IChzaGFyZWQga2V5KQorICAgICAgICAgICAgICAgICAgICBpZiAocFdlcEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKQorICAgICAgICAgICAgICAgICAgICB7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGtleSBtYXRlcmlhbCBhbmQga2V5IGxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbS2V5SWR4XS5LZXksIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W0tleUlkeF0uS2V5TGVuID0gKFVDSEFSKSBwV2VwS2V5LT5LZXlMZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtLZXlJZHhdLktleSwgJnBXZXBLZXktPktleU1hdGVyaWFsLCBwV2VwS2V5LT5LZXlMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlJZCA9IEtleUlkeDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W0tleUlkeF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKFVDSEFSKSBLZXlJZHg7CisgICAgICAgICAgICAgICAgICAgIH0KKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQpCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBLZXkgPSBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5OworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQga2V5IG1hdGVyaWFsIGFuZCBjaXBoZXJBbGcgdG8gQXNpYworICAgICAgICAJCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgS2V5LCBOVUxMLCBOVUxMKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBXZXBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA9ICZwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXNzaWduIGdyb3VwIGtleSBpbmZvCisgICAgCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwgQlNTMCwgS2V5SWR4LCBDaXBoZXJBbGcsIE5VTEwpOworICAgIAkJCQkJCS8vIEFzc2lnbiBwYWlyd2lzZSBrZXkgaW5mbworICAgIAkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkYXB0ZXIsIEJTUzAsIEtleUlkeCwgQ2lwaGVyQWxnLCBwRW50cnkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfV0VQIChpZD0weCV4LCBMZW49JWQtYnl0ZSksICVzXG4iLCBwV2VwS2V5LT5LZXlJbmRleCwgcFdlcEtleS0+S2V5TGVuZ3RoLCAocEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkgPyAiUG9ydCBTZWN1cmVkIjoiUG9ydCBOT1QgU2VjdXJlZCIpKTsKKwkJCQl9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBrZnJlZShwV2VwS2V5KTsKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkgICAgY2FzZSBPSURfU0VUX0NPVU5URVJNRUFTVVJFUzoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKGludCkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGVuYWJsZWQgPSAwOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZlbmFibGVkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChlbmFibGVkID09IDEpCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYkJsb2NrQXNzb2MgPSBUUlVFOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgLy8gV1BBIE1JQyBlcnJvciBzaG91bGQgYmxvY2sgYXNzb2NpYXRpb24gYXR0ZW1wdCBmb3IgNjAgc2Vjb25kcworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJCbG9ja0Fzc29jID0gRkFMU0U7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfU0VUX0NPVU5URVJNRUFTVVJFUyBiQmxvY2tBc3NvYz0lc1xuIiwgcEFkYXB0ZXItPlN0YUNmZy5iQmxvY2tBc3NvYyA/ICJUUlVFIjoiRkFMU0UiKSk7CisgICAgICAgICAgICB9CisJICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVDoKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVDSEFSKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmd3BhX3N1cHBsaWNhbnRfZW5hYmxlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgIAkJCXBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gd3BhX3N1cHBsaWNhbnRfZW5hYmxlOworICAgIAkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgKD0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKSk7CisJCQl9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0RFQVVUSEVOVElDQVRJT046CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihNTE1FX0RFQVVUSF9SRVFfU1RSVUNUKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNTE1FX0RFQVVUSF9SRVFfU1RSVUNUICAgICAgKnBJbmZvOworCQkJCU1MTUVfUVVFVUVfRUxFTSAqTXNnRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOworCisgICAgICAgICAgICAgICAgcEluZm8gPSAoTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCAqKSBNc2dFbGVtLT5Nc2c7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocEluZm8sIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgTWxtZURlYXV0aFJlcUFjdGlvbihwQWRhcHRlciwgTXNnRWxlbSk7CisJCQkJa2ZyZWUoTXNnRWxlbSk7CisKKyAgICAgICAgICAgICAgICBpZiAoSU5GUkFfT04ocEFkYXB0ZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTGlua0Rvd24ocEFkYXB0ZXIsIEZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9ERUFVVEhFTlRJQ0FUSU9OIChSZWFzb249JWQpXG4iLCBwSW5mby0+UmVhc29uKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0RST1BfVU5FTkNSWVBURUQ6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihpbnQpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBlbmFibGVkID0gMDsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmZW5hYmxlZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoZW5hYmxlZCA9PSAxKQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCQkJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZGFwdGVyLT5NYWNUYWJMb2NrKTsKKwkJCQlwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUG9ydFNlY3VyZWQgPSBwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkOworCQkJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZGFwdGVyLT5NYWNUYWJMb2NrKTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfRFJPUF9VTkVOQ1JZUFRFRCAoPSVkKVxuIiwgZW5hYmxlZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9TRVRfSUVFRTgwMjFYOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoQk9PTEVBTikpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJklFRUU4MDIxeFN0YXRlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gSUVFRTgwMjF4U3RhdGU7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1NFVF9JRUVFODAyMVggKD0lZClcbiIsIElFRUU4MDIxeFN0YXRlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1NFVF9JRUVFODAyMVhfUkVRVUlSRV9LRVk6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihCT09MRUFOKSkKKwkJCQkgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJklFRUU4MDIxeF9yZXF1aXJlZF9rZXlzLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCXBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMgPSBJRUVFODAyMXhfcmVxdWlyZWRfa2V5czsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfU0VUX0lFRUU4MDIxWF9SRVFVSVJFX0tFWSAoJWQpXG4iLCBJRUVFODAyMXhfcmVxdWlyZWRfa2V5cykpOworCQkJfQorCQkJYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9QTUtJRDoKKwkgICAgICAgIHBQbWtJZCA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBNRU1fQUxMT0NfRkxBRyk7CisKKwkgICAgICAgIGlmKHBQbWtJZCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBQbWtJZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCSAgICAgICAgLy8gY2hlY2sgdGhlIFBNS0lEIGluZm9ybWF0aW9uCisJICAgICAgICBpZiAocFBta0lkLT5CU1NJREluZm9Db3VudCA9PSAwKQorICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5TdGFDZmcuU2F2ZWRQTUssIHNpemVvZihCU1NJRF9JTkZPKSpQTUtJRF9OTyk7CisJICAgICAgICBlbHNlCisJICAgICAgICB7CisJCSAgICAgICAgUEJTU0lEX0lORk8JcEJzc0lkSW5mbzsKKwkJICAgICAgICBVSU5UCQlCc3NJZHg7CisJCSAgICAgICAgVUlOVAkJQ2FjaGVkSWR4OworCisJCSAgICAgICAgZm9yIChCc3NJZHggPSAwOyBCc3NJZHggPCBwUG1rSWQtPkJTU0lESW5mb0NvdW50OyBCc3NJZHgrKykKKwkJICAgICAgICB7CisJCQkgICAgICAgIC8vIHBvaW50IHRvIHRoZSBpbmRleGVkIEJTU0lEX0lORk8gc3RydWN0dXJlCisJCQkgICAgICAgIHBCc3NJZEluZm8gPSAoUEJTU0lEX0lORk8pICgoUFVDSEFSKSBwUG1rSWQgKyAyICogc2l6ZW9mKFVJTlQpICsgQnNzSWR4ICogc2l6ZW9mKEJTU0lEX0lORk8pKTsKKwkJCSAgICAgICAgLy8gRmluZCB0aGUgZW50cnkgaW4gdGhlIHNhdmVkIGRhdGEgYmFzZS4KKwkJCSAgICAgICAgZm9yIChDYWNoZWRJZHggPSAwOyBDYWNoZWRJZHggPCBwQWRhcHRlci0+U3RhQ2ZnLlNhdmVkUE1LTnVtOyBDYWNoZWRJZHgrKykKKwkJCSAgICAgICAgeworCQkJCSAgICAgICAgLy8gY29tcGFyZSB0aGUgQlNTSUQKKwkJCQkgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocEJzc0lkSW5mby0+QlNTSUQsIHBBZGFwdGVyLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRCwgc2l6ZW9mKE5ESVNfODAyXzExX01BQ19BRERSRVNTKSkpCisJCQkJCSAgICAgICAgYnJlYWs7CisJCQkgICAgICAgIH0KKworCQkJICAgICAgICAvLyBGb3VuZCwgcmVwbGFjZSBpdAorCQkJICAgICAgICBpZiAoQ2FjaGVkSWR4IDwgUE1LSURfTk8pCisJCQkgICAgICAgIHsKKwkJCQkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJVcGRhdGUgT0lEXzgwMl8xMV9QTUtJRCwgaWR4ID0gJWRcbiIsIENhY2hlZElkeCkpOworCQkJCSAgICAgICAgTmRpc01vdmVNZW1vcnkoJnBBZGFwdGVyLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XSwgcEJzc0lkSW5mbywgc2l6ZW9mKEJTU0lEX0lORk8pKTsKKwkJCQkgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuU2F2ZWRQTUtOdW0rKzsKKwkJCSAgICAgICAgfQorCQkJICAgICAgICAvLyBOb3QgZm91bmQsIHJlcGxhY2UgdGhlIGxhc3Qgb25lCisJCQkgICAgICAgIGVsc2UKKwkJCSAgICAgICAgeworCQkJCSAgICAgICAgLy8gUmFuZG9tbHkgcmVwbGFjZSBvbmUKKwkJCQkgICAgICAgIENhY2hlZElkeCA9IChwQnNzSWRJbmZvLT5CU1NJRFs1XSAlIFBNS0lEX05PKTsKKwkJCQkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJVcGRhdGUgT0lEXzgwMl8xMV9QTUtJRCwgaWR4ID0gJWRcbiIsIENhY2hlZElkeCkpOworCQkJCSAgICAgICAgTmRpc01vdmVNZW1vcnkoJnBBZGFwdGVyLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XSwgcEJzc0lkSW5mbywgc2l6ZW9mKEJTU0lEX0lORk8pKTsKKwkJCSAgICAgICAgfQorCQkgICAgICAgIH0KKwkJCX0KKwkJCWlmKHBQbWtJZCkKKwkJCQlrZnJlZShwUG1rSWQpOworCSAgICAgICAgYnJlYWs7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisKKworI2lmZGVmIFNOTVBfU1VQUE9SVAorCQljYXNlIE9JRF84MDJfMTFfU0hPUlRSRVRSWUxJTUlUOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUxPTkcpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlNob3J0UmV0cnlMaW1pdCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7CisJCQkJdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJ0eUxpbWl0ID0gU2hvcnRSZXRyeUxpbWl0OworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgdHhfcnR5X2NmZy53b3JkKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfU0hPUlRSRVRSWUxJTUlUICh0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UmV0cnlMaW1pdD0lZCwgU2hvcnRSZXRyeUxpbWl0PSVsZClcbiIsIHR4X3J0eV9jZmcuZmllbGQuU2hvcnRSdHlMaW1pdCwgU2hvcnRSZXRyeUxpbWl0KSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfTE9OR1JFVFJZTElNSVQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfTE9OR1JFVFJZTElNSVQgXG4iKSk7CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVTE9ORykpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmTG9uZ1JldHJ5TGltaXQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOworCQkJCXR4X3J0eV9jZmcuZmllbGQuTG9uZ1J0eUxpbWl0ID0gTG9uZ1JldHJ5TGltaXQ7CisJCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCB0eF9ydHlfY2ZnLndvcmQpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9MT05HUkVUUllMSU1JVCAodHhfcnR5X2NmZy5maWVsZC5Mb25nUmV0cnlMaW1pdD0gJWQsTG9uZ1JldHJ5TGltaXQ9JWxkKVxuIiwgdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQsIExvbmdSZXRyeUxpbWl0KSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfV0VQREVGQVVMVEtFWVZBTFVFOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1dFUERFRkFVTFRLRVlWQUxVRVxuIikpOworCQkJcEtleSA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBHRlBfS0VSTkVMKTsKKwkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBLZXksIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkvL3BLZXkgPSAmV2VwS2V5OworCisJCQlpZiAoIHBLZXktPkxlbmd0aCAhPSB3cnEtPnUuZGF0YS5sZW5ndGgpCisJCQl7CisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfV0VQREVGQVVMVEtFWVZBTFVFLCBGYWlsZWQhIVxuIikpOworCQkJfQorCQkJS2V5SWR4ID0gcEtleS0+S2V5SW5kZXggJiAweDBmZmZmZmZmOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJwS2V5LT5LZXlJbmRleCA9JWQsIHBLZXktPktleUxlbmd0aD0lZFxuIiwgcEtleS0+S2V5SW5kZXgsIHBLZXktPktleUxlbmd0aCkpOworCisJCQkvLyBpdCBpcyBhIHNoYXJlZCBrZXkKKwkJCWlmIChLZXlJZHggPiA0KQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuID0gKFVDSEFSKSBwS2V5LT5LZXlMZW5ndGg7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwgJnBLZXktPktleU1hdGVyaWFsLCBwS2V5LT5LZXlMZW5ndGgpOworCQkJCWlmIChwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApCisJCQkJeworCQkJCQkvLyBEZWZhdWx0IGtleSBmb3IgdHggKHNoYXJlZCBrZXkpCisJCQkJCXBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKFVDSEFSKSBLZXlJZHg7CisJCQkJfQorCQkJCS8vUmVzdGFydEFQSXNSZXF1aXJlZCA9IFRSVUU7CisJCQl9CisJCQlicmVhazsKKworCisJCWNhc2UgT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZSUQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfV0VQREVGQVVMVEtFWUlEIFxuIikpOworCisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVQ0hBUikpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwkJCWJyZWFrOworCisKKwkJY2FzZSBPSURfODAyXzExX0NVUlJFTlRDSEFOTkVMOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0NVUlJFTlRDSEFOTkVMIFxuIikpOworCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUNIQVIpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmN0bXAsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJc3ByaW50ZigmY3RtcCwiJWQiLCBjdG1wKTsKKwkJCQlTZXRfQ2hhbm5lbF9Qcm9jKHBBZGFwdGVyLCAmY3RtcCk7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZgorCisKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0Ojp1bmtub3duIElPQ1RMJ3Mgc3ViY21kID0gMHglMDh4XG4iLCBjbWQpKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IC1FT1BOT1RTVVBQOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisKKyAgICByZXR1cm4gU3RhdHVzOworfQorCitJTlQgUlRNUFF1ZXJ5SW5mb3JtYXRpb24oCisgICAgSU4gIFBSVE1QX0FEQVBURVIgcEFkYXB0ZXIsCisgICAgSU4gIE9VVCBzdHJ1Y3QgaWZyZXEgICAgKnJxLAorICAgIElOICBJTlQgICAgICAgICAgICAgICAgIGNtZCkKK3sKKyAgICBzdHJ1Y3QgaXdyZXEgICAgICAgICAgICAgICAgICAgICAgICAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKSBycTsKKyAgICBORElTXzgwMl8xMV9CU1NJRF9MSVNUX0VYICAgICAgICAgICAqcEJzc2lkTGlzdCA9IE5VTEw7CisgICAgUE5ESVNfV0xBTl9CU1NJRF9FWCAgICAgICAgICAgICAgICAgcEJzczsKKyAgICBORElTXzgwMl8xMV9TU0lEICAgICAgICAgICAgICAgICAgICBTc2lkOworICAgIE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04gICAgICAgICAgICpwQ29uZmlndXJhdGlvbiA9IE5VTEw7CisgICAgUlRfODAyXzExX0xJTktfU1RBVFVTICAgICAgICAgICAgICAgKnBMaW5rU3RhdHVzID0gTlVMTDsKKyAgICBSVF84MDJfMTFfU1RBX0NPTkZJRyAgICAgICAgICAgICAgICAqcFN0YUNvbmZpZyA9IE5VTEw7CisgICAgTkRJU184MDJfMTFfU1RBVElTVElDUyAgICAgICAgICAgICAgKnBTdGF0aXN0aWNzID0gTlVMTDsKKyAgICBORElTXzgwMl8xMV9SVFNfVEhSRVNIT0xEICAgICAgICAgICBSdHNUaHJlc2g7CisgICAgTkRJU184MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQgRnJhZ1RocmVzaDsKKyAgICBORElTXzgwMl8xMV9QT1dFUl9NT0RFICAgICAgICAgICAgICBQb3dlck1vZGU7CisgICAgTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSAgQnNzVHlwZTsKKyAgICBSVF84MDJfMTFfUFJFQU1CTEUgICAgICAgICAgICAgICAgICBQcmVhbVR5cGU7CisgICAgTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSAgICAgQXV0aE1vZGU7CisgICAgTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgV2VwU3RhdHVzOworICAgIE5ESVNfTUVESUFfU1RBVEUgICAgICAgICAgICAgICAgICAgIE1lZGlhU3RhdGU7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnNzQnVmU2l6ZSwgdWxJbmZvPTAsIE5ldHdvcmtUeXBlTGlzdFs0XSwgYXBzZCA9IDA7CisgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnNzTGVuID0gMDsKKyAgICBQVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnVmID0gTlVMTCwgcFB0cjsKKyAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlX3ZlcnNpb25fY29tcGlsZWQ7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgUGFkZGluZyA9IDA7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFkaW9TdGF0ZTsKKwlVQ0hBUglkcml2ZXJWZXJzaW9uWzhdOworICAgIE9JRF9TRVRfSFRfUEhZTU9ERQkJCSAgICAgICAgKnBIVFBoeU1vZGUgPSBOVUxMOworCisKKyNpZmRlZiBTTk1QX1NVUFBPUlQKKwkvL2ZvciBzbm1wLCBrYXRoeQorCURlZmF1bHRLZXlJZHhWYWx1ZQkJCSpwS2V5SWR4VmFsdWU7CisJSU5UCQkJCQkJCXZhbHVlTGVuOworCVRYX1JUWV9DRkdfU1RSVUMJCQl0eF9ydHlfY2ZnOworCVVMT05HCQkJCQkJU2hvcnRSZXRyeUxpbWl0LCBMb25nUmV0cnlMaW1pdDsKKwlVQ0hBUgkJCQkJCXRtcFs2NF07CisjZW5kaWYgLy9TTk1QCisKKyAgICBzd2l0Y2goY21kKQorICAgIHsKKyAgICAgICAgY2FzZSBSVF9PSURfREVWSUNFX05BTUU6CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoU1RBX05JQ19ERVZJQ0VfTkFNRSk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgU1RBX05JQ19ERVZJQ0VfTkFNRSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF9WRVJTSU9OX0lORk86CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEX1ZFUlNJT05fSU5GTyBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDgqc2l6ZW9mKFVDSEFSKTsKKwkJCXNwcmludGYoJmRyaXZlclZlcnNpb25bMF0sICIlcyIsIFNUQV9EUklWRVJfVkVSU0lPTik7CisJCQlkcml2ZXJWZXJzaW9uWzddID0gJ1wwJzsKKwkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJmRyaXZlclZlcnNpb24sIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICB7CisJCQkJU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFJBTElOS19BVEUKKwkJY2FzZSBSVF9RVUVSWV9BVEVfVFhET05FX0NPVU5UOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX1FVRVJZX0FURV9UWERPTkVfQ09VTlQgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUlOVDMyKTsKKwkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5hdGUuVHhEb25lQ291bnQsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisJCQl7CisJCQkJU3RhdHVzID0gLUVGQVVMVDsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKyAgICAgICAgY2FzZSBPSURfODAyXzExX0JTU0lEX0xJU1Q6CisgICAgICAgICAgICBpZiAoUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgCS8qCisgICAgICAgICAgICAJICogU3RpbGwgc2Nhbm5pbmcsIGluZGljYXRlIHRoZSBjYWxsZXIgc2hvdWxkIHRyeSBhZ2Fpbi4KKyAgICAgICAgICAgIAkgKi8KKyAgICAgICAgICAgIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUIChTdGlsbCBzY2FubmluZylcbiIpKTsKKwkJCQlyZXR1cm4gLUVBR0FJTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0JTU0lEX0xJU1QgKCVkIEJTUyByZXR1cm5lZClcbiIscEFkYXB0ZXItPlNjYW5UYWIuQnNzTnIpKTsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOworICAgICAgICAgICAgLy8gQ2xhY3VsYXRlIHRvdGFsIGJ1ZmZlciBzaXplIHJlcXVpcmVkCisgICAgICAgICAgICBCc3NCdWZTaXplID0gc2l6ZW9mKFVMT05HKTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQWxpZ24gcG9pbnRlciB0byA0IGJ5dGVzIGJvdW5kYXJ5LgorICAgICAgICAgICAgICAgIC8vUGFkZGluZyA9IDQgLSAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4gJiAweDAwMDMpOworICAgICAgICAgICAgICAgIC8vaWYgKFBhZGRpbmcgPT0gNCkKKyAgICAgICAgICAgICAgICAvLyAgICBQYWRkaW5nID0gMDsKKyAgICAgICAgICAgICAgICBCc3NCdWZTaXplICs9IChzaXplb2YoTkRJU19XTEFOX0JTU0lEX0VYKSAtIDEgKyBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKSArIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuICsgUGFkZGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEZvciBzYWZldHkgaXNzdWUsIHdlIGFkZCAyNTYgYnl0ZXMganVzdCBpbiBjYXNlCisgICAgICAgICAgICBCc3NCdWZTaXplICs9IDI1NjsKKyAgICAgICAgICAgIC8vIEFsbG9jYXRlIHRoZSBzYW1lIHNpemUgYXMgcGFzc2VkIGZyb20gaGlnaGVyIGxheWVyCisgICAgICAgICAgICBwQnVmID0ga21hbGxvYyhCc3NCdWZTaXplLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZihwQnVmID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEluaXQgODAyXzExX0JTU0lEX0xJU1RfRVggc3RydWN0dXJlCisgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQnVmLCBCc3NCdWZTaXplKTsKKyAgICAgICAgICAgIHBCc3NpZExpc3QgPSAoUE5ESVNfODAyXzExX0JTU0lEX0xJU1RfRVgpIHBCdWY7CisgICAgICAgICAgICBwQnNzaWRMaXN0LT5OdW1iZXJPZkl0ZW1zID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnI7CisKKyAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0b3RhbCBidWZmZXIgbGVuZ3RoCisgICAgICAgICAgICBCc3NMZW4gPSA0OyAvLyBDb25zaXN0IG9mIE51bWJlck9mSXRlbXMKKyAgICAgICAgICAgIC8vIFBvaW50IHRvIHN0YXJ0IG9mIE5ESVNfV0xBTl9CU1NJRF9FWAorICAgICAgICAgICAgLy8gcFB0ciA9IHBCdWYgKyBzaXplb2YoVUxPTkcpOworICAgICAgICAgICAgcFB0ciA9IChQVUNIQVIpICZwQnNzaWRMaXN0LT5Cc3NpZFswXTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwQWRhcHRlci0+U2NhblRhYi5Cc3NOcjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBCc3MgPSAoUE5ESVNfV0xBTl9CU1NJRF9FWCkgcFB0cjsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeSgmcEJzcy0+TWFjQWRkcmVzcywgJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkLCBNQUNfQUREUl9MRU4pOworICAgICAgICAgICAgICAgIGlmICgocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uSGlkZGVuID09IDEpICYmIChwQWRhcHRlci0+U3RhQ2ZnLmJTaG93SGlkZGVuU1NJRCA9PSBGQUxTRSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLworCQkJCQkvLyBXZSBtdXN0IHJldHVybiB0aGlzIFNTSUQgZHVyaW5nIDR3YXkgaGFuZHNoYWtpbmcsIG90aGVyd2lzZSBBZWdpcyB3aWxsIGZhaWxlZCB0byBwYXJzZSBXUEEgaW5mb21hdGlvbgorCQkJCQkvLyBhbmQgdGhlbiBmYWlsZWQgdG8gc2VuZCBFQVBPbCBmYXJhbWUuCisJCQkJCS8vCisJCQkJCWlmICgocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpICYmIChwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkICE9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKSkKKwkJCQkJeworCQkJCQkJcEJzcy0+U3NpZC5Tc2lkTGVuZ3RoID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZExlbjsKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPlNzaWQuU3NpZCwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZCwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZExlbik7CisJCQkJCX0KKwkJCQkJZWxzZQorICAgICAgICAgICAgICAgICAgICAJcEJzcy0+U3NpZC5Tc2lkTGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEJzcy0+U3NpZC5Tc2lkTGVuZ3RoID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZExlbjsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEJzcy0+U3NpZC5Tc2lkLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcEJzcy0+UHJpdmFjeSA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlByaXZhY3k7CisgICAgICAgICAgICAgICAgcEJzcy0+UnNzaSA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzc2kgLSBwQWRhcHRlci0+QmJwUnNzaVRvRGJtRGVsdGE7CisgICAgICAgICAgICAgICAgcEJzcy0+TmV0d29ya1R5cGVJblVzZSA9IE5ldHdvcmtUeXBlSW5Vc2VTYW5pdHkoJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldKTsKKyAgICAgICAgICAgICAgICBwQnNzLT5Db25maWd1cmF0aW9uLkxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OKTsKKyAgICAgICAgICAgICAgICBwQnNzLT5Db25maWd1cmF0aW9uLkJlYWNvblBlcmlvZCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJlYWNvblBlcmlvZDsKKyAgICAgICAgICAgICAgICBwQnNzLT5Db25maWd1cmF0aW9uLkFUSU1XaW5kb3cgPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5BdGltV2luOworCisgICAgICAgICAgICAgICAgTUFQX0NIQU5ORUxfSURfVE9fS0haKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkNoYW5uZWwsIHBCc3MtPkNvbmZpZ3VyYXRpb24uRFNDb25maWcpOworCisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc1R5cGUgPT0gQlNTX0lORlJBKQorICAgICAgICAgICAgICAgICAgICBwQnNzLT5JbmZyYXN0cnVjdHVyZU1vZGUgPSBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmU7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwQnNzLT5JbmZyYXN0cnVjdHVyZU1vZGUgPSBOZGlzODAyXzExSUJTUzsKKworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBCc3MtPlN1cHBvcnRlZFJhdGVzLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlTGVuKTsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5TdXBwb3J0ZWRSYXRlcyArIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGVMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uRXh0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5FeHRSYXRlTGVuKTsKKworICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbiA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEJzcy0+SUVMZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKTsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEJzcy0+SUVzLCAmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uRml4SUVzLCBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKSk7CisgICAgICAgICAgICAgICAgICAgIHBQdHIgPSBwUHRyICsgc2l6ZW9mKE5ESVNfV0xBTl9CU1NJRF9FWCkgLSAxICsgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBCc3MtPklFTGVuZ3RoID0gKFVMT05HKShzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKSArIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgcFB0ciA9IHBQdHIgKyBzaXplb2YoTkRJU19XTEFOX0JTU0lEX0VYKSAtIDEgKyBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKTsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEJzcy0+SUVzLCAmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uRml4SUVzLCBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKSk7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBCc3MtPklFcyArIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRXMsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgcFB0ciArPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcEJzcy0+TGVuZ3RoID0gKFVMT05HKShzaXplb2YoTkRJU19XTEFOX0JTU0lEX0VYKSAtIDEgKyBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKSArIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuICsgUGFkZGluZyk7CisKKyNpZiBXSVJFTEVTU19FWFQgPCAxNworICAgICAgICAgICAgICAgIGlmICgoQnNzTGVuICsgcEJzcy0+TGVuZ3RoKSA8IHdycS0+dS5kYXRhLmxlbmd0aCkKKyAgICAgICAgICAgICAgICBCc3NMZW4gKz0gcEJzcy0+TGVuZ3RoOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBCc3NpZExpc3QtPk51bWJlck9mSXRlbXMgPSBpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICAgIEJzc0xlbiArPSBwQnNzLT5MZW5ndGg7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKworI2lmIFdJUkVMRVNTX0VYVCA8IDE3CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBCc3NMZW47CisjZWxzZQorICAgICAgICAgICAgaWYgKEJzc0xlbiA+IHdycS0+dS5kYXRhLmxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBrZnJlZShwQnNzaWRMaXN0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IEJzc0xlbjsKKyNlbmRpZgorICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBCc3NpZExpc3QsIEJzc0xlbik7CisgICAgICAgICAgICBrZnJlZShwQnNzaWRMaXN0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfM19DVVJSRU5UX0FERFJFU1M6CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBNQUNfQUREUl9MRU47CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5DdXJyZW50QWRkcmVzcywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF9HRU5fTUVESUFfQ09OTkVDVF9TVEFUVVM6CisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPkluZGljYXRlTWVkaWFTdGF0ZSA9PSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZCkKKyAgICAgICAgICAgICAgICBNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOworCisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoTkRJU19NRURJQV9TVEFURSk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJk1lZGlhU3RhdGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0JTU0lEOgorI2lmZGVmIFJBTElOS19BVEUKKwkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRoZSBkcml2ZXIgaXMgaW4gQVRFIG1vZGUgbm93XG4iKSk7CisJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKyAgICAgICAgICAgIGlmIChJTkZSQV9PTihwQWRhcHRlcikgfHwgQURIT0NfT04ocEFkYXB0ZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5Cc3NpZCwgc2l6ZW9mKE5ESVNfODAyXzExX01BQ19BRERSRVNTKSk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9CU1NJRCg9RU1QVFkpXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT1RDT05OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9TU0lEOgorCQkJTmRpc1plcm9NZW1vcnkoJlNzaWQsIHNpemVvZihORElTXzgwMl8xMV9TU0lEKSk7CisJCQlOZGlzWmVyb01lbW9yeShTc2lkLlNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7CisgICAgICAgICAgICBTc2lkLlNzaWRMZW5ndGggPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWRMZW47CisJCQltZW1jcHkoU3NpZC5Tc2lkLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWQsCVNzaWQuU3NpZExlbmd0aCk7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfU1NJRCk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJlNzaWQsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9TU0lEIChMZW49JWQsIHNzaWQ9JXMpXG4iLCBTc2lkLlNzaWRMZW5ndGgsU3NpZC5Tc2lkKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0xJTktfU1RBVFVTOgorICAgICAgICAgICAgcExpbmtTdGF0dXMgPSAoUlRfODAyXzExX0xJTktfU1RBVFVTICopIGttYWxsb2Moc2l6ZW9mKFJUXzgwMl8xMV9MSU5LX1NUQVRVUyksIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmIChwTGlua1N0YXR1cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwTGlua1N0YXR1cy0+Q3VyclR4UmF0ZSA9IFJhdGVJZFRvNTAwS2Jwc1twQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UmF0ZV07ICAgLy8gdW5pdCA6IDUwMCBrYnBzCisgICAgICAgICAgICAgICAgcExpbmtTdGF0dXMtPkNoYW5uZWxRdWFsaXR5ID0gcEFkYXB0ZXItPk1sbWUuQ2hhbm5lbFF1YWxpdHk7CisgICAgICAgICAgICAgICAgcExpbmtTdGF0dXMtPlJ4Qnl0ZUNvdW50ID0gcEFkYXB0ZXItPlJhbGlua0NvdW50ZXJzLlJlY2VpdmVkQnl0ZUNvdW50OworICAgICAgICAgICAgICAgIHBMaW5rU3RhdHVzLT5UeEJ5dGVDb3VudCA9IHBBZGFwdGVyLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEJ5dGVDb3VudDsKKyAgICAgICAgCQlwTGlua1N0YXR1cy0+Q2VudHJhbENoYW5uZWwgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsOworICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSVF84MDJfMTFfTElOS19TVEFUVVMpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwTGlua1N0YXR1cywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBrZnJlZShwTGlua1N0YXR1cyk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfTElOS19TVEFUVVNcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9MSU5LX1NUQVRVUyhrbWFsbG9jIGZhaWxlZClcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OOgorICAgICAgICAgICAgcENvbmZpZ3VyYXRpb24gPSAoTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiAqKSBrbWFsbG9jKHNpemVvZihORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OKSwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYgKHBDb25maWd1cmF0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBDb25maWd1cmF0aW9uLT5MZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfQ09ORklHVVJBVElPTik7CisgICAgICAgICAgICAgICAgcENvbmZpZ3VyYXRpb24tPkJlYWNvblBlcmlvZCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQmVhY29uUGVyaW9kOworICAgICAgICAgICAgICAgIHBDb25maWd1cmF0aW9uLT5BVElNV2luZG93ID0gcEFkYXB0ZXItPlN0YUFjdGl2ZS5BdGltV2luOworICAgICAgICAgICAgICAgIE1BUF9DSEFOTkVMX0lEX1RPX0tIWihwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBDb25maWd1cmF0aW9uLT5EU0NvbmZpZyk7CisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04pOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwQ29uZmlndXJhdGlvbiwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OKEJlYWNvblBlcmlvZD0lbGQsQXRpbVc9JWxkLENoYW5uZWw9JWQpIFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29uZmlndXJhdGlvbi0+QmVhY29uUGVyaW9kLCBwQ29uZmlndXJhdGlvbi0+QVRJTVdpbmRvdywgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJCQkJa2ZyZWUocENvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0NPTkZJR1VSQVRJT04oa21hbGxvYyBmYWlsZWQpXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfU05SXzA6CisJCQlpZiAoKHBBZGFwdGVyLT5TdGFDZmcuTGFzdFNOUjAgPiAwKSkKKwkJCXsKKwkJCQl1bEluZm8gPSAoKDB4ZWIJLSBwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTTlIwKSAqIDMpIC8JMTYgOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NOUl8wKDB4PSVseClcbiIsIHVsSW5mbykpOworCQkJfQorICAgICAgICAgICAgZWxzZQorCQkJICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX1NOUl8xOgorCQkJaWYgKChwQWRhcHRlci0+QW50ZW5uYS5maWVsZC5SeFBhdGgJPiAxKSAmJgorICAgICAgICAgICAgICAgIChwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTTlIxID4gMCkpCisJCQl7CisJCQkJdWxJbmZvID0gKCgweGViCS0gcEFkYXB0ZXItPlN0YUNmZy5MYXN0U05SMSkgKiAzKSAvCTE2IDsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywJd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NOUl8xKDB4PSVseClcbiIsdWxJbmZvKSk7CisJCQl9CisJCQllbHNlCisJCQkJU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUXVlcnk6OlJUX09JRF84MDJfMTFfU05SXzEocEFkYXB0ZXItPlN0YUNmZy5MYXN0U05SMT0lZClcbiIscEFkYXB0ZXItPlN0YUNmZy5MYXN0U05SMSkpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9SU1NJX1RSSUdHRVI6CisgICAgICAgICAgICB1bEluZm8gPSBwQWRhcHRlci0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwIC0gcEFkYXB0ZXItPkJicFJzc2lUb0RibURlbHRhOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1JTU0lfVFJJR0dFUig9JWxkKVxuIiwgdWxJbmZvKSk7CisgICAgICAgICAgICBicmVhazsKKwkJY2FzZSBPSURfODAyXzExX1JTU0k6CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9SU1NJOgorCQkJdWxJbmZvID0gcEFkYXB0ZXItPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMDsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sCXdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX1JTU0lfMToKKyAgICAgICAgICAgIHVsSW5mbyA9IHBBZGFwdGVyLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTE7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9SU1NJXzI6CisgICAgICAgICAgICB1bEluZm8gPSBwQWRhcHRlci0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywJd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfU1RBVElTVElDUzoKKyAgICAgICAgICAgIHBTdGF0aXN0aWNzID0gKE5ESVNfODAyXzExX1NUQVRJU1RJQ1MgKikga21hbGxvYyhzaXplb2YoTkRJU184MDJfMTFfU1RBVElTVElDUyksIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmIChwU3RhdGlzdGljcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9TVEFUSVNUSUNTIFxuIikpOworICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgbW9zdCB1cC10by1kYXRlIGgvdyByYXcgY291bnRlcnMgaW50byBzb2Z0d2FyZSBjb3VudGVycworCQkJICAgIE5JQ1VwZGF0ZVJhd0NvdW50ZXJzKHBBZGFwdGVyKTsKKworICAgICAgICAgICAgICAgIC8vIFNhbml0eSBjaGVjayBmb3IgY2FsY3VsYXRpb24gb2Ygc3VjZXNzZnVsIGNvdW50CisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0IDwgcEFkYXB0ZXItPldsYW5Db3VudGVycy5SZXRyeUNvdW50LlF1YWRQYXJ0KQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC5RdWFkUGFydDsKKworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+TXVsdGljYXN0VHJhbnNtaXR0ZWRGcmFtZUNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5NdWx0aWNhc3RUcmFuc21pdHRlZEZyYW1lQ291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPkZhaWxlZENvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+UmV0cnlDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+TXVsdGlwbGVSZXRyeUNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5NdWx0aXBsZVJldHJ5Q291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPlJUU1N1Y2Nlc3NDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUlRTU3VjY2Vzc0NvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5SVFNGYWlsdXJlQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJUU0ZhaWx1cmVDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+QUNLRmFpbHVyZUNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5BQ0tGYWlsdXJlQ291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPkZyYW1lRHVwbGljYXRlQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkZyYW1lRHVwbGljYXRlQ291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPlJlY2VpdmVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUmVjZWl2ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5NdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLk11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudC5RdWFkUGFydDsKKyNpZmRlZiBEQkcKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+RkNTRXJyb3JDb3VudCA9IHBBZGFwdGVyLT5SYWxpbmtDb3VudGVycy5SZWFsRmNzRXJyQ291bnQ7CisjZWxzZQorICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5GQ1NFcnJvckNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5GcmFtZUR1cGxpY2F0ZUNvdW50LnUuTG93UGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuRnJhbWVEdXBsaWNhdGVDb3VudC51Lkxvd1BhcnQgLyAxMDA7CisjZW5kaWYKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfU1RBVElTVElDUyk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBTdGF0aXN0aWNzLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGtmcmVlKHBTdGF0aXN0aWNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9TVEFUSVNUSUNTKGttYWxsb2MgZmFpbGVkKVxuIikpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfR0VOX1JDVl9PSzoKKyAgICAgICAgICAgIHVsSW5mbyA9IHBBZGFwdGVyLT5Db3VudGVyczgwMjMuR29vZFJlY2VpdmVzOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF9HRU5fUkNWX05PX0JVRkZFUjoKKyAgICAgICAgICAgIHVsSW5mbyA9IHBBZGFwdGVyLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlcjsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1BIWV9NT0RFOgorICAgICAgICAgICAgdWxJbmZvID0gKFVMT05HKXBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9QSFlfTU9ERSAoPSVsZClcbiIsIHVsSW5mbykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHOgorICAgICAgICAgICAgcFN0YUNvbmZpZyA9IChSVF84MDJfMTFfU1RBX0NPTkZJRyAqKSBrbWFsbG9jKHNpemVvZihSVF84MDJfMTFfU1RBX0NPTkZJRyksIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmIChwU3RhQ29uZmlnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NUQV9DT05GSUdcbiIpKTsKKyAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5FbmFibGVUeEJ1cnN0ID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdDsKKyAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5FbmFibGVUdXJib1JhdGUgPSAwOworICAgICAgICAgICAgICAgIHBTdGFDb25maWctPlVzZUJHUHJvdGVjdGlvbiA9IHBBZGFwdGVyLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uOworICAgICAgICAgICAgICAgIHBTdGFDb25maWctPlVzZVNob3J0U2xvdFRpbWUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lOworICAgICAgICAgICAgICAgIC8vcFN0YUNvbmZpZy0+QWRob2NNb2RlID0gcEFkYXB0ZXItPlN0YUNmZy5BZGhvY01vZGU7CisgICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+SHdSYWRpb1N0YXR1cyA9IChwQWRhcHRlci0+U3RhQ2ZnLmJId1JhZGlvID09IFRSVUUpID8gMSA6IDA7CisgICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+UnN2MSA9IDA7CisgICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+U3lzdGVtRXJyb3JCaXRtYXAgPSBwQWRhcHRlci0+U3lzdGVtRXJyb3JCaXRtYXA7CisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJUXzgwMl8xMV9TVEFfQ09ORklHKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFN0YUNvbmZpZywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBrZnJlZShwU3RhQ29uZmlnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHKGttYWxsb2MgZmFpbGVkKVxuIikpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1JUU19USFJFU0hPTEQ6CisgICAgICAgICAgICBSdHNUaHJlc2ggPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZDsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSdHNUaHJlc2gpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZSdHNUaHJlc2gsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9SVFNfVEhSRVNIT0xEKD0lbGQpXG4iLCBSdHNUaHJlc2gpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQ6CisgICAgICAgICAgICBGcmFnVGhyZXNoID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZDsKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPT0gVFJVRSkKKyAgICAgICAgICAgICAgICBGcmFnVGhyZXNoID0gMDsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihGcmFnVGhyZXNoKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmRnJhZ1RocmVzaCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEKD0lbGQpXG4iLCBGcmFnVGhyZXNoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1BPV0VSX01PREU6CisgICAgICAgICAgICBQb3dlck1vZGUgPSBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGU7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUG93ZXJNb2RlKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmUG93ZXJNb2RlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfUE9XRVJfTU9ERSg9JWQpXG4iLCBQb3dlck1vZGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUkFESU86CisgICAgICAgICAgICBSYWRpb1N0YXRlID0gKEJPT0xFQU4pIHBBZGFwdGVyLT5TdGFDZmcuYlN3UmFkaW87CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUmFkaW9TdGF0ZSk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJlJhZGlvU3RhdGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9SQURJTyAoPSVkKVxuIiwgUmFkaW9TdGF0ZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFOgorICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCisgICAgICAgICAgICAgICAgQnNzVHlwZSA9IE5kaXM4MDJfMTFJQlNTOworICAgICAgICAgICAgZWxzZSBpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19JTkZSQSkKKyAgICAgICAgICAgICAgICBCc3NUeXBlID0gTmRpczgwMl8xMUluZnJhc3RydWN0dXJlOworICAgICAgICAgICAgZWxzZSBpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19NT05JVE9SKQorICAgICAgICAgICAgICAgIEJzc1R5cGUgPSBOZGlzODAyXzExTW9uaXRvcjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBCc3NUeXBlID0gTmRpczgwMl8xMUF1dG9Vbmtub3duOworCisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoQnNzVHlwZSk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJkJzc1R5cGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFKD0lZClcbiIsIEJzc1R5cGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUFJFQU1CTEU6CisgICAgICAgICAgICBQcmVhbVR5cGUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGU7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUHJlYW1UeXBlKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmUHJlYW1UeXBlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUFJFQU1CTEUoPSVkKVxuIiwgUHJlYW1UeXBlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREU6CisgICAgICAgICAgICBBdXRoTW9kZSA9IHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGU7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoQXV0aE1vZGUpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZBdXRoTW9kZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUoPSVkKVxuIiwgQXV0aE1vZGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfV0VQX1NUQVRVUzoKKyAgICAgICAgICAgIFdlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFdlcFN0YXR1cyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJldlcFN0YXR1cywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1dFUF9TVEFUVVMoPSVkKVxuIiwgV2VwU3RhdHVzKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1RYX1BPV0VSX0xFVkVMOgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUwgJXhcbiIscEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyKSk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMXzE6CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUxfMSAoPSVsZClcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UpKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfTkVUV09SS19UWVBFU19TVVBQT1JURUQ6CisJCQlpZiAoKHBBZGFwdGVyLT5SZkljVHlwZQk9PSBSRklDXzI4NTApIHx8IChwQWRhcHRlci0+UmZJY1R5cGUgPT0JUkZJQ18yNzUwKSkKKwkJCXsKKwkJCQlOZXR3b3JrVHlwZUxpc3RbMF0gPSAzOyAgICAgICAgICAgICAgICAgLy8gTnVtYmVyT2ZJdGVtcyA9IDMKKwkJCQlOZXR3b3JrVHlwZUxpc3RbMV0gPSBOZGlzODAyXzExRFM7ICAgICAgLy8gTmV0d29ya1R5cGVbMV0gPSAxMWIKKwkJCQlOZXR3b3JrVHlwZUxpc3RbMl0gPSBOZGlzODAyXzExT0ZETTI0OyAgLy8gTmV0d29ya1R5cGVbMl0gPSAxMWcKKwkJCQlOZXR3b3JrVHlwZUxpc3RbM10gPSBOZGlzODAyXzExT0ZETTU7ICAgLy8gTmV0d29ya1R5cGVbM10gPSAxMWEKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSAxNjsKKwkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJk5ldHdvcmtUeXBlTGlzdFswXSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlOZXR3b3JrVHlwZUxpc3RbMF0gPSAyOyAgICAgICAgICAgICAgICAgLy8gTnVtYmVyT2ZJdGVtcyA9IDIKKwkJCQlOZXR3b3JrVHlwZUxpc3RbMV0gPSBOZGlzODAyXzExRFM7ICAgICAgLy8gTmV0d29ya1R5cGVbMV0gPSAxMWIKKwkJCQlOZXR3b3JrVHlwZUxpc3RbMl0gPSBOZGlzODAyXzExT0ZETTI0OyAgLy8gTmV0d29ya1R5cGVbMl0gPSAxMWcKKwkJCSAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSAxMjsKKwkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJk5ldHdvcmtUeXBlTGlzdFswXSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCX0KKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX05FVFdPUktfVFlQRVNfU1VQUE9SVEVEXG4iKSk7CisJCQkJYnJlYWs7CisJICAgIGNhc2UgT0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVfSU5fVVNFOgorICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKwkJCWlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQSkKKwkJCQl1bEluZm8gPSBOZGlzODAyXzExT0ZETTU7CisJCQllbHNlIGlmICgocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUJHX01JWEVEKSB8fCAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUcpKQorCQkJCXVsSW5mbyA9IE5kaXM4MDJfMTFPRkRNMjQ7CisJCQllbHNlCisJCQkJdWxJbmZvID0gTmRpczgwMl8xMURTOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfUlhfUkFURToKKyAgICAgICAgICAgIHVsSW5mbyA9IChVTE9ORylwQWRhcHRlci0+TGFzdFJ4UmF0ZTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9MQVNUX1JYX1JBVEUgKD0lbGQpXG4iLCB1bEluZm8pKTsKKwkJCWJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfTEFTVF9UWF9SQVRFOgorCQkJLy91bEluZm8gPSAoVUxPTkcpcEFkYXB0ZXItPkxhc3RUeFJhdGU7CisJCQl1bEluZm8gPSAoVUxPTkcpcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS53b3JkOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywJd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfVFhfUkFURSAoPSVseClcbiIsIHVsSW5mbykpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9FRVBST01fVkVSU0lPTjoKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5FZXByb21WZXJzaW9uLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9GSVJNV0FSRV9WRVJTSU9OOgorICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkZpcm13YXJlVmVyc2lvbiwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCSAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfTk9JU0VfTEVWRUw6CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+QmJwV3JpdGVMYXRjaFs2Nl0sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9OT0lTRV9MRVZFTCAoPSVkKVxuIiwgcEFkYXB0ZXItPkJicFdyaXRlTGF0Y2hbNjZdKSk7CisJCQlicmVhazsKKwkgICAgY2FzZSBSVF9PSURfODAyXzExX0VYVFJBX0lORk86CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+RXh0cmFJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfRVhUUkFfSU5GTyAoPSVsZClcbiIsIHBBZGFwdGVyLT5FeHRyYUluZm8pKTsKKwkgICAgICAgIGJyZWFrOworCSAgICBjYXNlIFJUX09JRF9XRV9WRVJTSU9OX0NPTVBJTEVEOgorCSAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVJTlQpOworCSAgICAgICAgd2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKKwkgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmd2VfdmVyc2lvbl9jb21waWxlZCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkgICAgICAgIGJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfQVBTRF9TRVRUSU5HOgorCQkJYXBzZCA9IChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSB8IChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUgPDwgMSkgfCAocEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX0JLIDw8IDIpCisJCQkJfCAocEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZJIDw8IDMpCXwgKHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WTyA8PCA0KQl8IChwQWRhcHRlci0+Q29tbW9uQ2ZnLk1heFNQTGVuZ3RoIDw8IDUpKTsKKworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmYXBzZCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0FQU0RfU0VUVElORyAoPTB4JWx4LEFQU0RDYXA9JWQsQUNfQkU9JWQsQUNfQks9JWQsQUNfVkk9JWQsQUNfVk89JWQsTUFYU1BMZW49JWQpXG4iLAorCQkJCWFwc2QscEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTRENhcGFibGUscEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX0JFLHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CSyxwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkscEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZPLHBBZGFwdGVyLT5Db21tb25DZmcuTWF4U1BMZW5ndGgpKTsKKwkJCWJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfQVBTRF9QU006CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9BUFNEX1BTTSAoPSVkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlKSk7CisJCQlicmVhazsKKwkJY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX1dNTToKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihCT09MRUFOKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX1dNTSAoPSVkKVxuIiwJcEFkYXB0ZXItPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSkpOworCQkJYnJlYWs7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICBjYXNlIFJUX09JRF9ORVdfRFJJVkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVDSEFSIGVuYWJsZWQgPSAxOworICAgIAkgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisgICAgCSAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZlbmFibGVkLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfTkVXX0RSSVZFUiAoPSVkKVxuIiwgZW5hYmxlZCkpOworICAgICAgICAgICAgfQorCSAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQ6CisJICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworCSAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAoPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVApKTsKKwkgICAgICAgIGJyZWFrOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworICAgICAgICBjYXNlIFJUX09JRF9EUklWRVJfREVWSUNFX05BTUU6CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEX0RSSVZFUl9ERVZJQ0VfTkFNRSBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDE2OworCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwQWRhcHRlci0+U3RhQ2ZnLmRldl9uYW1lLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorCQkJeworCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisJCQl9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0hUX1BIWU1PREU6CisgICAgICAgICAgICBwSFRQaHlNb2RlID0gKE9JRF9TRVRfSFRfUEhZTU9ERSAqKSBrbWFsbG9jKHNpemVvZihPSURfU0VUX0hUX1BIWU1PREUpLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZiAocEhUUGh5TW9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwSFRQaHlNb2RlLT5QaHlNb2RlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlOworICAgIAkJCXBIVFBoeU1vZGUtPkh0TW9kZSA9IChVQ0hBUilwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREU7CisgICAgCQkJcEhUUGh5TW9kZS0+QlcgPSAoVUNIQVIpcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5CVzsKKyAgICAJCQlwSFRQaHlNb2RlLT5NQ1M9IChVQ0hBUilwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1DUzsKKyAgICAJCQlwSFRQaHlNb2RlLT5TSE9SVEdJPSAoVUNIQVIpcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJOworICAgIAkJCXBIVFBoeU1vZGUtPlNUQkM9IChVQ0hBUilwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLlNUQkM7CisKKyAgICAJCQlwSFRQaHlNb2RlLT5FeHRPZmZzZXQgPSAoKHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpID8gKEVYVENIQV9CRUxPVykgOiAoRVhUQ0hBX0FCT1ZFKSk7CisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKE9JRF9TRVRfSFRfUEhZTU9ERSk7CisgICAgICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwSFRQaHlNb2RlLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgIAkJCXsKKyAgICAJCQkJU3RhdHVzID0gLUVGQVVMVDsKKyAgICAJCQl9CisgICAgCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfSFRfUEhZTU9ERSAoUGh5TW9kZSA9ICVkLCBNQ1MgPSVkLCBCVyA9ICVkLCBTVEJDID0gJWQsIEV4dE9mZnNldD0lZClcbiIsCisgICAgCQkJCXBIVFBoeU1vZGUtPkh0TW9kZSwgcEhUUGh5TW9kZS0+TUNTLCBwSFRQaHlNb2RlLT5CVywgcEhUUGh5TW9kZS0+U1RCQywgcEhUUGh5TW9kZS0+RXh0T2Zmc2V0KSk7CisgICAgCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIE1sbWVVcGRhdGVUeFJhdGVzICgud29yZCA9ICV4IClcbiIsIHBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUud29yZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NUQV9DT05GSUcoa21hbGxvYyBmYWlsZWQpXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfQ09VTlRSWV9SRUdJT046CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9DT1VOVFJZX1JFR0lPTiBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworICAgICAgICAgICAgdWxJbmZvID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQ7CisgICAgICAgICAgICB1bEluZm8gPSAodWxJbmZvIDw8IDgpfChwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24pOworCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgeworCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0RBVF9IVF9QSFlNT0RFOgorICAgICAgICAgICAgcEhUUGh5TW9kZSA9IChPSURfU0VUX0hUX1BIWU1PREUgKikga21hbGxvYyhzaXplb2YoT0lEX1NFVF9IVF9QSFlNT0RFKSwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYgKHBIVFBoeU1vZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEhUUGh5TW9kZS0+UGh5TW9kZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZTsKKyAgICAJCQlwSFRQaHlNb2RlLT5IdE1vZGUgPSAoVUNIQVIpcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFOworICAgIAkJCXBIVFBoeU1vZGUtPkJXID0gKFVDSEFSKXBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXOworICAgIAkJCXBIVFBoeU1vZGUtPk1DUz0gKFVDSEFSKXBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1M7CisgICAgCQkJcEhUUGh5TW9kZS0+U0hPUlRHST0gKFVDSEFSKXBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0k7CisgICAgCQkJcEhUUGh5TW9kZS0+U1RCQz0gKFVDSEFSKXBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkM7CisKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoT0lEX1NFVF9IVF9QSFlNT0RFKTsKKyAgICAgICAgICAgICAgICBpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBIVFBoeU1vZGUsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgCQkJeworICAgIAkJCQlTdGF0dXMgPSAtRUZBVUxUOworICAgIAkJCX0KKyAgICAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9IVF9QSFlNT0RFIChQaHlNb2RlID0gJWQsIE1DUyA9JWQsIEJXID0gJWQsIFNUQkMgPSAlZCwgRXh0T2Zmc2V0PSVkKVxuIiwKKyAgICAJCQkJcEhUUGh5TW9kZS0+SHRNb2RlLCBwSFRQaHlNb2RlLT5NQ1MsIHBIVFBoeU1vZGUtPkJXLCBwSFRQaHlNb2RlLT5TVEJDLCBwSFRQaHlNb2RlLT5FeHRPZmZzZXQpKTsKKyAgICAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgTWxtZVVwZGF0ZVR4UmF0ZXMgKC53b3JkID0gJXggKVxuIiwgcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS53b3JkKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfU1RBX0NPTkZJRyhrbWFsbG9jIGZhaWxlZClcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEX1FVRVJZX01VTFRJUExFX0NBUkRfU1VQUE9SVDoKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisgICAgICAgICAgICBpID0gMDsKKyNpZmRlZiBNVUxUSVBMRV9DQVJEX1NVUFBPUlQKKyAgICAgICAgICAgIGkgPSAxOworI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLworCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmaSwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKwkJCQlTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF9RVUVSWV9NVUxUSVBMRV9DQVJEX1NVUFBPUlQoPSVkKSBcbiIsIGkpKTsKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFNOTVBfU1VQUE9SVAorCQljYXNlIFJUX09JRF84MDJfMTFfTUFDX0FERFJFU1M6CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBNQUNfQUREUl9MRU47CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5DdXJyZW50QWRkcmVzcywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRVJPVUk6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRVJPVUkgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBNYW51ZmFjdHVyZXJPVUlfTEVOOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q3VycmVudEFkZHJlc3MsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVSTkFNRToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX01BTlVGQUNUVVJFUk5BTUUgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4oTWFudWZhY3R1cmVyTkFNRSk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgTWFudWZhY3R1cmVyTkFNRSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9SRVNPVVJDRVRZUEVJRE5BTUU6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9SRVNPVVJDRVRZUEVJRE5BTUUgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4oUmVzb3VyY2VUeXBlSWROYW1lKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBSZXNvdXJjZVR5cGVJZE5hbWUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfUFJJVkFDWU9QVElPTklNUExFTUVOVEVEOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUFJJVkFDWU9QVElPTklNUExFTUVOVEVEIFxuIikpOworCQkJdWxJbmZvID0gMTsgLy8gMSBpcyBzdXBwb3J0IHdlcCBlbHNlIDIgaXMgbm90IHN1cHBvcnQuCisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1BPV0VSTUFOQUdFTUVOVE1PREU6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9QT1dFUk1BTkFHRU1FTlRNT0RFIFxuIikpOworCQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuUHNtID09IFBTTVBfQUNUSU9OKQorCQkJCXVsSW5mbyA9IDE7IC8vIDEgaXMgcG93ZXIgYWN0aXZlIGVsc2UgMiBpcyBwb3dlciBzYXZlLgorCQkJZWxzZQorCQkJCXVsSW5mbyA9IDI7CisKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfV0VQREVGQVVMVEtFWVZBTFVFOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfV0VQREVGQVVMVEtFWVZBTFVFIFxuIikpOworCQkJLy9LZXlJZHhWYWx1ZS5LZXlJZHggPSBwQWQtPlBvcnRDZmcuTUJTU0lEW3BBZC0+SW9jdGxJRl0uRGVmYXVsdEtleUlkOworCQkJcEtleUlkeFZhbHVlID0gd3JxLT51LmRhdGEucG9pbnRlcjsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiS2V5SWR4VmFsdWUuS2V5SWR4ID0gJWQsIFxuIixwS2V5SWR4VmFsdWUtPktleUlkeCkpOworCQkJdmFsdWVMZW4gPSBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW47CisJCQlOZGlzTW92ZU1lbW9yeShwS2V5SWR4VmFsdWUtPlZhbHVlLAorCQkJCQkJICAgJnBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwKKwkJCQkJCSAgIHZhbHVlTGVuKTsKKwkJCXBLZXlJZHhWYWx1ZS0+VmFsdWVbdmFsdWVMZW5dPSdcMCc7CisKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihEZWZhdWx0S2V5SWR4VmFsdWUpOworCisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcEtleUlkeFZhbHVlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJEZWZhdWx0S2V5SWQgPSAlZCwgdG90YWwgbGVuID0gJWQsIHN0ciBsZW49JWQsIEtleVZhbHVlPSAlMDJ4ICUwMnggJTAyeCAlMDJ4IFxuIiwgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQsIHdycS0+dS5kYXRhLmxlbmd0aCwgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuLAorCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlbMF0sCisJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleVswXSwKKwkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5WzBdLAorCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXlbMF0pKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZSUQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZSUQgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRlZmF1bHRLZXlJZCA9JWQgXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1dFUEtFWU1BUFBJTkdMRU5HVEg6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9XRVBLRVlNQVBQSU5HTEVOR1RIIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLAorCQkJCQkJCQkJJnBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbiwKKwkJCQkJCQkJCXdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfU0hPUlRSRVRSWUxJTUlUOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfU0hPUlRSRVRSWUxJTUlUIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCAmdHhfcnR5X2NmZy53b3JkKTsKKwkJCVNob3J0UmV0cnlMaW1pdCA9IHR4X3J0eV9jZmcuZmllbGQuU2hvcnRSdHlMaW1pdDsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNob3J0UmV0cnlMaW1pdCA9JWxkLCAgdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJldHJ5TGltaXQ9JWRcbiIsIFNob3J0UmV0cnlMaW1pdCwgdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJ0eUxpbWl0KSk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJlNob3J0UmV0cnlMaW1pdCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9MT05HUkVUUllMSU1JVDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0xPTkdSRVRSWUxJTUlUIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCAmdHhfcnR5X2NmZy53b3JkKTsKKwkJCUxvbmdSZXRyeUxpbWl0ID0gdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQ7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJMb25nUmV0cnlMaW1pdCA9JWxkLCAgdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQ9JWRcbiIsIExvbmdSZXRyeUxpbWl0LCB0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdCkpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZMb25nUmV0cnlMaW1pdCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9QUk9EVUNUSUQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9QUk9EVUNUSUQgXG4iKSk7CisKKyNpZmRlZiBSVDI4NzAKKwkJCXNwcmludGYodG1wLCAiJTA0eCAlMDR4XG4iLCAoKFBPU19DT09LSUUpcEFkYXB0ZXItPk9TX0Nvb2tpZSktPnBVc2JfRGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yICwoKFBPU19DT09LSUUpcEFkYXB0ZXItPk9TX0Nvb2tpZSktPnBVc2JfRGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7CisKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbih0bXApOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHRtcCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRUlEOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVJRCBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihNYW51ZmFjdHVyZXJOQU1FKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBNYW51ZmFjdHVyZXJOQU1FLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0NVUlJFTlRDSEFOTkVMOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQ1VSUkVOVENIQU5ORUwgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgic2l6ZW9mIFVDSEFSPSVkLCBjaGFubmVsPSVkIFxuIiwgc2l6ZW9mKFVDSEFSKSwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsKSk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN0YXR1cz0lZFxuIiwgU3RhdHVzKSk7CisJCQlicmVhazsKKyNlbmRpZiAvL1NOTVBfU1VQUE9SVAorCisJCWNhc2UgT0lEXzgwMl8xMV9CVUlMRF9DSEFOTkVMX0VYOgorCQkJeworCQkJCVVDSEFSIHZhbHVlOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0JVSUxEX0NIQU5ORUxfRVggXG4iKSk7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3VwcG9ydCBFWFRfQlVJTERfQ0hBTk5FTF9MSVNULlxuIikpOworCQkJCXZhbHVlID0gMTsKKyNlbHNlCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRG9lc24ndCBzdXBwb3J0IEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QuXG4iKSk7CisJCQkJdmFsdWUgPSAwOworI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKwkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnZhbHVlLCAxKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTdGF0dXM9JWRcbiIsIFN0YXR1cykpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0dFVF9DSF9MSVNUOgorCQkJeworCQkJCVBSVF9DSEFOTkVMX0xJU1RfSU5GTyBwQ2hMaXN0QnVmOworCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfR0VUX0NIX0xJU1QgXG4iKSk7CisJCQkJaWYgKHBBZGFwdGVyLT5DaGFubmVsTGlzdE51bSA9PSAwKQorCQkJCXsKKwkJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gMDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJcENoTGlzdEJ1ZiA9IChSVF9DSEFOTkVMX0xJU1RfSU5GTyAqKSBrbWFsbG9jKHNpemVvZihSVF9DSEFOTkVMX0xJU1RfSU5GTyksIE1FTV9BTExPQ19GTEFHKTsKKwkJCQlpZiAocENoTGlzdEJ1ZiA9PSBOVUxMKQorCQkJCXsKKwkJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gMDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJcENoTGlzdEJ1Zi0+Q2hhbm5lbExpc3ROdW0gPSBwQWRhcHRlci0+Q2hhbm5lbExpc3ROdW07CisJCQkJZm9yIChpID0gMDsgaSA8IHBDaExpc3RCdWYtPkNoYW5uZWxMaXN0TnVtOyBpKyspCisJCQkJCXBDaExpc3RCdWYtPkNoYW5uZWxMaXN0W2ldID0gcEFkYXB0ZXItPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWw7CisKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUlRfQ0hBTk5FTF9MSVNUX0lORk8pOworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwQ2hMaXN0QnVmLCBzaXplb2YoUlRfQ0hBTk5FTF9MSVNUX0lORk8pKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTdGF0dXM9JWRcbiIsIFN0YXR1cykpOworCisJCQkJaWYgKHBDaExpc3RCdWYpCisJCQkJCWtmcmVlKHBDaExpc3RCdWYpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0dFVF9DT1VOVFJZX0NPREU6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9HRVRfQ09VTlRSWV9DT0RFIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gMjsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5Q29kZSwgMik7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTdGF0dXM9JWRcbiIsIFN0YXR1cykpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0dFVF9DSEFOTkVMX0dFT0dSQVBIWToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0dFVF9DSEFOTkVMX0dFT0dSQVBIWSBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDE7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuR2VvZ3JhcGh5LCAxKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN0YXR1cz0lZFxuIiwgU3RhdHVzKSk7CisJCQlicmVhazsKKworCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9ETFM6CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoQk9PTEVBTik7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuYkRMU0NhcGFibGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9ETFMoPSVkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0RMU19QQVJBTToKKwkJCXsKKwkJCQlQUlRfODAyXzExX0RMU19JTkZPCXBEbHNJbmZvID0ga21hbGxvYyhzaXplb2YoUlRfODAyXzExX0RMU19JTkZPKSwgR0ZQX0FUT01JQyk7CisJCQkJaWYgKHBEbHNJbmZvID09IE5VTEwpCisJCQkJCWJyZWFrOworCisJCQkJZm9yIChpPTA7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwkJCQl7CisJCQkJCVJUTVBNb3ZlTWVtb3J5KCZwRGxzSW5mby0+RW50cnlbaV0sICZwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCBzaXplb2YoUlRfODAyXzExX0RMU19VSSkpOworCQkJCX0KKworCQkJCXBEbHNJbmZvLT5udW0gPSBNQVhfTlVNX09GX0RMU19FTlRSWTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUlRfODAyXzExX0RMU19JTkZPKTsKKwkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcERsc0luZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfRExTX1BBUkFNXG4iKSk7CisKKwkJCQlpZiAocERsc0luZm8pCisJCQkJCWtmcmVlKHBEbHNJbmZvKTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OnVua25vd24gSU9DVEwncyBzdWJjbWQgPSAweCUwOHhcbiIsIGNtZCkpOworICAgICAgICAgICAgU3RhdHVzID0gLUVPUE5PVFNVUFA7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czsKK30KKworSU5UIHJ0Mjh4eF9zdGFfaW9jdGwoCisJSU4Jc3RydWN0IG5ldF9kZXZpY2UJKm5ldF9kZXYsCisJSU4JT1VUCXN0cnVjdCBpZnJlcQkqcnEsCisJSU4JSU5UCQkJCQljbWQpCit7CisJUE9TX0NPT0tJRQkJCXBPYmo7CisJVklSVFVBTF9BREFQVEVSCQkqcFZpcnR1YWxBZCA9IE5VTEw7CisJUlRNUF9BREFQVEVSICAgICAgICAqcEFkID0gTlVMTDsKKwlzdHJ1Y3QgaXdyZXEgICAgICAgICp3cnEgPSAoc3RydWN0IGl3cmVxICopIHJxOworCUJPT0xFQU4JCQkJU3RhdGVNYWNoaW5lVG91Y2hlZCA9IEZBTFNFOworCUlOVAkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlVU0hPUlQJCQkJc3ViY21kOworCisJaWYgKG5ldF9kZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWQgPSBuZXRfZGV2LT5wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gbmV0X2Rldi0+cHJpdjsKKwkJcEFkID0gcFZpcnR1YWxBZC0+UnRtcERldi0+cHJpdjsKKwl9CisJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKworCWlmIChwQWQgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisjaWZkZWYgQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQKKwkgICAgaWYgKHdycS0+dS5kYXRhLnBvaW50ZXIgPT0gTlVMTCkKKwkgICAgeworCQkgICAgcmV0dXJuIFN0YXR1czsKKwkgICAgfQorCisJICAgIGlmIChzdHJzdHIod3JxLT51LmRhdGEucG9pbnRlciwgIk9wTW9kZSIpID09IE5VTEwpCisjZW5kaWYgLy8gQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQgLy8KKyAgICAgICAgeworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworCQkgICAgcmV0dXJuIC1FTkVURE9XTjsKKyAgICAgICAgfQorICAgIH0KKworCXsJLy8gZGV0ZXJtaW5lIHRoaXMgaW9jdGwgY29tbWFuZCBpcyBjb21taW5nIGZyb20gd2hpY2ggaW50ZXJmYWNlLgorCQlwT2JqLT5pb2N0bF9pZl90eXBlID0gSU5UX01BSU47CisJCXBPYmotPmlvY3RsX2lmID0gTUFJTl9NQlNTSUQ7CisJfQorCisJc3dpdGNoKGNtZCkKKwl7CisjaWZkZWYgUkFMSU5LX0FURQorI2lmZGVmIFJBTElOS18yOHh4X1FBCisJCWNhc2UgUlRQUklWX0lPQ1RMX0FURToKKwkJCXsKKwkJCQlSdG1wRG9BdGUocEFkLCB3cnEpOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KKyNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCisgICAgICAgIGNhc2UgU0lPQ0dJRkhXQUREUjoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklPQ1RMOjpTSU9DR0lGSFdBRERSXG4iKSk7CisJCQltZW1jcHkod3JxLT51Lm5hbWUsIHBBZC0+Q3VycmVudEFkZHJlc3MsIEVUSF9BTEVOKTsKKwkJCWJyZWFrOworCQljYXNlIFNJT0NHSVdOQU1FOgorICAgICAgICB7CisgICAgICAgIAljaGFyICpuYW1lPSZ3cnEtPnUubmFtZVswXTsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd25hbWUobmV0X2RldiwgTlVMTCwgbmFtZSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHSVdFU1NJRDogIC8vR2V0IEVTU0lECisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wb2ludCAqZXNzaWQ9JndycS0+dS5lc3NpZDsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd2Vzc2lkKG5ldF9kZXYsIE5VTEwsIGVzc2lkLCBlc3NpZC0+cG9pbnRlcik7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NTSVdFU1NJRDogIC8vU2V0IEVTU0lECisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wb2ludAkqZXNzaWQ9JndycS0+dS5lc3NpZDsKKyAgICAgICAgCXJ0X2lvY3RsX3Npd2Vzc2lkKG5ldF9kZXYsIE5VTEwsIGVzc2lkLCBlc3NpZC0+cG9pbnRlcik7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NTSVdOV0lEOiAgIC8vIHNldCBuZXR3b3JrIGlkICh0aGUgY2VsbCkKKwkJY2FzZSBTSU9DR0lXTldJRDogICAvLyBnZXQgbmV0d29yayBpZAorCQkJU3RhdHVzID0gLUVPUE5PVFNVUFA7CisJCQlicmVhazsKKwkJY2FzZSBTSU9DU0lXRlJFUTogICAvL3NldCBjaGFubmVsL2ZyZXF1ZW5jeSAoSHopCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19mcmVxICpmcmVxPSZ3cnEtPnUuZnJlcTsKKyAgICAgICAgCXJ0X2lvY3RsX3Npd2ZyZXEobmV0X2RldiwgTlVMTCwgZnJlcSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHSVdGUkVROiAgIC8vIGdldCBjaGFubmVsL2ZyZXF1ZW5jeSAoSHopCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19mcmVxICpmcmVxPSZ3cnEtPnUuZnJlcTsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd2ZyZXEobmV0X2RldiwgTlVMTCwgZnJlcSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NTSVdOSUNLTjogLy9zZXQgbm9kZSBuYW1lL25pY2tuYW1lCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wb2ludCAqZGF0YT0md3JxLT51LmRhdGE7CisgICAgICAgIAlydF9pb2N0bF9zaXduaWNrbihuZXRfZGV2LCBOVUxMLCBkYXRhLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ0dJV05JQ0tOOiAvL2dldCBub2RlIG5hbWUvbmlja25hbWUKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BvaW50ICpkYXRhPSZ3cnEtPnUuZGF0YTsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd25pY2tuKG5ldF9kZXYsIE5VTEwsIGRhdGEsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DR0lXUkFURTogICAvL2dldCBkZWZhdWx0IGJpdCByYXRlIChicHMpCisJCSAgICBydF9pb2N0bF9naXdyYXRlKG5ldF9kZXYsIE5VTEwsICZ3cnEtPnUsIE5VTEwpOworICAgICAgICAgICAgYnJlYWs7CisJICAgIGNhc2UgU0lPQ1NJV1JBVEU6ICAvL3NldCBkZWZhdWx0IGJpdCByYXRlIChicHMpCisJICAgICAgICBydF9pb2N0bF9zaXdyYXRlKG5ldF9kZXYsIE5VTEwsICZ3cnEtPnUsIE5VTEwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0lPQ0dJV1JUUzogIC8vIGdldCBSVFMvQ1RTIHRocmVzaG9sZCAoYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wYXJhbSAqcnRzPSZ3cnEtPnUucnRzOworICAgICAgICAJcnRfaW9jdGxfZ2l3cnRzKG5ldF9kZXYsIE5VTEwsIHJ0cywgTlVMTCk7CisJCQlicmVhazsKKwkJfQorICAgICAgICBjYXNlIFNJT0NTSVdSVFM6ICAvL3NldCBSVFMvQ1RTIHRocmVzaG9sZCAoYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wYXJhbSAqcnRzPSZ3cnEtPnUucnRzOworICAgICAgICAJcnRfaW9jdGxfc2l3cnRzKG5ldF9kZXYsIE5VTEwsIHJ0cywgTlVMTCk7CisJCQlicmVhazsKKwkJfQorICAgICAgICBjYXNlIFNJT0NHSVdGUkFHOiAgLy9nZXQgZnJhZ21lbnRhdGlvbiB0aHIgKGJ5dGVzKQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcGFyYW0gKmZyYWc9JndycS0+dS5mcmFnOworICAgICAgICAJcnRfaW9jdGxfZ2l3ZnJhZyhuZXRfZGV2LCBOVUxMLCBmcmFnLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisgICAgICAgIGNhc2UgU0lPQ1NJV0ZSQUc6ICAvL3NldCBmcmFnbWVudGF0aW9uIHRociAoYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wYXJhbSAqZnJhZz0md3JxLT51LmZyYWc7CisgICAgICAgIAlydF9pb2N0bF9zaXdmcmFnKG5ldF9kZXYsIE5VTEwsIGZyYWcsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKyAgICAgICAgY2FzZSBTSU9DR0lXRU5DT0RFOiAgLy9nZXQgZW5jb2RpbmcgdG9rZW4gJiBtb2RlCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wb2ludCAqZXJxPSZ3cnEtPnUuZW5jb2Rpbmc7CisgICAgICAgIAlpZihlcnEtPnBvaW50ZXIpCisgICAgICAgIAkJcnRfaW9jdGxfZ2l3ZW5jb2RlKG5ldF9kZXYsIE5VTEwsIGVycSwgZXJxLT5wb2ludGVyKTsKKwkJCWJyZWFrOworCQl9CisgICAgICAgIGNhc2UgU0lPQ1NJV0VOQ09ERTogIC8vc2V0IGVuY29kaW5nIHRva2VuICYgbW9kZQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcG9pbnQgKmVycT0md3JxLT51LmVuY29kaW5nOworICAgICAgICAJaWYoZXJxLT5wb2ludGVyKQorICAgICAgICAJCXJ0X2lvY3RsX3Npd2VuY29kZShuZXRfZGV2LCBOVUxMLCBlcnEsIGVycS0+cG9pbnRlcik7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHSVdBUDogICAgIC8vZ2V0IGFjY2VzcyBwb2ludCBNQUMgYWRkcmVzc2VzCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBzb2NrYWRkciAqYXBfYWRkcj0md3JxLT51LmFwX2FkZHI7CisgICAgICAgIAlydF9pb2N0bF9naXdhcChuZXRfZGV2LCBOVUxMLCBhcF9hZGRyLCBhcF9hZGRyLT5zYV9kYXRhKTsKKwkJCWJyZWFrOworCQl9CisJICAgIGNhc2UgU0lPQ1NJV0FQOiAgLy9zZXQgYWNjZXNzIHBvaW50IE1BQyBhZGRyZXNzZXMKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IHNvY2thZGRyICphcF9hZGRyPSZ3cnEtPnUuYXBfYWRkcjsKKyAgICAgICAgCXJ0X2lvY3RsX3Npd2FwKG5ldF9kZXYsIE5VTEwsIGFwX2FkZHIsIGFwX2FkZHItPnNhX2RhdGEpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DR0lXTU9ERTogICAvL2dldCBvcGVyYXRpb24gbW9kZQorICAgICAgICB7CisgICAgICAgIAlfX3UzMiAqbW9kZT0md3JxLT51Lm1vZGU7CisgICAgICAgIAlydF9pb2N0bF9naXdtb2RlKG5ldF9kZXYsIE5VTEwsIG1vZGUsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DU0lXTU9ERTogICAvL3NldCBvcGVyYXRpb24gbW9kZQorICAgICAgICB7CisgICAgICAgIAlfX3UzMiAqbW9kZT0md3JxLT51Lm1vZGU7CisgICAgICAgIAlydF9pb2N0bF9zaXdtb2RlKG5ldF9kZXYsIE5VTEwsIG1vZGUsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DR0lXU0VOUzogICAvL2dldCBzZW5zaXRpdml0eSAoZEJtKQorCQljYXNlIFNJT0NTSVdTRU5TOgkvL3NldCBzZW5zaXRpdml0eSAoZEJtKQorCQljYXNlIFNJT0NHSVdQT1dFUjogIC8vZ2V0IFBvd2VyIE1hbmFnZW1lbnQgc2V0dGluZ3MKKwkJY2FzZSBTSU9DU0lXUE9XRVI6ICAvL3NldCBQb3dlciBNYW5hZ2VtZW50IHNldHRpbmdzCisJCWNhc2UgU0lPQ0dJV1RYUE9XOiAgLy9nZXQgdHJhbnNtaXQgcG93ZXIgKGRCbSkKKwkJY2FzZSBTSU9DU0lXVFhQT1c6ICAvL3NldCB0cmFuc21pdCBwb3dlciAoZEJtKQorCQljYXNlIFNJT0NHSVdSQU5HRToJLy9HZXQgcmFuZ2Ugb2YgcGFyYW1ldGVycworCQljYXNlIFNJT0NHSVdSRVRSWToJLy9nZXQgcmV0cnkgbGltaXRzIGFuZCBsaWZldGltZQorCQljYXNlIFNJT0NTSVdSRVRSWToJLy9zZXQgcmV0cnkgbGltaXRzIGFuZCBsaWZldGltZQorCQkJU3RhdHVzID0gLUVPUE5PVFNVUFA7CisJCQlicmVhazsKKwkJY2FzZSBSVF9QUklWX0lPQ1RMOgorCQkJc3ViY21kID0gd3JxLT51LmRhdGEuZmxhZ3M7CisJCQlpZiggc3ViY21kICYgT0lEX0dFVF9TRVRfVE9HR0xFKQorCQkJCVN0YXR1cyA9IFJUTVBTZXRJbmZvcm1hdGlvbihwQWQsIHJxLCBzdWJjbWQpOworCQkJZWxzZQorCQkJCVN0YXR1cyA9IFJUTVBRdWVyeUluZm9ybWF0aW9uKHBBZCwgcnEsIHN1YmNtZCk7CisJCQlicmVhazsKKwkJY2FzZSBTSU9DR0lXUFJJVjoKKwkJCWlmICh3cnEtPnUuZGF0YS5wb2ludGVyKQorCQkJeworCQkJCWlmICggYWNjZXNzX29rKFZFUklGWV9XUklURSwgd3JxLT51LmRhdGEucG9pbnRlciwgc2l6ZW9mKHByaXZ0YWIpKSAhPSBUUlVFKQorCQkJCQlicmVhazsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocHJpdnRhYikgLyBzaXplb2YocHJpdnRhYlswXSk7CisJCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwcml2dGFiLCBzaXplb2YocHJpdnRhYikpKQorCQkJCQlTdGF0dXMgPSAtRUZBVUxUOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUlRQUklWX0lPQ1RMX1NFVDoKKwkJCWlmKGFjY2Vzc19vayhWRVJJRllfUkVBRCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKSAhPSBUUlVFKQorCQkJCWJyZWFrOworCQkJcnRfaW9jdGxfc2V0cGFyYW0obmV0X2RldiwgTlVMTCwgTlVMTCwgd3JxLT51LmRhdGEucG9pbnRlcik7CisJCQlicmVhazsKKwkJY2FzZSBSVFBSSVZfSU9DVExfR1NJVEVTVVJWRVk6CisJCQlSVE1QSW9jdGxHZXRTaXRlU3VydmV5KHBBZCwgd3JxKTsKKwkJICAgIGJyZWFrOworI2lmZGVmIERCRworCQljYXNlIFJUUFJJVl9JT0NUTF9NQUM6CisJCQlSVE1QSW9jdGxNQUMocEFkLCB3cnEpOworCQkJYnJlYWs7CisJCWNhc2UgUlRQUklWX0lPQ1RMX0UyUDoKKwkJCVJUTVBJb2N0bEUyUFJPTShwQWQsIHdycSk7CisJCQlicmVhazsKKyNlbmRpZiAvLyBEQkcgLy8KKyAgICAgICAgY2FzZSBTSU9DRVRIVE9PTDoKKyAgICAgICAgICAgICAgICBicmVhazsKKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIklPQ1RMOjp1bmtub3duIElPQ1RMJ3MgY21kID0gMHglMDh4XG4iLCBjbWQpKTsKKwkJCVN0YXR1cyA9IC1FT1BOT1RTVVBQOworCQkJYnJlYWs7CisJfQorCisgICAgaWYoU3RhdGVNYWNoaW5lVG91Y2hlZCkgLy8gVXBwZXIgbGF5ZXIgc2VudCBhIE1MTUUtcmVsYXRlZCBvcGVyYXRpb25zCisgICAgCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKKworCXJldHVybiBTdGF0dXM7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFNTSUQKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfU1NJRF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgTkRJU184MDJfMTFfU1NJRCAgICAgICAgICAgICAgICAgICAgU3NpZCwgKnBTc2lkPU5VTEw7CisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGVNYWNoaW5lVG91Y2hlZCA9IEZBTFNFOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBUUlVFOworCisgICAgaWYoIHN0cmxlbihhcmcpIDw9IE1BWF9MRU5fT0ZfU1NJRCkKKyAgICB7CisgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZTc2lkLCBzaXplb2YoTkRJU184MDJfMTFfU1NJRCkpOworICAgICAgICBpZiAoc3RybGVuKGFyZykgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoU3NpZC5Tc2lkLCBhcmcsIHN0cmxlbihhcmcpKTsKKyAgICAgICAgICAgIFNzaWQuU3NpZExlbmd0aCA9IHN0cmxlbihhcmcpOworICAgICAgICB9CisgICAgICAgIGVsc2UgICAvL0FOWSBzc2lkCisgICAgICAgIHsKKyAgICAgICAgICAgIFNzaWQuU3NpZExlbmd0aCA9IDA7CisJCSAgICBtZW1jcHkoU3NpZC5Tc2lkLCAiIiwgMCk7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfSU5GUkE7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKwkgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQ7CisJCX0KKyAgICAgICAgcFNzaWQgPSAmU3NpZDsKKworICAgICAgICBpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKKyAgICAgICAgeworICAgICAgICAgICAgUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRSBidXN5LCByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7CisgICAgICAgIH0KKworICAgICAgICBwQWRhcHRlci0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IFRSVUU7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOworCQlwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOworCisgICAgICAgIE1sbWVFbnF1ZXVlKHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKyAgICAgICAgICAgICAgICAgICAgT0lEXzgwMl8xMV9TU0lELAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoTkRJU184MDJfMTFfU1NJRCksCisgICAgICAgICAgICAgICAgICAgIChWT0lEICopcFNzaWQpOworCisgICAgICAgIFN0YXRlTWFjaGluZVRvdWNoZWQgPSBUUlVFOworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfU1NJRF9Qcm9jOjooTGVuPSVkLFNzaWQ9JXMpXG4iLCBTc2lkLlNzaWRMZW5ndGgsIFNzaWQuU3NpZCkpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHN1Y2Nlc3MgPSBGQUxTRTsKKworICAgIGlmIChTdGF0ZU1hY2hpbmVUb3VjaGVkKSAvLyBVcHBlciBsYXllciBzZW50IGEgTUxNRS1yZWxhdGVkIG9wZXJhdGlvbnMKKyAgICAJUlQyOFhYX01MTUVfSEFORExFUihwQWRhcHRlcik7CisKKyAgICByZXR1cm4gc3VjY2VzczsKK30KKworI2lmZGVmIFdNTV9TVVBQT1JUCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXbW1DYXBhYmxlIEVuYWJsZSBvciBEaXNhYmxlCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQJU2V0X1dtbUNhcGFibGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJQk9PTEVBTgliV21tQ2FwYWJsZTsKKworCWJXbW1DYXBhYmxlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCWlmICgoYldtbUNhcGFibGUgPT0gMSkKKyNpZmRlZiBSVDI4NzAKKwkJJiYgKHBBZC0+TnVtYmVyT2ZQaXBlcyA+PSA1KQorI2VuZGlmIC8vIFJUMjg3MCAvLworCQkpCisJCXBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlID0gVFJVRTsKKwllbHNlIGlmIChiV21tQ2FwYWJsZSA9PSAwKQorCQlwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSA9IEZBTFNFOworCWVsc2UKKwkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkIGFyZ3VtZW50CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfV21tQ2FwYWJsZV9Qcm9jOjooYldtbUNhcGFibGU9JWQpXG4iLAorCQlwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gV01NX1NVUFBPUlQgLy8KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgTmV0d29yayBUeXBlKEluZnJhc3RydWN0dXJlL0FkaG9jIG1vZGUpCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X05ldHdvcmtUeXBlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBVSU5UMzIJVmFsdWUgPSAwOworCisgICAgaWYgKHN0cmNtcChhcmcsICJBZGhvYyIpID09IDApCisJeworCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlICE9IEJTU19BREhPQykKKwkJeworCQkJLy8gQ29uZmlnIGhhcyBjaGFuZ2VkCisJCQlwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOworICAgICAgICAgICAgaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgUlhfRklMVFJfQ0ZHLCBTVEFOT1JNQUwpOworICAgICAgICAgICAgICAgIFJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCQkJVmFsdWUgJj0gKH4weDgwKTsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworICAgICAgICAgICAgICAgIE9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICBMaW5rRG93bihwQWRhcHRlciwgRkFMU0UpOworICAgICAgICAgICAgfQorCQkJaWYgKElORlJBX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQkvL0JPT0xFQU4gQ2FuY2VsbGVkOworCQkJCS8vIFNldCB0aGUgQXV0b1JlY29ubmVjdFNzaWQgdG8gcHJldmVudCBpdCByZWNvbm5lY3QgdG8gb2xkIFNTSUQKKwkJCQkvLyBTaW5jZSBjYWxsaW5nIHRoaXMgaW5kaWNhdGUgdXNlciBkb24ndCB3YW50IHRvIGNvbm5lY3QgdG8gdGhhdCBTU0lEIGFueW1vcmUuCisJCQkJcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW49IDMyOworCQkJCU5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7CisKKwkJCQlMaW5rRG93bihwQWRhcHRlciwgRkFMU0UpOworCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVCBFdmVudCBCQiFcbiIpKTsKKwkJCX0KKwkJfQorCQlwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfQURIT0M7CisgICAgICAgIHBBZGFwdGVyLT5uZXRfZGV2LT50eXBlID0gcEFkYXB0ZXItPlN0YUNmZy5PcmlEZXZUeXBlOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+U2V0X05ldHdvcmtUeXBlX1Byb2M6OihBRC1IT0MpXG4iKSk7CisJfQorICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICJJbmZyYSIpID09IDApCisJeworCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlICE9IEJTU19JTkZSQSkKKwkJeworCQkJLy8gQ29uZmlnIGhhcyBjaGFuZ2VkCisJCQlwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOworICAgICAgICAgICAgaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgUlhfRklMVFJfQ0ZHLCBTVEFOT1JNQUwpOworICAgICAgICAgICAgICAgIFJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCQkJVmFsdWUgJj0gKH4weDgwKTsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworICAgICAgICAgICAgICAgIE9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICBMaW5rRG93bihwQWRhcHRlciwgRkFMU0UpOworICAgICAgICAgICAgfQorCQkJaWYgKEFESE9DX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQkvLyBTZXQgdGhlIEF1dG9SZWNvbm5lY3RTc2lkIHRvIHByZXZlbnQgaXQgcmVjb25uZWN0IHRvIG9sZCBTU0lECisJCQkJLy8gU2luY2UgY2FsbGluZyB0aGlzIGluZGljYXRlIHVzZXIgZG9uJ3Qgd2FudCB0byBjb25uZWN0IHRvIHRoYXQgU1NJRCBhbnltb3JlLgorCQkJCXBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuPSAzMjsKKwkJCQlOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pOworCisJCQkJTGlua0Rvd24ocEFkYXB0ZXIsIEZBTFNFKTsKKwkJCX0KKwkJfQorCQlwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfSU5GUkE7CisgICAgICAgIHBBZGFwdGVyLT5uZXRfZGV2LT50eXBlID0gcEFkYXB0ZXItPlN0YUNmZy5PcmlEZXZUeXBlOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+U2V0X05ldHdvcmtUeXBlX1Byb2M6OihJTkZSQSlcbiIpKTsKKworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfSU5GUkE7CisJfQorICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICJNb25pdG9yIikgPT0gMCkKKyAgICB7CisJCVVDSEFSCWJicFZhbHVlID0gMDsKKwkJQkNOX1RJTUVfQ0ZHX1NUUlVDIGNzcjsKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19JTkZSQV9PTik7CisgICAgICAgIE9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfQURIT0NfT04pOworCQlPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworCQkvLyBkaXNhYmxlIGFsbCBwZXJpb2RpYyBzdGF0ZSBtYWNoaW5lCisJCXBBZGFwdGVyLT5TdGFDZmcuYkF1dG9SZWNvbm5lY3QgPSBGQUxTRTsKKwkJLy8gcmVzZXQgYWxsIG1sbWUgc3RhdGUgbWFjaGluZQorCQlSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQgXG4iKSk7CisgICAgICAgIGlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID09IDApCisgICAgICAgIHsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQU5fTUlYRUQpCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IDM2OworICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSA2OworICAgICAgICB9CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIE5fQ2hhbm5lbENoZWNrKHBBZGFwdGVyKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCWlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCAmJgorICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDAgJiYKKyAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9PSBFWFRDSEFfQUJPVkUpCisJCXsKKwkJCS8vIDQwTUh6ICxjb250cm9sIGNoYW5uZWwgYXQgbG93ZXIKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCAmYmJwVmFsdWUpOworCQkJYmJwVmFsdWUgJj0gKH4weDE4KTsKKwkJCWJicFZhbHVlIHw9IDB4MTA7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsIGJicFZhbHVlKTsKKwkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7CisJCQkvLyAgUlggOiBjb250cm9sIGNoYW5uZWwgYXQgbG93ZXIKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IzLCAmYmJwVmFsdWUpOworCQkJYmJwVmFsdWUgJj0gKH4weDIwKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SMywgYmJwVmFsdWUpOworCisJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfQkFORF9DRkcsICZWYWx1ZSk7CisJCQlWYWx1ZSAmPSAweGZmZmZmZmZlOworCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9CQU5EX0NGRywgVmFsdWUpOworCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCArIDI7CisgICAgICAgICAgICBBc2ljU3dpdGNoQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOworCQkgICAgQXNpY0xvY2tDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJXXzQwICxjb250cm9sX2NoYW5uZWwoJWQpLCBDZW50cmFsQ2hhbm5lbCglZCkgXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCkpOworCQl9CisJCWVsc2UgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEICYmCisgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwICYmCisgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9PSBFWFRDSEFfQkVMT1cpCisJCXsKKwkJCS8vIDQwTUh6ICxjb250cm9sIGNoYW5uZWwgYXQgdXBwZXIKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCAmYmJwVmFsdWUpOworCQkJYmJwVmFsdWUgJj0gKH4weDE4KTsKKwkJCWJicFZhbHVlIHw9IDB4MTA7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsIGJicFZhbHVlKTsKKwkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7CisJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfQkFORF9DRkcsICZWYWx1ZSk7CisJCQlWYWx1ZSB8PSAweDE7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7CisKKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IzLCAmYmJwVmFsdWUpOworCQkJYmJwVmFsdWUgfD0gKDB4MjApOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IzLCBiYnBWYWx1ZSk7CisJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsIC0gMjsKKyAgICAgICAgICAgIEFzaWNTd2l0Y2hDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7CisJCSAgICBBc2ljTG9ja0NoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQldfNDAgLGNvbnRyb2xfY2hhbm5lbCglZCksIENlbnRyYWxDaGFubmVsKCVkKSBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKSk7CisJCX0KKwkJZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQl7CisJCQkvLyAyME1IegorCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsICZiYnBWYWx1ZSk7CisJCQliYnBWYWx1ZSAmPSAofjB4MTgpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCBiYnBWYWx1ZSk7CisJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzIwOworCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOworCQkJQXNpY0xvY2tDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQldfMjAsIENoYW5uZWwoJWQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJfQorCQkvLyBFbmFibGUgUnggd2l0aCBwcm9taXNjdW91cyByZWNlcHRpb24KKwkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBSWF9GSUxUUl9DRkcsIDB4Myk7CisJCS8vIEFTSUMgc3VwcG9yc3RzIHNuaWZmZXIgZnVuY3Rpb24gd2l0aCByZXBsYWNpbmcgUlNTSSB3aXRoIHRpbWVzdGFtcC4KKwkJLy9SVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOworCQkvL1ZhbHVlIHw9ICgweDgwKTsKKwkJLy9SVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCQkvLyBkaXNhYmxlIHN5bmMKKwkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIEJDTl9USU1FX0NGRywgJmNzci53b3JkKTsKKwkJY3NyLmZpZWxkLmJCZWFjb25HZW4gPSAwOworCQljc3IuZmllbGQuYlRCVFRFbmFibGUgPSAwOworCQljc3IuZmllbGQuVHNmU3luY01vZGUgPSAwOworCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIEJDTl9USU1FX0NGRywgY3NyLndvcmQpOworCisJCXBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19NT05JVE9SOworICAgICAgICBwQWRhcHRlci0+bmV0X2Rldi0+dHlwZSA9IEFSUEhSRF9JRUVFODAyMTFfUFJJU007IC8vQVJQSFJEX0lFRUU4MDIxMTsgLy8gSUVFRTgwMjExCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5TZXRfTmV0d29ya1R5cGVfUHJvYzo6KE1PTklUT1IpXG4iKSk7CisgICAgfQorCisgICAgLy8gUmVzZXQgUmFsaW5rIHN1cHBsaWNhbnQgdG8gbm90IHVzZSwgaXQgd2lsbCBiZSBzZXQgdG8gc3RhcnQgd2hlbiBVSSBzZXQgUE1LIGtleQorICAgIHBBZGFwdGVyLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfTmV0d29ya1R5cGVfUHJvYzo6KE5ldHdvcmtUeXBlPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlKSk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQXV0aGVudGljYXRpb24gbW9kZQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9BdXRoTW9kZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaWYgKChzdHJjbXAoYXJnLCAiV0VQQVVUTyIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid2VwYXV0byIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaDsKKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIk9QRU4iKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIm9wZW4iKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJTSEFSRUQiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgInNoYXJlZCIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkOworICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV1BBUFNLIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGFwc2siKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzsKKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldQQU5PTkUiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndwYW5vbmUiKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXUEEyUFNLIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGEycHNrIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldQQSIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid3BhIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEE7CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXUEEyIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGEyIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQXV0aE1vZGVfUHJvYzo6KEF1dGhNb2RlPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSkpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IEVuY3J5cHRpb24gVHlwZQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9FbmNyeXBUeXBlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpZiAoKHN0cmNtcChhcmcsICJOT05FIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJub25lIikgPT0gMCkpCisgICAgeworICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyICAgID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCSAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICAgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgfQorICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV0VQIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3ZXAiKSA9PSAwKSkKKyAgICB7CisgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgICAgID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworCSAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICAgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKyAgICB9CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJUS0lQIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ0a2lwIikgPT0gMCkpCisgICAgeworICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA8IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgICAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyICAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKwkgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKyAgICB9CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJBRVMiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgImFlcyIpID09IDApKQorICAgIHsKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisJICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfRW5jcnlwVHlwZV9Qcm9jOjooRW5jcnlwVHlwZT0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzKSk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgRGVmYXVsdCBLZXkgSUQKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfRGVmYXVsdEtleUlEX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlJZHg7CisKKyAgICBLZXlJZHggPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworICAgIGlmKChLZXlJZHggPj0gMSApICYmIChLZXlJZHggPD0gNCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKFVDSEFSKSAoS2V5SWR4IC0gMSApOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkIGFyZ3VtZW50CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfRGVmYXVsdEtleUlEX1Byb2M6OihEZWZhdWx0S2V5SUQ9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdFUCBLRVkxCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0tleTFfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUxlbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZz1DSVBIRVJfV0VQNjQ7CisKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICBLZXlMZW4gPSBzdHJsZW4oYXJnKTsKKworICAgIHN3aXRjaCAoS2V5TGVuKQorICAgIHsKKyAgICAgICAgY2FzZSA1OiAvL3dlcCA0MCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6KEtleTE9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEwOiAvL3dlcCA0MCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjooS2V5MT0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEzOiAvL3dlcCAxMDQgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjooS2V5MT0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjY6IC8vd2VwIDEwNCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6KEtleTE9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogLy9JbnZhbGlkIGFyZ3VtZW50CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjpJbnZhbGlkIGFyZ3VtZW50ICg9JXMpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworICAgIC8vIFNldCBrZXlzIChpbnRvIEFTSUMpCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICA7ICAgLy8gbm90IHN1cHBvcnQKKyAgICBlbHNlICAgIC8vIE9sZCBXRVAgc3R1ZmYKKyAgICB7CisgICAgICAgIEFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV0VQIEtFWTIKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfS2V5Ml9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5TGVuOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnPUNJUEhFUl9XRVA2NDsKKworICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgIEtleUxlbiA9IHN0cmxlbihhcmcpOworCisgICAgc3dpdGNoIChLZXlMZW4pCisgICAgeworICAgICAgICBjYXNlIDU6IC8vd2VwIDQwIEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjooS2V5Mj0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTA6IC8vd2VwIDQwIEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkyX1Byb2M6OihLZXkyPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTM6IC8vd2VwIDEwNCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkyX1Byb2M6OihLZXkyPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyNjogLy93ZXAgMTA0IEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjooS2V5Mj0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvL0ludmFsaWQgYXJndW1lbnQKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkyX1Byb2M6OkludmFsaWQgYXJndW1lbnQgKD0lcylcbiIsIGFyZykpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworICAgIC8vIFNldCBrZXlzIChpbnRvIEFTSUMpCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICA7ICAgLy8gbm90IHN1cHBvcnQKKyAgICBlbHNlICAgIC8vIE9sZCBXRVAgc3R1ZmYKKyAgICB7CisgICAgICAgIEFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5DaXBoZXJBbGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdFUCBLRVkzCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0tleTNfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUxlbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZz1DSVBIRVJfV0VQNjQ7CisKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICBLZXlMZW4gPSBzdHJsZW4oYXJnKTsKKworICAgIHN3aXRjaCAoS2V5TGVuKQorICAgIHsKKyAgICAgICAgY2FzZSA1OiAvL3dlcCA0MCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTNfUHJvYzo6KEtleTM9JXMgYW5kIHR5cGU9QXNjaWkpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEwOiAvL3dlcCA0MCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5M19Qcm9jOjooS2V5Mz0lcyBhbmQgdHlwZT1IZXgpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEzOiAvL3dlcCAxMDQgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5M19Qcm9jOjooS2V5Mz0lcyBhbmQgdHlwZT1Bc2NpaSlcbiIsIGFyZykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjY6IC8vd2VwIDEwNCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTNfUHJvYzo6KEtleTM9JXMgYW5kIHR5cGU9SGV4KVxuIiwgYXJnKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogLy9JbnZhbGlkIGFyZ3VtZW50CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5M19Qcm9jOjpJbnZhbGlkIGFyZ3VtZW50ICg9JXMpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisKKyAgICAvLyBTZXQga2V5cyAoaW50byBBU0lDKQorICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgOyAgIC8vIG5vdCBzdXBwb3J0CisgICAgZWxzZSAgICAvLyBPbGQgV0VQIHN0dWZmCisgICAgeworICAgICAgICBBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uQ2lwaGVyQWxnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXRVAgS0VZNAorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9LZXk0X1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlMZW47CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGc9Q0lQSEVSX1dFUDY0OworCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgS2V5TGVuID0gc3RybGVuKGFyZyk7CisKKyAgICBzd2l0Y2ggKEtleUxlbikKKyAgICB7CisgICAgICAgIGNhc2UgNTogLy93ZXAgNDAgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OihLZXk0PSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMDogLy93ZXAgNDAgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6KEtleTQ9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMzogLy93ZXAgMTA0IEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6KEtleTQ9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI2OiAvL3dlcCAxMDQgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OihLZXk0PSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8vSW52YWxpZCBhcmd1bWVudAorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6SW52YWxpZCBhcmd1bWVudCAoPSVzKVxuIiwgYXJnKSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCisgICAgLy8gU2V0IGtleXMgKGludG8gQVNJQykKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIDsgICAvLyBub3Qgc3VwcG9ydAorICAgIGVsc2UgICAgLy8gT2xkIFdFUCBzdHVmZgorICAgIHsKKyAgICAgICAgQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLkNpcGhlckFsZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXUEEgUFNLIGtleQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9XUEFQU0tfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgIGtleU1hdGVyaWFsWzQwXTsKKworICAgIGlmICgocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spICYmCisgICAgICAgIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spICYmCisJICAgIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisJCSkKKyAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9XUEFQU0tfUHJvYzo6KFdQQVBTSz0lcylcbiIsIGFyZykpOworCisgICAgTmRpc1plcm9NZW1vcnkoa2V5TWF0ZXJpYWwsIDQwKTsKKworICAgIGlmICgoc3RybGVuKGFyZykgPCA4KSB8fCAoc3RybGVuKGFyZykgPiA2NCkpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQgZmFpbGVkISEoV1BBUFNLPSVzKSwgV1BBUFNLIGtleS1zdHJpbmcgcmVxdWlyZWQgOCB+IDY0IGNoYXJhY3RlcnMgXG4iLCBhcmcpKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGlmIChzdHJsZW4oYXJnKSA9PSA2NCkKKyAgICB7CisgICAgICAgIEF0b0goYXJnLCBrZXlNYXRlcmlhbCwgMzIpOworICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLlBNSywga2V5TWF0ZXJpYWwsIDMyKTsKKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBQYXNzd29yZEhhc2goKGNoYXIgKilhcmcsIHBBZGFwdGVyLT5NbG1lQXV4LlNzaWQsIHBBZGFwdGVyLT5NbG1lQXV4LlNzaWRMZW4sIGtleU1hdGVyaWFsKTsKKyAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlN0YUNmZy5QTUssIGtleU1hdGVyaWFsLCAzMik7CisgICAgfQorCisKKworICAgIGlmKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MgJiYKKyAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisgICAgeworICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX05PVFVTRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gU3RhcnQgU1RBIHN1cHBsaWNhbnQgc3RhdGUgbWFjaGluZQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfU1RBUlQ7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFBvd2VyIFNhdmluZyBtb2RlCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X1BTTW9kZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfSU5GUkEpCisgICAgeworICAgICAgICBpZiAoKHN0cmNtcChhcmcsICJNYXhfUFNQIikgPT0gMCkgfHwKKwkJCShzdHJjbXAoYXJnLCAibWF4X3BzcCIpID09IDApIHx8CisJCQkoc3RyY21wKGFyZywgIk1BWF9QU1AiKSA9PSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZG8gTk9UIHR1cm4gb24gUFNNIGJpdCBoZXJlLCB3YWl0IHVudGlsIE1sbWVDaGVja0ZvclBzbUNoYW5nZSgpCisgICAgICAgICAgICAvLyB0byBleGNsdWRlIGNlcnRhaW4gc2l0dWF0aW9ucy4KKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1A7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1A7CisgICAgICAgICAgICBPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSA1OworCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJGYXN0X1BTUCIpID09IDApIHx8CisJCQkJIChzdHJjbXAoYXJnLCAiZmFzdF9wc3AiKSA9PSAwKSB8fAorICAgICAgICAgICAgICAgICAoc3RyY21wKGFyZywgIkZBU1RfUFNQIikgPT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tGb3JQc21DaGFuZ2UoKQorICAgICAgICAgICAgLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCisgICAgICAgICAgICBPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOworICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1A7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSAzOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiTGVnYWN5X1BTUCIpID09IDApIHx8CisgICAgICAgICAgICAgICAgIChzdHJjbXAoYXJnLCAibGVnYWN5X3BzcCIpID09IDApIHx8CisgICAgICAgICAgICAgICAgIChzdHJjbXAoYXJnLCAiTEVHQUNZX1BTUCIpID09IDApKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBkbyBOT1QgdHVybiBvbiBQU00gYml0IGhlcmUsIHdhaXQgdW50aWwgTWxtZUNoZWNrRm9yUHNtQ2hhbmdlKCkKKyAgICAgICAgICAgIC8vIHRvIGV4Y2x1ZGUgY2VydGFpbiBzaXR1YXRpb25zLgorICAgICAgICAgICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1A7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1A7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCA9IDM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvL0RlZmF1bHQgTmRpczgwMl8xMVBvd2VyTW9kZUNBTQorICAgICAgICAgICAgLy8gY2xlYXIgUFNNIGJpdCBpbW1lZGlhdGVseQorICAgICAgICAgICAgTWxtZVNldFBzbUJpdChwQWRhcHRlciwgUFdSX0FDVElWRSk7CisgICAgICAgICAgICBPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOworICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNOworICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVDQU07CisgICAgICAgIH0KKworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfUFNNb2RlX1Byb2M6OihQU01vZGU9JWxkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlKSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisKKyAgICByZXR1cm4gVFJVRTsKK30KKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdwYVN1cHBvcnQgZmxhZy4KKyAgICBWYWx1ZToKKyAgICAgICAgMDogRHJpdmVyIGlnbm9yZSB3cGFfc3VwcGxpY2FudC4KKyAgICAgICAgMTogd3BhX3N1cHBsaWNhbnQgaW5pdGlhdGVzIHNjYW5uaW5nIGFuZCBBUCBzZWxlY3Rpb24uCisgICAgICAgIDI6IGRyaXZlciB0YWtlcyBjYXJlIG9mIHNjYW5uaW5nLCBBUCBzZWxlY3Rpb24sIGFuZCBJRUVFIDgwMi4xMSBhc3NvY2lhdGlvbiBwYXJhbWV0ZXJzLgorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9XcGFfU3VwcG9ydCgKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisKKyAgICBpZiAoIHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMCkKKyAgICAgICAgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRTsKKyAgICBlbHNlIGlmICggc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAxKQorICAgICAgICBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSBXUEFfU1VQUExJQ0FOVF9FTkFCTEU7CisgICAgZWxzZSBpZiAoIHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMikKKyAgICAgICAgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFX1dJVEhfV0VCX1VJOworICAgIGVsc2UKKyAgICAgICAgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRTsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9XcGFfU3VwcG9ydDo6KFdwYVN1cHBsaWNhbnRVUD0lZClcbiIsIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisjaWZkZWYgREJHCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFJlYWQgLyBXcml0ZSBNQUMKKyAgICBBcmd1bWVudHM6CisgICAgICAgIHBBZGFwdGVyICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgICAgIHdycSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpb2N0bCBhcmd1bWVudAorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOb25lCisKKyAgICBOb3RlOgorICAgICAgICBVc2FnZToKKyAgICAgICAgICAgICAgIDEuKSBpd3ByaXYgcmEwIG1hYyAwICAgICAgICA9PT4gcmVhZCBNQUMgd2hlcmUgQWRkcj0weDAKKyAgICAgICAgICAgICAgIDIuKSBpd3ByaXYgcmEwIG1hYyAwPTEyICAgICA9PT4gd3JpdGUgTUFDIHdoZXJlIEFkZHI9MHgwLCB2YWx1ZT0xMgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworVk9JRCBSVE1QSW9jdGxNQUMoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglzdHJ1Y3QgaXdyZXEJKndycSkKK3sKKwlDSEFSCQkJCSp0aGlzX2NoYXI7CisJQ0hBUgkJCQkqdmFsdWU7CisJSU5UCQkJCQlqID0gMCwgayA9IDA7CisJQ0hBUgkJCQltc2dbMTAyNF07CisJQ0hBUgkJCQlhcmdbMjU1XTsKKwlVTE9ORwkJCQltYWNBZGRyID0gMDsKKwlVQ0hBUgkJCQl0ZW1wWzE2XSwgdGVtcDJbMTZdOworCVVJTlQzMgkJCQltYWNWYWx1ZSA9IDA7CisJSU5UCQkJCQlTdGF0dXM7CisKKworCW1lbXNldChtc2csIDB4MDAsIDEwMjQpOworCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggPiAxKSAvL05vIHBhcmFtZXRlcnMuCisJeworCSAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihhcmcsIHdycS0+dS5kYXRhLnBvaW50ZXIsICh3cnEtPnUuZGF0YS5sZW5ndGggPiAyNTUpID8gMjU1IDogd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJc3ByaW50Zihtc2csICJcbiIpOworCisJCS8vUGFyc2luZyBSZWFkIG9yIFdyaXRlCisJICAgIHRoaXNfY2hhciA9IGFyZzsKKwkJaWYgKCEqdGhpc19jaGFyKQorCQkJZ290byBuZXh0OworCisJCWlmICgodmFsdWUgPSBydHN0cmNocih0aGlzX2NoYXIsICc9JykpICE9IE5VTEwpCisJCQkqdmFsdWUrKyA9IDA7CisKKwkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKQorCQl7IC8vUmVhZAorCQkJLy8gU2FuaXR5IGNoZWNrCisJCQlpZihzdHJsZW4odGhpc19jaGFyKSA+IDQpCisJCQkJZ290byBuZXh0OworCisJCQlqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCWlmKHRoaXNfY2hhcltqXSA+ICdmJyB8fCB0aGlzX2NoYXJbal0gPCAnMCcpCisJCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy8gTWFjIEFkZHIKKwkJCWsgPSBqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCXRoaXNfY2hhcls0LWsral0gPSB0aGlzX2NoYXJbal07CisJCQl9CisKKwkJCXdoaWxlKGsgPCA0KQorCQkJCXRoaXNfY2hhclszLWsrK109JzAnOworCQkJdGhpc19jaGFyWzRdPSdcMCc7CisKKwkJCWlmKHN0cmxlbih0aGlzX2NoYXIpID09IDQpCisJCQl7CisJCQkJQXRvSCh0aGlzX2NoYXIsIHRlbXAsIDIpOworCQkJCW1hY0FkZHIgPSAqdGVtcCoyNTYgKyB0ZW1wWzFdOworCQkJCWlmIChtYWNBZGRyIDwgMHhGRkZGKQorCQkJCXsKKwkJCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIG1hY0FkZHIsICZtYWNWYWx1ZSk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1hY0FkZHI9JWx4LCBNYWNWYWx1ZT0leFxuIiwgbWFjQWRkciwgbWFjVmFsdWUpKTsKKwkJCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICJbMHglMDhsWF06JTA4WCAgIiwgbWFjQWRkciAsIG1hY1ZhbHVlKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgYmJwCisJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZQorCQl7IC8vV3JpdGUKKwkJCW1lbWNweSgmdGVtcDIsIHZhbHVlLCBzdHJsZW4odmFsdWUpKTsKKwkJCXRlbXAyW3N0cmxlbih2YWx1ZSldID0gJ1wwJzsKKworCQkJLy8gU2FuaXR5IGNoZWNrCisJCQlpZigoc3RybGVuKHRoaXNfY2hhcikgPiA0KSB8fCBzdHJsZW4odGVtcDIpID4gOCkKKwkJCQlnb3RvIG5leHQ7CisKKwkJCWogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJaWYodGhpc19jaGFyW2pdID4gJ2YnIHx8IHRoaXNfY2hhcltqXSA8ICcwJykKKwkJCQkJcmV0dXJuOworCQkJfQorCisJCQlqID0gc3RybGVuKHRlbXAyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJaWYodGVtcDJbal0gPiAnZicgfHwgdGVtcDJbal0gPCAnMCcpCisJCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy9NQUMgQWRkcgorCQkJayA9IGogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJdGhpc19jaGFyWzQtaytqXSA9IHRoaXNfY2hhcltqXTsKKwkJCX0KKworCQkJd2hpbGUoayA8IDQpCisJCQkJdGhpc19jaGFyWzMtaysrXT0nMCc7CisJCQl0aGlzX2NoYXJbNF09J1wwJzsKKworCQkJLy9NQUMgdmFsdWUKKwkJCWsgPSBqID0gc3RybGVuKHRlbXAyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJdGVtcDJbOC1rK2pdID0gdGVtcDJbal07CisJCQl9CisKKwkJCXdoaWxlKGsgPCA4KQorCQkJCXRlbXAyWzctaysrXT0nMCc7CisJCQl0ZW1wMls4XT0nXDAnOworCisJCQl7CisJCQkJQXRvSCh0aGlzX2NoYXIsIHRlbXAsIDIpOworCQkJCW1hY0FkZHIgPSAqdGVtcCoyNTYgKyB0ZW1wWzFdOworCisJCQkJQXRvSCh0ZW1wMiwgdGVtcCwgNCk7CisJCQkJbWFjVmFsdWUgPSAqdGVtcCoyNTYqMjU2KjI1NiArIHRlbXBbMV0qMjU2KjI1NiArIHRlbXBbMl0qMjU2ICsgdGVtcFszXTsKKworCQkJCS8vIGRlYnVnIG1vZGUKKwkJCQlpZiAobWFjQWRkciA9PSAoSFdfREVCVUdfU0VUVElOR19CQVNFICsgNCkpCisJCQkJeworCQkJCQkvLyAweDJiZjQ6IGJ5dGUwIG5vbi16ZXJvOiBlbmFibGUgUjE3IHR1bmluZywgMDogZGlzYWJsZSBSMTcgdHVuaW5nCisgICAgICAgICAgICAgICAgICAgIGlmIChtYWNWYWx1ZSAmIDB4MDAwMDAwZmYpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5CYnBUdW5pbmcuYkVuYWJsZSA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoInR1cm4gb24gUjE3IHR1bmluZ1xuIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgUjY2OworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkJicFR1bmluZy5iRW5hYmxlID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICBSNjYgPSAweDI2ICsgR0VUX0xOQV9HQUlOKHBBZGFwdGVyKTsKKyNpZmRlZiBSQUxJTktfQVRFCisJCQkJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCQkJCXsKKwkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNjYsICgweDI2ICsgR0VUX0xOQV9HQUlOKHBBZGFwdGVyKSkpOworCQkJCQkJfQorCQkJCQkJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNjYsICgweDI2ICsgR0VUX0xOQV9HQUlOKHBBZGFwdGVyKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJ0dXJuIG9mZiBSMTcgdHVuaW5nLCByZXN0b3JlIHRvIDB4JTAyeFxuIiwgUjY2KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKwkJCQkJcmV0dXJuOworCQkJCX0KKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1hY0FkZHI9JTAybHgsIE1hY1ZhbHVlPTB4JXhcbiIsIG1hY0FkZHIsIG1hY1ZhbHVlKSk7CisKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIG1hY0FkZHIsIG1hY1ZhbHVlKTsKKwkJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIlsweCUwOGxYXTolMDhYICAiLCBtYWNBZGRyLCBtYWNWYWx1ZSk7CisJCQl9CisJCX0KKwl9CituZXh0OgorCWlmKHN0cmxlbihtc2cpID09IDEpCisJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiPT09PkVycm9yIGNvbW1hbmQgZm9ybWF0ISIpOworCisJLy8gQ29weSB0aGUgaW5mb3JtYXRpb24gaW50byB0aGUgdXNlciBidWZmZXIKKwl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4obXNnKTsKKwlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgbXNnLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09UlRNUElvY3RsTUFDXG5cbiIpKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBSZWFkIC8gV3JpdGUgRTJQUk9NCisgICAgQXJndW1lbnRzOgorICAgICAgICBwQWRhcHRlciAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgorICAgICAgICB3cnEgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW9jdGwgYXJndW1lbnQKKworICAgIFJldHVybiBWYWx1ZToKKyAgICAgICAgTm9uZQorCisgICAgTm90ZToKKyAgICAgICAgVXNhZ2U6CisgICAgICAgICAgICAgICAxLikgaXdwcml2IHJhMCBlMnAgMCAgICAgCT09PiByZWFkIEUyUFJPTSB3aGVyZSBBZGRyPTB4MAorICAgICAgICAgICAgICAgMi4pIGl3cHJpdiByYTAgZTJwIDA9MTIzNCAgICA9PT4gd3JpdGUgRTJQUk9NIHdoZXJlIEFkZHI9MHgwLCB2YWx1ZT0xMjM0CisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBJb2N0bEUyUFJPTSgKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCXN0cnVjdCBpd3JlcQkqd3JxKQoreworCUNIQVIJCQkJKnRoaXNfY2hhcjsKKwlDSEFSCQkJCSp2YWx1ZTsKKwlJTlQJCQkJCWogPSAwLCBrID0gMDsKKwlDSEFSCQkJCW1zZ1sxMDI0XTsKKwlDSEFSCQkJCWFyZ1syNTVdOworCVVTSE9SVAkJCQllZXBBZGRyID0gMDsKKwlVQ0hBUgkJCQl0ZW1wWzE2XSwgdGVtcDJbMTZdOworCVVTSE9SVAkJCQllZXBWYWx1ZTsKKwlpbnQJCQkJCVN0YXR1czsKKworCisJbWVtc2V0KG1zZywgMHgwMCwgMTAyNCk7CisJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCA+IDEpIC8vTm8gcGFyYW1ldGVycy4KKwl7CisJICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKGFyZywgd3JxLT51LmRhdGEucG9pbnRlciwgKHdycS0+dS5kYXRhLmxlbmd0aCA+IDI1NSkgPyAyNTUgOiB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQlzcHJpbnRmKG1zZywgIlxuIik7CisKKwkgICAgLy9QYXJzaW5nIFJlYWQgb3IgV3JpdGUKKwkJdGhpc19jaGFyID0gYXJnOworCisKKwkJaWYgKCEqdGhpc19jaGFyKQorCQkJZ290byBuZXh0OworCisJCWlmICgodmFsdWUgPSBydHN0cmNocih0aGlzX2NoYXIsICc9JykpICE9IE5VTEwpCisJCQkqdmFsdWUrKyA9IDA7CisKKwkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKQorCQl7IC8vUmVhZAorCisJCQkvLyBTYW5pdHkgY2hlY2sKKwkJCWlmKHN0cmxlbih0aGlzX2NoYXIpID4gNCkKKwkJCQlnb3RvIG5leHQ7CisKKwkJCWogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJaWYodGhpc19jaGFyW2pdID4gJ2YnIHx8IHRoaXNfY2hhcltqXSA8ICcwJykKKwkJCQkJcmV0dXJuOworCQkJfQorCisJCQkvLyBFMlBST00gYWRkcgorCQkJayA9IGogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJdGhpc19jaGFyWzQtaytqXSA9IHRoaXNfY2hhcltqXTsKKwkJCX0KKworCQkJd2hpbGUoayA8IDQpCisJCQkJdGhpc19jaGFyWzMtaysrXT0nMCc7CisJCQl0aGlzX2NoYXJbNF09J1wwJzsKKworCQkJaWYoc3RybGVuKHRoaXNfY2hhcikgPT0gNCkKKwkJCXsKKwkJCQlBdG9IKHRoaXNfY2hhciwgdGVtcCwgMik7CisJCQkJZWVwQWRkciA9ICp0ZW1wKjI1NiArIHRlbXBbMV07CisJCQkJaWYgKGVlcEFkZHIgPCAweEZGRkYpCisJCQkJeworCQkJCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWRhcHRlciwgZWVwQWRkciwgZWVwVmFsdWUpOworCQkJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIlsweCUwNFhdOjB4JTA0WCAgIiwgZWVwQWRkciAsIGVlcFZhbHVlKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgYmJwCisJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZQorCQl7IC8vV3JpdGUKKwkJCW1lbWNweSgmdGVtcDIsIHZhbHVlLCBzdHJsZW4odmFsdWUpKTsKKwkJCXRlbXAyW3N0cmxlbih2YWx1ZSldID0gJ1wwJzsKKworCQkJLy8gU2FuaXR5IGNoZWNrCisJCQlpZigoc3RybGVuKHRoaXNfY2hhcikgPiA0KSB8fCBzdHJsZW4odGVtcDIpID4gOCkKKwkJCQlnb3RvIG5leHQ7CisKKwkJCWogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJaWYodGhpc19jaGFyW2pdID4gJ2YnIHx8IHRoaXNfY2hhcltqXSA8ICcwJykKKwkJCQkJcmV0dXJuOworCQkJfQorCQkJaiA9IHN0cmxlbih0ZW1wMik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCWlmKHRlbXAyW2pdID4gJ2YnIHx8IHRlbXAyW2pdIDwgJzAnKQorCQkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vTUFDIEFkZHIKKwkJCWsgPSBqID0gc3RybGVuKHRoaXNfY2hhcik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCXRoaXNfY2hhcls0LWsral0gPSB0aGlzX2NoYXJbal07CisJCQl9CisKKwkJCXdoaWxlKGsgPCA0KQorCQkJCXRoaXNfY2hhclszLWsrK109JzAnOworCQkJdGhpc19jaGFyWzRdPSdcMCc7CisKKwkJCS8vTUFDIHZhbHVlCisJCQlrID0gaiA9IHN0cmxlbih0ZW1wMik7CisJCQl3aGlsZShqLS0gPiAwKQorCQkJeworCQkJCXRlbXAyWzQtaytqXSA9IHRlbXAyW2pdOworCQkJfQorCisJCQl3aGlsZShrIDwgNCkKKwkJCQl0ZW1wMlszLWsrK109JzAnOworCQkJdGVtcDJbNF09J1wwJzsKKworCQkJQXRvSCh0aGlzX2NoYXIsIHRlbXAsIDIpOworCQkJZWVwQWRkciA9ICp0ZW1wKjI1NiArIHRlbXBbMV07CisKKwkJCUF0b0godGVtcDIsIHRlbXAsIDIpOworCQkJZWVwVmFsdWUgPSAqdGVtcCoyNTYgKyB0ZW1wWzFdOworCisJCQlSVDI4eHhfRUVQUk9NX1dSSVRFMTYocEFkYXB0ZXIsIGVlcEFkZHIsIGVlcFZhbHVlKTsKKwkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiWzB4JTAyWF06JTAyWCAgIiwgZWVwQWRkciwgZWVwVmFsdWUpOworCQl9CisJfQorbmV4dDoKKwlpZihzdHJsZW4obXNnKSA9PSAxKQorCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIj09PT5FcnJvciBjb21tYW5kIGZvcm1hdCEiKTsKKworCisJLy8gQ29weSB0aGUgaW5mb3JtYXRpb24gaW50byB0aGUgdXNlciBidWZmZXIKKwl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4obXNnKTsKKwlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgbXNnLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09UlRNUElvY3RsRTJQUk9NXG4iKSk7Cit9CisjZW5kaWYgLy8gREJHIC8vCisKKworCisKK0lOVCBTZXRfVEduV2lmaVRlc3RfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAwKQorICAgICAgICBwQWQtPlN0YUNmZy5iVEduV2lmaVRlc3QgPSBGQUxTRTsKKyAgICBlbHNlCisgICAgICAgIHBBZC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCA9IFRSVUU7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRiBTZXRfVEduV2lmaVRlc3RfUHJvYzo6KGJUR25XaWZpVGVzdD0lZClcbiIsIHBBZC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCkpOworCXJldHVybiBUUlVFOworfQorCitJTlQgU2V0X0xvbmdSZXRyeUxpbWl0X1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglQVUNIQVIJCQlhcmcpCit7CisJVFhfUlRZX0NGR19TVFJVQwl0eF9ydHlfY2ZnOworCVVDSEFSCQkJCUxvbmdSZXRyeUxpbWl0ID0gKFVDSEFSKXNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7CisJdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQgPSBMb25nUmV0cnlMaW1pdDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsIHR4X3J0eV9jZmcud29yZCk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUYgU2V0X0xvbmdSZXRyeUxpbWl0X1Byb2M6Oih0eF9ydHlfY2ZnPTB4JXgpXG4iLCB0eF9ydHlfY2ZnLndvcmQpKTsKKwlyZXR1cm4gVFJVRTsKK30KKworSU5UIFNldF9TaG9ydFJldHJ5TGltaXRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlUWF9SVFlfQ0ZHX1NUUlVDCXR4X3J0eV9jZmc7CisJVUNIQVIJCQkJU2hvcnRSZXRyeUxpbWl0ID0gKFVDSEFSKXNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisKKwlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7CisJdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJ0eUxpbWl0ID0gU2hvcnRSZXRyeUxpbWl0OworCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgdHhfcnR5X2NmZy53b3JkKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRiBTZXRfU2hvcnRSZXRyeUxpbWl0X1Byb2M6Oih0eF9ydHlfY2ZnPTB4JXgpXG4iLCB0eF9ydHlfY2ZnLndvcmQpKTsKKwlyZXR1cm4gVFJVRTsKK30KKworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKK0lOVCBTZXRfSWVlZTgwMjExZENsaWVudE1vZGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGlmIChzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDApCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUgPSBSdDgwMl8xMV9EX05vbmU7CisgICAgZWxzZSBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAxKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlID0gUnQ4MDJfMTFfRF9GbGV4aWJsZTsKKyAgICBlbHNlIGlmIChzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDIpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUgPSBSdDgwMl8xMV9EX1N0cmljdDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9JZWVlODAyZE1vZGVfUHJvYzo6KElFRUVFMDIxMWRNb2RlPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSkpOworICAgIHJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KKworI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKK0lOVCBTZXRfQ2FycmllckRldGVjdF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGlmIChzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDApCisgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID0gRkFMU0U7CisgICAgZWxzZQorICAgICAgICBwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9IFRSVUU7CisKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRiBTZXRfQ2FycmllckRldGVjdF9Qcm9jOjooQ2FycmllckRldGVjdC5FbmFibGU9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSkpOworCXJldHVybiBUUlVFOworfQorI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKworCitJTlQJU2hvd19BZGhvY19NYWNUYWJsZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBDSEFSCQkJZXh0cmEpCit7CisJSU5UIGk7CisKKwlzcHJpbnRmKGV4dHJhLCAiXG4iKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorCXNwcmludGYoZXh0cmEsICIlc0hUIE9wZXJhdGluZyBNb2RlIDogJWRcbiIsIGV4dHJhLCBwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisJc3ByaW50ZihleHRyYSwgIiVzXG4lLTE5cyUtNHMlLTRzJS03cyUtN3MlLTdzJS0xMHMlLTZzJS02cyUtNnMlLTZzXG4iLCBleHRyYSwKKwkJCSJNQUMiLCAiQUlEIiwgIkJTUyIsICJSU1NJMCIsICJSU1NJMSIsICJSU1NJMiIsICJQaE1kIiwgIkJXIiwgIk1DUyIsICJTR0kiLCAiU1RCQyIpOworCisJZm9yIChpPTE7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKKwl7CisJCVBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV07CisKKwkJaWYgKHN0cmxlbihleHRyYSkgPiAoSVdfUFJJVl9TSVpFX01BU0sgLSAzMCkpCisJCSAgICBicmVhazsKKwkJaWYgKChwRW50cnktPlZhbGlkQXNDTEkgfHwgcEVudHJ5LT5WYWxpZEFzQXBDbGkpICYmIChwRW50cnktPlNzdCA9PSBTU1RfQVNTT0MpKQorCQl7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCAgIiwgZXh0cmEsCisJCQkJcEVudHJ5LT5BZGRyWzBdLCBwRW50cnktPkFkZHJbMV0sIHBFbnRyeS0+QWRkclsyXSwKKwkJCQlwRW50cnktPkFkZHJbM10sIHBFbnRyeS0+QWRkcls0XSwgcEVudHJ5LT5BZGRyWzVdKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtNGQiLCBleHRyYSwgKGludClwRW50cnktPkFpZCk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTRkIiwgZXh0cmEsIChpbnQpcEVudHJ5LT5hcGlkeCk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTdkIiwgZXh0cmEsIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMCk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTdkIiwgZXh0cmEsIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMSk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTdkIiwgZXh0cmEsIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMik7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTEwcyIsIGV4dHJhLCBHZXRQaHlNb2RlKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUpKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtNnMiLCBleHRyYSwgR2V0QlcocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuQlcpKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtNmQiLCBleHRyYSwgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtNmQiLCBleHRyYSwgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTZkIiwgZXh0cmEsIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNUQkMpOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS0xMGQsICVkLCAlZCUlXG4iLCBleHRyYSwgcEVudHJ5LT5EZWJ1Z0ZJRk9Db3VudCwgcEVudHJ5LT5EZWJ1Z1R4Q291bnQsCisJCQkJCQkocEVudHJ5LT5EZWJ1Z1R4Q291bnQpID8gKChwRW50cnktPkRlYnVnVHhDb3VudC1wRW50cnktPkRlYnVnRklGT0NvdW50KSoxMDAvcEVudHJ5LT5EZWJ1Z1R4Q291bnQpIDogMCk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXNcbiIsIGV4dHJhKTsKKwkJfQorCX0KKworCXJldHVybiBUUlVFOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvdG1wNjEgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3RtcDYxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NWU0NDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3RtcDYxCkBAIC0wLDAgKzEsNzAzNyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICBzdGFfaW9jdGwuYworCisgICAgQWJzdHJhY3Q6CisgICAgSU9DVEwgcmVsYXRlZCBzdWJyb3V0aW5lcworCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBSb3J5IENoZW4gICAwMS0wMy0yMDAzICAgIGNyZWF0ZWQKKwlSb3J5IENoZW4gICAwMi0xNC0yMDA1ICAgIG1vZGlmeSB0byBzdXBwb3J0IFJUNjEKKyovCisKKyNpbmNsdWRlCSJydF9jb25maWcuaCIKKworI2lmZGVmIERCRworZXh0ZXJuIFVMT05HICAgIFJURGVidWdMZXZlbDsKKyNlbmRpZgorCisjZGVmaW5lIE5SX1dFUF9LRVlTIAkJCQk0CisjZGVmaW5lIFdFUF9TTUFMTF9LRVlfTEVOIAkJCSg0MC84KQorI2RlZmluZSBXRVBfTEFSR0VfS0VZX0xFTiAJCQkoMTA0LzgpCisKKyNkZWZpbmUgR1JPVVBfS0VZX05PICAgICAgICAgICAgICAgIDQKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpCisjZGVmaW5lIElXRV9TVFJFQU1fQUREX0VWRU5UKF9BLCBfQiwgX0MsIF9ELCBfRSkJCWl3ZV9zdHJlYW1fYWRkX2V2ZW50KF9BLCBfQiwgX0MsIF9ELCBfRSkKKyNkZWZpbmUgSVdFX1NUUkVBTV9BRERfUE9JTlQoX0EsIF9CLCBfQywgX0QsIF9FKQkJaXdlX3N0cmVhbV9hZGRfcG9pbnQoX0EsIF9CLCBfQywgX0QsIF9FKQorI2RlZmluZSBJV0VfU1RSRUFNX0FERF9WQUxVRShfQSwgX0IsIF9DLCBfRCwgX0UsIF9GKQlpd2Vfc3RyZWFtX2FkZF92YWx1ZShfQSwgX0IsIF9DLCBfRCwgX0UsIF9GKQorI2Vsc2UKKyNkZWZpbmUgSVdFX1NUUkVBTV9BRERfRVZFTlQoX0EsIF9CLCBfQywgX0QsIF9FKQkJaXdlX3N0cmVhbV9hZGRfZXZlbnQoX0IsIF9DLCBfRCwgX0UpCisjZGVmaW5lIElXRV9TVFJFQU1fQUREX1BPSU5UKF9BLCBfQiwgX0MsIF9ELCBfRSkJCWl3ZV9zdHJlYW1fYWRkX3BvaW50KF9CLCBfQywgX0QsIF9FKQorI2RlZmluZSBJV0VfU1RSRUFNX0FERF9WQUxVRShfQSwgX0IsIF9DLCBfRCwgX0UsIF9GKQlpd2Vfc3RyZWFtX2FkZF92YWx1ZShfQiwgX0MsIF9ELCBfRSwgX0YpCisjZW5kaWYKKworZXh0ZXJuIFVDSEFSICAgIENpcGhlcldwYTJUZW1wbGF0ZVtdOworZXh0ZXJuIFVDSEFSICAgIENpcGhlcldwYVBza1RraXBbXTsKK2V4dGVybiBVQ0hBUiAgICBDaXBoZXJXcGFQc2tUa2lwTGVuOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JUX1ZFUlNJT05fSU5GT3sKKyAgICBVQ0hBUiAgICAgICBEcml2ZXJWZXJzaW9uVzsKKyAgICBVQ0hBUiAgICAgICBEcml2ZXJWZXJzaW9uWDsKKyAgICBVQ0hBUiAgICAgICBEcml2ZXJWZXJzaW9uWTsKKyAgICBVQ0hBUiAgICAgICBEcml2ZXJWZXJzaW9uWjsKKyAgICBVSU5UICAgICAgICBEcml2ZXJCdWlsZFllYXI7CisgICAgVUlOVCAgICAgICAgRHJpdmVyQnVpbGRNb250aDsKKyAgICBVSU5UICAgICAgICBEcml2ZXJCdWlsZERheTsKK30gUlRfVkVSU0lPTl9JTkZPLCAqUFJUX1ZFUlNJT05fSU5GTzsKKworc3RydWN0IGl3X3ByaXZfYXJncyBwcml2dGFiW10gPSB7Cit7IFJUUFJJVl9JT0NUTF9TRVQsCisgIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgMCwKKyAgInNldCJ9LAorCit7IFJUUFJJVl9JT0NUTF9TSE9XLCAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLAorICAiIn0sCit7IFJUUFJJVl9JT0NUTF9TSE9XLCBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssCisgICIifSwKKy8qIC0tLSBzdWItaW9jdGxzIGRlZmluaXRpb25zIC0tLSAqLworICAgIHsgU0hPV19DT05OX1NUQVRVUywKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJjb25uU3RhdHVzIiB9LAorCXsgU0hPV19EUlZJRVJfVkVSSU9OLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImRyaXZlclZlciIgfSwKKyAgICB7IFNIT1dfQkFfSU5GTywKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJiYWluZm8iIH0sCisJeyBTSE9XX0RFU0NfSU5GTywKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJkZXNjaW5mbyIgfSwKKyAgICB7IFJBSU9fT0ZGLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgInJhZGlvX29mZiIgfSwKKwl7IFJBSU9fT04sCisJICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAicmFkaW9fb24iIH0sCisjaWZkZWYgUU9TX0RMU19TVVBQT1JUCisJeyBTSE9XX0RMU19FTlRSWV9JTkZPLAorCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImRsc2VudHJ5aW5mbyIgfSwKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwl7IFNIT1dfQ0ZHX1ZBTFVFLAorCSAgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAic2hvdyIgfSwKKwl7IFNIT1dfQURIT0NfRU5UUllfSU5GTywKKwkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJhZGhvY0VudHJ5IiB9LAorCisvKiAtLS0gc3ViLWlvY3RscyByZWxhdGlvbnMgLS0tICovCisKKyNpZmRlZiBEQkcKK3sgUlRQUklWX0lPQ1RMX0JCUCwKKyAgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywKKyAgImJicCJ9LAoreyBSVFBSSVZfSU9DVExfTUFDLAorICBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwKKyAgIm1hYyJ9LAoreyBSVFBSSVZfSU9DVExfRTJQLAorICBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwKKyAgImUycCJ9LAorI2VuZGlmICAvKiBEQkcgKi8KKworeyBSVFBSSVZfSU9DVExfU1RBVElTVElDUywKKyAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywKKyAgInN0YXQifSwKK3sgUlRQUklWX0lPQ1RMX0dTSVRFU1VSVkVZLAorICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsCisgICJnZXRfc2l0ZV9zdXJ2ZXkifSwKK307CisKK0lOVCBTZXRfU1NJRF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCisjaWZkZWYgV01NX1NVUFBPUlQKK0lOVAlTZXRfV21tQ2FwYWJsZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisjZW5kaWYKKworSU5UIFNldF9OZXR3b3JrVHlwZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0F1dGhNb2RlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfRW5jcnlwVHlwZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0RlZmF1bHRLZXlJRF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0tleTFfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9LZXkyX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisKK0lOVCBTZXRfS2V5M19Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCitJTlQgU2V0X0tleTRfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworSU5UIFNldF9XUEFQU0tfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworCitJTlQgU2V0X1BTTW9kZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorSU5UIFNldF9XcGFfU3VwcG9ydCgKKyAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQVUNIQVIJCQlhcmcpOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIERCRworVk9JRCBSVE1QSW9jdGxCQlAoCisJSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKKwlJTglzdHJ1Y3QgaXdyZXEJKndycSk7CisKK1ZPSUQgUlRNUElvY3RsTUFDKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4Jc3RydWN0IGl3cmVxCSp3cnEpOworCitWT0lEIFJUTVBJb2N0bEUyUFJPTSgKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBzdHJ1Y3QgaXdyZXEgICAgKndycSk7CisjZW5kaWYgLy8gREJHIC8vCisKKworTkRJU19TVEFUVVMgUlRNUFdQQU5vbmVBZGRLZXlQcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOCVBWT0lECQkJcEJ1Zik7CisKK0lOVCBTZXRfRnJhZ1Rlc3RfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorSU5UIFNldF9UR25XaWZpVGVzdF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworSU5UIFNldF9Mb25nUmV0cnlMaW1pdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4JUFVDSEFSCQkJYXJnKTsKKworSU5UIFNldF9TaG9ydFJldHJ5TGltaXRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCVBVQ0hBUgkJCWFyZyk7CisKKyNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCitJTlQgU2V0X0llZWU4MDIxMWRDbGllbnRNb2RlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVAorSU5UIFNldF9DYXJyaWVyRGV0ZWN0X1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOworI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KKworSU5UCVNob3dfQWRob2NfTWFjVGFibGVfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZCwKKwlJTglQQ0hBUgkJCWV4dHJhKTsKKworc3RhdGljIHN0cnVjdCB7CisJQ0hBUiAqbmFtZTsKKwlJTlQgKCpzZXRfcHJvYykoUFJUTVBfQURBUFRFUiBwQWRhcHRlciwgUFVDSEFSIGFyZyk7Cit9ICpQUlRNUF9QUklWQVRFX1NFVF9QUk9DLCBSVE1QX1BSSVZBVEVfU1VQUE9SVF9QUk9DW10gPSB7CisJeyJEcml2ZXJWZXJzaW9uIiwJCQkJU2V0X0RyaXZlclZlcnNpb25fUHJvY30sCisJeyJDb3VudHJ5UmVnaW9uIiwJCQkJU2V0X0NvdW50cnlSZWdpb25fUHJvY30sCisJeyJDb3VudHJ5UmVnaW9uQUJhbmQiLAkJCVNldF9Db3VudHJ5UmVnaW9uQUJhbmRfUHJvY30sCisJeyJTU0lEIiwJCQkJCQlTZXRfU1NJRF9Qcm9jfSwKKwl7IldpcmVsZXNzTW9kZSIsCQkJCVNldF9XaXJlbGVzc01vZGVfUHJvY30sCisJeyJUeEJ1cnN0IiwJCQkJCVNldF9UeEJ1cnN0X1Byb2N9LAorCXsiVHhQcmVhbWJsZSIsCQkJCVNldF9UeFByZWFtYmxlX1Byb2N9LAorCXsiVHhQb3dlciIsCQkJCQlTZXRfVHhQb3dlcl9Qcm9jfSwKKwl7IkNoYW5uZWwiLAkJCQkJU2V0X0NoYW5uZWxfUHJvY30sCisJeyJCR1Byb3RlY3Rpb24iLAkJCQlTZXRfQkdQcm90ZWN0aW9uX1Byb2N9LAorCXsiUlRTVGhyZXNob2xkIiwJCQkJU2V0X1JUU1RocmVzaG9sZF9Qcm9jfSwKKwl7IkZyYWdUaHJlc2hvbGQiLAkJCQlTZXRfRnJhZ1RocmVzaG9sZF9Qcm9jfSwKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwl7Ikh0QnciLAkJICAgICAgICAgICAgICAgIFNldF9IdEJ3X1Byb2N9LAorCXsiSHRNY3MiLAkJICAgICAgICAgICAgICAgIFNldF9IdE1jc19Qcm9jfSwKKwl7Ikh0R2kiLAkJICAgICAgICAgICAgICAgIFNldF9IdEdpX1Byb2N9LAorCXsiSHRPcE1vZGUiLAkJICAgICAgICAgICAgU2V0X0h0T3BNb2RlX1Byb2N9LAorCXsiSHRFeHRjaGEiLAkJICAgICAgICAgICAgU2V0X0h0RXh0Y2hhX1Byb2N9LAorCXsiSHRNcGR1RGVuc2l0eSIsCQkgICAgICAgIFNldF9IdE1wZHVEZW5zaXR5X1Byb2N9LAorCXsiSHRCYVdpblNpemUiLAkJICAgICAgICAJU2V0X0h0QmFXaW5TaXplX1Byb2N9LAorCXsiSHRSZGciLAkJICAgICAgICAJCVNldF9IdFJkZ19Qcm9jfSwKKwl7Ikh0QW1zZHUiLAkJICAgICAgICAJCVNldF9IdEFtc2R1X1Byb2N9LAorCXsiSHRBdXRvQmEiLAkJICAgICAgICAJU2V0X0h0QXV0b0JhX1Byb2N9LAorCXsiSHRCYURlY2xpbmUiLAkJCQkJU2V0X0JBRGVjbGluZV9Qcm9jfSwKKwl7Ikh0UHJvdGVjdCIsCQkgICAgICAgIAlTZXRfSHRQcm90ZWN0X1Byb2N9LAorCXsiSHRNaW1vUHMiLAkJICAgICAgICAJU2V0X0h0TWltb1BzX1Byb2N9LAorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAorCXsiUGt0QWdncmVnYXRlIiwJCQkJU2V0X1BrdEFnZ3JlZ2F0ZV9Qcm9jfSwKKyNlbmRpZgorCisjaWZkZWYgV01NX1NVUFBPUlQKKwl7IldtbUNhcGFibGUiLAkJCQkJU2V0X1dtbUNhcGFibGVfUHJvY30sCisjZW5kaWYKKwl7IklFRUU4MDIxMUgiLAkJCQkJU2V0X0lFRUU4MDIxMUhfUHJvY30sCisgICAgeyJOZXR3b3JrVHlwZSIsICAgICAgICAgICAgICAgICBTZXRfTmV0d29ya1R5cGVfUHJvY30sCisJeyJBdXRoTW9kZSIsCQkJCQlTZXRfQXV0aE1vZGVfUHJvY30sCisJeyJFbmNyeXBUeXBlIiwJCQkJCVNldF9FbmNyeXBUeXBlX1Byb2N9LAorCXsiRGVmYXVsdEtleUlEIiwJCQkJU2V0X0RlZmF1bHRLZXlJRF9Qcm9jfSwKKwl7IktleTEiLAkJCQkJCVNldF9LZXkxX1Byb2N9LAorCXsiS2V5MiIsCQkJCQkJU2V0X0tleTJfUHJvY30sCisJeyJLZXkzIiwJCQkJCQlTZXRfS2V5M19Qcm9jfSwKKwl7IktleTQiLAkJCQkJCVNldF9LZXk0X1Byb2N9LAorCXsiV1BBUFNLIiwJCQkJCQlTZXRfV1BBUFNLX1Byb2N9LAorCXsiUmVzZXRDb3VudGVyIiwJCQkJU2V0X1Jlc2V0U3RhdENvdW50ZXJfUHJvY30sCisJeyJQU01vZGUiLCAgICAgICAgICAgICAgICAgICAgICBTZXRfUFNNb2RlX1Byb2N9LAorI2lmZGVmIERCRworCXsiRGVidWciLAkJCQkJCVNldF9EZWJ1Z19Qcm9jfSwKKyNlbmRpZgorCisjaWZkZWYgUkFMSU5LX0FURQorCXsiQVRFIiwJCQkJCQkJU2V0X0FURV9Qcm9jfSwKKwl7IkFURURBIiwJCQkJCQlTZXRfQVRFX0RBX1Byb2N9LAorCXsiQVRFU0EiLAkJCQkJCVNldF9BVEVfU0FfUHJvY30sCisJeyJBVEVCU1NJRCIsCQkJCQlTZXRfQVRFX0JTU0lEX1Byb2N9LAorCXsiQVRFQ0hBTk5FTCIsCQkJCQlTZXRfQVRFX0NIQU5ORUxfUHJvY30sCisJeyJBVEVUWFBPVzAiLAkJCQkJU2V0X0FURV9UWF9QT1dFUjBfUHJvY30sCisJeyJBVEVUWFBPVzEiLAkJCQkJU2V0X0FURV9UWF9QT1dFUjFfUHJvY30sCisJeyJBVEVUWEFOVCIsCQkJCQlTZXRfQVRFX1RYX0FudGVubmFfUHJvY30sCisJeyJBVEVSWEFOVCIsCQkJCQlTZXRfQVRFX1JYX0FudGVubmFfUHJvY30sCisJeyJBVEVUWEZSRVFPRkZTRVQiLAkJCQlTZXRfQVRFX1RYX0ZSRVFPRkZTRVRfUHJvY30sCisJeyJBVEVUWEJXIiwJCQkJCQlTZXRfQVRFX1RYX0JXX1Byb2N9LAorCXsiQVRFVFhMRU4iLAkJCQkJU2V0X0FURV9UWF9MRU5HVEhfUHJvY30sCisJeyJBVEVUWENOVCIsCQkJCQlTZXRfQVRFX1RYX0NPVU5UX1Byb2N9LAorCXsiQVRFVFhNQ1MiLAkJCQkJU2V0X0FURV9UWF9NQ1NfUHJvY30sCisJeyJBVEVUWE1PREUiLAkJCQkJU2V0X0FURV9UWF9NT0RFX1Byb2N9LAorCXsiQVRFVFhHSSIsCQkJCQkJU2V0X0FURV9UWF9HSV9Qcm9jfSwKKwl7IkFURVJYRkVSIiwJCQkJCVNldF9BVEVfUlhfRkVSX1Byb2N9LAorCXsiQVRFUlJGIiwJCQkJCQlTZXRfQVRFX1JlYWRfUkZfUHJvY30sCisJeyJBVEVXUkYxIiwJCQkJCQlTZXRfQVRFX1dyaXRlX1JGMV9Qcm9jfSwKKwl7IkFURVdSRjIiLAkJCQkJCVNldF9BVEVfV3JpdGVfUkYyX1Byb2N9LAorCXsiQVRFV1JGMyIsCQkJCQkJU2V0X0FURV9Xcml0ZV9SRjNfUHJvY30sCisJeyJBVEVXUkY0IiwJCQkJCQlTZXRfQVRFX1dyaXRlX1JGNF9Qcm9jfSwKKwl7IkFURUxERTJQIiwJCQkJICAgIFNldF9BVEVfTG9hZF9FMlBfUHJvY30sCisJeyJBVEVSRTJQIiwJCQkJCQlTZXRfQVRFX1JlYWRfRTJQX1Byb2N9LAorCXsiQVRFU0hPVyIsCQkJCQkJU2V0X0FURV9TaG93X1Byb2N9LAorCXsiQVRFSEVMUCIsCQkJCQkJU2V0X0FURV9IZWxwX1Byb2N9LAorCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwl7IlR4U3RvcCIsCQkJCQkJU2V0X1R4U3RvcF9Qcm9jfSwKKwl7IlJ4U3RvcCIsCQkJCQkJU2V0X1J4U3RvcF9Qcm9jfSwKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICB7IldwYVN1cHBvcnQiLCAgICAgICAgICAgICAgICAgIFNldF9XcGFfU3VwcG9ydH0sCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisKKworCXsiRml4ZWRUeE1vZGUiLCAgICAgICAgICAgICAgICAgU2V0X0ZpeGVkVHhNb2RlX1Byb2N9LAorI2lmZGVmIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUCisJeyJPcE1vZGUiLAkJCQkJCVNldF9PcE1vZGVfUHJvY30sCisjZW5kaWYgLy8gQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQgLy8KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICB7IlRHbldpZmlUZXN0IiwgICAgICAgICAgICAgICAgIFNldF9UR25XaWZpVGVzdF9Qcm9jfSwKKyAgICB7IkZvcmNlR0YiLAkJICAgICAgICAJCVNldF9Gb3JjZUdGX1Byb2N9LAorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCXsiRGxzQWRkRW50cnkiLAkJCQkJU2V0X0Rsc0FkZEVudHJ5X1Byb2N9LAorCXsiRGxzVGVhckRvd25FbnRyeSIsCQkJU2V0X0Rsc1RlYXJEb3duRW50cnlfUHJvY30sCisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisJeyJMb25nUmV0cnkiLAkgICAgICAgIAkJU2V0X0xvbmdSZXRyeUxpbWl0X1Byb2N9LAorCXsiU2hvcnRSZXRyeSIsCSAgICAgICAgCQlTZXRfU2hvcnRSZXRyeUxpbWl0X1Byb2N9LAorI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwl7IjExZENsaWVudE1vZGUiLAkJCQlTZXRfSWVlZTgwMjExZENsaWVudE1vZGVfUHJvY30sCisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKKwl7IkNhcnJpZXJEZXRlY3QiLAkJCQlTZXRfQ2FycmllckRldGVjdF9Qcm9jfSwKKyNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCisKKwl7TlVMTCx9Cit9OworCisKK1ZPSUQgUlRNUEFkZEtleSgKKwlJTglQUlRNUF9BREFQVEVSCSAgICBwQWQsCisJSU4JUE5ESVNfODAyXzExX0tFWSAgICBwS2V5KQoreworCVVMT05HCQkJCUtleUlkeDsKKwlNQUNfVEFCTEVfRU5UUlkgIAkqcEVudHJ5OworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUEFkZEtleSAtLS0tLS0+XG4iKSk7CisKKwlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorCXsKKwkJaWYgKHBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkKKwkJeworCQkgICAgaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuUE1LLCAzMik7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUE1LLCBwS2V5LT5LZXlNYXRlcmlhbCwgcEtleS0+S2V5TGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KKwkJICAgIC8vIFVwZGF0ZSBQVEsKKwkJICAgIE5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVswXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKyAgICAgICAgICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IExFTl9US0lQX0VLOworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBwS2V5LT5LZXlNYXRlcmlhbCwgTEVOX1RLSVBfRUspOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssIExFTl9US0lQX1RYTUlDSyk7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgeworICAgICAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLLCBMRU5fVEtJUF9UWE1JQ0spOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLICsgTEVOX1RLSVBfVFhNSUNLLCBMRU5fVEtJUF9SWE1JQ0spOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBEZWNpZGUgaXRzIENoaXBlckFsZworICAgICAgICAJaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKyAgICAgICAgCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKyAgICAgICAgCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKyAgICAgICAgCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworICAgICAgICAJZWxzZQorICAgICAgICAJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCisgICAgICAgICAgICAvLyBVcGRhdGUgdGhlc2UgcmVsYXRlZCBpbmZvcm1hdGlvbiB0byBNQUNfVEFCTEVfRU5UUlkKKyAgICAgICAgCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5LZXksIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgTEVOX1RLSVBfRUspOworICAgICAgICAJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5SeE1pYywgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMsIExFTl9US0lQX1JYTUlDSyk7CisgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LlR4TWljLCBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywgTEVOX1RLSVBfVFhNSUNLKTsKKyAgICAgICAgCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnOworCisgICAgICAgIAkvLyBVcGRhdGUgcGFpcndpc2Uga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQorICAgICAgICAJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKKyAgICAgICAgCQkJCQkJICBCU1MwLAorICAgICAgICAJCQkJCQkgIDAsCisgICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYyk7CisKKyAgICAgICAgCS8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQorICAgICAgICAJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCisgICAgICAgIAkJCQkJCQkgIEJTUzAsCisgICAgICAgIAkJCQkJCQkgIDAsCisgICAgICAgIAkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKKyAgICAgICAgCQkJCQkJCSAgcEVudHJ5KTsKKworICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gc2V0IDgwMi4xeCBwb3J0IGNvbnRyb2wKKwkgICAgICAgICAgICAvL3BBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCQkJU1RBX1BPUlRfU0VDVVJFRChwQWQpOworCisgICAgICAgICAgICAgICAgLy8gSW5kaWNhdGUgQ29ubmVjdGVkIGZvciBHVUkKKyAgICAgICAgICAgICAgICBwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworICAgICAgICAgICAgfQorCQl9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVXBkYXRlIEdUSworICAgICAgICAgICAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKHBLZXktPktleUluZGV4ICYgMHhGRik7CisgICAgICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKKyAgICAgICAgICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwgcEtleS0+S2V5TWF0ZXJpYWwsIExFTl9US0lQX0VLKTsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlJ4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLLCBMRU5fVEtJUF9UWE1JQ0spOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uVHhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgeworICAgICAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uVHhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssIExFTl9US0lQX1RYTUlDSyk7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5SeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSyArIExFTl9US0lQX1RYTUlDSywgTEVOX1RLSVBfUlhNSUNLKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVXBkYXRlIFNoYXJlZCBLZXkgQ2lwaGVyQWxnCisgICAgCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworICAgIAkJaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisgICAgCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKKyAgICAJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisgICAgCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworCisgICAgICAgICAgICAvLyBVcGRhdGUgZ3JvdXAga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQorICAgICAgICAJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKKyAgICAgICAgCQkJCQkJICBCU1MwLAorICAgICAgICAJCQkJCQkgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZywKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwKKyAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLAorICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uUnhNaWMpOworCisgICAgICAgIAkvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKyAgICAgICAgCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorICAgICAgICAJCQkJCQkJICBCU1MwLAorICAgICAgICAJCQkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCisgICAgICAgIAkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLAorICAgICAgICAJCQkJCQkJICBOVUxMKTsKKworICAgICAgICAgICAgLy8gc2V0IDgwMi4xeCBwb3J0IGNvbnRyb2wKKwkgICAgICAgIC8vcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKKworICAgICAgICAgICAgLy8gSW5kaWNhdGUgQ29ubmVjdGVkIGZvciBHVUkKKyAgICAgICAgICAgIHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisgICAgICAgIH0KKwl9CisJZWxzZQkvLyBkeW5hbWljIFdFUCBmcm9tIHdwYV9zdXBwbGljYW50CisJeworCQlVQ0hBUglDaXBoZXJBbGc7CisgICAgCVBVQ0hBUglLZXk7CisKKwkJaWYocEtleS0+S2V5TGVuZ3RoID09IDMyKQorCQkJZ290byBlbmQ7CisKKwkJS2V5SWR4ID0gcEtleS0+S2V5SW5kZXggJiAweDBmZmZmZmZmOworCisJCWlmIChLZXlJZHggPCA0KQorCQl7CisJCQkvLyBpdCBpcyBhIGRlZmF1bHQgc2hhcmVkIGtleSwgZm9yIFBhaXJ3aXNlIGtleSBzZXR0aW5nCisJCQlpZiAocEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKQorCQkJeworCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgcEtleS0+QlNTSUQpOworCisJCQkJaWYgKHBFbnRyeSkKKwkJCQl7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBBZGRLZXk6IFNldCBQYWlyLXdpc2UgS2V5XG4iKSk7CisKKwkJCQkJLy8gc2V0IGtleSBtYXRlcmlhbCBhbmQga2V5IGxlbmd0aAorIAkJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5LZXlMZW4gPSAoVUNIQVIpcEtleS0+S2V5TGVuZ3RoOworCQkJCQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LktleSwgJnBLZXktPktleU1hdGVyaWFsLCBwS2V5LT5LZXlMZW5ndGgpOworCisJCQkJCS8vIHNldCBDaXBoZXIgdHlwZQorCQkJCQlpZiAocEtleS0+S2V5TGVuZ3RoID09IDUpCisJCQkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwkJCQkJZWxzZQorCQkJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCisJCQkJCS8vIEFkZCBQYWlyLXdpc2Uga2V5IHRvIEFzaWMKKwkJCQkJQXNpY0FkZFBhaXJ3aXNlS2V5RW50cnkoCisJCQkJCQlwQWQsCisJCQkJCQlwRW50cnktPkFkZHIsCisJCQkJCQkoVUNIQVIpcEVudHJ5LT5BaWQsCisgICAgICAgICAgICAgICAgCQkmcEVudHJ5LT5QYWlyd2lzZUtleSk7CisKKwkJCQkJLy8gdXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSBmb3IgdGhpcyBlbnRyeQorCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KAorCQkJCQkJcEFkLAorCQkJCQkJQlNTMCwKKwkJCQkJCUtleUlkeCwgLy8gVGhlIHZhbHVlIG1heSBiZSBub3QgemVybworCQkJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcsCisJCQkJCQlwRW50cnkpOworCisJCQkJfQorCQkJfQorCQkJZWxzZQorICAgICAgICAgICAgeworCQkJCS8vIERlZmF1bHQga2V5IGZvciB0eCAoc2hhcmVkIGtleSkKKwkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAoVUNIQVIpIEtleUlkeDsKKworCQkJCS8vIHNldCBrZXkgbWF0ZXJpYWwgYW5kIGtleSBsZW5ndGgKKwkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9IChVQ0hBUikgcEtleS0+S2V5TGVuZ3RoOworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5LCAmcEtleS0+S2V5TWF0ZXJpYWwsIHBLZXktPktleUxlbmd0aCk7CisKKwkJCQkvLyBTZXQgQ2lwZXIgdHlwZQorCQkJCWlmIChwS2V5LT5LZXlMZW5ndGggPT0gNSkKKwkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCQkJZWxzZQorCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisKKyAgICAJCQlDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZzsKKyAgICAJCQlLZXkgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleTsKKworCQkJCS8vIFNldCBHcm91cCBrZXkgbWF0ZXJpYWwgdG8gQXNpYworICAgIAkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIEtleUlkeCwgQ2lwaGVyQWxnLCBLZXksIE5VTEwsIE5VTEwpOworCisJCQkJLy8gVXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSBmb3IgdGhpcyBncm91cCBrZXkgdGFibGUKKwkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgQlNTMCwgS2V5SWR4LCBDaXBoZXJBbGcsIE5VTEwpOworCisJCQl9CisJCX0KKwl9CitlbmQ6CisJcmV0dXJuOworfQorCitjaGFyICogcnRzdHJjaHIoY29uc3QgY2hhciAqIHMsIGludCBjKQoreworICAgIGZvcig7ICpzICE9IChjaGFyKSBjOyArK3MpCisgICAgICAgIGlmICgqcyA9PSAnXDAnKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIChjaGFyICopIHM7Cit9CisKKy8qCitUaGlzIGlzIHJlcXVpcmVkIGZvciBMaW5FWDIwMDQva2VybmVsMi42LjcgdG8gcHJvdmlkZSBpd2xpc3Qgc2Nhbm5pbmcgZnVuY3Rpb24KKyovCisKK2ludAorcnRfaW9jdGxfZ2l3bmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBjaGFyICpuYW1lLCBjaGFyICpleHRyYSkKK3sKKy8vCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCisjaWZkZWYgUlQyODcwCisJc3RybmNweShuYW1lLCAiUlQyODcwIFdpcmVsZXNzIiwgSUZOQU1TSVopOworI2VuZGlmIC8vIFJUMjg3MCAvLworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3ZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19mcmVxICpmcmVxLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKwlpbnQgCWNoYW4gPSAtMTsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgICByZXR1cm4gLUVORVRET1dOOworICAgIH0KKworCisJaWYgKGZyZXEtPmUgPiAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmKChmcmVxLT5lID09IDApICYmIChmcmVxLT5tIDw9IDEwMDApKQorCQljaGFuID0gZnJlcS0+bTsJLy8gU2V0dGluZyBieSBjaGFubmVsIG51bWJlcgorCWVsc2UKKwkJTUFQX0tIWl9UT19DSEFOTkVMX0lEKCAoZnJlcS0+bSAvMTAwKSAsIGNoYW4pOyAvLyBTZXR0aW5nIGJ5IGZyZXF1ZW5jeSAtIHNlYXJjaCB0aGUgdGFibGUgLCBsaWtlIDIuNDEyRywgMi40MjJHLAorCisgICAgaWYgKENoYW5uZWxTYW5pdHkocEFkYXB0ZXIsIGNoYW4pID09IFRSVUUpCisgICAgeworCXBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCA9IGNoYW47CisJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiPT0+cnRfaW9jdGxfc2l3ZnJlcTo6U0lPQ1NJV0ZSRVFbY21kPTB4JXhdIChDaGFubmVsPSVkKVxuIiwgU0lPQ1NJV0ZSRVEsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCkpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CitpbnQgcnRfaW9jdGxfZ2l3ZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBzdHJ1Y3QgaXdfZnJlcSAqZnJlcSwgY2hhciAqZXh0cmEpCit7CisgICAgVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gTlVMTDsKKwlVQ0hBUiBjaDsKKwlVTE9ORwltOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJCWNoID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCI9PT5ydF9pb2N0bF9naXdmcmVxICAlZFxuIiwgY2gpKTsKKworICAgIE1BUF9DSEFOTkVMX0lEX1RPX0tIWihjaCwgbSk7CisJZnJlcS0+bSA9IG0gKiAxMDA7CisJZnJlcS0+ZSA9IDE7CisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9zaXdtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIF9fdTMyICptb2RlLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgIAlyZXR1cm4gLUVORVRET1dOOworICAgIH0KKworCXN3aXRjaCAoKm1vZGUpCisJeworCQljYXNlIElXX01PREVfQURIT0M6CisJCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWRhcHRlciwgIkFkaG9jIik7CisJCQlicmVhazsKKwkJY2FzZSBJV19NT0RFX0lORlJBOgorCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJJbmZyYSIpOworCQkJYnJlYWs7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNCwyMCkpCisgICAgICAgIGNhc2UgSVdfTU9ERV9NT05JVE9SOgorCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJNb25pdG9yIik7CisJCQlicmVhazsKKyNlbmRpZgorCQlkZWZhdWx0OgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PnJ0X2lvY3RsX3Npd21vZGU6OlNJT0NTSVdNT0RFICh1bmtub3duICVkKVxuIiwgKm1vZGUpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8vIFJlc2V0IFJhbGluayBzdXBwbGljYW50IHRvIG5vdCB1c2UsIGl0IHdpbGwgYmUgc2V0IHRvIHN0YXJ0IHdoZW4gVUkgc2V0IFBNSyBrZXkKKwlwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIF9fdTMyICptb2RlLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+cHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+cHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+cHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWlmIChBREhPQ19PTihwQWRhcHRlcikpCisJCSptb2RlID0gSVdfTU9ERV9BREhPQzsKKyAgICBlbHNlIGlmIChJTkZSQV9PTihwQWRhcHRlcikpCisJCSptb2RlID0gSVdfTU9ERV9JTkZSQTsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw0LDIwKSkKKyAgICBlbHNlIGlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKKyAgICB7CisgICAgICAgICptb2RlID0gSVdfTU9ERV9NT05JVE9SOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UKKyAgICAgICAgKm1vZGUgPSBJV19NT0RFX0FVVE87CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT5ydF9pb2N0bF9naXdtb2RlKG1vZGU9JWQpXG4iLCAqbW9kZSkpOworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3c2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBjaGFyICpuYW1lLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICAJeworICAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICAJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdzZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIGNoYXIgKm5hbWUsIGNoYXIgKmV4dHJhKQoreworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3cmFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKwlzdHJ1Y3QgaXdfcmFuZ2UgKnJhbmdlID0gKHN0cnVjdCBpd19yYW5nZSAqKSBleHRyYTsKKwl1MTYgdmFsOworCWludCBpOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT09PnJ0X2lvY3RsX2dpd3JhbmdlXG4iKSk7CisJZGF0YS0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSk7CisJbWVtc2V0KHJhbmdlLCAwLCBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKSk7CisKKwlyYW5nZS0+dHhwb3dlcl9jYXBhID0gSVdfVFhQT1dfREJNOworCisJaWYgKElORlJBX09OKHBBZGFwdGVyKXx8QURIT0NfT04ocEFkYXB0ZXIpKQorCXsKKwkJcmFuZ2UtPm1pbl9wbXAgPSAxICogMTAyNDsKKwkJcmFuZ2UtPm1heF9wbXAgPSA2NTUzNSAqIDEwMjQ7CisJCXJhbmdlLT5taW5fcG10ID0gMSAqIDEwMjQ7CisJCXJhbmdlLT5tYXhfcG10ID0gMTAwMCAqIDEwMjQ7CisJCXJhbmdlLT5wbXBfZmxhZ3MgPSBJV19QT1dFUl9QRVJJT0Q7CisJCXJhbmdlLT5wbXRfZmxhZ3MgPSBJV19QT1dFUl9USU1FT1VUOworCQlyYW5nZS0+cG1fY2FwYSA9IElXX1BPV0VSX1BFUklPRCB8IElXX1BPV0VSX1RJTUVPVVQgfAorCQkJSVdfUE9XRVJfVU5JQ0FTVF9SIHwgSVdfUE9XRVJfQUxMX1I7CisJfQorCisJcmFuZ2UtPndlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7CisJcmFuZ2UtPndlX3ZlcnNpb25fc291cmNlID0gMTQ7CisKKwlyYW5nZS0+cmV0cnlfY2FwYSA9IElXX1JFVFJZX0xJTUlUOworCXJhbmdlLT5yZXRyeV9mbGFncyA9IElXX1JFVFJZX0xJTUlUOworCXJhbmdlLT5taW5fcmV0cnkgPSAwOworCXJhbmdlLT5tYXhfcmV0cnkgPSAyNTU7CisKKwlyYW5nZS0+bnVtX2NoYW5uZWxzID0gIHBBZGFwdGVyLT5DaGFubmVsTGlzdE51bTsKKworCXZhbCA9IDA7CisJZm9yIChpID0gMTsgaSA8PSByYW5nZS0+bnVtX2NoYW5uZWxzOyBpKyspCisJeworCQl1MzIgbTsKKwkJcmFuZ2UtPmZyZXFbdmFsXS5pID0gcEFkYXB0ZXItPkNoYW5uZWxMaXN0W2ktMV0uQ2hhbm5lbDsKKwkJTUFQX0NIQU5ORUxfSURfVE9fS0haKHBBZGFwdGVyLT5DaGFubmVsTGlzdFtpLTFdLkNoYW5uZWwsIG0pOworCQlyYW5nZS0+ZnJlcVt2YWxdLm0gPSBtICogMTAwOyAvKiBIWiAqLworCisJCXJhbmdlLT5mcmVxW3ZhbF0uZSA9IDE7CisJCXZhbCsrOworCQlpZiAodmFsID09IElXX01BWF9GUkVRVUVOQ0lFUykKKwkJCWJyZWFrOworCX0KKwlyYW5nZS0+bnVtX2ZyZXF1ZW5jeSA9IHZhbDsKKworCXJhbmdlLT5tYXhfcXVhbC5xdWFsID0gMTAwOyAvKiB3aGF0IGlzIGNvcnJlY3QgbWF4PyBUaGlzIHdhcyBub3QKKwkJCQkJKiBkb2N1bWVudGVkIGV4YWN0bHkuIEF0IGxlYXN0CisJCQkJCSogNjkgaGFzIGJlZW4gb2JzZXJ2ZWQuICovCisJcmFuZ2UtPm1heF9xdWFsLmxldmVsID0gMDsgLyogZEIgKi8KKwlyYW5nZS0+bWF4X3F1YWwubm9pc2UgPSAwOyAvKiBkQiAqLworCisJLyogV2hhdCB3b3VsZCBiZSBzdWl0YWJsZSB2YWx1ZXMgZm9yICJhdmVyYWdlL3R5cGljYWwiIHF1YWw/ICovCisJcmFuZ2UtPmF2Z19xdWFsLnF1YWwgPSAyMDsKKwlyYW5nZS0+YXZnX3F1YWwubGV2ZWwgPSAtNjA7CisJcmFuZ2UtPmF2Z19xdWFsLm5vaXNlID0gLTk1OworCXJhbmdlLT5zZW5zaXRpdml0eSA9IDM7CisKKwlyYW5nZS0+bWF4X2VuY29kaW5nX3Rva2VucyA9IE5SX1dFUF9LRVlTOworCXJhbmdlLT5udW1fZW5jb2Rpbmdfc2l6ZXMgPSAyOworCXJhbmdlLT5lbmNvZGluZ19zaXplWzBdID0gNTsKKwlyYW5nZS0+ZW5jb2Rpbmdfc2l6ZVsxXSA9IDEzOworCisJcmFuZ2UtPm1pbl9ydHMgPSAwOworCXJhbmdlLT5tYXhfcnRzID0gMjM0NzsKKwlyYW5nZS0+bWluX2ZyYWcgPSAyNTY7CisJcmFuZ2UtPm1heF9mcmFnID0gMjM0NjsKKworI2lmIFdJUkVMRVNTX0VYVCA+IDE3CisJLyogSVdfRU5DX0NBUEFfKiBiaXQgZmllbGQgKi8KKwlyYW5nZS0+ZW5jX2NhcGEgPSBJV19FTkNfQ0FQQV9XUEEgfCBJV19FTkNfQ0FQQV9XUEEyIHwKKwkJCQkJSVdfRU5DX0NBUEFfQ0lQSEVSX1RLSVAgfCBJV19FTkNfQ0FQQV9DSVBIRVJfQ0NNUDsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9zaXdhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKmFwX2FkZHIsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTIEJzc2lkOworCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisJeworICAgICAgIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgCXJldHVybiAtRU5FVERPV047CisgICAgfQorCisJaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCisgICAgeworICAgICAgICBSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworICAgIH0KKworICAgIC8vIHRlbGwgQ05UTCBzdGF0ZSBtYWNoaW5lIHRvIGNhbGwgTmRpc01TZXRJbmZvcm1hdGlvbkNvbXBsZXRlKCkgYWZ0ZXIgY29tcGxldGluZworICAgIC8vIHRoaXMgcmVxdWVzdCwgYmVjYXVzZSB0aGlzIHJlcXVlc3QgaXMgaW5pdGlhdGVkIGJ5IE5ESVMuCisgICAgcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBGQUxTRTsKKwkvLyBQcmV2ZW50IHRvIGNvbm5lY3QgQVAgYWdhaW4gaW4gU1RBTWxtZVBlcmlvZGljRXhlYworCXBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuPSAzMjsKKworICAgIG1lbXNldChCc3NpZCwgMCwgTUFDX0FERFJfTEVOKTsKKyAgICBtZW1jcHkoQnNzaWQsIGFwX2FkZHItPnNhX2RhdGEsIE1BQ19BRERSX0xFTik7CisgICAgTWxtZUVucXVldWUocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisgICAgICAgICAgICAgICAgT0lEXzgwMl8xMV9CU1NJRCwKKyAgICAgICAgICAgICAgICBzaXplb2YoTkRJU184MDJfMTFfTUFDX0FERFJFU1MpLAorICAgICAgICAgICAgICAgIChWT0lEICopJkJzc2lkKTsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklPQ1RMOjpTSU9DU0lXQVAgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisgICAgICAgIEJzc2lkWzBdLCBCc3NpZFsxXSwgQnNzaWRbMl0sIEJzc2lkWzNdLCBCc3NpZFs0XSwgQnNzaWRbNV0pKTsKKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgc3RydWN0IHNvY2thZGRyICphcF9hZGRyLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+cHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+cHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+cHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWlmIChJTkZSQV9PTihwQWRhcHRlcikgfHwgQURIT0NfT04ocEFkYXB0ZXIpKQorCXsKKwkJYXBfYWRkci0+c2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCQltZW1jcHkoYXBfYWRkci0+c2FfZGF0YSwgJnBBZGFwdGVyLT5Db21tb25DZmcuQnNzaWQsIEVUSF9BTEVOKTsKKwl9CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIC8vIEFkZCBmb3IgUlQyODcwCisgICAgZWxzZSBpZiAocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkKKyAgICB7CisgICAgICAgIGFwX2FkZHItPnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKyAgICAgICAgbWVtY3B5KGFwX2FkZHItPnNhX2RhdGEsICZwQWRhcHRlci0+TWxtZUF1eC5Cc3NpZCwgRVRIX0FMRU4pOworICAgIH0KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJZWxzZQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU9DVEw6OlNJT0NHSVdBUCg9RU1QVFkpXG4iKSk7CisJCXJldHVybiAtRU5PVENPTk47CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBVbml0cyBhcmUgaW4gZGIgYWJvdmUgdGhlIG5vaXNlIGZsb29yLiBUaGF0IG1lYW5zIHRoZQorICogcnNzaSB2YWx1ZXMgcmVwb3J0ZWQgaW4gdGhlIHR4L3J4IGRlc2NyaXB0b3JzIGluIHRoZQorICogZHJpdmVyIGFyZSB0aGUgU05SIGV4cHJlc3NlZCBpbiBkYi4KKyAqCisgKiBJZiB5b3UgYXNzdW1lIHRoYXQgdGhlIG5vaXNlIGZsb29yIGlzIC05NSwgd2hpY2ggaXMgYW4KKyAqIGV4Y2VsbGVudCBhc3N1bXB0aW9uIDk5LjUgJSBvZiB0aGUgdGltZSwgdGhlbiB5b3UgY2FuCisgKiBkZXJpdmUgdGhlIGFic29sdXRlIHNpZ25hbCBsZXZlbCAoaS5lLiAtOTUgKyByc3NpKS4KKyAqIFRoZXJlIGFyZSBzb21lIG90aGVyIHNsaWdodCBmYWN0b3JzIHRvIHRha2UgaW50byBhY2NvdW50CisgKiBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgcnNzaSBtZWFzdXJlbWVudCBpcyBmcm9tIDExYiwKKyAqIDExZywgb3IgMTFhLiAgIFRoZXNlIGRpZmZlcmVuY2VzIGFyZSBhdCBtb3N0IDJkYiBhbmQKKyAqIGNhbiBiZSBkb2N1bWVudGVkLgorICoKKyAqIE5COiB2YXJpb3VzIGNhbGN1bGF0aW9ucyBhcmUgYmFzZWQgb24gdGhlIG9yaW5vY28vd2F2ZWxhbgorICogICAgIGRyaXZlcnMgZm9yIGNvbXBhdGliaWxpdHkKKyAqLworc3RhdGljIHZvaWQgc2V0X3F1YWxpdHkoUFJUTVBfQURBUFRFUiBwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19xdWFsaXR5ICppcSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCBjaGFyIHJzc2kpCit7CisJX191OCBDaGFubmVsUXVhbGl0eTsKKworCS8vIE5vcm1hbGl6ZSBSc3NpCisJaWYgKHJzc2kgPj0gLTUwKQorCQlDaGFubmVsUXVhbGl0eSA9IDEwMDsKKwllbHNlIGlmIChyc3NpID49IC04MCkgLy8gYmV0d2VlbiAtNTAgfiAtODBkYm0KKwkJQ2hhbm5lbFF1YWxpdHkgPSAoX191OCkoMjQgKyAoKHJzc2kgKyA4MCkgKiAyNikvMTApOworCWVsc2UgaWYgKHJzc2kgPj0gLTkwKSAgIC8vIGJldHdlZW4gLTgwIH4gLTkwZGJtCisgICAgICAgIENoYW5uZWxRdWFsaXR5ID0gKF9fdTgpKChyc3NpICsgOTApICogMjYpLzEwOworCWVsc2UKKwkJQ2hhbm5lbFF1YWxpdHkgPSAwOworCisgICAgaXEtPnF1YWwgPSAoX191OClDaGFubmVsUXVhbGl0eTsKKworICAgIGlxLT5sZXZlbCA9IChfX3U4KShyc3NpKTsKKyAgICBpcS0+bm9pc2UgPSAocEFkYXB0ZXItPkJicFdyaXRlTGF0Y2hbNjZdID4gcEFkYXB0ZXItPkJicFR1bmluZy5GYWxzZUNjYVVwcGVyVGhyZXNob2xkKSA/ICgoX191OClwQWRhcHRlci0+QmJwVHVuaW5nLkZhbHNlQ2NhVXBwZXJUaHJlc2hvbGQpIDogKChfX3U4KSBwQWRhcHRlci0+QmJwV3JpdGVMYXRjaFs2Nl0pOyAJLy8gbm9pc2UgbGV2ZWwgKGRCbSkKKyAgICBpcS0+bm9pc2UgKz0gMjU2IC0gMTQzOworICAgIGlxLT51cGRhdGVkID0gcEFkYXB0ZXItPml3X3N0YXRzLnF1YWwudXBkYXRlZDsKK30KKworaW50IHJ0X2lvY3RsX2l3YXBsaXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKyAJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisKKwlzdHJ1Y3Qgc29ja2FkZHIgYWRkcltJV19NQVhfQVBdOworCXN0cnVjdCBpd19xdWFsaXR5IHF1YWxbSVdfTUFYX0FQXTsKKwlpbnQgaTsKKworICAgCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworCQlkYXRhLT5sZW5ndGggPSAwOworCQlyZXR1cm4gMDsKKyAgICAgICAgLy9yZXR1cm4gLUVORVRET1dOOworCX0KKworCWZvciAoaSA9IDA7IGkgPElXX01BWF9BUCA7IGkrKykKKwl7CisJCWlmIChpID49ICBwQWRhcHRlci0+U2NhblRhYi5Cc3NOcikKKwkJCWJyZWFrOworCQlhZGRyW2ldLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwkJCW1lbWNweShhZGRyW2ldLnNhX2RhdGEsICZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKKwkJc2V0X3F1YWxpdHkocEFkYXB0ZXIsICZxdWFsW2ldLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc3NpKTsKKwl9CisJZGF0YS0+bGVuZ3RoID0gaTsKKwltZW1jcHkoZXh0cmEsICZhZGRyLCBpKnNpemVvZihhZGRyWzBdKSk7CisJZGF0YS0+ZmxhZ3MgPSAxOwkJLyogc2lnbmFsIHF1YWxpdHkgcHJlc2VudCAoc29ydCBvZikgKi8KKwltZW1jcHkoZXh0cmEgKyBpKnNpemVvZihhZGRyWzBdKSwgJnF1YWwsIGkqc2l6ZW9mKHF1YWxbaV0pKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgU0lPQ0dJV1NDQU4KK2ludCBydF9pb2N0bF9zaXdzY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKworCVVMT05HCQkJCQkJCQlOb3c7CisJaW50IFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCisgICAgeworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgRHJpdmVyIGlzIGluIE1vbml0b3IgTW9kZSBub3cgISEhXG4iKSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCWlmIChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpCisJeworCQlwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRTY2FuQ291bnQrKzsKKwl9CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisgICAgcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gVFJVRTsKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorCQlyZXR1cm4gMDsKKwlkb3sKKwkJTm93ID0gamlmZmllczsKKworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKwkJaWYgKChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpICYmCisJCQkocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50U2NhbkNvdW50ID4gMykpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBXcGFTdXBwbGljYW50U2NhbkNvdW50ID4gM1xuIikpOworCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisJCWlmICgoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpICYmCisJCQkoKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAorCQkJKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkgJiYKKwkJCShwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkpCisJCXsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMaW5rIFVQLCBQb3J0IE5vdCBTZWN1cmVkISBpZ25vcmUgdGhpcyBzZXQ6Ok9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOXG4iKSk7CisJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKKwkJeworCQkJUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRSBidXN5LCByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7CisJCX0KKworCQkvLyB0ZWxsIENOVEwgc3RhdGUgbWFjaGluZSB0byBjYWxsIE5kaXNNU2V0SW5mb3JtYXRpb25Db21wbGV0ZSgpIGFmdGVyIGNvbXBsZXRpbmcKKwkJLy8gdGhpcyByZXF1ZXN0LCBiZWNhdXNlIHRoaXMgcmVxdWVzdCBpcyBpbml0aWF0ZWQgYnkgTkRJUy4KKwkJcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBGQUxTRTsKKwkJLy8gUmVzZXQgYWxsb3dlZCBzY2FuIHJldHJpZXMKKwkJcEFkYXB0ZXItPlN0YUNmZy5TY2FuQ250ID0gMDsKKwkJcEFkYXB0ZXItPlN0YUNmZy5MYXN0U2NhblRpbWUgPSBOb3c7CisKKwkJTWxtZUVucXVldWUocEFkYXB0ZXIsCisJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCU9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOLAorCQkJMCwKKwkJCU5VTEwpOworCisJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkYXB0ZXIpOworCX13aGlsZSgwKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQoreworCisJUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisJaW50IGk9MDsKKwljaGFyICpjdXJyZW50X2V2ID0gZXh0cmEsICpwcmV2aW91c19ldiA9IGV4dHJhOworCWNoYXIgKmVuZF9idWY7CisJY2hhciAqY3VycmVudF92YWwsIGN1c3RvbVtNQVhfQ1VTVE9NX0xFTl0gPSB7MH07CisjaWZuZGVmIElXRVZHRU5JRQorCWNoYXIgaWR4OworI2VuZGlmIC8vIElXRVZHRU5JRSAvLworCXN0cnVjdCBpd19ldmVudCBpd2U7CisKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorICAgIHsKKwkJLyoKKwkJICogU3RpbGwgc2Nhbm5pbmcsIGluZGljYXRlIHRoZSBjYWxsZXIgc2hvdWxkIHRyeSBhZ2Fpbi4KKwkJICovCisJCXJldHVybiAtRUFHQUlOOworCX0KKworCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCWlmIChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpCisJeworCQlwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRTY2FuQ291bnQgPSAwOworCX0KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKwlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzTnIgPT0gMCkKKwl7CisJCWRhdGEtPmxlbmd0aCA9IDA7CisJCXJldHVybiAwOworCX0KKworI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgIGlmIChkYXRhLT5sZW5ndGggPiAwKQorICAgICAgICBlbmRfYnVmID0gZXh0cmEgKyBkYXRhLT5sZW5ndGg7CisgICAgZWxzZQorICAgICAgICBlbmRfYnVmID0gZXh0cmEgKyBJV19TQ0FOX01BWF9EQVRBOworI2Vsc2UKKyAgICBlbmRfYnVmID0gZXh0cmEgKyBJV19TQ0FOX01BWF9EQVRBOworI2VuZGlmCisKKwlmb3IgKGkgPSAwOyBpIDwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnI7IGkrKykKKwl7CisJCWlmIChjdXJyZW50X2V2ID49IGVuZF9idWYpCisgICAgICAgIHsKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJYnJlYWs7CisjZW5kaWYKKyAgICAgICAgfQorCisJCS8vTUFDIGFkZHJlc3MKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQlpd2UuY21kID0gU0lPQ0dJV0FQOworCQlpd2UudS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwkJCQltZW1jcHkoaXdlLnUuYXBfYWRkci5zYV9kYXRhLCAmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWQsIEVUSF9BTEVOKTsKKworICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9FVkVOVChpbmZvLCBjdXJyZW50X2V2LGVuZF9idWYsICZpd2UsIElXX0VWX0FERFJfTEVOKTsKKyAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJLy9FU1NJRAorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBTSU9DR0lXRVNTSUQ7CisJCWl3ZS51LmRhdGEubGVuZ3RoID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZExlbjsKKwkJaXdlLnUuZGF0YS5mbGFncyA9IDE7CisKKyAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgY3VycmVudF9ldixlbmRfYnVmLCAmaXdlLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkKTsKKyAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJLy9OZXR3b3JrIFR5cGUKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQlpd2UuY21kID0gU0lPQ0dJV01PREU7CisJCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NUeXBlID09IE5kaXM4MDJfMTFJQlNTKQorCQl7CisJCQlpd2UudS5tb2RlID0gSVdfTU9ERV9BREhPQzsKKwkJfQorCQllbHNlIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NUeXBlID09IE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZSkKKwkJeworCQkJaXdlLnUubW9kZSA9IElXX01PREVfSU5GUkE7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpd2UudS5tb2RlID0gSVdfTU9ERV9BVVRPOworCQl9CisJCWl3ZS5sZW4gPSBJV19FVl9VSU5UX0xFTjsKKworICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9FVkVOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCAgSVdfRVZfVUlOVF9MRU4pOworICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJYnJlYWs7CisjZW5kaWYKKworCQkvL0NoYW5uZWwgYW5kIEZyZXF1ZW5jeQorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBTSU9DR0lXRlJFUTsKKwkJaWYgKElORlJBX09OKHBBZGFwdGVyKSB8fCBBREhPQ19PTihwQWRhcHRlcikpCisJCQlpd2UudS5mcmVxLm0gPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5DaGFubmVsOworCQllbHNlCisJCQlpd2UudS5mcmVxLm0gPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5DaGFubmVsOworCQlpd2UudS5mcmVxLmUgPSAwOworCQlpd2UudS5mcmVxLmkgPSAwOworCisJCXByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKwkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX0VWRU5UKGluZm8sIGN1cnJlbnRfZXYsZW5kX2J1ZiwgJml3ZSwgSVdfRVZfRlJFUV9MRU4pOworICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJYnJlYWs7CisjZW5kaWYKKworICAgICAgICAvL0FkZCBxdWFsaXR5IHN0YXRpc3RpY3MKKyAgICAgICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICBtZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworICAgIAlpd2UuY21kID0gSVdFVlFVQUw7CisgICAgCWl3ZS51LnF1YWwubGV2ZWwgPSAwOworICAgIAlpd2UudS5xdWFsLm5vaXNlID0gMDsKKyAgICAgICAgc2V0X3F1YWxpdHkocEFkYXB0ZXIsICZpd2UudS5xdWFsLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc3NpKTsKKyAgICAJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX0VWRU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIElXX0VWX1FVQUxfTEVOKTsKKyAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJLy9FbmN5cHRpb24ga2V5CisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJaXdlLmNtZCA9IFNJT0NHSVdFTkNPREU7CisJCWlmIChDQVBfSVNfUFJJVkFDWV9PTiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQ2FwYWJpbGl0eUluZm8gKSkKKwkJCWl3ZS51LmRhdGEuZmxhZ3MgPUlXX0VOQ09ERV9FTkFCTEVEIHwgSVdfRU5DT0RFX05PS0VZOworCQllbHNlCisJCQlpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCisgICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKyAgICAgICAgY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsJml3ZSwgKGNoYXIgKilwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWyhpd2UudS5kYXRhLmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKS0xXS5LZXkpOworICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJYnJlYWs7CisjZW5kaWYKKworCQkvL0JpdCBSYXRlCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGVMZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIFVDSEFSIHRtcFJhdGUgPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlW3BBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGVMZW4tMV07CisJCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQkJaXdlLmNtZCA9IFNJT0NHSVdSQVRFOworICAgIAkJY3VycmVudF92YWwgPSBjdXJyZW50X2V2ICsgSVdfRVZfTENQX0xFTjsKKyAgICAgICAgICAgIGlmICh0bXBSYXRlID09IDB4ODIpCisgICAgICAgICAgICAgICAgaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICAxICogMTAwMDAwMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHRtcFJhdGUgPT0gMHg4NCkKKyAgICAgICAgICAgICAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gIDIgKiAxMDAwMDAwOworICAgICAgICAgICAgZWxzZSBpZiAodG1wUmF0ZSA9PSAweDhCKQorICAgICAgICAgICAgICAgIGl3ZS51LmJpdHJhdGUudmFsdWUgPSAgNS41ICogMTAwMDAwMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHRtcFJhdGUgPT0gMHg5NikKKyAgICAgICAgICAgICAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gIDExICogMTAwMDAwMDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAJCSAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gICh0bXBSYXRlLzIpICogMTAwMDAwMDsKKworCQkJaXdlLnUuYml0cmF0ZS5kaXNhYmxlZCA9IDA7CisJCQljdXJyZW50X3ZhbCA9IElXRV9TVFJFQU1fQUREX1ZBTFVFKGluZm8sIGN1cnJlbnRfZXYsCisJCQkJY3VycmVudF92YWwsIGVuZF9idWYsICZpd2UsCisgICAgCQkJSVdfRVZfUEFSQU1fTEVOKTsKKworICAgICAgICAJaWYoKGN1cnJlbnRfdmFsLWN1cnJlbnRfZXYpPklXX0VWX0xDUF9MRU4pCisgICAgICAgICAgICAJY3VycmVudF9ldiA9IGN1cnJlbnRfdmFsOworICAgICAgICAJZWxzZQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIH0KKworI2lmZGVmIElXRVZHRU5JRQorCQkvL1dQQSBJRQorCQlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW4gPiAwKQorCQl7CisJCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCQkJbWVtc2V0KCZjdXN0b21bMF0sIDAsIE1BWF9DVVNUT01fTEVOKTsKKwkJCW1lbWNweShjdXN0b20sICYocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVbMF0pLAorCQkJCQkJICAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW4pOworCQkJaXdlLmNtZCA9IElXRVZHRU5JRTsKKwkJCWl3ZS51LmRhdGEubGVuZ3RoID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW47CisJCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgY3VzdG9tKTsKKwkJCWlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJICAgIGJyZWFrOworI2VuZGlmCisJCX0KKworCQkvL1dQQTIgSUUKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuID4gMCkKKyAgICAgICAgeworICAgICAgICAJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJCW1lbXNldCgmY3VzdG9tWzBdLCAwLCBNQVhfQ1VTVE9NX0xFTik7CisJCQltZW1jcHkoY3VzdG9tLCAmKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFWzBdKSwKKwkJCQkJCSAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuKTsKKwkJCWl3ZS5jbWQgPSBJV0VWR0VOSUU7CisJCQlpd2UudS5kYXRhLmxlbmd0aCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuOworCQkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIGN1c3RvbSk7CisJCQlpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKyAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOworI2Vsc2UKKwkJCSAgICBicmVhazsKKyNlbmRpZgorICAgICAgICB9CisjZWxzZQorICAgICAgICAvL1dQQSBJRQorCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbiA+IDApCisgICAgICAgIHsKKyAgICAJCU5kaXNaZXJvTWVtb3J5KCZpd2UsIHNpemVvZihpd2UpKTsKKwkJCW1lbXNldCgmY3VzdG9tWzBdLCAwLCBNQVhfQ1VTVE9NX0xFTik7CisgICAgCQlpd2UuY21kID0gSVdFVkNVU1RPTTsKKyAgICAgICAgICAgIGl3ZS51LmRhdGEubGVuZ3RoID0gKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuICogMikgKyA3OworICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoY3VzdG9tLCAid3BhX2llPSIsIDcpOworICAgICAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbjsgaWR4KyspCisgICAgICAgICAgICAgICAgc3ByaW50ZihjdXN0b20sICIlcyUwMngiLCBjdXN0b20sIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFW2lkeF0pOworICAgICAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworICAgIAkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsICBjdXN0b20pOworICAgICAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKKyNlbHNlCisJCQkgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIC8vV1BBMiBJRQorICAgICAgICBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW4gPiAwKQorICAgICAgICB7CisgICAgCQlOZGlzWmVyb01lbW9yeSgmaXdlLCBzaXplb2YoaXdlKSk7CisJCQltZW1zZXQoJmN1c3RvbVswXSwgMCwgTUFYX0NVU1RPTV9MRU4pOworICAgIAkJaXdlLmNtZCA9IElXRVZDVVNUT007CisgICAgICAgICAgICBpd2UudS5kYXRhLmxlbmd0aCA9IChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbiAqIDIpICsgNzsKKyAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KGN1c3RvbSwgInJzbl9pZT0iLCA3KTsKKwkJCWZvciAoaWR4ID0gMDsgaWR4IDwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW47IGlkeCsrKQorICAgICAgICAgICAgICAgIHNwcmludGYoY3VzdG9tLCAiJXMlMDJ4IiwgY3VzdG9tLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRVtpZHhdKTsKKyAgICAgICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKyAgICAJCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCAgY3VzdG9tKTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorI2lmIFdJUkVMRVNTX0VYVCA+PSAxNworICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisjZWxzZQorCQkJICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIH0KKyNlbmRpZiAvLyBJV0VWR0VOSUUgLy8KKwl9CisKKwlkYXRhLT5sZW5ndGggPSBjdXJyZW50X2V2IC0gZXh0cmE7CisgICAgcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7CisJREJHUFJJTlQoUlRfREVCVUdfRVJST1IgLCgiPT09PnJ0X2lvY3RsX2dpd3NjYW4uICVkKCVkKSBCU1MgcmV0dXJuZWQsIGRhdGEtPmxlbmd0aCA9ICVkXG4iLGkgLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NOciwgZGF0YS0+bGVuZ3RoKSk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworaW50IHJ0X2lvY3RsX3Npd2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmVzc2lkKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworICAgICAgIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgICAgCXJldHVybiAtRU5FVERPV047CisgICAgfQorCisJaWYgKGRhdGEtPmZsYWdzKQorCXsKKwkJUENIQVIJcFNzaWRTdHJpbmcgPSBOVUxMOworCisJCS8vIEluY2x1ZGVzIG51bGwgY2hhcmFjdGVyLgorCQlpZiAoZGF0YS0+bGVuZ3RoID4gKElXX0VTU0lEX01BWF9TSVpFICsgMSkpCisJCQlyZXR1cm4gLUUyQklHOworCisJCXBTc2lkU3RyaW5nID0gKENIQVIgKikga21hbGxvYyhNQVhfTEVOX09GX1NTSUQrMSwgTUVNX0FMTE9DX0ZMQUcpOworCQlpZiAocFNzaWRTdHJpbmcpCisJCXsKKwkJCU5kaXNaZXJvTWVtb3J5KHBTc2lkU3RyaW5nLCBNQVhfTEVOX09GX1NTSUQrMSk7CisJCQlOZGlzTW92ZU1lbW9yeShwU3NpZFN0cmluZywgZXNzaWQsIGRhdGEtPmxlbmd0aCk7CisJCQlpZiAoU2V0X1NTSURfUHJvYyhwQWRhcHRlciwgcFNzaWRTdHJpbmcpID09IEZBTFNFKQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWVsc2UKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKwllbHNlCisJeworCQkvLyBBTlkgc3NpZAorCQlpZiAoU2V0X1NTSURfUHJvYyhwQWRhcHRlciwgIiIpID09IEZBTFNFKQorCQkJcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3ZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXNzaWQpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPnByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPnByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPnByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlkYXRhLT5mbGFncyA9IDE7CisgICAgaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQorICAgIHsKKyAgICAgICAgZGF0YS0+bGVuZ3RoICA9IDA7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIk1lZGlhU3RhdGUgaXMgY29ubmVjdGVkXG4iKSk7CisJCWRhdGEtPmxlbmd0aCA9IHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbjsKKwkJbWVtY3B5KGVzc2lkLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWQsIHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbik7CisJfQorI2lmZGVmIFJUMjg3MAorI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAvLyBBZGQgZm9yIFJUMjg3MAorICAgIGVsc2UgaWYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpCisgICAgeworICAgICAgICBkYXRhLT5sZW5ndGggPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWRMZW47CisJCW1lbWNweShlc3NpZCwgcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWRMZW4pOworCX0KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisjZW5kaWYgLy8gUlQyODcwIC8vCisJZWxzZQorCXsvL3RoZSBBTlkgc3NpZCB3YXMgc3BlY2lmaWVkCisJCWRhdGEtPmxlbmd0aCAgPSAwOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJNZWRpYVN0YXRlIGlzIG5vdCBjb25uZWN0ZWQsIGVzc1xuIikpOworCX0KKworCXJldHVybiAwOworCit9CisKK2ludCBydF9pb2N0bF9zaXduaWNrbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpuaWNrbmFtZSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgICAgICByZXR1cm4gLUVORVRET1dOOworICAgIH0KKworCWlmIChkYXRhLT5sZW5ndGggPiBJV19FU1NJRF9NQVhfU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1zZXQocEFkYXB0ZXItPm5pY2tuYW1lLCAwLCBJV19FU1NJRF9NQVhfU0laRSArIDEpOworCW1lbWNweShwQWRhcHRlci0+bmlja25hbWUsIG5pY2tuYW1lLCBkYXRhLT5sZW5ndGgpOworCisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd25pY2tuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKm5pY2tuYW1lKQoreworCVBSVE1QX0FEQVBURVIgCXBBZGFwdGVyID0gTlVMTDsKKwlWSVJUVUFMX0FEQVBURVIgKnBWaXJ0dWFsQWQgPSBOVUxMOworCisJaWYgKGRldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZGFwdGVyID0gZGV2LT5wcml2OworCX0KKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5wcml2OworCQlpZiAocFZpcnR1YWxBZCAmJiBwVmlydHVhbEFkLT5SdG1wRGV2KQorCQkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5wcml2OworCX0KKworCWlmIChwQWRhcHRlciA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJaWYgKGRhdGEtPmxlbmd0aCA+IHN0cmxlbihwQWRhcHRlci0+bmlja25hbWUpICsgMSkKKwkJZGF0YS0+bGVuZ3RoID0gc3RybGVuKHBBZGFwdGVyLT5uaWNrbmFtZSkgKyAxOworCWlmIChkYXRhLT5sZW5ndGggPiAwKSB7CisJCW1lbWNweShuaWNrbmFtZSwgcEFkYXB0ZXItPm5pY2tuYW1lLCBkYXRhLT5sZW5ndGgtMSk7CisJCW5pY2tuYW1lW2RhdGEtPmxlbmd0aC0xXSA9ICdcMCc7CisJfQorCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfc2l3cnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICAgc3RydWN0IGl3X3BhcmFtICpydHMsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCXUxNiB2YWw7CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAgcmV0dXJuIC1FTkVURE9XTjsKKyAgICB9CisKKwlpZiAocnRzLT5kaXNhYmxlZCkKKwkJdmFsID0gTUFYX1JUU19USFJFU0hPTEQ7CisJZWxzZSBpZiAocnRzLT52YWx1ZSA8IDAgfHwgcnRzLT52YWx1ZSA+IE1BWF9SVFNfVEhSRVNIT0xEKQorCQlyZXR1cm4gLUVJTlZBTDsKKwllbHNlIGlmIChydHMtPnZhbHVlID09IDApCisJICAgIHZhbCA9IE1BWF9SVFNfVEhSRVNIT0xEOworCWVsc2UKKwkJdmFsID0gcnRzLT52YWx1ZTsKKworCWlmICh2YWwgIT0gcEFkYXB0ZXItPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQpCisJCXBBZGFwdGVyLT5Db21tb25DZmcuUnRzVGhyZXNob2xkID0gdmFsOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKnJ0cywgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPnByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPnByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPnByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKworCXJ0cy0+dmFsdWUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZDsKKwlydHMtPmRpc2FibGVkID0gKHJ0cy0+dmFsdWUgPT0gTUFYX1JUU19USFJFU0hPTEQpOworCXJ0cy0+Zml4ZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9zaXdmcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BhcmFtICpmcmFnLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKwl1MTYgdmFsOworCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICAJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIAl7CisgICAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAgCXJldHVybiAtRU5FVERPV047CisgICAgCX0KKworCWlmIChmcmFnLT5kaXNhYmxlZCkKKwkJdmFsID0gTUFYX0ZSQUdfVEhSRVNIT0xEOworCWVsc2UgaWYgKGZyYWctPnZhbHVlID49IE1JTl9GUkFHX1RIUkVTSE9MRCB8fCBmcmFnLT52YWx1ZSA8PSBNQVhfRlJBR19USFJFU0hPTEQpCisgICAgICAgIHZhbCA9IF9fY3B1X3RvX2xlMTYoZnJhZy0+dmFsdWUgJiB+MHgxKTsgLyogZXZlbiBudW1iZXJzIG9ubHkgKi8KKwllbHNlIGlmIChmcmFnLT52YWx1ZSA9PSAwKQorCSAgICB2YWwgPSBNQVhfRlJBR19USFJFU0hPTEQ7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBBZGFwdGVyLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSB2YWw7CisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9naXdmcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BhcmFtICpmcmFnLCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSIAlwQWRhcHRlciA9IE5VTEw7CisJVklSVFVBTF9BREFQVEVSICpwVmlydHVhbEFkID0gTlVMTDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+cHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+cHJpdjsKKwkJaWYgKHBWaXJ0dWFsQWQgJiYgcFZpcnR1YWxBZC0+UnRtcERldikKKwkJCXBBZGFwdGVyID0gcFZpcnR1YWxBZC0+UnRtcERldi0+cHJpdjsKKwl9CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisJfQorCisJZnJhZy0+dmFsdWUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkOworCWZyYWctPmRpc2FibGVkID0gKGZyYWctPnZhbHVlID09IE1BWF9GUkFHX1RIUkVTSE9MRCk7CisJZnJhZy0+Zml4ZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgTUFYX1dFUF9LRVlfU0laRSAxMworI2RlZmluZSBNSU5fV0VQX0tFWV9TSVpFIDUKK2ludCBydF9pb2N0bF9zaXdlbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgc3RydWN0IGl3X3BvaW50ICplcnEsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCisJLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICAJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIAl7CisgICAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAgICAgCXJldHVybiAtRU5FVERPV047CisgICAgCX0KKworCWlmICgoZXJxLT5sZW5ndGggPT0gMCkgJiYKKyAgICAgICAgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpKQorCXsKKwkJcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCQlwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCQlwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworICAgICAgICBnb3RvIGRvbmU7CisJfQorCWVsc2UgaWYgKChlcnEtPmxlbmd0aCA9PSAwKSAmJgorICAgICAgICAgICAgIChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX1JFU1RSSUNURUQgfHwgZXJxLT5mbGFncyAmIElXX0VOQ09ERV9PUEVOKSkKKwl7CisJICAgIC8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKwkJcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisJCXBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKwkJcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisJCWlmIChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX1JFU1RSSUNURUQpCisJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkOworICAgIAllbHNlCisJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKyAgICAgICAgZ290byBkb25lOworCX0KKworICAgIGlmIChlcnEtPmxlbmd0aCA+IDApCisJeworCQlpbnQga2V5SWR4ID0gKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKwkJLyogQ2hlY2sgdGhlIHNpemUgb2YgdGhlIGtleSAqLworCQlpZiAoZXJxLT5sZW5ndGggPiBNQVhfV0VQX0tFWV9TSVpFKSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkvKiBDaGVjayBrZXkgaW5kZXggKi8KKwkJaWYgKChrZXlJZHggPCAwKSB8fCAoa2V5SWR4ID49IE5SX1dFUF9LRVlTKSkKKyAgICAgICAgeworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT0+cnRfaW9jdGxfc2l3ZW5jb2RlOjpXcm9uZyBrZXlJZHg9JWQhIFVzaW5nIGRlZmF1bHQga2V5IGluc3RlYWQgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlJZHgsIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkKSk7CisKKyAgICAgICAgICAgIC8vVXNpbmcgZGVmYXVsdCBrZXkKKwkJCWtleUlkeCA9IHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkOworICAgICAgICB9CisKKyAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwgIDE2KTsKKworCQlpZiAoZXJxLT5sZW5ndGggPT0gTUFYX1dFUF9LRVlfU0laRSkKKyAgICAgICAgeworCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IE1BWF9XRVBfS0VZX1NJWkU7CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKwkJfQorCQllbHNlIGlmIChlcnEtPmxlbmd0aCA9PSBNSU5fV0VQX0tFWV9TSVpFKQorICAgICAgICB7CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gTUlOX1dFUF9LRVlfU0laRTsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCX0KKwkJZWxzZQorCQkJLyogRGlzYWJsZSB0aGUga2V5ICovCisJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gMDsKKworCQkvKiBDaGVjayBpZiB0aGUga2V5IGlzIG5vdCBtYXJrZWQgYXMgaW52YWxpZCAqLworCQlpZighKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfTk9LRVkpKSB7CisJCQkvKiBDb3B5IHRoZSBrZXkgaW4gdGhlIGRyaXZlciAqLworCQkJTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwgZXh0cmEsIGVycS0+bGVuZ3RoKTsKKyAgICAgICAgfQorCX0KKyAgICBlbHNlCisJCQl7CisJCS8qIERvIHdlIHdhbnQgdG8ganVzdCBzZXQgdGhlIHRyYW5zbWl0IGtleSBpbmRleCA/ICovCisJCWludCBpbmRleCA9IChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisJCWlmICgoaW5kZXggPj0gMCkgJiYgKGluZGV4IDwgNCkpCisgICAgICAgIHsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gaW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UKKwkJCS8qIERvbid0IGNvbXBsYWluIGlmIG9ubHkgY2hhbmdlIHRoZSBtb2RlICovCisJCQlpZighZXJxLT5mbGFncyAmIElXX0VOQ09ERV9NT0RFKSB7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKK2RvbmU6CisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT0+cnRfaW9jdGxfc2l3ZW5jb2RlOjplcnEtPmZsYWdzPSV4XG4iLGVycS0+ZmxhZ3MpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6OkF1dGhNb2RlPSV4XG4iLHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6OkRlZmF1bHRLZXlJZD0leCwgS2V5TGVuID0gJWRcbiIscEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4pKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6OldlcFN0YXR1cz0leFxuIixwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cykpOworCXJldHVybiAwOworfQorCitpbnQKK3J0X2lvY3RsX2dpd2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcG9pbnQgKmVycSwgY2hhciAqa2V5KQoreworCWludCBraWQ7CisJUFJUTVBfQURBUFRFUiAJcEFkYXB0ZXIgPSBOVUxMOworCVZJUlRVQUxfQURBUFRFUiAqcFZpcnR1YWxBZCA9IE5VTEw7CisKKwlpZiAoZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQorCXsKKwkJcEFkYXB0ZXIgPSBkZXYtPnByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBkZXYtPnByaXY7CisJCWlmIChwVmlydHVhbEFkICYmIHBWaXJ0dWFsQWQtPlJ0bXBEZXYpCisJCQlwQWRhcHRlciA9IHBWaXJ0dWFsQWQtPlJ0bXBEZXYtPnByaXY7CisJfQorCisJaWYgKHBBZGFwdGVyID09IE5VTEwpCisJeworCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOworCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWtpZCA9IGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVg7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PnJ0X2lvY3RsX2dpd2VuY29kZSAlZFxuIiwgZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkpOworCisJaWYgKHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKKwl7CisJCWVycS0+bGVuZ3RoID0gMDsKKwkJZXJxLT5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwl9CisJZWxzZSBpZiAoKGtpZCA+IDApICYmIChraWQgPD00KSkKKwl7CisJCS8vIGNvcHkgd2VwIGtleQorCQllcnEtPmZsYWdzID0ga2lkIDsJCQkvKiBOQjogYmFzZSAxICovCisJCWlmIChlcnEtPmxlbmd0aCA+IHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2lkLTFdLktleUxlbikKKwkJCWVycS0+bGVuZ3RoID0gcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtraWQtMV0uS2V5TGVuOworCQltZW1jcHkoa2V5LCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tpZC0xXS5LZXksIGVycS0+bGVuZ3RoKTsKKwkJLy9pZiAoKGtpZCA9PSBwQWRhcHRlci0+UG9ydENmZy5EZWZhdWx0S2V5SWQpKQorCQkvL2VycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0VOQUJMRUQ7CS8qIFhYWCAqLworCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9SRVNUUklDVEVEOwkJLyogWFhYICovCisJCWVsc2UKKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX09QRU47CQkvKiBYWFggKi8KKworCX0KKwllbHNlIGlmIChraWQgPT0gMCkKKwl7CisJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkKKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX1JFU1RSSUNURUQ7CQkvKiBYWFggKi8KKwkJZWxzZQorCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfT1BFTjsJCS8qIFhYWCAqLworCQllcnEtPmxlbmd0aCA9IHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbjsKKwkJbWVtY3B5KGtleSwgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LCBlcnEtPmxlbmd0aCk7CisJCS8vIGNvcHkgZGVmYXVsdCBrZXkgSUQKKwkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKQorCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfUkVTVFJJQ1RFRDsJCS8qIFhYWCAqLworCQllbHNlCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9PUEVOOwkJLyogWFhYICovCisJCWVycS0+ZmxhZ3MgPSBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCArIDE7CQkJLyogTkI6IGJhc2UgMSAqLworCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOwkvKiBYWFggKi8KKwl9CisKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50CitydF9pb2N0bF9zZXRwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHZvaWQgKncsIGNoYXIgKmV4dHJhKQoreworICAgIFZJUlRVQUxfQURBUFRFUgkqcFZpcnR1YWxBZCA9IE5VTEw7CisJUFJUTVBfQURBUFRFUiBwQWRhcHRlcjsKKwlQT1NfQ09PS0lFIHBPYmo7CisJY2hhciAqdGhpc19jaGFyID0gZXh0cmE7CisJY2hhciAqdmFsdWU7CisJaW50ICBTdGF0dXM9MDsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJeworCQlwQWRhcHRlciA9IGRldi0+cHJpdjsKKwl9CisJZWxzZQorCXsKKwkJcFZpcnR1YWxBZCA9IGRldi0+cHJpdjsKKwkJcEFkYXB0ZXIgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5wcml2OworCX0KKwlwT2JqID0gKFBPU19DT09LSUUpIHBBZGFwdGVyLT5PU19Db29raWU7CisKKwlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7CisJCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCXsKKwkJcE9iai0+aW9jdGxfaWZfdHlwZSA9IElOVF9NQUlOOworICAgICAgICBwT2JqLT5pb2N0bF9pZiA9IE1BSU5fTUJTU0lEOworCX0KKworCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisgICAgCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKyAgICAJeworICAgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCQlyZXR1cm4gLUVORVRET1dOOworICAgIAl9CisKKwlpZiAoISp0aGlzX2NoYXIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCh2YWx1ZSA9IHJ0c3RyY2hyKHRoaXNfY2hhciwgJz0nKSkgIT0gTlVMTCkKKwkgICAgKnZhbHVlKysgPSAwOworCisJaWYgKCF2YWx1ZSkKKwkgICAgcmV0dXJuIC1FSU5WQUw7CisKKwkvLyByZWplY3Qgc2V0dGluZyBub3RoaW5nIGJlc2lkZXMgQU5ZIHNzaWQoc3NpZExlbj0wKQorICAgIGlmICghKnZhbHVlICYmIChzdHJjbXAodGhpc19jaGFyLCAiU1NJRCIpICE9IDApKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworCWZvciAoUFJUTVBfUFJJVkFURV9TRVRfUFJPQyA9IFJUTVBfUFJJVkFURV9TVVBQT1JUX1BST0M7IFBSVE1QX1BSSVZBVEVfU0VUX1BST0MtPm5hbWU7IFBSVE1QX1BSSVZBVEVfU0VUX1BST0MrKykKKwl7CisJICAgIGlmIChzdHJjbXAodGhpc19jaGFyLCBQUlRNUF9QUklWQVRFX1NFVF9QUk9DLT5uYW1lKSA9PSAwKQorCSAgICB7CisJICAgICAgICBpZighUFJUTVBfUFJJVkFURV9TRVRfUFJPQy0+c2V0X3Byb2MocEFkYXB0ZXIsIHZhbHVlKSkKKwkgICAgICAgIHsJLy9GQUxTRTpTZXQgcHJpdmF0ZSBmYWlsZWQgdGhlbiByZXR1cm4gSW52YWxpZCBhcmd1bWVudAorCQkJICAgIFN0YXR1cyA9IC1FSU5WQUw7CisJICAgICAgICB9CisJCSAgICBicmVhazsJLy9FeGl0IGZvciBsb29wLgorCSAgICB9CisJfQorCisJaWYoUFJUTVBfUFJJVkFURV9TRVRfUFJPQy0+bmFtZSA9PSBOVUxMKQorCXsgIC8vTm90IGZvdW5kIGFyZ3VtZW50CisJICAgIFN0YXR1cyA9IC1FSU5WQUw7CisJICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5ydF9pb2N0bF9zZXRwYXJhbTo6IChpd3ByaXYpIE5vdCBTdXBwb3J0IFNldCBDb21tYW5kIFslcz0lc11cbiIsIHRoaXNfY2hhciwgdmFsdWUpKTsKKwl9CisKKyAgICByZXR1cm4gU3RhdHVzOworfQorCisKK3N0YXRpYyBpbnQKK3J0X3ByaXZhdGVfZ2V0X3N0YXRpc3RpY3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJc3RydWN0IGl3X3BvaW50ICp3cnEsIGNoYXIgKmV4dHJhKQoreworCUlOVAkJCQlTdGF0dXMgPSAwOworICAgIFBSVE1QX0FEQVBURVIgICBwQWQgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCisgICAgaWYgKGV4dHJhID09IE5VTEwpCisgICAgeworICAgICAgICB3cnEtPmxlbmd0aCA9IDA7CisgICAgICAgIHJldHVybiAtRUlPOworICAgIH0KKworICAgIG1lbXNldChleHRyYSwgMHgwMCwgSVdfUFJJVl9TSVpFX01BU0spOworICAgIHNwcmludGYoZXh0cmEsICJcblxuIik7CisKKyNpZmRlZiBSQUxJTktfQVRFCisJaWYgKEFURV9PTihwQWQpKQorCXsKKwkgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+YXRlLlR4RG9uZUNvdW50KTsKKwkgICAgLy9zcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJUeCBzdWNjZXNzIHdpdGhvdXQgcmV0cnkgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5hdGUuVHhEb25lQ291bnQpOworCX0KKwllbHNlCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCXsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJUeCBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0KTsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJUeCBzdWNjZXNzIHdpdGhvdXQgcmV0cnkgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0IC0gKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQuUXVhZFBhcnQpOworCX0KKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJUeCBzdWNjZXNzIGFmdGVyIHJldHJ5ICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC5RdWFkUGFydCk7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggZmFpbCB0byBSY3YgQUNLIGFmdGVyIHJldHJ5ICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLkZhaWxlZENvdW50LlF1YWRQYXJ0KTsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSVFMgU3VjY2VzcyBSY3YgQ1RTICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuUlRTU3VjY2Vzc0NvdW50LlF1YWRQYXJ0KTsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSVFMgRmFpbCBSY3YgQ1RTICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuUlRTRmFpbHVyZUNvdW50LlF1YWRQYXJ0KTsKKworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJ4IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5SZWNlaXZlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQpOworICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJ4IHdpdGggQ1JDICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LlF1YWRQYXJ0KTsKKyAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSeCBkcm9wIGR1ZSB0byBvdXQgb2YgcmVzb3VyY2UgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlcik7CisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUnggZHVwbGljYXRlIGZyYW1lICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLkZyYW1lRHVwbGljYXRlQ291bnQuUXVhZFBhcnQpOworCisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiRmFsc2UgQ0NBIChvbmUgc2Vjb25kKSAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjRmFsc2VDQ0FDbnQpOworI2lmZGVmIFJBTElOS19BVEUKKwlpZiAoQVRFX09OKHBBZCkpCisJeworCQlpZiAocEFkLT5hdGUuUnhBbnRlbm5hU2VsID09IDApCisJCXsKKyAgICAJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChMT05HKShwQWQtPmF0ZS5MYXN0UnNzaTAgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7CisJCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUIgKGlmIGF2YWlsYWJsZSkgICAgICAgICAgID0gJWxkXG4iLCAoTE9ORykocEFkLT5hdGUuTGFzdFJzc2kxIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOworCQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1DIChpZiBhdmFpbGFibGUpICAgICAgICAgICA9ICVsZFxuXG4iLCAoTE9ORykocEFkLT5hdGUuTGFzdFJzc2kyIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOworCQl9CisJCWVsc2UKKwkJeworICAgIAkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKExPTkcpKHBBZC0+YXRlLkxhc3RSc3NpMCAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKKwkJfQorCX0KKwllbHNlCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCXsKKyAgICAJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1BICAgICAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKExPTkcpKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOworICAgICAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUIgKGlmIGF2YWlsYWJsZSkgICAgICAgICAgID0gJWxkXG4iLCAoTE9ORykocEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7CisgICAgICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQyAoaWYgYXZhaWxhYmxlKSAgICAgICAgICAgPSAlbGRcblxuIiwgKExPTkcpKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOworCX0KKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiV3BhU3VwcGxpY2FudFVQICAgICAgICAgICAgICAgICA9ICVkXG5cbiIsIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCk7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisKKyAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gcnRfcHJpdmF0ZV9nZXRfc3RhdGlzdGljcywgd3JxLT5sZW5ndGggPSAlZFxuIiwgd3JxLT5sZW5ndGgpKTsKKworICAgIHJldHVybiBTdGF0dXM7Cit9CisKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKK3ZvaWQJZ2V0QmFJbmZvKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCXBPdXRCdWYpCit7CisJSU5UIGksIGo7CisJQkFfT1JJX0VOVFJZICpwT3JpQkFFbnRyeTsKKwlCQV9SRUNfRU5UUlkgKnBSZWNCQUVudHJ5OworCisJZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKKwl7CisJCVBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV07CisJCWlmICgoKHBFbnRyeS0+VmFsaWRBc0NMSSB8fCBwRW50cnktPlZhbGlkQXNBcENsaSkgJiYgKHBFbnRyeS0+U3N0ID09IFNTVF9BU1NPQykpCisJCQl8fCAocEVudHJ5LT5WYWxpZEFzV0RTKSB8fCAocEVudHJ5LT5WYWxpZEFzTWVzaCkpCisJCXsKKwkJCXNwcmludGYocE91dEJ1ZiwgIiVzXG4lMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCAoQWlkID0gJWQpIChBUCkgLVxuIiwKKyAgICAgICAgICAgICAgICBwT3V0QnVmLAorCQkJCXBFbnRyeS0+QWRkclswXSwgcEVudHJ5LT5BZGRyWzFdLCBwRW50cnktPkFkZHJbMl0sCisJCQkJcEVudHJ5LT5BZGRyWzNdLCBwRW50cnktPkFkZHJbNF0sIHBFbnRyeS0+QWRkcls1XSwgcEVudHJ5LT5BaWQpOworCisJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1tSZWNpcGllbnRdXG4iLCBwT3V0QnVmKTsKKwkJCWZvciAoaj0wOyBqIDwgTlVNX09GX1RJRDsgaisrKQorCQkJeworCQkJCWlmIChwRW50cnktPkJBUmVjV2NpZEFycmF5W2pdICE9IDApCisJCQkJeworCQkJCQlwUmVjQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W3BFbnRyeS0+QkFSZWNXY2lkQXJyYXlbal1dOworCQkJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1RJRD0lZCwgQkFXaW5TaXplPSVkLCBMYXN0SW5kU2VxPSVkLCBSZW9yZGVyaW5nUGt0cz0lZFxuIiwgcE91dEJ1ZiwgaiwgcFJlY0JBRW50cnktPkJBV2luU2l6ZSwgcFJlY0JBRW50cnktPkxhc3RJbmRTZXEsIHBSZWNCQUVudHJ5LT5saXN0LnFsZW4pOworCQkJCX0KKwkJCX0KKwkJCXNwcmludGYocE91dEJ1ZiwgIiVzXG4iLCBwT3V0QnVmKTsKKworCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNbT3JpZ2luYXRvcl1cbiIsIHBPdXRCdWYpOworCQkJZm9yIChqPTA7IGogPCBOVU1fT0ZfVElEOyBqKyspCisJCQl7CisJCQkJaWYgKHBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbal0gIT0gMCkKKwkJCQl7CisJCQkJCXBPcmlCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtqXV07CisJCQkJCXNwcmludGYocE91dEJ1ZiwgIiVzVElEPSVkLCBCQVdpblNpemU9JWQsIFN0YXJ0U2VxPSVkLCBDdXJUeFNlcT0lZFxuIiwgcE91dEJ1ZiwgaiwgcE9yaUJBRW50cnktPkJBV2luU2l6ZSwgcE9yaUJBRW50cnktPlNlcXVlbmNlLCBwRW50cnktPlR4U2VxW2pdKTsKKwkJCQl9CisJCQl9CisJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1xuXG4iLCBwT3V0QnVmKTsKKwkJfQorICAgICAgICBpZiAoc3RybGVuKHBPdXRCdWYpID4gKElXX1BSSVZfU0laRV9NQVNLIC0gMzApKQorICAgICAgICAgICAgICAgIGJyZWFrOworCX0KKworCXJldHVybjsKK30KKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKworc3RhdGljIGludAorcnRfcHJpdmF0ZV9zaG93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBpd19wb2ludCAqd3JxLCBjaGFyICpleHRyYSkKK3sKKyAgICBJTlQJCQkJU3RhdHVzID0gMDsKKyAgICBWSVJUVUFMX0FEQVBURVIJKnBWaXJ0dWFsQWQgPSBOVUxMOworICAgIFBSVE1QX0FEQVBURVIgICBwQWQ7CisJUE9TX0NPT0tJRQkJcE9iajsKKyAgICB1MzIgICAgICAgICAgICAgc3ViY21kID0gd3JxLT5mbGFnczsKKworCWlmIChkZXYtPnByaXZfZmxhZ3MgPT0gSU5UX01BSU4pCisJCXBBZCA9IGRldi0+cHJpdjsKKwllbHNlCisJeworCQlwVmlydHVhbEFkID0gZGV2LT5wcml2OworCQlwQWQgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5wcml2OworCX0KKwlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisJaWYgKHBBZCA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisgICAgaWYgKGV4dHJhID09IE5VTEwpCisgICAgeworICAgICAgICB3cnEtPmxlbmd0aCA9IDA7CisgICAgICAgIHJldHVybiAtRUlPOworICAgIH0KKyAgICBtZW1zZXQoZXh0cmEsIDB4MDAsIElXX1BSSVZfU0laRV9NQVNLKTsKKworCXsKKwkJcE9iai0+aW9jdGxfaWZfdHlwZSA9IElOVF9NQUlOOworICAgICAgICBwT2JqLT5pb2N0bF9pZiA9IE1BSU5fTUJTU0lEOworCX0KKworICAgIHN3aXRjaChzdWJjbWQpCisgICAgeworCisgICAgICAgIGNhc2UgU0hPV19DT05OX1NUQVRVUzoKKyAgICAgICAgICAgIGlmIChNT05JVE9SX09OKHBBZCkpCisgICAgICAgICAgICB7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgICAgICAgICAgICAgaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCAmJgorICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcpCisgICAgICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJNb25pdG9yIE1vZGUoQ2VudHJhbENoYW5uZWwgJWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisgICAgICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiTW9uaXRvciBNb2RlKENoYW5uZWwgJWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPT0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCSAgICBpZiAoSU5GUkFfT04ocEFkKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiQ29ubmVjdGVkKEFQOiAlc1slMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWF0pXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuU3NpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFs1XSk7CisgICAgICAgICAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIlNzaWQ9JXMgLFNzaWRsZW4gPSAlZFxuIixwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuKSk7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBREhPQ19PTihwQWQpKQorICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIkNvbm5lY3RlZFxuIik7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgCWVsc2UKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJICAgIHNwcmludGYoZXh0cmEsICJEaXNjb25uZWN0ZWRcbiIpOworICAgICAgICAgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJDb25uU3RhdHVzIGlzIG5vdCBjb25uZWN0ZWRcbiIpKTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNIT1dfRFJWSUVSX1ZFUklPTjoKKyAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJEcml2ZXIgdmVyc2lvbi0lcywgJXMgJXNcbiIsIFNUQV9EUklWRVJfVkVSU0lPTiwgX19EQVRFX18sIF9fVElNRV9fICk7CisgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgICAgICBjYXNlIFNIT1dfQkFfSU5GTzoKKyAgICAgICAgICAgIGdldEJhSW5mbyhwQWQsIGV4dHJhKTsKKyAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCWNhc2UgU0hPV19ERVNDX0lORk86CisJCQl7CisJCQkJU2hvd19EZXNjSW5mb19Qcm9jKHBBZCwgTlVMTCk7CisJCQkJd3JxLT5sZW5ndGggPSAwOyAvLyAxOiBzaXplIG9mICdcMCcKKwkJCX0KKwkJCWJyZWFrOworICAgICAgICBjYXNlIFJBSU9fT0ZGOgorICAgICAgICAgICAgaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIlNjYW5uaW5nXG4iKTsKKyAgICAgICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuYlJhZGlvICE9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlJhZGlvID0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKTsKKyAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IEZBTFNFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTWxtZVJhZGlvT2ZmKHBBZCk7CisgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbgorCQkJCQlwQWQtPkV4dHJhSW5mbyA9IFNXX1JBRElPX09GRjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiUmFkaW8gT2ZmXG4iKTsKKyAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkFJT19PTjoKKyAgICAgICAgICAgIGlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJTY2FubmluZ1xuIik7CisgICAgICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWQtPlN0YUNmZy5iU3dSYWRpbyA9IFRSVUU7CisgICAgICAgICAgICAvL2lmIChwQWQtPlN0YUNmZy5iUmFkaW8gIT0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5iUmFkaW8gPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pOworICAgICAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE1sbWVSYWRpb09uKHBBZCk7CisgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbgorCQkJCQlwQWQtPkV4dHJhSW5mbyA9IEVYVFJBX0lORk9fQ0xFQVI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIlJhZGlvIE9uXG4iKTsKKyAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworICAgICAgICAgICAgYnJlYWs7CisKKworI2lmZGVmIFFPU19ETFNfU1VQUE9SVAorCQljYXNlIFNIT1dfRExTX0VOVFJZX0lORk86CisJCQl7CisJCQkJU2V0X0Rsc0VudHJ5SW5mb19EaXNwbGF5X1Byb2MocEFkLCBOVUxMKTsKKwkJCQl3cnEtPmxlbmd0aCA9IDA7IC8vIDE6IHNpemUgb2YgJ1wwJworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisKKwkJY2FzZSBTSE9XX0NGR19WQUxVRToKKwkJCXsKKwkJCQlTdGF0dXMgPSBSVE1QU2hvd0NmZ1ZhbHVlKHBBZCwgd3JxLT5wb2ludGVyLCBleHRyYSk7CisJCQkJaWYgKFN0YXR1cyA9PSAwKQorCQkJCQl3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFNIT1dfQURIT0NfRU5UUllfSU5GTzoKKwkJCVNob3dfQWRob2NfTWFjVGFibGVfUHJvYyhwQWQsIGV4dHJhKTsKKwkJCXdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworCQkJYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAtIHVua25vdyBzdWJjbWQgPSAlZFxuIiwgX19mdW5jX18sIHN1YmNtZCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIFN0YXR1czsKK30KKworI2lmZGVmIFNJT0NTSVdNTE1FCitpbnQgcnRfaW9jdGxfc2l3bWxtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSICAgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKwlzdHJ1Y3QgaXdfbWxtZSAqcE1sbWUgPSAoc3RydWN0IGl3X21sbWUgKil3cnF1LT5kYXRhLnBvaW50ZXI7CisJTUxNRV9RVUVVRV9FTEVNCQkJCU1zZ0VsZW07CisJTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUCURpc0Fzc29jUmVxOworCU1MTUVfREVBVVRIX1JFUV9TVFJVQ1QgICAgICBEZUF1dGhSZXE7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlc1xuIiwgX19mdW5jX18pKTsKKworCWlmIChwTWxtZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaChwTWxtZS0+Y21kKQorCXsKKyNpZmRlZiBJV19NTE1FX0RFQVVUSAorCQljYXNlIElXX01MTUVfREVBVVRIOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gJXMgLSBJV19NTE1FX0RFQVVUSFxuIiwgX19mdW5jX18pKTsKKwkJCUNPUFlfTUFDX0FERFIoRGVBdXRoUmVxLkFkZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCURlQXV0aFJlcS5SZWFzb24gPSBwTWxtZS0+cmVhc29uX2NvZGU7CisJCQlNc2dFbGVtLk1zZ0xlbiA9IHNpemVvZihNTE1FX0RFQVVUSF9SRVFfU1RSVUNUKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KE1zZ0VsZW0uTXNnLCAmRGVBdXRoUmVxLCBzaXplb2YoTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCkpOworCQkJTWxtZURlYXV0aFJlcUFjdGlvbihwQWQsICZNc2dFbGVtKTsKKwkJCWlmIChJTkZSQV9PTihwQWQpKQorCQkJeworCQkJICAgIExpbmtEb3duKHBBZCwgRkFMU0UpOworCQkJICAgIHBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmIC8vIElXX01MTUVfREVBVVRIIC8vCisjaWZkZWYgSVdfTUxNRV9ESVNBU1NPQworCQljYXNlIElXX01MTUVfRElTQVNTT0M6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlcyAtIElXX01MTUVfRElTQVNTT0NcbiIsIF9fZnVuY19fKSk7CisJCQlDT1BZX01BQ19BRERSKERpc0Fzc29jUmVxLkFkZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCURpc0Fzc29jUmVxLlJlYXNvbiA9ICBwTWxtZS0+cmVhc29uX2NvZGU7CisKKwkJCU1zZ0VsZW0uTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7CisJCQlNc2dFbGVtLk1zZ1R5cGUgPSBNVDJfTUxNRV9ESVNBU1NPQ19SRVE7CisJCQlNc2dFbGVtLk1zZ0xlbiA9IHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpOworCQkJTmRpc01vdmVNZW1vcnkoTXNnRWxlbS5Nc2csICZEaXNBc3NvY1JlcSwgc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCkpOworCisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9ESVNBU1NPQzsKKwkJCU1sbWVEaXNhc3NvY1JlcUFjdGlvbihwQWQsICZNc2dFbGVtKTsKKwkJCWJyZWFrOworI2VuZGlmIC8vIElXX01MTUVfRElTQVNTT0MgLy8KKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzIC0gVW5rbm93IENvbW1hbmRcbiIsIF9fZnVuY19fKSk7CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvLyBTSU9DU0lXTUxNRSAvLworCisjaWYgV0lSRUxFU1NfRVhUID4gMTcKK2ludCBydF9pb2N0bF9zaXdhdXRoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgICBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisJc3RydWN0IGl3X3BhcmFtICpwYXJhbSA9ICZ3cnF1LT5wYXJhbTsKKworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisJfQorCXN3aXRjaCAocGFyYW0tPmZsYWdzICYgSVdfQVVUSF9JTkRFWCkgeworICAgIAljYXNlIElXX0FVVEhfV1BBX1ZFUlNJT046CisgICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfV1BBX1ZFUlNJT05fV1BBKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s7CisJCQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCisJCQkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfV1BBX1ZFUlNJT05fV1BBMikKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzsKKworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfV1BBX1ZFUlNJT04gLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIAljYXNlIElXX0FVVEhfQ0lQSEVSX1BBSVJXSVNFOgorICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9OT05FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9XRVA0MCB8fAorICAgICAgICAgICAgICAgICAgICAgcGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1dFUDEwNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxWCA9IEZBTFNFOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9US0lQKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX0NDTVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9DSVBIRVJfUEFJUldJU0UgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIAljYXNlIElXX0FVVEhfQ0lQSEVSX0dST1VQOgorICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9OT05FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfV0VQNDAgfHwKKyAgICAgICAgICAgICAgICAgICAgIHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9XRVAxMDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1RLSVApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfQ0NNUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX0NJUEhFUl9HUk9VUCAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9LRVlfTUdNVDoKKyAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9LRVlfTUdNVF84MDJfMVgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gRkFMU0U7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMjsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gRkFMU0U7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAvLyBXRVAgMXgKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBUUlVFOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfS0VZX01HTVQgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIAljYXNlIElXX0FVVEhfUlhfVU5FTkNSWVBURURfRUFQT0w6CisgICAgICAgICAgICBicmVhazsKKyAgICAJY2FzZSBJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRDoKKyAgICAgICAgICAgIC8qaWYgKHBhcmFtLT52YWx1ZSA9PSAwKQorCQkJeworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICAgICAgCSAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgICAgICAgICAgfSovCisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9QUklWQUNZX0lOVk9LRUQgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAJCWJyZWFrOworICAgIAljYXNlIElXX0FVVEhfRFJPUF9VTkVOQ1JZUFRFRDoKKyAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgIT0gMCkKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOworCQkJZWxzZQorCQkJeworICAgICAgICAgICAgICAgIC8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworCQkJfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfV1BBX1ZFUlNJT04gLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAJCWJyZWFrOworICAgIAljYXNlIElXX0FVVEhfODAyMTFfQVVUSF9BTEc6CisJCQlpZiAocGFyYW0tPnZhbHVlICYgSVdfQVVUSF9BTEdfU0hBUkVEX0tFWSkKKyAgICAgICAgICAgIHsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkOworCQkJfQorICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlICYgSVdfQVVUSF9BTEdfT1BFTl9TWVNURU0pCisgICAgICAgICAgICB7CisJCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisJCQl9CisgICAgICAgICAgICBlbHNlCisJCQkJcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF84MDIxMV9BVVRIX0FMRyAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOworCQkJYnJlYWs7CisgICAgCWNhc2UgSVdfQVVUSF9XUEFfRU5BQkxFRDoKKyAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1dQQV9FTkFCTEVEIC0gRHJpdmVyIHN1cHBvcnRzIFdQQSEocGFyYW0tPnZhbHVlID0gJWQpXG4iLCBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7CisgICAgCQlicmVhazsKKyAgICAJZGVmYXVsdDoKKyAgICAJCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworCXJldHVybiAwOworfQorCitpbnQgcnRfaW9jdGxfZ2l3YXV0aChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKwlzdHJ1Y3QgaXdfcGFyYW0gKnBhcmFtID0gJndycXUtPnBhcmFtOworCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCisgICAgeworICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKyAgICAJcmV0dXJuIC1FTkVURE9XTjsKKyAgICB9CisKKwlzd2l0Y2ggKHBhcmFtLT5mbGFncyAmIElXX0FVVEhfSU5ERVgpIHsKKwljYXNlIElXX0FVVEhfRFJPUF9VTkVOQ1JZUFRFRDoKKyAgICAgICAgcGFyYW0tPnZhbHVlID0gKHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkgPyAwIDogMTsKKwkJYnJlYWs7CisKKwljYXNlIElXX0FVVEhfODAyMTFfQVVUSF9BTEc6CisgICAgICAgIHBhcmFtLT52YWx1ZSA9IChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkgPyBJV19BVVRIX0FMR19TSEFSRURfS0VZIDogSVdfQVVUSF9BTEdfT1BFTl9TWVNURU07CisJCWJyZWFrOworCisJY2FzZSBJV19BVVRIX1dQQV9FTkFCTEVEOgorCQlwYXJhbS0+dmFsdWUgPSAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpID8gMSA6IDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKyAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydF9pb2N0bF9naXdhdXRoOjpwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIHBhcmFtLT52YWx1ZSkpOworCXJldHVybiAwOworfQorCit2b2lkIGZuU2V0Q2lwaGVyS2V5KAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIElOVCAgICAgICAgICAgICBrZXlJZHgsCisgICAgSU4gIFVDSEFSICAgICAgICAgICBDaXBoZXJBbGcsCisgICAgSU4gIEJPT0xFQU4gICAgICAgICBiR1RLLAorICAgIElOICBzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0KQoreworICAgIE5kaXNaZXJvTWVtb3J5KCZwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0sIHNpemVvZihDSVBIRVJfS0VZKSk7CisgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IExFTl9US0lQX0VLOworICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksIGV4dC0+a2V5LCBMRU5fVEtJUF9FSyk7CisgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLlR4TWljLCBleHQtPmtleSArIExFTl9US0lQX0VLLCBMRU5fVEtJUF9UWE1JQ0spOworICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5SeE1pYywgZXh0LT5rZXkgKyBMRU5fVEtJUF9FSyArIExFTl9US0lQX1RYTUlDSywgTEVOX1RLSVBfUlhNSUNLKTsKKyAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCisgICAgLy8gVXBkYXRlIGdyb3VwIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKKwlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCisJCQkJCQkgIEJTUzAsCisJCQkJCQkgIGtleUlkeCwKKwkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZywKKwkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwKKwkJCQkJCSAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLlR4TWljLAorCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uUnhNaWMpOworCisgICAgaWYgKGJHVEspCisgICAgICAgIC8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQorICAgIAlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZGFwdGVyLAorICAgIAkJCQkJCQkgIEJTUzAsCisgICAgCQkJCQkJCSAga2V5SWR4LAorICAgIAkJCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcsCisgICAgCQkJCQkJCSAgTlVMTCk7CisgICAgZWxzZQorICAgICAgICAvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKKyAgICAJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwKKyAgICAJCQkJCQkJICBCU1MwLAorICAgIAkJCQkJCQkgIGtleUlkeCwKKyAgICAJCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnLAorICAgIAkJCQkJCQkgICZwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0pOworfQorCitpbnQgcnRfaW9jdGxfc2l3ZW5jb2RlZXh0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgIGNoYXIgKmV4dHJhKQorCQkJeworICAgIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisJc3RydWN0IGl3X3BvaW50ICplbmNvZGluZyA9ICZ3cnF1LT5lbmNvZGluZzsKKwlzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0ID0gKHN0cnVjdCBpd19lbmNvZGVfZXh0ICopZXh0cmE7CisgICAgaW50IGtleUlkeCwgYWxnID0gZXh0LT5hbGc7CisKKyAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgorCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKworICAgIGlmIChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpCisJeworICAgICAgICBrZXlJZHggPSAoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisgICAgICAgIC8vIHNldCBCU1NJRCB3Y2lkIGVudHJ5IG9mIHRoZSBQYWlyLXdpc2UgS2V5IHRhYmxlIGFzIG5vLXNlY3VyaXR5IG1vZGUKKwkgICAgQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkocEFkYXB0ZXIsIEJTUzAsIEJTU0lEX1dDSUQpOworICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gMDsKKwkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIDAsIChVQ0hBUilrZXlJZHgpOworICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6UmVtb3ZlIGFsbCBrZXlzIShlbmNvZGluZy0+ZmxhZ3MgPSAleClcbiIsIF9fZnVuY19fLCBlbmNvZGluZy0+ZmxhZ3MpKTsKKyAgICB9CisJCQkJCWVsc2UKKyAgICB7CisgICAgICAgIC8vIEdldCBLZXkgSW5kZXggYW5kIGNvbnZldCB0byBvdXIgb3duIGRlZmluZWQga2V5IGluZGV4CisgICAgCWtleUlkeCA9IChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKyAgICAJaWYoKGtleUlkeCA8IDApIHx8IChrZXlJZHggPj0gTlJfV0VQX0tFWVMpKQorICAgIAkJcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKQorICAgICAgICB7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IGtleUlkeDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpEZWZhdWx0S2V5SWQgPSAlZFxuIiwgX19mdW5jX18sIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkKSk7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGFsZykgeworICAgIAkJY2FzZSBJV19FTkNPREVfQUxHX05PTkU6CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfTk9ORVxuIiwgX19mdW5jX18pKTsKKyAgICAJCQlicmVhazsKKyAgICAJCWNhc2UgSVdfRU5DT0RFX0FMR19XRVA6CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfV0VQIC0gZXh0LT5rZXlfbGVuID0gJWQsIGtleUlkeCA9ICVkXG4iLCBfX2Z1bmNfXywgZXh0LT5rZXlfbGVuLCBrZXlJZHgpKTsKKyAgICAJCQlpZiAoZXh0LT5rZXlfbGVuID09IE1BWF9XRVBfS0VZX1NJWkUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gTUFYX1dFUF9LRVlfU0laRTsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisJCQkJfQorICAgICAgICAJCWVsc2UgaWYgKGV4dC0+a2V5X2xlbiA9PSBNSU5fV0VQX0tFWV9TSVpFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IE1JTl9XRVBfS0VZX1NJWkU7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCQl9CisgICAgICAgIAkJZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksICAxNik7CisJCQkgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwgZXh0LT5rZXksIGV4dC0+a2V5X2xlbik7CisgICAgCQkJYnJlYWs7CisgICAgICAgICAgICBjYXNlIElXX0VOQ09ERV9BTEdfVEtJUDoKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfRU5DT0RFX0FMR19US0lQIC0ga2V5SWR4ID0gJWQsIGV4dC0+a2V5X2xlbiA9ICVkXG4iLCBfX2Z1bmNfXywga2V5SWR4LCBleHQtPmtleV9sZW4pKTsKKyAgICAgICAgICAgICAgICBpZiAoZXh0LT5rZXlfbGVuID09IDMyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmblNldENpcGhlcktleShwQWRhcHRlciwga2V5SWR4LCBDSVBIRVJfVEtJUCwgRkFMU0UsIGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCQl9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9HUk9VUF9LRVkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZuU2V0Q2lwaGVyS2V5KHBBZGFwdGVyLCBrZXlJZHgsIENJUEhFUl9US0lQLCBUUlVFLCBleHQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAorICAgICAgICAgICAgCSAgICAgICAgLy9wQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisgICAgICAgICAgICAJICAgICAgICBTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBJV19FTkNPREVfQUxHX0NDTVA6CisgICAgICAgICAgICAgICAgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKQorCQl7CisgICAgICAgICAgICAgICAgICAgIGZuU2V0Q2lwaGVyS2V5KHBBZGFwdGVyLCBrZXlJZHgsIENJUEhFUl9BRVMsIEZBTFNFLCBleHQpOworICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQorICAgICAgICAgICAgICAgICAgICAJLy9wQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisgICAgICAgICAgICAgICAgICAgIAlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX0dST1VQX0tFWSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZuU2V0Q2lwaGVyS2V5KHBBZGFwdGVyLCBrZXlJZHgsIENJUEhFUl9BRVMsIFRSVUUsIGV4dCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gc2V0IDgwMi4xeCBwb3J0IGNvbnRyb2wKKyAgICAgICAgCSAgICAgICAgLy9wQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisgICAgICAgIAkgICAgICAgIFNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAJCWRlZmF1bHQ6CisgICAgCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50CitydF9pb2N0bF9naXdlbmNvZGVleHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJUFJUTVBfQURBUFRFUiBwQWQgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCVBDSEFSIHBLZXkgPSBOVUxMOworCXN0cnVjdCBpd19wb2ludCAqZW5jb2RpbmcgPSAmd3JxdS0+ZW5jb2Rpbmc7CisJc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCA9IChzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqKWV4dHJhOworCWludCBpZHgsIG1heF9rZXlfbGVuOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT09PiBydF9pb2N0bF9naXdlbmNvZGVleHRcbiIpKTsKKworCW1heF9rZXlfbGVuID0gZW5jb2RpbmctPmxlbmd0aCAtIHNpemVvZigqZXh0KTsKKwlpZiAobWF4X2tleV9sZW4gPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlkeCA9IGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWDsKKwlpZiAoaWR4KQorCXsKKwkJaWYgKGlkeCA8IDEgfHwgaWR4ID4gNCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZHgtLTsKKworCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSB8fAorCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkKKwkJeworCQkJaWYgKGlkeCAhPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQpCisJCQl7CisJCQkJZXh0LT5rZXlfbGVuID0gMDsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKwllbHNlCisJCWlkeCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKKworCWVuY29kaW5nLT5mbGFncyA9IGlkeCArIDE7CisJbWVtc2V0KGV4dCwgMCwgc2l6ZW9mKCpleHQpKTsKKworCWV4dC0+a2V5X2xlbiA9IDA7CisJc3dpdGNoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cykgeworCQljYXNlIE5kaXM4MDJfMTFXRVBEaXNhYmxlZDoKKwkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19OT05FOworCQkJZW5jb2RpbmctPmZsYWdzIHw9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwkJCWJyZWFrOworCQljYXNlIE5kaXM4MDJfMTFXRVBFbmFibGVkOgorCQkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX1dFUDsKKwkJCWlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleUxlbiA+IG1heF9rZXlfbGVuKQorCQkJCXJldHVybiAtRTJCSUc7CisJCQllbHNlCisJCQl7CisJCQkJZXh0LT5rZXlfbGVuID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlMZW47CisJCQkJcEtleSA9ICYocEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlbMF0pOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDoKKwkJY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOgorCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19US0lQOworCQkJZWxzZQorCQkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19DQ01QOworCisJCQlpZiAobWF4X2tleV9sZW4gPCAzMikKKwkJCQlyZXR1cm4gLUUyQklHOworCQkJZWxzZQorCQkJeworCQkJCWV4dC0+a2V5X2xlbiA9IDMyOworCQkJCXBLZXkgPSAmcEFkLT5TdGFDZmcuUE1LWzBdOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZXh0LT5rZXlfbGVuICYmIHBLZXkpCisJeworCQllbmNvZGluZy0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0VOQUJMRUQ7CisJCW1lbWNweShleHQtPmtleSwgcEtleSwgZXh0LT5rZXlfbGVuKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIFNJT0NTSVdHRU5JRQoraW50IHJ0X2lvY3RsX3Npd2dlbmllKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCVBSVE1QX0FEQVBURVIgICBwQWQgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworCisJaWYgKHdycXUtPmRhdGEubGVuZ3RoID4gTUFYX0xFTl9PRl9SU05JRSB8fAorCSAgICAod3JxdS0+ZGF0YS5sZW5ndGggJiYgZXh0cmEgPT0gTlVMTCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHdycXUtPmRhdGEubGVuZ3RoKQorCXsKKwkJcEFkLT5TdGFDZmcuUlNOSUVfTGVuID0gd3JxdS0+ZGF0YS5sZW5ndGg7CisJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5SU05fSUVbMF0sIGV4dHJhLCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOworCX0KKwllbHNlCisJeworCQlwQWQtPlN0YUNmZy5SU05JRV9MZW4gPSAwOworCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5TdGFDZmcuUlNOX0lFWzBdLCBNQVhfTEVOX09GX1JTTklFKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvLyBTSU9DU0lXR0VOSUUgLy8KKworaW50IHJ0X2lvY3RsX2dpd2dlbmllKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSICAgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKworCWlmICgocEFkLT5TdGFDZmcuUlNOSUVfTGVuID09IDApIHx8CisJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSA8IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkpCisJeworCQl3cnF1LT5kYXRhLmxlbmd0aCA9IDA7CisJCXJldHVybiAwOworCX0KKworI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisjaWZkZWYgU0lPQ1NJV0dFTklFCisJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpCisJeworCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA8IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbikKKwkJcmV0dXJuIC1FMkJJRzsKKworCXdycXUtPmRhdGEubGVuZ3RoID0gcEFkLT5TdGFDZmcuUlNOSUVfTGVuOworCW1lbWNweShleHRyYSwgJnBBZC0+U3RhQ2ZnLlJTTl9JRVswXSwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKKwl9CisJZWxzZQorI2VuZGlmIC8vIFNJT0NTSVdHRU5JRSAvLworI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisJeworCQlVQ0hBUiBSU05JZSA9IElFX1dQQTsKKworCQlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPCAocEFkLT5TdGFDZmcuUlNOSUVfTGVuICsgMikpIC8vIElELCBMZW4KKwkJCXJldHVybiAtRTJCSUc7CisJCXdycXUtPmRhdGEubGVuZ3RoID0gcEFkLT5TdGFDZmcuUlNOSUVfTGVuICsgMjsKKworCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spIHx8CisgICAgICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikpCisJCQlSU05JZSA9IElFX1JTTjsKKworCQlleHRyYVswXSA9IChjaGFyKVJTTkllOworCQlleHRyYVsxXSA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKKwkJbWVtY3B5KGV4dHJhKzIsICZwQWQtPlN0YUNmZy5SU05fSUVbMF0sIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBydF9pb2N0bF9zaXdwbWtzYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICBjaGFyICpleHRyYSkKK3sKKwlQUlRNUF9BREFQVEVSICAgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRldi0+cHJpdjsKKwlzdHJ1Y3QgaXdfcG1rc2EgKnBQbWtzYSA9IChzdHJ1Y3QgaXdfcG1rc2EgKil3cnF1LT5kYXRhLnBvaW50ZXI7CisJSU5UCUNhY2hlZElkeCA9IDAsIGlkeCA9IDA7CisKKwlpZiAocFBta3NhID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT09PiBydF9pb2N0bF9zaXdwbWtzYVxuIikpOworCXN3aXRjaChwUG1rc2EtPmNtZCkKKwl7CisJCWNhc2UgSVdfUE1LU0FfRkxVU0g6CisJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5TYXZlZFBNSywgc2l6ZW9mKEJTU0lEX0lORk8pKlBNS0lEX05PKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoInJ0X2lvY3RsX3Npd3Bta3NhIC0gSVdfUE1LU0FfRkxVU0hcbiIpKTsKKwkJCWJyZWFrOworCQljYXNlIElXX1BNS1NBX1JFTU9WRToKKwkJCWZvciAoQ2FjaGVkSWR4ID0gMDsgQ2FjaGVkSWR4IDwgcEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW07IENhY2hlZElkeCsrKQorCQkJeworCQkgICAgICAgIC8vIGNvbXBhcmUgdGhlIEJTU0lECisJCSAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwUG1rc2EtPmJzc2lkLnNhX2RhdGEsIHBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSUQsIE1BQ19BRERSX0xFTikpCisJCSAgICAgICAgeworCQkgICAgICAgIAlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELCBNQUNfQUREUl9MRU4pOworCQkJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLlBNS0lELCAxNik7CisJCQkJCWZvciAoaWR4ID0gQ2FjaGVkSWR4OyBpZHggPCAocEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW0gLSAxKTsgaWR4KyspCisJCQkJCXsKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHhdLkJTU0lEWzBdLCAmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4KzFdLkJTU0lEWzBdLCBNQUNfQUREUl9MRU4pOworCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW2lkeF0uUE1LSURbMF0sICZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHgrMV0uUE1LSURbMF0sIDE2KTsKKwkJCQkJfQorCQkJCQlwQWQtPlN0YUNmZy5TYXZlZFBNS051bS0tOworCQkJICAgICAgICBicmVhazsKKwkJICAgICAgICB9CisJICAgICAgICB9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoInJ0X2lvY3RsX3Npd3Bta3NhIC0gSVdfUE1LU0FfUkVNT1ZFXG4iKSk7CisJCQlicmVhazsKKwkJY2FzZSBJV19QTUtTQV9BREQ6CisJCQlmb3IgKENhY2hlZElkeCA9IDA7IENhY2hlZElkeCA8IHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtOyBDYWNoZWRJZHgrKykKKwkJCXsKKwkJICAgICAgICAvLyBjb21wYXJlIHRoZSBCU1NJRAorCQkgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocFBta3NhLT5ic3NpZC5zYV9kYXRhLCBwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELCBNQUNfQUREUl9MRU4pKQorCQkJICAgICAgICBicmVhazsKKwkgICAgICAgIH0KKworCSAgICAgICAgLy8gRm91bmQsIHJlcGxhY2UgaXQKKwkgICAgICAgIGlmIChDYWNoZWRJZHggPCBQTUtJRF9OTykKKwkgICAgICAgIHsKKwkJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgiVXBkYXRlIFBNS0lELCBpZHggPSAlZFxuIiwgQ2FjaGVkSWR4KSk7CisJCSAgICAgICAgTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSURbMF0sIHBQbWtzYS0+YnNzaWQuc2FfZGF0YSwgTUFDX0FERFJfTEVOKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5QTUtJRFswXSwgcFBta3NhLT5wbWtpZCwgMTYpOworCQkgICAgICAgIHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtKys7CisJICAgICAgICB9CisJICAgICAgICAvLyBOb3QgZm91bmQsIHJlcGxhY2UgdGhlIGxhc3Qgb25lCisJICAgICAgICBlbHNlCisJICAgICAgICB7CisJCSAgICAgICAgLy8gUmFuZG9tbHkgcmVwbGFjZSBvbmUKKwkJICAgICAgICBDYWNoZWRJZHggPSAocFBta3NhLT5ic3NpZC5zYV9kYXRhWzVdICUgUE1LSURfTk8pOworCQkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJVcGRhdGUgUE1LSUQsIGlkeCA9ICVkXG4iLCBDYWNoZWRJZHgpKTsKKwkJICAgICAgICBOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRFswXSwgcFBta3NhLT5ic3NpZC5zYV9kYXRhLCBNQUNfQUREUl9MRU4pOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLlBNS0lEWzBdLCBwUG1rc2EtPnBta2lkLCAxNik7CisJICAgICAgICB9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoInJ0X2lvY3RsX3Npd3Bta3NhIC0gSVdfUE1LU0FfQUREXG4iKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoInJ0X2lvY3RsX3Npd3Bta3NhIC0gVW5rbm93IENvbW1hbmQhIVxuIikpOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8gI2lmIFdJUkVMRVNTX0VYVCA+IDE3CisKKyNpZmRlZiBEQkcKK3N0YXRpYyBpbnQKK3J0X3ByaXZhdGVfaW9jdGxfYmJwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBpd19wb2ludCAqd3JxLCBjaGFyICpleHRyYSkKKwkJCXsKKwlDSEFSCQkJCSp0aGlzX2NoYXI7CisJQ0hBUgkJCQkqdmFsdWUgPSBOVUxMOworCVVDSEFSCQkJCXJlZ0JCUCA9IDA7CisvLwlDSEFSCQkJCWFyZ1syNTVdPXswfTsKKwlVSU5UMzIJCQkJYmJwSWQ7CisJVUlOVDMyCQkJCWJicFZhbHVlOworCUJPT0xFQU4JCQkJYklzUHJpbnRBbGxCQlAgPSBGQUxTRTsKKwlJTlQJCQkJCVN0YXR1cyA9IDA7CisgICAgUFJUTVBfQURBUFRFUiAgICAgICBwQWRhcHRlciA9IChQUlRNUF9BREFQVEVSKSBkZXYtPnByaXY7CisKKworCW1lbXNldChleHRyYSwgMHgwMCwgSVdfUFJJVl9TSVpFX01BU0spOworCisJaWYgKHdycS0+bGVuZ3RoID4gMSkgLy9ObyBwYXJhbWV0ZXJzLgorCQkJCXsKKwkJc3ByaW50ZihleHRyYSwgIlxuIik7CisKKwkJLy9QYXJzaW5nIFJlYWQgb3IgV3JpdGUKKwkJdGhpc19jaGFyID0gd3JxLT5wb2ludGVyOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ0aGlzX2NoYXI9JXNcbiIsIHRoaXNfY2hhcikpOworCQlpZiAoISp0aGlzX2NoYXIpCisJCQlnb3RvIG5leHQ7CisKKwkJaWYgKCh2YWx1ZSA9IHJ0c3RyY2hyKHRoaXNfY2hhciwgJz0nKSkgIT0gTlVMTCkKKwkJCSp2YWx1ZSsrID0gMDsKKworCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpCisJCXsgLy9SZWFkCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ0aGlzX2NoYXI9JXMsIHZhbHVlPSVzXG4iLCB0aGlzX2NoYXIsIHZhbHVlKSk7CisJCQlpZiAoc3NjYW5mKHRoaXNfY2hhciwgIiVkIiwgJihiYnBJZCkpID09IDEpCisJCQl7CisJCQkJaWYgKGJicElkIDw9IDEzNikKKwkJCQl7CisjaWZkZWYgUkFMSU5LX0FURQorCQkJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCQkJeworCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKKwkJCQkJfQorCQkJCQllbHNlCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCQkJCQl7CisJCQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsICZyZWdCQlApOworCQkJCQl9CisJCQkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlIlMDJkWzB4JTAyWF06JTAyWFxuIiwgYmJwSWQsIGJicElkKjIsIHJlZ0JCUCk7CisgICAgICAgICAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJtc2c9JXNcbiIsIGV4dHJhKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7Ly9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIGJicAorCQkJCQliSXNQcmludEFsbEJCUCA9IFRSVUU7CisJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7IC8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBiYnAKKwkJCQliSXNQcmludEFsbEJCUCA9IFRSVUU7CisJCQkJZ290byBuZXh0OworCQkJfQorCQl9CisJCWVsc2UKKwkJeyAvL1dyaXRlCisJCQlpZiAoKHNzY2FuZih0aGlzX2NoYXIsICIlZCIsICYoYmJwSWQpKSA9PSAxKSAmJiAoc3NjYW5mKHZhbHVlLCAiJXgiLCAmKGJicFZhbHVlKSkgPT0gMSkpCisJCQl7CisJCQkJaWYgKGJicElkIDw9IDEzNikKKwkJCQl7CisjaWZkZWYgUkFMSU5LX0FURQorCQkJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCQkJeworCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgYmJwVmFsdWUpOworCQkJCQkJLy9SZWFkIGl0IGJhY2sgZm9yIHNob3dpbmcKKwkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7CisJCQkJCX0KKwkJCQkJZWxzZQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwkJCQkJeworCQkJCQkgICAgUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsIGJicFZhbHVlKTsKKyAgICAJCQkJCS8vUmVhZCBpdCBiYWNrIGZvciBzaG93aW5nCisgICAgCQkJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKKwkJCX0KKwkJCQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUiUwMmRbMHglMDJYXTolMDJYXG4iLCBiYnBJZCwgYmJwSWQqMiwgcmVnQkJQKTsKKyAgICAgICAgICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIm1zZz0lc1xuIiwgZXh0cmEpKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgYmJwCisJCQkJCWJJc1ByaW50QWxsQkJQID0gVFJVRTsKKwkJCQkJZ290byBuZXh0OworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsgLy9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIGJicAorCQkJCWJJc1ByaW50QWxsQkJQID0gVFJVRTsKKwkJCQlnb3RvIG5leHQ7CisJCQl9CisJCX0KKwkJfQorCWVsc2UKKwkJYklzUHJpbnRBbGxCQlAgPSBUUlVFOworCituZXh0OgorCWlmIChiSXNQcmludEFsbEJCUCkKKwl7CisJCW1lbXNldChleHRyYSwgMHgwMCwgSVdfUFJJVl9TSVpFX01BU0spOworCQlzcHJpbnRmKGV4dHJhLCAiXG4iKTsKKwkJZm9yIChiYnBJZCA9IDA7IGJicElkIDw9IDEzNjsgYmJwSWQrKykKKwkJeworCQkgICAgaWYgKHN0cmxlbihleHRyYSkgPj0gKElXX1BSSVZfU0laRV9NQVNLIC0gMTApKQorICAgICAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFJBTElOS19BVEUKKwkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7CisJCQl9CisJCQllbHNlCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7CisJCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSJTAyZFsweCUwMlhdOiUwMlggICAgIiwgYmJwSWQsIGJicElkKjIsIHJlZ0JCUCk7CisJCQlpZiAoYmJwSWQlNSA9PSA0KQorCQkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlxuIik7CisJCX0KKworICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKKyAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgid3JxLT5sZW5ndGggPSAlZFxuIiwgd3JxLT5sZW5ndGgpKTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT1ydF9wcml2YXRlX2lvY3RsX2JicFxuXG4iKSk7CisKKyAgICByZXR1cm4gU3RhdHVzOworfQorI2VuZGlmIC8vIERCRyAvLworCitpbnQgcnRfaW9jdGxfc2l3cmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworICAgIFBSVE1QX0FEQVBURVIgICBwQWQgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworICAgIFVJTlQzMiAgICAgICAgICByYXRlID0gd3JxdS0+Yml0cmF0ZS52YWx1ZSwgZml4ZWQgPSB3cnF1LT5iaXRyYXRlLmZpeGVkOworCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKwlpZighUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorCXsKKyAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydF9pb2N0bF9zaXdyYXRlOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisgICAgCXJldHVybiAtRU5FVERPV047CisJfQorCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnRfaW9jdGxfc2l3cmF0ZTo6KHJhdGUgPSAlZCwgZml4ZWQgPSAlZClcbiIsIHJhdGUsIGZpeGVkKSk7CisgICAgLyogcmF0ZSA9IC0xID0+IGF1dG8gcmF0ZQorICAgICAgIHJhdGUgPSBYLCBmaXhlZCA9IDEgPT4gKGZpeGVkIHJhdGUgWCkKKyAgICAqLworICAgIGlmIChyYXRlID09IC0xKQorICAgIHsKKwkJLy9BdXRvIFJhdGUKKwkJcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsKKwkJcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPSBUUlVFOworCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPD0gUEhZXzExRykgfHwKKwkJICAgIChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFIDw9IE1PREVfT0ZETSkpCisJCQlSVE1QU2V0RGVzaXJlZFJhdGVzKHBBZCwgLTEpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCVNldENvbW1vbkhUKHBBZCk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChmaXhlZCkKKyAgICAgICAgeworICAgICAgICAJcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPSBGQUxTRTsKKyAgICAgICAgICAgIGlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA8PSBQSFlfMTFHKSB8fAorICAgICAgICAgICAgICAgIChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFIDw9IE1PREVfT0ZETSkpCisgICAgICAgICAgICAgICAgUlRNUFNldERlc2lyZWRSYXRlcyhwQWQsIHJhdGUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTX0FVVE87CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisgICAgICAgICAgICAgICAgU2V0Q29tbW9uSFQocEFkKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInJ0X2lvY3RsX3Npd3JhdGU6OihIdE1jcz0lZClcbiIscEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRPRE86IHJhdGUgPSBYLCBmaXhlZCA9IDAgPT4gKHJhdGVzIDw9IFgpCisgICAgICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHJ0X2lvY3RsX2dpd3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworICAgIFBSVE1QX0FEQVBURVIgICBwQWQgPSAoUFJUTVBfQURBUFRFUikgZGV2LT5wcml2OworICAgIGludCByYXRlX2luZGV4ID0gMCwgcmF0ZV9jb3VudCA9IDA7CisgICAgSFRUUkFOU01JVF9TRVRUSU5HIGh0X3NldHRpbmc7CisgICAgX19zMzIgcmFsaW5rcmF0ZVtdID0KKwl7MiwgIDQsICAgMTEsICAyMiwgLy8gQ0NLCisJMTIsIDE4LCAgIDI0LCAgMzYsIDQ4LCA3MiwgOTYsIDEwOCwgLy8gT0ZETQorCTEzLCAyNiwgICAzOSwgIDUyLCAgNzgsIDEwNCwgMTE3LCAxMzAsIDI2LCAgNTIsICA3OCwgMTA0LCAxNTYsIDIwOCwgMjM0LCAyNjAsIC8vIDIwTUh6LCA4MDBucyBHSSwgTUNTOiAwIH4gMTUKKwkzOSwgNzgsICAxMTcsIDE1NiwgMjM0LCAzMTIsIDM1MSwgMzkwLAkJCQkJCQkJCQkgIC8vIDIwTUh6LCA4MDBucyBHSSwgTUNTOiAxNiB+IDIzCisJMjcsIDU0LCAgIDgxLCAxMDgsIDE2MiwgMjE2LCAyNDMsIDI3MCwgNTQsIDEwOCwgMTYyLCAyMTYsIDMyNCwgNDMyLCA0ODYsIDU0MCwgLy8gNDBNSHosIDgwMG5zIEdJLCBNQ1M6IDAgfiAxNQorCTgxLCAxNjIsIDI0MywgMzI0LCA0ODYsIDY0OCwgNzI5LCA4MTAsCQkJCQkJCQkJCSAgLy8gNDBNSHosIDgwMG5zIEdJLCBNQ1M6IDE2IH4gMjMKKwkxNCwgMjksICAgNDMsICA1NywgIDg3LCAxMTUsIDEzMCwgMTQ0LCAyOSwgNTksICAgODcsIDExNSwgMTczLCAyMzAsIDI2MCwgMjg4LCAvLyAyME1IeiwgNDAwbnMgR0ksIE1DUzogMCB+IDE1CisJNDMsIDg3LCAgMTMwLCAxNzMsIDI2MCwgMzE3LCAzOTAsIDQzMywJCQkJCQkJCQkJICAvLyAyME1IeiwgNDAwbnMgR0ksIE1DUzogMTYgfiAyMworCTMwLCA2MCwgICA5MCwgMTIwLCAxODAsIDI0MCwgMjcwLCAzMDAsIDYwLCAxMjAsIDE4MCwgMjQwLCAzNjAsIDQ4MCwgNTQwLCA2MDAsIC8vIDQwTUh6LCA0MDBucyBHSSwgTUNTOiAwIH4gMTUKKwk5MCwgMTgwLCAyNzAsIDM2MCwgNTQwLCA3MjAsIDgxMCwgOTAwfTsJCQkJCQkJCQkJICAvLyA0ME1IeiwgNDAwbnMgR0ksIE1DUzogMTYgfiAyMworCisgICAgcmF0ZV9jb3VudCA9IHNpemVvZihyYWxpbmtyYXRlKS9zaXplb2YoX19zMzIpOworICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCisJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwl7CisgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworICAgIAlyZXR1cm4gLUVORVRET1dOOworCX0KKworICAgIGlmICgocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPT0gRkFMU0UpICYmCisgICAgICAgIChJTkZSQV9PTihwQWQpKSAmJgorICAgICAgICAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPD0gUEhZXzExRykgfHwgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSkpCisgICAgICAgIGh0X3NldHRpbmcud29yZCA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS53b3JkOworICAgIGVsc2UKKyAgICAgICAgaHRfc2V0dGluZy53b3JkID0gcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUud29yZDsKKworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgIGlmIChodF9zZXR0aW5nLmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkKKyAgICB7CisvLyAgICAJcmF0ZV9pbmRleCA9IDEyICsgKChVQ0hBUilodF9zZXR0aW5nLmZpZWxkLkJXICoxNikgKyAoKFVDSEFSKWh0X3NldHRpbmcuZmllbGQuU2hvcnRHSSAqMzIpICsgKChVQ0hBUilodF9zZXR0aW5nLmZpZWxkLk1DUyk7CisgICAgCXJhdGVfaW5kZXggPSAxMiArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5CVyAqMjQpICsgKChVQ0hBUilodF9zZXR0aW5nLmZpZWxkLlNob3J0R0kgKjQ4KSArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5NQ1MpOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisgICAgaWYgKGh0X3NldHRpbmcuZmllbGQuTU9ERSA9PSBNT0RFX09GRE0pCisgICAgCXJhdGVfaW5kZXggPSAoVUNIQVIpKGh0X3NldHRpbmcuZmllbGQuTUNTKSArIDQ7CisgICAgZWxzZSBpZiAoaHRfc2V0dGluZy5maWVsZC5NT0RFID09IE1PREVfQ0NLKQorICAgIAlyYXRlX2luZGV4ID0gKFVDSEFSKShodF9zZXR0aW5nLmZpZWxkLk1DUyk7CisKKyAgICBpZiAocmF0ZV9pbmRleCA8IDApCisgICAgICAgIHJhdGVfaW5kZXggPSAwOworCisgICAgaWYgKHJhdGVfaW5kZXggPiByYXRlX2NvdW50KQorICAgICAgICByYXRlX2luZGV4ID0gcmF0ZV9jb3VudDsKKworICAgIHdycXUtPmJpdHJhdGUudmFsdWUgPSByYWxpbmtyYXRlW3JhdGVfaW5kZXhdICogNTAwMDAwOworICAgIHdycXUtPmJpdHJhdGUuZGlzYWJsZWQgPSAwOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBpd19oYW5kbGVyIHJ0X2hhbmRsZXJbXSA9Cit7CisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJICAgICAgICAgICAgLyogU0lPQ1NJV0NPTU1JVCAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXduYW1lLAkJCS8qIFNJT0NHSVdOQU1FICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkgICAgICAgICAgICAvKiBTSU9DU0lXTldJRCAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJICAgICAgICAgICAgLyogU0lPQ0dJV05XSUQgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdmcmVxLAkJICAgIC8qIFNJT0NTSVdGUkVRICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZnJlcSwJCSAgICAvKiBTSU9DR0lXRlJFUSAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd21vZGUsCQkgICAgLyogU0lPQ1NJV01PREUgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdtb2RlLAkJICAgIC8qIFNJT0NHSVdNT0RFICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DU0lXU0VOUyAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1NFTlMgICAqLworCShpd19oYW5kbGVyKSBOVUxMIC8qIG5vdCB1c2VkICovLAkJLyogU0lPQ1NJV1JBTkdFICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdyYW5nZSwJCSAgICAvKiBTSU9DR0lXUkFOR0UgICovCisJKGl3X2hhbmRsZXIpIE5VTEwgLyogbm90IHVzZWQgKi8sCQkvKiBTSU9DU0lXUFJJViAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwgLyoga2VybmVsIGNvZGUgKi8sICAgIC8qIFNJT0NHSVdQUklWICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCAvKiBub3QgdXNlZCAqLywJCS8qIFNJT0NTSVdTVEFUUyAgKi8KKwkoaXdfaGFuZGxlcikgcnQyOHh4X2dldF93aXJlbGVzc19zdGF0cyAvKiBrZXJuZWwgY29kZSAqLywgICAgLyogU0lPQ0dJV1NUQVRTICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdTUFkgICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DR0lXU1BZICAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogU0lPQ1NJV1RIUlNQWSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIFNJT0NHSVdUSFJTUFkgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3YXAsICAgICAgICAgICAgLyogU0lPQ1NJV0FQICAgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdhcCwJCSAgICAvKiBTSU9DR0lXQVAgICAgICovCisjaWZkZWYgU0lPQ1NJV01MTUUKKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3bWxtZSwJICAgICAgICAvKiBTSU9DU0lXTUxNRSAgICovCisjZWxzZQorCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIFNJT0NTSVdNTE1FICovCisjZW5kaWYgLy8gU0lPQ1NJV01MTUUgLy8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfaXdhcGxpc3QsCQkgICAgLyogU0lPQ0dJV0FQTElTVCAqLworI2lmZGVmIFNJT0NHSVdTQ0FOCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd3NjYW4sCQkgICAgLyogU0lPQ1NJV1NDQU4gICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdzY2FuLAkJICAgIC8qIFNJT0NHSVdTQ0FOICAgKi8KKyNlbHNlCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogU0lPQ1NJV1NDQU4gICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIFNJT0NHSVdTQ0FOICAgKi8KKyNlbmRpZiAvKiBTSU9DR0lXU0NBTiAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdlc3NpZCwJCSAgICAvKiBTSU9DU0lXRVNTSUQgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2Vzc2lkLAkJICAgIC8qIFNJT0NHSVdFU1NJRCAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3bmlja24sCQkgICAgLyogU0lPQ1NJV05JQ0tOICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXduaWNrbiwJCSAgICAvKiBTSU9DR0lXTklDS04gICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogLS0gaG9sZSAtLSAgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIC0tIGhvbGUgLS0gICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3cmF0ZSwgICAgICAgICAgLyogU0lPQ1NJV1JBVEUgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdyYXRlLCAgICAgICAgICAvKiBTSU9DR0lXUkFURSAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd3J0cywJCSAgICAvKiBTSU9DU0lXUlRTICAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd3J0cywJCSAgICAvKiBTSU9DR0lXUlRTICAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2ZyYWcsCQkgICAgLyogU0lPQ1NJV0ZSQUcgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdmcmFnLAkJICAgIC8qIFNJT0NHSVdGUkFHICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DU0lXVFhQT1cgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1RYUE9XICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdSRVRSWSAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DR0lXUkVUUlkgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2VuY29kZSwJCS8qIFNJT0NTSVdFTkNPREUgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZW5jb2RlLAkJLyogU0lPQ0dJV0VOQ09ERSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdQT1dFUiAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DR0lXUE9XRVIgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJCQkJLyogLS0gaG9sZSAtLSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCQkJCS8qIC0tIGhvbGUgLS0gKi8KKyNpZiBXSVJFTEVTU19FWFQgPiAxNworICAgIChpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdnZW5pZSwgICAgICAgICAvKiBTSU9DU0lXR0VOSUUgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2dlbmllLCAgICAgICAgIC8qIFNJT0NHSVdHRU5JRSAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3YXV0aCwJCSAgICAvKiBTSU9DU0lXQVVUSCAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2F1dGgsCQkgICAgLyogU0lPQ0dJV0FVVEggICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdlbmNvZGVleHQsCSAgICAvKiBTSU9DU0lXRU5DT0RFRVhUICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2VuY29kZWV4dCwJCS8qIFNJT0NHSVdFTkNPREVFWFQgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3cG1rc2EsICAgICAgICAgLyogU0lPQ1NJV1BNS1NBICAqLworI2VuZGlmCit9OworCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlciBydF9wcml2X2hhbmRsZXJzW10gPSB7CisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwMCAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDEgKi8KKyNpZm5kZWYgQ09ORklHX0FQX1NVUFBPUlQKKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2V0cGFyYW0sIC8qICsgMHgwMiAqLworI2Vsc2UKKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDAyICovCisjZW5kaWYgLy8gQ09ORklHX0FQX1NVUFBPUlQgLy8KKyNpZmRlZiBEQkcKKwkoaXdfaGFuZGxlcikgcnRfcHJpdmF0ZV9pb2N0bF9iYnAsIC8qICsgMHgwMyAqLworI2Vsc2UKKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDAzICovCisjZW5kaWYKKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDA0ICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwNSAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDYgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDA3ICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwOCAqLworCShpd19oYW5kbGVyKSBydF9wcml2YXRlX2dldF9zdGF0aXN0aWNzLCAvKiArIDB4MDkgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBBICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwQiAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEMgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBEICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwRSAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEYgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDEwICovCisJKGl3X2hhbmRsZXIpIHJ0X3ByaXZhdGVfc2hvdywgLyogKyAweDExICovCisgICAgKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxMiAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTMgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDE1ICovCisJKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxNyAqLworCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTggKi8KK307CisKK2NvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZiBydDI4eHhfaXdfaGFuZGxlcl9kZWYgPQoreworI2RlZmluZQlOKGEpCShzaXplb2YgKGEpIC8gc2l6ZW9mIChhWzBdKSkKKwkuc3RhbmRhcmQJPSAoaXdfaGFuZGxlciAqKSBydF9oYW5kbGVyLAorCS5udW1fc3RhbmRhcmQJPSBzaXplb2YocnRfaGFuZGxlcikgLyBzaXplb2YoaXdfaGFuZGxlciksCisJLnByaXZhdGUJPSAoaXdfaGFuZGxlciAqKSBydF9wcml2X2hhbmRsZXJzLAorCS5udW1fcHJpdmF0ZQkJPSBOKHJ0X3ByaXZfaGFuZGxlcnMpLAorCS5wcml2YXRlX2FyZ3MJPSAoc3RydWN0IGl3X3ByaXZfYXJncyAqKSBwcml2dGFiLAorCS5udW1fcHJpdmF0ZV9hcmdzCT0gTihwcml2dGFiKSwKKyNpZiBJV19IQU5ETEVSX1ZFUlNJT04gPj0gNworICAgIC5nZXRfd2lyZWxlc3Nfc3RhdHMgPSBydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzLAorI2VuZGlmCit9OworCitJTlQgUlRNUFNldEluZm9ybWF0aW9uKAorICAgIElOICBQUlRNUF9BREFQVEVSIHBBZGFwdGVyLAorICAgIElOICBPVVQgc3RydWN0IGlmcmVxICAgICpycSwKKyAgICBJTiAgSU5UICAgICAgICAgICAgICAgICBjbWQpCit7CisgICAgc3RydWN0IGl3cmVxICAgICAgICAgICAgICAgICAgICAgICAgKndycSA9IChzdHJ1Y3QgaXdyZXEgKikgcnE7CisgICAgTkRJU184MDJfMTFfU1NJRCAgICAgICAgICAgICAgICAgICAgU3NpZDsKKyAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyAgICAgICAgICAgICBCc3NpZDsKKyAgICBSVF84MDJfMTFfUEhZX01PREUgICAgICAgICAgICAgICAgICBQaHlNb2RlOworICAgIFJUXzgwMl8xMV9TVEFfQ09ORklHICAgICAgICAgICAgICAgIFN0YUNvbmZpZzsKKyAgICBORElTXzgwMl8xMV9SQVRFUyAgICAgICAgICAgICAgICAgICBhcnlSYXRlczsKKyAgICBSVF84MDJfMTFfUFJFQU1CTEUgICAgICAgICAgICAgICAgICBQcmVhbWJsZTsKKyAgICBORElTXzgwMl8xMV9XRVBfU1RBVFVTICAgICAgICAgICAgICBXZXBTdGF0dXM7CisgICAgTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSAgICAgQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVNYXg7CisgICAgTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSAgQnNzVHlwZTsKKyAgICBORElTXzgwMl8xMV9SVFNfVEhSRVNIT0xEICAgICAgICAgICBSdHNUaHJlc2g7CisgICAgTkRJU184MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQgRnJhZ1RocmVzaDsKKyAgICBORElTXzgwMl8xMV9QT1dFUl9NT0RFICAgICAgICAgICAgICBQb3dlck1vZGU7CisgICAgUE5ESVNfODAyXzExX0tFWSAgICAgICAgICAgICAgICAgICAgcEtleSA9IE5VTEw7CisgICAgUE5ESVNfODAyXzExX1dFUAkJCSAgICAgICAgcFdlcEtleSA9TlVMTDsKKyAgICBQTkRJU184MDJfMTFfUkVNT1ZFX0tFWSAgICAgICAgICAgICBwUmVtb3ZlS2V5ID0gTlVMTDsKKyAgICBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OICAgICAgICAgICBDb25maWcsICpwQ29uZmlnID0gTlVMTDsKKyAgICBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgICAgICAgICAgICBOZXRUeXBlOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdzsKKyAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlJZHggPSAwOworICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1MsIE1heFBoeU1vZGUgPSBQSFlfMTFHOworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvd2VyVGVtcDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWRpb1N0YXRlOworICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlTWFjaGluZVRvdWNoZWQgPSBGQUxTRTsKKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKwlPSURfU0VUX0hUX1BIWU1PREUJCQkJCUhUX1BoeU1vZGU7CS8vMTFuICxrYXRoeQorI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKKyAgICBQTkRJU184MDJfMTFfUE1LSUQgICAgICAgICAgICAgICAgICBwUG1rSWQgPSBOVUxMOworICAgIEJPT0xFQU4JCQkJICAgICAgICAgICAgICAgIElFRUU4MDIxeFN0YXRlID0gRkFMU0U7CisgICAgQk9PTEVBTgkJCQkgICAgICAgICAgICAgICAgSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMgPSBGQUxTRTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cGFfc3VwcGxpY2FudF9lbmFibGUgPSAwOworI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KKworI2lmZGVmIFNOTVBfU1VQUE9SVAorCVRYX1JUWV9DRkdfU1RSVUMJCQl0eF9ydHlfY2ZnOworCVVMT05HCQkJCQkJU2hvcnRSZXRyeUxpbWl0LCBMb25nUmV0cnlMaW1pdDsKKwlVQ0hBUgkJCQkJCWN0bXA7CisjZW5kaWYgLy8gU05NUF9TVVBQT1JUIC8vCisKKworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJTWF4UGh5TW9kZSA9IFBIWV8xMU5fNUc7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPlJUTVBTZXRJbmZvcm1hdGlvbigpLAkweCUwOHhcbiIsIGNtZCYweDdGRkYpKTsKKyAgICBzd2l0Y2goY21kICYgMHg3RkZGKSB7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9DT1VOVFJZX1JFR0lPTjoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggPCBzaXplb2YoVUNIQVIpKQorICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisJCQkvLyBPbmx5IGF2YWxpYWJsZSB3aGVuIEVFUFJPTSBub3QgcHJvZ3JhbW1pbmcKKyAgICAgICAgICAgIGVsc2UgaWYgKCEocEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uICYgMHg4MCkgJiYgIShwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCAmIDB4ODApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVMT05HICAgQ291bnRyeTsKKyAgICAgICAgICAgICAgICBVQ0hBUglUbXBQaHk7CisKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmQ291bnRyeSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gPSAoVUNIQVIpKENvdW50cnkgJiAweDAwMDAwMEZGKTsKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCA9IChVQ0hBUikoKENvdW50cnkgPj4gOCkgJiAweDAwMDAwMEZGKTsKKyAgICAgICAgICAgICAgICBUbXBQaHkgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGU7CisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID0gMHhmZjsKKwkJCQkvLyBCdWlsZCBhbGwgY29ycmVzcG9uZGluZyBjaGFubmVsIGluZm9ybWF0aW9uCisJCQkJUlRNUFNldFBoeU1vZGUocEFkYXB0ZXIsIFRtcFBoeSk7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJU2V0Q29tbW9uSFQocEFkYXB0ZXIpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9DT1VOVFJZX1JFR0lPTiAoQTolZCAgQi9HOiVkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQsCisJCQkJICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU46CisgI2lmZGVmIFJBTElOS19BVEUKKwkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRoZSBkcml2ZXIgaXMgaW4gQVRFIG1vZGUgbm93XG4iKSk7CisJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworICAgICAgICAgICAgTm93ID0gamlmZmllczsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU4sIFR4Q250ID0gJWQgXG4iLCBwQWRhcHRlci0+UmFsaW5rQ291bnRlcnMuTGFzdE9uZVNlY1RvdGFsVHhDb3VudCkpOworCisgICAgICAgICAgICBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIERyaXZlciBpcyBpbiBNb25pdG9yIE1vZGUgbm93ICEhIVxuIikpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisJCQkvL0JlbnNvbiBhZGQgMjAwODA1MjcsIHdoZW4gcmFkaW8gb2ZmLCBzdGEgZG9uJ3QgbmVlZCB0byBzY2FuCisJCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkKKwkJCQlicmVhazsKKworCQkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKwkJCXsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgRHJpdmVyIGlzIHNjYW5uaW5nIG5vdyAhISFcbiIpKTsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBUUlVFOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKwkJCWlmIChwQWRhcHRlci0+UmFsaW5rQ291bnRlcnMuTGFzdE9uZVNlY1RvdGFsVHhDb3VudCA+IDEwMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTGluayBVUCwgaWdub3JlIHRoaXMgc2V0OjpPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTlxuIikpOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCQkJcEFkYXB0ZXItPlN0YUNmZy5TY2FuQ250ID0gOTk7CQkvLyBQcmV2ZW50IGF1dG8gc2NhbiB0cmlnZ2VyZWQgYnkgdGhpcyBPSUQKKwkJCQlicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChPUFNUQVRVU19URVNUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkgJiYKKwkJCQkoKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAorCQkJCShwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKKwkJCQkocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fAorCQkJCShwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKSAmJgorICAgICAgICAgICAgICAgIChwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExpbmsgVVAsIFBvcnQgTm90IFNlY3VyZWQhIGlnbm9yZSB0aGlzIHNldDo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU5cbiIpKTsKKwkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQkJCXBBZGFwdGVyLT5TdGFDZmcuU2NhbkNudCA9IDk5OwkJLy8gUHJldmVudCBhdXRvIHNjYW4gdHJpZ2dlcmVkIGJ5IHRoaXMgT0lECisJCQkJYnJlYWs7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB0ZWxsIENOVEwgc3RhdGUgbWFjaGluZSB0byBjYWxsIE5kaXNNU2V0SW5mb3JtYXRpb25Db21wbGV0ZSgpIGFmdGVyIGNvbXBsZXRpbmcKKyAgICAgICAgICAgIC8vIHRoaXMgcmVxdWVzdCwgYmVjYXVzZSB0aGlzIHJlcXVlc3QgaXMgaW5pdGlhdGVkIGJ5IE5ESVMuCisgICAgICAgICAgICBwQWRhcHRlci0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IEZBTFNFOworICAgICAgICAgICAgLy8gUmVzZXQgYWxsb3dlZCBzY2FuIHJldHJpZXMKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuU2NhbkNudCA9IDA7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTY2FuVGltZSA9IE5vdzsKKworCQkJcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gVFJVRTsKKyAgICAgICAgICAgIFJUTVBfU0VUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpOworICAgICAgICAgICAgTWxtZUVucXVldWUocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICAgICAgICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworICAgICAgICAgICAgU3RhdGVNYWNoaW5lVG91Y2hlZCA9IFRSVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1NTSUQ6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9TU0lEKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgCVBDSEFSIHBTc2lkU3RyaW5nID0gTlVMTDsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmU3NpZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9TU0lEIChMZW49JWQsU3NpZD0lcylcbiIsIFNzaWQuU3NpZExlbmd0aCwgU3NpZC5Tc2lkKSk7CisgICAgICAgICAgICAgICAgaWYgKFNzaWQuU3NpZExlbmd0aCA+IE1BWF9MRU5fT0ZfU1NJRCkKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIAlpZiAoU3NpZC5Tc2lkTGVuZ3RoID09IDApCisgICAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAJCVNldF9TU0lEX1Byb2MocEFkYXB0ZXIsICIiKTsKKyAgICAgICAgICAgICAgICAJfQorCQkJCQllbHNlCisgICAgICAgICAgICAgICAgCXsKKwkgICAgICAgICAgICAgICAgCXBTc2lkU3RyaW5nID0gKENIQVIgKikga21hbGxvYyhNQVhfTEVOX09GX1NTSUQrMSwgTUVNX0FMTE9DX0ZMQUcpOworCQkJCQkJaWYgKHBTc2lkU3RyaW5nKQorCQkJCQkJeworCQkJCQkJCU5kaXNaZXJvTWVtb3J5KHBTc2lkU3RyaW5nLCBNQVhfTEVOX09GX1NTSUQrMSk7CisJCQkJCQkJTmRpc01vdmVNZW1vcnkocFNzaWRTdHJpbmcsIFNzaWQuU3NpZCwgU3NpZC5Tc2lkTGVuZ3RoKTsKKwkgICAgICAgICAgICAgICAgCQlTZXRfU1NJRF9Qcm9jKHBBZGFwdGVyLCBwU3NpZFN0cmluZyk7CisJCQkJCQkJa2ZyZWUocFNzaWRTdHJpbmcpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJCVN0YXR1cyA9IC1FTk9NRU07CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0JTU0lEOgorI2lmZGVmIFJBTElOS19BVEUKKwkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRoZSBkcml2ZXIgaXMgaW4gQVRFIG1vZGUgbm93XG4iKSk7CisJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfTUFDX0FERFJFU1MpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZCc3NpZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworICAgICAgICAgICAgICAgIC8vIHRlbGwgQ05UTCBzdGF0ZSBtYWNoaW5lIHRvIGNhbGwgTmRpc01TZXRJbmZvcm1hdGlvbkNvbXBsZXRlKCkgYWZ0ZXIgY29tcGxldGluZworICAgICAgICAgICAgICAgIC8vIHRoaXMgcmVxdWVzdCwgYmVjYXVzZSB0aGlzIHJlcXVlc3QgaXMgaW5pdGlhdGVkIGJ5IE5ESVMuCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBGQUxTRTsKKworCQkJCS8vIFByZXZlbnQgdG8gY29ubmVjdCBBUCBhZ2FpbiBpbiBTVEFNbG1lUGVyaW9kaWNFeGVjCisJCQkJcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW49IDMyOworCisgICAgICAgICAgICAgICAgLy8gUmVzZXQgYWxsb3dlZCBzY2FuIHJldHJpZXMKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLlNjYW5DbnQgPSAwOworCisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPSURfODAyXzExX0JTU0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihORElTXzgwMl8xMV9NQUNfQUREUkVTUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFZPSUQgKikmQnNzaWQpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgU3RhdGVNYWNoaW5lVG91Y2hlZCA9IFRSVUU7CisKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQlNTSUQgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnNzaWRbMF0sIEJzc2lkWzFdLCBCc3NpZFsyXSwgQnNzaWRbM10sIEJzc2lkWzRdLCBCc3NpZFs1XSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9SQURJTzoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKEJPT0xFQU4pKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZSYWRpb1N0YXRlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9SQURJTyAoPSVkKVxuIiwgUmFkaW9TdGF0ZSkpOworICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJTd1JhZGlvICE9IFJhZGlvU3RhdGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJTd1JhZGlvID0gUmFkaW9TdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYlJhZGlvICE9IChwQWRhcHRlci0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZGFwdGVyLT5TdGFDZmcuYlN3UmFkaW8pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJSYWRpbyA9IChwQWRhcHRlci0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZGFwdGVyLT5TdGFDZmcuYlN3UmFkaW8pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWxtZVJhZGlvT24ocEFkYXB0ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbgorCQkJCQkJCXBBZGFwdGVyLT5FeHRyYUluZm8gPSBFWFRSQV9JTkZPX0NMRUFSOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1sbWVSYWRpb09mZihwQWRhcHRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uCisJCQkJCQkJcEFkYXB0ZXItPkV4dHJhSW5mbyA9IFNXX1JBRElPX09GRjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUEhZX01PREU6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihSVF84MDJfMTFfUEhZX01PREUpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZQaHlNb2RlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCWlmIChQaHlNb2RlIDw9IE1heFBoeU1vZGUpCisJCQkJeworICAgICAgICAgICAgICAgIAlSVE1QU2V0UGh5TW9kZShwQWRhcHRlciwgUGh5TW9kZSk7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJCVNldENvbW1vbkhUKHBBZGFwdGVyKTsKKyNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KKwkJCQl9CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1BIWV9NT0RFICg9JWQpXG4iLCBQaHlNb2RlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1NUQV9DT05GSUc6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihSVF84MDJfMTFfU1RBX0NPTkZJRykpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJlN0YUNvbmZpZywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ID0gU3RhQ29uZmlnLkVuYWJsZVR4QnVyc3Q7CisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSBTdGFDb25maWcuVXNlQkdQcm90ZWN0aW9uOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUgPSAxOyAvLyAyMDAzLTEwLTMwIGFsd2F5cyBTSE9SVCBTTE9UIGNhcGFibGUKKyAgICAgICAgICAgICAgICBpZiAoKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSAhPSBTdGFDb25maWcuQWRob2NNb2RlKSAmJgorCQkJCQkoU3RhQ29uZmlnLkFkaG9jTW9kZSA8PSBNYXhQaHlNb2RlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IGR5bmFtaWMgY2hhbmdlIG9mICJVU0UgT0ZETSByYXRlIG9yIG5vdCIgaW4gQURIT0MgbW9kZQorICAgICAgICAgICAgICAgICAgICAvLyBpZiBzZXR0aW5nIGNoYW5nZWQsIG5lZWQgdG8gcmVzZXQgY3VycmVudCBUWCByYXRlIGFzIHdlbGwgYXMgQkVBQ09OIGZyYW1lIGZvcm1hdAorICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKKyAgICAgICAgICAgICAgICAgICAgeworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID0gU3RhQ29uZmlnLkFkaG9jTW9kZTsKKyAgICAgICAgICAgICAgICAgICAgCVJUTVBTZXRQaHlNb2RlKHBBZGFwdGVyLCBQaHlNb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1sbWVVcGRhdGVUeFJhdGVzKHBBZGFwdGVyLCBGQUxTRSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBNYWtlSWJzc0JlYWNvbihwQWRhcHRlcik7ICAgICAgICAgICAvLyByZS1idWlsZCBCRUFDT04gZnJhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIEFzaWNFbmFibGVJYnNzU3luYyhwQWRhcHRlcik7ICAgLy8gY29weSB0byBvbi1jaGlwIG1lbW9yeQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfU1RBX0NPTkZJRyAoQnVyc3Q9JWQsIFByb3RlY3Rpb249JWxkLFNob3J0U2xvdD0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfREVTSVJFRF9SQVRFUzoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX1JBVEVTKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmYXJ5UmF0ZXMsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlLCAmYXJ5UmF0ZXMsIHNpemVvZihORElTXzgwMl8xMV9SQVRFUykpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTICglMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngpXG4iLAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMF0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzFdLAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMl0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzNdLAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNF0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzVdLAorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNl0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzddICkpOworICAgICAgICAgICAgICAgIC8vIENoYW5naW5nIERlc2lyZWRSYXRlIG1heSBhZmZlY3QgdGhlIE1BWCBUWCByYXRlIHdlIHVzZWQgdG8gVFggZnJhbWVzIG91dAorICAgICAgICAgICAgICAgIE1sbWVVcGRhdGVUeFJhdGVzKHBBZGFwdGVyLCBGQUxTRSwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1BSRUFNQkxFOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoUlRfODAyXzExX1BSRUFNQkxFKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUHJlYW1ibGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVTaG9ydCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFByZWFtYmxlOworICAgICAgICAgICAgICAgICAgICBNbG1lU2V0VHhQcmVhbWJsZShwQWRhcHRlciwgUnQ4MDJfMTFQcmVhbWJsZVNob3J0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVMb25nKSB8fCAoUHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZUF1dG8pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdXNlciB3YW50cyBBVVRPLCBpbml0aWFsaXplIHRvIExPTkcgaGVyZSwgdGhlbiBjaGFuZ2UgYWNjb3JkaW5nIHRvIEFQJ3MKKyAgICAgICAgICAgICAgICAgICAgLy8gY2FwYWJpbGl0eSB1cG9uIGFzc29jaWF0aW9uLgorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPSBQcmVhbWJsZTsKKyAgICAgICAgICAgICAgICAgICAgTWxtZVNldFR4UHJlYW1ibGUocEFkYXB0ZXIsIFJ0ODAyXzExUHJlYW1ibGVMb25nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9QUkVBTUJMRSAoPSVkKVxuIiwgUHJlYW1ibGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfV0VQX1NUQVRVUzoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX1dFUF9TVEFUVVMpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZXZXBTdGF0dXMsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgLy8gU2luY2UgVEtJUCwgQUVTLCBXRVAgYXJlIGFsbCBzdXBwb3J0ZWQuIEl0IHNob3VsZCBub3QgaGF2ZSBhbnkgaW52YWxpZCBzZXR0aW5nCisgICAgICAgICAgICAgICAgaWYgKFdlcFN0YXR1cyA8PSBOZGlzODAyXzExRW5jcnlwdGlvbjNLZXlBYnNlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgIT0gV2VwU3RhdHVzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25maWcgaGFzIGNoYW5nZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgICAgID0gV2VwU3RhdHVzOworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBXZXBTdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IFdlcFN0YXR1czsKKyAgICAgICAgICAgICAgICAJcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciAgID0gV2VwU3RhdHVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9XRVBfU1RBVFVTICg9JWQpXG4iLFdlcFN0YXR1cykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkF1dGhNb2RlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChBdXRoTW9kZSA+IE5kaXM4MDJfMTFBdXRoTW9kZU1heCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gQXV0aE1vZGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbmZpZyBoYXMgY2hhbmdlZAorICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gQXV0aE1vZGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgKD0lZCkgXG4iLHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfSU5GUkFTVFJVQ1RVUkVfTU9ERToKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZCc3NUeXBlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJCQkJaWYgKEJzc1R5cGUgPT0gTmRpczgwMl8xMUlCU1MpCisJCQkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiQWRob2MiKTsKKwkJCQllbHNlIGlmIChCc3NUeXBlID09IE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZSkKKwkJCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJJbmZyYSIpOworCQkJCWVsc2UgaWYgKEJzc1R5cGUgPT0gTmRpczgwMl8xMU1vbml0b3IpCisJCQkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiTW9uaXRvciIpOworCQkJCWVsc2UKKwkJCQl7CisJCQkJCVN0YXR1cyAgPSAtRUlOVkFMOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfSU5GUkFTVFJVQ1RVUkVfTU9ERSAodW5rbm93bilcbiIpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkgY2FzZSBPSURfODAyXzExX1JFTU9WRV9XRVA6CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUkVNT1ZFX1dFUFxuIikpOworICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfS0VZX0lOREVYKSkKKyAgICAgICAgICAgIHsKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworCQkJCUtleUlkeCA9ICooTkRJU184MDJfMTFfS0VZX0lOREVYICopIHdycS0+dS5kYXRhLnBvaW50ZXI7CisKKwkJCQlpZiAoS2V5SWR4ICYgMHg4MDAwMDAwMCkKKwkJCQl7CisJCQkJCS8vIFNob3VsZCBuZXZlciBzZXQgZGVmYXVsdCBiaXQgd2hlbiByZW1vdmUga2V5CisJCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCUtleUlkeCA9IEtleUlkeCAmIDB4MGZmZmZmZmY7CisJCQkJCWlmIChLZXlJZHggPj0gNCl7CisJCQkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9IDA7CisJCQkJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJCQkJCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIDAsIChVQ0hBUilLZXlJZHgpOworCQkJCQl9CisJCQkJfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9SRVNFVF9DT1VOVEVSUzoKKyAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWRhcHRlci0+V2xhbkNvdW50ZXJzLCBzaXplb2YoQ09VTlRFUl84MDJfMTEpKTsKKyAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWRhcHRlci0+Q291bnRlcnM4MDIzLCBzaXplb2YoQ09VTlRFUl84MDJfMykpOworICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkoJnBBZGFwdGVyLT5SYWxpbmtDb3VudGVycywgc2l6ZW9mKENPVU5URVJfUkFMSU5LKSk7CisgICAgICAgICAgICBwQWRhcHRlci0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXIgICA9IDA7CisJCQlwQWRhcHRlci0+Q291bnRlcnM4MDIzLkdvb2RSZWNlaXZlcyA9IDA7CisJCQlwQWRhcHRlci0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXIgICA9IDA7CisjaWZkZWYgUlQyODcwCisJCQlwQWRhcHRlci0+QnVsa091dENvbXBsZXRlCT0gMDsKKwkJCXBBZGFwdGVyLT5CdWxrT3V0Q29tcGxldGVPdGhlcj0gMDsKKwkJCXBBZGFwdGVyLT5CdWxrT3V0Q29tcGxldGVDYW5jZWwgPSAwOworCQkJcEFkYXB0ZXItPkJ1bGtPdXRSZXEgPSAwOworCQkJcEFkYXB0ZXItPkJ1bGtJblJlcT0gMDsKKwkJCXBBZGFwdGVyLT5CdWxrSW5Db21wbGV0ZSA9IDA7CisJCQlwQWRhcHRlci0+QnVsa0luQ29tcGxldGVGYWlsID0gMDsKKyNlbmRpZiAvLyBSVDI4NzAgLy8KKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9SRVNFVF9DT1VOVEVSUyBcbiIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX1JUU19USFJFU0hPTEQpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZSdHNUaHJlc2gsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKFJ0c1RocmVzaCA+IE1BWF9SVFNfVEhSRVNIT0xEKQorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUnRzVGhyZXNob2xkID0gKFVTSE9SVClSdHNUaHJlc2g7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRCAoPSVsZClcbiIsUnRzVGhyZXNoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZGcmFnVGhyZXNoLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9IEZBTFNFOworICAgICAgICAgICAgICAgIGlmIChGcmFnVGhyZXNoID4gTUFYX0ZSQUdfVEhSRVNIT0xEIHx8IEZyYWdUaHJlc2ggPCBNSU5fRlJBR19USFJFU0hPTEQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoRnJhZ1RocmVzaCA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gTUFYX0ZSQUdfVEhSRVNIT0xEOworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gKFVTSE9SVClGcmFnVGhyZXNoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEICg9JWxkKSBcbiIsRnJhZ1RocmVzaCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9QT1dFUl9NT0RFOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfUE9XRVJfTU9ERSkpCisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUG93ZXJNb2RlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChQb3dlck1vZGUgPT0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTSkKKyAgICAgICAgICAgICAgICAJU2V0X1BTTW9kZV9Qcm9jKHBBZGFwdGVyLCAiQ0FNIik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoUG93ZXJNb2RlID09IE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQKQorICAgICAgICAgICAgICAgIAlTZXRfUFNNb2RlX1Byb2MocEFkYXB0ZXIsICJNYXhfUFNQIik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoUG93ZXJNb2RlID09IE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUCkKKwkJCQkJU2V0X1BTTW9kZV9Qcm9jKHBBZGFwdGVyLCAiRmFzdF9QU1AiKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChQb3dlck1vZGUgPT0gTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1ApCisJCQkJCVNldF9QU01vZGVfUHJvYyhwQWRhcHRlciwgIkxlZ2FjeV9QU1AiKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUE9XRVJfTU9ERSAoPSVkKVxuIixQb3dlck1vZGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMXzE6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICA8IHNpemVvZihVTE9ORykpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUG93ZXJUZW1wLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCWlmIChQb3dlclRlbXAgPiAxMDApCisJCQkJCVBvd2VyVGVtcCA9IDB4ZmZmZmZmZmY7ICAvLyBBVVRPCisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdCA9IFBvd2VyVGVtcDsgLy9rZWVwIGN1cnJlbnQgc2V0dGluZy4KKwkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQ7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMXzEgKD0lbGQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlKSk7CisJCQl9CisJICAgICAgICBicmVhazsKKwkJY2FzZSBPSURfODAyXzExX05FVFdPUktfVFlQRV9JTl9VU0U6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUpKQorCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQllbHNlCisJCQl7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJk5ldFR5cGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwkJCQlpZiAoTmV0VHlwZSA9PSBOZGlzODAyXzExRFMpCisJCQkJCVJUTVBTZXRQaHlNb2RlKHBBZGFwdGVyLCBQSFlfMTFCKTsKKwkJCQllbHNlIGlmIChOZXRUeXBlID09IE5kaXM4MDJfMTFPRkRNMjQpCisJCQkJCVJUTVBTZXRQaHlNb2RlKHBBZGFwdGVyLCBQSFlfMTFCR19NSVhFRCk7CisJCQkJZWxzZSBpZiAoTmV0VHlwZSA9PSBOZGlzODAyXzExT0ZETTUpCisJCQkJCVJUTVBTZXRQaHlNb2RlKHBBZGFwdGVyLCBQSFlfMTFBKTsKKwkJCQllbHNlCisJCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCQkJaWYgKFN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCQlTZXRDb21tb25IVChwQWRhcHRlcik7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX05FVFdPUktfVFlQRV9JTl9VU0UgKD0lZClcbiIsTmV0VHlwZSkpOworCQkgICAgfQorCQkJYnJlYWs7CisgICAgICAgIC8vIEZvciBXUEEgUFNLIFBNSyBrZXkKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX0FERF9XUEE6CisgICAgICAgICAgICBwS2V5ID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmKHBLZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwS2V5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgaWYgKHBLZXktPkxlbmd0aCAhPSB3cnEtPnUuZGF0YS5sZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX0FERF9XUEEsIEZhaWxlZCEhXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgJiYKKwkJCQkgICAgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgJiYKKwkJCQkgICAgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVPUE5PVFNVUFA7CisgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9BRERfV1BBLCBGYWlsZWQhISBbQXV0aE1vZGUgIT0gV1BBUFNLL1dQQTJQU0svV1BBTk9ORV1cbiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAorCQkJCQkJIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spIHx8CisJCQkJCQkgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkgKSAgICAgLy8gT25seSBmb3IgV1BBIFBTSyBtb2RlCisJCQkJeworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLlBNSywgJnBLZXktPktleU1hdGVyaWFsLCBwS2V5LT5LZXlMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAvLyBVc2UgUmFDb25maWcgYXMgUFNLIGFnZW50LgorICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCBTVEEgc3VwcGxpY2FudCBzdGF0ZSBtYWNoaW5lCisgICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfU1RBUlQ7CisKKyAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX0FERF9XUEEgKGlkPTB4JXgsIExlbj0lZC1ieXRlKVxuIiwgcEtleS0+S2V5SW5kZXgsIHBLZXktPktleUxlbmd0aCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfQUREX1dQQSAoaWQ9MHgleCwgTGVuPSVkLWJ5dGUpXG4iLCBwS2V5LT5LZXlJbmRleCwgcEtleS0+S2V5TGVuZ3RoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAga2ZyZWUocEtleSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1JFTU9WRV9LRVk6CisgICAgICAgICAgICBwUmVtb3ZlS2V5ID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmKHBSZW1vdmVLZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwUmVtb3ZlS2V5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgaWYgKHBSZW1vdmVLZXktPkxlbmd0aCAhPSB3cnEtPnUuZGF0YS5sZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9LRVksIEZhaWxlZCEhXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUlRNUFdQQVJlbW92ZUtleVByb2MocEFkYXB0ZXIsIHBSZW1vdmVLZXkpOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUkVNT1ZFX0tFWSwgUmVtb3ZlIFdQQSBLZXkhIVxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBLZXlJZHggPSBwUmVtb3ZlS2V5LT5LZXlJbmRleDsKKworICAgICAgICAgICAgICAgICAgICBpZiAoS2V5SWR4ICYgMHg4MDAwMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2hvdWxkIG5ldmVyIHNldCBkZWZhdWx0IGJpdCB3aGVuIHJlbW92ZSBrZXkKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9LRVksIEZhaWxlZCEhKFNob3VsZCBuZXZlciBzZXQgZGVmYXVsdCBiaXQgd2hlbiByZW1vdmUga2V5KVxuIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgS2V5SWR4ID0gS2V5SWR4ICYgMHgwZmZmZmZmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChLZXlJZHggPiAzKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfS0VZLCBGYWlsZWQhIShLZXlJZFslZF0gb3V0IG9mIHJhbmdlKVxuIiwgS2V5SWR4KSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwgMCwgKFVDSEFSKUtleUlkeCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9LRVkgKGlkPTB4JXgsIExlbj0lZC1ieXRlKVxuIiwgcFJlbW92ZUtleS0+S2V5SW5kZXgsIHBSZW1vdmVLZXktPkxlbmd0aCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAga2ZyZWUocFJlbW92ZUtleSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLy8gTmV3IGZvciBXUEEKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0FERF9LRVk6CisgICAgICAgICAgICBwS2V5ID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmKHBLZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocEtleSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChwS2V5LT5MZW5ndGggIT0gd3JxLT51LmRhdGEubGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfS0VZLCBGYWlsZWQhIVxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJUTVBBZGRLZXkocEFkYXB0ZXIsIHBLZXkpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfS0VZIChpZD0weCV4LCBMZW49JWQtYnl0ZSlcbiIsIHBLZXktPktleUluZGV4LCBwS2V5LT5LZXlMZW5ndGgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtmcmVlKHBLZXkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoTkRJU184MDJfMTFfQ09ORklHVVJBVElPTikpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkNvbmZpZywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBwQ29uZmlnID0gJkNvbmZpZzsKKworICAgICAgICAgICAgICAgIGlmICgocENvbmZpZy0+QmVhY29uUGVyaW9kID49IDIwKSAmJiAocENvbmZpZy0+QmVhY29uUGVyaW9kIDw9NDAwKSkKKyAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQmVhY29uUGVyaW9kID0gKFVTSE9SVCkgcENvbmZpZy0+QmVhY29uUGVyaW9kOworCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUFjdGl2ZS5BdGltV2luID0gKFVTSE9SVCkgcENvbmZpZy0+QVRJTVdpbmRvdzsKKyAgICAgICAgICAgICAgICBNQVBfS0haX1RPX0NIQU5ORUxfSUQocENvbmZpZy0+RFNDb25maWcsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCk7CisgICAgICAgICAgICAgICAgLy8KKwkJCQkvLyBTYXZlIHRoZSBjaGFubmVsIG9uIE1sbWVBdXggZm9yIENudGxPaWRSVEJzc2lkUHJvYyB1c2VkLgorCQkJCS8vCisJCQkJcEFkYXB0ZXItPk1sbWVBdXguQ2hhbm5lbCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbDsKKworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OIChCZWFjblBlcmlvZD0lbGQsQXRpbVc9JWxkLENoPSVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgcENvbmZpZy0+QmVhY29uUGVyaW9kLCBwQ29uZmlnLT5BVElNV2luZG93LCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKyAgICAgICAgICAgICAgICAvLyBDb25maWcgaGFzIGNoYW5nZWQKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+YkNvbmZpZ0NoYW5nZWQgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfSFRfUEhZTU9ERToKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGgJIT0gc2l6ZW9mKE9JRF9TRVRfSFRfUEhZTU9ERSkpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCSAgICBQT0lEX1NFVF9IVF9QSFlNT0RFCXBIVFBoeU1vZGUgPSAmSFRfUGh5TW9kZTsKKworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZIVF9QaHlNb2RlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6cEhUUGh5TW9kZQkoUGh5TW9kZSA9ICVkLFRyYW5zbWl0Tm8gPSAlZCwgSHRNb2RlID0JJWQsCUV4dE9mZnNldCA9CSVkICwgTUNTID0gJWQsIEJXID0JJWQsCVNUQkMgPSAlZCwgU0hPUlRHSSA9ICVkKSBcbiIsCisJCQkJcEhUUGh5TW9kZS0+UGh5TW9kZSwgcEhUUGh5TW9kZS0+VHJhbnNtaXRObyxwSFRQaHlNb2RlLT5IdE1vZGUscEhUUGh5TW9kZS0+RXh0T2Zmc2V0LAorCQkJCXBIVFBoeU1vZGUtPk1DUywgcEhUUGh5TW9kZS0+QlcsIHBIVFBoeU1vZGUtPlNUQkMsCXBIVFBoeU1vZGUtPlNIT1JUR0kpKTsKKwkJCQlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlCT49IFBIWV8xMUFCR05fTUlYRUQpCisJCQkJCVJUTVBTZXRIVChwQWRhcHRlciwJcEhUUGh5TW9kZSk7CisJCQl9CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX0hUX1BIWU1PREUoTUNTPSVkLEJXPSVkLFNHST0lZCxTVEJDPSVkKVxuIiwKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MsIHBBZGFwdGVyLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLkJXLCBwQWRhcHRlci0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJLAorCQkJCXBBZGFwdGVyLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNUQkMpKTsKKwkJCWJyZWFrOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX0FQU0RfU0VUVElORzoKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVMT05HKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVVMT05HIGFwc2QgOworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZhcHNkLCB3cnEtPnUuZGF0YS5wb2ludGVyLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJCQkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJfEIzMX5CNwl8CUI2fkI1CSB8CSBCNAkgfAkgQjMJIHwJQjIJIHwJQjEJIHwJICAgQjAJCXwKKwkJCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQl8IFJzdmQJfCBNYXggU1AgTGVuIHwgQUNfVk8gfCBBQ19WSSB8IEFDX0JLIHwgQUNfQkUgfCBBUFNECUNhcGFibGUJfAorCQkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgPSAoYXBzZCAmIDB4MDAwMDAwMDEpID8gVFJVRSA6CUZBTFNFOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CRSA9ICgoYXBzZAkmIDB4MDAwMDAwMDIpID4+IDEpCT8gVFJVRSA6IEZBTFNFOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CSyA9ICgoYXBzZAkmIDB4MDAwMDAwMDQpID4+IDIpCT8gVFJVRSA6IEZBTFNFOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WSSA9ICgoYXBzZAkmIDB4MDAwMDAwMDgpID4+IDMpCT8gVFJVRSA6IEZBTFNFOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WTyA9ICgoYXBzZAkmIDB4MDAwMDAwMTApID4+IDQpCT8gVFJVRSA6IEZBTFNFOworCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuTWF4U1BMZW5ndGgJPSAoVUNIQVIpKChhcHNkCSYgMHgwMDAwMDA2MCkgPj4gNSk7CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX0FQU0RfU0VUVElORyAoYXBzZD0weCVseCwgQVBTRENhcD0lZCwgW0JFLEJLLFZJLFZPXT1bJWQvJWQvJWQvJWRdLAlNYXhTUExlbj0lZClcbiIsIGFwc2QsIHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlLAorCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUsCXBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CSywJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZJLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8sCXBBZGFwdGVyLT5Db21tb25DZmcuTWF4U1BMZW5ndGgpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfQVBTRF9QU006CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoCSE9IHNpemVvZihVTE9ORykpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBEcml2ZXIgbmVlZHMJdG8gbm90aWZ5IEFQIHdoZW4gUFNNIGNoYW5nZXMKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCWlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUJIT0gcEFkYXB0ZXItPlN0YUNmZy5Qc20pCisJCQkJeworCQkJCQlNbG1lU2V0UHNtQml0KHBBZGFwdGVyLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpOworCQkJCQlSVE1QU2VuZE51bGxGcmFtZShwQWRhcHRlciwJcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFJhdGUsCVRSVUUpOworCQkJCX0KKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX0FQU0RfUFNNIChiQVBTREZvcmNlUG93ZXJTYXZlOiVkKVxuIiwJcEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlKSk7CisJCQl9CisJCQlicmVhazsKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9ETFM6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVTE9ORykpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlCT09MRUFOCW9sZHZhbHVlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5iRExTQ2FwYWJsZTsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmcEFkYXB0ZXItPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlpZiAob2xkdmFsdWUgJiYJIXBBZGFwdGVyLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCisJCQkJeworCQkJCQlpbnQJaTsKKwkJCQkJLy8gdGVhcglkb3duIGxvY2FsIGRscyB0YWJsZSBlbnRyeQorCQkJCQlmb3IJKGk9MDsgaTxNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCisJCQkJCXsKKwkJCQkJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSkKKwkJCQkJCXsKKwkJCQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOworCQkJCQkJCXBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKKwkJCQkJCQlSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUocEFkYXB0ZXIsIHBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQkvLyB0ZWFyCWRvd24gcGVlciBkbHMgdGFibGUJZW50cnkKKwkJCQkJZm9yCShpPU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKKwkJCQkJeworCQkJCQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpKQorCQkJCQkJeworCQkJCQkJCXBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7CisJCQkJCQkJcEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOworCQkJCQkJCVJUTVBTZW5kRExTVGVhckRvd25GcmFtZShwQWRhcHRlciwgcEFkYXB0ZXItPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9ETFMgKD0lZClcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuYkRMU0NhcGFibGUpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfRExTX1BBUkFNOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aAkhPSBzaXplb2YoUlRfODAyXzExX0RMU19VSSkpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlSVF84MDJfMTFfRExTCURsczsKKworCQkJCU5kaXNaZXJvTWVtb3J5KCZEbHMsIHNpemVvZihSVF84MDJfMTFfRExTKSk7CisJCQkJUlRNUE1vdmVNZW1vcnkoJkRscywgd3JxLT51LmRhdGEucG9pbnRlciwgc2l6ZW9mKFJUXzgwMl8xMV9ETFNfVUkpKTsKKwkJCQlNbG1lRW5xdWV1ZShwQWRhcHRlciwKKwkJCQkJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCQkJCQlSVF9PSURfODAyXzExX1NFVF9ETFNfUEFSQU0sCisJCQkJCQkJc2l6ZW9mKFJUXzgwMl8xMV9ETFMpLAorCQkJCQkJCSZEbHMpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9ETFNfUEFSQU0gXG4iKSk7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KKwkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9XTU06CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoCSE9IHNpemVvZihCT09MRUFOKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZwQWRhcHRlci0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfV01NICg9JWQpCVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSkpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0RJU0FTU09DSUFURToKKyNpZmRlZiBSQUxJTktfQVRFCisJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUaGUgZHJpdmVyIGlzIGluIEFURSBtb2RlIG5vd1xuIikpOworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKwkJCS8vCisJCQkvLyBTZXQgTmRpc1JhZGlvU3RhdGVPZmYgdG8JVFJVRSwgaW5zdGVhZCBvZiBjYWxsZWQJTWxtZVJhZGlvT2ZmLgorCQkJLy8gTGF0ZXIgb24sIE5ESVNfODAyXzExX0JTU0lEX0xJU1RfRVgtPk51bWJlck9mSXRlbXMgc2hvdWxkIGJlCTAKKwkJCS8vIHdoZW4JcXVlcnkgT0lEXzgwMl8xMV9CU1NJRF9MSVNULgorCQkJLy8KKwkJCS8vIFRSVUU6ICBOdW1iZXJPZkl0ZW1zCXdpbGwgc2V0IHRvCTAuCisJCQkvLyBGQUxTRTogTnVtYmVyT2ZJdGVtcwlubyBjaGFuZ2UuCisJCQkvLworCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5OZGlzUmFkaW9TdGF0ZU9mZiA9CVRSVUU7CisJCQkvLyBTZXQgdG8gaW1tZWRpYXRlbHkgc2VuZCB0aGUgbWVkaWEgZGlzY29ubmVjdAlldmVudAorCQkJcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMJPSBUUlVFOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0RJU0FTU09DSUFURQlcbiIpKTsKKworCQkJaWYgKElORlJBX09OKHBBZGFwdGVyKSkKKwkJCXsKKwkJCQlpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9CUNOVExfSURMRSkKKwkJCQl7CisJCQkJCVJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRQlidXN5LCByZXNldAlNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7CisJCQkJfQorCisJCQkJTWxtZUVucXVldWUocEFkYXB0ZXIsCisJCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJCQlPSURfODAyXzExX0RJU0FTU09DSUFURSwKKwkJCQkJMCwKKwkJCQkJTlVMTCk7CisKKwkJCQlTdGF0ZU1hY2hpbmVUb3VjaGVkCT0gVFJVRTsKKwkJCX0KKwkJCWJyZWFrOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfSU1NRV9CQV9DQVA6CisJCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoT0lEX0JBQ0FQX1NUUlVDKSkKKwkJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCQllbHNlCisJCQkJeworCQkJCQlPSURfQkFDQVBfU1RSVUMgT3JkZSA7CisJCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZPcmRlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCQlpZiAoT3JkZS5Qb2xpY3kgPiBCQV9OT1RVU0UpCisJCQkJCXsKKwkJCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQTsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChPcmRlLlBvbGljeSA9PSBCQV9OT1RVU0UpCisJCQkJCXsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSA9IEJBX05PVFVTRTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlID0gT3JkZS5BbXNkdUVuYWJsZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZT0gT3JkZS5BbXNkdVNpemU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHM9IE9yZGUuTU1QU21vZGU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSA9IE9yZGUuTU1QU21vZGU7CisJCQkJCQkvLyBVUGRhdGEgdG8gSFQgSUUKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHMgPSBPcmRlLk1NUFNtb2RlOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZSA9IE9yZGUuQW1zZHVTaXplOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IE9yZGUuQXV0b0JBOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID0gSU1NRURfQkE7IC8vIHdlIG9ubHkgc3VwcG9ydCBpbW1lZGlhdGUgQkEuCisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdUVuYWJsZSA9IE9yZGUuQW1zZHVFbmFibGU7CisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemU9IE9yZGUuQW1zZHVTaXplOworCQkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWltb1BzID0gT3JkZS5NTVBTbW9kZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gT3JkZS5NTVBTbW9kZTsKKworCQkJCQkJLy8gVVBkYXRhIHRvIEhUIElFCisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzID0gT3JkZS5NTVBTbW9kZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemUgPSBPcmRlLkFtc2R1U2l6ZTsKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7CisKKwkJCQkJCWlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPiBNQVhfUlhfUkVPUkRFUkJVRikKKwkJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSBNQVhfUlhfUkVPUkRFUkJVRjsKKworCQkJCQl9CisKKwkJCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkud29yZCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LndvcmQ7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6KE9yZGUuQXV0b0JBID0gJWQpIChQb2xpY3k9JWQpKFJlQkFXaW5MaW1pdD0lZCkoVHhCQVdpbkxpbWl0PSVkKShBdXRvTW9kZT0lZClcbiIsT3JkZS5BdXRvQkEsIHBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSwKKwkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCxwQWRhcHRlci0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5UeEJBV2luTGltaXQsIHBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSkpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OihNaW1vUHMgPSAlZCkoQW1zZHVFbmFibGUgPSAlZCkgKEFtc2R1U2l6ZT0lZCkoTXBkdURlbnNpdHk9JWQpXG4iLHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QcywgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUsCisJCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemUsIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5KSk7CisJCQkJfQorCisJCQkJYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9BRERfSU1NRV9CQToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBTZXQgOjogUlRfT0lEXzgwMl8xMV9BRERfSU1NRV9CQSBcbiIpKTsKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE9JRF9BRERfQkFfRU5UUlkpKQorCQkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVVDSEFSCQkgICAgICAgIGluZGV4OworCQkJCU9JRF9BRERfQkFfRU5UUlkgICAgQkE7CisJCQkJTUFDX1RBQkxFX0VOVFJZICAgICAqcEVudHJ5OworCisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkJBLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCWlmIChCQS5USUQgPiAxNSkKKwkJCQl7CisJCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8vQkFUYWJsZUluc2VydEVudHJ5CisJCQkJCS8vQXMgYWQtaG9jIG1vZGUsIEJBIHBhaXIgaXMgbm90IGxpbWl0ZWQgdG8gb25seSBCU1NJRC4gc28gYWRkIHZpYSBPSUQuCisJCQkJCWluZGV4ID0gQkEuVElEOworCQkJCQkvLyBpbiBhZCBob2MgbW9kZSwgd2hlbiBhZGRpbmcgQkEgcGFpciwgd2Ugc2hvdWxkIGluc2VydCB0aGlzIGVudHJ5IGludG8gTUFDRW50cnkgdG9vCisJCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZGFwdGVyLCBCQS5NQUNBZGRyKTsKKwkJCQkJaWYgKCFwRW50cnkpCisJCQkJCXsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUX09JRF84MDJfMTFfQUREX0lNTUVfQkEuIGJyZWFrIG9uIG5vIGNvbm5lY3Rpb24uLS0tLToleDoleFxuIiwgQkEuTUFDQWRkcls0XSwgQkEuTUFDQWRkcls1XSkpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJaWYgKEJBLklzUmVjaXBpZW50ID09IEZBTFNFKQorCQkJCQl7CisJCQkJCSAgICBpZiAocEVudHJ5LT5iSUFtQmFkQXRoZXJvcyA9PSBUUlVFKQorCQkJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IDB4MTA7CisKKwkJCQkJCUJBT3JpU2Vzc2lvblNldFVwKHBBZGFwdGVyLCBwRW50cnksIGluZGV4LCAwLCAxMDAsIFRSVUUpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJLy9CQVRhYmxlSW5zZXJ0RW50cnkocEFkYXB0ZXIsIHBFbnRyeS0+QWlkLCBCQS5NQUNBZGRyLCAwLCAweGZmZmYsIEJBLlRJRCwgQkEubk1TRFUsIEJBLklzUmVjaXBpZW50KTsKKwkJCQkJfQorCisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9BRERfSU1NRV9CQS4gUmVjID0gJWQuIE1hYyA9ICV4OiV4OiV4OiV4OiV4OiV4IC4gXG4iLAorCQkJCQkJQkEuSXNSZWNpcGllbnQsIEJBLk1BQ0FkZHJbMF0sIEJBLk1BQ0FkZHJbMV0sIEJBLk1BQ0FkZHJbMl0sIEJBLk1BQ0FkZHJbMl0KKwkJCQkJCSwgQkEuTUFDQWRkcls0XSwgQkEuTUFDQWRkcls1XSkpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9URUFSX0lNTUVfQkE6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQgOjogUlRfT0lEXzgwMl8xMV9URUFSX0lNTUVfQkEgXG4iKSk7CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihPSURfQUREX0JBX0VOVFJZKSkKKwkJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlQT0lEX0FERF9CQV9FTlRSWQlwQkE7CisJCQkJTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7CisKKwkJCQlwQkEgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgTUVNX0FMTE9DX0ZMQUcpOworCisJCQkJaWYgKHBCQSA9PSBOVUxMKQorCQkJCXsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IDo6IFJUX09JRF84MDJfMTFfVEVBUl9JTU1FX0JBIGttYWxsb2MoKSBjYW4ndCBhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5XG4iKSk7CisJCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBCQSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IDo6IFJUX09JRF84MDJfMTFfVEVBUl9JTU1FX0JBKFRJRD0lZCwgYkFsbFRpZD0lZClcbiIsIHBCQS0+VElELCBwQkEtPmJBbGxUaWQpKTsKKworCQkJCQlpZiAoIXBCQS0+YkFsbFRpZCAmJiAocEJBLT5USUQgPiBOVU1fT0ZfVElEKSkKKwkJCQkJeworCQkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQlpZiAocEJBLT5Jc1JlY2lwaWVudCA9PSBGQUxTRSkKKwkJCQkJeworCQkJCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkYXB0ZXIsIHBCQS0+TUFDQWRkcik7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgcEJBLT5Jc1JlY2lwaWVudCA9PSBGQUxTRVxuIikpOworCQkJCQkJaWYgKHBFbnRyeSkKKwkJCQkJCXsKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgcEJBLT5wRW50cnlcbiIpKTsKKwkJCQkJCQlCQU9yaVNlc3Npb25UZWFyRG93bihwQWRhcHRlciwgcEVudHJ5LT5BaWQsIHBCQS0+VElELCBGQUxTRSwgVFJVRSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IDo6IE5vdCBmb3VuZCBwRW50cnkgXG4iKSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWRhcHRlciwgcEJBLT5NQUNBZGRyKTsKKwkJCQkJCWlmIChwRW50cnkpCisJCQkJCQl7CisJCQkJCQkJQkFSZWNTZXNzaW9uVGVhckRvd24oIHBBZGFwdGVyLCAoVUNIQVIpcEVudHJ5LT5BaWQsIHBCQS0+VElELCBUUlVFKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQgOjogTm90IGZvdW5kIHBFbnRyeSBcbiIpKTsKKwkJCQkJfQorCQkJCQlrZnJlZShwQkEpOworCQkJCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisgICAgICAgIC8vIEZvciBXUEFfU1VQUExJQ0FOVCB0byBzZXQgc3RhdGljIHdlcCBrZXkKKyAgICAJY2FzZSBPSURfODAyXzExX0FERF9XRVA6CisgICAgCSAgICBwV2VwS2V5ID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKworICAgIAkgICAgaWYocFdlcEtleSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FTk9NRU07CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9XRVAsIEZhaWxlZCEhXG4iKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwV2VwS2V5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgaWYgKFN0YXR1cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX1dFUCwgRmFpbGVkIChsZW5ndGggbWlzbWF0Y2gpISFcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKwkJICAgICAgICBLZXlJZHggPSBwV2VwS2V5LT5LZXlJbmRleCAmIDB4MGZmZmZmZmY7CisgICAgICAgICAgICAgICAgLy8gS2V5SWR4IG11c3QgYmUgMCB+IDMKKyAgICAgICAgICAgICAgICBpZiAoS2V5SWR4ID4gNCkKKyAgICAJCQl7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX1dFUCwgRmFpbGVkIChLZXlJZHggbXVzdCBiZSBzbWFsbGVyIHRoYW4gNCkhIVxuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBVQ0hBUiBDaXBoZXJBbGcgPSAwOworICAgICAgICAgICAgICAgICAgICBQVUNIQVIgS2V5OworCisgICAgICAgICAgICAgICAgICAgIC8vIHNldCBrZXkgbWF0ZXJpYWwgYW5kIGtleSBsZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleSwgMTYpOworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID0gKFVDSEFSKSBwV2VwS2V5LT5LZXlMZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXksICZwV2VwS2V5LT5LZXlNYXRlcmlhbCwgcFdlcEtleS0+S2V5TGVuZ3RoKTsKKworICAgICAgICAgICAgICAgICAgICBzd2l0Y2gocFdlcEtleS0+S2V5TGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX1dFUCwgb25seSBzdXBwb3J0IENJUEhFUl9XRVA2NChsZW46NSkgJiBDSVBIRVJfV0VQMTI4KGxlbjoxMykhIVxuIikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworICAgICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IGtleSBmb3IgdHggKHNoYXJlZCBrZXkpCisgICAgICAgICAgICAgICAgICAgIGlmIChwV2VwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApCisgICAgICAgICAgICAgICAgICAgIHsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQga2V5IG1hdGVyaWFsIGFuZCBrZXkgbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtLZXlJZHhdLktleSwgMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbS2V5SWR4XS5LZXlMZW4gPSAoVUNIQVIpIHBXZXBLZXktPktleUxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W0tleUlkeF0uS2V5LCAmcFdlcEtleS0+S2V5TWF0ZXJpYWwsIHBXZXBLZXktPktleUxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleUlkID0gS2V5SWR4OworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbS2V5SWR4XS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAoVUNIQVIpIEtleUlkeDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtleSA9IHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyB0byBBc2ljCisgICAgICAgIAkJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIEJTUzAsIEtleUlkeCwgQ2lwaGVyQWxnLCBLZXksIE5VTEwsIE5VTEwpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFdlcEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5ID0gJnBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBc3NpZ24gZ3JvdXAga2V5IGluZm8KKyAgICAJCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZGFwdGVyLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgTlVMTCk7CisgICAgCQkJCQkJLy8gQXNzaWduIHBhaXJ3aXNlIGtleSBpbmZvCisgICAgCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwgQlNTMCwgS2V5SWR4LCBDaXBoZXJBbGcsIHBFbnRyeSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9XRVAgKGlkPTB4JXgsIExlbj0lZC1ieXRlKSwgJXNcbiIsIHBXZXBLZXktPktleUluZGV4LCBwV2VwS2V5LT5LZXlMZW5ndGgsIChwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKSA/ICJQb3J0IFNlY3VyZWQiOiJQb3J0IE5PVCBTZWN1cmVkIikpOworCQkJCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtmcmVlKHBXZXBLZXkpOworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorCSAgICBjYXNlIE9JRF9TRVRfQ09VTlRFUk1FQVNVUkVTOgorICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoaW50KSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgZW5hYmxlZCA9IDA7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmVuYWJsZWQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKGVuYWJsZWQgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iQmxvY2tBc3NvYyA9IFRSVUU7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAvLyBXUEEgTUlDIGVycm9yIHNob3VsZCBibG9jayBhc3NvY2lhdGlvbiBhdHRlbXB0IGZvciA2MCBzZWNvbmRzCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYkJsb2NrQXNzb2MgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF9TRVRfQ09VTlRFUk1FQVNVUkVTIGJCbG9ja0Fzc29jPSVzXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLmJCbG9ja0Fzc29jID8gIlRSVUUiOiJGQUxTRSIpKTsKKyAgICAgICAgICAgIH0KKwkgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUOgorCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUNIQVIpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZ3cGFfc3VwcGxpY2FudF9lbmFibGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgCQkJcEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSB3cGFfc3VwcGxpY2FudF9lbmFibGU7CisgICAgCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAoPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVApKTsKKwkJCX0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfREVBVVRIRU5USUNBVElPTjoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QpKQorICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QgICAgICAqcEluZm87CisJCQkJTUxNRV9RVUVVRV9FTEVNICpNc2dFbGVtID0gKE1MTUVfUVVFVUVfRUxFTSAqKSBrbWFsbG9jKHNpemVvZihNTE1FX1FVRVVFX0VMRU0pLCBNRU1fQUxMT0NfRkxBRyk7CisKKyAgICAgICAgICAgICAgICBwSW5mbyA9IChNTE1FX0RFQVVUSF9SRVFfU1RSVUNUICopIE1zZ0VsZW0tPk1zZzsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwSW5mbywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBNbG1lRGVhdXRoUmVxQWN0aW9uKHBBZGFwdGVyLCBNc2dFbGVtKTsKKwkJCQlrZnJlZShNc2dFbGVtKTsKKworICAgICAgICAgICAgICAgIGlmIChJTkZSQV9PTihwQWRhcHRlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBMaW5rRG93bihwQWRhcHRlciwgRkFMU0UpOworICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0RFQVVUSEVOVElDQVRJT04gKFJlYXNvbj0lZClcbiIsIHBJbmZvLT5SZWFzb24pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfRFJPUF9VTkVOQ1JZUFRFRDoKKyAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKGludCkpCisgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGVuYWJsZWQgPSAwOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZlbmFibGVkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChlbmFibGVkID09IDEpCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCQkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkYXB0ZXItPk1hY1RhYkxvY2spOworCQkJCXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5Qb3J0U2VjdXJlZCA9IHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQ7CisJCQkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkYXB0ZXItPk1hY1RhYkxvY2spOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9EUk9QX1VORU5DUllQVEVEICg9JWQpXG4iLCBlbmFibGVkKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1NFVF9JRUVFODAyMVg6CisgICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihCT09MRUFOKSkKKyAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmSUVFRTgwMjF4U3RhdGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBJRUVFODAyMXhTdGF0ZTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfU0VUX0lFRUU4MDIxWCAoPSVkKVxuIiwgSUVFRTgwMjF4U3RhdGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfU0VUX0lFRUU4MDIxWF9SRVFVSVJFX0tFWToKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKEJPT0xFQU4pKQorCQkJCSBTdGF0dXMgID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMXhfcmVxdWlyZWRfa2V5cyA9IElFRUU4MDIxeF9yZXF1aXJlZF9rZXlzOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9TRVRfSUVFRTgwMjFYX1JFUVVJUkVfS0VZICglZClcbiIsIElFRUU4MDIxeF9yZXF1aXJlZF9rZXlzKSk7CisJCQl9CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1BNS0lEOgorCSAgICAgICAgcFBta0lkID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKKworCSAgICAgICAgaWYocFBta0lkID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocFBta0lkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCisJICAgICAgICAvLyBjaGVjayB0aGUgUE1LSUQgaW5mb3JtYXRpb24KKwkgICAgICAgIGlmIChwUG1rSWQtPkJTU0lESW5mb0NvdW50ID09IDApCisgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPlN0YUNmZy5TYXZlZFBNSywgc2l6ZW9mKEJTU0lEX0lORk8pKlBNS0lEX05PKTsKKwkgICAgICAgIGVsc2UKKwkgICAgICAgIHsKKwkJICAgICAgICBQQlNTSURfSU5GTwlwQnNzSWRJbmZvOworCQkgICAgICAgIFVJTlQJCUJzc0lkeDsKKwkJICAgICAgICBVSU5UCQlDYWNoZWRJZHg7CisKKwkJICAgICAgICBmb3IgKEJzc0lkeCA9IDA7IEJzc0lkeCA8IHBQbWtJZC0+QlNTSURJbmZvQ291bnQ7IEJzc0lkeCsrKQorCQkgICAgICAgIHsKKwkJCSAgICAgICAgLy8gcG9pbnQgdG8gdGhlIGluZGV4ZWQgQlNTSURfSU5GTyBzdHJ1Y3R1cmUKKwkJCSAgICAgICAgcEJzc0lkSW5mbyA9IChQQlNTSURfSU5GTykgKChQVUNIQVIpIHBQbWtJZCArIDIgKiBzaXplb2YoVUlOVCkgKyBCc3NJZHggKiBzaXplb2YoQlNTSURfSU5GTykpOworCQkJICAgICAgICAvLyBGaW5kIHRoZSBlbnRyeSBpbiB0aGUgc2F2ZWQgZGF0YSBiYXNlLgorCQkJICAgICAgICBmb3IgKENhY2hlZElkeCA9IDA7IENhY2hlZElkeCA8IHBBZGFwdGVyLT5TdGFDZmcuU2F2ZWRQTUtOdW07IENhY2hlZElkeCsrKQorCQkJICAgICAgICB7CisJCQkJICAgICAgICAvLyBjb21wYXJlIHRoZSBCU1NJRAorCQkJCSAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwQnNzSWRJbmZvLT5CU1NJRCwgcEFkYXB0ZXItPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELCBzaXplb2YoTkRJU184MDJfMTFfTUFDX0FERFJFU1MpKSkKKwkJCQkJICAgICAgICBicmVhazsKKwkJCSAgICAgICAgfQorCisJCQkgICAgICAgIC8vIEZvdW5kLCByZXBsYWNlIGl0CisJCQkgICAgICAgIGlmIChDYWNoZWRJZHggPCBQTUtJRF9OTykKKwkJCSAgICAgICAgeworCQkJCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlVwZGF0ZSBPSURfODAyXzExX1BNS0lELCBpZHggPSAlZFxuIiwgQ2FjaGVkSWR4KSk7CisJCQkJICAgICAgICBOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLCBwQnNzSWRJbmZvLCBzaXplb2YoQlNTSURfSU5GTykpOworCQkJCSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5TYXZlZFBNS051bSsrOworCQkJICAgICAgICB9CisJCQkgICAgICAgIC8vIE5vdCBmb3VuZCwgcmVwbGFjZSB0aGUgbGFzdCBvbmUKKwkJCSAgICAgICAgZWxzZQorCQkJICAgICAgICB7CisJCQkJICAgICAgICAvLyBSYW5kb21seSByZXBsYWNlIG9uZQorCQkJCSAgICAgICAgQ2FjaGVkSWR4ID0gKHBCc3NJZEluZm8tPkJTU0lEWzVdICUgUE1LSURfTk8pOworCQkJCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlVwZGF0ZSBPSURfODAyXzExX1BNS0lELCBpZHggPSAlZFxuIiwgQ2FjaGVkSWR4KSk7CisJCQkJICAgICAgICBOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLCBwQnNzSWRJbmZvLCBzaXplb2YoQlNTSURfSU5GTykpOworCQkJICAgICAgICB9CisJCSAgICAgICAgfQorCQkJfQorCQkJaWYocFBta0lkKQorCQkJCWtmcmVlKHBQbWtJZCk7CisJICAgICAgICBicmVhazsKKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKworCisjaWZkZWYgU05NUF9TVVBQT1JUCisJCWNhc2UgT0lEXzgwMl8xMV9TSE9SVFJFVFJZTElNSVQ6CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVTE9ORykpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmU2hvcnRSZXRyeUxpbWl0LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCAmdHhfcnR5X2NmZy53b3JkKTsKKwkJCQl0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UnR5TGltaXQgPSBTaG9ydFJldHJ5TGltaXQ7CisJCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCB0eF9ydHlfY2ZnLndvcmQpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9TSE9SVFJFVFJZTElNSVQgKHR4X3J0eV9jZmcuZmllbGQuU2hvcnRSZXRyeUxpbWl0PSVkLCBTaG9ydFJldHJ5TGltaXQ9JWxkKVxuIiwgdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJ0eUxpbWl0LCBTaG9ydFJldHJ5TGltaXQpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9MT05HUkVUUllMSU1JVDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9MT05HUkVUUllMSU1JVCBcbiIpKTsKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVMT05HKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJeworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZMb25nUmV0cnlMaW1pdCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7CisJCQkJdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQgPSBMb25nUmV0cnlMaW1pdDsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsIHR4X3J0eV9jZmcud29yZCk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0xPTkdSRVRSWUxJTUlUICh0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSZXRyeUxpbWl0PSAlZCxMb25nUmV0cnlMaW1pdD0lbGQpXG4iLCB0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdCwgTG9uZ1JldHJ5TGltaXQpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZVkFMVUU6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfV0VQREVGQVVMVEtFWVZBTFVFXG4iKSk7CisJCQlwS2V5ID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIEdGUF9LRVJORUwpOworCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIocEtleSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCS8vcEtleSA9ICZXZXBLZXk7CisKKwkJCWlmICggcEtleS0+TGVuZ3RoICE9IHdycS0+dS5kYXRhLmxlbmd0aCkKKwkJCXsKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZVkFMVUUsIEZhaWxlZCEhXG4iKSk7CisJCQl9CisJCQlLZXlJZHggPSBwS2V5LT5LZXlJbmRleCAmIDB4MGZmZmZmZmY7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoInBLZXktPktleUluZGV4ID0lZCwgcEtleS0+S2V5TGVuZ3RoPSVkXG4iLCBwS2V5LT5LZXlJbmRleCwgcEtleS0+S2V5TGVuZ3RoKSk7CisKKwkJCS8vIGl0IGlzIGEgc2hhcmVkIGtleQorCQkJaWYgKEtleUlkeCA+IDQpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4gPSAoVUNIQVIpIHBLZXktPktleUxlbmd0aDsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LCAmcEtleS0+S2V5TWF0ZXJpYWwsIHBLZXktPktleUxlbmd0aCk7CisJCQkJaWYgKHBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkKKwkJCQl7CisJCQkJCS8vIERlZmF1bHQga2V5IGZvciB0eCAoc2hhcmVkIGtleSkKKwkJCQkJcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAoVUNIQVIpIEtleUlkeDsKKwkJCQl9CisJCQkJLy9SZXN0YXJ0QVBJc1JlcXVpcmVkID0gVFJVRTsKKwkJCX0KKwkJCWJyZWFrOworCisKKwkJY2FzZSBPSURfODAyXzExX1dFUERFRkFVTFRLRVlJRDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZSUQgXG4iKSk7CisKKwkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVDSEFSKSkKKwkJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJZWxzZQorCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKworCQkJYnJlYWs7CisKKworCQljYXNlIE9JRF84MDJfMTFfQ1VSUkVOVENIQU5ORUw6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQ1VSUkVOVENIQU5ORUwgXG4iKSk7CisJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVQ0hBUikpCisJCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCXsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmY3RtcCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlzcHJpbnRmKCZjdG1wLCIlZCIsIGN0bXApOworCQkJCVNldF9DaGFubmVsX1Byb2MocEFkYXB0ZXIsICZjdG1wKTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmCisKKworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OnVua25vd24gSU9DVEwncyBzdWJjbWQgPSAweCUwOHhcbiIsIGNtZCkpOworICAgICAgICAgICAgU3RhdHVzID0gLUVPUE5PVFNVUFA7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKworICAgIHJldHVybiBTdGF0dXM7Cit9CisKK0lOVCBSVE1QUXVlcnlJbmZvcm1hdGlvbigKKyAgICBJTiAgUFJUTVBfQURBUFRFUiBwQWRhcHRlciwKKyAgICBJTiAgT1VUIHN0cnVjdCBpZnJlcSAgICAqcnEsCisgICAgSU4gIElOVCAgICAgICAgICAgICAgICAgY21kKQoreworICAgIHN0cnVjdCBpd3JlcSAgICAgICAgICAgICAgICAgICAgICAgICp3cnEgPSAoc3RydWN0IGl3cmVxICopIHJxOworICAgIE5ESVNfODAyXzExX0JTU0lEX0xJU1RfRVggICAgICAgICAgICpwQnNzaWRMaXN0ID0gTlVMTDsKKyAgICBQTkRJU19XTEFOX0JTU0lEX0VYICAgICAgICAgICAgICAgICBwQnNzOworICAgIE5ESVNfODAyXzExX1NTSUQgICAgICAgICAgICAgICAgICAgIFNzaWQ7CisgICAgTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiAgICAgICAgICAgKnBDb25maWd1cmF0aW9uID0gTlVMTDsKKyAgICBSVF84MDJfMTFfTElOS19TVEFUVVMgICAgICAgICAgICAgICAqcExpbmtTdGF0dXMgPSBOVUxMOworICAgIFJUXzgwMl8xMV9TVEFfQ09ORklHICAgICAgICAgICAgICAgICpwU3RhQ29uZmlnID0gTlVMTDsKKyAgICBORElTXzgwMl8xMV9TVEFUSVNUSUNTICAgICAgICAgICAgICAqcFN0YXRpc3RpY3MgPSBOVUxMOworICAgIE5ESVNfODAyXzExX1JUU19USFJFU0hPTEQgICAgICAgICAgIFJ0c1RocmVzaDsKKyAgICBORElTXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCBGcmFnVGhyZXNoOworICAgIE5ESVNfODAyXzExX1BPV0VSX01PREUgICAgICAgICAgICAgIFBvd2VyTW9kZTsKKyAgICBORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFICBCc3NUeXBlOworICAgIFJUXzgwMl8xMV9QUkVBTUJMRSAgICAgICAgICAgICAgICAgIFByZWFtVHlwZTsKKyAgICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFICAgICBBdXRoTW9kZTsKKyAgICBORElTXzgwMl8xMV9XRVBfU1RBVFVTICAgICAgICAgICAgICBXZXBTdGF0dXM7CisgICAgTkRJU19NRURJQV9TVEFURSAgICAgICAgICAgICAgICAgICAgTWVkaWFTdGF0ZTsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCc3NCdWZTaXplLCB1bEluZm89MCwgTmV0d29ya1R5cGVMaXN0WzRdLCBhcHNkID0gMDsKKyAgICBVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCc3NMZW4gPSAwOworICAgIFBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdWYgPSBOVUxMLCBwUHRyOworICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VfdmVyc2lvbl9jb21waWxlZDsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBQYWRkaW5nID0gMDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWRpb1N0YXRlOworCVVDSEFSCWRyaXZlclZlcnNpb25bOF07CisgICAgT0lEX1NFVF9IVF9QSFlNT0RFCQkJICAgICAgICAqcEhUUGh5TW9kZSA9IE5VTEw7CisKKworI2lmZGVmIFNOTVBfU1VQUE9SVAorCS8vZm9yIHNubXAsIGthdGh5CisJRGVmYXVsdEtleUlkeFZhbHVlCQkJKnBLZXlJZHhWYWx1ZTsKKwlJTlQJCQkJCQkJdmFsdWVMZW47CisJVFhfUlRZX0NGR19TVFJVQwkJCXR4X3J0eV9jZmc7CisJVUxPTkcJCQkJCQlTaG9ydFJldHJ5TGltaXQsIExvbmdSZXRyeUxpbWl0OworCVVDSEFSCQkJCQkJdG1wWzY0XTsKKyNlbmRpZiAvL1NOTVAKKworICAgIHN3aXRjaChjbWQpCisgICAgeworICAgICAgICBjYXNlIFJUX09JRF9ERVZJQ0VfTkFNRToKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihTVEFfTklDX0RFVklDRV9OQU1FKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBTVEFfTklDX0RFVklDRV9OQU1FLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEX1ZFUlNJT05fSU5GTzoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfVkVSU0lPTl9JTkZPIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gOCpzaXplb2YoVUNIQVIpOworCQkJc3ByaW50ZigmZHJpdmVyVmVyc2lvblswXSwgIiVzIiwgU1RBX0RSSVZFUl9WRVJTSU9OKTsKKwkJCWRyaXZlclZlcnNpb25bN10gPSAnXDAnOworCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmZHJpdmVyVmVyc2lvbiwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKwkJCQlTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgUkFMSU5LX0FURQorCQljYXNlIFJUX1FVRVJZX0FURV9UWERPTkVfQ09VTlQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfUVVFUllfQVRFX1RYRE9ORV9DT1VOVCBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVSU5UMzIpOworCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPmF0ZS5UeERvbmVDb3VudCwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKwkJCXsKKwkJCQlTdGF0dXMgPSAtRUZBVUxUOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQlNTSURfTElTVDoKKyAgICAgICAgICAgIGlmIChSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAJLyoKKyAgICAgICAgICAgIAkgKiBTdGlsbCBzY2FubmluZywgaW5kaWNhdGUgdGhlIGNhbGxlciBzaG91bGQgdHJ5IGFnYWluLgorICAgICAgICAgICAgCSAqLworICAgICAgICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0JTU0lEX0xJU1QgKFN0aWxsIHNjYW5uaW5nKVxuIikpOworCQkJCXJldHVybiAtRUFHQUlOOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQlNTSURfTElTVCAoJWQgQlNTIHJldHVybmVkKVxuIixwQWRhcHRlci0+U2NhblRhYi5Cc3NOcikpOworCQkJcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7CisgICAgICAgICAgICAvLyBDbGFjdWxhdGUgdG90YWwgYnVmZmVyIHNpemUgcmVxdWlyZWQKKyAgICAgICAgICAgIEJzc0J1ZlNpemUgPSBzaXplb2YoVUxPTkcpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnI7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBBbGlnbiBwb2ludGVyIHRvIDQgYnl0ZXMgYm91bmRhcnkuCisgICAgICAgICAgICAgICAgLy9QYWRkaW5nID0gNCAtIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbiAmIDB4MDAwMyk7CisgICAgICAgICAgICAgICAgLy9pZiAoUGFkZGluZyA9PSA0KQorICAgICAgICAgICAgICAgIC8vICAgIFBhZGRpbmcgPSAwOworICAgICAgICAgICAgICAgIEJzc0J1ZlNpemUgKz0gKHNpemVvZihORElTX1dMQU5fQlNTSURfRVgpIC0gMSArIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpICsgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4gKyBQYWRkaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRm9yIHNhZmV0eSBpc3N1ZSwgd2UgYWRkIDI1NiBieXRlcyBqdXN0IGluIGNhc2UKKyAgICAgICAgICAgIEJzc0J1ZlNpemUgKz0gMjU2OworICAgICAgICAgICAgLy8gQWxsb2NhdGUgdGhlIHNhbWUgc2l6ZSBhcyBwYXNzZWQgZnJvbSBoaWdoZXIgbGF5ZXIKKyAgICAgICAgICAgIHBCdWYgPSBrbWFsbG9jKEJzc0J1ZlNpemUsIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmKHBCdWYgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSW5pdCA4MDJfMTFfQlNTSURfTElTVF9FWCBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBCdWYsIEJzc0J1ZlNpemUpOworICAgICAgICAgICAgcEJzc2lkTGlzdCA9IChQTkRJU184MDJfMTFfQlNTSURfTElTVF9FWCkgcEJ1ZjsKKyAgICAgICAgICAgIHBCc3NpZExpc3QtPk51bWJlck9mSXRlbXMgPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NOcjsKKworICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRvdGFsIGJ1ZmZlciBsZW5ndGgKKyAgICAgICAgICAgIEJzc0xlbiA9IDQ7IC8vIENvbnNpc3Qgb2YgTnVtYmVyT2ZJdGVtcworICAgICAgICAgICAgLy8gUG9pbnQgdG8gc3RhcnQgb2YgTkRJU19XTEFOX0JTU0lEX0VYCisgICAgICAgICAgICAvLyBwUHRyID0gcEJ1ZiArIHNpemVvZihVTE9ORyk7CisgICAgICAgICAgICBwUHRyID0gKFBVQ0hBUikgJnBCc3NpZExpc3QtPkJzc2lkWzBdOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEJzcyA9IChQTkRJU19XTEFOX0JTU0lEX0VYKSBwUHRyOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5NYWNBZGRyZXNzLCAmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWQsIE1BQ19BRERSX0xFTik7CisgICAgICAgICAgICAgICAgaWYgKChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5IaWRkZW4gPT0gMSkgJiYgKHBBZGFwdGVyLT5TdGFDZmcuYlNob3dIaWRkZW5TU0lEID09IEZBTFNFKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vCisJCQkJCS8vIFdlIG11c3QgcmV0dXJuIHRoaXMgU1NJRCBkdXJpbmcgNHdheSBoYW5kc2hha2luZywgb3RoZXJ3aXNlIEFlZ2lzIHdpbGwgZmFpbGVkIHRvIHBhcnNlIFdQQSBpbmZvbWF0aW9uCisJCQkJCS8vIGFuZCB0aGVuIGZhaWxlZCB0byBzZW5kIEVBUE9sIGZhcmFtZS4KKwkJCQkJLy8KKwkJCQkJaWYgKChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgJiYgKHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgIT0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQpKQorCQkJCQl7CisJCQkJCQlwQnNzLT5Tc2lkLlNzaWRMZW5ndGggPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuOworCQkJCQkJTmRpc01vdmVNZW1vcnkocEJzcy0+U3NpZC5Tc2lkLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuKTsKKwkJCQkJfQorCQkJCQllbHNlCisgICAgICAgICAgICAgICAgICAgIAlwQnNzLT5Tc2lkLlNzaWRMZW5ndGggPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQnNzLT5Tc2lkLlNzaWRMZW5ndGggPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuOworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5Tc2lkLlNzaWQsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWQsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWRMZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwQnNzLT5Qcml2YWN5ID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUHJpdmFjeTsKKyAgICAgICAgICAgICAgICBwQnNzLT5Sc3NpID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNzaSAtIHBBZGFwdGVyLT5CYnBSc3NpVG9EYm1EZWx0YTsKKyAgICAgICAgICAgICAgICBwQnNzLT5OZXR3b3JrVHlwZUluVXNlID0gTmV0d29ya1R5cGVJblVzZVNhbml0eSgmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0pOworICAgICAgICAgICAgICAgIHBCc3MtPkNvbmZpZ3VyYXRpb24uTGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04pOworICAgICAgICAgICAgICAgIHBCc3MtPkNvbmZpZ3VyYXRpb24uQmVhY29uUGVyaW9kID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQmVhY29uUGVyaW9kOworICAgICAgICAgICAgICAgIHBCc3MtPkNvbmZpZ3VyYXRpb24uQVRJTVdpbmRvdyA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkF0aW1XaW47CisKKyAgICAgICAgICAgICAgICBNQVBfQ0hBTk5FTF9JRF9UT19LSFoocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQ2hhbm5lbCwgcEJzcy0+Q29uZmlndXJhdGlvbi5EU0NvbmZpZyk7CisKKyAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzVHlwZSA9PSBCU1NfSU5GUkEpCisgICAgICAgICAgICAgICAgICAgIHBCc3MtPkluZnJhc3RydWN0dXJlTW9kZSA9IE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHBCc3MtPkluZnJhc3RydWN0dXJlTW9kZSA9IE5kaXM4MDJfMTFJQlNTOworCisgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEJzcy0+U3VwcG9ydGVkUmF0ZXMsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGUsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGVMZW4pOworICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBCc3MtPlN1cHBvcnRlZFJhdGVzICsgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5FeHRSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkV4dFJhdGVMZW4pOworCisgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwQnNzLT5JRUxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpOworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5JRXMsICZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5GaXhJRXMsIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpKTsKKyAgICAgICAgICAgICAgICAgICAgcFB0ciA9IHBQdHIgKyBzaXplb2YoTkRJU19XTEFOX0JTU0lEX0VYKSAtIDEgKyBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEJzcy0+SUVMZW5ndGggPSAoVUxPTkcpKHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpICsgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4pOworICAgICAgICAgICAgICAgICAgICBwUHRyID0gcFB0ciArIHNpemVvZihORElTX1dMQU5fQlNTSURfRVgpIC0gMSArIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpOworICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5JRXMsICZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5GaXhJRXMsIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpKTsKKyAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEJzcy0+SUVzICsgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcyksIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFcywgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4pOworICAgICAgICAgICAgICAgICAgICBwUHRyICs9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwQnNzLT5MZW5ndGggPSAoVUxPTkcpKHNpemVvZihORElTX1dMQU5fQlNTSURfRVgpIC0gMSArIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpICsgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4gKyBQYWRkaW5nKTsKKworI2lmIFdJUkVMRVNTX0VYVCA8IDE3CisgICAgICAgICAgICAgICAgaWYgKChCc3NMZW4gKyBwQnNzLT5MZW5ndGgpIDwgd3JxLT51LmRhdGEubGVuZ3RoKQorICAgICAgICAgICAgICAgIEJzc0xlbiArPSBwQnNzLT5MZW5ndGg7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEJzc2lkTGlzdC0+TnVtYmVyT2ZJdGVtcyA9IGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgICAgQnNzTGVuICs9IHBCc3MtPkxlbmd0aDsKKyNlbmRpZgorICAgICAgICAgICAgfQorCisjaWYgV0lSRUxFU1NfRVhUIDwgMTcKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IEJzc0xlbjsKKyNlbHNlCisgICAgICAgICAgICBpZiAoQnNzTGVuID4gd3JxLT51LmRhdGEubGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGtmcmVlKHBCc3NpZExpc3QpOworICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gQnNzTGVuOworI2VuZGlmCisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcEJzc2lkTGlzdCwgQnNzTGVuKTsKKyAgICAgICAgICAgIGtmcmVlKHBCc3NpZExpc3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8zX0NVUlJFTlRfQUREUkVTUzoKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IE1BQ19BRERSX0xFTjsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkN1cnJlbnRBZGRyZXNzLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEX0dFTl9NRURJQV9DT05ORUNUX1NUQVRVUzoKKyAgICAgICAgICAgIGlmIChwQWRhcHRlci0+SW5kaWNhdGVNZWRpYVN0YXRlID09IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkKQorICAgICAgICAgICAgICAgIE1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7CisKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihORElTX01FRElBX1NUQVRFKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmTWVkaWFTdGF0ZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQlNTSUQ6CisjaWZkZWYgUkFMSU5LX0FURQorCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCisJCQl7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVGhlIGRyaXZlciBpcyBpbiBBVEUgbW9kZSBub3dcbiIpKTsKKwkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7CisJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworICAgICAgICAgICAgaWYgKElORlJBX09OKHBBZGFwdGVyKSB8fCBBREhPQ19PTihwQWRhcHRlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLkJzc2lkLCBzaXplb2YoTkRJU184MDJfMTFfTUFDX0FERFJFU1MpKTsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0JTU0lEKD1FTVBUWSlcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PVENPTk47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1NTSUQ6CisJCQlOZGlzWmVyb01lbW9yeSgmU3NpZCwgc2l6ZW9mKE5ESVNfODAyXzExX1NTSUQpKTsKKwkJCU5kaXNaZXJvTWVtb3J5KFNzaWQuU3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKKyAgICAgICAgICAgIFNzaWQuU3NpZExlbmd0aCA9IHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbjsKKwkJCW1lbWNweShTc2lkLlNzaWQsIHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZCwJU3NpZC5Tc2lkTGVuZ3RoKTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9TU0lEKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmU3NpZCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1NTSUQgKExlbj0lZCwgc3NpZD0lcylcbiIsIFNzaWQuU3NpZExlbmd0aCxTc2lkLlNzaWQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfTElOS19TVEFUVVM6CisgICAgICAgICAgICBwTGlua1N0YXR1cyA9IChSVF84MDJfMTFfTElOS19TVEFUVVMgKikga21hbGxvYyhzaXplb2YoUlRfODAyXzExX0xJTktfU1RBVFVTKSwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYgKHBMaW5rU3RhdHVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBMaW5rU3RhdHVzLT5DdXJyVHhSYXRlID0gUmF0ZUlkVG81MDBLYnBzW3BBZGFwdGVyLT5Db21tb25DZmcuVHhSYXRlXTsgICAvLyB1bml0IDogNTAwIGticHMKKyAgICAgICAgICAgICAgICBwTGlua1N0YXR1cy0+Q2hhbm5lbFF1YWxpdHkgPSBwQWRhcHRlci0+TWxtZS5DaGFubmVsUXVhbGl0eTsKKyAgICAgICAgICAgICAgICBwTGlua1N0YXR1cy0+UnhCeXRlQ291bnQgPSBwQWRhcHRlci0+UmFsaW5rQ291bnRlcnMuUmVjZWl2ZWRCeXRlQ291bnQ7CisgICAgICAgICAgICAgICAgcExpbmtTdGF0dXMtPlR4Qnl0ZUNvdW50ID0gcEFkYXB0ZXItPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQnl0ZUNvdW50OworICAgICAgICAJCXBMaW5rU3RhdHVzLT5DZW50cmFsQ2hhbm5lbCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWw7CisgICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJUXzgwMl8xMV9MSU5LX1NUQVRVUyk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBMaW5rU3RhdHVzLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGtmcmVlKHBMaW5rU3RhdHVzKTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9MSU5LX1NUQVRVU1xuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0xJTktfU1RBVFVTKGttYWxsb2MgZmFpbGVkKVxuIikpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0NPTkZJR1VSQVRJT046CisgICAgICAgICAgICBwQ29uZmlndXJhdGlvbiA9IChORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OICopIGttYWxsb2Moc2l6ZW9mKE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04pLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZiAocENvbmZpZ3VyYXRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcENvbmZpZ3VyYXRpb24tPkxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OKTsKKyAgICAgICAgICAgICAgICBwQ29uZmlndXJhdGlvbi0+QmVhY29uUGVyaW9kID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5CZWFjb25QZXJpb2Q7CisgICAgICAgICAgICAgICAgcENvbmZpZ3VyYXRpb24tPkFUSU1XaW5kb3cgPSBwQWRhcHRlci0+U3RhQWN0aXZlLkF0aW1XaW47CisgICAgICAgICAgICAgICAgTUFQX0NIQU5ORUxfSURfVE9fS0haKHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCwgcENvbmZpZ3VyYXRpb24tPkRTQ29uZmlnKTsKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfQ09ORklHVVJBVElPTik7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBDb25maWd1cmF0aW9uLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0NPTkZJR1VSQVRJT04oQmVhY29uUGVyaW9kPSVsZCxBdGltVz0lbGQsQ2hhbm5lbD0lZCkgXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb25maWd1cmF0aW9uLT5CZWFjb25QZXJpb2QsIHBDb25maWd1cmF0aW9uLT5BVElNV2luZG93LCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJCQlrZnJlZShwQ29uZmlndXJhdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQ09ORklHVVJBVElPTihrbWFsbG9jIGZhaWxlZClcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9TTlJfMDoKKwkJCWlmICgocEFkYXB0ZXItPlN0YUNmZy5MYXN0U05SMCA+IDApKQorCQkJeworCQkJCXVsSW5mbyA9ICgoMHhlYgktIHBBZGFwdGVyLT5TdGFDZmcuTGFzdFNOUjApICogMykgLwkxNiA7CisJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sCXdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfU05SXzAoMHg9JWx4KVxuIiwgdWxJbmZvKSk7CisJCQl9CisgICAgICAgICAgICBlbHNlCisJCQkgICAgU3RhdHVzID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfU05SXzE6CisJCQlpZiAoKHBBZGFwdGVyLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aAk+IDEpICYmCisgICAgICAgICAgICAgICAgKHBBZGFwdGVyLT5TdGFDZmcuTGFzdFNOUjEgPiAwKSkKKwkJCXsKKwkJCQl1bEluZm8gPSAoKDB4ZWIJLSBwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTTlIxKSAqIDMpIC8JMTYgOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUXVlcnk6OlJUX09JRF84MDJfMTFfU05SXzEoMHg9JWx4KVxuIix1bEluZm8pKTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TTlJfMShwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTTlIxPSVkKVxuIixwQWRhcHRlci0+U3RhQ2ZnLkxhc3RTTlIxKSk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX1JTU0lfVFJJR0dFUjoKKyAgICAgICAgICAgIHVsSW5mbyA9IHBBZGFwdGVyLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAgLSBwQWRhcHRlci0+QmJwUnNzaVRvRGJtRGVsdGE7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfUlNTSV9UUklHR0VSKD0lbGQpXG4iLCB1bEluZm8pKTsKKyAgICAgICAgICAgIGJyZWFrOworCQljYXNlIE9JRF84MDJfMTFfUlNTSToKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1JTU0k6CisJCQl1bEluZm8gPSBwQWRhcHRlci0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywJd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfUlNTSV8xOgorICAgICAgICAgICAgdWxJbmZvID0gcEFkYXB0ZXItPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sCXdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1JTU0lfMjoKKyAgICAgICAgICAgIHVsSW5mbyA9IHBBZGFwdGVyLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTI7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9TVEFUSVNUSUNTOgorICAgICAgICAgICAgcFN0YXRpc3RpY3MgPSAoTkRJU184MDJfMTFfU1RBVElTVElDUyAqKSBrbWFsbG9jKHNpemVvZihORElTXzgwMl8xMV9TVEFUSVNUSUNTKSwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYgKHBTdGF0aXN0aWNzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1NUQVRJU1RJQ1MgXG4iKSk7CisgICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBtb3N0IHVwLXRvLWRhdGUgaC93IHJhdyBjb3VudGVycyBpbnRvIHNvZnR3YXJlIGNvdW50ZXJzCisJCQkgICAgTklDVXBkYXRlUmF3Q291bnRlcnMocEFkYXB0ZXIpOworCisgICAgICAgICAgICAgICAgLy8gU2FuaXR5IGNoZWNrIGZvciBjYWxjdWxhdGlvbiBvZiBzdWNlc3NmdWwgY291bnQKKyAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQgPCBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQuUXVhZFBhcnQpCisgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5SZXRyeUNvdW50LlF1YWRQYXJ0OworCisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5NdWx0aWNhc3RUcmFuc21pdHRlZEZyYW1lQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLk11bHRpY2FzdFRyYW5zbWl0dGVkRnJhbWVDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+RmFpbGVkQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkZhaWxlZENvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5SZXRyeUNvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5SZXRyeUNvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5NdWx0aXBsZVJldHJ5Q291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLk11bHRpcGxlUmV0cnlDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+UlRTU3VjY2Vzc0NvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5SVFNTdWNjZXNzQ291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPlJUU0ZhaWx1cmVDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUlRTRmFpbHVyZUNvdW50LlF1YWRQYXJ0OworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5BQ0tGYWlsdXJlQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkFDS0ZhaWx1cmVDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+RnJhbWVEdXBsaWNhdGVDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuRnJhbWVEdXBsaWNhdGVDb3VudC5RdWFkUGFydDsKKyAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+UmVjZWl2ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5SZWNlaXZlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPk11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudC5RdWFkUGFydCA9IHBBZGFwdGVyLT5XbGFuQ291bnRlcnMuTXVsdGljYXN0UmVjZWl2ZWRGcmFtZUNvdW50LlF1YWRQYXJ0OworI2lmZGVmIERCRworICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5GQ1NFcnJvckNvdW50ID0gcEFkYXB0ZXItPlJhbGlua0NvdW50ZXJzLlJlYWxGY3NFcnJDb3VudDsKKyNlbHNlCisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPkZDU0Vycm9yQ291bnQuUXVhZFBhcnQgPSBwQWRhcHRlci0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQuUXVhZFBhcnQ7CisgICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPkZyYW1lRHVwbGljYXRlQ291bnQudS5Mb3dQYXJ0ID0gcEFkYXB0ZXItPldsYW5Db3VudGVycy5GcmFtZUR1cGxpY2F0ZUNvdW50LnUuTG93UGFydCAvIDEwMDsKKyNlbmRpZgorICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9TVEFUSVNUSUNTKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcFN0YXRpc3RpY3MsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAga2ZyZWUocFN0YXRpc3RpY3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1NUQVRJU1RJQ1Moa21hbGxvYyBmYWlsZWQpXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF9HRU5fUkNWX09LOgorICAgICAgICAgICAgdWxJbmZvID0gcEFkYXB0ZXItPkNvdW50ZXJzODAyMy5Hb29kUmVjZWl2ZXM7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEX0dFTl9SQ1ZfTk9fQlVGRkVSOgorICAgICAgICAgICAgdWxJbmZvID0gcEFkYXB0ZXItPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUEhZX01PREU6CisgICAgICAgICAgICB1bEluZm8gPSAoVUxPTkcpcEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1BIWV9NT0RFICg9JWxkKVxuIiwgdWxJbmZvKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1NUQV9DT05GSUc6CisgICAgICAgICAgICBwU3RhQ29uZmlnID0gKFJUXzgwMl8xMV9TVEFfQ09ORklHICopIGttYWxsb2Moc2l6ZW9mKFJUXzgwMl8xMV9TVEFfQ09ORklHKSwgTUVNX0FMTE9DX0ZMQUcpOworICAgICAgICAgICAgaWYgKHBTdGFDb25maWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfU1RBX0NPTkZJR1xuIikpOworICAgICAgICAgICAgICAgIHBTdGFDb25maWctPkVuYWJsZVR4QnVyc3QgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0OworICAgICAgICAgICAgICAgIHBTdGFDb25maWctPkVuYWJsZVR1cmJvUmF0ZSA9IDA7CisgICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+VXNlQkdQcm90ZWN0aW9uID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb247CisgICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+VXNlU2hvcnRTbG90VGltZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWU7CisgICAgICAgICAgICAgICAgLy9wU3RhQ29uZmlnLT5BZGhvY01vZGUgPSBwQWRhcHRlci0+U3RhQ2ZnLkFkaG9jTW9kZTsKKyAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5Id1JhZGlvU3RhdHVzID0gKHBBZGFwdGVyLT5TdGFDZmcuYkh3UmFkaW8gPT0gVFJVRSkgPyAxIDogMDsKKyAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5Sc3YxID0gMDsKKyAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5TeXN0ZW1FcnJvckJpdG1hcCA9IHBBZGFwdGVyLT5TeXN0ZW1FcnJvckJpdG1hcDsKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUlRfODAyXzExX1NUQV9DT05GSUcpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwU3RhQ29uZmlnLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIGtmcmVlKHBTdGFDb25maWcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1NUQV9DT05GSUcoa21hbGxvYyBmYWlsZWQpXG4iKSk7CisgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIFJ0c1RocmVzaCA9IHBBZGFwdGVyLT5Db21tb25DZmcuUnRzVGhyZXNob2xkOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJ0c1RocmVzaCk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJlJ0c1RocmVzaCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1JUU19USFJFU0hPTEQoPSVsZClcbiIsIFJ0c1RocmVzaCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIEZyYWdUaHJlc2ggPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkOworICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9PSBUUlVFKQorICAgICAgICAgICAgICAgIEZyYWdUaHJlc2ggPSAwOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKEZyYWdUaHJlc2gpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZGcmFnVGhyZXNoLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQoPSVsZClcbiIsIEZyYWdUaHJlc2gpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfUE9XRVJfTU9ERToKKyAgICAgICAgICAgIFBvd2VyTW9kZSA9IHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihQb3dlck1vZGUpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZQb3dlck1vZGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9QT1dFUl9NT0RFKD0lZClcbiIsIFBvd2VyTW9kZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9SQURJTzoKKyAgICAgICAgICAgIFJhZGlvU3RhdGUgPSAoQk9PTEVBTikgcEFkYXB0ZXItPlN0YUNmZy5iU3dSYWRpbzsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSYWRpb1N0YXRlKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmUmFkaW9TdGF0ZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX1JBRElPICg9JWQpXG4iLCBSYWRpb1N0YXRlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREU6CisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKKyAgICAgICAgICAgICAgICBCc3NUeXBlID0gTmRpczgwMl8xMUlCU1M7CisgICAgICAgICAgICBlbHNlIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0lORlJBKQorICAgICAgICAgICAgICAgIEJzc1R5cGUgPSBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmU7CisgICAgICAgICAgICBlbHNlIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX01PTklUT1IpCisgICAgICAgICAgICAgICAgQnNzVHlwZSA9IE5kaXM4MDJfMTFNb25pdG9yOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEJzc1R5cGUgPSBOZGlzODAyXzExQXV0b1Vua25vd247CisKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihCc3NUeXBlKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmQnNzVHlwZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREUoPSVkKVxuIiwgQnNzVHlwZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9QUkVBTUJMRToKKyAgICAgICAgICAgIFByZWFtVHlwZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuVHhQcmVhbWJsZTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihQcmVhbVR5cGUpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZQcmVhbVR5cGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9QUkVBTUJMRSg9JWQpXG4iLCBQcmVhbVR5cGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERToKKyAgICAgICAgICAgIEF1dGhNb2RlID0gcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZTsKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihBdXRoTW9kZSk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJkF1dGhNb2RlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSg9JWQpXG4iLCBBdXRoTW9kZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9XRVBfU1RBVFVTOgorICAgICAgICAgICAgV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoV2VwU3RhdHVzKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmV2VwU3RhdHVzLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfV0VQX1NUQVRVUyg9JWQpXG4iLCBXZXBTdGF0dXMpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUw6CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTCAleFxuIixwQWRhcHRlci0+Q29tbW9uQ2ZnLlR4UG93ZXIpKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUxfMToKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTF8xICg9JWxkKVxuIiwgcEFkYXB0ZXItPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSkpOworCQkJYnJlYWs7CisgICAgICAgIGNhc2UgT0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVTX1NVUFBPUlRFRDoKKwkJCWlmICgocEFkYXB0ZXItPlJmSWNUeXBlCT09IFJGSUNfMjg1MCkgfHwgKHBBZGFwdGVyLT5SZkljVHlwZSA9PQlSRklDXzI3NTApKQorCQkJeworCQkJCU5ldHdvcmtUeXBlTGlzdFswXSA9IDM7ICAgICAgICAgICAgICAgICAvLyBOdW1iZXJPZkl0ZW1zID0gMworCQkJCU5ldHdvcmtUeXBlTGlzdFsxXSA9IE5kaXM4MDJfMTFEUzsgICAgICAvLyBOZXR3b3JrVHlwZVsxXSA9IDExYgorCQkJCU5ldHdvcmtUeXBlTGlzdFsyXSA9IE5kaXM4MDJfMTFPRkRNMjQ7ICAvLyBOZXR3b3JrVHlwZVsyXSA9IDExZworCQkJCU5ldHdvcmtUeXBlTGlzdFszXSA9IE5kaXM4MDJfMTFPRkRNNTsgICAvLyBOZXR3b3JrVHlwZVszXSA9IDExYQorICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IDE2OworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmTmV0d29ya1R5cGVMaXN0WzBdLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCU5ldHdvcmtUeXBlTGlzdFswXSA9IDI7ICAgICAgICAgICAgICAgICAvLyBOdW1iZXJPZkl0ZW1zID0gMgorCQkJCU5ldHdvcmtUeXBlTGlzdFsxXSA9IE5kaXM4MDJfMTFEUzsgICAgICAvLyBOZXR3b3JrVHlwZVsxXSA9IDExYgorCQkJCU5ldHdvcmtUeXBlTGlzdFsyXSA9IE5kaXM4MDJfMTFPRkRNMjQ7ICAvLyBOZXR3b3JrVHlwZVsyXSA9IDExZworCQkJICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IDEyOworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmTmV0d29ya1R5cGVMaXN0WzBdLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJfQorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfTkVUV09SS19UWVBFU19TVVBQT1JURURcbiIpKTsKKwkJCQlicmVhazsKKwkgICAgY2FzZSBPSURfODAyXzExX05FVFdPUktfVFlQRV9JTl9VU0U6CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBKQorCQkJCXVsSW5mbyA9IE5kaXM4MDJfMTFPRkRNNTsKKwkJCWVsc2UgaWYgKChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQkdfTUlYRUQpIHx8IChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExRykpCisJCQkJdWxJbmZvID0gTmRpczgwMl8xMU9GRE0yNDsKKwkJCWVsc2UKKwkJCQl1bEluZm8gPSBOZGlzODAyXzExRFM7CisgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfTEFTVF9SWF9SQVRFOgorICAgICAgICAgICAgdWxJbmZvID0gKFVMT05HKXBBZGFwdGVyLT5MYXN0UnhSYXRlOworICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfUlhfUkFURSAoPSVsZClcbiIsIHVsSW5mbykpOworCQkJYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9MQVNUX1RYX1JBVEU6CisJCQkvL3VsSW5mbyA9IChVTE9ORylwQWRhcHRlci0+TGFzdFR4UmF0ZTsKKwkJCXVsSW5mbyA9IChVTE9ORylwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQ7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfTEFTVF9UWF9SQVRFICg9JWx4KVxuIiwgdWxJbmZvKSk7CisJCQlicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0VFUFJPTV9WRVJTSU9OOgorICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkVlcHJvbVZlcnNpb24sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0ZJUk1XQVJFX1ZFUlNJT046CisgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+RmlybXdhcmVWZXJzaW9uLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisJICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9OT0lTRV9MRVZFTDoKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5CYnBXcml0ZUxhdGNoWzY2XSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX05PSVNFX0xFVkVMICg9JWQpXG4iLCBwQWRhcHRlci0+QmJwV3JpdGVMYXRjaFs2Nl0pKTsKKwkJCWJyZWFrOworCSAgICBjYXNlIFJUX09JRF84MDJfMTFfRVhUUkFfSU5GTzoKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5FeHRyYUluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9FWFRSQV9JTkZPICg9JWxkKVxuIiwgcEFkYXB0ZXItPkV4dHJhSW5mbykpOworCSAgICAgICAgYnJlYWs7CisJICAgIGNhc2UgUlRfT0lEX1dFX1ZFUlNJT05fQ09NUElMRUQ6CisJICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUlOVCk7CisJICAgICAgICB3ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOworCSAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ3ZV92ZXJzaW9uX2NvbXBpbGVkLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCSAgICAgICAgYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9BUFNEX1NFVFRJTkc6CisJCQlhcHNkID0gKHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlIHwgKHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19CRSA8PCAxKSB8IChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQksgPDwgMikKKwkJCQl8IChwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkgPDwgMykJfCAocEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX1ZPIDw8IDQpCXwgKHBBZGFwdGVyLT5Db21tb25DZmcuTWF4U1BMZW5ndGggPDwgNSkpOworCisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZhcHNkLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfQVBTRF9TRVRUSU5HICg9MHglbHgsQVBTRENhcD0lZCxBQ19CRT0lZCxBQ19CSz0lZCxBQ19WST0lZCxBQ19WTz0lZCxNQVhTUExlbj0lZClcbiIsCisJCQkJYXBzZCxwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSxwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUscEFkYXB0ZXItPkNvbW1vbkNmZy5iQVBTREFDX0JLLHBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RBQ19WSSxwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8scEFkYXB0ZXItPkNvbW1vbkNmZy5NYXhTUExlbmd0aCkpOworCQkJYnJlYWs7CisJCWNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9BUFNEX1BTTToKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0FQU0RfUFNNICg9JWQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUpKTsKKwkJCWJyZWFrOworCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfV01NOgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKEJPT0xFQU4pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfV01NICg9JWQpXG4iLAlwQWRhcHRlci0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKSk7CisJCQlicmVhazsKKyNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCisgICAgICAgIGNhc2UgUlRfT0lEX05FV19EUklWRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVUNIQVIgZW5hYmxlZCA9IDE7CisgICAgCSAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKyAgICAJICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJmVuYWJsZWQsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF9ORVdfRFJJVkVSICg9JWQpXG4iLCBlbmFibGVkKSk7CisgICAgICAgICAgICB9CisJICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVDoKKwkgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisJICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUICg9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkpOworCSAgICAgICAgYnJlYWs7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworCisgICAgICAgIGNhc2UgUlRfT0lEX0RSSVZFUl9ERVZJQ0VfTkFNRToKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfRFJJVkVSX0RFVklDRV9OQU1FIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gMTY7CisJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBBZGFwdGVyLT5TdGFDZmcuZGV2X25hbWUsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisJCQl7CisJCQkJU3RhdHVzID0gLUVGQVVMVDsKKwkJCX0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfSFRfUEhZTU9ERToKKyAgICAgICAgICAgIHBIVFBoeU1vZGUgPSAoT0lEX1NFVF9IVF9QSFlNT0RFICopIGttYWxsb2Moc2l6ZW9mKE9JRF9TRVRfSFRfUEhZTU9ERSksIE1FTV9BTExPQ19GTEFHKTsKKyAgICAgICAgICAgIGlmIChwSFRQaHlNb2RlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBIVFBoeU1vZGUtPlBoeU1vZGUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGU7CisgICAgCQkJcEhUUGh5TW9kZS0+SHRNb2RlID0gKFVDSEFSKXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERTsKKyAgICAJCQlwSFRQaHlNb2RlLT5CVyA9IChVQ0hBUilwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLkJXOworICAgIAkJCXBIVFBoeU1vZGUtPk1DUz0gKFVDSEFSKXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTOworICAgIAkJCXBIVFBoeU1vZGUtPlNIT1JUR0k9IChVQ0hBUilwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLlNob3J0R0k7CisgICAgCQkJcEhUUGh5TW9kZS0+U1RCQz0gKFVDSEFSKXBBZGFwdGVyLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuU1RCQzsKKworICAgIAkJCXBIVFBoeU1vZGUtPkV4dE9mZnNldCA9ICgocEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA8IHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCkgPyAoRVhUQ0hBX0JFTE9XKSA6IChFWFRDSEFfQUJPVkUpKTsKKyAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoT0lEX1NFVF9IVF9QSFlNT0RFKTsKKyAgICAgICAgICAgICAgICBpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBIVFBoeU1vZGUsIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgCQkJeworICAgIAkJCQlTdGF0dXMgPSAtRUZBVUxUOworICAgIAkJCX0KKyAgICAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9IVF9QSFlNT0RFIChQaHlNb2RlID0gJWQsIE1DUyA9JWQsIEJXID0gJWQsIFNUQkMgPSAlZCwgRXh0T2Zmc2V0PSVkKVxuIiwKKyAgICAJCQkJcEhUUGh5TW9kZS0+SHRNb2RlLCBwSFRQaHlNb2RlLT5NQ1MsIHBIVFBoeU1vZGUtPkJXLCBwSFRQaHlNb2RlLT5TVEJDLCBwSFRQaHlNb2RlLT5FeHRPZmZzZXQpKTsKKyAgICAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgTWxtZVVwZGF0ZVR4UmF0ZXMgKC53b3JkID0gJXggKVxuIiwgcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS53b3JkKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfU1RBX0NPTkZJRyhrbWFsbG9jIGZhaWxlZClcbiIpKTsKKyAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9DT1VOVFJZX1JFR0lPTjoKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX0NPVU5UUllfUkVHSU9OIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisgICAgICAgICAgICB1bEluZm8gPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZDsKKyAgICAgICAgICAgIHVsSW5mbyA9ICh1bEluZm8gPDwgOCl8KHBBZGFwdGVyLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbik7CisJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICB7CisJCQkJU3RhdHVzID0gLUVGQVVMVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfREFUX0hUX1BIWU1PREU6CisgICAgICAgICAgICBwSFRQaHlNb2RlID0gKE9JRF9TRVRfSFRfUEhZTU9ERSAqKSBrbWFsbG9jKHNpemVvZihPSURfU0VUX0hUX1BIWU1PREUpLCBNRU1fQUxMT0NfRkxBRyk7CisgICAgICAgICAgICBpZiAocEhUUGh5TW9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwSFRQaHlNb2RlLT5QaHlNb2RlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlOworICAgIAkJCXBIVFBoeU1vZGUtPkh0TW9kZSA9IChVQ0hBUilwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREU7CisgICAgCQkJcEhUUGh5TW9kZS0+QlcgPSAoVUNIQVIpcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlc7CisgICAgCQkJcEhUUGh5TW9kZS0+TUNTPSAoVUNIQVIpcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUzsKKyAgICAJCQlwSFRQaHlNb2RlLT5TSE9SVEdJPSAoVUNIQVIpcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSTsKKyAgICAJCQlwSFRQaHlNb2RlLT5TVEJDPSAoVUNIQVIpcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQzsKKworICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihPSURfU0VUX0hUX1BIWU1PREUpOworICAgICAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcEhUUGh5TW9kZSwgd3JxLT51LmRhdGEubGVuZ3RoKSkKKyAgICAJCQl7CisgICAgCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisgICAgCQkJfQorICAgIAkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0hUX1BIWU1PREUgKFBoeU1vZGUgPSAlZCwgTUNTID0lZCwgQlcgPSAlZCwgU1RCQyA9ICVkLCBFeHRPZmZzZXQ9JWQpXG4iLAorICAgIAkJCQlwSFRQaHlNb2RlLT5IdE1vZGUsIHBIVFBoeU1vZGUtPk1DUywgcEhUUGh5TW9kZS0+QlcsIHBIVFBoeU1vZGUtPlNUQkMsIHBIVFBoeU1vZGUtPkV4dE9mZnNldCkpOworICAgIAkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNbG1lVXBkYXRlVHhSYXRlcyAoLndvcmQgPSAleCApXG4iLCBwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHKGttYWxsb2MgZmFpbGVkKVxuIikpOworICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVF9PSURfUVVFUllfTVVMVElQTEVfQ0FSRF9TVVBQT1JUOgorCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKKyAgICAgICAgICAgIGkgPSAwOworI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAorICAgICAgICAgICAgaSA9IDE7CisjZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCisJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZpLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgeworCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEX1FVRVJZX01VTFRJUExFX0NBUkRfU1VQUE9SVCg9JWQpIFxuIiwgaSkpOworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgU05NUF9TVVBQT1JUCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9NQUNfQUREUkVTUzoKKyAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IE1BQ19BRERSX0xFTjsKKyAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkN1cnJlbnRBZGRyZXNzLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX01BTlVGQUNUVVJFUk9VSToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX01BTlVGQUNUVVJFUk9VSSBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IE1hbnVmYWN0dXJlck9VSV9MRU47CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5DdXJyZW50QWRkcmVzcywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRVJOQU1FOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVSTkFNRSBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihNYW51ZmFjdHVyZXJOQU1FKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBNYW51ZmFjdHVyZXJOQU1FLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1JFU09VUkNFVFlQRUlETkFNRToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1JFU09VUkNFVFlQRUlETkFNRSBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihSZXNvdXJjZVR5cGVJZE5hbWUpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIFJlc291cmNlVHlwZUlkTmFtZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT0lEXzgwMl8xMV9QUklWQUNZT1BUSU9OSU1QTEVNRU5URUQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9QUklWQUNZT1BUSU9OSU1QTEVNRU5URUQgXG4iKSk7CisJCQl1bEluZm8gPSAxOyAvLyAxIGlzIHN1cHBvcnQgd2VwIGVsc2UgMiBpcyBub3Qgc3VwcG9ydC4KKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfUE9XRVJNQU5BR0VNRU5UTU9ERToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1BPV0VSTUFOQUdFTUVOVE1PREUgXG4iKSk7CisJCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5Qc20gPT0gUFNNUF9BQ1RJT04pCisJCQkJdWxJbmZvID0gMTsgLy8gMSBpcyBwb3dlciBhY3RpdmUgZWxzZSAyIGlzIHBvd2VyIHNhdmUuCisJCQllbHNlCisJCQkJdWxJbmZvID0gMjsKKworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZVkFMVUU6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZVkFMVUUgXG4iKSk7CisJCQkvL0tleUlkeFZhbHVlLktleUlkeCA9IHBBZC0+UG9ydENmZy5NQlNTSURbcEFkLT5Jb2N0bElGXS5EZWZhdWx0S2V5SWQ7CisJCQlwS2V5SWR4VmFsdWUgPSB3cnEtPnUuZGF0YS5wb2ludGVyOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJLZXlJZHhWYWx1ZS5LZXlJZHggPSAlZCwgXG4iLHBLZXlJZHhWYWx1ZS0+S2V5SWR4KSk7CisJCQl2YWx1ZUxlbiA9IHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbjsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBLZXlJZHhWYWx1ZS0+VmFsdWUsCisJCQkJCQkgICAmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LAorCQkJCQkJICAgdmFsdWVMZW4pOworCQkJcEtleUlkeFZhbHVlLT5WYWx1ZVt2YWx1ZUxlbl09J1wwJzsKKworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKERlZmF1bHRLZXlJZHhWYWx1ZSk7CisKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwS2V5SWR4VmFsdWUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRlZmF1bHRLZXlJZCA9ICVkLCB0b3RhbCBsZW4gPSAlZCwgc3RyIGxlbj0lZCwgS2V5VmFsdWU9ICUwMnggJTAyeCAlMDJ4ICUwMnggXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwgd3JxLT51LmRhdGEubGVuZ3RoLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4sCisJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleVswXSwKKwkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5WzBdLAorCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXlbMF0sCisJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleVswXSkpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX1dFUERFRkFVTFRLRVlJRDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1dFUERFRkFVTFRLRVlJRCBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRGVmYXVsdEtleUlkID0lZCBcbiIsIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkKSk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfV0VQS0VZTUFQUElOR0xFTkdUSDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1dFUEtFWU1BUFBJTkdMRU5HVEggXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsCisJCQkJCQkJCQkmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuLAorCQkJCQkJCQkJd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEXzgwMl8xMV9TSE9SVFJFVFJZTElNSVQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9TSE9SVFJFVFJZTElNSVQgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOworCQkJU2hvcnRSZXRyeUxpbWl0ID0gdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJ0eUxpbWl0OworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2hvcnRSZXRyeUxpbWl0ID0lbGQsICB0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UmV0cnlMaW1pdD0lZFxuIiwgU2hvcnRSZXRyeUxpbWl0LCB0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UnR5TGltaXQpKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmU2hvcnRSZXRyeUxpbWl0LCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfODAyXzExX0xPTkdSRVRSWUxJTUlUOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfTE9OR1JFVFJZTElNSVQgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOworCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOworCQkJTG9uZ1JldHJ5TGltaXQgPSB0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdDsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkxvbmdSZXRyeUxpbWl0ID0lbGQsICB0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdD0lZFxuIiwgTG9uZ1JldHJ5TGltaXQsIHR4X3J0eV9jZmcuZmllbGQuTG9uZ1J0eUxpbWl0KSk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJkxvbmdSZXRyeUxpbWl0LCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX1BST0RVQ1RJRDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1BST0RVQ1RJRCBcbiIpKTsKKworI2lmZGVmIFJUMjg3MAorCQkJc3ByaW50Zih0bXAsICIlMDR4ICUwNHhcbiIsICgoUE9TX0NPT0tJRSlwQWRhcHRlci0+T1NfQ29va2llKS0+cFVzYl9EZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IgLCgoUE9TX0NPT0tJRSlwQWRhcHRlci0+T1NfQ29va2llKS0+cFVzYl9EZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KTsKKworI2VuZGlmIC8vIFJUMjg3MCAvLworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKHRtcCk7CisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgdG1wLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PSURfODAyXzExX01BTlVGQUNUVVJFSUQ6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRUlEIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKE1hbnVmYWN0dXJlck5BTUUpOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIE1hbnVmYWN0dXJlck5BTUUsIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfQ1VSUkVOVENIQU5ORUw6CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9DVVJSRU5UQ0hBTk5FTCBcbiIpKTsKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJzaXplb2YgVUNIQVI9JWQsIGNoYW5uZWw9JWQgXG4iLCBzaXplb2YoVUNIQVIpLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLCB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3RhdHVzPSVkXG4iLCBTdGF0dXMpKTsKKwkJCWJyZWFrOworI2VuZGlmIC8vU05NUF9TVVBQT1JUCisKKwkJY2FzZSBPSURfODAyXzExX0JVSUxEX0NIQU5ORUxfRVg6CisJCQl7CisJCQkJVUNIQVIgdmFsdWU7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQlVJTERfQ0hBTk5FTF9FWCBcbiIpKTsKKwkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOworI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTdXBwb3J0IEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QuXG4iKSk7CisJCQkJdmFsdWUgPSAxOworI2Vsc2UKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEb2Vzbid0IHN1cHBvcnQgRVhUX0JVSUxEX0NIQU5ORUxfTElTVC5cbiIpKTsKKwkJCQl2YWx1ZSA9IDA7CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdmFsdWUsIDEpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN0YXR1cz0lZFxuIiwgU3RhdHVzKSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfR0VUX0NIX0xJU1Q6CisJCQl7CisJCQkJUFJUX0NIQU5ORUxfTElTVF9JTkZPIHBDaExpc3RCdWY7CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9HRVRfQ0hfTElTVCBcbiIpKTsKKwkJCQlpZiAocEFkYXB0ZXItPkNoYW5uZWxMaXN0TnVtID09IDApCisJCQkJeworCQkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAwOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlwQ2hMaXN0QnVmID0gKFJUX0NIQU5ORUxfTElTVF9JTkZPICopIGttYWxsb2Moc2l6ZW9mKFJUX0NIQU5ORUxfTElTVF9JTkZPKSwgTUVNX0FMTE9DX0ZMQUcpOworCQkJCWlmIChwQ2hMaXN0QnVmID09IE5VTEwpCisJCQkJeworCQkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAwOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlwQ2hMaXN0QnVmLT5DaGFubmVsTGlzdE51bSA9IHBBZGFwdGVyLT5DaGFubmVsTGlzdE51bTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgcENoTGlzdEJ1Zi0+Q2hhbm5lbExpc3ROdW07IGkrKykKKwkJCQkJcENoTGlzdEJ1Zi0+Q2hhbm5lbExpc3RbaV0gPSBwQWRhcHRlci0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbDsKKworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSVF9DSEFOTkVMX0xJU1RfSU5GTyk7CisJCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBDaExpc3RCdWYsIHNpemVvZihSVF9DSEFOTkVMX0xJU1RfSU5GTykpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN0YXR1cz0lZFxuIiwgU3RhdHVzKSk7CisKKwkJCQlpZiAocENoTGlzdEJ1ZikKKwkJCQkJa2ZyZWUocENoTGlzdEJ1Zik7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfR0VUX0NPVU5UUllfQ09ERToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0dFVF9DT1VOVFJZX0NPREUgXG4iKSk7CisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAyOworCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlLCAyKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN0YXR1cz0lZFxuIiwgU3RhdHVzKSk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF84MDJfMTFfR0VUX0NIQU5ORUxfR0VPR1JBUEhZOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfR0VUX0NIQU5ORUxfR0VPR1JBUEhZIFxuIikpOworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gMTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5HZW9ncmFwaHksIDEpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3RhdHVzPSVkXG4iLCBTdGF0dXMpKTsKKwkJCWJyZWFrOworCisKKyNpZmRlZiBRT1NfRExTX1NVUFBPUlQKKwkJY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0RMUzoKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihCT09MRUFOKTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkYXB0ZXItPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0RMUyg9JWQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKSk7CisJCQlicmVhazsKKworCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfRExTX1BBUkFNOgorCQkJeworCQkJCVBSVF84MDJfMTFfRExTX0lORk8JcERsc0luZm8gPSBrbWFsbG9jKHNpemVvZihSVF84MDJfMTFfRExTX0lORk8pLCBHRlBfQVRPTUlDKTsKKwkJCQlpZiAocERsc0luZm8gPT0gTlVMTCkKKwkJCQkJYnJlYWs7CisKKwkJCQlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQorCQkJCXsKKwkJCQkJUlRNUE1vdmVNZW1vcnkoJnBEbHNJbmZvLT5FbnRyeVtpXSwgJnBBZGFwdGVyLT5TdGFDZmcuRExTRW50cnlbaV0sIHNpemVvZihSVF84MDJfMTFfRExTX1VJKSk7CisJCQkJfQorCisJCQkJcERsc0luZm8tPm51bSA9IE1BWF9OVU1fT0ZfRExTX0VOVFJZOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSVF84MDJfMTFfRExTX0lORk8pOworCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwRGxzSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9ETFNfUEFSQU1cbiIpKTsKKworCQkJCWlmIChwRGxzSW5mbykKKwkJCQkJa2ZyZWUocERsc0luZm8pOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6dW5rbm93biBJT0NUTCdzIHN1YmNtZCA9IDB4JTA4eFxuIiwgY21kKSk7CisgICAgICAgICAgICBTdGF0dXMgPSAtRU9QTk9UU1VQUDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOworfQorCitJTlQgcnQyOHh4X3N0YV9pb2N0bCgKKwlJTglzdHJ1Y3QgbmV0X2RldmljZQkqbmV0X2RldiwKKwlJTglPVVQJc3RydWN0IGlmcmVxCSpycSwKKwlJTglJTlQJCQkJCWNtZCkKK3sKKwlQT1NfQ09PS0lFCQkJcE9iajsKKwlWSVJUVUFMX0FEQVBURVIJCSpwVmlydHVhbEFkID0gTlVMTDsKKwlSVE1QX0FEQVBURVIgICAgICAgICpwQWQgPSBOVUxMOworCXN0cnVjdCBpd3JlcSAgICAgICAgKndycSA9IChzdHJ1Y3QgaXdyZXEgKikgcnE7CisJQk9PTEVBTgkJCQlTdGF0ZU1hY2hpbmVUb3VjaGVkID0gRkFMU0U7CisJSU5UCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCVVTSE9SVAkJCQlzdWJjbWQ7CisKKwlpZiAobmV0X2Rldi0+cHJpdl9mbGFncyA9PSBJTlRfTUFJTikKKwl7CisJCXBBZCA9IG5ldF9kZXYtPnByaXY7CisJfQorCWVsc2UKKwl7CisJCXBWaXJ0dWFsQWQgPSBuZXRfZGV2LT5wcml2OworCQlwQWQgPSBwVmlydHVhbEFkLT5SdG1wRGV2LT5wcml2OworCX0KKwlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCisJaWYgKHBBZCA9PSBOVUxMKQorCXsKKwkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKKwkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCisJCXJldHVybiAtRU5FVERPV047CisJfQorCisgICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KKyAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQorICAgIHsKKyNpZmRlZiBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVAorCSAgICBpZiAod3JxLT51LmRhdGEucG9pbnRlciA9PSBOVUxMKQorCSAgICB7CisJCSAgICByZXR1cm4gU3RhdHVzOworCSAgICB9CisKKwkgICAgaWYgKHN0cnN0cih3cnEtPnUuZGF0YS5wb2ludGVyLCAiT3BNb2RlIikgPT0gTlVMTCkKKyNlbmRpZiAvLyBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVCAvLworICAgICAgICB7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCSAgICByZXR1cm4gLUVORVRET1dOOworICAgICAgICB9CisgICAgfQorCisJewkvLyBkZXRlcm1pbmUgdGhpcyBpb2N0bCBjb21tYW5kIGlzIGNvbW1pbmcgZnJvbSB3aGljaCBpbnRlcmZhY2UuCisJCXBPYmotPmlvY3RsX2lmX3R5cGUgPSBJTlRfTUFJTjsKKwkJcE9iai0+aW9jdGxfaWYgPSBNQUlOX01CU1NJRDsKKwl9CisKKwlzd2l0Y2goY21kKQorCXsKKyNpZmRlZiBSQUxJTktfQVRFCisjaWZkZWYgUkFMSU5LXzI4eHhfUUEKKwkJY2FzZSBSVFBSSVZfSU9DVExfQVRFOgorCQkJeworCQkJCVJ0bXBEb0F0ZShwQWQsIHdycSk7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLworI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KKyAgICAgICAgY2FzZSBTSU9DR0lGSFdBRERSOgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU9DVEw6OlNJT0NHSUZIV0FERFJcbiIpKTsKKwkJCW1lbWNweSh3cnEtPnUubmFtZSwgcEFkLT5DdXJyZW50QWRkcmVzcywgRVRIX0FMRU4pOworCQkJYnJlYWs7CisJCWNhc2UgU0lPQ0dJV05BTUU6CisgICAgICAgIHsKKyAgICAgICAgCWNoYXIgKm5hbWU9JndycS0+dS5uYW1lWzBdOworICAgICAgICAJcnRfaW9jdGxfZ2l3bmFtZShuZXRfZGV2LCBOVUxMLCBuYW1lLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ0dJV0VTU0lEOiAgLy9HZXQgRVNTSUQKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BvaW50ICplc3NpZD0md3JxLT51LmVzc2lkOworICAgICAgICAJcnRfaW9jdGxfZ2l3ZXNzaWQobmV0X2RldiwgTlVMTCwgZXNzaWQsIGVzc2lkLT5wb2ludGVyKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ1NJV0VTU0lEOiAgLy9TZXQgRVNTSUQKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BvaW50CSplc3NpZD0md3JxLT51LmVzc2lkOworICAgICAgICAJcnRfaW9jdGxfc2l3ZXNzaWQobmV0X2RldiwgTlVMTCwgZXNzaWQsIGVzc2lkLT5wb2ludGVyKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ1NJV05XSUQ6ICAgLy8gc2V0IG5ldHdvcmsgaWQgKHRoZSBjZWxsKQorCQljYXNlIFNJT0NHSVdOV0lEOiAgIC8vIGdldCBuZXR3b3JrIGlkCisJCQlTdGF0dXMgPSAtRU9QTk9UU1VQUDsKKwkJCWJyZWFrOworCQljYXNlIFNJT0NTSVdGUkVROiAgIC8vc2V0IGNoYW5uZWwvZnJlcXVlbmN5IChIeikKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X2ZyZXEgKmZyZXE9JndycS0+dS5mcmVxOworICAgICAgICAJcnRfaW9jdGxfc2l3ZnJlcShuZXRfZGV2LCBOVUxMLCBmcmVxLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ0dJV0ZSRVE6ICAgLy8gZ2V0IGNoYW5uZWwvZnJlcXVlbmN5IChIeikKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X2ZyZXEgKmZyZXE9JndycS0+dS5mcmVxOworICAgICAgICAJcnRfaW9jdGxfZ2l3ZnJlcShuZXRfZGV2LCBOVUxMLCBmcmVxLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ1NJV05JQ0tOOiAvL3NldCBub2RlIG5hbWUvbmlja25hbWUKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BvaW50ICpkYXRhPSZ3cnEtPnUuZGF0YTsKKyAgICAgICAgCXJ0X2lvY3RsX3Npd25pY2tuKG5ldF9kZXYsIE5VTEwsIGRhdGEsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTSU9DR0lXTklDS046IC8vZ2V0IG5vZGUgbmFtZS9uaWNrbmFtZQorICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGE9JndycS0+dS5kYXRhOworICAgICAgICAJcnRfaW9jdGxfZ2l3bmlja24obmV0X2RldiwgTlVMTCwgZGF0YSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHSVdSQVRFOiAgIC8vZ2V0IGRlZmF1bHQgYml0IHJhdGUgKGJwcykKKwkJICAgIHJ0X2lvY3RsX2dpd3JhdGUobmV0X2RldiwgTlVMTCwgJndycS0+dSwgTlVMTCk7CisgICAgICAgICAgICBicmVhazsKKwkgICAgY2FzZSBTSU9DU0lXUkFURTogIC8vc2V0IGRlZmF1bHQgYml0IHJhdGUgKGJwcykKKwkgICAgICAgIHJ0X2lvY3RsX3Npd3JhdGUobmV0X2RldiwgTlVMTCwgJndycS0+dSwgTlVMTCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTSU9DR0lXUlRTOiAgLy8gZ2V0IFJUUy9DVFMgdGhyZXNob2xkIChieXRlcykKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BhcmFtICpydHM9JndycS0+dS5ydHM7CisgICAgICAgIAlydF9pb2N0bF9naXdydHMobmV0X2RldiwgTlVMTCwgcnRzLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisgICAgICAgIGNhc2UgU0lPQ1NJV1JUUzogIC8vc2V0IFJUUy9DVFMgdGhyZXNob2xkIChieXRlcykKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BhcmFtICpydHM9JndycS0+dS5ydHM7CisgICAgICAgIAlydF9pb2N0bF9zaXdydHMobmV0X2RldiwgTlVMTCwgcnRzLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisgICAgICAgIGNhc2UgU0lPQ0dJV0ZSQUc6ICAvL2dldCBmcmFnbWVudGF0aW9uIHRociAoYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wYXJhbSAqZnJhZz0md3JxLT51LmZyYWc7CisgICAgICAgIAlydF9pb2N0bF9naXdmcmFnKG5ldF9kZXYsIE5VTEwsIGZyYWcsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKyAgICAgICAgY2FzZSBTSU9DU0lXRlJBRzogIC8vc2V0IGZyYWdtZW50YXRpb24gdGhyIChieXRlcykKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BhcmFtICpmcmFnPSZ3cnEtPnUuZnJhZzsKKyAgICAgICAgCXJ0X2lvY3RsX3Npd2ZyYWcobmV0X2RldiwgTlVMTCwgZnJhZywgTlVMTCk7CisJCQlicmVhazsKKwkJfQorICAgICAgICBjYXNlIFNJT0NHSVdFTkNPREU6ICAvL2dldCBlbmNvZGluZyB0b2tlbiAmIG1vZGUKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IGl3X3BvaW50ICplcnE9JndycS0+dS5lbmNvZGluZzsKKyAgICAgICAgCWlmKGVycS0+cG9pbnRlcikKKyAgICAgICAgCQlydF9pb2N0bF9naXdlbmNvZGUobmV0X2RldiwgTlVMTCwgZXJxLCBlcnEtPnBvaW50ZXIpOworCQkJYnJlYWs7CisJCX0KKyAgICAgICAgY2FzZSBTSU9DU0lXRU5DT0RFOiAgLy9zZXQgZW5jb2RpbmcgdG9rZW4gJiBtb2RlCisgICAgICAgIHsKKyAgICAgICAgCXN0cnVjdCBpd19wb2ludCAqZXJxPSZ3cnEtPnUuZW5jb2Rpbmc7CisgICAgICAgIAlpZihlcnEtPnBvaW50ZXIpCisgICAgICAgIAkJcnRfaW9jdGxfc2l3ZW5jb2RlKG5ldF9kZXYsIE5VTEwsIGVycSwgZXJxLT5wb2ludGVyKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgU0lPQ0dJV0FQOiAgICAgLy9nZXQgYWNjZXNzIHBvaW50IE1BQyBhZGRyZXNzZXMKKyAgICAgICAgeworICAgICAgICAJc3RydWN0IHNvY2thZGRyICphcF9hZGRyPSZ3cnEtPnUuYXBfYWRkcjsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd2FwKG5ldF9kZXYsIE5VTEwsIGFwX2FkZHIsIGFwX2FkZHItPnNhX2RhdGEpOworCQkJYnJlYWs7CisJCX0KKwkgICAgY2FzZSBTSU9DU0lXQVA6ICAvL3NldCBhY2Nlc3MgcG9pbnQgTUFDIGFkZHJlc3NlcworICAgICAgICB7CisgICAgICAgIAlzdHJ1Y3Qgc29ja2FkZHIgKmFwX2FkZHI9JndycS0+dS5hcF9hZGRyOworICAgICAgICAJcnRfaW9jdGxfc2l3YXAobmV0X2RldiwgTlVMTCwgYXBfYWRkciwgYXBfYWRkci0+c2FfZGF0YSk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHSVdNT0RFOiAgIC8vZ2V0IG9wZXJhdGlvbiBtb2RlCisgICAgICAgIHsKKyAgICAgICAgCV9fdTMyICptb2RlPSZ3cnEtPnUubW9kZTsKKyAgICAgICAgCXJ0X2lvY3RsX2dpd21vZGUobmV0X2RldiwgTlVMTCwgbW9kZSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NTSVdNT0RFOiAgIC8vc2V0IG9wZXJhdGlvbiBtb2RlCisgICAgICAgIHsKKyAgICAgICAgCV9fdTMyICptb2RlPSZ3cnEtPnUubW9kZTsKKyAgICAgICAgCXJ0X2lvY3RsX3Npd21vZGUobmV0X2RldiwgTlVMTCwgbW9kZSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFNJT0NHSVdTRU5TOiAgIC8vZ2V0IHNlbnNpdGl2aXR5IChkQm0pCisJCWNhc2UgU0lPQ1NJV1NFTlM6CS8vc2V0IHNlbnNpdGl2aXR5IChkQm0pCisJCWNhc2UgU0lPQ0dJV1BPV0VSOiAgLy9nZXQgUG93ZXIgTWFuYWdlbWVudCBzZXR0aW5ncworCQljYXNlIFNJT0NTSVdQT1dFUjogIC8vc2V0IFBvd2VyIE1hbmFnZW1lbnQgc2V0dGluZ3MKKwkJY2FzZSBTSU9DR0lXVFhQT1c6ICAvL2dldCB0cmFuc21pdCBwb3dlciAoZEJtKQorCQljYXNlIFNJT0NTSVdUWFBPVzogIC8vc2V0IHRyYW5zbWl0IHBvd2VyIChkQm0pCisJCWNhc2UgU0lPQ0dJV1JBTkdFOgkvL0dldCByYW5nZSBvZiBwYXJhbWV0ZXJzCisJCWNhc2UgU0lPQ0dJV1JFVFJZOgkvL2dldCByZXRyeSBsaW1pdHMgYW5kIGxpZmV0aW1lCisJCWNhc2UgU0lPQ1NJV1JFVFJZOgkvL3NldCByZXRyeSBsaW1pdHMgYW5kIGxpZmV0aW1lCisJCQlTdGF0dXMgPSAtRU9QTk9UU1VQUDsKKwkJCWJyZWFrOworCQljYXNlIFJUX1BSSVZfSU9DVEw6CisJCQlzdWJjbWQgPSB3cnEtPnUuZGF0YS5mbGFnczsKKwkJCWlmKCBzdWJjbWQgJiBPSURfR0VUX1NFVF9UT0dHTEUpCisJCQkJU3RhdHVzID0gUlRNUFNldEluZm9ybWF0aW9uKHBBZCwgcnEsIHN1YmNtZCk7CisJCQllbHNlCisJCQkJU3RhdHVzID0gUlRNUFF1ZXJ5SW5mb3JtYXRpb24ocEFkLCBycSwgc3ViY21kKTsKKwkJCWJyZWFrOworCQljYXNlIFNJT0NHSVdQUklWOgorCQkJaWYgKHdycS0+dS5kYXRhLnBvaW50ZXIpCisJCQl7CisJCQkJaWYgKCBhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB3cnEtPnUuZGF0YS5wb2ludGVyLCBzaXplb2YocHJpdnRhYikpICE9IFRSVUUpCisJCQkJCWJyZWFrOworCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwcml2dGFiKSAvIHNpemVvZihwcml2dGFiWzBdKTsKKwkJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHByaXZ0YWIsIHNpemVvZihwcml2dGFiKSkpCisJCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBSVFBSSVZfSU9DVExfU0VUOgorCQkJaWYoYWNjZXNzX29rKFZFUklGWV9SRUFELCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpICE9IFRSVUUpCisJCQkJYnJlYWs7CisJCQlydF9pb2N0bF9zZXRwYXJhbShuZXRfZGV2LCBOVUxMLCBOVUxMLCB3cnEtPnUuZGF0YS5wb2ludGVyKTsKKwkJCWJyZWFrOworCQljYXNlIFJUUFJJVl9JT0NUTF9HU0lURVNVUlZFWToKKwkJCVJUTVBJb2N0bEdldFNpdGVTdXJ2ZXkocEFkLCB3cnEpOworCQkgICAgYnJlYWs7CisjaWZkZWYgREJHCisJCWNhc2UgUlRQUklWX0lPQ1RMX01BQzoKKwkJCVJUTVBJb2N0bE1BQyhwQWQsIHdycSk7CisJCQlicmVhazsKKwkJY2FzZSBSVFBSSVZfSU9DVExfRTJQOgorCQkJUlRNUElvY3RsRTJQUk9NKHBBZCwgd3JxKTsKKwkJCWJyZWFrOworI2VuZGlmIC8vIERCRyAvLworICAgICAgICBjYXNlIFNJT0NFVEhUT09MOgorICAgICAgICAgICAgICAgIGJyZWFrOworCQlkZWZhdWx0OgorCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiSU9DVEw6OnVua25vd24gSU9DVEwncyBjbWQgPSAweCUwOHhcbiIsIGNtZCkpOworCQkJU3RhdHVzID0gLUVPUE5PVFNVUFA7CisJCQlicmVhazsKKwl9CisKKyAgICBpZihTdGF0ZU1hY2hpbmVUb3VjaGVkKSAvLyBVcHBlciBsYXllciBzZW50IGEgTUxNRS1yZWxhdGVkIG9wZXJhdGlvbnMKKyAgICAJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCisJcmV0dXJuIFN0YXR1czsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgU1NJRAorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9TU0lEX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBORElTXzgwMl8xMV9TU0lEICAgICAgICAgICAgICAgICAgICBTc2lkLCAqcFNzaWQ9TlVMTDsKKyAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZU1hY2hpbmVUb3VjaGVkID0gRkFMU0U7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IFRSVUU7CisKKyAgICBpZiggc3RybGVuKGFyZykgPD0gTUFYX0xFTl9PRl9TU0lEKQorICAgIHsKKyAgICAgICAgTmRpc1plcm9NZW1vcnkoJlNzaWQsIHNpemVvZihORElTXzgwMl8xMV9TU0lEKSk7CisgICAgICAgIGlmIChzdHJsZW4oYXJnKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShTc2lkLlNzaWQsIGFyZywgc3RybGVuKGFyZykpOworICAgICAgICAgICAgU3NpZC5Tc2lkTGVuZ3RoID0gc3RybGVuKGFyZyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAgIC8vQU5ZIHNzaWQKKyAgICAgICAgeworICAgICAgICAgICAgU3NpZC5Tc2lkTGVuZ3RoID0gMDsKKwkJICAgIG1lbWNweShTc2lkLlNzaWQsICIiLCAwKTsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19JTkZSQTsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOworCSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgID0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZDsKKwkJfQorICAgICAgICBwU3NpZCA9ICZTc2lkOworCisgICAgICAgIGlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQorICAgICAgICB7CisgICAgICAgICAgICBSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBNTE1FIGJ1c3ksIHJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gVFJVRTsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7CisJCXBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7CisKKyAgICAgICAgTWxtZUVucXVldWUocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorICAgICAgICAgICAgICAgICAgICBPSURfODAyXzExX1NTSUQsCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihORElTXzgwMl8xMV9TU0lEKSwKKyAgICAgICAgICAgICAgICAgICAgKFZPSUQgKilwU3NpZCk7CisKKyAgICAgICAgU3RhdGVNYWNoaW5lVG91Y2hlZCA9IFRSVUU7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9TU0lEX1Byb2M6OihMZW49JWQsU3NpZD0lcylcbiIsIFNzaWQuU3NpZExlbmd0aCwgU3NpZC5Tc2lkKSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgc3VjY2VzcyA9IEZBTFNFOworCisgICAgaWYgKFN0YXRlTWFjaGluZVRvdWNoZWQpIC8vIFVwcGVyIGxheWVyIHNlbnQgYSBNTE1FLXJlbGF0ZWQgb3BlcmF0aW9ucworICAgIAlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZGFwdGVyKTsKKworICAgIHJldHVybiBzdWNjZXNzOworfQorCisjaWZkZWYgV01NX1NVUFBPUlQKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdtbUNhcGFibGUgRW5hYmxlIG9yIERpc2FibGUKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVAlTZXRfV21tQ2FwYWJsZV9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlCT09MRUFOCWJXbW1DYXBhYmxlOworCisJYldtbUNhcGFibGUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKChiV21tQ2FwYWJsZSA9PSAxKQorI2lmZGVmIFJUMjg3MAorCQkmJiAocEFkLT5OdW1iZXJPZlBpcGVzID49IDUpCisjZW5kaWYgLy8gUlQyODcwIC8vCisJCSkKKwkJcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUgPSBUUlVFOworCWVsc2UgaWYgKGJXbW1DYXBhYmxlID09IDApCisJCXBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlID0gRkFMU0U7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9XbW1DYXBhYmxlX1Byb2M6OihiV21tQ2FwYWJsZT0lZClcbiIsCisJCXBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvLyBXTU1fU1VQUE9SVCAvLworCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBOZXR3b3JrIFR5cGUoSW5mcmFzdHJ1Y3R1cmUvQWRob2MgbW9kZSkKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfTmV0d29ya1R5cGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIFVJTlQzMglWYWx1ZSA9IDA7CisKKyAgICBpZiAoc3RyY21wKGFyZywgIkFkaG9jIikgPT0gMCkKKwl7CisJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgIT0gQlNTX0FESE9DKQorCQl7CisJCQkvLyBDb25maWcgaGFzIGNoYW5nZWQKKwkJCXBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7CisgICAgICAgICAgICBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBSWF9GSUxUUl9DRkcsIFNUQU5PUk1BTCk7CisgICAgICAgICAgICAgICAgUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJCQlWYWx1ZSAmPSAofjB4ODApOworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisgICAgICAgICAgICAgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYkF1dG9SZWNvbm5lY3QgPSBUUlVFOworICAgICAgICAgICAgICAgIExpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7CisgICAgICAgICAgICB9CisJCQlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCS8vQk9PTEVBTiBDYW5jZWxsZWQ7CisJCQkJLy8gU2V0IHRoZSBBdXRvUmVjb25uZWN0U3NpZCB0byBwcmV2ZW50IGl0IHJlY29ubmVjdCB0byBvbGQgU1NJRAorCQkJCS8vIFNpbmNlIGNhbGxpbmcgdGhpcyBpbmRpY2F0ZSB1c2VyIGRvbid0IHdhbnQgdG8gY29ubmVjdCB0byB0aGF0IFNTSUQgYW55bW9yZS4KKwkJCQlwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7CisJCQkJTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKKworCQkJCUxpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7CisKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJORElTX1NUQVRVU19NRURJQV9ESVNDT05ORUNUIEV2ZW50IEJCIVxuIikpOworCQkJfQorCQl9CisJCXBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19BREhPQzsKKyAgICAgICAgcEFkYXB0ZXItPm5ldF9kZXYtPnR5cGUgPSBwQWRhcHRlci0+U3RhQ2ZnLk9yaURldlR5cGU7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5TZXRfTmV0d29ya1R5cGVfUHJvYzo6KEFELUhPQylcbiIpKTsKKwl9CisgICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIkluZnJhIikgPT0gMCkKKwl7CisJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgIT0gQlNTX0lORlJBKQorCQl7CisJCQkvLyBDb25maWcgaGFzIGNoYW5nZWQKKwkJCXBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7CisgICAgICAgICAgICBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBSWF9GSUxUUl9DRkcsIFNUQU5PUk1BTCk7CisgICAgICAgICAgICAgICAgUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJCQlWYWx1ZSAmPSAofjB4ODApOworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisgICAgICAgICAgICAgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuYkF1dG9SZWNvbm5lY3QgPSBUUlVFOworICAgICAgICAgICAgICAgIExpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7CisgICAgICAgICAgICB9CisJCQlpZiAoQURIT0NfT04ocEFkYXB0ZXIpKQorCQkJeworCQkJCS8vIFNldCB0aGUgQXV0b1JlY29ubmVjdFNzaWQgdG8gcHJldmVudCBpdCByZWNvbm5lY3QgdG8gb2xkIFNTSUQKKwkJCQkvLyBTaW5jZSBjYWxsaW5nIHRoaXMgaW5kaWNhdGUgdXNlciBkb24ndCB3YW50IHRvIGNvbm5lY3QgdG8gdGhhdCBTU0lEIGFueW1vcmUuCisJCQkJcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW49IDMyOworCQkJCU5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7CisKKwkJCQlMaW5rRG93bihwQWRhcHRlciwgRkFMU0UpOworCQkJfQorCQl9CisJCXBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19JTkZSQTsKKyAgICAgICAgcEFkYXB0ZXItPm5ldF9kZXYtPnR5cGUgPSBwQWRhcHRlci0+U3RhQ2ZnLk9yaURldlR5cGU7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5TZXRfTmV0d29ya1R5cGVfUHJvYzo6KElORlJBKVxuIikpOworCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19JTkZSQTsKKwl9CisgICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIk1vbml0b3IiKSA9PSAwKQorICAgIHsKKwkJVUNIQVIJYmJwVmFsdWUgPSAwOworCQlCQ05fVElNRV9DRkdfU1RSVUMgY3NyOworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX0lORlJBX09OKTsKKyAgICAgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19BREhPQ19PTik7CisJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisJCS8vIGRpc2FibGUgYWxsIHBlcmlvZGljIHN0YXRlIG1hY2hpbmUKKwkJcEFkYXB0ZXItPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9IEZBTFNFOworCQkvLyByZXNldCBhbGwgbWxtZSBzdGF0ZSBtYWNoaW5lCisJCVJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCBcbiIpKTsKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPT0gMCkKKyAgICAgICAgeworI2lmZGVmIERPVDExX05fU1VQUE9SVAorICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBTl9NSVhFRCkKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gMzY7CisgICAgICAgICAgICBlbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IDY7CisgICAgICAgIH0KKyNpZmRlZiBET1QxMV9OX1NVUFBPUlQKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgTl9DaGFubmVsQ2hlY2socEFkYXB0ZXIpOworI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEICYmCisgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PSBCV180MCAmJgorICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID09IEVYVENIQV9BQk9WRSkKKwkJeworCQkJLy8gNDBNSHogLGNvbnRyb2wgY2hhbm5lbCBhdCBsb3dlcgorCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsICZiYnBWYWx1ZSk7CisJCQliYnBWYWx1ZSAmPSAofjB4MTgpOworCQkJYmJwVmFsdWUgfD0gMHgxMDsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgYmJwVmFsdWUpOworCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV180MDsKKwkJCS8vICBSWCA6IGNvbnRyb2wgY2hhbm5lbCBhdCBsb3dlcgorCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjMsICZiYnBWYWx1ZSk7CisJCQliYnBWYWx1ZSAmPSAofjB4MjApOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IzLCBiYnBWYWx1ZSk7CisKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9CQU5EX0NGRywgJlZhbHVlKTsKKwkJCVZhbHVlICY9IDB4ZmZmZmZmZmU7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7CisJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsICsgMjsKKyAgICAgICAgICAgIEFzaWNTd2l0Y2hDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7CisJCSAgICBBc2ljTG9ja0NoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQldfNDAgLGNvbnRyb2xfY2hhbm5lbCglZCksIENlbnRyYWxDaGFubmVsKCVkKSBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKSk7CisJCX0KKwkJZWxzZSBpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQgJiYKKyAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDAgJiYKKyAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID09IEVYVENIQV9CRUxPVykKKwkJeworCQkJLy8gNDBNSHogLGNvbnRyb2wgY2hhbm5lbCBhdCB1cHBlcgorCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsICZiYnBWYWx1ZSk7CisJCQliYnBWYWx1ZSAmPSAofjB4MTgpOworCQkJYmJwVmFsdWUgfD0gMHgxMDsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgYmJwVmFsdWUpOworCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV180MDsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9CQU5EX0NGRywgJlZhbHVlKTsKKwkJCVZhbHVlIHw9IDB4MTsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfQkFORF9DRkcsIFZhbHVlKTsKKworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjMsICZiYnBWYWx1ZSk7CisJCQliYnBWYWx1ZSB8PSAoMHgyMCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjMsIGJicFZhbHVlKTsKKwkJCXBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwgLSAyOworICAgICAgICAgICAgQXNpY1N3aXRjaENoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKKwkJICAgIEFzaWNMb2NrQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCV180MCAsY29udHJvbF9jaGFubmVsKCVkKSwgQ2VudHJhbENoYW5uZWwoJWQpIFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpKTsKKwkJfQorCQllbHNlCisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisJCXsKKwkJCS8vIDIwTUh6CisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgJmJicFZhbHVlKTsKKwkJCWJicFZhbHVlICY9ICh+MHgxOCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsIGJicFZhbHVlKTsKKwkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfMjA7CisJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCQlBc2ljTG9ja0NoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCV18yMCwgQ2hhbm5lbCglZClcbiIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCQl9CisJCS8vIEVuYWJsZSBSeCB3aXRoIHByb21pc2N1b3VzIHJlY2VwdGlvbgorCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFJYX0ZJTFRSX0NGRywgMHgzKTsKKwkJLy8gQVNJQyBzdXBwb3JzdHMgc25pZmZlciBmdW5jdGlvbiB3aXRoIHJlcGxhY2luZyBSU1NJIHdpdGggdGltZXN0YW1wLgorCQkvL1JUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJCS8vVmFsdWUgfD0gKDB4ODApOworCQkvL1JUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CisJCS8vIGRpc2FibGUgc3luYworCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgQkNOX1RJTUVfQ0ZHLCAmY3NyLndvcmQpOworCQljc3IuZmllbGQuYkJlYWNvbkdlbiA9IDA7CisJCWNzci5maWVsZC5iVEJUVEVuYWJsZSA9IDA7CisJCWNzci5maWVsZC5Uc2ZTeW5jTW9kZSA9IDA7CisJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgQkNOX1RJTUVfQ0ZHLCBjc3Iud29yZCk7CisKKwkJcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID0gQlNTX01PTklUT1I7CisgICAgICAgIHBBZGFwdGVyLT5uZXRfZGV2LT50eXBlID0gQVJQSFJEX0lFRUU4MDIxMV9QUklTTTsgLy9BUlBIUkRfSUVFRTgwMjExOyAvLyBJRUVFODAyMTEKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PlNldF9OZXR3b3JrVHlwZV9Qcm9jOjooTU9OSVRPUilcbiIpKTsKKyAgICB9CisKKyAgICAvLyBSZXNldCBSYWxpbmsgc3VwcGxpY2FudCB0byBub3QgdXNlLCBpdCB3aWxsIGJlIHNldCB0byBzdGFydCB3aGVuIFVJIHNldCBQTUsga2V5CisgICAgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX05PVFVTRTsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9OZXR3b3JrVHlwZV9Qcm9jOjooTmV0d29ya1R5cGU9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUpKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBBdXRoZW50aWNhdGlvbiBtb2RlCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0F1dGhNb2RlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpZiAoKHN0cmNtcChhcmcsICJXRVBBVVRPIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3ZXBhdXRvIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoOworICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiT1BFTiIpID09IDApIHx8IChzdHJjbXAoYXJnLCAib3BlbiIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIlNIQVJFRCIpID09IDApIHx8IChzdHJjbXAoYXJnLCAic2hhcmVkIikgPT0gMCkpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQ7CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXUEFQU0siKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndwYXBzayIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLOworICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV1BBTk9ORSIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid3Bhbm9uZSIpID09IDApKQorICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldQQTJQU0siKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndwYTJwc2siKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7CisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV1BBIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGEiKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTsKKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldQQTIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndwYTIiKSA9PSAwKSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI7CisjZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BdXRoTW9kZV9Qcm9jOjooQXV0aE1vZGU9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlKSk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgRW5jcnlwdGlvbiBUeXBlCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0VuY3J5cFR5cGVfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGlmICgoc3RyY21wKGFyZywgIk5PTkUiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIm5vbmUiKSA9PSAwKSkKKyAgICB7CisgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgICAgID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgICAgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgICA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKyAgICB9CisgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXRVAiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndlcCIpID09IDApKQorICAgIHsKKyAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgICAgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyICAgID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisJICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgICA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworICAgIH0KKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIlRLSVAiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgInRraXAiKSA9PSAwKSkKKyAgICB7CisgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCSAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICAgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworICAgIH0KKyAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIkFFUyIpID09IDApIHx8IChzdHJjbXAoYXJnLCAiYWVzIikgPT0gMCkpCisgICAgeworICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA8IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgICAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyICAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKwkgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9FbmNyeXBUeXBlX1Byb2M6OihFbmNyeXBUeXBlPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMpKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBEZWZhdWx0IEtleSBJRAorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9EZWZhdWx0S2V5SURfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUlkeDsKKworICAgIEtleUlkeCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7CisgICAgaWYoKEtleUlkeCA+PSAxICkgJiYgKEtleUlkeCA8PSA0KSkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAoVUNIQVIpIChLZXlJZHggLSAxICk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9EZWZhdWx0S2V5SURfUHJvYzo6KERlZmF1bHRLZXlJRD0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkKSk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV0VQIEtFWTEKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfS2V5MV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5TGVuOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnPUNJUEhFUl9XRVA2NDsKKworICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgIEtleUxlbiA9IHN0cmxlbihhcmcpOworCisgICAgc3dpdGNoIChLZXlMZW4pCisgICAgeworICAgICAgICBjYXNlIDU6IC8vd2VwIDQwIEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjooS2V5MT0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTA6IC8vd2VwIDQwIEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkxX1Byb2M6OihLZXkxPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTM6IC8vd2VwIDEwNCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkxX1Byb2M6OihLZXkxPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyNjogLy93ZXAgMTA0IEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjooS2V5MT0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvL0ludmFsaWQgYXJndW1lbnQKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkxX1Byb2M6OkludmFsaWQgYXJndW1lbnQgKD0lcylcbiIsIGFyZykpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCisgICAgLy8gU2V0IGtleXMgKGludG8gQVNJQykKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIDsgICAvLyBub3Qgc3VwcG9ydAorICAgIGVsc2UgICAgLy8gT2xkIFdFUCBzdHVmZgorICAgIHsKKyAgICAgICAgQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXRVAgS0VZMgorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworSU5UIFNldF9LZXkyX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlMZW47CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGc9Q0lQSEVSX1dFUDY0OworCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgS2V5TGVuID0gc3RybGVuKGFyZyk7CisKKyAgICBzd2l0Y2ggKEtleUxlbikKKyAgICB7CisgICAgICAgIGNhc2UgNTogLy93ZXAgNDAgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkyX1Byb2M6OihLZXkyPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMDogLy93ZXAgNDAgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTJfUHJvYzo6KEtleTI9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMzogLy93ZXAgMTA0IEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTJfUHJvYzo6KEtleTI9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI2OiAvL3dlcCAxMDQgSGV4IHR5cGUKKyAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5TGVuID0gS2V5TGVuIC8gMiA7CisgICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5LZXksIEtleUxlbiAvIDIpOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkyX1Byb2M6OihLZXkyPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8vSW52YWxpZCBhcmd1bWVudAorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTJfUHJvYzo6SW52YWxpZCBhcmd1bWVudCAoPSVzKVxuIiwgYXJnKSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCisgICAgLy8gU2V0IGtleXMgKGludG8gQVNJQykKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIDsgICAvLyBub3Qgc3VwcG9ydAorICAgIGVsc2UgICAgLy8gT2xkIFdFUCBzdHVmZgorICAgIHsKKyAgICAgICAgQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLkNpcGhlckFsZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV0VQIEtFWTMKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfS2V5M19Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5TGVuOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnPUNJUEhFUl9XRVA2NDsKKworICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKKworICAgIEtleUxlbiA9IHN0cmxlbihhcmcpOworCisgICAgc3dpdGNoIChLZXlMZW4pCisgICAgeworICAgICAgICBjYXNlIDU6IC8vd2VwIDQwIEFzY2lpIHR5cGUKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5TGVuID0gS2V5TGVuOworICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5LCBhcmcsIEtleUxlbik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5M19Qcm9jOjooS2V5Mz0lcyBhbmQgdHlwZT1Bc2NpaSlcbiIsIGFyZykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTA6IC8vd2VwIDQwIEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkzX1Byb2M6OihLZXkzPSVzIGFuZCB0eXBlPUhleClcbiIsIGFyZykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTM6IC8vd2VwIDEwNCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkzX1Byb2M6OihLZXkzPSVzIGFuZCB0eXBlPUFzY2lpKVxuIiwgYXJnKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyNjogLy93ZXAgMTA0IEhleCB0eXBlCisgICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleUxlbiA9IEtleUxlbiAvIDIgOworICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5LCBLZXlMZW4gLyAyKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5M19Qcm9jOjooS2V5Mz0lcyBhbmQgdHlwZT1IZXgpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvL0ludmFsaWQgYXJndW1lbnQKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkzX1Byb2M6OkludmFsaWQgYXJndW1lbnQgKD0lcylcbiIsIGFyZykpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKworICAgIC8vIFNldCBrZXlzIChpbnRvIEFTSUMpCisgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorICAgICAgICA7ICAgLy8gbm90IHN1cHBvcnQKKyAgICBlbHNlICAgIC8vIE9sZCBXRVAgc3R1ZmYKKyAgICB7CisgICAgICAgIEFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5DaXBoZXJBbGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdFUCBLRVk0CisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X0tleTRfUHJvYygKKyAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUxlbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZz1DSVBIRVJfV0VQNjQ7CisKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCisgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCisKKyAgICBLZXlMZW4gPSBzdHJsZW4oYXJnKTsKKworICAgIHN3aXRjaCAoS2V5TGVuKQorICAgIHsKKyAgICAgICAgY2FzZSA1OiAvL3dlcCA0MCBBc2NpaSB0eXBlCisgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleUxlbiA9IEtleUxlbjsKKyAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleSwgYXJnLCBLZXlMZW4pOworICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6KEtleTQ9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEwOiAvL3dlcCA0MCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5NF9Qcm9jOjooS2V5ND0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEzOiAvL3dlcCAxMDQgQXNjaWkgdHlwZQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXlMZW4gPSBLZXlMZW47CisgICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksIGFyZywgS2V5TGVuKTsKKyAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5NF9Qcm9jOjooS2V5ND0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjY6IC8vd2VwIDEwNCBIZXggdHlwZQorICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKKyAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleSwgS2V5TGVuIC8gMik7CisgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6KEtleTQ9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogLy9JbnZhbGlkIGFyZ3VtZW50CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5NF9Qcm9jOjpJbnZhbGlkIGFyZ3VtZW50ICg9JXMpXG4iLCBhcmcpKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisKKyAgICAvLyBTZXQga2V5cyAoaW50byBBU0lDKQorICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKyAgICAgICAgOyAgIC8vIG5vdCBzdXBwb3J0CisgICAgZWxzZSAgICAvLyBPbGQgV0VQIHN0dWZmCisgICAgeworICAgICAgICBBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uQ2lwaGVyQWxnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdQQSBQU0sga2V5CisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X1dQQVBTS19Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgVUNIQVIgICAgICAgICAgICAgICAgICAga2V5TWF0ZXJpYWxbNDBdOworCisgICAgaWYgKChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgJiYKKyAgICAgICAgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgJiYKKwkgICAgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKwkJKQorICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1dQQVBTS19Qcm9jOjooV1BBUFNLPSVzKVxuIiwgYXJnKSk7CisKKyAgICBOZGlzWmVyb01lbW9yeShrZXlNYXRlcmlhbCwgNDApOworCisgICAgaWYgKChzdHJsZW4oYXJnKSA8IDgpIHx8IChzdHJsZW4oYXJnKSA+IDY0KSkKKyAgICB7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldCBmYWlsZWQhIShXUEFQU0s9JXMpLCBXUEFQU0sga2V5LXN0cmluZyByZXF1aXJlZCA4IH4gNjQgY2hhcmFjdGVycyBcbiIsIGFyZykpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKHN0cmxlbihhcmcpID09IDY0KQorICAgIHsKKyAgICAgICAgQXRvSChhcmcsIGtleU1hdGVyaWFsLCAzMik7CisgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TdGFDZmcuUE1LLCBrZXlNYXRlcmlhbCwgMzIpOworCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFBhc3N3b3JkSGFzaCgoY2hhciAqKWFyZywgcEFkYXB0ZXItPk1sbWVBdXguU3NpZCwgcEFkYXB0ZXItPk1sbWVBdXguU3NpZExlbiwga2V5TWF0ZXJpYWwpOworICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLlBNSywga2V5TWF0ZXJpYWwsIDMyKTsKKyAgICB9CisKKworCisgICAgaWYocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQyAmJgorICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKyAgICB7CisgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBTdGFydCBTVEEgc3VwcGxpY2FudCBzdGF0ZSBtYWNoaW5lCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19TVEFSVDsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgUG93ZXIgU2F2aW5nIG1vZGUKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0lOVCBTZXRfUFNNb2RlX1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKKyAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK3sKKyAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19JTkZSQSkKKyAgICB7CisgICAgICAgIGlmICgoc3RyY21wKGFyZywgIk1heF9QU1AiKSA9PSAwKSB8fAorCQkJKHN0cmNtcChhcmcsICJtYXhfcHNwIikgPT0gMCkgfHwKKwkJCShzdHJjbXAoYXJnLCAiTUFYX1BTUCIpID09IDApKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBkbyBOT1QgdHVybiBvbiBQU00gYml0IGhlcmUsIHdhaXQgdW50aWwgTWxtZUNoZWNrRm9yUHNtQ2hhbmdlKCkKKyAgICAgICAgICAgIC8vIHRvIGV4Y2x1ZGUgY2VydGFpbiBzaXR1YXRpb25zLgorICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlTUFYX1BTUDsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlTUFYX1BTUDsKKyAgICAgICAgICAgIE9QU1RBVFVTX1NFVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCA9IDU7CisKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIkZhc3RfUFNQIikgPT0gMCkgfHwKKwkJCQkgKHN0cmNtcChhcmcsICJmYXN0X3BzcCIpID09IDApIHx8CisgICAgICAgICAgICAgICAgIChzdHJjbXAoYXJnLCAiRkFTVF9QU1AiKSA9PSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZG8gTk9UIHR1cm4gb24gUFNNIGJpdCBoZXJlLCB3YWl0IHVudGlsIE1sbWVDaGVja0ZvclBzbUNoYW5nZSgpCisgICAgICAgICAgICAvLyB0byBleGNsdWRlIGNlcnRhaW4gc2l0dWF0aW9ucy4KKyAgICAgICAgICAgIE9QU1RBVFVTX1NFVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7CisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUDsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1A7CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCA9IDM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJMZWdhY3lfUFNQIikgPT0gMCkgfHwKKyAgICAgICAgICAgICAgICAgKHN0cmNtcChhcmcsICJsZWdhY3lfcHNwIikgPT0gMCkgfHwKKyAgICAgICAgICAgICAgICAgKHN0cmNtcChhcmcsICJMRUdBQ1lfUFNQIikgPT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tGb3JQc21DaGFuZ2UoKQorICAgICAgICAgICAgLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCisgICAgICAgICAgICBPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOworICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKKyAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlTGVnYWN5X1BTUDsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlTGVnYWN5X1BTUDsKKyAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gMzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vRGVmYXVsdCBOZGlzODAyXzExUG93ZXJNb2RlQ0FNCisgICAgICAgICAgICAvLyBjbGVhciBQU00gYml0IGltbWVkaWF0ZWx5CisgICAgICAgICAgICBNbG1lU2V0UHNtQml0KHBBZGFwdGVyLCBQV1JfQUNUSVZFKTsKKyAgICAgICAgICAgIE9QU1RBVFVTX1NFVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7CisgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQorICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVDQU07CisgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTTsKKyAgICAgICAgfQorCisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9QU01vZGVfUHJvYzo6KFBTTW9kZT0lbGQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUpKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKworICAgIHJldHVybiBUUlVFOworfQorCisjaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAorLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgV3BhU3VwcG9ydCBmbGFnLgorICAgIFZhbHVlOgorICAgICAgICAwOiBEcml2ZXIgaWdub3JlIHdwYV9zdXBwbGljYW50LgorICAgICAgICAxOiB3cGFfc3VwcGxpY2FudCBpbml0aWF0ZXMgc2Nhbm5pbmcgYW5kIEFQIHNlbGVjdGlvbi4KKyAgICAgICAgMjogZHJpdmVyIHRha2VzIGNhcmUgb2Ygc2Nhbm5pbmcsIEFQIHNlbGVjdGlvbiwgYW5kIElFRUUgODAyLjExIGFzc29jaWF0aW9uIHBhcmFtZXRlcnMuCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitJTlQgU2V0X1dwYV9TdXBwb3J0KAorICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKworICAgIGlmICggc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAwKQorICAgICAgICBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFOworICAgIGVsc2UgaWYgKCBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDEpCisgICAgICAgIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IFdQQV9TVVBQTElDQU5UX0VOQUJMRTsKKyAgICBlbHNlIGlmICggc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAyKQorICAgICAgICBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSBXUEFfU1VQUExJQ0FOVF9FTkFCTEVfV0lUSF9XRUJfVUk7CisgICAgZWxzZQorICAgICAgICBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1dwYV9TdXBwb3J0OjooV3BhU3VwcGxpY2FudFVQPSVkKVxuIiwgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKSk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCisKKyNpZmRlZiBEQkcKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgUmVhZCAvIFdyaXRlIE1BQworICAgIEFyZ3VtZW50czoKKyAgICAgICAgcEFkYXB0ZXIgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKyAgICAgICAgd3JxICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlvY3RsIGFyZ3VtZW50CisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIE5vbmUKKworICAgIE5vdGU6CisgICAgICAgIFVzYWdlOgorICAgICAgICAgICAgICAgMS4pIGl3cHJpdiByYTAgbWFjIDAgICAgICAgID09PiByZWFkIE1BQyB3aGVyZSBBZGRyPTB4MAorICAgICAgICAgICAgICAgMi4pIGl3cHJpdiByYTAgbWFjIDA9MTIgICAgID09PiB3cml0ZSBNQUMgd2hlcmUgQWRkcj0weDAsIHZhbHVlPTEyCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitWT0lEIFJUTVBJb2N0bE1BQygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCXN0cnVjdCBpd3JlcQkqd3JxKQoreworCUNIQVIJCQkJKnRoaXNfY2hhcjsKKwlDSEFSCQkJCSp2YWx1ZTsKKwlJTlQJCQkJCWogPSAwLCBrID0gMDsKKwlDSEFSCQkJCW1zZ1sxMDI0XTsKKwlDSEFSCQkJCWFyZ1syNTVdOworCVVMT05HCQkJCW1hY0FkZHIgPSAwOworCVVDSEFSCQkJCXRlbXBbMTZdLCB0ZW1wMlsxNl07CisJVUlOVDMyCQkJCW1hY1ZhbHVlID0gMDsKKwlJTlQJCQkJCVN0YXR1czsKKworCisJbWVtc2V0KG1zZywgMHgwMCwgMTAyNCk7CisJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCA+IDEpIC8vTm8gcGFyYW1ldGVycy4KKwl7CisJICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKGFyZywgd3JxLT51LmRhdGEucG9pbnRlciwgKHdycS0+dS5kYXRhLmxlbmd0aCA+IDI1NSkgPyAyNTUgOiB3cnEtPnUuZGF0YS5sZW5ndGgpOworCQlzcHJpbnRmKG1zZywgIlxuIik7CisKKwkJLy9QYXJzaW5nIFJlYWQgb3IgV3JpdGUKKwkgICAgdGhpc19jaGFyID0gYXJnOworCQlpZiAoISp0aGlzX2NoYXIpCisJCQlnb3RvIG5leHQ7CisKKwkJaWYgKCh2YWx1ZSA9IHJ0c3RyY2hyKHRoaXNfY2hhciwgJz0nKSkgIT0gTlVMTCkKKwkJCSp2YWx1ZSsrID0gMDsKKworCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpCisJCXsgLy9SZWFkCisJCQkvLyBTYW5pdHkgY2hlY2sKKwkJCWlmKHN0cmxlbih0aGlzX2NoYXIpID4gNCkKKwkJCQlnb3RvIG5leHQ7CisKKwkJCWogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJaWYodGhpc19jaGFyW2pdID4gJ2YnIHx8IHRoaXNfY2hhcltqXSA8ICcwJykKKwkJCQkJcmV0dXJuOworCQkJfQorCisJCQkvLyBNYWMgQWRkcgorCQkJayA9IGogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJdGhpc19jaGFyWzQtaytqXSA9IHRoaXNfY2hhcltqXTsKKwkJCX0KKworCQkJd2hpbGUoayA8IDQpCisJCQkJdGhpc19jaGFyWzMtaysrXT0nMCc7CisJCQl0aGlzX2NoYXJbNF09J1wwJzsKKworCQkJaWYoc3RybGVuKHRoaXNfY2hhcikgPT0gNCkKKwkJCXsKKwkJCQlBdG9IKHRoaXNfY2hhciwgdGVtcCwgMik7CisJCQkJbWFjQWRkciA9ICp0ZW1wKjI1NiArIHRlbXBbMV07CisJCQkJaWYgKG1hY0FkZHIgPCAweEZGRkYpCisJCQkJeworCQkJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgbWFjQWRkciwgJm1hY1ZhbHVlKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWFjQWRkcj0lbHgsIE1hY1ZhbHVlPSV4XG4iLCBtYWNBZGRyLCBtYWNWYWx1ZSkpOworCQkJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIlsweCUwOGxYXTolMDhYICAiLCBtYWNBZGRyICwgbWFjVmFsdWUpOworCQkJCX0KKwkJCQllbHNlCisJCQkJey8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBiYnAKKwkJCQkJZ290byBuZXh0OworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsgLy9Xcml0ZQorCQkJbWVtY3B5KCZ0ZW1wMiwgdmFsdWUsIHN0cmxlbih2YWx1ZSkpOworCQkJdGVtcDJbc3RybGVuKHZhbHVlKV0gPSAnXDAnOworCisJCQkvLyBTYW5pdHkgY2hlY2sKKwkJCWlmKChzdHJsZW4odGhpc19jaGFyKSA+IDQpIHx8IHN0cmxlbih0ZW1wMikgPiA4KQorCQkJCWdvdG8gbmV4dDsKKworCQkJaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQlpZih0aGlzX2NoYXJbal0gPiAnZicgfHwgdGhpc19jaGFyW2pdIDwgJzAnKQorCQkJCQlyZXR1cm47CisJCQl9CisKKwkJCWogPSBzdHJsZW4odGVtcDIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQlpZih0ZW1wMltqXSA+ICdmJyB8fCB0ZW1wMltqXSA8ICcwJykKKwkJCQkJcmV0dXJuOworCQkJfQorCisJCQkvL01BQyBBZGRyCisJCQlrID0gaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQl0aGlzX2NoYXJbNC1rK2pdID0gdGhpc19jaGFyW2pdOworCQkJfQorCisJCQl3aGlsZShrIDwgNCkKKwkJCQl0aGlzX2NoYXJbMy1rKytdPScwJzsKKwkJCXRoaXNfY2hhcls0XT0nXDAnOworCisJCQkvL01BQyB2YWx1ZQorCQkJayA9IGogPSBzdHJsZW4odGVtcDIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQl0ZW1wMls4LWsral0gPSB0ZW1wMltqXTsKKwkJCX0KKworCQkJd2hpbGUoayA8IDgpCisJCQkJdGVtcDJbNy1rKytdPScwJzsKKwkJCXRlbXAyWzhdPSdcMCc7CisKKwkJCXsKKwkJCQlBdG9IKHRoaXNfY2hhciwgdGVtcCwgMik7CisJCQkJbWFjQWRkciA9ICp0ZW1wKjI1NiArIHRlbXBbMV07CisKKwkJCQlBdG9IKHRlbXAyLCB0ZW1wLCA0KTsKKwkJCQltYWNWYWx1ZSA9ICp0ZW1wKjI1NioyNTYqMjU2ICsgdGVtcFsxXSoyNTYqMjU2ICsgdGVtcFsyXSoyNTYgKyB0ZW1wWzNdOworCisJCQkJLy8gZGVidWcgbW9kZQorCQkJCWlmIChtYWNBZGRyID09IChIV19ERUJVR19TRVRUSU5HX0JBU0UgKyA0KSkKKwkJCQl7CisJCQkJCS8vIDB4MmJmNDogYnl0ZTAgbm9uLXplcm86IGVuYWJsZSBSMTcgdHVuaW5nLCAwOiBkaXNhYmxlIFIxNyB0dW5pbmcKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1hY1ZhbHVlICYgMHgwMDAwMDBmZikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkJicFR1bmluZy5iRW5hYmxlID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgidHVybiBvbiBSMTcgdHVuaW5nXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBSNjY7CisgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+QmJwVHVuaW5nLmJFbmFibGUgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFI2NiA9IDB4MjYgKyBHRVRfTE5BX0dBSU4ocEFkYXB0ZXIpOworI2lmZGVmIFJBTElOS19BVEUKKwkJCQkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQorCQkJCQkJeworCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I2NiwgKDB4MjYgKyBHRVRfTE5BX0dBSU4ocEFkYXB0ZXIpKSk7CisJCQkJCQl9CisJCQkJCQllbHNlCisjZW5kaWYgLy8gUkFMSU5LX0FURSAvLworCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I2NiwgKDB4MjYgKyBHRVRfTE5BX0dBSU4ocEFkYXB0ZXIpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoInR1cm4gb2ZmIFIxNyB0dW5pbmcsIHJlc3RvcmUgdG8gMHglMDJ4XG4iLCBSNjYpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCQkJCQlyZXR1cm47CisJCQkJfQorCisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWFjQWRkcj0lMDJseCwgTWFjVmFsdWU9MHgleFxuIiwgbWFjQWRkciwgbWFjVmFsdWUpKTsKKworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgbWFjQWRkciwgbWFjVmFsdWUpOworCQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiWzB4JTA4bFhdOiUwOFggICIsIG1hY0FkZHIsIG1hY1ZhbHVlKTsKKwkJCX0KKwkJfQorCX0KK25leHQ6CisJaWYoc3RybGVuKG1zZykgPT0gMSkKKwkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICI9PT0+RXJyb3IgY29tbWFuZCBmb3JtYXQhIik7CisKKwkvLyBDb3B5IHRoZSBpbmZvcm1hdGlvbiBpbnRvIHRoZSB1c2VyIGJ1ZmZlcgorCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihtc2cpOworCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBtc2csIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT1SVE1QSW9jdGxNQUNcblxuIikpOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFJlYWQgLyBXcml0ZSBFMlBST00KKyAgICBBcmd1bWVudHM6CisgICAgICAgIHBBZGFwdGVyICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgICAgIHdycSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpb2N0bCBhcmd1bWVudAorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOb25lCisKKyAgICBOb3RlOgorICAgICAgICBVc2FnZToKKyAgICAgICAgICAgICAgIDEuKSBpd3ByaXYgcmEwIGUycCAwICAgICAJPT0+IHJlYWQgRTJQUk9NIHdoZXJlIEFkZHI9MHgwCisgICAgICAgICAgICAgICAyLikgaXdwcml2IHJhMCBlMnAgMD0xMjM0ICAgID09PiB3cml0ZSBFMlBST00gd2hlcmUgQWRkcj0weDAsIHZhbHVlPTEyMzQKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK1ZPSUQgUlRNUElvY3RsRTJQUk9NKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4Jc3RydWN0IGl3cmVxCSp3cnEpCit7CisJQ0hBUgkJCQkqdGhpc19jaGFyOworCUNIQVIJCQkJKnZhbHVlOworCUlOVAkJCQkJaiA9IDAsIGsgPSAwOworCUNIQVIJCQkJbXNnWzEwMjRdOworCUNIQVIJCQkJYXJnWzI1NV07CisJVVNIT1JUCQkJCWVlcEFkZHIgPSAwOworCVVDSEFSCQkJCXRlbXBbMTZdLCB0ZW1wMlsxNl07CisJVVNIT1JUCQkJCWVlcFZhbHVlOworCWludAkJCQkJU3RhdHVzOworCisKKwltZW1zZXQobXNnLCAweDAwLCAxMDI0KTsKKwlpZiAod3JxLT51LmRhdGEubGVuZ3RoID4gMSkgLy9ObyBwYXJhbWV0ZXJzLgorCXsKKwkgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoYXJnLCB3cnEtPnUuZGF0YS5wb2ludGVyLCAod3JxLT51LmRhdGEubGVuZ3RoID4gMjU1KSA/IDI1NSA6IHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCXNwcmludGYobXNnLCAiXG4iKTsKKworCSAgICAvL1BhcnNpbmcgUmVhZCBvciBXcml0ZQorCQl0aGlzX2NoYXIgPSBhcmc7CisKKworCQlpZiAoISp0aGlzX2NoYXIpCisJCQlnb3RvIG5leHQ7CisKKwkJaWYgKCh2YWx1ZSA9IHJ0c3RyY2hyKHRoaXNfY2hhciwgJz0nKSkgIT0gTlVMTCkKKwkJCSp2YWx1ZSsrID0gMDsKKworCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpCisJCXsgLy9SZWFkCisKKwkJCS8vIFNhbml0eSBjaGVjaworCQkJaWYoc3RybGVuKHRoaXNfY2hhcikgPiA0KQorCQkJCWdvdG8gbmV4dDsKKworCQkJaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQlpZih0aGlzX2NoYXJbal0gPiAnZicgfHwgdGhpc19jaGFyW2pdIDwgJzAnKQorCQkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8vIEUyUFJPTSBhZGRyCisJCQlrID0gaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQl0aGlzX2NoYXJbNC1rK2pdID0gdGhpc19jaGFyW2pdOworCQkJfQorCisJCQl3aGlsZShrIDwgNCkKKwkJCQl0aGlzX2NoYXJbMy1rKytdPScwJzsKKwkJCXRoaXNfY2hhcls0XT0nXDAnOworCisJCQlpZihzdHJsZW4odGhpc19jaGFyKSA9PSA0KQorCQkJeworCQkJCUF0b0godGhpc19jaGFyLCB0ZW1wLCAyKTsKKwkJCQllZXBBZGRyID0gKnRlbXAqMjU2ICsgdGVtcFsxXTsKKwkJCQlpZiAoZWVwQWRkciA8IDB4RkZGRikKKwkJCQl7CisJCQkJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZGFwdGVyLCBlZXBBZGRyLCBlZXBWYWx1ZSk7CisJCQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiWzB4JTA0WF06MHglMDRYICAiLCBlZXBBZGRyICwgZWVwVmFsdWUpOworCQkJCX0KKwkJCQllbHNlCisJCQkJey8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBiYnAKKwkJCQkJZ290byBuZXh0OworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsgLy9Xcml0ZQorCQkJbWVtY3B5KCZ0ZW1wMiwgdmFsdWUsIHN0cmxlbih2YWx1ZSkpOworCQkJdGVtcDJbc3RybGVuKHZhbHVlKV0gPSAnXDAnOworCisJCQkvLyBTYW5pdHkgY2hlY2sKKwkJCWlmKChzdHJsZW4odGhpc19jaGFyKSA+IDQpIHx8IHN0cmxlbih0ZW1wMikgPiA4KQorCQkJCWdvdG8gbmV4dDsKKworCQkJaiA9IHN0cmxlbih0aGlzX2NoYXIpOworCQkJd2hpbGUoai0tID4gMCkKKwkJCXsKKwkJCQlpZih0aGlzX2NoYXJbal0gPiAnZicgfHwgdGhpc19jaGFyW2pdIDwgJzAnKQorCQkJCQlyZXR1cm47CisJCQl9CisJCQlqID0gc3RybGVuKHRlbXAyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJaWYodGVtcDJbal0gPiAnZicgfHwgdGVtcDJbal0gPCAnMCcpCisJCQkJCXJldHVybjsKKwkJCX0KKworCQkJLy9NQUMgQWRkcgorCQkJayA9IGogPSBzdHJsZW4odGhpc19jaGFyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJdGhpc19jaGFyWzQtaytqXSA9IHRoaXNfY2hhcltqXTsKKwkJCX0KKworCQkJd2hpbGUoayA8IDQpCisJCQkJdGhpc19jaGFyWzMtaysrXT0nMCc7CisJCQl0aGlzX2NoYXJbNF09J1wwJzsKKworCQkJLy9NQUMgdmFsdWUKKwkJCWsgPSBqID0gc3RybGVuKHRlbXAyKTsKKwkJCXdoaWxlKGotLSA+IDApCisJCQl7CisJCQkJdGVtcDJbNC1rK2pdID0gdGVtcDJbal07CisJCQl9CisKKwkJCXdoaWxlKGsgPCA0KQorCQkJCXRlbXAyWzMtaysrXT0nMCc7CisJCQl0ZW1wMls0XT0nXDAnOworCisJCQlBdG9IKHRoaXNfY2hhciwgdGVtcCwgMik7CisJCQllZXBBZGRyID0gKnRlbXAqMjU2ICsgdGVtcFsxXTsKKworCQkJQXRvSCh0ZW1wMiwgdGVtcCwgMik7CisJCQllZXBWYWx1ZSA9ICp0ZW1wKjI1NiArIHRlbXBbMV07CisKKwkJCVJUMjh4eF9FRVBST01fV1JJVEUxNihwQWRhcHRlciwgZWVwQWRkciwgZWVwVmFsdWUpOworCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICJbMHglMDJYXTolMDJYICAiLCBlZXBBZGRyLCBlZXBWYWx1ZSk7CisJCX0KKwl9CituZXh0OgorCWlmKHN0cmxlbihtc2cpID09IDEpCisJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiPT09PkVycm9yIGNvbW1hbmQgZm9ybWF0ISIpOworCisKKwkvLyBDb3B5IHRoZSBpbmZvcm1hdGlvbiBpbnRvIHRoZSB1c2VyIGJ1ZmZlcgorCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihtc2cpOworCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBtc2csIHdycS0+dS5kYXRhLmxlbmd0aCk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT1SVE1QSW9jdGxFMlBST01cbiIpKTsKK30KKyNlbmRpZiAvLyBEQkcgLy8KKworCisKKworSU5UIFNldF9UR25XaWZpVGVzdF9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAorICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQoreworICAgIGlmIChzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDApCisgICAgICAgIHBBZC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCA9IEZBTFNFOworICAgIGVsc2UKKyAgICAgICAgcEFkLT5TdGFDZmcuYlRHbldpZmlUZXN0ID0gVFJVRTsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklGIFNldF9UR25XaWZpVGVzdF9Qcm9jOjooYlRHbldpZmlUZXN0PSVkKVxuIiwgcEFkLT5TdGFDZmcuYlRHbldpZmlUZXN0KSk7CisJcmV0dXJuIFRSVUU7Cit9CisKK0lOVCBTZXRfTG9uZ1JldHJ5TGltaXRfUHJvYygKKwlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAorCUlOCVBVQ0hBUgkJCWFyZykKK3sKKwlUWF9SVFlfQ0ZHX1NUUlVDCXR4X3J0eV9jZmc7CisJVUNIQVIJCQkJTG9uZ1JldHJ5TGltaXQgPSAoVUNIQVIpc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCAmdHhfcnR5X2NmZy53b3JkKTsKKwl0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdCA9IExvbmdSZXRyeUxpbWl0OworCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgdHhfcnR5X2NmZy53b3JkKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRiBTZXRfTG9uZ1JldHJ5TGltaXRfUHJvYzo6KHR4X3J0eV9jZmc9MHgleClcbiIsIHR4X3J0eV9jZmcud29yZCkpOworCXJldHVybiBUUlVFOworfQorCitJTlQgU2V0X1Nob3J0UmV0cnlMaW1pdF9Qcm9jKAorCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCisJSU4JUFVDSEFSCQkJYXJnKQoreworCVRYX1JUWV9DRkdfU1RSVUMJdHhfcnR5X2NmZzsKKwlVQ0hBUgkJCQlTaG9ydFJldHJ5TGltaXQgPSAoVUNIQVIpc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCAmdHhfcnR5X2NmZy53b3JkKTsKKwl0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UnR5TGltaXQgPSBTaG9ydFJldHJ5TGltaXQ7CisJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCB0eF9ydHlfY2ZnLndvcmQpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklGIFNldF9TaG9ydFJldHJ5TGltaXRfUHJvYzo6KHR4X3J0eV9jZmc9MHgleClcbiIsIHR4X3J0eV9jZmcud29yZCkpOworCXJldHVybiBUUlVFOworfQorCisjaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAorSU5UIFNldF9JZWVlODAyMTFkQ2xpZW50TW9kZV9Qcm9jKAorICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaWYgKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMCkKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSA9IFJ0ODAyXzExX0RfTm9uZTsKKyAgICBlbHNlIGlmIChzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDEpCisgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUgPSBSdDgwMl8xMV9EX0ZsZXhpYmxlOworICAgIGVsc2UgaWYgKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMikKKyAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSA9IFJ0ODAyXzExX0RfU3RyaWN0OworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0llZWU4MDJkTW9kZV9Qcm9jOjooSUVFRUUwMjExZE1vZGU9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlKSk7CisgICAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLworCisjaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVAorSU5UIFNldF9DYXJyaWVyRGV0ZWN0X1Byb2MoCisgICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCisgICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCit7CisgICAgaWYgKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMCkKKyAgICAgICAgcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPSBGQUxTRTsKKyAgICBlbHNlCisgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID0gVFJVRTsKKworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklGIFNldF9DYXJyaWVyRGV0ZWN0X1Byb2M6OihDYXJyaWVyRGV0ZWN0LkVuYWJsZT0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlKSk7CisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLworCisKK0lOVAlTaG93X0FkaG9jX01hY1RhYmxlX1Byb2MoCisJSU4JUFJUTVBfQURBUFRFUglwQWQsCisJSU4JUENIQVIJCQlleHRyYSkKK3sKKwlJTlQgaTsKKworCXNwcmludGYoZXh0cmEsICJcbiIpOworCisjaWZkZWYgRE9UMTFfTl9TVVBQT1JUCisJc3ByaW50ZihleHRyYSwgIiVzSFQgT3BlcmF0aW5nIE1vZGUgOiAlZFxuIiwgZXh0cmEsIHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSk7CisjZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCisKKwlzcHJpbnRmKGV4dHJhLCAiJXNcbiUtMTlzJS00cyUtNHMlLTdzJS03cyUtN3MlLTEwcyUtNnMlLTZzJS02cyUtNnNcbiIsIGV4dHJhLAorCQkJIk1BQyIsICJBSUQiLCAiQlNTIiwgIlJTU0kwIiwgIlJTU0kxIiwgIlJTU0kyIiwgIlBoTWQiLCAiQlciLCAiTUNTIiwgIlNHSSIsICJTVEJDIik7CisKKwlmb3IgKGk9MTsgaTxNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQorCXsKKwkJUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtpXTsKKworCQlpZiAoc3RybGVuKGV4dHJhKSA+IChJV19QUklWX1NJWkVfTUFTSyAtIDMwKSkKKwkJICAgIGJyZWFrOworCQlpZiAoKHBFbnRyeS0+VmFsaWRBc0NMSSB8fCBwRW50cnktPlZhbGlkQXNBcENsaSkgJiYgKHBFbnRyeS0+U3N0ID09IFNTVF9BU1NPQykpCisJCXsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYICAiLCBleHRyYSwKKwkJCQlwRW50cnktPkFkZHJbMF0sIHBFbnRyeS0+QWRkclsxXSwgcEVudHJ5LT5BZGRyWzJdLAorCQkJCXBFbnRyeS0+QWRkclszXSwgcEVudHJ5LT5BZGRyWzRdLCBwRW50cnktPkFkZHJbNV0pOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS00ZCIsIGV4dHJhLCAoaW50KXBFbnRyeS0+QWlkKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtNGQiLCBleHRyYSwgKGludClwRW50cnktPmFwaWR4KTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtN2QiLCBleHRyYSwgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kwKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtN2QiLCBleHRyYSwgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kxKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtN2QiLCBleHRyYSwgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kyKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtMTBzIiwgZXh0cmEsIEdldFBoeU1vZGUocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSkpOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS02cyIsIGV4dHJhLCBHZXRCVyhwRW50cnktPkhUUGh5TW9kZS5maWVsZC5CVykpOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS02ZCIsIGV4dHJhLCBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MpOworCQkJc3ByaW50ZihleHRyYSwgIiVzJS02ZCIsIGV4dHJhLCBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJKTsKKwkJCXNwcmludGYoZXh0cmEsICIlcyUtNmQiLCBleHRyYSwgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU1RCQyk7CisJCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTEwZCwgJWQsICVkJSVcbiIsIGV4dHJhLCBwRW50cnktPkRlYnVnRklGT0NvdW50LCBwRW50cnktPkRlYnVnVHhDb3VudCwKKwkJCQkJCShwRW50cnktPkRlYnVnVHhDb3VudCkgPyAoKHBFbnRyeS0+RGVidWdUeENvdW50LXBFbnRyeS0+RGVidWdGSUZPQ291bnQpKjEwMC9wRW50cnktPkRlYnVnVHhDb3VudCkgOiAwKTsKKwkJCXNwcmludGYoZXh0cmEsICIlc1xuIiwgZXh0cmEpOworCQl9CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC93cGEuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvd3BhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEzNGFlNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvd3BhLmgKQEAgLTAsMCArMSwzNTcgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJd3BhLmgKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlOYW1lCQlEYXRlCQkJTW9kaWZpY2F0aW9uIGxvZ3MKKyovCisKKyNpZm5kZWYJX19XUEFfSF9fCisjZGVmaW5lCV9fV1BBX0hfXworCisvLyBFQVBPTCBLZXkgZGVzY3JpcHRlciBmcmFtZSBmb3JtYXQgcmVsYXRlZCBsZW5ndGgKKyNkZWZpbmUgTEVOX0tFWV9ERVNDX05PTkNFCQkJMzIKKyNkZWZpbmUgTEVOX0tFWV9ERVNDX0lWCQkJCTE2CisjZGVmaW5lIExFTl9LRVlfREVTQ19SU0MJCQk4CisjZGVmaW5lIExFTl9LRVlfREVTQ19JRAkJCQk4CisjZGVmaW5lIExFTl9LRVlfREVTQ19SRVBMQVkJCQk4CisjZGVmaW5lIExFTl9LRVlfREVTQ19NSUMJCQkxNgorCisvLyBUaGUgbGVuZ3RoIGlzIHRoZSBFQVBvTC1LZXkgZnJhbWUgZXhjZXB0IGtleSBkYXRhIGZpZWxkLgorLy8gUGxlYXNlIHJlZmVyIHRvIDgwMi4xMWktMjAwNCAsRmlndXJlIDQzdSBpbiBwLjc4CisjZGVmaW5lIExFTl9FQVBPTF9LRVlfTVNHCQkJKHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFKQorCisvLyBFQVAgQ29kZSBUeXBlLgorI2RlZmluZSBFQVBfQ09ERV9SRVFVRVNUCTEKKyNkZWZpbmUgRUFQX0NPREVfUkVTUE9OU0UJMgorI2RlZmluZSBFQVBfQ09ERV9TVUNDRVNTICAgIDMKKyNkZWZpbmUgRUFQX0NPREVfRkFJTFVSRSAgICA0CisKKy8vIEVBUE9MIGZyYW1lIFByb3RvY29sIFZlcnNpb24KKyNkZWZpbmUJRUFQT0xfVkVSCQkJCQkxCisjZGVmaW5lCUVBUE9MX1ZFUjIJCQkJCTIKKworLy8gRUFQT0wtS0VZIERlc2NyaXB0b3IgVHlwZQorI2RlZmluZQlXUEExX0tFWV9ERVNDCQkJCTB4ZmUKKyNkZWZpbmUgV1BBMl9LRVlfREVTQyAgICAgICAgICAgICAgIDB4MDIKKworLy8gS2V5IERlc2NyaXB0b3IgVmVyc2lvbiBvZiBLZXkgSW5mb3JtYXRpb24KKyNkZWZpbmUJREVTQ19UWVBFX1RLSVAJCQkJMQorI2RlZmluZQlERVNDX1RZUEVfQUVTCQkJCTIKKyNkZWZpbmUgREVTQ19UWVBFX01FU0gJCQkJMworCisjZGVmaW5lIExFTl9NU0cxXzJXQVkgICAgICAgICAgICAgICAweDdmCisjZGVmaW5lIE1BWF9MRU5fT0ZfRUFQX0hTICAgICAgICAgICAyNTYKKworI2RlZmluZSBMRU5fTUFTVEVSX0tFWQkJCQkzMgorCisvLyBFQVBPTCBFSywgTUsKKyNkZWZpbmUgTEVOX0VBUF9FSwkJCQkJMTYKKyNkZWZpbmUgTEVOX0VBUF9NSUNLCQkJCTE2CisjZGVmaW5lIExFTl9FQVBfS0VZCQkJCQkoKExFTl9FQVBfRUspKyhMRU5fRUFQX01JQ0spKQorLy8gVEtJUCBrZXkgcmVsYXRlZAorI2RlZmluZSBMRU5fUE1LSUQJCQkJCTE2CisjZGVmaW5lIExFTl9US0lQX0VLCQkJCQkxNgorI2RlZmluZSBMRU5fVEtJUF9SWE1JQ0sJCQkJOAorI2RlZmluZSBMRU5fVEtJUF9UWE1JQ0sJCQkJOAorI2RlZmluZSBMRU5fQUVTX0VLCQkJCQkxNgorI2RlZmluZSBMRU5fQUVTX0tFWQkJCQkJTEVOX0FFU19FSworI2RlZmluZSBMRU5fVEtJUF9LRVkJCQkJKChMRU5fVEtJUF9FSykrKExFTl9US0lQX1JYTUlDSykrKExFTl9US0lQX1RYTUlDSykpCisjZGVmaW5lIFRLSVBfQVBfVFhNSUNLX09GRlNFVAkJKChMRU5fRUFQX0tFWSkrKExFTl9US0lQX0VLKSkKKyNkZWZpbmUgVEtJUF9BUF9SWE1JQ0tfT0ZGU0VUCQkoVEtJUF9BUF9UWE1JQ0tfT0ZGU0VUK0xFTl9US0lQX1RYTUlDSykKKyNkZWZpbmUgVEtJUF9HVEtfTEVOR1RICQkJCSgoTEVOX1RLSVBfRUspKyhMRU5fVEtJUF9SWE1JQ0spKyhMRU5fVEtJUF9UWE1JQ0spKQorI2RlZmluZSBMRU5fUFRLCQkJCQkJKChMRU5fRUFQX0tFWSkrKExFTl9US0lQX0tFWSkpCisjZGVmaW5lIE1JTl9MRU5fT0ZfR1RLCQkJCTUKKworLy8gUlNOIElFIExlbmd0aCBkZWZpbml0aW9uCisjZGVmaW5lIE1BWF9MRU5fT0ZfUlNOSUUgICAgICAgICAJOTAKKyNkZWZpbmUgTUlOX0xFTl9PRl9SU05JRSAgICAgICAgIAk4CisKKy8vRUFQIFBhY2tldCBUeXBlCisjZGVmaW5lCUVBUFBhY2tldAkJMAorI2RlZmluZQlFQVBPTFN0YXJ0CQkxCisjZGVmaW5lCUVBUE9MTG9nb2ZmCQkyCisjZGVmaW5lCUVBUE9MS2V5CQkzCisjZGVmaW5lCUVBUE9MQVNGQWxlcnQJNAorI2RlZmluZQlFQVBUdHlwZU1heAkJNQorCisjZGVmaW5lCUVBUE9MX01TR19JTlZBTElECTAKKyNkZWZpbmUJRUFQT0xfUEFJUl9NU0dfMQkxCisjZGVmaW5lCUVBUE9MX1BBSVJfTVNHXzIJMgorI2RlZmluZQlFQVBPTF9QQUlSX01TR18zCTMKKyNkZWZpbmUJRUFQT0xfUEFJUl9NU0dfNAk0CisjZGVmaW5lCUVBUE9MX0dST1VQX01TR18xCTUKKyNkZWZpbmUJRUFQT0xfR1JPVVBfTVNHXzIJNgorCisjZGVmaW5lIFBBSVJXSVNFS0VZCQkJCQkxCisjZGVmaW5lIEdST1VQS0VZCQkJCQkwCisKKy8vIFJldHJ5IHRpbWVyIGNvdW50ZXIgaW5pdGlhbCB2YWx1ZQorI2RlZmluZSBQRUVSX01TRzFfUkVUUllfVElNRVJfQ1RSICAgICAgICAgICAwCisjZGVmaW5lIFBFRVJfTVNHM19SRVRSWV9USU1FUl9DVFIgICAgICAgICAgIDEwCisjZGVmaW5lIEdST1VQX01TRzFfUkVUUllfVElNRVJfQ1RSICAgICAgICAgIDIwCisKKworI2RlZmluZSBFQVBPTF9TVEFSVF9ESVNBQkxFCQkJCQkwCisjZGVmaW5lIEVBUE9MX1NUQVJUX1BTSwkJCQkJCTEKKyNkZWZpbmUgRUFQT0xfU1RBUlRfMVgJCQkJCQkyCisKKyNkZWZpbmUgTUlYX0NJUEhFUl9XUEFfVEtJUF9PTih4KSAgICAgICAoKCh4KSAmIDB4MDgpICE9IDApCisjZGVmaW5lIE1JWF9DSVBIRVJfV1BBX0FFU19PTih4KSAgICAgICAgKCgoeCkgJiAweDA0KSAhPSAwKQorI2RlZmluZSBNSVhfQ0lQSEVSX1dQQTJfVEtJUF9PTih4KSAgICAgICgoKHgpICYgMHgwMikgIT0gMCkKKyNkZWZpbmUgTUlYX0NJUEhFUl9XUEEyX0FFU19PTih4KSAgICAgICAoKCh4KSAmIDB4MDEpICE9IDApCisKKyNkZWZpbmUgUk9VTkRfVVAoX194LCBfX3kpIFwKKwkoKChVTE9ORykoKF9feCkrKChfX3kpLTEpKSkgJiAoKFVMT05HKX4oKF9feSktMSkpKQorCisjZGVmaW5lCUFERF9PTkVfVG9fNjRCSVRfVkFSKF9WKQkJXAorewkJCQkJCQkJCQlcCisJVUNIQVIJY250ID0gTEVOX0tFWV9ERVNDX1JFUExBWTsJXAorCWRvCQkJCQkJCQkJXAorCXsJCQkJCQkJCQlcCisJCWNudC0tOwkJCQkJCQlcCisJCV9WW2NudF0rKzsJCQkJCQlcCisJCWlmIChjbnQgPT0gMCkJCQkJCVwKKwkJCWJyZWFrOwkJCQkJCVwKKwl9d2hpbGUgKF9WW2NudF0gPT0gMCk7CQkJCVwKK30KKworI2RlZmluZSBJU19XUEFfQ0FQQUJJTElUWShhKSAgICAgICAoKChhKSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpICYmICgoYSkgPD0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0spKQorCisvLyBFQVBPTCBLZXkgSW5mb3JtYXRpb24gZGVmaW5pdGlvbiB3aXRoaW4gS2V5IGRlc2NyaXB0b3IgZm9ybWF0Cit0eXBlZGVmCXN0cnVjdCBQQUNLRUQgX0tFWV9JTkZPCit7CisjaWZkZWYgUlRfQklHX0VORElBTgorCVVDSEFSCUtleUFjazoxOworICAgIFVDSEFSCUluc3RhbGw6MTsKKyAgICBVQ0hBUglLZXlJbmRleDoyOworICAgIFVDSEFSCUtleVR5cGU6MTsKKyAgICBVQ0hBUglLZXlEZXNjVmVyOjM7CisgICAgVUNIQVIJUnN2ZDozOworICAgIFVDSEFSCUVLRF9ETDoxOwkJLy8gRUtEIGZvciBBUDsgREwgZm9yIFNUQQorICAgIFVDSEFSCVJlcXVlc3Q6MTsKKyAgICBVQ0hBUglFcnJvcjoxOworICAgIFVDSEFSCVNlY3VyZToxOworICAgIFVDSEFSCUtleU1pYzoxOworI2Vsc2UKKwlVQ0hBUglLZXlNaWM6MTsKKwlVQ0hBUglTZWN1cmU6MTsKKwlVQ0hBUglFcnJvcjoxOworCVVDSEFSCVJlcXVlc3Q6MTsKKwlVQ0hBUglFS0RfREw6MTsgICAgICAgLy8gRUtEIGZvciBBUDsgREwgZm9yIFNUQQorCVVDSEFSCVJzdmQ6MzsKKwlVQ0hBUglLZXlEZXNjVmVyOjM7CisJVUNIQVIJS2V5VHlwZToxOworCVVDSEFSCUtleUluZGV4OjI7CisJVUNIQVIJSW5zdGFsbDoxOworCVVDSEFSCUtleUFjazoxOworI2VuZGlmCit9CUtFWV9JTkZPLCAqUEtFWV9JTkZPOworCisvLyBFQVBPTCBLZXkgZGVzY3JpcHRvciBmb3JtYXQKK3R5cGVkZWYJc3RydWN0IFBBQ0tFRCBfS0VZX0RFU0NSSVBURVIKK3sKKwlVQ0hBUgkJVHlwZTsKKwlLRVlfSU5GTwlLZXlJbmZvOworCVVDSEFSCQlLZXlMZW5ndGhbMl07CisJVUNIQVIJCVJlcGxheUNvdW50ZXJbTEVOX0tFWV9ERVNDX1JFUExBWV07CisJVUNIQVIJCUtleU5vbmNlW0xFTl9LRVlfREVTQ19OT05DRV07CisJVUNIQVIJCUtleUl2W0xFTl9LRVlfREVTQ19JVl07CisJVUNIQVIJCUtleVJzY1tMRU5fS0VZX0RFU0NfUlNDXTsKKwlVQ0hBUgkJS2V5SWRbTEVOX0tFWV9ERVNDX0lEXTsKKwlVQ0hBUgkJS2V5TWljW0xFTl9LRVlfREVTQ19NSUNdOworCVVDSEFSCQlLZXlEYXRhTGVuWzJdOworCVVDSEFSCQlLZXlEYXRhW01BWF9MRU5fT0ZfUlNOSUVdOworfQlLRVlfREVTQ1JJUFRFUiwgKlBLRVlfREVTQ1JJUFRFUjsKKwordHlwZWRlZglzdHJ1Y3QgUEFDS0VEIF9FQVBPTF9QQUNLRVQKK3sKKwlVQ0hBUgkgCQkJUHJvVmVyOworCVVDSEFSCSAJCQlQcm9UeXBlOworCVVDSEFSCSAJCQlCb2R5X0xlblsyXTsKKwlLRVlfREVTQ1JJUFRFUgkJS2V5RGVzYzsKK30JRUFQT0xfUEFDS0VULCAqUEVBUE9MX1BBQ0tFVDsKKworLy84MDIuMTFpIEQxMCBwYWdlIDgzCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0dUS19FTkNBUAoreworI2lmbmRlZiBSVF9CSUdfRU5ESUFOCisgICAgVUNIQVIgICAgICAgICAgICAgICBLaWQ6MjsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIHR4OjE7CisgICAgVUNIQVIgICAgICAgICAgICAgICByc3Y6NTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIHJzdjE7CisjZWxzZQorICAgIFVDSEFSICAgICAgICAgICAgICAgcnN2OjU7CisgICAgVUNIQVIgICAgICAgICAgICAgICB0eDoxOworICAgIFVDSEFSICAgICAgICAgICAgICAgS2lkOjI7CisgICAgVUNIQVIgICAgICAgICAgICAgICByc3YxOworI2VuZGlmCisgICAgVUNIQVIgICAgICAgICAgICAgICBHVEtbVEtJUF9HVEtfTEVOR1RIXTsKK30gICBHVEtfRU5DQVAsICpQR1RLX0VOQ0FQOworCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0tERV9FTkNBUAoreworICAgIFVDSEFSICAgICAgICAgICAgICAgVHlwZTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIExlbjsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIE9VSVszXTsKKyAgICBVQ0hBUiAgICAgICAgICAgICAgIERhdGFUeXBlOworICAgIEdUS19FTkNBUCAgICAgIEdUS0VuY2FwOworfSAgIEtERV9FTkNBUCwgKlBLREVfRU5DQVA7CisKKy8vIEZvciBXUEExCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JTTklFIHsKKyAgICBVQ0hBUiAgIG91aVs0XTsKKyAgICBVU0hPUlQgIHZlcnNpb247CisgICAgVUNIQVIgICBtY2FzdFs0XTsKKyAgICBVU0hPUlQgIHVjb3VudDsKKyAgICBzdHJ1Y3QgUEFDS0VEIHsKKyAgICAgICAgVUNIQVIgb3VpWzRdOworICAgIH11Y2FzdFsxXTsKK30gUlNOSUUsICpQUlNOSUU7CisKKy8vIEZvciBXUEEyCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JTTklFMiB7CisgICAgVVNIT1JUICB2ZXJzaW9uOworICAgIFVDSEFSICAgbWNhc3RbNF07CisgICAgVVNIT1JUICB1Y291bnQ7CisgICAgc3RydWN0IFBBQ0tFRCB7CisgICAgICAgIFVDSEFSIG91aVs0XTsKKyAgICB9dWNhc3RbMV07Cit9IFJTTklFMiwgKlBSU05JRTI7CisKKy8vIEFLTSBTdWl0ZQordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SU05JRV9BVVRIIHsKKyAgICBVU0hPUlQgYWNvdW50OworICAgIHN0cnVjdCBQQUNLRUQgeworICAgICAgICBVQ0hBUiBvdWlbNF07CisgICAgfWF1dGhbMV07Cit9IFJTTklFX0FVVEgsKlBSU05JRV9BVVRIOworCit0eXBlZGVmCXVuaW9uIFBBQ0tFRCBfUlNOX0NBUEFCSUxJVElFUwl7CisJc3RydWN0CVBBQ0tFRCB7CisjaWZkZWYgUlRfQklHX0VORElBTgorICAgICAgICBVU0hPUlQJCVJzdmQ6MTA7CisgICAgICAgIFVTSE9SVAkJR1RLU0FfUl9Db3VudGVyOjI7CisgICAgICAgIFVTSE9SVAkJUFRLU0FfUl9Db3VudGVyOjI7CisgICAgICAgIFVTSE9SVAkJTm9fUGFpcndpc2U6MTsKKwkJVVNIT1JUCQlQcmVBdXRoOjE7CisjZWxzZQorICAgICAgICBVU0hPUlQJCVByZUF1dGg6MTsKKwkJVVNIT1JUCQlOb19QYWlyd2lzZToxOworCQlVU0hPUlQJCVBUS1NBX1JfQ291bnRlcjoyOworCQlVU0hPUlQJCUdUS1NBX1JfQ291bnRlcjoyOworCQlVU0hPUlQJCVJzdmQ6MTA7CisjZW5kaWYKKwl9CWZpZWxkOworCVVTSE9SVAkJCXdvcmQ7Cit9CVJTTl9DQVBBQklMSVRJRVMsICpQUlNOX0NBUEFCSUxJVElFUzsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9FQVBfSERSIHsKKyAgICBVQ0hBUiAgIFByb1ZlcjsKKyAgICBVQ0hBUiAgIFByb1R5cGU7CisgICAgVUNIQVIgICBCb2R5X0xlblsyXTsKKyAgICBVQ0hBUiAgIGNvZGU7CisgICAgVUNIQVIgICBpZGVudGlmaWVyOworICAgIFVDSEFSICAgbGVuZ3RoWzJdOyAvLyBpbmNsdWRpbmcgY29kZSBhbmQgaWRlbnRpZmllciwgZm9sbG93ZWQgYnkgbGVuZ3RoLTIgb2N0ZXRzIG9mIGRhdGEKK30gRUFQX0hEUiwgKlBFQVBfSERSOworCisvLyBGb3Igc3VwcGxpY2FudCBzdGF0ZSBtYWNoaW5lIHN0YXRlcy4gODAyLjExaSBEcmFmdCA0LjEsIHAuIDk3CisvLyBXZSBzaW1wbGlmaWVkIGl0Cit0eXBlZGVmCWVudW0JX1dwYVN0YXRlCit7CisJU1NfTk9UVVNFLAkJCQkvLyAwCisJU1NfU1RBUlQsCQkJCS8vIDEKKwlTU19XQUlUX01TR18zLAkJCS8vIDIKKwlTU19XQUlUX0dST1VQLAkJCS8vIDMKKwlTU19GSU5JU0gsICAJCQkvLyA0CisJU1NfS0VZVVBEQVRFLAkJCS8vIDUKK30JV1BBX1NUQVRFOworCisvLworLy8JVGhlIGRlZmluaXRpb24gb2YgdGhlIGNpcGhlciBjb21iaW5hdGlvbgorLy8KKy8vIAkgYml0MwliaXQyICBiaXQxICAgYml0MAorLy8JKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCisvLyAJfAkgIFdQQQkgfAkgICBXUEEyICAgfAorLy8JKy0tLS0tLSstLS0tLSstLS0tLS0rLS0tLS0rCisvLwl8IFRLSVAgfCBBRVMgfCBUS0lQIHwgQUVTIHwKKy8vCXwJMCAgfCAgMSAgfCAgIDEgIHwgIDAgIHwgLT4gMHgwNgorLy8JfAkwICB8ICAxICB8ICAgMSAgfCAgMSAgfCAtPiAweDA3CisvLwl8CTEgIHwgIDAgIHwgICAwICB8ICAxICB8IC0+IDB4MDkKKy8vCXwJMSAgfCAgMCAgfCAgIDEgIHwgIDEgIHwgLT4gMHgwQgorLy8JfAkxICB8ICAxICB8ICAgMCAgfCAgMSAgfCAtPiAweDBECisvLwl8CTEgIHwgIDEgIHwgICAxICB8ICAwICB8IC0+IDB4MEUKKy8vCXwJMSAgfCAgMSAgfCAgIDEgIHwgIDEgIHwJLT4gMHgwRgorLy8JKy0tLS0tLSstLS0tLSstLS0tLS0rLS0tLS0rCisvLwordHlwZWRlZgllbnVtCV9XcGFNaXhQYWlyQ2lwaGVyCit7CisJTUlYX0NJUEhFUl9OT1RVU0UgCQkJPSAweDAwLAorCVdQQV9OT05FX1dQQTJfVEtJUEFFUwkJPSAweDAzLAkJLy8gV1BBMi1US0lQQUVTCisJV1BBX0FFU19XUEEyX1RLSVAgCQkJPSAweDA2LAorCVdQQV9BRVNfV1BBMl9US0lQQUVTCQk9IDB4MDcsCisJV1BBX1RLSVBfV1BBMl9BRVMJCQk9IDB4MDksCisJV1BBX1RLSVBfV1BBMl9US0lQQUVTCQk9IDB4MEIsCisJV1BBX1RLSVBBRVNfV1BBMl9OT05FCQk9IDB4MEMsCQkvLyBXUEEtVEtJUEFFUworCVdQQV9US0lQQUVTX1dQQTJfQUVTCQk9IDB4MEQsCisJV1BBX1RLSVBBRVNfV1BBMl9US0lQCQk9IDB4MEUsCisJV1BBX1RLSVBBRVNfV1BBMl9US0lQQUVTCT0gMHgwRiwKK30JV1BBX01JWF9QQUlSX0NJUEhFUjsKKwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SU05fSUVfSEVBREVSX1NUUlVDVAl7CisJVUNIQVIJCUVpZDsKKwlVQ0hBUgkJTGVuZ3RoOworCVVTSE9SVAkJVmVyc2lvbjsJLy8gTGl0dGxlIGVuZGlhbiBmb3JtYXQKK30JUlNOX0lFX0hFQURFUl9TVFJVQ1QsICpQUlNOX0lFX0hFQURFUl9TVFJVQ1Q7CisKKy8vIENpcGhlciBzdWl0ZSBzZWxlY3RvciB0eXBlcwordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9DSVBIRVJfU1VJVEVfU1RSVUNUCXsKKwlVQ0hBUgkJT3VpWzNdOworCVVDSEFSCQlUeXBlOworfQlDSVBIRVJfU1VJVEVfU1RSVUNULCAqUENJUEhFUl9TVUlURV9TVFJVQ1Q7CisKKy8vIEF1dGhlbnRpY2F0aW9uIGFuZCBLZXkgTWFuYWdlbWVudCBzdWl0ZSBzZWxlY3RvcgordHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9BS01fU1VJVEVfU1RSVUNUCXsKKwlVQ0hBUgkJT3VpWzNdOworCVVDSEFSCQlUeXBlOworfQlBS01fU1VJVEVfU1RSVUNULCAqUEFLTV9TVUlURV9TVFJVQ1Q7CisKKy8vIFJTTiBjYXBhYmlsaXR5Cit0eXBlZGVmIHN0cnVjdAlQQUNLRUQgX1JTTl9DQVBBQklMSVRZCXsKKwlVU0hPUlQJCVJzdjoxMDsKKwlVU0hPUlQJCUdUS1NBUmVwbGF5Q250OjI7CisJVVNIT1JUCQlQVEtTQVJlcGxheUNudDoyOworCVVTSE9SVAkJTm9QYWlyd2lzZToxOworCVVTSE9SVAkJUHJlQXV0aDoxOworfQlSU05fQ0FQQUJJTElUWSwgKlBSU05fQ0FQQUJJTElUWTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzljMjI1YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvS2NvbmZpZwpAQCAtMCwwICsxLDUgQEAKK2NvbmZpZyBSVEw4MTg3U0UKKwl0cmlzdGF0ZSAiUmVhbFRlayBSVEw4MTg3U0UgV2lyZWxlc3MgTEFOIE5JQyBkcml2ZXIiCisJZGVwZW5kcyBvbiBQQ0kKKwlkZWZhdWx0IE4KKwktLS1oZWxwLS0tCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmM3ZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9NYWtlZmlsZQpAQCAtMCwwICsxLDU1IEBACisKKyNFWFRSQV9DRkxBR1MgKz0gLURDT05GSUdfSUVFRTgwMjExX05PV0VQPXkKKyNFWFRSQV9DRkxBR1MgKz0gLURDT05GSUdfUlRMODE4MF9JT01BUAorI0VYVFJBX0NGTEFHUyArPSAtc3RkPWdudTg5CisjRVhUUkFfQ0ZMQUdTICs9IC1PMgorI0NDICAgICAgICAgICAgPSBnY2MKK0VYVFJBX0NGTEFHUyArPSAtRFRIT01BU19UVVJCTworI0NGTEFHUyArPSAtRENPTkZJR19SVEw4MTg1QgorI0NGTEFHUyArPSAtRENPTkZJR19SVEw4MTh4X1MKKworI2FkZGVkIGZvciBFZWVQQyB0ZXN0aW5nCitFWFRSQV9DRkxBR1MgKz0gLURFTkFCTEVfSVBTCitFWFRSQV9DRkxBR1MgKz0gLURTV19BTlRFCitFWFRSQV9DRkxBR1MgKz0gLURUWF9UUkFDSworRVhUUkFfQ0ZMQUdTICs9IC1ESElHSF9QT1dFUgorRVhUUkFfQ0ZMQUdTICs9IC1EU1dfRElHCitFWFRSQV9DRkxBR1MgKz0gLURSQVRFX0FEQVBUCitFWFRSQV9DRkxBR1MgKz0gLURDT05GSUdfUlRMODE4MF9QTQorCisjK1lKLDA4MDYyNgorRVhUUkFfQ0ZMQUdTICs9IC1ERU5BQkxFX0RPVDExRAorCisjZW5hYmxlIGl0IGZvciBsZWdhY3kgcG93ZXIgc2F2ZSwgZGlzYWJsZSBpdCBmb3IgbGVpc3VyZSAgcG93ZXIgc2F2ZQorRVhUUkFfQ0ZMQUdTICs9IC1ERU5BQkxFX0xQUworCisKKyNFWFRSQV9DRkxBR1MgKz0gLW1oYXJkLWZsb2F0IC1EQ09ORklHX0ZPUkNFX0hBUkRfRkxPQVQ9eQorCitydGw4MTg3c2Utb2JqcyA6PQkJCVwKKwkJcjgxODBfY29yZS5vCQlcCisJCXI4MTgwX3NhMjQwMC5vCQlcCisJCXI4MTgwXzkzY3g2Lm8JCVwKKwkJcjgxODBfd3gubwkJXAorCQlyODE4MF9tYXgyODIwLm8JCVwKKwkJcjgxODBfZ2N0Lm8JCVwKKwkJcjgxODBfcnRsODIyNS5vCQlcCisJCXI4MTgwX3J0bDgyNTUubwkJXAorCQlyODE4MF9ydGw4MjI1ejIubwlcCisJCXI4MTg1Yl9pbml0Lm8JCVwKKwkJcjgxODBfZG0ubwkJXAorCQlyODE4MF9wbS5vCQlcCisJCWllZWU4MDIxMS9kb3QxMWQubwkJCVwKKwkJaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLm8JCVwKKwkJaWVlZTgwMjExL2llZWU4MDIxMV9yeC5vCQlcCisJCWllZWU4MDIxMS9pZWVlODAyMTFfdHgubwkJXAorCQlpZWVlODAyMTEvaWVlZTgwMjExX3d4Lm8JCVwKKwkJaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUubwkJXAorCQlpZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWNfd3gubwlcCisJCWllZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQubwkJXAorCQlpZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3RraXAubwlcCisJCWllZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfY2NtcC5vCVwKKwkJaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAubworCitvYmotJChDT05GSUdfUlRMODE4N1NFKQkrPSBydGw4MTg3c2UubworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2RvdDExZC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9kb3QxMWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWY1M2ZlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9kb3QxMWQuaApAQCAtMCwwICsxLDEwMSBAQAorI2lmbmRlZiBfX0lOQ19ET1QxMURfSA0KKyNkZWZpbmUgX19JTkNfRE9UMTFEX0gNCisNCisjaW5jbHVkZSAiaWVlZTgwMjExLmgiDQorDQorLy8jZGVmaW5lIEVOQUJMRV9ET1QxMUQNCisNCisvLyNkZWZpbmUgRE9UMTFEX01BWF9DSE5MX05VTSA4Mw0KKw0KK3R5cGVkZWYgc3RydWN0IF9DSE5MX1RYUE9XRVJfVFJJUExFIHsNCisJdTggRmlyc3RDaG5sOw0KKwl1OCAgTnVtQ2hubHM7DQorCXU4ICBNYXhUeFBvd2VySW5EYm07DQorfUNITkxfVFhQT1dFUl9UUklQTEUsICpQQ0hOTF9UWFBPV0VSX1RSSVBMRTsNCisNCit0eXBlZGVmIGVudW0gX0RPVDExRF9TVEFURSB7DQorCURPVDExRF9TVEFURV9OT05FID0gMCwNCisJRE9UMTFEX1NUQVRFX0xFQVJORUQsDQorCURPVDExRF9TVEFURV9ET05FLA0KK31ET1QxMURfU1RBVEU7DQorDQordHlwZWRlZiBzdHJ1Y3QgX1JUX0RPVDExRF9JTkZPIHsNCisJLy9ERUNMQVJFX1JUX09CSkVDVChSVF9ET1QxMURfSU5GTyk7DQorDQorCWJvb2wgYkVuYWJsZWQ7IC8vIGRvdDExTXVsdGlEb21haW5DYXBhYmlsaXR5RW5hYmxlZA0KKw0KKwl1MTYgQ291bnRyeUllTGVuOyAvLyA+IDAgaWYgQ291bnRyeUllQnVmW10gY29udGFpbnMgdmFsaWQgY291bnRyeSBpbmZvcm1hdGlvbiBlbGVtZW50Lg0KKwl1OCAgQ291bnRyeUllQnVmW01BWF9JRV9MRU5dOw0KKwl1OCAgQ291bnRyeUllU3JjQWRkcls2XTsgLy8gU291cmNlIEFQIG9mIHRoZSBjb3VudHJ5IElFLg0KKwl1OCAgQ291bnRyeUllV2F0Y2hkb2c7IA0KKw0KKwl1OCAgY2hhbm5lbF9tYXBbTUFYX0NIQU5ORUxfTlVNQkVSKzFdOyAgLy8hISFWYWx1ZSAwOiBJbnZhbGlkLCAxOiBWYWxpZCAoYWN0aXZlIHNjYW4pLCAyOiBWYWxpZCAocGFzc2l2ZSBzY2FuKQ0KKwkvL3U4ICBDaG5sTGlzdExlbjsgLy8gI0J5dGVzIHZhbGlkIGluIENobmxMaXN0W10uDQorCS8vdTggIENobmxMaXN0W0RPVDExRF9NQVhfQ0hOTF9OVU1dOw0KKwl1OCAgTWF4VHhQd3JEYm1MaXN0W01BWF9DSEFOTkVMX05VTUJFUisxXTsNCisNCisJRE9UMTFEX1NUQVRFIFN0YXRlOw0KK31SVF9ET1QxMURfSU5GTywgKlBSVF9ET1QxMURfSU5GTzsNCisjZGVmaW5lIGVxTWFjQWRkcihhLGIpCQkoICgoYSlbMF09PShiKVswXSAmJiAoYSlbMV09PShiKVsxXSAmJiAoYSlbMl09PShiKVsyXSAmJiAoYSlbM109PShiKVszXSAmJiAoYSlbNF09PShiKVs0XSAmJiAoYSlbNV09PShiKVs1XSkgPyAxOjAgKQ0KKyNkZWZpbmUgY3BNYWNBZGRyKGRlcyxzcmMpCSAgICAgICgoZGVzKVswXT0oc3JjKVswXSwoZGVzKVsxXT0oc3JjKVsxXSwoZGVzKVsyXT0oc3JjKVsyXSwoZGVzKVszXT0oc3JjKVszXSwoZGVzKVs0XT0oc3JjKVs0XSwoZGVzKVs1XT0oc3JjKVs1XSkNCisjZGVmaW5lIEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KSAoKFBSVF9ET1QxMURfSU5GTykoKF9fcEllZWVEZXYpLT5wRG90MTFkSW5mbykpDQorDQorI2RlZmluZSBJU19ET1QxMURfRU5BQkxFKF9fcEllZWVEZXYpIEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+YkVuYWJsZWQNCisjZGVmaW5lIElTX0NPVU5UUllfSUVfVkFMSUQoX19wSWVlZURldikgKEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllTGVuID4gMCkNCisNCisjZGVmaW5lIElTX0VRVUFMX0NJRV9TUkMoX19wSWVlZURldiwgX19wVGEpIGVxTWFjQWRkcihHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPkNvdW50cnlJZVNyY0FkZHIsIF9fcFRhKSANCisjZGVmaW5lIFVQREFURV9DSUVfU1JDKF9fcEllZWVEZXYsIF9fcFRhKSBjcE1hY0FkZHIoR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVTcmNBZGRyLCBfX3BUYSkNCisNCisjZGVmaW5lIElTX0NPVU5UUllfSUVfQ0hBTkdFRChfX3BJZWVlRGV2LCBfX0llKSBcDQorCSgoKF9fSWUpLkxlbmd0aCA9PSAwIHx8IChfX0llKS5MZW5ndGggIT0gR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVMZW4pID8gXA0KKwlGQUxTRSA6IFwNCisJKCFtZW1jbXAoR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVCdWYsIChfX0llKS5PY3RldCwgKF9fSWUpLkxlbmd0aCkpKQ0KKw0KKyNkZWZpbmUgQ0lFX1dBVENIRE9HX1RIIDENCisjZGVmaW5lIEdFVF9DSUVfV0FUQ0hET0coX19wSWVlZURldikgR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVXYXRjaGRvZw0KKyNkZWZpbmUgUkVTRVRfQ0lFX1dBVENIRE9HKF9fcEllZWVEZXYpIEdFVF9DSUVfV0FUQ0hET0coX19wSWVlZURldikgPSAwIA0KKyNkZWZpbmUgVVBEQVRFX0NJRV9XQVRDSERPRyhfX3BJZWVlRGV2KSArK0dFVF9DSUVfV0FUQ0hET0coX19wSWVlZURldikNCisNCisjZGVmaW5lIElTX0RPVDExRF9TVEFURV9ET05FKF9fcEllZWVEZXYpIChHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPlN0YXRlID09IERPVDExRF9TVEFURV9ET05FKQ0KKw0KKw0KK3ZvaWQNCitEb3QxMWRfSW5pdCgNCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldg0KKwkpOw0KKw0KK3ZvaWQNCitEb3QxMWRfUmVzZXQoDQorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICpkZXYNCisJKTsNCisNCit2b2lkDQorRG90MTFkX1VwZGF0ZUNvdW50cnlJZSgNCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldiwNCisJdTggKgkJcFRhZGRyLA0KKwl1MTYJQ291dHJ5SWVMZW4sDQorCXU4ICogcENvdXRyeUllCSANCisJKTsNCisNCit1OA0KK0RPVDExRF9HZXRNYXhUeFB3ckluRGJtKA0KKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2LA0KKwl1OCBDaGFubmVsDQorCSk7DQorDQordm9pZA0KK0RPVDExRF9TY2FuQ29tcGxldGUoDQorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICogZGV2DQorCSk7DQorDQoraW50IElzTGVnYWxDaGFubmVsKA0KKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqIGRldiwNCisJdTggY2hhbm5lbA0KKyk7DQorDQoraW50IFRvTGVnYWxDaGFubmVsKA0KKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqIGRldiwNCisJdTggY2hhbm5lbA0KKyk7DQorDQorI2VuZGlmIC8vICNpZm5kZWYgX19JTkNfRE9UMTFEX0gNCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODMzNjA4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEuaApAQCAtMCwwICsxLDE3NTUgQEAKKy8qCisgKiBNZXJnZWQgd2l0aCBtYWlubGluZSBpZWVlODAyMTEuaCBpbiBBdWcgMjAwNC4gIE9yaWdpbmFsIGllZWU4MDJfMTEKKyAqIHJlbWFpbnMgY29weXJpZ2h0IGJ5IHRoZSBvcmlnaW5hbCBhdXRob3JzCisgKgorICogUG9ydGlvbnMgb2YgdGhlIG1lcmdlZCBjb2RlIGFyZSBiYXNlZCBvbiBIb3N0IEFQIChzb2Z0d2FyZSB3aXJlbGVzcworICogTEFOIGFjY2VzcyBwb2ludCkgZHJpdmVyIGZvciBJbnRlcnNpbCBQcmlzbTIvMi41LzMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIsIFNTSCBDb21tdW5pY2F0aW9ucyBTZWN1cml0eSBDb3JwIGFuZCBKb3VuaSBNYWxpbmVuCisgKiA8amttYWxpbmVAY2MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqCisgKiBBZGFwdGlvbiB0byBhIGdlbmVyaWMgSUVFRSA4MDIuMTEgc3RhY2sgYnkgSmFtZXMgS2V0cmVub3MKKyAqIDxqa2V0cmVub0BsaW51eC5pbnRlbC5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIEludGVsIENvcnBvcmF0aW9uCisgKgorICogTW9kaWZpZWQgZm9yIFJlYWx0ZWsncyB3aS1maSBjYXJkcyBieSBBbmRyZWEgTWVyZWxsbworICogPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgSUVFRTgwMjExX0gKKyNkZWZpbmUgSUVFRTgwMjExX0gKKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPiAvKiBFVEhfQUxFTiAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPiAgIC8qIEFSUkFZX1NJWkUgKi8KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDEzKSkKKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2VuZGlmCisKKy8qCisjaWZuZGVmIGJvb2wKKyNkZWZpbmUgYm9vbCBpbnQKKyNlbmRpZgorCisjaWZuZGVmIHRydWUKKyNkZWZpbmUgdHJ1ZSAgIDEKKyNlbmRpZgorCisjaWZuZGVmIGZhbHNlCisjZGVmaW5lIGZhbHNlICAwCisjZW5kaWYKKyovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkpCisjaWZuZGVmIGJvb2wKK3R5cGVkZWYgZW51bXtmYWxzZSA9IDAsIHRydWV9IGJvb2w7CisjZW5kaWYKKyNlbmRpZgorLy8jaWZkZWYgSk9ITl9IV1NFQworI2RlZmluZSBLRVlfVFlQRV9OQQkJMHgwCisjZGVmaW5lIEtFWV9UWVBFX1dFUDQwIAkJMHgxCisjZGVmaW5lIEtFWV9UWVBFX1RLSVAJCTB4MgorI2RlZmluZSBLRVlfVFlQRV9DQ01QCQkweDQKKyNkZWZpbmUgS0VZX1RZUEVfV0VQMTA0CQkweDUKKy8vI2VuZGlmCisKKworI2RlZmluZSBhU2lmc1RpbWUJCQkJCTEwCisKKyNkZWZpbmUgTUdNVF9RVUVVRV9OVU0gNQorCisKKyNkZWZpbmUgSUVFRV9DTURfU0VUX1dQQV9QQVJBTQkJCTEKKyNkZWZpbmUJSUVFRV9DTURfU0VUX1dQQV9JRQkJCTIKKyNkZWZpbmUgSUVFRV9DTURfU0VUX0VOQ1JZUFRJT04JCQkzCisjZGVmaW5lIElFRUVfQ01EX01MTUUJCQkJNAorCisjZGVmaW5lIElFRUVfUEFSQU1fV1BBX0VOQUJMRUQJCQkxCisjZGVmaW5lIElFRUVfUEFSQU1fVEtJUF9DT1VOVEVSTUVBU1VSRVMJCTIKKyNkZWZpbmUgSUVFRV9QQVJBTV9EUk9QX1VORU5DUllQVEVECQkzCisjZGVmaW5lIElFRUVfUEFSQU1fUFJJVkFDWV9JTlZPS0VECQk0CisjZGVmaW5lIElFRUVfUEFSQU1fQVVUSF9BTEdTCQkJNQorI2RlZmluZSBJRUVFX1BBUkFNX0lFRUVfODAyXzFYCQkJNgorLy9JdCBzaG91bGQgY29uc2lzdGVudCB3aXRoIHRoZSBkcml2ZXJfWFhYLmMKKy8vICAgRGF2aWQsIDIwMDYuOS4yNgorI2RlZmluZSBJRUVFX1BBUkFNX1dQQVhfU0VMRUNUCQkJNworLy9BZGRlZCBmb3Igbm90aWZ5IHRoZSBlbmNyeXB0aW9uIHR5cGUgc2VsZWN0aW9uCisvLyAgIERhdmlkLCAyMDA2LjkuMjYKKyNkZWZpbmUgSUVFRV9QUk9UT19XUEEJCQkJMQorI2RlZmluZSBJRUVFX1BST1RPX1JTTgkJCQkyCisvL0FkZGVkIGZvciBub3RpZnkgdGhlIGVuY3J5cHRpb24gdHlwZSBzZWxlY3Rpb24KKy8vICAgRGF2aWQsIDIwMDYuOS4yNgorI2RlZmluZSBJRUVFX1dQQVhfVVNFR1JPVVAJCQkwCisjZGVmaW5lIElFRUVfV1BBWF9XRVA0MAkJCQkxCisjZGVmaW5lIElFRUVfV1BBWF9US0lQCQkJCTIKKyNkZWZpbmUgSUVFRV9XUEFYX1dSQVAgICAJCQkzCisjZGVmaW5lIElFRUVfV1BBWF9DQ01QCQkJCTQKKyNkZWZpbmUgSUVFRV9XUEFYX1dFUDEwNAkJCTUKKworI2RlZmluZSBJRUVFX0tFWV9NR01UX0lFRUU4MDIxWAkJCTEKKyNkZWZpbmUgSUVFRV9LRVlfTUdNVF9QU0sJCQkyCisKKworCisjZGVmaW5lIElFRUVfTUxNRV9TVEFfREVBVVRICQkJMQorI2RlZmluZSBJRUVFX01MTUVfU1RBX0RJU0FTU09DCQkJMgorCisKKyNkZWZpbmUgSUVFRV9DUllQVF9FUlJfVU5LTk9XTl9BTEcJCTIKKyNkZWZpbmUgSUVFRV9DUllQVF9FUlJfVU5LTk9XTl9BRERSCQkzCisjZGVmaW5lIElFRUVfQ1JZUFRfRVJSX0NSWVBUX0lOSVRfRkFJTEVECQk0CisjZGVmaW5lIElFRUVfQ1JZUFRfRVJSX0tFWV9TRVRfRkFJTEVECQk1CisjZGVmaW5lIElFRUVfQ1JZUFRfRVJSX1RYX0tFWV9TRVRfRkFJTEVECQk2CisjZGVmaW5lIElFRUVfQ1JZUFRfRVJSX0NBUkRfQ09ORl9GQUlMRUQJCTcKKworCisjZGVmaW5lCUlFRUVfQ1JZUFRfQUxHX05BTUVfTEVOCQkJMTYKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTApKQorI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X3NjYW4gaWVlZTgwMjExX3d4X2dldF9zY2FuX3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X2VuY29kZSBpZWVlODAyMTFfd3hfc2V0X2VuY29kZV9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9lbmNvZGUgaWVlZTgwMjExX3d4X2dldF9lbmNvZGVfcnRsCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gYWRkZWQgZm9yIGtlcm5lbCBjb25mbGljdCB1bmRlciBGQzUKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9uYW1lICAgaWVlZTgwMjExX3d4X2dldF9uYW1lX3J0bAorI2RlZmluZSBmcmVlX2llZWU4MDIxMSAgICAgICAgICBmcmVlX2llZWU4MDIxMV9ydGwKKyNkZWZpbmUgYWxsb2NfaWVlZTgwMjExICAgICAgICBhbGxvY19pZWVlODAyMTFfcnRsCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZW5kaWYKKy8vZXJyb3IgaW4gdWJ1bnR1Mi42LjIyLHNvIGFkZCB0aGVzZQorI2RlZmluZSBpZWVlODAyMTFfd2FrZV9xdWV1ZSBpZWVlODAyMTFfd2FrZV9xdWV1ZV9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3N0b3BfcXVldWUgaWVlZTgwMjExX3N0b3BfcXVldWVfcnRsCisKKyNkZWZpbmUgaWVlZTgwMjExX3J4IGllZWU4MDIxMV9yeF9ydGwKKworI2RlZmluZSBpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wcwlpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wc19ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3VucmVnaXN0ZXJfY3J5cHRvX29wcwlpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzX3J0bAorI2RlZmluZSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMJaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzX3J0bAorI2RlZmluZSBpZWVlODAyMTFfY3J5cHRfZGVpbml0X2VudHJpZXMJaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9lbnRyaWVzX3J0bAorI2RlZmluZSBpZWVlODAyMTFfY3J5cHRfZGVpbml0X2hhbmRsZXIJaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9oYW5kbGVyX3J0bAorI2RlZmluZSBpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQJaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0X3J0bAorCisjZGVmaW5lIGllZWU4MDIxMV90eGJfZnJlZQlpZWVlODAyMTFfdHhiX2ZyZWVfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfZXNzaWQJaWVlZTgwMjExX3d4X2dldF9lc3NpZF9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9lc3NpZAlpZWVlODAyMTFfd3hfc2V0X2Vzc2lkX3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X3JhdGUJaWVlZTgwMjExX3d4X3NldF9yYXRlX3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X3JhdGUJaWVlZTgwMjExX3d4X2dldF9yYXRlX3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X3dhcAlpZWVlODAyMTFfd3hfc2V0X3dhcF9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF93YXAJaWVlZTgwMjExX3d4X2dldF93YXBfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfbW9kZQlpZWVlODAyMTFfd3hfc2V0X21vZGVfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfbW9kZQlpZWVlODAyMTFfd3hfZ2V0X21vZGVfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfc2NhbglpZWVlODAyMTFfd3hfc2V0X3NjYW5fcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfZnJlcQlpZWVlODAyMTFfd3hfZ2V0X2ZyZXFfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfZnJlcQlpZWVlODAyMTFfd3hfc2V0X2ZyZXFfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfcmF3dHgJaWVlZTgwMjExX3d4X3NldF9yYXd0eF9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9wb3dlcglpZWVlODAyMTFfd3hfc2V0X3Bvd2VyX3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X3Bvd2VyCWllZWU4MDIxMV93eF9nZXRfcG93ZXJfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93bGFuX2ZyZXF1ZW5jaWVzCWllZWU4MDIxMV93bGFuX2ZyZXF1ZW5jaWVzX3J0bAorI2RlZmluZSBpZWVlODAyMTFfc29mdG1hY19zdG9wX3Byb3RvY29sCWllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2xfcnRsCisjZGVmaW5lIGllZWU4MDIxMV9zb2Z0bWFjX3N0YXJ0X3Byb3RvY29sIGllZWU4MDIxMV9zb2Z0bWFjX3N0YXJ0X3Byb3RvY29sX3J0bAorI2RlZmluZQlpZWVlODAyMTFfc3RhcnRfcHJvdG9jb2wJaWVlZTgwMjExX3N0YXJ0X3Byb3RvY29sX3J0bAorI2RlZmluZQlpZWVlODAyMTFfc3RvcF9wcm90b2NvbAkJaWVlZTgwMjExX3N0b3BfcHJvdG9jb2xfcnRsCisjZGVmaW5lCWllZWU4MDIxMV9yeF9tZ3QJCWllZWU4MDIxMV9yeF9tZ3RfcnRsCisKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9hdXRoIGllZWU4MDIxMV93eF9zZXRfYXV0aF9ydGwKKy8vYnkgYW15IGZvciBwcworI2RlZmluZSBub3RpZnlfd3hfYXNzb2NfZXZlbnQgIG5vdGlmeV93eF9hc3NvY19ldmVudF9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3N0b3Bfc2VuZF9iZWFjb25zIGllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29uc19ydGwKKyNkZWZpbmUgaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZSBpZWVlODAyMTFfZGlzYXNzb2NpYXRlX3J0bAorI2RlZmluZSBpZWVlODAyMTFfc3RhcnRfc2NhbiBpZWVlODAyMTFfc3RhcnRfc2Nhbl9ydGwKKy8vYnkgYW15IGZvciBwcwordHlwZWRlZiBzdHJ1Y3QgaWVlZV9wYXJhbSB7CisJdTMyIGNtZDsKKwl1OCBzdGFfYWRkcltFVEhfQUxFTl07CisgICAgICAgIHVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXU4IG5hbWU7CisJCQl1MzIgdmFsdWU7CisJCX0gd3BhX3BhcmFtOworCQlzdHJ1Y3QgeworCQkJdTMyIGxlbjsKKwkJCXU4IHJlc2VydmVkWzMyXTsKKwkJCXU4IGRhdGFbMF07CisJCX0gd3BhX2llOworCSAgICAgICAgc3RydWN0eworCQkJaW50IGNvbW1hbmQ7CisgICAgCQkJaW50IHJlYXNvbl9jb2RlOworCQl9IG1sbWU7CisJCXN0cnVjdCB7CisJCQl1OCBhbGdbSUVFRV9DUllQVF9BTEdfTkFNRV9MRU5dOworCQkJdTggc2V0X3R4OworCQkJdTMyIGVycjsKKwkJCXU4IGlkeDsKKwkJCXU4IHNlcVs4XTsgLyogc2VxdWVuY2UgY291bnRlciAoc2V0OiBSWCwgZ2V0OiBUWCkgKi8KKwkJCXUxNiBrZXlfbGVuOworCQkJdTgga2V5WzBdOworCQl9IGNyeXB0OworCisJfSB1OworfWllZWVfcGFyYW07CisKKworI2lmIFdJUkVMRVNTX0VYVCA8IDE3CisjZGVmaW5lIElXX1FVQUxfUVVBTF9JTlZBTElEICAgMHgxMAorI2RlZmluZSBJV19RVUFMX0xFVkVMX0lOVkFMSUQgIDB4MjAKKyNkZWZpbmUgSVdfUVVBTF9OT0lTRV9JTlZBTElEICAweDQwCisjZGVmaW5lIElXX1FVQUxfUVVBTF9VUERBVEVEICAgMHgxCisjZGVmaW5lIElXX1FVQUxfTEVWRUxfVVBEQVRFRCAgMHgyCisjZGVmaW5lIElXX1FVQUxfTk9JU0VfVVBEQVRFRCAgMHg0CisjZW5kaWYKKworLy8gbGludXggdW5kZXIgMi42LjkgcmVsZWFzZSBtYXkgbm90IHN1cHBvcnQgaXQsIHNvIG1vZGlmeSBpdCBmb3IgY29tbW9uIHVzZQorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsOSkpCisjZGVmaW5lIE1TRUNTKHQpCSgxMDAwICogKCh0KSAvIEhaKSArIDEwMDAgKiAoKHQpICUgSFopIC8gSFopCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbXNsZWVwX2ludGVycnVwdGlibGVfcnRsKHVuc2lnbmVkIGludCBtc2VjcykKK3sKKyAgICAgICAgIHVuc2lnbmVkIGxvbmcgdGltZW91dCA9IE1TRUNTKG1zZWNzKSArIDE7CisKKyAgICAgICAgIHdoaWxlICh0aW1lb3V0KSB7CisgICAgICAgICAgICAgICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKyAgICAgICAgICAgICAgICAgdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7CisgICAgICAgICB9CisgICAgICAgICByZXR1cm4gdGltZW91dDsKK30KKyNlbHNlCisjZGVmaW5lIE1TRUNTKHQpIG1zZWNzX3RvX2ppZmZpZXModCkKKyNkZWZpbmUgbXNsZWVwX2ludGVycnVwdGlibGVfcnRsICBtc2xlZXBfaW50ZXJydXB0aWJsZQorI2VuZGlmCisKKyNkZWZpbmUgSUVFRTgwMjExX0RBVEFfTEVOCQkyMzA0CisvKiBNYXhpbXVtIHNpemUgZm9yIHRoZSBNQS1VTklUREFUQSBwcmltaXRpdmUsIDgwMi4xMSBzdGFuZGFyZCBzZWN0aW9uCisgICA2LjIuMS4xLjIuCisKKyAgIFRoZSBmaWd1cmUgaW4gc2VjdGlvbiA3LjEuMiBzdWdnZXN0cyBhIGJvZHkgc2l6ZSBvZiB1cCB0byAyMzEyCisgICBieXRlcyBpcyBhbGxvd2VkLCB3aGljaCBpcyBhIGJpdCBjb25mdXNpbmcsIEkgc3VzcGVjdCB0aGlzCisgICByZXByZXNlbnRzIHRoZSAyMzA0IGJ5dGVzIG9mIHJlYWwgZGF0YSwgcGx1cyBhIHBvc3NpYmxlIDggYnl0ZXMgb2YKKyAgIFdFUCBJViBhbmQgSUNWLiAodGhpcyBpbnRlcnByZXRhdGlvbiBzdWdnZXN0ZWQgYnkgUmFtaXJvIEJhcnJlaXJvKSAqLworCisKKyNkZWZpbmUgSUVFRTgwMjExX0hMRU4JCQkzMAorI2RlZmluZSBJRUVFODAyMTFfRlJBTUVfTEVOCQkoSUVFRTgwMjExX0RBVEFfTEVOICsgSUVFRTgwMjExX0hMRU4pCisKKy8qIHRoaXMgaXMgc3RvbGVuIGFuZCBtb2RpZmllZCBmcm9tIHRoZSBtYWR3aWZpIGRyaXZlciovCisjZGVmaW5lIElFRUU4MDIxMV9GQzBfVFlQRV9NQVNLCQkweDBjCisjZGVmaW5lIElFRUU4MDIxMV9GQzBfVFlQRV9EQVRBCQkweDA4CisjZGVmaW5lIElFRUU4MDIxMV9GQzBfU1VCVFlQRV9NQVNLCTB4QjAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1FPUwkweDgwCisKKyNkZWZpbmUgSUVFRTgwMjExX1FPU19IQVNfU0VRKGZjKSBcCisJKCgoZmMpICYgKElFRUU4MDIxMV9GQzBfVFlQRV9NQVNLIHwgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX01BU0spKSA9PSBcCisJIChJRUVFODAyMTFfRkMwX1RZUEVfREFUQSB8IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9RT1MpKQorCisvKiB0aGlzIGlzIHN0b2xlbiBmcm9tIGlwdzIyMDAgZHJpdmVyICovCisjZGVmaW5lIElFRUVfSUJTU19NQUNfSEFTSF9TSVpFIDMxCitzdHJ1Y3QgaWVlZV9pYnNzX3NlcSB7CisJdTggbWFjW0VUSF9BTEVOXTsKKwl1MTYgc2VxX251bVsxN107CisJdTE2IGZyYWdfbnVtWzE3XTsKKwl1bnNpZ25lZCBsb25nIHBhY2tldF90aW1lWzE3XTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX2hkciB7CisJdTE2IGZyYW1lX2N0bDsKKwl1MTYgZHVyYXRpb25faWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IGFkZHIyW0VUSF9BTEVOXTsKKwl1OCBhZGRyM1tFVEhfQUxFTl07CisJdTE2IHNlcV9jdGw7CisJdTggYWRkcjRbRVRIX0FMRU5dOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfaGRyX1FPUyB7CisJdTE2IGZyYW1lX2N0bDsKKwl1MTYgZHVyYXRpb25faWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IGFkZHIyW0VUSF9BTEVOXTsKKwl1OCBhZGRyM1tFVEhfQUxFTl07CisJdTE2IHNlcV9jdGw7CisJdTggYWRkcjRbRVRIX0FMRU5dOworCXUxNiBRT1NfY3RsOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyIHsKKwl1MTYgZnJhbWVfY3RsOworCXUxNiBkdXJhdGlvbl9pZDsKKwl1OCBhZGRyMVtFVEhfQUxFTl07CisJdTggYWRkcjJbRVRIX0FMRU5dOworCXU4IGFkZHIzW0VUSF9BTEVOXTsKKwl1MTYgc2VxX2N0bDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcl9RT1MgeworCXUxNiBmcmFtZV9jdGw7CisJdTE2IGR1cmF0aW9uX2lkOworCXU4IGFkZHIxW0VUSF9BTEVOXTsKKwl1OCBhZGRyMltFVEhfQUxFTl07CisJdTggYWRkcjNbRVRIX0FMRU5dOworCXUxNiBzZXFfY3RsOworCXUxNiBRT1NfY3RsOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK2VudW0gZWFwX3R5cGUgeworCUVBUF9QQUNLRVQgPSAwLAorCUVBUE9MX1NUQVJULAorCUVBUE9MX0xPR09GRiwKKwlFQVBPTF9LRVksCisJRUFQT0xfRU5DQVBfQVNGX0FMRVJUCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqZWFwX3R5cGVzW10gPSB7CisJW0VBUF9QQUNLRVRdCQk9ICJFQVAtUGFja2V0IiwKKwlbRUFQT0xfU1RBUlRdCQk9ICJFQVBPTC1TdGFydCIsCisJW0VBUE9MX0xPR09GRl0JCT0gIkVBUE9MLUxvZ29mZiIsCisJW0VBUE9MX0tFWV0JCT0gIkVBUE9MLUtleSIsCisJW0VBUE9MX0VOQ0FQX0FTRl9BTEVSVF0JPSAiRUFQT0wtRW5jYXAtQVNGLUFsZXJ0IgorfTsKKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICplYXBfZ2V0X3R5cGUoaW50IHR5cGUpCit7CisJcmV0dXJuICh0eXBlID49IEFSUkFZX1NJWkUoZWFwX3R5cGVzKSkgPyAiVW5rbm93biIgOiBlYXBfdHlwZXNbdHlwZV07Cit9CisKK3N0cnVjdCBlYXBvbCB7CisJdTggc25hcFs2XTsKKwl1MTYgZXRoZXJ0eXBlOworCXU4IHZlcnNpb247CisJdTggdHlwZTsKKwl1MTYgbGVuZ3RoOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgSUVFRTgwMjExXzNBRERSX0xFTiAyNAorI2RlZmluZSBJRUVFODAyMTFfNEFERFJfTEVOIDMwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1NfTEVOICAgIDQKKworI2RlZmluZSBNSU5fRlJBR19USFJFU0hPTEQgICAgIDI1NlUKKyNkZWZpbmUJTUFYX0ZSQUdfVEhSRVNIT0xEICAgICAyMzQ2VQorCisvKiBGcmFtZSBjb250cm9sIGZpZWxkIGNvbnN0YW50cyAqLworI2RlZmluZSBJRUVFODAyMTFfRkNUTF9WRVJTCQkweDAwMDIKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfRlRZUEUJCTB4MDAwYworI2RlZmluZSBJRUVFODAyMTFfRkNUTF9TVFlQRQkJMHgwMGYwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1RPRFMJCTB4MDEwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9GUk9NRFMJCTB4MDIwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9EU1RPRFMJCTB4MDMwMCAvL2FkZGVkIGJ5IGRhdmlkCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX01PUkVGUkFHUwkweDA0MDAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfUkVUUlkJCTB4MDgwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9QTQkJMHgxMDAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX01PUkVEQVRBCTB4MjAwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9XRVAJCTB4NDAwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9PUkRFUgkJMHg4MDAwCisKKyNkZWZpbmUgSUVFRTgwMjExX0ZUWVBFX01HTVQJCTB4MDAwMAorI2RlZmluZSBJRUVFODAyMTFfRlRZUEVfQ1RMCQkweDAwMDQKKyNkZWZpbmUgSUVFRTgwMjExX0ZUWVBFX0RBVEEJCTB4MDAwOAorCisvKiBtYW5hZ2VtZW50ICovCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVEJMHgwMDAwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVNQIAkweDAwMTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX1JFQVNTT0NfUkVRCTB4MDAyMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVNQCTB4MDAzMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVRCTB4MDA0MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUAkweDAwNTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0JFQUNPTgkJMHgwMDgwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BVElNCQkweDAwOTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RJU0FTU09DCTB4MDBBMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQVVUSAkJMHgwMEIwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9ERUFVVEgJCTB4MDBDMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfTUFOQUdFX0FDVAkweDAwRDAKKworLyogY29udHJvbCAqLworI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUFNQT0xMCQkweDAwQTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX1JUUwkJMHgwMEIwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9DVFMJCTB4MDBDMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQUNLCQkweDAwRDAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NGRU5ECQkweDAwRTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NGRU5EQUNLCTB4MDBGMAorCisvKiBkYXRhICovCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9EQVRBCQkweDAwMDAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RBVEFfQ0ZBQ0sJMHgwMDEwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9EQVRBX0NGUE9MTAkweDAwMjAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RBVEFfQ0ZBQ0tQT0xMCTB4MDAzMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfTlVMTEZVTkMJMHgwMDQwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9DRkFDSwkJMHgwMDUwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9DRlBPTEwJCTB4MDA2MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQ0ZBQ0tQT0xMCTB4MDA3MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUU9TX0RBVEEJMHgwMDgwIC8vYWRkZWQgZm9yIFdNTSAyMDA2LzgvMgorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUU9TX05VTEwJMHgwMEMwCisKKworI2RlZmluZSBJRUVFODAyMTFfU0NUTF9GUkFHCQkweDAwMEYKKyNkZWZpbmUgSUVFRTgwMjExX1NDVExfU0VRCQkweEZGRjAKKworCisvKiBkZWJ1ZyBtYWNyb3MgKi8KKworI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKK2V4dGVybiB1MzIgaWVlZTgwMjExX2RlYnVnX2xldmVsOworI2RlZmluZSBJRUVFODAyMTFfREVCVUcobGV2ZWwsIGZtdCwgYXJncy4uLikgXAorZG8geyBpZiAoaWVlZTgwMjExX2RlYnVnX2xldmVsICYgKGxldmVsKSkgXAorICBwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExOiAlYyAlcyAiIGZtdCwgXAorICAgICAgICAgaW5faW50ZXJydXB0KCkgPyAnSScgOiAnVScsIF9fZnVuY19fICwgIyMgYXJncyk7IH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBJRUVFODAyMTFfREVCVUcobGV2ZWwsIGZtdCwgYXJncy4uLikgZG8ge30gd2hpbGUgKDApCisjZW5kaWYJLyogQ09ORklHX0lFRUU4MDIxMV9ERUJVRyAqLworCisvKgorICogVG8gdXNlIHRoZSBkZWJ1ZyBzeXN0ZW07CisgKgorICogSWYgeW91IGFyZSBkZWZpbmluZyBhIG5ldyBkZWJ1ZyBjbGFzc2lmaWNhdGlvbiwgc2ltcGx5IGFkZCBpdCB0byB0aGUgI2RlZmluZQorICogbGlzdCBoZXJlIGluIHRoZSBmb3JtIG9mOgorICoKKyAqICNkZWZpbmUgSUVFRTgwMjExX0RMX3h4eHggVkFMVUUKKyAqCisgKiBzaGlmdGluZyB2YWx1ZSB0byB0aGUgbGVmdCBvbmUgYml0IGZyb20gdGhlIHByZXZpb3VzIGVudHJ5LiAgeHh4eCBzaG91bGQgYmUKKyAqIHRoZSBuYW1lIG9mIHRoZSBjbGFzc2lmaWNhdGlvbiAoZm9yIGV4YW1wbGUsIFdFUCkKKyAqCisgKiBZb3UgdGhlbiBuZWVkIHRvIGVpdGhlciBhZGQgYSBJRUVFODAyMTFfeHh4eF9ERUJVRygpIG1hY3JvIGRlZmluaXRpb24gZm9yIHlvdXIKKyAqIGNsYXNzaWZpY2F0aW9uLCBvciB1c2UgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF94eHh4LCAuLi4pIHdoZW5ldmVyIHlvdSB3YW50CisgKiB0byBzZW5kIG91dHB1dCB0byB0aGF0IGNsYXNzaWZpY2F0aW9uLgorICoKKyAqIFRvIGFkZCB5b3VyIGRlYnVnIGxldmVsIHRvIHRoZSBsaXN0IG9mIGxldmVscyBzZWVuIHdoZW4geW91IHBlcmZvcm0KKyAqCisgKiAlIGNhdCAvcHJvYy9uZXQvaXB3L2RlYnVnX2xldmVsCisgKgorICogeW91IHNpbXBseSBuZWVkIHRvIGFkZCB5b3VyIGVudHJ5IHRvIHRoZSBpcHdfZGVidWdfbGV2ZWxzIGFycmF5LgorICoKKyAqIElmIHlvdSBkbyBub3Qgc2VlIGRlYnVnX2xldmVsIGluIC9wcm9jL25ldC9pcHcgdGhlbiB5b3UgZG8gbm90IGhhdmUKKyAqIENPTkZJR19JRUVFODAyMTFfREVCVUcgZGVmaW5lZCBpbiB5b3VyIGtlcm5lbCBjb25maWd1cmF0aW9uCisgKgorICovCisKKyNkZWZpbmUgSUVFRTgwMjExX0RMX0lORk8gICAgICAgICAgKDE8PDApCisjZGVmaW5lIElFRUU4MDIxMV9ETF9XWCAgICAgICAgICAgICgxPDwxKQorI2RlZmluZSBJRUVFODAyMTFfRExfU0NBTiAgICAgICAgICAoMTw8MikKKyNkZWZpbmUgSUVFRTgwMjExX0RMX1NUQVRFICAgICAgICAgKDE8PDMpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9NR01UICAgICAgICAgICgxPDw0KQorI2RlZmluZSBJRUVFODAyMTFfRExfRlJBRyAgICAgICAgICAoMTw8NSkKKyNkZWZpbmUgSUVFRTgwMjExX0RMX0VBUCAgICAgICAgICAgKDE8PDYpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9EUk9QICAgICAgICAgICgxPDw3KQorCisjZGVmaW5lIElFRUU4MDIxMV9ETF9UWCAgICAgICAgICAgICgxPDw4KQorI2RlZmluZSBJRUVFODAyMTFfRExfUlggICAgICAgICAgICAoMTw8OSkKKworI2RlZmluZSBJRUVFODAyMTFfRVJST1IoZiwgYS4uLikgcHJpbnRrKEtFUk5fRVJSICJpZWVlODAyMTE6ICIgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX1dBUk5JTkcoZiwgYS4uLikgcHJpbnRrKEtFUk5fV0FSTklORyAiaWVlZTgwMjExOiAiIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19JTkZPKGYsIGEuLi4pICAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9JTkZPLCBmLCAjIyBhKQorCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19XWChmLCBhLi4uKSAgICAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9XWCwgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX1NDQU4oZiwgYS4uLikgICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1NDQU4sIGYsICMjIGEpCisvLyNkZWZpbmUgSUVFRV9ERUJVR19TQ0FOICBJRUVFODAyMTFfV0FSTklORworI2RlZmluZSBJRUVFODAyMTFfREVCVUdfU1RBVEUoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfU1RBVEUsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19NR01UKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX01HTVQsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19GUkFHKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0ZSQUcsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19FQVAoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRUFQLCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfRFJPUChmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9EUk9QLCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfVFgoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfVFgsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19SWChmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SWCwgZiwgIyMgYSkKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPiAvKiBBUlBIUkRfRVRIRVIgKi8KKworI2lmbmRlZiBXSVJFTEVTU19TUFkKKyNkZWZpbmUgV0lSRUxFU1NfU1BZCQkvLyBlbmFibGUgaXdzcHkgc3VwcG9ydAorI2VuZGlmCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4JLy8gbmV3IGRyaXZlciBBUEkKKworI2lmbmRlZiBFVEhfUF9QQUUKKyNkZWZpbmUgRVRIX1BfUEFFIDB4ODg4RSAvKiBQb3J0IEFjY2VzcyBFbnRpdHkgKElFRUUgODAyLjFYKSAqLworI2VuZGlmIC8qIEVUSF9QX1BBRSAqLworCisjZGVmaW5lIEVUSF9QX1BSRUFVVEggMHg4OEM3IC8qIElFRUUgODAyLjExaSBwcmUtYXV0aGVudGljYXRpb24gKi8KKworI2lmbmRlZiBFVEhfUF84MDIxMV9SQVcKKyNkZWZpbmUgRVRIX1BfODAyMTFfUkFXIChFVEhfUF9FQ09ORVQgKyAxKQorI2VuZGlmCisKKy8qIElFRUUgODAyLjExIGRlZmluZXMgKi8KKworI2RlZmluZSBQODAyMTFfT1VJX0xFTiAzCisKK3N0cnVjdCBpZWVlODAyMTFfc25hcF9oZHIgeworCisgICAgICAgIHU4ICAgIGRzYXA7ICAgLyogYWx3YXlzIDB4QUEgKi8KKyAgICAgICAgdTggICAgc3NhcDsgICAvKiBhbHdheXMgMHhBQSAqLworICAgICAgICB1OCAgICBjdHJsOyAgIC8qIGFsd2F5cyAweDAzICovCisgICAgICAgIHU4ICAgIG91aVtQODAyMTFfT1VJX0xFTl07ICAgIC8qIG9yZ2FuaXphdGlvbmFsIHVuaXZlcnNhbCBpZCAqLworCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBTTkFQX1NJWkUgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfc25hcF9oZHIpCisKKyNkZWZpbmUgV0xBTl9GQ19HRVRfVFlQRShmYykgKChmYykgJiBJRUVFODAyMTFfRkNUTF9GVFlQRSkKKyNkZWZpbmUgV0xBTl9GQ19HRVRfU1RZUEUoZmMpICgoZmMpICYgSUVFRTgwMjExX0ZDVExfU1RZUEUpCisKKyNkZWZpbmUgV0xBTl9HRVRfU0VRX0ZSQUcoc2VxKSAoKHNlcSkgJiBJRUVFODAyMTFfU0NUTF9GUkFHKQorI2RlZmluZSBXTEFOX0dFVF9TRVFfU0VRKHNlcSkgICgoc2VxKSAmIElFRUU4MDIxMV9TQ1RMX1NFUSkKKworLyogQXV0aGVudGljYXRpb24gYWxnb3JpdGhtcyAqLworI2RlZmluZSBXTEFOX0FVVEhfT1BFTiAwCisjZGVmaW5lIFdMQU5fQVVUSF9TSEFSRURfS0VZIDEKKworI2RlZmluZSBXTEFOX0FVVEhfQ0hBTExFTkdFX0xFTiAxMjgKKworI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfQlNTICgxPDwwKQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfSUJTUyAoMTw8MSkKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX0NGX1BPTExBQkxFICgxPDwyKQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfQ0ZfUE9MTF9SRVFVRVNUICgxPDwzKQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSAoMTw8NCkKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1BSRUFNQkxFICgxPDw1KQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfUEJDQyAoMTw8NikKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX0NIQU5ORUxfQUdJTElUWSAoMTw8NykKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1QgKDE8PDEwKQorCisvKiBTdGF0dXMgY29kZXMgKi8KKyNkZWZpbmUgV0xBTl9TVEFUVVNfU1VDQ0VTUyAwCisjZGVmaW5lIFdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkUgMQorI2RlZmluZSBXTEFOX1NUQVRVU19DQVBTX1VOU1VQUE9SVEVEIDEwCisjZGVmaW5lIFdMQU5fU1RBVFVTX1JFQVNTT0NfTk9fQVNTT0MgMTEKKyNkZWZpbmUgV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX1VOU1BFQyAxMgorI2RlZmluZSBXTEFOX1NUQVRVU19OT1RfU1VQUE9SVEVEX0FVVEhfQUxHIDEzCisjZGVmaW5lIFdMQU5fU1RBVFVTX1VOS05PV05fQVVUSF9UUkFOU0FDVElPTiAxNAorI2RlZmluZSBXTEFOX1NUQVRVU19DSEFMTEVOR0VfRkFJTCAxNQorI2RlZmluZSBXTEFOX1NUQVRVU19BVVRIX1RJTUVPVVQgMTYKKyNkZWZpbmUgV0xBTl9TVEFUVVNfQVBfVU5BQkxFX1RPX0hBTkRMRV9ORVdfU1RBIDE3CisjZGVmaW5lIFdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9SQVRFUyAxOAorLyogODAyLjExYiAqLworI2RlZmluZSBXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfTk9TSE9SVCAxOQorI2RlZmluZSBXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfTk9QQkNDIDIwCisjZGVmaW5lIFdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9OT0FHSUxJVFkgMjEKKworLyogUmVhc29uIGNvZGVzICovCisjZGVmaW5lIFdMQU5fUkVBU09OX1VOU1BFQ0lGSUVEIDEKKyNkZWZpbmUgV0xBTl9SRUFTT05fUFJFVl9BVVRIX05PVF9WQUxJRCAyCisjZGVmaW5lIFdMQU5fUkVBU09OX0RFQVVUSF9MRUFWSU5HIDMKKyNkZWZpbmUgV0xBTl9SRUFTT05fRElTQVNTT0NfRFVFX1RPX0lOQUNUSVZJVFkgNAorI2RlZmluZSBXTEFOX1JFQVNPTl9ESVNBU1NPQ19BUF9CVVNZIDUKKyNkZWZpbmUgV0xBTl9SRUFTT05fQ0xBU1MyX0ZSQU1FX0ZST01fTk9OQVVUSF9TVEEgNgorI2RlZmluZSBXTEFOX1JFQVNPTl9DTEFTUzNfRlJBTUVfRlJPTV9OT05BU1NPQ19TVEEgNworI2RlZmluZSBXTEFOX1JFQVNPTl9ESVNBU1NPQ19TVEFfSEFTX0xFRlQgOAorI2RlZmluZSBXTEFOX1JFQVNPTl9TVEFfUkVRX0FTU09DX1dJVEhPVVRfQVVUSCA5CisKKworLyogSW5mb3JtYXRpb24gRWxlbWVudCBJRHMgKi8KKyNkZWZpbmUgV0xBTl9FSURfU1NJRCAwCisjZGVmaW5lIFdMQU5fRUlEX1NVUFBfUkFURVMgMQorI2RlZmluZSBXTEFOX0VJRF9GSF9QQVJBTVMgMgorI2RlZmluZSBXTEFOX0VJRF9EU19QQVJBTVMgMworI2RlZmluZSBXTEFOX0VJRF9DRl9QQVJBTVMgNAorI2RlZmluZSBXTEFOX0VJRF9USU0gNQorI2RlZmluZSBXTEFOX0VJRF9JQlNTX1BBUkFNUyA2CisjZGVmaW5lIFdMQU5fRUlEX0NIQUxMRU5HRSAxNgorI2RlZmluZSBXTEFOX0VJRF9SU04gNDgKKyNkZWZpbmUgV0xBTl9FSURfR0VORVJJQyAyMjEKKworI2RlZmluZSBJRUVFODAyMTFfTUdNVF9IRFJfTEVOIDI0CisjZGVmaW5lIElFRUU4MDIxMV9EQVRBX0hEUjNfTEVOIDI0CisjZGVmaW5lIElFRUU4MDIxMV9EQVRBX0hEUjRfTEVOIDMwCisKKworI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfU0lHTkFMICgxPDwwKQorI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfUlNTSSAoMTw8MSkKKyNkZWZpbmUgSUVFRTgwMjExX1NUQVRNQVNLX05PSVNFICgxPDwyKQorI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfUkFURSAoMTw8MykKKyNkZWZpbmUgSUVFRTgwMjExX1NUQVRNQVNLX1dFTUFTSyAweDcKKworCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTiAgICAoMTw8MCkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTiAgICgxPDwxKQorCisjZGVmaW5lIElFRUU4MDIxMV8yNEdIWl9CQU5EICAgICAoMTw8MCkKKyNkZWZpbmUgSUVFRTgwMjExXzUyR0haX0JBTkQgICAgICgxPDwxKQorCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV9MRU4gIAkJNAorI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfMU1CCQkgICAgICAgIDB4MDIKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzJNQgkJICAgICAgICAweDA0CisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV81TUIJCSAgICAgICAgMHgwQgorI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQgkJICAgICAgICAweDE2CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfTEVOIAkJOAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQgkJICAgICAgICAweDBDCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfOU1CCQkgICAgICAgIDB4MTIKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xMk1CCQkweDE4CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMThNQgkJMHgyNAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUIJCTB4MzAKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8zNk1CCQkweDQ4CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQgkJMHg2MAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUIJCTB4NkMKKyNkZWZpbmUgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSwkJMHg4MAorCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xTUJfTUFTSwkJKDE8PDApCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8yTUJfTUFTSwkJKDE8PDEpCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV81TUJfTUFTSwkJKDE8PDIpCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xMU1CX01BU0sJCSgxPDwzKQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQl9NQVNLCQkoMTw8NCkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV85TUJfTUFTSwkJKDE8PDUpCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQl9NQVNLCQkoMTw8NikKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xOE1CX01BU0sJCSgxPDw3KQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUJfTUFTSwkJKDE8PDgpCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQl9NQVNLCQkoMTw8OSkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV80OE1CX01BU0sJCSgxPDwxMCkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV81NE1CX01BU0sJCSgxPDwxMSkKKworI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVTX01BU0sJICAgICAgICAweDAwMDAwMDBGCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfQkFTSUNfUkFURVNfTUFTSwkoSUVFRTgwMjExX0NDS19SQVRFXzFNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9DQ0tfUkFURV8yTUJfTUFTSykKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19ERUZBVUxUX1JBVEVTX01BU0sJKElFRUU4MDIxMV9DQ0tfQkFTSUNfUkFURVNfTUFTSyB8IFwKKyAgICAgICAgSUVFRTgwMjExX0NDS19SQVRFXzVNQl9NQVNLIHwgXAorICAgICAgICBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQl9NQVNLKQorCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVTX01BU0sJCTB4MDAwMDBGRjAKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fQkFTSUNfUkFURVNfTUFTSwkoSUVFRTgwMjExX09GRE1fUkFURV82TUJfTUFTSyB8IFwKKwlJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUJfTUFTSyB8IFwKKwlJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUJfTUFTSykKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fREVGQVVMVF9SQVRFU19NQVNLCShJRUVFODAyMTFfT0ZETV9CQVNJQ19SQVRFU19NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfOU1CX01BU0sgIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfMThNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQl9NQVNLKQorI2RlZmluZSBJRUVFODAyMTFfREVGQVVMVF9SQVRFU19NQVNLIChJRUVFODAyMTFfT0ZETV9ERUZBVUxUX1JBVEVTX01BU0sgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9DQ0tfREVGQVVMVF9SQVRFU19NQVNLKQorCisjZGVmaW5lIElFRUU4MDIxMV9OVU1fT0ZETV9SQVRFUwkgICAgOAorI2RlZmluZSBJRUVFODAyMTFfTlVNX0NDS19SQVRFUwkgICAgICAgICAgICA0CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1NISUZUX01BU0tfQSAgICAgICAgIDQKKworCisKKworLyogTk9URTogVGhpcyBkYXRhIGlzIGZvciBzdGF0aXN0aWNhbCBwdXJwb3Nlczsgbm90IGFsbCBoYXJkd2FyZSBwcm92aWRlcyB0aGlzCisgKiAgICAgICBpbmZvcm1hdGlvbiBmb3IgZnJhbWVzIHJlY2VpdmVkLiAgTm90IHNldHRpbmcgdGhlc2Ugd2lsbCBub3QgY2F1c2UKKyAqICAgICAgIGFueSBhZHZlcnNlIGFmZmVjdHMuICovCitzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzIHsKKwl1MzIgbWFjX3RpbWVbMl07CisJdTggc2lnbmFsc3RyZW5ndGg7CisJczggcnNzaTsKKwl1OCBzaWduYWw7CisJdTggbm9pc2U7CisJdTE2IHJhdGU7IC8qIGluIDEwMCBrYnBzICovCisJdTggcmVjZWl2ZWRfY2hhbm5lbDsKKwl1OCBjb250cm9sOworCXU4IG1hc2s7CisJdTggZnJlcTsKKwl1MTYgbGVuOworCXU4IG5pY190eXBlOworfTsKKworLyogSUVFRSA4MDIuMTEgcmVxdWlyZXMgdGhhdCBTVEEgc3VwcG9ydHMgY29uY3VycmVudCByZWNlcHRpb24gb2YgYXQgbGVhc3QKKyAqIHRocmVlIGZyYWdtZW50ZWQgZnJhbWVzLiBUaGlzIGRlZmluZSBjYW4gYmUgaW5jcmVhc2VkIHRvIHN1cHBvcnQgbW9yZQorICogY29uY3VycmVudCBmcmFtZXMsIGJ1dCBpdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBlYWNoIGVudHJ5IGNhbiBjb25zdW1lIGFib3V0CisgKiAyIGtCIG9mIFJBTSBhbmQgaW5jcmVhc2luZyBjYWNoZSBzaXplIHdpbGwgc2xvdyBkb3duIGZyYW1lIHJlYXNzZW1ibHkuICovCisjZGVmaW5lIElFRUU4MDIxMV9GUkFHX0NBQ0hFX0xFTiA0CisKK3N0cnVjdCBpZWVlODAyMTFfZnJhZ19lbnRyeSB7CisJdW5zaWduZWQgbG9uZyBmaXJzdF9mcmFnX3RpbWU7CisJdW5zaWduZWQgaW50IHNlcTsKKwl1bnNpZ25lZCBpbnQgbGFzdF9mcmFnOworCXN0cnVjdCBza19idWZmICpza2I7CisJdTggc3JjX2FkZHJbRVRIX0FMRU5dOworCXU4IGRzdF9hZGRyW0VUSF9BTEVOXTsKK307CisKK3N0cnVjdCBpZWVlODAyMTFfc3RhdHMgeworCXVuc2lnbmVkIGludCB0eF91bmljYXN0X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgdHhfbXVsdGljYXN0X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgdHhfZnJhZ21lbnRzOworCXVuc2lnbmVkIGludCB0eF91bmljYXN0X29jdGV0czsKKwl1bnNpZ25lZCBpbnQgdHhfbXVsdGljYXN0X29jdGV0czsKKwl1bnNpZ25lZCBpbnQgdHhfZGVmZXJyZWRfdHJhbnNtaXNzaW9uczsKKwl1bnNpZ25lZCBpbnQgdHhfc2luZ2xlX3JldHJ5X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgdHhfbXVsdGlwbGVfcmV0cnlfZnJhbWVzOworCXVuc2lnbmVkIGludCB0eF9yZXRyeV9saW1pdF9leGNlZWRlZDsKKwl1bnNpZ25lZCBpbnQgdHhfZGlzY2FyZHM7CisJdW5zaWduZWQgaW50IHJ4X3VuaWNhc3RfZnJhbWVzOworCXVuc2lnbmVkIGludCByeF9tdWx0aWNhc3RfZnJhbWVzOworCXVuc2lnbmVkIGludCByeF9mcmFnbWVudHM7CisJdW5zaWduZWQgaW50IHJ4X3VuaWNhc3Rfb2N0ZXRzOworCXVuc2lnbmVkIGludCByeF9tdWx0aWNhc3Rfb2N0ZXRzOworCXVuc2lnbmVkIGludCByeF9mY3NfZXJyb3JzOworCXVuc2lnbmVkIGludCByeF9kaXNjYXJkc19ub19idWZmZXI7CisJdW5zaWduZWQgaW50IHR4X2Rpc2NhcmRzX3dyb25nX3NhOworCXVuc2lnbmVkIGludCByeF9kaXNjYXJkc191bmRlY3J5cHRhYmxlOworCXVuc2lnbmVkIGludCByeF9tZXNzYWdlX2luX21zZ19mcmFnbWVudHM7CisJdW5zaWduZWQgaW50IHJ4X21lc3NhZ2VfaW5fYmFkX21zZ19mcmFnbWVudHM7Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX3NvZnRtYWNfc3RhdHN7CisJdW5zaWduZWQgaW50IHJ4X2Fzc19vazsKKwl1bnNpZ25lZCBpbnQgcnhfYXNzX2VycjsKKwl1bnNpZ25lZCBpbnQgcnhfcHJvYmVfcnE7CisJdW5zaWduZWQgaW50IHR4X3Byb2JlX3JzOworCXVuc2lnbmVkIGludCB0eF9iZWFjb25zOworCXVuc2lnbmVkIGludCByeF9hdXRoX3JxOworCXVuc2lnbmVkIGludCByeF9hdXRoX3JzX29rOworCXVuc2lnbmVkIGludCByeF9hdXRoX3JzX2VycjsKKwl1bnNpZ25lZCBpbnQgdHhfYXV0aF9ycTsKKwl1bnNpZ25lZCBpbnQgbm9fYXV0aF9yczsKKwl1bnNpZ25lZCBpbnQgbm9fYXNzX3JzOworCXVuc2lnbmVkIGludCB0eF9hc3NfcnE7CisJdW5zaWduZWQgaW50IHJ4X2Fzc19ycTsKKwl1bnNpZ25lZCBpbnQgdHhfcHJvYmVfcnE7CisJdW5zaWduZWQgaW50IHJlYXNzb2M7CisJdW5zaWduZWQgaW50IHN3dHhzdG9wOworCXVuc2lnbmVkIGludCBzd3R4YXdha2U7Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX2RldmljZTsKKworI2luY2x1ZGUgImllZWU4MDIxMV9jcnlwdC5oIgorCisjZGVmaW5lIFNFQ19LRVlfMSAgICAgICAgICgxPDwwKQorI2RlZmluZSBTRUNfS0VZXzIgICAgICAgICAoMTw8MSkKKyNkZWZpbmUgU0VDX0tFWV8zICAgICAgICAgKDE8PDIpCisjZGVmaW5lIFNFQ19LRVlfNCAgICAgICAgICgxPDwzKQorI2RlZmluZSBTRUNfQUNUSVZFX0tFWSAgICAoMTw8NCkKKyNkZWZpbmUgU0VDX0FVVEhfTU9ERSAgICAgKDE8PDUpCisjZGVmaW5lIFNFQ19VTklDQVNUX0dST1VQICgxPDw2KQorI2RlZmluZSBTRUNfTEVWRUwgICAgICAgICAoMTw8NykKKyNkZWZpbmUgU0VDX0VOQUJMRUQgICAgICAgKDE8PDgpCisKKyNkZWZpbmUgU0VDX0xFVkVMXzAgICAgICAwIC8qIE5vbmUgKi8KKyNkZWZpbmUgU0VDX0xFVkVMXzEgICAgICAxIC8qIFdFUCA0MCBhbmQgMTA0IGJpdCAqLworI2RlZmluZSBTRUNfTEVWRUxfMiAgICAgIDIgLyogTGV2ZWwgMSArIFRLSVAgKi8KKyNkZWZpbmUgU0VDX0xFVkVMXzJfQ0tJUCAzIC8qIExldmVsIDEgKyBDS0lQICovCisjZGVmaW5lIFNFQ19MRVZFTF8zICAgICAgNCAvKiBMZXZlbCAyICsgQ0NNUCAqLworCisjZGVmaW5lIFdFUF9LRVlTIDQKKyNkZWZpbmUgV0VQX0tFWV9MRU4gMTMKKworI2RlZmluZSBXRVBfS0VZX0xFTl9NT0RJRiAzMgorCitzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5IHsKKwl1MTYgYWN0aXZlX2tleToyLAorICAgICAgICAgICAgZW5hYmxlZDoxLAorCSAgICBhdXRoX21vZGU6MiwKKyAgICAgICAgICAgIGF1dGhfYWxnbzo0LAorICAgICAgICAgICAgdW5pY2FzdF91c2VzX2dyb3VwOjE7CisJdTgga2V5X3NpemVzW1dFUF9LRVlTXTsKKwl1OCBrZXlzW1dFUF9LRVlTXVtXRVBfS0VZX0xFTl9NT0RJRl07CisJdTggbGV2ZWw7CisJdTE2IGZsYWdzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworLyoKKworIDgwMi4xMSBkYXRhIGZyYW1lIGZyb20gQVAKKworICAgICAgLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCitCeXRlcyB8ICAyICAgfCAgMiAgIHwgICAgNiAgICB8ICAgIDYgICAgfCAgICA2ICAgIHwgIDIgICB8IDAuLjIzMTIgfCAgIDQgIHwKKyAgICAgIHwtLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLXwtLS0tLS0tLS18LS0tLS0tfAorRGVzYy4gfCBjdHJsIHwgZHVyYSB8ICBEQS9SQSAgfCAgIFRBICAgIHwgICAgU0EgICB8IFNlcXUgfCAgZnJhbWUgIHwgIGZjcyB8CisgICAgICB8ICAgICAgfCB0aW9uIHwgKEJTU0lEKSB8ICAgICAgICAgfCAgICAgICAgIHwgZW5jZSB8ICBkYXRhICAgfCAgICAgIHwKKyAgICAgIGAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJworCitUb3RhbDogMjgtMjM0MCBieXRlcworCisqLworCitzdHJ1Y3QgaWVlZTgwMjExX2hlYWRlcl9kYXRhIHsKKwl1MTYgZnJhbWVfY3RsOworCXUxNiBkdXJhdGlvbl9pZDsKKwl1OCBhZGRyMVs2XTsKKwl1OCBhZGRyMls2XTsKKwl1OCBhZGRyM1s2XTsKKwl1MTYgc2VxX2N0cmw7Cit9OworCisjZGVmaW5lIEJFQUNPTl9QUk9CRV9TU0lEX0lEX1BPU0lUSU9OIDEyCisKKy8qIE1hbmFnZW1lbnQgRnJhbWUgSW5mb3JtYXRpb24gRWxlbWVudCBUeXBlcyAqLworI2RlZmluZSBNRklFX1RZUEVfU1NJRCAgICAgICAwCisjZGVmaW5lIE1GSUVfVFlQRV9SQVRFUyAgICAgIDEKKyNkZWZpbmUgTUZJRV9UWVBFX0ZIX1NFVCAgICAgMgorI2RlZmluZSBNRklFX1RZUEVfRFNfU0VUICAgICAzCisjZGVmaW5lIE1GSUVfVFlQRV9DRl9TRVQgICAgIDQKKyNkZWZpbmUgTUZJRV9UWVBFX1RJTSAgICAgICAgNQorI2RlZmluZSBNRklFX1RZUEVfSUJTU19TRVQgICA2CisjZGVmaW5lIE1GSUVfVFlQRV9DT1VOVFJZICA3IC8vK1lKLDA4MDYyNQorI2RlZmluZSBNRklFX1RZUEVfQ0hBTExFTkdFICAxNgorI2RlZmluZSBNRklFX1RZUEVfRVJQICAgICAgICA0MgorI2RlZmluZSBNRklFX1RZUEVfUlNOCSAgICAgNDgKKyNkZWZpbmUgTUZJRV9UWVBFX1JBVEVTX0VYICAgNTAKKyNkZWZpbmUgTUZJRV9UWVBFX0dFTkVSSUMgICAgMjIxCisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECit0eXBlZGVmIGVudW0KK3sKKwlDT1VOVFJZX0NPREVfRkNDID0gMCwKKwlDT1VOVFJZX0NPREVfSUMgPSAxLAorCUNPVU5UUllfQ09ERV9FVFNJID0gMiwKKwlDT1VOVFJZX0NPREVfU1BBSU4gPSAzLAorCUNPVU5UUllfQ09ERV9GUkFOQ0UgPSA0LAorCUNPVU5UUllfQ09ERV9NS0sgPSA1LAorCUNPVU5UUllfQ09ERV9NS0sxID0gNiwKKwlDT1VOVFJZX0NPREVfSVNSQUVMID0gNywKKwlDT1VOVFJZX0NPREVfVEVMRUMgPSA4LAorCUNPVU5UUllfQ09ERV9HTE9CQUxfRE9NQUlOID0gOSwKKwlDT1VOVFJZX0NPREVfV09STERfV0lERV8xM19JTkRFWCA9IDEwCit9Y291bnRyeV9jb2RlX3R5cGVfdDsKKyNlbmRpZgorCitzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudF9oZHIgeworCXU4IGlkOworCXU4IGxlbjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCB7CisJdTggaWQ7CisJdTggbGVuOworCXU4IGRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgZGF0YSB0eXBlcyB0aGF0IGNhbiBtYWtlIHVwIG1hbmFnZW1lbnQgcGFja2V0cworICoKKwl1MTYgYXV0aF9hbGdvcml0aG07CisJdTE2IGF1dGhfc2VxdWVuY2U7CisJdTE2IGJlYWNvbl9pbnRlcnZhbDsKKwl1MTYgY2FwYWJpbGl0eTsKKwl1OCBjdXJyZW50X2FwW0VUSF9BTEVOXTsKKwl1MTYgbGlzdGVuX2ludGVydmFsOworCXN0cnVjdCB7CisJCXUxNiBhc3NvY2lhdGlvbl9pZDoxNCwgcmVzZXJ2ZWQ6MjsKKwl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwl1MzIgdGltZV9zdGFtcFsyXTsKKwl1MTYgcmVhc29uOworCXUxNiBzdGF0dXM7CisqLworCisjZGVmaW5lIElFRUU4MDIxMV9ERUZBVUxUX1RYX0VTU0lEICJQZW5ndWluIgorI2RlZmluZSBJRUVFODAyMTFfREVGQVVMVF9CQVNJQ19SQVRFIDEwCisKK3N0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24geworCXN0cnVjdCBpZWVlODAyMTFfaGVhZGVyX2RhdGEgaGVhZGVyOworCXUxNiBhbGdvcml0aG07CisJdTE2IHRyYW5zYWN0aW9uOworCXUxNiBzdGF0dXM7CisJLy9zdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudF9oZHIgaW5mb19lbGVtZW50OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSB7CisJc3RydWN0IGllZWU4MDIxMV9oZWFkZXJfZGF0YSBoZWFkZXI7CisJdTMyIHRpbWVfc3RhbXBbMl07CisJdTE2IGJlYWNvbl9pbnRlcnZhbDsKKwl1MTYgY2FwYWJpbGl0eTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXF1ZXN0IHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hlYWRlcl9kYXRhIGhlYWRlcjsKKwkvKnN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudDsqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdF9mcmFtZSB7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOworCXUxNiBjYXBhYmlsaXR5OworCXUxNiBsaXN0ZW5faW50ZXJ2YWw7CisJLy91OCBjdXJyZW50X2FwW0VUSF9BTEVOXTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudF9oZHIgaW5mb19lbGVtZW50OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUgeworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyIGhlYWRlcjsKKwl1MTYgY2FwYWJpbGl0eTsKKwl1MTYgc3RhdHVzOworCXUxNiBhaWQ7CisJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgaW5mb19lbGVtZW50OyAvKiBzdXBwb3J0ZWQgcmF0ZXMgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2Rpc2Fzc29jX2ZyYW1leworICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7CisgICAgICAgIHUxNiAgICByZWFzb25jb2RlOworfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV90eGIgeworCXU4IG5yX2ZyYWdzOworCXU4IGVuY3J5cHRlZDsKKwl1MTYgcmVzZXJ2ZWQ7CisJdTE2IGZyYWdfc2l6ZTsKKwl1MTYgcGF5bG9hZF9zaXplOworCXN0cnVjdCBza19idWZmICpmcmFnbWVudHNbMF07Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX3dtbV9hY19wYXJhbSB7CisJdTggYWNfYWNpX2FjbV9haWZzbjsKKwl1OCBhY19lY3dtaW5fZWN3bWF4OworCXUxNiBhY190eG9wX2xpbWl0OworfTsKKworc3RydWN0IGllZWU4MDIxMV93bW1fdHNfaW5mbyB7CisJdTggYWNfZGlyX3RpZDsKKwl1OCBhY191cF9wc2I7CisJdTggcmVzZXJ2ZWQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV93bW1fdHNwZWNfZWxlbSB7CisJc3RydWN0IGllZWU4MDIxMV93bW1fdHNfaW5mbyB0c19pbmZvOworCXUxNiBub3JtX21zZHVfc2l6ZTsKKwl1MTYgbWF4X21zZHVfc2l6ZTsKKwl1MzIgbWluX3NlcnZfaW50ZXI7CisJdTMyIG1heF9zZXJ2X2ludGVyOworCXUzMiBpbmFjdF9pbnRlcjsKKwl1MzIgc3VzcGVuX2ludGVyOworCXUzMiBzZXJ2X3N0YXJ0X3RpbWU7CisJdTMyIG1pbl9kYXRhX3JhdGU7CisJdTMyIG1lYW5fZGF0YV9yYXRlOworCXUzMiBwZWFrX2RhdGFfcmF0ZTsKKwl1MzIgbWF4X2J1cnN0X3NpemU7CisJdTMyIGRlbGF5X2JvdW5kOworCXUzMiBtaW5fcGh5X3JhdGU7CisJdTE2IHN1cnBfYmFuZF9hbGxvdzsKKwl1MTYgbWVkaXVtX3RpbWU7Cit9X19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK2VudW0ge1dNTV9hbGxfZnJhbWUsIFdNTV90d29fZnJhbWUsIFdNTV9mb3VyX2ZyYW1lLCBXTU1fc2l4X2ZyYW1lfTsKKyNkZWZpbmUgTUFYX1NQX0xlbiAgKFdNTV9hbGxfZnJhbWUgPDwgNCkKKyNkZWZpbmUgSUVFRTgwMjExX1FPU19USUQgMHgwZgorI2RlZmluZSBRT1NfQ1RMX05PVENPTlRBSU5fQUNLICgweDAxIDw8IDUpCisKKy8qIFNXRUVQIFRBQkxFIEVOVFJJRVMgTlVNQkVSKi8KKyNkZWZpbmUgTUFYX1NXRUVQX1RBQl9FTlRSSUVTCQkgIDQyCisjZGVmaW5lIE1BWF9TV0VFUF9UQUJfRU5UUklFU19QRVJfUEFDS0VUICA3CisvKiBNQVhfUkFURVNfTEVOR1RIIG5lZWRzIHRvIGJlIDEyLiAgVGhlIHNwZWMgc2F5cyA4LCBhbmQgbWFueSBBUHMKKyAqIG9ubHkgdXNlIDgsIGFuZCB0aGVuIHVzZSBleHRlbmRlZCByYXRlcyBmb3IgdGhlIHJlbWFpbmluZyBzdXBwb3J0ZWQKKyAqIHJhdGVzLiAgT3RoZXIgQVBzLCBob3dldmVyLCBzdGljayBhbGwgb2YgdGhlaXIgc3VwcG9ydGVkIHJhdGVzIG9uIHRoZQorICogbWFpbiByYXRlcyBpbmZvcm1hdGlvbiBlbGVtZW50Li4uICovCisjZGVmaW5lIE1BWF9SQVRFU19MRU5HVEggICAgICAgICAgICAgICAgICAoKHU4KTEyKQorI2RlZmluZSBNQVhfUkFURVNfRVhfTEVOR1RIICAgICAgICAgICAgICAgKCh1OCkxNikKKyNkZWZpbmUgTUFYX05FVFdPUktfQ09VTlQgICAgICAgICAgICAgICAgICAxMjgKKy8vI2RlZmluZSBNQVhfQ0hBTk5FTF9OVU1CRVIgICAgICAgICAgICAgICAgIDE2MQorI2RlZmluZSBNQVhfQ0hBTk5FTF9OVU1CRVIgICAgICAgICAgICAgICAgIDE2NSAvL1lKLG1vZGlmaWVkLDA4MDYyNQorI2RlZmluZSBNQVhfSUVfTEVOCQkJCQkJMHhGRiAvLytZSiwwODA2MjUKKwordHlwZWRlZiBzdHJ1Y3QgX0NIQU5ORUxfTElTVHsKKwl1OAlDaGFubmVsW01BWF9DSEFOTkVMX05VTUJFUiArIDFdOworCXU4CUxlbjsKK31DSEFOTkVMX0xJU1QsICpQQ0hBTk5FTF9MSVNUOworCisjZGVmaW5lIElFRUU4MDIxMV9TT0ZUTUFDX1NDQU5fVElNRQkgIDEwMC8vNDAwCisvLyhIWiAvIDIpCisvL2J5IGFteSBmb3IgcHMKKyNkZWZpbmUgSUVFRTgwMjExX1dBVENIX0RPR19USU1FICAgIDIwMDAKKy8vYnkgYW15IGZvciBwcworLy9ieSBhbXkgZm9yIGFudGVubmEKKyNkZWZpbmUgQU5URU5OQV9ESVZFUlNJVFlfVElNRVJfUEVSSU9ECQkxMDAwIC8vIDEwMDAgbQorLy9ieSBhbXkgZm9yIGFudGVubmEKKyNkZWZpbmUgSUVFRTgwMjExX1NPRlRNQUNfQVNTT0NfUkVUUllfVElNRSAoSFogKiAyKQorCisjZGVmaW5lIENSQ19MRU5HVEggICAgICAgICAgICAgICAgIDRVCisKKyNkZWZpbmUgTUFYX1dQQV9JRV9MRU4gNjQKKworI2RlZmluZSBORVRXT1JLX0VNUFRZX0VTU0lEICgxPDwwKQorI2RlZmluZSBORVRXT1JLX0hBU19PRkRNICAgICgxPDwxKQorI2RlZmluZSBORVRXT1JLX0hBU19DQ0sgICAgICgxPDwyKQorCisjZGVmaW5lIElFRUU4MDIxMV9EVElNX01CQ0FTVCA0CisjZGVmaW5lIElFRUU4MDIxMV9EVElNX1VDQVNUIDIKKyNkZWZpbmUgSUVFRTgwMjExX0RUSU1fVkFMSUQgMQorI2RlZmluZSBJRUVFODAyMTFfRFRJTV9JTlZBTElEIDAKKworI2RlZmluZSBJRUVFODAyMTFfUFNfRElTQUJMRUQgMAorI2RlZmluZSBJRUVFODAyMTFfUFNfVU5JQ0FTVCBJRUVFODAyMTFfRFRJTV9VQ0FTVAorI2RlZmluZSBJRUVFODAyMTFfUFNfTUJDQVNUIElFRUU4MDIxMV9EVElNX01CQ0FTVAorI2RlZmluZSBJRUVFODAyMTFfUFNfRU5BQkxFICAgSUVFRTgwMjExX0RUSU1fVkFMSUQKKy8vYWRkZWQgYnkgRGF2aWQgZm9yIFFvUyAyMDA2LzYvMzAKKy8vI2RlZmluZSBXTU1fSGFuZ184MTg3CisjaWZkZWYgV01NX0hhbmdfODE4NworI3VuZGVmIFdNTV9IYW5nXzgxODcKKyNlbmRpZgorCisjZGVmaW5lIFdNRV9BQ19CRSAgIDB4MDAKKyNkZWZpbmUgV01FX0FDX0JLICAgMHgwMQorI2RlZmluZSBXTUVfQUNfVkkgICAweDAyCisjZGVmaW5lIFdNRV9BQ19WTyAgIDB4MDMKKyNkZWZpbmUgV01FX0FDSV9NQVNLIDB4MDMKKyNkZWZpbmUgV01FX0FJRlNOX01BU0sgMHgwMworI2RlZmluZSBXTUVfQUNfUFJBTV9MRU4gMTYKKworLy9VUCBNYXBwaW5nIHRvIEFDLCB1c2luZyBpbiBNZ250UXVlcnlfU2VxdWVuY2VOdW1iZXIoKSBhbmQgbWF5YmUgZm9yIERTQ1AKKy8vI2RlZmluZSBVUDJBQyh1cCkJKCh1cDwzKSA/ICgodXA9PTApPzE6MCkgOiAodXA+PjEpKQorI2RlZmluZSBVUDJBQyh1cCkgKAkJICAgXAorCSgodXApIDwgMSkgPyBXTUVfQUNfQkUgOiBcCisJKCh1cCkgPCAzKSA/IFdNRV9BQ19CSyA6IFwKKwkoKHVwKSA8IDQpID8gV01FX0FDX0JFIDogXAorCSgodXApIDwgNikgPyBXTUVfQUNfVkkgOiBcCisJV01FX0FDX1ZPKQorLy9BQyBNYXBwaW5nIHRvIFVQLCB1c2luZyBpbiBUeCBwYXJ0IGZvciBzZWxlY3RpbmcgdGhlIGNvcnJlc3BvbmRpbmcgVFggcXVldWUKKyNkZWZpbmUgQUMyVVAoX2FjKQkoICAgICAgIFwKKwkoKF9hYykgPT0gV01FX0FDX1ZPKSA/IDYgOiBcCisJKChfYWMpID09IFdNRV9BQ19WSSkgPyA1IDogXAorCSgoX2FjKSA9PSBXTUVfQUNfQkspID8gMSA6IFwKKwkwKQorCisjZGVmaW5lCUVUSEVSX0FERFJfTEVOCQk2CS8qIGxlbmd0aCBvZiBhbiBFdGhlcm5ldCBhZGRyZXNzICovCitzdHJ1Y3QJZXRoZXJfaGVhZGVyIHsKKwl1OCBldGhlcl9kaG9zdFtFVEhFUl9BRERSX0xFTl07CisJdTggZXRoZXJfc2hvc3RbRVRIRVJfQUREUl9MRU5dOworCXUxNiBldGhlcl90eXBlOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2lmbmRlZiBFVEhFUlRZUEVfUEFFCisjZGVmaW5lCUVUSEVSVFlQRV9QQUUJMHg4ODhlCQkvKiBFQVBPTCBQQUUvODAyLjF4ICovCisjZW5kaWYKKyNpZm5kZWYgRVRIRVJUWVBFX0lQCisjZGVmaW5lCUVUSEVSVFlQRV9JUAkweDA4MDAJCS8qIElQIHByb3RvY29sICovCisjZW5kaWYKKworc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrIHsKKwkvKiBUaGVzZSBlbnRyaWVzIGFyZSB1c2VkIHRvIGlkZW50aWZ5IGEgdW5pcXVlIG5ldHdvcmsgKi8KKwl1OCBic3NpZFtFVEhfQUxFTl07CisJdTggY2hhbm5lbDsKKwkvKiBFbnN1cmUgbnVsbC10ZXJtaW5hdGVkIGZvciBhbnkgZGVidWcgbXNncyAqLworCXU4IHNzaWRbSVdfRVNTSURfTUFYX1NJWkUgKyAxXTsKKwl1OCBzc2lkX2xlbjsKKworCS8qIFRoZXNlIGFyZSBuZXR3b3JrIHN0YXRpc3RpY3MgKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzIHN0YXRzOworCXUxNiBjYXBhYmlsaXR5OworCXU4IHJhdGVzW01BWF9SQVRFU19MRU5HVEhdOworCXU4IHJhdGVzX2xlbjsKKwl1OCByYXRlc19leFtNQVhfUkFURVNfRVhfTEVOR1RIXTsKKwl1OCByYXRlc19leF9sZW47CisJdW5zaWduZWQgbG9uZyBsYXN0X3NjYW5uZWQ7CisJdTggbW9kZTsKKwl1OCBmbGFnczsKKwl1MzIgbGFzdF9hc3NvY2lhdGU7CisJdTMyIHRpbWVfc3RhbXBbMl07CisJdTE2IGJlYWNvbl9pbnRlcnZhbDsKKwl1MTYgbGlzdGVuX2ludGVydmFsOworCXUxNiBhdGltX3dpbmRvdzsKKwl1OCB3cGFfaWVbTUFYX1dQQV9JRV9MRU5dOworCXNpemVfdCB3cGFfaWVfbGVuOworCXU4IHJzbl9pZVtNQVhfV1BBX0lFX0xFTl07CisJc2l6ZV90IHJzbl9pZV9sZW47CisJdTggZHRpbV9wZXJpb2Q7CisJdTggZHRpbV9kYXRhOworCXUzMiBsYXN0X2R0aW1fc3RhX3RpbWVbMl07CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCS8vYXBwZWRlZCBmb3IgUW9TCisJdTggd21tX2luZm87CisJc3RydWN0IGllZWU4MDIxMV93bW1fYWNfcGFyYW0gd21tX3BhcmFtWzRdOworCXU4IFFvU19FbmFibGU7CisJdTggU2lnbmFsU3RyZW5ndGg7CisvL2J5IGFteSAwODAzMTIKKwl1OCBIaWdoZXN0T3BlcmFSYXRlOworLy9ieSBhbXkgMDgwMzEyCisjaWZkZWYgVEhPTUFTX1RVUkJPCisJdTggVHVyYm9fRW5hYmxlOy8vZW5hYmxlIHR1cmJvIG1vZGUsIGFkZGVkIGJ5IHRob21hcworI2VuZGlmCisjaWZkZWYgRU5BQkxFX0RPVDExRAorCXUxNiBDb3VudHJ5SWVMZW47CisJdTggQ291bnRyeUllQnVmW01BWF9JRV9MRU5dOworI2VuZGlmCit9OworCitlbnVtIGllZWU4MDIxMV9zdGF0ZSB7CisKKwkvKiB0aGUgY2FyZCBpcyBub3QgbGlua2VkIGF0IGFsbCAqLworCUlFRUU4MDIxMV9OT0xJTksgPSAwLAorCisJLyogSUVFRTgwMjExX0FTU09DSUFUSU5HKiBhcmUgZm9yIEJTUyBjbGllbnQgbW9kZQorCSAqIHRoZSBkcml2ZXIgc2hhbGwgbm90IHBlcmZvcm0gUlggZmlsdGVyaW5nIHVubGVzcworCSAqIHRoZSBzdGF0ZSBpcyBMSU5LRUQuCisJICogVGhlIGRyaXZlciBzaGFsbCBqdXN0IGNoZWNrIGZvciB0aGUgc3RhdGUgTElOS0VEIGFuZAorCSAqIGRlZmF1bHRzIHRvIE5PTElOSyBmb3IgQUxMIHRoZSBvdGhlciBzdGF0ZXMgKGluY2x1ZGluZworCSAqIExJTktFRF9TQ0FOTklORykKKwkgKi8KKworCS8qIHRoZSBhc3NvY2lhdGlvbiBwcm9jZWR1cmUgd2lsbCBzdGFydCAod3Egc2NoZWR1bGluZykqLworCUlFRUU4MDIxMV9BU1NPQ0lBVElORywKKwlJRUVFODAyMTFfQVNTT0NJQVRJTkdfUkVUUlksCisKKwkvKiB0aGUgYXNzb2NpYXRpb24gcHJvY2VkdXJlIGlzIHNlbmRpbmcgQVVUSCByZXF1ZXN0Ki8KKwlJRUVFODAyMTFfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRJTkcsCisKKwkvKiB0aGUgYXNzb2NpYXRpb24gcHJvY2VkdXJlIGhhcyBzdWNjZXNzZnVsbHkgYXV0aGVudGNhdGVkCisJICogYW5kIGlzIHNlbmRpbmcgYXNzb2NpYXRpb24gcmVxdWVzdAorCSAqLworCUlFRUU4MDIxMV9BU1NPQ0lBVElOR19BVVRIRU5USUNBVEVELAorCisJLyogdGhlIGxpbmsgaXMgb2suIHRoZSBjYXJkIGFzc29jaWF0ZWQgdG8gYSBCU1Mgb3IgbGlua2VkCisJICogdG8gYSBpYnNzIGNlbGwgb3IgYWN0aW5nIGFzIGFuIEFQIGFuZCBjcmVhdGluZyB0aGUgYnNzCisJICovCisJSUVFRTgwMjExX0xJTktFRCwKKworCS8qIHNhbWUgYXMgTElOS0VELCBidXQgdGhlIGRyaXZlciBzaGFsbCBhcHBseSBSWCBmaWx0ZXIKKwkgKiBydWxlcyBhcyB3ZSBhcmUgaW4gTk9fTElOSyBtb2RlLiBBcyB0aGUgY2FyZCBpcyBzdGlsbAorCSAqIGxvZ2ljYWxseSBsaW5rZWQsIGJ1dCBpdCBpcyBkb2luZyBhIHN5bmNybyBzaXRlIHN1cnZleQorCSAqIHRoZW4gaXQgd2lsbCBiZSBiYWNrIHRvIExJTktFRCBzdGF0ZS4KKwkgKi8KKwlJRUVFODAyMTFfTElOS0VEX1NDQU5OSU5HLAorCit9OworCisjZGVmaW5lIERFRkFVTFRfTUFYX1NDQU5fQUdFICgxNSAqIEhaKQorI2RlZmluZSBERUZBVUxUX0ZUUyAyMzQ2CisjZGVmaW5lIE1BQ19GTVQgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IgorI2RlZmluZSBNQUNfQVJHKHgpICgodTgqKSh4KSlbMF0sKCh1OCopKHgpKVsxXSwoKHU4KikoeCkpWzJdLCgodTgqKSh4KSlbM10sKCh1OCopKHgpKVs0XSwoKHU4KikoeCkpWzVdCisKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPD0gS0VSTkVMX1ZFUlNJT04oMiw2LDExKSkKK2V4dGVybiBpbmxpbmUgaW50IGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGNvbnN0IHU4ICphZGRyKQoreworICAgICAgICByZXR1cm4gKChhZGRyWzBdICE9IDB4ZmYpICYmICgweDAxICYgYWRkclswXSkpOworfQorI2VuZGlmCisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDw9IEtFUk5FTF9WRVJTSU9OKDIsNiwxMykpCitleHRlcm4gaW5saW5lIGludCBpc19icm9hZGNhc3RfZXRoZXJfYWRkcihjb25zdCB1OCAqYWRkcikKK3sKKwlyZXR1cm4gKChhZGRyWzBdID09IDB4ZmYpICYmIChhZGRyWzFdID09IDB4ZmYpICYmIChhZGRyWzJdID09IDB4ZmYpICYmICAgXAorCQkoYWRkclszXSA9PSAweGZmKSAmJiAoYWRkcls0XSA9PSAweGZmKSAmJiAoYWRkcls1XSA9PSAweGZmKSk7Cit9CisjZW5kaWYKKworI2RlZmluZSBDRkdfSUVFRTgwMjExX1JFU0VSVkVfRkNTICgxPDwwKQorI2RlZmluZSBDRkdfSUVFRTgwMjExX0NPTVBVVEVfRkNTICgxPDwxKQorCit0eXBlZGVmIHN0cnVjdCB0eF9wZW5kaW5nX3R7CisJaW50IGZyYWc7CisJc3RydWN0IGllZWU4MDIxMV90eGIgKnR4YjsKK310eF9wZW5kaW5nX3Q7CisKKworc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgeworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwkvKiBCb29ra2VlcGluZyBzdHJ1Y3R1cmVzICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IGllZWU4MDIxMV9zdGF0cyBpZWVlX3N0YXRzOworCXN0cnVjdCBpZWVlODAyMTFfc29mdG1hY19zdGF0cyBzb2Z0bWFjX3N0YXRzOworCisJLyogUHJvYmUgLyBCZWFjb24gbWFuYWdlbWVudCAqLworCXN0cnVjdCBsaXN0X2hlYWQgbmV0d29ya19mcmVlX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBuZXR3b3JrX2xpc3Q7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrczsKKwlpbnQgc2NhbnM7CisJaW50IHNjYW5fYWdlOworCisJaW50IGl3X21vZGU7IC8qIG9wZXJhdGluZyBtb2RlIChJV19NT0RFXyopICovCisKKwlzcGlubG9ja190IGxvY2s7CisJc3BpbmxvY2tfdCB3cGF4X3N1aXRsaXN0X2xvY2s7CisKKwlpbnQgdHhfaGVhZHJvb207IC8qIFNldCB0byBzaXplIG9mIGFueSBhZGRpdGlvbmFsIHJvb20gbmVlZGVkIGF0IGZyb250CisJCQkgICogb2YgYWxsb2NhdGVkIFR4IFNLQnMgKi8KKwl1MzIgY29uZmlnOworCisJLyogV0VQIGFuZCBvdGhlciBlbmNyeXB0aW9uIHJlbGF0ZWQgc2V0dGluZ3MgYXQgdGhlIGRldmljZSBsZXZlbCAqLworCWludCBvcGVuX3dlcDsgLyogU2V0IHRvIDEgdG8gYWxsb3cgdW5lbmNyeXB0ZWQgZnJhbWVzICovCisKKwlpbnQgcmVzZXRfb25fa2V5Y2hhbmdlOyAvKiBTZXQgdG8gMSBpZiB0aGUgSFcgbmVlZHMgdG8gYmUgcmVzZXQgb24KKwkJCQkgKiBXRVAga2V5IGNoYW5nZXMgKi8KKworCS8qIElmIHRoZSBob3N0IHBlcmZvcm1zIHtlbixkZX1jcnlwdGlvbiwgdGhlbiBzZXQgdG8gMSAqLworCWludCBob3N0X2VuY3J5cHQ7CisJaW50IGhvc3RfZGVjcnlwdDsKKwlpbnQgaWVlZTgwMl8xeDsgLyogaXMgSUVFRSA4MDIuMVggdXNlZCAqLworCisJLyogV1BBIGRhdGEgKi8KKwlpbnQgd3BhX2VuYWJsZWQ7CisJaW50IGRyb3BfdW5lbmNyeXB0ZWQ7CisJaW50IHRraXBfY291bnRlcm1lYXN1cmVzOworCWludCBwcml2YWN5X2ludm9rZWQ7CisJc2l6ZV90IHdwYV9pZV9sZW47CisJdTggKndwYV9pZTsKKworCXU4IGFwX21hY19hZGRyWzZdOworCXUxNiBwYWlyd2lzZV9rZXlfdHlwZTsKKwl1MTYgYnJvYWRjYXN0X2tleV90eXBlOworCisJc3RydWN0IGxpc3RfaGVhZCBjcnlwdF9kZWluaXRfbGlzdDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0W1dFUF9LRVlTXTsKKwlpbnQgdHhfa2V5aWR4OyAvKiBkZWZhdWx0IFRYIGtleSBpbmRleCAoY3J5cHRbdHhfa2V5aWR4XSkgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBjcnlwdF9kZWluaXRfdGltZXI7CisKKwlpbnQgYmNyeF9zdGFfa2V5OyAvKiB1c2UgaW5kaXZpZHVhbCBrZXlzIHRvIG92ZXJyaWRlIGRlZmF1bHQga2V5cyBldmVuCisJCQkgICAqIHdpdGggUlggb2YgYnJvYWQvbXVsdGljYXN0IGZyYW1lcyAqLworCisJLyogRnJhZ21lbnRhdGlvbiBzdHJ1Y3R1cmVzICovCisJLy8gZWFjaCBzdHJlYW1pbmcgY29udGFpbiBhIGVudHJ5CisJc3RydWN0IGllZWU4MDIxMV9mcmFnX2VudHJ5IGZyYWdfY2FjaGVbMTddW0lFRUU4MDIxMV9GUkFHX0NBQ0hFX0xFTl07CisJdW5zaWduZWQgaW50IGZyYWdfbmV4dF9pZHhbMTddOworCXUxNiBmdHM7IC8qIEZyYWdtZW50YXRpb24gVGhyZXNob2xkICovCisKKwkvKiBUaGlzIHN0b3JlcyBpbmZvcyBmb3IgdGhlIGN1cnJlbnQgbmV0d29yay4KKwkgKiBFaXRoZXIgdGhlIG5ldHdvcmsgd2UgYXJlIGFzc29jaWF0ZWQgaW4gSU5GUkFTVFJVQ1RVUkUKKwkgKiBvciB0aGUgbmV0d29yayB0aGF0IHdlIGFyZSBjcmVhdGluZyBpbiBNQVNURVIgbW9kZS4KKwkgKiBhZC1ob2MgaXMgYSBtaXh0dXJlIDstKS4KKwkgKiBOb3RlIHRoYXQgaW4gaW5mcmFzdHJ1Y3R1cmUgbW9kZSwgZXZlbiB3aGVuIG5vdCBhc3NvY2lhdGVkLAorCSAqIGZpZWxkcyBic3NpZCBhbmQgZXNzaWQgbWF5IGJlIHZhbGlkIChpZiB3cGFfc2V0IGFuZCBlc3NpZF9zZXQKKwkgKiBhcmUgdHJ1ZSkgYXMgdGh5IGNhcnJ5IHRoZSB2YWx1ZSBzZXQgYnkgdGhlIHVzZXIgdmlhIGl3Y29uZmlnCisJICovCisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrIGN1cnJlbnRfbmV0d29yazsKKworCisJZW51bSBpZWVlODAyMTFfc3RhdGUgc3RhdGU7CisKKwlpbnQgc2hvcnRfc2xvdDsKKwlpbnQgbW9kZTsgICAgICAgLyogQSwgQiwgRyAqLworCWludCBtb2R1bGF0aW9uOyAvKiBDQ0ssIE9GRE0gKi8KKwlpbnQgZnJlcV9iYW5kOyAgLyogMi40R2h6LCA1LjJHaHosIE1peGVkICovCisJaW50IGFiZ190cnVlOyAgIC8qIEFCRyBmbGFnICAgICAgICAgICAgICAqLworCisJLyogdXNlZCBmb3IgZm9yY2luZyB0aGUgaWJzcyB3b3JrcXVldWUgdG8gdGVybWluYXRlCisJICogd2l0aG91dCB3YWl0IGZvciB0aGUgc3luY3JvIHNjYW4gdG8gdGVybWluYXRlCisJICovCisJc2hvcnQgc3luY19zY2FuX2h1cnJ5dXA7CisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJdm9pZCAqIHBEb3QxMWRJbmZvOworCWJvb2wgYkdsb2JhbERvbWFpbjsKKworCS8vIEZvciBMaXRlb24gQ2gxMn4xMyBwYXNzaXZlIHNjYW4KKwl1OAlNaW5QYXNzaXZlQ2hubE51bTsKKwl1OAlJYnNzU3RhcnRDaG5sOworI2Vsc2UKKwkvKiBtYXAgb2YgYWxsb3dlZCBjaGFubmVscy4gMCBpcyBkdW1teSAqLworCS8vIEZJWE1FOiByZW1lYmVyIHRvIGRlZmF1bHQgdG8gYSBiYXNpYyBjaGFubmVsIHBsYW4gZGVwZW5kaW5nIG9mIHRoZSBQSFkgdHlwZQorCWludCBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07CisjZW5kaWYKKworCWludCByYXRlOyAgICAgICAvKiBjdXJyZW50IHJhdGUgKi8KKwlpbnQgYmFzaWNfcmF0ZTsKKwkvL0ZJWE1FOiBwbGVhY2UgY2FsbGJhY2ssIHNlZSBpZiByZWR1bmRhbnQgd2l0aCBzb2Z0bWFjX2ZlYXR1cmVzCisJc2hvcnQgYWN0aXZlX3NjYW47CisKKwkvKiB0aGlzIGNvbnRhaW5zIGZsYWdzIGZvciBzZWxlY3RpdmVseSBlbmFibGUgc29mdG1hYyBzdXBwb3J0ICovCisJdTE2IHNvZnRtYWNfZmVhdHVyZXM7CisKKwkvKiBpZiB0aGUgc2VxdWVuY2UgY29udHJvbCBmaWVsZCBpcyBub3QgZmlsbGVkIGJ5IEhXICovCisJdTE2IHNlcV9jdHJsWzVdOworCisJLyogYXNzb2NpYXRpb24gcHJvY2VkdXJlIHRyYW5zYWN0aW9uIHNlcXVlbmNlIG51bWJlciAqLworCXUxNiBhc3NvY2lhdGVfc2VxOworCisJLyogQUlEIGZvciBSVFhlZCBhc3NvY2lhdGlvbiByZXNwb25zZXMgKi8KKwl1MTYgYXNzb2NfaWQ7CisKKwkvKiBwb3dlciBzYXZlIG1vZGUgcmVsYXRlZCovCisJc2hvcnQgcHM7CisJc2hvcnQgc3RhX3NsZWVwOworCWludCBwc190aW1lb3V0OworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBwc190YXNrOworCXUzMiBwc190aDsKKwl1MzIgcHNfdGw7CisKKwlzaG9ydCByYXdfdHg7CisJLyogdXNlZCBpZiBJRUVFX1NPRlRNQUNfVFhfUVVFVUUgaXMgc2V0ICovCisJc2hvcnQgcXVldWVfc3RvcDsKKwlzaG9ydCBzY2FubmluZzsKKwlzaG9ydCBwcm90b19zdGFydGVkOworCisJc3RydWN0IHNlbWFwaG9yZSB3eF9zZW07CisJc3RydWN0IHNlbWFwaG9yZSBzY2FuX3NlbTsKKworCXNwaW5sb2NrX3QgbWdtdF90eF9sb2NrOworCXNwaW5sb2NrX3QgYmVhY29uX2xvY2s7CisKKwlzaG9ydCBiZWFjb25fdHhpbmc7CisKKwlzaG9ydCB3YXBfc2V0OworCXNob3J0IHNzaWRfc2V0OworCisJdTggIHdwYXhfdHlwZV9zZXQ7ICAgIC8ve2FkZGVkIGJ5IERhdmlkLCAyMDA2LjkuMjh9CisJdTMyIHdwYXhfdHlwZV9ub3RpZnk7IC8ve2FkZGVkIGJ5IERhdmlkLCAyMDA2LjkuMjZ9CisKKwkvKiBRb1MgcmVsYXRlZCBmbGFnICovCisJY2hhciBpbml0X3dtbXBhcmFtX2ZsYWc7CisKKwkvKiBmb3IgZGlzY2FyZGluZyBkdXBsaWNhdGVkIHBhY2tldHMgaW4gSUJTUyAqLworCXN0cnVjdCBsaXN0X2hlYWQgaWJzc19tYWNfaGFzaFtJRUVFX0lCU1NfTUFDX0hBU0hfU0laRV07CisKKwkvKiBmb3IgZGlzY2FyZGluZyBkdXBsaWNhdGVkIHBhY2tldHMgaW4gQlNTICovCisJdTE2IGxhc3RfcnhzZXFfbnVtWzE3XTsgLyogcnggc2VxIHByZXZpb3VzIHBlci10aWQgKi8KKwl1MTYgbGFzdF9yeGZyYWdfbnVtWzE3XTsvKiB0eCBmcmFnIHByZXZpb3VzIHBlci10aWQgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfcGFja2V0X3RpbWVbMTddOworCisJLyogZm9yIFBTIG1vZGUgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfcnhfcHNfdGltZTsKKworCS8qIHVzZWQgaWYgSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRSBpcyBzZXQgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqbWdtdF9xdWV1ZV9yaW5nW01HTVRfUVVFVUVfTlVNXTsKKwlpbnQgbWdtdF9xdWV1ZV9oZWFkOworCWludCBtZ210X3F1ZXVlX3RhaWw7CisKKworCS8qIHVzZWQgaWYgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFIGlzIHNldCAqLworCXN0cnVjdCAgdHhfcGVuZGluZ190IHR4X3BlbmRpbmc7CisKKwkvKiB1c2VkIGlmIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUgaXMgc2V0ICovCisJc3RydWN0IHRpbWVyX2xpc3QgYXNzb2NpYXRlX3RpbWVyOworCisJLyogdXNlZCBpZiBJRUVFX1NPRlRNQUNfQkVBQ09OUyBpcyBzZXQgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBiZWFjb25fdGltZXI7CisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgYXNzb2NpYXRlX2NvbXBsZXRlX3dxOworLy8Jc3RydWN0IHdvcmtfc3RydWN0IGFzc29jaWF0ZV9yZXRyeV93cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgYXNzb2NpYXRlX3Byb2NlZHVyZV93cTsKKy8vCXN0cnVjdCB3b3JrX3N0cnVjdCBzb2Z0bWFjX3NjYW5fd3E7CisJc3RydWN0IHdvcmtfc3RydWN0IHd4X3N5bmNfc2Nhbl93cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd21tX3BhcmFtX3VwZGF0ZV93cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcHNfcmVxdWVzdF90eF9hY2tfd3E7Ly9mb3IgcHMKKy8vCXN0cnVjdCB3b3JrX3N0cnVjdCBod193YWtldXBfd3E7CisvLwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgaHdfc2xlZXBfd3E7CisvLwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd2F0Y2hfZG9nX3dxOworCWJvb2wgYkluYWN0aXZlUHM7CisJYm9vbCBhY3RzY2FubmluZzsKKwlib29sIGJlaW5yZXRyeTsKKwl1MTYgTGlzdGVuSW50ZXJ2YWw7CisJdW5zaWduZWQgbG9uZyBOdW1SeERhdGFJblBlcmlvZDsgLy9ZSixhZGQsMDgwODI4CisJdW5zaWduZWQgbG9uZyBOdW1SeEJjbkluUGVyaW9kOyAgLy9ZSixhZGQsMDgwODI4CisJdW5zaWduZWQgbG9uZyBOdW1SeE9rVG90YWw7CisJdW5zaWduZWQgbG9uZyBOdW1SeFVuaWNhc3Q7Ly9ZSixhZGQsMDgwODI4LGZvciBrZWVwIGFsaXZlCisJYm9vbCBiSHdSYWRpb09mZjsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorICAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrIHNvZnRtYWNfc2Nhbl93cTsKKyAgICAgICAgc3RydWN0IGRlbGF5ZWRfd29yayBhc3NvY2lhdGVfcmV0cnlfd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayBod193YWtldXBfd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayBod19zbGVlcF93cTsvLytieSBhbXkgMDgwMzI0CisJc3RydWN0IGRlbGF5ZWRfd29yayB3YXRjaF9kb2dfd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayBzd19hbnRlbm5hX3dxOworCXN0cnVjdCBkZWxheWVkX3dvcmsgIHN0YXJ0X2lic3Nfd3E7CisvL2J5IGFteSBmb3IgcmF0ZSBhZGFwdGl2ZSAwODAzMTIKKyAgICBzdHJ1Y3QgZGVsYXllZF93b3JrIHJhdGVfYWRhcHRlcl93cTsKKy8vYnkgYW15IGZvciByYXRlIGFkYXB0aXZlCisJc3RydWN0IGRlbGF5ZWRfd29yayBod19kaWdfd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayB0eF9wd193cTsKKworLy9BZGRlZCBmb3IgUkYgcG93ZXIgb24gcG93ZXIgb2ZmIGJ5IGxpemhhb21pbmcgMDgwNTEyCisJc3RydWN0IGRlbGF5ZWRfd29yayBHUElPQ2hhbmdlUkZXb3JrSXRlbTsKKyNlbHNlCisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc3RhcnRfaWJzc193cTsKKyAgICAgICAgc3RydWN0IHdvcmtfc3RydWN0IHNvZnRtYWNfc2Nhbl93cTsKKyAgICAgICAgc3RydWN0IHdvcmtfc3RydWN0IGFzc29jaWF0ZV9yZXRyeV93cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgaHdfd2FrZXVwX3dxOworCXN0cnVjdCB3b3JrX3N0cnVjdCBod19zbGVlcF93cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd2F0Y2hfZG9nX3dxOworCXN0cnVjdCB3b3JrX3N0cnVjdCBzd19hbnRlbm5hX3dxOworLy9ieSBhbXkgZm9yIHJhdGUgYWRhcHRpdmUgMDgwMzEyCisgICAgc3RydWN0IHdvcmtfc3RydWN0IHJhdGVfYWRhcHRlcl93cTsKKy8vYnkgYW15IGZvciByYXRlIGFkYXB0aXZlCisJc3RydWN0IHdvcmtfc3RydWN0IGh3X2RpZ193cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdHhfcHdfd3E7CisKKy8vQWRkZWQgZm9yIFJGIHBvd2VyIG9uIHBvd2VyIG9mZiBieSBsaXpoYW9taW5nIDA4MDUxMgorCXN0cnVjdCB3b3JrX3N0cnVjdCBHUElPQ2hhbmdlUkZXb3JrSXRlbTsKKyNlbmRpZgorCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTsKKworCS8qIENhbGxiYWNrIGZ1bmN0aW9ucyAqLworCXZvaWQgKCpzZXRfc2VjdXJpdHkpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfc2VjdXJpdHkgKnNlYyk7CisKKwkvKiBVc2VkIHRvIFRYIGRhdGEgZnJhbWUgYnkgdXNpbmcgdHhiIHN0cnVjdHMuCisJICogdGhpcyBpcyBub3QgdXNlZCBpZiBpbiB0aGUgc29mdG1hY19mZWF0dXJlcworCSAqIGlzIHNldCB0aGUgZmxhZyBJRUVFX1NPRlRNQUNfVFhfUVVFVUUKKwkgKi8KKwlpbnQgKCpoYXJkX3N0YXJ0X3htaXQpKHN0cnVjdCBpZWVlODAyMTFfdHhiICp0eGIsCisJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwlpbnQgKCpyZXNldF9wb3J0KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCS8qIFNvZnRtYWMtZ2VuZXJhdGVkIGZyYW1lcyAobWFtYWdlbWVudCkgYXJlIFRYZWQgdmlhIHRoaXMKKwkgKiBjYWxsYmFjayBpZiB0aGUgZmxhZyBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFIGlzCisJICogbm90IHNldC4gQXMgc29tZSBjYXJkcyBtYXkgaGF2ZSBkaWZmZXJlbnQgSFcgcXVldWVzIHRoYXQKKwkgKiBvbmUgbWlnaHQgd2FudCB0byB1c2UgZm9yIGRhdGEgYW5kIG1hbmFnZW1lbnQgZnJhbWVzCisJICogdGhlIG9wdGlvbiB0byBoYXZlIHR3byBjYWxsYmFja3MgbWlnaHQgYmUgdXNlZnVsLgorCSAqIFRoaXMgZnVjbnRpb24gY2FuJ3Qgc2xlZXAuCisJICovCisJaW50ICgqc29mdG1hY19oYXJkX3N0YXJ0X3htaXQpKHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwkvKiB1c2VkIGluc3RlYWQgb2YgaGFyZF9zdGFydF94bWl0IChub3Qgc29mdG1hY19oYXJkX3N0YXJ0X3htaXQpCisJICogaWYgdGhlIElFRUVfU09GVE1BQ19UWF9RVUVVRSBmZWF0dXJlIGlzIHVzZWQgdG8gVFggZGF0YQorCSAqIGZyYW1lcy4gSSB0aGUgb3B0aW9uIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUUgaXMgYWxzbyBzZXQKKwkgKiB0aGVuIGFsc28gbWFuYWdlbWVudCBmcmFtZXMgYXJlIHNlbnQgdmlhIHRoaXMgY2FsbGJhY2suCisJICogVGhpcyBmdW5jdGlvbiBjYW4ndCBzbGVlcC4KKwkgKi8KKwl2b2lkICgqc29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdCkoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LGludCByYXRlKTsKKworCS8qIHN0b3BzIHRoZSBIVyBxdWV1ZSBmb3IgREFUQSBmcmFtZXMuIFVzZWZ1bCB0byBhdm9pZAorCSAqIHdhc3RlIHRpbWUgdG8gVFggZGF0YSBmcmFtZSB3aGVuIHdlIGFyZSByZWFzc29jaWF0aW5nCisJICogVGhpcyBmdW5jdGlvbiBjYW4gc2xlZXAuCisJICovCisJdm9pZCAoKmRhdGFfaGFyZF9zdG9wKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCS8qIE9LIHRoaXMgaXMgY29tcGxlbWVudGFyIHRvIGRhdGFfcG9sbF9oYXJkX3N0b3AgKi8KKwl2b2lkICgqZGF0YV9oYXJkX3Jlc3VtZSkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwkvKiBhc2sgdG8gdGhlIGRyaXZlciB0byByZXR1bmUgdGhlIHJhZGlvIC4KKwkgKiBUaGlzIGZ1bmN0aW9uIGNhbiBzbGVlcC4gdGhlIGRyaXZlciBzaG91bGQgZW5zdXJlCisJICogdGhlIHJhZGlvIGhhcyBiZWVuIHN3aXRoY2VkIGJlZm9yZSByZXR1cm4uCisJICovCisJdm9pZCAoKnNldF9jaGFuKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHNob3J0IGNoKTsKKworCS8qIFRoZXNlIGFyZSBub3QgdXNlZCBpZiB0aGUgaWVlZSBzdGFjayB0YWtlcyBjYXJlIG9mCisJICogc2Nhbm5pbmcgKElFRUVfU09GVE1BQ19TQ0FOIGZlYXR1cmUgc2V0KS4KKwkgKiBJbiB0aGlzIGNhc2Ugb25seSB0aGUgc2V0X2NoYW4gaXMgdXNlZC4KKwkgKgorCSAqIFRoZSBzeW5jcm8gdmVyc2lvbiBpcyBzaW1pbGFyIHRvIHRoZSBzdGFydF9zY2FuIGJ1dAorCSAqIGRvZXMgbm90IHJldHVybiB1bnRpbCBhbGwgY2hhbm5lbHMgaGFzIGJlZW4gc2Nhbm5lZC4KKwkgKiB0aGlzIGlzIGNhbGxlZCBpbiB1c2VyIGNvbnRleHQgYW5kIHNob3VsZCBzbGVlcCwKKwkgKiBpdCBpcyBjYWxsZWQgaW4gYSB3b3JrX3F1ZXVlIHdoZW4gc3dpdGhjaW5nIHRvIGFkLWhvYyBtb2RlCisJICogb3IgaW4gYmVoYWxmIG9mIGl3bGlzdCBzY2FuIHdoZW4gdGhlIGNhcmQgaXMgYXNzb2NpYXRlZAorCSAqIGFuZCByb290IHVzZXIgYXNrIGZvciBhIHNjYW4uCisJICogdGhlIGZ1Y250aW9uIHN0b3Bfc2NhbiBzaG91bGQgc3RvcCBib3RoIHRoZSBzeW5jcm8gYW5kCisJICogYmFja2dyb3VuZCBzY2FubmluZyBhbmQgY2FuIHNsZWVwLgorCSAqIFRoZSBmdWNudGlvbiBzdGFydF9zY2FuIHNob3VsZCBpbml0aWF0ZSB0aGUgYmFja2dyb3VuZAorCSAqIHNjYW5uaW5nIGFuZCBjYW4ndCBzbGVlcC4KKwkgKi8KKwl2b2lkICgqc2Nhbl9zeW5jcm8pKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCpzdGFydF9zY2FuKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqc3RvcF9zY2FuKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCS8qIGluZGljYXRlIHRoZSBkcml2ZXIgdGhhdCB0aGUgbGluayBzdGF0ZSBpcyBjaGFuZ2VkCisJICogZm9yIGV4YW1wbGUgaXQgbWF5IGluZGljYXRlIHRoZSBjYXJkIGlzIGFzc29jaWF0ZWQgbm93LgorCSAqIERyaXZlciBtaWdodCBiZSBpbnRlcmVzdGVkIGluIHRoaXMgdG8gYXBwbHkgUlggZmlsdGVyCisJICogcnVsZXMgb3Igc2ltcGx5IGxpZ2h0IHRoZSBMSU5LIGxlZAorCSAqLworCXZvaWQgKCpsaW5rX2NoYW5nZSkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwkvKiB0aGVzZSB0d28gZnVuY3Rpb24gaW5kaWNhdGVzIHRvIHRoZSBIVyB3aGVuIHRvIHN0YXJ0CisJICogYW5kIHN0b3AgdG8gc2VuZCBiZWFjb25zLiBUaGlzIGlzIHVzZWQgd2hlbiB0aGUKKwkgKiBJRUVFX1NPRlRNQUNfQkVBQ09OUyBpcyBub3Qgc2V0LiBGb3Igbm93IHRoZQorCSAqIHN0b3Bfc2VuZF9iYWNvbnMgaXMgTk9UIGd1YXJhbnRlZWQgdG8gYmUgY2FsbGVkIG9ubHkKKwkgKiBhZnRlciBzdGFydF9zZW5kX2JlYWNvbnMuCisJICovCisJdm9pZCAoKnN0YXJ0X3NlbmRfYmVhY29ucykgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCpzdG9wX3NlbmRfYmVhY29ucykgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJLyogcG93ZXIgc2F2ZSBtb2RlIHJlbGF0ZWQgKi8KKwl2b2lkICgqc3RhX3dha2VfdXApIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqcHNfcmVxdWVzdF90eF9hY2spIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqZW50ZXJfc2xlZXBfc3RhdGUpIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgdGgsIHUzMiB0bCk7CisJc2hvcnQgKCpwc19pc19xdWV1ZV9lbXB0eSkgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJLyogUW9TIHJlbGF0ZWQgKi8KKwkvL3ZvaWQgKCp3bW1fcGFyYW1fdXBkYXRlKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggKmFjX3BhcmFtKTsKKwkvL3ZvaWQgKCp3bW1fcGFyYW1fdXBkYXRlKSAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworCisJLyogVGhpcyBtdXN0IGJlIHRoZSBsYXN0IGl0ZW0gc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGRhdGEKKwkgKiBhbGxvY2F0ZWQgYmV5b25kIHRoaXMgc3RydWN0dXJlIGJ5IGFsbG9jX2llZWU4MDIxMSAqLworCXU4IHByaXZbMF07Cit9OworCisjZGVmaW5lIElFRUVfQSAgICAgICAgICAgICgxPDwwKQorI2RlZmluZSBJRUVFX0IgICAgICAgICAgICAoMTw8MSkKKyNkZWZpbmUgSUVFRV9HICAgICAgICAgICAgKDE8PDIpCisjZGVmaW5lIElFRUVfTU9ERV9NQVNLICAgIChJRUVFX0F8SUVFRV9CfElFRUVfRykKKworLyogR2VuZXJhdGUgYSA4MDIuMTEgaGVhZGVyICovCisKKy8qIFVzZXMgdGhlIGNoYW5uZWwgY2hhbmdlIGNhbGxiYWNrIGRpcmVjdGx5CisgKiBpbnN0ZWFkIG9mIFtzdGFydC9zdG9wXSBzY2FuIGNhbGxiYWNrcworICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19TQ0FOICgxPDwyKQorCisvKiBQZXJmb3JtIGF1dGhlbnRpY2F0aW9uIGFuZCBhc3NvY2lhdGlvbiBoYW5kc2hha2UgKi8KKyNkZWZpbmUgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSAoMTw8MykKKworLyogR2VuZXJhdGUgcHJvYmUgcmVxdWVzdHMgKi8KKyNkZWZpbmUgSUVFRV9TT0ZUTUFDX1BST0JFUlEgKDE8PDQpCisKKy8qIEdlbmVyYXRlIHJlc3BvbmVzIHRvIHByb2JlIHJlcXVlc3RzICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19QUk9CRVJTICgxPDw1KQorCisvKiBUaGUgaWVlZTgwMi4xMSBzdGFjayB3aWxsIG1hbmFnZXMgdGhlIG5ldGlmIHF1ZXVlCisgKiB3YWtlL3N0b3AgZm9yIHRoZSBkcml2ZXIsIHRha2luZyBjYXJlIG9mIDgwMi4xMQorICogZnJhZ21lbnRhdGlvbi4gU2VlIHNvZnRtYWMuYyBmb3IgZGV0YWlscy4gKi8KKyNkZWZpbmUgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFICgxPDw3KQorCisvKiBVc2VzIG9ubHkgdGhlIHNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQKKyAqIGV2ZW4gZm9yIFRYIG1hbmFnZW1lbnQgZnJhbWVzLgorICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUUgKDE8PDgpCisKKy8qIEdlbmVyYXRlIGJlYWNvbnMuICBUaGUgc3RhY2sgd2lsbCBlbnF1ZXVlIGJlYWNvbnMKKyAqIHRvIHRoZSBjYXJkCisgKi8KKyNkZWZpbmUgSUVFRV9TT0ZUTUFDX0JFQUNPTlMgKDE8PDYpCisKKworCitzdGF0aWMgaW5saW5lIHZvaWQgKmllZWU4MDIxMV9wcml2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuICgoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiluZXRkZXZfcHJpdihkZXYpKS0+cHJpdjsKK30KKworZXh0ZXJuIGlubGluZSBpbnQgaWVlZTgwMjExX2lzX2VtcHR5X2Vzc2lkKGNvbnN0IGNoYXIgKmVzc2lkLCBpbnQgZXNzaWRfbGVuKQoreworCS8qIFNpbmdsZSB3aGl0ZSBzcGFjZSBpcyBmb3IgTGlua3N5cyBBUHMgKi8KKwlpZiAoZXNzaWRfbGVuID09IDEgJiYgZXNzaWRbMF0gPT0gJyAnKQorCQlyZXR1cm4gMTsKKworCS8qIE90aGVyd2lzZSwgaWYgdGhlIGVudGlyZSBlc3NpZCBpcyAwLCB3ZSBhc3N1bWUgaXQgaXMgaGlkZGVuICovCisJd2hpbGUgKGVzc2lkX2xlbikgeworCQllc3NpZF9sZW4tLTsKKwkJaWYgKGVzc2lkW2Vzc2lkX2xlbl0gIT0gJ1wwJykKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitleHRlcm4gaW5saW5lIGludCBpZWVlODAyMTFfaXNfdmFsaWRfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgaW50IG1vZGUpCit7CisJLyoKKwkgKiBJdCBpcyBwb3NzaWJsZSBmb3IgYm90aCBhY2Nlc3MgcG9pbnRzIGFuZCBvdXIgZGV2aWNlIHRvIHN1cHBvcnQKKwkgKiBjb21iaW5hdGlvbnMgb2YgbW9kZXMsIHNvIGFzIGxvbmcgYXMgdGhlcmUgaXMgb25lIHZhbGlkIGNvbWJpbmF0aW9uCisJICogb2YgYXAvZGV2aWNlIHN1cHBvcnRlZCBtb2RlcywgdGhlbiByZXR1cm4gc3VjY2VzcworCSAqCisJICovCisJaWYgKChtb2RlICYgSUVFRV9BKSAmJgorCSAgICAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pICYmCisJICAgIChpZWVlLT5mcmVxX2JhbmQgJiBJRUVFODAyMTFfNTJHSFpfQkFORCkpCisJCXJldHVybiAxOworCisJaWYgKChtb2RlICYgSUVFRV9HKSAmJgorCSAgICAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pICYmCisJICAgIChpZWVlLT5mcmVxX2JhbmQgJiBJRUVFODAyMTFfMjRHSFpfQkFORCkpCisJCXJldHVybiAxOworCisJaWYgKChtb2RlICYgSUVFRV9CKSAmJgorCSAgICAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTikgJiYKKwkgICAgKGllZWUtPmZyZXFfYmFuZCAmIElFRUU4MDIxMV8yNEdIWl9CQU5EKSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworZXh0ZXJuIGlubGluZSBpbnQgaWVlZTgwMjExX2dldF9oZHJsZW4odTE2IGZjKQoreworCWludCBoZHJsZW4gPSAyNDsKKworCXN3aXRjaCAoV0xBTl9GQ19HRVRfVFlQRShmYykpIHsKKwljYXNlIElFRUU4MDIxMV9GVFlQRV9EQVRBOgorCQlpZiAoKGZjICYgSUVFRTgwMjExX0ZDVExfRlJPTURTKSAmJiAoZmMgJiBJRUVFODAyMTFfRkNUTF9UT0RTKSkKKwkJCWhkcmxlbiA9IDMwOyAvKiBBZGRyNCAqLworCQlpZihJRUVFODAyMTFfUU9TX0hBU19TRVEoZmMpKQorCQkJaGRybGVuICs9IDI7IC8qIFFPUyBjdHJsKi8KKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfRlRZUEVfQ1RMOgorCQlzd2l0Y2ggKFdMQU5fRkNfR0VUX1NUWVBFKGZjKSkgeworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9DVFM6CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0FDSzoKKwkJCWhkcmxlbiA9IDEwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQloZHJsZW4gPSAxNjsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKworCXJldHVybiBoZHJsZW47Cit9CisKKworCisvKiBpZWVlODAyMTEuYyAqLworZXh0ZXJuIHZvaWQgZnJlZV9pZWVlODAyMTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmFsbG9jX2llZWU4MDIxMShpbnQgc2l6ZW9mX3ByaXYpOworCitleHRlcm4gaW50IGllZWU4MDIxMV9zZXRfZW5jcnlwdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CisKKy8qIGllZWU4MDIxMV90eC5jICovCisKK2V4dGVybiBpbnQgaWVlZTgwMjExX2VuY3J5cHRfZnJhZ21lbnQoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJc3RydWN0IHNrX2J1ZmYgKmZyYWcsCisJaW50IGhkcl9sZW4pOworCitleHRlcm4gaW50IGllZWU4MDIxMV94bWl0KHN0cnVjdCBza19idWZmICpza2IsCisJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3R4Yl9mcmVlKHN0cnVjdCBpZWVlODAyMTFfdHhiICopOworCisKKy8qIGllZWU4MDIxMV9yeC5jICovCitleHRlcm4gaW50IGllZWU4MDIxMV9yeChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnJ4X3N0YXRzKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9yeF9tZ3Qoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZWFkZXIsCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnN0YXRzKTsKKworLyogaWVlZTgwMjExX3d4LmMgKi8KK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICprZXkpOworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X2VuY29kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleSk7CitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfZW5jb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5KTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9lbmNvZGVfZXh0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSogd3JxdSwgY2hhciAqZXh0cmEpOworaW50IGllZWU4MDIxMV93eF9zZXRfYXV0aChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19wYXJhbSAqZGF0YSwgY2hhciAqZXh0cmEpOworaW50IGllZWU4MDIxMV93eF9zZXRfbWxtZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworaW50IGllZWU4MDIxMV93eF9zZXRfZ2VuX2llKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqaWUsIHNpemVfdCBsZW4pOworLyogaWVlZTgwMjExX3NvZnRtYWMuYyAqLworZXh0ZXJuIHNob3J0IGllZWU4MDIxMV9pc181NGcoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrIG5ldCk7CitleHRlcm4gc2hvcnQgaWVlZTgwMjExX2lzX3Nob3J0c2xvdChzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgbmV0KTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX3J4X2ZyYW1lX3NvZnRtYWMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCisJCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cywgdTE2IHR5cGUsCisJCQl1MTYgc3R5cGUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfbmV3X25ldChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXQpOworCitleHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY194bWl0KHN0cnVjdCBpZWVlODAyMTFfdHhiICp0eGIsIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX2NoZWNrX2FsbF9uZXRzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdGFydF9ic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X21hc3Rlcl9ic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X2lic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY19mcmVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RvcF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdGFydF9zY2FuX3N5bmNybyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfY2hlY2tfYWxsX25ldHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdG9wX3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3N0YXJ0X3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2woc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3Jlc2V0X3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV93YWtlX3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdG9wX3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2dldF9iZWFjb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X3NlbmRfYmVhY29ucyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIGludCBpZWVlODAyMTFfd3BhX3N1cHBsaWNhbnRfaW9jdGwoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19wb2ludCAqcCk7CitleHRlcm4gdm9pZCBub3RpZnlfd3hfYXNzb2NfZXZlbnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3BzX3R4X2FjayhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc2hvcnQgc3VjY2Vzcyk7CitleHRlcm4gdm9pZCBTZW5kRGlzYXNzb2NpYXRpb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsdTgqIGFzU3RhLHU4IGFzUnNuKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdGFydF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKKworLy9BZGQgZm9yIFJGIHBvd2VyIG9uIHBvd2VyIG9mZiBieSBsaXpoYW9taW5nIDA4MDUxMgorZXh0ZXJuIHZvaWQgU2VuZERpc2Fzc29jaWF0aW9uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorICAgICAgIAkJCSB1OCogICAgICAgICAgICAgICAgICAgICBhc1N0YSwKKyAgICAgICAgCQkgdTggICAgICAgICAgICAgICAgICAgICAgYXNSc24pOworCisvKiBpZWVlODAyMTFfY3J5cHRfY2NtcCZ0a2lwJndlcC5jICovCitleHRlcm4gdm9pZCBpZWVlODAyMTFfdGtpcF9udWxsKHZvaWQpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3dlcF9udWxsKHZvaWQpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX2NjbXBfbnVsbCh2b2lkKTsKKy8qIGllZWU4MDIxMV9zb2Z0bWFjX3d4LmMgKi8KKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X3dhcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dCk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF93YXAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSB1bmlvbiBpd3JlcV9kYXRhICphd3JxLAorCQkJIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X2Vzc2lkKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLHVuaW9uIGl3cmVxX2RhdGEgKndycXUsY2hhciAqYik7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9yYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9yYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9tb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfZXNzaWQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYik7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9mcmVxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X2ZyZXEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpOworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKK2V4dGVybiB2b2lkIGllZWU4MDIxMV93eF9zeW5jX3NjYW5fd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKyNlbHNlCisgZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3d4X3N5bmNfc2Nhbl93cShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CisjZW5kaWYKKy8vZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3d4X3N5bmNfc2Nhbl93cShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9yYXd0eChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X25hbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X3Bvd2VyKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9wb3dlcihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitleHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY19pcHNfc2Nhbl9zeW5jcm8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworCitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RhX3BzX3NlbmRfbnVsbF9mcmFtZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc2hvcnQgcHdyKTsKKworZXh0ZXJuIGNvbnN0IGxvbmcgaWVlZTgwMjExX3dsYW5fZnJlcXVlbmNpZXNbXTsKKworZXh0ZXJuIGlubGluZSB2b2lkIGllZWU4MDIxMV9pbmNyZW1lbnRfc2NhbnMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWVlZS0+c2NhbnMrKzsKK30KKworZXh0ZXJuIGlubGluZSBpbnQgaWVlZTgwMjExX2dldF9zY2FucyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlyZXR1cm4gaWVlZS0+c2NhbnM7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqZXNjYXBlX2Vzc2lkKGNvbnN0IGNoYXIgKmVzc2lkLCB1OCBlc3NpZF9sZW4pIHsKKwlzdGF0aWMgY2hhciBlc2NhcGVkW0lXX0VTU0lEX01BWF9TSVpFICogMiArIDFdOworCWNvbnN0IGNoYXIgKnMgPSBlc3NpZDsKKwljaGFyICpkID0gZXNjYXBlZDsKKworCWlmIChpZWVlODAyMTFfaXNfZW1wdHlfZXNzaWQoZXNzaWQsIGVzc2lkX2xlbikpIHsKKwkJbWVtY3B5KGVzY2FwZWQsICI8aGlkZGVuPiIsIHNpemVvZigiPGhpZGRlbj4iKSk7CisJCXJldHVybiBlc2NhcGVkOworCX0KKworCWVzc2lkX2xlbiA9IG1pbihlc3NpZF9sZW4sICh1OClJV19FU1NJRF9NQVhfU0laRSk7CisJd2hpbGUgKGVzc2lkX2xlbi0tKSB7CisJCWlmICgqcyA9PSAnXDAnKSB7CisJCQkqZCsrID0gJ1xcJzsKKwkJCSpkKysgPSAnMCc7CisJCQlzKys7CisJCX0gZWxzZSB7CisJCQkqZCsrID0gKnMrKzsKKwkJfQorCX0KKwkqZCA9ICdcMCc7CisJcmV0dXJuIGVzY2FwZWQ7Cit9CisjZW5kaWYgLyogSUVFRTgwMjExX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2RvdDExZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvZG90MTFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ4Yjc1MmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9kb3QxMWQuYwpAQCAtMCwwICsxLDI0NiBAQAorI2lmZGVmIEVOQUJMRV9ET1QxMUQNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorLy8JRmlsZToNCisvLwkJRG90MTFkLmMNCisvLw0KKy8vCURlc2NyaXB0aW9uOg0KKy8vCQlJbXBsZW1lbnQgODAyLjExZC4gDQorLy8NCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorI2luY2x1ZGUgImRvdDExZC5oIg0KKw0KK3ZvaWQNCitEb3QxMWRfSW5pdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkNCit7DQorCVBSVF9ET1QxMURfSU5GTyBwRG90MTFkSW5mbyA9IEdFVF9ET1QxMURfSU5GTyhpZWVlKTsNCisNCisJcERvdDExZEluZm8tPmJFbmFibGVkID0gMDsNCisNCisJcERvdDExZEluZm8tPlN0YXRlID0gRE9UMTFEX1NUQVRFX05PTkU7DQorCXBEb3QxMWRJbmZvLT5Db3VudHJ5SWVMZW4gPSAwOw0KKwltZW1zZXQocERvdDExZEluZm8tPmNoYW5uZWxfbWFwLCAwLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7ICANCisJbWVtc2V0KHBEb3QxMWRJbmZvLT5NYXhUeFB3ckRibUxpc3QsIDB4RkYsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsNCisJUkVTRVRfQ0lFX1dBVENIRE9HKGllZWUpOw0KKw0KKwlwcmludGsoIkRvdDExZF9Jbml0KClcbiIpOw0KK30NCisNCisvLw0KKy8vCURlc2NyaXB0aW9uOg0KKy8vCQlSZXNldCB0byB0aGUgc3RhdGUgYXMgd2UgYXJlIGp1c3QgZW50ZXJpbmcgYSByZWd1bGF0b3J5IGRvbWFpbi4NCisvLw0KK3ZvaWQNCitEb3QxMWRfUmVzZXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpDQorew0KKwl1MzIgaTsNCisJUFJUX0RPVDExRF9JTkZPIHBEb3QxMWRJbmZvID0gR0VUX0RPVDExRF9JTkZPKGllZWUpOw0KKw0KKwkvLyBDbGVhciBvbGQgY2hhbm5lbCBtYXANCisJbWVtc2V0KHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcCwgMCwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOw0KKwltZW1zZXQocERvdDExZEluZm8tPk1heFR4UHdyRGJtTGlzdCwgMHhGRiwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOw0KKwkvLyBTZXQgbmV3IGNoYW5uZWwgbWFwDQorCWZvciAoaT0xOyBpPD0xMTsgaSsrKSB7DQorCQkocERvdDExZEluZm8tPmNoYW5uZWxfbWFwKVtpXSA9IDE7DQorCX0NCisJZm9yIChpPTEyOyBpPD0xNDsgaSsrKSB7DQorCQkocERvdDExZEluZm8tPmNoYW5uZWxfbWFwKVtpXSA9IDI7DQorCX0NCisNCisJcERvdDExZEluZm8tPlN0YXRlID0gRE9UMTFEX1NUQVRFX05PTkU7DQorCXBEb3QxMWRJbmZvLT5Db3VudHJ5SWVMZW4gPSAwOw0KKwlSRVNFVF9DSUVfV0FUQ0hET0coaWVlZSk7DQorDQorCS8vcHJpbnRrKCJEb3QxMWRfUmVzZXQoKVxuIik7DQorfQ0KKw0KKy8vDQorLy8JRGVzY3JpcHRpb246DQorLy8JCVVwZGF0ZSBjb3VudHJ5IElFIGZyb20gQmVhY29uIG9yIFByb2JlIFJlc29wbnNlIA0KKy8vCQlhbmQgY29uZmlndXJlIFBIWSBmb3Igb3BlcmF0aW9uIGluIHRoZSByZWd1bGF0b3J5IGRvbWFpbi4NCisvLw0KKy8vCVRPRE86IA0KKy8vCQlDb25maWd1cmUgVHggcG93ZXIuDQorLy8NCisvLwlBc3N1bXB0aW9uOg0KKy8vCQkxLiBJU19ET1QxMURfRU5BQkxFKCkgaXMgVFJVRS4NCisvLwkJMi4gSW5wdXQgSUUgaXMgYW4gdmFsaWQgb25lLg0KKy8vDQordm9pZA0KK0RvdDExZF9VcGRhdGVDb3VudHJ5SWUoDQorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICpkZXYsDQorCXU4ICoJCXBUYWRkciwNCisJdTE2CUNvdXRyeUllTGVuLA0KKwl1OCAqIHBDb3V0cnlJZQkgDQorCSkNCit7DQorCVBSVF9ET1QxMURfSU5GTyBwRG90MTFkSW5mbyA9IEdFVF9ET1QxMURfSU5GTyhkZXYpOw0KKwl1OCBpLCBqLCBOdW1UcmlwbGVzLCBNYXhDaG5sTnVtOw0KKwlQQ0hOTF9UWFBPV0VSX1RSSVBMRSBwVHJpcGxlOw0KKw0KKwlpZigoQ291dHJ5SWVMZW4gLSAzKSUzICE9IDApDQorCXsNCisJCXByaW50aygiRG90MTFkX1VwZGF0ZUNvdW50cnlJZSgpOiBJbnZhbGlkIGNvdW50cnkgSUUsIHNraXAgaXQuLi4uLi4uLjFcbiIpOw0KKwkJRG90MTFkX1Jlc2V0KGRldik7DQorCQlyZXR1cm47DQorCX0NCisNCisJbWVtc2V0KHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcCwgMCwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOw0KKwltZW1zZXQocERvdDExZEluZm8tPk1heFR4UHdyRGJtTGlzdCwgMHhGRiwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOw0KKwlNYXhDaG5sTnVtID0gMDsNCisJTnVtVHJpcGxlcyA9IChDb3V0cnlJZUxlbiAtIDMpIC8gMzsgLy8gc2tpcCAzLWJ5dGUgY291bnRyeSBzdHJpbmcuDQorCXBUcmlwbGUgPSAoUENITkxfVFhQT1dFUl9UUklQTEUpKHBDb3V0cnlJZSArIDMpOw0KKwlmb3IoaSA9IDA7IGkgPCBOdW1UcmlwbGVzOyBpKyspDQorCXsNCisJCWlmKE1heENobmxOdW0gPj0gcFRyaXBsZS0+Rmlyc3RDaG5sKQ0KKwkJeyAvLyBJdCBpcyBub3QgaW4gYSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgb3JkZXIsIHNvIHN0b3AgcHJvY2Vzc2luZy4NCisJCQlwcmludGsoIkRvdDExZF9VcGRhdGVDb3VudHJ5SWUoKTogSW52YWxpZCBjb3VudHJ5IElFLCBza2lwIGl0Li4uLi4uLi4xXG4iKTsNCisJCQlEb3QxMWRfUmVzZXQoZGV2KTsNCisJCQlyZXR1cm47IA0KKwkJfQ0KKwkJaWYoTUFYX0NIQU5ORUxfTlVNQkVSIDwgKHBUcmlwbGUtPkZpcnN0Q2hubCArIHBUcmlwbGUtPk51bUNobmxzKSkNCisJCXsgLy8gSXQgaXMgbm90IGEgdmFsaWQgc2V0IG9mIGNoYW5uZWwgaWQsIHNvIHN0b3AgcHJvY2Vzc2luZy4NCisJCQlwcmludGsoIkRvdDExZF9VcGRhdGVDb3VudHJ5SWUoKTogSW52YWxpZCBjb3VudHJ5IElFLCBza2lwIGl0Li4uLi4uLi4yXG4iKTsNCisJCQlEb3QxMWRfUmVzZXQoZGV2KTsNCisJCQlyZXR1cm47IA0KKwkJfQ0KKw0KKwkJZm9yKGogPSAwIDsgaiA8IHBUcmlwbGUtPk51bUNobmxzOyBqKyspDQorCQl7DQorCQkJcERvdDExZEluZm8tPmNoYW5uZWxfbWFwW3BUcmlwbGUtPkZpcnN0Q2hubCArIGpdID0gMTsNCisJCQlwRG90MTFkSW5mby0+TWF4VHhQd3JEYm1MaXN0W3BUcmlwbGUtPkZpcnN0Q2hubCArIGpdID0gcFRyaXBsZS0+TWF4VHhQb3dlckluRGJtOw0KKwkJCU1heENobmxOdW0gPSBwVHJpcGxlLT5GaXJzdENobmwgKyBqOw0KKwkJfQkNCisNCisJCXBUcmlwbGUgPSAoUENITkxfVFhQT1dFUl9UUklQTEUpKCh1OCopcFRyaXBsZSArIDMpOw0KKwl9DQorI2lmIDENCisJLy9wcmludGsoIkRvdDExZF9VcGRhdGVDb3VudHJ5SWUoKTogQ2hhbm5lbCBMaXN0OlxuIik7DQorCXByaW50aygiQ2hhbm5lbCBMaXN0OiIpOw0KKwlmb3IoaT0xOyBpPD0gTUFYX0NIQU5ORUxfTlVNQkVSOyBpKyspDQorCQlpZihwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXBbaV0gPiAwKQ0KKwkJCXByaW50aygiICVkIiwgaSk7DQorCXByaW50aygiXG4iKTsNCisjZW5kaWYNCisNCisJVVBEQVRFX0NJRV9TUkMoZGV2LCBwVGFkZHIpOw0KKw0KKwlwRG90MTFkSW5mby0+Q291bnRyeUllTGVuID0gQ291dHJ5SWVMZW47DQorCW1lbWNweShwRG90MTFkSW5mby0+Q291bnRyeUllQnVmLCBwQ291dHJ5SWUsQ291dHJ5SWVMZW4pOw0KKwlwRG90MTFkSW5mby0+U3RhdGUgPSBET1QxMURfU1RBVEVfTEVBUk5FRDsNCit9DQorDQordm9pZCBkdW1wX2NobmxfbWFwKHU4ICogY2hhbm5lbF9tYXApDQorew0KKwlpbnQgaTsNCisJcHJpbnRrKCJDaGFubmVsIExpc3Q6Iik7DQorCWZvcihpPTE7IGk8PSBNQVhfQ0hBTk5FTF9OVU1CRVI7IGkrKykNCisJCWlmKGNoYW5uZWxfbWFwW2ldID4gMCkNCisJCQlwcmludGsoIiAlZCglZCkiLCBpLCBjaGFubmVsX21hcFtpXSk7DQorCXByaW50aygiXG4iKTsNCit9DQorDQordTgNCitET1QxMURfR2V0TWF4VHhQd3JJbkRibSgNCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldiwNCisJdTggQ2hhbm5lbA0KKwkpDQorew0KKwlQUlRfRE9UMTFEX0lORk8gcERvdDExZEluZm8gPSBHRVRfRE9UMTFEX0lORk8oZGV2KTsNCisJdTggTWF4VHhQd3JJbkRibSA9IDI1NTsNCisNCisJaWYoTUFYX0NIQU5ORUxfTlVNQkVSIDwgQ2hhbm5lbCkNCisJeyANCisJCXByaW50aygiRE9UMTFEX0dldE1heFR4UHdySW5EYm0oKTogSW52YWxpZCBDaGFubmVsXG4iKTsNCisJCXJldHVybiBNYXhUeFB3ckluRGJtOyANCisJfQ0KKwlpZihwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXBbQ2hhbm5lbF0pDQorCXsNCisJCU1heFR4UHdySW5EYm0gPSBwRG90MTFkSW5mby0+TWF4VHhQd3JEYm1MaXN0W0NoYW5uZWxdOwkNCisJfQ0KKw0KKwlyZXR1cm4gTWF4VHhQd3JJbkRibTsNCit9DQorDQorDQordm9pZA0KK0RPVDExRF9TY2FuQ29tcGxldGUoDQorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICogZGV2DQorCSkNCit7DQorCVBSVF9ET1QxMURfSU5GTyBwRG90MTFkSW5mbyA9IEdFVF9ET1QxMURfSU5GTyhkZXYpOw0KKw0KKwlzd2l0Y2gocERvdDExZEluZm8tPlN0YXRlKQ0KKwl7DQorCWNhc2UgRE9UMTFEX1NUQVRFX0xFQVJORUQ6DQorCQlwRG90MTFkSW5mby0+U3RhdGUgPSBET1QxMURfU1RBVEVfRE9ORTsNCisJCWJyZWFrOw0KKw0KKwljYXNlIERPVDExRF9TVEFURV9ET05FOg0KKwkJaWYoIEdFVF9DSUVfV0FUQ0hET0coZGV2KSA9PSAwICkNCisJCXsgLy8gUmVzZXQgY291bnRyeSBJRSBpZiBwcmV2aW91cyBvbmUgaXMgZ29uZS4gDQorCQkJRG90MTFkX1Jlc2V0KGRldik7IA0KKwkJfQ0KKwkJYnJlYWs7DQorCWNhc2UgRE9UMTFEX1NUQVRFX05PTkU6DQorCQlicmVhazsNCisJfQ0KK30NCisNCitpbnQgSXNMZWdhbENoYW5uZWwoDQorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICogZGV2LA0KKwl1OCBjaGFubmVsDQorKQ0KK3sNCisJUFJUX0RPVDExRF9JTkZPIHBEb3QxMWRJbmZvID0gR0VUX0RPVDExRF9JTkZPKGRldik7DQorDQorCWlmKE1BWF9DSEFOTkVMX05VTUJFUiA8IGNoYW5uZWwpDQorCXsgDQorCQlwcmludGsoIklzTGVnYWxDaGFubmVsKCk6IEludmFsaWQgQ2hhbm5lbFxuIik7DQorCQlyZXR1cm4gMDsgDQorCX0NCisJaWYocERvdDExZEluZm8tPmNoYW5uZWxfbWFwW2NoYW5uZWxdID4gMCkNCisJCXJldHVybiAxOw0KKwlyZXR1cm4gMDsNCit9DQorDQoraW50IFRvTGVnYWxDaGFubmVsKA0KKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqIGRldiwNCisJdTggY2hhbm5lbA0KKykNCit7DQorCVBSVF9ET1QxMURfSU5GTyBwRG90MTFkSW5mbyA9IEdFVF9ET1QxMURfSU5GTyhkZXYpOw0KKwl1OCBkZWZhdWx0X2NobiA9IDA7DQorCXUzMiBpID0gMDsNCisNCisJZm9yIChpPTE7IGk8PSBNQVhfQ0hBTk5FTF9OVU1CRVI7IGkrKykNCisJew0KKwkJaWYocERvdDExZEluZm8tPmNoYW5uZWxfbWFwW2ldID4gMCkNCisJCXsNCisJCQlkZWZhdWx0X2NobiA9IGk7DQorCQkJYnJlYWs7DQorCQl9DQorCX0NCisNCisJaWYoTUFYX0NIQU5ORUxfTlVNQkVSIDwgY2hhbm5lbCkNCisJeyANCisJCXByaW50aygiSXNMZWdhbENoYW5uZWwoKTogSW52YWxpZCBDaGFubmVsXG4iKTsNCisJCXJldHVybiBkZWZhdWx0X2NobjsgDQorCX0NCisJDQorCWlmKHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcFtjaGFubmVsXSA+IDApDQorCQlyZXR1cm4gY2hhbm5lbDsNCisJDQorCXJldHVybiBkZWZhdWx0X2NobjsNCit9DQorDQorI2lmIDANCitFWFBPUlRfU1lNQk9MKERvdDExZF9Jbml0KTsNCitFWFBPUlRfU1lNQk9MKERvdDExZF9SZXNldCk7DQorRVhQT1JUX1NZTUJPTChEb3QxMWRfVXBkYXRlQ291bnRyeUllKTsNCitFWFBPUlRfU1lNQk9MKERPVDExRF9HZXRNYXhUeFB3ckluRGJtKTsNCitFWFBPUlRfU1lNQk9MKERPVDExRF9TY2FuQ29tcGxldGUpOw0KK0VYUE9SVF9TWU1CT0woSXNMZWdhbENoYW5uZWwpOw0KK0VYUE9SVF9TWU1CT0woVG9MZWdhbENoYW5uZWwpOw0KKyNlbmRpZg0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2RvdDExZC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvZG90MTFkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRiY2YxNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2RvdDExZC5oCkBAIC0wLDAgKzEsMTAyIEBACisjaWZuZGVmIF9fSU5DX0RPVDExRF9IDQorI2RlZmluZSBfX0lOQ19ET1QxMURfSA0KKw0KKyNpbmNsdWRlICJpZWVlODAyMTEuaCINCisNCisvLyNkZWZpbmUgRU5BQkxFX0RPVDExRA0KKw0KKy8vI2RlZmluZSBET1QxMURfTUFYX0NITkxfTlVNIDgzDQorDQordHlwZWRlZiBzdHJ1Y3QgX0NITkxfVFhQT1dFUl9UUklQTEUgew0KKwl1OCBGaXJzdENobmw7DQorCXU4ICBOdW1DaG5sczsNCisJdTggIE1heFR4UG93ZXJJbkRibTsNCit9Q0hOTF9UWFBPV0VSX1RSSVBMRSwgKlBDSE5MX1RYUE9XRVJfVFJJUExFOw0KKw0KK3R5cGVkZWYgZW51bSBfRE9UMTFEX1NUQVRFIHsNCisJRE9UMTFEX1NUQVRFX05PTkUgPSAwLA0KKwlET1QxMURfU1RBVEVfTEVBUk5FRCwNCisJRE9UMTFEX1NUQVRFX0RPTkUsDQorfURPVDExRF9TVEFURTsNCisNCit0eXBlZGVmIHN0cnVjdCBfUlRfRE9UMTFEX0lORk8gew0KKwkvL0RFQ0xBUkVfUlRfT0JKRUNUKFJUX0RPVDExRF9JTkZPKTsNCisNCisJYm9vbCBiRW5hYmxlZDsgLy8gZG90MTFNdWx0aURvbWFpbkNhcGFiaWxpdHlFbmFibGVkDQorDQorCXUxNiBDb3VudHJ5SWVMZW47IC8vID4gMCBpZiBDb3VudHJ5SWVCdWZbXSBjb250YWlucyB2YWxpZCBjb3VudHJ5IGluZm9ybWF0aW9uIGVsZW1lbnQuDQorCXU4ICBDb3VudHJ5SWVCdWZbTUFYX0lFX0xFTl07DQorCXU4ICBDb3VudHJ5SWVTcmNBZGRyWzZdOyAvLyBTb3VyY2UgQVAgb2YgdGhlIGNvdW50cnkgSUUuDQorCXU4ICBDb3VudHJ5SWVXYXRjaGRvZzsgDQorDQorCXU4ICBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07ICAvLyEhIVZhbHVlIDA6IEludmFsaWQsIDE6IFZhbGlkIChhY3RpdmUgc2NhbiksIDI6IFZhbGlkIChwYXNzaXZlIHNjYW4pDQorCS8vdTggIENobmxMaXN0TGVuOyAvLyAjQnl0ZXMgdmFsaWQgaW4gQ2hubExpc3RbXS4NCisJLy91OCAgQ2hubExpc3RbRE9UMTFEX01BWF9DSE5MX05VTV07DQorCXU4ICBNYXhUeFB3ckRibUxpc3RbTUFYX0NIQU5ORUxfTlVNQkVSKzFdOw0KKw0KKwlET1QxMURfU1RBVEUgU3RhdGU7DQorfVJUX0RPVDExRF9JTkZPLCAqUFJUX0RPVDExRF9JTkZPOw0KKyNkZWZpbmUgZXFNYWNBZGRyKGEsYikJCSggKChhKVswXT09KGIpWzBdICYmIChhKVsxXT09KGIpWzFdICYmIChhKVsyXT09KGIpWzJdICYmIChhKVszXT09KGIpWzNdICYmIChhKVs0XT09KGIpWzRdICYmIChhKVs1XT09KGIpWzVdKSA/IDE6MCApDQorI2RlZmluZSBjcE1hY0FkZHIoZGVzLHNyYykJICAgICAgKChkZXMpWzBdPShzcmMpWzBdLChkZXMpWzFdPShzcmMpWzFdLChkZXMpWzJdPShzcmMpWzJdLChkZXMpWzNdPShzcmMpWzNdLChkZXMpWzRdPShzcmMpWzRdLChkZXMpWzVdPShzcmMpWzVdKQ0KKyNkZWZpbmUgR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpICgoUFJUX0RPVDExRF9JTkZPKSgoX19wSWVlZURldiktPnBEb3QxMWRJbmZvKSkNCisNCisjZGVmaW5lIElTX0RPVDExRF9FTkFCTEUoX19wSWVlZURldikgR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5iRW5hYmxlZA0KKyNkZWZpbmUgSVNfQ09VTlRSWV9JRV9WQUxJRChfX3BJZWVlRGV2KSAoR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVMZW4gPiAwKQ0KKw0KKyNkZWZpbmUgSVNfRVFVQUxfQ0lFX1NSQyhfX3BJZWVlRGV2LCBfX3BUYSkgZXFNYWNBZGRyKEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllU3JjQWRkciwgX19wVGEpIA0KKyNkZWZpbmUgVVBEQVRFX0NJRV9TUkMoX19wSWVlZURldiwgX19wVGEpIGNwTWFjQWRkcihHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPkNvdW50cnlJZVNyY0FkZHIsIF9fcFRhKQ0KKw0KKyNkZWZpbmUgSVNfQ09VTlRSWV9JRV9DSEFOR0VEKF9fcEllZWVEZXYsIF9fSWUpIFwNCisJKCgoX19JZSkuTGVuZ3RoID09IDAgfHwgKF9fSWUpLkxlbmd0aCAhPSBHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPkNvdW50cnlJZUxlbikgPyBcDQorCUZBTFNFIDogXA0KKwkoIW1lbWNtcChHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPkNvdW50cnlJZUJ1ZiwgKF9fSWUpLk9jdGV0LCAoX19JZSkuTGVuZ3RoKSkpDQorDQorI2RlZmluZSBDSUVfV0FUQ0hET0dfVEggMQ0KKyNkZWZpbmUgR0VUX0NJRV9XQVRDSERPRyhfX3BJZWVlRGV2KSBHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPkNvdW50cnlJZVdhdGNoZG9nDQorI2RlZmluZSBSRVNFVF9DSUVfV0FUQ0hET0coX19wSWVlZURldikgR0VUX0NJRV9XQVRDSERPRyhfX3BJZWVlRGV2KSA9IDAgDQorI2RlZmluZSBVUERBVEVfQ0lFX1dBVENIRE9HKF9fcEllZWVEZXYpICsrR0VUX0NJRV9XQVRDSERPRyhfX3BJZWVlRGV2KQ0KKw0KKyNkZWZpbmUgSVNfRE9UMTFEX1NUQVRFX0RPTkUoX19wSWVlZURldikgKEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+U3RhdGUgPT0gRE9UMTFEX1NUQVRFX0RPTkUpDQorDQorDQordm9pZA0KK0RvdDExZF9Jbml0KA0KKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2DQorCSk7DQorDQordm9pZA0KK0RvdDExZF9SZXNldCgNCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldg0KKwkpOw0KKw0KK3ZvaWQNCitEb3QxMWRfVXBkYXRlQ291bnRyeUllKA0KKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2LA0KKwl1OCAqCQlwVGFkZHIsDQorCXUxNglDb3V0cnlJZUxlbiwNCisJdTggKiBwQ291dHJ5SWUJIA0KKwkpOw0KKw0KK3U4DQorRE9UMTFEX0dldE1heFR4UHdySW5EYm0oDQorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICpkZXYsDQorCXU4IENoYW5uZWwNCisJKTsNCisNCit2b2lkDQorRE9UMTFEX1NjYW5Db21wbGV0ZSgNCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiBkZXYNCisJKTsNCisNCitpbnQgSXNMZWdhbENoYW5uZWwoDQorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICogZGV2LA0KKwl1OCBjaGFubmVsDQorKTsNCisNCitpbnQgVG9MZWdhbENoYW5uZWwoDQorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICogZGV2LA0KKwl1OCBjaGFubmVsDQorKTsNCisNCit2b2lkIGR1bXBfY2hubF9tYXAodTggKiBjaGFubmVsX21hcCk7DQorI2VuZGlmIC8vICNpZm5kZWYgX19JTkNfRE9UMTFEX0gNCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTEuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MzM2MDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTEuaApAQCAtMCwwICsxLDE3NTUgQEAKKy8qCisgKiBNZXJnZWQgd2l0aCBtYWlubGluZSBpZWVlODAyMTEuaCBpbiBBdWcgMjAwNC4gIE9yaWdpbmFsIGllZWU4MDJfMTEKKyAqIHJlbWFpbnMgY29weXJpZ2h0IGJ5IHRoZSBvcmlnaW5hbCBhdXRob3JzCisgKgorICogUG9ydGlvbnMgb2YgdGhlIG1lcmdlZCBjb2RlIGFyZSBiYXNlZCBvbiBIb3N0IEFQIChzb2Z0d2FyZSB3aXJlbGVzcworICogTEFOIGFjY2VzcyBwb2ludCkgZHJpdmVyIGZvciBJbnRlcnNpbCBQcmlzbTIvMi41LzMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIsIFNTSCBDb21tdW5pY2F0aW9ucyBTZWN1cml0eSBDb3JwIGFuZCBKb3VuaSBNYWxpbmVuCisgKiA8amttYWxpbmVAY2MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqCisgKiBBZGFwdGlvbiB0byBhIGdlbmVyaWMgSUVFRSA4MDIuMTEgc3RhY2sgYnkgSmFtZXMgS2V0cmVub3MKKyAqIDxqa2V0cmVub0BsaW51eC5pbnRlbC5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIEludGVsIENvcnBvcmF0aW9uCisgKgorICogTW9kaWZpZWQgZm9yIFJlYWx0ZWsncyB3aS1maSBjYXJkcyBieSBBbmRyZWEgTWVyZWxsbworICogPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgSUVFRTgwMjExX0gKKyNkZWZpbmUgSUVFRTgwMjExX0gKKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPiAvKiBFVEhfQUxFTiAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPiAgIC8qIEFSUkFZX1NJWkUgKi8KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDEzKSkKKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2VuZGlmCisKKy8qCisjaWZuZGVmIGJvb2wKKyNkZWZpbmUgYm9vbCBpbnQKKyNlbmRpZgorCisjaWZuZGVmIHRydWUKKyNkZWZpbmUgdHJ1ZSAgIDEKKyNlbmRpZgorCisjaWZuZGVmIGZhbHNlCisjZGVmaW5lIGZhbHNlICAwCisjZW5kaWYKKyovCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkpCisjaWZuZGVmIGJvb2wKK3R5cGVkZWYgZW51bXtmYWxzZSA9IDAsIHRydWV9IGJvb2w7CisjZW5kaWYKKyNlbmRpZgorLy8jaWZkZWYgSk9ITl9IV1NFQworI2RlZmluZSBLRVlfVFlQRV9OQQkJMHgwCisjZGVmaW5lIEtFWV9UWVBFX1dFUDQwIAkJMHgxCisjZGVmaW5lIEtFWV9UWVBFX1RLSVAJCTB4MgorI2RlZmluZSBLRVlfVFlQRV9DQ01QCQkweDQKKyNkZWZpbmUgS0VZX1RZUEVfV0VQMTA0CQkweDUKKy8vI2VuZGlmCisKKworI2RlZmluZSBhU2lmc1RpbWUJCQkJCTEwCisKKyNkZWZpbmUgTUdNVF9RVUVVRV9OVU0gNQorCisKKyNkZWZpbmUgSUVFRV9DTURfU0VUX1dQQV9QQVJBTQkJCTEKKyNkZWZpbmUJSUVFRV9DTURfU0VUX1dQQV9JRQkJCTIKKyNkZWZpbmUgSUVFRV9DTURfU0VUX0VOQ1JZUFRJT04JCQkzCisjZGVmaW5lIElFRUVfQ01EX01MTUUJCQkJNAorCisjZGVmaW5lIElFRUVfUEFSQU1fV1BBX0VOQUJMRUQJCQkxCisjZGVmaW5lIElFRUVfUEFSQU1fVEtJUF9DT1VOVEVSTUVBU1VSRVMJCTIKKyNkZWZpbmUgSUVFRV9QQVJBTV9EUk9QX1VORU5DUllQVEVECQkzCisjZGVmaW5lIElFRUVfUEFSQU1fUFJJVkFDWV9JTlZPS0VECQk0CisjZGVmaW5lIElFRUVfUEFSQU1fQVVUSF9BTEdTCQkJNQorI2RlZmluZSBJRUVFX1BBUkFNX0lFRUVfODAyXzFYCQkJNgorLy9JdCBzaG91bGQgY29uc2lzdGVudCB3aXRoIHRoZSBkcml2ZXJfWFhYLmMKKy8vICAgRGF2aWQsIDIwMDYuOS4yNgorI2RlZmluZSBJRUVFX1BBUkFNX1dQQVhfU0VMRUNUCQkJNworLy9BZGRlZCBmb3Igbm90aWZ5IHRoZSBlbmNyeXB0aW9uIHR5cGUgc2VsZWN0aW9uCisvLyAgIERhdmlkLCAyMDA2LjkuMjYKKyNkZWZpbmUgSUVFRV9QUk9UT19XUEEJCQkJMQorI2RlZmluZSBJRUVFX1BST1RPX1JTTgkJCQkyCisvL0FkZGVkIGZvciBub3RpZnkgdGhlIGVuY3J5cHRpb24gdHlwZSBzZWxlY3Rpb24KKy8vICAgRGF2aWQsIDIwMDYuOS4yNgorI2RlZmluZSBJRUVFX1dQQVhfVVNFR1JPVVAJCQkwCisjZGVmaW5lIElFRUVfV1BBWF9XRVA0MAkJCQkxCisjZGVmaW5lIElFRUVfV1BBWF9US0lQCQkJCTIKKyNkZWZpbmUgSUVFRV9XUEFYX1dSQVAgICAJCQkzCisjZGVmaW5lIElFRUVfV1BBWF9DQ01QCQkJCTQKKyNkZWZpbmUgSUVFRV9XUEFYX1dFUDEwNAkJCTUKKworI2RlZmluZSBJRUVFX0tFWV9NR01UX0lFRUU4MDIxWAkJCTEKKyNkZWZpbmUgSUVFRV9LRVlfTUdNVF9QU0sJCQkyCisKKworCisjZGVmaW5lIElFRUVfTUxNRV9TVEFfREVBVVRICQkJMQorI2RlZmluZSBJRUVFX01MTUVfU1RBX0RJU0FTU09DCQkJMgorCisKKyNkZWZpbmUgSUVFRV9DUllQVF9FUlJfVU5LTk9XTl9BTEcJCTIKKyNkZWZpbmUgSUVFRV9DUllQVF9FUlJfVU5LTk9XTl9BRERSCQkzCisjZGVmaW5lIElFRUVfQ1JZUFRfRVJSX0NSWVBUX0lOSVRfRkFJTEVECQk0CisjZGVmaW5lIElFRUVfQ1JZUFRfRVJSX0tFWV9TRVRfRkFJTEVECQk1CisjZGVmaW5lIElFRUVfQ1JZUFRfRVJSX1RYX0tFWV9TRVRfRkFJTEVECQk2CisjZGVmaW5lIElFRUVfQ1JZUFRfRVJSX0NBUkRfQ09ORl9GQUlMRUQJCTcKKworCisjZGVmaW5lCUlFRUVfQ1JZUFRfQUxHX05BTUVfTEVOCQkJMTYKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTApKQorI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X3NjYW4gaWVlZTgwMjExX3d4X2dldF9zY2FuX3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X2VuY29kZSBpZWVlODAyMTFfd3hfc2V0X2VuY29kZV9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9lbmNvZGUgaWVlZTgwMjExX3d4X2dldF9lbmNvZGVfcnRsCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gYWRkZWQgZm9yIGtlcm5lbCBjb25mbGljdCB1bmRlciBGQzUKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9uYW1lICAgaWVlZTgwMjExX3d4X2dldF9uYW1lX3J0bAorI2RlZmluZSBmcmVlX2llZWU4MDIxMSAgICAgICAgICBmcmVlX2llZWU4MDIxMV9ydGwKKyNkZWZpbmUgYWxsb2NfaWVlZTgwMjExICAgICAgICBhbGxvY19pZWVlODAyMTFfcnRsCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZW5kaWYKKy8vZXJyb3IgaW4gdWJ1bnR1Mi42LjIyLHNvIGFkZCB0aGVzZQorI2RlZmluZSBpZWVlODAyMTFfd2FrZV9xdWV1ZSBpZWVlODAyMTFfd2FrZV9xdWV1ZV9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3N0b3BfcXVldWUgaWVlZTgwMjExX3N0b3BfcXVldWVfcnRsCisKKyNkZWZpbmUgaWVlZTgwMjExX3J4IGllZWU4MDIxMV9yeF9ydGwKKworI2RlZmluZSBpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wcwlpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wc19ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3VucmVnaXN0ZXJfY3J5cHRvX29wcwlpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzX3J0bAorI2RlZmluZSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMJaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzX3J0bAorI2RlZmluZSBpZWVlODAyMTFfY3J5cHRfZGVpbml0X2VudHJpZXMJaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9lbnRyaWVzX3J0bAorI2RlZmluZSBpZWVlODAyMTFfY3J5cHRfZGVpbml0X2hhbmRsZXIJaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9oYW5kbGVyX3J0bAorI2RlZmluZSBpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQJaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0X3J0bAorCisjZGVmaW5lIGllZWU4MDIxMV90eGJfZnJlZQlpZWVlODAyMTFfdHhiX2ZyZWVfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfZXNzaWQJaWVlZTgwMjExX3d4X2dldF9lc3NpZF9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9lc3NpZAlpZWVlODAyMTFfd3hfc2V0X2Vzc2lkX3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X3JhdGUJaWVlZTgwMjExX3d4X3NldF9yYXRlX3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X3JhdGUJaWVlZTgwMjExX3d4X2dldF9yYXRlX3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X3dhcAlpZWVlODAyMTFfd3hfc2V0X3dhcF9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF93YXAJaWVlZTgwMjExX3d4X2dldF93YXBfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfbW9kZQlpZWVlODAyMTFfd3hfc2V0X21vZGVfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfbW9kZQlpZWVlODAyMTFfd3hfZ2V0X21vZGVfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfc2NhbglpZWVlODAyMTFfd3hfc2V0X3NjYW5fcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfZnJlcQlpZWVlODAyMTFfd3hfZ2V0X2ZyZXFfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfZnJlcQlpZWVlODAyMTFfd3hfc2V0X2ZyZXFfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfcmF3dHgJaWVlZTgwMjExX3d4X3NldF9yYXd0eF9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9wb3dlcglpZWVlODAyMTFfd3hfc2V0X3Bvd2VyX3J0bAorI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X3Bvd2VyCWllZWU4MDIxMV93eF9nZXRfcG93ZXJfcnRsCisjZGVmaW5lIGllZWU4MDIxMV93bGFuX2ZyZXF1ZW5jaWVzCWllZWU4MDIxMV93bGFuX2ZyZXF1ZW5jaWVzX3J0bAorI2RlZmluZSBpZWVlODAyMTFfc29mdG1hY19zdG9wX3Byb3RvY29sCWllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2xfcnRsCisjZGVmaW5lIGllZWU4MDIxMV9zb2Z0bWFjX3N0YXJ0X3Byb3RvY29sIGllZWU4MDIxMV9zb2Z0bWFjX3N0YXJ0X3Byb3RvY29sX3J0bAorI2RlZmluZQlpZWVlODAyMTFfc3RhcnRfcHJvdG9jb2wJaWVlZTgwMjExX3N0YXJ0X3Byb3RvY29sX3J0bAorI2RlZmluZQlpZWVlODAyMTFfc3RvcF9wcm90b2NvbAkJaWVlZTgwMjExX3N0b3BfcHJvdG9jb2xfcnRsCisjZGVmaW5lCWllZWU4MDIxMV9yeF9tZ3QJCWllZWU4MDIxMV9yeF9tZ3RfcnRsCisKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9hdXRoIGllZWU4MDIxMV93eF9zZXRfYXV0aF9ydGwKKy8vYnkgYW15IGZvciBwcworI2RlZmluZSBub3RpZnlfd3hfYXNzb2NfZXZlbnQgIG5vdGlmeV93eF9hc3NvY19ldmVudF9ydGwKKyNkZWZpbmUgaWVlZTgwMjExX3N0b3Bfc2VuZF9iZWFjb25zIGllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29uc19ydGwKKyNkZWZpbmUgaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZSBpZWVlODAyMTFfZGlzYXNzb2NpYXRlX3J0bAorI2RlZmluZSBpZWVlODAyMTFfc3RhcnRfc2NhbiBpZWVlODAyMTFfc3RhcnRfc2Nhbl9ydGwKKy8vYnkgYW15IGZvciBwcwordHlwZWRlZiBzdHJ1Y3QgaWVlZV9wYXJhbSB7CisJdTMyIGNtZDsKKwl1OCBzdGFfYWRkcltFVEhfQUxFTl07CisgICAgICAgIHVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXU4IG5hbWU7CisJCQl1MzIgdmFsdWU7CisJCX0gd3BhX3BhcmFtOworCQlzdHJ1Y3QgeworCQkJdTMyIGxlbjsKKwkJCXU4IHJlc2VydmVkWzMyXTsKKwkJCXU4IGRhdGFbMF07CisJCX0gd3BhX2llOworCSAgICAgICAgc3RydWN0eworCQkJaW50IGNvbW1hbmQ7CisgICAgCQkJaW50IHJlYXNvbl9jb2RlOworCQl9IG1sbWU7CisJCXN0cnVjdCB7CisJCQl1OCBhbGdbSUVFRV9DUllQVF9BTEdfTkFNRV9MRU5dOworCQkJdTggc2V0X3R4OworCQkJdTMyIGVycjsKKwkJCXU4IGlkeDsKKwkJCXU4IHNlcVs4XTsgLyogc2VxdWVuY2UgY291bnRlciAoc2V0OiBSWCwgZ2V0OiBUWCkgKi8KKwkJCXUxNiBrZXlfbGVuOworCQkJdTgga2V5WzBdOworCQl9IGNyeXB0OworCisJfSB1OworfWllZWVfcGFyYW07CisKKworI2lmIFdJUkVMRVNTX0VYVCA8IDE3CisjZGVmaW5lIElXX1FVQUxfUVVBTF9JTlZBTElEICAgMHgxMAorI2RlZmluZSBJV19RVUFMX0xFVkVMX0lOVkFMSUQgIDB4MjAKKyNkZWZpbmUgSVdfUVVBTF9OT0lTRV9JTlZBTElEICAweDQwCisjZGVmaW5lIElXX1FVQUxfUVVBTF9VUERBVEVEICAgMHgxCisjZGVmaW5lIElXX1FVQUxfTEVWRUxfVVBEQVRFRCAgMHgyCisjZGVmaW5lIElXX1FVQUxfTk9JU0VfVVBEQVRFRCAgMHg0CisjZW5kaWYKKworLy8gbGludXggdW5kZXIgMi42LjkgcmVsZWFzZSBtYXkgbm90IHN1cHBvcnQgaXQsIHNvIG1vZGlmeSBpdCBmb3IgY29tbW9uIHVzZQorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsOSkpCisjZGVmaW5lIE1TRUNTKHQpCSgxMDAwICogKCh0KSAvIEhaKSArIDEwMDAgKiAoKHQpICUgSFopIC8gSFopCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbXNsZWVwX2ludGVycnVwdGlibGVfcnRsKHVuc2lnbmVkIGludCBtc2VjcykKK3sKKyAgICAgICAgIHVuc2lnbmVkIGxvbmcgdGltZW91dCA9IE1TRUNTKG1zZWNzKSArIDE7CisKKyAgICAgICAgIHdoaWxlICh0aW1lb3V0KSB7CisgICAgICAgICAgICAgICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKyAgICAgICAgICAgICAgICAgdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7CisgICAgICAgICB9CisgICAgICAgICByZXR1cm4gdGltZW91dDsKK30KKyNlbHNlCisjZGVmaW5lIE1TRUNTKHQpIG1zZWNzX3RvX2ppZmZpZXModCkKKyNkZWZpbmUgbXNsZWVwX2ludGVycnVwdGlibGVfcnRsICBtc2xlZXBfaW50ZXJydXB0aWJsZQorI2VuZGlmCisKKyNkZWZpbmUgSUVFRTgwMjExX0RBVEFfTEVOCQkyMzA0CisvKiBNYXhpbXVtIHNpemUgZm9yIHRoZSBNQS1VTklUREFUQSBwcmltaXRpdmUsIDgwMi4xMSBzdGFuZGFyZCBzZWN0aW9uCisgICA2LjIuMS4xLjIuCisKKyAgIFRoZSBmaWd1cmUgaW4gc2VjdGlvbiA3LjEuMiBzdWdnZXN0cyBhIGJvZHkgc2l6ZSBvZiB1cCB0byAyMzEyCisgICBieXRlcyBpcyBhbGxvd2VkLCB3aGljaCBpcyBhIGJpdCBjb25mdXNpbmcsIEkgc3VzcGVjdCB0aGlzCisgICByZXByZXNlbnRzIHRoZSAyMzA0IGJ5dGVzIG9mIHJlYWwgZGF0YSwgcGx1cyBhIHBvc3NpYmxlIDggYnl0ZXMgb2YKKyAgIFdFUCBJViBhbmQgSUNWLiAodGhpcyBpbnRlcnByZXRhdGlvbiBzdWdnZXN0ZWQgYnkgUmFtaXJvIEJhcnJlaXJvKSAqLworCisKKyNkZWZpbmUgSUVFRTgwMjExX0hMRU4JCQkzMAorI2RlZmluZSBJRUVFODAyMTFfRlJBTUVfTEVOCQkoSUVFRTgwMjExX0RBVEFfTEVOICsgSUVFRTgwMjExX0hMRU4pCisKKy8qIHRoaXMgaXMgc3RvbGVuIGFuZCBtb2RpZmllZCBmcm9tIHRoZSBtYWR3aWZpIGRyaXZlciovCisjZGVmaW5lIElFRUU4MDIxMV9GQzBfVFlQRV9NQVNLCQkweDBjCisjZGVmaW5lIElFRUU4MDIxMV9GQzBfVFlQRV9EQVRBCQkweDA4CisjZGVmaW5lIElFRUU4MDIxMV9GQzBfU1VCVFlQRV9NQVNLCTB4QjAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1FPUwkweDgwCisKKyNkZWZpbmUgSUVFRTgwMjExX1FPU19IQVNfU0VRKGZjKSBcCisJKCgoZmMpICYgKElFRUU4MDIxMV9GQzBfVFlQRV9NQVNLIHwgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX01BU0spKSA9PSBcCisJIChJRUVFODAyMTFfRkMwX1RZUEVfREFUQSB8IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9RT1MpKQorCisvKiB0aGlzIGlzIHN0b2xlbiBmcm9tIGlwdzIyMDAgZHJpdmVyICovCisjZGVmaW5lIElFRUVfSUJTU19NQUNfSEFTSF9TSVpFIDMxCitzdHJ1Y3QgaWVlZV9pYnNzX3NlcSB7CisJdTggbWFjW0VUSF9BTEVOXTsKKwl1MTYgc2VxX251bVsxN107CisJdTE2IGZyYWdfbnVtWzE3XTsKKwl1bnNpZ25lZCBsb25nIHBhY2tldF90aW1lWzE3XTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX2hkciB7CisJdTE2IGZyYW1lX2N0bDsKKwl1MTYgZHVyYXRpb25faWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IGFkZHIyW0VUSF9BTEVOXTsKKwl1OCBhZGRyM1tFVEhfQUxFTl07CisJdTE2IHNlcV9jdGw7CisJdTggYWRkcjRbRVRIX0FMRU5dOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfaGRyX1FPUyB7CisJdTE2IGZyYW1lX2N0bDsKKwl1MTYgZHVyYXRpb25faWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IGFkZHIyW0VUSF9BTEVOXTsKKwl1OCBhZGRyM1tFVEhfQUxFTl07CisJdTE2IHNlcV9jdGw7CisJdTggYWRkcjRbRVRIX0FMRU5dOworCXUxNiBRT1NfY3RsOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyIHsKKwl1MTYgZnJhbWVfY3RsOworCXUxNiBkdXJhdGlvbl9pZDsKKwl1OCBhZGRyMVtFVEhfQUxFTl07CisJdTggYWRkcjJbRVRIX0FMRU5dOworCXU4IGFkZHIzW0VUSF9BTEVOXTsKKwl1MTYgc2VxX2N0bDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcl9RT1MgeworCXUxNiBmcmFtZV9jdGw7CisJdTE2IGR1cmF0aW9uX2lkOworCXU4IGFkZHIxW0VUSF9BTEVOXTsKKwl1OCBhZGRyMltFVEhfQUxFTl07CisJdTggYWRkcjNbRVRIX0FMRU5dOworCXUxNiBzZXFfY3RsOworCXUxNiBRT1NfY3RsOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK2VudW0gZWFwX3R5cGUgeworCUVBUF9QQUNLRVQgPSAwLAorCUVBUE9MX1NUQVJULAorCUVBUE9MX0xPR09GRiwKKwlFQVBPTF9LRVksCisJRUFQT0xfRU5DQVBfQVNGX0FMRVJUCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqZWFwX3R5cGVzW10gPSB7CisJW0VBUF9QQUNLRVRdCQk9ICJFQVAtUGFja2V0IiwKKwlbRUFQT0xfU1RBUlRdCQk9ICJFQVBPTC1TdGFydCIsCisJW0VBUE9MX0xPR09GRl0JCT0gIkVBUE9MLUxvZ29mZiIsCisJW0VBUE9MX0tFWV0JCT0gIkVBUE9MLUtleSIsCisJW0VBUE9MX0VOQ0FQX0FTRl9BTEVSVF0JPSAiRUFQT0wtRW5jYXAtQVNGLUFsZXJ0IgorfTsKKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICplYXBfZ2V0X3R5cGUoaW50IHR5cGUpCit7CisJcmV0dXJuICh0eXBlID49IEFSUkFZX1NJWkUoZWFwX3R5cGVzKSkgPyAiVW5rbm93biIgOiBlYXBfdHlwZXNbdHlwZV07Cit9CisKK3N0cnVjdCBlYXBvbCB7CisJdTggc25hcFs2XTsKKwl1MTYgZXRoZXJ0eXBlOworCXU4IHZlcnNpb247CisJdTggdHlwZTsKKwl1MTYgbGVuZ3RoOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgSUVFRTgwMjExXzNBRERSX0xFTiAyNAorI2RlZmluZSBJRUVFODAyMTFfNEFERFJfTEVOIDMwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1NfTEVOICAgIDQKKworI2RlZmluZSBNSU5fRlJBR19USFJFU0hPTEQgICAgIDI1NlUKKyNkZWZpbmUJTUFYX0ZSQUdfVEhSRVNIT0xEICAgICAyMzQ2VQorCisvKiBGcmFtZSBjb250cm9sIGZpZWxkIGNvbnN0YW50cyAqLworI2RlZmluZSBJRUVFODAyMTFfRkNUTF9WRVJTCQkweDAwMDIKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfRlRZUEUJCTB4MDAwYworI2RlZmluZSBJRUVFODAyMTFfRkNUTF9TVFlQRQkJMHgwMGYwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1RPRFMJCTB4MDEwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9GUk9NRFMJCTB4MDIwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9EU1RPRFMJCTB4MDMwMCAvL2FkZGVkIGJ5IGRhdmlkCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX01PUkVGUkFHUwkweDA0MDAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfUkVUUlkJCTB4MDgwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9QTQkJMHgxMDAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX01PUkVEQVRBCTB4MjAwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9XRVAJCTB4NDAwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9PUkRFUgkJMHg4MDAwCisKKyNkZWZpbmUgSUVFRTgwMjExX0ZUWVBFX01HTVQJCTB4MDAwMAorI2RlZmluZSBJRUVFODAyMTFfRlRZUEVfQ1RMCQkweDAwMDQKKyNkZWZpbmUgSUVFRTgwMjExX0ZUWVBFX0RBVEEJCTB4MDAwOAorCisvKiBtYW5hZ2VtZW50ICovCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVEJMHgwMDAwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVNQIAkweDAwMTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX1JFQVNTT0NfUkVRCTB4MDAyMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVNQCTB4MDAzMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVRCTB4MDA0MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUAkweDAwNTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0JFQUNPTgkJMHgwMDgwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BVElNCQkweDAwOTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RJU0FTU09DCTB4MDBBMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQVVUSAkJMHgwMEIwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9ERUFVVEgJCTB4MDBDMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfTUFOQUdFX0FDVAkweDAwRDAKKworLyogY29udHJvbCAqLworI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUFNQT0xMCQkweDAwQTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX1JUUwkJMHgwMEIwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9DVFMJCTB4MDBDMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQUNLCQkweDAwRDAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NGRU5ECQkweDAwRTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NGRU5EQUNLCTB4MDBGMAorCisvKiBkYXRhICovCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9EQVRBCQkweDAwMDAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RBVEFfQ0ZBQ0sJMHgwMDEwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9EQVRBX0NGUE9MTAkweDAwMjAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RBVEFfQ0ZBQ0tQT0xMCTB4MDAzMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfTlVMTEZVTkMJMHgwMDQwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9DRkFDSwkJMHgwMDUwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9DRlBPTEwJCTB4MDA2MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQ0ZBQ0tQT0xMCTB4MDA3MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUU9TX0RBVEEJMHgwMDgwIC8vYWRkZWQgZm9yIFdNTSAyMDA2LzgvMgorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUU9TX05VTEwJMHgwMEMwCisKKworI2RlZmluZSBJRUVFODAyMTFfU0NUTF9GUkFHCQkweDAwMEYKKyNkZWZpbmUgSUVFRTgwMjExX1NDVExfU0VRCQkweEZGRjAKKworCisvKiBkZWJ1ZyBtYWNyb3MgKi8KKworI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKK2V4dGVybiB1MzIgaWVlZTgwMjExX2RlYnVnX2xldmVsOworI2RlZmluZSBJRUVFODAyMTFfREVCVUcobGV2ZWwsIGZtdCwgYXJncy4uLikgXAorZG8geyBpZiAoaWVlZTgwMjExX2RlYnVnX2xldmVsICYgKGxldmVsKSkgXAorICBwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExOiAlYyAlcyAiIGZtdCwgXAorICAgICAgICAgaW5faW50ZXJydXB0KCkgPyAnSScgOiAnVScsIF9fZnVuY19fICwgIyMgYXJncyk7IH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBJRUVFODAyMTFfREVCVUcobGV2ZWwsIGZtdCwgYXJncy4uLikgZG8ge30gd2hpbGUgKDApCisjZW5kaWYJLyogQ09ORklHX0lFRUU4MDIxMV9ERUJVRyAqLworCisvKgorICogVG8gdXNlIHRoZSBkZWJ1ZyBzeXN0ZW07CisgKgorICogSWYgeW91IGFyZSBkZWZpbmluZyBhIG5ldyBkZWJ1ZyBjbGFzc2lmaWNhdGlvbiwgc2ltcGx5IGFkZCBpdCB0byB0aGUgI2RlZmluZQorICogbGlzdCBoZXJlIGluIHRoZSBmb3JtIG9mOgorICoKKyAqICNkZWZpbmUgSUVFRTgwMjExX0RMX3h4eHggVkFMVUUKKyAqCisgKiBzaGlmdGluZyB2YWx1ZSB0byB0aGUgbGVmdCBvbmUgYml0IGZyb20gdGhlIHByZXZpb3VzIGVudHJ5LiAgeHh4eCBzaG91bGQgYmUKKyAqIHRoZSBuYW1lIG9mIHRoZSBjbGFzc2lmaWNhdGlvbiAoZm9yIGV4YW1wbGUsIFdFUCkKKyAqCisgKiBZb3UgdGhlbiBuZWVkIHRvIGVpdGhlciBhZGQgYSBJRUVFODAyMTFfeHh4eF9ERUJVRygpIG1hY3JvIGRlZmluaXRpb24gZm9yIHlvdXIKKyAqIGNsYXNzaWZpY2F0aW9uLCBvciB1c2UgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF94eHh4LCAuLi4pIHdoZW5ldmVyIHlvdSB3YW50CisgKiB0byBzZW5kIG91dHB1dCB0byB0aGF0IGNsYXNzaWZpY2F0aW9uLgorICoKKyAqIFRvIGFkZCB5b3VyIGRlYnVnIGxldmVsIHRvIHRoZSBsaXN0IG9mIGxldmVscyBzZWVuIHdoZW4geW91IHBlcmZvcm0KKyAqCisgKiAlIGNhdCAvcHJvYy9uZXQvaXB3L2RlYnVnX2xldmVsCisgKgorICogeW91IHNpbXBseSBuZWVkIHRvIGFkZCB5b3VyIGVudHJ5IHRvIHRoZSBpcHdfZGVidWdfbGV2ZWxzIGFycmF5LgorICoKKyAqIElmIHlvdSBkbyBub3Qgc2VlIGRlYnVnX2xldmVsIGluIC9wcm9jL25ldC9pcHcgdGhlbiB5b3UgZG8gbm90IGhhdmUKKyAqIENPTkZJR19JRUVFODAyMTFfREVCVUcgZGVmaW5lZCBpbiB5b3VyIGtlcm5lbCBjb25maWd1cmF0aW9uCisgKgorICovCisKKyNkZWZpbmUgSUVFRTgwMjExX0RMX0lORk8gICAgICAgICAgKDE8PDApCisjZGVmaW5lIElFRUU4MDIxMV9ETF9XWCAgICAgICAgICAgICgxPDwxKQorI2RlZmluZSBJRUVFODAyMTFfRExfU0NBTiAgICAgICAgICAoMTw8MikKKyNkZWZpbmUgSUVFRTgwMjExX0RMX1NUQVRFICAgICAgICAgKDE8PDMpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9NR01UICAgICAgICAgICgxPDw0KQorI2RlZmluZSBJRUVFODAyMTFfRExfRlJBRyAgICAgICAgICAoMTw8NSkKKyNkZWZpbmUgSUVFRTgwMjExX0RMX0VBUCAgICAgICAgICAgKDE8PDYpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9EUk9QICAgICAgICAgICgxPDw3KQorCisjZGVmaW5lIElFRUU4MDIxMV9ETF9UWCAgICAgICAgICAgICgxPDw4KQorI2RlZmluZSBJRUVFODAyMTFfRExfUlggICAgICAgICAgICAoMTw8OSkKKworI2RlZmluZSBJRUVFODAyMTFfRVJST1IoZiwgYS4uLikgcHJpbnRrKEtFUk5fRVJSICJpZWVlODAyMTE6ICIgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX1dBUk5JTkcoZiwgYS4uLikgcHJpbnRrKEtFUk5fV0FSTklORyAiaWVlZTgwMjExOiAiIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19JTkZPKGYsIGEuLi4pICAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9JTkZPLCBmLCAjIyBhKQorCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19XWChmLCBhLi4uKSAgICAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9XWCwgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX1NDQU4oZiwgYS4uLikgICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1NDQU4sIGYsICMjIGEpCisvLyNkZWZpbmUgSUVFRV9ERUJVR19TQ0FOICBJRUVFODAyMTFfV0FSTklORworI2RlZmluZSBJRUVFODAyMTFfREVCVUdfU1RBVEUoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfU1RBVEUsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19NR01UKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX01HTVQsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19GUkFHKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0ZSQUcsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19FQVAoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRUFQLCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfRFJPUChmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9EUk9QLCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfVFgoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfVFgsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19SWChmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SWCwgZiwgIyMgYSkKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPiAvKiBBUlBIUkRfRVRIRVIgKi8KKworI2lmbmRlZiBXSVJFTEVTU19TUFkKKyNkZWZpbmUgV0lSRUxFU1NfU1BZCQkvLyBlbmFibGUgaXdzcHkgc3VwcG9ydAorI2VuZGlmCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4JLy8gbmV3IGRyaXZlciBBUEkKKworI2lmbmRlZiBFVEhfUF9QQUUKKyNkZWZpbmUgRVRIX1BfUEFFIDB4ODg4RSAvKiBQb3J0IEFjY2VzcyBFbnRpdHkgKElFRUUgODAyLjFYKSAqLworI2VuZGlmIC8qIEVUSF9QX1BBRSAqLworCisjZGVmaW5lIEVUSF9QX1BSRUFVVEggMHg4OEM3IC8qIElFRUUgODAyLjExaSBwcmUtYXV0aGVudGljYXRpb24gKi8KKworI2lmbmRlZiBFVEhfUF84MDIxMV9SQVcKKyNkZWZpbmUgRVRIX1BfODAyMTFfUkFXIChFVEhfUF9FQ09ORVQgKyAxKQorI2VuZGlmCisKKy8qIElFRUUgODAyLjExIGRlZmluZXMgKi8KKworI2RlZmluZSBQODAyMTFfT1VJX0xFTiAzCisKK3N0cnVjdCBpZWVlODAyMTFfc25hcF9oZHIgeworCisgICAgICAgIHU4ICAgIGRzYXA7ICAgLyogYWx3YXlzIDB4QUEgKi8KKyAgICAgICAgdTggICAgc3NhcDsgICAvKiBhbHdheXMgMHhBQSAqLworICAgICAgICB1OCAgICBjdHJsOyAgIC8qIGFsd2F5cyAweDAzICovCisgICAgICAgIHU4ICAgIG91aVtQODAyMTFfT1VJX0xFTl07ICAgIC8qIG9yZ2FuaXphdGlvbmFsIHVuaXZlcnNhbCBpZCAqLworCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBTTkFQX1NJWkUgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfc25hcF9oZHIpCisKKyNkZWZpbmUgV0xBTl9GQ19HRVRfVFlQRShmYykgKChmYykgJiBJRUVFODAyMTFfRkNUTF9GVFlQRSkKKyNkZWZpbmUgV0xBTl9GQ19HRVRfU1RZUEUoZmMpICgoZmMpICYgSUVFRTgwMjExX0ZDVExfU1RZUEUpCisKKyNkZWZpbmUgV0xBTl9HRVRfU0VRX0ZSQUcoc2VxKSAoKHNlcSkgJiBJRUVFODAyMTFfU0NUTF9GUkFHKQorI2RlZmluZSBXTEFOX0dFVF9TRVFfU0VRKHNlcSkgICgoc2VxKSAmIElFRUU4MDIxMV9TQ1RMX1NFUSkKKworLyogQXV0aGVudGljYXRpb24gYWxnb3JpdGhtcyAqLworI2RlZmluZSBXTEFOX0FVVEhfT1BFTiAwCisjZGVmaW5lIFdMQU5fQVVUSF9TSEFSRURfS0VZIDEKKworI2RlZmluZSBXTEFOX0FVVEhfQ0hBTExFTkdFX0xFTiAxMjgKKworI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfQlNTICgxPDwwKQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfSUJTUyAoMTw8MSkKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX0NGX1BPTExBQkxFICgxPDwyKQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfQ0ZfUE9MTF9SRVFVRVNUICgxPDwzKQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSAoMTw8NCkKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1BSRUFNQkxFICgxPDw1KQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfUEJDQyAoMTw8NikKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX0NIQU5ORUxfQUdJTElUWSAoMTw8NykKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1QgKDE8PDEwKQorCisvKiBTdGF0dXMgY29kZXMgKi8KKyNkZWZpbmUgV0xBTl9TVEFUVVNfU1VDQ0VTUyAwCisjZGVmaW5lIFdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkUgMQorI2RlZmluZSBXTEFOX1NUQVRVU19DQVBTX1VOU1VQUE9SVEVEIDEwCisjZGVmaW5lIFdMQU5fU1RBVFVTX1JFQVNTT0NfTk9fQVNTT0MgMTEKKyNkZWZpbmUgV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX1VOU1BFQyAxMgorI2RlZmluZSBXTEFOX1NUQVRVU19OT1RfU1VQUE9SVEVEX0FVVEhfQUxHIDEzCisjZGVmaW5lIFdMQU5fU1RBVFVTX1VOS05PV05fQVVUSF9UUkFOU0FDVElPTiAxNAorI2RlZmluZSBXTEFOX1NUQVRVU19DSEFMTEVOR0VfRkFJTCAxNQorI2RlZmluZSBXTEFOX1NUQVRVU19BVVRIX1RJTUVPVVQgMTYKKyNkZWZpbmUgV0xBTl9TVEFUVVNfQVBfVU5BQkxFX1RPX0hBTkRMRV9ORVdfU1RBIDE3CisjZGVmaW5lIFdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9SQVRFUyAxOAorLyogODAyLjExYiAqLworI2RlZmluZSBXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfTk9TSE9SVCAxOQorI2RlZmluZSBXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfTk9QQkNDIDIwCisjZGVmaW5lIFdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9OT0FHSUxJVFkgMjEKKworLyogUmVhc29uIGNvZGVzICovCisjZGVmaW5lIFdMQU5fUkVBU09OX1VOU1BFQ0lGSUVEIDEKKyNkZWZpbmUgV0xBTl9SRUFTT05fUFJFVl9BVVRIX05PVF9WQUxJRCAyCisjZGVmaW5lIFdMQU5fUkVBU09OX0RFQVVUSF9MRUFWSU5HIDMKKyNkZWZpbmUgV0xBTl9SRUFTT05fRElTQVNTT0NfRFVFX1RPX0lOQUNUSVZJVFkgNAorI2RlZmluZSBXTEFOX1JFQVNPTl9ESVNBU1NPQ19BUF9CVVNZIDUKKyNkZWZpbmUgV0xBTl9SRUFTT05fQ0xBU1MyX0ZSQU1FX0ZST01fTk9OQVVUSF9TVEEgNgorI2RlZmluZSBXTEFOX1JFQVNPTl9DTEFTUzNfRlJBTUVfRlJPTV9OT05BU1NPQ19TVEEgNworI2RlZmluZSBXTEFOX1JFQVNPTl9ESVNBU1NPQ19TVEFfSEFTX0xFRlQgOAorI2RlZmluZSBXTEFOX1JFQVNPTl9TVEFfUkVRX0FTU09DX1dJVEhPVVRfQVVUSCA5CisKKworLyogSW5mb3JtYXRpb24gRWxlbWVudCBJRHMgKi8KKyNkZWZpbmUgV0xBTl9FSURfU1NJRCAwCisjZGVmaW5lIFdMQU5fRUlEX1NVUFBfUkFURVMgMQorI2RlZmluZSBXTEFOX0VJRF9GSF9QQVJBTVMgMgorI2RlZmluZSBXTEFOX0VJRF9EU19QQVJBTVMgMworI2RlZmluZSBXTEFOX0VJRF9DRl9QQVJBTVMgNAorI2RlZmluZSBXTEFOX0VJRF9USU0gNQorI2RlZmluZSBXTEFOX0VJRF9JQlNTX1BBUkFNUyA2CisjZGVmaW5lIFdMQU5fRUlEX0NIQUxMRU5HRSAxNgorI2RlZmluZSBXTEFOX0VJRF9SU04gNDgKKyNkZWZpbmUgV0xBTl9FSURfR0VORVJJQyAyMjEKKworI2RlZmluZSBJRUVFODAyMTFfTUdNVF9IRFJfTEVOIDI0CisjZGVmaW5lIElFRUU4MDIxMV9EQVRBX0hEUjNfTEVOIDI0CisjZGVmaW5lIElFRUU4MDIxMV9EQVRBX0hEUjRfTEVOIDMwCisKKworI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfU0lHTkFMICgxPDwwKQorI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfUlNTSSAoMTw8MSkKKyNkZWZpbmUgSUVFRTgwMjExX1NUQVRNQVNLX05PSVNFICgxPDwyKQorI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfUkFURSAoMTw8MykKKyNkZWZpbmUgSUVFRTgwMjExX1NUQVRNQVNLX1dFTUFTSyAweDcKKworCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTiAgICAoMTw8MCkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTiAgICgxPDwxKQorCisjZGVmaW5lIElFRUU4MDIxMV8yNEdIWl9CQU5EICAgICAoMTw8MCkKKyNkZWZpbmUgSUVFRTgwMjExXzUyR0haX0JBTkQgICAgICgxPDwxKQorCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV9MRU4gIAkJNAorI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfMU1CCQkgICAgICAgIDB4MDIKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzJNQgkJICAgICAgICAweDA0CisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV81TUIJCSAgICAgICAgMHgwQgorI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQgkJICAgICAgICAweDE2CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfTEVOIAkJOAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQgkJICAgICAgICAweDBDCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfOU1CCQkgICAgICAgIDB4MTIKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xMk1CCQkweDE4CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMThNQgkJMHgyNAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUIJCTB4MzAKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8zNk1CCQkweDQ4CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQgkJMHg2MAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUIJCTB4NkMKKyNkZWZpbmUgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSwkJMHg4MAorCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xTUJfTUFTSwkJKDE8PDApCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8yTUJfTUFTSwkJKDE8PDEpCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV81TUJfTUFTSwkJKDE8PDIpCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xMU1CX01BU0sJCSgxPDwzKQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQl9NQVNLCQkoMTw8NCkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV85TUJfTUFTSwkJKDE8PDUpCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQl9NQVNLCQkoMTw8NikKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xOE1CX01BU0sJCSgxPDw3KQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUJfTUFTSwkJKDE8PDgpCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQl9NQVNLCQkoMTw8OSkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV80OE1CX01BU0sJCSgxPDwxMCkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV81NE1CX01BU0sJCSgxPDwxMSkKKworI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVTX01BU0sJICAgICAgICAweDAwMDAwMDBGCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfQkFTSUNfUkFURVNfTUFTSwkoSUVFRTgwMjExX0NDS19SQVRFXzFNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9DQ0tfUkFURV8yTUJfTUFTSykKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19ERUZBVUxUX1JBVEVTX01BU0sJKElFRUU4MDIxMV9DQ0tfQkFTSUNfUkFURVNfTUFTSyB8IFwKKyAgICAgICAgSUVFRTgwMjExX0NDS19SQVRFXzVNQl9NQVNLIHwgXAorICAgICAgICBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQl9NQVNLKQorCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVTX01BU0sJCTB4MDAwMDBGRjAKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fQkFTSUNfUkFURVNfTUFTSwkoSUVFRTgwMjExX09GRE1fUkFURV82TUJfTUFTSyB8IFwKKwlJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUJfTUFTSyB8IFwKKwlJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUJfTUFTSykKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fREVGQVVMVF9SQVRFU19NQVNLCShJRUVFODAyMTFfT0ZETV9CQVNJQ19SQVRFU19NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfOU1CX01BU0sgIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfMThNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQl9NQVNLKQorI2RlZmluZSBJRUVFODAyMTFfREVGQVVMVF9SQVRFU19NQVNLIChJRUVFODAyMTFfT0ZETV9ERUZBVUxUX1JBVEVTX01BU0sgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9DQ0tfREVGQVVMVF9SQVRFU19NQVNLKQorCisjZGVmaW5lIElFRUU4MDIxMV9OVU1fT0ZETV9SQVRFUwkgICAgOAorI2RlZmluZSBJRUVFODAyMTFfTlVNX0NDS19SQVRFUwkgICAgICAgICAgICA0CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1NISUZUX01BU0tfQSAgICAgICAgIDQKKworCisKKworLyogTk9URTogVGhpcyBkYXRhIGlzIGZvciBzdGF0aXN0aWNhbCBwdXJwb3Nlczsgbm90IGFsbCBoYXJkd2FyZSBwcm92aWRlcyB0aGlzCisgKiAgICAgICBpbmZvcm1hdGlvbiBmb3IgZnJhbWVzIHJlY2VpdmVkLiAgTm90IHNldHRpbmcgdGhlc2Ugd2lsbCBub3QgY2F1c2UKKyAqICAgICAgIGFueSBhZHZlcnNlIGFmZmVjdHMuICovCitzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzIHsKKwl1MzIgbWFjX3RpbWVbMl07CisJdTggc2lnbmFsc3RyZW5ndGg7CisJczggcnNzaTsKKwl1OCBzaWduYWw7CisJdTggbm9pc2U7CisJdTE2IHJhdGU7IC8qIGluIDEwMCBrYnBzICovCisJdTggcmVjZWl2ZWRfY2hhbm5lbDsKKwl1OCBjb250cm9sOworCXU4IG1hc2s7CisJdTggZnJlcTsKKwl1MTYgbGVuOworCXU4IG5pY190eXBlOworfTsKKworLyogSUVFRSA4MDIuMTEgcmVxdWlyZXMgdGhhdCBTVEEgc3VwcG9ydHMgY29uY3VycmVudCByZWNlcHRpb24gb2YgYXQgbGVhc3QKKyAqIHRocmVlIGZyYWdtZW50ZWQgZnJhbWVzLiBUaGlzIGRlZmluZSBjYW4gYmUgaW5jcmVhc2VkIHRvIHN1cHBvcnQgbW9yZQorICogY29uY3VycmVudCBmcmFtZXMsIGJ1dCBpdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBlYWNoIGVudHJ5IGNhbiBjb25zdW1lIGFib3V0CisgKiAyIGtCIG9mIFJBTSBhbmQgaW5jcmVhc2luZyBjYWNoZSBzaXplIHdpbGwgc2xvdyBkb3duIGZyYW1lIHJlYXNzZW1ibHkuICovCisjZGVmaW5lIElFRUU4MDIxMV9GUkFHX0NBQ0hFX0xFTiA0CisKK3N0cnVjdCBpZWVlODAyMTFfZnJhZ19lbnRyeSB7CisJdW5zaWduZWQgbG9uZyBmaXJzdF9mcmFnX3RpbWU7CisJdW5zaWduZWQgaW50IHNlcTsKKwl1bnNpZ25lZCBpbnQgbGFzdF9mcmFnOworCXN0cnVjdCBza19idWZmICpza2I7CisJdTggc3JjX2FkZHJbRVRIX0FMRU5dOworCXU4IGRzdF9hZGRyW0VUSF9BTEVOXTsKK307CisKK3N0cnVjdCBpZWVlODAyMTFfc3RhdHMgeworCXVuc2lnbmVkIGludCB0eF91bmljYXN0X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgdHhfbXVsdGljYXN0X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgdHhfZnJhZ21lbnRzOworCXVuc2lnbmVkIGludCB0eF91bmljYXN0X29jdGV0czsKKwl1bnNpZ25lZCBpbnQgdHhfbXVsdGljYXN0X29jdGV0czsKKwl1bnNpZ25lZCBpbnQgdHhfZGVmZXJyZWRfdHJhbnNtaXNzaW9uczsKKwl1bnNpZ25lZCBpbnQgdHhfc2luZ2xlX3JldHJ5X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgdHhfbXVsdGlwbGVfcmV0cnlfZnJhbWVzOworCXVuc2lnbmVkIGludCB0eF9yZXRyeV9saW1pdF9leGNlZWRlZDsKKwl1bnNpZ25lZCBpbnQgdHhfZGlzY2FyZHM7CisJdW5zaWduZWQgaW50IHJ4X3VuaWNhc3RfZnJhbWVzOworCXVuc2lnbmVkIGludCByeF9tdWx0aWNhc3RfZnJhbWVzOworCXVuc2lnbmVkIGludCByeF9mcmFnbWVudHM7CisJdW5zaWduZWQgaW50IHJ4X3VuaWNhc3Rfb2N0ZXRzOworCXVuc2lnbmVkIGludCByeF9tdWx0aWNhc3Rfb2N0ZXRzOworCXVuc2lnbmVkIGludCByeF9mY3NfZXJyb3JzOworCXVuc2lnbmVkIGludCByeF9kaXNjYXJkc19ub19idWZmZXI7CisJdW5zaWduZWQgaW50IHR4X2Rpc2NhcmRzX3dyb25nX3NhOworCXVuc2lnbmVkIGludCByeF9kaXNjYXJkc191bmRlY3J5cHRhYmxlOworCXVuc2lnbmVkIGludCByeF9tZXNzYWdlX2luX21zZ19mcmFnbWVudHM7CisJdW5zaWduZWQgaW50IHJ4X21lc3NhZ2VfaW5fYmFkX21zZ19mcmFnbWVudHM7Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX3NvZnRtYWNfc3RhdHN7CisJdW5zaWduZWQgaW50IHJ4X2Fzc19vazsKKwl1bnNpZ25lZCBpbnQgcnhfYXNzX2VycjsKKwl1bnNpZ25lZCBpbnQgcnhfcHJvYmVfcnE7CisJdW5zaWduZWQgaW50IHR4X3Byb2JlX3JzOworCXVuc2lnbmVkIGludCB0eF9iZWFjb25zOworCXVuc2lnbmVkIGludCByeF9hdXRoX3JxOworCXVuc2lnbmVkIGludCByeF9hdXRoX3JzX29rOworCXVuc2lnbmVkIGludCByeF9hdXRoX3JzX2VycjsKKwl1bnNpZ25lZCBpbnQgdHhfYXV0aF9ycTsKKwl1bnNpZ25lZCBpbnQgbm9fYXV0aF9yczsKKwl1bnNpZ25lZCBpbnQgbm9fYXNzX3JzOworCXVuc2lnbmVkIGludCB0eF9hc3NfcnE7CisJdW5zaWduZWQgaW50IHJ4X2Fzc19ycTsKKwl1bnNpZ25lZCBpbnQgdHhfcHJvYmVfcnE7CisJdW5zaWduZWQgaW50IHJlYXNzb2M7CisJdW5zaWduZWQgaW50IHN3dHhzdG9wOworCXVuc2lnbmVkIGludCBzd3R4YXdha2U7Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX2RldmljZTsKKworI2luY2x1ZGUgImllZWU4MDIxMV9jcnlwdC5oIgorCisjZGVmaW5lIFNFQ19LRVlfMSAgICAgICAgICgxPDwwKQorI2RlZmluZSBTRUNfS0VZXzIgICAgICAgICAoMTw8MSkKKyNkZWZpbmUgU0VDX0tFWV8zICAgICAgICAgKDE8PDIpCisjZGVmaW5lIFNFQ19LRVlfNCAgICAgICAgICgxPDwzKQorI2RlZmluZSBTRUNfQUNUSVZFX0tFWSAgICAoMTw8NCkKKyNkZWZpbmUgU0VDX0FVVEhfTU9ERSAgICAgKDE8PDUpCisjZGVmaW5lIFNFQ19VTklDQVNUX0dST1VQICgxPDw2KQorI2RlZmluZSBTRUNfTEVWRUwgICAgICAgICAoMTw8NykKKyNkZWZpbmUgU0VDX0VOQUJMRUQgICAgICAgKDE8PDgpCisKKyNkZWZpbmUgU0VDX0xFVkVMXzAgICAgICAwIC8qIE5vbmUgKi8KKyNkZWZpbmUgU0VDX0xFVkVMXzEgICAgICAxIC8qIFdFUCA0MCBhbmQgMTA0IGJpdCAqLworI2RlZmluZSBTRUNfTEVWRUxfMiAgICAgIDIgLyogTGV2ZWwgMSArIFRLSVAgKi8KKyNkZWZpbmUgU0VDX0xFVkVMXzJfQ0tJUCAzIC8qIExldmVsIDEgKyBDS0lQICovCisjZGVmaW5lIFNFQ19MRVZFTF8zICAgICAgNCAvKiBMZXZlbCAyICsgQ0NNUCAqLworCisjZGVmaW5lIFdFUF9LRVlTIDQKKyNkZWZpbmUgV0VQX0tFWV9MRU4gMTMKKworI2RlZmluZSBXRVBfS0VZX0xFTl9NT0RJRiAzMgorCitzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5IHsKKwl1MTYgYWN0aXZlX2tleToyLAorICAgICAgICAgICAgZW5hYmxlZDoxLAorCSAgICBhdXRoX21vZGU6MiwKKyAgICAgICAgICAgIGF1dGhfYWxnbzo0LAorICAgICAgICAgICAgdW5pY2FzdF91c2VzX2dyb3VwOjE7CisJdTgga2V5X3NpemVzW1dFUF9LRVlTXTsKKwl1OCBrZXlzW1dFUF9LRVlTXVtXRVBfS0VZX0xFTl9NT0RJRl07CisJdTggbGV2ZWw7CisJdTE2IGZsYWdzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworLyoKKworIDgwMi4xMSBkYXRhIGZyYW1lIGZyb20gQVAKKworICAgICAgLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCitCeXRlcyB8ICAyICAgfCAgMiAgIHwgICAgNiAgICB8ICAgIDYgICAgfCAgICA2ICAgIHwgIDIgICB8IDAuLjIzMTIgfCAgIDQgIHwKKyAgICAgIHwtLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLXwtLS0tLS0tLS18LS0tLS0tfAorRGVzYy4gfCBjdHJsIHwgZHVyYSB8ICBEQS9SQSAgfCAgIFRBICAgIHwgICAgU0EgICB8IFNlcXUgfCAgZnJhbWUgIHwgIGZjcyB8CisgICAgICB8ICAgICAgfCB0aW9uIHwgKEJTU0lEKSB8ICAgICAgICAgfCAgICAgICAgIHwgZW5jZSB8ICBkYXRhICAgfCAgICAgIHwKKyAgICAgIGAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJworCitUb3RhbDogMjgtMjM0MCBieXRlcworCisqLworCitzdHJ1Y3QgaWVlZTgwMjExX2hlYWRlcl9kYXRhIHsKKwl1MTYgZnJhbWVfY3RsOworCXUxNiBkdXJhdGlvbl9pZDsKKwl1OCBhZGRyMVs2XTsKKwl1OCBhZGRyMls2XTsKKwl1OCBhZGRyM1s2XTsKKwl1MTYgc2VxX2N0cmw7Cit9OworCisjZGVmaW5lIEJFQUNPTl9QUk9CRV9TU0lEX0lEX1BPU0lUSU9OIDEyCisKKy8qIE1hbmFnZW1lbnQgRnJhbWUgSW5mb3JtYXRpb24gRWxlbWVudCBUeXBlcyAqLworI2RlZmluZSBNRklFX1RZUEVfU1NJRCAgICAgICAwCisjZGVmaW5lIE1GSUVfVFlQRV9SQVRFUyAgICAgIDEKKyNkZWZpbmUgTUZJRV9UWVBFX0ZIX1NFVCAgICAgMgorI2RlZmluZSBNRklFX1RZUEVfRFNfU0VUICAgICAzCisjZGVmaW5lIE1GSUVfVFlQRV9DRl9TRVQgICAgIDQKKyNkZWZpbmUgTUZJRV9UWVBFX1RJTSAgICAgICAgNQorI2RlZmluZSBNRklFX1RZUEVfSUJTU19TRVQgICA2CisjZGVmaW5lIE1GSUVfVFlQRV9DT1VOVFJZICA3IC8vK1lKLDA4MDYyNQorI2RlZmluZSBNRklFX1RZUEVfQ0hBTExFTkdFICAxNgorI2RlZmluZSBNRklFX1RZUEVfRVJQICAgICAgICA0MgorI2RlZmluZSBNRklFX1RZUEVfUlNOCSAgICAgNDgKKyNkZWZpbmUgTUZJRV9UWVBFX1JBVEVTX0VYICAgNTAKKyNkZWZpbmUgTUZJRV9UWVBFX0dFTkVSSUMgICAgMjIxCisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECit0eXBlZGVmIGVudW0KK3sKKwlDT1VOVFJZX0NPREVfRkNDID0gMCwKKwlDT1VOVFJZX0NPREVfSUMgPSAxLAorCUNPVU5UUllfQ09ERV9FVFNJID0gMiwKKwlDT1VOVFJZX0NPREVfU1BBSU4gPSAzLAorCUNPVU5UUllfQ09ERV9GUkFOQ0UgPSA0LAorCUNPVU5UUllfQ09ERV9NS0sgPSA1LAorCUNPVU5UUllfQ09ERV9NS0sxID0gNiwKKwlDT1VOVFJZX0NPREVfSVNSQUVMID0gNywKKwlDT1VOVFJZX0NPREVfVEVMRUMgPSA4LAorCUNPVU5UUllfQ09ERV9HTE9CQUxfRE9NQUlOID0gOSwKKwlDT1VOVFJZX0NPREVfV09STERfV0lERV8xM19JTkRFWCA9IDEwCit9Y291bnRyeV9jb2RlX3R5cGVfdDsKKyNlbmRpZgorCitzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudF9oZHIgeworCXU4IGlkOworCXU4IGxlbjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCB7CisJdTggaWQ7CisJdTggbGVuOworCXU4IGRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgZGF0YSB0eXBlcyB0aGF0IGNhbiBtYWtlIHVwIG1hbmFnZW1lbnQgcGFja2V0cworICoKKwl1MTYgYXV0aF9hbGdvcml0aG07CisJdTE2IGF1dGhfc2VxdWVuY2U7CisJdTE2IGJlYWNvbl9pbnRlcnZhbDsKKwl1MTYgY2FwYWJpbGl0eTsKKwl1OCBjdXJyZW50X2FwW0VUSF9BTEVOXTsKKwl1MTYgbGlzdGVuX2ludGVydmFsOworCXN0cnVjdCB7CisJCXUxNiBhc3NvY2lhdGlvbl9pZDoxNCwgcmVzZXJ2ZWQ6MjsKKwl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwl1MzIgdGltZV9zdGFtcFsyXTsKKwl1MTYgcmVhc29uOworCXUxNiBzdGF0dXM7CisqLworCisjZGVmaW5lIElFRUU4MDIxMV9ERUZBVUxUX1RYX0VTU0lEICJQZW5ndWluIgorI2RlZmluZSBJRUVFODAyMTFfREVGQVVMVF9CQVNJQ19SQVRFIDEwCisKK3N0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24geworCXN0cnVjdCBpZWVlODAyMTFfaGVhZGVyX2RhdGEgaGVhZGVyOworCXUxNiBhbGdvcml0aG07CisJdTE2IHRyYW5zYWN0aW9uOworCXUxNiBzdGF0dXM7CisJLy9zdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudF9oZHIgaW5mb19lbGVtZW50OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSB7CisJc3RydWN0IGllZWU4MDIxMV9oZWFkZXJfZGF0YSBoZWFkZXI7CisJdTMyIHRpbWVfc3RhbXBbMl07CisJdTE2IGJlYWNvbl9pbnRlcnZhbDsKKwl1MTYgY2FwYWJpbGl0eTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXF1ZXN0IHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hlYWRlcl9kYXRhIGhlYWRlcjsKKwkvKnN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudDsqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdF9mcmFtZSB7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOworCXUxNiBjYXBhYmlsaXR5OworCXUxNiBsaXN0ZW5faW50ZXJ2YWw7CisJLy91OCBjdXJyZW50X2FwW0VUSF9BTEVOXTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudF9oZHIgaW5mb19lbGVtZW50OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUgeworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyIGhlYWRlcjsKKwl1MTYgY2FwYWJpbGl0eTsKKwl1MTYgc3RhdHVzOworCXUxNiBhaWQ7CisJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgaW5mb19lbGVtZW50OyAvKiBzdXBwb3J0ZWQgcmF0ZXMgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2Rpc2Fzc29jX2ZyYW1leworICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7CisgICAgICAgIHUxNiAgICByZWFzb25jb2RlOworfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV90eGIgeworCXU4IG5yX2ZyYWdzOworCXU4IGVuY3J5cHRlZDsKKwl1MTYgcmVzZXJ2ZWQ7CisJdTE2IGZyYWdfc2l6ZTsKKwl1MTYgcGF5bG9hZF9zaXplOworCXN0cnVjdCBza19idWZmICpmcmFnbWVudHNbMF07Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX3dtbV9hY19wYXJhbSB7CisJdTggYWNfYWNpX2FjbV9haWZzbjsKKwl1OCBhY19lY3dtaW5fZWN3bWF4OworCXUxNiBhY190eG9wX2xpbWl0OworfTsKKworc3RydWN0IGllZWU4MDIxMV93bW1fdHNfaW5mbyB7CisJdTggYWNfZGlyX3RpZDsKKwl1OCBhY191cF9wc2I7CisJdTggcmVzZXJ2ZWQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV93bW1fdHNwZWNfZWxlbSB7CisJc3RydWN0IGllZWU4MDIxMV93bW1fdHNfaW5mbyB0c19pbmZvOworCXUxNiBub3JtX21zZHVfc2l6ZTsKKwl1MTYgbWF4X21zZHVfc2l6ZTsKKwl1MzIgbWluX3NlcnZfaW50ZXI7CisJdTMyIG1heF9zZXJ2X2ludGVyOworCXUzMiBpbmFjdF9pbnRlcjsKKwl1MzIgc3VzcGVuX2ludGVyOworCXUzMiBzZXJ2X3N0YXJ0X3RpbWU7CisJdTMyIG1pbl9kYXRhX3JhdGU7CisJdTMyIG1lYW5fZGF0YV9yYXRlOworCXUzMiBwZWFrX2RhdGFfcmF0ZTsKKwl1MzIgbWF4X2J1cnN0X3NpemU7CisJdTMyIGRlbGF5X2JvdW5kOworCXUzMiBtaW5fcGh5X3JhdGU7CisJdTE2IHN1cnBfYmFuZF9hbGxvdzsKKwl1MTYgbWVkaXVtX3RpbWU7Cit9X19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK2VudW0ge1dNTV9hbGxfZnJhbWUsIFdNTV90d29fZnJhbWUsIFdNTV9mb3VyX2ZyYW1lLCBXTU1fc2l4X2ZyYW1lfTsKKyNkZWZpbmUgTUFYX1NQX0xlbiAgKFdNTV9hbGxfZnJhbWUgPDwgNCkKKyNkZWZpbmUgSUVFRTgwMjExX1FPU19USUQgMHgwZgorI2RlZmluZSBRT1NfQ1RMX05PVENPTlRBSU5fQUNLICgweDAxIDw8IDUpCisKKy8qIFNXRUVQIFRBQkxFIEVOVFJJRVMgTlVNQkVSKi8KKyNkZWZpbmUgTUFYX1NXRUVQX1RBQl9FTlRSSUVTCQkgIDQyCisjZGVmaW5lIE1BWF9TV0VFUF9UQUJfRU5UUklFU19QRVJfUEFDS0VUICA3CisvKiBNQVhfUkFURVNfTEVOR1RIIG5lZWRzIHRvIGJlIDEyLiAgVGhlIHNwZWMgc2F5cyA4LCBhbmQgbWFueSBBUHMKKyAqIG9ubHkgdXNlIDgsIGFuZCB0aGVuIHVzZSBleHRlbmRlZCByYXRlcyBmb3IgdGhlIHJlbWFpbmluZyBzdXBwb3J0ZWQKKyAqIHJhdGVzLiAgT3RoZXIgQVBzLCBob3dldmVyLCBzdGljayBhbGwgb2YgdGhlaXIgc3VwcG9ydGVkIHJhdGVzIG9uIHRoZQorICogbWFpbiByYXRlcyBpbmZvcm1hdGlvbiBlbGVtZW50Li4uICovCisjZGVmaW5lIE1BWF9SQVRFU19MRU5HVEggICAgICAgICAgICAgICAgICAoKHU4KTEyKQorI2RlZmluZSBNQVhfUkFURVNfRVhfTEVOR1RIICAgICAgICAgICAgICAgKCh1OCkxNikKKyNkZWZpbmUgTUFYX05FVFdPUktfQ09VTlQgICAgICAgICAgICAgICAgICAxMjgKKy8vI2RlZmluZSBNQVhfQ0hBTk5FTF9OVU1CRVIgICAgICAgICAgICAgICAgIDE2MQorI2RlZmluZSBNQVhfQ0hBTk5FTF9OVU1CRVIgICAgICAgICAgICAgICAgIDE2NSAvL1lKLG1vZGlmaWVkLDA4MDYyNQorI2RlZmluZSBNQVhfSUVfTEVOCQkJCQkJMHhGRiAvLytZSiwwODA2MjUKKwordHlwZWRlZiBzdHJ1Y3QgX0NIQU5ORUxfTElTVHsKKwl1OAlDaGFubmVsW01BWF9DSEFOTkVMX05VTUJFUiArIDFdOworCXU4CUxlbjsKK31DSEFOTkVMX0xJU1QsICpQQ0hBTk5FTF9MSVNUOworCisjZGVmaW5lIElFRUU4MDIxMV9TT0ZUTUFDX1NDQU5fVElNRQkgIDEwMC8vNDAwCisvLyhIWiAvIDIpCisvL2J5IGFteSBmb3IgcHMKKyNkZWZpbmUgSUVFRTgwMjExX1dBVENIX0RPR19USU1FICAgIDIwMDAKKy8vYnkgYW15IGZvciBwcworLy9ieSBhbXkgZm9yIGFudGVubmEKKyNkZWZpbmUgQU5URU5OQV9ESVZFUlNJVFlfVElNRVJfUEVSSU9ECQkxMDAwIC8vIDEwMDAgbQorLy9ieSBhbXkgZm9yIGFudGVubmEKKyNkZWZpbmUgSUVFRTgwMjExX1NPRlRNQUNfQVNTT0NfUkVUUllfVElNRSAoSFogKiAyKQorCisjZGVmaW5lIENSQ19MRU5HVEggICAgICAgICAgICAgICAgIDRVCisKKyNkZWZpbmUgTUFYX1dQQV9JRV9MRU4gNjQKKworI2RlZmluZSBORVRXT1JLX0VNUFRZX0VTU0lEICgxPDwwKQorI2RlZmluZSBORVRXT1JLX0hBU19PRkRNICAgICgxPDwxKQorI2RlZmluZSBORVRXT1JLX0hBU19DQ0sgICAgICgxPDwyKQorCisjZGVmaW5lIElFRUU4MDIxMV9EVElNX01CQ0FTVCA0CisjZGVmaW5lIElFRUU4MDIxMV9EVElNX1VDQVNUIDIKKyNkZWZpbmUgSUVFRTgwMjExX0RUSU1fVkFMSUQgMQorI2RlZmluZSBJRUVFODAyMTFfRFRJTV9JTlZBTElEIDAKKworI2RlZmluZSBJRUVFODAyMTFfUFNfRElTQUJMRUQgMAorI2RlZmluZSBJRUVFODAyMTFfUFNfVU5JQ0FTVCBJRUVFODAyMTFfRFRJTV9VQ0FTVAorI2RlZmluZSBJRUVFODAyMTFfUFNfTUJDQVNUIElFRUU4MDIxMV9EVElNX01CQ0FTVAorI2RlZmluZSBJRUVFODAyMTFfUFNfRU5BQkxFICAgSUVFRTgwMjExX0RUSU1fVkFMSUQKKy8vYWRkZWQgYnkgRGF2aWQgZm9yIFFvUyAyMDA2LzYvMzAKKy8vI2RlZmluZSBXTU1fSGFuZ184MTg3CisjaWZkZWYgV01NX0hhbmdfODE4NworI3VuZGVmIFdNTV9IYW5nXzgxODcKKyNlbmRpZgorCisjZGVmaW5lIFdNRV9BQ19CRSAgIDB4MDAKKyNkZWZpbmUgV01FX0FDX0JLICAgMHgwMQorI2RlZmluZSBXTUVfQUNfVkkgICAweDAyCisjZGVmaW5lIFdNRV9BQ19WTyAgIDB4MDMKKyNkZWZpbmUgV01FX0FDSV9NQVNLIDB4MDMKKyNkZWZpbmUgV01FX0FJRlNOX01BU0sgMHgwMworI2RlZmluZSBXTUVfQUNfUFJBTV9MRU4gMTYKKworLy9VUCBNYXBwaW5nIHRvIEFDLCB1c2luZyBpbiBNZ250UXVlcnlfU2VxdWVuY2VOdW1iZXIoKSBhbmQgbWF5YmUgZm9yIERTQ1AKKy8vI2RlZmluZSBVUDJBQyh1cCkJKCh1cDwzKSA/ICgodXA9PTApPzE6MCkgOiAodXA+PjEpKQorI2RlZmluZSBVUDJBQyh1cCkgKAkJICAgXAorCSgodXApIDwgMSkgPyBXTUVfQUNfQkUgOiBcCisJKCh1cCkgPCAzKSA/IFdNRV9BQ19CSyA6IFwKKwkoKHVwKSA8IDQpID8gV01FX0FDX0JFIDogXAorCSgodXApIDwgNikgPyBXTUVfQUNfVkkgOiBcCisJV01FX0FDX1ZPKQorLy9BQyBNYXBwaW5nIHRvIFVQLCB1c2luZyBpbiBUeCBwYXJ0IGZvciBzZWxlY3RpbmcgdGhlIGNvcnJlc3BvbmRpbmcgVFggcXVldWUKKyNkZWZpbmUgQUMyVVAoX2FjKQkoICAgICAgIFwKKwkoKF9hYykgPT0gV01FX0FDX1ZPKSA/IDYgOiBcCisJKChfYWMpID09IFdNRV9BQ19WSSkgPyA1IDogXAorCSgoX2FjKSA9PSBXTUVfQUNfQkspID8gMSA6IFwKKwkwKQorCisjZGVmaW5lCUVUSEVSX0FERFJfTEVOCQk2CS8qIGxlbmd0aCBvZiBhbiBFdGhlcm5ldCBhZGRyZXNzICovCitzdHJ1Y3QJZXRoZXJfaGVhZGVyIHsKKwl1OCBldGhlcl9kaG9zdFtFVEhFUl9BRERSX0xFTl07CisJdTggZXRoZXJfc2hvc3RbRVRIRVJfQUREUl9MRU5dOworCXUxNiBldGhlcl90eXBlOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2lmbmRlZiBFVEhFUlRZUEVfUEFFCisjZGVmaW5lCUVUSEVSVFlQRV9QQUUJMHg4ODhlCQkvKiBFQVBPTCBQQUUvODAyLjF4ICovCisjZW5kaWYKKyNpZm5kZWYgRVRIRVJUWVBFX0lQCisjZGVmaW5lCUVUSEVSVFlQRV9JUAkweDA4MDAJCS8qIElQIHByb3RvY29sICovCisjZW5kaWYKKworc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrIHsKKwkvKiBUaGVzZSBlbnRyaWVzIGFyZSB1c2VkIHRvIGlkZW50aWZ5IGEgdW5pcXVlIG5ldHdvcmsgKi8KKwl1OCBic3NpZFtFVEhfQUxFTl07CisJdTggY2hhbm5lbDsKKwkvKiBFbnN1cmUgbnVsbC10ZXJtaW5hdGVkIGZvciBhbnkgZGVidWcgbXNncyAqLworCXU4IHNzaWRbSVdfRVNTSURfTUFYX1NJWkUgKyAxXTsKKwl1OCBzc2lkX2xlbjsKKworCS8qIFRoZXNlIGFyZSBuZXR3b3JrIHN0YXRpc3RpY3MgKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzIHN0YXRzOworCXUxNiBjYXBhYmlsaXR5OworCXU4IHJhdGVzW01BWF9SQVRFU19MRU5HVEhdOworCXU4IHJhdGVzX2xlbjsKKwl1OCByYXRlc19leFtNQVhfUkFURVNfRVhfTEVOR1RIXTsKKwl1OCByYXRlc19leF9sZW47CisJdW5zaWduZWQgbG9uZyBsYXN0X3NjYW5uZWQ7CisJdTggbW9kZTsKKwl1OCBmbGFnczsKKwl1MzIgbGFzdF9hc3NvY2lhdGU7CisJdTMyIHRpbWVfc3RhbXBbMl07CisJdTE2IGJlYWNvbl9pbnRlcnZhbDsKKwl1MTYgbGlzdGVuX2ludGVydmFsOworCXUxNiBhdGltX3dpbmRvdzsKKwl1OCB3cGFfaWVbTUFYX1dQQV9JRV9MRU5dOworCXNpemVfdCB3cGFfaWVfbGVuOworCXU4IHJzbl9pZVtNQVhfV1BBX0lFX0xFTl07CisJc2l6ZV90IHJzbl9pZV9sZW47CisJdTggZHRpbV9wZXJpb2Q7CisJdTggZHRpbV9kYXRhOworCXUzMiBsYXN0X2R0aW1fc3RhX3RpbWVbMl07CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCS8vYXBwZWRlZCBmb3IgUW9TCisJdTggd21tX2luZm87CisJc3RydWN0IGllZWU4MDIxMV93bW1fYWNfcGFyYW0gd21tX3BhcmFtWzRdOworCXU4IFFvU19FbmFibGU7CisJdTggU2lnbmFsU3RyZW5ndGg7CisvL2J5IGFteSAwODAzMTIKKwl1OCBIaWdoZXN0T3BlcmFSYXRlOworLy9ieSBhbXkgMDgwMzEyCisjaWZkZWYgVEhPTUFTX1RVUkJPCisJdTggVHVyYm9fRW5hYmxlOy8vZW5hYmxlIHR1cmJvIG1vZGUsIGFkZGVkIGJ5IHRob21hcworI2VuZGlmCisjaWZkZWYgRU5BQkxFX0RPVDExRAorCXUxNiBDb3VudHJ5SWVMZW47CisJdTggQ291bnRyeUllQnVmW01BWF9JRV9MRU5dOworI2VuZGlmCit9OworCitlbnVtIGllZWU4MDIxMV9zdGF0ZSB7CisKKwkvKiB0aGUgY2FyZCBpcyBub3QgbGlua2VkIGF0IGFsbCAqLworCUlFRUU4MDIxMV9OT0xJTksgPSAwLAorCisJLyogSUVFRTgwMjExX0FTU09DSUFUSU5HKiBhcmUgZm9yIEJTUyBjbGllbnQgbW9kZQorCSAqIHRoZSBkcml2ZXIgc2hhbGwgbm90IHBlcmZvcm0gUlggZmlsdGVyaW5nIHVubGVzcworCSAqIHRoZSBzdGF0ZSBpcyBMSU5LRUQuCisJICogVGhlIGRyaXZlciBzaGFsbCBqdXN0IGNoZWNrIGZvciB0aGUgc3RhdGUgTElOS0VEIGFuZAorCSAqIGRlZmF1bHRzIHRvIE5PTElOSyBmb3IgQUxMIHRoZSBvdGhlciBzdGF0ZXMgKGluY2x1ZGluZworCSAqIExJTktFRF9TQ0FOTklORykKKwkgKi8KKworCS8qIHRoZSBhc3NvY2lhdGlvbiBwcm9jZWR1cmUgd2lsbCBzdGFydCAod3Egc2NoZWR1bGluZykqLworCUlFRUU4MDIxMV9BU1NPQ0lBVElORywKKwlJRUVFODAyMTFfQVNTT0NJQVRJTkdfUkVUUlksCisKKwkvKiB0aGUgYXNzb2NpYXRpb24gcHJvY2VkdXJlIGlzIHNlbmRpbmcgQVVUSCByZXF1ZXN0Ki8KKwlJRUVFODAyMTFfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRJTkcsCisKKwkvKiB0aGUgYXNzb2NpYXRpb24gcHJvY2VkdXJlIGhhcyBzdWNjZXNzZnVsbHkgYXV0aGVudGNhdGVkCisJICogYW5kIGlzIHNlbmRpbmcgYXNzb2NpYXRpb24gcmVxdWVzdAorCSAqLworCUlFRUU4MDIxMV9BU1NPQ0lBVElOR19BVVRIRU5USUNBVEVELAorCisJLyogdGhlIGxpbmsgaXMgb2suIHRoZSBjYXJkIGFzc29jaWF0ZWQgdG8gYSBCU1Mgb3IgbGlua2VkCisJICogdG8gYSBpYnNzIGNlbGwgb3IgYWN0aW5nIGFzIGFuIEFQIGFuZCBjcmVhdGluZyB0aGUgYnNzCisJICovCisJSUVFRTgwMjExX0xJTktFRCwKKworCS8qIHNhbWUgYXMgTElOS0VELCBidXQgdGhlIGRyaXZlciBzaGFsbCBhcHBseSBSWCBmaWx0ZXIKKwkgKiBydWxlcyBhcyB3ZSBhcmUgaW4gTk9fTElOSyBtb2RlLiBBcyB0aGUgY2FyZCBpcyBzdGlsbAorCSAqIGxvZ2ljYWxseSBsaW5rZWQsIGJ1dCBpdCBpcyBkb2luZyBhIHN5bmNybyBzaXRlIHN1cnZleQorCSAqIHRoZW4gaXQgd2lsbCBiZSBiYWNrIHRvIExJTktFRCBzdGF0ZS4KKwkgKi8KKwlJRUVFODAyMTFfTElOS0VEX1NDQU5OSU5HLAorCit9OworCisjZGVmaW5lIERFRkFVTFRfTUFYX1NDQU5fQUdFICgxNSAqIEhaKQorI2RlZmluZSBERUZBVUxUX0ZUUyAyMzQ2CisjZGVmaW5lIE1BQ19GTVQgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IgorI2RlZmluZSBNQUNfQVJHKHgpICgodTgqKSh4KSlbMF0sKCh1OCopKHgpKVsxXSwoKHU4KikoeCkpWzJdLCgodTgqKSh4KSlbM10sKCh1OCopKHgpKVs0XSwoKHU4KikoeCkpWzVdCisKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPD0gS0VSTkVMX1ZFUlNJT04oMiw2LDExKSkKK2V4dGVybiBpbmxpbmUgaW50IGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGNvbnN0IHU4ICphZGRyKQoreworICAgICAgICByZXR1cm4gKChhZGRyWzBdICE9IDB4ZmYpICYmICgweDAxICYgYWRkclswXSkpOworfQorI2VuZGlmCisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDw9IEtFUk5FTF9WRVJTSU9OKDIsNiwxMykpCitleHRlcm4gaW5saW5lIGludCBpc19icm9hZGNhc3RfZXRoZXJfYWRkcihjb25zdCB1OCAqYWRkcikKK3sKKwlyZXR1cm4gKChhZGRyWzBdID09IDB4ZmYpICYmIChhZGRyWzFdID09IDB4ZmYpICYmIChhZGRyWzJdID09IDB4ZmYpICYmICAgXAorCQkoYWRkclszXSA9PSAweGZmKSAmJiAoYWRkcls0XSA9PSAweGZmKSAmJiAoYWRkcls1XSA9PSAweGZmKSk7Cit9CisjZW5kaWYKKworI2RlZmluZSBDRkdfSUVFRTgwMjExX1JFU0VSVkVfRkNTICgxPDwwKQorI2RlZmluZSBDRkdfSUVFRTgwMjExX0NPTVBVVEVfRkNTICgxPDwxKQorCit0eXBlZGVmIHN0cnVjdCB0eF9wZW5kaW5nX3R7CisJaW50IGZyYWc7CisJc3RydWN0IGllZWU4MDIxMV90eGIgKnR4YjsKK310eF9wZW5kaW5nX3Q7CisKKworc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgeworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwkvKiBCb29ra2VlcGluZyBzdHJ1Y3R1cmVzICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IGllZWU4MDIxMV9zdGF0cyBpZWVlX3N0YXRzOworCXN0cnVjdCBpZWVlODAyMTFfc29mdG1hY19zdGF0cyBzb2Z0bWFjX3N0YXRzOworCisJLyogUHJvYmUgLyBCZWFjb24gbWFuYWdlbWVudCAqLworCXN0cnVjdCBsaXN0X2hlYWQgbmV0d29ya19mcmVlX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBuZXR3b3JrX2xpc3Q7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrczsKKwlpbnQgc2NhbnM7CisJaW50IHNjYW5fYWdlOworCisJaW50IGl3X21vZGU7IC8qIG9wZXJhdGluZyBtb2RlIChJV19NT0RFXyopICovCisKKwlzcGlubG9ja190IGxvY2s7CisJc3BpbmxvY2tfdCB3cGF4X3N1aXRsaXN0X2xvY2s7CisKKwlpbnQgdHhfaGVhZHJvb207IC8qIFNldCB0byBzaXplIG9mIGFueSBhZGRpdGlvbmFsIHJvb20gbmVlZGVkIGF0IGZyb250CisJCQkgICogb2YgYWxsb2NhdGVkIFR4IFNLQnMgKi8KKwl1MzIgY29uZmlnOworCisJLyogV0VQIGFuZCBvdGhlciBlbmNyeXB0aW9uIHJlbGF0ZWQgc2V0dGluZ3MgYXQgdGhlIGRldmljZSBsZXZlbCAqLworCWludCBvcGVuX3dlcDsgLyogU2V0IHRvIDEgdG8gYWxsb3cgdW5lbmNyeXB0ZWQgZnJhbWVzICovCisKKwlpbnQgcmVzZXRfb25fa2V5Y2hhbmdlOyAvKiBTZXQgdG8gMSBpZiB0aGUgSFcgbmVlZHMgdG8gYmUgcmVzZXQgb24KKwkJCQkgKiBXRVAga2V5IGNoYW5nZXMgKi8KKworCS8qIElmIHRoZSBob3N0IHBlcmZvcm1zIHtlbixkZX1jcnlwdGlvbiwgdGhlbiBzZXQgdG8gMSAqLworCWludCBob3N0X2VuY3J5cHQ7CisJaW50IGhvc3RfZGVjcnlwdDsKKwlpbnQgaWVlZTgwMl8xeDsgLyogaXMgSUVFRSA4MDIuMVggdXNlZCAqLworCisJLyogV1BBIGRhdGEgKi8KKwlpbnQgd3BhX2VuYWJsZWQ7CisJaW50IGRyb3BfdW5lbmNyeXB0ZWQ7CisJaW50IHRraXBfY291bnRlcm1lYXN1cmVzOworCWludCBwcml2YWN5X2ludm9rZWQ7CisJc2l6ZV90IHdwYV9pZV9sZW47CisJdTggKndwYV9pZTsKKworCXU4IGFwX21hY19hZGRyWzZdOworCXUxNiBwYWlyd2lzZV9rZXlfdHlwZTsKKwl1MTYgYnJvYWRjYXN0X2tleV90eXBlOworCisJc3RydWN0IGxpc3RfaGVhZCBjcnlwdF9kZWluaXRfbGlzdDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0W1dFUF9LRVlTXTsKKwlpbnQgdHhfa2V5aWR4OyAvKiBkZWZhdWx0IFRYIGtleSBpbmRleCAoY3J5cHRbdHhfa2V5aWR4XSkgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBjcnlwdF9kZWluaXRfdGltZXI7CisKKwlpbnQgYmNyeF9zdGFfa2V5OyAvKiB1c2UgaW5kaXZpZHVhbCBrZXlzIHRvIG92ZXJyaWRlIGRlZmF1bHQga2V5cyBldmVuCisJCQkgICAqIHdpdGggUlggb2YgYnJvYWQvbXVsdGljYXN0IGZyYW1lcyAqLworCisJLyogRnJhZ21lbnRhdGlvbiBzdHJ1Y3R1cmVzICovCisJLy8gZWFjaCBzdHJlYW1pbmcgY29udGFpbiBhIGVudHJ5CisJc3RydWN0IGllZWU4MDIxMV9mcmFnX2VudHJ5IGZyYWdfY2FjaGVbMTddW0lFRUU4MDIxMV9GUkFHX0NBQ0hFX0xFTl07CisJdW5zaWduZWQgaW50IGZyYWdfbmV4dF9pZHhbMTddOworCXUxNiBmdHM7IC8qIEZyYWdtZW50YXRpb24gVGhyZXNob2xkICovCisKKwkvKiBUaGlzIHN0b3JlcyBpbmZvcyBmb3IgdGhlIGN1cnJlbnQgbmV0d29yay4KKwkgKiBFaXRoZXIgdGhlIG5ldHdvcmsgd2UgYXJlIGFzc29jaWF0ZWQgaW4gSU5GUkFTVFJVQ1RVUkUKKwkgKiBvciB0aGUgbmV0d29yayB0aGF0IHdlIGFyZSBjcmVhdGluZyBpbiBNQVNURVIgbW9kZS4KKwkgKiBhZC1ob2MgaXMgYSBtaXh0dXJlIDstKS4KKwkgKiBOb3RlIHRoYXQgaW4gaW5mcmFzdHJ1Y3R1cmUgbW9kZSwgZXZlbiB3aGVuIG5vdCBhc3NvY2lhdGVkLAorCSAqIGZpZWxkcyBic3NpZCBhbmQgZXNzaWQgbWF5IGJlIHZhbGlkIChpZiB3cGFfc2V0IGFuZCBlc3NpZF9zZXQKKwkgKiBhcmUgdHJ1ZSkgYXMgdGh5IGNhcnJ5IHRoZSB2YWx1ZSBzZXQgYnkgdGhlIHVzZXIgdmlhIGl3Y29uZmlnCisJICovCisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrIGN1cnJlbnRfbmV0d29yazsKKworCisJZW51bSBpZWVlODAyMTFfc3RhdGUgc3RhdGU7CisKKwlpbnQgc2hvcnRfc2xvdDsKKwlpbnQgbW9kZTsgICAgICAgLyogQSwgQiwgRyAqLworCWludCBtb2R1bGF0aW9uOyAvKiBDQ0ssIE9GRE0gKi8KKwlpbnQgZnJlcV9iYW5kOyAgLyogMi40R2h6LCA1LjJHaHosIE1peGVkICovCisJaW50IGFiZ190cnVlOyAgIC8qIEFCRyBmbGFnICAgICAgICAgICAgICAqLworCisJLyogdXNlZCBmb3IgZm9yY2luZyB0aGUgaWJzcyB3b3JrcXVldWUgdG8gdGVybWluYXRlCisJICogd2l0aG91dCB3YWl0IGZvciB0aGUgc3luY3JvIHNjYW4gdG8gdGVybWluYXRlCisJICovCisJc2hvcnQgc3luY19zY2FuX2h1cnJ5dXA7CisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJdm9pZCAqIHBEb3QxMWRJbmZvOworCWJvb2wgYkdsb2JhbERvbWFpbjsKKworCS8vIEZvciBMaXRlb24gQ2gxMn4xMyBwYXNzaXZlIHNjYW4KKwl1OAlNaW5QYXNzaXZlQ2hubE51bTsKKwl1OAlJYnNzU3RhcnRDaG5sOworI2Vsc2UKKwkvKiBtYXAgb2YgYWxsb3dlZCBjaGFubmVscy4gMCBpcyBkdW1teSAqLworCS8vIEZJWE1FOiByZW1lYmVyIHRvIGRlZmF1bHQgdG8gYSBiYXNpYyBjaGFubmVsIHBsYW4gZGVwZW5kaW5nIG9mIHRoZSBQSFkgdHlwZQorCWludCBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07CisjZW5kaWYKKworCWludCByYXRlOyAgICAgICAvKiBjdXJyZW50IHJhdGUgKi8KKwlpbnQgYmFzaWNfcmF0ZTsKKwkvL0ZJWE1FOiBwbGVhY2UgY2FsbGJhY2ssIHNlZSBpZiByZWR1bmRhbnQgd2l0aCBzb2Z0bWFjX2ZlYXR1cmVzCisJc2hvcnQgYWN0aXZlX3NjYW47CisKKwkvKiB0aGlzIGNvbnRhaW5zIGZsYWdzIGZvciBzZWxlY3RpdmVseSBlbmFibGUgc29mdG1hYyBzdXBwb3J0ICovCisJdTE2IHNvZnRtYWNfZmVhdHVyZXM7CisKKwkvKiBpZiB0aGUgc2VxdWVuY2UgY29udHJvbCBmaWVsZCBpcyBub3QgZmlsbGVkIGJ5IEhXICovCisJdTE2IHNlcV9jdHJsWzVdOworCisJLyogYXNzb2NpYXRpb24gcHJvY2VkdXJlIHRyYW5zYWN0aW9uIHNlcXVlbmNlIG51bWJlciAqLworCXUxNiBhc3NvY2lhdGVfc2VxOworCisJLyogQUlEIGZvciBSVFhlZCBhc3NvY2lhdGlvbiByZXNwb25zZXMgKi8KKwl1MTYgYXNzb2NfaWQ7CisKKwkvKiBwb3dlciBzYXZlIG1vZGUgcmVsYXRlZCovCisJc2hvcnQgcHM7CisJc2hvcnQgc3RhX3NsZWVwOworCWludCBwc190aW1lb3V0OworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBwc190YXNrOworCXUzMiBwc190aDsKKwl1MzIgcHNfdGw7CisKKwlzaG9ydCByYXdfdHg7CisJLyogdXNlZCBpZiBJRUVFX1NPRlRNQUNfVFhfUVVFVUUgaXMgc2V0ICovCisJc2hvcnQgcXVldWVfc3RvcDsKKwlzaG9ydCBzY2FubmluZzsKKwlzaG9ydCBwcm90b19zdGFydGVkOworCisJc3RydWN0IHNlbWFwaG9yZSB3eF9zZW07CisJc3RydWN0IHNlbWFwaG9yZSBzY2FuX3NlbTsKKworCXNwaW5sb2NrX3QgbWdtdF90eF9sb2NrOworCXNwaW5sb2NrX3QgYmVhY29uX2xvY2s7CisKKwlzaG9ydCBiZWFjb25fdHhpbmc7CisKKwlzaG9ydCB3YXBfc2V0OworCXNob3J0IHNzaWRfc2V0OworCisJdTggIHdwYXhfdHlwZV9zZXQ7ICAgIC8ve2FkZGVkIGJ5IERhdmlkLCAyMDA2LjkuMjh9CisJdTMyIHdwYXhfdHlwZV9ub3RpZnk7IC8ve2FkZGVkIGJ5IERhdmlkLCAyMDA2LjkuMjZ9CisKKwkvKiBRb1MgcmVsYXRlZCBmbGFnICovCisJY2hhciBpbml0X3dtbXBhcmFtX2ZsYWc7CisKKwkvKiBmb3IgZGlzY2FyZGluZyBkdXBsaWNhdGVkIHBhY2tldHMgaW4gSUJTUyAqLworCXN0cnVjdCBsaXN0X2hlYWQgaWJzc19tYWNfaGFzaFtJRUVFX0lCU1NfTUFDX0hBU0hfU0laRV07CisKKwkvKiBmb3IgZGlzY2FyZGluZyBkdXBsaWNhdGVkIHBhY2tldHMgaW4gQlNTICovCisJdTE2IGxhc3RfcnhzZXFfbnVtWzE3XTsgLyogcnggc2VxIHByZXZpb3VzIHBlci10aWQgKi8KKwl1MTYgbGFzdF9yeGZyYWdfbnVtWzE3XTsvKiB0eCBmcmFnIHByZXZpb3VzIHBlci10aWQgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfcGFja2V0X3RpbWVbMTddOworCisJLyogZm9yIFBTIG1vZGUgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfcnhfcHNfdGltZTsKKworCS8qIHVzZWQgaWYgSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRSBpcyBzZXQgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqbWdtdF9xdWV1ZV9yaW5nW01HTVRfUVVFVUVfTlVNXTsKKwlpbnQgbWdtdF9xdWV1ZV9oZWFkOworCWludCBtZ210X3F1ZXVlX3RhaWw7CisKKworCS8qIHVzZWQgaWYgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFIGlzIHNldCAqLworCXN0cnVjdCAgdHhfcGVuZGluZ190IHR4X3BlbmRpbmc7CisKKwkvKiB1c2VkIGlmIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUgaXMgc2V0ICovCisJc3RydWN0IHRpbWVyX2xpc3QgYXNzb2NpYXRlX3RpbWVyOworCisJLyogdXNlZCBpZiBJRUVFX1NPRlRNQUNfQkVBQ09OUyBpcyBzZXQgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBiZWFjb25fdGltZXI7CisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgYXNzb2NpYXRlX2NvbXBsZXRlX3dxOworLy8Jc3RydWN0IHdvcmtfc3RydWN0IGFzc29jaWF0ZV9yZXRyeV93cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgYXNzb2NpYXRlX3Byb2NlZHVyZV93cTsKKy8vCXN0cnVjdCB3b3JrX3N0cnVjdCBzb2Z0bWFjX3NjYW5fd3E7CisJc3RydWN0IHdvcmtfc3RydWN0IHd4X3N5bmNfc2Nhbl93cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd21tX3BhcmFtX3VwZGF0ZV93cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcHNfcmVxdWVzdF90eF9hY2tfd3E7Ly9mb3IgcHMKKy8vCXN0cnVjdCB3b3JrX3N0cnVjdCBod193YWtldXBfd3E7CisvLwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgaHdfc2xlZXBfd3E7CisvLwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd2F0Y2hfZG9nX3dxOworCWJvb2wgYkluYWN0aXZlUHM7CisJYm9vbCBhY3RzY2FubmluZzsKKwlib29sIGJlaW5yZXRyeTsKKwl1MTYgTGlzdGVuSW50ZXJ2YWw7CisJdW5zaWduZWQgbG9uZyBOdW1SeERhdGFJblBlcmlvZDsgLy9ZSixhZGQsMDgwODI4CisJdW5zaWduZWQgbG9uZyBOdW1SeEJjbkluUGVyaW9kOyAgLy9ZSixhZGQsMDgwODI4CisJdW5zaWduZWQgbG9uZyBOdW1SeE9rVG90YWw7CisJdW5zaWduZWQgbG9uZyBOdW1SeFVuaWNhc3Q7Ly9ZSixhZGQsMDgwODI4LGZvciBrZWVwIGFsaXZlCisJYm9vbCBiSHdSYWRpb09mZjsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorICAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrIHNvZnRtYWNfc2Nhbl93cTsKKyAgICAgICAgc3RydWN0IGRlbGF5ZWRfd29yayBhc3NvY2lhdGVfcmV0cnlfd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayBod193YWtldXBfd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayBod19zbGVlcF93cTsvLytieSBhbXkgMDgwMzI0CisJc3RydWN0IGRlbGF5ZWRfd29yayB3YXRjaF9kb2dfd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayBzd19hbnRlbm5hX3dxOworCXN0cnVjdCBkZWxheWVkX3dvcmsgIHN0YXJ0X2lic3Nfd3E7CisvL2J5IGFteSBmb3IgcmF0ZSBhZGFwdGl2ZSAwODAzMTIKKyAgICBzdHJ1Y3QgZGVsYXllZF93b3JrIHJhdGVfYWRhcHRlcl93cTsKKy8vYnkgYW15IGZvciByYXRlIGFkYXB0aXZlCisJc3RydWN0IGRlbGF5ZWRfd29yayBod19kaWdfd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayB0eF9wd193cTsKKworLy9BZGRlZCBmb3IgUkYgcG93ZXIgb24gcG93ZXIgb2ZmIGJ5IGxpemhhb21pbmcgMDgwNTEyCisJc3RydWN0IGRlbGF5ZWRfd29yayBHUElPQ2hhbmdlUkZXb3JrSXRlbTsKKyNlbHNlCisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc3RhcnRfaWJzc193cTsKKyAgICAgICAgc3RydWN0IHdvcmtfc3RydWN0IHNvZnRtYWNfc2Nhbl93cTsKKyAgICAgICAgc3RydWN0IHdvcmtfc3RydWN0IGFzc29jaWF0ZV9yZXRyeV93cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgaHdfd2FrZXVwX3dxOworCXN0cnVjdCB3b3JrX3N0cnVjdCBod19zbGVlcF93cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd2F0Y2hfZG9nX3dxOworCXN0cnVjdCB3b3JrX3N0cnVjdCBzd19hbnRlbm5hX3dxOworLy9ieSBhbXkgZm9yIHJhdGUgYWRhcHRpdmUgMDgwMzEyCisgICAgc3RydWN0IHdvcmtfc3RydWN0IHJhdGVfYWRhcHRlcl93cTsKKy8vYnkgYW15IGZvciByYXRlIGFkYXB0aXZlCisJc3RydWN0IHdvcmtfc3RydWN0IGh3X2RpZ193cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdHhfcHdfd3E7CisKKy8vQWRkZWQgZm9yIFJGIHBvd2VyIG9uIHBvd2VyIG9mZiBieSBsaXpoYW9taW5nIDA4MDUxMgorCXN0cnVjdCB3b3JrX3N0cnVjdCBHUElPQ2hhbmdlUkZXb3JrSXRlbTsKKyNlbmRpZgorCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTsKKworCS8qIENhbGxiYWNrIGZ1bmN0aW9ucyAqLworCXZvaWQgKCpzZXRfc2VjdXJpdHkpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfc2VjdXJpdHkgKnNlYyk7CisKKwkvKiBVc2VkIHRvIFRYIGRhdGEgZnJhbWUgYnkgdXNpbmcgdHhiIHN0cnVjdHMuCisJICogdGhpcyBpcyBub3QgdXNlZCBpZiBpbiB0aGUgc29mdG1hY19mZWF0dXJlcworCSAqIGlzIHNldCB0aGUgZmxhZyBJRUVFX1NPRlRNQUNfVFhfUVVFVUUKKwkgKi8KKwlpbnQgKCpoYXJkX3N0YXJ0X3htaXQpKHN0cnVjdCBpZWVlODAyMTFfdHhiICp0eGIsCisJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwlpbnQgKCpyZXNldF9wb3J0KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCS8qIFNvZnRtYWMtZ2VuZXJhdGVkIGZyYW1lcyAobWFtYWdlbWVudCkgYXJlIFRYZWQgdmlhIHRoaXMKKwkgKiBjYWxsYmFjayBpZiB0aGUgZmxhZyBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFIGlzCisJICogbm90IHNldC4gQXMgc29tZSBjYXJkcyBtYXkgaGF2ZSBkaWZmZXJlbnQgSFcgcXVldWVzIHRoYXQKKwkgKiBvbmUgbWlnaHQgd2FudCB0byB1c2UgZm9yIGRhdGEgYW5kIG1hbmFnZW1lbnQgZnJhbWVzCisJICogdGhlIG9wdGlvbiB0byBoYXZlIHR3byBjYWxsYmFja3MgbWlnaHQgYmUgdXNlZnVsLgorCSAqIFRoaXMgZnVjbnRpb24gY2FuJ3Qgc2xlZXAuCisJICovCisJaW50ICgqc29mdG1hY19oYXJkX3N0YXJ0X3htaXQpKHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwkvKiB1c2VkIGluc3RlYWQgb2YgaGFyZF9zdGFydF94bWl0IChub3Qgc29mdG1hY19oYXJkX3N0YXJ0X3htaXQpCisJICogaWYgdGhlIElFRUVfU09GVE1BQ19UWF9RVUVVRSBmZWF0dXJlIGlzIHVzZWQgdG8gVFggZGF0YQorCSAqIGZyYW1lcy4gSSB0aGUgb3B0aW9uIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUUgaXMgYWxzbyBzZXQKKwkgKiB0aGVuIGFsc28gbWFuYWdlbWVudCBmcmFtZXMgYXJlIHNlbnQgdmlhIHRoaXMgY2FsbGJhY2suCisJICogVGhpcyBmdW5jdGlvbiBjYW4ndCBzbGVlcC4KKwkgKi8KKwl2b2lkICgqc29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdCkoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LGludCByYXRlKTsKKworCS8qIHN0b3BzIHRoZSBIVyBxdWV1ZSBmb3IgREFUQSBmcmFtZXMuIFVzZWZ1bCB0byBhdm9pZAorCSAqIHdhc3RlIHRpbWUgdG8gVFggZGF0YSBmcmFtZSB3aGVuIHdlIGFyZSByZWFzc29jaWF0aW5nCisJICogVGhpcyBmdW5jdGlvbiBjYW4gc2xlZXAuCisJICovCisJdm9pZCAoKmRhdGFfaGFyZF9zdG9wKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCS8qIE9LIHRoaXMgaXMgY29tcGxlbWVudGFyIHRvIGRhdGFfcG9sbF9oYXJkX3N0b3AgKi8KKwl2b2lkICgqZGF0YV9oYXJkX3Jlc3VtZSkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwkvKiBhc2sgdG8gdGhlIGRyaXZlciB0byByZXR1bmUgdGhlIHJhZGlvIC4KKwkgKiBUaGlzIGZ1bmN0aW9uIGNhbiBzbGVlcC4gdGhlIGRyaXZlciBzaG91bGQgZW5zdXJlCisJICogdGhlIHJhZGlvIGhhcyBiZWVuIHN3aXRoY2VkIGJlZm9yZSByZXR1cm4uCisJICovCisJdm9pZCAoKnNldF9jaGFuKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHNob3J0IGNoKTsKKworCS8qIFRoZXNlIGFyZSBub3QgdXNlZCBpZiB0aGUgaWVlZSBzdGFjayB0YWtlcyBjYXJlIG9mCisJICogc2Nhbm5pbmcgKElFRUVfU09GVE1BQ19TQ0FOIGZlYXR1cmUgc2V0KS4KKwkgKiBJbiB0aGlzIGNhc2Ugb25seSB0aGUgc2V0X2NoYW4gaXMgdXNlZC4KKwkgKgorCSAqIFRoZSBzeW5jcm8gdmVyc2lvbiBpcyBzaW1pbGFyIHRvIHRoZSBzdGFydF9zY2FuIGJ1dAorCSAqIGRvZXMgbm90IHJldHVybiB1bnRpbCBhbGwgY2hhbm5lbHMgaGFzIGJlZW4gc2Nhbm5lZC4KKwkgKiB0aGlzIGlzIGNhbGxlZCBpbiB1c2VyIGNvbnRleHQgYW5kIHNob3VsZCBzbGVlcCwKKwkgKiBpdCBpcyBjYWxsZWQgaW4gYSB3b3JrX3F1ZXVlIHdoZW4gc3dpdGhjaW5nIHRvIGFkLWhvYyBtb2RlCisJICogb3IgaW4gYmVoYWxmIG9mIGl3bGlzdCBzY2FuIHdoZW4gdGhlIGNhcmQgaXMgYXNzb2NpYXRlZAorCSAqIGFuZCByb290IHVzZXIgYXNrIGZvciBhIHNjYW4uCisJICogdGhlIGZ1Y250aW9uIHN0b3Bfc2NhbiBzaG91bGQgc3RvcCBib3RoIHRoZSBzeW5jcm8gYW5kCisJICogYmFja2dyb3VuZCBzY2FubmluZyBhbmQgY2FuIHNsZWVwLgorCSAqIFRoZSBmdWNudGlvbiBzdGFydF9zY2FuIHNob3VsZCBpbml0aWF0ZSB0aGUgYmFja2dyb3VuZAorCSAqIHNjYW5uaW5nIGFuZCBjYW4ndCBzbGVlcC4KKwkgKi8KKwl2b2lkICgqc2Nhbl9zeW5jcm8pKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCpzdGFydF9zY2FuKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqc3RvcF9zY2FuKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCS8qIGluZGljYXRlIHRoZSBkcml2ZXIgdGhhdCB0aGUgbGluayBzdGF0ZSBpcyBjaGFuZ2VkCisJICogZm9yIGV4YW1wbGUgaXQgbWF5IGluZGljYXRlIHRoZSBjYXJkIGlzIGFzc29jaWF0ZWQgbm93LgorCSAqIERyaXZlciBtaWdodCBiZSBpbnRlcmVzdGVkIGluIHRoaXMgdG8gYXBwbHkgUlggZmlsdGVyCisJICogcnVsZXMgb3Igc2ltcGx5IGxpZ2h0IHRoZSBMSU5LIGxlZAorCSAqLworCXZvaWQgKCpsaW5rX2NoYW5nZSkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwkvKiB0aGVzZSB0d28gZnVuY3Rpb24gaW5kaWNhdGVzIHRvIHRoZSBIVyB3aGVuIHRvIHN0YXJ0CisJICogYW5kIHN0b3AgdG8gc2VuZCBiZWFjb25zLiBUaGlzIGlzIHVzZWQgd2hlbiB0aGUKKwkgKiBJRUVFX1NPRlRNQUNfQkVBQ09OUyBpcyBub3Qgc2V0LiBGb3Igbm93IHRoZQorCSAqIHN0b3Bfc2VuZF9iYWNvbnMgaXMgTk9UIGd1YXJhbnRlZWQgdG8gYmUgY2FsbGVkIG9ubHkKKwkgKiBhZnRlciBzdGFydF9zZW5kX2JlYWNvbnMuCisJICovCisJdm9pZCAoKnN0YXJ0X3NlbmRfYmVhY29ucykgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCpzdG9wX3NlbmRfYmVhY29ucykgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJLyogcG93ZXIgc2F2ZSBtb2RlIHJlbGF0ZWQgKi8KKwl2b2lkICgqc3RhX3dha2VfdXApIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqcHNfcmVxdWVzdF90eF9hY2spIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqZW50ZXJfc2xlZXBfc3RhdGUpIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgdGgsIHUzMiB0bCk7CisJc2hvcnQgKCpwc19pc19xdWV1ZV9lbXB0eSkgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJLyogUW9TIHJlbGF0ZWQgKi8KKwkvL3ZvaWQgKCp3bW1fcGFyYW1fdXBkYXRlKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggKmFjX3BhcmFtKTsKKwkvL3ZvaWQgKCp3bW1fcGFyYW1fdXBkYXRlKSAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworCisJLyogVGhpcyBtdXN0IGJlIHRoZSBsYXN0IGl0ZW0gc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGRhdGEKKwkgKiBhbGxvY2F0ZWQgYmV5b25kIHRoaXMgc3RydWN0dXJlIGJ5IGFsbG9jX2llZWU4MDIxMSAqLworCXU4IHByaXZbMF07Cit9OworCisjZGVmaW5lIElFRUVfQSAgICAgICAgICAgICgxPDwwKQorI2RlZmluZSBJRUVFX0IgICAgICAgICAgICAoMTw8MSkKKyNkZWZpbmUgSUVFRV9HICAgICAgICAgICAgKDE8PDIpCisjZGVmaW5lIElFRUVfTU9ERV9NQVNLICAgIChJRUVFX0F8SUVFRV9CfElFRUVfRykKKworLyogR2VuZXJhdGUgYSA4MDIuMTEgaGVhZGVyICovCisKKy8qIFVzZXMgdGhlIGNoYW5uZWwgY2hhbmdlIGNhbGxiYWNrIGRpcmVjdGx5CisgKiBpbnN0ZWFkIG9mIFtzdGFydC9zdG9wXSBzY2FuIGNhbGxiYWNrcworICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19TQ0FOICgxPDwyKQorCisvKiBQZXJmb3JtIGF1dGhlbnRpY2F0aW9uIGFuZCBhc3NvY2lhdGlvbiBoYW5kc2hha2UgKi8KKyNkZWZpbmUgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSAoMTw8MykKKworLyogR2VuZXJhdGUgcHJvYmUgcmVxdWVzdHMgKi8KKyNkZWZpbmUgSUVFRV9TT0ZUTUFDX1BST0JFUlEgKDE8PDQpCisKKy8qIEdlbmVyYXRlIHJlc3BvbmVzIHRvIHByb2JlIHJlcXVlc3RzICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19QUk9CRVJTICgxPDw1KQorCisvKiBUaGUgaWVlZTgwMi4xMSBzdGFjayB3aWxsIG1hbmFnZXMgdGhlIG5ldGlmIHF1ZXVlCisgKiB3YWtlL3N0b3AgZm9yIHRoZSBkcml2ZXIsIHRha2luZyBjYXJlIG9mIDgwMi4xMQorICogZnJhZ21lbnRhdGlvbi4gU2VlIHNvZnRtYWMuYyBmb3IgZGV0YWlscy4gKi8KKyNkZWZpbmUgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFICgxPDw3KQorCisvKiBVc2VzIG9ubHkgdGhlIHNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQKKyAqIGV2ZW4gZm9yIFRYIG1hbmFnZW1lbnQgZnJhbWVzLgorICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUUgKDE8PDgpCisKKy8qIEdlbmVyYXRlIGJlYWNvbnMuICBUaGUgc3RhY2sgd2lsbCBlbnF1ZXVlIGJlYWNvbnMKKyAqIHRvIHRoZSBjYXJkCisgKi8KKyNkZWZpbmUgSUVFRV9TT0ZUTUFDX0JFQUNPTlMgKDE8PDYpCisKKworCitzdGF0aWMgaW5saW5lIHZvaWQgKmllZWU4MDIxMV9wcml2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuICgoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiluZXRkZXZfcHJpdihkZXYpKS0+cHJpdjsKK30KKworZXh0ZXJuIGlubGluZSBpbnQgaWVlZTgwMjExX2lzX2VtcHR5X2Vzc2lkKGNvbnN0IGNoYXIgKmVzc2lkLCBpbnQgZXNzaWRfbGVuKQoreworCS8qIFNpbmdsZSB3aGl0ZSBzcGFjZSBpcyBmb3IgTGlua3N5cyBBUHMgKi8KKwlpZiAoZXNzaWRfbGVuID09IDEgJiYgZXNzaWRbMF0gPT0gJyAnKQorCQlyZXR1cm4gMTsKKworCS8qIE90aGVyd2lzZSwgaWYgdGhlIGVudGlyZSBlc3NpZCBpcyAwLCB3ZSBhc3N1bWUgaXQgaXMgaGlkZGVuICovCisJd2hpbGUgKGVzc2lkX2xlbikgeworCQllc3NpZF9sZW4tLTsKKwkJaWYgKGVzc2lkW2Vzc2lkX2xlbl0gIT0gJ1wwJykKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitleHRlcm4gaW5saW5lIGludCBpZWVlODAyMTFfaXNfdmFsaWRfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgaW50IG1vZGUpCit7CisJLyoKKwkgKiBJdCBpcyBwb3NzaWJsZSBmb3IgYm90aCBhY2Nlc3MgcG9pbnRzIGFuZCBvdXIgZGV2aWNlIHRvIHN1cHBvcnQKKwkgKiBjb21iaW5hdGlvbnMgb2YgbW9kZXMsIHNvIGFzIGxvbmcgYXMgdGhlcmUgaXMgb25lIHZhbGlkIGNvbWJpbmF0aW9uCisJICogb2YgYXAvZGV2aWNlIHN1cHBvcnRlZCBtb2RlcywgdGhlbiByZXR1cm4gc3VjY2VzcworCSAqCisJICovCisJaWYgKChtb2RlICYgSUVFRV9BKSAmJgorCSAgICAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pICYmCisJICAgIChpZWVlLT5mcmVxX2JhbmQgJiBJRUVFODAyMTFfNTJHSFpfQkFORCkpCisJCXJldHVybiAxOworCisJaWYgKChtb2RlICYgSUVFRV9HKSAmJgorCSAgICAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pICYmCisJICAgIChpZWVlLT5mcmVxX2JhbmQgJiBJRUVFODAyMTFfMjRHSFpfQkFORCkpCisJCXJldHVybiAxOworCisJaWYgKChtb2RlICYgSUVFRV9CKSAmJgorCSAgICAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTikgJiYKKwkgICAgKGllZWUtPmZyZXFfYmFuZCAmIElFRUU4MDIxMV8yNEdIWl9CQU5EKSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworZXh0ZXJuIGlubGluZSBpbnQgaWVlZTgwMjExX2dldF9oZHJsZW4odTE2IGZjKQoreworCWludCBoZHJsZW4gPSAyNDsKKworCXN3aXRjaCAoV0xBTl9GQ19HRVRfVFlQRShmYykpIHsKKwljYXNlIElFRUU4MDIxMV9GVFlQRV9EQVRBOgorCQlpZiAoKGZjICYgSUVFRTgwMjExX0ZDVExfRlJPTURTKSAmJiAoZmMgJiBJRUVFODAyMTFfRkNUTF9UT0RTKSkKKwkJCWhkcmxlbiA9IDMwOyAvKiBBZGRyNCAqLworCQlpZihJRUVFODAyMTFfUU9TX0hBU19TRVEoZmMpKQorCQkJaGRybGVuICs9IDI7IC8qIFFPUyBjdHJsKi8KKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfRlRZUEVfQ1RMOgorCQlzd2l0Y2ggKFdMQU5fRkNfR0VUX1NUWVBFKGZjKSkgeworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9DVFM6CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0FDSzoKKwkJCWhkcmxlbiA9IDEwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQloZHJsZW4gPSAxNjsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKworCXJldHVybiBoZHJsZW47Cit9CisKKworCisvKiBpZWVlODAyMTEuYyAqLworZXh0ZXJuIHZvaWQgZnJlZV9pZWVlODAyMTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmFsbG9jX2llZWU4MDIxMShpbnQgc2l6ZW9mX3ByaXYpOworCitleHRlcm4gaW50IGllZWU4MDIxMV9zZXRfZW5jcnlwdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CisKKy8qIGllZWU4MDIxMV90eC5jICovCisKK2V4dGVybiBpbnQgaWVlZTgwMjExX2VuY3J5cHRfZnJhZ21lbnQoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJc3RydWN0IHNrX2J1ZmYgKmZyYWcsCisJaW50IGhkcl9sZW4pOworCitleHRlcm4gaW50IGllZWU4MDIxMV94bWl0KHN0cnVjdCBza19idWZmICpza2IsCisJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3R4Yl9mcmVlKHN0cnVjdCBpZWVlODAyMTFfdHhiICopOworCisKKy8qIGllZWU4MDIxMV9yeC5jICovCitleHRlcm4gaW50IGllZWU4MDIxMV9yeChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnJ4X3N0YXRzKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9yeF9tZ3Qoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZWFkZXIsCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnN0YXRzKTsKKworLyogaWVlZTgwMjExX3d4LmMgKi8KK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICprZXkpOworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X2VuY29kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleSk7CitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfZW5jb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5KTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9lbmNvZGVfZXh0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSogd3JxdSwgY2hhciAqZXh0cmEpOworaW50IGllZWU4MDIxMV93eF9zZXRfYXV0aChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19wYXJhbSAqZGF0YSwgY2hhciAqZXh0cmEpOworaW50IGllZWU4MDIxMV93eF9zZXRfbWxtZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworaW50IGllZWU4MDIxMV93eF9zZXRfZ2VuX2llKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqaWUsIHNpemVfdCBsZW4pOworLyogaWVlZTgwMjExX3NvZnRtYWMuYyAqLworZXh0ZXJuIHNob3J0IGllZWU4MDIxMV9pc181NGcoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrIG5ldCk7CitleHRlcm4gc2hvcnQgaWVlZTgwMjExX2lzX3Nob3J0c2xvdChzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgbmV0KTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX3J4X2ZyYW1lX3NvZnRtYWMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCisJCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cywgdTE2IHR5cGUsCisJCQl1MTYgc3R5cGUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfbmV3X25ldChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXQpOworCitleHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY194bWl0KHN0cnVjdCBpZWVlODAyMTFfdHhiICp0eGIsIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX2NoZWNrX2FsbF9uZXRzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdGFydF9ic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X21hc3Rlcl9ic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X2lic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY19mcmVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RvcF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdGFydF9zY2FuX3N5bmNybyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfY2hlY2tfYWxsX25ldHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdG9wX3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3N0YXJ0X3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2woc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3Jlc2V0X3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV93YWtlX3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdG9wX3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2dldF9iZWFjb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X3NlbmRfYmVhY29ucyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIGludCBpZWVlODAyMTFfd3BhX3N1cHBsaWNhbnRfaW9jdGwoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19wb2ludCAqcCk7CitleHRlcm4gdm9pZCBub3RpZnlfd3hfYXNzb2NfZXZlbnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3BzX3R4X2FjayhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc2hvcnQgc3VjY2Vzcyk7CitleHRlcm4gdm9pZCBTZW5kRGlzYXNzb2NpYXRpb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsdTgqIGFzU3RhLHU4IGFzUnNuKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdGFydF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKKworLy9BZGQgZm9yIFJGIHBvd2VyIG9uIHBvd2VyIG9mZiBieSBsaXpoYW9taW5nIDA4MDUxMgorZXh0ZXJuIHZvaWQgU2VuZERpc2Fzc29jaWF0aW9uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorICAgICAgIAkJCSB1OCogICAgICAgICAgICAgICAgICAgICBhc1N0YSwKKyAgICAgICAgCQkgdTggICAgICAgICAgICAgICAgICAgICAgYXNSc24pOworCisvKiBpZWVlODAyMTFfY3J5cHRfY2NtcCZ0a2lwJndlcC5jICovCitleHRlcm4gdm9pZCBpZWVlODAyMTFfdGtpcF9udWxsKHZvaWQpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3dlcF9udWxsKHZvaWQpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX2NjbXBfbnVsbCh2b2lkKTsKKy8qIGllZWU4MDIxMV9zb2Z0bWFjX3d4LmMgKi8KKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X3dhcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dCk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF93YXAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSB1bmlvbiBpd3JlcV9kYXRhICphd3JxLAorCQkJIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X2Vzc2lkKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLHVuaW9uIGl3cmVxX2RhdGEgKndycXUsY2hhciAqYik7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9yYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9yYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9tb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfZXNzaWQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYik7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9mcmVxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X2ZyZXEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpOworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKK2V4dGVybiB2b2lkIGllZWU4MDIxMV93eF9zeW5jX3NjYW5fd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKyNlbHNlCisgZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3d4X3N5bmNfc2Nhbl93cShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CisjZW5kaWYKKy8vZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3d4X3N5bmNfc2Nhbl93cShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9yYXd0eChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X25hbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X3Bvd2VyKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9wb3dlcihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitleHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY19pcHNfc2Nhbl9zeW5jcm8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworCitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RhX3BzX3NlbmRfbnVsbF9mcmFtZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc2hvcnQgcHdyKTsKKworZXh0ZXJuIGNvbnN0IGxvbmcgaWVlZTgwMjExX3dsYW5fZnJlcXVlbmNpZXNbXTsKKworZXh0ZXJuIGlubGluZSB2b2lkIGllZWU4MDIxMV9pbmNyZW1lbnRfc2NhbnMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWVlZS0+c2NhbnMrKzsKK30KKworZXh0ZXJuIGlubGluZSBpbnQgaWVlZTgwMjExX2dldF9zY2FucyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlyZXR1cm4gaWVlZS0+c2NhbnM7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqZXNjYXBlX2Vzc2lkKGNvbnN0IGNoYXIgKmVzc2lkLCB1OCBlc3NpZF9sZW4pIHsKKwlzdGF0aWMgY2hhciBlc2NhcGVkW0lXX0VTU0lEX01BWF9TSVpFICogMiArIDFdOworCWNvbnN0IGNoYXIgKnMgPSBlc3NpZDsKKwljaGFyICpkID0gZXNjYXBlZDsKKworCWlmIChpZWVlODAyMTFfaXNfZW1wdHlfZXNzaWQoZXNzaWQsIGVzc2lkX2xlbikpIHsKKwkJbWVtY3B5KGVzY2FwZWQsICI8aGlkZGVuPiIsIHNpemVvZigiPGhpZGRlbj4iKSk7CisJCXJldHVybiBlc2NhcGVkOworCX0KKworCWVzc2lkX2xlbiA9IG1pbihlc3NpZF9sZW4sICh1OClJV19FU1NJRF9NQVhfU0laRSk7CisJd2hpbGUgKGVzc2lkX2xlbi0tKSB7CisJCWlmICgqcyA9PSAnXDAnKSB7CisJCQkqZCsrID0gJ1xcJzsKKwkJCSpkKysgPSAnMCc7CisJCQlzKys7CisJCX0gZWxzZSB7CisJCQkqZCsrID0gKnMrKzsKKwkJfQorCX0KKwkqZCA9ICdcMCc7CisJcmV0dXJuIGVzY2FwZWQ7Cit9CisjZW5kaWYgLyogSUVFRTgwMjExX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY2NGNmYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdC5jCkBAIC0wLDAgKzEsMjY1IEBACisvKgorICogSG9zdCBBUCBjcnlwdG8gcm91dGluZXMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPgorICogUG9ydGlvbnMgQ29weXJpZ2h0IChDKSAyMDA0LCBJbnRlbCBDb3Jwb3JhdGlvbiA8amtldHJlbm9AbGludXguaW50ZWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisKKy8vI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREU8S0VSTkVMX1ZFUlNJT04oMiw2LDE4KSkKKyNpbmNsdWRlPGxpbnV4L2NvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJpZWVlODAyMTEuaCIKKworTU9EVUxFX0FVVEhPUigiSm91bmkgTWFsaW5lbiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJIb3N0QVAgY3J5cHRvIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzOworfTsKKworCitzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0byB7CisJc3RydWN0IGxpc3RfaGVhZCBhbGdzOworCXNwaW5sb2NrX3QgbG9jazsKK307CisKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0byAqaGNyeXB0OworCit2b2lkIGllZWU4MDIxMV9jcnlwdF9kZWluaXRfZW50cmllcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkJICAgaW50IGZvcmNlKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm47CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICplbnRyeTsKKworCWZvciAocHRyID0gaWVlZS0+Y3J5cHRfZGVpbml0X2xpc3QubmV4dCwgbiA9IHB0ci0+bmV4dDsKKwkgICAgIHB0ciAhPSAmaWVlZS0+Y3J5cHRfZGVpbml0X2xpc3Q7IHB0ciA9IG4sIG4gPSBwdHItPm5leHQpIHsKKwkJZW50cnkgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhLCBsaXN0KTsKKworCQlpZiAoYXRvbWljX3JlYWQoJmVudHJ5LT5yZWZjbnQpICE9IDAgJiYgIWZvcmNlKQorCQkJY29udGludWU7CisKKwkJbGlzdF9kZWwocHRyKTsKKworCQlpZiAoZW50cnktPm9wcykgeworCQkJZW50cnktPm9wcy0+ZGVpbml0KGVudHJ5LT5wcml2KTsKKwkJCW1vZHVsZV9wdXQoZW50cnktPm9wcy0+b3duZXIpOworCQl9CisJCWtmcmVlKGVudHJ5KTsKKwl9Cit9CisKK3ZvaWQgaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqKWRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisJaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9lbnRyaWVzKGllZWUsIDApOworCWlmICghbGlzdF9lbXB0eSgmaWVlZS0+Y3J5cHRfZGVpbml0X2xpc3QpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogZW50cmllcyByZW1haW5pbmcgaW4gZGVsYXllZCBjcnlwdCAiCisJCSAgICAgICAiZGVsZXRpb24gbGlzdFxuIiwgaWVlZS0+ZGV2LT5uYW1lKTsKKwkJaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFo7CisJCWFkZF90aW1lcigmaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCit9CisKK3ZvaWQgaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKipjcnlwdCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKnRtcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCpjcnlwdCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwl0bXAgPSAqY3J5cHQ7CisJKmNyeXB0ID0gTlVMTDsKKworCS8qIG11c3Qgbm90IHJ1biBvcHMtPmRlaW5pdCgpIHdoaWxlIHRoZXJlIG1heSBiZSBwZW5kaW5nIGVuY3J5cHQgb3IKKwkgKiBkZWNyeXB0IG9wZXJhdGlvbnMuIFVzZSBhIGxpc3Qgb2YgZGVsYXllZCBkZWluaXRzIHRvIGF2b2lkIG5lZWRpbmcKKwkgKiBsb2NraW5nLiAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZCgmdG1wLT5saXN0LCAmaWVlZS0+Y3J5cHRfZGVpbml0X2xpc3QpOworCWlmICghdGltZXJfcGVuZGluZygmaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyKSkgeworCQlpZWVlLT5jcnlwdF9kZWluaXRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKKwkJYWRkX3RpbWVyKCZpZWVlLT5jcnlwdF9kZWluaXRfdGltZXIpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7Cit9CisKK2ludCBpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wcyhzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgKm9wcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyAqYWxnOworCisJaWYgKGhjcnlwdCA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlhbGcgPSBrbWFsbG9jKHNpemVvZigqYWxnKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGFsZyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChhbGcsIDAsIHNpemVvZigqYWxnKSk7CisJYWxnLT5vcHMgPSBvcHM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaGNyeXB0LT5sb2NrLCBmbGFncyk7CisJbGlzdF9hZGQoJmFsZy0+bGlzdCwgJmhjcnlwdC0+YWxncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGNyeXB0LT5sb2NrLCBmbGFncyk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0OiByZWdpc3RlcmVkIGFsZ29yaXRobSAnJXMnXG4iLAorCSAgICAgICBvcHMtPm5hbWUpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyOworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyAqZGVsX2FsZyA9IE5VTEw7CisKKwlpZiAoaGNyeXB0ID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZoY3J5cHQtPmxvY2ssIGZsYWdzKTsKKwlmb3IgKHB0ciA9IGhjcnlwdC0+YWxncy5uZXh0OyBwdHIgIT0gJmhjcnlwdC0+YWxnczsgcHRyID0gcHRyLT5uZXh0KSB7CisJCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyAqYWxnID0KKwkJCShzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19hbGcgKikgcHRyOworCQlpZiAoYWxnLT5vcHMgPT0gb3BzKSB7CisJCQlsaXN0X2RlbCgmYWxnLT5saXN0KTsKKwkJCWRlbF9hbGcgPSBhbGc7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoY3J5cHQtPmxvY2ssIGZsYWdzKTsKKworCWlmIChkZWxfYWxnKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHQ6IHVucmVnaXN0ZXJlZCBhbGdvcml0aG0gIgorCQkgICAgICAgIiclcydcbiIsIG9wcy0+bmFtZSk7CisJCWtmcmVlKGRlbF9hbGcpOworCX0KKworCXJldHVybiBkZWxfYWxnID8gMCA6IC0xOworfQorCisKK3N0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqIGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhjb25zdCBjaGFyICpuYW1lKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyOworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyAqZm91bmRfYWxnID0gTlVMTDsKKworCWlmIChoY3J5cHQgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaGNyeXB0LT5sb2NrLCBmbGFncyk7CisJZm9yIChwdHIgPSBoY3J5cHQtPmFsZ3MubmV4dDsgcHRyICE9ICZoY3J5cHQtPmFsZ3M7IHB0ciA9IHB0ci0+bmV4dCkgeworCQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19hbGcgKmFsZyA9CisJCQkoc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fYWxnICopIHB0cjsKKwkJaWYgKHN0cmNtcChhbGctPm9wcy0+bmFtZSwgbmFtZSkgPT0gMCkgeworCQkJZm91bmRfYWxnID0gYWxnOworCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGNyeXB0LT5sb2NrLCBmbGFncyk7CisKKwlpZiAoZm91bmRfYWxnKQorCQlyZXR1cm4gZm91bmRfYWxnLT5vcHM7CisJZWxzZQorCQlyZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgdm9pZCAqIGllZWU4MDIxMV9jcnlwdF9udWxsX2luaXQoaW50IGtleWlkeCkgeyByZXR1cm4gKHZvaWQgKikgMTsgfQorc3RhdGljIHZvaWQgaWVlZTgwMjExX2NyeXB0X251bGxfZGVpbml0KHZvaWQgKnByaXYpIHt9CisKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgaWVlZTgwMjExX2NyeXB0X251bGwgPSB7CisJLm5hbWUJCQk9ICJOVUxMIiwKKwkuaW5pdAkJCT0gaWVlZTgwMjExX2NyeXB0X251bGxfaW5pdCwKKwkuZGVpbml0CQkJPSBpZWVlODAyMTFfY3J5cHRfbnVsbF9kZWluaXQsCisJLmVuY3J5cHRfbXBkdQkJPSBOVUxMLAorCS5kZWNyeXB0X21wZHUJCT0gTlVMTCwKKwkuZW5jcnlwdF9tc2R1CQk9IE5VTEwsCisJLmRlY3J5cHRfbXNkdQkJPSBOVUxMLAorCS5zZXRfa2V5CQk9IE5VTEwsCisJLmdldF9rZXkJCT0gTlVMTCwKKwkuZXh0cmFfcHJlZml4X2xlbgk9IDAsCisJLmV4dHJhX3Bvc3RmaXhfbGVuCT0gMCwKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorfTsKKworCitpbnQgaWVlZTgwMjExX2NyeXB0b19pbml0KHZvaWQpCit7CisJaW50IHJldCA9IC1FTk9NRU07CisKKwloY3J5cHQgPSBrbWFsbG9jKHNpemVvZigqaGNyeXB0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFoY3J5cHQpCisJCWdvdG8gb3V0OworCisJbWVtc2V0KGhjcnlwdCwgMCwgc2l6ZW9mKCpoY3J5cHQpKTsKKwlJTklUX0xJU1RfSEVBRCgmaGNyeXB0LT5hbGdzKTsKKwlzcGluX2xvY2tfaW5pdCgmaGNyeXB0LT5sb2NrKTsKKworCXJldCA9IGllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzKCZpZWVlODAyMTFfY3J5cHRfbnVsbCk7CisJaWYgKHJldCA8IDApIHsKKwkJa2ZyZWUoaGNyeXB0KTsKKwkJaGNyeXB0ID0gTlVMTDsKKwl9CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworCit2b2lkIGllZWU4MDIxMV9jcnlwdG9fZGVpbml0KHZvaWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbjsKKworCWlmIChoY3J5cHQgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJZm9yIChwdHIgPSBoY3J5cHQtPmFsZ3MubmV4dCwgbiA9IHB0ci0+bmV4dDsgcHRyICE9ICZoY3J5cHQtPmFsZ3M7CisJICAgICBwdHIgPSBuLCBuID0gcHRyLT5uZXh0KSB7CisJCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyAqYWxnID0KKwkJCShzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19hbGcgKikgcHRyOworCQlsaXN0X2RlbChwdHIpOworCQlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0OiB1bnJlZ2lzdGVyZWQgYWxnb3JpdGhtICIKKwkJICAgICAgICInJXMnIChkZWluaXQpXG4iLCBhbGctPm9wcy0+bmFtZSk7CisJCWtmcmVlKGFsZyk7CisJfQorCisJa2ZyZWUoaGNyeXB0KTsKK30KKworI2lmIDAKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9lbnRyaWVzKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9oYW5kbGVyKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KTsKKworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wcyk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV91bnJlZ2lzdGVyX2NyeXB0b19vcHMpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMpOworI2VuZGlmCisKKy8vbW9kdWxlX2luaXQoaWVlZTgwMjExX2NyeXB0b19pbml0KTsKKy8vbW9kdWxlX2V4aXQoaWVlZTgwMjExX2NyeXB0b19kZWluaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNThhM2JjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0LmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIE9yaWdpbmFsIGNvZGUgYmFzZWQgb24gSG9zdCBBUCAoc29mdHdhcmUgd2lyZWxlc3MgTEFOIGFjY2VzcyBwb2ludCkgZHJpdmVyCisgKiBmb3IgSW50ZXJzaWwgUHJpc20yLzIuNS8zLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAyLCBTU0ggQ29tbXVuaWNhdGlvbnMgU2VjdXJpdHkgQ29ycCBhbmQgSm91bmkgTWFsaW5lbgorICogPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+CisgKgorICogQWRhcHRpb24gdG8gYSBnZW5lcmljIElFRUUgODAyLjExIHN0YWNrIGJ5IEphbWVzIEtldHJlbm9zCisgKiA8amtldHJlbm9AbGludXguaW50ZWwuY29tPgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBTZWUgUkVBRE1FIGFuZCBDT1BZSU5HIGZvcgorICogbW9yZSBkZXRhaWxzLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIHRvIHRoZSBpZWVlODAyMTEgY3J5cHRvIG1vZHVsZS4KKyAqLworI2lmbmRlZiBJRUVFODAyMTFfQ1JZUFRfSAorI2RlZmluZSBJRUVFODAyMTFfQ1JZUFRfSAorCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKK3N0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyB7CisJY29uc3QgY2hhciAqbmFtZTsKKworCS8qIGluaXQgbmV3IGNyeXB0byBjb250ZXh0IChlLmcuLCBhbGxvY2F0ZSBwcml2YXRlIGRhdGEgc3BhY2UsCisJICogc2VsZWN0IElWLCBldGMuKTsgcmV0dXJucyBOVUxMIG9uIGZhaWx1cmUgb3IgcG9pbnRlciB0byBhbGxvY2F0ZWQKKwkgKiBwcml2YXRlIGRhdGEgb24gc3VjY2VzcyAqLworCXZvaWQgKiAoKmluaXQpKGludCBrZXlpZHgpOworCisJLyogZGVpbml0aWFsaXplIGNyeXB0byBjb250ZXh0IGFuZCBmcmVlIGFsbG9jYXRlZCBwcml2YXRlIGRhdGEgKi8KKwl2b2lkICgqZGVpbml0KSh2b2lkICpwcml2KTsKKworCS8qIGVuY3J5cHQvZGVjcnlwdCByZXR1cm4gPCAwIG9uIGVycm9yIG9yID49IDAgb24gc3VjY2Vzcy4gVGhlIHJldHVybgorCSAqIHZhbHVlIGZyb20gZGVjcnlwdF9tcGR1IGlzIHBhc3NlZCBhcyB0aGUga2V5aWR4IHZhbHVlIGZvcgorCSAqIGRlY3J5cHRfbXNkdS4gc2tiIG11c3QgaGF2ZSBlbm91Z2ggaGVhZCBhbmQgdGFpbCByb29tIGZvciB0aGUKKwkgKiBlbmNyeXB0aW9uOyBpZiBub3QsIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQ7IHRoZXNlIGZ1bmN0aW9ucyBhcmUKKwkgKiBjYWxsZWQgZm9yIGFsbCBNUERVcyAoaS5lLiwgZnJhZ21lbnRzKS4KKwkgKi8KKwlpbnQgKCplbmNyeXB0X21wZHUpKHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJfbGVuLCB2b2lkICpwcml2KTsKKwlpbnQgKCpkZWNyeXB0X21wZHUpKHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJfbGVuLCB2b2lkICpwcml2KTsKKworCS8qIFRoZXNlIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIGZvciBmdWxsIE1TRFVzLCBpLmUuIGZ1bGwgZnJhbWVzLgorCSAqIFRoZXNlIGNhbiBiZSBOVUxMIGlmIGZ1bGwgTVNEVSBvcGVyYXRpb25zIGFyZSBub3QgbmVlZGVkLiAqLworCWludCAoKmVuY3J5cHRfbXNkdSkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpOworCWludCAoKmRlY3J5cHRfbXNkdSkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGtleWlkeCwgaW50IGhkcl9sZW4sCisJCQkgICAgdm9pZCAqcHJpdik7CisKKwlpbnQgKCpzZXRfa2V5KSh2b2lkICprZXksIGludCBsZW4sIHU4ICpzZXEsIHZvaWQgKnByaXYpOworCWludCAoKmdldF9rZXkpKHZvaWQgKmtleSwgaW50IGxlbiwgdTggKnNlcSwgdm9pZCAqcHJpdik7CisKKwkvKiBwcm9jZnMgaGFuZGxlciBmb3IgcHJpbnRpbmcgb3V0IGtleSBpbmZvcm1hdGlvbiBhbmQgcG9zc2libGUKKwkgKiBzdGF0aXN0aWNzICovCisJY2hhciAqICgqcHJpbnRfc3RhdHMpKGNoYXIgKnAsIHZvaWQgKnByaXYpOworCisJLyogbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgYWRkZWQgYnkgZW5jcnlwdGlvbjsgZW5jcnlwdCBidWYgaXMKKwkgKiBhbGxvY2F0ZWQgd2l0aCBleHRyYV9wcmVmaXhfbGVuIGJ5dGVzLCBjb3B5IG9mIGluX2J1ZiwgYW5kCisJICogZXh0cmFfcG9zdGZpeF9sZW47IGVuY3J5cHQgbmVlZCBub3QgdXNlIGFsbCB0aGlzIHNwYWNlLCBidXQKKwkgKiB0aGUgcmVzdWx0IG11c3Qgc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyIGFuZCBjb3JyZWN0CisJICogbGVuZ3RoIG11c3QgYmUgcmV0dXJuZWQgKi8KKwlpbnQgZXh0cmFfcHJlZml4X2xlbiwgZXh0cmFfcG9zdGZpeF9sZW47CisKKwlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKK307CisKK3N0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OyAvKiBkZWxheWVkIGRlbGV0aW9uIGxpc3QgKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgKm9wczsKKwl2b2lkICpwcml2OworCWF0b21pY190IHJlZmNudDsKK307CisKK2ludCBpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wcyhzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgKm9wcyk7CitpbnQgaWVlZTgwMjExX3VucmVnaXN0ZXJfY3J5cHRvX29wcyhzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgKm9wcyk7CitzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgKiBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMoY29uc3QgY2hhciAqbmFtZSk7Cit2b2lkIGllZWU4MDIxMV9jcnlwdF9kZWluaXRfZW50cmllcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqLCBpbnQpOwordm9pZCBpZWVlODAyMTFfY3J5cHRfZGVpbml0X2hhbmRsZXIodW5zaWduZWQgbG9uZyk7Cit2b2lkIGllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgICAgc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICoqY3J5cHQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF9jY21wLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfY2NtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YWRkMzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfY2NtcC5jCkBAIC0wLDAgKzEsNTMzIEBACisvKgorICogSG9zdCBBUCBjcnlwdDogaG9zdC1iYXNlZCBDQ01QIGVuY3J5cHRpb24gaW1wbGVtZW50YXRpb24gZm9yIEhvc3QgQVAgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDQsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBTZWUgUkVBRE1FIGFuZCBDT1BZSU5HIGZvcgorICogbW9yZSBkZXRhaWxzLgorICovCisKKy8vI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8YXNtL3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisKKyNpbmNsdWRlICJpZWVlODAyMTEuaCIKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpCisjaW5jbHVkZSAicnRsX2NyeXB0by5oIgorI2Vsc2UKKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNlbmRpZgorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKKyAgICAjaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CisjZWxzZQorICAgICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorI2VuZGlmCisKKy8vI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgorCitNT0RVTEVfQVVUSE9SKCJKb3VuaSBNYWxpbmVuIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkhvc3QgQVAgY3J5cHQ6IENDTVAiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2lmZGVmIE9QRU5TVVNFX1NMRUQKKyNpZm5kZWYgSU5fT1BFTlNVU0VfU0xFRAorI2RlZmluZSBJTl9PUEVOU1VTRV9TTEVEIDEKKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgQUVTX0JMT0NLX0xFTiAxNgorI2RlZmluZSBDQ01QX0hEUl9MRU4gOAorI2RlZmluZSBDQ01QX01JQ19MRU4gOAorI2RlZmluZSBDQ01QX1RLX0xFTiAxNgorI2RlZmluZSBDQ01QX1BOX0xFTiA2CisKK3N0cnVjdCBpZWVlODAyMTFfY2NtcF9kYXRhIHsKKwl1OCBrZXlbQ0NNUF9US19MRU5dOworCWludCBrZXlfc2V0OworCisJdTggdHhfcG5bQ0NNUF9QTl9MRU5dOworCXU4IHJ4X3BuW0NDTVBfUE5fTEVOXTsKKworCXUzMiBkb3QxMVJTTkFTdGF0c0NDTVBGb3JtYXRFcnJvcnM7CisJdTMyIGRvdDExUlNOQVN0YXRzQ0NNUFJlcGxheXM7CisJdTMyIGRvdDExUlNOQVN0YXRzQ0NNUERlY3J5cHRFcnJvcnM7CisKKwlpbnQga2V5X2lkeDsKKworCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm07CisKKwkvKiBzY3JhdGNoIGJ1ZmZlcnMgZm9yIHZpcnRfdG9fcGFnZSgpIChjcnlwdG8gQVBJKSAqLworCXU4IHR4X2IwW0FFU19CTE9DS19MRU5dLCB0eF9iW0FFU19CTE9DS19MRU5dLAorCQl0eF9lW0FFU19CTE9DS19MRU5dLCB0eF9zMFtBRVNfQkxPQ0tfTEVOXTsKKwl1OCByeF9iMFtBRVNfQkxPQ0tfTEVOXSwgcnhfYltBRVNfQkxPQ0tfTEVOXSwgcnhfYVtBRVNfQkxPQ0tfTEVOXTsKK307CisKK3ZvaWQgaWVlZTgwMjExX2NjbXBfYWVzX2VuY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkJCSAgICAgY29uc3QgdTggcHRbMTZdLCB1OCBjdFsxNl0pCit7CisgICAgICAJI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSl8fChJTl9PUEVOU1VTRV9TTEVEKSkKKwljcnlwdG9fY2lwaGVyX2VuY3J5cHRfb25lKCh2b2lkICopdGZtLCBjdCwgcHQpOworCSNlbHNlCisJc3RydWN0IHNjYXR0ZXJsaXN0IHNyYywgZHN0OworCisJc3JjLnBhZ2UgPSB2aXJ0X3RvX3BhZ2UocHQpOworCXNyYy5vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShwdCk7CisJc3JjLmxlbmd0aCA9IEFFU19CTE9DS19MRU47CisKKwlkc3QucGFnZSA9IHZpcnRfdG9fcGFnZShjdCk7CisJZHN0Lm9mZnNldCA9IG9mZnNldF9pbl9wYWdlKGN0KTsKKwlkc3QubGVuZ3RoID0gQUVTX0JMT0NLX0xFTjsKKworCWNyeXB0b19jaXBoZXJfZW5jcnlwdCh0Zm0sICZkc3QsICZzcmMsIEFFU19CTE9DS19MRU4pOworCSNlbmRpZgorfQorCitzdGF0aWMgdm9pZCAqIGllZWU4MDIxMV9jY21wX2luaXQoaW50IGtleV9pZHgpCit7CisJc3RydWN0IGllZWU4MDIxMV9jY21wX2RhdGEgKnByaXY7CisKKwlwcml2ID0ga21hbGxvYyhzaXplb2YoKnByaXYpLCBHRlBfQVRPTUlDKTsKKwlpZiAocHJpdiA9PSBOVUxMKQorCQlnb3RvIGZhaWw7CisJbWVtc2V0KHByaXYsIDAsIHNpemVvZigqcHJpdikpOworCXByaXYtPmtleV9pZHggPSBrZXlfaWR4OworCisgICAgICAgI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKSAmJiAoIUlOX09QRU5TVVNFX1NMRUQpKQorCXByaXYtPnRmbSA9IGNyeXB0b19hbGxvY190Zm0oImFlcyIsIDApOworCWlmIChwcml2LT50Zm0gPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0X2NjbXA6IGNvdWxkIG5vdCBhbGxvY2F0ZSAiCisJCSAgICAgICAiY3J5cHRvIEFQSSBhZXNcbiIpOworCQlnb3RvIGZhaWw7CisJfQorICAgICAgICNlbHNlCisgICAgICAgcHJpdi0+dGZtID0gKHZvaWQgKiljcnlwdG9fYWxsb2NfY2lwaGVyKCJhZXMiLCAwLCBDUllQVE9fQUxHX0FTWU5DKTsKKwlpZiAoSVNfRVJSKHByaXYtPnRmbSkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdF9jY21wOiBjb3VsZCBub3QgYWxsb2NhdGUgIgorCQkgICAgICAgImNyeXB0byBBUEkgYWVzXG4iKTsKKwkJcHJpdi0+dGZtID0gTlVMTDsKKwkJZ290byBmYWlsOworCX0KKwkjZW5kaWYKKwlyZXR1cm4gcHJpdjsKKworZmFpbDoKKwlpZiAocHJpdikgeworCQlpZiAocHJpdi0+dGZtKQorCQkJLy8jaWYoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkKKyAgICAgICAJCQkjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpICYmICghSU5fT1BFTlNVU0VfU0xFRCkpCisJCQljcnlwdG9fZnJlZV90Zm0ocHJpdi0+dGZtKTsKKyAgICAgICAgICAgICAgICAgICAgI2Vsc2UKKwkJCWNyeXB0b19mcmVlX2NpcGhlcigodm9pZCAqKXByaXYtPnRmbSk7CisJCSAgICAgICNlbmRpZgorCQlrZnJlZShwcml2KTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfY2NtcF9kZWluaXQodm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2NjbXBfZGF0YSAqX3ByaXYgPSBwcml2OworCWlmIChfcHJpdiAmJiBfcHJpdi0+dGZtKQorCQkvLyNpZihMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKQorICAgICAgIAkJI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKSAmJiAoIUlOX09QRU5TVVNFX1NMRUQpKQorCQljcnlwdG9fZnJlZV90Zm0oX3ByaXYtPnRmbSk7CisgICAgICAgICAgICAgI2Vsc2UKKwkJY3J5cHRvX2ZyZWVfY2lwaGVyKCh2b2lkICopX3ByaXYtPnRmbSk7CisJCSNlbmRpZgorCWtmcmVlKHByaXYpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB4b3JfYmxvY2sodTggKmIsIHU4ICphLCBzaXplX3QgbGVuKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJYltpXSBePSBhW2ldOworfQorCisjaWZuZGVmIEpPSE5fQ0NNUAorc3RhdGljIHZvaWQgY2NtcF9pbml0X2Jsb2NrcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAorCQkJICAgICB1OCAqcG4sIHNpemVfdCBkbGVuLCB1OCAqYjAsIHU4ICphdXRoLAorCQkJICAgICB1OCAqczApCit7CisJdTggKnBvcywgcWMgPSAwOworCXNpemVfdCBhYWRfbGVuOworCXUxNiBmYzsKKwlpbnQgYTRfaW5jbHVkZWQsIHFjX2luY2x1ZGVkOworCXU4IGFhZFsyICogQUVTX0JMT0NLX0xFTl07CisKKwlmYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKTsKKwlhNF9pbmNsdWRlZCA9ICgoZmMgJiAoSUVFRTgwMjExX0ZDVExfVE9EUyB8IElFRUU4MDIxMV9GQ1RMX0ZST01EUykpID09CisJCSAgICAgICAoSUVFRTgwMjExX0ZDVExfVE9EUyB8IElFRUU4MDIxMV9GQ1RMX0ZST01EUykpOworCS8qCisJcWNfaW5jbHVkZWQgPSAoKFdMQU5fRkNfR0VUX1RZUEUoZmMpID09IElFRUU4MDIxMV9GVFlQRV9EQVRBKSAmJgorCQkgICAgICAgKFdMQU5fRkNfR0VUX1NUWVBFKGZjKSAmIDB4MDgpKTsKKyAgICAgICAgKi8KKwkvLyBmaXhlZCBieSBEYXZpZCA6MjAwNi45LjYKKwlxY19pbmNsdWRlZCA9ICgoV0xBTl9GQ19HRVRfVFlQRShmYykgPT0gSUVFRTgwMjExX0ZUWVBFX0RBVEEpICYmCisJCSAgICAgICAoV0xBTl9GQ19HRVRfU1RZUEUoZmMpICYgMHg4MCkpOworCWFhZF9sZW4gPSAyMjsKKwlpZiAoYTRfaW5jbHVkZWQpCisJCWFhZF9sZW4gKz0gNjsKKwlpZiAocWNfaW5jbHVkZWQpIHsKKwkJcG9zID0gKHU4ICopICZoZHItPmFkZHI0OworCQlpZiAoYTRfaW5jbHVkZWQpCisJCQlwb3MgKz0gNjsKKwkJcWMgPSAqcG9zICYgMHgwZjsKKwkJYWFkX2xlbiArPSAyOworCX0KKwkvKiBDQ00gSW5pdGlhbCBCbG9jazoKKwkgKiBGbGFnIChJbmNsdWRlIGF1dGhlbnRpY2F0aW9uIGhlYWRlciwgTT0zICg4LW9jdGV0IE1JQyksCisJICogICAgICAgTD0xICgyLW9jdGV0IERsZW4pKQorCSAqIE5vbmNlOiAweDAwIHwgQTIgfCBQTgorCSAqIERsZW4gKi8KKwliMFswXSA9IDB4NTk7CisJYjBbMV0gPSBxYzsKKwltZW1jcHkoYjAgKyAyLCBoZHItPmFkZHIyLCBFVEhfQUxFTik7CisJbWVtY3B5KGIwICsgOCwgcG4sIENDTVBfUE5fTEVOKTsKKwliMFsxNF0gPSAoZGxlbiA+PiA4KSAmIDB4ZmY7CisJYjBbMTVdID0gZGxlbiAmIDB4ZmY7CisKKwkvKiBBQUQ6CisJICogRkMgd2l0aCBiaXRzIDQuLjYgYW5kIDExLi4xMyBtYXNrZWQgdG8gemVybzsgMTQgaXMgYWx3YXlzIG9uZQorCSAqIEExIHwgQTIgfCBBMworCSAqIFNDIHdpdGggYml0cyA0Li4xNSAoc2VxIykgbWFza2VkIHRvIHplcm8KKwkgKiBBNCAoaWYgcHJlc2VudCkKKwkgKiBRQyAoaWYgcHJlc2VudCkKKwkgKi8KKwlwb3MgPSAodTggKikgaGRyOworCWFhZFswXSA9IDA7IC8qIGFhZF9sZW4gPj4gOCAqLworCWFhZFsxXSA9IGFhZF9sZW4gJiAweGZmOworCWFhZFsyXSA9IHBvc1swXSAmIDB4OGY7CisJYWFkWzNdID0gcG9zWzFdICYgMHhjNzsKKwltZW1jcHkoYWFkICsgNCwgaGRyLT5hZGRyMSwgMyAqIEVUSF9BTEVOKTsKKwlwb3MgPSAodTggKikgJmhkci0+c2VxX2N0bDsKKwlhYWRbMjJdID0gcG9zWzBdICYgMHgwZjsKKwlhYWRbMjNdID0gMDsgLyogYWxsIGJpdHMgbWFza2VkICovCisJbWVtc2V0KGFhZCArIDI0LCAwLCA4KTsKKwlpZiAoYTRfaW5jbHVkZWQpCisJCW1lbWNweShhYWQgKyAyNCwgaGRyLT5hZGRyNCwgRVRIX0FMRU4pOworCWlmIChxY19pbmNsdWRlZCkgeworCQlhYWRbYTRfaW5jbHVkZWQgPyAzMCA6IDI0XSA9IHFjOworCQkvKiByZXN0IG9mIFFDIG1hc2tlZCAqLworCX0KKworCS8qIFN0YXJ0IHdpdGggdGhlIGZpcnN0IGJsb2NrIGFuZCBBQUQgKi8KKwlpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdCh0Zm0sIGIwLCBhdXRoKTsKKwl4b3JfYmxvY2soYXV0aCwgYWFkLCBBRVNfQkxPQ0tfTEVOKTsKKwlpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdCh0Zm0sIGF1dGgsIGF1dGgpOworCXhvcl9ibG9jayhhdXRoLCAmYWFkW0FFU19CTE9DS19MRU5dLCBBRVNfQkxPQ0tfTEVOKTsKKwlpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdCh0Zm0sIGF1dGgsIGF1dGgpOworCWIwWzBdICY9IDB4MDc7CisJYjBbMTRdID0gYjBbMTVdID0gMDsKKwlpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdCh0Zm0sIGIwLCBzMCk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBpZWVlODAyMTFfY2NtcF9lbmNyeXB0KHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJfbGVuLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBpZWVlODAyMTFfY2NtcF9kYXRhICprZXkgPSBwcml2OworCWludCBkYXRhX2xlbiwgaTsKKwl1OCAqcG9zOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisjaWZuZGVmIEpPSE5fQ0NNUAorCWludCBibG9ja3MsIGxhc3QsIGxlbjsKKwl1OCAqbWljOworCXU4ICpiMCA9IGtleS0+dHhfYjA7CisJdTggKmIgPSBrZXktPnR4X2I7CisJdTggKmUgPSBrZXktPnR4X2U7CisJdTggKnMwID0ga2V5LT50eF9zMDsKKyNlbmRpZgorCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IENDTVBfSERSX0xFTiB8fAorCSAgICBza2JfdGFpbHJvb20oc2tiKSA8IENDTVBfTUlDX0xFTiB8fAorCSAgICBza2ItPmxlbiA8IGhkcl9sZW4pCisJCXJldHVybiAtMTsKKworCWRhdGFfbGVuID0gc2tiLT5sZW4gLSBoZHJfbGVuOworCXBvcyA9IHNrYl9wdXNoKHNrYiwgQ0NNUF9IRFJfTEVOKTsKKwltZW1tb3ZlKHBvcywgcG9zICsgQ0NNUF9IRFJfTEVOLCBoZHJfbGVuKTsKKwlwb3MgKz0gaGRyX2xlbjsKKy8vCW1pYyA9IHNrYl9wdXQoc2tiLCBDQ01QX01JQ19MRU4pOworCisJaSA9IENDTVBfUE5fTEVOIC0gMTsKKwl3aGlsZSAoaSA+PSAwKSB7CisJCWtleS0+dHhfcG5baV0rKzsKKwkJaWYgKGtleS0+dHhfcG5baV0gIT0gMCkKKwkJCWJyZWFrOworCQlpLS07CisJfQorCisJKnBvcysrID0ga2V5LT50eF9wbls1XTsKKwkqcG9zKysgPSBrZXktPnR4X3BuWzRdOworCSpwb3MrKyA9IDA7CisJKnBvcysrID0gKGtleS0+a2V5X2lkeCA8PCA2KSB8ICgxIDw8IDUpIC8qIEV4dCBJViBpbmNsdWRlZCAqLzsKKwkqcG9zKysgPSBrZXktPnR4X3BuWzNdOworCSpwb3MrKyA9IGtleS0+dHhfcG5bMl07CisJKnBvcysrID0ga2V5LT50eF9wblsxXTsKKwkqcG9zKysgPSBrZXktPnR4X3BuWzBdOworCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKKyNpZm5kZWYgSk9ITl9DQ01QCisJLy9taWMgaXMgbW92ZWQgdG8gaGVyZSBieSBqb2huCisJbWljID0gc2tiX3B1dChza2IsIENDTVBfTUlDX0xFTik7CisKKwljY21wX2luaXRfYmxvY2tzKGtleS0+dGZtLCBoZHIsIGtleS0+dHhfcG4sIGRhdGFfbGVuLCBiMCwgYiwgczApOworCisJYmxvY2tzID0gKGRhdGFfbGVuICsgQUVTX0JMT0NLX0xFTiAtIDEpIC8gQUVTX0JMT0NLX0xFTjsKKwlsYXN0ID0gZGF0YV9sZW4gJSBBRVNfQkxPQ0tfTEVOOworCisJZm9yIChpID0gMTsgaSA8PSBibG9ja3M7IGkrKykgeworCQlsZW4gPSAoaSA9PSBibG9ja3MgJiYgbGFzdCkgPyBsYXN0IDogQUVTX0JMT0NLX0xFTjsKKwkJLyogQXV0aGVudGljYXRpb24gKi8KKwkJeG9yX2Jsb2NrKGIsIHBvcywgbGVuKTsKKwkJaWVlZTgwMjExX2NjbXBfYWVzX2VuY3J5cHQoa2V5LT50Zm0sIGIsIGIpOworCQkvKiBFbmNyeXB0aW9uLCB3aXRoIGNvdW50ZXIgKi8KKwkJYjBbMTRdID0gKGkgPj4gOCkgJiAweGZmOworCQliMFsxNV0gPSBpICYgMHhmZjsKKwkJaWVlZTgwMjExX2NjbXBfYWVzX2VuY3J5cHQoa2V5LT50Zm0sIGIwLCBlKTsKKwkJeG9yX2Jsb2NrKHBvcywgZSwgbGVuKTsKKwkJcG9zICs9IGxlbjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQ0NNUF9NSUNfTEVOOyBpKyspCisJCW1pY1tpXSA9IGJbaV0gXiBzMFtpXTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX2NjbXBfZGVjcnlwdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2NjbXBfZGF0YSAqa2V5ID0gcHJpdjsKKwl1OCBrZXlpZHgsICpwb3M7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKwl1OCBwbls2XTsKKyNpZm5kZWYgSk9ITl9DQ01QCisJc2l6ZV90IGRhdGFfbGVuID0gc2tiLT5sZW4gLSBoZHJfbGVuIC0gQ0NNUF9IRFJfTEVOIC0gQ0NNUF9NSUNfTEVOOworCXU4ICptaWMgPSBza2ItPmRhdGEgKyBza2ItPmxlbiAtIENDTVBfTUlDX0xFTjsKKwl1OCAqYjAgPSBrZXktPnJ4X2IwOworCXU4ICpiID0ga2V5LT5yeF9iOworCXU4ICphID0ga2V5LT5yeF9hOworCWludCBpLCBibG9ja3MsIGxhc3QsIGxlbjsKKyNlbmRpZgorCWlmIChza2ItPmxlbiA8IGhkcl9sZW4gKyBDQ01QX0hEUl9MRU4gKyBDQ01QX01JQ19MRU4pIHsKKwkJa2V5LT5kb3QxMVJTTkFTdGF0c0NDTVBGb3JtYXRFcnJvcnMrKzsKKwkJcmV0dXJuIC0xOworCX0KKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CisJcG9zID0gc2tiLT5kYXRhICsgaGRyX2xlbjsKKwlrZXlpZHggPSBwb3NbM107CisJaWYgKCEoa2V5aWR4ICYgKDEgPDwgNSkpKSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJDQ01QOiByZWNlaXZlZCBwYWNrZXQgd2l0aG91dCBFeHRJViIKKwkJCSAgICAgICAiIGZsYWcgZnJvbSAiIE1BQ19GTVQgIlxuIiwgTUFDX0FSRyhoZHItPmFkZHIyKSk7CisJCX0KKwkJa2V5LT5kb3QxMVJTTkFTdGF0c0NDTVBGb3JtYXRFcnJvcnMrKzsKKwkJcmV0dXJuIC0yOworCX0KKwlrZXlpZHggPj49IDY7CisJaWYgKGtleS0+a2V5X2lkeCAhPSBrZXlpZHgpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkNDTVA6IFJYIHRrZXktPmtleV9pZHg9JWQgZnJhbWUgIgorCQkgICAgICAgImtleWlkeD0lZCBwcml2PSVwXG4iLCBrZXktPmtleV9pZHgsIGtleWlkeCwgcHJpdik7CisJCXJldHVybiAtNjsKKwl9CisJaWYgKCFrZXktPmtleV9zZXQpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIkNDTVA6IHJlY2VpdmVkIHBhY2tldCBmcm9tICIgTUFDX0ZNVAorCQkJICAgICAgICIgd2l0aCBrZXlpZD0lZCB0aGF0IGRvZXMgbm90IGhhdmUgYSBjb25maWd1cmVkIgorCQkJICAgICAgICIga2V5XG4iLCBNQUNfQVJHKGhkci0+YWRkcjIpLCBrZXlpZHgpOworCQl9CisJCXJldHVybiAtMzsKKwl9CisKKwlwblswXSA9IHBvc1s3XTsKKwlwblsxXSA9IHBvc1s2XTsKKwlwblsyXSA9IHBvc1s1XTsKKwlwblszXSA9IHBvc1s0XTsKKwlwbls0XSA9IHBvc1sxXTsKKwlwbls1XSA9IHBvc1swXTsKKwlwb3MgKz0gODsKKworCWlmIChtZW1jbXAocG4sIGtleS0+cnhfcG4sIENDTVBfUE5fTEVOKSA8PSAwKSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJDQ01QOiByZXBsYXkgZGV0ZWN0ZWQ6IFNUQT0iIE1BQ19GTVQKKwkJCSAgICAgICAiIHByZXZpb3VzIFBOICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAiCisJCQkgICAgICAgInJlY2VpdmVkIFBOICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIiwKKwkJCSAgICAgICBNQUNfQVJHKGhkci0+YWRkcjIpLCBNQUNfQVJHKGtleS0+cnhfcG4pLAorCQkJICAgICAgIE1BQ19BUkcocG4pKTsKKwkJfQorCQlrZXktPmRvdDExUlNOQVN0YXRzQ0NNUFJlcGxheXMrKzsKKwkJcmV0dXJuIC00OworCX0KKworI2lmbmRlZiBKT0hOX0NDTVAKKwljY21wX2luaXRfYmxvY2tzKGtleS0+dGZtLCBoZHIsIHBuLCBkYXRhX2xlbiwgYjAsIGEsIGIpOworCXhvcl9ibG9jayhtaWMsIGIsIENDTVBfTUlDX0xFTik7CisKKwlibG9ja3MgPSAoZGF0YV9sZW4gKyBBRVNfQkxPQ0tfTEVOIC0gMSkgLyBBRVNfQkxPQ0tfTEVOOworCWxhc3QgPSBkYXRhX2xlbiAlIEFFU19CTE9DS19MRU47CisKKwlmb3IgKGkgPSAxOyBpIDw9IGJsb2NrczsgaSsrKSB7CisJCWxlbiA9IChpID09IGJsb2NrcyAmJiBsYXN0KSA/IGxhc3QgOiBBRVNfQkxPQ0tfTEVOOworCQkvKiBEZWNyeXB0LCB3aXRoIGNvdW50ZXIgKi8KKwkJYjBbMTRdID0gKGkgPj4gOCkgJiAweGZmOworCQliMFsxNV0gPSBpICYgMHhmZjsKKwkJaWVlZTgwMjExX2NjbXBfYWVzX2VuY3J5cHQoa2V5LT50Zm0sIGIwLCBiKTsKKwkJeG9yX2Jsb2NrKHBvcywgYiwgbGVuKTsKKwkJLyogQXV0aGVudGljYXRpb24gKi8KKwkJeG9yX2Jsb2NrKGEsIHBvcywgbGVuKTsKKwkJaWVlZTgwMjExX2NjbXBfYWVzX2VuY3J5cHQoa2V5LT50Zm0sIGEsIGEpOworCQlwb3MgKz0gbGVuOworCX0KKworCWlmIChtZW1jbXAobWljLCBhLCBDQ01QX01JQ19MRU4pICE9IDApIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIkNDTVA6IGRlY3J5cHQgZmFpbGVkOiBTVEE9IgorCQkJICAgICAgIE1BQ19GTVQgIlxuIiwgTUFDX0FSRyhoZHItPmFkZHIyKSk7CisJCX0KKwkJa2V5LT5kb3QxMVJTTkFTdGF0c0NDTVBEZWNyeXB0RXJyb3JzKys7CisJCXJldHVybiAtNTsKKwl9CisKKwltZW1jcHkoa2V5LT5yeF9wbiwgcG4sIENDTVBfUE5fTEVOKTsKKworI2VuZGlmCisJLyogUmVtb3ZlIGhkciBhbmQgTUlDICovCisJbWVtbW92ZShza2ItPmRhdGEgKyBDQ01QX0hEUl9MRU4sIHNrYi0+ZGF0YSwgaGRyX2xlbik7CisJc2tiX3B1bGwoc2tiLCBDQ01QX0hEUl9MRU4pOworCXNrYl90cmltKHNrYiwgc2tiLT5sZW4gLSBDQ01QX01JQ19MRU4pOworCisJcmV0dXJuIGtleWlkeDsKK30KKworCitzdGF0aWMgaW50IGllZWU4MDIxMV9jY21wX3NldF9rZXkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBpZWVlODAyMTFfY2NtcF9kYXRhICpkYXRhID0gcHJpdjsKKwlpbnQga2V5aWR4OworCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm0gPSBkYXRhLT50Zm07CisKKwlrZXlpZHggPSBkYXRhLT5rZXlfaWR4OworCW1lbXNldChkYXRhLCAwLCBzaXplb2YoKmRhdGEpKTsKKwlkYXRhLT5rZXlfaWR4ID0ga2V5aWR4OworCWRhdGEtPnRmbSA9IHRmbTsKKwlpZiAobGVuID09IENDTVBfVEtfTEVOKSB7CisJCW1lbWNweShkYXRhLT5rZXksIGtleSwgQ0NNUF9US19MRU4pOworCQlkYXRhLT5rZXlfc2V0ID0gMTsKKwkJaWYgKHNlcSkgeworCQkJZGF0YS0+cnhfcG5bMF0gPSBzZXFbNV07CisJCQlkYXRhLT5yeF9wblsxXSA9IHNlcVs0XTsKKwkJCWRhdGEtPnJ4X3BuWzJdID0gc2VxWzNdOworCQkJZGF0YS0+cnhfcG5bM10gPSBzZXFbMl07CisJCQlkYXRhLT5yeF9wbls0XSA9IHNlcVsxXTsKKwkJCWRhdGEtPnJ4X3BuWzVdID0gc2VxWzBdOworCQl9CisJCWNyeXB0b19jaXBoZXJfc2V0a2V5KCh2b2lkICopZGF0YS0+dGZtLCBkYXRhLT5rZXksIENDTVBfVEtfTEVOKTsKKwl9IGVsc2UgaWYgKGxlbiA9PSAwKQorCQlkYXRhLT5rZXlfc2V0ID0gMDsKKwllbHNlCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX2NjbXBfZ2V0X2tleSh2b2lkICprZXksIGludCBsZW4sIHU4ICpzZXEsIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV9jY21wX2RhdGEgKmRhdGEgPSBwcml2OworCisJaWYgKGxlbiA8IENDTVBfVEtfTEVOKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoIWRhdGEtPmtleV9zZXQpCisJCXJldHVybiAwOworCW1lbWNweShrZXksIGRhdGEtPmtleSwgQ0NNUF9US19MRU4pOworCisJaWYgKHNlcSkgeworCQlzZXFbMF0gPSBkYXRhLT50eF9wbls1XTsKKwkJc2VxWzFdID0gZGF0YS0+dHhfcG5bNF07CisJCXNlcVsyXSA9IGRhdGEtPnR4X3BuWzNdOworCQlzZXFbM10gPSBkYXRhLT50eF9wblsyXTsKKwkJc2VxWzRdID0gZGF0YS0+dHhfcG5bMV07CisJCXNlcVs1XSA9IGRhdGEtPnR4X3BuWzBdOworCX0KKworCXJldHVybiBDQ01QX1RLX0xFTjsKK30KKworCitzdGF0aWMgY2hhciAqIGllZWU4MDIxMV9jY21wX3ByaW50X3N0YXRzKGNoYXIgKnAsIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV9jY21wX2RhdGEgKmNjbXAgPSBwcml2OworCXAgKz0gc3ByaW50ZihwLCAia2V5WyVkXSBhbGc9Q0NNUCBrZXlfc2V0PSVkICIKKwkJICAgICAidHhfcG49JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKKwkJICAgICAicnhfcG49JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKKwkJICAgICAiZm9ybWF0X2Vycm9ycz0lZCByZXBsYXlzPSVkIGRlY3J5cHRfZXJyb3JzPSVkXG4iLAorCQkgICAgIGNjbXAtPmtleV9pZHgsIGNjbXAtPmtleV9zZXQsCisJCSAgICAgTUFDX0FSRyhjY21wLT50eF9wbiksIE1BQ19BUkcoY2NtcC0+cnhfcG4pLAorCQkgICAgIGNjbXAtPmRvdDExUlNOQVN0YXRzQ0NNUEZvcm1hdEVycm9ycywKKwkJICAgICBjY21wLT5kb3QxMVJTTkFTdGF0c0NDTVBSZXBsYXlzLAorCQkgICAgIGNjbXAtPmRvdDExUlNOQVN0YXRzQ0NNUERlY3J5cHRFcnJvcnMpOworCisJcmV0dXJuIHA7Cit9CisKK3ZvaWQgaWVlZTgwMjExX2NjbXBfbnVsbCh2b2lkKQoreworLy8gICAgcHJpbnRrKCI9PT09PT09PT09PT0+JXMoKVxuIiwgX19mdW5jX18pOworCXJldHVybjsKK30KK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgaWVlZTgwMjExX2NyeXB0X2NjbXAgPSB7CisJLm5hbWUJCQk9ICJDQ01QIiwKKwkuaW5pdAkJCT0gaWVlZTgwMjExX2NjbXBfaW5pdCwKKwkuZGVpbml0CQkJPSBpZWVlODAyMTFfY2NtcF9kZWluaXQsCisJLmVuY3J5cHRfbXBkdQkJPSBpZWVlODAyMTFfY2NtcF9lbmNyeXB0LAorCS5kZWNyeXB0X21wZHUJCT0gaWVlZTgwMjExX2NjbXBfZGVjcnlwdCwKKwkuZW5jcnlwdF9tc2R1CQk9IE5VTEwsCisJLmRlY3J5cHRfbXNkdQkJPSBOVUxMLAorCS5zZXRfa2V5CQk9IGllZWU4MDIxMV9jY21wX3NldF9rZXksCisJLmdldF9rZXkJCT0gaWVlZTgwMjExX2NjbXBfZ2V0X2tleSwKKwkucHJpbnRfc3RhdHMJCT0gaWVlZTgwMjExX2NjbXBfcHJpbnRfc3RhdHMsCisJLmV4dHJhX3ByZWZpeF9sZW4JPSBDQ01QX0hEUl9MRU4sCisJLmV4dHJhX3Bvc3RmaXhfbGVuCT0gQ0NNUF9NSUNfTEVOLAorCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCit9OworCisKK2ludCBpZWVlODAyMTFfY3J5cHRvX2NjbXBfaW5pdCh2b2lkKQoreworCXJldHVybiBpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wcygmaWVlZTgwMjExX2NyeXB0X2NjbXApOworfQorCisKK3ZvaWQgaWVlZTgwMjExX2NyeXB0b19jY21wX2V4aXQodm9pZCkKK3sKKwlpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzKCZpZWVlODAyMTFfY3J5cHRfY2NtcCk7Cit9CisKKyNpZiAwCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX2NjbXBfbnVsbCk7CisjZWxzZQorRVhQT1JUX1NZTUJPTF9OT1ZFUlMoaWVlZTgwMjExX2NjbXBfbnVsbCk7CisjZW5kaWYKKyNlbmRpZgorCisvL21vZHVsZV9pbml0KGllZWU4MDIxMV9jcnlwdG9fY2NtcF9pbml0KTsKKy8vbW9kdWxlX2V4aXQoaWVlZTgwMjExX2NyeXB0b19jY21wX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3RraXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF90a2lwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU5N2JiZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF90a2lwLmMKQEAgLTAsMCArMSwxMDAxIEBACisvKgorICogSG9zdCBBUCBjcnlwdDogaG9zdC1iYXNlZCBUS0lQIGVuY3J5cHRpb24gaW1wbGVtZW50YXRpb24gZm9yIEhvc3QgQVAgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDQsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBTZWUgUkVBRE1FIGFuZCBDT1BZSU5HIGZvcgorICogbW9yZSBkZXRhaWxzLgorICovCisKKy8vI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8YXNtL3N0cmluZy5oPgorCisjaW5jbHVkZSAiaWVlZTgwMjExLmgiCisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApKQorI2luY2x1ZGUgInJ0bF9jcnlwdG8uaCIKKyNlbHNlCisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjZW5kaWYKKy8vI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjApKQorICAgICNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KKyNlbHNlCisgICAgI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisKK01PRFVMRV9BVVRIT1IoIkpvdW5pIE1hbGluZW4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSG9zdCBBUCBjcnlwdDogVEtJUCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjaWZkZWYgT1BFTlNVU0VfU0xFRAorI2lmbmRlZiBJTl9PUEVOU1VTRV9TTEVECisjZGVmaW5lIElOX09QRU5TVVNFX1NMRUQgMQorI2VuZGlmCisjZW5kaWYKKworc3RydWN0IGllZWU4MDIxMV90a2lwX2RhdGEgeworI2RlZmluZSBUS0lQX0tFWV9MRU4gMzIKKwl1OCBrZXlbVEtJUF9LRVlfTEVOXTsKKwlpbnQga2V5X3NldDsKKworCXUzMiB0eF9pdjMyOworCXUxNiB0eF9pdjE2OworCXUxNiB0eF90dGFrWzVdOworCWludCB0eF9waGFzZTFfZG9uZTsKKworCXUzMiByeF9pdjMyOworCXUxNiByeF9pdjE2OworCXUxNiByeF90dGFrWzVdOworCWludCByeF9waGFzZTFfZG9uZTsKKwl1MzIgcnhfaXYzMl9uZXc7CisJdTE2IHJ4X2l2MTZfbmV3OworCisJdTMyIGRvdDExUlNOQVN0YXRzVEtJUFJlcGxheXM7CisJdTMyIGRvdDExUlNOQVN0YXRzVEtJUElDVkVycm9yczsKKwl1MzIgZG90MTFSU05BU3RhdHNUS0lQTG9jYWxNSUNGYWlsdXJlczsKKworCWludCBrZXlfaWR4OworCisgICAgICAgI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSl8fChJTl9PUEVOU1VTRV9TTEVEKSkKKwkgICAJc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKnJ4X3RmbV9hcmM0OworCSAgICAgICBzdHJ1Y3QgY3J5cHRvX2hhc2ggKnJ4X3RmbV9taWNoYWVsOworCSAgICAgICBzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdHhfdGZtX2FyYzQ7CisJICAgICAgIHN0cnVjdCBjcnlwdG9faGFzaCAqdHhfdGZtX21pY2hhZWw7CisgICAgICAgI2VuZGlmCisKKwlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtX2FyYzQ7CisJc3RydWN0IGNyeXB0b190Zm0gKnRmbV9taWNoYWVsOworCisJLyogc2NyYXRjaCBidWZmZXJzIGZvciB2aXJ0X3RvX3BhZ2UoKSAoY3J5cHRvIEFQSSkgKi8KKwl1OCByeF9oZHJbMTZdLCB0eF9oZHJbMTZdOworfTsKKworc3RhdGljIHZvaWQgKiBpZWVlODAyMTFfdGtpcF9pbml0KGludCBrZXlfaWR4KQoreworCXN0cnVjdCBpZWVlODAyMTFfdGtpcF9kYXRhICpwcml2OworCisJcHJpdiA9IGttYWxsb2Moc2l6ZW9mKCpwcml2KSwgR0ZQX0FUT01JQyk7CisJaWYgKHByaXYgPT0gTlVMTCkKKwkJZ290byBmYWlsOworCW1lbXNldChwcml2LCAwLCBzaXplb2YoKnByaXYpKTsKKwlwcml2LT5rZXlfaWR4ID0ga2V5X2lkeDsKKworICAgICAgI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKSYmKCFJTl9PUEVOU1VTRV9TTEVEKSkKKwlwcml2LT50Zm1fYXJjNCA9IGNyeXB0b19hbGxvY190Zm0oImFyYzQiLCAwKTsKKwlpZiAocHJpdi0+dGZtX2FyYzQgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0X3RraXA6IGNvdWxkIG5vdCBhbGxvY2F0ZSAiCisJCSAgICAgICAiY3J5cHRvIEFQSSBhcmM0XG4iKTsKKwkJZ290byBmYWlsOworCX0KKworCXByaXYtPnRmbV9taWNoYWVsID0gY3J5cHRvX2FsbG9jX3RmbSgibWljaGFlbF9taWMiLCAwKTsKKwlpZiAocHJpdi0+dGZtX21pY2hhZWwgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0X3RraXA6IGNvdWxkIG5vdCBhbGxvY2F0ZSAiCisJCSAgICAgICAiY3J5cHRvIEFQSSBtaWNoYWVsX21pY1xuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkjZWxzZQorCXByaXYtPnR4X3RmbV9hcmM0ID0gY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcigiZWNiKGFyYzQpIiwgMCwKKwkJCQkJCUNSWVBUT19BTEdfQVNZTkMpOworCWlmIChJU19FUlIocHJpdi0+dHhfdGZtX2FyYzQpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHRfdGtpcDogY291bGQgbm90IGFsbG9jYXRlICIKKwkJICAgICAgICJjcnlwdG8gQVBJIGFyYzRcbiIpOworCQlwcml2LT50eF90Zm1fYXJjNCA9IE5VTEw7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlwcml2LT50eF90Zm1fbWljaGFlbCA9IGNyeXB0b19hbGxvY19oYXNoKCJtaWNoYWVsX21pYyIsIDAsCisJCQkJCQkgQ1JZUFRPX0FMR19BU1lOQyk7CisJaWYgKElTX0VSUihwcml2LT50eF90Zm1fbWljaGFlbCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdF90a2lwOiBjb3VsZCBub3QgYWxsb2NhdGUgIgorCQkgICAgICAgImNyeXB0byBBUEkgbWljaGFlbF9taWNcbiIpOworCQlwcml2LT50eF90Zm1fbWljaGFlbCA9IE5VTEw7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlwcml2LT5yeF90Zm1fYXJjNCA9IGNyeXB0b19hbGxvY19ibGtjaXBoZXIoImVjYihhcmM0KSIsIDAsCisJCQkJCQlDUllQVE9fQUxHX0FTWU5DKTsKKwlpZiAoSVNfRVJSKHByaXYtPnJ4X3RmbV9hcmM0KSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0X3RraXA6IGNvdWxkIG5vdCBhbGxvY2F0ZSAiCisJCSAgICAgICAiY3J5cHRvIEFQSSBhcmM0XG4iKTsKKwkJcHJpdi0+cnhfdGZtX2FyYzQgPSBOVUxMOworCQlnb3RvIGZhaWw7CisJfQorCisJcHJpdi0+cnhfdGZtX21pY2hhZWwgPSBjcnlwdG9fYWxsb2NfaGFzaCgibWljaGFlbF9taWMiLCAwLAorCQkJCQkJIENSWVBUT19BTEdfQVNZTkMpOworCWlmIChJU19FUlIocHJpdi0+cnhfdGZtX21pY2hhZWwpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHRfdGtpcDogY291bGQgbm90IGFsbG9jYXRlICIKKwkJICAgICAgICJjcnlwdG8gQVBJIG1pY2hhZWxfbWljXG4iKTsKKwkJcHJpdi0+cnhfdGZtX21pY2hhZWwgPSBOVUxMOworCQlnb3RvIGZhaWw7CisJfQorICAgICAgICNlbmRpZgorCXJldHVybiBwcml2OworCitmYWlsOgorCWlmIChwcml2KSB7CisJCSNpZigoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkmJighSU5fT1BFTlNVU0VfU0xFRCkpCisJCWlmIChwcml2LT50Zm1fbWljaGFlbCkKKwkJCWNyeXB0b19mcmVlX3RmbShwcml2LT50Zm1fbWljaGFlbCk7CisJCWlmIChwcml2LT50Zm1fYXJjNCkKKwkJCWNyeXB0b19mcmVlX3RmbShwcml2LT50Zm1fYXJjNCk7CisgICAgICAgICAgICAgI2Vsc2UKKwkJaWYgKHByaXYtPnR4X3RmbV9taWNoYWVsKQorCQkJY3J5cHRvX2ZyZWVfaGFzaChwcml2LT50eF90Zm1fbWljaGFlbCk7CisJCWlmIChwcml2LT50eF90Zm1fYXJjNCkKKwkJCWNyeXB0b19mcmVlX2Jsa2NpcGhlcihwcml2LT50eF90Zm1fYXJjNCk7CisJCWlmIChwcml2LT5yeF90Zm1fbWljaGFlbCkKKwkJCWNyeXB0b19mcmVlX2hhc2gocHJpdi0+cnhfdGZtX21pY2hhZWwpOworCQlpZiAocHJpdi0+cnhfdGZtX2FyYzQpCisJCQljcnlwdG9fZnJlZV9ibGtjaXBoZXIocHJpdi0+cnhfdGZtX2FyYzQpOworCQkjZW5kaWYKKwkJa2ZyZWUocHJpdik7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdGljIHZvaWQgaWVlZTgwMjExX3RraXBfZGVpbml0KHZvaWQgKnByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV90a2lwX2RhdGEgKl9wcml2ID0gcHJpdjsKKwkjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpJiYoIUlOX09QRU5TVVNFX1NMRUQpKQorCWlmIChfcHJpdiAmJiBfcHJpdi0+dGZtX21pY2hhZWwpCisJCWNyeXB0b19mcmVlX3RmbShfcHJpdi0+dGZtX21pY2hhZWwpOworCWlmIChfcHJpdiAmJiBfcHJpdi0+dGZtX2FyYzQpCisJCWNyeXB0b19mcmVlX3RmbShfcHJpdi0+dGZtX2FyYzQpOworCSNlbHNlCisJaWYgKF9wcml2KSB7CisJCWlmIChfcHJpdi0+dHhfdGZtX21pY2hhZWwpCisJCQljcnlwdG9fZnJlZV9oYXNoKF9wcml2LT50eF90Zm1fbWljaGFlbCk7CisJCWlmIChfcHJpdi0+dHhfdGZtX2FyYzQpCisJCQljcnlwdG9fZnJlZV9ibGtjaXBoZXIoX3ByaXYtPnR4X3RmbV9hcmM0KTsKKwkJaWYgKF9wcml2LT5yeF90Zm1fbWljaGFlbCkKKwkJCWNyeXB0b19mcmVlX2hhc2goX3ByaXYtPnJ4X3RmbV9taWNoYWVsKTsKKwkJaWYgKF9wcml2LT5yeF90Zm1fYXJjNCkKKwkJCWNyeXB0b19mcmVlX2Jsa2NpcGhlcihfcHJpdi0+cnhfdGZtX2FyYzQpOworCX0KKwkjZW5kaWYKKwlrZnJlZShwcml2KTsKK30KKworCitzdGF0aWMgaW5saW5lIHUxNiBSb3RSMSh1MTYgdmFsKQoreworCXJldHVybiAodmFsID4+IDEpIHwgKHZhbCA8PCAxNSk7Cit9CisKKworc3RhdGljIGlubGluZSB1OCBMbzgodTE2IHZhbCkKK3sKKwlyZXR1cm4gdmFsICYgMHhmZjsKK30KKworCitzdGF0aWMgaW5saW5lIHU4IEhpOCh1MTYgdmFsKQoreworCXJldHVybiB2YWwgPj4gODsKK30KKworCitzdGF0aWMgaW5saW5lIHUxNiBMbzE2KHUzMiB2YWwpCit7CisJcmV0dXJuIHZhbCAmIDB4ZmZmZjsKK30KKworCitzdGF0aWMgaW5saW5lIHUxNiBIaTE2KHUzMiB2YWwpCit7CisJcmV0dXJuIHZhbCA+PiAxNjsKK30KKworCitzdGF0aWMgaW5saW5lIHUxNiBNazE2KHU4IGhpLCB1OCBsbykKK3sKKwlyZXR1cm4gbG8gfCAoKCh1MTYpIGhpKSA8PCA4KTsKK30KKworCitzdGF0aWMgaW5saW5lIHUxNiBNazE2X2xlKHUxNiAqdikKK3sKKwlyZXR1cm4gbGUxNl90b19jcHUoKnYpOworfQorCisKK3N0YXRpYyBjb25zdCB1MTYgU2JveFsyNTZdID0KK3sKKwkweEM2QTUsIDB4Rjg4NCwgMHhFRTk5LCAweEY2OEQsIDB4RkYwRCwgMHhENkJELCAweERFQjEsIDB4OTE1NCwKKwkweDYwNTAsIDB4MDIwMywgMHhDRUE5LCAweDU2N0QsIDB4RTcxOSwgMHhCNTYyLCAweDRERTYsIDB4RUM5QSwKKwkweDhGNDUsIDB4MUY5RCwgMHg4OTQwLCAweEZBODcsIDB4RUYxNSwgMHhCMkVCLCAweDhFQzksIDB4RkIwQiwKKwkweDQxRUMsIDB4QjM2NywgMHg1RkZELCAweDQ1RUEsIDB4MjNCRiwgMHg1M0Y3LCAweEU0OTYsIDB4OUI1QiwKKwkweDc1QzIsIDB4RTExQywgMHgzREFFLCAweDRDNkEsIDB4NkM1QSwgMHg3RTQxLCAweEY1MDIsIDB4ODM0RiwKKwkweDY4NUMsIDB4NTFGNCwgMHhEMTM0LCAweEY5MDgsIDB4RTI5MywgMHhBQjczLCAweDYyNTMsIDB4MkEzRiwKKwkweDA4MEMsIDB4OTU1MiwgMHg0NjY1LCAweDlENUUsIDB4MzAyOCwgMHgzN0ExLCAweDBBMEYsIDB4MkZCNSwKKwkweDBFMDksIDB4MjQzNiwgMHgxQjlCLCAweERGM0QsIDB4Q0QyNiwgMHg0RTY5LCAweDdGQ0QsIDB4RUE5RiwKKwkweDEyMUIsIDB4MUQ5RSwgMHg1ODc0LCAweDM0MkUsIDB4MzYyRCwgMHhEQ0IyLCAweEI0RUUsIDB4NUJGQiwKKwkweEE0RjYsIDB4NzY0RCwgMHhCNzYxLCAweDdEQ0UsIDB4NTI3QiwgMHhERDNFLCAweDVFNzEsIDB4MTM5NywKKwkweEE2RjUsIDB4Qjk2OCwgMHgwMDAwLCAweEMxMkMsIDB4NDA2MCwgMHhFMzFGLCAweDc5QzgsIDB4QjZFRCwKKwkweEQ0QkUsIDB4OEQ0NiwgMHg2N0Q5LCAweDcyNEIsIDB4OTRERSwgMHg5OEQ0LCAweEIwRTgsIDB4ODU0QSwKKwkweEJCNkIsIDB4QzUyQSwgMHg0RkU1LCAweEVEMTYsIDB4ODZDNSwgMHg5QUQ3LCAweDY2NTUsIDB4MTE5NCwKKwkweDhBQ0YsIDB4RTkxMCwgMHgwNDA2LCAweEZFODEsIDB4QTBGMCwgMHg3ODQ0LCAweDI1QkEsIDB4NEJFMywKKwkweEEyRjMsIDB4NURGRSwgMHg4MEMwLCAweDA1OEEsIDB4M0ZBRCwgMHgyMUJDLCAweDcwNDgsIDB4RjEwNCwKKwkweDYzREYsIDB4NzdDMSwgMHhBRjc1LCAweDQyNjMsIDB4MjAzMCwgMHhFNTFBLCAweEZEMEUsIDB4QkY2RCwKKwkweDgxNEMsIDB4MTgxNCwgMHgyNjM1LCAweEMzMkYsIDB4QkVFMSwgMHgzNUEyLCAweDg4Q0MsIDB4MkUzOSwKKwkweDkzNTcsIDB4NTVGMiwgMHhGQzgyLCAweDdBNDcsIDB4QzhBQywgMHhCQUU3LCAweDMyMkIsIDB4RTY5NSwKKwkweEMwQTAsIDB4MTk5OCwgMHg5RUQxLCAweEEzN0YsIDB4NDQ2NiwgMHg1NDdFLCAweDNCQUIsIDB4MEI4MywKKwkweDhDQ0EsIDB4QzcyOSwgMHg2QkQzLCAweDI4M0MsIDB4QTc3OSwgMHhCQ0UyLCAweDE2MUQsIDB4QUQ3NiwKKwkweERCM0IsIDB4NjQ1NiwgMHg3NDRFLCAweDE0MUUsIDB4OTJEQiwgMHgwQzBBLCAweDQ4NkMsIDB4QjhFNCwKKwkweDlGNUQsIDB4QkQ2RSwgMHg0M0VGLCAweEM0QTYsIDB4MzlBOCwgMHgzMUE0LCAweEQzMzcsIDB4RjI4QiwKKwkweEQ1MzIsIDB4OEI0MywgMHg2RTU5LCAweERBQjcsIDB4MDE4QywgMHhCMTY0LCAweDlDRDIsIDB4NDlFMCwKKwkweEQ4QjQsIDB4QUNGQSwgMHhGMzA3LCAweENGMjUsIDB4Q0FBRiwgMHhGNDhFLCAweDQ3RTksIDB4MTAxOCwKKwkweDZGRDUsIDB4RjA4OCwgMHg0QTZGLCAweDVDNzIsIDB4MzgyNCwgMHg1N0YxLCAweDczQzcsIDB4OTc1MSwKKwkweENCMjMsIDB4QTE3QywgMHhFODlDLCAweDNFMjEsIDB4OTZERCwgMHg2MURDLCAweDBEODYsIDB4MEY4NSwKKwkweEUwOTAsIDB4N0M0MiwgMHg3MUM0LCAweENDQUEsIDB4OTBEOCwgMHgwNjA1LCAweEY3MDEsIDB4MUMxMiwKKwkweEMyQTMsIDB4NkE1RiwgMHhBRUY5LCAweDY5RDAsIDB4MTc5MSwgMHg5OTU4LCAweDNBMjcsIDB4MjdCOSwKKwkweEQ5MzgsIDB4RUIxMywgMHgyQkIzLCAweDIyMzMsIDB4RDJCQiwgMHhBOTcwLCAweDA3ODksIDB4MzNBNywKKwkweDJEQjYsIDB4M0MyMiwgMHgxNTkyLCAweEM5MjAsIDB4ODc0OSwgMHhBQUZGLCAweDUwNzgsIDB4QTU3QSwKKwkweDAzOEYsIDB4NTlGOCwgMHgwOTgwLCAweDFBMTcsIDB4NjVEQSwgMHhENzMxLCAweDg0QzYsIDB4RDBCOCwKKwkweDgyQzMsIDB4MjlCMCwgMHg1QTc3LCAweDFFMTEsIDB4N0JDQiwgMHhBOEZDLCAweDZERDYsIDB4MkMzQSwKK307CisKKworc3RhdGljIGlubGluZSB1MTYgX1NfKHUxNiB2KQoreworCXUxNiB0ID0gU2JveFtIaTgodildOworCXJldHVybiBTYm94W0xvOCh2KV0gXiAoKHQgPDwgOCkgfCAodCA+PiA4KSk7Cit9CisKKyNpZm5kZWYgSk9ITl9US0lQCisjZGVmaW5lIFBIQVNFMV9MT09QX0NPVU5UIDgKKworc3RhdGljIHZvaWQgdGtpcF9taXhpbmdfcGhhc2UxKHUxNiAqVFRBSywgY29uc3QgdTggKlRLLCBjb25zdCB1OCAqVEEsIHUzMiBJVjMyKQoreworCWludCBpLCBqOworCisJLyogSW5pdGlhbGl6ZSB0aGUgODAtYml0IFRUQUsgZnJvbSBUU0MgKElWMzIpIGFuZCBUQVswLi41XSAqLworCVRUQUtbMF0gPSBMbzE2KElWMzIpOworCVRUQUtbMV0gPSBIaTE2KElWMzIpOworCVRUQUtbMl0gPSBNazE2KFRBWzFdLCBUQVswXSk7CisJVFRBS1szXSA9IE1rMTYoVEFbM10sIFRBWzJdKTsKKwlUVEFLWzRdID0gTWsxNihUQVs1XSwgVEFbNF0pOworCisJZm9yIChpID0gMDsgaSA8IFBIQVNFMV9MT09QX0NPVU5UOyBpKyspIHsKKwkJaiA9IDIgKiAoaSAmIDEpOworCQlUVEFLWzBdICs9IF9TXyhUVEFLWzRdIF4gTWsxNihUS1sxICsgal0sIFRLWzAgKyBqXSkpOworCQlUVEFLWzFdICs9IF9TXyhUVEFLWzBdIF4gTWsxNihUS1s1ICsgal0sIFRLWzQgKyBqXSkpOworCQlUVEFLWzJdICs9IF9TXyhUVEFLWzFdIF4gTWsxNihUS1s5ICsgal0sIFRLWzggKyBqXSkpOworCQlUVEFLWzNdICs9IF9TXyhUVEFLWzJdIF4gTWsxNihUS1sxMyArIGpdLCBUS1sxMiArIGpdKSk7CisJCVRUQUtbNF0gKz0gX1NfKFRUQUtbM10gXiBNazE2KFRLWzEgKyBqXSwgVEtbMCArIGpdKSkgKyBpOworCX0KK30KKworCitzdGF0aWMgdm9pZCB0a2lwX21peGluZ19waGFzZTIodTggKldFUFNlZWQsIGNvbnN0IHU4ICpUSywgY29uc3QgdTE2ICpUVEFLLAorCQkJICAgICAgIHUxNiBJVjE2KQoreworCS8qIE1ha2UgdGVtcG9yYXJ5IGFyZWEgb3ZlcmxhcCBXRVAgc2VlZCBzbyB0aGF0IHRoZSBmaW5hbCBjb3B5IGNhbiBiZQorCSAqIGF2b2lkZWQgb24gbGl0dGxlIGVuZGlhbiBob3N0cy4gKi8KKwl1MTYgKlBQSyA9ICh1MTYgKikgJldFUFNlZWRbNF07CisKKwkvKiBTdGVwIDEgLSBtYWtlIGNvcHkgb2YgVFRBSyBhbmQgYnJpbmcgaW4gVFNDICovCisJUFBLWzBdID0gVFRBS1swXTsKKwlQUEtbMV0gPSBUVEFLWzFdOworCVBQS1syXSA9IFRUQUtbMl07CisJUFBLWzNdID0gVFRBS1szXTsKKwlQUEtbNF0gPSBUVEFLWzRdOworCVBQS1s1XSA9IFRUQUtbNF0gKyBJVjE2OworCisJLyogU3RlcCAyIC0gOTYtYml0IGJpamVjdGl2ZSBtaXhpbmcgdXNpbmcgUy1ib3ggKi8KKwlQUEtbMF0gKz0gX1NfKFBQS1s1XSBeIE1rMTZfbGUoKHUxNiAqKSAmVEtbMF0pKTsKKwlQUEtbMV0gKz0gX1NfKFBQS1swXSBeIE1rMTZfbGUoKHUxNiAqKSAmVEtbMl0pKTsKKwlQUEtbMl0gKz0gX1NfKFBQS1sxXSBeIE1rMTZfbGUoKHUxNiAqKSAmVEtbNF0pKTsKKwlQUEtbM10gKz0gX1NfKFBQS1syXSBeIE1rMTZfbGUoKHUxNiAqKSAmVEtbNl0pKTsKKwlQUEtbNF0gKz0gX1NfKFBQS1szXSBeIE1rMTZfbGUoKHUxNiAqKSAmVEtbOF0pKTsKKwlQUEtbNV0gKz0gX1NfKFBQS1s0XSBeIE1rMTZfbGUoKHUxNiAqKSAmVEtbMTBdKSk7CisKKwlQUEtbMF0gKz0gUm90UjEoUFBLWzVdIF4gTWsxNl9sZSgodTE2ICopICZUS1sxMl0pKTsKKwlQUEtbMV0gKz0gUm90UjEoUFBLWzBdIF4gTWsxNl9sZSgodTE2ICopICZUS1sxNF0pKTsKKwlQUEtbMl0gKz0gUm90UjEoUFBLWzFdKTsKKwlQUEtbM10gKz0gUm90UjEoUFBLWzJdKTsKKwlQUEtbNF0gKz0gUm90UjEoUFBLWzNdKTsKKwlQUEtbNV0gKz0gUm90UjEoUFBLWzRdKTsKKworCS8qIFN0ZXAgMyAtIGJyaW5nIGluIGxhc3Qgb2YgVEsgYml0cywgYXNzaWduIDI0LWJpdCBXRVAgSVYgdmFsdWUKKwkgKiBXRVBTZWVkWzAuLjJdIGlzIHRyYW5zbWl0dGVkIGFzIFdFUCBJViAqLworCVdFUFNlZWRbMF0gPSBIaTgoSVYxNik7CisJV0VQU2VlZFsxXSA9IChIaTgoSVYxNikgfCAweDIwKSAmIDB4N0Y7CisJV0VQU2VlZFsyXSA9IExvOChJVjE2KTsKKwlXRVBTZWVkWzNdID0gTG84KChQUEtbNV0gXiBNazE2X2xlKCh1MTYgKikgJlRLWzBdKSkgPj4gMSk7CisKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwl7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJUFBLW2ldID0gKFBQS1tpXSA8PCA4KSB8IChQUEtbaV0gPj4gOCk7CisJfQorI2VuZGlmCit9CisjZW5kaWYKK3N0YXRpYyBpbnQgaWVlZTgwMjExX3RraXBfZW5jcnlwdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdikKK3sKKyAgICAgICAgc3RydWN0IGllZWU4MDIxMV90a2lwX2RhdGEgKnRrZXkgPSBwcml2OworICAgICAgICAjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjEpKXx8KElOX09QRU5TVVNFX1NMRUQpKQorICAgICAgICBzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgZGVzYyA9IHsudGZtID0gdGtleS0+dHhfdGZtX2FyYzR9OworICAgICAgICAjZW5kaWYKKwlpbnQgbGVuOworCXU4ICAqcG9zOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisjaWZuZGVmIEpPSE5fVEtJUAorCXU4IHJjNGtleVsxNl0sKmljdjsKKwl1MzIgY3JjOworCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKKyNlbmRpZgorCWludCByZXQ7CisKKwlyZXQgPSAwOworCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IDggfHwgc2tiX3RhaWxyb29tKHNrYikgPCA0IHx8CisJICAgIHNrYi0+bGVuIDwgaGRyX2xlbikKKwkJcmV0dXJuIC0xOworCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKKyNpZiAwCitwcmludGsoIkBAIHRrZXlcbiIpOworcHJpbnRrKCIleHwiLCAoKHUzMiopdGtleS0+a2V5KVswXSk7CitwcmludGsoIiV4fCIsICgodTMyKil0a2V5LT5rZXkpWzFdKTsKK3ByaW50aygiJXh8IiwgKCh1MzIqKXRrZXktPmtleSlbMl0pOworcHJpbnRrKCIleHwiLCAoKHUzMiopdGtleS0+a2V5KVszXSk7CitwcmludGsoIiV4fCIsICgodTMyKil0a2V5LT5rZXkpWzRdKTsKK3ByaW50aygiJXh8IiwgKCh1MzIqKXRrZXktPmtleSlbNV0pOworcHJpbnRrKCIleHwiLCAoKHUzMiopdGtleS0+a2V5KVs2XSk7CitwcmludGsoIiV4XG4iLCAoKHUzMiopdGtleS0+a2V5KVs3XSk7CisjZW5kaWYKKworI2lmbmRlZiBKT0hOX1RLSVAKKwlpZiAoIXRrZXktPnR4X3BoYXNlMV9kb25lKSB7CisJCXRraXBfbWl4aW5nX3BoYXNlMSh0a2V5LT50eF90dGFrLCB0a2V5LT5rZXksIGhkci0+YWRkcjIsCisJCQkJICAgdGtleS0+dHhfaXYzMik7CisJCXRrZXktPnR4X3BoYXNlMV9kb25lID0gMTsKKwl9CisJdGtpcF9taXhpbmdfcGhhc2UyKHJjNGtleSwgdGtleS0+a2V5LCB0a2V5LT50eF90dGFrLCB0a2V5LT50eF9pdjE2KTsKKworI2Vsc2UKKwl0a2V5LT50eF9waGFzZTFfZG9uZSA9IDE7CisjZW5kaWYgIC8qSk9ITl9US0lQKi8KKworCWxlbiA9IHNrYi0+bGVuIC0gaGRyX2xlbjsKKwlwb3MgPSBza2JfcHVzaChza2IsIDgpOworCW1lbW1vdmUocG9zLCBwb3MgKyA4LCBoZHJfbGVuKTsKKwlwb3MgKz0gaGRyX2xlbjsKKworI2lmZGVmIEpPSE5fVEtJUAorCSpwb3MrKyA9IEhpOCh0a2V5LT50eF9pdjE2KTsKKwkqcG9zKysgPSAoSGk4KHRrZXktPnR4X2l2MTYpIHwgMHgyMCkgJiAweDdGOworCSpwb3MrKyA9IExvOCh0a2V5LT50eF9pdjE2KTsKKyNlbHNlCisJKnBvcysrID0gcmM0a2V5WzBdOworCSpwb3MrKyA9IHJjNGtleVsxXTsKKwkqcG9zKysgPSByYzRrZXlbMl07CisjZW5kaWYKKwkqcG9zKysgPSAodGtleS0+a2V5X2lkeCA8PCA2KSB8ICgxIDw8IDUpIC8qIEV4dCBJViBpbmNsdWRlZCAqLzsKKwkqcG9zKysgPSB0a2V5LT50eF9pdjMyICYgMHhmZjsKKwkqcG9zKysgPSAodGtleS0+dHhfaXYzMiA+PiA4KSAmIDB4ZmY7CisJKnBvcysrID0gKHRrZXktPnR4X2l2MzIgPj4gMTYpICYgMHhmZjsKKwkqcG9zKysgPSAodGtleS0+dHhfaXYzMiA+PiAyNCkgJiAweGZmOworI2lmbmRlZiBKT0hOX1RLSVAKKwlpY3YgPSBza2JfcHV0KHNrYiwgNCk7CisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKKwljcmMgPSB+Y3JjMzJfbGUofjAsIHBvcywgbGVuKTsKKyNlbHNlCisJY3JjID0gfmV0aGVyX2NyY19sZShsZW4sIHBvcyk7CisjZW5kaWYKKwlpY3ZbMF0gPSBjcmM7CisJaWN2WzFdID0gY3JjID4+IDg7CisJaWN2WzJdID0gY3JjID4+IDE2OworCWljdlszXSA9IGNyYyA+PiAyNDsKKyAgICAgICNpZigoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkmJighSU5fT1BFTlNVU0VfU0xFRCkpCisJY3J5cHRvX2NpcGhlcl9zZXRrZXkodGtleS0+dGZtX2FyYzQsIHJjNGtleSwgMTYpOworCXNnLnBhZ2UgPSB2aXJ0X3RvX3BhZ2UocG9zKTsKKwlzZy5vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShwb3MpOworCXNnLmxlbmd0aCA9IGxlbiArIDQ7CisJY3J5cHRvX2NpcGhlcl9lbmNyeXB0KHRrZXktPnRmbV9hcmM0LCAmc2csICZzZywgbGVuICsgNCk7CisgICAgICAjZWxzZQorCWNyeXB0b19ibGtjaXBoZXJfc2V0a2V5KHRrZXktPnR4X3RmbV9hcmM0LCByYzRrZXksIDE2KTsKKyAgICAgICAgI2lmKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkpCisgICAgICAgICAgc2cucGFnZSA9IHZpcnRfdG9fcGFnZShwb3MpOworICAgICAgICAgIHNnLm9mZnNldCA9IG9mZnNldF9pbl9wYWdlKHBvcyk7CisgICAgICAgICAgc2cubGVuZ3RoID0gbGVuICsgNDsKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgICBzZ19pbml0X29uZSgmc2csIHBvcywgbGVuKzQpOworICAgICAgICAjZW5kaWYKKwlyZXQ9IGNyeXB0b19ibGtjaXBoZXJfZW5jcnlwdCgmZGVzYywgJnNnLCAmc2csIGxlbiArIDQpOworICAgICAgI2VuZGlmCisjZW5kaWYKKwl0a2V5LT50eF9pdjE2Kys7CisJaWYgKHRrZXktPnR4X2l2MTYgPT0gMCkgeworCQl0a2V5LT50eF9waGFzZTFfZG9uZSA9IDA7CisJCXRrZXktPnR4X2l2MzIrKzsKKwl9CisjaWZuZGVmIEpPSE5fVEtJUAorICAgICAgI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpJiYoIUlOX09QRU5TVVNFX1NMRUQpKQorCSAgIHJldHVybiAwOworICAgICAgI2Vsc2UKKwkgICByZXR1cm4gcmV0OworICAgICAgI2VuZGlmCisjZWxzZQorCXJldHVybiAwOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX3RraXBfZGVjcnlwdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdikKK3sKKyAgICAgICAgc3RydWN0IGllZWU4MDIxMV90a2lwX2RhdGEgKnRrZXkgPSBwcml2OworICAgICAgICAjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjEpKSB8fChJTl9PUEVOU1VTRV9TTEVEKSkKKyAgICAgICAgc3RydWN0IGJsa2NpcGhlcl9kZXNjIGRlc2MgPSB7LnRmbSA9IHRrZXktPnJ4X3RmbV9hcmM0fTsKKyAgICAgICAgI2VuZGlmCisJdTgga2V5aWR4LCAqcG9zOworCXUzMiBpdjMyOworCXUxNiBpdjE2OworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisjaWZuZGVmIEpPSE5fVEtJUAorCXU4IGljdls0XTsKKwl1MzIgY3JjOworCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKKwl1OCByYzRrZXlbMTZdOworCWludCBwbGVuOworI2VuZGlmCisJaWYgKHNrYi0+bGVuIDwgaGRyX2xlbiArIDggKyA0KQorCQlyZXR1cm4gLTE7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworCXBvcyA9IHNrYi0+ZGF0YSArIGhkcl9sZW47CisJa2V5aWR4ID0gcG9zWzNdOworCWlmICghKGtleWlkeCAmICgxIDw8IDUpKSkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiVEtJUDogcmVjZWl2ZWQgcGFja2V0IHdpdGhvdXQgRXh0SVYiCisJCQkgICAgICAgIiBmbGFnIGZyb20gIiBNQUNfRk1UICJcbiIsIE1BQ19BUkcoaGRyLT5hZGRyMikpOworCQl9CisJCXJldHVybiAtMjsKKwl9CisJa2V5aWR4ID4+PSA2OworCWlmICh0a2V5LT5rZXlfaWR4ICE9IGtleWlkeCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiVEtJUDogUlggdGtleS0+a2V5X2lkeD0lZCBmcmFtZSAiCisJCSAgICAgICAia2V5aWR4PSVkIHByaXY9JXBcbiIsIHRrZXktPmtleV9pZHgsIGtleWlkeCwgcHJpdik7CisJCXJldHVybiAtNjsKKwl9CisJaWYgKCF0a2V5LT5rZXlfc2V0KSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJUS0lQOiByZWNlaXZlZCBwYWNrZXQgZnJvbSAiIE1BQ19GTVQKKwkJCSAgICAgICAiIHdpdGgga2V5aWQ9JWQgdGhhdCBkb2VzIG5vdCBoYXZlIGEgY29uZmlndXJlZCIKKwkJCSAgICAgICAiIGtleVxuIiwgTUFDX0FSRyhoZHItPmFkZHIyKSwga2V5aWR4KTsKKwkJfQorCQlyZXR1cm4gLTM7CisJfQorCWl2MTYgPSAocG9zWzBdIDw8IDgpIHwgcG9zWzJdOworCWl2MzIgPSBwb3NbNF0gfCAocG9zWzVdIDw8IDgpIHwgKHBvc1s2XSA8PCAxNikgfCAocG9zWzddIDw8IDI0KTsKKwlwb3MgKz0gODsKKyNpZm5kZWYgSk9ITl9US0lQCisKKwlpZiAoaXYzMiA8IHRrZXktPnJ4X2l2MzIgfHwKKwkgICAgKGl2MzIgPT0gdGtleS0+cnhfaXYzMiAmJiBpdjE2IDw9IHRrZXktPnJ4X2l2MTYpKSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJUS0lQOiByZXBsYXkgZGV0ZWN0ZWQ6IFNUQT0iIE1BQ19GTVQKKwkJCSAgICAgICAiIHByZXZpb3VzIFRTQyAlMDh4JTA0eCByZWNlaXZlZCBUU0MgIgorCQkJICAgICAgICIlMDh4JTA0eFxuIiwgTUFDX0FSRyhoZHItPmFkZHIyKSwKKwkJCSAgICAgICB0a2V5LT5yeF9pdjMyLCB0a2V5LT5yeF9pdjE2LCBpdjMyLCBpdjE2KTsKKwkJfQorCQl0a2V5LT5kb3QxMVJTTkFTdGF0c1RLSVBSZXBsYXlzKys7CisJCXJldHVybiAtNDsKKwl9CisKKwlpZiAoaXYzMiAhPSB0a2V5LT5yeF9pdjMyIHx8ICF0a2V5LT5yeF9waGFzZTFfZG9uZSkgeworCQl0a2lwX21peGluZ19waGFzZTEodGtleS0+cnhfdHRhaywgdGtleS0+a2V5LCBoZHItPmFkZHIyLCBpdjMyKTsKKwkJdGtleS0+cnhfcGhhc2UxX2RvbmUgPSAxOworCX0KKwl0a2lwX21peGluZ19waGFzZTIocmM0a2V5LCB0a2V5LT5rZXksIHRrZXktPnJ4X3R0YWssIGl2MTYpOworCisJcGxlbiA9IHNrYi0+bGVuIC0gaGRyX2xlbiAtIDEyOworICAgICAgICNpZigoTElOVVhfVkVSU0lPTl9DT0RFIDxLRVJORUxfVkVSU0lPTigyLDYsMjEpKSYmKCFJTl9PUEVOU1VTRV9TTEVEKSkKKwljcnlwdG9fY2lwaGVyX3NldGtleSh0a2V5LT50Zm1fYXJjNCwgcmM0a2V5LCAxNik7CisJc2cucGFnZSA9IHZpcnRfdG9fcGFnZShwb3MpOworCXNnLm9mZnNldCA9IG9mZnNldF9pbl9wYWdlKHBvcyk7CisJc2cubGVuZ3RoID0gcGxlbiArIDQ7CisJY3J5cHRvX2NpcGhlcl9kZWNyeXB0KHRrZXktPnRmbV9hcmM0LCAmc2csICZzZywgcGxlbiArIDQpOworCSNlbHNlCisJY3J5cHRvX2Jsa2NpcGhlcl9zZXRrZXkodGtleS0+cnhfdGZtX2FyYzQsIHJjNGtleSwgMTYpOworICAgICAgICAjaWYoTElOVVhfVkVSU0lPTl9DT0RFIDxLRVJORUxfVkVSU0lPTigyLDYsMjQpKQorICAgICAgICAgIHNnLnBhZ2UgPSB2aXJ0X3RvX3BhZ2UocG9zKTsKKyAgICAgICAgICBzZy5vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShwb3MpOworICAgICAgICAgIHNnLmxlbmd0aCA9IHBsZW4gKyA0OworICAgICAgICAjZWxzZQorICAgICAgICAgIHNnX2luaXRfb25lKCZzZywgcG9zLCBwbGVuKzQpOworICAgICAgICAjZW5kaWYKKwlpZiAoY3J5cHRvX2Jsa2NpcGhlcl9kZWNyeXB0KCZkZXNjLCAmc2csICZzZywgcGxlbiArIDQpKSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICI6IFRLSVA6IGZhaWxlZCB0byBkZWNyeXB0ICIKKwkJCSAgICAgICAicmVjZWl2ZWQgcGFja2V0IGZyb20gIiBNQUNfRk1UICJcbiIsCisJCQkgICAgICAgTUFDX0FSRyhoZHItPmFkZHIyKSk7CisJCX0KKwkJcmV0dXJuIC03OworCX0KKwkjZW5kaWYKKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsMCkpCisJY3JjID0gfmNyYzMyX2xlKH4wLCBwb3MsIHBsZW4pOworI2Vsc2UKKwljcmMgPSB+ZXRoZXJfY3JjX2xlKHBsZW4sIHBvcyk7CisjZW5kaWYKKwlpY3ZbMF0gPSBjcmM7CisJaWN2WzFdID0gY3JjID4+IDg7CisJaWN2WzJdID0gY3JjID4+IDE2OworCWljdlszXSA9IGNyYyA+PiAyNDsKKwlpZiAobWVtY21wKGljdiwgcG9zICsgcGxlbiwgNCkgIT0gMCkgeworCQlpZiAoaXYzMiAhPSB0a2V5LT5yeF9pdjMyKSB7CisJCQkvKiBQcmV2aW91c2x5IGNhY2hlZCBQaGFzZTEgcmVzdWx0IHdhcyBhbHJlYWR5IGxvc3QsIHNvCisJCQkgKiBpdCBuZWVkcyB0byBiZSByZWNhbGN1bGF0ZWQgZm9yIHRoZSBuZXh0IHBhY2tldC4gKi8KKwkJCXRrZXktPnJ4X3BoYXNlMV9kb25lID0gMDsKKwkJfQorCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiVEtJUDogSUNWIGVycm9yIGRldGVjdGVkOiBTVEE9IgorCQkJICAgICAgIE1BQ19GTVQgIlxuIiwgTUFDX0FSRyhoZHItPmFkZHIyKSk7CisJCX0KKwkJdGtleS0+ZG90MTFSU05BU3RhdHNUS0lQSUNWRXJyb3JzKys7CisJCXJldHVybiAtNTsKKwl9CisKKyNlbmRpZiAJLyogSk9ITl9US0lQICovCisKKwkvKiBVcGRhdGUgcmVhbCBjb3VudGVycyBvbmx5IGFmdGVyIE1pY2hhZWwgTUlDIHZlcmlmaWNhdGlvbiBoYXMKKwkgKiBjb21wbGV0ZWQgKi8KKwl0a2V5LT5yeF9pdjMyX25ldyA9IGl2MzI7CisJdGtleS0+cnhfaXYxNl9uZXcgPSBpdjE2OworCisJLyogUmVtb3ZlIElWIGFuZCBJQ1YgKi8KKwltZW1tb3ZlKHNrYi0+ZGF0YSArIDgsIHNrYi0+ZGF0YSwgaGRyX2xlbik7CisJc2tiX3B1bGwoc2tiLCA4KTsKKwlza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gNCk7CisKKy8vam9obidzIHRlc3QKKyNpZmRlZiBKT0hOX0RVTVAKK2lmKCAoKHUxNiopc2tiLT5kYXRhKVswXSAmIDB4NDAwMCl7CisgICAgICAgIHByaW50aygiQEAgcnggZGVjcnlwdGVkIHNrYi0+ZGF0YSIpOworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yKGk9MDtpPHNrYi0+bGVuO2krKyl7CisgICAgICAgICAgICAgICAgaWYoIChpJTI0KT09MCApIHByaW50aygiXG4iKTsKKyAgICAgICAgICAgICAgICBwcmludGsoIiUyeCAiLCAoKHU4Kilza2ItPmRhdGEpW2ldKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGsoIlxuIik7Cit9CisjZW5kaWYgLypKT0hOX0RVTVAqLworCXJldHVybiBrZXlpZHg7Cit9CisKKyNpZigoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkgJiYgKCFJTl9PUEVOU1VTRV9TTEVEKSkKK3N0YXRpYyBpbnQgbWljaGFlbF9taWMoc3RydWN0IGllZWU4MDIxMV90a2lwX2RhdGEgKnRrZXksIHU4ICprZXksIHU4ICpoZHIsCisJCSAgICAgICB1OCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuLCB1OCAqbWljKQoreworCXN0cnVjdCBzY2F0dGVybGlzdCBzZ1syXTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorCXN0cnVjdCBoYXNoX2Rlc2MgZGVzYzsKKwlpbnQgcmV0PTA7CisjZW5kaWYKKwlpZiAodGtleS0+dGZtX21pY2hhZWwgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtaWNoYWVsX21pYzogdGZtX21pY2hhZWwgPT0gTlVMTFxuIik7CisJCXJldHVybiAtMTsKKwl9CisJc2dbMF0ucGFnZSA9IHZpcnRfdG9fcGFnZShoZHIpOworCXNnWzBdLm9mZnNldCA9IG9mZnNldF9pbl9wYWdlKGhkcik7CisJc2dbMF0ubGVuZ3RoID0gMTY7CisKKwlzZ1sxXS5wYWdlID0gdmlydF90b19wYWdlKGRhdGEpOworCXNnWzFdLm9mZnNldCA9IG9mZnNldF9pbl9wYWdlKGRhdGEpOworCXNnWzFdLmxlbmd0aCA9IGRhdGFfbGVuOworCisJLy9jcnlwdG9fZGlnZXN0X2luaXQodGtleS0+dGZtX21pY2hhZWwpOworCS8vY3J5cHRvX2RpZ2VzdF9zZXRrZXkodGtleS0+dGZtX21pY2hhZWwsIGtleSwgOCk7CisJLy9jcnlwdG9fZGlnZXN0X3VwZGF0ZSh0a2V5LT50Zm1fbWljaGFlbCwgc2csIDIpOworCS8vY3J5cHRvX2RpZ2VzdF9maW5hbCh0a2V5LT50Zm1fbWljaGFlbCwgbWljKTsKKworCS8vcmV0dXJuIDA7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorCWNyeXB0b19kaWdlc3RfaW5pdCh0a2V5LT50Zm1fbWljaGFlbCk7CisJY3J5cHRvX2RpZ2VzdF9zZXRrZXkodGtleS0+dGZtX21pY2hhZWwsIGtleSwgOCk7CisJY3J5cHRvX2RpZ2VzdF91cGRhdGUodGtleS0+dGZtX21pY2hhZWwsIHNnLCAyKTsKKwljcnlwdG9fZGlnZXN0X2ZpbmFsKHRrZXktPnRmbV9taWNoYWVsLCBtaWMpOworCisJcmV0dXJuIDA7CisjZWxzZQoraWYgKGNyeXB0b19oYXNoX3NldGtleSh0a2V5LT50Zm1fbWljaGFlbCwga2V5LCA4KSkKKwkJcmV0dXJuIC0xOworCisvLwlyZXR1cm4gMDsKKwlkZXNjLnRmbSA9IHRrZXktPnRmbV9taWNoYWVsOworCWRlc2MuZmxhZ3MgPSAwOworCXJldCA9IGNyeXB0b19oYXNoX2RpZ2VzdCgmZGVzYywgc2csIGRhdGFfbGVuICsgMTYsIG1pYyk7CisJcmV0dXJuIHJldDsKKyNlbmRpZgorfQorI2Vsc2UKK3N0YXRpYyBpbnQgbWljaGFlbF9taWMoc3RydWN0IGNyeXB0b19oYXNoICp0Zm1fbWljaGFlbCwgdTggKiBrZXksIHU4ICogaGRyLAorICAgICAgICAgICAgICAgICAgICAgICB1OCAqIGRhdGEsIHNpemVfdCBkYXRhX2xlbiwgdTggKiBtaWMpCit7CisgICAgICAgIHN0cnVjdCBoYXNoX2Rlc2MgZGVzYzsKKyAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0IHNnWzJdOworCisgICAgICAgIGlmICh0Zm1fbWljaGFlbCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAibWljaGFlbF9taWM6IHRmbV9taWNoYWVsID09IE5VTExcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICAjaWYoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI0KSkKKyAgICAgICAgICBzZ1swXS5wYWdlID0gdmlydF90b19wYWdlKGhkcik7CisgICAgICAgICAgc2dbMF0ub2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UoaGRyKTsKKyAgICAgICAgICBzZ1swXS5sZW5ndGggPSAxNjsKKyAgICAgICAgICBzZ1sxXS5wYWdlID0gdmlydF90b19wYWdlKGRhdGEpOworICAgICAgICAgIHNnWzFdLm9mZnNldCA9IG9mZnNldF9pbl9wYWdlKGRhdGEpOworICAgICAgICAgIHNnWzFdLmxlbmd0aCA9IGRhdGFfbGVuOworICAgICAgICAjZWxzZQorICAgICAgICAgIHNnX2luaXRfdGFibGUoc2csIDIpOworICAgICAgICAgIHNnX3NldF9idWYoJnNnWzBdLCBoZHIsIDE2KTsKKyAgICAgICAgICBzZ19zZXRfYnVmKCZzZ1sxXSwgZGF0YSwgZGF0YV9sZW4pOworICAgICAgICAjZW5kaWYKKworICAgICAgICBpZiAoY3J5cHRvX2hhc2hfc2V0a2V5KHRmbV9taWNoYWVsLCBrZXksIDgpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICBkZXNjLnRmbSA9IHRmbV9taWNoYWVsOworICAgICAgICBkZXNjLmZsYWdzID0gMDsKKyAgICAgICAgcmV0dXJuIGNyeXB0b19oYXNoX2RpZ2VzdCgmZGVzYywgc2csIGRhdGFfbGVuICsgMTYsIG1pYyk7Cit9CisjZW5kaWYKKworCisKK3N0YXRpYyB2b2lkIG1pY2hhZWxfbWljX2hkcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCAqaGRyKQoreworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIxMTsKKworCWhkcjExID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKKwlzd2l0Y2ggKGxlMTZfdG9fY3B1KGhkcjExLT5mcmFtZV9jdGwpICYKKwkJKElFRUU4MDIxMV9GQ1RMX0ZST01EUyB8IElFRUU4MDIxMV9GQ1RMX1RPRFMpKSB7CisJY2FzZSBJRUVFODAyMTFfRkNUTF9UT0RTOgorCQltZW1jcHkoaGRyLCBoZHIxMS0+YWRkcjMsIEVUSF9BTEVOKTsgLyogREEgKi8KKwkJbWVtY3B5KGhkciArIEVUSF9BTEVOLCBoZHIxMS0+YWRkcjIsIEVUSF9BTEVOKTsgLyogU0EgKi8KKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfRkNUTF9GUk9NRFM6CisJCW1lbWNweShoZHIsIGhkcjExLT5hZGRyMSwgRVRIX0FMRU4pOyAvKiBEQSAqLworCQltZW1jcHkoaGRyICsgRVRIX0FMRU4sIGhkcjExLT5hZGRyMywgRVRIX0FMRU4pOyAvKiBTQSAqLworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9GQ1RMX0ZST01EUyB8IElFRUU4MDIxMV9GQ1RMX1RPRFM6CisJCW1lbWNweShoZHIsIGhkcjExLT5hZGRyMywgRVRIX0FMRU4pOyAvKiBEQSAqLworCQltZW1jcHkoaGRyICsgRVRIX0FMRU4sIGhkcjExLT5hZGRyNCwgRVRIX0FMRU4pOyAvKiBTQSAqLworCQlicmVhazsKKwljYXNlIDA6CisJCW1lbWNweShoZHIsIGhkcjExLT5hZGRyMSwgRVRIX0FMRU4pOyAvKiBEQSAqLworCQltZW1jcHkoaGRyICsgRVRIX0FMRU4sIGhkcjExLT5hZGRyMiwgRVRIX0FMRU4pOyAvKiBTQSAqLworCQlicmVhazsKKwl9CisKKwloZHJbMTJdID0gMDsgLyogcHJpb3JpdHkgKi8KKworCWhkclsxM10gPSBoZHJbMTRdID0gaGRyWzE1XSA9IDA7IC8qIHJlc2VydmVkICovCit9CisKKworc3RhdGljIGludCBpZWVlODAyMTFfbWljaGFlbF9taWNfYWRkKHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJfbGVuLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBpZWVlODAyMTFfdGtpcF9kYXRhICp0a2V5ID0gcHJpdjsKKwl1OCAqcG9zOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworCisJaWYgKHNrYl90YWlscm9vbShza2IpIDwgOCB8fCBza2ItPmxlbiA8IGhkcl9sZW4pIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkludmFsaWQgcGFja2V0IGZvciBNaWNoYWVsIE1JQyBhZGQgIgorCQkgICAgICAgIih0YWlscm9vbT0lZCBoZHJfbGVuPSVkIHNrYi0+bGVuPSVkKVxuIiwKKwkJICAgICAgIHNrYl90YWlscm9vbShza2IpLCBoZHJfbGVuLCBza2ItPmxlbik7CisJCXJldHVybiAtMTsKKwl9CisKKwltaWNoYWVsX21pY19oZHIoc2tiLCB0a2V5LT50eF9oZHIpOworCisJLy8geyBkYXZpZCwgMjAwNi45LjEKKwkvLyBmaXggdGhlIHdwYSBwcm9jZXNzIHdpdGggd21tIGVuYWJsZWQuCisJaWYoSUVFRTgwMjExX1FPU19IQVNfU0VRKGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKSkpIHsKKwkJdGtleS0+dHhfaGRyWzEyXSA9ICooc2tiLT5kYXRhICsgaGRyX2xlbiAtIDIpICYgMHgwNzsKKwl9CisJLy8gfQorCXBvcyA9IHNrYl9wdXQoc2tiLCA4KTsKKyAgICAgICAgI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKSYmKCFJTl9PUEVOU1VTRV9TTEVEKSkKKwlpZiAobWljaGFlbF9taWModGtleSwgJnRrZXktPmtleVsxNl0sIHRrZXktPnR4X2hkciwKKwkJCXNrYi0+ZGF0YSArIGhkcl9sZW4sIHNrYi0+bGVuIC0gOCAtIGhkcl9sZW4sIHBvcykpCisgICAgICAgICNlbHNlCisgICAgICAgIGlmIChtaWNoYWVsX21pYyh0a2V5LT50eF90Zm1fbWljaGFlbCwgJnRrZXktPmtleVsxNl0sIHRrZXktPnR4X2hkciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNrYi0+ZGF0YSArIGhkcl9sZW4sIHNrYi0+bGVuIC0gOCAtIGhkcl9sZW4sIHBvcykpCisgICAgICAgICNlbmRpZgorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKworCisjaWYgV0lSRUxFU1NfRVhUID49IDE4CitzdGF0aWMgdm9pZCBpZWVlODAyMTFfbWljaGFlbF9taWNfZmFpbHVyZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAorCQkJCSAgICAgICBpbnQga2V5aWR4KQoreworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwlzdHJ1Y3QgaXdfbWljaGFlbG1pY2ZhaWx1cmUgZXY7CisKKwkvKiBUT0RPOiBuZWVkZWQgcGFyYW1ldGVyczogY291bnQsIGtleWlkLCBrZXkgdHlwZSwgVFNDICovCisJbWVtc2V0KCZldiwgMCwgc2l6ZW9mKGV2KSk7CisJZXYuZmxhZ3MgPSBrZXlpZHggJiBJV19NSUNGQUlMVVJFX0tFWV9JRDsKKwlpZiAoaGRyLT5hZGRyMVswXSAmIDB4MDEpCisJCWV2LmZsYWdzIHw9IElXX01JQ0ZBSUxVUkVfR1JPVVA7CisJZWxzZQorCQlldi5mbGFncyB8PSBJV19NSUNGQUlMVVJFX1BBSVJXSVNFOworCWV2LnNyY19hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwltZW1jcHkoZXYuc3JjX2FkZHIuc2FfZGF0YSwgaGRyLT5hZGRyMiwgRVRIX0FMRU4pOworCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKwl3cnF1LmRhdGEubGVuZ3RoID0gc2l6ZW9mKGV2KTsKKwl3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgSVdFVk1JQ0hBRUxNSUNGQUlMVVJFLCAmd3JxdSwgKGNoYXIgKikgJmV2KTsKK30KKyNlbGlmIFdJUkVMRVNTX0VYVCA+PSAxNQorc3RhdGljIHZvaWQgaWVlZTgwMjExX21pY2hhZWxfbWljX2ZhaWx1cmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwKKwkJCQkgICAgICAgaW50IGtleWlkeCkKK3sKKwl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisJY2hhciBidWZbMTI4XTsKKworCS8qIFRPRE86IG5lZWRlZCBwYXJhbWV0ZXJzOiBjb3VudCwga2V5aWQsIGtleSB0eXBlLCBUU0MgKi8KKwlzcHJpbnRmKGJ1ZiwgIk1MTUUtTUlDSEFFTE1JQ0ZBSUxVUkUuaW5kaWNhdGlvbihrZXlpZD0lZCAlc2Nhc3QgYWRkcj0iCisJCU1BQ19GTVQgIikiLCBrZXlpZHgsIGhkci0+YWRkcjFbMF0gJiAweDAxID8gImJyb2FkIiA6ICJ1bmkiLAorCQlNQUNfQVJHKGhkci0+YWRkcjIpKTsKKwltZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisJd3JxdS5kYXRhLmxlbmd0aCA9IHN0cmxlbihidWYpOworCXdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgYnVmKTsKK30KKyNlbHNlIC8qIFdJUkVMRVNTX0VYVCA+PSAxNSAqLworc3RhdGljIGlubGluZSB2b2lkIGllZWU4MDIxMV9taWNoYWVsX21pY19mYWlsdXJlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCisJCQkJCSAgICAgIGludCBrZXlpZHgpCit7Cit9CisjZW5kaWYgLyogV0lSRUxFU1NfRVhUID49IDE1ICovCisKKworc3RhdGljIGludCBpZWVlODAyMTFfbWljaGFlbF9taWNfdmVyaWZ5KHN0cnVjdCBza19idWZmICpza2IsIGludCBrZXlpZHgsCisJCQkJICAgICBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSAqdGtleSA9IHByaXY7CisJdTggbWljWzhdOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworCisJaWYgKCF0a2V5LT5rZXlfc2V0KQorCQlyZXR1cm4gLTE7CisKKwltaWNoYWVsX21pY19oZHIoc2tiLCB0a2V5LT5yeF9oZHIpOworCS8vIHsgZGF2aWQsIDIwMDYuOS4xCisJLy8gZml4IHRoZSB3cGEgcHJvY2VzcyB3aXRoIHdtbSBlbmFibGVkLgorCWlmKElFRUU4MDIxMV9RT1NfSEFTX1NFUShsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCkpKSB7CisJCXRrZXktPnJ4X2hkclsxMl0gPSAqKHNrYi0+ZGF0YSArIGhkcl9sZW4gLSAyKSAmIDB4MDc7CisJfQorCS8vIH0KKyAgICAgICAgI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKSYmKCFJTl9PUEVOU1VTRV9TTEVEKSkKKwlpZiAobWljaGFlbF9taWModGtleSwgJnRrZXktPmtleVsyNF0sIHRrZXktPnJ4X2hkciwKKwkJCXNrYi0+ZGF0YSArIGhkcl9sZW4sIHNrYi0+bGVuIC0gOCAtIGhkcl9sZW4sIG1pYykpCisgICAgICAgICNlbHNlCisJaWYgKG1pY2hhZWxfbWljKHRrZXktPnJ4X3RmbV9taWNoYWVsLCAmdGtleS0+a2V5WzI0XSwgdGtleS0+cnhfaGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgc2tiLT5kYXRhICsgaGRyX2xlbiwgc2tiLT5sZW4gLSA4IC0gaGRyX2xlbiwgbWljKSkKKyAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAJcmV0dXJuIC0xOworCWlmIChtZW1jbXAobWljLCBza2ItPmRhdGEgKyBza2ItPmxlbiAtIDgsIDgpICE9IDApIHsKKwkJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKwkJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBNaWNoYWVsIE1JQyB2ZXJpZmljYXRpb24gZmFpbGVkIGZvciAiCisJCSAgICAgICAiTVNEVSBmcm9tICIgTUFDX0ZNVCAiIGtleWlkeD0lZFxuIiwKKwkJICAgICAgIHNrYi0+ZGV2ID8gc2tiLT5kZXYtPm5hbWUgOiAiTi9BIiwgTUFDX0FSRyhoZHItPmFkZHIyKSwKKwkJICAgICAgIGtleWlkeCk7CisJCWlmIChza2ItPmRldikKKwkJCWllZWU4MDIxMV9taWNoYWVsX21pY19mYWlsdXJlKHNrYi0+ZGV2LCBoZHIsIGtleWlkeCk7CisJCXRrZXktPmRvdDExUlNOQVN0YXRzVEtJUExvY2FsTUlDRmFpbHVyZXMrKzsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFVwZGF0ZSBUU0MgY291bnRlcnMgZm9yIFJYIG5vdyB0aGF0IHRoZSBwYWNrZXQgdmVyaWZpY2F0aW9uIGhhcworCSAqIGNvbXBsZXRlZC4gKi8KKwl0a2V5LT5yeF9pdjMyID0gdGtleS0+cnhfaXYzMl9uZXc7CisJdGtleS0+cnhfaXYxNiA9IHRrZXktPnJ4X2l2MTZfbmV3OworCisJc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIDgpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpZWVlODAyMTFfdGtpcF9zZXRfa2V5KHZvaWQgKmtleSwgaW50IGxlbiwgdTggKnNlcSwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSAqdGtleSA9IHByaXY7CisJaW50IGtleWlkeDsKKwkjaWYgKChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKSYmKCFJTl9PUEVOU1VTRV9TTEVEKSkKKwlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtID0gdGtleS0+dGZtX21pY2hhZWw7CisJc3RydWN0IGNyeXB0b190Zm0gKnRmbTIgPSB0a2V5LT50Zm1fYXJjNDsKKwkjZWxzZQorCXN0cnVjdCBjcnlwdG9faGFzaCAqdGZtID0gdGtleS0+dHhfdGZtX21pY2hhZWw7CisJc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKnRmbTIgPSB0a2V5LT50eF90Zm1fYXJjNDsKKwlzdHJ1Y3QgY3J5cHRvX2hhc2ggKnRmbTMgPSB0a2V5LT5yeF90Zm1fbWljaGFlbDsKKwlzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtNCA9IHRrZXktPnJ4X3RmbV9hcmM0OworCSNlbmRpZgorCisJa2V5aWR4ID0gdGtleS0+a2V5X2lkeDsKKwltZW1zZXQodGtleSwgMCwgc2l6ZW9mKCp0a2V5KSk7CisJdGtleS0+a2V5X2lkeCA9IGtleWlkeDsKKworCSNpZigoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkmJighSU5fT1BFTlNVU0VfU0xFRCkpCisJdGtleS0+dGZtX21pY2hhZWwgPSB0Zm07CisJdGtleS0+dGZtX2FyYzQgPSB0Zm0yOworICAgICAgICNlbHNlCisJdGtleS0+dHhfdGZtX21pY2hhZWwgPSB0Zm07CisJdGtleS0+dHhfdGZtX2FyYzQgPSB0Zm0yOworCXRrZXktPnJ4X3RmbV9taWNoYWVsID0gdGZtMzsKKwl0a2V5LT5yeF90Zm1fYXJjNCA9IHRmbTQ7CisJI2VuZGlmCisKKwlpZiAobGVuID09IFRLSVBfS0VZX0xFTikgeworCQltZW1jcHkodGtleS0+a2V5LCBrZXksIFRLSVBfS0VZX0xFTik7CisJCXRrZXktPmtleV9zZXQgPSAxOworCQl0a2V5LT50eF9pdjE2ID0gMTsgLyogVFNDIGlzIGluaXRpYWxpemVkIHRvIDEgKi8KKwkJaWYgKHNlcSkgeworCQkJdGtleS0+cnhfaXYzMiA9IChzZXFbNV0gPDwgMjQpIHwgKHNlcVs0XSA8PCAxNikgfAorCQkJCShzZXFbM10gPDwgOCkgfCBzZXFbMl07CisJCQl0a2V5LT5yeF9pdjE2ID0gKHNlcVsxXSA8PCA4KSB8IHNlcVswXTsKKwkJfQorCX0gZWxzZSBpZiAobGVuID09IDApCisJCXRrZXktPmtleV9zZXQgPSAwOworCWVsc2UKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpZWVlODAyMTFfdGtpcF9nZXRfa2V5KHZvaWQgKmtleSwgaW50IGxlbiwgdTggKnNlcSwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSAqdGtleSA9IHByaXY7CisKKwlpZiAobGVuIDwgVEtJUF9LRVlfTEVOKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoIXRrZXktPmtleV9zZXQpCisJCXJldHVybiAwOworCW1lbWNweShrZXksIHRrZXktPmtleSwgVEtJUF9LRVlfTEVOKTsKKworCWlmIChzZXEpIHsKKwkJLyogUmV0dXJuIHRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIGxhc3QgdHJhbnNtaXR0ZWQgZnJhbWUuICovCisJCXUxNiBpdjE2ID0gdGtleS0+dHhfaXYxNjsKKwkJdTMyIGl2MzIgPSB0a2V5LT50eF9pdjMyOworCQlpZiAoaXYxNiA9PSAwKQorCQkJaXYzMi0tOworCQlpdjE2LS07CisJCXNlcVswXSA9IHRrZXktPnR4X2l2MTY7CisJCXNlcVsxXSA9IHRrZXktPnR4X2l2MTYgPj4gODsKKwkJc2VxWzJdID0gdGtleS0+dHhfaXYzMjsKKwkJc2VxWzNdID0gdGtleS0+dHhfaXYzMiA+PiA4OworCQlzZXFbNF0gPSB0a2V5LT50eF9pdjMyID4+IDE2OworCQlzZXFbNV0gPSB0a2V5LT50eF9pdjMyID4+IDI0OworCX0KKworCXJldHVybiBUS0lQX0tFWV9MRU47Cit9CisKKworc3RhdGljIGNoYXIgKiBpZWVlODAyMTFfdGtpcF9wcmludF9zdGF0cyhjaGFyICpwLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBpZWVlODAyMTFfdGtpcF9kYXRhICp0a2lwID0gcHJpdjsKKwlwICs9IHNwcmludGYocCwgImtleVslZF0gYWxnPVRLSVAga2V5X3NldD0lZCAiCisJCSAgICAgInR4X3BuPSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAiCisJCSAgICAgInJ4X3BuPSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAiCisJCSAgICAgInJlcGxheXM9JWQgaWN2X2Vycm9ycz0lZCBsb2NhbF9taWNfZmFpbHVyZXM9JWRcbiIsCisJCSAgICAgdGtpcC0+a2V5X2lkeCwgdGtpcC0+a2V5X3NldCwKKwkJICAgICAodGtpcC0+dHhfaXYzMiA+PiAyNCkgJiAweGZmLAorCQkgICAgICh0a2lwLT50eF9pdjMyID4+IDE2KSAmIDB4ZmYsCisJCSAgICAgKHRraXAtPnR4X2l2MzIgPj4gOCkgJiAweGZmLAorCQkgICAgIHRraXAtPnR4X2l2MzIgJiAweGZmLAorCQkgICAgICh0a2lwLT50eF9pdjE2ID4+IDgpICYgMHhmZiwKKwkJICAgICB0a2lwLT50eF9pdjE2ICYgMHhmZiwKKwkJICAgICAodGtpcC0+cnhfaXYzMiA+PiAyNCkgJiAweGZmLAorCQkgICAgICh0a2lwLT5yeF9pdjMyID4+IDE2KSAmIDB4ZmYsCisJCSAgICAgKHRraXAtPnJ4X2l2MzIgPj4gOCkgJiAweGZmLAorCQkgICAgIHRraXAtPnJ4X2l2MzIgJiAweGZmLAorCQkgICAgICh0a2lwLT5yeF9pdjE2ID4+IDgpICYgMHhmZiwKKwkJICAgICB0a2lwLT5yeF9pdjE2ICYgMHhmZiwKKwkJICAgICB0a2lwLT5kb3QxMVJTTkFTdGF0c1RLSVBSZXBsYXlzLAorCQkgICAgIHRraXAtPmRvdDExUlNOQVN0YXRzVEtJUElDVkVycm9ycywKKwkJICAgICB0a2lwLT5kb3QxMVJTTkFTdGF0c1RLSVBMb2NhbE1JQ0ZhaWx1cmVzKTsKKwlyZXR1cm4gcDsKK30KKworCitzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzIGllZWU4MDIxMV9jcnlwdF90a2lwID0geworCS5uYW1lCQkJPSAiVEtJUCIsCisJLmluaXQJCQk9IGllZWU4MDIxMV90a2lwX2luaXQsCisJLmRlaW5pdAkJCT0gaWVlZTgwMjExX3RraXBfZGVpbml0LAorCS5lbmNyeXB0X21wZHUJCT0gaWVlZTgwMjExX3RraXBfZW5jcnlwdCwKKwkuZGVjcnlwdF9tcGR1CQk9IGllZWU4MDIxMV90a2lwX2RlY3J5cHQsCisJLmVuY3J5cHRfbXNkdQkJPSBpZWVlODAyMTFfbWljaGFlbF9taWNfYWRkLAorCS5kZWNyeXB0X21zZHUJCT0gaWVlZTgwMjExX21pY2hhZWxfbWljX3ZlcmlmeSwKKwkuc2V0X2tleQkJPSBpZWVlODAyMTFfdGtpcF9zZXRfa2V5LAorCS5nZXRfa2V5CQk9IGllZWU4MDIxMV90a2lwX2dldF9rZXksCisJLnByaW50X3N0YXRzCQk9IGllZWU4MDIxMV90a2lwX3ByaW50X3N0YXRzLAorCS5leHRyYV9wcmVmaXhfbGVuCT0gNCArIDQsIC8qIElWICsgRXh0SVYgKi8KKwkuZXh0cmFfcG9zdGZpeF9sZW4JPSA4ICsgNCwgLyogTUlDICsgSUNWICovCisJLm93bmVyCQkgICAgICAgID0gVEhJU19NT0RVTEUsCit9OworCisKK2ludCBpZWVlODAyMTFfY3J5cHRvX3RraXBfaW5pdCh2b2lkKQoreworCXJldHVybiBpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wcygmaWVlZTgwMjExX2NyeXB0X3RraXApOworfQorCisKK3ZvaWQgaWVlZTgwMjExX2NyeXB0b190a2lwX2V4aXQodm9pZCkKK3sKKwlpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzKCZpZWVlODAyMTFfY3J5cHRfdGtpcCk7Cit9CisKKwordm9pZCBpZWVlODAyMTFfdGtpcF9udWxsKHZvaWQpCit7CisvLyAgICBwcmludGsoIj09PT09PT09PT09PT4lcygpXG4iLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybjsKK30KKworI2lmIDAKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDApKQorRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfdGtpcF9udWxsKTsKKyNlbHNlCitFWFBPUlRfU1lNQk9MX05PVkVSUyhpZWVlODAyMTFfdGtpcF9udWxsKTsKKyNlbmRpZgorI2VuZGlmCisKKworLy9tb2R1bGVfaW5pdChpZWVlODAyMTFfY3J5cHRvX3RraXBfaW5pdCk7CisvL21vZHVsZV9leGl0KGllZWU4MDIxMV9jcnlwdG9fdGtpcF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGEyMmIzMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAuYwpAQCAtMCwwICsxLDM5NCBAQAorLyoKKyAqIEhvc3QgQVAgY3J5cHQ6IGhvc3QtYmFzZWQgV0VQIGVuY3J5cHRpb24gaW1wbGVtZW50YXRpb24gZm9yIEhvc3QgQVAgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBTZWUgUkVBRE1FIGFuZCBDT1BZSU5HIGZvcgorICogbW9yZSBkZXRhaWxzLgorICovCisKKy8vI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4KKworI2luY2x1ZGUgImllZWU4MDIxMS5oIgorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKKyNpbmNsdWRlICJydGxfY3J5cHRvLmgiCisjZWxzZQorI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2VuZGlmCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjApCisgICAgI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgorI2Vsc2UKKyAgICAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNlbmRpZgorLy8jaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKworTU9EVUxFX0FVVEhPUigiSm91bmkgTWFsaW5lbiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJIb3N0IEFQIGNyeXB0OiBXRVAiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2lmZGVmIE9QRU5TVVNFX1NMRUQKKyNpZm5kZWYgSU5fT1BFTlNVU0VfU0xFRAorI2RlZmluZSBJTl9PUEVOU1VTRV9TTEVEIDEKKyNlbmRpZgorI2VuZGlmCisKKworc3RydWN0IHByaXNtMl93ZXBfZGF0YSB7CisJdTMyIGl2OworI2RlZmluZSBXRVBfS0VZX0xFTiAxMworCXU4IGtleVtXRVBfS0VZX0xFTiArIDFdOworCXU4IGtleV9sZW47CisJdTgga2V5X2lkeDsKKwkjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpJiYoIUlOX09QRU5TVVNFX1NMRUQpKQorCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm07CisJI2Vsc2UKKwlzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdHhfdGZtOworCXN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICpyeF90Zm07CisJI2VuZGlmCit9OworCisKK3N0YXRpYyB2b2lkICogcHJpc20yX3dlcF9pbml0KGludCBrZXlpZHgpCit7CisJc3RydWN0IHByaXNtMl93ZXBfZGF0YSAqcHJpdjsKKworCXByaXYgPSBrbWFsbG9jKHNpemVvZigqcHJpdiksIEdGUF9BVE9NSUMpOworCWlmIChwcml2ID09IE5VTEwpCisJCWdvdG8gZmFpbDsKKwltZW1zZXQocHJpdiwgMCwgc2l6ZW9mKCpwcml2KSk7CisJcHJpdi0+a2V5X2lkeCA9IGtleWlkeDsKKwkjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpJiYoIUlOX09QRU5TVVNFX1NMRUQpKQorCXByaXYtPnRmbSA9IGNyeXB0b19hbGxvY190Zm0oImFyYzQiLCAwKTsKKyAgICAgCWlmIChwcml2LT50Zm0gPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0X3dlcDogY291bGQgbm90IGFsbG9jYXRlICIKKwkJICAgICAgICJjcnlwdG8gQVBJIGFyYzRcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCSNlbHNlCisJcHJpdi0+dHhfdGZtID0gY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcigiZWNiKGFyYzQpIiwgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CisJaWYgKElTX0VSUihwcml2LT50eF90Zm0pKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHRfd2VwOiBjb3VsZCBub3QgYWxsb2NhdGUgIgorCQkgICAgICAgImNyeXB0byBBUEkgYXJjNFxuIik7CisJCXByaXYtPnR4X3RmbSA9IE5VTEw7CisJCWdvdG8gZmFpbDsKKwl9CisJcHJpdi0+cnhfdGZtID0gY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcigiZWNiKGFyYzQpIiwgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CisJaWYgKElTX0VSUihwcml2LT5yeF90Zm0pKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHRfd2VwOiBjb3VsZCBub3QgYWxsb2NhdGUgIgorCQkgICAgICAgImNyeXB0byBBUEkgYXJjNFxuIik7CisJCXByaXYtPnJ4X3RmbSA9IE5VTEw7CisJCWdvdG8gZmFpbDsKKwl9CisJI2VuZGlmCisKKwkvKiBzdGFydCBXRVAgSVYgZnJvbSBhIHJhbmRvbSB2YWx1ZSAqLworCWdldF9yYW5kb21fYnl0ZXMoJnByaXYtPml2LCA0KTsKKworCXJldHVybiBwcml2OworCitmYWlsOgorCS8vI2lmKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpCisJI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKSYmKCFJTl9PUEVOU1VTRV9TTEVEKSkKKwlpZiAocHJpdikgeworCQlpZiAocHJpdi0+dGZtKQorCQkJY3J5cHRvX2ZyZWVfdGZtKHByaXYtPnRmbSk7CisJCWtmcmVlKHByaXYpOworCX0KKyAgICAgICAjZWxzZQorCWlmIChwcml2KSB7CisJCWlmIChwcml2LT50eF90Zm0pCisJCQljcnlwdG9fZnJlZV9ibGtjaXBoZXIocHJpdi0+dHhfdGZtKTsKKwkJaWYgKHByaXYtPnJ4X3RmbSkKKwkJCWNyeXB0b19mcmVlX2Jsa2NpcGhlcihwcml2LT5yeF90Zm0pOworCQlrZnJlZShwcml2KTsKKwl9CisJI2VuZGlmCisJcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdGljIHZvaWQgcHJpc20yX3dlcF9kZWluaXQodm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgcHJpc20yX3dlcF9kYXRhICpfcHJpdiA9IHByaXY7CisJLy8jaWYoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkKKwkjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpJiYoIUlOX09QRU5TVVNFX1NMRUQpKQorCWlmIChfcHJpdiAmJiBfcHJpdi0+dGZtKQorCQljcnlwdG9fZnJlZV90Zm0oX3ByaXYtPnRmbSk7CisJI2Vsc2UKKwlpZiAoX3ByaXYpIHsKKwkJaWYgKF9wcml2LT50eF90Zm0pCisJCQljcnlwdG9fZnJlZV9ibGtjaXBoZXIoX3ByaXYtPnR4X3RmbSk7CisJCWlmIChfcHJpdi0+cnhfdGZtKQorCQkJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKF9wcml2LT5yeF90Zm0pOworCX0KKyAgICAgICAgI2VuZGlmCisJa2ZyZWUocHJpdik7Cit9CisKKworLyogUGVyZm9ybSBXRVAgZW5jcnlwdGlvbiBvbiBnaXZlbiBza2IgdGhhdCBoYXMgYXQgbGVhc3QgNCBieXRlcyBvZiBoZWFkcm9vbQorICogZm9yIElWIGFuZCA0IGJ5dGVzIG9mIHRhaWxyb29tIGZvciBJQ1YuIEJvdGggSVYgYW5kIElDViB3aWxsIGJlIHRyYW5zbWl0dGVkLAorICogc28gdGhlIHBheWxvYWQgbGVuZ3RoIGluY3JlYXNlcyB3aXRoIDggYnl0ZXMuCisgKgorICogV0VQIGZyYW1lIHBheWxvYWQ6IElWICsgVFgga2V5IGlkeCwgUkM0KGRhdGEpLCBJQ1YgPSBSQzQoQ1JDMzIoZGF0YSkpCisgKi8KK3N0YXRpYyBpbnQgcHJpc20yX3dlcF9lbmNyeXB0KHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJfbGVuLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBwcmlzbTJfd2VwX2RhdGEgKndlcCA9IHByaXY7CisvLyNpZihMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkKKyNpZigoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpfHwoSU5fT1BFTlNVU0VfU0xFRCkpCisgICAgICAgIHN0cnVjdCBibGtjaXBoZXJfZGVzYyBkZXNjID0gey50Zm0gPSB3ZXAtPnR4X3RmbX07CisjZW5kaWYKKwl1MzIga2xlbiwgbGVuOworCXU4IGtleVtXRVBfS0VZX0xFTiArIDNdOworCXU4ICpwb3M7CisjaWZuZGVmIEpPSE5fSFdTRUMKKwl1MzIgY3JjOworCXU4ICppY3Y7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOworI2VuZGlmCisJaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgNCB8fCBza2JfdGFpbHJvb20oc2tiKSA8IDQgfHwKKwkgICAgc2tiLT5sZW4gPCBoZHJfbGVuKQorCQlyZXR1cm4gLTE7CisKKwlsZW4gPSBza2ItPmxlbiAtIGhkcl9sZW47CisJcG9zID0gc2tiX3B1c2goc2tiLCA0KTsKKwltZW1tb3ZlKHBvcywgcG9zICsgNCwgaGRyX2xlbik7CisJcG9zICs9IGhkcl9sZW47CisKKwlrbGVuID0gMyArIHdlcC0+a2V5X2xlbjsKKworCXdlcC0+aXYrKzsKKworCS8qIEZsdWhyZXIsIE1hbnRpbiwgYW5kIFNoYW1pciBoYXZlIHJlcG9ydGVkIHdlYWtuZXNzZXMgaW4gdGhlIGtleQorCSAqIHNjaGVkdWxpbmcgYWxnb3JpdGhtIG9mIFJDNC4gQXQgbGVhc3QgSVZzIChLZXlCeXRlICsgMywgMHhmZiwgTikKKwkgKiBjYW4gYmUgdXNlZCB0byBzcGVlZHVwIGF0dGFja3MsIHNvIGF2b2lkIHVzaW5nIHRoZW0uICovCisJaWYgKCh3ZXAtPml2ICYgMHhmZjAwKSA9PSAweGZmMDApIHsKKwkJdTggQiA9ICh3ZXAtPml2ID4+IDE2KSAmIDB4ZmY7CisJCWlmIChCID49IDMgJiYgQiA8IGtsZW4pCisJCQl3ZXAtPml2ICs9IDB4MDEwMDsKKwl9CisKKwkvKiBQcmVwZW5kIDI0LWJpdCBJViB0byBSQzQga2V5IGFuZCBUWCBmcmFtZSAqLworCSpwb3MrKyA9IGtleVswXSA9ICh3ZXAtPml2ID4+IDE2KSAmIDB4ZmY7CisJKnBvcysrID0ga2V5WzFdID0gKHdlcC0+aXYgPj4gOCkgJiAweGZmOworCSpwb3MrKyA9IGtleVsyXSA9IHdlcC0+aXYgJiAweGZmOworCSpwb3MrKyA9IHdlcC0+a2V5X2lkeCA8PCA2OworCisJLyogQ29weSByZXN0IG9mIHRoZSBXRVAga2V5ICh0aGUgc2VjcmV0IHBhcnQpICovCisJbWVtY3B5KGtleSArIDMsIHdlcC0+a2V5LCB3ZXAtPmtleV9sZW4pOworCisjaWZuZGVmIEpPSE5fSFdTRUMKKwkvKiBBcHBlbmQgbGl0dGxlLWVuZGlhbiBDUkMzMiBhbmQgZW5jcnlwdCBpdCB0byBwcm9kdWNlIElDViAqLworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsMCkpCisJY3JjID0gfmNyYzMyX2xlKH4wLCBwb3MsIGxlbik7CisjZWxzZQorCWNyYyA9IH5ldGhlcl9jcmNfbGUobGVuLCBwb3MpOworI2VuZGlmCisJaWN2ID0gc2tiX3B1dChza2IsIDQpOworCWljdlswXSA9IGNyYzsKKwlpY3ZbMV0gPSBjcmMgPj4gODsKKwlpY3ZbMl0gPSBjcmMgPj4gMTY7CisJaWN2WzNdID0gY3JjID4+IDI0OworCisgICAgICAgIC8vI2lmKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpCisJI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjEpKSYmKCFJTl9PUEVOU1VTRV9TTEVEKSkKKwljcnlwdG9fY2lwaGVyX3NldGtleSh3ZXAtPnRmbSwga2V5LCBrbGVuKTsKKwlzZy5wYWdlID0gdmlydF90b19wYWdlKHBvcyk7CisJc2cub2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UocG9zKTsKKwlzZy5sZW5ndGggPSBsZW4gKyA0OworCWNyeXB0b19jaXBoZXJfZW5jcnlwdCh3ZXAtPnRmbSwgJnNnLCAmc2csIGxlbiArIDQpOworCisJcmV0dXJuIDA7CisJI2Vsc2UKKwljcnlwdG9fYmxrY2lwaGVyX3NldGtleSh3ZXAtPnR4X3RmbSwga2V5LCBrbGVuKTsKKyAgICAgICAgI2lmKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkpCisgICAgICAgICAgc2cucGFnZSA9IHZpcnRfdG9fcGFnZShwb3MpOworICAgICAgICAgIHNnLm9mZnNldCA9IG9mZnNldF9pbl9wYWdlKHBvcyk7CisgICAgICAgICAgc2cubGVuZ3RoID0gbGVuICsgNDsKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgICBzZ19pbml0X29uZSgmc2csIHBvcywgbGVuKzQpOworICAgICAgICAjZW5kaWYKKwlyZXR1cm4gY3J5cHRvX2Jsa2NpcGhlcl9lbmNyeXB0KCZkZXNjLCAmc2csICZzZywgbGVuICsgNCk7CisJI2VuZGlmCisjZW5kaWYgLyogSk9ITl9IV1NFQyAqLworCXJldHVybiAwOworfQorCisKKy8qIFBlcmZvcm0gV0VQIGRlY3J5cHRpb24gb24gZ2l2ZW4gYnVmZmVyLiBCdWZmZXIgaW5jbHVkZXMgd2hvbGUgV0VQIHBhcnQgb2YKKyAqIHRoZSBmcmFtZTogSVYgKDQgYnl0ZXMpLCBlbmNyeXB0ZWQgcGF5bG9hZCAoaW5jbHVkaW5nIFNOQVAgaGVhZGVyKSwKKyAqIElDViAoNCBieXRlcykuIGxlbiBpbmNsdWRlcyBib3RoIElWIGFuZCBJQ1YuCisgKgorICogUmV0dXJucyAwIGlmIGZyYW1lIHdhcyBkZWNyeXB0ZWQgc3VjY2Vzc2Z1bGx5IGFuZCBJQ1Ygd2FzIGNvcnJlY3QgYW5kIC0xIG9uCisgKiBmYWlsdXJlLiBJZiBmcmFtZSBpcyBPSywgSVYgYW5kIElDViB3aWxsIGJlIHJlbW92ZWQuCisgKi8KK3N0YXRpYyBpbnQgcHJpc20yX3dlcF9kZWNyeXB0KHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJfbGVuLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBwcmlzbTJfd2VwX2RhdGEgKndlcCA9IHByaXY7CisgICAgICAgIC8vI2lmKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjEpKQorCSNpZigoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpfHwoSU5fT1BFTlNVU0VfU0xFRCkpCisgICAgICAgIHN0cnVjdCBibGtjaXBoZXJfZGVzYyBkZXNjID0gey50Zm0gPSB3ZXAtPnJ4X3RmbX07CisgICAgICAgICNlbmRpZgorCXUzMiBrbGVuLCBwbGVuOworCXU4IGtleVtXRVBfS0VZX0xFTiArIDNdOworCXU4IGtleWlkeCwgKnBvczsKKyNpZm5kZWYgSk9ITl9IV1NFQworCXUzMiBjcmM7CisJdTggaWN2WzRdOworCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKKyNlbmRpZgorCWlmIChza2ItPmxlbiA8IGhkcl9sZW4gKyA4KQorCQlyZXR1cm4gLTE7CisKKwlwb3MgPSBza2ItPmRhdGEgKyBoZHJfbGVuOworCWtleVswXSA9ICpwb3MrKzsKKwlrZXlbMV0gPSAqcG9zKys7CisJa2V5WzJdID0gKnBvcysrOworCWtleWlkeCA9ICpwb3MrKyA+PiA2OworCWlmIChrZXlpZHggIT0gd2VwLT5rZXlfaWR4KQorCQlyZXR1cm4gLTE7CisKKwlrbGVuID0gMyArIHdlcC0+a2V5X2xlbjsKKworCS8qIENvcHkgcmVzdCBvZiB0aGUgV0VQIGtleSAodGhlIHNlY3JldCBwYXJ0KSAqLworCW1lbWNweShrZXkgKyAzLCB3ZXAtPmtleSwgd2VwLT5rZXlfbGVuKTsKKworCS8qIEFwcGx5IFJDNCB0byBkYXRhIGFuZCBjb21wdXRlIENSQzMyIG92ZXIgZGVjcnlwdGVkIGRhdGEgKi8KKwlwbGVuID0gc2tiLT5sZW4gLSBoZHJfbGVuIC0gODsKKyNpZm5kZWYgSk9ITl9IV1NFQworLy8jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpCisjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkpJiYoIUlOX09QRU5TVVNFX1NMRUQpKQorCWNyeXB0b19jaXBoZXJfc2V0a2V5KHdlcC0+dGZtLCBrZXksIGtsZW4pOworCXNnLnBhZ2UgPSB2aXJ0X3RvX3BhZ2UocG9zKTsKKwlzZy5vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShwb3MpOworCXNnLmxlbmd0aCA9IHBsZW4gKyA0OworCWNyeXB0b19jaXBoZXJfZGVjcnlwdCh3ZXAtPnRmbSwgJnNnLCAmc2csIHBsZW4gKyA0KTsKKyNlbHNlCisJY3J5cHRvX2Jsa2NpcGhlcl9zZXRrZXkod2VwLT5yeF90Zm0sIGtleSwga2xlbik7CisgICAgICAgICNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI0KSkKKyAgICAgICAgICBzZy5wYWdlID0gdmlydF90b19wYWdlKHBvcyk7CisgICAgICAgICAgc2cub2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UocG9zKTsKKyAgICAgICAgICBzZy5sZW5ndGggPSBwbGVuICsgNDsKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgICBzZ19pbml0X29uZSgmc2csIHBvcywgcGxlbis0KTsKKyAgICAgICAgI2VuZGlmCisJaWYgKGNyeXB0b19ibGtjaXBoZXJfZGVjcnlwdCgmZGVzYywgJnNnLCAmc2csIHBsZW4gKyA0KSkKKwkJcmV0dXJuIC03OworI2VuZGlmCisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDApKQorCWNyYyA9IH5jcmMzMl9sZSh+MCwgcG9zLCBwbGVuKTsKKyNlbHNlCisJY3JjID0gfmV0aGVyX2NyY19sZShwbGVuLCBwb3MpOworI2VuZGlmCisJaWN2WzBdID0gY3JjOworCWljdlsxXSA9IGNyYyA+PiA4OworCWljdlsyXSA9IGNyYyA+PiAxNjsKKwlpY3ZbM10gPSBjcmMgPj4gMjQ7CisKKwlpZiAobWVtY21wKGljdiwgcG9zICsgcGxlbiwgNCkgIT0gMCkgeworCQkvKiBJQ1YgbWlzbWF0Y2ggLSBkcm9wIGZyYW1lICovCisJCXJldHVybiAtMjsKKwl9CisjZW5kaWYgCS8qIEpPSE5fSFdTRUMgKi8KKworCS8qIFJlbW92ZSBJViBhbmQgSUNWICovCisJbWVtbW92ZShza2ItPmRhdGEgKyA0LCBza2ItPmRhdGEsIGhkcl9sZW4pOworCXNrYl9wdWxsKHNrYiwgNCk7CisJc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIDQpOworICAgICAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHByaXNtMl93ZXBfc2V0X2tleSh2b2lkICprZXksIGludCBsZW4sIHU4ICpzZXEsIHZvaWQgKnByaXYpCit7CisJc3RydWN0IHByaXNtMl93ZXBfZGF0YSAqd2VwID0gcHJpdjsKKworCWlmIChsZW4gPCAwIHx8IGxlbiA+IFdFUF9LRVlfTEVOKQorCQlyZXR1cm4gLTE7CisKKwltZW1jcHkod2VwLT5rZXksIGtleSwgbGVuKTsKKwl3ZXAtPmtleV9sZW4gPSBsZW47CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHByaXNtMl93ZXBfZ2V0X2tleSh2b2lkICprZXksIGludCBsZW4sIHU4ICpzZXEsIHZvaWQgKnByaXYpCit7CisJc3RydWN0IHByaXNtMl93ZXBfZGF0YSAqd2VwID0gcHJpdjsKKworCWlmIChsZW4gPCB3ZXAtPmtleV9sZW4pCisJCXJldHVybiAtMTsKKworCW1lbWNweShrZXksIHdlcC0+a2V5LCB3ZXAtPmtleV9sZW4pOworCisJcmV0dXJuIHdlcC0+a2V5X2xlbjsKK30KKworCitzdGF0aWMgY2hhciAqIHByaXNtMl93ZXBfcHJpbnRfc3RhdHMoY2hhciAqcCwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgcHJpc20yX3dlcF9kYXRhICp3ZXAgPSBwcml2OworCXAgKz0gc3ByaW50ZihwLCAia2V5WyVkXSBhbGc9V0VQIGxlbj0lZFxuIiwKKwkJICAgICB3ZXAtPmtleV9pZHgsIHdlcC0+a2V5X2xlbik7CisJcmV0dXJuIHA7Cit9CisKKworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyBpZWVlODAyMTFfY3J5cHRfd2VwID0geworCS5uYW1lCQkJPSAiV0VQIiwKKwkuaW5pdAkJCT0gcHJpc20yX3dlcF9pbml0LAorCS5kZWluaXQJCQk9IHByaXNtMl93ZXBfZGVpbml0LAorCS5lbmNyeXB0X21wZHUJCT0gcHJpc20yX3dlcF9lbmNyeXB0LAorCS5kZWNyeXB0X21wZHUJCT0gcHJpc20yX3dlcF9kZWNyeXB0LAorCS5lbmNyeXB0X21zZHUJCT0gTlVMTCwKKwkuZGVjcnlwdF9tc2R1CQk9IE5VTEwsCisJLnNldF9rZXkJCT0gcHJpc20yX3dlcF9zZXRfa2V5LAorCS5nZXRfa2V5CQk9IHByaXNtMl93ZXBfZ2V0X2tleSwKKwkucHJpbnRfc3RhdHMJCT0gcHJpc20yX3dlcF9wcmludF9zdGF0cywKKwkuZXh0cmFfcHJlZml4X2xlbgk9IDQsIC8qIElWICovCisJLmV4dHJhX3Bvc3RmaXhfbGVuCT0gNCwgLyogSUNWICovCisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKK307CisKKworaW50IGllZWU4MDIxMV9jcnlwdG9fd2VwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaWVlZTgwMjExX3JlZ2lzdGVyX2NyeXB0b19vcHMoJmllZWU4MDIxMV9jcnlwdF93ZXApOworfQorCisKK3ZvaWQgaWVlZTgwMjExX2NyeXB0b193ZXBfZXhpdCh2b2lkKQoreworCWllZWU4MDIxMV91bnJlZ2lzdGVyX2NyeXB0b19vcHMoJmllZWU4MDIxMV9jcnlwdF93ZXApOworfQorCisKK3ZvaWQgaWVlZTgwMjExX3dlcF9udWxsKHZvaWQpCit7CisvLwlwcmludGsoIj09PT09PT09PT09PT4lcygpXG4iLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybjsKK30KKyNpZiAwCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3dlcF9udWxsKTsKKyNlbHNlCitFWFBPUlRfU1lNQk9MX05PVkVSUyhpZWVlODAyMTFfd2VwX251bGwpOworI2VuZGlmCisjZW5kaWYKKy8vbW9kdWxlX2luaXQoaWVlZTgwMjExX2NyeXB0b193ZXBfaW5pdCk7CisvL21vZHVsZV9leGl0KGllZWU4MDIxMV9jcnlwdG9fd2VwX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjOWZlZjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMKQEAgLTAsMCArMSwzMDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgQ29weXJpZ2h0KGMpIDIwMDQgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBiYXNlZCBvbiB0aGUgV0VQIGVuYWJsZW1lbnQgY29kZSBwcm92aWRlZCBieSB0aGUKKyAgSG9zdCBBUCBwcm9qZWN0IGhvc3RhcC1kcml2ZXJzIHYwLjEuMworICBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiwgU1NIIENvbW11bmljYXRpb25zIFNlY3VyaXR5IENvcnAgYW5kIEpvdW5pIE1hbGluZW4KKyAgPGprbWFsaW5lQGNjLmh1dC5maT4KKyAgQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorCisgIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICBmaWxlIGNhbGxlZCBMSUNFTlNFLgorCisgIENvbnRhY3QgSW5mb3JtYXRpb246CisgIEphbWVzIFAuIEtldHJlbm9zIDxpcHcyMTAwLWFkbWluQGxpbnV4LmludGVsLmNvbT4KKyAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW42Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bmV0L2FycC5oPgorI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CisKKyNpbmNsdWRlICJpZWVlODAyMTEuaCIKKworTU9EVUxFX0RFU0NSSVBUSU9OKCI4MDIuMTEgZGF0YS9tYW5hZ2VtZW50L2NvbnRyb2wgc3RhY2siKTsKK01PRFVMRV9BVVRIT1IoIkNvcHlyaWdodCAoQykgMjAwNCBJbnRlbCBDb3Jwb3JhdGlvbiA8amtldHJlbm9AbGludXguaW50ZWwuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjZGVmaW5lIERSVl9OQU1FICJpZWVlODAyMTEiCisKK3N0YXRpYyBpbmxpbmUgaW50IGllZWU4MDIxMV9uZXR3b3Jrc19hbGxvY2F0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlpZiAoaWVlZS0+bmV0d29ya3MpCisJCXJldHVybiAwOworCisJaWVlZS0+bmV0d29ya3MgPSBrbWFsbG9jKAorCQlNQVhfTkVUV09SS19DT1VOVCAqIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmspLAorCQlHRlBfS0VSTkVMKTsKKwlpZiAoIWllZWUtPm5ldHdvcmtzKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBPdXQgb2YgbWVtb3J5IGFsbG9jYXRpbmcgYmVhY29uc1xuIiwKKwkJICAgICAgIGllZWUtPmRldi0+bmFtZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldChpZWVlLT5uZXR3b3JrcywgMCwKKwkgICAgICAgTUFYX05FVFdPUktfQ09VTlQgKiBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGllZWU4MDIxMV9uZXR3b3Jrc19mcmVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWlmICghaWVlZS0+bmV0d29ya3MpCisJCXJldHVybjsKKwlrZnJlZShpZWVlLT5uZXR3b3Jrcyk7CisJaWVlZS0+bmV0d29ya3MgPSBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaWVlZTgwMjExX25ldHdvcmtzX2luaXRpYWxpemUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaW50IGk7CisKKwlJTklUX0xJU1RfSEVBRCgmaWVlZS0+bmV0d29ya19mcmVlX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZpZWVlLT5uZXR3b3JrX2xpc3QpOworCWZvciAoaSA9IDA7IGkgPCBNQVhfTkVUV09SS19DT1VOVDsgaSsrKQorCQlsaXN0X2FkZF90YWlsKCZpZWVlLT5uZXR3b3Jrc1tpXS5saXN0LCAmaWVlZS0+bmV0d29ya19mcmVlX2xpc3QpOworfQorCisKK3N0cnVjdCBuZXRfZGV2aWNlICphbGxvY19pZWVlODAyMTEoaW50IHNpemVvZl9wcml2KQoreworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IGksZXJyOworCisJSUVFRTgwMjExX0RFQlVHX0lORk8oIkluaXRpYWxpemluZy4uLlxuIik7CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UpICsgc2l6ZW9mX3ByaXYpOworCWlmICghZGV2KSB7CisJCUlFRUU4MDIxMV9FUlJPUigiVW5hYmxlIHRvIG5ldHdvcmsgZGV2aWNlLlxuIik7CisJCWdvdG8gZmFpbGVkOworCX0KKwlpZWVlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGllZWU4MDIxMV94bWl0OworCisJaWVlZS0+ZGV2ID0gZGV2OworCisJZXJyID0gaWVlZTgwMjExX25ldHdvcmtzX2FsbG9jYXRlKGllZWUpOworCWlmIChlcnIpIHsKKwkJSUVFRTgwMjExX0VSUk9SKCJVbmFibGUgdG8gYWxsb2NhdGUgYmVhY29uIHN0b3JhZ2U6ICVkXG4iLAorCQkJCWVycik7CisJCWdvdG8gZmFpbGVkOworCX0KKwlpZWVlODAyMTFfbmV0d29ya3NfaW5pdGlhbGl6ZShpZWVlKTsKKworCS8qIERlZmF1bHQgZnJhZ21lbnRhdGlvbiB0aHJlc2hvbGQgaXMgbWF4aW11bSBwYXlsb2FkIHNpemUgKi8KKwlpZWVlLT5mdHMgPSBERUZBVUxUX0ZUUzsKKwlpZWVlLT5zY2FuX2FnZSA9IERFRkFVTFRfTUFYX1NDQU5fQUdFOworCWllZWUtPm9wZW5fd2VwID0gMTsKKworCS8qIERlZmF1bHQgdG8gZW5hYmxpbmcgZnVsbCBvcGVuIFdFUCB3aXRoIGhvc3QgYmFzZWQgZW5jcnlwdC9kZWNyeXB0ICovCisJaWVlZS0+aG9zdF9lbmNyeXB0ID0gMTsKKwlpZWVlLT5ob3N0X2RlY3J5cHQgPSAxOworCWllZWUtPmllZWU4MDJfMXggPSAxOyAvKiBEZWZhdWx0IHRvIHN1cHBvcnRpbmcgODAyLjF4ICovCisKKwlJTklUX0xJU1RfSEVBRCgmaWVlZS0+Y3J5cHRfZGVpbml0X2xpc3QpOworCWluaXRfdGltZXIoJmllZWUtPmNyeXB0X2RlaW5pdF90aW1lcik7CisJaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylpZWVlOworCWllZWUtPmNyeXB0X2RlaW5pdF90aW1lci5mdW5jdGlvbiA9IGllZWU4MDIxMV9jcnlwdF9kZWluaXRfaGFuZGxlcjsKKworCXNwaW5fbG9ja19pbml0KCZpZWVlLT5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmaWVlZS0+d3BheF9zdWl0bGlzdF9sb2NrKTsKKworCWllZWUtPndwYXhfdHlwZV9zZXQgPSAwOworIAlpZWVlLT53cGFfZW5hYmxlZCA9IDA7CisgCWllZWUtPnRraXBfY291bnRlcm1lYXN1cmVzID0gMDsKKyAJaWVlZS0+ZHJvcF91bmVuY3J5cHRlZCA9IDA7CisgCWllZWUtPnByaXZhY3lfaW52b2tlZCA9IDA7CisgCWllZWUtPmllZWU4MDJfMXggPSAxOworCWllZWUtPnJhd190eCA9IDA7CisKKwlpZWVlODAyMTFfc29mdG1hY19pbml0KGllZWUpOworCisJZm9yIChpID0gMDsgaSA8IElFRUVfSUJTU19NQUNfSEFTSF9TSVpFOyBpKyspCisJCUlOSVRfTElTVF9IRUFEKCZpZWVlLT5pYnNzX21hY19oYXNoW2ldKTsKKworCWZvciAoaSA9IDA7IGkgPCAxNzsgaSsrKSB7CisJICBpZWVlLT5sYXN0X3J4c2VxX251bVtpXSA9IC0xOworCSAgaWVlZS0+bGFzdF9yeGZyYWdfbnVtW2ldID0gLTE7CisJICBpZWVlLT5sYXN0X3BhY2tldF90aW1lW2ldID0gMDsKKwl9CisvL1RoZXNlIGZ1bmN0aW9uIHdlcmUgYWRkZWQgdG8gbG9hZCBjcnlwdGUgbW9kdWxlIGF1dG9seQorCWllZWU4MDIxMV90a2lwX251bGwoKTsKKwlpZWVlODAyMTFfd2VwX251bGwoKTsKKwlpZWVlODAyMTFfY2NtcF9udWxsKCk7CisJcmV0dXJuIGRldjsKKworIGZhaWxlZDoKKwlpZiAoZGV2KQorCQlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBOVUxMOworfQorCisKK3ZvaWQgZnJlZV9pZWVlODAyMTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IG5ldGRldl9wcml2KGRldik7CisKKwlpbnQgaTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqcTsKKworCisJaWVlZTgwMjExX3NvZnRtYWNfZnJlZShpZWVlKTsKKwlkZWxfdGltZXJfc3luYygmaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyKTsKKwlpZWVlODAyMTFfY3J5cHRfZGVpbml0X2VudHJpZXMoaWVlZSwgMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgV0VQX0tFWVM7IGkrKykgeworCQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0ID0gaWVlZS0+Y3J5cHRbaV07CisJCWlmIChjcnlwdCkgeworCQkJaWYgKGNyeXB0LT5vcHMpIHsKKwkJCQljcnlwdC0+b3BzLT5kZWluaXQoY3J5cHQtPnByaXYpOworCQkJCW1vZHVsZV9wdXQoY3J5cHQtPm9wcy0+b3duZXIpOworCQkJfQorCQkJa2ZyZWUoY3J5cHQpOworCQkJaWVlZS0+Y3J5cHRbaV0gPSBOVUxMOworCQl9CisJfQorCisJaWVlZTgwMjExX25ldHdvcmtzX2ZyZWUoaWVlZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSUVFRV9JQlNTX01BQ19IQVNIX1NJWkU7IGkrKykgeworCQlsaXN0X2Zvcl9lYWNoX3NhZmUocCwgcSwgJmllZWUtPmlic3NfbWFjX2hhc2hbaV0pIHsKKwkJCWtmcmVlKGxpc3RfZW50cnkocCwgc3RydWN0IGllZWVfaWJzc19zZXEsIGxpc3QpKTsKKwkJCWxpc3RfZGVsKHApOworCQl9CisJfQorCisKKwlmcmVlX25ldGRldihkZXYpOworfQorCisvLyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCisjaWYgMAorCitzdGF0aWMgaW50IGRlYnVnID0gMDsKK3UzMiBpZWVlODAyMTFfZGVidWdfbGV2ZWwgPSAwOworc3RydWN0IHByb2NfZGlyX2VudHJ5ICppZWVlODAyMTFfcHJvYyA9IE5VTEw7CisKK3N0YXRpYyBpbnQgc2hvd19kZWJ1Z19sZXZlbChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKKwkJCSAgICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXJldHVybiBzbnByaW50ZihwYWdlLCBjb3VudCwgIjB4JTA4WFxuIiwgaWVlZTgwMjExX2RlYnVnX2xldmVsKTsKK30KKworc3RhdGljIGludCBzdG9yZV9kZWJ1Z19sZXZlbChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmZmVyLAorCQkJICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQoreworCWNoYXIgYnVmW10gPSAiMHgwMDAwMDAwMCI7CisJdW5zaWduZWQgbG9uZyBsZW4gPSBtaW4oc2l6ZW9mKGJ1ZikgLSAxLCAodTMyKWNvdW50KTsKKwljaGFyICpwID0gKGNoYXIgKilidWY7CisJdW5zaWduZWQgbG9uZyB2YWw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBidWZmZXIsIGxlbikpCisJCXJldHVybiBjb3VudDsKKwlidWZbbGVuXSA9IDA7CisJaWYgKHBbMV0gPT0gJ3gnIHx8IHBbMV0gPT0gJ1gnIHx8IHBbMF0gPT0gJ3gnIHx8IHBbMF0gPT0gJ1gnKSB7CisJCXArKzsKKwkJaWYgKHBbMF0gPT0gJ3gnIHx8IHBbMF0gPT0gJ1gnKQorCQkJcCsrOworCQl2YWwgPSBzaW1wbGVfc3RydG91bChwLCAmcCwgMTYpOworCX0gZWxzZQorCQl2YWwgPSBzaW1wbGVfc3RydG91bChwLCAmcCwgMTApOworCWlmIChwID09IGJ1ZikKKwkJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRQorCQkgICAgICAgIjogJXMgaXMgbm90IGluIGhleCBvciBkZWNpbWFsIGZvcm0uXG4iLCBidWYpOworCWVsc2UKKwkJaWVlZTgwMjExX2RlYnVnX2xldmVsID0gdmFsOworCisJcmV0dXJuIHN0cm5sZW4oYnVmLCBjb3VudCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGllZWU4MDIxMV9pbml0KHZvaWQpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplOworCisJaWVlZTgwMjExX2RlYnVnX2xldmVsID0gZGVidWc7CisJaWVlZTgwMjExX3Byb2MgPSBjcmVhdGVfcHJvY19lbnRyeShEUlZfTkFNRSwgU19JRkRJUiwgcHJvY19uZXQpOworCWlmIChpZWVlODAyMTFfcHJvYyA9PSBOVUxMKSB7CisJCUlFRUU4MDIxMV9FUlJPUigiVW5hYmxlIHRvIGNyZWF0ZSAiIERSVl9OQU1FCisJCQkJIiBwcm9jIGRpcmVjdG9yeVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwllID0gY3JlYXRlX3Byb2NfZW50cnkoImRlYnVnX2xldmVsIiwgU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSLAorCQkJICAgICAgaWVlZTgwMjExX3Byb2MpOworCWlmICghZSkgeworCQlyZW1vdmVfcHJvY19lbnRyeShEUlZfTkFNRSwgcHJvY19uZXQpOworCQlpZWVlODAyMTFfcHJvYyA9IE5VTEw7CisJCXJldHVybiAtRUlPOworCX0KKwllLT5yZWFkX3Byb2MgPSBzaG93X2RlYnVnX2xldmVsOworCWUtPndyaXRlX3Byb2MgPSBzdG9yZV9kZWJ1Z19sZXZlbDsKKwllLT5kYXRhID0gTlVMTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaWVlZTgwMjExX2V4aXQodm9pZCkKK3sKKwlpZiAoaWVlZTgwMjExX3Byb2MpIHsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoImRlYnVnX2xldmVsIiwgaWVlZTgwMjExX3Byb2MpOworCQlyZW1vdmVfcHJvY19lbnRyeShEUlZfTkFNRSwgcHJvY19uZXQpOworCQlpZWVlODAyMTFfcHJvYyA9IE5VTEw7CisJfQorfQorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJkZWJ1ZyBvdXRwdXQgbWFzayIpOworCisKK21vZHVsZV9leGl0KGllZWU4MDIxMV9leGl0KTsKK21vZHVsZV9pbml0KGllZWU4MDIxMV9pbml0KTsKKyNlbmRpZgorCisjaWYgMAorRVhQT1JUX1NZTUJPTChhbGxvY19pZWVlODAyMTEpOworRVhQT1JUX1NZTUJPTChmcmVlX2llZWU4MDIxMSk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM1MTliMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jCkBAIC0wLDAgKzEsMTk3MSBAQAorLyoKKyAqIE9yaWdpbmFsIGNvZGUgYmFzZWQgSG9zdCBBUCAoc29mdHdhcmUgd2lyZWxlc3MgTEFOIGFjY2VzcyBwb2ludCkgZHJpdmVyCisgKiBmb3IgSW50ZXJzaWwgUHJpc20yLzIuNS8zIC0gaG9zdGFwLm8gbW9kdWxlLCBjb21tb24gcm91dGluZXMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiwgU1NIIENvbW11bmljYXRpb25zIFNlY3VyaXR5IENvcnAgYW5kIEpvdW5pIE1hbGluZW4KKyAqIDxqa21hbGluZUBjYy5odXQuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAyMDA0LCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgRmV3IG1vZGlmaWNhdGlvbnMgZm9yIFJlYWx0ZWsncyBXaS1GaSBkcml2ZXJzIGJ5CisgIEFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKworICBBIHNwZWNpYWwgdGhhbmtzIGdvZXMgdG8gUmVhbHRlayBmb3IgdGhlaXIgc3VwcG9ydCAhCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW42Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKworI2luY2x1ZGUgImllZWU4MDIxMS5oIgorI2lmZGVmIEVOQUJMRV9ET1QxMUQKKyNpbmNsdWRlICJkb3QxMWQuaCIKKyNlbmRpZgorc3RhdGljIGlubGluZSB2b2lkIGllZWU4MDIxMV9tb25pdG9yX3J4KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOworCXUxNiBmYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKTsKKworCXNrYi0+ZGV2ID0gaWVlZS0+ZGV2OworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjIpCisgICAgICAgIHNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CisjZWxzZQorICAgICAgICBza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisjZW5kaWYKKwlza2JfcHVsbChza2IsIGllZWU4MDIxMV9nZXRfaGRybGVuKGZjKSk7CisJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9PVEhFUkhPU1Q7CisJc2tiLT5wcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyMTFfUkFXKTsKKwltZW1zZXQoc2tiLT5jYiwgMCwgc2l6ZW9mKHNrYi0+Y2IpKTsKKwluZXRpZl9yeChza2IpOworfQorCisKKy8qIENhbGxlZCBvbmx5IGFzIGEgdGFza2xldCAoc29mdHdhcmUgSVJRKSAqLworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfZnJhZ19lbnRyeSAqCitpZWVlODAyMTFfZnJhZ19jYWNoZV9maW5kKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1bnNpZ25lZCBpbnQgc2VxLAorCQkJICB1bnNpZ25lZCBpbnQgZnJhZywgdTggdGlkLHU4ICpzcmMsIHU4ICpkc3QpCit7CisJc3RydWN0IGllZWU4MDIxMV9mcmFnX2VudHJ5ICplbnRyeTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBJRUVFODAyMTFfRlJBR19DQUNIRV9MRU47IGkrKykgeworCQllbnRyeSA9ICZpZWVlLT5mcmFnX2NhY2hlW3RpZF1baV07CisJCWlmIChlbnRyeS0+c2tiICE9IE5VTEwgJiYKKwkJICAgIHRpbWVfYWZ0ZXIoamlmZmllcywgZW50cnktPmZpcnN0X2ZyYWdfdGltZSArIDIgKiBIWikpIHsKKwkJCUlFRUU4MDIxMV9ERUJVR19GUkFHKAorCQkJCSJleHBpcmluZyBmcmFnbWVudCBjYWNoZSBlbnRyeSAiCisJCQkJInNlcT0ldSBsYXN0X2ZyYWc9JXVcbiIsCisJCQkJZW50cnktPnNlcSwgZW50cnktPmxhc3RfZnJhZyk7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShlbnRyeS0+c2tiKTsKKwkJCWVudHJ5LT5za2IgPSBOVUxMOworCQl9CisKKwkJaWYgKGVudHJ5LT5za2IgIT0gTlVMTCAmJiBlbnRyeS0+c2VxID09IHNlcSAmJgorCQkgICAgKGVudHJ5LT5sYXN0X2ZyYWcgKyAxID09IGZyYWcgfHwgZnJhZyA9PSAtMSkgJiYKKwkJICAgIG1lbWNtcChlbnRyeS0+c3JjX2FkZHIsIHNyYywgRVRIX0FMRU4pID09IDAgJiYKKwkJICAgIG1lbWNtcChlbnRyeS0+ZHN0X2FkZHIsIGRzdCwgRVRIX0FMRU4pID09IDApCisJCQlyZXR1cm4gZW50cnk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIENhbGxlZCBvbmx5IGFzIGEgdGFza2xldCAoc29mdHdhcmUgSVJRKSAqLworc3RhdGljIHN0cnVjdCBza19idWZmICoKK2llZWU4MDIxMV9mcmFnX2NhY2hlX2dldChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXUxNiBmYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKTsKKwl1MTYgc2MgPSBsZTE2X3RvX2NwdShoZHItPnNlcV9jdGwpOworCXVuc2lnbmVkIGludCBmcmFnID0gV0xBTl9HRVRfU0VRX0ZSQUcoc2MpOworCXVuc2lnbmVkIGludCBzZXEgPSBXTEFOX0dFVF9TRVFfU0VRKHNjKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2ZyYWdfZW50cnkgKmVudHJ5OworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyX1FPUyAqaGRyXzNhZGRyX1FvUzsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl9RT1MgKmhkcl80YWRkcl9Rb1M7CisJdTggdGlkOworCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWlmKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpCisJeworCQl0aWQgPSAoaGRyLT5hZGRyMltFVEhfQUxFTi0yXSBeIGhkci0+YWRkcjJbRVRIX0FMRU4tMV0pICYgSUVFRTgwMjExX1FPU19USUQ7CisJfQorCWVsc2UKKyNlbmRpZgorCWlmICgoKGZjICYgSUVFRTgwMjExX0ZDVExfRFNUT0RTKSA9PSBJRUVFODAyMTFfRkNUTF9EU1RPRFMpJiZJRUVFODAyMTFfUU9TX0hBU19TRVEoZmMpKSB7CisJICBoZHJfNGFkZHJfUW9TID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyX1FPUyAqKWhkcjsKKwkgIHRpZCA9IGxlMTZfdG9fY3B1KGhkcl80YWRkcl9Rb1MtPlFPU19jdGwpICYgSUVFRTgwMjExX1FPU19USUQ7CisJICB0aWQgPSBVUDJBQyh0aWQpOworCSAgdGlkICsrOworCX0gZWxzZSBpZiAoSUVFRTgwMjExX1FPU19IQVNfU0VRKGZjKSkgeworCSAgaGRyXzNhZGRyX1FvUyA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcl9RT1MgKiloZHI7CisJICB0aWQgPSBsZTE2X3RvX2NwdShoZHJfM2FkZHJfUW9TLT5RT1NfY3RsKSAmIElFRUU4MDIxMV9RT1NfVElEOworCSAgdGlkID0gVVAyQUModGlkKTsKKwkgIHRpZCArKzsKKwl9IGVsc2UgeworCSAgdGlkID0gMDsKKwl9CisKKwlpZiAoZnJhZyA9PSAwKSB7CisJCS8qIFJlc2VydmUgZW5vdWdoIHNwYWNlIHRvIGZpdCBtYXhpbXVtIGZyYW1lIGxlbmd0aCAqLworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGllZWUtPmRldi0+bXR1ICsKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyKSArCisJCQkJICAgIDggLyogTExDICovICsKKwkJCQkgICAgMiAvKiBhbGlnbm1lbnQgKi8gKworCQkJCSAgICA4IC8qIFdFUCAqLyArCisJCQkJICAgIEVUSF9BTEVOIC8qIFdEUyAqLyArCisJCQkJICAgIChJRUVFODAyMTFfUU9TX0hBU19TRVEoZmMpPzI6MCkgLyogUU9TIENvbnRyb2wgKi8pOworCQlpZiAoc2tiID09IE5VTEwpCisJCQlyZXR1cm4gTlVMTDsKKworCQllbnRyeSA9ICZpZWVlLT5mcmFnX2NhY2hlW3RpZF1baWVlZS0+ZnJhZ19uZXh0X2lkeFt0aWRdXTsKKwkJaWVlZS0+ZnJhZ19uZXh0X2lkeFt0aWRdKys7CisJCWlmIChpZWVlLT5mcmFnX25leHRfaWR4W3RpZF0gPj0gSUVFRTgwMjExX0ZSQUdfQ0FDSEVfTEVOKQorCQkJaWVlZS0+ZnJhZ19uZXh0X2lkeFt0aWRdID0gMDsKKworCQlpZiAoZW50cnktPnNrYiAhPSBOVUxMKQorCQkJZGV2X2tmcmVlX3NrYl9hbnkoZW50cnktPnNrYik7CisKKwkJZW50cnktPmZpcnN0X2ZyYWdfdGltZSA9IGppZmZpZXM7CisJCWVudHJ5LT5zZXEgPSBzZXE7CisJCWVudHJ5LT5sYXN0X2ZyYWcgPSBmcmFnOworCQllbnRyeS0+c2tiID0gc2tiOworCQltZW1jcHkoZW50cnktPnNyY19hZGRyLCBoZHItPmFkZHIyLCBFVEhfQUxFTik7CisJCW1lbWNweShlbnRyeS0+ZHN0X2FkZHIsIGhkci0+YWRkcjEsIEVUSF9BTEVOKTsKKwl9IGVsc2UgeworCQkvKiByZWNlaXZlZCBhIGZyYWdtZW50IG9mIGEgZnJhbWUgZm9yIHdoaWNoIHRoZSBoZWFkIGZyYWdtZW50CisJCSAqIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiByZWNlaXZlZCAqLworCQllbnRyeSA9IGllZWU4MDIxMV9mcmFnX2NhY2hlX2ZpbmQoaWVlZSwgc2VxLCBmcmFnLCB0aWQsaGRyLT5hZGRyMiwKKwkJCQkJCSAgaGRyLT5hZGRyMSk7CisJCWlmIChlbnRyeSAhPSBOVUxMKSB7CisJCQllbnRyeS0+bGFzdF9mcmFnID0gZnJhZzsKKwkJCXNrYiA9IGVudHJ5LT5za2I7CisJCX0KKwl9CisKKwlyZXR1cm4gc2tiOworfQorCisKKy8qIENhbGxlZCBvbmx5IGFzIGEgdGFza2xldCAoc29mdHdhcmUgSVJRKSAqLworc3RhdGljIGludCBpZWVlODAyMTFfZnJhZ19jYWNoZV9pbnZhbGlkYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyKQoreworCXUxNiBmYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKTsKKwl1MTYgc2MgPSBsZTE2X3RvX2NwdShoZHItPnNlcV9jdGwpOworCXVuc2lnbmVkIGludCBzZXEgPSBXTEFOX0dFVF9TRVFfU0VRKHNjKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2ZyYWdfZW50cnkgKmVudHJ5OworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyX1FPUyAqaGRyXzNhZGRyX1FvUzsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl9RT1MgKmhkcl80YWRkcl9Rb1M7CisJdTggdGlkOworCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWlmKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpCisJeworCQl0aWQgPSAoaGRyLT5hZGRyMltFVEhfQUxFTi0yXSBeIGhkci0+YWRkcjJbRVRIX0FMRU4tMV0pICYgSUVFRTgwMjExX1FPU19USUQ7CisJfQorCWVsc2UKKyNlbmRpZgorCWlmKCgoZmMgJiBJRUVFODAyMTFfRkNUTF9EU1RPRFMpID09IElFRUU4MDIxMV9GQ1RMX0RTVE9EUykmJklFRUU4MDIxMV9RT1NfSEFTX1NFUShmYykpIHsKKwkgIGhkcl80YWRkcl9Rb1MgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfUU9TICopaGRyOworCSAgdGlkID0gbGUxNl90b19jcHUoaGRyXzRhZGRyX1FvUy0+UU9TX2N0bCkgJiBJRUVFODAyMTFfUU9TX1RJRDsKKwkgIHRpZCA9IFVQMkFDKHRpZCk7CisJICB0aWQgKys7CisJfSBlbHNlIGlmIChJRUVFODAyMTFfUU9TX0hBU19TRVEoZmMpKSB7CisJICBoZHJfM2FkZHJfUW9TID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyX1FPUyAqKWhkcjsKKwkgIHRpZCA9IGxlMTZfdG9fY3B1KGhkcl8zYWRkcl9Rb1MtPlFPU19jdGwpICYgSUVFRTgwMjExX1FPU19USUQ7CisJICB0aWQgPSBVUDJBQyh0aWQpOworCSAgdGlkICsrOworCX0gZWxzZSB7CisJICB0aWQgPSAwOworCX0KKworCWVudHJ5ID0gaWVlZTgwMjExX2ZyYWdfY2FjaGVfZmluZChpZWVlLCBzZXEsIC0xLCB0aWQsaGRyLT5hZGRyMiwKKwkJCQkJICBoZHItPmFkZHIxKTsKKworCWlmIChlbnRyeSA9PSBOVUxMKSB7CisJCUlFRUU4MDIxMV9ERUJVR19GUkFHKAorCQkJImNvdWxkIG5vdCBpbnZhbGlkYXRlIGZyYWdtZW50IGNhY2hlICIKKwkJCSJlbnRyeSAoc2VxPSV1KVxuIiwgc2VxKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWVudHJ5LT5za2IgPSBOVUxMOworCXJldHVybiAwOworfQorCisKKworLyogaWVlZTgwMjExX3J4X2ZyYW1lX21ndG10CisgKgorICogUmVzcG9uc2libGUgZm9yIGhhbmRsaW5nIG1hbmFnZW1lbnQgY29udHJvbCBmcmFtZXMKKyAqCisgKiBDYWxsZWQgYnkgaWVlZTgwMjExX3J4ICovCitzdGF0aWMgaW5saW5lIGludAoraWVlZTgwMjExX3J4X2ZyYW1lX21nbXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCisJCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cywgdTE2IHR5cGUsCisJCQl1MTYgc3R5cGUpCit7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKworCS8vIGNoZWF0IHRoZSB0aGUgaGRyIHR5cGUKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CisKKwkvKiBPbiB0aGUgc3RydWN0IHN0YXRzIGRlZmluaXRpb24gdGhlcmUgaXMgd3JpdHRlbiB0aGF0CisJICogdGhpcyBpcyBub3QgbWFuZGF0b3J5Li4uLiBidXQgc2VlbXMgdGhhdCB0aGUgcHJvYmUKKwkgKiByZXNwb25zZSBwYXJzZXIgdXNlcyBpdAorCSAqLworCXJ4X3N0YXRzLT5sZW4gPSBza2ItPmxlbjsKKwlpZWVlODAyMTFfcnhfbWd0KGllZWUsKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhLHJ4X3N0YXRzKTsKKworCWlmKChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKSYmKG1lbWNtcChoZHItPmFkZHIzLGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCxFVEhfQUxFTikpKSB7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXJldHVybiAwOworCX0KKworCWllZWU4MDIxMV9yeF9mcmFtZV9zb2Z0bWFjKGllZWUsIHNrYiwgcnhfc3RhdHMsIHR5cGUsIHN0eXBlKTsKKworCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisKKwlyZXR1cm4gMDsKKworCSNpZmRlZiBOT1RfWUVUCisJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBNYXN0ZXIgbW9kZSBub3QgeWV0IHN1cHBwb3J0ZWQuXG4iLAorCQkgICAgICAgaWVlZS0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisvKgorICBob3N0YXBfdXBkYXRlX3N0YV9wcyhpZWVlLCAoc3RydWN0IGhvc3RhcF9pZWVlODAyMTFfaGRyICopCisgIHNrYi0+ZGF0YSk7Ki8KKwl9CisKKwlpZiAoaWVlZS0+aG9zdGFwZCAmJiB0eXBlID09IElFRUU4MDIxMV9UWVBFX01HTVQpIHsKKwkJaWYgKHN0eXBlID09IFdMQU5fRkNfU1RZUEVfQkVBQ09OICYmCisJCSAgICBpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMjsKKwkJCS8qIFByb2Nlc3MgYmVhY29uIGZyYW1lcyBhbHNvIGluIGtlcm5lbCBkcml2ZXIgdG8KKwkJCSAqIHVwZGF0ZSBTVEEoQVApIHRhYmxlIHN0YXRpc3RpY3MgKi8KKwkJCXNrYjIgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwkJCWlmIChza2IyKQorCQkJCWhvc3RhcF9yeChza2IyLT5kZXYsIHNrYjIsIHJ4X3N0YXRzKTsKKwkJfQorCisJCS8qIHNlbmQgbWFuYWdlbWVudCBmcmFtZXMgdG8gdGhlIHVzZXIgc3BhY2UgZGFlbW9uIGZvcgorCQkgKiBwcm9jZXNzaW5nICovCisJCWllZWUtPmFwZGV2c3RhdHMucnhfcGFja2V0cysrOworCQlpZWVlLT5hcGRldnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCQlwcmlzbTJfcnhfODAyMTEoaWVlZS0+YXBkZXYsIHNrYiwgcnhfc3RhdHMsIFBSSVNNMl9SWF9NR01UKTsKKwkJcmV0dXJuIDA7CisJfQorCisJICAgIGlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKSB7CisJCWlmICh0eXBlICE9IFdMQU5fRkNfVFlQRV9NR01UICYmIHR5cGUgIT0gV0xBTl9GQ19UWVBFX0NUUkwpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogdW5rbm93biBtYW5hZ2VtZW50IGZyYW1lICIKKwkJCSAgICAgICAiKHR5cGU9MHglMDJ4LCBzdHlwZT0weCUwMngpIGRyb3BwZWRcbiIsCisJCQkgICAgICAgc2tiLT5kZXYtPm5hbWUsIHR5cGUsIHN0eXBlKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWhvc3RhcF9yeChza2ItPmRldiwgc2tiLCByeF9zdGF0cyk7CisJCXJldHVybiAwOworCX0KKworCXByaW50ayhLRVJOX0RFQlVHICIlczogaG9zdGFwX3J4X2ZyYW1lX21nbXQ6IG1hbmFnZW1lbnQgZnJhbWUgIgorCSAgICAgICAicmVjZWl2ZWQgaW4gbm9uLUhvc3QgQVAgbW9kZVxuIiwgc2tiLT5kZXYtPm5hbWUpOworCXJldHVybiAtMTsKKwkjZW5kaWYKK30KKworCisKKy8qIFNlZSBJRUVFIDgwMi4xSCBmb3IgTExDL1NOQVAgZW5jYXBzdWxhdGlvbi9kZWNhcHN1bGF0aW9uICovCisvKiBFdGhlcm5ldC1JSSBzbmFwIGhlYWRlciAoUkZDMTA0MiBmb3IgbW9zdCBFdGhlclR5cGVzKSAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgcmZjMTA0Ml9oZWFkZXJbXSA9Cit7IDB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKy8qIEJyaWRnZS1UdW5uZWwgaGVhZGVyIChmb3IgRXRoZXJUeXBlcyBFVEhfUF9BQVJQIGFuZCBFVEhfUF9JUFgpICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBicmlkZ2VfdHVubmVsX2hlYWRlcltdID0KK3sgMHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHhmOCB9OworLyogTm8gZW5jYXBzdWxhdGlvbiBoZWFkZXIgaWYgRXRoZXJUeXBlIDwgMHg2MDAgKD1sZW5ndGgpICovCisKKy8qIENhbGxlZCBieSBpZWVlODAyMTFfcnhfZnJhbWVfZGVjcnlwdCAqLworc3RhdGljIGludCBpZWVlODAyMTFfaXNfZWFwb2xfZnJhbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IsIHNpemVfdCBoZHJsZW4pCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsKKwl1MTYgZmMsIGV0aGVydHlwZTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworCXU4ICpwb3M7CisKKwlpZiAoc2tiLT5sZW4gPCAyNCkKKwkJcmV0dXJuIDA7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworCWZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOworCisJLyogY2hlY2sgdGhhdCB0aGUgZnJhbWUgaXMgdW5pY2FzdCBmcmFtZSB0byB1cyAqLworCWlmICgoZmMgJiAoSUVFRTgwMjExX0ZDVExfVE9EUyB8IElFRUU4MDIxMV9GQ1RMX0ZST01EUykpID09CisJICAgIElFRUU4MDIxMV9GQ1RMX1RPRFMgJiYKKwkgICAgbWVtY21wKGhkci0+YWRkcjEsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSA9PSAwICYmCisJICAgIG1lbWNtcChoZHItPmFkZHIzLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTikgPT0gMCkgeworCQkvKiBUb0RTIGZyYW1lIHdpdGggb3duIGFkZHIgQlNTSUQgYW5kIERBICovCisJfSBlbHNlIGlmICgoZmMgJiAoSUVFRTgwMjExX0ZDVExfVE9EUyB8IElFRUU4MDIxMV9GQ1RMX0ZST01EUykpID09CisJCSAgIElFRUU4MDIxMV9GQ1RMX0ZST01EUyAmJgorCQkgICBtZW1jbXAoaGRyLT5hZGRyMSwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pID09IDApIHsKKwkJLyogRnJvbURTIGZyYW1lIHdpdGggb3duIGFkZHIgYXMgREEgKi8KKwl9IGVsc2UKKwkJcmV0dXJuIDA7CisKKwlpZiAoc2tiLT5sZW4gPCAyNCArIDgpCisJCXJldHVybiAwOworCisJLyogY2hlY2sgZm9yIHBvcnQgYWNjZXNzIGVudGl0eSBFdGhlcm5ldCB0eXBlICovCisvLwlwb3MgPSBza2ItPmRhdGEgKyAyNDsKKwlwb3MgPSBza2ItPmRhdGEgKyBoZHJsZW47CisJZXRoZXJ0eXBlID0gKHBvc1s2XSA8PCA4KSB8IHBvc1s3XTsKKwlpZiAoZXRoZXJ0eXBlID09IEVUSF9QX1BBRSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpLCBieSBpZWVlODAyMTFfcnggKi8KK3N0YXRpYyBpbmxpbmUgaW50CitpZWVlODAyMTFfcnhfZnJhbWVfZGVjcnlwdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqY3J5cHQpCit7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKwlpbnQgcmVzLCBoZHJsZW47CisKKwlpZiAoY3J5cHQgPT0gTlVMTCB8fCBjcnlwdC0+b3BzLT5kZWNyeXB0X21wZHUgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlpZigoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkgJiYgKGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcnhfZnJhbWVfZ2V0X2hkcmxlbikpCisJeworCQloZHJsZW4gPSBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3J4X2ZyYW1lX2dldF9oZHJsZW4oaWVlZSwgc2tiKTsKKwl9CisJZWxzZQorI2VuZGlmCisJaGRybGVuID0gaWVlZTgwMjExX2dldF9oZHJsZW4obGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpKTsKKworI2lmZGVmIENPTkZJR19JRUVFODAyMTFfQ1JZUFRfVEtJUAorCWlmIChpZWVlLT50a2lwX2NvdW50ZXJtZWFzdXJlcyAmJgorCSAgICBzdHJjbXAoY3J5cHQtPm9wcy0+bmFtZSwgIlRLSVAiKSA9PSAwKSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogVEtJUCBjb3VudGVybWVhc3VyZXM6IGRyb3BwZWQgIgorCQkJICAgICAgICJyZWNlaXZlZCBwYWNrZXQgZnJvbSAiIE1BQ19GTVQgIlxuIiwKKwkJCSAgICAgICBpZWVlLT5kZXYtPm5hbWUsIE1BQ19BUkcoaGRyLT5hZGRyMikpOworCQl9CisJCXJldHVybiAtMTsKKwl9CisjZW5kaWYKKworCWF0b21pY19pbmMoJmNyeXB0LT5yZWZjbnQpOworCXJlcyA9IGNyeXB0LT5vcHMtPmRlY3J5cHRfbXBkdShza2IsIGhkcmxlbiwgY3J5cHQtPnByaXYpOworCWF0b21pY19kZWMoJmNyeXB0LT5yZWZjbnQpOworCWlmIChyZXMgPCAwKSB7CisJCUlFRUU4MDIxMV9ERUJVR19EUk9QKAorCQkJImRlY3J5cHRpb24gZmFpbGVkIChTQT0iIE1BQ19GTVQKKwkJCSIpIHJlcz0lZFxuIiwgTUFDX0FSRyhoZHItPmFkZHIyKSwgcmVzKTsKKwkJaWYgKHJlcyA9PSAtMikKKwkJCUlFRUU4MDIxMV9ERUJVR19EUk9QKCJEZWNyeXB0aW9uIGZhaWxlZCBJQ1YgIgorCQkJCQkgICAgICJtaXNtYXRjaCAoa2V5ICVkKVxuIiwKKwkJCQkJICAgICBza2ItPmRhdGFbaGRybGVuICsgM10gPj4gNik7CisJCWllZWUtPmllZWVfc3RhdHMucnhfZGlzY2FyZHNfdW5kZWNyeXB0YWJsZSsrOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIHJlczsKK30KKworCisvKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSksIGJ5IGllZWU4MDIxMV9yeCAqLworc3RhdGljIGlubGluZSBpbnQKK2llZWU4MDIxMV9yeF9mcmFtZV9kZWNyeXB0X21zZHUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgIGludCBrZXlpZHgsIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqY3J5cHQpCit7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKwlpbnQgcmVzLCBoZHJsZW47CisKKwlpZiAoY3J5cHQgPT0gTlVMTCB8fCBjcnlwdC0+b3BzLT5kZWNyeXB0X21zZHUgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlpZigoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkgJiYgKGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcnhfZnJhbWVfZ2V0X2hkcmxlbikpCisJeworCQloZHJsZW4gPSBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3J4X2ZyYW1lX2dldF9oZHJsZW4oaWVlZSwgc2tiKTsKKwl9CisJZWxzZQorI2VuZGlmCisJaGRybGVuID0gaWVlZTgwMjExX2dldF9oZHJsZW4obGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpKTsKKworCWF0b21pY19pbmMoJmNyeXB0LT5yZWZjbnQpOworCXJlcyA9IGNyeXB0LT5vcHMtPmRlY3J5cHRfbXNkdShza2IsIGtleWlkeCwgaGRybGVuLCBjcnlwdC0+cHJpdik7CisJYXRvbWljX2RlYygmY3J5cHQtPnJlZmNudCk7CisJaWYgKHJlcyA8IDApIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBNU0RVIGRlY3J5cHRpb24vTUlDIHZlcmlmaWNhdGlvbiBmYWlsZWQiCisJCSAgICAgICAiIChTQT0iIE1BQ19GTVQgIiBrZXlpZHg9JWQpXG4iLAorCQkgICAgICAgaWVlZS0+ZGV2LT5uYW1lLCBNQUNfQVJHKGhkci0+YWRkcjIpLCBrZXlpZHgpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyogdGhpcyBmdW5jdGlvbiBpcyBzdG9sZW4gZnJvbSBpcHcyMjAwIGRyaXZlciovCisjZGVmaW5lIElFRUVfUEFDS0VUX1JFVFJZX1RJTUUgKDUqSFopCitzdGF0aWMgaW50IGlzX2R1cGxpY2F0ZV9wYWNrZXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhlYWRlcikKK3sKKwl1MTYgZmMgPSBsZTE2X3RvX2NwdShoZWFkZXItPmZyYW1lX2N0bCk7CisJdTE2IHNjID0gbGUxNl90b19jcHUoaGVhZGVyLT5zZXFfY3RsKTsKKwl1MTYgc2VxID0gV0xBTl9HRVRfU0VRX1NFUShzYyk7CisJdTE2IGZyYWcgPSBXTEFOX0dFVF9TRVFfRlJBRyhzYyk7CisJdTE2ICpsYXN0X3NlcSwgKmxhc3RfZnJhZzsKKwl1bnNpZ25lZCBsb25nICpsYXN0X3RpbWU7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHJfUU9TICpoZHJfM2FkZHJfUW9TOworCXN0cnVjdCBpZWVlODAyMTFfaGRyX1FPUyAqaGRyXzRhZGRyX1FvUzsKKwl1OCB0aWQ7CisKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJaWYoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkKKwl7CisJCXRpZCA9IChoZWFkZXItPmFkZHIyW0VUSF9BTEVOLTJdIF4gaGVhZGVyLT5hZGRyMltFVEhfQUxFTi0xXSkgJiBJRUVFODAyMTFfUU9TX1RJRDsKKwl9CisJZWxzZQorI2VuZGlmCisJLy9UTzJEUyBhbmQgUW9TCisJaWYoKChmYyAmIElFRUU4MDIxMV9GQ1RMX0RTVE9EUykgPT0gSUVFRTgwMjExX0ZDVExfRFNUT0RTKSYmSUVFRTgwMjExX1FPU19IQVNfU0VRKGZjKSkgeworCSAgaGRyXzRhZGRyX1FvUyA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl9RT1MgKiloZWFkZXI7CisJICB0aWQgPSBsZTE2X3RvX2NwdShoZHJfNGFkZHJfUW9TLT5RT1NfY3RsKSAmIElFRUU4MDIxMV9RT1NfVElEOworCSAgdGlkID0gVVAyQUModGlkKTsKKwkgIHRpZCArKzsKKwl9IGVsc2UgaWYoSUVFRTgwMjExX1FPU19IQVNfU0VRKGZjKSkgeyAvL1FvUworCSAgaGRyXzNhZGRyX1FvUyA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcl9RT1MqKWhlYWRlcjsKKwkgIHRpZCA9IGxlMTZfdG9fY3B1KGhkcl8zYWRkcl9Rb1MtPlFPU19jdGwpICYgSUVFRTgwMjExX1FPU19USUQ7CisJICB0aWQgPSBVUDJBQyh0aWQpOworCSAgdGlkICsrOworCX0gZWxzZSB7IC8vIG5vIFFvUworCSAgdGlkID0gMDsKKwl9CisJc3dpdGNoIChpZWVlLT5pd19tb2RlKSB7CisJY2FzZSBJV19NT0RFX0FESE9DOgorCXsKKwkJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwkJc3RydWN0IGllZWVfaWJzc19zZXEgKmVudHJ5ID0gTlVMTDsKKwkJdTggKm1hYyA9IGhlYWRlci0+YWRkcjI7CisJCWludCBpbmRleCA9IG1hY1s1XSAlIElFRUVfSUJTU19NQUNfSEFTSF9TSVpFOworCQkvL2ZvciAocG9zID0gKGhlYWQpLT5uZXh0OyBwb3MgIT0gKGhlYWQpOyBwb3MgPSBwb3MtPm5leHQpCisJCV9fbGlzdF9mb3JfZWFjaChwLCAmaWVlZS0+aWJzc19tYWNfaGFzaFtpbmRleF0pIHsKKwkJCWVudHJ5ID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaWVlZV9pYnNzX3NlcSwgbGlzdCk7CisJCQlpZiAoIW1lbWNtcChlbnRyeS0+bWFjLCBtYWMsIEVUSF9BTEVOKSkKKwkJCQlicmVhazsKKwkJfQorCS8vCWlmIChtZW1jbXAoZW50cnktPm1hYywgbWFjLCBFVEhfQUxFTikpeworCQlpZiAocCA9PSAmaWVlZS0+aWJzc19tYWNfaGFzaFtpbmRleF0pIHsKKwkJCWVudHJ5ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGllZWVfaWJzc19zZXEpLCBHRlBfQVRPTUlDKTsKKwkJCWlmICghZW50cnkpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYW5ub3QgbWFsbG9jIG5ldyBtYWMgZW50cnlcbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJbWVtY3B5KGVudHJ5LT5tYWMsIG1hYywgRVRIX0FMRU4pOworCQkJZW50cnktPnNlcV9udW1bdGlkXSA9IHNlcTsKKwkJCWVudHJ5LT5mcmFnX251bVt0aWRdID0gZnJhZzsKKwkJCWVudHJ5LT5wYWNrZXRfdGltZVt0aWRdID0gamlmZmllczsKKwkJCWxpc3RfYWRkKCZlbnRyeS0+bGlzdCwgJmllZWUtPmlic3NfbWFjX2hhc2hbaW5kZXhdKTsKKwkJCXJldHVybiAwOworCQl9CisJCWxhc3Rfc2VxID0gJmVudHJ5LT5zZXFfbnVtW3RpZF07CisJCWxhc3RfZnJhZyA9ICZlbnRyeS0+ZnJhZ19udW1bdGlkXTsKKwkJbGFzdF90aW1lID0gJmVudHJ5LT5wYWNrZXRfdGltZVt0aWRdOworCQlicmVhazsKKwl9CisKKwljYXNlIElXX01PREVfSU5GUkE6CisJCWxhc3Rfc2VxID0gJmllZWUtPmxhc3RfcnhzZXFfbnVtW3RpZF07CisJCWxhc3RfZnJhZyA9ICZpZWVlLT5sYXN0X3J4ZnJhZ19udW1bdGlkXTsKKwkJbGFzdF90aW1lID0gJmllZWUtPmxhc3RfcGFja2V0X3RpbWVbdGlkXTsKKworCQlicmVhazsKKwlkZWZhdWx0OgorI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwkJaWYoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkKKwkJeworCQkJbGFzdF9zZXEgPSAmaWVlZS0+bGFzdF9yeHNlcV9udW1bdGlkXTsKKwkJCWxhc3RfZnJhZyA9ICZpZWVlLT5sYXN0X3J4ZnJhZ19udW1bdGlkXTsKKwkJCWxhc3RfdGltZSA9ICZpZWVlLT5sYXN0X3BhY2tldF90aW1lW3RpZF07CisJCQlicmVhazsKKwkJfQorCQllbHNlCisjZW5kaWYKKwkJcmV0dXJuIDA7CisJfQorCisvLwlpZih0aWQgIT0gMCkgeworLy8JCXByaW50ayhLRVJOX1dBUk5JTkcgIjopKSkpKSkpKSkpKSV4ICV4ICV4LCBmYygleClcbiIsIHRpZCwgKmxhc3Rfc2VxLCBzZXEsIGhlYWRlci0+ZnJhbWVfY3RsKTsKKy8vCX0KKwlpZiAoKCpsYXN0X3NlcSA9PSBzZXEpICYmCisJICAgIHRpbWVfYWZ0ZXIoKmxhc3RfdGltZSArIElFRUVfUEFDS0VUX1JFVFJZX1RJTUUsIGppZmZpZXMpKSB7CisJCWlmICgqbGFzdF9mcmFnID09IGZyYWcpeworCQkJLy9wcmludGsoS0VSTl9XQVJOSU5HICJbMV0gZ28gZHJvcCFcbiIpOworCQkJZ290byBkcm9wOworCisJCX0KKwkJaWYgKCpsYXN0X2ZyYWcgKyAxICE9IGZyYWcpCisJCQkvKiBvdXQtb2Ytb3JkZXIgZnJhZ21lbnQgKi8KKwkJCS8vcHJpbnRrKEtFUk5fV0FSTklORyAiWzJdIGdvIGRyb3AhXG4iKTsKKwkJCWdvdG8gZHJvcDsKKwl9IGVsc2UKKwkJKmxhc3Rfc2VxID0gc2VxOworCisJKmxhc3RfZnJhZyA9IGZyYWc7CisJKmxhc3RfdGltZSA9IGppZmZpZXM7CisJcmV0dXJuIDA7CisKK2Ryb3A6CisvLwlCVUdfT04oIShmYyAmIElFRUU4MDIxMV9GQ1RMX1JFVFJZKSk7CisvLwlwcmludGsoIkRVUFxuIik7CisKKwlyZXR1cm4gMTsKK30KKworCisvKiBBbGwgcmVjZWl2ZWQgZnJhbWVzIGFyZSBzZW50IHRvIHRoaXMgZnVuY3Rpb24uIEBza2IgY29udGFpbnMgdGhlIGZyYW1lIGluCisgKiBJRUVFIDgwMi4xMSBmb3JtYXQsIGkuZS4sIGluIHRoZSBmb3JtYXQgaXQgd2FzIHNlbnQgb3ZlciBhaXIuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmx5IGFzIGEgdGFza2xldCAoc29mdHdhcmUgSVJRKS4gKi8KK2ludCBpZWVlODAyMTFfcngoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCisJCSBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWVlZS0+ZGV2OworCS8vc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisJLy9zdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcl9RT1MgKmhkcjsKKworCXNpemVfdCBoZHJsZW47CisJdTE2IGZjLCB0eXBlLCBzdHlwZSwgc2M7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzOworCXVuc2lnbmVkIGludCBmcmFnOworCXU4ICpwYXlsb2FkOworCXUxNiBldGhlcnR5cGU7CisjaWZkZWYgTk9UX1lFVAorCXN0cnVjdCBuZXRfZGV2aWNlICp3ZHMgPSBOVUxMOworCXN0cnVjdCBza19idWZmICpza2IyID0gTlVMTDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqd2RzID0gTlVMTDsKKwlpbnQgZnJhbWVfYXV0aG9yaXplZCA9IDA7CisJaW50IGZyb21fYXNzb2NfYXAgPSAwOworCXZvaWQgKnN0YSA9IE5VTEw7CisjZW5kaWYKKy8vCXUxNiBRT1NfY3RsID0gMDsKKwl1OCBkc3RbRVRIX0FMRU5dOworCXU4IHNyY1tFVEhfQUxFTl07CisJdTggYnNzaWRbRVRIX0FMRU5dOworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqY3J5cHQgPSBOVUxMOworCWludCBrZXlpZHggPSAwOworCisJLy9BZGRlZCBmb3IgbWVzaCBieSBMYXdyZW5jZS4KKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJdTggc3RhdHVzOworCXUzMiBmbGFnczsKKyNlbmRpZgorCS8vIGNoZWF0IHRoZSB0aGUgaGRyIHR5cGUKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CisJc3RhdHMgPSAmaWVlZS0+c3RhdHM7CisKKwlpZiAoc2tiLT5sZW4gPCAxMCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogU0tCIGxlbmd0aCA8IDEwXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJZ290byByeF9kcm9wcGVkOworCX0KKworCWZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOworCXR5cGUgPSBXTEFOX0ZDX0dFVF9UWVBFKGZjKTsKKwlzdHlwZSA9IFdMQU5fRkNfR0VUX1NUWVBFKGZjKTsKKwlzYyA9IGxlMTZfdG9fY3B1KGhkci0+c2VxX2N0bCk7CisKKwlmcmFnID0gV0xBTl9HRVRfU0VRX0ZSQUcoc2MpOworCisvL1lKLGFkZCwwODA4MjgsZm9yIGtlZXAgYWxpdmUKKwlpZigoZmMgJiBJRUVFODAyMTFfRkNUTF9UT0RTKSAhPSBJRUVFODAyMTFfRkNUTF9UT0RTKQorCXsKKwkJaWYoIW1lbWNtcChoZHItPmFkZHIxLGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSkKKwkJeworCQkJaWVlZS0+TnVtUnhVbmljYXN0Kys7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJaWYoIW1lbWNtcChoZHItPmFkZHIzLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTikpCisJCXsKKwkJCWllZWUtPk51bVJ4VW5pY2FzdCsrOworCQl9CisJfQorLy9ZSixhZGQsMDgwODI4LGZvciBrZWVwIGFsaXZlLGVuZAorCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWlmKChpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlKSAmJiAoaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9yeF9mcmFtZV9nZXRfaGRybGVuKSkKKwl7CisJCWhkcmxlbiA9IGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcnhfZnJhbWVfZ2V0X2hkcmxlbihpZWVlLCBza2IpOworCQlpZihza2ItPmxlbiA8IGhkcmxlbikKKwkJCWdvdG8gcnhfZHJvcHBlZDsKKwl9CisJZWxzZQorI2VuZGlmCisJaGRybGVuID0gaWVlZTgwMjExX2dldF9oZHJsZW4oZmMpOworCisjaWZkZWYgTk9UX1lFVAorI2lmIFdJUkVMRVNTX0VYVCA+IDE1CisJLyogUHV0IHRoaXMgY29kZSBoZXJlIHNvIHRoYXQgd2UgYXZvaWQgZHVwbGljYXRpbmcgaXQgaW4gYWxsCisJICogUnggcGF0aHMuIC0gSmVhbiBJSSAqLworI2lmZGVmIElXX1dJUkVMRVNTX1NQWQkJLyogZGVmaW5lZCBpbiBpd19oYW5kbGVyLmggKi8KKwkvKiBJZiBzcHkgbW9uaXRvcmluZyBvbiAqLworCWlmIChpZmFjZS0+c3B5X2RhdGEuc3B5X251bWJlciA+IDApIHsKKwkJc3RydWN0IGl3X3F1YWxpdHkgd3N0YXRzOworCQl3c3RhdHMubGV2ZWwgPSByeF9zdGF0cy0+c2lnbmFsOworCQl3c3RhdHMubm9pc2UgPSByeF9zdGF0cy0+bm9pc2U7CisJCXdzdGF0cy51cGRhdGVkID0gNjsJLyogTm8gcXVhbCB2YWx1ZSAqLworCQkvKiBVcGRhdGUgc3B5IHJlY29yZHMgKi8KKwkJd2lyZWxlc3Nfc3B5X3VwZGF0ZShkZXYsIGhkci0+YWRkcjIsICZ3c3RhdHMpOworCX0KKyNlbmRpZiAvKiBJV19XSVJFTEVTU19TUFkgKi8KKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiAxNSAqLworCWhvc3RhcF91cGRhdGVfcnhfc3RhdHMobG9jYWwtPmFwLCBoZHIsIHJ4X3N0YXRzKTsKKyNlbmRpZgorCisjaWYgV0lSRUxFU1NfRVhUID4gMTUKKwlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpIHsKKwkJaWVlZTgwMjExX21vbml0b3JfcngoaWVlZSwgc2tiLCByeF9zdGF0cyk7CisJCXN0YXRzLT5yeF9wYWNrZXRzKys7CisJCXN0YXRzLT5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwkJcmV0dXJuIDE7CisJfQorI2VuZGlmCisJaWYgKGllZWUtPmhvc3RfZGVjcnlwdCkgeworCQlpbnQgaWR4ID0gMDsKKwkJaWYgKHNrYi0+bGVuID49IGhkcmxlbiArIDMpCisJCQlpZHggPSBza2ItPmRhdGFbaGRybGVuICsgM10gPj4gNjsKKwkJY3J5cHQgPSBpZWVlLT5jcnlwdFtpZHhdOworI2lmZGVmIE5PVF9ZRVQKKwkJc3RhID0gTlVMTDsKKworCQkvKiBVc2Ugc3RhdGlvbiBzcGVjaWZpYyBrZXkgdG8gb3ZlcnJpZGUgZGVmYXVsdCBrZXlzIGlmIHRoZQorCQkgKiByZWNlaXZlciBhZGRyZXNzIGlzIGEgdW5pY2FzdCBhZGRyZXNzICgiaW5kaXZpZHVhbCBSQSIpLiBJZgorCQkgKiBiY3J4X3N0YV9rZXkgcGFyYW1ldGVyIGlzIHNldCwgc3RhdGlvbiBzcGVjaWZpYyBrZXkgaXMgdXNlZAorCQkgKiBldmVuIHdpdGggYnJvYWQvbXVsdGljYXN0IHRhcmdldHMgKHRoaXMgaXMgYWdhaW5zdCBJRUVFCisJCSAqIDgwMi4xMSwgYnV0IG1ha2VzIGl0IGVhc2llciB0byB1c2UgZGlmZmVyZW50IGtleXMgd2l0aAorCQkgKiBzdGF0aW9ucyB0aGF0IGRvIG5vdCBzdXBwb3J0IFdFUCBrZXkgbWFwcGluZykuICovCisKKwkJaWYgKCEoaGRyLT5hZGRyMVswXSAmIDB4MDEpIHx8IGxvY2FsLT5iY3J4X3N0YV9rZXkpCisJCQkodm9pZCkgaG9zdGFwX2hhbmRsZV9zdGFfY3J5cHRvKGxvY2FsLCBoZHIsICZjcnlwdCwKKwkJCQkJCQkmc3RhKTsKKyNlbmRpZgorCisJCS8qIGFsbG93IE5VTEwgZGVjcnlwdCB0byBpbmRpY2F0ZSBhbiBzdGF0aW9uIHNwZWNpZmljIG92ZXJyaWRlCisJCSAqIGZvciBkZWZhdWx0IGVuY3J5cHRpb24gKi8KKwkJaWYgKGNyeXB0ICYmIChjcnlwdC0+b3BzID09IE5VTEwgfHwKKwkJCSAgICAgIGNyeXB0LT5vcHMtPmRlY3J5cHRfbXBkdSA9PSBOVUxMKSkKKwkJCWNyeXB0ID0gTlVMTDsKKworCQlpZiAoIWNyeXB0ICYmIChmYyAmIElFRUU4MDIxMV9GQ1RMX1dFUCkpIHsKKwkJCS8qIFRoaXMgc2VlbXMgdG8gYmUgdHJpZ2dlcmVkIGJ5IHNvbWUgKG11bHRpY2FzdD8pCisJCQkgKiBmcmFtZXMgZnJvbSBvdGhlciB0aGFuIGN1cnJlbnQgQlNTLCBzbyBqdXN0IGRyb3AgdGhlCisJCQkgKiBmcmFtZXMgc2lsZW50bHkgaW5zdGVhZCBvZiBmaWxsaW5nIHN5c3RlbSBsb2cgd2l0aAorCQkJICogdGhlc2UgcmVwb3J0cy4gKi8KKwkJCUlFRUU4MDIxMV9ERUJVR19EUk9QKCJEZWNyeXB0aW9uIGZhaWxlZCAobm90IHNldCkiCisJCQkJCSAgICAgIiAoU0E9IiBNQUNfRk1UICIpXG4iLAorCQkJCQkgICAgIE1BQ19BUkcoaGRyLT5hZGRyMikpOworCQkJaWVlZS0+aWVlZV9zdGF0cy5yeF9kaXNjYXJkc191bmRlY3J5cHRhYmxlKys7CisJCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJCX0KKwl9CisKKwlpZiAoc2tiLT5sZW4gPCBJRUVFODAyMTFfREFUQV9IRFIzX0xFTikKKwkJZ290byByeF9kcm9wcGVkOworCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWlmKCBpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlICYmIGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcnhfbWd0X3VwZGF0ZV9leHBpcmUgKQorCQlpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3J4X21ndF91cGRhdGVfZXhwaXJlKCBpZWVlLCBza2IgKTsKKyNlbmRpZgorCisJLy8gaWYgUW9TIGVuYWJsZWQsIHNob3VsZCBjaGVjayB0aGUgc2VxdWVuY2UgZm9yIGVhY2ggb2YgdGhlIEFDCisJaWYgKGlzX2R1cGxpY2F0ZV9wYWNrZXQoaWVlZSwgaGRyKSkKKwkJZ290byByeF9kcm9wcGVkOworCisKKwlpZiAodHlwZSA9PSBJRUVFODAyMTFfRlRZUEVfTUdNVCkgeworCisJI2lmIDAKKwkJaWYgKCBzdHlwZSA9PSBJRUVFODAyMTFfU1RZUEVfQVVUSCAmJgorCQkgICAgZmMgJiBJRUVFODAyMTFfRkNUTF9XRVAgJiYgaWVlZS0+aG9zdF9kZWNyeXB0ICYmCisJCSAgICAoa2V5aWR4ID0gaG9zdGFwX3J4X2ZyYW1lX2RlY3J5cHQoaWVlZSwgc2tiLCBjcnlwdCkpIDwgMCkKKwkJeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBmYWlsZWQgdG8gZGVjcnlwdCBtZ210OjphdXRoICIKKwkJCSAgICAgICAiZnJvbSAiIE1BQ19GTVQgIlxuIiwgZGV2LT5uYW1lLAorCQkJICAgICAgIE1BQ19BUkcoaGRyLT5hZGRyMikpOworCQkJLyogVE9ETzogY291bGQgaW5mb3JtIGhvc3RhcGQgYWJvdXQgdGhpcyBzbyB0aGF0IGl0CisJCQkgKiBjb3VsZCBzZW5kIGF1dGggZmFpbHVyZSByZXBvcnQgKi8KKwkJCWdvdG8gcnhfZHJvcHBlZDsKKwkJfQorCSNlbmRpZgorCisKKwkJaWYgKGllZWU4MDIxMV9yeF9mcmFtZV9tZ210KGllZWUsIHNrYiwgcnhfc3RhdHMsIHR5cGUsIHN0eXBlKSkKKwkJCWdvdG8gcnhfZHJvcHBlZDsKKwkJZWxzZQorCQkJZ290byByeF9leGl0OworCX0KKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJaWYoKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpICYmIGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcnhfb25fcngpCisJeworCQlpZihpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3J4X29uX3J4KGllZWUsIHNrYiwgcnhfc3RhdHMsIHR5cGUsIHN0eXBlKT09MCkKKwkJeworCQkJZ290byByeF9leGl0OworCQl9CisJfQorI2VuZGlmCisKKwkvKiBEYXRhIGZyYW1lIC0gZXh0cmFjdCBzcmMvZHN0IGFkZHJlc3NlcyAqLworCXN3aXRjaCAoZmMgJiAoSUVFRTgwMjExX0ZDVExfRlJPTURTIHwgSUVFRTgwMjExX0ZDVExfVE9EUykpIHsKKwljYXNlIElFRUU4MDIxMV9GQ1RMX0ZST01EUzoKKwkJbWVtY3B5KGRzdCwgaGRyLT5hZGRyMSwgRVRIX0FMRU4pOworCQltZW1jcHkoc3JjLCBoZHItPmFkZHIzLCBFVEhfQUxFTik7CisJCW1lbWNweShic3NpZCxoZHItPmFkZHIyLEVUSF9BTEVOKTsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfRkNUTF9UT0RTOgorCQltZW1jcHkoZHN0LCBoZHItPmFkZHIzLCBFVEhfQUxFTik7CisJCW1lbWNweShzcmMsIGhkci0+YWRkcjIsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KGJzc2lkLGhkci0+YWRkcjEsRVRIX0FMRU4pOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9GQ1RMX0ZST01EUyB8IElFRUU4MDIxMV9GQ1RMX1RPRFM6CisJCWlmIChza2ItPmxlbiA8IElFRUU4MDIxMV9EQVRBX0hEUjRfTEVOKQorCQkJZ290byByeF9kcm9wcGVkOworCQltZW1jcHkoZHN0LCBoZHItPmFkZHIzLCBFVEhfQUxFTik7CisJCW1lbWNweShzcmMsIGhkci0+YWRkcjQsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KGJzc2lkLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKTsKKwkJYnJlYWs7CisJY2FzZSAwOgorCQltZW1jcHkoZHN0LCBoZHItPmFkZHIxLCBFVEhfQUxFTik7CisJCW1lbWNweShzcmMsIGhkci0+YWRkcjIsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KGJzc2lkLGhkci0+YWRkcjMsRVRIX0FMRU4pOworCQlicmVhazsKKwl9CisKKyNpZmRlZiBOT1RfWUVUCisJaWYgKGhvc3RhcF9yeF9mcmFtZV93ZHMoaWVlZSwgaGRyLCBmYywgJndkcykpCisJCWdvdG8gcnhfZHJvcHBlZDsKKwlpZiAod2RzKSB7CisJCXNrYi0+ZGV2ID0gZGV2ID0gd2RzOworCQlzdGF0cyA9IGhvc3RhcF9nZXRfc3RhdHMoZGV2KTsKKwl9CisKKwlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUiAmJiAhd2RzICYmCisJICAgIChmYyAmIChJRUVFODAyMTFfRkNUTF9UT0RTIHwgSUVFRTgwMjExX0ZDVExfRlJPTURTKSkgPT0gSUVFRTgwMjExX0ZDVExfRlJPTURTICYmCisJICAgIGllZWUtPnN0YWRldiAmJgorCSAgICBtZW1jbXAoaGRyLT5hZGRyMiwgaWVlZS0+YXNzb2NfYXBfYWRkciwgRVRIX0FMRU4pID09IDApIHsKKwkJLyogRnJhbWUgZnJvbSBCU1NJRCBvZiB0aGUgQVAgZm9yIHdoaWNoIHdlIGFyZSBhIGNsaWVudCAqLworCQlza2ItPmRldiA9IGRldiA9IGllZWUtPnN0YWRldjsKKwkJc3RhdHMgPSBob3N0YXBfZ2V0X3N0YXRzKGRldik7CisJCWZyb21fYXNzb2NfYXAgPSAxOworCX0KKyNlbmRpZgorCisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKworI2lmZGVmIE5PVF9ZRVQKKwlpZiAoKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIgfHwKKwkgICAgIGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9SRVBFQVQpICYmCisJICAgICFmcm9tX2Fzc29jX2FwKSB7CisJCXN3aXRjaCAoaG9zdGFwX2hhbmRsZV9zdGFfcngoaWVlZSwgZGV2LCBza2IsIHJ4X3N0YXRzLAorCQkJCQkgICAgIHdkcyAhPSBOVUxMKSkgeworCQljYXNlIEFQX1JYX0NPTlRJTlVFX05PVF9BVVRIT1JJWkVEOgorCQkJZnJhbWVfYXV0aG9yaXplZCA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBBUF9SWF9DT05USU5VRToKKwkJCWZyYW1lX2F1dGhvcml6ZWQgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgQVBfUlhfRFJPUDoKKwkJCWdvdG8gcnhfZHJvcHBlZDsKKwkJY2FzZSBBUF9SWF9FWElUOgorCQkJZ290byByeF9leGl0OworCQl9CisJfQorI2VuZGlmCisKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJaWYoKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpICYmIGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcnhfaXNfdmFsaWRfZnJhbWVjdGwpCisJeworCQlpZihpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3J4X2lzX3ZhbGlkX2ZyYW1lY3RsKGllZWUsIGZjLCB0eXBlLCBzdHlwZSk9PTApCisJCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJfQorCWVsc2UKKyNlbmRpZgorCS8qIE51bGxmdW5jIGZyYW1lcyBtYXkgaGF2ZSBQUy1iaXQgc2V0LCBzbyB0aGV5IG11c3QgYmUgcGFzc2VkIHRvCisJICogaG9zdGFwX2hhbmRsZV9zdGFfcngoKSBiZWZvcmUgYmVpbmcgZHJvcHBlZCBoZXJlLiAqLworCWlmIChzdHlwZSAhPSBJRUVFODAyMTFfU1RZUEVfREFUQSAmJgorCSAgICBzdHlwZSAhPSBJRUVFODAyMTFfU1RZUEVfREFUQV9DRkFDSyAmJgorCSAgICBzdHlwZSAhPSBJRUVFODAyMTFfU1RZUEVfREFUQV9DRlBPTEwgJiYKKwkgICAgc3R5cGUgIT0gSUVFRTgwMjExX1NUWVBFX0RBVEFfQ0ZBQ0tQT0xMJiYKKwkgICAgc3R5cGUgIT0gSUVFRTgwMjExX1NUWVBFX1FPU19EQVRBLy9hZGQgYnkgRGF2aWQsMjAwNi44LjQKKwkgICAgKSB7CisJCWlmIChzdHlwZSAhPSBJRUVFODAyMTFfU1RZUEVfTlVMTEZVTkMpCisJCQlJRUVFODAyMTFfREVCVUdfRFJPUCgKKwkJCQkiUlg6IGRyb3BwZWQgZGF0YSBmcmFtZSAiCisJCQkJIndpdGggbm8gZGF0YSAodHlwZT0weCUwMngsICIKKwkJCQkic3VidHlwZT0weCUwMngsIGxlbj0lZClcbiIsCisJCQkJdHlwZSwgc3R5cGUsIHNrYi0+bGVuKTsKKwkJZ290byByeF9kcm9wcGVkOworCX0KKwlpZihtZW1jbXAoYnNzaWQsaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLEVUSF9BTEVOKSkgeworCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJfQorCisJaWVlZS0+TnVtUnhEYXRhSW5QZXJpb2QrKzsKKwlpZWVlLT5OdW1SeE9rVG90YWwrKzsKKwkvKiBza2I6IGhkciArIChwb3NzaWJseSBmcmFnbWVudGVkLCBwb3NzaWJseSBlbmNyeXB0ZWQpIHBheWxvYWQgKi8KKworCWlmIChpZWVlLT5ob3N0X2RlY3J5cHQgJiYgKGZjICYgSUVFRTgwMjExX0ZDVExfV0VQKSAmJgorCSAgICAoa2V5aWR4ID0gaWVlZTgwMjExX3J4X2ZyYW1lX2RlY3J5cHQoaWVlZSwgc2tiLCBjcnlwdCkpIDwgMCkKKwkJZ290byByeF9kcm9wcGVkOworCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKKworCS8qIHNrYjogaGRyICsgKHBvc3NpYmx5IGZyYWdtZW50ZWQpIHBsYWludGV4dCBwYXlsb2FkICovCisJLy8gUFI6IEZJWE1FOiBob3N0YXAgaGFzIGFkZGl0aW9uYWwgY29uZGl0aW9ucyBpbiB0aGUgImlmIiBiZWxvdzoKKwkvLyBpZWVlLT5ob3N0X2RlY3J5cHQgJiYgKGZjICYgSUVFRTgwMjExX0ZDVExfV0VQKSAmJgorCWlmICgoZnJhZyAhPSAwIHx8IChmYyAmIElFRUU4MDIxMV9GQ1RMX01PUkVGUkFHUykpKSB7CisJCWludCBmbGVuOworCQlzdHJ1Y3Qgc2tfYnVmZiAqZnJhZ19za2IgPSBpZWVlODAyMTFfZnJhZ19jYWNoZV9nZXQoaWVlZSwgaGRyKTsKKwkJSUVFRTgwMjExX0RFQlVHX0ZSQUcoIlJ4IEZyYWdtZW50IHJlY2VpdmVkICgldSlcbiIsIGZyYWcpOworCisJCWlmICghZnJhZ19za2IpIHsKKwkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfUlggfCBJRUVFODAyMTFfRExfRlJBRywKKwkJCQkJIlJ4IGNhbm5vdCBnZXQgc2tiIGZyb20gZnJhZ21lbnQgIgorCQkJCQkiY2FjaGUgKG1vcmVmcmFnPSVkIHNlcT0ldSBmcmFnPSV1KVxuIiwKKwkJCQkJKGZjICYgSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTKSAhPSAwLAorCQkJCQlXTEFOX0dFVF9TRVFfU0VRKHNjKSwgZnJhZyk7CisJCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJCX0KKwkJZmxlbiA9IHNrYi0+bGVuOworCQlpZiAoZnJhZyAhPSAwKQorCQkJZmxlbiAtPSBoZHJsZW47CisKKwkJaWYgKGZyYWdfc2tiLT50YWlsICsgZmxlbiA+IGZyYWdfc2tiLT5lbmQpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBob3N0IGRlY3J5cHRlZCBhbmQgIgorCQkJICAgICAgICJyZWFzc2VtYmxlZCBmcmFtZSBkaWQgbm90IGZpdCBza2JcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCWllZWU4MDIxMV9mcmFnX2NhY2hlX2ludmFsaWRhdGUoaWVlZSwgaGRyKTsKKwkJCWdvdG8gcnhfZHJvcHBlZDsKKwkJfQorCisJCWlmIChmcmFnID09IDApIHsKKwkJCS8qIGNvcHkgZmlyc3QgZnJhZ21lbnQgKGluY2x1ZGluZyBmdWxsIGhlYWRlcnMpIGludG8KKwkJCSAqIGJlZ2lubmluZyBvZiB0aGUgZnJhZ21lbnQgY2FjaGUgc2tiICovCisJCQltZW1jcHkoc2tiX3B1dChmcmFnX3NrYiwgZmxlbiksIHNrYi0+ZGF0YSwgZmxlbik7CisJCX0gZWxzZSB7CisJCQkvKiBhcHBlbmQgZnJhbWUgcGF5bG9hZCB0byB0aGUgZW5kIG9mIHRoZSBmcmFnbWVudAorCQkJICogY2FjaGUgc2tiICovCisJCQltZW1jcHkoc2tiX3B1dChmcmFnX3NrYiwgZmxlbiksIHNrYi0+ZGF0YSArIGhkcmxlbiwKKwkJCSAgICAgICBmbGVuKTsKKwkJfQorCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlza2IgPSBOVUxMOworCisJCWlmIChmYyAmIElFRUU4MDIxMV9GQ1RMX01PUkVGUkFHUykgeworCQkJLyogbW9yZSBmcmFnbWVudHMgZXhwZWN0ZWQgLSBsZWF2ZSB0aGUgc2tiIGluIGZyYWdtZW50CisJCQkgKiBjYWNoZSBmb3Igbm93OyBpdCB3aWxsIGJlIGRlbGl2ZXJlZCB0byB1cHBlciBsYXllcnMKKwkJCSAqIGFmdGVyIGFsbCBmcmFnbWVudHMgaGF2ZSBiZWVuIHJlY2VpdmVkICovCisJCQlnb3RvIHJ4X2V4aXQ7CisJCX0KKworCQkvKiB0aGlzIHdhcyB0aGUgbGFzdCBmcmFnbWVudCBhbmQgdGhlIGZyYW1lIHdpbGwgYmUKKwkJICogZGVsaXZlcmVkLCBzbyByZW1vdmUgc2tiIGZyb20gZnJhZ21lbnQgY2FjaGUgKi8KKwkJc2tiID0gZnJhZ19za2I7CisJCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CisJCWllZWU4MDIxMV9mcmFnX2NhY2hlX2ludmFsaWRhdGUoaWVlZSwgaGRyKTsKKwl9CisKKwkvKiBza2I6IGhkciArIChwb3NzaWJsZSByZWFzc2VtYmxlZCkgZnVsbCBNU0RVIHBheWxvYWQ7IHBvc3NpYmx5IHN0aWxsCisJICogZW5jcnlwdGVkL2F1dGhlbnRpY2F0ZWQgKi8KKwlpZiAoaWVlZS0+aG9zdF9kZWNyeXB0ICYmIChmYyAmIElFRUU4MDIxMV9GQ1RMX1dFUCkgJiYKKwkgICAgaWVlZTgwMjExX3J4X2ZyYW1lX2RlY3J5cHRfbXNkdShpZWVlLCBza2IsIGtleWlkeCwgY3J5cHQpKQorCQlnb3RvIHJ4X2Ryb3BwZWQ7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworCWlmIChjcnlwdCAmJiAhKGZjICYgSUVFRTgwMjExX0ZDVExfV0VQKSAmJiAhaWVlZS0+b3Blbl93ZXApIHsKKwkJaWYgKC8qaWVlZS0+aWVlZTgwMl8xeCAmJiovCisJCSAgICBpZWVlODAyMTFfaXNfZWFwb2xfZnJhbWUoaWVlZSwgc2tiLCBoZHJsZW4pKSB7CisKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCisJCQkvKiBwYXNzIHVuZW5jcnlwdGVkIEVBUE9MIGZyYW1lcyBldmVuIGlmIGVuY3J5cHRpb24gaXMKKwkJCSAqIGNvbmZpZ3VyZWQgKi8KKwkJCXN0cnVjdCBlYXBvbCAqZWFwID0gKHN0cnVjdCBlYXBvbCAqKShza2ItPmRhdGEgKworCQkJCTI0KTsKKwkJCUlFRUU4MDIxMV9ERUJVR19FQVAoIlJYOiBJRUVFIDgwMi4xWCBFQVBPTCBmcmFtZTogJXNcbiIsCisJCQkJCQllYXBfZ2V0X3R5cGUoZWFwLT50eXBlKSk7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCUlFRUU4MDIxMV9ERUJVR19EUk9QKAorCQkJCSJlbmNyeXB0aW9uIGNvbmZpZ3VyZWQsIGJ1dCBSWCAiCisJCQkJImZyYW1lIG5vdCBlbmNyeXB0ZWQgKFNBPSIgTUFDX0ZNVCAiKVxuIiwKKwkJCQlNQUNfQVJHKGhkci0+YWRkcjIpKTsKKwkJCWdvdG8gcnhfZHJvcHBlZDsKKwkJfQorCX0KKworI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKKwlpZiAoY3J5cHQgJiYgIShmYyAmIElFRUU4MDIxMV9GQ1RMX1dFUCkgJiYKKwkgICAgaWVlZTgwMjExX2lzX2VhcG9sX2ZyYW1lKGllZWUsIHNrYiwgaGRybGVuKSkgeworCQkJc3RydWN0IGVhcG9sICplYXAgPSAoc3RydWN0IGVhcG9sICopKHNrYi0+ZGF0YSArCisJCQkJMjQpOworCQkJSUVFRTgwMjExX0RFQlVHX0VBUCgiUlg6IElFRUUgODAyLjFYIEVBUE9MIGZyYW1lOiAlc1xuIiwKKwkJCQkJCWVhcF9nZXRfdHlwZShlYXAtPnR5cGUpKTsKKwl9CisjZW5kaWYKKworCWlmIChjcnlwdCAmJiAhKGZjICYgSUVFRTgwMjExX0ZDVExfV0VQKSAmJiAhaWVlZS0+b3Blbl93ZXAgJiYKKwkgICAgIWllZWU4MDIxMV9pc19lYXBvbF9mcmFtZShpZWVlLCBza2IsIGhkcmxlbikpIHsKKwkJSUVFRTgwMjExX0RFQlVHX0RST1AoCisJCQkiZHJvcHBlZCB1bmVuY3J5cHRlZCBSWCBkYXRhICIKKwkJCSJmcmFtZSBmcm9tICIgTUFDX0ZNVAorCQkJIiAoZHJvcF91bmVuY3J5cHRlZD0xKVxuIiwKKwkJCU1BQ19BUkcoaGRyLT5hZGRyMikpOworCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJfQorLyoKKwlpZihpZWVlODAyMTFfaXNfZWFwb2xfZnJhbWUoaWVlZSwgc2tiLCBoZHJsZW4pKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlJYOiBJRUVFODAyLjFYIEVQQU9MIGZyYW1lIVxuIik7CisJfQorKi8KKwkvKiBza2I6IGhkciArIChwb3NzaWJsZSByZWFzc2VtYmxlZCkgZnVsbCBwbGFpbnRleHQgcGF5bG9hZCAqLworCXBheWxvYWQgPSBza2ItPmRhdGEgKyBoZHJsZW47CisJZXRoZXJ0eXBlID0gKHBheWxvYWRbNl0gPDwgOCkgfCBwYXlsb2FkWzddOworCisjaWZkZWYgTk9UX1lFVAorCS8qIElmIElFRUUgODAyLjFYIGlzIHVzZWQsIGNoZWNrIHdoZXRoZXIgdGhlIHBvcnQgaXMgYXV0aG9yaXplZCB0byBzZW5kCisJICogdGhlIHJlY2VpdmVkIGZyYW1lLiAqLworCWlmIChpZWVlLT5pZWVlODAyXzF4ICYmIGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpIHsKKwkJaWYgKGV0aGVydHlwZSA9PSBFVEhfUF9QQUUpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogUlg6IElFRUUgODAyLjFYIGZyYW1lXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQlpZiAoaWVlZS0+aG9zdGFwZCAmJiBpZWVlLT5hcGRldikgeworCQkJCS8qIFNlbmQgSUVFRSA4MDIuMVggZnJhbWVzIHRvIHRoZSB1c2VyCisJCQkJICogc3BhY2UgZGFlbW9uIGZvciBwcm9jZXNzaW5nICovCisJCQkJcHJpc20yX3J4XzgwMjExKGllZWUtPmFwZGV2LCBza2IsIHJ4X3N0YXRzLAorCQkJCQkJUFJJU00yX1JYX01HTVQpOworCQkJCWllZWUtPmFwZGV2c3RhdHMucnhfcGFja2V0cysrOworCQkJCWllZWUtPmFwZGV2c3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCQkJZ290byByeF9leGl0OworCQkJfQorCQl9IGVsc2UgaWYgKCFmcmFtZV9hdXRob3JpemVkKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGRyb3BwZWQgZnJhbWUgZnJvbSAiCisJCQkgICAgICAgInVuYXV0aG9yaXplZCBwb3J0IChJRUVFIDgwMi4xWCk6ICIKKwkJCSAgICAgICAiZXRoZXJ0eXBlPTB4JTA0eFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGV0aGVydHlwZSk7CisJCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJCX0KKwl9CisjZW5kaWYKKworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlpZigoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkgJiYgaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9yeF9wcm9jZXNzX2RhdGFmcmFtZSkKKwl7CisJLy9BZGRlZCBmb3IgbWVzaCByeCBpbnRlcnJ1cHQuCisJCS8vc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssZmxhZ3MpOworCQlzdGF0dXMgPSBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3J4X3Byb2Nlc3NfZGF0YWZyYW1lKGllZWUsIHNrYiwgcnhfc3RhdHMpOworCQkvL3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssZmxhZ3MpOworCisJCWlmKHN0YXR1cykKKy8vCWlmKGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcnhfcHJvY2Vzc19kYXRhZnJhbWUoaWVlZSwgc2tiLCByeF9zdGF0cykpCisJCQlnb3RvIHJ4X2V4aXQ7CisJCWVsc2UKKwkJCWdvdG8gcnhfZHJvcHBlZDsKKwl9CisjZW5kaWYKKworCS8qIGNvbnZlcnQgaGRyICsgcG9zc2libGUgTExDIGhlYWRlcnMgaW50byBFdGhlcm5ldCBoZWFkZXIgKi8KKwlpZiAoc2tiLT5sZW4gLSBoZHJsZW4gPj0gOCAmJgorCSAgICAoKG1lbWNtcChwYXlsb2FkLCByZmMxMDQyX2hlYWRlciwgU05BUF9TSVpFKSA9PSAwICYmCisJICAgICAgZXRoZXJ0eXBlICE9IEVUSF9QX0FBUlAgJiYgZXRoZXJ0eXBlICE9IEVUSF9QX0lQWCkgfHwKKwkgICAgIG1lbWNtcChwYXlsb2FkLCBicmlkZ2VfdHVubmVsX2hlYWRlciwgU05BUF9TSVpFKSA9PSAwKSkgeworCQkvKiByZW1vdmUgUkZDMTA0MiBvciBCcmlkZ2UtVHVubmVsIGVuY2Fwc3VsYXRpb24gYW5kCisJCSAqIHJlcGxhY2UgRXRoZXJUeXBlICovCisJCXNrYl9wdWxsKHNrYiwgaGRybGVuICsgU05BUF9TSVpFKTsKKwkJbWVtY3B5KHNrYl9wdXNoKHNrYiwgRVRIX0FMRU4pLCBzcmMsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KHNrYl9wdXNoKHNrYiwgRVRIX0FMRU4pLCBkc3QsIEVUSF9BTEVOKTsKKwl9IGVsc2UgeworCQl1MTYgbGVuOworCQkvKiBMZWF2ZSBFdGhlcm5ldCBoZWFkZXIgcGFydCBvZiBoZHIgYW5kIGZ1bGwgcGF5bG9hZCAqLworCQlza2JfcHVsbChza2IsIGhkcmxlbik7CisJCWxlbiA9IGh0b25zKHNrYi0+bGVuKTsKKwkJbWVtY3B5KHNrYl9wdXNoKHNrYiwgMiksICZsZW4sIDIpOworCQltZW1jcHkoc2tiX3B1c2goc2tiLCBFVEhfQUxFTiksIHNyYywgRVRIX0FMRU4pOworCQltZW1jcHkoc2tiX3B1c2goc2tiLCBFVEhfQUxFTiksIGRzdCwgRVRIX0FMRU4pOworCX0KKworI2lmZGVmIE5PVF9ZRVQKKwlpZiAod2RzICYmICgoZmMgJiAoSUVFRTgwMjExX0ZDVExfVE9EUyB8IElFRUU4MDIxMV9GQ1RMX0ZST01EUykpID09CisJCSAgICBJRUVFODAyMTFfRkNUTF9UT0RTKSAmJgorCSAgICBza2ItPmxlbiA+PSBFVEhfSExFTiArIEVUSF9BTEVOKSB7CisJCS8qIE5vbi1zdGFuZGFyZCBmcmFtZTogZ2V0IGFkZHI0IGZyb20gaXRzIGJvZ3VzIGxvY2F0aW9uIGFmdGVyCisJCSAqIHRoZSBwYXlsb2FkICovCisJCW1lbWNweShza2ItPmRhdGEgKyBFVEhfQUxFTiwKKwkJICAgICAgIHNrYi0+ZGF0YSArIHNrYi0+bGVuIC0gRVRIX0FMRU4sIEVUSF9BTEVOKTsKKwkJc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIEVUSF9BTEVOKTsKKwl9CisjZW5kaWYKKworCXN0YXRzLT5yeF9wYWNrZXRzKys7CisJc3RhdHMtPnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCisjaWZkZWYgTk9UX1lFVAorCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSICYmICF3ZHMgJiYKKwkgICAgaWVlZS0+YXAtPmJyaWRnZV9wYWNrZXRzKSB7CisJCWlmIChkc3RbMF0gJiAweDAxKSB7CisJCQkvKiBjb3B5IG11bHRpY2FzdCBmcmFtZSBib3RoIHRvIHRoZSBoaWdoZXIgbGF5ZXJzIGFuZAorCQkJICogdG8gdGhlIHdpcmVsZXNzIG1lZGlhICovCisJCQlpZWVlLT5hcC0+YnJpZGdlZF9tdWx0aWNhc3QrKzsKKwkJCXNrYjIgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwkJCWlmIChza2IyID09IE5VTEwpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBza2JfY2xvbmUgZmFpbGVkIGZvciAiCisJCQkJICAgICAgICJtdWx0aWNhc3QgZnJhbWVcbiIsIGRldi0+bmFtZSk7CisJCX0gZWxzZSBpZiAoaG9zdGFwX2lzX3N0YV9hc3NvYyhpZWVlLT5hcCwgZHN0KSkgeworCQkJLyogc2VuZCBmcmFtZSBkaXJlY3RseSB0byB0aGUgYXNzb2NpYXRlZCBTVEEgdXNpbmcKKwkJCSAqIHdpcmVsZXNzIG1lZGlhIGFuZCBub3QgcGFzc2luZyB0byBoaWdoZXIgbGF5ZXJzICovCisJCQlpZWVlLT5hcC0+YnJpZGdlZF91bmljYXN0Kys7CisJCQlza2IyID0gc2tiOworCQkJc2tiID0gTlVMTDsKKwkJfQorCX0KKworCWlmIChza2IyICE9IE5VTEwpIHsKKwkJLyogc2VuZCB0byB3aXJlbGVzcyBtZWRpYSAqLworCQlza2IyLT5wcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyXzMpOworCQlza2IyLT5tYWMucmF3ID0gc2tiMi0+bmgucmF3ID0gc2tiMi0+ZGF0YTsKKwkJLyogc2tiMi0+bmgucmF3ID0gc2tiMi0+ZGF0YSArIEVUSF9ITEVOOyAqLworCQlza2IyLT5kZXYgPSBkZXY7CisJCWRldl9xdWV1ZV94bWl0KHNrYjIpOworCX0KKworI2VuZGlmCisJaWYgKHNrYikgeworCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQltZW1zZXQoc2tiLT5jYiwgMCwgc2l6ZW9mKHNrYi0+Y2IpKTsKKwkJc2tiLT5kZXYgPSBkZXY7CisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsgLyogODAyLjExIGNyYyBub3Qgc3VmZmljaWVudCAqLworCQlpZWVlLT5sYXN0X3J4X3BzX3RpbWUgPSBqaWZmaWVzOworCQluZXRpZl9yeChza2IpOworCX0KKworIHJ4X2V4aXQ6CisjaWZkZWYgTk9UX1lFVAorCWlmIChzdGEpCisJCWhvc3RhcF9oYW5kbGVfc3RhX3JlbGVhc2Uoc3RhKTsKKyNlbmRpZgorCXJldHVybiAxOworCisgcnhfZHJvcHBlZDoKKwlzdGF0cy0+cnhfZHJvcHBlZCsrOworCisJLyogUmV0dXJuaW5nIDAgaW5kaWNhdGVzIHRvIGNhbGxlciB0aGF0IHdlIGhhdmUgbm90IGhhbmRsZWQgdGhlIFNLQi0tCisJICogc28gaXQgaXMgc3RpbGwgYWxsb2NhdGVkIGFuZCBjYW4gYmUgdXNlZCBhZ2FpbiBieSB1bmRlcmx5aW5nCisJICogaGFyZHdhcmUgYXMgYSBETUEgdGFyZ2V0ICovCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCitpbnQgaWVlZV9leHRfc2tiX3A4MDIxMV90b19ldGhlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRybGVuLCB1OCAqZHN0LCB1OCAqc3JjKQoreworCXU4ICpwYXlsb2FkOworCXUxNiBldGhlcnR5cGU7CisKKwkvKiBza2I6IGhkciArIChwb3NzaWJsZSByZWFzc2VtYmxlZCkgZnVsbCBwbGFpbnRleHQgcGF5bG9hZCAqLworCXBheWxvYWQgPSBza2ItPmRhdGEgKyBoZHJsZW47CisJZXRoZXJ0eXBlID0gKHBheWxvYWRbNl0gPDwgOCkgfCBwYXlsb2FkWzddOworCisJLyogY29udmVydCBoZHIgKyBwb3NzaWJsZSBMTEMgaGVhZGVycyBpbnRvIEV0aGVybmV0IGhlYWRlciAqLworCWlmIChza2ItPmxlbiAtIGhkcmxlbiA+PSA4ICYmCisJICAgICgobWVtY21wKHBheWxvYWQsIHJmYzEwNDJfaGVhZGVyLCBTTkFQX1NJWkUpID09IDAgJiYKKwkgICAgICBldGhlcnR5cGUgIT0gRVRIX1BfQUFSUCAmJiBldGhlcnR5cGUgIT0gRVRIX1BfSVBYKSB8fAorCSAgICAgbWVtY21wKHBheWxvYWQsIGJyaWRnZV90dW5uZWxfaGVhZGVyLCBTTkFQX1NJWkUpID09IDApKSB7CisJCS8qIHJlbW92ZSBSRkMxMDQyIG9yIEJyaWRnZS1UdW5uZWwgZW5jYXBzdWxhdGlvbiBhbmQKKwkJICogcmVwbGFjZSBFdGhlclR5cGUgKi8KKwkJc2tiX3B1bGwoc2tiLCBoZHJsZW4gKyBTTkFQX1NJWkUpOworCQltZW1jcHkoc2tiX3B1c2goc2tiLCBFVEhfQUxFTiksIHNyYywgRVRIX0FMRU4pOworCQltZW1jcHkoc2tiX3B1c2goc2tiLCBFVEhfQUxFTiksIGRzdCwgRVRIX0FMRU4pOworCX0gZWxzZSB7CisJCXUxNiBsZW47CisJCS8qIExlYXZlIEV0aGVybmV0IGhlYWRlciBwYXJ0IG9mIGhkciBhbmQgZnVsbCBwYXlsb2FkICovCisJCXNrYl9wdWxsKHNrYiwgaGRybGVuKTsKKwkJbGVuID0gaHRvbnMoc2tiLT5sZW4pOworCQltZW1jcHkoc2tiX3B1c2goc2tiLCAyKSwgJmxlbiwgMik7CisJCW1lbWNweShza2JfcHVzaChza2IsIEVUSF9BTEVOKSwgc3JjLCBFVEhfQUxFTik7CisJCW1lbWNweShza2JfcHVzaChza2IsIEVUSF9BTEVOKSwgZHN0LCBFVEhfQUxFTik7CisJfQorCisJcmV0dXJuIDE7Cit9CisjZW5kaWYgLy8gX1JUTDgxODdfRVhUX1BBVENIXworCisKKyNkZWZpbmUgTUdNVF9GUkFNRV9GSVhFRF9QQVJUX0xFTkdUSAkJMHgyNAorCitzdGF0aWMgaW5saW5lIGludCBpZWVlODAyMTFfaXNfb2ZkbV9yYXRlKHU4IHJhdGUpCit7CisJc3dpdGNoIChyYXRlICYgfklFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0spIHsKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfNk1COgorCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV85TUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzE4TUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzM2TUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzQ4TUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUI6CisJCXJldHVybiAxOworCX0KKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGllZWU4MDIxMV9TaWduYWxTdHJlbmd0aFRyYW5zbGF0ZSgKKwlpbnQgIEN1cnJTUworCSkKK3sKKwlpbnQgUmV0U1M7CisKKwkvLyBTdGVwIDEuIFNjYWxlIG1hcHBpbmcuCisJaWYoQ3VyclNTID49IDcxICYmIEN1cnJTUyA8PSAxMDApCisJeworCQlSZXRTUyA9IDkwICsgKChDdXJyU1MgLSA3MCkgLyAzKTsKKwl9CisJZWxzZSBpZihDdXJyU1MgPj0gNDEgJiYgQ3VyclNTIDw9IDcwKQorCXsKKwkJUmV0U1MgPSA3OCArICgoQ3VyclNTIC0gNDApIC8gMyk7CisJfQorCWVsc2UgaWYoQ3VyclNTID49IDMxICYmIEN1cnJTUyA8PSA0MCkKKwl7CisJCVJldFNTID0gNjYgKyAoQ3VyclNTIC0gMzApOworCX0KKwllbHNlIGlmKEN1cnJTUyA+PSAyMSAmJiBDdXJyU1MgPD0gMzApCisJeworCQlSZXRTUyA9IDU0ICsgKEN1cnJTUyAtIDIwKTsKKwl9CisJZWxzZSBpZihDdXJyU1MgPj0gNSAmJiBDdXJyU1MgPD0gMjApCisJeworCQlSZXRTUyA9IDQyICsgKCgoQ3VyclNTIC0gNSkgKiAyKSAvIDMpOworCX0KKwllbHNlIGlmKEN1cnJTUyA9PSA0KQorCXsKKwkJUmV0U1MgPSAzNjsKKwl9CisJZWxzZSBpZihDdXJyU1MgPT0gMykKKwl7CisJCVJldFNTID0gMjc7CisJfQorCWVsc2UgaWYoQ3VyclNTID09IDIpCisJeworCQlSZXRTUyA9IDE4OworCX0KKwllbHNlIGlmKEN1cnJTUyA9PSAxKQorCXsKKwkJUmV0U1MgPSA5OworCX0KKwllbHNlCisJeworCQlSZXRTUyA9IEN1cnJTUzsKKwl9CisJLy9SVF9UUkFDRShDT01QX0RCRywgREJHX0xPVUQsICgiIyMjIyMgQWZ0ZXIgTWFwcGluZzogIExhc3RTUzogJWQsIEN1cnJTUzogJWQsIFJldFNTOiAlZFxuIiwgTGFzdFNTLCBDdXJyU1MsIFJldFNTKSk7CisKKwkvLyBTdGVwIDIuIFNtb290aGluZy4KKworCS8vUlRfVFJBQ0UoQ09NUF9EQkcsIERCR19MT1VELCAoIiQkJCQkIEFmdGVyIFNtb290aGluZzogIExhc3RTUzogJWQsIEN1cnJTUzogJWQsIFJldFNTOiAlZFxuIiwgTGFzdFNTLCBDdXJyU1MsIFJldFNTKSk7CisKKwlyZXR1cm4gUmV0U1M7Cit9CisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECitzdGF0aWMgaW5saW5lIHZvaWQgaWVlZTgwMjExX2V4dHJhY3RfY291bnRyeV9pZSgKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCAqaW5mb19lbGVtZW50LAorCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yaywKKwl1OCAqIGFkZHIyCispCit7CisjaWYgMAorCXUzMiBpID0gMDsKKwl1OCAqIHAgPSAodTgqKWluZm9fZWxlbWVudC0+ZGF0YTsKKwlwcmludGsoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwlwcmludGsoIiVzIENvdW50cnkgSUU6IiwgbmV0d29yay0+c3NpZCk7CisJZm9yKGk9MDsgaTxpbmZvX2VsZW1lbnQtPmxlbjsgaSsrKQorCQlwcmludGsoIlx0JTIuMngiLCAqKHAraSkpOworCXByaW50aygiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisjZW5kaWYKKwlpZihJU19ET1QxMURfRU5BQkxFKGllZWUpKQorCXsKKwkJaWYoaW5mb19lbGVtZW50LT5sZW4hPSAwKQorCQl7CisJCQltZW1jcHkobmV0d29yay0+Q291bnRyeUllQnVmLCBpbmZvX2VsZW1lbnQtPmRhdGEsIGluZm9fZWxlbWVudC0+bGVuKTsKKwkJCW5ldHdvcmstPkNvdW50cnlJZUxlbiA9IGluZm9fZWxlbWVudC0+bGVuOworCisJCQlpZighSVNfQ09VTlRSWV9JRV9WQUxJRChpZWVlKSkKKwkJCXsKKwkJCQlEb3QxMWRfVXBkYXRlQ291bnRyeUllKGllZWUsIGFkZHIyLCBpbmZvX2VsZW1lbnQtPmxlbiwgaW5mb19lbGVtZW50LT5kYXRhKTsKKwkJCX0KKwkJfQorCisJCS8vCisJCS8vIDA3MDMwNSwgcmNuamtvOiBJIHVwZGF0ZSBjb3VudHJ5IElFIHdhdGNoIGRvZyBoZXJlIGJlY2F1c2UKKwkJLy8gc29tZSBBUCAoZS5nLiBDaXNjbyAxMjQyKSBkb24ndCBpbmNsdWRlIGNvdW50cnkgSUUgaW4gdGhlaXIKKwkJLy8gcHJvYmUgcmVzcG9uc2UgZnJhbWUuCisJCS8vCisJCWlmKElTX0VRVUFMX0NJRV9TUkMoaWVlZSwgYWRkcjIpICkKKwkJeworCQkJVVBEQVRFX0NJRV9XQVRDSERPRyhpZWVlKTsKKwkJfQorCX0KKworfQorI2VuZGlmCisKK2ludAoraWVlZTgwMjExX1RyYW5zbGF0ZVRvRGJtKAorCXVuc2lnbmVkIGNoYXIgU2lnbmFsU3RyZW5ndGhJbmRleAkvLyAwLTEwMCBpbmRleC4KKwkpCit7CisJdW5zaWduZWQgY2hhciBTaWduYWxQb3dlcjsgLy8gaW4gZEJtLgorCisJLy8gVHJhbnNsYXRlIHRvIGRCbSAoeD0wLjV5LTk1KS4KKwlTaWduYWxQb3dlciA9IChpbnQpU2lnbmFsU3RyZW5ndGhJbmRleCAqIDcgLyAxMDsKKwlTaWduYWxQb3dlciAtPSA5NTsKKworCXJldHVybiBTaWduYWxQb3dlcjsKK30KK2lubGluZSBpbnQgaWVlZTgwMjExX25ldHdvcmtfaW5pdCgKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwlzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlICpiZWFjb24sCisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrLAorCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnN0YXRzKQoreworI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKKwljaGFyIHJhdGVzX3N0cls2NF07CisJY2hhciAqcDsKKyNlbmRpZgorCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50ICppbmZvX2VsZW1lbnQ7CisgCXUxNiBsZWZ0OworCXU4IGk7CisJc2hvcnQgb2Zmc2V0OworCXU4IGN1clJhdGUgPSAwLGhPcFJhdGUgPSAwLGN1clJhdGVfZXggPSAwOworCisJLyogUHVsbCBvdXQgZml4ZWQgZmllbGQgZGF0YSAqLworCW1lbWNweShuZXR3b3JrLT5ic3NpZCwgYmVhY29uLT5oZWFkZXIuYWRkcjMsIEVUSF9BTEVOKTsKKwluZXR3b3JrLT5jYXBhYmlsaXR5ID0gYmVhY29uLT5jYXBhYmlsaXR5OworCW5ldHdvcmstPmxhc3Rfc2Nhbm5lZCA9IGppZmZpZXM7CisJbmV0d29yay0+dGltZV9zdGFtcFswXSA9IGJlYWNvbi0+dGltZV9zdGFtcFswXTsKKwluZXR3b3JrLT50aW1lX3N0YW1wWzFdID0gYmVhY29uLT50aW1lX3N0YW1wWzFdOworCW5ldHdvcmstPmJlYWNvbl9pbnRlcnZhbCA9IGJlYWNvbi0+YmVhY29uX2ludGVydmFsOworCS8qIFdoZXJlIHRvIHB1bGwgdGhpcz8gYmVhY29uLT5saXN0ZW5faW50ZXJ2YWw7Ki8KKwluZXR3b3JrLT5saXN0ZW5faW50ZXJ2YWwgPSAweDBBOworCW5ldHdvcmstPnJhdGVzX2xlbiA9IG5ldHdvcmstPnJhdGVzX2V4X2xlbiA9IDA7CisJbmV0d29yay0+bGFzdF9hc3NvY2lhdGUgPSAwOworCW5ldHdvcmstPnNzaWRfbGVuID0gMDsKKwluZXR3b3JrLT5mbGFncyA9IDA7CisJbmV0d29yay0+YXRpbV93aW5kb3cgPSAwOworCW5ldHdvcmstPlFvU19FbmFibGUgPSAwOworLy9ieSBhbXkgMDgwMzEyCisJbmV0d29yay0+SGlnaGVzdE9wZXJhUmF0ZSA9IDA7CisvL2J5IGFteSAwODAzMTIKKyNpZmRlZiBUSE9NQVNfVFVSQk8KKwluZXR3b3JrLT5UdXJib19FbmFibGUgPSAwOworI2VuZGlmCisjaWZkZWYgRU5BQkxFX0RPVDExRAorCW5ldHdvcmstPkNvdW50cnlJZUxlbiA9IDA7CisJbWVtc2V0KG5ldHdvcmstPkNvdW50cnlJZUJ1ZiwgMCwgTUFYX0lFX0xFTik7CisjZW5kaWYKKworCWlmIChzdGF0cy0+ZnJlcSA9PSBJRUVFODAyMTFfNTJHSFpfQkFORCkgeworCQkvKiBmb3IgQSBiYW5kIChObyBEUyBpbmZvKSAqLworCQluZXR3b3JrLT5jaGFubmVsID0gc3RhdHMtPnJlY2VpdmVkX2NoYW5uZWw7CisJfSBlbHNlCisJCW5ldHdvcmstPmZsYWdzIHw9IE5FVFdPUktfSEFTX0NDSzsKKworIAluZXR3b3JrLT53cGFfaWVfbGVuID0gMDsKKyAJbmV0d29yay0+cnNuX2llX2xlbiA9IDA7CisKKyAJaW5mb19lbGVtZW50ID0gJmJlYWNvbi0+aW5mb19lbGVtZW50OworCWxlZnQgPSBzdGF0cy0+bGVuIC0gKCh2b2lkICopaW5mb19lbGVtZW50IC0gKHZvaWQgKiliZWFjb24pOworCXdoaWxlIChsZWZ0ID49IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudF9oZHIpKSB7CisJCWlmIChzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnRfaGRyKSArIGluZm9fZWxlbWVudC0+bGVuID4gbGVmdCkgeworCQkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIlNDQU46IHBhcnNlIGZhaWxlZDogaW5mb19lbGVtZW50LT5sZW4gKyAyID4gbGVmdCA6IGluZm9fZWxlbWVudC0+bGVuKzI9JWQgbGVmdD0lZC5cbiIsCisJCQkJCSAgICAgaW5mb19lbGVtZW50LT5sZW4gKyBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQpLAorCQkJCQkgICAgIGxlZnQpOworCQkJcmV0dXJuIDE7CisgICAgICAgICAgICAgICAJfQorCisJCXN3aXRjaCAoaW5mb19lbGVtZW50LT5pZCkgeworCQljYXNlIE1GSUVfVFlQRV9TU0lEOgorCQkJaWYgKGllZWU4MDIxMV9pc19lbXB0eV9lc3NpZChpbmZvX2VsZW1lbnQtPmRhdGEsCisJCQkJCQkgICAgIGluZm9fZWxlbWVudC0+bGVuKSkgeworCQkJCW5ldHdvcmstPmZsYWdzIHw9IE5FVFdPUktfRU1QVFlfRVNTSUQ7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCW5ldHdvcmstPnNzaWRfbGVuID0gbWluKGluZm9fZWxlbWVudC0+bGVuLAorCQkJCQkJKHU4KUlXX0VTU0lEX01BWF9TSVpFKTsKKwkJCW1lbWNweShuZXR3b3JrLT5zc2lkLCBpbmZvX2VsZW1lbnQtPmRhdGEsIG5ldHdvcmstPnNzaWRfbGVuKTsKKyAgICAgICAgCQlpZiAobmV0d29yay0+c3NpZF9sZW4gPCBJV19FU1NJRF9NQVhfU0laRSkKKyAgICAgICAgICAgICAgICAJCW1lbXNldChuZXR3b3JrLT5zc2lkICsgbmV0d29yay0+c3NpZF9sZW4sIDAsCisJCQkJICAgICAgIElXX0VTU0lEX01BWF9TSVpFIC0gbmV0d29yay0+c3NpZF9sZW4pOworCisJCQlJRUVFODAyMTFfREVCVUdfU0NBTigiTUZJRV9UWVBFX1NTSUQ6ICclcycgbGVuPSVkLlxuIiwKKwkJCQkJICAgICBuZXR3b3JrLT5zc2lkLCBuZXR3b3JrLT5zc2lkX2xlbik7CisJCQlicmVhazsKKworCQljYXNlIE1GSUVfVFlQRV9SQVRFUzoKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCisJCQlwID0gcmF0ZXNfc3RyOworI2VuZGlmCisJCQluZXR3b3JrLT5yYXRlc19sZW4gPSBtaW4oaW5mb19lbGVtZW50LT5sZW4sIE1BWF9SQVRFU19MRU5HVEgpOworCQkJZm9yIChpID0gMDsgaSA8IG5ldHdvcmstPnJhdGVzX2xlbjsgaSsrKSB7CisJCQkJbmV0d29yay0+cmF0ZXNbaV0gPSBpbmZvX2VsZW1lbnQtPmRhdGFbaV07CisJCQkJY3VyUmF0ZSA9IG5ldHdvcmstPnJhdGVzW2ldICYgMHg3ZjsKKwkJCQlpZiggaE9wUmF0ZSA8IGN1clJhdGUgKQorCQkJCQloT3BSYXRlID0gY3VyUmF0ZTsKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCisJCQkJcCArPSBzbnByaW50ZihwLCBzaXplb2YocmF0ZXNfc3RyKSAtIChwIC0gcmF0ZXNfc3RyKSwgIiUwMlggIiwgbmV0d29yay0+cmF0ZXNbaV0pOworI2VuZGlmCisJCQkJaWYgKGllZWU4MDIxMV9pc19vZmRtX3JhdGUoaW5mb19lbGVtZW50LT5kYXRhW2ldKSkgeworCQkJCQluZXR3b3JrLT5mbGFncyB8PSBORVRXT1JLX0hBU19PRkRNOworCQkJCQlpZiAoaW5mb19lbGVtZW50LT5kYXRhW2ldICYKKwkJCQkJICAgIElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0spCisJCQkJCQluZXR3b3JrLT5mbGFncyAmPQorCQkJCQkJCX5ORVRXT1JLX0hBU19DQ0s7CisJCQkJfQorCQkJfQorCisJCQlJRUVFODAyMTFfREVCVUdfU0NBTigiTUZJRV9UWVBFX1JBVEVTOiAnJXMnICglZClcbiIsCisJCQkJCSAgICAgcmF0ZXNfc3RyLCBuZXR3b3JrLT5yYXRlc19sZW4pOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRklFX1RZUEVfUkFURVNfRVg6CisjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9ERUJVRworCQkJcCA9IHJhdGVzX3N0cjsKKyNlbmRpZgorCQkJbmV0d29yay0+cmF0ZXNfZXhfbGVuID0gbWluKGluZm9fZWxlbWVudC0+bGVuLCBNQVhfUkFURVNfRVhfTEVOR1RIKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBuZXR3b3JrLT5yYXRlc19leF9sZW47IGkrKykgeworCQkJCW5ldHdvcmstPnJhdGVzX2V4W2ldID0gaW5mb19lbGVtZW50LT5kYXRhW2ldOworCQkJCWN1clJhdGVfZXggPSBuZXR3b3JrLT5yYXRlc19leFtpXSAmIDB4N2Y7CisJCQkJaWYoIGhPcFJhdGUgPCBjdXJSYXRlX2V4ICkKKwkJCQkJaE9wUmF0ZSA9IGN1clJhdGVfZXg7CisjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9ERUJVRworCQkJCXAgKz0gc25wcmludGYocCwgc2l6ZW9mKHJhdGVzX3N0cikgLSAocCAtIHJhdGVzX3N0ciksICIlMDJYICIsIG5ldHdvcmstPnJhdGVzW2ldKTsKKyNlbmRpZgorCQkJCWlmIChpZWVlODAyMTFfaXNfb2ZkbV9yYXRlKGluZm9fZWxlbWVudC0+ZGF0YVtpXSkpIHsKKwkJCQkJbmV0d29yay0+ZmxhZ3MgfD0gTkVUV09SS19IQVNfT0ZETTsKKwkJCQkJaWYgKGluZm9fZWxlbWVudC0+ZGF0YVtpXSAmCisJCQkJCSAgICBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLKQorCQkJCQkJbmV0d29yay0+ZmxhZ3MgJj0KKwkJCQkJCQl+TkVUV09SS19IQVNfQ0NLOworCQkJCX0KKwkJCX0KKworCQkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIk1GSUVfVFlQRV9SQVRFU19FWDogJyVzJyAoJWQpXG4iLAorCQkJCQkgICAgIHJhdGVzX3N0ciwgbmV0d29yay0+cmF0ZXNfZXhfbGVuKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUZJRV9UWVBFX0RTX1NFVDoKKyAgCQkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIk1GSUVfVFlQRV9EU19TRVQ6ICVkXG4iLAorCQkJCQkgICAgIGluZm9fZWxlbWVudC0+ZGF0YVswXSk7CisJCQlpZiAoc3RhdHMtPmZyZXEgPT0gSUVFRTgwMjExXzI0R0haX0JBTkQpCisJCQkJbmV0d29yay0+Y2hhbm5lbCA9IGluZm9fZWxlbWVudC0+ZGF0YVswXTsKKwkJCWJyZWFrOworCisJIAljYXNlIE1GSUVfVFlQRV9GSF9TRVQ6CisgIAkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJNRklFX1RZUEVfRkhfU0VUOiBpZ25vcmVkXG4iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUZJRV9UWVBFX0NGX1NFVDoKKwkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJNRklFX1RZUEVfQ0ZfU0VUOiBpZ25vcmVkXG4iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUZJRV9UWVBFX1RJTToKKworCQkJaWYoaW5mb19lbGVtZW50LT5sZW4gPCA0KQorCQkJCWJyZWFrOworCisJCQluZXR3b3JrLT5kdGltX3BlcmlvZCA9IGluZm9fZWxlbWVudC0+ZGF0YVsxXTsKKworCQkJaWYoaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRCkKKwkJCQlicmVhazsKKyNpZiAwCisJCQluZXR3b3JrLT5sYXN0X2R0aW1fc3RhX3RpbWVbMF0gPSBzdGF0cy0+bWFjX3RpbWVbMF07CisjZWxzZQorCQkJbmV0d29yay0+bGFzdF9kdGltX3N0YV90aW1lWzBdID0gamlmZmllczsKKyNlbmRpZgorCQkJbmV0d29yay0+bGFzdF9kdGltX3N0YV90aW1lWzFdID0gc3RhdHMtPm1hY190aW1lWzFdOworCisJCQluZXR3b3JrLT5kdGltX2RhdGEgPSBJRUVFODAyMTFfRFRJTV9WQUxJRDsKKworCQkJaWYoaW5mb19lbGVtZW50LT5kYXRhWzBdICE9IDApCisJCQkJYnJlYWs7CisKKwkJCWlmKGluZm9fZWxlbWVudC0+ZGF0YVsyXSAmIDEpCisJCQkJbmV0d29yay0+ZHRpbV9kYXRhIHw9IElFRUU4MDIxMV9EVElNX01CQ0FTVDsKKworCQkJb2Zmc2V0ID0gKGluZm9fZWxlbWVudC0+ZGF0YVsyXSA+PiAxKSoyOworCisJCQkvL3ByaW50aygib2Zmc2V0MToleCBhaWQ6JXhcbiIsb2Zmc2V0LCBpZWVlLT5hc3NvY19pZCk7CisKKwkJCS8qIGFkZCBhbmQgbW9kaWZpZWQgZm9yIHBzIDIwMDguMS4yMiAqLworCQkJaWYoaWVlZS0+YXNzb2NfaWQgPCA4Km9mZnNldCB8fAorCQkJCWllZWUtPmFzc29jX2lkID4gOCoob2Zmc2V0ICsgaW5mb19lbGVtZW50LT5sZW4gLTMpKSB7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCW9mZnNldCA9IChpZWVlLT5hc3NvY19pZC84KSAtIG9mZnNldDsvLyArICgoYWlkICUgOCk/IDAgOiAxKSA7CisKKwkJLy8JcHJpbnRrKCJvZmZzZXQ6JXggZGF0YToleCwgdWNhc3Q6JWRcbiIsIG9mZnNldCwKKwkJCS8vCWluZm9fZWxlbWVudC0+ZGF0YVszK29mZnNldF0gLAorCQkJLy8JaW5mb19lbGVtZW50LT5kYXRhWzMrb2Zmc2V0XSAmICgxPDwoaWVlZS0+YXNzb2NfaWQlOCkpKTsKKworCQkJaWYoaW5mb19lbGVtZW50LT5kYXRhWzMrb2Zmc2V0XSAmICgxPDwoaWVlZS0+YXNzb2NfaWQlOCkpKSB7CisJCQkJbmV0d29yay0+ZHRpbV9kYXRhIHw9IElFRUU4MDIxMV9EVElNX1VDQVNUOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBNRklFX1RZUEVfSUJTU19TRVQ6CisJCQlJRUVFODAyMTFfREVCVUdfU0NBTigiTUZJRV9UWVBFX0lCU1NfU0VUOiBpZ25vcmVkXG4iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUZJRV9UWVBFX0NIQUxMRU5HRToKKwkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJNRklFX1RZUEVfQ0hBTExFTkdFOiBpZ25vcmVkXG4iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUZJRV9UWVBFX0dFTkVSSUM6CisJCQkvL25pYyBpcyA4N0IKKwkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJNRklFX1RZUEVfR0VORVJJQzogJWQgYnl0ZXNcbiIsCisJCQkJCSAgICAgaW5mb19lbGVtZW50LT5sZW4pOworCQkJaWYgKGluZm9fZWxlbWVudC0+bGVuID49IDQgICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzBdID09IDB4MDAgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMV0gPT0gMHg1MCAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVsyXSA9PSAweGYyICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzNdID09IDB4MDEpIHsKKwkJCQluZXR3b3JrLT53cGFfaWVfbGVuID0gbWluKGluZm9fZWxlbWVudC0+bGVuICsgMiwKKwkJCQkJCQkgTUFYX1dQQV9JRV9MRU4pOworCQkJCW1lbWNweShuZXR3b3JrLT53cGFfaWUsIGluZm9fZWxlbWVudCwKKwkJCQkgICAgICAgbmV0d29yay0+d3BhX2llX2xlbik7CisJCQl9CisKKyNpZmRlZiBUSE9NQVNfVFVSQk8KKwkJCWlmIChpbmZvX2VsZW1lbnQtPmxlbiA9PSA3ICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzBdID09IDB4MDAgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMV0gPT0gMHhlMCAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVsyXSA9PSAweDRjICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzNdID09IDB4MDEgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbNF0gPT0gMHgwMikgeworCQkJCW5ldHdvcmstPlR1cmJvX0VuYWJsZSA9IDE7CisJCQl9CisjZW5kaWYKKwkJCWlmICgxID09IHN0YXRzLT5uaWNfdHlwZSkgey8vbmljIDg3CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChpbmZvX2VsZW1lbnQtPmxlbiA+PSA1ICAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVswXSA9PSAweDAwICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzFdID09IDB4NTAgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPT0gMHhmMiAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVszXSA9PSAweDAyICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzRdID09IDB4MDApIHsKKwkJCQkvL3ByaW50ayhLRVJOX1dBUk5JTkcgIndtbSBpbmZvIHVwZGF0ZWQ6ICV4XG4iLCBpbmZvX2VsZW1lbnQtPmRhdGFbNl0pOworCQkJCS8vV01NIEluZm9ybWF0aW9uIEVsZW1lbnQKKwkJCQluZXR3b3JrLT53bW1faW5mbyA9IGluZm9fZWxlbWVudC0+ZGF0YVs2XTsKKwkJCQluZXR3b3JrLT5Rb1NfRW5hYmxlID0gMTsKKwkJCX0KKworCQkJaWYgKGluZm9fZWxlbWVudC0+bGVuID49IDggICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzBdID09IDB4MDAgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMV0gPT0gMHg1MCAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVsyXSA9PSAweGYyICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzNdID09IDB4MDIgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbNF0gPT0gMHgwMSkgeworCQkJCS8vIE5vdCBjYXJlIGFib3V0IHZlcnNpb24gYXQgcHJlc2VudC4KKwkJCQkvL1dNTSBJbmZvcm1hdGlvbiBFbGVtZW50CisJCQkJLy9wcmludGsoS0VSTl9XQVJOSU5HICJ3bW0gaW5mbyZwYXJhbSB1cGRhdGVkOiAleFxuIiwgaW5mb19lbGVtZW50LT5kYXRhWzZdKTsKKwkJCQluZXR3b3JrLT53bW1faW5mbyA9IGluZm9fZWxlbWVudC0+ZGF0YVs2XTsKKwkJCQkvL1dNTSBQYXJhbWV0ZXIgRWxlbWVudAorCQkJCW1lbWNweShuZXR3b3JrLT53bW1fcGFyYW0sICh1OCAqKShpbmZvX2VsZW1lbnQtPmRhdGEgKyA4KSwoaW5mb19lbGVtZW50LT5sZW4gLSA4KSk7CisJCQkJbmV0d29yay0+UW9TX0VuYWJsZSA9IDE7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE1GSUVfVFlQRV9SU046CisJCQlJRUVFODAyMTFfREVCVUdfU0NBTigiTUZJRV9UWVBFX1JTTjogJWQgYnl0ZXNcbiIsCisJCQkJCSAgICAgaW5mb19lbGVtZW50LT5sZW4pOworCQkJbmV0d29yay0+cnNuX2llX2xlbiA9IG1pbihpbmZvX2VsZW1lbnQtPmxlbiArIDIsCisJCQkJCQkgTUFYX1dQQV9JRV9MRU4pOworCQkJbWVtY3B5KG5ldHdvcmstPnJzbl9pZSwgaW5mb19lbGVtZW50LAorCQkJICAgICAgIG5ldHdvcmstPnJzbl9pZV9sZW4pOworCQkJYnJlYWs7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCQljYXNlIE1GSUVfVFlQRV9DT1VOVFJZOgorCQkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIk1GSUVfVFlQRV9DT1VOVFJZOiAlZCBieXRlc1xuIiwKKwkJCQkJICAgICBpbmZvX2VsZW1lbnQtPmxlbik7CisvLwkJCXByaW50aygiPT09PT0+UmVjZWl2ZSA8JXM+IENvdW50cnkgSUVcbiIsbmV0d29yay0+c3NpZCk7CisJCQlpZWVlODAyMTFfZXh0cmFjdF9jb3VudHJ5X2llKGllZWUsIGluZm9fZWxlbWVudCwgbmV0d29yaywgYmVhY29uLT5oZWFkZXIuYWRkcjIpOworCQkJYnJlYWs7CisjZW5kaWYKKwkJZGVmYXVsdDoKKwkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJ1bnN1cHBvcnRlZCBJRSAlZFxuIiwKKwkJCQkJICAgICBpbmZvX2VsZW1lbnQtPmlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAJCX0KKworCQlsZWZ0IC09IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudF9oZHIpICsKKwkJCWluZm9fZWxlbWVudC0+bGVuOworCQlpbmZvX2VsZW1lbnQgPSAoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgKikKKyAgICAgICAgICAgICAgICAJJmluZm9fZWxlbWVudC0+ZGF0YVtpbmZvX2VsZW1lbnQtPmxlbl07CisgIAl9CisvL2J5IGFteSAwODAzMTIKKwluZXR3b3JrLT5IaWdoZXN0T3BlcmFSYXRlID0gaE9wUmF0ZTsKKy8vYnkgYW15IDA4MDMxMgorCW5ldHdvcmstPm1vZGUgPSAwOworCWlmIChzdGF0cy0+ZnJlcSA9PSBJRUVFODAyMTFfNTJHSFpfQkFORCkKKwkJbmV0d29yay0+bW9kZSA9IElFRUVfQTsKKwllbHNlIHsKKwkJaWYgKG5ldHdvcmstPmZsYWdzICYgTkVUV09SS19IQVNfT0ZETSkKKwkJCW5ldHdvcmstPm1vZGUgfD0gSUVFRV9HOworCQlpZiAobmV0d29yay0+ZmxhZ3MgJiBORVRXT1JLX0hBU19DQ0spCisJCQluZXR3b3JrLT5tb2RlIHw9IElFRUVfQjsKKwl9CisKKwlpZiAobmV0d29yay0+bW9kZSA9PSAwKSB7CisJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJGaWx0ZXJlZCBvdXQgJyVzICgiIE1BQ19GTVQgIiknICIKKwkJCQkgICAgICJuZXR3b3JrLlxuIiwKKwkJCQkgICAgIGVzY2FwZV9lc3NpZChuZXR3b3JrLT5zc2lkLAorCQkJCQkJICBuZXR3b3JrLT5zc2lkX2xlbiksCisJCQkJICAgICBNQUNfQVJHKG5ldHdvcmstPmJzc2lkKSk7CisJCXJldHVybiAxOworCX0KKworCWlmIChpZWVlODAyMTFfaXNfZW1wdHlfZXNzaWQobmV0d29yay0+c3NpZCwgbmV0d29yay0+c3NpZF9sZW4pKQorCQluZXR3b3JrLT5mbGFncyB8PSBORVRXT1JLX0VNUFRZX0VTU0lEOworI2lmIDAKKwlzdGF0cy0+c2lnbmFsID0gaWVlZTgwMjExX1NpZ25hbFN0cmVuZ3RoVHJhbnNsYXRlKHN0YXRzLT5zaWduYWwpOworI2VuZGlmCisJc3RhdHMtPnNpZ25hbCA9IGllZWU4MDIxMV9UcmFuc2xhdGVUb0RibShzdGF0cy0+c2lnbmFsc3RyZW5ndGgpOworCS8vc3RhdHMtPm5vaXNlID0gc3RhdHMtPnNpZ25hbCAtIHN0YXRzLT5ub2lzZTsKKwlzdGF0cy0+bm9pc2UgPSBpZWVlODAyMTFfVHJhbnNsYXRlVG9EYm0oMTAwIC0gc3RhdHMtPnNpZ25hbHN0cmVuZ3RoKSAtIDI1OworCW1lbWNweSgmbmV0d29yay0+c3RhdHMsIHN0YXRzLCBzaXplb2YobmV0d29yay0+c3RhdHMpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19zYW1lX25ldHdvcmsoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpzcmMsCisJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmRzdCwKKwkJCQkgIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICogaWVlZSkKK3sKKwkvKiBBIG5ldHdvcmsgaXMgb25seSBhIGR1cGxpY2F0ZSBpZiB0aGUgY2hhbm5lbCwgQlNTSUQsIEVTU0lECisJICogYW5kIHRoZSBjYXBhYmlsaXR5IGZpZWxkIChpbiBwYXJ0aWN1bGFyIElCU1MgYW5kIEJTUykgYWxsIG1hdGNoLgorCSAqIFdlIHRyZWF0IGFsbCA8aGlkZGVuPiB3aXRoIHRoZSBzYW1lIEJTU0lEIGFuZCBjaGFubmVsCisJICogYXMgb25lIG5ldHdvcmsgKi8KKwlyZXR1cm4gKCgoc3JjLT5zc2lkX2xlbiA9PSBkc3QtPnNzaWRfbGVuKSB8fCAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSkgJiYgIC8vWUosbW9kLDA4MDgxOSxmb3IgaGlkZGVuIGFwCisJCS8vKChzcmMtPnNzaWRfbGVuID09IGRzdC0+c3NpZF9sZW4pICYmCisJCShzcmMtPmNoYW5uZWwgPT0gZHN0LT5jaGFubmVsKSAmJgorCQkhbWVtY21wKHNyYy0+YnNzaWQsIGRzdC0+YnNzaWQsIEVUSF9BTEVOKSAmJgorCQkoIW1lbWNtcChzcmMtPnNzaWQsIGRzdC0+c3NpZCwgc3JjLT5zc2lkX2xlbikgfHwgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkpICYmIC8vWUosbW9kLDA4MDgxOSxmb3IgaGlkZGVuIGFwCisJCS8vIW1lbWNtcChzcmMtPnNzaWQsIGRzdC0+c3NpZCwgc3JjLT5zc2lkX2xlbikgJiYKKwkJKChzcmMtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfSUJTUykgPT0KKwkJKGRzdC0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKSkgJiYKKwkJKChzcmMtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfQlNTKSA9PQorCQkoZHN0LT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0JTUykpKTsKK30KKworaW5saW5lIHZvaWQgdXBkYXRlX25ldHdvcmsoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpkc3QsCisJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKnNyYykKK3sKKwl1bnNpZ25lZCBjaGFyIHF1YWxpdHkgPSBzcmMtPnN0YXRzLnNpZ25hbHN0cmVuZ3RoOworCXVuc2lnbmVkIGNoYXIgc2lnbmFsID0gMDsKKwl1bnNpZ25lZCBjaGFyIG5vaXNlID0gMDsKKyAgICAgICAgaWYoZHN0LT5zdGF0cy5zaWduYWxzdHJlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICBxdWFsaXR5ID0gKGRzdC0+c3RhdHMuc2lnbmFsc3RyZW5ndGggKiA1ICsgc3JjLT5zdGF0cy5zaWduYWxzdHJlbmd0aCArIDUpLzY7CisgICAgICAgIH0KKwlzaWduYWwgPSBpZWVlODAyMTFfVHJhbnNsYXRlVG9EYm0ocXVhbGl0eSk7CisJLy9ub2lzZSA9IHNpZ25hbCAtIHNyYy0+c3RhdHMubm9pc2U7CisJaWYoZHN0LT5zdGF0cy5ub2lzZSA+IDApCisJCW5vaXNlID0gKGRzdC0+c3RhdHMubm9pc2UgKiA1ICsgc3JjLT5zdGF0cy5ub2lzZSkvNjsKKyAgICAgICAgLy9pZihzdHJjbXAoZHN0LT5zc2lkLCAibGlua3N5c19sem0wMDAiKSA9PSAwKQorLy8JcHJpbnRrKCJzc2lkOiVzLCBxdWFsaXR5OiVkLCBzaWduYWw6JWRcbiIsIGRzdC0+c3NpZCwgcXVhbGl0eSwgc2lnbmFsKTsKKwltZW1jcHkoJmRzdC0+c3RhdHMsICZzcmMtPnN0YXRzLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cykpOworCWRzdC0+c3RhdHMuc2lnbmFsc3RyZW5ndGggPSBxdWFsaXR5OworCWRzdC0+c3RhdHMuc2lnbmFsID0gc2lnbmFsOworLy8JcHJpbnRrKCI9PT09PT09PT09PT09PT09PT0+c3RhdHMuc2lnbmFsIGlzICVkXG4iLGRzdC0+c3RhdHMuc2lnbmFsKTsKKwlkc3QtPnN0YXRzLm5vaXNlID0gbm9pc2U7CisKKworCWRzdC0+Y2FwYWJpbGl0eSA9IHNyYy0+Y2FwYWJpbGl0eTsKKwltZW1jcHkoZHN0LT5yYXRlcywgc3JjLT5yYXRlcywgc3JjLT5yYXRlc19sZW4pOworCWRzdC0+cmF0ZXNfbGVuID0gc3JjLT5yYXRlc19sZW47CisJbWVtY3B5KGRzdC0+cmF0ZXNfZXgsIHNyYy0+cmF0ZXNfZXgsIHNyYy0+cmF0ZXNfZXhfbGVuKTsKKwlkc3QtPnJhdGVzX2V4X2xlbiA9IHNyYy0+cmF0ZXNfZXhfbGVuOworCWRzdC0+SGlnaGVzdE9wZXJhUmF0ZT0gc3JjLT5IaWdoZXN0T3BlcmFSYXRlOworCS8vcHJpbnRrKCI9PT09PT09PT09PmluICVzOiBzcmMtPnNzaWQgaXMgJXMsY2hhbiBpcyAlZFxuIixfX2Z1bmNfXyxzcmMtPnNzaWQsc3JjLT5jaGFubmVsKTsKKworCS8vWUosYWRkLDA4MDgxOSxmb3IgaGlkZGVuIGFwCisJaWYoc3JjLT5zc2lkX2xlbiA+IDApCisJeworCQkvL2lmKHNyYy0+c3NpZF9sZW4gPT0gMTMpCisJCS8vCXByaW50aygiPT09PT09PT09PT09PT09PT09PT09Pj4+Pj4+Pj4gRHN0IHNzaWQ6ICVzIFNyYyBzc2lkOiAlc1xuIiwgZHN0LT5zc2lkLCBzcmMtPnNzaWQpOworCQltZW1zZXQoZHN0LT5zc2lkLCAwLCBkc3QtPnNzaWRfbGVuKTsKKwkJZHN0LT5zc2lkX2xlbiA9IHNyYy0+c3NpZF9sZW47CisJCW1lbWNweShkc3QtPnNzaWQsIHNyYy0+c3NpZCwgc3JjLT5zc2lkX2xlbik7CisJfQorCS8vWUosYWRkLDA4MDgxOSxmb3IgaGlkZGVuIGFwLGVuZAorCisJZHN0LT5jaGFubmVsID0gc3JjLT5jaGFubmVsOworCWRzdC0+bW9kZSA9IHNyYy0+bW9kZTsKKwlkc3QtPmZsYWdzID0gc3JjLT5mbGFnczsKKwlkc3QtPnRpbWVfc3RhbXBbMF0gPSBzcmMtPnRpbWVfc3RhbXBbMF07CisJZHN0LT50aW1lX3N0YW1wWzFdID0gc3JjLT50aW1lX3N0YW1wWzFdOworCisJZHN0LT5iZWFjb25faW50ZXJ2YWwgPSBzcmMtPmJlYWNvbl9pbnRlcnZhbDsKKwlkc3QtPmxpc3Rlbl9pbnRlcnZhbCA9IHNyYy0+bGlzdGVuX2ludGVydmFsOworCWRzdC0+YXRpbV93aW5kb3cgPSBzcmMtPmF0aW1fd2luZG93OworCWRzdC0+ZHRpbV9wZXJpb2QgPSBzcmMtPmR0aW1fcGVyaW9kOworCWRzdC0+ZHRpbV9kYXRhID0gc3JjLT5kdGltX2RhdGE7CisJZHN0LT5sYXN0X2R0aW1fc3RhX3RpbWVbMF0gPSBzcmMtPmxhc3RfZHRpbV9zdGFfdGltZVswXTsKKwlkc3QtPmxhc3RfZHRpbV9zdGFfdGltZVsxXSA9IHNyYy0+bGFzdF9kdGltX3N0YV90aW1lWzFdOworLy8JcHJpbnRrKCJ1cGRhdGU6JXMsIGR0aW1fcGVyaW9kOiV4LCBkdGltX2RhdGE6JXhcbiIsIHNyYy0+c3NpZCwgc3JjLT5kdGltX3BlcmlvZCwgc3JjLT5kdGltX2RhdGEpOworCW1lbWNweShkc3QtPndwYV9pZSwgc3JjLT53cGFfaWUsIHNyYy0+d3BhX2llX2xlbik7CisJZHN0LT53cGFfaWVfbGVuID0gc3JjLT53cGFfaWVfbGVuOworCW1lbWNweShkc3QtPnJzbl9pZSwgc3JjLT5yc25faWUsIHNyYy0+cnNuX2llX2xlbik7CisJZHN0LT5yc25faWVfbGVuID0gc3JjLT5yc25faWVfbGVuOworCisJZHN0LT5sYXN0X3NjYW5uZWQgPSBqaWZmaWVzOworCS8qIGRzdC0+bGFzdF9hc3NvY2lhdGUgaXMgbm90IG92ZXJ3cml0dGVuICovCisvLyBkaXNhYmxlIFFvUyBwcm9jZXNzIG5vdywgYWRkZWQgYnkgRGF2aWQgMjAwNi83LzI1CisjaWYgMQorCWRzdC0+d21tX2luZm8gPSBzcmMtPndtbV9pbmZvOyAvL3N1cmUgdG8gZXhpc3QgaW4gYmVhY29uIG9yIHByb2JlIHJlc3BvbnNlIGZyYW1lLgorLyoKKwlpZigoZHN0LT53bW1faW5mb15zcmMtPndtbV9pbmZvKSYweDBmKSB7Ly9QYXJhbSBTZXQgQ291bnQgY2hhbmdlLCB1cGRhdGUgUGFyYW1ldGVyCisJICBtZW1jcHkoZHN0LT53bW1fcGFyYW0sIHNyYy0+d21tX3BhcmFtLCBJRUVFODAyMTFfQUNfUFJBTV9MRU4pOworCX0KKyovCisJaWYoc3JjLT53bW1fcGFyYW1bMF0uYWNfYWNpX2FjbV9haWZzbnx8IFwKKwkgICBzcmMtPndtbV9wYXJhbVsxXS5hY19hY2lfYWNtX2FpZnNufHwgXAorCSAgIHNyYy0+d21tX3BhcmFtWzJdLmFjX2FjaV9hY21fYWlmc258fCBcCisJICAgc3JjLT53bW1fcGFyYW1bMV0uYWNfYWNpX2FjbV9haWZzbikgeworCSAgbWVtY3B5KGRzdC0+d21tX3BhcmFtLCBzcmMtPndtbV9wYXJhbSwgV01FX0FDX1BSQU1fTEVOKTsKKwl9CisJZHN0LT5Rb1NfRW5hYmxlID0gc3JjLT5Rb1NfRW5hYmxlOworI2Vsc2UKKwlkc3QtPlFvU19FbmFibGUgPSAxOy8vZm9yIFJ0bDgxODcgc2ltdWxhdGlvbgorI2VuZGlmCisJZHN0LT5TaWduYWxTdHJlbmd0aCA9IHNyYy0+U2lnbmFsU3RyZW5ndGg7CisjaWZkZWYgVEhPTUFTX1RVUkJPCisJZHN0LT5UdXJib19FbmFibGUgPSBzcmMtPlR1cmJvX0VuYWJsZTsKKyNlbmRpZgorI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwlkc3QtPkNvdW50cnlJZUxlbiA9IHNyYy0+Q291bnRyeUllTGVuOworCW1lbWNweShkc3QtPkNvdW50cnlJZUJ1Ziwgc3JjLT5Db3VudHJ5SWVCdWYsIHNyYy0+Q291bnRyeUllTGVuKTsKKyNlbmRpZgorfQorCisKK2lubGluZSB2b2lkIGllZWU4MDIxMV9wcm9jZXNzX3Byb2JlX3Jlc3BvbnNlKAorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCXN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UgKmJlYWNvbiwKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpzdGF0cykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgbmV0d29yazsKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKnRhcmdldDsKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm9sZGVzdCA9IE5VTEw7CisjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9ERUJVRworCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50ICppbmZvX2VsZW1lbnQgPSAmYmVhY29uLT5pbmZvX2VsZW1lbnQ7CisjZW5kaWYKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNob3J0IHJlbmV3OworCXU4IHdtbV9pbmZvOworCXU4IGlzX2JlYWNvbiA9IChXTEFOX0ZDX0dFVF9TVFlQRShiZWFjb24tPmhlYWRlci5mcmFtZV9jdGwpID09IElFRUU4MDIxMV9TVFlQRV9CRUFDT04pPyAxOjA7ICAvL1lKLGFkZCwwODA4MTksZm9yIGhpZGRlbiBhcAorCisJbWVtc2V0KCZuZXR3b3JrLCAwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrKSk7CisvL3J6CisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWlmKChpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlKSAmJiBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3Byb2Nlc3NfcHJvYmVfcmVzcG9uc2VfMSkgeworCQlpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3Byb2Nlc3NfcHJvYmVfcmVzcG9uc2VfMShpZWVlLCBiZWFjb24sIHN0YXRzKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCisJSUVFRTgwMjExX0RFQlVHX1NDQU4oCisJCSInJXMnICgiIE1BQ19GTVQgIik6ICVjJWMlYyVjICVjJWMlYyVjLSVjJWMlYyVjICVjJWMlYyVjXG4iLAorCQllc2NhcGVfZXNzaWQoaW5mb19lbGVtZW50LT5kYXRhLCBpbmZvX2VsZW1lbnQtPmxlbiksCisJCU1BQ19BUkcoYmVhY29uLT5oZWFkZXIuYWRkcjMpLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4ZikpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4ZSkpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4ZCkpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4YykpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4YikpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4YSkpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4OSkpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4OCkpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4NykpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4NikpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4NSkpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4NCkpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4MykpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4MikpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4MSkpID8gJzEnIDogJzAnLAorCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4MCkpID8gJzEnIDogJzAnKTsKKyNpZiAwCisJaWYoc3RyY21wKGVzY2FwZV9lc3NpZChiZWFjb24tPmluZm9fZWxlbWVudC5kYXRhLCBiZWFjb24tPmluZm9fZWxlbWVudC5sZW4pLCAicnRsX3NvZnRhcCIpID09IDApCisJeworCQlpZihXTEFOX0ZDX0dFVF9TVFlQRShiZWFjb24tPmhlYWRlci5mcmFtZV9jdGwpID09IElFRUU4MDIxMV9TVFlQRV9CRUFDT04pCisJCXsKKwkJCXUzMiBpID0gMCwgbGVuID0gc3RhdHMtPmxlbjsKKwkJCXU4ICogcCA9ICh1OCopYmVhY29uOworCQkJcHJpbnRrKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJCQlwcmludGsoInJ0bF9zb2Z0YXAgQmVhY29uOiIpOworCQkJZm9yKGk9MDsgaTxsZW47IGkrKykKKwkJCQlwcmludGsoIlx0JTIuMngiLCAqKHAraSkpOworCQkJcHJpbnRrKCJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwkJfQorCX0KKyNlbmRpZgorCWlmIChpZWVlODAyMTFfbmV0d29ya19pbml0KGllZWUsIGJlYWNvbiwgJm5ldHdvcmssIHN0YXRzKSkgeworCQlJRUVFODAyMTFfREVCVUdfU0NBTigiRHJvcHBlZCAnJXMnICgiIE1BQ19GTVQgIikgdmlhICVzLlxuIiwKKwkJCQkgICAgIGVzY2FwZV9lc3NpZChpbmZvX2VsZW1lbnQtPmRhdGEsCisJCQkJCQkgIGluZm9fZWxlbWVudC0+bGVuKSwKKwkJCQkgICAgIE1BQ19BUkcoYmVhY29uLT5oZWFkZXIuYWRkcjMpLAorCQkJCSAgICAgV0xBTl9GQ19HRVRfU1RZUEUoYmVhY29uLT5oZWFkZXIuZnJhbWVfY3RsKSA9PQorCQkJCSAgICAgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1AgPworCQkJCSAgICAgIlBST0JFIFJFU1BPTlNFIiA6ICJCRUFDT04iKTsKKwkJcmV0dXJuOworCX0KKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwkvLyBGb3IgQXN1cyBFZWVQYyByZXF1ZXN0LAorCS8vICgxKSBpZiB3aXJlbGVzcyBhZGFwdGVyIHJlY2VpdmUgZ2V0IGFueSA4MDIuMTFkIGNvdW50cnkgY29kZSBpbiBBUCBiZWFjb24sCisJLy8JICAgd2lyZWxlc3MgYWRhcHRlciBzaG91bGQgZm9sbG93IHRoZSBjb3VudHJ5IGNvZGUuCisJLy8gKDIpICBJZiB0aGVyZSBpcyBubyBhbnkgY291bnRyeSBjb2RlIGluIGJlYWNvbiwKKwkvLyAgICAgICB0aGVuIHdpcmVsZXNzIGFkYXB0ZXIgc2hvdWxkIGRvIGFjdGl2ZSBzY2FuIGZyb20gY2gxfjExIGFuZAorCS8vICAgICAgIHBhc3NpdmUgc2NhbiBmcm9tIGNoMTJ+MTQKKwlpZihpZWVlLT5iR2xvYmFsRG9tYWluKQorCXsKKwkJaWYgKFdMQU5fRkNfR0VUX1NUWVBFKGJlYWNvbi0+aGVhZGVyLmZyYW1lX2N0bCkgPT0gSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1ApCisJCXsKKwkJCS8vIENhc2UgMTogQ291bnRyeSBjb2RlCisJCQlpZihJU19DT1VOVFJZX0lFX1ZBTElEKGllZWUpICkKKwkJCXsKKwkJCQlpZiggIUlzTGVnYWxDaGFubmVsKGllZWUsIG5ldHdvcmsuY2hhbm5lbCkgKQorCQkJCXsKKwkJCQkJcHJpbnRrKCJHZXRTY2FuSW5mbygpOiBGb3IgQ291bnRyeSBjb2RlLCBmaWx0ZXIgcHJvYmUgcmVzcG9uc2UgYXQgY2hhbm5lbCglZCkuXG4iLCBuZXR3b3JrLmNoYW5uZWwpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQkJLy8gQ2FzZSAyOiBObyBhbnkgY291bnRyeSBjb2RlLgorCQkJZWxzZQorCQkJeworCQkJCS8vIEZpbHRlciBvdmVyIGNoYW5uZWwgY2gxMn4xNAorCQkJCWlmKG5ldHdvcmsuY2hhbm5lbCA+IDExKQorCQkJCXsKKwkJCQkJcHJpbnRrKCJHZXRTY2FuSW5mbygpOiBGb3IgR2xvYmFsIERvbWFpbiwgZmlsdGVyIHByb2JlIHJlc3BvbnNlIGF0IGNoYW5uZWwoJWQpLlxuIiwgbmV0d29yay5jaGFubmVsKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIENhc2UgMTogQ291bnRyeSBjb2RlCisJCQlpZihJU19DT1VOVFJZX0lFX1ZBTElEKGllZWUpICkKKwkJCXsKKwkJCQlpZiggIUlzTGVnYWxDaGFubmVsKGllZWUsIG5ldHdvcmsuY2hhbm5lbCkgKQorCQkJCXsKKwkJCQkJcHJpbnRrKCJHZXRTY2FuSW5mbygpOiBGb3IgQ291bnRyeSBjb2RlLCBmaWx0ZXIgYmVhY29uIGF0IGNoYW5uZWwoJWQpLlxuIixuZXR3b3JrLmNoYW5uZWwpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQkJLy8gQ2FzZSAyOiBObyBhbnkgY291bnRyeSBjb2RlLgorCQkJZWxzZQorCQkJeworCQkJCS8vIEZpbHRlciBvdmVyIGNoYW5uZWwgY2gxMn4xNAorCQkJCWlmKG5ldHdvcmsuY2hhbm5lbCA+IDE0KQorCQkJCXsKKwkJCQkJcHJpbnRrKCJHZXRTY2FuSW5mbygpOiBGb3IgR2xvYmFsIERvbWFpbiwgZmlsdGVyIGJlYWNvbiBhdCBjaGFubmVsKCVkKS5cbiIsbmV0d29yay5jaGFubmVsKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorCS8qIFRoZSBuZXR3b3JrIHBhcnNlZCBjb3JyZWN0bHkgLS0gc28gbm93IHdlIHNjYW4gb3VyIGtub3duIG5ldHdvcmtzCisJICogdG8gc2VlIGlmIHdlIGNhbiBmaW5kIGl0IGluIG91ciBsaXN0LgorCSAqCisJICogTk9URTogIFRoaXMgc2VhcmNoIGlzIGRlZmluaXRlbHkgbm90IG9wdGltaXplZC4gIE9uY2UgaXRzIGRvaW5nCisJICogICAgICAgIHRoZSAicmlnaHQgdGhpbmciIHdlJ2xsIG9wdGltaXplIGl0IGZvciBlZmZpY2llbmN5IGlmCisJICogICAgICAgIG5lY2Vzc2FyeSAqLworCisJLyogU2VhcmNoIGZvciB0aGlzIGVudHJ5IGluIHRoZSBsaXN0IGFuZCB1cGRhdGUgaXQgaWYgaXQgaXMKKwkgKiBhbHJlYWR5IHRoZXJlLiAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCWlmKGlzX3NhbWVfbmV0d29yaygmaWVlZS0+Y3VycmVudF9uZXR3b3JrLCAmbmV0d29yaywgaWVlZSkpIHsKKwkJd21tX2luZm8gPSBpZWVlLT5jdXJyZW50X25ldHdvcmsud21tX2luZm87CisJCS8vWUosYWRkLDA4MDgxOSxmb3IgaGlkZGVuIGFwCisJCWlmKGlzX2JlYWNvbiA9PSAwKQorCQkJbmV0d29yay5mbGFncyA9ICh+TkVUV09SS19FTVBUWV9FU1NJRCAmIG5ldHdvcmsuZmxhZ3MpfChORVRXT1JLX0VNUFRZX0VTU0lEICYgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmZsYWdzKTsKKwkJZWxzZSBpZihpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKQorCQkJaWVlZS0+TnVtUnhCY25JblBlcmlvZCsrOworCQkvL1lKLGFkZCwwODA4MTksZm9yIGhpZGRlbiBhcCxlbmQKKwkJLy9wcmludGsoIj09PT0+bmV0d29yay5zc2lkPSVzIGN1cl9zc2lkPSVzXG4iLCBuZXR3b3JrLnNzaWQsIGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkKTsKKwkJdXBkYXRlX25ldHdvcmsoJmllZWUtPmN1cnJlbnRfbmV0d29yaywgJm5ldHdvcmspOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkodGFyZ2V0LCAmaWVlZS0+bmV0d29ya19saXN0LCBsaXN0KSB7CisJCWlmIChpc19zYW1lX25ldHdvcmsodGFyZ2V0LCAmbmV0d29yaywgaWVlZSkpCisJCQlicmVhazsKKwkJaWYgKChvbGRlc3QgPT0gTlVMTCkgfHwKKwkJICAgICh0YXJnZXQtPmxhc3Rfc2Nhbm5lZCA8IG9sZGVzdC0+bGFzdF9zY2FubmVkKSkKKwkJCW9sZGVzdCA9IHRhcmdldDsKKwl9CisKKwkvKiBJZiB3ZSBkaWRuJ3QgZmluZCBhIG1hdGNoLCB0aGVuIGdldCBhIG5ldyBuZXR3b3JrIHNsb3QgdG8gaW5pdGlhbGl6ZQorCSAqIHdpdGggdGhpcyBiZWFjb24ncyBpbmZvcm1hdGlvbiAqLworCWlmICgmdGFyZ2V0LT5saXN0ID09ICZpZWVlLT5uZXR3b3JrX2xpc3QpIHsKKwkJaWYgKGxpc3RfZW1wdHkoJmllZWUtPm5ldHdvcmtfZnJlZV9saXN0KSkgeworCQkJLyogSWYgdGhlcmUgYXJlIG5vIG1vcmUgc2xvdHMsIGV4cGlyZSB0aGUgb2xkZXN0ICovCisJCQlsaXN0X2RlbCgmb2xkZXN0LT5saXN0KTsKKwkJCXRhcmdldCA9IG9sZGVzdDsKKwkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJFeHBpcmVkICclcycgKCIgTUFDX0ZNVCAiKSBmcm9tICIKKwkJCQkJICAgICAibmV0d29yayBsaXN0LlxuIiwKKwkJCQkJICAgICBlc2NhcGVfZXNzaWQodGFyZ2V0LT5zc2lkLAorCQkJCQkJCSAgdGFyZ2V0LT5zc2lkX2xlbiksCisJCQkJCSAgICAgTUFDX0FSRyh0YXJnZXQtPmJzc2lkKSk7CisJCX0gZWxzZSB7CisJCQkvKiBPdGhlcndpc2UganVzdCBwdWxsIGZyb20gdGhlIGZyZWUgbGlzdCAqLworCQkJdGFyZ2V0ID0gbGlzdF9lbnRyeShpZWVlLT5uZXR3b3JrX2ZyZWVfbGlzdC5uZXh0LAorCQkJCQkgICAgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrLCBsaXN0KTsKKwkJCWxpc3RfZGVsKGllZWUtPm5ldHdvcmtfZnJlZV9saXN0Lm5leHQpOworCQl9CisKKworI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKKwkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIkFkZGluZyAnJXMnICgiIE1BQ19GTVQgIikgdmlhICVzLlxuIiwKKwkJCQkgICAgIGVzY2FwZV9lc3NpZChuZXR3b3JrLnNzaWQsCisJCQkJCQkgIG5ldHdvcmsuc3NpZF9sZW4pLAorCQkJCSAgICAgTUFDX0FSRyhuZXR3b3JrLmJzc2lkKSwKKwkJCQkgICAgIFdMQU5fRkNfR0VUX1NUWVBFKGJlYWNvbi0+aGVhZGVyLmZyYW1lX2N0bCkgPT0KKwkJCQkgICAgIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQID8KKwkJCQkgICAgICJQUk9CRSBSRVNQT05TRSIgOiAiQkVBQ09OIik7CisjZW5kaWYKKworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwluZXR3b3JrLmV4dF9lbnRyeSA9IHRhcmdldC0+ZXh0X2VudHJ5OworI2VuZGlmCisJCW1lbWNweSh0YXJnZXQsICZuZXR3b3JrLCBzaXplb2YoKnRhcmdldCkpOworCQlsaXN0X2FkZF90YWlsKCZ0YXJnZXQtPmxpc3QsICZpZWVlLT5uZXR3b3JrX2xpc3QpOworCQlpZihpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSkKKwkJCWllZWU4MDIxMV9zb2Z0bWFjX25ld19uZXQoaWVlZSwmbmV0d29yayk7CisJfSBlbHNlIHsKKwkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIlVwZGF0aW5nICclcycgKCIgTUFDX0ZNVCAiKSB2aWEgJXMuXG4iLAorCQkJCSAgICAgZXNjYXBlX2Vzc2lkKHRhcmdldC0+c3NpZCwKKwkJCQkJCSAgdGFyZ2V0LT5zc2lkX2xlbiksCisJCQkJICAgICBNQUNfQVJHKHRhcmdldC0+YnNzaWQpLAorCQkJCSAgICAgV0xBTl9GQ19HRVRfU1RZUEUoYmVhY29uLT5oZWFkZXIuZnJhbWVfY3RsKSA9PQorCQkJCSAgICAgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1AgPworCQkJCSAgICAgIlBST0JFIFJFU1BPTlNFIiA6ICJCRUFDT04iKTsKKworCQkvKiB3ZSBoYXZlIGFuIGVudHJ5IGFuZCB3ZSBhcmUgZ29pbmcgdG8gdXBkYXRlIGl0LiBCdXQgdGhpcyBlbnRyeSBtYXkKKwkJICogYmUgYWxyZWFkeSBleHBpcmVkLiBJbiB0aGlzIGNhc2Ugd2UgZG8gdGhlIHNhbWUgYXMgd2UgZm91bmQgYSBuZXcKKwkJICogbmV0IGFuZCBjYWxsIHRoZSBuZXdfbmV0IGhhbmRsZXIKKwkJICovCisJCXJlbmV3ID0gIXRpbWVfYWZ0ZXIodGFyZ2V0LT5sYXN0X3NjYW5uZWQgKyBpZWVlLT5zY2FuX2FnZSwgamlmZmllcyk7CisJCS8vWUosYWRkLDA4MDgxOSxmb3IgaGlkZGVuIGFwCisJCWlmKGlzX2JlYWNvbiA9PSAwKQorCQkJbmV0d29yay5mbGFncyA9ICh+TkVUV09SS19FTVBUWV9FU1NJRCAmIG5ldHdvcmsuZmxhZ3MpfChORVRXT1JLX0VNUFRZX0VTU0lEICYgdGFyZ2V0LT5mbGFncyk7CisJCS8vaWYoc3RybmNtcChuZXR3b3JrLnNzaWQsICJsaW5rc3lzLWMiLDkpID09IDApCisJCS8vCXByaW50aygiPT09PT4yIG5ldHdvcmsuc3NpZD0lcyBGTEFHPSVkIHRhcmdldC5zc2lkPSVzIEZMQUc9JWRcbiIsIG5ldHdvcmsuc3NpZCwgbmV0d29yay5mbGFncywgdGFyZ2V0LT5zc2lkLCB0YXJnZXQtPmZsYWdzKTsKKwkJaWYoKChuZXR3b3JrLmZsYWdzICYgTkVUV09SS19FTVBUWV9FU1NJRCkgPT0gTkVUV09SS19FTVBUWV9FU1NJRCkgXAorCQkgICAgJiYgKCgobmV0d29yay5zc2lkX2xlbiA+IDApICYmIChzdHJuY21wKHRhcmdldC0+c3NpZCwgbmV0d29yay5zc2lkLCBuZXR3b3JrLnNzaWRfbGVuKSkpXAorCQkgICAgfHwoKGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9PSBuZXR3b3JrLnNzaWRfbGVuKSYmKHN0cm5jbXAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsIG5ldHdvcmsuc3NpZCwgbmV0d29yay5zc2lkX2xlbikgPT0gMCkmJihpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKSkpKQorCQkJcmVuZXcgPSAxOworCQkvL1lKLGFkZCwwODA4MTksZm9yIGhpZGRlbiBhcCxlbmQKKwkJdXBkYXRlX25ldHdvcmsodGFyZ2V0LCAmbmV0d29yayk7CisJCWlmKHJlbmV3ICYmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSkpCisJCQlpZWVlODAyMTFfc29mdG1hY19uZXdfbmV0KGllZWUsJm5ldHdvcmspOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKK30KKwordm9pZCBpZWVlODAyMTFfcnhfbWd0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGVhZGVyLAorCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpzdGF0cykKK3sKKwlzd2l0Y2ggKFdMQU5fRkNfR0VUX1NUWVBFKGhlYWRlci0+ZnJhbWVfY3RsKSkgeworCisJY2FzZSBJRUVFODAyMTFfU1RZUEVfQkVBQ09OOgorCQlJRUVFODAyMTFfREVCVUdfTUdNVCgicmVjZWl2ZWQgQkVBQ09OICglZClcbiIsCisJCQkJICAgICBXTEFOX0ZDX0dFVF9TVFlQRShoZWFkZXItPmZyYW1lX2N0bCkpOworCQlJRUVFODAyMTFfREVCVUdfU0NBTigiQmVhY29uXG4iKTsKKwkJaWVlZTgwMjExX3Byb2Nlc3NfcHJvYmVfcmVzcG9uc2UoCisJCQlpZWVlLCAoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSAqKWhlYWRlciwgc3RhdHMpOworCQlicmVhazsKKworCWNhc2UgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1A6CisJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJyZWNlaXZlZCBQUk9CRSBSRVNQT05TRSAoJWQpXG4iLAorCQkJCSAgICAgV0xBTl9GQ19HRVRfU1RZUEUoaGVhZGVyLT5mcmFtZV9jdGwpKTsKKwkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIlByb2JlIHJlc3BvbnNlXG4iKTsKKwkJaWVlZTgwMjExX3Byb2Nlc3NfcHJvYmVfcmVzcG9uc2UoCisJCQlpZWVlLCAoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSAqKWhlYWRlciwgc3RhdHMpOworCQlicmVhazsKKy8vcnoKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJY2FzZSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVROgorCQlJRUVFODAyMTFfREVCVUdfTUdNVCgicmVjZWl2ZWQgUFJPQkUgUkVRVUVTVCAoJWQpXG4iLAorCQkJCSAgICAgV0xBTl9GQ19HRVRfU1RZUEUoaGVhZGVyLT5mcmFtZV9jdGwpKTsKKwkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIlByb2JlIHJlcXVlc3RcbiIpOworCQkvLy8KKwkJaWYoIGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUgJiYgaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9yeF9tZ3Rfb25fcHJvYmVfcmVxICkKKwkJCWllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcnhfbWd0X29uX3Byb2JlX3JlcSggaWVlZSwgKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVxdWVzdCAqKWhlYWRlciwgc3RhdHMpOworCQlicmVhazsKKyNlbmRpZiAvLyBfUlRMODE4N19FWFRfUEFUQ0hfCisKKwl9Cit9CisKKyNpZiAwCitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9yeF9tZ3QpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfcngpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfbmV0d29ya19pbml0KTsKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCitFWFBPUlRfU1lNQk9MKGllZWVfZXh0X3NrYl9wODAyMTFfdG9fZXRoZXIpOworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NzUyZjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCkBAIC0wLDAgKzEsNDAyOSBAQAorLyogSUVFRSA4MDIuMTEgU29mdE1BQyBsYXllcgorICogQ29weXJpZ2h0IChjKSAyMDA1IEFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKyAqCisgKiBNb3N0bHkgZXh0cmFjdGVkIGZyb20gdGhlIHJ0bDgxODAtc2EyNDAwIGRyaXZlciBmb3IgdGhlCisgKiBpbi1rZXJuZWwgZ2VuZXJpYyBpZWVlODAyLjExIHN0YWNrLgorICoKKyAqIEZldyBsaW5lcyBtaWdodCBiZSBzdG9sZW4gZnJvbSBvdGhlciBwYXJ0IG9mIHRoZSBpZWVlODAyMTEKKyAqIHN0YWNrLiBDb3B5cmlnaHQgd2hvIG93biBpdCdzIGNvcHlyaWdodAorICoKKyAqIFdQQSBjb2RlIHN0b2xlbiBmcm9tIHRoZSBpcHcyMjAwIGRyaXZlci4KKyAqIENvcHlyaWdodCB3aG8gb3duIGl0J3MgY29weXJpZ2h0LgorICoKKyAqIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisKKyNpbmNsdWRlICJpZWVlODAyMTEuaCIKKworI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisjaW5jbHVkZSAiZG90MTFkLmgiCisjZW5kaWYKK3U4IHJzbl9hdXRoZW5fY2lwaGVyX3N1aXRlWzE2XVs0XSA9IHsKKwl7MHgwMCwweDBGLDB4QUMsMHgwMH0sIC8vVXNlIGdyb3VwIGtleSwgLy9SZXNlcnZlZAorCXsweDAwLDB4MEYsMHhBQywweDAxfSwgLy9XRVAtNDAgICAgICAgICAvL1JTTkEgZGVmYXVsdAorCXsweDAwLDB4MEYsMHhBQywweDAyfSwgLy9US0lQICAgICAgICAgICAvL05PTkUJCS8ve3VzZWQganVzdCBhcyBkZWZhdWx0fQorCXsweDAwLDB4MEYsMHhBQywweDAzfSwgLy9XUkFQLWhpc3RvcmljYWwKKwl7MHgwMCwweDBGLDB4QUMsMHgwNH0sIC8vQ0NNUAorCXsweDAwLDB4MEYsMHhBQywweDA1fSwgLy9XRVAtMTA0Cit9OworCitzaG9ydCBpZWVlODAyMTFfaXNfNTRnKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayBuZXQpCit7CisJcmV0dXJuICgobmV0LnJhdGVzX2V4X2xlbiA+IDApIHx8IChuZXQucmF0ZXNfbGVuID4gNCkpOworfQorCitzaG9ydCBpZWVlODAyMTFfaXNfc2hvcnRzbG90KHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayBuZXQpCit7CisJcmV0dXJuIChuZXQuY2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UKTsKK30KKworLyogcmV0dXJucyB0aGUgdG90YWwgbGVuZ3RoIG5lZWRlZCBmb3IgcGxlYWNpbmcgdGhlIFJBVEUgTUZJRQorICogdGFnIGFuZCB0aGUgRVhURU5ERUQgUkFURSBNRklFIHRhZyBpZiBuZWVkZWQuCisgKiBJdCBlbmNsdWRlcyB0d28gYnl0ZXMgcGVyIHRhZyBmb3IgdGhlIHRhZyBpdHNlbGYgYW5kIGl0cyBsZW4KKyAqLwordW5zaWduZWQgaW50IGllZWU4MDIxMV9NRklFX3JhdGVfbGVuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXVuc2lnbmVkIGludCByYXRlX2xlbiA9IDA7CisKKwlpZiAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTikKKwkJcmF0ZV9sZW4gPSBJRUVFODAyMTFfQ0NLX1JBVEVfTEVOICsgMjsKKworCWlmIChpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTikKKworCQlyYXRlX2xlbiArPSBJRUVFODAyMTFfT0ZETV9SQVRFX0xFTiArIDI7CisKKwlyZXR1cm4gcmF0ZV9sZW47Cit9CisKKy8qIHBsZWFjZSB0aGUgTUZJRSByYXRlLCB0YWcgdG8gdGhlIG1lbW9yeSAoZG91YmxlKSBwb2luZWQuCisgKiBUaGVuIGl0IHVwZGF0ZXMgdGhlIHBvaW50ZXIgc28gdGhhdAorICogaXQgcG9pbnRzIGFmdGVyIHRoZSBuZXcgTUZJRSB0YWcgYWRkZWQuCisgKi8KK3ZvaWQgaWVlZTgwMjExX01GSUVfQnJhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICoqdGFnX3ApCit7CisJdTggKnRhZyA9ICp0YWdfcDsKKworCWlmIChpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OKXsKKwkJKnRhZysrID0gTUZJRV9UWVBFX1JBVEVTOworCQkqdGFnKysgPSA0OworCQkqdGFnKysgPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX0NDS19SQVRFXzFNQjsKKwkJKnRhZysrID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9DQ0tfUkFURV8yTUI7CisJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfQ0NLX1JBVEVfNU1COworCQkqdGFnKysgPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX0NDS19SQVRFXzExTUI7CisJfQorCisJLyogV2UgbWF5IGFkZCBhbiBvcHRpb24gZm9yIGN1c3RvbSByYXRlcyB0aGF0IHNwZWNpZmljIEhXIG1pZ2h0IHN1cHBvcnQgKi8KKwkqdGFnX3AgPSB0YWc7Cit9CisKK3ZvaWQgaWVlZTgwMjExX01GSUVfR3JhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICoqdGFnX3ApCit7CisJdTggKnRhZyA9ICp0YWdfcDsKKworCQlpZiAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04peworCisJCSp0YWcrKyA9IE1GSUVfVFlQRV9SQVRFU19FWDsKKwkJKnRhZysrID0gODsKKwkJKnRhZysrID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfNk1COworCQkqdGFnKysgPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV85TUI7CisJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUI7CisJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzE4TUI7CisJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUI7CisJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzM2TUI7CisJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzQ4TUI7CisJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUI7CisKKwl9CisKKwkvKiBXZSBtYXkgYWRkIGFuIG9wdGlvbiBmb3IgY3VzdG9tIHJhdGVzIHRoYXQgc3BlY2lmaWMgSFcgbWlnaHQgc3VwcG9ydCAqLworCSp0YWdfcCA9IHRhZzsKK30KKworCit2b2lkIGllZWU4MDIxMV9XTU1fSW5mbyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKip0YWdfcCkgeworCXU4ICp0YWcgPSAqdGFnX3A7CisKKwkqdGFnKysgPSBNRklFX1RZUEVfR0VORVJJQzsgLy8wCisJKnRhZysrID0gNzsKKwkqdGFnKysgPSAweDAwOworCSp0YWcrKyA9IDB4NTA7CisJKnRhZysrID0gMHhmMjsKKwkqdGFnKysgPSAweDAyOy8vNQorCSp0YWcrKyA9IDB4MDA7CisJKnRhZysrID0gMHgwMTsKKyNpZmRlZiBTVVBQT1JUX1VTUEQKKwlpZihpZWVlLT5jdXJyZW50X25ldHdvcmsud21tX2luZm8gJiAweDgwKSB7CisJCSp0YWcrKyA9IDB4MGZ8TUFYX1NQX0xlbjsKKwl9IGVsc2UgeworCQkqdGFnKysgPSBNQVhfU1BfTGVuOworCX0KKyNlbHNlCisJKnRhZysrID0gTUFYX1NQX0xlbjsKKyNlbmRpZgorCSp0YWdfcCA9IHRhZzsKK30KKworI2lmZGVmIFRIT01BU19UVVJCTwordm9pZCBpZWVlODAyMTFfVFVSQk9fSW5mbyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKip0YWdfcCkgeworCXU4ICp0YWcgPSAqdGFnX3A7CisKKyAgICAgICAgKnRhZysrID0gTUZJRV9UWVBFX0dFTkVSSUM7IC8vMAorICAgICAgICAqdGFnKysgPSA3OworICAgICAgICAqdGFnKysgPSAweDAwOworICAgICAgICAqdGFnKysgPSAweGUwOworICAgICAgICAqdGFnKysgPSAweDRjOworICAgICAgICAqdGFnKysgPSAweDAxOy8vNQorICAgICAgICAqdGFnKysgPSAweDAyOworICAgICAgICAqdGFnKysgPSAweDExOworCSp0YWcrKyA9IDB4MDA7CisKKwkqdGFnX3AgPSB0YWc7CisJcHJpbnRrKEtFUk5fQUxFUlQgIlRoaXMgaXMgZW5hYmxlIHR1cmJvIG1vZGUgSUUgcHJvY2Vzc1xuIik7Cit9CisjZW5kaWYKKwordm9pZCBlbnF1ZXVlX21nbXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IG5oOworCW5oID0gKGllZWUtPm1nbXRfcXVldWVfaGVhZCArMSkgJSBNR01UX1FVRVVFX05VTTsKKworLyoKKyAqIGlmIHRoZSBxdWV1ZSBpcyBmdWxsIGJ1dCB3ZSBoYXZlIG5ld2VyIGZyYW1lcyB0aGVuCisgKiBqdXN0IG92ZXJ3cml0ZXMgdGhlIG9sZGVzdC4KKyAqCisgKiBpZiAobmggPT0gaWVlZS0+bWdtdF9xdWV1ZV90YWlsKQorICoJCXJldHVybiAtMTsKKyAqLworCWllZWUtPm1nbXRfcXVldWVfaGVhZCA9IG5oOworCWllZWUtPm1nbXRfcXVldWVfcmluZ1tuaF0gPSBza2I7CisKKwkvL3JldHVybiAwOworfQorCitzdHJ1Y3Qgc2tfYnVmZiAqZGVxdWV1ZV9tZ210KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXN0cnVjdCBza19idWZmICpyZXQ7CisKKwlpZihpZWVlLT5tZ210X3F1ZXVlX3RhaWwgPT0gaWVlZS0+bWdtdF9xdWV1ZV9oZWFkKQorCQlyZXR1cm4gTlVMTDsKKworCXJldCA9IGllZWUtPm1nbXRfcXVldWVfcmluZ1tpZWVlLT5tZ210X3F1ZXVlX3RhaWxdOworCisJaWVlZS0+bWdtdF9xdWV1ZV90YWlsID0KKwkJKGllZWUtPm1nbXRfcXVldWVfdGFpbCsxKSAlIE1HTVRfUVVFVUVfTlVNOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBpbml0X21nbXRfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWVlZS0+bWdtdF9xdWV1ZV90YWlsID0gaWVlZS0+bWdtdF9xdWV1ZV9oZWFkID0gMDsKK30KKworCit2b2lkIGllZWU4MDIxMV9zdGFfd2FrZXVwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzaG9ydCBubCk7CisKK2lubGluZSB2b2lkIHNvZnRtYWNfbWdtdF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc2hvcnQgc2luZ2xlID0gaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUU7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICpoZWFkZXI9CisJCShzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKikgc2tiLT5kYXRhOworCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJLyogY2FsbGVkIHdpdGggMm5kIHBhcmFtIDAsIG5vIG1nbXQgbG9jayByZXF1aXJlZCAqLworCWllZWU4MDIxMV9zdGFfd2FrZXVwKGllZWUsMCk7CisKKwlpZihzaW5nbGUpeworCQlpZihpZWVlLT5xdWV1ZV9zdG9wKXsKKworCQkJZW5xdWV1ZV9tZ210KGllZWUsc2tiKTsKKwkJfWVsc2V7CisJCQloZWFkZXItPnNlcV9jdGwgPSBjcHVfdG9fbGUxNihpZWVlLT5zZXFfY3RybFswXTw8NCk7CisKKwkJCWlmIChpZWVlLT5zZXFfY3RybFswXSA9PSAweEZGRikKKwkJCQlpZWVlLT5zZXFfY3RybFswXSA9IDA7CisJCQllbHNlCisJCQkJaWVlZS0+c2VxX2N0cmxbMF0rKzsKKworCQkJLyogYXZvaWQgd2F0Y2hkb2cgdHJpZ2dlcnMgKi8KKwkJCWllZWUtPmRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQkJaWVlZS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdChza2IsaWVlZS0+ZGV2LGllZWUtPmJhc2ljX3JhdGUpOworCQl9CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCX1lbHNleworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzKTsKKworCQloZWFkZXItPnNlcV9jdGwgPSBjcHVfdG9fbGUxNihpZWVlLT5zZXFfY3RybFswXSA8PCA0KTsKKworCQlpZiAoaWVlZS0+c2VxX2N0cmxbMF0gPT0gMHhGRkYpCisJCQlpZWVlLT5zZXFfY3RybFswXSA9IDA7CisJCWVsc2UKKwkJCWllZWUtPnNlcV9jdHJsWzBdKys7CisKKwkJLyogYXZvaWQgd2F0Y2hkb2cgdHJpZ2dlcnMgKi8KKwkJaWVlZS0+ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCWllZWUtPnNvZnRtYWNfaGFyZF9zdGFydF94bWl0KHNrYixpZWVlLT5kZXYpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MpOworCX0KK30KKworCitpbmxpbmUgdm9pZCBzb2Z0bWFjX3BzX21nbXRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKworCXNob3J0IHNpbmdsZSA9IGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFOworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICAqaGVhZGVyID0KKwkJKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICAqKSBza2ItPmRhdGE7CisKKworCWlmKHNpbmdsZSl7CisKKwkJaGVhZGVyLT5zZXFfY3RsID0gY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmxbMF0gPDwgNCk7CisKKwkJaWYgKGllZWUtPnNlcV9jdHJsWzBdID09IDB4RkZGKQorCQkJaWVlZS0+c2VxX2N0cmxbMF0gPSAwOworCQllbHNlCisJCQlpZWVlLT5zZXFfY3RybFswXSsrOworCisJCS8qIGF2b2lkIHdhdGNoZG9nIHRyaWdnZXJzICovCisJCWllZWUtPmRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQlpZWVlLT5zb2Z0bWFjX2RhdGFfaGFyZF9zdGFydF94bWl0KHNrYixpZWVlLT5kZXYsaWVlZS0+YmFzaWNfcmF0ZSk7CisKKwl9ZWxzZXsKKworCQloZWFkZXItPnNlcV9jdGwgPSBjcHVfdG9fbGUxNihpZWVlLT5zZXFfY3RybFswXSA8PCA0KTsKKworCQlpZiAoaWVlZS0+c2VxX2N0cmxbMF0gPT0gMHhGRkYpCisJCQlpZWVlLT5zZXFfY3RybFswXSA9IDA7CisJCWVsc2UKKwkJCWllZWUtPnNlcV9jdHJsWzBdKys7CisKKwkJLyogYXZvaWQgd2F0Y2hkb2cgdHJpZ2dlcnMgKi8KKwkJaWVlZS0+ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCWllZWUtPnNvZnRtYWNfaGFyZF9zdGFydF94bWl0KHNrYixpZWVlLT5kZXYpOworCisJfQorLy8JZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCit9CisvL2J5IGFteSBmb3IgcG93ZXIgc2F2ZQoraW5saW5lIHN0cnVjdCBza19idWZmICppZWVlODAyMTFfZGlzYXNzb2NpYXRlX3NrYigKKwkJCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmJlYWNvbiwKKwkJCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkJCQl1OAlhc1JzbikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBpZWVlODAyMTFfZGlzYXNzb2NfZnJhbWUgKmRpc2FzczsKKworCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfZGlzYXNzb2NfZnJhbWUpKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIE5VTEw7CisKKwlkaXNhc3MgPSAoc3RydWN0IGllZWU4MDIxMV9kaXNhc3NvY19mcmFtZSAqKSBza2JfcHV0KHNrYixzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9kaXNhc3NvY19mcmFtZSkpOworCWRpc2Fzcy0+aGVhZGVyLmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9ESVNBU1NPQyk7CisJZGlzYXNzLT5oZWFkZXIuZHVyYXRpb25faWQgPSAwOworCisJbWVtY3B5KGRpc2Fzcy0+aGVhZGVyLmFkZHIxLCBiZWFjb24tPmJzc2lkLCBFVEhfQUxFTik7CisJbWVtY3B5KGRpc2Fzcy0+aGVhZGVyLmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGRpc2Fzcy0+aGVhZGVyLmFkZHIzLCBiZWFjb24tPmJzc2lkLCBFVEhfQUxFTik7CisKKwlkaXNhc3MtPnJlYXNvbmNvZGUgPSBhc1JzbjsKKwlyZXR1cm4gc2tiOworfQordm9pZAorU2VuZERpc2Fzc29jaWF0aW9uKAorICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKyAgICAgICAgdTgqICAgICAgICAgICAgICAgICAgICAgYXNTdGEsCisgICAgICAgIHU4ICAgICAgICAgICAgICAgICAgICAgIGFzUnNuCispCit7CisgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uID0gJmllZWUtPmN1cnJlbnRfbmV0d29yazsKKyAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYjsKKyAgICAgICAgc2tiID0gaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZV9za2IoYmVhY29uLGllZWUsYXNSc24pOworICAgICAgICBpZiAoc2tiKXsKKyAgICAgICAgICAgICAgICBzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOworICAgICAgICAgICAgICAgIC8vZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCisgICAgICAgIH0KK30KKworLy9ieSBhbXkgZm9yIHBvd2VyIHNhdmUKK2lubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX3Byb2JlX3JlcShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwl1bnNpZ25lZCBpbnQgbGVuLHJhdGVfbGVuOworCXU4ICp0YWc7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3JlcXVlc3QgKnJlcTsKKworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlzaG9ydCBleHRNb3JlID0gMDsKKwlpZihpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3Byb2JlX3JlcV8xKQorCQlleHRNb3JlID0gaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9wcm9iZV9yZXFfMShpZWVlKTsKKyNlbmRpZgorCisJbGVuID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuOworCisJcmF0ZV9sZW4gPSBpZWVlODAyMTFfTUZJRV9yYXRlX2xlbihpZWVlKTsKKworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlpZighZXh0TW9yZSkKKyNlbmRpZgorCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVxdWVzdCkgKworCQkJICAgIDIgKyBsZW4gKyByYXRlX2xlbik7CisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWVsc2UKKwkJc2tiID0gZGV2X2FsbG9jX3NrYihzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXF1ZXN0KSArCisJCQkgICAgMiArIGxlbiArIHJhdGVfbGVuKzEyOCk7IC8vIE1FU0hJRCArIENBUAorI2VuZGlmCisKKwlpZiAoIXNrYikKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXEgPSAoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXF1ZXN0ICopIHNrYl9wdXQoc2tiLHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3JlcXVlc3QpKTsKKwlyZXEtPmhlYWRlci5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVRKTsKKwlyZXEtPmhlYWRlci5kdXJhdGlvbl9pZCA9IDA7IC8vRklYTUU6IGlzIHRoaXMgT0sgPworCisJbWVtc2V0KHJlcS0+aGVhZGVyLmFkZHIxLCAweGZmLCBFVEhfQUxFTik7CisJbWVtY3B5KHJlcS0+aGVhZGVyLmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtc2V0KHJlcS0+aGVhZGVyLmFkZHIzLCAweGZmLCBFVEhfQUxFTik7CisKKwl0YWcgPSAodTggKikgc2tiX3B1dChza2IsbGVuKzIrcmF0ZV9sZW4pOworCisJKnRhZysrID0gTUZJRV9UWVBFX1NTSUQ7CisJKnRhZysrID0gbGVuOworCW1lbWNweSh0YWcsIGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCBsZW4pOworCXRhZyArPSBsZW47CisJaWVlZTgwMjExX01GSUVfQnJhdGUoaWVlZSwmdGFnKTsKKwlpZWVlODAyMTFfTUZJRV9HcmF0ZShpZWVlLCZ0YWcpOworCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWlmKGV4dE1vcmUpCisJCWllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcHJvYmVfcmVxXzIoaWVlZSwgc2tiLCB0YWcpOworI2VuZGlmCisJcmV0dXJuIHNrYjsKK30KKworc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9nZXRfYmVhY29uXyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CisKKy8vI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApCisvL3ZvaWQgZXh0X2llZWU4MDIxMV9zZW5kX2JlYWNvbl93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCisvL3sKKy8vCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBleHRfc2VuZF9iZWFjb25fd3EpOworLy8jZWxzZQordm9pZCBleHRfaWVlZTgwMjExX3NlbmRfYmVhY29uX3dxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworLy8jZW5kaWYKKworCXN0cnVjdCBza19idWZmICpza2I7CisKKwkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlza2IgPSBpZWVlODAyMTFfZ2V0X2JlYWNvbl8oaWVlZSk7CisKKwlpZiAoc2tiKXsKKwkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKKwkJaWVlZS0+c29mdG1hY19zdGF0cy50eF9iZWFjb25zKys7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ly9lZGl0IGJ5IHRob21hcworCX0KKworCisJLy9wcmludGsoS0VSTl9XQVJOSU5HICJbMV0gYmVhY29uIHNlbmRpbmchXG4iKTsKKwlpZWVlLT5iZWFjb25fdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKworCQkoTVNFQ1MoIGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwgLTUpKTsKKworCS8vc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmJlYWNvbl9sb2NrLGZsYWdzKTsKKwlpZihpZWVlLT5iZWFjb25fdHhpbmcpCisJCWFkZF90aW1lcigmaWVlZS0+YmVhY29uX3RpbWVyKTsKKwkvL3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmJlYWNvbl9sb2NrLGZsYWdzKTsKK30KKwordm9pZCBpZWVlODAyMTFfc2VuZF9iZWFjb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCS8vdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNrYiA9IGllZWU4MDIxMV9nZXRfYmVhY29uXyhpZWVlKTsKKworCWlmIChza2IpeworCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOworCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnR4X2JlYWNvbnMrKzsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCisJfQorCisJLy9wcmludGsoS0VSTl9XQVJOSU5HICJbMV0gYmVhY29uIHNlbmRpbmchXG4iKTsKKwlpZWVlLT5iZWFjb25fdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKworCQkoTVNFQ1MoIGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwgLTUpKTsKKworCS8vc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmJlYWNvbl9sb2NrLGZsYWdzKTsKKwlpZihpZWVlLT5iZWFjb25fdHhpbmcpCisJCWFkZF90aW1lcigmaWVlZS0+YmVhY29uX3RpbWVyKTsKKwkvL3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmJlYWNvbl9sb2NrLGZsYWdzKTsKK30KKworCit2b2lkIGllZWU4MDIxMV9zZW5kX2JlYWNvbl9jYih1bnNpZ25lZCBsb25nIF9pZWVlKQoreworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0KKwkJKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICopIF9pZWVlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+YmVhY29uX2xvY2ssIGZsYWdzKTsKKwlpZWVlODAyMTFfc2VuZF9iZWFjb24oaWVlZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+YmVhY29uX2xvY2ssIGZsYWdzKTsKK30KKworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKworaW5saW5lIHN0cnVjdCBza19idWZmICppZWVlODAyMTFfcHJvYmVfcmVxX3dpdGhfU1NJRChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgY2hhciAqc3NpZCwgaW50IGxlbl9zc2lkKQoreworCXVuc2lnbmVkIGludCBsZW4scmF0ZV9sZW47CisJdTggKnRhZzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVxdWVzdCAqcmVxOworCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCXNob3J0IGV4dE1vcmUgPSAwOworCWlmKGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcHJvYmVfcmVxXzEpCisJCWV4dE1vcmUgPSBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3Byb2JlX3JlcV8xKGllZWUpOworI2VuZGlmCisKKwlsZW4gPSBsZW5fc3NpZDsKKworCXJhdGVfbGVuID0gaWVlZTgwMjExX01GSUVfcmF0ZV9sZW4oaWVlZSk7CisKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJaWYoIWV4dE1vcmUpCisjZW5kaWYKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3JlcXVlc3QpICsKKwkJCSAgICAyICsgbGVuICsgcmF0ZV9sZW4pOworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwllbHNlCisJCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVxdWVzdCkgKworCQkJICAgIDIgKyBsZW4gKyByYXRlX2xlbisxMjgpOyAvLyBNRVNISUQgKyBDQVAKKyNlbmRpZgorCisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCisJcmVxID0gKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVxdWVzdCAqKSBza2JfcHV0KHNrYixzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXF1ZXN0KSk7CisJcmVxLT5oZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFUSk7CisJcmVxLT5oZWFkZXIuZHVyYXRpb25faWQgPSAwOyAvL0ZJWE1FOiBpcyB0aGlzIE9LID8KKworCW1lbXNldChyZXEtPmhlYWRlci5hZGRyMSwgMHhmZiwgRVRIX0FMRU4pOworCW1lbWNweShyZXEtPmhlYWRlci5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbXNldChyZXEtPmhlYWRlci5hZGRyMywgMHhmZiwgRVRIX0FMRU4pOworCisJdGFnID0gKHU4ICopIHNrYl9wdXQoc2tiLGxlbisyK3JhdGVfbGVuKTsKKworCSp0YWcrKyA9IE1GSUVfVFlQRV9TU0lEOworCSp0YWcrKyA9IGxlbjsKKwlpZihsZW4pCisJeworCQltZW1jcHkodGFnLCBzc2lkLCBsZW4pOworCQl0YWcgKz0gbGVuOworCX0KKworCWllZWU4MDIxMV9NRklFX0JyYXRlKGllZWUsJnRhZyk7CisJaWVlZTgwMjExX01GSUVfR3JhdGUoaWVlZSwmdGFnKTsKKworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlpZihleHRNb3JlKQorCQlpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3Byb2JlX3JlcV8yKGllZWUsIHNrYiwgdGFnKTsKKyNlbmRpZgorCXJldHVybiBza2I7Cit9CisKKyNlbmRpZiAvLyBfUlRMODE4N19FWFRfUEFUQ0hfCisKKwordm9pZCBpZWVlODAyMTFfc2VuZF9wcm9iZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWlmKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpCisJCXNrYiA9IGllZWU4MDIxMV9wcm9iZV9yZXFfd2l0aF9TU0lEKGllZWUsIE5VTEwsIDApOworCWVsc2UKKyNlbmRpZgorCXNrYiA9IGllZWU4MDIxMV9wcm9iZV9yZXEoaWVlZSk7CisJaWYgKHNrYil7CisJCXNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7CisJCWllZWUtPnNvZnRtYWNfc3RhdHMudHhfcHJvYmVfcnErKzsKKwkJLy9kZXZfa2ZyZWVfc2tiX2FueShza2IpOy8vZWRpdCBieSB0aG9tYXMKKwl9Cit9CisKK3ZvaWQgaWVlZTgwMjExX3NlbmRfcHJvYmVfcmVxdWVzdHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWYgKGllZWUtPmFjdGl2ZV9zY2FuICYmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1BST0JFUlEpKXsKKwkJaWVlZTgwMjExX3NlbmRfcHJvYmUoaWVlZSk7CisJCWllZWU4MDIxMV9zZW5kX3Byb2JlKGllZWUpOworCX0KK30KKworLyogdGhpcyBwZXJmb3JtcyBzeW5jcm8gc2NhbiBibG9ja2luZyB0aGUgY2FsbGVyIHVudGlsIGFsbCBjaGFubmVscworICogaW4gdGhlIGFsbG93ZWQgY2hhbm5lbCBtYXAgaGFzIGJlZW4gY2hlY2tlZC4KKyAqLwordm9pZCBpZWVlODAyMTFfc29mdG1hY19zY2FuX3N5bmNybyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlzaG9ydCBjaCA9IDA7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCXU4IGNoYW5uZWxfbWFwW01BWF9DSEFOTkVMX05VTUJFUisxXTsKKwltZW1jcHkoY2hhbm5lbF9tYXAsIEdFVF9ET1QxMURfSU5GTyhpZWVlKS0+Y2hhbm5lbF9tYXAsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsKKyNlbmRpZgorCWRvd24oJmllZWUtPnNjYW5fc2VtKTsKKy8vCXByaW50aygiPT09PT09PT09PT09PT09PT09PiBTeW5jIHNjYW5cbiIpOworLy8JZHVtcF9jaG5sX21hcChjaGFubmVsX21hcCk7CisKKwl3aGlsZSgxKQorCXsKKworCQlkb3sKKwkJCWNoKys7CisJCQlpZiAoY2ggPiBNQVhfQ0hBTk5FTF9OVU1CRVIpCisJCQkJZ290byBvdXQ7IC8qIHNjYW4gY29tcGxldGVkICovCisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJCX13aGlsZSghY2hhbm5lbF9tYXBbY2hdKTsKKyNlbHNlCisJCX13aGlsZSghaWVlZS0+Y2hhbm5lbF9tYXBbY2hdKTsKKyNlbmRpZgorCQkvKiB0aGlzIGZ1Y3Rpb24gY2FuIGJlIGNhbGxlZCBpbiB0d28gc2l0dWF0aW9ucworCQkgKiAxLSBXZSBoYXZlIHN3aXRjaGVkIHRvIGFkLWhvYyBtb2RlIGFuZCB3ZSBhcmUKKwkJICogICAgcGVyZm9ybWluZyBhIGNvbXBsZXRlIHN5bmNybyBzY2FuIGJlZm9yZSBjb25jbHVkZQorCQkgKiAgICB0aGVyZSBhcmUgbm8gaW50ZXJlc3RpbmcgY2VsbCBhbmQgdG8gY3JlYXRlIGEKKwkJICogICAgbmV3IG9uZS4gSW4gdGhpcyBjYXNlIHRoZSBsaW5rIHN0YXRlIGlzCisJCSAqICAgIElFRUU4MDIxMV9OT0xJTksgdW50aWwgd2UgZm91bmQgYW4gaW50ZXJlc3RpbmcgY2VsbC4KKwkJICogICAgSWYgc28gdGhlIGllZWU4MDIxX25ld19uZXQsIGNhbGxlZCBieSB0aGUgUlggcGF0aAorCQkgKiAgICB3aWxsIHNldCB0aGUgc3RhdGUgdG8gSUVFRTgwMjExX0xJTktFRCwgc28gd2Ugc3RvcAorCQkgKiAgICBzY2FubmluZworCQkgKiAyLSBXZSBhcmUgbGlua2VkIGFuZCB0aGUgcm9vdCB1c2VzIHJ1biBpd2xpc3Qgc2Nhbi4KKwkJICogICAgU28gd2Ugc3dpdGNoIHRvIElFRUU4MDIxMV9MSU5LRURfU0NBTk5JTkcgdG8gcmVtZW1iZXIKKwkJICogICAgdGhhdCB3ZSBhcmUgc3RpbGwgbG9naWNhbGx5IGxpbmtlZCAobm90IGludGVyZXN0ZWQgaW4KKwkJICogICAgbmV3IG5ldHdvcmsgZXZlbnRzLCBkZXNwaXRlIGZvciB1cGRhdGluZyB0aGUgbmV0IGxpc3QsCisJCSAqICAgIGJ1dCB3ZSBhcmUgdGVtcG9yYXJseSAndW5saW5rZWQnIGFzIHRoZSBkcml2ZXIgc2hhbGwKKwkJICogICAgbm90IGZpbHRlciBSWCBmcmFtZXMgYW5kIHRoZSBjaGFubmVsIGlzIGNoYW5naW5nLgorCQkgKiBTbyB0aGUgb25seSBzaXR1YXRpb24gaW4gd2l0Y2ggYXJlIGludGVyZXN0ZWQgaXMgdG8gY2hlY2sKKwkJICogaWYgdGhlIHN0YXRlIGJlY29tZSBMSU5LRUQgYmVjYXVzZSBvZiB0aGUgIzEgc2l0dWF0aW9uCisJCSAqLworCisJCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKQorCQkJZ290byBvdXQ7CisKKwkJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBjaCk7CisvLwkJcHJpbnRrKCI9PT09PT5jaGFubmVsPSVkICAgIixjaCk7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCQlpZihjaGFubmVsX21hcFtjaF0gPT0gMSkKKyNlbmRpZgorCQl7CisvLwkJCXByaW50aygiPT09PXNlbmQgcHJvYmUgcmVxdWVzdFxuIik7CisJCQlpZWVlODAyMTFfc2VuZF9wcm9iZV9yZXF1ZXN0cyhpZWVlKTsKKwkJfQorCQkvKiB0aGlzIHByZXZlbnQgZXhjZXNzaXZlIHRpbWUgd2FpdCB3aGVuIHdlCisJCSAqIG5lZWQgdG8gd2FpdCBmb3IgYSBzeW5jcm8gc2NhbiB0byBlbmQuLgorCQkgKi8KKwkJaWYgKGllZWUtPnN5bmNfc2Nhbl9odXJyeXVwKQorCQkJZ290byBvdXQ7CisKKworCQltc2xlZXBfaW50ZXJydXB0aWJsZV9ydGwoSUVFRTgwMjExX1NPRlRNQUNfU0NBTl9USU1FKTsKKworCX0KK291dDoKKwlpZWVlLT5zeW5jX3NjYW5faHVycnl1cCA9IDA7CisJdXAoJmllZWUtPnNjYW5fc2VtKTsKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJaWYoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSkKKwkJRE9UMTFEX1NjYW5Db21wbGV0ZShpZWVlKTsKKyNlbmRpZgorfQorCit2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX2lwc19zY2FuX3N5bmNybyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlpbnQgY2g7CisgICAgICAgIHVuc2lnbmVkIGludCB3YXRjaF9kb2cgPSAwOworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwl1OCBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07CisJbWVtY3B5KGNoYW5uZWxfbWFwLCBHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7CisjZW5kaWYKKyAgICAgICAgZG93bigmaWVlZS0+c2Nhbl9zZW0pOworCWNoID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWw7CisvLyAgICAgIAlpZihpZWVlLT5zeW5jX3NjYW5faHVycnl1cCkKKy8vCXsKKworLy8JCXByaW50aygic3RvcCBzY2FuIHN5bmNcbiIpOworLy8gICAJCWdvdG8gb3V0OworLy8gIAl9CisvLwlwcmludGsoIj09PT09PT1oaD09PT09PT09PT09PT09PT5pcHMgc2NhblxuIik7CisgICAgIAl3aGlsZSgxKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogdGhpcyBmdWN0aW9uIGNhbiBiZSBjYWxsZWQgaW4gdHdvIHNpdHVhdGlvbnMKKyAgICAgICAgICAgICAgICAgKiAxLSBXZSBoYXZlIHN3aXRjaGVkIHRvIGFkLWhvYyBtb2RlIGFuZCB3ZSBhcmUKKyAgICAgICAgICAgICAgICAgKiAgICBwZXJmb3JtaW5nIGEgY29tcGxldGUgc3luY3JvIHNjYW4gYmVmb3JlIGNvbmNsdWRlCisgICAgICAgICAgICAgICAgICogICAgdGhlcmUgYXJlIG5vIGludGVyZXN0aW5nIGNlbGwgYW5kIHRvIGNyZWF0ZSBhCisgICAgICAgICAgICAgICAgICogICAgbmV3IG9uZS4gSW4gdGhpcyBjYXNlIHRoZSBsaW5rIHN0YXRlIGlzCisgICAgICAgICAgICAgICAgICogICAgSUVFRTgwMjExX05PTElOSyB1bnRpbCB3ZSBmb3VuZCBhbiBpbnRlcmVzdGluZyBjZWxsLgorICAgICAgICAgICAgICAgICAqICAgIElmIHNvIHRoZSBpZWVlODAyMV9uZXdfbmV0LCBjYWxsZWQgYnkgdGhlIFJYIHBhdGgKKyAgICAgICAgICAgICAgICAgKiAgICB3aWxsIHNldCB0aGUgc3RhdGUgdG8gSUVFRTgwMjExX0xJTktFRCwgc28gd2Ugc3RvcAorICAgICAgICAgICAgICAgICAqICAgIHNjYW5uaW5nCisgICAgICAgICAgICAgICAgICogMi0gV2UgYXJlIGxpbmtlZCBhbmQgdGhlIHJvb3QgdXNlcyBydW4gaXdsaXN0IHNjYW4uCisgICAgICAgICAgICAgICAgICogICAgU28gd2Ugc3dpdGNoIHRvIElFRUU4MDIxMV9MSU5LRURfU0NBTk5JTkcgdG8gcmVtZW1iZXIKKyAgICAgICAgICAgICAgICAgKiAgICB0aGF0IHdlIGFyZSBzdGlsbCBsb2dpY2FsbHkgbGlua2VkIChub3QgaW50ZXJlc3RlZCBpbgorICAgICAgICAgICAgICAgICAqICAgIG5ldyBuZXR3b3JrIGV2ZW50cywgZGVzcGl0ZSBmb3IgdXBkYXRpbmcgdGhlIG5ldCBsaXN0LAorICAgICAgICAgICAgICAgICAqICAgIGJ1dCB3ZSBhcmUgdGVtcG9yYXJseSAndW5saW5rZWQnIGFzIHRoZSBkcml2ZXIgc2hhbGwKKyAgICAgICAgICAgICAgICAgKiAgICBub3QgZmlsdGVyIFJYIGZyYW1lcyBhbmQgdGhlIGNoYW5uZWwgaXMgY2hhbmdpbmcuCisgICAgICAgICAgICAgICAgICogU28gdGhlIG9ubHkgc2l0dWF0aW9uIGluIHdpdGNoIGFyZSBpbnRlcmVzdGVkIGlzIHRvIGNoZWNrCisgICAgICAgICAgICAgICAgICogaWYgdGhlIHN0YXRlIGJlY29tZSBMSU5LRUQgYmVjYXVzZSBvZiB0aGUgIzEgc2l0dWF0aW9uCisgICAgICAgICAgICAgICAgICovCisJCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKQorCQl7CisJCQlnb3RvIG91dDsKKwkJfQorI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwkJaWYoY2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdID4gMCkKKyNlbmRpZgorCQl7CisJCQlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKy8vCQkJcHJpbnRrKCI9PT09PT0+Y2hhbm5lbD0lZCAgIixpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisJCX0KKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJCWlmKGNoYW5uZWxfbWFwW2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXSA9PSAxKQorI2VuZGlmCisJCXsKKy8vCQkJcHJpbnRrKCI9PT09c2VuZCBwcm9iZSByZXF1ZXN0XG4iKTsKKwkJCWllZWU4MDIxMV9zZW5kX3Byb2JlX3JlcXVlc3RzKGllZWUpOworICAgICAgICAgICAgICAgIH0KKwkJLyogdGhpcyBwcmV2ZW50IGV4Y2Vzc2l2ZSB0aW1lIHdhaXQgd2hlbiB3ZQorICAgICAgICAgICAgICAgICAqIG5lZWQgdG8gd2FpdCBmb3IgYSBzeW5jcm8gc2NhbiB0byBlbmQuLgorICAgICAgICAgICAgICAgICAqLworLy8gICAgICAgICAgICAgICAgaWYgKGllZWUtPnN5bmNfc2Nhbl9odXJyeXVwKQorLy8gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKworCQltc2xlZXBfaW50ZXJydXB0aWJsZV9ydGwoSUVFRTgwMjExX1NPRlRNQUNfU0NBTl9USU1FKTsKKworCQlkb3sKKwkJCWlmICh3YXRjaF9kb2crKyA+PSBNQVhfQ0hBTk5FTF9OVU1CRVIpCisJCS8vCWlmICgrK3dhdGNoX2RvZyA+PSAxNSk7Ly9NQVhfQ0hBTk5FTF9OVU1CRVIpICAvL1lKLG1vZGlmaWVkLDA4MDYzMAorCQkJCWdvdG8gb3V0OyAvKiBzY2FuIGNvbXBsZXRlZCAqLworCisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9IChpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCArIDEpJU1BWF9DSEFOTkVMX05VTUJFUjsKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJCX13aGlsZSghY2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdKTsKKyNlbHNlCisJCX13aGlsZSghaWVlZS0+Y2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdKTsKKyNlbmRpZgorICAgICAgICB9CitvdXQ6CisJLy9pZWVlLT5zeW5jX3NjYW5faHVycnl1cCA9IDA7CisgICAJLy9pZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGNoKTsKKyAgIAkvL2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID0gY2g7CisJaWVlZS0+YWN0c2Nhbm5pbmcgPSBmYWxzZTsKKwl1cCgmaWVlZS0+c2Nhbl9zZW0pOworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwlpZihJU19ET1QxMURfRU5BQkxFKGllZWUpKQorCQlET1QxMURfU2NhbkNvbXBsZXRlKGllZWUpOworI2VuZGlmCit9CisKKworI2lmIDAKKy8qIGNhbGxlZCBib3RoIGJ5IHdxIHdpdGggaWVlZS0+bG9jayBoZWxkICovCit2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJc2hvcnQgd2F0Y2hkb2cgPSAwOworCisJZG97CisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID0KKwkJCShpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCArIDEpICUgTUFYX0NIQU5ORUxfTlVNQkVSOworCQlpZiAod2F0Y2hkb2crKyA+IE1BWF9DSEFOTkVMX05VTUJFUikKKwkJCQlyZXR1cm47IC8qIG5vIGdvb2QgY2hhbnMgKi8KKworCX13aGlsZSghaWVlZS0+Y2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdKTsKKworCisJc2NoZWR1bGVfd29yaygmaWVlZS0+c29mdG1hY19zY2FuX3dxKTsKK30KKyNlbmRpZgorI2lmZGVmIEVOQUJMRV9JUFMKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkpCit2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkZWxheWVkX3dvcmssIHdvcmspOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKGR3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgc29mdG1hY19zY2FuX3dxKTsKKyNlbHNlCit2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fd3Eoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisjZW5kaWYKKwlzdGF0aWMgc2hvcnQgd2F0Y2hkb2cgPSAwOworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwl1OCBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07CisJbWVtY3B5KGNoYW5uZWxfbWFwLCBHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7CisjZW5kaWYKKy8vCXByaW50aygiaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl93cSBFTkFCTEVfSVBTXG4iKTsKKy8vCXByaW50aygiaW4gJXNcbiIsX19mdW5jX18pOworCWRvd24oJmllZWUtPnNjYW5fc2VtKTsKKworCWRveworCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9CisJCQkoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgKyAxKSAlIE1BWF9DSEFOTkVMX05VTUJFUjsKKwkJaWYgKHdhdGNoZG9nKysgPiBNQVhfQ0hBTk5FTF9OVU1CRVIpCisJCQkJZ290byBvdXQ7IC8qIG5vIGdvb2QgY2hhbnMgKi8KKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKyAJfXdoaWxlKCFjaGFubmVsX21hcFtpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF0pOworI2Vsc2UKKyAJfXdoaWxlKCFpZWVlLT5jaGFubmVsX21hcFtpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF0pOworI2VuZGlmCisKKwkvL3ByaW50aygiY3VycmVudF9uZXR3b3JrLmNoYW5uZWw6JWRcbiIsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKwlpZiAoaWVlZS0+c2Nhbm5pbmcgPT0gMCApCisJeworCQlwcmludGsoImVycm9yIG91dCwgc2Nhbm5pbmcgPSAwXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwlpZihjaGFubmVsX21hcFtpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF0gPT0gMSkKKyNlbmRpZgorCQlpZWVlODAyMTFfc2VuZF9wcm9iZV9yZXF1ZXN0cyhpZWVlKTsKKworCXF1ZXVlX2RlbGF5ZWRfd29yayhpZWVlLT53cSwgJmllZWUtPnNvZnRtYWNfc2Nhbl93cSwgSUVFRTgwMjExX1NPRlRNQUNfU0NBTl9USU1FKTsKKwl1cCgmaWVlZS0+c2Nhbl9zZW0pOworCXJldHVybjsKK291dDoKKwlpZWVlLT5hY3RzY2FubmluZyA9IGZhbHNlOworCXdhdGNoZG9nID0gMDsKKwlpZWVlLT5zY2FubmluZyA9IDA7CisJdXAoJmllZWUtPnNjYW5fc2VtKTsKKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwlpZihJU19ET1QxMURfRU5BQkxFKGllZWUpKQorCQlET1QxMURfU2NhbkNvbXBsZXRlKGllZWUpOworI2VuZGlmCisJcmV0dXJuOworfQorI2Vsc2UKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkpCit2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworICAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZGVsYXllZF93b3JrLCB3b3JrKTsKKyAgICAgICAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIHNvZnRtYWNfc2Nhbl93cSk7CisjZWxzZQordm9pZCBpZWVlODAyMTFfc29mdG1hY19zY2FuX3dxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworI2VuZGlmCisKKyAgICAgICAgc2hvcnQgd2F0Y2hkb2cgPSAwOworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwl1OCBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07CisJbWVtY3B5KGNoYW5uZWxfbWFwLCBHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7CisjZW5kaWYKKy8vICAgICAgcHJpbnRrKCJlbnRlciBzY2FuIHdxLHdhdGNoZG9nIGlzICVkXG4iLHdhdGNoZG9nKTsKKyAgICAgICAgZG93bigmaWVlZS0+c2Nhbl9zZW0pOworCisgICAgICAgIGRveworICAgICAgICAgICAgICAgIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCArIDEpICUgTUFYX0NIQU5ORUxfTlVNQkVSOworICAgICAgICAgICAgICAgIGlmICh3YXRjaGRvZysrID4gTUFYX0NIQU5ORUxfTlVNQkVSKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsgLyogbm8gZ29vZCBjaGFucyAqLworCisjaWZkZWYgRU5BQkxFX0RPVDExRAorICAgICAgICB9d2hpbGUoIWNoYW5uZWxfbWFwW2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXSk7CisjZWxzZQorICAgICAgICB9d2hpbGUoIWllZWUtPmNoYW5uZWxfbWFwW2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXSk7CisjZW5kaWYKKworLy8gICAgICBwcmludGsoImN1cnJlbnRfbmV0d29yay5jaGFubmVsOiVkXG4iLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisgICAgICAgIGlmIChpZWVlLT5zY2FubmluZyA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50aygiZXJyb3Igb3V0LCBzY2FubmluZyA9IDBcbiIpOworICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICAgIGllZWUtPnNldF9jaGFuKGllZWUtPmRldiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwlpZihjaGFubmVsX21hcFtpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF0gPT0gMSkKKyNlbmRpZgorCQlpZWVlODAyMTFfc2VuZF9wcm9iZV9yZXF1ZXN0cyhpZWVlKTsKKworCXF1ZXVlX2RlbGF5ZWRfd29yayhpZWVlLT53cSwgJmllZWUtPnNvZnRtYWNfc2Nhbl93cSwgSUVFRTgwMjExX1NPRlRNQUNfU0NBTl9USU1FKTsKK291dDoKKwl1cCgmaWVlZS0+c2Nhbl9zZW0pOworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwlpZihJU19ET1QxMURfRU5BQkxFKGllZWUpKQorCQlET1QxMURfU2NhbkNvbXBsZXRlKGllZWUpOworI2VuZGlmCit9CisKKyNlbmRpZgorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQordm9pZCBpZWVlODAyMTFfc29mdG1hY19zY2FuX2NiKHVuc2lnbmVkIGxvbmcgX2RldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICopX2RldjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisJaWVlZTgwMjExX3NvZnRtYWNfc2NhbihpZWVlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7Cit9CisjZW5kaWYKKworCit2b2lkIGllZWU4MDIxMV9iZWFjb25zX3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+YmVhY29uX2xvY2ssZmxhZ3MpOworCisJaWVlZS0+YmVhY29uX3R4aW5nID0gMTsKKwlpZWVlODAyMTFfc2VuZF9iZWFjb24oaWVlZSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5iZWFjb25fbG9jayxmbGFncyk7Cit9CisKK3ZvaWQgaWVlZTgwMjExX2JlYWNvbnNfc3RvcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmJlYWNvbl9sb2NrLGZsYWdzKTsKKworCWllZWUtPmJlYWNvbl90eGluZyA9IDA7CisgCWRlbF90aW1lcl9zeW5jKCZpZWVlLT5iZWFjb25fdGltZXIpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+YmVhY29uX2xvY2ssZmxhZ3MpOworCit9CisKKwordm9pZCBpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWYoaWVlZS0+c3RvcF9zZW5kX2JlYWNvbnMpCisJCWllZWUtPnN0b3Bfc2VuZF9iZWFjb25zKGllZWUtPmRldik7CisJaWYgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfQkVBQ09OUykKKwkJaWVlZTgwMjExX2JlYWNvbnNfc3RvcChpZWVlKTsKK30KKworCit2b2lkIGllZWU4MDIxMV9zdGFydF9zZW5kX2JlYWNvbnMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWYoaWVlZS0+c3RhcnRfc2VuZF9iZWFjb25zKQorCQlpZWVlLT5zdGFydF9zZW5kX2JlYWNvbnMoaWVlZS0+ZGV2KTsKKwlpZihpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0JFQUNPTlMpCisJCWllZWU4MDIxMV9iZWFjb25zX3N0YXJ0KGllZWUpOworfQorCisKK3ZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc3RvcF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworLy8JdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8vaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAxOworCisJZG93bigmaWVlZS0+c2Nhbl9zZW0pOworLy8Jc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCWlmIChpZWVlLT5zY2FubmluZyA9PSAxKXsKKwkJaWVlZS0+c2Nhbm5pbmcgPSAwOworCQkvL2RlbF90aW1lcl9zeW5jKCZpZWVlLT5zY2FuX3RpbWVyKTsKKwkJY2FuY2VsX2RlbGF5ZWRfd29yaygmaWVlZS0+c29mdG1hY19zY2FuX3dxKTsKKwl9CisKKy8vCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKwl1cCgmaWVlZS0+c2Nhbl9zZW0pOworfQorCit2b2lkIGllZWU4MDIxMV9zdG9wX3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWYgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0NBTikKKwkJaWVlZTgwMjExX3NvZnRtYWNfc3RvcF9zY2FuKGllZWUpOworCWVsc2UKKwkJaWVlZS0+c3RvcF9zY2FuKGllZWUtPmRldik7Cit9CisKKy8qIGNhbGxlZCB3aXRoIGllZWUtPmxvY2sgaGVsZCAqLwordm9pZCBpZWVlODAyMTFfc3RhcnRfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJaWYoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSApCisJeworCQlpZihJU19DT1VOVFJZX0lFX1ZBTElEKGllZWUpKQorCQl7CisJCQlSRVNFVF9DSUVfV0FUQ0hET0coaWVlZSk7CisJCX0KKwl9CisjZW5kaWYKKwlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TQ0FOKXsKKwkJaWYgKGllZWUtPnNjYW5uaW5nID09IDApCisJCXsKKwkJCWllZWUtPnNjYW5uaW5nID0gMTsKKwkJCS8vaWVlZTgwMjExX3NvZnRtYWNfc2NhbihpZWVlKTsKKwkJLy8JcXVldWVfd29yayhpZWVlLT53cSwgJmllZWUtPnNvZnRtYWNfc2Nhbl93cSk7CisJCS8vY2FyZSB0aGlzLDEyMDMsMjAwNyxieSBsYXdyZW5jZQorI2lmIDEKKwkJCXF1ZXVlX2RlbGF5ZWRfd29yayhpZWVlLT53cSwgJmllZWUtPnNvZnRtYWNfc2Nhbl93cSwwKTsKKyNlbmRpZgorCQl9CisJfWVsc2UKKwkJaWVlZS0+c3RhcnRfc2NhbihpZWVlLT5kZXYpOworCit9CisKKy8qIGNhbGxlZCB3aXRoIHd4X3NlbSBoZWxkICovCit2b2lkIGllZWU4MDIxMV9zdGFydF9zY2FuX3N5bmNybyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJaWYoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSApCisJeworCQlpZihJU19DT1VOVFJZX0lFX1ZBTElEKGllZWUpKQorCQl7CisJCQlSRVNFVF9DSUVfV0FUQ0hET0coaWVlZSk7CisJCX0KKwl9CisjZW5kaWYKKwlpZWVlLT5zeW5jX3NjYW5faHVycnl1cCA9IDA7CisKKwlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TQ0FOKQorCQlpZWVlODAyMTFfc29mdG1hY19zY2FuX3N5bmNybyhpZWVlKTsKKwllbHNlCisJCWllZWUtPnNjYW5fc3luY3JvKGllZWUtPmRldik7CisKK30KKworaW5saW5lIHN0cnVjdCBza19idWZmICppZWVlODAyMTFfYXV0aGVudGljYXRpb25fcmVxKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uLAorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBpbnQgY2hhbGxlbmdlbGVuKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiAqYXV0aDsKKworCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pICsgY2hhbGxlbmdlbGVuKTsKKworCWlmICghc2tiKSByZXR1cm4gTlVMTDsKKworCWF1dGggPSAoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiAqKQorCQlza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pKTsKKworCWF1dGgtPmhlYWRlci5mcmFtZV9jdGwgPSBJRUVFODAyMTFfU1RZUEVfQVVUSDsKKwlpZiAoY2hhbGxlbmdlbGVuKSBhdXRoLT5oZWFkZXIuZnJhbWVfY3RsIHw9IElFRUU4MDIxMV9GQ1RMX1dFUDsKKworCWF1dGgtPmhlYWRlci5kdXJhdGlvbl9pZCA9IDB4MDEzYTsgLy9GSVhNRQorCisJbWVtY3B5KGF1dGgtPmhlYWRlci5hZGRyMSwgYmVhY29uLT5ic3NpZCwgRVRIX0FMRU4pOworCW1lbWNweShhdXRoLT5oZWFkZXIuYWRkcjIsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkoYXV0aC0+aGVhZGVyLmFkZHIzLCBiZWFjb24tPmJzc2lkLCBFVEhfQUxFTik7CisKKwlhdXRoLT5hbGdvcml0aG0gPSBpZWVlLT5vcGVuX3dlcCA/IFdMQU5fQVVUSF9PUEVOIDogV0xBTl9BVVRIX1NIQVJFRF9LRVk7CisKKwlhdXRoLT50cmFuc2FjdGlvbiA9IGNwdV90b19sZTE2KGllZWUtPmFzc29jaWF0ZV9zZXEpOworCWllZWUtPmFzc29jaWF0ZV9zZXErKzsKKworCWF1dGgtPnN0YXR1cyA9IGNwdV90b19sZTE2KFdMQU5fU1RBVFVTX1NVQ0NFU1MpOworCisJcmV0dXJuIHNrYjsKKworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYqIGllZWU4MDIxMV9wcm9iZV9yZXNwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqZGVzdCkKK3sKKwl1OCAqdGFnOworCWludCBiZWFjb25fc2l6ZTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlICpiZWFjb25fYnVmOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGVuY3J5cHQ7CisJaW50IGF0aW1fbGVuLGVycF9sZW47CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKiBjcnlwdDsKKworCWNoYXIgKnNzaWQgPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZDsKKwlpbnQgc3NpZF9sZW4gPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW47CisJaW50IHJhdGVfbGVuID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2xlbisyOworCWludCByYXRlX2V4X2xlbiA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leF9sZW47CisJaW50IHdwYV9pZV9sZW4gPSBpZWVlLT53cGFfaWVfbGVuOworCWlmKHJhdGVfZXhfbGVuID4gMCkgcmF0ZV9leF9sZW4rPTI7CisKKwlpZihpZWVlLT5jdXJyZW50X25ldHdvcmsuY2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKQorCQlhdGltX2xlbiA9IDQ7CisJZWxzZQorCQlhdGltX2xlbiA9IDA7CisKKwlpZihpZWVlODAyMTFfaXNfNTRnKGllZWUtPmN1cnJlbnRfbmV0d29yaykpCisJCWVycF9sZW4gPSAzOworCWVsc2UKKwkJZXJwX2xlbiA9IDA7CisKKwliZWFjb25fc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlKSsKKwkJc3NpZF9sZW4KKwkJKzMgLy9jaGFubmVsCisJCStyYXRlX2xlbgorCQkrcmF0ZV9leF9sZW4KKwkJK2F0aW1fbGVuCisJCSt3cGFfaWVfbGVuCisJCStlcnBfbGVuOworCisJc2tiID0gZGV2X2FsbG9jX3NrYihiZWFjb25fc2l6ZSk7CisKKwlpZiAoIXNrYikKKwkJcmV0dXJuIE5VTEw7CisKKwliZWFjb25fYnVmID0gKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UqKSBza2JfcHV0KHNrYiwgYmVhY29uX3NpemUpOworCisJbWVtY3B5IChiZWFjb25fYnVmLT5oZWFkZXIuYWRkcjEsIGRlc3QsRVRIX0FMRU4pOworCW1lbWNweSAoYmVhY29uX2J1Zi0+aGVhZGVyLmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5IChiZWFjb25fYnVmLT5oZWFkZXIuYWRkcjMsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pOworCisJYmVhY29uX2J1Zi0+aGVhZGVyLmR1cmF0aW9uX2lkID0gMDsgLy9GSVhNRQorCWJlYWNvbl9idWYtPmJlYWNvbl9pbnRlcnZhbCA9CisJCWNwdV90b19sZTE2KGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwpOworCWJlYWNvbl9idWYtPmNhcGFiaWxpdHkgPQorCQljcHVfdG9fbGUxNihpZWVlLT5jdXJyZW50X25ldHdvcmsuY2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKTsKKworCWlmKGllZWUtPnNob3J0X3Nsb3QgJiYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1QpKQorCQljcHVfdG9fbGUxNigoYmVhY29uX2J1Zi0+Y2FwYWJpbGl0eSB8PSBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfU0xPVCkpOworCisJY3J5cHQgPSBpZWVlLT5jcnlwdFtpZWVlLT50eF9rZXlpZHhdOworCisJZW5jcnlwdCA9IGllZWUtPmhvc3RfZW5jcnlwdCAmJiBjcnlwdCAmJiBjcnlwdC0+b3BzICYmCisJCSgoMCA9PSBzdHJjbXAoY3J5cHQtPm9wcy0+bmFtZSwgIldFUCIpKSB8fCB3cGFfaWVfbGVuKTsKKworCWlmIChlbmNyeXB0KQorCQliZWFjb25fYnVmLT5jYXBhYmlsaXR5IHw9IGNwdV90b19sZTE2KFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKTsKKworCisJYmVhY29uX2J1Zi0+aGVhZGVyLmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQKTsKKworCWJlYWNvbl9idWYtPmluZm9fZWxlbWVudC5pZCA9IE1GSUVfVFlQRV9TU0lEOworCWJlYWNvbl9idWYtPmluZm9fZWxlbWVudC5sZW4gPSBzc2lkX2xlbjsKKworCXRhZyA9ICh1OCopIGJlYWNvbl9idWYtPmluZm9fZWxlbWVudC5kYXRhOworCisJbWVtY3B5KHRhZywgc3NpZCwgc3NpZF9sZW4pOworCisJdGFnICs9IHNzaWRfbGVuOworCisJKih0YWcrKykgPSBNRklFX1RZUEVfUkFURVM7CisJKih0YWcrKykgPSByYXRlX2xlbi0yOworCW1lbWNweSh0YWcsaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzLHJhdGVfbGVuLTIpOworCXRhZys9cmF0ZV9sZW4tMjsKKworCSoodGFnKyspID0gTUZJRV9UWVBFX0RTX1NFVDsKKwkqKHRhZysrKSA9IDE7CisJKih0YWcrKykgPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbDsKKworCWlmKGF0aW1fbGVuKXsKKwkJKih0YWcrKykgPSBNRklFX1RZUEVfSUJTU19TRVQ7CisJCSoodGFnKyspID0gMjsKKwkJKigodTE2KikodGFnKSkgPSBjcHVfdG9fbGUxNihpZWVlLT5jdXJyZW50X25ldHdvcmsuYXRpbV93aW5kb3cpOworCQl0YWcrPTI7CisJfQorCisJaWYoZXJwX2xlbil7CisJCSoodGFnKyspID0gTUZJRV9UWVBFX0VSUDsKKwkJKih0YWcrKykgPSAxOworCQkqKHRhZysrKSA9IDA7CisJfQorCisJaWYocmF0ZV9leF9sZW4peworCQkqKHRhZysrKSA9IE1GSUVfVFlQRV9SQVRFU19FWDsKKwkJKih0YWcrKykgPSByYXRlX2V4X2xlbi0yOworCQltZW1jcHkodGFnLGllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leCxyYXRlX2V4X2xlbi0yKTsKKwkJdGFnKz1yYXRlX2V4X2xlbi0yOworCX0KKworCWlmICh3cGFfaWVfbGVuKQorCXsKKwkJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykKKwkJey8vYXMgV2luZG93cyB3aWxsIHNldCBwYWlyd2lzZSBrZXkgc2FtZSBhcyB0aGUgZ3JvdXAga2V5IHdoaWNoIGlzIG5vdCBhbGxvd2VkIGluIExpbnV4LCBzbyBzZXQgdGhpcyBmb3IgSU9UIGlzc3VlLiBXQiAyMDA4LjA3LjA3CisJCQltZW1jcHkoJmllZWUtPndwYV9pZVsxNF0sICZpZWVlLT53cGFfaWVbOF0sIDQpOworCQl9CisKKwkJbWVtY3B5KHRhZywgaWVlZS0+d3BhX2llLCBpZWVlLT53cGFfaWVfbGVuKTsKKwl9CisKKwlza2ItPmRldiA9IGllZWUtPmRldjsKKwlyZXR1cm4gc2tiOworfQorI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KK3N0cnVjdCBza19idWZmKiBpZWVlODAyMTFfZXh0X3Byb2JlX3Jlc3BfYnlfbmV0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqZGVzdCwgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXQpCit7CisJdTggKnRhZzsKKwlpbnQgYmVhY29uX3NpemU7CisJc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSAqYmVhY29uX2J1ZjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBlbmNyeXB0OworCWludCBhdGltX2xlbixlcnBfbGVuOworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSogY3J5cHQ7CisJdTggYnJvYWRjYXN0X2FkZHJbXSA9IHsweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZn07CisJaW50IHdwYV9pZV9sZW4gPSBpZWVlLT53cGFfaWVfbGVuOworCWNoYXIgKnNzaWQgPSBuZXQtPnNzaWQ7CisJaW50IHNzaWRfbGVuID0gbmV0LT5zc2lkX2xlbjsKKworCWludCByYXRlX2xlbiA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19sZW4rMjsKKwlpbnQgcmF0ZV9leF9sZW4gPSBpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhfbGVuOworCWlmKHJhdGVfZXhfbGVuID4gMCkgcmF0ZV9leF9sZW4rPTI7CisKKwlpZiggaWVlZS0+bWVzaFNjYW5Nb2RlJjQpCisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID0gaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9leHRfc3RvcF9zY2FuX3dxX3NldF9jaGFubmVsKGllZWUpOworCWlmKCBpZWVlLT5tZXNoU2Nhbk1vZGUmNikKKwl7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwkJcXVldWVfd29yayhpZWVlLT53cSwgJmllZWUtPmV4dF9zdG9wX3NjYW5fd3EpOworI2Vsc2UKKwkJc2NoZWR1bGVfdGFzaygmaWVlZS0+ZXh0X3N0b3Bfc2Nhbl93cSk7CisjZW5kaWYKKwl9CisJaWYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfSUJTUykgLy8gdXNlIGN1cnJlbnRfbmV0d29yayBoZXJlCisJCWF0aW1fbGVuID0gNDsKKwllbHNlCisJCWF0aW1fbGVuID0gMDsKKworCWlmKGllZWU4MDIxMV9pc181NGcoKm5ldCkpCisJCWVycF9sZW4gPSAzOworCWVsc2UKKwkJZXJwX2xlbiA9IDA7CisKKwliZWFjb25fc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlKSsKKwkJc3NpZF9sZW4KKwkJKzMgLy9jaGFubmVsCisJCStyYXRlX2xlbgorCQkrcmF0ZV9leF9sZW4KKwkJK2F0aW1fbGVuCisJCStlcnBfbGVuOworLy9iCisJc2tiID0gZGV2X2FsbG9jX3NrYihiZWFjb25fc2l6ZSsxOTYpOworCisJaWYgKCFza2IpCisgCQlyZXR1cm4gTlVMTDsKKworCWJlYWNvbl9idWYgPSAoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSopIHNrYl9wdXQoc2tiLCBiZWFjb25fc2l6ZSk7CisKKwltZW1jcHkgKGJlYWNvbl9idWYtPmhlYWRlci5hZGRyMSwgZGVzdCxFVEhfQUxFTik7CisJbWVtY3B5IChiZWFjb25fYnVmLT5oZWFkZXIuYWRkcjIsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkgKGJlYWNvbl9idWYtPmhlYWRlci5hZGRyMywgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7CisKKwliZWFjb25fYnVmLT5oZWFkZXIuZHVyYXRpb25faWQgPSAwOyAvL0ZJWE1FCisKKwliZWFjb25fYnVmLT5iZWFjb25faW50ZXJ2YWwgPQorCQljcHVfdG9fbGUxNihpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsKTsgIC8vIHVzZSBjdXJyZW50X25ldHdvcmsgaGVyZQorCWJlYWNvbl9idWYtPmNhcGFiaWxpdHkgPQorCQljcHVfdG9fbGUxNihpZWVlLT5jdXJyZW50X25ldHdvcmsuY2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKTsKKworCWlmKGllZWUtPnNob3J0X3Nsb3QgJiYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1QpKQorCQljcHVfdG9fbGUxNigoYmVhY29uX2J1Zi0+Y2FwYWJpbGl0eSB8PSBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfU0xPVCkpOworCisJY3J5cHQgPSBpZWVlLT5jcnlwdFtpZWVlLT50eF9rZXlpZHhdOworCisJZW5jcnlwdCA9IGllZWUtPmhvc3RfZW5jcnlwdCAmJiBjcnlwdCAmJiBjcnlwdC0+b3BzICYmCisJCSgoMCA9PSBzdHJjbXAoY3J5cHQtPm9wcy0+bmFtZSwgIldFUCIpKXx8d3BhX2llX2xlbik7CisKKwlpZiAoZW5jcnlwdCkKKwkJYmVhY29uX2J1Zi0+Y2FwYWJpbGl0eSB8PSBjcHVfdG9fbGUxNihXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSk7CisKKworCWJlYWNvbl9idWYtPmhlYWRlci5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUCk7CisKKwliZWFjb25fYnVmLT5pbmZvX2VsZW1lbnQuaWQgPSBNRklFX1RZUEVfU1NJRDsKKwliZWFjb25fYnVmLT5pbmZvX2VsZW1lbnQubGVuID0gc3NpZF9sZW47CisKKwl0YWcgPSAodTgqKSBiZWFjb25fYnVmLT5pbmZvX2VsZW1lbnQuZGF0YTsKKworCS8vIGJyb2NhZCBjYXN0IC8gcHJvYmUgcnNwCisJaWYobWVtY21wKGRlc3QsIGJyb2FkY2FzdF9hZGRyLCBFVEhfQUxFTiApKQorCQltZW1jcHkodGFnLCBzc2lkLCBzc2lkX2xlbik7CisJZWxzZQorCQlzc2lkX2xlbj0wOworCisJdGFnICs9IHNzaWRfbGVuOworCisvL2dldF9ic3NyYXRlX3NldChwcml2LCBfU1VQUE9SVEVEUkFURVNfSUVfLCAmcGJzc3JhdGUsICZic3NyYXRlX2xlbik7CisvL3BidWYgPSBzZXRfaWUocGJ1ZiwgX1NVUFBPUlRFRFJBVEVTX0lFXywgYnNzcmF0ZV9sZW4sIHBic3NyYXRlLCAmZnJsZW4pOworCisJKih0YWcrKykgPSBNRklFX1RZUEVfUkFURVM7CisJKih0YWcrKykgPSByYXRlX2xlbi0yOworCW1lbWNweSh0YWcsaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzLHJhdGVfbGVuLTIpOworCXRhZys9cmF0ZV9sZW4tMjsKKworCSoodGFnKyspID0gTUZJRV9UWVBFX0RTX1NFVDsKKwkqKHRhZysrKSA9IDE7CisJKih0YWcrKykgPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbDsgIC8vIHVzZSBjdXJyZW50X25ldHdvcmsgaGVyZQorCisKKwlpZihhdGltX2xlbil7CisJCSoodGFnKyspID0gTUZJRV9UWVBFX0lCU1NfU0VUOworCQkqKHRhZysrKSA9IDI7CisJCSooKHUxNiopKHRhZykpID0gY3B1X3RvX2xlMTYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmF0aW1fd2luZG93KTsgLy8gdXNlIGN1cnJlbnRfbmV0d29yayBoZXJlCisJCXRhZys9MjsKKwl9CisKKwlpZihlcnBfbGVuKXsKKwkJKih0YWcrKykgPSBNRklFX1RZUEVfRVJQOworCQkqKHRhZysrKSA9IDE7CisJCSoodGFnKyspID0gMDsKKwl9CisKKwlpZihyYXRlX2V4X2xlbil7CisJCSoodGFnKyspID0gTUZJRV9UWVBFX1JBVEVTX0VYOworCQkqKHRhZysrKSA9IHJhdGVfZXhfbGVuLTI7CisJCW1lbWNweSh0YWcsaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4LHJhdGVfZXhfbGVuLTIpOworCQl0YWcrPXJhdGVfZXhfbGVuLTI7CisJfQorCWlmICh3cGFfaWVfbGVuKQorCQltZW1jcHkodGFnLCBpZWVlLT53cGFfaWUsIGllZWUtPndwYV9pZV9sZW4pOworCisJc2tiLT5kZXYgPSBpZWVlLT5kZXY7CisJcmV0dXJuIHNrYjsKK30KKyNlbmRpZiAvLyBfUlRMODE4N19FWFRfUEFUQ0hfCisKK3N0cnVjdCBza19idWZmKiBpZWVlODAyMTFfYXNzb2NfcmVzcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKmRlc3QpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1OCogdGFnOworCisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKiBjcnlwdDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lICphc3NvYzsKKwlzaG9ydCBlbmNyeXB0OworCisJdW5zaWduZWQgaW50IHJhdGVfbGVuID0gaWVlZTgwMjExX01GSUVfcmF0ZV9sZW4oaWVlZSk7CisJaW50IGxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lKSArIHJhdGVfbGVuOworCisJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4pOworCisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCisJYXNzb2MgPSAoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSAqKQorCQlza2JfcHV0KHNrYixzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSkpOworCisJYXNzb2MtPmhlYWRlci5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVTUCk7CisJbWVtY3B5KGFzc29jLT5oZWFkZXIuYWRkcjEsIGRlc3QsRVRIX0FMRU4pOworCW1lbWNweShhc3NvYy0+aGVhZGVyLmFkZHIzLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGFzc29jLT5oZWFkZXIuYWRkcjIsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwlhc3NvYy0+Y2FwYWJpbGl0eSA9IGNwdV90b19sZTE2KGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIgPworCQlXTEFOX0NBUEFCSUxJVFlfQlNTIDogV0xBTl9DQVBBQklMSVRZX0lCU1MpOworCisKKwlpZihpZWVlLT5zaG9ydF9zbG90KQorCQlhc3NvYy0+Y2FwYWJpbGl0eSB8PSBjcHVfdG9fbGUxNihXTEFOX0NBUEFCSUxJVFlfU0hPUlRfU0xPVCk7CisKKwlpZiAoaWVlZS0+aG9zdF9lbmNyeXB0KQorCQljcnlwdCA9IGllZWUtPmNyeXB0W2llZWUtPnR4X2tleWlkeF07CisJZWxzZSBjcnlwdCA9IE5VTEw7CisKKwllbmNyeXB0ID0gKCBjcnlwdCAmJiBjcnlwdC0+b3BzKTsKKworCWlmIChlbmNyeXB0KQorCQlhc3NvYy0+Y2FwYWJpbGl0eSB8PSBjcHVfdG9fbGUxNihXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSk7CisKKwlhc3NvYy0+c3RhdHVzID0gMDsKKwlhc3NvYy0+YWlkID0gY3B1X3RvX2xlMTYoaWVlZS0+YXNzb2NfaWQpOworCWlmIChpZWVlLT5hc3NvY19pZCA9PSAweDIwMDcpIGllZWUtPmFzc29jX2lkPTA7CisJZWxzZSBpZWVlLT5hc3NvY19pZCsrOworCisJdGFnID0gKHU4Kikgc2tiX3B1dChza2IsIHJhdGVfbGVuKTsKKworCWllZWU4MDIxMV9NRklFX0JyYXRlKGllZWUsICZ0YWcpOworCWllZWU4MDIxMV9NRklFX0dyYXRlKGllZWUsICZ0YWcpOworCisJcmV0dXJuIHNrYjsKK30KKworc3RydWN0IHNrX2J1ZmYqIGllZWU4MDIxMV9hdXRoX3Jlc3Aoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsaW50IHN0YXR1cywgdTggKmRlc3QpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uICphdXRoOworCisJc2tiID0gZGV2X2FsbG9jX3NrYihzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbikrMSk7CisKKwlpZiAoIXNrYikKKwkJcmV0dXJuIE5VTEw7CisKKwlza2ItPmxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKTsKKworCWF1dGggPSAoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiAqKXNrYi0+ZGF0YTsKKworCWF1dGgtPnN0YXR1cyA9IGNwdV90b19sZTE2KHN0YXR1cyk7CisJYXV0aC0+dHJhbnNhY3Rpb24gPSBjcHVfdG9fbGUxNigyKTsKKwlhdXRoLT5hbGdvcml0aG0gPSBjcHVfdG9fbGUxNihXTEFOX0FVVEhfT1BFTik7CisKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJaWYoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkKKwkJbWVtY3B5KGF1dGgtPmhlYWRlci5hZGRyMywgZGVzdCwgRVRIX0FMRU4pOworI2Vsc2UKKwltZW1jcHkoYXV0aC0+aGVhZGVyLmFkZHIzLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisjZW5kaWYKKwltZW1jcHkoYXV0aC0+aGVhZGVyLmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGF1dGgtPmhlYWRlci5hZGRyMSwgZGVzdCwgRVRIX0FMRU4pOworCWF1dGgtPmhlYWRlci5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfQVVUSCk7CisJcmV0dXJuIHNrYjsKKworCit9CisKK3N0cnVjdCBza19idWZmKiBpZWVlODAyMTFfbnVsbF9mdW5jKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLHNob3J0IHB3cikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKiBoZHI7CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikpOworCisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKilza2JfcHV0KHNrYixzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpKTsKKworCW1lbWNweShoZHItPmFkZHIxLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKTsKKwltZW1jcHkoaGRyLT5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweShoZHItPmFkZHIzLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKTsKKworCWhkci0+ZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX0RBVEEgfAorCQlJRUVFODAyMTFfU1RZUEVfTlVMTEZVTkMgfCBJRUVFODAyMTFfRkNUTF9UT0RTIHwKKwkJKHB3ciA/IElFRUU4MDIxMV9GQ1RMX1BNOjApKTsKKworCXJldHVybiBza2I7CisKKworfQorCisKK3ZvaWQgaWVlZTgwMjExX3Jlc3BfdG9fYXNzb2NfcnEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4KiBkZXN0KQoreworCXN0cnVjdCBza19idWZmICpidWYgPSBpZWVlODAyMTFfYXNzb2NfcmVzcChpZWVlLCBkZXN0KTsKKworCWlmIChidWYpeworCQlzb2Z0bWFjX21nbXRfeG1pdChidWYsIGllZWUpOworCQlkZXZfa2ZyZWVfc2tiX2FueShidWYpOy8vZWRpdCBieSB0aG9tYXMKKwl9Cit9CisKKwordm9pZCBpZWVlODAyMTFfcmVzcF90b19hdXRoKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBpbnQgcywgdTgqIGRlc3QpCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IGllZWU4MDIxMV9hdXRoX3Jlc3AoaWVlZSwgcywgZGVzdCk7CisKKwlpZiAoYnVmKXsKKwkJc29mdG1hY19tZ210X3htaXQoYnVmLCBpZWVlKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoYnVmKTsvL2VkaXQgYnkgdGhvbWFzCisJfQorfQorCisKK3ZvaWQgaWVlZTgwMjExX3Jlc3BfdG9fcHJvYmUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpkZXN0KQoreworCisJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IGllZWU4MDIxMV9wcm9iZV9yZXNwKGllZWUsIGRlc3QpOworCisJaWYgKGJ1ZikgeworCQlzb2Z0bWFjX21nbXRfeG1pdChidWYsIGllZWUpOworCQlkZXZfa2ZyZWVfc2tiX2FueShidWYpOy8vZWRpdCBieSB0aG9tYXMKKwl9Cit9CisKKworaW5saW5lIHN0cnVjdCBza19idWZmICppZWVlODAyMTFfYXNzb2NpYXRpb25fcmVxKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uLHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJLy91bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lICpoZHI7CisJdTggKnRhZzsKKwkvL3Nob3J0IGluZm9fYWRkciA9IDA7CisJLy9pbnQgaTsKKwkvL3UxNiBzdWl0ZV9jb3VudCA9IDA7CisJLy91OCBzdWl0X3NlbGVjdCA9IDA7CisJdW5zaWduZWQgaW50IHdwYV9sZW4gPSBiZWFjb24tPndwYV9pZV9sZW47CisJLy9zdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWVlZS0+ZGV2OworCS8vdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCS8vdTggKmJ1ZmY7CisJLy91OCAqcDsKKyNpZiAxCisJLy8gZm9yIHRlc3RpbmcgcHVycG9zZQorCXVuc2lnbmVkIGludCByc25fbGVuID0gYmVhY29uLT5yc25faWVfbGVuOworI2Vsc2UKKwl1bnNpZ25lZCBpbnQgcnNuX2xlbiA9IGJlYWNvbi0+cnNuX2llX2xlbiAtIDQ7CisjZW5kaWYKKwl1bnNpZ25lZCBpbnQgcmF0ZV9sZW4gPSBpZWVlODAyMTFfTUZJRV9yYXRlX2xlbihpZWVlKTsKKwl1bnNpZ25lZCBpbnQgd21tX2luZm9fbGVuID0gYmVhY29uLT5Rb1NfRW5hYmxlPzk6MDsKKyNpZmRlZiBUSE9NQVNfVFVSQk8KKwl1bnNpZ25lZCBpbnQgdHVyYm9faW5mb19sZW4gPSBiZWFjb24tPlR1cmJvX0VuYWJsZT85OjA7CisjZW5kaWYKKworCXU4ICBlbmNyeV9wcm90byA9IGllZWUtPndwYXhfdHlwZV9ub3RpZnkgJiAweGZmOworCS8vdTggIHBhaXJ3aXNlX3R5cGUgPSAoaWVlZS0+d3BheF90eXBlX25vdGlmeSA+PiA4KSAmIDB4ZmY7CisJLy91OCAgYXV0aGVuX3R5cGUgPSAoaWVlZS0+d3BheF90eXBlX25vdGlmeSA+PiAxNikgJiAweGZmOworCisJaW50IGxlbiA9IDA7CisKKwkvL1swXSBOb3RpZnkgdHlwZSBvZiBlbmNyeXB0aW9uOiBXUEEvV1BBMgorCS8vWzFdIHBhaXIgd2lzZSB0eXBlCisJLy9bMl0gYXV0aGVuIHR5cGUKKwlpZihpZWVlLT53cGF4X3R5cGVfc2V0KSB7CisJCWlmIChJRUVFX1BST1RPX1dQQSA9PSBlbmNyeV9wcm90bykgeworCQkJcnNuX2xlbiA9IDA7CisJCX0gZWxzZSBpZiAoSUVFRV9QUk9UT19SU04gPT0gZW5jcnlfcHJvdG8pIHsKKwkJCXdwYV9sZW4gPSAwOworCQl9CisJfQorI2lmZGVmIFRIT01BU19UVVJCTworCWxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3JlcXVlc3RfZnJhbWUpKworCQkrIGJlYWNvbi0+c3NpZF9sZW4vL2Vzc2lkIHRhZ2dlZCB2YWwKKwkJKyByYXRlX2xlbi8vcmF0ZXMgdGFnZ2VkIHZhbAorCQkrIHdwYV9sZW4KKwkJKyByc25fbGVuCisJCSsgd21tX2luZm9fbGVuCisJCSsgdHVyYm9faW5mb19sZW47CisjZWxzZQorCWxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3JlcXVlc3RfZnJhbWUpKworCQkrIGJlYWNvbi0+c3NpZF9sZW4vL2Vzc2lkIHRhZ2dlZCB2YWwKKwkJKyByYXRlX2xlbi8vcmF0ZXMgdGFnZ2VkIHZhbAorCQkrIHdwYV9sZW4KKwkJKyByc25fbGVuCisJCSsgd21tX2luZm9fbGVuOworI2VuZGlmCisKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJaWYoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkKKwkJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4rMjU2KTsgLy8gc3RhbmxleQorCWVsc2UKKyNlbmRpZgorCXNrYiA9IGRldl9hbGxvY19za2IobGVuKTsKKworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3JlcXVlc3RfZnJhbWUgKikKKwkJc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3JlcXVlc3RfZnJhbWUpKTsKKworCisJaGRyLT5oZWFkZXIuZnJhbWVfY3RsID0gSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFUTsKKwloZHItPmhlYWRlci5kdXJhdGlvbl9pZD0gMzc7IC8vRklYTUUKKwltZW1jcHkoaGRyLT5oZWFkZXIuYWRkcjEsIGJlYWNvbi0+YnNzaWQsIEVUSF9BTEVOKTsKKwltZW1jcHkoaGRyLT5oZWFkZXIuYWRkcjIsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkoaGRyLT5oZWFkZXIuYWRkcjMsIGJlYWNvbi0+YnNzaWQsIEVUSF9BTEVOKTsKKwltZW1jcHkoaWVlZS0+YXBfbWFjX2FkZHIsIGJlYWNvbi0+YnNzaWQsIEVUSF9BTEVOKTsvL2ZvciBIVyBzZWN1cml0eSwgSm9obgorCisJaGRyLT5jYXBhYmlsaXR5ID0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX0JTUyk7CisJaWYgKGJlYWNvbi0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZICkKKwkJaGRyLT5jYXBhYmlsaXR5IHw9IGNwdV90b19sZTE2KFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKTsKKwlpZiAoYmVhY29uLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1BSRUFNQkxFKQorCQloZHItPmNhcGFiaWxpdHkgfD0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX1NIT1JUX1BSRUFNQkxFKTsKKworCWlmKGllZWUtPnNob3J0X3Nsb3QpCisJCWhkci0+Y2FwYWJpbGl0eSB8PSBjcHVfdG9fbGUxNihXTEFOX0NBUEFCSUxJVFlfU0hPUlRfU0xPVCk7CisKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJaWYoKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpICYmIGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfYXNzb2NpYXRpb25fcmVxXzEpCisJCWllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfYXNzb2NpYXRpb25fcmVxXzEoaGRyKTsKKyNlbmRpZgorCisJaGRyLT5saXN0ZW5faW50ZXJ2YWwgPSAweGE7IC8vRklYTUUKKworCWhkci0+aW5mb19lbGVtZW50LmlkID0gTUZJRV9UWVBFX1NTSUQ7CisKKwloZHItPmluZm9fZWxlbWVudC5sZW4gPSBiZWFjb24tPnNzaWRfbGVuOworCXRhZyA9IHNrYl9wdXQoc2tiLCBiZWFjb24tPnNzaWRfbGVuKTsKKwltZW1jcHkodGFnLCBiZWFjb24tPnNzaWQsIGJlYWNvbi0+c3NpZF9sZW4pOworCisJdGFnID0gc2tiX3B1dChza2IsIHJhdGVfbGVuKTsKKworCWllZWU4MDIxMV9NRklFX0JyYXRlKGllZWUsICZ0YWcpOworCWllZWU4MDIxMV9NRklFX0dyYXRlKGllZWUsICZ0YWcpOworCisJLy9hZGQgcnNuPT0wIGNvbmRpdGlvbiBmb3IgYXAncyBtaXggc2VjdXJpdHkgbW9kZSh3cGErd3BhMiksIGpvaG4yMDA3LjguOQorCS8vY2hvb3NlIEFFUyBlbmNyeXB0aW9uIGFzIGRlZmF1bHQgYWxnb3JpdGhtIHdoaWxlIHVzaW5nIG1peGVkIG1vZGUKKyNpZiAwCisJaWYocnNuX2xlbiA9PSAwKXsKKworCQl0YWcgPSBza2JfcHV0KHNrYix3cGFfbGVuKTsKKworCQlpZih3cGFfbGVuKSB7CisKKworCQkgIC8ve2FkZCBieSBkYXZpZC4gMjAwNi44LjMxCisJCSAgLy9maXggbGlua3N5cyBjb21wYXRpYmlsaXR5IGJ1ZworCQkgIC8vfQorCQkgIGlmKHdwYV9sZW4gPiAyNCkgey8vMjIrMiwgbWVhbiBpbmNsdWRlIHRoZSBjYXBhYmlsaXR5CisJCQliZWFjb24tPndwYV9pZVt3cGFfbGVuIC0gMl0gPSAwOworCQkgIH0KKwkJLy9tdWx0aWNhc3QgY2lwaGVyIE9VSQorICAgICAgICAgICAgICAgICAgaWYoICBiZWFjb24tPndwYV9pZVsxMV09PTB4MiAgICAgICl7IC8vMHgwMDUwZjIwMiBpcyB0aGUgb3VpIG9mIHRraXAKKyAgICAgICAgICAgICAgICAgIGllZWUtPmJyb2FkY2FzdF9rZXlfdHlwZSA9IEtFWV9UWVBFX1RLSVA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZSBpZiggIGJlYWNvbi0+d3BhX2llWzExXT09MHg0ICAgICAgKXsvLzB4MDA1MGYyMDQgaXMgdGhlIG91aSBvZiBjY21wCisgICAgICAgICAgICAgICAgICBpZWVlLT5icm9hZGNhc3Rfa2V5X3R5cGUgPSBLRVlfVFlQRV9DQ01QOworICAgICAgICAgICAgICAgIH0KKyAJCS8vdW5pY2FzdCBjaXBoZXIgT1VJCisJCSAgaWYoCWJlYWNvbi0+d3BhX2llWzE0XT09MAorCQkJJiYgYmVhY29uLT53cGFfaWVbMTVdPT0weDUwCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBiZWFjb24tPndwYV9pZVsxNl09PTB4ZjIKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGJlYWNvbi0+d3BhX2llWzE3XT09MHgyICAJKXsgLy8weDAwNTBmMjAyIGlzIHRoZSBvdWkgb2YgdGtpcAorICAgICAgICAgICAgICAgICAgaWVlZS0+cGFpcndpc2Vfa2V5X3R5cGUgPSBLRVlfVFlQRV9US0lQOworCQl9CisKKyAgICAgICAgICAgICAgICAgIGVsc2UgaWYoICAgYmVhY29uLT53cGFfaWVbMTRdPT0wCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBiZWFjb24tPndwYV9pZVsxNV09PTB4NTAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGJlYWNvbi0+d3BhX2llWzE2XT09MHhmMgorICAgICAgICAgICAgICAgICAgICAgICAgJiYgYmVhY29uLT53cGFfaWVbMTddPT0weDQgICAgICApey8vMHgwMDUwZjIwNCBpcyB0aGUgb3VpIG9mIGNjbXAKKyAgICAgICAgICAgICAgICAgIGllZWUtPnBhaXJ3aXNlX2tleV90eXBlID0gS0VZX1RZUEVfQ0NNUDsKKwkJfQorCQkvL2luZGljYXRlIHRoZSB3cGFfaWUgY29udGVudCB0byBXUEFfU1VQUExJQ0FOVAorCQlidWZmID0ga21hbGxvYyhJV19DVVNUT01fTUFYLCBHRlBfQVRPTUlDKTsKKwkJbWVtc2V0KGJ1ZmYsIDAsIElXX0NVU1RPTV9NQVgpOworCQlwPWJ1ZmY7CisJCXAgKz0gc3ByaW50ZihwLCAiQVNTT0NJTkZPKFJlcUlFcz0iKTsKKwkJZm9yKGk9MDtpPHdwYV9sZW47aSsrKXsKKwkJCXAgKz0gc3ByaW50ZihwLCAiJTAyeCIsIGJlYWNvbi0+d3BhX2llW2ldKTsKKwkJfQorCQlwICs9IHNwcmludGYocCwgIikiKTsKKwkJbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkgKTsKKwkJd3JxdS5kYXRhLmxlbmd0aCA9IHAgLSBidWZmOworCisJCXdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgYnVmZik7CisJCSAgbWVtY3B5KHRhZyxiZWFjb24tPndwYV9pZSx3cGFfbGVuKTsKKwkJfQorCisJfQorCisJaWYocnNuX2xlbiA+IDIyKSB7CisKKwkgIAkJCQkJaWYoICAgICBiZWFjb24tPnJzbl9pZVs0XT09MHgwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYWNvbi0+cnNuX2llWzVdPT0weGYgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVhY29uLT5yc25faWVbNl09PTB4YWMpeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChiZWFjb24tPnJzbl9pZVs3XSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZWVlLT5icm9hZGNhc3Rfa2V5X3R5cGUgPSBLRVlfVFlQRV9XRVA0MDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWVlZS0+YnJvYWRjYXN0X2tleV90eXBlID0gS0VZX1RZUEVfVEtJUDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMHg0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWVlZS0+YnJvYWRjYXN0X2tleV90eXBlID0gS0VZX1RZUEVfQ0NNUDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMHg1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWVlZS0+YnJvYWRjYXN0X2tleV90eXBlID0gS0VZX1RZUEVfV0VQMTA0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiZmF1bHQgc3VpdGUgdHlwZSBpbiBSU04gYnJvYWRjYXN0IGtleVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiggICAgIGJlYWNvbi0+cnNuX2llWzEwXT09MHgwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYWNvbi0+cnNuX2llWzExXT09MHhmICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYWNvbi0+cnNuX2llWzEyXT09MHhhYyl7CisJCQkJaWYoYmVhY29uLT5yc25faWVbOF09PTEpey8vbm90IG1peGVkIG1vZGUKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChiZWFjb24tPnJzbl9pZVsxM10peworICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MjoKKyAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSA9IEtFWV9UWVBFX1RLSVA7CisgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGNhc2UgMHg0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGllZWUtPnBhaXJ3aXNlX2tleV90eXBlID0gS0VZX1RZUEVfQ0NNUDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlicmVhazsKKyAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoImZhdWx0IHN1aXRlIHR5cGUgaW4gUlNOIHBhaXJ3aXNlIGtleVxuIik7CisgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAl9CisJCQkJfQorCQkJCWVsc2UgaWYoYmVhY29uLT5yc25faWVbOF09PTIpey8vbWl4ZWQgbW9kZQorCQkJCQlpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSA9IEtFWV9UWVBFX0NDTVA7CisJCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKworCQl0YWcgPSBza2JfcHV0KHNrYiwyMik7CisJCW1lbWNweSh0YWcsKGJlYWNvbi0+cnNuX2llICsgaW5mb19hZGRyKSw4KTsKKwkJdGFnWzFdID0gIDIwOworCQl0YWcgKz0gODsKKwkJaW5mb19hZGRyICs9IDg7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPndwYXhfc3VpdGxpc3RfbG9jayxmbGFncyk7CisJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJCXRhZ1swXSA9IDE7CisJCQl0YWdbMV0gPSAwOworCQkJdGFnICs9IDI7CisJCQlzdWl0ZV9jb3VudCA9IGJlYWNvbi0+cnNuX2llW2luZm9fYWRkcl0gKyBcCisJCQkJICAgICAgKGJlYWNvbi0+cnNuX2llW2luZm9fYWRkciArIDFdIDw8IDgpOworCQkJaW5mb19hZGRyICs9IDI7CisJCQlpZigxID09IHN1aXRlX2NvdW50KSB7CisJCQkJbWVtY3B5KHRhZywoYmVhY29uLT5yc25faWUgKyBpbmZvX2FkZHIpLDQpOworCQkJCWluZm9fYWRkciArPSA0OworCQkJfSBlbHNlIHsKKwkJCQkvLyBpZiB0aGUgd3BheF90eXBlX25vdGlmeSBoYXMgYmVlbiBzZXQgYnkgdGhlIGFwcGxpY2F0aW9uLAorCQkJCS8vIGp1c3QgdXNlIGl0LCBvdGhlcndpc2UganVzdCB1c2UgdGhlIGRlZmF1bHQgb25lLgorCQkJCWlmKGllZWUtPndwYXhfdHlwZV9zZXQpIHsKKwkJCQkJc3VpdF9zZWxlY3QgPSAoKDAgPT0gaSkgPyBwYWlyd2lzZV90eXBlOmF1dGhlbl90eXBlKSYweDBmIDsKKwkJCQkJbWVtY3B5KHRhZyxyc25fYXV0aGVuX2NpcGhlcl9zdWl0ZVtzdWl0X3NlbGVjdF0sNCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLy9kZWZhdWx0IHNldCBhcyBjY21wLCBvciBub25lIGF1dGhlbnRpY2F0aW9uCisJCQkJCWlmKGkgPT0gMCkgeworCQkJCQkJbWVtY3B5KHRhZyxyc25fYXV0aGVuX2NpcGhlcl9zdWl0ZVs0XSw0KTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCW1lbWNweSh0YWcscnNuX2F1dGhlbl9jaXBoZXJfc3VpdGVbMl0sNCk7CisJCQkJCX0KKworCQkJCX0KKworCQkJCWluZm9fYWRkciArPSAoc3VpdGVfY291bnQgKiA0KTsKKwkJCX0KKwkJCXRhZyArPSA0OworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPndwYXhfc3VpdGxpc3RfbG9jayxmbGFncyk7CisKKwkJdGFnWzBdID0gMDsKKwkJdGFnWzFdID0gYmVhY29uLT5yc25faWVbaW5mb19hZGRyKzFdOworCisJfSBlbHNlIHsKKwkJdGFnID0gc2tiX3B1dChza2IscnNuX2xlbik7CisJCWlmKHJzbl9sZW4pIHsKKworCisJCQlpZiggCWJlYWNvbi0+cnNuX2llWzRdPT0weDAgJiYKKwkJCQliZWFjb24tPnJzbl9pZVs1XT09MHhmICYmCisJCQkJYmVhY29uLT5yc25faWVbNl09PTB4YWMpeworCQkJCXN3aXRjaChiZWFjb24tPnJzbl9pZVs3XSl7CisJCQkJCWNhc2UgMHgxOgorCQkJCQkJaWVlZS0+YnJvYWRjYXN0X2tleV90eXBlID0gS0VZX1RZUEVfV0VQNDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJCQkJY2FzZSAweDI6CisJCQkJCQlpZWVlLT5icm9hZGNhc3Rfa2V5X3R5cGUgPSBLRVlfVFlQRV9US0lQOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMHg0OgorICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZWVlLT5icm9hZGNhc3Rfa2V5X3R5cGUgPSBLRVlfVFlQRV9DQ01QOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweDU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZWVlLT5icm9hZGNhc3Rfa2V5X3R5cGUgPSBLRVlfVFlQRV9XRVAxMDQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCXByaW50aygiZmF1bHQgc3VpdGUgdHlwZSBpbiBSU04gYnJvYWRjYXN0IGtleVxuIik7CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggICAgIGJlYWNvbi0+cnNuX2llWzEwXT09MHgwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYWNvbi0+cnNuX2llWzExXT09MHhmICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYWNvbi0+cnNuX2llWzEyXT09MHhhYyl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJlYWNvbi0+cnNuX2llWzhdPT0xKXsvL25vdCBtaXhlZCBtb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGJlYWNvbi0+cnNuX2llWzEzXSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWVlZS0+cGFpcndpc2Vfa2V5X3R5cGUgPSBLRVlfVFlQRV9US0lQOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMHg0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSA9IEtFWV9UWVBFX0NDTVA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJmYXVsdCBzdWl0ZSB0eXBlIGluIFJTTiBwYWlyd2lzZSBrZXlcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCX0KKworCQkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihiZWFjb24tPnJzbl9pZVs4XT09Mil7Ly9taXhlZCBtb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWVlZS0+cGFpcndpc2Vfa2V5X3R5cGUgPSBLRVlfVFlQRV9DQ01QOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworCQkJYmVhY29uLT5yc25faWVbcnNuX2xlbiAtIDJdID0gMDsKKwkJCW1lbWNweSh0YWcsYmVhY29uLT5yc25faWUscnNuX2xlbik7CisJCX0KKwl9CisjZWxzZQorCXRhZyA9IHNrYl9wdXQoc2tiLGllZWUtPndwYV9pZV9sZW4pOworCW1lbWNweSh0YWcsaWVlZS0+d3BhX2llLGllZWUtPndwYV9pZV9sZW4pOworI2VuZGlmCisJdGFnID0gc2tiX3B1dChza2Isd21tX2luZm9fbGVuKTsKKwlpZih3bW1faW5mb19sZW4pIHsKKwkgIGllZWU4MDIxMV9XTU1fSW5mbyhpZWVlLCAmdGFnKTsKKwl9CisjaWZkZWYgVEhPTUFTX1RVUkJPCisJdGFnID0gc2tiX3B1dChza2IsdHVyYm9faW5mb19sZW4pOworICAgICAgICBpZih0dXJib19pbmZvX2xlbikgeworICAgICAgICAgICAgICAgIGllZWU4MDIxMV9UVVJCT19JbmZvKGllZWUsICZ0YWcpOworICAgICAgICB9CisjZW5kaWYKKworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlpZigoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkgJiYgaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9hc3NvY2lhdGlvbl9yZXFfMikKKwkJaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9hc3NvY2lhdGlvbl9yZXFfMihpZWVlLCBiZWFjb24sIHNrYik7CisjZW5kaWYKKworCXJldHVybiBza2I7Cit9CisKK3ZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCWllZWUtPmFzc29jaWF0ZV9zZXErKzsKKworCS8qIGRvbid0IHNjYW4sIGFuZCBhdm9pZCB0byBoYXZlIHRoZSBSWCBwYXRoIHBvc3NpYmlseQorCSAqIHRyeSBhZ2FpbiB0byBhc3NvY2lhdGUuIEV2ZW4gZG8gbm90IHJlYWN0IHRvIEFVVEggb3IKKwkgKiBBU1NPQyByZXNwb25zZS4gSnVzdCB3YWl0IGZvciB0aGUgcmV0cnkgd3EgdG8gYmUgc2NoZWR1bGVkLgorCSAqIEhlcmUgd2Ugd2lsbCBjaGVjayBpZiB0aGVyZSBhcmUgZ29vZCBuZXRzIHRvIGFzc29jaWF0ZQorCSAqIHdpdGgsIHNvIHdlIHJldHJ5IG9yIGp1c3QgZ2V0IGJhY2sgdG8gTk9fTElOSyBhbmQgc2Nhbm5pbmcKKwkgKi8KKwlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FUSU5HKXsKKwkJSUVFRTgwMjExX0RFQlVHX01HTVQoIkF1dGhlbnRpY2F0aW9uIGZhaWxlZFxuIik7CisJCWllZWUtPnNvZnRtYWNfc3RhdHMubm9fYXV0aF9ycysrOworCX1lbHNleworCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiQXNzb2NpYXRpb24gZmFpbGVkXG4iKTsKKwkJaWVlZS0+c29mdG1hY19zdGF0cy5ub19hc3NfcnMrKzsKKwl9CisKKwlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9BU1NPQ0lBVElOR19SRVRSWTsKKworCXF1ZXVlX2RlbGF5ZWRfd29yayhpZWVlLT53cSwgJmllZWUtPmFzc29jaWF0ZV9yZXRyeV93cSxJRUVFODAyMTFfU09GVE1BQ19BU1NPQ19SRVRSWV9USU1FKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKK30KKwordm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0X2NiKHVuc2lnbmVkIGxvbmcgZGV2KQoreworCWllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnQoKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICopIGRldik7Cit9CisKKwordm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX3N0ZXAxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uID0gJmllZWUtPmN1cnJlbnRfbmV0d29yazsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJSUVFRTgwMjExX0RFQlVHX01HTVQoIlN0b3BwaW5nIHNjYW5cbiIpOworCWllZWUtPnNvZnRtYWNfc3RhdHMudHhfYXV0aF9ycSsrOworCXNrYj1pZWVlODAyMTFfYXV0aGVudGljYXRpb25fcmVxKGJlYWNvbiwgaWVlZSwgMCk7CisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWlmKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUgKQl7CisJCWlmKHNrYikKKwkJCXNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7CisJCXJldHVybjsKKwl9ZWxzZQorI2VuZGlmCisJaWYgKCFza2IpeworCisJCWllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnQoaWVlZSk7CisJfQorCWVsc2V7CisJCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FUSU5HIDsKKwkJSUVFRTgwMjExX0RFQlVHX01HTVQoIlNlbmRpbmcgYXV0aGVudGljYXRpb24gcmVxdWVzdFxuIik7CisJCS8vcHJpbnRrKCItLS1TZW5kaW5nIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3RcbiIpOworCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOworCQkvL0JVR09OIHdoZW4geW91IHRyeSB0byBhZGRfdGltZXIgdHdpY2UsIHVzaW5nIG1vZF90aW1lciBtYXkgYmUgYmV0dGVyLCBqb2huMDcwOQorCQlpZighdGltZXJfcGVuZGluZygmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKSl7CisJCQlpZWVlLT5hc3NvY2lhdGVfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAoSFogLyAyKTsKKwkJCWFkZF90aW1lcigmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKTsKKwkJfQorCQkvL0lmIGNhbGwgZGV2X2tmcmVlX3NrYl9hbnksYSB3YXJuaW5nIHdpbGwgb2N1ci4uLi4KKwkJLy9LRVJORUw6IGFzc2VydGlvbiAoIWF0b21pY19yZWFkKCZza2ItPnVzZXJzKSkgZmFpbGVkIGF0IG5ldC9jb3JlL2Rldi5jICgxNzA4KQorCQkvL1NvIC4uLiAxMjA0IGJ5IGxhd3JlbmNlLgorCQkvL3ByaW50aygiXG5JbiAlcyxsaW5lICVkIGNhbGwga2ZyZWUgc2tiLiIsX19mdW5jX18sX19MSU5FX18pOworCQkvL2Rldl9rZnJlZV9za2JfYW55KHNrYik7Ly9lZGl0IGJ5IHRob21hcworCX0KK30KKwordm9pZCBpZWVlODAyMTFfYXV0aF9jaGFsbGVuZ2Uoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpjaGFsbGVuZ2UsIGludCBjaGxlbikKK3sKKwl1OCAqYzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uID0gJmllZWUtPmN1cnJlbnRfbmV0d29yazsKKy8vCWludCBobGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pOworCWRlbF90aW1lcl9zeW5jKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOworCWllZWUtPmFzc29jaWF0ZV9zZXErKzsKKwlpZWVlLT5zb2Z0bWFjX3N0YXRzLnR4X2F1dGhfcnErKzsKKworCXNrYiA9IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbl9yZXEoYmVhY29uLCBpZWVlLCBjaGxlbisyKTsKKwlpZiAoIXNrYikKKwkJaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydChpZWVlKTsKKwllbHNleworCQljID0gc2tiX3B1dChza2IsIGNobGVuKzIpOworCQkqKGMrKykgPSBNRklFX1RZUEVfQ0hBTExFTkdFOworCQkqKGMrKykgPSBjaGxlbjsKKwkJbWVtY3B5KGMsIGNoYWxsZW5nZSwgY2hsZW4pOworCisJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJTZW5kaW5nIGF1dGhlbnRpY2F0aW9uIGNoYWxsZW5nZSByZXNwb25zZVxuIik7CisKKwkJaWVlZTgwMjExX2VuY3J5cHRfZnJhZ21lbnQoaWVlZSwgc2tiLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICkpOworCisJCXNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7CisJCWlmICghdGltZXJfcGVuZGluZygmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKSl7CisJCS8vcHJpbnRrKCI9PT09PT09PT0+YWRkIHRpbWVyIGFnYWluLCB0byBjcmFzaFxuIik7CisJCWllZWUtPmFzc29jaWF0ZV90aW1lci5leHBpcmVzID0gamlmZmllcyArIChIWiAvIDIpOworCQlhZGRfdGltZXIoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CisJCX0KKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCisJfQorCWtmcmVlKGNoYWxsZW5nZSk7Cit9CisKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisKKy8vIGJhc2VkIG9uIGllZWU4MDIxMV9hc3NvY19yZXNwCitzdHJ1Y3Qgc2tfYnVmZiogaWVlZTgwMjExX2Fzc29jX3Jlc3BfYnlfbmV0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqZGVzdCwgdW5zaWduZWQgc2hvcnQgc3RhdHVzLCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKnBzdGF0LCBpbnQgcGt0X3R5cGUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1OCogdGFnOworCisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKiBjcnlwdDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lICphc3NvYzsKKwlzaG9ydCBlbmNyeXB0OworCisJdW5zaWduZWQgaW50IHJhdGVfbGVuID0gaWVlZTgwMjExX01GSUVfcmF0ZV9sZW4oaWVlZSk7CisJaW50IGxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lKSArIHJhdGVfbGVuOworCisJaWYoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkKKwkJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4rMjU2KTsgLy8gc3RhbmxleQorCWVsc2UKKwkJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4pOworCisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCisJYXNzb2MgPSAoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSAqKQorCQlza2JfcHV0KHNrYixzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSkpOworCisJYXNzb2MtPmhlYWRlci5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihwa3RfdHlwZSk7CisKKwltZW1jcHkoYXNzb2MtPmhlYWRlci5hZGRyMSwgZGVzdCxFVEhfQUxFTik7CisJbWVtY3B5KGFzc29jLT5oZWFkZXIuYWRkcjMsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkoYXNzb2MtPmhlYWRlci5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCWFzc29jLT5jYXBhYmlsaXR5ID0gY3B1X3RvX2xlMTYoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUiA/CisJCVdMQU5fQ0FQQUJJTElUWV9CU1MgOiBXTEFOX0NBUEFCSUxJVFlfSUJTUyk7CisKKwlpZigoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkgJiYgaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9hc3NvY19yZXNwX2J5X25ldF8xKQorCQlpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX2Fzc29jX3Jlc3BfYnlfbmV0XzEoYXNzb2MpOworCisJaWYoaWVlZS0+c2hvcnRfc2xvdCkKKwkJYXNzb2MtPmNhcGFiaWxpdHkgfD0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1QpOworCisJaWYgKGllZWUtPmhvc3RfZW5jcnlwdCkKKwkJY3J5cHQgPSBpZWVlLT5jcnlwdFtpZWVlLT50eF9rZXlpZHhdOworCWVsc2UgY3J5cHQgPSBOVUxMOworCisJZW5jcnlwdCA9ICggY3J5cHQgJiYgY3J5cHQtPm9wcyk7CisKKwlpZiAoZW5jcnlwdCkKKwkJYXNzb2MtPmNhcGFiaWxpdHkgfD0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpOworCisJYXNzb2MtPnN0YXR1cyA9IDA7CisJYXNzb2MtPmFpZCA9IGNwdV90b19sZTE2KGllZWUtPmFzc29jX2lkKTsKKwlpZiAoaWVlZS0+YXNzb2NfaWQgPT0gMHgyMDA3KSBpZWVlLT5hc3NvY19pZD0wOworCWVsc2UgaWVlZS0+YXNzb2NfaWQrKzsKKworCWFzc29jLT5pbmZvX2VsZW1lbnQuaWQgPSAyMzA7IC8vIFN0YW5sZXksIGFuIHVudXNlZCBpZCAoanVzdCBhIGhvdCBmaXgpCisJYXNzb2MtPmluZm9fZWxlbWVudC5sZW4gPSAwOworCisJdGFnID0gKHU4Kikgc2tiX3B1dChza2IsIHJhdGVfbGVuKTsKKworCWllZWU4MDIxMV9NRklFX0JyYXRlKGllZWUsICZ0YWcpOworCWllZWU4MDIxMV9NRklFX0dyYXRlKGllZWUsICZ0YWcpOworCisJaWYoKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpICYmIGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfYXNzb2NfcmVzcF9ieV9uZXRfMikKKwkJaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9hc3NvY19yZXNwX2J5X25ldF8yKGllZWUsIHBzdGF0LCBwa3RfdHlwZSwgc2tiKTsKKworCXJldHVybiBza2I7Cit9CisKKy8vIGJhc2VkIG9uIGllZWU4MDIxMV9yZXNwX3RvX2Fzc29jX3JxCit2b2lkIGllZWU4MDIxMV9leHRfaXNzdWVfYXNzb2NfcnNwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqZGVzdCwgdW5zaWduZWQgc2hvcnQgc3RhdHVzLCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKnBzdGF0LCBpbnQgcGt0X3R5cGUpCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IGllZWU4MDIxMV9hc3NvY19yZXNwX2J5X25ldChpZWVlLCBkZXN0LCBzdGF0dXMsIHBzdGF0LCBwa3RfdHlwZSk7CisKKwlpZiAoYnVmKQorCQlzb2Z0bWFjX21nbXRfeG1pdChidWYsIGllZWUpOworfQorCisvLyBiYXNlZCBvbiBpZWVlODAyMTFfYXNzb2NpYXRlX3N0ZXAyCit2b2lkIGllZWU4MDIxMV9leHRfaXNzdWVfYXNzb2NfcmVxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKnBzdGF0KQoreworCisJc3RydWN0IHNrX2J1ZmYqIHNrYjsKKworCS8vIHByaW50aygiQEBAQEAgaWVlZTgwMjExX2V4dF9pc3N1ZV9hc3NvY19yZXEgb24gY2hhbm5lbDogJWRcbiIsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKworCWllZWUtPnNvZnRtYWNfc3RhdHMudHhfYXNzX3JxKys7CisJc2tiPWllZWU4MDIxMV9hc3NvY2lhdGlvbl9yZXEocHN0YXQsIGllZWUpOworCWlmIChza2IpCisJCXNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7Cit9CisKK3ZvaWQgaWVlZTgwMjExX2V4dF9pc3N1ZV9kaXNhc3NvYyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpwc3RhdCwgaW50IHJlYXNvbiwgdW5zaWduZWQgY2hhciBleHRSZWFzb24pCit7CisJLy8gZG8gbm90aGluZworCS8vIHByaW50aygiQEBAQEAgaWVlZTgwMjExX2V4dF9pc3N1ZV9kaXNhc3NvY1xuIik7CisJcmV0dXJuOworfQorI2VuZGlmIC8vIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwordm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX3N0ZXAyKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXN0cnVjdCBza19idWZmKiBza2I7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpiZWFjb24gPSAmaWVlZS0+Y3VycmVudF9uZXR3b3JrOworCisJZGVsX3RpbWVyX3N5bmMoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CisKKwlJRUVFODAyMTFfREVCVUdfTUdNVCgiU2VuZGluZyBhc3NvY2lhdGlvbiByZXF1ZXN0XG4iKTsKKwlpZWVlLT5zb2Z0bWFjX3N0YXRzLnR4X2Fzc19ycSsrOworCXNrYj1pZWVlODAyMTFfYXNzb2NpYXRpb25fcmVxKGJlYWNvbiwgaWVlZSk7CisJaWYgKCFza2IpCisJCWllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnQoaWVlZSk7CisJZWxzZXsKKwkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKKwkJaWYgKCF0aW1lcl9wZW5kaW5nKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpKXsKKwkJaWVlZS0+YXNzb2NpYXRlX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKEhaIC8gMik7CisJCWFkZF90aW1lcigmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKTsKKwkJfQorCQkvL2Rldl9rZnJlZV9za2JfYW55KHNrYik7Ly9lZGl0IGJ5IHRob21hcworCX0KK30KKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKK3ZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9jb21wbGV0ZV93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIGFzc29jaWF0ZV9jb21wbGV0ZV93cSk7CisjZWxzZQordm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX2NvbXBsZXRlX3dxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworI2VuZGlmCisJcHJpbnRrKEtFUk5fSU5GTyAiQXNzb2NpYXRlZCBzdWNjZXNzZnVsbHlcbiIpOworCWlmKGllZWU4MDIxMV9pc181NGcoaWVlZS0+Y3VycmVudF9uZXR3b3JrKSAmJgorCQkoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pKXsKKworCQlpZWVlLT5yYXRlID0gNTQwOworCQlwcmludGsoS0VSTl9JTkZPIlVzaW5nIEcgcmF0ZXNcbiIpOworCX1lbHNleworCQlpZWVlLT5yYXRlID0gMTEwOworCQlwcmludGsoS0VSTl9JTkZPIlVzaW5nIEIgcmF0ZXNcbiIpOworCX0KKwlpZWVlLT5saW5rX2NoYW5nZShpZWVlLT5kZXYpOworCW5vdGlmeV93eF9hc3NvY19ldmVudChpZWVlKTsKKwlpZiAoaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZSkKKwkJaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZShpZWVlLT5kZXYpOworCW5ldGlmX2NhcnJpZXJfb24oaWVlZS0+ZGV2KTsKK30KKwordm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX2NvbXBsZXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWludCBpOworCWRlbF90aW1lcl9zeW5jKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOworCisJZm9yKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJICAvL2llZWUtPnNlcV9jdHJsW2ldID0gMDsKKwl9CisJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfTElOS0VEOworCUlFRUU4MDIxMV9ERUJVR19NR01UKCJTdWNjZXNzZnVsbHkgYXNzb2NpYXRlZFxuIik7CisKKwlxdWV1ZV93b3JrKGllZWUtPndxLCAmaWVlZS0+YXNzb2NpYXRlX2NvbXBsZXRlX3dxKTsKK30KKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKK3ZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9wcm9jZWR1cmVfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBhc3NvY2lhdGVfcHJvY2VkdXJlX3dxKTsKKyNlbHNlCit2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfcHJvY2VkdXJlX3dxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworI2VuZGlmCisJaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAxOworCWRvd24oJmllZWUtPnd4X3NlbSk7CisKKwlpZiAoaWVlZS0+ZGF0YV9oYXJkX3N0b3ApCisJCWllZWUtPmRhdGFfaGFyZF9zdG9wKGllZWUtPmRldik7CisKKwlpZWVlODAyMTFfc3RvcF9zY2FuKGllZWUpOworCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOworCisJaWVlZS0+YXNzb2NpYXRlX3NlcSA9IDE7CisJaWVlZTgwMjExX2Fzc29jaWF0ZV9zdGVwMShpZWVlKTsKKworCXVwKCZpZWVlLT53eF9zZW0pOworfQorI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKy8vIGJhc2VkIG9uIGllZWU4MDIxMV9hc3NvY2lhdGVfcHJvY2VkdXJlX3dxCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQordm9pZCBpZWVlODAyMTFfZXh0X3N0b3Bfc2Nhbl93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIGV4dF9zdG9wX3NjYW5fd3EpOworI2Vsc2UKK3ZvaWQgaWVlZTgwMjExX2V4dF9zdG9wX3NjYW5fd3Eoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisjZW5kaWYKKwkgIGlmIChpZWVlLT5zY2FubmluZyA9PSAwKQorCXsKKwkJaWYoKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpICYmIGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfZXh0X3N0b3Bfc2Nhbl93cV9zZXRfY2hhbm5lbAorCQkJCSYmICggaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPT0gaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9leHRfc3RvcF9zY2FuX3dxX3NldF9jaGFubmVsKGllZWUpICkgKQorCQlyZXR1cm47CisJfQorCisJaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAxOworCisJZG93bigmaWVlZS0+d3hfc2VtKTsKKworCS8vIHByaW50aygiQEBAQEBAQEBAQCBpZWVlODAyMTFfZXh0X3N0b3Bfc2Nhbl93cVxuIik7CisJaWYgKGllZWUtPmRhdGFfaGFyZF9zdG9wKQorCQlpZWVlLT5kYXRhX2hhcmRfc3RvcChpZWVlLT5kZXYpOworCisJaWVlZTgwMjExX3N0b3Bfc2NhbihpZWVlKTsKKworCS8vIHNldCBjaGFubmVsCisJaWYoKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpICYmIGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfZXh0X3N0b3Bfc2Nhbl93cV9zZXRfY2hhbm5lbCkKKwkJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX2V4dF9zdG9wX3NjYW5fd3Ffc2V0X2NoYW5uZWwoaWVlZSkpOworCWVsc2UKKwkJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisJLy8KKwl1cCgmaWVlZS0+d3hfc2VtKTsKK30KKworCit2b2lkIGllZWU4MDIxMV9leHRfc2VuZF8xMXNfYmVhY29uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwkJcXVldWVfd29yayhpZWVlLT53cSwgJmllZWUtPmV4dF9zZW5kX2JlYWNvbl93cSk7CisJI2Vsc2UKKwkJc2NoZWR1bGVfdGFzaygmaWVlZS0+ZXh0X3NlbmRfYmVhY29uX3dxKTsKKwkjZW5kaWYKKworfQorCisjZW5kaWYgLy8gX1JUTDgxODdfRVhUX1BBVENIXworCitpbmxpbmUgdm9pZCBpZWVlODAyMTFfc29mdG1hY19uZXdfbmV0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldCkKK3sKKwl1OCB0bXBfc3NpZFtJV19FU1NJRF9NQVhfU0laRSsxXTsKKwlpbnQgdG1wX3NzaWRfbGVuID0gMDsKKworCXNob3J0IGFwc2V0LHNzaWRzZXQsc3NpZGJyb2FkLGFwbWF0Y2gsc3NpZG1hdGNoOworCisJLyogd2UgYXJlIGludGVyZXN0ZWQgaW4gbmV3IG5ldyBvbmx5IGlmIHdlIGFyZSBub3QgYXNzb2NpYXRlZAorCSAqIGFuZCB3ZSBhcmUgbm90IGFzc29jaWF0aW5nIC8gYXV0aGVudGljYXRpbmcKKwkgKi8KKwlpZiAoaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX05PTElOSykKKwkJcmV0dXJuOworCisJaWYgKChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpICYmICEobmV0LT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0JTUykpCisJCXJldHVybjsKKworCWlmICgoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKSAmJiAhKG5ldC0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKSkKKwkJcmV0dXJuOworCisKKwlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBIHx8IGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQyl7CisJCS8qIGlmIHRoZSB1c2VyIHNwZWNpZmllZCB0aGUgQVAgTUFDLCB3ZSBuZWVkIGFsc28gdGhlIGVzc2lkCisJCSAqIFRoaXMgY291bGQgYmUgb2J0YWluZWQgYnkgYmVhY29ucyBvciwgaWYgdGhlIG5ldHdvcmsgZG9lcyBub3QKKwkJICogYnJvYWRjYXN0IGl0LCBpdCBjYW4gYmUgcHV0IG1hbnVhbGx5LgorCQkgKi8KKwkJYXBzZXQgPSBpZWVlLT53YXBfc2V0Oy8vKG1lbWNtcChpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIHplcm8sRVRIX0FMRU4pIT0wICk7CisJCXNzaWRzZXQgPSBpZWVlLT5zc2lkX3NldDsvL2llZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkWzBdICE9ICdcMCc7CisJCXNzaWRicm9hZCA9ICAhKG5ldC0+c3NpZF9sZW4gPT0gMCB8fCBuZXQtPnNzaWRbMF09PSAnXDAnKTsKKwkJYXBtYXRjaCA9IChtZW1jbXAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBuZXQtPmJzc2lkLCBFVEhfQUxFTik9PTApOworCisJCWlmKGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiAhPSBuZXQtPnNzaWRfbGVuKQorCQkJc3NpZG1hdGNoID0gMDsKKwkJZWxzZQorCQkJc3NpZG1hdGNoID0gKDA9PXN0cm5jbXAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsIG5ldC0+c3NpZCwgbmV0LT5zc2lkX2xlbikpOworCisJCS8vcHJpbnRrKCJjdXI6ICVzLCAlZCwgbmV0OiVzLCAlZFxuIiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsIGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiwgbmV0LT5zc2lkLCBuZXQtPnNzaWRfbGVuKTsKKwkJLy9wcmludGsoImFwc2V0PSVkIGFwbWF0Y2g9JWQgc3NpZHNldD0lZCBzc2lkYnJvYWQ9JWQgc3NpZG1hdGNoPSVkXG4iLGFwc2V0LGFwbWF0Y2gsc3NpZHNldCxzc2lkYnJvYWQsc3NpZG1hdGNoKTsKKworCQlpZiAoCS8qIGlmIHRoZSB1c2VyIHNldCB0aGUgQVAgY2hlY2sgaWYgbWF0Y2guCisJCQkgKiBpZiB0aGUgbmV0d29yayBkb2VzIG5vdCBicm9hZGNhc3QgZXNzaWQgd2UgY2hlY2sgdGhlIHVzZXIgc3VwcGx5ZWQgQU5ZIGVzc2lkCisJCQkgKiBpZiB0aGUgbmV0d29yayBkb2VzIGJyb2FkY2FzdCBhbmQgdGhlIHVzZXIgZG9lcyBub3Qgc2V0IGVzc2lkIGl0IGlzIE9LCisJCQkgKiBpZiB0aGUgbmV0d29yayBkb2VzIGJyb2FkY2FzdCBhbmQgdGhlIHVzZXIgZGlkIHNldCBlc3NpZCBjaGVjaCBpZiBlc3NpZCBtYXRjaAorCQkJICovCisJCQkJKCBhcHNldCAmJiBhcG1hdGNoICYmCisJCQkJICAoKHNzaWRzZXQgJiYgc3NpZGJyb2FkICYmIHNzaWRtYXRjaCkgfHwgKHNzaWRicm9hZCAmJiAhc3NpZHNldCkgfHwgKCFzc2lkYnJvYWQgJiYgc3NpZHNldCkpICkgfHwKKwkJCQkvKiBpZiB0aGUgYXAgaXMgbm90IHNldCwgY2hlY2sgdGhhdCB0aGUgdXNlciBzZXQgdGhlIGJzc2lkCisJCQkJICogYW5kIHRoZSBuZXR3b3JrIGRvZXMgYnJhZGNhc3QgYW5kIHRoYXQgdGhvc2UgdHdvIGJzc2lkIG1hdGNoZXMKKwkJCQkgKi8KKwkJCQkoIWFwc2V0ICYmIHNzaWRzZXQgJiYgc3NpZGJyb2FkICYmIHNzaWRtYXRjaCkKKwkJICAgKXsKKworCisJCQkvKiBpZiB0aGUgZXNzaWQgaXMgaGlkZGVuIHJlcGxhY2UgaXQgd2l0aCB0aGUKKwkJCSAqIGVzc2lkIHByb3ZpZGVkIGJ5IHRoZSB1c2VyLgorCQkJICovCisJCQlpZiAoIXNzaWRicm9hZCl7CisJCQkJc3RybmNweSh0bXBfc3NpZCwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsIElXX0VTU0lEX01BWF9TSVpFKTsKKwkJCQl0bXBfc3NpZF9sZW4gPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW47CisJCQl9CisJCQltZW1jcHkoJmllZWUtPmN1cnJlbnRfbmV0d29yaywgbmV0LCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrKSk7CisKKwkJCWlmICghc3NpZGJyb2FkKXsKKwkJCQlzdHJuY3B5KGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCB0bXBfc3NpZCwgSVdfRVNTSURfTUFYX1NJWkUpOworCQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9IHRtcF9zc2lkX2xlbjsKKwkJCX0KKwkJCXByaW50ayhLRVJOX0lORk8iTGlua2luZyB3aXRoICVzOiBjaGFubmVsIGlzICVkXG4iLGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKworCQkJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSl7CisJCQkJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfQVNTT0NJQVRJTkc7CisJCQkJaWVlZS0+YmVpbnJldHJ5ID0gZmFsc2U7CisJCQkJcXVldWVfd29yayhpZWVlLT53cSwgJmllZWUtPmFzc29jaWF0ZV9wcm9jZWR1cmVfd3EpOworCQkJfWVsc2V7CisJCQkJaWYoaWVlZTgwMjExX2lzXzU0ZyhpZWVlLT5jdXJyZW50X25ldHdvcmspICYmCisJCQkJCQkoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pKXsKKwkJCQkJaWVlZS0+cmF0ZSA9IDU0MDsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyJVc2luZyBHIHJhdGVzXG4iKTsKKwkJCQl9ZWxzZXsKKwkJCQkJaWVlZS0+cmF0ZSA9IDExMDsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyJVc2luZyBCIHJhdGVzXG4iKTsKKwkJCQl9CisJCQkJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfTElOS0VEOworCQkJCWllZWUtPmJlaW5yZXRyeSA9IGZhbHNlOworCQkJfQorCisJCX0KKwl9CisKK30KKwordm9pZCBpZWVlODAyMTFfc29mdG1hY19jaGVja19hbGxfbmV0cyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqdGFyZ2V0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRhcmdldCwgJmllZWUtPm5ldHdvcmtfbGlzdCwgbGlzdCkgeworCisJCS8qIGlmIHRoZSBzdGF0ZSBiZWNvbWUgZGlmZmVyZW50IHRoYXQgTk9MSU5LIG1lYW5zCisJCSAqIHdlIGhhZCBmb3VuZCB3aGF0IHdlIGFyZSBzZWFyY2hpbmcgZm9yCisJCSAqLworCisJCWlmIChpZWVlLT5zdGF0ZSAhPSBJRUVFODAyMTFfTk9MSU5LKQorCQkJYnJlYWs7CisKKwkJaWYgKGllZWUtPnNjYW5fYWdlID09IDAgfHwgdGltZV9hZnRlcih0YXJnZXQtPmxhc3Rfc2Nhbm5lZCArIGllZWUtPnNjYW5fYWdlLCBqaWZmaWVzKSkKKwkJCWllZWU4MDIxMV9zb2Z0bWFjX25ld19uZXQoaWVlZSwgdGFyZ2V0KTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKK30KKworCitzdGF0aWMgaW5saW5lIHUxNiBhdXRoX3BhcnNlKHN0cnVjdCBza19idWZmICpza2IsIHU4KiogY2hhbGxlbmdlLCBpbnQgKmNobGVuKQoreworCXN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24gKmE7CisJdTggKnQ7CisJaWYgKHNrYi0+bGVuIDwgIChzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiktc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50KSkpeworCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiaW52YWxpZCBsZW4gaW4gYXV0aCByZXNwOiAlZFxuIixza2ItPmxlbik7CisJCXJldHVybiAweGNhZmU7CisJfQorCSpjaGFsbGVuZ2UgPSBOVUxMOworCWEgPSAoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiopIHNrYi0+ZGF0YTsKKwlpZihza2ItPmxlbiA+IChzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbikgKzMpKXsKKwkJdCA9IHNrYi0+ZGF0YSArIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKTsKKworCQlpZigqKHQrKykgPT0gTUZJRV9UWVBFX0NIQUxMRU5HRSl7CisJCQkqY2hsZW4gPSAqKHQrKyk7CisJCQkqY2hhbGxlbmdlID0gKHU4KilrbWFsbG9jKCpjaGxlbiwgR0ZQX0FUT01JQyk7CisJCQltZW1jcHkoKmNoYWxsZW5nZSwgdCwgKmNobGVuKTsKKwkJfQorCX0KKworCXJldHVybiBjcHVfdG9fbGUxNihhLT5zdGF0dXMpOworCit9CisKKworaW50IGF1dGhfcnFfcGFyc2Uoc3RydWN0IHNrX2J1ZmYgKnNrYix1OCogZGVzdCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uICphOworCisJaWYgKHNrYi0+bGVuIDwgIChzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiktc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50KSkpeworCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiaW52YWxpZCBsZW4gaW4gYXV0aCByZXF1ZXN0OiAlZFxuIixza2ItPmxlbik7CisJCXJldHVybiAtMTsKKwl9CisJYSA9IChzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKikgc2tiLT5kYXRhOworCisJbWVtY3B5KGRlc3QsYS0+aGVhZGVyLmFkZHIyLCBFVEhfQUxFTik7CisKKwlpZiAobGUxNl90b19jcHUoYS0+YWxnb3JpdGhtKSAhPSBXTEFOX0FVVEhfT1BFTikKKwkJcmV0dXJuICBXTEFOX1NUQVRVU19OT1RfU1VQUE9SVEVEX0FVVEhfQUxHOworCisJcmV0dXJuIFdMQU5fU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBzaG9ydCBwcm9iZV9ycV9wYXJzZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggKnNyYykKK3sKKwl1OCAqdGFnOworCXU4ICpza2JlbmQ7CisJdTggKnNzaWQ9TlVMTDsKKwl1OCBzc2lkbGVuID0gMDsKKworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICAgKmhlYWRlciA9CisJCShzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgICopIHNrYi0+ZGF0YTsKKworCWlmIChza2ItPmxlbiA8IHNpemVvZiAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICkpCisJCXJldHVybiAtMTsgLyogY29ycnVwdGVkICovCisKKwltZW1jcHkoc3JjLGhlYWRlci0+YWRkcjIsIEVUSF9BTEVOKTsKKworCXNrYmVuZCA9ICh1OCopc2tiLT5kYXRhICsgc2tiLT5sZW47CisKKwl0YWcgPSBza2ItPmRhdGEgKyBzaXplb2YgKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICApOworCisJd2hpbGUgKHRhZysxIDwgc2tiZW5kKXsKKwkJaWYgKCp0YWcgPT0gMCl7CisJCQlzc2lkID0gdGFnKzI7CisJCQlzc2lkbGVuID0gKih0YWcrMSk7CisJCQlicmVhazsKKwkJfQorCQl0YWcrKzsgLyogcG9pbnQgdG8gdGhlIGxlbiBmaWVsZCAqLworCQl0YWcgPSB0YWcgKyAqKHRhZyk7IC8qIHBvaW50IHRvIHRoZSBsYXN0IGRhdGEgYnl0ZSBvZiB0aGUgdGFnICovCisJCXRhZysrOyAvKiBwb2ludCB0byB0aGUgbmV4dCB0YWcgKi8KKwl9CisKKwkvL0lFRUU4MDIxMURNRVNHKCJDYXJkIE1BQyBhZGRyZXNzIGlzICJNQUNTVFIsIE1BQzJTVFIoc3JjKSk7CisJaWYgKHNzaWRsZW4gPT0gMCkgcmV0dXJuIDE7CisKKwlpZiAoIXNzaWQpIHJldHVybiAxOyAvKiBzc2lkIG5vdCBmb3VuZCBpbiB0YWdnZWQgcGFyYW0gKi8KKwlyZXR1cm4gKCFzdHJuY21wKHNzaWQsIGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCBzc2lkbGVuKSk7CisKK30KKworaW50IGFzc29jX3JxX3BhcnNlKHN0cnVjdCBza19idWZmICpza2IsdTgqIGRlc3QpCit7CisJc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lICphOworCisJaWYgKHNrYi0+bGVuIDwgKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3JlcXVlc3RfZnJhbWUpIC0KKwkJc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50KSkpIHsKKworCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiaW52YWxpZCBsZW4gaW4gYXV0aCByZXF1ZXN0OiVkIFxuIiwgc2tiLT5sZW4pOworCQlyZXR1cm4gLTE7CisJfQorCisJYSA9IChzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3JlcXVlc3RfZnJhbWUqKSBza2ItPmRhdGE7CisKKwltZW1jcHkoZGVzdCxhLT5oZWFkZXIuYWRkcjIsRVRIX0FMRU4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IGFzc29jX3BhcnNlKHN0cnVjdCBza19idWZmICpza2IsIGludCAqYWlkKQoreworCXN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUgKmE7CisJaWYgKHNrYi0+bGVuIDwgIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lKSl7CisJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJpbnZhbGlkIGxlbiBpbiBhdXRoIHJlc3A6ICVkXG4iLCBza2ItPmxlbik7CisJCXJldHVybiAweGNhZmU7CisJfQorCisJYSA9IChzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lKikgc2tiLT5kYXRhOworCSphaWQgPSBsZTE2X3RvX2NwdShhLT5haWQpICYgMHgzZmZmOworCXJldHVybiBsZTE2X3RvX2NwdShhLT5zdGF0dXMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2llZWU4MDIxMV9yeF9wcm9iZV9ycShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1OCBkZXN0W0VUSF9BTEVOXTsKKworCS8vSUVFRTgwMjExRE1FU0coIlJ4IHByb2JlIik7CisJaWVlZS0+c29mdG1hY19zdGF0cy5yeF9wcm9iZV9ycSsrOworCS8vRE1FU0coIkRlc3QgaXMgIk1BQ1NUUiwgTUFDMlNUUihkZXN0KSk7CisJaWYgKHByb2JlX3JxX3BhcnNlKGllZWUsIHNrYiwgZGVzdCkpeworCQkvL0lFRUU4MDIxMURNRVNHKCJXYXMgZm9yIG1lISIpOworCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnR4X3Byb2JlX3JzKys7CisJCWllZWU4MDIxMV9yZXNwX3RvX3Byb2JlKGllZWUsIGRlc3QpOworCX0KK30KKworaW5saW5lIHZvaWQKK2llZWU4MDIxMV9yeF9hdXRoX3JxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXU4IGRlc3RbRVRIX0FMRU5dOworCWludCBzdGF0dXM7CisJLy9JRUVFODAyMTFETUVTRygiUnggcHJvYmUiKTsKKwlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2F1dGhfcnErKzsKKworCWlmICgoc3RhdHVzID0gYXV0aF9ycV9wYXJzZShza2IsIGRlc3QpKSE9IC0xKXsKKwkJaWVlZTgwMjExX3Jlc3BfdG9fYXV0aChpZWVlLCBzdGF0dXMsIGRlc3QpOworCX0KKwkvL0RNRVNHKCJEZXN0IGlzICJNQUNTVFIsIE1BQzJTVFIoZGVzdCkpOworCit9CisKKyBpbmxpbmUgdm9pZAoraWVlZTgwMjExX3J4X2Fzc29jX3JxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCisJdTggZGVzdFtFVEhfQUxFTl07CisJLy91bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWVlZS0+c29mdG1hY19zdGF0cy5yeF9hc3NfcnErKzsKKwlpZiAoYXNzb2NfcnFfcGFyc2Uoc2tiLGRlc3QpICE9IC0xKXsKKwkJaWVlZTgwMjExX3Jlc3BfdG9fYXNzb2NfcnEoaWVlZSwgZGVzdCk7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyJOZXcgY2xpZW50IGFzc29jaWF0ZWQ6ICJNQUNfRk1UIlxuIiwgTUFDX0FSRyhkZXN0KSk7CisJLy9GSVhNRQorCSNpZiAwCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssZmxhZ3MpOworCWFkZF9hc3NvY2lhdGUoaWVlZSxkZXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLGZsYWdzKTsKKwkjZW5kaWYKK30KKworCisKK3ZvaWQgaWVlZTgwMjExX3N0YV9wc19zZW5kX251bGxfZnJhbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHNob3J0IHB3cikKK3sKKworCXN0cnVjdCBza19idWZmICpidWYgPSBpZWVlODAyMTFfbnVsbF9mdW5jKGllZWUsIHB3cik7CisKKwlpZiAoYnVmKQorCQlzb2Z0bWFjX3BzX21nbXRfeG1pdChidWYsIGllZWUpOworCit9CisKKworc2hvcnQgaWVlZTgwMjExX3N0YV9wc19zbGVlcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTMyICp0aW1lX2gsIHUzMiAqdGltZV9sKQoreworI2lmIDAKKyAgICAgICAgaW50IHRpbWVvdXQgPSBpZWVlLT5wc190aW1lb3V0OworI2Vsc2UKKyAgICAgICAgaW50IHRpbWVvdXQgPSAwOworI2VuZGlmCisJdTggZHRpbTsKKwkvKmlmKGllZWUtPnBzID09IElFRUU4MDIxMV9QU19ESVNBQkxFRCB8fAorCQlpZWVlLT5pd19tb2RlICE9IElXX01PREVfSU5GUkEgfHwKKwkJaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRCkKKworCQlyZXR1cm4gMDsKKwkqLworCWR0aW0gPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuZHRpbV9kYXRhOworCS8vcHJpbnRrKCJEVElNXG4iKTsKKworCWlmKCEoZHRpbSAmIElFRUU4MDIxMV9EVElNX1ZBTElEKSkKKwkJcmV0dXJuIDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0aW1lb3V0ID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbDsKKworCS8vcHJpbnRrKCJWQUxJRFxuIik7CisJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmR0aW1fZGF0YSA9IElFRUU4MDIxMV9EVElNX0lOVkFMSUQ7CisKKwlpZihkdGltICYgKChJRUVFODAyMTFfRFRJTV9VQ0FTVCB8IElFRUU4MDIxMV9EVElNX01CQ0FTVCkmIGllZWUtPnBzKSkKKwkJcmV0dXJuIDI7CisKKwlpZighdGltZV9hZnRlcihqaWZmaWVzLCBpZWVlLT5kZXYtPnRyYW5zX3N0YXJ0ICsgTVNFQ1ModGltZW91dCkpKQorCQlyZXR1cm4gMDsKKworCWlmKCF0aW1lX2FmdGVyKGppZmZpZXMsIGllZWUtPmxhc3RfcnhfcHNfdGltZSArIE1TRUNTKHRpbWVvdXQpKSkKKwkJcmV0dXJuIDA7CisKKwlpZigoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUUgKSAmJgorCQkoaWVlZS0+bWdtdF9xdWV1ZV90YWlsICE9IGllZWUtPm1nbXRfcXVldWVfaGVhZCkpCisJCXJldHVybiAwOworI2lmIDAKKwlpZih0aW1lX2wpeworCQkqdGltZV9sID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmxhc3RfZHRpbV9zdGFfdGltZVswXQorCQkJKyAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbAorCQkJKiBpZWVlLT5jdXJyZW50X25ldHdvcmsuZHRpbV9wZXJpb2QpICogMTAwMDsKKwl9CisjZWxzZQorCWlmKHRpbWVfbCl7CisJCSp0aW1lX2wgPSBpZWVlLT5jdXJyZW50X25ldHdvcmsubGFzdF9kdGltX3N0YV90aW1lWzBdCisJCQkrIE1TRUNTKChpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsKSk7CisJCQkvLyogaWVlZS0+Y3VycmVudF9uZXR3b3JrLmR0aW1fcGVyaW9kKSk7CisJCQkvL3ByaW50aygiYmVhY29uX2ludGVydmFsOiV4LCBkdGltX3BlcmlvZDoleCwgdG90b2wgdG8gTXNlY3M6JXgsIEhaOiV4XG4iLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuZHRpbV9wZXJpb2QsIE1TRUNTKCgoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCAqIGllZWUtPmN1cnJlbnRfbmV0d29yay5kdGltX3BlcmlvZCkpKSwgSFopOworCX0KKworI2VuZGlmCisJaWYodGltZV9oKXsKKwkJKnRpbWVfaCA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5sYXN0X2R0aW1fc3RhX3RpbWVbMV07CisJCWlmKHRpbWVfbCAmJiAqdGltZV9sIDwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmxhc3RfZHRpbV9zdGFfdGltZVswXSkKKwkJCSp0aW1lX2ggKz0gMTsKKwl9CisKKwlyZXR1cm4gMTsKKworCit9CisKK2lubGluZSB2b2lkIGllZWU4MDIxMV9zdGFfcHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisKKwl1MzIgdGgsdGw7CisJc2hvcnQgc2xlZXA7CisKKwl1bnNpZ25lZCBsb25nIGZsYWdzLGZsYWdzMjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlpZigoaWVlZS0+cHMgPT0gSUVFRTgwMjExX1BTX0RJU0FCTEVEIHx8CisKKwkJaWVlZS0+aXdfbW9kZSAhPSBJV19NT0RFX0lORlJBIHx8CisJCWllZWUtPnN0YXRlICE9IElFRUU4MDIxMV9MSU5LRUQpKXsKKworCQkvLyN3YXJuaW5nIENIRUNLX0xPQ0tfSEVSRQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bWdtdF90eF9sb2NrLCBmbGFnczIpOworCisJCWllZWU4MDIxMV9zdGFfd2FrZXVwKGllZWUsIDEpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MyKTsKKwl9CisKKwlzbGVlcCA9IGllZWU4MDIxMV9zdGFfcHNfc2xlZXAoaWVlZSwmdGgsICZ0bCk7CisvLwlwcmludGsoIj09PT4lcywlZFsyIHdha2UsIDEgc2xlZXAsIDAgZG8gbm90aGluZ10sIGllZWUtPnN0YV9zbGVlcCA9ICVkXG4iLF9fZnVuY19fLCBzbGVlcCxpZWVlLT5zdGFfc2xlZXApOworCS8qIDIgd2FrZSwgMSBzbGVlcCwgMCBkbyBub3RoaW5nICovCisJaWYoc2xlZXAgPT0gMCkKKwkJZ290byBvdXQ7CisKKwlpZihzbGVlcCA9PSAxKXsKKworCQlpZihpZWVlLT5zdGFfc2xlZXAgPT0gMSkKKwkJCWllZWUtPmVudGVyX3NsZWVwX3N0YXRlKGllZWUtPmRldix0aCx0bCk7CisKKwkJZWxzZSBpZihpZWVlLT5zdGFfc2xlZXAgPT0gMCl7CisJLy8JCXByaW50aygic2VuZCBudWxsIDFcbiIpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MyKTsKKworCQkJaWYoaWVlZS0+cHNfaXNfcXVldWVfZW1wdHkoaWVlZS0+ZGV2KSl7CisKKworCQkJCWllZWUtPnN0YV9zbGVlcCA9IDI7CisKKwkJCQlpZWVlLT5wc19yZXF1ZXN0X3R4X2FjayhpZWVlLT5kZXYpOworCisJCQkJaWVlZTgwMjExX3N0YV9wc19zZW5kX251bGxfZnJhbWUoaWVlZSwxKTsKKworCQkJCWllZWUtPnBzX3RoID0gdGg7CisJCQkJaWVlZS0+cHNfdGwgPSB0bDsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MyKTsKKworCQl9CisKKworCX1lbHNlIGlmKHNsZWVwID09IDIpeworLy8jd2FybmluZyBDSEVDS19MT0NLX0hFUkUKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MyKTsKKworCS8vCXByaW50aygic2VuZCB3YWtldXAgcGFja2V0XG4iKTsKKwkJaWVlZTgwMjExX3N0YV93YWtldXAoaWVlZSwxKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzMik7CisJfQorCitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCit9CisKK3ZvaWQgaWVlZTgwMjExX3N0YV93YWtldXAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHNob3J0IG5sKQoreworCWlmKGllZWUtPnN0YV9zbGVlcCA9PSAwKXsKKwkJaWYobmwpeworCQkvLwlwcmludGsoIldhcm5pbmc6IGRyaXZlciBpcyBwcm9iYWJseSBmYWlsaW5nIHRvIHJlcG9ydCBUWCBwcyBlcnJvclxuIik7CisJCQlpZWVlLT5wc19yZXF1ZXN0X3R4X2FjayhpZWVlLT5kZXYpOworCQkJaWVlZTgwMjExX3N0YV9wc19zZW5kX251bGxfZnJhbWUoaWVlZSwgMCk7CisJCX0KKwkJcmV0dXJuOworCisJfQorCisJaWYoaWVlZS0+c3RhX3NsZWVwID09IDEpCisJCWllZWUtPnN0YV93YWtlX3VwKGllZWUtPmRldik7CisKKwlpZWVlLT5zdGFfc2xlZXAgPSAwOworCisJaWYobmwpeworCQlpZWVlLT5wc19yZXF1ZXN0X3R4X2FjayhpZWVlLT5kZXYpOworCQlpZWVlODAyMTFfc3RhX3BzX3NlbmRfbnVsbF9mcmFtZShpZWVlLCAwKTsKKwl9Cit9CisKK3ZvaWQgaWVlZTgwMjExX3BzX3R4X2FjayhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc2hvcnQgc3VjY2VzcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzLGZsYWdzMjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisJaWYoaWVlZS0+c3RhX3NsZWVwID09IDIpeworCQkvKiBOdWxsIGZyYW1lIHdpdGggUFMgYml0IHNldCAqLworCQlpZihzdWNjZXNzKXsKKworCQkvLwlwcmludGsoIj09PT09PT09PT09PT09PT09PT4gJXM6OmVudGVyIHNsZWVwIHN0YXRlXG4iLF9fZnVuY19fKTsKKwkJCWllZWUtPnN0YV9zbGVlcCA9IDE7CisJCQlpZWVlLT5lbnRlcl9zbGVlcF9zdGF0ZShpZWVlLT5kZXYsaWVlZS0+cHNfdGgsaWVlZS0+cHNfdGwpOworCQl9CisJCS8qIGlmIHRoZSBjYXJkIHJlcG9ydCBub3Qgc3VjY2VzcyB3ZSBjYW4ndCBiZSBzdXJlIHRoZSBBUAorCQkgKiBoYXMgbm90IFJYZWQgc28gd2UgY2FuJ3QgYXNzdW1lIHRoZSBBUCBiZWxpZXZlIHVzIGF3YWtlCisJCSAqLworCX0KKwkvKiAyMTExMjAwNSAtIHR4IGFnYWluIG51bGwgd2l0aG91dCBQUyBiaXQgaWYgbG9zdCAqLworCWVsc2UgeworCisJCWlmKChpZWVlLT5zdGFfc2xlZXAgPT0gMCkgJiYgIXN1Y2Nlc3MpeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MyKTsKKwkJCWllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKGllZWUsIDApOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bWdtdF90eF9sb2NrLCBmbGFnczIpOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKK30KKworaW5saW5lIGludAoraWVlZTgwMjExX3J4X2ZyYW1lX3NvZnRtYWMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCisJCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cywgdTE2IHR5cGUsCisJCQl1MTYgc3R5cGUpCit7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKmhlYWRlciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqKSBza2ItPmRhdGE7CisJdTE2IGVycmNvZGU7CisJdTgqIGNoYWxsZW5nZT1OVUxMOworCWludCBjaGxlbj0wOworCWludCBhaWQ9MDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lICphc3NvY19yZXNwOworCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50ICppbmZvX2VsZW1lbnQ7CisKKwlpZighaWVlZS0+cHJvdG9fc3RhcnRlZCkKKwkJcmV0dXJuIDA7CisKKwlpZihpZWVlLT5zdGFfc2xlZXAgfHwgKGllZWUtPnBzICE9IElFRUU4MDIxMV9QU19ESVNBQkxFRCAmJgorCQlpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEgJiYKKwkJaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkpCisKKwkJdGFza2xldF9zY2hlZHVsZSgmaWVlZS0+cHNfdGFzayk7CisKKwlpZihXTEFOX0ZDX0dFVF9TVFlQRShoZWFkZXItPmZyYW1lX2N0bCkgIT0gSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1AgJiYKKwkJV0xBTl9GQ19HRVRfU1RZUEUoaGVhZGVyLT5mcmFtZV9jdGwpICE9IElFRUU4MDIxMV9TVFlQRV9CRUFDT04pCisJCWllZWUtPmxhc3RfcnhfcHNfdGltZSA9IGppZmZpZXM7CisKKwlzd2l0Y2ggKFdMQU5fRkNfR0VUX1NUWVBFKGhlYWRlci0+ZnJhbWVfY3RsKSkgeworCisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFU1A6CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX1JFQVNTT0NfUkVTUDoKKworCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoInJlY2VpdmVkIFtSRV1BU1NPQ0lBVElPTiBSRVNQT05TRSAoJWQpXG4iLAorCQkJCQlXTEFOX0ZDX0dFVF9TVFlQRShoZWFkZXItPmZyYW1lX2N0bCkpOworCQkJaWYgKChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSkgJiYKKwkJCQlpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRFRCAmJgorCQkJCWllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSl7CisJCQkJaWYgKDAgPT0gKGVycmNvZGU9YXNzb2NfcGFyc2Uoc2tiLCAmYWlkKSkpeworCQkJCQl1MTYgbGVmdDsKKworCQkJCQlpZWVlLT5zdGF0ZT1JRUVFODAyMTFfTElOS0VEOworCQkJCQlpZWVlLT5hc3NvY19pZCA9IGFpZDsKKwkJCQkJaWVlZS0+c29mdG1hY19zdGF0cy5yeF9hc3Nfb2srKzsKKworCQkJCQkvL3ByaW50ayhLRVJOX1dBUk5JTkcgIm5pY190eXBlID0gJXMiLCAocnhfc3RhdHMtPm5pY190eXBlID09IDEpPyJydGw4MTg3IjoicnRsODE4N0IiKTsKKwkJCQkJaWYoMSA9PSByeF9zdGF0cy0+bmljX3R5cGUpIC8vY2FyZCB0eXBlIGlzIDgxODcKKwkJCQkJeworCQkJCQkJZ290byBhc3NvY2lhdGVfY29tcGxldGU7CisJCQkJCX0KKwkJCQkJYXNzb2NfcmVzcCA9IChzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lKilza2ItPmRhdGE7CisJCQkJCWluZm9fZWxlbWVudCA9IAkmYXNzb2NfcmVzcC0+aW5mb19lbGVtZW50OworCQkJCQlsZWZ0ID0gc2tiLT5sZW4gLSAoKHZvaWQqKWluZm9fZWxlbWVudCAtICh2b2lkKilhc3NvY19yZXNwKTsKKworCQkJCQl3aGlsZSAobGVmdCA+PSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnRfaGRyKSkgeworCQkJCQkJaWYgKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudF9oZHIpICsgaW5mb19lbGVtZW50LT5sZW4gPiBsZWZ0KSB7CisJCQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiW3JlXWFzc29jaWF0ZSByZWVwb25zZSBlcnJvciEiKTsKKwkJCQkJCQlyZXR1cm4gMTsKKwkJCQkJCX0KKwkJCQkJCXN3aXRjaCAoaW5mb19lbGVtZW50LT5pZCkgeworCQkJCQkJICBjYXNlIE1GSUVfVFlQRV9HRU5FUklDOgorCQkJCQkJICAgICAgICAgSUVFRTgwMjExX0RFQlVHX1NDQU4oIk1GSUVfVFlQRV9HRU5FUklDOiAlZCBieXRlc1xuIiwgaW5mb19lbGVtZW50LT5sZW4pOworCQkJCQkJCWlmIChpbmZvX2VsZW1lbnQtPmxlbiA+PSA4ICAmJgorCQkJCQkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMF0gPT0gMHgwMCAmJgorCQkJCQkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMV0gPT0gMHg1MCAmJgorCQkJCQkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPT0gMHhmMiAmJgorCQkJCQkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbM10gPT0gMHgwMiAmJgorCQkJCQkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbNF0gPT0gMHgwMSkgeworCQkJCQkJCSAgICAvLyBOb3QgY2FyZSBhYm91dCB2ZXJzaW9uIGF0IHByZXNlbnQuCisJCQkJCQkJICAgIC8vV01NIFBhcmFtZXRlciBFbGVtZW50CisJCQkJCQkJICAgIG1lbWNweShpZWVlLT5jdXJyZW50X25ldHdvcmsud21tX3BhcmFtLCh1OCopKGluZm9fZWxlbWVudC0+ZGF0YVwKKwkJCQkJCQkJCQkgICAgKyA4KSwoaW5mb19lbGVtZW50LT5sZW4gLSA4KSk7CisKKwkJCQkJIAkgICAgICAgICAgICBpZiAoKChpZWVlLT5jdXJyZW50X25ldHdvcmsud21tX2luZm9eaW5mb19lbGVtZW50LT5kYXRhWzZdKSYgXAorCQkJCQkJCQkJCSAgICAweDBmKXx8KCFpZWVlLT5pbml0X3dtbXBhcmFtX2ZsYWcpKSB7CisJCQkJCQkgICAJICAgICAgLy9yZWZyZXNoIHBhcmFtZXRlIGVsZW1lbnQgZm9yIGN1cnJlbnQgbmV0d29yaworCQkJCQkJCSAgICAgIC8vIHVwZGF0ZSB0aGUgcmVnaXN0ZXIgcGFyYW1ldGVyIGZvciBoYXJkd2FyZQorCQkJCQkJCSAgICAgIGllZWUtPmluaXRfd21tcGFyYW1fZmxhZyA9IDE7CisJCQkJCQkJICAgICAgcXVldWVfd29yayhpZWVlLT53cSwgJmllZWUtPndtbV9wYXJhbV91cGRhdGVfd3EpOworCisJCQkJCQkgICAgICAgICAgICB9CisJCQkJCQkgICAgICAgICAgICAvL3VwZGF0ZSBpbmZvX2VsZW1lbnQgZm9yIGN1cnJlbnQgbmV0d29yaworCQkJCQkJICAgICAgICAgICAgaWVlZS0+Y3VycmVudF9uZXR3b3JrLndtbV9pbmZvICA9IGluZm9fZWxlbWVudC0+ZGF0YVs2XTsKKwkJCQkJCQl9CisJCQkJCQkJYnJlYWs7CisJCQkJCQkgIGRlZmF1bHQ6CisJCQkJCQkJLy9ub3RoaW5nIHRvIGRvIGF0IHByZXNlbnQhISEKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKworCQkJCQkJbGVmdCAtPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnRfaGRyKSArCisJCQkJCQkJaW5mb19lbGVtZW50LT5sZW47CisJCQkJCQlpbmZvX2VsZW1lbnQgPSAoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgKikKKwkJCQkJCQkmaW5mb19lbGVtZW50LT5kYXRhW2luZm9fZWxlbWVudC0+bGVuXTsKKwkJCQkJfQorCQkJCQlpZighaWVlZS0+aW5pdF93bW1wYXJhbV9mbGFnKSAvL2xlZ2FjeSBBUCwgcmVzZXQgdGhlIEFDX3h4X3BhcmFtIHJlZ2lzdGVyCisJCQkJCXsKKwkJCQkJCXF1ZXVlX3dvcmsoaWVlZS0+d3EsJmllZWUtPndtbV9wYXJhbV91cGRhdGVfd3EpOworCQkJCQkJaWVlZS0+aW5pdF93bW1wYXJhbV9mbGFnID0gMTsvL2luZGljYXRlIEFDX3h4X3BhcmFtIHVwYXRlZCBzaW5jZSBsYXN0IGFzc29jaWF0ZQorCQkJCQl9Cithc3NvY2lhdGVfY29tcGxldGU6CisJCQkJCWllZWU4MDIxMV9hc3NvY2lhdGVfY29tcGxldGUoaWVlZSk7CisJCQkJfWVsc2V7CisJCQkJCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfYXNzX2VycisrOworCQkJCQlJRUVFODAyMTFfREVCVUdfTUdNVCgKKwkJCQkJCSJBc3NvY2lhdGlvbiByZXNwb25zZSBzdGF0dXMgY29kZSAweCV4XG4iLAorCQkJCQkJZXJyY29kZSk7CisJCQkJCWllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnQoaWVlZSk7CisJCQkJfQorCQkJfQorI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwkJCWVsc2UgaWYgKChpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlKSAmJiBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3J4X2ZyYW1lX3NvZnRtYWNfb25fYXNzb2NfcnNwKQorCQkJeworCQkJCQlpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3J4X2ZyYW1lX3NvZnRtYWNfb25fYXNzb2NfcnNwKGllZWUsIHNrYik7CisJCQl9CisjZW5kaWYKKwkJCWJyZWFrOworCisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFUToKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVE6CisKKwkJCWlmICgoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUpICYmCisJCQkJaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikKKworCQkJCWllZWU4MDIxMV9yeF9hc3NvY19ycShpZWVlLCBza2IpOworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwkJCWVsc2UgaWYgKChpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlKSAmJiBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3J4X2ZyYW1lX3NvZnRtYWNfb25fYXNzb2NfcmVxKQorCQkJeworCQkJCQlpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3J4X2ZyYW1lX3NvZnRtYWNfb25fYXNzb2NfcmVxKGllZWUsIHNrYik7CisJCQl9CisjZW5kaWYKKwkJCWJyZWFrOworCisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0FVVEg6CisKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCitwcmludGsoIklFRUU4MDIxMV9TVFlQRV9BVVRIXG4iKTsKKwkJCWlmKChpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlKSAmJiBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3J4X2ZyYW1lX3NvZnRtYWNfb25fYXV0aCkKKwkJCWlmKCBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3J4X2ZyYW1lX3NvZnRtYWNfb25fYXV0aChpZWVlLCBza2IsIHJ4X3N0YXRzKSApOworI2VuZGlmCisJCQlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUpeworCQkJCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRJTkcgJiYKKwkJCQlpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpeworCisJCQkJCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiUmVjZWl2ZWQgYXV0aGVudGljYXRpb24gcmVzcG9uc2UiKTsKKworCQkJCQkJaWYgKDAgPT0gKGVycmNvZGU9YXV0aF9wYXJzZShza2IsICZjaGFsbGVuZ2UsICZjaGxlbikpKXsKKwkJCQkJCQlpZihpZWVlLT5vcGVuX3dlcCB8fCAhY2hhbGxlbmdlKXsKKwkJCQkJCQkJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRFRDsKKwkJCQkJCQkJaWVlZS0+c29mdG1hY19zdGF0cy5yeF9hdXRoX3JzX29rKys7CisKKwkJCQkJCQkJaWVlZTgwMjExX2Fzc29jaWF0ZV9zdGVwMihpZWVlKTsKKwkJCQkJCQl9ZWxzZXsKKwkJCQkJCQkJaWVlZTgwMjExX2F1dGhfY2hhbGxlbmdlKGllZWUsIGNoYWxsZW5nZSwgY2hsZW4pOworCQkJCQkJCX0KKwkJCQkJCX1lbHNleworCQkJCQkJCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfYXV0aF9yc19lcnIrKzsKKwkJCQkJCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiQXV0aGVudGljYXRpb24gcmVzcG9zZSBzdGF0dXMgY29kZSAweCV4IixlcnJjb2RlKTsKKwkJCQkJCQlpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0KGllZWUpOworCQkJCQkJfQorCisJCQkJCX1lbHNlIGlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKXsKKwkJCQkJCWllZWU4MDIxMV9yeF9hdXRoX3JxKGllZWUsIHNrYik7CisJCQkJCX0KKwkJCQl9CisJCQlicmVhazsKKworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVE6CisKKwkJCWlmICgoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19QUk9CRVJTKSAmJgorCQkJCSgoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DIHx8CisJCQkJaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikgJiYKKwkJCQlpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKSkKKworCQkJCWllZWU4MDIxMV9yeF9wcm9iZV9ycShpZWVlLCBza2IpOworCQkJYnJlYWs7CisKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfRElTQVNTT0M6CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0RFQVVUSDoKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCitwcmludGsoIklFRUU4MDIxMV9TVFlQRV9ERUFVVEhcbiIpOworCQlpZigoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkgJiYgaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9yeF9mcmFtZV9zb2Z0bWFjX29uX2RlYXV0aCkKKwkJaWYoIGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfcnhfZnJhbWVfc29mdG1hY19vbl9kZWF1dGgoaWVlZSwgc2tiLCByeF9zdGF0cykgKQk7CisjZW5kaWYKKwkJCS8qIEZJWE1FIGZvciBub3cgcmVwZWF0IGFsbCB0aGUgYXNzb2NpYXRpb24gcHJvY2VkdXJlCisJCQkqIGJvdGggZm9yIGRpc2Fzc29jaWF0aW9uIGFuZCBkZWF1dGhlbnRpY2F0aW9uCisJCQkqLworCQkJaWYgKChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSkgJiYKKwkJCQkoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkgJiYKKwkJCQkoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSAmJgorCQkJCSghbWVtY21wKGhlYWRlci0+YWRkcjIsaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLEVUSF9BTEVOKSkpeworCQkJCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0FTU09DSUFUSU5HOworCQkJCWllZWUtPnNvZnRtYWNfc3RhdHMucmVhc3NvYysrOworCisJCQkJLy9ub3RpZnlfd3hfYXNzb2NfZXZlbnQoaWVlZSk7ICAvL1lKLGRlbCwwODA4MjgsIGRvIG5vdCBub3RpZnkgb3MgaGVyZQorCQkJCXF1ZXVlX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5hc3NvY2lhdGVfcHJvY2VkdXJlX3dxKTsKKwkJCX0KKworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtMTsKKwkJCWJyZWFrOworCX0KKworCS8vZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwlyZXR1cm4gMDsKK30KKworCisKKy8qIGZvbGxvd2luZyBhcmUgZm9yIGEgc2ltcGxpZXIgVFggcXVldWUgbWFuYWdlbWVudC4KKyAqIEluc3RlYWQgb2YgdXNpbmcgbmV0aWZfW3N0b3Avd2FrZV1fcXVldWUgdGhlIGRyaXZlcgorICogd2lsbCB1c2VzIHRoZXNlIHR3byBmdW5jdGlvbiAocGx1cyBhIHJlc2V0IG9uZSksIHRoYXQKKyAqIHdpbGwgaW50ZXJuYWxseSB1c2VzIHRoZSBrZXJuZWwgbmV0aWZfKiBhbmQgdGFrZXMKKyAqIGNhcmUgb2YgdGhlIGllZWU4MDIuMTEgZnJhZ21lbnRhdGlvbi4KKyAqIFNvIHRoZSBkcml2ZXIgcmVjZWl2ZXMgYSBmcmFnbWVudCBwZXIgdGltZSBhbmQgbWlnaHQKKyAqIGNhbGwgdGhlIHN0b3AgZnVuY3Rpb24gd2hlbiBpdCB3YW50IHdpdGhvdXQgdGFrZSBjYXJlCisgKiB0byBoYXZlIGVub3VnaHQgcm9vbSB0byBUWCBhbiBlbnRpcmUgcGFja2V0LgorICogVGhpcyBtaWdodCBiZSB1c2VmdWwgaWYgZWFjaCBmcmFnbWVudCBuZWVkIGl0J3Mgb3duCisgKiBkZXNjcmlwdG9yLCB0aHVzIGp1c3Qga2VlcCBhIHRvdGFsIGZyZWUgbWVtb3J5ID4gdGhhbgorICogdGhlIG1heCBmcmFnbWVudGF0aW9uIHRyZXNob2xkIGlzIG5vdCBlbm91Z2h0Li4gSWYgdGhlCisgKiBpZWVlODAyLjExIHN0YWNrIHBhc3NlZCBhIFRYQiBzdHJ1Y3QgdGhlbiB5b3UgbmVlZGVkCisgKiB0byBrZWVwIE4gZnJlZSBkZXNjcmlwdG9ycyB3aGVyZQorICogTiA9IE1BWF9QQUNLRVRfU0laRSAvIE1JTl9GUkFHX1RSRVNIT0xECisgKiBJbiB0aGlzIHdheSB5b3UgbmVlZCBqdXN0IG9uZSBhbmQgdGhlIDgwMi4xMSBzdGFjaworICogd2lsbCB0YWtlIGNhcmUgb2YgYnVmZmVyaW5nIGZyYWdtZW50cyBhbmQgcGFzcyB0aGVtIHRvCisgKiB0byB0aGUgZHJpdmVyIGxhdGVyLCB3aGVuIGl0IHdha2VzIHRoZSBxdWV1ZS4KKyAqLworCit2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3htaXQoc3RydWN0IGllZWU4MDIxMV90eGIgKnR4Yiwgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisKKworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50ICBpOworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlpbnQgcmF0ZSA9IGllZWUtPnJhdGU7CisjZW5kaWYKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLGZsYWdzKTsKKwkjaWYgMAorCWlmKGllZWUtPnF1ZXVlX3N0b3ApeworCQlJRUVFODAyMTFETUVTRygiRUU6IElFRUUgaGFyZF9zdGFydF94bWl0IGludm9rZWQgd2hlbiBrZXJuZWwgcXVldWUgc2hvdWxkIGJlIHN0b3BwZWQiKTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShpZWVlLT5kZXYpOworCQlpZWVlLT5pZWVlX3N0YXRzLnN3dHhzdG9wKys7CisJCS8vZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJZXJyID0gMTsKKwkJZ290byBleGl0OworCX0KKworCWllZWUtPnN0YXRzLnR4X2J5dGVzKz1za2ItPmxlbjsKKworCisJdHhiPWllZWU4MDIxMV9za2JfdG9fdHhiKGllZWUsc2tiKTsKKworCisJaWYodHhiPT1OVUxMKXsKKwkJSUVFRTgwMjExRE1FU0coIldXOiBJRUVFIHN0YWNrIGZhaWxlZCB0byBwcm92aWRlIHR4YiIpOworCQkvL2Rldl9rZnJlZV9za2JfYW55KHNrYik7CisJCWVyciA9IDE7CisJCWdvdG8gZXhpdDsKKwl9CisJI2VuZGlmCisKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJaWYoKGllZWUtPml3X21vZGUgPT0gaWVlZS0+aXdfZXh0X21vZGUpICYmIGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfc29mdG1hY194bWl0X2dldF9yYXRlICYmIHR4Yi0+bnJfZnJhZ3MpCisJeworCQlyYXRlID0gaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV9zb2Z0bWFjX3htaXRfZ2V0X3JhdGUoaWVlZSwgdHhiLT5mcmFnbWVudHNbMF0pOworCX0KKyNlbmRpZgorCS8qIGNhbGxlZCB3aXRoIDJuZCBwYXJtIDAsIG5vIHR4IG1nbXQgbG9jayByZXF1aXJlZCAqLworCWllZWU4MDIxMV9zdGFfd2FrZXVwKGllZWUsMCk7CisKKwlmb3IoaSA9IDA7IGkgPCB0eGItPm5yX2ZyYWdzOyBpKyspIHsKKworCQlpZiAoaWVlZS0+cXVldWVfc3RvcCl7CisJCQlpZWVlLT50eF9wZW5kaW5nLnR4YiA9IHR4YjsKKwkJCWllZWUtPnR4X3BlbmRpbmcuZnJhZyA9IGk7CisJCQlnb3RvIGV4aXQ7CisJCX1lbHNleworCQkJaWVlZS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdCgKKwkJCQl0eGItPmZyYWdtZW50c1tpXSwKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJCQkJaWVlZS0+ZGV2LCByYXRlKTsKKyNlbHNlCisJCQkJaWVlZS0+ZGV2LGllZWUtPnJhdGUpOworI2VuZGlmCisJCQkJLy8oaSsxKTx0eGItPm5yX2ZyYWdzKTsKKwkJCWllZWUtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCWllZWUtPnN0YXRzLnR4X2J5dGVzICs9IHR4Yi0+ZnJhZ21lbnRzW2ldLT5sZW47CisJCQlpZWVlLT5kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJfQorCX0KKworCWllZWU4MDIxMV90eGJfZnJlZSh0eGIpOworCisJZXhpdDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLGZsYWdzKTsKKworfQorCisvKiBjYWxsZWQgd2l0aCBpZWVlLT5sb2NrIGFjcXVpcmVkICovCit2b2lkIGllZWU4MDIxMV9yZXN1bWVfdHgoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaW50IGk7CisJZm9yKGkgPSBpZWVlLT50eF9wZW5kaW5nLmZyYWc7IGkgPCBpZWVlLT50eF9wZW5kaW5nLnR4Yi0+bnJfZnJhZ3M7IGkrKykgeworCisJCWlmIChpZWVlLT5xdWV1ZV9zdG9wKXsKKwkJCWllZWUtPnR4X3BlbmRpbmcuZnJhZyA9IGk7CisJCQlyZXR1cm47CisJCX1lbHNleworCisJCQlpZWVlLT5zb2Z0bWFjX2RhdGFfaGFyZF9zdGFydF94bWl0KAorCQkJCWllZWUtPnR4X3BlbmRpbmcudHhiLT5mcmFnbWVudHNbaV0sCisJCQkJaWVlZS0+ZGV2LGllZWUtPnJhdGUpOworCQkJCS8vKGkrMSk8aWVlZS0+dHhfcGVuZGluZy50eGItPm5yX2ZyYWdzKTsKKwkJCWllZWUtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCWllZWUtPmRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQl9CisJfQorCisKKwlpZWVlODAyMTFfdHhiX2ZyZWUoaWVlZS0+dHhfcGVuZGluZy50eGIpOworCWllZWUtPnR4X3BlbmRpbmcudHhiID0gTlVMTDsKK30KKworCit2b2lkIGllZWU4MDIxMV9yZXNldF9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssZmxhZ3MpOworCWluaXRfbWdtdF9xdWV1ZShpZWVlKTsKKwlpZiAoaWVlZS0+dHhfcGVuZGluZy50eGIpeworCQlpZWVlODAyMTFfdHhiX2ZyZWUoaWVlZS0+dHhfcGVuZGluZy50eGIpOworCQlpZWVlLT50eF9wZW5kaW5nLnR4YiA9IE5VTEw7CisJfQorCWllZWUtPnF1ZXVlX3N0b3AgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssZmxhZ3MpOworCit9CisKK3ZvaWQgaWVlZTgwMjExX3dha2VfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICpoZWFkZXI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jayxmbGFncyk7CisJaWYgKCEgaWVlZS0+cXVldWVfc3RvcCkgZ290byBleGl0OworCisJaWVlZS0+cXVldWVfc3RvcCA9IDA7CisKKwlpZihpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRSl7CisJCXdoaWxlICghaWVlZS0+cXVldWVfc3RvcCAmJiAoc2tiID0gZGVxdWV1ZV9tZ210KGllZWUpKSl7CisKKwkJCWhlYWRlciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKikgc2tiLT5kYXRhOworCisJCQloZWFkZXItPnNlcV9jdGwgPSBjcHVfdG9fbGUxNihpZWVlLT5zZXFfY3RybFswXSA8PCA0KTsKKworCQkJaWYgKGllZWUtPnNlcV9jdHJsWzBdID09IDB4RkZGKQorCQkJCWllZWUtPnNlcV9jdHJsWzBdID0gMDsKKwkJCWVsc2UKKwkJCQlpZWVlLT5zZXFfY3RybFswXSsrOworCisJCQkvL3ByaW50ayhLRVJOX0FMRVJUICJpZWVlODAyMTFfd2FrZV9xdWV1ZSBcbiIpOworCQkJaWVlZS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdChza2IsaWVlZS0+ZGV2LGllZWUtPmJhc2ljX3JhdGUpOworCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCisJCX0KKwl9CisJaWYgKCFpZWVlLT5xdWV1ZV9zdG9wICYmIGllZWUtPnR4X3BlbmRpbmcudHhiKQorCQlpZWVlODAyMTFfcmVzdW1lX3R4KGllZWUpOworCisJaWYgKCFpZWVlLT5xdWV1ZV9zdG9wICYmIG5ldGlmX3F1ZXVlX3N0b3BwZWQoaWVlZS0+ZGV2KSl7CisJCWllZWUtPnNvZnRtYWNfc3RhdHMuc3d0eGF3YWtlKys7CisJCW5ldGlmX3dha2VfcXVldWUoaWVlZS0+ZGV2KTsKKwl9CisKK2V4aXQgOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssZmxhZ3MpOworfQorCisKK3ZvaWQgaWVlZTgwMjExX3N0b3BfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJLy91bnNpZ25lZCBsb25nIGZsYWdzOworCS8vc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssZmxhZ3MpOworCisJaWYgKCEgbmV0aWZfcXVldWVfc3RvcHBlZChpZWVlLT5kZXYpKXsKKwkJbmV0aWZfc3RvcF9xdWV1ZShpZWVlLT5kZXYpOworCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnN3dHhzdG9wKys7CisJfQorCWllZWUtPnF1ZXVlX3N0b3AgPSAxOworCS8vc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jayxmbGFncyk7CisKK30KKworCitpbmxpbmUgdm9pZCBpZWVlODAyMTFfcmFuZG9taXplX2NlbGwoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisKKwlnZXRfcmFuZG9tX2J5dGVzKGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pOworCisJLyogYW4gSUJTUyBjZWxsIGFkZHJlc3MgbXVzdCBoYXZlIHRoZSB0d28gbGVzcyBzaWduaWZpY2FudAorCSAqIGJpdHMgb2YgdGhlIGZpcnN0IGJ5dGUgPSAyCisJICovCisJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkWzBdICY9IH4weDAxOworCWllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZFswXSB8PSAweDAyOworfQorCisvKiBjYWxsZWQgaW4gdXNlciBjb250ZXh0IG9ubHkgKi8KK3ZvaWQgaWVlZTgwMjExX3N0YXJ0X21hc3Rlcl9ic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWVlZS0+YXNzb2NfaWQgPSAxOworCisJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9PSAwKXsKKwkJc3RybmNweShpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwKKwkJCUlFRUU4MDIxMV9ERUZBVUxUX1RYX0VTU0lELAorCQkJSVdfRVNTSURfTUFYX1NJWkUpOworCisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9IHN0cmxlbihJRUVFODAyMTFfREVGQVVMVF9UWF9FU1NJRCk7CisJCWllZWUtPnNzaWRfc2V0ID0gMTsKKwl9CisKKwltZW1jcHkoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisKKwlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKwlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9MSU5LRUQ7CisJaWVlZS0+bGlua19jaGFuZ2UoaWVlZS0+ZGV2KTsKKwlub3RpZnlfd3hfYXNzb2NfZXZlbnQoaWVlZSk7CisKKwlpZiAoaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZSkKKwkJaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZShpZWVlLT5kZXYpOworCisJbmV0aWZfY2Fycmllcl9vbihpZWVlLT5kZXYpOworfQorCit2b2lkIGllZWU4MDIxMV9zdGFydF9tb25pdG9yX21vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWYoaWVlZS0+cmF3X3R4KXsKKworCQlpZiAoaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZSkKKwkJCWllZWUtPmRhdGFfaGFyZF9yZXN1bWUoaWVlZS0+ZGV2KTsKKworCQluZXRpZl9jYXJyaWVyX29uKGllZWUtPmRldik7CisJfQorfQorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKK3ZvaWQgaWVlZTgwMjExX3N0YXJ0X2lic3Nfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkZWxheWVkX3dvcmssIHdvcmspOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKGR3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgc3RhcnRfaWJzc193cSk7CisjZWxzZQordm9pZCBpZWVlODAyMTFfc3RhcnRfaWJzc193cShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKyNlbmRpZgorCisJLyogaXdjb25maWcgbW9kZSBhZC1ob2Mgd2lsbCBzY2hlZHVsZSB0aGlzIGFuZCByZXR1cm4KKwkgKiBvbiB0aGUgb3RoZXIgaGFuZCB0aGlzIHdpbGwgYmxvY2sgZnVydGhlciBpd2NvbmZpZyBTRVQKKwkgKiBvcGVyYXRpb25zIGJlY2F1c2Ugb2YgdGhlIHd4X3NlbSBob2xkLgorCSAqIEFueXdheSBzb21lIG1vc3Qgc2V0IG9wZXJhdGlvbnMgc2V0IGEgZmxhZyB0byBzcGVlZC11cAorCSAqIChhYm9ydCkgdGhpcyB3cSAod2hlbiBzeW5jcm8gc2Nhbm5pbmcpIGJlZm9yZSBzbGVlcGluZworCSAqIG9uIHRoZSBzZW1hcGhvcmUKKwkgKi8KKworCWRvd24oJmllZWUtPnd4X3NlbSk7CisKKworCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPT0gMCl7CisJCXN0cmNweShpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCxJRUVFODAyMTFfREVGQVVMVF9UWF9FU1NJRCk7CisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9IHN0cmxlbihJRUVFODAyMTFfREVGQVVMVF9UWF9FU1NJRCk7CisJCWllZWUtPnNzaWRfc2V0ID0gMTsKKwl9CisKKwkvKiBjaGVjayBpZiB3ZSBoYXZlIHRoaXMgY2VsbCBpbiBvdXIgbmV0d29yayBsaXN0ICovCisJaWVlZTgwMjExX3NvZnRtYWNfY2hlY2tfYWxsX25ldHMoaWVlZSk7CisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJaWYoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSykKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPSAxMDsKKyNlbmRpZgorCS8qIGlmIG5vdCB0aGVuIHRoZSBzdGF0ZSBpcyBub3QgbGlua2VkLiBNYXliZSB0aGUgdXNlciBzd2l0aGNlZCB0bworCSAqIGFkLWhvYyBtb2RlIGp1c3QgYWZ0ZXIgYmVpbmcgaW4gbW9uaXRvciBtb2RlLCBvciBqdXN0IGFmdGVyCisJICogYmVpbmcgdmVyeSBmZXcgdGltZSBpbiBtYW5hZ2VkIG1vZGUgKHNvIHRoZSBjYXJkIGhhdmUgaGFkIG5vCisJICogdGltZSB0byBzY2FuIGFsbCB0aGUgY2hhbnMuLikgb3Igd2UgaGF2ZSBqdXN0IHJ1biB1cCB0aGUgaWZhY2UKKwkgKiBhZnRlciBzZXR0aW5nIGFkLWhvYyBtb2RlLiBTbyB3ZSBoYXZlIHRvIGdpdmUgYW5vdGhlciB0cnkuLgorCSAqIEhlcmUsIGluIGlic3MgbW9kZSwgc2hvdWxkIGJlIHNhZmUgdG8gZG8gdGhpcyB3aXRob3V0IGV4dHJhIGNhcmUKKwkgKiAoaW4gYnNzIG1vZGUgd2UgaGFkIHRvIG1ha2Ugc3VyZSBuby1vbmUgdHJ5ZWQgdG8gYXNzb2NpYXRlIHdoZW4KKwkgKiB3ZSBoYWQganVzdCBjaGVja2VkIHRoZSBpZWVlLT5zdGF0ZSBhbmQgd2Ugd2FzIGdvaW5nIHRvIHN0YXJ0IHRoZQorCSAqIHNjYW4pIGJlYWNhdXNlIGluIGlic3MgbW9kZSB0aGUgaWVlZTgwMjExX25ld19uZXQgZnVuY3Rpb24sIHdoZW4KKwkgKiBmaW5kcyBhIGdvb2QgbmV0LCBqdXN0IHNldCB0aGUgaWVlZS0+c3RhdGUgdG8gSUVFRTgwMjExX0xJTktFRCwKKwkgKiBzbywgYXQgd29yc3QsIHdlIHdhc3RlIGEgYml0IG9mIHRpbWUgdG8gaW5pdGlhdGUgYW4gdW5uZWVkZWQgc3luY3JvCisJICogc2NhbiwgdGhhdCB3aWxsIHN0b3AgYXQgdGhlIGZpcnN0IHJvdW5kIGJlY2F1c2UgaXQgc2VlcyB0aGUgc3RhdGUKKwkgKiBhc3NvY2lhdGVkLgorCSAqLworCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKQorCQlpZWVlODAyMTFfc3RhcnRfc2Nhbl9zeW5jcm8oaWVlZSk7CisKKwkvKiB0aGUgbmV0d29yayBkZWZpbml0aXZlbHkgaXMgbm90IGhlcmUuLiBjcmVhdGUgYSBuZXcgY2VsbCAqLworCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKXsKKwkJcHJpbnRrKCJjcmVhdGluZyBuZXcgSUJTUyBjZWxsXG4iKTsKKwkJaWYoIWllZWUtPndhcF9zZXQpCisJCQlpZWVlODAyMTFfcmFuZG9taXplX2NlbGwoaWVlZSk7CisKKwkJaWYoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTil7CisKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19sZW4gPSA0OworCisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNbMF0gPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX0NDS19SQVRFXzFNQjsKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc1sxXSA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfQ0NLX1JBVEVfMk1COworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzWzJdID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9DQ0tfUkFURV81TUI7CisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNbM10gPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX0NDS19SQVRFXzExTUI7CisKKwkJfWVsc2UKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19sZW4gPSAwOworCisJCWlmKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OKXsKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leF9sZW4gPSA4OworCisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhbMF0gPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV82TUI7CisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhbMV0gPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV85TUI7CisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhbMl0gPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV8xMk1COworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzNdID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfMThNQjsKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leFs0XSA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUI7CisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhbNV0gPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV8zNk1COworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzZdID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQjsKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leFs3XSA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUI7CisKKwkJCWllZWUtPnJhdGUgPSA1NDA7CisJCX1lbHNleworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4X2xlbiA9IDA7CisJCQlpZWVlLT5yYXRlID0gMTEwOworCQl9CisKKwkJLy8gQnkgZGVmYXVsdCwgV01NIGZ1bmN0aW9uIHdpbGwgYmUgZGlzYWJsZWQgaW4gSUJTUyBtb2RlCisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5Rb1NfRW5hYmxlID0gMDsKKworCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuYXRpbV93aW5kb3cgPSAwOworCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuY2FwYWJpbGl0eSA9IFdMQU5fQ0FQQUJJTElUWV9JQlNTOworCQlpZihpZWVlLT5zaG9ydF9zbG90KQorCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNhcGFiaWxpdHkgfD0gV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1Q7CisKKwl9CisKKwlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9MSU5LRUQ7CisJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisJaWVlZS0+bGlua19jaGFuZ2UoaWVlZS0+ZGV2KTsKKworCW5vdGlmeV93eF9hc3NvY19ldmVudChpZWVlKTsKKworCWllZWU4MDIxMV9zdGFydF9zZW5kX2JlYWNvbnMoaWVlZSk7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiYWZ0ZXIgc2VuZGluZyBiZWFjb24gcGFja2V0IVxuIik7CisKKwlpZiAoaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZSkKKwkJaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZShpZWVlLT5kZXYpOworCisJbmV0aWZfY2Fycmllcl9vbihpZWVlLT5kZXYpOworCisJdXAoJmllZWUtPnd4X3NlbSk7Cit9CitpbmxpbmUgdm9pZCBpZWVlODAyMTFfc3RhcnRfaWJzcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlxdWV1ZV9kZWxheWVkX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5zdGFydF9pYnNzX3dxLCAxMDApOworfQorCisvKiB0aGlzIGlzIGNhbGxlZCBvbmx5IGluIHVzZXIgY29udGV4dCwgd2l0aCB3eF9zZW0gaGVsZCAqLwordm9pZCBpZWVlODAyMTFfc3RhcnRfYnNzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCS8vCisJLy8gUmVmOiA4MDIuMTFkIDExLjEuMy4zCisJLy8gU1RBIHNoYWxsIG5vdCBzdGFydCBhIEJTUyB1bmxlc3MgcHJvcGVybHkgZm9ybWVkIEJlYWNvbiBmcmFtZSBpbmNsdWRpbmcgYSBDb3VudHJ5IElFLgorCS8vCisJaWYoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSAmJiAhSVNfQ09VTlRSWV9JRV9WQUxJRChpZWVlKSkKKwl7CisJCWlmKCEgaWVlZS0+Ykdsb2JhbERvbWFpbikKKwkJeworCQkJcmV0dXJuOworCQl9CisJfQorI2VuZGlmCisJLyogY2hlY2sgaWYgd2UgaGF2ZSBhbHJlYWR5IGZvdW5kIHRoZSBuZXQgd2UKKwkgKiBhcmUgaW50ZXJlc3RlZCBpbiAoaWYgYW55KS4KKwkgKiBpZiBub3QgKHdlIGFyZSBkaXNhc3NvY2lhdGVkIGFuZCB3ZSBhcmUgbm90CisJICogaW4gYXNzb2NpYXRpbmcgLyBhdXRoZW50aWNhdGluZyBwaGFzZSkgc3RhcnQgdGhlIGJhY2tncm91bmQgc2Nhbm5pbmcuCisJICovCisJaWVlZTgwMjExX3NvZnRtYWNfY2hlY2tfYWxsX25ldHMoaWVlZSk7CisKKwkvKiBlbnN1cmUgbm8tb25lIHN0YXJ0IGFuIGFzc29jaWF0aW5nIHByb2Nlc3MgKHRodXMgc2V0dGluZworCSAqIHRoZSBpZWVlLT5zdGF0ZSB0byBpZWVlODAyMTFfQVNTT0NJQVRJTkcpIHdoaWxlIHdlCisJICogaGF2ZSBqdXN0IGNoZWtlZCBpdCBhbmQgd2UgYXJlIGdvaW5nIHRvIGVuYWJsZSBzY2FuLgorCSAqIFRoZSBpZWVlODAyMTFfbmV3X25ldCBmdW5jdGlvbiBpcyBhbHdheXMgY2FsbGVkIHdpdGgKKwkgKiBsb2NrIGhlbGQgKGZyb20gYm90aCBpZWVlODAyMTFfc29mdG1hY19jaGVja19hbGxfbmV0cyBhbmQKKwkgKiB0aGUgcnggcGF0aCksIHNvIHdlIGNhbm5vdCBiZSBpbiB0aGUgbWlkZGxlIG9mIHN1Y2ggZnVuY3Rpb24KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisvLyNpZmRlZiBFTkFCTEVfSVBTCisvLwlwcmludGsoInN0YXJ0IGJzcyBFTkFCTEVfSVBTXG4iKTsKKy8vI2Vsc2UKKwlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSyl7CisJCWllZWUtPmFjdHNjYW5uaW5nID0gdHJ1ZTsKKwkJaWVlZTgwMjExX3N0YXJ0X3NjYW4oaWVlZSk7CisJfQorLy8jZW5kaWYKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qIGNhbGxlZCBvbmx5IGluIHVzZXJzcGFjZSBjb250ZXh0ICovCit2b2lkIGllZWU4MDIxMV9kaXNhc3NvY2lhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJbmV0aWZfY2Fycmllcl9vZmYoaWVlZS0+ZGV2KTsKKworCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFKQorCQkJaWVlZTgwMjExX3Jlc2V0X3F1ZXVlKGllZWUpOworCisJaWYgKGllZWUtPmRhdGFfaGFyZF9zdG9wKQorCQkJaWVlZS0+ZGF0YV9oYXJkX3N0b3AoaWVlZS0+ZGV2KTsKKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwlpZihJU19ET1QxMURfRU5BQkxFKGllZWUpKQorCQlEb3QxMWRfUmVzZXQoaWVlZSk7CisjZW5kaWYKKwlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9OT0xJTks7CisJaWVlZS0+bGlua19jaGFuZ2UoaWVlZS0+ZGV2KTsKKwlub3RpZnlfd3hfYXNzb2NfZXZlbnQoaWVlZSk7CisKK30KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkpCit2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfcmV0cnlfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkZWxheWVkX3dvcmssIHdvcmspOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKGR3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgYXNzb2NpYXRlX3JldHJ5X3dxKTsKKyNlbHNlCit2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfcmV0cnlfd3Eoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisjZW5kaWYKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWRvd24oJmllZWUtPnd4X3NlbSk7CisJaWYoIWllZWUtPnByb3RvX3N0YXJ0ZWQpCisJCWdvdG8gZXhpdDsKKwlpZihpZWVlLT5zdGF0ZSAhPSBJRUVFODAyMTFfQVNTT0NJQVRJTkdfUkVUUlkpCisJCWdvdG8gZXhpdDsKKwkvKiB1bnRpbCB3ZSBkbyBub3Qgc2V0IHRoZSBzdGF0ZSB0byBJRUVFODAyMTFfTk9MSU5LCisJKiB0aGVyZSBhcmUgbm8gcG9zc2liaWxpdHkgdG8gaGF2ZSBzb21lb25lIGVsc2UgdHJ5aW5nCisJKiB0byBzdGFydCBhbiBhc3NvY2lhdGlvbiBwcm9jZHVyZSAod2UgZ2V0IGhlcmUgd2l0aAorCSogaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfQVNTT0NJQVRJTkcpLgorCSogV2hlbiB3ZSBzZXQgdGhlIHN0YXRlIHRvIElFRUU4MDIxMV9OT0xJTksgaXQgaXMgcG9zc2libGUKKwkqIHRoYXQgdGhlIFJYIHBhdGggcnVuIGFuIGF0dGVtcHQgdG8gYXNzb2NpYXRlLCBidXQKKwkqIGJvdGggaWVlZTgwMjExX3NvZnRtYWNfY2hlY2tfYWxsX25ldHMgYW5kIHRoZQorCSogUlggcGF0aCB3b3JrcyB3aXRoIGllZWUtPmxvY2sgaGVsZCBzbyB0aGVyZSBhcmUgbm8KKwkqIHByb2JsZW1zLiBJZiB3ZSBhcmUgc3RpbGwgZGlzYXNzb2NpYXRlZCB0aGVuIHN0YXJ0IGEgc2Nhbi4KKwkqIHRoZSBsb2NrIGhlcmUgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSBubyBvbmUgdHJ5IHRvIHN0YXJ0CisJKiBhbiBhc3NvY2lhdGlvbiBwcm9jZWR1cmUgd2hlbiB3ZSBoYXZlIGp1c3QgY2hlY2tlZCB0aGUKKwkqIHN0YXRlIGFuZCB3ZSBhcmUgZ29pbmcgdG8gc3RhcnQgdGhlIHNjYW4uCisJKi8KKwlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9OT0xJTks7CisJaWVlZS0+YmVpbnJldHJ5ID0gdHJ1ZTsKKwlpZWVlODAyMTFfc29mdG1hY19jaGVja19hbGxfbmV0cyhpZWVlKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlpZihpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKXsKKwkJaWVlZS0+YmVpbnJldHJ5ID0gZmFsc2U7CisJCWllZWUtPmFjdHNjYW5uaW5nID0gdHJ1ZTsKKwkJaWVlZTgwMjExX3N0YXJ0X3NjYW4oaWVlZSk7CisJfQorCS8vWUosYWRkLDA4MDgyOCwgbm90aWZ5IG9zIGhlcmUKKwlpZihpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKQorCXsKKwkJbm90aWZ5X3d4X2Fzc29jX2V2ZW50KGllZWUpOworCX0KKwkvL1lKLGFkZCwwODA4MjgsZW5kCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCitleGl0OgorCXVwKCZpZWVlLT53eF9zZW0pOworfQorCitzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2dldF9iZWFjb25fKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXU4IGJyb2FkY2FzdF9hZGRyW10gPSB7MHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmZ9OworCisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSAqYjsKKworLy9yegorI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlpZigoaWVlZS0+aXdfbW9kZSA9PSBpZWVlLT5pd19leHRfbW9kZSkgJiYgaWVlZS0+ZXh0X3BhdGNoX2dldF9iZWFjb25fZ2V0X3Byb2JlcnNwICkKKwkJc2tiID0gaWVlZS0+ZXh0X3BhdGNoX2dldF9iZWFjb25fZ2V0X3Byb2JlcnNwKGllZWUsIGJyb2FkY2FzdF9hZGRyLCAmKGllZWUtPmN1cnJlbnRfbmV0d29yaykpOworCWVsc2UKKwkJc2tiID0gaWVlZTgwMjExX3Byb2JlX3Jlc3AoaWVlZSwgYnJvYWRjYXN0X2FkZHIpOworI2Vsc2UKKwlza2IgPSBpZWVlODAyMTFfcHJvYmVfcmVzcChpZWVlLCBicm9hZGNhc3RfYWRkcik7CisjZW5kaWYKKy8vCisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCisJYiA9IChzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlICopIHNrYi0+ZGF0YTsKKwliLT5oZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0JFQUNPTik7CisKKwlyZXR1cm4gc2tiOworCit9CisKK3N0cnVjdCBza19idWZmICppZWVlODAyMTFfZ2V0X2JlYWNvbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UgKmI7CisKKwlza2IgPSBpZWVlODAyMTFfZ2V0X2JlYWNvbl8oaWVlZSk7CisJaWYoIXNrYikKKwkJcmV0dXJuIE5VTEw7CisKKwliID0gKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UgKikgc2tiLT5kYXRhOworCWItPmhlYWRlci5zZXFfY3RybCA9IGNwdV90b19sZTE2KGllZWUtPnNlcV9jdHJsWzBdIDw8IDQpOworCisJaWYgKGllZWUtPnNlcV9jdHJsWzBdID09IDB4RkZGKQorCQlpZWVlLT5zZXFfY3RybFswXSA9IDA7CisJZWxzZQorCQlpZWVlLT5zZXFfY3RybFswXSsrOworCisJcmV0dXJuIHNrYjsKK30KKwordm9pZCBpZWVlODAyMTFfc29mdG1hY19zdG9wX3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWllZWUtPnN5bmNfc2Nhbl9odXJyeXVwID0gMTsKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCWllZWU4MDIxMV9zdG9wX3Byb3RvY29sKGllZWUpOworCXVwKCZpZWVlLT53eF9zZW0pOworfQorCisKK3ZvaWQgaWVlZTgwMjExX3N0b3BfcHJvdG9jb2woc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWYgKCFpZWVlLT5wcm90b19zdGFydGVkKQorCQlyZXR1cm47CisKKwlpZWVlLT5wcm90b19zdGFydGVkID0gMDsKKworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwlpZihpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3N0b3BfcHJvdG9jb2wpCisJCWllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfc3RvcF9wcm90b2NvbChpZWVlKTsKKy8vaWYgY2FsbCBxdWV1ZV9kZWxheWVkX3dvcmssY2FuIGNhbGwgdGhpcyxvciBkbyBub3RoaW5nLi4KKy8vZWRpdCBieSBsYXdyZW5jZSwyMDA3MTExOAorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQorLy8JY2FuY2VsX2RlbGF5ZWRfd29yaygmaWVlZS0+ZXh0X3N0b3Bfc2Nhbl93cSk7CisvLwljYW5jZWxfZGVsYXllZF93b3JrKCZpZWVlLT5leHRfc2VuZF9iZWFjb25fd3EpOworI2VuZGlmCisjZW5kaWYgLy8gX1JUTDgxODdfRVhUX1BBVENIXworCisJaWVlZTgwMjExX3N0b3Bfc2VuZF9iZWFjb25zKGllZWUpOworCWlmKChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpJiYoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkpIHsKKwkJU2VuZERpc2Fzc29jaWF0aW9uKGllZWUsTlVMTCxXTEFOX1JFQVNPTl9ESVNBU1NPQ19TVEFfSEFTX0xFRlQpOworCX0KKwlkZWxfdGltZXJfc3luYygmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKTsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZpZWVlLT5hc3NvY2lhdGVfcmV0cnlfd3EpOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmllZWUtPnN0YXJ0X2lic3Nfd3EpOworCWllZWU4MDIxMV9zdG9wX3NjYW4oaWVlZSk7CisKKwlpZWVlODAyMTFfZGlzYXNzb2NpYXRlKGllZWUpOworfQorCit2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3N0YXJ0X3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWllZWUtPnN5bmNfc2Nhbl9odXJyeXVwID0gMDsKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCWllZWU4MDIxMV9zdGFydF9wcm90b2NvbChpZWVlKTsKKwl1cCgmaWVlZS0+d3hfc2VtKTsKK30KKwordm9pZCBpZWVlODAyMTFfc3RhcnRfcHJvdG9jb2woc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJc2hvcnQgY2ggPSAwOworIAlpbnQgaSA9IDA7CisKKwlpZiAoaWVlZS0+cHJvdG9fc3RhcnRlZCkKKwkJcmV0dXJuOworCisJaWVlZS0+cHJvdG9fc3RhcnRlZCA9IDE7CisKKwlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPT0gMCl7CisJCWRveworCQkJY2grKzsKKwkJCWlmIChjaCA+IE1BWF9DSEFOTkVMX05VTUJFUikKKwkJCQlyZXR1cm47IC8qIG5vIGNoYW5uZWwgZm91bmQgKi8KKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwkJfXdoaWxlKCFHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwW2NoXSk7CisjZWxzZQorCQl9d2hpbGUoIWllZWUtPmNoYW5uZWxfbWFwW2NoXSk7CisjZW5kaWYKKworCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9IGNoOworCX0KKworCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsID09IDApCisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwgPSAxMDA7CisJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKworICAgICAgIAlmb3IoaSA9IDA7IGkgPCAxNzsgaSsrKSB7CisJICBpZWVlLT5sYXN0X3J4c2VxX251bVtpXSA9IC0xOworCSAgaWVlZS0+bGFzdF9yeGZyYWdfbnVtW2ldID0gLTE7CisJICBpZWVlLT5sYXN0X3BhY2tldF90aW1lW2ldID0gMDsKKwl9CisKKwlpZWVlLT5pbml0X3dtbXBhcmFtX2ZsYWcgPSAwOy8vcmVpbml0aWFsaXplIEFDX3h4X1BBUkFNIHJlZ2lzdGVycy4KKworCisJLyogaWYgdGhlIHVzZXIgc2V0IHRoZSBNQUMgb2YgdGhlIGFkLWhvYyBjZWxsIGFuZCB0aGVuCisJICogc3dpdGNoIHRvIG1hbmFnZWQgbW9kZSwgc2hhbGwgd2UgIG1ha2Ugc3VyZSB0aGF0IGFzc29jaWF0aW9uCisJICogYXR0ZW1wdHMgZG9lcyBub3QgZmFpbCBqdXN0IGJlY2F1c2UgdGhlIHVzZXIgcHJvdmlkZSB0aGUgZXNzaWQKKwkgKiBhbmQgdGhlIG5pYyBpcyBzdGlsbCBjaGVja2luZyBmb3IgdGhlIEFQIE1BQyA/PworCSAqLworCXN3aXRjaCAoaWVlZS0+aXdfbW9kZSkgeworCQljYXNlIElXX01PREVfQVVUTzoKKwkJCWllZWUtPml3X21vZGUgPSBJV19NT0RFX0lORlJBOworCQkJLy9ub3Qgc2V0IGJyZWFrIGhlcmUgaW50ZW50aW9ubHkKKwkJY2FzZSBJV19NT0RFX0lORlJBOgorCQkJaWVlZTgwMjExX3N0YXJ0X2JzcyhpZWVlKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSVdfTU9ERV9BREhPQzoKKwkJCWllZWU4MDIxMV9zdGFydF9pYnNzKGllZWUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBJV19NT0RFX01BU1RFUjoKKwkJCWllZWU4MDIxMV9zdGFydF9tYXN0ZXJfYnNzKGllZWUpOworCQlicmVhazsKKworCQljYXNlIElXX01PREVfTU9OSVRPUjoKKwkJCWllZWU4MDIxMV9zdGFydF9tb25pdG9yX21vZGUoaWVlZSk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KKwkJCWlmKChpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlKSAmJlwKKwkJCSAgICBpZWVlLT5leHRfcGF0Y2hfaWVlZTgwMjExX3N0YXJ0X3Byb3RvY29sICYmXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllZWUtPmV4dF9wYXRjaF9pZWVlODAyMTFfc3RhcnRfcHJvdG9jb2woaWVlZSkpIHsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsMCkKKwkJCQlxdWV1ZV93b3JrKGllZWUtPndxLCAmaWVlZS0+ZXh0X3N0b3Bfc2Nhbl93cSk7CisjZW5kaWYKKwkJCQkvLyBCeSBkZWZhdWx0LCBXTU0gZnVuY3Rpb24gd2lsbCBiZSBkaXNhYmxlZCBpbgorCQkJCS8vIEVYVEVOU0lPTiBtb2RlCisJCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLlFvU19FbmFibGUgPSAwOworCisJCQkJaWYoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTil7CisJCQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19sZW4gPSA0OworCQkJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNbMF0gPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IFwKKwkJCQkJICAgICAgSUVFRTgwMjExX0NDS19SQVRFXzFNQjsKKwkJCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzWzFdID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUVFODAyMTFfQ0NLX1JBVEVfMk1COworCQkJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNbMl0gPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9DQ0tfUkFURV81TUI7CisJCQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc1szXSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTgwMjExX0NDS19SQVRFXzExTUI7CisJCQkJfWVsc2UKKwkJCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2xlbiA9IDA7CisKKwkJCQlpZihpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTil7CisJCQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leF9sZW4gPSA4OworCQkJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhbMF0gPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9PRkRNX1JBVEVfNk1COworCQkJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhbMV0gPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9PRkRNX1JBVEVfOU1COworCQkJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhbMl0gPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQjsKKwkJCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzNdID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTgwMjExX09GRE1fUkFURV8xOE1COworCQkJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhbNF0gPVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTgwMjExX09GRE1fUkFURV8yNE1COworCQkJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhbNV0gPVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTgwMjExX09GRE1fUkFURV8zNk1COworCQkJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhbNl0gPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQjsKKwkJCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzddID1cCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQjsKKwkJCQkJaWVlZS0+cmF0ZSA9IDU0MDsKKwkJCQl9ZWxzZXsKKwkJCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4X2xlbiA9IDA7CisJCQkJCWllZWUtPnJhdGUgPSAxMTA7CisJCQkJfQorCisJCQkJLyoKKwkJCQkgICBzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCQkJCSAgIGlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKQorCQkJCSAgIGllZWU4MDIxMV9zdGFydF9zY2FuKGllZWUpOworCQkJCS8vIGllZWUtPnNldF9jaGFuKGllZWUtPmRldiwgOCk7CisKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisJCQkJKi8KKwkJCQltZW1jcHkoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBpZWVlLT5kZXYtPmRldl9hZGRyLFwKKwkJCQkgICAgICAJIEVUSF9BTEVOKTsKKwkJCQlpZWVlLT5saW5rX2NoYW5nZShpZWVlLT5kZXYpOworCQkJCW5vdGlmeV93eF9hc3NvY19ldmVudChpZWVlKTsKKworCQkJCWlmIChpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKQorCQkJCQlpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKGllZWUtPmRldik7CisKKwkJCQluZXRpZl9jYXJyaWVyX29uKGllZWUtPmRldik7CisJCQl9IGVsc2UgeworCQkJCWllZWUtPml3X21vZGUgPSBJV19NT0RFX0lORlJBOworCQkJCWllZWU4MDIxMV9zdGFydF9ic3MoaWVlZSk7CisJCQl9CisjZWxzZQorCQkJaWVlZS0+aXdfbW9kZSA9IElXX01PREVfSU5GUkE7CisJCQlpZWVlODAyMTFfc3RhcnRfYnNzKGllZWUpOworCisjZW5kaWYKKwkJCWJyZWFrOworCX0KK30KKworCisjZGVmaW5lIERSVl9OQU1FICAiSWVlZTgwMjExIgordm9pZCBpZWVlODAyMTFfc29mdG1hY19pbml0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWludCBpOworCW1lbXNldCgmaWVlZS0+Y3VycmVudF9uZXR3b3JrLCAwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrKSk7CisKKwlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9OT0xJTks7CisJaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAwOworCWZvcihpID0gMDsgaSA8IDU7IGkrKykgeworCSAgaWVlZS0+c2VxX2N0cmxbaV0gPSAwOworCX0KKworCWllZWUtPmFzc29jX2lkID0gMDsKKwlpZWVlLT5xdWV1ZV9zdG9wID0gMDsKKwlpZWVlLT5zY2FubmluZyA9IDA7CisJaWVlZS0+c29mdG1hY19mZWF0dXJlcyA9IDA7IC8vc28gSUVFRTIxMDAtbGlrZSBkcml2ZXIgYXJlIGhhcHB5CisJaWVlZS0+d2FwX3NldCA9IDA7CisJaWVlZS0+c3NpZF9zZXQgPSAwOworCWllZWUtPnByb3RvX3N0YXJ0ZWQgPSAwOworCWllZWUtPmJhc2ljX3JhdGUgPSBJRUVFODAyMTFfREVGQVVMVF9CQVNJQ19SQVRFOworCWllZWUtPnJhdGUgPSAzOworLy8jaWZkZWYgRU5BQkxFX0xQUworCWllZWUtPnBzID0gSUVFRTgwMjExX1BTX01CQ0FTVHxJRUVFODAyMTFfUFNfVU5JQ0FTVDsKKy8vI2Vsc2UKKy8vCWllZWUtPnBzID0gSUVFRTgwMjExX1BTX0RJU0FCTEVEOworLy8jZW5kaWYKKwlpZWVlLT5zdGFfc2xlZXAgPSAwOworLy9ieSBhbXkKKwlpZWVlLT5iSW5hY3RpdmVQcyA9IGZhbHNlOworCWllZWUtPmFjdHNjYW5uaW5nID0gZmFsc2U7CisJaWVlZS0+TGlzdGVuSW50ZXJ2YWwgPSAyOworCWllZWUtPk51bVJ4RGF0YUluUGVyaW9kID0gMDsgLy9ZSixhZGQsMDgwODI4CisJaWVlZS0+TnVtUnhCY25JblBlcmlvZCA9IDA7IC8vWUosYWRkLDA4MDgyOAorCWllZWUtPk51bVJ4T2tUb3RhbCA9IDA7Ly8rYnkgYW15IDA4MDMxMgorCWllZWUtPk51bVJ4VW5pY2FzdCA9IDA7Ly9ZSixhZGQsMDgwODI4LGZvciBrZWVwIGFsaXZlCisJaWVlZS0+YmVpbnJldHJ5ID0gZmFsc2U7CisJaWVlZS0+Ykh3UmFkaW9PZmYgPSBmYWxzZTsKKy8vYnkgYW15CisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCWllZWUtPml3X2V4dF9tb2RlID0gOTk5OworI2VuZGlmCisKKwlpbml0X21nbXRfcXVldWUoaWVlZSk7CisjaWYgMAorCWluaXRfdGltZXIoJmllZWUtPnNjYW5fdGltZXIpOworCWllZWUtPnNjYW5fdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWllZWU7CisJaWVlZS0+c2Nhbl90aW1lci5mdW5jdGlvbiA9IGllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fY2I7CisjZW5kaWYKKwlpZWVlLT50eF9wZW5kaW5nLnR4YiA9IE5VTEw7CisKKwlpbml0X3RpbWVyKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOworCWllZWUtPmFzc29jaWF0ZV90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaWVlZTsKKwlpZWVlLT5hc3NvY2lhdGVfdGltZXIuZnVuY3Rpb24gPSBpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0X2NiOworCisJaW5pdF90aW1lcigmaWVlZS0+YmVhY29uX3RpbWVyKTsKKwlpZWVlLT5iZWFjb25fdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBpZWVlOworCWllZWUtPmJlYWNvbl90aW1lci5mdW5jdGlvbiA9IGllZWU4MDIxMV9zZW5kX2JlYWNvbl9jYjsKKworI2lmZGVmIFBGX1NZTkNUSFJFQUQKKwlpZWVlLT53cSA9IGNyZWF0ZV93b3JrcXVldWUoRFJWX05BTUUsMCk7CisjZWxzZQorCWllZWUtPndxID0gY3JlYXRlX3dvcmtxdWV1ZShEUlZfTkFNRSk7CisjZW5kaWYKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKS8vYWRkZWQgYnkgbGF3cmVuY2UsMDcwNzAyCisJSU5JVF9ERUxBWUVEX1dPUksoJmllZWUtPnN0YXJ0X2lic3Nfd3EsKHZvaWQqKSBpZWVlODAyMTFfc3RhcnRfaWJzc193cSk7CisJSU5JVF9XT1JLKCZpZWVlLT5hc3NvY2lhdGVfY29tcGxldGVfd3EsKHZvaWQqKSBpZWVlODAyMTFfYXNzb2NpYXRlX2NvbXBsZXRlX3dxKTsKKwlJTklUX1dPUksoJmllZWUtPmFzc29jaWF0ZV9wcm9jZWR1cmVfd3EsKHZvaWQqKSBpZWVlODAyMTFfYXNzb2NpYXRlX3Byb2NlZHVyZV93cSk7CisJSU5JVF9ERUxBWUVEX1dPUksoJmllZWUtPnNvZnRtYWNfc2Nhbl93cSwodm9pZCopIGllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fd3EpOworCUlOSVRfREVMQVlFRF9XT1JLKCZpZWVlLT5hc3NvY2lhdGVfcmV0cnlfd3EsKHZvaWQqKSBpZWVlODAyMTFfYXNzb2NpYXRlX3JldHJ5X3dxKTsKKwlJTklUX1dPUksoJmllZWUtPnd4X3N5bmNfc2Nhbl93cSwodm9pZCopIGllZWU4MDIxMV93eF9zeW5jX3NjYW5fd3EpOworLy8JSU5JVF9XT1JLKCZpZWVlLT53YXRjaF9kb2dfd3EsKHZvaWQqKSBpZWVlODAyMTFfd2F0Y2hfZG9nX3dxKTsKKy8vYWRkZWQgYnkgbGF3cmVuY2UsMjAwNzExMTgKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJSU5JVF9XT1JLKCZpZWVlLT5leHRfc3RvcF9zY2FuX3dxLCh2b2lkKikgaWVlZTgwMjExX2V4dF9zdG9wX3NjYW5fd3EpOworCS8vSU5JVF9XT1JLKCZpZWVlLT5leHRfc2VuZF9iZWFjb25fd3EsKHZvaWQqKSBpZWVlODAyMTFfYmVhY29uc19zdGFydCxpZWVlKTsKKwlJTklUX1dPUksoJmllZWUtPmV4dF9zZW5kX2JlYWNvbl93cSwodm9pZCopIGV4dF9pZWVlODAyMTFfc2VuZF9iZWFjb25fd3EpOworI2VuZGlmIC8vX1JUTDgxODdfRVhUX1BBVENIXworI2Vsc2UKKwlJTklUX1dPUksoJmllZWUtPnN0YXJ0X2lic3Nfd3EsKHZvaWQqKSBpZWVlODAyMTFfc3RhcnRfaWJzc193cSxpZWVlKTsKKwlJTklUX1dPUksoJmllZWUtPmFzc29jaWF0ZV9yZXRyeV93cSwodm9pZCopIGllZWU4MDIxMV9hc3NvY2lhdGVfcmV0cnlfd3EsaWVlZSk7CisJSU5JVF9XT1JLKCZpZWVlLT5hc3NvY2lhdGVfY29tcGxldGVfd3EsKHZvaWQqKSBpZWVlODAyMTFfYXNzb2NpYXRlX2NvbXBsZXRlX3dxLGllZWUpOworCUlOSVRfV09SSygmaWVlZS0+YXNzb2NpYXRlX3Byb2NlZHVyZV93cSwodm9pZCopIGllZWU4MDIxMV9hc3NvY2lhdGVfcHJvY2VkdXJlX3dxLGllZWUpOworCUlOSVRfV09SSygmaWVlZS0+c29mdG1hY19zY2FuX3dxLCh2b2lkKikgaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl93cSxpZWVlKTsKKwlJTklUX1dPUksoJmllZWUtPnd4X3N5bmNfc2Nhbl93cSwodm9pZCopIGllZWU4MDIxMV93eF9zeW5jX3NjYW5fd3EsaWVlZSk7CisvLwlJTklUX1dPUksoJmllZWUtPndhdGNoX2RvZ193cSwodm9pZCopIGllZWU4MDIxMV93YXRjaF9kb2dfd3EsaWVlZSk7CisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCUlOSVRfV09SSygmaWVlZS0+ZXh0X3N0b3Bfc2Nhbl93cSwodm9pZCopIGllZWU4MDIxMV9leHRfc3RvcF9zY2FuX3dxLGllZWUpOworCS8vSU5JVF9XT1JLKCZpZWVlLT5leHRfc2VuZF9iZWFjb25fd3EsKHZvaWQqKSBpZWVlODAyMTFfYmVhY29uc19zdGFydCxpZWVlKTsKKwlJTklUX1dPUksoJmllZWUtPmV4dF9zZW5kX2JlYWNvbl93cSwodm9pZCopIGV4dF9pZWVlODAyMTFfc2VuZF9iZWFjb25fd3EsaWVlZSk7CisjZW5kaWYKKyNlbmRpZgorCXNlbWFfaW5pdCgmaWVlZS0+d3hfc2VtLCAxKTsKKwlzZW1hX2luaXQoJmllZWUtPnNjYW5fc2VtLCAxKTsKKworCXNwaW5fbG9ja19pbml0KCZpZWVlLT5tZ210X3R4X2xvY2spOworCXNwaW5fbG9ja19pbml0KCZpZWVlLT5iZWFjb25fbG9jayk7CisKKwl0YXNrbGV0X2luaXQoJmllZWUtPnBzX3Rhc2ssCisJICAgICAodm9pZCgqKSh1bnNpZ25lZCBsb25nKSkgaWVlZTgwMjExX3N0YV9wcywKKwkgICAgICh1bnNpZ25lZCBsb25nKWllZWUpOworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwlpZWVlLT5wRG90MTFkSW5mbyA9IGttYWxsb2Moc2l6ZW9mKFJUX0RPVDExRF9JTkZPKSwgR0ZQX0FUT01JQyk7CisjZW5kaWYKK30KKwordm9pZCBpZWVlODAyMTFfc29mdG1hY19mcmVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWRvd24oJmllZWUtPnd4X3NlbSk7CisKKwlkZWxfdGltZXJfc3luYygmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKTsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZpZWVlLT5hc3NvY2lhdGVfcmV0cnlfd3EpOworCisKKwkvL2FkZCBmb3IgUkYgcG93ZXIgb24gcG93ZXIgb2YgYnkgbGl6aGFvbWluZyAwODA1MTIKKwljYW5jZWxfZGVsYXllZF93b3JrKCZpZWVlLT5HUElPQ2hhbmdlUkZXb3JrSXRlbSk7CisKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJY2FuY2VsX2RlbGF5ZWRfd29yaygmaWVlZS0+ZXh0X3N0b3Bfc2Nhbl93cSk7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmaWVlZS0+ZXh0X3NlbmRfYmVhY29uX3dxKTsKKyNlbmRpZgorCWRlc3Ryb3lfd29ya3F1ZXVlKGllZWUtPndxKTsKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJaWYoTlVMTCAhPSBpZWVlLT5wRG90MTFkSW5mbykKKwkJa2ZyZWUoaWVlZS0+cERvdDExZEluZm8pOworI2VuZGlmCisJdXAoJmllZWUtPnd4X3NlbSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU3RhcnQgb2YgV1BBIGNvZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiB0aGlzIGlzIHN0b2xlbiBmcm9tIHRoZSBpcHcyMjAwIGRyaXZlciAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitzdGF0aWMgaW50IGllZWU4MDIxMV93cGFfZW5hYmxlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBpbnQgdmFsdWUpCit7CisJLyogVGhpcyBpcyBjYWxsZWQgd2hlbiB3cGFfc3VwcGxpY2FudCBsb2FkcyBhbmQgY2xvc2VzIHRoZSBkcml2ZXIKKwkgKiBpbnRlcmZhY2UuICovCisJcHJpbnRrKCIlcyBXUEFcbiIsdmFsdWUgPyAiZW5hYmxpbmciIDogImRpc2FibGluZyIpOworCWllZWUtPndwYV9lbmFibGVkID0gdmFsdWU7CisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBpZWVlODAyMTFfd3BhX2Fzc29jX2ZyYW1lKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBjaGFyICp3cGFfaWUsIGludCB3cGFfaWVfbGVuKQoreworCS8qIG1ha2Ugc3VyZSBXUEEgaXMgZW5hYmxlZCAqLworCWllZWU4MDIxMV93cGFfZW5hYmxlKGllZWUsIDEpOworCisJaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZShpZWVlKTsKK30KKworCitzdGF0aWMgaW50IGllZWU4MDIxMV93cGFfbWxtZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgaW50IGNvbW1hbmQsIGludCByZWFzb24pCit7CisKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAoY29tbWFuZCkgeworCWNhc2UgSUVFRV9NTE1FX1NUQV9ERUFVVEg6CisJCS8vIHNpbGVudGx5IGlnbm9yZQorCQlicmVhazsKKworCWNhc2UgSUVFRV9NTE1FX1NUQV9ESVNBU1NPQzoKKwkJaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZShpZWVlKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGsoIlVua25vd24gTUxNRSByZXF1ZXN0OiAlZFxuIiwgY29tbWFuZCk7CisJCXJldCA9IC1FT1BOT1RTVVBQOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBpZWVlODAyMTFfd3BhX3NldF93cGFfaWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgICBzdHJ1Y3QgaWVlZV9wYXJhbSAqcGFyYW0sIGludCBwbGVuKQoreworCXU4ICpidWY7CisKKwlpZiAocGFyYW0tPnUud3BhX2llLmxlbiA+IE1BWF9XUEFfSUVfTEVOIHx8CisJICAgIChwYXJhbS0+dS53cGFfaWUubGVuICYmIHBhcmFtLT51LndwYV9pZS5kYXRhID09IE5VTEwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwYXJhbS0+dS53cGFfaWUubGVuKSB7CisJCWJ1ZiA9IGttYWxsb2MocGFyYW0tPnUud3BhX2llLmxlbiwgR0ZQX0tFUk5FTCk7CisJCWlmIChidWYgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCW1lbWNweShidWYsIHBhcmFtLT51LndwYV9pZS5kYXRhLCBwYXJhbS0+dS53cGFfaWUubGVuKTsKKwkJa2ZyZWUoaWVlZS0+d3BhX2llKTsKKwkJaWVlZS0+d3BhX2llID0gYnVmOworCQlpZWVlLT53cGFfaWVfbGVuID0gcGFyYW0tPnUud3BhX2llLmxlbjsKKwl9IGVsc2UgeworCQlrZnJlZShpZWVlLT53cGFfaWUpOworCQlpZWVlLT53cGFfaWUgPSBOVUxMOworCQlpZWVlLT53cGFfaWVfbGVuID0gMDsKKwl9CisKKwlpZWVlODAyMTFfd3BhX2Fzc29jX2ZyYW1lKGllZWUsIGllZWUtPndwYV9pZSwgaWVlZS0+d3BhX2llX2xlbik7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgQVVUSF9BTEdfT1BFTl9TWVNURU0JCQkweDEKKyNkZWZpbmUgQVVUSF9BTEdfU0hBUkVEX0tFWQkJCTB4MgorCitzdGF0aWMgaW50IGllZWU4MDIxMV93cGFfc2V0X2F1dGhfYWxncyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgaW50IHZhbHVlKQoreworCisJc3RydWN0IGllZWU4MDIxMV9zZWN1cml0eSBzZWMgPSB7CisJCS5mbGFncyA9IFNFQ19BVVRIX01PREUsCisJfTsKKwlpbnQgcmV0ID0gMDsKKworCWlmICh2YWx1ZSAmIEFVVEhfQUxHX1NIQVJFRF9LRVkpIHsKKwkJc2VjLmF1dGhfbW9kZSA9IFdMQU5fQVVUSF9TSEFSRURfS0VZOworCQlpZWVlLT5vcGVuX3dlcCA9IDA7CisJfSBlbHNlIHsKKwkJc2VjLmF1dGhfbW9kZSA9IFdMQU5fQVVUSF9PUEVOOworCQlpZWVlLT5vcGVuX3dlcCA9IDE7CisJfQorCisJaWYgKGllZWUtPnNldF9zZWN1cml0eSkKKwkJaWVlZS0+c2V0X3NlY3VyaXR5KGllZWUtPmRldiwgJnNlYyk7CisJZWxzZQorCQlyZXQgPSAtRU9QTk9UU1VQUDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX3dwYV9zZXRfcGFyYW0oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4IG5hbWUsIHUzMiB2YWx1ZSkKK3sKKwlpbnQgcmV0PTA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXN3aXRjaCAobmFtZSkgeworCWNhc2UgSUVFRV9QQVJBTV9XUEFfRU5BQkxFRDoKKwkJcmV0ID0gaWVlZTgwMjExX3dwYV9lbmFibGUoaWVlZSwgdmFsdWUpOworCQlicmVhazsKKworCWNhc2UgSUVFRV9QQVJBTV9US0lQX0NPVU5URVJNRUFTVVJFUzoKKwkJaWVlZS0+dGtpcF9jb3VudGVybWVhc3VyZXM9dmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBJRUVFX1BBUkFNX0RST1BfVU5FTkNSWVBURUQ6IHsKKwkJLyogSEFDSzoKKwkJICoKKwkJICogd3BhX3N1cHBsaWNhbnQgY2FsbHMgc2V0X3dwYV9lbmFibGVkIHdoZW4gdGhlIGRyaXZlcgorCQkgKiBpcyBsb2FkZWQgYW5kIHVubG9hZGVkLCByZWdhcmRsZXNzIG9mIGlmIFdQQSBpcyBiZWluZworCQkgKiB1c2VkLiAgTm8gb3RoZXIgY2FsbHMgYXJlIG1hZGUgd2hpY2ggY2FuIGJlIHVzZWQgdG8KKwkJICogZGV0ZXJtaW5lIGlmIGVuY3J5cHRpb24gd2lsbCBiZSB1c2VkIG9yIG5vdCBwcmlvciB0bworCQkgKiBhc3NvY2lhdGlvbiBiZWluZyBleHBlY3RlZC4gIElmIGVuY3J5cHRpb24gaXMgbm90IGJlaW5nCisJCSAqIHVzZWQsIGRyb3BfdW5lbmNyeXB0ZWQgaXMgc2V0IHRvIGZhbHNlLCBlbHNlIHRydWUgLS0gd2UKKwkJICogY2FuIHVzZSB0aGlzIHRvIGRldGVybWluZSBpZiB0aGUgQ0FQX1BSSVZBQ1lfT04gYml0IHNob3VsZAorCQkgKiBiZSBzZXQuCisJCSAqLworCQlzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5IHNlYyA9IHsKKwkJCS5mbGFncyA9IFNFQ19FTkFCTEVELAorCQkJLmVuYWJsZWQgPSB2YWx1ZSwKKwkJfTsKKyAJCWllZWUtPmRyb3BfdW5lbmNyeXB0ZWQgPSB2YWx1ZTsKKwkJLyogV2Ugb25seSBjaGFuZ2UgU0VDX0xFVkVMIGZvciBvcGVuIG1vZGUuIE90aGVycworCQkgKiBhcmUgc2V0IGJ5IGlwd193cGFfc2V0X2VuY3J5cHRpb24uCisJCSAqLworCQlpZiAoIXZhbHVlKSB7CisJCQlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOworCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzA7CisJCX0KKwkJZWxzZSB7CisJCQlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOworCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzE7CisJCX0KKwkJaWYgKGllZWUtPnNldF9zZWN1cml0eSkKKwkJCWllZWUtPnNldF9zZWN1cml0eShpZWVlLT5kZXYsICZzZWMpOworCQlicmVhazsKKwl9CisKKwljYXNlIElFRUVfUEFSQU1fUFJJVkFDWV9JTlZPS0VEOgorCQlpZWVlLT5wcml2YWN5X2ludm9rZWQ9dmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBJRUVFX1BBUkFNX0FVVEhfQUxHUzoKKwkJcmV0ID0gaWVlZTgwMjExX3dwYV9zZXRfYXV0aF9hbGdzKGllZWUsIHZhbHVlKTsKKwkJYnJlYWs7CisKKwljYXNlIElFRUVfUEFSQU1fSUVFRV84MDJfMVg6CisJCWllZWUtPmllZWU4MDJfMXg9dmFsdWU7CisJCWJyZWFrOworCWNhc2UgSUVFRV9QQVJBTV9XUEFYX1NFTEVDVDoKKwkJLy8gYWRkZWQgZm9yIFdQQTIgbWl4ZWQgbW9kZQorCQkvL3ByaW50ayhLRVJOX1dBUk5JTkcgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT53cGF4IHZhbHVlID0gJXhcbiIsIHZhbHVlKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPndwYXhfc3VpdGxpc3RfbG9jayxmbGFncyk7CisJCWllZWUtPndwYXhfdHlwZV9zZXQgPSAxOworCQlpZWVlLT53cGF4X3R5cGVfbm90aWZ5ID0gdmFsdWU7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPndwYXhfc3VpdGxpc3RfbG9jayxmbGFncyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKCJVbmtub3duIFdQQSBwYXJhbTogJWRcbiIsbmFtZSk7CisJCXJldCA9IC1FT1BOT1RTVVBQOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIGltcGxlbWVudGF0aW9uIGJvcnJvd2VkIGZyb20gaG9zdGFwIGRyaXZlciAqLworCitzdGF0aWMgaW50IGllZWU4MDIxMV93cGFfc2V0X2VuY3J5cHRpb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJICBzdHJ1Y3QgaWVlZV9wYXJhbSAqcGFyYW0sIGludCBwYXJhbV9sZW4pCit7CisJaW50IHJldCA9IDA7CisKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgKm9wczsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKipjcnlwdDsKKworCXN0cnVjdCBpZWVlODAyMTFfc2VjdXJpdHkgc2VjID0geworCQkuZmxhZ3MgPSAwLAorCX07CisKKwlwYXJhbS0+dS5jcnlwdC5lcnIgPSAwOworCXBhcmFtLT51LmNyeXB0LmFsZ1tJRUVFX0NSWVBUX0FMR19OQU1FX0xFTiAtIDFdID0gJ1wwJzsKKworCWlmIChwYXJhbV9sZW4gIT0KKwkgICAgKGludCkgKChjaGFyICopIHBhcmFtLT51LmNyeXB0LmtleSAtIChjaGFyICopIHBhcmFtKSArCisJICAgIHBhcmFtLT51LmNyeXB0LmtleV9sZW4pIHsKKwkJcHJpbnRrKCJMZW4gbWlzbWF0Y2ggJWQsICVkXG4iLCBwYXJhbV9sZW4sCisJCQkgICAgICAgcGFyYW0tPnUuY3J5cHQua2V5X2xlbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAocGFyYW0tPnN0YV9hZGRyWzBdID09IDB4ZmYgJiYgcGFyYW0tPnN0YV9hZGRyWzFdID09IDB4ZmYgJiYKKwkgICAgcGFyYW0tPnN0YV9hZGRyWzJdID09IDB4ZmYgJiYgcGFyYW0tPnN0YV9hZGRyWzNdID09IDB4ZmYgJiYKKwkgICAgcGFyYW0tPnN0YV9hZGRyWzRdID09IDB4ZmYgJiYgcGFyYW0tPnN0YV9hZGRyWzVdID09IDB4ZmYpIHsKKwkJaWYgKHBhcmFtLT51LmNyeXB0LmlkeCA+PSBXRVBfS0VZUykKKwkJCXJldHVybiAtRUlOVkFMOworCQljcnlwdCA9ICZpZWVlLT5jcnlwdFtwYXJhbS0+dS5jcnlwdC5pZHhdOworCX0gZWxzZSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChzdHJjbXAocGFyYW0tPnUuY3J5cHQuYWxnLCAibm9uZSIpID09IDApIHsKKwkJaWYgKGNyeXB0KSB7CisJCQlzZWMuZW5hYmxlZCA9IDA7CisJCQkvLyBGSVhNRSBGSVhNRQorCQkJLy9zZWMuZW5jcnlwdCA9IDA7CisJCQlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMDsKKwkJCXNlYy5mbGFncyB8PSBTRUNfRU5BQkxFRCB8IFNFQ19MRVZFTDsKKwkJCWllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdChpZWVlLCBjcnlwdCk7CisJCX0KKwkJZ290byBkb25lOworCX0KKwlzZWMuZW5hYmxlZCA9IDE7CisvLyBGSVhNRSBGSVhNRQorLy8Jc2VjLmVuY3J5cHQgPSAxOworCXNlYy5mbGFncyB8PSBTRUNfRU5BQkxFRDsKKworCS8qIElQVyBIVyBjYW5ub3QgYnVpbGQgVEtJUCBNSUMsIGhvc3QgZGVjcnlwdGlvbiBzdGlsbCBuZWVkZWQuICovCisJaWYgKCEoaWVlZS0+aG9zdF9lbmNyeXB0IHx8IGllZWUtPmhvc3RfZGVjcnlwdCkgJiYKKwkgICAgc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIlRLSVAiKSkKKwkJZ290byBza2lwX2hvc3RfY3J5cHQ7CisKKwlvcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMocGFyYW0tPnUuY3J5cHQuYWxnKTsKKwlpZiAob3BzID09IE5VTEwgJiYgc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIldFUCIpID09IDApIHsKKwkJcmVxdWVzdF9tb2R1bGUoImllZWU4MDIxMV9jcnlwdF93ZXAiKTsKKwkJb3BzID0gaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKHBhcmFtLT51LmNyeXB0LmFsZyk7CisJfSBlbHNlIGlmIChvcHMgPT0gTlVMTCAmJiBzdHJjbXAocGFyYW0tPnUuY3J5cHQuYWxnLCAiVEtJUCIpID09IDApIHsKKwkJcmVxdWVzdF9tb2R1bGUoImllZWU4MDIxMV9jcnlwdF90a2lwIik7CisJCW9wcyA9IGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhwYXJhbS0+dS5jcnlwdC5hbGcpOworCX0gZWxzZSBpZiAob3BzID09IE5VTEwgJiYgc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIkNDTVAiKSA9PSAwKSB7CisJCXJlcXVlc3RfbW9kdWxlKCJpZWVlODAyMTFfY3J5cHRfY2NtcCIpOworCQlvcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMocGFyYW0tPnUuY3J5cHQuYWxnKTsKKwl9CisJaWYgKG9wcyA9PSBOVUxMKSB7CisJCXByaW50aygidW5rbm93biBjcnlwdG8gYWxnICclcydcbiIsIHBhcmFtLT51LmNyeXB0LmFsZyk7CisJCXBhcmFtLT51LmNyeXB0LmVyciA9IElFRUVfQ1JZUFRfRVJSX1VOS05PV05fQUxHOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKCpjcnlwdCA9PSBOVUxMIHx8ICgqY3J5cHQpLT5vcHMgIT0gb3BzKSB7CisJCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqbmV3X2NyeXB0OworCisJCWllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdChpZWVlLCBjcnlwdCk7CisKKwkJbmV3X2NyeXB0ID0gKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqKQorCQkJa21hbGxvYyhzaXplb2YoKm5ld19jcnlwdCksIEdGUF9LRVJORUwpOworCQlpZiAobmV3X2NyeXB0ID09IE5VTEwpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJbWVtc2V0KG5ld19jcnlwdCwgMCwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSkpOworCQluZXdfY3J5cHQtPm9wcyA9IG9wczsKKwkJaWYgKG5ld19jcnlwdC0+b3BzICYmIHRyeV9tb2R1bGVfZ2V0KG5ld19jcnlwdC0+b3BzLT5vd25lcikpCisJCQluZXdfY3J5cHQtPnByaXYgPQorCQkJCW5ld19jcnlwdC0+b3BzLT5pbml0KHBhcmFtLT51LmNyeXB0LmlkeCk7CisKKwkJaWYgKG5ld19jcnlwdC0+cHJpdiA9PSBOVUxMKSB7CisJCQlrZnJlZShuZXdfY3J5cHQpOworCQkJcGFyYW0tPnUuY3J5cHQuZXJyID0gSUVFRV9DUllQVF9FUlJfQ1JZUFRfSU5JVF9GQUlMRUQ7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBkb25lOworCQl9CisKKwkJKmNyeXB0ID0gbmV3X2NyeXB0OworCX0KKworCWlmIChwYXJhbS0+dS5jcnlwdC5rZXlfbGVuID4gMCAmJiAoKmNyeXB0KS0+b3BzLT5zZXRfa2V5ICYmCisJICAgICgqY3J5cHQpLT5vcHMtPnNldF9rZXkocGFyYW0tPnUuY3J5cHQua2V5LAorCQkJCSAgIHBhcmFtLT51LmNyeXB0LmtleV9sZW4sIHBhcmFtLT51LmNyeXB0LnNlcSwKKwkJCQkgICAoKmNyeXB0KS0+cHJpdikgPCAwKSB7CisJCXByaW50aygia2V5IHNldHRpbmcgZmFpbGVkXG4iKTsKKwkJcGFyYW0tPnUuY3J5cHQuZXJyID0gSUVFRV9DUllQVF9FUlJfS0VZX1NFVF9GQUlMRUQ7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKyBza2lwX2hvc3RfY3J5cHQ6CisJaWYgKHBhcmFtLT51LmNyeXB0LnNldF90eCkgeworCQlpZWVlLT50eF9rZXlpZHggPSBwYXJhbS0+dS5jcnlwdC5pZHg7CisJCXNlYy5hY3RpdmVfa2V5ID0gcGFyYW0tPnUuY3J5cHQuaWR4OworCQlzZWMuZmxhZ3MgfD0gU0VDX0FDVElWRV9LRVk7CisJfSBlbHNlCisJCXNlYy5mbGFncyAmPSB+U0VDX0FDVElWRV9LRVk7CisKKwlpZiAocGFyYW0tPnUuY3J5cHQuYWxnICE9IE5VTEwpIHsKKwkJbWVtY3B5KHNlYy5rZXlzW3BhcmFtLT51LmNyeXB0LmlkeF0sCisJCSAgICAgICBwYXJhbS0+dS5jcnlwdC5rZXksCisJCSAgICAgICBwYXJhbS0+dS5jcnlwdC5rZXlfbGVuKTsKKwkJc2VjLmtleV9zaXplc1twYXJhbS0+dS5jcnlwdC5pZHhdID0gcGFyYW0tPnUuY3J5cHQua2V5X2xlbjsKKwkJc2VjLmZsYWdzIHw9ICgxIDw8IHBhcmFtLT51LmNyeXB0LmlkeCk7CisKKwkJaWYgKHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJXRVAiKSA9PSAwKSB7CisJCQlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOworCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzE7CisJCX0gZWxzZSBpZiAoc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIlRLSVAiKSA9PSAwKSB7CisJCQlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOworCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzI7CisJCX0gZWxzZSBpZiAoc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIkNDTVAiKSA9PSAwKSB7CisJCQlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOworCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzM7CisJCX0KKwl9CisgZG9uZToKKwlpZiAoaWVlZS0+c2V0X3NlY3VyaXR5KQorCQlpZWVlLT5zZXRfc2VjdXJpdHkoaWVlZS0+ZGV2LCAmc2VjKTsKKworCS8qIERvIG5vdCByZXNldCBwb3J0IGlmIGNhcmQgaXMgaW4gTWFuYWdlZCBtb2RlIHNpbmNlIHJlc2V0dGluZyB3aWxsCisJICogZ2VuZXJhdGUgbmV3IElFRUUgODAyLjExIGF1dGhlbnRpY2F0aW9uIHdoaWNoIG1heSBlbmQgdXAgaW4gbG9vcGluZworCSAqIHdpdGggSUVFRSA4MDIuMVguICBJZiB5b3VyIGhhcmR3YXJlIHJlcXVpcmVzIGEgcmVzZXQgYWZ0ZXIgV0VQCisJICogY29uZmlndXJhdGlvbiAoZm9yIGV4YW1wbGUuLi4gUHJpc20yKSwgaW1wbGVtZW50IHRoZSByZXNldF9wb3J0IGluCisJICogdGhlIGNhbGxiYWNrcyBzdHJ1Y3R1cmVzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgODAyLjExIHN0YWNrLiAqLworCWlmIChpZWVlLT5yZXNldF9vbl9rZXljaGFuZ2UgJiYKKwkgICAgaWVlZS0+aXdfbW9kZSAhPSBJV19NT0RFX0lORlJBICYmCisJICAgIGllZWUtPnJlc2V0X3BvcnQgJiYKKwkgICAgaWVlZS0+cmVzZXRfcG9ydChpZWVlLT5kZXYpKSB7CisJCXByaW50aygicmVzZXRfcG9ydCBmYWlsZWRcbiIpOworCQlwYXJhbS0+dS5jcnlwdC5lcnIgPSBJRUVFX0NSWVBUX0VSUl9DQVJEX0NPTkZfRkFJTEVEOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgaWVlZTgwMjExX3dwYV9zdXBwbGljYW50X2lvY3RsKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcG9pbnQgKnApCit7CisJc3RydWN0IGllZWVfcGFyYW0gKnBhcmFtOworCWludCByZXQ9MDsKKworCWRvd24oJmllZWUtPnd4X3NlbSk7CisJLy9JRUVFX0RFQlVHX0lORk8oIndwYV9zdXBwbGljYW50OiBsZW49JWRcbiIsIHAtPmxlbmd0aCk7CisKKwlpZiAocC0+bGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBpZWVlX3BhcmFtKSB8fCAhcC0+cG9pbnRlcil7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXBhcmFtID0gKHN0cnVjdCBpZWVlX3BhcmFtICopa21hbGxvYyhwLT5sZW5ndGgsIEdGUF9LRVJORUwpOworCWlmIChwYXJhbSA9PSBOVUxMKXsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCWlmIChjb3B5X2Zyb21fdXNlcihwYXJhbSwgcC0+cG9pbnRlciwgcC0+bGVuZ3RoKSkgeworCQlrZnJlZShwYXJhbSk7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0OworCX0KKworCXN3aXRjaCAocGFyYW0tPmNtZCkgeworCisJY2FzZSBJRUVFX0NNRF9TRVRfV1BBX1BBUkFNOgorCQlyZXQgPSBpZWVlODAyMTFfd3BhX3NldF9wYXJhbShpZWVlLCBwYXJhbS0+dS53cGFfcGFyYW0ubmFtZSwKKwkJCQkJcGFyYW0tPnUud3BhX3BhcmFtLnZhbHVlKTsKKwkJYnJlYWs7CisKKwljYXNlIElFRUVfQ01EX1NFVF9XUEFfSUU6CisJCXJldCA9IGllZWU4MDIxMV93cGFfc2V0X3dwYV9pZShpZWVlLCBwYXJhbSwgcC0+bGVuZ3RoKTsKKwkJYnJlYWs7CisKKwljYXNlIElFRUVfQ01EX1NFVF9FTkNSWVBUSU9OOgorCQlyZXQgPSBpZWVlODAyMTFfd3BhX3NldF9lbmNyeXB0aW9uKGllZWUsIHBhcmFtLCBwLT5sZW5ndGgpOworCQlicmVhazsKKworCWNhc2UgSUVFRV9DTURfTUxNRToKKwkJcmV0ID0gaWVlZTgwMjExX3dwYV9tbG1lKGllZWUsIHBhcmFtLT51Lm1sbWUuY29tbWFuZCwKKwkJCQkgICBwYXJhbS0+dS5tbG1lLnJlYXNvbl9jb2RlKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGsoIlVua25vd24gV1BBIHN1cHBsaWNhbnQgcmVxdWVzdDogJWRcbiIscGFyYW0tPmNtZCk7CisJCXJldCA9IC1FT1BOT1RTVVBQOworCQlicmVhazsKKwl9CisKKwlpZiAocmV0ID09IDAgJiYgY29weV90b191c2VyKHAtPnBvaW50ZXIsIHBhcmFtLCBwLT5sZW5ndGgpKQorCQlyZXQgPSAtRUZBVUxUOworCisJa2ZyZWUocGFyYW0pOworb3V0OgorCXVwKCZpZWVlLT53eF9zZW0pOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBub3RpZnlfd3hfYXNzb2NfZXZlbnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCXdycXUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpCisJCW1lbWNweSh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7CisJZWxzZQorCQltZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIEVUSF9BTEVOKTsKKwl3aXJlbGVzc19zZW5kX2V2ZW50KGllZWUtPmRldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7Cit9CisKKworI2lmIDAKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX2dldF9iZWFjb24pOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd2FrZV9xdWV1ZSk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zdG9wX3F1ZXVlKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3Jlc2V0X3F1ZXVlKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3NvZnRtYWNfc3RvcF9wcm90b2NvbCk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zb2Z0bWFjX3N0YXJ0X3Byb3RvY29sKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX2lzX3Nob3J0c2xvdCk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9pc181NGcpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3BhX3N1cHBsaWNhbnRfaW9jdGwpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfcHNfdHhfYWNrKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3N0YXJ0X3Byb3RvY29sKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3N0b3BfcHJvdG9jb2wpOworRVhQT1JUX1NZTUJPTChub3RpZnlfd3hfYXNzb2NfZXZlbnQpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnMpOworRVhQT1JUX1NZTUJPTChTZW5kRGlzYXNzb2NpYXRpb24pOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfZGlzYXNzb2NpYXRlKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3N0YXJ0X3NjYW4pOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfc29mdG1hY19pcHNfc2Nhbl9zeW5jcm8pOworI2lmZGVmIF9SVEw4MTg3X0VYVF9QQVRDSF8KK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX2V4dF9pc3N1ZV9hc3NvY19yZXEpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfZXh0X2lzc3VlX2Rpc2Fzc29jKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX2V4dF9pc3N1ZV9hc3NvY19yc3ApOworRVhQT1JUX1NZTUJPTChzb2Z0bWFjX21nbXRfeG1pdCk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9leHRfcHJvYmVfcmVzcF9ieV9uZXQpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfc3RhcnRfc2Nhbik7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zdG9wX3NjYW4pOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfZXh0X3NlbmRfMTFzX2JlYWNvbik7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9yeF9hdXRoX3JxKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX2Fzc29jaWF0ZV9zdGVwMSk7CisjZW5kaWYgLy8gX1JUTDgxODdfRVhUX1BBVENIXworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfc3RhX3BzX3NlbmRfbnVsbF9mcmFtZSk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjX3d4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hY193eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYWYzN2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hY193eC5jCkBAIC0wLDAgKzEsNjAyIEBACisvKiBJRUVFIDgwMi4xMSBTb2Z0TUFDIGxheWVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgQW5kcmVhIE1lcmVsbG8gPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorICoKKyAqIE1vc3RseSBleHRyYWN0ZWQgZnJvbSB0aGUgcnRsODE4MC1zYTI0MDAgZHJpdmVyIGZvciB0aGUKKyAqIGluLWtlcm5lbCBnZW5lcmljIGllZWU4MDIuMTEgc3RhY2suCisgKgorICogU29tZSBwaWVjZXMgb2YgY29kZSBtaWdodCBiZSBzdG9sZW4gZnJvbSBpcHcyMTAwIGRyaXZlcgorICogY29weXJpZ2h0IG9mIHdobyBvd24gaXQncyBjb3B5cmlnaHQgOy0pCisgKgorICogUFMgd3ggaGFuZGxlciBtb3N0bHkgc3RvbGVuIGZyb20gaG9zdGFwLCBjb3B5cmlnaHQgd2hvCisgKiBvd24gaXQncyBjb3B5cmlnaHQgOy0pCisgKgorICogcmVsZWFzZWQgdW5kZXIgdGhlIEdQTAorICovCisKKworI2luY2x1ZGUgImllZWU4MDIxMS5oIgorCisvKiBGSVhNRTogYWRkIEEgZnJlcXMgKi8KKworY29uc3QgbG9uZyBpZWVlODAyMTFfd2xhbl9mcmVxdWVuY2llc1tdID0geworCTI0MTIsIDI0MTcsIDI0MjIsIDI0MjcsCisJMjQzMiwgMjQzNywgMjQ0MiwgMjQ0NywKKwkyNDUyLCAyNDU3LCAyNDYyLCAyNDY3LAorCTI0NzIsIDI0ODQKK307CisKKworaW50IGllZWU4MDIxMV93eF9zZXRfZnJlcShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpd19mcmVxICpmd3JxID0gJiB3cnF1LT5mcmVxOworLy8JcHJpbnRrKCJpbiAlc1xuIixfX2Z1bmNfXyk7CisJZG93bigmaWVlZS0+d3hfc2VtKTsKKworCWlmKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSl7CisJCXJldCA9IC1FT1BOT1RTVVBQOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBpZiBzZXR0aW5nIGJ5IGZyZXEgY29udmVydCB0byBjaGFubmVsICovCisJaWYgKGZ3cnEtPmUgPT0gMSkgeworCQlpZiAoKGZ3cnEtPm0gPj0gKGludCkgMi40MTJlOCAmJgorCQkgICAgIGZ3cnEtPm0gPD0gKGludCkgMi40ODdlOCkpIHsKKwkJCWludCBmID0gZndycS0+bSAvIDEwMDAwMDsKKwkJCWludCBjID0gMDsKKworCQkJd2hpbGUgKChjIDwgMTQpICYmIChmICE9IGllZWU4MDIxMV93bGFuX2ZyZXF1ZW5jaWVzW2NdKSkKKwkJCQljKys7CisKKwkJCS8qIGhhY2sgdG8gZmFsbCB0aHJvdWdoICovCisJCQlmd3JxLT5lID0gMDsKKwkJCWZ3cnEtPm0gPSBjICsgMTsKKwkJfQorCX0KKworCWlmIChmd3JxLT5lID4gMCB8fCBmd3JxLT5tID4gMTQgfHwgZndycS0+bSA8IDEgKXsKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gb3V0OworCisJfWVsc2UgeyAvKiBTZXQgdGhlIGNoYW5uZWwgKi8KKworCisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID0gZndycS0+bTsKKwkJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisKKwkJaWYoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DIHx8IGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpCisJCQlpZihpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKXsKKworCQkJaWVlZTgwMjExX3N0b3Bfc2VuZF9iZWFjb25zKGllZWUpOworCQkJaWVlZTgwMjExX3N0YXJ0X3NlbmRfYmVhY29ucyhpZWVlKTsKKwkJCX0KKwl9CisKKwlyZXQgPSAwOworb3V0OgorCXVwKCZpZWVlLT53eF9zZW0pOworCXJldHVybiByZXQ7Cit9CisKKworaW50IGllZWU4MDIxMV93eF9nZXRfZnJlcShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKK3sKKwlzdHJ1Y3QgaXdfZnJlcSAqZndycSA9ICYgd3JxdS0+ZnJlcTsKKworCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9PSAwKQorCQlyZXR1cm4gLTE7CisKKwlmd3JxLT5tID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWw7CisJZndycS0+ZSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGllZWU4MDIxMV93eF9nZXRfd2FwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXdycXUtPmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCisJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKQorCQlyZXR1cm4gLTE7CisKKwkvKiBXZSB3YW50IGF2b2lkIHRvIGdpdmUgdG8gdGhlIHVzZXIgaW5jb25zaXN0ZW50IGluZm9zKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJaWYgKGllZWUtPnN0YXRlICE9IElFRUU4MDIxMV9MSU5LRUQgJiYKKwkJaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRF9TQ0FOTklORyAmJgorCQlpZWVlLT53YXBfc2V0ID09IDApCisKKwkJbWVtc2V0KHdycXUtPmFwX2FkZHIuc2FfZGF0YSwgMCwgRVRIX0FMRU4pOworCWVsc2UKKwkJbWVtY3B5KHdycXUtPmFwX2FkZHIuc2FfZGF0YSwKKwkJICAgICAgIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKworaW50IGllZWU4MDIxMV93eF9zZXRfd2FwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgdW5pb24gaXdyZXFfZGF0YSAqYXdycSwKKwkJCSBjaGFyICpleHRyYSkKK3sKKworCWludCByZXQgPSAwOworCXU4IHplcm9bXSA9IHswLDAsMCwwLDAsMH07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNob3J0IGlmdXAgPSBpZWVlLT5wcm90b19zdGFydGVkOy8vZGV2LT5mbGFncyAmIElGRl9VUDsKKwlzdHJ1Y3Qgc29ja2FkZHIgKnRlbXAgPSAoc3RydWN0IHNvY2thZGRyICopYXdycTsKKworCS8vcHJpbnRrKCI9PT09PT09U2V0IFdBUDoiKTsKKwlpZWVlLT5zeW5jX3NjYW5faHVycnl1cCA9IDE7CisKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCS8qIHVzZSBpZmNvbmZpZyBodyBldGhlciAqLworCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKXsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0OworCX0KKworCWlmICh0ZW1wLT5zYV9mYW1pbHkgIT0gQVJQSFJEX0VUSEVSKXsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGlmdXApCisJCWllZWU4MDIxMV9zdG9wX3Byb3RvY29sKGllZWUpOworCisJLyoganVzdCB0byBhdm9pZCB0byBnaXZlIGluY29uc2lzdGVudCBpbmZvcyBpbiB0aGUKKwkgKiBnZXQgd3ggbWV0aG9kLiBub3QgcmVhbGx5IG5lZWRlZCBvdGhlcndpc2UKKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJbWVtY3B5KGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgdGVtcC0+c2FfZGF0YSwgRVRIX0FMRU4pOworCWllZWUtPndhcF9zZXQgPSBtZW1jbXAodGVtcC0+c2FfZGF0YSwgemVybyxFVEhfQUxFTikhPTA7CisJLy9wcmludGsoIiAleDoleDoleDoleDoleDoleFxuIiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkWzBdLGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZFsxXSxpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWRbMl0saWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkWzNdLGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZFs0XSxpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWRbNV0pOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJaWYgKGlmdXApCisJCWllZWU4MDIxMV9zdGFydF9wcm90b2NvbChpZWVlKTsKKworb3V0OgorCXVwKCZpZWVlLT53eF9zZW0pOworCXJldHVybiByZXQ7Cit9CisKKyBpbnQgaWVlZTgwMjExX3d4X2dldF9lc3NpZChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSx1bmlvbiBpd3JlcV9kYXRhICp3cnF1LGNoYXIgKmIpCit7CisJaW50IGxlbixyZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpCisJCXJldHVybiAtMTsKKworCS8qIFdlIHdhbnQgYXZvaWQgdG8gZ2l2ZSB0byB0aGUgdXNlciBpbmNvbnNpc3RlbnQgaW5mb3MqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRbMF0gPT0gJ1wwJyB8fAorCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPT0gMCl7CisJCXJldCA9IC0xOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRCAmJgorCQlpZWVlLT5zdGF0ZSAhPSBJRUVFODAyMTFfTElOS0VEX1NDQU5OSU5HICYmCisJCWllZWUtPnNzaWRfc2V0ID09IDApeworCQlyZXQgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCWxlbiA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbjsKKwl3cnF1LT5lc3NpZC5sZW5ndGggPSBsZW47CisJc3RybmNweShiLGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLGxlbik7CisJd3JxdS0+ZXNzaWQuZmxhZ3MgPSAxOworCitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKKworfQorCitpbnQgaWVlZTgwMjExX3d4X3NldF9yYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKworCXUzMiB0YXJnZXRfcmF0ZSA9IHdycXUtPmJpdHJhdGUudmFsdWU7CisKKwkvL2FkZGVkIGJ5IGxpemhhb21pbmcgZm9yIGF1dG8gbW9kZQorCWlmKHRhcmdldF9yYXRlID09IC0xKXsKKwlpZWVlLT5yYXRlID0gMTEwOworCX0gZWxzZSB7CisJaWVlZS0+cmF0ZSA9IHRhcmdldF9yYXRlLzEwMDAwMDsKKwl9CisJLy9GSVhNRTogd2UgbWlnaHQgd2FudCB0byBsaW1pdCByYXRlIGFsc28gaW4gbWFuYWdlbWVudCBwcm90b2NvbHMuCisJcmV0dXJuIDA7Cit9CisKKworCitpbnQgaWVlZTgwMjExX3d4X2dldF9yYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKworCXdycXUtPmJpdHJhdGUudmFsdWUgPSBpZWVlLT5yYXRlICogMTAwMDAwOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBpZWVlODAyMTFfd3hfc2V0X21vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCit7CisKKwlpZWVlLT5zeW5jX3NjYW5faHVycnl1cCA9IDE7CisKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCisJaWYgKHdycXUtPm1vZGUgPT0gaWVlZS0+aXdfbW9kZSkKKwkJZ290byBvdXQ7CisKKwlpZiAod3JxdS0+bW9kZSA9PSBJV19NT0RFX01PTklUT1IpeworCisJCWllZWUtPmRldi0+dHlwZSA9IEFSUEhSRF9JRUVFODAyMTE7CisJfWVsc2V7CisJCWllZWUtPmRldi0+dHlwZSA9IEFSUEhSRF9FVEhFUjsKKwl9CisKKwlpZiAoIWllZWUtPnByb3RvX3N0YXJ0ZWQpeworCQlpZWVlLT5pd19tb2RlID0gd3JxdS0+bW9kZTsKKwl9ZWxzZXsKKwkJaWVlZTgwMjExX3N0b3BfcHJvdG9jb2woaWVlZSk7CisJCWllZWUtPml3X21vZGUgPSB3cnF1LT5tb2RlOworCQlpZWVlODAyMTFfc3RhcnRfcHJvdG9jb2woaWVlZSk7CisJfQorCitvdXQ6CisJdXAoJmllZWUtPnd4X3NlbSk7CisJcmV0dXJuIDA7Cit9CisKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApCit2b2lkIGllZWU4MDIxMV93eF9zeW5jX3NjYW5fd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCB3eF9zeW5jX3NjYW5fd3EpOworI2Vsc2UKK3ZvaWQgaWVlZTgwMjExX3d4X3N5bmNfc2Nhbl93cShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKyNlbmRpZgorLy92b2lkIGllZWU4MDIxMV93eF9zeW5jX3NjYW5fd3Eoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCisvL3sKKwlzaG9ydCBjaGFuOworCisJY2hhbiA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsOworCisJbmV0aWZfY2Fycmllcl9vZmYoaWVlZS0+ZGV2KTsKKworCWlmIChpZWVlLT5kYXRhX2hhcmRfc3RvcCkKKwkJaWVlZS0+ZGF0YV9oYXJkX3N0b3AoaWVlZS0+ZGV2KTsKKworCWllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29ucyhpZWVlKTsKKworCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0xJTktFRF9TQ0FOTklORzsKKwlpZWVlLT5saW5rX2NoYW5nZShpZWVlLT5kZXYpOworCisJaWVlZTgwMjExX3N0YXJ0X3NjYW5fc3luY3JvKGllZWUpOworCisJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBjaGFuKTsKKworCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0xJTktFRDsKKwlpZWVlLT5saW5rX2NoYW5nZShpZWVlLT5kZXYpOworCisJaWYgKGllZWUtPmRhdGFfaGFyZF9yZXN1bWUpCisJCWllZWUtPmRhdGFfaGFyZF9yZXN1bWUoaWVlZS0+ZGV2KTsKKworCWlmKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQyB8fCBpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKQorCQlpZWVlODAyMTFfc3RhcnRfc2VuZF9iZWFjb25zKGllZWUpOworCisJbmV0aWZfY2Fycmllcl9vbihpZWVlLT5kZXYpOworCisJLy9ZSixhZGQsMDgwODI4LCBJbiBwcmV2ZW50IG9mIGxvc3NpbmcgcGluZyBwYWNrZXQgZHVyaW5nIHNjYW5uaW5nCisJLy9pZWVlODAyMTFfc3RhX3BzX3NlbmRfbnVsbF9mcmFtZShpZWVlLCBmYWxzZSk7CisJLy9ZSixhZGQsMDgwODI4LGVuZAorCisJdXAoJmllZWUtPnd4X3NlbSk7CisKK30KKworaW50IGllZWU4MDIxMV93eF9zZXRfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKK3sKKwlpbnQgcmV0ID0gMDsKKworCWRvd24oJmllZWUtPnd4X3NlbSk7CisKKwlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IgfHwgIShpZWVlLT5wcm90b19zdGFydGVkKSl7CisJCXJldCA9IC0xOworCQlnb3RvIG91dDsKKwl9CisJLy9ZSixhZGQsMDgwODI4CisJLy9JbiBwcmV2ZW50IG9mIGxvc3NpbmcgcGluZyBwYWNrZXQgZHVyaW5nIHNjYW5uaW5nCisJLy9pZWVlODAyMTFfc3RhX3BzX3NlbmRfbnVsbF9mcmFtZShpZWVlLCB0cnVlKTsKKwkvL1lKLGFkZCwwODA4MjgsZW5kCisKKwlpZiAoIGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpeworCQlxdWV1ZV93b3JrKGllZWUtPndxLCAmaWVlZS0+d3hfc3luY19zY2FuX3dxKTsKKwkJLyogaW50ZW50aW9uYWxseSBmb3JnZXQgdG8gdXAgc2VtICovCisJCXJldHVybiAwOworCX0KKworb3V0OgorCXVwKCZpZWVlLT53eF9zZW0pOworCXJldHVybiByZXQ7Cit9CisKK2ludCBpZWVlODAyMTFfd3hfc2V0X2Vzc2lkKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCisJaW50IHJldD0wLGxlbjsKKwlzaG9ydCBwcm90b19zdGFydGVkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZWVlLT5zeW5jX3NjYW5faHVycnl1cCA9IDE7CisKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCisJcHJvdG9fc3RhcnRlZCA9IGllZWUtPnByb3RvX3N0YXJ0ZWQ7CisKKwlpZiAod3JxdS0+ZXNzaWQubGVuZ3RoID4gSVdfRVNTSURfTUFYX1NJWkUpeworCQlyZXQ9IC1FMkJJRzsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKXsKKwkJcmV0PSAtMTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYocHJvdG9fc3RhcnRlZCkKKwkJaWVlZTgwMjExX3N0b3BfcHJvdG9jb2woaWVlZSk7CisKKwkvKiB0aGlzIGlzIGp1c3QgdG8gYmUgc3VyZSB0aGF0IHRoZSBHRVQgd3ggY2FsbGJhY2sKKwkgKiBoYXMgY29uc2lzdGVuIGluZm9zLiBub3QgbmVlZGVkIG90aGVyd2lzZQorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlpZiAod3JxdS0+ZXNzaWQuZmxhZ3MgJiYgd3JxdS0+ZXNzaWQubGVuZ3RoKSB7CisvL1lKLG1vZGlmaWVkLDA4MDgxOQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8ICBLRVJORUxfVkVSU0lPTigyLDYsMjApCisJCWxlbiA9ICgod3JxdS0+ZXNzaWQubGVuZ3RoLTEpIDwgSVdfRVNTSURfTUFYX1NJWkUpID8gKHdycXUtPmVzc2lkLmxlbmd0aC0xKSA6IElXX0VTU0lEX01BWF9TSVpFOworI2Vsc2UKKwkJbGVuID0gKHdycXUtPmVzc2lkLmxlbmd0aCA8IElXX0VTU0lEX01BWF9TSVpFKSA/ICh3cnF1LT5lc3NpZC5sZW5ndGgpIDogSVdfRVNTSURfTUFYX1NJWkU7CisjZW5kaWYKKwkJbWVtc2V0KGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCAwLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4pOyAvL1lKLGFkZCwwODA4MTkKKwkJc3RybmNweShpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgZXh0cmEsIGxlbik7CisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9IGxlbjsKKwkJaWVlZS0+c3NpZF9zZXQgPSAxOworLy9ZSixtb2RpZmllZCwwODA4MTksZW5kCisKKwkJLy9ZSixhZGQsMDgwODE5LGZvciBoaWRkZW4gYXAKKwkJaWYobGVuID09IDApeworCQkJbWVtc2V0KGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgMCwgRVRIX0FMRU4pOworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNhcGFiaWxpdHkgPSAwOworCQl9CisJCS8vWUosYWRkLDA4MDgxOSxmb3IgaGlkZGVuIGFwLGVuZAorCX0KKwllbHNleworCQlpZWVlLT5zc2lkX3NldCA9IDA7CisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkWzBdID0gJ1wwJzsKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID0gMDsKKwl9CisJLy9wcmludGsoIj09PT09PT09PT1zZXQgZXNzaWQgJXMhXG4iLGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlpZiAocHJvdG9fc3RhcnRlZCkKKwkJaWVlZTgwMjExX3N0YXJ0X3Byb3RvY29sKGllZWUpOworb3V0OgorCXVwKCZpZWVlLT53eF9zZW0pOworCXJldHVybiByZXQ7Cit9CisKKyBpbnQgaWVlZTgwMjExX3d4X2dldF9tb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQoreworCisJd3JxdS0+bW9kZSA9IGllZWUtPml3X21vZGU7CisJcmV0dXJuIDA7Cit9CisKKyBpbnQgaWVlZTgwMjExX3d4X3NldF9yYXd0eChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCisJaW50ICpwYXJtcyA9IChpbnQgKilleHRyYTsKKwlpbnQgZW5hYmxlID0gKHBhcm1zWzBdID4gMCk7CisJc2hvcnQgcHJldiA9IGllZWUtPnJhd190eDsKKworCWRvd24oJmllZWUtPnd4X3NlbSk7CisKKwlpZihlbmFibGUpCisJCWllZWUtPnJhd190eCA9IDE7CisJZWxzZQorCQlpZWVlLT5yYXdfdHggPSAwOworCisJcHJpbnRrKEtFUk5fSU5GTyJyYXcgVFggaXMgJXNcbiIsCisJICAgICAgaWVlZS0+cmF3X3R4ID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisKKwlpZihpZWVlLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikKKwl7CisJCWlmKHByZXYgPT0gMCAmJiBpZWVlLT5yYXdfdHgpeworCQkJaWYgKGllZWUtPmRhdGFfaGFyZF9yZXN1bWUpCisJCQkJaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZShpZWVlLT5kZXYpOworCisJCQluZXRpZl9jYXJyaWVyX29uKGllZWUtPmRldik7CisJCX0KKworCQlpZihwcmV2ICYmIGllZWUtPnJhd190eCA9PSAxKQorCQkJbmV0aWZfY2Fycmllcl9vZmYoaWVlZS0+ZGV2KTsKKwl9CisKKwl1cCgmaWVlZS0+d3hfc2VtKTsKKworCXJldHVybiAwOworfQorCitpbnQgaWVlZTgwMjExX3d4X2dldF9uYW1lKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJjcHkod3JxdS0+bmFtZSwgIjgwMi4xMSIpOworCWlmKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfQ0NLX01PRFVMQVRJT04peworCQlzdHJjYXQod3JxdS0+bmFtZSwgImIiKTsKKwkJaWYoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pCisJCQlzdHJjYXQod3JxdS0+bmFtZSwgIi9nIik7CisJfWVsc2UgaWYoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pCisJCXN0cmNhdCh3cnF1LT5uYW1lLCAiZyIpOworCisJaWYoKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpIHx8CisJCShpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEX1NDQU5OSU5HKSkKKwkJc3RyY2F0KHdycXUtPm5hbWUsIiBsaW5rZWQiKTsKKwllbHNlIGlmKGllZWUtPnN0YXRlICE9IElFRUU4MDIxMV9OT0xJTkspCisJCXN0cmNhdCh3cnF1LT5uYW1lLCIgbGluay4uIik7CisKKworCXJldHVybiAwOworfQorCisKKy8qIHRoaXMgaXMgbW9zdGx5IHN0b2xlbiBmcm9tIGhvc3RhcCAqLworaW50IGllZWU4MDIxMV93eF9zZXRfcG93ZXIoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQgPSAwOworCisJaWYoCisJCSghaWVlZS0+c3RhX3dha2VfdXApIHx8CisJCSghaWVlZS0+cHNfcmVxdWVzdF90eF9hY2spIHx8CisJCSghaWVlZS0+ZW50ZXJfc2xlZXBfc3RhdGUpIHx8CisJCSghaWVlZS0+cHNfaXNfcXVldWVfZW1wdHkpKXsKKworCQlwcmludGsoIkVSUk9SLiBQUyBtb2RlIGlzIHRyeWllZCB0byBiZSB1c2UgYnV0XAorZHJpdmVyIG1pc3NlZCBhIGNhbGxiYWNrXG5cbiIpOworCisJCXJldHVybiAtMTsKKwl9CisKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCisJaWYgKHdycXUtPnBvd2VyLmRpc2FibGVkKXsKKwkJaWVlZS0+cHMgPSBJRUVFODAyMTFfUFNfRElTQUJMRUQ7CisKKwkJZ290byBleGl0OworCX0KKwlzd2l0Y2ggKHdycXUtPnBvd2VyLmZsYWdzICYgSVdfUE9XRVJfTU9ERSkgeworCWNhc2UgSVdfUE9XRVJfVU5JQ0FTVF9SOgorCQlpZWVlLT5wcyA9IElFRUU4MDIxMV9QU19VTklDQVNUOworCisJCWJyZWFrOworCWNhc2UgSVdfUE9XRVJfQUxMX1I6CisJCWllZWUtPnBzID0gSUVFRTgwMjExX1BTX1VOSUNBU1QgfCBJRUVFODAyMTFfUFNfTUJDQVNUOworCQlicmVhazsKKworCWNhc2UgSVdfUE9XRVJfT046CisJCWllZWUtPnBzID0gSUVFRTgwMjExX1BTX0RJU0FCTEVEOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAod3JxdS0+cG93ZXIuZmxhZ3MgJiBJV19QT1dFUl9USU1FT1VUKSB7CisKKwkJaWVlZS0+cHNfdGltZW91dCA9IHdycXUtPnBvd2VyLnZhbHVlIC8gMTAwMDsKKwkJcHJpbnRrKCJUaW1lb3V0ICVkXG4iLGllZWUtPnBzX3RpbWVvdXQpOworCX0KKworCWlmICh3cnF1LT5wb3dlci5mbGFncyAmIElXX1BPV0VSX1BFUklPRCkgeworCisJCXJldCA9IC1FT1BOT1RTVVBQOworCQlnb3RvIGV4aXQ7CisJCS8vd3JxLT52YWx1ZSAvIDEwMjQ7CisKKwl9CitleGl0OgorCXVwKCZpZWVlLT53eF9zZW0pOworCXJldHVybiByZXQ7CisKK30KKworLyogdGhpcyBpcyBzdG9sZW4gZnJvbSBob3N0YXAgKi8KK2ludCBpZWVlODAyMTFfd3hfZ2V0X3Bvd2VyKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0ID0wOworCisJZG93bigmaWVlZS0+d3hfc2VtKTsKKworCWlmKGllZWUtPnBzID09IElFRUU4MDIxMV9QU19ESVNBQkxFRCl7CisJCXdycXUtPnBvd2VyLmRpc2FibGVkID0gMTsKKwkJZ290byBleGl0OworCX0KKworCXdycXUtPnBvd2VyLmRpc2FibGVkID0gMDsKKworLy8JaWYgKCh3cnF1LT5wb3dlci5mbGFncyAmIElXX1BPV0VSX1RZUEUpID09IElXX1BPV0VSX1RJTUVPVVQpIHsKKwkJd3JxdS0+cG93ZXIuZmxhZ3MgPSBJV19QT1dFUl9USU1FT1VUOworCQl3cnF1LT5wb3dlci52YWx1ZSA9IGllZWUtPnBzX3RpbWVvdXQgKiAxMDAwOworLy8JfSBlbHNlIHsKKy8vCQlyZXQgPSAtRU9QTk9UU1VQUDsKKy8vCQlnb3RvIGV4aXQ7CisJCS8vd3JxdS0+cG93ZXIuZmxhZ3MgPSBJV19QT1dFUl9QRVJJT0Q7CisJCS8vd3JxdS0+cG93ZXIudmFsdWUgPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuZHRpbV9wZXJpb2QgKgorCQkvLwlpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsICogMTAyNDsKKy8vCX0KKworCisJaWYgKGllZWUtPnBzICYgSUVFRTgwMjExX1BTX01CQ0FTVCkKKwkJd3JxdS0+cG93ZXIuZmxhZ3MgfD0gSVdfUE9XRVJfQUxMX1I7CisJZWxzZQorCQl3cnF1LT5wb3dlci5mbGFncyB8PSBJV19QT1dFUl9VTklDQVNUX1I7CisKK2V4aXQ6CisJdXAoJmllZWUtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKKworfQorCisjaWYgMAorRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfZ2V0X2Vzc2lkKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X3NldF9lc3NpZCk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfcmF0ZSk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9nZXRfcmF0ZSk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfd2FwKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X2dldF93YXApOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfc2V0X21vZGUpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfZ2V0X21vZGUpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfc2V0X3NjYW4pOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfZ2V0X2ZyZXEpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfc2V0X2ZyZXEpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfc2V0X3Jhd3R4KTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X2dldF9uYW1lKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X3NldF9wb3dlcik7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9nZXRfcG93ZXIpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd2xhbl9mcmVxdWVuY2llcyk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNhMDY4NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jCkBAIC0wLDAgKzEsODI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgQ29weXJpZ2h0KGMpIDIwMDMgLSAyMDA0IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisKKyAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisKKyAgQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAgSmFtZXMgUC4gS2V0cmVub3MgPGlwdzIxMDAtYWRtaW5AbGludXguaW50ZWwuY29tPgorICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIEZldyBtb2RpZmljYXRpb25zIGZvciBSZWFsdGVrJ3MgV2ktRmkgZHJpdmVycyBieQorICBBbmRyZWEgTWVyZWxsbyA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisKKyAgQSBzcGVjaWFsIHRoYW5rcyBnb2VzIHRvIFJlYWx0ZWsgZm9yIHRoZWlyIHN1cHBvcnQgIQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorLy8jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisKKyNpbmNsdWRlICJpZWVlODAyMTEuaCIKKworCisvKgorCisKKzgwMi4xMSBEYXRhIEZyYW1lCisKKworODAyLjExIGZyYW1lX2NvbnRvcmwgZm9yIGRhdGEgZnJhbWVzIC0gMiBieXRlcworICAgICAsLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCitiaXRzIHwgMCAgfCAgMSAgfCAgMiAgfCAgMyAgfCAgNCAgfCAgNSAgfCAgNiAgfCAgNyAgfCAgOCAgfCAgOSAgfCAgYSAgfCAgYiAgfCAgYyAgfCAgZCAgfCAgZSAgIHwKKyAgICAgfC0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS0tfAordmFsICB8IDAgIHwgIDAgIHwgIDAgIHwgIDEgIHwgIHggIHwgIDAgIHwgIDAgIHwgIDAgIHwgIDEgIHwgIDAgIHwgIHggIHwgIHggIHwgIHggIHwgIHggIHwgIHggICB8CisgICAgIHwtLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tLXwKK2Rlc2MgfCBeLXZlci1eICB8ICBedHlwZS1eICB8ICBeLS0tLS1zdWJ0eXBlLS0tLS1eICB8IHRvICB8ZnJvbSB8bW9yZSB8cmV0cnl8IHB3ciB8bW9yZSB8d2VwICAgfAorICAgICB8ICAgICAgICAgIHwgICAgICAgICAgIHwgeD0wIGRhdGEseD0xIGRhdGErYWNrIHwgRFMgIHwgRFMgIHxmcmFnIHwgICAgIHwgbWdtIHxkYXRhIHwgICAgICB8CisgICAgICctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis4MDIuMTEgRGF0YSBGcmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAsLS0tLS0tLS0tICdjdHJsJyBleHBhbmRzIHRvID4tLS0tLS0tLS0tLScKKyAgICAgICAgICB8CisgICAgICAsLS0nLS0tLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCitCeXRlcyB8ICAyICAgfCAgMiAgIHwgICAgNiAgICB8ICAgIDYgICAgfCAgICA2ICAgIHwgIDIgICB8IDAuLjIzMTIgfCAgIDQgIHwKKyAgICAgIHwtLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLXwtLS0tLS0tLS18LS0tLS0tfAorRGVzYy4gfCBjdHJsIHwgZHVyYSB8ICBEQS9SQSAgfCAgIFRBICAgIHwgICAgU0EgICB8IFNlcXUgfCAgRnJhbWUgIHwgIGZjcyB8CisgICAgICB8ICAgICAgfCB0aW9uIHwgKEJTU0lEKSB8ICAgICAgICAgfCAgICAgICAgIHwgZW5jZSB8ICBkYXRhICAgfCAgICAgIHwKKyAgICAgIGAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgICAgICAgICB8LS0tLS0tJworVG90YWw6IDI4IG5vbi1kYXRhIGJ5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYC0tLS0uLS0tLScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgIC4tICdGcmFtZSBkYXRhJyBleHBhbmRzIHRvIDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCisgICAgICAgfAorICAgICAgIFYKKyAgICAgICwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCitCeXRlcyB8ICAxICAgfCAgMSAgIHwgICAgMSAgICB8ICAgIDMgICAgIHwgIDIgICB8ICAwLTIzMDQgfAorICAgICAgfC0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwKK0Rlc2MuIHwgU05BUCB8IFNOQVAgfCBDb250cm9sIHxFdGggVHVubmVsfCBUeXBlIHwgSVAgICAgICB8CisgICAgICB8IERTQVAgfCBTU0FQIHwgICAgICAgICB8ICAgICAgICAgIHwgICAgICB8IFBhY2tldCAgfAorICAgICAgfCAweEFBIHwgMHhBQSB8MHgwMyAoVUkpfDB4MDAtMDAtRjh8ICAgICAgfCAgICAgICAgIHwKKyAgICAgIGAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgICAgICAgICB8CitUb3RhbDogOCBub24tZGF0YSBieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICBgLS0tLS4tLS0tJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgLi0gJ0lQIFBhY2tldCcgZXhwYW5kcywgaWYgV0VQIGVuYWJsZWQsIHRvIDwtLScKKyAgICAgICB8CisgICAgICAgVgorICAgICAgLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorQnl0ZXMgfCAgNCAgfCAgIDAtMjI5NiAgfCAgNCAgfAorICAgICAgfC0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tfAorRGVzYy4gfCBJViAgfCBFbmNyeXB0ZWQgfCBJQ1YgfAorICAgICAgfCAgICAgfCBJUCBQYWNrZXQgfCAgICAgfAorICAgICAgYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJworVG90YWw6IDggbm9uLWRhdGEgYnl0ZXMKKworCis4MDIuMyBFdGhlcm5ldCBEYXRhIEZyYW1lCisKKyAgICAgICwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK0J5dGVzIHwgICA2ICAgfCAgIDYgICB8ICAyICAgfCAgVmFyaWFibGUgfCAgIDQgIHwKKyAgICAgIHwtLS0tLS0tfC0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLXwKK0Rlc2MuIHwgRGVzdC4gfCBTb3VyY2V8IFR5cGUgfCBJUCBQYWNrZXQgfCAgZmNzIHwKKyAgICAgIHwgIE1BQyAgfCAgTUFDICB8ICAgICAgfCAgICAgICAgICAgfCAgICAgIHwKKyAgICAgIGAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScKK1RvdGFsOiAxOCBub24tZGF0YSBieXRlcworCitJbiB0aGUgZXZlbnQgdGhhdCBmcmFnbWVudGF0aW9uIGlzIHJlcXVpcmVkLCB0aGUgaW5jb21pbmcgcGF5bG9hZCBpcyBzcGxpdCBpbnRvCitOIHBhcnRzIG9mIHNpemUgaWVlZS0+ZnRzLiAgVGhlIGZpcnN0IGZyYWdtZW50IGNvbnRhaW5zIHRoZSBTTkFQIGhlYWRlciBhbmQgdGhlCityZW1haW5pbmcgcGFja2V0cyBhcmUganVzdCBkYXRhLgorCitJZiBlbmNyeXB0aW9uIGlzIGVuYWJsZWQsIGVhY2ggZnJhZ21lbnQgcGF5bG9hZCBzaXplIGlzIHJlZHVjZWQgYnkgZW5vdWdoIHNwYWNlCit0byBhZGQgdGhlIHByZWZpeCBhbmQgcG9zdGZpeCAoSVYgYW5kIElDViB0b3RhbGxpbmcgOCBieXRlcyBpbiB0aGUgY2FzZSBvZiBXRVApCitTbyBpZiB5b3UgaGF2ZSAxNTAwIGJ5dGVzIG9mIHBheWxvYWQgd2l0aCBpZWVlLT5mdHMgc2V0IHRvIDUwMCB3aXRob3V0CitlbmNyeXB0aW9uIGl0IHdpbGwgdGFrZSAzIGZyYW1lcy4gIFdpdGggV0VQIGl0IHdpbGwgdGFrZSA0IGZyYW1lcyBhcyB0aGUKK3BheWxvYWQgb2YgZWFjaCBmcmFtZSBpcyByZWR1Y2VkIHRvIDQ5MiBieXRlcy4KKworKiBTS0IgdmlzdWFsaXphdGlvbgorKgorKiAgLC0gc2tiLT5kYXRhCisqIHwKKyogfCAgICBFVEhFUk5FVCBIRUFERVIgICAgICAgICwtPC0tIFBBWUxPQUQKKyogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDE0IGJ5dGVzIGZyb20gc2tiLT5kYXRhCisqIHwgIDIgYnl0ZXMgZm9yIFR5cGUgLS0+ICxULiB8ICAgICAoc2l6ZW9mIGV0aGhkcikKKyogfCAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKKyogfCwtRGVzdC4tLS4gLC0tU3JjLi0tLS4gfCB8IHwKKyogfCAgNiBieXRlc3wgfCA2IGJ5dGVzIHwgfCB8IHwKKyogdiAgICAgICAgIHwgfCAgICAgICAgIHwgfCB8IHwKKyogMCAgICAgICAgIHwgdiAgICAgICAxIHwgdiB8IHYgICAgICAgICAgIDIKKyogMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1CisqICAgICBeICAgICB8IF4gICAgICAgICB8IF4gfAorKiAgICAgfCAgICAgfCB8ICAgICAgICAgfCB8IHwKKyogICAgIHwgICAgIHwgfCAgICAgICAgIHwgYFQnIDwtLS0tIDIgYnl0ZXMgZm9yIFR5cGUKKyogICAgIHwgICAgIHwgfCAgICAgICAgIHwKKyogICAgIHwgICAgIHwgJy0tLVNOQVAtLScgPC0tLS0tLS0tIDYgYnl0ZXMgZm9yIFNOQVAKKyogICAgIHwgICAgIHwKKyogICAgIGAtSVYtLScgPC0tLS0tLS0tLS0tLS0tLS0tLS0tIDQgYnl0ZXMgZm9yIElWIChXRVApCisqCisqICAgICAgU05BUCBIRUFERVIKKyoKKyovCisKK3N0YXRpYyB1OCBQODAyXzFIX09VSVtQODAyMTFfT1VJX0xFTl0gPSB7IDB4MDAsIDB4MDAsIDB4ZjggfTsKK3N0YXRpYyB1OCBSRkMxMDQyX09VSVtQODAyMTFfT1VJX0xFTl0gPSB7IDB4MDAsIDB4MDAsIDB4MDAgfTsKKworc3RhdGljIGlubGluZSBpbnQgaWVlZTgwMjExX3B1dF9zbmFwKHU4ICpkYXRhLCB1MTYgaF9wcm90bykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3NuYXBfaGRyICpzbmFwOworCXU4ICpvdWk7CisKKwlzbmFwID0gKHN0cnVjdCBpZWVlODAyMTFfc25hcF9oZHIgKilkYXRhOworCXNuYXAtPmRzYXAgPSAweGFhOworCXNuYXAtPnNzYXAgPSAweGFhOworCXNuYXAtPmN0cmwgPSAweDAzOworCisJaWYgKGhfcHJvdG8gPT0gMHg4MTM3IHx8IGhfcHJvdG8gPT0gMHg4MGYzKQorCQlvdWkgPSBQODAyXzFIX09VSTsKKwllbHNlCisJCW91aSA9IFJGQzEwNDJfT1VJOworCXNuYXAtPm91aVswXSA9IG91aVswXTsKKwlzbmFwLT5vdWlbMV0gPSBvdWlbMV07CisJc25hcC0+b3VpWzJdID0gb3VpWzJdOworCisJKih1MTYgKikoZGF0YSArIFNOQVBfU0laRSkgPSBodG9ucyhoX3Byb3RvKTsKKworCXJldHVybiBTTkFQX1NJWkUgKyBzaXplb2YodTE2KTsKK30KKworaW50IGllZWU4MDIxMV9lbmNyeXB0X2ZyYWdtZW50KAorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCXN0cnVjdCBza19idWZmICpmcmFnLAorCWludCBoZHJfbGVuKQoreworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSogY3J5cHQgPSBpZWVlLT5jcnlwdFtpZWVlLT50eF9rZXlpZHhdOworCWludCByZXM7CisKKyAvKmFkZGVkIHRvIGNhcmUgYWJvdXQgbnVsbCBjcnlwdCBjb25kaXRpb24sIHRvIHNvbHZlIHRoYXQgc3lzdGVtIGhhbmdzIHdoZW4gc2hhcmVkIGtleXMgZXJyb3IqLworICAgICAgICBpZiAoIWNyeXB0IHx8ICFjcnlwdC0+b3BzKQorICAgICAgICByZXR1cm4gLTE7CisKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0NSWVBUX1RLSVAKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGVhZGVyOworCisJaWYgKGllZWUtPnRraXBfY291bnRlcm1lYXN1cmVzICYmCisJICAgIGNyeXB0ICYmIGNyeXB0LT5vcHMgJiYgc3RyY21wKGNyeXB0LT5vcHMtPm5hbWUsICJUS0lQIikgPT0gMCkgeworCQloZWFkZXIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgZnJhZy0+ZGF0YTsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUS0lQIGNvdW50ZXJtZWFzdXJlczogZHJvcHBlZCAiCisJCQkgICAgICAgIlRYIHBhY2tldCB0byAiIE1BQ19GTVQgIlxuIiwKKwkJCSAgICAgICBpZWVlLT5kZXYtPm5hbWUsIE1BQ19BUkcoaGVhZGVyLT5hZGRyMSkpOworCQl9CisJCXJldHVybiAtMTsKKwl9CisjZW5kaWYKKwkvKiBUbyBlbmNyeXB0LCBmcmFtZSBmb3JtYXQgaXM6CisJICogSVYgKDQgYnl0ZXMpLCBjbGVhciBwYXlsb2FkIChpbmNsdWRpbmcgU05BUCksIElDViAoNCBieXRlcykgKi8KKworCS8vIFBSOiBGSVhNRTogQ29waWVkIGZyb20gaG9zdGFwLiBDaGVjayBmcmFnbWVudGF0aW9uL01TRFUvTVBEVSBlbmNyeXB0aW9uLgorCS8qIEhvc3QtYmFzZWQgSUVFRSA4MDIuMTEgZnJhZ21lbnRhdGlvbiBmb3IgVFggaXMgbm90IHlldCBzdXBwb3J0ZWQsIHNvCisJICogY2FsbCBib3RoIE1TRFUgYW5kIE1QRFUgZW5jcnlwdGlvbiBmdW5jdGlvbnMgZnJvbSBoZXJlLiAqLworCWF0b21pY19pbmMoJmNyeXB0LT5yZWZjbnQpOworCXJlcyA9IDA7CisJaWYgKGNyeXB0LT5vcHMtPmVuY3J5cHRfbXNkdSkKKwkJcmVzID0gY3J5cHQtPm9wcy0+ZW5jcnlwdF9tc2R1KGZyYWcsIGhkcl9sZW4sIGNyeXB0LT5wcml2KTsKKwlpZiAocmVzID09IDAgJiYgY3J5cHQtPm9wcy0+ZW5jcnlwdF9tcGR1KQorCQlyZXMgPSBjcnlwdC0+b3BzLT5lbmNyeXB0X21wZHUoZnJhZywgaGRyX2xlbiwgY3J5cHQtPnByaXYpOworCisJYXRvbWljX2RlYygmY3J5cHQtPnJlZmNudCk7CisJaWYgKHJlcyA8IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEVuY3J5cHRpb24gZmFpbGVkOiBsZW49JWQuXG4iLAorCQkgICAgICAgaWVlZS0+ZGV2LT5uYW1lLCBmcmFnLT5sZW4pOworCQlpZWVlLT5pZWVlX3N0YXRzLnR4X2Rpc2NhcmRzKys7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIGllZWU4MDIxMV90eGJfZnJlZShzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqdHhiKSB7CisJaW50IGk7CisJaWYgKHVubGlrZWx5KCF0eGIpKQorCQlyZXR1cm47CisJZm9yIChpID0gMDsgaSA8IHR4Yi0+bnJfZnJhZ3M7IGkrKykKKwkJaWYgKHR4Yi0+ZnJhZ21lbnRzW2ldKQorCQkJZGV2X2tmcmVlX3NrYl9hbnkodHhiLT5mcmFnbWVudHNbaV0pOworCWtmcmVlKHR4Yik7Cit9CisKK3N0cnVjdCBpZWVlODAyMTFfdHhiICppZWVlODAyMTFfYWxsb2NfdHhiKGludCBucl9mcmFncywgaW50IHR4Yl9zaXplLAorCQkJCQkgIGludCBnZnBfbWFzaykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqdHhiOworCWludCBpOworCXR4YiA9IGttYWxsb2MoCisJCXNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3R4YikgKyAoc2l6ZW9mKHU4KikgKiBucl9mcmFncyksCisJCWdmcF9tYXNrKTsKKwlpZiAoIXR4YikKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1zZXQodHhiLCAwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV90eGIpKTsKKwl0eGItPm5yX2ZyYWdzID0gbnJfZnJhZ3M7CisJdHhiLT5mcmFnX3NpemUgPSB0eGJfc2l6ZTsKKworCWZvciAoaSA9IDA7IGkgPCBucl9mcmFnczsgaSsrKSB7CisJCXR4Yi0+ZnJhZ21lbnRzW2ldID0gZGV2X2FsbG9jX3NrYih0eGJfc2l6ZSk7CisJCWlmICh1bmxpa2VseSghdHhiLT5mcmFnbWVudHNbaV0pKSB7CisJCQlpLS07CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAodW5saWtlbHkoaSAhPSBucl9mcmFncykpIHsKKwkJd2hpbGUgKGkgPj0gMCkKKwkJCWRldl9rZnJlZV9za2JfYW55KHR4Yi0+ZnJhZ21lbnRzW2ktLV0pOworCQlrZnJlZSh0eGIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIHR4YjsKK30KKworLy8gQ2xhc3NpZnkgdGhlIHRvLWJlIHNlbmQgZGF0YSBwYWNrZXQKKy8vIE5lZWQgdG8gYWNxdWlyZSB0aGUgc2VudCBxdWV1ZSBpbmRleC4KK3N0YXRpYyBpbnQKK2llZWU4MDIxMV9jbGFzc2lmeShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmspCit7CisgIHN0cnVjdCBldGhlcl9oZWFkZXIgKmVoID0gKHN0cnVjdCBldGhlcl9oZWFkZXIqKXNrYi0+ZGF0YTsKKyAgdW5zaWduZWQgaW50IHdtZV9VUCA9IDA7CisKKyAgaWYoIW5ldHdvcmstPlFvU19FbmFibGUpIHsKKyAgICAgc2tiLT5wcmlvcml0eSA9IDA7CisgICAgIHJldHVybih3bWVfVVApOworICB9CisKKyAgaWYoZWgtPmV0aGVyX3R5cGUgPT0gX19jb25zdGFudF9odG9ucyhFVEhFUlRZUEVfSVApKSB7CisgICAgY29uc3Qgc3RydWN0IGlwaGRyICppaCA9IChzdHJ1Y3QgaXBoZHIqKShza2ItPmRhdGEgKyBcCisJCSAgICBzaXplb2Yoc3RydWN0IGV0aGVyX2hlYWRlcikpOworICAgIHdtZV9VUCA9IChpaC0+dG9zID4+IDUpJjB4MDc7CisgIH0gZWxzZSBpZiAodmxhbl90eF90YWdfcHJlc2VudChza2IpKSB7Ly92dGFnIHBhY2tldAorI2lmbmRlZiBWTEFOX1BSSV9TSElGVAorI2RlZmluZSBWTEFOX1BSSV9TSElGVCAgMTMgICAgICAgICAgICAgIC8qIFNoaWZ0IHRvIGZpbmQgVkxBTiB1c2VyIHByaW9yaXR5ICovCisjZGVmaW5lIFZMQU5fUFJJX01BU0sgICA3ICAgICAgICAgICAgICAgLyogTWFzayBmb3IgdXNlciBwcmlvcml0eSBiaXRzIGluIFZMQU4gKi8KKyNlbmRpZgorCXUzMiB0YWcgPSB2bGFuX3R4X3RhZ19nZXQoc2tiKTsKKwl3bWVfVVAgPSAodGFnID4+IFZMQU5fUFJJX1NISUZUKSAmIFZMQU5fUFJJX01BU0s7CisgIH0gZWxzZSBpZihFVEhfUF9QQUUgPT0gIG50b2hzKCgoc3RydWN0IGV0aGhkciAqKXNrYi0+ZGF0YSktPmhfcHJvdG8pKSB7CisgICAgLy9wcmludGsoS0VSTl9XQVJOSU5HICJ0eXBlID0gbm9ybWFsIHBhY2tldFxuIik7CisgICAgd21lX1VQID0gNzsKKyAgfQorCisgIHNrYi0+cHJpb3JpdHkgPSB3bWVfVVA7CisgIHJldHVybih3bWVfVVApOworfQorCisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworLy8gYmFzZWQgb24gcGFydCBvZiBpZWVlODAyMTFfeG1pdC4gTWFpbmx5IGFsbG9jYXRlIHR4Yi4gaWVlZS0+bG9jayBpcyBoZWxkCitzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqaWVlZTgwMjExX2V4dF9hbGxvY190eGIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKmhlYWRlciwgaW50IGhkcl9sZW4sIHU4IGlzUW9TLCB1MTYgKnBRT1NfY3RsLCBpbnQgaXNFbmNyeXB0LCBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEqIGNyeXB0KQoreworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApKQorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyNlbHNlCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKilkZXYtPnByaXY7CisjZW5kaWYKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqdHhiID0gTlVMTDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqZnJhZ19oZHI7CisJaW50IGksIGJ5dGVzX3Blcl9mcmFnLCBucl9mcmFncywgYnl0ZXNfbGFzdF9mcmFnLCBmcmFnX3NpemU7CisJaW50IGV0aGVyX3R5cGU7CisJaW50IGJ5dGVzLCBRT1NfY3RsOworCXN0cnVjdCBza19idWZmICpza2JfZnJhZzsKKworCWV0aGVyX3R5cGUgPSBudG9ocygoKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGEpLT5oX3Byb3RvKTsKKworCS8qIEFkdmFuY2UgdGhlIFNLQiB0byB0aGUgc3RhcnQgb2YgdGhlIHBheWxvYWQgKi8KKwlza2JfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSk7CisKKwkvKiBEZXRlcm1pbmUgdG90YWwgYW1vdW50IG9mIHN0b3JhZ2UgcmVxdWlyZWQgZm9yIFRYQiBwYWNrZXRzICovCisJYnl0ZXMgPSBza2ItPmxlbiArIFNOQVBfU0laRSArIHNpemVvZih1MTYpOworCisJLyogRGV0ZXJtaW5lIGZyYWdtZW50YXRpb24gc2l6ZSBiYXNlZCBvbiBkZXN0aW5hdGlvbiAobXVsdGljYXN0CisJICogYW5kIGJyb2FkY2FzdCBhcmUgbm90IGZyYWdtZW50ZWQpICovCisJLy8gaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGRlc3QpIHx8CisJLy8gaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoZGVzdCkpIHsKKwlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGVhZGVyLT5hZGRyMSkgfHwKKwkJCWlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGhlYWRlci0+YWRkcjEpKSB7CisJCWZyYWdfc2l6ZSA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKKwkJUU9TX2N0bCA9IFFPU19DVExfTk9UQ09OVEFJTl9BQ0s7CisJfQorCWVsc2UgeworCQkvL3ByaW50ayhLRVJOX1dBUk5JTkcgIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJmZyYWdfc2l6ZSA9ICVkXG4iLCBmcmFnX3NpemUpOworCQlmcmFnX3NpemUgPSBpZWVlLT5mdHM7Ly9kZWZhdWx0OjM5MgorCQlRT1NfY3RsID0gMDsKKwl9CisKKwlpZihpc1FvUykgeworCQlRT1NfY3RsIHw9IHNrYi0+cHJpb3JpdHk7IC8vc2V0IGluIHRoZSBpZWVlODAyMTFfY2xhc3NpZnkKKwkJKnBRT1NfY3RsID0gY3B1X3RvX2xlMTYoUU9TX2N0bCk7CisJfQorCS8vcHJpbnRrKEtFUk5fV0FSTklORyAiaGVhZGVyIHNpemUgPSAlZCwgUU9TX2N0bCA9ICV4XG4iLCBoZHJfbGVuLFFPU19jdGwpOworCS8qIERldGVybWluZSBhbW91bnQgb2YgcGF5bG9hZCBwZXIgZnJhZ21lbnQuICBSZWdhcmRsZXNzIG9mIGlmCisJICogdGhpcyBzdGFjayBpcyBwcm92aWRpbmcgdGhlIGZ1bGwgODAyLjExIGhlYWRlciwgb25lIHdpbGwKKwkgKiBldmVudHVhbGx5IGJlIGFmZml4ZWQgdG8gdGhpcyBmcmFnbWVudCAtLSBzbyB3ZSBtdXN0IGFjY291bnQgZm9yCisJICogaXQgd2hlbiBkZXRlcm1pbmluZyB0aGUgYW1vdW50IG9mIHBheWxvYWQgc3BhY2UuICovCisJLy9ieXRlc19wZXJfZnJhZyA9IGZyYWdfc2l6ZSAtIChJRUVFODAyMTFfM0FERFJfTEVOICsgKGllZWUtPmN1cnJlbnRfbmV0d29yay0+UW9TX0VuYWJsZSA/IDI6MCkpOworCWJ5dGVzX3Blcl9mcmFnID0gZnJhZ19zaXplIC0gaGRyX2xlbjsKKwlpZiAoaWVlZS0+Y29uZmlnICYKKwkJCShDRkdfSUVFRTgwMjExX0NPTVBVVEVfRkNTIHwgQ0ZHX0lFRUU4MDIxMV9SRVNFUlZFX0ZDUykpCisJCWJ5dGVzX3Blcl9mcmFnIC09IElFRUU4MDIxMV9GQ1NfTEVOOworCisJLyogRWFjaCBmcmFnbWVudCBtYXkgbmVlZCB0byBoYXZlIHJvb20gZm9yIGVuY3J5cHRpb25nIHByZS9wb3N0Zml4ICovCisJaWYgKGlzRW5jcnlwdCkKKwkJYnl0ZXNfcGVyX2ZyYWcgLT0gY3J5cHQtPm9wcy0+ZXh0cmFfcHJlZml4X2xlbiArCisJCQljcnlwdC0+b3BzLT5leHRyYV9wb3N0Zml4X2xlbjsKKworCS8qIE51bWJlciBvZiBmcmFnbWVudHMgaXMgdGhlIHRvdGFsIGJ5dGVzX3Blcl9mcmFnIC8KKwkgKiBwYXlsb2FkX3Blcl9mcmFnbWVudCAqLworCW5yX2ZyYWdzID0gYnl0ZXMgLyBieXRlc19wZXJfZnJhZzsKKwlieXRlc19sYXN0X2ZyYWcgPSBieXRlcyAlIGJ5dGVzX3Blcl9mcmFnOworCWlmIChieXRlc19sYXN0X2ZyYWcpCisJCW5yX2ZyYWdzKys7CisJZWxzZQorCQlieXRlc19sYXN0X2ZyYWcgPSBieXRlc19wZXJfZnJhZzsKKworCS8qIFdoZW4gd2UgYWxsb2NhdGUgdGhlIFRYQiB3ZSBhbGxvY2F0ZSBlbm91Z2ggc3BhY2UgZm9yIHRoZSByZXNlcnZlCisJICogYW5kIGZ1bGwgZnJhZ21lbnQgYnl0ZXMgKGJ5dGVzX3Blcl9mcmFnIGRvZXNuJ3QgaW5jbHVkZSBwcmVmaXgsCisJICogcG9zdGZpeCwgaGVhZGVyLCBGQ1MsIGV0Yy4pICovCisJdHhiID0gaWVlZTgwMjExX2FsbG9jX3R4Yihucl9mcmFncywgZnJhZ19zaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAodW5saWtlbHkoIXR4YikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBUWEJcbiIsCisJCQlpZWVlLT5kZXYtPm5hbWUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJdHhiLT5lbmNyeXB0ZWQgPSBpc0VuY3J5cHQ7CisJdHhiLT5wYXlsb2FkX3NpemUgPSBieXRlczsKKworCWZvciAoaSA9IDA7IGkgPCBucl9mcmFnczsgaSsrKSB7CisJCXNrYl9mcmFnID0gdHhiLT5mcmFnbWVudHNbaV07CisJCXNrYl9mcmFnLT5wcmlvcml0eSA9IFVQMkFDKHNrYi0+cHJpb3JpdHkpOworCQlpZiAoaXNFbmNyeXB0KQorCQkJc2tiX3Jlc2VydmUoc2tiX2ZyYWcsIGNyeXB0LT5vcHMtPmV4dHJhX3ByZWZpeF9sZW4pOworCisJCWZyYWdfaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopc2tiX3B1dChza2JfZnJhZywgaGRyX2xlbik7CisJCW1lbWNweShmcmFnX2hkciwgKHZvaWQgKiloZWFkZXIsIGhkcl9sZW4pOworCisJCS8qIElmIHRoaXMgaXMgbm90IHRoZSBsYXN0IGZyYWdtZW50LCB0aGVuIGFkZCB0aGUgTU9SRUZSQUdTCisJCSAqIGJpdCB0byB0aGUgZnJhbWUgY29udHJvbCAqLworCQlpZiAoaSAhPSBucl9mcmFncyAtIDEpIHsKKwkJCWZyYWdfaGRyLT5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNigKKwkJCQkJaGVhZGVyLT5mcmFtZV9jdGwgfCBJRUVFODAyMTFfRkNUTF9NT1JFRlJBR1MpOworCQkJYnl0ZXMgPSBieXRlc19wZXJfZnJhZzsKKworCQl9IGVsc2UgeworCQkJLyogVGhlIGxhc3QgZnJhZ21lbnQgdGFrZXMgdGhlIHJlbWFpbmluZyBsZW5ndGggKi8KKwkJCWJ5dGVzID0gYnl0ZXNfbGFzdF9mcmFnOworCQl9CisKKwkJZnJhZ19oZHItPnNlcV9jdGwgPSBjcHVfdG9fbGUxNihpZWVlLT5zZXFfY3RybFswXTw8NCB8IGkpOworCQkvL2ZyYWdfaGRyLT5zZXFfY3RsID0gY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmw8PDQgfCBpKTsKKwkJLy8KKworCQkvKiBQdXQgYSBTTkFQIGhlYWRlciBvbiB0aGUgZmlyc3QgZnJhZ21lbnQgKi8KKwkJaWYgKGkgPT0gMCkgeworCQkJaWVlZTgwMjExX3B1dF9zbmFwKAorCQkJCXNrYl9wdXQoc2tiX2ZyYWcsIFNOQVBfU0laRSArIHNpemVvZih1MTYpKSwgZXRoZXJfdHlwZSk7CisJCQlieXRlcyAtPSBTTkFQX1NJWkUgKyBzaXplb2YodTE2KTsKKwkJfQorCisJCW1lbWNweShza2JfcHV0KHNrYl9mcmFnLCBieXRlcyksIHNrYi0+ZGF0YSwgYnl0ZXMpOworCisJCS8qIEFkdmFuY2UgdGhlIFNLQi4uLiAqLworCQlza2JfcHVsbChza2IsIGJ5dGVzKTsKKworCQkvKiBFbmNyeXB0aW9uIHJvdXRpbmUgd2lsbCBtb3ZlIHRoZSBoZWFkZXIgZm9yd2FyZCBpbiBvcmRlcgorCQkgKiB0byBpbnNlcnQgdGhlIElWIGJldHdlZW4gdGhlIGhlYWRlciBhbmQgdGhlIHBheWxvYWQgKi8KKwkJaWYgKGlzRW5jcnlwdCkKKwkJCWllZWU4MDIxMV9lbmNyeXB0X2ZyYWdtZW50KGllZWUsIHNrYl9mcmFnLCBoZHJfbGVuKTsKKwkJaWYgKGllZWUtPmNvbmZpZyAmCisJCQkJKENGR19JRUVFODAyMTFfQ09NUFVURV9GQ1MgfCBDRkdfSUVFRTgwMjExX1JFU0VSVkVfRkNTKSkKKwkJCXNrYl9wdXQoc2tiX2ZyYWcsIDQpOworCX0KKwkvLyBBZHZhbmNlIHNlcXVlbmNlIG51bWJlciBpbiBkYXRhIGZyYW1lLgorCS8vcHJpbnRrKEtFUk5fV0FSTklORyAiUW9TIEVuYWxiZWQ/ICVzXG4iLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuUW9TX0VuYWJsZT8iWSI6Ik4iKTsKKwlpZiAoaWVlZS0+c2VxX2N0cmxbMF0gPT0gMHhGRkYpCisJCWllZWUtPnNlcV9jdHJsWzBdID0gMDsKKwllbHNlCisJCWllZWUtPnNlcV9jdHJsWzBdKys7CisJLy8gc3RhbmxleSwganVzdCBmb3IgZGVidWcKKy8qCit7CisJaW50IGo9MDsKKwlmb3Ioaj0wO2o8bnJfZnJhZ3M7aisrKQorCXsKKwkJCWludCBpOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdHhiLT5mcmFnbWVudHNbal07CisJCQlwcmludGsoInNlbmQoJWQpOiAiLCBqKTsKKwkJCWZvciAoaT0wO2k8c2tiLT5sZW47aSsrKQorCQkJCXByaW50aygiJTAyWCAiLCBza2ItPmRhdGFbaV0mMHhmZik7CisJCQlwcmludGsoIlxuIik7CisJfQorfQorKi8KKworCXJldHVybiB0eGI7Cit9CisKKworLy8gYmFzZWQgb24gcGFydCBvZiBpZWVlODAyMTFfeG1pdC4gTWFpbmx5IGFsbG9jYXRlIHR4Yi4gaWVlZS0+bG9jayBpcyBoZWxkCisvLyBBc3N1bWUgbm8gZW5jcnlwdGlvbiwgbm8gRkNTIGNvbXB1dGluZworc3RydWN0IGllZWU4MDIxMV90eGIgKmllZWU4MDIxMV9leHRfcmV1c2VfdHhiKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICpoZWFkZXIsIGludCBoZHJfbGVuLCB1OCBpc1FvUywgdTE2ICpwUU9TX2N0bCwgaW50IGlzRW5jcnlwdCwgc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKiBjcnlwdCkKK3sKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IG5ldGRldl9wcml2KGRldik7CisjZWxzZQorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICopZGV2LT5wcml2OworI2VuZGlmCisJc3RydWN0IGllZWU4MDIxMV90eGIgKnR4YiA9IE5VTEw7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKmZyYWdfaGRyOworCWludCBldGhlcl90eXBlOworCWludCBieXRlcywgUU9TX2N0bDsKKworCWV0aGVyX3R5cGUgPSBudG9ocygoKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGEpLT5oX3Byb3RvKTsKKworCS8qIEFkdmFuY2UgdGhlIFNLQiB0byB0aGUgc3RhcnQgb2YgdGhlIHBheWxvYWQgKi8KKwlza2JfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSk7CisKKwkvKiBEZXRlcm1pbmUgdG90YWwgYW1vdW50IG9mIHN0b3JhZ2UgcmVxdWlyZWQgZm9yIFRYQiBwYWNrZXRzICovCisJYnl0ZXMgPSBza2ItPmxlbiArIFNOQVBfU0laRSArIHNpemVvZih1MTYpOworCisJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhlYWRlci0+YWRkcjEpIHx8CisJCQlpc19icm9hZGNhc3RfZXRoZXJfYWRkcihoZWFkZXItPmFkZHIxKSkgeworCQlRT1NfY3RsID0gUU9TX0NUTF9OT1RDT05UQUlOX0FDSzsKKwl9CisJZWxzZSB7CisJCVFPU19jdGwgPSAwOworCX0KKworCWlmKGlzUW9TKSB7CisJCVFPU19jdGwgfD0gc2tiLT5wcmlvcml0eTsgLy9zZXQgaW4gdGhlIGllZWU4MDIxMV9jbGFzc2lmeQorCQkqcFFPU19jdGwgPSBjcHVfdG9fbGUxNihRT1NfY3RsKTsKKwl9CisKKwl0eGIgPSBrbWFsbG9jKCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV90eGIpICsgc2l6ZW9mKHU4KiksIEdGUF9BVE9NSUMgKTsKKwlpZiAodW5saWtlbHkoIXR4YikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBUWEJcbiIsCisJCQlpZWVlLT5kZXYtPm5hbWUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwl0eGItPm5yX2ZyYWdzID0gMTsKKwl0eGItPmZyYWdfc2l6ZSA9IGJ5dGVzOworCXR4Yi0+ZW5jcnlwdGVkID0gaXNFbmNyeXB0OworCXR4Yi0+cGF5bG9hZF9zaXplID0gYnl0ZXM7CisKKwl0eGItPmZyYWdtZW50c1swXSA9IHNrYjsKKwlpZWVlODAyMTFfcHV0X3NuYXAoCisJCQlza2JfcHVzaChza2IsIFNOQVBfU0laRSArIHNpemVvZih1MTYpKSwgZXRoZXJfdHlwZSk7CisJZnJhZ19oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKilza2JfcHVzaChza2IsIGhkcl9sZW4pOworCW1lbWNweShmcmFnX2hkciwgKHZvaWQgKiloZWFkZXIsIGhkcl9sZW4pOworCWZyYWdfaGRyLT5zZXFfY3RsID0gY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmxbMF08PDQgfCAwKTsKKwlza2ItPnByaW9yaXR5ID0gVVAyQUMoc2tiLT5wcmlvcml0eSk7CisKKwkvLyBBZHZhbmNlIHNlcXVlbmNlIG51bWJlciBpbiBkYXRhIGZyYW1lLgorCS8vcHJpbnRrKEtFUk5fV0FSTklORyAiUW9TIEVuYWxiZWQ/ICVzXG4iLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuUW9TX0VuYWJsZT8iWSI6Ik4iKTsKKwlpZiAoaWVlZS0+c2VxX2N0cmxbMF0gPT0gMHhGRkYpCisJCWllZWUtPnNlcV9jdHJsWzBdID0gMDsKKwllbHNlCisJCWllZWUtPnNlcV9jdHJsWzBdKys7CisKKwlyZXR1cm4gdHhiOworfQorCisjZW5kaWYgLy8gX1JUTDgxODdfRVhUX1BBVENIXworCisvKiBTS0JzIGFyZSBhZGRlZCB0byB0aGUgaWVlZS0+dHhfcXVldWUuICovCitpbnQgaWVlZTgwMjExX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGllZWU4MDIxMV90eGIgKnR4YiA9IE5VTEw7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHJfUU9TICpmcmFnX2hkcjsKKwlpbnQgaSwgYnl0ZXNfcGVyX2ZyYWcsIG5yX2ZyYWdzLCBieXRlc19sYXN0X2ZyYWcsIGZyYWdfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZpZWVlLT5zdGF0czsKKwlpbnQgZXRoZXJfdHlwZSwgZW5jcnlwdDsKKwlpbnQgYnl0ZXMsIGZjLCBRT1NfY3RsLCBoZHJfbGVuOworCXN0cnVjdCBza19idWZmICpza2JfZnJhZzsKKwkvL3N0cnVjdCBpZWVlODAyMTFfaGRyIGhlYWRlciA9IHsgLyogRW5zdXJlIHplcm8gaW5pdGlhbGl6ZWQgKi8KKwkvLwkuZHVyYXRpb25faWQgPSAwLAorCS8vCS5zZXFfY3RsID0gMAorCS8vfTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcl9RT1MgaGVhZGVyID0geyAvKiBFbnN1cmUgemVybyBpbml0aWFsaXplZCAqLworCQkuZHVyYXRpb25faWQgPSAwLAorCQkuc2VxX2N0bCA9IDAsCisJCS5RT1NfY3RsID0gMAorCX07CisJdTggZGVzdFtFVEhfQUxFTl0sIHNyY1tFVEhfQUxFTl07CisKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEqIGNyeXB0OworCisJLy9wcmludGsoS0VSTl9XQVJOSU5HICJ1cHBlciBsYXllciBwYWNrZXQhXG4iKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJLyogSWYgdGhlcmUgaXMgbm8gZHJpdmVyIGhhbmRsZXIgdG8gdGFrZSB0aGUgVFhCLCBkb250JyBib3RoZXIKKwkgKiBjcmVhdGluZyBpdC4uLiAqLworCWlmICgoIWllZWUtPmhhcmRfc3RhcnRfeG1pdCAmJiAhKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfVFhfUVVFVUUpKXx8CisJICAgKCghaWVlZS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdCAmJiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19UWF9RVUVVRSkpKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTm8geG1pdCBoYW5kbGVyLlxuIiwKKwkJICAgICAgIGllZWUtPmRldi0+bmFtZSk7CisJCWdvdG8gc3VjY2VzczsKKwl9CisKKwlpZWVlODAyMTFfY2xhc3NpZnkoc2tiLCZpZWVlLT5jdXJyZW50X25ldHdvcmspOworCWlmKGxpa2VseShpZWVlLT5yYXdfdHggPT0gMCkpeworCisJCWlmICh1bmxpa2VseShza2ItPmxlbiA8IFNOQVBfU0laRSArIHNpemVvZih1MTYpKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHNrYiB0b28gc21hbGwgKCVkKS5cbiIsCisJCQlpZWVlLT5kZXYtPm5hbWUsIHNrYi0+bGVuKTsKKwkJCWdvdG8gc3VjY2VzczsKKwkJfQorCisKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCisJCS8vIG5vdGUsIHNrYi0+cHJpb3JpdHkgd2hpY2ggd2FzIHNldCBieSBpZWVlODAyMTFfY2xhc3NpZnksIGFuZCB1c2VkIGJ5IHBoeXNpY2FsIHR4CisJCWlmKChpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlKSAmJiAoaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV94bWl0KSkKKwkJeworCQkJdHhiID0gaWVlZS0+ZXh0X3BhdGNoX2llZWU4MDIxMV94bWl0KHNrYiwgZGV2KTsKKwkJCWdvdG8gc3VjY2VzczsKKwkJfQorI2VuZGlmCisKKwkJZXRoZXJfdHlwZSA9IG50b2hzKCgoc3RydWN0IGV0aGhkciAqKXNrYi0+ZGF0YSktPmhfcHJvdG8pOworCisJCWNyeXB0ID0gaWVlZS0+Y3J5cHRbaWVlZS0+dHhfa2V5aWR4XTsKKworCQllbmNyeXB0ID0gIShldGhlcl90eXBlID09IEVUSF9QX1BBRSAmJiBpZWVlLT5pZWVlODAyXzF4KSAmJgorCQkJaWVlZS0+aG9zdF9lbmNyeXB0ICYmIGNyeXB0ICYmIGNyeXB0LT5vcHM7CisKKwkJaWYgKCFlbmNyeXB0ICYmIGllZWUtPmllZWU4MDJfMXggJiYKKwkJaWVlZS0+ZHJvcF91bmVuY3J5cHRlZCAmJiBldGhlcl90eXBlICE9IEVUSF9QX1BBRSkgeworCQkJc3RhdHMtPnR4X2Ryb3BwZWQrKzsKKwkJCWdvdG8gc3VjY2VzczsKKwkJfQorCisJI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKKwkJaWYgKGNyeXB0ICYmICFlbmNyeXB0ICYmIGV0aGVyX3R5cGUgPT0gRVRIX1BfUEFFKSB7CisJCQlzdHJ1Y3QgZWFwb2wgKmVhcCA9IChzdHJ1Y3QgZWFwb2wgKikoc2tiLT5kYXRhICsKKwkJCQlzaXplb2Yoc3RydWN0IGV0aGhkcikgLSBTTkFQX1NJWkUgLSBzaXplb2YodTE2KSk7CisJCQlJRUVFODAyMTFfREVCVUdfRUFQKCJUWDogSUVFRSA4MDIuMTEgRUFQT0wgZnJhbWU6ICVzXG4iLAorCQkJCWVhcF9nZXRfdHlwZShlYXAtPnR5cGUpKTsKKwkJfQorCSNlbmRpZgorCisJCS8qIFNhdmUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhZGRyZXNzZXMgKi8KKwkJbWVtY3B5KCZkZXN0LCBza2ItPmRhdGEsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KCZzcmMsIHNrYi0+ZGF0YStFVEhfQUxFTiwgRVRIX0FMRU4pOworCisJCS8qIEFkdmFuY2UgdGhlIFNLQiB0byB0aGUgc3RhcnQgb2YgdGhlIHBheWxvYWQgKi8KKwkJc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGV0aGhkcikpOworCisJCS8qIERldGVybWluZSB0b3RhbCBhbW91bnQgb2Ygc3RvcmFnZSByZXF1aXJlZCBmb3IgVFhCIHBhY2tldHMgKi8KKwkJYnl0ZXMgPSBza2ItPmxlbiArIFNOQVBfU0laRSArIHNpemVvZih1MTYpOworCisJCWlmKGllZWUtPmN1cnJlbnRfbmV0d29yay5Rb1NfRW5hYmxlKSB7CisJCQlpZiAoZW5jcnlwdCkKKwkJCQlmYyA9IElFRUU4MDIxMV9GVFlQRV9EQVRBIHwgSUVFRTgwMjExX1NUWVBFX1FPU19EQVRBIHwKKwkJCQkJSUVFRTgwMjExX0ZDVExfV0VQOworCQkJZWxzZQorCQkJCWZjID0gSUVFRTgwMjExX0ZUWVBFX0RBVEEgfCBJRUVFODAyMTFfU1RZUEVfUU9TX0RBVEE7CisKKwkJfSBlbHNlIHsKKwkJCWlmIChlbmNyeXB0KQorCQkJCWZjID0gSUVFRTgwMjExX0ZUWVBFX0RBVEEgfCBJRUVFODAyMTFfU1RZUEVfREFUQSB8CisJCQkJCUlFRUU4MDIxMV9GQ1RMX1dFUDsKKwkJCWVsc2UKKwkJCQlmYyA9IElFRUU4MDIxMV9GVFlQRV9EQVRBIHwgSUVFRTgwMjExX1NUWVBFX0RBVEE7CisJCX0KKworCQlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSB7CisJCQlmYyB8PSBJRUVFODAyMTFfRkNUTF9UT0RTOworCQkJLyogVG8gRFM6IEFkZHIxID0gQlNTSUQsIEFkZHIyID0gU0EsCisJCQlBZGRyMyA9IERBICovCisJCQltZW1jcHkoJmhlYWRlci5hZGRyMSwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7CisJCQltZW1jcHkoJmhlYWRlci5hZGRyMiwgJnNyYywgRVRIX0FMRU4pOworCQkJbWVtY3B5KCZoZWFkZXIuYWRkcjMsICZkZXN0LCBFVEhfQUxFTik7CisJCX0gZWxzZSBpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKSB7CisJCQkvKiBub3QgRnJvbS9UbyBEUzogQWRkcjEgPSBEQSwgQWRkcjIgPSBTQSwKKwkJCUFkZHIzID0gQlNTSUQgKi8KKwkJCW1lbWNweSgmaGVhZGVyLmFkZHIxLCBkZXN0LCBFVEhfQUxFTik7CisJCQltZW1jcHkoJmhlYWRlci5hZGRyMiwgc3JjLCBFVEhfQUxFTik7CisJCQltZW1jcHkoJmhlYWRlci5hZGRyMywgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7CisJCX0KKwkvLwlwcmludGsoS0VSTl9XQVJOSU5HICJlc3NpZCBNQUMgYWRkcmVzcyBpcyAiTUFDX0ZNVCwgTUFDX0FSRygmaGVhZGVyLmFkZHIxKSk7CisJCWhlYWRlci5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihmYyk7CisJCS8vaGRyX2xlbiA9IElFRUU4MDIxMV8zQUREUl9MRU47CisKKwkJLyogRGV0ZXJtaW5lIGZyYWdtZW50YXRpb24gc2l6ZSBiYXNlZCBvbiBkZXN0aW5hdGlvbiAobXVsdGljYXN0CisJCSogYW5kIGJyb2FkY2FzdCBhcmUgbm90IGZyYWdtZW50ZWQpICovCisvLwkJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGRlc3QpIHx8CisvLwkJaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoZGVzdCkpIHsKKwkJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhlYWRlci5hZGRyMSkgfHwKKwkJaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoaGVhZGVyLmFkZHIxKSkgeworCQkJZnJhZ19zaXplID0gTUFYX0ZSQUdfVEhSRVNIT0xEOworCQkJUU9TX2N0bCA9IFFPU19DVExfTk9UQ09OVEFJTl9BQ0s7CisJCX0KKwkJZWxzZSB7CisJCQkvL3ByaW50ayhLRVJOX1dBUk5JTkcgIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJmZyYWdfc2l6ZSA9ICVkXG4iLCBmcmFnX3NpemUpOworCQkJZnJhZ19zaXplID0gaWVlZS0+ZnRzOy8vZGVmYXVsdDozOTIKKwkJCVFPU19jdGwgPSAwOworCQl9CisKKwkJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5Rb1NfRW5hYmxlKQl7CisJCQloZHJfbGVuID0gSUVFRTgwMjExXzNBRERSX0xFTiArIDI7CisJCQlRT1NfY3RsIHw9IHNrYi0+cHJpb3JpdHk7IC8vc2V0IGluIHRoZSBpZWVlODAyMTFfY2xhc3NpZnkKKwkJCWhlYWRlci5RT1NfY3RsID0gY3B1X3RvX2xlMTYoUU9TX2N0bCk7CisJCX0gZWxzZSB7CisJCQloZHJfbGVuID0gSUVFRTgwMjExXzNBRERSX0xFTjsKKwkJfQorCQkvL3ByaW50ayhLRVJOX1dBUk5JTkcgImhlYWRlciBzaXplID0gJWQsIFFPU19jdGwgPSAleFxuIiwgaGRyX2xlbixRT1NfY3RsKTsKKwkJLyogRGV0ZXJtaW5lIGFtb3VudCBvZiBwYXlsb2FkIHBlciBmcmFnbWVudC4gIFJlZ2FyZGxlc3Mgb2YgaWYKKwkJKiB0aGlzIHN0YWNrIGlzIHByb3ZpZGluZyB0aGUgZnVsbCA4MDIuMTEgaGVhZGVyLCBvbmUgd2lsbAorCQkqIGV2ZW50dWFsbHkgYmUgYWZmaXhlZCB0byB0aGlzIGZyYWdtZW50IC0tIHNvIHdlIG11c3QgYWNjb3VudCBmb3IKKwkJKiBpdCB3aGVuIGRldGVybWluaW5nIHRoZSBhbW91bnQgb2YgcGF5bG9hZCBzcGFjZS4gKi8KKwkJLy9ieXRlc19wZXJfZnJhZyA9IGZyYWdfc2l6ZSAtIChJRUVFODAyMTFfM0FERFJfTEVOICsgKGllZWUtPmN1cnJlbnRfbmV0d29yay0+UW9TX0VuYWJsZSA/IDI6MCkpOworCQlieXRlc19wZXJfZnJhZyA9IGZyYWdfc2l6ZSAtIGhkcl9sZW47CisJCWlmIChpZWVlLT5jb25maWcgJgorCQkoQ0ZHX0lFRUU4MDIxMV9DT01QVVRFX0ZDUyB8IENGR19JRUVFODAyMTFfUkVTRVJWRV9GQ1MpKQorCQkJYnl0ZXNfcGVyX2ZyYWcgLT0gSUVFRTgwMjExX0ZDU19MRU47CisKKwkJLyogRWFjaCBmcmFnbWVudCBtYXkgbmVlZCB0byBoYXZlIHJvb20gZm9yIGVuY3J5cHRpb25nIHByZS9wb3N0Zml4ICovCisJCWlmIChlbmNyeXB0KQorCQkJYnl0ZXNfcGVyX2ZyYWcgLT0gY3J5cHQtPm9wcy0+ZXh0cmFfcHJlZml4X2xlbiArCisJCQkJY3J5cHQtPm9wcy0+ZXh0cmFfcG9zdGZpeF9sZW47CisKKwkJLyogTnVtYmVyIG9mIGZyYWdtZW50cyBpcyB0aGUgdG90YWwgYnl0ZXNfcGVyX2ZyYWcgLworCQkqIHBheWxvYWRfcGVyX2ZyYWdtZW50ICovCisJCW5yX2ZyYWdzID0gYnl0ZXMgLyBieXRlc19wZXJfZnJhZzsKKwkJYnl0ZXNfbGFzdF9mcmFnID0gYnl0ZXMgJSBieXRlc19wZXJfZnJhZzsKKwkJaWYgKGJ5dGVzX2xhc3RfZnJhZykKKwkJCW5yX2ZyYWdzKys7CisJCWVsc2UKKwkJCWJ5dGVzX2xhc3RfZnJhZyA9IGJ5dGVzX3Blcl9mcmFnOworCisJCS8qIFdoZW4gd2UgYWxsb2NhdGUgdGhlIFRYQiB3ZSBhbGxvY2F0ZSBlbm91Z2ggc3BhY2UgZm9yIHRoZSByZXNlcnZlCisJCSogYW5kIGZ1bGwgZnJhZ21lbnQgYnl0ZXMgKGJ5dGVzX3Blcl9mcmFnIGRvZXNuJ3QgaW5jbHVkZSBwcmVmaXgsCisJCSogcG9zdGZpeCwgaGVhZGVyLCBGQ1MsIGV0Yy4pICovCisJCXR4YiA9IGllZWU4MDIxMV9hbGxvY190eGIobnJfZnJhZ3MsIGZyYWdfc2l6ZSwgR0ZQX0FUT01JQyk7CisJCWlmICh1bmxpa2VseSghdHhiKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBUWEJcbiIsCisJCQlpZWVlLT5kZXYtPm5hbWUpOworCQkJZ290byBmYWlsZWQ7CisJCX0KKwkJdHhiLT5lbmNyeXB0ZWQgPSBlbmNyeXB0OworCQl0eGItPnBheWxvYWRfc2l6ZSA9IGJ5dGVzOworCisJCWZvciAoaSA9IDA7IGkgPCBucl9mcmFnczsgaSsrKSB7CisJCQlza2JfZnJhZyA9IHR4Yi0+ZnJhZ21lbnRzW2ldOworCQkJc2tiX2ZyYWctPnByaW9yaXR5ID0gVVAyQUMoc2tiLT5wcmlvcml0eSk7CisJCQlpZiAoZW5jcnlwdCkKKwkJCQlza2JfcmVzZXJ2ZShza2JfZnJhZywgY3J5cHQtPm9wcy0+ZXh0cmFfcHJlZml4X2xlbik7CisKKwkJCWZyYWdfaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyX1FPUyAqKXNrYl9wdXQoc2tiX2ZyYWcsIGhkcl9sZW4pOworCQkJbWVtY3B5KGZyYWdfaGRyLCAmaGVhZGVyLCBoZHJfbGVuKTsKKworCQkJLyogSWYgdGhpcyBpcyBub3QgdGhlIGxhc3QgZnJhZ21lbnQsIHRoZW4gYWRkIHRoZSBNT1JFRlJBR1MKKwkJCSogYml0IHRvIHRoZSBmcmFtZSBjb250cm9sICovCisJCQlpZiAoaSAhPSBucl9mcmFncyAtIDEpIHsKKwkJCQlmcmFnX2hkci0+ZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoCisJCQkJCWZjIHwgSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTKTsKKwkJCQlieXRlcyA9IGJ5dGVzX3Blcl9mcmFnOworCisJCQl9IGVsc2UgeworCQkJCS8qIFRoZSBsYXN0IGZyYWdtZW50IHRha2VzIHRoZSByZW1haW5pbmcgbGVuZ3RoICovCisJCQkJYnl0ZXMgPSBieXRlc19sYXN0X2ZyYWc7CisJCQl9CisJCQlpZihpZWVlLT5jdXJyZW50X25ldHdvcmsuUW9TX0VuYWJsZSkgeworCQkJICAvLyBhZGQgMSBvbmx5IGluZGljYXRlIHRvIGNvcnJlc3BvbmRpbmcgc2VxIG51bWJlciBjb250cm9sIDIwMDYvNy8xMgorCQkJICBmcmFnX2hkci0+c2VxX2N0bCA9IGNwdV90b19sZTE2KGllZWUtPnNlcV9jdHJsW1VQMkFDKHNrYi0+cHJpb3JpdHkpKzFdPDw0IHwgaSk7CisJCQkgIC8vcHJpbnRrKEtFUk5fV0FSTklORyAic2tiLT5wcmlvcml0eSA9ICVkLCIsIHNrYi0+cHJpb3JpdHkpOworCQkJICAvL3ByaW50ayhLRVJOX1dBUk5JTkcgInR5cGU6JWQ6IHNlcSA9ICVkXG4iLFVQMkFDKHNrYi0+cHJpb3JpdHkpLGllZWUtPnNlcV9jdHJsW1VQMkFDKHNrYi0+cHJpb3JpdHkpKzFdKTsKKwkJCX0gZWxzZSB7CisJCQkgIGZyYWdfaGRyLT5zZXFfY3RsID0gY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmxbMF08PDQgfCBpKTsKKwkJCX0KKwkJCS8vZnJhZ19oZHItPnNlcV9jdGwgPSBjcHVfdG9fbGUxNihpZWVlLT5zZXFfY3RybDw8NCB8IGkpOworCQkJLy8KKworCQkJLyogUHV0IGEgU05BUCBoZWFkZXIgb24gdGhlIGZpcnN0IGZyYWdtZW50ICovCisJCQlpZiAoaSA9PSAwKSB7CisJCQkJaWVlZTgwMjExX3B1dF9zbmFwKAorCQkJCQlza2JfcHV0KHNrYl9mcmFnLCBTTkFQX1NJWkUgKyBzaXplb2YodTE2KSksCisJCQkJCWV0aGVyX3R5cGUpOworCQkJCWJ5dGVzIC09IFNOQVBfU0laRSArIHNpemVvZih1MTYpOworCQkJfQorCisJCQltZW1jcHkoc2tiX3B1dChza2JfZnJhZywgYnl0ZXMpLCBza2ItPmRhdGEsIGJ5dGVzKTsKKworCQkJLyogQWR2YW5jZSB0aGUgU0tCLi4uICovCisJCQlza2JfcHVsbChza2IsIGJ5dGVzKTsKKworCQkJLyogRW5jcnlwdGlvbiByb3V0aW5lIHdpbGwgbW92ZSB0aGUgaGVhZGVyIGZvcndhcmQgaW4gb3JkZXIKKwkJCSogdG8gaW5zZXJ0IHRoZSBJViBiZXR3ZWVuIHRoZSBoZWFkZXIgYW5kIHRoZSBwYXlsb2FkICovCisJCQlpZiAoZW5jcnlwdCkKKwkJCQlpZWVlODAyMTFfZW5jcnlwdF9mcmFnbWVudChpZWVlLCBza2JfZnJhZywgaGRyX2xlbik7CisJCQlpZiAoaWVlZS0+Y29uZmlnICYKKwkJCShDRkdfSUVFRTgwMjExX0NPTVBVVEVfRkNTIHwgQ0ZHX0lFRUU4MDIxMV9SRVNFUlZFX0ZDUykpCisJCQkJc2tiX3B1dChza2JfZnJhZywgNCk7CisJCX0KKwkJLy8gQWR2YW5jZSBzZXF1ZW5jZSBudW1iZXIgaW4gZGF0YSBmcmFtZS4KKwkJLy9wcmludGsoS0VSTl9XQVJOSU5HICJRb1MgRW5hbGJlZD8gJXNcbiIsIGllZWUtPmN1cnJlbnRfbmV0d29yay5Rb1NfRW5hYmxlPyJZIjoiTiIpOworCQlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLlFvU19FbmFibGUpIHsKKwkJICBpZiAoaWVlZS0+c2VxX2N0cmxbVVAyQUMoc2tiLT5wcmlvcml0eSkgKyAxXSA9PSAweEZGRikKKwkJCWllZWUtPnNlcV9jdHJsW1VQMkFDKHNrYi0+cHJpb3JpdHkpICsgMV0gPSAwOworCQkgIGVsc2UKKwkJCWllZWUtPnNlcV9jdHJsW1VQMkFDKHNrYi0+cHJpb3JpdHkpICsgMV0rKzsKKwkJfSBlbHNlIHsKKyAgCQkgIGlmIChpZWVlLT5zZXFfY3RybFswXSA9PSAweEZGRikKKwkJCWllZWUtPnNlcV9jdHJsWzBdID0gMDsKKwkJICBlbHNlCisJCQlpZWVlLT5zZXFfY3RybFswXSsrOworCQl9CisJCS8vLS0tCisJfWVsc2V7CisJCWlmICh1bmxpa2VseShza2ItPmxlbiA8IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogc2tiIHRvbyBzbWFsbCAoJWQpLlxuIiwKKwkJCWllZWUtPmRldi0+bmFtZSwgc2tiLT5sZW4pOworCQkJZ290byBzdWNjZXNzOworCQl9CisKKwkJdHhiID0gaWVlZTgwMjExX2FsbG9jX3R4YigxLCBza2ItPmxlbiwgR0ZQX0FUT01JQyk7CisJCWlmKCF0eGIpeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBUWEJcbiIsCisJCQlpZWVlLT5kZXYtPm5hbWUpOworCQkJZ290byBmYWlsZWQ7CisJCX0KKworCQl0eGItPmVuY3J5cHRlZCA9IDA7CisJCXR4Yi0+cGF5bG9hZF9zaXplID0gc2tiLT5sZW47CisJCW1lbWNweShza2JfcHV0KHR4Yi0+ZnJhZ21lbnRzWzBdLHNrYi0+bGVuKSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJfQorCisgc3VjY2VzczoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisjaWZkZWYgX1JUTDgxODdfRVhUX1BBVENIXworCS8vIFNvbWV0aW1lcywgZXh0ZW5zaW9uIG1vZGUgY2FuIHJldXNlIHNrYiAoYnkgdHhiLT5mcmFnbWVudHNbMF0pCisJaWYoICEgKChpZWVlLT5pd19tb2RlID09IGllZWUtPml3X2V4dF9tb2RlKSAmJiB0eGIgJiYgKHR4Yi0+ZnJhZ21lbnRzWzBdID09IHNrYikpICkKKyNlbmRpZgorCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCWlmICh0eGIpIHsKKwkJaWYgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfVFhfUVVFVUUpeworCQkJaWVlZTgwMjExX3NvZnRtYWNfeG1pdCh0eGIsIGllZWUpOworCQl9ZWxzZXsKKwkJCWlmICgoKmllZWUtPmhhcmRfc3RhcnRfeG1pdCkodHhiLCBkZXYpID09IDApIHsKKwkJCQlzdGF0cy0+dHhfcGFja2V0cysrOworCQkJCXN0YXRzLT50eF9ieXRlcyArPSB0eGItPnBheWxvYWRfc2l6ZTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWllZWU4MDIxMV90eGJfZnJlZSh0eGIpOworCQl9CisJfQorCisJcmV0dXJuIDA7CisKKyBmYWlsZWQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlzdGF0cy0+dHhfZXJyb3JzKys7CisJcmV0dXJuIDE7CisKK30KKworI2lmIDAKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3R4Yl9mcmVlKTsKKyNpZmRlZiBfUlRMODE4N19FWFRfUEFUQ0hfCitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9hbGxvY190eGIpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfZXh0X2FsbG9jX3R4Yik7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9leHRfcmV1c2VfdHhiKTsKKyNlbmRpZiAvLyBfUlRMODE4N19FWFRfUEFUQ0hfCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3d4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFhZDYxZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCkBAIC0wLDAgKzEsODg0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgQ29weXJpZ2h0KGMpIDIwMDQgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBiYXNlZCBvbiB0aGUgV0VQIGVuYWJsZW1lbnQgY29kZSBwcm92aWRlZCBieSB0aGUKKyAgSG9zdCBBUCBwcm9qZWN0IGhvc3RhcC1kcml2ZXJzIHYwLjEuMworICBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiwgU1NIIENvbW11bmljYXRpb25zIFNlY3VyaXR5IENvcnAgYW5kIEpvdW5pIE1hbGluZW4KKyAgPGprbWFsaW5lQGNjLmh1dC5maT4KKyAgQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorCisgIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICBmaWxlIGNhbGxlZCBMSUNFTlNFLgorCisgIENvbnRhY3QgSW5mb3JtYXRpb246CisgIEphbWVzIFAuIEtldHJlbm9zIDxpcHcyMTAwLWFkbWluQGxpbnV4LmludGVsLmNvbT4KKyAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAiaWVlZTgwMjExLmgiCitzdGF0aWMgY29uc3QgY2hhciAqaWVlZTgwMjExX21vZGVzW10gPSB7CisJIj8iLCAiYSIsICJiIiwgImFiIiwgImciLCAiYWciLCAiYmciLCAiYWJnIgorfTsKKworI2lmZGVmIEZFRE9SQUNPUkVfOQorI2RlZmluZSBJTl9GRURPUkFDT1JFXzkgMQorI2Vsc2UKKyNkZWZpbmUgSU5fRkVET1JBQ09SRV85IDAKKyNlbmRpZgorCisjZGVmaW5lIE1BWF9DVVNUT01fTEVOIDY0CitzdGF0aWMgaW5saW5lIGNoYXIgKnJ0bDgxOHhfdHJhbnNsYXRlX3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnN0YXJ0LCBjaGFyICpzdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvKQoreworCWNoYXIgY3VzdG9tW01BWF9DVVNUT01fTEVOXTsKKwljaGFyICpwOworCXN0cnVjdCBpd19ldmVudCBpd2U7CisJaW50IGksIGo7CisJdTggbWF4X3JhdGUsIHJhdGU7CisKKwkvKiBGaXJzdCBlbnRyeSAqTVVTVCogYmUgdGhlIEFQIE1BQyBhZGRyZXNzICovCisJaXdlLmNtZCA9IFNJT0NHSVdBUDsKKwlpd2UudS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwltZW1jcHkoaXdlLnUuYXBfYWRkci5zYV9kYXRhLCBuZXR3b3JrLT5ic3NpZCwgRVRIX0FMRU4pOworI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KSl8fElOX0ZFRE9SQUNPUkVfOSkKKwlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBJV19FVl9BRERSX0xFTik7CisjZWxzZQorCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoc3RhcnQsIHN0b3AsICZpd2UsIElXX0VWX0FERFJfTEVOKTsKKyNlbmRpZgorCisJLyogUmVtYWluaW5nIGVudHJpZXMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIG9yZGVyIHdlIHByb3ZpZGUgdGhlbSAqLworCisJLyogQWRkIHRoZSBFU1NJRCAqLworCWl3ZS5jbWQgPSBTSU9DR0lXRVNTSUQ7CisJaXdlLnUuZGF0YS5mbGFncyA9IDE7CisJLy9ZSixtb2RpZmllZCwwODA5MDMsZm9yIGhpZGRlbiBhcAorCS8vaWYgKG5ldHdvcmstPmZsYWdzICYgTkVUV09SS19FTVBUWV9FU1NJRCkgeworCWlmIChuZXR3b3JrLT5zc2lkX2xlbiA9PSAwKSB7CisJLy9ZSixtb2RpZmllZCwwODA5MDMsZW5kCisJCWl3ZS51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKCI8aGlkZGVuPiIpOworI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KSl8fElOX0ZFRE9SQUNPUkVfOSkKKwkJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgIjxoaWRkZW4+Iik7CisjZWxzZQorCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KHN0YXJ0LCBzdG9wLCAmaXdlLCAiPGhpZGRlbj4iKTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCWl3ZS51LmRhdGEubGVuZ3RoID0gbWluKG5ldHdvcmstPnNzaWRfbGVuLCAodTgpMzIpOworI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KSl8fElOX0ZFRE9SQUNPUkVfOSkKKwkJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgbmV0d29yay0+c3NpZCk7CisjZWxzZQorCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KHN0YXJ0LCBzdG9wLCAmaXdlLCBuZXR3b3JrLT5zc2lkKTsKKyNlbmRpZgorCX0KKwkvL3ByaW50aygiRVNTSUQ6ICVzXG4iLG5ldHdvcmstPnNzaWQpOworCS8qIEFkZCB0aGUgcHJvdG9jb2wgbmFtZSAqLworCWl3ZS5jbWQgPSBTSU9DR0lXTkFNRTsKKwlzbnByaW50Zihpd2UudS5uYW1lLCBJRk5BTVNJWiwgIklFRUUgODAyLjExJXMiLCBpZWVlODAyMTFfbW9kZXNbbmV0d29yay0+bW9kZV0pOworI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KSl8fElOX0ZFRE9SQUNPUkVfOSkKKwlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBJV19FVl9DSEFSX0xFTik7CisjZWxzZQorCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoc3RhcnQsIHN0b3AsICZpd2UsIElXX0VWX0NIQVJfTEVOKTsKKyNlbmRpZgorCisgICAgICAgIC8qIEFkZCBtb2RlICovCisgICAgICAgIGl3ZS5jbWQgPSBTSU9DR0lXTU9ERTsKKyAgICAgICAgaWYgKG5ldHdvcmstPmNhcGFiaWxpdHkgJgorCSAgICAoV0xBTl9DQVBBQklMSVRZX0JTUyB8IFdMQU5fQ0FQQUJJTElUWV9JQlNTKSkgeworCQlpZiAobmV0d29yay0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9CU1MpCisJCQlpd2UudS5tb2RlID0gSVdfTU9ERV9NQVNURVI7CisJCWVsc2UKKwkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX0FESE9DOworCisjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpKXx8SU5fRkVET1JBQ09SRV85KQorCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBJV19FVl9VSU5UX0xFTik7CisjZWxzZQorCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KHN0YXJ0LCBzdG9wLCAmaXdlLCBJV19FVl9VSU5UX0xFTik7CisjZW5kaWYKKwl9CisKKyAgICAgICAgLyogQWRkIGZyZXF1ZW5jeS9jaGFubmVsICovCisJaXdlLmNtZCA9IFNJT0NHSVdGUkVROworLyoJaXdlLnUuZnJlcS5tID0gaWVlZTgwMjExX2ZyZXF1ZW5jeShuZXR3b3JrLT5jaGFubmVsLCBuZXR3b3JrLT5tb2RlKTsKKwlpd2UudS5mcmVxLmUgPSAzOyAqLworCWl3ZS51LmZyZXEubSA9IG5ldHdvcmstPmNoYW5uZWw7CisJaXdlLnUuZnJlcS5lID0gMDsKKwlpd2UudS5mcmVxLmkgPSAwOworI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KSl8fElOX0ZFRE9SQUNPUkVfOSkKKwlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBJV19FVl9GUkVRX0xFTik7CisjZWxzZQorCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoc3RhcnQsIHN0b3AsICZpd2UsIElXX0VWX0ZSRVFfTEVOKTsKKyNlbmRpZgorCisJLyogQWRkIGVuY3J5cHRpb24gY2FwYWJpbGl0eSAqLworCWl3ZS5jbWQgPSBTSU9DR0lXRU5DT0RFOworCWlmIChuZXR3b3JrLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpCisJCWl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRU5BQkxFRCB8IElXX0VOQ09ERV9OT0tFWTsKKwllbHNlCisJCWl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7CisJaXdlLnUuZGF0YS5sZW5ndGggPSAwOworI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KSl8fElOX0ZFRE9SQUNPUkVfOSkKKwlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBuZXR3b3JrLT5zc2lkKTsKKyNlbHNlCisJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChzdGFydCwgc3RvcCwgJml3ZSwgbmV0d29yay0+c3NpZCk7CisjZW5kaWYKKworCS8qIEFkZCBiYXNpYyBhbmQgZXh0ZW5kZWQgcmF0ZXMgKi8KKwltYXhfcmF0ZSA9IDA7CisJcCA9IGN1c3RvbTsKKwlwICs9IHNucHJpbnRmKHAsIE1BWF9DVVNUT01fTEVOIC0gKHAgLSBjdXN0b20pLCAiIFJhdGVzIChNYi9zKTogIik7CisJZm9yIChpID0gMCwgaiA9IDA7IGkgPCBuZXR3b3JrLT5yYXRlc19sZW47ICkgeworCQlpZiAoaiA8IG5ldHdvcmstPnJhdGVzX2V4X2xlbiAmJgorCQkgICAgKChuZXR3b3JrLT5yYXRlc19leFtqXSAmIDB4N0YpIDwKKwkJICAgICAobmV0d29yay0+cmF0ZXNbaV0gJiAweDdGKSkpCisJCQlyYXRlID0gbmV0d29yay0+cmF0ZXNfZXhbaisrXSAmIDB4N0Y7CisJCWVsc2UKKwkJCXJhdGUgPSBuZXR3b3JrLT5yYXRlc1tpKytdICYgMHg3RjsKKwkJaWYgKHJhdGUgPiBtYXhfcmF0ZSkKKwkJCW1heF9yYXRlID0gcmF0ZTsKKwkJcCArPSBzbnByaW50ZihwLCBNQVhfQ1VTVE9NX0xFTiAtIChwIC0gY3VzdG9tKSwKKwkJCSAgICAgICIlZCVzICIsIHJhdGUgPj4gMSwgKHJhdGUgJiAxKSA/ICIuNSIgOiAiIik7CisJfQorCWZvciAoOyBqIDwgbmV0d29yay0+cmF0ZXNfZXhfbGVuOyBqKyspIHsKKwkJcmF0ZSA9IG5ldHdvcmstPnJhdGVzX2V4W2pdICYgMHg3RjsKKwkJcCArPSBzbnByaW50ZihwLCBNQVhfQ1VTVE9NX0xFTiAtIChwIC0gY3VzdG9tKSwKKwkJCSAgICAgICIlZCVzICIsIHJhdGUgPj4gMSwgKHJhdGUgJiAxKSA/ICIuNSIgOiAiIik7CisJCWlmIChyYXRlID4gbWF4X3JhdGUpCisJCQltYXhfcmF0ZSA9IHJhdGU7CisJfQorCisJaXdlLmNtZCA9IFNJT0NHSVdSQVRFOworCWl3ZS51LmJpdHJhdGUuZml4ZWQgPSBpd2UudS5iaXRyYXRlLmRpc2FibGVkID0gMDsKKwlpd2UudS5iaXRyYXRlLnZhbHVlID0gbWF4X3JhdGUgKiA1MDAwMDA7CisjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpKXx8SU5fRkVET1JBQ09SRV85KQorCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIElXX0VWX1BBUkFNX0xFTik7CisjZWxzZQorCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoc3RhcnQsIHN0b3AsICZpd2UsIElXX0VWX1BBUkFNX0xFTik7CisjZW5kaWYKKworCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworCWl3ZS51LmRhdGEubGVuZ3RoID0gcCAtIGN1c3RvbTsKKwlpZiAoaXdlLnUuZGF0YS5sZW5ndGgpCisjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpKXx8SU5fRkVET1JBQ09SRV85KQorCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBjdXN0b20pOworI2Vsc2UKKwkJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChzdGFydCwgc3RvcCwgJml3ZSwgY3VzdG9tKTsKKyNlbmRpZgorCisJLyogQWRkIHF1YWxpdHkgc3RhdGlzdGljcyAqLworCS8qIFRPRE86IEZpeCB0aGVzZSB2YWx1ZXMuLi4gKi8KKwlpZiAobmV0d29yay0+c3RhdHMuc2lnbmFsID09IDAgfHwgbmV0d29yay0+c3RhdHMucnNzaSA9PSAwKQorCXByaW50aygiPT09PT09PT0+c2lnbmFsOiVkLCByc3NpOiVkXG4iLCBuZXR3b3JrLT5zdGF0cy5zaWduYWwsIG5ldHdvcmstPnN0YXRzLnJzc2kpOworCWl3ZS5jbWQgPSBJV0VWUVVBTDsKKy8vCXByaW50aygiU0lHTkFMOiAlZCxSU1NJOiAlZCxOT0lTRTogJWRcbiIsbmV0d29yay0+c3RhdHMuc2lnbmFsLG5ldHdvcmstPnN0YXRzLnJzc2ksbmV0d29yay0+c3RhdHMubm9pc2UpOworCWl3ZS51LnF1YWwucXVhbCA9IG5ldHdvcmstPnN0YXRzLnNpZ25hbHN0cmVuZ3RoOworCWl3ZS51LnF1YWwubGV2ZWwgPSBuZXR3b3JrLT5zdGF0cy5zaWduYWw7CisJaXdlLnUucXVhbC5ub2lzZSA9IG5ldHdvcmstPnN0YXRzLm5vaXNlOworCWl3ZS51LnF1YWwudXBkYXRlZCA9IG5ldHdvcmstPnN0YXRzLm1hc2sgJiBJRUVFODAyMTFfU1RBVE1BU0tfV0VNQVNLOworCWlmICghKG5ldHdvcmstPnN0YXRzLm1hc2sgJiBJRUVFODAyMTFfU1RBVE1BU0tfUlNTSSkpCisJCWl3ZS51LnF1YWwudXBkYXRlZCB8PSBJV19RVUFMX0xFVkVMX0lOVkFMSUQ7CisJaWYgKCEobmV0d29yay0+c3RhdHMubWFzayAmIElFRUU4MDIxMV9TVEFUTUFTS19OT0lTRSkpCisJCWl3ZS51LnF1YWwudXBkYXRlZCB8PSBJV19RVUFMX05PSVNFX0lOVkFMSUQ7CisJaWYgKCEobmV0d29yay0+c3RhdHMubWFzayAmIElFRUU4MDIxMV9TVEFUTUFTS19TSUdOQUwpKQorCQlpd2UudS5xdWFsLnVwZGF0ZWQgfD0gSVdfUVVBTF9RVUFMX0lOVkFMSUQ7CisJaXdlLnUucXVhbC51cGRhdGVkID0gNzsKKyNpZigoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykpfHxJTl9GRURPUkFDT1JFXzkpCisJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgSVdfRVZfUVVBTF9MRU4pOworI2Vsc2UKKwlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KHN0YXJ0LCBzdG9wLCAmaXdlLCBJV19FVl9RVUFMX0xFTik7CisjZW5kaWYKKworCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworCXAgPSBjdXN0b207CisKKwlpd2UudS5kYXRhLmxlbmd0aCA9IHAgLSBjdXN0b207CisJaWYgKGl3ZS51LmRhdGEubGVuZ3RoKQorI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KSl8fElOX0ZFRE9SQUNPUkVfOSkKKwkJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgY3VzdG9tKTsKKyNlbHNlCisJCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoc3RhcnQsIHN0b3AsICZpd2UsIGN1c3RvbSk7CisjZW5kaWYKKworI2lmIDAKKwlpZiAoaWVlZS0+d3BhX2VuYWJsZWQgJiYgbmV0d29yay0+d3BhX2llX2xlbil7CisJCWNoYXIgYnVmW01BWF9XUEFfSUVfTEVOICogMiArIDMwXTsKKwkvLwlwcmludGsoIldQQSBJRVxuIik7CisJCXU4ICpwID0gYnVmOworCQlwICs9IHNwcmludGYocCwgIndwYV9pZT0iKTsKKwkJZm9yIChpID0gMDsgaSA8IG5ldHdvcmstPndwYV9pZV9sZW47IGkrKykgeworCQkJcCArPSBzcHJpbnRmKHAsICIlMDJ4IiwgbmV0d29yay0+d3BhX2llW2ldKTsKKwkJfQorCisJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworCQlpd2UudS5kYXRhLmxlbmd0aCA9IHN0cmxlbihidWYpOworI2lmKChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KSl8fElOX0ZFRE9SQUNPUkVfOSkKKwkJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgYnVmKTsKKyNlbHNlCisJCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoc3RhcnQsIHN0b3AsICZpd2UsIGJ1Zik7CisjZW5kaWYKKwl9CisKKwlpZiAoaWVlZS0+d3BhX2VuYWJsZWQgJiYgbmV0d29yay0+cnNuX2llX2xlbil7CisJCWNoYXIgYnVmW01BWF9XUEFfSUVfTEVOICogMiArIDMwXTsKKworCQl1OCAqcCA9IGJ1ZjsKKwkJcCArPSBzcHJpbnRmKHAsICJyc25faWU9Iik7CisJCWZvciAoaSA9IDA7IGkgPCBuZXR3b3JrLT5yc25faWVfbGVuOyBpKyspIHsKKwkJCXAgKz0gc3ByaW50ZihwLCAiJTAyeCIsIG5ldHdvcmstPnJzbl9pZVtpXSk7CisJCX0KKworCisjZWxzZQorCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworICAgICAgICBpZiAobmV0d29yay0+d3BhX2llX2xlbikgeworCS8vCXByaW50aygid3BhX2llX2xlbjolZFxuIiwgbmV0d29yay0+d3BhX2llX2xlbik7CisgICAgICAgICAgICAgICAgY2hhciBidWZbTUFYX1dQQV9JRV9MRU5dOworICAgICAgICAgICAgICAgIG1lbWNweShidWYsIG5ldHdvcmstPndwYV9pZSwgbmV0d29yay0+d3BhX2llX2xlbik7CisgICAgICAgICAgICAgICAgaXdlLmNtZCA9IElXRVZHRU5JRTsKKyAgICAgICAgICAgICAgICBpd2UudS5kYXRhLmxlbmd0aCA9IG5ldHdvcmstPndwYV9pZV9sZW47CisjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpKXx8SU5fRkVET1JBQ09SRV85KQorICAgICAgICAgICAgICAgIHN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIGJ1Zik7CisjZWxzZQorICAgICAgICAgICAgICAgIHN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoc3RhcnQsIHN0b3AsICZpd2UsIGJ1Zik7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIG1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisgICAgICAgIGlmIChuZXR3b3JrLT5yc25faWVfbGVuKSB7CisJLy8JcHJpbnRrKCI9PT09PT5yc25faWVfbGVuOlxuIiwgbmV0d29yay0+cnNuX2llX2xlbik7CisJCSNpZiAwCisJCXsKKwkJCWludCBpOworCQkJZm9yIChpPTA7IGk8bmV0d29yay0+cnNuX2llX2xlbjsgaSsrKTsKKwkJCXByaW50aygiJTJ4ICIsIG5ldHdvcmstPnJzbl9pZVtpXSk7CisJCQlwcmludGsoIlxuIik7CisJCX0KKwkJI2VuZGlmCisgICAgICAgICAgICAgICAgY2hhciBidWZbTUFYX1dQQV9JRV9MRU5dOworICAgICAgICAgICAgICAgIG1lbWNweShidWYsIG5ldHdvcmstPnJzbl9pZSwgbmV0d29yay0+cnNuX2llX2xlbik7CisgICAgICAgICAgICAgICAgaXdlLmNtZCA9IElXRVZHRU5JRTsKKyAgICAgICAgICAgICAgICBpd2UudS5kYXRhLmxlbmd0aCA9IG5ldHdvcmstPnJzbl9pZV9sZW47CisjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpKXx8SU5fRkVET1JBQ09SRV85KQorCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBidWYpOworI2Vsc2UKKwkJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChzdGFydCwgc3RvcCwgJml3ZSwgYnVmKTsKKyNlbmRpZgorCX0KKworI2VuZGlmCisKKwkvKiBBZGQgRVhUUkE6IEFnZSB0byBkaXNwbGF5IHNlY29uZHMgc2luY2UgbGFzdCBiZWFjb24vcHJvYmUgcmVzcG9uc2UKKwkgKiBmb3IgZ2l2ZW4gbmV0d29yay4gKi8KKwlpd2UuY21kID0gSVdFVkNVU1RPTTsKKwlwID0gY3VzdG9tOworCXAgKz0gc25wcmludGYocCwgTUFYX0NVU1RPTV9MRU4gLSAocCAtIGN1c3RvbSksCisJCSAgICAgICIgTGFzdCBiZWFjb246ICVsdW1zIGFnbyIsIChqaWZmaWVzIC0gbmV0d29yay0+bGFzdF9zY2FubmVkKSAvIChIWiAvIDEwMCkpOworCWl3ZS51LmRhdGEubGVuZ3RoID0gcCAtIGN1c3RvbTsKKwlpZiAoaXdlLnUuZGF0YS5sZW5ndGgpCisjaWYoKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpKXx8SU5fRkVET1JBQ09SRV85KQorCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBjdXN0b20pOworI2Vsc2UKKwkJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChzdGFydCwgc3RvcCwgJml3ZSwgY3VzdG9tKTsKKyNlbmRpZgorCisJcmV0dXJuIHN0YXJ0OworfQorCitpbnQgaWVlZTgwMjExX3d4X2dldF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcms7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyID0gMDsKKwljaGFyICpldiA9IGV4dHJhOworCWNoYXIgKnN0b3AgPSBldiArIHdycXUtPmRhdGEubGVuZ3RoOy8vSVdfU0NBTl9NQVhfREFUQTsKKwkvL2NoYXIgKnN0b3AgPSBldiArIElXX1NDQU5fTUFYX0RBVEE7CisJaW50IGkgPSAwOworCisJSUVFRTgwMjExX0RFQlVHX1dYKCJHZXR0aW5nIHNjYW5cbiIpOworCWRvd24oJmllZWUtPnd4X3NlbSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCWlmKCFpZWVlLT5iSHdSYWRpb09mZikKKwl7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkobmV0d29yaywgJmllZWUtPm5ldHdvcmtfbGlzdCwgbGlzdCkgeworCQkJaSsrOworCisJCQlpZigoc3RvcC1ldik8MjAwKQorCQkJeworCQkJCWVyciA9IC1FMkJJRzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChpZWVlLT5zY2FuX2FnZSA9PSAwIHx8CisJCQkgICAgdGltZV9hZnRlcihuZXR3b3JrLT5sYXN0X3NjYW5uZWQgKyBpZWVlLT5zY2FuX2FnZSwgamlmZmllcykpCisJCQl7CisJCQkJZXYgPSBydGw4MTh4X3RyYW5zbGF0ZV9zY2FuKGllZWUsIGV2LCBzdG9wLCBuZXR3b3JrLCBpbmZvKTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlJRUVFODAyMTFfREVCVUdfU0NBTigKKwkJCQkJIk5vdCBzaG93aW5nIG5ldHdvcmsgJyVzICgiCisJCQkJCU1BQ19GTVQgIiknIGR1ZSB0byBhZ2UgKCVsdW1zKS5cbiIsCisJCQkJCWVzY2FwZV9lc3NpZChuZXR3b3JrLT5zc2lkLAorCQkJCQkJICAgICBuZXR3b3JrLT5zc2lkX2xlbiksCisJCQkJCU1BQ19BUkcobmV0d29yay0+YnNzaWQpLAorCQkJCQkoamlmZmllcyAtIG5ldHdvcmstPmxhc3Rfc2Nhbm5lZCkgLyAoSFogLyAxMDApKTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisJdXAoJmllZWUtPnd4X3NlbSk7CisJd3JxdS0+ZGF0YS5sZW5ndGggPSBldiAtICBleHRyYTsKKwl3cnF1LT5kYXRhLmZsYWdzID0gMDsKKwlJRUVFODAyMTFfREVCVUdfV1goImV4aXQ6ICVkIG5ldHdvcmtzIHJldHVybmVkLlxuIiwgaSk7CisKKwlyZXR1cm4gZXJyOworfQorCitpbnQgaWVlZTgwMjExX3d4X3NldF9lbmNvZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICprZXlidWYpCit7CisJc3RydWN0IGl3X3BvaW50ICplcnEgPSAmKHdycXUtPmVuY29kaW5nKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWVlZS0+ZGV2OworCXN0cnVjdCBpZWVlODAyMTFfc2VjdXJpdHkgc2VjID0geworCQkuZmxhZ3MgPSAwCisJfTsKKwlpbnQgaSwga2V5LCBrZXlfcHJvdmlkZWQsIGxlbjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKipjcnlwdDsKKworCUlFRUU4MDIxMV9ERUJVR19XWCgiU0VUX0VOQ09ERVxuIik7CisKKwlrZXkgPSBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOworCWlmIChrZXkpIHsKKwkJaWYgKGtleSA+IFdFUF9LRVlTKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWtleS0tOworCQlrZXlfcHJvdmlkZWQgPSAxOworCX0gZWxzZSB7CisJCWtleV9wcm92aWRlZCA9IDA7CisJCWtleSA9IGllZWUtPnR4X2tleWlkeDsKKwl9CisKKwlJRUVFODAyMTFfREVCVUdfV1goIktleTogJWQgWyVzXVxuIiwga2V5LCBrZXlfcHJvdmlkZWQgPworCQkJICAgInByb3ZpZGVkIiA6ICJkZWZhdWx0Iik7CisKKwljcnlwdCA9ICZpZWVlLT5jcnlwdFtrZXldOworCisJaWYgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpIHsKKwkJaWYgKGtleV9wcm92aWRlZCAmJiAqY3J5cHQpIHsKKwkJCUlFRUU4MDIxMV9ERUJVR19XWCgiRGlzYWJsaW5nIGVuY3J5cHRpb24gb24ga2V5ICVkLlxuIiwKKwkJCQkJICAga2V5KTsKKwkJCWllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdChpZWVlLCBjcnlwdCk7CisJCX0gZWxzZQorCQkJSUVFRTgwMjExX0RFQlVHX1dYKCJEaXNhYmxpbmcgZW5jcnlwdGlvbi5cbiIpOworCisJCS8qIENoZWNrIGFsbCB0aGUga2V5cyB0byBzZWUgaWYgYW55IGFyZSBzdGlsbCBjb25maWd1cmVkLAorCQkgKiBhbmQgaWYgbm8ga2V5IGluZGV4IHdhcyBwcm92aWRlZCwgZGUtaW5pdCB0aGVtIGFsbCAqLworCQlmb3IgKGkgPSAwOyBpIDwgV0VQX0tFWVM7IGkrKykgeworCQkJaWYgKGllZWUtPmNyeXB0W2ldICE9IE5VTEwpIHsKKwkJCQlpZiAoa2V5X3Byb3ZpZGVkKQorCQkJCQlicmVhazsKKwkJCQlpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQoCisJCQkJCWllZWUsICZpZWVlLT5jcnlwdFtpXSk7CisJCQl9CisJCX0KKworCQlpZiAoaSA9PSBXRVBfS0VZUykgeworCQkJc2VjLmVuYWJsZWQgPSAwOworCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzA7CisJCQlzZWMuZmxhZ3MgfD0gU0VDX0VOQUJMRUQgfCBTRUNfTEVWRUw7CisJCX0KKworCQlnb3RvIGRvbmU7CisJfQorCisKKworCXNlYy5lbmFibGVkID0gMTsKKwlzZWMuZmxhZ3MgfD0gU0VDX0VOQUJMRUQ7CisKKwlpZiAoKmNyeXB0ICE9IE5VTEwgJiYgKCpjcnlwdCktPm9wcyAhPSBOVUxMICYmCisJICAgIHN0cmNtcCgoKmNyeXB0KS0+b3BzLT5uYW1lLCAiV0VQIikgIT0gMCkgeworCQkvKiBjaGFuZ2luZyB0byB1c2UgV0VQOyBkZWluaXQgcHJldmlvdXNseSB1c2VkIGFsZ29yaXRobQorCQkgKiBvbiB0aGlzIGtleSAqLworCQlpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQoaWVlZSwgY3J5cHQpOworCX0KKworCWlmICgqY3J5cHQgPT0gTlVMTCkgeworCQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKm5ld19jcnlwdDsKKworCQkvKiB0YWtlIFdFUCBpbnRvIHVzZSAqLworCQluZXdfY3J5cHQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEpLAorCQkJCSAgICBHRlBfS0VSTkVMKTsKKwkJaWYgKG5ld19jcnlwdCA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCW1lbXNldChuZXdfY3J5cHQsIDAsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEpKTsKKwkJbmV3X2NyeXB0LT5vcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMoIldFUCIpOworCQlpZiAoIW5ld19jcnlwdC0+b3BzKSB7CisJCQlyZXF1ZXN0X21vZHVsZSgiaWVlZTgwMjExX2NyeXB0X3dlcCIpOworCQkJbmV3X2NyeXB0LT5vcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMoIldFUCIpOworCQl9CisKKwkJaWYgKG5ld19jcnlwdC0+b3BzICYmIHRyeV9tb2R1bGVfZ2V0KG5ld19jcnlwdC0+b3BzLT5vd25lcikpCisJCQluZXdfY3J5cHQtPnByaXYgPSBuZXdfY3J5cHQtPm9wcy0+aW5pdChrZXkpOworCisJCWlmICghbmV3X2NyeXB0LT5vcHMgfHwgIW5ld19jcnlwdC0+cHJpdikgeworCQkJa2ZyZWUobmV3X2NyeXB0KTsKKwkJCW5ld19jcnlwdCA9IE5VTEw7CisKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjb3VsZCBub3QgaW5pdGlhbGl6ZSBXRVA6ICIKKwkJCSAgICAgICAibG9hZCBtb2R1bGUgaWVlZTgwMjExX2NyeXB0X3dlcFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQl9CisJCSpjcnlwdCA9IG5ld19jcnlwdDsKKwl9CisKKwkvKiBJZiBhIG5ldyBrZXkgd2FzIHByb3ZpZGVkLCBzZXQgaXQgdXAgKi8KKwlpZiAoZXJxLT5sZW5ndGggPiAwKSB7CisJCWxlbiA9IGVycS0+bGVuZ3RoIDw9IDUgPyA1IDogMTM7CisJCW1lbWNweShzZWMua2V5c1trZXldLCBrZXlidWYsIGVycS0+bGVuZ3RoKTsKKwkJaWYgKGxlbiA+IGVycS0+bGVuZ3RoKQorCQkJbWVtc2V0KHNlYy5rZXlzW2tleV0gKyBlcnEtPmxlbmd0aCwgMCwKKwkJCSAgICAgICBsZW4gLSBlcnEtPmxlbmd0aCk7CisJCUlFRUU4MDIxMV9ERUJVR19XWCgiU2V0dGluZyBrZXkgJWQgdG8gJyVzJyAoJWQ6JWQgYnl0ZXMpXG4iLAorCQkJCSAgIGtleSwgZXNjYXBlX2Vzc2lkKHNlYy5rZXlzW2tleV0sIGxlbiksCisJCQkJICAgZXJxLT5sZW5ndGgsIGxlbik7CisJCXNlYy5rZXlfc2l6ZXNba2V5XSA9IGxlbjsKKyAJCSgqY3J5cHQpLT5vcHMtPnNldF9rZXkoc2VjLmtleXNba2V5XSwgbGVuLCBOVUxMLAorCQkJCSAgICAgICAoKmNyeXB0KS0+cHJpdik7CisJCXNlYy5mbGFncyB8PSAoMSA8PCBrZXkpOworCQkvKiBUaGlzIGVuc3VyZXMgYSBrZXkgd2lsbCBiZSBhY3RpdmF0ZWQgaWYgbm8ga2V5IGlzCisJCSAqIGV4cGxpY2l0ZWx5IHNldCAqLworCQlpZiAoa2V5ID09IHNlYy5hY3RpdmVfa2V5KQorCQkJc2VjLmZsYWdzIHw9IFNFQ19BQ1RJVkVfS0VZOworCQlpZWVlLT50eF9rZXlpZHggPSBrZXk7Ly9ieSB3YiAwODAzMTIKKwl9IGVsc2UgeworCQlsZW4gPSAoKmNyeXB0KS0+b3BzLT5nZXRfa2V5KHNlYy5rZXlzW2tleV0sIFdFUF9LRVlfTEVOLAorCQkJCQkgICAgIE5VTEwsICgqY3J5cHQpLT5wcml2KTsKKwkJaWYgKGxlbiA9PSAwKSB7CisJCQkvKiBTZXQgYSBkZWZhdWx0IGtleSBvZiBhbGwgMCAqLworCQkJSUVFRTgwMjExX0RFQlVHX1dYKCJTZXR0aW5nIGtleSAlZCB0byBhbGwgemVyby5cbiIsCisJCQkJCSAgIGtleSk7CisJCQltZW1zZXQoc2VjLmtleXNba2V5XSwgMCwgMTMpOworCQkJKCpjcnlwdCktPm9wcy0+c2V0X2tleShzZWMua2V5c1trZXldLCAxMywgTlVMTCwKKwkJCQkJICAgICAgICgqY3J5cHQpLT5wcml2KTsKKwkJCXNlYy5rZXlfc2l6ZXNba2V5XSA9IDEzOworCQkJc2VjLmZsYWdzIHw9ICgxIDw8IGtleSk7CisJCX0KKworCQkvKiBObyBrZXkgZGF0YSAtIGp1c3Qgc2V0IHRoZSBkZWZhdWx0IFRYIGtleSBpbmRleCAqLworCQlpZiAoa2V5X3Byb3ZpZGVkKSB7CisJCQlJRUVFODAyMTFfREVCVUdfV1goCisJCQkJIlNldHRpbmcga2V5ICVkIHRvIGRlZmF1bHQgVHgga2V5LlxuIiwga2V5KTsKKwkJCWllZWUtPnR4X2tleWlkeCA9IGtleTsKKwkJCXNlYy5hY3RpdmVfa2V5ID0ga2V5OworCQkJc2VjLmZsYWdzIHw9IFNFQ19BQ1RJVkVfS0VZOworCQl9CisJfQorCisgZG9uZToKKwlpZWVlLT5vcGVuX3dlcCA9ICEoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEKTsKKwlzZWMuYXV0aF9tb2RlID0gaWVlZS0+b3Blbl93ZXAgPyBXTEFOX0FVVEhfT1BFTiA6IFdMQU5fQVVUSF9TSEFSRURfS0VZOworCXNlYy5mbGFncyB8PSBTRUNfQVVUSF9NT0RFOworCUlFRUU4MDIxMV9ERUJVR19XWCgiQXV0aDogJXNcbiIsIHNlYy5hdXRoX21vZGUgPT0gV0xBTl9BVVRIX09QRU4gPworCQkJICAgIk9QRU4iIDogIlNIQVJFRCBLRVkiKTsKKworCS8qIEZvciBub3cgd2UganVzdCBzdXBwb3J0IFdFUCwgc28gb25seSBzZXQgdGhhdCBzZWN1cml0eSBsZXZlbC4uLgorCSAqIFRPRE86IFdoZW4gV1BBIGlzIGFkZGVkIHRoaXMgaXMgb25lIHBsYWNlIHRoYXQgbmVlZHMgdG8gY2hhbmdlICovCisJc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKKwlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMTsgLyogNDAgYW5kIDEwNCBiaXQgV0VQICovCisKKwlpZiAoaWVlZS0+c2V0X3NlY3VyaXR5KQorCQlpZWVlLT5zZXRfc2VjdXJpdHkoZGV2LCAmc2VjKTsKKworCS8qIERvIG5vdCByZXNldCBwb3J0IGlmIGNhcmQgaXMgaW4gTWFuYWdlZCBtb2RlIHNpbmNlIHJlc2V0dGluZyB3aWxsCisJICogZ2VuZXJhdGUgbmV3IElFRUUgODAyLjExIGF1dGhlbnRpY2F0aW9uIHdoaWNoIG1heSBlbmQgdXAgaW4gbG9vcGluZworCSAqIHdpdGggSUVFRSA4MDIuMVguICBJZiB5b3VyIGhhcmR3YXJlIHJlcXVpcmVzIGEgcmVzZXQgYWZ0ZXIgV0VQCisJICogY29uZmlndXJhdGlvbiAoZm9yIGV4YW1wbGUuLi4gUHJpc20yKSwgaW1wbGVtZW50IHRoZSByZXNldF9wb3J0IGluCisJICogdGhlIGNhbGxiYWNrcyBzdHJ1Y3R1cmVzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgODAyLjExIHN0YWNrLiAqLworCWlmIChpZWVlLT5yZXNldF9vbl9rZXljaGFuZ2UgJiYKKwkgICAgaWVlZS0+aXdfbW9kZSAhPSBJV19NT0RFX0lORlJBICYmCisJICAgIGllZWUtPnJlc2V0X3BvcnQgJiYgaWVlZS0+cmVzZXRfcG9ydChkZXYpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogcmVzZXRfcG9ydCBmYWlsZWRcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGllZWU4MDIxMV93eF9nZXRfZW5jb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5YnVmKQoreworCXN0cnVjdCBpd19wb2ludCAqZXJxID0gJih3cnF1LT5lbmNvZGluZyk7CisJaW50IGxlbiwga2V5OworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqY3J5cHQ7CisKKwlJRUVFODAyMTFfREVCVUdfV1goIkdFVF9FTkNPREVcbiIpOworCisJaWYoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpCisJCXJldHVybiAtMTsKKworCWtleSA9IGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVg7CisJaWYgKGtleSkgeworCQlpZiAoa2V5ID4gV0VQX0tFWVMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJa2V5LS07CisJfSBlbHNlCisJCWtleSA9IGllZWUtPnR4X2tleWlkeDsKKworCWNyeXB0ID0gaWVlZS0+Y3J5cHRba2V5XTsKKwllcnEtPmZsYWdzID0ga2V5ICsgMTsKKworCWlmIChjcnlwdCA9PSBOVUxMIHx8IGNyeXB0LT5vcHMgPT0gTlVMTCkgeworCQllcnEtPmxlbmd0aCA9IDA7CisJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0RJU0FCTEVEOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc3RyY21wKGNyeXB0LT5vcHMtPm5hbWUsICJXRVAiKSAhPSAwKSB7CisJCS8qIG9ubHkgV0VQIGlzIHN1cHBvcnRlZCB3aXRoIHdpcmVsZXNzIGV4dGVuc2lvbnMsIHNvIGp1c3QKKwkJICogcmVwb3J0IHRoYXQgZW5jcnlwdGlvbiBpcyB1c2VkICovCisJCWVycS0+bGVuZ3RoID0gMDsKKwkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfRU5BQkxFRDsKKwkJcmV0dXJuIDA7CisJfQorCisJbGVuID0gY3J5cHQtPm9wcy0+Z2V0X2tleShrZXlidWYsIFdFUF9LRVlfTEVOLCBOVUxMLCBjcnlwdC0+cHJpdik7CisJZXJxLT5sZW5ndGggPSAobGVuID49IDAgPyBsZW4gOiAwKTsKKworCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0VOQUJMRUQ7CisKKwlpZiAoaWVlZS0+b3Blbl93ZXApCisJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX09QRU47CisJZWxzZQorCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9SRVNUUklDVEVEOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBpZWVlODAyMTFfd3hfc2V0X2VuY29kZV9leHQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWVlZS0+ZGV2OworICAgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmVuY29kaW5nID0gJndycXUtPmVuY29kaW5nOworICAgICAgICBzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0ID0gKHN0cnVjdCBpd19lbmNvZGVfZXh0ICopZXh0cmE7CisgICAgICAgIGludCBpLCBpZHgsIHJldCA9IDA7CisgICAgICAgIGludCBncm91cF9rZXkgPSAwOworICAgICAgICBjb25zdCBjaGFyICphbGcsICptb2R1bGU7CisgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzOworICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKipjcnlwdDsKKworICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5IHNlYyA9IHsKKyAgICAgICAgICAgICAgICAuZmxhZ3MgPSAwLAorICAgICAgICB9OworCS8vcHJpbnRrKCI9PT09PT0+ZW5jb2RpbmcgZmxhZzoleCxleHQgZmxhZzoleCwgZXh0IGFsZzolZFxuIiwgZW5jb2RpbmctPmZsYWdzLGV4dC0+ZXh0X2ZsYWdzLCBleHQtPmFsZyk7CisgICAgICAgIGlkeCA9IGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWDsKKyAgICAgICAgaWYgKGlkeCkgeworICAgICAgICAgICAgICAgIGlmIChpZHggPCAxIHx8IGlkeCA+IFdFUF9LRVlTKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgaWR4LS07CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGlkeCA9IGllZWUtPnR4X2tleWlkeDsKKworICAgICAgICBpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX0dST1VQX0tFWSkgeworICAgICAgICAgICAgICAgIGNyeXB0ID0gJmllZWUtPmNyeXB0W2lkeF07CisgICAgICAgICAgICAgICAgZ3JvdXBfa2V5ID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBzb21lIENpc2NvIEFQcyB1c2UgaWR4PjAgZm9yIHVuaWNhc3QgaW4gZHluYW1pYyBXRVAgKi8KKwkJLy9wcmludGsoIm5vdCBncm91cCBrZXksIGZsYWdzOiV4LCBleHQtPmFsZzolZFxuIiwgZXh0LT5leHRfZmxhZ3MsIGV4dC0+YWxnKTsKKyAgICAgICAgICAgICAgICBpZiAoaWR4ICE9IDAgJiYgZXh0LT5hbGcgIT0gSVdfRU5DT0RFX0FMR19XRVApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKQorICAgICAgICAgICAgICAgICAgICAgICAgY3J5cHQgPSAmaWVlZS0+Y3J5cHRbaWR4XTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisgICAgICAgIHNlYy5mbGFncyB8PSBTRUNfRU5BQkxFRDsvLyB8IFNFQ19FTkNSWVBUOworICAgICAgICBpZiAoKGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkgfHwKKyAgICAgICAgICAgIGV4dC0+YWxnID09IElXX0VOQ09ERV9BTEdfTk9ORSkgeworICAgICAgICAgICAgICAgIGlmICgqY3J5cHQpCisgICAgICAgICAgICAgICAgICAgICAgICBpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQoaWVlZSwgY3J5cHQpOworCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IFdFUF9LRVlTOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWVlZS0+Y3J5cHRbaV0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSBXRVBfS0VZUykgeworICAgICAgICAgICAgICAgICAgICAgICAgc2VjLmVuYWJsZWQgPSAwOworICAgICAgICAgICAgICAgICAgICAgIC8vICBzZWMuZW5jcnlwdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlYy5mbGFncyB8PSBTRUNfTEVWRUw7CisgICAgICAgICAgICAgICAgfQorCQkvL3ByaW50aygiZGlzYWJsZWQ6IGZsYWc6JXhcbiIsIGVuY29kaW5nLT5mbGFncyk7CisgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICB9CisKKwlzZWMuZW5hYmxlZCA9IDE7CisgICAgLy8gICAgc2VjLmVuY3J5cHQgPSAxOworI2lmIDAKKyAgICAgICAgaWYgKGdyb3VwX2tleSA/ICFpZWVlLT5ob3N0X21jX2RlY3J5cHQgOgorICAgICAgICAgICAgIShpZWVlLT5ob3N0X2VuY3J5cHQgfHwgaWVlZS0+aG9zdF9kZWNyeXB0IHx8CisgICAgICAgICAgICAgIGllZWUtPmhvc3RfZW5jcnlwdF9tc2R1KSkKKyAgICAgICAgICAgICAgICBnb3RvIHNraXBfaG9zdF9jcnlwdDsKKyNlbmRpZgorICAgICAgICBzd2l0Y2ggKGV4dC0+YWxnKSB7CisgICAgICAgIGNhc2UgSVdfRU5DT0RFX0FMR19XRVA6CisgICAgICAgICAgICAgICAgYWxnID0gIldFUCI7CisgICAgICAgICAgICAgICAgbW9kdWxlID0gImllZWU4MDIxMV9jcnlwdF93ZXAiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElXX0VOQ09ERV9BTEdfVEtJUDoKKyAgICAgICAgICAgICAgICBhbGcgPSAiVEtJUCI7CisgICAgICAgICAgICAgICAgbW9kdWxlID0gImllZWU4MDIxMV9jcnlwdF90a2lwIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJV19FTkNPREVfQUxHX0NDTVA6CisgICAgICAgICAgICAgICAgYWxnID0gIkNDTVAiOworICAgICAgICAgICAgICAgIG1vZHVsZSA9ICJpZWVlODAyMTFfY3J5cHRfY2NtcCI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgSUVFRTgwMjExX0RFQlVHX1dYKCIlczogdW5rbm93biBjcnlwdG8gYWxnICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPm5hbWUsIGV4dC0+YWxnKTsKKyAgICAgICAgICAgICAgICByZXQgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgfQorLy8JcHJpbnRrKCI4LTA5LTA4LTk9PT09PT4lcywgYWxnIG5hbWU6JXNcbiIsX19mdW5jX18sIGFsZyk7CisKKwkgb3BzID0gaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKGFsZyk7CisgICAgICAgIGlmIChvcHMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJlcXVlc3RfbW9kdWxlKG1vZHVsZSk7CisgICAgICAgICAgICAgICAgb3BzID0gaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKGFsZyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9wcyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgSUVFRTgwMjExX0RFQlVHX1dYKCIlczogdW5rbm93biBjcnlwdG8gYWxnICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPm5hbWUsIGV4dC0+YWxnKTsKKwkJcHJpbnRrKCI9PT09PT09PT51bmtub3duIGNyeXB0byBhbGcgJWRcbiIsIGV4dC0+YWxnKTsKKyAgICAgICAgICAgICAgICByZXQgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgqY3J5cHQgPT0gTlVMTCB8fCAoKmNyeXB0KS0+b3BzICE9IG9wcykgeworICAgICAgICAgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqbmV3X2NyeXB0OworCisgICAgICAgICAgICAgICAgaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KGllZWUsIGNyeXB0KTsKKworICAgICAgICAgICAgICAgIG5ld19jcnlwdCA9IGt6YWxsb2Moc2l6ZW9mKCpuZXdfY3J5cHQpLCBHRlBfS0VSTkVMKTsKKyAgICAgICAgICAgICAgICBpZiAobmV3X2NyeXB0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IC1FTk9NRU07CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5ld19jcnlwdC0+b3BzID0gb3BzOworICAgICAgICAgICAgICAgIGlmIChuZXdfY3J5cHQtPm9wcyAmJiB0cnlfbW9kdWxlX2dldChuZXdfY3J5cHQtPm9wcy0+b3duZXIpKQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2NyeXB0LT5wcml2ID0gbmV3X2NyeXB0LT5vcHMtPmluaXQoaWR4KTsKKyAgICAgICAgICAgICAgICBpZiAobmV3X2NyeXB0LT5wcml2ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtmcmVlKG5ld19jcnlwdCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqY3J5cHQgPSBuZXdfY3J5cHQ7CisKKyAJfQorCisgICAgICAgIGlmIChleHQtPmtleV9sZW4gPiAwICYmICgqY3J5cHQpLT5vcHMtPnNldF9rZXkgJiYKKyAgICAgICAgICAgICgqY3J5cHQpLT5vcHMtPnNldF9rZXkoZXh0LT5rZXksIGV4dC0+a2V5X2xlbiwgZXh0LT5yeF9zZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqY3J5cHQpLT5wcml2KSA8IDApIHsKKyAgICAgICAgICAgICAgICBJRUVFODAyMTFfREVCVUdfV1goIiVzOiBrZXkgc2V0dGluZyBmYWlsZWRcbiIsIGRldi0+bmFtZSk7CisJCXByaW50aygia2V5IHNldHRpbmcgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICByZXQgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgfQorI2lmIDEKKyAvL3NraXBfaG9zdF9jcnlwdDoKKwkvL3ByaW50aygic2tpcF9ob3N0X2NyeXB0OmV4dF9mbGFnczoleFxuIiwgZXh0LT5leHRfZmxhZ3MpOworICAgICAgICBpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX1NFVF9UWF9LRVkpIHsKKyAgICAgICAgICAgICAgICBpZWVlLT50eF9rZXlpZHggPSBpZHg7CisgICAgICAgICAgICAgICAgc2VjLmFjdGl2ZV9rZXkgPSBpZHg7CisgICAgICAgICAgICAgICAgc2VjLmZsYWdzIHw9IFNFQ19BQ1RJVkVfS0VZOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGV4dC0+YWxnICE9IElXX0VOQ09ERV9BTEdfTk9ORSkgeworICAgICAgICAgICAgICAgIG1lbWNweShzZWMua2V5c1tpZHhdLCBleHQtPmtleSwgZXh0LT5rZXlfbGVuKTsKKyAgICAgICAgICAgICAgICBzZWMua2V5X3NpemVzW2lkeF0gPSBleHQtPmtleV9sZW47CisgICAgICAgICAgICAgICAgc2VjLmZsYWdzIHw9ICgxIDw8IGlkeCk7CisgICAgICAgICAgICAgICAgaWYgKGV4dC0+YWxnID09IElXX0VOQ09ERV9BTEdfV0VQKSB7CisgICAgICAgICAgICAgICAgICAgICAgLy8gIHNlYy5lbmNvZGVfYWxnW2lkeF0gPSBTRUNfQUxHX1dFUDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlYy5mbGFncyB8PSBTRUNfTEVWRUw7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV4dC0+YWxnID09IElXX0VOQ09ERV9BTEdfVEtJUCkgeworICAgICAgICAgICAgICAgICAgICAgIC8vICBzZWMuZW5jb2RlX2FsZ1tpZHhdID0gU0VDX0FMR19US0lQOworICAgICAgICAgICAgICAgICAgICAgICAgc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlYy5sZXZlbCA9IFNFQ19MRVZFTF8yOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXh0LT5hbGcgPT0gSVdfRU5DT0RFX0FMR19DQ01QKSB7CisgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlYy5lbmNvZGVfYWxnW2lkeF0gPSBTRUNfQUxHX0NDTVA7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOworICAgICAgICAgICAgICAgICAgICAgICAgc2VjLmxldmVsID0gU0VDX0xFVkVMXzM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIERvbid0IHNldCBzZWMgbGV2ZWwgZm9yIGdyb3VwIGtleXMuICovCisgICAgICAgICAgICAgICAgaWYgKGdyb3VwX2tleSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlYy5mbGFncyAmPSB+U0VDX0xFVkVMOworICAgICAgICB9CisjZW5kaWYKK2RvbmU6CisgICAgICAgIGlmIChpZWVlLT5zZXRfc2VjdXJpdHkpCisgICAgICAgICAgICAgICAgaWVlZS0+c2V0X3NlY3VyaXR5KGllZWUtPmRldiwgJnNlYyk7CisKKwkgaWYgKGllZWUtPnJlc2V0X29uX2tleWNoYW5nZSAmJgorICAgICAgICAgICAgaWVlZS0+aXdfbW9kZSAhPSBJV19NT0RFX0lORlJBICYmCisgICAgICAgICAgICBpZWVlLT5yZXNldF9wb3J0ICYmIGllZWUtPnJlc2V0X3BvcnQoZGV2KSkgeworICAgICAgICAgICAgICAgIElFRUU4MDIxMV9ERUJVR19XWCgiJXM6IHJlc2V0X3BvcnQgZmFpbGVkXG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJldDsKK30KK2ludCBpZWVlODAyMTFfd3hfc2V0X21sbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgaXdfbWxtZSAqbWxtZSA9IChzdHJ1Y3QgaXdfbWxtZSAqKSBleHRyYTsKKy8vCXByaW50aygiXG5ka2dhZGZzbGtkamdhbHNrZGY9PT09PT09PT09PT09PT0+JXMoKSwgY21kOiV4XG4iLCBfX2Z1bmNfXywgbWxtZS0+Y21kKTsKKyNpZiAxCisJc3dpdGNoIChtbG1lLT5jbWQpIHsKKyAgICAgICAgY2FzZSBJV19NTE1FX0RFQVVUSDoKKwljYXNlIElXX01MTUVfRElTQVNTT0M6CisJLy8JcHJpbnRrKCJkaXNhc3NvYyBub3dcbiIpOworCQlpZWVlODAyMTFfZGlzYXNzb2NpYXRlKGllZWUpOworCQlicmVhazsKKwkgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisgICAgICAgIH0KKyNlbmRpZgorCXJldHVybiAwOworfQorCitpbnQgaWVlZTgwMjExX3d4X3NldF9hdXRoKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3BhcmFtICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKy8qCisJIHN0cnVjdCBpZWVlODAyMTFfc2VjdXJpdHkgc2VjID0geworICAgICAgICAgICAgICAgIC5mbGFncyA9IFNFQ19BVVRIX01PREUsCisJfQorKi8KKwkvL3ByaW50aygic2V0IGF1dGg6ZmxhZzoleCwgZGF0YSB2YWx1ZToleFxuIiwgZGF0YS0+ZmxhZ3MsIGRhdGEtPnZhbHVlKTsKKwlzd2l0Y2ggKGRhdGEtPmZsYWdzICYgSVdfQVVUSF9JTkRFWCkgeworICAgICAgICBjYXNlIElXX0FVVEhfV1BBX1ZFUlNJT046CisJICAgICAvKm5lZWQgdG8gc3VwcG9ydCB3cGEyIGhlcmUqLworCQkvL3ByaW50aygid3BhIHZlcnNpb246JXhcbiIsIGRhdGEtPnZhbHVlKTsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgSVdfQVVUSF9DSVBIRVJfUEFJUldJU0U6CisgICAgICAgIGNhc2UgSVdfQVVUSF9DSVBIRVJfR1JPVVA6CisgICAgICAgIGNhc2UgSVdfQVVUSF9LRVlfTUdNVDoKKyAgICAgICAgICAgICAgICAvKgorICogICAgICAgICAgICAgICAgICAqIEhvc3QgQVAgZHJpdmVyIGRvZXMgbm90IHVzZSB0aGVzZSBwYXJhbWV0ZXJzIGFuZCBhbGxvd3MKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHdwYV9zdXBwbGljYW50IHRvIGNvbnRyb2wgdGhlbSBpbnRlcm5hbGx5LgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJV19BVVRIX1RLSVBfQ09VTlRFUk1FQVNVUkVTOgorICAgICAgICAgICAgICAgIGllZWUtPnRraXBfY291bnRlcm1lYXN1cmVzID0gZGF0YS0+dmFsdWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSVdfQVVUSF9EUk9QX1VORU5DUllQVEVEOgorICAgICAgICAgICAgICAgIGllZWUtPmRyb3BfdW5lbmNyeXB0ZWQgPSBkYXRhLT52YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIElXX0FVVEhfODAyMTFfQVVUSF9BTEc6CisJCWllZWUtPm9wZW5fd2VwID0gKGRhdGEtPnZhbHVlJklXX0FVVEhfQUxHX09QRU5fU1lTVEVNKT8xOjA7CisJCS8vcHJpbnRrKCJvcGVuX3dlcDolZFxuIiwgaWVlZS0+b3Blbl93ZXApOworCQlicmVhazsKKworI2lmIDEKKwljYXNlIElXX0FVVEhfV1BBX0VOQUJMRUQ6CisJCWllZWUtPndwYV9lbmFibGVkID0gKGRhdGEtPnZhbHVlKT8xOjA7CisJCS8vcHJpbnRrKCJlbmFsYmUgd3BhOiVkXG4iLCBpZWVlLT53cGFfZW5hYmxlZCk7CisJCWJyZWFrOworCisjZW5kaWYKKwljYXNlIElXX0FVVEhfUlhfVU5FTkNSWVBURURfRUFQT0w6CisgICAgICAgICAgICAgICAgaWVlZS0+aWVlZTgwMl8xeCA9IGRhdGEtPnZhbHVlOworCQlicmVhazsKKwljYXNlIElXX0FVVEhfUFJJVkFDWV9JTlZPS0VEOgorCQlpZWVlLT5wcml2YWN5X2ludm9rZWQgPSBkYXRhLT52YWx1ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCXJldHVybiAwOworfQorCisjaWYgMQoraW50IGllZWU4MDIxMV93eF9zZXRfZ2VuX2llKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqaWUsIHNpemVfdCBsZW4pCit7CisjaWYgMAorCXByaW50aygiPT09PT4lcygpXG4iLCBfX2Z1bmNfXyk7CisJeworCQlpbnQgaTsKKwkJZm9yIChpPTA7IGk8bGVuOyBpKyspCisJCXByaW50aygiJTJ4ICIsIGllW2ldJjB4ZmYpOworCQlwcmludGsoIlxuIik7CisJfQorI2VuZGlmCisJdTggKmJ1ZiA9IE5VTEw7CisKKwlpZiAobGVuPk1BWF9XUEFfSUVfTEVOIHx8IChsZW4gJiYgaWUgPT0gTlVMTCkpCisJeworCQlwcmludGsoInJldHVybiBlcnJvciBvdXQsIGxlbjolZFxuIiwgbGVuKTsKKwlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobGVuKQorCXsKKwkJaWYgKGxlbiAhPSBpZVsxXSsyKXsKKwkJCXByaW50aygibGVuOiVkLCBpZTolZFxuIiwgbGVuLCBpZVsxXSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlidWYgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJCWlmIChidWYgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCQltZW1jcHkoYnVmLCBpZSwgbGVuKTsKKwkJa2ZyZWUoaWVlZS0+d3BhX2llKTsKKwkJaWVlZS0+d3BhX2llID0gYnVmOworCQlpZWVlLT53cGFfaWVfbGVuID0gbGVuOworCX0KKwllbHNleworCQlpZiAoaWVlZS0+d3BhX2llKQorCQlrZnJlZShpZWVlLT53cGFfaWUpOworCQlpZWVlLT53cGFfaWUgPSBOVUxMOworCQlpZWVlLT53cGFfaWVfbGVuID0gMDsKKwl9CisvLwlwcmludGsoIjw9PT09PW91dCAlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gMDsKKworfQorI2VuZGlmCisKKyNpZiAwCitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfZ2VuX2llKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X3NldF9tbG1lKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X3NldF9hdXRoKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X3NldF9lbmNvZGVfZXh0KTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X2dldF9zY2FuKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X3NldF9lbmNvZGUpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfZ2V0X2VuY29kZSk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2ludGVybmFsLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYzIyMzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pbnRlcm5hbC5oCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogQ3J5cHRvZ3JhcGhpYyBBUEkuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIEphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisjaWZuZGVmIF9DUllQVE9fSU5URVJOQUxfSAorI2RlZmluZSBfQ1JZUFRPX0lOVEVSTkFMX0gKKworCisvLyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlICJydGxfY3J5cHRvLmgiCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9oYXJkaXJxLmg+CisjaW5jbHVkZSA8YXNtL3NvZnRpcnEuaD4KKyNpbmNsdWRlIDxhc20va21hcF90eXBlcy5oPgorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNCwyMCkpCisjZGVmaW5lIGxpc3RfZm9yX2VhY2hfZW50cnkocG9zLCBoZWFkLCBtZW1iZXIpCQkJCVwKKwlmb3IgKHBvcyA9IGxpc3RfZW50cnkoKGhlYWQpLT5uZXh0LCB0eXBlb2YoKnBvcyksIG1lbWJlciksCVwKKwkJICAgICBwcmVmZXRjaChwb3MtPm1lbWJlci5uZXh0KTsJCQlcCisJICAgICAmcG9zLT5tZW1iZXIgIT0gKGhlYWQpOyAJCQkJCVwKKwkgICAgIHBvcyA9IGxpc3RfZW50cnkocG9zLT5tZW1iZXIubmV4dCwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpLAlcCisJCSAgICAgcHJlZmV0Y2gocG9zLT5tZW1iZXIubmV4dCkpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb25kX3Jlc2NoZWQodm9pZCkKK3sKKwlpZiAobmVlZF9yZXNjaGVkKCkpIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJc2NoZWR1bGUoKTsKKwl9Cit9CisjZW5kaWYKKworZXh0ZXJuIGVudW0ga21fdHlwZSBjcnlwdG9fa21fdHlwZXNbXTsKKworc3RhdGljIGlubGluZSBlbnVtIGttX3R5cGUgY3J5cHRvX2ttYXBfdHlwZShpbnQgb3V0KQoreworCXJldHVybiBjcnlwdG9fa21fdHlwZXNbKGluX3NvZnRpcnEoKSA/IDIgOiAwKSArIG91dF07Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqY3J5cHRvX2ttYXAoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBvdXQpCit7CisJcmV0dXJuIGttYXBfYXRvbWljKHBhZ2UsIGNyeXB0b19rbWFwX3R5cGUob3V0KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fa3VubWFwKHZvaWQgKnZhZGRyLCBpbnQgb3V0KQoreworCWt1bm1hcF9hdG9taWModmFkZHIsIGNyeXB0b19rbWFwX3R5cGUob3V0KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9feWllbGQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlpZiAoIWluX3NvZnRpcnEoKSkKKwkJY29uZF9yZXNjaGVkKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqY3J5cHRvX3RmbV9jdHgoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlyZXR1cm4gKHZvaWQgKikmdGZtWzFdOworfQorCitzdHJ1Y3QgY3J5cHRvX2FsZyAqY3J5cHRvX2FsZ19sb29rdXAoY29uc3QgY2hhciAqbmFtZSk7CisKKyNpZmRlZiBDT05GSUdfS01PRAordm9pZCBjcnlwdG9fYWxnX2F1dG9sb2FkKGNvbnN0IGNoYXIgKm5hbWUpOworc3RydWN0IGNyeXB0b19hbGcgKmNyeXB0b19hbGdfbW9kX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjcnlwdG9fYWxnICpjcnlwdG9fYWxnX21vZF9sb29rdXAoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gY3J5cHRvX2FsZ19sb29rdXAobmFtZSk7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19DUllQVE9fSE1BQworaW50IGNyeXB0b19hbGxvY19obWFjX2Jsb2NrKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOwordm9pZCBjcnlwdG9fZnJlZV9obWFjX2Jsb2NrKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19hbGxvY19obWFjX2Jsb2NrKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fZnJlZV9obWFjX2Jsb2NrKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7IH0KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3ZvaWQgX19pbml0IGNyeXB0b19pbml0X3Byb2Modm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19pbml0X3Byb2Modm9pZCkKK3sgfQorI2VuZGlmCisKK2ludCBjcnlwdG9faW5pdF9kaWdlc3RfZmxhZ3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTMyIGZsYWdzKTsKK2ludCBjcnlwdG9faW5pdF9jaXBoZXJfZmxhZ3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTMyIGZsYWdzKTsKK2ludCBjcnlwdG9faW5pdF9jb21wcmVzc19mbGFncyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1MzIgZmxhZ3MpOworCitpbnQgY3J5cHRvX2luaXRfZGlnZXN0X29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKK2ludCBjcnlwdG9faW5pdF9jaXBoZXJfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOworaW50IGNyeXB0b19pbml0X2NvbXByZXNzX29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKKwordm9pZCBjcnlwdG9fZXhpdF9kaWdlc3Rfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOwordm9pZCBjcnlwdG9fZXhpdF9jaXBoZXJfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOwordm9pZCBjcnlwdG9fZXhpdF9jb21wcmVzc19vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7CisKKyNlbmRpZgkvKiBfQ1JZUFRPX0lOVEVSTkFMX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvcnRsX2NyeXB0by5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvcnRsX2NyeXB0by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZDBjYTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9ydGxfY3J5cHRvLmgKQEAgLTAsMCArMSwzOTkgQEAKKy8qCisgKiBTY2F0dGVybGlzdCBDcnlwdG9ncmFwaGljIEFQSS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICoKKyAqIFBvcnRpb25zIGRlcml2ZWQgZnJvbSBDcnlwdG9hcGksIGJ5IEFsZXhhbmRlciBLamVsZGFhcyA8YXN0b3JAZmFzdC5ubz4KKyAqIGFuZCBOZXR0bGUsIGJ5IE5pZWxzIE3psIhsZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKyNpZm5kZWYgX0xJTlVYX0NSWVBUT19ICisjZGVmaW5lIF9MSU5VWF9DUllQVE9fSAorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKworI2RlZmluZSBjcnlwdG9fcmVnaXN0ZXJfYWxnIGNyeXB0b19yZWdpc3Rlcl9hbGdfcnRsCisjZGVmaW5lIGNyeXB0b191bnJlZ2lzdGVyX2FsZyBjcnlwdG9fdW5yZWdpc3Rlcl9hbGdfcnRsCisjZGVmaW5lIGNyeXB0b19hbGxvY190Zm0gY3J5cHRvX2FsbG9jX3RmbV9ydGwKKyNkZWZpbmUgY3J5cHRvX2ZyZWVfdGZtIGNyeXB0b19mcmVlX3RmbV9ydGwKKyNkZWZpbmUgY3J5cHRvX2FsZ19hdmFpbGFibGUgY3J5cHRvX2FsZ19hdmFpbGFibGVfcnRsCisKKy8qCisgKiBBbGdvcml0aG0gbWFza3MgYW5kIHR5cGVzLgorICovCisjZGVmaW5lIENSWVBUT19BTEdfVFlQRV9NQVNLCQkweDAwMDAwMGZmCisjZGVmaW5lIENSWVBUT19BTEdfVFlQRV9DSVBIRVIJCTB4MDAwMDAwMDEKKyNkZWZpbmUgQ1JZUFRPX0FMR19UWVBFX0RJR0VTVAkJMHgwMDAwMDAwMgorI2RlZmluZSBDUllQVE9fQUxHX1RZUEVfQ09NUFJFU1MJMHgwMDAwMDAwNAorCisvKgorICogVHJhbnNmb3JtIG1hc2tzIGFuZCB2YWx1ZXMgKGZvciBjcnRfZmxhZ3MpLgorICovCisjZGVmaW5lIENSWVBUT19URk1fTU9ERV9NQVNLCQkweDAwMDAwMGZmCisjZGVmaW5lIENSWVBUT19URk1fUkVRX01BU0sJCTB4MDAwZmZmMDAKKyNkZWZpbmUgQ1JZUFRPX1RGTV9SRVNfTUFTSwkJMHhmZmYwMDAwMAorCisjZGVmaW5lIENSWVBUT19URk1fTU9ERV9FQ0IJCTB4MDAwMDAwMDEKKyNkZWZpbmUgQ1JZUFRPX1RGTV9NT0RFX0NCQwkJMHgwMDAwMDAwMgorI2RlZmluZSBDUllQVE9fVEZNX01PREVfQ0ZCCQkweDAwMDAwMDA0CisjZGVmaW5lIENSWVBUT19URk1fTU9ERV9DVFIJCTB4MDAwMDAwMDgKKworI2RlZmluZSBDUllQVE9fVEZNX1JFUV9XRUFLX0tFWQkJMHgwMDAwMDEwMAorI2RlZmluZSBDUllQVE9fVEZNX1JFU19XRUFLX0tFWQkJMHgwMDEwMDAwMAorI2RlZmluZSBDUllQVE9fVEZNX1JFU19CQURfS0VZX0xFTiAgIAkweDAwMjAwMDAwCisjZGVmaW5lIENSWVBUT19URk1fUkVTX0JBRF9LRVlfU0NIRUQgCTB4MDA0MDAwMDAKKyNkZWZpbmUgQ1JZUFRPX1RGTV9SRVNfQkFEX0JMT0NLX0xFTiAJMHgwMDgwMDAwMAorI2RlZmluZSBDUllQVE9fVEZNX1JFU19CQURfRkxBR1MgCTB4MDEwMDAwMDAKKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgc3R1ZmYuCisgKi8KKyNkZWZpbmUgQ1JZUFRPX1VOU1BFQwkJCTAKKyNkZWZpbmUgQ1JZUFRPX01BWF9BTEdfTkFNRQkJNjQKKworc3RydWN0IHNjYXR0ZXJsaXN0OworCisvKgorICogQWxnb3JpdGhtczogbW9kdWxhciBjcnlwdG8gYWxnb3JpdGhtIGltcGxlbWVudGF0aW9ucywgbWFuYWdlZAorICogdmlhIGNyeXB0b19yZWdpc3Rlcl9hbGcoKSBhbmQgY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCkuCisgKi8KK3N0cnVjdCBjaXBoZXJfYWxnIHsKKwl1bnNpZ25lZCBpbnQgY2lhX21pbl9rZXlzaXplOworCXVuc2lnbmVkIGludCBjaWFfbWF4X2tleXNpemU7CisJaW50ICgqY2lhX3NldGtleSkodm9pZCAqY3R4LCBjb25zdCB1OCAqa2V5LAorCSAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBrZXlsZW4sIHUzMiAqZmxhZ3MpOworCXZvaWQgKCpjaWFfZW5jcnlwdCkodm9pZCAqY3R4LCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKTsKKwl2b2lkICgqY2lhX2RlY3J5cHQpKHZvaWQgKmN0eCwgdTggKmRzdCwgY29uc3QgdTggKnNyYyk7Cit9OworCitzdHJ1Y3QgZGlnZXN0X2FsZyB7CisJdW5zaWduZWQgaW50IGRpYV9kaWdlc3RzaXplOworCXZvaWQgKCpkaWFfaW5pdCkodm9pZCAqY3R4KTsKKwl2b2lkICgqZGlhX3VwZGF0ZSkodm9pZCAqY3R4LCBjb25zdCB1OCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbik7CisJdm9pZCAoKmRpYV9maW5hbCkodm9pZCAqY3R4LCB1OCAqb3V0KTsKKwlpbnQgKCpkaWFfc2V0a2V5KSh2b2lkICpjdHgsIGNvbnN0IHU4ICprZXksCisJICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGtleWxlbiwgdTMyICpmbGFncyk7Cit9OworCitzdHJ1Y3QgY29tcHJlc3NfYWxnIHsKKwlpbnQgKCpjb2FfaW5pdCkodm9pZCAqY3R4KTsKKwl2b2lkICgqY29hX2V4aXQpKHZvaWQgKmN0eCk7CisJaW50ICgqY29hX2NvbXByZXNzKSh2b2lkICpjdHgsIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAorCSAgICAgICAgICAgICAgICAgICAgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKTsKKwlpbnQgKCpjb2FfZGVjb21wcmVzcykodm9pZCAqY3R4LCBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgc2xlbiwKKwkgICAgICAgICAgICAgICAgICAgICAgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKTsKK307CisKKyNkZWZpbmUgY3JhX2NpcGhlcgljcmFfdS5jaXBoZXIKKyNkZWZpbmUgY3JhX2RpZ2VzdAljcmFfdS5kaWdlc3QKKyNkZWZpbmUgY3JhX2NvbXByZXNzCWNyYV91LmNvbXByZXNzCisKK3N0cnVjdCBjcnlwdG9fYWxnIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNyYV9saXN0OworCXUzMiBjcmFfZmxhZ3M7CisJdW5zaWduZWQgaW50IGNyYV9ibG9ja3NpemU7CisJdW5zaWduZWQgaW50IGNyYV9jdHhzaXplOworCWNvbnN0IGNoYXIgY3JhX25hbWVbQ1JZUFRPX01BWF9BTEdfTkFNRV07CisKKwl1bmlvbiB7CisJCXN0cnVjdCBjaXBoZXJfYWxnIGNpcGhlcjsKKwkJc3RydWN0IGRpZ2VzdF9hbGcgZGlnZXN0OworCQlzdHJ1Y3QgY29tcHJlc3NfYWxnIGNvbXByZXNzOworCX0gY3JhX3U7CisKKwlzdHJ1Y3QgbW9kdWxlICpjcmFfbW9kdWxlOworfTsKKworLyoKKyAqIEFsZ29yaXRobSByZWdpc3RyYXRpb24gaW50ZXJmYWNlLgorICovCitpbnQgY3J5cHRvX3JlZ2lzdGVyX2FsZyhzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKTsKK2ludCBjcnlwdG9fdW5yZWdpc3Rlcl9hbGcoc3RydWN0IGNyeXB0b19hbGcgKmFsZyk7CisKKy8qCisgKiBBbGdvcml0aG0gcXVlcnkgaW50ZXJmYWNlLgorICovCitpbnQgY3J5cHRvX2FsZ19hdmFpbGFibGUoY29uc3QgY2hhciAqbmFtZSwgdTMyIGZsYWdzKTsKKworLyoKKyAqIFRyYW5zZm9ybXM6IHVzZXItaW5zdGFudGlhdGVkIG9iamVjdHMgd2hpY2ggZW5jYXBzdWxhdGUgYWxnb3JpdGhtcworICogYW5kIGNvcmUgcHJvY2Vzc2luZyBsb2dpYy4gIE1hbmFnZWQgdmlhIGNyeXB0b19hbGxvY190Zm0oKSBhbmQKKyAqIGNyeXB0b19mcmVlX3RmbSgpLCBhcyB3ZWxsIGFzIHRoZSB2YXJpb3VzIGhlbHBlcnMgYmVsb3cuCisgKi8KK3N0cnVjdCBjcnlwdG9fdGZtOworCitzdHJ1Y3QgY2lwaGVyX3RmbSB7CisJdm9pZCAqY2l0X2l2OworCXVuc2lnbmVkIGludCBjaXRfaXZzaXplOworCXUzMiBjaXRfbW9kZTsKKwlpbnQgKCpjaXRfc2V0a2V5KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCSAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pOworCWludCAoKmNpdF9lbmNyeXB0KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKKwkJCSAgIHVuc2lnbmVkIGludCBuYnl0ZXMpOworCWludCAoKmNpdF9lbmNyeXB0X2l2KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCSAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCisJICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICppdik7CisJaW50ICgqY2l0X2RlY3J5cHQpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorCQkJICAgdW5zaWduZWQgaW50IG5ieXRlcyk7CisJaW50ICgqY2l0X2RlY3J5cHRfaXYpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorCQkJICAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKml2KTsKKwl2b2lkICgqY2l0X3hvcl9ibG9jaykodTggKmRzdCwgY29uc3QgdTggKnNyYyk7Cit9OworCitzdHJ1Y3QgZGlnZXN0X3RmbSB7CisJdm9pZCAoKmRpdF9pbml0KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKKwl2b2lkICgqZGl0X3VwZGF0ZSkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgdW5zaWduZWQgaW50IG5zZyk7CisJdm9pZCAoKmRpdF9maW5hbCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKm91dCk7CisJdm9pZCAoKmRpdF9kaWdlc3QpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisJICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuc2csIHU4ICpvdXQpOworCWludCAoKmRpdF9zZXRrZXkpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJICAgICAgICAgICAgICAgICAgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbik7CisjaWZkZWYgQ09ORklHX0NSWVBUT19ITUFDCisJdm9pZCAqZGl0X2htYWNfYmxvY2s7CisjZW5kaWYKK307CisKK3N0cnVjdCBjb21wcmVzc190Zm0geworCWludCAoKmNvdF9jb21wcmVzcykoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAorCSAgICAgICAgICAgICAgICAgICAgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKTsKKwlpbnQgKCpjb3RfZGVjb21wcmVzcykoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IHNsZW4sCisJICAgICAgICAgICAgICAgICAgICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCAqZGxlbik7Cit9OworCisjZGVmaW5lIGNydF9jaXBoZXIJY3J0X3UuY2lwaGVyCisjZGVmaW5lIGNydF9kaWdlc3QJY3J0X3UuZGlnZXN0CisjZGVmaW5lIGNydF9jb21wcmVzcwljcnRfdS5jb21wcmVzcworCitzdHJ1Y3QgY3J5cHRvX3RmbSB7CisKKwl1MzIgY3J0X2ZsYWdzOworCisJdW5pb24geworCQlzdHJ1Y3QgY2lwaGVyX3RmbSBjaXBoZXI7CisJCXN0cnVjdCBkaWdlc3RfdGZtIGRpZ2VzdDsKKwkJc3RydWN0IGNvbXByZXNzX3RmbSBjb21wcmVzczsKKwl9IGNydF91OworCisJc3RydWN0IGNyeXB0b19hbGcgKl9fY3J0X2FsZzsKK307CisKKy8qCisgKiBUcmFuc2Zvcm0gdXNlciBpbnRlcmZhY2UuCisgKi8KKworLyoKKyAqIGNyeXB0b19hbGxvY190Zm0oKSB3aWxsIGZpcnN0IGF0dGVtcHQgdG8gbG9jYXRlIGFuIGFscmVhZHkgbG9hZGVkIGFsZ29yaXRobS4KKyAqIElmIHRoYXQgZmFpbHMgYW5kIHRoZSBrZXJuZWwgc3VwcG9ydHMgZHluYW1pY2FsbHkgbG9hZGFibGUgbW9kdWxlcywgaXQKKyAqIHdpbGwgdGhlbiBhdHRlbXB0IHRvIGxvYWQgYSBtb2R1bGUgb2YgdGhlIHNhbWUgbmFtZSBvciBhbGlhcy4gIEEgcmVmY291bnQKKyAqIGlzIGdyYWJiZWQgb24gdGhlIGFsZ29yaXRobSB3aGljaCBpcyB0aGVuIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV3IHRyYW5zZm9ybS4KKyAqCisgKiBjcnlwdG9fZnJlZV90Zm0oKSBmcmVlcyB1cCB0aGUgdHJhbnNmb3JtIGFuZCBhbnkgYXNzb2NpYXRlZCByZXNvdXJjZXMsCisgKiB0aGVuIGRyb3BzIHRoZSByZWZjb3VudCBvbiB0aGUgYXNzb2NpYXRlZCBhbGdvcml0aG0uCisgKi8KK3N0cnVjdCBjcnlwdG9fdGZtICpjcnlwdG9fYWxsb2NfdGZtKGNvbnN0IGNoYXIgKmFsZ19uYW1lLCB1MzIgdGZtX2ZsYWdzKTsKK3ZvaWQgY3J5cHRvX2ZyZWVfdGZtKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOworCisvKgorICogVHJhbnNmb3JtIGhlbHBlcnMgd2hpY2ggcXVlcnkgdGhlIHVuZGVybHlpbmcgYWxnb3JpdGhtLgorICovCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmNyeXB0b190Zm1fYWxnX25hbWUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9uYW1lOworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmNyeXB0b190Zm1fYWxnX21vZG5hbWUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnID0gdGZtLT5fX2NydF9hbGc7CisKKwlpZiAoYWxnLT5jcmFfbW9kdWxlKQorCQlyZXR1cm4gYWxnLT5jcmFfbW9kdWxlLT5uYW1lOworCWVsc2UKKwkJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGNyeXB0b190Zm1fYWxnX3R5cGUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9mbGFncyAmIENSWVBUT19BTEdfVFlQRV9NQVNLOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9fdGZtX2FsZ19taW5fa2V5c2l6ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CisJcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyLmNpYV9taW5fa2V5c2l6ZTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX3RmbV9hbGdfbWF4X2tleXNpemUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOworCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfbWF4X2tleXNpemU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b190Zm1fYWxnX2l2c2l6ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CisJcmV0dXJuIHRmbS0+Y3J0X2NpcGhlci5jaXRfaXZzaXplOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9ibG9ja3NpemU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b190Zm1fYWxnX2RpZ2VzdHNpemUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9ESUdFU1QpOworCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2RpZ2VzdC5kaWFfZGlnZXN0c2l6ZTsKK30KKworLyoKKyAqIEFQSSB3cmFwcGVycy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19kaWdlc3RfaW5pdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0RJR0VTVCk7CisJdGZtLT5jcnRfZGlnZXN0LmRpdF9pbml0KHRmbSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fZGlnZXN0X3VwZGF0ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5zZykKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9ESUdFU1QpOworCXRmbS0+Y3J0X2RpZ2VzdC5kaXRfdXBkYXRlKHRmbSwgc2csIG5zZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fZGlnZXN0X2ZpbmFsKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpvdXQpCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfRElHRVNUKTsKKwl0Zm0tPmNydF9kaWdlc3QuZGl0X2ZpbmFsKHRmbSwgb3V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19kaWdlc3RfZGlnZXN0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnNnLCB1OCAqb3V0KQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0RJR0VTVCk7CisJdGZtLT5jcnRfZGlnZXN0LmRpdF9kaWdlc3QodGZtLCBzZywgbnNnLCBvdXQpOworfQorCitzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fZGlnZXN0X3NldGtleShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbikKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9ESUdFU1QpOworCWlmICh0Zm0tPmNydF9kaWdlc3QuZGl0X3NldGtleSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT1NZUzsKKwlyZXR1cm4gdGZtLT5jcnRfZGlnZXN0LmRpdF9zZXRrZXkodGZtLCBrZXksIGtleWxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jaXBoZXJfc2V0a2V5KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuKQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CisJcmV0dXJuIHRmbS0+Y3J0X2NpcGhlci5jaXRfc2V0a2V5KHRmbSwga2V5LCBrZXlsZW4pOworfQorCitzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY2lwaGVyX2VuY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CisJcmV0dXJuIHRmbS0+Y3J0X2NpcGhlci5jaXRfZW5jcnlwdCh0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMpOworfQorCitzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY2lwaGVyX2VuY3J5cHRfaXYoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB1OCAqaXYpCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKKwlCVUdfT04odGZtLT5jcnRfY2lwaGVyLmNpdF9tb2RlID09IENSWVBUT19URk1fTU9ERV9FQ0IpOworCXJldHVybiB0Zm0tPmNydF9jaXBoZXIuY2l0X2VuY3J5cHRfaXYodGZtLCBkc3QsIHNyYywgbmJ5dGVzLCBpdik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jaXBoZXJfZGVjcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKKwlyZXR1cm4gdGZtLT5jcnRfY2lwaGVyLmNpdF9kZWNyeXB0KHRmbSwgZHN0LCBzcmMsIG5ieXRlcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jaXBoZXJfZGVjcnlwdF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICppdikKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOworCUJVR19PTih0Zm0tPmNydF9jaXBoZXIuY2l0X21vZGUgPT0gQ1JZUFRPX1RGTV9NT0RFX0VDQik7CisJcmV0dXJuIHRmbS0+Y3J0X2NpcGhlci5jaXRfZGVjcnlwdF9pdih0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMsIGl2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19jaXBoZXJfc2V0X2l2KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IGxlbikKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOworCW1lbWNweSh0Zm0tPmNydF9jaXBoZXIuY2l0X2l2LCBzcmMsIGxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fY2lwaGVyX2dldF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCBsZW4pCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKKwltZW1jcHkoZHN0LCB0Zm0tPmNydF9jaXBoZXIuY2l0X2l2LCBsZW4pOworfQorCitzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY29tcF9jb21wcmVzcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IHNsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ09NUFJFU1MpOworCXJldHVybiB0Zm0tPmNydF9jb21wcmVzcy5jb3RfY29tcHJlc3ModGZtLCBzcmMsIHNsZW4sIGRzdCwgZGxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jb21wX2RlY29tcHJlc3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IHNsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCAqZGxlbikKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DT01QUkVTUyk7CisJcmV0dXJuIHRmbS0+Y3J0X2NvbXByZXNzLmNvdF9kZWNvbXByZXNzKHRmbSwgc3JjLCBzbGVuLCBkc3QsIGRsZW4pOworfQorCisvKgorICogSE1BQyBzdXBwb3J0LgorICovCisjaWZkZWYgQ09ORklHX0NSWVBUT19ITUFDCit2b2lkIGNyeXB0b19obWFjX2luaXQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmtleSwgdW5zaWduZWQgaW50ICprZXlsZW4pOwordm9pZCBjcnlwdG9faG1hY191cGRhdGUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIHVuc2lnbmVkIGludCBuc2cpOwordm9pZCBjcnlwdG9faG1hY19maW5hbChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmtleWxlbiwgdTggKm91dCk7Cit2b2lkIGNyeXB0b19obWFjKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICprZXksIHVuc2lnbmVkIGludCAqa2V5bGVuLAorICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCB1bnNpZ25lZCBpbnQgbnNnLCB1OCAqb3V0KTsKKyNlbmRpZgkvKiBDT05GSUdfQ1JZUFRPX0hNQUMgKi8KKworI2VuZGlmCS8qIF9MSU5VWF9DUllQVE9fSCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMV9jcnlwdC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTFfY3J5cHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNThhM2JjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTFfY3J5cHQuaApAQCAtMCwwICsxLDg2IEBACisvKgorICogT3JpZ2luYWwgY29kZSBiYXNlZCBvbiBIb3N0IEFQIChzb2Z0d2FyZSB3aXJlbGVzcyBMQU4gYWNjZXNzIHBvaW50KSBkcml2ZXIKKyAqIGZvciBJbnRlcnNpbCBQcmlzbTIvMi41LzMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIsIFNTSCBDb21tdW5pY2F0aW9ucyBTZWN1cml0eSBDb3JwIGFuZCBKb3VuaSBNYWxpbmVuCisgKiA8amttYWxpbmVAY2MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqCisgKiBBZGFwdGlvbiB0byBhIGdlbmVyaWMgSUVFRSA4MDIuMTEgc3RhY2sgYnkgSmFtZXMgS2V0cmVub3MKKyAqIDxqa2V0cmVub0BsaW51eC5pbnRlbC5jb20+CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgdG8gdGhlIGllZWU4MDIxMSBjcnlwdG8gbW9kdWxlLgorICovCisjaWZuZGVmIElFRUU4MDIxMV9DUllQVF9ICisjZGVmaW5lIElFRUU4MDIxMV9DUllQVF9ICisKKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzIHsKKwljb25zdCBjaGFyICpuYW1lOworCisJLyogaW5pdCBuZXcgY3J5cHRvIGNvbnRleHQgKGUuZy4sIGFsbG9jYXRlIHByaXZhdGUgZGF0YSBzcGFjZSwKKwkgKiBzZWxlY3QgSVYsIGV0Yy4pOyByZXR1cm5zIE5VTEwgb24gZmFpbHVyZSBvciBwb2ludGVyIHRvIGFsbG9jYXRlZAorCSAqIHByaXZhdGUgZGF0YSBvbiBzdWNjZXNzICovCisJdm9pZCAqICgqaW5pdCkoaW50IGtleWlkeCk7CisKKwkvKiBkZWluaXRpYWxpemUgY3J5cHRvIGNvbnRleHQgYW5kIGZyZWUgYWxsb2NhdGVkIHByaXZhdGUgZGF0YSAqLworCXZvaWQgKCpkZWluaXQpKHZvaWQgKnByaXYpOworCisJLyogZW5jcnlwdC9kZWNyeXB0IHJldHVybiA8IDAgb24gZXJyb3Igb3IgPj0gMCBvbiBzdWNjZXNzLiBUaGUgcmV0dXJuCisJICogdmFsdWUgZnJvbSBkZWNyeXB0X21wZHUgaXMgcGFzc2VkIGFzIHRoZSBrZXlpZHggdmFsdWUgZm9yCisJICogZGVjcnlwdF9tc2R1LiBza2IgbXVzdCBoYXZlIGVub3VnaCBoZWFkIGFuZCB0YWlsIHJvb20gZm9yIHRoZQorCSAqIGVuY3J5cHRpb247IGlmIG5vdCwgZXJyb3Igd2lsbCBiZSByZXR1cm5lZDsgdGhlc2UgZnVuY3Rpb25zIGFyZQorCSAqIGNhbGxlZCBmb3IgYWxsIE1QRFVzIChpLmUuLCBmcmFnbWVudHMpLgorCSAqLworCWludCAoKmVuY3J5cHRfbXBkdSkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpOworCWludCAoKmRlY3J5cHRfbXBkdSkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpOworCisJLyogVGhlc2UgZnVuY3Rpb25zIGFyZSBjYWxsZWQgZm9yIGZ1bGwgTVNEVXMsIGkuZS4gZnVsbCBmcmFtZXMuCisJICogVGhlc2UgY2FuIGJlIE5VTEwgaWYgZnVsbCBNU0RVIG9wZXJhdGlvbnMgYXJlIG5vdCBuZWVkZWQuICovCisJaW50ICgqZW5jcnlwdF9tc2R1KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdik7CisJaW50ICgqZGVjcnlwdF9tc2R1KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQga2V5aWR4LCBpbnQgaGRyX2xlbiwKKwkJCSAgICB2b2lkICpwcml2KTsKKworCWludCAoKnNldF9rZXkpKHZvaWQgKmtleSwgaW50IGxlbiwgdTggKnNlcSwgdm9pZCAqcHJpdik7CisJaW50ICgqZ2V0X2tleSkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KTsKKworCS8qIHByb2NmcyBoYW5kbGVyIGZvciBwcmludGluZyBvdXQga2V5IGluZm9ybWF0aW9uIGFuZCBwb3NzaWJsZQorCSAqIHN0YXRpc3RpY3MgKi8KKwljaGFyICogKCpwcmludF9zdGF0cykoY2hhciAqcCwgdm9pZCAqcHJpdik7CisKKwkvKiBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBhZGRlZCBieSBlbmNyeXB0aW9uOyBlbmNyeXB0IGJ1ZiBpcworCSAqIGFsbG9jYXRlZCB3aXRoIGV4dHJhX3ByZWZpeF9sZW4gYnl0ZXMsIGNvcHkgb2YgaW5fYnVmLCBhbmQKKwkgKiBleHRyYV9wb3N0Zml4X2xlbjsgZW5jcnlwdCBuZWVkIG5vdCB1c2UgYWxsIHRoaXMgc3BhY2UsIGJ1dAorCSAqIHRoZSByZXN1bHQgbXVzdCBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgYW5kIGNvcnJlY3QKKwkgKiBsZW5ndGggbXVzdCBiZSByZXR1cm5lZCAqLworCWludCBleHRyYV9wcmVmaXhfbGVuLCBleHRyYV9wb3N0Zml4X2xlbjsKKworCXN0cnVjdCBtb2R1bGUgKm93bmVyOworfTsKKworc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7IC8qIGRlbGF5ZWQgZGVsZXRpb24gbGlzdCAqLworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzOworCXZvaWQgKnByaXY7CisJYXRvbWljX3QgcmVmY250OworfTsKKworaW50IGllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzKTsKK2ludCBpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzKTsKK3N0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqIGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9lbnRyaWVzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICosIGludCk7Cit2b2lkIGllZWU4MDIxMV9jcnlwdF9kZWluaXRfaGFuZGxlcih1bnNpZ25lZCBsb25nKTsKK3ZvaWQgaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKipjcnlwdCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMjE1ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwLmgKQEAgLTAsMCArMSw3NjEgQEAKKy8qCisgICBUaGlzIGlzIHBhcnQgb2YgcnRsODE4MCBPcGVuU291cmNlIGRyaXZlci4KKyAgIENvcHlyaWdodCAoQykgQW5kcmVhIE1lcmVsbG8gMjAwNC0yMDA1ICA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisgICBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR1BMIChHZW5lcmFsIFB1YmxpYyBMaWNlbmNlKQorCisgICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEdQTCBwYXJ0IG9mIHRoZQorICAgb2ZmaWNpYWwgcmVhbHRlayBkcml2ZXIKKworICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBydGw4MTgwIGRyaXZlciBza2VsZXRvbgorICAgZnJvbSBQYXRyaWMgU2NoZW5rZSAmIEFuZHJlcyBTYWxvbW9uCisKKyAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgSW50ZWwgUHJvIFdpcmVsZXNzIDIxMDAgR1BMIGRyaXZlcgorCisgICBXZSB3YW50IHRvIHRhbmtzIHRoZSBBdXRob3JzIG9mIHRob3NlIHByb2plY3RzIGFuZCB0aGUgTmRpc3dyYXBwZXIKKyAgIHByb2plY3QgQXV0aG9ycy4KKyovCisKKyNpZm5kZWYgUjgxODBICisjZGVmaW5lIFI4MTgwSAorCisKKyNkZWZpbmUgUlRMODE4MF9NT0RVTEVfTkFNRSAicnRsODE4MCIKKyNkZWZpbmUgRE1FU0coeCxhLi4uKSBwcmludGsoS0VSTl9JTkZPIFJUTDgxODBfTU9EVUxFX05BTUUgIjogIiB4ICJcbiIsICMjIGEpCisjZGVmaW5lIERNRVNHVyh4LGEuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgUlRMODE4MF9NT0RVTEVfTkFNRSAiOiBXVzoiIHggIlxuIiwgIyMgYSkKKyNkZWZpbmUgRE1FU0dFKHgsYS4uLikgcHJpbnRrKEtFUk5fV0FSTklORyBSVEw4MTgwX01PRFVMRV9OQU1FICI6IEVFOiIgeCAiXG4iLCAjIyBhKQorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisvLyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CS8vZm9yIHJ0bmxfbG9jaygpCisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4JLy8gTmVjZXNzYXJ5IGJlY2F1c2Ugd2UgdXNlIHRoZSBwcm9jIGZzCisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSAiaWVlZTgwMjExLmgiCisjaW5jbHVkZSA8YXNtL2lvLmg+CisvLyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKKyNkZWZpbmUgRVBST01fOTNjNDYgMAorI2RlZmluZSBFUFJPTV85M2M1NiAxCisKKyNkZWZpbmUgUlRMX0lPQ1RMX1dQQV9TVVBQTElDQU5UCQlTSU9DSVdGSVJTVFBSSVYrMzAKKworI2RlZmluZSBERUZBVUxUX0ZSQUdfVEhSRVNIT0xEIDIzNDJVCisjZGVmaW5lIE1JTl9GUkFHX1RIUkVTSE9MRCAgICAgMjU2VQorLy8jZGVmaW5lCU1BWF9GUkFHX1RIUkVTSE9MRCAgICAgMjM0MlUKKyNkZWZpbmUgREVGQVVMVF9SVFNfVEhSRVNIT0xEIDIzNDJVCisjZGVmaW5lIE1JTl9SVFNfVEhSRVNIT0xEIDBVCisjZGVmaW5lIE1BWF9SVFNfVEhSRVNIT0xEIDIzNDJVCisjZGVmaW5lIERFRkFVTFRfQkVBQ09OSU5URVJWQUwgMHg2NFUKKyNkZWZpbmUgREVGQVVMVF9CRUFDT05fRVNTSUQgIlJ0bDgxODAiCisKKyNkZWZpbmUgREVGQVVMVF9TU0lEICIiCisjZGVmaW5lIERFRkFVTFRfUkVUUllfUlRTIDcKKyNkZWZpbmUgREVGQVVMVF9SRVRSWV9EQVRBIDcKKyNkZWZpbmUgUFJJU01fSERSX1NJWkUgNjQKKworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCisjZGVmaW5lIE1HTlRfUVVFVUUJCQkJCQkwCisjZGVmaW5lIEJLX1FVRVVFCQkJCQkJMQorI2RlZmluZSBCRV9RVUVVRQkJCQkJCTIKKyNkZWZpbmUgVklfUVVFVUUJCQkJCQkzCisjZGVmaW5lIFZPX1FVRVVFCQkJCQkJNAorI2RlZmluZSBISUdIX1FVRVVFCQkJCQkJNQorI2RlZmluZSBCRUFDT05fUVVFVUUJCQkJCTYKKworI2RlZmluZSBMT1dfUVVFVUUJCQkJCQlCRV9RVUVVRQorI2RlZmluZSBOT1JNQUxfUVVFVUUJCQkJCU1HTlRfUVVFVUUKKworI2RlZmluZSBhU2lmc1RpbWUgCTEwCisKKyNkZWZpbmUgc0NyY0xuZyAgICAgICAgIDQKKyNkZWZpbmUgc0Fja0N0c0xuZwkxMTIJCS8vIGJpdHMgaW4gQUNLIGFuZCBDVFMgZnJhbWVzCisvLytieSBhbXkgMDgwMzEyCisjZGVmaW5lIFJBVEVfQURBUFRJVkVfVElNRVJfUEVSSU9ECTMwMAorCit0eXBlZGVmIGVudW0gX1dJUkVMRVNTX01PREUgeworCVdJUkVMRVNTX01PREVfVU5LTk9XTiA9IDB4MDAsCisJV0lSRUxFU1NfTU9ERV9BID0gMHgwMSwKKwlXSVJFTEVTU19NT0RFX0IgPSAweDAyLAorCVdJUkVMRVNTX01PREVfRyA9IDB4MDQsCisJV0lSRUxFU1NfTU9ERV9BVVRPID0gMHgwOCwKK30gV0lSRUxFU1NfTU9ERTsKKwordHlwZWRlZiBlbnVtIF9WRVJTSU9OXzgxODV7CisJLy8gUlRMODE4NQorCVZFUlNJT05fODE4NV9VTktOT1dOLAorCVZFUlNJT05fODE4NV9DLCAvLyBDLWN1dAorCVZFUlNJT05fODE4NV9ELCAvLyBELWN1dAorCS8vIFJUTDgxODVCCisJVkVSU0lPTl84MTg1Ql9CLCAvLyBCLWN1dAorCVZFUlNJT05fODE4NUJfRCwgLy8gRC1jdXQKKwlWRVJTSU9OXzgxODVCX0UsIC8vIEUtY3V0CisJLy9SVEw4MTg3Uy1QQ0lFCisJVkVSU0lPTl84MTg3U19CLCAvLyBCLWN1dAorCVZFUlNJT05fODE4N1NfQywgLy8gQy1jdXQKKwlWRVJTSU9OXzgxODdTX0QsIC8vIEQtY3V0CisKK31WRVJTSU9OXzgxODUsKlBWRVJTSU9OXzgxODU7Cit0eXBlZGVmIHN0cnVjdCAJQ2hubEFjY2Vzc1NldHRpbmcgeworCXUxNiBTSUZTX1RpbWVyOworCXUxNiBESUZTX1RpbWVyOworCXUxNiBTbG90VGltZVRpbWVyOworCXUxNiBFSUZTX1RpbWVyOworCXUxNiBDV21pbkluZGV4OworCXUxNiBDV21heEluZGV4OworfSpQQ0hBTk5FTF9BQ0NFU1NfU0VUVElORyxDSEFOTkVMX0FDQ0VTU19TRVRUSU5HOworCit0eXBlZGVmIGVudW17CisgICAgICAgIE5JQ184MTg1ID0gMSwKKyAgICAgICAgTklDXzgxODVCCisgICAgICAgIH0gbmljX3Q7CisKK3R5cGVkZWYgdTMyIEFDX0NPRElORzsKKyNkZWZpbmUgQUMwX0JFCTAJCS8vIEFDSTogMHgwMAkvLyBCZXN0IEVmZm9ydAorI2RlZmluZSBBQzFfQksJMQkJLy8gQUNJOiAweDAxCS8vIEJhY2tncm91bmQKKyNkZWZpbmUgQUMyX1ZJCTIJCS8vIEFDSTogMHgxMAkvLyBWaWRlbworI2RlZmluZSBBQzNfVk8JMwkJLy8gQUNJOiAweDExCS8vIFZvaWNlCisjZGVmaW5lIEFDX01BWAk0CQkvLyBNYXg6IGRlZmluZSB0b3RhbCBudW1iZXI7IFNob3VsZCBub3QgdG8gYmUgdXNlZCBhcyBhIHJlYWwgZW51bS4KKworLy8KKy8vIEVDV21pbi9FQ1dtYXggZmllbGQuCisvLyBSZWY6IFdNTSBzcGVjIDIuMi4yOiBXTUUgUGFyYW1ldGVyIEVsZW1lbnQsIHAuMTMuCisvLwordHlwZWRlZgl1bmlvbiBfRUNXeworCXU4CWNoYXJEYXRhOworCXN0cnVjdAorCXsKKwkJdTgJRUNXbWluOjQ7CisJCXU4CUVDV21heDo0OworCX1mOwkvLyBGaWVsZAorfUVDVywgKlBFQ1c7CisKKy8vCisvLyBBQ0kvQUlGU04gRmllbGQuCisvLyBSZWY6IFdNTSBzcGVjIDIuMi4yOiBXTUUgUGFyYW1ldGVyIEVsZW1lbnQsIHAuMTIuCisvLwordHlwZWRlZgl1bmlvbiBfQUNJX0FJRlNOeworCXU4CWNoYXJEYXRhOworCisJc3RydWN0CisJeworCQl1OAlBSUZTTjo0OworCQl1OAlBQ006MTsKKwkJdTgJQUNJOjI7CisJCXU4CVJlc2VydmVkOjE7CisJfWY7CS8vIEZpZWxkCit9QUNJX0FJRlNOLCAqUEFDSV9BSUZTTjsKKworLy8KKy8vIEFDIFBhcmFtZXRlcnMgUmVjb3JkIEZvcm1hdC4KKy8vIFJlZjogV01NIHNwZWMgMi4yLjI6IFdNRSBQYXJhbWV0ZXIgRWxlbWVudCwgcC4xMi4KKy8vCit0eXBlZGVmCXVuaW9uIF9BQ19QQVJBTXsKKwl1MzIJbG9uZ0RhdGE7CisJdTgJY2hhckRhdGFbNF07CisKKwlzdHJ1Y3QKKwl7CisJCUFDSV9BSUZTTglBY2lBaWZzbjsKKwkJRUNXCQlFY3c7CisJCXUxNgkJVFhPUExpbWl0OworCX1mOwkvLyBGaWVsZAorfUFDX1BBUkFNLCAqUEFDX1BBUkFNOworCisvKiBpdCBpcyBhIHdyb25nIGRlZmluaXRpb24uIC14aW9uZy0yMDA2LTExLTE3Cit0eXBlZGVmIHN0cnVjdCBUaHJlZVdpcmVSZWcgeworCXUxNglsb25nRGF0YTsKKwlzdHJ1Y3QgeworCQl1OAllbmFibGVCOworCQl1OAlkYXRhOworCQl1OAljbGs7CisJCXU4CXJlYWRfd3JpdGU7CisJfSBzdHJ1YzsKK30gVGhyZWVXaXJlUmVnOworKi8KKwordHlwZWRlZgl1bmlvbiBfVGhyZWVXaXJleworCXN0cnVjdCBfVGhyZWVXaXJlU3RydWN7CisJCXUxNgkJZGF0YToxOworCQl1MTYJCWNsazoxOworCQl1MTYJCWVuYWJsZUI6MTsKKwkJdTE2CQlyZWFkX3dyaXRlOjE7CisJCXUxNgkJcmVzdjE6MTI7CisvLwkJdTJCeXRlCXJlc3YyOjE0OworLy8JCXUyQnl0ZQlUaHJlZVdpcmVFbmFibGU6MTsKKy8vCQl1MkJ5dGUJcmVzdjM6MTsKKwl9c3RydWM7CisJdTE2CQkJbG9uZ0RhdGE7Cit9VGhyZWVXaXJlUmVnOworCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgYnVmZmVyCit7CisJc3RydWN0IGJ1ZmZlciAqbmV4dDsKKwl1MzIgKmJ1ZjsKKwlkbWFfYWRkcl90IGRtYTsKK30gYnVmZmVyOworCisvL1lKLG1vZGlmaWVkLDA4MDgyOAordHlwZWRlZiBzdHJ1Y3QgU3RhdHMKK3sKKwl1bnNpZ25lZCBsb25nIHR4cmR1OworCXVuc2lnbmVkIGxvbmcgcnhyZHU7CisJdW5zaWduZWQgbG9uZyByeG5vbGFzdDsKKwl1bnNpZ25lZCBsb25nIHJ4bm9kYXRhOworLy8JdW5zaWduZWQgbG9uZyByeHJlc2V0OworLy8JdW5zaWduZWQgbG9uZyByeHdya2Fyb3VuZDsKKwl1bnNpZ25lZCBsb25nIHJ4bm9wb2ludGVyOworCXVuc2lnbmVkIGxvbmcgdHhucGVycjsKKwl1bnNpZ25lZCBsb25nIHR4cmVzdW1lZDsKKwl1bnNpZ25lZCBsb25nIHJ4ZXJyOworCXVuc2lnbmVkIGxvbmcgcnhvdmVyZmxvdzsKKwl1bnNpZ25lZCBsb25nIHJ4aW50OworCXVuc2lnbmVkIGxvbmcgdHhia3Bva2ludDsKKwl1bnNpZ25lZCBsb25nIHR4YmVwb2tpbmc7CisJdW5zaWduZWQgbG9uZyB0eGJrcGVycjsKKwl1bnNpZ25lZCBsb25nIHR4YmVwZXJyOworCXVuc2lnbmVkIGxvbmcgdHhucG9raW50OworCXVuc2lnbmVkIGxvbmcgdHhocG9raW50OworCXVuc2lnbmVkIGxvbmcgdHhocGVycjsKKwl1bnNpZ25lZCBsb25nIGludHM7CisJdW5zaWduZWQgbG9uZyBzaGludHM7CisJdW5zaWduZWQgbG9uZyB0eG92ZXJmbG93OworCXVuc2lnbmVkIGxvbmcgcnhkbWFmYWlsOworCXVuc2lnbmVkIGxvbmcgdHhiZWFjb247CisJdW5zaWduZWQgbG9uZyB0eGJlYWNvbmVycjsKKwl1bnNpZ25lZCBsb25nIHR4bHBva2ludDsKKwl1bnNpZ25lZCBsb25nIHR4bHBlcnI7CisJdW5zaWduZWQgbG9uZyB0eHJldHJ5Oy8vcmV0cnkgbnVtYmVyICB0b255IDIwMDYwNjAxCisJdW5zaWduZWQgbG9uZyByeGNyY2Vycm1pbjsvL2NyYyBlcnJvciAoMC01MDApCisJdW5zaWduZWQgbG9uZyByeGNyY2Vycm1pZDsvL2NyYyBlcnJvciAoNTAwLTEwMDApCisJdW5zaWduZWQgbG9uZyByeGNyY2Vycm1heDsvL2NyYyBlcnJvciAoPjEwMDApCisJdW5zaWduZWQgbG9uZyByeGljdmVycjsvL0lDViBlcnJvcgorfSBTdGF0czsKKworI2RlZmluZSBNQVhfTERfU0xPVF9OVU0gMTAKKyNkZWZpbmUgS0VFUF9BTElWRV9JTlRFUlZBTCAJCQkJMjAgLy8gaW4gc2Vjb25kcy4KKyNkZWZpbmUgQ0hFQ0tfRk9SX0hBTkdfUEVSSU9ECQkJMiAvL2JlIGVxdWFsIHRvIHdhdGNoZG9nIGNoZWNrIHRpbWUKKyNkZWZpbmUgREVGQVVMVF9LRUVQX0FMSVZFX0xFVkVMCQkJMQorI2RlZmluZSBERUZBVUxUX1NMT1RfTlVNCQkJCQkyCisjZGVmaW5lIFBPV0VSX1BST0ZJTEVfQUMJCQkJCTAKKyNkZWZpbmUgUE9XRVJfUFJPRklMRV9CQVRURVJZCQkJMQorCit0eXBlZGVmIHN0cnVjdCBfbGlua19kZXRlY3RfdAoreworCXUzMgkJCQlSeEZyYW1lTnVtW01BWF9MRF9TTE9UX05VTV07CS8vIG51bWJlciBvZiBSeCBGcmFtZSAvIENoZWNrRm9ySGFuZ19wZXJpb2QgIHRvIGRldGVybWluZSBsaW5rIHN0YXR1cworCXUxNgkJCQlTbG90TnVtOwkvLyBudW1iZXIgb2YgQ2hlY2tGb3JIYW5nIHBlcmlvZCB0byBkZXRlcm1pbmUgbGluayBzdGF0dXMsIGRlZmF1bHQgaXMgMgorCXUxNgkJCQlTbG90SW5kZXg7CisKKwl1MzIJCQkJTnVtVHhPa0luUGVyaW9kOyAgLy9udW1iZXIgb2YgcGFja2V0IHRyYW5zbWl0dGVkIGR1cmluZyBDaGVja0ZvckhhbmcKKwl1MzIJCQkJTnVtUnhPa0luUGVyaW9kOyAgLy9udW1iZXIgb2YgcGFja2V0IHJlY2VpdmVkIGR1cmluZyBDaGVja0ZvckhhbmcKKworCXU4CQkJCUlkbGVDb3VudDsgICAgIC8vIChLRUVQX0FMSVZFX0lOVEVSVkFMIC8gQ0hFQ0tfRk9SX0hBTkdfUEVSSU9EKQorCXUzMgkJCQlMYXN0TnVtVHhVbmljYXN0OworCXUzMgkJCQlMYXN0TnVtUnhVbmljYXN0OworCisJYm9vbAkJCQliQnVzeVRyYWZmaWM7ICAgIC8vd2hlbiBpdCBpcyBzZXQgdG8gMSwgVUkgY2Fubid0IHNjYW4gYXQgd2lsbC4KK31saW5rX2RldGVjdF90LCAqcGxpbmtfZGV0ZWN0X3Q7CisKKy8vWUosbW9kaWZpZWQsMDgwODI4LGVuZAorCisvL2J5IGFteSBmb3IgbGVkCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBMRUQgY3VzdG9taXphdGlvbi4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordHlwZWRlZgllbnVtIF9MRURfU1RSQVRFR1lfODE4NXsKKwlTV19MRURfTU9ERTAsIC8vCisJU1dfTEVEX01PREUxLCAvLworCUhXX0xFRCwgLy8gSFcgY29udHJvbCAyIExFRHMsIExFRDAgYW5kIExFRDEgKHRoZXJlIGFyZSA0IGRpZmZlcmVudCBjb250cm9sIG1vZGVzKQorfUxFRF9TVFJBVEVHWV84MTg1LCAqUExFRF9TVFJBVEVHWV84MTg1OworLy9ieSBhbXkgZm9yIGxlZAorLy9ieSBhbXkgZm9yIHBvd2VyIHNhdmUKK3R5cGVkZWYJZW51bSBfTEVEX0NUTF9NT0RFeworCUxFRF9DVExfUE9XRVJfT04gPSAxLAorCUxFRF9DVExfTElOSyA9IDIsCisJTEVEX0NUTF9OT19MSU5LID0gMywKKwlMRURfQ1RMX1RYID0gNCwKKwlMRURfQ1RMX1JYID0gNSwKKwlMRURfQ1RMX1NJVEVfU1VSVkVZID0gNiwKKwlMRURfQ1RMX1BPV0VSX09GRiA9IDcKK31MRURfQ1RMX01PREU7CisKK3R5cGVkZWYJZW51bSBfUlRfUkZfUE9XRVJfU1RBVEUKK3sKKwllUmZPbiwKKwllUmZTbGVlcCwKKwllUmZPZmYKK31SVF9SRl9QT1dFUl9TVEFURTsKKworZW51bQlfUmVhc29uQ29kZXsKKwl1bnNwZWNfcmVhc29uCT0gMHgxLAorCWF1dGhfbm90X3ZhbGlkCT0gMHgyLAorCWRlYXV0aF9sdl9zcwk9IDB4MywKKwlpbmFjdGl2aXR5CQk9IDB4NCwKKwlhcF9vdmVybG9hZAkJPSAweDUsCisJY2xhc3MyX2VycgkJPSAweDYsCisJY2xhc3MzX2VycgkJPSAweDcsCisJZGlzYXNfbHZfc3MJCT0gMHg4LAorCWFzb2Nfbm90X2F1dGgJPSAweDksCisKKwkvLy0tLS1NSUNfQ0hFQ0sKKwltaWNfZmFpbHVyZQkJPSAweGUsCisJLy8tLS0tRU5EIE1JQ19DSEVDSworCisJLy8gUmVhc29uIGNvZGUgZGVmaW5lZCBpbiA4MDIuMTFpIEQxMC4wIHAuMjguCisJaW52YWxpZF9JRQkJPSAweDBkLAorCWZvdXJfd2F5X3Rtb3V0CT0gMHgwZiwKKwl0d29fd2F5X3Rtb3V0CT0gMHgxMCwKKwlJRV9kaXNtYXRjaAkJPSAweDExLAorCWludmFsaWRfR2NpcGhlcgk9IDB4MTIsCisJaW52YWxpZF9QY2lwaGVyCT0gMHgxMywKKwlpbnZhbGlkX0FLTVAJPSAweDE0LAorCXVuc3VwX1JTTklFdmVyID0gMHgxNSwKKwlpbnZhbGlkX1JTTklFCT0gMHgxNiwKKwlhdXRoXzgwMl8xeF9mYWlsPSAweDE3LAorCWNpcGVyX3JlamVjdAkJPSAweDE4LAorCisJLy8gUmVhc29uIGNvZGUgZGVmaW5lZCBpbiA3LjMuMS43LCA4MDIuMWUgRDEzLjAsIHAuNDIuIEFkZGVkIGJ5IEFubmllLCAyMDA1LTExLTE1LgorCVFvU191bnNwZWMJCT0gMHgyMCwJLy8gMzIKKwlRQVBfYmFuZHdpZHRoCT0gMHgyMSwJLy8gMzMKKwlwb29yX2NvbmRpdGlvbgk9IDB4MjIsCS8vIDM0CisJbm9fZmFjaWxpdHkJCT0gMHgyMywJLy8gMzUKKwkJCQkJCQkvLyBXaGVyZSBpcyAzNj8/PworCXJlcV9kZWNsaW5lZAk9IDB4MjUsCS8vIDM3CisJaW52YWxpZF9wYXJhbQk9IDB4MjYsCS8vIDM4CisJcmVxX25vdF9ob25vcmVkPSAweDI3LAkvLyAzOQorCVRTX25vdF9jcmVhdGVkCT0gMHgyRiwJLy8gNDcKKwlETF9ub3RfYWxsb3dlZAk9IDB4MzAsCS8vIDQ4CisJZGVzdF9ub3RfZXhpc3QJPSAweDMxLAkvLyA0OQorCWRlc3Rfbm90X1FTVEEJPSAweDMyLAkvLyA1MAorfTsKK3R5cGVkZWYJZW51bSBfUlRfUFNfTU9ERQoreworCWVBY3RpdmUsCS8vIEFjdGl2ZS9Db250aW51b3VzIGFjY2Vzcy4KKwllTWF4UHMsCQkvLyBNYXggcG93ZXIgc2F2ZSBtb2RlLgorCWVGYXN0UHMJCS8vIEZhc3QgcG93ZXIgc2F2ZSBtb2RlLgorfVJUX1BTX01PREU7CisvL2J5IGFteSBmb3IgcG93ZXIgc2F2ZQordHlwZWRlZiBzdHJ1Y3QgcjgxODBfcHJpdgoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCisJc2hvcnQgZXByb210eXBlOworCWludCBpcnE7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWU4MDIxMTsKKworICAgICAgICBzaG9ydCBjYXJkXzgxODU7IC8qIE86IHJ0bDgxODAsIDE6cnRsODE4NSBWIEIvQywgMjpydGw4MTg1IFYgRCwgMzpydGw4MTg1QiAqLworCXNob3J0IGNhcmRfODE4NV9CdmVyc2lvbjsgLyogaWYgVENSIHJlcG9ydHMgY2FyZCBWIEIvQyB0aGlzIGRpc2NyaW1pbmF0ZXMgKi8KKwlzaG9ydCBwaHlfdmVyOyAvKiBtZWFuaW5nZnVsIGZvciBydGw4MjI1IDE6QSAyOkIgMzpDICovCisJc2hvcnQgZW5hYmxlX2dwaW8wOworCWVudW0gY2FyZF90eXBlIHtQQ0ksTUlOSVBDSSxDQVJEQlVTLFVTQi8qcnRsODE4NyovfWNhcmRfdHlwZTsKKwlzaG9ydCBod19wbGNwX2xlbjsKKwlzaG9ydCBwbGNwX3ByZWFtYmxlX21vZGU7IC8vIDA6YXV0byAxOnNob3J0IDI6bG9uZworCisJc3BpbmxvY2tfdCBpcnFfbG9jazsKKwlzcGlubG9ja190IGlycV90aF9sb2NrOworCXNwaW5sb2NrX3QgdHhfbG9jazsKKwlzcGlubG9ja190IHBzX2xvY2s7CisJc3BpbmxvY2tfdCByZl9wc19sb2NrOworCisJdTE2IGlycV9tYXNrOworCXNob3J0IGlycV9lbmFibGVkOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc2hvcnQgY2hhbjsKKwlzaG9ydCBzZW5zOworCXNob3J0IG1heF9zZW5zOworCXU4IGNodHhwd3JbMTVdOyAvL2NoYW5uZWxzIGZyb20gMSB0byAxNCwgMCBub3QgdXNlZAorCXU4IGNodHhwd3Jfb2ZkbVsxNV07IC8vY2hhbm5lbHMgZnJvbSAxIHRvIDE0LCAwIG5vdCB1c2VkCisJLy91OCBjaGFsbG93WzE1XTsgLy9jaGFubmVscyBmcm9tIDEgdG8gMTQsIDAgbm90IHVzZWQKKwl1OCBjaGFubmVsX3BsYW47ICAvLyBpdCdzIHRoZSBjaGFubmVsIHBsYW4gaW5kZXgKKwlzaG9ydCB1cDsKKwlzaG9ydCBjcmNtb247IC8vaWYgMSBhbGxvdyBiYWQgY3JjIGZyYW1lIHJlY2VwdGlvbiBpbiBtb25pdG9yIG1vZGUKKwlzaG9ydCBwcmlzbV9oZHI7CisKKwlzdHJ1Y3QgdGltZXJfbGlzdCBzY2FuX3RpbWVyOworCS8qc2hvcnQgc2NhbnBlbmRpbmc7CisJc2hvcnQgc3RvcHNjYW47Ki8KKwlzcGlubG9ja190IHNjYW5fbG9jazsKKwl1OCBhY3RpdmVfcHJvYmU7CisJLy91OCBhY3RpdmVfc2Nhbl9udW07CisJc3RydWN0IHNlbWFwaG9yZSB3eF9zZW07CisJc3RydWN0IHNlbWFwaG9yZSByZl9zdGF0ZTsKKwlzaG9ydCBod193ZXA7CisKKwlzaG9ydCBkaWdwaHk7CisJc2hvcnQgYW50YjsKKwlzaG9ydCBkaXZlcnNpdHk7CisJdTggY3NfdHJlc2hvbGQ7CisJc2hvcnQgcmNyX2NzZW5zZTsKKwlzaG9ydCByZl9jaGlwOworCXUzMiBrZXkwWzRdOworCXNob3J0ICgqcmZfc2V0X3NlbnMpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsc2hvcnQgc2Vucyk7CisJdm9pZCAoKnJmX3NldF9jaGFuKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHNob3J0IGNoKTsKKwl2b2lkICgqcmZfY2xvc2UpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCpyZl9pbml0KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqcmZfc2xlZXApKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCpyZl93YWtldXApKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCS8vc2hvcnQgcmF0ZTsKKwlzaG9ydCBwcm9taXNjOworCS8qc3RhdHMqLworCXN0cnVjdCBTdGF0cyBzdGF0czsKKwlzdHJ1Y3QgX2xpbmtfZGV0ZWN0X3QgbGlua19kZXRlY3Q7ICAvL1lKLGFkZCwwODA4MjgKKwlzdHJ1Y3QgaXdfc3RhdGlzdGljcyB3c3RhdHM7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkaXJfZGV2OworCisJLypSWCBzdHVmZiovCisJdTMyICpyeHJpbmc7CisJdTMyICpyeHJpbmd0YWlsOworCWRtYV9hZGRyX3QgcnhyaW5nZG1hOworCXN0cnVjdCBidWZmZXIgKnJ4YnVmZmVyOworCXN0cnVjdCBidWZmZXIgKnJ4YnVmZmVyaGVhZDsKKwlpbnQgcnhyaW5nY291bnQ7CisJdTE2IHJ4YnVmZmVyc2l6ZTsKKworCXN0cnVjdCBza19idWZmICpyeF9za2I7CisKKwlzaG9ydCByeF9za2JfY29tcGxldGU7CisKKwl1MzIgcnhfcHJldmxlbjsKKworCS8qVFggc3R1ZmYqLworLyoKKwl1MzIgKnR4bHByaW5nOworCXUzMiAqdHhocHJpbmc7CisJdTMyICp0eG5wcmluZzsKKwlkbWFfYWRkcl90IHR4bHByaW5nZG1hOworCWRtYV9hZGRyX3QgdHhocHJpbmdkbWE7CisJZG1hX2FkZHJfdCB0eG5wcmluZ2RtYTsKKwl1MzIgKnR4bHByaW5ndGFpbDsKKwl1MzIgKnR4aHByaW5ndGFpbDsKKwl1MzIgKnR4bnByaW5ndGFpbDsKKwl1MzIgKnR4bHByaW5naGVhZDsKKwl1MzIgKnR4aHByaW5naGVhZDsKKwl1MzIgKnR4bnByaW5naGVhZDsKKwlzdHJ1Y3QgYnVmZmVyICp0eGxwYnVmczsKKwlzdHJ1Y3QgYnVmZmVyICp0eGhwYnVmczsKKwlzdHJ1Y3QgYnVmZmVyICp0eG5wYnVmczsKKwlzdHJ1Y3QgYnVmZmVyICp0eGxwYnVmc3RhaWw7CisJc3RydWN0IGJ1ZmZlciAqdHhocGJ1ZnN0YWlsOworCXN0cnVjdCBidWZmZXIgKnR4bnBidWZzdGFpbDsKKyovCisJdTMyICp0eG1hcHJpbmc7CisJdTMyICp0eGJrcHJpbmc7CisJdTMyICp0eGJlcHJpbmc7CisJdTMyICp0eHZpcHJpbmc7CisJdTMyICp0eHZvcHJpbmc7CisJdTMyICp0eGhwcmluZzsKKwlkbWFfYWRkcl90IHR4bWFwcmluZ2RtYTsKKwlkbWFfYWRkcl90IHR4YmtwcmluZ2RtYTsKKwlkbWFfYWRkcl90IHR4YmVwcmluZ2RtYTsKKwlkbWFfYWRkcl90IHR4dmlwcmluZ2RtYTsKKwlkbWFfYWRkcl90IHR4dm9wcmluZ2RtYTsKKwlkbWFfYWRkcl90IHR4aHByaW5nZG1hOworCXUzMiAqdHhtYXByaW5ndGFpbDsKKwl1MzIgKnR4YmtwcmluZ3RhaWw7CisJdTMyICp0eGJlcHJpbmd0YWlsOworCXUzMiAqdHh2aXByaW5ndGFpbDsKKwl1MzIgKnR4dm9wcmluZ3RhaWw7CisJdTMyICp0eGhwcmluZ3RhaWw7CisJdTMyICp0eG1hcHJpbmdoZWFkOworCXUzMiAqdHhia3ByaW5naGVhZDsKKwl1MzIgKnR4YmVwcmluZ2hlYWQ7CisJdTMyICp0eHZpcHJpbmdoZWFkOworCXUzMiAqdHh2b3ByaW5naGVhZDsKKwl1MzIgKnR4aHByaW5naGVhZDsKKwlzdHJ1Y3QgYnVmZmVyICp0eG1hcGJ1ZnM7CisJc3RydWN0IGJ1ZmZlciAqdHhia3BidWZzOworCXN0cnVjdCBidWZmZXIgKnR4YmVwYnVmczsKKwlzdHJ1Y3QgYnVmZmVyICp0eHZpcGJ1ZnM7CisJc3RydWN0IGJ1ZmZlciAqdHh2b3BidWZzOworCXN0cnVjdCBidWZmZXIgKnR4aHBidWZzOworCXN0cnVjdCBidWZmZXIgKnR4bWFwYnVmc3RhaWw7CisJc3RydWN0IGJ1ZmZlciAqdHhia3BidWZzdGFpbDsKKwlzdHJ1Y3QgYnVmZmVyICp0eGJlcGJ1ZnN0YWlsOworCXN0cnVjdCBidWZmZXIgKnR4dmlwYnVmc3RhaWw7CisJc3RydWN0IGJ1ZmZlciAqdHh2b3BidWZzdGFpbDsKKwlzdHJ1Y3QgYnVmZmVyICp0eGhwYnVmc3RhaWw7CisKKwlpbnQgdHhyaW5nY291bnQ7CisJaW50IHR4YnVmZnNpemU7CisJLy9zdHJ1Y3QgdHhfcGVuZGluZ2J1ZiB0eG5wX3BlbmRpbmc7CisJLy9zdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgaXJxX3R4X3Rhc2tsZXQ7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IGlycV9yeF90YXNrbGV0OworCXU4IGRtYV9wb2xsX21hc2s7CisJLy9zaG9ydCB0eF9zdXNwZW5kOworCisJLyogYWRob2MvbWFzdGVyIG1vZGUgc3R1ZmYgKi8KKwl1MzIgKnR4YmVhY29ucmluZ3RhaWw7CisJZG1hX2FkZHJfdCB0eGJlYWNvbnJpbmdkbWE7CisJdTMyICp0eGJlYWNvbnJpbmc7CisJaW50IHR4YmVhY29uY291bnQ7CisJc3RydWN0IGJ1ZmZlciAqdHhiZWFjb25idWZzOworCXN0cnVjdCBidWZmZXIgKnR4YmVhY29uYnVmc3RhaWw7CisJLy9jaGFyICptYXN0ZXJfZXNzaWQ7CisJLy91MTYgbWFzdGVyX2JlYWNvbmludGVydmFsOworCS8vdTMyIG1hc3Rlcl9iZWFjb25zaXplOworCS8vdTE2IGJlYWNvbl9pbnRlcnZhbDsKKworCXU4IHJldHJ5X2RhdGE7CisJdTggcmV0cnlfcnRzOworCXUxNiBydHM7CisKKy8vYWRkIGZvciBSRiBwb3dlciBvbiBwb3dlciBvZmYgYnkgbGl6aGFvbWluZyAwODA1MTIKKwl1OAkgUmVnVGhyZWVXaXJlTW9kZTsgLy8gU2VlICJUaHJlZSB3aXJlIG1vZGUiIGRlZmluZWQgYWJvdmUsIDIwMDYuMDUuMzEsIGJ5IHJjbmprby4KKworLy9ieSBhbXkgZm9yIGxlZAorCUxFRF9TVFJBVEVHWV84MTg1IExlZFN0cmF0ZWd5OworLy9ieSBhbXkgZm9yIGxlZAorCisvL2J5IGFteSBmb3IgcG93ZXIgc2F2ZQorCXN0cnVjdCB0aW1lcl9saXN0IHdhdGNoX2RvZ190aW1lcjsKKwlib29sIGJJbmFjdGl2ZVBzOworCWJvb2wgYlN3UmZQcm9jZXNzaW5nOworCVJUX1JGX1BPV0VSX1NUQVRFCWVJbmFjdGl2ZVBvd2VyU3RhdGU7CisJUlRfUkZfUE9XRVJfU1RBVEUgZVJGUG93ZXJTdGF0ZTsKKwl1MzIgUmZPZmZSZWFzb247CisJYm9vbCBSRkNoYW5nZUluUHJvZ3Jlc3M7CisJYm9vbCBiSW5IY3RUZXN0OworCWJvb2wgU2V0UkZQb3dlclN0YXRlSW5Qcm9ncmVzczsKKwl1OCAgIFJGUHJvZ1R5cGU7CisJYm9vbCBiTGVpc3VyZVBzOworCVJUX1BTX01PREUgZG90MTFQb3dlclNhdmVNb2RlOworCS8vdTMyIE51bVJ4T2tJblBlcmlvZDsgICAvL1lKLGRlbCwwODA4MjgKKwkvL3UzMiBOdW1UeE9rSW5QZXJpb2Q7ICAgLy9ZSixkZWwsMDgwODI4CisJdTggICBUeFBvbGxpbmdUaW1lczsKKworCWJvb2wJYkFwQnVmT3VyRnJhbWU7Ly8gVFJVRSBpZiBBUCBidWZmZXIgb3VyIHVuaWNhc3QgZGF0YSAsIHdlIHdpbGwga2VlcCBlQXdha2UgdW50aWxsIHJlY2VpdmUgZGF0YSBvciB0aW1lb3V0LgorCXU4CVdhaXRCdWZEYXRhQmNuQ291bnQ7CisJdTgJV2FpdEJ1ZkRhdGFUaW1lT3V0OworCisvL2J5IGFteSBmb3IgcG93ZXIgc2F2ZQorLy9ieSBhbXkgZm9yIGFudGVubmEKKwl1OCBFRVBST01Td0FudGVubmFEaXZlcnNpdHk7CisJYm9vbCBFRVBST01EZWZhdWx0QW50ZW5uYTE7CisJdTggUmVnU3dBbnRlbm5hRGl2ZXJzaXR5TWVjaGFuaXNtOworCWJvb2wgYlN3QW50ZW5uYURpdmVyaXR5OworCXU4IFJlZ0RlZmF1bHRBbnRlbm5hOworCWJvb2wgYkRlZmF1bHRBbnRlbm5hMTsKKwl1OCBTaWduYWxTdHJlbmd0aDsKKwlsb25nIFN0YXRzX1NpZ25hbFN0cmVuZ3RoOworCWxvbmcgTGFzdFNpZ25hbFN0cmVuZ3RoSW5QZXJjZW50OyAvLyBJbiBwZXJjZW50YW5nZSwgdXNlZCBmb3Igc21vb3RoaW5nLCBlLmcuIE1vdmluZyBBdmVyYWdlLgorCXU4CSBTaWduYWxRdWFsaXR5OyAvLyBpbiAwLTEwMCBpbmRleC4KKwlsb25nIFN0YXRzX1NpZ25hbFF1YWxpdHk7CisJbG9uZyBSZWN2U2lnbmFsUG93ZXI7IC8vIGluIGRCbS4KKwlsb25nIFN0YXRzX1JlY3ZTaWduYWxQb3dlcjsKKwl1OAkgTGFzdFJ4UGt0QW50ZW5uYTsJLy8gK2J5IGFteSAwODAzMTIgQW50ZW5uIHdoaWNoIHJlY2VpdmVkIHRoZSBsYXN0ZWQgcGFja2V0LiAwOiBBdXgsIDE6TWFpbi4gQWRkZWQgYnkgUm9nZXIsIDIwMDguMDEuMjUuCisJdTMyIEFkUnhPa0NudDsKKwlsb25nIEFkUnhTaWduYWxTdHJlbmd0aDsKKwl1OCBDdXJyQW50ZW5uYUluZGV4OwkJCS8vIEluZGV4IHRvIGN1cnJlbnQgQW50ZW5uYSAoYm90aCBUeCBhbmQgUngpLgorCXU4IEFkVGlja0NvdW50OwkJCQkvLyBUaW1lcyBvZiBTd0FudGVubmFEaXZlcnNpdHlUaW1lciBoYXBwZW5lZC4KKwl1OCBBZENoZWNrUGVyaW9kOwkJCQkvLyAjIG9mIHBlcmlvZCBTd0FudGVubmFEaXZlcnNpdHlUaW1lciB0byBjaGVjayBSeCBzaWduYWwgc3RyZW5ndGggZm9yIFNXIEFudGVubmEgRGl2ZXJzaXR5LgorCXU4IEFkTWluQ2hlY2tQZXJpb2Q7CQkJLy8gTWluIHZhbHVlIG9mIEFkQ2hlY2tQZXJpb2QuCisJdTggQWRNYXhDaGVja1BlcmlvZDsJCQkvLyBNYXggdmFsdWUgb2YgQWRDaGVja1BlcmlvZC4KKwlsb25nIEFkUnhTc1RocmVzaG9sZDsJCQkvLyBTaWduYWwgc3RyZW5ndGggdGhyZXNob2xkIHRvIHN3aXRjaCBhbnRlbm5hLgorCWxvbmcgQWRNYXhSeFNzVGhyZXNob2xkOwkJCS8vIE1heCB2YWx1ZSBvZiBBZFJ4U3NUaHJlc2hvbGQuCisJYm9vbCBiQWRTd2l0Y2hlZENoZWNraW5nOwkJLy8gVFJVRSBpZiB3ZSBzaGFsbCBzaGFsbCBjaGVjayBSeCBzaWduYWwgc3RyZW5ndGggZm9yIGxhc3QgdGltZSBzd2l0Y2hpbmcgYW50ZW5uYS4KKwlsb25nIEFkUnhTc0JlZm9yZVN3aXRjaGVkOwkJLy8gUnggc2lnbmFsIHN0cmVuZ3RoIGJlZm9yZSB3ZSBzd2l0aGVkIGFudGVubmEuCisJc3RydWN0IHRpbWVyX2xpc3QgU3dBbnRlbm5hRGl2ZXJzaXR5VGltZXI7CisvL2J5IGFteSBmb3IgYW50ZW5uYQorLy97YnkgYW15IDA4MDMxMgorLy8KKwkvLyBDcnlzdGFsIGNhbGlicmF0aW9uLgorCS8vIEFkZGVkIGJ5IFJvZ2VyLCAyMDA3LjEyLjExLgorCS8vCisJYm9vbAkJYlh0YWxDYWxpYnJhdGlvbjsgLy8gQ3J5c3RhbCBjYWxpYnJhdGlvbi4KKwl1OAkJCVh0YWxDYWxfWGluOyAvLyBDcnlzdGFsIGNhbGlicmF0aW9uIGZvciBYaW4uIDB+Ny41cEYKKwl1OAkJCVh0YWxDYWxfWG91dDsgLy8gQ3J5c3RhbCBjYWxpYnJhdGlvbiBmb3IgWG91dC4gMH43LjVwRgorCS8vCisJLy8gVHggcG93ZXIgdHJhY2tpbmcgd2l0aCB0aGVybWFsIG1ldGVyIGluZGljYXRpb24uCisJLy8gQWRkZWQgYnkgUm9nZXIsIDIwMDcuMTIuMTEuCisJLy8KKwlib29sCQliVHhQb3dlclRyYWNrOyAvLyBUeCBQb3dlciB0cmFja2luZy4KKwl1OAkJCVRoZXJtYWxNZXRlcjsgLy8gVGhlcm1hbCBtZXRlciByZWZlcmVuY2UgaW5kaWNhdGlvbi4KKwkvLworCS8vIER5bmFtaWMgSW5pdGlhbCBHYWluIEFkanVzdG1lbnQgTWVjaGFuaXNtLiBBZGRlZCBieSBCcnVjZSwgMjAwNy0wMi0xNC4KKwkvLworCWJvb2wJCQkJYkRpZ01lY2hhbmlzbTsgLy8gVFJVRSBpZiBESUcgaXMgZW5hYmxlZCwgRkFMU0Ugb3cuCisJYm9vbAkJCQliUmVnSGlnaFBvd2VyTWVjaGFuaXNtOyAvLyBGb3IgSGlnaCBQb3dlciBNZWNoYW5pc20uIDA2MTAxMCwgYnkgcmNuamtvLgorCXUzMgkJCQkJRmFsc2VBbGFybVJlZ1ZhbHVlOworCXU4CQkJCQlSZWdEaWdPZmRtRmFVcFRoOyAvLyBVcHBlciB0aHJlaG9sZCBvZiBPRkRNIGZhbHNlIGFsYXJtLCB3aGljaCBpcyB1c2VkIGluIERJRy4KKwl1OAkJCQkJRElHX051bWJlckZhbGxiYWNrVm90ZTsKKwl1OAkJCQkJRElHX051bWJlclVwZ3JhZGVWb3RlOworCS8vIEZvciBIVyBhbnRlbm5hIGRpdmVyc2l0eSwgYWRkZWQgYnkgUm9nZXIsIDIwMDguMDEuMzAuCisJdTMyCQkJQWRNYWluQW50ZW5uYVJ4T2tDbnQ7CQkvLyBNYWluIGFudGVubmEgUnggT0sgY291bnQuCisJdTMyCQkJQWRBdXhBbnRlbm5hUnhPa0NudDsJCS8vIEF1eCBhbnRlbm5hIFJ4IE9LIGNvdW50LgorCWJvb2wJCWJIV0FkU3dpdGNoZWQ7CQkJCS8vIFRSVUUgaWYgd2UgaGFzIHN3aXRjaGVkIGRlZmF1bHQgYW50ZW5uYSBieSBIVyBldmFsdWF0aW9uLgorCS8vIFJGIEhpZ2ggUG93ZXIgdXBwZXIvbG93ZXIgdGhyZXNob2xkLgorCXU4CQkJCQlSZWdIaVB3clVwcGVyVGg7CisJdTgJCQkJCVJlZ0hpUHdyTG93ZXJUaDsKKwkvLyBSRiBSU1NJIEhpZ2ggUG93ZXIgdXBwZXIvbG93ZXIgVGhyZXNob2xkLgorCXU4CQkJCQlSZWdSU1NJSGlQd3JVcHBlclRoOworCXU4CQkJCQlSZWdSU1NJSGlQd3JMb3dlclRoOworCS8vIEN1cnJlbnQgQ0NLIFJTU0kgdmFsdWUgdG8gZGV0ZXJtaW5lIENDSyBoaWdoIHBvd2VyLCBhc2tlZCBieSBTRDMgRFosIGJ5IEJydWNlLCAyMDA3LTA0LTEyLgorCXU4CQkJQ3VyQ0NLUlNTSTsKKwlib29sICAgICAgICBiQ3VyQ0NLUGt0OworCS8vCisJLy8gSGlnaCBQb3dlciBNZWNoYW5pc20uIEFkZGVkIGJ5IGFteSwgMDgwMzEyLgorCS8vCisJYm9vbAkJCQkJYlRvVXBkYXRlVHhQd3I7CisJbG9uZwkJCQkJVW5kZWNvcmF0ZWRTbW9vdGhlZFNTOworCWxvbmcJCQkJCVVuZGVyY29yYXRlU21vb3RoZWRSeFBvd2VyOworCXU4CQkJCQkJUlNTSTsKKwljaGFyCQkJCQlSeFBvd2VyOworCSB1OCBJbml0aWFsR2FpbjsKKwkgLy9Gb3IgYWRqdXN0IERpZyBUaHJlc2hob2xkIGR1cmluZyBMZWdhY3kvTGVpc3VyZSBQb3dlciBTYXZlIE1vZGUKKwl1MzIJCQkJRG96ZVBlcmlvZEluUGFzdDJTZWM7CisJIC8vIERvbid0IGFjY2VzcyBCQi9SRiB1bmRlciBkaXNhYmxlIFBMTCBzaXR1YXRpb24uCisJdTgJCQkJCUluaXRpYWxHYWluQmFja1VwOworCSB1OCBSZWdCTW9kZUdhaW5TdGFnZTsKKy8vYnkgYW15IGZvciByYXRlIGFkYXB0aXZlCisgICAgc3RydWN0IHRpbWVyX2xpc3QgcmF0ZWFkYXB0ZXJfdGltZXI7CisJdTMyICAgIFJhdGVBZGFwdGl2ZVBlcmlvZDsKKwlib29sICAgYkVuaGFuY2VUeFB3cjsKKwlib29sICAgYlVwZGF0ZUFSRlI7CisJaW50CSAgIEZvcmNlZERhdGFSYXRlOyAvLyBGb3JjZSBEYXRhIFJhdGUuIDA6IEF1dG8sIDB4MDI6IDFNIH4gMHg2QzogNTRNLikKKwl1MzIgICAgIE51bVR4VW5pY2FzdDsgLy9ZSixhZGQsMDgwODI4LGZvciBrZWVwIGFsaXZlCisJdTggICAgICBrZWVwQWxpdmVMZXZlbDsgLy9ZSixhZGQsMDgwODI4LGZvciBLZWVwQWxpdmUKKwl1bnNpZ25lZCBsb25nIAlOdW1UeE9rVG90YWw7CisJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFzdFJldHJ5Q250OworICAgICAgICB1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFzdFJldHJ5UmF0ZTsKKyAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgICBMYXN0VHhva0NudDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgTGFzdFJ4b2tDbnQ7CisgICAgICAgIHUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJyUmV0cnlDbnQ7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgIExhc3RUeE9LQnl0ZXM7CisJdW5zaWduZWQgbG9uZyAJCSAgICBOdW1UeE9rQnl0ZXNUb3RhbDsKKyAgICAgICAgdTggICAgICAgICAgICAgICAgICAgICAgICAgIExhc3RGYWlsVHhSYXRlOworICAgICAgICBsb25nICAgICAgICAgICAgICAgICAgICAgICAgTGFzdEZhaWxUeFJhdGVTUzsKKyAgICAgICAgdTggICAgICAgICAgICAgICAgICAgICAgICAgIEZhaWxUeFJhdGVDb3VudDsKKyAgICAgICAgdTMyICAgICAgICAgICAgICAgICAgICAgICAgIExhc3RUeFRocm91Z2hwdXQ7CisgICAgICAgIC8vZm9yIHVwIHJhdGUKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgICAgICAgICAgYlRyeXVwaW5nOworICAgICAgICB1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyclR4UmF0ZTsgICAgIC8vdGhlIHJhdGUgYmVmb3JlIHVwCisgICAgICAgIHUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJyUmV0cnlSYXRlOworICAgICAgICB1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ5dXBpbmdDb3VudDsKKyAgICAgICAgdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyeURvd25Db3VudExvd0RhdGE7CisgICAgICAgIHU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcnl1cGluZ0NvdW50Tm9EYXRhOworCisgICAgICAgIHU4ICAgICAgICAgICAgICAgICAgQ3VycmVudE9wZXJhUmF0ZTsKKy8vYnkgYW15IGZvciByYXRlIGFkYXB0aXZlCisvL2J5IGFteSAwODAzMTJ9CisvLwlzaG9ydCB3cV9odXJyeXVwOworLy8Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndvcmtxdWV1ZTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVzZXRfd3E7CisJc3RydWN0IHdvcmtfc3RydWN0IHdhdGNoX2RvZ193cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdHhfaXJxX3dxOworCXNob3J0IGFja190eF90b19pZWVlOworCisJdTggUG93ZXJQcm9maWxlOworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCXUzMiBDU01ldGhvZDsKKwl1OCBjY2tfdHhwd3JfYmFzZTsKKwl1OCBvZmRtX3R4cHdyX2Jhc2U7CisJdTggZG1hX3BvbGxfc3RvcF9tYXNrOworCisJLy91OCBSZWdUaHJlZVdpcmVNb2RlOworCXU4IE1XSUVuYWJsZTsKKwl1MTYgU2hvcnRSZXRyeUxpbWl0OworCXUxNiBMb25nUmV0cnlMaW1pdDsKKwl1MTYgRWFybHlSeFRocmVzaG9sZDsKKwl1MzIgVHJhbnNtaXRDb25maWc7CisJdTMyIFJlY2VpdmVDb25maWc7CisJdTMyIEludHJNYXNrOworCisJc3RydWN0IAlDaG5sQWNjZXNzU2V0dGluZyAgQ2hhbm5lbEFjY2Vzc1NldHRpbmc7CisjZW5kaWYKK31yODE4MF9wcml2OworCisjZGVmaW5lIE1BTkFHRV9QUklPUklUWSAwCisjZGVmaW5lIEJLX1BSSU9SSVRZIDEKKyNkZWZpbmUgQkVfUFJJT1JJVFkgMgorI2RlZmluZSBWSV9QUklPUklUWSAzCisjZGVmaW5lIFZPX1BSSU9SSVRZIDQKKyNkZWZpbmUgSElfUFJJT1JJVFkgNQorI2RlZmluZSBCRUFDT05fUFJJT1JJVFkgNgorCisjZGVmaW5lIExPV19QUklPUklUWSBWSV9QUklPUklUWQorI2RlZmluZSBOT1JNX1BSSU9SSVRZIFZPX1BSSU9SSVRZCisvL0FDMlF1ZXVlIG1hcHBpbmcKKyNkZWZpbmUgQUMyUShfYWMpICgoKF9hYykgPT0gV01FX0FDX1ZPKSA/IFZPX1BSSU9SSVRZIDogXAorCQkoKF9hYykgPT0gV01FX0FDX1ZJKSA/IFZJX1BSSU9SSVRZIDogXAorCQkoKF9hYykgPT0gV01FX0FDX0JLKSA/IEJLX1BSSU9SSVRZIDogXAorCQlCRV9QUklPUklUWSkKKworc2hvcnQgcnRsODE4MF90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHU4KiBza2J1ZiwgaW50IGxlbixpbnQgcHJpb3JpdHksCisJc2hvcnQgbW9yZWZyYWcsc2hvcnQgZnJhZ2Rlc2MsaW50IHJhdGUpOworCit1OCByZWFkX25pY19ieXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4KTsKK3UzMiByZWFkX25pY19kd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCk7Cit1MTYgcmVhZF9uaWNfd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCkgOwordm9pZCB3cml0ZV9uaWNfYnl0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCx1OCB5KTsKK3ZvaWQgd3JpdGVfbmljX3dvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgsdTE2IHkpOwordm9pZCB3cml0ZV9uaWNfZHdvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgsdTMyIHkpOwordm9pZCBmb3JjZV9wY2lfcG9zdGluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwordm9pZCBydGw4MTgwX3J0eF9kaXNhYmxlKHN0cnVjdCBuZXRfZGV2aWNlICopOwordm9pZCBydGw4MTgwX3J4X2VuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3ZvaWQgcnRsODE4MF90eF9lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKik7Cit2b2lkIHJ0bDgxODBfc3RhcnRfc2Nhbm5pbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxODBfc3RhcnRfc2Nhbm5pbmdfcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE4MF9zdG9wX3NjYW5uaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MTgwX2Rpc2Fzc29jaWF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKy8vdm9pZCBmaXhfcnhfZmlmbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE4MF9zZXRfYW5hcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldix1MzIgYSk7Cit2b2lkIHJ0bDgxODVfc2V0X2FuYXBhcmFtMihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHUzMiBhKTsKK3ZvaWQgcnRsODE4MF9zZXRfaHdfd2VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MTgwX25vX2h3X3dlcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE4MF91cGRhdGVfbXNyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworLy92b2lkIHJ0bDgxODBfQlNTX2NyZWF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE4MF9iZWFjb25fdHhfZGlzYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE4MF9iZWFjb25fcnhfZGlzYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE4MF9jb250dHhfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MTgwX2NvbnR0eF9kaXNhYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworaW50IHJ0bDgxODBfZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2ludCBydGw4MTgwX3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MTgwX2NvbW1pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE4MF9zZXRfY2hhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHNob3J0IGNoKTsKK3ZvaWQgcnRsODE4MF9zZXRfbWFzdGVyX2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsY2hhciAqZXNzaWQpOwordm9pZCBydGw4MTgwX3VwZGF0ZV9iZWFjb25fc2VjdXJpdHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHdyaXRlX3BoeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZHIsIHU4IGRhdGEpOwordm9pZCB3cml0ZV9waHlfY2NrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkciwgdTMyIGRhdGEpOwordm9pZCB3cml0ZV9waHlfb2ZkbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZHIsIHUzMiBkYXRhKTsKK3ZvaWQgcnRsODE4NV90eF9hbnRlbm5hKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFudCk7Cit2b2lkIHJ0bDgxODVfcmZfcGluc19lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIElCU1NfcmFuZG9taXplX2NlbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIElQU0VudGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBJUFNMZWF2ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2ludCBnZXRfY3Vycl90eF9mcmVlX2Rlc2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHByaW9yaXR5KTsKK3ZvaWQgVXBkYXRlSW5pdGlhbEdhaW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Citib29sIFNldEFudGVubmFDb25maWc4N1NFKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICBEZWZhdWx0QW50LCBib29sIGJBbnREaXZlcnNpdHkpOworCisvLyNpZmRlZiBDT05GSUdfUlRMODE4NUIKK3ZvaWQgcnRsODE4NWJfYWRhcHRlcl9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE4NWJfcnhfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MTg1Yl90eF9lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxODBfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxODViX2lycV9lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIGZpeF9yeF9maWZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBmaXhfdHhfZmlmbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODIyNXoyX1NldFRYUG93ZXJMZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBjaCk7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49S0VSTkVMX1ZFUlNJT04oMiw2LDIwKQordm9pZCBydGw4MTgwX3JhdGVfYWRhcHRlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKiB3b3JrKTsKKyNlbHNlCit2b2lkIHJ0bDgxODBfcmF0ZV9hZGFwdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2VuZGlmCisvLyNlbmRpZgorYm9vbCBNZ250QWN0U2V0X1JGX1N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIFJUX1JGX1BPV0VSX1NUQVRFIFN0YXRlVG9TZXQsIHUzMiBDaGFuZ2VTb3VyY2UpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfOTNjeDYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfOTNjeDYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTQ3MTFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF85M2N4Ni5jCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICAgVGhpcyBmaWxlcyBjb250YWlucyBjYXJkIGVlcHJvbSAoOTNjNDYgb3IgOTNjNTYpIHByb2dyYW1taW5nIHJvdXRpbmVzLAorICAgbWVtb3J5IGlzIGFkZHJlc3NlZCBieSAxNiBiaXRzIHdvcmRzLgorCisgICBUaGlzIGlzIHBhcnQgb2YgcnRsODE4MCBPcGVuU291cmNlIGRyaXZlci4KKyAgIENvcHlyaWdodCAoQykgQW5kcmVhIE1lcmVsbG8gMjAwNCAgPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorICAgUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdQTCAoR2VuZXJhbCBQdWJsaWMgTGljZW5jZSkKKworICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBHUEwgcGFydCBvZiB0aGUKKyAgIG9mZmljaWFsIHJlYWx0ZWsgZHJpdmVyLgorCisgICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIHJ0bDgxODAgZHJpdmVyIHNrZWxldG9uCisgICBmcm9tIFBhdHJpYyBTY2hlbmtlICYgQW5kcmVzIFNhbG9tb24uCisKKyAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgSW50ZWwgUHJvIFdpcmVsZXNzIDIxMDAgR1BMIGRyaXZlci4KKworICAgV2Ugd2FudCB0byB0YW5rcyB0aGUgQXV0aG9ycyBvZiB0aG9zZSBwcm9qZWN0cyBhbmQgdGhlIE5kaXN3cmFwcGVyCisgICBwcm9qZWN0IEF1dGhvcnMuCisqLworCisjaW5jbHVkZSAicjgxODBfOTNjeDYuaCIKKwordm9pZCBlcHJvbV9jcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBiaXQpCit7CisJaWYoYml0KQorCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEVQUk9NX0NNRCwKKwkJCSAgICAgICAoMTw8RVBST01fQ1NfU0hJRlQpIHwgXAorCQkJICAgICAgIHJlYWRfbmljX2J5dGUoZGV2LCBFUFJPTV9DTUQpKTsgLy9lbmFibGUgRVBST00KKwllbHNlCisJCXdyaXRlX25pY19ieXRlKGRldiwgRVBST01fQ01ELCByZWFkX25pY19ieXRlKGRldiwgRVBST01fQ01EKVwKKwkJCSAgICAgICAmfigxPDxFUFJPTV9DU19TSElGVCkpOyAvL2Rpc2FibGUgRVBST00KKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJdWRlbGF5KEVQUk9NX0RFTEFZKTsKK30KKworCit2b2lkIGVwcm9tX2NrX2N5Y2xlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBFUFJPTV9DTUQsCisJCSAgICAgICAoMTw8RVBST01fQ0tfU0hJRlQpIHwgcmVhZF9uaWNfYnl0ZShkZXYsRVBST01fQ01EKSk7CisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwl1ZGVsYXkoRVBST01fREVMQVkpOworCXdyaXRlX25pY19ieXRlKGRldiwgRVBST01fQ01ELAorCQkgICAgICAgcmVhZF9uaWNfYnl0ZShkZXYsIEVQUk9NX0NNRCkgJn4gKDE8PEVQUk9NX0NLX1NISUZUKSk7CisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwl1ZGVsYXkoRVBST01fREVMQVkpOworfQorCisKK3ZvaWQgZXByb21fdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHNob3J0IGJpdCkKK3sKKwlpZihiaXQpCisJCXdyaXRlX25pY19ieXRlKGRldiwgRVBST01fQ01ELCAoMTw8RVBST01fV19TSElGVCkgfCBcCisJCQkgICAgICAgcmVhZF9uaWNfYnl0ZShkZXYsRVBST01fQ01EKSk7CisJZWxzZQorCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEVQUk9NX0NNRCwgcmVhZF9uaWNfYnl0ZShkZXYsRVBST01fQ01EKVwKKwkJCSAgICAgICAmfigxPDxFUFJPTV9XX1NISUZUKSk7CisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCXVkZWxheShFUFJPTV9ERUxBWSk7Cit9CisKKworc2hvcnQgZXByb21fcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXNob3J0IGJpdDsKKworCWJpdD0ocmVhZF9uaWNfYnl0ZShkZXYsIEVQUk9NX0NNRCkgJiAoMTw8RVBST01fUl9TSElGVCkgKTsKKwl1ZGVsYXkoRVBST01fREVMQVkpOworCisJaWYoYml0KSByZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIGVwcm9tX3NlbmRfYml0c19zdHJpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgYltdLCBpbnQgbGVuKQoreworCWludCBpOworCisJZm9yKGk9MDsgaTxsZW47IGkrKyl7CisJCWVwcm9tX3coZGV2LCBiW2ldKTsKKwkJZXByb21fY2tfY3ljbGUoZGV2KTsKKwl9Cit9CisKKwordTMyIGVwcm9tX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGFkZHIpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXNob3J0IHJlYWRfY21kW109ezEsMSwwfTsKKwlzaG9ydCBhZGRyX3N0cls4XTsKKwlpbnQgaTsKKwlpbnQgYWRkcl9sZW47CisJdTMyIHJldDsKKworCXJldD0wOworICAgICAgICAvL2VuYWJsZSBFUFJPTSBwcm9ncmFtbWluZworCXdyaXRlX25pY19ieXRlKGRldiwgRVBST01fQ01ELAorCQkgICAgICAgKEVQUk9NX0NNRF9QUk9HUkFNPDxFUFJPTV9DTURfT1BFUkFUSU5HX01PREVfU0hJRlQpKTsKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCXVkZWxheShFUFJPTV9ERUxBWSk7CisKKwlpZiAocHJpdi0+ZXByb210eXBlPT1FUFJPTV85M2M1Nil7CisJCWFkZHJfc3RyWzddPWFkZHIgJiAxOworCQlhZGRyX3N0cls2XT1hZGRyICYgKDE8PDEpOworCQlhZGRyX3N0cls1XT1hZGRyICYgKDE8PDIpOworCQlhZGRyX3N0cls0XT1hZGRyICYgKDE8PDMpOworCQlhZGRyX3N0clszXT1hZGRyICYgKDE8PDQpOworCQlhZGRyX3N0clsyXT1hZGRyICYgKDE8PDUpOworCQlhZGRyX3N0clsxXT1hZGRyICYgKDE8PDYpOworCQlhZGRyX3N0clswXT1hZGRyICYgKDE8PDcpOworCQlhZGRyX2xlbj04OworCX1lbHNleworCQlhZGRyX3N0cls1XT1hZGRyICYgMTsKKwkJYWRkcl9zdHJbNF09YWRkciAmICgxPDwxKTsKKwkJYWRkcl9zdHJbM109YWRkciAmICgxPDwyKTsKKwkJYWRkcl9zdHJbMl09YWRkciAmICgxPDwzKTsKKwkJYWRkcl9zdHJbMV09YWRkciAmICgxPDw0KTsKKwkJYWRkcl9zdHJbMF09YWRkciAmICgxPDw1KTsKKwkJYWRkcl9sZW49NjsKKwl9CisJZXByb21fY3MoZGV2LCAxKTsKKwllcHJvbV9ja19jeWNsZShkZXYpOworCWVwcm9tX3NlbmRfYml0c19zdHJpbmcoZGV2LCByZWFkX2NtZCwgMyk7CisJZXByb21fc2VuZF9iaXRzX3N0cmluZyhkZXYsIGFkZHJfc3RyLCBhZGRyX2xlbik7CisKKwkvL2tlZXAgY2hpcCBwaW4gRCB0byBsb3cgc3RhdGUgd2hpbGUgcmVhZGluZy4KKwkvL0knbSB1bnN1cmUgaWYgaXQgaXMgbmVjZXNzYXJ5LCBidXQgYW55d2F5IHNob3VsZG4ndCBodXJ0CisJZXByb21fdyhkZXYsIDApOworCisJZm9yKGk9MDtpPDE2O2krKyl7CisJCS8vZWVwcm9tIG5lZWRzIGEgY2xrIGN5Y2xlIGJldHdlZW4gd3JpdGluZyBvcGNvZGUmYWRyCisJCS8vYW5kIHJlYWRpbmcgZGF0YS4gKGVlcHJvbSBvdXRzIGEgZHVtbXkgMCkKKwkJZXByb21fY2tfY3ljbGUoZGV2KTsKKwkJcmV0IHw9IChlcHJvbV9yKGRldik8PCgxNS1pKSk7CisJfQorCisJZXByb21fY3MoZGV2LCAwKTsKKwllcHJvbV9ja19jeWNsZShkZXYpOworCisJLy9kaXNhYmxlIEVQUk9NIHByb2dyYW1taW5nCisJd3JpdGVfbmljX2J5dGUoZGV2LCBFUFJPTV9DTUQsCisJCSAgICAgICAoRVBST01fQ01EX05PUk1BTDw8RVBST01fQ01EX09QRVJBVElOR19NT0RFX1NISUZUKSk7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfOTNjeDYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfOTNjeDYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDI4YTUxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF85M2N4Ni5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisJVGhpcyBpcyBwYXJ0IG9mIHJ0bDgxODAgT3BlblNvdXJjZSBkcml2ZXIKKwlDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQtMjAwNSAgPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorCVJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCisKKwlQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEdQTCBwYXJ0IG9mIHRoZSBvZmZpY2lhbCByZWFsdGVrIGRyaXZlcgorCVBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgcnRsODE4MCBkcml2ZXIgc2tlbGV0b24gZnJvbSBQYXRyaWMgU2NoZW5rZSAmIEFuZHJlcyBTYWxvbW9uCisJUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBJbnRlbCBQcm8gV2lyZWxlc3MgMjEwMCBHUEwgZHJpdmVyCisKKwlXZSB3YW50IHRvIHRhbmtzIHRoZSBBdXRob3JzIG9mIHN1Y2ggcHJvamVjdHMgYW5kIHRoZSBOZGlzd3JhcHBlciBwcm9qZWN0IEF1dGhvcnMuCisqLworCisvKlRoaXMgZmlsZXMgY29udGFpbnMgY2FyZCBlZXByb20gKDkzYzQ2IG9yIDkzYzU2KSBwcm9ncmFtbWluZyByb3V0aW5lcyovCisvKm1lbW9yeSBpcyBhZGRyZXNzZWQgYnkgV09SRFMqLworCisjaW5jbHVkZSAicjgxODAuaCIKKyNpbmNsdWRlICJyODE4MF9ody5oIgorCisjZGVmaW5lIEVQUk9NX0RFTEFZIDEwCisKKyNkZWZpbmUgRVBST01fQU5BUEFSQU1fQUREUkxXT1JEIDB4ZAorI2RlZmluZSBFUFJPTV9BTkFQQVJBTV9BRERSSFdPUkQgMHhlCisKKyNkZWZpbmUgUkZDSElQSUQgMHg2CisjZGVmaW5lCVJGQ0hJUElEX0lOVEVSU0lMIDEKKyNkZWZpbmUJUkZDSElQSURfUkZNRCAyCisjZGVmaW5lCVJGQ0hJUElEX1BISUxJUFMgMworI2RlZmluZQlSRkNISVBJRF9NQVhJTSA0CisjZGVmaW5lCVJGQ0hJUElEX0dDVCA1CisjZGVmaW5lIFJGQ0hJUElEX1JUTDgyMjUgOQorI2lmZGVmIENPTkZJR19SVEw4MTg1QgorI2RlZmluZSBSRl9aRUJSQTIgMTEKKyNkZWZpbmUgRVBST01fVFhQV19CQVNFIDB4MDUKKyNkZWZpbmUgUkZfWkVCUkE0IDEyCisjZW5kaWYKKyNkZWZpbmUgUkZDSElQSURfUlRMODI1NSAweGEKKyNkZWZpbmUgUkZfUEFSQU0gMHgxOQorI2RlZmluZSBSRl9QQVJBTV9ESUdQSFlfU0hJRlQgMAorI2RlZmluZSBSRl9QQVJBTV9BTlRCREVGQVVMVF9TSElGVCAxCisjZGVmaW5lIFJGX1BBUkFNX0NBUlJJRVJTRU5TRV9TSElGVCAyCisjZGVmaW5lIFJGX1BBUkFNX0NBUlJJRVJTRU5TRV9NQVNLICgzPDwyKQorI2RlZmluZSBFTkVSR1lfVFJFU0hPTEQgMHgxNworI2RlZmluZSBFUFJPTV9WRVJTSU9OIDB4MUUKKyNkZWZpbmUgTUFDX0FEUiAweDcKKworI2RlZmluZSBDSVMgMHgxOAorCisjZGVmaW5lCUVQUk9NX1RYUFdfT0ZETV9DSDFfMiAweDIwCisKKy8vI2RlZmluZQlFUFJPTV9UWFBXX0NIMV8yIDB4MTAKKyNkZWZpbmUgIEVQUk9NX1RYUFdfQ0gxXzIgMHgzMAorI2RlZmluZQlFUFJPTV9UWFBXX0NIM180IDB4MTEKKyNkZWZpbmUJRVBST01fVFhQV19DSDVfNiAweDEyCisjZGVmaW5lCUVQUk9NX1RYUFdfQ0g3XzggMHgxMworI2RlZmluZQlFUFJPTV9UWFBXX0NIOV8xMCAweDE0CisjZGVmaW5lCUVQUk9NX1RYUFdfQ0gxMV8xMiAweDE1CisjZGVmaW5lCUVQUk9NX1RYUFdfQ0gxM18xNCAweDE2CisKK3UzMiBlcHJvbV9yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsdTMyIGFkZHIpOyAvL3JlYWRzIGEgMTYgYml0cyB3b3JkCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NTM0OTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2NvcmUuYwpAQCAtMCwwICsxLDY4MjggQEAKKy8qCisgICBUaGlzIGlzIHBhcnQgb2YgcnRsODE4eCBwY2kgT3BlblNvdXJjZSBkcml2ZXIgLSB2IDAuMQorICAgQ29weXJpZ2h0IChDKSBBbmRyZWEgTWVyZWxsbyAyMDA0LTIwMDUgIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKyAgIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2Vuc2UpCisKKyAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgR1BMIHBhcnQgb2YgdGhlIG9mZmljaWFsCisgICBSZWFsdGVrIGRyaXZlci4KKworICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBydGw4MTgwIGRyaXZlciBza2VsZXRvbgorICAgZnJvbSBQYXRyaWMgU2NoZW5rZSAmIEFuZHJlcyBTYWxvbW9uLgorCisgICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEludGVsIFBybyBXaXJlbGVzcyAyMTAwIEdQTCBkcml2ZXIuCisKKyAgIFBhcnRzIG9mIEJCL1JGIGNvZGUgYXJlIGRlcml2ZWQgZnJvbSBEYXZpZCBZb3VuZyBydGw4MTgwIG5ldGJzZCBkcml2ZXIuCisKKyAgIFJTU0kgY2FsYyBmdW5jdGlvbiBmcm9tICdUaGUgRGV1Y2UnCisKKyAgIFNvbWUgaWRlYXMgYm9ycm93ZWQgZnJvbSB0aGUgODEzOXRvby5jIGRyaXZlciBpbmNsdWRlZCBpbiBsaW51eCBrZXJuZWwuCisKKyAgIFdlIChJPykgd2FudCB0byB0aGFua3MgdGhlIEF1dGhvcnMgb2YgdGhvc2UgcHJvamVjcyBhbmQgYWxzbyB0aGUKKyAgIE5kaXN3cmFwcGVyJ3MgcHJvamVjdCBBdXRob3JzLgorCisgICBBIGJpZyBiaWcgdGhhbmtzIGdvZXMgYWxzbyB0byBSZWFsdGVrIGNvcnAuIGZvciB0aGVpciBoZWxwIGluIG15IGF0dGVtcHQgdG8KKyAgIGFkZCBSVEw4MTg1IGFuZCBSVEw4MjI1IHN1cHBvcnQsIGFuZCB0byBEYXZpZCBZb3VuZyBhbHNvLgorKi8KKworI2lmIDAKK2RvdWJsZSBfX2Zsb2F0c2lkZiAoaW50IGkpIHsgcmV0dXJuIGk7IH0KK3Vuc2lnbmVkIGludCBfX2ZpeHVuc2Rmc2kgKGRvdWJsZSBkKSB7IHJldHVybiBkOyB9Citkb3VibGUgX19hZGRkZjMoZG91YmxlIGEsIGRvdWJsZSBiKSB7IHJldHVybiBhK2I7IH0KK2RvdWJsZSBfX2FkZHNmMyhmbG9hdCBhLCBmbG9hdCBiKSB7IHJldHVybiBhK2I7IH0KK2RvdWJsZSBfX3N1YmRmMyhkb3VibGUgYSwgZG91YmxlIGIpIHsgcmV0dXJuIGEtYjsgfQorZG91YmxlIF9fZXh0ZW5kc2ZkZjIoZmxvYXQgYSkge3JldHVybiBhO30KKyNlbmRpZgorCisKKyN1bmRlZiBERUJVR19UWF9ERVNDMgorI3VuZGVmIFJYX0RPTlRfUEFTU19VTAorI3VuZGVmIERFQlVHX0VQUk9NCisjdW5kZWYgREVCVUdfUlhfVkVSQk9TRQorI3VuZGVmIERVTU1ZX1JYCisjdW5kZWYgREVCVUdfWkVST19SWAorI3VuZGVmIERFQlVHX1JYX1NLQgorI3VuZGVmIERFQlVHX1RYX0ZSQUcKKyN1bmRlZiBERUJVR19SWF9GUkFHCisjdW5kZWYgREVCVUdfVFhfRklMTERFU0MKKyN1bmRlZiBERUJVR19UWAorI3VuZGVmIERFQlVHX0lSUQorI3VuZGVmIERFQlVHX1JYCisjdW5kZWYgREVCVUdfUlhBTExPQworI3VuZGVmIERFQlVHX1JFR0lTVEVSUworI3VuZGVmIERFQlVHX1JJTkcKKyN1bmRlZiBERUJVR19JUlFfVEFTS0xFVAorI3VuZGVmIERFQlVHX1RYX0FMTE9DCisjdW5kZWYgREVCVUdfVFhfREVTQworCisvLyNkZWZpbmUgREVCVUdfVFgKKy8vI2RlZmluZSBERUJVR19UWF9ERVNDMgorLy8jZGVmaW5lIERFQlVHX1JYCisvLyNkZWZpbmUgREVCVUdfUlhfU0tCCisKKy8vI2RlZmluZSBDT05GSUdfUlRMODE4MF9JT19NQVAKKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorLy8jaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKy8vI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSAicjgxODBfaHcuaCIKKyNpbmNsdWRlICJyODE4MC5oIgorI2luY2x1ZGUgInI4MTgwX3NhMjQwMC5oIiAgLyogUEhJTElQUyBSYWRpbyBmcm9udGVuZCAqLworI2luY2x1ZGUgInI4MTgwX21heDI4MjAuaCIgLyogTUFYSU0gUmFkaW8gZnJvbnRlbmQgKi8KKyNpbmNsdWRlICJyODE4MF9nY3QuaCIgICAgIC8qIEdDVCBSYWRpbyBmcm9udGVuZCAqLworI2luY2x1ZGUgInI4MTgwX3J0bDgyMjUuaCIgLyogUlRMODIyNSBSYWRpbyBmcm9udGVuZCAqLworI2luY2x1ZGUgInI4MTgwX3J0bDgyNTUuaCIgLyogUlRMODI1NSBSYWRpbyBmcm9udGVuZCAqLworI2luY2x1ZGUgInI4MTgwXzkzY3g2LmgiICAgLyogQ2FyZCBFRVBST00gKi8KKyNpbmNsdWRlICJyODE4MF93eC5oIgorI2luY2x1ZGUgInI4MTgwX2RtLmgiCisKKyNpZmRlZiBDT05GSUdfUlRMODE4MF9QTQorI2luY2x1ZGUgInI4MTgwX3BtLmgiCisjZW5kaWYKKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKyNpbmNsdWRlICJkb3QxMWQuaCIKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisvLyNkZWZpbmUgQ09ORklHX1JUTDgxODBfSU9fTUFQCisjZW5kaWYKKworI2lmbmRlZiBQQ0lfVkVORE9SX0lEX0JFTEtJTgorCSNkZWZpbmUgUENJX1ZFTkRPUl9JRF9CRUxLSU4gMHgxNzk5CisjZW5kaWYKKyNpZm5kZWYgUENJX1ZFTkRPUl9JRF9ETElOSworCSNkZWZpbmUgUENJX1ZFTkRPUl9JRF9ETElOSyAweDExODYKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcnRsODE4MF9wY2lfaWRfdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKKyAgICAgICAgeworICAgICAgICAgICAgICAgIC52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX1JFQUxURUssCisvLyAgICAgICAgICAgICAgICAuZGV2aWNlID0gMHg4MTgwLAorICAgICAgICAgICAgICAgIC5kZXZpY2UgPSAweDgxOTksCisgICAgICAgICAgICAgICAgLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsCisgICAgICAgICAgICAgICAgLnN1YmRldmljZSA9IFBDSV9BTllfSUQsCisgICAgICAgICAgICAgICAgLmRyaXZlcl9kYXRhID0gMCwKKyAgICAgICAgfSwKKyNpZiAwCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9CRUxLSU4sCisgICAgICAgICAgICAgICAgLmRldmljZSA9IDB4NjAwMSwKKyAgICAgICAgICAgICAgICAuc3VidmVuZG9yID0gUENJX0FOWV9JRCwKKyAgICAgICAgICAgICAgICAuc3ViZGV2aWNlID0gUENJX0FOWV9JRCwKKyAgICAgICAgICAgICAgICAuZHJpdmVyX2RhdGEgPSAxLAorICAgICAgICB9LAorICAgICAgICB7ICAgICAgIC8qIEJlbGtpbiBGNUQ2MDIwIHYzICovCisJICAgICAgICAudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9CRUxLSU4sCisgICAgICAgICAgICAgICAgLmRldmljZSA9IDB4NjAyMCwKKyAgICAgICAgICAgICAgICAuc3VidmVuZG9yID0gUENJX0FOWV9JRCwKKyAgICAgICAgICAgICAgICAuc3ViZGV2aWNlID0gUENJX0FOWV9JRCwKKyAgICAgICAgICAgICAgICAuZHJpdmVyX2RhdGEgPSAyLAorICAgICAgICB9LAorICAgICAgICB7ICAgICAgIC8qIEQtTGluayBEV0wtNjEwICovCisgICAgICAgICAgICAgICAgLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfRExJTkssCisgICAgICAgICAgICAgICAgLmRldmljZSA9IDB4MzMwMCwKKyAgICAgICAgICAgICAgICAuc3VidmVuZG9yID0gUENJX0FOWV9JRCwKKyAgICAgICAgICAgICAgICAuc3ViZGV2aWNlID0gUENJX0FOWV9JRCwKKyAgICAgICAgICAgICAgICAuZHJpdmVyX2RhdGEgPSAzLAorICAgICAgICB9LAorCXsKKwkJLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfUkVBTFRFSywKKwkJLmRldmljZSA9IDB4ODE4NSwKKwkJLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lELAorCQkuZHJpdmVyX2RhdGEgPSA0LAorCX0sCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgICAgICAgIC52ZW5kb3IgPSAwLAorICAgICAgICAgICAgICAgIC5kZXZpY2UgPSAwLAorICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgPSAwLAorICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgPSAwLAorICAgICAgICAgICAgICAgIC5kcml2ZXJfZGF0YSA9IDAsCisgICAgICAgIH0KK307CisKKworc3RhdGljIGNoYXIqIGlmbmFtZSA9ICJ3bGFuJWQiOworc3RhdGljIGludCBod3NlcW51bSA9IDA7CisvL3N0YXRpYyBjaGFyKiBpZm5hbWUgPSAiYXRoJWQiOworc3RhdGljIGludCBod3dlcCA9IDA7CitzdGF0aWMgaW50IGNoYW5uZWxzID0gMHgzZmZmOworCisjZGVmaW5lIGVxTWFjQWRkcihhLGIpCQkoICgoYSlbMF09PShiKVswXSAmJiAoYSlbMV09PShiKVsxXSAmJiAoYSlbMl09PShiKVsyXSAmJiAoYSlbM109PShiKVszXSAmJiAoYSlbNF09PShiKVs0XSAmJiAoYSlbNV09PShiKVs1XSkgPyAxOjAgKQorI2RlZmluZSBjcE1hY0FkZHIoZGVzLHNyYykJICAgICAgKChkZXMpWzBdPShzcmMpWzBdLChkZXMpWzFdPShzcmMpWzFdLChkZXMpWzJdPShzcmMpWzJdLChkZXMpWzNdPShzcmMpWzNdLChkZXMpWzRdPShzcmMpWzRdLChkZXMpWzVdPShzcmMpWzVdKQorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHJ0bDgxODBfcGNpX2lkX3RibCk7CitNT0RVTEVfQVVUSE9SKCJBbmRyZWEgTWVyZWxsbyA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkxpbnV4IGRyaXZlciBmb3IgUmVhbHRlayBSVEw4MTgwIC8gUlRMODE4NSBXaUZpIGNhcmRzIik7CisKKworCisvKgorTU9EVUxFX1BBUk0oaWZuYW1lLCAicyIpOworTU9EVUxFX1BBUk1fREVTQyhkZXZuYW1lLCIgTmV0IGludGVyZmFjZSBuYW1lLCB3bGFuJWQ9ZGVmYXVsdCIpOworCitNT0RVTEVfUEFSTShod3NlcW51bSwiaSIpOworTU9EVUxFX1BBUk1fREVTQyhod3NlcW51bSwiIFRyeSB0byB1c2UgaGFyZHdhcmUgODAyLjExIGhlYWRlciBzZXF1ZW5jZSBudW1iZXJzLiBaZXJvPWRlZmF1bHQiKTsKKworTU9EVUxFX1BBUk0oaHd3ZXAsImkiKTsKK01PRFVMRV9QQVJNX0RFU0MoaHd3ZXAsIiBUcnkgdG8gdXNlIGhhcmR3YXJlIFdFUCBzdXBwb3J0LiBTdGlsbCBicm9rZW4gYW5kIG5vdCBhdmFpbGFibGUgb24gYWxsIGNhcmRzIik7CisKK01PRFVMRV9QQVJNKGNoYW5uZWxzLCJpIik7CitNT0RVTEVfUEFSTV9ERVNDKGNoYW5uZWxzLCIgQ2hhbm5lbCBiaXRtYXNrIGZvciBzcGVjaWZpYyBsb2NhbGVzLiBOWUkiKTsKKyovCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiwgNiwgOSkKK21vZHVsZV9wYXJhbShpZm5hbWUsIGNoYXJwLCBTX0lSVUdPfFNfSVdVU1IgKTsKK21vZHVsZV9wYXJhbShod3NlcW51bSxpbnQsIFNfSVJVR098U19JV1VTUik7Cittb2R1bGVfcGFyYW0oaHd3ZXAsaW50LCBTX0lSVUdPfFNfSVdVU1IpOworbW9kdWxlX3BhcmFtKGNoYW5uZWxzLGludCwgU19JUlVHT3xTX0lXVVNSKTsKKyNlbHNlCitNT0RVTEVfUEFSTShpZm5hbWUsICJzIik7CitNT0RVTEVfUEFSTShod3NlcW51bSwiaSIpOworTU9EVUxFX1BBUk0oaHd3ZXAsImkiKTsKK01PRFVMRV9QQVJNKGNoYW5uZWxzLCJpIik7CisjZW5kaWYKKworTU9EVUxFX1BBUk1fREVTQyhkZXZuYW1lLCIgTmV0IGludGVyZmFjZSBuYW1lLCB3bGFuJWQ9ZGVmYXVsdCIpOworLy9NT0RVTEVfUEFSTV9ERVNDKGRldm5hbWUsIiBOZXQgaW50ZXJmYWNlIG5hbWUsIGF0aCVkPWRlZmF1bHQiKTsKK01PRFVMRV9QQVJNX0RFU0MoaHdzZXFudW0sIiBUcnkgdG8gdXNlIGhhcmR3YXJlIDgwMi4xMSBoZWFkZXIgc2VxdWVuY2UgbnVtYmVycy4gWmVybz1kZWZhdWx0Iik7CitNT0RVTEVfUEFSTV9ERVNDKGh3d2VwLCIgVHJ5IHRvIHVzZSBoYXJkd2FyZSBXRVAgc3VwcG9ydC4gU3RpbGwgYnJva2VuIGFuZCBub3QgYXZhaWxhYmxlIG9uIGFsbCBjYXJkcyIpOworTU9EVUxFX1BBUk1fREVTQyhjaGFubmVscywiIENoYW5uZWwgYml0bWFzayBmb3Igc3BlY2lmaWMgbG9jYWxlcy4gTllJIik7CisKKworc3RhdGljIGludCBfX2RldmluaXQgcnRsODE4MF9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCk7CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBydGw4MTgwX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpOworCitzdGF0aWMgdm9pZCBydGw4MTgwX3NodXRkb3duIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCWRldi0+c3RvcChkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHJ0bDgxODBfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSBSVEw4MTgwX01PRFVMRV9OQU1FLAkgICAgICAgICAgLyogRHJpdmVyIG5hbWUgICAqLworCS5pZF90YWJsZQk9IHJ0bDgxODBfcGNpX2lkX3RibCwJICAgICAgICAgIC8qIFBDSV9JRCB0YWJsZSAgKi8KKwkucHJvYmUJCT0gcnRsODE4MF9wY2lfcHJvYmUsCSAgICAgICAgICAvKiBwcm9iZSBmbiAgICAgICovCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChydGw4MTgwX3BjaV9yZW1vdmUpLC8qIHJlbW92ZSBmbiAgICAgKi8KKyNpZmRlZiBDT05GSUdfUlRMODE4MF9QTQorCS5zdXNwZW5kCT0gcnRsODE4MF9zdXNwZW5kLAkgICAgICAgICAgLyogUE0gc3VzcGVuZCBmbiAqLworCS5yZXN1bWUJCT0gcnRsODE4MF9yZXN1bWUsICAgICAgICAgICAgICAgICAvKiBQTSByZXN1bWUgZm4gICovCisjZWxzZQorCS5zdXNwZW5kCT0gTlVMTCwJCQkgICAgICAgICAgLyogUE0gc3VzcGVuZCBmbiAqLworCS5yZXN1bWUgICAgICAJPSBOVUxMLAkJCSAgICAgICAgICAvKiBQTSByZXN1bWUgZm4gICovCisjZW5kaWYKKwkuc2h1dGRvd24JPSBydGw4MTgwX3NodXRkb3duLAorfTsKKworCisKKyNpZmRlZiBDT05GSUdfUlRMODE4MF9JT19NQVAKKwordTggcmVhZF9uaWNfYnl0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCkKK3sKKyAgICAgICAgcmV0dXJuIDB4ZmYmaW5iKGRldi0+YmFzZV9hZGRyICt4KTsKK30KKwordTMyIHJlYWRfbmljX2R3b3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4KQoreworICAgICAgICByZXR1cm4gaW5sKGRldi0+YmFzZV9hZGRyICt4KTsKK30KKwordTE2IHJlYWRfbmljX3dvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgpCit7CisgICAgICAgIHJldHVybiBpbncoZGV2LT5iYXNlX2FkZHIgK3gpOworfQorCit2b2lkIHdyaXRlX25pY19ieXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4LHU4IHkpCit7CisgICAgICAgIG91dGIoeSYweGZmLGRldi0+YmFzZV9hZGRyICt4KTsKK30KKwordm9pZCB3cml0ZV9uaWNfd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCx1MTYgeSkKK3sKKyAgICAgICAgb3V0dyh5LGRldi0+YmFzZV9hZGRyICt4KTsKK30KKwordm9pZCB3cml0ZV9uaWNfZHdvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgsdTMyIHkpCit7CisgICAgICAgIG91dGwoeSxkZXYtPmJhc2VfYWRkciAreCk7Cit9CisKKyNlbHNlIC8qIFJUTF9JT19NQVAgKi8KKwordTggcmVhZF9uaWNfYnl0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCkKK3sKKyAgICAgICAgcmV0dXJuIDB4ZmYmcmVhZGIoKHU4KilkZXYtPm1lbV9zdGFydCAreCk7Cit9CisKK3UzMiByZWFkX25pY19kd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCkKK3sKKyAgICAgICAgcmV0dXJuIHJlYWRsKCh1OCopZGV2LT5tZW1fc3RhcnQgK3gpOworfQorCit1MTYgcmVhZF9uaWNfd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCkKK3sKKyAgICAgICAgcmV0dXJuIHJlYWR3KCh1OCopZGV2LT5tZW1fc3RhcnQgK3gpOworfQorCit2b2lkIHdyaXRlX25pY19ieXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4LHU4IHkpCit7CisgICAgICAgIHdyaXRlYih5LCh1OCopZGV2LT5tZW1fc3RhcnQgK3gpOworCXVkZWxheSgyMCk7Cit9CisKK3ZvaWQgd3JpdGVfbmljX2R3b3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4LHUzMiB5KQoreworICAgICAgICB3cml0ZWwoeSwodTgqKWRldi0+bWVtX3N0YXJ0ICt4KTsKKwl1ZGVsYXkoMjApOworfQorCit2b2lkIHdyaXRlX25pY193b3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4LHUxNiB5KQoreworICAgICAgICB3cml0ZXcoeSwodTgqKWRldi0+bWVtX3N0YXJ0ICt4KTsKKwl1ZGVsYXkoMjApOworfQorCisjZW5kaWYgLyogUlRMX0lPX01BUCAqLworCisKKworCisKK2lubGluZSB2b2lkIGZvcmNlX3BjaV9wb3N0aW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmVhZF9uaWNfYnl0ZShkZXYsRVBST01fQ01EKTsKKyNpZm5kZWYgQ09ORklHX1JUTDgxODBfSU9fTUFQCisJbWIoKTsKKyNlbmRpZgorfQorCisKK2lycXJldHVybl90IHJ0bDgxODBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKm5ldGRldiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwordm9pZCBzZXRfbmljX3J4cmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgc2V0X25pY190eHJpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnJ0bDgxODBfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxODBfY29tbWl0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MTgwX3N0YXJ0X3R4X2JlYWNvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tUFJPQ0ZTIFNUVUZGLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnJ0bDgxODBfcHJvYyA9IE5VTEw7CisKK3N0YXRpYyBpbnQgcHJvY19nZXRfcmVnaXN0ZXJzKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKKwkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCisJCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOworLy8Jc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisJaW50IGxlbiA9IDA7CisJaW50IGksbjsKKworCWludCBtYXg9MHhmZjsKKworCS8qIFRoaXMgZHVtcCB0aGUgY3VycmVudCByZWdpc3RlciBwYWdlICovCisJZm9yKG49MDtuPD1tYXg7KQorCXsKKwkJLy9wcmludGsoICJcbkQ6ICUyeD4gIiwgbik7CisJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCSJcbkQ6ICAlMnggPiAiLG4pOworCisJCWZvcihpPTA7aTwxNiAmJiBuPD1tYXg7aSsrLG4rKykKKwkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJIiUyeCAiLHJlYWRfbmljX2J5dGUoZGV2LG4pKTsKKworCQkvLwlwcmludGsoIiUyeCAiLHJlYWRfbmljX2J5dGUoZGV2LG4pKTsKKwl9CisJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCJcbiIpOworCisKKworCSplb2YgPSAxOworCXJldHVybiBsZW47CisKK30KKworaW50IGdldF9jdXJyX3R4X2ZyZWVfZGVzYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcHJpb3JpdHkpOworCitzdGF0aWMgaW50IHByb2NfZ2V0X3N0YXRzX2h3KGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKKwkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCisJCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCS8vc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7CisJLy9zdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwlpbnQgbGVuID0gMDsKKyNpZmRlZiAJQ09ORklHX1JUTDgxODVCCisKKyNlbHNlCisJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkiTklDIGludDogJWx1XG4iCisJCSJUb3RhbCBpbnQ6ICVsdVxuIgorCQkiLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKKwkJIkxQIGF2YWlsIGRlc2MgJWRcbiIKKwkJIk5QIGF2YWlsIGRlc2MgJWRcbiIKKwkJIi0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisJCSJMUCBwaHlzIGRtYSBhZGRyICV4XG4iCisJCSJMUCBOSUMgcHRyICV4XG4iCisJCSJMUCB2aXJ0IDMyYmFzZSAleFxuIgorCQkiTFAgdmlydCAzMnRhaWwgJXhcbiIKKwkJIi0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisJCSJOUCBwaHlzIGRtYSBhZGRyICV4XG4iCisJCSJOUCBOSUMgcHRyICV4XG4iCisJCSJOUCB2aXJ0IDMyYmFzZSAleFxuIgorCQkiTlAgdmlydCAzMnRhaWwgJXhcbiIKKwkJIi0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisJCSJCUCBwaHlzIGRtYSBhZGRyICV4XG4iCisJCSJCUCBOSUMgcHRyICV4XG4iCisJCSJCUCB2aXJ0IDMyYmFzZSAleFxuIgorCQkiQlAgdmlydCAzMnRhaWwgJXhcbiIsCisJCXByaXYtPnN0YXRzLmludHMsCisJCXByaXYtPnN0YXRzLnNoaW50cywKKwkJZ2V0X2N1cnJfdHhfZnJlZV9kZXNjKGRldixMT1dfUFJJT1JJVFkpLAorCQlnZXRfY3Vycl90eF9mcmVlX2Rlc2MoZGV2LE5PUk1fUFJJT1JJVFkpLAorCQkodTMyKXByaXYtPnR4dmlwcmluZ2RtYSwKKwkJcmVhZF9uaWNfZHdvcmQoZGV2LFRMUERBKSwKKwkJKHUzMilwcml2LT50eHZpcHJpbmcsCisJCSh1MzIpcHJpdi0+dHh2aXByaW5ndGFpbCwKKwkJKHUzMilwcml2LT50eHZvcHJpbmdkbWEsCisJCXJlYWRfbmljX2R3b3JkKGRldixUTlBEQSksCisJCSh1MzIpcHJpdi0+dHh2b3ByaW5nLAorCQkodTMyKXByaXYtPnR4dm9wcmluZ3RhaWwsCisJCSh1MzIpcHJpdi0+dHhiZWFjb25yaW5nZG1hLAorCQlyZWFkX25pY19kd29yZChkZXYsVEJEQSksCisJCSh1MzIpcHJpdi0+dHhiZWFjb25yaW5nLAorCQkodTMyKXByaXYtPnR4YmVhY29ucmluZ3RhaWwpOworI2VuZGlmCisJKmVvZiA9IDE7CisJcmV0dXJuIGxlbjsKK30KKworCitzdGF0aWMgaW50IHByb2NfZ2V0X3N0YXRzX3J4KGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKKwkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCisJCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWludCBsZW4gPSAwOworCisJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCS8qCSJSWCBkZXNjcmlwdG9yIG5vdCBhdmFpbGFibGU6ICVsdVxuIgorCQkiUlggaW5jb21wbGV0ZSAobWlzc2luZyBsYXN0IGRlc2NyaXB0b3IpOiAlbHVcbiIKKwkJIlJYIG5vdCBkYXRhOiAlbHVcbiIKKwkJLy8iUlggZGVzY3JpcHRvciBwb2ludGVyIHJlc2V0OiAlbHVcbiIKKwkJIlJYIGRlc2NyaXB0b3IgcG9pbnRlciBsb3N0OiAlbHVcbiIKKwkJLy8iUlggcG9pbnRlciB3b3JrYXJvdW5kOiAlbHVcbiIKKwkJIlJYIGVycm9yIGludDogJWx1XG4iCisJCSJSWCBmaWZvIG92ZXJmbG93OiAlbHVcbiIKKwkJIlJYIGludDogJWx1XG4iCisJCSJSWCBwYWNrZXQ6ICVsdVxuIgorCQkiUlggYnl0ZXM6ICVsdVxuIgorCQkiUlggRE1BIGZhaWw6ICVsdVxuIiwKKwkJcHJpdi0+c3RhdHMucnhyZHUsCisJCXByaXYtPnN0YXRzLnJ4bm9sYXN0LAorCQlwcml2LT5zdGF0cy5yeG5vZGF0YSwKKwkJLy9wcml2LT5zdGF0cy5yeHJlc2V0LAorCQlwcml2LT5zdGF0cy5yeG5vcG9pbnRlciwKKwkJLy9wcml2LT5zdGF0cy5yeHdya2Fyb3VuZCwKKwkJcHJpdi0+c3RhdHMucnhlcnIsCisJCXByaXYtPnN0YXRzLnJ4b3ZlcmZsb3csCisJCXByaXYtPnN0YXRzLnJ4aW50LAorCQlwcml2LT5pZWVlODAyMTEtPnN0YXRzLnJ4X3BhY2tldHMsCisJCXByaXYtPmllZWU4MDIxMS0+c3RhdHMucnhfYnl0ZXMsCisJCXByaXYtPnN0YXRzLnJ4ZG1hZmFpbCAgKi8KKwkJIlJYIE9LOiAlbHVcbiIKKwkJIlJYIFJldHJ5OiAlbHVcbiIKKwkJIlJYIENSQyBFcnJvcigwLTUwMCk6ICVsdVxuIgorCQkiUlggQ1JDIEVycm9yKDUwMC0xMDAwKTogJWx1XG4iCisJCSJSWCBDUkMgRXJyb3IoPjEwMDApOiAlbHVcbiIKKwkJIlJYIElDViBFcnJvcjogJWx1XG4iLAorCQlwcml2LT5zdGF0cy5yeGludCwKKwkJcHJpdi0+c3RhdHMucnhlcnIsCisJCXByaXYtPnN0YXRzLnJ4Y3JjZXJybWluLAorCQlwcml2LT5zdGF0cy5yeGNyY2Vycm1pZCwKKwkJcHJpdi0+c3RhdHMucnhjcmNlcnJtYXgsCisJCXByaXYtPnN0YXRzLnJ4aWN2ZXJyCisJCSk7CisKKwkqZW9mID0gMTsKKwlyZXR1cm4gbGVuOworfQorCisjaWYgMAorc3RhdGljIGludCBwcm9jX2dldF9zdGF0c19pZWVlKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKKwkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCisJCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWludCBsZW4gPSAwOworCisJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkiVFhlZCBhc3NvY2lhdGlvbiByZXF1ZXN0czogJXVcbiIKKwkJIlRYZWQgYXV0aGVudGljYXRpb24gcmVxdWVzdHM6ICV1XG4iCisJCSJSWGVkIHN1Y2Nlc3NmdWwgYXNzb2NpYXRpb24gcmVzcG9uc2U6ICV1XG4iCisJCSJSWGVkIGZhaWxlZCBhc3NvY2lhdGlvbiByZXNwb25zZTogJXVcbiIKKwkJIlJYZWQgc3VjY2Vzc2Z1bCBhdXRoZW50aWNhdGlvbiByZXNwb25zZTogJXVcbiIKKwkJIlJYZWQgZmFpbGVkIGF1dGhlbnRpY2F0aW9uIHJlc3BvbnNlOiAldVxuIgorCQkiQXNzb2NpYXRpb24gcmVxdWVzdHMgd2l0aG91dCByZXNwb25zZTogJXVcbiIKKwkJIkF1dGhlbnRpY2F0aW9uIHJlcXVlc3RzIHdpdGhvdXQgcmVzcG9uc2U6ICV1XG4iCisJCSJUWCBwcm9iZSByZXNwb25zZTogJXVcbiIKKwkJIlJYIHByb2JlIHJlcXVlc3Q6ICV1XG4iCisJCSJUWCBwcm9iZSByZXF1ZXN0OiAlbHVcbiIKKwkJIlJYIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3RzOiAlbHVcbiIKKwkJIlJYIGFzc29jaWF0aW9uIHJlcXVlc3RzOiAlbHVcbiIKKwkJIlJlYXNzb2NpYXRpb25zOiAlbHVcbiIsCisJCXByaXYtPmllZWU4MDIxMS0+aWVlZV9zdGF0cy50eF9hc3MsCisJCXByaXYtPmllZWU4MDIxMS0+aWVlZV9zdGF0cy50eF9hdXQsCisJCXByaXYtPmllZWU4MDIxMS0+aWVlZV9zdGF0cy5yeF9hc3Nfb2ssCisJCXByaXYtPmllZWU4MDIxMS0+aWVlZV9zdGF0cy5yeF9hc3NfZXJyLAorCQlwcml2LT5pZWVlODAyMTEtPmllZWVfc3RhdHMucnhfYXV0X29rLAorCQlwcml2LT5pZWVlODAyMTEtPmllZWVfc3RhdHMucnhfYXV0X2VyciwKKwkJcHJpdi0+aWVlZTgwMjExLT5pZWVlX3N0YXRzLmFzc19ub3Jlc3AsCisJCXByaXYtPmllZWU4MDIxMS0+aWVlZV9zdGF0cy5hdXRfbm9yZXNwLAorCQlwcml2LT5pZWVlODAyMTEtPmllZWVfc3RhdHMudHhfcHJvYmUsCisJCXByaXYtPmllZWU4MDIxMS0+aWVlZV9zdGF0cy5yeF9wcm9iZSwKKwkJcHJpdi0+aWVlZTgwMjExLT5pZWVlX3N0YXRzLnR4X3Byb2JlX3JxLAorCQlwcml2LT5pZWVlODAyMTEtPmllZWVfc3RhdHMucnhfYXV0aF9ycSwKKwkJcHJpdi0+aWVlZTgwMjExLT5pZWVlX3N0YXRzLnJ4X2Fzc29jX3JxLAorCQlwcml2LT5pZWVlODAyMTEtPmllZWVfc3RhdHMucmVhc3NvYyk7CisKKwkqZW9mID0gMTsKKwlyZXR1cm4gbGVuOworfQorI2VuZGlmCisjaWYgMAorc3RhdGljIGludCBwcm9jX2dldF9zdGF0c19hcChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCisJCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAorCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IG1hY19odGFibGVfdCAqbGlzdDsKKwlpbnQgaTsKKwlpbnQgbGVuID0gMDsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSAhPSBJV19NT0RFX01BU1RFUil7CisJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJIkNhcmQgaXMgbm90IGFjdGluZyBhcyBBUC4uLlxuIgorCQkpOworCX1lbHNleworCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCisJCSJMaXN0IG9mIGFzc29jaWF0ZWQgU1RBOlxuIgorCQkpOworCisJCWZvcihpPTA7aTxNQUNfSFRBQkxFX0VOVFJZO2krKykKKwkJCWZvciAobGlzdCA9IHByaXYtPmllZWU4MDIxMS0+YXNzb2NfaHRhYmxlW2ldOyBsaXN0IT1OVUxMOyBsaXN0ID0gbGlzdC0+bmV4dCl7CisJCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJCQlNQUNTVFIiXG4iLE1BQzJTVFIobGlzdC0+YWRyKSk7CisJCQl9CisKKwl9CisJKmVvZiA9IDE7CisJcmV0dXJuIGxlbjsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHByb2NfZ2V0X3N0YXRzX3R4KGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKKwkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCisJCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWludCBsZW4gPSAwOworCXVuc2lnbmVkIGxvbmcgdG90YWxPSzsKKworCXRvdGFsT0s9cHJpdi0+c3RhdHMudHhucG9raW50K3ByaXYtPnN0YXRzLnR4aHBva2ludCtwcml2LT5zdGF0cy50eGxwb2tpbnQ7CisJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCS8qCSJUWCBub3JtYWwgcHJpb3JpdHkgb2sgaW50OiAlbHVcbiIKKwkJIlRYIG5vcm1hbCBwcmlvcml0eSBlcnJvciBpbnQ6ICVsdVxuIgorCQkiVFggaGlnaCBwcmlvcml0eSBvayBpbnQ6ICVsdVxuIgorCQkiVFggaGlnaCBwcmlvcml0eSBmYWlsZWQgZXJyb3IgaW50OiAlbHVcbiIKKwkJIlRYIGxvdyBwcmlvcml0eSBvayBpbnQ6ICVsdVxuIgorCQkiVFggbG93IHByaW9yaXR5IGZhaWxlZCBlcnJvciBpbnQ6ICVsdVxuIgorCQkiVFggYnl0ZXM6ICVsdVxuIgorCQkiVFggcGFja2V0czogJWx1XG4iCisJCSJUWCBxdWV1ZSByZXN1bWU6ICVsdVxuIgorCQkiVFggcXVldWUgc3RvcHBlZD86ICVkXG4iCisJCSJUWCBmaWZvIG92ZXJmbG93OiAlbHVcbiIKKwkJLy8iU1cgVFggc3RvcDogJWx1XG4iCisJCS8vIlNXIFRYIHdha2U6ICVsdVxuIgorCQkiVFggYmVhY29uOiAlbHVcbiIKKwkJIlRYIGJlYWNvbiBhYm9ydGVkOiAlbHVcbiIsCisJCXByaXYtPnN0YXRzLnR4bnBva2ludCwKKwkJcHJpdi0+c3RhdHMudHhucGVyciwKKwkJcHJpdi0+c3RhdHMudHhocG9raW50LAorCQlwcml2LT5zdGF0cy50eGhwZXJyLAorCQlwcml2LT5zdGF0cy50eGxwb2tpbnQsCisJCXByaXYtPnN0YXRzLnR4bHBlcnIsCisJCXByaXYtPmllZWU4MDIxMS0+c3RhdHMudHhfYnl0ZXMsCisJCXByaXYtPmllZWU4MDIxMS0+c3RhdHMudHhfcGFja2V0cywKKwkJcHJpdi0+c3RhdHMudHhyZXN1bWVkLAorCQluZXRpZl9xdWV1ZV9zdG9wcGVkKGRldiksCisJCXByaXYtPnN0YXRzLnR4b3ZlcmZsb3csCisJCS8vcHJpdi0+aWVlZTgwMjExLT5pZWVlX3N0YXRzLnN3dHhzdG9wLAorCQkvL3ByaXYtPmllZWU4MDIxMS0+aWVlZV9zdGF0cy5zd3R4YXdha2UsCisJCXByaXYtPnN0YXRzLnR4YmVhY29uLAorCQlwcml2LT5zdGF0cy50eGJlYWNvbmVyciAgKi8KKwkJIlRYIE9LOiAlbHVcbiIKKwkJIlRYIEVycm9yOiAlbHVcbiIKKwkJIlRYIFJldHJ5OiAlbHVcbiIKKwkJIlRYIGJlYWNvbiBPSzogJWx1XG4iCisJCSJUWCBiZWFjb24gZXJyb3I6ICVsdVxuIiwKKwkJdG90YWxPSywKKwkJcHJpdi0+c3RhdHMudHhucGVycitwcml2LT5zdGF0cy50eGhwZXJyK3ByaXYtPnN0YXRzLnR4bHBlcnIsCisJCXByaXYtPnN0YXRzLnR4cmV0cnksCisJCXByaXYtPnN0YXRzLnR4YmVhY29uLAorCQlwcml2LT5zdGF0cy50eGJlYWNvbmVycgorCSk7CisKKwkqZW9mID0gMTsKKwlyZXR1cm4gbGVuOworfQorCisKKyNpZiBXSVJFTEVTU19FWFQgPCAxNworc3RhdGljIHN0cnVjdCBpd19zdGF0aXN0aWNzICpyODE4MF9nZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICBzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKyAgICAgICByZXR1cm4gJnByaXYtPndzdGF0czsKK30KKyNlbmRpZgordm9pZCBydGw4MTgwX3Byb2NfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlETUVTRygiSW5pdGlhbGl6aW5nIHByb2MgZmlsZXN5c3RlbSIpOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkKKyAgICAgICAgcnRsODE4MF9wcm9jPWNyZWF0ZV9wcm9jX2VudHJ5KFJUTDgxODBfTU9EVUxFX05BTUUsIFNfSUZESVIsIHByb2NfbmV0KTsKKyNlbHNlCisgICAgICAgIHJ0bDgxODBfcHJvYz1jcmVhdGVfcHJvY19lbnRyeShSVEw4MTgwX01PRFVMRV9OQU1FLCBTX0lGRElSLCBpbml0X25ldC5wcm9jX25ldCk7CisjZW5kaWYKK30KKworCit2b2lkIHJ0bDgxODBfcHJvY19tb2R1bGVfcmVtb3ZlKHZvaWQpCit7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI0KQorICAgICAgICByZW1vdmVfcHJvY19lbnRyeShSVEw4MTgwX01PRFVMRV9OQU1FLCBwcm9jX25ldCk7CisjZWxzZQorICAgICAgICByZW1vdmVfcHJvY19lbnRyeShSVEw4MTgwX01PRFVMRV9OQU1FLCBpbml0X25ldC5wcm9jX25ldCk7CisjZW5kaWYKK30KKworCit2b2lkIHJ0bDgxODBfcHJvY19yZW1vdmVfb25lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCWlmIChwcml2LT5kaXJfZGV2KSB7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJzdGF0cy1odyIsIHByaXYtPmRpcl9kZXYpOworCQlyZW1vdmVfcHJvY19lbnRyeSgic3RhdHMtdHgiLCBwcml2LT5kaXJfZGV2KTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoInN0YXRzLXJ4IiwgcHJpdi0+ZGlyX2Rldik7CisvLwkJcmVtb3ZlX3Byb2NfZW50cnkoInN0YXRzLWllZWUiLCBwcml2LT5kaXJfZGV2KTsKKy8vCQlyZW1vdmVfcHJvY19lbnRyeSgic3RhdHMtYXAiLCBwcml2LT5kaXJfZGV2KTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoInJlZ2lzdGVycyIsIHByaXYtPmRpcl9kZXYpOworCQlyZW1vdmVfcHJvY19lbnRyeShkZXYtPm5hbWUsIHJ0bDgxODBfcHJvYyk7CisJCXByaXYtPmRpcl9kZXYgPSBOVUxMOworCX0KK30KKworCit2b2lkIHJ0bDgxODBfcHJvY19pbml0X29uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZTsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJcHJpdi0+ZGlyX2RldiA9IGNyZWF0ZV9wcm9jX2VudHJ5KGRldi0+bmFtZSwKKwkJCQkJICBTX0lGRElSIHwgU19JUlVHTyB8IFNfSVhVR08sCisJCQkJCSAgcnRsODE4MF9wcm9jKTsKKwlpZiAoIXByaXYtPmRpcl9kZXYpIHsKKwkJRE1FU0dFKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSAvcHJvYy9uZXQvcnRsODE4MC8lc1xuIiwKKwkJICAgICAgZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCWUgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJzdGF0cy1odyIsIFNfSUZSRUcgfCBTX0lSVUdPLAorCQkJCSAgIHByaXYtPmRpcl9kZXYsIHByb2NfZ2V0X3N0YXRzX2h3LCBkZXYpOworCisJaWYgKCFlKSB7CisJCURNRVNHRSgiVW5hYmxlIHRvIGluaXRpYWxpemUgIgorCQkgICAgICAiL3Byb2MvbmV0L3J0bDgxODAvJXMvc3RhdHMtaHdcbiIsCisJCSAgICAgIGRldi0+bmFtZSk7CisJfQorCisJZSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInN0YXRzLXJ4IiwgU19JRlJFRyB8IFNfSVJVR08sCisJCQkJICAgcHJpdi0+ZGlyX2RldiwgcHJvY19nZXRfc3RhdHNfcngsIGRldik7CisKKwlpZiAoIWUpIHsKKwkJRE1FU0dFKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSAiCisJCSAgICAgICIvcHJvYy9uZXQvcnRsODE4MC8lcy9zdGF0cy1yeFxuIiwKKwkJICAgICAgZGV2LT5uYW1lKTsKKwl9CisKKworCWUgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJzdGF0cy10eCIsIFNfSUZSRUcgfCBTX0lSVUdPLAorCQkJCSAgIHByaXYtPmRpcl9kZXYsIHByb2NfZ2V0X3N0YXRzX3R4LCBkZXYpOworCisJaWYgKCFlKSB7CisJCURNRVNHRSgiVW5hYmxlIHRvIGluaXRpYWxpemUgIgorCQkgICAgICAiL3Byb2MvbmV0L3J0bDgxODAvJXMvc3RhdHMtdHhcbiIsCisJCSAgICAgIGRldi0+bmFtZSk7CisJfQorCSNpZiAwCisJZSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInN0YXRzLWllZWUiLCBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQkgICBwcml2LT5kaXJfZGV2LCBwcm9jX2dldF9zdGF0c19pZWVlLCBkZXYpOworCisJaWYgKCFlKSB7CisJCURNRVNHRSgiVW5hYmxlIHRvIGluaXRpYWxpemUgIgorCQkgICAgICAiL3Byb2MvbmV0L3J0bDgxODAvJXMvc3RhdHMtaWVlZVxuIiwKKwkJICAgICAgZGV2LT5uYW1lKTsKKwl9CisJI2VuZGlmCisJI2lmIDAKKwllID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgic3RhdHMtYXAiLCBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQkgICBwcml2LT5kaXJfZGV2LCBwcm9jX2dldF9zdGF0c19hcCwgZGV2KTsKKworCWlmICghZSkgeworCQlETUVTR0UoIlVuYWJsZSB0byBpbml0aWFsaXplICIKKwkJICAgICAgIi9wcm9jL25ldC9ydGw4MTgwLyVzL3N0YXRzLWFwXG4iLAorCQkgICAgICBkZXYtPm5hbWUpOworCX0KKwkjZW5kaWYKKworCWUgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJyZWdpc3RlcnMiLCBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQkgICBwcml2LT5kaXJfZGV2LCBwcm9jX2dldF9yZWdpc3RlcnMsIGRldik7CisKKwlpZiAoIWUpIHsKKwkJRE1FU0dFKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSAiCisJCSAgICAgICIvcHJvYy9uZXQvcnRsODE4MC8lcy9yZWdpc3RlcnNcbiIsCisJCSAgICAgIGRldi0+bmFtZSk7CisJfQorfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tTUlTQyBTVFVGRi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAgRklYTUU6IGNoZWNrIGlmIHdlIGNhbiB1c2Ugc29tZSBzdGFuZGFyZCBhbHJlYWR5LWV4aXN0ZW50CisgIGRhdGEgdHlwZStmdW5jdGlvbnMgaW4ga2VybmVsCisqLworCitzaG9ydCBidWZmZXJfYWRkKHN0cnVjdCBidWZmZXIgKipidWZmZXIsIHUzMiAqYnVmLCBkbWFfYWRkcl90IGRtYSwKKwkJc3RydWN0IGJ1ZmZlciAqKmJ1ZmZlcmhlYWQpCit7CisjaWZkZWYgREVCVUdfUklORworCURNRVNHKCJhZGRpbmcgYnVmZmVyIHRvIFRYL1JYIHN0cnVjdCIpOworI2VuZGlmCisKKyAgICAgICAgc3RydWN0IGJ1ZmZlciAqdG1wOworCisJaWYoISAqYnVmZmVyKXsKKworCQkqYnVmZmVyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGJ1ZmZlciksR0ZQX0tFUk5FTCk7CisKKwkJaWYgKCpidWZmZXIgPT0gTlVMTCkgeworCQkJRE1FU0dFKCJGYWlsZWQgdG8ga21hbGxvYyBoZWFkIG9mIFRYL1JYIHN0cnVjdCIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCSgqYnVmZmVyKS0+bmV4dD0qYnVmZmVyOworCQkoKmJ1ZmZlciktPmJ1Zj1idWY7CisJCSgqYnVmZmVyKS0+ZG1hPWRtYTsKKwkJaWYoYnVmZmVyaGVhZCAhPU5VTEwpCisJCQkoKmJ1ZmZlcmhlYWQpID0gKCpidWZmZXIpOworCQlyZXR1cm4gMDsKKwl9CisJdG1wPSpidWZmZXI7CisKKwl3aGlsZSh0bXAtPm5leHQhPSgqYnVmZmVyKSkgdG1wPXRtcC0+bmV4dDsKKwlpZiAoKHRtcC0+bmV4dD0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGJ1ZmZlciksR0ZQX0tFUk5FTCkpID09IE5VTEwpeworCQlETUVTR0UoIkZhaWxlZCB0byBrbWFsbG9jIFRYL1JYIHN0cnVjdCIpOworCQlyZXR1cm4gLTE7CisJfQorCXRtcC0+bmV4dC0+YnVmPWJ1ZjsKKwl0bXAtPm5leHQtPmRtYT1kbWE7CisJdG1wLT5uZXh0LT5uZXh0PSpidWZmZXI7CisKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIGJ1ZmZlcl9mcmVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsc3RydWN0IGJ1ZmZlciAqKmJ1ZmZlcixpbnQgbGVuLHNob3J0Citjb25zaXN0ZW50KQoreworCisJc3RydWN0IGJ1ZmZlciAqdG1wLCpuZXh0OworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldj1wcml2LT5wZGV2OworCS8vaW50IGk7CisKKwlpZighICpidWZmZXIpIHJldHVybjsKKworCS8qZm9yKHRtcD0qYnVmZmVyOyB0bXAtPm5leHQgIT0gKmJ1ZmZlcjsgdG1wPXRtcC0+bmV4dCkKKworCSovCisJdG1wPSpidWZmZXI7CisJZG97CisJCW5leHQ9dG1wLT5uZXh0OworCQlpZihjb25zaXN0ZW50KXsKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldixsZW4sCisJCQkJICAgIHRtcC0+YnVmLHRtcC0+ZG1hKTsKKwkJfWVsc2V7CisJCQlwY2lfdW5tYXBfc2luZ2xlKHBkZXYsIHRtcC0+ZG1hLAorCQkJbGVuLFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlrZnJlZSh0bXAtPmJ1Zik7CisJCX0KKwkJa2ZyZWUodG1wKTsKKwkJdG1wID0gbmV4dDsKKwl9CisJd2hpbGUobmV4dCAhPSAqYnVmZmVyKTsKKworCSpidWZmZXI9TlVMTDsKK30KKworCit2b2lkIHByaW50X2J1ZmZlcih1MzIgKmJ1ZmZlciwgaW50IGxlbikKK3sKKwlpbnQgaTsKKwl1OCAqYnVmID0odTgqKWJ1ZmZlcjsKKworCXByaW50aygiQVNDSUkgQlVGRkVSIERVTVAgKGxlbjogJXgpOlxuIixsZW4pOworCisJZm9yKGk9MDtpPGxlbjtpKyspCisJCXByaW50aygiJWMiLGJ1ZltpXSk7CisKKwlwcmludGsoIlxuQklOQVJZIEJVRkZFUiBEVU1QIChsZW46ICV4KTpcbiIsbGVuKTsKKworCWZvcihpPTA7aTxsZW47aSsrKQorCQlwcmludGsoIiUwMngiLGJ1ZltpXSk7CisKKwlwcmludGsoIlxuIik7Cit9CisKKworaW50IGdldF9jdXJyX3R4X2ZyZWVfZGVzYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcHJpb3JpdHkpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXUzMiogdGFpbDsKKwl1MzIqIGhlYWQ7CisJaW50IHJldDsKKworCXN3aXRjaCAocHJpb3JpdHkpeworCQljYXNlIE1BTkFHRV9QUklPUklUWToKKwkJCWhlYWQgPSBwcml2LT50eG1hcHJpbmdoZWFkOworCQkJdGFpbCA9IHByaXYtPnR4bWFwcmluZ3RhaWw7CisJCQlicmVhazsKKwkJY2FzZSBCS19QUklPUklUWToKKwkJCWhlYWQgPSBwcml2LT50eGJrcHJpbmdoZWFkOworCQkJdGFpbCA9IHByaXYtPnR4YmtwcmluZ3RhaWw7CisJCQlicmVhazsKKwkJY2FzZSBCRV9QUklPUklUWToKKwkJCWhlYWQgPSBwcml2LT50eGJlcHJpbmdoZWFkOworCQkJdGFpbCA9IHByaXYtPnR4YmVwcmluZ3RhaWw7CisJCQlicmVhazsKKwkJY2FzZSBWSV9QUklPUklUWToKKwkJCWhlYWQgPSBwcml2LT50eHZpcHJpbmdoZWFkOworCQkJdGFpbCA9IHByaXYtPnR4dmlwcmluZ3RhaWw7CisJCQlicmVhazsKKwkJY2FzZSBWT19QUklPUklUWToKKwkJCWhlYWQgPSBwcml2LT50eHZvcHJpbmdoZWFkOworCQkJdGFpbCA9IHByaXYtPnR4dm9wcmluZ3RhaWw7CisJCQlicmVhazsKKwkJY2FzZSBISV9QUklPUklUWToKKwkJCWhlYWQgPSBwcml2LT50eGhwcmluZ2hlYWQ7CisJCQl0YWlsID0gcHJpdi0+dHhocHJpbmd0YWlsOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLTE7CisJfQorCisJLy9ETUVTRygiJXggJXgiLCBoZWFkLCB0YWlsKTsKKworCS8qIEZJWE1FIEZJWE1FIEZJWE1FIEZJWE1FICovCisKKyNpZiAwCisJaWYoIGhlYWQgPD0gdGFpbCApIHJldHVybiBwcml2LT50eHJpbmdjb3VudC0xIC0gKHRhaWwgLSBoZWFkKS84OworCXJldHVybiAoaGVhZCAtIHRhaWwpLzgvNDsKKyNlbHNlCisJaWYoIGhlYWQgPD0gdGFpbCApCisJCXJldCA9IHByaXYtPnR4cmluZ2NvdW50IC0gKHRhaWwgLSBoZWFkKS84OworCWVsc2UKKwkJcmV0ID0gKGhlYWQgLSB0YWlsKS84OworCisJaWYocmV0ID4gcHJpdi0+dHhyaW5nY291bnQgKSBETUVTRygiQlVHIik7CisJcmV0dXJuIHJldDsKKyNlbmRpZgorfQorCisKK3Nob3J0IGNoZWNrX25pY19lbm91Z2h0X2Rlc2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHByaW9yaXR5KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IG5ldGRldl9wcml2KGRldik7CisKKwlpbnQgcmVxdWlyZWRieXRlLCByZXF1aXJlZDsKKwlyZXF1aXJlZGJ5dGUgPSBwcml2LT5pZWVlODAyMTEtPmZ0cyArIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hlYWRlcl9kYXRhKTsKKworCWlmKGllZWUtPmN1cnJlbnRfbmV0d29yay5Rb1NfRW5hYmxlKSB7CisJCXJlcXVpcmVkYnl0ZSArPSAyOworCX07CisKKwlyZXF1aXJlZCA9IHJlcXVpcmVkYnl0ZSAvIChwcml2LT50eGJ1ZmZzaXplLTQpOworCWlmIChyZXF1aXJlZGJ5dGUgJSBwcml2LT50eGJ1ZmZzaXplKSByZXF1aXJlZCsrOworCS8qIGZvciBub3cgd2Uga2VlcCB0d28gZnJlZSBkZXNjcmlwdG9yIGFzIGEgc2FmZXR5IGJvdW5kYXJ5CisJICogYmV0d2VlbiB0aGUgdGFpbCBhbmQgdGhlIGhlYWQKKwkgKi8KKworCXJldHVybiAocmVxdWlyZWQrMiA8IGdldF9jdXJyX3R4X2ZyZWVfZGVzYyhkZXYscHJpb3JpdHkpKTsKK30KKworCisvKiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgZm9yIGRlYnVnaW5nIHB1cnBvc2UgKi8KK3ZvaWQgY2hlY2tfdHhfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcHJpKQoreworCXN0YXRpYyBpbnQgbWF4bG9nID0zOworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIqIHRtcDsKKwlzdHJ1Y3QgYnVmZmVyICpidWY7CisJaW50IGk7CisJaW50IG5pYzsKKwl1MzIqIHRhaWw7CisJdTMyKiBoZWFkOworCXUzMiogYmVnaW47CisJdTMyIG5pY2JlZ2luOworCXN0cnVjdCBidWZmZXIqIGJ1ZmZlcjsKKworCW1heGxvZyAtLTsKKwlpZiAobWF4bG9nIDwwICkgcmV0dXJuOworCisJc3dpdGNoKHByaSkgeworCWNhc2UgTUFOQUdFX1BSSU9SSVRZOgorCQl0YWlsID0gcHJpdi0+dHhtYXByaW5ndGFpbDsKKwkJYmVnaW4gPSBwcml2LT50eG1hcHJpbmc7CisJCWhlYWQgPSBwcml2LT50eG1hcHJpbmdoZWFkOworCQluaWMgPSByZWFkX25pY19kd29yZChkZXYsVFhfTUFOQUdFUFJJT1JJVFlfUklOR19BRERSKTsKKwkJYnVmZmVyID0gcHJpdi0+dHhtYXBidWZzOworCQluaWNiZWdpbiA9IHByaXYtPnR4bWFwcmluZ2RtYTsKKwkJYnJlYWs7CisKKworCWNhc2UgQktfUFJJT1JJVFk6CisJCXRhaWwgPSBwcml2LT50eGJrcHJpbmd0YWlsOworCQliZWdpbiA9IHByaXYtPnR4YmtwcmluZzsKKwkJaGVhZCA9IHByaXYtPnR4YmtwcmluZ2hlYWQ7CisJCW5pYyA9IHJlYWRfbmljX2R3b3JkKGRldixUWF9CS1BSSU9SSVRZX1JJTkdfQUREUik7CisJCWJ1ZmZlciA9IHByaXYtPnR4YmtwYnVmczsKKwkJbmljYmVnaW4gPSBwcml2LT50eGJrcHJpbmdkbWE7CisJCWJyZWFrOworCisJY2FzZSBCRV9QUklPUklUWToKKwkJdGFpbCA9IHByaXYtPnR4YmVwcmluZ3RhaWw7CisJCWJlZ2luID0gcHJpdi0+dHhiZXByaW5nOworCQloZWFkID0gcHJpdi0+dHhiZXByaW5naGVhZDsKKwkJbmljID0gcmVhZF9uaWNfZHdvcmQoZGV2LFRYX0JFUFJJT1JJVFlfUklOR19BRERSKTsKKwkJYnVmZmVyID0gcHJpdi0+dHhiZXBidWZzOworCQluaWNiZWdpbiA9IHByaXYtPnR4YmVwcmluZ2RtYTsKKwkJYnJlYWs7CisKKwljYXNlIFZJX1BSSU9SSVRZOgorCQl0YWlsID0gcHJpdi0+dHh2aXByaW5ndGFpbDsKKwkJYmVnaW4gPSBwcml2LT50eHZpcHJpbmc7CisJCWhlYWQgPSBwcml2LT50eHZpcHJpbmdoZWFkOworCQluaWMgPSByZWFkX25pY19kd29yZChkZXYsVFhfVklQUklPUklUWV9SSU5HX0FERFIpOworCQlidWZmZXIgPSBwcml2LT50eHZpcGJ1ZnM7CisJCW5pY2JlZ2luID0gcHJpdi0+dHh2aXByaW5nZG1hOworCQlicmVhazsKKworCisJY2FzZSBWT19QUklPUklUWToKKwkJdGFpbCA9IHByaXYtPnR4dm9wcmluZ3RhaWw7CisJCWJlZ2luID0gcHJpdi0+dHh2b3ByaW5nOworCQloZWFkID0gcHJpdi0+dHh2b3ByaW5naGVhZDsKKwkJbmljID0gcmVhZF9uaWNfZHdvcmQoZGV2LFRYX1ZPUFJJT1JJVFlfUklOR19BRERSKTsKKwkJYnVmZmVyID0gcHJpdi0+dHh2b3BidWZzOworCQluaWNiZWdpbiA9IHByaXYtPnR4dm9wcmluZ2RtYTsKKwkJYnJlYWs7CisKKwljYXNlIEhJX1BSSU9SSVRZOgorCQl0YWlsID0gcHJpdi0+dHhocHJpbmd0YWlsOworCQliZWdpbiA9IHByaXYtPnR4aHByaW5nOworCQloZWFkID0gcHJpdi0+dHhocHJpbmdoZWFkOworCQluaWMgPSByZWFkX25pY19kd29yZChkZXYsVFhfSElHSFBSSU9SSVRZX1JJTkdfQUREUik7CisJCWJ1ZmZlciA9IHByaXYtPnR4aHBidWZzOworCQluaWNiZWdpbiA9IHByaXYtPnR4aHByaW5nZG1hOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiA7CisJCWJyZWFrOworCX0KKworCWlmKCFwcml2LT50eHZvcGJ1ZnMpCisJCURNRVNHRSAoIk5JQyBUWCBhY2ssIGJ1dCBUWCBxdWV1ZSBjb3JydXB0ZWQhIik7CisJZWxzZXsKKworCQlmb3IoaT0wLGJ1Zj1idWZmZXIsIHRtcD1iZWdpbjsKKwkJCXRtcDxiZWdpbisocHJpdi0+dHhyaW5nY291bnQpKjg7CisJCQl0bXArPTgsYnVmPWJ1Zi0+bmV4dCxpKyspCisKKwkJCURNRVNHKCJCVUYlZCAlcyAleCAlcy4gTmV4dCA6ICV4IixpLAorCQkJICAgICAgKnRtcCAmICgxPDwzMSkgPyAiZmlsbGVkIiA6ICJlbXB0eSIsCisJCQkgICAgICAqKGJ1Zi0+YnVmKSwKKwkJCSAgICAgICp0bXAgJiAoMTw8MTUpPyAib2siOiAiZXJyIiwgKih0bXArNCkpOworCX0KKworCURNRVNHKCJuaWMgYXQgJWQiLAorCQkobmljLW5pY2JlZ2luKSAvIDggLzQpOworCURNRVNHKCJ0YWlsIGF0ICVkIiwgKChpbnQpdGFpbCAtIChpbnQpYmVnaW4pIC84IC80KTsKKwlETUVTRygiaGVhZCBhdCAlZCIsICgoaW50KWhlYWQgLSAoaW50KWJlZ2luKSAvOCAvNCk7CisJRE1FU0coImNoZWNrIGZyZWUgZGVzYyByZXR1cm5zICVkIiwgY2hlY2tfbmljX2Vub3VnaHRfZGVzYyhkZXYscHJpKSk7CisJRE1FU0coImZyZWUgZGVzYyBpcyAlZFxuIiwgZ2V0X2N1cnJfdHhfZnJlZV9kZXNjKGRldixwcmkpKTsKKwkvL3J0bDgxODBfcmVzZXQoZGV2KTsKKwlyZXR1cm47Cit9CisKKworCisvKiB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgZm9yIGRlYnVnZ2luZyBwdXJwb3NlICovCit2b2lkIGNoZWNrX3J4YnVmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXUzMiogdG1wOworCXN0cnVjdCBidWZmZXIgKmJ1ZjsKKwl1OCByeF9kZXNjX3NpemU7CisKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKwlyeF9kZXNjX3NpemUgPSA4OworI2Vsc2UKKwlyeF9kZXNjX3NpemUgPSA0OworI2VuZGlmCisKKwlpZighcHJpdi0+cnhidWZmZXIpCisJCURNRVNHRSAoIk5JQyBSWCBhY2ssIGJ1dCBSWCBxdWV1ZSBjb3JydXB0ZWQhIik7CisKKwllbHNleworCisJCWZvcihidWY9cHJpdi0+cnhidWZmZXIsIHRtcD1wcml2LT5yeHJpbmc7CisJCSAgICB0bXAgPCBwcml2LT5yeHJpbmcrKHByaXYtPnJ4cmluZ2NvdW50KSpyeF9kZXNjX3NpemU7CisJCSAgICB0bXArPXJ4X2Rlc2Nfc2l6ZSwgYnVmPWJ1Zi0+bmV4dCkKKworCQkJRE1FU0coIkJVRiAlcyAleCIsCisJCQkgICAgICAqdG1wICYgKDE8PDMxKSA/ICJlbXB0eSIgOiAiZmlsbGVkIiwKKwkJCSAgICAgICooYnVmLT5idWYpKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKwordm9pZCBkdW1wX2Vwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGk7CisJZm9yKGk9MDsgaTw2MzsgaSsrKQorCQlETUVTRygiRUVQUk9NIGFkZHIgJXggOiAleCIsIGksIGVwcm9tX3JlYWQoZGV2LGkpKTsKK30KKworCit2b2lkIHJ0bDgxODBfZHVtcF9yZWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKwlpbnQgbjsKKwlpbnQgbWF4PTB4ZmY7CisKKwlETUVTRygiRHVtcGluZyBOSUMgcmVnaXN0ZXIgbWFwIik7CisKKwlmb3Iobj0wO248PW1heDspCisJeworCQlwcmludGsoICJcbkQ6ICUyeD4gIiwgbik7CisJCWZvcihpPTA7aTwxNiAmJiBuPD1tYXg7aSsrLG4rKykKKwkJCXByaW50aygiJTJ4ICIscmVhZF9uaWNfYnl0ZShkZXYsbikpOworCX0KKwlwcmludGsoIlxuIik7Cit9CisKKwordm9pZCBmaXhfdHhfZmlmbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIgKnRtcDsKKwlpbnQgaTsKKyNpZmRlZiBERUJVR19UWF9BTExPQworCURNRVNHKCJGSVhJTkcgVFggRklGT3MiKTsKKyNlbmRpZgorCWZvciAodG1wPXByaXYtPnR4bWFwcmluZywgaT0wOworCSAgICAgaSA8IHByaXYtPnR4cmluZ2NvdW50OworCSAgICAgdG1wKz04LCBpKyspeworCQkqdG1wID0gKnRtcCAmfiAoMTw8MzEpOworCX0KKworCWZvciAodG1wPXByaXYtPnR4YmtwcmluZywgaT0wOworCSAgICAgaSA8IHByaXYtPnR4cmluZ2NvdW50OworCSAgICAgdG1wKz04LCBpKyspIHsKKwkJKnRtcCA9ICp0bXAgJn4gKDE8PDMxKTsKKwl9CisKKwlmb3IgKHRtcD1wcml2LT50eGJlcHJpbmcsIGk9MDsKKwkgICAgIGkgPCBwcml2LT50eHJpbmdjb3VudDsKKwkgICAgIHRtcCs9OCwgaSsrKXsKKwkJKnRtcCA9ICp0bXAgJn4gKDE8PDMxKTsKKwl9CisJZm9yICh0bXA9cHJpdi0+dHh2aXByaW5nLCBpPTA7CisJICAgICBpIDwgcHJpdi0+dHhyaW5nY291bnQ7CisJICAgICB0bXArPTgsIGkrKykgeworCQkqdG1wID0gKnRtcCAmfiAoMTw8MzEpOworCX0KKworCWZvciAodG1wPXByaXYtPnR4dm9wcmluZywgaT0wOworCSAgICAgaSA8IHByaXYtPnR4cmluZ2NvdW50OworCSAgICAgdG1wKz04LCBpKyspeworCQkqdG1wID0gKnRtcCAmfiAoMTw8MzEpOworCX0KKworCWZvciAodG1wPXByaXYtPnR4aHByaW5nLCBpPTA7CisJICAgICBpIDwgcHJpdi0+dHhyaW5nY291bnQ7CisJICAgICB0bXArPTgsaSsrKXsKKwkJKnRtcCA9ICp0bXAgJn4gKDE8PDMxKTsKKwl9CisKKwlmb3IgKHRtcD1wcml2LT50eGJlYWNvbnJpbmcsIGk9MDsKKwkgICAgIGkgPCBwcml2LT50eGJlYWNvbmNvdW50OworCSAgICAgdG1wKz04LCBpKyspeworCQkqdG1wID0gKnRtcCAmfiAoMTw8MzEpOworCX0KKyNpZmRlZiBERUJVR19UWF9BTExPQworCURNRVNHKCJUWCBGSUZPcyBGSVhFRCIpOworI2VuZGlmCisJcHJpdi0+dHhtYXByaW5ndGFpbCA9IHByaXYtPnR4bWFwcmluZzsKKwlwcml2LT50eG1hcHJpbmdoZWFkID0gcHJpdi0+dHhtYXByaW5nOworCXByaXYtPnR4bWFwYnVmc3RhaWwgPSBwcml2LT50eG1hcGJ1ZnM7CisKKwlwcml2LT50eGJrcHJpbmd0YWlsID0gcHJpdi0+dHhia3ByaW5nOworCXByaXYtPnR4YmtwcmluZ2hlYWQgPSBwcml2LT50eGJrcHJpbmc7CisJcHJpdi0+dHhia3BidWZzdGFpbCA9IHByaXYtPnR4YmtwYnVmczsKKworCXByaXYtPnR4YmVwcmluZ3RhaWwgPSBwcml2LT50eGJlcHJpbmc7CisJcHJpdi0+dHhiZXByaW5naGVhZCA9IHByaXYtPnR4YmVwcmluZzsKKwlwcml2LT50eGJlcGJ1ZnN0YWlsID0gcHJpdi0+dHhiZXBidWZzOworCisJcHJpdi0+dHh2aXByaW5ndGFpbCA9IHByaXYtPnR4dmlwcmluZzsKKwlwcml2LT50eHZpcHJpbmdoZWFkID0gcHJpdi0+dHh2aXByaW5nOworCXByaXYtPnR4dmlwYnVmc3RhaWwgPSBwcml2LT50eHZpcGJ1ZnM7CisKKwlwcml2LT50eHZvcHJpbmd0YWlsID0gcHJpdi0+dHh2b3ByaW5nOworCXByaXYtPnR4dm9wcmluZ2hlYWQgPSBwcml2LT50eHZvcHJpbmc7CisJcHJpdi0+dHh2b3BidWZzdGFpbCA9IHByaXYtPnR4dm9wYnVmczsKKworCXByaXYtPnR4aHByaW5ndGFpbCA9IHByaXYtPnR4aHByaW5nOworCXByaXYtPnR4aHByaW5naGVhZCA9IHByaXYtPnR4aHByaW5nOworCXByaXYtPnR4aHBidWZzdGFpbCA9IHByaXYtPnR4aHBidWZzOworCisJcHJpdi0+dHhiZWFjb25yaW5ndGFpbCA9IHByaXYtPnR4YmVhY29ucmluZzsKKwlwcml2LT50eGJlYWNvbmJ1ZnN0YWlsID0gcHJpdi0+dHhiZWFjb25idWZzOworCXNldF9uaWNfdHhyaW5nKGRldik7CisKKwlpZWVlODAyMTFfcmVzZXRfcXVldWUocHJpdi0+aWVlZTgwMjExKTsKKwlwcml2LT5hY2tfdHhfdG9faWVlZSA9IDA7Cit9CisKKwordm9pZCBmaXhfcnhfZmlmbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIgKnRtcDsKKwlzdHJ1Y3QgYnVmZmVyICpyeGJ1ZjsKKwl1OCByeF9kZXNjX3NpemU7CisKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKwlyeF9kZXNjX3NpemUgPSA4OyAvLyA0KjggPSAzMiBieXRlcworI2Vsc2UKKwlyeF9kZXNjX3NpemUgPSA0OworI2VuZGlmCisKKyNpZmRlZiBERUJVR19SWEFMTE9DCisJRE1FU0coIkZJWElORyBSWCBGSUZPIik7CisJY2hlY2tfcnhidWYoZGV2KTsKKyNlbmRpZgorCisJZm9yICh0bXA9cHJpdi0+cnhyaW5nLCByeGJ1Zj1wcml2LT5yeGJ1ZmZlcmhlYWQ7CisJICAgICAodG1wIDwgKHByaXYtPnJ4cmluZykrKHByaXYtPnJ4cmluZ2NvdW50KSpyeF9kZXNjX3NpemUpOworCSAgICAgdG1wKz1yeF9kZXNjX3NpemUscnhidWY9cnhidWYtPm5leHQpeworCQkqKHRtcCsyKSA9IHJ4YnVmLT5kbWE7CisJCSp0bXA9KnRtcCAmfiAweGZmZjsKKwkJKnRtcD0qdG1wIHwgcHJpdi0+cnhidWZmZXJzaXplOworCQkqdG1wIHw9ICgxPDwzMSk7CisJfQorCisjaWZkZWYgREVCVUdfUlhBTExPQworCURNRVNHKCJSWCBGSUZPIEZJWEVEIik7CisJY2hlY2tfcnhidWYoZGV2KTsKKyNlbmRpZgorCisJcHJpdi0+cnhyaW5ndGFpbD1wcml2LT5yeHJpbmc7CisJcHJpdi0+cnhidWZmZXI9cHJpdi0+cnhidWZmZXJoZWFkOworCXByaXYtPnJ4X3NrYl9jb21wbGV0ZT0xOworCXNldF9uaWNfcnhyaW5nKGRldik7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUhXIFNUVUZGLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordW5zaWduZWQgY2hhciBRVUFMSVRZX01BUFtdID0geworICAweDY0LCAweDY0LCAweDY0LCAweDYzLCAweDYzLCAweDYyLCAweDYyLCAweDYxLAorICAweDYxLCAweDYwLCAweDYwLCAweDVmLCAweDVmLCAweDVlLCAweDVkLCAweDVjLAorICAweDViLCAweDVhLCAweDU5LCAweDU3LCAweDU2LCAweDU0LCAweDUyLCAweDRmLAorICAweDRjLCAweDQ5LCAweDQ1LCAweDQxLCAweDNjLCAweDM3LCAweDMxLCAweDI5LAorICAweDI0LCAweDIyLCAweDIyLCAweDIyLCAweDIyLCAweDIyLCAweDIyLCAweDIyLAorICAweDIyLCAweDIyLCAweDIxLCAweDIxLCAweDIxLCAweDIxLCAweDIxLCAweDIwLAorICAweDIwLCAweDIwLCAweDIwLCAweDFmLCAweDFmLCAweDFlLCAweDFlLCAweDFlLAorICAweDFkLCAweDFkLCAweDFjLCAweDFjLCAweDFiLCAweDFhLCAweDE5LCAweDE5LAorICAweDE4LCAweDE3LCAweDE2LCAweDE1LCAweDE0LCAweDEyLCAweDExLCAweDBmLAorICAweDBlLCAweDBjLCAweDBhLCAweDA4LCAweDA2LCAweDA0LCAweDAxLCAweDAwCit9OworCit1bnNpZ25lZCBjaGFyIFNUUkVOR1RIX01BUFtdID0geworICAweDY0LCAweDY0LCAweDYzLCAweDYyLCAweDYxLCAweDYwLCAweDVmLCAweDVlLAorICAweDVkLCAweDVjLCAweDViLCAweDVhLCAweDU3LCAweDU0LCAweDUyLCAweDUwLAorICAweDRlLCAweDRjLCAweDRhLCAweDQ4LCAweDQ2LCAweDQ0LCAweDQxLCAweDNmLAorICAweDNjLCAweDNhLCAweDM3LCAweDM2LCAweDM2LCAweDFjLCAweDFjLCAweDFiLAorICAweDFiLCAweDFhLCAweDFhLCAweDE5LCAweDE5LCAweDE4LCAweDE4LCAweDE3LAorICAweDE3LCAweDE2LCAweDE2LCAweDE1LCAweDE1LCAweDE0LCAweDE0LCAweDEzLAorICAweDEzLCAweDEyLCAweDEyLCAweDExLCAweDExLCAweDEwLCAweDEwLCAweDBmLAorICAweDBmLCAweDBlLCAweDBlLCAweDBkLCAweDBkLCAweDBjLCAweDBjLCAweDBiLAorICAweDBiLCAweDBhLCAweDBhLCAweDA5LCAweDA5LCAweDA4LCAweDA4LCAweDA3LAorICAweDA3LCAweDA2LCAweDA2LCAweDA1LCAweDA0LCAweDAzLCAweDAyLCAweDAwCit9OworCit2b2lkIHJ0bDgxODBfUlNTSV9jYWxjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICpyc3NpLCB1OCAqcXVhbCl7CisJLy92b2lkIE1sbWVfVXBkYXRlUnNzaVNRKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICpyc3NpLCB1OCAqcXVhbCl7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXUzMiB0ZW1wOworCXUzMiB0ZW1wMjsKKwl1MzIgdGVtcDM7CisJdTMyIGxzYjsKKwl1MzIgcTsKKwl1MzIgb3JpZ19xdWFsOworCXU4ICBfcnNzaTsKKworCXEgPSAqcXVhbDsKKwlvcmlnX3F1YWwgPSAqcXVhbDsKKwlfcnNzaSA9IDA7IC8vIGF2b2lkIGdjYyBjb21wbGFpbnMuLgorCisJaWYgKHEgPD0gMHg0ZSkgeworCQl0ZW1wID0gUVVBTElUWV9NQVBbcV07CisJfSBlbHNlIHsKKwkJaWYoIHEgJiAweDgwICkgeworCQkJdGVtcCA9IDB4MzI7CisJCX0gZWxzZSB7CisJCQl0ZW1wID0gMTsKKwkJfQorCX0KKworCSpxdWFsID0gdGVtcDsKKwl0ZW1wMiA9ICpyc3NpOworCisJc3dpdGNoKHByaXYtPnJmX2NoaXApeworCWNhc2UgUkZDSElQSURfUkZNRDoKKwkJbHNiID0gdGVtcDIgJiAxOworCQl0ZW1wMiAmPSAweDdlOworCQlpZiAoICFsc2IgfHwgISh0ZW1wMiA8PSAweDNjKSApIHsKKwkJCXRlbXAyID0gMHg2NDsKKwkJfSBlbHNlIHsKKwkJCXRlbXAyID0gMTAwICogdGVtcDIgLyAweDNjOworCQl9CisJCSpyc3NpID0gdGVtcDIgJiAweGZmOworCQlfcnNzaSA9IHRlbXAyICYgMHhmZjsKKwkJYnJlYWs7CisJY2FzZSBSRkNISVBJRF9JTlRFUlNJTDoKKwkJbHNiID0gdGVtcDI7CisJCXRlbXAyICY9IDB4ZmZmZmZmZmU7CisJCXRlbXAyICo9IDI1MTsKKwkJdGVtcDMgPSB0ZW1wMjsKKwkJdGVtcDIgPDw9IDY7CisJCXRlbXAzICs9IHRlbXAyOworCQl0ZW1wMyA8PD0gMTsKKwkJdGVtcDIgPSAweDQ5NTBkZjsKKwkJdGVtcDIgLT0gdGVtcDM7CisJCWxzYiAmPSAxOworCQlpZiAoIHRlbXAyIDw9IDB4M2UwMDAwICkgeworCQkJaWYgKCB0ZW1wMiA8IDB4ZmZlZjAwMDAgKQorCQkJCXRlbXAyID0gMHhmZmVmMDAwMDsKKwkJfSBlbHNlIHsKKwkJCXRlbXAyID0gMHgzZTAwMDA7CisJCX0KKwkJaWYgKCAhbHNiICkgeworCQkJdGVtcDIgLT0gMHhmMDAwMDsKKwkJfSBlbHNlIHsKKwkJCXRlbXAyICs9IDB4ZjAwMDA7CisJCX0KKworCQl0ZW1wMyA9IDB4NGQwMDAwOworCQl0ZW1wMyAtPSB0ZW1wMjsKKwkJdGVtcDMgKj0gMTAwOworCQl0ZW1wMyA9IHRlbXAzIC8gMHg2ZDsKKwkJdGVtcDMgPj49IDB4MTA7CisJCV9yc3NpID0gdGVtcDMgJiAweGZmOworCQkqcnNzaSA9IHRlbXAzICYgMHhmZjsKKwkJYnJlYWs7CisJY2FzZSBSRkNISVBJRF9HQ1Q6CisJICAgICAgICBsc2IgPSB0ZW1wMiAmIDE7CisJCXRlbXAyICY9IDB4N2U7CisJCWlmICggISBsc2IgfHwgISh0ZW1wMiA8PSAweDNjKSApeworCQkJdGVtcDIgPSAweDY0OworCQl9IGVsc2UgeworCQkJdGVtcDIgPSAoMTAwICogdGVtcDIpIC8gMHgzYzsKKwkJfQorCQkqcnNzaSA9IHRlbXAyICYgMHhmZjsKKwkJX3Jzc2kgPSB0ZW1wMiAmIDB4ZmY7CisJCWJyZWFrOworCWNhc2UgUkZDSElQSURfUEhJTElQUzoKKwkJaWYoIG9yaWdfcXVhbCA8PSAweDRlICl7CisJCQlfcnNzaSA9IFNUUkVOR1RIX01BUFtvcmlnX3F1YWxdOworCQkJKnJzc2kgPSBfcnNzaTsKKwkJfSBlbHNlIHsKKwkJCW9yaWdfcXVhbCAtPSAweDgwOworCQkJaWYgKCAhb3JpZ19xdWFsICl7CisJCQkJX3Jzc2kgPSAxOworCQkJCSpyc3NpID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJX3Jzc2kgPSAweDMyOworCQkJCSpyc3NpID0gMHgzMjsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCS8qIGNhc2UgNCAqLworCWNhc2UgUkZDSElQSURfTUFYSU06CisJCWxzYiA9IHRlbXAyICYgMTsKKwkJdGVtcDIgJj0gMHg3ZTsKKwkJdGVtcDIgPj49IDE7CisJCXRlbXAyICs9IDB4NDI7CisJCWlmKCBsc2IgIT0gMCApeworCQkJdGVtcDIgKz0gMHhhOworCQl9CisJCSpyc3NpID0gdGVtcDIgJiAweGZmOworCQlfcnNzaSA9IHRlbXAyICYgMHhmZjsKKwkJYnJlYWs7CisJfQorCisJaWYgKCBfcnNzaSA8IDB4NjQgKXsKKwkJaWYgKCBfcnNzaSA9PSAwICkgeworCQkJKnJzc2kgPSAxOworCQl9CisJfSBlbHNlIHsKKwkJKnJzc2kgPSAweDY0OworCX0KKworCXJldHVybjsKK30KKworCit2b2lkIHJ0bDgxODBfaXJxX2VuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlwcml2LT5pcnFfZW5hYmxlZCA9IDE7CisvKgorCXdyaXRlX25pY193b3JkKGRldixJTlRBX01BU0ssSU5UQV9SWE9LIHwgSU5UQV9SWERFU0NFUlIgfCBJTlRBX1JYT1ZFUkZMT1cgfFwKKwlJTlRBX1RYT1ZFUkZMT1cgfCBJTlRBX0hJUFJJT1JJVFlERVNDRVJSIHwgSU5UQV9ISVBSSU9SSVRZREVTQ09LIHxcCisJSU5UQV9OT1JNUFJJT1JJVFlERVNDRVJSIHwgSU5UQV9OT1JNUFJJT1JJVFlERVNDT0sgfFwKKwlJTlRBX0xPV1BSSU9SSVRZREVTQ0VSUiB8IElOVEFfTE9XUFJJT1JJVFlERVNDT0sgfCBJTlRBX1RJTUVPVVQpOworKi8KKwl3cml0ZV9uaWNfd29yZChkZXYsSU5UQV9NQVNLLCBwcml2LT5pcnFfbWFzayk7Cit9CisKKwordm9pZCBydGw4MTgwX2lycV9kaXNhYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisJd3JpdGVfbmljX2R3b3JkKGRldixJTVIsMCk7CisjZWxzZQorCXdyaXRlX25pY193b3JkKGRldixJTlRBX01BU0ssMCk7CisjZW5kaWYKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCXByaXYtPmlycV9lbmFibGVkID0gMDsKK30KKworCit2b2lkIHJ0bDgxODBfc2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldixpbnQgbW9kZSkKK3sKKwl1OCBlY21kOworCWVjbWQ9cmVhZF9uaWNfYnl0ZShkZXYsIEVQUk9NX0NNRCk7CisJZWNtZD1lY21kICZ+IEVQUk9NX0NNRF9PUEVSQVRJTkdfTU9ERV9NQVNLOworCWVjbWQ9ZWNtZCB8IChtb2RlPDxFUFJPTV9DTURfT1BFUkFUSU5HX01PREVfU0hJRlQpOworCWVjbWQ9ZWNtZCAmfiAoMTw8RVBST01fQ1NfU0hJRlQpOworCWVjbWQ9ZWNtZCAmfiAoMTw8RVBST01fQ0tfU0hJRlQpOworCXdyaXRlX25pY19ieXRlKGRldiwgRVBST01fQ01ELCBlY21kKTsKK30KKwordm9pZCBydGw4MTgwX2FkYXB0ZXJfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxODBfYmVhY29uX3R4X2VuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwordm9pZCBydGw4MTgwX3VwZGF0ZV9tc3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTggbXNyOworCXUzMiByeGNvbmY7CisKKwltc3IgID0gcmVhZF9uaWNfYnl0ZShkZXYsIE1TUik7CisJbXNyICY9IH4gTVNSX0xJTktfTUFTSzsKKworCXJ4Y29uZj1yZWFkX25pY19kd29yZChkZXYsUlhfQ09ORik7CisKKwlpZihwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpCisJeworCQlpZihwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykKKwkJCW1zciB8PSAoTVNSX0xJTktfQURIT0M8PE1TUl9MSU5LX1NISUZUKTsKKwkJZWxzZSBpZiAocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKQorCQkJbXNyIHw9IChNU1JfTElOS19NQVNURVI8PE1TUl9MSU5LX1NISUZUKTsKKwkJZWxzZSBpZiAocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpCisJCQltc3IgfD0gKE1TUl9MSU5LX01BTkFHRUQ8PE1TUl9MSU5LX1NISUZUKTsKKwkJZWxzZQorCQkJbXNyIHw9IChNU1JfTElOS19OT05FPDxNU1JfTElOS19TSElGVCk7CisJCXJ4Y29uZiB8PSAoMTw8UlhfQ0hFQ0tfQlNTSURfU0hJRlQpOworCisJfWVsc2UgeworCQltc3IgfD0gKE1TUl9MSU5LX05PTkU8PE1TUl9MSU5LX1NISUZUKTsKKwkJcnhjb25mICY9IH4oMTw8UlhfQ0hFQ0tfQlNTSURfU0hJRlQpOworCX0KKworCXdyaXRlX25pY19ieXRlKGRldiwgTVNSLCBtc3IpOworCXdyaXRlX25pY19kd29yZChkZXYsIFJYX0NPTkYsIHJ4Y29uZik7CisKK30KKworCisKK3ZvaWQgcnRsODE4MF9zZXRfY2hhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHNob3J0IGNoKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWlmKChjaCA+IDE0KSB8fCAoY2ggPCAxKSkKKwl7CisJCXByaW50aygiSW4gJXM6IEludmFsaWQgY2huYW5lbCAlZFxuIiwgX19mdW5jX18sIGNoKTsKKwkJcmV0dXJuOworCX0KKworCXByaXYtPmNoYW49Y2g7CisJLy9wcmludGsoImluICVzOmNoYW5uZWwgaXMgJWRcbiIsX19mdW5jX18sY2gpOworCXByaXYtPnJmX3NldF9jaGFuKGRldixwcml2LT5jaGFuKTsKKworfQorCisKK3ZvaWQgcnRsODE4MF9yeF9lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1OCBjbWQ7CisJdTMyIHJ4Y29uZjsKKwkvKiBmb3Igbm93IHdlIGFjY2VwdCBkYXRhLCBtYW5hZ2VtZW50ICYgY3RsIGZyYW1lKi8KKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwlyeGNvbmY9cmVhZF9uaWNfZHdvcmQoZGV2LFJYX0NPTkYpOworCXJ4Y29uZiA9IHJ4Y29uZiAmfiBNQUNfRklMVEVSX01BU0s7CisJcnhjb25mID0gcnhjb25mIHwgKDE8PEFDQ0VQVF9NTkdfRlJBTUVfU0hJRlQpOworCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxBQ0NFUFRfREFUQV9GUkFNRV9TSElGVCk7CisJcnhjb25mID0gcnhjb25mIHwgKDE8PEFDQ0VQVF9CQ0FTVF9GUkFNRV9TSElGVCk7CisJcnhjb25mID0gcnhjb25mIHwgKDE8PEFDQ0VQVF9NQ0FTVF9GUkFNRV9TSElGVCk7CisvLwlyeGNvbmYgPSByeGNvbmYgfCAoMTw8QUNDRVBUX0NSQ0VSUl9GUkFNRV9TSElGVCk7CisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgRE1FU0cgKCJOSUMgaW4gcHJvbWlzYyBtb2RlIik7CisKKwlpZihwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SIHx8IFwKKwkgICBkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpeworCQlyeGNvbmYgPSByeGNvbmYgfCAoMTw8QUNDRVBUX0FMTE1BQ19GUkFNRV9TSElGVCk7CisJfWVsc2V7CisJCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxBQ0NFUFRfTklDTUFDX0ZSQU1FX1NISUZUKTsKKwkJaWYocHJpdi0+Y2FyZF84MTg1ID09IDApCisJCQlyeGNvbmYgPSByeGNvbmYgfCAoMTw8UlhfQ0hFQ0tfQlNTSURfU0hJRlQpOworCX0KKworCS8qaWYocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKXsKKwkJcnhjb25mID0gcnhjb25mIHwgKDE8PEFDQ0VQVF9BTExNQUNfRlJBTUVfU0hJRlQpOworCQlyeGNvbmYgPSByeGNvbmYgfCAoMTw8UlhfQ0hFQ0tfQlNTSURfU0hJRlQpOworCX0qLworCisJaWYocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUil7CisJCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxBQ0NFUFRfQ1RMX0ZSQU1FX1NISUZUKTsKKwkJcnhjb25mID0gcnhjb25mIHwgKDE8PEFDQ0VQVF9JQ1ZFUlJfRlJBTUVfU0hJRlQpOworCQlyeGNvbmYgPSByeGNvbmYgfCAoMTw8QUNDRVBUX1BXUl9GUkFNRV9TSElGVCk7CisJfQorCisJaWYoIHByaXYtPmNyY21vbiA9PSAxICYmIHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpCisJCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxBQ0NFUFRfQ1JDRVJSX0ZSQU1FX1NISUZUKTsKKworCS8vaWYoIXByaXYtPmNhcmRfODE4NSl7CisJCXJ4Y29uZiA9IHJ4Y29uZiAmfiBSWF9GSUZPX1RIUkVTSE9MRF9NQVNLOworCQlyeGNvbmYgPSByeGNvbmYgfCAoUlhfRklGT19USFJFU0hPTERfTk9ORTw8UlhfRklGT19USFJFU0hPTERfU0hJRlQpOworCS8vfQorCisJcnhjb25mID0gcnhjb25mIHwgKDE8PFJYX0FVVE9SRVNFVFBIWV9TSElGVCk7CisJcnhjb25mID0gcnhjb25mICZ+IE1BWF9SWF9ETUFfTUFTSzsKKwlyeGNvbmYgPSByeGNvbmYgfCAoTUFYX1JYX0RNQV8yMDQ4PDxNQVhfUlhfRE1BX1NISUZUKTsKKworCS8vaWYoIXByaXYtPmNhcmRfODE4NSkKKwkJcnhjb25mID0gcnhjb25mIHwgUkNSX09OTFlFUkxQS1Q7CisKKwlyeGNvbmYgPSByeGNvbmYgJn4gUkNSX0NTX01BU0s7CisJaWYoIXByaXYtPmNhcmRfODE4NSkKKwkJcnhjb25mIHw9IChwcml2LT5yY3JfY3NlbnNlPDxSQ1JfQ1NfU0hJRlQpOworLy8Jcnhjb25mICY9fiAweGZmZjAwMDAwOworLy8Jcnhjb25mIHw9IDB4OTAxMDAwMDA7Ly85MDE0Zjc2ZjsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSWF9DT05GLCByeGNvbmYpOworCisJZml4X3J4X2ZpZm8oZGV2KTsKKworI2lmZGVmIERFQlVHX1JYCisJRE1FU0coInJ4Y29uZjogJXggJXgiLHJ4Y29uZiAscmVhZF9uaWNfZHdvcmQoZGV2LFJYX0NPTkYpKTsKKyNlbmRpZgorCWNtZD1yZWFkX25pY19ieXRlKGRldixDTUQpOworCXdyaXRlX25pY19ieXRlKGRldixDTUQsY21kIHwgKDE8PENNRF9SWF9FTkFCTEVfU0hJRlQpKTsKKworCS8qIEluIHJ0bDgxMzkgZHJpdmVyIHNlZW1zIHRoYXQgRE1BIHRocmVzaG9sZCBoYXMgdG8gYmUgd3JpdHRlbgorCSAqICBhZnRlciBlbmFibGluZyBSWCwgc28gd2UgcmV3cml0ZSBSWF9DT05GSUcgcmVnaXN0ZXIKKwkgKi8KKwkvL21kZWxheSgxMDApOworLy8Jd3JpdGVfbmljX2R3b3JkKGRldiwgUlhfQ09ORiwgcnhjb25mKTsKKworfQorCisKK3ZvaWQgc2V0X25pY190eHJpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisvLwkJRE1FU0coInJpbmcgJXggJXgiLCBwcml2LT50eGxwcmluZ2RtYSxyZWFkX25pY19kd29yZChkZXYsVExQREEpKTsKKworCXdyaXRlX25pY19kd29yZChkZXYsIFRYX01BTkFHRVBSSU9SSVRZX1JJTkdfQUREUiwgcHJpdi0+dHhtYXByaW5nZG1hKTsKKy8vCQlETUVTRygicmluZyAleCAleCIsIHByaXYtPnR4bHByaW5nZG1hLHJlYWRfbmljX2R3b3JkKGRldixUTFBEQSkpOworCXdyaXRlX25pY19kd29yZChkZXYsIFRYX0JLUFJJT1JJVFlfUklOR19BRERSLCBwcml2LT50eGJrcHJpbmdkbWEpOworLy8JCURNRVNHKCJyaW5nICV4ICV4IiwgcHJpdi0+dHhscHJpbmdkbWEscmVhZF9uaWNfZHdvcmQoZGV2LFRMUERBKSk7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgVFhfQkVQUklPUklUWV9SSU5HX0FERFIsIHByaXYtPnR4YmVwcmluZ2RtYSk7CisvLwkJRE1FU0coInJpbmcgJXggJXgiLCBwcml2LT50eGxwcmluZ2RtYSxyZWFkX25pY19kd29yZChkZXYsVExQREEpKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBUWF9WSVBSSU9SSVRZX1JJTkdfQUREUiwgcHJpdi0+dHh2aXByaW5nZG1hKTsKKy8vCQlETUVTRygicmluZyAleCAleCIsIHByaXYtPnR4bHByaW5nZG1hLHJlYWRfbmljX2R3b3JkKGRldixUTFBEQSkpOworCXdyaXRlX25pY19kd29yZChkZXYsIFRYX1ZPUFJJT1JJVFlfUklOR19BRERSLCBwcml2LT50eHZvcHJpbmdkbWEpOworLy8JCURNRVNHKCJyaW5nICV4ICV4IiwgcHJpdi0+dHhscHJpbmdkbWEscmVhZF9uaWNfZHdvcmQoZGV2LFRMUERBKSk7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgVFhfSElHSFBSSU9SSVRZX1JJTkdfQUREUiwgcHJpdi0+dHhocHJpbmdkbWEpOworLy8JCURNRVNHKCJyaW5nICV4ICV4IiwgcHJpdi0+dHhscHJpbmdkbWEscmVhZF9uaWNfZHdvcmQoZGV2LFRMUERBKSk7CisKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBUWF9CRUFDT05fUklOR19BRERSLCBwcml2LT50eGJlYWNvbnJpbmdkbWEpOworfQorCisKK3ZvaWQgcnRsODE4MF9jb250dHhfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdTMyIHR4Y29uZjsKKwl0eGNvbmYgPSByZWFkX25pY19kd29yZChkZXYsVFhfQ09ORik7CisJdHhjb25mID0gdHhjb25mICZ+IFRYX0xPT1BCQUNLX01BU0s7CisJdHhjb25mID0gdHhjb25mIHwgKFRYX0xPT1BCQUNLX0NPTlRJTlVFIDw8VFhfTE9PUEJBQ0tfU0hJRlQpOworCXdyaXRlX25pY19kd29yZChkZXYsVFhfQ09ORix0eGNvbmYpOworfQorCisKK3ZvaWQgcnRsODE4MF9jb250dHhfZGlzYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXUzMiB0eGNvbmY7CisJdHhjb25mID0gcmVhZF9uaWNfZHdvcmQoZGV2LFRYX0NPTkYpOworCXR4Y29uZiA9IHR4Y29uZiAmfiBUWF9MT09QQkFDS19NQVNLOworCXR4Y29uZiA9IHR4Y29uZiB8IChUWF9MT09QQkFDS19OT05FIDw8VFhfTE9PUEJBQ0tfU0hJRlQpOworCXdyaXRlX25pY19kd29yZChkZXYsVFhfQ09ORix0eGNvbmYpOworfQorCisKK3ZvaWQgcnRsODE4MF90eF9lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1OCBjbWQ7CisJdTggdHhfYWdjX2N0bDsKKwl1OCBieXRlOworCXUzMiB0eGNvbmY7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXR4Y29uZj0gcmVhZF9uaWNfZHdvcmQoZGV2LFRYX0NPTkYpOworCisKKwlpZihwcml2LT5jYXJkXzgxODUpeworCisKKwkJYnl0ZSA9IHJlYWRfbmljX2J5dGUoZGV2LENXX0NPTkYpOworCQlieXRlICY9IH4oMTw8Q1dfQ09ORl9QRVJQQUNLRVRfQ1dfU0hJRlQpOworCQlieXRlICY9IH4oMTw8Q1dfQ09ORl9QRVJQQUNLRVRfUkVUUllfU0hJRlQpOworCQl3cml0ZV9uaWNfYnl0ZShkZXYsIENXX0NPTkYsIGJ5dGUpOworCisJCXR4X2FnY19jdGwgPSByZWFkX25pY19ieXRlKGRldiwgVFhfQUdDX0NUTCk7CisJCXR4X2FnY19jdGwgJj0gfigxPDxUWF9BR0NfQ1RMX1BFUlBBQ0tFVF9HQUlOX1NISUZUKTsKKwkJdHhfYWdjX2N0bCAmPSB+KDE8PFRYX0FHQ19DVExfUEVSUEFDS0VUX0FOVFNFTF9TSElGVCk7CisJCXR4X2FnY19jdGwgfD0oMTw8VFhfQUdDX0NUTF9GRUVEQkFDS19BTlQpOworCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFRYX0FHQ19DVEwsIHR4X2FnY19jdGwpOworCQkvKgorCQl3cml0ZV9uaWNfd29yZChkZXYsIDB4NWUsIDB4MDEpOworCQlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCQltZGVsYXkoMSk7CisJCXdyaXRlX25pY193b3JkKGRldiwgMHhmZSwgMHgxMCk7CisJCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJCW1kZWxheSgxKTsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCAweDVlLCAweDAwKTsKKwkJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwkJbWRlbGF5KDEpOworCQkqLworCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4ZWMsIDB4M2YpOyAvKiBEaXNhYmxlIGVhcmx5IFRYICovCisJfQorCisJaWYocHJpdi0+Y2FyZF84MTg1KXsKKworCQl0eGNvbmYgPSB0eGNvbmYgJn4gKDE8PFRDUl9QUk9CRV9OT1RJTUVTVEFNUF9TSElGVCk7CisKKwl9ZWxzZXsKKworCQlpZihod3NlcW51bSkKKwkJCXR4Y29uZj0gdHhjb25mICZ+ICgxPDxUWF9DT05GX0hFQURFUl9BVVRPSUNSRU1FTlRfU0hJRlQpOworCQllbHNlCisJCQl0eGNvbmY9IHR4Y29uZiB8ICgxPDxUWF9DT05GX0hFQURFUl9BVVRPSUNSRU1FTlRfU0hJRlQpOworCX0KKworCXR4Y29uZiA9IHR4Y29uZiAmfiBUWF9MT09QQkFDS19NQVNLOworCXR4Y29uZiA9IHR4Y29uZiB8IChUWF9MT09QQkFDS19OT05FIDw8VFhfTE9PUEJBQ0tfU0hJRlQpOworCXR4Y29uZiA9IHR4Y29uZiAmfiBUQ1JfRFBSRVRSWV9NQVNLOworCXR4Y29uZiA9IHR4Y29uZiAmfiBUQ1JfUlRTUkVUUllfTUFTSzsKKwl0eGNvbmYgPSB0eGNvbmYgfCAocHJpdi0+cmV0cnlfZGF0YTw8VFhfRFBSRVRSWV9TSElGVCk7CisJdHhjb25mID0gdHhjb25mIHwgKHByaXYtPnJldHJ5X3J0czw8VFhfUlRTUkVUUllfU0hJRlQpOworCXR4Y29uZiA9IHR4Y29uZiAmfiAoMTw8VFhfTk9DUkNfU0hJRlQpOworCisJaWYocHJpdi0+Y2FyZF84MTg1KXsKKwkJaWYocHJpdi0+aHdfcGxjcF9sZW4pCisJCQl0eGNvbmYgPSB0eGNvbmYgJn4gVENSX1BMQ1BfTEVOOworCQllbHNlCisJCQl0eGNvbmYgPSB0eGNvbmYgfCBUQ1JfUExDUF9MRU47CisJfWVsc2V7CisJCXR4Y29uZiA9IHR4Y29uZiAmfiBUQ1JfU0FUOworCX0KKwl0eGNvbmYgPSB0eGNvbmYgJn4gVENSX01YRE1BX01BU0s7CisJdHhjb25mID0gdHhjb25mIHwgKFRDUl9NWERNQV8yMDQ4PDxUQ1JfTVhETUFfU0hJRlQpOworCXR4Y29uZiA9IHR4Y29uZiB8IFRDUl9DV01JTjsKKwl0eGNvbmYgPSB0eGNvbmYgfCBUQ1JfRElTQ1c7CisKKy8vCWlmKHByaXYtPmllZWU4MDIxMS0+aHdfd2VwKQorLy8JCXR4Y29uZj10eGNvbmYgJn4gKDE8PFRYX05PSUNWX1NISUZUKTsKKy8vCWVsc2UKKwkJdHhjb25mPXR4Y29uZiB8ICgxPDxUWF9OT0lDVl9TSElGVCk7CisKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LFRYX0NPTkYsdHhjb25mKTsKKworCisJZml4X3R4X2ZpZm8oZGV2KTsKKworI2lmZGVmIERFQlVHX1RYCisJRE1FU0coInR4Y29uZjogJXggJXgiLHR4Y29uZixyZWFkX25pY19kd29yZChkZXYsVFhfQ09ORikpOworI2VuZGlmCisKKwljbWQ9cmVhZF9uaWNfYnl0ZShkZXYsQ01EKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsQ01ELGNtZCB8ICgxPDxDTURfVFhfRU5BQkxFX1NISUZUKSk7CisKKy8vCW1kZWxheSgxMDApOworCXdyaXRlX25pY19kd29yZChkZXYsVFhfQ09ORix0eGNvbmYpOworLy8JI2VuZGlmCisvKgorCXJ0bDgxODBfc2V0X21vZGUoZGV2LEVQUk9NX0NNRF9DT05GSUcpOworCXdyaXRlX25pY19ieXRlKGRldiwgVFhfRE1BX1BPTExJTkcsIHByaXYtPmRtYV9wb2xsX21hc2spOworCXJ0bDgxODBfc2V0X21vZGUoZGV2LEVQUk9NX0NNRF9OT1JNQUwpOworCSovCit9CisKKwordm9pZCBydGw4MTgwX2JlYWNvbl90eF9lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwlydGw4MTgwX3NldF9tb2RlKGRldixFUFJPTV9DTURfQ09ORklHKTsKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKwlwcml2LT5kbWFfcG9sbF9zdG9wX21hc2sgJj0gfihUUFBPTExTVE9QX0JRKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsVFBQb2xsU3RvcCwgcHJpdi0+ZG1hX3BvbGxfbWFzayk7CisjZWxzZQorCXByaXYtPmRtYV9wb2xsX21hc2sgJj1+KDE8PFRYX0RNQV9TVE9QX0JFQUNPTl9TSElGVCk7CisJd3JpdGVfbmljX2J5dGUoZGV2LFRYX0RNQV9QT0xMSU5HLHByaXYtPmRtYV9wb2xsX21hc2spOworI2VuZGlmCisJcnRsODE4MF9zZXRfbW9kZShkZXYsRVBST01fQ01EX05PUk1BTCk7Cit9CisKKwordm9pZCBydGw4MTgwX2JlYWNvbl90eF9kaXNhYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisJcnRsODE4MF9zZXRfbW9kZShkZXYsRVBST01fQ01EX0NPTkZJRyk7CisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisJcHJpdi0+ZG1hX3BvbGxfc3RvcF9tYXNrIHw9IFRQUE9MTFNUT1BfQlE7CisJd3JpdGVfbmljX2J5dGUoZGV2LFRQUG9sbFN0b3AsIHByaXYtPmRtYV9wb2xsX3N0b3BfbWFzayk7CisjZWxzZQorCXByaXYtPmRtYV9wb2xsX21hc2sgfD0gKDE8PFRYX0RNQV9TVE9QX0JFQUNPTl9TSElGVCk7CisJd3JpdGVfbmljX2J5dGUoZGV2LFRYX0RNQV9QT0xMSU5HLHByaXYtPmRtYV9wb2xsX21hc2spOworI2VuZGlmCisJcnRsODE4MF9zZXRfbW9kZShkZXYsRVBST01fQ01EX05PUk1BTCk7CisKK30KKworCit2b2lkIHJ0bDgxODBfcnR4X2Rpc2FibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1OCBjbWQ7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJY21kPXJlYWRfbmljX2J5dGUoZGV2LENNRCk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBDTUQsIGNtZCAmfiBcCisJCSAgICAgICAoKDE8PENNRF9SWF9FTkFCTEVfU0hJRlQpfCgxPDxDTURfVFhfRU5BQkxFX1NISUZUKSkpOworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJbWRlbGF5KDEwKTsKKwkvKndoaWxlIChyZWFkX25pY19ieXRlKGRldixDTUQpICYgKDE8PENNRF9SWF9FTkFCTEVfU0hJRlQpKQorCSAgdWRlbGF5KDEwKTsKKwkqLworCisJaWYoIXByaXYtPnJ4X3NrYl9jb21wbGV0ZSkKKwkJZGV2X2tmcmVlX3NrYl9hbnkocHJpdi0+cnhfc2tiKTsKK30KKworI2lmIDAKK2ludCBhbGxvY190eF9iZWFjb25fZGVzY19yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCkKK3sKKwlpbnQgaTsKKwl1MzIgKnRtcDsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwlwcml2LT50eGJlYWNvbnJpbmcgPSAodTMyKilwY2lfYWxsb2NfY29uc2lzdGVudChwcml2LT5wZGV2LAorCQkJCQkgIHNpemVvZih1MzIpKjgqY291bnQsCisJCQkJCSAgJnByaXYtPnR4YmVhY29ucmluZ2RtYSk7CisJaWYgKCFwcml2LT50eGJlYWNvbnJpbmcpIHJldHVybiAtMTsKKwlmb3IgKHRtcD1wcml2LT50eGJlYWNvbnJpbmcsaT0wO2k8Y291bnQ7aSsrKXsKKwkJKnRtcCA9ICp0bXAgJn4gKDE8PDMxKTsgLy8gZGVzY3JpcHRvciBlbXB0eSwgb3duZWQgYnkgdGhlIGRydgorCQkvKgorCQkqKHRtcCsyKSA9ICh1MzIpZG1hX3RtcDsKKwkJKih0bXArMykgPSBidWZzaXplOworCQkqLworCQlpZihpKzE8Y291bnQpCisJCQkqKHRtcCs0KSA9ICh1MzIpcHJpdi0+dHhiZWFjb25yaW5nZG1hKygoaSsxKSo4KjQpOworCQllbHNlCisJCQkqKHRtcCs0KSA9ICh1MzIpcHJpdi0+dHhiZWFjb25yaW5nZG1hOworCisJCXRtcD10bXArODsKKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc2hvcnQgYWxsb2NfdHhfZGVzY19yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBidWZzaXplLCBpbnQgY291bnQsCisJCQkgaW50IGFkZHIpCit7CisJaW50IGk7CisJdTMyICpkZXNjOworCXUzMiAqdG1wOworCWRtYV9hZGRyX3QgZG1hX2Rlc2MsIGRtYV90bXA7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gcHJpdi0+cGRldjsKKwl2b2lkICpidWY7CisKKwlpZigoYnVmc2l6ZSAmIDB4ZmZmKSAhPSBidWZzaXplKSB7CisJCURNRVNHRSAoIlRYIGJ1ZmZlciBhbGxvY2F0aW9uIHRvbyBsYXJnZSIpOworCQlyZXR1cm4gMDsKKwl9CisJZGVzYyA9ICh1MzIqKXBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsCisJCQkJCSAgc2l6ZW9mKHUzMikqOCpjb3VudCsyNTYsICZkbWFfZGVzYyk7CisJaWYoZGVzYz09TlVMTCkgcmV0dXJuIC0xOworCWlmKGRtYV9kZXNjICYgMHhmZil7CisKKwkJLyoKKwkJICogZGVzY3JpcHRvcidzIGJ1ZmZlciBtdXN0IGJlIDI1NiBieXRlIGFsaWduZWQKKwkJICogd2Ugc2hvdWxkbid0IGJlIGhlcmUsIHNpbmNlIHdlIHNldCBETUEgbWFzayAhCisJCSAqLworCQlETUVTR1coIkZpeGluZyBUWCBhbGlnbm1lbnQiKTsKKwkJZGVzYyA9ICh1MzIqKSgodTgqKWRlc2MgKyAyNTYpOworI2lmIChkZWZpbmVkKENPTkZJR19ISUdITUVNNjRHKSB8fCBkZWZpbmVkKENPTkZJR182NEJJVF9QSFlTX0FERFIpKQorCQlkZXNjID0gKHUzMiopKCh1NjQpZGVzYyAmfiAweGZmKTsKKwkJZG1hX2Rlc2MgPSAoZG1hX2FkZHJfdCkoKHU4KilkbWFfZGVzYyArIDI1Nik7CisJCWRtYV9kZXNjID0gKGRtYV9hZGRyX3QpKCh1NjQpZG1hX2Rlc2MgJn4gMHhmZik7CisjZWxzZQorCQlkZXNjID0gKHUzMiopKCh1MzIpZGVzYyAmfiAweGZmKTsKKwkJZG1hX2Rlc2MgPSAoZG1hX2FkZHJfdCkoKHU4KilkbWFfZGVzYyArIDI1Nik7CisJCWRtYV9kZXNjID0gKGRtYV9hZGRyX3QpKCh1MzIpZG1hX2Rlc2MgJn4gMHhmZik7CisjZW5kaWYKKwl9CisJdG1wPWRlc2M7CisJZm9yIChpPTA7aTxjb3VudDtpKyspCisJeworCQlidWYgPSAodm9pZCopcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldixidWZzaXplLCZkbWFfdG1wKTsKKwkJaWYgKGJ1ZiA9PSBOVUxMKSByZXR1cm4gLUVOT01FTTsKKworCQlzd2l0Y2goYWRkcikgeworI2lmIDAKKwkJY2FzZSBUWF9OT1JNUFJJT1JJVFlfUklOR19BRERSOgorCQkJaWYoLTEgPT0gYnVmZmVyX2FkZCgmKHByaXYtPnR4bnBidWZzKSxidWYsZG1hX3RtcCxOVUxMKSl7CisJCQkJRE1FU0dFKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtIGZvciBidWZmZXIgTlAiKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgVFhfTE9XUFJJT1JJVFlfUklOR19BRERSOgorCQkJaWYoLTEgPT0gYnVmZmVyX2FkZCgmKHByaXYtPnR4bHBidWZzKSxidWYsZG1hX3RtcCxOVUxMKSl7CisJCQkJRE1FU0dFKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtIGZvciBidWZmZXIgTFAiKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgVFhfSElHSFBSSU9SSVRZX1JJTkdfQUREUjoKKwkJCWlmKC0xID09IGJ1ZmZlcl9hZGQoJihwcml2LT50eGhwYnVmcyksYnVmLGRtYV90bXAsTlVMTCkpeworCQkJCURNRVNHRSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbSBmb3IgYnVmZmVyIEhQIik7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQlicmVhazsKKyNlbHNlCisJCWNhc2UgVFhfTUFOQUdFUFJJT1JJVFlfUklOR19BRERSOgorCQkJaWYoLTEgPT0gYnVmZmVyX2FkZCgmKHByaXYtPnR4bWFwYnVmcyksYnVmLGRtYV90bXAsTlVMTCkpeworCQkJCURNRVNHRSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbSBmb3IgYnVmZmVyIE5QIik7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFRYX0JLUFJJT1JJVFlfUklOR19BRERSOgorCQkJaWYoLTEgPT0gYnVmZmVyX2FkZCgmKHByaXYtPnR4YmtwYnVmcyksYnVmLGRtYV90bXAsTlVMTCkpeworCQkJCURNRVNHRSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbSBmb3IgYnVmZmVyIExQIik7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUWF9CRVBSSU9SSVRZX1JJTkdfQUREUjoKKwkJCWlmKC0xID09IGJ1ZmZlcl9hZGQoJihwcml2LT50eGJlcGJ1ZnMpLGJ1ZixkbWFfdG1wLE5VTEwpKXsKKwkJCQlETUVTR0UoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW0gZm9yIGJ1ZmZlciBOUCIpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBUWF9WSVBSSU9SSVRZX1JJTkdfQUREUjoKKwkJCWlmKC0xID09IGJ1ZmZlcl9hZGQoJihwcml2LT50eHZpcGJ1ZnMpLGJ1ZixkbWFfdG1wLE5VTEwpKXsKKwkJCQlETUVTR0UoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW0gZm9yIGJ1ZmZlciBMUCIpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVFhfVk9QUklPUklUWV9SSU5HX0FERFI6CisJCQlpZigtMSA9PSBidWZmZXJfYWRkKCYocHJpdi0+dHh2b3BidWZzKSxidWYsZG1hX3RtcCxOVUxMKSl7CisJCQkJRE1FU0dFKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtIGZvciBidWZmZXIgTlAiKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmCisJCWNhc2UgVFhfSElHSFBSSU9SSVRZX1JJTkdfQUREUjoKKwkJCWlmKC0xID09IGJ1ZmZlcl9hZGQoJihwcml2LT50eGhwYnVmcyksYnVmLGRtYV90bXAsTlVMTCkpeworCQkJCURNRVNHRSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbSBmb3IgYnVmZmVyIEhQIik7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUWF9CRUFDT05fUklOR19BRERSOgorCQkgICAgICAgIGlmKC0xID09IGJ1ZmZlcl9hZGQoJihwcml2LT50eGJlYWNvbmJ1ZnMpLGJ1ZixkbWFfdG1wLE5VTEwpKXsKKwkJCURNRVNHRSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbSBmb3IgYnVmZmVyIEJQIik7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQlicmVhazsKKwkJfQorCQkqdG1wID0gKnRtcCAmfiAoMTw8MzEpOyAvLyBkZXNjcmlwdG9yIGVtcHR5LCBvd25lZCBieSB0aGUgZHJ2CisJCSoodG1wKzIpID0gKHUzMilkbWFfdG1wOworCQkqKHRtcCszKSA9IGJ1ZnNpemU7CisKKwkJaWYoaSsxPGNvdW50KQorCQkJKih0bXArNCkgPSAodTMyKWRtYV9kZXNjKygoaSsxKSo4KjQpOworCQllbHNlCisJCQkqKHRtcCs0KSA9ICh1MzIpZG1hX2Rlc2M7CisKKwkJdG1wPXRtcCs4OworCX0KKworCXN3aXRjaChhZGRyKSB7CisJY2FzZSBUWF9NQU5BR0VQUklPUklUWV9SSU5HX0FERFI6CisJCXByaXYtPnR4bWFwcmluZ2RtYT1kbWFfZGVzYzsKKwkJcHJpdi0+dHhtYXByaW5nPWRlc2M7CisJCWJyZWFrOworCisJY2FzZSBUWF9CS1BSSU9SSVRZX1JJTkdfQUREUjoKKwkJcHJpdi0+dHhia3ByaW5nZG1hPWRtYV9kZXNjOworCQlwcml2LT50eGJrcHJpbmc9ZGVzYzsKKwkJYnJlYWs7CisKKwljYXNlIFRYX0JFUFJJT1JJVFlfUklOR19BRERSOgorCQlwcml2LT50eGJlcHJpbmdkbWE9ZG1hX2Rlc2M7CisJCXByaXYtPnR4YmVwcmluZz1kZXNjOworCQlicmVhazsKKworCWNhc2UgVFhfVklQUklPUklUWV9SSU5HX0FERFI6CisJCXByaXYtPnR4dmlwcmluZ2RtYT1kbWFfZGVzYzsKKwkJcHJpdi0+dHh2aXByaW5nPWRlc2M7CisJCWJyZWFrOworCisJY2FzZSBUWF9WT1BSSU9SSVRZX1JJTkdfQUREUjoKKwkJcHJpdi0+dHh2b3ByaW5nZG1hPWRtYV9kZXNjOworCQlwcml2LT50eHZvcHJpbmc9ZGVzYzsKKwkJYnJlYWs7CisKKwljYXNlIFRYX0hJR0hQUklPUklUWV9SSU5HX0FERFI6CisJCXByaXYtPnR4aHByaW5nZG1hPWRtYV9kZXNjOworCQlwcml2LT50eGhwcmluZz1kZXNjOworCQlicmVhazsKKworCWNhc2UgVFhfQkVBQ09OX1JJTkdfQUREUjoKKwkJcHJpdi0+dHhiZWFjb25yaW5nZG1hPWRtYV9kZXNjOworCQlwcml2LT50eGJlYWNvbnJpbmc9ZGVzYzsKKwkJYnJlYWs7CisKKwl9CisKKyNpZmRlZiBERUJVR19UWAorCURNRVNHKCJUeCBkbWEgcGh5c2ljYWwgYWRkcmVzczogJXgiLGRtYV9kZXNjKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBmcmVlX3R4X2Rlc2NfcmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldj1wcml2LT5wZGV2OworCWludCBjb3VudCA9IHByaXYtPnR4cmluZ2NvdW50OworCisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBzaXplb2YodTMyKSo4KmNvdW50KzI1NiwKKwkJCSAgICBwcml2LT50eG1hcHJpbmcsIHByaXYtPnR4bWFwcmluZ2RtYSk7CisJYnVmZmVyX2ZyZWUoZGV2LCYocHJpdi0+dHhtYXBidWZzKSxwcml2LT50eGJ1ZmZzaXplLDEpOworCisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBzaXplb2YodTMyKSo4KmNvdW50KzI1NiwKKwkJCSAgICBwcml2LT50eGJrcHJpbmcsIHByaXYtPnR4YmtwcmluZ2RtYSk7CisJYnVmZmVyX2ZyZWUoZGV2LCYocHJpdi0+dHhia3BidWZzKSxwcml2LT50eGJ1ZmZzaXplLDEpOworCisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBzaXplb2YodTMyKSo4KmNvdW50KzI1NiwKKwkJCSAgICBwcml2LT50eGJlcHJpbmcsIHByaXYtPnR4YmVwcmluZ2RtYSk7CisJYnVmZmVyX2ZyZWUoZGV2LCYocHJpdi0+dHhiZXBidWZzKSxwcml2LT50eGJ1ZmZzaXplLDEpOworCisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBzaXplb2YodTMyKSo4KmNvdW50KzI1NiwKKwkJCSAgICBwcml2LT50eHZpcHJpbmcsIHByaXYtPnR4dmlwcmluZ2RtYSk7CisJYnVmZmVyX2ZyZWUoZGV2LCYocHJpdi0+dHh2aXBidWZzKSxwcml2LT50eGJ1ZmZzaXplLDEpOworCisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBzaXplb2YodTMyKSo4KmNvdW50KzI1NiwKKwkJCSAgICBwcml2LT50eHZvcHJpbmcsIHByaXYtPnR4dm9wcmluZ2RtYSk7CisJYnVmZmVyX2ZyZWUoZGV2LCYocHJpdi0+dHh2b3BidWZzKSxwcml2LT50eGJ1ZmZzaXplLDEpOworCisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBzaXplb2YodTMyKSo4KmNvdW50KzI1NiwKKwkJCSAgICBwcml2LT50eGhwcmluZywgcHJpdi0+dHhocHJpbmdkbWEpOworCWJ1ZmZlcl9mcmVlKGRldiwmKHByaXYtPnR4aHBidWZzKSxwcml2LT50eGJ1ZmZzaXplLDEpOworCisJY291bnQgPSBwcml2LT50eGJlYWNvbmNvdW50OworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHUzMikqOCpjb3VudCsyNTYsCisJCQkgICAgcHJpdi0+dHhiZWFjb25yaW5nLCBwcml2LT50eGJlYWNvbnJpbmdkbWEpOworCWJ1ZmZlcl9mcmVlKGRldiwmKHByaXYtPnR4YmVhY29uYnVmcykscHJpdi0+dHhidWZmc2l6ZSwxKTsKK30KKworI2lmIDAKK3ZvaWQgZnJlZV9iZWFjb25fZGVzY19yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsaW50IGNvdW50KQoreworCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2PXByaXYtPnBkZXY7CisKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHNpemVvZih1MzIpKjgqY291bnQrMjU2LAorCQkJICAgIHByaXYtPnR4YmVhY29ucmluZywgcHJpdi0+dHhiZWFjb25yaW5nZG1hKTsKKworCWlmIChwcml2LT5iZWFjb25fYnVmKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KHByaXYtPnBkZXYsCisJCQlwcml2LT5tYXN0ZXJfYmVhY29uc2l6ZSxwcml2LT5iZWFjb25fYnVmLHByaXYtPmJlYWNvbmRtYWJ1Zik7CisKK30KKyNlbmRpZgordm9pZCBmcmVlX3J4X2Rlc2NfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHByaXYtPnBkZXY7CisKKwlpbnQgY291bnQgPSBwcml2LT5yeHJpbmdjb3VudDsKKworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHUzMikqOCpjb3VudCsyNTYsCisJCQkgICAgcHJpdi0+cnhyaW5nLCBwcml2LT5yeHJpbmdkbWEpOworI2Vsc2UKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHNpemVvZih1MzIpKjQqY291bnQrMjU2LAorCQkJICAgIHByaXYtPnJ4cmluZywgcHJpdi0+cnhyaW5nZG1hKTsKKyNlbmRpZgorCisJYnVmZmVyX2ZyZWUoZGV2LCYocHJpdi0+cnhidWZmZXIpLHByaXYtPnJ4YnVmZmVyc2l6ZSwwKTsKK30KKworCitzaG9ydCBhbGxvY19yeF9kZXNjX3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IGJ1ZnNpemUsIGludCBjb3VudCkKK3sKKwlpbnQgaTsKKwl1MzIgKmRlc2M7CisJdTMyICp0bXA7CisJZG1hX2FkZHJfdCBkbWFfZGVzYyxkbWFfdG1wOworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldj1wcml2LT5wZGV2OworCXZvaWQgKmJ1ZjsKKwl1OCByeF9kZXNjX3NpemU7CisKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKwlyeF9kZXNjX3NpemUgPSA4OyAvLyA0KjggPSAzMiBieXRlcworI2Vsc2UKKwlyeF9kZXNjX3NpemUgPSA0OworI2VuZGlmCisKKwlpZigoYnVmc2l6ZSAmIDB4ZmZmKSAhPSBidWZzaXplKXsKKwkJRE1FU0dFICgiUlggYnVmZmVyIGFsbG9jYXRpb24gdG9vIGxhcmdlIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlkZXNjID0gKHUzMiopcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldixzaXplb2YodTMyKSpyeF9kZXNjX3NpemUqY291bnQrMjU2LAorCQkJCQkgICZkbWFfZGVzYyk7CisKKwlpZihkbWFfZGVzYyAmIDB4ZmYpeworCisJCS8qCisJCSAqIGRlc2NyaXB0b3IncyBidWZmZXIgbXVzdCBiZSAyNTYgYnl0ZSBhbGlnbmVkCisJCSAqIHNob3VsZCBuZXZlciBoYXBwZW4gc2luY2Ugd2Ugc3BlY2lmeSB0aGUgRE1BIG1hc2sKKwkJICovCisKKwkJRE1FU0dXKCJGaXhpbmcgUlggYWxpZ25tZW50Iik7CisJCWRlc2MgPSAodTMyKikoKHU4KilkZXNjICsgMjU2KTsKKyNpZiAoZGVmaW5lZChDT05GSUdfSElHSE1FTTY0RykgfHwgZGVmaW5lZChDT05GSUdfNjRCSVRfUEhZU19BRERSKSkKKwkJZGVzYyA9ICh1MzIqKSgodTY0KWRlc2MgJn4gMHhmZik7CisJCWRtYV9kZXNjID0gKGRtYV9hZGRyX3QpKCh1OCopZG1hX2Rlc2MgKyAyNTYpOworCQlkbWFfZGVzYyA9IChkbWFfYWRkcl90KSgodTY0KWRtYV9kZXNjICZ+IDB4ZmYpOworI2Vsc2UKKwkJZGVzYyA9ICh1MzIqKSgodTMyKWRlc2MgJn4gMHhmZik7CisJCWRtYV9kZXNjID0gKGRtYV9hZGRyX3QpKCh1OCopZG1hX2Rlc2MgKyAyNTYpOworCQlkbWFfZGVzYyA9IChkbWFfYWRkcl90KSgodTMyKWRtYV9kZXNjICZ+IDB4ZmYpOworI2VuZGlmCisJfQorCisJcHJpdi0+cnhyaW5nPWRlc2M7CisJcHJpdi0+cnhyaW5nZG1hPWRtYV9kZXNjOworCXRtcD1kZXNjOworCisJZm9yIChpPTA7aTxjb3VudDtpKyspeworCisJCWlmICgoYnVmPSBrbWFsbG9jKGJ1ZnNpemUgKiBzaXplb2YodTgpLEdGUF9BVE9NSUMpKSA9PSBOVUxMKXsKKwkJCURNRVNHRSgiRmFpbGVkIHRvIGttYWxsb2MgUlggYnVmZmVyIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlkbWFfdG1wID0gcGNpX21hcF9zaW5nbGUocGRldixidWYsYnVmc2l6ZSAqIHNpemVvZih1OCksCisJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisjaWZkZWYgREVCVUdfWkVST19SWAorCQlpbnQgajsKKwkJZm9yKGo9MDtqPGJ1ZnNpemU7aisrKSAoKHU4KilidWYpW2ldID0gMDsKKyNlbmRpZgorCisJCS8vYnVmID0gKHZvaWQqKXBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsYnVmc2l6ZSwmZG1hX3RtcCk7CisJCWlmKC0xID09IGJ1ZmZlcl9hZGQoJihwcml2LT5yeGJ1ZmZlciksIGJ1ZixkbWFfdG1wLAorCQkJICAgJihwcml2LT5yeGJ1ZmZlcmhlYWQpKSl7CisJCQkgICBETUVTR0UoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW0gUlggYnVmIik7CisJCQkgICByZXR1cm4gLTE7CisJCX0KKwkJKnRtcCA9IDA7IC8vemVybyBwYWRzIHRoZSBoZWFkZXIgb2YgdGhlIGRlc2NyaXB0b3IKKwkJKnRtcCA9ICp0bXAgfCggYnVmc2l6ZSYweGZmZik7CisJCSoodG1wKzIpID0gKHUzMilkbWFfdG1wOworCQkqdG1wID0gKnRtcCB8KDE8PDMxKTsgLy8gZGVzY3JpcHRvciB2b2lkLCBvd25lZCBieSB0aGUgTklDCisKKyNpZmRlZiBERUJVR19SWEFMTE9DCisJCURNRVNHKCJBbGxvYyAleCBzaXplIGJ1ZmZlciwgRE1BIG1lbSBAICV4LCB2aXJ0dWFsIG1lbSBAICV4IiwKKwkJICAgICAgKHUzMikoYnVmc2l6ZSYweGZmZiksICh1MzIpZG1hX3RtcCwgKHUzMilidWYpOworI2VuZGlmCisKKwkJdG1wPXRtcCtyeF9kZXNjX3NpemU7CisJfQorCisJKih0bXAtcnhfZGVzY19zaXplKSA9ICoodG1wLXJ4X2Rlc2Nfc2l6ZSkgfCAoMTw8MzApOyAvLyB0aGlzIGlzIHRoZSBsYXN0IGRlc2NyaXB0b3IKKworCisjaWZkZWYgREVCVUdfUlhBTExPQworCURNRVNHKCJSWCBETUEgcGh5c2ljYWwgYWRkcmVzczogJXgiLGRtYV9kZXNjKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBzZXRfbmljX3J4cmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXU4IHBncmVnOworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCS8vcnRsODE4MF9zZXRfbW9kZShkZXYsIEVQUk9NX0NNRF9DT05GSUcpOworCisJcGdyZWc9cmVhZF9uaWNfYnl0ZShkZXYsIFBHU0VMRUNUKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFBHU0VMRUNULCBwZ3JlZyAmfiAoMTw8UEdTRUxFQ1RfUEdfU0hJRlQpKTsKKworCS8vcnRsODE4MF9zZXRfbW9kZShkZXYsIEVQUk9NX0NNRF9OT1JNQUwpOworCisJd3JpdGVfbmljX2R3b3JkKGRldiwgUlhSSU5HX0FERFIscHJpdi0+cnhyaW5nZG1hKTsKK30KKworCit2b2lkIHJ0bDgxODBfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvL3UzMiB0eGNvbmYgPSAweDgwZTAwNzA3OyAvL0ZJWE1FOiBNYWtlIG1lIHVuZGVyc3RhbmRhYmxlCisJdTggY3I7CisKKwkvL3dyaXRlX25pY19kd29yZChkZXYsVFhfQ09ORix0eGNvbmYpOworCisJcnRsODE4MF9pcnFfZGlzYWJsZShkZXYpOworCisJY3I9cmVhZF9uaWNfYnl0ZShkZXYsQ01EKTsKKwljciA9IGNyICYgMjsKKwljciA9IGNyIHwgKDE8PENNRF9SU1RfU0hJRlQpOworCXdyaXRlX25pY19ieXRlKGRldixDTUQsY3IpOworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKworCW1kZWxheSgyMDApOworCisJaWYocmVhZF9uaWNfYnl0ZShkZXYsQ01EKSAmICgxPDxDTURfUlNUX1NISUZUKSkKKwkJRE1FU0dXKCJDYXJkIHJlc2V0IHRpbWVvdXQhIik7CisJZWxzZQorCQlETUVTRygiQ2FyZCBzdWNjZXNzZnVsbHkgcmVzZXQiKTsKKworLy8jaWZuZGVmIENPTkZJR19SVEw4MTg1QgorCXJ0bDgxODBfc2V0X21vZGUoZGV2LEVQUk9NX0NNRF9MT0FEKTsKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCW1kZWxheSgyMDApOworLy8jZW5kaWYKK30KKworaW5saW5lIHUxNiBpZWVlcmF0ZTJydGxyYXRlKGludCByYXRlKQoreworCXN3aXRjaChyYXRlKXsKKwljYXNlIDEwOgorCXJldHVybiAwOworCWNhc2UgMjA6CisJcmV0dXJuIDE7CisJY2FzZSA1NToKKwlyZXR1cm4gMjsKKwljYXNlIDExMDoKKwlyZXR1cm4gMzsKKwljYXNlIDYwOgorCXJldHVybiA0OworCWNhc2UgOTA6CisJcmV0dXJuIDU7CisJY2FzZSAxMjA6CisJcmV0dXJuIDY7CisJY2FzZSAxODA6CisJcmV0dXJuIDc7CisJY2FzZSAyNDA6CisJcmV0dXJuIDg7CisJY2FzZSAzNjA6CisJcmV0dXJuIDk7CisJY2FzZSA0ODA6CisJcmV0dXJuIDEwOworCWNhc2UgNTQwOgorCXJldHVybiAxMTsKKwlkZWZhdWx0OgorCXJldHVybiAzOworCisJfQorfQorCitzdGF0aWMgdTE2IHJ0bF9yYXRlW10gPSB7MTAsMjAsNTUsMTEwLDYwLDkwLDEyMCwxODAsMjQwLDM2MCw0ODAsNTQwLDcyMH07CitpbmxpbmUgdTE2IHJ0bDgxODBfcmF0ZTJyYXRlKHNob3J0IHJhdGUpCit7CisJaWYgKHJhdGUgPjEyKSByZXR1cm4gMTA7CisJcmV0dXJuIHJ0bF9yYXRlW3JhdGVdOworfQoraW5saW5lIHU4IHJ0bDgxODBfSXNXaXJlbGVzc0JNb2RlKHUxNiByYXRlKQoreworCWlmKCAoKHJhdGUgPD0gMTEwKSAmJiAocmF0ZSAhPSA2MCkgJiYgKHJhdGUgIT0gOTApKSB8fCAocmF0ZSA9PSAyMjApICkKKwkJcmV0dXJuIDE7CisJZWxzZSByZXR1cm4gMDsKK30KK3UxNiBOX0RCUFNPZlJhdGUodTE2IERhdGFSYXRlKTsKK3UxNiBDb21wdXRlVHhUaW1lKAorCXUxNgkJRnJhbWVMZW5ndGgsCisJdTE2CQlEYXRhUmF0ZSwKKwl1OAkJYk1hbmFnZW1lbnRGcmFtZSwKKwl1OAkJYlNob3J0UHJlYW1ibGUKKykKK3sKKwl1MTYJRnJhbWVUaW1lOworCXUxNglOX0RCUFM7CisJdTE2CUNlaWxpbmc7CisKKwlpZiggcnRsODE4MF9Jc1dpcmVsZXNzQk1vZGUoRGF0YVJhdGUpICkKKwl7CisJCWlmKCBiTWFuYWdlbWVudEZyYW1lIHx8ICFiU2hvcnRQcmVhbWJsZSB8fCBEYXRhUmF0ZSA9PSAxMCApCisJCXsJLy8gbG9uZyBwcmVhbWJsZQorCQkJRnJhbWVUaW1lID0gKHUxNikoMTQ0KzQ4KyhGcmFtZUxlbmd0aCo4LyhEYXRhUmF0ZS8xMCkpKTsKKwkJfQorCQllbHNlCisJCXsJLy8gU2hvcnQgcHJlYW1ibGUKKwkJCUZyYW1lVGltZSA9ICh1MTYpKDcyKzI0KyhGcmFtZUxlbmd0aCo4LyhEYXRhUmF0ZS8xMCkpKTsKKwkJfQorCQlpZiggKCBGcmFtZUxlbmd0aCo4ICUgKERhdGFSYXRlLzEwKSApICE9IDAgKSAvL0dldCB0aGUgQ2VpbGxpbmcKKwkJCQlGcmFtZVRpbWUgKys7CisJfSBlbHNlIHsJLy84MDIuMTFnIERTU1MtT0ZETSBQTENQIGxlbmd0aCBmaWVsZCBjYWxjdWxhdGlvbi4KKwkJTl9EQlBTID0gTl9EQlBTT2ZSYXRlKERhdGFSYXRlKTsKKwkJQ2VpbGluZyA9ICgxNiArIDgqRnJhbWVMZW5ndGggKyA2KSAvIE5fREJQUworCQkJCSsgKCgoMTYgKyA4KkZyYW1lTGVuZ3RoICsgNikgJSBOX0RCUFMpID8gMSA6IDApOworCQlGcmFtZVRpbWUgPSAodTE2KSgxNiArIDQgKyA0KkNlaWxpbmcgKyA2KTsKKwl9CisJcmV0dXJuIEZyYW1lVGltZTsKK30KK3UxNiBOX0RCUFNPZlJhdGUodTE2IERhdGFSYXRlKQoreworCSB1MTYgTl9EQlBTID0gMjQ7CisKKwkgc3dpdGNoKERhdGFSYXRlKQorCSB7CisJIGNhc2UgNjA6CisJICBOX0RCUFMgPSAyNDsKKwkgIGJyZWFrOworCisJIGNhc2UgOTA6CisJICBOX0RCUFMgPSAzNjsKKwkgIGJyZWFrOworCisJIGNhc2UgMTIwOgorCSAgTl9EQlBTID0gNDg7CisJICBicmVhazsKKworCSBjYXNlIDE4MDoKKwkgIE5fREJQUyA9IDcyOworCSAgYnJlYWs7CisKKwkgY2FzZSAyNDA6CisJICBOX0RCUFMgPSA5NjsKKwkgIGJyZWFrOworCisJIGNhc2UgMzYwOgorCSAgTl9EQlBTID0gMTQ0OworCSAgYnJlYWs7CisKKwkgY2FzZSA0ODA6CisJICBOX0RCUFMgPSAxOTI7CisJICBicmVhazsKKworCSBjYXNlIDU0MDoKKwkgIE5fREJQUyA9IDIxNjsKKwkgIGJyZWFrOworCisJIGRlZmF1bHQ6CisJICBicmVhazsKKwkgfQorCisJIHJldHVybiBOX0RCUFM7Cit9CisKKy8ve2J5IGFteSAwODAzMTIKKy8vCisvLwlEZXNjcmlwdGlvbjoKKy8vIAlGb3IgTmV0Z2VhciBjYXNlLCB0aGV5IHdhbnQgZ29vZC1sb29raW5nIHNpbmdhbCBzdHJlbmd0aC4KKy8vCQkyMDA0LjEyLjA1LCBieSByY25qa28uCisvLworbG9uZworTmV0Z2VhclNpZ25hbFN0cmVuZ3RoVHJhbnNsYXRlKAorCWxvbmcgTGFzdFNTLAorCWxvbmcgQ3VyclNTCisJKQoreworCWxvbmcgUmV0U1M7CisKKwkvLyBTdGVwIDEuIFNjYWxlIG1hcHBpbmcuCisJaWYoQ3VyclNTID49IDcxICYmIEN1cnJTUyA8PSAxMDApCisJeworCQlSZXRTUyA9IDkwICsgKChDdXJyU1MgLSA3MCkgLyAzKTsKKwl9CisJZWxzZSBpZihDdXJyU1MgPj0gNDEgJiYgQ3VyclNTIDw9IDcwKQorCXsKKwkJUmV0U1MgPSA3OCArICgoQ3VyclNTIC0gNDApIC8gMyk7CisJfQorCWVsc2UgaWYoQ3VyclNTID49IDMxICYmIEN1cnJTUyA8PSA0MCkKKwl7CisJCVJldFNTID0gNjYgKyAoQ3VyclNTIC0gMzApOworCX0KKwllbHNlIGlmKEN1cnJTUyA+PSAyMSAmJiBDdXJyU1MgPD0gMzApCisJeworCQlSZXRTUyA9IDU0ICsgKEN1cnJTUyAtIDIwKTsKKwl9CisJZWxzZSBpZihDdXJyU1MgPj0gNSAmJiBDdXJyU1MgPD0gMjApCisJeworCQlSZXRTUyA9IDQyICsgKCgoQ3VyclNTIC0gNSkgKiAyKSAvIDMpOworCX0KKwllbHNlIGlmKEN1cnJTUyA9PSA0KQorCXsKKwkJUmV0U1MgPSAzNjsKKwl9CisJZWxzZSBpZihDdXJyU1MgPT0gMykKKwl7CisJCVJldFNTID0gMjc7CisJfQorCWVsc2UgaWYoQ3VyclNTID09IDIpCisJeworCQlSZXRTUyA9IDE4OworCX0KKwllbHNlIGlmKEN1cnJTUyA9PSAxKQorCXsKKwkJUmV0U1MgPSA5OworCX0KKwllbHNlCisJeworCQlSZXRTUyA9IEN1cnJTUzsKKwl9CisJLy9SVF9UUkFDRShDT01QX0RCRywgREJHX0xPVUQsICgiIyMjIyMgQWZ0ZXIgTWFwcGluZzogIExhc3RTUzogJWQsIEN1cnJTUzogJWQsIFJldFNTOiAlZFxuIiwgTGFzdFNTLCBDdXJyU1MsIFJldFNTKSk7CisKKwkvLyBTdGVwIDIuIFNtb290aGluZy4KKwlpZihMYXN0U1MgPiAwKQorCXsKKwkJUmV0U1MgPSAoKExhc3RTUyAqIDUpICsgKFJldFNTKSsgNSkgLyA2OworCX0KKwkvL1JUX1RSQUNFKENPTVBfREJHLCBEQkdfTE9VRCwgKCIkJCQkJCBBZnRlciBTbW9vdGhpbmc6ICBMYXN0U1M6ICVkLCBDdXJyU1M6ICVkLCBSZXRTUzogJWRcbiIsIExhc3RTUywgQ3VyclNTLCBSZXRTUykpOworCisJcmV0dXJuIFJldFNTOworfQorLy8KKy8vCURlc2NyaXB0aW9uOgorLy8JCVRyYW5zbGF0ZSAwLTEwMCBzaWduYWwgc3RyZW5ndGggaW5kZXggaW50byBkQm0uCisvLworbG9uZworVHJhbnNsYXRlVG9EYm04MTg1KAorCXU4IFNpZ25hbFN0cmVuZ3RoSW5kZXgJLy8gMC0xMDAgaW5kZXguCisJKQoreworCWxvbmcJU2lnbmFsUG93ZXI7IC8vIGluIGRCbS4KKworCS8vIFRyYW5zbGF0ZSB0byBkQm0gKHg9MC41eS05NSkuCisJU2lnbmFsUG93ZXIgPSAobG9uZykoKFNpZ25hbFN0cmVuZ3RoSW5kZXggKyAxKSA+PiAxKTsKKwlTaWduYWxQb3dlciAtPSA5NTsKKworCXJldHVybiBTaWduYWxQb3dlcjsKK30KKy8vCisvLwlEZXNjcmlwdGlvbjoKKy8vCQlQZXJmb3JtIHNpZ25hbCBzbW9vdGhpbmcgZm9yIGR5bmFtaWMgbWVjaGFuaXNtLgorLy8JCVRoaXMgaXMgZGlmZmVyZW50IHdpdGggUGVyZm9ybVNpZ25hbFNtb290aGluZzgxODUgaW4gc21vb3RoaW5nIGZvbXVsYS4KKy8vCQlObyBkcmFtYXRpYyBhZGp1c3Rpb24gaXMgYXBwbHkgYmVjYXVzZSBkeW5hbWljIG1lY2hhbmlzbSBuZWVkIHNvbWUgZGVncmVlCisvLwkJb2YgY29ycmVjdG5lc3MuIFBvcnRlZCBmcm9tIDgxODdCLgorLy8JMjAwNy0wMi0yNiwgYnkgQnJ1Y2UuCisvLwordm9pZAorUGVyZm9ybVVuZGVjb3JhdGVkU2lnbmFsU21vb3RoaW5nODE4NSgKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiwKKwlib29sICAgIGJDY2tSYXRlCisJKQoreworCisKKwkvLyBEZXRlcm1pbiB0aGUgY3VycmVudCBwYWNrZXQgaXMgQ0NLIHJhdGUuCisJcHJpdi0+YkN1ckNDS1BrdCA9IGJDY2tSYXRlOworCisJaWYocHJpdi0+VW5kZWNvcmF0ZWRTbW9vdGhlZFNTID49IDApCisJeworCQlwcml2LT5VbmRlY29yYXRlZFNtb290aGVkU1MgPSAoIChwcml2LT5VbmRlY29yYXRlZFNtb290aGVkU1MgKiA1KSArIChwcml2LT5TaWduYWxTdHJlbmd0aCAqIDEwKSApIC8gNjsKKwl9CisJZWxzZQorCXsKKwkJcHJpdi0+VW5kZWNvcmF0ZWRTbW9vdGhlZFNTID0gcHJpdi0+U2lnbmFsU3RyZW5ndGggKiAxMDsKKwl9CisKKwlwcml2LT5VbmRlcmNvcmF0ZVNtb290aGVkUnhQb3dlciA9ICggKHByaXYtPlVuZGVyY29yYXRlU21vb3RoZWRSeFBvd2VyICogNTApICsgKHByaXYtPlJ4UG93ZXIqIDExKSkgLyA2MDsKKworLy8JcHJpbnRrKCJTb21tdGhpbmcgU2lnbmFsU3Rlcm5ndGggKCVkKSA9PiBVbmRlY29yYXRlZFNtb290aGVkU1MgKCVkKVxuIiwgcHJpdi0+U2lnbmFsU3RyZW5ndGgsIHByaXYtPlVuZGVjb3JhdGVkU21vb3RoZWRTUyk7CisvLwlwcmludGsoIlNvbW10aGluZyBSeFBvd2VyICglZCkgPT4gVW5kZWNvcmF0ZWRSeFBvd2VyICglZClcbiIsIHByaXYtPlJ4UG93ZXIsIHByaXYtPlVuZGVyY29yYXRlU21vb3RoZWRSeFBvd2VyKTsKKworCS8vaWYocHJpdi0+Q3VyQ0NLUlNTSSA+PSAwICYmIGJDY2tSYXRlKQorCWlmKGJDY2tSYXRlKQorCXsKKwkJcHJpdi0+Q3VyQ0NLUlNTSSA9IHByaXYtPlJTU0k7CisJfQorCWVsc2UKKwl7CisJCXByaXYtPkN1ckNDS1JTU0kgPSAwOworCX0KKworCS8vIEJvdW5kYXJ5IGNoZWNraW5nLgorCS8vIFRPRE86IFRoZSBvdmVyZmxvdyBjb25kaXRpb24gZG9lcyBoYXBwZW4sIGlmIHdlIHdhbnQgdG8gZml4LAorCS8vIHdlIHNoYWxsIHJlY2FsY3VsYXRlIHRocmVzaG9sZHMgZmlyc3QuCisJaWYocHJpdi0+VW5kZWNvcmF0ZWRTbW9vdGhlZFNTID4gMTAwKQorCXsKKy8vCQlwcmludGsoIlVuZGVjb3JhdGVkU21vb3RoZWRTUyglZCkgb3ZlcmZsb3csIFNpZ25hbFN0cmVuZ3RoKCVkKVxuIiwgcHJpdi0+VW5kZWNvcmF0ZWRTbW9vdGhlZFNTLCBwcml2LT5TaWduYWxTdHJlbmd0aCk7CisJfQorCWlmKHByaXYtPlVuZGVjb3JhdGVkU21vb3RoZWRTUyA8IDApCisJeworLy8JCXByaW50aygiVW5kZWNvcmF0ZWRTbW9vdGhlZFNTKCVkKSB1bmRlcmZsb3csIFNpZ25hbFN0cmVuZ3RoKCVkKVxuIiwgcHJpdi0+VW5kZWNvcmF0ZWRTbW9vdGhlZFNTLCBwcml2LT5TaWduYWxTdHJlbmd0aCk7CisJfQorCit9CisKKy8vYnkgYW15IDA4MDMxMn0KKworLyogVGhpcyBpcyByb3VnaCBSWCBpc3IgaGFuZGxpbmcgcm91dGluZSovCit2b2lkIHJ0bDgxODBfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IHNrX2J1ZmYgKnRtcF9za2I7CisKKwkvL3N0cnVjdCBza19idWZmICpza2I7CisJc2hvcnQgZmlyc3QsbGFzdDsKKwl1MzIgbGVuOworCWludCBsYXN0bGVuOworCXVuc2lnbmVkIGNoYXIgcXVhbGl0eSwgc2lnbmFsOworCXU4IHJhdGU7CisJLy91MzIgKnByaXNtX2hkcjsKKwl1MzIgKnRtcCwqdG1wMjsKKwl1OCByeF9kZXNjX3NpemU7CisJdTggcGFkZGluZzsKKwkvL3UzMiBjb3VudD0wOworCWNoYXIgcnhwb3dlciA9IDA7CisJdTMyIFJYQUdDID0gMDsKKwlsb25nIFJ4QUdDX2RCbSA9IDA7CisJdTgJTE5BPTAsIEJCPTA7CisJdTggCUxOQV9nYWluWzRdPXswMiwgMTcsIDI5LCAzOX07CisJdTggIEFudGVubmEgPSAwOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7Ly9ieSBhbXkKKwl1MTYgZmMsdHlwZTsKKwl1OCBiSHdFcnJvciA9IDAsYkNSQyA9IDAsYklDViA9IDA7CisJLy9iSHdFcnJvciA9IDA7CisJLy9iQ1JDID0gMDsKKwkvL2JJQ1YgPSAwOworCWJvb2wJYkNja1JhdGUgPSBmYWxzZTsKKwl1OCAgICAgUlNTSSA9IDA7CisJbG9uZwlTaWduYWxTdHJlbmd0aEluZGV4ID0gMDsvLytieSBhbXkgMDgwMzEyCisvLwl1OCBTaWduYWxTdHJlbmd0aCA9IDA7CisJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyBzdGF0cyA9IHsKKwkJLnNpZ25hbCA9IDAsCisJCS5ub2lzZSA9IC05OCwKKwkJLnJhdGUgPSAwLAorCS8vCS5tYWNfdGltZSA9IGppZmZpZXMsCisJCS5mcmVxID0gSUVFRTgwMjExXzI0R0haX0JBTkQsCisJfTsKKworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCXN0YXRzLm5pY190eXBlID0gTklDXzgxODVCOworCXJ4X2Rlc2Nfc2l6ZSA9IDg7CisKKyNlbHNlCisJc3RhdHMubmljX3R5cGUgPSBOSUNfODE4NTsKKwlyeF9kZXNjX3NpemUgPSA0OworI2VuZGlmCisJLy9wcmludGsoInJlY2VpdmUgZnJhbWUhJWRcbiIsY291bnQrKyk7CisJLy9pZiAoIXByaXYtPnJ4YnVmZmVyKSBETUVTRyAoIkVFOiBOSUMgUlggYWNrLCBidXQgUlggcXVldWUgY29ycnVwdGVkISIpOworCS8vZWxzZSB7CisKKwlpZiAoKCoocHJpdi0+cnhyaW5ndGFpbCkpICYgKDE8PDMxKSkgeworCisJCS8qIHdlIGhhdmUgZ290IGFuIFJYIGludCwgYnV0IHRoZSBkZXNjcmlwdG9yCisJCSAqIHdlIGFyZSBwb2ludGluZyBpcyBlbXB0eSovCisKKwkJcHJpdi0+c3RhdHMucnhub2RhdGErKzsKKwkJcHJpdi0+aWVlZTgwMjExLT5zdGF0cy5yeF9lcnJvcnMrKzsKKworCS8qCWlmICghICoocHJpdi0+cnhyaW5nKSAmICgxPDwzMSkpIHsKKworCQkJcHJpdi0+c3RhdHMucnhyZXNldCsrOworCQkJcHJpdi0+cnhyaW5ndGFpbD1wcml2LT5yeHJpbmc7CisJCQlwcml2LT5yeGJ1ZmZlcj1wcml2LT5yeGJ1ZmZlcmhlYWQ7CisKKwkJfWVsc2V7Ki8KKworCQkjaWYgMAorCQkvKiBNYXliZSBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBOSUMgaGFzIHNraXBwZWQgc29tZSBkZXNjcmlwdG9ycyBvcgorCQkgKiBpdCBoYXMgcmVzZXQgaXRzIGludGVybmFsIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcmluZworCQkgKiB3ZSBzZWFyY2ggZm9yIHRoZSBmaXJzdCBmaWxsZWQgZGVzY3JpcHRvciBpbiB0aGUgcmluZywgb3Igd2UgYnJlYWsKKwkJICogcHV0dGluZyBhZ2FpbiB0aGUgcG9pbnRlciBpbiB0aGUgb2xkIGxvY2F0aW9uIGlmIHdlIGRvIG5vdCBmb3VuZCBhbnkuCisJCSAqIFRoaXMgaXMgcXVpdGUgZGFuZ2Vyb3VzLCB3aGF0IGRvZXMgaGFwcGVuIGlmIHRoZSBuaWMgd3JpdGVzCisJCSAqIHR3byBkZXNjcmlwdG9yIChzYXkgQSBhbmQgQikgd2hlbiB3ZSBoYXZlIGp1c3QgY2hlY2tlZCB0aGUgZGVzY3JpcHRvcgorCQkgKiBBIGFuZCB3ZSBhcmUgZ29pbmcgdG8gY2hlY2sgdGhlIGRlc2NyaXB0b3IgQi4uVGhpcyBtaWdodCBoYXBwZW4gaWYgdGhlCisJCSAqIGludGVycnVwdCB3YXMgZHVtbXksIHRoZXJlIHdhcyBub3QgcmVhbGx5IGZpbGxlZCBkZXNjcmlwdG9ycyBhbmQKKwkJICogdGhlIE5JQyBkaWRuJ3QgbG9zZSBwb2ludGVyCisJCSAqLworCisJCS8vcHJpdi0+c3RhdHMucnh3cmthcm91bmQrKzsKKworCQl0bXAgPSBwcml2LT5yeHJpbmd0YWlsOworCQl3aGlsZSAoKihwcml2LT5yeHJpbmd0YWlsKSAmICgxPDwzMSkpeworCisJCQlwcml2LT5yeHJpbmd0YWlsKz00OworCisJCQlpZihwcml2LT5yeHJpbmd0YWlsID49CisJCQkJKHByaXYtPnJ4cmluZykrKHByaXYtPnJ4cmluZ2NvdW50ICkqNCkKKwkJCQlwcml2LT5yeHJpbmd0YWlsPXByaXYtPnJ4cmluZzsKKworCQkJcHJpdi0+cnhidWZmZXI9KHByaXYtPnJ4YnVmZmVyLT5uZXh0KTsKKworCQkJaWYocHJpdi0+cnhyaW5ndGFpbCA9PSB0bXAgKXsKKwkJCQkvL0RNRVNHKCJFRTogQ291bGQgbm90IGZpbmQgUlggcG9pbnRlciIpOworCQkJCXByaXYtPnN0YXRzLnJ4bm9wb2ludGVyKys7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJI2Vsc2UKKworCQl0bXAyID0gTlVMTDsKKwkJdG1wID0gcHJpdi0+cnhyaW5ndGFpbDsKKwkJZG97CisJCQlpZih0bXAgPT0gcHJpdi0+cnhyaW5nKQorCQkJCS8vdG1wICA9IHByaXYtPnJ4cmluZyArIChwcml2LT5yeHJpbmdjb3VudCApKnJ4X2Rlc2Nfc2l6ZTsgeGlvbmctMjAwNi0xMS0xNQorCQkJCXRtcCAgPSBwcml2LT5yeHJpbmcgKyAocHJpdi0+cnhyaW5nY291bnQgLSAxKSpyeF9kZXNjX3NpemU7CisJCQllbHNlCisJCQkJdG1wIC09IHJ4X2Rlc2Nfc2l6ZTsKKworCQkJaWYoISAoKnRtcCAmICgxPDwzMSkpKQorCQkJCXRtcDIgPSB0bXA7CisJCX13aGlsZSh0bXAgIT0gcHJpdi0+cnhyaW5nKTsKKworCQlpZih0bXAyKSBwcml2LT5yeHJpbmd0YWlsID0gdG1wMjsKKwkJI2VuZGlmCisJCS8vfQorCX0KKworCS8qIHdoaWxlIHRoZXJlIGFyZSBmaWxsZWQgZGVzY3JpcHRvcnMgKi8KKwl3aGlsZSghKCoocHJpdi0+cnhyaW5ndGFpbCkgJiAoMTw8MzEpKSl7CisJCWlmKCoocHJpdi0+cnhyaW5ndGFpbCkgJiAoMTw8MjYpKQorCQkJRE1FU0dXKCJSWCBidWZmZXIgb3ZlcmZsb3ciKTsKKwkJaWYoKihwcml2LT5yeHJpbmd0YWlsKSAmICgxPDwxMikpCisJCQlwcml2LT5zdGF0cy5yeGljdmVycisrOworCisJCWlmKCoocHJpdi0+cnhyaW5ndGFpbCkgJiAoMTw8MjcpKXsKKwkJCXByaXYtPnN0YXRzLnJ4ZG1hZmFpbCsrOworCQkJLy9ETUVTRygiRUU6IFJYIERNQSBGQUlMRUQgYXQgYnVmZmVyIHBvaW50ZWQgYnkgZGVzY3JpcHRvciAleCIsKHUzMilwcml2LT5yeHJpbmd0YWlsKTsKKwkJCWdvdG8gZHJvcDsKKwkJfQorCisJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShwcml2LT5wZGV2LAorCQkJCSAgICBwcml2LT5yeGJ1ZmZlci0+ZG1hLAorCQkJCSAgICBwcml2LT5yeGJ1ZmZlcnNpemUgKiBcCisJCQkJICAgIHNpemVvZih1OCksCisJCQkJICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwkJZmlyc3QgPSAqKHByaXYtPnJ4cmluZ3RhaWwpICYgKDE8PDI5KSA/IDE6MDsKKwkJaWYoZmlyc3QpIHByaXYtPnJ4X3ByZXZsZW49MDsKKworCQlsYXN0ID0gKihwcml2LT5yeHJpbmd0YWlsKSAmICgxPDwyOCkgPyAxOjA7CisJCWlmKGxhc3QpeworCQkJbGFzdGxlbj0oKCpwcml2LT5yeHJpbmd0YWlsKSAmMHhmZmYpOworCisJCQkvKiBpZiB0aGUgbGFzdCBkZXNjcmlwdG9yICh0aGF0IHNob3VsZAorCQkJICogdGVsbCB1cyB0aGUgdG90YWwgcGFja2V0IGxlbikgdGVsbAorCQkJICogdXMgc29tZXRoaW5nIGxlc3MgdGhhbiB0aGUgZGVzY3JpcHRvcnMKKwkJCSAqIGxlbiB3ZSBoYWQgdW50aWwgbm93LCB0aGVuIHRoZXJlIGlzIHNvbWUKKwkJCSAqIHByb2JsZW0uLgorCQkJICogd29ya2Fyb3VuZCB0byBwcmV2ZW50IGtlcm5lbCBwYW5pYworCQkJICovCisJCQlpZihsYXN0bGVuIDwgcHJpdi0+cnhfcHJldmxlbikKKwkJCQlsZW49MDsKKwkJCWVsc2UKKwkJCQlsZW49bGFzdGxlbi1wcml2LT5yeF9wcmV2bGVuOworCisJCQlpZigqKHByaXYtPnJ4cmluZ3RhaWwpICYgKDE8PDEzKSkgeworLy9sYXN0bGVuPSgoKnByaXYtPnJ4cmluZ3RhaWwpICYweGZmZik7CisJCQkJaWYgKCgqKHByaXYtPnJ4cmluZ3RhaWwpICYgMHhmZmYpIDw1MDApCisJCQkJCXByaXYtPnN0YXRzLnJ4Y3JjZXJybWluKys7CisJCQkJZWxzZSBpZiAoKCoocHJpdi0+cnhyaW5ndGFpbCkgJiAweDBmZmYpID4xMDAwKQorCQkJCQlwcml2LT5zdGF0cy5yeGNyY2Vycm1heCsrOworCQkJCWVsc2UKKwkJCQkJcHJpdi0+c3RhdHMucnhjcmNlcnJtaWQrKzsKKworCQkJfQorCisJCX1lbHNleworCQkJbGVuID0gcHJpdi0+cnhidWZmZXJzaXplOworCQl9CisKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKwkJaWYoZmlyc3QgJiYgbGFzdCkgeworCQkJcGFkZGluZyA9ICgoKihwcml2LT5yeHJpbmd0YWlsKzMpKSYoMHgwNDAwMDAwMCkpPj4yNjsKKwkJfWVsc2UgaWYoZmlyc3QpIHsKKwkJCXBhZGRpbmcgPSAoKCoocHJpdi0+cnhyaW5ndGFpbCszKSkmKDB4MDQwMDAwMDApKT4+MjY7CisJCQlpZihwYWRkaW5nKSB7CisJCQkJbGVuIC09IDI7CisJCQl9CisJCX1lbHNlIHsKKwkJCXBhZGRpbmcgPSAwOworCQl9CisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUworICAgICAgICAgICAgICAgcGFkZGluZyA9IDA7CisjZW5kaWYKKyNlbmRpZgorCQlwcml2LT5yeF9wcmV2bGVuKz1sZW47CisKKwkJaWYocHJpdi0+cnhfcHJldmxlbiA+IE1BWF9GUkFHX1RIUkVTSE9MRCArIDEwMCl7CisJCQkvKiBIVyBpcyBwcm9iYWJseSBwYXNzaW5nIHNldmVyYWwgYnVnZ3kgZnJhbWVzCisJCQkqIHdpdGhvdXQgRkQgb3IgTEQgZmxhZyBzZXQuCisJCQkqIFRocm93IHRoaXMgZ2FyYmFnZSBhd2F5IHRvIHByZXZlbnQgc2tiCisJCQkqIG1lbW9yeSBleGF1c3RpbmcKKwkJCSovCisJCQlpZighcHJpdi0+cnhfc2tiX2NvbXBsZXRlKQorCQkJCWRldl9rZnJlZV9za2JfYW55KHByaXYtPnJ4X3NrYik7CisJCQlwcml2LT5yeF9za2JfY29tcGxldGUgPSAxOworCQl9CisKKyNpZmRlZiBERUJVR19SWF9GUkFHCisJCURNRVNHKCJJdGVyYXRpb24uLiBsZW4gJXgiLGxlbik7CisJCWlmKGZpcnN0KSBETUVTRyAoIkZpcnN0IGRlc2NyaXB0b3IiKTsKKwkJaWYobGFzdCkgRE1FU0coIkxhc3QgZGVzY3JpcHRvciIpOworCisjZW5kaWYKKyNpZmRlZiBERUJVR19SWF9WRVJCT1NFCisJCXByaW50X2J1ZmZlciggcHJpdi0+cnhidWZmZXItPmJ1ZiwgbGVuKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisJCXNpZ25hbD0odW5zaWduZWQgY2hhcikoKCgqKHByaXYtPnJ4cmluZ3RhaWwrMykpJiAoMHgwMGZmMDAwMCkpPj4xNik7CisJCXNpZ25hbD0oc2lnbmFsJjB4ZmUpPj4xOwkvLyBNb2RpZnkgYnkgaGlrYXJ1IDYuNgorCisJCXF1YWxpdHk9KHVuc2lnbmVkIGNoYXIpKCgqKHByaXYtPnJ4cmluZ3RhaWwrMykpICYgKDB4ZmYpKTsKKworCQlzdGF0cy5tYWNfdGltZVswXSA9ICoocHJpdi0+cnhyaW5ndGFpbCsxKTsKKwkJc3RhdHMubWFjX3RpbWVbMV0gPSAqKHByaXYtPnJ4cmluZ3RhaWwrMik7CisJCXJ4cG93ZXIgPSgoY2hhcikoKCgqKHByaXYtPnJ4cmluZ3RhaWwrNCkpJiAoMHgwMGZmMDAwMCkpPj4xNikpLzIgLSA0MjsKKwkJUlNTSSA9ICgodTgpKCgoKihwcml2LT5yeHJpbmd0YWlsKzMpKSAmICgweDAwMDBmZjAwKSk+PiA4KSkgJiAoMHg3Zik7CisKKyNlbHNlCisJCXNpZ25hbD0oKCoocHJpdi0+cnhyaW5ndGFpbCsxKSkmICgweGZmMDAwMCkpPj4xNjsKKwkJc2lnbmFsPShzaWduYWwmMHhmZSk+PjE7CS8vIE1vZGlmeSBieSBoaWthcnUgNi42CisKKwkJcXVhbGl0eT0oKCoocHJpdi0+cnhyaW5ndGFpbCsxKSkgJiAoMHhmZikpOworCisJCXN0YXRzLm1hY190aW1lWzBdID0gKihwcml2LT5yeHJpbmd0YWlsKzIpOworCQlzdGF0cy5tYWNfdGltZVsxXSA9ICoocHJpdi0+cnhyaW5ndGFpbCszKTsKKyNlbmRpZgorCQlyYXRlPSgoKihwcml2LT5yeHJpbmd0YWlsKSkgJgorCQkJKCgxPDwyMyl8KDE8PDIyKXwoMTw8MjEpfCgxPDwyMCkpKT4+MjA7CisKKwkJc3RhdHMucmF0ZSA9IHJ0bDgxODBfcmF0ZTJyYXRlKHJhdGUpOworCQkvL0RNRVNHKCIlZCIscmF0ZSk7CisJCUFudGVubmEgPSAoKCgqKHByaXYtPnJ4cmluZ3RhaWwgKzMpKSYgKDB4MDAwMDgwMDApKSA9PSAwICk/IDA6MSA7CisvLwkJcHJpbnRrKCJpbiBydGw4MTgwX3J4KCk6QW50ZW5uYSBpcyAlZFxuIixBbnRlbm5hKTsKKy8vYnkgYW15IGZvciBhbnRlbm5hCisJCWlmKCFydGw4MTgwX0lzV2lyZWxlc3NCTW9kZShzdGF0cy5yYXRlKSkKKwkJeyAvLyBPRkRNIHJhdGUuCisKKwkJCVJ4QUdDX2RCbSA9IHJ4cG93ZXIrMTsJLy9iaWFzCisJCX0KKwkJZWxzZQorCQl7IC8vIENDSyByYXRlLgorCQkJUnhBR0NfZEJtID0gc2lnbmFsOy8vYml0IDAgZGlzY2FyZAorCisJCQlMTkEgPSAodTgpIChSeEFHQ19kQm0gJiAweDYwICkgPj4gNSA7IC8vYml0IDZ+IGJpdCA1CisJCQlCQiAgPSAodTgpIChSeEFHQ19kQm0gJiAweDFGKTsgIC8vIGJpdCA0IH4gYml0IDAKKworICAgCQkJUnhBR0NfZEJtID0gLSggTE5BX2dhaW5bTE5BXSArIChCQiAqMikgKTsgLy9QaW5fMTFiPS0oTE5BX2dhaW4rQkJfZ2FpbikgKGRCbSkKKworCQkJUnhBR0NfZEJtICs9NDsgLy9iaWFzCisJCX0KKworCQlpZihSeEFHQ19kQm0gJiAweDgwKSAvL2Fic29sdXRlIHZhbHVlCisgICAJCQlSWEFHQz0gfihSeEFHQ19kQm0pKzE7CisJCWJDY2tSYXRlID0gcnRsODE4MF9Jc1dpcmVsZXNzQk1vZGUoc3RhdHMucmF0ZSk7CisJCS8vIFRyYW5zbGF0ZSBSWEFHQyBpbnRvIDEtMTAwLgorCQlpZighcnRsODE4MF9Jc1dpcmVsZXNzQk1vZGUoc3RhdHMucmF0ZSkpCisJCXsgLy8gT0ZETSByYXRlLgorCQkJaWYoUlhBR0M+OTApCisJCQkJUlhBR0M9OTA7CisJCQllbHNlIGlmKFJYQUdDPDI1KQorCQkJCVJYQUdDPTI1OworCQkJUlhBR0M9KDkwLVJYQUdDKSoxMDAvNjU7CisJCX0KKwkJZWxzZQorCQl7IC8vIENDSyByYXRlLgorCQkJaWYoUlhBR0M+OTUpCisJCQkJUlhBR0M9OTU7CisJCQllbHNlIGlmKFJYQUdDPDMwKQorCQkJCVJYQUdDPTMwOworCQkJUlhBR0M9KDk1LVJYQUdDKSoxMDAvNjU7CisJCX0KKwkJcHJpdi0+U2lnbmFsU3RyZW5ndGggPSAodTgpUlhBR0M7CisJCXByaXYtPlJlY3ZTaWduYWxQb3dlciA9IFJ4QUdDX2RCbSA7ICAvLyBJdCBjYW4gdXNlIGRpcmVjdGx5IGJ5IFNEMyBDTUxpbgorCQlwcml2LT5SeFBvd2VyID0gcnhwb3dlcjsKKwkJcHJpdi0+UlNTSSA9IFJTU0k7CisvL3tieSBhbXkgMDgwMzEyCisJCS8vIFNRIHRyYW5zbGF0aW9uIGZvcm11bGFyIGlzIHByb3ZpZGVkIGJ5IFNEMyBEWi4gMjAwNi4wNi4yNywgYnkgcmNuamtvLgorCQlpZihxdWFsaXR5ID49IDEyNykKKwkJCXF1YWxpdHkgPSAxOy8vMDsgLy8wIHdpbGwgY2F1c2UgZXBjIHRvIHNob3cgc2lnbmFsIHplcm8gLCB3YWxrIGFyb3VkIG5vdzsKKwkJZWxzZSBpZihxdWFsaXR5IDwgMjcpCisJCQlxdWFsaXR5ID0gMTAwOworCQllbHNlCisJCQlxdWFsaXR5ID0gMTI3IC0gcXVhbGl0eTsKKwkJcHJpdi0+U2lnbmFsUXVhbGl0eSA9IHF1YWxpdHk7CisJCWlmKCFwcml2LT5jYXJkXzgxODUpCisJCQlwcmludGsoImNoZWNrIHlvdXIgY2FyZCB0eXBlXG4iKTsKKworCQlzdGF0cy5zaWduYWwgPSAodTgpcXVhbGl0eTsvL3ByaXYtPndzdGF0cy5xdWFsLmxldmVsID0gcHJpdi0+U2lnbmFsU3RyZW5ndGg7CisJCXN0YXRzLnNpZ25hbHN0cmVuZ3RoID0gUlhBR0M7CisJCWlmKHN0YXRzLnNpZ25hbHN0cmVuZ3RoID4gMTAwKQorCQkJc3RhdHMuc2lnbmFsc3RyZW5ndGggPSAxMDA7CisJCXN0YXRzLnNpZ25hbHN0cmVuZ3RoID0gKHN0YXRzLnNpZ25hbHN0cmVuZ3RoICogNzApLzEwMCArIDMwOworCS8vCXByaW50aygiPT09PT09PT09PT09PT09PT09PT09PT09PT0+cnggOiBSWEFHQyBpcyAlZCxzaWduYWxzdHJlbmd0aCBpcyAlZFxuIixSWEFHQyxzdGF0cy5zaWduYWxzdHJlbmd0aCk7CisJCXN0YXRzLnJzc2kgPSBwcml2LT53c3RhdHMucXVhbC5xdWFsID0gcHJpdi0+U2lnbmFsUXVhbGl0eTsKKwkJc3RhdHMubm9pc2UgPSBwcml2LT53c3RhdHMucXVhbC5ub2lzZSA9IDEwMCAtIHByaXYgLT53c3RhdHMucXVhbC5xdWFsOworLy9ieSBhbXkgMDgwMzEyfQorCQliSHdFcnJvciA9ICgoKCoocHJpdi0+cnhyaW5ndGFpbCkpJiAoMHgwMDAwMGZmZikpID09IDQwODApfCAoKCgqKHByaXYtPnJ4cmluZ3RhaWwpKSYgKDB4MDQwMDAwMDApKSAhPSAwICkKKwkJCXwgKCgoKihwcml2LT5yeHJpbmd0YWlsKSkmICgweDA4MDAwMDAwKSkgIT0gMCApfCAoKCh+KCoocHJpdi0+cnhyaW5ndGFpbCkpKSYgKDB4MTAwMDAwMDApKSAhPSAwICl8ICgoKH4oKihwcml2LT5yeHJpbmd0YWlsKSkpJiAoMHgyMDAwMDAwMCkpICE9IDAgKTsKKwkJYkNSQyA9ICgoKihwcml2LT5yeHJpbmd0YWlsKSkgJiAoMHgwMDAwMjAwMCkpID4+IDEzOworCQliSUNWID0gKCgqKHByaXYtPnJ4cmluZ3RhaWwpKSAmICgweDAwMDAxMDAwKSkgPj4gMTI7CisgICAgICAgICAgICBoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilwcml2LT5yeGJ1ZmZlci0+YnVmOworCQkgICAgZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7CisJICAgICAgICB0eXBlID0gV0xBTl9GQ19HRVRfVFlQRShmYyk7CisKKwkJCWlmKChJRUVFODAyMTFfRlRZUEVfQ1RMICE9IHR5cGUpICYmCisJCQkJKGVxTWFjQWRkcihwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgKGZjICYgSUVFRTgwMjExX0ZDVExfVE9EUyk/IGhkci0+YWRkcjEgOiAoZmMgJiBJRUVFODAyMTFfRkNUTF9GUk9NRFMgKT8gaGRyLT5hZGRyMiA6IGhkci0+YWRkcjMpKQorCQkJCSAmJiAoIWJId0Vycm9yKSAmJiAoIWJDUkMpJiYgKCFiSUNWKSkKKwkJCXsKKy8vYnkgYW15IDA4MDMxMgorCQkJCS8vIFBlcmZvcm0gc2lnbmFsIHNtb290aGluZyBmb3IgZHluYW1pYyBtZWNoYW5pc20gb24gZGVtYW5kLgorCQkJCS8vIFRoaXMgaXMgZGlmZmVyZW50IHdpdGggUGVyZm9ybVNpZ25hbFNtb290aGluZzgxODUgaW4gc21vb3RoaW5nIGZvbXVsYS4KKwkJCQkvLyBObyBkcmFtYXRpYyBhZGp1c3Rpb24gaXMgYXBwbHkgYmVjYXVzZSBkeW5hbWljIG1lY2hhbmlzbSBuZWVkIHNvbWUgZGVncmVlCisJCQkJLy8gb2YgY29ycmVjdG5lc3MuIDIwMDcuMDEuMjMsIGJ5IHNoaWVuIGNoYW5nLgorCQkJCVBlcmZvcm1VbmRlY29yYXRlZFNpZ25hbFNtb290aGluZzgxODUocHJpdixiQ2NrUmF0ZSk7CisJCQkJLy8KKwkJCQkvLyBGb3IgZ29vZC1sb29raW5nIHNpbmdhbCBzdHJlbmd0aC4KKwkJCQkvLworCQkJCVNpZ25hbFN0cmVuZ3RoSW5kZXggPSBOZXRnZWFyU2lnbmFsU3RyZW5ndGhUcmFuc2xhdGUoCisJCQkJCQkJCXByaXYtPkxhc3RTaWduYWxTdHJlbmd0aEluUGVyY2VudCwKKwkJCQkJCQkJcHJpdi0+U2lnbmFsU3RyZW5ndGgpOworCisJCQkJcHJpdi0+TGFzdFNpZ25hbFN0cmVuZ3RoSW5QZXJjZW50ID0gU2lnbmFsU3RyZW5ndGhJbmRleDsKKwkJCQlwcml2LT5TdGF0c19TaWduYWxTdHJlbmd0aCA9IFRyYW5zbGF0ZVRvRGJtODE4NSgodTgpU2lnbmFsU3RyZW5ndGhJbmRleCk7CisJCS8vCisJCS8vIFdlIG5lZWQgbW9yZSBjb3JyZWN0IHBvd2VyIG9mIHJlY2VpdmVkIHBhY2tldHMgYW5kIHRoZSAgIlNpZ25hbFN0cmVuZ3RoIiBvZiBSeFN0YXRzIGlzIGJlYXV0aWZpZWQsCisJCS8vIHNvIHdlIHJlY29yZCB0aGUgY29ycmVjdCBwb3dlciBoZXJlLgorCQkvLworCQkJCXByaXYtPlN0YXRzX1NpZ25hbFF1YWxpdHkgPShsb25nKSAocHJpdi0+U3RhdHNfU2lnbmFsUXVhbGl0eSAqIDUgKyAobG9uZylwcml2LT5TaWduYWxRdWFsaXR5ICsgNSkgLyA2OworCQkJCXByaXYtPlN0YXRzX1JlY3ZTaWduYWxQb3dlciA9IChsb25nKShwcml2LT5TdGF0c19SZWN2U2lnbmFsUG93ZXIgKiA1ICsgcHJpdi0+UmVjdlNpZ25hbFBvd2VyIC0xKSAvIDY7CisKKwkJLy8gRmlndXJlIG91dCB3aGljaCBhbnRlbm5hIHRoYXQgcmVjZWl2ZWQgdGhlIGxhc3RlZCBwYWNrZXQuCisJCQkJcHJpdi0+TGFzdFJ4UGt0QW50ZW5uYSA9IEFudGVubmEgPyAxIDogMDsgLy8gMDogYXV4LCAxOiBtYWluLgorLy9ieSBhbXkgMDgwMzEyCisJCQkgICAgU3dBbnRlbm5hRGl2ZXJzaXR5UnhPazgxODUoZGV2LCBwcml2LT5TaWduYWxTdHJlbmd0aCk7CisJCQl9CisKKy8vYnkgYW15IGZvciBhbnRlbm5hCisKKworCisKKworCisjaWZuZGVmIERVTU1ZX1JYCisJCWlmKGZpcnN0KXsKKwkJCWlmKCFwcml2LT5yeF9za2JfY29tcGxldGUpeworCQkJCS8qIHNlZW1zIHRoYXQgSFcgc29tZXRpbWVzIGZhaWxzIHRvIHJlaWNldmUgYW5kCisJCQkJICAgZG9lc24ndCBwcm92aWRlIHRoZSBsYXN0IGRlc2NyaXB0b3IgKi8KKyNpZmRlZiBERUJVR19SWF9TS0IKKwkJCQlETUVTRygiZ29pbmcgdG8gZnJlZSBpbmNvbXBsZXRlIHNrYiIpOworI2VuZGlmCisJCQkJZGV2X2tmcmVlX3NrYl9hbnkocHJpdi0+cnhfc2tiKTsKKwkJCQlwcml2LT5zdGF0cy5yeG5vbGFzdCsrOworI2lmZGVmIERFQlVHX1JYX1NLQgorCQkJCURNRVNHKCJmcmVlIGluY29tcGxldGUgc2tiIE9LIik7CisjZW5kaWYKKwkJCX0KKwkJCS8qIHN1cHBvcnQgZm9yIHByaXNtIGhlYWRlciBoYXMgYmVlbiBvcmlnaW5hbGx5IGFkZGVkIGJ5IENocmlzdGlhbiAqLworCQkJaWYocHJpdi0+cHJpc21faGRyICYmIHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpeworCisjaWYgMAorCQkJCXByaXYtPnJ4X3NrYiA9IGRldl9hbGxvY19za2IobGVuKzIrUFJJU01fSERSX1NJWkUpOworCQkJCWlmKCEgcHJpdi0+cnhfc2tiKSBnb3RvIGRyb3A7CisKKwkJCQlwcmlzbV9oZHIgPSAodTMyKikgc2tiX3B1dChwcml2LT5yeF9za2IsUFJJU01fSERSX1NJWkUpOworCQkJCXByaXNtX2hkclswXT1odG9ubCgweDgwMjExMDAxKTsgICAgICAgIC8vdmVyc2lvbgorCQkJCXByaXNtX2hkclsxXT1odG9ubCgweDQwKTsgICAgICAgICAgICAgIC8vbGVuZ3RoCisJCQkJcHJpc21faGRyWzJdPWh0b25sKHN0YXRzLm1hY190aW1lWzFdKTsgICAgLy9tYWN0aW1lIChISUdIKQorCQkJCXByaXNtX2hkclszXT1odG9ubChzdGF0cy5tYWNfdGltZVswXSk7ICAgIC8vbWFjdGltZSAoTE9XKQorCQkJCXJkdHNjKHByaXNtX2hkcls1XSwgcHJpc21faGRyWzRdKTsgICAgICAgICAvL2hvc3RpbWUgKExPVytISUdIKQorCQkJCXByaXNtX2hkcls0XT1odG9ubChwcmlzbV9oZHJbNF0pOyAgICAgICAgICAvL0J5dGUtT3JkZXIgYWVuZGVybgorCQkJCXByaXNtX2hkcls1XT1odG9ubChwcmlzbV9oZHJbNV0pOyAgICAgICAgICAvL0J5dGUtT3JkZXIgYWVuZGVybgorCQkJCXByaXNtX2hkcls2XT0weDAwOyAgICAgICAgICAgICAgICAgICAgIC8vcGh5dHlwZQorCQkJCXByaXNtX2hkcls3XT1odG9ubChwcml2LT5jaGFuKTsgICAgICAgIC8vY2hhbm5lbAorCQkJCXByaXNtX2hkcls4XT1odG9ubChzdGF0cy5yYXRlKTsgICAgICAgIC8vZGF0YXJhdGUKKwkJCQlwcmlzbV9oZHJbOV09MHgwMDsgICAgICAgICAgICAgICAgICAgICAvL2FudGVubmEKKwkJCQlwcmlzbV9oZHJbMTBdPTB4MDA7ICAgICAgICAgICAgICAgICAgICAvL3ByaW9yaXR5CisJCQkJcHJpc21faGRyWzExXT0weDAwOyAgICAgICAgICAgICAgICAgICAgLy9zc2lfdHlwZQorCQkJCXByaXNtX2hkclsxMl09aHRvbmwoc3RhdHMuc2lnbmFsKTsgICAgIC8vc3NpX3NpZ25hbAorCQkJCXByaXNtX2hkclsxM109aHRvbmwoc3RhdHMubm9pc2UpOyAgICAgIC8vc3NpX25vaXNlCisJCQkJcHJpc21faGRyWzE0XT0weDAwOyAgICAgICAgICAgICAgICAgICAgLy9wcmVhbWJsZQorCQkJCXByaXNtX2hkclsxNV09MHgwMDsgICAgICAgICAgICAgICAgICAgIC8vZW5jb2RpbmcKKworI2VuZGlmCisJCQl9ZWxzZXsKKwkJCQlwcml2LT5yeF9za2IgPSBkZXZfYWxsb2Nfc2tiKGxlbisyKTsKKwkJCQlpZiggIXByaXYtPnJ4X3NrYikgZ290byBkcm9wOworI2lmZGVmIERFQlVHX1JYX1NLQgorCQkJCURNRVNHKCJBbGxvYyBpbml0aWFsIHNrYiAleCIsbGVuKzIpOworI2VuZGlmCisJCQl9CisKKwkJCXByaXYtPnJ4X3NrYl9jb21wbGV0ZT0wOworCQkJcHJpdi0+cnhfc2tiLT5kZXY9ZGV2OworCQl9ZWxzZXsKKwkJCS8qIGlmIHdlIGFyZSBoZXJlIHdlIHNob3VsZCAgaGF2ZSBhbHJlYWR5IFJYZWQKKwkJCSogdGhlIGZpcnN0IGZyYW1lLgorCQkJKiBJZiB3ZSBnZXQgaGVyZSBhbmQgdGhlIHNrYiBpcyBub3QgYWxsb2NhdGVkIHRoZW4KKwkJCSogd2UgaGF2ZSBqdXN0IHRocm93IG91dCBnYXJiYWdlIChza2Igbm90IGFsbG9jYXRlZCkKKwkJCSogYW5kIHdlIGFyZSBzdGlsbCByeGluZyBnYXJiYWdlLi4uLgorCQkJKi8KKwkJCWlmKCFwcml2LT5yeF9za2JfY29tcGxldGUpeworCisJCQkJdG1wX3NrYj0gZGV2X2FsbG9jX3NrYihwcml2LT5yeF9za2ItPmxlbiArbGVuKzIpOworCisJCQkJaWYoIXRtcF9za2IpIGdvdG8gZHJvcDsKKworCQkJCXRtcF9za2ItPmRldj1kZXY7CisjaWZkZWYgREVCVUdfUlhfU0tCCisJCQkJRE1FU0coIlJlYWxsb2Mgc2tiICV4IixsZW4rMik7CisjZW5kaWYKKworI2lmZGVmIERFQlVHX1JYX1NLQgorCQkJCURNRVNHKCJnb2luZyBjb3B5IHByZXYgZnJhZyAleCIscHJpdi0+cnhfc2tiLT5sZW4pOworI2VuZGlmCisJCQkJbWVtY3B5KHNrYl9wdXQodG1wX3NrYixwcml2LT5yeF9za2ItPmxlbiksCisJCQkJCXByaXYtPnJ4X3NrYi0+ZGF0YSwKKwkJCQkJcHJpdi0+cnhfc2tiLT5sZW4pOworI2lmZGVmIERFQlVHX1JYX1NLQgorCQkJCURNRVNHKCJza2IgY29weSBwcmV2IGZyYWcgY29tcGxldGUiKTsKKyNlbmRpZgorCisJCQkJZGV2X2tmcmVlX3NrYl9hbnkocHJpdi0+cnhfc2tiKTsKKyNpZmRlZiBERUJVR19SWF9TS0IKKwkJCQlETUVTRygicHJldiBza2IgZnJlZSBvayIpOworI2VuZGlmCisKKwkJCQlwcml2LT5yeF9za2I9dG1wX3NrYjsKKwkJCX0KKwkJfQorI2lmZGVmIERFQlVHX1JYX1NLQgorCQlETUVTRygiZ29pbmcgdG8gY29weSBjdXJyZW50IHBheWxvYWQgJXgiLGxlbik7CisjZW5kaWYKKwkJaWYoIXByaXYtPnJ4X3NrYl9jb21wbGV0ZSkgeworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCQkJaWYocGFkZGluZykgeworCQkJCW1lbWNweShza2JfcHV0KHByaXYtPnJ4X3NrYixsZW4pLAorCQkJCQkoKCh1bnNpZ25lZCBjaGFyICopcHJpdi0+cnhidWZmZXItPmJ1ZikgKyAyKSxsZW4pOworCQkJfSBlbHNlIHsKKyNlbmRpZgorCQkJCW1lbWNweShza2JfcHV0KHByaXYtPnJ4X3NrYixsZW4pLAorCQkJCQlwcml2LT5yeGJ1ZmZlci0+YnVmLGxlbik7CisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisJCQl9CisjZW5kaWYKKwkJfQorI2lmZGVmIERFQlVHX1JYX1NLQgorCQlETUVTRygiY3VycmVudCBmcmFnbWVudCBza2IgY29weSBjb21wbGV0ZSIpOworI2VuZGlmCisKKwkJaWYobGFzdCAmJiAhcHJpdi0+cnhfc2tiX2NvbXBsZXRlKXsKKworI2lmZGVmIERFQlVHX1JYX1NLQgorCQkJRE1FU0coIkdvdCBsYXN0IGZyYWdtZW50Iik7CisjZW5kaWYKKworCQkJaWYocHJpdi0+cnhfc2tiLT5sZW4gPiA0KQorCQkJCXNrYl90cmltKHByaXYtPnJ4X3NrYixwcml2LT5yeF9za2ItPmxlbi00KTsKKyNpZmRlZiBERUJVR19SWF9TS0IKKwkJCURNRVNHKCJ5YW5rZWQgb3V0IGNyYywgcGFzc2luZyB0byB0aGUgdXBwZXIgbGF5ZXIiKTsKKyNlbmRpZgorCisjaWZuZGVmIFJYX0RPTlRfUEFTU19VTAorCQkJaWYoIWllZWU4MDIxMV9yeChwcml2LT5pZWVlODAyMTEsCisJCQkJCSBwcml2LT5yeF9za2IsICZzdGF0cykpeworI2lmZGVmIERFQlVHX1JYCisJCQkJRE1FU0dXKCJQYWNrZXQgbm90IGNvbnN1bWVkIik7CisjZW5kaWYKKyNlbmRpZiAvLyBSWF9ET05UX1BBU1NfVUwKKworCQkJCWRldl9rZnJlZV9za2JfYW55KHByaXYtPnJ4X3NrYik7CisjaWZuZGVmIFJYX0RPTlRfUEFTU19VTAorCQkJfQorI2VuZGlmCisjaWZkZWYgREVCVUdfUlgKKwkJCWVsc2V7CisJCQkJCURNRVNHKCJSY3YgZnJhZyIpOworCQkJfQorI2VuZGlmCisJCQlwcml2LT5yeF9za2JfY29tcGxldGU9MTsKKwkJfQorCisjZW5kaWYgLy9EVU1NWV9SWAorCisJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShwcml2LT5wZGV2LAorCQkJCSAgICBwcml2LT5yeGJ1ZmZlci0+ZG1hLAorCQkJCSAgICBwcml2LT5yeGJ1ZmZlcnNpemUgKiBcCisJCQkJICAgIHNpemVvZih1OCksCisJCQkJICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKworZHJvcDogLy8gdGhpcyBpcyB1c2VkIHdoZW4gd2UgaGF2ZSBub3QgZW5vdWdodCBtZW0KKworCQkvKiByZXN0b3JlIHRoZSBkZXNjcmlwdG9yICovCisJCSoocHJpdi0+cnhyaW5ndGFpbCsyKT1wcml2LT5yeGJ1ZmZlci0+ZG1hOworCQkqKHByaXYtPnJ4cmluZ3RhaWwpPSoocHJpdi0+cnhyaW5ndGFpbCkgJn4gMHhmZmY7CisJCSoocHJpdi0+cnhyaW5ndGFpbCk9CisJCQkqKHByaXYtPnJ4cmluZ3RhaWwpIHwgcHJpdi0+cnhidWZmZXJzaXplOworCisJCSoocHJpdi0+cnhyaW5ndGFpbCk9CisJCQkqKHByaXYtPnJ4cmluZ3RhaWwpIHwgKDE8PDMxKTsKKwkJCS8vXmVtcHR5IGRlc2NyaXB0b3IKKworCQkJLy93bWIoKTsKKworI2lmZGVmIERFQlVHX1JYCisJCURNRVNHKCJDdXJyZW50IGRlc2NyaXB0b3I6ICV4IiwodTMyKXByaXYtPnJ4cmluZ3RhaWwpOworI2VuZGlmCisJCS8vdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJLy9zcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+aXJxX2xvY2ssZmxhZ3MpOworCisJCXByaXYtPnJ4cmluZ3RhaWwrPXJ4X2Rlc2Nfc2l6ZTsKKwkJaWYocHJpdi0+cnhyaW5ndGFpbCA+PQorCQkgICAocHJpdi0+cnhyaW5nKSsocHJpdi0+cnhyaW5nY291bnQgKSpyeF9kZXNjX3NpemUpCisJCQlwcml2LT5yeHJpbmd0YWlsPXByaXYtPnJ4cmluZzsKKworCQkvL3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmlycV9sb2NrLGZsYWdzKTsKKworCisJCXByaXYtPnJ4YnVmZmVyPShwcml2LT5yeGJ1ZmZlci0+bmV4dCk7CisKKwl9CisKKworCisvLwlpZihnZXRfY3Vycl90eF9mcmVlX2Rlc2MoZGV2LHByaW9yaXR5KSkKKy8vCWllZWU4MDIxMV9zdGFfcHNfc2xlZXAocHJpdi0+aWVlZTgwMjExLCAmdG1wLCAmdG1wMik7CisKKworCit9CisKKwordm9pZCBydGw4MTgwX2RtYV9raWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwcmlvcml0eSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwlydGw4MTgwX3NldF9tb2RlKGRldixFUFJPTV9DTURfQ09ORklHKTsKKy8qCisKKwlzd2l0Y2gocHJpb3JpdHkpeworCisJCWNhc2UgTE9XX1BSSU9SSVRZOgorCisJCXdyaXRlX25pY19ieXRlKGRldixUWF9ETUFfUE9MTElORywKKwkJICAgICAgICgxPDwgVFhfRE1BX1BPTExJTkdfTE9XUFJJT1JJVFlfU0hJRlQpIHwKKwkJCSAgICAgICAgcHJpdi0+ZG1hX3BvbGxfbWFzayk7CisJCWJyZWFrOworCisJCWNhc2UgTk9STV9QUklPUklUWToKKworCQl3cml0ZV9uaWNfYnl0ZShkZXYsVFhfRE1BX1BPTExJTkcsCisJCSAgICAgICAoMTw8IFRYX0RNQV9QT0xMSU5HX05PUk1QUklPUklUWV9TSElGVCkgfAorCQkJICAgICAgICBwcml2LT5kbWFfcG9sbF9tYXNrKTsKKwkJYnJlYWs7CisKKwkJY2FzZSBISV9QUklPUklUWToKKworCQl3cml0ZV9uaWNfYnl0ZShkZXYsVFhfRE1BX1BPTExJTkcsCisJCSAgICAgICAoMTw8IFRYX0RNQV9QT0xMSU5HX0hJUFJJT1JJVFlfU0hJRlQpIHwKKwkJCSAgICAgICAgcHJpdi0+ZG1hX3BvbGxfbWFzayk7CisJCWJyZWFrOworCisJfQorKi8KKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFRYX0RNQV9QT0xMSU5HLAorCQkJKDEgPDwgKHByaW9yaXR5ICsgMSkpIHwgcHJpdi0+ZG1hX3BvbGxfbWFzayk7CisJcnRsODE4MF9zZXRfbW9kZShkZXYsRVBST01fQ01EX05PUk1BTCk7CisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworfQorCisjaWYgMAordm9pZCBydGw4MTgwX3R4X3F1ZXVlc19zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLy9zdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJdTggZG1hX3BvbGxfbWFzayA9ICgxPDxUWF9ETUFfU1RPUF9MT1dQUklPUklUWV9TSElGVCk7CisJZG1hX3BvbGxfbWFzayB8PSAoMTw8VFhfRE1BX1NUT1BfSElQUklPUklUWV9TSElGVCk7CisJZG1hX3BvbGxfbWFzayB8PSAoMTw8VFhfRE1BX1NUT1BfTk9STVBSSU9SSVRZX1NISUZUKTsKKwlkbWFfcG9sbF9tYXNrIHw9ICgxPDxUWF9ETUFfU1RPUF9CRUFDT05fU0hJRlQpOworCisJcnRsODE4MF9zZXRfbW9kZShkZXYsRVBST01fQ01EX0NPTkZJRyk7CisJd3JpdGVfbmljX2J5dGUoZGV2LFRYX0RNQV9QT0xMSU5HLGRtYV9wb2xsX21hc2spOworCXJ0bDgxODBfc2V0X21vZGUoZGV2LEVQUk9NX0NNRF9OT1JNQUwpOworfQorI2VuZGlmCisKK3ZvaWQgcnRsODE4MF9kYXRhX2hhcmRfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXJ0bDgxODBfc2V0X21vZGUoZGV2LEVQUk9NX0NNRF9DT05GSUcpOworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCXByaXYtPmRtYV9wb2xsX3N0b3BfbWFzayB8PSBUUFBPTExTVE9QX0FDX1ZJUTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsVFBQb2xsU3RvcCwgcHJpdi0+ZG1hX3BvbGxfc3RvcF9tYXNrKTsKKyNlbHNlCisJcHJpdi0+ZG1hX3BvbGxfbWFzayB8PSAoMTw8VFhfRE1BX1NUT1BfTE9XUFJJT1JJVFlfU0hJRlQpOworCXdyaXRlX25pY19ieXRlKGRldixUWF9ETUFfUE9MTElORyxwcml2LT5kbWFfcG9sbF9tYXNrKTsKKyNlbmRpZgorCXJ0bDgxODBfc2V0X21vZGUoZGV2LEVQUk9NX0NNRF9OT1JNQUwpOworfQorCisKK3ZvaWQgcnRsODE4MF9kYXRhX2hhcmRfcmVzdW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisJcnRsODE4MF9zZXRfbW9kZShkZXYsRVBST01fQ01EX0NPTkZJRyk7CisjaWZkZWYgIENPTkZJR19SVEw4MTg1QgorCXByaXYtPmRtYV9wb2xsX3N0b3BfbWFzayAmPSB+KFRQUE9MTFNUT1BfQUNfVklRKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsVFBQb2xsU3RvcCwgcHJpdi0+ZG1hX3BvbGxfc3RvcF9tYXNrKTsKKyNlbHNlCisJcHJpdi0+ZG1hX3BvbGxfbWFzayAmPSB+KDE8PFRYX0RNQV9TVE9QX0xPV1BSSU9SSVRZX1NISUZUKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsVFhfRE1BX1BPTExJTkcscHJpdi0+ZG1hX3BvbGxfbWFzayk7CisjZW5kaWYKKwlydGw4MTgwX3NldF9tb2RlKGRldixFUFJPTV9DTURfTk9STUFMKTsKK30KKworCisvKiB0aGlzIGZ1bmN0aW9uIFRYIGRhdGEgZnJhbWVzIHdoZW4gdGhlIGllZWU4MDIxMSBzdGFjayByZXF1aXJlcyB0aGlzLgorICogSXQgY2hlY2tzIGFsc28gaWYgd2UgbmVlZCB0byBzdG9wIHRoZSBpZWVlIHR4IHF1ZXVlLCBldmVudHVhbGx5IGRvIGl0CisgKi8KK3ZvaWQgcnRsODE4MF9oYXJkX2RhdGFfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludAorcmF0ZSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJaW50IG1vZGU7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICpoID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICAqKSBza2ItPmRhdGE7CisJc2hvcnQgbW9yZWZyYWcgPSAoaC0+ZnJhbWVfY3RsKSAmIElFRUU4MDIxMV9GQ1RMX01PUkVGUkFHUzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBwcmlvcml0eTsKKwkvL3N0YXRpYyBpbnQgY291bnQgPSAwOworCisJbW9kZSA9IHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZTsKKworCXJhdGUgPSBpZWVlcmF0ZTJydGxyYXRlKHJhdGUpOworCS8qCisJKiBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgcmVxdWlyZSBsb2NrIGJlY2F1c2Ugd2UgbWFrZQorCSogc3VyZSBpdCdzIGNhbGxlZCB3aXRoIHRoZSB0eF9sb2NrIGFscmVhZHkgYWNxdWlyZWQuCisJKiB0aGlzIGNvbWUgZnJvbSB0aGUga2VybmVsJ3MgaGFyZF94bWl0IGNhbGxiYWNrICh0cm91Z2h0CisJKiB0aGUgaWVlZSBzdGFjaywgb3IgZnJvbSB0aGUgdHJ5X3dha2VfcXVldWUgKGFnYWluIHRyb3VnaHQKKwkqIHRoZSBpZWVlIHN0YWNrLgorCSovCisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisJcHJpb3JpdHkgPSBBQzJRKHNrYi0+cHJpb3JpdHkpOworI2Vsc2UKKwlwcmlvcml0eSA9IExPV19QUklPUklUWTsKKyNlbmRpZgorCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT50eF9sb2NrLGZsYWdzKTsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYpCisJeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9sb2NrLGZsYWdzKTsKKworCQlyZXR1cm47CisJfQorCisJLy9wcmludGsoS0VSTl9XQVJOSU5HICJwcmlvcml0eSA9ICVkQCVkXG4iLCBwcmlvcml0eSwgY291bnQrKyk7CisJaWYgKCFjaGVja19uaWNfZW5vdWdodF9kZXNjKGRldiwgcHJpb3JpdHkpKXsKKwkJLy9ETUVTRygiRXJyb3I6IG5vIGRlc2NyaXB0b3IgbGVmdCBieSBwcmV2aW91cyBUWCAoYXZhaWwgJWQpICIsCisJCS8vCWdldF9jdXJyX3R4X2ZyZWVfZGVzYyhkZXYsIHByaW9yaXR5KSk7CisJCURNRVNHVygiRXJyb3I6IG5vIGRlc2NyaXB0b3IgbGVmdCBieSBwcmV2aW91cyBUWCAoYXZhaWwgJWQpICIsCisJCQlnZXRfY3Vycl90eF9mcmVlX2Rlc2MoZGV2LCBwcmlvcml0eSkpOworCS8vcHJpbnRrKEtFUk5fV0FSTklORyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0+IFxuIik7CisJCWllZWU4MDIxMV9zdG9wX3F1ZXVlKHByaXYtPmllZWU4MDIxMSk7CisJfQorCXJ0bDgxODBfdHgoZGV2LCBza2ItPmRhdGEsIHNrYi0+bGVuLCBwcmlvcml0eSwgbW9yZWZyYWcsMCxyYXRlKTsKKwlpZiAoIWNoZWNrX25pY19lbm91Z2h0X2Rlc2MoZGV2LCBwcmlvcml0eSkpCisJCWllZWU4MDIxMV9zdG9wX3F1ZXVlKHByaXYtPmllZWU4MDIxMSk7CisKKwkvL2Rldl9rZnJlZV9za2JfYW55KHNrYik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jayxmbGFncyk7CisKK30KKworLyogVGhpcyBpcyBhIHJvdWdoIGF0dGVtcHQgdG8gVFggYSBmcmFtZQorICogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGllZWUgODAyMTEgc3RhY2sgdG8gVFggbWFuYWdlbWVudCBmcmFtZXMuCisgKiBJZiB0aGUgcmluZyBpcyBmdWxsIHBhY2tldCBhcmUgZHJvcHBlZCAoZm9yIGRhdGEgZnJhbWUgdGhlIHF1ZXVlCisgKiBpcyBzdG9wcGVkIGJlZm9yZSB0aGlzIGNhbiBoYXBwZW4pLiBGb3IgdGhpcyByZWFzb24gaXQgaXMgYmV0dGVyCisgKiBpZiB0aGUgZGVzY3JpcHRvcnMgYXJlIGxhcmdlciB0aGFuIHRoZSBsYXJnZXN0IG1hbmFnZW1lbnQgZnJhbWUKKyAqIHdlIGludGVuZCB0byBUWDogaSdtIHVuc3VyZSB3aGF0IHRoZSBIVyBkb2VzIGlmIGl0IHdpbGwgbm90IGZvdW5kCisgKiB0aGUgbGFzdCBmcmFnbWVudCBvZiBhIGZyYW1lIGJlY2F1c2UgaXQgaGFzIGJlZW4gZHJvcHBlZC4uLgorICogU2luY2UgcXVldWVzIGZvciBNYW5hZ2VtZW50IGFuZCBEYXRhIGZyYW1lcyBhcmUgZGlmZmVyZW50IHdlCisgKiBtaWdodCB1c2UgYSBkaWZmZXJlbnQgbG9jayB0aGFuIHR4X2xvY2sgKGZvciBleGFtcGxlIG1nbXRfdHhfbG9jaykKKyAqLworLyogdGhlc2UgZnVuY3Rpb24gbWF5IGxvb3BzIGlmIGludm9rZWQgd2l0aCAwIGRlc2NyaXB0b3JzIG9yIDAgbGVuIGJ1ZmZlciovCitpbnQgcnRsODE4MF9oYXJkX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYixzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpbnQgcHJpb3JpdHk7CisKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKwlwcmlvcml0eSA9IE1BTkFHRV9QUklPUklUWTsKKyNlbHNlCisJcHJpb3JpdHkgPSBOT1JNX1BSSU9SSVRZOworI2VuZGlmCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+dHhfbG9jayxmbGFncyk7CisKKwlpZihwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmKQorCXsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jayxmbGFncyk7CisKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcnRsODE4MF90eChkZXYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sIHByaW9yaXR5LAorCQkwLCAwLGllZWVyYXRlMnJ0bHJhdGUocHJpdi0+aWVlZTgwMjExLT5iYXNpY19yYXRlKSk7CisKKwlwcml2LT5pZWVlODAyMTEtPnN0YXRzLnR4X2J5dGVzKz1za2ItPmxlbjsKKwlwcml2LT5pZWVlODAyMTEtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9sb2NrLGZsYWdzKTsKKworCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJcmV0dXJuIDA7Cit9CisKKy8vIGxvbmdwcmUgMTQ0KzQ4IHNob3J0cHJlIDcyKzI0Cit1MTYgcnRsODE4MF9sZW4yZHVyYXRpb24odTMyIGxlbiwgc2hvcnQgcmF0ZSxzaG9ydCogZXh0KQoreworCXUxNiBkdXJhdGlvbjsKKwl1MTYgZHJpZnQ7CisJKmV4dD0wOworCisJc3dpdGNoKHJhdGUpeworCWNhc2UgMDovLzFtYnBzCisJCSpleHQ9MDsKKwkJZHVyYXRpb24gPSAoKGxlbis0KTw8NCkgLzB4MjsKKwkJZHJpZnQgPSAoKGxlbis0KTw8NCkgJSAweDI7CisJCWlmKGRyaWZ0ID09MCApIGJyZWFrOworCQlkdXJhdGlvbisrOworCQlicmVhazsKKworCWNhc2UgMTovLzJtYnBzCisJCSpleHQ9MDsKKwkJZHVyYXRpb24gPSAoKGxlbis0KTw8NCkgLzB4NDsKKwkJZHJpZnQgPSAoKGxlbis0KTw8NCkgJSAweDQ7CisJCWlmKGRyaWZ0ID09MCApIGJyZWFrOworCQlkdXJhdGlvbisrOworCQlicmVhazsKKworCWNhc2UgMjogLy81LjVtYnBzCisJCSpleHQ9MDsKKwkJZHVyYXRpb24gPSAoKGxlbis0KTw8NCkgLzB4YjsKKwkJZHJpZnQgPSAoKGxlbis0KTw8NCkgJSAweGI7CisJCWlmKGRyaWZ0ID09MCApCisJCQlicmVhazsKKwkJZHVyYXRpb24rKzsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCWNhc2UgMzovLzExbWJwcworCQkqZXh0PTA7CisJCWR1cmF0aW9uID0gKChsZW4rNCk8PDQpIC8weDE2OworCQlkcmlmdCA9ICgobGVuKzQpPDw0KSAlIDB4MTY7CisJCWlmKGRyaWZ0ID09MCApCisJCQlicmVhazsKKwkJZHVyYXRpb24rKzsKKwkJaWYoZHJpZnQgPiA2KQorCQkJYnJlYWs7CisJCSpleHQ9MTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGR1cmF0aW9uOworfQorCisKK3ZvaWQgcnRsODE4MF9wcmVwYXJlX2JlYWNvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXUxNiB3b3JkICA9IHJlYWRfbmljX3dvcmQoZGV2LCBCY25JdHYpOworCXdvcmQgJj0gfkJjbkl0dl9CY25JdHY7IC8vIGNsZWFyIEJjbl9JdHYKKwl3b3JkIHw9IGNwdV90b19sZTE2KHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCk7Ly8weDY0OworCXdyaXRlX25pY193b3JkKGRldiwgQmNuSXR2LCB3b3JkKTsKKworCisJc2tiID0gaWVlZTgwMjExX2dldF9iZWFjb24ocHJpdi0+aWVlZTgwMjExKTsKKwlpZihza2IpeworCQlydGw4MTgwX3R4KGRldixza2ItPmRhdGEsc2tiLT5sZW4sQkVBQ09OX1BSSU9SSVRZLAorCQkJMCwwLGllZWVyYXRlMnJ0bHJhdGUocHJpdi0+aWVlZTgwMjExLT5iYXNpY19yYXRlKSk7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJfQorCSNpZiAwCisJLy9ETUVTRygic2l6ZSAleCIsbGVuKTsKKwlpZigqdGFpbCAmICgxPDwzMSkpeworCisJCS8vRE1FU0coIk5vIG1vcmUgYmVhY29uIFRYIGRlc2MiKTsKKwkJcmV0dXJuIDsKKworCX0KKwkvL3doaWxlKCEgKnRhaWwgJiAoMTw8MzEpKXsKKwkJKnRhaWw9IDA7IC8vIHplcm9lcyBoZWFkZXIKKworCQkqdGFpbCA9ICp0YWlsfCAoMTw8MjkpIDsgLy9maXN0IHNlZ21lbnQgb2YgdGhlIHBhY2tldAorCQkqdGFpbCA9ICgqdGFpbCkgfCAoMTw8MjgpOyAvLyBsYXN0IHNlZ21lbnQKKwkvLwkqdGFpbCA9ICp0YWlsIHwgKDE8PDE4KTsgLy8gdGhpcyBpcyAgYSBiZWFjb24gZnJhbWUKKwkJKih0YWlsKzMpPSoodGFpbCszKSAmfiAweGZmZjsKKwkJKih0YWlsKzMpPSoodGFpbCszKSB8IGxlbjsgLy8gYnVmZmVyIGxlbmdodAorCQkqdGFpbCA9ICp0YWlsIHxsZW47CisJCS8vIHplcm9lcyB0aGUgc2Vjb25kIDMyLWJpdHMgZHdvcmQgb2YgdGhlIGRlc2NyaXB0b3IKKwkJKih0YWlsKzEpPSAwOworCQkqdGFpbCA9ICp0YWlsIHwgKHJhdGUgPDwgMjQpOworCisJCQlkdXJhdGlvbiA9IHJ0bDgxODBfbGVuMmR1cmF0aW9uKGxlbixyYXRlLCZleHQpOworCisJCSoodGFpbCsxKSA9ICoodGFpbCsxKSB8ICgoZHVyYXRpb24gJiAweDdmZmYpPDwxNik7CisKKwkJKnRhaWwgPSAqdGFpbCB8ICgxPDwzMSk7CisJCS8vXiBkZXNjcmlwdG9yIHJlYWR5IHRvIGJlIHR4ZWQKKwkJaWYoKHRhaWwgLSBiZWdpbikvOCA9PSBwcml2LT50eGJlYWNvbmNvdW50LTEpCisJCQl0YWlsPWJlZ2luOworCQllbHNlCisJCQl0YWlsPXRhaWwrODsKKwkvL30KKyNlbmRpZgorfQorCisvKiBUaGlzIGZ1bmN0aW9uIGRvIHRoZSByZWFsIGRpcnR5IHdvcms6IGl0IGVucXVldWVzIGEgVFggY29tbWFuZAorICogZGVzY3JpcHRvciBpbiB0aGUgcmluZyBidWZmZXIsIGNvcHllcyB0aGUgZnJhbWUgaW4gYSBUWCBidWZmZXIKKyAqIGFuZCBraWNrcyB0aGUgTklDIHRvIGVuc3VyZSBpdCBkb2VzIHRoZSBETUEgdHJhbnNmZXIuCisgKi8KK3Nob3J0IHJ0bDgxODBfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTgqIHR4YnVmLCBpbnQgbGVuLCBpbnQgcHJpb3JpdHksCisJCSBzaG9ydCBtb3JlZnJhZywgc2hvcnQgZGVzY2ZyYWcsIGludCByYXRlKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIgKnRhaWwsKnRlbXBfdGFpbDsKKwl1MzIgKmJlZ2luOworCXUzMiAqYnVmOworCWludCBpOworCWludCByZW1haW47CisJaW50IGJ1ZmxlbjsKKwlpbnQgY291bnQ7CisJLy91MTYJQWNrQ3RzVGltZTsKKwkvL3UxNglGcmFtZVRpbWU7CisJdTE2IGR1cmF0aW9uOworCXNob3J0IGV4dDsKKwlzdHJ1Y3QgYnVmZmVyKiBidWZsaXN0OworCS8vdW5zaWduZWQgbG9uZyBmbGFnczsKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqZnJhZ19oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKil0eGJ1ZjsKKwl1OCBkZXN0W0VUSF9BTEVOXTsKKwl1OAkJCWJVc2VTaG9ydFByZWFtYmxlID0gMDsKKwl1OAkJCWJDVFNFbmFibGUgPSAwOworCXU4CQkJYlJUU0VuYWJsZSA9IDA7CisJLy91MTYJCQlSVFNSYXRlID0gMjI7CisJLy91OAkJCVJldHJ5TGltaXQgPSAwOworCXUxNiAJCQlEdXJhdGlvbiA9IDA7CisJdTE2CQkJUnRzRHVyID0gMDsKKwl1MTYJCQlUaGlzRnJhbWVUaW1lID0gMDsKKwl1MTYJCQlUeERlc2NEdXJhdGlvbiA9IDA7CisJdTggCQkJb3duYml0X2ZsYWcgPSBmYWxzZTsgLy9hZGRlZCBieSBkYXZpZCB3b28gZm9yIHN5bmMgVHgsIDIwMDcuMTIuMTQKKyNlbmRpZgorCisJc3dpdGNoKHByaW9yaXR5KSB7CisJY2FzZSBNQU5BR0VfUFJJT1JJVFk6CisJCXRhaWw9cHJpdi0+dHhtYXByaW5ndGFpbDsKKwkJYmVnaW49cHJpdi0+dHhtYXByaW5nOworCQlidWZsaXN0ID0gcHJpdi0+dHhtYXBidWZzdGFpbDsKKwkJY291bnQgPSBwcml2LT50eHJpbmdjb3VudDsKKwkJYnJlYWs7CisKKwljYXNlIEJLX1BSSU9SSVRZOgorCQl0YWlsPXByaXYtPnR4YmtwcmluZ3RhaWw7CisJCWJlZ2luPXByaXYtPnR4YmtwcmluZzsKKwkJYnVmbGlzdCA9IHByaXYtPnR4YmtwYnVmc3RhaWw7CisJCWNvdW50ID0gcHJpdi0+dHhyaW5nY291bnQ7CisJCWJyZWFrOworCisJY2FzZSBCRV9QUklPUklUWToKKwkJdGFpbD1wcml2LT50eGJlcHJpbmd0YWlsOworCQliZWdpbj1wcml2LT50eGJlcHJpbmc7CisJCWJ1Zmxpc3QgPSBwcml2LT50eGJlcGJ1ZnN0YWlsOworCQljb3VudCA9IHByaXYtPnR4cmluZ2NvdW50OworCQlicmVhazsKKworCWNhc2UgVklfUFJJT1JJVFk6CisJCXRhaWw9cHJpdi0+dHh2aXByaW5ndGFpbDsKKwkJYmVnaW49cHJpdi0+dHh2aXByaW5nOworCQlidWZsaXN0ID0gcHJpdi0+dHh2aXBidWZzdGFpbDsKKwkJY291bnQgPSBwcml2LT50eHJpbmdjb3VudDsKKwkJYnJlYWs7CisKKwljYXNlIFZPX1BSSU9SSVRZOgorCQl0YWlsPXByaXYtPnR4dm9wcmluZ3RhaWw7CisJCWJlZ2luPXByaXYtPnR4dm9wcmluZzsKKwkJYnVmbGlzdCA9IHByaXYtPnR4dm9wYnVmc3RhaWw7CisJCWNvdW50ID0gcHJpdi0+dHhyaW5nY291bnQ7CisJCWJyZWFrOworCisJY2FzZSBISV9QUklPUklUWToKKwkJdGFpbD1wcml2LT50eGhwcmluZ3RhaWw7CisJCWJlZ2luPXByaXYtPnR4aHByaW5nOworCQlidWZsaXN0ID0gcHJpdi0+dHhocGJ1ZnN0YWlsOworCQljb3VudCA9IHByaXYtPnR4cmluZ2NvdW50OworCQlicmVhazsKKworCWNhc2UgQkVBQ09OX1BSSU9SSVRZOgorCQl0YWlsPXByaXYtPnR4YmVhY29ucmluZ3RhaWw7CisJCWJlZ2luPXByaXYtPnR4YmVhY29ucmluZzsKKwkJYnVmbGlzdCA9IHByaXYtPnR4YmVhY29uYnVmc3RhaWw7CisJCWNvdW50ID0gcHJpdi0+dHhiZWFjb25jb3VudDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLTE7CisJCWJyZWFrOworIAl9CisKKwkvL3ByaW50aygiaW4gcnRsODE4MF90eCgpOiByYXRlIGlzICVkXG4iLHByaXYtPmllZWU4MDIxMS0+cmF0ZSk7CisjaWYgMQorCQltZW1jcHkoJmRlc3QsIGZyYWdfaGRyLT5hZGRyMSwgRVRIX0FMRU4pOworCQlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoZGVzdCkgfHwKKwkJCQlpc19icm9hZGNhc3RfZXRoZXJfYWRkcihkZXN0KSkKKwkJeworCQkJRHVyYXRpb24gPSAwOworCQkJUnRzRHVyID0gMDsKKwkJCWJSVFNFbmFibGUgPSAwOworCQkJYkNUU0VuYWJsZSA9IDA7CisKKwkJCVRoaXNGcmFtZVRpbWUgPSBDb21wdXRlVHhUaW1lKGxlbiArIHNDcmNMbmcsIHJ0bDgxODBfcmF0ZTJyYXRlKHJhdGUpLCAwLCBiVXNlU2hvcnRQcmVhbWJsZSk7CisJCQlUeERlc2NEdXJhdGlvbiA9IFRoaXNGcmFtZVRpbWU7CisJCX0gZWxzZSB7Ly8gVW5pY2FzdCBwYWNrZXQKKwkJCS8vdTggQWNrUmF0ZTsKKwkJCXUxNiBBY2tUaW1lOworCisJCQkvL1lKLGFkZCwwODA4MjgsZm9yIEtlZXAgYWxpdmUKKwkJCXByaXYtPk51bVR4VW5pY2FzdCsrOworCisJCQkvLyBGaWd1cmUgb3V0IEFDSyByYXRlIGFjY29yZGluZyB0byBCU1MgYmFzaWMgcmF0ZSBhbmQgVHggcmF0ZSwgMjAwNi4wMy4wOCBieSByY25qa28uCisJCQkvL0Fja1JhdGUgPSBDb21wdXRlQWNrUmF0ZSggcE1nbnRJbmZvLT5tQnJhdGVzLCAodTFCeXRlKShwVGNiLT5EYXRhUmF0ZSkgKTsKKwkJCS8vIEZpZ3VyZSBvdXQgQUNLIHRpbWUgYWNjb3JkaW5nIHRvIHRoZSBBY2tSYXRlIGFuZCBhc3N1bWUgbG9uZyBwcmVhbWJsZSBpcyB1c2VkIG9uIHJlY2VpdmVyLCAyMDA2LjAzLjA4LCBieSByY25qa28uCisJCQkvL0Fja1RpbWUgPSBDb21wdXRlVHhUaW1lKCBzQWNrQ3RzTG5nLzgsIEFja1JhdGUsIEZBTFNFLCBGQUxTRSk7CisJCQkvL0ZvciBzaW1wbGljaXR5LCBqdXN0IHVzZSB0aGUgMU0gYmFzaWMgcmF0ZQorCQkJLy9BY2tUaW1lID0gQ29tcHV0ZVR4VGltZSgxNCwgNTQwLDAsIDApOwkvLyBBY2tDVFNMbmcgPSAxNCB1c2UgMU0gYnBzIHNlbmQKKwkJCUFja1RpbWUgPSBDb21wdXRlVHhUaW1lKDE0LCAxMCwwLCAwKTsJLy8gQWNrQ1RTTG5nID0gMTQgdXNlIDFNIGJwcyBzZW5kCisJCQkvL0Fja1RpbWUgPSBDb21wdXRlVHhUaW1lKDE0LCAyLGZhbHNlLCBmYWxzZSk7CS8vIEFja0NUU0xuZyA9IDE0IHVzZSAxTSBicHMgc2VuZAorCisJCQlpZiAoICgobGVuICsgc0NyY0xuZykgPiBwcml2LT5ydHMpICYmIHByaXYtPnJ0cyApCisJCQl7IC8vIFJUUy9DVFMuCisJCQkJdTE2IFJ0c1RpbWUsIEN0c1RpbWU7CisJCQkJLy91MTYgQ3RzUmF0ZTsKKwkJCQliUlRTRW5hYmxlID0gMTsKKwkJCQliQ1RTRW5hYmxlID0gMDsKKworCQkJCS8vIFJhdGUgYW5kIHRpbWUgcmVxdWlyZWQgZm9yIFJUUy4KKwkJCQlSdHNUaW1lID0gQ29tcHV0ZVR4VGltZSggc0Fja0N0c0xuZy84LHByaXYtPmllZWU4MDIxMS0+YmFzaWNfcmF0ZSwgMCwgMCk7CisJCQkJLy8gUmF0ZSBhbmQgdGltZSByZXF1aXJlZCBmb3IgQ1RTLgorCQkJCUN0c1RpbWUgPSBDb21wdXRlVHhUaW1lKDE0LCAxMCwwLCAwKTsJLy8gQWNrQ1RTTG5nID0gMTQgdXNlIDFNIGJwcyBzZW5kCisKKwkJCQkvLyBGaWd1cmUgb3V0IHRpbWUgcmVxdWlyZWQgdG8gdHJhbnNtaXQgdGhpcyBmcmFtZS4KKwkJCQlUaGlzRnJhbWVUaW1lID0gQ29tcHV0ZVR4VGltZShsZW4gKyBzQ3JjTG5nLAorCQkJCQkJcnRsODE4MF9yYXRlMnJhdGUocmF0ZSksCisJCQkJCQkwLAorCQkJCQkJYlVzZVNob3J0UHJlYW1ibGUpOworCisJCQkJLy8gUlRTLUNUUy1UaGlzRnJhbWUtQUNLLgorCQkJCVJ0c0R1ciA9IEN0c1RpbWUgKyBUaGlzRnJhbWVUaW1lICsgQWNrVGltZSArIDMqYVNpZnNUaW1lOworCisJCQkJVHhEZXNjRHVyYXRpb24gPSBSdHNUaW1lICsgUnRzRHVyOworCQkJfQorCQkJZWxzZSB7Ly8gTm9ybWFsIGNhc2UuCisJCQkJYkNUU0VuYWJsZSA9IDA7CisJCQkJYlJUU0VuYWJsZSA9IDA7CisJCQkJUnRzRHVyID0gMDsKKworCQkJCVRoaXNGcmFtZVRpbWUgPSBDb21wdXRlVHhUaW1lKGxlbiArIHNDcmNMbmcsIHJ0bDgxODBfcmF0ZTJyYXRlKHJhdGUpLCAwLCBiVXNlU2hvcnRQcmVhbWJsZSk7CisJCQkJVHhEZXNjRHVyYXRpb24gPSBUaGlzRnJhbWVUaW1lICsgYVNpZnNUaW1lICsgQWNrVGltZTsKKwkJCX0KKworCQkJaWYoIShmcmFnX2hkci0+ZnJhbWVfY3RsICYgSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTKSkgeyAvL25vIG1vcmUgZnJhZ21lbnQKKwkJCQkvLyBUaGlzRnJhbWUtQUNLLgorCQkJCUR1cmF0aW9uID0gYVNpZnNUaW1lICsgQWNrVGltZTsKKwkJCX0gZWxzZSB7IC8vIE9uZSBvciBtb3JlIGZyYWdtZW50cyByZW1haW5lZC4KKwkJCQl1MTYgTmV4dEZyYWdUaW1lOworCQkJCU5leHRGcmFnVGltZSA9IENvbXB1dGVUeFRpbWUoIGxlbiArIHNDcmNMbmcsIC8vcHJldGVuZCBmb2xsb3dpbmcgcGFja2V0IGxlbmd0aCBlcXVhbCBjdXJyZW50IHBhY2tldAorCQkJCQkJcnRsODE4MF9yYXRlMnJhdGUocmF0ZSksCisJCQkJCQkwLAorCQkJCQkJYlVzZVNob3J0UHJlYW1ibGUgKTsKKworCQkJCS8vVGhpc0ZyYWctQUNrLU5leHRGcmFnLUFDSy4KKwkJCQlEdXJhdGlvbiA9IE5leHRGcmFnVGltZSArIDMqYVNpZnNUaW1lICsgMipBY2tUaW1lOworCQkJfQorCisJCX0gLy8gRW5kIG9mIFVuaWNhc3QgcGFja2V0CisKKwkJZnJhZ19oZHItPmR1cmF0aW9uX2lkID0gRHVyYXRpb247CisjZW5kaWYKKworCWJ1Zmxlbj1wcml2LT50eGJ1ZmZzaXplOworCXJlbWFpbj1sZW47CisJdGVtcF90YWlsID0gdGFpbDsKKy8vcHJpbnRrKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT5idWZsZW4gPSAlZCwgcmVtYWluID0gJWQhXG4iLCBidWZsZW4scmVtYWluKTsKKwl3aGlsZShyZW1haW4hPTApeworI2lmZGVmIERFQlVHX1RYX0ZSQUcKKwkJRE1FU0coIlRYIGl0ZXJhdGlvbiIpOworI2VuZGlmCisjaWZkZWYgREVCVUdfVFgKKwkJRE1FU0coIlRYOiBmaWxsaW5nIGRlc2NyaXB0b3IgJXgiLCh1MzIpdGFpbCk7CisjZW5kaWYKKwkJbWIoKTsKKwkJaWYoIWJ1Zmxpc3QpeworCQkJRE1FU0dFKCJUWCBidWZmZXIgZXJyb3IsIGNhbm5vdCBUWCBmcmFtZXMuIHByaSAlZC4iLCBwcmlvcml0eSk7CisJCQkvL3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xvY2ssZmxhZ3MpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWJ1Zj1idWZsaXN0LT5idWY7CisKKwkJaWYoICgqdGFpbCAmICgxPDwzMSkpICYmIChwcmlvcml0eSAhPSBCRUFDT05fUFJJT1JJVFkpKXsKKworCQkJCURNRVNHVygiTm8gbW9yZSBUWCBkZXNjLCByZXR1cm5pbmcgJXggb2YgJXgiLAorCQkJCXJlbWFpbixsZW4pOworCQkJCXByaXYtPnN0YXRzLnR4cmR1Kys7CisjaWZkZWYgREVCVUdfVFhfREVTQworCQkJCWNoZWNrX3R4X3JpbmcoZGV2LHByaW9yaXR5KTsKKwkJCS8vCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJCS8vCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisjZW5kaWYKKwkJCS8vCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xvY2ssZmxhZ3MpOworCisJCQlyZXR1cm4gcmVtYWluOworCisJCX0KKworCQkqdGFpbD0gMDsgLy8gemVyb2VzIGhlYWRlcgorCQkqKHRhaWwrMSkgPSAwOworCQkqKHRhaWwrMykgPSAwOworCQkqKHRhaWwrNSkgPSAwOworCQkqKHRhaWwrNikgPSAwOworCQkqKHRhaWwrNykgPSAwOworCisJCWlmKHByaXYtPmNhcmRfODE4NSl7CisJCQkvL0ZJWE1FOiB0aGlzIHNob3VsZCBiZSB0cmlnZ2VyZWQgYnkgSFcgZW5jcnlwdGlvbiBwYXJhbWV0ZXJzLgorCQkJKnRhaWwgfD0gKDE8PDE1KTsgLy9ubyBlbmNyeXB0CisvLwkJCSp0YWlsIHw9ICgxPDwzMCk7IC8vcmFpc2UgaW50IHdoZW4gY29tcGxldGVkCisJCX0KKwkvLwkqdGFpbCA9ICp0YWlsIHwgKDE8PDE2KTsKKwkJaWYocmVtYWluPT1sZW4gJiYgIWRlc2NmcmFnKSB7CisJCQlvd25iaXRfZmxhZyA9IGZhbHNlOwkvL2FkZGVkIGJ5IGRhdmlkIHdvbywyMDA3LjEyLjE0CisjaWZkZWYgREVCVUdfVFhfRlJBRworCQkJRE1FU0coIkZpcnN0IGRlc2NyaXB0b3IiKTsKKyNlbmRpZgorCQkJKnRhaWwgPSAqdGFpbHwgKDE8PDI5KSA7IC8vZmlzdCBzZWdtZW50IG9mIHRoZSBwYWNrZXQKKwkJCSp0YWlsID0gKnRhaWwgfChsZW4pOworCQl9IGVsc2UgeworCQkJb3duYml0X2ZsYWcgPSB0cnVlOworCQl9CisKKwkJZm9yKGk9MDtpPGJ1ZmxlbiYmIHJlbWFpbiA+MDtpKysscmVtYWluLS0peworCQkJKCh1OCopYnVmKVtpXT10eGJ1ZltpXTsgLy9jb3B5IGRhdGEgaW50byBkZXNjcmlwdG9yIHBvaW50ZWQgRE1BYmxlIGJ1ZmZlcgorCQkJaWYocmVtYWluID09IDQgJiYgaSs0ID49IGJ1ZmxlbikgYnJlYWs7CisJCQkvKiBlbnN1cmUgdGhlIGxhc3QgZGVzYyBoYXMgYXQgbGVhc3QgNCBieXRlcyBwYXlsb2FkICovCisKKwkJfQorCQl0eGJ1ZiA9IHR4YnVmICsgaTsKKwkJKih0YWlsKzMpPSoodGFpbCszKSAmfiAweGZmZjsKKwkJKih0YWlsKzMpPSoodGFpbCszKSB8IGk7IC8vIGJ1ZmZlciBsZW5naHQKKwkJLy8gVXNlIHNob3J0IHByZWFtYmxlIG9yIG5vdAorCQlpZiAocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuY2FwYWJpbGl0eSZXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEUpCisJCQlpZiAocHJpdi0+cGxjcF9wcmVhbWJsZV9tb2RlPT0xICYmIHJhdGUhPTApCS8vICBzaG9ydCBtb2RlIG5vdywgbm90IGxvbmchCisJCQkvLwkqdGFpbCB8PSAoMTw8MTYpOwkJCQkvLyBlbmFibGUgc2hvcnQgcHJlYW1ibGUgbW9kZS4KKworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCQlpZihiQ1RTRW5hYmxlKSB7CisJCQkqdGFpbCB8PSAoMTw8MTgpOworCQl9CisKKwkJaWYoYlJUU0VuYWJsZSkgLy9ydHMgZW5hYmxlCisJCXsKKwkJCSp0YWlsIHw9ICgoaWVlZXJhdGUycnRscmF0ZShwcml2LT5pZWVlODAyMTEtPmJhc2ljX3JhdGUpKTw8MTkpOy8vUlRTIFJBVEUKKwkJCSp0YWlsIHw9ICgxPDwyMyk7Ly9ydHMgZW5hYmxlCisJCQkqKHRhaWwrMSkgfD0oUnRzRHVyJjB4ZmZmZik7Ly9SVFMgRHVyYXRpb24KKwkJfQorCQkqKHRhaWwrMykgfD0gKChUeERlc2NEdXJhdGlvbiYweGZmZmYpPDwxNik7IC8vRFVSQVRJT04KKy8vCSAgICAgICAgKih0YWlsKzMpIHw9ICgweGU2PDwxNik7CisgICAgICAgIAkqKHRhaWwrNSkgfD0gKDExPDw4KTsvLyhwcml2LT5yZXRyeV9kYXRhPDw4KTsgLy9yZXRyeSBsaW0gOworI2Vsc2UKKwkJLy9Vc2UgUlRTIG9yIG5vdAorI2lmZGVmIENPTkZJR19SVEw4MTg3QgorCQlpZiAoIChsZW4+cHJpdi0+cnRzKSAmJiBwcml2LT5ydHMgJiYgcHJpb3JpdHkhPU1BTkFHRV9QUklPUklUWSl7CisjZWxzZQorCQlpZiAoIChsZW4+cHJpdi0+cnRzKSAmJiBwcml2LT5ydHMgJiYgcHJpb3JpdHk9PUxPV19QUklPUklUWSl7CisjZW5kaWYKKwkJCSp0YWlsIHw9ICgxPDwyMyk7CS8vZW5hbGJlIFJUUyBmdW5jdGlvbgorCQkJKnRhaWwgfD0gKDA8PDE5KTsJLy91c2UgMU0gYnBzIHNlbmQgUlRTIHBhY2tldAorCQkJQWNrQ3RzVGltZSA9IENvbXB1dGVUeFRpbWUoMTQsIDEwLDAsIDApOwkvLyBBY2tDVFNMbmcgPSAxNCB1c2UgMU0gYnBzIHNlbmQKKwkJCUZyYW1lVGltZSA9IENvbXB1dGVUeFRpbWUobGVuICsgNCwgcnRsODE4MF9yYXRlMnJhdGUocmF0ZSksIDAsICp0YWlsJigxPDwxNikpOworCQkJLy8gUlRTL0NUUyB0aW1lIGlzIGNhbGN1bGF0ZSBhcyBmb2xsb3cKKwkJCWR1cmF0aW9uID0gRnJhbWVUaW1lICsgMyoxMCArIDIqQWNrQ3RzVGltZTsJLy8xMHVzIGlzIHRoZSBTaWZzVGltZTsKKwkJCSoodGFpbCsxKSB8PSBkdXJhdGlvbjsgCS8vTmVlZCB0byBlZGl0IGhlcmUhICAtLS0taGlrYXJ1CisJCX1lbHNleworCQkJKih0YWlsKzEpPSAwOyAvLyB6ZXJvZXMgdGhlIHNlY29uZCAzMi1iaXRzIGR3b3JkIG9mIHRoZSBkZXNjcmlwdG9yCisJCX0KKyNlbmRpZgorCisJCSp0YWlsID0gKnRhaWwgfCAoKHJhdGUmMHhmKSA8PCAyNCk7CisJCS8vRE1FU0coInJhdGUgJWQiLHJhdGUpOworCisJCWlmKHByaXYtPmNhcmRfODE4NSl7CisKKwkJCSNpZiAwCisJCQkqKHRhaWwrNSkmPSB+KDE8PDI0KTsgLyogdHggYW50IDAgKi8KKworCQkJKih0YWlsKzUpICY9IH4oMTw8MjMpOyAvKiByYW5kb20gdHggYWdjIDIzLTE2ICovCisJCQkqKHRhaWwrNSkgfD0gKDE8PDIyKXwoMTw8MjEpfCgxPDwyMCl8KDE8PDE5KXwoMTw8MTgpfCgxPDwxNyl8KDE8PDE2KTsKKworCQkJKih0YWlsKzUpICY9Cit+KCgxPDwxNSl8KDE8PDE0KXwoMTw8MTMpfCgxPDwxMil8KDE8PDExKXwoMTw8MTApfCgxPDw5KXwoMTw8OCkpOworCQkJKih0YWlsKzUpIHw9ICg3PDw4KTsgLy8gTWF4IHJldHJ5IGxpbWl0CisKKwkJCSoodGFpbCs1KSAmPSB+KCgxPDw3KXwoMTw8Nil8KDE8PDUpfCgxPDw0KXwoMTw8Myl8KDE8PDIpfCgxPDwxKXwoMTw8MCkpOworCQkJKih0YWlsKzUpIHw9ICg4PDw0KTsgLy8gTWF4IGNvbnRlbnRpb24gd2luZG93CisJCQkqKHRhaWwrNikgfD0gNDsgLy8gTWluIGNvbnRlbnRpb24gd2luZG93CisJCQkjZW5kaWYKKyAgICAgICAgICAgLy8gICAgCSoodGFpbCs1KSA9IDA7CisJCX0KKworCQkvKiBod19wbGNwX2xlbiBpcyBub3QgdXNlZCBmb3IgcnRsODE4MCBjaGlwICovCisJCS8qIEZJWE1FICovCisJCWlmKHByaXYtPmNhcmRfODE4NSA9PSAwIHx8ICFwcml2LT5od19wbGNwX2xlbil7CisKKwkJCWR1cmF0aW9uID0gcnRsODE4MF9sZW4yZHVyYXRpb24obGVuLAorCQkJCXJhdGUsJmV4dCk7CisKKworI2lmZGVmIERFQlVHX1RYCisJCQlETUVTRygiUExDUCBkdXJhdGlvbiAlZCIsZHVyYXRpb24gKTsKKwkJCS8vRE1FU0coImRyaWZ0ICVkIixkcmlmdCk7CisJCQlETUVTRygiZXh0ZW5zaW9uICVzIiwgKGV4dD09MSkgPyAib24iOiJvZmYiKTsKKyNlbmRpZgorCQkJKih0YWlsKzEpID0gKih0YWlsKzEpIHwgKChkdXJhdGlvbiAmIDB4N2ZmZik8PDE2KTsKKwkJCWlmKGV4dCkgKih0YWlsKzEpID0gKih0YWlsKzEpIHwoMTw8MzEpOyAvL3BsY3AgbGVuZ3RoIGV4dGVuc2lvbgorCQl9CisKKwkJaWYobW9yZWZyYWcpICp0YWlsID0gKCp0YWlsKSB8ICgxPDwxNyk7IC8vIG1vcmUgZnJhZ21lbnQKKwkJaWYoIXJlbWFpbikgKnRhaWwgPSAoKnRhaWwpIHwgKDE8PDI4KTsgLy8gbGFzdCBzZWdtZW50IG9mIGZyYW1lCisKKyNpZmRlZiBERUJVR19UWF9GUkFHCisJCWlmKCFyZW1haW4pRE1FU0coIkxhc3QgZGVzY3JpcHRvciIpOworCQlpZihtb3JlZnJhZylETUVTRygiTW9yZSBmcmFnIik7CisjZW5kaWYKKyAgICAgICAgICAgICAgICoodGFpbCs1KSA9ICoodGFpbCs1KXwoMjw8MjcpOworICAgICAgICAgICAgICAgICoodGFpbCs3KSA9ICoodGFpbCs3KXwoMTw8NCk7CisKKwkJd21iKCk7CisJCWlmKG93bmJpdF9mbGFnKQorCQl7CisJCQkqdGFpbCA9ICp0YWlsIHwgKDE8PDMxKTsgLy8gZGVzY3JpcHRvciByZWFkeSB0byBiZSB0eGVkCisJCX0KKworI2lmZGVmIERFQlVHX1RYX0RFU0MyCisgICAgICAgICAgICAgICAgcHJpbnRrKCJ0eCBkZXNjIGlzOlxuIik7CisJCURNRVNHKCIlOHggJTh4ICU4eCAlOHggJTh4ICU4eCAlOHggJTh4IiwgdGFpbFswXSwgdGFpbFsxXSwgdGFpbFsyXSwgdGFpbFszXSwKKwkJCXRhaWxbNF0sIHRhaWxbNV0sIHRhaWxbNl0sIHRhaWxbN10pOworI2VuZGlmCisKKwkJaWYoKHRhaWwgLSBiZWdpbikvOCA9PSBjb3VudC0xKQorCQkJdGFpbD1iZWdpbjsKKworCQllbHNlCisJCQl0YWlsPXRhaWwrODsKKworCQlidWZsaXN0PWJ1Zmxpc3QtPm5leHQ7CisKKwkJbWIoKTsKKworCQlzd2l0Y2gocHJpb3JpdHkpIHsKKwkJCWNhc2UgTUFOQUdFX1BSSU9SSVRZOgorCQkJCXByaXYtPnR4bWFwcmluZ3RhaWw9dGFpbDsKKwkJCQlwcml2LT50eG1hcGJ1ZnN0YWlsPWJ1Zmxpc3Q7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQktfUFJJT1JJVFk6CisJCQkJcHJpdi0+dHhia3ByaW5ndGFpbD10YWlsOworCQkJCXByaXYtPnR4YmtwYnVmc3RhaWw9YnVmbGlzdDsKKwkJCQlicmVhazsKKworCQkJY2FzZSBCRV9QUklPUklUWToKKwkJCQlwcml2LT50eGJlcHJpbmd0YWlsPXRhaWw7CisJCQkJcHJpdi0+dHhiZXBidWZzdGFpbD1idWZsaXN0OworCQkJCWJyZWFrOworCisJCQljYXNlIFZJX1BSSU9SSVRZOgorCQkJCXByaXYtPnR4dmlwcmluZ3RhaWw9dGFpbDsKKwkJCQlwcml2LT50eHZpcGJ1ZnN0YWlsPWJ1Zmxpc3Q7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgVk9fUFJJT1JJVFk6CisJCQkJcHJpdi0+dHh2b3ByaW5ndGFpbD10YWlsOworCQkJCXByaXYtPnR4dm9wYnVmc3RhaWw9YnVmbGlzdDsKKwkJCQlicmVhazsKKworCQkJY2FzZSBISV9QUklPUklUWToKKwkJCQlwcml2LT50eGhwcmluZ3RhaWw9dGFpbDsKKwkJCQlwcml2LT50eGhwYnVmc3RhaWwgPSBidWZsaXN0OworCQkJCWJyZWFrOworCisJCQljYXNlIEJFQUNPTl9QUklPUklUWToKKwkJCQkvKiB0aGUgSFcgc2VlbXMgdG8gYmUgaGFwcHkgd2l0aCB0aGUgMXN0CisJCQkJICogZGVzY3JpcHRvciBmaWxsZWQgYW5kIHRoZSAybmQgZW1wdHkuLi4KKwkJCQkgKiBTbyBhbHdheXMgdXBkYXRlIGRlc2NyaXB0b3IgMSBhbmQgbmV2ZXIKKwkJCQkgKiB0b3VjaCAybmQKKwkJCQkgKi8KKwkJCS8vCXByaXYtPnR4YmVhY29ucmluZ3RhaWw9dGFpbDsKKwkJCS8vCXByaXYtPnR4YmVhY29uYnVmc3RhaWw9YnVmbGlzdDsKKworCQkJCWJyZWFrOworCisJCX0KKworCQkvL3J0bDgxODBfZG1hX2tpY2soZGV2LHByaW9yaXR5KTsKKwl9CisJKnRlbXBfdGFpbCA9ICp0ZW1wX3RhaWwgfCAoMTw8MzEpOyAvLyBkZXNjcmlwdG9yIHJlYWR5IHRvIGJlIHR4ZWQKKwlydGw4MTgwX2RtYV9raWNrKGRldixwcmlvcml0eSk7CisJLy9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9sb2NrLGZsYWdzKTsKKworCXJldHVybiAwOworCit9CisKKwordm9pZCBydGw4MTgwX2lycV9yeF90YXNrbGV0KHN0cnVjdCByODE4MF9wcml2ICogcHJpdik7CisKKwordm9pZCBydGw4MTgwX2xpbmtfY2hhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXUxNiBiZWFjb25faW50ZXJ2YWw7CisKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldCA9ICZwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yazsKKy8vCXJ0bDgxODBfYWRhcHRlcl9zdGFydChkZXYpOworCXJ0bDgxODBfdXBkYXRlX21zcihkZXYpOworCisKKwlydGw4MTgwX3NldF9tb2RlKGRldixFUFJPTV9DTURfQ09ORklHKTsKKworCXdyaXRlX25pY19kd29yZChkZXYsQlNTSUQsKCh1MzIqKW5ldC0+YnNzaWQpWzBdKTsKKwl3cml0ZV9uaWNfd29yZChkZXYsQlNTSUQrNCwoKHUxNiopbmV0LT5ic3NpZClbMl0pOworCisKKwliZWFjb25faW50ZXJ2YWwgID0gcmVhZF9uaWNfZHdvcmQoZGV2LEJFQUNPTl9JTlRFUlZBTCk7CisJYmVhY29uX2ludGVydmFsICY9IH4gQkVBQ09OX0lOVEVSVkFMX01BU0s7CisJYmVhY29uX2ludGVydmFsIHw9IG5ldC0+YmVhY29uX2ludGVydmFsOworCXdyaXRlX25pY19kd29yZChkZXYsIEJFQUNPTl9JTlRFUlZBTCwgYmVhY29uX2ludGVydmFsKTsKKworCXJ0bDgxODBfc2V0X21vZGUoZGV2LCBFUFJPTV9DTURfTk9STUFMKTsKKworCisJLyoKKwl1MTYgYXRpbSA9IHJlYWRfbmljX2R3b3JkKGRldixBVElNKTsKKwl1MTYgPSB1MTYgJn4gQVRJTV9NQVNLOworCXUxNiA9IHUxNiB8IGJlYWNvbi0+YXRpbTsKKwkqLworI2lmIDAKKwlpZiAobmV0LT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpIHsKKwkJaWYgKHByaXYtPmh3X3dlcCkgeworCQkJRE1FU0coIkVuYWJsaW5nIGhhcmR3YXJlIFdFUCBzdXBwb3J0Iik7CisJCQlydGw4MTgwX3NldF9od193ZXAoZGV2KTsKKwkJCXByaXYtPmllZWU4MDIxMS0+aG9zdF9lbmNyeXB0PTA7CisJCQlwcml2LT5pZWVlODAyMTEtPmhvc3RfZGVjcnlwdD0wOworCQl9CisjaWZuZGVmIENPTkZJR19JRUVFODAyMTFfTk9XRVAKKwkJZWxzZSB7CisJCQlwcml2LT5pZWVlODAyMTEtPmhvc3RfZW5jcnlwdD0xOworCQkJcHJpdi0+aWVlZTgwMjExLT5ob3N0X2RlY3J5cHQ9MTsKKwkJfQorI2VuZGlmCisJfQorI2lmbmRlZiBDT05GSUdfSUVFRTgwMjExX05PV0VQCisJZWxzZXsKKwkJcHJpdi0+aWVlZTgwMjExLT5ob3N0X2VuY3J5cHQ9MDsKKwkJcHJpdi0+aWVlZTgwMjExLT5ob3N0X2RlY3J5cHQ9MDsKKwl9CisjZW5kaWYKKyNlbmRpZgorCisKKwlpZihwcml2LT5jYXJkXzgxODUpCisJCXJ0bDgxODBfc2V0X2NoYW4oZGV2LCBwcml2LT5jaGFuKTsKKworCit9CisKK3ZvaWQgcnRsODE4MF9ycV90eF9hY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldil7CisKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisvLwlwcmludGsoIj09PT09PT09PT09PT09PT09PT09PiVzXG4iLF9fZnVuY19fKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsQ09ORklHNCxyZWFkX25pY19ieXRlKGRldixDT05GSUc0KXxDT05GSUc0X1BXUk1HVCk7CisJcHJpdi0+YWNrX3R4X3RvX2llZWUgPSAxOworfQorCitzaG9ydCBydGw4MTgwX2lzX3R4X3F1ZXVlX2VtcHR5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpeworCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXUzMiogZDsKKworCWZvciAoZCA9IHByaXYtPnR4bWFwcmluZzsKKwkJZCA8IHByaXYtPnR4bWFwcmluZyArIHByaXYtPnR4cmluZ2NvdW50O2QrPTgpCisJCQlpZigqZCAmICgxPDwzMSkpIHJldHVybiAwOworCisJZm9yIChkID0gcHJpdi0+dHhia3ByaW5nOworCQlkIDwgcHJpdi0+dHhia3ByaW5nICsgcHJpdi0+dHhyaW5nY291bnQ7ZCs9OCkKKwkJCWlmKCpkICYgKDE8PDMxKSkgcmV0dXJuIDA7CisKKwlmb3IgKGQgPSBwcml2LT50eGJlcHJpbmc7CisJCWQgPCBwcml2LT50eGJlcHJpbmcgKyBwcml2LT50eHJpbmdjb3VudDtkKz04KQorCQkJaWYoKmQgJiAoMTw8MzEpKSByZXR1cm4gMDsKKworCWZvciAoZCA9IHByaXYtPnR4dmlwcmluZzsKKwkJZCA8IHByaXYtPnR4dmlwcmluZyArIHByaXYtPnR4cmluZ2NvdW50O2QrPTgpCisJCQlpZigqZCAmICgxPDwzMSkpIHJldHVybiAwOworCisJZm9yIChkID0gcHJpdi0+dHh2b3ByaW5nOworCQlkIDwgcHJpdi0+dHh2b3ByaW5nICsgcHJpdi0+dHhyaW5nY291bnQ7ZCs9OCkKKwkJCWlmKCpkICYgKDE8PDMxKSkgcmV0dXJuIDA7CisKKwlmb3IgKGQgPSBwcml2LT50eGhwcmluZzsKKwkJZCA8IHByaXYtPnR4aHByaW5nICsgcHJpdi0+dHhyaW5nY291bnQ7ZCs9OCkKKwkJCWlmKCpkICYgKDE8PDMxKSkgcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisvKiBGSVhNRSBGSVhNRSA1bXNlY3MgaXMgcmFuZG9tICovCisjZGVmaW5lIEhXX1dBS0VfREVMQVkgNQorCit2b2lkIHJ0bDgxODBfaHdfd2FrZXVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5wc19sb2NrLGZsYWdzKTsKKwkvL0RNRVNHKCJXYWtlbiB1cCEiKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsQ09ORklHNCxyZWFkX25pY19ieXRlKGRldixDT05GSUc0KSZ+Q09ORklHNF9QV1JNR1QpOworCisJaWYocHJpdi0+cmZfd2FrZXVwKQorCQlwcml2LT5yZl93YWtldXAoZGV2KTsKKy8vCW1kZWxheShIV19XQUtFX0RFTEFZKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5wc19sb2NrLGZsYWdzKTsKK30KKwordm9pZCBydGw4MTgwX2h3X3NsZWVwX2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgICAgICBzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnBzX2xvY2ssZmxhZ3MpOworICAgICAgIC8vRE1FU0coIlNsZWVwISIpOworCisgICAgICAgIGlmKHByaXYtPnJmX3NsZWVwKQorICAgICAgICAgICAgICAgIHByaXYtPnJmX3NsZWVwKGRldik7CisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnBzX2xvY2ssZmxhZ3MpOworfQorCisKK3ZvaWQgcnRsODE4MF9od19zbGVlcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgdGgsIHUzMiB0bCkKK3sKKworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXUzMiByYiA9IGppZmZpZXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5wc19sb2NrLGZsYWdzKTsKKworCS8qIFdyaXRpbmcgSFcgcmVnaXN0ZXIgd2l0aCAwIGVxdWFscyB0byBkaXNhYmxlCisJICogdGhlIHRpbWVyLCB0aGF0IGlzIG5vdCByZWFsbHkgd2hhdCB3ZSB3YW50CisJICovCisJdGwgLT0gTVNFQ1MoNCsxNis3KTsKKworCS8vaWYodGwgPT0gMCkgdGwgPSAxOworCisJLyogRklYTUUgSEFDSyBGSVhNRSBIQUNLICovCisvLwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCS8vbWRlbGF5KDEpOworCisvLwlyYiA9IHJlYWRfbmljX2R3b3JkKGRldiwgVFNGVFIpOworCisJLyogSWYgdGhlIGludGVydmFsIGluIHdpdGNoIHdlIGFyZSByZXF1ZXN0ZWQgdG8gc2xlZXAgaXMgdG9vCisJICogc2hvcnQgdGhlbiBnaXZlIHVwIGFuZCByZW1haW4gYXdha2UKKwkgKi8KKwlpZigoKHRsPj1yYikmJiAodGwtcmIpIDw9IE1TRUNTKE1JTl9TTEVFUF9USU1FKSkKKwkJfHwoKHJiPnRsKSYmIChyYi10bCkgPCBNU0VDUyhNSU5fU0xFRVBfVElNRSkpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnBzX2xvY2ssZmxhZ3MpOworCQlwcmludGsoInRvbyBzaG9ydCB0byBzbGVlcFxuIik7CisJCXJldHVybjsKKwl9CisKKy8vCXdyaXRlX25pY19kd29yZChkZXYsIFRpbWVySW50LCB0bCk7CisvLwlyYiA9IHJlYWRfbmljX2R3b3JkKGRldiwgVFNGVFIpOworCXsKKwkJdTMyIHRtcCA9ICh0bD5yYik/KHRsLXJiKToocmItdGwpOworCS8vCWlmICh0bDxyYikKKworCQkvL2x6bSxhZGQsMDgwODI4CisJCXByaXYtPkRvemVQZXJpb2RJblBhc3QyU2VjICs9IGppZmZpZXNfdG9fbXNlY3ModG1wKTsKKworCQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+aWVlZTgwMjExLT53cSwgJnByaXYtPmllZWU4MDIxMS0+aHdfd2FrZXVwX3dxLCB0bXApOyAvL2FzIHRsIG1heSBiZSBsZXNzIHRoYW4gcmIKKwl9CisJLyogaWYgd2Ugc3VzcGVjdCB0aGUgVGltZXJJbnQgaXMgZ29uZSBiZXlvbmQgdGwKKwkgKiB3aGlsZSBzZXR0aW5nIGl0LCB0aGVuIGdpdmUgdXAKKwkgKi8KKyNpZiAxCisJaWYoKCh0bCA+IHJiKSAmJiAoKHRsLXJiKSA+IE1TRUNTKE1BWF9TTEVFUF9USU1FKSkpfHwKKwkJKCh0bCA8IHJiKSAmJiAoKHJiLXRsKSA+IE1TRUNTKE1BWF9TTEVFUF9USU1FKSkpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnBzX2xvY2ssZmxhZ3MpOworCQlyZXR1cm47CisJfQorI2VuZGlmCisvLwlpZihwcml2LT5yZl9zbGVlcCkKKy8vCQlwcml2LT5yZl9zbGVlcChkZXYpOworCisJcXVldWVfd29yayhwcml2LT5pZWVlODAyMTEtPndxLCAodm9pZCAqKSZwcml2LT5pZWVlODAyMTEtPmh3X3NsZWVwX3dxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5wc19sb2NrLGZsYWdzKTsKK30KKworCisvL3ZvaWQgcnRsODE4MF93bW1fcGFyYW1fdXBkYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsdTggKmFjX3BhcmFtKQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PUtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKK3ZvaWQgcnRsODE4MF93bW1fcGFyYW1fdXBkYXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqIHdvcmspCit7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiBpZWVlID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLHdtbV9wYXJhbV91cGRhdGVfd3EpOworCS8vc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYqKShpZWVlLT5wcml2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWVlZS0+ZGV2OworI2Vsc2UKK3ZvaWQgcnRsODE4MF93bW1fcGFyYW1fdXBkYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpZWVlLT5kZXY7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworI2VuZGlmCisJdTggKmFjX3BhcmFtID0gKHU4ICopKGllZWUtPmN1cnJlbnRfbmV0d29yay53bW1fcGFyYW0pOworCXU4IG1vZGUgPSBpZWVlLT5jdXJyZW50X25ldHdvcmsubW9kZTsKKwlBQ19DT0RJTkcJZUFDSTsKKwlBQ19QQVJBTQlBY1BhcmFtOworCVBBQ19QQVJBTQlwQWNQYXJhbTsKKwl1OCBpOworCisjaWZuZGVmIENPTkZJR19SVEw4MTg1QgorICAgICAgICAvL2ZvciBsZWdhY3kgODE4NSBrZWVwIHRoZSBQQVJBTSB1bmNoYW5nZS4KKwlyZXR1cm47CisjZWxzZQorCWlmKCFpZWVlLT5jdXJyZW50X25ldHdvcmsuUW9TX0VuYWJsZSl7CisJCS8vbGVnYWN5IGFjX3h4X3BhcmFtIHVwZGF0ZQorCQlBY1BhcmFtLmxvbmdEYXRhID0gMDsKKwkJQWNQYXJhbS5mLkFjaUFpZnNuLmYuQUlGU04gPSAyOyAvLyBGb2xsb3cgODAyLjExIERJRlMuCisJCUFjUGFyYW0uZi5BY2lBaWZzbi5mLkFDTSA9IDA7CisJCUFjUGFyYW0uZi5FY3cuZi5FQ1dtaW4gPSAzOyAvLyBGb2xsb3cgODAyLjExIENXbWluLgorCQlBY1BhcmFtLmYuRWN3LmYuRUNXbWF4ID0gNzsgLy8gRm9sbG93IDgwMi4xMSBDV21heC4KKwkJQWNQYXJhbS5mLlRYT1BMaW1pdCA9IDA7CisJCWZvcihlQUNJID0gMDsgZUFDSSA8IEFDX01BWDsgZUFDSSsrKXsKKwkJCUFjUGFyYW0uZi5BY2lBaWZzbi5mLkFDSSA9ICh1OCllQUNJOworCQkJeworCQkJCXU4CQl1MWJBSUZTOworCQkJCXUzMgkJdTRiQWNQYXJhbTsKKwkJCQlwQWNQYXJhbSA9IChQQUNfUEFSQU0pKCZBY1BhcmFtKTsKKwkJCQkvLyBSZXRyaXZlIHBhcmFtdGVycyB0byB1ZHBhdGUuCisJCQkJdTFiQUlGUyA9IHBBY1BhcmFtLT5mLkFjaUFpZnNuLmYuQUlGU04gKigoKG1vZGUmSUVFRV9HKSA9PSBJRUVFX0cpPzk6MjApICsgYVNpZnNUaW1lOworCQkJCXU0YkFjUGFyYW0gPSAoKCgodTMyKShwQWNQYXJhbS0+Zi5UWE9QTGltaXQpKTw8QUNfUEFSQU1fVFhPUF9MSU1JVF9PRkZTRVQpfAorCQkJCQkgICAgICAoKCh1MzIpKHBBY1BhcmFtLT5mLkVjdy5mLkVDV21heCkpPDxBQ19QQVJBTV9FQ1dfTUFYX09GRlNFVCl8CisJCQkJCSAgICAgICgoKHUzMikocEFjUGFyYW0tPmYuRWN3LmYuRUNXbWluKSk8PEFDX1BBUkFNX0VDV19NSU5fT0ZGU0VUKXwKKwkJCQkJICAgICAgICgoKHUzMil1MWJBSUZTKSA8PCBBQ19QQVJBTV9BSUZTX09GRlNFVCkpOworCQkJCXN3aXRjaChlQUNJKXsKKwkJCQkJY2FzZSBBQzFfQks6CisJCQkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBBQ19CS19QQVJBTSwgdTRiQWNQYXJhbSk7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIEFDMF9CRToKKwkJCQkJCXdyaXRlX25pY19kd29yZChkZXYsIEFDX0JFX1BBUkFNLCB1NGJBY1BhcmFtKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgQUMyX1ZJOgorCQkJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgQUNfVklfUEFSQU0sIHU0YkFjUGFyYW0pOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBBQzNfVk86CisJCQkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBBQ19WT19QQVJBTSwgdTRiQWNQYXJhbSk7CisJCQkJCQlicmVhazsKKworCQkJCQlkZWZhdWx0OgorCQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiU2V0SHdSZWc4MTg1KCk6aW52YWxpZCBBQ0k6ICVkIVxuIiwgZUFDSSk7CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuOworCX0KKworCWZvcihpID0gMDsgaSA8IEFDX01BWDsgaSsrKXsKKwkJLy9BY1BhcmFtLmxvbmdEYXRhID0gMDsKKwkJcEFjUGFyYW0gPSAoQUNfUEFSQU0gKiApYWNfcGFyYW07CisJCXsKKwkJCUFDX0NPRElORwllQUNJOworCQkJdTgJCXUxYkFJRlM7CisJCQl1MzIJCXU0YkFjUGFyYW07CisKKwkJCS8vIFJldHJpdmUgcGFyYW10ZXJzIHRvIHVkcGF0ZS4KKwkJCWVBQ0kgPSBwQWNQYXJhbS0+Zi5BY2lBaWZzbi5mLkFDSTsKKwkJCS8vTW9kZSBHL0E6IHNsb3RUaW1lVGltZXIgPSA5OyBNb2RlIEI6IDIwCisJCQl1MWJBSUZTID0gcEFjUGFyYW0tPmYuQWNpQWlmc24uZi5BSUZTTiAqICgoKG1vZGUmSUVFRV9HKSA9PSBJRUVFX0cpPzk6MjApICsgYVNpZnNUaW1lOworCQkJdTRiQWNQYXJhbSA9ICgJKCgodTMyKShwQWNQYXJhbS0+Zi5UWE9QTGltaXQpKSA8PCBBQ19QQVJBTV9UWE9QX0xJTUlUX09GRlNFVCkJfAorCQkJCQkoKCh1MzIpKHBBY1BhcmFtLT5mLkVjdy5mLkVDV21heCkpIDw8IEFDX1BBUkFNX0VDV19NQVhfT0ZGU0VUKQl8CisJCQkJCSgoKHUzMikocEFjUGFyYW0tPmYuRWN3LmYuRUNXbWluKSkgPDwgQUNfUEFSQU1fRUNXX01JTl9PRkZTRVQpCXwKKwkJCQkJKCgodTMyKXUxYkFJRlMpIDw8IEFDX1BBUkFNX0FJRlNfT0ZGU0VUKSk7CisKKwkJCXN3aXRjaChlQUNJKXsKKwkJCQljYXNlIEFDMV9CSzoKKwkJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgQUNfQktfUEFSQU0sIHU0YkFjUGFyYW0pOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgQUMwX0JFOgorCQkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBBQ19CRV9QQVJBTSwgdTRiQWNQYXJhbSk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBBQzJfVkk6CisJCQkJCXdyaXRlX25pY19kd29yZChkZXYsIEFDX1ZJX1BBUkFNLCB1NGJBY1BhcmFtKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIEFDM19WTzoKKwkJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgQUNfVk9fUEFSQU0sIHU0YkFjUGFyYW0pOworCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNldEh3UmVnODE4NSgpOiBpbnZhbGlkIEFDSTogJWQgIVxuIiwgZUFDSSk7CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWFjX3BhcmFtICs9IChzaXplb2YoQUNfUEFSQU0pKTsKKwl9CisjZW5kaWYKK30KKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKK3ZvaWQgcnRsODE4MF90eF9pcnFfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKyNlbHNlCit2b2lkIHJ0bDgxODBfdHhfaXJxX3dxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2VuZGlmCisKKworCisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkpCit2b2lkIHJ0bDgxODBfcmVzdGFydF93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworLy92b2lkIHJ0bDgxODBfcnFfdHhfYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisjZWxzZQorIHZvaWQgcnRsODE4MF9yZXN0YXJ0X3dxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworLy92b2lkIHJ0bDgxODBfcnFfdHhfYWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2VuZGlmCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApKQordm9pZCBydGw4MTgwX3dhdGNoX2RvZ193cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworI2Vsc2UKK3ZvaWQgcnRsODE4MF93YXRjaF9kb2dfd3Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjZW5kaWYKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkpCit2b2lkIHJ0bDgxODBfaHdfd2FrZXVwX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisjZWxzZQordm9pZCBydGw4MTgwX2h3X3dha2V1cF93cShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNlbmRpZgorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApKQordm9pZCBydGw4MTgwX2h3X3NsZWVwX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisjZWxzZQordm9pZCBydGw4MTgwX2h3X3NsZWVwX3dxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2VuZGlmCisKKworCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApKQordm9pZCBydGw4MTgwX3N3X2FudGVubmFfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKyNlbHNlCit2b2lkIHJ0bDgxODBfc3dfYW50ZW5uYV93cShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNlbmRpZgorIHZvaWQgcnRsODE4MF93YXRjaF9kb2coc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHdhdGNoX2RvZ19hZGFwdGl2ZSh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisgICAgc3RydWN0IHI4MTgwX3ByaXYqIHByaXYgPSBpZWVlODAyMTFfcHJpdigoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhKTsKKy8vCURNRVNHKCItLS0tPndhdGNoX2RvZ19hZGFwdGl2ZSgpXG4iKTsKKwlpZighcHJpdi0+dXApCisJeworCQlETUVTRygiPC0tLS13YXRjaF9kb2dfYWRhcHRpdmUoKTpkcml2ZXIgaXMgbm90IHVwIVxuIik7CisJCXJldHVybjsKKwl9CisKKyAgLy8gICAgICBxdWV1ZV93b3JrKHByaXYtPmllZWU4MDIxMS0+d3EsJnByaXYtPmllZWU4MDIxMS0+d2F0Y2hfZG9nX3dxKTsKKy8ve2J5IGFteSAwODAzMTIKKyNpZiAxCisJLy8gVHggSGlnaCBQb3dlciBNZWNoYW5pc20uCisjaWZkZWYgSElHSF9QT1dFUgorCWlmKENoZWNrSGlnaFBvd2VyKChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGEpKQorCXsKKwkJcXVldWVfd29yayhwcml2LT5pZWVlODAyMTEtPndxLCAodm9pZCAqKSZwcml2LT5pZWVlODAyMTEtPnR4X3B3X3dxKTsKKwl9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKwkvLyBUeCBQb3dlciBUcmFja2luZyBvbiA4N1NFLgorI2lmZGVmIFRYX1RSQUNLCisJLy9pZiggcHJpdi0+YlR4UG93ZXJUcmFjayApCS8vbHptIG1vZCAwODA4MjYKKwlpZiggQ2hlY2tUeFB3clRyYWNraW5nKChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGEpKTsKKwkJVHhQd3JUcmFja2luZzg3U0UoKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YSk7CisjZW5kaWYKKyNlbmRpZgorCisJLy8gUGVyZm9ybSBESUcgaW1tZWRpYXRlbHkuCisjaWZkZWYgU1dfRElHCisJaWYoQ2hlY2tEaWcoKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YSkgPT0gdHJ1ZSkKKwl7CisJCXF1ZXVlX3dvcmsocHJpdi0+aWVlZTgwMjExLT53cSwgKHZvaWQgKikmcHJpdi0+aWVlZTgwMjExLT5od19kaWdfd3EpOworCX0KKyNlbmRpZgorI2VuZGlmCisvL2J5IGFteSAwODAzMTJ9CisgICAJcnRsODE4MF93YXRjaF9kb2coKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YSk7CisKKworCXF1ZXVlX3dvcmsocHJpdi0+aWVlZTgwMjExLT53cSwgKHZvaWQgKikmcHJpdi0+aWVlZTgwMjExLT5HUElPQ2hhbmdlUkZXb3JrSXRlbSk7CisKKyAgIAlwcml2LT53YXRjaF9kb2dfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBNU0VDUyhJRUVFODAyMTFfV0FUQ0hfRE9HX1RJTUUpOworCWFkZF90aW1lcigmcHJpdi0+d2F0Y2hfZG9nX3RpbWVyKTsKKy8vICAgICAgICBETUVTRygiPC0tLS13YXRjaF9kb2dfYWRhcHRpdmUoKVxuIik7Cit9CisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisKK3N0YXRpYyBDSEFOTkVMX0xJU1QgQ2hhbm5lbFBsYW5bXSA9IHsKKwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0fSwxOX0sICAJCS8vRkNDCisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMX0sMTF9LCAgICAgICAgICAgICAgICAgICAgCQkJCS8vSUMKKwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0fSwyMX0sICAJLy9FVFNJCisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywzNiw0MCw0NCw0OCw1Miw1Niw2MCw2NH0sMjF9LCAgICAvL1NwYWluLiBDaGFuZ2UgdG8gRVRTSS4KKwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0fSwyMX0sICAJLy9GcmFuY2UuIENoYW5nZSB0byBFVFNJLgorCXt7MTQsMzYsNDAsNDQsNDgsNTIsNTYsNjAsNjR9LDl9LAkJCQkJCS8vTUtLCisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwgMzYsNDAsNDQsNDgsNTIsNTYsNjAsNjR9LDIyfSwvL01LSzEKKwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0fSwyMX0sCS8vSXNyYWVsLgorCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMzQsMzgsNDIsNDZ9LDE3fSwJCQkvLyBGb3IgMTFhICwgVEVMRUMKKwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0fSwxNH0sICAvL0ZvciBHbG9iYWwgRG9tYWluLiAxLTExOmFjdGl2ZSBzY2FuLCAxMi0xNCBwYXNzaXZlIHNjYW4uIC8vK1lKLCAwODA2MjYKKwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzfSwxM30gLy93b3JsZCB3aWRlIDEzOiBjaDF+Y2gxMSBhY3RpdmUgc2NhbiwgY2gxMn4xMyBwYXNzaXZlIC8vbHptIGFkZCAwODA4MjYKK307CisKK3N0YXRpYyB2b2lkIHJ0bDgxODBfc2V0X2NoYW5uZWxfbWFwKHU4IGNoYW5uZWxfcGxhbiwgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaW50IGk7CisKKwkvL2x6bSBhZGQgMDgwODI2CisJaWVlZS0+TWluUGFzc2l2ZUNobmxOdW09TUFYX0NIQU5ORUxfTlVNQkVSKzE7CisJaWVlZS0+SWJzc1N0YXJ0Q2hubD0wOworCisJc3dpdGNoIChjaGFubmVsX3BsYW4pCisJeworCQljYXNlIENPVU5UUllfQ09ERV9GQ0M6CisJCWNhc2UgQ09VTlRSWV9DT0RFX0lDOgorCQljYXNlIENPVU5UUllfQ09ERV9FVFNJOgorCQljYXNlIENPVU5UUllfQ09ERV9TUEFJTjoKKwkJY2FzZSBDT1VOVFJZX0NPREVfRlJBTkNFOgorCQljYXNlIENPVU5UUllfQ09ERV9NS0s6CisJCWNhc2UgQ09VTlRSWV9DT0RFX01LSzE6CisJCWNhc2UgQ09VTlRSWV9DT0RFX0lTUkFFTDoKKwkJY2FzZSBDT1VOVFJZX0NPREVfVEVMRUM6CisJCXsKKwkJCURvdDExZF9Jbml0KGllZWUpOworCQkJaWVlZS0+Ykdsb2JhbERvbWFpbiA9IGZhbHNlOworCQkJaWYgKENoYW5uZWxQbGFuW2NoYW5uZWxfcGxhbl0uTGVuICE9IDApeworCQkJCS8vIENsZWFyIG9sZCBjaGFubmVsIG1hcAorCQkJCW1lbXNldChHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwLCAwLCBzaXplb2YoR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcCkpOworCQkJCS8vIFNldCBuZXcgY2hhbm5lbCBtYXAKKwkJCQlmb3IgKGk9MDtpPENoYW5uZWxQbGFuW2NoYW5uZWxfcGxhbl0uTGVuO2krKykKKwkJCQl7CisJCQkJCWlmKENoYW5uZWxQbGFuW2NoYW5uZWxfcGxhbl0uQ2hhbm5lbFtpXSA8PSAxNCkKKwkJCQkJCUdFVF9ET1QxMURfSU5GTyhpZWVlKS0+Y2hhbm5lbF9tYXBbQ2hhbm5lbFBsYW5bY2hhbm5lbF9wbGFuXS5DaGFubmVsW2ldXSA9IDE7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBDT1VOVFJZX0NPREVfR0xPQkFMX0RPTUFJTjoKKwkJeworCQkJR0VUX0RPVDExRF9JTkZPKGllZWUpLT5iRW5hYmxlZCA9IDA7CisJCQlEb3QxMWRfUmVzZXQoaWVlZSk7CisJCQlpZWVlLT5iR2xvYmFsRG9tYWluID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgQ09VTlRSWV9DT0RFX1dPUkxEX1dJREVfMTNfSU5ERVg6Ly9sem0gYWRkIDA4MDgyNgorCQl7CisJCWllZWUtPk1pblBhc3NpdmVDaG5sTnVtPTEyOworCQlpZWVlLT5JYnNzU3RhcnRDaG5sPSAxMDsKKwkJYnJlYWs7CisJCX0KKwkJZGVmYXVsdDoKKwkJeworCQkJRG90MTFkX0luaXQoaWVlZSk7CisJCQlpZWVlLT5iR2xvYmFsRG9tYWluID0gZmFsc2U7CisJCQltZW1zZXQoR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcCwgMCwgc2l6ZW9mKEdFVF9ET1QxMURfSU5GTyhpZWVlKS0+Y2hhbm5lbF9tYXApKTsKKwkJCWZvciAoaT0xO2k8PTE0O2krKykKKwkJCXsKKwkJCQlHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwW2ldID0gMTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorfQorI2VuZGlmCisKKy8vQWRkIGZvciBSRiBwb3dlciBvbiBwb3dlciBvZmYgYnkgbGl6aGFvbWluZyAwODA1MTIKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkpCit2b2lkIEdQSU9DaGFuZ2VSRldvcmtJdGVtQ2FsbEJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKyNlbHNlCit2b2lkIEdQSU9DaGFuZ2VSRldvcmtJdGVtQ2FsbEJhY2soc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworI2VuZGlmCisKKy8vWUosYWRkLDA4MDgyOAorc3RhdGljIHZvaWQgcnRsODE4MF9zdGF0aXN0aWNzX2luaXQoc3RydWN0IFN0YXRzICpwc3RhdHMpCit7CisJbWVtc2V0KHBzdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCBTdGF0cykpOworfQorc3RhdGljIHZvaWQgcnRsODE4MF9saW5rX2RldGVjdF9pbml0KHBsaW5rX2RldGVjdF90IHBsaW5rX2RldGVjdCkKK3sKKwltZW1zZXQocGxpbmtfZGV0ZWN0LCAwLCBzaXplb2YobGlua19kZXRlY3RfdCkpOworCXBsaW5rX2RldGVjdC0+U2xvdE51bSA9IERFRkFVTFRfU0xPVF9OVU07Cit9CisvL1lKLGFkZCwwODA4MjgsZW5kCisKK3Nob3J0IHJ0bDgxODBfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MTYgd29yZDsKKwl1MTYgdmVyc2lvbjsKKwl1OCBod192ZXJzaW9uOworCS8vdTggY29uZmlnMzsKKwl1MzIgdXNWYWx1ZTsKKwl1MTYgdG1wdTE2OworCWludCBpLCBqOworCisjaWZkZWYgRU5BQkxFX0RPVDExRAorI2lmIDAKKwlmb3IoaT0wO2k8MHhGRjtpKyspIHsKKwkJaWYoaSUxNiA9PSAwKQorCQkJcHJpbnRrKCJcblsleF06ICIsIGkvMTYpOworCQlwcmludGsoIlx0JTQuNHgiLCBlcHJvbV9yZWFkKGRldixpKSk7CisJfQorI2VuZGlmCisJcHJpdi0+Y2hhbm5lbF9wbGFuID0gZXByb21fcmVhZChkZXYsIEVFUFJPTV9DT1VOVFJZX0NPREU+PjEpICYgMHhGRjsKKwlpZihwcml2LT5jaGFubmVsX3BsYW4gPiBDT1VOVFJZX0NPREVfR0xPQkFMX0RPTUFJTil7CisJCXByaW50aygicnRsODE4MF9pbml0OkVycm9yIGNoYW5uZWwgcGxhbiEgU2V0IHRvIGRlZmF1bHQuXG4iKTsKKwkJcHJpdi0+Y2hhbm5lbF9wbGFuID0gMDsKKwl9CisJLy9wcml2LT5jaGFubmVsX3BsYW4gPSA5OyAgLy9HbG9iYWwgRG9tYWluCisKKwlETUVTRygiQ2hhbm5lbCBwbGFuIGlzICVkXG4iLHByaXYtPmNoYW5uZWxfcGxhbik7CisJcnRsODE4MF9zZXRfY2hhbm5lbF9tYXAocHJpdi0+Y2hhbm5lbF9wbGFuLCBwcml2LT5pZWVlODAyMTEpOworI2Vsc2UKKwlpbnQgY2g7CisJLy9TZXQgRGVmYXVsdCBDaGFubmVsIFBsYW4KKwlpZighY2hhbm5lbHMpeworCQlETUVTRygiTm8gY2hhbm5lbHMsIGFib3J0aW5nIik7CisJCXJldHVybiAtMTsKKwl9CisJY2g9Y2hhbm5lbHM7CisJcHJpdi0+Y2hhbm5lbF9wbGFuID0gMDsvL2hpa2FydQorCSAvLyBzZXQgY2hhbm5lbHMgMS4uMTQgYWxsb3dlZCBpbiBnaXZlbiBsb2NhbGUKKwlmb3IgKGk9MTsgaTw9MTQ7IGkrKykgeworCQkocHJpdi0+aWVlZTgwMjExLT5jaGFubmVsX21hcClbaV0gPSAodTgpKGNoICYgMHgwMSk7CisJCWNoID4+PSAxOworCX0KKyNlbmRpZgorCisJLy9tZW1jcHkocHJpdi0+c3RhdHMsMCxzaXplb2Yoc3RydWN0IFN0YXRzKSk7CisKKwkvL0ZJWE1FOiB0aGVzZSBjb25zdGFudHMgYXJlIHBsYWNlZCBpbiBhIGJhZCBwbGVhY2UuCisJcHJpdi0+dHhidWZmc2l6ZSA9IDIwNDg7Ly8xMDI0OworCXByaXYtPnR4cmluZ2NvdW50ID0gMzI7Ly8zMjsKKwlwcml2LT5yeGJ1ZmZlcnNpemUgPSAyMDQ4Oy8vMTAyNDsKKwlwcml2LT5yeHJpbmdjb3VudCA9IDY0Oy8vMzI7CisJcHJpdi0+dHhiZWFjb25jb3VudCA9IDI7CisJcHJpdi0+cnhfc2tiX2NvbXBsZXRlID0gMTsKKwkvL3ByaXYtPnR4bnBfcGVuZGluZy5pc3BlbmRpbmc9MDsKKwkvKiBeXiB0aGUgU0tCIGRvZXMgbm90IGNvbnRhaW50IGEgcGFydGlhbCBSWGVkCisJICogcGFja2V0IChpcyBlbXB0eSkKKwkgKi8KKworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKwlwcml2LT5SZWdUaHJlZVdpcmVNb2RlID0gSFdfVEhSRUVfV0lSRV9TSTsKKyNlbHNlCisgICAgICAgIHByaXYtPlJlZ1RocmVlV2lyZU1vZGUgPSBTV19USFJFRV9XSVJFOworI2VuZGlmCisjZW5kaWYKKworLy9BZGQgZm9yIFJGIHBvd2VyIG9uIHBvd2VyIG9mZiBieSBsaXpoYW9taW5nIDA4MDUxMgorCXByaXYtPlJGQ2hhbmdlSW5Qcm9ncmVzcyA9IGZhbHNlOworCXByaXYtPlNldFJGUG93ZXJTdGF0ZUluUHJvZ3Jlc3MgPSBmYWxzZTsKKwlwcml2LT5SRlByb2dUeXBlID0gMDsKKwlwcml2LT5iSW5IY3RUZXN0ID0gZmFsc2U7CisKKwlwcml2LT5pcnFfZW5hYmxlZD0wOworCisvL1lKLG1vZGlmaWVkLDA4MDgyOAorI2lmIDAKKwlwcml2LT5zdGF0cy5yeGRtYWZhaWw9MDsKKwlwcml2LT5zdGF0cy50eHJkdT0wOworCXByaXYtPnN0YXRzLnJ4cmR1PTA7CisJcHJpdi0+c3RhdHMucnhub2xhc3Q9MDsKKwlwcml2LT5zdGF0cy5yeG5vZGF0YT0wOworCS8vcHJpdi0+c3RhdHMucnhyZXNldD0wOworCS8vcHJpdi0+c3RhdHMucnh3cmthcm91bmQ9MDsKKwlwcml2LT5zdGF0cy5yeG5vcG9pbnRlcj0wOworCXByaXYtPnN0YXRzLnR4bnBlcnI9MDsKKwlwcml2LT5zdGF0cy50eHJlc3VtZWQ9MDsKKwlwcml2LT5zdGF0cy5yeGVycj0wOworCXByaXYtPnN0YXRzLnJ4b3ZlcmZsb3c9MDsKKwlwcml2LT5zdGF0cy5yeGludD0wOworCXByaXYtPnN0YXRzLnR4bnBva2ludD0wOworCXByaXYtPnN0YXRzLnR4aHBva2ludD0wOworCXByaXYtPnN0YXRzLnR4aHBlcnI9MDsKKwlwcml2LT5zdGF0cy5pbnRzPTA7CisJcHJpdi0+c3RhdHMuc2hpbnRzPTA7CisJcHJpdi0+c3RhdHMudHhvdmVyZmxvdz0wOworCXByaXYtPnN0YXRzLnR4YmVhY29uPTA7CisJcHJpdi0+c3RhdHMudHhiZWFjb25lcnI9MDsKKwlwcml2LT5zdGF0cy50eGxwZXJyPTA7CisJcHJpdi0+c3RhdHMudHhscG9raW50PTA7CisJcHJpdi0+c3RhdHMudHhyZXRyeT0wOy8vdG9ueSAyMDA2MDYwMQorCXByaXYtPnN0YXRzLnJ4Y3JjZXJybWluPTA7CisJcHJpdi0+c3RhdHMucnhjcmNlcnJtaWQ9MDsKKwlwcml2LT5zdGF0cy5yeGNyY2Vycm1heD0wOworCXByaXYtPnN0YXRzLnJ4aWN2ZXJyPTA7CisjZWxzZQorCXJ0bDgxODBfc3RhdGlzdGljc19pbml0KCZwcml2LT5zdGF0cyk7CisJcnRsODE4MF9saW5rX2RldGVjdF9pbml0KCZwcml2LT5saW5rX2RldGVjdCk7CisjZW5kaWYKKy8vWUosbW9kaWZpZWQsMDgwODI4LGVuZAorCisKKwlwcml2LT5hY2tfdHhfdG9faWVlZSA9IDA7CisJcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsID0gREVGQVVMVF9CRUFDT05JTlRFUlZBTDsKKwlwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPSBJV19NT0RFX0lORlJBOworCXByaXYtPmllZWU4MDIxMS0+c29mdG1hY19mZWF0dXJlcyAgPSBJRUVFX1NPRlRNQUNfU0NBTiB8CisJCUlFRUVfU09GVE1BQ19BU1NPQ0lBVEUgfCBJRUVFX1NPRlRNQUNfUFJPQkVSUSB8CisJCUlFRUVfU09GVE1BQ19QUk9CRVJTIHwgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFOworCXByaXYtPmllZWU4MDIxMS0+YWN0aXZlX3NjYW4gPSAxOworCXByaXYtPmllZWU4MDIxMS0+cmF0ZSA9IDExMDsgLy8xMSBtYnBzCisJcHJpdi0+aWVlZTgwMjExLT5tb2R1bGF0aW9uID0gSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OOworCXByaXYtPmllZWU4MDIxMS0+aG9zdF9lbmNyeXB0ID0gMTsKKwlwcml2LT5pZWVlODAyMTEtPmhvc3RfZGVjcnlwdCA9IDE7CisJcHJpdi0+aWVlZTgwMjExLT5zdGFfd2FrZV91cCA9IHJ0bDgxODBfaHdfd2FrZXVwOworCXByaXYtPmllZWU4MDIxMS0+cHNfcmVxdWVzdF90eF9hY2sgPSBydGw4MTgwX3JxX3R4X2FjazsKKwlwcml2LT5pZWVlODAyMTEtPmVudGVyX3NsZWVwX3N0YXRlID0gcnRsODE4MF9od19zbGVlcDsKKwlwcml2LT5pZWVlODAyMTEtPnBzX2lzX3F1ZXVlX2VtcHR5ID0gcnRsODE4MF9pc190eF9xdWV1ZV9lbXB0eTsKKworCXByaXYtPmh3X3dlcCA9IGh3d2VwOworCXByaXYtPnByaXNtX2hkcj0wOworCXByaXYtPmRldj1kZXY7CisJcHJpdi0+cmV0cnlfcnRzID0gREVGQVVMVF9SRVRSWV9SVFM7CisJcHJpdi0+cmV0cnlfZGF0YSA9IERFRkFVTFRfUkVUUllfREFUQTsKKwlwcml2LT5SRkNoYW5nZUluUHJvZ3Jlc3MgPSBmYWxzZTsKKwlwcml2LT5TZXRSRlBvd2VyU3RhdGVJblByb2dyZXNzID0gZmFsc2U7CisJcHJpdi0+UkZQcm9nVHlwZSA9IDA7CisJcHJpdi0+YkluSGN0VGVzdCA9IGZhbHNlOworCXByaXYtPmJJbmFjdGl2ZVBzID0gdHJ1ZTsvL2ZhbHNlOworCXByaXYtPmllZWU4MDIxMS0+YkluYWN0aXZlUHMgPSBwcml2LT5iSW5hY3RpdmVQczsKKwlwcml2LT5iU3dSZlByb2Nlc3NpbmcgPSBmYWxzZTsKKwlwcml2LT5lUkZQb3dlclN0YXRlID0gZVJmT2ZmOworCXByaXYtPlJmT2ZmUmVhc29uID0gMDsKKwlwcml2LT5MZWRTdHJhdGVneSA9IFNXX0xFRF9NT0RFMDsKKwkvL3ByaXYtPk51bVJ4T2tJblBlcmlvZCA9IDA7ICAvL1lKLGRlbCwwODA4MjgKKwkvL3ByaXYtPk51bVR4T2tJblBlcmlvZCA9IDA7ICAvL1lKLGRlbCwwODA4MjgKKwlwcml2LT5UeFBvbGxpbmdUaW1lcyA9IDA7Ly9sem0gYWRkIDA4MDgyNgorCXByaXYtPmJMZWlzdXJlUHMgPSB0cnVlOworCXByaXYtPmRvdDExUG93ZXJTYXZlTW9kZSA9IGVBY3RpdmU7CisvL2J5IGFteSBmb3IgYW50ZW5uYQorCXByaXYtPkFkTWluQ2hlY2tQZXJpb2QgPSA1OworCXByaXYtPkFkTWF4Q2hlY2tQZXJpb2QgPSAxMDsKKy8vIExvd2VyIHNpZ25hbCBzdHJlbmd0aCB0aHJlc2hvbGQgdG8gZml0IHRoZSBIVyBwYXJ0aWNpcGF0aW9uIGluIGFudGVubmEgZGl2ZXJzaXR5LiArYnkgYW15IDA4MDMxMgorCXByaXYtPkFkTWF4UnhTc1RocmVzaG9sZCA9IDMwOy8vNjAtPjMwCisJcHJpdi0+QWRSeFNzVGhyZXNob2xkID0gMjA7Ly81MC0+MjAKKwlwcml2LT5BZENoZWNrUGVyaW9kID0gcHJpdi0+QWRNaW5DaGVja1BlcmlvZDsKKwlwcml2LT5BZFRpY2tDb3VudCA9IDA7CisJcHJpdi0+QWRSeFNpZ25hbFN0cmVuZ3RoID0gLTE7CisJcHJpdi0+UmVnU3dBbnRlbm5hRGl2ZXJzaXR5TWVjaGFuaXNtID0gMDsKKwlwcml2LT5SZWdEZWZhdWx0QW50ZW5uYSA9IDA7CisJcHJpdi0+U2lnbmFsU3RyZW5ndGggPSAwOworCXByaXYtPkFkUnhPa0NudCA9IDA7CisJcHJpdi0+Q3VyckFudGVubmFJbmRleCA9IDA7CisJcHJpdi0+QWRSeFNzQmVmb3JlU3dpdGNoZWQgPSAwOworCWluaXRfdGltZXIoJnByaXYtPlN3QW50ZW5uYURpdmVyc2l0eVRpbWVyKTsKKwlwcml2LT5Td0FudGVubmFEaXZlcnNpdHlUaW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCXByaXYtPlN3QW50ZW5uYURpdmVyc2l0eVRpbWVyLmZ1bmN0aW9uID0gKHZvaWQgKilTd0FudGVubmFEaXZlcnNpdHlUaW1lckNhbGxiYWNrOworLy9ieSBhbXkgZm9yIGFudGVubmEKKy8ve2J5IGFteSAwODAzMTIKKwlwcml2LT5iRGlnTWVjaGFuaXNtID0gMTsKKwlwcml2LT5Jbml0aWFsR2FpbiA9IDY7CisJcHJpdi0+Ylh0YWxDYWxpYnJhdGlvbiA9IGZhbHNlOworCXByaXYtPlh0YWxDYWxfWGluID0gMDsKKwlwcml2LT5YdGFsQ2FsX1hvdXQgPSAwOworCXByaXYtPmJUeFBvd2VyVHJhY2sgPSBmYWxzZTsKKwlwcml2LT5UaGVybWFsTWV0ZXIgPSAwOworCXByaXYtPkZhbHNlQWxhcm1SZWdWYWx1ZSA9IDA7CisJcHJpdi0+UmVnRGlnT2ZkbUZhVXBUaCA9IDB4YzsgLy8gVXBwZXIgdGhyZWhvbGQgb2YgT0ZETSBmYWxzZSBhbGFybSwgd2hpY2ggaXMgdXNlZCBpbiBESUcuCisJcHJpdi0+RElHX051bWJlckZhbGxiYWNrVm90ZSA9IDA7CisJcHJpdi0+RElHX051bWJlclVwZ3JhZGVWb3RlID0gMDsKKwlwcml2LT5MYXN0U2lnbmFsU3RyZW5ndGhJblBlcmNlbnQgPSAwOworCXByaXYtPlN0YXRzX1NpZ25hbFN0cmVuZ3RoID0gMDsKKwlwcml2LT5MYXN0UnhQa3RBbnRlbm5hID0gMDsKKwlwcml2LT5TaWduYWxRdWFsaXR5ID0gMDsgLy8gaW4gMC0xMDAgaW5kZXguCisJcHJpdi0+U3RhdHNfU2lnbmFsUXVhbGl0eSA9IDA7CisJcHJpdi0+UmVjdlNpZ25hbFBvd2VyID0gMDsgLy8gaW4gZEJtLgorCXByaXYtPlN0YXRzX1JlY3ZTaWduYWxQb3dlciA9IDA7CisJcHJpdi0+QWRNYWluQW50ZW5uYVJ4T2tDbnQgPSAwOworCXByaXYtPkFkQXV4QW50ZW5uYVJ4T2tDbnQgPSAwOworCXByaXYtPmJIV0FkU3dpdGNoZWQgPSBmYWxzZTsKKwlwcml2LT5iUmVnSGlnaFBvd2VyTWVjaGFuaXNtID0gdHJ1ZTsKKwlwcml2LT5SZWdIaVB3clVwcGVyVGggPSA3NzsKKwlwcml2LT5SZWdIaVB3ckxvd2VyVGggPSA3NTsKKwlwcml2LT5SZWdSU1NJSGlQd3JVcHBlclRoID0gNzA7CisJcHJpdi0+UmVnUlNTSUhpUHdyTG93ZXJUaCA9IDIwOworCXByaXYtPmJDdXJDQ0tQa3QgPSBmYWxzZTsKKwlwcml2LT5VbmRlY29yYXRlZFNtb290aGVkU1MgPSAtMTsKKwlwcml2LT5iVG9VcGRhdGVUeFB3ciA9IGZhbHNlOworCXByaXYtPkN1ckNDS1JTU0kgPSAwOworCXByaXYtPlJ4UG93ZXIgPSAwOworCXByaXYtPlJTU0kgPSAwOworCS8vWUosYWRkLDA4MDgyOAorCXByaXYtPk51bVR4T2tUb3RhbCA9IDA7CisJcHJpdi0+TnVtVHhVbmljYXN0ID0gMDsKKwlwcml2LT5rZWVwQWxpdmVMZXZlbCA9IERFRkFVTFRfS0VFUF9BTElWRV9MRVZFTDsKKwlwcml2LT5Qb3dlclByb2ZpbGUgPSBQT1dFUl9QUk9GSUxFX0FDOworCS8vWUosYWRkLDA4MDgyOCxlbmQKKy8vYnkgYW15IGZvciByYXRlIGFkYXB0aXZlCisgICAgcHJpdi0+Q3VyclJldHJ5Q250PTA7CisgICAgcHJpdi0+TGFzdFJldHJ5Q250PTA7CisgICAgcHJpdi0+TGFzdFR4b2tDbnQ9MDsKKyAgICBwcml2LT5MYXN0Unhva0NudD0wOworICAgIHByaXYtPkxhc3RSZXRyeVJhdGU9MDsKKyAgICBwcml2LT5iVHJ5dXBpbmc9MDsKKyAgICBwcml2LT5DdXJyVHhSYXRlPTA7CisgICAgcHJpdi0+Q3VyclJldHJ5UmF0ZT0wOworICAgIHByaXYtPlRyeXVwaW5nQ291bnQ9MDsKKyAgICBwcml2LT5Ucnl1cGluZ0NvdW50Tm9EYXRhPTA7CisgICAgcHJpdi0+VHJ5RG93bkNvdW50TG93RGF0YT0wOworICAgIHByaXYtPkxhc3RUeE9LQnl0ZXM9MDsKKyAgICBwcml2LT5MYXN0RmFpbFR4UmF0ZT0wOworICAgIHByaXYtPkxhc3RGYWlsVHhSYXRlU1M9MDsKKyAgICBwcml2LT5GYWlsVHhSYXRlQ291bnQ9MDsKKyAgICBwcml2LT5MYXN0VHhUaHJvdWdocHV0PTA7CisgICAgcHJpdi0+TnVtVHhPa0J5dGVzVG90YWw9MDsKKwlwcml2LT5Gb3JjZWREYXRhUmF0ZSA9IDA7CisJcHJpdi0+UmVnQk1vZGVHYWluU3RhZ2UgPSAxOworCisvL2J5IGFteSBmb3IgcmF0ZSBhZGFwdGl2ZQorLy9ieSBhbXkgMDgwMzEyfQorCXByaXYtPnByb21pc2MgPSAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSA/IDE6MDsKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+aXJxX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZwcml2LT5pcnFfdGhfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPnR4X2xvY2spOworCXNwaW5fbG9ja19pbml0KCZwcml2LT5wc19sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+cmZfcHNfbG9jayk7CisJc2VtYV9pbml0KCZwcml2LT53eF9zZW0sMSk7CisJc2VtYV9pbml0KCZwcml2LT5yZl9zdGF0ZSwxKTsKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkpCisJSU5JVF9XT1JLKCZwcml2LT5yZXNldF93cSwodm9pZCopIHJ0bDgxODBfcmVzdGFydF93cSk7CisJSU5JVF9XT1JLKCZwcml2LT50eF9pcnFfd3EsKHZvaWQqKSBydGw4MTgwX3R4X2lycV93cSk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmllZWU4MDIxMS0+aHdfd2FrZXVwX3dxLCh2b2lkKikgcnRsODE4MF9od193YWtldXBfd3EpOworCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5pZWVlODAyMTEtPmh3X3NsZWVwX3dxLCh2b2lkKikgcnRsODE4MF9od19zbGVlcF93cSk7CisJLy9JTklUX0RFTEFZRURfV09SSygmcHJpdi0+aWVlZTgwMjExLT53YXRjaF9kb2dfd3EsKHZvaWQqKSBydGw4MTgwX3dhdGNoX2RvZ193cSk7CisJLy9JTklUX0RFTEFZRURfV09SSygmcHJpdi0+aWVlZTgwMjExLT5zd19hbnRlbm5hX3dxLCh2b2lkKikgcnRsODE4MF9zd19hbnRlbm5hX3dxKTsKKwlJTklUX1dPUksoJnByaXYtPmllZWU4MDIxMS0+d21tX3BhcmFtX3VwZGF0ZV93cSwodm9pZCopIHJ0bDgxODBfd21tX3BhcmFtX3VwZGF0ZSk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmllZWU4MDIxMS0+cmF0ZV9hZGFwdGVyX3dxLCh2b2lkKilydGw4MTgwX3JhdGVfYWRhcHRlcik7Ly8rYnkgYW15IDA4MDMxMgorCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5pZWVlODAyMTEtPmh3X2RpZ193cSwodm9pZCopcnRsODE4MF9od19kaWdfd3EpOy8vK2J5IGFteSAwODAzMTIKKwlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+aWVlZTgwMjExLT50eF9wd193cSwodm9pZCopcnRsODE4MF90eF9wd193cSk7Ly8rYnkgYW15IDA4MDMxMgorCisJLy9hZGQgZm9yIFJGIHBvd2VyIG9uIHBvd2VyIG9mZiBieSBsaXpoYW9taW5nIDA4MDUxMgorCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5pZWVlODAyMTEtPkdQSU9DaGFuZ2VSRldvcmtJdGVtLCh2b2lkKikgR1BJT0NoYW5nZVJGV29ya0l0ZW1DYWxsQmFjayk7CisjZWxzZQorCUlOSVRfV09SSygmcHJpdi0+cmVzZXRfd3EsKHZvaWQqKSBydGw4MTgwX3Jlc3RhcnRfd3EsZGV2KTsKKwlJTklUX1dPUksoJnByaXYtPnR4X2lycV93cSwodm9pZCopIHJ0bDgxODBfdHhfaXJxX3dxLGRldik7CisJLy9JTklUX1dPUksoJnByaXYtPmllZWU4MDIxMS0+d2F0Y2hfZG9nX3dxLCh2b2lkKikgcnRsODE4MF93YXRjaF9kb2dfd3EsZGV2KTsKKwlJTklUX1dPUksoJnByaXYtPmllZWU4MDIxMS0+aHdfd2FrZXVwX3dxLCh2b2lkKikgcnRsODE4MF9od193YWtldXBfd3EsZGV2KTsKKwlJTklUX1dPUksoJnByaXYtPmllZWU4MDIxMS0+aHdfc2xlZXBfd3EsKHZvaWQqKSBydGw4MTgwX2h3X3NsZWVwX3dxLGRldik7CisJLy9JTklUX1dPUksoJnByaXYtPmllZWU4MDIxMS0+c3dfYW50ZW5uYV93cSwodm9pZCopIHJ0bDgxODBfc3dfYW50ZW5uYV93cSxkZXYpOworCUlOSVRfV09SSygmcHJpdi0+aWVlZTgwMjExLT53bW1fcGFyYW1fdXBkYXRlX3dxLCh2b2lkKikgcnRsODE4MF93bW1fcGFyYW1fdXBkYXRlLHByaXYtPmllZWU4MDIxMSk7CisgICAgSU5JVF9XT1JLKCZwcml2LT5pZWVlODAyMTEtPnJhdGVfYWRhcHRlcl93cSwodm9pZCopcnRsODE4MF9yYXRlX2FkYXB0ZXIsZGV2KTsvLytieSBhbXkgMDgwMzEyCisJSU5JVF9XT1JLKCZwcml2LT5pZWVlODAyMTEtPmh3X2RpZ193cSwodm9pZCopcnRsODE4MF9od19kaWdfd3EsZGV2KTsvLytieSBhbXkgMDgwMzEyCisJSU5JVF9XT1JLKCZwcml2LT5pZWVlODAyMTEtPnR4X3B3X3dxLCh2b2lkKilydGw4MTgwX3R4X3B3X3dxLGRldik7Ly8rYnkgYW15IDA4MDMxMgorCisJLy9hZGQgZm9yIFJGIHBvd2VyIG9uIHBvd2VyIG9mZiBieSBsaXpoYW9taW5nIDA4MDUxMgorCUlOSVRfV09SSygmcHJpdi0+aWVlZTgwMjExLT5HUElPQ2hhbmdlUkZXb3JrSXRlbSwodm9pZCopIEdQSU9DaGFuZ2VSRldvcmtJdGVtQ2FsbEJhY2ssIHByaXYtPmllZWU4MDIxMSk7CisjZW5kaWYKKwkvL0lOSVRfV09SSygmcHJpdi0+cmVzZXRfd3EsKHZvaWQqKSBydGw4MTgwX3Jlc3RhcnRfd3EsZGV2KTsKKworCXRhc2tsZXRfaW5pdCgmcHJpdi0+aXJxX3J4X3Rhc2tsZXQsCisJCSAgICAgKHZvaWQoKikodW5zaWduZWQgbG9uZykpIHJ0bDgxODBfaXJxX3J4X3Rhc2tsZXQsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcpcHJpdik7CisvL2J5IGFteQorICAgIGluaXRfdGltZXIoJnByaXYtPndhdGNoX2RvZ190aW1lcik7CisJcHJpdi0+d2F0Y2hfZG9nX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CisJcHJpdi0+d2F0Y2hfZG9nX3RpbWVyLmZ1bmN0aW9uID0gd2F0Y2hfZG9nX2FkYXB0aXZlOworLy9ieSBhbXkKKworLy97YnkgYW15IDA4MDMxMgorLy9ieSBhbXkgZm9yIHJhdGUgYWRhcHRpdmUKKyAgICBpbml0X3RpbWVyKCZwcml2LT5yYXRlYWRhcHRlcl90aW1lcik7CisgICAgICAgIHByaXYtPnJhdGVhZGFwdGVyX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CisgICAgICAgIHByaXYtPnJhdGVhZGFwdGVyX3RpbWVyLmZ1bmN0aW9uID0gdGltZXJfcmF0ZV9hZGFwdGl2ZTsKKwkJcHJpdi0+UmF0ZUFkYXB0aXZlUGVyaW9kPSBSQVRFX0FEQVBUSVZFX1RJTUVSX1BFUklPRDsKKwkJcHJpdi0+YkVuaGFuY2VUeFB3cj1mYWxzZTsKKy8vYnkgYW15IGZvciByYXRlIGFkYXB0aXZlCisvL2J5IGFteSAwODAzMTJ9CisJLy9wcml2LT5pZWVlODAyMTEtPmZ1bmMgPQorCS8vCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGVscGVyX2Z1bmN0aW9ucyksR0ZQX0tFUk5FTCk7CisJLy9tZW1zZXQocHJpdi0+aWVlZTgwMjExLT5mdW5jLCAwLAorCSAgLy8gICAgIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hlbHBlcl9mdW5jdGlvbnMpKTsKKworCXByaXYtPmllZWU4MDIxMS0+c29mdG1hY19oYXJkX3N0YXJ0X3htaXQgPSBydGw4MTgwX2hhcmRfc3RhcnRfeG1pdDsKKwlwcml2LT5pZWVlODAyMTEtPnNldF9jaGFuID0gcnRsODE4MF9zZXRfY2hhbjsKKwlwcml2LT5pZWVlODAyMTEtPmxpbmtfY2hhbmdlID0gcnRsODE4MF9saW5rX2NoYW5nZTsKKwlwcml2LT5pZWVlODAyMTEtPnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQgPSBydGw4MTgwX2hhcmRfZGF0YV94bWl0OworCXByaXYtPmllZWU4MDIxMS0+ZGF0YV9oYXJkX3N0b3AgPSBydGw4MTgwX2RhdGFfaGFyZF9zdG9wOworCXByaXYtPmllZWU4MDIxMS0+ZGF0YV9oYXJkX3Jlc3VtZSA9IHJ0bDgxODBfZGF0YV9oYXJkX3Jlc3VtZTsKKworICAgICAgICBwcml2LT5pZWVlODAyMTEtPmluaXRfd21tcGFyYW1fZmxhZyA9IDA7CisKKwlwcml2LT5pZWVlODAyMTEtPnN0YXJ0X3NlbmRfYmVhY29ucyA9IHJ0bDgxODBfc3RhcnRfdHhfYmVhY29uOworCXByaXYtPmllZWU4MDIxMS0+c3RvcF9zZW5kX2JlYWNvbnMgPSBydGw4MTgwX2JlYWNvbl90eF9kaXNhYmxlOworCXByaXYtPmllZWU4MDIxMS0+ZnRzID0gREVGQVVMVF9GUkFHX1RIUkVTSE9MRDsKKworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCXByaXYtPk1XSUVuYWJsZSA9IDA7CisKKwlwcml2LT5TaG9ydFJldHJ5TGltaXQgPSA3OworCXByaXYtPkxvbmdSZXRyeUxpbWl0ID0gNzsKKwlwcml2LT5FYXJseVJ4VGhyZXNob2xkID0gNzsKKworCXByaXYtPkNTTWV0aG9kID0gKDB4MDEgPDwgMjkpOworCisJcHJpdi0+VHJhbnNtaXRDb25maWcJPQorCQkJCQkJCQkJMTw8VENSX0R1clByb2NNb2RlX09GRlNFVCB8CQkvL2ZvciBSVEw4MTg1QiwgZHVyYXRpb24gc2V0dGluZyBieSBIVworCQkJCQkJCQkJKDc8PFRDUl9NWERNQV9PRkZTRVQpIHwJLy8gTWF4IERNQSBCdXJzdCBTaXplIHBlciBUeCBETUEgQnVyc3QsIDc6IHJlc2VydmllZC4KKwkJCQkJCQkJCShwcml2LT5TaG9ydFJldHJ5TGltaXQ8PFRDUl9TUkxfT0ZGU0VUKSB8CS8vIFNob3J0IHJldHJ5IGxpbWl0CisJCQkJCQkJCQkocHJpdi0+TG9uZ1JldHJ5TGltaXQ8PFRDUl9MUkxfT0ZGU0VUKSB8CS8vIExvbmcgcmV0cnkgbGltaXQKKwkJCQkJCQkJCSgwID8gVENSX1NBVCA6IDApOwkvLyBGQUxTRTogSFcgcHJvdmllcyBQTENQIGxlbmd0aCBhbmQgTEVOR0VYVCwgVFVSRTogU1cgcHJvaXZlZHMgdGhlbQorCisJcHJpdi0+UmVjZWl2ZUNvbmZpZwk9CisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdi0+Q1NNZXRob2QgfAorI2VuZGlmCisvLwkJCQkJCQkJUkNSX0VOTUFSUCB8CisJCQkJCQkJCVJDUl9BTUYgfCBSQ1JfQURGIHwJCQkJLy9hY2NlcHQgbWFuYWdlbWVudC9kYXRhCisJCQkJCQkJCVJDUl9BQ0YgfAkJCQkJCS8vYWNjZXB0IGNvbnRyb2wgZnJhbWUgZm9yIFNXIEFQIG5lZWRzIFBTLXBvbGwsIDIwMDUuMDcuMDcsIGJ5IHJjbmprby4KKwkJCQkJCQkJUkNSX0FCIHwgUkNSX0FNIHwgUkNSX0FQTSB8CQkvL2FjY2VwdCBCQy9NQy9VQworCQkJCQkJCQkvL1JDUl9BSUNWIHwgUkNSX0FDUkMzMiB8IAkJLy9hY2NlcHQgSUNWL0NSQyBlcnJvciBwYWNrZXQKKwkJCQkJCQkJKDc8PFJDUl9NWERNQV9PRkZTRVQpIHwgLy8gTWF4IERNQSBCdXJzdCBTaXplIHBlciBSeCBETUEgQnVyc3QsIDc6IHVubGltaXRlZC4KKwkJCQkJCQkJKHByaXYtPkVhcmx5UnhUaHJlc2hvbGQ8PFJDUl9GSUZPX09GRlNFVCkgfCAvLyBSeCBGSUZPIFRocmVzaG9sZCwgNzogTm8gUnggdGhyZXNob2xkLgorCQkJCQkJCQkocHJpdi0+RWFybHlSeFRocmVzaG9sZCA9PSA3ID8gUkNSX09OTFlFUkxQS1Q6MCk7CisKKwlwcml2LT5JbnRyTWFzawkJPSBJTVJfVE1HRE9LIHwgSU1SX1RCREVSIHwgSU1SX1RIUERFUiB8CisJCQkJCQkJCUlNUl9USFBERVIgfCBJTVJfVEhQRE9LIHwKKwkJCQkJCQkJSU1SX1RWT0RFUiB8IElNUl9UVk9ET0sgfAorCQkJCQkJCQlJTVJfVFZJREVSIHwgSU1SX1RWSURPSyB8CisJCQkJCQkJCUlNUl9UQkVERVIgfCBJTVJfVEJFRE9LIHwKKwkJCQkJCQkJSU1SX1RCS0RFUiB8IElNUl9UQktET0sgfAorCQkJCQkJCQlJTVJfUkRVIHwJCQkJCQkvLyBUbyBoYW5kbGUgdGhlIGRlZnJhZ21lbnRhdGlvbiBub3QgZW5vdWdoIFJ4IGRlc2NyaXB0b3JzIGNhc2UuIEFubmllLCAyMDA2LTAzLTI3LgorCQkJCQkJCQlJTVJfUkVSIHwgSU1SX1JPSyB8CisJCQkJCQkJCUlNUl9SUW9TT0s7IC8vIDxOT1RFPiBST0sgYW5kIFJRb1NPSyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLCBzbywgd2UgbXVzdCBoYW5kbGUgUlFvU09LIGludGVycnVwdCB0byByZWNlaXZlIFFvUyBmcmFtZXMsIDIwMDUuMTIuMDksIGJ5IHJjbmprby4KKworCXByaXYtPkluaXRpYWxHYWluID0gNjsKKyNlbmRpZgorCisJaHdfdmVyc2lvbiA9KCByZWFkX25pY19kd29yZChkZXYsIFRDUikgJiBUQ1JfSFdWRVJJRF9NQVNLKT4+VENSX0hXVkVSSURfU0hJRlQ7CisKKwlzd2l0Y2ggKGh3X3ZlcnNpb24peworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCQljYXNlIEhXX1ZFUklEX1I4MTg1Ql9COgorI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaXYtPmNhcmRfODE4NSA9IFZFUlNJT05fODE4N1NfQzsKKwkJICAgICAgICBETUVTRygiTUFDIGNvbnRyb2xsZXIgaXMgYSBSVEw4MTg3U0UgYi9nIik7CisJCQlwcml2LT5waHlfdmVyID0gMjsKKwkJCWJyZWFrOworI2Vsc2UKKwkJCURNRVNHKCJNQUMgY29udHJvbGxlciBpcyBhIFJUTDgxODVCIGIvZyIpOworCQkJcHJpdi0+Y2FyZF84MTg1ID0gMzsKKwkJCXByaXYtPnBoeV92ZXIgPSAyOworCQkJYnJlYWs7CisjZW5kaWYKKyNlbmRpZgorCQljYXNlIEhXX1ZFUklEX1I4MTg1X0FCQzoKKwkJCURNRVNHKCJNQUMgY29udHJvbGxlciBpcyBhIFJUTDgxODUgYi9nIik7CisJCQlwcml2LT5jYXJkXzgxODUgPSAxOworCQkJLyogeW91IHNob3VsZCBub3QgZmluZCBhIGNhcmQgd2l0aCA4MjI1IFBIWSB2ZXIgPCBDKi8KKwkJCXByaXYtPnBoeV92ZXIgPSAyOworCQkJYnJlYWs7CisKKwkJY2FzZSBIV19WRVJJRF9SODE4NV9EOgorCQkJRE1FU0coIk1BQyBjb250cm9sbGVyIGlzIGEgUlRMODE4NSBiL2cgKFYuIEQpIik7CisJCQlwcml2LT5jYXJkXzgxODUgPSAyOworCQkJLyogeW91IHNob3VsZCBub3QgZmluZCBhIGNhcmQgd2l0aCA4MjI1IFBIWSB2ZXIgPCBDKi8KKwkJCXByaXYtPnBoeV92ZXIgPSAyOworCQkJYnJlYWs7CisKKwkJY2FzZSBIV19WRVJJRF9SODE4MF9BQkNEOgorCQkJRE1FU0coIk1BQyBjb250cm9sbGVyIGlzIGEgUlRMODE4MCIpOworCQkJcHJpdi0+Y2FyZF84MTg1ID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgSFdfVkVSSURfUjgxODBfRjoKKwkJCURNRVNHKCJNQUMgY29udHJvbGxlciBpcyBhIFJUTDgxODAgKHYuIEYpIik7CisJCQlwcml2LT5jYXJkXzgxODUgPSAwOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCURNRVNHVygiTUFDIGNoaXAgbm90IHJlY29nbml6ZWQ6IHZlcnNpb24gJXguIEFzc3VtaW5nIFJUTDgxODAiLGh3X3ZlcnNpb24pOworCQkJcHJpdi0+Y2FyZF84MTg1ID0gMDsKKwkJCWJyZWFrOworCX0KKworCWlmKHByaXYtPmNhcmRfODE4NSl7CisJCXByaXYtPmllZWU4MDIxMS0+bW9kdWxhdGlvbiB8PSBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OOworCQlwcml2LT5pZWVlODAyMTEtPnNob3J0X3Nsb3QgPSAxOworCX0KKwkvKiB5b3Ugc2hvdWxkIG5vdCBmb3VuZCBhbnkgODE4NSBWZXIgQiBDYXJkICovCisJcHJpdi0+Y2FyZF84MTg1X0J2ZXJzaW9uID0gMDsKKworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKwkvLyBqdXN0IGZvciBzeW5jIDg1CisJcHJpdi0+Y2FyZF90eXBlID0gUENJOworICAgICAgICBETUVTRygiVGhpcyBpcyBhIFBDSSBOSUMiKTsKKyNlbHNlCisJY29uZmlnMyA9IHJlYWRfbmljX2J5dGUoZGV2LCBDT05GSUczKTsKKwlpZihjb25maWczICYgMHg4KXsKKwkJcHJpdi0+Y2FyZF90eXBlID0gQ0FSREJVUzsKKwkJRE1FU0coIlRoaXMgaXMgYSBDQVJEQlVTIE5JQyIpOworCX0KKwllbHNlIGlmKCBjb25maWczICYgMHg0KXsKKwkJcHJpdi0+Y2FyZF90eXBlID0gTUlOSVBDSTsKKwkJRE1FU0coIlRoaXMgaXMgYSBNSU5JLVBDSSBOSUMiKTsKKwl9ZWxzZXsKKwkJcHJpdi0+Y2FyZF90eXBlID0gUENJOworCQlETUVTRygiVGhpcyBpcyBhIFBDSSBOSUMiKTsKKwl9CisjZW5kaWYKKyNlbmRpZgorCXByaXYtPmVuYWJsZV9ncGlvMCA9IDA7CisKKy8vYnkgYW15IGZvciBhbnRlbm5hCisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisJdXNWYWx1ZSA9IGVwcm9tX3JlYWQoZGV2LCBFRVBST01fU1dfUkVWRF9PRkZTRVQpOworCURNRVNHKCJ1c1ZhbHVlIGlzIDB4JXhcbiIsdXNWYWx1ZSk7CisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUworCS8vM1JlYWQgQW50ZW5uYURpdmVyc2l0eQorCS8vIFNXIEFudGVubmEgRGl2ZXJzaXR5LgorCWlmKAkodXNWYWx1ZSAmIEVFUFJPTV9TV19BRF9NQVNLKSAhPSBFRVBST01fU1dfQURfRU5BQkxFICkKKwl7CisJCXByaXYtPkVFUFJPTVN3QW50ZW5uYURpdmVyc2l0eSA9IGZhbHNlOworCQkvL3ByaW50aygiRUVQUk9NIERpc2FibGUgU1cgQW50ZW5uYSBEaXZlcnNpdHlcbiIpOworCX0KKwllbHNlCisJeworCQlwcml2LT5FRVBST01Td0FudGVubmFEaXZlcnNpdHkgPSB0cnVlOworCQkvL3ByaW50aygiRUVQUk9NIEVuYWJsZSBTVyBBbnRlbm5hIERpdmVyc2l0eVxuIik7CisJfQorCS8vIERlZmF1bHQgQW50ZW5uYSB0byB1c2UuCisJaWYoICh1c1ZhbHVlICYgRUVQUk9NX0RFRl9BTlRfTUFTSykgIT0gRUVQUk9NX0RFRl9BTlRfMSApCisJeworCQlwcml2LT5FRVBST01EZWZhdWx0QW50ZW5uYTEgPSBmYWxzZTsKKwkJLy9wcmludGsoIkVFUFJPTSBEZWZhdWx0IEFudGVubmEgMFxuIik7CisJfQorCWVsc2UKKwl7CisJCXByaXYtPkVFUFJPTURlZmF1bHRBbnRlbm5hMSA9IHRydWU7CisJCS8vcHJpbnRrKCJFRVBST00gRGVmYXVsdCBBbnRlbm5hIDFcbiIpOworCX0KKworCS8vCisJLy8gQW50ZW5uYSBkaXZlcnNpdHkgbWVjaGFuaXNtLiBBZGRlZCBieSBSb2dlciwgMjAwNy4xMS4wNS4KKwkvLworCWlmKCBwcml2LT5SZWdTd0FudGVubmFEaXZlcnNpdHlNZWNoYW5pc20gPT0gMCApIC8vIEF1dG8KKwl7Ly8gMDogZGVmYXVsdCBmcm9tIEVFUFJPTS4KKwkJcHJpdi0+YlN3QW50ZW5uYURpdmVyaXR5ID0gcHJpdi0+RUVQUk9NU3dBbnRlbm5hRGl2ZXJzaXR5OworCX0KKwllbHNlCisJey8vIDE6ZGlzYWJsZSBhbnRlbm5hIGRpdmVyc2l0eSwgMjogZW5hYmxlIGFudGVubmEgZGl2ZXJzaXR5LgorCQlwcml2LT5iU3dBbnRlbm5hRGl2ZXJpdHkgPSAoKHByaXYtPlJlZ1N3QW50ZW5uYURpdmVyc2l0eU1lY2hhbmlzbSA9PSAxKT8gZmFsc2UgOiB0cnVlKTsKKwl9CisJLy9wcmludGsoImJTd0FudGVubmFEaXZlcml0eSA9ICVkXG4iLCBwcml2LT5iU3dBbnRlbm5hRGl2ZXJpdHkpOworCisKKwkvLworCS8vIERlZmF1bHQgYW50ZW5uYSBzZXR0aW5ncy4gQWRkZWQgYnkgUm9nZXIsIDIwMDcuMTEuMDUuCisJLy8KKwlpZiggcHJpdi0+UmVnRGVmYXVsdEFudGVubmEgPT0gMCkKKwl7Ly8gMDogZGVmYXVsdCBmcm9tIEVFUFJPTS4KKwkJcHJpdi0+YkRlZmF1bHRBbnRlbm5hMSA9IHByaXYtPkVFUFJPTURlZmF1bHRBbnRlbm5hMTsKKwl9CisJZWxzZQorCXsvLyAxOiBtYWluLCAyOiBhdXguCisJCXByaXYtPmJEZWZhdWx0QW50ZW5uYTEgPSAoKHByaXYtPlJlZ0RlZmF1bHRBbnRlbm5hPT0gMikgPyB0cnVlIDogZmFsc2UpOworCX0KKwkvL3ByaW50aygiYkRlZmF1bHRBbnRlbm5hMSA9ICVkXG4iLCBwcml2LT5iRGVmYXVsdEFudGVubmExKTsKKyNlbmRpZgorI2VuZGlmCisvL2J5IGFteSBmb3IgYW50ZW5uYQorCS8qIHJ0bDgxODUgY2FuIGNhbGMgcGxjcCBsZW4gaW4gSFcuKi8KKwlwcml2LT5od19wbGNwX2xlbiA9IDE7CisKKwlwcml2LT5wbGNwX3ByZWFtYmxlX21vZGUgPSAyOworCS8qdGhlIGVlcHJvbSB0eXBlIGlzIHN0b3JlZCBpbiBSQ1IgcmVnaXN0ZXIgYml0ICM2ICovCisJaWYgKFJDUl85MzU2U0VMICYgcmVhZF9uaWNfZHdvcmQoZGV2LCBSQ1IpKXsKKwkJcHJpdi0+ZXByb210eXBlPUVQUk9NXzkzYzU2OworCQkvL0RNRVNHKCJSZXBvcnRlZCBFRVBST00gY2hpcCBpcyBhIDkzYzU2ICgyS2JpdCkiKTsKKwl9ZWxzZXsKKwkJcHJpdi0+ZXByb210eXBlPUVQUk9NXzkzYzQ2OworCQkvL0RNRVNHKCJSZXBvcnRlZCBFRVBST00gY2hpcCBpcyBhIDkzYzQ2ICgxS2JpdCkiKTsKKwl9CisKKwlkZXYtPmdldF9zdGF0cyA9IHJ0bDgxODBfc3RhdHM7CisKKwlkZXYtPmRldl9hZGRyWzBdPWVwcm9tX3JlYWQoZGV2LE1BQ19BRFIpICYgMHhmZjsKKwlkZXYtPmRldl9hZGRyWzFdPShlcHJvbV9yZWFkKGRldixNQUNfQURSKSAmIDB4ZmYwMCk+Pjg7CisJZGV2LT5kZXZfYWRkclsyXT1lcHJvbV9yZWFkKGRldixNQUNfQURSKzEpICYgMHhmZjsKKwlkZXYtPmRldl9hZGRyWzNdPShlcHJvbV9yZWFkKGRldixNQUNfQURSKzEpICYgMHhmZjAwKT4+ODsKKwlkZXYtPmRldl9hZGRyWzRdPWVwcm9tX3JlYWQoZGV2LE1BQ19BRFIrMikgJiAweGZmOworCWRldi0+ZGV2X2FkZHJbNV09KGVwcm9tX3JlYWQoZGV2LE1BQ19BRFIrMikgJiAweGZmMDApPj44OworCS8vRE1FU0coIkNhcmQgTUFDIGFkZHJlc3MgaXMgIk1BQ19GTVQsIE1BQ19BUkcoZGV2LT5kZXZfYWRkcikpOworCisKKwlmb3IoaT0xLGo9MDsgaTwxNDsgaSs9MixqKyspeworCisJCXdvcmQgPSBlcHJvbV9yZWFkKGRldixFUFJPTV9UWFBXX0NIMV8yICsgaik7CisJCXByaXYtPmNodHhwd3JbaV09d29yZCAmIDB4ZmY7CisJCXByaXYtPmNodHhwd3JbaSsxXT0od29yZCAmIDB4ZmYwMCk+Pjg7CisjaWZkZWYgREVCVUdfRVBST00KKwkJRE1FU0coInR4IHdvcmQgJXg6JXgiLGosd29yZCk7CisJCURNRVNHKCJjaCAlZCBwd3IgJXgiLGkscHJpdi0+Y2h0eHB3cltpXSk7CisJCURNRVNHKCJjaCAlZCBwd3IgJXgiLGkrMSxwcml2LT5jaHR4cHdyW2krMV0pOworI2VuZGlmCisJfQorCWlmKHByaXYtPmNhcmRfODE4NSl7CisJCWZvcihpPTEsaj0wOyBpPDE0OyBpKz0yLGorKyl7CisKKwkJCXdvcmQgPSBlcHJvbV9yZWFkKGRldixFUFJPTV9UWFBXX09GRE1fQ0gxXzIgKyBqKTsKKwkJCXByaXYtPmNodHhwd3Jfb2ZkbVtpXT13b3JkICYgMHhmZjsKKwkJCXByaXYtPmNodHhwd3Jfb2ZkbVtpKzFdPSh3b3JkICYgMHhmZjAwKT4+ODsKKyNpZmRlZiBERUJVR19FUFJPTQorCQkJRE1FU0coIm9mZG0gdHggd29yZCAleDoleCIsaix3b3JkKTsKKwkJCURNRVNHKCJvZmRtIGNoICVkIHB3ciAleCIsaSxwcml2LT5jaHR4cHdyX29mZG1baV0pOworCQkJRE1FU0coIm9mZG0gY2ggJWQgcHdyICV4IixpKzEscHJpdi0+Y2h0eHB3cl9vZmRtW2krMV0pOworI2VuZGlmCisJCX0KKwl9CisvL3tieSBhbXkgMDgwMzEyCisJLy8zUmVhZCBjcnlzdGFsIGNhbGlidHJhdGlvbiBhbmQgdGhlcm1hbCBtZXRlciBpbmRpY2F0aW9uIG9uIDg3U0UuCisKKwkvLyBCeSBTRDMgU1kncyByZXF1ZXN0LiBBZGRlZCBieSBSb2dlciwgMjAwNy4xMi4xMS4KKworCXRtcHUxNiA9IGVwcm9tX3JlYWQoZGV2LCBFRVBST01fUlNWPj4xKTsKKworCS8vcHJpbnRrKCJSZWFkQWRhcHRlckluZm84MTg1KCk6IEVFUFJPTV9SU1YoJTA0eClcbiIsIHRtcHUxNik7CisKKwkJLy8gQ3J5c3RhbCBjYWxpYnJhdGlvbiBmb3IgWGluIGFuZCBYb3V0IHJlc3AuCisJCXByaXYtPlh0YWxDYWxfWG91dCA9IHRtcHUxNiAmIEVFUFJPTV9YVEFMX0NBTF9YT1VUX01BU0s7IC8vIDB+Ny41cEYKKwkJcHJpdi0+WHRhbENhbF9YaW4gPSAodG1wdTE2ICYgRUVQUk9NX1hUQUxfQ0FMX1hJTl9NQVNLKT4+NDsgLy8gMH43LjVwRgorCQlpZigodG1wdTE2ICYgRUVQUk9NX1hUQUxfQ0FMX0VOQUJMRSk+PjEyKQorCQkJcHJpdi0+Ylh0YWxDYWxpYnJhdGlvbiA9IHRydWU7CisKKwkJLy8gVGhlcm1hbCBtZXRlciByZWZlcmVuY2UgaW5kaWNhdGlvbi4KKwkJcHJpdi0+VGhlcm1hbE1ldGVyID0gICh1OCkoKHRtcHUxNiAmIEVFUFJPTV9USEVSTUFMX01FVEVSX01BU0spPj44KTsKKwkJaWYoKHRtcHUxNiAmIEVFUFJPTV9USEVSTUFMX01FVEVSX0VOQUJMRSk+PjEzKQorCQkJcHJpdi0+YlR4UG93ZXJUcmFjayA9IHRydWU7CisKKy8vYnkgYW15IDA4MDMxMn0KKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKwl3b3JkID0gZXByb21fcmVhZChkZXYsRVBST01fVFhQV19CQVNFKTsKKwlwcml2LT5jY2tfdHhwd3JfYmFzZSA9IHdvcmQgJiAweGY7CisJcHJpdi0+b2ZkbV90eHB3cl9iYXNlID0gKHdvcmQ+PjQpICYgMHhmOworI2VuZGlmCisKKwl2ZXJzaW9uID0gZXByb21fcmVhZChkZXYsRVBST01fVkVSU0lPTik7CisJRE1FU0coIkVFUFJPTSB2ZXJzaW9uICV4Iix2ZXJzaW9uKTsKKwlpZiggKCFwcml2LT5jYXJkXzgxODUpICYmIHZlcnNpb24gPCAweDAxMDEpeworCQlETUVTRyAoIkVFUFJPTSB2ZXJzaW9uIHRvbyBvbGQsIGFzc3VtaW5nIGRlZmF1bHRzIik7CisJCURNRVNHICgiSWYgeW91IHNlZSB0aGlzIG1lc3NhZ2UgKnBsYXNlKiBzZW5kIHlvdXIgXAorRE1FU0cgb3V0cHV0IHRvIGFuZHJlYW1ybEB0aXNjYWxpLml0IFRIQU5LUyIpOworCQlwcml2LT5kaWdwaHk9MTsKKwkJcHJpdi0+YW50Yj0wOworCQlwcml2LT5kaXZlcnNpdHk9MTsKKwkJcHJpdi0+Y3NfdHJlc2hvbGQ9MHhjOworCQlwcml2LT5yY3JfY3NlbnNlPTE7CisJCXByaXYtPnJmX2NoaXA9UkZDSElQSURfUEhJTElQUzsKKwl9ZWxzZXsKKwkJaWYoIXByaXYtPmNhcmRfODE4NSl7CisJCQl1OCByZnBhcmFtID0gZXByb21fcmVhZChkZXYsUkZfUEFSQU0pOworCQkJRE1FU0coIlJmUGFyYW06ICV4IixyZnBhcmFtKTsKKworCQkJcHJpdi0+ZGlncGh5ID0gcmZwYXJhbSAmICgxPDxSRl9QQVJBTV9ESUdQSFlfU0hJRlQpID8gMDoxOworCQkJcHJpdi0+YW50YiA9ICByZnBhcmFtICYgKDE8PFJGX1BBUkFNX0FOVEJERUZBVUxUX1NISUZUKSA/IDE6MDsKKworCQkJcHJpdi0+cmNyX2NzZW5zZSA9IChyZnBhcmFtICYgUkZfUEFSQU1fQ0FSUklFUlNFTlNFX01BU0spID4+CisJCQkJCVJGX1BBUkFNX0NBUlJJRVJTRU5TRV9TSElGVDsKKworCQkJcHJpdi0+ZGl2ZXJzaXR5ID0KKwkJCQkocmVhZF9uaWNfYnl0ZShkZXYsQ09ORklHMikmKDE8PENPTkZJRzJfQU5URU5OQV9TSElGVCkpID8gMTowOworCQl9ZWxzZXsKKwkJCXByaXYtPnJjcl9jc2Vuc2UgPSAzOworCQl9CisKKwkJcHJpdi0+Y3NfdHJlc2hvbGQgPSAoZXByb21fcmVhZChkZXYsRU5FUkdZX1RSRVNIT0xEKSYweGZmMDApID4+ODsKKworCQlwcml2LT5yZl9jaGlwID0gMHhmZiAmIGVwcm9tX3JlYWQoZGV2LFJGQ0hJUElEKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisJcHJpdi0+cmZfY2hpcCA9IFJGX1pFQlJBNDsKKwlwcml2LT5yZl9zbGVlcCA9IHJ0bDgyMjV6NF9yZl9zbGVlcDsKKwlwcml2LT5yZl93YWtldXAgPSBydGw4MjI1ejRfcmZfd2FrZXVwOworI2Vsc2UKKyAgICAgICAgcHJpdi0+cmZfY2hpcCA9IFJGX1pFQlJBMjsKKyNlbmRpZgorCS8vRE1FU0coIkNhcmQgcmVwb3J0cyBSRiBmcm9udGVuZCBSZWFsdGVrIDgyMjV6MiIpOworCS8vRE1FU0dXKCJUaGlzIGRyaXZlciBoYXMgRVhQRVJJTUVOVEFMIHN1cHBvcnQgZm9yIHRoaXMgY2hpcHNldC4iKTsKKwkvL0RNRVNHVygidXNlIGl0IHdpdGggY2FyZSBhbmQgYXQgeW91ciBvd24gcmlzayBhbmQiKTsKKwlETUVTR1coIioqUExFQVNFKiogUkVQT1JUIFNVQ0NFU1NGVUwvVU5TVUNDRVNTRlVMIFRPIFJlYWx0ZWshIik7CisKKwlwcml2LT5yZl9jbG9zZSA9IHJ0bDgyMjV6Ml9yZl9jbG9zZTsKKwlwcml2LT5yZl9pbml0ID0gcnRsODIyNXoyX3JmX2luaXQ7CisJcHJpdi0+cmZfc2V0X2NoYW4gPSBydGw4MjI1ejJfcmZfc2V0X2NoYW47CisJcHJpdi0+cmZfc2V0X3NlbnMgPSBOVUxMOworCS8vcHJpdi0+cmZfc2xlZXAgPSBydGw4MjI1X3JmX3NsZWVwOworCS8vcHJpdi0+cmZfd2FrZXVwID0gcnRsODIyNV9yZl93YWtldXA7CisKKyNlbHNlCisJLyogY2hlY2sgUkYgZnJvbnRlbmQgY2hpcHNldCAqLworCXN3aXRjaCAocHJpdi0+cmZfY2hpcCkgeworCisJCWNhc2UgUkZDSElQSURfUlRMODIyNToKKworCQlpZihwcml2LT5jYXJkXzgxODUpeworCQkJRE1FU0coIkNhcmQgcmVwb3J0cyBSRiBmcm9udGVuZCBSZWFsdGVrIDgyMjUiKTsKKwkJCURNRVNHVygiVGhpcyBkcml2ZXIgaGFzIEVYUEVSSU1FTlRBTCBzdXBwb3J0IGZvciB0aGlzIGNoaXBzZXQuIik7CisJCQlETUVTR1coInVzZSBpdCB3aXRoIGNhcmUgYW5kIGF0IHlvdXIgb3duIHJpc2sgYW5kIik7CisJCQlETUVTR1coIioqUExFQVNFKiogUkVQT1JUIFNVQ0NFU1MvSU5TVUNDRVNTIFRPIGFuZHJlYW1ybEB0aXNjYWxpLml0Iik7CisKKwkJCXByaXYtPnJmX2Nsb3NlID0gcnRsODIyNV9yZl9jbG9zZTsKKwkJCXByaXYtPnJmX2luaXQgPSBydGw4MjI1X3JmX2luaXQ7CisJCQlwcml2LT5yZl9zZXRfY2hhbiA9IHJ0bDgyMjVfcmZfc2V0X2NoYW47CisJCQlwcml2LT5yZl9zZXRfc2VucyA9IE5VTEw7CisJCQlwcml2LT5yZl9zbGVlcCA9IHJ0bDgyMjVfcmZfc2xlZXA7CisJCQlwcml2LT5yZl93YWtldXAgPSBydGw4MjI1X3JmX3dha2V1cDsKKworCQl9ZWxzZXsKKwkJCURNRVNHVygiRGV0ZWN0ZWQgUlRMODIyNSByYWRpbyBvbiBhIGNhcmQgcmVjb2duaXplZCBhcyBSVEw4MTgwIik7CisJCQlETUVTR1coIlRoaXMgY291bGQgbm90IGJlLi4uIHNvbWV0aGluZyB3ZW50IHdyb25nLi4uLiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUkZDSElQSURfUlRMODI1NToKKwkJaWYocHJpdi0+Y2FyZF84MTg1KXsKKwkJCURNRVNHKCJDYXJkIHJlcG9ydHMgUkYgZnJvbnRlbmQgUmVhbHRlayA4MjU1Iik7CisJCQlETUVTR1coIlRoaXMgZHJpdmVyIGhhcyBFWFBFUklNRU5UQUwgc3VwcG9ydCBmb3IgdGhpcyBjaGlwc2V0LiIpOworCQkJRE1FU0dXKCJ1c2UgaXQgd2l0aCBjYXJlIGFuZCBhdCB5b3VyIG93biByaXNrIGFuZCIpOworCQkJRE1FU0dXKCIqKlBMRUFTRSoqIFJFUE9SVCBTVUNDRVNTL0lOU1VDQ0VTUyBUTyBhbmRyZWFtcmxAdGlzY2FsaS5pdCIpOworCisJCQlwcml2LT5yZl9jbG9zZSA9IHJ0bDgyNTVfcmZfY2xvc2U7CisJCQlwcml2LT5yZl9pbml0ID0gcnRsODI1NV9yZl9pbml0OworCQkJcHJpdi0+cmZfc2V0X2NoYW4gPSBydGw4MjU1X3JmX3NldF9jaGFuOworCQkJcHJpdi0+cmZfc2V0X3NlbnMgPSBOVUxMOworCQkJcHJpdi0+cmZfc2xlZXAgPSBOVUxMOworCQkJcHJpdi0+cmZfd2FrZXVwID0gTlVMTDsKKworCQl9ZWxzZXsKKwkJCURNRVNHVygiRGV0ZWN0ZWQgUlRMODI1NSByYWRpbyBvbiBhIGNhcmQgcmVjb2duaXplZCBhcyBSVEw4MTgwIik7CisJCQlETUVTR1coIlRoaXMgY291bGQgbm90IGJlLi4uIHNvbWV0aGluZyB3ZW50IHdyb25nLi4uLiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJCWJyZWFrOworCisKKwkJY2FzZSBSRkNISVBJRF9JTlRFUlNJTDoKKwkJCURNRVNHVygiQ2FyZCByZXBvcnRzIFJGIGZyb250ZW5kIGJ5IEludGVyc2lsLiIpOworCQkJRE1FU0dXKCJUaGlzIGRyaXZlciBoYXMgTk8gc3VwcG9ydCBmb3IgdGhpcyBjaGlwc2V0LiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCQlicmVhazsKKworCQljYXNlIFJGQ0hJUElEX1JGTUQ6CisJCQlETUVTR1coIkNhcmQgcmVwb3J0cyBSRiBmcm9udGVuZCBieSBSRk1ELiIpOworCQkJRE1FU0dXKCJUaGlzIGRyaXZlciBoYXMgTk8gc3VwcG9ydCBmb3IgdGhpcyBjaGlwc2V0LiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCQlicmVhazsKKworCQljYXNlIFJGQ0hJUElEX0dDVDoKKwkJCURNRVNHVygiQ2FyZCByZXBvcnRzIFJGIGZyb250ZW5kIGJ5IEdDVC4iKTsKKwkJCURNRVNHVygiVGhpcyBkcml2ZXIgaGFzIEVYUEVSSU1FTlRBTCBzdXBwb3J0IGZvciB0aGlzIGNoaXBzZXQuIik7CisJCQlETUVTR1coInVzZSBpdCB3aXRoIGNhcmUgYW5kIGF0IHlvdXIgb3duIHJpc2sgYW5kIik7CisJCQlETUVTR1coIioqUExFQVNFKiogUkVQT1JUIFNVQ0NFU1MvSU5TVUNDRVNTIFRPIGFuZHJlYW1ybEB0aXNjYWxpLml0Iik7CisJCQlwcml2LT5yZl9jbG9zZSA9IGdjdF9yZl9jbG9zZTsKKwkJCXByaXYtPnJmX2luaXQgPSBnY3RfcmZfaW5pdDsKKwkJCXByaXYtPnJmX3NldF9jaGFuID0gZ2N0X3JmX3NldF9jaGFuOworCQkJcHJpdi0+cmZfc2V0X3NlbnMgPSBOVUxMOworCQkJcHJpdi0+cmZfc2xlZXAgPSBOVUxMOworCQkJcHJpdi0+cmZfd2FrZXVwID0gTlVMTDsKKwkJCWJyZWFrOworCisJCWNhc2UgUkZDSElQSURfTUFYSU06CisJCQlETUVTR1coIkNhcmQgcmVwb3J0cyBSRiBmcm9udGVuZCBieSBNQVhJTS4iKTsKKwkJCURNRVNHVygiVGhpcyBkcml2ZXIgaGFzIEVYUEVSSU1FTlRBTCBzdXBwb3J0IGZvciB0aGlzIGNoaXBzZXQuIik7CisJCQlETUVTR1coInVzZSBpdCB3aXRoIGNhcmUgYW5kIGF0IHlvdXIgb3duIHJpc2sgYW5kIik7CisJCQlETUVTR1coIioqUExFQVNFKiogUkVQT1JUIFNVQ0NFU1MvSU5TVUNDRVNTIFRPIGFuZHJlYW1ybEB0aXNjYWxpLml0Iik7CisJCQlwcml2LT5yZl9jbG9zZSA9IG1heGltX3JmX2Nsb3NlOworCQkJcHJpdi0+cmZfaW5pdCA9IG1heGltX3JmX2luaXQ7CisJCQlwcml2LT5yZl9zZXRfY2hhbiA9IG1heGltX3JmX3NldF9jaGFuOworCQkJcHJpdi0+cmZfc2V0X3NlbnMgPSBOVUxMOworCQkJcHJpdi0+cmZfc2xlZXAgPSBOVUxMOworCQkJcHJpdi0+cmZfd2FrZXVwID0gTlVMTDsKKwkJCWJyZWFrOworCisJCWNhc2UgUkZDSElQSURfUEhJTElQUzoKKwkJCURNRVNHKCJDYXJkIHJlcG9ydHMgUkYgZnJvbnRlbmQgYnkgUGhpbGlwcy4iKTsKKwkJCURNRVNHKCJPSyEgUGhpbGlwcyBTQTI0MDAgcmFkaW8gY2hpcHNldCBpcyBzdXBwb3J0ZWQuIik7CisJCQlwcml2LT5yZl9jbG9zZSA9IHNhMjQwMF9yZl9jbG9zZTsKKwkJCXByaXYtPnJmX2luaXQgPSBzYTI0MDBfcmZfaW5pdDsKKwkJCXByaXYtPnJmX3NldF9jaGFuID0gc2EyNDAwX3JmX3NldF9jaGFuOworCQkJcHJpdi0+cmZfc2V0X3NlbnMgPSBzYTI0MDBfcmZfc2V0X3NlbnM7CisJCQlwcml2LT5zZW5zID0gU0EyNDAwX1JGX0RFRl9TRU5TOyAvKiBkZWZhdWx0IHNlbnNpdGl2aXR5ICovCisJCQlwcml2LT5tYXhfc2VucyA9IFNBMjQwMF9SRl9NQVhfU0VOUzsgLyogbWF4aW11bSBzZW5zaXRpdml0eSAqLworCQkJcHJpdi0+cmZfc2xlZXAgPSBOVUxMOworCQkJcHJpdi0+cmZfd2FrZXVwID0gTlVMTDsKKworCQkJaWYocHJpdi0+ZGlncGh5KXsKKwkJCQlETUVTR1coIkRpZ2l0YWwgUEhZIGZvdW5kIik7CisJCQkJRE1FU0dXKCJQaGlsaXBzIERJR0lUQUwgUEhZIGlzIHVudGVzdGVkISAqUGxlYXNlKlwKKwlyZXBvcnQgc3VjY2Vzcy9mYWlsdXJlIHRvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4iKTsKKwkJCX1lbHNleworCQkJCURNRVNHICgiQW5hbG9nIFBIWSBmb3VuZCIpOworCQkJfQorCisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJRE1FU0dXKCJVbmtub3duIFJGIG1vZHVsZSAleCIscHJpdi0+cmZfY2hpcCk7CisJCQlETUVTR1coIkV4aXRpbmcuLi4iKTsKKwkJCXJldHVybiAtMTsKKworCX0KKyNlbmRpZgorCisKKwlpZighcHJpdi0+Y2FyZF84MTg1KXsKKwkJaWYocHJpdi0+YW50YikKKwkJCURNRVNHICgiQW50ZW5uYSBCIGlzIGRlZmF1bHQgYW50ZW5uYSIpOworCQllbHNlCisJCQlETUVTRyAoIkFudGVubmEgQSBpcyBkZWZhdWx0IGFudGVubmEiKTsKKworCQlpZihwcml2LT5kaXZlcnNpdHkpCisJCQlETUVTRyAoIkFudGVubmEgZGl2ZXJzaXR5IGlzIGVuYWJsZWQiKTsKKwkJZWxzZQorCQkJRE1FU0coIkFudGVubmEgZGl2ZXJzaXR5IGlzIGRpc2FibGVkIik7CisKKwkJRE1FU0coIkNhcnJpZXIgc2Vuc2UgJWQiLHByaXYtPnJjcl9jc2Vuc2UpOworCX0KKworCWlmICgwIT1hbGxvY19yeF9kZXNjX3JpbmcoZGV2LCBwcml2LT5yeGJ1ZmZlcnNpemUsIHByaXYtPnJ4cmluZ2NvdW50KSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoMCE9YWxsb2NfdHhfZGVzY19yaW5nKGRldiwgcHJpdi0+dHhidWZmc2l6ZSwgcHJpdi0+dHhyaW5nY291bnQsCisJCQkJICBUWF9NQU5BR0VQUklPUklUWV9SSU5HX0FERFIpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICgwIT1hbGxvY190eF9kZXNjX3JpbmcoZGV2LCBwcml2LT50eGJ1ZmZzaXplLCBwcml2LT50eHJpbmdjb3VudCwKKwkJCQkgVFhfQktQUklPUklUWV9SSU5HX0FERFIpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICgwIT1hbGxvY190eF9kZXNjX3JpbmcoZGV2LCBwcml2LT50eGJ1ZmZzaXplLCBwcml2LT50eHJpbmdjb3VudCwKKwkJCQkgVFhfQkVQUklPUklUWV9SSU5HX0FERFIpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICgwIT1hbGxvY190eF9kZXNjX3JpbmcoZGV2LCBwcml2LT50eGJ1ZmZzaXplLCBwcml2LT50eHJpbmdjb3VudCwKKwkJCQkgIFRYX1ZJUFJJT1JJVFlfUklOR19BRERSKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoMCE9YWxsb2NfdHhfZGVzY19yaW5nKGRldiwgcHJpdi0+dHhidWZmc2l6ZSwgcHJpdi0+dHhyaW5nY291bnQsCisJCQkJICBUWF9WT1BSSU9SSVRZX1JJTkdfQUREUikpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKDAhPWFsbG9jX3R4X2Rlc2NfcmluZyhkZXYsIHByaXYtPnR4YnVmZnNpemUsIHByaXYtPnR4cmluZ2NvdW50LAorCQkJCSAgVFhfSElHSFBSSU9SSVRZX1JJTkdfQUREUikpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKDAhPWFsbG9jX3R4X2Rlc2NfcmluZyhkZXYsIHByaXYtPnR4YnVmZnNpemUsIHByaXYtPnR4YmVhY29uY291bnQsCisJCQkJICBUWF9CRUFDT05fUklOR19BRERSKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKworCS8vcHJpdi0+YmVhY29uX2J1Zj1OVUxMOworCisJaWYoIXByaXYtPmNhcmRfODE4NSl7CisKKwkJaWYocmVhZF9uaWNfYnl0ZShkZXYsIENPTkZJRzApICYgKDE8PENPTkZJRzBfV0VQNDBfU0hJRlQpKQorCQkJRE1FU0cgKCI0MC1iaXQgV0VQIGlzIHN1cHBvcnRlZCBpbiBoYXJkd2FyZSIpOworCQllbHNlCisJCQlETUVTRyAoIjQwLWJpdCBXRVAgaXMgTk9UIHN1cHBvcnRlZCBpbiBoYXJkd2FyZSIpOworCisJCWlmKHJlYWRfbmljX2J5dGUoZGV2LENPTkZJRzApICYgKDE8PENPTkZJRzBfV0VQMTA0X1NISUZUKSkKKwkJCURNRVNHICgiMTA0LWJpdCBXRVAgaXMgc3VwcG9ydGVkIGluIGhhcmR3YXJlIik7CisJCWVsc2UKKwkJCURNRVNHICgiMTA0LWJpdCBXRVAgaXMgTk9UIHN1cHBvcnRlZCBpbiBoYXJkd2FyZSIpOworCX0KKyNpZiAhZGVmaW5lZChTQV9TSElSUSkKKyAgICAgICAgaWYocmVxdWVzdF9pcnEoZGV2LT5pcnEsICh2b2lkICopcnRsODE4MF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELCBkZXYtPm5hbWUsIGRldikpeworI2Vsc2UKKyAgICAgICAgaWYocmVxdWVzdF9pcnEoZGV2LT5pcnEsICh2b2lkICopcnRsODE4MF9pbnRlcnJ1cHQsIFNBX1NISVJRLCBkZXYtPm5hbWUsIGRldikpeworI2VuZGlmCisgICAgICAgICAgICAgICAgRE1FU0dFKCJFcnJvciBhbGxvY2F0aW5nIElSUSAlZCIsZGV2LT5pcnEpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKwl9ZWxzZXsKKwkJcHJpdi0+aXJxPWRldi0+aXJxOworCQlETUVTRygiSVJRICVkIixkZXYtPmlycSk7CisJfQorCisjaWZkZWYgREVCVUdfRVBST00KKwlkdW1wX2Vwcm9tKGRldik7CisjZW5kaWYKKworCXJldHVybiAwOworCit9CisKKwordm9pZCBydGw4MTgwX25vX2h3X3dlcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWlmKCFwcml2LT5jYXJkXzgxODUpCisJeworCQl1OCBzZWN1cml0eTsKKworCQlzZWN1cml0eSAgPSByZWFkX25pY19ieXRlKGRldiwgU0VDVVJJVFkpOworCQlzZWN1cml0eSAmPX4oMTw8U0VDVVJJVFlfV0VQX1RYX0VOQUJMRV9TSElGVCk7CisJCXNlY3VyaXR5ICY9figxPDxTRUNVUklUWV9XRVBfUlhfRU5BQkxFX1NISUZUKTsKKworCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFNFQ1VSSVRZLCBzZWN1cml0eSk7CisKKwl9ZWxzZXsKKworCQkvL0ZJWE1FISEhCisJfQorCS8qCisJICB3cml0ZV9uaWNfZHdvcmQoZGV2LFRYX0NPTkYscmVhZF9uaWNfZHdvcmQoZGV2LFRYX0NPTkYpIHwKKwkgICgxPDxUWF9OT0lDVl9TSElGVCkgKTsKKwkqLworLy8JcHJpdi0+aWVlZTgwMjExLT5od193ZXA9MDsKK30KKworCit2b2lkIHJ0bDgxODBfc2V0X2h3X3dlcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1OCBwZ3JlZzsKKwl1OCBzZWN1cml0eTsKKwl1MzIga2V5MF93b3JkNDsKKworCXBncmVnPXJlYWRfbmljX2J5dGUoZGV2LCBQR1NFTEVDVCk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBQR1NFTEVDVCwgcGdyZWcgJn4gKDE8PFBHU0VMRUNUX1BHX1NISUZUKSk7CisKKwlrZXkwX3dvcmQ0ID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBLRVkwKzQrNCs0KTsKKwlrZXkwX3dvcmQ0ICY9IH4gMHhmZjsKKwlrZXkwX3dvcmQ0IHw9IHByaXYtPmtleTBbM10mIDB4ZmY7CisJd3JpdGVfbmljX2R3b3JkKGRldixLRVkwLChwcml2LT5rZXkwWzBdKSk7CisJd3JpdGVfbmljX2R3b3JkKGRldixLRVkwKzQsKHByaXYtPmtleTBbMV0pKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LEtFWTArNCs0LChwcml2LT5rZXkwWzJdKSk7CisJd3JpdGVfbmljX2R3b3JkKGRldixLRVkwKzQrNCs0LChrZXkwX3dvcmQ0KSk7CisKKwkvKgorCSAgVFhfQ09ORixyZWFkX25pY19kd29yZChkZXYsVFhfQ09ORikgJn4oMTw8VFhfTk9JQ1ZfU0hJRlQpKTsKKwkqLworCisJc2VjdXJpdHkgID0gcmVhZF9uaWNfYnl0ZShkZXYsU0VDVVJJVFkpOworCXNlY3VyaXR5IHw9ICgxPDxTRUNVUklUWV9XRVBfVFhfRU5BQkxFX1NISUZUKTsKKwlzZWN1cml0eSB8PSAoMTw8U0VDVVJJVFlfV0VQX1JYX0VOQUJMRV9TSElGVCk7CisJc2VjdXJpdHkgJj0gfiBTRUNVUklUWV9FTkNSWVBfTUFTSzsKKwlzZWN1cml0eSB8PSAoU0VDVVJJVFlfRU5DUllQXzEwNDw8U0VDVVJJVFlfRU5DUllQX1NISUZUKTsKKworCXdyaXRlX25pY19ieXRlKGRldiwgU0VDVVJJVFksIHNlY3VyaXR5KTsKKworCURNRVNHKCJrZXkgJXggJXggJXggJXgiLHJlYWRfbmljX2R3b3JkKGRldixLRVkwKzQrNCs0KSwKKwkgICAgICByZWFkX25pY19kd29yZChkZXYsS0VZMCs0KzQpLHJlYWRfbmljX2R3b3JkKGRldixLRVkwKzQpLAorCSAgICAgIHJlYWRfbmljX2R3b3JkKGRldixLRVkwKSk7CisKKwkvL3ByaXYtPmllZWU4MDIxMS0+aHdfd2VwPTE7Cit9CisKKwordm9pZCBydGw4MTg1X3JmX3BpbnNfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisvLwl1MTYgdG1wOworLy8JdG1wID0gcmVhZF9uaWNfd29yZChkZXYsIFJGUGluc0VuYWJsZSk7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNFbmFibGUsIDB4MWZmZik7Ly8gfCB0bXApOworLy8Jd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNFbmFibGUsNyB8IHRtcCk7Cit9CisKKwordm9pZCBydGw4MTg1X3NldF9hbmFwYXJhbTIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGEpCit7CisJdTggY29uZjM7CisKKwlydGw4MTgwX3NldF9tb2RlKGRldiwgRVBST01fQ01EX0NPTkZJRyk7CisKKwljb25mMyA9IHJlYWRfbmljX2J5dGUoZGV2LCBDT05GSUczKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENPTkZJRzMsIGNvbmYzIHwgKDE8PENPTkZJRzNfQU5BUEFSQU1fV19TSElGVCkpOworCXdyaXRlX25pY19kd29yZChkZXYsIEFOQVBBUkFNMiwgYSk7CisKKwljb25mMyA9IHJlYWRfbmljX2J5dGUoZGV2LCBDT05GSUczKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENPTkZJRzMsIGNvbmYzICZ+KDE8PENPTkZJRzNfQU5BUEFSQU1fV19TSElGVCkpOworCXJ0bDgxODBfc2V0X21vZGUoZGV2LCBFUFJPTV9DTURfTk9STUFMKTsKKworfQorCisKK3ZvaWQgcnRsODE4MF9zZXRfYW5hcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGEpCit7CisJdTggY29uZjM7CisKKwlydGw4MTgwX3NldF9tb2RlKGRldiwgRVBST01fQ01EX0NPTkZJRyk7CisKKwljb25mMyA9IHJlYWRfbmljX2J5dGUoZGV2LCBDT05GSUczKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENPTkZJRzMsIGNvbmYzIHwgKDE8PENPTkZJRzNfQU5BUEFSQU1fV19TSElGVCkpOworCXdyaXRlX25pY19kd29yZChkZXYsIEFOQVBBUkFNLCBhKTsKKworCWNvbmYzID0gcmVhZF9uaWNfYnl0ZShkZXYsIENPTkZJRzMpOworCXdyaXRlX25pY19ieXRlKGRldiwgQ09ORklHMywgY29uZjMgJn4oMTw8Q09ORklHM19BTkFQQVJBTV9XX1NISUZUKSk7CisJcnRsODE4MF9zZXRfbW9kZShkZXYsIEVQUk9NX0NNRF9OT1JNQUwpOworfQorCisKK3ZvaWQgcnRsODE4NV90eF9hbnRlbm5hKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFudCkKK3sKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFRYX0FOVEVOTkEsIGFudCk7CisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwltZGVsYXkoMSk7Cit9CisKKwordm9pZCBydGw4MTg1X3dyaXRlX3BoeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZHIsIHUzMiBkYXRhKQoreworCS8vdTggcGh5cjsKKwl1MzIgcGh5dzsKKwkvL2ludCBpOworCisJYWRyIHw9IDB4ODA7CisKKwlwaHl3PSAoKGRhdGE8PDgpIHwgYWRyKTsKKyNpZiAwCisKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQSFlfQURSLCBwaHl3KTsKKworCS8vcmVhZF9uaWNfZHdvcmQoZGV2LCBQSFlfQURSKTsKKwlmb3IoaT0wO2k8MTA7aSsrKXsKKwkJd3JpdGVfbmljX2R3b3JkKGRldiwgUEhZX0FEUiwgMHhmZmZmZmY3ZiAmIHBoeXcpOworCQlwaHlyID0gcmVhZF9uaWNfYnl0ZShkZXYsIFBIWV9SRUFEKTsKKwkJaWYocGh5ciA9PSAoZGF0YSYweGZmKSkgYnJlYWs7CisKKwl9CisjZWxzZQorCS8vIE5vdGUgdGhhdCwgd2UgbXVzdCB3cml0ZSAweGZmN2MgYWZ0ZXIgMHg3ZC0weDdmIHRvIHdyaXRlIEJCIHJlZ2lzdGVyLgorCXdyaXRlX25pY19ieXRlKGRldiwgMHg3ZiwgKChwaHl3ICYgMHhmZjAwMDAwMCkgPj4gMjQpKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4N2UsICgocGh5dyAmIDB4MDBmZjAwMDApID4+IDE2KSk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCAweDdkLCAoKHBoeXcgJiAweDAwMDBmZjAwKSA+PiA4KSk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCAweDdjLCAoKHBoeXcgJiAweDAwMDAwMGZmKSApKTsKKyNlbmRpZgorCS8qIHRoaXMgaXMgb2sgdG8gZmFpbCB3aGVuIHdlIHdyaXRlIEFHQyB0YWJsZS4gY2hlY2sgZm9yIEFHQyB0YWJsZSBtaWdodCBiZQorCSAqIGRvbmUgYnkgbWFza2luZyB3aXRoIDB4N2YgaW5zdGVhZCBvZiAweGZmCisJICovCisJLy9pZihwaHlyICE9IChkYXRhJjB4ZmYpKSBETUVTR1coIlBoeSB3cml0ZSB0aW1lb3V0ICV4ICV4ICV4IiwgcGh5ciwgZGF0YSxhZHIpOworfQorCisKK2lubGluZSB2b2lkIHdyaXRlX3BoeV9vZmRtIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZHIsIHUzMiBkYXRhKQoreworCWRhdGEgPSBkYXRhICYgMHhmZjsKKwlydGw4MTg1X3dyaXRlX3BoeShkZXYsIGFkciwgZGF0YSk7Cit9CisKKwordm9pZCB3cml0ZV9waHlfY2NrIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZHIsIHUzMiBkYXRhKQoreworCWRhdGEgPSBkYXRhICYgMHhmZjsKKwlydGw4MTg1X3dyaXRlX3BoeShkZXYsIGFkciwgZGF0YSB8IDB4MTAwMDApOworfQorCisKKy8qIDcwKjMgPSAyMTAgbXMKKyAqIEkgaG9wZSB0aGlzIGlzIGVub3VndGgKKyAqLworI2RlZmluZSBNQVhfUEhZIDcwCit2b2lkIHdyaXRlX3BoeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZHIsIHU4IGRhdGEpCit7CisJdTMyIHBoeTsKKwlpbnQgaTsKKworCXBoeSA9IDB4ZmYwMDAwOworCXBoeSB8PSBhZHI7CisJcGh5IHw9IDB4ODA7IC8qIHRoaXMgc2hvdWxkIGVuYWJsZSB3cml0aW5nICovCisJcGh5IHw9IChkYXRhPDw4KTsKKworCS8vUEhZX0FEUiwgUEhZX1IgYW5kIFBIWV9XICBhcmUgY29udGlnIGFuZCB0cmVhdGVkIGFzIG9uZSBkd29yZAorCXdyaXRlX25pY19kd29yZChkZXYsUEhZX0FEUiwgcGh5KTsKKworCXBoeT0gMHhmZmZmMDA7CisJcGh5IHw9IGFkcjsKKworCXdyaXRlX25pY19kd29yZChkZXYsUEhZX0FEUiwgcGh5KTsKKwlmb3IoaT0wO2k8TUFYX1BIWTtpKyspeworCQlwaHk9cmVhZF9uaWNfZHdvcmQoZGV2LFBIWV9BRFIpOworCQlwaHk9IHBoeSAmIDB4ZmYwMDAwOworCQlwaHk9IHBoeSA+PiAxNjsKKwkJaWYocGh5ID09IGRhdGEpeyAvL1NVQ0NFU1MhCisJCQlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCQkJbWRlbGF5KDMpOyAvL3JhbmRvbSB2YWx1ZQorI2lmZGVmIERFQlVHX0JCCisJCQlETUVTRygiUGh5IHdyICV4LCV4IixhZHIsZGF0YSk7CisjZW5kaWYKKwkJCXJldHVybjsKKwkJfWVsc2V7CisJCQlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCQkJbWRlbGF5KDMpOyAvL3JhbmRvbSB2YWx1ZQorCQl9CisJfQorCURNRVNHVyAoIlBoeSB3cml0aW5nICV4ICV4IGZhaWxlZCEiLCBhZHIsZGF0YSk7Cit9CisKK3ZvaWQgcnRsODE4NV9zZXRfcmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCXUxNiB3b3JkOworCWludCBiYXNpY19yYXRlLG1pbl9ycl9yYXRlLG1heF9ycl9yYXRlOworCisvLwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwkvL2lmIChpZWVlODAyMTFfaXNfNTRnKHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrKSAmJgorLy8JCXByaXYtPmllZWU4MDIxMS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCl7CisJYmFzaWNfcmF0ZSA9IGllZWVyYXRlMnJ0bHJhdGUoMjQwKTsKKwltaW5fcnJfcmF0ZSA9IGllZWVyYXRlMnJ0bHJhdGUoNjApOworCW1heF9ycl9yYXRlID0gaWVlZXJhdGUycnRscmF0ZSgyNDApOworCisvLworLy8JfWVsc2V7CisvLwkJYmFzaWNfcmF0ZSA9IGllZWVyYXRlMnJ0bHJhdGUoMjApOworLy8JCW1pbl9ycl9yYXRlID0gaWVlZXJhdGUycnRscmF0ZSgxMCk7CisvLwkJbWF4X3JyX3JhdGUgPSBpZWVlcmF0ZTJydGxyYXRlKDExMCk7CisvLwl9CisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFJFU1BfUkFURSwKKwkJCW1heF9ycl9yYXRlPDxNQVhfUkVTUF9SQVRFX1NISUZUfCBtaW5fcnJfcmF0ZTw8TUlOX1JFU1BfUkFURV9TSElGVCk7CisKKwl3b3JkICA9IHJlYWRfbmljX3dvcmQoZGV2LCBCUlNSKTsKKwl3b3JkICY9IH5CUlNSX01CUl84MTg1OworCisKKwlmb3IoaT0wO2k8PWJhc2ljX3JhdGU7aSsrKQorCQl3b3JkIHw9ICgxPDxpKTsKKworCXdyaXRlX25pY193b3JkKGRldiwgQlJTUiwgd29yZCk7CisJLy9ETUVTRygiUlI6JXggQlJTUjogJXgiLCByZWFkX25pY19ieXRlKGRldixSRVNQX1JBVEUpLHJlYWRfbmljX3dvcmQoZGV2LEJSU1IpKTsKK30KKworCisKK3ZvaWQgcnRsODE4MF9hZGFwdGVyX3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIgYW5hcGFyYW07CisJdTE2IHdvcmQ7CisJdTggY29uZmlnMzsKKy8vCWludCBpOworCisJcnRsODE4MF9ydHhfZGlzYWJsZShkZXYpOworCXJ0bDgxODBfcmVzZXQoZGV2KTsKKworCS8qIHNlZW1zIHRoYXQgMHhmZmZmIG9yIDB4YWZmZiB3aWxsIGNhdXNlCisJICogSFcgaW50ZXJydXB0IGxpbmUgY3Jhc2gKKwkgKi8KKworCS8vcHJpdi0+aXJxX21hc2sgPSAweGFmZmY7CisvLwlwcml2LT5pcnFfbWFzayA9IDB4NGZjZjsKKworCS8qIGVuYWJsZSBiZWFjb24gdGltZW91dCwgYmVhY29uIFRYIG9rIGFuZCBlcnIKKwkgKiBMUCB0eCBvayBhbmQgZXJyLCBIUCBUWCBvayBhbmQgZXJyLCBOUCBUWCBvayBhbmQgZXJyLAorCSAqIFJYIG9rIGFuZCBFUlIsIGFuZCBHUCB0aW1lciAqLworCXByaXYtPmlycV9tYXNrID0gMHg2ZmNmOworCisJcHJpdi0+ZG1hX3BvbGxfbWFzayA9IDA7CisKKwlydGw4MTgwX2JlYWNvbl90eF9kaXNhYmxlKGRldik7CisKKwlpZihwcml2LT5jYXJkX3R5cGUgPT0gQ0FSREJVUyApeworCQljb25maWczPXJlYWRfbmljX2J5dGUoZGV2LCBDT05GSUczKTsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LENPTkZJRzMsY29uZmlnMyB8IENPTkZJRzNfRnVuY1JlZ0VuKTsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LEZFTVIsIEZFTVJfSU5UUiB8IEZFTVJfV0tVUCB8IEZFTVJfR1dBS0UgfAorCQkJcmVhZF9uaWNfd29yZChkZXYsIEZFTVIpKTsKKwl9CisJcnRsODE4MF9zZXRfbW9kZShkZXYsIEVQUk9NX0NNRF9DT05GSUcpOworCXdyaXRlX25pY19kd29yZChkZXYsIE1BQzAsICgodTMyKilkZXYtPmRldl9hZGRyKVswXSk7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBNQUM0LCAoKHUzMiopZGV2LT5kZXZfYWRkcilbMV0gJiAweGZmZmYgKTsKKwlydGw4MTgwX3NldF9tb2RlKGRldiwgRVBST01fQ01EX05PUk1BTCk7CisKKwlydGw4MTgwX3VwZGF0ZV9tc3IoZGV2KTsKKworCWlmKCFwcml2LT5jYXJkXzgxODUpeworCQlhbmFwYXJhbSAgPSBlcHJvbV9yZWFkKGRldixFUFJPTV9BTkFQQVJBTV9BRERSTFdPUkQpOworCQlhbmFwYXJhbSB8PSBlcHJvbV9yZWFkKGRldixFUFJPTV9BTkFQQVJBTV9BRERSSFdPUkQpPDwxNjsKKworCQlydGw4MTgwX3NldF9hbmFwYXJhbShkZXYsYW5hcGFyYW0pOworCX0KKwkvKiBUaGVzZSBtaWdodCBiZSB1bm5lY2Vzc2FyeSBzaW5jZSB3ZSBkbyBpbiByeF9lbmFibGUgLyB0eF9lbmFibGUgKi8KKwlmaXhfcnhfZmlmbyhkZXYpOworCWZpeF90eF9maWZvKGRldik7CisJLypzZXRfbmljX3J4cmluZyhkZXYpOworCSAgc2V0X25pY190eHJpbmcoZGV2KTsqLworCisJcnRsODE4MF9zZXRfbW9kZShkZXYsIEVQUk9NX0NNRF9DT05GSUcpOworCisJLyoKKwkgICBUaGUgZm9sbG93aW5nIGlzIHZlcnkgc3RyYW5nZS4gc2VlbXMgdG8gYmUgdGhhdCAxIG1lYW5zIHRlc3QgbW9kZSwKKwkgICBidXQgd2UgbmVlZCB0byBhY2tub2x3bGVkZ2VzIHRoZSBuaWMgd2hlbiBhIHBhY2tldCBpcyByZWFkeQorCSAgIGFsdG91Z2h0IHdlIHNldCBpdCB0byAwCisJKi8KKworCXdyaXRlX25pY19ieXRlKGRldiwKKwkJICAgICAgIENPTkZJRzIsIHJlYWRfbmljX2J5dGUoZGV2LENPTkZJRzIpICZ+XAorCQkgICAgICAgKDE8PENPTkZJRzJfRE1BX1BPTExJTkdfTU9ERV9TSElGVCkpOworCS8vXnRoZSBuaWMgaXNuJ3QgaW4gdGVzdCBtb2RlCisJaWYocHJpdi0+Y2FyZF84MTg1KQorCQkJd3JpdGVfbmljX2J5dGUoZGV2LAorCQkgICAgICAgQ09ORklHMiwgcmVhZF9uaWNfYnl0ZShkZXYsQ09ORklHMil8KDE8PDQpKTsKKworCXJ0bDgxODBfc2V0X21vZGUoZGV2LEVQUk9NX0NNRF9OT1JNQUwpOworCisJd3JpdGVfbmljX2R3b3JkKGRldixJTlRfVElNRU9VVCwwKTsKKyNpZmRlZiBERUJVR19SRUdJU1RFUlMKKwlydGw4MTgwX2R1bXBfcmVnKGRldik7CisjZW5kaWYKKworCWlmKCFwcml2LT5jYXJkXzgxODUpCisJeworCQkvKgorCQlleHBlcmltZW50YWwgLSB0aGlzIG1pZ2h0IGJlIG5lZWRlZCB0byBjYWxpYnJhdGUgQUdDLAorCQlhbnl3YXkgaXQgc2hvdWxkbid0IGh1cnQKKwkJKi8KKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBDT05GSUc1LAorCQkJcmVhZF9uaWNfYnl0ZShkZXYsIENPTkZJRzUpIHwgKDE8PEFHQ1JFU0VUX1NISUZUKSk7CisJCXJlYWRfbmljX2J5dGUoZGV2LCBDT05GSUc1KTsKKwkJdWRlbGF5KDE1KTsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBDT05GSUc1LAorCQkJcmVhZF9uaWNfYnl0ZShkZXYsIENPTkZJRzUpICZ+ICgxPDxBR0NSRVNFVF9TSElGVCkpOworCX1lbHNleworCisJCXdyaXRlX25pY19ieXRlKGRldiwgV1BBX0NPTkZJRywgMCk7CisJCS8vd3JpdGVfbmljX2J5dGUoZGV2LCBURVNUUiwgMHhkKTsKKwl9CisKKwlydGw4MTgwX25vX2h3X3dlcChkZXYpOworCisJaWYocHJpdi0+Y2FyZF84MTg1KXsKKwkJcnRsODE4NV9zZXRfcmF0ZShkZXYpOworCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFJBVEVfRkFMTEJBQ0ssIDB4ODEpOworCS8vCXdyaXRlX25pY19ieXRlKGRldiwgMHhkZiwgMHgxNSk7CisJfWVsc2V7CisJCXdvcmQgID0gcmVhZF9uaWNfd29yZChkZXYsIEJSU1IpOworCQl3b3JkICY9IH5CUlNSX01CUjsKKwkJd29yZCAmPSB+QlJTUl9CUExDUDsKKwkJd29yZCB8PSBpZWVlcmF0ZTJydGxyYXRlKHByaXYtPmllZWU4MDIxMS0+YmFzaWNfcmF0ZSk7CisvL2J5IGFteQorICAgICAgICAgICAgICB3b3JkIHw9IDB4MGY7CisvL2J5IGFteQorCQl3cml0ZV9uaWNfd29yZChkZXYsIEJSU1IsIHdvcmQpOworCX0KKworCisJaWYocHJpdi0+Y2FyZF84MTg1KXsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBHUF9FTkFCTEUscmVhZF9uaWNfYnl0ZShkZXYsIEdQX0VOQUJMRSkgJiB+KDE8PDYpKTsKKworCQkvL0ZJWE1FIGNmZyAzIENsa1J1biBlbmFibGUgLSBpc24ndCBpdCBSZWFkT25seSA/CisJCXJ0bDgxODBfc2V0X21vZGUoZGV2LCBFUFJPTV9DTURfQ09ORklHKTsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LENPTkZJRzMsIHJlYWRfbmljX2J5dGUoZGV2LCBDT05GSUczKQorfCgxPDxDT05GSUczX0NMS1JVTl9TSElGVCkpOworCQlydGw4MTgwX3NldF9tb2RlKGRldiwgRVBST01fQ01EX05PUk1BTCk7CisKKwl9CisKKwlwcml2LT5yZl9pbml0KGRldik7CisKKwlpZihwcml2LT5yZl9zZXRfc2VucyAhPSBOVUxMKQorCQlwcml2LT5yZl9zZXRfc2VucyhkZXYscHJpdi0+c2Vucyk7CisJcnRsODE4MF9pcnFfZW5hYmxlKGRldik7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCS8qRE1FU0cgKCJsZnJlZSAlZCIsZ2V0X2N1cnJfdHhfZnJlZV9kZXNjKGRldixMT1dfUFJJT1JJVFkpKTsKKworCURNRVNHICgibmZyZWUgJWQiLGdldF9jdXJyX3R4X2ZyZWVfZGVzYyhkZXYsTk9STV9QUklPUklUWSkpOworCisJRE1FU0cgKCJoZnJlZSAlZCIsZ2V0X2N1cnJfdHhfZnJlZV9kZXNjKGRldixISV9QUklPUklUWSkpOworCWlmKGNoZWNrX25pY19lbm91Z2h0X2Rlc2MoZGV2LE5PUk1fUFJJT1JJVFkpKSBETUVTRygiTk9STSBPSyIpOworCWlmKGNoZWNrX25pY19lbm91Z2h0X2Rlc2MoZGV2LEhJX1BSSU9SSVRZKSkgRE1FU0coIkhJIE9LIik7CisJaWYoY2hlY2tfbmljX2Vub3VnaHRfZGVzYyhkZXYsTE9XX1BSSU9SSVRZKSkgRE1FU0coIkxPVyBPSyIpOyovCit9CisKKworCisvKiB0aGlzIGNvbmZpZ3VyZXMgcmVnaXN0ZXJzIGZvciBiZWFjb24gdHggYW5kIGVuYWJsZXMgaXQgdmlhCisgKiBydGw4MTgwX2JlYWNvbl90eF9lbmFibGUoKS4gcnRsODE4MF9iZWFjb25fdHhfZGlzYWJsZSgpIG1pZ2h0CisgKiBiZSB1c2VkIHRvIHN0b3AgYmVhY29uIHRyYW5zbWlzc2lvbgorICovCit2b2lkIHJ0bDgxODBfc3RhcnRfdHhfYmVhY29uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisvLwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJdTE2IHdvcmQ7CisvLwlETUVTRygicmluZyAleCAleCIsIHByaXYtPnR4bHByaW5nZG1hLHJlYWRfbmljX2R3b3JkKGRldixUTFBEQSkpOworCisJRE1FU0coIkVuYWJsaW5nIGJlYWNvbiBUWCIpOworCS8vd3JpdGVfbmljX2J5dGUoZGV2LCAweDQyLDB4ZTYpOy8vIFRDUgorLy8Jc2V0X25pY190eHJpbmcoZGV2KTsKKy8vCWZpeF90eF9maWZvKGRldik7CisJcnRsODE4MF9wcmVwYXJlX2JlYWNvbihkZXYpOworCXJ0bDgxODBfaXJxX2Rpc2FibGUoZGV2KTsKKwlydGw4MTgwX2JlYWNvbl90eF9lbmFibGUoZGV2KTsKKyNpZiAwCisJcnRsODE4MF9zZXRfbW9kZShkZXYsRVBST01fQ01EX0NPTkZJRyk7CisJLy93cml0ZV9uaWNfYnl0ZShkZXYsMHg5ZCwweDIwKTsgLy9ETUEgUG9sbAorCS8vd3JpdGVfbmljX3dvcmQoZGV2LDB4N2EsMCk7CisJLy93cml0ZV9uaWNfd29yZChkZXYsMHg3YSwweDgwMDApOworCisjaWYgMAorCXdvcmQgID0gcmVhZF9uaWNfd29yZChkZXYsIEJjbkl0dik7CisJd29yZCAmPSB+QmNuSXR2X0Jjbkl0djsgLy8gY2xlYXIgQmNuX0l0dgorCXdvcmQgfD0gcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsOy8vMHg2NDsKKwl3cml0ZV9uaWNfd29yZChkZXYsIEJjbkl0diwgd29yZCk7CisjZW5kaWYKKyNlbmRpZgorCXdvcmQgPSByZWFkX25pY193b3JkKGRldiwgQXRpbVduZCkgJn4gQXRpbVduZF9BdGltV25kOworCXdyaXRlX25pY193b3JkKGRldiwgQXRpbVduZCx3b3JkKTsvLyB3b3JkIHw9CisvL3ByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmF0aW1fd2luZG93KTsKKworCXdvcmQgID0gcmVhZF9uaWNfd29yZChkZXYsIEJpbnRySXR2KTsKKwl3b3JkICY9IH5CaW50ckl0dl9CaW50ckl0djsKKwl3b3JkIHw9IDEwMDA7Lypwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwgKgorCQkoKHByaXYtPnR4YmVhY29uY291bnQgPiAxKT8ocHJpdi0+dHhiZWFjb25jb3VudC0xKToxKTsKKwkvLyBGSVhNRTogY2hlY2sgaWYgY29ycmVjdCBeXiB3b3JrZWQgd2l0aCAweDNlODsKKwkqLworCXdyaXRlX25pY193b3JkKGRldiwgQmludHJJdHYsIHdvcmQpOworCisKKwlydGw4MTgwX3NldF9tb2RlKGRldiwgRVBST01fQ01EX05PUk1BTCk7CisKKy8vCXJ0bDgxODBfYmVhY29uX3R4X2VuYWJsZShkZXYpOworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorICAgICAgICBydGw4MTg1Yl9pcnFfZW5hYmxlKGRldik7CisjZWxzZQorCXJ0bDgxODBfaXJxX2VuYWJsZShkZXYpOworI2VuZGlmCisJLyogVlYgISEhISEhISEhISBWViovCisJLyoKKwlydGw4MTgwX3NldF9tb2RlKGRldixFUFJPTV9DTURfQ09ORklHKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsMHg5ZCwweDAwKTsKKwlydGw4MTgwX3NldF9tb2RlKGRldixFUFJPTV9DTURfTk9STUFMKTsKKyovCisvLwlETUVTRygicmluZyAleCAleCIsIHByaXYtPnR4bHByaW5nZG1hLHJlYWRfbmljX2R3b3JkKGRldixUTFBEQSkpOworCit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLU5FVCBTVFVGRi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpydGw4MTgwX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJcmV0dXJuICZwcml2LT5pZWVlODAyMTEtPnN0YXRzOworfQorLy8KKy8vIENoYW5nZSBjdXJyZW50IGFuZCBkZWZhdWx0IHByZWFtYmxlIG1vZGUuCisvLyAyMDA1LjAxLjA2LCBieSByY25qa28uCisvLworYm9vbAorTWdudEFjdFNldF84MDJfMTFfUG93ZXJTYXZlTW9kZSgKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiwKKwlSVF9QU19NT0RFCQlydFBzTW9kZQorKQoreworCisJLy8gQ3VycmVudGx5LCB3ZSBkbyBub3QgY2hhbmdlIHBvd2VyIHNhdmUgbW9kZSBvbiBJQlNTIG1vZGUuCisJaWYocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfQURIT0MpCisJeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLy8KKwkvLyA8UkpfTk9URT4gSWYgd2UgbWFrZSBIVyB0byBmaWxsIHVwIHRoZSBQd3JNZ3QgYml0IGZvciB1cywKKwkvLyBzb21lIEFQIHdpbGwgbm90IHJlc3BvbnNlIHRvIG91ciBtZ250IGZyYW1lcyB3aXRoIFB3ck1ndCBiaXQgc2V0LAorCS8vIGUuZy4gY2Fubm90IGFzc29jaWF0ZSB0aGUgQVAuCisJLy8gU28gSSBjb21tZW50ZWQgb3V0IGl0LiAyMDA1LjAyLjE2LCBieSByY25qa28uCisJLy8KKy8vCS8vIENoYW5nZSBkZXZpY2UncyBwb3dlciBzYXZlIG1vZGUuCisvLwlBZGFwdGVyLT5IYWxGdW5jLlNldFBTTW9kZUhhbmRsZXIoIEFkYXB0ZXIsIHJ0UHNNb2RlICk7CisKKwkvLyBVcGRhdGUgcG93ZXIgc2F2ZSBtb2RlIGNvbmZpZ3VyZWQuCisvLwlwcml2LT5kb3QxMVBvd2VyU2F2ZU1vZGUgPSBydFBzTW9kZTsKKwlwcml2LT5pZWVlODAyMTEtPnBzID0gcnRQc01vZGU7CisJLy8gRGV0ZXJtaW5lIExpc3RlbkludGVydmFsLgorI2lmIDAKKwlpZihwcml2LT5kb3QxMVBvd2VyU2F2ZU1vZGUgPT0gZU1heFBzKQorCXsKKwkJcHJpdi0+aWVlZTgwMjExLT5MaXN0ZW5JbnRlcnZhbCA9IDEwOworCX0KKwllbHNlCisJeworCQlwcml2LT5pZWVlODAyMTEtPkxpc3RlbkludGVydmFsID0gMjsKKwl9CisjZW5kaWYKKwlyZXR1cm4gdHJ1ZTsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gTGVpc3VyZSBQb3dlciBTYXZlIGluIGxpbmtlZCBzdGF0ZS4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8KKy8vCURlc2NyaXB0aW9uOgorLy8JCUVudGVyIHRoZSBsZWlzdXJlIHBvd2VyIHNhdmUgbW9kZS4KKy8vCit2b2lkCitMZWlzdXJlUFNFbnRlcigKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdgorCSkKK3sKKwlpZiAocHJpdi0+YkxlaXN1cmVQcykKKwl7CisJCWlmIChwcml2LT5pZWVlODAyMTEtPnBzID09IElFRUU4MDIxMV9QU19ESVNBQkxFRCkKKwkJeworCQkJLy9wcmludGsoIi0tLS1FbnRlciBQU1xuIik7CisJCQlNZ250QWN0U2V0XzgwMl8xMV9Qb3dlclNhdmVNb2RlKHByaXYsIElFRUU4MDIxMV9QU19NQkNBU1R8SUVFRTgwMjExX1BTX1VOSUNBU1QpOy8vSUVFRTgwMjExX1BTX0VOQUJMRQorCQl9CisJfQorfQorCisKKy8vCisvLwlEZXNjcmlwdGlvbjoKKy8vCQlMZWF2ZSB0aGUgbGVpc3VyZSBwb3dlciBzYXZlIG1vZGUuCisvLwordm9pZAorTGVpc3VyZVBTTGVhdmUoCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYKKwkpCit7CisJaWYgKHByaXYtPmJMZWlzdXJlUHMpCisJeworCQlpZiAocHJpdi0+aWVlZTgwMjExLT5wcyAhPSBJRUVFODAyMTFfUFNfRElTQUJMRUQpCisJCXsKKwkJCS8vcHJpbnRrKCItLS0tTGVhdmUgUFNcbiIpOworCQkJTWdudEFjdFNldF84MDJfMTFfUG93ZXJTYXZlTW9kZShwcml2LCBJRUVFODAyMTFfUFNfRElTQUJMRUQpOworCQl9CisJfQorfQorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKK3ZvaWQgcnRsODE4MF9od193YWtldXBfd3EgKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKy8vCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByODE4MF9wcml2LCB3YXRjaF9kb2dfd3EpOworLy8Jc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiBpZWVlID0gKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKikKKy8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgd2F0Y2hfZG9nX3dxKTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLHN0cnVjdCBkZWxheWVkX3dvcmssd29yayk7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2YoZHdvcmssc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsaHdfd2FrZXVwX3dxKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWVlZS0+ZGV2OworI2Vsc2UKK3ZvaWQgcnRsODE4MF9od193YWtldXBfd3Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisjZW5kaWYKKworLy8JcHJpbnRrKCJkZXYgaXMgJWRcbiIsZGV2KTsKKy8vCXByaW50aygiJiomKF4qKCYoJj09PT09PT09PT4lcygpXG4iLCBfX2Z1bmNfXyk7CisJcnRsODE4MF9od193YWtldXAoZGV2KTsKKworfQorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApKQordm9pZCBydGw4MTgwX2h3X3NsZWVwX3dxIChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisvLyAgICAgIHN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByODE4MF9wcml2LCB3YXRjaF9kb2dfd3EpOworLy8gICAgICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqIGllZWUgPSAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqKQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIHdhdGNoX2RvZ193cSk7CisgICAgICAgIHN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrID0gY29udGFpbmVyX29mKHdvcmssc3RydWN0IGRlbGF5ZWRfd29yayx3b3JrKTsKKyAgICAgICAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2YoZHdvcmssc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsaHdfc2xlZXBfd3EpOworICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWVlZS0+ZGV2OworI2Vsc2UKK3ZvaWQgcnRsODE4MF9od19zbGVlcF93cShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisjZW5kaWYKKworICAgICAgICBydGw4MTgwX2h3X3NsZWVwX2Rvd24oZGV2KTsKK30KKworLy9ZSixhZGQsMDgwODI4LGZvciBLZWVwQWxpdmUKK3N0YXRpYyB2b2lkIE1nbnRMaW5rS2VlcEFsaXZlKHN0cnVjdCByODE4MF9wcml2ICpwcml2ICkKK3sKKwlpZiAocHJpdi0+a2VlcEFsaXZlTGV2ZWwgPT0gMCkKKwkJcmV0dXJuOworCisJaWYocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKQorCXsKKwkJLy8KKwkJLy8gS2VlcC1BbGl2ZS4KKwkJLy8KKwkJLy9wcmludGsoIkxhc3RUeDolZCBUeDolZCBMYXN0Ung6JWQgUng6JWxkIElkbGU6JWRcbiIscHJpdi0+bGlua19kZXRlY3QuTGFzdE51bVR4VW5pY2FzdCxwcml2LT5OdW1UeFVuaWNhc3QsIHByaXYtPmxpbmtfZGV0ZWN0Lkxhc3ROdW1SeFVuaWNhc3QsIHByaXYtPmllZWU4MDIxMS0+TnVtUnhVbmljYXN0LCBwcml2LT5saW5rX2RldGVjdC5JZGxlQ291bnQpOworCisJCWlmICggKHByaXYtPmtlZXBBbGl2ZUxldmVsPT0gMikgfHwKKwkJCShwcml2LT5saW5rX2RldGVjdC5MYXN0TnVtVHhVbmljYXN0ID09IHByaXYtPk51bVR4VW5pY2FzdCAmJgorCQkJcHJpdi0+bGlua19kZXRlY3QuTGFzdE51bVJ4VW5pY2FzdCA9PSBwcml2LT5pZWVlODAyMTEtPk51bVJ4VW5pY2FzdCApCisJCQkpCisJCXsKKwkJCXByaXYtPmxpbmtfZGV0ZWN0LklkbGVDb3VudCsrOworCisJCQkvLworCQkJLy8gU2VuZCBhIEtlZXAtQWxpdmUgcGFja2V0IHBhY2tldCB0byBBUCBpZiB3ZSBoYWQgYmVlbiBpZGxlIGZvciBhIHdoaWxlLgorCQkJLy8KKwkJCWlmKHByaXYtPmxpbmtfZGV0ZWN0LklkbGVDb3VudCA+PSAoKEtFRVBfQUxJVkVfSU5URVJWQUwgLyBDSEVDS19GT1JfSEFOR19QRVJJT0QpLTEpICkKKwkJCXsKKwkJCQlwcml2LT5saW5rX2RldGVjdC5JZGxlQ291bnQgPSAwOworCQkJCWllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKHByaXYtPmllZWU4MDIxMSwgZmFsc2UpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJcHJpdi0+bGlua19kZXRlY3QuSWRsZUNvdW50ID0gMDsKKwkJfQorCQlwcml2LT5saW5rX2RldGVjdC5MYXN0TnVtVHhVbmljYXN0ID0gcHJpdi0+TnVtVHhVbmljYXN0OworCQlwcml2LT5saW5rX2RldGVjdC5MYXN0TnVtUnhVbmljYXN0ID0gcHJpdi0+aWVlZTgwMjExLT5OdW1SeFVuaWNhc3Q7CisJfQorfQorLy9ZSixhZGQsMDgwODI4LGZvciBLZWVwQWxpdmUsZW5kCisKK3N0YXRpYyB1OCByZWFkX2FjYWRhcHRlcl9maWxlKGNoYXIgKmZpbGVuYW1lKTsKK3ZvaWQgcnRsODE4MF93YXRjaF9kb2coc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJYm9vbCBiRW50ZXJQUyA9IGZhbHNlOworCWJvb2wgYkJ1c3lUcmFmZmljID0gZmFsc2U7CisJdTMyIFRvdGFsUnhOdW0gPSAwOworCXUxNiBTbG90SW5kZXggPSAwOworCXUxNiBpID0gMDsKKyNpZmRlZiBFTkFCTEVfSVBTCisJaWYocHJpdi0+aWVlZTgwMjExLT5hY3RzY2FubmluZyA9PSBmYWxzZSl7CisJCWlmKChwcml2LT5pZWVlODAyMTEtPml3X21vZGUgIT0gSVdfTU9ERV9BREhPQykgJiYgKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSykgJiYgKHByaXYtPmllZWU4MDIxMS0+YmVpbnJldHJ5ID09IGZhbHNlKSAmJiAocHJpdi0+ZVJGUG93ZXJTdGF0ZSA9PSBlUmZPbikpeworCQkJSVBTRW50ZXIoZGV2KTsKKwkJfQorCX0KKyNlbmRpZgorCS8vWUosYWRkLDA4MDgyOCxmb3IgbGluayBzdGF0ZSBjaGVjaworCWlmKChwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpICYmIChwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkpeworCQlTbG90SW5kZXggPSAocHJpdi0+bGlua19kZXRlY3QuU2xvdEluZGV4KyspICUgcHJpdi0+bGlua19kZXRlY3QuU2xvdE51bTsKKwkJcHJpdi0+bGlua19kZXRlY3QuUnhGcmFtZU51bVtTbG90SW5kZXhdID0gcHJpdi0+aWVlZTgwMjExLT5OdW1SeERhdGFJblBlcmlvZCArIHByaXYtPmllZWU4MDIxMS0+TnVtUnhCY25JblBlcmlvZDsKKwkJZm9yKCBpPTA7IGk8cHJpdi0+bGlua19kZXRlY3QuU2xvdE51bTsgaSsrICkKKwkJCVRvdGFsUnhOdW0rPSBwcml2LT5saW5rX2RldGVjdC5SeEZyYW1lTnVtW2ldOworCQkvL3ByaW50aygiJiYmJiY9PT0gVG90YWxSeE51bSA9ICVkXG4iLCBUb3RhbFJ4TnVtKTsKKwkJaWYoVG90YWxSeE51bSA9PSAwKXsKKwkJCXByaXYtPmllZWU4MDIxMS0+c3RhdGUgPSBJRUVFODAyMTFfQVNTT0NJQVRJTkc7CisJCQlxdWV1ZV93b3JrKHByaXYtPmllZWU4MDIxMS0+d3EsICZwcml2LT5pZWVlODAyMTEtPmFzc29jaWF0ZV9wcm9jZWR1cmVfd3EpOworCQl9CisJfQorCisJLy9ZSixhZGQsMDgwODI4LGZvciBLZWVwQWxpdmUKKwlNZ250TGlua0tlZXBBbGl2ZShwcml2KTsKKworCS8vWUosYWRkLDA4MDgyOCxmb3IgTFBTCisjaWZkZWYgRU5BQkxFX0xQUworCWlmKHByaXYtPlBvd2VyUHJvZmlsZSA9PSBQT1dFUl9QUk9GSUxFX0JBVFRFUlkgKQorCXsKKwkJLy9UdXJuIG9uIExlaXN1cmVQUyBvbiBiYXR0ZXJ5IHBvd2VyCisJCS8vcHJpbnRrKCIhISEhIU9uIGJhdHRlcnkgcG93ZXJcbiIpOworCQlwcml2LT5iTGVpc3VyZVBzID0gdHJ1ZTsKKwl9CisJZWxzZSBpZihwcml2LT5Qb3dlclByb2ZpbGUgPT0gUE9XRVJfUFJPRklMRV9BQyApCisJeworCQkvLyBUdXJuIG9mZiBMZWlzdXJlUFMgb24gQUMgcG93ZXIKKwkJLy9wcmludGsoIi0tLS1PbiBBQyBwb3dlclxuIik7CisJCUxlaXN1cmVQU0xlYXZlKHByaXYpOworCQlwcml2LT5iTGVpc3VyZVBzPSBmYWxzZTsKKwl9CisjZW5kaWYKKworI2lmIDAKKyNpZm5kZWYgRU5BQkxFX0xQUworCWlmKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCl7CisJCWlmKAlwcml2LT5OdW1SeE9rSW5QZXJpb2Q+IDY2NiB8fAorCQkJcHJpdi0+TnVtVHhPa0luUGVyaW9kID4gNjY2ICkgeworCQkJYkJ1c3lUcmFmZmljID0gdHJ1ZTsKKwkJfQorCQlpZigocHJpdi0+aWVlZTgwMjExLT5OdW1SeERhdGEgKyBwcml2LT5OdW1UeE9rSW5QZXJpb2QpPDgpIHsKKwkJCWJFbnRlclBTPSB0cnVlOworCQl9CisJCWlmKGJFbnRlclBTKSB7CisJCQlMZWlzdXJlUFNFbnRlcihwcml2KTsKKwkJfQorCQllbHNlIHsKKwkJCUxlaXN1cmVQU0xlYXZlKHByaXYpOworCQl9CisJfQorCWVsc2UJeworCQlMZWlzdXJlUFNMZWF2ZShwcml2KTsKKwl9CisjZW5kaWYKKwlwcml2LT5OdW1SeE9rSW5QZXJpb2QgPSAwOworCXByaXYtPk51bVR4T2tJblBlcmlvZCA9IDA7CisJcHJpdi0+aWVlZTgwMjExLT5OdW1SeERhdGEgPSAwOworI2Vsc2UKKyNpZmRlZiBFTkFCTEVfTFBTCisJaWYocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKXsKKwkJcHJpdi0+bGlua19kZXRlY3QuTnVtUnhPa0luUGVyaW9kID0gcHJpdi0+aWVlZTgwMjExLT5OdW1SeERhdGFJblBlcmlvZDsKKwkJLy9wcmludGsoIlR4T2s9JWQgUnhPaz0lZFxuIiwgcHJpdi0+bGlua19kZXRlY3QuTnVtVHhPa0luUGVyaW9kLCBwcml2LT5saW5rX2RldGVjdC5OdW1SeE9rSW5QZXJpb2QpOworCQlpZigJcHJpdi0+bGlua19kZXRlY3QuTnVtUnhPa0luUGVyaW9kPiA2NjYgfHwKKwkJCXByaXYtPmxpbmtfZGV0ZWN0Lk51bVR4T2tJblBlcmlvZD4gNjY2ICkgeworCQkJYkJ1c3lUcmFmZmljID0gdHJ1ZTsKKwkJfQorCQlpZigoKHByaXYtPmxpbmtfZGV0ZWN0Lk51bVJ4T2tJblBlcmlvZCArIHByaXYtPmxpbmtfZGV0ZWN0Lk51bVR4T2tJblBlcmlvZCkgPiA4KQorCQkJfHwgKHByaXYtPmxpbmtfZGV0ZWN0Lk51bVJ4T2tJblBlcmlvZCA+IDIpKSB7CisJCQliRW50ZXJQUz0gZmFsc2U7CisJCX0KKwkJZWxzZSB7CisJCQliRW50ZXJQUz0gdHJ1ZTsKKwkJfQorCisJCWlmKGJFbnRlclBTKSB7CisJCQlMZWlzdXJlUFNFbnRlcihwcml2KTsKKwkJfQorCQllbHNlIHsKKwkJCUxlaXN1cmVQU0xlYXZlKHByaXYpOworCQl9CisJfQorCWVsc2V7CisJCUxlaXN1cmVQU0xlYXZlKHByaXYpOworCX0KKyNlbmRpZgorCXByaXYtPmxpbmtfZGV0ZWN0LmJCdXN5VHJhZmZpYyA9IGJCdXN5VHJhZmZpYzsKKwlwcml2LT5saW5rX2RldGVjdC5OdW1SeE9rSW5QZXJpb2QgPSAwOworCXByaXYtPmxpbmtfZGV0ZWN0Lk51bVR4T2tJblBlcmlvZCA9IDA7CisJcHJpdi0+aWVlZTgwMjExLT5OdW1SeERhdGFJblBlcmlvZCA9IDA7CisJcHJpdi0+aWVlZTgwMjExLT5OdW1SeEJjbkluUGVyaW9kID0gMDsKKyNlbmRpZgorfQoraW50IF9ydGw4MTgwX3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCS8vaW50IGk7CisKKwlwcml2LT51cD0xOworCisJRE1FU0coIkJyaW5naW5nIHVwIGlmYWNlIik7CisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisJcnRsODE4NWJfYWRhcHRlcl9zdGFydChkZXYpOworCXJ0bDgxODViX3J4X2VuYWJsZShkZXYpOworCXJ0bDgxODViX3R4X2VuYWJsZShkZXYpOworI2Vsc2UKKwlydGw4MTgwX2FkYXB0ZXJfc3RhcnQoZGV2KTsKKwlydGw4MTgwX3J4X2VuYWJsZShkZXYpOworCXJ0bDgxODBfdHhfZW5hYmxlKGRldik7CisjZW5kaWYKKyNpZmRlZiBFTkFCTEVfSVBTCisJaWYocHJpdi0+YkluYWN0aXZlUHMpeworCQlpZihwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykKKwkJCUlQU0xlYXZlKGRldik7CisJfQorI2VuZGlmCisvL2J5IGFteSAwODAzMTIKKyNpZmRlZiBSQVRFX0FEQVBUCisgICAgICAgdGltZXJfcmF0ZV9hZGFwdGl2ZSgodW5zaWduZWQgbG9uZylkZXYpOworI2VuZGlmCisvL2J5IGFteSAwODAzMTIKKwl3YXRjaF9kb2dfYWRhcHRpdmUoKHVuc2lnbmVkIGxvbmcpZGV2KTsKKyNpZmRlZiBTV19BTlRFCisgICAgICAgIGlmKHByaXYtPmJTd0FudGVubmFEaXZlcml0eSkKKwkJCVN3QW50ZW5uYURpdmVyc2l0eVRpbWVyQ2FsbGJhY2soZGV2KTsKKyNlbmRpZgorLy8JSVBTRW50ZXIoZGV2KTsKKwlpZWVlODAyMTFfc29mdG1hY19zdGFydF9wcm90b2NvbChwcml2LT5pZWVlODAyMTEpOworCisvL0FkZCBmb3IgUkYgcG93ZXIgb24gcG93ZXIgb2ZmIGJ5IGxpemhhb21pbmcgMDgwNTEyCisvLwlwcml2LT5lUkZQb3dlclN0YXRlID0gZVJmT247CisvLwlwcmludGsoIlxuLS0tLS0tLS1TdGFydCBxdWV1ZV93b3JrOkdQSU9DaGFuZ2VSRldvcmtJdGVtIik7CisvLwlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+aWVlZTgwMjExLT53cSwmcHJpdi0+aWVlZTgwMjExLT5HUElPQ2hhbmdlUkZXb3JrSXRlbSwxMDAwKTsKKworCXJldHVybiAwOworfQorCisKK2ludCBydGw4MTgwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50IHJldDsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisJcmV0ID0gcnRsODE4MF91cChkZXYpOworCXVwKCZwcml2LT53eF9zZW0pOworCXJldHVybiByZXQ7CisKK30KKworCitpbnQgcnRsODE4MF91cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWlmIChwcml2LT51cCA9PSAxKSByZXR1cm4gLTE7CisKKwlyZXR1cm4gX3J0bDgxODBfdXAoZGV2KTsKK30KKworCitpbnQgcnRsODE4MF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpbnQgcmV0OworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKwlyZXQgPSBydGw4MTgwX2Rvd24oZGV2KTsKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiByZXQ7CisKK30KKworaW50IHJ0bDgxODBfZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWlmIChwcml2LT51cCA9PSAwKSByZXR1cm4gLTE7CisKKwlwcml2LT51cD0wOworCisJaWVlZTgwMjExX3NvZnRtYWNfc3RvcF9wcm90b2NvbChwcml2LT5pZWVlODAyMTEpOworCS8qIEZJWE1FICovCisJaWYgKCFuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlydGw4MTgwX3J0eF9kaXNhYmxlKGRldik7CisJcnRsODE4MF9pcnFfZGlzYWJsZShkZXYpOworCWRlbF90aW1lcl9zeW5jKCZwcml2LT53YXRjaF9kb2dfdGltZXIpOworCS8vY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+aWVlZTgwMjExLT53YXRjaF9kb2dfd3EpOworLy97YnkgYW15IDA4MDMxMgorICAgIGRlbF90aW1lcl9zeW5jKCZwcml2LT5yYXRlYWRhcHRlcl90aW1lcik7CisgICAgY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+aWVlZTgwMjExLT5yYXRlX2FkYXB0ZXJfd3EpOworLy9ieSBhbXkgMDgwMzEyfQorCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmllZWU4MDIxMS0+aHdfd2FrZXVwX3dxKTsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5pZWVlODAyMTEtPmh3X3NsZWVwX3dxKTsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5pZWVlODAyMTEtPmh3X2RpZ193cSk7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+aWVlZTgwMjExLT50eF9wd193cSk7CisJZGVsX3RpbWVyX3N5bmMoJnByaXYtPlN3QW50ZW5uYURpdmVyc2l0eVRpbWVyKTsKKwlTZXRaZWJyYVJGUG93ZXJTdGF0ZTgxODUoZGV2LGVSZk9mZik7CisJLy9pZWVlODAyMTFfc29mdG1hY19zdG9wX3Byb3RvY29sKHByaXYtPmllZWU4MDIxMSk7CisJbWVtc2V0KCYocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmspLDAsc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yaykpOworCXByaXYtPmllZWU4MDIxMS0+c3RhdGUgPSBJRUVFODAyMTFfTk9MSU5LOworCXJldHVybiAwOworfQorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApKQordm9pZCBydGw4MTgwX3Jlc3RhcnRfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByODE4MF9wcml2LCByZXNldF93cSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPmRldjsKKyNlbHNlCit2b2lkIHJ0bDgxODBfcmVzdGFydF93cShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKyNlbmRpZgorCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlydGw4MTgwX2NvbW1pdChkZXYpOworCisJdXAoJnByaXYtPnd4X3NlbSk7Cit9CisKK3ZvaWQgcnRsODE4MF9yZXN0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCS8vcnRsODE4MF9jb21taXQoZGV2KTsKKwlzY2hlZHVsZV93b3JrKCZwcml2LT5yZXNldF93cSk7CisJLy9ETUVTRygiVFhUSU1FT1VUIik7Cit9CisKKwordm9pZCBydGw4MTgwX2NvbW1pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWlmIChwcml2LT51cCA9PSAwKSByZXR1cm4gOworLy8rYnkgYW15IDA4MDMxMgorCWRlbF90aW1lcl9zeW5jKCZwcml2LT53YXRjaF9kb2dfdGltZXIpOworCS8vY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+aWVlZTgwMjExLT53YXRjaF9kb2dfd3EpOworLy97YnkgYW15IDA4MDMxMgorLy9ieSBhbXkgZm9yIHJhdGUgYWRhcHRpdmUKKyAgICBkZWxfdGltZXJfc3luYygmcHJpdi0+cmF0ZWFkYXB0ZXJfdGltZXIpOworICAgIGNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmllZWU4MDIxMS0+cmF0ZV9hZGFwdGVyX3dxKTsKKy8vYnkgYW15IGZvciByYXRlIGFkYXB0aXZlCisvL2J5IGFteSAwODAzMTJ9CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+aWVlZTgwMjExLT5od193YWtldXBfd3EpOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmllZWU4MDIxMS0+aHdfc2xlZXBfd3EpOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmllZWU4MDIxMS0+aHdfZGlnX3dxKTsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5pZWVlODAyMTEtPnR4X3B3X3dxKTsKKwlkZWxfdGltZXJfc3luYygmcHJpdi0+U3dBbnRlbm5hRGl2ZXJzaXR5VGltZXIpOworCWllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2wocHJpdi0+aWVlZTgwMjExKTsKKwlydGw4MTgwX2lycV9kaXNhYmxlKGRldik7CisJcnRsODE4MF9ydHhfZGlzYWJsZShkZXYpOworCV9ydGw4MTgwX3VwKGRldik7Cit9CisKKworc3RhdGljIHZvaWQgcjgxODBfc2V0X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzaG9ydCBwcm9taXNjOworCisJLy9kb3duKCZwcml2LT53eF9zZW0pOworCisJcHJvbWlzYyA9IChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpID8gMTowOworCisJaWYgKHByb21pc2MgIT0gcHJpdi0+cHJvbWlzYykKKwkJcnRsODE4MF9yZXN0YXJ0KGRldik7CisKKwlwcml2LT5wcm9taXNjID0gcHJvbWlzYzsKKworCS8vdXAoJnByaXYtPnd4X3NlbSk7Cit9CisKKyNpZiAwCisvKiB0aGlzIGlzIGNhbGxlZCBieSB0aGUga2VybmVsIHdoZW4gaXQgbmVlZHMgdG8gVFggYSA4MDIuMyBlbmNhcHN1bGF0ZWQgZnJhbWUqLworaW50IHJ0bDgxODBfODAyM19oYXJkX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4X2xvY2ssZmxhZ3MpOworCXJldCA9IGllZWU4MDIxMV9yODE4MF84MDIzX2hhcmRzdGFydHhtaXQoc2tiLHByaXYtPmllZWU4MDIxMSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jayxmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCitpbnQgcjgxODBfc2V0X21hY19hZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqbWFjKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBtYWM7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIEVUSF9BTEVOKTsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikKKwkJbWVtY3B5KHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisKKwlpZiAocHJpdi0+dXApIHsKKwkJcnRsODE4MF9kb3duKGRldik7CisJCXJ0bDgxODBfdXAoZGV2KTsKKwl9CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiAwOworfQorCisvKiBiYXNlZCBvbiBpcHcyMjAwIGRyaXZlciAqLworaW50IHJ0bDgxODBfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwlzdHJ1Y3QgaXdyZXEgKndycSA9IChzdHJ1Y3QgaXdyZXEgKikgcnE7CisJaW50IHJldD0tMTsKKwlzd2l0Y2ggKGNtZCkgeworCSAgICBjYXNlIFJUTF9JT0NUTF9XUEFfU1VQUExJQ0FOVDoKKwkJcmV0ID0gaWVlZTgwMjExX3dwYV9zdXBwbGljYW50X2lvY3RsKHByaXYtPmllZWU4MDIxMSwgJndycS0+dS5kYXRhKTsKKwkJcmV0dXJuIHJldDsKKworCSAgICBkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1QQ0kgU1RVRkYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHJ0bDgxODBfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSAwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOworCXN0cnVjdCByODE4MF9wcml2ICpwcml2PSBOVUxMOworCS8vdTggKnB0cjsKKwl1OCB1bml0ID0gMDsKKworI2lmZGVmIENPTkZJR19SVEw4MTgwX0lPX01BUAorCXVuc2lnbmVkIGxvbmcgcGlvX3N0YXJ0LCBwaW9fbGVuLCBwaW9fZmxhZ3M7CisjZWxzZQorCXVuc2lnbmVkIGxvbmcgcG1lbV9zdGFydCwgcG1lbV9sZW4sIHBtZW1fZmxhZ3M7CisjZW5kaWYgLy9lbmQgI2lmZGVmIFJUTF9JT19NQVAKKworCURNRVNHKCJDb25maWd1cmluZyBjaGlwIHJlc291cmNlcyIpOworCisJaWYoIHBjaV9lbmFibGVfZGV2aWNlIChwZGV2KSApeworCQlETUVTRygiRmFpbGVkIHRvIGVuYWJsZSBQQ0kgZGV2aWNlIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCS8vcGNpX3NldF93bWkocGRldik7CisJcGNpX3NldF9kbWFfbWFzayhwZGV2LCAweGZmZmZmZjAwVUxMKTsKKwlwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwweGZmZmZmZjAwVUxMKTsKKwlkZXYgPSBhbGxvY19pZWVlODAyMTEoc2l6ZW9mKHN0cnVjdCByODE4MF9wcml2KSk7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PTUVNOworCXByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXByaXYtPmllZWU4MDIxMSA9IG5ldGRldl9wcml2KGRldik7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjQpCisgICAgICAgIFNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKyNlbmRpZgorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwlwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKy8vCW1lbXNldChwcml2LDAsc2l6ZW9mKHN0cnVjdCByODE4MF9wcml2KSk7CisJcHJpdi0+cGRldj1wZGV2OworCisKKyNpZmRlZiBDT05GSUdfUlRMODE4MF9JT19NQVAKKworCXBpb19zdGFydCA9ICh1bnNpZ25lZCBsb25nKXBjaV9yZXNvdXJjZV9zdGFydCAocGRldiwgMCk7CisJcGlvX2xlbiA9ICh1bnNpZ25lZCBsb25nKXBjaV9yZXNvdXJjZV9sZW4gKHBkZXYsIDApOworCXBpb19mbGFncyA9ICh1bnNpZ25lZCBsb25nKXBjaV9yZXNvdXJjZV9mbGFncyAocGRldiwgMCk7CisKKyAgICAgIAlpZiAoIShwaW9fZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSkgeworCQlETUVTRygicmVnaW9uICMwIG5vdCBhIFBJTyByZXNvdXJjZSwgYWJvcnRpbmciKTsKKwkJZ290byBmYWlsOworCX0KKworCS8vRE1FU0coIklPIHNwYWNlIEAgMHglMDhseCIsIHBpb19zdGFydCApOworCWlmKCAhIHJlcXVlc3RfcmVnaW9uKCBwaW9fc3RhcnQsIHBpb19sZW4sIFJUTDgxODBfTU9EVUxFX05BTUUgKSApeworCQlETUVTRygicmVxdWVzdF9yZWdpb24gZmFpbGVkISIpOworCQlnb3RvIGZhaWw7CisJfQorCisJaW9hZGRyID0gcGlvX3N0YXJ0OworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOyAvLyBkZXZpY2UgSS9PIGFkZHJlc3MKKworI2Vsc2UKKworCXBtZW1fc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSk7CisJcG1lbV9sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDEpOworCXBtZW1fZmxhZ3MgPSBwY2lfcmVzb3VyY2VfZmxhZ3MgKHBkZXYsIDEpOworCisJaWYgKCEocG1lbV9mbGFncyAmIElPUkVTT1VSQ0VfTUVNKSkgeworCQlETUVTRygicmVnaW9uICMxIG5vdCBhIE1NSU8gcmVzb3VyY2UsIGFib3J0aW5nIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvL0RNRVNHKCJNZW1vcnkgbWFwcGVkIHNwYWNlIEAgMHglMDhseCAiLCBwbWVtX3N0YXJ0KTsKKwlpZiggISByZXF1ZXN0X21lbV9yZWdpb24ocG1lbV9zdGFydCwgcG1lbV9sZW4sIFJUTDgxODBfTU9EVUxFX05BTUUpKSB7CisJCURNRVNHKCJyZXF1ZXN0X21lbV9yZWdpb24gZmFpbGVkISIpOworCQlnb3RvIGZhaWw7CisJfQorCisKKwlpb2FkZHIgPSAodW5zaWduZWQgbG9uZylpb3JlbWFwX25vY2FjaGUoIHBtZW1fc3RhcnQsIHBtZW1fbGVuKTsKKwlpZiggaW9hZGRyID09ICh1bnNpZ25lZCBsb25nKU5VTEwgKXsKKwkJRE1FU0coImlvcmVtYXAgZmFpbGVkISIpOworCSAgICAgICAvLyByZWxlYXNlX21lbV9yZWdpb24oIHBtZW1fc3RhcnQsIHBtZW1fbGVuICk7CisJCWdvdG8gZmFpbDE7CisJfQorCisJZGV2LT5tZW1fc3RhcnQgPSBpb2FkZHI7IC8vIHNoYXJlZCBtZW0gc3RhcnQKKwlkZXYtPm1lbV9lbmQgPSBpb2FkZHIgKyBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApOyAvLyBzaGFyZWQgbWVtIGVuZAorCisjZW5kaWYgLy9lbmQgI2lmZGVmIFJUTF9JT19NQVAKKworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCS8vcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHgwNSwgcHRyKTsKKwkvL3BjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDA1LCAoKnB0cikgJiAofjB4MDQpKTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDA1LCAmdW5pdCk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4MDUsIHVuaXQgJiAofjB4MDQpKTsKKyNlbmRpZgorCisJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisJcHJpdi0+aXJxID0gMDsKKworCWRldi0+b3BlbiA9IHJ0bDgxODBfb3BlbjsKKwlkZXYtPnN0b3AgPSBydGw4MTgwX2Nsb3NlOworCS8vZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBpZWVlODAyMTFfeG1pdDsKKwlkZXYtPnR4X3RpbWVvdXQgPSBydGw4MTgwX3Jlc3RhcnQ7CisJZGV2LT53aXJlbGVzc19oYW5kbGVycyA9ICZyODE4MF93eF9oYW5kbGVyc19kZWY7CisJZGV2LT5kb19pb2N0bCA9IHJ0bDgxODBfaW9jdGw7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSByODE4MF9zZXRfbXVsdGljYXN0OworCWRldi0+c2V0X21hY19hZGRyZXNzID0gcjgxODBfc2V0X21hY19hZHI7CisKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTIKKyNpZiBXSVJFTEVTU19FWFQgPCAxNworCWRldi0+Z2V0X3dpcmVsZXNzX3N0YXRzID0gcjgxODBfZ2V0X3dpcmVsZXNzX3N0YXRzOworI2VuZGlmCisJZGV2LT53aXJlbGVzc19oYW5kbGVycyA9IChzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgKikgJnI4MTgwX3d4X2hhbmRsZXJzX2RlZjsKKyNlbmRpZgorCisJZGV2LT50eXBlPUFSUEhSRF9FVEhFUjsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gSFoqMzsgLy9hZGRlZCBieSBkYXZpZCB3b28sIDIwMDcuMTIuMTMKKworCWlmIChkZXZfYWxsb2NfbmFtZShkZXYsIGlmbmFtZSkgPCAwKXsKKyAgICAgICAgICAgICAgICBETUVTRygiT29wczogZGV2bmFtZSBhbHJlYWR5IHRha2VuISBUcnlpbmcgd2xhbiUlZC4uLlxuIik7CisJCWlmbmFtZSA9ICJ3bGFuJWQiOworCS8vCWlmbmFtZSA9ICJhdGglZCI7CisJCWRldl9hbGxvY19uYW1lKGRldiwgaWZuYW1lKTsKKyAgICAgICAgfQorCisKKwlpZihydGw4MTgwX2luaXQoZGV2KSE9MCl7CisJCURNRVNHKCJJbml0aWFsaXphdGlvbiBmYWlsZWQiKTsKKwkJZ290byBmYWlsMTsKKwl9CisKKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCisJcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisKKwlydGw4MTgwX3Byb2NfaW5pdF9vbmUoZGV2KTsKKworCURNRVNHKCJEcml2ZXIgcHJvYmUgY29tcGxldGVkXG4iKTsKKwlyZXR1cm4gMDsKKworZmFpbDE6CisKKyNpZmRlZiBDT05GSUdfUlRMODE4MF9JT19NQVAKKworCWlmKCBkZXYtPmJhc2VfYWRkciAhPSAwICl7CisKKwkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsCisJICAgICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkgKTsKKwl9CisjZWxzZQorCWlmKCBkZXYtPm1lbV9zdGFydCAhPSAodW5zaWduZWQgbG9uZylOVUxMICl7CisJCWlvdW5tYXAoICh2b2lkICopZGV2LT5tZW1fc3RhcnQgKTsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKCBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSksCisJCQkJICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSkgKTsKKwl9CisjZW5kaWYgLy9lbmQgI2lmZGVmIFJUTF9JT19NQVAKKworCitmYWlsOgorCWlmKGRldil7CisKKwkJaWYgKHByaXYtPmlycSkgeworCQkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJCQlkZXYtPmlycT0wOworCQl9CisJCWZyZWVfaWVlZTgwMjExKGRldik7CisJfQorCisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCisJRE1FU0coIndsYW4gZHJpdmVyIGxvYWQgZmFpbGVkXG4iKTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJcmV0dXJuIC1FTk9ERVY7CisKK30KKworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgcnRsODE4MF9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisgCWlmKGRldil7CisKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKworCQlwcml2PWllZWU4MDIxMV9wcml2KGRldik7CisKKwkJcnRsODE4MF9wcm9jX3JlbW92ZV9vbmUoZGV2KTsKKwkJcnRsODE4MF9kb3duKGRldik7CisJCXByaXYtPnJmX2Nsb3NlKGRldik7CisJCXJ0bDgxODBfcmVzZXQoZGV2KTsKKwkJLy9ydGw4MTgwX3J0eF9kaXNhYmxlKGRldik7CisJCS8vcnRsODE4MF9pcnFfZGlzYWJsZShkZXYpOworCQltZGVsYXkoMTApOworCQkvL3dyaXRlX25pY193b3JkKGRldixJTlRBLHJlYWRfbmljX3dvcmQoZGV2LElOVEEpKTsKKwkJLy9mb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCQkvL21kZWxheSgxMCk7CisKKwkJaWYocHJpdi0+aXJxKXsKKworCQkJRE1FU0coIkZyZWVpbmcgaXJxICVkIixkZXYtPmlycSk7CisJCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkJCXByaXYtPmlycT0wOworCisJCX0KKworCQlmcmVlX3J4X2Rlc2NfcmluZyhkZXYpOworCQlmcmVlX3R4X2Rlc2NfcmluZ3MoZGV2KTsKKwkvLwlmcmVlX2JlYWNvbl9kZXNjX3JpbmcoZGV2LHByaXYtPnR4YmVhY29uY291bnQpOworCisjaWZkZWYgQ09ORklHX1JUTDgxODBfSU9fTUFQCisKKwkJaWYoIGRldi0+YmFzZV9hZGRyICE9IDAgKXsKKworCQkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsCisJCQkJICAgICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkgKTsKKwkJfQorI2Vsc2UKKwkJaWYoIGRldi0+bWVtX3N0YXJ0ICE9ICh1bnNpZ25lZCBsb25nKU5VTEwgKXsKKwkJCWlvdW5tYXAoICh2b2lkICopZGV2LT5tZW1fc3RhcnQgKTsKKwkJCXJlbGVhc2VfbWVtX3JlZ2lvbiggcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpLAorCQkJCQkgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAxKSApOworCQl9CisjZW5kaWYgLyplbmQgI2lmZGVmIFJUTF9JT19NQVAqLworCisJCWZyZWVfaWVlZTgwMjExKGRldik7CisJfQorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKworCURNRVNHKCJ3bGFuIGRyaXZlciByZW1vdmVkXG4iKTsKK30KKworCisvKiBmdW4gd2l0aCB0aGUgYnVpbHQtaW4gaWVlZTgwMjExIHN0YWNrLi4uICovCitleHRlcm4gaW50IGllZWU4MDIxMV9jcnlwdG9faW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9jcnlwdG9fZGVpbml0KHZvaWQpOworZXh0ZXJuIGludCBpZWVlODAyMTFfY3J5cHRvX3RraXBfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9jcnlwdG9fdGtpcF9leGl0KHZvaWQpOworZXh0ZXJuIGludCBpZWVlODAyMTFfY3J5cHRvX2NjbXBfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9jcnlwdG9fY2NtcF9leGl0KHZvaWQpOworZXh0ZXJuIGludCBpZWVlODAyMTFfY3J5cHRvX3dlcF9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX2NyeXB0b193ZXBfZXhpdCh2b2lkKTsKKworc3RhdGljIGludCBfX2luaXQgcnRsODE4MF9wY2lfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaWVlZTgwMjExX2NyeXB0b19pbml0KCk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgImllZWU4MDIxMV9jcnlwdG9faW5pdCgpIGZhaWxlZCAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0ID0gaWVlZTgwMjExX2NyeXB0b190a2lwX2luaXQoKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiaWVlZTgwMjExX2NyeXB0b190a2lwX2luaXQoKSBmYWlsZWQgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCXJldCA9IGllZWU4MDIxMV9jcnlwdG9fY2NtcF9pbml0KCk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgImllZWU4MDIxMV9jcnlwdG9fY2NtcF9pbml0KCkgZmFpbGVkICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXQgPSBpZWVlODAyMTFfY3J5cHRvX3dlcF9pbml0KCk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgImllZWU4MDIxMV9jcnlwdG9fd2VwX2luaXQoKSBmYWlsZWQgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiXG5MaW51eCBrZXJuZWwgZHJpdmVyIGZvciBSVEw4MTgwIFwKKy8gUlRMODE4NSBiYXNlZCBXTEFOIGNhcmRzXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSwgQW5kcmVhIE1lcmVsbG9cbiIpOworCURNRVNHKCJJbml0aWFsaXppbmcgbW9kdWxlIik7CisJRE1FU0coIldpcmVsZXNzIGV4dGVuc2lvbnMgdmVyc2lvbiAlZCIsIFdJUkVMRVNTX0VYVCk7CisJcnRsODE4MF9wcm9jX21vZHVsZV9pbml0KCk7CisKKyNpZihMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjIpKQorICAgICAgaWYoMCE9cGNpX21vZHVsZV9pbml0KCZydGw4MTgwX3BjaV9kcml2ZXIpKQorI2Vsc2UKKyAgICAgIGlmKDAhPXBjaV9yZWdpc3Rlcl9kcml2ZXIoJnJ0bDgxODBfcGNpX2RyaXZlcikpCisjZW5kaWYKKwkvL2lmKDAhPXBjaV9tb2R1bGVfaW5pdCgmcnRsODE4MF9wY2lfZHJpdmVyKSkKKwl7CisJCURNRVNHKCJObyBkZXZpY2UgZm91bmQiKTsKKwkJLypwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgKCZydGw4MTgwX3BjaV9kcml2ZXIpOyovCisJCXJldHVybiAtRU5PREVWOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgcnRsODE4MF9wY2lfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgKCZydGw4MTgwX3BjaV9kcml2ZXIpOworCXJ0bDgxODBfcHJvY19tb2R1bGVfcmVtb3ZlKCk7CisJaWVlZTgwMjExX2NyeXB0b19kZWluaXQoKTsKKwlpZWVlODAyMTFfY3J5cHRvX3RraXBfZXhpdCgpOworCWllZWU4MDIxMV9jcnlwdG9fY2NtcF9leGl0KCk7CisJaWVlZTgwMjExX2NyeXB0b193ZXBfZXhpdCgpOworCURNRVNHKCJFeGl0aW5nIik7Cit9CisKKwordm9pZCBydGw4MTgwX3RyeV93YWtlX3F1ZXVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwcmkpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzaG9ydCBlbm91Z2hfZGVzYzsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+dHhfbG9jayxmbGFncyk7CisJZW5vdWdoX2Rlc2MgPSBjaGVja19uaWNfZW5vdWdodF9kZXNjKGRldixwcmkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xvY2ssZmxhZ3MpOworCisJaWYoZW5vdWdoX2Rlc2MpCisJCWllZWU4MDIxMV93YWtlX3F1ZXVlKHByaXYtPmllZWU4MDIxMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1JUlEgU1RVRkYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBydGw4MTgwX3R4X2lzcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcHJpLHNob3J0IGVycm9yKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXUzMiAqdGFpbDsgLy90YWlsIHZpcnR1YWwgYWRkcgorCXUzMiAqaGVhZDsgLy9oZWFkIHZpcnR1YWwgYWRkcgorCXUzMiAqYmVnaW47Ly9zdGFydCBvZiByaW5nIHZpcnR1YWwgYWRkcgorCXUzMiAqbmljdjsgLy9uaWMgcG9pbnRlciB2aXJ0dWFsIGFkZHIKKy8vCXUzMiAqdHhkdjsgLy9wYWNrZXQganVzdCBUWGVkCisJdTMyIG5pYzsgLy9uaWMgcG9pbnRlciBwaHlzaWNhbCBhZGRyCisJdTMyIG5pY2JlZ2luOy8vIHN0YXJ0IG9mIHJpbmcgcGh5c2ljYWwgYWRkcgorLy8Jc2hvcnQgdHhlZDsKKwl1bnNpZ25lZCBsb25nIGZsYWc7CisJLyogcGh5c2ljYWwgYWRkciBhcmUgb2sgb24gMzIgYml0cyBzaW5jZSB3ZSBzZXQgRE1BIG1hc2sqLworCisJaW50IG9mZnM7CisJaW50IGosaTsKKwlpbnQgaGQ7CisJaWYgKGVycm9yKSBwcml2LT5zdGF0cy50eHJldHJ5Kys7IC8vdG9ueSAyMDA2MDYwMQorCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT50eF9sb2NrLGZsYWcpOworCXN3aXRjaChwcmkpIHsKKwljYXNlIE1BTkFHRV9QUklPUklUWToKKwkJdGFpbCA9IHByaXYtPnR4bWFwcmluZ3RhaWw7CisJCWJlZ2luID0gcHJpdi0+dHhtYXByaW5nOworCQloZWFkID0gcHJpdi0+dHhtYXByaW5naGVhZDsKKwkJbmljID0gcmVhZF9uaWNfZHdvcmQoZGV2LFRYX01BTkFHRVBSSU9SSVRZX1JJTkdfQUREUik7CisJCW5pY2JlZ2luID0gcHJpdi0+dHhtYXByaW5nZG1hOworCQlicmVhazsKKworCWNhc2UgQktfUFJJT1JJVFk6CisJCXRhaWwgPSBwcml2LT50eGJrcHJpbmd0YWlsOworCQliZWdpbiA9IHByaXYtPnR4YmtwcmluZzsKKwkJaGVhZCA9IHByaXYtPnR4YmtwcmluZ2hlYWQ7CisJCW5pYyA9IHJlYWRfbmljX2R3b3JkKGRldixUWF9CS1BSSU9SSVRZX1JJTkdfQUREUik7CisJCW5pY2JlZ2luID0gcHJpdi0+dHhia3ByaW5nZG1hOworCQlicmVhazsKKworCWNhc2UgQkVfUFJJT1JJVFk6CisJCXRhaWwgPSBwcml2LT50eGJlcHJpbmd0YWlsOworCQliZWdpbiA9IHByaXYtPnR4YmVwcmluZzsKKwkJaGVhZCA9IHByaXYtPnR4YmVwcmluZ2hlYWQ7CisJCW5pYyA9IHJlYWRfbmljX2R3b3JkKGRldixUWF9CRVBSSU9SSVRZX1JJTkdfQUREUik7CisJCW5pY2JlZ2luID0gcHJpdi0+dHhiZXByaW5nZG1hOworCQlicmVhazsKKworCWNhc2UgVklfUFJJT1JJVFk6CisJCXRhaWwgPSBwcml2LT50eHZpcHJpbmd0YWlsOworCQliZWdpbiA9IHByaXYtPnR4dmlwcmluZzsKKwkJaGVhZCA9IHByaXYtPnR4dmlwcmluZ2hlYWQ7CisJCW5pYyA9IHJlYWRfbmljX2R3b3JkKGRldixUWF9WSVBSSU9SSVRZX1JJTkdfQUREUik7CisJCW5pY2JlZ2luID0gcHJpdi0+dHh2aXByaW5nZG1hOworCQlicmVhazsKKworCWNhc2UgVk9fUFJJT1JJVFk6CisJCXRhaWwgPSBwcml2LT50eHZvcHJpbmd0YWlsOworCQliZWdpbiA9IHByaXYtPnR4dm9wcmluZzsKKwkJaGVhZCA9IHByaXYtPnR4dm9wcmluZ2hlYWQ7CisJCW5pYyA9IHJlYWRfbmljX2R3b3JkKGRldixUWF9WT1BSSU9SSVRZX1JJTkdfQUREUik7CisJCW5pY2JlZ2luID0gcHJpdi0+dHh2b3ByaW5nZG1hOworCQlicmVhazsKKworCWNhc2UgSElfUFJJT1JJVFk6CisJCXRhaWwgPSBwcml2LT50eGhwcmluZ3RhaWw7CisJCWJlZ2luID0gcHJpdi0+dHhocHJpbmc7CisJCWhlYWQgPSBwcml2LT50eGhwcmluZ2hlYWQ7CisJCW5pYyA9IHJlYWRfbmljX2R3b3JkKGRldixUWF9ISUdIUFJJT1JJVFlfUklOR19BRERSKTsKKwkJbmljYmVnaW4gPSBwcml2LT50eGhwcmluZ2RtYTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9sb2NrLGZsYWcpOworCQlyZXR1cm4gOworCX0KKy8qCURNRVNHKCIleCAlcyAleCAleCIsKChpbnQpbmljICYgMHhmZmYpLzgvNCwKKwkqKHByaXYtPnR4bnByaW5nICsgKChpbnQpbmljJjB4ZmZmKS80LzgpICYgKDE8PDMxKSA/ICJmaWxsZWQiIDogImVtcHR5IiwKKwkocHJpdi0+dHhucHJpbmd0YWlsIC0gcHJpdi0+dHhucHJpbmcpLzgsKHByaXYtPnR4bnByaW5naGVhZCAtCitwcml2LT50eG5wcmluZykvOCk7CisqLworCS8vbmljdiA9ICh1MzIqKSAoKG5pYyAtIG5pY2JlZ2luKSArIChpbnQpYmVnaW4pOworCW5pY3YgPSAodTMyKikgKChuaWMgLSBuaWNiZWdpbikgKyAodTgqKWJlZ2luKTsKKwlpZigoaGVhZCA8PSB0YWlsICYmIChuaWN2ID4gdGFpbCB8fCBuaWN2IDwgaGVhZCkpIHx8CisJCShoZWFkID4gdGFpbCAmJiAobmljdiA+IHRhaWwgJiYgbmljdiA8IGhlYWQpKSl7CisKKwkJCURNRVNHVygibmljIGhhcyBsb3N0IHBvaW50ZXIiKTsKKyNpZmRlZiBERUJVR19UWF9ERVNDCisJCQkvL2NoZWNrX3R4X3JpbmcoZGV2LE5PUk1fUFJJT1JJVFkpOworCQkJY2hlY2tfdHhfcmluZyhkZXYscHJpKTsKKyNlbmRpZgorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jayxmbGFnKTsKKwkJCXJ0bDgxODBfcmVzdGFydChkZXYpOworCQkJcmV0dXJuOworCQl9CisKKwkvKiB3ZSBjaGVjayBhbGwgdGhlIGRlc2NyaXB0b3JzIGJldHdlZW4gdGhlIGhlYWQgYW5kIHRoZSBuaWMsCisJICogYnV0IG5vdCB0aGUgY3VycmVubHkgcG9pbnRlZCBieSB0aGUgbmljICh0aGUgbmV4dCB0byBiZSB0eGVkKQorCSAqIGFuZCB0aGUgcHJldmlvdXMgb2YgdGhlIHBvaW50ZWQgKG1pZ2h0IGJlIGluIHByb2Nlc3MgPz8pCisJKi8KKwkvL2lmIChoZWFkID09IG5pYykgcmV0dXJuOworCS8vRE1FU0coIiV4ICV4IixoZWFkLG5pYyk7CisJb2ZmcyA9IChuaWMgLSBuaWNiZWdpbik7CisJLy9ETUVTRygiJXggJXggJXgiLG5pYyAsKHUzMiluaWNiZWdpbiwgKGludCluaWMgLW5pY2JlZ2luKTsKKworCW9mZnMgPSBvZmZzIC8gOCAvNDsKKworCWhkID0gKGhlYWQgLSBiZWdpbikgLzg7CisKKwlpZihvZmZzID49IGhkKQorCQlqID0gb2ZmcyAtIGhkOworCWVsc2UKKwkJaiA9IG9mZnMgKyAocHJpdi0+dHhyaW5nY291bnQgLTEgLWhkKTsKKwkvLwlqPSBwcml2LT50eHJpbmdjb3VudCAtMS0gKGhkIC0gb2Zmcyk7CisKKwlqLT0yOworCWlmKGo8MCkgaj0wOworCisKKwlmb3IoaT0wO2k8ajtpKyspCisJeworLy8JCXByaW50aygiKysrKysrKysrKysrK2NoZWNrIHN0YXR1cyBkZXNjXG4iKTsKKwkJaWYoKCpoZWFkKSAmICgxPDwzMSkpCisJCQlicmVhazsKKwkJaWYoKCgqaGVhZCkmKDB4MTAwMDAwMDApKSAhPSAwKXsKKy8vCQkJcHJpbnRrKCIrKysrKysrKysrKysrK2xhc3QgZGVzYyxyZXRyeSBjb3VudCBpcyAlZFxuIiwoKCpoZWFkKSAmICgweDAwMDAwMGZmKSkpOworCQkJcHJpdi0+Q3VyclJldHJ5Q250ICs9ICh1MTYpKCgqaGVhZCkgJiAoMHgwMDAwMDBmZikpOworI2lmIDEKKwkJCWlmKCFlcnJvcikKKwkJCXsKKwkJCQlwcml2LT5OdW1UeE9rVG90YWwrKzsKKy8vCQkJCXByaW50aygiTnVtVHhPa1RvdGFsIGlzICVkXG4iLHByaXYtPk51bVR4T2tUb3RhbCsrKTsKKwkJCX0KKyNlbmRpZgorCQkJLy8JcHJpbnRrKCJpbiBmdW5jdGlvbiAlczpjdXJyX3JldHJ5X2NvdW50IGlzICVkXG4iLF9fZnVuY19fLCgoKmhlYWQpICYgKDB4MDAwMDAwZmYpKSk7CisJCX0KKwkJaWYoIWVycm9yKXsKKwkJCXByaXYtPk51bVR4T2tCeXRlc1RvdGFsICs9ICgqKGhlYWQrMykpICYgKDB4MDAwMDBmZmYpOworCQl9CisvLwkJcHJpbnRrKCJpbiBmdW5jdGlvbiAlczpjdXJyX3R4b2tieXRlX2NvdW50IGlzICVkXG4iLF9fZnVuY19fLCgqKGhlYWQrMykpICYgKDB4MDAwMDBmZmYpKTsKKwkJKmhlYWQgPSAqaGVhZCAmfiAoMTw8MzEpOworCisJCWlmKChoZWFkIC0gYmVnaW4pLzggPT0gcHJpdi0+dHhyaW5nY291bnQtMSkKKwkJCWhlYWQ9YmVnaW47CisKKwkJZWxzZQorCQkJaGVhZCs9ODsKKwl9CisjaWYgMAorCWlmKG5pY3YgPT0gYmVnaW4pCisJCXR4ZHYgPSBiZWdpbiArIChwcml2LT50eHJpbmdjb3VudCAtMSkqODsKKwllbHNlCisJCXR4ZHYgPSBuaWN2IC0gODsKKworCXR4ZWQgPSAhKHR4ZHZbMF0gJigxPDwzMSkpOworCisJaWYodHhlZCl7CisJCWlmKCEodHhkdlswXSAmICgxPDwxNSkpKSBlcnJvciA9IDE7CisJCS8vaWYoISh0eGR2WzBdICYgKDE8PDMwKSkpIGVycm9yID0gMTsKKwkJaWYoZXJyb3IpRE1FU0coIiV4Iix0eGR2WzBdKTsKKyAJfQorI2VuZGlmCisJLy9ETUVTRygiJXgiLHR4ZHZbMF0pOworCS8qIHRoZSBoZWFkIGhhcyBiZWVuIG1vdmVkIHRvIHRoZSBsYXN0IGNlcnRhaW5seSBUWGVkCisJICogKG9yIGF0IGxlYXN0IHByb2Nlc3NlZCBieSB0aGUgbmljKSBwYWNrZXQuCisJICogVGhlIGRyaXZlciB0YWtlIGZvcmNlZnVsbHkgb3duaW5nIG9mIGFsbCB0aGVzZSBwYWNrZXRzCisJICogSWYgdGhlIHBhY2tldCBwcmV2aW91cyBvZiB0aGUgbmljIHBvaW50ZXIgaGFzIGJlZW4KKwkgKiBwcm9jZXNzZWQgdGhpcyBkb2Vzbid0IG1hdHRlcjogaXQgd2lsbCBiZSBjaGVja2VkCisJICogaGVyZSBhdCB0aGUgbmV4dCByb3VuZC4gQW55d2F5IGlmIG5vIG1vcmUgcGFja2V0IGFyZQorCSAqIFRYZWQgbm8gbWVtb3J5IGxlYWsgb2Njb3VyIGF0IGFsbC4KKwkgKi8KKworCXN3aXRjaChwcmkpIHsKKwljYXNlIE1BTkFHRV9QUklPUklUWToKKwkJcHJpdi0+dHhtYXByaW5naGVhZCA9IGhlYWQ7CisJCQkvL3ByaW50aygiMT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT4gcHJpb3JpdHkgY2hlY2shXG4iKTsKKwkJaWYocHJpdi0+YWNrX3R4X3RvX2llZWUpeworCQkJCS8vIHRyeSB0byBpbXBsZW1lbnQgcG93ZXItc2F2ZSBtb2RlIDIwMDguMS4yMgorCQkvLwlwcmludGsoIjI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0+IHByaW9yaXR5IGNoZWNrIVxuIik7CisjaWYgMQorCQkJaWYocnRsODE4MF9pc190eF9xdWV1ZV9lbXB0eShkZXYpKXsKKwkJCS8vCXByaW50aygidHggcXVldWUgZW1wdHksIGFmdGVyIHNlbmQgbnVsbCBzbGVlcCBwYWNrZXQsIHRyeSB0byBzbGVlcCAhXG4iKTsKKwkJCQlwcml2LT5hY2tfdHhfdG9faWVlZSA9IDA7CisJCQkJaWVlZTgwMjExX3BzX3R4X2Fjayhwcml2LT5pZWVlODAyMTEsIWVycm9yKTsKKwkJCX0KKyNlbmRpZgorCQl9CisJCWJyZWFrOworCisJY2FzZSBCS19QUklPUklUWToKKwkJcHJpdi0+dHhia3ByaW5naGVhZCA9IGhlYWQ7CisJCWJyZWFrOworCisJY2FzZSBCRV9QUklPUklUWToKKwkJcHJpdi0+dHhiZXByaW5naGVhZCA9IGhlYWQ7CisJCWJyZWFrOworCisJY2FzZSBWSV9QUklPUklUWToKKwkJcHJpdi0+dHh2aXByaW5naGVhZCA9IGhlYWQ7CisJCWJyZWFrOworCisJY2FzZSBWT19QUklPUklUWToKKwkJcHJpdi0+dHh2b3ByaW5naGVhZCA9IGhlYWQ7CisJCWJyZWFrOworCisJY2FzZSBISV9QUklPUklUWToKKwkJcHJpdi0+dHhocHJpbmdoZWFkID0gaGVhZDsKKwkJYnJlYWs7CisJfQorCisJLypETUVTRygiJXggJXggJXgiLCAocHJpdi0+dHhucHJpbmdoZWFkIC0gcHJpdi0+dHhucHJpbmcpIC84ICwKKwkJKHByaXYtPnR4bnByaW5ndGFpbCAtIHByaXYtPnR4bnByaW5nKSAvOCwKKwkJb2ZmcyApOworCSovCisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9sb2NrLGZsYWcpOworCit9CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkpCit2b2lkIHJ0bDgxODBfdHhfaXJxX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwkvL3N0cnVjdCByODE4MF9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByODE4MF9wcml2LCByZXNldF93cSk7CisgICAgICAgIHN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrID0gY29udGFpbmVyX29mKHdvcmssc3RydWN0IGRlbGF5ZWRfd29yayx3b3JrKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqIGllZWUgPSAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqKQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9vZihkd29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIHdhdGNoX2RvZ193cSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsKKyNlbHNlCit2b2lkIHJ0bDgxODBfdHhfaXJxX3dxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLy9zdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisjZW5kaWYKKwlydGw4MTgwX3R4X2lzcihkZXYsTUFOQUdFX1BSSU9SSVRZLDApOworfQoraXJxcmV0dXJuX3QgcnRsODE4MF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqbmV0ZGV2LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIG5ldGRldjsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgaW50YTsKKworCS8qIFdlIHNob3VsZCByZXR1cm4gSVJRX05PTkUsIGJ1dCBmb3Igbm93IGxldCBtZSBrZWVwIHRoaXMgKi8KKwlpZihwcml2LT5pcnFfZW5hYmxlZCA9PSAwKSByZXR1cm4gSVJRX0hBTkRMRUQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+aXJxX3RoX2xvY2ssZmxhZ3MpOworCisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisJLy9JU1I6IDRieXRlcworCWludGEgPSByZWFkX25pY19kd29yZChkZXYsIElTUik7Ly8gJiBwcml2LT5JbnRyTWFzazsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LElTUixpbnRhKTsgLy8gcmVzZXQgaW50IHNpdHVhdGlvbgorI2Vsc2UKKwlpbnRhID0gcmVhZF9uaWNfd29yZChkZXYsSU5UQSkgJiBwcml2LT5pcnFfbWFzazsKKwl3cml0ZV9uaWNfd29yZChkZXYsSU5UQSxpbnRhKTsgLy8gcmVzZXQgaW50IHNpdHVhdGlvbgorI2VuZGlmCisKKwlwcml2LT5zdGF0cy5zaGludHMrKzsKKworCS8vRE1FU0coIkVudGVyIGludGVycnVwdCwgSVNSIHZhbHVlID0gMHglMDh4IiwgaW50YSk7CisKKwlpZighaW50YSl7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmlycV90aF9sb2NrLGZsYWdzKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCS8qCisJICAgbW9zdCBwcm9iYWJseSB3ZSBjYW4gc2FmZWx5IHJldHVybiBJUlFfTk9ORSwKKwkgICBidXQgZm9yIG5vdyBpcyBiZXR0ZXIgdG8gYXZvaWQgcHJvYmxlbXMKKwkqLworCX0KKworCWlmKGludGEgPT0gMHhmZmZmKXsKKwkJCS8qIEhXIGRpc2FwcGFyZWQgKi8KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmlycV90aF9sb2NrLGZsYWdzKTsKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlwcml2LT5zdGF0cy5pbnRzKys7CisjaWZkZWYgREVCVUdfSVJRCisJRE1FU0coIk5JQyBpcnEgJXgiLGludGEpOworI2VuZGlmCisJLy9wcml2LT5pcnFwZW5kaW5nID0gaW50YTsKKworCisJaWYoIW5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5pcnFfdGhfbG9jayxmbGFncyk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlpZihpbnRhICYgSVNSX1RpbWVPdXQpeworCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBUaW1lckludCwgMCk7CisJCS8vRE1FU0coIj09PT09PT09PT09PT09PT09Pndha2luZyB1cCIpOworLy8JCXJ0bDgxODBfaHdfd2FrZXVwKGRldik7CisJfQorCisJaWYoaW50YSAmIElTUl9UQkRPSyl7CisJCXByaXYtPnN0YXRzLnR4YmVhY29uKys7CisJfQorCisJaWYoaW50YSAmIElTUl9UQkRFUil7CisJCXByaXYtPnN0YXRzLnR4YmVhY29uZXJyKys7CisJfQorCisJaWYoaW50YSAgJiBJTVJfVE1HRE9LICkgeworLy8JCXByaXYtPk51bVR4T2tUb3RhbCsrOworCQlydGw4MTgwX3R4X2lzcihkZXYsTUFOQUdFX1BSSU9SSVRZLDApOworLy8JCQlzY2hlZHVsZV93b3JrKCZwcml2LT50eF9pcnFfd3EpOworCisJfQorCisJaWYoaW50YSAmIElTUl9USFBERVIpeworI2lmZGVmIERFQlVHX1RYCisJCURNRVNHICgiVFggaGlnaCBwcmlvcml0eSBFUlIiKTsKKyNlbmRpZgorCQlwcml2LT5zdGF0cy50eGhwZXJyKys7CisJCXJ0bDgxODBfdHhfaXNyKGRldixISV9QUklPUklUWSwxKTsKKwkJcHJpdi0+aWVlZTgwMjExLT5zdGF0cy50eF9lcnJvcnMrKzsKKwl9CisKKwlpZihpbnRhICYgSVNSX1RIUERPSyl7IC8vSGlnaCBwcmlvcml0eSB0eCBvaworI2lmZGVmIERFQlVHX1RYCisJCURNRVNHICgiVFggaGlnaCBwcmlvcml0eSBPSyIpOworI2VuZGlmCisvLwkJcHJpdi0+TnVtVHhPa1RvdGFsKys7CisJCS8vcHJpdi0+TnVtVHhPa0luUGVyaW9kKys7ICAvL1lKLGRlbCwwODA4MjgKKwkJcHJpdi0+bGlua19kZXRlY3QuTnVtVHhPa0luUGVyaW9kKys7IC8vWUosYWRkLDA4MDgyOAorCQlwcml2LT5zdGF0cy50eGhwb2tpbnQrKzsKKwkJcnRsODE4MF90eF9pc3IoZGV2LEhJX1BSSU9SSVRZLDApOworCX0KKworCWlmKGludGEgJiBJU1JfUkVSKSB7CisJCXByaXYtPnN0YXRzLnJ4ZXJyKys7CisjaWZkZWYgREVCVUdfUlgKKwkJRE1FU0dXKCJSWCBlcnJvciBpbnQiKTsKKyNlbmRpZgorCX0KKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKwlpZihpbnRhICYgSVNSX1RCS0RFUil7IC8vY29ycmVzcG9uZGluZyB0byBCS19QUklPUklUWQorCQlwcml2LT5zdGF0cy50eGJrcGVycisrOworCQlwcml2LT5pZWVlODAyMTEtPnN0YXRzLnR4X2Vycm9ycysrOworI2lmZGVmIERFQlVHX1RYCisJCURNRVNHVygiVFggYmtwIGVycm9yIGludCIpOworI2VuZGlmCisJCS8vdGFza2xldF9zY2hlZHVsZSgmcHJpdi0+aXJxX3R4X3Rhc2tsZXQpOworCQlydGw4MTgwX3R4X2lzcihkZXYsQktfUFJJT1JJVFksMSk7CisJCXJ0bDgxODBfdHJ5X3dha2VfcXVldWUoZGV2LCBCRV9QUklPUklUWSk7CisJfQorCisJaWYoaW50YSAmIElTUl9UQkVERVIpeyAvL2NvcnJlc3BvbmRpbmcgdG8gQkVfUFJJT1JJVFkKKwkJcHJpdi0+c3RhdHMudHhiZXBlcnIrKzsKKwkJcHJpdi0+aWVlZTgwMjExLT5zdGF0cy50eF9lcnJvcnMrKzsKKyNpZmRlZiBERUJVR19UWAorCQlETUVTR1coIlRYIGJlcCBlcnJvciBpbnQiKTsKKyNlbmRpZgorCQlydGw4MTgwX3R4X2lzcihkZXYsQkVfUFJJT1JJVFksMSk7CisJCS8vdGFza2xldF9zY2hlZHVsZSgmcHJpdi0+aXJxX3R4X3Rhc2tsZXQpOworCQlydGw4MTgwX3RyeV93YWtlX3F1ZXVlKGRldiwgQkVfUFJJT1JJVFkpOworCX0KKyNlbmRpZgorCWlmKGludGEgJiBJU1JfVE5QREVSKXsgLy9jb3JyZXNwb25kaW5nIHRvIFZPX1BSSU9SSVRZCisJCXByaXYtPnN0YXRzLnR4bnBlcnIrKzsKKwkJcHJpdi0+aWVlZTgwMjExLT5zdGF0cy50eF9lcnJvcnMrKzsKKyNpZmRlZiBERUJVR19UWAorCQlETUVTR1coIlRYIG5wIGVycm9yIGludCIpOworI2VuZGlmCisJCS8vdGFza2xldF9zY2hlZHVsZSgmcHJpdi0+aXJxX3R4X3Rhc2tsZXQpOworCQlydGw4MTgwX3R4X2lzcihkZXYsTk9STV9QUklPUklUWSwxKTsKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKwkJcnRsODE4MF90cnlfd2FrZV9xdWV1ZShkZXYsIE5PUk1fUFJJT1JJVFkpOworI2VuZGlmCisJfQorCisJaWYoaW50YSAmIElTUl9UTFBERVIpeyAvL2NvcnJlc3BvbmRpbmcgdG8gVklfUFJJT1JJVFkKKwkJcHJpdi0+c3RhdHMudHhscGVycisrOworCQlwcml2LT5pZWVlODAyMTEtPnN0YXRzLnR4X2Vycm9ycysrOworI2lmZGVmIERFQlVHX1RYCisJCURNRVNHVygiVFggbHAgZXJyb3IgaW50Iik7CisjZW5kaWYKKwkJcnRsODE4MF90eF9pc3IoZGV2LExPV19QUklPUklUWSwxKTsKKwkJLy90YXNrbGV0X3NjaGVkdWxlKCZwcml2LT5pcnFfdHhfdGFza2xldCk7CisJCXJ0bDgxODBfdHJ5X3dha2VfcXVldWUoZGV2LCBMT1dfUFJJT1JJVFkpOworCX0KKworCWlmKGludGEgJiBJU1JfUk9LKXsKKyNpZmRlZiBERUJVR19SWAorCQlETUVTRygiRnJhbWUgYXJyaXZlZCAhIik7CisjZW5kaWYKKwkJLy9wcml2LT5OdW1SeE9rSW5QZXJpb2QrKzsgIC8vWUosZGVsLDA4MDgyOAorCQlwcml2LT5zdGF0cy5yeGludCsrOworCQl0YXNrbGV0X3NjaGVkdWxlKCZwcml2LT5pcnFfcnhfdGFza2xldCk7CisJfQorCisJaWYoaW50YSAmIElTUl9SUW9TT0sgKXsKKyNpZmRlZiBERUJVR19SWAorCQlETUVTRygiUW9TIEZyYW1lIGFycml2ZWQgISIpOworI2VuZGlmCisJCS8vcHJpdi0+TnVtUnhPa0luUGVyaW9kKys7ICAvL1lKLGRlbCwwODA4MjgKKwkJcHJpdi0+c3RhdHMucnhpbnQrKzsKKwkJdGFza2xldF9zY2hlZHVsZSgmcHJpdi0+aXJxX3J4X3Rhc2tsZXQpOworCX0KKwlpZihpbnRhICYgSVNSX0JjbkludCkgeworCQkvL0RNRVNHKCJQcmVwYXJpbmcgQmVhY29ucyIpOworCQlydGw4MTgwX3ByZXBhcmVfYmVhY29uKGRldik7CisJfQorCisJaWYoaW50YSAmIElTUl9SRFUpeworLy8jaWZkZWYgREVCVUdfUlgKKwkJRE1FU0dXKCJObyBSWCBkZXNjcmlwdG9yIGF2YWlsYWJsZSIpOworCQlwcml2LT5zdGF0cy5yeHJkdSsrOworLy8jZW5kaWYKKwkJdGFza2xldF9zY2hlZHVsZSgmcHJpdi0+aXJxX3J4X3Rhc2tsZXQpOworCQkvKnF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlICwmcHJpdi0+cmVzdGFydF93b3JrKTsqLworCisJfQorCWlmKGludGEgJiBJU1JfUlhGT1ZXKXsKKyNpZmRlZiBERUJVR19SWAorCQlETUVTR1coIlJYIGZpZm8gb3ZlcmZsb3ciKTsKKyNlbmRpZgorCQlwcml2LT5zdGF0cy5yeG92ZXJmbG93Kys7CisJCXRhc2tsZXRfc2NoZWR1bGUoJnByaXYtPmlycV9yeF90YXNrbGV0KTsKKwkJLy9xdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSAsJnByaXYtPnJlc3RhcnRfd29yayk7CisJfQorCisJaWYoaW50YSAmIElTUl9UWEZPVlcpIHByaXYtPnN0YXRzLnR4b3ZlcmZsb3crKzsKKworCWlmKGludGEgJiBJU1JfVE5QRE9LKXsgLy9Ob3JtYWwgcHJpb3JpdHkgdHggb2sKKyNpZmRlZiBERUJVR19UWAorCQlETUVTRyAoIlRYIG5vcm1hbCBwcmlvcml0eSBPSyIpOworI2VuZGlmCisvLwkJcHJpdi0+TnVtVHhPa1RvdGFsKys7CisJCS8vcHJpdi0+TnVtVHhPa0luUGVyaW9kKys7ICAvL1lKLGRlbCwwODA4MjgKKwkJcHJpdi0+bGlua19kZXRlY3QuTnVtVHhPa0luUGVyaW9kKys7IC8vWUosYWRkLDA4MDgyOAorCQkvLwlwcml2LT5pZWVlODAyMTEtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJcHJpdi0+c3RhdHMudHhucG9raW50Kys7CisJCXJ0bDgxODBfdHhfaXNyKGRldixOT1JNX1BSSU9SSVRZLDApOworCX0KKworCWlmKGludGEgJiBJU1JfVExQRE9LKXsgLy9Mb3cgcHJpb3JpdHkgdHggb2sKKyNpZmRlZiBERUJVR19UWAorCQlETUVTRyAoIlRYIGxvdyBwcmlvcml0eSBPSyIpOworI2VuZGlmCisvLwkJcHJpdi0+TnVtVHhPa1RvdGFsKys7CisJCS8vcHJpdi0+TnVtVHhPa0luUGVyaW9kKys7ICAvL1lKLGRlbCwwODA4MjgKKwkJcHJpdi0+bGlua19kZXRlY3QuTnVtVHhPa0luUGVyaW9kKys7IC8vWUosYWRkLDA4MDgyOAorCQkvLwlwcml2LT5pZWVlODAyMTEtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJcHJpdi0+c3RhdHMudHhscG9raW50Kys7CisJCXJ0bDgxODBfdHhfaXNyKGRldixMT1dfUFJJT1JJVFksMCk7CisJCXJ0bDgxODBfdHJ5X3dha2VfcXVldWUoZGV2LCBMT1dfUFJJT1JJVFkpOworCX0KKworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCWlmKGludGEgJiBJU1JfVEJLRE9LKXsgLy9jb3JyZXNwb25kaW5nIHRvIEJLX1BSSU9SSVRZCisJCXByaXYtPnN0YXRzLnR4Ymtwb2tpbnQrKzsKKyNpZmRlZiBERUJVR19UWAorCQlETUVTR1coIlRYIGJrIHByaW9yaXR5IG9rIik7CisjZW5kaWYKKy8vCQlwcml2LT5OdW1UeE9rVG90YWwrKzsKKwkJLy9wcml2LT5OdW1UeE9rSW5QZXJpb2QrKzsgIC8vWUosZGVsLDA4MDgyOAorCQlwcml2LT5saW5rX2RldGVjdC5OdW1UeE9rSW5QZXJpb2QrKzsgLy9ZSixhZGQsMDgwODI4CisJCXJ0bDgxODBfdHhfaXNyKGRldixCS19QUklPUklUWSwwKTsKKwkJcnRsODE4MF90cnlfd2FrZV9xdWV1ZShkZXYsIEJFX1BSSU9SSVRZKTsKKwl9CisKKwlpZihpbnRhICYgSVNSX1RCRURPSyl7IC8vY29ycmVzcG9uZGluZyB0byBCRV9QUklPUklUWQorCQlwcml2LT5zdGF0cy50eGJlcGVycisrOworI2lmZGVmIERFQlVHX1RYCisJCURNRVNHVygiVFggYmUgcHJpb3JpdHkgb2siKTsKKyNlbmRpZgorLy8JCXByaXYtPk51bVR4T2tUb3RhbCsrOworCQkvL3ByaXYtPk51bVR4T2tJblBlcmlvZCsrOyAgLy9ZSixkZWwsMDgwODI4CisJCXByaXYtPmxpbmtfZGV0ZWN0Lk51bVR4T2tJblBlcmlvZCsrOyAvL1lKLGFkZCwwODA4MjgKKwkJcnRsODE4MF90eF9pc3IoZGV2LEJFX1BSSU9SSVRZLDApOworCQlydGw4MTgwX3RyeV93YWtlX3F1ZXVlKGRldiwgQkVfUFJJT1JJVFkpOworCX0KKyNlbmRpZgorCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+aXJxX3RoX2xvY2ssZmxhZ3MpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKK3ZvaWQgcnRsODE4MF9pcnFfcnhfdGFza2xldChzdHJ1Y3QgcjgxODBfcHJpdiogcHJpdikKK3sKKy8vCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKy8qCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5pcnFfbG9jaywgZmxhZ3MpOworCXByaXYtPmlycV9tYXNrICY9fklNUl9ST0s7CisJcHJpdi0+aXJxX21hc2sgJj1+SU1SX1JEVTsKKworCXJ0bDgxODBfaXJxX2VuYWJsZShwcml2LT5kZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmlycV9sb2NrLCBmbGFncyk7CisqLworCXJ0bDgxODBfcngocHJpdi0+ZGV2KTsKKworLyoJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmlycV9sb2NrLCBmbGFncyk7CisJcHJpdi0+aXJxX21hc2sgfD0gSU1SX1JPSzsKKwlwcml2LT5pcnFfbWFzayB8PSBJTVJfUkRVOworCXJ0bDgxODBfaXJxX2VuYWJsZShwcml2LT5kZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmlycV9sb2NrLCBmbGFncyk7CisqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorbGl6aGFvbWluZy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSRiBwb3dlciBvbi9wb3dlciBvZmYgLS0tLS0tLS0tLS0tLS0tLS0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApKQordm9pZCBHUElPQ2hhbmdlUkZXb3JrSXRlbUNhbGxCYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwkvL3N0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkZWxheWVkX3dvcmssIHdvcmspOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBHUElPQ2hhbmdlUkZXb3JrSXRlbS53b3JrKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWVlZS0+ZGV2OworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKyNlbHNlCit2b2lkIEdQSU9DaGFuZ2VSRldvcmtJdGVtQ2FsbEJhY2soc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisjZW5kaWYKKworCS8vdTE2IHRtcDJieXRlOworCXU4IGJ0UFNSOworCXU4IGJ0Q29uZmlnMDsKKwlSVF9SRl9QT1dFUl9TVEFURQllUmZQb3dlclN0YXRlVG9TZXQ7CisJYm9vbCAJYkFjdHVhbGx5U2V0PWZhbHNlOworCisJY2hhciAqYXJndlszXTsKKyAgICAgICAgc3RhdGljIGNoYXIgKlJhZGlvUG93ZXJQYXRoID0gIi9ldGMvYWNwaS9ldmVudHMvUmFkaW9Qb3dlci5zaCI7CisgICAgICAgIHN0YXRpYyBjaGFyICplbnZwW10gPSB7IkhPTUU9LyIsICJURVJNPWxpbnV4IiwgIlBBVEg9L3Vzci9iaW46L2JpbiIsIE5VTEx9OworCXN0YXRpYyBpbnQgcmVhZGZfY291bnQgPSAwOworCS8vcHJpbnRrKCI9PT09PT09PT09PT0+JXMgaW4gXG4iLCBfX2Z1bmNfXyk7CisKKyNpZmRlZiBFTkFCTEVfTFBTCisJaWYocmVhZGZfY291bnQgJSAxMCA9PSAwKQorCQlwcml2LT5Qb3dlclByb2ZpbGUgPSByZWFkX2FjYWRhcHRlcl9maWxlKCIvcHJvYy9hY3BpL2FjX2FkYXB0ZXIvQUMwL3N0YXRlIik7CisKKwlyZWFkZl9jb3VudCA9IChyZWFkZl9jb3VudCsxKSUweGZmZmY7CisjZW5kaWYKKyNpZiAwCisJaWYocHJpdi0+dXAgPT0gMCkvL2RyaXZlciBzdG9wcGVkCisJCXsKKwkJCXByaW50aygiXG5EbyBub3RoaW5nLi4uIik7CisJCQlnb3RvIG91dDsKKwkJfQorCWVsc2UKKyNlbmRpZgorCQl7CisJCQkvLyBXZSBzaG91bGQgdHVybiBvZmYgTEVEIGJlZm9yZSBwb2xsaW5nIEZGNTFbNF0uCisKKwkJCS8vVHVybiBvZmYgTEVELgorCQkJYnRQU1IgPSByZWFkX25pY19ieXRlKGRldiwgUFNSKTsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgUFNSLCAoYnRQU1IgJiB+QklUMykpOworCisJCQkvL0l0IG5lZWQgdG8gZGVsYXkgNHVzIHN1Z2dlc3RlZCBieSBKb25nLCAyMDA4LTAxLTE2CisJCQl1ZGVsYXkoNCk7CisKKwkJCS8vSFcgcmFkaW8gT24vT2ZmIGFjY29yZGluZyB0byB0aGUgdmFsdWUgb2YgRkY1MVs0XShjb25maWcwKQorCQkJYnRDb25maWcwID0gYnRQU1IgPSByZWFkX25pY19ieXRlKGRldiwgQ09ORklHMCk7CisKKwkJCS8vVHVybiBvbiBMRUQuCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFBTUiwgYnRQU1J8IEJJVDMpOworCisJCQllUmZQb3dlclN0YXRlVG9TZXQgPSAoYnRDb25maWcwICYgQklUNCkgPyAgZVJmT24gOiBlUmZPZmY7CisKKwkJCWlmKChwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmID09IHRydWUpICYmIChlUmZQb3dlclN0YXRlVG9TZXQgPT0gZVJmT24pKQorCQkJeworCQkJCXByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYgPSBmYWxzZTsKKwkJCQliQWN0dWFsbHlTZXQgPSB0cnVlOworCQkJfQorCQkJZWxzZSBpZigocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZiA9PSBmYWxzZSkgJiYgKGVSZlBvd2VyU3RhdGVUb1NldCA9PSBlUmZPZmYpKQorCQkJeworCQkJCXByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYgPSB0cnVlOworCQkJCWJBY3R1YWxseVNldCA9IHRydWU7CisJCQl9CisKKwkJCWlmKGJBY3R1YWxseVNldCkKKwkJCXsKKwkJCQlNZ250QWN0U2V0X1JGX1N0YXRlKGRldiwgZVJmUG93ZXJTdGF0ZVRvU2V0LCBSRl9DSEFOR0VfQllfSFcpOworCisJCQkJLyogVG8gdXBkYXRlIHRoZSBVSSBzdGF0dXMgZm9yIFBvd2VyIHN0YXR1cyBjaGFuZ2VkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYgPT0gdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd2WzFdID0gIlJGT0ZGIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmKCFwcml2LT5SZk9mZlJlYXNvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZbMV0gPSAiUkZPTiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICBhcmd2WzFdID0gIlJGT0ZGIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd2WzBdID0gUmFkaW9Qb3dlclBhdGg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZbMl0gPSBOVUxMOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxfdXNlcm1vZGVoZWxwZXIoUmFkaW9Qb3dlclBhdGgsYXJndixlbnZwLDEpOworCQkJfQorCisJCX0KKworfQorCitzdGF0aWMgdTggcmVhZF9hY2FkYXB0ZXJfZmlsZShjaGFyICpmaWxlbmFtZSkKK3sKKy8vI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIxKSkKKyNpZiAwCisJaW50IGZkOworCWNoYXIgYnVmWzFdOworCWNoYXIgcmV0WzUwXTsKKwlpbnQgaSA9IDA7CisJaW50IG4gPSAwOworCW1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKworCWZkID0gc3lzX29wZW4oZmlsZW5hbWUsIE9fUkRPTkxZLCAwKTsKKwlpZiAoZmQgPj0gMCkgeworCQl3aGlsZSAoc3lzX3JlYWQoZmQsIGJ1ZiwgMSkgPT0gMSkKKwkJeworCQkJaSsrOworCQkJaWYoaT4xMCkKKwkJCXsKKwkJCQlpZihidWZbMF0hPScgJykKKwkJCQl7CisJCQkJCXJldFtuXT1idWZbMF07CisJCQkJCW4rKzsKKwkJCQl9CisJCQl9CisJCX0KKwkJc3lzX2Nsb3NlKGZkKTsKKwl9CisJcmV0W25dPSdcMCc7CisvLwlwcmludGsoIiVzIFxuIiwgcmV0KTsKKwlzZXRfZnMob2xkX2ZzKTsKKworCWlmKHN0cm5jbXAocmV0LCAib2ZmLWxpbmUiLDgpID09IDApCisJeworCQlyZXR1cm4gMTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tIG1vZHVsZSBpbml0IC8gZXhpdCBzdHVicyAtLS0tLS0tLS0tLS0tLS0tCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworbW9kdWxlX2luaXQocnRsODE4MF9wY2lfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQocnRsODE4MF9wY2lfbW9kdWxlX2V4aXQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2RtLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2RtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQyZGMxMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfZG0uYwpAQCAtMCwwICsxLDE3MjUgQEAKKy8vI2luY2x1ZGUgInI4MTgwLmgiDQorI2luY2x1ZGUgInI4MTgwX2RtLmgiDQorI2luY2x1ZGUgInI4MTgwX2h3LmgiDQorI2luY2x1ZGUgInI4MTgwXzkzY3g2LmgiDQorLy97YnkgYW15IDA4MDMxMg0KKw0KKy8vDQorLy8JRGVzY3JpcHRpb246DQorLy8JCVJldHVybiBUUlVFIGlmIHdlIHNoYWxsIHBlcmZvcm0gSGlnaCBQb3dlciBNZWNhaG5pc20sIEZBTFNFIG90aGVyd2lzZS4JDQorLy8NCisvLytieSBhbXkgMDgwMzEyDQorI2RlZmluZSBSQVRFX0FEQVBUSVZFX1RJTUVSX1BFUklPRCAgICAgIDMwMA0KKw0KK2Jvb2wgQ2hlY2tIaWdoUG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikNCit7DQorCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsNCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBwcml2LT5pZWVlODAyMTE7DQorDQorCWlmKCFwcml2LT5iUmVnSGlnaFBvd2VyTWVjaGFuaXNtKQ0KKwl7DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisJCQ0KKwlpZihpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEX1NDQU5OSU5HKQ0KKwl7DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJcmV0dXJuIHRydWU7DQorfQ0KKw0KKy8vDQorLy8JRGVzY3JpcHRpb246DQorLy8JCVVwZGF0ZSBUeCBwb3dlciBsZXZlbCBpZiBuZWNlc3NhcnkuDQorLy8JCVNlZSBhbHNvIERvUnhIaWdoUG93ZXIoKSBhbmQgU2V0VHhQb3dlckxldmVsODE4NSgpIGZvciByZWZlcmVuY2UuDQorLy8NCisvLwlOb3RlOg0KKy8vCQlUaGUgcmVhc29uIHdoeSB3ZSB1ZHBhdGUgVHggcG93ZXIgbGV2ZWwgaGVyZSBpbnN0ZWFkIG9mIERvUnhIaWdoUG93ZXIoKSANCisvLwkJaXMgdGhlIG51bWJlciBvZiBJTyB0byBjaGFuZ2UgVHggcG93ZXIgaXMgbXVjaCBtb3JlIHRoYW4gY2hhbmUgVFIgc3dpdGNoIA0KKy8vCQlhbmQgdGhleSBhcmUgcmVsYXRlZCB0byBPRkRNIGFuZCBNQUMgcmVnaXN0ZXJzLiANCisvLwkJU28sIHdlIGRvbid0IHdhbnQgdG8gdXBkYXRlIGl0IHNvIGZyZXF1ZW50bHkgaW4gcGVyLVJ4IHBhY2tldCBiYXNlLiANCisvLw0KK3ZvaWQNCitEb1R4SGlnaFBvd2VyKA0KKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2DQorCSkNCit7DQorCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsNCisJdTE2CQkJSGlQd3JVcHBlclRoID0gMDsNCisJdTE2CQkJSGlQd3JMb3dlclRoID0gMDsNCisJdTgJCQlSU1NJSGlQd3JVcHBlclRoOw0KKwl1OAkJCVJTU0lIaVB3ckxvd2VyVGg7DQorCXU4CQkJdTFiVG1wOw0KKwljaGFyCQkJT2ZkbVR4UHdySWR4LCBDY2tUeFB3cklkeDsNCisNCisJLy9wcmludGsoIi0tLS0+IERvVHhIaWdoUG93ZXIoKVxuIik7DQorDQorCUhpUHdyVXBwZXJUaCA9IHByaXYtPlJlZ0hpUHdyVXBwZXJUaDsNCisJSGlQd3JMb3dlclRoID0gcHJpdi0+UmVnSGlQd3JMb3dlclRoOwkJCQkJCQ0KKwkNCisJSGlQd3JVcHBlclRoID0gSGlQd3JVcHBlclRoICogMTA7DQorCUhpUHdyTG93ZXJUaCA9IEhpUHdyTG93ZXJUaCAqIDEwOw0KKwlSU1NJSGlQd3JVcHBlclRoID0gcHJpdi0+UmVnUlNTSUhpUHdyVXBwZXJUaDsNCisJUlNTSUhpUHdyTG93ZXJUaCA9IHByaXYtPlJlZ1JTU0lIaVB3ckxvd2VyVGg7DQorDQorCS8vbHptIGFkZCAwODA4MjYNCisJT2ZkbVR4UHdySWR4ICA9IHByaXYtPmNodHhwd3Jfb2ZkbVtwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXTsgDQorCUNja1R4UHdySWR4ICA9IHByaXYtPmNodHhwd3JbcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF07IA0KKw0KKwkvLwlwcmludGsoIkRvVHhIaWdoUG93ZXIoKSAtIFVuZGVjb3JhdGVkU21vb3RoZWRTUzolZCwgQ3VyQ0NLUlNTSSA9ICVkICwgYkN1ckNDS1BrdD0gJWQgXG4iLCBwcml2LT5VbmRlY29yYXRlZFNtb290aGVkU1MsIHByaXYtPkN1ckNDS1JTU0ksIHByaXYtPmJDdXJDQ0tQa3QgKTsNCisJDQorCWlmKChwcml2LT5VbmRlY29yYXRlZFNtb290aGVkU1MgPiBIaVB3clVwcGVyVGgpIHx8DQorCQkocHJpdi0+YkN1ckNDS1BrdCAmJiAocHJpdi0+Q3VyQ0NLUlNTSSA+IFJTU0lIaVB3clVwcGVyVGgpKSkNCisJew0KKwkJLy8gU3RldmVubCBzdWdnZXN0ZWQgdGhhdCBkZWdyYWRlIDhkYm0gaW4gaGlnaCBwb3dlciBzYXRlLiAyMDA3LTEyLTA0IElzYWlhaCANCisJCQ0KKwkvLwlwcmludGsoIj09PT09PkRvVHhIaWdoUG93ZXIoKSAtIEhpZ2ggUG93ZXIgLSBVbmRlY29yYXRlZFNtb290aGVkU1M6JWQsICBIaVB3clVwcGVyVGggPSAlZCBcbiIsIHByaXYtPlVuZGVjb3JhdGVkU21vb3RoZWRTUywgSGlQd3JVcHBlclRoICk7DQorCQlwcml2LT5iVG9VcGRhdGVUeFB3ciA9IHRydWU7DQorCQl1MWJUbXA9IHJlYWRfbmljX2J5dGUoZGV2LCBDQ0tfVFhBR0MpOw0KKw0KKwkJLy8gSWYgaXQgbmV2ZXIgZW50ZXIgSGlnaCBQb3dlci4NCisJCWlmKCBDY2tUeFB3cklkeCA9PSB1MWJUbXApDQorCQl7DQorCQl1MWJUbXAgPSAodTFiVG1wID4gMTYpID8gKHUxYlRtcCAtMTYpOiAwOyAgLy8gOGRibQ0KKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBDQ0tfVFhBR0MsIHUxYlRtcCk7DQorDQorCQl1MWJUbXA9IHJlYWRfbmljX2J5dGUoZGV2LCBPRkRNX1RYQUdDKTsNCisJCXUxYlRtcCA9ICh1MWJUbXAgPiAxNikgPyAodTFiVG1wIC0xNik6IDA7ICAvLyA4ZGJtDQorCQl3cml0ZV9uaWNfYnl0ZShkZXYsIE9GRE1fVFhBR0MsIHUxYlRtcCk7DQorCQl9DQorCQkNCisJfQ0KKwllbHNlIGlmKChwcml2LT5VbmRlY29yYXRlZFNtb290aGVkU1MgPCBIaVB3ckxvd2VyVGgpICYmDQorCQkoIXByaXYtPmJDdXJDQ0tQa3QgfHwgcHJpdi0+Q3VyQ0NLUlNTSSA8IFJTU0lIaVB3ckxvd2VyVGgpKQ0KKwl7DQorCS8vCSBwcmludGsoIkRvVHhIaWdoUG93ZXIoKSAtIGxvd2VyIFBvd2VyIC0gVW5kZWNvcmF0ZWRTbW9vdGhlZFNTOiVkLCAgSGlQd3JVcHBlclRoID0gJWQgXG4iLCBwcml2LT5VbmRlY29yYXRlZFNtb290aGVkU1MsIEhpUHdyTG93ZXJUaCApOw0KKwkJaWYocHJpdi0+YlRvVXBkYXRlVHhQd3IpDQorCQl7DQorCQkJcHJpdi0+YlRvVXBkYXRlVHhQd3IgPSBmYWxzZTsNCisJCQkvL1NEMyByZXF1aXJlZC4NCisJCQl1MWJUbXA9IHJlYWRfbmljX2J5dGUoZGV2LCBDQ0tfVFhBR0MpOwkJCQ0KKwkJCWlmKHUxYlRtcCA8IENja1R4UHdySWR4KQ0KKwkJCXsNCisJCQkvL3UxYlRtcCA9ICgodTFiVG1wKzE2KSA+IDM1KSA/IDM1OiAodTFiVG1wKzE2KTsgIC8vIDhkYm0NCisJCQkvL3dyaXRlX25pY19ieXRlKGRldiwgQ0NLX1RYQUdDLCB1MWJUbXApOw0KKwkJCXdyaXRlX25pY19ieXRlKGRldiwgQ0NLX1RYQUdDLCBDY2tUeFB3cklkeCk7DQorCQkJfQ0KKw0KKwkJCXUxYlRtcD0gcmVhZF9uaWNfYnl0ZShkZXYsIE9GRE1fVFhBR0MpOw0KKwkJCWlmKHUxYlRtcCA8IE9mZG1UeFB3cklkeCkNCisJCQl7DQorCQkJLy91MWJUbXAgPSAoKHUxYlRtcCsxNikgPiAzNSkgPyAzNTogKHUxYlRtcCsxNik7ICAvLyA4ZGJtDQorCQkJLy93cml0ZV9uaWNfYnl0ZShkZXYsIE9GRE1fVFhBR0MsIHUxYlRtcCk7DQorCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBPRkRNX1RYQUdDLCBPZmRtVHhQd3JJZHgpOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwkvL3ByaW50aygiPC0tLS0gRG9UeEhpZ2hQb3dlcigpXG4iKTsNCit9DQorDQorDQorLy8NCisvLwlEZXNjcmlwdGlvbjoNCisvLwkJQ2FsbGJhY2sgZnVuY3Rpb24gb2YgVXBkYXRlVHhQb3dlcldvcmtJdGVtLg0KKy8vCQlCZWNhdXNlIG9mIHNvbWUgZXZlbnQgaGFwcGVuZCwgZS5nLiBDQ1ggVFBDLCBIaWdoIFBvd2VyIE1lY2hhbmlzbSwgDQorLy8JCVdlIHVwZGF0ZSBUeCBwb3dlciBvZiBjdXJyZW50IGNoYW5uZWwgYWdhaW4uIA0KKy8vDQorI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkNCit2b2lkIHJ0bDgxODBfdHhfcHdfd3EgKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykNCit7DQorLy8gICAgICBzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcjgxODBfcHJpdiwgd2F0Y2hfZG9nX3dxKTsNCisvLyAgICAgIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICogaWVlZSA9IChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSopDQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIHdhdGNoX2RvZ193cSk7DQorICAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLHN0cnVjdCBkZWxheWVkX3dvcmssd29yayk7DQorICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZihkd29yayxzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSx0eF9wd193cSk7DQorICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWVlZS0+ZGV2Ow0KKyNlbHNlDQordm9pZCBydGw4MTgwX3R4X3B3X3dxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpDQorew0KKwkvLyBzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7DQorI2VuZGlmDQorDQorLy8JcHJpbnRrKCItLS0tPiBVcGRhdGVUeFBvd2VyV29ya0l0ZW1DYWxsYmFjaygpXG4iKTsNCisJDQorCURvVHhIaWdoUG93ZXIoZGV2KTsJDQorCQ0KKy8vCXByaW50aygiPC0tLS0gVXBkYXRlVHhQb3dlcldvcmtJdGVtQ2FsbGJhY2soKVxuIik7DQorfQ0KKw0KKw0KKy8vDQorLy8JRGVzY3JpcHRpb246DQorLy8JCVJldHVybiBUUlVFIGlmIHdlIHNoYWxsIHBlcmZvcm0gRElHIE1lY2FobmlzbSwgRkFMU0Ugb3RoZXJ3aXNlLgkNCisvLw0KK2Jvb2wNCitDaGVja0RpZygNCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldg0KKwkpDQorew0KKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7DQorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gcHJpdi0+aWVlZTgwMjExOw0KKw0KKwlpZighcHJpdi0+YkRpZ01lY2hhbmlzbSkNCisJCXJldHVybiBmYWxzZTsNCisNCisJaWYoaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRCkNCisJCXJldHVybiBmYWxzZTsNCisNCisJLy9pZihwcml2LT5DdXJyZW50T3BlcmFSYXRlIDwgMzYpIC8vIFNjaGVkdWxlIERpZyB1bmRlciBhbGwgT0ZETSByYXRlcy4gQnkgQnJ1Y2UsIDIwMDctMDYtMDEuDQorCWlmKChwcml2LT5pZWVlODAyMTEtPnJhdGUvNSkgPCAzNikgLy8gU2NoZWR1bGUgRGlnIHVuZGVyIGFsbCBPRkRNIHJhdGVzLiBCeSBCcnVjZSwgMjAwNy0wNi0wMS4NCisJCXJldHVybiBmYWxzZTsNCisJcmV0dXJuIHRydWU7DQorfQ0KKy8vDQorLy8JRGVzY3JpcHRpb246DQorLy8JCUltcGxlbWVudGF0aW9uIG9mIERJRyBmb3IgWmVicmEgYW5kIFplYnJhMi4JDQorLy8NCit2b2lkDQorRElHX1plYnJhKA0KKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2DQorCSkNCit7DQorCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsNCisJdTE2CQkJQ0NLRmFsc2VBbGFybSwgT0ZETUZhbHNlQWxhcm07DQorCXUxNgkJCU9mZG1GQTEsIE9mZG1GQTI7DQorCWludAkJCUluaXRpYWxHYWluU3RlcCA9IDc7IC8vIFRoZSBudW1iZXIgb2YgaW5pdGlhbCBnYWluIHN0YWdlcy4NCisJaW50CQkJTG93ZXN0R2FpblN0YWdlID0gNDsgLy8gVGhlIGNhcGFibGUgbG93ZXN0IHN0YWdlIG9mIHBlcmZvcm1pbmcgZGlnIHdvcmtpdGVtLg0KKwl1MzIgCQkJQXdha2VQZXJpb2RJbjJTZWM9MDsNCisNCisJLy9wcmludGsoIi0tLS0tLS0tLT4gRElHX1plYnJhKClcbiIpOw0KKw0KKwlDQ0tGYWxzZUFsYXJtID0gKHUxNikocHJpdi0+RmFsc2VBbGFybVJlZ1ZhbHVlICYgMHgwMDAwZmZmZik7DQorCU9GRE1GYWxzZUFsYXJtID0gKHUxNikoKHByaXYtPkZhbHNlQWxhcm1SZWdWYWx1ZSA+PiAxNikgJiAweDAwMDBmZmZmKTsNCisJT2ZkbUZBMSA9ICAweDE1Ow0KKwlPZmRtRkEyID0gKCh1MTYpKHByaXYtPlJlZ0RpZ09mZG1GYVVwVGgpKSA8PCA4Ow0KKw0KKy8vCXByaW50aygiRElHKioqKioqKioqKkNDSyBGYWxzZSBBbGFybTogJSNYIFxuIixDQ0tGYWxzZUFsYXJtKTsNCisvLwlwcmludGsoIkRJRyoqKioqKioqKipPRkRNIEZhbHNlIEFsYXJtOiAlI1ggXG4iLE9GRE1GYWxzZUFsYXJtKTsNCisNCisgICAgICAgIC8vIFRoZSBudW1iZXIgb2YgaW5pdGlhbCBnYWluIHN0ZXBzIGlzIGRpZmZlcmVudCwgYnkgQnJ1Y2UsIDIwMDctMDQtMTMuDQorCWlmIChwcml2LT5Jbml0aWFsR2FpbiA9PSAwICkgLy9hdXRvRElHDQorCXsgLy8gQWR2aXNlZCBmcm9tIFNEMyBEWg0KKwkJcHJpdi0+SW5pdGlhbEdhaW4gPSA0OyAvLyBJbiA4N0IsIG03NGRCbSBtZWFucyBTdGF0ZSA0IChtODJkQm0pDQorCX0NCisJLy9pZihwSGFsRGF0YS0+VmVyc2lvbklEICE9IFZFUlNJT05fODE4N0JfQikNCisJeyAvLyBBZHZpc2VkIGZyb20gU0QzIERaDQorCQlPZmRtRkExID0gIDB4MjA7DQorCX0NCisJDQorI2lmIDEgLy9sem0gcmVzZXJ2ZWQgMDgwODI2DQorCUF3YWtlUGVyaW9kSW4yU2VjID0gKDIwMDAtcHJpdiAtPkRvemVQZXJpb2RJblBhc3QyU2VjKTsNCisJLy9wcmludGsoIiYmJiBEb3plUGVyaW9kPSVkIEF3YWtlUGVyaW9kPSVkXG4iLCBwcml2LT5Eb3plUGVyaW9kSW5QYXN0MlNlYywgQXdha2VQZXJpb2RJbjJTZWMpOw0KKwlwcml2IC0+RG96ZVBlcmlvZEluUGFzdDJTZWM9MDsNCisJDQorCWlmKEF3YWtlUGVyaW9kSW4yU2VjKQ0KKwl7CQ0KKwkJLy9SVF9UUkFDRShDT01QX0RJRywgREJHX1RSQUNFLCAoIkRJRzogQXdha2VQZXJpb2RJbjJTZWMoJWQpIC0gRkFUaCgweCVYICwgMHglWCkgLT4iLEF3YWtlUGVyaW9kSW4yU2VjLCBPZmRtRkExLCBPZmRtRkEyKSk7DQorCQkvLyBhZGp1ZXN0IERJRyB0aHJlc2hvbGQuDQorCQlPZmRtRkExID0gICh1MTYpKChPZmRtRkExKkF3YWtlUGVyaW9kSW4yU2VjKSAgLyAyMDAwKSA7ICAJDQorCQlPZmRtRkEyID0gICh1MTYpKChPZmRtRkEyKkF3YWtlUGVyaW9kSW4yU2VjKSAgLyAyMDAwKSA7DQorCQkvL1JUX1RSQUNFKENPTVBfRElHLCBEQkdfVFJBQ0UsICgiKCAweCVYICwgMHglWClcbiIsIE9mZG1GQTEsIE9mZG1GQTIpKTsNCisJfQ0KKwllbHNlDQorCXsNCisJCTsvL1JUX1RSQUNFKENPTVBfRElHLCBEQkdfV0FSTklORywgKCJFUlJPUiEhICBBd2FrZVBlcmlvZEluMlNlYyBzaG91bGQgbm90IGJlIFpFUk8hIVxuIikpOw0KKwl9DQorI2VuZGlmDQorDQorCUluaXRpYWxHYWluU3RlcCA9IDg7DQorCUxvd2VzdEdhaW5TdGFnZSA9IHByaXYtPlJlZ0JNb2RlR2FpblN0YWdlOyAvLyBMb3dlc3QgZ2FpbiBzdGFnZS4NCisNCisJaWYgKE9GRE1GYWxzZUFsYXJtID4gT2ZkbUZBMSkNCisJew0KKwkJaWYgKE9GRE1GYWxzZUFsYXJtID4gT2ZkbUZBMikNCisJCXsNCisJCQlwcml2LT5ESUdfTnVtYmVyRmFsbGJhY2tWb3RlKys7DQorCQkJaWYgKHByaXYtPkRJR19OdW1iZXJGYWxsYmFja1ZvdGUgPjEpDQorCQkJew0KKwkJCQkvL3NlcmlvdXMgT0ZETSAgRmFsc2UgQWxhcm0sIG5lZWQgZmFsbGJhY2sNCisJCQkJaWYgKHByaXYtPkluaXRpYWxHYWluIDwgSW5pdGlhbEdhaW5TdGVwKQ0KKwkJCQl7DQorCQkJCQlwcml2LT5Jbml0aWFsR2FpbkJhY2tVcD0gcHJpdi0+SW5pdGlhbEdhaW47DQorDQorCQkJCQlwcml2LT5Jbml0aWFsR2FpbiA9IChwcml2LT5Jbml0aWFsR2FpbiArIDEpOw0KKy8vCQkJCQlwcmludGsoIkRJRyoqKioqKioqKipPRkRNIEZhbHNlIEFsYXJtOiAlI1gsICBPZmRtRkExOiAlI1gsIE9mZG1GQTI6ICUjWFxuIiwgT0ZETUZhbHNlQWxhcm0sIE9mZG1GQTEsIE9mZG1GQTIpOw0KKy8vCQkJCQlwcmludGsoIkRJRysrKysrKysgZmFsbGJhY2sgT0ZETTolZCBcbiIsIHByaXYtPkluaXRpYWxHYWluKTsNCisJCQkJCVVwZGF0ZUluaXRpYWxHYWluKGRldik7IA0KKwkJCQl9DQorCQkJCXByaXYtPkRJR19OdW1iZXJGYWxsYmFja1ZvdGUgPSAwOw0KKwkJCQlwcml2LT5ESUdfTnVtYmVyVXBncmFkZVZvdGU9MDsNCisJCQl9DQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJaWYgKHByaXYtPkRJR19OdW1iZXJGYWxsYmFja1ZvdGUpDQorCQkJCXByaXYtPkRJR19OdW1iZXJGYWxsYmFja1ZvdGUtLTsNCisJCX0NCisJCXByaXYtPkRJR19OdW1iZXJVcGdyYWRlVm90ZT0wOwkJDQorCX0NCisJZWxzZQkNCisJew0KKwkJaWYgKHByaXYtPkRJR19OdW1iZXJGYWxsYmFja1ZvdGUpDQorCQkJcHJpdi0+RElHX051bWJlckZhbGxiYWNrVm90ZS0tOw0KKwkJcHJpdi0+RElHX051bWJlclVwZ3JhZGVWb3RlKys7DQorDQorCQlpZiAocHJpdi0+RElHX051bWJlclVwZ3JhZGVWb3RlPjkpDQorCQl7DQorCQkJaWYgKHByaXYtPkluaXRpYWxHYWluID4gTG93ZXN0R2FpblN0YWdlKSAvLyBJbiA4N0IsIG03OGRCbSBtZWFucyBTdGF0ZSA0IChtODY0ZEJtKQ0KKwkJCXsNCisJCQkJcHJpdi0+SW5pdGlhbEdhaW5CYWNrVXA9IHByaXYtPkluaXRpYWxHYWluOw0KKw0KKwkJCQlwcml2LT5Jbml0aWFsR2FpbiA9IChwcml2LT5Jbml0aWFsR2FpbiAtIDEpOw0KKy8vCQkJCXByaW50aygiRElHKioqKioqKioqKk9GRE0gRmFsc2UgQWxhcm06ICUjWCwgIE9mZG1GQTE6ICUjWCwgT2ZkbUZBMjogJSNYXG4iLCBPRkRNRmFsc2VBbGFybSwgT2ZkbUZBMSwgT2ZkbUZBMik7DQorLy8JCQkJcHJpbnRrKCJESUctLS0tLS0tLS0gVXBncmFkZSBPRkRNOiVkIFxuIiwgcHJpdi0+SW5pdGlhbEdhaW4pOw0KKwkJCQlVcGRhdGVJbml0aWFsR2FpbihkZXYpOyANCisJCQl9DQorCQkJcHJpdi0+RElHX051bWJlckZhbGxiYWNrVm90ZSA9IDA7DQorCQkJcHJpdi0+RElHX051bWJlclVwZ3JhZGVWb3RlPTA7DQorCQl9DQorCX0NCisNCisvLwlwcmludGsoIkRJRysrKysrKysgT0ZETTolZFxuIiwgcHJpdi0+SW5pdGlhbEdhaW4pOwkNCisJLy9wcmludGsoIjwtLS0tLS0tLS0gRElHX1plYnJhKClcbiIpOw0KK30NCisNCisvLw0KKy8vCURlc2NyaXB0aW9uOg0KKy8vCQlEaXNwYXRjaCBESUcgaW1wbGVtZW50YXRpb24gYWNjb3JkaW5nIHRvIFJGLiAJDQorLy8NCit2b2lkDQorRHluYW1pY0luaXRHYWluKA0KKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2DQorCSkNCit7DQorCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsNCisNCisJc3dpdGNoKHByaXYtPnJmX2NoaXApDQorCXsNCisJCWNhc2UgUkZfWkVCUkEyOiAgLy8gW0FubmllV29ya2Fyb3VuZF0gRm9yIFplYnJhMiwgMjAwNS0wOC0wMS4NCisJCWNhc2UgUkZfWkVCUkE0Og0KKwkJCURJR19aZWJyYSggZGV2ICk7DQorCQkJYnJlYWs7DQorCQkNCisJCWRlZmF1bHQ6DQorCQkJcHJpbnRrKCJEeW5hbWljSW5pdEdhaW4oKTogdW5rbm93biBSRkNoaXBJRCglZCkgISEhXG4iLCBwcml2LT5yZl9jaGlwKTsNCisJCQlicmVhazsNCisJfQ0KK30NCisNCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApKQ0KK3ZvaWQgcnRsODE4MF9od19kaWdfd3EgKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykNCit7DQorLy8gICAgICBzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcjgxODBfcHJpdiwgd2F0Y2hfZG9nX3dxKTsNCisvLyAgICAgIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICogaWVlZSA9IChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSopDQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIHdhdGNoX2RvZ193cSk7DQorICAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLHN0cnVjdCBkZWxheWVkX3dvcmssd29yayk7DQorICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZihkd29yayxzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSxod19kaWdfd3EpOw0KKyAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsNCisjZWxzZQ0KK3ZvaWQgcnRsODE4MF9od19kaWdfd3Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldikNCit7DQorCQ0KKyNlbmRpZg0KKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7DQorDQorCS8vIFJlYWQgQ0NLIGFuZCBPRkRNIEZhbHNlIEFsYXJtLg0KKwlwcml2LT5GYWxzZUFsYXJtUmVnVmFsdWUgPSByZWFkX25pY19kd29yZChkZXYsIENDS19GQUxTRV9BTEFSTSk7DQorCQ0KKw0KKwkvLyBBZGp1c3QgSW5pdGlhbCBHYWluIGR5bmFtaWNhbGx5Lg0KKwlEeW5hbWljSW5pdEdhaW4oZGV2KTsNCisJDQorfQ0KKw0KK2ludA0KK0luY2x1ZGVkSW5TdXBwb3J0ZWRSYXRlcygNCisgICAgICAgIHN0cnVjdCByODE4MF9wcml2ICAgICAgICpwcml2LA0KKyAgICAgICAgdTggICAgICAgICAgICAgIFR4UmF0ZSAgKQ0KK3sNCisgICAgdTggcmF0ZV9sZW47DQorICAgICAgICB1OCByYXRlX2V4X2xlbjsNCisgICAgICAgIHU4ICAgICAgICAgICAgICAgICAgICAgIFJhdGVNYXNrID0gMHg3RjsNCisgICAgICAgIHU4ICAgICAgICAgICAgICAgICAgICAgIGlkeDsNCisgICAgICAgIHVuc2lnbmVkIHNob3J0ICAgICAgICAgIEZvdW5kID0gMDsNCisgICAgICAgIHU4ICAgICAgICAgICAgICAgICAgICAgIE5haXZlVHhSYXRlID0gVHhSYXRlJlJhdGVNYXNrOw0KKw0KKyAgICByYXRlX2xlbiA9IHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2xlbjsNCisgICAgICAgIHJhdGVfZXhfbGVuID0gcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhfbGVuOw0KKyAgICAgICAgZm9yKCBpZHg9MDsgaWR4PCByYXRlX2xlbjsgaWR4KysgKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiggKHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzW2lkeF0gJiBSYXRlTWFzaykgPT0gTmFpdmVUeFJhdGUgKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICAgICAgRm91bmQgPSAxOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZm91bmRfcmF0ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICBmb3IoIGlkeD0wOyBpZHg8IHJhdGVfZXhfbGVuOyBpZHgrKyApDQorICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmKCAocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhbaWR4XSAmIFJhdGVNYXNrKSA9PSBOYWl2ZVR4UmF0ZSApDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBGb3VuZCA9IDE7DQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmb3VuZF9yYXRlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gRm91bmQ7DQorICAgICAgICBmb3VuZF9yYXRlOg0KKyAgICAgICAgcmV0dXJuIEZvdW5kOw0KK30NCisNCisvLw0KKy8vICAgICAgRGVzY3JpcHRpb246DQorLy8gICAgICAgICAgICAgIEdldCB0aGUgVHggcmF0ZSBvbmUgZGVncmVlIHVwIGZvcm0gdGhlIGlucHV0IHJhdGUgaW4gdGhlIHN1cHBvcnRlZCByYXRlcy4NCisvLyAgICAgICAgICAgICAgUmV0dXJuIHRoZSB1cGdyYWRlIHJhdGUgaWYgaXQgaXMgc3VjY2Vzc2VkLCBvdGhlcndpc2UgcmV0dXJuIHRoZSBpbnB1dCByYXRlLg0KKy8vICAgICAgQnkgQnJ1Y2UsIDIwMDctMDYtMDUuDQorLy8gDQordTgNCitHZXRVcGdyYWRlVHhSYXRlKA0KKyAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwNCisgICAgICAgIHU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZQ0KKyAgICAgICAgKQ0KK3sNCisgICAgICAgIHN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsNCisgICAgICAgIHU4ICAgICAgICAgICAgICAgICAgICAgIFVwUmF0ZTsNCisNCisgICAgICAgIC8vIFVwZ3JhZGUgMSBkZWdyZWUuDQorICAgICAgICBzd2l0Y2gocmF0ZSkNCisgICAgICAgIHsNCisgICAgICAgIGNhc2UgMTA4OiAvLyBVcCB0byA1NE1icHMuDQorICAgICAgICAgICAgICAgIFVwUmF0ZSA9IDEwODsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICBjYXNlIDk2OiAvLyBVcCB0byA1NE1icHMuDQorICAgICAgICAgICAgICAgIFVwUmF0ZSA9IDEwODsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICBjYXNlIDcyOiAvLyBVcCB0byA0OE1icHMuDQorICAgICAgICAgICAgICAgIFVwUmF0ZSA9IDk2Ow0KKyAgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgIGNhc2UgNDg6IC8vIFVwIHRvIDM2TWJwcy4NCisgICAgICAgICAgICAgICAgVXBSYXRlID0gNzI7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgY2FzZSAzNjogLy8gVXAgdG8gMjRNYnBzLg0KKyAgICAgICAgICAgICAgICBVcFJhdGUgPSA0ODsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICBjYXNlIDIyOiAvLyBVcCB0byAxOE1icHMuDQorICAgICAgICAgICAgICAgIFVwUmF0ZSA9IDM2Ow0KKyAgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgIGNhc2UgMTE6IC8vIFVwIHRvIDExTWJwcy4NCisgICAgICAgICAgICAgICAgVXBSYXRlID0gMjI7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgY2FzZSA0OiAvLyBVcCB0byA1LjVNYnBzLg0KKyAgICAgICAgICAgICAgICBVcFJhdGUgPSAxMTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICBjYXNlIDI6IC8vIFVwIHRvIDJNYnBzLg0KKyAgICAgICAgICAgICAgICBVcFJhdGUgPSA0Ow0KKyAgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgIHByaW50aygiR2V0VXBncmFkZVR4UmF0ZSgpOiBJbnB1dCBUeCBSYXRlKCVkKSBpcyB1bmRlZmluZWQhXG4iLCByYXRlKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHJhdGU7DQorICAgICAgICB9DQorICAgICAgICAvLyBDaGVjayBpZiB0aGUgcmF0ZSBpcyB2YWxpZC4NCisgICAgICAgIGlmKEluY2x1ZGVkSW5TdXBwb3J0ZWRSYXRlcyhwcml2LCBVcFJhdGUpKQ0KKyAgICAgICAgew0KKy8vICAgICAgICAgICAgICBwcmludGsoIkdldFVwZ3JhZGVUeFJhdGUoKTogR2V0VXBncmFkZSBUeCByYXRlKCVkKSBmcm9tICVkICFcbiIsIFVwUmF0ZSwgcHJpdi0+Q3VycmVudE9wZXJhUmF0ZSk7DQorICAgICAgICAgICAgICAgIHJldHVybiBVcFJhdGU7DQorICAgICAgICB9DQorICAgICAgICBlbHNlDQorICAgICAgICB7DQorICAgICAgICAgICAgICAgIC8vcHJpbnRrKCJHZXRVcGdyYWRlVHhSYXRlKCk6IFR4IHJhdGUgKCVkKSBpcyBub3QgaW4gc3VwcG9ydGVkIHJhdGVzXG4iLCBVcFJhdGUpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmF0ZTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByYXRlOw0KK30NCisvLw0KKy8vICAgICAgRGVzY3JpcHRpb246DQorLy8gICAgICAgICAgICAgIEdldCB0aGUgVHggcmF0ZSBvbmUgZGVncmVlIGRvd24gZm9ybSB0aGUgaW5wdXQgcmF0ZSBpbiB0aGUgc3VwcG9ydGVkIHJhdGVzLg0KKy8vICAgICAgICAgICAgICBSZXR1cm4gdGhlIGRlZ3JhZGUgcmF0ZSBpZiBpdCBpcyBzdWNjZXNzZWQsIG90aGVyd2lzZSByZXR1cm4gdGhlIGlucHV0IHJhdGUuDQorLy8gICAgICBCeSBCcnVjZSwgMjAwNy0wNi0wNS4NCisvLyANCit1OA0KK0dldERlZ3JhZGVUeFJhdGUoDQorICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LA0KKyAgICAgICAgdTggICAgICAgICByYXRlDQorICAgICAgICApDQorew0KKyAgICAgICAgc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOw0KKyAgICAgICAgdTggICAgICAgICAgICAgICAgICAgICAgRG93blJhdGU7DQorDQorICAgICAgICAvLyBVcGdyYWRlIDEgZGVncmVlLg0KKyAgICAgICAgc3dpdGNoKHJhdGUpDQorICAgICAgICB7DQorICAgICAgICBjYXNlIDEwODogLy8gRG93biB0byA0OE1icHMuDQorICAgICAgICAgICAgICAgIERvd25SYXRlID0gOTY7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgY2FzZSA5NjogLy8gRG93biB0byAzNk1icHMuDQorICAgICAgICAgICAgICAgIERvd25SYXRlID0gNzI7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgY2FzZSA3MjogLy8gRG93biB0byAyNE1icHMuDQorICAgICAgICAgICAgICAgIERvd25SYXRlID0gNDg7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgY2FzZSA0ODogLy8gRG93biB0byAxOE1icHMuDQorICAgICAgICAgICAgICAgIERvd25SYXRlID0gMzY7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgY2FzZSAzNjogLy8gRG93biB0byAxMU1icHMuDQorICAgICAgICAgICAgICAgIERvd25SYXRlID0gMjI7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgY2FzZSAyMjogLy8gRG93biB0byA1LjVNYnBzLg0KKyAgICAgICAgICAgICAgICBEb3duUmF0ZSA9IDExOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgIGNhc2UgMTE6IC8vIERvd24gdG8gMk1icHMuDQorICAgICAgICAgICAgICAgIERvd25SYXRlID0gNDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICBjYXNlIDQ6IC8vIERvd24gdG8gMU1icHMuDQorICAgICAgICAgICAgICAgIERvd25SYXRlID0gMjsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICBjYXNlIDI6IC8vIERvd24gdG8gMU1icHMuDQorICAgICAgICAgICAgICAgIERvd25SYXRlID0gMjsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICBwcmludGsoIkdldERlZ3JhZGVUeFJhdGUoKTogSW5wdXQgVHggUmF0ZSglZCkgaXMgdW5kZWZpbmVkIVxuIiwgcmF0ZSk7DQorICAgICAgICAgICAgICAgIHJldHVybiByYXRlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHJhdGUgaXMgdmFsaWQuDQorICAgICAgICBpZihJbmNsdWRlZEluU3VwcG9ydGVkUmF0ZXMocHJpdiwgRG93blJhdGUpKQ0KKyAgICAgICAgew0KKy8vICAgICAgICAgICAgICBwcmludGsoIkdldERlZ3JhZGVUeFJhdGUoKTogR2V0RGVncmFkZSBUeCByYXRlKCVkKSBmcm9tICVkIVxuIiwgRG93blJhdGUsIHByaXYtPkN1cnJlbnRPcGVyYVJhdGUpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gRG93blJhdGU7DQorICAgICAgICB9DQorICAgICAgICBlbHNlDQorICAgICAgICB7DQorICAgICAgICAgICAgICAgIC8vcHJpbnRrKCJHZXREZWdyYWRlVHhSYXRlKCk6IFR4IHJhdGUgKCVkKSBpcyBub3QgaW4gc3VwcG9ydGVkIHJhdGVzXG4iLCBEb3duUmF0ZSk7DQorICAgICAgICAgICAgICAgIHJldHVybiByYXRlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJhdGU7DQorfQ0KKy8vDQorLy8gICAgICBIZWxwZXIgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIHNwZWNpZmllZCBkYXRhIHJhdGUgaXMgDQorLy8gICAgICBDQ0sgcmF0ZS4NCisvLyAgICAgIDIwMDUuMDEuMjUsIGJ5IHJjbmprby4NCisvLw0KK2Jvb2wNCitNZ250SXNDY2tSYXRlKA0KKyAgICAgICAgdTE2ICAgICByYXRlDQorICAgICAgICApDQorew0KKyAgICAgICAgYm9vbCBiUmV0dXJuID0gZmFsc2U7DQorDQorICAgICAgICBpZigocmF0ZSA8PSAyMikgJiYgKHJhdGUgIT0gMTIpICYmIChyYXRlICE9IDE4KSkNCisgICAgICAgIHsNCisgICAgICAgICAgICAgICAgYlJldHVybiA9IHRydWU7DQorICAgICAgICB9DQorDQorICAgICAgICByZXR1cm4gYlJldHVybjsNCit9DQorI2lmZGVmIENPTkZJR19SVEw4MThYX1MNCisvLw0KKy8vCURlc2NyaXB0aW9uOg0KKy8vCQlUeCBQb3dlciB0cmFja2luZyBtZWNoYW5pc20gcm91dGluZSBvbiA4N1NFLg0KKy8vIAlDcmVhdGVkIGJ5IFJvZ2VyLCAyMDA3LjEyLjExLg0KKy8vDQordm9pZA0KK1R4UHdyVHJhY2tpbmc4N1NFKA0KKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2DQorKQ0KK3sJCQ0KKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7DQorCXU4CXRtcHUxQnl0ZSwgQ3VycmVudFRoZXJtYWwsIElkeDsJDQorCWNoYXIJQ2NrVHhQd3JJZHgsIE9mZG1UeFB3cklkeDsJDQorCS8vdTMyCXU0YlJmUmVnOw0KKwkNCisJdG1wdTFCeXRlID0gcmVhZF9uaWNfYnl0ZShkZXYsIEVOX0xQRl9DQUwpOw0KKwlDdXJyZW50VGhlcm1hbCA9ICh0bXB1MUJ5dGUgJiAweGYwKT4+NDsgLy9bIDc6NF06IHRoZXJtYWwgbWV0ZXIgaW5kaWNhdGlvbi4NCisJQ3VycmVudFRoZXJtYWwgPSAoQ3VycmVudFRoZXJtYWw+MHgwYyk/IDB4MGM6Q3VycmVudFRoZXJtYWw7Ly9sem0gYWRkIDA4MDgyNg0KKw0KKwkvL3ByaW50aygiVHhQd3JUcmFja2luZzg3U0UoKTogQ3VycmVudFRoZXJtYWwoJWQpXG4iLCBDdXJyZW50VGhlcm1hbCk7DQorCQ0KKwlpZiggQ3VycmVudFRoZXJtYWwgIT0gcHJpdi0+VGhlcm1hbE1ldGVyKQ0KKwl7CQ0KKy8vCQlwcmludGsoIlR4UHdyVHJhY2tpbmc4N1NFKCk6IFRoZXJtYWwgbWV0ZXIgY2hhbmdlZCEhIVxuIik7DQorDQorCQkvLyBVcGRhdGUgVHggUG93ZXIgbGV2ZWwgb24gZWFjaCBjaGFubmVsLg0KKwkJZm9yKElkeCA9IDE7IElkeDwxNTsgSWR4KyspDQorCQl7CQkJDQorCQkJQ2NrVHhQd3JJZHggPSBwcml2LT5jaHR4cHdyW0lkeF07DQorCQkJT2ZkbVR4UHdySWR4ID0gcHJpdi0+Y2h0eHB3cl9vZmRtW0lkeF07CQkJDQorCQkJDQorCQkJaWYoIEN1cnJlbnRUaGVybWFsID4gcHJpdi0+VGhlcm1hbE1ldGVyICkNCisJCQl7IC8vIGhpZ2hlciB0aGVybWFsIG1ldGVyLgkJDQorCQkJCUNja1R4UHdySWR4ICs9IChDdXJyZW50VGhlcm1hbCAtIHByaXYtPlRoZXJtYWxNZXRlcikqMjsNCisJCQkJT2ZkbVR4UHdySWR4ICs9IChDdXJyZW50VGhlcm1hbCAtIHByaXYtPlRoZXJtYWxNZXRlcikqMjsNCisJCQkNCisJCQkJaWYoQ2NrVHhQd3JJZHggPjM1KQ0KKwkJCQkJQ2NrVHhQd3JJZHggPSAzNTsgLy8gRm9yY2UgVHhQb3dlciB0byBtYXhpbWFsIGluZGV4Lg0KKwkJCQlpZihPZmRtVHhQd3JJZHggPjM1KQ0KKwkJCQkJT2ZkbVR4UHdySWR4ID0gMzU7CQkJCQ0KKwkJCX0NCisJCQllbHNlDQorCQkJeyAvLyBsb3dlciB0aGVybWFsIG1ldGVyLgkJCQkNCisJCQkJQ2NrVHhQd3JJZHggLT0gKHByaXYtPlRoZXJtYWxNZXRlciAtIEN1cnJlbnRUaGVybWFsKSoyOw0KKwkJCQlPZmRtVHhQd3JJZHggLT0gKHByaXYtPlRoZXJtYWxNZXRlciAtIEN1cnJlbnRUaGVybWFsKSoyOw0KKw0KKwkJCQlpZihDY2tUeFB3cklkeCA8MCkNCisJCQkJCUNja1R4UHdySWR4ID0gMDsJCQ0KKwkJCQlpZihPZmRtVHhQd3JJZHggPDApDQorCQkJCQlPZmRtVHhQd3JJZHggPSAwOwkJCQkNCisJCQl9CQkJCQkNCisJCQkNCisJCQkvLyBVcGRhdGUgVHhQb3dlciBsZXZlbCBvbiBDQ0sgYW5kIE9GRE0gcmVzcC4NCisJCQlwcml2LT5jaHR4cHdyW0lkeF0gPSBDY2tUeFB3cklkeDsNCisJCQlwcml2LT5jaHR4cHdyX29mZG1bSWR4XSA9IE9mZG1UeFB3cklkeDsJCQkJDQorCQl9CQ0KKw0KKwkJLy8gVXBkYXRlIFR4UG93ZXIgbGV2ZWwgaW1tZWRpYXRlbHkuDQorCQlydGw4MjI1ejJfU2V0VFhQb3dlckxldmVsKGRldiwgcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7DQorCX0JDQorCXByaXYtPlRoZXJtYWxNZXRlciA9IEN1cnJlbnRUaGVybWFsOwkJCQkJDQorfQ0KK3ZvaWQNCitTdGFSYXRlQWRhcHRpdmU4N1NFKA0KKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2DQorCSkNCit7DQorCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsNCisJdW5zaWduZWQgbG9uZyAJCQlDdXJyVHhva0NudDsNCisJdTE2CQkJQ3VyclJldHJ5Q250Ow0KKwl1MTYJCQlDdXJyUmV0cnlSYXRlOw0KKwkvL3UxNgkJCWksaWR4Ow0KKwl1bnNpZ25lZCBsb25nICAgICAgIAlDdXJyUnhva0NudDsNCisJYm9vbAkJCWJUcnlVcCA9IGZhbHNlOw0KKwlib29sCQkJYlRyeURvd24gPSBmYWxzZTsNCisJdTgJCQlUcnlVcFRoID0gMTsNCisJdTgJCQlUcnlEb3duVGggPSAyOw0KKwl1MzIJCQlUeFRocm91Z2hwdXQ7DQorCWxvbmcJCUN1cnJTaWduYWxTdHJlbmd0aDsNCisJYm9vbAkJYlVwZGF0ZUluaXRpYWxHYWluID0gZmFsc2U7DQorICAgIAl1OAkJCXUxYk9mZG09MCwgdTFiQ2NrID0gMDsNCisJY2hhcgkJT2ZkbVR4UHdySWR4LCBDY2tUeFB3cklkeDsJDQorDQorCXByaXYtPlJhdGVBZGFwdGl2ZVBlcmlvZD0gUkFURV9BREFQVElWRV9USU1FUl9QRVJJT0Q7DQorDQorDQorCUN1cnJSZXRyeUNudAk9IHByaXYtPkN1cnJSZXRyeUNudDsNCisJQ3VyclR4b2tDbnQJPSBwcml2LT5OdW1UeE9rVG90YWwgLSBwcml2LT5MYXN0VHhva0NudDsNCisJQ3VyclJ4b2tDbnQJPSBwcml2LT5pZWVlODAyMTEtPk51bVJ4T2tUb3RhbCAtIHByaXYtPkxhc3RSeG9rQ250Ow0KKwlDdXJyU2lnbmFsU3RyZW5ndGggPSBwcml2LT5TdGF0c19SZWN2U2lnbmFsUG93ZXI7DQorCVR4VGhyb3VnaHB1dCA9ICh1MzIpKHByaXYtPk51bVR4T2tCeXRlc1RvdGFsIC0gcHJpdi0+TGFzdFR4T0tCeXRlcyk7DQorCXByaXYtPkxhc3RUeE9LQnl0ZXMgPSBwcml2LT5OdW1UeE9rQnl0ZXNUb3RhbDsNCisJcHJpdi0+Q3VycmVudE9wZXJhUmF0ZSA9IHByaXYtPmllZWU4MDIxMS0+cmF0ZS81Ow0KKwkvL3ByaW50aygicHJpdi0+Q3VycmVudE9wZXJhUmF0ZSBpcyAlZFxuIixwcml2LT5DdXJyZW50T3BlcmFSYXRlKTsNCisJLy8yIENvbXB1dGUgcmV0cnkgcmF0aW8uDQorCWlmIChDdXJyVHhva0NudD4wKQ0KKwl7DQorCQlDdXJyUmV0cnlSYXRlID0gKHUxNikoQ3VyclJldHJ5Q250KjEwMC9DdXJyVHhva0NudCk7DQorCX0NCisJZWxzZQ0KKwl7IC8vIEl0IG1heSBiZSBzZXJpb3VzIHJldHJ5LiBUbyBkaXN0aW5ndWlzaCBzZXJpb3VzIHJldHJ5IG9yIG5vIHBhY2tldHMgbW9kaWZpZWQgYnkgQnJ1Y2UNCisJCUN1cnJSZXRyeVJhdGUgPSAodTE2KShDdXJyUmV0cnlDbnQqMTAwLzEpOw0KKwl9DQorDQorDQorCS8vDQorCS8vIEFkZGVkIGJ5IFJvZ2VyLCAyMDA3LjAxLjAyLg0KKwkvLyBGb3IgZGVidWcgaW5mb3JtYXRpb24uDQorCS8vDQorCS8vcHJpbnRrKCJcbigxKSBwSGFsRGF0YS0+TGFzdFJldHJ5UmF0ZTogJWQgXG4iLHByaXYtPkxhc3RSZXRyeVJhdGUpOw0KKwkvL3ByaW50aygiKDIpIFJldHJ5Q250ID0gJWQgIFxuIiwgQ3VyclJldHJ5Q250KTsJDQorCS8vcHJpbnRrKCIoMykgVHhva0NudCA9ICVkIFxuIiwgQ3VyclR4b2tDbnQpOw0KKwkvL3ByaW50aygiKDQpIEN1cnJSZXRyeVJhdGUgPSAlZCBcbiIsIEN1cnJSZXRyeVJhdGUpOwkNCisJLy9wcmludGsoIig1KSBDdXJyU2lnbmFsU3RyZW5ndGggPSAlZCBcbiIsQ3VyclNpZ25hbFN0cmVuZ3RoKTsNCisJLy9wcmludGsoIig2KSBUeFRocm91Z2hwdXQgaXMgJWRcbiIsVHhUaHJvdWdocHV0KTsNCisJLy9wcmludGsoInByaXYtPk51bVR4T2tCeXRlc1RvdGFsIGlzICVkXG4iLHByaXYtPk51bVR4T2tCeXRlc1RvdGFsKTsJCQ0KKw0KKwlwcml2LT5MYXN0UmV0cnlDbnQgPSBwcml2LT5DdXJyUmV0cnlDbnQ7DQorCXByaXYtPkxhc3RUeG9rQ250ID0gcHJpdi0+TnVtVHhPa1RvdGFsOw0KKwlwcml2LT5MYXN0Unhva0NudCA9IHByaXYtPmllZWU4MDIxMS0+TnVtUnhPa1RvdGFsOw0KKwlwcml2LT5DdXJyUmV0cnlDbnQgPSAwOw0KKw0KKwkvLzJObyBUeCBwYWNrZXRzLCByZXR1cm4gdG8gaW5pdF9yYXRlIG9yIG5vdD8NCisJaWYgKEN1cnJSZXRyeVJhdGU9PTAgJiYgQ3VyclR4b2tDbnQgPT0gMCkNCisJewkNCisJCS8vDQorCQkvL0FmdGVyIDkgKDMwKjMwMG1zKSBzZWNvbmRzIGluIHRoaXMgY29uZGl0aW9uLCB3ZSB0cnkgdG8gcmFpc2UgcmF0ZS4NCisJCS8vDQorCQlwcml2LT5Ucnl1cGluZ0NvdW50Tm9EYXRhKys7DQorCQkNCisvLwkJcHJpbnRrKCJObyBUeCBwYWNrZXRzLCBUcnl1cGluZ0NvdW50Tm9EYXRhKCVkKVxuIiwgcHJpdi0+VHJ5dXBpbmdDb3VudE5vRGF0YSk7DQorCQkvL1tUUkMgRGVsbCBMYWJdIEV4dGVuZCByYWlzZWQgcGVyaW9kIGZyb20gNC41c2VjIHRvIDlzZWMsIElzYWlhaCAyMDA4LTAyLTE1IDE4OjAwIA0KKwkJaWYgKHByaXYtPlRyeXVwaW5nQ291bnROb0RhdGE+MzApDQorCQl7DQorCQkJcHJpdi0+VHJ5dXBpbmdDb3VudE5vRGF0YSA9IDA7DQorCQkgCXByaXYtPkN1cnJlbnRPcGVyYVJhdGUgPSBHZXRVcGdyYWRlVHhSYXRlKGRldiwgcHJpdi0+Q3VycmVudE9wZXJhUmF0ZSk7CQkNCisJCQkvLyBSZXNldCBGYWlsIFJlY29yZA0KKwkJCXByaXYtPkxhc3RGYWlsVHhSYXRlID0gMDsNCisJCQlwcml2LT5MYXN0RmFpbFR4UmF0ZVNTID0gLTIwMDsNCisJCQlwcml2LT5GYWlsVHhSYXRlQ291bnQgPSAwOw0KKwkJfQ0KKwkJZ290byBTZXRJbml0aWFsR2FpbjsNCisJfQ0KKyAgICAgICAgZWxzZQ0KKwl7DQorCQlwcml2LT5Ucnl1cGluZ0NvdW50Tm9EYXRhPTA7IC8vUmVzZXQgdHJ5aW5nIHVwIHRpbWVzLg0KKwl9DQorDQorDQorCS8vDQorCS8vIEZvciBOZXRnZWFyIGNhc2UsIEkgY29tbWVudCBvdXQgdGhlIGZvbGxvd2luZyBzaWduYWwgc3RyZW5ndGggZXN0aW1hdGlvbiwNCisJLy8gd2hpY2ggY2FuIHJlc3VsdHMgaW4gbG93ZXIgcmF0ZSB0byB0cmFuc21pdCB3aGVuIHNhbXBsZSBpcyBOT1QgZW5vdWdoIChlLmcuIFBJTkcgcmVxdWVzdCkuICANCisJLy8gMjAwNy4wNC4wOSwgYnkgUm9nZXIuCQ0KKwkvLwkNCisNCisJLy8NCisJLy8gUmVzdHJ1Y3R1cmUgcmF0ZSBhZGFwdGl2ZSBhcyB0aGUgZm9sbG93aW5nIG1haW4gc3RhZ2VzOg0KKwkvLyAoMSkgQWRkIHJldHJ5IHRocmVzaG9sZCBpbiA1NE0gdXBncmFkaW5nIGNvbmRpdGlvbiB3aXRoIHNpZ25hbCBzdHJlbmd0aC4NCisJLy8gKDIpIEFkZCB0aGUgbWVjaGFuaXNtIHRvIGRlZ3JhZGUgdG8gQ0NLIHJhdGUgYWNjb3JkaW5nIHRvIHNpZ25hbCBzdHJlbmd0aCANCisJLy8JCWFuZCByZXRyeSByYXRlLg0KKwkvLyAoMykgUmVtb3ZlIGFsbCBJbml0aWFsIEdhaW4gVXBkYXRlcyBvdmVyIE9GRE0gcmF0ZS4gVG8gYXZvaWQgdGhlIGNvbXBsaWNhdGVkIA0KKwkvLwkJc2l0dWF0aW9uLCBJbml0aWFsIEdhaW4gVXBkYXRlIGlzIHVwb24gb24gRElHIG1lY2hhbmlzbSBleGNlcHQgQ0NLIHJhdGUuDQorCS8vICg0KSBBZGQgdGhlIG1laGFuaXNtIG9mIHRyeWluZyB0byB1cGdyYWRlIHR4IHJhdGUuDQorCS8vICg1KSBSZWNvcmQgdGhlIGluZm9ybWF0aW9uIG9mIHVwcGluZyB0eCByYXRlIHRvIGF2b2lkIHRyeWluZyB1cHBpbmcgdHggcmF0ZSBjb25zdGFudGx5Lg0KKwkvLyBCeSBCcnVjZSwgMjAwNy0wNi0wNS4NCisJLy8JDQorCS8vDQorDQorCS8vIDExTWJwcyBvciAzNk1icHMNCisJLy8gQ2hlY2sgbW9yZSB0aW1lcyBpbiB0aGVzZSByYXRlKGtleSByYXRlcykuDQorCS8vDQorCWlmKHByaXYtPkN1cnJlbnRPcGVyYVJhdGUgPT0gMjIgfHwgcHJpdi0+Q3VycmVudE9wZXJhUmF0ZSA9PSA3MikNCisJeyANCisJCVRyeVVwVGggKz0gOTsNCisJfQ0KKwkvLw0KKwkvLyBMZXQgdGhlc2UgcmF0ZXMgZG93biBtb3JlIGRpZmZpY3VsdC4NCisJLy8NCisJaWYoTWdudElzQ2NrUmF0ZShwcml2LT5DdXJyZW50T3BlcmFSYXRlKSB8fCBwcml2LT5DdXJyZW50T3BlcmFSYXRlID09IDM2KQ0KKwl7DQorCQkJVHJ5RG93blRoICs9IDE7DQorCX0NCisNCisJLy8xIEFkanVzdCBSYXRlLg0KKwlpZiAocHJpdi0+YlRyeXVwaW5nID09IHRydWUpDQorCXsJDQorCQkvLzIgRm9yIFRlc3QgVXBncmFkaW5nIG1lY2hhbmlzbQ0KKwkJLy8gTm90ZToNCisJCS8vIAlTb21ldGltZXMgdGhlIHRocm91Z2hwdXQgaXMgdXBvbiBvbiB0aGUgY2FwYWJpbGl0eSBid3R3ZWVuIHRoZSBBUCBhbmQgTklDLA0KKwkJLy8gCXRodXMgdGhlIGxvdyBkYXRhIHJhdGUgZG9lcyBub3QgaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2UuDQorCQkvLyAJV2UgcmFuZG9tbHkgdXBncmFkZSB0aGUgZGF0YSByYXRlIGFuZCBjaGVjayBpZiB0aGUgcmV0cnkgcmF0ZSBpcyBpbXByb3ZlZC4NCisJCQ0KKwkJLy8gVXBncmFkaW5nIHJhdGUgZGlkIG5vdCBpbXByb3ZlIHRoZSByZXRyeSByYXRlLCBmYWxsYmFjayB0byB0aGUgb3JpZ2luYWwgcmF0ZS4NCisJCWlmICggKEN1cnJSZXRyeVJhdGUgPiAyNSkgJiYgVHhUaHJvdWdocHV0IDwgcHJpdi0+TGFzdFR4VGhyb3VnaHB1dCkNCisJCXsNCisJCQkvL05vdCBuZWNlc3NhcnkgcmFpc2luZyByYXRlLCBmYWxsIGJhY2sgcmF0ZS4NCisJCQliVHJ5RG93biA9IHRydWU7DQorCQkJLy9wcmludGsoImNhc2UxLTE6IE5vdCBuZWNlc3NhcnkgcmFpc2luZyByYXRlLCBmYWxsIGJhY2sgcmF0ZS4uLi5cbiIpOw0KKwkJCS8vcHJpbnRrKCJjYXNlMS0xOiBwTWdudEluZm8tPkN1cnJlbnRPcGVyYVJhdGUgPSVkLCBUeFRocm91Z2hwdXQgPSAlZCwgTGFzdFRocm91Z2hwdXQgPSAlZFxuIiwNCisJCQkvLwkJcHJpdi0+Q3VycmVudE9wZXJhUmF0ZSwgVHhUaHJvdWdocHV0LCBwcml2LT5MYXN0VHhUaHJvdWdocHV0KTsJCQkNCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQlwcml2LT5iVHJ5dXBpbmcgPSBmYWxzZTsNCisJCX0NCisJfQkNCisJZWxzZSBpZiAoQ3VyclNpZ25hbFN0cmVuZ3RoID4gLTQ3ICYmIChDdXJyUmV0cnlSYXRlIDwgNTApKQ0KKwl7DQorCQkvLzJGb3IgSGlnaCBQb3dlcg0KKwkJLy8NCisJCS8vIEFkZGVkIGJ5IFJvZ2VyLCAyMDA3LjA0LjA5Lg0KKwkJLy8gUmV0dXJuIHRvIGhpZ2hlc3QgZGF0YSByYXRlLCBpZiBzaWduYWwgc3RyZW5ndGggaXMgZ29vZCBlbm91Z2guDQorCQkvLyBTaWduYWxTdHJlbmd0aCB0aHJlc2hvbGQoLTUwZGJtKSBpcyBmb3IgUlRMODE4Ni4NCisJCS8vIFJldmlzZSBTaWduYWxTdHJlbmd0aCB0aHJlc2hvbGQgdG8gLTUxZGJtLgkNCisJCS8vDQorCQkvLyBBbHNvIG5lZWQgdG8gY2hlY2sgcmV0cnkgcmF0ZSBmb3Igc2FmZXR5LCBieSBCcnVjZSwgMjAwNy0wNi0wNS4NCisJCWlmKHByaXYtPkN1cnJlbnRPcGVyYVJhdGUgIT0gcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuSGlnaGVzdE9wZXJhUmF0ZSApDQorCQl7DQorCQkJYlRyeVVwID0gdHJ1ZTsNCisJCQkvLyBVcGdyYWRlIFR4IFJhdGUgZGlyZWN0bHkuDQorCQkJcHJpdi0+VHJ5dXBpbmdDb3VudCArPSBUcnlVcFRoOw0KKwkJfQ0KKy8vCQlwcmludGsoImNhc2UyOiBTdGFSYXRlQWRhcHRpdmU4N1NFOiBQb3dlciglZCkgaXMgaGlnaCBlbm91Z2ghIS4gXG4iLCBDdXJyU2lnbmFsU3RyZW5ndGgpOwkJCQ0KKwkJCQkJDQorCX0NCisJZWxzZSBpZihDdXJyVHhva0NudCA+IDkgJiYgQ3VyclR4b2tDbnQ8IDEwMCAmJiBDdXJyUmV0cnlSYXRlID49IDYwMCkgDQorCXsNCisJCS8vMiBGb3IgU2VyaW91cyBSZXRyeQ0KKwkJLy8NCisJCS8vIFRyYWZmaWMgaXMgbm90IGJ1c3kgYnV0IG91ciBUeCByZXRyeSBpcyBzZXJpb3VzLiANCisJCS8vDQorCQliVHJ5RG93biA9IHRydWU7DQorCQkvLyBMZXQgUmF0ZSBNZWNoYW5pc20gdG8gZGVncmFkZSB0eCByYXRlIGRpcmVjdGx5Lg0KKwkJcHJpdi0+VHJ5RG93bkNvdW50TG93RGF0YSArPSBUcnlEb3duVGg7DQorLy8JCXByaW50aygiY2FzZTM6IFJBOiBUeCBSZXRyeSBpcyBzZXJpb3VzLiBEZWdyYWRlIFR4IFJhdGUgdG8gJWQgZGlyZWN0bHkuLi5cbiIsIHByaXYtPkN1cnJlbnRPcGVyYVJhdGUpOwkNCisJfQ0KKwllbHNlIGlmICggcHJpdi0+Q3VycmVudE9wZXJhUmF0ZSA9PSAxMDggKQ0KKwl7DQorCQkvLzJGb3IgNTRNYnBzDQorCQkvLyBBaXIgTGluaw0KKwkJaWYgKCAoQ3VyclJldHJ5UmF0ZT4yNikmJihwcml2LT5MYXN0UmV0cnlSYXRlPjI1KSkNCisvLwkJaWYgKCAoQ3VyclJldHJ5UmF0ZT40MCkmJihwcml2LT5MYXN0UmV0cnlSYXRlPjM5KSkNCisJCXsNCisJCQkvL0Rvd24gdG8gcmF0ZSA0OE1icHMuDQorCQkJYlRyeURvd24gPSB0cnVlOw0KKwkJfQ0KKwkJLy8gQ2FibGUgTGluaw0KKwkJZWxzZSBpZiAoIChDdXJyUmV0cnlSYXRlPjE3KSYmKHByaXYtPkxhc3RSZXRyeVJhdGU+MTYpICYmIChDdXJyU2lnbmFsU3RyZW5ndGggPiAtNzIpKSANCisvLwkJZWxzZSBpZiAoIChDdXJyUmV0cnlSYXRlPjE3KSYmKHByaXYtPkxhc3RSZXRyeVJhdGU+MTYpICYmIChDdXJyU2lnbmFsU3RyZW5ndGggPiAtNzIpKQ0KKwkJew0KKwkJCS8vRG93biB0byByYXRlIDQ4TWJwcy4NCisJCQliVHJ5RG93biA9IHRydWU7DQorCQl9DQorDQorCQlpZihiVHJ5RG93biAmJiAoQ3VyclNpZ25hbFN0cmVuZ3RoIDwgLTc1KSkgLy9jYWJsZSBsaW5rDQorCQl7DQorCQkJcHJpdi0+VHJ5RG93bkNvdW50TG93RGF0YSArPSBUcnlEb3duVGg7DQorCQl9DQorCQkvL3ByaW50aygiY2FzZTQtLS01NE0gXG4iKTsJDQorDQorCX0NCisJZWxzZSBpZiAoIHByaXYtPkN1cnJlbnRPcGVyYVJhdGUgPT0gOTYgKQ0KKwl7DQorCQkvLzJGb3IgNDhNYnBzDQorCQkvL0FpciBMaW5rDQorCQlpZiAoICgoQ3VyclJldHJ5UmF0ZT40OCkgJiYgKHByaXYtPkxhc3RSZXRyeVJhdGU+NDcpKSkNCisvLwkJaWYgKCAoKEN1cnJSZXRyeVJhdGU+NjUpICYmIChwcml2LT5MYXN0UmV0cnlSYXRlPjY0KSkpDQorDQorCQl7CQ0KKwkJCS8vRG93biB0byByYXRlIDM2TWJwcy4NCisJCQliVHJ5RG93biA9IHRydWU7DQorCQl9DQorCQkvL0NhYmxlIExpbmsNCisJCWVsc2UgaWYgKCAoKEN1cnJSZXRyeVJhdGU+MjEpICYmIChwcml2LT5MYXN0UmV0cnlSYXRlPjIwKSkgJiYgKEN1cnJTaWduYWxTdHJlbmd0aCA+IC03NCkpDQorCQl7DQorCQkJLy9Eb3duIHRvIHJhdGUgMzZNYnBzLg0KKwkJCWJUcnlEb3duID0gdHJ1ZTsNCisJCX0NCisJCWVsc2UgaWYoKEN1cnJSZXRyeVJhdGU+ICAocHJpdi0+TGFzdFJldHJ5UmF0ZSArIDUwICkpICYmIChwcml2LT5GYWlsVHhSYXRlQ291bnQgPjIgKSkNCisvLwkJZWxzZSBpZigoQ3VyclJldHJ5UmF0ZT4gIChwcml2LT5MYXN0UmV0cnlSYXRlICsgNzAgKSkgJiYgKHByaXYtPkZhaWxUeFJhdGVDb3VudCA+MiApKQ0KKwkJew0KKwkJCWJUcnlEb3duID0gdHJ1ZTsNCisJCQlwcml2LT5UcnlEb3duQ291bnRMb3dEYXRhICs9IFRyeURvd25UaDsNCisJCX0NCisJCWVsc2UgaWYgKCAoQ3VyclJldHJ5UmF0ZTw4KSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZTw4KSApIC8vVE8gRE86IG5lZWQgdG8gY29uc2lkZXIgKFJTU0kpDQorLy8JCWVsc2UgaWYgKCAoQ3VyclJldHJ5UmF0ZTwyOCkgJiYgKHByaXYtPkxhc3RSZXRyeVJhdGU8OCkgKSANCisJCXsNCisJCQliVHJ5VXAgPSB0cnVlOw0KKwkJfQ0KKw0KKwkJaWYoYlRyeURvd24gJiYgKEN1cnJTaWduYWxTdHJlbmd0aCA8IC03NSkpDQorCQl7DQorCQkJcHJpdi0+VHJ5RG93bkNvdW50TG93RGF0YSArPSBUcnlEb3duVGg7DQorCQl9DQorCQkvL3ByaW50aygiY2FzZTUtLS00OE0gXG4iKTsJDQorCX0NCisJZWxzZSBpZiAoIHByaXYtPkN1cnJlbnRPcGVyYVJhdGUgPT0gNzIgKQ0KKwl7DQorCQkvLzJGb3IgMzZNYnBzDQorCQlpZiAoIChDdXJyUmV0cnlSYXRlPjQzKSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZT40MSkpIA0KKy8vCQlpZiAoIChDdXJyUmV0cnlSYXRlPjYwKSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZT41OSkpDQorCQl7CQ0KKwkJCS8vRG93biB0byByYXRlIDI0TWJwcy4NCisJCQliVHJ5RG93biA9IHRydWU7DQorCQl9DQorCQllbHNlIGlmKChDdXJyUmV0cnlSYXRlPiAgKHByaXYtPkxhc3RSZXRyeVJhdGUgKyA1MCApKSAmJiAocHJpdi0+RmFpbFR4UmF0ZUNvdW50ID4yICkpDQorLy8JCWVsc2UgaWYoKEN1cnJSZXRyeVJhdGU+ICAocHJpdi0+TGFzdFJldHJ5UmF0ZSArIDcwICkpICYmIChwcml2LT5GYWlsVHhSYXRlQ291bnQgPjIgKSkNCisJCXsNCisJCQliVHJ5RG93biA9IHRydWU7DQorCQkJcHJpdi0+VHJ5RG93bkNvdW50TG93RGF0YSArPSBUcnlEb3duVGg7DQorCQl9DQorCQllbHNlIGlmICggKEN1cnJSZXRyeVJhdGU8MTUpICYmICAocHJpdi0+TGFzdFJldHJ5UmF0ZTwxNikpIC8vVE8gRE86IG5lZWQgdG8gY29uc2lkZXIgKFJTU0kpDQorLy8JCWVsc2UgaWYgKCAoQ3VyclJldHJ5UmF0ZTwzNSkgJiYgIChwcml2LT5MYXN0UmV0cnlSYXRlPDM2KSkNCisJCXsNCisJCQliVHJ5VXAgPSB0cnVlOw0KKwkJfQ0KKw0KKwkJaWYoYlRyeURvd24gJiYgKEN1cnJTaWduYWxTdHJlbmd0aCA8IC04MCkpDQorCQl7DQorCQkJcHJpdi0+VHJ5RG93bkNvdW50TG93RGF0YSArPSBUcnlEb3duVGg7DQorCQl9DQorCQkvL3ByaW50aygiY2FzZTYtLS0zNk0gXG4iKTsJDQorCX0NCisJZWxzZSBpZiAoIHByaXYtPkN1cnJlbnRPcGVyYVJhdGUgPT0gNDggKQ0KKwl7DQorCQkvLzJGb3IgMjRNYnBzDQorCQkvLyBBaXIgTGluaw0KKwkJaWYgKCAoKEN1cnJSZXRyeVJhdGU+NjMpICYmIChwcml2LT5MYXN0UmV0cnlSYXRlPjYyKSkpDQorLy8JCWlmICggKChDdXJyUmV0cnlSYXRlPjgzKSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZT44MikpKQ0KKwkJewkNCisJCQkvL0Rvd24gdG8gcmF0ZSAxOE1icHMuDQorCQkJYlRyeURvd24gPSB0cnVlOw0KKwkJfQ0KKwkJLy9DYWJsZSBMaW5rDQorCQllbHNlIGlmICggKChDdXJyUmV0cnlSYXRlPjMzKSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZT4zMikpICYmIChDdXJyU2lnbmFsU3RyZW5ndGggPiAtODIpICkNCisvLwkJIGVsc2UgaWYgKCAoKEN1cnJSZXRyeVJhdGU+NTApICYmIChwcml2LT5MYXN0UmV0cnlSYXRlPjQ5KSkgJiYgKEN1cnJTaWduYWxTdHJlbmd0aCA+IC04MikgKQ0KKwkJew0KKwkJCS8vRG93biB0byByYXRlIDE4TWJwcy4NCisJCQliVHJ5RG93biA9IHRydWU7DQorCQl9DQorCQllbHNlIGlmKChDdXJyUmV0cnlSYXRlPiAgKHByaXYtPkxhc3RSZXRyeVJhdGUgKyA1MCApKSAmJiAocHJpdi0+RmFpbFR4UmF0ZUNvdW50ID4yICkpDQorLy8JCWVsc2UgaWYoKEN1cnJSZXRyeVJhdGU+ICAocHJpdi0+TGFzdFJldHJ5UmF0ZSArIDcwICkpICYmIChwcml2LT5GYWlsVHhSYXRlQ291bnQgPjIgKSkNCisNCisJCXsNCisJCQliVHJ5RG93biA9IHRydWU7DQorCQkJcHJpdi0+VHJ5RG93bkNvdW50TG93RGF0YSArPSBUcnlEb3duVGg7DQorCQl9DQorICAJCWVsc2UgaWYgKCAoQ3VyclJldHJ5UmF0ZTwyMCkgJiYgKHByaXYtPkxhc3RSZXRyeVJhdGU8MjEpKSAvL1RPIERPOiBuZWVkIHRvIGNvbnNpZGVyIChSU1NJKQ0KKy8vCQllbHNlIGlmICggKEN1cnJSZXRyeVJhdGU8NDApICYmIChwcml2LT5MYXN0UmV0cnlSYXRlPDQxKSkNCisJCXsJDQorCQkJYlRyeVVwID0gdHJ1ZTsJDQorCQl9DQorDQorCQlpZihiVHJ5RG93biAmJiAoQ3VyclNpZ25hbFN0cmVuZ3RoIDwgLTgyKSkNCisJCXsNCisJCQlwcml2LT5UcnlEb3duQ291bnRMb3dEYXRhICs9IFRyeURvd25UaDsNCisJCX0NCisJCS8vcHJpbnRrKCJjYXNlNy0tLTI0TSBcbiIpOwkNCisJfQ0KKwllbHNlIGlmICggcHJpdi0+Q3VycmVudE9wZXJhUmF0ZSA9PSAzNiApDQorCXsNCisJCS8vMkZvciAxOE1icHMNCisJCS8vIG9yaWdpbmFsICgxMDksIDEwOSkgDQorCQkvL1tUUkMgRGVsbCBMYWJdICg5MCwgOTEpLCBJc2FpYWggMjAwOC0wMi0xOCAyMzoyNA0KKwkJLy8JCQkgICAgICg4NSwgODYpLCBJc2FpYWggMjAwOC0wMi0xOCAyNDowMA0KKwkJaWYgKCAoKEN1cnJSZXRyeVJhdGU+ODUpICYmIChwcml2LT5MYXN0UmV0cnlSYXRlPjg2KSkpDQorLy8JCWlmICggKChDdXJyUmV0cnlSYXRlPjExNSkgJiYgKHByaXYtPkxhc3RSZXRyeVJhdGU+MTE2KSkpDQorCQl7DQorCQkJLy9Eb3duIHRvIHJhdGUgMTFNYnBzLg0KKwkJCWJUcnlEb3duID0gdHJ1ZTsNCisJCX0NCisJCS8vW1RSQyBEZWxsIExhYl0gIElzYWlhaCAyMDA4LTAyLTE4IDIzOjI0DQorCQllbHNlIGlmKChDdXJyUmV0cnlSYXRlPiAgKHByaXYtPkxhc3RSZXRyeVJhdGUgKyA1MCApKSAmJiAocHJpdi0+RmFpbFR4UmF0ZUNvdW50ID4yICkpDQorLy8JCWVsc2UgaWYoKEN1cnJSZXRyeVJhdGU+ICAocHJpdi0+TGFzdFJldHJ5UmF0ZSArIDcwICkpICYmIChwcml2LT5GYWlsVHhSYXRlQ291bnQgPjIgKSkNCisJCXsNCisJCQliVHJ5RG93biA9IHRydWU7DQorCQkJcHJpdi0+VHJ5RG93bkNvdW50TG93RGF0YSArPSBUcnlEb3duVGg7DQorCQl9DQorCQllbHNlIGlmICggKEN1cnJSZXRyeVJhdGU8MjIpICYmIChwcml2LT5MYXN0UmV0cnlSYXRlPDIzKSkgLy9UTyBETzogbmVlZCB0byBjb25zaWRlciAoUlNTSSkNCisvLwkJZWxzZSBpZiAoIChDdXJyUmV0cnlSYXRlPDQyKSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZTw0MykpDQorCQl7CQ0KKwkJCWJUcnlVcCA9IHRydWU7CQ0KKwkJfQ0KKwkJLy9wcmludGsoImNhc2U4LS0tMThNIFxuIik7CQ0KKwl9DQorCWVsc2UgaWYgKCBwcml2LT5DdXJyZW50T3BlcmFSYXRlID09IDIyICkNCisJew0KKwkJLy8yRm9yIDExTWJwcw0KKwkJaWYgKEN1cnJSZXRyeVJhdGU+OTUpDQorLy8JCWlmIChDdXJyUmV0cnlSYXRlPjE1NSkNCisJCXsNCisJCQliVHJ5RG93biA9IHRydWU7DQorCQl9DQorCQllbHNlIGlmICggKEN1cnJSZXRyeVJhdGU8MjkpICYmIChwcml2LT5MYXN0UmV0cnlSYXRlIDwzMCkgKS8vVE8gRE86IG5lZWQgdG8gY29uc2lkZXIgKFJTU0kpDQorLy8JCWVsc2UgaWYgKCAoQ3VyclJldHJ5UmF0ZTw0OSkgJiYgKHByaXYtPkxhc3RSZXRyeVJhdGUgPDUwKSApDQorCQkJew0KKwkJCWJUcnlVcCA9IHRydWU7DQorCQkJfQ0KKwkJLy9wcmludGsoImNhc2U5LS0tMTFNIFxuIik7CQ0KKwkJfQkNCisJZWxzZSBpZiAoIHByaXYtPkN1cnJlbnRPcGVyYVJhdGUgPT0gMTEgKQ0KKwl7DQorCQkvLzJGb3IgNS41TWJwcw0KKwkJaWYgKEN1cnJSZXRyeVJhdGU+MTQ5KSANCisvLwkJaWYgKEN1cnJSZXRyeVJhdGU+MTg5KQ0KKwkJewkNCisJCQliVHJ5RG93biA9IHRydWU7CQkJDQorCQl9DQorCQllbHNlIGlmICggKEN1cnJSZXRyeVJhdGU8NjApICYmIChwcml2LT5MYXN0UmV0cnlSYXRlIDwgNjUpKQ0KKy8vCQllbHNlIGlmICggKEN1cnJSZXRyeVJhdGU8ODApICYmIChwcml2LT5MYXN0UmV0cnlSYXRlIDwgODUpKQ0KKw0KKwkJCXsNCisJCQliVHJ5VXAgPSB0cnVlOw0KKwkJCX0JCQ0KKwkJLy9wcmludGsoImNhc2UxMC0tLTUuNU0gXG4iKTsJDQorCQl9DQorCWVsc2UgaWYgKCBwcml2LT5DdXJyZW50T3BlcmFSYXRlID09IDQgKQ0KKwl7DQorCQkvLzJGb3IgMiBNYnBzDQorCQlpZigoQ3VyclJldHJ5UmF0ZT45OSkgJiYgKHByaXYtPkxhc3RSZXRyeVJhdGU+OTkpKQ0KKy8vCQlpZigoQ3VyclJldHJ5UmF0ZT4xOTkpICYmIChwcml2LT5MYXN0UmV0cnlSYXRlPjE5OSkpDQorCQl7DQorCQkJYlRyeURvd24gPSB0cnVlOwkJCQ0KKwkJfQ0KKwkJZWxzZSBpZiAoIChDdXJyUmV0cnlSYXRlIDwgNjUpICYmIChwcml2LT5MYXN0UmV0cnlSYXRlIDwgNzApKQ0KKy8vCQllbHNlIGlmICggKEN1cnJSZXRyeVJhdGUgPCA4NSkgJiYgKHByaXYtPkxhc3RSZXRyeVJhdGUgPCA5MCkpDQorCQl7DQorCQkJYlRyeVVwID0gdHJ1ZTsNCisJCX0NCisJCS8vcHJpbnRrKCJjYXNlMTEtLS0yTSBcbiIpOwkNCisJfQ0KKwllbHNlIGlmICggcHJpdi0+Q3VycmVudE9wZXJhUmF0ZSA9PSAyICkNCisJew0KKwkJLy8yRm9yIDEgTWJwcw0KKwkJaWYoIChDdXJyUmV0cnlSYXRlPDcwKSAmJiAocHJpdi0+TGFzdFJldHJ5UmF0ZTw3NSkpDQorLy8JCWlmKCAoQ3VyclJldHJ5UmF0ZTw5MCkgJiYgKHByaXYtPkxhc3RSZXRyeVJhdGU8OTUpKQ0KKwkJew0KKwkJCWJUcnlVcCA9IHRydWU7DQorCQl9DQorCQkvL3ByaW50aygiY2FzZTEyLS0tMU0gXG4iKTsJDQorCX0NCisNCisJaWYoYlRyeVVwICYmIGJUcnlEb3duKQ0KKyAgICAJcHJpbnRrKCJTdGFSYXRlQWRhcHRpdmU4N0IoKTogVHggUmF0ZSB0cmllZCB1cHBpbmcgYW5kIGRvd25pbmcgc2ltdWx0YW5lb3VzbHkhXG4iKTsNCisJCQkJDQorCS8vMSBUZXN0IFVwZ3JhZGluZyBUeCBSYXRlDQorCS8vIFNvbWV0aW1lcyB0aGUgY2F1c2Ugb2YgdGhlIGxvdyB0aHJvdWdocHV0IChoaWdoIHJldHJ5IHJhdGUpIGlzIHRoZSBjb21wYXRpYmlsaXR5IGJldHdlZW4gdGhlIEFQIGFuZCBOSUMuDQorCS8vIFRvIHRlc3QgaWYgdGhlIHVwcGVyIHJhdGUgbWF5IGNhdXNlIGxvd2VyIHJldHJ5IHJhdGUsIHRoaXMgbWVjaGFuaXNtIHJhbmRvbWx5IG9jY3VycyB0byB0ZXN0IHVwZ3JhZGluZyB0eCByYXRlLg0KKwlpZighYlRyeVVwICYmICFiVHJ5RG93biAmJiAocHJpdi0+VHJ5dXBpbmdDb3VudCA9PSAwKSAmJiAocHJpdi0+VHJ5RG93bkNvdW50TG93RGF0YSA9PSAwKQ0KKwkJJiYgcHJpdi0+Q3VycmVudE9wZXJhUmF0ZSAhPSBwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5IaWdoZXN0T3BlcmFSYXRlICYmIHByaXYtPkZhaWxUeFJhdGVDb3VudCA8IDIpDQorCXsNCisJCWlmKGppZmZpZXMlIChDdXJyUmV0cnlSYXRlICsgMTAxKSA9PSAwKQ0KKwkJew0KKwkJCWJUcnlVcCA9IHRydWU7CQ0KKwkJCXByaXYtPmJUcnl1cGluZyA9IHRydWU7DQorCQkJLy9wcmludGsoIlN0YVJhdGVBZGFwdGl2ZTg3U0UoKTogUmFuZG9tbHkgdHJ5IHVwZ3JhZGluZy4uLlxuIik7DQorCQl9DQorCX0NCisNCisJLy8xIFJhdGUgTWVjaGFuaXNtDQorCWlmKGJUcnlVcCkNCisJew0KKwkJcHJpdi0+VHJ5dXBpbmdDb3VudCsrOw0KKwkJcHJpdi0+VHJ5RG93bkNvdW50TG93RGF0YSA9IDA7DQorCQkJDQorCQl7DQorLy8JCQlwcmludGsoIlVQOiBwSGFsRGF0YS0+VHJ5dXBpbmdDb3VudCA9ICVkXG4iLCBwcml2LT5Ucnl1cGluZ0NvdW50KTsNCisvLwkJCXByaW50aygiVVA6IFRyeVVwVGgoJWQpKyAoRmFpbFR4UmF0ZUNvdW50KCVkKSleMiA9JWRcbiIsIA0KKy8vCQkJCVRyeVVwVGgsIHByaXYtPkZhaWxUeFJhdGVDb3VudCwgKFRyeVVwVGggKyBwcml2LT5GYWlsVHhSYXRlQ291bnQgKiBwcml2LT5GYWlsVHhSYXRlQ291bnQpICk7DQorLy8JCQlwcmludGsoIlVQOiBwSGFsRGF0YS0+YlRyeXVwaW5nPSVkXG4iLCAgcHJpdi0+YlRyeXVwaW5nKTsNCisNCisJCX0NCisJCQ0KKwkJLy8NCisJCS8vIENoZWNrIG1vcmUgdGltZXMgaWYgd2UgbmVlZCB0byB1cGdyYWRlIGluZGVlZC4NCisJCS8vIEJlY2F1c2UgdGhlIGxhcmdlc3QgdmFsdWUgb2YgcEhhbERhdGEtPlRyeXVwaW5nQ291bnQgaXMgMHhGRkZGIGFuZCANCisJCS8vIHRoZSBsYXJnZXN0IHZhbHVlIG9mIHBIYWxEYXRhLT5GYWlsVHhSYXRlQ291bnQgaXMgMHgxNCwNCisJCS8vIHRoaXMgY29uZGl0aW9uIHdpbGwgYmUgc2F0aXNmaWVkIGF0IG1vc3QgZXZlcnkgMiBtaW4uDQorCQkvLw0KKw0KKwkJaWYoKHByaXYtPlRyeXVwaW5nQ291bnQgPiAoVHJ5VXBUaCArIHByaXYtPkZhaWxUeFJhdGVDb3VudCAqIHByaXYtPkZhaWxUeFJhdGVDb3VudCkpIHx8DQorCQkJKEN1cnJTaWduYWxTdHJlbmd0aCA+IHByaXYtPkxhc3RGYWlsVHhSYXRlU1MpIHx8IHByaXYtPmJUcnl1cGluZykNCisJCXsNCisJCQlwcml2LT5Ucnl1cGluZ0NvdW50ID0gMDsNCisJCQkvLyANCisJCQkvLyBXaGVuIHRyYW5zZmVyaW5nIGZyb20gQ0NLIHRvIE9GRE0sIERJRyBpcyBhbiBpbXBvcnRhbnQgaXNzdWUuDQorCQkJLy8NCisJCQlpZihwcml2LT5DdXJyZW50T3BlcmFSYXRlID09IDIyKQ0KKwkJCQliVXBkYXRlSW5pdGlhbEdhaW4gPSB0cnVlOw0KKw0KKwkJCS8vIFRoZSBkaWZmZXJlbmNlIGluIHRocm91Z2hwdXQgYmV0d2VlbiA0OE1icHMgYW5kIDM2TWJwcyBpcyA4TS4NCisJCQkvLyBTbywgd2UgbXVzdCBiZSBjYXJlZnVsbHkgaW4gdGhpcyByYXRlIHNjYWxlLiBJc2FpYWggMjAwOC0wMi0xNS4NCisJCQkvLw0KKwkJCWlmKCAgKChwcml2LT5DdXJyZW50T3BlcmFSYXRlID09IDcyKSB8fCAocHJpdi0+Q3VycmVudE9wZXJhUmF0ZSA9PSA0OCkgfHwgKHByaXYtPkN1cnJlbnRPcGVyYVJhdGUgPT0gMzYpKSAmJg0KKwkJCQkocHJpdi0+RmFpbFR4UmF0ZUNvdW50ID4gMikgKQ0KKwkJCQlwcml2LT5SYXRlQWRhcHRpdmVQZXJpb2Q9IChSQVRFX0FEQVBUSVZFX1RJTUVSX1BFUklPRC8yKTsNCisJCQkNCisJCQkvLyAoMSlUbyBhdm9pZCB1cGdyYWRlIGZyZXF1ZW50bHkgdG8gdGhlIGZhaWwgdHggcmF0ZSwgYWRkIHRoZSBGYWlsVHhSYXRlQ291bnQgaW50byB0aGUgdGhyZXNob2xkLg0KKwkJCS8vICgyKUlmIHRoZSBzaWduYWwgc3RyZW5ndGggaXMgaW5jcmVhc2VkLCBpdCBtYXkgYmUgYWJsZSB0byB1cGdyYWRlLg0KKw0KKwkJCXByaXYtPkN1cnJlbnRPcGVyYVJhdGUgPSBHZXRVcGdyYWRlVHhSYXRlKGRldiwgcHJpdi0+Q3VycmVudE9wZXJhUmF0ZSk7DQorLy8JCQlwcmludGsoIlN0YVJhdGVBZGFwdGl2ZTg3U0UoKTogVXBncmFkZSBUeCBSYXRlIHRvICVkXG4iLCBwcml2LT5DdXJyZW50T3BlcmFSYXRlKTsNCisNCisJCQkvL1tUUkMgRGVsbCBMYWJdIEJ5cGFzcyAxMi85LzYsIElzYWlhaCAyMDA4LTAyLTE4IDIwOjAwIA0KKwkJCWlmKHByaXYtPkN1cnJlbnRPcGVyYVJhdGUgPT0zNikNCisJCQl7DQorCQkJCXByaXYtPmJVcGRhdGVBUkZSPXRydWU7DQorCQkJCXdyaXRlX25pY193b3JkKGRldiwgQVJGUiwgMHgwRjhGKTsgLy9ieXBhc3MgMTIvOS82DQorLy8JCQkJcHJpbnRrKCJVUDogQVJGUj0weEY4RlxuIik7DQorCQkJfQ0KKwkJCWVsc2UgaWYocHJpdi0+YlVwZGF0ZUFSRlIpDQorCQkJew0KKwkJCQlwcml2LT5iVXBkYXRlQVJGUj1mYWxzZTsNCisJCQkJd3JpdGVfbmljX3dvcmQoZGV2LCBBUkZSLCAweDBGRkYpOyAvL3NldCAxTSB+IDU0TWJwcy4NCisvLwkJCQlwcmludGsoIlVQOiBBUkZSPTB4RkZGXG4iKTsNCisJCQl9DQorCQkJCQ0KKwkJCS8vIFVwZGF0ZSBGYWlsIFR4IHJhdGUgYW5kIGNvdW50Lg0KKwkJCWlmKHByaXYtPkxhc3RGYWlsVHhSYXRlICE9IHByaXYtPkN1cnJlbnRPcGVyYVJhdGUpDQorCQkJew0KKwkJCQlwcml2LT5MYXN0RmFpbFR4UmF0ZSA9IHByaXYtPkN1cnJlbnRPcGVyYVJhdGU7DQorCQkJCXByaXYtPkZhaWxUeFJhdGVDb3VudCA9IDA7DQorCQkJCXByaXYtPkxhc3RGYWlsVHhSYXRlU1MgPSAtMjAwOyAvLyBTZXQgbG93ZXN0IHBvd2VyLg0KKwkJCX0NCisJCX0NCisJfQ0KKwllbHNlDQorCXsJDQorCQlpZihwcml2LT5Ucnl1cGluZ0NvdW50ID4gMCkNCisJCQlwcml2LT5Ucnl1cGluZ0NvdW50IC0tOw0KKwl9DQorCQ0KKwlpZihiVHJ5RG93bikNCisJew0KKwkJcHJpdi0+VHJ5RG93bkNvdW50TG93RGF0YSsrOw0KKwkJcHJpdi0+VHJ5dXBpbmdDb3VudCA9IDA7DQorCQl7DQorLy8JCQlwcmludGsoIkROOiBwSGFsRGF0YS0+VHJ5RG93bkNvdW50TG93RGF0YSA9ICVkXG4iLHByaXYtPlRyeURvd25Db3VudExvd0RhdGEpOw0KKy8vCQkJcHJpbnRrKCJETjogVHJ5RG93blRoID0lZFxuIiwgVHJ5RG93blRoKTsNCisvLwkJCXByaW50aygiRE46IHBIYWxEYXRhLT5iVHJ5dXBpbmc9JWRcbiIsICBwcml2LT5iVHJ5dXBpbmcpOw0KKwkJfQ0KKwkJCQkJCQ0KKwkJLy9DaGVjayBpZiBUeCByYXRlIGNhbiBiZSBkZWdyYWRlZCBvciBUZXN0IHRyeWluZyB1cGdyYWRpbmcgc2hvdWxkIGZhbGxiYWNrLg0KKwkJaWYocHJpdi0+VHJ5RG93bkNvdW50TG93RGF0YSA+IFRyeURvd25UaCB8fCBwcml2LT5iVHJ5dXBpbmcpDQorCQl7DQorCQkJcHJpdi0+VHJ5RG93bkNvdW50TG93RGF0YSA9IDA7DQorCQkJcHJpdi0+YlRyeXVwaW5nID0gZmFsc2U7DQorCQkJLy8gVXBkYXRlIGZhaWwgaW5mb3JtYXRpb24uDQorCQkJaWYocHJpdi0+TGFzdEZhaWxUeFJhdGUgPT0gcHJpdi0+Q3VycmVudE9wZXJhUmF0ZSkNCisJCQl7DQorCQkJCXByaXYtPkZhaWxUeFJhdGVDb3VudCArKzsNCisJCQkJLy8gUmVjb3JkIHRoZSBUeCBmYWlsIHJhdGUgc2lnbmFsIHN0cmVuZ3RoLg0KKwkJCQlpZihDdXJyU2lnbmFsU3RyZW5ndGggPiBwcml2LT5MYXN0RmFpbFR4UmF0ZVNTKQ0KKwkJCQl7DQorCQkJCQlwcml2LT5MYXN0RmFpbFR4UmF0ZVNTID0gQ3VyclNpZ25hbFN0cmVuZ3RoOw0KKwkJCQl9DQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCXByaXYtPkxhc3RGYWlsVHhSYXRlID0gcHJpdi0+Q3VycmVudE9wZXJhUmF0ZTsNCisJCQkJcHJpdi0+RmFpbFR4UmF0ZUNvdW50ID0gMTsNCisJCQkJcHJpdi0+TGFzdEZhaWxUeFJhdGVTUyA9IEN1cnJTaWduYWxTdHJlbmd0aDsNCisJCQl9DQorCQkJcHJpdi0+Q3VycmVudE9wZXJhUmF0ZSA9IEdldERlZ3JhZGVUeFJhdGUoZGV2LCBwcml2LT5DdXJyZW50T3BlcmFSYXRlKTsNCisNCisJCQkvLyBSZWR1Y2UgY2hhcmlvdCB0cmFpbmluZyB0aW1lIGF0IHdlYWsgc2lnbmFsIHN0cmVuZ3RoIHNpdHVhdGlvbi4gU0QzIEVEIGRlbWFuZC4gDQorCQkJLy9bVFJDIERlbGwgTGFiXSBSZXZpc2UgU2lnbmFsIFRocmVzaG9sZCBmcm9tIC03NSB0byAtODAgLCBJc2FpYWggMjAwOC0wMi0xOCAyMDowMCANCisJCQlpZiggKEN1cnJTaWduYWxTdHJlbmd0aCA8IC04MCkgJiYgKHByaXYtPkN1cnJlbnRPcGVyYVJhdGUgPiA3MiApKQ0KKwkJCXsNCisJCQkJcHJpdi0+Q3VycmVudE9wZXJhUmF0ZSA9IDcyOw0KKy8vCQkJCXByaW50aygiRE46IHdlYWsgc2lnbmFsIHN0cmVuZ3RoICglZCksIGRlZ3JhZGUgdG8gMzZNYnBzXG4iLCBDdXJyU2lnbmFsU3RyZW5ndGgpOw0KKwkJCX0NCisNCisJCQkvL1tUUkMgRGVsbCBMYWJdIEJ5cGFzcyAxMi85LzYsIElzYWlhaCAyMDA4LTAyLTE4IDIwOjAwIA0KKwkJCWlmKHByaXYtPkN1cnJlbnRPcGVyYVJhdGUgPT0zNikNCisJCQl7DQorCQkJCXByaXYtPmJVcGRhdGVBUkZSPXRydWU7DQorCQkJCXdyaXRlX25pY193b3JkKGRldiwgQVJGUiwgMHgwRjhGKTsgLy9ieXBhc3MgMTIvOS82DQorLy8JCQkJcHJpbnRrKCJETjogQVJGUj0weEY4RlxuIik7DQorCQkJfQ0KKwkJCWVsc2UgaWYocHJpdi0+YlVwZGF0ZUFSRlIpDQorCQkJew0KKwkJCQlwcml2LT5iVXBkYXRlQVJGUj1mYWxzZTsNCisJCQkJd3JpdGVfbmljX3dvcmQoZGV2LCBBUkZSLCAweDBGRkYpOyAvL3NldCAxTSB+IDU0TWJwcy4NCisvLwkJCQlwcmludGsoIkROOiBBUkZSPTB4RkZGXG4iKTsNCisJCQl9DQorCQkJCQ0KKwkJCS8vDQorCQkJLy8gV2hlbiBpdCBpcyBDQ0sgcmF0ZSwgaXQgbWF5IG5lZWQgdG8gdXBkYXRlIGluaXRpYWwgZ2FpbiB0byByZWNlaXZlIGxvd2VyIHBvd2VyIHBhY2tldHMuDQorCQkJLy8NCisJCQlpZihNZ250SXNDY2tSYXRlKHByaXYtPkN1cnJlbnRPcGVyYVJhdGUpKQ0KKwkJCXsNCisJCQkJYlVwZGF0ZUluaXRpYWxHYWluID0gdHJ1ZTsNCisJCQl9DQorLy8JCQlwcmludGsoIlN0YVJhdGVBZGFwdGl2ZTg3U0UoKTogRGVncmFkZSBUeCBSYXRlIHRvICVkXG4iLCBwcml2LT5DdXJyZW50T3BlcmFSYXRlKTsNCisJCX0NCisJfQ0KKwllbHNlDQorCXsNCisJCWlmKHByaXYtPlRyeURvd25Db3VudExvd0RhdGEgPiAwKQ0KKwkJCXByaXYtPlRyeURvd25Db3VudExvd0RhdGEgLS07DQorCX0NCisJCQkNCisJLy8gS2VlcCB0aGUgVHggZmFpbCByYXRlIGNvdW50IHRvIGVxdWFsIHRvIDB4MTUgYXQgbW9zdC4NCisJLy8gUmVkdWNlIHRoZSBmYWlsIGNvdW50IGF0IGxlYXN0IHRvIDEwIHNlYyBpZiB0eCByYXRlIGlzIHRlbmRpbmcgc3RhYmxlLg0KKwlpZihwcml2LT5GYWlsVHhSYXRlQ291bnQgPj0gMHgxNSB8fCANCisJCSghYlRyeVVwICYmICFiVHJ5RG93biAmJiBwcml2LT5UcnlEb3duQ291bnRMb3dEYXRhID09IDAgJiYgcHJpdi0+VHJ5dXBpbmdDb3VudCAmJiBwcml2LT5GYWlsVHhSYXRlQ291bnQgPiAweDYpKQ0KKwl7DQorCQlwcml2LT5GYWlsVHhSYXRlQ291bnQgLS07DQorCX0JCQ0KKw0KKw0KKwlPZmRtVHhQd3JJZHggID0gcHJpdi0+Y2h0eHB3cl9vZmRtW3ByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdOyANCisJQ2NrVHhQd3JJZHggID0gcHJpdi0+Y2h0eHB3cltwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXTsgDQorCQ0KKwkvL1tUUkMgRGVsbCBMYWJdIE1hYzB4OWUgaW5jcmVhc2UgMiBsZXZlbCBpbiAzNk1+MThNIHNpdHVhdGlvbiwgSXNhaWFoIDIwMDgtMDItMTggMjQ6MDAgDQorCWlmKChwcml2LT5DdXJyZW50T3BlcmFSYXRlIDwgOTYpICYmKHByaXYtPkN1cnJlbnRPcGVyYVJhdGUgPiAyMikpDQorCXsNCisJCXUxYkNjayA9IHJlYWRfbmljX2J5dGUoZGV2LCBDQ0tfVFhBR0MpOw0KKwkJdTFiT2ZkbSA9IHJlYWRfbmljX2J5dGUoZGV2LCBPRkRNX1RYQUdDKTsNCisNCisJCS8vIGNhc2UgMTogTmV2ZXIgZW50ZXIgSGlnaCBwb3dlcg0KKwkJaWYodTFiQ2NrID09IENja1R4UHdySWR4ICkNCisJCXsNCisJCQlpZih1MWJPZmRtICE9IChPZmRtVHhQd3JJZHgrMikgKQ0KKwkJCXsNCisJCQlwcml2LT5iRW5oYW5jZVR4UHdyPSB0cnVlOw0KKwkJCXUxYk9mZG0gPSAoKHUxYk9mZG0rMikgPiAzNSkgPyAzNTogKHUxYk9mZG0rMik7DQorCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBPRkRNX1RYQUdDLCB1MWJPZmRtKTsNCisvLwkJCXByaW50aygiRW5oYW5jZSBPRkRNX1RYQUdDIDogKysrKysgdTFiT2ZkbT0gMHgleFxuIiwgdTFiT2ZkbSk7DQorCQkJfQ0KKwkJfQ0KKwkJLy8gY2FzZSAyOiBlbnRlciBoaWdoIHBvd2VyDQorCQllbHNlIGlmKHUxYkNjayA8IENja1R4UHdySWR4KQ0KKwkJew0KKwkJCWlmKCFwcml2LT5iRW5oYW5jZVR4UHdyKQ0KKwkJCXsNCisJCQkJcHJpdi0+YkVuaGFuY2VUeFB3cj0gdHJ1ZTsNCisJCQkJdTFiT2ZkbSA9ICgodTFiT2ZkbSsyKSA+IDM1KSA/IDM1OiAodTFiT2ZkbSsyKTsNCisJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBPRkRNX1RYQUdDLCB1MWJPZmRtKTsNCisJCQkJLy9SVF9UUkFDRShDT01QX1JBVEUsIERCR19UUkFDRSwgKCJFbmhhbmNlIE9GRE1fVFhBR0MoMikgOiArKysrKyB1MWJPZmRtPSAweCV4XG4iLCB1MWJPZmRtKSk7DQorCQkJfQ0KKwkJfQ0KKwl9DQorCWVsc2UgaWYocHJpdi0+YkVuaGFuY2VUeFB3cikgIC8vNTQvNDgvMTEvNS41LzIvMQ0KKwl7DQorCQl1MWJDY2sgPSByZWFkX25pY19ieXRlKGRldiwgQ0NLX1RYQUdDKTsNCisJCXUxYk9mZG0gPSByZWFkX25pY19ieXRlKGRldiwgT0ZETV9UWEFHQyk7DQorDQorCQkvLyBjYXNlIDE6IE5ldmVyIGVudGVyIEhpZ2ggcG93ZXINCisJCWlmKHUxYkNjayA9PSBDY2tUeFB3cklkeCApDQorCQl7DQorCQlwcml2LT5iRW5oYW5jZVR4UHdyPSBmYWxzZTsNCisJCXdyaXRlX25pY19ieXRlKGRldiwgT0ZETV9UWEFHQywgT2ZkbVR4UHdySWR4KTsNCisJCS8vcHJpbnRrKCJSZWNvdmVyIE9GRE1fVFhBR0MgOiA9PT09PSB1MWJPZmRtPSAweCV4XG4iLCBPZmRtVHhQd3JJZHgpOw0KKwkJfQ0KKwkJLy8gY2FzZSAyOiBlbnRlciBoaWdoIHBvd2VyDQorCQllbHNlIGlmKHUxYkNjayA8IENja1R4UHdySWR4KQ0KKwkJew0KKwkJCXByaXYtPmJFbmhhbmNlVHhQd3I9IGZhbHNlOw0KKwkJCXUxYk9mZG0gPSAoKHUxYk9mZG0tMikgPiAwKSA/ICh1MWJPZmRtLTIpOiAwOw0KKwkJCXdyaXRlX25pY19ieXRlKGRldiwgT0ZETV9UWEFHQywgdTFiT2ZkbSk7DQorCQkJLy9SVF9UUkFDRShDT01QX1JBVEUsIERCR19UUkFDRSwgKCJSZWNvdmVyIE9GRE1fVFhBR0MoMik6ID09PT09IHUxYk9mZG09IDB4JXhcbiIsIHUxYk9mZG0pKTsNCisNCisJCX0NCisJfQ0KKw0KKwkvLw0KKwkvLyBXZSBuZWVkIHVwZGF0ZSBpbml0aWFsIGdhaW4gd2hlbiB3ZSBzZXQgdHggcmF0ZSAiZnJvbSBPRkRNIHRvIENDSyIgb3INCisJLy8gImZyb20gQ0NLIHRvIE9GRE0iLiANCisJLy8NCitTZXRJbml0aWFsR2FpbjoNCisJaWYoYlVwZGF0ZUluaXRpYWxHYWluKQ0KKwl7DQorCQlpZihNZ250SXNDY2tSYXRlKHByaXYtPkN1cnJlbnRPcGVyYVJhdGUpKSAvLyBDQ0sNCisJCXsNCisJCQlpZihwcml2LT5Jbml0aWFsR2FpbiA+IHByaXYtPlJlZ0JNb2RlR2FpblN0YWdlKQ0KKwkJCXsNCisJCQkJcHJpdi0+SW5pdGlhbEdhaW5CYWNrVXA9IHByaXYtPkluaXRpYWxHYWluOw0KKw0KKwkJCQlpZihDdXJyU2lnbmFsU3RyZW5ndGggPCAtODUpIC8vIExvdyBwb3dlciwgT0ZETSBbMHgxN10gPSAyNi4NCisJCQkJew0KKwkJCQkJLy9TRDMgU1lzIHN1Z2dlc3QgdGhhdCBDdXJyU2lnbmFsU3RyZW5ndGggPCAtNjUsIG9mZG0gMHgxNz0yNi4NCisJCQkJCXByaXYtPkluaXRpYWxHYWluID0gcHJpdi0+UmVnQk1vZGVHYWluU3RhZ2U7DQorCQkJCX0NCisJCQkJZWxzZSBpZihwcml2LT5Jbml0aWFsR2FpbiA+IHByaXYtPlJlZ0JNb2RlR2FpblN0YWdlICsgMSkNCisJCQkJew0KKwkJCQkJcHJpdi0+SW5pdGlhbEdhaW4gLT0gMjsNCisJCQkJfQ0KKwkJCQllbHNlDQorCQkJCXsNCisJCQkJCXByaXYtPkluaXRpYWxHYWluIC0tOw0KKwkJCQl9DQorCQkJCXByaW50aygiU3RhUmF0ZUFkYXB0aXZlODdTRSgpOiB1cGRhdGUgaW5pdF9nYWluIHRvIGluZGV4ICVkIGZvciBkYXRlIHJhdGUgJWRcbiIscHJpdi0+SW5pdGlhbEdhaW4sIHByaXYtPkN1cnJlbnRPcGVyYVJhdGUpOwkJCQ0KKwkJCQlVcGRhdGVJbml0aWFsR2FpbihkZXYpOw0KKwkJCX0NCisJCX0NCisJCWVsc2UgLy8gT0ZETQ0KKwkJewkJCQ0KKwkJCWlmKHByaXYtPkluaXRpYWxHYWluIDwgNCkNCisJCQl7DQorCQkJCXByaXYtPkluaXRpYWxHYWluQmFja1VwPSBwcml2LT5Jbml0aWFsR2FpbjsNCisNCisJCQkJcHJpdi0+SW5pdGlhbEdhaW4gKys7DQorCQkJCXByaW50aygiU3RhUmF0ZUFkYXB0aXZlODdTRSgpOiB1cGRhdGUgaW5pdF9nYWluIHRvIGluZGV4ICVkIGZvciBkYXRlIHJhdGUgJWRcbiIscHJpdi0+SW5pdGlhbEdhaW4sIHByaXYtPkN1cnJlbnRPcGVyYVJhdGUpOwkJCQ0KKwkJCQlVcGRhdGVJbml0aWFsR2FpbihkZXYpOw0KKwkJCX0JCQkJCQ0KKwkJfQ0KKwl9DQorDQorCS8vUmVjb3JkIHRoZSByZWxhdGVkIGluZm8NCisJcHJpdi0+TGFzdFJldHJ5UmF0ZSA9IEN1cnJSZXRyeVJhdGU7DQorCXByaXYtPkxhc3RUeFRocm91Z2hwdXQgPSBUeFRocm91Z2hwdXQ7DQorCXByaXYtPmllZWU4MDIxMS0+cmF0ZSA9IHByaXYtPkN1cnJlbnRPcGVyYVJhdGUgKiA1Ow0KK30NCisNCisjZW5kaWYNCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49S0VSTkVMX1ZFUlNJT04oMiw2LDIwKQ0KK3ZvaWQgcnRsODE4MF9yYXRlX2FkYXB0ZXIoc3RydWN0IHdvcmtfc3RydWN0ICogd29yaykNCit7DQorCXN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrID0gY29udGFpbmVyX29mKHdvcmssc3RydWN0IGRlbGF5ZWRfd29yayx3b3JrKTsNCisgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKGR3b3JrLHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLHJhdGVfYWRhcHRlcl93cSk7DQorICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWVlZS0+ZGV2Ow0KKyNlbHNlDQordm9pZCBydGw4MTgwX3JhdGVfYWRhcHRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQ0KK3sNCisNCisjZW5kaWYNCisgICAgICAgIC8vc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOw0KKy8vICAgIERNRVNHKCItLS0tPnJ0bDgxODBfcmF0ZV9hZGFwdGVyIik7DQorICAgICAgICBTdGFSYXRlQWRhcHRpdmU4N1NFKGRldik7DQorLy8gICBETUVTRygiPC0tLS1ydGw4MTgwX3JhdGVfYWRhcHRlciIpOw0KK30NCit2b2lkIHRpbWVyX3JhdGVfYWRhcHRpdmUodW5zaWduZWQgbG9uZyBkYXRhKQ0KK3sNCisJc3RydWN0IHI4MTgwX3ByaXYqIHByaXYgPSBpZWVlODAyMTFfcHJpdigoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhKTsNCisJLy9ETUVTRygiLS0tLT50aW1lcl9yYXRlX2FkYXB0aXZlKClcbiIpOw0KKwlpZighcHJpdi0+dXApDQorCXsNCisvLwkJRE1FU0coIjwtLS0tdGltZXJfcmF0ZV9hZGFwdGl2ZSgpOmRyaXZlciBpcyBub3QgdXAhXG4iKTsNCisJCXJldHVybjsNCisJfQ0KKwlpZigocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlICE9IElXX01PREVfTUFTVEVSKQ0KKwkJCSYmIChwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpICYmDQorCQkJKHByaXYtPkZvcmNlZERhdGFSYXRlID09IDApICkNCisJew0KKy8vCURNRVNHKCJ0aW1lcl9yYXRlX2FkYXB0aXZlKCk6c2NoZWR1bGUgcmF0ZV9hZGFwdGVyX3dxXG4iKTsNCisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUw0KKwkJcXVldWVfd29yayhwcml2LT5pZWVlODAyMTEtPndxLCAodm9pZCAqKSZwcml2LT5pZWVlODAyMTEtPnJhdGVfYWRhcHRlcl93cSk7DQorLy8JCVN0YVJhdGVBZGFwdGl2ZTg3U0UoKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YSk7DQorI2VuZGlmDQorCX0NCisJcHJpdi0+cmF0ZWFkYXB0ZXJfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBNU0VDUyhwcml2LT5SYXRlQWRhcHRpdmVQZXJpb2QpOw0KKwlhZGRfdGltZXIoJnByaXYtPnJhdGVhZGFwdGVyX3RpbWVyKTsNCisJLy9ETUVTRygiPC0tLS10aW1lcl9yYXRlX2FkYXB0aXZlKClcbiIpOw0KK30NCisvL2J5IGFteSAwODAzMTJ9DQordm9pZA0KK1N3QW50ZW5uYURpdmVyc2l0eVJ4T2s4MTg1KA0KKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCANCisJdTggU2lnbmFsU3RyZW5ndGgNCisJKQ0KK3sNCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOw0KKw0KKy8vCXByaW50aygiK1N3QW50ZW5uYURpdmVyc2l0eVJ4T2s4MTg1OiBSeFNzOiAlZFxuIiwgU2lnbmFsU3RyZW5ndGgpOw0KKw0KKwlwcml2LT5BZFJ4T2tDbnQrKzsNCisNCisJaWYoIHByaXYtPkFkUnhTaWduYWxTdHJlbmd0aCAhPSAtMSkNCisJew0KKwkJcHJpdi0+QWRSeFNpZ25hbFN0cmVuZ3RoID0gKChwcml2LT5BZFJ4U2lnbmFsU3RyZW5ndGgqNykgKyAoU2lnbmFsU3RyZW5ndGgqMykpIC8gMTA7DQorCX0NCisJZWxzZQ0KKwl7IC8vIEluaXRpYWxpemF0aW9uIGNhc2UuDQorCQlwcml2LT5BZFJ4U2lnbmFsU3RyZW5ndGggPSBTaWduYWxTdHJlbmd0aDsNCisJfQ0KKy8veytieSBhbXkgMDgwMzEyDQorCWlmKCBwcml2LT5MYXN0UnhQa3RBbnRlbm5hICkgLy9NYWluIGFudGVubmEuCQ0KKwkJcHJpdi0+QWRNYWluQW50ZW5uYVJ4T2tDbnQrKzsJDQorCWVsc2UJIC8vIEF1eCBhbnRlbm5hLg0KKwkJcHJpdi0+QWRBdXhBbnRlbm5hUnhPa0NudCsrOw0KKy8vK2J5IGFteSAwODAzMTINCisvLwlwcmludGsoIi1Td0FudGVubmFEaXZlcnNpdHlSeE9rODE4NTogQWRSeE9rQ250OiAlZCBBZFJ4U2lnbmFsU3RyZW5ndGg6ICVkXG4iLCBwcml2LT5BZFJ4T2tDbnQsIHByaXYtPkFkUnhTaWduYWxTdHJlbmd0aCk7DQorfQ0KKy8vDQorLy8JRGVzY3JpcHRpb246DQorLy8JCUNoYW5nZSBBbnRlbm5hIFN3aXRjaC4NCisvLw0KK2Jvb2wNCitTZXRBbnRlbm5hODE4NSgNCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwNCisJdTgJCXUxYkFudGVubmFJbmRleA0KKwkpDQorew0KKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7DQorCWJvb2wgYkFudGVubmFTd2l0Y2hlZCA9IGZhbHNlOw0KKw0KKy8vCXByaW50aygiK1NldEFudGVubmE4MTg1KCk6IEFudGVubmEgaXMgc3dpdGNoaW5nIHRvOiAlZCBcbiIsIHUxYkFudGVubmFJbmRleCk7DQorDQorCXN3aXRjaCh1MWJBbnRlbm5hSW5kZXgpDQorCXsNCisJY2FzZSAwOg0KKwkJc3dpdGNoKHByaXYtPnJmX2NoaXApDQorCQl7DQorCQljYXNlIFJGX1pFQlJBMjoNCisJCWNhc2UgUkZfWkVCUkE0Og0KKyNpZmRlZiBDT05GSUdfUlRMODE4NUINCisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUw0KKwkJCS8vIE1hYyByZWdpc3RlciwgbWFpbiBhbnRlbm5hDQorCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBBTlRTRUwsIDB4MDMpOyANCisJCQkvL2Jhc2UgYmFuZA0KKwkJCXdyaXRlX3BoeV9jY2soZGV2LDB4MTEsIDB4OWIpOyAvLyBDb25maWcgQ0NLIFJYIGFudGVubmEuDQorCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDBkLCAweDVjKTsgLy8gQ29uZmlnIE9GRE0gUlggYW50ZW5uYS4NCisNCisjZWxzZQ0KKwkJCS8vIE1hYyByZWdpc3RlciwgbWFpbiBhbnRlbm5hDQorCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBBTlRTRUwsIDB4MDMpOyANCisJCQkvL2Jhc2UgYmFuZA0KKwkJCXdyaXRlX3BoeV9jY2soZGV2LCAweDEwLCAweDliKTsgLy8gQ29uZmlnIENDSyBSWCBhbnRlbm5hLg0KKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwZCwgMHg1Yyk7IC8vIENvbmZpZyBPRkRNIFJYIGFudGVubmEuDQorI2VuZGlmDQorI2VuZGlmDQorDQorCQkJYkFudGVubmFTd2l0Y2hlZCA9IHRydWU7DQorCQkJYnJlYWs7DQorDQorCQlkZWZhdWx0Og0KKwkJCXByaW50aygiU2V0QW50ZW5uYTgxODU6IHVua293biBSRkNoaXBJRCglZClcbiIsIHByaXYtPnJmX2NoaXApOw0KKwkJCWJyZWFrOw0KKwkJfQ0KKwkJYnJlYWs7DQorDQorCWNhc2UgMToNCisJCXN3aXRjaChwcml2LT5yZl9jaGlwKQ0KKwkJew0KKwkJY2FzZSBSRl9aRUJSQTI6DQorCQljYXNlIFJGX1pFQlJBNDoNCisjaWZkZWYgQ09ORklHX1JUTDgxODVCDQorI2lmZGVmIENPTkZJR19SVEw4MThYX1MNCisJCQkvLyBNYWMgcmVnaXN0ZXIsIGF1eCBhbnRlbm5hDQorCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBBTlRTRUwsIDB4MDApOyANCisJCQkvL2Jhc2UgYmFuZA0KKwkJCXdyaXRlX3BoeV9jY2soZGV2LCAweDExLCAweGJiKTsgLy8gQ29uZmlnIENDSyBSWCBhbnRlbm5hLg0KKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwZCwgMHg1NCk7IC8vIENvbmZpZyBPRkRNIFJYIGFudGVubmEuDQorI2Vsc2UNCisJCQkvLyBNYWMgcmVnaXN0ZXIsIGF1eCBhbnRlbm5hDQorCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBBTlRTRUwsIDB4MDApOyANCisJCQkvL2Jhc2UgYmFuZA0KKwkJCXdyaXRlX3BoeV9jY2soZGV2LCAweDEwLCAweGJiKTsgLy8gQ29uZmlnIENDSyBSWCBhbnRlbm5hLg0KKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwZCwgMHg1NCk7IC8vIENvbmZpZyBPRkRNIFJYIGFudGVubmEuDQorI2VuZGlmDQorI2VuZGlmDQorDQorCQkJYkFudGVubmFTd2l0Y2hlZCA9IHRydWU7DQorCQkJYnJlYWs7DQorDQorCQlkZWZhdWx0Og0KKwkJCXByaW50aygiU2V0QW50ZW5uYTgxODU6IHVua293biBSRkNoaXBJRCglZClcbiIsIHByaXYtPnJmX2NoaXApOw0KKwkJCWJyZWFrOw0KKwkJfQ0KKwkJYnJlYWs7DQorDQorCWRlZmF1bHQ6DQorCQlwcmludGsoIlNldEFudGVubmE4MTg1OiB1bmtvd24gdTFiQW50ZW5uYUluZGV4KCVkKVxuIiwgdTFiQW50ZW5uYUluZGV4KTsNCisJCWJyZWFrOw0KKwl9DQorDQorCWlmKGJBbnRlbm5hU3dpdGNoZWQpDQorCXsNCisJCXByaXYtPkN1cnJBbnRlbm5hSW5kZXggPSB1MWJBbnRlbm5hSW5kZXg7DQorCX0NCisNCisvLwlwcmludGsoIi1TZXRBbnRlbm5hODE4NSgpOiByZXR1cm4gKCUjWClcbiIsIGJBbnRlbm5hU3dpdGNoZWQpOw0KKw0KKwlyZXR1cm4gYkFudGVubmFTd2l0Y2hlZDsNCit9DQorLy8NCisvLwlEZXNjcmlwdGlvbjoNCisvLwkJVG9nZ2xlIEFudGVubmEgc3dpdGNoLg0KKy8vDQorYm9vbA0KK1N3aXRjaEFudGVubmEoDQorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYNCisJKQ0KK3sNCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOw0KKw0KKwlib29sCQliUmVzdWx0Ow0KKw0KKwlpZihwcml2LT5DdXJyQW50ZW5uYUluZGV4ID09IDApDQorCXsNCisjaWYgMC8vbHptIGRlbCAwODA4MjYNCisvL2J5IGFteSAwODAzMTINCisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUw0KKwkJaWYocHJpdi0+YlN3QW50ZW5uYURpdmVyaXR5KQ0KKwkJCWJSZXN1bHQgPSBTZXRBbnRlbm5hQ29uZmlnODdTRShkZXYsIDEsIHRydWUpOw0KKwkJZWxzZQkJCQ0KKyNlbmRpZg0KKyNlbmRpZg0KKwkJCWJSZXN1bHQgPSBTZXRBbnRlbm5hODE4NShkZXYsIDEpOw0KKy8vYnkgYW15IDA4MDMxMg0KKy8vCQlwcmludGsoIlN3aXRjaEFudGVubmEoKTogc3dpdGNoaW5nIHRvIGFudGVubmEgMSAuLi4uLi5cbiIpOw0KKy8vCQliUmVzdWx0ID0gU2V0QW50ZW5uYTgxODUoZGV2LCAxKTsvLy1ieSBhbXkgMDgwMzEyDQorCX0NCisJZWxzZQ0KKwl7DQorI2lmIDAvL2x6bSBkZWwgMDgwODI2DQorLy9ieSBhbXkgMDgwMzEyDQorI2lmZGVmIENPTkZJR19SVEw4MThYX1MNCisJCWlmKHByaXYtPmJTd0FudGVubmFEaXZlcml0eSkNCisJCQliUmVzdWx0ID0gU2V0QW50ZW5uYUNvbmZpZzg3U0UoZGV2LCAwLCB0cnVlKTsNCisJCWVsc2UJDQorI2VuZGlmDQorI2VuZGlmDQorCQkJYlJlc3VsdCA9IFNldEFudGVubmE4MTg1KGRldiwgMCk7DQorLy9ieSBhbXkgMDgwMzEyDQorLy8JCXByaW50aygiU3dpdGNoQW50ZW5uYSgpOiBzd2l0Y2hpbmcgdG8gYW50ZW5uYSAwIC4uLi4uLlxuIik7DQorLy8JCWJSZXN1bHQgPSBTZXRBbnRlbm5hODE4NShkZXYsIDApOy8vLWJ5IGFteSAwODAzMTINCisJfQ0KKw0KKwlyZXR1cm4gYlJlc3VsdDsNCit9DQorLy8NCisvLwlEZXNjcmlwdGlvbjoNCisvLwkJRW5naW5lIG9mIFNXIEFudGVubmEgRGl2ZXJzaXR5IG1lY2hhbmlzbS4NCisvLwkJU2luY2UgODE4NyBoYXMgbm8gVHggcGFydCBpbmZvcm1hdGlvbiwgDQorLy8JCXRoaXMgaW1wbGVtZW50YXRpb24gaXMgb25seSBkZXBlbmRlbmQgb24gUnggcGFydCBpbmZvcm1hdGlvbi4gDQorLy8NCisvLwkyMDA2LjA0LjE3LCBieSByY25qa28uDQorLy8NCit2b2lkDQorU3dBbnRlbm5hRGl2ZXJzaXR5KA0KKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2DQorCSkNCit7DQorCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsNCisJYm9vbCAgIGJTd0NoZWNrU1M9ZmFsc2U7DQorLy8JcHJpbnRrKCIrU3dBbnRlbm5hRGl2ZXJzaXR5KCk6IEN1cnJBbnRlbm5hSW5kZXg6ICVkXG4iLCBwcml2LT5DdXJyQW50ZW5uYUluZGV4KTsNCisvLwlwcmludGsoIkFkVGlja0NvdW50IGlzICVkXG4iLHByaXYtPkFkVGlja0NvdW50KTsNCisvL2J5IGFteSAwODAzMTINCisJaWYoYlN3Q2hlY2tTUykNCisJew0KKwkJcHJpdi0+QWRUaWNrQ291bnQrKzsNCisJDQorCQlwcmludGsoIigxKSBBZFRpY2tDb3VudDogJWQsIEFkQ2hlY2tQZXJpb2Q6ICVkXG4iLCANCisJCQlwcml2LT5BZFRpY2tDb3VudCwgcHJpdi0+QWRDaGVja1BlcmlvZCk7DQorCQlwcmludGsoIigyKSBBZFJ4U2lnbmFsU3RyZW5ndGg6ICVsZCwgQWRSeFNzVGhyZXNob2xkOiAlbGRcbiIsIA0KKwkJCXByaXYtPkFkUnhTaWduYWxTdHJlbmd0aCwgcHJpdi0+QWRSeFNzVGhyZXNob2xkKTsNCisJfQ0KKy8vCXByaXYtPkFkVGlja0NvdW50Kys7Ly8tYnkgYW15IDA4MDMxMg0KKwkNCisJLy8gQ2FzZSAxLiBObyBMaW5rLg0KKwlpZihwcml2LT5pZWVlODAyMTEtPnN0YXRlICE9IElFRUU4MDIxMV9MSU5LRUQpDQorCXsNCisJLy8JcHJpbnRrKCJTd0FudGVubmFEaXZlcnNpdHkoKTogQ2FzZSAxLiBObyBMaW5rLlxuIik7DQorDQorCQlwcml2LT5iQWRTd2l0Y2hlZENoZWNraW5nID0gZmFsc2U7DQorCQkvLyBJIHN3aXRjaCBhbnRlbm5hIGhlcmUgdG8gcHJldmVudCBhbnkgb25lIG9mIGFudGVubmEgaXMgYnJva2VuIGJlZm9yZSBsaW5rIGVzdGFibGlzaGVkLCAyMDA2LjA0LjE4LCBieSByY25qa28uLg0KKwkJU3dpdGNoQW50ZW5uYShkZXYpOw0KKwl9DQorCS8vIENhc2UgMi4gTGlua2VkIGJ1dCBubyBwYWNrZXQgcmVjZWl2ZWQuDQorCWVsc2UgaWYocHJpdi0+QWRSeE9rQ250ID09IDApDQorCXsNCisJLy8JcHJpbnRrKCJTd0FudGVubmFEaXZlcnNpdHkoKTogQ2FzZSAyLiBMaW5rZWQgYnV0IG5vIHBhY2tldCByZWNlaXZlZC5cbiIpOw0KKw0KKwkJcHJpdi0+YkFkU3dpdGNoZWRDaGVja2luZyA9IGZhbHNlOw0KKwkJU3dpdGNoQW50ZW5uYShkZXYpOw0KKwl9DQorCS8vIENhc2UgMy4gRXZhbHVhdGUgbGFzdCBhbnRlbm5hIHN3aXRjaCBhY3Rpb24gYW5kIHVuZG8gaXQgaWYgbmVjZXNzYXJ5Lg0KKwllbHNlIGlmKHByaXYtPmJBZFN3aXRjaGVkQ2hlY2tpbmcgPT0gdHJ1ZSkNCisJew0KKwkvLwlwcmludGsoIlN3QW50ZW5uYURpdmVyc2l0eSgpOiBDYXNlIDMuIEV2YWx1YXRlIGxhc3QgYW50ZW5uYSBzd2l0Y2ggYWN0aW9uLlxuIik7DQorDQorCQlwcml2LT5iQWRTd2l0Y2hlZENoZWNraW5nID0gZmFsc2U7DQorDQorCQkvLyBBZGp1c3QgUnggc2lnbmFsIHN0cmVuZ3RoIHRocmVhc2hvbGQuDQorCQlwcml2LT5BZFJ4U3NUaHJlc2hvbGQgPSAocHJpdi0+QWRSeFNpZ25hbFN0cmVuZ3RoICsgcHJpdi0+QWRSeFNzQmVmb3JlU3dpdGNoZWQpIC8gMjsNCisNCisJCXByaXYtPkFkUnhTc1RocmVzaG9sZCA9IChwcml2LT5BZFJ4U3NUaHJlc2hvbGQgPiBwcml2LT5BZE1heFJ4U3NUaHJlc2hvbGQpID8JDQorCQkJCQlwcml2LT5BZE1heFJ4U3NUaHJlc2hvbGQ6IHByaXYtPkFkUnhTc1RocmVzaG9sZDsNCisJCWlmKHByaXYtPkFkUnhTaWduYWxTdHJlbmd0aCA8IHByaXYtPkFkUnhTc0JlZm9yZVN3aXRjaGVkKQ0KKwkJeyAvLyBSeCBzaWduYWwgc3RyZW5ndGggaXMgbm90IGltcHJvdmVkIGFmdGVyIHdlIHN3dGljaGVkIGFudGVubmEuID0+IFN3aWNoIGJhY2suDQorLy8JCQlwcmludGsoIlN3QW50ZW5uYURpdmVyc2l0eSgpOiBSeCBTaWduYWwgU3RyZW5ndGggaXMgbm90IGltcHJvdmVkLCBDdXJyUnhTczogJWQsIExhc3RSeFNzOiAlZFxuIiwgDQorLy8JCQkJcHJpdi0+QWRSeFNpZ25hbFN0cmVuZ3RoLCBwcml2LT5BZFJ4U3NCZWZvcmVTd2l0Y2hlZCk7DQorLy9ieSBhbXkgMDgwMzEyDQorCQkJLy8gSW5jcmVhc2UgQW50ZW5uYSBEaXZlcnNpdHkgY2hlY2tpbmcgcGVyaW9kIGR1ZSB0byBiYWQgZGVjaXNpb24uDQorCQkJcHJpdi0+QWRDaGVja1BlcmlvZCAqPSAyOw0KKy8vYnkgYW15IDA4MDMxMg0KKwkJCS8vIEluY3JlYXNlIEFudGVubmEgRGl2ZXJzaXR5IGNoZWNraW5nIHBlcmlvZC4NCisJCQlpZihwcml2LT5BZENoZWNrUGVyaW9kID4gcHJpdi0+QWRNYXhDaGVja1BlcmlvZCkNCisJCQkJcHJpdi0+QWRDaGVja1BlcmlvZCA9IHByaXYtPkFkTWF4Q2hlY2tQZXJpb2Q7DQorCQ0KKwkJCS8vIFdyb25nIGRlY2Vpc2lvbiA9PiBzd2l0Y2ggYmFjay4NCisJCQlTd2l0Y2hBbnRlbm5hKGRldik7DQorCQl9DQorCQllbHNlDQorCQl7IC8vIFJ4IFNpZ25hbCBTdHJlbmd0aCBpcyBpbXByb3ZlZC4gDQorLy8JCQlwcmludGsoIlN3QW50ZW5uYURpdmVyc2l0eSgpOiBSeCBTaWduYWwgU3RyZW5ndGggaXMgaW1wcm92ZWQsIEN1cnJSeFNzOiAlZCwgTGFzdFJ4U3M6ICVkXG4iLCANCisvLwkJCQlwcml2LT5BZFJ4U2lnbmFsU3RyZW5ndGgsIHByaXYtPkFkUnhTc0JlZm9yZVN3aXRjaGVkKTsNCisNCisJCQkvLyBSZXNldCBBbnRlbm5hIERpdmVyc2l0eSBjaGVja2luZyBwZXJpb2QgdG8gaXRzIG1pbiB2YWx1ZS4NCisJCQlwcml2LT5BZENoZWNrUGVyaW9kID0gcHJpdi0+QWRNaW5DaGVja1BlcmlvZDsNCisJCX0NCisNCisvLwkJcHJpbnRrKCJTd0FudGVubmFEaXZlcnNpdHkoKTogQWRSeFNzVGhyZXNob2xkOiAlZCwgQWRDaGVja1BlcmlvZDogJWRcbiIsDQorLy8JCQlwcml2LT5BZFJ4U3NUaHJlc2hvbGQsIHByaXYtPkFkQ2hlY2tQZXJpb2QpOw0KKwl9DQorCS8vIENhc2UgNC4gRXZhbHVhdGUgaWYgd2Ugc2hhbGwgc3dpdGNoIGFudGVubmEgbm93Lg0KKwkvLyBDYXVzZSBUYWJsZSBTcGVlZCBpcyB2ZXJ5IGZhc3QgaW4gVFJDIERlbGwgTGFiLCB3ZSBjaGVjayBpdCBldmVyeSB0aW1lLiANCisJZWxzZS8vIGlmKHByaXYtPkFkVGlja0NvdW50ID49IHByaXYtPkFkQ2hlY2tQZXJpb2QpLy8tYnkgYW15IDA4MDMxMg0KKwl7DQorLy8JCXByaW50aygiU3dBbnRlbm5hRGl2ZXJzaXR5KCk6IENhc2UgNC4gRXZhbHVhdGUgaWYgd2Ugc2hhbGwgc3dpdGNoIGFudGVubmEgbm93LlxuIik7DQorDQorCQlwcml2LT5BZFRpY2tDb3VudCA9IDA7DQorDQorCQkvLw0KKwkJLy8gPFJvZ2VyX05vdGVzPiBXZSBldmFsdWF0ZSBSeE9rIGNvdW50cyBmb3IgZWFjaCBhbnRlbm5hIGZpcnN0IGFuZCB0aGFuIA0KKwkJLy8gZXZhbHVhdGUgc2lnbmFsIHN0cmVuZ3RoLiANCisJCS8vIFRoZSBmb2xsb3dpbmcgb3BlcmF0aW9uIGNhbiBvdmVyY29tZSB0aGUgZGlzYWJpbGl0eSBvZiBDQ0Egb24gYm90aCB0d28gYW50ZW5uYXMNCisJCS8vIFdoZW4gc2lnbmFsIHN0cmVuZ3RoIHdhcyBleHRyZW1lbHkgbG93IG9yIGhpZ2guDQorCQkvLyAyMDA4LjAxLjMwLg0KKwkJLy8gDQorCQkNCisJCS8vDQorCQkvLyBFdmFsdWF0ZSBSeE9rIGNvdW50IGZyb20gZWFjaCBhbnRlbm5hIGlmIHdlIHNoYWxsIHN3aXRjaCBkZWZhdWx0IGFudGVubmEgbm93Lg0KKwkJLy8gQWRkZWQgYnkgUm9nZXIsIDIwMDguMDIuMjEuDQorLy97YnkgYW15IDA4MDMxMg0KKwkJaWYoKHByaXYtPkFkTWFpbkFudGVubmFSeE9rQ250IDwgcHJpdi0+QWRBdXhBbnRlbm5hUnhPa0NudCkgDQorCQkJJiYgKHByaXYtPkN1cnJBbnRlbm5hSW5kZXggPT0gMCkpDQorCQl7IC8vIFdlIHNldCBNYWluIGFudGVubmEgYXMgZGVmYXVsdCBidXQgUnhPayBjb3VudCB3YXMgbGVzcyB0aGFuIEF1eCBvbmVzLg0KKw0KKwkvLwkJcHJpbnRrKCJTd0FudGVubmFEaXZlcnNpdHkoKTogTWFpbiBhbnRlbm5hIFJ4T0sgaXMgcG9vciwgQWRNYWluQW50ZW5uYVJ4T2tDbnQ6ICVkLCBBZEF1eEFudGVubmFSeE9rQ250OiAlZFxuIiwgDQorCS8vCQkJcHJpdi0+QWRNYWluQW50ZW5uYVJ4T2tDbnQsIHByaXYtPkFkQXV4QW50ZW5uYVJ4T2tDbnQpOw0KKwkJCQ0KKwkJCS8vIFN3aXRjaCB0byBBdXggYW50ZW5uYS4NCisJCQlTd2l0Y2hBbnRlbm5hKGRldik7CQ0KKwkJCXByaXYtPmJIV0FkU3dpdGNoZWQgPSB0cnVlOw0KKwkJfQ0KKwkJZWxzZSBpZigocHJpdi0+QWRBdXhBbnRlbm5hUnhPa0NudCA8IHByaXYtPkFkTWFpbkFudGVubmFSeE9rQ250KSANCisJCQkmJiAocHJpdi0+Q3VyckFudGVubmFJbmRleCA9PSAxKSkNCisJCXsgLy8gV2Ugc2V0IEF1eCBhbnRlbm5hIGFzIGRlZmF1bHQgYnV0IFJ4T2sgY291bnQgd2FzIGxlc3MgdGhhbiBNYWluIG9uZXMuDQorDQorCS8vCQlwcmludGsoIlN3QW50ZW5uYURpdmVyc2l0eSgpOiBBdXggYW50ZW5uYSBSeE9LIGlzIHBvb3IsIEFkTWFpbkFudGVubmFSeE9rQ250OiAlZCwgQWRBdXhBbnRlbm5hUnhPa0NudDogJWRcbiIsIA0KKwkvLwkJCXByaXYtPkFkTWFpbkFudGVubmFSeE9rQ250LCBwcml2LT5BZEF1eEFudGVubmFSeE9rQ250KTsNCisJCQkNCisJCQkvLyBTd2l0Y2ggdG8gTWFpbiBhbnRlbm5hLg0KKwkJCVN3aXRjaEFudGVubmEoZGV2KTsNCisJCQlwcml2LT5iSFdBZFN3aXRjaGVkID0gdHJ1ZTsNCisJCX0NCisJCWVsc2UNCisJCXsvLyBEZWZhdWx0IGFudGVubmEgaXMgYmV0dGVyLg0KKw0KKwkvLwkJcHJpbnRrKCJTd0FudGVubmFEaXZlcnNpdHkoKTogRGVmYXVsdCBhbnRlbm5hIGlzIGJldHRlci4sIEFkTWFpbkFudGVubmFSeE9rQ250OiAlZCwgQWRBdXhBbnRlbm5hUnhPa0NudDogJWRcbiIsIA0KKwkvLwkJCXByaXYtPkFkTWFpbkFudGVubmFSeE9rQ250LCBwcml2LT5BZEF1eEFudGVubmFSeE9rQ250KTsNCisNCisJCQkvLyBTdGlsbCBuZWVkIHRvIGNoZWNrIGN1cnJlbnQgc2lnbmFsIHN0cmVuZ3RoLg0KKwkJCXByaXYtPmJIV0FkU3dpdGNoZWQgPSBmYWxzZTsJDQorCQl9DQorCQkvLw0KKwkJLy8gPFJvZ2VyX05vdGVzPiBXZSBldmFsdWF0ZSBSeCBzaWduYWwgc3RyZW5ndGggT05MWSB3aGVuIGRlZmF1bHQgYW50ZW5uYSANCisJCS8vIGRpZG4ndCBjaGFuZ2VkIGJ5IEhXIGV2YWx1YXRpb24uIA0KKwkJLy8gMjAwOC4wMi4yNy4NCisJCS8vDQorCQkvLyBbVFJDIERlbGwgTGFiXSBTaWduYWxTdHJlbmd0aCBpcyBpbmFjY3VyYWN5LiBJc2FpYWggMjAwOC0wMy0wNSANCisJCS8vIEZvciBleGFtcGxlLCBUaHJvdWdocHV0IG9mIGF1eCBpcyBiZXR0ZXIgdGhhbiBtYWluIGFudGVubmEoYWJvdXQgMTBNIHYucyAyTSksIA0KKwkJLy8gYnV0IEFkUnhTaWduYWxTdHJlbmd0aCBpcyBsZXNzIHRoYW4gbWFpbi4gDQorCQkvLyBPdXIgZ3Vlc3MgaXMgdGhhdCBtYWluIGFudGVubmEgaGF2ZSBsb3dlciB0aHJvdWdocHV0IGFuZCBnZXQgbWFueSBjaGFuZ2UgDQorCQkvLyB0byByZWNlaXZlIG1vcmUgQ0NLIHBhY2tldHMoZXguQmVhY29uKSB3aGljaCBoYXZlIHN0cm9uZ2VyIFNpZ25hbFN0cmVuZ3RoLg0KKwkJLy8NCisJCWlmKCAoIXByaXYtPmJIV0FkU3dpdGNoZWQpICYmIChiU3dDaGVja1NTKSkNCisJCXsNCisvL2J5IGFteSAwODAzMTJ9DQorCQkvLyBFdmFsdWF0ZSBSeCBzaWduYWwgc3RyZW5ndGggaWYgd2Ugc2hhbGwgc3dpdGNoIGFudGVubmEgbm93Lg0KKwkJaWYocHJpdi0+QWRSeFNpZ25hbFN0cmVuZ3RoIDwgcHJpdi0+QWRSeFNzVGhyZXNob2xkKQ0KKwkJeyAvLyBSeCBzaWduYWwgc3RyZW5ndGggaXMgd2VhayA9PiBTd2l0Y2ggQW50ZW5uYS4NCisvLwkJCXByaW50aygiU3dBbnRlbm5hRGl2ZXJzaXR5KCk6IFJ4IFNpZ25hbCBTdHJlbmd0aCBpcyB3ZWFrLCBDdXJyUnhTczogJWQsIFJ4U3NUaHJlc2hvbGQ6ICVkXG4iLCANCisvLwkJCQlwcml2LT5BZFJ4U2lnbmFsU3RyZW5ndGgsIHByaXYtPkFkUnhTc1RocmVzaG9sZCk7CQ0KKw0KKwkJCXByaXYtPkFkUnhTc0JlZm9yZVN3aXRjaGVkID0gcHJpdi0+QWRSeFNpZ25hbFN0cmVuZ3RoOyANCisJCQlwcml2LT5iQWRTd2l0Y2hlZENoZWNraW5nID0gdHJ1ZTsNCisNCisJCQlTd2l0Y2hBbnRlbm5hKGRldik7DQorCQl9DQorCQllbHNlDQorCQl7IC8vIFJ4IHNpZ25hbCBzdHJlbmd0aCBpcyBPSy4gDQorLy8JCQlwcmludGsoIlN3QW50ZW5uYURpdmVyc2l0eSgpOiBSeCBTaWduYWwgU3RyZW5ndGggaXMgT0ssIEN1cnJSeFNzOiAlZCwgUnhTc1RocmVzaG9sZDogJWRcbiIsIA0KKy8vCQkJCXByaXYtPkFkUnhTaWduYWxTdHJlbmd0aCwgcHJpdi0+QWRSeFNzVGhyZXNob2xkKTsNCisNCisJCQlwcml2LT5iQWRTd2l0Y2hlZENoZWNraW5nID0gZmFsc2U7DQorCQkJLy8gSW5jcmVhc2UgUnggc2lnbmFsIHN0cmVuZ3RoIHRocmVhc2hvbGQgaWYgbmVjZXNzYXJ5Lg0KKwkJCWlmKAkocHJpdi0+QWRSeFNpZ25hbFN0cmVuZ3RoID4gKHByaXYtPkFkUnhTc1RocmVzaG9sZCArIDEwKSkgJiYgLy8gU2lnbmFsIGlzIG11Y2ggc3Ryb25nZXIgdGhhbiBjdXJyZW50IHRocmVzaG9sZA0KKwkJCQlwcml2LT5BZFJ4U3NUaHJlc2hvbGQgPD0gcHJpdi0+QWRNYXhSeFNzVGhyZXNob2xkKSAvLyBDdXJyZW50IHRocmVob2xkIGlzIG5vdCB5ZXQgcmVhY2ggdXBwZXIgbGltaXQuDQorCQkJew0KKwkJCQlwcml2LT5BZFJ4U3NUaHJlc2hvbGQgPSAocHJpdi0+QWRSeFNzVGhyZXNob2xkICsgcHJpdi0+QWRSeFNpZ25hbFN0cmVuZ3RoKSAvIDI7DQorCQkJCXByaXYtPkFkUnhTc1RocmVzaG9sZCA9IChwcml2LT5BZFJ4U3NUaHJlc2hvbGQgPiBwcml2LT5BZE1heFJ4U3NUaHJlc2hvbGQpID8NCisJCQkJCQkJCQkJCQlwcml2LT5BZE1heFJ4U3NUaHJlc2hvbGQ6IHByaXYtPkFkUnhTc1RocmVzaG9sZDsvLytieSBhbXkgMDgwMzEyDQorCQkJfQ0KKw0KKwkJCS8vIFJlZHVjZSBBbnRlbm5hIERpdmVyc2l0eSBjaGVja2luZyBwZXJpb2QgaWYgcG9zc2libGUuIA0KKwkJCWlmKCBwcml2LT5BZENoZWNrUGVyaW9kID4gcHJpdi0+QWRNaW5DaGVja1BlcmlvZCApDQorCQkJew0KKwkJCQlwcml2LT5BZENoZWNrUGVyaW9kIC89IDI7IA0KKwkJCX0NCisJCX0NCisJCX0NCisJfQ0KKy8vYnkgYW15IDA4MDMxMg0KKwkvLyBSZXNldCBhbnRlbm5hIGRpdmVyc2l0eSBSeCByZWxhdGVkIHN0YXRpc3RpY3MuDQorCXByaXYtPkFkUnhPa0NudCA9IDA7DQorCXByaXYtPkFkTWFpbkFudGVubmFSeE9rQ250ID0gMDsNCisJcHJpdi0+QWRBdXhBbnRlbm5hUnhPa0NudCA9IDA7DQorLy9ieSBhbXkgMDgwMzEyDQorDQorLy8JcHJpdi0+QWRSeE9rQ250ID0gMDsvLy1ieSBhbXkgMDgwMzEyDQorDQorLy8JcHJpbnRrKCItU3dBbnRlbm5hRGl2ZXJzaXR5KClcbiIpOw0KK30NCisNCisvLw0KKy8vCURlc2NyaXB0aW9uOg0KKy8vCQlSZXR1cm4gVFJVRSBpZiB3ZSBzaGFsbCBwZXJmb3JtIFR4IFBvd2VyIFRyYWNraW5nIE1lY2FobmlzbSwgRkFMU0Ugb3RoZXJ3aXNlLgkNCisvLw0KK2Jvb2wNCitDaGVja1R4UHdyVHJhY2tpbmcoCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYpDQorew0KKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7DQorDQorCWlmKCFwcml2LT5iVHhQb3dlclRyYWNrKQ0KKwl7DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisvL2x6bSByZXNlcnZlZCAwODA4MjYNCisJLy9pZihwcml2LT5iU2NhbkluUHJvZ3Jlc3MpDQorCS8vew0KKwkvLwlyZXR1cm4gZmFsc2U7DQorCS8vfQ0KKw0KKwkvL2lmIDg3U0UgaXMgaW4gSGlnaCBQb3dlciAsIGRvbid0IGRvIFR4IFBvd2VyIFRyYWNraW5nLiBhc2tlZCBieSBTRDMgRUQuIDIwMDgtMDgtMDggSXNhaWFoIA0KKwlpZihwcml2LT5iVG9VcGRhdGVUeFB3cikNCisJew0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorCQkNCisJcmV0dXJuIHRydWU7DQorfQ0KKw0KKw0KKy8vDQorLy8JRGVzY3JpcHRpb246DQorLy8JCVRpbWVyIGNhbGxiYWNrIGZ1bmN0aW9uIG9mIFNXIEFudGVubmEgRGl2ZXJzaXR5Lg0KKy8vDQordm9pZA0KK1N3QW50ZW5uYURpdmVyc2l0eVRpbWVyQ2FsbGJhY2soDQorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYNCisJKQ0KK3sNCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOw0KKwlSVF9SRl9QT1dFUl9TVEFURSBydFN0YXRlOw0KKwkNCisJLy9wcmludGsoIitTd0FudGVubmFEaXZlcnNpdHlUaW1lckNhbGxiYWNrKClcbiIpOw0KKw0KKwkvLw0KKwkvLyBXZSBkbyBOT1QgbmVlZCB0byBzd2l0Y2ggYW50ZW5uYSB3aGlsZSBSRiBpcyBvZmYuDQorCS8vIDIwMDcuMDUuMDksIGFkZGVkIGJ5IFJvZ2VyLg0KKwkvLw0KKwlydFN0YXRlID0gcHJpdi0+ZVJGUG93ZXJTdGF0ZTsNCisJZG97DQorCQlpZiAocnRTdGF0ZSA9PSBlUmZPZmYpDQorCQl7CQ0KKy8vCQkJcHJpbnRrKCJTd0FudGVubmFEaXZlcnNpdHlUaW1lciAtIFJGIGlzIE9GRi5cbiIpOw0KKwkJCWJyZWFrOw0KKwkJfSAgCQ0KKwkJZWxzZSBpZiAocnRTdGF0ZSA9PSBlUmZTbGVlcCkNCisJCXsJDQorCQkJLy8gRG9uJ3QgYWNjZXNzIEJCL1JGIHVuZGVyIERpc2FibGUgUExMIHNpdHVhdGlvbi4NCisJCQkvL1JUX1RSQUNFKChDT01QX1JGfENPTVBfQU5URU5OQSksIERCR19MT1VELCAoIlN3QW50ZW5uYURpdmVyc2l0eVRpbWVyQ2FsbGJhY2soKTogUkYgaXMgU2xlZXAgPT4gc2tpcCBpdFxuIikpOw0KKwkJCWJyZWFrOw0KKwkJfSAgDQorCQlTd0FudGVubmFEaXZlcnNpdHkoZGV2KTsNCisNCisJfXdoaWxlKGZhbHNlKTsNCisNCisJaWYocHJpdi0+dXApDQorCXsNCisJCXByaXYtPlN3QW50ZW5uYURpdmVyc2l0eVRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgTVNFQ1MoQU5URU5OQV9ESVZFUlNJVFlfVElNRVJfUEVSSU9EKTsNCisJCWFkZF90aW1lcigmcHJpdi0+U3dBbnRlbm5hRGl2ZXJzaXR5VGltZXIpOw0KKwl9DQorDQorCS8vcHJpbnRrKCItU3dBbnRlbm5hRGl2ZXJzaXR5VGltZXJDYWxsYmFjaygpXG4iKTsNCit9DQorDQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9kbS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9kbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZTkyZjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2RtLmgKQEAgLTAsMCArMSw0MSBAQAorI2lmbmRlZiBSODE4MF9ETV9IIA0KKyNkZWZpbmUgUjgxODBfRE1fSA0KKw0KKyNpbmNsdWRlICJyODE4MC5oIg0KKy8vI2luY2x1ZGUgInI4MTgwX2h3LmgiDQorLy8jaW5jbHVkZSAicjgxODBfOTNjeDYuaCINCit2b2lkIFN3QW50ZW5uYURpdmVyc2l0eVJ4T2s4MTg1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IFNpZ25hbFN0cmVuZ3RoKTsNCitib29sIFNldEFudGVubmE4MTg1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCXU4IHUxYkFudGVubmFJbmRleCk7DQorYm9vbCBTd2l0Y2hBbnRlbm5hKAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsNCit2b2lkIFN3QW50ZW5uYURpdmVyc2l0eShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2CSk7DQordm9pZCBTd0FudGVubmFEaXZlcnNpdHlUaW1lckNhbGxiYWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOw0KK2Jvb2wgQ2hlY2tEaWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7DQorYm9vbCBDaGVja0hpZ2hQb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsNCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApKQ0KK3ZvaWQgcnRsODE4MF9od19kaWdfd3EgKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7DQorI2Vsc2UNCit2b2lkIHJ0bDgxODBfaHdfZGlnX3dxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOw0KKyNlbmRpZg0KKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkpDQordm9pZCBydGw4MTgwX3R4X3B3X3dxIChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOw0KKyNlbHNlDQordm9pZCBydGw4MTgwX3R4X3B3X3dxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOw0KKyNlbmRpZg0KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj1LRVJORUxfVkVSU0lPTigyLDYsMjApDQordm9pZCBydGw4MTgwX3JhdGVfYWRhcHRlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKiB3b3JrKTsNCisNCisjZWxzZQ0KK3ZvaWQgcnRsODE4MF9yYXRlX2FkYXB0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7DQorDQorI2VuZGlmDQordm9pZCBUeFB3clRyYWNraW5nODdTRShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsNCitib29sIENoZWNrVHhQd3JUcmFja2luZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsNCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49S0VSTkVMX1ZFUlNJT04oMiw2LDIwKQ0KK3ZvaWQgcnRsODE4MF9yYXRlX2FkYXB0ZXIoc3RydWN0IHdvcmtfc3RydWN0ICogd29yayk7DQorI2Vsc2UNCit2b2lkIHJ0bDgxODBfcmF0ZV9hZGFwdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOw0KKyNlbmRpZg0KK3ZvaWQgdGltZXJfcmF0ZV9hZGFwdGl2ZSh1bnNpZ25lZCBsb25nIGRhdGEpOw0KKw0KKw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfZ2N0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2djdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2Y2I0MjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2djdC5jCkBAIC0wLDAgKzEsMjk2IEBACisvKgorICAgVGhpcyBmaWxlcyBjb250YWlucyBHQ1QgcmFkaW8gZnJvbnRlbmQgcHJvZ3JhbW1pbmcgcm91dGluZXMuCisKKyAgIFRoaXMgaXMgcGFydCBvZiBydGw4MTgwIE9wZW5Tb3VyY2UgZHJpdmVyCisgICBDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQtMjAwNSAgPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorICAgUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdQTCAoR2VuZXJhbCBQdWJsaWMgTGljZW5jZSkKKworICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBHUEwgcGFydCBvZiB0aGUKKyAgIG9mZmljaWFsIHJlYWx0ZWsgZHJpdmVyCisKKyAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgcnRsODE4MCBkcml2ZXIgc2tlbGV0b24KKyAgIGZyb20gUGF0cmljIFNjaGVua2UgJiBBbmRyZXMgU2Fsb21vbgorCisgICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEludGVsIFBybyBXaXJlbGVzcyAyMTAwIEdQTCBkcml2ZXIuCisKKyAgIENvZGUgZnJvbSBSdHc4MTgwIE5ldEJTRCBkcml2ZXIgYnkgRGF2aWQgWW91bmcgaGFzIGJlZW4gcmVhbGx5IHVzZWZ1bCB0bworICAgdW5kZXJzdGFuZCBzb21lIHRoaW5ncyBhbmQgZ2V0cyBzb21lIGlkZWFzCisKKyAgIENvZGUgZnJvbSBydGw4MTgxIHByb2plY3QgaGFzIGJlZW4gdXNlZnVsIHRvIG1lIHRvIHVuZGVyc3RhbmQgc29tZSB0aGluZ3MuCisKKyAgIFNvbWUgY29kZSBmcm9tICdEZXVjZScgd29yaworCisgICBXZSB3YW50IHRvIHRhbmtzIHRoZSBBdXRob3JzIG9mIHN1Y2ggcHJvamVjdHMgYW5kIHRoZSBOZGlzd3JhcHBlcgorICAgcHJvamVjdCBBdXRob3JzLgorKi8KKworCisjaW5jbHVkZSAicjgxODAuaCIKKyNpbmNsdWRlICJyODE4MF9ody5oIgorI2luY2x1ZGUgInI4MTgwX2djdC5oIgorCisKKy8vI2RlZmluZSBERUJVR19HQ1QKKworLyogdGhlIGZvbGxvd2luZyBleHBlcmltZW50IGFyZSBqdXN0IGV4cGVyaW1lbnRzLgorICogdGhpcyBtZWFucyBpZiB5b3UgZW5hYmxlIHRoZW0geW91IGNhbiBoYXZlIGV2ZXJ5IGtpbmQKKyAqIG9mIHJlc3VsdCwgaW5jbHVkZWQgZGFtYWdlIHRoZSBSRiBjaGlwLCBzbyBkb24ndAorICogdG91Y2ggdGhlbSBpZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCisgKiBJbiBhbnkgY2FzZSwgaWYgeW91IGRvIGl0LCBkbyBhdCB5b3VyIG93biByaXNrCisgKi8KKworLy8jZGVmaW5lIEdDVF9FWFBFUklNRU5UMSAgLy9pbXByb3ZlIFJYIHNlbnNpdml0eQorCisvLyNkZWZpbmUgR0NUX0VYUEVSSU1FTlQyCisKKy8vI2RlZmluZSBHQ1RfRVhQRVJJTUVOVDMgIC8vaXByb3ZlIGEgYml0IFJYIHNpZ25hbCBxdWFsaXR5ID8KKworLy8jZGVmaW5lIEdDVF9FWFBFUklNRU5UNCAvL21heWJlIHNvbHZlIHNvbWUgYnJva2VuZXNzIHdpdGggZXhwZXJpbWVudDEgPworCisvLyNkZWZpbmUgR0NUX0VYUEVSSU1FTlQ1CisKKy8vI2RlZmluZSBHQ1RfRVhQRVJJTUVOVDYgIC8vbm90IGdvb2QKKworCit1MzIgZ2N0X2NoYW5bXSA9IHsKKwkweDAsCS8vZHVtbXkgY2hhbm5lbCAwCisJMHgwLCAvLzEKKwkweDEsIC8vMgorCTB4MiwgLy8zCisJMHgzLCAvLzQKKwkweDQsIC8vNQorCTB4NSwgLy82CisJMHg2LCAvLzcKKwkweDcsIC8vOAorCTB4OCwgLy85CisJMHg5LCAvLzEwCisJMHhhLCAvLzExCisJMHhiLCAvLzEyCisJMHhjLCAvLzEzCisJMHhkLCAvLzE0Cit9OworCitpbnQgZ2N0X2VuY29kZVsxNl0gPSB7CisJMCwgOCwgNCwgMHhDLAorCTIsIDB4QSwgNiwgMHhFLAorCTEsIDksIDUsIDB4RCwKKwkzLCAweEIsIDcsIDB4RgorfTsKKwordm9pZCBnY3RfcmZfc3RhYmlsaXplKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwltZGVsYXkoMyk7IC8vZm9yIG5vdyB1c2UgYSBncmVhdCB2YWx1ZS4uIHdlIG1heSBvcHRpbWl6ZSBpbiBmdXR1cmUKK30KKworCit2b2lkIHdyaXRlX2djdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZHIsIHUzMiBkYXRhKQoreworLy8Jc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXUzMiBwaHlfY29uZmlnOworCisJcGh5X2NvbmZpZyA9ICBnY3RfZW5jb2RlWyhkYXRhICYgMHhmMDApID4+IDhdOworCXBoeV9jb25maWcgfD0gZ2N0X2VuY29kZVsoZGF0YSAmIDB4ZjApID4+IDQgXSA8PCA0OworCXBoeV9jb25maWcgfD0gZ2N0X2VuY29kZVsoZGF0YSAmIDB4ZikgICAgICAgXSA8PCA4OworCXBoeV9jb25maWcgfD0gZ2N0X2VuY29kZVsoYWRyID4+IDEpICYgMHhmICAgXSA8PCAxMjsKKwlwaHlfY29uZmlnIHw9ICAgICAgICAgICAgKGFkciAmIDEgKSAgICAgICAgICAgPDwgMTY7CisJcGh5X2NvbmZpZyB8PSBnY3RfZW5jb2RlWyhkYXRhICYgMHhmMDAwKT4+MTJdIDw8IDI0OworCisJcGh5X2NvbmZpZyB8PSAweDkwMDAwMDAwOyAvLyBNQUMgd2lsbCBiYW5nIGJpdHMgdG8gdGhlIGNoaXAKKworCisJd3JpdGVfbmljX2R3b3JkKGRldixQSFlfQ09ORklHLHBoeV9jb25maWcpOworI2lmZGVmIERFQlVHX0dDVAorCURNRVNHKCJXcml0aW5nIEdDVDogJXggKGFkciAleCkiLHBoeV9jb25maWcsYWRyKTsKKyNlbmRpZgorCWdjdF9yZl9zdGFiaWxpemUoZGV2KTsKK30KKworCisKK3ZvaWQgZ2N0X3dyaXRlX3BoeV9hbnRlbm5hKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsc2hvcnQgY2gpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXU4IGFudDsKKworCWFudCA9IEdDVF9BTlRFTk5BOworCWlmKHByaXYtPmFudGIpIC8qZGVmYXVsdCBhbnRlbm5hIGlzIGFudGVubmEgQiAqLworCQlhbnQgfD0gQkJfQU5URU5OQV9COworCWlmKGNoID09IDE0KQorCQlhbnQgfD0gQkJfQU5UQVRURU5fQ0hBTjE0OworCXdyaXRlX3BoeShkZXYsMHgxMCxhbnQpOworCS8vRE1FU0coIkJCIGFudGVubmEgJXggIixhbnQpOworfQorCisKK3ZvaWQgZ2N0X3JmX3NldF9jaGFuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IGNoKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIgdHhwdyA9IDB4ZmYgJiBwcml2LT5jaHR4cHdyW2NoXTsKKwl1MzIgY2hhbiA9IGdjdF9jaGFuW2NoXTsKKworCS8vd3JpdGVfcGh5KGRldiwzLHR4cHcpOworI2lmZGVmIERFQlVHX0dDVAorCURNRVNHKCJHY3Qgc2V0IGNoYW5uZWwiKTsKKyNlbmRpZgorCS8qIHNldCBUWCBwb3dlciAqLworCXdyaXRlX2djdChkZXYsMHgxNSwwKTsKKyAJd3JpdGVfZ2N0KGRldiw2LCB0eHB3KTsKKwl3cml0ZV9nY3QoZGV2LDB4MTUsIDB4MTApOworCXdyaXRlX2djdChkZXYsMHgxNSwwKTsKKworCS8qc2V0IGZyZXF1ZW5jeSovCisJd3JpdGVfZ2N0KGRldiw3LCAwKTsKKyAgICAgIAl3cml0ZV9nY3QoZGV2LDB4QiwgY2hhbik7CisgICAgICAJd3JpdGVfZ2N0KGRldiw3LCAweDEwMDApOworCisjaWZkZWYgREVCVUdfR0NUCisJRE1FU0coIkdjdCBzZXQgY2hhbm5lbCA+IHdyaXRlIHBoeSBhbnRlbm5hIik7CisjZW5kaWYKKworCisJZ2N0X3dyaXRlX3BoeV9hbnRlbm5hKGRldixjaCk7CisKK30KKworCit2b2lkIGdjdF9yZl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXUzMiBhbmFwYXJhbTsKKworCWFuYXBhcmFtID0gcmVhZF9uaWNfZHdvcmQoZGV2LEFOQVBBUkFNKTsKKwlhbmFwYXJhbSAmPSAweDAwMGZmZmZmOworCWFuYXBhcmFtIHw9IDB4M2Y5MDAwMDA7CisJcnRsODE4MF9zZXRfYW5hcGFyYW0oZGV2LCBhbmFwYXJhbSk7CisKKwl3cml0ZV9nY3QoZGV2LCAweDcsIDApOworCXdyaXRlX2djdChkZXYsIDB4MWYsIDB4NDUpOworCXdyaXRlX2djdChkZXYsIDB4MWYsIDB4NSk7CisJd3JpdGVfZ2N0KGRldiwgMHgwLCAweDhlNCk7Cit9CisKKwordm9pZCBnY3RfcmZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwkvL3UzMiBhbmFwYXJhbTsKKworCisJd3JpdGVfbmljX2J5dGUoZGV2LFBIWV9ERUxBWSwweDYpOwkvL3RoaXMgaXMgZ2VuZXJhbAorCXdyaXRlX25pY19ieXRlKGRldixDQVJSSUVSX1NFTlNFX0NPVU5URVIsMHg0Yyk7IC8vdGhpcyBpcyBnZW5lcmFsCisKKwkvL0RNRVNHKCIleCIsIHJlYWRfbmljX2R3b3JkKGRldixBTkFQQVJBTSkpOworCS8qIHdlIHNob3VsZCBzZXQgYW5hcGFybSBoZXJlKi8KKwkvL3J0bDgxODBfc2V0X2FuYXBhcmFtKGRldixhbmFwYXJhbSk7CisKKwl3cml0ZV9nY3QoZGV2LDB4MWYsMCk7CisJd3JpdGVfZ2N0KGRldiwweDFmLDApOworCXdyaXRlX2djdChkZXYsMHgxZiwweDQwKTsKKwl3cml0ZV9nY3QoZGV2LDB4MWYsMHg2MCk7CisJd3JpdGVfZ2N0KGRldiwweDFmLDB4NjEpOworCXdyaXRlX2djdChkZXYsMHgxZiwweDYxKTsKKwl3cml0ZV9nY3QoZGV2LDB4MCwweGFlNCk7CisJd3JpdGVfZ2N0KGRldiwweDFmLDB4MSk7CisJd3JpdGVfZ2N0KGRldiwweDFmLDB4NDEpOworCXdyaXRlX2djdChkZXYsMHgxZiwweDYxKTsKKwl3cml0ZV9nY3QoZGV2LDB4MSwweDFhMjMpOworCXdyaXRlX2djdChkZXYsMHgyLDB4NDk3MSk7CisJd3JpdGVfZ2N0KGRldiwweDMsMHg0MWRlKTsKKwl3cml0ZV9nY3QoZGV2LDB4NCwweDJkODApOworI2lmZGVmIEdDVF9FWFBFUklNRU5UMQorCS8vd3JpdGVfZ2N0KGRldiwweDUsMHg2ODEwKTsgIC8vIGZyb20genlkYXMgZHJpdmVyLiBzZW5zKyBidXQgcXVpdGUgc2xvdworCS8vd3JpdGVfZ2N0KGRldiwweDUsMHg2ODFmKTsgIC8vZ29vZCsgKHNvbWV3aGF0IHN0YWJsZSwgYmV0dGVyIHNlbnMsIHBlcmZvcm1hbmNlIGRlY2VudCkKKwl3cml0ZV9nY3QoZGV2LDB4NSwweDY4NWYpOyAgLy9nb29kIHBlcmZvcm1hbmNlcywgbm90IHN1cmUgc2VucyBpcyByZWFsbHkgc28gYmVldGVyCisJLy93cml0ZV9nY3QoZGV2LDB4NSwweDY4N2YpOyAgLy9nb29kIHBlcmZvcm1hbmNlcywgbWF5YmUgc2VucyBpcyBub3QgaW1wcm92ZWQKKwkvL3dyaXRlX2djdChkZXYsMHg1LDB4Njg5Zik7ICAvL2xpa2UgYWJvdmUKKwkvL3dyaXRlX2djdChkZXYsMHg1LDB4Njg1ZSk7ICAvL2JhZAorCS8vd3JpdGVfZ2N0KGRldiwweDUsMHg2OGZmKTsgIC8vZ29vZCsgKHNvbWV3aGF0IHN0YWJsZSwgYmV0dGVyIHNlbnMoPyksIHBlcmZvcm1hbmNlIGRlY2VudCkKKwkvL3dyaXRlX2djdChkZXYsMHg1LDB4NjhmMCk7ICAvL2JhZAorCS8vd3JpdGVfZ2N0KGRldiwweDUsMHg2Y2ZmKTsgIC8vc2VucysgYnV0IG5vdCBzbyBnb29kCisJLy93cml0ZV9nY3QoZGV2LDB4NSwweDZkZmYpOyAgLy9zZW5zKyxhcHBhcmVudGVseSB2ZXJ5IGdvb2QgYnV0IGJyb2tlbgorCS8vd3JpdGVfZ2N0KGRldiwweDUsMHg2NWZmKTsgIC8vc2VucyssZ29vZAorCS8vd3JpdGVfZ2N0KGRldiwweDUsMHg3OGZmKTsgIC8vc2VucyArIGJ1dCBhbG1vc3QgYnJva2VuCisJLy93cml0ZV9nY3QoZGV2LDB4NSwweDc4MTApOyAgLy8tIC8vc25lcyArIGJ1dCBicm9rZW4KKwkvL3dyaXRlX2djdChkZXYsMHg1LDB4NzgxZik7ICAvLy0tIC8vc2VucyArCisJLy93cml0ZV9nY3QoZGV2LDB4NSwweDc4ZjApOyAgLy9sb3cgc2VucworI2Vsc2UKKwl3cml0ZV9nY3QoZGV2LDB4NSwweDYxZmYpOyAgIC8vYmVzdCBwZXJmb3JtYW5jZSBidXQgd2VhayBzZW5zaXRpdml0eQorI2VuZGlmCisjaWZkZWYgR0NUX0VYUEVSSU1FTlQyCisJd3JpdGVfZ2N0KGRldiwweDYsMHhlKTsKKyNlbHNlCisJd3JpdGVfZ2N0KGRldiwweDYsMHgwKTsKKyNlbmRpZgorCXdyaXRlX2djdChkZXYsMHg3LDB4MCk7CisJd3JpdGVfZ2N0KGRldiwweDgsMHg3NTMzKTsKKwl3cml0ZV9nY3QoZGV2LDB4OSwweGM0MDEpOworCXdyaXRlX2djdChkZXYsMHhhLDB4MCk7CisJd3JpdGVfZ2N0KGRldiwweGMsMHgxYzcpOworCXdyaXRlX2djdChkZXYsMHhkLDB4MjlkMyk7CisJd3JpdGVfZ2N0KGRldiwweGUsMHgyZTgpOworCXdyaXRlX2djdChkZXYsMHgxMCwweDE5Mik7CisjaWZkZWYgR0NUX0VYUEVSSU1FTlQzCisJd3JpdGVfZ2N0KGRldiwweDExLDB4MjQ2KTsKKyNlbHNlCisJd3JpdGVfZ2N0KGRldiwweDExLDB4MjQ4KTsKKyNlbmRpZgorCXdyaXRlX2djdChkZXYsMHgxMiwweDApOworCXdyaXRlX2djdChkZXYsMHgxMywweDIwYzQpOworI2lmZGVmIEdDVF9FWFBFUklNRU5UNAorCXdyaXRlX2djdChkZXYsMHgxNCwweGY0ODgpOworI2Vsc2UKKwl3cml0ZV9nY3QoZGV2LDB4MTQsMHhmNGZjKTsKKyNlbmRpZgorI2lmZGVmIEdDVF9FWFBFUklNRU5UNQorCXdyaXRlX2djdChkZXYsMHgxNSwweGIxNTIpOworI2Vsc2UKKwl3cml0ZV9nY3QoZGV2LDB4MTUsMHgwKTsKKyNlbmRpZgorI2lmZGVmIEdDVF9FWFBFUklNRU5UNgorCXdyaXRlX2djdChkZXYsMHgxZSwweDEpOworI2VuZGlmCisJd3JpdGVfZ2N0KGRldiwweDE2LDB4MTUwMCk7CisKKwl3cml0ZV9nY3QoZGV2LDB4NywweDEwMDApOworCS8qd3JpdGVfZ2N0KGRldiwweDE1LDB4MCk7CisJd3JpdGVfZ2N0KGRldiwweDYsMHgxNSk7CisJd3JpdGVfZ2N0KGRldiwweDE1LDB4OCk7CisJd3JpdGVfZ2N0KGRldiwweDE1LDB4MCk7CisqLworCXdyaXRlX3BoeShkZXYsMCwweGE4KTsKKworLyoJd3JpdGVfZ2N0KGRldiwweDE1LDB4MCk7CisJd3JpdGVfZ2N0KGRldiwweDYsMHgxMik7CisJd3JpdGVfZ2N0KGRldiwweDE1LDB4OCk7CisJd3JpdGVfZ2N0KGRldiwweDE1LDB4MCk7CisqLworCXdyaXRlX3BoeShkZXYsMywweDApOworCXdyaXRlX3BoeShkZXYsNCwweGMwKTsgLyogbG5hIGRldCovCisJd3JpdGVfcGh5KGRldiw1LDB4OTApOworCXdyaXRlX3BoeShkZXYsNiwweDFlKTsKKwl3cml0ZV9waHkoZGV2LDcsMHg2NCk7CisKKyNpZmRlZiBERUJVR19HQ1QKKwlETUVTRygiR2N0IGluaXQ+IHdyaXRlIHBoeSBhbnRlbm5hIik7CisjZW5kaWYKKworCWdjdF93cml0ZV9waHlfYW50ZW5uYShkZXYscHJpdi0+Y2hhbik7CisKKwl3cml0ZV9waHkoZGV2LDB4MTEsMHg4OCk7CisJaWYoIXByaXYtPmRpdmVyc2l0eSkKKwkJd3JpdGVfcGh5KGRldiwweDEyLDB4YzApOworCWVsc2UKKwkJd3JpdGVfcGh5KGRldiwweDEyLDB4NDApOworCisJd3JpdGVfcGh5KGRldiwweDEzLDB4OTAgfCBwcml2LT5jc190cmVzaG9sZCApOworCisJd3JpdGVfcGh5KGRldiwweDE5LDB4MCk7CisJd3JpdGVfcGh5KGRldiwweDFhLDB4YTApOworCXdyaXRlX3BoeShkZXYsMHgxYiwweDQ0KTsKKworI2lmZGVmIERFQlVHX0dDVAorCURNRVNHKCJHY3QgaW5pdCA+IHNldCBjaGFubmVsMiIpOworI2VuZGlmCisKKwlnY3RfcmZfc2V0X2NoYW4oZGV2LHByaXYtPmNoYW4pOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9nY3QuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfZ2N0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU5NjVjYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfZ2N0LmgKQEAgLTAsMCArMSwyNSBAQAorLyoKKwlUaGlzIGlzIHBhcnQgb2YgcnRsODE4MCBPcGVuU291cmNlIGRyaXZlciAtIHYgMC4yMAorCUNvcHlyaWdodCAoQykgQW5kcmVhIE1lcmVsbG8gMjAwNCAgPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorCVJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCisKKwlQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEdQTCBwYXJ0IG9mIHRoZSBvZmZpY2lhbCByZWFsdGVrIGRyaXZlcgorCVBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgcnRsODE4MCBkcml2ZXIgc2tlbGV0b24gZnJvbSBQYXRyaWMgU2NoZW5rZSAmIEFuZHJlcyBTYWxvbW9uCisJUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBJbnRlbCBQcm8gV2lyZWxlc3MgMjEwMCBHUEwgZHJpdmVyCisKKwlXZSB3YW50IHRvIHRhbmtzIHRoZSBBdXRob3JzIG9mIHN1Y2ggcHJvamVjdHMgYW5kIHRoZSBOZGlzd3JhcHBlciBwcm9qZWN0IEF1dGhvcnMuCisqLworCisjZGVmaW5lIEdDVF9BTlRFTk5BIDB4QTMKKworCisvLyB3ZSB1c2UgdGhlIHVudG91Y2hlZCBlZXByb20gdmFsdWUtIGNyb3NzIHlvdXIgZmluZ2VyIDstKQorI2RlZmluZSBHQ1RfQU5BUEFSQU1fUFdSMV9PTiA/PworI2RlZmluZSBHQ1RfQU5BUEFSQU1fUFdSMF9PTiA/PworCisKKwordm9pZCBnY3RfcmZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgZ2N0X3JmX3NldF9jaGFuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsc2hvcnQgY2gpOworCit2b2lkIGdjdF9yZl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfaHcuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfaHcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjM4OTM0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9ody5oCkBAIC0wLDAgKzEsOTU2IEBACisvKgorCVRoaXMgaXMgcGFydCBvZiBydGw4MTgwIE9wZW5Tb3VyY2UgZHJpdmVyLgorCUNvcHlyaWdodCAoQykgQW5kcmVhIE1lcmVsbG8gMjAwNC0yMDA1ICA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisJUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdQTCAoR2VuZXJhbCBQdWJsaWMgTGljZW5jZSkKKworCVBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgR1BMIHBhcnQgb2YgdGhlCisJb2ZmaWNpYWwgUmVhbHRlayBkcml2ZXIuCisJUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBydGw4MTgwIGRyaXZlciBza2VsZXRvbgorCWZyb20gUGF0cmljIFNjaGVua2UgJiBBbmRyZXMgU2Fsb21vbi4KKwlQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEludGVsIFBybyBXaXJlbGVzcworCTIxMDAgR1BMIGRyaXZlci4KKworCVdlIHdhbnQgdG8gdGFua3MgdGhlIEF1dGhvcnMgb2YgdGhvc2UgcHJvamVjdHMKKwlhbmQgdGhlIE5kaXN3cmFwcGVyIHByb2plY3QgQXV0aG9ycy4KKyovCisKKy8qIE1hcml1c3ogTWF0dXN6ZWsgYWRkZWQgZnVsbCByZWdpc3RlcnMgZGVmaW5pdGlvbiB3aXRoIFJlYWx0ZWsncyBuYW1lICovCisKKy8qIHRoaXMgZmlsZSBjb250YWlucyByZWdpc3RlciBkZWZpbml0aW9ucyBmb3IgdGhlIHJ0bDgxODAgTUFDIGNvbnRyb2xsZXIgKi8KKyNpZm5kZWYgUjgxODBfSFcKKyNkZWZpbmUgUjgxODBfSFcKKworI2RlZmluZSBDT05GSUdfUlRMODE4NUIgIC8vc3VwcG9ydCBmb3IgcnRsODE4NUIsIHhpb25nLTIwMDYtMTEtMTUKKyNkZWZpbmUgQ09ORklHX1JUTDgxOFhfUworCisjZGVmaW5lIEJJVDAJMHgwMDAwMDAwMQorI2RlZmluZSBCSVQxCTB4MDAwMDAwMDIKKyNkZWZpbmUgQklUMgkweDAwMDAwMDA0CisjZGVmaW5lIEJJVDMJMHgwMDAwMDAwOAorI2RlZmluZSBCSVQ0CTB4MDAwMDAwMTAKKyNkZWZpbmUgQklUNQkweDAwMDAwMDIwCisjZGVmaW5lIEJJVDYJMHgwMDAwMDA0MAorI2RlZmluZSBCSVQ3CTB4MDAwMDAwODAKKyNkZWZpbmUgQklUOAkweDAwMDAwMTAwCisjZGVmaW5lIEJJVDkJMHgwMDAwMDIwMAorI2RlZmluZSBCSVQxMAkweDAwMDAwNDAwCisjZGVmaW5lIEJJVDExCTB4MDAwMDA4MDAKKyNkZWZpbmUgQklUMTIJMHgwMDAwMTAwMAorI2RlZmluZSBCSVQxMwkweDAwMDAyMDAwCisjZGVmaW5lIEJJVDE0CTB4MDAwMDQwMDAKKyNkZWZpbmUgQklUMTUJMHgwMDAwODAwMAorI2RlZmluZSBCSVQxNgkweDAwMDEwMDAwCisjZGVmaW5lIEJJVDE3CTB4MDAwMjAwMDAKKyNkZWZpbmUgQklUMTgJMHgwMDA0MDAwMAorI2RlZmluZSBCSVQxOQkweDAwMDgwMDAwCisjZGVmaW5lIEJJVDIwCTB4MDAxMDAwMDAKKyNkZWZpbmUgQklUMjEJMHgwMDIwMDAwMAorI2RlZmluZSBCSVQyMgkweDAwNDAwMDAwCisjZGVmaW5lIEJJVDIzCTB4MDA4MDAwMDAKKyNkZWZpbmUgQklUMjQJMHgwMTAwMDAwMAorI2RlZmluZSBCSVQyNQkweDAyMDAwMDAwCisjZGVmaW5lIEJJVDI2CTB4MDQwMDAwMDAKKyNkZWZpbmUgQklUMjcJMHgwODAwMDAwMAorI2RlZmluZSBCSVQyOAkweDEwMDAwMDAwCisjZGVmaW5lIEJJVDI5CTB4MjAwMDAwMDAKKyNkZWZpbmUgQklUMzAJMHg0MDAwMDAwMAorI2RlZmluZSBCSVQzMQkweDgwMDAwMDAwCisKKyNkZWZpbmUgTUFYX1NMRUVQX1RJTUUgKDEwMDAwKQorI2RlZmluZSBNSU5fU0xFRVBfVElNRSAoNTApCisKKyNkZWZpbmUgQkJfQU5UQVRURU5fQ0hBTjE0CTB4MGMKKyNkZWZpbmUgQkJfQU5URU5OQV9CIDB4NDAKKworI2RlZmluZSBCQl9IT1NUX0JBTkcgKDE8PDMwKQorI2RlZmluZSBCQl9IT1NUX0JBTkdfRU4gKDE8PDIpCisjZGVmaW5lIEJCX0hPU1RfQkFOR19DTEsgKDE8PDEpCisjZGVmaW5lIEJCX0hPU1RfQkFOR19EQVRBCSAxCisKKyNkZWZpbmUgQU5BUEFSQU1fVFhEQUNPRkZfU0hJRlQgMjcKKyNkZWZpbmUgQU5BUEFSQU1fUFdSMF9NQVNLICgoMTw8MzApfCgxPDwyOSl8KDE8PDI4KSkKKyNkZWZpbmUgQU5BUEFSQU1fUFdSMF9TSElGVCAyOAorI2RlZmluZSBBTkFQQVJBTV9QV1IxX01BU0sgKCgxPDwyNil8KDE8PDI1KXwoMTw8MjQpfCgxPDwyMyl8KDE8PDIyKXwoMTw8MjEpfCgxPDwyMCkpCisjZGVmaW5lIEFOQVBBUkFNX1BXUjFfU0hJRlQgMjAKKworI2RlZmluZSBNQUMwIDAKKyNkZWZpbmUgTUFDMSAxCisjZGVmaW5lIE1BQzIgMgorI2RlZmluZSBNQUMzIDMKKyNkZWZpbmUgTUFDNCA0CisjZGVmaW5lIE1BQzUgNQorI2RlZmluZSBDTUQgMHgzNworI2RlZmluZSBDTURfUlNUX1NISUZUIDQKKyNkZWZpbmUgQ01EX1JFU0VSVkVEX01BU0sgKCgxPDwxKSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSkKKyNkZWZpbmUgQ01EX1JYX0VOQUJMRV9TSElGVCAzCisjZGVmaW5lIENNRF9UWF9FTkFCTEVfU0hJRlQgMgorCisjZGVmaW5lIEVQUk9NX0NNRCAweDUwCisjZGVmaW5lIEVQUk9NX0NNRF9SRVNFUlZFRF9NQVNLICgoMTw8NSl8KDE8PDQpKQorI2RlZmluZSBFUFJPTV9DTURfT1BFUkFUSU5HX01PREVfU0hJRlQgNgorI2RlZmluZSBFUFJPTV9DTURfT1BFUkFUSU5HX01PREVfTUFTSyAoKDE8PDcpfCgxPDw2KSkKKyNkZWZpbmUgRVBST01fQ01EX0NPTkZJRyAweDMKKyNkZWZpbmUgRVBST01fQ01EX05PUk1BTCAwCisjZGVmaW5lIEVQUk9NX0NNRF9MT0FEIDEKKyNkZWZpbmUgRVBST01fQ01EX1BST0dSQU0gMgorI2RlZmluZSBFUFJPTV9DU19TSElGVCAzCisjZGVmaW5lIEVQUk9NX0NLX1NISUZUIDIKKyNkZWZpbmUgRVBST01fV19TSElGVCAxCisjZGVmaW5lIEVQUk9NX1JfU0hJRlQgMAorI2RlZmluZSBDT05GSUcyX0RNQV9QT0xMSU5HX01PREVfU0hJRlQgMworI2RlZmluZSBJTlRBIDB4M2UKKyNkZWZpbmUgSU5UQV9UWE9WRVJGTE9XICgxPDwxNSkKKyNkZWZpbmUgSU5UQV9USU1FT1VUICgxPDwxNCkKKyNkZWZpbmUgSU5UQV9CRUFDT05USU1FT1VUICgxPDwxMykKKyNkZWZpbmUgSU5UQV9BVElNICgxPDwxMikKKyNkZWZpbmUgSU5UQV9CRUFDT05ERVNDRVJSICgxPDwxMSkKKyNkZWZpbmUgSU5UQV9CRUFDT05ERVNDT0sgKDE8PDEwKQorI2RlZmluZSBJTlRBX0hJUFJJT1JJVFlERVNDRVJSICgxPDw5KQorI2RlZmluZSBJTlRBX0hJUFJJT1JJVFlERVNDT0sgKDE8PDgpCisjZGVmaW5lIElOVEFfTk9STVBSSU9SSVRZREVTQ0VSUiAoMTw8NykKKyNkZWZpbmUgSU5UQV9OT1JNUFJJT1JJVFlERVNDT0sgKDE8PDYpCisjZGVmaW5lIElOVEFfUlhPVkVSRkxPVyAoMTw8NSkKKyNkZWZpbmUgSU5UQV9SWERFU0NFUlIgKDE8PDQpCisjZGVmaW5lIElOVEFfTE9XUFJJT1JJVFlERVNDRVJSICgxPDwzKQorI2RlZmluZSBJTlRBX0xPV1BSSU9SSVRZREVTQ09LICgxPDwyKQorI2RlZmluZSBJTlRBX1JYQ1JDRVJSICgxPDwxKQorI2RlZmluZSBJTlRBX1JYT0sgKDEpCisjZGVmaW5lIElOVEFfTUFTSyAweDNjCisjZGVmaW5lIFJYUklOR19BRERSIDB4ZTQgLy8gcGFnZSAwCisjZGVmaW5lIFBHU0VMRUNUIDB4NWUKKyNkZWZpbmUgUEdTRUxFQ1RfUEdfU0hJRlQgMAorI2RlZmluZSBSWF9DT05GIDB4NDQKKyNkZWZpbmUgTUFDX0ZJTFRFUl9NQVNLICgoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NSkgfCBcCisoMTw8MTIpIHwgKDE8PDE4KSB8ICgxPDwxOSkgfCAoMTw8MjApIHwgKDE8PDIxKSB8ICgxPDwyMikgfCAoMTw8MjMpKQorI2RlZmluZSBSWF9DSEVDS19CU1NJRF9TSElGVCAyMworI2RlZmluZSBBQ0NFUFRfUFdSX0ZSQU1FX1NISUZUIDIyCisjZGVmaW5lIEFDQ0VQVF9NTkdfRlJBTUVfU0hJRlQgMjAKKyNkZWZpbmUgQUNDRVBUX0NUTF9GUkFNRV9TSElGVCAxOQorI2RlZmluZSBBQ0NFUFRfREFUQV9GUkFNRV9TSElGVCAxOAorI2RlZmluZSBBQ0NFUFRfSUNWRVJSX0ZSQU1FX1NISUZUIDEyCisjZGVmaW5lIEFDQ0VQVF9DUkNFUlJfRlJBTUVfU0hJRlQgNQorI2RlZmluZSBBQ0NFUFRfQkNBU1RfRlJBTUVfU0hJRlQgMworI2RlZmluZSBBQ0NFUFRfTUNBU1RfRlJBTUVfU0hJRlQgMgorI2RlZmluZSBBQ0NFUFRfQUxMTUFDX0ZSQU1FX1NISUZUIDAKKyNkZWZpbmUgQUNDRVBUX05JQ01BQ19GUkFNRV9TSElGVCAxCisjZGVmaW5lIFJYX0ZJRk9fVEhSRVNIT0xEX01BU0sgKCgxPDwxMykgfCAoMTw8MTQpIHwgKDE8PDE1KSkKKyNkZWZpbmUgUlhfRklGT19USFJFU0hPTERfU0hJRlQgMTMKKyNkZWZpbmUgUlhfRklGT19USFJFU0hPTERfMTI4IDMKKyNkZWZpbmUgUlhfRklGT19USFJFU0hPTERfMjU2IDQKKyNkZWZpbmUgUlhfRklGT19USFJFU0hPTERfNTEyIDUKKyNkZWZpbmUgUlhfRklGT19USFJFU0hPTERfMTAyNCA2CisjZGVmaW5lIFJYX0ZJRk9fVEhSRVNIT0xEX05PTkUgNworI2RlZmluZSBSWF9BVVRPUkVTRVRQSFlfU0hJRlQgMjgKKyNkZWZpbmUgRVBST01fVFlQRV9TSElGVCA2CisjZGVmaW5lIFRYX0NPTkYgMHg0MAorI2RlZmluZSBUWF9DT05GX0hFQURFUl9BVVRPSUNSRU1FTlRfU0hJRlQgMzAKKyNkZWZpbmUgVFhfTE9PUEJBQ0tfU0hJRlQgMTcKKyNkZWZpbmUgVFhfTE9PUEJBQ0tfTUFDIDEKKyNkZWZpbmUgVFhfTE9PUEJBQ0tfQkFTRUJBTkQgMgorI2RlZmluZSBUWF9MT09QQkFDS19OT05FIDAKKyNkZWZpbmUgVFhfTE9PUEJBQ0tfQ09OVElOVUUgMworI2RlZmluZSBUWF9MT09QQkFDS19NQVNLICgoMTw8MTcpfCgxPDwxOCkpCisjZGVmaW5lIFRYX0RQUkVUUllfU0hJRlQgMAorI2RlZmluZSBSODE4MF9NQVhfUkVUUlkgMjU1CisjZGVmaW5lIFRYX1JUU1JFVFJZX1NISUZUIDgKKyNkZWZpbmUgVFhfTk9JQ1ZfU0hJRlQgMTkKKyNkZWZpbmUgVFhfTk9DUkNfU0hJRlQgMTYKKyNkZWZpbmUgVFhfRE1BX1BPTExJTkcgMHhkOQorI2RlZmluZSBUWF9ETUFfUE9MTElOR19CRUFDT05fU0hJRlQgNworI2RlZmluZSBUWF9ETUFfUE9MTElOR19ISVBSSU9SSVRZX1NISUZUIDYKKyNkZWZpbmUgVFhfRE1BX1BPTExJTkdfTk9STVBSSU9SSVRZX1NISUZUIDUKKyNkZWZpbmUgVFhfRE1BX1BPTExJTkdfTE9XUFJJT1JJVFlfU0hJRlQgNAorI2RlZmluZSBUWF9ETUFfU1RPUF9CRUFDT05fU0hJRlQgMworI2RlZmluZSBUWF9ETUFfU1RPUF9ISVBSSU9SSVRZX1NISUZUIDIKKyNkZWZpbmUgVFhfRE1BX1NUT1BfTk9STVBSSU9SSVRZX1NISUZUIDEKKyNkZWZpbmUgVFhfRE1BX1NUT1BfTE9XUFJJT1JJVFlfU0hJRlQgMAorI2RlZmluZSBUWF9NQU5BR0VQUklPUklUWV9SSU5HX0FERFIgMHgwQworI2RlZmluZSBUWF9CS1BSSU9SSVRZX1JJTkdfQUREUiAweDEwCisjZGVmaW5lIFRYX0JFUFJJT1JJVFlfUklOR19BRERSIDB4MTQKKyNkZWZpbmUgVFhfVklQUklPUklUWV9SSU5HX0FERFIgMHgyMAorI2RlZmluZSBUWF9WT1BSSU9SSVRZX1JJTkdfQUREUiAweDI0CisjZGVmaW5lIFRYX0hJR0hQUklPUklUWV9SSU5HX0FERFIgMHgyOAorLy9BQ19WSSBhbmQgTG93IHByaW9yaXR5IHNoYXJlIHRoZSBzYW5lIHF1ZXVlCisjZGVmaW5lIFRYX0xPV1BSSU9SSVRZX1JJTkdfQUREUiBUWF9WSVBSSU9SSVRZX1JJTkdfQUREUgorLy9BQ19WTyBhbmQgTm9ybSBwcmlvcml0eSBzaGFyZSB0aGUgc2FtZSBxdWV1ZQorI2RlZmluZSBUWF9OT1JNUFJJT1JJVFlfUklOR19BRERSIFRYX1ZPUFJJT1JJVFlfUklOR19BRERSCisKKyNkZWZpbmUgTUFYX1JYX0RNQV9NQVNLICgoMTw8OCkgfCAoMTw8OSkgfCAoMTw8MTApKQorI2RlZmluZSBNQVhfUlhfRE1BXzIwNDggNworI2RlZmluZSBNQVhfUlhfRE1BXzEwMjQJNgorI2RlZmluZSBNQVhfUlhfRE1BX1NISUZUIDEwCisjZGVmaW5lIElOVF9USU1FT1VUIDB4NDgKKyNkZWZpbmUgQ09ORklHM19DTEtSVU5fU0hJRlQgMgorI2RlZmluZSBDT05GSUczX0FOQVBBUkFNX1dfU0hJRlQgNgorI2RlZmluZSBBTkFQQVJBTSAweDU0CisjZGVmaW5lIEJFQUNPTl9JTlRFUlZBTCAweDcwCisjZGVmaW5lIEJFQUNPTl9JTlRFUlZBTF9NQVNLICgoMTw8MCl8KDE8PDEpfCgxPDwyKXwoMTw8Myl8KDE8PDQpfCgxPDw1KXwgXAorKDE8PDYpfCgxPDw3KXwoMTw8OCl8KDE8PDkpKQorI2RlZmluZSBBVElNX01BU0sgKCgxPDwwKXwoMTw8MSl8KDE8PDIpfCgxPDwzKXwoMTw8NCl8KDE8PDUpfCgxPDw2KXwoMTw8Nyl8IFwKKygxPDw4KXwoMTw8OSkpCisjZGVmaW5lIEFUSU0gMHg3MgorI2RlZmluZSBFUFJPTV9DU19TSElGVCAzCisjZGVmaW5lIEVQUk9NX0NLX1NISUZUIDIKKyNkZWZpbmUgUEhZX0RFTEFZIDB4NzgKKyNkZWZpbmUgUEhZX0NPTkZJRyAweDgwCisjZGVmaW5lIFBIWV9BRFIgMHg3YworI2RlZmluZSBQSFlfUkVBRCAweDdlCisjZGVmaW5lIENBUlJJRVJfU0VOU0VfQ09VTlRFUiAweDc5IC8vYnl0ZQorI2RlZmluZSBTRUNVUklUWSAweDVmIC8vMTIwOSB0aGlzIGlzIHN0aCB3cm9uZworI2RlZmluZSBTRUNVUklUWV9XRVBfVFhfRU5BQkxFX1NISUZUIDEKKyNkZWZpbmUgU0VDVVJJVFlfV0VQX1JYX0VOQUJMRV9TSElGVCAwCisjZGVmaW5lIFNFQ1VSSVRZX0VOQ1JZUF8xMDQgMQorI2RlZmluZSBTRUNVUklUWV9FTkNSWVBfU0hJRlQgNAorI2RlZmluZSBTRUNVUklUWV9FTkNSWVBfTUFTSyAoKDE8PDQpfCgxPDw1KSkKKyNkZWZpbmUgS0VZMCAweDkwICAvLzEyMDkgdGhpcyBpcyBzdGggd3JvbmcKKyNkZWZpbmUgQ09ORklHMl9BTlRFTk5BX1NISUZUIDYKKyNkZWZpbmUgVFhfQkVBQ09OX1JJTkdfQUREUiAweDRjCisjZGVmaW5lIENPTkZJRzBfV0VQNDBfU0hJRlQgNworI2RlZmluZSBDT05GSUcwX1dFUDEwNF9TSElGVCA2CisjZGVmaW5lIEFHQ1JFU0VUX1NISUZUIDUKKworCisKKy8qCisgKiBPcGVyYXRpb25hbCByZWdpc3RlcnMgb2Zmc2V0cyBpbiBQQ0kgKEkvTykgc3BhY2UuCisgKiBSZWFsVGVrIG5hbWVzIGFyZSB1c2VkLgorICovCisKKyNkZWZpbmUgSURSMCAweDAwMDAKKyNkZWZpbmUgSURSMSAweDAwMDEKKyNkZWZpbmUgSURSMiAweDAwMDIKKyNkZWZpbmUgSURSMyAweDAwMDMKKyNkZWZpbmUgSURSNCAweDAwMDQKKyNkZWZpbmUgSURSNSAweDAwMDUKKworLyogMHgwMDA2IC0gMHgwMDA3IC0gcmVzZXJ2ZWQgKi8KKworI2RlZmluZSBNQVIwIDB4MDAwOAorI2RlZmluZSBNQVIxIDB4MDAwOQorI2RlZmluZSBNQVIyIDB4MDAwQQorI2RlZmluZSBNQVIzIDB4MDAwQgorI2RlZmluZSBNQVI0IDB4MDAwQworI2RlZmluZSBNQVI1IDB4MDAwRAorI2RlZmluZSBNQVI2IDB4MDAwRQorI2RlZmluZSBNQVI3IDB4MDAwRgorCisvKiAweDAwMTAgLSAweDAwMTcgLSByZXNlcnZlZCAqLworCisjZGVmaW5lIFRTRlRSIDB4MDAxOAorI2RlZmluZSBUU0ZUUl9FTkQgMHgwMDFGCisKKyNkZWZpbmUgVExQREEgMHgwMDIwCisjZGVmaW5lIFRMUERBX0VORCAweDAwMjMKKyNkZWZpbmUgVE5QREEgMHgwMDI0CisjZGVmaW5lIFROUERBX0VORCAweDAwMjcKKyNkZWZpbmUgVEhQREEgMHgwMDI4CisjZGVmaW5lIFRIUERBX0VORCAweDAwMkIKKworI2RlZmluZSBCU1NJRCAweDAwMkUKKyNkZWZpbmUgQlNTSURfRU5EIDB4MDAzMworCisjZGVmaW5lIENSIDB4MDAzNworCisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisjZGVmaW5lIFJGX1NXX0NPTkZJRwkgICAgICAgIDB4OAkJCS8vIHN0b3JlIGRhdGEgd2hpY2ggaXMgdHJhbnNtaXR0ZWQgdG8gUkYgZm9yIGRyaXZlcgorI2RlZmluZSBSRl9TV19DRkdfU0kJCUJJVDEKKyNkZWZpbmUgUElGUwkJCTB4MkMJCQkvLyBQQ0YgSW50ZXJGcmFtZSBTcGFjaW5nIFRpbWVyIFNldHRpbmcuCisjZGVmaW5lIEVJRlMJCQkweDJECQkJLy8gRXh0ZW5kZWQgSW50ZXJGcmFtZSBTcGFjZSBUaW1lciwgaW4gdW5pdCBvZiA0IHVzLgorCisjZGVmaW5lIEJSU1IJCQkweDM0CQkJLy8gQmFzaWMgcmF0ZSBzZXQKKworI2RlZmluZSBJTVIgMHgwMDZDCisjZGVmaW5lIElTUiAweDAwM0MKKyNlbHNlCisjZGVmaW5lIEJSU1IgMHgwMDJDCisjZGVmaW5lIEJSU1JfRU5EIDB4MDAyRAorCisvKiAweDAwMzQgLSAweDAwMzQgLSByZXNlcnZlZCAqLworI2RlZmluZSBFSUZTIDB4MDAzNQorCisjZGVmaW5lIElNUiAweDAwM0MKKyNkZWZpbmUgSU1SX0VORCAweDAwM0QKKyNkZWZpbmUgSVNSIDB4MDAzRQorI2RlZmluZSBJU1JfRU5EIDB4MDAzRgorI2VuZGlmCisKKyNkZWZpbmUgVENSIDB4MDA0MAorI2RlZmluZSBUQ1JfRU5EIDB4MDA0MworCisjZGVmaW5lIFJDUiAweDAwNDQKKyNkZWZpbmUgUkNSX0VORCAweDAwNDcKKworI2RlZmluZSBUaW1lckludCAweDAwNDgKKyNkZWZpbmUgVGltZXJJbnRfRU5EIDB4MDA0QgorCisjZGVmaW5lIFRCREEgMHgwMDRDCisjZGVmaW5lIFRCREFfRU5EIDB4MDA0RgorCisjZGVmaW5lIENSOTM0NiAweDAwNTAKKworI2RlZmluZSBDT05GSUcwIDB4MDA1MQorI2RlZmluZSBDT05GSUcxIDB4MDA1MgorI2RlZmluZSBDT05GSUcyIDB4MDA1MworCisjZGVmaW5lIEFOQV9QQVJNIDB4MDA1NAorI2RlZmluZSBBTkFfUEFSTV9FTkQgMHgweDAwNTcKKworI2RlZmluZSBNU1IgMHgwMDU4CisKKyNkZWZpbmUgQ09ORklHMyAweDAwNTkKKyNkZWZpbmUgQ09ORklHNCAweDAwNUEKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisJLy8gU0QzIHN6dXlpdGFzaTogTWFjMHg1Nz0gQ0MgLT4gQjAgTWFjMHg2MD0gRDEgLT4gQzYKKwkvLyBNYWMweDYwID0gMHgwMDAwMDRDNiBwb3dlciBzYXZlIHBhcmFtZXRlcnMKKwkjZGVmaW5lIEFOQVBBUk1fQVNJQ19PTiAgICAweEIwMDU0RDAwCisJI2RlZmluZSBBTkFQQVJNMl9BU0lDX09OICAweDAwMDAwNEM2CisKKwkjZGVmaW5lIEFOQVBBUk1fT04gQU5BUEFSTV9BU0lDX09OCisJI2RlZmluZSBBTkFQQVJNMl9PTiBBTkFQQVJNMl9BU0lDX09OCisjZWxzZQorCS8vIFNEMyBDTUxpbjoKKwkjZGVmaW5lIEFOQVBBUk1fQVNJQ19PTiAgICAweDQ1MDkwNjU4CisJI2RlZmluZSBBTkFQQVJNMl9BU0lDX09OICAweDcyN2YzZjUyCisKKwkjZGVmaW5lIEFOQVBBUk1fT04gQU5BUEFSTV9BU0lDX09OCisJI2RlZmluZSBBTkFQQVJNMl9PTiBBTkFQQVJNMl9BU0lDX09OCisjZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIFRFU1RSIDB4MDA1QgorCisvKiAweDAwNUMgLSAweDAwNUQgLSByZXNlcnZlZCAqLworCisjZGVmaW5lIFBTUiAweDAwNUUKKworLyogMHgwMDYwIC0gMHgwMDZGIC0gcmVzZXJ2ZWQgKi8KKworI2RlZmluZSBCY25JdHYgMHgwMDcwCisjZGVmaW5lIEJjbkl0dl9FTkQgMHgwMDcxCisKKyNkZWZpbmUgQXRpbVduZCAweDAwNzIKKyNkZWZpbmUgQXRpbVduZF9FTkQgMHgwMDczCisKKyNkZWZpbmUgQmludHJJdHYgMHgwMDc0CisjZGVmaW5lIEJpbnRySXR2X0VORCAweDAwNzUKKworI2RlZmluZSBBdGltdHJJdHYgMHgwMDc2CisjZGVmaW5lIEF0aW10ckl0dl9FTkQgMHgwMDc3CisKKyNkZWZpbmUgUGh5RGVsYXkgMHgwMDc4CisKKyNkZWZpbmUgQ1JDb3VudCAweDAwNzkKKworLyogMHgwMDdBIC0gMHgwMDdCIC0gcmVzZXJ2ZWQgKi8KKworI2RlZmluZSBQaHlBZGRyIDB4MDA3QworI2RlZmluZSBQaHlEYXRhVyAweDAwN0QKKyNkZWZpbmUgUGh5RGF0YVIgMHgwMDdFCisKKyNkZWZpbmUgUGh5Q0ZHIDB4MDA4MAorI2RlZmluZSBQaHlDRkdfRU5EIDB4MDA4MworCisvKiBmb2xsb3dpbmcgYXJlIGZvciBydGw4MTg1ICovCisjZGVmaW5lIFJGUGluc091dHB1dCAweDgwCisjZGVmaW5lIFJGUGluc0VuYWJsZSAweDgyCisjZGVmaW5lIFJGX1RJTUlORyAweDhjCisjZGVmaW5lIFJGUGluc1NlbGVjdCAweDg0CisjZGVmaW5lIEFOQVBBUkFNMiAweDYwCisjZGVmaW5lIFJGX1BBUkEgMHg4OAorI2RlZmluZSBSRlBpbnNJbnB1dCAweDg2CisjZGVmaW5lIEdQX0VOQUJMRSAweDkwCisjZGVmaW5lIEdQSU8gMHg5MQorI2RlZmluZSBTV19DT05UUk9MX0dQSU8gMHg0MDAKKyNkZWZpbmUgVFhfQU5URU5OQSAweDlmCisjZGVmaW5lIFRYX0dBSU5fT0ZETSAweDllCisjZGVmaW5lIFRYX0dBSU5fQ0NLIDB4OWQKKyNkZWZpbmUgV1BBX0NPTkZJRyAweGIwCisjZGVmaW5lIFRYX0FHQ19DVEwgMHg5YworI2RlZmluZSBUWF9BR0NfQ1RMX1BFUlBBQ0tFVF9HQUlOX1NISUZUIDAKKyNkZWZpbmUgVFhfQUdDX0NUTF9QRVJQQUNLRVRfQU5UU0VMX1NISUZUIDEKKyNkZWZpbmUgVFhfQUdDX0NUTF9GRUVEQkFDS19BTlQgMgorI2RlZmluZSBSRVNQX1JBVEUgMHgzNAorI2RlZmluZSBTSUZTIDB4YjQKKyNkZWZpbmUgRElGUyAweGI1CisKKyNkZWZpbmUgU0xPVCAweGI2CisjZGVmaW5lIENXX0NPTkYgMHhiYworI2RlZmluZSBDV19DT05GX1BFUlBBQ0tFVF9SRVRSWV9TSElGVCAxCisjZGVmaW5lIENXX0NPTkZfUEVSUEFDS0VUX0NXX1NISUZUIDAKKyNkZWZpbmUgQ1dfVkFMIDB4YmQKKyNkZWZpbmUgTUFYX1JFU1BfUkFURV9TSElGVCA0CisjZGVmaW5lIE1JTl9SRVNQX1JBVEVfU0hJRlQgMAorI2RlZmluZSBSQVRFX0ZBTExCQUNLIDB4YmUKKy8qCisgKiAgMHgwMDg0IC0gMHgwMEQzIGlzIHNlbGVjdGVkIHRvIHBhZ2UgMSB3aGVuIFBTRW4gYml0IChiaXQwLCBQU1IpCisgKiAgaXMgc2V0IHRvIDEKKyAqLworCisjZGVmaW5lIFdha2V1cDAgMHgwMDg0CisjZGVmaW5lIFdha2V1cDBfRU5EIDB4MDA4QgorCisjZGVmaW5lIFdha2V1cDEgMHgwMDhDCisjZGVmaW5lIFdha2V1cDFfRU5EIDB4MDA5MworCisjZGVmaW5lIFdha2V1cDJMRCAweDAwOTQKKyNkZWZpbmUgV2FrZXVwMkxEX0VORCAweDAwOUIKKyNkZWZpbmUgV2FrZXVwMkhEIDB4MDA5QworI2RlZmluZSBXYWtldXAySERfRU5EIDB4MDBBMworCisjZGVmaW5lIFdha2V1cDNMRCAweDAwQTQKKyNkZWZpbmUgV2FrZXVwM0xEX0VORCAweDAwQUIKKyNkZWZpbmUgV2FrZXVwM0hEIDB4MDBBQworI2RlZmluZSBXYWtldXAzSERfRU5EIDB4MDBCMworCisjZGVmaW5lIFdha2V1cDRMRCAweDAwQjQKKyNkZWZpbmUgV2FrZXVwNExEX0VORCAweDAwQkIKKyNkZWZpbmUgV2FrZXVwNEhEIDB4MDBCQworI2RlZmluZSBXYWtldXA0SERfRU5EIDB4MDBDMworCisjZGVmaW5lIENSQzAgMHgwMEM0CisjZGVmaW5lIENSQzBfRU5EIDB4MDBDNQorI2RlZmluZSBDUkMxIDB4MDBDNgorI2RlZmluZSBDUkMxX0VORCAweDAwQzcKKyNkZWZpbmUgQ1JDMiAweDAwQzgKKyNkZWZpbmUgQ1JDMl9FTkQgMHgwMEM5CisjZGVmaW5lIENSQzMgMHgwMENBCisjZGVmaW5lIENSQzNfRU5EIDB4MDBDQgorI2RlZmluZSBDUkM0IDB4MDBDQworI2RlZmluZSBDUkM0X0VORCAweDAwQ0QKKworLyogMHgwMENFIC0gMHgwMEQzIC0gcmVzZXJ2ZWQgKi8KKworCisKKy8qCisgKiAgMHgwMDg0IC0gMHgwMEQzIGlzIHNlbGVjdGVkIHRvIHBhZ2UgMCB3aGVuIFBTRW4gYml0IChiaXQwLCBQU1IpCisgKiAgaXMgc2V0IHRvIDAKKyAqLworCisvKiAweDAwODQgLSAweDAwOEYgLSByZXNlcnZlZCAqLworCisjZGVmaW5lIERLMCAweDAwOTAKKyNkZWZpbmUgREswX0VORCAweDAwOUYKKyNkZWZpbmUgREsxIDB4MDBBMAorI2RlZmluZSBESzFfRU5EIDB4MDBBRgorI2RlZmluZSBESzIgMHgwMEIwCisjZGVmaW5lIERLMl9FTkQgMHgwMEJGCisjZGVmaW5lIERLMyAweDAwQzAKKyNkZWZpbmUgREszX0VORCAweDAwQ0YKKworLyogMHgwMEQwIC0gMHgwMEQzIC0gcmVzZXJ2ZWQgKi8KKworCisKKworCisvKiAweDAwRDQgLSAweDAwRDcgLSByZXNlcnZlZCAqLworCisjZGVmaW5lIENPTkZJRzUgMHgwMEQ4CisKKyNkZWZpbmUgVFBQb2xsIDB4MDBEOQorCisvKiAweDAwREEgLSAweDAwREIgLSByZXNlcnZlZCAqLworCisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUworI2RlZmluZSBQSFlQUgkJCTB4REEJCQkvLzB4REEgLSAweDBCIFBIWSBQYXJhbWV0ZXIgUmVnaXN0ZXIuCisjZW5kaWYKKworI2RlZmluZSBDV1IgMHgwMERDCisjZGVmaW5lIENXUl9FTkQgMHgwMERECisKKyNkZWZpbmUgUmV0cnlDVFIgMHgwMERFCisKKy8qIDB4MDBERiAtIDB4MDBFMyAtIHJlc2VydmVkICovCisKKyNkZWZpbmUgUkRTQVIgMHgwMEU0CisjZGVmaW5lIFJEU0FSX0VORCAweDAwRTcKKworLyogMHgwMEU4IC0gMHgwMEVGIC0gcmVzZXJ2ZWQgKi8KKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisjZGVmaW5lIExFRF9DT05UUk9MCQkweEVECisjZW5kaWYKKworI2RlZmluZSBGRVIgMHgwMEYwCisjZGVmaW5lIEZFUl9FTkQgMHgwMEYzCisKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKyNkZWZpbmUgRkVNUgkJCTB4MUQ0CS8vIEZ1bmN0aW9uIEV2ZW50IE1hc2sgcmVnaXN0ZXIKKyNlbHNlCisjZGVmaW5lIEZFTVIgMHgwMEY0CisjZGVmaW5lIEZFTVJfRU5EIDB4MDBGNworI2VuZGlmCisKKyNkZWZpbmUgRlBTUiAweDAwRjgKKyNkZWZpbmUgRlBTUl9FTkQgMHgwMEZCCisKKyNkZWZpbmUgRkZFUiAweDAwRkMKKyNkZWZpbmUgRkZFUl9FTkQgMHgwMEZGCisKKworCisvKgorICogQml0bWFza3MgZm9yIHNwZWNpZmljIHJlZ2lzdGVyIGZ1bmN0aW9ucy4KKyAqIE5hbWVzIGFyZSBkZXJpdmVkIGZyb20gdGhlIHJlZ2lzdGVyIG5hbWUgYW5kIGZ1bmN0aW9uIG5hbWUuCisgKgorICogPFJFR0lTVEVSPl88RlVOQ1RJT04+WzxiaXQ+XQorICoKKyAqIHRoaXMgbGVhZHMgdG8gc29tZSBhd2t3YXJkIG5hbWVzLi4uCisgKi8KKworI2RlZmluZSBCUlNSX0JQTENQICAoKDE8PCA4KSkKKyNkZWZpbmUgQlJTUl9NQlIgICAgKCgxPDwgMSl8KDE8PCAwKSkKKyNkZWZpbmUgQlJTUl9NQlJfODE4NSAoKDE8PCAxMSl8KDE8PCAxMCl8KDE8PCA5KXwoMTw8IDgpfCgxPDwgNyl8KDE8PCA2KXwoMTw8IDUpfCgxPDwgNCl8KDE8PCAzKXwoMTw8IDIpfCgxPDwgMSl8KDE8PCAwKSkKKyNkZWZpbmUgQlJTUl9NQlIwICAgKCgxPDwgMCkpCisjZGVmaW5lIEJSU1JfTUJSMSAgICgoMTw8IDEpKQorCisjZGVmaW5lIENSX1JTVCAgICAgICgoMTw8IDQpKQorI2RlZmluZSBDUl9SRSAgICAgICAoKDE8PCAzKSkKKyNkZWZpbmUgQ1JfVEUgICAgICAgKCgxPDwgMikpCisjZGVmaW5lIENSX011bFJXICAgICgoMTw8IDApKQorCisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisjZGVmaW5lIElNUl9Eb3QxMWhJbnQJKCgxPDwgMjUpKQkJCS8vIDgwMi4xMWggTWVhc3VyZW1lbnQgSW50ZXJydXB0CisjZGVmaW5lIElNUl9CY25EbWFJbnQJKCgxPDwgMjQpKQkJCS8vIEJlYWNvbiBETUEgSW50ZXJydXB0IC8vIFdoYXQgZGlmZmVyZW5jdCBiZXR3ZWVuIEJjbkRtYUludCBhbmQgQmNuSW50Pz8/CisjZGVmaW5lIElNUl9XYWtlSW50CQkoKDE8PCAyMykpCQkJLy8gV2FrZSBVcCBJbnRlcnJ1cHQKKyNkZWZpbmUgSU1SX1RYRk9WVwkJKCgxPDwgMjIpKQkJCS8vIFR4IEZJRk8gT3ZlcmZsb3cgSW50ZXJydXB0CisjZGVmaW5lIElNUl9UaW1lT3V0MQkoKDE8PCAyMSkpCQkJLy8gVGltZSBPdXQgSW50ZXJydXB0IDEKKyNkZWZpbmUgSU1SX0JjbkludAkJKCgxPDwgMjApKQkJCS8vIEJlYWNvbiBUaW1lIG91dCBJbnRlcnJ1cHQKKyNkZWZpbmUgSU1SX0FUSU1JbnQJCSgoMTw8IDE5KSkJCQkvLyBBVElNIFRpbWUgT3V0IEludGVycnVwdAorI2RlZmluZSBJTVJfVEJERVIJCSgoMTw8IDE4KSkJCQkvLyBUeCBCZWFjb24gRGVzY3JpcHRvciBFcnJvciBJbnRlcnJ1cHQKKyNkZWZpbmUgSU1SX1RCRE9LCQkoKDE8PCAxNykpCQkJLy8gVHggQmVhY29uIERlc2NyaXB0b3IgT0sgSW50ZXJydXB0CisjZGVmaW5lIElNUl9USFBERVIJCSgoMTw8IDE2KSkJCQkvLyBUeCBIaWdoIFByaW9yaXR5IERlc2NyaXB0b3IgRXJyb3IgSW50ZXJydXB0CisjZGVmaW5lIElNUl9USFBET0sJCSgoMTw8IDE1KSkJCQkvLyBUeCBIaWdoIFByaW9yaXR5IERlc2NyaXB0b3IgT0sgSW50ZXJydXB0CisjZGVmaW5lIElNUl9UVk9ERVIJCSgoMTw8IDE0KSkJCQkvLyBUeCBBQ19WTyBEZXNjcmlwdG9yIEVycm9yIEludGVycnVwdAorI2RlZmluZSBJTVJfVFZPRE9LCQkoKDE8PCAxMykpCQkJLy8gVHggQUNfVk8gRGVzY3JpcHRvciBPSyBJbnRlcnJ1cHQKKyNkZWZpbmUgSU1SX0ZPVlcJCSgoMTw8IDEyKSkJCQkvLyBSeCBGSUZPIE92ZXJmbG93IEludGVycnVwdAorI2RlZmluZSBJTVJfUkRVCQkJKCgxPDwgMTEpKQkJCS8vIFJ4IERlc2NyaXB0b3IgVW5hdmFpbGFibGUgSW50ZXJydXB0CisjZGVmaW5lIElNUl9UVklERVIJCSgoMTw8IDEwKSkJCQkvLyBUeCBBQ19WSSBEZXNjcmlwdG9yIEVycm9yIEludGVycnVwdAorI2RlZmluZSBJTVJfVFZJRE9LCQkoKDE8PCA5KSkJCS8vIFR4IEFDX1ZJIERlc2NyaXB0b3IgT0sgSW50ZXJydXB0CisjZGVmaW5lIElNUl9SRVIJCQkoKDE8PCA4KSkJCS8vIFJ4IEVycm9yIEludGVycnVwdAorI2RlZmluZSBJTVJfUk9LCQkJKCgxPDwgNykpCQkvLyBSZWNlaXZlIE9LIEludGVycnVwdAorI2RlZmluZSBJTVJfVEJFREVSCQkoKDE8PCA2KSkJCQkvLyBUeCBBQ19CRSBEZXNjcmlwdG9yIEVycm9yIEludGVycnVwdAorI2RlZmluZSBJTVJfVEJFRE9LCQkoKDE8PCA1KSkJCQkvLyBUeCBBQ19CRSBEZXNjcmlwdG9yIE9LIEludGVycnVwdAorI2RlZmluZSBJTVJfVEJLREVSCQkoKDE8PCA0KSkJCS8vIFR4IEFDX0JLIERlc2NyaXB0b3IgRXJyb3IgSW50ZXJydXB0CisjZGVmaW5lIElNUl9UQktET0sJCSgoMTw8IDMpKQkJCS8vIFR4IEFDX0JLIERlc2NyaXB0b3IgT0sgSW50ZXJydXB0CisjZGVmaW5lIElNUl9SUW9TT0sJCSgoMTw8IDIpKQkJLy8gUnggUW9TIE9LIEludGVycnVwdAorI2RlZmluZSBJTVJfVGltZU91dDIJKCgxPDwgMSkpCQkvLyBUaW1lIE91dCBJbnRlcnJ1cHQgMgorI2RlZmluZSBJTVJfVGltZU91dDMJKCgxPDwgMCkpCQkJLy8gVGltZSBPdXQgSW50ZXJydXB0IDMKKyNkZWZpbmUgSU1SX1RNR0RPSyAgICAgICgoMTw8MzApKQorI2RlZmluZSBJU1JfRG90MTFoSW50CSgoMTw8IDI1KSkJCQkvLyA4MDIuMTFoIE1lYXN1cmVtZW50IEludGVycnVwdAorI2RlZmluZSBJU1JfQmNuRG1hSW50CSgoMTw8IDI0KSkJCQkvLyBCZWFjb24gRE1BIEludGVycnVwdCAvLyBXaGF0IGRpZmZlcmVuY3QgYmV0d2VlbiBCY25EbWFJbnQgYW5kIEJjbkludD8/PworI2RlZmluZSBJU1JfV2FrZUludAkJKCgxPDwgMjMpKQkJCS8vIFdha2UgVXAgSW50ZXJydXB0CisjZGVmaW5lIElTUl9UWEZPVlcJCSgoMTw8IDIyKSkJCQkvLyBUeCBGSUZPIE92ZXJmbG93IEludGVycnVwdAorI2RlZmluZSBJU1JfVGltZU91dDEJKCgxPDwgMjEpKQkJCS8vIFRpbWUgT3V0IEludGVycnVwdCAxCisjZGVmaW5lIElTUl9CY25JbnQJCSgoMTw8IDIwKSkJCQkvLyBCZWFjb24gVGltZSBvdXQgSW50ZXJydXB0CisjZGVmaW5lIElTUl9BVElNSW50CQkoKDE8PCAxOSkpCQkJLy8gQVRJTSBUaW1lIE91dCBJbnRlcnJ1cHQKKyNkZWZpbmUgSVNSX1RCREVSCQkoKDE8PCAxOCkpCQkJLy8gVHggQmVhY29uIERlc2NyaXB0b3IgRXJyb3IgSW50ZXJydXB0CisjZGVmaW5lIElTUl9UQkRPSwkJKCgxPDwgMTcpKQkJCS8vIFR4IEJlYWNvbiBEZXNjcmlwdG9yIE9LIEludGVycnVwdAorI2RlZmluZSBJU1JfVEhQREVSCQkoKDE8PCAxNikpCQkJLy8gVHggSGlnaCBQcmlvcml0eSBEZXNjcmlwdG9yIEVycm9yIEludGVycnVwdAorI2RlZmluZSBJU1JfVEhQRE9LCQkoKDE8PCAxNSkpCQkJLy8gVHggSGlnaCBQcmlvcml0eSBEZXNjcmlwdG9yIE9LIEludGVycnVwdAorI2RlZmluZSBJU1JfVFZPREVSCQkoKDE8PCAxNCkpCQkJLy8gVHggQUNfVk8gRGVzY3JpcHRvciBFcnJvciBJbnRlcnJ1cHQKKyNkZWZpbmUgSVNSX1RWT0RPSwkJKCgxPDwgMTMpKQkJCS8vIFR4IEFDX1ZPIERlc2NyaXB0b3IgT0sgSW50ZXJydXB0CisjZGVmaW5lIElTUl9GT1ZXCQkoKDE8PCAxMikpCQkJLy8gUnggRklGTyBPdmVyZmxvdyBJbnRlcnJ1cHQKKyNkZWZpbmUgSVNSX1JEVQkJCSgoMTw8IDExKSkJCQkvLyBSeCBEZXNjcmlwdG9yIFVuYXZhaWxhYmxlIEludGVycnVwdAorI2RlZmluZSBJU1JfVFZJREVSCQkoKDE8PCAxMCkpCQkJLy8gVHggQUNfVkkgRGVzY3JpcHRvciBFcnJvciBJbnRlcnJ1cHQKKyNkZWZpbmUgSVNSX1RWSURPSwkJKCgxPDwgOSkpCQkvLyBUeCBBQ19WSSBEZXNjcmlwdG9yIE9LIEludGVycnVwdAorI2RlZmluZSBJU1JfUkVSCQkJKCgxPDwgOCkpCQkvLyBSeCBFcnJvciBJbnRlcnJ1cHQKKyNkZWZpbmUgSVNSX1JPSwkJCSgoMTw8IDcpKQkJLy8gUmVjZWl2ZSBPSyBJbnRlcnJ1cHQKKyNkZWZpbmUgSVNSX1RCRURFUgkJKCgxPDwgNikpCQkJLy8gVHggQUNfQkUgRGVzY3JpcHRvciBFcnJvciBJbnRlcnJ1cHQKKyNkZWZpbmUgSVNSX1RCRURPSwkJKCgxPDwgNSkpCQkJLy8gVHggQUNfQkUgRGVzY3JpcHRvciBPSyBJbnRlcnJ1cHQKKyNkZWZpbmUgSVNSX1RCS0RFUgkJKCgxPDwgNCkpCQkvLyBUeCBBQ19CSyBEZXNjcmlwdG9yIEVycm9yIEludGVycnVwdAorI2RlZmluZSBJU1JfVEJLRE9LCQkoKDE8PCAzKSkJCQkvLyBUeCBBQ19CSyBEZXNjcmlwdG9yIE9LIEludGVycnVwdAorI2RlZmluZSBJU1JfUlFvU09LCQkoKDE8PCAyKSkJCS8vIFJ4IFFvUyBPSyBJbnRlcnJ1cHQKKyNkZWZpbmUgSVNSX1RpbWVPdXQyCSgoMTw8IDEpKQkJLy8gVGltZSBPdXQgSW50ZXJydXB0IDIKKyNkZWZpbmUgSVNSX1RpbWVPdXQzCSgoMTw8IDApKQkJCS8vIFRpbWUgT3V0IEludGVycnVwdCAzCisKKy8vdGhlc2UgZGVmaW5pdGlvbiBpcyB1c2VkIGZvciBUeC9SeCB0ZXN0IHRlbXBvcmFyaWx5CisjZGVmaW5lIElTUl9UTFBERVIgIElTUl9UVklERVIKKyNkZWZpbmUgSVNSX1RMUERPSyAgSVNSX1RWSURPSworI2RlZmluZSBJU1JfVE5QREVSICBJU1JfVFZPREVSCisjZGVmaW5lIElTUl9UTlBET0sgIElTUl9UVk9ET0sKKyNkZWZpbmUgSVNSX1RpbWVPdXQgSVNSX1RpbWVPdXQxCisjZGVmaW5lIElTUl9SWEZPVlcgSVNSX0ZPVlcKKworI2Vsc2UKKyNkZWZpbmUgSU1SX1RYRk9WVyAgKCgxPDwxNSkpCisjZGVmaW5lIElNUl9UaW1lT3V0ICgoMTw8MTQpKQorI2RlZmluZSBJTVJfQmNuSW50ICAoKDE8PDEzKSkKKyNkZWZpbmUgSU1SX0FUSU1JbnQgKCgxPDwxMikpCisjZGVmaW5lIElNUl9UQkRFUiAgICgoMTw8MTEpKQorI2RlZmluZSBJTVJfVEJET0sgICAoKDE8PDEwKSkKKyNkZWZpbmUgSU1SX1RIUERFUiAgKCgxPDwgOSkpCisjZGVmaW5lIElNUl9USFBET0sgICgoMTw8IDgpKQorI2RlZmluZSBJTVJfVE5QREVSICAoKDE8PCA3KSkKKyNkZWZpbmUgSU1SX1ROUERPSyAgKCgxPDwgNikpCisjZGVmaW5lIElNUl9SWEZPVlcgICgoMTw8IDUpKQorI2RlZmluZSBJTVJfUkRVICAgICAoKDE8PCA0KSkKKyNkZWZpbmUgSU1SX1RMUERFUiAgKCgxPDwgMykpCisjZGVmaW5lIElNUl9UTFBET0sgICgoMTw8IDIpKQorI2RlZmluZSBJTVJfUkVSICAgICAoKDE8PCAxKSkKKyNkZWZpbmUgSU1SX1JPSyAgICAgKCgxPDwgMCkpCisKKyNkZWZpbmUgSVNSX1RYRk9WVyAgKCgxPDwxNSkpCisjZGVmaW5lIElTUl9UaW1lT3V0ICgoMTw8MTQpKQorI2RlZmluZSBJU1JfQmNuSW50ICAoKDE8PDEzKSkKKyNkZWZpbmUgSVNSX0FUSU1JbnQgKCgxPDwxMikpCisjZGVmaW5lIElTUl9UQkRFUiAgICgoMTw8MTEpKQorI2RlZmluZSBJU1JfVEJET0sgICAoKDE8PDEwKSkKKyNkZWZpbmUgSVNSX1RIUERFUiAgKCgxPDwgOSkpCisjZGVmaW5lIElTUl9USFBET0sgICgoMTw8IDgpKQorI2RlZmluZSBJU1JfVE5QREVSICAoKDE8PCA3KSkKKyNkZWZpbmUgSVNSX1ROUERPSyAgKCgxPDwgNikpCisjZGVmaW5lIElTUl9SWEZPVlcgICgoMTw8IDUpKQorI2RlZmluZSBJU1JfUkRVICAgICAoKDE8PCA0KSkKKyNkZWZpbmUgSVNSX1RMUERFUiAgKCgxPDwgMykpCisjZGVmaW5lIElTUl9UTFBET0sgICgoMTw8IDIpKQorI2RlZmluZSBJU1JfUkVSICAgICAoKDE8PCAxKSkKKyNkZWZpbmUgSVNSX1JPSyAgICAgKCgxPDwgMCkpCisjZW5kaWYKKworI2RlZmluZSBIV19WRVJJRF9SODE4MF9GIDMKKyNkZWZpbmUgSFdfVkVSSURfUjgxODBfQUJDRCAyCisjZGVmaW5lIEhXX1ZFUklEX1I4MTg1X0FCQyA0CisjZGVmaW5lIEhXX1ZFUklEX1I4MTg1X0QgNQorI2lmZGVmIENPTkZJR19SVEw4MTg1QgorI2RlZmluZSBIV19WRVJJRF9SODE4NUJfQiA2CisjZW5kaWYKKworI2RlZmluZSBUQ1JfQ1dNSU4gICAoKDE8PDMxKSkKKyNkZWZpbmUgVENSX1NXU0VRICAgKCgxPDwzMCkpCisjZGVmaW5lIFRDUl9IV1ZFUklEX01BU0sgKCgxPDwyNyl8KDE8PDI2KXwoMTw8MjUpKQorI2RlZmluZSBUQ1JfSFdWRVJJRF9TSElGVCAyNQorI2RlZmluZSBUQ1JfU0FUICAgICAoKDE8PDI0KSkKKyNkZWZpbmUgVENSX1BMQ1BfTEVOIFRDUl9TQVQgLy8gcnRsODE4MAorI2RlZmluZSBUQ1JfTVhETUFfTUFTSyAgICgoMTw8MjMpfCgxPDwyMil8KDE8PDIxKSkKKyNkZWZpbmUgVENSX01YRE1BXzEwMjQgNgorI2RlZmluZSBUQ1JfTVhETUFfMjA0OCA3CisjZGVmaW5lIFRDUl9NWERNQV9TSElGVCAgMjEKKyNkZWZpbmUgVENSX0RJU0NXICAgKCgxPDwyMCkpCisjZGVmaW5lIFRDUl9JQ1YgICAgICgoMTw8MTkpKQorI2RlZmluZSBUQ1JfTEJLICAgICAoKDE8PDE4KXwoMTw8MTcpKQorI2RlZmluZSBUQ1JfTEJLMSAgICAoKDE8PDE4KSkKKyNkZWZpbmUgVENSX0xCSzAgICAgKCgxPDwxNykpCisjZGVmaW5lIFRDUl9DUkMgICAgICgoMTw8MTYpKQorI2RlZmluZSBUQ1JfRFBSRVRSWV9NQVNLICAgKCgxPDwxNSl8KDE8PDE0KXwoMTw8MTMpfCgxPDwxMil8KDE8PDExKXwoMTw8MTApfCgxPDw5KXwoMTw8OCkpCisjZGVmaW5lIFRDUl9SVFNSRVRSWV9NQVNLICAgKCgxPDwwKXwoMTw8MSl8KDE8PDIpfCgxPDwzKXwoMTw8NCl8KDE8PDUpfCgxPDw2KXwoMTw8NykpCisjZGVmaW5lIFRDUl9QUk9CRV9OT1RJTUVTVEFNUF9TSElGVCAyOSAvL3J0bDgxODUKKworI2RlZmluZSBSQ1JfT05MWUVSTFBLVCAoKDE8PDMxKSkKKyNkZWZpbmUgUkNSX0NTX1NISUZUICAgMjkKKyNkZWZpbmUgUkNSX0NTX01BU0sgICAgKCgxPDwzMCkgfCAoMTw8MjkpKQorI2RlZmluZSBSQ1JfRU5NQVJQICAgICAoKDE8PDI4KSkKKyNkZWZpbmUgUkNSX0NCU1NJRCAgICAgKCgxPDwyMykpCisjZGVmaW5lIFJDUl9BUFdSTUdUICAgICgoMTw8MjIpKQorI2RlZmluZSBSQ1JfQUREMyAgICAgICAoKDE8PDIxKSkKKyNkZWZpbmUgUkNSX0FNRiAgICAgICAgKCgxPDwyMCkpCisjZGVmaW5lIFJDUl9BQ0YgICAgICAgICgoMTw8MTkpKQorI2RlZmluZSBSQ1JfQURGICAgICAgICAoKDE8PDE4KSkKKyNkZWZpbmUgUkNSX1JYRlRIICAgICAgKCgxPDwxNSl8KDE8PDE0KXwoMTw8MTMpKQorI2RlZmluZSBSQ1JfUlhGVEgyICAgICAoKDE8PDE1KSkKKyNkZWZpbmUgUkNSX1JYRlRIMSAgICAgKCgxPDwxNCkpCisjZGVmaW5lIFJDUl9SWEZUSDAgICAgICgoMTw8MTMpKQorI2RlZmluZSBSQ1JfQUlDViAgICAgICAoKDE8PDEyKSkKKyNkZWZpbmUgUkNSX01YRE1BICAgICAgKCgxPDwxMCl8KDE8PCA5KXwoMTw8IDgpKQorI2RlZmluZSBSQ1JfTVhETUEyICAgICAoKDE8PDEwKSkKKyNkZWZpbmUgUkNSX01YRE1BMSAgICAgKCgxPDwgOSkpCisjZGVmaW5lIFJDUl9NWERNQTAgICAgICgoMTw8IDgpKQorI2RlZmluZSBSQ1JfOTM1NlNFTCAgICAoKDE8PCA2KSkKKyNkZWZpbmUgUkNSX0FDUkMzMiAgICAgKCgxPDwgNSkpCisjZGVmaW5lIFJDUl9BQiAgICAgICAgICgoMTw8IDMpKQorI2RlZmluZSBSQ1JfQU0gICAgICAgICAoKDE8PCAyKSkKKyNkZWZpbmUgUkNSX0FQTSAgICAgICAgKCgxPDwgMSkpCisjZGVmaW5lIFJDUl9BQVAgICAgICAgICgoMTw8IDApKQorCisjZGVmaW5lIENSOTM0Nl9FRU0gICAgICgoMTw8Nyl8KDE8PDYpKQorI2RlZmluZSBDUjkzNDZfRUVNMSAgICAoKDE8PDcpKQorI2RlZmluZSBDUjkzNDZfRUVNMCAgICAoKDE8PDYpKQorI2RlZmluZSBDUjkzNDZfRUVDUyAgICAoKDE8PDMpKQorI2RlZmluZSBDUjkzNDZfRUVTSyAgICAoKDE8PDIpKQorI2RlZmluZSBDUjkzNDZfRUVEMSAgICAoKDE8PDEpKQorI2RlZmluZSBDUjkzNDZfRUVEMCAgICAoKDE8PDApKQorCisjZGVmaW5lIENPTkZJRzBfV0VQMTA0ICAgICAoKDE8PDYpKQorI2RlZmluZSBDT05GSUcwX0xFREdQT19FbiAgKCgxPDw0KSkKKyNkZWZpbmUgQ09ORklHMF9BdXhfU3RhdHVzICgoMTw8MykpCisjZGVmaW5lIENPTkZJRzBfR0wgICAgICAgICAoKDE8PDEpfCgxPDwwKSkKKyNkZWZpbmUgQ09ORklHMF9HTDEgICAgICAgICgoMTw8MSkpCisjZGVmaW5lIENPTkZJRzBfR0wwICAgICAgICAoKDE8PDApKQorCisjZGVmaW5lIENPTkZJRzFfTEVEUyAgICAgICAoKDE8PDcpfCgxPDw2KSkKKyNkZWZpbmUgQ09ORklHMV9MRURTMSAgICAgICgoMTw8NykpCisjZGVmaW5lIENPTkZJRzFfTEVEUzAgICAgICAoKDE8PDYpKQorI2RlZmluZSBDT05GSUcxX0xXQUNUICAgICAgKCgxPDw0KSkKKyNkZWZpbmUgQ09ORklHMV9NRU1NQVAgICAgICgoMTw8MykpCisjZGVmaW5lIENPTkZJRzFfSU9NQVAgICAgICAoKDE8PDIpKQorI2RlZmluZSBDT05GSUcxX1ZQRCAgICAgICAgKCgxPDwxKSkKKyNkZWZpbmUgQ09ORklHMV9QTUVuICAgICAgICgoMTw8MCkpCisKKyNkZWZpbmUgQ09ORklHMl9MQ0sgICAgICAgICgoMTw8NykpCisjZGVmaW5lIENPTkZJRzJfQU5UICAgICAgICAoKDE8PDYpKQorI2RlZmluZSBDT05GSUcyX0RQUyAgICAgICAgKCgxPDwzKSkKKyNkZWZpbmUgQ09ORklHMl9QQVBFX3NpZ24gICgoMTw8MikpCisjZGVmaW5lIENPTkZJRzJfUEFQRV90aW1lICAoKDE8PDEpfCgxPDwwKSkKKyNkZWZpbmUgQ09ORklHMl9QQVBFX3RpbWUxICgoMTw8MSkpCisjZGVmaW5lIENPTkZJRzJfUEFQRV90aW1lMCAoKDE8PDApKQorCisjZGVmaW5lIENPTkZJRzNfR05UU2VsICAgICAoKDE8PDcpKQorI2RlZmluZSBDT05GSUczX1BBUk1fRW4gICAgKCgxPDw2KSkKKyNkZWZpbmUgQ09ORklHM19NYWdpYyAgICAgICgoMTw8NSkpCisjZGVmaW5lIENPTkZJRzNfQ2FyZEJfRW4gICAoKDE8PDMpKQorI2RlZmluZSBDT05GSUczX0NMS1JVTl9FbiAgKCgxPDwyKSkKKyNkZWZpbmUgQ09ORklHM19GdW5jUmVnRW4gICgoMTw8MSkpCisjZGVmaW5lIENPTkZJRzNfRkJ0YkVuICAgICAoKDE8PDApKQorCisjZGVmaW5lIENPTkZJRzRfVkNPUEROICAgICAoKDE8PDcpKQorI2RlZmluZSBDT05GSUc0X1BXUk9GRiAgICAgKCgxPDw2KSkKKyNkZWZpbmUgQ09ORklHNF9QV1JNR1QgICAgICgoMTw8NSkpCisjZGVmaW5lIENPTkZJRzRfTFdQTUUgICAgICAoKDE8PDQpKQorI2RlZmluZSBDT05GSUc0X0xXUFROICAgICAgKCgxPDwyKSkKKyNkZWZpbmUgQ09ORklHNF9SRlRZUEUgICAgICgoMTw8MSl8KDE8PDApKQorI2RlZmluZSBDT05GSUc0X1JGVFlQRTEgICAgKCgxPDwxKSkKKyNkZWZpbmUgQ09ORklHNF9SRlRZUEUwICAgICgoMTw8MCkpCisKKyNkZWZpbmUgQ09ORklHNV9UWF9GSUZPX09LICgoMTw8NykpCisjZGVmaW5lIENPTkZJRzVfUlhfRklGT19PSyAoKDE8PDYpKQorI2RlZmluZSBDT05GSUc1X0NBTE9OICAgICAgKCgxPDw1KSkKKyNkZWZpbmUgQ09ORklHNV9FQUNQSSAgICAgICgoMTw8MikpCisjZGVmaW5lIENPTkZJRzVfTEFOV2FrZSAgICAoKDE8PDEpKQorI2RlZmluZSBDT05GSUc1X1BNRV9TVFMgICAgKCgxPDwwKSkKKworI2RlZmluZSBNU1JfTElOS19NQVNLICAgICAgKCgxPDwyKXwoMTw8MykpCisjZGVmaW5lIE1TUl9MSU5LX01BTkFHRUQgICAyCisjZGVmaW5lIE1TUl9MSU5LX05PTkUgICAgICAwCisjZGVmaW5lIE1TUl9MSU5LX1NISUZUICAgICAyCisjZGVmaW5lIE1TUl9MSU5LX0FESE9DICAgICAxCisjZGVmaW5lIE1TUl9MSU5LX01BU1RFUiAgICAzCisKKyNkZWZpbmUgUFNSX0dQTyAgICAgICAgICAgICgoMTw8NykpCisjZGVmaW5lIFBTUl9HUEkgICAgICAgICAgICAoKDE8PDYpKQorI2RlZmluZSBQU1JfTEVER1BPMSAgICAgICAgKCgxPDw1KSkKKyNkZWZpbmUgUFNSX0xFREdQTzAgICAgICAgICgoMTw8NCkpCisjZGVmaW5lIFBTUl9VV0YgICAgICAgICAgICAoKDE8PDEpKQorI2RlZmluZSBQU1JfUFNFbiAgICAgICAgICAgKCgxPDwwKSkKKworI2RlZmluZSBTQ1JfS00gICAgICAgICAgICAgKCgxPDw1KXwoMTw8NCkpCisjZGVmaW5lIFNDUl9LTTEgICAgICAgICAgICAoKDE8PDUpKQorI2RlZmluZSBTQ1JfS00wICAgICAgICAgICAgKCgxPDw0KSkKKyNkZWZpbmUgU0NSX1RYU0VDT04gICAgICAgICgoMTw8MSkpCisjZGVmaW5lIFNDUl9SWFNFQ09OICAgICAgICAoKDE8PDApKQorCisjZGVmaW5lIEJjbkl0dl9CY25JdHYgICAgICAoMHgwMUZGKQorCisjZGVmaW5lIEF0aW1XbmRfQXRpbVduZCAgICAoMHgwMUZGKQorCisjZGVmaW5lIEJpbnRySXR2X0JpbnRySXR2ICAoMHgwMUZGKQorCisjZGVmaW5lIEF0aW10ckl0dl9BdGltdHJJdHYgKDB4MDFGRikKKworI2RlZmluZSBQaHlEZWxheV9QaHlEZWxheSAgKCgxPDwyKXwoMTw8MSl8KDE8PDApKQorCisjZGVmaW5lIFRQUG9sbF9CUSAgICAoKDE8PDcpKQorI2RlZmluZSBUUFBvbGxfSFBRICAgKCgxPDw2KSkKKyNkZWZpbmUgVFBQb2xsX05QUSAgICgoMTw8NSkpCisjZGVmaW5lIFRQUG9sbF9MUFEgICAoKDE8PDQpKQorI2RlZmluZSBUUFBvbGxfU0JRICAgKCgxPDwzKSkKKyNkZWZpbmUgVFBQb2xsX1NIUFEgICgoMTw8MikpCisjZGVmaW5lIFRQUG9sbF9TTlBRICAoKDE8PDEpKQorI2RlZmluZSBUUFBvbGxfU0xQUSAgKCgxPDwwKSkKKworI2RlZmluZSBDV1JfQ1cgICAgICAgKDB4MDFGRikKKworI2RlZmluZSBGRVJfSU5UUiAgICAgKCgxPDwxNSkpCisjZGVmaW5lIEZFUl9HV0FLRSAgICAoKDE8PCA0KSkKKworI2RlZmluZSBGRU1SX0lOVFIgICAgKCgxPDwxNSkpCisjZGVmaW5lIEZFTVJfV0tVUCAgICAoKDE8PDE0KSkKKyNkZWZpbmUgRkVNUl9HV0FLRSAgICgoMTw8IDQpKQorCisjZGVmaW5lIEZQU1JfSU5UUiAgICAoKDE8PDE1KSkKKyNkZWZpbmUgRlBTUl9HV0FLRSAgICgoMTw8IDQpKQorCisjZGVmaW5lIEZGRVJfSU5UUiAgICAoKDE8PDE1KSkKKyNkZWZpbmUgRkZFUl9HV0FLRSAgICgoMTw8IDQpKQorCisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisvLyBUaHJlZSB3aXJlIG1vZGUuCisjZGVmaW5lIFNXX1RIUkVFX1dJUkUJCQkwCisjZGVmaW5lIEhXX1RIUkVFX1dJUkUJCQkyCisvL1JUTDgxODdTIGJ5IGFteQorI2RlZmluZSBIV19USFJFRV9XSVJFX1BJCQk1CisjZGVmaW5lIEhXX1RIUkVFX1dJUkVfU0kJCTYKKy8vYnkgYW15CisjZGVmaW5lIFRDUl9MUkxfT0ZGU0VUCQkwCisjZGVmaW5lIFRDUl9TUkxfT0ZGU0VUCQk4CisjZGVmaW5lIFRDUl9NWERNQV9PRkZTRVQJMjEKKyNkZWZpbmUgVENSX0RJU1JlcVFzaXplX09GRlNFVAkJMjgKKyNkZWZpbmUgVENSX0R1clByb2NNb2RlX09GRlNFVAkJMzAKKworI2RlZmluZSBSQ1JfTVhETUFfT0ZGU0VUCQkJCTgKKyNkZWZpbmUgUkNSX0ZJRk9fT0ZGU0VUCQkJCQkxMworCisjZGVmaW5lIFRNR0RTCQkJMHgwQwkJCS8vIFR4IE1hbmFnZW1lbnQgRGVzY3JpcHRvciBBZGRyZXNzCisjZGVmaW5lIFRCS0RTCQkJMHgxMAkJCS8vIFR4IEFDX0JLIERlc2NyaXB0b3IgQWRkcmVzcworI2RlZmluZSBUQkVEUwkJCTB4MTQJCQkvLyBUeCBBQ19CRSBEZXNjcmlwdG9yIEFkZHJlc3MKKyNkZWZpbmUgVExQRFMJCQkweDIwCQkJLy8gVHggQUNfVkkgRGVzY3JpcHRvciBBZGRyZXNzCisjZGVmaW5lIFROUERTCQkJMHgyNAkJCS8vIFR4IEFDX1ZPIERlc2NyaXB0b3IgQWRkcmVzcworI2RlZmluZSBUSFBEUwkJCTB4MjgJCQkvLyBUeCBIaWduIFByaW9yaXR5IERlc2NyaXB0b3IgQWRkcmVzcworCisjZGVmaW5lIFRCRFMJCQkweDRjCQkJLy8gQmVhY29uIGRlc2NyaXB0b3IgcXVldWUgc3RhcnQgYWRkcmVzcworCisjZGVmaW5lIFJEU0EJCQkweEU0CQkJLy8gUmVjZWl2ZSBkZXNjcmlwdG9yIHF1ZXVlIHN0YXJ0IGFkZHJlc3MKKworI2RlZmluZSBBY2tUaW1lT3V0UmVnCTB4NzkJCS8vIEFDSyB0aW1lb3V0IHJlZ2lzdGVyLCBpbiB1bml0IG9mIDQgdXMuCisKKyNkZWZpbmUgUkZUaW1pbmcJCQkweDhDCisKKyNkZWZpbmUgVFBQb2xsU3RvcCAJCTB4OTMKKworI2RlZmluZSBUWEFHQ19DVEwJCTB4OUMJCQkvLyA8UkpfVE9ET184MTg1Qj4gVFhfQUdDX0NPTlRST0wgKDB4OUMgc2VlbXMgYmUgcmVtb3ZlZCBhdCA4MTg1Qiwgc2VlIHAzNykuCisjZGVmaW5lIENDS19UWEFHQwkJMHg5RAorI2RlZmluZSBPRkRNX1RYQUdDCQkweDlFCisjZGVmaW5lIEFOVFNFTAkJCTB4OUYKKworI2RlZmluZSBBQ01fQ09OVFJPTCAgICAgICAgICAgICAweDAwQkYgICAgICAvLyBBQ00gQ29udHJvbCBSZWdpc3RlCisKKyNkZWZpbmUgUlRMODE4NUJfVkVSX1JFRyAgICAweEUxCisKKyNkZWZpbmUJSW50TWlnCQkJMHhFMgkJCS8vIEludGVycnVwdCBNaWdyYXRpb24gKDB4RTIgfiAweEUzKQorCisjZGVmaW5lIFRJRF9BQ19NQVAJCTB4RTgJCQkvLyBUSUQgdG8gQUMgTWFwcGluZyBSZWdpc3RlcgorCisjZGVmaW5lIEFOQVBBUkFNMwkJMHhFRQkJCS8vIDxSSl9UT0RPXzgxODVCPiBIb3cgdG8gdXNlIGl0PworCisjZGVmaW5lIEFDX1ZPX1BBUkFNCQkweEYwCQkJLy8gQUNfVk8gUGFyYW1ldGVycyBSZWNvcmQKKyNkZWZpbmUgQUNfVklfUEFSQU0JCTB4RjQJCQkvLyBBQ19WSSBQYXJhbWV0ZXJzIFJlY29yZAorI2RlZmluZSBBQ19CRV9QQVJBTQkJMHhGOAkJCS8vIEFDX0JFIFBhcmFtZXRlcnMgUmVjb3JkCisjZGVmaW5lIEFDX0JLX1BBUkFNCQkweEZDCQkJLy8gQUNfQksgUGFyYW1ldGVycyBSZWNvcmQKKworI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKyNkZWZpbmUgQmNuVGltaW5nQWRqdXN0CTB4MTZBCQkJLy8gQmVhY29uIFRpbWluZyBBZGp1c3QgUmVnaXN0ZXIuCisjZGVmaW5lIEdQSU9DdHJsCQkJMHgxNkIJCQkvLyBHUElPIENvbnRyb2wgUmVnaXN0ZXIuCisjZGVmaW5lIFBTQnlHQwkJCTB4MTgwCQkJLy8gMHgxODAgLSAweDE4MyBQb3dlciBTYXZpbmcgYnkgR2F0ZWQgQ2xvY2suCisjZW5kaWYKKyNkZWZpbmUgQVJGUgkJCTB4MUUwCS8vIEF1dG8gUmF0ZSBGYWxsYmFjayBSZWdpc3RlciAoMHgxZTAgfiAweDFlMikKKworI2RlZmluZSBSRlNXX0NUUkwJCQkweDI3MgkvLyAweDI3Mi0weDI3My4KKyNkZWZpbmUgU1dfM1dfREIwCQkJMHgyNzQJLy8gU29mdHdhcmUgMy13aXJlIGRhdGEgYnVmZmVyIGJpdCAzMX4wLgorI2RlZmluZSBTV18zV19EQjEJCQkweDI3OAkvLyBTb2Z0d2FyZSAzLXdpcmUgZGF0YSBidWZmZXIgYml0IDYzfjMyLgorI2RlZmluZSBTV18zV19DTUQwCQkJMHgyN0MJLy8gU29mdHdhcmUgMy13aXJlIENvbnRyb2wvU3RhdHVzIFJlZ2lzdGVyLgorI2RlZmluZSBTV18zV19DTUQxCQkJMHgyN0QJLy8gU29mdHdhcmUgMy13aXJlIENvbnRyb2wvU3RhdHVzIFJlZ2lzdGVyLgorCisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUworI2RlZmluZSBQSV9EQVRBX1JFQUQJCTBYMzYwCS8vIDB4MzYwIC0gMHgzNjEgIFBhcmFsbGVsIEludGVyZmFjZSBEYXRhIFJlZ2lzdGVyLgorI2RlZmluZSBTSV9EQVRBX1JFQUQJCTB4MzYyCS8vIDB4MzYyIC0gMHgzNjMgIFNlcmlhbCBJbnRlcmZhY2UgRGF0YSBSZWdpc3Rlci4KKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgIDgxODVCIFRQUG9sbCBiaXRzIAkJCQkob2Zmc2V0IDB4ZDksIDEgYnl0ZSkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBUUFBPTExfQlEJCQkoMHgwMSA8PCA3KQorI2RlZmluZSBUUFBPTExfSFBRCQkJKDB4MDEgPDwgNikKKyNkZWZpbmUgVFBQT0xMX0FDX1ZPUQkJKDB4MDEgPDwgNSkKKyNkZWZpbmUgVFBQT0xMX0FDX1ZJUQkJKDB4MDEgPDwgNCkKKyNkZWZpbmUgVFBQT0xMX0FDX0JFUQkJKDB4MDEgPDwgMykKKyNkZWZpbmUgVFBQT0xMX0FDX0JLUQkJKDB4MDEgPDwgMikKKyNkZWZpbmUgVFBQT0xMX0FDX01HUQkJKDB4MDEgPDwgMSkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgICA4MTg1QiBUUFBvbGxTdG9wIGJpdHMgCQkJCShvZmZzZXQgMHg5MywgMSBieXRlKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIFRQUE9MTFNUT1BfQlEJCQkoMHgwMSA8PCA3KQorI2RlZmluZSBUUFBPTExTVE9QX0hQUQkJCSgweDAxIDw8IDYpCisjZGVmaW5lIFRQUE9MTFNUT1BfQUNfVk9RCQkoMHgwMSA8PCA1KQorI2RlZmluZSBUUFBPTExTVE9QX0FDX1ZJUQkJKDB4MDEgPDwgNCkKKyNkZWZpbmUgVFBQT0xMU1RPUF9BQ19CRVEJCSgweDAxIDw8IDMpCisjZGVmaW5lIFRQUE9MTFNUT1BfQUNfQktRCQkoMHgwMSA8PCAyKQorI2RlZmluZSBUUFBPTExTVE9QX0FDX01HUQkJKDB4MDEgPDwgMSkKKworCisjZGVmaW5lIE1TUl9MSU5LX0VORURDQQkgICAoMTw8NCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgICA4MTg3QiBBQ19YWF9QQVJBTSBiaXRzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQUNfUEFSQU1fVFhPUF9MSU1JVF9PRkZTRVQJCTE2CisjZGVmaW5lIEFDX1BBUkFNX0VDV19NQVhfT0ZGU0VUCQkJMTIKKyNkZWZpbmUgQUNfUEFSQU1fRUNXX01JTl9PRkZTRVQJCQk4CisjZGVmaW5lIEFDX1BBUkFNX0FJRlNfT0ZGU0VUCQkJMAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgIDgxODdCIEFDTV9DT05UUk9MIGJpdHMJCQkJCQkoT2Zmc2V0IDB4QkYsIDEgQnl0ZSkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBWT1FfQUNNX0VOCQkJCSgweDAxIDw8IDcpIC8vQklUNworI2RlZmluZSBWSVFfQUNNX0VOCQkJCSgweDAxIDw8IDYpIC8vQklUNgorI2RlZmluZSBCRVFfQUNNX0VOCQkJCSgweDAxIDw8IDUpIC8vQklUNQorI2RlZmluZSBBQ01fSFdfRU4JCQkJKDB4MDEgPDwgNCkgLy9CSVQ0CisjZGVmaW5lIFRYT1BTRUwJCQkJCSgweDAxIDw8IDMpIC8vQklUMworI2RlZmluZSBWT1FfQUNNX0NUTAkJCQkoMHgwMSA8PCAyKSAvL0JJVDIgLy8gU2V0IHRvIDEgd2hlbiBBQ19WTyB1c2VkIHRpbWUgcmVhY2hlcyBvciBleGNlZWRzIHRoZSBhZG1pdHRlZCB0aW1lCisjZGVmaW5lIFZJUV9BQ01fQ1RMCQkJCSgweDAxIDw8IDEpIC8vQklUMSAvLyBTZXQgdG8gMSB3aGVuIEFDX1ZJIHVzZWQgdGltZSByZWFjaGVzIG9yIGV4Y2VlZHMgdGhlIGFkbWl0dGVkIHRpbWUKKyNkZWZpbmUgQkVRX0FDTV9DVEwJCQkJKDB4MDEgPDwgMCkgLy9CSVQwIC8vIFNldCB0byAxIHdoZW4gQUNfQkUgdXNlZCB0aW1lIHJlYWNoZXMgb3IgZXhjZWVkcyB0aGUgYWRtaXR0ZWQgdGltZQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICAgODE4NUIgU1dfM1dfQ01EIGJpdHMJCQkJCShPZmZzZXQgMHgyN0MtMHgyN0QsIDE2Yml0KQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIFNXXzNXX0NNRDBfSE9MRAkJKCgxPDwgNykpCisjZGVmaW5lIFNXXzNXX0NNRDFfUkUJCSAJKCgxPDwgMCkpIC8vIEJJVDgKKyNkZWZpbmUgU1dfM1dfQ01EMV9XRQkJKCgxPDwgMSkpIC8vIEJJVDkKKyNkZWZpbmUgU1dfM1dfQ01EMV9ET05FCQkoKDE8PCAyKSkgLy8gQklUMTAKKworI2RlZmluZSBCQl9IT1NUX0JBTkdfUlcgCSgxPDwzKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgIDgxODVCIFJBVEVfRkFMTEJBQ0tfQ1RMIGJpdHMJCQkJKE9mZnNldCAweEJFLCA4Yml0KQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIFJBVEVfRkFMTEJBQ0tfQ1RMX0VOQUJMRQkJCQkoKDE8PCA3KSkKKyNkZWZpbmUgUkFURV9GQUxMQkFDS19DVExfRU5BQkxFX1JUU0NUUwkJKCgxPDwgNikpCisvLyBBdXRvIHJhdGUgZmFsbGJhY2sgcGVyIDJebiByZXRyeS4KKyNkZWZpbmUgUkFURV9GQUxMQkFDS19DVExfQVVUT19TVEVQMAkweDAwCisjZGVmaW5lIFJBVEVfRkFMTEJBQ0tfQ1RMX0FVVE9fU1RFUDEJMHgwMQorI2RlZmluZSBSQVRFX0ZBTExCQUNLX0NUTF9BVVRPX1NURVAyCTB4MDIKKyNkZWZpbmUgUkFURV9GQUxMQkFDS19DVExfQVVUT19TVEVQMwkweDAzCisKKworI2RlZmluZSBSVEw4MjI1ejJfQU5BUEFSQU1fT0ZGCTB4NTU0ODA2NTgKKyNkZWZpbmUgUlRMODIyNXoyX0FOQVBBUkFNMl9PRkYJMHg3MjAwM2Y3MAorLy9ieSBhbXkgZm9yIHBvd2VyIHNhdmUKKyNkZWZpbmUgUkZfQ0hBTkdFX0JZX1NXIEJJVDMxCisjZGVmaW5lIFJGX0NIQU5HRV9CWV9IVyBCSVQzMAorI2RlZmluZSBSRl9DSEFOR0VfQllfUFMgQklUMjkKKyNkZWZpbmUgUkZfQ0hBTkdFX0JZX0lQUyBCSVQyOAorLy9ieSBhbXkgZm9yIHBvd2VyIHNhdmUKKy8vYnkgYW15IGZvciBhbnRlbm5hCisjZGVmaW5lIEVFUFJPTV9TV19SRVZEX09GRlNFVCAweDNmCisvLyBCSVRbOC05XSBpcyBmb3IgU1cgQW50ZW5uYSBEaXZlcnNpdHkuIE9ubHkgdGhlIHZhbHVlIEVFUFJPTV9TV19BRF9FTkFCTEUgbWVhbnMgZW5hYmxlLCBvdGhlciB2YWx1ZXMgYXJlIGRpYWJsZS4KKyNkZWZpbmUgRUVQUk9NX1NXX0FEX01BU0sJCQkweDAzMDAKKyNkZWZpbmUgRUVQUk9NX1NXX0FEX0VOQUJMRQkJCTB4MDEwMAorCisvLyBCSVRbMTAtMTFdIGRldGVybWluZSBpZiBBbnRlbm5hIDEgaXMgdGhlIERlZmF1bHQgQW50ZW5uYS4gT25seSB0aGUgdmFsdWUgRUVQUk9NX0RFRl9BTlRfMSBtZWFucyBUUlVFLCBvdGhlciB2YWx1ZXMgYXJlIEZBTFNFLgorI2RlZmluZSBFRVBST01fREVGX0FOVF9NQVNLCQkJMHgwQzAwCisjZGVmaW5lIEVFUFJPTV9ERUZfQU5UXzEJCQkweDA0MDAKKy8vYnkgYW15IGZvciBhbnRlbm5hCisvL3tieSBhbXkgMDgwMzEyCisvLzB4N0MsIDB4N0QgQ3J5c3RhbCBjYWxpYnJhdGlvbiBhbmQgVHggUG93ZXIgdHJhY2tpbmcgbWVjaGFuaXNtLiBBZGRlZCBieSBSb2dlci4gMjAwNy4xMi4xMC4KKyNkZWZpbmUgRUVQUk9NX1JTVgkJCQkJCTB4N0MKKyNkZWZpbmUgRUVQUk9NX1hUQUxfQ0FMX01BU0sJCQkweDAwRkYJLy8gMHg3Q1s3OjBdLCBDcnlzdGFsIGNhbGlicmF0aW9uIG1hc2suCisjZGVmaW5lIEVFUFJPTV9YVEFMX0NBTF9YT1VUX01BU0sJMHgwRgkvLyAweDdDWzM6MF0sIENyeXN0YWwgY2FsaWJyYXRpb24gZm9yIFhvdXQuCisjZGVmaW5lIEVFUFJPTV9YVEFMX0NBTF9YSU5fTUFTSwkJMHhGMAkvLyAweDdDWzc6NF0sIENyeXN0YWwgY2FsaWJyYXRpb24gZm9yIFhpbi4KKyNkZWZpbmUgRUVQUk9NX1RIRVJNQUxfTUVURVJfTUFTSwkweDBGMDAJLy8gMHg3RFszOjBdLCBUaGVybWFsIG1ldGVyIHJlZmVyZW5jZSBsZXZlbC4KKyNkZWZpbmUgRUVQUk9NX1hUQUxfQ0FMX0VOQUJMRQkJMHgxMDAwCS8vIDB4N0RbNF0sIENyeXN0YWwgY2FsaWJyYXRpb24gZW5hYmxlZC9kaXNhYmxlZCBCSVQuCisjZGVmaW5lIEVFUFJPTV9USEVSTUFMX01FVEVSX0VOQUJMRQkweDIwMDAJLy8gMHg3RFs1XSwgVGhlcm1hbCBtZXRlciBlbmFibGVkL2Rpc2FibGVkIEJJVC4KKyNkZWZpbmUgRUVQUk9NX0NJRF9SU1ZEMQkJCQkweDNGCisjZGVmaW5lIEVOX0xQRl9DQUwJCQkweDIzOAkvLyBFbmFibGUgTFBGIENhbGlicmF0aW9uLgorI2RlZmluZSBQV1JfTUVURVJfRU4JCUJJVDEKKy8vIDxSSl9UT0RPXzgxODVCPiB3aGVyZSBhcmUgZmFsc2UgYWxhcm0gY291bnRlcnMgaW4gODE4NUI/CisjZGVmaW5lIENDS19GQUxTRV9BTEFSTQkJMHhEMAorI2RlZmluZSBPRkRNX0ZBTFNFX0FMQVJNCTB4RDIKKy8vYnkgYW15IDA4MDMxMn0KKworLy9ZSixhZGQgZm9yIENvdW50cnkgSUUsIDA4MDYzMAorI2RlZmluZSBFRVBST01fQ09VTlRSWV9DT0RFICAweDJFCisvL1lKLGFkZCwwODA2MzAsZW5kCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX21heDI4MjAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfbWF4MjgyMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYTA4NDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX21heDI4MjAuYwpAQCAtMCwwICsxLDI0MCBAQAorLyoKKyAgIFRoaXMgZmlsZXMgY29udGFpbnMgTUFYSU0gTUFYMjgyMCByYWRpbyBmcm9udGVuZCBwcm9ncmFtbWluZyByb3V0aW5lcy4KKworICAgVGhpcyBpcyBwYXJ0IG9mIHJ0bDgxODAgT3BlblNvdXJjZSBkcml2ZXIKKyAgIENvcHlyaWdodCAoQykgQW5kcmVhIE1lcmVsbG8gMjAwNC0yMDA1ICA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisgICBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR1BMIChHZW5lcmFsIFB1YmxpYyBMaWNlbmNlKQorCisgICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEdQTCBwYXJ0IG9mIHRoZQorICAgb2ZmaWNpYWwgcmVhbHRlayBkcml2ZXIKKworICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBydGw4MTgwIGRyaXZlciBza2VsZXRvbgorICAgZnJvbSBQYXRyaWMgU2NoZW5rZSAmIEFuZHJlcyBTYWxvbW9uCisKKyAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgSW50ZWwgUHJvIFdpcmVsZXNzIDIxMDAgR1BMIGRyaXZlci4KKworICAgTmV0QlNEIHJ0bDgxODAgZHJpdmVyIGZyb20gRGF2ZSBZb3VuZyBoYXMgYmVlbiByZWFsbHkgdXNlZnVsIHRvCisgICB1bmRlcnN0YW5kIGhvdyB0byBwcm9ncmFtIHRoZSBNQVhJTSByYWRpby4gVGhhbmtzIGEgbG90ISEhCisKKyAgICdUaGUgRGV1Y2UnIHRlc3RlZCB0aGlzIGFuZCBmaXhlZCBzb21lIGJ1Z3MuCisKKyAgIENvZGUgZnJvbSBydGw4MTgxIHByb2plY3QgaGFzIGJlZW4gdXNlZnVsIHRvIG1lIHRvIHVuZGVyc3RhbmQgc29tZSB0aGluZ3MuCisKKyAgIFdlIHdhbnQgdG8gdGFua3MgdGhlIEF1dGhvcnMgb2Ygc3VjaCBwcm9qZWN0cyBhbmQgdGhlIE5kaXN3cmFwcGVyCisgICBwcm9qZWN0IEF1dGhvcnMuCisqLworCisKKyNpbmNsdWRlICJyODE4MC5oIgorI2luY2x1ZGUgInI4MTgwX2h3LmgiCisjaW5jbHVkZSAicjgxODBfbWF4MjgyMC5oIgorCisKKy8vI2RlZmluZSBERUJVR19NQVhJTQorCit1MzIgbWF4aW1fY2hhbltdID0geworCTAsCS8vZHVtbXkgY2hhbm5lbCAwCisJMTIsIC8vMQorCTE3LCAvLzIKKwkyMiwgLy8zCisJMjcsIC8vNAorCTMyLCAvLzUKKwkzNywgLy82CisJNDIsIC8vNworCTQ3LCAvLzgKKwk1MiwgLy85CisJNTcsIC8vMTAKKwk2MiwgLy8xMQorCTY3LCAvLzEyCisJNzIsIC8vMTMKKwk4NCwgLy8xNAorfTsKKworI2lmIDAKKy8qIG1heGltIGV4cGVjdHMgNCBiaXQgYWRkcmVzcyBNU0YsIHRoZW4gMTIgYml0IGRhdGEgTVNGKi8KK3ZvaWQgd3JpdGVfbWF4aW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldix1OCBhZHIsIHUzMiBkYXRhKQoreworCisJaW50IHNoaWZ0OworCXNob3J0IGJpdDsKKwl1MTYgd29yZDsKKworCWFkciA9IGFkciAmMHhmOworCXdvcmQgPSAodTE2KWRhdGEgJiAweGZmZjsKKwl3b3JkIHw9IChhZHI8PDEyKTsKKwkvKndyaXRlX25pY19kd29yZChkZXYsUEhZX0NPTkZJRyxCQl9IT1NUX0JBTkcgfCBCQl9IT1NUX0JBTkdfRU4pOworCXJlYWRfbmljX2R3b3JkKGRldixQSFlfQ09ORklHKTsKKwltZGVsYXkoMSk7CisKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LFBIWV9DT05GSUcsQkJfSE9TVF9CQU5HIHwgQkJfSE9TVF9CQU5HX0VOIHwgQkJfSE9TVF9CQU5HX0NMSyk7CisJcmVhZF9uaWNfZHdvcmQoZGV2LFBIWV9DT05GSUcpOworCW1kZWxheSgxKTsKKwkqLworCisJLyogTUFYMjgyMCB3aWxsIHNhbXBsZSBkYXRhIG9uIHJpc2luZyBlZGdlIG9mIGNsb2NrICovCisJZm9yKHNoaWZ0ID0gMTU7c2hpZnQgPj0wOyBzaGlmdC0tKXsKKwkJYml0ID0gd29yZD4+c2hpZnQgJiAxOworCisJCXdyaXRlX25pY19kd29yZChkZXYsUEhZX0NPTkZJRyxCQl9IT1NUX0JBTkcgfCAoYml0PDxCQl9IT1NUX0JBTkdfREFUQSkpOworCisJCXJlYWRfbmljX2R3b3JkKGRldixQSFlfQ09ORklHKTsKKwkJbWRlbGF5KDIpOworCisJCXdyaXRlX25pY19kd29yZChkZXYsUEhZX0NPTkZJRyxCQl9IT1NUX0JBTkcgfAorCQkoYml0PDxCQl9IT1NUX0JBTkdfREFUQSkgfCBCQl9IT1NUX0JBTkdfQ0xLKTsgLyogc2FtcGxlIGRhdGEgKi8KKworCQlyZWFkX25pY19kd29yZChkZXYsUEhZX0NPTkZJRyk7CisJCW1kZWxheSgxKTsKKworCQl3cml0ZV9uaWNfZHdvcmQoZGV2LFBIWV9DT05GSUcsQkJfSE9TVF9CQU5HIHwKKwkJKGJpdDw8QkJfSE9TVF9CQU5HX0RBVEEpKTsKKworCQlyZWFkX25pY19kd29yZChkZXYsUEhZX0NPTkZJRyk7CisJCW1kZWxheSgyKTsKKworCX0KKwl3cml0ZV9uaWNfZHdvcmQoZGV2LFBIWV9DT05GSUcsQkJfSE9TVF9CQU5HIHwgKGJpdDw8QkJfSE9TVF9CQU5HX0RBVEEpfAorCQkJCQlCQl9IT1NUX0JBTkdfRU4pOworCXJlYWRfbmljX2R3b3JkKGRldixQSFlfQ09ORklHKTsKKwltZGVsYXkoMik7CisKKwkvKiBUaGUgc2hpZnQgcmVnaXN0ZXIgZmlsbCBmbHVzaCB0byB0aGUgcmVxdWVzdGVkIHJlZ2lzdGVyIHRoZQorCSAqIGxhc3QgMTIgYml0cyBkYXRhIHNoaWZ0ZWQgaW4KKwkgKi8KKwl3cml0ZV9uaWNfZHdvcmQoZGV2LFBIWV9DT05GSUcsQkJfSE9TVF9CQU5HIHwgKGJpdDw8QkJfSE9TVF9CQU5HX0RBVEEpfAorCQkJCQlCQl9IT1NUX0JBTkdfRU4gfCBCQl9IT1NUX0JBTkdfQ0xLKTsKKwlyZWFkX25pY19kd29yZChkZXYsUEhZX0NPTkZJRyk7CisJbWRlbGF5KDIpOworCisJd3JpdGVfbmljX2R3b3JkKGRldixQSFlfQ09ORklHLEJCX0hPU1RfQkFORyB8IChiaXQ8PEJCX0hPU1RfQkFOR19EQVRBKXwKKwkJCQkJQkJfSE9TVF9CQU5HX0VOKTsKKwlyZWFkX25pY19kd29yZChkZXYsUEhZX0NPTkZJRyk7CisJbWRlbGF5KDIpOworCisKKyNpZmRlZiBERUJVR19NQVhJTQorCURNRVNHKCJXcml0aW5nIG1heGltOiAleCAoYWRyICV4KSIscGh5X2NvbmZpZyxhZHIpOworI2VuZGlmCisKK30KKyNlbmRpZgorCit2b2lkIHdyaXRlX21heGltKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsdTggYWRyLCB1MzIgZGF0YSkgeworCXUzMiB0ZW1wOworCXRlbXAgPSAgMHg5MCArIChkYXRhICYgMHhmKTsKKwl0ZW1wIDw8PSAxNjsKKwl0ZW1wICs9IGFkcjsKKwl0ZW1wIDw8PSA4OworCXRlbXAgKz0gKGRhdGEgPj4gNCkgJiAweGZmOworI2lmZGVmIERFQlVHX01BWElNCisJRE1FU0coIndyaXRlX21heGltOiAlMDh4IiwgdGVtcCk7CisjZW5kaWYKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQSFlfQ09ORklHLCB0ZW1wKTsKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCW1kZWxheSgxKTsKK30KKworCit2b2lkIG1heGltX3dyaXRlX3BoeV9hbnRlbm5hKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsc2hvcnQgY2gpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXU4IGFudDsKKworCWFudCA9IE1BWElNX0FOVEVOTkE7CisJaWYocHJpdi0+YW50YikgLypkZWZhdWx0IGFudGVubmEgaXMgYW50ZW5uYSBCICovCisJCWFudCB8PSBCQl9BTlRFTk5BX0I7CisJaWYoY2ggPT0gMTQpCisJCWFudCB8PSBCQl9BTlRBVFRFTl9DSEFOMTQ7CisJd3JpdGVfcGh5KGRldiwweDEwLGFudCk7CisJLy9ETUVTRygiQkIgYW50ZW5uYSAleCAiLGFudCk7Cit9CisKKwordm9pZCBtYXhpbV9yZl9zZXRfY2hhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBjaCkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTMyIHR4cHcgPSAweGZmICYgcHJpdi0+Y2h0eHB3cltjaF07CisJdTMyIGNoYW4gPSBtYXhpbV9jaGFuW2NoXTsKKworCS8qV2hpbGUgcGhpbGlwcyBTQTI0MDAgZHJpdmUgdGhlIFBBIGJpYXMKKwkgKnNlZW1zIHRoYXQgZm9yIE1BWElNIHdlIGRlbGVnYXRlIHRoaXMKKwkgKnRvIHRoZSBCQgorCSAqLworCisJLy93cml0ZV9tYXhpbShkZXYsNSx0eHB3KTsKKwl3cml0ZV9waHkoZGV2LDMsdHhwdyk7CisKKwltYXhpbV93cml0ZV9waHlfYW50ZW5uYShkZXYsY2gpOworCXdyaXRlX21heGltKGRldiwzLGNoYW4pOworfQorCisKK3ZvaWQgbWF4aW1fcmZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl3cml0ZV9waHkoZGV2LCAzLCAweDgpOworCXdyaXRlX21heGltKGRldiwgMSwgMCk7Cit9CisKKwordm9pZCBtYXhpbV9yZl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXUzMiBhbmFwYXJhbTsKKworCXdyaXRlX25pY19ieXRlKGRldixQSFlfREVMQVksMHg2KTsJLy90aGlzIGlzIGdlbmVyYWwKKwl3cml0ZV9uaWNfYnl0ZShkZXYsQ0FSUklFUl9TRU5TRV9DT1VOVEVSLDB4NGMpOyAvL3RoaXMgaXMgZ2VuZXJhbAorCisJLyp0aGVzZSBhcmUgbWF4aW0gc3BlY2lmaWMqLworCWFuYXBhcmFtID0gcmVhZF9uaWNfZHdvcmQoZGV2LEFOQVBBUkFNKTsKKwlhbmFwYXJhbSA9IGFuYXBhcmFtICZ+IChBTkFQQVJBTV9UWERBQ09GRl9TSElGVCk7CisJYW5hcGFyYW0gPSBhbmFwYXJhbSAmfkFOQVBBUkFNX1BXUjFfTUFTSzsKKwlhbmFwYXJhbSA9IGFuYXBhcmFtICZ+QU5BUEFSQU1fUFdSMF9NQVNLOworCWFuYXBhcmFtIHw9IChNQVhJTV9BTkFQQVJBTV9QV1IxX09OPDxBTkFQQVJBTV9QV1IxX1NISUZUKTsKKwlhbmFwYXJhbSB8PSAoTUFYSU1fQU5BUEFSQU1fUFdSMF9PTjw8QU5BUEFSQU1fUFdSMF9TSElGVCk7CisKKwkvL3J0bDgxODBfc2V0X2FuYXBhcmFtKGRldixhbmFwYXJhbSk7CisKKwkvKiBNQVhJTSBmcm9tIG5ldGJzZCBkcml2ZXIgKi8KKworCXdyaXRlX21heGltKGRldiwwLCA3KTsgLyogdGVzdCBtb2RlIGFzIGluZGljYXRlZCBpbiBkYXRhc2hlZXQqLworCXdyaXRlX21heGltKGRldiwxLCAweDFlKTsgLyogZW5hYmxlIHJlZ2lzdGVyKi8KKwl3cml0ZV9tYXhpbShkZXYsMiwgMSk7IC8qIHN5bnQgcmVnaXN0ZXIgKi8KKworCisJbWF4aW1fcmZfc2V0X2NoYW4oZGV2LHByaXYtPmNoYW4pOworCisJd3JpdGVfbWF4aW0oZGV2LDQsIDB4MzEzKTsgLyogcnggcmVnaXN0ZXIqLworCisJLyogUEEgaXMgZHJpdmVuIGRpcmVjdGx5IGJ5IHRoZSBCQiwgd2Uga2VlcCB0aGUgTUFYSU0gYmlhcworCSAqIGF0IHRoZSBoaWdoZXN0IHZhbHVlIGluIHRoZSBib3VidCB0aGEgcGxlYWNpbmcgaXQgdG8gbG93ZXIKKwkgKiB2YWx1ZXMgbWF5IGludHJvZHVjZSBzb21lIGZ1cnRoZXIgYXR0ZW51YXRpb24gc29tZXdoZXJlLi4KKwkgKi8KKworCXdyaXRlX21heGltKGRldiw1LCAweGYpOworCisKKwkvKmJhc2ViYW5kIGNvbmZpZ3VyYXRpb24qLworCXdyaXRlX3BoeShkZXYsMCwweDg4KTsgLy9zeXMxCisJd3JpdGVfcGh5KGRldiwzLDB4OCk7IC8vdHhhZ2MKKwl3cml0ZV9waHkoZGV2LDQsMHhmOCk7IC8vIGxuYWRldAorCXdyaXRlX3BoeShkZXYsNSwweDkwKTsgLy8gaWZhZ2Npbml0CisJd3JpdGVfcGh5KGRldiw2LDB4MWEpOyAvLyBpZmFnY2xpbWl0CisJd3JpdGVfcGh5KGRldiw3LDB4NjQpOyAvLyBpZmFnY2RldAorCisJLypTaG91bGQgYmUgZG9uZSBzb21ldGhpbmcgbW9yZSBoZXJlPz8qLworCisJbWF4aW1fd3JpdGVfcGh5X2FudGVubmEoZGV2LHByaXYtPmNoYW4pOworCisJd3JpdGVfcGh5KGRldiwweDExLDB4ODgpOyAvL3RybAorCWlmKHByaXYtPmRpdmVyc2l0eSkKKwkJd3JpdGVfcGh5KGRldiwweDEyLDB4YzcpOworCWVsc2UKKwkJd3JpdGVfcGh5KGRldiwweDEyLDB4NDcpOworCisJd3JpdGVfcGh5KGRldiwweDEzLDB4OWIpOworCisJd3JpdGVfcGh5KGRldiwweDE5LDB4MCk7IC8vQ0hFU1RMSU0KKwl3cml0ZV9waHkoZGV2LDB4MWEsMHg5Zik7IC8vQ0hTUUxJTQorCisJbWF4aW1fcmZfc2V0X2NoYW4oZGV2LHByaXYtPmNoYW4pOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9tYXgyODIwLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX21heDI4MjAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDRmYjU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9tYXgyODIwLmgKQEAgLTAsMCArMSwyMSBAQAorLyoKKwlUaGlzIGlzIHBhcnQgb2YgcnRsODE4MCBPcGVuU291cmNlIGRyaXZlcgorCUNvcHlyaWdodCAoQykgQW5kcmVhIE1lcmVsbG8gMjAwNC0yMDA1ICA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisJUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdQTCAoR2VuZXJhbCBQdWJsaWMgTGljZW5jZSkKKworCVBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgR1BMIHBhcnQgb2YgdGhlIG9mZmljaWFsIHJlYWx0ZWsgZHJpdmVyCisJUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBydGw4MTgwIGRyaXZlciBza2VsZXRvbiBmcm9tIFBhdHJpYyBTY2hlbmtlICYgQW5kcmVzIFNhbG9tb24KKwlQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEludGVsIFBybyBXaXJlbGVzcyAyMTAwIEdQTCBkcml2ZXIKKworCVdlIHdhbnQgdG8gdGFua3MgdGhlIEF1dGhvcnMgb2Ygc3VjaCBwcm9qZWN0cyBhbmQgdGhlIE5kaXN3cmFwcGVyIHByb2plY3QgQXV0aG9ycy4KKyovCisKKyNkZWZpbmUgTUFYSU1fQU5URU5OQSAweGIzCisjZGVmaW5lIE1BWElNX0FOQVBBUkFNX1BXUjFfT04gMHg4CisjZGVmaW5lIE1BWElNX0FOQVBBUkFNX1BXUjBfT04gMHgwCisKKwordm9pZCBtYXhpbV9yZl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBtYXhpbV9yZl9zZXRfY2hhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHNob3J0IGNoKTsKKwordm9pZCBtYXhpbV9yZl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcG0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODUxYjkzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9wbS5jCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgICBQb3dlciBtYW5hZ2VtZW50IGludGVyZmFjZSByb3V0aW5lcy4KKyAgIFdyaXR0ZW4gYnkgTWFyaXVzeiBNYXR1c3play4KKyAgIFRoaXMgY29kZSBpcyBjdXJyZW50bHkganVzdCBhIHBsYWNlaG9sZGVyIGZvciBsYXRlciB3b3JrIGFuZAorICAgZG9lcyBub3QgZG8gYW55dGhpbmcgdXNlZnVsLgorCisgICBUaGlzIGlzIHBhcnQgb2YgcnRsODE4MCBPcGVuU291cmNlIGRyaXZlci4KKyAgIENvcHlyaWdodCAoQykgQW5kcmVhIE1lcmVsbG8gMjAwNCAgPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorICAgUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdQTCAoR2VuZXJhbCBQdWJsaWMgTGljZW5jZSkKKyovCisKKyNpZmRlZiBDT05GSUdfUlRMODE4MF9QTQorCisKKyNpbmNsdWRlICJyODE4MF9ody5oIgorI2luY2x1ZGUgInI4MTgwX3BtLmgiCisjaW5jbHVkZSAicjgxODAuaCIKKworaW50IHJ0bDgxODBfc2F2ZV9zdGF0ZSAoc3RydWN0IHBjaV9kZXYgKmRldiwgdTMyIHN0YXRlKQoreworICAgICAgICBwcmludGsoS0VSTl9OT1RJQ0UgInI4MTgwIHNhdmUgc3RhdGUgY2FsbCAoc3RhdGUgJXUpLlxuIiwgc3RhdGUpOworCXJldHVybigtRUFHQUlOKTsKK30KKworaW50IHJ0bDgxODBfc3VzcGVuZCAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworLy8Jc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCWdvdG8gb3V0X3BjaV9zdXNwZW5kOworCisJZGV2LT5zdG9wKGRldik7CisKKwluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisKK291dF9wY2lfc3VzcGVuZDoKKwlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LHBjaV9jaG9vc2Vfc3RhdGUocGRldixzdGF0ZSkpOworCXJldHVybiAwOworfQorCitpbnQgcnRsODE4MF9yZXN1bWUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisvLwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50IGVycjsKKwl1MzIgdmFsOworCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOworCisJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCBvbiByZXN1bWVcbiIsCisJCQkJZGV2LT5uYW1lKTsKKworCQlyZXR1cm4gZXJyOworCX0KKwlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKKwkvKgorCSAqIFN1c3BlbmQvUmVzdW1lIHJlc2V0cyB0aGUgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UsIHNvIHdlIGhhdmUgdG8KKwkgKiByZS1kaXNhYmxlIHRoZSBSRVRSWV9USU1FT1VUIHJlZ2lzdGVyICgweDQxKSB0byBrZWVwIFBDSSBUeCByZXRyaWVzCisJICogZnJvbSBpbnRlcmZlcmluZyB3aXRoIEMzIENQVSBzdGF0ZS4gcGNpX3Jlc3RvcmVfc3RhdGUgd29uJ3QgaGVscAorCSAqIGhlcmUgc2luY2UgaXQgb25seSByZXN0b3JlcyB0aGUgZmlyc3QgNjQgYnl0ZXMgcGNpIGNvbmZpZyBoZWFkZXIuCisJICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIDB4NDAsICZ2YWwpOworCWlmICgodmFsICYgMHgwMDAwZmYwMCkgIT0gMCkKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCAweDQwLCB2YWwgJiAweGZmZmYwMGZmKTsKKworCWlmKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCWdvdG8gb3V0OworCisJZGV2LT5vcGVuKGRldik7CisJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworb3V0OgorCXJldHVybiAwOworfQorCisKK2ludCBydGw4MTgwX2VuYWJsZV93YWtlIChzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1MzIgc3RhdGUsIGludCBlbmFibGUpCit7CisgICAgICAgIHByaW50ayhLRVJOX05PVElDRSAicjgxODAgZW5hYmxlIHdha2UgY2FsbCAoc3RhdGUgJXUsIGVuYWJsZSAlZCkuXG4iLAorCSAgICAgICBzdGF0ZSwgZW5hYmxlKTsKKwlyZXR1cm4oLUVBR0FJTik7Cit9CisKKworCisjZW5kaWYgLy9DT05GSUdfUlRMODE4MF9QTQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9wbS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9wbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NThiM2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3BtLmgKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAgICAgICAgUG93ZXIgbWFuYWdlbWVudCBpbnRlcmZhY2Ugcm91dGluZXMuCisJV3JpdHRlbiBieSBNYXJpdXN6IE1hdHVzemVrLgorCVRoaXMgY29kZSBpcyBjdXJyZW50bHkganVzdCBhIHBsYWNlaG9sZGVyIGZvciBsYXRlciB3b3JrIGFuZAorCWRvZXMgbm90IGRvIGFueXRoaW5nIHVzZWZ1bC4KKworCVRoaXMgaXMgcGFydCBvZiBydGw4MTgwIE9wZW5Tb3VyY2UgZHJpdmVyLgorCUNvcHlyaWdodCAoQykgQW5kcmVhIE1lcmVsbG8gMjAwNCAgPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorCVJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCisKKyovCisKKyNpZmRlZiBDT05GSUdfUlRMODE4MF9QTQorCisjaWZuZGVmIFI4MTgwX1BNX0gKKyNkZWZpbmUgUjgxODBfUE1fSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworaW50IHJ0bDgxODBfc2F2ZV9zdGF0ZSAoc3RydWN0IHBjaV9kZXYgKmRldiwgdTMyIHN0YXRlKTsKK2ludCBydGw4MTgwX3N1c3BlbmQgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOworaW50IHJ0bDgxODBfcmVzdW1lIChzdHJ1Y3QgcGNpX2RldiAqcGRldik7CitpbnQgcnRsODE4MF9lbmFibGVfd2FrZSAoc3RydWN0IHBjaV9kZXYgKmRldiwgdTMyIHN0YXRlLCBpbnQgZW5hYmxlKTsKKworI2VuZGlmIC8vUjgxODBfUE1fSAorCisjZW5kaWYgLy8gQ09ORklHX1JUTDgxODBfUE0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODIyNS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9ydGw4MjI1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZlZDAyOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODIyNS5jCkBAIC0wLDAgKzEsOTMzIEBACisvKgorICBUaGlzIGlzIHBhcnQgb2YgdGhlIHJ0bDgxODAtc2EyNDAwIGRyaXZlcgorICByZWxlYXNlZCB1bmRlciB0aGUgR1BMIChTZWUgZmlsZSBDT1BZSU5HIGZvciBkZXRhaWxzKS4KKyAgQ29weXJpZ2h0IChjKSAyMDA1IEFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKworICBUaGlzIGZpbGVzIGNvbnRhaW5zIHByb2dyYW1taW5nIGNvZGUgZm9yIHRoZSBydGw4MjI1CisgIHJhZGlvIGZyb250ZW5kLgorCisgICpNYW55KiB0aGFua3MgdG8gUmVhbHRlayBDb3JwLiBmb3IgdGhlaXIgZ3JlYXQgc3VwcG9ydCEKKworKi8KKworCisKKyNpbmNsdWRlICJyODE4MF9ody5oIgorI2luY2x1ZGUgInI4MTgwX3J0bDgyMjUuaCIKKworCit1OCBydGw4MjI1X2dhaW5bXT17CisJMHgyMywweDg4LDB4N2MsMHhhNSwvLyAtODJkYm0KKwkweDIzLDB4ODgsMHg3YywweGI1LC8vIC04MmRibQorCTB4MjMsMHg4OCwweDdjLDB4YzUsLy8gLTgyZGJtCisJMHgzMywweDgwLDB4NzksMHhjNSwvLyAtNzhkYm0KKwkweDQzLDB4NzgsMHg3NiwweGM1LC8vIC03NGRibQorCTB4NTMsMHg2MCwweDczLDB4YzUsLy8gLTcwZGJtCisJMHg2MywweDU4LDB4NzAsMHhjNSwvLyAtNjZkYm0KK307CisKKyNpZiAwCit1OCBydGw4MjI1X2luaXRfZ2FpbltdPXsKKwkvLzB4MDAsMHgwMCwweDAwLDB4MDAsLy8weDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MzMsMHg4MCwweDZjLDB4YzUsLy8weDAwLDB4NDksMHgwNiwweGI1LC8vR2FpbiA9IDAgfiAtNzhkYm0KKwkweDQzLDB4NzgsMHg2OSwweGM1LC8vMHgwMCwweDQ1LDB4MDYsMHhiMSwvL0dhaW4gPSAxIH4gLTc0ZGJtCisJMHg1MywweDYwLDB4NjYsMHhjNSwvLzB4MDAsMHg0MSwweDA2LDB4YWIsLy9HYWluID0gMiB+IC03MGRibQorCTB4NjMsMHg1OCwweDYzLDB4YzUsLy8weDAwLDB4M2QsMHgwNiwweGE1LC8vR2FpbiA9IDMgfiAtNjZkYm0KKwkweDczLDB4NTAsMHg2MiwweGM1LC8vMHgwMCwweDM5LDB4MDYsMHhhMSwvL0dhaW4gPSA0IH4gLTYyZGJtCisJMHg4MywweDQzLDB4NjEsMHhjNSwvLzB4MDAsMHgzNSwweDA2LDB4OWIsLy9HYWluID0gNSB+IC01OGRibQorCTB4OTMsMHgzOCwweDVhLDB4YzUsLy8weDAwLDB4MzEsMHgwNiwweDk5LC8vR2FpbiA9IDYgfiAtNTRkYm0KK307CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCit1MzIgcnRsODIyNV9jaGFuW10gPXsKKyAgICAgICAgICAgICAgMCwKKwkJMHgwMDgwLCAvL2NoMQorCQkweDAxMDAsIC8vY2gyCisJCTB4MDE4MCwgLy9jaDMKKwkJMHgwMjAwLCAvL2NoNAorCQkweDAyODAsCisJCTB4MDMwMCwKKwkJMHgwMzgwLAorCQkweDA0MDAsCisJCTB4MDQ4MCwKKwkJMHgwNTAwLAorCQkweDA1ODAsCisJCTB4MDYwMCwKKwkJMHgwNjgwLAorCQkweDA3NEEsIC8vY2gxNAorfTsKKyNlbHNlCit1MzIgcnRsODIyNV9jaGFuW10gPSB7CisJMCwJLy9kdW1teSBjaGFubmVsIDAKKwkweDA4NWMsIC8vMQorCTB4MDhkYywgLy8yCisJMHgwOTVjLCAvLzMKKwkweDA5ZGMsIC8vNAorCTB4MGE1YywgLy81CisJMHgwYWRjLCAvLzYKKwkweDBiNWMsIC8vNworCTB4MGJkYywgLy84CisJMHgwYzVjLCAvLzkKKwkweDBjZGMsIC8vMTAKKwkweDBkNWMsIC8vMTEKKwkweDBkZGMsIC8vMTIKKwkweDBlNWMsIC8vMTMKKwkvLzB4MGY1YywgLy8xNAorCTB4MGY3MiwgLy8gMTQKK307CisjZW5kaWYKKwordTE2IHJ0bDgyMjViY2RfcnhnYWluW109eworCTB4MDQwMCwgMHgwNDAxLCAweDA0MDIsIDB4MDQwMywgMHgwNDA0LCAweDA0MDUsIDB4MDQwOCwgMHgwNDA5LAorCTB4MDQwYSwgMHgwNDBiLCAweDA1MDIsIDB4MDUwMywgMHgwNTA0LCAweDA1MDUsIDB4MDU0MCwgMHgwNTQxLAorCTB4MDU0MiwgMHgwNTQzLCAweDA1NDQsIDB4MDU0NSwgMHgwNTgwLCAweDA1ODEsIDB4MDU4MiwgMHgwNTgzLAorCTB4MDU4NCwgMHgwNTg1LCAweDA1ODgsIDB4MDU4OSwgMHgwNThhLCAweDA1OGIsIDB4MDY0MywgMHgwNjQ0LAorCTB4MDY0NSwgMHgwNjgwLCAweDA2ODEsIDB4MDY4MiwgMHgwNjgzLCAweDA2ODQsIDB4MDY4NSwgMHgwNjg4LAorCTB4MDY4OSwgMHgwNjhhLCAweDA2OGIsIDB4MDY4YywgMHgwNzQyLCAweDA3NDMsIDB4MDc0NCwgMHgwNzQ1LAorCTB4MDc4MCwgMHgwNzgxLCAweDA3ODIsIDB4MDc4MywgMHgwNzg0LCAweDA3ODUsIDB4MDc4OCwgMHgwNzg5LAorCTB4MDc4YSwgMHgwNzhiLCAweDA3OGMsIDB4MDc4ZCwgMHgwNzkwLCAweDA3OTEsIDB4MDc5MiwgMHgwNzkzLAorCTB4MDc5NCwgMHgwNzk1LCAweDA3OTgsIDB4MDc5OSwgMHgwNzlhLCAweDA3OWIsIDB4MDc5YywgMHgwNzlkLAorCTB4MDdhMCwgMHgwN2ExLCAweDA3YTIsIDB4MDdhMywgMHgwN2E0LCAweDA3YTUsIDB4MDdhOCwgMHgwN2E5LAorCTB4MDdhYSwgMHgwN2FiLCAweDA3YWMsIDB4MDdhZCwgMHgwN2IwLCAweDA3YjEsIDB4MDdiMiwgMHgwN2IzLAorCTB4MDdiNCwgMHgwN2I1LCAweDA3YjgsIDB4MDdiOSwgMHgwN2JhLCAweDA3YmIsIDB4MDdiYgorCit9OworCisKKyNpZiAwCit1MTYgcnRsODIyNWJjX3J4Z2FpbltdPXsKKwkweDA0MDAsIDB4MDQwMSwgMHgwNDAyLCAweDA0MDMsIDB4MDQwNCwgMHgwNDA1LCAweDA0MDgsIDB4MDQwOSwKKwkweDA0MGEsIDB4MDQwYiwgMHgwNTAyLCAweDA1MDMsIDB4MDUwNCwgMHgwNTA1LCAweDA1NDAsIDB4MDU0MSwKKwkweDA1NDIsIDB4MDU0MywgMHgwNTQ0LCAweDA1NDUsIDB4MDU4MCwgMHgwNTgxLCAweDA1ODIsIDB4MDU4MywKKwkweDA1ODQsIDB4MDU4NSwgMHgwNTg4LCAweDA1ODksIDB4MDU4YSwgMHgwNThiLCAweDA2NDMsIDB4MDY0NCwKKwkweDA2NDUsIDB4MDY4MCwgMHgwNjgxLCAweDA2ODIsIDB4MDY4MywgMHgwNjg0LCAweDA2ODUsIDB4MDY4OCwKKwkweDA2ODksIDB4MDY4YSwgMHgwNjhiLCAweDA2OGMsIDB4MDc0MiwgMHgwNzQzLCAweDA3NDQsIDB4MDc0NSwKKwkweDA3ODAsIDB4MDc4MSwgMHgwNzgyLCAweDA3ODMsIDB4MDc4NCwgMHgwNzg1LCAweDA3ODgsIDB4MDc4OSwKKwkweDA3OGEsIDB4MDc4YiwgMHgwNzhjLCAweDA3OGQsIDB4MDc5MCwgMHgwNzkxLCAweDA3OTIsIDB4MDc5MywKKwkweDA3OTQsIDB4MDc5NSwgMHgwNzk4LCAweDA3OTksIDB4MDM5YSwgMHgwMzliLCAweDAzOWMsIDB4MDM5ZCwKKwkweDAzYTAsIDB4MDNhMSwgMHgwM2EyLCAweDAzYTMsIDB4MDNhNCwgMHgwM2E1LCAweDAzYTgsIDB4MDNhOSwKKwkweDAzYWEsIDB4MDNhYiwgMHgwM2FjLCAweDAzYWQsIDB4MDNiMCwgMHgwM2IxLCAweDAzYjIsIDB4MDNiMywKKwkweDAzYjQsIDB4MDNiNSwgMHgwM2I4LCAweDAzYjksIDB4MDNiYSwgMHgwM2JiLCAweDAzYmIKKworfTsKKworCit1MTYgcnRsODIyNWFfcnhnYWluW109eworCTB4MDQwMCwgMHgwNDAxLCAweDA0MDIsIDB4MDQwMywgMHgwNDA0LCAweDA0MDUsIDB4MDQwOCwgMHgwNDA5LAorCTB4MDQwYSwgMHgwNDBiLCAweDA1MDIsIDB4MDUwMywgMHgwNTA0LCAweDA1MDUsIDB4MDU0MCwgMHgwNTQxLAorCTB4MDU0MiwgMHgwNTQzLCAweDA1NDQsIDB4MDU0NSwgMHgwNTgwLCAweDA1ODEsIDB4MDU4MiwgMHgwNTgzLAorCTB4MDU4NCwgMHgwNTg1LCAweDA1ODgsIDB4MDU4OSwgMHgwNThhLCAweDA1OGIsIDB4MDY0MywgMHgwNjQ0LAorCTB4MDY0NSwgMHgwNjgwLCAweDA2ODEsIDB4MDY4MiwgMHgwNjgzLCAweDA2ODQsIDB4MDY4NSwgMHgwNjg4LAorCTB4MDY4OSwgMHgwNjhhLCAweDA2OGIsIDB4MDY4YywgMHgwNzQyLCAweDA3NDMsIDB4MDc0NCwgMHgwNzQ1LAorCTB4MDc4MCwgMHgwNzgxLCAweDA3ODIsIDB4MDc4MywgMHgwNzg0LCAweDA3ODUsIDB4MDc4OCwgMHgwNzg5LAorCTB4MDc4YSwgMHgwNzhiLCAweDA3OGMsIDB4MDc4ZCwgMHgwNzkwLCAweDA3OTEsIDB4MDc5MiwgMHgwNzkzLAorCTB4MDc5NCwgMHgwNzk1LCAweDA3OTgsIDB4MDc5OSwgMHgwNzlhLCAweDA3OWIsIDB4MDc5YywgMHgwNzlkLAorCTB4MDdhMCwgMHgwN2ExLCAweDA3YTIsIDB4MDdhMywgMHgwN2E0LCAweDA3YTUsIDB4MDdhOCwgMHgwN2E5LAorCTB4MDdhYSwgMHgwN2FiLCAweDA3YWMsIDB4MDdhZCwgMHgwN2FkLCAweDA3YWQsIDB4MDdhZCwgMHgwN2FkLAorCTB4MDdhZCwgMHgwN2FkLCAweDA3YWQsIDB4MDdhZCwgMHgwN2FkLCAweDA3YWQsIDB4MDdhZAorfTsKKyNlbmRpZgorCit1OCBydGw4MjI1X2FnY1tdPXsKKwkweDllLDB4OWUsMHg5ZSwweDllLDB4OWUsMHg5ZSwweDllLDB4OWUsMHg5ZCwweDljLDB4OWIsMHg5YSwweDk5LDB4OTgsMHg5NywweDk2LAorCTB4OTUsMHg5NCwweDkzLDB4OTIsMHg5MSwweDkwLDB4OGYsMHg4ZSwweDhkLDB4OGMsMHg4YiwweDhhLDB4ODksMHg4OCwweDg3LDB4ODYsCisJMHg4NSwweDg0LDB4ODMsMHg4MiwweDgxLDB4ODAsMHgzZiwweDNlLDB4M2QsMHgzYywweDNiLDB4M2EsMHgzOSwweDM4LDB4MzcsMHgzNiwKKwkweDM1LDB4MzQsMHgzMywweDMyLDB4MzEsMHgzMCwweDJmLDB4MmUsMHgyZCwweDJjLDB4MmIsMHgyYSwweDI5LDB4MjgsMHgyNywweDI2LAorCTB4MjUsMHgyNCwweDIzLDB4MjIsMHgyMSwweDIwLDB4MWYsMHgxZSwweDFkLDB4MWMsMHgxYiwweDFhLDB4MTksMHgxOCwweDE3LDB4MTYsCisJMHgxNSwweDE0LDB4MTMsMHgxMiwweDExLDB4MTAsMHgwZiwweDBlLDB4MGQsMHgwYywweDBiLDB4MGEsMHgwOSwweDA4LDB4MDcsMHgwNiwKKwkweDA1LDB4MDQsMHgwMywweDAyLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLAorCTB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsCit9OworCisKK3U4IHJ0bDgyMjVfdHhfZ2Fpbl9jY2tfb2ZkbVtdPXsKKwkweDAyLDB4MDYsMHgwZSwweDFlLDB4M2UsMHg3ZQorfTsKKworCit1OCBydGw4MjI1X3R4X3Bvd2VyX29mZG1bXT17CisJMHg4MCwweDkwLDB4YTIsMHhiNSwweGNiLDB4ZTQKK307CisKKwordTggcnRsODIyNV90eF9wb3dlcl9jY2tfY2gxNFtdPXsKKwkweDE4LDB4MTcsMHgxNSwweDBjLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgxYiwweDFhLDB4MTcsMHgwZSwweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MWYsMHgxZSwweDFhLDB4MGYsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkweDIyLDB4MjEsMHgxZCwweDExLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJMHgyNiwweDI1LDB4MjEsMHgxMywweDAwLDB4MDAsMHgwMCwweDAwLAorCTB4MmIsMHgyYSwweDI1LDB4MTUsMHgwMCwweDAwLDB4MDAsMHgwMAorfTsKKworCit1OCBydGw4MjI1X3R4X3Bvd2VyX2Nja1tdPXsKKwkweDE4LDB4MTcsMHgxNSwweDExLDB4MGMsMHgwOCwweDA0LDB4MDIsCisJMHgxYiwweDFhLDB4MTcsMHgxMywweDBlLDB4MDksMHgwNCwweDAyLAorCTB4MWYsMHgxZSwweDFhLDB4MTUsMHgxMCwweDBhLDB4MDUsMHgwMiwKKwkweDIyLDB4MjEsMHgxZCwweDE4LDB4MTEsMHgwYiwweDA2LDB4MDIsCisJMHgyNiwweDI1LDB4MjEsMHgxYiwweDE0LDB4MGQsMHgwNiwweDAzLAorCTB4MmIsMHgyYSwweDI1LDB4MWUsMHgxNiwweDBlLDB4MDcsMHgwMworfTsKKworCit2b2lkIHJ0bDgyMjVfc2V0X2dhaW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgZ2FpbikKK3sKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MGQsIHJ0bDgyMjVfZ2FpbltnYWluICogNF0pOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyMywgcnRsODIyNV9nYWluW2dhaW4gKiA0ICsgMV0pOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxYiwgcnRsODIyNV9nYWluW2dhaW4gKiA0ICsgMl0pOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxZCwgcnRsODIyNV9nYWluW2dhaW4gKiA0ICsgM10pOworfQorI2lmIDAKKwordm9pZCBydGw4MjI1X3NldF9nYWluKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IGdhaW4pCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJcnRsODE4MF9zZXRfYW5hcGFyYW0oZGV2LCBSVEw4MjI1X0FOQVBBUkFNX09OKTsKKworCWlmKHByaXYtPmNhcmRfODE4NSA9PSAyKQorCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjEsIDB4MjcpOworCWVsc2UKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDIxLCAweDM3KTsKKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNSwgMHgyMCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDExLCAweDYpOworCisJaWYocHJpdi0+Y2FyZF84MTg1ID09IDEgJiYgcHJpdi0+Y2FyZF84MTg1X0J2ZXJzaW9uKQorCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjcsIDB4OCk7CisJZWxzZQorCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjcsIDB4ODgpOworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE0LCAwKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTYsIDApOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNSwgMHg0MCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE3LCAweDQwKTsKKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwZCwgcnRsODIyNV9nYWluW2dhaW4gKiA0XSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDIzLCBydGw4MjI1X2dhaW5bZ2FpbiAqIDQgKyAxXSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDFiLCBydGw4MjI1X2dhaW5bZ2FpbiAqIDQgKyAyXSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDFkLCBydGw4MjI1X2dhaW5bZ2FpbiAqIDQgKyAzXSk7CisJLy9ydGw4MjI1X3NldF9nYWluX3VzYihkZXYsIGdhaW4pOworfQorI2VuZGlmCisKKwordm9pZCB3cml0ZV9ydGw4MjI1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkciwgdTE2IGRhdGEpCit7CisJaW50IGk7CisJdTE2IG91dCxzZWxlY3Q7CisJdTggYml0OworCXUzMiBiYW5nZGF0YSA9IChkYXRhIDw8IDQpIHwgKGFkciAmIDB4Zik7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJb3V0ID0gcmVhZF9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCkgJiAweGZmZjM7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsUkZQaW5zRW5hYmxlLAorCQkocmVhZF9uaWNfd29yZChkZXYsUkZQaW5zRW5hYmxlKSB8IDB4NykpOworCisJc2VsZWN0ID0gcmVhZF9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCk7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCwgc2VsZWN0IHwgMHg3IHwKKwkJKChwcml2LT5jYXJkX3R5cGUgPT0gVVNCKSA/IDAgOiBTV19DT05UUk9MX0dQSU8pKTsKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJdWRlbGF5KDEwKTsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBvdXQgfCBCQl9IT1NUX0JBTkdfRU4gKTsvL3wgMHgxZmZmKTsKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJdWRlbGF5KDIpOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIG91dCk7CisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCXVkZWxheSgxMCk7CisKKworCWZvcihpPTE1OyBpPj0wO2ktLSl7CisKKwkJYml0ID0gKGJhbmdkYXRhICYgKDE8PGkpKSA+PiBpOworCisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXQgfCBvdXQpOworCisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXQgfCBvdXQgfCBCQl9IT1NUX0JBTkdfQ0xLKTsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIGJpdCB8IG91dCB8IEJCX0hPU1RfQkFOR19DTEspOworCisJCWktLTsKKwkJYml0ID0gKGJhbmdkYXRhICYgKDE8PGkpKSA+PiBpOworCisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXQgfCBvdXQgfCBCQl9IT1NUX0JBTkdfQ0xLKTsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIGJpdCB8IG91dCB8IEJCX0hPU1RfQkFOR19DTEspOworCisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXQgfCBvdXQpOworCisJfQorCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIG91dCB8IEJCX0hPU1RfQkFOR19FTik7CisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCXVkZWxheSgxMCk7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgb3V0IHwKKwkJKChwcml2LT5jYXJkX3R5cGUgPT0gVVNCKSA/IDQgOiBCQl9IT1NUX0JBTkdfRU4pKTsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0LCBzZWxlY3QgfAorCQkoKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpID8gMCA6IFNXX0NPTlRST0xfR1BJTykpOworCisJaWYocHJpdi0+Y2FyZF90eXBlID09IFVTQikKKwkJbWRlbGF5KDIpOworCWVsc2UKKwkJcnRsODE4NV9yZl9waW5zX2VuYWJsZShkZXYpOworfQorCit2b2lkIHJ0bDgyMjVfcmZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHg0LCAweDFmKTsKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJbWRlbGF5KDEpOworCisJcnRsODE4MF9zZXRfYW5hcGFyYW0oZGV2LCBSVEw4MjI1X0FOQVBBUkFNX09GRik7CisJcnRsODE4NV9zZXRfYW5hcGFyYW0yKGRldiwgUlRMODIyNV9BTkFQQVJBTTJfT0ZGKTsKK30KKwordm9pZCBydGw4MjI1X1NldFRYUG93ZXJMZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBjaCkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlpbnQgR2FpbklkeDsKKwlpbnQgR2FpblNldHRpbmc7CisJaW50IGk7CisJdTggcG93ZXI7CisJdTggKmNja19wb3dlcl90YWJsZTsKKwl1OCBtYXhfY2NrX3Bvd2VyX2xldmVsOworCXU4IG1heF9vZmRtX3Bvd2VyX2xldmVsOworCXU4IG1pbl9vZmRtX3Bvd2VyX2xldmVsOworCXU4IGNja19wb3dlcl9sZXZlbCA9IDB4ZmYgJiBwcml2LT5jaHR4cHdyW2NoXTsKKwl1OCBvZmRtX3Bvd2VyX2xldmVsID0gMHhmZiAmIHByaXYtPmNodHhwd3Jfb2ZkbVtjaF07CisKKwlpZihwcml2LT5jYXJkX3R5cGUgPT0gVVNCKXsKKwkJbWF4X2Nja19wb3dlcl9sZXZlbCA9IDExOworCQltYXhfb2ZkbV9wb3dlcl9sZXZlbCA9IDI1OyAvLyAgMTIgLT4gMjUKKwkJbWluX29mZG1fcG93ZXJfbGV2ZWwgPSAxMDsKKwl9ZWxzZXsKKwkJbWF4X2Nja19wb3dlcl9sZXZlbCA9IDM1OworCQltYXhfb2ZkbV9wb3dlcl9sZXZlbCA9IDM1OworCQltaW5fb2ZkbV9wb3dlcl9sZXZlbCA9IDA7CisJfQorCS8qIENDSyBwb3dlciBzZXR0aW5nICovCisJaWYoY2NrX3Bvd2VyX2xldmVsID4gbWF4X2Nja19wb3dlcl9sZXZlbCkKKwkJY2NrX3Bvd2VyX2xldmVsID0gbWF4X2Nja19wb3dlcl9sZXZlbDsKKwlHYWluSWR4PWNja19wb3dlcl9sZXZlbCAlIDY7CisJR2FpblNldHRpbmc9Y2NrX3Bvd2VyX2xldmVsIC8gNjsKKworCWlmKGNoID09IDE0KQorCQljY2tfcG93ZXJfdGFibGUgPSBydGw4MjI1X3R4X3Bvd2VyX2Nja19jaDE0OworCWVsc2UKKwkJY2NrX3Bvd2VyX3RhYmxlID0gcnRsODIyNV90eF9wb3dlcl9jY2s7CisKKy8vCWlmKHByaXYtPmNhcmRfODE4NSA9PSAxICYmIHByaXYtPmNhcmRfODE4NV9CdmVyc2lvbiApeworCQkvKlZlciBCKi8KKy8vCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFRYX0dBSU5fQ0NLLCBydGw4MjI1X3R4X2dhaW5fY2NrX29mZG1bR2FpblNldHRpbmddKTsKKy8vCX1lbHNleworCQkvKlZlciBDIC0gRCAqLworCXdyaXRlX25pY19ieXRlKGRldiwgVFhfR0FJTl9DQ0ssIHJ0bDgyMjVfdHhfZ2Fpbl9jY2tfb2ZkbVtHYWluU2V0dGluZ10+PjEpOworLy8JfQorCisJZm9yKGk9MDtpPDg7aSsrKXsKKworCQlwb3dlciA9IGNja19wb3dlcl90YWJsZVtHYWluSWR4ICogOCArIGldOworCQl3cml0ZV9waHlfY2NrKGRldiwgMHg0NCArIGksIHBvd2VyKTsKKwl9CisKKwkvKiBGSVhNRSBJcyB0aGlzIGRlbGF5IHJlYWxseSBuZWVkZWVkID8gKi8KKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCW1kZWxheSgxKTsKKworCS8qIE9GRE0gcG93ZXIgc2V0dGluZyAqLworLy8gIE9sZDoKKy8vCWlmKG9mZG1fcG93ZXJfbGV2ZWwgPiBtYXhfb2ZkbV9wb3dlcl9sZXZlbCkKKy8vCQlvZmRtX3Bvd2VyX2xldmVsID0gMzU7CisvLwlvZmRtX3Bvd2VyX2xldmVsICs9IG1pbl9vZmRtX3Bvd2VyX2xldmVsOworLy8gIExhdGVzdDoKKwlpZihvZmRtX3Bvd2VyX2xldmVsID4gKG1heF9vZmRtX3Bvd2VyX2xldmVsIC0gbWluX29mZG1fcG93ZXJfbGV2ZWwpKQorCQlvZmRtX3Bvd2VyX2xldmVsID0gbWF4X29mZG1fcG93ZXJfbGV2ZWw7CisJZWxzZQorCQlvZmRtX3Bvd2VyX2xldmVsICs9IG1pbl9vZmRtX3Bvd2VyX2xldmVsOworCWlmKG9mZG1fcG93ZXJfbGV2ZWwgPiAzNSkKKwkJb2ZkbV9wb3dlcl9sZXZlbCA9IDM1OworLy8KKworCUdhaW5JZHg9b2ZkbV9wb3dlcl9sZXZlbCAlIDY7CisJR2FpblNldHRpbmc9b2ZkbV9wb3dlcl9sZXZlbCAvIDY7CisjaWYgMQorLy8JaWYocHJpdi0+Y2FyZF90eXBlID09IFVTQil7CisJCXJ0bDgxODVfc2V0X2FuYXBhcmFtMihkZXYsUlRMODIyNV9BTkFQQVJBTTJfT04pOworCisJCXdyaXRlX3BoeV9vZmRtKGRldiwyLDB4NDIpOworCQl3cml0ZV9waHlfb2ZkbShkZXYsNiwwKTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LDgsMCk7CisvLwl9CisjZW5kaWYKKy8vCWlmKHByaXYtPmNhcmRfODE4NSA9PSAxICYmIHByaXYtPmNhcmRfODE4NV9CdmVyc2lvbil7CisvLwkJLypWZXIgQiovCisvLwkJd3JpdGVfbmljX2J5dGUoZGV2LCBUWF9HQUlOX09GRE0sIHJ0bDgyMjVfdHhfZ2Fpbl9jY2tfb2ZkbVtHYWluU2V0dGluZ10pOworLy8JfWVsc2V7CisJCS8qVmVyIEMgLSBEICovCisJd3JpdGVfbmljX2J5dGUoZGV2LCBUWF9HQUlOX09GRE0sIHJ0bDgyMjVfdHhfZ2Fpbl9jY2tfb2ZkbVtHYWluU2V0dGluZ10+PjEpOworLy8JfQorCisKKwlwb3dlciA9IHJ0bDgyMjVfdHhfcG93ZXJfb2ZkbVtHYWluSWR4XTsKKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHg1LCBwb3dlcik7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDcsIHBvd2VyKTsKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJbWRlbGF5KDEpOworCS8vd3JpdGVfbmljX2J5dGUoZGV2LCBUWF9BR0NfQ09OVFJPTCw0KTsKK30KKyNpZiAwCisvKiBzd2l0Y2ggYmV0d2VlbiBtb2RlIEIgYW5kIEcgKi8KK3ZvaWQgcnRsODIyNV9zZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBtb2RlYikKK3sKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTUsIChtb2RlYiA/IDB4MCA6IDB4NDApKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTcsIChtb2RlYiA/IDB4MCA6IDB4NDApKTsKK30KKyNlbmRpZgordm9pZCBydGw4MjI1X3JmX3NldF9jaGFuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IGNoKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzaG9ydCBnc2V0ID0gKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCAmJgorCQlpZWVlODAyMTFfaXNfNTRnKHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrKSkgfHwKKwkJcHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUjsKKworCXJ0bDgyMjVfU2V0VFhQb3dlckxldmVsKGRldiwgY2gpOworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4NywgcnRsODIyNV9jaGFuW2NoXSk7CisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCW1kZWxheSgxMCk7CisKKwkvLyBBIG1vZGUgc2lmcyAweDQ0LCBkaWZzIDM0LTE0LCBzbG90IDksIGVpZnMgMjMsIGN3bSAzLCBjd00gNywgY3RzdG9zZWxmIDB4MTAKKwlpZihnc2V0KXsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LFNJRlMsMHgyMik7Ly8gU0lGUzogMHgyMgorCQl3cml0ZV9uaWNfYnl0ZShkZXYsRElGUywweDE0KTsgLy9ESUZTOiAyMAorCQkvL3dyaXRlX25pY19ieXRlKGRldixESUZTLDIwKTsgLy9ESUZTOiAyMAorCX1lbHNleworCQl3cml0ZV9uaWNfYnl0ZShkZXYsU0lGUywweDQ0KTsvLyBTSUZTOiAweDIyCisJCXdyaXRlX25pY19ieXRlKGRldixESUZTLDUwIC0gMTQpOyAvL0RJRlM6IDM2CisJfQorCWlmKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCAmJgorCQlpZWVlODAyMTFfaXNfc2hvcnRzbG90KHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrKSkKKwkJd3JpdGVfbmljX2J5dGUoZGV2LFNMT1QsMHg5KTsgLy9TTE9UOiA5CisKKwllbHNlCisJCXdyaXRlX25pY19ieXRlKGRldixTTE9ULDB4MTQpOyAvL1NMT1Q6IDIwICgweDE0KQorCisKKwlpZihnc2V0KXsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LEVJRlMsODEpOy8vOTEgLSAyMCk7IC8vIEVJRlM6IDkxICgweDVCKQorCQl3cml0ZV9uaWNfYnl0ZShkZXYsQ1dfVkFMLDB4NzMpOyAvL0NXIFZBTFVFOiAweDM3CisJCS8vRE1FU0coInVzaW5nIEcgbmV0IHBhcmFtcyIpOworCX1lbHNleworCQl3cml0ZV9uaWNfYnl0ZShkZXYsRUlGUyw4MSk7IC8vIEVJRlM6IDkxICgweDVCKQorCQl3cml0ZV9uaWNfYnl0ZShkZXYsQ1dfVkFMLDB4YTUpOyAvL0NXIFZBTFVFOiAweDM3CisJCS8vRE1FU0coInVzaW5nIEIgbmV0IHBhcmFtcyIpOworCX0KKworCit9CisKK3ZvaWQgcnRsODIyNV9ob3N0X3BjaV9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIDB4NDgwKTsKKworCXJ0bDgxODVfcmZfcGluc19lbmFibGUoZGV2KTsKKworCS8vaWYocHJpdi0+Y2FyZF84MTg1ID09IDIgJiYgcHJpdi0+ZW5hYmxlX2dwaW8wICkgLyogdmVyc2lvbiBEICovCisJLy93cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCwgMHg4OCk7CisJLy9lbHNlCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QsIDB4ODggfCBTV19DT05UUk9MX0dQSU8pOyAvKiAweDQ4OCB8IFNXX0NPTlRST0xfR1BJTyAqLworCisJd3JpdGVfbmljX2J5dGUoZGV2LCBHUF9FTkFCTEUsIDApOworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwltZGVsYXkoMjAwKTsKKworCXdyaXRlX25pY193b3JkKGRldiwgR1BfRU5BQkxFLCAweGZmICYgKH4oMTw8NikpKTsgLyogYml0IDYgaXMgZm9yIFJGIG9uL29mZiBkZXRlY3Rpb24gKi8KKworCit9CisKK3ZvaWQgcnRsODIyNV9ob3N0X3VzYl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJI2lmIDAKKwl3cml0ZV9uaWNfYnl0ZShkZXYsUkZQaW5zU2VsZWN0KzEsMCk7CisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsR1BJTywwKTsKKworCXdyaXRlX25pY19ieXRlX0UoZGV2LDB4NTMscmVhZF9uaWNfYnl0ZV9FKGRldiwweDUzKSB8ICgxPDw3KSk7CisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsUkZQaW5zU2VsZWN0KzEsNCk7CisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsR1BJTywweDIwKTsKKworCXdyaXRlX25pY19ieXRlKGRldixHUF9FTkFCTEUsMCk7CisKKworCS8qIENvbmZpZyBCQiAmIFJGICovCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIDB4ODApOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QsIDB4ODApOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNFbmFibGUsIDB4ODApOworCisKKwltZGVsYXkoMTAwKTsKKworCW1kZWxheSgxMDAwKTsKKyNlbmRpZgorCit9CisKK3ZvaWQgcnRsODIyNV9yZl9zbGVlcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXdyaXRlX3J0bDgyMjUoZGV2LDB4NCwweGRmZik7CisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwltZGVsYXkoMSk7CisJcnRsODE4MF9zZXRfYW5hcGFyYW0oZGV2LCBSVEw4MjI1X0FOQVBBUkFNX1NMRUVQKTsKKwlydGw4MTg1X3NldF9hbmFwYXJhbTIoZGV2LCBSVEw4MjI1X0FOQVBBUkFNMl9TTEVFUCk7CisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKK30KKwordm9pZCBydGw4MjI1X3JmX3dha2V1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXdyaXRlX3J0bDgyMjUoZGV2LDB4NCwweDlmZik7CisJcnRsODE4MF9zZXRfYW5hcGFyYW0oZGV2LCBSVEw4MjI1X0FOQVBBUkFNX09OKTsKKwlydGw4MTg1X3NldF9hbmFwYXJhbTIoZGV2LCBSVEw4MjI1X0FOQVBBUkFNMl9PTik7CisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKK30KKwordm9pZCBydGw4MjI1X3JmX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50IGk7CisJc2hvcnQgY2hhbm5lbCA9IDE7CisJdTE2IGJyc3I7CisKKwlwcml2LT5jaGFuID0gY2hhbm5lbDsKKworCXJ0bDgxODBfc2V0X2FuYXBhcmFtKGRldiwgUlRMODIyNV9BTkFQQVJBTV9PTik7CisKKworCWlmKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpCisJCXJ0bDgyMjVfaG9zdF91c2JfaW5pdChkZXYpOworCWVsc2UKKwkJcnRsODIyNV9ob3N0X3BjaV9pbml0KGRldik7CisKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSRl9USU1JTkcsIDB4MDAwYTgwMDgpOworCisJYnJzciA9IHJlYWRfbmljX3dvcmQoZGV2LCBCUlNSKTsKKworCXdyaXRlX25pY193b3JkKGRldiwgQlJTUiwgMHhmZmZmKTsKKworCSNpZiAwCisJaWYocHJpdi0+Y2FyZF84MTg1ID09IDEpey8qIHZlcnNpb24gQyBvciBCICovCisJCWlmKHByaXYtPmNhcmRfODE4NV9CdmVyc2lvbikgIC8qIHZlcnNpb24gQiovCisJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSRl9QQVJBLCAweDQ0KTsKKwkJZWxzZSAgICAvKiB2ZXJzaW9uIEMgKi8KKwkJCXdyaXRlX25pY19kd29yZChkZXYsIFJGX1BBUkEsIDB4MTAwMDQ0KTsKKwl9ZWxzZXsgLyogdmVyc2lvbiBEICovCisJCWlmKHByaXYtPmVuYWJsZV9ncGlvMCkKKwkJCXdyaXRlX25pY19kd29yZChkZXYsIFJGX1BBUkEsIDB4MjAxMDAwNDQpOworCQllbHNlIC8qIGFsc28gVVNCICovCisJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSRl9QQVJBLCAweDEwMDA0NCk7CisJfQorCSNlbmRpZgorCisJd3JpdGVfbmljX2R3b3JkKGRldiwgUkZfUEFSQSwgMHgxMDAwNDQpOworCisJI2lmIDEgIC8vMC0+MQorCXJ0bDgxODBfc2V0X21vZGUoZGV2LCBFUFJPTV9DTURfQ09ORklHKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENPTkZJRzMsIDB4NDQpOworCXJ0bDgxODBfc2V0X21vZGUoZGV2LCBFUFJPTV9DTURfTk9STUFMKTsKKwkjZW5kaWYKKworCWlmKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpeworCQlydGw4MTg1X3JmX3BpbnNfZW5hYmxlKGRldik7CisKKwkJbWRlbGF5KDEwMDApOworCX0KKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDAsIDB4NjcpOyBtZGVsYXkoMSk7CisKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDEsIDB4ZmUwKTsgbWRlbGF5KDEpOworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4MiwgMHg0NGQpOyBtZGVsYXkoMSk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHgzLCAweDQ0MSk7IG1kZWxheSgxKTsKKworCWlmKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpCisJCXdyaXRlX3J0bDgyMjUoZGV2LCAweDQsIDB4NDg2KTsKKwllbHNlCisJCXdyaXRlX3J0bDgyMjUoZGV2LCAweDQsIDB4OGJlKTsKKworCW1kZWxheSgxKTsKKworCisJI2lmIDAKKwl9ZWxzZSBpZihwcml2LT5waHlfdmVyID09IDEpeworCQkvKiB2ZXJzaW9uIEEgKi8KKwkJd3JpdGVfcnRsODIyNShkZXYsIDB4NSwgMHhiYzAgKyAyKTsKKwl9ZWxzZXsKKwkjZW5kaWYKKwkvKiB2ZXJzaW9uIEIgJiBDICovCisKKwlpZihwcml2LT5jYXJkX3R5cGUgPT0gVVNCKQorCQl3cml0ZV9ydGw4MjI1KGRldiwgMHg1LCAweGJjMCk7CisJZWxzZSBpZihwcml2LT5jYXJkX3R5cGUgPT0gTUlOSVBDSSkKKwkJd3JpdGVfcnRsODIyNShkZXYsIDB4NSwgMHhiYzAgKyAzICsoNjw8MykpOworCWVsc2UKKwkJd3JpdGVfcnRsODIyNShkZXYsIDB4NSwgMHhiYzAgKyAoNjw8MykpOworCisJIG1kZWxheSgxKTsKKy8vCX0KKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDYsIDB4YWU2KTsgIG1kZWxheSgxKTsKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDcsICgocHJpdi0+Y2FyZF90eXBlID09IFVTQik/IDB4ODJhIDogcnRsODIyNV9jaGFuW2NoYW5uZWxdKSk7ICBtZGVsYXkoMSk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHg4LCAweDFmKTsgIG1kZWxheSgxKTsKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDksIDB4MzM0KTsgIG1kZWxheSgxKTsKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweGEsIDB4ZmQ0KTsgIG1kZWxheSgxKTsKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweGIsIDB4MzkxKTsgIG1kZWxheSgxKTsKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweGMsIDB4NTApOyAgbWRlbGF5KDEpOworCisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHhkLCAweDZkYik7ICAgbWRlbGF5KDEpOworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4ZSwgMHgyOSk7ICBtZGVsYXkoMSk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHhmLCAweDkxNCk7CisKKwlpZihwcml2LT5jYXJkX3R5cGUgPT0gVVNCKXsKKwkJLy9mb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCQltZGVsYXkoMTAwKTsKKwl9CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHgyLCAweGM0ZCk7CisKKwlpZihwcml2LT5jYXJkX3R5cGUgPT0gVVNCKXsKKwkvLwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCQltZGVsYXkoMjAwKTsKKworCQl3cml0ZV9ydGw4MjI1KGRldiwgMHgyLCAweDQ0ZCk7CisKKwkvLwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCQltZGVsYXkoMTAwKTsKKworCX0vL0VuZCBvZiBpZihwcml2LT5jYXJkX3R5cGUgPT0gVVNCKQorCS8qIEZJWE1FISEgcnRsODE4NyB3ZSBoYXZlIHRvIGNoZWNrIGlmIGNhbGlicmFyaW9uCisJICogaXMgc3VjY2Vzc2Z1bCBhbmQgZXZlbnR1YWxseSBjYWwuIGFnYWluIChyZXBlYXQKKwkgKiB0aGUgdHdvIHdyaXRlIG9uIHJlZyAyKQorCSovCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKworCW1kZWxheSgxMDApOyAvLzIwMCBmb3IgODE4NworCisJLy9pZihwcml2LT5jYXJkX3R5cGUgIT0gVVNCKSAvKiBtYXliZSBub3QgbmVlZGVkIGV2ZW4gZm9yIDgxODUgKi8KKy8vCXdyaXRlX3J0bDgyMjUoZGV2LCAweDcsIHJ0bDgyMjVfY2hhbltjaGFubmVsXSk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHgwLCAweDEyNyk7CisKKwlmb3IoaT0wO2k8OTU7aSsrKXsKKwkJd3JpdGVfcnRsODIyNShkZXYsIDB4MSwgKHU4KShpKzEpKTsKKworCQkjaWYgMAorCQlpZihwcml2LT5waHlfdmVyID09IDEpCisJCQkvKiB2ZXJzaW9uIEEgKi8KKwkJCXdyaXRlX3J0bDgyMjUoZGV2LCAweDIsIHJ0bDgyMjVhX3J4Z2FpbltpXSk7CisJCWVsc2UKKwkJI2VuZGlmCisJCS8qIHZlcnNpb24gQiAmIEMgJiBEKi8KKworCQl3cml0ZV9ydGw4MjI1KGRldiwgMHgyLCBydGw4MjI1YmNkX3J4Z2FpbltpXSk7CisJfQorCisJd3JpdGVfcnRsODIyNShkZXYsIDB4MCwgMHgyNyk7CisKKworLy8JLy9pZihwcml2LT5jYXJkX3R5cGUgIT0gVVNCKXsKKy8vCQl3cml0ZV9ydGw4MjI1KGRldiwgMHgyLCAweDQ0ZCk7CisvLwkJd3JpdGVfcnRsODIyNShkZXYsIDB4NywgcnRsODIyNV9jaGFuW2NoYW5uZWxdKTsKKy8vCQl3cml0ZV9ydGw4MjI1KGRldiwgMHgyLCAweDQ3ZCk7CisvLworLy8JCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisvLwkJbWRlbGF5KDEwMCk7CisvLworLy8JCXdyaXRlX3J0bDgyMjUoZGV2LCAweDIsIDB4NDRkKTsKKy8vCS8vfQorCisJd3JpdGVfcnRsODIyNShkZXYsIDB4MCwgMHgyMmYpOworCisJaWYocHJpdi0+Y2FyZF90eXBlICE9IFVTQikKKwkJcnRsODE4NV9yZl9waW5zX2VuYWJsZShkZXYpOworCisJZm9yKGk9MDtpPDEyODtpKyspeworCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4YiwgcnRsODIyNV9hZ2NbaV0pOworCisJCW1kZWxheSgxKTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweGEsICh1OClpKyAweDgwKTsKKworCQltZGVsYXkoMSk7CisJfQorCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwltZGVsYXkoMSk7CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MCwgMHgxKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxLCAweDIpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDIsICgocHJpdi0+Y2FyZF90eXBlID09IFVTQik/IDB4NDIgOiAweDYyKSk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MywgMHgwKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHg0LCAweDApOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDUsIDB4MCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4NiwgMHg0MCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4NywgMHgwKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHg4LCAweDQwKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHg5LCAweGZlKTsgbWRlbGF5KDEpOworCisJI2lmIDAKKwlpZihwcml2LT5jYXJkX3R5cGUgPT0gVVNCKXsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweGEsIDB4OSk7CisJfWVsc2V7CisJCWlmKHByaXYtPmNhcmRfODE4NSA9PSAxICYmIHByaXYtPmNhcmRfODE4NV9CdmVyc2lvbil7CisJCQkvKiBWZXIgQgorCQkJKiBtYXliZSBsYXRlciB2ZXJzaW9uIGNhbiBhY2NlcHQgdGhpcyBhbHNvPworCQkJKi8KKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhhLCAweDYpOworCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE4LCAweDZmKTsKKwkJfWVsc2V7CisJI2VuZGlmCisJCQkvKiB2ZXIgQyAmIEQgKi8KKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4YSwgMHg5KTsgbWRlbGF5KDEpOworCisJLy93cml0ZV9waHlfb2ZkbShkZXYsIDB4MTgsIDB4ZWYpOworCS8vCX0KKwkvL30KKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4YiwgMHg4MCk7IG1kZWxheSgxKTsKKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhjLCAweDEpO21kZWxheSgxKTsKKworCisJLy9pZihwcml2LT5jYXJkX3R5cGUgIT0gVVNCKQorCS8vd3JpdGVfcGh5X29mZG0oZGV2LCAweGQsIDB4MzMpOyAvLyA8PgorCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweGUsIDB4ZDMpO21kZWxheSgxKTsKKworCisJI2lmIDAKKwlpZihwcml2LT5jYXJkXzgxODUgPT0gMSl7CisJCWlmKHByaXYtPmNhcmRfODE4NV9CdmVyc2lvbikKKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhmLCAweDIwKTsvKnZlciBCKi8KKwkJZWxzZQorCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweGYsIDB4MjgpOy8qdmVyIEMqLworCX1lbHNleworCSNlbmRpZgorCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhmLCAweDM4KTttZGVsYXkoMSk7CisvKnZlciBEICYgODE4NyovCisvLwl9CisKKy8vCWlmKHByaXYtPmNhcmRfODE4NSA9PSAxICYmIHByaXYtPmNhcmRfODE4NV9CdmVyc2lvbikKKy8vCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTAsIDB4MDQpOy8qdmVyIEIqLworLy8JZWxzZQorCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxMCwgMHg4NCk7bWRlbGF5KDEpOworLyp2ZXIgQyAmIEQgJiA4MTg3Ki8KKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxMSwgMHgwNik7bWRlbGF5KDEpOworLyphZ2MgcmVzcCB0aW1lIDcwMCovCisKKworLy8JaWYocHJpdi0+Y2FyZF84MTg1ID09IDIpeworCS8qIFZlciBEICYgODE4NyovCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDEyLCAweDIwKTttZGVsYXkoMSk7CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTMsIDB4MjApO21kZWxheSgxKTsKKworI2lmIDAKKwl9ZWxzZXsKKwkJLyogVmVyIEIgJiBDKi8KKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDEyLCAweDApOworCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTMsIDB4MCk7CisJfQorI2VuZGlmCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE0LCAweDApOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE1LCAweDQwKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNiwgMHgwKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNywgMHg0MCk7IG1kZWxheSgxKTsKKworLy8JaWYgKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpCisvLwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE4LCAweGVmKTsKKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxOCwgMHhlZik7bWRlbGF5KDEpOworCisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTksIDB4MTkpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDFhLCAweDIwKTsgbWRlbGF5KDEpOworCisvLwlpZiAocHJpdi0+Y2FyZF90eXBlICE9IFVTQil7CisvLwkJaWYocHJpdi0+Y2FyZF84MTg1ID09IDEgJiYgcHJpdi0+Y2FyZF84MTg1X0J2ZXJzaW9uKQorLy8JCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWIsIDB4NjYpOyAvKiBWZXIgQiAqLworLy8JCWVsc2UKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWIsIDB4NzYpO21kZWxheSgxKTsKKyAvKiBWZXIgQyAmIEQgKi8gLy9GSVhNRTpNQVlCRSBub3QgbmVlZGVkCisvLwl9CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWMsIDB4NCk7bWRlbGF5KDEpOworCisjaWYgMAorCWlmKHByaXYtPmNhcmRfODE4NSA9PSAxKXsKKwkJaWYocHJpdi0+Y2FyZF84MTg1X0J2ZXJzaW9uKXsKKwkJCS8qdmVyIEIqLworCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDFlLCAweDk1KTsKKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxZiwgMHg1NSk7CisJCX1lbHNleworCQkJLyp2ZXIgQyovCisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWUsIDB4OTApOworCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDFmLCAweDM0KTsKKworCQl9CisJfWVsc2V7CisjZW5kaWYKKwkJLyp2ZXIgRCAmIDgxODcqLworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxZSwgMHg5NSk7bWRlbGF5KDEpOworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDFmLCAweDc1KTsJbWRlbGF5KDEpOworCisvLwl9CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjAsIDB4MWYpO21kZWxheSgxKTsKKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyMSwgMHgyNyk7bWRlbGF5KDEpOworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDIyLCAweDE2KTttZGVsYXkoMSk7CisKKy8vCWlmKHByaXYtPmNhcmRfdHlwZSAhPSBVU0IpCisJLy93cml0ZV9waHlfb2ZkbShkZXYsIDB4MjMsIDB4NDMpOyAvL0ZJWE1FIG1heWJlIG5vdCBuZWVkZWQgLy8gPD4KKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNCwgMHg0Nik7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjUsIDB4MjApOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI2LCAweDkwKTsgbWRlbGF5KDEpOworI2lmIDAKKwlpZihwcml2LT5jYXJkXzgxODUgPT0gMSAmJiBwcml2LT5jYXJkXzgxODVfQnZlcnNpb24pCisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNywgMHgwOCk7IC8qIFZlciBCLiBtaWdodCB3b3JrIGFsc28gZm8gdmVyIEMmRCA/Ki8KKwllbHNlCisjZW5kaWYKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjcsIDB4ODgpOyBtZGVsYXkoMSk7CisvKiBWZXIgQyAmIEQgJiA4MTg3Ki8KKworCS8vIDw+IFNldCBpbml0LiBnYWluIHRvIG03NGRCbS4KKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MGQsIDB4NDMpOwkgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxYiwgMHg3Nik7CSBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDFkLCAweGM1KTsJIG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjMsIDB4NzgpOwkgbWRlbGF5KDEpOworCisJLy9pZihwcml2LT5jYXJkX3R5cGUgPT0gVVNCKTsKKwkvLwlydGw4MjI1X3NldF9nYWluX3VzYihkZXYsIDEpOyAvKiBGSVhNRSB0aGlzICcyJyBpcyByYW5kb20gKi8KKworCXdyaXRlX3BoeV9jY2soZGV2LCAweDAsIDB4OTgpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MywgMHgyMCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0LCAweDdlKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDUsIDB4MTIpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NiwgMHhmYyk7IG1kZWxheSgxKTsKKyNpZiAwCisJaWYocHJpdi0+Y2FyZF84MTg1ID09IDEgJiYgcHJpdi0+Y2FyZF84MTg1X0J2ZXJzaW9uKQorCQl3cml0ZV9waHlfY2NrKGRldiwgMHg3LCAweGQ4KTsgLyogVmVyIEIgKi8KKwllbHNlCisjZW5kaWYKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg3LCAweDc4KTttZGVsYXkoMSk7CisgLyogVmVyIEMgJiBEICYgODE4NyovCisKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg4LCAweDJlKTttZGVsYXkoMSk7CisKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgxMCwgKChwcml2LT5jYXJkX3R5cGUgPT0gVVNCKSA/IDB4OWI6IDB4OTMpKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDExLCAweDg4KTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDEyLCAweDQ3KTsgbWRlbGF5KDEpOworI2lmIDAKKwlpZihwcml2LT5jYXJkXzgxODUgPT0gMSAmJiBwcml2LT5jYXJkXzgxODVfQnZlcnNpb24pCisJCXdyaXRlX3BoeV9jY2soZGV2LCAweDEzLCAweDk4KTsgLyogVmVyIEIgKi8KKwllbHNlCisjZW5kaWYKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgxMywgMHhkMCk7IC8qIFZlciBDICYgRCAmIDgxODcqLworCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTksIDB4MCk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MWEsIDB4YTApOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDFiLCAweDgpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQwLCAweDg2KTsgLyogQ0NLIENhcnJpZXIgU2Vuc2UgVGhyZXNob2xkICovCisKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0MSwgMHg4ZCk7bWRlbGF5KDEpOworCisKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0MiwgMHgxNSk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0MywgMHgxOCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0NCwgMHgxZik7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0NSwgMHgxZSk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0NiwgMHgxYSk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0NywgMHgxNSk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0OCwgMHgxMCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0OSwgMHhhKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDRhLCAweDUpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NGIsIDB4Mik7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0YywgMHg1KTttZGVsYXkoMSk7CisKKworCXdyaXRlX25pY19ieXRlKGRldiwgMHg1YiwgMHgwZCk7IG1kZWxheSgxKTsKKworCisKKy8vIDw+CisvLwkvLyBURVNUUiAweGIgODE4NworLy8Jd3JpdGVfcGh5X2NjayhkZXYsIDB4MTAsIDB4OTMpOy8vICYgMHhmYik7CisvLworLy8JLy9pZihwcml2LT5jYXJkX3R5cGUgIT0gVVNCKXsKKy8vCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MiwgMHg2Mik7CisvLwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDYsIDB4MCk7CisvLwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDgsIDB4MCk7CisvLwkvL30KKworCXJ0bDgyMjVfU2V0VFhQb3dlckxldmVsKGRldiwgY2hhbm5lbCk7CisKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgxMCwgMHg5Yik7IG1kZWxheSgxKTsgLyogUnggYW50IEEsIDB4ZGIgZm9yIEIgKi8KKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjYsIDB4OTApOyBtZGVsYXkoMSk7IC8qIFJ4IGFudCBBLCAweDEwIGZvciBCICovCisKKwlydGw4MTg1X3R4X2FudGVubmEoZGV2LCAweDMpOyAvKiBUWCBhbnQgQSwgMHgwIGZvciBCICovCisKKwkvKiBzd2l0Y2ggdG8gaGlnaC1zcGVlZCAzLXdpcmUKKwkgKiBsYXN0IGRpZ2l0LiAyIGZvciBib3RoIGNjayBhbmQgb2ZkbQorCSAqLworCWlmKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpCisJCXdyaXRlX25pY19kd29yZChkZXYsIDB4OTQsIDB4M2RjMDAwMDIpOworCWVsc2V7CisJCXdyaXRlX25pY19kd29yZChkZXYsIDB4OTQsIDB4MTVjMDAwMDIpOworCQlydGw4MTg1X3JmX3BpbnNfZW5hYmxlKGRldik7CisJfQorCisvLwlpZihwcml2LT5jYXJkX3R5cGUgIT0gVVNCKQorLy8JcnRsODIyNV9zZXRfZ2FpbihkZXYsIDQpOyAvKiBGSVhNRSB0aGlzICcxJyBpcyByYW5kb20gKi8gLy8gPD4KKy8vCSBydGw4MjI1X3NldF9tb2RlKGRldiwgMSk7IC8qIEZJWE1FIHN0YXJ0IGluIEIgbW9kZSAqLyAvLyA8PgorLy8KKy8vCS8qIG1ha2Ugc3VyZSBpcyB3YWtlbiB1cCEgKi8KKy8vCXdyaXRlX3J0bDgyMjUoZGV2LDB4NCwgMHg5ZmYpOworLy8JcnRsODE4MF9zZXRfYW5hcGFyYW0oZGV2LCBSVEw4MjI1X0FOQVBBUkFNX09OKTsKKy8vCXJ0bDgxODVfc2V0X2FuYXBhcmFtMihkZXYsIFJUTDgyMjVfQU5BUEFSQU0yX09OKTsKKworCXJ0bDgyMjVfcmZfc2V0X2NoYW4oZGV2LCBwcml2LT5jaGFuKTsKKworCXdyaXRlX25pY193b3JkKGRldixCUlNSLGJyc3IpOworCit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3J0bDgyMjUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODIyNS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1OGRlNjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3J0bDgyMjUuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICBUaGlzIGlzIHBhcnQgb2YgdGhlIHJ0bDgxODAtc2EyNDAwIGRyaXZlcgorICByZWxlYXNlZCB1bmRlciB0aGUgR1BMIChTZWUgZmlsZSBDT1BZSU5HIGZvciBkZXRhaWxzKS4KKyAgQ29weXJpZ2h0IChjKSAyMDA1IEFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKworICBUaGlzIGZpbGVzIGNvbnRhaW5zIHByb2dyYW1taW5nIGNvZGUgZm9yIHRoZSBydGw4MjI1CisgIHJhZGlvIGZyb250ZW5kLgorCisgICpNYW55KiB0aGFua3MgdG8gUmVhbHRlayBDb3JwLiBmb3IgdGhlaXIgZ3JlYXQgc3VwcG9ydCEKKworKi8KKworI2luY2x1ZGUgInI4MTgwLmgiCisKKyNkZWZpbmUgUlRMODIyNV9BTkFQQVJBTV9PTiAgMHhhMDAwMGI1OQorI2RlZmluZSBSVEw4MjI1X0FOQVBBUkFNX09GRiAweGEwMGJlYjU5CisjZGVmaW5lIFJUTDgyMjVfQU5BUEFSQU0yX09GRiAweDg0MGRlYzExCisjZGVmaW5lIFJUTDgyMjVfQU5BUEFSQU0yX09OICAweDg2MGRlYzExCisjZGVmaW5lIFJUTDgyMjVfQU5BUEFSQU1fU0xFRVAgMHhhMDBiYWI1OQorI2RlZmluZSBSVEw4MjI1X0FOQVBBUkFNMl9TTEVFUCAweDg0MGRlYzExCisKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKK3ZvaWQgcnRsODIyNXoyX3JmX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgyMjV6Ml9yZl9zZXRfY2hhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHNob3J0IGNoKTsKK3ZvaWQgcnRsODIyNXoyX3JmX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCit2b2lkIHJ0bDgyMjVfaG9zdF9wY2lfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODIyNV9ob3N0X3VzYl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCit2b2lkIHdyaXRlX3J0bDgyMjUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRyLCB1MTYgZGF0YSk7Cit2b2lkIFJGX1dyaXRlUmVnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IG9mZnNldCwgdTMyCWRhdGEpOwordTMyIFJGX1JlYWRSZWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggb2Zmc2V0KTsKKyNlbmRpZgordm9pZCBydGw4MjI1X3JmX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgyMjVfcmZfc2V0X2NoYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldixzaG9ydCBjaCk7Cit2b2lkIHJ0bDgyMjVfcmZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgyMjVfcmZfc2xlZXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgyMjVfcmZfd2FrZXVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MTgwX3NldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsaW50IG1vZGUpOwordm9pZCBydGw4MTgwX3NldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsaW50IG1vZGUpOworYm9vbCBTZXRaZWJyYVJGUG93ZXJTdGF0ZTgxODUoc3RydWN0IG5ldF9kZXZpY2UgKmRldixSVF9SRl9QT1dFUl9TVEFURSAgZVJGUG93ZXJTdGF0ZSk7Cit2b2lkIHJ0bDgyMjV6NF9yZl9zbGVlcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODIyNXo0X3JmX3dha2V1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9ydGw4MjI1ejIuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODIyNXoyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEzNmI5NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODIyNXoyLmMKQEAgLTAsMCArMSwxNTg3IEBACisvKgorICBUaGlzIGlzIHBhcnQgb2YgdGhlIHJ0bDgxODAtc2EyNDAwIGRyaXZlcgorICByZWxlYXNlZCB1bmRlciB0aGUgR1BMIChTZWUgZmlsZSBDT1BZSU5HIGZvciBkZXRhaWxzKS4KKyAgQ29weXJpZ2h0IChjKSAyMDA1IEFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKworICBUaGlzIGZpbGVzIGNvbnRhaW5zIHByb2dyYW1taW5nIGNvZGUgZm9yIHRoZSBydGw4MjI1CisgIHJhZGlvIGZyb250ZW5kLgorCisgICpNYW55KiB0aGFua3MgdG8gUmVhbHRlayBDb3JwLiBmb3IgdGhlaXIgZ3JlYXQgc3VwcG9ydCEKKworKi8KKworI2luY2x1ZGUgInI4MTgwX2h3LmgiCisjaW5jbHVkZSAicjgxODBfcnRsODIyNS5oIgorI2luY2x1ZGUgInI4MTgwXzkzY3g2LmgiCisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisjaW5jbHVkZSAiZG90MTFkLmgiCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19SVEw4MTg1QgorCitleHRlcm4gdTggcnRsODIyNV9hZ2NbXTsKKworZXh0ZXJuIHUzMiBydGw4MjI1X2NoYW5bXTsKKworLy8yMDA1LjExLjE2Cit1OCBydGw4MjI1ejJfdGhyZXNob2xkW109eworICAgICAgICAweDhkLCAweDhkLCAweDhkLCAweDhkLCAweDlkLCAweGFkLCAweGJkLAorfTsKKworLy8gICAgICAweGQgMHgxOSAweDFiIDB4MjEKK3U4IHJ0bDgyMjV6Ml9nYWluX2JnW109eworCTB4MjMsIDB4MTUsIDB4YTUsIC8vIC04Mi0xZGJtCisgICAgICAgIDB4MjMsIDB4MTUsIDB4YjUsIC8vIC04Mi0yZGJtCisgICAgICAgIDB4MjMsIDB4MTUsIDB4YzUsIC8vIC04Mi0zZGJtCisgICAgICAgIDB4MzMsIDB4MTUsIDB4YzUsIC8vIC03OGRibQorICAgICAgICAweDQzLCAweDE1LCAweGM1LCAvLyAtNzRkYm0KKyAgICAgICAgMHg1MywgMHgxNSwgMHhjNSwgLy8gLTcwZGJtCisgICAgICAgIDB4NjMsIDB4MTUsIDB4YzUsIC8vIC02NmRibQorfTsKKwordTggcnRsODIyNXoyX2dhaW5fYVtdPXsKKwkweDEzLDB4MjcsMHg1YSwvLywweDM3LC8vIC04MmRibQorCTB4MjMsMHgyMywweDU4LC8vLDB4MzcsLy8gLTgyZGJtCisJMHgzMywweDFmLDB4NTYsLy8sMHgzNywvLyAtODJkYm0KKwkweDQzLDB4MWIsMHg1NCwvLywweDM3LC8vIC03OGRibQorCTB4NTMsMHgxNywweDUxLC8vLDB4MzcsLy8gLTc0ZGJtCisJMHg2MywweDI0LDB4NGYsLy8sMHgzNywvLyAtNzBkYm0KKwkweDczLDB4MGYsMHg0YywvLywweDM3LC8vIC02NmRibQorfTsKKyNpZiAwCit1MzIgcnRsODIyNV9jaGFuW10gPSB7CisJMCwJLy9kdW1teSBjaGFubmVsIDAKKwkweDA4NWMsIC8vMQorCTB4MDhkYywgLy8yCisJMHgwOTVjLCAvLzMKKwkweDA5ZGMsIC8vNAorCTB4MGE1YywgLy81CisJMHgwYWRjLCAvLzYKKwkweDBiNWMsIC8vNworCTB4MGJkYywgLy84CisJMHgwYzVjLCAvLzkKKwkweDBjZGMsIC8vMTAKKwkweDBkNWMsIC8vMTEKKwkweDBkZGMsIC8vMTIKKwkweDBlNWMsIC8vMTMKKwkvLzB4MGY1YywgLy8xNAorCTB4MGY3MiwgLy8gMTQKK307CisjZW5kaWYKKworLy8tCit1MTYgcnRsODIyNXoyX3J4Z2FpbltdPXsKKwkweDA0MDAsIDB4MDQwMSwgMHgwNDAyLCAweDA0MDMsIDB4MDQwNCwgMHgwNDA1LCAweDA0MDgsIDB4MDQwOSwKKwkweDA0MGEsIDB4MDQwYiwgMHgwNTAyLCAweDA1MDMsIDB4MDUwNCwgMHgwNTA1LCAweDA1NDAsIDB4MDU0MSwKKwkweDA1NDIsIDB4MDU0MywgMHgwNTQ0LCAweDA1NDUsIDB4MDU4MCwgMHgwNTgxLCAweDA1ODIsIDB4MDU4MywKKwkweDA1ODQsIDB4MDU4NSwgMHgwNTg4LCAweDA1ODksIDB4MDU4YSwgMHgwNThiLCAweDA2NDMsIDB4MDY0NCwKKwkweDA2NDUsIDB4MDY4MCwgMHgwNjgxLCAweDA2ODIsIDB4MDY4MywgMHgwNjg0LCAweDA2ODUsIDB4MDY4OCwKKwkweDA2ODksIDB4MDY4YSwgMHgwNjhiLCAweDA2OGMsIDB4MDc0MiwgMHgwNzQzLCAweDA3NDQsIDB4MDc0NSwKKwkweDA3ODAsIDB4MDc4MSwgMHgwNzgyLCAweDA3ODMsIDB4MDc4NCwgMHgwNzg1LCAweDA3ODgsIDB4MDc4OSwKKwkweDA3OGEsIDB4MDc4YiwgMHgwNzhjLCAweDA3OGQsIDB4MDc5MCwgMHgwNzkxLCAweDA3OTIsIDB4MDc5MywKKwkweDA3OTQsIDB4MDc5NSwgMHgwNzk4LCAweDA3OTksIDB4MDc5YSwgMHgwNzliLCAweDA3OWMsIDB4MDc5ZCwKKwkweDA3YTAsIDB4MDdhMSwgMHgwN2EyLCAweDA3YTMsIDB4MDdhNCwgMHgwN2E1LCAweDA3YTgsIDB4MDdhOSwKKwkweDAzYWEsIDB4MDNhYiwgMHgwM2FjLCAweDAzYWQsIDB4MDNiMCwgMHgwM2IxLCAweDAzYjIsIDB4MDNiMywKKwkweDAzYjQsIDB4MDNiNSwgMHgwM2I4LCAweDAzYjksIDB4MDNiYSwgMHgwM2JiLCAweDAzYmIKKworfTsKKworLy8yMDA1LjExLjE2LAordTggWkVCUkEyX0NDS19PRkRNX0dBSU5fU0VUVElOR1tdPXsKKyAgICAgICAgMHgwMCwweDAxLDB4MDIsMHgwMywweDA0LDB4MDUsCisgICAgICAgIDB4MDYsMHgwNywweDA4LDB4MDksMHgwYSwweDBiLAorICAgICAgICAweDBjLDB4MGQsMHgwZSwweDBmLDB4MTAsMHgxMSwKKyAgICAgICAgMHgxMiwweDEzLDB4MTQsMHgxNSwweDE2LDB4MTcsCisgICAgICAgIDB4MTgsMHgxOSwweDFhLDB4MWIsMHgxYywweDFkLAorICAgICAgICAweDFlLDB4MWYsMHgyMCwweDIxLDB4MjIsMHgyMywKK307CisKKyNpZiAwCisvLy0KK3U4IHJ0bDgyMjVfYWdjW109eworCTB4OWUsMHg5ZSwweDllLDB4OWUsMHg5ZSwweDllLDB4OWUsMHg5ZSwweDlkLDB4OWMsMHg5YiwweDlhLDB4OTksMHg5OCwweDk3LDB4OTYsCisJMHg5NSwweDk0LDB4OTMsMHg5MiwweDkxLDB4OTAsMHg4ZiwweDhlLDB4OGQsMHg4YywweDhiLDB4OGEsMHg4OSwweDg4LDB4ODcsMHg4NiwKKwkweDg1LDB4ODQsMHg4MywweDgyLDB4ODEsMHg4MCwweDNmLDB4M2UsMHgzZCwweDNjLDB4M2IsMHgzYSwweDM5LDB4MzgsMHgzNywweDM2LAorCTB4MzUsMHgzNCwweDMzLDB4MzIsMHgzMSwweDMwLDB4MmYsMHgyZSwweDJkLDB4MmMsMHgyYiwweDJhLDB4MjksMHgyOCwweDI3LDB4MjYsCisJMHgyNSwweDI0LDB4MjMsMHgyMiwweDIxLDB4MjAsMHgxZiwweDFlLDB4MWQsMHgxYywweDFiLDB4MWEsMHgxOSwweDE4LDB4MTcsMHgxNiwKKwkweDE1LDB4MTQsMHgxMywweDEyLDB4MTEsMHgxMCwweDBmLDB4MGUsMHgwZCwweDBjLDB4MGIsMHgwYSwweDA5LDB4MDgsMHgwNywweDA2LAorCTB4MDUsMHgwNCwweDAzLDB4MDIsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsCisJMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwKK307CisjZW5kaWYKKy8qCisgZnJvbSAwIHRvIDB4MjMKK3U4IHJ0bDgyMjVfdHhfZ2Fpbl9jY2tfb2ZkbVtdPXsKKwkweDAyLDB4MDYsMHgwZSwweDFlLDB4M2UsMHg3ZQorfTsKKyovCisKKy8vLQordTggcnRsODIyNXoyX3R4X3Bvd2VyX29mZG1bXT17CisJMHg0MiwweDAwLDB4NDAsMHgwMCwweDQwCit9OworCisKKy8vLQordTggcnRsODIyNXoyX3R4X3Bvd2VyX2Nja19jaDE0W109eworCTB4MzYsMHgzNSwweDJlLDB4MWIsMHgwMCwweDAwLDB4MDAsMHgwMAorfTsKKworCisvLy0KK3U4IHJ0bDgyMjV6Ml90eF9wb3dlcl9jY2tbXT17CisJMHgzNiwweDM1LDB4MmUsMHgyNSwweDFjLDB4MTIsMHgwOSwweDA0Cit9OworCisKK3ZvaWQgcnRsODIyNXoyX3NldF9nYWluKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IGdhaW4pCit7CisJdTgqIHJ0bDgyMjVfZ2FpbjsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwl1OCBtb2RlID0gcHJpdi0+aWVlZTgwMjExLT5tb2RlOworCisJaWYobW9kZSA9PSBJRUVFX0IgfHwgbW9kZSA9PSBJRUVFX0cpCisJCXJ0bDgyMjVfZ2FpbiA9IHJ0bDgyMjV6Ml9nYWluX2JnOworCWVsc2UKKwkJcnRsODIyNV9nYWluID0gcnRsODIyNXoyX2dhaW5fYTsKKworCS8vd3JpdGVfcGh5X29mZG0oZGV2LCAweDBkLCBydGw4MjI1X2dhaW5bZ2FpbiAqIDNdKTsKKwkvL3dyaXRlX3BoeV9vZmRtKGRldiwgMHgxOSwgcnRsODIyNV9nYWluW2dhaW4gKiAzICsgMV0pOworCS8vd3JpdGVfcGh5X29mZG0oZGV2LCAweDFiLCBydGw4MjI1X2dhaW5bZ2FpbiAqIDMgKyAyXSk7CisgICAgICAgIC8vMjAwNS4xMS4xNywgYnkgY2gtaHN1CisgICAgICAgIHdyaXRlX3BoeV9vZmRtKGRldiwgMHgwYiwgcnRsODIyNV9nYWluW2dhaW4gKiAzXSk7CisgICAgICAgIHdyaXRlX3BoeV9vZmRtKGRldiwgMHgxYiwgcnRsODIyNV9nYWluW2dhaW4gKiAzICsgMV0pOworICAgICAgICB3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWQsIHJ0bDgyMjVfZ2FpbltnYWluICogMyArIDJdKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjEsIDB4MzcpOworCit9CisKKyNpZiAwCisKK3ZvaWQgcnRsODIyNV9zZXRfZ2FpbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBnYWluKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXJ0bDgxODBfc2V0X2FuYXBhcmFtKGRldiwgUlRMODIyNV9BTkFQQVJBTV9PTik7CisKKwlpZihwcml2LT5jYXJkXzgxODUgPT0gMikKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDIxLCAweDI3KTsKKwllbHNlCisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyMSwgMHgzNyk7CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjUsIDB4MjApOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxMSwgMHg2KTsKKworCWlmKHByaXYtPmNhcmRfODE4NSA9PSAxICYmIHByaXYtPmNhcmRfODE4NV9CdmVyc2lvbikKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI3LCAweDgpOworCWVsc2UKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI3LCAweDg4KTsKKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNCwgMCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE2LCAwKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTUsIDB4NDApOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNywgMHg0MCk7CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MGQsIHJ0bDgyMjVfZ2FpbltnYWluICogNF0pOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyMywgcnRsODIyNV9nYWluW2dhaW4gKiA0ICsgMV0pOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxYiwgcnRsODIyNV9nYWluW2dhaW4gKiA0ICsgMl0pOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxZCwgcnRsODIyNV9nYWluW2dhaW4gKiA0ICsgM10pOworCS8vcnRsODIyNV9zZXRfZ2Fpbl91c2IoZGV2LCBnYWluKTsKK30KKyNlbmRpZgorCit1MzIgcmVhZF9ydGw4MjI1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkcikKK3sKKwl1MzIgZGF0YTJXcml0ZSA9ICgodTMyKShhZHIgJiAweDFmKSkgPDwgMjc7CisJdTMyIGRhdGFSZWFkOworCXUzMiBtYXNrOworCXUxNiBvdmFsLG92YWwyLG92YWwzLHRtcDsKKy8vCVRocmVlV2lyZVJlZyB0d3JlZzsKKy8vCVRocmVlV2lyZVJlZyB0ZGF0YTsKKwlpbnQgaTsKKwlzaG9ydCBiaXQsIHJ3OworCisJdTggd0xlbmd0aCA9IDY7CisJdTggckxlbmd0aCA9IDEyOworCXU4IGxvdzJoaWdoID0gMDsKKworCW92YWwgPSByZWFkX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0KTsKKwlvdmFsMiA9IHJlYWRfbmljX3dvcmQoZGV2LCBSRlBpbnNFbmFibGUpOworCW92YWwzID0gcmVhZF9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCk7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc0VuYWJsZSwgKG92YWwyfDB4ZikpOworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0LCAob3ZhbDN8MHhmKSk7CisKKwlkYXRhUmVhZCA9IDA7CisKKwlvdmFsICY9IH4weGY7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgb3ZhbCB8IEJCX0hPU1RfQkFOR19FTiApOyB1ZGVsYXkoNCk7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgb3ZhbCApOyB1ZGVsYXkoNSk7CisKKwlydyA9IDA7CisKKwltYXNrID0gKGxvdzJoaWdoKSA/IDB4MDEgOiAoKCh1MzIpMHgwMSk8PCgzMi0xKSk7CisJZm9yKGkgPSAwOyBpIDwgd0xlbmd0aC8yOyBpKyspCisJeworCQliaXQgPSAoKGRhdGEyV3JpdGUmbWFzaykgIT0gMCkgPyAxIDogMDsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIGJpdHxvdmFsIHwgcncpOyB1ZGVsYXkoMSk7CisKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIGJpdHxvdmFsIHwgQkJfSE9TVF9CQU5HX0NMSyB8IHJ3KTsgdWRlbGF5KDIpOworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0fG92YWwgfCBCQl9IT1NUX0JBTkdfQ0xLIHwgcncpOyB1ZGVsYXkoMik7CisKKwkJbWFzayA9IChsb3cyaGlnaCkgPyAobWFzazw8MSk6IChtYXNrPj4xKTsKKworCQlpZihpID09IDIpCisJCXsKKwkJCXJ3ID0gQkJfSE9TVF9CQU5HX1JXOworCQkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIGJpdHxvdmFsIHwgQkJfSE9TVF9CQU5HX0NMSyB8IHJ3KTsgdWRlbGF5KDIpOworCQkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIGJpdHxvdmFsIHwgcncpOyB1ZGVsYXkoMik7CisJCQlicmVhazsKKwkJfQorCisJCWJpdCA9ICgoZGF0YTJXcml0ZSZtYXNrKSAhPSAwKSA/IDE6IDA7CisKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIG92YWx8Yml0fHJ3fCBCQl9IT1NUX0JBTkdfQ0xLKTsgdWRlbGF5KDIpOworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgb3ZhbHxiaXR8cnd8IEJCX0hPU1RfQkFOR19DTEspOyB1ZGVsYXkoMik7CisKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIG92YWx8IGJpdCB8cncpOyB1ZGVsYXkoMSk7CisKKwkJbWFzayA9IChsb3cyaGlnaCkgPyAobWFzazw8MSkgOiAobWFzaz4+MSk7CisJfQorCisJLy90d3JlZy5zdHJ1Yy5jbGsgPSAwOworCS8vdHdyZWcuc3RydWMuZGF0YSA9IDA7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIHJ3fG92YWwpOyB1ZGVsYXkoMik7CisJbWFzayA9IChsb3cyaGlnaCkgPyAweDAxIDogKCgodTMyKTB4MDEpIDw8ICgxMi0xKSk7CisKKwkvLyBXZSBtdXN0IHNldCBkYXRhIHBpbiB0byBIVyBjb250cm9sZWQsIG90aGVyd2lzZSBSRiBjYW4ndCBkcml2ZXIgaXQgYW5kCisJLy8gdmFsdWUgUkYgcmVnaXN0ZXIgd29uJ3QgYmUgYWJsZSB0byByZWFkIGJhY2sgcHJvcGVybHkuIDIwMDYuMDYuMTMsIGJ5IHJjbmprby4KKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc0VuYWJsZSwgKG92YWwyICYgKH4weDAxKSkpOworCisJZm9yKGkgPSAwOyBpIDwgckxlbmd0aDsgaSsrKQorCXsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIHJ3fG92YWwpOyB1ZGVsYXkoMSk7CisKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIHJ3fG92YWx8QkJfSE9TVF9CQU5HX0NMSyk7IHVkZWxheSgyKTsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIHJ3fG92YWx8QkJfSE9TVF9CQU5HX0NMSyk7IHVkZWxheSgyKTsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIHJ3fG92YWx8QkJfSE9TVF9CQU5HX0NMSyk7IHVkZWxheSgyKTsKKwkJdG1wID0gcmVhZF9uaWNfd29yZChkZXYsIFJGUGluc0lucHV0KTsKKworCQlkYXRhUmVhZCB8PSAodG1wICYgQkJfSE9TVF9CQU5HX0NMSyA/IG1hc2sgOiAwKTsKKworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgKHJ3fG92YWwpKTsgdWRlbGF5KDIpOworCisJCW1hc2sgPSAobG93MmhpZ2gpID8gKG1hc2s8PDEpIDogKG1hc2s+PjEpOworCX0KKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBCQl9IT1NUX0JBTkdfRU58QkJfSE9TVF9CQU5HX1JXfG92YWwpOyB1ZGVsYXkoMik7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc0VuYWJsZSwgb3ZhbDIpOworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0LCBvdmFsMyk7ICAgLy8gU2V0IFRvIFNXIFN3aXRjaAorCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCAweDNhMCk7CisKKwlyZXR1cm4gZGF0YVJlYWQ7CisKK30KKyNpZiAwCit2b2lkIHdyaXRlX3J0bDgyMjUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRyLCB1MTYgZGF0YSkKK3sKKwlpbnQgaTsKKwl1MTYgb3V0LHNlbGVjdDsKKwl1OCBiaXQ7CisJdTMyIGJhbmdkYXRhID0gKGRhdGEgPDwgNCkgfCAoYWRyICYgMHhmKTsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlvdXQgPSByZWFkX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0KSAmIDB4ZmZmMzsKKworCXdyaXRlX25pY193b3JkKGRldixSRlBpbnNFbmFibGUsCisJCShyZWFkX25pY193b3JkKGRldixSRlBpbnNFbmFibGUpIHwgMHg3KSk7CisKKwlzZWxlY3QgPSByZWFkX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0KTsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0LCBzZWxlY3QgfCAweDcgfAorCQkoKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpID8gMCA6IFNXX0NPTlRST0xfR1BJTykpOworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwl1ZGVsYXkoMTApOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIG91dCB8IEJCX0hPU1RfQkFOR19FTiApOy8vfCAweDFmZmYpOworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwl1ZGVsYXkoMik7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgb3V0KTsKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJdWRlbGF5KDEwKTsKKworCisJZm9yKGk9MTU7IGk+PTA7aS0tKXsKKworCQliaXQgPSAoYmFuZ2RhdGEgJiAoMTw8aSkpID4+IGk7CisKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIGJpdCB8IG91dCk7CisKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIGJpdCB8IG91dCB8IEJCX0hPU1RfQkFOR19DTEspOworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0IHwgb3V0IHwgQkJfSE9TVF9CQU5HX0NMSyk7CisKKwkJaS0tOworCQliaXQgPSAoYmFuZ2RhdGEgJiAoMTw8aSkpID4+IGk7CisKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIGJpdCB8IG91dCB8IEJCX0hPU1RfQkFOR19DTEspOworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0IHwgb3V0IHwgQkJfSE9TVF9CQU5HX0NMSyk7CisKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIGJpdCB8IG91dCk7CisKKwl9CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgb3V0IHwgQkJfSE9TVF9CQU5HX0VOKTsKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJdWRlbGF5KDEwKTsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBvdXQgfAorCQkoKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpID8gNCA6IEJCX0hPU1RfQkFOR19FTikpOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QsIHNlbGVjdCB8CisJCSgocHJpdi0+Y2FyZF90eXBlID09IFVTQikgPyAwIDogU1dfQ09OVFJPTF9HUElPKSk7CisKKwlpZihwcml2LT5jYXJkX3R5cGUgPT0gVVNCKQorCQltZGVsYXkoMik7CisJZWxzZQorCQlydGw4MTg1X3JmX3BpbnNfZW5hYmxlKGRldik7Cit9CisKKyNlbmRpZgorc2hvcnQgcnRsODIyNV9pc19WX3oyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc2hvcnQgdnoyID0gMTsKKwkvL2ludCBpOworCS8qIHN3IHRvIHJlZyBwZyAxICovCisJLy93cml0ZV9ydGw4MjI1KGRldiwgMCwgMHgxYjcpOworCS8vd3JpdGVfcnRsODIyNShkZXYsIDAsIDB4MGI3KTsKKworCS8qIHJlZyA4IHBnIDEgPSAyMyovCisJLy9wcmludGsoS0VSTl9XQVJOSU5HICJSRiBSaWdpc3RlcnM6XG4iKTsKKyNpZiAwCisJZm9yKGkgPSAwOyBpIDw9IDB4ZjsgaSsrKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlMDh4LCIsIHJlYWRfcnRsODIyNShkZXYsIGkpKTsKKwkvL3ByaW50ayhLRVJOX1dBUk5JTkcgInJlZ1s5XUBwZzEgPSAweCV4XG4iLCByZWFkX3J0bDgyMjUoZGV2LCAweDBGKSk7CisKKy8vCXByaW50ayhLRVJOX1dBUk5JTkcgIlJGOlxuIik7CisjZW5kaWYKKwlpZiggcmVhZF9ydGw4MjI1KGRldiwgOCkgIT0gMHg1ODgpCisJCXZ6MiA9IDA7CisKKwllbHNlCS8qIHJlZyA5IHBnIDEgPSAyNCAqLworCQlpZiggcmVhZF9ydGw4MjI1KGRldiwgOSkgIT0gMHg3MDApCisJCQl2ejIgPSAwOworCisJLyogc3cgYmFjayB0byBwZyAwICovCisJd3JpdGVfcnRsODIyNShkZXYsIDAsIDB4YjcpOworCisJcmV0dXJuIHZ6MjsKKworfQorCisjaWYgMAordm9pZCBydGw4MjI1X3JmX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJd3JpdGVfcnRsODIyNShkZXYsIDB4NCwgMHgxZik7CisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCW1kZWxheSgxKTsKKworCXJ0bDgxODBfc2V0X2FuYXBhcmFtKGRldiwgUlRMODIyNV9BTkFQQVJBTV9PRkYpOworCXJ0bDgxODVfc2V0X2FuYXBhcmFtMihkZXYsIFJUTDgyMjVfQU5BUEFSQU0yX09GRik7Cit9CisjZW5kaWYKKyNpZiAwCitzaG9ydCBydGw4MjI1X3JmX3NldF9zZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IHNlbnMpCit7CisJaWYgKHNlbnMgPDAgfHwgc2VucyA+IDYpIHJldHVybiAtMTsKKworCWlmKHNlbnMgPiA0KQorCQl3cml0ZV9ydGw4MjI1KGRldiwgMHgwYywgMHg4NTApOworCWVsc2UKKwkJd3JpdGVfcnRsODIyNShkZXYsIDB4MGMsIDB4NTApOworCisJc2Vucz0gNi1zZW5zOworCXJ0bDgyMjVfc2V0X2dhaW4oZGV2LCBzZW5zKTsKKworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQxLCBydGw4MjI1X3RocmVzaG9sZFtzZW5zXSk7CisJcmV0dXJuIDA7CisKK30KKyNlbmRpZgorCisKK3ZvaWQgcnRsODIyNXoyX3JmX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJUkZfV3JpdGVSZWcoZGV2LCAweDQsIDB4MWYpOworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwltZGVsYXkoMSk7CisKKwlydGw4MTgwX3NldF9hbmFwYXJhbShkZXYsIFJUTDgyMjV6Ml9BTkFQQVJBTV9PRkYpOworCXJ0bDgxODVfc2V0X2FuYXBhcmFtMihkZXYsIFJUTDgyMjV6Ml9BTkFQQVJBTTJfT0ZGKTsKK30KKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKy8vCisvLwlEZXNjcmlwdGlvbjoKKy8vCQlNYXAgZEJtIGludG8gVHggcG93ZXIgaW5kZXggYWNjb3JkaW5nIHRvCisvLwkJY3VycmVudCBIVyBtb2RlbCwgZm9yIGV4YW1wbGUsIFJGIGFuZCBQQSwgYW5kCisvLwkJY3VycmVudCB3aXJlbGVzcyBtb2RlLgorLy8KK3M4CitEYm1Ub1R4UHdySWR4KAorCXN0cnVjdCByODE4MF9wcml2ICpwcml2LAorCVdJUkVMRVNTX01PREUJV2lyZWxlc3NNb2RlLAorCXMzMgkJCVBvd2VySW5EYm0KKwkpCit7CisgCWJvb2wgYlVzZURlZmF1bHQgPSB0cnVlOworCXM4IFR4UHdySWR4ID0gMDsKKworI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKwkvLworCS8vIDA3MTAxMSwgU0QzIFNZOgorCS8vIE9GRE0gUG93ZXIgaW4gZEJtID0gSW5kZXggKiAwLjUgKyAwCisJLy8gQ0NLIFBvd2VyIGluIGRCbSA9IEluZGV4ICogMC4yNSArIDEzCisJLy8KKwlpZihwcml2LT5jYXJkXzgxODUgPj0gVkVSU0lPTl84MTg3U19CKQorCXsKKwkJczMyIHRtcCA9IDA7CisKKwkJaWYoV2lyZWxlc3NNb2RlID09IFdJUkVMRVNTX01PREVfRykKKwkJeworCQkJYlVzZURlZmF1bHQgPSBmYWxzZTsKKwkJCXRtcCA9ICgyICogUG93ZXJJbkRibSk7CisKKwkJCWlmKHRtcCA8IDApCisJCQkJVHhQd3JJZHggPSAwOworCQkJZWxzZSBpZih0bXAgPiA0MCkgLy8gNDAgbWVhbnMgMjAgZEJtLgorCQkJCVR4UHdySWR4ID0gNDA7CisJCQllbHNlCisJCQkJVHhQd3JJZHggPSAoczgpdG1wOworCQl9CisJCWVsc2UgaWYoV2lyZWxlc3NNb2RlID09IFdJUkVMRVNTX01PREVfQikKKwkJeworCQkJYlVzZURlZmF1bHQgPSBmYWxzZTsKKwkJCXRtcCA9ICg0ICogUG93ZXJJbkRibSkgLSA1MjsKKworCQkJaWYodG1wIDwgMCkKKwkJCQlUeFB3cklkeCA9IDA7CisJCQllbHNlIGlmKHRtcCA+IDI4KSAvLyAyOCBtZWFucyAyMCBkQm0uCisJCQkJVHhQd3JJZHggPSAyODsKKwkJCWVsc2UKKwkJCQlUeFB3cklkeCA9IChzOCl0bXA7CisJCX0KKwl9CisjZW5kaWYKKworCS8vCisJLy8gVFJVRSBpZiB3ZSB3YW50IHRvIHVzZSBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24uCisJLy8gV2Ugc2hhbGwgc2V0IGl0IHRvIEZBTFNFIHdoZW4gd2UgaGF2ZSBleGFjdCB0cmFuc2xhdGlvbiBmb3JtdWxhcgorCS8vIGZvciB0YXJnZXQgSUMuIDA3MDYyMiwgYnkgcmNuamtvLgorCS8vCisJaWYoYlVzZURlZmF1bHQpCisJeworCQlpZihQb3dlckluRGJtIDwgMCkKKwkJCVR4UHdySWR4ID0gMDsKKwkJZWxzZSBpZihQb3dlckluRGJtID4gMzUpCisJCQlUeFB3cklkeCA9IDM1OworCQllbHNlCisJCQlUeFB3cklkeCA9ICh1OClQb3dlckluRGJtOworCX0KKworCXJldHVybiBUeFB3cklkeDsKK30KKyNlbmRpZgorCit2b2lkIHJ0bDgyMjV6Ml9TZXRUWFBvd2VyTGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgY2gpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisvLwlpbnQgR2FpbklkeDsKKy8vCWludCBHYWluU2V0dGluZzsKKwkvL2ludCBpOworCS8vdTggcG93ZXI7CisJLy91OCAqY2NrX3Bvd2VyX3RhYmxlOworCXU4IG1heF9jY2tfcG93ZXJfbGV2ZWw7CisJLy91OCBtaW5fY2NrX3Bvd2VyX2xldmVsOworCXU4IG1heF9vZmRtX3Bvd2VyX2xldmVsOworCXU4IG1pbl9vZmRtX3Bvd2VyX2xldmVsOworLy8JdTggY2NrX3Bvd2VyX2xldmVsID0gMHhmZiAmIHByaXYtPmNodHhwd3JbY2hdOy8vLWJ5IGFteSAwODAzMTIKKy8vCXU4IG9mZG1fcG93ZXJfbGV2ZWwgPSAweGZmICYgcHJpdi0+Y2h0eHB3cl9vZmRtW2NoXTsvLy1ieSBhbXkgMDgwMzEyCisJY2hhciBjY2tfcG93ZXJfbGV2ZWwgPSAoY2hhcikoMHhmZiAmIHByaXYtPmNodHhwd3JbY2hdKTsvLytieSBhbXkgMDgwMzEyCisJY2hhciBvZmRtX3Bvd2VyX2xldmVsID0gKGNoYXIpKDB4ZmYgJiBwcml2LT5jaHR4cHdyX29mZG1bY2hdKTsvLytieSBhbXkgMDgwMzEyCisjaWYgMAorCS8vCisJLy8gQ0NYIDIgUzMxLCBBUCBjb250cm9sIG9mIGNsaWVudCB0cmFuc21pdCBwb3dlcjoKKwkvLyAxLiBXZSBzaGFsbCBub3QgZXhjZWVkIENlbGwgUG93ZXIgTGltaXQgYXMgcG9zc2libGUgYXMgd2UgY2FuLgorCS8vIDIuIFRvbGVyYW5jZSBpcyArLy0gNWRCLgorCS8vIDMuIDgwMi4xMWggUG93ZXIgQ29udHJhaW50IHRha2VzIGhpZ2hlciBwcmVjZWRlbmNlIG92ZXIgQ0NYIENlbGwgUG93ZXIgTGltaXQuCisJLy8KKwkvLyBUT0RPOgorCS8vIDEuIDgwMi4xMWggcG93ZXIgY29udHJhaW50CisJLy8KKwkvLyAwNzEwMTEsIGJ5IHJjbmprby4KKwkvLworCWlmKAlwcml2LT5PcE1vZGUgPT0gUlRfT1BfTU9ERV9JTkZSQVNUUlVDVFVSRSAmJgorCQlwcml2LT5iV2l0aENjeENlbGxQd3IgJiYKKwkJY2ggPT0gcHJpdi0+ZG90MTFDdXJyZW50Q2hhbm5lbE51bWJlcikKKwl7CisJCXU4IENja0NlbGxQd3JJZHggPSBEYm1Ub1R4UHdySWR4KGRldiwgV0lSRUxFU1NfTU9ERV9CLCBwTWdudEluZm8tPkNjeENlbGxQd3IpOworCQl1OCBPZmRtQ2VsbFB3cklkeCA9IERibVRvVHhQd3JJZHgoZGV2LCBXSVJFTEVTU19NT0RFX0csIHBNZ250SW5mby0+Q2N4Q2VsbFB3cik7CisKKwkJcHJpbnRrKCJDQ1ggQ2VsbCBMaW1pdDogJWQgZEJtID0+IENDSyBUeCBwb3dlciBpbmRleCA6ICVkLCBPRkRNIFR4IHBvd2VyIGluZGV4OiAlZFxuIiwKKwkJCXByaXYtPkNjeENlbGxQd3IsIENja0NlbGxQd3JJZHgsIE9mZG1DZWxsUHdySWR4KTsKKwkJcHJpbnRrKCJFRVBST00gY2hhbm5lbCglZCkgPT4gQ0NLIFR4IHBvd2VyIGluZGV4OiAlZCwgT0ZETSBUeCBwb3dlciBpbmRleDogJWRcbiIsCisJCQljaGFubmVsLCBDY2tUeFB3cklkeCwgT2ZkbVR4UHdySWR4KTsKKworCQlpZihjY2tfcG93ZXJfbGV2ZWwgPiBDY2tDZWxsUHdySWR4KQorCQkJY2NrX3Bvd2VyX2xldmVsID0gQ2NrQ2VsbFB3cklkeDsKKwkJaWYob2ZkbV9wb3dlcl9sZXZlbCA+IE9mZG1DZWxsUHdySWR4KQorCQkJb2ZkbV9wb3dlcl9sZXZlbCA9IE9mZG1DZWxsUHdySWR4OworCisJCXByaW50aygiQWx0ZXJlZCBDQ0sgVHggcG93ZXIgaW5kZXggOiAlZCwgT0ZETSBUeCBwb3dlciBpbmRleDogJWRcbiIsCisJCQlDY2tUeFB3cklkeCwgT2ZkbVR4UHdySWR4KTsKKwl9CisjZW5kaWYKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJaWYoSVNfRE9UMTFEX0VOQUJMRShwcml2LT5pZWVlODAyMTEpICYmCisJCUlTX0RPVDExRF9TVEFURV9ET05FKHByaXYtPmllZWU4MDIxMSkgKQorCXsKKwkJLy9QUlRfRE9UMTFEX0lORk8gcERvdDExZEluZm8gPSBHRVRfRE9UMTFEX0lORk8ocHJpdi0+aWVlZTgwMjExKTsKKwkJdTggTWF4VHhQd3JJbkRibSA9IERPVDExRF9HZXRNYXhUeFB3ckluRGJtKHByaXYtPmllZWU4MDIxMSwgY2gpOworCQl1OCBDY2tNYXhQd3JJZHggPSBEYm1Ub1R4UHdySWR4KHByaXYsIFdJUkVMRVNTX01PREVfQiwgTWF4VHhQd3JJbkRibSk7CisJCXU4IE9mZG1NYXhQd3JJZHggPSBEYm1Ub1R4UHdySWR4KHByaXYsIFdJUkVMRVNTX01PREVfRywgTWF4VHhQd3JJbkRibSk7CisKKwkJLy9wcmludGsoIk1heCBUeCBQb3dlciBkQm0gKCVkKSA9PiBDQ0sgVHggcG93ZXIgaW5kZXggOiAlZCwgT0ZETSBUeCBwb3dlciBpbmRleDogJWRcbiIsIE1heFR4UHdySW5EYm0sIENja01heFB3cklkeCwgT2ZkbU1heFB3cklkeCk7CisKKwkJLy9wcmludGsoIkVFUFJPTSBjaGFubmVsKCVkKSA9PiBDQ0sgVHggcG93ZXIgaW5kZXg6ICVkLCBPRkRNIFR4IHBvd2VyIGluZGV4OiAlZFxuIiwKKwkJLy8JY2gsIGNja19wb3dlcl9sZXZlbCwgb2ZkbV9wb3dlcl9sZXZlbCk7CisKKwkJaWYoY2NrX3Bvd2VyX2xldmVsID4gQ2NrTWF4UHdySWR4KQorCQkJY2NrX3Bvd2VyX2xldmVsID0gQ2NrTWF4UHdySWR4OworCQlpZihvZmRtX3Bvd2VyX2xldmVsID4gT2ZkbU1heFB3cklkeCkKKwkJCW9mZG1fcG93ZXJfbGV2ZWwgPSBPZmRtTWF4UHdySWR4OworCX0KKworCS8vcHJpdi0+Q3VycmVudENja1R4UHdySWR4ID0gY2NrX3Bvd2VyX2xldmVsOworCS8vcHJpdi0+Q3VycmVudE9mZG1UeFB3cklkeCA9IG9mZG1fcG93ZXJfbGV2ZWw7CisjZW5kaWYKKworCW1heF9jY2tfcG93ZXJfbGV2ZWwgPSAxNTsKKwltYXhfb2ZkbV9wb3dlcl9sZXZlbCA9IDI1OyAvLyAgMTIgLT4gMjUKKwltaW5fb2ZkbV9wb3dlcl9sZXZlbCA9IDEwOworCisjaWZkZWYgQ09ORklHX1JUTDgxODVCCisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUworCisJaWYoY2NrX3Bvd2VyX2xldmVsID4gMzUpCisJeworCQljY2tfcG93ZXJfbGV2ZWwgPSAzNTsKKwl9CisJLy8KKwkvLyBTZXQgdXAgQ0NLIFRYQUdDLiBzdWdnZXN0ZWQgYnkgU0QzIFNZLgorCS8vCisgICAgICAgd3JpdGVfbmljX2J5dGUoZGV2LCBDQ0tfVFhBR0MsIChaRUJSQTJfQ0NLX09GRE1fR0FJTl9TRVRUSU5HWyh1OCljY2tfcG93ZXJfbGV2ZWxdKSApOworICAgICAgIC8vcHJpbnRrKCJDQ0sgVFggcG93ZXIgaXMgJXhcbiIsIChaRUJSQTJfQ0NLX09GRE1fR0FJTl9TRVRUSU5HW2Nja19wb3dlcl9sZXZlbF0pKTsKKyAgICAgICBmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCW1kZWxheSgxKTsKKyNlbHNlCisKKwkvKiBDQ0sgcG93ZXIgc2V0dGluZyAqLworCWlmKGNja19wb3dlcl9sZXZlbCA+IG1heF9jY2tfcG93ZXJfbGV2ZWwpCisJCWNja19wb3dlcl9sZXZlbCA9IG1heF9jY2tfcG93ZXJfbGV2ZWw7CisKKwljY2tfcG93ZXJfbGV2ZWwgKz0gcHJpdi0+Y2NrX3R4cHdyX2Jhc2U7CisKKwlpZihjY2tfcG93ZXJfbGV2ZWwgPiAzNSkKKwkJY2NrX3Bvd2VyX2xldmVsID0gMzU7CisKKwlpZihjaCA9PSAxNCkKKwkJY2NrX3Bvd2VyX3RhYmxlID0gcnRsODIyNXoyX3R4X3Bvd2VyX2Nja19jaDE0OworCWVsc2UKKwkJY2NrX3Bvd2VyX3RhYmxlID0gcnRsODIyNXoyX3R4X3Bvd2VyX2NjazsKKworCisJZm9yKGk9MDtpPDg7aSsrKXsKKworCQlwb3dlciA9IGNja19wb3dlcl90YWJsZVtpXTsKKwkJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDQgKyBpLCBwb3dlcik7CisJfQorCisJLy93cml0ZV9uaWNfYnl0ZShkZXYsIFRYX0dBSU5fQ0NLLCBwb3dlcik7CisJLy8yMDA1LjExLjE3LAorCXdyaXRlX25pY19ieXRlKGRldiwgQ0NLX1RYQUdDLCBaRUJSQTJfQ0NLX09GRE1fR0FJTl9TRVRUSU5HWyh1OCljY2tfcG93ZXJfbGV2ZWxdKTsKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJbWRlbGF5KDEpOworI2VuZGlmCisjZW5kaWYKKwkvKiBPRkRNIHBvd2VyIHNldHRpbmcgKi8KKy8vICBPbGQ6CisvLwlpZihvZmRtX3Bvd2VyX2xldmVsID4gbWF4X29mZG1fcG93ZXJfbGV2ZWwpCisvLwkJb2ZkbV9wb3dlcl9sZXZlbCA9IDM1OworLy8Jb2ZkbV9wb3dlcl9sZXZlbCArPSBtaW5fb2ZkbV9wb3dlcl9sZXZlbDsKKy8vICBMYXRlc3Q6CisvKglpZihvZmRtX3Bvd2VyX2xldmVsID4gKG1heF9vZmRtX3Bvd2VyX2xldmVsIC0gbWluX29mZG1fcG93ZXJfbGV2ZWwpKQorCQlvZmRtX3Bvd2VyX2xldmVsID0gbWF4X29mZG1fcG93ZXJfbGV2ZWw7CisJZWxzZQorCQlvZmRtX3Bvd2VyX2xldmVsICs9IG1pbl9vZmRtX3Bvd2VyX2xldmVsOworCisJb2ZkbV9wb3dlcl9sZXZlbCArPSBwcml2LT5vZmRtX3R4cHdyX2Jhc2U7CisqLworCWlmKG9mZG1fcG93ZXJfbGV2ZWwgPiAzNSkKKwkJb2ZkbV9wb3dlcl9sZXZlbCA9IDM1OworCisvLwlydGw4MTg1X3NldF9hbmFwYXJhbTIoZGV2LFJUTDgyMjVfQU5BUEFSQU0yX09OKTsKKworCS8vcnRsODE4NV9zZXRfYW5hcGFyYW0yKGRldiwgQU5BUEFSTTJfQVNJQ19PTik7CisKKwlpZiAocHJpdi0+dXAgPT0gMCkgeworCQkvL211c3QgYWRkIHRoZXNlIGZvciBydGw4MTg1QiBkb3duLCB4aW9uZy0yMDA2LTExLTIxCisJCXdyaXRlX3BoeV9vZmRtKGRldiwyLDB4NDIpOworCQl3cml0ZV9waHlfb2ZkbShkZXYsNSwwKTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LDYsMHg0MCk7CisJCXdyaXRlX3BoeV9vZmRtKGRldiw3LDApOworCQl3cml0ZV9waHlfb2ZkbShkZXYsOCwweDQwKTsKKwl9CisKKwkvL3dyaXRlX25pY19ieXRlKGRldiwgVFhfR0FJTl9PRkRNLCBvZmRtX3Bvd2VyX2xldmVsKTsKKwkvLzIwMDUuMTEuMTcsCisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUworICAgICAgICB3cml0ZV9uaWNfYnl0ZShkZXYsIE9GRE1fVFhBR0MsIFpFQlJBMl9DQ0tfT0ZETV9HQUlOX1NFVFRJTkdbKHU4KW9mZG1fcG93ZXJfbGV2ZWxdKTsKKyNlbHNlCisgICAgICAgIHdyaXRlX25pY19ieXRlKGRldiwgT0ZETV9UWEFHQywgWkVCUkEyX0NDS19PRkRNX0dBSU5fU0VUVElOR1sodTgpb2ZkbV9wb3dlcl9sZXZlbF0qMik7CisjZW5kaWYKKyAgICAgICAgaWYob2ZkbV9wb3dlcl9sZXZlbDw9MTEpCisgICAgICAgIHsKKy8vICAgICAgICAgICAgd3JpdGVfbmljX2R3b3JkKGRldixQSFlfQURSLDB4MDAwMDVjODcpOworLy8gICAgICAgICAgICB3cml0ZV9uaWNfZHdvcmQoZGV2LFBIWV9BRFIsMHgwMDAwNWM4OSk7CisJCXdyaXRlX3BoeV9vZmRtKGRldiwweDA3LDB4NWMpOworCQl3cml0ZV9waHlfb2ZkbShkZXYsMHgwOSwweDVjKTsKKyAgICAgICAgfQorCWlmKG9mZG1fcG93ZXJfbGV2ZWw8PTE3KQorICAgICAgICB7CisvLyAgICAgICAgICAgICB3cml0ZV9uaWNfZHdvcmQoZGV2LFBIWV9BRFIsMHgwMDAwNTQ4Nyk7CisvLyAgICAgICAgICAgICB3cml0ZV9uaWNfZHdvcmQoZGV2LFBIWV9BRFIsMHgwMDAwNTQ4OSk7CisJCXdyaXRlX3BoeV9vZmRtKGRldiwweDA3LDB4NTQpOworCQl3cml0ZV9waHlfb2ZkbShkZXYsMHgwOSwweDU0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKy8vICAgICAgICAgICAgIHdyaXRlX25pY19kd29yZChkZXYsUEhZX0FEUiwweDAwMDA1MDg3KTsKKy8vICAgICAgICAgICAgIHdyaXRlX25pY19kd29yZChkZXYsUEhZX0FEUiwweDAwMDA1MDg5KTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LDB4MDcsMHg1MCk7CisJCXdyaXRlX3BoeV9vZmRtKGRldiwweDA5LDB4NTApOworICAgICAgICB9CisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwltZGVsYXkoMSk7CisKK30KKyNpZiAwCisvKiBzd2l0Y2ggYmV0d2VlbiBtb2RlIEIgYW5kIEcgKi8KK3ZvaWQgcnRsODIyNV9zZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBtb2RlYikKK3sKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTUsIChtb2RlYiA/IDB4MCA6IDB4NDApKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTcsIChtb2RlYiA/IDB4MCA6IDB4NDApKTsKK30KKyNlbmRpZgorCit2b2lkIHJ0bDgyMjV6Ml9yZl9zZXRfY2hhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBjaCkKK3sKKy8qCisJc2hvcnQgZ3NldCA9IChwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQgJiYKKwkJaWVlZTgwMjExX2lzXzU0Zyhwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yaykpIHx8CisJCXByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1I7CisqLworCXJ0bDgyMjV6Ml9TZXRUWFBvd2VyTGV2ZWwoZGV2LCBjaCk7CisKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4NywgcnRsODIyNV9jaGFuW2NoXSk7CisKKwkvL1lKLGFkZCwwODA4MjgsIGlmIHNldCBjaGFubmVsIGZhaWxlZCwgd3JpdGUgYWdhaW4KKwlpZigoUkZfUmVhZFJlZyhkZXYsIDB4NykgJiAweDBGODApICE9IHJ0bDgyMjVfY2hhbltjaF0pCisJeworCQlSRl9Xcml0ZVJlZyhkZXYsIDB4NywgcnRsODIyNV9jaGFuW2NoXSk7CisJfQorCisJbWRlbGF5KDEpOworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwltZGVsYXkoMTApOworLy9kZWxldGVkIGJ5IERhdmlkIDogMjAwNi84LzkKKyNpZiAwCisJd3JpdGVfbmljX2J5dGUoZGV2LFNJRlMsMHgyMik7Ly8gU0lGUzogMHgyMgorCisJaWYoZ3NldCkKKwkJd3JpdGVfbmljX2J5dGUoZGV2LERJRlMsMjApOyAvL0RJRlM6IDIwCisJZWxzZQorCQl3cml0ZV9uaWNfYnl0ZShkZXYsRElGUywweDI0KTsgLy9ESUZTOiAzNgorCisJaWYocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEICYmCisJCWllZWU4MDIxMV9pc19zaG9ydHNsb3QocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmspKQorCQl3cml0ZV9uaWNfYnl0ZShkZXYsU0xPVCwweDkpOyAvL1NMT1Q6IDkKKworCWVsc2UKKwkJd3JpdGVfbmljX2J5dGUoZGV2LFNMT1QsMHgxNCk7IC8vU0xPVDogMjAgKDB4MTQpCisKKworCWlmKGdzZXQpeworCQl3cml0ZV9uaWNfYnl0ZShkZXYsRUlGUyw5MSAtIDIwKTsgLy8gRUlGUzogOTEgKDB4NUIpCisJCXdyaXRlX25pY19ieXRlKGRldixDV19WQUwsMHg3Myk7IC8vQ1cgVkFMVUU6IDB4MzcKKwkJLy9ETUVTRygidXNpbmcgRyBuZXQgcGFyYW1zIik7CisJfWVsc2V7CisJCXdyaXRlX25pY19ieXRlKGRldixFSUZTLDkxIC0gMHgyNCk7IC8vIEVJRlM6IDkxICgweDVCKQorCQl3cml0ZV9uaWNfYnl0ZShkZXYsQ1dfVkFMLDB4YTUpOyAvL0NXIFZBTFVFOiAweDM3CisJCS8vRE1FU0coInVzaW5nIEIgbmV0IHBhcmFtcyIpOworCX0KKyNlbmRpZgorCit9CisjaWYgMAordm9pZCBydGw4MjI1X2hvc3RfcGNpX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgMHg0ODApOworCisJcnRsODE4NV9yZl9waW5zX2VuYWJsZShkZXYpOworCisJLy9pZihwcml2LT5jYXJkXzgxODUgPT0gMiAmJiBwcml2LT5lbmFibGVfZ3BpbzAgKSAvKiB2ZXJzaW9uIEQgKi8KKwkvL3dyaXRlX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0LCAweDg4KTsKKwkvL2Vsc2UKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCwgMHg4OCB8IFNXX0NPTlRST0xfR1BJTyk7IC8qIDB4NDg4IHwgU1dfQ09OVFJPTF9HUElPICovCisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIEdQX0VOQUJMRSwgMCk7CisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCW1kZWxheSgyMDApOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBHUF9FTkFCTEUsIDB4ZmYgJiAofigxPDw2KSkpOyAvKiBiaXQgNiBpcyBmb3IgUkYgb24vb2ZmIGRldGVjdGlvbiAqLworCisKK30KKwordm9pZCBydGw4MjI1X2hvc3RfdXNiX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl3cml0ZV9uaWNfYnl0ZShkZXYsUkZQaW5zU2VsZWN0KzEsMCk7CisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsR1BJTywwKTsKKworCXdyaXRlX25pY19ieXRlX0UoZGV2LDB4NTMscmVhZF9uaWNfYnl0ZV9FKGRldiwweDUzKSB8ICgxPDw3KSk7CisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsUkZQaW5zU2VsZWN0KzEsNCk7CisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsR1BJTywweDIwKTsKKworCXdyaXRlX25pY19ieXRlKGRldixHUF9FTkFCTEUsMCk7CisKKworCS8qIENvbmZpZyBCQiAmIFJGICovCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIDB4ODApOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QsIDB4ODApOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNFbmFibGUsIDB4ODApOworCisKKwltZGVsYXkoMTAwKTsKKworCW1kZWxheSgxMDAwKTsKKworfQorI2VuZGlmCit2b2lkIHJ0bDgyMjV6Ml9yZl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCBpOworCXNob3J0IGNoYW5uZWwgPSAxOworCXUxNglicnNyOworCXUzMglkYXRhLGFkZHI7CisKKwlwcml2LT5jaGFuID0gY2hhbm5lbDsKKworLy8JcnRsODE4MF9zZXRfYW5hcGFyYW0oZGV2LCBSVEw4MjI1X0FOQVBBUkFNX09OKTsKKworCisJaWYocHJpdi0+Y2FyZF90eXBlID09IFVTQikKKwkJcnRsODIyNV9ob3N0X3VzYl9pbml0KGRldik7CisJZWxzZQorCQlydGw4MjI1X2hvc3RfcGNpX2luaXQoZGV2KTsKKworCXdyaXRlX25pY19kd29yZChkZXYsIFJGX1RJTUlORywgMHgwMDBhODAwOCk7CisKKwlicnNyID0gcmVhZF9uaWNfd29yZChkZXYsIEJSU1IpOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBCUlNSLCAweGZmZmYpOworCisKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSRl9QQVJBLCAweDEwMDA0NCk7CisKKwkjaWYgMSAgLy8wLT4xCisJcnRsODE4MF9zZXRfbW9kZShkZXYsIEVQUk9NX0NNRF9DT05GSUcpOworCXdyaXRlX25pY19ieXRlKGRldiwgQ09ORklHMywgMHg0NCk7CisJcnRsODE4MF9zZXRfbW9kZShkZXYsIEVQUk9NX0NNRF9OT1JNQUwpOworCSNlbmRpZgorCisKKwlydGw4MTg1X3JmX3BpbnNfZW5hYmxlKGRldik7CisKKy8vCQltZGVsYXkoMTAwMCk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHgwLCAweDJiZik7IG1kZWxheSgxKTsKKworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4MSwgMHhlZTApOyBtZGVsYXkoMSk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHgyLCAweDQ0ZCk7IG1kZWxheSgxKTsKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDMsIDB4NDQxKTsgbWRlbGF5KDEpOworCisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHg0LCAweDhjMyk7bWRlbGF5KDEpOworCisKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDUsIDB4YzcyKTttZGVsYXkoMSk7CisvLwl9CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHg2LCAweGU2KTsgIG1kZWxheSgxKTsKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDcsICgocHJpdi0+Y2FyZF90eXBlID09IFVTQik/IDB4ODJhIDogcnRsODIyNV9jaGFuW2NoYW5uZWxdKSk7ICBtZGVsYXkoMSk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHg4LCAweDNmKTsgIG1kZWxheSgxKTsKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDksIDB4MzM1KTsgIG1kZWxheSgxKTsKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweGEsIDB4OWQ0KTsgIG1kZWxheSgxKTsKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweGIsIDB4N2JiKTsgIG1kZWxheSgxKTsKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweGMsIDB4ODUwKTsgIG1kZWxheSgxKTsKKworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4ZCwgMHhjZGYpOyAgIG1kZWxheSgxKTsKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweGUsIDB4MmIpOyAgbWRlbGF5KDEpOworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4ZiwgMHgxMTQpOworCisKKwltZGVsYXkoMTAwKTsKKworCisJLy9pZihwcml2LT5jYXJkX3R5cGUgIT0gVVNCKSAvKiBtYXliZSBub3QgbmVlZGVkIGV2ZW4gZm9yIDgxODUgKi8KKy8vCXdyaXRlX3J0bDgyMjUoZGV2LCAweDcsIHJ0bDgyMjVfY2hhbltjaGFubmVsXSk7CisKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHgwLCAweDFiNyk7CisKKwlmb3IoaT0wO2k8OTU7aSsrKXsKKwkJd3JpdGVfcnRsODIyNShkZXYsIDB4MSwgKHU4KShpKzEpKTsKKworCQkjaWYgMAorCQlpZihwcml2LT5waHlfdmVyID09IDEpCisJCQkvKiB2ZXJzaW9uIEEgKi8KKwkJCXdyaXRlX3J0bDgyMjUoZGV2LCAweDIsIHJ0bDgyMjVhX3J4Z2FpbltpXSk7CisJCWVsc2UKKwkJI2VuZGlmCisJCS8qIHZlcnNpb24gQiAmIEMgJiBEKi8KKworCQl3cml0ZV9ydGw4MjI1KGRldiwgMHgyLCBydGw4MjI1ejJfcnhnYWluW2ldKTsKKwl9CisJd3JpdGVfcnRsODIyNShkZXYsIDB4MywgMHg4MCk7CisJd3JpdGVfcnRsODIyNShkZXYsIDB4NSwgMHg0KTsKKworCXdyaXRlX3J0bDgyMjUoZGV2LCAweDAsIDB4YjcpOworCisJd3JpdGVfcnRsODIyNShkZXYsIDB4MiwgMHhjNGQpOworCisJaWYocHJpdi0+Y2FyZF90eXBlID09IFVTQil7CisJLy8JZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwkJbWRlbGF5KDIwMCk7CisKKwkJd3JpdGVfcnRsODIyNShkZXYsIDB4MiwgMHg0NGQpOworCisJLy8JZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwkJbWRlbGF5KDEwMCk7CisKKwl9Ly9FbmQgb2YgaWYocHJpdi0+Y2FyZF90eXBlID09IFVTQikKKwkvKiBGSVhNRSEhIHJ0bDgxODcgd2UgaGF2ZSB0byBjaGVjayBpZiBjYWxpYnJhcmlvbgorCSAqIGlzIHN1Y2Nlc3NmdWwgYW5kIGV2ZW50dWFsbHkgY2FsLiBhZ2FpbiAocmVwZWF0CisJICogdGhlIHR3byB3cml0ZSBvbiByZWcgMikKKwkqLworCS8vIENoZWNrIGZvciBjYWxpYnJhdGlvbiBzdGF0dXMsIDIwMDUuMTEuMTcsCisgICAgICAgIGRhdGEgPSByZWFkX3J0bDgyMjUoZGV2LCA2KTsKKyAgICAgICAgaWYgKCEoZGF0YSYweDAwMDAwMDgwKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHdyaXRlX3J0bDgyMjUoZGV2LCAweDAyLCAweDBjNGQpOworICAgICAgICAgICAgICAgIGZvcmNlX3BjaV9wb3N0aW5nKGRldik7IG1kZWxheSgyMDApOworICAgICAgICAgICAgICAgIHdyaXRlX3J0bDgyMjUoZGV2LCAweDAyLCAweDA0NGQpOworICAgICAgICAgICAgICAgIGZvcmNlX3BjaV9wb3N0aW5nKGRldik7IG1kZWxheSgxMDApOworICAgICAgICAgICAgICAgIGRhdGEgPSByZWFkX3J0bDgyMjUoZGV2LCA2KTsKKyAgICAgICAgICAgICAgICBpZiAoIShkYXRhJjB4MDAwMDAwODApKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETUVTR1coIlJGIENhbGlicmF0aW9uIEZhaWxlZCEhISFcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisJLy9mb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCisJbWRlbGF5KDIwMCk7IC8vMjAwIGZvciA4MTg3CisKKworLy8JLy9pZihwcml2LT5jYXJkX3R5cGUgIT0gVVNCKXsKKy8vCQl3cml0ZV9ydGw4MjI1KGRldiwgMHgyLCAweDQ0ZCk7CisvLwkJd3JpdGVfcnRsODIyNShkZXYsIDB4NywgcnRsODIyNV9jaGFuW2NoYW5uZWxdKTsKKy8vCQl3cml0ZV9ydGw4MjI1KGRldiwgMHgyLCAweDQ3ZCk7CisvLworLy8JCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisvLwkJbWRlbGF5KDEwMCk7CisvLworLy8JCXdyaXRlX3J0bDgyMjUoZGV2LCAweDIsIDB4NDRkKTsKKy8vCS8vfQorCisJd3JpdGVfcnRsODIyNShkZXYsIDB4MCwgMHgyYmYpOworCisJaWYocHJpdi0+Y2FyZF90eXBlICE9IFVTQikKKwkJcnRsODE4NV9yZl9waW5zX2VuYWJsZShkZXYpOworCS8vc2V0IHVwIFpFQlJBIEFHQyB0YWJsZSwgMjAwNS4xMS4xNywKKyAgICAgICAgZm9yKGk9MDtpPDEyODtpKyspeworICAgICAgICAgICAgICAgIGRhdGEgPSBydGw4MjI1X2FnY1tpXTsKKworICAgICAgICAgICAgICAgIGFkZHIgPSBpICsgMHg4MDsgLy9lbmFibGUgd3JpdGluZyBBR0MgdGFibGUKKyAgICAgICAgICAgICAgICB3cml0ZV9waHlfb2ZkbShkZXYsIDB4YiwgZGF0YSk7CisKKyAgICAgICAgICAgICAgICBtZGVsYXkoMSk7CisgICAgICAgICAgICAgICAgd3JpdGVfcGh5X29mZG0oZGV2LCAweGEsIGFkZHIpOworCisgICAgICAgICAgICAgICAgbWRlbGF5KDEpOworICAgICAgICB9CisjaWYgMAorCWZvcihpPTA7aTwxMjg7aSsrKXsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweGIsIHJ0bDgyMjVfYWdjW2ldKTsKKworCQltZGVsYXkoMSk7CisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhhLCAodTgpaSsgMHg4MCk7CisKKwkJbWRlbGF5KDEpOworCX0KKyNlbmRpZgorCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwltZGVsYXkoMSk7CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MCwgMHgxKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxLCAweDIpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDIsICgocHJpdi0+Y2FyZF90eXBlID09IFVTQik/IDB4NDIgOiAweDYyKSk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MywgMHgwKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHg0LCAweDApOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDUsIDB4MCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4NiwgMHg0MCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4NywgMHgwKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHg4LCAweDQwKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHg5LCAweGZlKTsgbWRlbGF5KDEpOworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweGEsIDB4OCk7IG1kZWxheSgxKTsKKworCS8vd3JpdGVfcGh5X29mZG0oZGV2LCAweDE4LCAweGVmKTsKKwkvLwl9CisJLy99CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweGIsIDB4ODApOyBtZGVsYXkoMSk7CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4YywgMHgxKTttZGVsYXkoMSk7CisKKworCS8vaWYocHJpdi0+Y2FyZF90eXBlICE9IFVTQikKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4ZCwgMHg0Myk7CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4ZSwgMHhkMyk7bWRlbGF5KDEpOworCisKKwkjaWYgMAorCWlmKHByaXYtPmNhcmRfODE4NSA9PSAxKXsKKwkJaWYocHJpdi0+Y2FyZF84MTg1X0J2ZXJzaW9uKQorCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweGYsIDB4MjApOy8qdmVyIEIqLworCQllbHNlCisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4ZiwgMHgyOCk7Lyp2ZXIgQyovCisJfWVsc2V7CisJI2VuZGlmCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweGYsIDB4MzgpO21kZWxheSgxKTsKKy8qdmVyIEQgJiA4MTg3Ki8KKy8vCX0KKworLy8JaWYocHJpdi0+Y2FyZF84MTg1ID09IDEgJiYgcHJpdi0+Y2FyZF84MTg1X0J2ZXJzaW9uKQorLy8JCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxMCwgMHgwNCk7Lyp2ZXIgQiovCisvLwllbHNlCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDEwLCAweDg0KTttZGVsYXkoMSk7CisvKnZlciBDICYgRCAmIDgxODcqLworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDExLCAweDA3KTttZGVsYXkoMSk7CisvKmFnYyByZXNwIHRpbWUgNzAwKi8KKworCisvLwlpZihwcml2LT5jYXJkXzgxODUgPT0gMil7CisJLyogVmVyIEQgJiA4MTg3Ki8KKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTIsIDB4MjApO21kZWxheSgxKTsKKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxMywgMHgyMCk7bWRlbGF5KDEpOworCisjaWYgMAorCX1lbHNleworCQkvKiBWZXIgQiAmIEMqLworCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTIsIDB4MCk7CisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxMywgMHgwKTsKKwl9CisjZW5kaWYKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTQsIDB4MCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTUsIDB4NDApOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE2LCAweDApOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE3LCAweDQwKTsgbWRlbGF5KDEpOworCisvLwlpZiAocHJpdi0+Y2FyZF90eXBlID09IFVTQikKKy8vCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTgsIDB4ZWYpOworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE4LCAweGVmKTttZGVsYXkoMSk7CisKKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxOSwgMHgxOSk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWEsIDB4MjApOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDFiLCAweDE1KTttZGVsYXkoMSk7CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWMsIDB4NCk7bWRlbGF5KDEpOworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDFkLCAweGM1KTttZGVsYXkoMSk7IC8vMjAwNS4xMS4xNywKKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxZSwgMHg5NSk7bWRlbGF5KDEpOworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDFmLCAweDc1KTsJbWRlbGF5KDEpOworCisvLwl9CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjAsIDB4MWYpO21kZWxheSgxKTsKKworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyMSwgMHgxNyk7bWRlbGF5KDEpOworCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDIyLCAweDE2KTttZGVsYXkoMSk7CisKKy8vCWlmKHByaXYtPmNhcmRfdHlwZSAhPSBVU0IpCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDIzLCAweDgwKTttZGVsYXkoMSk7IC8vRklYTUUgbWF5YmUgbm90IG5lZWRlZCAvLyA8PgorCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI0LCAweDQ2KTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNSwgMHgwMCk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjYsIDB4OTApOyBtZGVsYXkoMSk7CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjcsIDB4ODgpOyBtZGVsYXkoMSk7CisKKworCS8vIDw+IFNldCBpbml0LiBnYWluIHRvIG03NGRCbS4KKworCXJ0bDgyMjV6Ml9zZXRfZ2FpbihkZXYsNCk7CisKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgwLCAweDk4KTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDMsIDB4MjApOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NCwgMHg3ZSk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg1LCAweDEyKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDYsIDB4ZmMpOyBtZGVsYXkoMSk7CisKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg3LCAweDc4KTttZGVsYXkoMSk7CisgLyogVmVyIEMgJiBEICYgODE4NyovCisKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg4LCAweDJlKTttZGVsYXkoMSk7CisKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgxMCwgKChwcml2LT5jYXJkX3R5cGUgPT0gVVNCKSA/IDB4OWI6IDB4OTMpKTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDExLCAweDg4KTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDEyLCAweDQ3KTsgbWRlbGF5KDEpOworI2lmIDAKKwlpZihwcml2LT5jYXJkXzgxODUgPT0gMSAmJiBwcml2LT5jYXJkXzgxODVfQnZlcnNpb24pCisJCXdyaXRlX3BoeV9jY2soZGV2LCAweDEzLCAweDk4KTsgLyogVmVyIEIgKi8KKwllbHNlCisjZW5kaWYKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgxMywgMHhkMCk7IC8qIFZlciBDICYgRCAmIDgxODcqLworCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTksIDB4MCk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MWEsIDB4YTApOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDFiLCAweDgpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQwLCAweDg2KTsgLyogQ0NLIENhcnJpZXIgU2Vuc2UgVGhyZXNob2xkICovCisKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0MSwgMHg4ZCk7bWRlbGF5KDEpOworCisKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0MiwgMHgxNSk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0MywgMHgxOCk7IG1kZWxheSgxKTsKKworCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDQsIDB4MzYpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDUsIDB4MzUpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDYsIDB4MmUpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDcsIDB4MjUpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDgsIDB4MWMpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDksIDB4MTIpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NGEsIDB4OSk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0YiwgMHg0KTsgbWRlbGF5KDEpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDRjLCAweDUpO21kZWxheSgxKTsKKworCisJd3JpdGVfbmljX2J5dGUoZGV2LCAweDViLCAweDBkKTsgbWRlbGF5KDEpOworCisKKworLy8gPD4KKy8vCS8vIFRFU1RSIDB4YiA4MTg3CisvLwl3cml0ZV9waHlfY2NrKGRldiwgMHgxMCwgMHg5Myk7Ly8gJiAweGZiKTsKKy8vCisvLwkvL2lmKHByaXYtPmNhcmRfdHlwZSAhPSBVU0IpeworLy8JCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyLCAweDYyKTsKKy8vCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4NiwgMHgwKTsKKy8vCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4OCwgMHgwKTsKKy8vCS8vfQorCisJcnRsODIyNXoyX1NldFRYUG93ZXJMZXZlbChkZXYsIGNoYW5uZWwpOworI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKyAgICAgICAgd3JpdGVfcGh5X2NjayhkZXYsIDB4MTEsIDB4OWIpOyBtZGVsYXkoMSk7IC8qIFJ4IGFudCBBLCAweGRiIGZvciBCICovCisjZWxzZQorCXdyaXRlX3BoeV9jY2soZGV2LCAweDEwLCAweDliKTsgbWRlbGF5KDEpOyAvKiBSeCBhbnQgQSwgMHhkYiBmb3IgQiAqLworI2VuZGlmCisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI2LCAweDkwKTsgbWRlbGF5KDEpOyAvKiBSeCBhbnQgQSwgMHgxMCBmb3IgQiAqLworCisJcnRsODE4NV90eF9hbnRlbm5hKGRldiwgMHgzKTsgLyogVFggYW50IEEsIDB4MCBmb3IgQiAqLworCisJLyogc3dpdGNoIHRvIGhpZ2gtc3BlZWQgMy13aXJlCisJICogbGFzdCBkaWdpdC4gMiBmb3IgYm90aCBjY2sgYW5kIG9mZG0KKwkgKi8KKwlpZihwcml2LT5jYXJkX3R5cGUgPT0gVVNCKQorCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCAweDk0LCAweDNkYzAwMDAyKTsKKwllbHNleworCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCAweDk0LCAweDE1YzAwMDAyKTsKKwkJcnRsODE4NV9yZl9waW5zX2VuYWJsZShkZXYpOworCX0KKworLy8JaWYocHJpdi0+Y2FyZF90eXBlICE9IFVTQikKKy8vCXJ0bDgyMjVfc2V0X2dhaW4oZGV2LCA0KTsgLyogRklYTUUgdGhpcyAnMScgaXMgcmFuZG9tICovIC8vIDw+CisvLwkgcnRsODIyNV9zZXRfbW9kZShkZXYsIDEpOyAvKiBGSVhNRSBzdGFydCBpbiBCIG1vZGUgKi8gLy8gPD4KKy8vCisvLwkvKiBtYWtlIHN1cmUgaXMgd2FrZW4gdXAhICovCisvLwl3cml0ZV9ydGw4MjI1KGRldiwweDQsIDB4OWZmKTsKKy8vCXJ0bDgxODBfc2V0X2FuYXBhcmFtKGRldiwgUlRMODIyNV9BTkFQQVJBTV9PTik7CisvLwlydGw4MTg1X3NldF9hbmFwYXJhbTIoZGV2LCBSVEw4MjI1X0FOQVBBUkFNMl9PTik7CisKKwlydGw4MjI1X3JmX3NldF9jaGFuKGRldiwgcHJpdi0+Y2hhbik7CisKKwkvL3dyaXRlX25pY193b3JkKGRldixCUlNSLGJyc3IpOworCisJLy9ydGw4MjI1ejJfcmZfc2V0X21vZGUoZGV2KTsKK30KKwordm9pZCBydGw4MjI1ejJfcmZfc2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlpZihwcml2LT5pZWVlODAyMTEtPm1vZGUgPT0gSUVFRV9BKQorCXsKKwkJd3JpdGVfcnRsODIyNShkZXYsIDB4NSwgMHgxODY1KTsKKwkJd3JpdGVfbmljX2R3b3JkKGRldiwgUkZfUEFSQSwgMHgxMDA4NCk7CisJCXdyaXRlX25pY19kd29yZChkZXYsIFJGX1RJTUlORywgMHhhODAwOCk7CisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwLCAweDApOworCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4YSwgMHg2KTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweGIsIDB4OTkpOworCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4ZiwgMHgyMCk7CisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxMSwgMHg3KTsKKworCQlydGw4MjI1ejJfc2V0X2dhaW4oZGV2LDQpOworCisJCXdyaXRlX3BoeV9vZmRtKGRldiwweDE1LCAweDQwKTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LDB4MTcsIDB4NDApOworCisJCXdyaXRlX25pY19kd29yZChkZXYsIDB4OTQsMHgxMDAwMDAwMCk7CisJfWVsc2V7CisKKwkJd3JpdGVfcnRsODIyNShkZXYsIDB4NSwgMHgxODY0KTsKKwkJd3JpdGVfbmljX2R3b3JkKGRldiwgUkZfUEFSQSwgMHgxMDA0NCk7CisJCXdyaXRlX25pY19kd29yZChkZXYsIFJGX1RJTUlORywgMHhhODAwOCk7CisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwLCAweDEpOworCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4YSwgMHg2KTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweGIsIDB4OTkpOworCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4ZiwgMHgyMCk7CisJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxMSwgMHg3KTsKKworCQlydGw4MjI1ejJfc2V0X2dhaW4oZGV2LDQpOworCisJCXdyaXRlX3BoeV9vZmRtKGRldiwweDE1LCAweDQwKTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LDB4MTcsIDB4NDApOworCisJCXdyaXRlX25pY19kd29yZChkZXYsIDB4OTQsMHgwNDAwMDAwMik7CisJfQorfQorCisvL2x6bSBtb2QgMDgwODI2CisvLyNkZWZpbmUgTUFYX0RPWkVfV0FJVElOR19USU1FU184NUIgNjQKKy8vI2RlZmluZSBNQVhfUE9MTElOR18yNEZfVElNRVNfODdTRSAJNQorI2RlZmluZSBNQVhfRE9aRV9XQUlUSU5HX1RJTUVTXzg1QiAJCTIwCisjZGVmaW5lIE1BWF9QT0xMSU5HXzI0Rl9USU1FU184N1NFIAkJCTEwCisjZGVmaW5lIExQU19NQVhfU0xFRVBfV0FJVElOR19USU1FU184N1NFIAk1CisKK2Jvb2wKK1NldFplYnJhUkZQb3dlclN0YXRlODE4NSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCVJUX1JGX1BPV0VSX1NUQVRFCWVSRlBvd2VyU3RhdGUKKwkpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXU4CQkJYnRDUjkzNDYsIGJ0Q29uZmlnMzsKKwlib29sIGJBY3Rpb25BbGxvd2VkPSB0cnVlLCBiVHVybk9mZkJCID0gdHJ1ZTsvL2x6bSBtb2QgMDgwODI2CisJLy91MzIJCQlEV29yZENvbnRlbnQ7CisJdTgJCQl1MWJUbXA7CisJaW50CQkJaTsKKwkvL3UxNgkJCXUyYlRGUEMgPSAwOworCWJvb2wJCWJSZXN1bHQgPSB0cnVlOworCXU4CQkJUXVldWVJRDsKKworCWlmKHByaXYtPlNldFJGUG93ZXJTdGF0ZUluUHJvZ3Jlc3MgPT0gdHJ1ZSkKKwkJcmV0dXJuIGZhbHNlOworCisJcHJpdi0+U2V0UkZQb3dlclN0YXRlSW5Qcm9ncmVzcyA9IHRydWU7CisKKwkvLyBlbmFibGUgRUVNMCBhbmQgRUVNMSBpbiA5MzQ2Q1IKKwlidENSOTM0NiA9IHJlYWRfbmljX2J5dGUoZGV2LCBDUjkzNDYpOworCXdyaXRlX25pY19ieXRlKGRldiwgQ1I5MzQ2LCAoYnRDUjkzNDZ8MHhDMCkgKTsKKwkvLyBlbmFibGUgUEFSTV9FbiBpbiBDb25maWczCisJYnRDb25maWczID0gcmVhZF9uaWNfYnl0ZShkZXYsIENPTkZJRzMpOworCXdyaXRlX25pY19ieXRlKGRldiwgQ09ORklHMywgKGJ0Q29uZmlnM3xDT05GSUczX1BBUk1fRW4pICk7CisKKwlzd2l0Y2goIHByaXYtPnJmX2NoaXAgKQorCXsKKwljYXNlIFJGX1pFQlJBMjoKKwkJc3dpdGNoKCBlUkZQb3dlclN0YXRlICkKKwkJeworCQljYXNlIGVSZk9uOgorCQkJUkZfV3JpdGVSZWcoZGV2LDB4NCwweDlGRik7CisKKwkJCXdyaXRlX25pY19kd29yZChkZXYsIEFOQVBBUkFNLCBBTkFQQVJNX09OKTsKKwkJCXdyaXRlX25pY19kd29yZChkZXYsIEFOQVBBUkFNMiwgQU5BUEFSTTJfT04pOworCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIENPTkZJRzQsIHByaXYtPlJGUHJvZ1R5cGUpOworCisJCQkvL0ZvbGxvdyA4N0IsIElzYWlhaCAyMDA3LTA0LTI3CisJCQl1MWJUbXAgPSByZWFkX25pY19ieXRlKGRldiwgMHgyNEUpOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweDI0RSwgKHUxYlRtcCAmICh+KEJJVDV8QklUNikpKSApOy8vIDA3MDEyNCBTRDEgQWxleDogdHVybiBvbiBDQ0sgYW5kIE9GRE0uCisJCQlicmVhazsKKworCQljYXNlIGVSZlNsZWVwOgorCQkJYnJlYWs7CisKKwkJY2FzZSBlUmZPZmY6CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYlJlc3VsdCA9IGZhbHNlOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFJGX1pFQlJBNDoKKwkJc3dpdGNoKCBlUkZQb3dlclN0YXRlICkKKwkJeworCQljYXNlIGVSZk9uOgorCQkJLy9wcmludGsoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09cG93ZXIgb25AamlmZmllczolZFxuIixqaWZmaWVzKTsKKwkJCXdyaXRlX25pY193b3JkKGRldiwgMHgzN0MsIDB4MDBFQyk7CisKKwkJCS8vdHVybiBvbiBBRkUKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgMHg1NCwgMHgwMCk7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4NjIsIDB4MDApOworCisJCQkvL2x6bSBtb2QgMDgwODI2CisJCQkvL3R1cm4gb24gUkYKKwkJCS8vUkZfV3JpdGVSZWcoZGV2LCAweDAsIDB4MDA5Zik7IC8vbWRlbGF5KDEpOworCQkJLy9SRl9Xcml0ZVJlZyhkZXYsIDB4NCwgMHgwOTcyKTsgLy9tZGVsYXkoMSk7CisJCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MCwgMHgwMDlmKTsgdWRlbGF5KDUwMCk7CisJCQlSRl9Xcml0ZVJlZyhkZXYsIDB4NCwgMHgwOTcyKTsgdWRlbGF5KDUwMCk7CisJCQkvL3R1cm4gb24gUkYgYWdhaW4sIHN1Z2dlc3RlZCBieSBTRDMgc3RldmVubC4KKwkJCVJGX1dyaXRlUmVnKGRldiwgMHgwLCAweDAwOWYpOyB1ZGVsYXkoNTAwKTsKKwkJCVJGX1dyaXRlUmVnKGRldiwgMHg0LCAweDA5NzIpOyB1ZGVsYXkoNTAwKTsKKworCQkJLy90dXJuIG9uIEJCCisvLwkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4NDA5MCk7IC8vb2ZkbSAxMD0wMAorLy8JCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweDQwOTIpOyAvL29mZG0gMTI9MDAKKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwweDEwLDB4NDApOworCQkJd3JpdGVfcGh5X29mZG0oZGV2LDB4MTIsMHg0MCk7CisJCQkvL0F2b2lkIHBvd2VyIGRvd24gYXQgaW5pdCB0aW1lLgorCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBDT05GSUc0LCBwcml2LT5SRlByb2dUeXBlKTsKKworCQkJdTFiVG1wID0gcmVhZF9uaWNfYnl0ZShkZXYsIDB4MjRFKTsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgMHgyNEUsICh1MWJUbXAgJiAofihCSVQ1fEJJVDYpKSkgKTsKKworCQkJYnJlYWs7CisKKwkJY2FzZSBlUmZTbGVlcDoKKwkJCS8vIE1ha2Ugc3VyZSBCdXN5UXVldWUgaXMgZW1wdHkgYmVmb3IgdHVybiBvZmYgUkZFIHB3b2VyLgorCQkJLy9wcmludGsoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09cG93ZXIgc2xlZXBAamlmZmllczolZFxuIixqaWZmaWVzKTsKKworCQkJZm9yKFF1ZXVlSUQgPSAwLCBpID0gMDsgUXVldWVJRCA8IDY7ICkKKwkJCXsKKwkJCQlpZihnZXRfY3Vycl90eF9mcmVlX2Rlc2MoZGV2LFF1ZXVlSUQpID09IHByaXYtPnR4cmluZ2NvdW50KQorCQkJCXsKKwkJCQkJUXVldWVJRCsrOworCQkJCQljb250aW51ZTsKKwkJCQl9CisjaWYgMAkJLy9yZXNlcnZlZCBhbXkKKwkJCQllbHNlIGlmKHByaXYtPk5kaXNBZGFwdGVyLkN1cnJlbnRQb3dlclN0YXRlICE9IE5kaXNEZXZpY2VTdGF0ZUQwKQorCQkJCXsKKwkJCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUiwgREJHX0xPVUQsICgiZVJmU2xlZXA6ICVkIHRpbWVzIFRjYkJ1c3lRdWV1ZVslZF0gIT0wIGJ1dCBsb3dlciBwb3dlciBzdGF0ZSFcbiIsIChwTWdudEluZm8tPlR4UG9sbGluZ1RpbWVzKzEpLCBRdWV1ZUlEKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKyNlbmRpZgorCQkJCWVsc2UvL2x6bSBtb2QgMDgwODI2CisJCQkJeworCQkJCQlwcml2LT5UeFBvbGxpbmdUaW1lcyArKzsKKwkJCQkJaWYocHJpdi0+VHhQb2xsaW5nVGltZXMgPj0gTFBTX01BWF9TTEVFUF9XQUlUSU5HX1RJTUVTXzg3U0UpCisJCQkJCQl7CisJCQkJCQkJLy9SVF9UUkFDRShDT01QX1BPV0VSLCBEQkdfV0FSTklORywgKCJcblxuXG4gU2V0WmVicmFSRlBvd2VyU3RhdGU4MTg1QigpOmVSZlNsZWVwOiAgJWQgdGltZXMgVGNiQnVzeVF1ZXVlWyVkXSAhPSAwICEhIVxuXG5cbiIsIExQU19NQVhfU0xFRVBfV0FJVElOR19USU1FU184N1NFLCBRdWV1ZUlEKSk7CisJCQkJCQkJYkFjdGlvbkFsbG93ZWQ9ZmFsc2U7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJdWRlbGF5KDEwKTsgIC8vIFdpbmRvd3MgbWF5IGRlbGF5IDN+MTZtcyBhY3R1YWxseS4KKwkJCQkJCQkvL1JUX1RSQUNFKENPTVBfUE9XRVIsIERCR19MT1VELCAoImVSZlNsZWVwOiAlZCB0aW1lcyBUY2JCdXN5UXVldWVbJWRdICE9MCBiZWZvcmUgZG96ZSFcbiIsIChwTWdudEluZm8tPlR4UG9sbGluZ1RpbWVzKSwgUXVldWVJRCkpOworCQkJCQkJfQorCQkJCX0KKworCQkJCS8vbHptIGRlbCAwODA4MjYKKwkJCQkvL2lmKGkgPj0gTUFYX0RPWkVfV0FJVElOR19USU1FU184NUIpCisJCQkJLy97CisJCQkJCS8vcHJpbnRrKCJcblxuXG4gU2V0WmVicmFSRlBvd2VyU3RhdGU4MTg1QigpOiAlZCB0aW1lcyBCdXN5UXVldWVbJWRdICE9IDAgISEhXG5cblxuIiwgTUFYX0RPWkVfV0FJVElOR19USU1FU184NUIsIFF1ZXVlSUQpOworCQkJCQkvL2JyZWFrOworCQkJCS8vfQorCQkJfQorCisJCQlpZihiQWN0aW9uQWxsb3dlZCkvL2x6bSBhZGQgMDgwODI2CisJCQl7CisJCQkJLy90dXJuIG9mZiBCQiBSWElRIG1hdHJpeCB0byBjdXQgb2ZmIHJ4IHNpZ25hbAorLy8JCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHgwMDkwKTsgLy9vZmRtIDEwPTAwCisvLwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweDAwOTIpOyAvL29mZG0gMTI9MDAKKwkJCQl3cml0ZV9waHlfb2ZkbShkZXYsMHgxMCwweDAwKTsKKwkJCQl3cml0ZV9waHlfb2ZkbShkZXYsMHgxMiwweDAwKTsKKwkJCQkvL3R1cm4gb2ZmIFJGCisJCQkJUkZfV3JpdGVSZWcoZGV2LCAweDQsIDB4MDAwMCk7IC8vbWRlbGF5KDEpOworCQkJCVJGX1dyaXRlUmVnKGRldiwgMHgwLCAweDAwMDApOyAvL21kZWxheSgxKTsKKwkJCQkvL3R1cm4gb2ZmIEFGRSBleGNlcHQgUExMCisJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweDYyLCAweGZmKTsKKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4NTQsIDB4ZWMpOworLy8JCQkJbWRlbGF5KDEwKTsKKworI2lmIDEKKwkJCQltZGVsYXkoMSk7CisJCQkJeworCQkJCQlpbnQgaSA9IDA7CisJCQkJCXdoaWxlICh0cnVlKQorCQkJCQl7CisJCQkJCQl1OCB0bXAyNEYgPSByZWFkX25pY19ieXRlKGRldiwgMHgyNGYpOworCQkJCQkJaWYgKCh0bXAyNEYgPT0gMHgwMSkgfHwgKHRtcDI0RiA9PSAweDA5KSkKKwkJCQkJCXsKKwkJCQkJCQliVHVybk9mZkJCID0gdHJ1ZTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCWVsc2UvL2x6bSBtb2QgMDgwODI2CisJCQkJCQl7CisJCQkJCQkJdWRlbGF5KDEwKTsKKwkJCQkJCQlpKys7CisJCQkJCQkJcHJpdi0+VHhQb2xsaW5nVGltZXMrKzsKKworCQkJCQkJCWlmKHByaXYtPlR4UG9sbGluZ1RpbWVzID49IExQU19NQVhfU0xFRVBfV0FJVElOR19USU1FU184N1NFKQorCQkJCQkJCXsKKwkJCQkJCQkJLy9SVF9UUkFDRShDT01QX1BPV0VSLCBEQkdfV0FSTklORywgKCJcblxuXG4gU2V0WmVicmFSRlBvd2VyU3RhdGU4MTg1QigpOiBlUmZPZmY6ICVkIHRpbWVzIFJ4IE1hYzB4MjRGPTB4JXggISEhXG5cblxuIiwgaSwgdTFiVG1wMjRGKSk7CisJCQkJCQkJCWJUdXJuT2ZmQkI9ZmFsc2U7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCQllbHNlCisJCQkJCQkJeworCQkJCQkJCQl1ZGVsYXkoMTApOy8vIFdpbmRvd3MgbWF5IGRlbGF5IDN+MTZtcyBhY3R1YWxseS4KKwkJCQkJCQkJLy9SVF9UUkFDRShDT01QX1BPV0VSLCBEQkdfTE9VRCwoIiglZCllUmZTbGVlcC0gdTFiVG1wMjRGPSAweCVYXG4iLCBpLCB1MWJUbXAyNEYpKTsKKworCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQkJLy9sem0gZGVsIDA4MDgyNgorCQkJCQkJLy9pZiAoaSA+IE1BWF9QT0xMSU5HXzI0Rl9USU1FU184N1NFKQorCQkJCQkJLy8JYnJlYWs7CisJCQkJCX0KKwkJCQl9CisjZW5kaWYKKwkJCQlpZiAoYlR1cm5PZmZCQikvL2x6bSBtb2QgMDgwODI2CisJCQkJeworCQkJCS8vdHVybiBvZmYgQkIKKwkJCQl1MWJUbXAgPSByZWFkX25pY19ieXRlKGRldiwgMHgyNEUpOworCQkJCXdyaXRlX25pY19ieXRlKGRldiwgMHgyNEUsICh1MWJUbXB8QklUNXxCSVQ2KSk7CisKKwkJCQkvL3R1cm4gb2ZmIEFGRSBQTEwKKwkJCQkvL3dyaXRlX25pY19ieXRlKGRldiwgMHg1NCwgMHhlYyk7CisJCQkJLy93cml0ZV9uaWNfd29yZChkZXYsIDB4MzdDLCAweDAwZWMpOworCQkJCXdyaXRlX25pY19ieXRlKGRldiwgMHg1NCwgMHhGQyk7ICAvL1tFQ1NdIEZDLT4gRUMtPkZDLCBhc2tlZCBieSBTRDMgU3RldmVubAorCQkJCXdyaXRlX25pY193b3JkKGRldiwgMHgzN0MsIDB4MDBGQyk7Ly9bRUNTXSBGQy0+IEVDLT5GQywgYXNrZWQgYnkgU0QzIFN0ZXZlbmwKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIGVSZk9mZjoKKwkJCS8vIE1ha2Ugc3VyZSBCdXN5UXVldWUgaXMgZW1wdHkgYmVmb3IgdHVybiBvZmYgUkZFIHB3b2VyLgorCQkJLy9wcmludGsoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09cG93ZXIgb2ZmQGppZmZpZXM6JWRcbiIsamlmZmllcyk7CisJCQlmb3IoUXVldWVJRCA9IDAsIGkgPSAwOyBRdWV1ZUlEIDwgNjsgKQorCQkJeworCQkJCWlmKGdldF9jdXJyX3R4X2ZyZWVfZGVzYyhkZXYsUXVldWVJRCkgPT0gcHJpdi0+dHhyaW5nY291bnQpCisJCQkJeworCQkJCQlRdWV1ZUlEKys7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKyNpZiAwCisJCQkJZWxzZSBpZihBZGFwdGVyLT5OZGlzQWRhcHRlci5DdXJyZW50UG93ZXJTdGF0ZSAhPSBOZGlzRGV2aWNlU3RhdGVEMCkKKwkJCQl7CisJCQkJCVJUX1RSQUNFKENPTVBfUE9XRVIsIERCR19MT1VELCAoIiVkIHRpbWVzIFRjYkJ1c3lRdWV1ZVslZF0gIT0wIGJ1dCBsb3dlciBwb3dlciBzdGF0ZSFcbiIsIChpKzEpLCBRdWV1ZUlEKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKyNlbmRpZgorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXVkZWxheSgxMCk7CisJCQkJCWkrKzsKKwkJCQl9CisKKwkJCQlpZihpID49IE1BWF9ET1pFX1dBSVRJTkdfVElNRVNfODVCKQorCQkJCXsKKwkJCQkJLy9wcmludGsoIlxuXG5cbiBTZXRaZWJyYVJGUG93ZXJTdGF0ZTgxODVCKCk6ICVkIHRpbWVzIEJ1c3lRdWV1ZVslZF0gIT0gMCAhISFcblxuXG4iLCBNQVhfRE9aRV9XQUlUSU5HX1RJTUVTXzg1QiwgUXVldWVJRCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJLy90dXJuIG9mZiBCQiBSWElRIG1hdHJpeCB0byBjdXQgb2ZmIHJ4IHNpZ25hbAorLy8JCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweDAwOTApOyAvL29mZG0gMTA9MDAKKy8vCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHgwMDkyKTsgLy9vZmRtIDEyPTAwCisJCQl3cml0ZV9waHlfb2ZkbShkZXYsMHgxMCwweDAwKTsKKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwweDEyLDB4MDApOworCQkJLy90dXJuIG9mZiBSRgorCQkJUkZfV3JpdGVSZWcoZGV2LCAweDQsIDB4MDAwMCk7IC8vbWRlbGF5KDEpOworCQkJUkZfV3JpdGVSZWcoZGV2LCAweDAsIDB4MDAwMCk7IC8vbWRlbGF5KDEpOworCQkJLy90dXJuIG9mZiBBRkUgZXhjZXB0IFBMTAorCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweDYyLCAweGZmKTsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgMHg1NCwgMHhlYyk7CisvLwkJCW1kZWxheSgxMCk7CisjaWYgMQorCQkJbWRlbGF5KDEpOworCQkJeworCQkJCWludCBpID0gMDsKKwkJCQl3aGlsZSAodHJ1ZSkKKwkJCQl7CisJCQkJCXU4IHRtcDI0RiA9IHJlYWRfbmljX2J5dGUoZGV2LCAweDI0Zik7CisJCQkJCWlmICgodG1wMjRGID09IDB4MDEpIHx8ICh0bXAyNEYgPT0gMHgwOSkpCisJCQkJCXsKKwkJCQkJCWJUdXJuT2ZmQkIgPSB0cnVlOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQliVHVybk9mZkJCID0gZmFsc2U7CisJCQkJCQl1ZGVsYXkoMTApOworCQkJCQkJaSsrOworCQkJCQl9CisJCQkJCWlmIChpID4gTUFYX1BPTExJTkdfMjRGX1RJTUVTXzg3U0UpCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisjZW5kaWYKKwkJCWlmIChiVHVybk9mZkJCKS8vbHptIG1vZCAwODA4MjYKKwkJCXsKKworCQkJLy90dXJuIG9mZiBCQgorCQkJdTFiVG1wID0gcmVhZF9uaWNfYnl0ZShkZXYsIDB4MjRFKTsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgMHgyNEUsICh1MWJUbXB8QklUNXxCSVQ2KSk7CisJCQkvL3R1cm4gb2ZmIEFGRSBQTEwgKDgwTSkKKwkJCS8vd3JpdGVfbmljX2J5dGUoZGV2LCAweDU0LCAweGVjKTsKKwkJCS8vd3JpdGVfbmljX3dvcmQoZGV2LCAweDM3QywgMHgwMGVjKTsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgMHg1NCwgMHhGQyk7IC8vW0VDU10gRkMtPiBFQy0+RkMsIGFza2VkIGJ5IFNEMyBTdGV2ZW5sCisJCQl3cml0ZV9uaWNfd29yZChkZXYsIDB4MzdDLCAweDAwRkMpOyAvL1tFQ1NdIEZDLT4gRUMtPkZDLCBhc2tlZCBieSBTRDMgU3RldmVubAorCQkJfQorCisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYlJlc3VsdCA9IGZhbHNlOworCQkJcHJpbnRrKCJTZXRaZWJyYVJGUG93ZXJTdGF0ZTgxODUoKTogdW5rbm93IHN0YXRlIHRvIHNldDogMHglWCEhIVxuIiwgZVJGUG93ZXJTdGF0ZSk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwl9CisKKwkvLyBkaXNhYmxlIFBBUk1fRW4gaW4gQ29uZmlnMworCWJ0Q29uZmlnMyAmPSB+KENPTkZJRzNfUEFSTV9Fbik7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBDT05GSUczLCBidENvbmZpZzMpOworCS8vIGRpc2FibGUgRUVNMCBhbmQgRUVNMSBpbiA5MzQ2Q1IKKwlidENSOTM0NiAmPSB+KDB4QzApOworCXdyaXRlX25pY19ieXRlKGRldiwgQ1I5MzQ2LCBidENSOTM0Nik7CisKKwlpZihiUmVzdWx0ICYmIGJBY3Rpb25BbGxvd2VkKS8vbHptIG1vZCAwODA4MjYKKwl7CisJCS8vIFVwZGF0ZSBjdXJyZW50IFJGIHN0YXRlIHZhcmlhYmxlLgorCQlwcml2LT5lUkZQb3dlclN0YXRlID0gZVJGUG93ZXJTdGF0ZTsKKyNpZiAwCisJCXN3aXRjaChwcml2LT5lUkZQb3dlclN0YXRlKQorCQl7CisJCWNhc2UgZVJmT2ZmOgorCQkJLy8KKwkJCS8vSWYgUmYgb2ZmIHJlYXNvbiBpcyBmcm9tIElQUywgTGVkIHNob3VsZCBibGluayB3aXRoIG5vIGxpbmssIGJ5IE1hZGRlc3QgMDcxMDE1CisJCQkvLworCQkJaWYocHJpdi0+UmZPZmZSZWFzb249PVJGX0NIQU5HRV9CWV9JUFMgKQorCQkJeworCQkJCUFkYXB0ZXItPkhhbEZ1bmMuTGVkQ29udHJvbEhhbmRsZXIoQWRhcHRlcixMRURfQ1RMX05PX0xJTkspOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIFR1cm4gb2ZmIExFRCBpZiBSRiBpcyBub3QgT04uCisJCQkJQWRhcHRlci0+SGFsRnVuYy5MZWRDb250cm9sSGFuZGxlcihBZGFwdGVyLCBMRURfQ1RMX1BPV0VSX09GRik7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIGVSZk9uOgorCQkJLy8gVHVybiBvbiBSRiB3ZSBhcmUgc3RpbGwgbGlua2VkLCB3aGljaCBtaWdodCBoYXBwZW4gd2hlbgorCQkJLy8gd2UgcXVpY2tseSB0dXJuIG9mZiBhbmQgb24gSFcgUkYuIDIwMDYuMDUuMTIsIGJ5IHJjbmprby4KKwkJCWlmKCBwTWdudEluZm8tPmJNZWRpYUNvbm5lY3QgPT0gVFJVRSApCisJCQl7CisJCQkJQWRhcHRlci0+SGFsRnVuYy5MZWRDb250cm9sSGFuZGxlcihBZGFwdGVyLCBMRURfQ1RMX0xJTkspOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCS8vIGRvIG5vdGhpbmcuCisJCQlicmVhazsKKwkJfQorI2VuZGlmCisKKwl9CisKKwlwcml2LT5TZXRSRlBvd2VyU3RhdGVJblByb2dyZXNzID0gZmFsc2U7CisKKwlyZXR1cm4gKGJSZXN1bHQgJiYgYkFjdGlvbkFsbG93ZWQpIDsKK30KK3ZvaWQgcnRsODIyNXo0X3JmX3NsZWVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLy8KKwkvLyBUdXJuIG9mZiBSRiBwb3dlci4KKwkvLworCS8vcHJpbnRrKCI9PT09PT09PT0+JXMoKVxuIiwgX19mdW5jX18pOworCU1nbnRBY3RTZXRfUkZfU3RhdGUoZGV2LCBlUmZTbGVlcCwgUkZfQ0hBTkdFX0JZX1BTKTsKKwkvL21kZWxheSgyKTsJLy9GSVhNRQorfQordm9pZCBydGw4MjI1ejRfcmZfd2FrZXVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLy8KKwkvLyBUdXJuIG9uIFJGIHBvd2VyLgorCS8vCisJLy9wcmludGsoIj09PT09PT09PT4lcygpXG4iLCBfX2Z1bmNfXyk7CisJTWdudEFjdFNldF9SRl9TdGF0ZShkZXYsIGVSZk9uLCBSRl9DSEFOR0VfQllfUFMpOworfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODI1NS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9ydGw4MjU1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE2MjQ0NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODI1NS5jCkBAIC0wLDAgKzEsMTgzOCBAQAorLyoKKyAgVGhpcyBpcyBwYXJ0IG9mIHRoZSBydGw4MTgwLXNhMjQwMCBkcml2ZXIKKyAgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTCAoU2VlIGZpbGUgQ09QWUlORyBmb3IgZGV0YWlscykuCisgIENvcHlyaWdodCAoYykgMjAwNSBBbmRyZWEgTWVyZWxsbyA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisKKyAgVGhpcyBmaWxlcyBjb250YWlucyBwcm9ncmFtbWluZyBjb2RlIGZvciB0aGUgcnRsODI1NQorICByYWRpbyBmcm9udGVuZC4KKworICAqTWFueSogdGhhbmtzIHRvIFJlYWx0ZWsgQ29ycC4gZm9yIHRoZWlyIGdyZWF0IHN1cHBvcnQhCisKKyovCisKKyNkZWZpbmUgQkFORF9BIDEKKyNkZWZpbmUgQkFORF9CRyAyCisKKyNpbmNsdWRlICJyODE4MC5oIgorI2luY2x1ZGUgInI4MTgwX2h3LmgiCisjaW5jbHVkZSAicjgxODBfcnRsODI1NS5oIgorCit1MzIgcnRsODI1NV9jaGFuW10gPSB7CisJMCwJLy9kdW1teSBjaGFubmVsIDAKKwkweDEzLCAvLzEKKwkweDExNSwgLy8yCisJMHgyMTcsIC8vMworCTB4MjE5LCAvLzQKKwkweDMxYiwgLy81CisJMHg0MWQsIC8vNgorCTB4NDFmLCAvLzcKKwkweDYyMSwgLy84CisJMHg2MjMsIC8vOQorCTB4NjI1LCAvLzEwCisJMHg2MjcsIC8vMTEKKwkweDgyOSwgLy8xMgorCTB4ODJiLCAvLzEzCisJMHg5MmYsIC8vIDE0Cit9OworCitzdGF0aWMgc2hvcnQgcnRsODI1NV9nYWluXzJHW109eworCTB4MzMsIDB4MTcsIDB4N2MsIDB4YzUsLy8tNzgKKwkweDQzLCAweDE3LCAweDdhLCAweGM1LC8vLTc0CisJMHg1MywgMHgxNywgMHg3OCwgMHhjNSwvLy03MAorCTB4NjMsIDB4MTcsIDB4NzYsIDB4YzUsLy8tNjYKK307CisKKworc3RhdGljIHNob3J0IHJ0bDgyNTVfYWdjW109eworCTB4MSwgMHgxLCAweDEsIDB4MSwgMHgxLCAgICAgICAgIDB4MSwgMHgxLCAweDEsIDB4MSwgMHgxLAorCisJMHgxLCAweDEsIDB4MiwgMHgyLCAweDMsICAgICAgICAgMHgzLCAweDQsIDB4NCwgMHg1LCAweDUsCisJMHg2LCAweDYsIDB4NywgMHg3LCAweDgsICAgICAgICAgMHg4LCAweDksIDB4OSwgMHhhLCAweGEsCisJMHhiLCAweGIsIDB4YywgMHhjLCAweGQsICAgICAgICAgMHhkLCAweGUsIDB4ZSwgMHhmLCAweGYsCisKKwkweDEwLCAweDEwLCAweDExLCAweDExLCAweDEyLCAgICAweDEyLCAweDEzLCAweDEzLCAweDE0LCAweDE0LAorCTB4MTUsIDB4MTUsIDB4MTYsIDB4MTYsIDB4MTcsICAgIDB4MTcsIDB4MTgsIDB4MTgsIDB4MTksIDB4MTksCisJMHgxYSwgMHgxYSwgMHgxYiwgMHgxYiwgMHgxYywgICAgMHgxYywgMHgxZCwgMHgxZCwgMHgxZSwgMHgxZSwKKwkweDFmLCAweDFmLAorCisJMHgyMCwgMHgyMCwgMHgyMSwgMHgyMSwgMHgyMiwgICAgMHgyMiwgMHgyMywgMHgyMywgMHgyNCwgMHgyNCwKKwkweDI1LCAweDI1LCAweDI2LCAweDI2LCAweDI3LCAgICAweDI3LCAweDI4LCAweDI4LCAweDI5LCAweDI5LAorCTB4MmEsIDB4MmEsCisKKwkweDJhLCAweDJhLCAweDJhLCAweDJhLCAweDJhLCAgICAweDJhLCAweDJhLCAweDJhLCAweDJhLCAweDJhLAorCTB4MmEsIDB4MmEsIDB4MmEsIDB4MmEsIDB4MmEsICAgIDB4MmEsIDB4MmEsIDB4MmEsIDB4MmEsIDB4MmEsCisJMHgyYSwgMHgyYSwgMHgyYSwgMHgyYSwgMHgyYSwgICAgMHgyYSwgMHgyYSwgMHgyYSwgMHgyYSwgMHgyYSwKKwkweDJhLCAweDJhLCAweDJhLCAweDJhCisKK307CisKK3ZvaWQgcnRsODI1NV9zZXRfZ2FpbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBnYWluKQoreworCisvLwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MGQsIHJ0bDgyNTVfZ2Fpbl8yR1tnYWluICogNF0pOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyMywgcnRsODI1NV9nYWluXzJHW2dhaW4gKiA0ICsgMV0pOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxYiwgcnRsODI1NV9nYWluXzJHW2dhaW4gKiA0ICsgMl0pOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxZCwgcnRsODI1NV9nYWluXzJHW2dhaW4gKiA0ICsgM10pOworCS8vcnRsODIyNV9zZXRfZ2Fpbl91c2IoZGV2LCBnYWluKTsKK30KKwordm9pZCB3cml0ZV9ydGw4MjU1X3JlZzBjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkMSwgdTMyIGQyLCB1MzIgZDMsIHUzMiBkNCwKK3UzMiBkNSwgdTMyIGQ2LCB1MzIgZDcsIHUzMiBkOCwgdTMyIGQ5LCB1MzIgZDEwKQoreworCWludCBpLGo7CisJdTE2IG91dCxzZWxlY3Q7CisJdTggYml0OworCXUzMiBiYW5nZGF0YTsKKy8vCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXdyaXRlX25pY193b3JkKGRldixSRlBpbnNFbmFibGUsCisJCShyZWFkX25pY193b3JkKGRldixSRlBpbnNFbmFibGUpIHwgMHg3KSk7CisKKwlzZWxlY3QgPSByZWFkX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0KTsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0LCBzZWxlY3QgfCAweDcgfCBTV19DT05UUk9MX0dQSU8pOworCisJb3V0ID0gcmVhZF9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCkgJiAweGZmZjM7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgb3V0IHwgQkJfSE9TVF9CQU5HX0VOICk7Ly98IDB4MWZmZik7CisKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCXVkZWxheSgyKTsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBvdXQpOworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwl1ZGVsYXkoMik7CisKKwlmb3Ioaj0wO2o8MTA7aisrKQorCXsKKwkJc3dpdGNoKGopCisJCXsKKwkJCWNhc2UgOToKKwkJCWJhbmdkYXRhID0gZDEwIHwgMHgwYzsKKwkJCWJyZWFrOworCQkJY2FzZSA4OgorCQkJYmFuZ2RhdGEgPSBkOTsKKwkJCWJyZWFrOworCQkJY2FzZSA3OgorCQkJYmFuZ2RhdGEgPSBkODsKKwkJCWJyZWFrOworCQkJY2FzZSA2OgorCQkJYmFuZ2RhdGEgPSBkNzsKKwkJCWJyZWFrOworCQkJY2FzZSA1OgorCQkJYmFuZ2RhdGEgPSBkNjsKKwkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJYmFuZ2RhdGEgPSBkNTsKKwkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJYmFuZ2RhdGEgPSBkNDsKKwkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJYmFuZ2RhdGEgPSBkMzsKKwkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJYmFuZ2RhdGEgPSBkMjsKKwkJCWJyZWFrOworCQkJY2FzZSAwOgorCQkJYmFuZ2RhdGEgPSBkMTsKKwkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCWJhbmdkYXRhPTB4YmFkYzBkZTsgLyogYXZvaWQgZ2NjIGNvbXBsYWludHMgKi8KKwkJCWJyZWFrOworCQl9CisKKwkJZm9yKGk9MzE7IGk+PTA7aS0tKXsKKworCQkJYml0ID0gKGJhbmdkYXRhICYgKDE8PGkpKSA+PiBpOworCisJCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0IHwgb3V0KTsKKwkJCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJCQl1ZGVsYXkoMSk7CisJCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0IHwgb3V0IHwgQkJfSE9TVF9CQU5HX0NMSyk7CisJCQlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCQkJdWRlbGF5KDEpOworCQkvLwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0IHwgb3V0IHwgQkJfSE9TVF9CQU5HX0NMSyk7CisJCQlpLS07CisJCQliaXQgPSAoYmFuZ2RhdGEgJiAoMTw8aSkpID4+IGk7CisKKwkJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXQgfCBvdXQgfCBCQl9IT1NUX0JBTkdfQ0xLKTsKKwkJCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJCQl1ZGVsYXkoMSk7CisJCS8vCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXQgfCBvdXQgfCBCQl9IT1NUX0JBTkdfQ0xLKTsKKwkJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXQgfCBvdXQpOworCQkJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwkJCXVkZWxheSgxKTsKKwkJfQorCX0KKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBvdXQgfCBCQl9IT1NUX0JBTkdfRU4pOworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJdWRlbGF5KDEwKTsKKworLy8Jd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIG91dCB8IEJCX0hPU1RfQkFOR19FTik7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QsIHNlbGVjdCB8IFNXX0NPTlRST0xfR1BJTyk7CisvLwlydGw4MTg1X3JmX3BpbnNfZW5hYmxlKGRldik7CisKK30KKwordm9pZCB3cml0ZV9ydGw4MjU1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkciwgdTE2IGRhdGEpCit7CisJaW50IGk7CisJdTE2IG91dCxzZWxlY3Q7CisJdTggYml0OworCXUzMiBiYW5nZGF0YSA9IChkYXRhIDw8IDQpIHwgKGFkciAmIDB4Zik7CisvLwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlvdXQgPSByZWFkX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0KSAmIDB4ZmZmMzsKKworCXdyaXRlX25pY193b3JkKGRldixSRlBpbnNFbmFibGUsCisJCShyZWFkX25pY193b3JkKGRldixSRlBpbnNFbmFibGUpIHwgMHg3KSk7CisKKwlzZWxlY3QgPSByZWFkX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0KTsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0LCBzZWxlY3QgfCAweDcgfCBTV19DT05UUk9MX0dQSU8pOworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwl1ZGVsYXkoMTApOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIG91dCB8IEJCX0hPU1RfQkFOR19FTiApOy8vfCAweDFmZmYpOworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwl1ZGVsYXkoMik7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgb3V0KTsKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJdWRlbGF5KDEwKTsKKworCisJZm9yKGk9MTU7IGk+PTA7aS0tKXsKKworCQliaXQgPSAoYmFuZ2RhdGEgJiAoMTw8aSkpID4+IGk7CisKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIGJpdCB8IG91dCk7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXQgfCBvdXQgfCBCQl9IT1NUX0JBTkdfQ0xLKTsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIGJpdCB8IG91dCB8IEJCX0hPU1RfQkFOR19DTEspOworCQlpLS07CisJCWJpdCA9IChiYW5nZGF0YSAmICgxPDxpKSkgPj4gaTsKKworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgYml0IHwgb3V0IHwgQkJfSE9TVF9CQU5HX0NMSyk7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBiaXQgfCBvdXQgfCBCQl9IT1NUX0JBTkdfQ0xLKTsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIGJpdCB8IG91dCk7CisJfQorCisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgb3V0IHwgQkJfSE9TVF9CQU5HX0VOKTsKKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJdWRlbGF5KDEwKTsKKworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCBvdXQgfCBCQl9IT1NUX0JBTkdfRU4pOworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0LCBzZWxlY3QgfCBTV19DT05UUk9MX0dQSU8pOworCisJcnRsODE4NV9yZl9waW5zX2VuYWJsZShkZXYpOworfQorCit2b2lkIHJ0bDgyNTVfcmZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKworLy8JcnRsODE4MF9zZXRfYW5hcGFyYW0oZGV2LCBSVEw4MjI1X0FOQVBBUkFNX09GRik7CisvLwlydGw4MTg1X3NldF9hbmFwYXJhbTIoZGV2LCBSVEw4MjI1X0FOQVBBUkFNMl9PRkYpOworfQorCit2b2lkIHJ0bDgyNTVfU2V0VFhQb3dlckxldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IGNoKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXU4IGNja19wb3dlcl9sZXZlbCA9IDB4ZmYgJiBwcml2LT5jaHR4cHdyW2NoXTsKKwl1OCBvZmRtX3Bvd2VyX2xldmVsID0gMHhmZiAmIHByaXYtPmNodHhwd3Jfb2ZkbVtjaF07CisJd3JpdGVfbmljX2J5dGUoZGV2LCBUWF9HQUlOX09GRE0sIG9mZG1fcG93ZXJfbGV2ZWwpOworCXdyaXRlX25pY19ieXRlKGRldiwgVFhfR0FJTl9DQ0ssIGNja19wb3dlcl9sZXZlbCk7CisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwltZGVsYXkoMSk7CisJLy93cml0ZV9uaWNfYnl0ZShkZXYsIFRYX0FHQ19DT05UUk9MLDQpOworfQorI2lmIDAKKy8qIHN3aXRjaCBiZXR3ZWVuIG1vZGUgQiBhbmQgRyAqLwordm9pZCBydGw4MjU1X3NldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IG1vZGViKQoreworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNSwgKG1vZGViID8gMHgwIDogMHg0MCkpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNywgKG1vZGViID8gMHgwIDogMHg0MCkpOworfQorI2VuZGlmCisKK3ZvaWQgcnRsODI1NV9yZl9zZXRfY2hhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBjaCkKK3sKKwkvL3dyaXRlX3J0bDgyMjUoZGV2LCAweDcsIHJ0bDgyMjVfY2hhblsxXSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NSwgMHg2NSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NiwgcnRsODI1NV9jaGFuW2NoXSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NywgMHg3Yyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4OCwgMHg2KTsKKworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCXNjaGVkdWxlX3RpbWVvdXQoSFopOworLy8JcnRsODIyNV9zZXRfbW9kZV9CKGRldik7CisKKwlydGw4MjU1X1NldFRYUG93ZXJMZXZlbChkZXYsIGNoKTsKKwkvKiBGSVhNRSBGSVhNRSBGSVhNRSAqLworCisJI2lmIDAKKwl3cml0ZV9uaWNfYnl0ZShkZXYsRElGUywweGUpOyAvL0RJRlMKKwl3cml0ZV9uaWNfYnl0ZShkZXYsU0xPVCwweDE0KTsgLy9TTE9UCisJd3JpdGVfbmljX2J5dGUoZGV2LEVJRlMsMHg1Yik7IC8vIEVJRlMKKwkvL3dyaXRlX25pY19ieXRlKGRldiwweGJjLDApOyAvL0NXIENPTkZJRworCXdyaXRlX25pY19ieXRlKGRldiwweGJkLDB4YTQpOyAvL0NXIFZBTFVFCisJLy93cml0ZV9uaWNfYnl0ZShkZXYsVFhfQUdDX0NPTlRST0wsNCk7CisJLy93cml0ZV9uaWNfYnl0ZShkZXYsIDB4OWQsNyk7CisvL0FwciAyMCAxMzoyNTowMyBsb2NhbGhvc3Qga2VybmVsOiB3OC4gNDA5ZDwtNyAgLy8gQ0NLIEFHQworCS8qd3JpdGVfbmljX3dvcmQoZGV2LDB4ODQsMHg0ODgpOworCXdyaXRlX25pY19ieXRlKGRldiwweDkxLDB4M2UpOworCXdyaXRlX25pY19ieXRlKGRldiwweDkwLDB4MzApOworCXdyaXRlX25pY193b3JkKGRldiwweDg0LDB4NDg4KTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsMHg5MSwweDNlKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsMHg5MCwweDIwKTsKKwkqLworCS8vbWRlbGF5KDEwMCk7CisJI2VuZGlmCit9CisKK3ZvaWQgcnRsODI1NV9pbml0X0JHYmFuZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MTg3Y2YsIDB4NDAwMDAwMjcsCisJCTB4OTI0MDJhYzAsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwMCk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQxODdjZSwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmFjMCwgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzAxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUwMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMDEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MDEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEwMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MDEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDAxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDAxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MDEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDAxKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDE4YmRmLCAweDQwMDAwMDI3LAorCQkweDkyNDAyYWM0LCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMDIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTAyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTAyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjAyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDIpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MThiYmYsIDB4NDAwMDAwMjcsCisJCTB4OTI0MDJhYzQsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMDMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzAzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODAzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMDMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODAzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MDMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDAzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjAzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwMyk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQxOGI5ZiwgMHg0MDAwMDAyNywKKwkJMHg5MjQwMmFjOCwgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzA0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUwNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMDQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MDQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEwNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MDQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDA0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDA0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MDQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDA0KTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDE4M2RmLCAweDQwMDAwMDI3LAorCQkweDkyNDAyYWM4LCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMDUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTA1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTA1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjA1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDUpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MTgzY2YsIDB4MjcsCisJCTB4OTI0MDJhY2MsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMDYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzA2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODA2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMDYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODA2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MDYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDA2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjA2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwNik7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQxODNhZiwgMHgyNywKKwkJMHg5MjQwMmFjYywgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDA3KTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA4M2Q3LCAweDQwMDAwMDI3LAorCQkweDkyNDAyYWQwLCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMDgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTA4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTA4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjA4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MDgpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDgzYzcsIDB4MjcsCisJCTB4OTI0MDJhZDAsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMDkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzA5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODA5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMDkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODA5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MDkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDA5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjA5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwOSk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDNkNywgMHg0MDAwMDAyNywKKwkJMHg5MjQwMmFkNCwgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzBhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUwYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMGEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MGEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEwYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MGEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDBhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MGEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDBhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MGEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDBhKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0M2Q3LCAweDQwMDAwMDI3LAorCQkweDkyNDAyYWQ0LCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMGIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTBiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTBiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MGIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjBiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MGIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MGIpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQzYzcsIDB4MjcsCisJCTB4OTI0MDJhZDgsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMGMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzBjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODBjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMGMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODBjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MGMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDBjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjBjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwYyk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDNhNywgMHgyNywKKwkJMHg5MjQwMmFkOCwgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzBkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUwZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMGQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MGQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEwZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MGQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDBkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MGQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDBkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MGQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDBkKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0Mzg3LCAweDI3LAorCQkweDkyNDAyYWE4LCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMGUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTBlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTBlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgwZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MGUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjBlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MGUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYwZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MGUpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQxYzcsIDB4MjcsCisJCTB4OTI0MDJhYTgsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMwZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMGYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzBmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODBmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMGYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODBmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MGYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDBmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjBmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQwZik7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDFhNywgMHgyNywKKwkJMHg5MjQwMmFhYywgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzEwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUxMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMTApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MTApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGExMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MTApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDEwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDEwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MTApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDEwKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MTg3LCAweDI3LAorCQkweDkyNDAyYWFjLCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMTEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTExKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTExKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjExKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTEpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQxODYsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhYjAsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMTIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzEyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODEyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMTIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODEyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MTIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDEyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjEyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxMik7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDE4NiwgMHgyNywKKwkJMHg5MjQwMmFiMCwgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzEzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUxMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMTMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MTMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGExMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MTMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDEzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDEzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MTMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDEzKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MTQ2LCAweDI3LAorCQkweDkyNDAyYWI0LCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMTQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTE0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTE0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjE0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTQpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQxMjYsIDB4MjcsCisJCTB4OTI0MDJhYjQsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMTUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzE1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODE1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMTUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODE1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MTUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDE1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjE1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxNSk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDEwNiwgMHgyNywKKwkJMHg5MjQwMmFiOCwgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzE2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUxNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMTYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MTYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGExNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MTYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDE2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDE2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MTYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDE2KTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MTA1LCAweDI3LAorCQkweDkyNDAyYWI4LCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMTcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTE3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTE3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjE3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTcpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQxMDQsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhODgsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMTgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzE4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODE4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMTgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODE4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MTgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDE4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjE4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxOCk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDEwNCwgMHgyNywKKwkJMHg5MjQwMmE4OCwgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzE5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUxOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMTkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MTkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGExOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MTkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDE5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MTkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDE5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MTkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDE5KTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDQ0LCAweDI3LAorCQkweDkyNDAyYThjLCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMWEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTFhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTFhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MWEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjFhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MWEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MWEpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMjQsIDB4MjcsCisJCTB4OTI0MDJhOGMsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMWIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzFiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODFiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMWIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODFiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MWIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDFiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjFiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxYik7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwNCwgMHgyNywKKwkJMHg5MjQwMmE5MCwgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzFjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUxYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMWMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MWMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGExYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MWMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDFjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MWMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDFjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MWMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDFjKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDAxLCAweDI3LAorCQkweDkyNDAyYTkwLCAweGYwMDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMWQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTFkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTFkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgxZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MWQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjFkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MWQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MWQpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhOTQsIDB4ZjAwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMxZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMWUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzFlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODFlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMWUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODFlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MWUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDFlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjFlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQxZSk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMCwgMHgyNywKKwkJMHg5MjQwMmE5NCwgMHhmMDAwOSwgMHgyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzFmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUxZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMWYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MWYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGExZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MWYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDFmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYxZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MWYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDFmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MWYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDFmKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDIwLCAweDgwMDAwMDI3LAorCQkweDkyNDAyYTk4LCAweGY4MDA5LCAweDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMjApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTIwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTIwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjIwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjApOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMjAsIDB4MjcsCisJCTB4OTI0MDJhOTgsIDB4ZjgwMDksIDB4MjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMjEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzIxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODIxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMjEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODIxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MjEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDIxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjIxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyMSk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmE2OCwgMHhmMDAwOSwgMHgxMDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzIyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUyMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMjIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MjIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEyMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MjIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDIyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDIyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MjIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDIyKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDEwLCAweDgwMDAwMDI3LAorCQkweDkyNDAyYTY4LCAweGYwMDA5LCAweDIwMDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMjMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTIzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTIzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjIzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjMpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMTAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhNmMsIDB4ZjAwMDksIDB4MzAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMjQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzI0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODI0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMjQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODI0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MjQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDI0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjI0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyNCk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAxMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmE2YywgMHhmMDAwOSwgMHg0MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDI1KTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDAwLCAweDgwMDAwMDI3LAorCQkweDkyNDAyYTcwLCAweGYwMDA5LCAweDYwMDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjYpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMzEsIDB4NDAwMDAwMjcsCisJCTB4OTI0MDJhNzAsIDB4ZjAwMTEsIDB4NjAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMjcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzI3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODI3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMjcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODI3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MjcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDI3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjI3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyNyk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAxMSwgMHg0MDAwMDAyNywKKwkJMHg5MjQwMmE3NCwgMHhmMDAxMSwgMHg2MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzI4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUyOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMjgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MjgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEyOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MjgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDI4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDI4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MjgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDI4KTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDEwLCAweGMwMDAwMDI3LAorCQkweDkyNDAyYTc0LCAweGYwMDExLCAweDYwMDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMjkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTI5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTI5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjI5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MjkpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhNzgsIDB4ZjAwMTEsIDB4NjAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMmEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzJhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODJhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMmEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODJhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MmEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDJhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjJhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyYSk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmE3OCwgMHhmMDAxMSwgMHg3MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzJiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUyYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMmIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MmIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEyYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MmIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDJiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MmIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDJiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MmIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDJiKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDAwLCAweDgwMDAwMDI3LAorCQkweDkyNDAyYTQ4LCAweGYwMDE5LCAweDcwMDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMmMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTJjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTJjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MmMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjJjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MmMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MmMpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhNDgsIDB4ZjgwMTksIDB4NzAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMmQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzJkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODJkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMmQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODJkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MmQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDJkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjJkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyZCk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmE0YywgMHhmODAxOSwgMHg3MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzJlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUyZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMmUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MmUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEyZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MmUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDJlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MmUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDJlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MmUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDJlKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDAwLCAweDgwMDAwMDI3LAorCQkweDkyNDAyYTRjLCAweGY4MDE5LCAweDcwMDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMmYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTJmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMyZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTJmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgyZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MmYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjJmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQyZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MmYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYyZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MmYpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhNTAsIDB4ZjgwMTksIDB4NzAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMzApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzMwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODMwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMzApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODMwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MzApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDMwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjMwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzMCk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmE1MCwgMHhmODAxOSwgMHg3MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzMxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUzMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMzEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MzEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEzMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MzEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDMxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYzMSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDMxKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MzEpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDMxKTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDAwLCAweDgwMDAwMDI3LAorCQkweDkyNDAyYTU0LCAweGY4MDE5LCAweDcwMDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMzIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTMyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgzMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTMyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgzMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjMyKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzIpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYzMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzIpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhNTQsIDB4ZjgwMTksIDB4NzAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMzMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzMzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODMzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMzMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODMzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MzMpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDMzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzMyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjMzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzMyk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmE1OCwgMHhmODAxOSwgMHg3MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzM0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUzNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMzQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MzQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEzNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MzQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDM0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYzNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDM0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MzQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDM0KTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDAwLCAweDgwMDAwMDI3LAorCQkweDkyNDAyYTU4LCAweGY4MDE5LCAweDcwMDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMzUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTM1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgzNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTM1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgzNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjM1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYzNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzUpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhMjQsIDB4ZjgwMTksIDB4NzAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMzYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzM2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODM2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMzYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODM2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MzYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDM2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzNik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjM2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzNik7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmEyNCwgMHhmODAxOSwgMHg3MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzM3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUzNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMzcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MzcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEzNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4MzcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDM3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDI0KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDI1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYzNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDM3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDEwMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MzcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDM3KTsKKwl3cml0ZV9ydGw4MjU1X3JlZzBjKGRldiwgMHgxNTU0LCAweGE4MDA0MDNiLCAweGY2ZDQ0Mjc4LCAweDgwNDA0MDAwLCAweDgwMDAwMDI3LAorCQkweDkyNDAyYTI4LCAweGY4MDE5LCAweDcwMDI4MDAwLCAweGMwMCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDgwNyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjMzgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ZTM4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgzOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgyLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YTM4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDgzOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjQpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjM4KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzgpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MTAwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDYzOCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg0MzgpOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDE1NTQsIDB4YTgwMDQwM2IsIDB4ZjZkNDQyNzgsIDB4ODA0MDQwMDAsIDB4ODAwMDAwMjcsCisJCTB4OTI0MDJhMjgsIDB4ZjgwMTksIDB4NzAwMjgwMDAsIDB4YzAwLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4ODA3KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGMzOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhlMzkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzM5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODM5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhhMzkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4ODM5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgyNCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgyNSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2MzkpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDM5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzOSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjM5KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzOSk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmEwMCwgMHhmODAxOSwgMHg3MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzNhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUzYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjM2EpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4M2EpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEzYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4M2EpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDNhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2M2EpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDNhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzYSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjNhKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzYSk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmEwMCwgMHhmODAxOSwgMHg3MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzNiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUzYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjM2IpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4M2IpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEzYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4M2IpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDNiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2M2IpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDNiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzYik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjNiKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzYik7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmEwMCwgMHhmODAxOSwgMHg3MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzNjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUzYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjM2MpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4M2MpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEzYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4M2MpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDNjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2M2MpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDNjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzYyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjNjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzYyk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmEwMCwgMHhmODAxOSwgMHg3MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzNkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUzZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjM2QpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4M2QpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEzZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4M2QpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDNkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2M2QpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDNkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzZCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjNkKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzZCk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmEwMCwgMHhmODAxOSwgMHg3MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzNlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUzZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjM2UpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4M2UpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEzZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4M2UpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDNlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2M2UpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDNlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzZSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjNlKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzZSk7CisJd3JpdGVfcnRsODI1NV9yZWcwYyhkZXYsIDB4MTU1NCwgMHhhODAwNDAzYiwgMHhmNmQ0NDI3OCwgMHg4MDQwNDAwMCwgMHg4MDAwMDAyNywKKwkJMHg5MjQwMmEwMCwgMHhmODAxMSwgMHg3MDAyODAwMCwgMHhjMDAsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHg4MDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4YzNmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGUzZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHhjM2YpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4M2YpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MiwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweGEzZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg4M2YpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDNmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgzLCAweDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHg2M2YpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NDNmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MywgMHgxMDApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4NjNmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg0LCAweDQzZik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4NCwgMHgwKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHgxLCAweDApOworCXdyaXRlX3J0bDgyNTVfcmVnMGMoZGV2LCAweDM1MzksIDB4NzAwMDBjMDMsIDB4ZmVmNDYxNzgsIDB4NDA4MDAwLCAweDQwMzMwNywKKwkJMHg5MjRmODBjMCwgMHhmOTU1YywgMHg4NDAwLCAweDQyOTIwMCwgMHgxY2UyMCk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4MSwgMHgxYzcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDIsIDB4MjYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDMsIDB4MjcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDEsIDB4NDcpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDQsIDB4OThjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg1LCAweDY1KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg2LCAweDEzKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg3LCAweDdjKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg4LCAweDYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweDgsIDB4Nyk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4OCwgMHg2KTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHg5LCAweGNlMik7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4YiwgMHgxYzUpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweGQsIDB4ZDdmKTsKKwl3cml0ZV9ydGw4MjU1KGRldiwgMHhlLCAweDM2OSk7CisJd3JpdGVfcnRsODI1NShkZXYsIDB4YSwgMHhkNTYpOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweGEsIDB4ZDU3KTsKKwltZGVsYXkoMjApOworCXdyaXRlX3J0bDgyNTUoZGV2LCAweGQsIDB4ZDdlKTsKKworfQorCisKK3ZvaWQgcnRsODI1NV9zZXRfYmFuZF9wYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBiYW5kKQoreworCWlmKGJhbmQgIT0gQkFORF9BKXsKKwkJd3JpdGVfbmljX2R3b3JkKGRldiwgMHg5NCwgMHgzZGMwMDAwMik7CisJCXdyaXRlX25pY19kd29yZChkZXYsIDB4ODgsIDB4MDAxMDAwNDApOworCisJCXdyaXRlX3BoeV9jY2soZGV2LCAweDEzLCAweGQwKTsKKworCQl3cml0ZV9waHlfY2NrKGRldiwgMHg0MSwgMHg5ZCk7CisJCXdyaXRlX25pY19kd29yZChkZXYsIDB4OGMsIDB4MDAwODIyMDUpOworCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4YjQsIDB4NjYpOworCX0KK30KKwordm9pZCBydGw4MjU1X3JmX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50IGk7CisJdTE2IGJyc3I7CisvLwlzaG9ydCBjaGFubmVsIC8qPSBwcml2LT5jaGFuKi8gPSAxOworCXByaXYtPmNoYW4gPSAxOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIDB4ODApOworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0LCAweDgwIHwgU1dfQ09OVFJPTF9HUElPKTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc0VuYWJsZSwgMHg4MCk7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QsIFNXX0NPTlRST0xfR1BJTyk7CisKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSRl9USU1JTkcsIDB4MDAwZjgwMGYpOworCisJYnJzciA9IHJlYWRfbmljX3dvcmQoZGV2LCBCUlNSKTsKKworCXdyaXRlX25pY193b3JkKGRldiwgMHgyYywgMHhmZmZmKTsKKworCisJcnRsODE4MF9zZXRfYW5hcGFyYW0oZGV2LCBSVEw4MjU1X0FOQVBBUkFNX09OKTsKKwlydGw4MTg1X3NldF9hbmFwYXJhbTIoZGV2LCBSVEw4MjU1X0FOQVBBUkFNMl9PTik7CisKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCAweDk0LCAweDExYzAwMDAyKTsKKworCXdyaXRlX25pY19kd29yZChkZXYsIFJGX1BBUkEsIDB4MTAwMDQwKTsKKworCXJ0bDgxODVfcmZfcGluc19lbmFibGUoZGV2KTsKKworCXJ0bDgyNTVfaW5pdF9CR2JhbmQoZGV2KTsKKwlydGw4MjU1X3NldF9iYW5kX3BhcmFtKGRldixCQU5EX0JHKTsKKworCXdyaXRlX3BoeV9jY2soZGV2LCAweDAsIDB4OTgpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDMsIDB4MjApOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQsIDB4MmUpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDUsIDB4MTIpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDYsIDB4ZmMpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDcsIDB4ZDgpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDgsIDB4MmUpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDEwLCAweGQzKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgxMSwgMHg4OCk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTIsIDB4NDcpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDEzLCAweGQwKTsgLyogVmVyIEMgJiBEICYgODE4NyovCisKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgxOSwgMHgwKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgxYSwgMHhhMCk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4MWIsIDB4OCk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDAsIDB4ODYpOyAvKiBDQ0sgQ2FycmllciBTZW5zZSBUaHJlc2hvbGQgKi8KKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0MSwgMHg5ZCk7IC8qIEVuZXJneSBUaHJlc2hvbGQgKi8KKwkvL3dyaXRlX3BoeV9jY2soZGV2LCAweDQyLCAweDApOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQzLCAweDgpOworCisJd3JpdGVfbmljX2J5dGUoZGV2LCBURVNUUiwweDgpOworCisJZm9yKGk9MDtpPDEyODtpKyspeworCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4NGIsIHJ0bDgyNTVfYWdjW2ldKTsKKwkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDRhLCAodTgpaSsgMHg4MCk7CisJfQorCisKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MCwgMHgxKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MSwgMHgyKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MiwgMHg0Myk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDMsIDB4MCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDQsIDB4MCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDUsIDB4MCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDYsIDB4NDApOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHg3LCAweDApOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHg4LCAweDQwKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4OSwgMHhmZSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweGEsIDB4OSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweGIsIDB4ODApOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhjLCAweDEpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHhkLCAweDQzKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4ZSwgMHhkMyk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweGYsIDB4MzgpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxMCwgMHg0KTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTEsIDB4MDYpOy8qYWdjIHJlc3AgdGltZSA3MDAqLworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxMiwgMHgyMCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDEzLCAweDIwKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTQsIDB4MCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE1LCAweDQwKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTYsIDB4MCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE3LCAweDQwKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTgsIDB4ZWYpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxOSwgMHgyNSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDFhLCAweDIwKTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWIsIDB4N2EpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxYywgMHg4NCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDFlLCAweDk1KTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MWYsIDB4NzUpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyMCwgMHgxZik7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDIxLCAweDE3KTsKKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjIsIDB4MTYpOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyMywgMHg3MCk7IC8vRklYTUUgbWF5YmUgbm90IG5lZWRlZAorCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNCwgMHg3MCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI1LCAweDApOworCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNiwgMHgxMCk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI3LCAweDg4KTsKKworCisJd3JpdGVfbmljX2R3b3JkKGRldiwgMHg5NCwgMHgzZGMwMDAwMik7IC8vQkFORCBERVBFTkQuCisvLwl3cml0ZV9uaWNfZHdvcmQoZGV2LCAweDk0LCAweDE1YzAwMDAyKTsgLy9CQU5EIERFUEVORC4KKworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQsIDB4MTgpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQzLCAweDE4KTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg2LCAweGRjKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0NCwgMHgyYik7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDUsIDB4MmIpOworCXdyaXRlX3BoeV9jY2soZGV2LCAweDQ2LCAweDI1KTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0NywgMHgxNSk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDgsIDB4MCk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDksIDB4MCk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NGEsIDB4MCk7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NGIsIDB4MCk7CisvLwl3cml0ZV9waHlfY2NrKGRldiwgMHg0YywgMHg1KTsKKyNpZiAwCisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDEsIDB4OWQpOyAvKiBFbmVyZ3kgVGhyZXNob2xkICovCisJLy8gVEVTVFIgMHhiIDgxODcKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgxMCwgMHg5Myk7Ly8gJiAweGZiKTsKKyNlbmRpZgorCS8vcnRsODI1NV9zZXRfZ2FpbihkZXYsIDEpOyAvKiBGSVhNRSB0aGlzICcxJyBpcyByYW5kb20gKi8KKworCXJ0bDgyNTVfU2V0VFhQb3dlckxldmVsKGRldiwgcHJpdi0+Y2hhbik7CisKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgxMCwgMHg5MyB8MHg0KTsgLyogUnggYW50IEIsIDB4ZDMgZm9yIEEgKi8KKwl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjYsIDB4OTApOyAvKiBSeCBhbnQgQiwgMHgxMCBmb3IgQSAqLworCisJcnRsODE4NV90eF9hbnRlbm5hKGRldiwgMHgzKTsgLyogVFggYW50IEIsIDB4MCBmb3IgQSovCisJLyogbWFrZSBzdXJlIGlzIHdha2VuIHVwISAqLworCXJ0bDgxODBfc2V0X2FuYXBhcmFtKGRldiwgUlRMODI1NV9BTkFQQVJBTV9PTik7CisJcnRsODE4NV9zZXRfYW5hcGFyYW0yKGRldiwgUlRMODI1NV9BTkFQQVJBTTJfT04pOworCisJcnRsODI1NV9zZXRfYmFuZF9wYXJhbShkZXYsQkFORF9CRyk7CisKKwl3cml0ZV9waHlfY2NrKGRldiwgMHg0MSwgMHg5ZCk7CisKKwlydGw4MjU1X3NldF9nYWluKGRldiwgNCk7CisJLy9ydGw4MjU1X3NldF9lbmVyZ3lfdGhyZXNob2xkKGRldik7CisJd3JpdGVfcGh5X2NjayhkZXYsIDB4NDEsIDB4OWQpOworCXJ0bDgyNTVfcmZfc2V0X2NoYW4oZGV2LCBwcml2LT5jaGFuKTsKKworCXdyaXRlX25pY193b3JkKGRldiwgQlJTUiwgYnJzcik7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODI1NS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9ydGw4MjU1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU0NGNhNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODI1NS5oCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgIFRoaXMgaXMgcGFydCBvZiB0aGUgcnRsODE4MC1zYTI0MDAgZHJpdmVyCisgIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwgKFNlZSBmaWxlIENPUFlJTkcgZm9yIGRldGFpbHMpLgorICBDb3B5cmlnaHQgKGMpIDIwMDUgQW5kcmVhIE1lcmVsbG8gPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorCisgIFRoaXMgZmlsZXMgY29udGFpbnMgcHJvZ3JhbW1pbmcgY29kZSBmb3IgdGhlIHJ0bDgyNTUKKyAgcmFkaW8gZnJvbnRlbmQuCisKKyAgKk1hbnkqIHRoYW5rcyB0byBSZWFsdGVrIENvcnAuIGZvciB0aGVpciBncmVhdCBzdXBwb3J0IQorCisqLworCisjZGVmaW5lIFJUTDgyNTVfQU5BUEFSQU1fT04gMHhhMDAwMGI1OQorI2RlZmluZSBSVEw4MjU1X0FOQVBBUkFNMl9PTiAweDg0MGNmMzExCisKKwordm9pZCBydGw4MjU1X3JmX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgyNTVfcmZfc2V0X2NoYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldixzaG9ydCBjaCk7Cit2b2lkIHJ0bDgyNTVfcmZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3NhMjQwMC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9zYTI0MDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjQ5NTYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9zYTI0MDAuYwpAQCAtMCwwICsxLDIzMyBAQAorLyoKKyAgIFRoaXMgZmlsZXMgY29udGFpbnMgUEhJTElQUyBTQTI0MDAgcmFkaW8gZnJvbnRlbmQgcHJvZ3JhbW1pbmcgcm91dGluZXMuCisKKyAgIFRoaXMgaXMgcGFydCBvZiBydGw4MTgwIE9wZW5Tb3VyY2UgZHJpdmVyCisgICBDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQtMjAwNSAgPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorICAgUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdQTCAoR2VuZXJhbCBQdWJsaWMgTGljZW5jZSkKKworICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBHUEwgcGFydCBvZiB0aGUKKyAgIG9mZmljaWFsIHJlYWx0ZWsgZHJpdmVyCisKKyAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgcnRsODE4MCBkcml2ZXIgc2tlbGV0b24KKyAgIGZyb20gUGF0cmljIFNjaGVua2UgJiBBbmRyZXMgU2Fsb21vbgorCisgICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEludGVsIFBybyBXaXJlbGVzcyAyMTAwIEdQTCBkcml2ZXIuCisKKyAgIENvZGUgYXQgaHR0cDovL2NoZS5vamN0ZWNoLmNvbS9+ZHlvdW5nL3J0dy8gaGFzIGJlZW4gdXNlZnVsIHRvIG1lIHRvCisgICB1bmRlcnN0YW5kIHNvbWUgdGhpbmdzLgorCisgICBDb2RlIGZyb20gcnRsODE4MSBwcm9qZWN0IGhhcyBiZWVuIHVzZWZ1bCB0byBtZSB0byB1bmRlcnN0YW5kIHNvbWUgdGhpbmdzLgorCisgICBXZSB3YW50IHRvIHRhbmtzIHRoZSBBdXRob3JzIG9mIHN1Y2ggcHJvamVjdHMgYW5kIHRoZSBOZGlzd3JhcHBlcgorICAgcHJvamVjdCBBdXRob3JzLgorKi8KKworCisjaW5jbHVkZSAicjgxODAuaCIKKyNpbmNsdWRlICJyODE4MF9ody5oIgorI2luY2x1ZGUgInI4MTgwX3NhMjQwMC5oIgorCisKKy8vI2RlZmluZSBERUJVR19TQTI0MDAKKwordTMyIHNhMjQwMF9jaGFuW10gPSB7CisJMHgwLAkvL2R1bW15IGNoYW5uZWwgMAorCTB4MDAwOTZjLCAvLzEKKwkweDA4MDk3MCwgLy8yCisJMHgxMDA5NzQsIC8vMworCTB4MTgwOTc4LCAvLzQKKwkweDAwMDk4MCwgLy81CisJMHgwODA5ODQsIC8vNgorCTB4MTAwOTg4LCAvLzcKKwkweDE4MDk4YywgLy84CisJMHgwMDA5OTQsIC8vOQorCTB4MDgwOTk4LCAvLzEwCisJMHgxMDA5OWMsIC8vMTEKKwkweDE4MDlhMCwgLy8xMgorCTB4MDAwOWE4LCAvLzEzCisJMHgwMDA5YjQsIC8vMTQKK307CisKKwordm9pZCByZl9zdGFiaWxpemUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCW1kZWxheSgzKTsgLy9mb3Igbm93IHVzZSBhIGdyZWF0IHZhbHVlLi4gd2UgbWF5IG9wdGltaXplIGluIGZ1dHVyZQorfQorCisKK3ZvaWQgd3JpdGVfc2EyNDAwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsdTggYWRyLCB1MzIgZGF0YSkKK3sKKy8vCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIgcGh5X2NvbmZpZzsKKworICAgICAgICAvLyBwaGlsaXBzIHNhMjQwMCBleHBlY3RzIDI0IGJpdHMgZGF0YQorCisJLyppZihhZHIgPT0gNCAmJiBwcml2LT5kaWdwaHkpeworCQlwaHlfY29uZmlnPTB4NjAwMDAwMDA7CisJfWVsc2V7CisJCXBoeV9jb25maWc9MHhiMDAwMDAwMDsKKwl9Ki8KKworCXBoeV9jb25maWcgPSAweGIwMDAwMDAwOyAvLyBNQUMgd2lsbCBiYW5nIGJpdHMgdG8gdGhlIHNhMjQwMAorCisJcGh5X2NvbmZpZyB8PSAoKCh1MzIpKGFkciYweGYpKTw8IDI0KTsKKwlwaHlfY29uZmlnIHw9IChkYXRhICYgMHhmZmZmZmYpOworCXdyaXRlX25pY19kd29yZChkZXYsUEhZX0NPTkZJRyxwaHlfY29uZmlnKTsKKyNpZmRlZiBERUJVR19TQTI0MDAKKwlETUVTRygiV3JpdGluZyBzYTI0MDA6ICV4IChhZHIgJXgpIixwaHlfY29uZmlnLGFkcik7CisjZW5kaWYKKwlyZl9zdGFiaWxpemUoZGV2KTsKK30KKworCisKK3ZvaWQgc2EyNDAwX3dyaXRlX3BoeV9hbnRlbm5hKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsc2hvcnQgY2gpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXU4IGFudDsKKworCWFudCA9IFNBMjQwMF9BTlRFTk5BOworCWlmKHByaXYtPmFudGIpIC8qZGVmYXVsdCBhbnRlbm5hIGlzIGFudGVubmEgQiAqLworCQlhbnQgfD0gQkJfQU5URU5OQV9COworCWlmKGNoID09IDE0KQorCQlhbnQgfD0gQkJfQU5UQVRURU5fQ0hBTjE0OworCXdyaXRlX3BoeShkZXYsMHgxMCxhbnQpOworCS8vRE1FU0coIkJCIGFudGVubmEgJXggIixhbnQpOworfQorCisKKy8qIGZyb20gdGhlIHJ0bDgxODEgZW1iZWRkZWQgZHJpdmVyICovCitzaG9ydCBzYTI0MDBfcmZfc2V0X3NlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgc2VucykKK3sKKwl1OCBmaW5ldHVuZSA9IDA7CisJaWYgKChzZW5zID4gODUpIHx8IChzZW5zIDwgNTQpKSByZXR1cm4gLTE7CisKKwl3cml0ZV9zYTI0MDAoZGV2LDUsMHgxZGZiIHwgKHNlbnMtNTQpIDw8IDE1IHwoZmluZXR1bmU8PDIwKSk7ICAvLyBBR0MJMHhjOWRmYgorCisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBzYTI0MDBfcmZfc2V0X2NoYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgY2gpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXUzMiB0eHB3ID0gMHhmZiAmIHByaXYtPmNodHhwd3JbY2hdOworCXUzMiBjaGFuID0gc2EyNDAwX2NoYW5bY2hdOworCisJd3JpdGVfc2EyNDAwKGRldiw3LHR4cHcpOworCS8vd3JpdGVfcGh5KGRldiwweDEwLDB4ZDEpOworCXNhMjQwMF93cml0ZV9waHlfYW50ZW5uYShkZXYsY2gpOworCXdyaXRlX3NhMjQwMChkZXYsMCxjaGFuKTsKKwl3cml0ZV9zYTI0MDAoZGV2LDEsMHhiYjUwKTsKKwl3cml0ZV9zYTI0MDAoZGV2LDIsMHg4MCk7CisJd3JpdGVfc2EyNDAwKGRldiwzLDApOworfQorCisKK3ZvaWQgc2EyNDAwX3JmX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJd3JpdGVfc2EyNDAwKGRldiwgNCwgMCk7Cit9CisKKwordm9pZCBzYTI0MDBfcmZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIgYW5hcGFyYW07CisJdTggZmlyZGFjOworCisJd3JpdGVfbmljX2J5dGUoZGV2LFBIWV9ERUxBWSwweDYpOwkvL3RoaXMgaXMgZ2VuZXJhbAorCXdyaXRlX25pY19ieXRlKGRldixDQVJSSUVSX1NFTlNFX0NPVU5URVIsMHg0Yyk7IC8vdGhpcyBpcyBnZW5lcmFsCisKKwkvKnRoZXNlIGFyZSBwaGlsaXBzIHNhMjQwMCBzcGVjaWZpYyovCisJYW5hcGFyYW0gPSByZWFkX25pY19kd29yZChkZXYsQU5BUEFSQU0pOworCWFuYXBhcmFtID0gYW5hcGFyYW0gJn4gKDE8PEFOQVBBUkFNX1RYREFDT0ZGX1NISUZUKTsKKworCWFuYXBhcmFtID0gYW5hcGFyYW0gJn5BTkFQQVJBTV9QV1IxX01BU0s7CisJYW5hcGFyYW0gPSBhbmFwYXJhbSAmfkFOQVBBUkFNX1BXUjBfTUFTSzsKKwlpZihwcml2LT5kaWdwaHkpeworCQlhbmFwYXJhbSB8PSAoU0EyNDAwX0RJR19BTkFQQVJBTV9QV1IxX09OPDxBTkFQQVJBTV9QV1IxX1NISUZUKTsKKwkJYW5hcGFyYW0gfD0gKFNBMjQwMF9BTkFQQVJBTV9QV1IwX09OPDxBTkFQQVJBTV9QV1IwX1NISUZUKTsKKwl9ZWxzZXsKKwkJYW5hcGFyYW0gfD0gKFNBMjQwMF9BTkFfQU5BUEFSQU1fUFdSMV9PTjw8QU5BUEFSQU1fUFdSMV9TSElGVCk7CisJfQorCisJcnRsODE4MF9zZXRfYW5hcGFyYW0oZGV2LGFuYXBhcmFtKTsKKworCWZpcmRhYyA9IChwcml2LT5kaWdwaHkpID8gKDE8PFNBMjQwMF9SRUc0X0ZJUkRBQ19TSElGVCkgOiAwOworCXdyaXRlX3NhMjQwMChkZXYsMCxzYTI0MDBfY2hhbltwcml2LT5jaGFuXSk7CisJd3JpdGVfc2EyNDAwKGRldiwxLDB4YmI1MCk7CisJd3JpdGVfc2EyNDAwKGRldiwyLDB4ODApOworCXdyaXRlX3NhMjQwMChkZXYsMywwKTsKKwl3cml0ZV9zYTI0MDAoZGV2LDQsMHgxOTM0MCB8IGZpcmRhYyk7CisJd3JpdGVfc2EyNDAwKGRldiw1LDB4YzlkZmIpOyAgLy8gQUdDCisJd3JpdGVfc2EyNDAwKGRldiw0LDB4MTkzNDggfCBmaXJkYWMpOyAgLy9jYWxpYnJhdGVzIFZDTworCisJaWYocHJpdi0+ZGlncGh5KQorCQl3cml0ZV9zYTI0MDAoZGV2LDQsMHgxOTM4Yyk7IC8qPz8/Ki8KKworCXdyaXRlX3NhMjQwMChkZXYsNCwweDE5MzQwIHwgZmlyZGFjKTsKKworCXdyaXRlX3NhMjQwMChkZXYsMCxzYTI0MDBfY2hhbltwcml2LT5jaGFuXSk7CisJd3JpdGVfc2EyNDAwKGRldiwxLDB4YmI1MCk7CisJd3JpdGVfc2EyNDAwKGRldiwyLDB4ODApOworCXdyaXRlX3NhMjQwMChkZXYsMywwKTsKKwl3cml0ZV9zYTI0MDAoZGV2LDQsMHgxOTM0NCB8IGZpcmRhYyk7IC8vY2FsaWJyYXRlcyBmaWx0ZXIKKworCS8qIG5ldyBmcm9tIHJ0bDgxODAgZW1iZWRkZWQgZHJpdmVyIChydGw4MTgxIHByb2plY3QpICovCisJd3JpdGVfc2EyNDAwKGRldiw2LDB4MTNmZiB8ICgxPDwyMykpOyAvLyBNQU5SWAorCXdyaXRlX3NhMjQwMChkZXYsOCwwKTsgLy9WQ08KKworCWlmKCFwcml2LT5kaWdwaHkpCisJeworCQlydGw4MTgwX3NldF9hbmFwYXJhbShkZXYsIGFuYXBhcmFtIHwgXAorCQkJCSAgICAgKDE8PEFOQVBBUkFNX1RYREFDT0ZGX1NISUZUKSk7CisKKwkJcnRsODE4MF9jb250dHhfZW5hYmxlKGRldik7CisKKwkJd3JpdGVfc2EyNDAwKGRldiwgNCwgMHgxOTM0MSk7IC8vIGNhbGlicmF0ZXMgREMKKworCQkvKiBhIDV1cyBzbGVlcCBpcyByZXF1aXJlZCBoZXJlLAorCQkgICB3ZSByZWx5IG9uIHRoZSAzbXMgZGVsYXkgaW50cm9kdWNlZCBpbiB3cml0ZV9zYTI0MDAKKwkJKi8KKwkJd3JpdGVfc2EyNDAwKGRldiwgNCwgMHgxOTM0NSk7CisJCS8qIGEgMjB1cyBzbGVlcCBpcyByZXF1aXJlZCBoZXJlLAorCQkgICB3ZSByZWx5IG9uIHRoZSAzbXMgZGVsYXkgaW50cm9kdWNlZCBpbiB3cml0ZV9zYTI0MDAKKwkJKi8KKwkJcnRsODE4MF9jb250dHhfZGlzYWJsZShkZXYpOworCisJCXJ0bDgxODBfc2V0X2FuYXBhcmFtKGRldiwgYW5hcGFyYW0pOworCX0KKwkvKiBlbmQgbmV3ICovCisKKwl3cml0ZV9zYTI0MDAoZGV2LDQsMHgxOTM0MSB8IGZpcmRhYyApOyAvL1JUWCBNT0RFCisKKwkvLyBTZXQgdHggcG93ZXIgbGV2ZWwgIT8KKworCisJLypiYXNlYmFuZCBjb25maWd1cmF0aW9uKi8KKwl3cml0ZV9waHkoZGV2LDAsMHg5OCk7CisJd3JpdGVfcGh5KGRldiwzLDB4MzgpOworCXdyaXRlX3BoeShkZXYsNCwweGUwKTsKKwl3cml0ZV9waHkoZGV2LDUsMHg5MCk7CisJd3JpdGVfcGh5KGRldiw2LDB4MWEpOworCXdyaXRlX3BoeShkZXYsNywweDY0KTsKKworCS8qU2hvdWxkIGJlIGRvbmUgc29tZXRoaW5nIG1vcmUgaGVyZT8/Ki8KKworCXNhMjQwMF93cml0ZV9waHlfYW50ZW5uYShkZXYscHJpdi0+Y2hhbik7CisKKwl3cml0ZV9waHkoZGV2LDB4MTEsMHg4MCk7CisJaWYocHJpdi0+ZGl2ZXJzaXR5KQorCQl3cml0ZV9waHkoZGV2LDB4MTIsMHhjNyk7CisJZWxzZQorCQl3cml0ZV9waHkoZGV2LDB4MTIsMHg0Nyk7CisKKwl3cml0ZV9waHkoZGV2LDB4MTMsMHg5MCB8IHByaXYtPmNzX3RyZXNob2xkICk7CisKKwl3cml0ZV9waHkoZGV2LDB4MTksMHgwKTsKKwl3cml0ZV9waHkoZGV2LDB4MWEsMHhhMCk7CisKKwlzYTI0MDBfcmZfc2V0X2NoYW4oZGV2LHByaXYtPmNoYW4pOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9zYTI0MDAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfc2EyNDAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgzYTY5YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfc2EyNDAwLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKwlUaGlzIGlzIHBhcnQgb2YgcnRsODE4MCBPcGVuU291cmNlIGRyaXZlciAtIHYgMC43CisJQ29weXJpZ2h0IChDKSBBbmRyZWEgTWVyZWxsbyAyMDA0ICA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisJUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdQTCAoR2VuZXJhbCBQdWJsaWMgTGljZW5jZSkKKworCVBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgR1BMIHBhcnQgb2YgdGhlIG9mZmljaWFsIHJlYWx0ZWsgZHJpdmVyCisJUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBydGw4MTgwIGRyaXZlciBza2VsZXRvbiBmcm9tIFBhdHJpYyBTY2hlbmtlICYgQW5kcmVzIFNhbG9tb24KKwlQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEludGVsIFBybyBXaXJlbGVzcyAyMTAwIEdQTCBkcml2ZXIKKworCVdlIHdhbnQgdG8gdGFua3MgdGhlIEF1dGhvcnMgb2Ygc3VjaCBwcm9qZWN0cyBhbmQgdGhlIE5kaXN3cmFwcGVyIHByb2plY3QgQXV0aG9ycy4KKyovCisKKyNkZWZpbmUgU0EyNDAwX0FOVEVOTkEgMHg5MQorI2RlZmluZSBTQTI0MDBfRElHX0FOQVBBUkFNX1BXUjFfT04gMHg4CisjZGVmaW5lIFNBMjQwMF9BTkFfQU5BUEFSQU1fUFdSMV9PTiAweDI4CisjZGVmaW5lIFNBMjQwMF9BTkFQQVJBTV9QV1IwX09OIDB4MworCisjZGVmaW5lIFNBMjQwMF9SRl9NQVhfU0VOUyA4NQorI2RlZmluZSBTQTI0MDBfUkZfREVGX1NFTlMgODAKKworI2RlZmluZSBTQTI0MDBfUkVHNF9GSVJEQUNfU0hJRlQgNworCit2b2lkIHNhMjQwMF9yZl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBzYTI0MDBfcmZfc2V0X2NoYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldixzaG9ydCBjaCk7CitzaG9ydCBzYTI0MDBfcmZfc2V0X3NlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldixzaG9ydCBzZW5zKTsKK3ZvaWQgc2EyNDAwX3JmX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF93eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF93eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMzkwMWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3d4LmMKQEAgLTAsMCArMSwxNjQ0IEBACisvKgorICAgVGhpcyBmaWxlIGNvbnRhaW5zIHdpcmVsZXNzIGV4dGVuc2lvbiBoYW5kbGVycy4KKworICAgVGhpcyBpcyBwYXJ0IG9mIHJ0bDgxODAgT3BlblNvdXJjZSBkcml2ZXIuCisgICBDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQtMjAwNSAgPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorICAgUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdQTCAoR2VuZXJhbCBQdWJsaWMgTGljZW5jZSkKKworICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBHUEwgcGFydAorICAgb2YgdGhlIG9mZmljaWFsIHJlYWx0ZWsgZHJpdmVyLgorCisgICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIHJ0bDgxODAgZHJpdmVyIHNrZWxldG9uCisgICBmcm9tIFBhdHJpYyBTY2hlbmtlICYgQW5kcmVzIFNhbG9tb24uCisKKyAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgSW50ZWwgUHJvIFdpcmVsZXNzIDIxMDAgR1BMIGRyaXZlci4KKworICAgV2Ugd2FudCB0byB0YW5rcyB0aGUgQXV0aG9ycyBvZiB0aG9zZSBwcm9qZWN0cyBhbmQgdGhlIE5kaXN3cmFwcGVyCisgICBwcm9qZWN0IEF1dGhvcnMuCisqLworCisKKyNpbmNsdWRlICJyODE4MC5oIgorI2luY2x1ZGUgInI4MTgwX2h3LmgiCisjaW5jbHVkZSAicjgxODBfc2EyNDAwLmgiCisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisjaW5jbHVkZSAiZG90MTFkLmgiCisjZW5kaWYKKworLy8jZGVmaW5lIFJBVEVfQ09VTlQgNAordTMyIHJ0bDgxODBfcmF0ZXNbXSA9IHsxMDAwMDAwLDIwMDAwMDAsNTUwMDAwMCwxMTAwMDAwMCwKKwk2MDAwMDAwLDkwMDAwMDAsMTIwMDAwMDAsMTgwMDAwMDAsMjQwMDAwMDAsMzYwMDAwMDAsNDgwMDAwMDAsNTQwMDAwMDB9OworCisjZGVmaW5lIFJBVEVfQ09VTlQgKHNpemVvZihydGw4MTgwX3JhdGVzKS9zaXplb2YocnRsODE4MF9yYXRlc1swXSkpCisKK3N0YXRpYyBDSEFOTkVMX0xJU1QgRGVmYXVsdENoYW5uZWxQbGFuW10gPSB7CisvLwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0fSwxNH0sCQkJLy9EZWZhdWx0IGNoYW5uZWwgcGxhbgorCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMzYsNDAsNDQsNDgsNTIsNTYsNjAsNjR9LDE5fSwgIAkJLy9GQ0MKKwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExfSwxMX0sICAgICAgICAgICAgICAgICAgICAJCQkJLy9JQworCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMzYsNDAsNDQsNDgsNTIsNTYsNjAsNjR9LDIxfSwgIAkvL0VUU0kKKwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0fSwyMX0sICAgIC8vU3BhaW4uIENoYW5nZSB0byBFVFNJLgorCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMzYsNDAsNDQsNDgsNTIsNTYsNjAsNjR9LDIxfSwgIAkvL0ZyYW5jZS4gQ2hhbmdlIHRvIEVUU0kuCisJe3sxNCwzNiw0MCw0NCw0OCw1Miw1Niw2MCw2NH0sOX0sCQkJCQkJLy9NS0sKKwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LCAzNiw0MCw0NCw0OCw1Miw1Niw2MCw2NH0sMjJ9LC8vTUtLMQorCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMzYsNDAsNDQsNDgsNTIsNTYsNjAsNjR9LDIxfSwJLy9Jc3JhZWwuCisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywzNCwzOCw0Miw0Nn0sMTd9LAkJCS8vIEZvciAxMWEgLCBURUxFQworCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTR9LDE0fQkJCQkJLy9Gb3IgR2xvYmFsIERvbWFpbi4gMS0xMTphY3RpdmUgc2NhbiwgMTItMTQgcGFzc2l2ZSBzY2FuLiAvLytZSiwgMDgwNjI2Cit9Oworc3RhdGljIGludCByODE4MF93eF9nZXRfZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXJldHVybiBpZWVlODAyMTFfd3hfZ2V0X2ZyZXEocHJpdi0+aWVlZTgwMjExLCBhLCB3cnF1LCBiKTsKK30KKworCitpbnQgcjgxODBfd3hfc2V0X2tleShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IGl3X3BvaW50ICplcnEgPSAmKHdycXUtPmVuY29kaW5nKTsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYpCisJCXJldHVybiAwOworCisJaWYgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpIHsKKwl9CisKKworLyoJaSA9IGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVg7CisJaWYgKGkgPCAxIHx8IGkgPiA0KQorKi8KKworCWlmIChlcnEtPmxlbmd0aCA+IDApIHsKKworCQkvL2ludCBsZW4gPSBlcnEtPmxlbmd0aCA8PSA1ID8gNSA6IDEzOworCisJCXUzMiogdGtleT0gKHUzMiopIGtleTsKKwkJcHJpdi0+a2V5MFswXSA9IHRrZXlbMF07CisJCXByaXYtPmtleTBbMV0gPSB0a2V5WzFdOworCQlwcml2LT5rZXkwWzJdID0gdGtleVsyXTsKKwkJcHJpdi0+a2V5MFszXSA9IHRrZXlbM10gJjB4ZmY7CisJCURNRVNHKCJTZXR0aW5nIHdlcCBrZXkgdG8gJXggJXggJXggJXgiLAorCQkgICAgICB0a2V5WzBdLHRrZXlbMV0sdGtleVsyXSx0a2V5WzNdKTsKKwkJcnRsODE4MF9zZXRfaHdfd2VwKGRldik7CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X2JlYWNvbmludGVydmFsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmFhLAorCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQoreworCWludCAqcGFybXMgPSAoaW50ICopYjsKKwlpbnQgYmkgPSBwYXJtc1swXTsKKworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYpCisJCXJldHVybiAwOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKwlETUVTRygic2V0dGluZyBiZWFjb24gaW50ZXJ2YWwgdG8gJXgiLGJpKTsKKworCXByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbD1iaTsKKwlydGw4MTgwX2NvbW1pdChkZXYpOworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IHI4MTgwX3d4X2dldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXJldHVybiBpZWVlODAyMTFfd3hfZ2V0X21vZGUocHJpdi0+aWVlZTgwMjExLGEsd3JxdSxiKTsKK30KKworCisKK3N0YXRpYyBpbnQgcjgxODBfd3hfZ2V0X3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXJldHVybiBpZWVlODAyMTFfd3hfZ2V0X3JhdGUocHJpdi0+aWVlZTgwMjExLGluZm8sd3JxdSxleHRyYSk7Cit9CisKKworCitzdGF0aWMgaW50IHI4MTgwX3d4X3NldF9yYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisKKwlpZihwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmKQorCQlyZXR1cm4gMDsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlyZXQgPSBpZWVlODAyMTFfd3hfc2V0X3JhdGUocHJpdi0+aWVlZTgwMjExLGluZm8sd3JxdSxleHRyYSk7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCByODE4MF93eF9zZXRfY3JjbW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50ICpwYXJtcyA9IChpbnQgKilleHRyYTsKKwlpbnQgZW5hYmxlID0gKHBhcm1zWzBdID4gMCk7CisJc2hvcnQgcHJldiA9IHByaXYtPmNyY21vbjsKKworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJaWYoZW5hYmxlKQorCQlwcml2LT5jcmNtb249MTsKKwllbHNlCisJCXByaXYtPmNyY21vbj0wOworCisJRE1FU0coImJhZCBDUkMgaW4gbW9uaXRvciBtb2RlIGFyZSAlcyIsCisJICAgICAgcHJpdi0+Y3JjbW9uID8gImFjY2VwdGVkIiA6ICJyZWplY3RlZCIpOworCisJaWYocHJldiAhPSBwcml2LT5jcmNtb24gJiYgcHJpdi0+dXApeworCQlydGw4MTgwX2Rvd24oZGV2KTsKKwkJcnRsODE4MF91cChkZXYpOworCX0KKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCByODE4MF93eF9zZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpbnQgcmV0OworCisKKwlpZihwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmKQorCQlyZXR1cm4gMDsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisjaWZkZWYgRU5BQkxFX0lQUworLy8JcHJpbnRrKCJzZXQgbW9kZSBFTkFCTEVfSVBTXG4iKTsKKwlpZihwcml2LT5iSW5hY3RpdmVQcyl7CisJCWlmKHdycXUtPm1vZGUgPT0gSVdfTU9ERV9BREhPQykKKwkJCUlQU0xlYXZlKGRldik7CisJfQorI2VuZGlmCisJcmV0ID0gaWVlZTgwMjExX3d4X3NldF9tb2RlKHByaXYtPmllZWU4MDIxMSxhLHdycXUsYik7CisKKwkvL3J0bDgxODBfY29tbWl0KGRldik7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCisvL1lKLGFkZCwwODA4MTksZm9yIGhpZGRlbiBhcAorc3RydWN0ICBpd19yYW5nZV93aXRoX3NjYW5fY2FwYQoreworICAgICAgICAvKiBJbmZvcm1hdGl2ZSBzdHVmZiAodG8gY2hvb3NlIGJldHdlZW4gZGlmZmVyZW50IGludGVyZmFjZSkgKi8KKyAgICAgICAgX191MzIgICAgICAgICAgIHRocm91Z2hwdXQ7ICAgICAvKiBUbyBnaXZlIGFuIGlkZWEuLi4gKi8KKyAgICAgICAgLyogSW4gdGhlb3J5IHRoaXMgdmFsdWUgc2hvdWxkIGJlIHRoZSBtYXhpbXVtIGJlbmNobWFya2VkCisgICAgICAgICAqIFRDUC9JUCB0aHJvdWdocHV0LCBiZWNhdXNlIHdpdGggbW9zdCBvZiB0aGVzZSBkZXZpY2VzIHRoZQorICAgICAgICAgKiBiaXQgcmF0ZSBpcyBtZWFuaW5nbGVzcyAob3ZlcmhlYWQgYW4gY28pIHRvIGVzdGltYXRlIGhvdworICAgICAgICAgKiBmYXN0IHRoZSBjb25uZWN0aW9uIHdpbGwgZ28gYW5kIHBpY2sgdGhlIGZhc3Rlc3Qgb25lLgorICAgICAgICAgKiBJIHN1Z2dlc3QgcGVvcGxlIHRvIHBsYXkgd2l0aCBOZXRwZXJmIG9yIGFueSBiZW5jaG1hcmsuLi4KKyAgICAgICAgICovCisKKyAgICAgICAgLyogTldJRCAob3IgZG9tYWluIGlkKSAqLworICAgICAgICBfX3UzMiAgICAgICAgICAgbWluX253aWQ7ICAgICAgIC8qIE1pbmltYWwgTldJRCB3ZSBhcmUgYWJsZSB0byBzZXQgKi8KKyAgICAgICAgX191MzIgICAgICAgICAgIG1heF9ud2lkOyAgICAgICAvKiBNYXhpbWFsIE5XSUQgd2UgYXJlIGFibGUgdG8gc2V0ICovCisKKyAgICAgICAgLyogT2xkIEZyZXF1ZW5jeSAoYmFja3dhcmQgY29tcGF0IC0gbW92ZWQgbG93ZXIgKSAqLworICAgICAgICBfX3UxNiAgICAgICAgICAgb2xkX251bV9jaGFubmVsczsKKyAgICAgICAgX191OCAgICAgICAgICAgIG9sZF9udW1fZnJlcXVlbmN5OworCisgICAgICAgIC8qIFNjYW4gY2FwYWJpbGl0aWVzICovCisgICAgICAgIF9fdTggICAgICAgICAgICBzY2FuX2NhcGE7Cit9OworLy9ZSixhZGQsMDgwODE5LGZvciBoaWRkZW4gYXAKKworCitzdGF0aWMgaW50IHJ0bDgxODBfd3hfZ2V0X3JhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgaXdfcmFuZ2UgKnJhbmdlID0gKHN0cnVjdCBpd19yYW5nZSAqKWV4dHJhOworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MTYgdmFsOworCWludCBpOworCS8vc3RydWN0IGl3X3JhbmdlX3dpdGhfc2Nhbl9jYXBhKiB0bXAgPSAoc3RydWN0IGl3X3JhbmdlX3dpdGhfc2Nhbl9jYXBhKilyYW5nZTsgLy9ZSixhZGQsMDgwODE5LGZvciBoaWRkZW4gYXAKKworCXdycXUtPmRhdGEubGVuZ3RoID0gc2l6ZW9mKCpyYW5nZSk7CisJbWVtc2V0KHJhbmdlLCAwLCBzaXplb2YoKnJhbmdlKSk7CisKKwkvKiBMZXQncyB0cnkgdG8ga2VlcCB0aGlzIHN0cnVjdCBpbiB0aGUgc2FtZSBvcmRlciBhcyBpbgorCSAqIGxpbnV4L2luY2x1ZGUvd2lyZWxlc3MuaAorCSAqLworCisJLyogVE9ETzogU2VlIHdoYXQgdmFsdWVzIHdlIGNhbiBzZXQsIGFuZCByZW1vdmUgdGhlIG9uZXMgd2UgY2FuJ3QKKwkgKiBzZXQsIG9yIGZpbGwgdGhlbSB3aXRoIHNvbWUgZGVmYXVsdCBkYXRhLgorCSAqLworCisJLyogfjUgTWIvcyByZWFsICg4MDIuMTFiKSAqLworCXJhbmdlLT50aHJvdWdocHV0ID0gNSAqIDEwMDAgKiAxMDAwOworCisJLy8gVE9ETzogTm90IHVzZWQgaW4gODAyLjExYj8KKy8vCXJhbmdlLT5taW5fbndpZDsJLyogTWluaW1hbCBOV0lEIHdlIGFyZSBhYmxlIHRvIHNldCAqLworCS8vIFRPRE86IE5vdCB1c2VkIGluIDgwMi4xMWI/CisvLwlyYW5nZS0+bWF4X253aWQ7CS8qIE1heGltYWwgTldJRCB3ZSBhcmUgYWJsZSB0byBzZXQgKi8KKworICAgICAgICAvKiBPbGQgRnJlcXVlbmN5IChiYWNrd2FyZCBjb21wYXQgLSBtb3ZlZCBsb3dlciApICovCisvLwlyYW5nZS0+b2xkX251bV9jaGFubmVsczsKKy8vCXJhbmdlLT5vbGRfbnVtX2ZyZXF1ZW5jeTsKKy8vCXJhbmdlLT5vbGRfZnJlcVs2XTsgLyogRmlsbGVyIHRvIGtlZXAgInZlcnNpb24iIGF0IHRoZSBzYW1lIG9mZnNldCAqLworCWlmKHByaXYtPnJmX3NldF9zZW5zICE9IE5VTEwpCisJCXJhbmdlLT5zZW5zaXRpdml0eSA9IHByaXYtPm1heF9zZW5zOwkvKiBzaWduYWwgbGV2ZWwgdGhyZXNob2xkIHJhbmdlICovCisKKwlyYW5nZS0+bWF4X3F1YWwucXVhbCA9IDEwMDsKKwkvKiBUT0RPOiBGaW5kIHJlYWwgbWF4IFJTU0kgYW5kIHN0aWNrIGhlcmUgKi8KKwlyYW5nZS0+bWF4X3F1YWwubGV2ZWwgPSAwOworCXJhbmdlLT5tYXhfcXVhbC5ub2lzZSA9IC05ODsKKwlyYW5nZS0+bWF4X3F1YWwudXBkYXRlZCA9IDc7IC8qIFVwZGF0ZWQgYWxsIHRocmVlICovCisKKwlyYW5nZS0+YXZnX3F1YWwucXVhbCA9IDkyOyAvKiA+IDglIG1pc3NlZCBiZWFjb25zIGlzICdiYWQnICovCisJLyogVE9ETzogRmluZCByZWFsICdnb29kJyB0byAnYmFkJyB0aHJlc2hvbCB2YWx1ZSBmb3IgUlNTSSAqLworCXJhbmdlLT5hdmdfcXVhbC5sZXZlbCA9IDIwICsgLTk4OworCXJhbmdlLT5hdmdfcXVhbC5ub2lzZSA9IDA7CisJcmFuZ2UtPmF2Z19xdWFsLnVwZGF0ZWQgPSA3OyAvKiBVcGRhdGVkIGFsbCB0aHJlZSAqLworCisJcmFuZ2UtPm51bV9iaXRyYXRlcyA9IFJBVEVfQ09VTlQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgUkFURV9DT1VOVCAmJiBpIDwgSVdfTUFYX0JJVFJBVEVTOyBpKyspIHsKKwkJcmFuZ2UtPmJpdHJhdGVbaV0gPSBydGw4MTgwX3JhdGVzW2ldOworCX0KKworCXJhbmdlLT5taW5fZnJhZyA9IE1JTl9GUkFHX1RIUkVTSE9MRDsKKwlyYW5nZS0+bWF4X2ZyYWcgPSBNQVhfRlJBR19USFJFU0hPTEQ7CisKKwlyYW5nZS0+cG1fY2FwYSA9IDA7CisKKwlyYW5nZS0+d2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKKwlyYW5nZS0+d2VfdmVyc2lvbl9zb3VyY2UgPSAxNjsKKworLy8JcmFuZ2UtPnJldHJ5X2NhcGE7CS8qIFdoYXQgcmV0cnkgb3B0aW9ucyBhcmUgc3VwcG9ydGVkICovCisvLwlyYW5nZS0+cmV0cnlfZmxhZ3M7CS8qIEhvdyB0byBkZWNvZGUgbWF4L21pbiByZXRyeSBsaW1pdCAqLworLy8JcmFuZ2UtPnJfdGltZV9mbGFnczsJLyogSG93IHRvIGRlY29kZSBtYXgvbWluIHJldHJ5IGxpZmUgKi8KKy8vCXJhbmdlLT5taW5fcmV0cnk7CS8qIE1pbmltYWwgbnVtYmVyIG9mIHJldHJpZXMgKi8KKy8vCXJhbmdlLT5tYXhfcmV0cnk7CS8qIE1heGltYWwgbnVtYmVyIG9mIHJldHJpZXMgKi8KKy8vCXJhbmdlLT5taW5fcl90aW1lOwkvKiBNaW5pbWFsIHJldHJ5IGxpZmV0aW1lICovCisvLwlyYW5nZS0+bWF4X3JfdGltZTsJLyogTWF4aW1hbCByZXRyeSBsaWZldGltZSAqLworCisgICAgICAgIHJhbmdlLT5udW1fY2hhbm5lbHMgPSAxNDsKKworCWZvciAoaSA9IDAsIHZhbCA9IDA7IGkgPCAxNDsgaSsrKSB7CisKKwkJLy8gSW5jbHVkZSBvbmx5IGxlZ2FsIGZyZXF1ZW5jaWVzIGZvciBzb21lIGNvdW50cmllcworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwkJaWYgKChHRVRfRE9UMTFEX0lORk8ocHJpdi0+aWVlZTgwMjExKS0+Y2hhbm5lbF9tYXApW2krMV0pIHsKKyNlbHNlCisJCWlmICgocHJpdi0+aWVlZTgwMjExLT5jaGFubmVsX21hcClbaSsxXSkgeworI2VuZGlmCisJCSAgICAgICAgcmFuZ2UtPmZyZXFbdmFsXS5pID0gaSArIDE7CisJCQlyYW5nZS0+ZnJlcVt2YWxdLm0gPSBpZWVlODAyMTFfd2xhbl9mcmVxdWVuY2llc1tpXSAqIDEwMDAwMDsKKwkJCXJhbmdlLT5mcmVxW3ZhbF0uZSA9IDE7CisJCQl2YWwrKzsKKwkJfSBlbHNlIHsKKwkJCS8vIEZJWE1FOiBkbyB3ZSBuZWVkIHRvIHNldCBhbnl0aGluZyBmb3IgY2hhbm5lbHMKKwkJCS8vIHdlIGRvbid0IHVzZSA/CisJCX0KKworCQlpZiAodmFsID09IElXX01BWF9GUkVRVUVOQ0lFUykKKwkJYnJlYWs7CisJfQorCisJcmFuZ2UtPm51bV9mcmVxdWVuY3kgPSB2YWw7CisJcmFuZ2UtPmVuY19jYXBhID0gSVdfRU5DX0NBUEFfV1BBIHwgSVdfRU5DX0NBUEFfV1BBMiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgIElXX0VOQ19DQVBBX0NJUEhFUl9US0lQIHwgSVdfRU5DX0NBUEFfQ0lQSEVSX0NDTVA7CisKKwkvL3RtcC0+c2Nhbl9jYXBhID0gMHgwMTsgLy9ZSixhZGQsMDgwODE5LGZvciBoaWRkZW4gYXAKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50IHJldDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSA9IHByaXYtPmllZWU4MDIxMTsKKworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKy8vWUosYWRkLDA4MDgxOSwgZm9yIGhpZGRlbiBhcAorCS8vcHJpbnRrKCI9PSomKiYqJj09PiVzIGluXG4iLCBfX2Z1bmNfXyk7CisJLy9wcmludGsoIj0qJiomKiYqPT09PmZsYWc6JXgsICV4XG4iLCB3cnF1LT5kYXRhLmZsYWdzLCBJV19TQ0FOX1RISVNfRVNTSUQpOworCWlmICh3cnF1LT5kYXRhLmZsYWdzICYgSVdfU0NBTl9USElTX0VTU0lEKQorCXsKKwkJc3RydWN0IGl3X3NjYW5fcmVxKiByZXEgPSAoc3RydWN0IGl3X3NjYW5fcmVxKiliOworCQlpZiAocmVxLT5lc3NpZF9sZW4pCisJCXsKKwkJCS8vcHJpbnRrKCI9PSoqJiomKiYqKj09PT5zY2FuIHNldCBzc2lkOiVzXG4iLCByZXEtPmVzc2lkKTsKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9IHJlcS0+ZXNzaWRfbGVuOworCQkJbWVtY3B5KGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCByZXEtPmVzc2lkLCByZXEtPmVzc2lkX2xlbik7CisJCQkvL3ByaW50aygiPT09PT0+bmV0d29yayBzc2lkOiVzXG4iLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCk7CisJCX0KKwl9CisvL1lKLGFkZCwwODA4MTksIGZvciBoaWRkZW4gYXAsIGVuZAorCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKwlpZihwcml2LT51cCl7CisjaWZkZWYgRU5BQkxFX0lQUworLy8JCXByaW50aygic2V0IHNjYW4gRU5BQkxFX0lQU1xuIik7CisJCXByaXYtPmllZWU4MDIxMS0+YWN0c2Nhbm5pbmcgPSB0cnVlOworCQlpZihwcml2LT5iSW5hY3RpdmVQcyAmJiAocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSAhPSBJRUVFODAyMTFfTElOS0VEKSl7CisJCQlJUFNMZWF2ZShkZXYpOworLy8JCQlkb3duKCZwcml2LT5pZWVlODAyMTEtPnd4X3NlbSk7CisKKy8vCQkJaWYgKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IgfHwgIShwcml2LT5pZWVlODAyMTEtPnByb3RvX3N0YXJ0ZWQpKXsKKy8vCQkJCXJldCA9IC0xOworLy8JCQkJdXAoJnByaXYtPmllZWU4MDIxMS0+d3hfc2VtKTsKKy8vCQkJCXVwKCZwcml2LT53eF9zZW0pOworLy8JCQkJcmV0dXJuIHJldDsKKy8vCQkJfQorCisJLy8JcXVldWVfd29yayhwcml2LT5pZWVlODAyMTEtPndxLCAmcHJpdi0+aWVlZTgwMjExLT53eF9zeW5jX3NjYW5fd3EpOworCQkvL3ByaW50aygic3RhcnQgc2Nhbj09PT09PT09PT09PT09PT09PT09PT09PT09PT0+XG4iKTsKKwkJaWVlZTgwMjExX3NvZnRtYWNfaXBzX3NjYW5fc3luY3JvKHByaXYtPmllZWU4MDIxMSk7CisvL2llZWU4MDIxMV9zdGFydF9zY2FuKHByaXYtPmllZWU4MDIxMSk7CisJCS8qIGludGVudGlvbmFsbHkgZm9yZ2V0IHRvIHVwIHNlbSAqLworLy8JCQl1cCgmcHJpdi0+aWVlZTgwMjExLT53eF9zZW0pOworCQkJcmV0ID0gMDsKKwkJfQorCQllbHNlCisjZW5kaWYKKwkJeworCQkJLy9ZSixhZGQsMDgwODI4LCBwcmV2ZW50IHNjYW4gaW4gQnVzeVRyYWZmaWMKKwkJCS8vRklYTUU6IE5lZWQgdG8gY29uc2lkZXIgbGFzdCBzY2FuIHRpbWUKKwkJCWlmICgocHJpdi0+bGlua19kZXRlY3QuYkJ1c3lUcmFmZmljKSAmJiAodHJ1ZSkpCisJCQl7CisJCQkJcmV0ID0gMDsKKwkJCQlwcmludGsoIk5vdyB0cmFmZmljIGlzIGJ1c3ksIHBsZWFzZSB0cnkgbGF0ZXIhXG4iKTsKKwkJCX0KKwkJCWVsc2UKKwkJCS8vWUosYWRkLDA4MDgyOCwgcHJldmVudCBzY2FuIGluIEJ1c3lUcmFmZmljLGVuZAorCQkJCXJldCA9IGllZWU4MDIxMV93eF9zZXRfc2Nhbihwcml2LT5pZWVlODAyMTEsYSx3cnF1LGIpOworCQl9CisJfQorCWVsc2UKKwkJcmV0ID0gLTE7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCByODE4MF93eF9nZXRfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQoreworCisJaW50IHJldDsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCWlmKHByaXYtPnVwKQorCQlyZXQgPSBpZWVlODAyMTFfd3hfZ2V0X3NjYW4ocHJpdi0+aWVlZTgwMjExLGEsd3JxdSxiKTsKKwllbHNlCisJCXJldCA9IC0xOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IHI4MTgwX3d4X3NldF9lc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJaW50IHJldDsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYpCisJCXJldHVybiAwOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKyNpZmRlZiBFTkFCTEVfSVBTCisJLy9wcmludGsoInNldCBlc3NpZCBFTkFCTEVfSVBTXG4iKTsKKwlpZihwcml2LT5iSW5hY3RpdmVQcykKKwkJSVBTTGVhdmUoZGV2KTsKKyNlbmRpZgorLy8JcHJpbnRrKCJoYWhhOnNldCBlc3NpZCAlcyBlc3NpZF9sZW4gPSAlZCBlc3NpZF9mbGdzID0gJWRcbiIsYiwgIHdycXUtPmVzc2lkLmxlbmd0aCwgd3JxdS0+ZXNzaWQuZmxhZ3MpOworCisJcmV0ID0gaWVlZTgwMjExX3d4X3NldF9lc3NpZChwcml2LT5pZWVlODAyMTEsYSx3cnF1LGIpOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IHI4MTgwX3d4X2dldF9lc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJcmV0ID0gaWVlZTgwMjExX3d4X2dldF9lc3NpZChwcml2LT5pZWVlODAyMTEsIGEsIHdycXUsIGIpOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJcmV0ID0gaWVlZTgwMjExX3d4X3NldF9mcmVxKHByaXYtPmllZWU4MDIxMSwgYSwgd3JxdSwgYik7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgcjgxODBfd3hfZ2V0X25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXJldHVybiBpZWVlODAyMTFfd3hfZ2V0X25hbWUocHJpdi0+aWVlZTgwMjExLCBpbmZvLCB3cnF1LCBleHRyYSk7Cit9CisKK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X2ZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKwlpZiAod3JxdS0+ZnJhZy5kaXNhYmxlZCkKKwkJcHJpdi0+aWVlZTgwMjExLT5mdHMgPSBERUZBVUxUX0ZSQUdfVEhSRVNIT0xEOworCWVsc2UgeworCQlpZiAod3JxdS0+ZnJhZy52YWx1ZSA8IE1JTl9GUkFHX1RIUkVTSE9MRCB8fAorCQkgICAgd3JxdS0+ZnJhZy52YWx1ZSA+IE1BWF9GUkFHX1RIUkVTSE9MRCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXByaXYtPmllZWU4MDIxMS0+ZnRzID0gd3JxdS0+ZnJhZy52YWx1ZSAmIH4weDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCByODE4MF93eF9nZXRfZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwl3cnF1LT5mcmFnLnZhbHVlID0gcHJpdi0+aWVlZTgwMjExLT5mdHM7CisJd3JxdS0+ZnJhZy5maXhlZCA9IDA7CS8qIG5vIGF1dG8gc2VsZWN0ICovCisJd3JxdS0+ZnJhZy5kaXNhYmxlZCA9ICh3cnF1LT5mcmFnLnZhbHVlID09IERFRkFVTFRfRlJBR19USFJFU0hPTEQpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCByODE4MF93eF9zZXRfd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSB1bmlvbiBpd3JlcV9kYXRhICphd3JxLAorCQkJIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJcmV0ID0gaWVlZTgwMjExX3d4X3NldF93YXAocHJpdi0+aWVlZTgwMjExLGluZm8sYXdycSxleHRyYSk7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKwlyZXR1cm4gcmV0OworCit9CisKKworc3RhdGljIGludCByODE4MF93eF9nZXRfd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlyZXR1cm4gaWVlZTgwMjExX3d4X2dldF93YXAocHJpdi0+aWVlZTgwMjExLGluZm8sd3JxdSxleHRyYSk7Cit9CisKKworc3RhdGljIGludCByODE4MF93eF9zZXRfZW5jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICprZXkpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCByZXQ7CisKKwlpZihwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmKQorCQlyZXR1cm4gMDsKKworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCWlmKHByaXYtPmh3X3dlcCkgcmV0ID0gcjgxODBfd3hfc2V0X2tleShkZXYsaW5mbyx3cnF1LGtleSk7CisJZWxzZXsKKwkJRE1FU0coIlNldHRpbmcgU1cgd2VwIGtleSIpOworCQlyZXQgPSBpZWVlODAyMTFfd3hfc2V0X2VuY29kZShwcml2LT5pZWVlODAyMTEsaW5mbyx3cnF1LGtleSk7CisJfQorCisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IHI4MTgwX3d4X2dldF9lbmMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlyZXR1cm4gaWVlZTgwMjExX3d4X2dldF9lbmNvZGUocHJpdi0+aWVlZTgwMjExLCBpbmZvLCB3cnF1LCBrZXkpOworfQorCisKK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X3NjYW5fdHlwZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphYSwgdW5pb24KKyBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpwKXsKKworIAlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50ICpwYXJtcz0oaW50KilwOworCWludCBtb2RlPXBhcm1zWzBdOworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKwlwcml2LT5pZWVlODAyMTEtPmFjdGl2ZV9zY2FuID0gbW9kZTsKKworCXJldHVybiAxOworfQorCisKKy8qIGFkZGVkIGJ5IGNocmlzdGlhbiAqLworLyoKK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X21vbml0b3JfdHlwZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphYSwgdW5pb24KKyBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpwKXsKKworIAlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50ICpwYXJtcz0oaW50KilwOworCWludCBtb2RlPXBhcm1zWzBdOworCisJaWYocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlICE9IElXX01PREVfTU9OSVRPUikgcmV0dXJuIC0xOworICAJcHJpdi0+cHJpc21faGRyID0gbW9kZTsKKwlpZighbW9kZSlkZXYtPnR5cGU9QVJQSFJEX0lFRUU4MDIxMTsKKwllbHNlIGRldi0+dHlwZT1BUlBIUkRfSUVFRTgwMjExX1BSSVNNOworCURNRVNHKCJ1c2luZyAlcyBSWCBlbmNhcCIsIG1vZGUgPyAiQVZTIjoiODAyMTEiKTsKKwlyZXR1cm4gMDsKKworfQorKi8KKy8vb2YgICAgICAgICByODE4MF93eF9zZXRfbW9uaXRvcl90eXBlCisvKiBlbmQgYWRkZWQgY2hyaXN0aWFuICovCisKK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X3JldHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50IGVyciA9IDA7CisKKwlpZihwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmKQorCQlyZXR1cm4gMDsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlpZiAod3JxdS0+cmV0cnkuZmxhZ3MgJiBJV19SRVRSWV9MSUZFVElNRSB8fAorCSAgICB3cnF1LT5yZXRyeS5kaXNhYmxlZCl7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisJaWYgKCEod3JxdS0+cmV0cnkuZmxhZ3MgJiBJV19SRVRSWV9MSU1JVCkpeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWYod3JxdS0+cmV0cnkudmFsdWUgPiBSODE4MF9NQVhfUkVUUlkpeworCQllcnI9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisJaWYgKHdycXUtPnJldHJ5LmZsYWdzICYgSVdfUkVUUllfTUFYKSB7CisJCXByaXYtPnJldHJ5X3J0cyA9IHdycXUtPnJldHJ5LnZhbHVlOworCQlETUVTRygiU2V0dGluZyByZXRyeSBmb3IgUlRTL0NUUyBkYXRhIHRvICVkIiwgd3JxdS0+cmV0cnkudmFsdWUpOworCisJfWVsc2UgeworCQlwcml2LT5yZXRyeV9kYXRhID0gd3JxdS0+cmV0cnkudmFsdWU7CisJCURNRVNHKCJTZXR0aW5nIHJldHJ5IGZvciBub24gUlRTL0NUUyBkYXRhIHRvICVkIiwgd3JxdS0+cmV0cnkudmFsdWUpOworCX0KKworCS8qIEZJWE1FICEKKwkgKiBXZSBtaWdodCB0cnkgdG8gd3JpdGUgZGlyZWN0bHkgdGhlIFRYIGNvbmZpZyByZWdpc3RlcgorCSAqIG9yIHRvIHJlc3RhcnQganVzdCB0aGUgKFIpVFggcHJvY2Vzcy4KKwkgKiBJJ20gdW5zdXJlIGlmIHdob2xlIHJlc2V0IGlzIHJlYWxseSBuZWVkZWQKKwkgKi8KKworIAlydGw4MTgwX2NvbW1pdChkZXYpOworCS8qCisJaWYocHJpdi0+dXApeworCQlydGw4MTgwX3J0eF9kaXNhYmxlKGRldik7CisJCXJ0bDgxODBfcnhfZW5hYmxlKGRldik7CisJCXJ0bDgxODBfdHhfZW5hYmxlKGRldik7CisKKwl9CisJKi8KK2V4aXQ6CisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHI4MTgwX3d4X2dldF9yZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisKKwl3cnF1LT5yZXRyeS5kaXNhYmxlZCA9IDA7IC8qIGNhbid0IGJlIGRpc2FibGVkICovCisKKwlpZiAoKHdycXUtPnJldHJ5LmZsYWdzICYgSVdfUkVUUllfVFlQRSkgPT0KKwkgICAgSVdfUkVUUllfTElGRVRJTUUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHdycXUtPnJldHJ5LmZsYWdzICYgSVdfUkVUUllfTUFYKSB7CisJCXdycXUtPnJldHJ5LmZsYWdzID0gSVdfUkVUUllfTElNSVQgJiBJV19SRVRSWV9NQVg7CisJCXdycXUtPnJldHJ5LnZhbHVlID0gcHJpdi0+cmV0cnlfcnRzOworCX0gZWxzZSB7CisJCXdycXUtPnJldHJ5LmZsYWdzID0gSVdfUkVUUllfTElNSVQgJiBJV19SRVRSWV9NSU47CisJCXdycXUtPnJldHJ5LnZhbHVlID0gcHJpdi0+cmV0cnlfZGF0YTsKKwl9CisJLy9ETUVTRygicmV0dXJuaW5nICVkIix3cnF1LT5yZXRyeS52YWx1ZSk7CisKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHI4MTgwX3d4X2dldF9zZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaWYocHJpdi0+cmZfc2V0X3NlbnMgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOyAvKiB3ZSBoYXZlIG5vdCB0aGlzIHN1cHBvcnQgZm9yIHRoaXMgcmFkaW8gKi8KKwl3cnF1LT5zZW5zLnZhbHVlID0gcHJpdi0+c2VuczsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHI4MTgwX3d4X3NldF9zZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXNob3J0IGVyciA9IDA7CisKKwlpZihwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmKQorCQlyZXR1cm4gMDsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisJLy9ETUVTRygiYXR0ZW1wdCB0byBzZXQgc2Vuc2l2aXR5IHRvICVkZGIiLHdycXUtPnNlbnMudmFsdWUpOworCWlmKHByaXYtPnJmX3NldF9zZW5zID09IE5VTEwpIHsKKwkJZXJyPSAtMTsgLyogd2UgaGF2ZSBub3QgdGhpcyBzdXBwb3J0IGZvciB0aGlzIHJhZGlvICovCisJCWdvdG8gZXhpdDsKKwl9CisJaWYocHJpdi0+cmZfc2V0X3NlbnMoZGV2LCB3cnF1LT5zZW5zLnZhbHVlKSA9PSAwKQorCQlwcml2LT5zZW5zID0gd3JxdS0+c2Vucy52YWx1ZTsKKwllbHNlCisJCWVycj0gLUVJTlZBTDsKKworZXhpdDoKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIGludCByODE4MF93eF9zZXRfcmF3dHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpbnQgcmV0OworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJcmV0ID0gaWVlZTgwMjExX3d4X3NldF9yYXd0eChwcml2LT5pZWVlODAyMTEsIGluZm8sIHdycXUsIGV4dHJhKTsKKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIHJldDsKKworfQorCitzdGF0aWMgaW50IHI4MTgwX3d4X2dldF9wb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJcmV0ID0gaWVlZTgwMjExX3d4X2dldF9wb3dlcihwcml2LT5pZWVlODAyMTEsIGluZm8sIHdycXUsIGV4dHJhKTsKKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByODE4MF93eF9zZXRfcG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisKKwlpZihwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmKQorCQlyZXR1cm4gMDsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisJcHJpbnRrKCI9Pj4+Pj4+Pj4+Pj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PnNldCBwb3dlcjolZCwlZCFcbiIsd3JxdS0+cG93ZXIuZGlzYWJsZWQsIHdycXUtPnBvd2VyLmZsYWdzKTsKKwlpZiAod3JxdS0+cG93ZXIuZGlzYWJsZWQ9PTApIHsKKwkJd3JxdS0+cG93ZXIuZmxhZ3N8PUlXX1BPV0VSX0FMTF9SOworCQl3cnF1LT5wb3dlci5mbGFnc3w9SVdfUE9XRVJfVElNRU9VVDsKKwkJd3JxdS0+cG93ZXIudmFsdWUgPTEwMDA7CisJfQorCisJcmV0ID0gaWVlZTgwMjExX3d4X3NldF9wb3dlcihwcml2LT5pZWVlODAyMTEsIGluZm8sIHdycXUsIGV4dHJhKTsKKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByODE4MF93eF9zZXRfcnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKwlpZiAod3JxdS0+cnRzLmRpc2FibGVkKQorCQlwcml2LT5ydHMgPSBERUZBVUxUX1JUU19USFJFU0hPTEQ7CisJZWxzZSB7CisJCWlmICh3cnF1LT5ydHMudmFsdWUgPCBNSU5fUlRTX1RIUkVTSE9MRCB8fAorCQkgICAgd3JxdS0+cnRzLnZhbHVlID4gTUFYX1JUU19USFJFU0hPTEQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlwcml2LT5ydHMgPSB3cnF1LT5ydHMudmFsdWU7CisJfQorCisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW50IHI4MTgwX3d4X2dldF9ydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisKKworCXdycXUtPnJ0cy52YWx1ZSA9IHByaXYtPnJ0czsKKwl3cnF1LT5ydHMuZml4ZWQgPSAwOwkvKiBubyBhdXRvIHNlbGVjdCAqLworCXdycXUtPnJ0cy5kaXNhYmxlZCA9ICh3cnF1LT5ydHMudmFsdWUgPT0gMCk7CisKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQgZHVtbXkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsY2hhciAqYikKK3sKKwlyZXR1cm4gLTE7Cit9CisKKy8qCitzdGF0aWMgaW50IHI4MTgwX3d4X2dldF9wc21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZTsKKwlpbnQgcmV0ID0gMDsKKworCisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJaWYocHJpdikgeworCQlpZWVlID0gcHJpdi0+aWVlZTgwMjExOworCQlpZihpZWVlLT5wcyA9PSBJRUVFODAyMTFfUFNfRElTQUJMRUQpIHsKKwkJCSooKHVuc2lnbmVkIGludCAqKWV4dHJhKSA9IElFRUU4MDIxMV9QU19ESVNBQkxFRDsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCQkqKCh1bnNpZ25lZCBpbnQgKilleHRyYSkgPSBJV19QT1dFUl9USU1FT1VUOworIAlpZiAoaWVlZS0+cHMgJiBJRUVFODAyMTFfUFNfTUJDQVNUKQorCQkJKigodW5zaWduZWQgaW50ICopZXh0cmEpIHw9IElXX1BPV0VSX0FMTF9SOworCQllbHNlCisJCQkqKCh1bnNpZ25lZCBpbnQgKilleHRyYSkgfD0gSVdfUE9XRVJfVU5JQ0FTVF9SOworCX0gZWxzZQorCQlyZXQgPSAtMTsKK2V4aXQ6CisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gcmV0OworfQorc3RhdGljIGludCByODE4MF93eF9zZXRfcHNtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJLy9zdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZTsKKwlpbnQgcmV0ID0gMDsKKworCisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJcmV0ID0gaWVlZTgwMjExX3d4X3NldF9wb3dlcihwcml2LT5pZWVlODAyMTEsIGluZm8sIHdycXUsIGV4dHJhKTsKKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIHJldDsKKworfQorKi8KKworc3RhdGljIGludCByODE4MF93eF9nZXRfaXdtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWU7CisJaW50IHJldCA9IDA7CisKKworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCWllZWUgPSBwcml2LT5pZWVlODAyMTE7CisKKwlzdHJjcHkoZXh0cmEsICI4MDIuMTEiKTsKKwlpZihpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OKSB7CisJCXN0cmNhdChleHRyYSwgImIiKTsKKwkJaWYoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pCisJCQlzdHJjYXQoZXh0cmEsICIvZyIpOworCX0gZWxzZSBpZihpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTikKKwkJc3RyY2F0KGV4dHJhLCAiZyIpOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gcmV0OworfQorc3RhdGljIGludCByODE4MF93eF9zZXRfaXdtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBwcml2LT5pZWVlODAyMTE7CisJaW50ICpwYXJhbSA9IChpbnQgKilleHRyYTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgbW9kdWxhdGlvbiA9IDAsIG1vZGUgPSAwOworCisKKwlpZihwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmKQorCQlyZXR1cm4gMDsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlpZiAoKnBhcmFtID09IDEpIHsKKwkJbW9kdWxhdGlvbiB8PSBJRUVFODAyMTFfQ0NLX01PRFVMQVRJT047CisJCW1vZGUgPSBJRUVFX0I7CisJcHJpbnRrKEtFUk5fSU5GTyAiQiBtb2RlIVxuIik7CisJfSBlbHNlIGlmICgqcGFyYW0gPT0gMikgeworCQltb2R1bGF0aW9uIHw9IElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT047CisJCW1vZGUgPSBJRUVFX0c7CisJcHJpbnRrKEtFUk5fSU5GTyAiRyBtb2RlIVxuIik7CisJfSBlbHNlIGlmICgqcGFyYW0gPT0gMykgeworCQltb2R1bGF0aW9uIHw9IElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTjsKKwkJbW9kdWxhdGlvbiB8PSBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OOworCQltb2RlID0gSUVFRV9CfElFRUVfRzsKKwlwcmludGsoS0VSTl9JTkZPICJCL0cgbW9kZSFcbiIpOworCX0KKworCWlmKGllZWUtPnByb3RvX3N0YXJ0ZWQpIHsKKwkJaWVlZTgwMjExX3N0b3BfcHJvdG9jb2woaWVlZSk7CisJCWllZWUtPm1vZGUgPSBtb2RlOworCQlpZWVlLT5tb2R1bGF0aW9uID0gbW9kdWxhdGlvbjsKKwkJaWVlZTgwMjExX3N0YXJ0X3Byb3RvY29sKGllZWUpOworCX0gZWxzZSB7CisJCWllZWUtPm1vZGUgPSBtb2RlOworCQlpZWVlLT5tb2R1bGF0aW9uID0gbW9kdWxhdGlvbjsKKy8vCQlpZWVlODAyMTFfc3RhcnRfcHJvdG9jb2woaWVlZSk7CisJfQorCisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gcmV0OworfQorc3RhdGljIGludCByODE4MF93eF9nZXRfcHJlYW1ibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKworCisJKmV4dHJhID0gKGNoYXIpIHByaXYtPnBsY3BfcHJlYW1ibGVfbW9kZTsgCS8vIDA6YXV0byAxOnNob3J0IDI6bG9uZworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW50IHI4MTgwX3d4X3NldF9wcmVhbWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50IHJldCA9IDA7CisKKworCWlmKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYpCisJCXJldHVybiAwOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKwlpZiAoKmV4dHJhPDB8fCpleHRyYT4yKQorCQlyZXQgPSAtMTsKKwllbHNlCisJCXByaXYtPnBsY3BfcHJlYW1ibGVfbW9kZSA9ICooKHNob3J0ICopZXh0cmEpIDsKKworCisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiByZXQ7Cit9CitzdGF0aWMgaW50IHI4MTgwX3d4X2dldF9zaWdsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCS8vc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrID0gJihwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yayk7CisJaW50IHJldCA9IDA7CisKKworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKwkvLyBNb2RpZnkgYnkgaGlrYXJ1IDYuNQorCSooKGludCAqKWV4dHJhKSA9IHByaXYtPndzdGF0cy5xdWFsLmxldmVsOy8vZm9yIGludGVyZmFjZSB0ZXN0ICxpdCBzaG91bGQgYmUgdGhlIHByaXYtPndzdGF0cy5xdWFsLmxldmVsOworCisKKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIHJldDsKK30KK3N0YXRpYyBpbnQgcjgxODBfd3hfZ2V0X3NpZ3F1YWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwkvL3N0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yayA9ICYocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmspOworCWludCByZXQgPSAwOworCisKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisJLy8gTW9kaWZ5IGJ5IGhpa2FydSA2LjUKKwkqKChpbnQgKilleHRyYSkgPSBwcml2LT53c3RhdHMucXVhbC5xdWFsOy8vZm9yIGludGVyZmFjZSB0ZXN0ICxpdCBzaG91bGQgYmUgdGhlIHByaXYtPndzdGF0cy5xdWFsLnF1YWw7CisKKworCisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gcmV0OworfQorc3RhdGljIGludCByODE4MF93eF9yZXNldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPWllZWU4MDIxMV9wcml2KGRldik7CisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCXByaXYtPnN0YXRzLnR4cmR1ID0gMDsKKwlwcml2LT5zdGF0cy5yeHJkdSA9IDA7CisJcHJpdi0+c3RhdHMucnhub2xhc3QgPSAwOworCXByaXYtPnN0YXRzLnJ4bm9kYXRhID0gMDsKKwlwcml2LT5zdGF0cy5yeG5vcG9pbnRlciA9IDA7CisJcHJpdi0+c3RhdHMudHhucGVyciA9IDA7CisJcHJpdi0+c3RhdHMudHhyZXN1bWVkID0gMDsKKwlwcml2LT5zdGF0cy5yeGVyciA9IDA7CisJcHJpdi0+c3RhdHMucnhvdmVyZmxvdyA9IDA7CisJcHJpdi0+c3RhdHMucnhpbnQgPSAwOworCisJcHJpdi0+c3RhdHMudHhucG9raW50ID0gMDsKKwlwcml2LT5zdGF0cy50eGhwb2tpbnQgPSAwOworCXByaXYtPnN0YXRzLnR4aHBlcnIgPSAwOworCXByaXYtPnN0YXRzLmludHMgPSAwOworCXByaXYtPnN0YXRzLnNoaW50cyA9IDA7CisJcHJpdi0+c3RhdHMudHhvdmVyZmxvdyA9IDA7CisJcHJpdi0+c3RhdHMucnhkbWFmYWlsID0gMDsKKwlwcml2LT5zdGF0cy50eGJlYWNvbiA9IDA7CisJcHJpdi0+c3RhdHMudHhiZWFjb25lcnIgPSAwOworCXByaXYtPnN0YXRzLnR4bHBva2ludCA9IDA7CisJcHJpdi0+c3RhdHMudHhscGVyciA9IDA7CisJcHJpdi0+c3RhdHMudHhyZXRyeSA9MDsvLzIwMDYwNjAxCisJcHJpdi0+c3RhdHMucnhjcmNlcnJtaW49MDsKKwlwcml2LT5zdGF0cy5yeGNyY2Vycm1pZD0wOworCXByaXYtPnN0YXRzLnJ4Y3JjZXJybWF4PTA7CisJcHJpdi0+c3RhdHMucnhpY3ZlcnI9MDsKKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIDA7CisKK30KK3N0YXRpYyBpbnQgcjgxODBfd3hfcmFkaW9fb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID1pZWVlODAyMTFfcHJpdihkZXYpOworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisJcHJpdi0+cmZfd2FrZXVwKGRldik7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiAwOworCit9CisKK3N0YXRpYyBpbnQgcjgxODBfd3hfcmFkaW9fb2ZmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9aWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYpCisJCXJldHVybiAwOworCisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCXByaXYtPnJmX3NsZWVwKGRldik7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiAwOworCit9CitzdGF0aWMgaW50IHI4MTgwX3d4X2dldF9jaGFubmVscGxhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKwkqZXh0cmEgPSBwcml2LT5jaGFubmVsX3BsYW47CisKKworCisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X2NoYW5uZWxwbGFuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwkvL3N0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgKnZhbCA9IChpbnQgKilleHRyYTsKKwlpbnQgaTsKKwlwcmludGsoIi0tLS0taW4gZnVuICVzXG4iLCBfX2Z1bmNfXyk7CisKKwlpZihwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmKQorCQlyZXR1cm4gMDsKKworCS8vdW5zaWduZWQgbG9uZyBmbGFnczsKKwlkb3duKCZwcml2LT53eF9zZW0pOworCWlmIChEZWZhdWx0Q2hhbm5lbFBsYW5bKnZhbF0uTGVuICE9IDApeworCQlwcml2IC0+Y2hhbm5lbF9wbGFuID0gKnZhbDsKKwkJLy8gQ2xlYXIgb2xkIGNoYW5uZWwgbWFwCisJCWZvciAoaT0xO2k8PU1BWF9DSEFOTkVMX05VTUJFUjtpKyspCisJCXsKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJCQlHRVRfRE9UMTFEX0lORk8ocHJpdi0+aWVlZTgwMjExKS0+Y2hhbm5lbF9tYXBbaV0gPSAwOworI2Vsc2UKKwkJCXByaXYtPmllZWU4MDIxMS0+Y2hhbm5lbF9tYXBbaV0gPSAwOworI2VuZGlmCisJCX0KKwkJLy8gU2V0IG5ldyBjaGFubmVsIG1hcAorCQlmb3IgKGk9MTtpPD1EZWZhdWx0Q2hhbm5lbFBsYW5bKnZhbF0uTGVuO2krKykKKwkJeworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwkJCUdFVF9ET1QxMURfSU5GTyhwcml2LT5pZWVlODAyMTEpLT5jaGFubmVsX21hcFtEZWZhdWx0Q2hhbm5lbFBsYW5bKnZhbF0uQ2hhbm5lbFtpLTFdXSA9IDE7CisjZWxzZQorCQkJcHJpdi0+aWVlZTgwMjExLT5jaGFubmVsX21hcFtEZWZhdWx0Q2hhbm5lbFBsYW5bKnZhbF0uQ2hhbm5lbFtpLTFdXSA9IDE7CisjZW5kaWYKKwkJfQorCX0KKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHI4MTgwX3d4X2dldF92ZXJzaW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJLy9zdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZTsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisJc3RyY3B5KGV4dHJhLCAiMTAyMC4wODA4Iik7CisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gMDsKK30KKworLy9hZGRlZCBieSBhbXkgMDgwODE4CisvL3JlY2VpdmUgZGF0YXJhdGUgZnJvbSB1c2VyIHR5cGluZyB2YWxpZCByYXRlIGlzIGZyb20gMiB0byAxMDggKDEgLSA1NE0pLCBpZiBpbnB1dCAwLCByZXR1cm4gdG8gbm9ybWFsIHJhdGUgYWRhcHRpdmUuCitzdGF0aWMgaW50IHI4MTgwX3d4X3NldF9mb3JjZXJhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXU4IGZvcmNlcmF0ZSA9ICpleHRyYTsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlwcmludGsoIj09PT09PT09PT09PT09PiVzKCk6IGZvcmNlcmF0ZSBpcyAlZFxuIixfX2Z1bmNfXyxmb3JjZXJhdGUpOworCWlmKChmb3JjZXJhdGUgPT0gMikgfHwgKGZvcmNlcmF0ZSA9PSA0KSB8fCAoZm9yY2VyYXRlID09IDExKSB8fCAoZm9yY2VyYXRlID09IDIyKSB8fCAoZm9yY2VyYXRlID09IDEyKSB8fAorCQkoZm9yY2VyYXRlID09IDE4KSB8fCAoZm9yY2VyYXRlID09IDI0KSB8fCAoZm9yY2VyYXRlID09IDM2KSB8fCAoZm9yY2VyYXRlID09IDQ4KSB8fCAoZm9yY2VyYXRlID09IDcyKSB8fAorCQkoZm9yY2VyYXRlID09IDk2KSB8fCAoZm9yY2VyYXRlID09IDEwOCkpCisJeworCQlwcml2LT5Gb3JjZWREYXRhUmF0ZSA9IDE7CisJCXByaXYtPmllZWU4MDIxMS0+cmF0ZSA9IGZvcmNlcmF0ZSAqIDU7CisJfQorCWVsc2UgaWYoZm9yY2VyYXRlID09IDApCisJeworCQlwcml2LT5Gb3JjZWREYXRhUmF0ZSA9IDA7CisJCXByaW50aygiT0shIHJldHVybiByYXRlIGFkYXB0aXZlXG4iKTsKKwl9CisJZWxzZQorCQlwcmludGsoIkVSUjogd3JvbmcgcmF0ZVxuIik7CisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X2VuY19leHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCS8vcHJpbnRrKCI9PT0+JXMoKVxuIiwgX19mdW5jX18pOworCisJaW50IHJldD0wOworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCXJldCA9IGllZWU4MDIxMV93eF9zZXRfZW5jb2RlX2V4dChwcml2LT5pZWVlODAyMTEsIGluZm8sIHdycXUsIGV4dHJhKTsKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKwlyZXR1cm4gcmV0OworCit9CitzdGF0aWMgaW50IHI4MTgwX3d4X3NldF9hdXRoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKmRhdGEsIGNoYXIgKmV4dHJhKQoreworCS8vcHJpbnRrKCI9PT09PiVzKClcbiIsIF9fZnVuY19fKTsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50IHJldD0wOworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iSHdSYWRpb09mZikKKwkJcmV0dXJuIDA7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCXJldCA9IGllZWU4MDIxMV93eF9zZXRfYXV0aChwcml2LT5pZWVlODAyMTEsIGluZm8sIGRhdGEsIGV4dHJhKTsKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHI4MTgwX3d4X3NldF9tbG1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwkvL3ByaW50aygiPT09PT4lcygpXG4iLCBfX2Z1bmNfXyk7CisKKwlpbnQgcmV0PTA7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisKKwlpZihwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmKQorCQlyZXR1cm4gMDsKKworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKyNpZiAxCisJcmV0ID0gaWVlZTgwMjExX3d4X3NldF9tbG1lKHByaXYtPmllZWU4MDIxMSwgaW5mbywgd3JxdSwgZXh0cmEpOworI2VuZGlmCisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKK30KK3N0YXRpYyBpbnQgcjgxODBfd3hfc2V0X2dlbl9pZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKy8vCXByaW50aygiPT09PT4lcygpLCBsZW46JWRcbiIsIF9fZnVuY19fLCBkYXRhLT5sZW5ndGgpOworCWludCByZXQ9MDsKKyAgICAgICAgc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisKKwlpZihwcml2LT5pZWVlODAyMTEtPmJId1JhZGlvT2ZmKQorCQlyZXR1cm4gMDsKKworICAgICAgICBkb3duKCZwcml2LT53eF9zZW0pOworI2lmIDEKKyAgICAgICAgcmV0ID0gaWVlZTgwMjExX3d4X3NldF9nZW5faWUocHJpdi0+aWVlZTgwMjExLCBleHRyYSwgZGF0YS0+bGVuZ3RoKTsKKyNlbmRpZgorICAgICAgICB1cCgmcHJpdi0+d3hfc2VtKTsKKwkvL3ByaW50aygiPD09PT09PSVzKCksIHJldDolZFxuIiwgX19mdW5jX18sIHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisKKworfQorc3RhdGljIGl3X2hhbmRsZXIgcjgxODBfd3hfaGFuZGxlcnNbXSA9Cit7CisgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV0NPTU1JVCAqLworICAgICAgICByODE4MF93eF9nZXRfbmFtZSwgICAJICAvKiBTSU9DR0lXTkFNRSAqLworICAgICAgICBkdW1teSwgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdOV0lEICovCisgICAgICAgIGR1bW15LCAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV05XSUQgKi8KKyAgICAgICAgcjgxODBfd3hfc2V0X2ZyZXEsICAgICAgICAvKiBTSU9DU0lXRlJFUSAqLworICAgICAgICByODE4MF93eF9nZXRfZnJlcSwgICAgICAgIC8qIFNJT0NHSVdGUkVRICovCisgICAgICAgIHI4MTgwX3d4X3NldF9tb2RlLCAgICAgICAgLyogU0lPQ1NJV01PREUgKi8KKyAgICAgICAgcjgxODBfd3hfZ2V0X21vZGUsICAgICAgICAvKiBTSU9DR0lXTU9ERSAqLworICAgICAgICByODE4MF93eF9zZXRfc2VucywgICAgICAgIC8qIFNJT0NTSVdTRU5TICovCisgICAgICAgIHI4MTgwX3d4X2dldF9zZW5zLCAgICAgICAgLyogU0lPQ0dJV1NFTlMgKi8KKyAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXUkFOR0UgKi8KKyAgICAgICAgcnRsODE4MF93eF9nZXRfcmFuZ2UsCSAgLyogU0lPQ0dJV1JBTkdFICovCisgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1BSSVYgKi8KKyAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DR0lXUFJJViAqLworICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdTVEFUUyAqLworICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdTVEFUUyAqLworICAgICAgICBkdW1teSwgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdTUFkgKi8KKyAgICAgICAgZHVtbXksICAgICAgICAgICAgICAgICAgICAvKiBTSU9DR0lXU1BZICovCisgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1RIUlNQWSAqLworICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NXSVdUSFJTUFkgKi8KKyAgICAgICAgcjgxODBfd3hfc2V0X3dhcCwgICAgICAJICAvKiBTSU9DU0lXQVAgKi8KKyAgICAgICAgcjgxODBfd3hfZ2V0X3dhcCwgICAgICAgICAvKiBTSU9DR0lXQVAgKi8KKwlyODE4MF93eF9zZXRfbWxtZSwgICAgICAgIC8qIFNJT0NTSVdNTE1FKi8KKyAgICAgICAgZHVtbXksICAgICAgICAgICAgICAgICAgICAvKiBTSU9DR0lXQVBMSVNUIC0tIGRlcHJpY2F0ZWQgKi8KKyAgICAgICAgcjgxODBfd3hfc2V0X3NjYW4sICAgICAgICAvKiBTSU9DU0lXU0NBTiAqLworICAgICAgICByODE4MF93eF9nZXRfc2NhbiwgICAgICAgIC8qIFNJT0NHSVdTQ0FOICovCisgICAgICAgIHI4MTgwX3d4X3NldF9lc3NpZCwgICAgICAgLyogU0lPQ1NJV0VTU0lEICovCisgICAgICAgIHI4MTgwX3d4X2dldF9lc3NpZCwgICAgICAgLyogU0lPQ0dJV0VTU0lEICovCisgICAgICAgIGR1bW15LCAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV05JQ0tOICovCisgICAgICAgIGR1bW15LCAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV05JQ0tOICovCisgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogLS0gaG9sZSAtLSAqLworICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIC0tIGhvbGUgLS0gKi8KKyAgICAgICAgcjgxODBfd3hfc2V0X3JhdGUsICAgICAgICAvKiBTSU9DU0lXUkFURSAqLworICAgICAgICByODE4MF93eF9nZXRfcmF0ZSwgICAgICAgIC8qIFNJT0NHSVdSQVRFICovCisgICAgICAgIHI4MTgwX3d4X3NldF9ydHMsICAgICAgICAgLyogU0lPQ1NJV1JUUyAqLworICAgICAgICByODE4MF93eF9nZXRfcnRzLCAgICAgICAgIC8qIFNJT0NHSVdSVFMgKi8KKyAgICAgICAgcjgxODBfd3hfc2V0X2ZyYWcsICAgICAgICAvKiBTSU9DU0lXRlJBRyAqLworICAgICAgICByODE4MF93eF9nZXRfZnJhZywgICAgICAgIC8qIFNJT0NHSVdGUkFHICovCisgICAgICAgIGR1bW15LCAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1RYUE9XICovCisgICAgICAgIGR1bW15LCAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1RYUE9XICovCisgICAgICAgIHI4MTgwX3d4X3NldF9yZXRyeSwgICAgICAgLyogU0lPQ1NJV1JFVFJZICovCisgICAgICAgIHI4MTgwX3d4X2dldF9yZXRyeSwgICAgICAgLyogU0lPQ0dJV1JFVFJZICovCisgICAgICAgIHI4MTgwX3d4X3NldF9lbmMsICAgICAgICAgLyogU0lPQ1NJV0VOQ09ERSAqLworICAgICAgICByODE4MF93eF9nZXRfZW5jLCAgICAgICAgIC8qIFNJT0NHSVdFTkNPREUgKi8KKyAgICAgICAgcjgxODBfd3hfc2V0X3Bvd2VyLCAgICAgICAvKiBTSU9DU0lXUE9XRVIgKi8KKyAgICAgICAgcjgxODBfd3hfZ2V0X3Bvd2VyLCAgICAgICAvKiBTSU9DR0lXUE9XRVIgKi8KKyAgICAgICAgTlVMTCwJCQkgIC8qLS0taG9sZS0tLSovCisJTlVMTCwgCQkJICAvKi0tLWhvbGUtLS0qLworCXI4MTgwX3d4X3NldF9nZW5faWUsICAgICAgLyogU0lPQ1NJV0dFTklFICovCisJTlVMTCwgCQkJICAvKiBTSU9DU0lXR0VOSUUgKi8KKwlyODE4MF93eF9zZXRfYXV0aCwJICAvKiBTSU9DU0lXQVVUSCAqLworCU5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV0FVVEggKi8KKwlyODE4MF93eF9zZXRfZW5jX2V4dCwgCSAgLyogU0lPQ1NJV0VOQ09ERUVYVCAqLworCU5VTEwsICAgICAgICAgICAgICAgICAgCSAgLyogU0lPQ1NJV0VOQ09ERUVYVCAqLworCU5VTEwsIAkJCSAvKiBTSU9DU0lXUE1LU0EgKi8KKwlOVUxMLCAJCQkgIC8qLS0taG9sZS0tLSovCit9OworCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXdfcHJpdl9hcmdzIHI4MTgwX3ByaXZhdGVfYXJnc1tdID0geworCXsKKwkJU0lPQ0lXRklSU1RQUklWICsgMHgwLAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgImJhZGNyYyIKKwl9LAorCXsJU0lPQ0lXRklSU1RQUklWICsgMHgxLAorCQkwLCAwLCAiZHVtbXkiCisKKwl9LAorCXsKKwkJU0lPQ0lXRklSU1RQUklWICsgMHgyLAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgImJlYWNvbmludCIKKwl9LAorCXsJU0lPQ0lXRklSU1RQUklWICsgMHgzLAorCQkwLCAwLCAiZHVtbXkiCisKKwl9LAorCS8qIGFkZGVkIGJ5IGNocmlzdGlhbiAqLworCS8veworCS8vCVNJT0NJV0ZJUlNUUFJJViArIDB4MiwKKwkvLwlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgInByaXNtaGRyIgorCS8vfSwKKwkvKiBlbmQgYWRkZWQgYnkgY2hyaXN0aWFuICovCisJeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDQsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAiYWN0aXZlc2NhbiIKKworCX0sCisJewlTSU9DSVdGSVJTVFBSSVYgKyAweDUsCisJCTAsIDAsICJkdW1teSIKKworCX0sCisJeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDYsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAicmF3dHgiCisKKwl9LAorCXsJU0lPQ0lXRklSU1RQUklWICsgMHg3LAorCQkwLCAwLCAiZHVtbXkiCisKKwl9LAorLy8JeworLy8JCVNJT0NJV0ZJUlNUUFJJViArIDB4NSwKKy8vCQkwLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgImdldHBzbW9kZSIKKy8vCX0sCisvLwl7CisvLwkJU0lPQ0lXRklSU1RQUklWICsgMHg2LAorLy8JCUlXX1BSSVZfU0laRV9GSVhFRCwgMCwgInNldHBzbW9kZSIKKy8vCX0sCisvL3NldC9nZXQgbW9kZSBoYXZlIGJlZW4gcmVhbGl6ZWQgaW4gcHVibGljIGhhbmRsZXJzCisKKwl7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4OCwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJzZXRpd21vZGUiCisJfSwKKwl7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4OSwKKwkJMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfRklYRUQgfCAzMiwgImdldGl3bW9kZSIKKwl9LAorCXsKKwkJU0lPQ0lXRklSU1RQUklWICsgMHhBLAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgInNldHByZWFtYmxlIgorCX0sCisJeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweEIsCisJCTAsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiZ2V0cHJlYW1ibGUiCisJfSwKKwl7CVNJT0NJV0ZJUlNUUFJJViArIDB4QywKKwkJMCwgMCwgImR1bW15IgorCX0sCisJeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweEQsCisJCTAsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiZ2V0cnNzaSIKKwl9LAorCXsJU0lPQ0lXRklSU1RQUklWICsgMHhFLAorCQkwLCAwLCAiZHVtbXkiCisJfSwKKwl7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4RiwKKwkJMCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICJnZXRsaW5rcXVhbCIKKyAJfSwKKwl7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4MTAsCisJCTAsIDAsICJyZXNldHN0YXRzIgorIAl9LAorCXsKKwkJU0lPQ0lXRklSU1RQUklWICsgMHgxMSwKKwkJMCwwLCAiZHVtbXkiCisgCX0sCisJeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDEyLAorCQkwLCAwLCAicmFkaW9vbiIKKyAJfSwKKwl7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4MTMsCisJCTAsIDAsICJyYWRpb29mZiIKKyAJfSwKKyAJeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDE0LAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgInNldGNoYW5uZWwiCisgCX0sCisJeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDE1LAorCQkwLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgImdldGNoYW5uZWwiCisgCX0sCisJeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDE2LAorCQkwLDAsICJkdW1teSIKKyAJfSwKKwl7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4MTcsCisJCTAsSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfRklYRUQgfCAzMiwgImdldHZlcnNpb24iCisgCX0sCisJeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDE4LAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgInNldHJhdGUiCisJfSwKK307CisKKworc3RhdGljIGl3X2hhbmRsZXIgcjgxODBfcHJpdmF0ZV9oYW5kbGVyW10gPSB7CisJcjgxODBfd3hfc2V0X2NyY21vbiwgICAvKlNJT0NJV1NFQ09ORFBSSVYqLworCWR1bW15LAorCXI4MTgwX3d4X3NldF9iZWFjb25pbnRlcnZhbCwKKwlkdW1teSwKKwkvL3I4MTgwX3d4X3NldF9tb25pdG9yX3R5cGUsCisJcjgxODBfd3hfc2V0X3NjYW5fdHlwZSwKKwlkdW1teSwKKwlyODE4MF93eF9zZXRfcmF3dHgsCisJZHVtbXksCisJcjgxODBfd3hfc2V0X2l3bW9kZSwKKwlyODE4MF93eF9nZXRfaXdtb2RlLAorCXI4MTgwX3d4X3NldF9wcmVhbWJsZSwKKwlyODE4MF93eF9nZXRfcHJlYW1ibGUsCisJZHVtbXksCisJcjgxODBfd3hfZ2V0X3NpZ2xldmVsLAorCWR1bW15LAorCXI4MTgwX3d4X2dldF9zaWdxdWFsLAorCXI4MTgwX3d4X3Jlc2V0X3N0YXRzLAorCWR1bW15LC8vcjgxODBfd3hfZ2V0X3N0YXRzCisJcjgxODBfd3hfcmFkaW9fb24sCisJcjgxODBfd3hfcmFkaW9fb2ZmLAorCXI4MTgwX3d4X3NldF9jaGFubmVscGxhbiwKKwlyODE4MF93eF9nZXRfY2hhbm5lbHBsYW4sCisJZHVtbXksCisJcjgxODBfd3hfZ2V0X3ZlcnNpb24sCisJcjgxODBfd3hfc2V0X2ZvcmNlcmF0ZSwKK307CisKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKK3N0YXRpYyBpbmxpbmUgaW50IGlzX3NhbWVfbmV0d29yayhzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmRzdCwKKwkJCQkgIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworICAgICAgICAvKiBBIG5ldHdvcmsgaXMgb25seSBhIGR1cGxpY2F0ZSBpZiB0aGUgY2hhbm5lbCwgQlNTSUQsIEVTU0lECisgICAgICAgICAqIGFuZCB0aGUgY2FwYWJpbGl0eSBmaWVsZCAoaW4gcGFydGljdWxhciBJQlNTIGFuZCBCU1MpIGFsbCBtYXRjaC4KKyAgICAgICAgICogV2UgdHJlYXQgYWxsIDxoaWRkZW4+IHdpdGggdGhlIHNhbWUgQlNTSUQgYW5kIGNoYW5uZWwKKyAgICAgICAgICogYXMgb25lIG5ldHdvcmsgKi8KKyAgICAgICAgcmV0dXJuICgoKHNyYy0+c3NpZF9sZW4gPT0gZHN0LT5zc2lkX2xlbil8fChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpKSAmJiAgLy9ZSixtb2QsIDA4MDgxOSxmb3IgaGlkZGVuIGFwCisJCQkvLygoc3JjLT5zc2lkX2xlbiA9PSBkc3QtPnNzaWRfbGVuKSAmJgorCQkJKHNyYy0+Y2hhbm5lbCA9PSBkc3QtPmNoYW5uZWwpICYmCisJCQkhbWVtY21wKHNyYy0+YnNzaWQsIGRzdC0+YnNzaWQsIEVUSF9BTEVOKSAmJgorCQkJKCFtZW1jbXAoc3JjLT5zc2lkLCBkc3QtPnNzaWQsIHNyYy0+c3NpZF9sZW4pfHwoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSkgJiYgIC8vWUosbW9kLCAwODA4MTksZm9yIGhpZGRlbiBhcAorCQkJLy8hbWVtY21wKHNyYy0+c3NpZCwgZHN0LT5zc2lkLCBzcmMtPnNzaWRfbGVuKSAmJgorCQkJKChzcmMtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfSUJTUykgPT0KKwkJCShkc3QtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfSUJTUykpICYmCisJCQkoKHNyYy0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9CU1MpID09CisJCQkoZHN0LT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0JTUykpKTsKK30KKworLy9XQiBtb2RlZmllZCB0byBzaG93IHNpZ25hbCB0byBHVUkgb24gMTgtMDEtMjAwOAorc3RhdGljIHN0cnVjdCBpd19zdGF0aXN0aWNzICpyODE4MF9nZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICBzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUgPSBwcml2LT5pZWVlODAyMTE7CisJc3RydWN0IGl3X3N0YXRpc3RpY3MqIHdzdGF0cyA9ICZwcml2LT53c3RhdHM7CisJLy9zdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsqIHRhcmdldCA9IE5VTEw7CisJaW50IHRtcF9sZXZlbCA9IDA7CisJaW50IHRtcF9xdWFsID0gMDsKKwlpbnQgdG1wX25vaXNlID0gMDsKKwkvL3Vuc2lnbmVkIGxvbmcgZmxhZzsKKworCWlmIChpZWVlLT5zdGF0ZSA8IElFRUU4MDIxMV9MSU5LRUQpCisJeworCQl3c3RhdHMtPnF1YWwucXVhbCA9IDA7CisJCXdzdGF0cy0+cXVhbC5sZXZlbCA9IDA7CisJCXdzdGF0cy0+cXVhbC5ub2lzZSA9IDA7CisJCXdzdGF0cy0+cXVhbC51cGRhdGVkID0gSVdfUVVBTF9BTExfVVBEQVRFRCB8IElXX1FVQUxfREJNOworCQlyZXR1cm4gd3N0YXRzOworCX0KKyNpZiAwCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWcpOworCWxpc3RfZm9yX2VhY2hfZW50cnkodGFyZ2V0LCAmaWVlZS0+bmV0d29ya19saXN0LCBsaXN0KQorCXsKKwkJaWYgKGlzX3NhbWVfbmV0d29yayh0YXJnZXQsICZpZWVlLT5jdXJyZW50X25ldHdvcmssIGllZWUpKQorCQl7CisJCQlwcmludGsoIml0J3Mgc2FtZSBuZXR3b3JrOiVzXG4iLCB0YXJnZXQtPnNzaWQpOworI2lmIDAKKwkJCWlmICghdG1wX2xldmVsKQorCQkJeworCQkJCXRtcF9sZXZlbCA9IHRhcmdldC0+c3RhdHMuc2lnbmFsc3RyZW5ndGg7CisJCQkJdG1wX3F1YWwgPSB0YXJnZXQtPnN0YXRzLnNpZ25hbDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKworCQkJCXRtcF9sZXZlbCA9ICgxNSp0bXBfbGV2ZWwgKyB0YXJnZXQtPnN0YXRzLnNpZ25hbHN0cmVuZ3RoKS8xNjsKKwkJCQl0bXBfcXVhbCA9ICgxNSp0bXBfcXVhbCArIHRhcmdldC0+c3RhdHMuc2lnbmFsKS8xNjsKKwkJCX0KKyNlbHNlCisJCQl0bXBfbGV2ZWwgPSB0YXJnZXQtPnN0YXRzLnNpZ25hbDsKKwkJCXRtcF9xdWFsID0gdGFyZ2V0LT5zdGF0cy5zaWduYWxzdHJlbmd0aDsKKwkJCXRtcF9ub2lzZSA9IHRhcmdldC0+c3RhdHMubm9pc2U7CisJCQlwcmludGsoImxldmVsOiVkLCBxdWFsOiVkLCBub2lzZTolZFxuIiwgdG1wX2xldmVsLCB0bXBfcXVhbCwgdG1wX25vaXNlKTsKKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZyk7CisjZW5kaWYKKwl0bXBfbGV2ZWwgPSAoJmllZWUtPmN1cnJlbnRfbmV0d29yayktPnN0YXRzLnNpZ25hbDsKKwl0bXBfcXVhbCA9ICgmaWVlZS0+Y3VycmVudF9uZXR3b3JrKS0+c3RhdHMuc2lnbmFsc3RyZW5ndGg7CisJdG1wX25vaXNlID0gKCZpZWVlLT5jdXJyZW50X25ldHdvcmspLT5zdGF0cy5ub2lzZTsKKwkvL3ByaW50aygibGV2ZWw6JWQsIHF1YWw6JWQsIG5vaXNlOiVkXG4iLCB0bXBfbGV2ZWwsIHRtcF9xdWFsLCB0bXBfbm9pc2UpOworCisvLwlwcmludGsoImxldmVsOiVkXG4iLCB0bXBfbGV2ZWwpOworCXdzdGF0cy0+cXVhbC5sZXZlbCA9IHRtcF9sZXZlbDsKKwl3c3RhdHMtPnF1YWwucXVhbCA9IHRtcF9xdWFsOworCXdzdGF0cy0+cXVhbC5ub2lzZSA9IHRtcF9ub2lzZTsKKwl3c3RhdHMtPnF1YWwudXBkYXRlZCA9IElXX1FVQUxfQUxMX1VQREFURUR8IElXX1FVQUxfREJNOworCXJldHVybiB3c3RhdHM7Cit9CisjZW5kaWYKKworCitzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgIHI4MTgwX3d4X2hhbmRsZXJzX2RlZj17CisJLnN0YW5kYXJkID0gcjgxODBfd3hfaGFuZGxlcnMsCisJLm51bV9zdGFuZGFyZCA9IHNpemVvZihyODE4MF93eF9oYW5kbGVycykgLyBzaXplb2YoaXdfaGFuZGxlciksCisJLnByaXZhdGUgPSByODE4MF9wcml2YXRlX2hhbmRsZXIsCisJLm51bV9wcml2YXRlID0gc2l6ZW9mKHI4MTgwX3ByaXZhdGVfaGFuZGxlcikgLyBzaXplb2YoaXdfaGFuZGxlciksCisgCS5udW1fcHJpdmF0ZV9hcmdzID0gc2l6ZW9mKHI4MTgwX3ByaXZhdGVfYXJncykgLyBzaXplb2Yoc3RydWN0IGl3X3ByaXZfYXJncyksCisjaWYgV0lSRUxFU1NfRVhUID49IDE3CisJLmdldF93aXJlbGVzc19zdGF0cyA9IHI4MTgwX2dldF93aXJlbGVzc19zdGF0cywKKyNlbmRpZgorCS5wcml2YXRlX2FyZ3MgPSAoc3RydWN0IGl3X3ByaXZfYXJncyAqKXI4MTgwX3ByaXZhdGVfYXJncywKK307CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF93eC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF93eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMGE2N2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3d4LmgKQEAgLTAsMCArMSwyMSBAQAorLyoKKwlUaGlzIGlzIHBhcnQgb2YgcnRsODE4MCBPcGVuU291cmNlIGRyaXZlciAtIHYgMC4zCisJQ29weXJpZ2h0IChDKSBBbmRyZWEgTWVyZWxsbyAyMDA0ICA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisJUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdQTCAoR2VuZXJhbCBQdWJsaWMgTGljZW5jZSkKKworCVBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgR1BMIHBhcnQgb2YgdGhlIG9mZmljaWFsIHJlYWx0ZWsgZHJpdmVyCisJUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBydGw4MTgwIGRyaXZlciBza2VsZXRvbiBmcm9tIFBhdHJpYyBTY2hlbmtlICYgQW5kcmVzIFNhbG9tb24KKwlQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEludGVsIFBybyBXaXJlbGVzcyAyMTAwIEdQTCBkcml2ZXIKKworCVdlIHdhbnQgdG8gdGFua3MgdGhlIEF1dGhvcnMgb2Ygc3VjaCBwcm9qZWN0cyBhbmQgdGhlIE5kaXN3cmFwcGVyIHByb2plY3QgQXV0aG9ycy4KKyovCisKKy8qIHRoaXMgZmlsZSAod2lsbCkgY29udGFpbnMgd2lyZWxlc3MgZXh0ZW5zaW9uIGhhbmRsZXJzKi8KKworI2lmbmRlZiBSODE4MF9XWF9ICisjZGVmaW5lIFI4MTgwX1dYX0gKKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgImllZWU4MDIxMS5oIgorZXh0ZXJuIHN0cnVjdCBpd19oYW5kbGVyX2RlZiByODE4MF93eF9oYW5kbGVyc19kZWY7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4NWJfaW5pdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4NWJfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiODg1YTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTg1Yl9pbml0LmMKQEAgLTAsMCArMSwzMzQyIEBACisvKisrCitDb3B5cmlnaHQgKGMpIFJlYWx0ZWsgU2VtaWNvbmR1Y3RvciBDb3JwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCitNb2R1bGUgTmFtZToKKyAJcjgxODViX2luaXQuYworCitBYnN0cmFjdDoKKyAJSGFyZHdhcmUgSW5pdGlhbGl6YXRpb24gYW5kIEhhcmR3YXJlIElPIGZvciBSVEw4MTg1QgorCitNYWpvciBDaGFuZ2UgSGlzdG9yeToKKwlXaGVuICAgICAgICBXaG8gICAgICBXaGF0CisJLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJMjAwNi0xMS0xNSAgICBYaW9uZwkJQ3JlYXRlZAorCitOb3RlczoKKwlUaGlzIGZpbGUgaXMgcG9ydGVkIGZyb20gUlRMODE4NUIgV2luZG93cyBkcml2ZXIuCisKKworLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tSW5jbHVkZSBGaWxlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgInI4MTgwX2h3LmgiCisjaW5jbHVkZSAicjgxODAuaCIKKyNpbmNsdWRlICJyODE4MF9zYTI0MDAuaCIgIC8qIFBISUxJUFMgUmFkaW8gZnJvbnRlbmQgKi8KKyNpbmNsdWRlICJyODE4MF9tYXgyODIwLmgiIC8qIE1BWElNIFJhZGlvIGZyb250ZW5kICovCisjaW5jbHVkZSAicjgxODBfZ2N0LmgiICAgICAvKiBHQ1QgUmFkaW8gZnJvbnRlbmQgKi8KKyNpbmNsdWRlICJyODE4MF9ydGw4MjI1LmgiIC8qIFJUTDgyMjUgUmFkaW8gZnJvbnRlbmQgKi8KKyNpbmNsdWRlICJyODE4MF9ydGw4MjU1LmgiIC8qIFJUTDgyNTUgUmFkaW8gZnJvbnRlbmQgKi8KKyNpbmNsdWRlICJyODE4MF85M2N4Ni5oIiAgIC8qIENhcmQgRUVQUk9NICovCisjaW5jbHVkZSAicjgxODBfd3guaCIKKworI2lmZGVmIENPTkZJR19SVEw4MTgwX1BNCisjaW5jbHVkZSAicjgxODBfcG0uaCIKKyNlbmRpZgorCisjaWZkZWYgRU5BQkxFX0RPVDExRAorI2luY2x1ZGUgImRvdDExZC5oIgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUlRMODE4NUIKKworLy8jZGVmaW5lIENPTkZJR19SVEw4MTgwX0lPX01BUAorCisjZGVmaW5lIFRDXzNXX1BPTExfTUFYX1RSWV9DTlQgNQorI2lmZGVmIENPTkZJR19SVEw4MThYX1MKK3N0YXRpYyB1OCBNQUNfUkVHX1RBQkxFW11bMl09eworICAgICAgICAgICAgICAgICAgICAgICAgLy9QQUdBIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAweDM0KEJSU1IpLCAweEJFKFJBVEVfRkFMTEJBQ0tfQ1RMKSwgMHgxRTAoQVJGUikgd291bGQgc2V0IGluIEh3Q29uZmlndXJlUlRMODE4NSgpCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAweDI3MihSRlNXX0NUUkwpLCAweDFDRShBRVNNU0tfUUMpIHNldCBpbiBJbml0aWFsaXplQWRhcHRlcjgxODUoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIDB4MUYwfjB4MUY4ICBzZXQgaW4gTWFjQ29uZmlnXzg1QkFTSUMoKQorICAgICAgICAgICAgICAgICAgICAgICAgezB4MDgsIDB4YWV9LCB7MHgwYSwgMHg3Mn0sIHsweDViLCAweDQyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsweDg0LCAweDg4fSwgezB4ODUsIDB4MjR9LCB7MHg4OCwgMHg1NH0sIHsweDhiLCAweGI4fSwgezB4OGMsIDB4MDN9LAorICAgICAgICAgICAgICAgICAgICAgICAgezB4OGQsIDB4NDB9LCB7MHg4ZSwgMHgwMH0sIHsweDhmLCAweDAwfSwgezB4NWIsIDB4MTh9LCB7MHg5MSwgMHgwM30sCisgICAgICAgICAgICAgICAgICAgICAgICB7MHg5NCwgMHgwRn0sIHsweDk1LCAweDMyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsweDk2LCAweDAwfSwgezB4OTcsIDB4MDd9LCB7MHhiNCwgMHgyMn0sIHsweGRiLCAweDAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsweGYwLCAweDMyfSwgezB4ZjEsIDB4MzJ9LCB7MHhmMiwgMHgwMH0sIHsweGYzLCAweDAwfSwgezB4ZjQsIDB4MzJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgezB4ZjUsIDB4NDN9LCB7MHhmNiwgMHgwMH0sIHsweGY3LCAweDAwfSwgezB4ZjgsIDB4NDZ9LCB7MHhmOSwgMHhhNH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7MHhmYSwgMHgwMH0sIHsweGZiLCAweDAwfSwgezB4ZmMsIDB4OTZ9LCB7MHhmZCwgMHhhNH0sIHsweGZlLCAweDAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsweGZmLCAweDAwfSwKKworICAgICAgICAgICAgICAgICAgICAgICAgLy9QQUdFIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgRmxleHRyb25pY3Mgc3lzdGVtIExvZ28gUENJSENUIGZhaWx1cmU6CisJCQkvLyAweDFDNH4weDFDRCBzZXQgbm8temVybyB2YWx1ZSB0byBhdm9pZCBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSAweDQ1WzddPTEKKyAgICAgICAgICAgICAgICAgICAgICAgIHsweDVlLCAweDAxfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsweDU4LCAweDAwfSwgezB4NTksIDB4MDB9LCB7MHg1YSwgMHgwNH0sIHsweDViLCAweDAwfSwgezB4NjAsIDB4MjR9LAorICAgICAgICAgICAgICAgICAgICAgICAgezB4NjEsIDB4OTd9LCB7MHg2MiwgMHhGMH0sIHsweDYzLCAweDA5fSwgezB4ODAsIDB4MEZ9LCB7MHg4MSwgMHhGRn0sCisgICAgICAgICAgICAgICAgICAgICAgICB7MHg4MiwgMHhGRn0sIHsweDgzLCAweDAzfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsweEM0LCAweDIyfSwgezB4QzUsIDB4MjJ9LCB7MHhDNiwgMHgyMn0sIHsweEM3LCAweDIyfSwgezB4QzgsIDB4MjJ9LCAvL2x6bSBhZGQgMDgwODI2CisJCQl7MHhDOSwgMHgyMn0sIHsweENBLCAweDIyfSwgezB4Q0IsIDB4MjJ9LCB7MHhDQywgMHgyMn0sIHsweENELCAweDIyfSwvL2x6bSBhZGQgMDgwODI2CisgICAgICAgICAgICAgICAgICAgICAgICB7MHhlMiwgMHgwMH0sCisKKworICAgICAgICAgICAgICAgICAgICAgICAgLy9QQUdFIDI6CisgICAgICAgICAgICAgICAgICAgICAgICB7MHg1ZSwgMHgwMn0sCisgICAgICAgICAgICAgICAgICAgICAgICB7MHgwYywgMHgwNH0sIHsweDRjLCAweDMwfSwgezB4NGQsIDB4MDh9LCB7MHg1MCwgMHgwNX0sIHsweDUxLCAweGY1fSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsweDUyLCAweDA0fSwgezB4NTMsIDB4YTB9LCB7MHg1NCwgMHhmZn0sIHsweDU1LCAweGZmfSwgezB4NTYsIDB4ZmZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgezB4NTcsIDB4ZmZ9LCB7MHg1OCwgMHgwOH0sIHsweDU5LCAweDA4fSwgezB4NWEsIDB4MDh9LCB7MHg1YiwgMHgwOH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7MHg2MCwgMHgwOH0sIHsweDYxLCAweDA4fSwgezB4NjIsIDB4MDh9LCB7MHg2MywgMHgwOH0sIHsweDY0LCAweDJmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsweDhjLCAweDNmfSwgezB4OGQsIDB4M2Z9LCB7MHg4ZSwgMHgzZn0sCisgICAgICAgICAgICAgICAgICAgICAgICB7MHg4ZiwgMHgzZn0sIHsweGM0LCAweGZmfSwgezB4YzUsIDB4ZmZ9LCB7MHhjNiwgMHhmZn0sIHsweGM3LCAweGZmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsweGM4LCAweDAwfSwgezB4YzksIDB4MDB9LCB7MHhjYSwgMHg4MH0sIHsweGNiLCAweDAwfSwKKworICAgICAgICAgICAgICAgICAgICAgICAgLy9QQUdBIDA6CisgICAgICAgICAgICAgICAgICAgICAgICB7MHg1ZSwgMHgwMH0sezB4OWYsIDB4MDN9CisgICAgICAgICAgICAgICAgfTsKKworCitzdGF0aWMgdTggIFpFQlJBX0FHQ1tdPXsKKwkJCTAsCisJCQkweDdFLDB4N0UsMHg3RSwweDdFLDB4N0QsMHg3QywweDdCLDB4N0EsMHg3OSwweDc4LDB4NzcsMHg3NiwweDc1LDB4NzQsMHg3MywweDcyLAorCQkJMHg3MSwweDcwLDB4NkYsMHg2RSwweDZELDB4NkMsMHg2QiwweDZBLDB4NjksMHg2OCwweDY3LDB4NjYsMHg2NSwweDY0LDB4NjMsMHg2MiwKKwkJCTB4NDgsMHg0NywweDQ2LDB4NDUsMHg0NCwweDI5LDB4MjgsMHgyNywweDI2LDB4MjUsMHgyNCwweDIzLDB4MjIsMHgyMSwweDA4LDB4MDcsCisJCQkweDA2LDB4MDUsMHgwNCwweDAzLDB4MDIsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCQkJMHgwZiwweDBmLDB4MGYsMHgwZiwweDBmLDB4MGYsMHgwZiwweDBmLDB4MGYsMHgwZiwweDEwLDB4MTEsMHgxMiwweDEzLDB4MTUsMHgxNiwKKwkJCTB4MTcsMHgxNywweDE4LDB4MTgsMHgxOSwweDFhLDB4MWEsMHgxYiwweDFiLDB4MWMsMHgxYywweDFkLDB4MWQsMHgxZCwweDFlLDB4MWUsCisJCQkweDFmLDB4MWYsMHgxZiwweDIwLDB4MjAsMHgyMCwweDIwLDB4MjEsMHgyMSwweDIxLDB4MjIsMHgyMiwweDIyLDB4MjMsMHgyMywweDI0LAorCQkJMHgyNCwweDI1LDB4MjUsMHgyNSwweDI2LDB4MjYsMHgyNywweDI3LDB4MkYsMHgyRiwweDJGLDB4MkYsMHgyRiwweDJGLDB4MkYsMHgyRgorCQkJfTsKKworc3RhdGljIHUzMiBaRUJSQV9SRl9SWF9HQUlOX1RBQkxFW109eworCQkJMHgwMDk2LDB4MDA3NiwweDAwNTYsMHgwMDM2LDB4MDAxNiwweDAxZjYsMHgwMWQ2LDB4MDFiNiwKKwkJCTB4MDE5NiwweDAxNzYsMHgwMEY3LDB4MDBENywweDAwQjcsMHgwMDk3LDB4MDA3NywweDAwNTcsCisJCQkweDAwMzcsMHgwMEZCLDB4MDBEQiwweDAwQkIsMHgwMEZGLDB4MDBFMywweDAwQzMsMHgwMEEzLAorCQkJMHgwMDgzLDB4MDA2MywweDAwNDMsMHgwMDIzLDB4MDAwMywweDAxRTMsMHgwMUMzLDB4MDFBMywKKwkJCTB4MDE4MywweDAxNjMsMHgwMTQzLDB4MDEyMywweDAxMDMKKwl9OworCitzdGF0aWMgdTggT0ZETV9DT05GSUdbXT17CisJCQkvLyBPRkRNIHJlZzB4MDZbNzowXT0weEZGOiBFbmFibGUgcG93ZXIgc2F2aW5nIG1vZGUgaW4gUlgKKwkJCS8vIE9GRE0gcmVnMHgzQ1s0XT0xJ2IxOiBFbmFibGUgUlggcG93ZXIgc2F2aW5nIG1vZGUKKwkJCS8vIG9mZG0gMHgzYSA9IDB4N2IgLChvcmlnaW5hbCA6IDB4ZmIpIEZvciBFQ1Mgc2hpZWxkaW5nIHJvb20gVFAgdGVzdAorCisJCQkvLyAweDAwCisJCQkweDEwLCAweDBGLCAweDBBLCAweDBDLCAweDE0LCAweEZBLCAweEZGLCAweDUwLAorCQkJMHgwMCwgMHg1MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg1QywgMHgwMCwgMHgwMCwKKwkJCS8vIDB4MTAKKwkJCTB4NDAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTgsIDB4MjYsCisJCQkweDMyLCAweDMzLCAweDA2LCAweEE1LCAweDZGLCAweDU1LCAweEM4LCAweEJCLAorCQkJLy8gMHgyMAorCQkJMHgwQSwgMHhFMSwgMHgyQywgMHg0QSwgMHg4NiwgMHg4MywgMHgzNCwgMHgwMCwKKwkJCTB4NEYsIDB4MjQsIDB4NkYsIDB4QzIsIDB4MDMsIDB4NDAsIDB4ODAsIDB4MDAsCisJCQkvLyAweDMwCisJCQkweEMwLCAweEMxLCAweDU4LCAweEYxLCAweDAwLCAweEM0LCAweDkwLCAweDNlLAorCQkJMHhEOCwgMHgzQywgMHg3QiwgMHgxMCwgMHgxMAorCQl9OworI2Vsc2UKKyBzdGF0aWMgdTggTUFDX1JFR19UQUJMRVtdWzJdPXsKKwkJCS8vUEFHQSAwOgorCQkJezB4ZjAsIDB4MzJ9LCB7MHhmMSwgMHgzMn0sIHsweGYyLCAweDAwfSwgezB4ZjMsIDB4MDB9LCB7MHhmNCwgMHgzMn0sCisJCQl7MHhmNSwgMHg0M30sIHsweGY2LCAweDAwfSwgezB4ZjcsIDB4MDB9LCB7MHhmOCwgMHg0Nn0sIHsweGY5LCAweGE0fSwKKwkJCXsweGZhLCAweDAwfSwgezB4ZmIsIDB4MDB9LCB7MHhmYywgMHg5Nn0sIHsweGZkLCAweGE0fSwgezB4ZmUsIDB4MDB9LAorCQkJezB4ZmYsIDB4MDB9LAorCisJCQkvL1BBR0UgMToKKwkJCXsweDVlLCAweDAxfSwKKwkJCXsweDU4LCAweDRifSwgezB4NTksIDB4MDB9LCB7MHg1YSwgMHg0Yn0sIHsweDViLCAweDAwfSwgezB4NjAsIDB4NGJ9LAorCQkJezB4NjEsIDB4MDl9LCB7MHg2MiwgMHg0Yn0sIHsweDYzLCAweDA5fSwgezB4Y2UsIDB4MGZ9LCB7MHhjZiwgMHgwMH0sCisJCQl7MHhlMCwgMHhmZn0sIHsweGUxLCAweDBmfSwgezB4ZTIsIDB4MDB9LCB7MHhmMCwgMHg0ZX0sIHsweGYxLCAweDAxfSwKKwkJCXsweGYyLCAweDAyfSwgezB4ZjMsIDB4MDN9LCB7MHhmNCwgMHgwNH0sIHsweGY1LCAweDA1fSwgezB4ZjYsIDB4MDZ9LAorCQkJezB4ZjcsIDB4MDd9LCB7MHhmOCwgMHgwOH0sCisKKworCQkJLy9QQUdFIDI6CisJCQl7MHg1ZSwgMHgwMn0sCisJCQl7MHgwYywgMHgwNH0sIHsweDIxLCAweDYxfSwgezB4MjIsIDB4Njh9LCB7MHgyMywgMHg2Zn0sIHsweDI0LCAweDc2fSwKKwkJCXsweDI1LCAweDdkfSwgezB4MjYsIDB4ODR9LCB7MHgyNywgMHg4ZH0sIHsweDRkLCAweDA4fSwgezB4NGUsIDB4MDB9LAorCQkJezB4NTAsIDB4MDV9LCB7MHg1MSwgMHhmNX0sIHsweDUyLCAweDA0fSwgezB4NTMsIDB4YTB9LCB7MHg1NCwgMHgxZn0sCisJCQl7MHg1NSwgMHgyM30sIHsweDU2LCAweDQ1fSwgezB4NTcsIDB4Njd9LCB7MHg1OCwgMHgwOH0sIHsweDU5LCAweDA4fSwKKwkJCXsweDVhLCAweDA4fSwgezB4NWIsIDB4MDh9LCB7MHg2MCwgMHgwOH0sIHsweDYxLCAweDA4fSwgezB4NjIsIDB4MDh9LAorCQkJezB4NjMsIDB4MDh9LCB7MHg2NCwgMHhjZn0sIHsweDcyLCAweDU2fSwgezB4NzMsIDB4OWF9LAorCisJCQkvL1BBR0EgMDoKKwkJCXsweDVlLCAweDAwfSwKKwkJCXsweDM0LCAweGZmfSwgezB4MzUsIDB4MGZ9LCB7MHg1YiwgMHg0MH0sIHsweDg0LCAweDg4fSwgezB4ODUsIDB4MjR9LAorCQkJezB4ODgsIDB4NTR9LCB7MHg4YiwgMHhiOH0sIHsweDhjLCAweDA3fSwgezB4OGQsIDB4MDB9LCB7MHg5NCwgMHgxYn0sCisJCQl7MHg5NSwgMHgxMn0sIHsweDk2LCAweDAwfSwgezB4OTcsIDB4MDZ9LCB7MHg5ZCwgMHgxYX0sIHsweDlmLCAweDEwfSwKKwkJCXsweGI0LCAweDIyfSwgezB4YmUsIDB4ODB9LCB7MHhkYiwgMHgwMH0sIHsweGVlLCAweDAwfSwgezB4NWIsIDB4NDJ9LAorCQkJezB4OTEsIDB4MDN9LAorCisJCQkvL1BBR0UgMjoKKwkJCXsweDVlLCAweDAyfSwKKwkJCXsweDRjLCAweDAzfSwKKworCQkJLy9QQUdFIDA6CisJCQl7MHg1ZSwgMHgwMH0sCisKKwkJCS8vUEFHRSAzOgorCQkJezB4NWUsIDB4MDN9LAorCQkJezB4OWYsIDB4MDB9LAorCisJCQkvL1BBR0UgMDoKKwkJCXsweDVlLCAweDAwfSwKKwkJCXsweDhjLCAweDAxfSwgezB4OGQsIDB4MTB9LHsweDhlLCAweDA4fSwgezB4OGYsIDB4MDB9CisJCX07CisKKworc3RhdGljIHU4ICBaRUJSQV9BR0NbXT17CisJMCwKKwkweDVlLDB4NWUsMHg1ZSwweDVlLDB4NWQsMHg1YiwweDU5LDB4NTcsMHg1NSwweDUzLDB4NTEsMHg0ZiwweDRkLDB4NGIsMHg0OSwweDQ3LAorCTB4NDUsMHg0MywweDQxLDB4M2YsMHgzZCwweDNiLDB4MzksMHgzNywweDM1LDB4MzMsMHgzMSwweDJmLDB4MmQsMHgyYiwweDI5LDB4MjcsCisJMHgyNSwweDIzLDB4MjEsMHgxZiwweDFkLDB4MWIsMHgxOSwweDE3LDB4MTUsMHgxMywweDExLDB4MGYsMHgwZCwweDBiLDB4MDksMHgwNywKKwkweDA1LDB4MDMsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLAorCTB4MTksMHgxOSwweDE5LDB4MDE5LDB4MTksMHgxOSwweDE5LDB4MTksMHgxOSwweDE5LDB4MWUsMHgxZiwweDIwLDB4MjEsMHgyMSwweDIyLAorCTB4MjMsMHgyNCwweDI0LDB4MjUsMHgyNSwweDI2LDB4MjYsMHgyNywweDI3LDB4MjgsMHgyOCwweDI4LDB4MjksMHgyYSwweDJhLDB4MmIsCisJMHgyYiwweDJiLDB4MmMsMHgyYywweDJjLDB4MmQsMHgyZCwweDJkLDB4MmUsMHgyZSwweDJmLDB4MzAsMHgzMSwweDMxLDB4MzEsMHgzMSwKKwkweDMxLDB4MzEsMHgzMSwweDMxLDB4MzEsMHgzMSwweDMxLDB4MzEsMHgzMSwweDMxLDB4MzEsMHgzMSwweDMxLDB4MzEsMHgzMSwweDMxCisJfTsKKworc3RhdGljIHUzMiBaRUJSQV9SRl9SWF9HQUlOX1RBQkxFW109eworCTAsCisJMHgwNDAwLDB4MDQwMSwweDA0MDIsMHgwNDAzLDB4MDQwNCwweDA0MDUsMHgwNDA4LDB4MDQwOSwKKwkweDA0MGEsMHgwNDBiLDB4MDUwMiwweDA1MDMsMHgwNTA0LDB4MDUwNSwweDA1NDAsMHgwNTQxLAorCTB4MDU0MiwweDA1NDMsMHgwNTQ0LDB4MDU0NSwweDA1ODAsMHgwNTgxLDB4MDU4MiwweDA1ODMsCisJMHgwNTg0LDB4MDU4NSwweDA1ODgsMHgwNTg5LDB4MDU4YSwweDA1OGIsMHgwNjQzLDB4MDY0NCwKKwkweDA2NDUsMHgwNjgwLDB4MDY4MSwweDA2ODIsMHgwNjgzLDB4MDY4NCwweDA2ODUsMHgwNjg4LAorCTB4MDY4OSwweDA2OGEsMHgwNjhiLDB4MDY4YywweDA3NDIsMHgwNzQzLDB4MDc0NCwweDA3NDUsCisJMHgwNzgwLDB4MDc4MSwweDA3ODIsMHgwNzgzLDB4MDc4NCwweDA3ODUsMHgwNzg4LDB4MDc4OSwKKwkweDA3OGEsMHgwNzhiLDB4MDc4YywweDA3OGQsMHgwNzkwLDB4MDc5MSwweDA3OTIsMHgwNzkzLAorCTB4MDc5NCwweDA3OTUsMHgwNzk4LDB4MDc5OSwweDA3OWEsMHgwNzliLDB4MDc5YywweDA3OWQsCisJMHgwN2EwLDB4MDdhMSwweDA3YTIsMHgwN2EzLDB4MDdhNCwweDA3YTUsMHgwN2E4LDB4MDdhOSwKKwkweDAzYWEsMHgwM2FiLDB4MDNhYywweDAzYWQsMHgwM2IwLDB4MDNiMSwweDAzYjIsMHgwM2IzLAorCTB4MDNiNCwweDAzYjUsMHgwM2I4LDB4MDNiOSwweDAzYmEsMHgwM2JiLDB4MDNiYgorfTsKKworLy8gMjAwNi4wNy4xMywgU0QzIHN6dXlpdGFzaToKKy8vCU9GRE0uMHgwMz0weDBDIChvcmlnaW5hbCBpcyAweDBGKQorLy8gVXNlIHRoZSBuZXcgU0QzIGdpdmVuIHBhcmFtLCBieSBzaGllbiBjaGFuZywgMjAwNi4wNy4xNAorc3RhdGljIHU4IE9GRE1fQ09ORklHW109eworCTB4MTAsIDB4MGQsIDB4MDEsIDB4MEMsIDB4MTQsIDB4ZmIsIDB4MGYsIDB4NjAsIDB4MDAsIDB4NjAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHg1YywgMHgwMCwgMHgwMCwgMHg0MCwgMHgwMCwgMHg0MCwgMHgwMCwKKwkweDAwLCAweDAwLCAweGE4LCAweDQ2LCAweGIyLCAweDMzLCAweDA3LCAweGE1LCAweDZmLCAweDU1LAorCTB4YzgsIDB4YjMsIDB4MGEsIDB4ZTEsIDB4MWMsIDB4OGEsIDB4YjYsIDB4ODMsIDB4MzQsIDB4MGYsCisJMHg0ZiwgMHgyMywgMHg2ZiwgMHhjMiwgMHg2YiwgMHg0MCwgMHg4MCwgMHgwMCwgMHhjMCwgMHhjMSwKKwkweDU4LCAweGYxLCAweDAwLCAweGU0LCAweDkwLCAweDNlLCAweDZkLCAweDNjLCAweGZmLCAweDA3Cit9OworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICogSGFyZHdhcmUgSU8KKyAgKiB0aGUgY29kZSBpcyBwb3J0ZWQgZnJvbSBXaW5kb3dzIHNvdXJjZSBjb2RlCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkCitQbGF0Zm9ybUlPV3JpdGUxQnl0ZSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXUzMgkJb2Zmc2V0LAorCXU4CQlkYXRhCisJKQoreworI2lmbmRlZiBDT05GSUdfUlRMODE4MF9JT19NQVAKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIG9mZnNldCwgZGF0YSk7CisJcmVhZF9uaWNfYnl0ZShkZXYsIG9mZnNldCk7IC8vIFRvIG1ha2Ugc3VyZSB3cml0ZSBvcGVyYXRpb24gaXMgY29tcGxldGVkLCAyMDA1LjExLjA5LCBieSByY25qa28uCisKKyNlbHNlIC8vIFBvcnQgSU8KKwl1MzIgUGFnZSA9IChvZmZzZXQgPj4gOCk7CisKKwlzd2l0Y2goUGFnZSkKKwl7CisJY2FzZSAwOiAvLyBQYWdlIDAKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBvZmZzZXQsIGRhdGEpOworCQlicmVhazsKKworCWNhc2UgMTogLy8gUGFnZSAxCisJY2FzZSAyOiAvLyBQYWdlIDIKKwljYXNlIDM6IC8vIFBhZ2UgMworCQl7CisJCQl1OCBwc3IgPSByZWFkX25pY19ieXRlKGRldiwgUFNSKTsKKworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBQU1IsICgocHNyICYgMHhmYykgfCAodTgpUGFnZSkpOyAvLyBTd2l0Y2ggdG8gcGFnZSBOLgorCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAob2Zmc2V0ICYgMHhmZiksIGRhdGEpOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBQU1IsIChwc3IgJiAweGZjKSk7IC8vIFN3aXRjaCB0byBwYWdlIDAuCisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvLyBJbGxlZ2FsIHBhZ2UgbnVtYmVyLgorCQlETUVTR0UoIlBsYXRmb3JtSU9Xcml0ZTFCeXRlKCk6IGlsbGVnYWwgcGFnZSBudW1iZXI6ICVkLCBvZmZzZXQ6ICUjWCIsIFBhZ2UsIG9mZnNldCk7CisJCWJyZWFrOworCX0KKyNlbmRpZgorfQorCit2b2lkCitQbGF0Zm9ybUlPV3JpdGUyQnl0ZSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXUzMgkJb2Zmc2V0LAorCXUxNgkJZGF0YQorCSkKK3sKKyNpZm5kZWYgQ09ORklHX1JUTDgxODBfSU9fTUFQCisJd3JpdGVfbmljX3dvcmQoZGV2LCBvZmZzZXQsIGRhdGEpOworCXJlYWRfbmljX3dvcmQoZGV2LCBvZmZzZXQpOyAvLyBUbyBtYWtlIHN1cmUgd3JpdGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgMjAwNS4xMS4wOSwgYnkgcmNuamtvLgorCisKKyNlbHNlIC8vIFBvcnQgSU8KKwl1MzIgUGFnZSA9IChvZmZzZXQgPj4gOCk7CisKKwlzd2l0Y2goUGFnZSkKKwl7CisJY2FzZSAwOiAvLyBQYWdlIDAKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBvZmZzZXQsIGRhdGEpOworCQlicmVhazsKKworCWNhc2UgMTogLy8gUGFnZSAxCisJY2FzZSAyOiAvLyBQYWdlIDIKKwljYXNlIDM6IC8vIFBhZ2UgMworCQl7CisJCQl1OCBwc3IgPSByZWFkX25pY19ieXRlKGRldiwgUFNSKTsKKworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBQU1IsICgocHNyICYgMHhmYykgfCAodTgpUGFnZSkpOyAvLyBTd2l0Y2ggdG8gcGFnZSBOLgorCQkJd3JpdGVfbmljX3dvcmQoZGV2LCAob2Zmc2V0ICYgMHhmZiksIGRhdGEpOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBQU1IsIChwc3IgJiAweGZjKSk7IC8vIFN3aXRjaCB0byBwYWdlIDAuCisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvLyBJbGxlZ2FsIHBhZ2UgbnVtYmVyLgorCQlETUVTR0UoIlBsYXRmb3JtSU9Xcml0ZTJCeXRlKCk6IGlsbGVnYWwgcGFnZSBudW1iZXI6ICVkLCBvZmZzZXQ6ICUjWCIsIFBhZ2UsIG9mZnNldCk7CisJCWJyZWFrOworCX0KKyNlbmRpZgorfQordTggUGxhdGZvcm1JT1JlYWQxQnl0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgb2Zmc2V0KTsKKwordm9pZAorUGxhdGZvcm1JT1dyaXRlNEJ5dGUoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl1MzIJCW9mZnNldCwKKwl1MzIJCWRhdGEKKwkpCit7CisjaWZuZGVmIENPTkZJR19SVEw4MTgwX0lPX01BUAorLy97YnkgYW15IDA4MDMxMgoraWYgKG9mZnNldCA9PSBQaHlBZGRyKQorCXsvL0ZvciBCYXNlIEJhbmQgY29uZmlndXJhdGlvbi4KKwkJdW5zaWduZWQgY2hhcgljbWRCeXRlOworCQl1bnNpZ25lZCBsb25nCWRhdGFCeXRlczsKKwkJdW5zaWduZWQgY2hhcglpZHg7CisJCXU4CXUxYlRtcDsKKworCQljbWRCeXRlID0gKHU4KShkYXRhICYgMHgwMDAwMDBmZik7CisJCWRhdGFCeXRlcyA9IGRhdGE+Pjg7CisKKwkJLy8KKwkJLy8gMDcxMDEwLCByY25qa286CisJCS8vIFRoZSBjcml0aWNhbCBzZWN0aW9uIGlzIG9ubHkgQkIgcmVhZC93cml0ZSByYWNlIGNvbmRpdGlvbi4KKwkJLy8gQXNzdW1wdGlvbjoKKwkJLy8gMS4gV2UgYXNzdW1lIE5PIG9uZSB3aWxsIGFjY2VzcyBCQiBhdCBESVJRTCwgb3RoZXJ3aXNlLCBzeXN0ZW0gd2lsbCBjcmFzaCBmb3IKKwkJLy8gYWNxdWlyaW5nIHRoZSBzcGlubG9jayBpbiBzdWNoIGNvbnRleHQuCisJCS8vIDIuIFBsYXRmb3JtSU9Xcml0ZTRCeXRlKCkgTVVTVCBOT1QgYmUgcmVjdXJzaXZlLgorCQkvLworLy8JCU5kaXNBY3F1aXJlU3BpbkxvY2soICYocERldmljZS0+SW9TcGluTG9jaykgKTsKKworCQlmb3IoaWR4ID0gMDsgaWR4IDwgMzA7IGlkeCsrKQorCQl7IC8vIE1ha2Ugc3VyZSBjb21tYW5kIGJpdCBpcyBjbGVhciBiZWZvcmUgYWNjZXNzIGl0LgorCQkJdTFiVG1wID0gUGxhdGZvcm1JT1JlYWQxQnl0ZShkZXYsIFBoeUFkZHIpOworCQkJaWYoKHUxYlRtcCAmIEJJVDcpID09IDApCisJCQkJYnJlYWs7CisJCQllbHNlCisJCQkJbWRlbGF5KDEwKTsKKwkJfQorCisJCWZvcihpZHg9MDsgaWR4IDwgMzsgaWR4KyspCisJCXsKKwkJCVBsYXRmb3JtSU9Xcml0ZTFCeXRlKGRldixvZmZzZXQrMStpZHgsKCh1OCopJmRhdGFCeXRlcylbaWR4XSApOworCQl9CisJCXdyaXRlX25pY19ieXRlKGRldiwgb2Zmc2V0LCBjbWRCeXRlKTsKKworLy8JCU5kaXNSZWxlYXNlU3BpbkxvY2soICYocERldmljZS0+SW9TcGluTG9jaykgKTsKKwl9CisvL2J5IGFteSAwODAzMTJ9CisJZWxzZXsKKwkJd3JpdGVfbmljX2R3b3JkKGRldiwgb2Zmc2V0LCBkYXRhKTsKKwkJcmVhZF9uaWNfZHdvcmQoZGV2LCBvZmZzZXQpOyAvLyBUbyBtYWtlIHN1cmUgd3JpdGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgMjAwNS4xMS4wOSwgYnkgcmNuamtvLgorCX0KKyNlbHNlIC8vIFBvcnQgSU8KKwl1MzIgUGFnZSA9IChvZmZzZXQgPj4gOCk7CisKKwlzd2l0Y2goUGFnZSkKKwl7CisJY2FzZSAwOiAvLyBQYWdlIDAKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBvZmZzZXQsIGRhdGEpOworCQlicmVhazsKKworCWNhc2UgMTogLy8gUGFnZSAxCisJY2FzZSAyOiAvLyBQYWdlIDIKKwljYXNlIDM6IC8vIFBhZ2UgMworCQl7CisJCQl1OCBwc3IgPSByZWFkX25pY19ieXRlKGRldiwgUFNSKTsKKworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBQU1IsICgocHNyICYgMHhmYykgfCAodTgpUGFnZSkpOyAvLyBTd2l0Y2ggdG8gcGFnZSBOLgorCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgKG9mZnNldCAmIDB4ZmYpLCBkYXRhKTsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgUFNSLCAocHNyICYgMHhmYykpOyAvLyBTd2l0Y2ggdG8gcGFnZSAwLgorCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLy8gSWxsZWdhbCBwYWdlIG51bWJlci4KKwkJRE1FU0dFKCJQbGF0Zm9ybUlPV3JpdGU0Qnl0ZSgpOiBpbGxlZ2FsIHBhZ2UgbnVtYmVyOiAlZCwgb2Zmc2V0OiAlI1giLCBQYWdlLCBvZmZzZXQpOworCQlicmVhazsKKwl9CisjZW5kaWYKK30KKwordTgKK1BsYXRmb3JtSU9SZWFkMUJ5dGUoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl1MzIJCW9mZnNldAorCSkKK3sKKwl1OAlkYXRhID0gMDsKKworI2lmbmRlZiBDT05GSUdfUlRMODE4MF9JT19NQVAKKwlkYXRhID0gcmVhZF9uaWNfYnl0ZShkZXYsIG9mZnNldCk7CisKKyNlbHNlIC8vIFBvcnQgSU8KKwl1MzIgUGFnZSA9IChvZmZzZXQgPj4gOCk7CisKKwlzd2l0Y2goUGFnZSkKKwl7CisJY2FzZSAwOiAvLyBQYWdlIDAKKwkJZGF0YSA9IHJlYWRfbmljX2J5dGUoZGV2LCBvZmZzZXQpOworCQlicmVhazsKKworCWNhc2UgMTogLy8gUGFnZSAxCisJY2FzZSAyOiAvLyBQYWdlIDIKKwljYXNlIDM6IC8vIFBhZ2UgMworCQl7CisJCQl1OCBwc3IgPSByZWFkX25pY19ieXRlKGRldiwgUFNSKTsKKworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBQU1IsICgocHNyICYgMHhmYykgfCAodTgpUGFnZSkpOyAvLyBTd2l0Y2ggdG8gcGFnZSBOLgorCQkJZGF0YSA9IHJlYWRfbmljX2J5dGUoZGV2LCAob2Zmc2V0ICYgMHhmZikpOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBQU1IsIChwc3IgJiAweGZjKSk7IC8vIFN3aXRjaCB0byBwYWdlIDAuCisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvLyBJbGxlZ2FsIHBhZ2UgbnVtYmVyLgorCQlETUVTR0UoIlBsYXRmb3JtSU9SZWFkMUJ5dGUoKTogaWxsZWdhbCBwYWdlIG51bWJlcjogJWQsIG9mZnNldDogJSNYIiwgUGFnZSwgb2Zmc2V0KTsKKwkJYnJlYWs7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gZGF0YTsKK30KKwordTE2CitQbGF0Zm9ybUlPUmVhZDJCeXRlKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdTMyCQlvZmZzZXQKKwkpCit7CisJdTE2CWRhdGEgPSAwOworCisjaWZuZGVmIENPTkZJR19SVEw4MTgwX0lPX01BUAorCWRhdGEgPSByZWFkX25pY193b3JkKGRldiwgb2Zmc2V0KTsKKworI2Vsc2UgLy8gUG9ydCBJTworCXUzMiBQYWdlID0gKG9mZnNldCA+PiA4KTsKKworCXN3aXRjaChQYWdlKQorCXsKKwljYXNlIDA6IC8vIFBhZ2UgMAorCQlkYXRhID0gcmVhZF9uaWNfd29yZChkZXYsIG9mZnNldCk7CisJCWJyZWFrOworCisJY2FzZSAxOiAvLyBQYWdlIDEKKwljYXNlIDI6IC8vIFBhZ2UgMgorCWNhc2UgMzogLy8gUGFnZSAzCisJCXsKKwkJCXU4IHBzciA9IHJlYWRfbmljX2J5dGUoZGV2LCBQU1IpOworCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFBTUiwgKChwc3IgJiAweGZjKSB8ICh1OClQYWdlKSk7IC8vIFN3aXRjaCB0byBwYWdlIE4uCisJCQlkYXRhID0gcmVhZF9uaWNfd29yZChkZXYsIChvZmZzZXQgJiAweGZmKSk7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFBTUiwgKHBzciAmIDB4ZmMpKTsgLy8gU3dpdGNoIHRvIHBhZ2UgMC4KKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8vIElsbGVnYWwgcGFnZSBudW1iZXIuCisJCURNRVNHRSgiUGxhdGZvcm1JT1JlYWQyQnl0ZSgpOiBpbGxlZ2FsIHBhZ2UgbnVtYmVyOiAlZCwgb2Zmc2V0OiAlI1giLCBQYWdlLCBvZmZzZXQpOworCQlicmVhazsKKwl9CisjZW5kaWYKKworCXJldHVybiBkYXRhOworfQorCit1MzIKK1BsYXRmb3JtSU9SZWFkNEJ5dGUoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl1MzIJCW9mZnNldAorCSkKK3sKKwl1MzIJZGF0YSA9IDA7CisKKyNpZm5kZWYgQ09ORklHX1JUTDgxODBfSU9fTUFQCisJZGF0YSA9IHJlYWRfbmljX2R3b3JkKGRldiwgb2Zmc2V0KTsKKworI2Vsc2UgLy8gUG9ydCBJTworCXUzMiBQYWdlID0gKG9mZnNldCA+PiA4KTsKKworCXN3aXRjaChQYWdlKQorCXsKKwljYXNlIDA6IC8vIFBhZ2UgMAorCQlkYXRhID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBvZmZzZXQpOworCQlicmVhazsKKworCWNhc2UgMTogLy8gUGFnZSAxCisJY2FzZSAyOiAvLyBQYWdlIDIKKwljYXNlIDM6IC8vIFBhZ2UgMworCQl7CisJCQl1OCBwc3IgPSByZWFkX25pY19ieXRlKGRldiwgUFNSKTsKKworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBQU1IsICgocHNyICYgMHhmYykgfCAodTgpUGFnZSkpOyAvLyBTd2l0Y2ggdG8gcGFnZSBOLgorCQkJZGF0YSA9IHJlYWRfbmljX2R3b3JkKGRldiwgKG9mZnNldCAmIDB4ZmYpKTsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgUFNSLCAocHNyICYgMHhmYykpOyAvLyBTd2l0Y2ggdG8gcGFnZSAwLgorCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLy8gSWxsZWdhbCBwYWdlIG51bWJlci4KKwkJRE1FU0dFKCJQbGF0Zm9ybUlPUmVhZDRCeXRlKCk6IGlsbGVnYWwgcGFnZSBudW1iZXI6ICVkLCBvZmZzZXQ6ICUjWFxuIiwgUGFnZSwgb2Zmc2V0KTsKKwkJYnJlYWs7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gZGF0YTsKK30KKwordm9pZAorU2V0T3V0cHV0RW5hYmxlT2ZSZlBpbnMoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldgorCSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwlzd2l0Y2gocHJpdi0+cmZfY2hpcCkKKwl7CisJY2FzZSBSRkNISVBJRF9SVEw4MjI1OgorCWNhc2UgUkZfWkVCUkEyOgorCWNhc2UgUkZfWkVCUkE0OgorCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc0VuYWJsZSwgMHgxYmZmKTsKKwkJLy93cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc0VuYWJsZSwgMHgxZmZmKTsKKwkJYnJlYWs7CisJfQorfQorCit2b2lkCitaRUJSQV9SRlNlcmlhbFdyaXRlKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdTMyCQkJZGF0YTJXcml0ZSwKKwl1OAkJCXRvdGFsTGVuZ3RoLAorCXU4CQkJbG93MmhpZ2gKKwkpCit7CisJVGhyZWVXaXJlUmVnCQl0d3JlZzsKKwlpbnQgCQkJCWk7CisJdTE2CQkJCW92YWwsb3ZhbDIsb3ZhbDM7CisJdTMyCQkJCW1hc2s7CisJdTE2CQkJCVVzaG9ydEJ1ZmZlcjsKKworCXU4CQkJdTFiVG1wOworI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKwkvLyBSVEw4MTg3UyBIU1NJIFJlYWQvV3JpdGUgRnVuY3Rpb24KKwl1MWJUbXAgPSByZWFkX25pY19ieXRlKGRldiwgUkZfU1dfQ09ORklHKTsKKwl1MWJUbXAgfD0gICBSRl9TV19DRkdfU0k7ICAgLy9yZWcwOFsxXT0xIFNlcmlhbCBJbnRlcmZhY2UoU0kpCisJd3JpdGVfbmljX2J5dGUoZGV2LCBSRl9TV19DT05GSUcsIHUxYlRtcCk7CisjZW5kaWYKKwlVc2hvcnRCdWZmZXIgPSByZWFkX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0KTsKKwlvdmFsID0gVXNob3J0QnVmZmVyICYgMHhmZmY4OyAvLyBXZSBzaGFsbCBjbGVhciBiaXQwLCAxLCAyIGZpcnN0LCAyMDA1LjEwLjI4LCBieSByY25qa28uCisKKwlvdmFsMiA9IHJlYWRfbmljX3dvcmQoZGV2LCBSRlBpbnNFbmFibGUpOworCW92YWwzID0gcmVhZF9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCk7CisKKwkvLyA8UkpfTk9URT4gMy13aXJlIHNob3VsZCBiZSBjb250cm9sZWQgYnkgSFcgd2hlbiB3ZSBmaW5pc2ggU1cgMy13aXJlIHByb2dyYW1taW5nLiAyMDA1LjA4LjEwLCBieSByY25qa28uCisJb3ZhbDMgJj0gMHhmZmY4OworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNFbmFibGUsIChvdmFsMnwweDAwMDcpKTsgLy8gU2V0IFRvIE91dHB1dCBFbmFibGUKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCwgKG92YWwzfDB4MDAwNykpOyAvLyBTZXQgVG8gU1cgU3dpdGNoCisJdWRlbGF5KDEwKTsKKworCS8vIEFkZCB0aGlzIHRvIGF2b2lkIGhhcmR3YXJlIGFuZCBzb2Z0d2FyZSAzLXdpcmUgY29uZmxpY3QuCisJLy8gMjAwNS4wMy4wMSwgYnkgcmNuamtvLgorCXR3cmVnLmxvbmdEYXRhID0gMDsKKwl0d3JlZy5zdHJ1Yy5lbmFibGVCID0gMTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgKHR3cmVnLmxvbmdEYXRhfG92YWwpKTsgLy8gU2V0IFNJX0VOIChSRkxFKQorCXVkZWxheSgyKTsKKwl0d3JlZy5zdHJ1Yy5lbmFibGVCID0gMDsKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgKHR3cmVnLmxvbmdEYXRhfG92YWwpKTsgLy8gQ2xlYXIgU0lfRU4gKFJGTEUpCisJdWRlbGF5KDEwKTsKKworCW1hc2sgPSAobG93MmhpZ2gpPzB4MDE6KCh1MzIpMHgwMTw8KHRvdGFsTGVuZ3RoLTEpKTsKKworCWZvcihpPTA7IGk8dG90YWxMZW5ndGgvMjsgaSsrKQorCXsKKwkJdHdyZWcuc3RydWMuZGF0YSA9ICgoZGF0YTJXcml0ZSZtYXNrKSE9MCkgPyAxIDogMDsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsICh0d3JlZy5sb25nRGF0YXxvdmFsKSk7CisJCXR3cmVnLnN0cnVjLmNsayA9IDE7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCAodHdyZWcubG9uZ0RhdGF8b3ZhbCkpOworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgKHR3cmVnLmxvbmdEYXRhfG92YWwpKTsKKworCQltYXNrID0gKGxvdzJoaWdoKT8obWFzazw8MSk6KG1hc2s+PjEpOworCQl0d3JlZy5zdHJ1Yy5kYXRhID0gKChkYXRhMldyaXRlJm1hc2spIT0wKSA/IDEgOiAwOworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgKHR3cmVnLmxvbmdEYXRhfG92YWwpKTsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsICh0d3JlZy5sb25nRGF0YXxvdmFsKSk7CisJCXR3cmVnLnN0cnVjLmNsayA9IDA7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCAodHdyZWcubG9uZ0RhdGF8b3ZhbCkpOworCQltYXNrID0gKGxvdzJoaWdoKT8obWFzazw8MSk6KG1hc2s+PjEpOworCX0KKworCXR3cmVnLnN0cnVjLmVuYWJsZUIgPSAxOworCXR3cmVnLnN0cnVjLmNsayA9IDA7CisJdHdyZWcuc3RydWMuZGF0YSA9IDA7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIHR3cmVnLmxvbmdEYXRhfG92YWwpOworCXVkZWxheSgxMCk7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgb3ZhbHwweDAwMDQpOworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0LCBvdmFsM3wweDAwMDApOworCisJU2V0T3V0cHV0RW5hYmxlT2ZSZlBpbnMoZGV2KTsKK30KKy8vYnkgYW15CisKKworaW50CitId0hTU0lUaHJlZVdpcmUoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl1OAkJCSpwRGF0YUJ1ZiwKKwl1OAkJCW5EYXRhQnVmQml0Q250LAorCWludAkJCWJTSSwKKwlpbnQJCQliV3JpdGUKKwkpCit7CisJaW50CWJSZXN1bHQgPSAxOworCXU4CVRyeUNudDsKKwl1OAl1MWJUbXA7CisKKwlkbworCXsKKwkJLy8gQ2hlY2sgaWYgV0UgYW5kIFJFIGFyZSBjbGVhcmVkLgorCQlmb3IoVHJ5Q250ID0gMDsgVHJ5Q250IDwgVENfM1dfUE9MTF9NQVhfVFJZX0NOVDsgVHJ5Q250KyspCisJCXsKKwkJCXUxYlRtcCA9IHJlYWRfbmljX2J5dGUoZGV2LCBTV18zV19DTUQxKTsKKwkJCWlmKCAodTFiVG1wICYgKFNXXzNXX0NNRDFfUkV8U1dfM1dfQ01EMV9XRSkpID09IDAgKQorCQkJeworCQkJCWJyZWFrOworCQkJfQorCQkJdWRlbGF5KDEwKTsKKwkJfQorCQlpZiAoVHJ5Q250ID09IFRDXzNXX1BPTExfTUFYX1RSWV9DTlQpCisJCQlwYW5pYygiSHdUaHJlZVdpcmUoKTogQ21kUmVnOiAlI1ggUkV8V0UgYml0cyBhcmUgbm90IGNsZWFyISFcbiIsIHUxYlRtcCk7CisKKwkJLy8gUlRMODE4N1MgSFNTSSBSZWFkL1dyaXRlIEZ1bmN0aW9uCisJCXUxYlRtcCA9IHJlYWRfbmljX2J5dGUoZGV2LCBSRl9TV19DT05GSUcpOworCisJCWlmKGJTSSkKKwkJeworCQkJdTFiVG1wIHw9ICAgUkZfU1dfQ0ZHX1NJOyAgIC8vcmVnMDhbMV09MSBTZXJpYWwgSW50ZXJmYWNlKFNJKQorCQl9ZWxzZQorCQl7CisJCQl1MWJUbXAgJj0gflJGX1NXX0NGR19TSTsgIC8vcmVnMDhbMV09MCBQYXJhbGxlbCBJbnRlcmZhY2UoUEkpCisJCX0KKworCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFJGX1NXX0NPTkZJRywgdTFiVG1wKTsKKworCQlpZihiU0kpCisJCXsKKwkJCS8vIGpvbmc6IEhXIFNJIHJlYWQgbXVzdCBzZXQgcmVnODRbM109MC4KKwkJCXUxYlRtcCA9IHJlYWRfbmljX2J5dGUoZGV2LCBSRlBpbnNTZWxlY3QpOworCQkJdTFiVG1wICY9IH5CSVQzOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBSRlBpbnNTZWxlY3QsIHUxYlRtcCApOworCQl9CisJIAkvLyBGaWxsIHVwIGRhdGEgYnVmZmVyIGZvciB3cml0ZSBvcGVyYXRpb24uCisKKwkJaWYoYldyaXRlKQorCQl7CisJCQlpZihuRGF0YUJ1ZkJpdENudCA9PSAxNikKKwkJCXsKKwkJCQl3cml0ZV9uaWNfd29yZChkZXYsIFNXXzNXX0RCMCwgKigodTE2KilwRGF0YUJ1ZikpOworCQkJfQorCQkJZWxzZSBpZihuRGF0YUJ1ZkJpdENudCA9PSA2NCkgIC8vIFJUTDgxODdTIHNob3VsZG4ndCBlbnRlciB0aGlzIGNhc2UKKwkJCXsKKwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBTV18zV19EQjAsICooKHUzMiopcERhdGFCdWYpKTsKKwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBTV18zV19EQjEsICooKHUzMiopKHBEYXRhQnVmICsgNCkpKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpbnQgaWR4OworCQkJCWludCBCeXRlQ250ID0gbkRhdGFCdWZCaXRDbnQgLyA4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50aygiJWRcbiIsbkRhdGFCdWZCaXRDbnQpOworCQkJCWlmICgobkRhdGFCdWZCaXRDbnQgJSA4KSAhPSAwKQorCQkJCXBhbmljKCJId1RocmVlV2lyZSgpOiBuRGF0YUJ1ZkJpdENudCglZCkgc2hvdWxkIGJlIG11bHRpcGxlIG9mIDghISFcbiIsCisJCQkJbkRhdGFCdWZCaXRDbnQpOworCisJCQkgICAgICAgaWYgKG5EYXRhQnVmQml0Q250ID4gNjQpCisJCQkJcGFuaWMoIkh3VGhyZWVXaXJlKCk6IG5EYXRhQnVmQml0Q250KCVkKSBzaG91bGQgPD0gNjQhISFcbiIsCisJCQkJbkRhdGFCdWZCaXRDbnQpOworCisJCQkJZm9yKGlkeCA9IDA7IGlkeCA8IEJ5dGVDbnQ7IGlkeCsrKQorCQkJCXsKKwkJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAoU1dfM1dfREIwK2lkeCksICoocERhdGFCdWYraWR4KSk7CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UJCS8vcmVhZAorCQl7CisJCQlpZihiU0kpCisJCQl7CisJCQkJLy8gU0kgLSByZWcyNzRbMzowXSA6IFJGIHJlZ2lzdGVyJ3MgQWRkcmVzcworCQkJCXdyaXRlX25pY193b3JkKGRldiwgU1dfM1dfREIwLCAqKCh1MTYqKXBEYXRhQnVmKSApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIFBJIC0gcmVnMjc0WzE1OjEyXSA6IFJGIHJlZ2lzdGVyJ3MgQWRkcmVzcworCQkJCXdyaXRlX25pY193b3JkKGRldiwgU1dfM1dfREIwLCAoKigodTE2KilwRGF0YUJ1ZikpIDw8IDEyKTsKKwkJCX0KKwkJfQorCisJCS8vIFNldCB1cCBjb21tYW5kOiBXRSBvciBSRS4KKwkJaWYoYldyaXRlKQorCQl7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFNXXzNXX0NNRDEsIFNXXzNXX0NNRDFfV0UpOworCQl9CisJCWVsc2UKKwkJeworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBTV18zV19DTUQxLCBTV18zV19DTUQxX1JFKTsKKwkJfQorCisJCS8vIENoZWNrIGlmIERPTkUgaXMgc2V0LgorCQlmb3IoVHJ5Q250ID0gMDsgVHJ5Q250IDwgVENfM1dfUE9MTF9NQVhfVFJZX0NOVDsgVHJ5Q250KyspCisJCXsKKwkJCXUxYlRtcCA9IHJlYWRfbmljX2J5dGUoZGV2LCBTV18zV19DTUQxKTsKKwkJCWlmKCAgKHUxYlRtcCAmIFNXXzNXX0NNRDFfRE9ORSkgIT0gMCApCisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisJCQl1ZGVsYXkoMTApOworCQl9CisKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBTV18zV19DTUQxLCAwKTsKKworCQkvLyBSZWFkIGJhY2sgZGF0YSBmb3IgcmVhZCBvcGVyYXRpb24uCisJCWlmKGJXcml0ZSA9PSAwKQorCQl7CisJCQlpZihiU0kpCisJCQl7CisJCQkJLy9TZXJpYWwgSW50ZXJmYWNlIDogcmVnMzYzXzM2MlsxMTowXQorCQkJCSooKHUxNiopcERhdGFCdWYpID0gcmVhZF9uaWNfd29yZChkZXYsIFNJX0RBVEFfUkVBRCkgOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vUGFyYWxsZWwgSW50ZXJmYWNlIDogcmVnMzYxXzM2MFsxMTowXQorCQkJCSooKHUxNiopcERhdGFCdWYpID0gcmVhZF9uaWNfd29yZChkZXYsIFBJX0RBVEFfUkVBRCk7CisJCQl9CisKKwkJCSooKHUxNiopcERhdGFCdWYpICY9IDB4MEZGRjsKKwkJfQorCisJfXdoaWxlKDApOworCisJcmV0dXJuIGJSZXN1bHQ7Cit9CisvL2J5IGFteQorCitpbnQKK0h3VGhyZWVXaXJlKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdTgJCQkqcERhdGFCdWYsCisJdTgJCQluRGF0YUJ1ZkJpdENudCwKKwlpbnQJCQliSG9sZCwKKwlpbnQJCQliV3JpdGUKKwkpCit7CisJaW50CWJSZXN1bHQgPSAxOworCXU4CVRyeUNudDsKKwl1OAl1MWJUbXA7CisKKwlkbworCXsKKwkJLy8gQ2hlY2sgaWYgV0UgYW5kIFJFIGFyZSBjbGVhcmVkLgorCQlmb3IoVHJ5Q250ID0gMDsgVHJ5Q250IDwgVENfM1dfUE9MTF9NQVhfVFJZX0NOVDsgVHJ5Q250KyspCisJCXsKKwkJCXUxYlRtcCA9IHJlYWRfbmljX2J5dGUoZGV2LCBTV18zV19DTUQxKTsKKwkJCWlmKCAodTFiVG1wICYgKFNXXzNXX0NNRDFfUkV8U1dfM1dfQ01EMV9XRSkpID09IDAgKQorCQkJeworCQkJCWJyZWFrOworCQkJfQorCQkJdWRlbGF5KDEwKTsKKwkJfQorCQlpZiAoVHJ5Q250ID09IFRDXzNXX1BPTExfTUFYX1RSWV9DTlQpCisJCQlwYW5pYygiSHdUaHJlZVdpcmUoKTogQ21kUmVnOiAlI1ggUkV8V0UgYml0cyBhcmUgbm90IGNsZWFyISFcbiIsIHUxYlRtcCk7CisKKwkJLy8gRmlsbCB1cCBkYXRhIGJ1ZmZlciBmb3Igd3JpdGUgb3BlcmF0aW9uLgorCQlpZihuRGF0YUJ1ZkJpdENudCA9PSAxNikKKwkJeworCQkJd3JpdGVfbmljX3dvcmQoZGV2LCBTV18zV19EQjAsICooKHUxNiAqKXBEYXRhQnVmKSk7CisJCX0KKwkJZWxzZSBpZihuRGF0YUJ1ZkJpdENudCA9PSA2NCkKKwkJeworCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgU1dfM1dfREIwLCAqKCh1MzIgKilwRGF0YUJ1ZikpOworCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgU1dfM1dfREIxLCAqKCh1MzIgKikocERhdGFCdWYgKyA0KSkpOworCQl9CisJCWVsc2UKKwkJeworCQkJaW50IGlkeDsKKwkJCWludCBCeXRlQ250ID0gbkRhdGFCdWZCaXRDbnQgLyA4OworCisJCQlpZiAoKG5EYXRhQnVmQml0Q250ICUgOCkgIT0gMCkKKwkJCQlwYW5pYygiSHdUaHJlZVdpcmUoKTogbkRhdGFCdWZCaXRDbnQoJWQpIHNob3VsZCBiZSBtdWx0aXBsZSBvZiA4ISEhXG4iLAorCQkJCW5EYXRhQnVmQml0Q250KTsKKworCQkJaWYgKG5EYXRhQnVmQml0Q250ID4gNjQpCisJCQkJcGFuaWMoIkh3VGhyZWVXaXJlKCk6IG5EYXRhQnVmQml0Q250KCVkKSBzaG91bGQgPD0gNjQhISFcbiIsCisJCQkJbkRhdGFCdWZCaXRDbnQpOworCisJCQlmb3IoaWR4ID0gMDsgaWR4IDwgQnl0ZUNudDsgaWR4KyspCisJCQl7CisJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAoU1dfM1dfREIwK2lkeCksICoocERhdGFCdWYraWR4KSk7CisJCQl9CisJCX0KKworCQkvLyBGaWxsIHVwIGxlbmd0aCBmaWVsZC4KKwkJdTFiVG1wID0gKHU4KShuRGF0YUJ1ZkJpdENudCAtIDEpOyAvLyBOdW1iZXIgb2YgYml0cyAtIDEuCisJCWlmKGJIb2xkKQorCQkJdTFiVG1wIHw9IFNXXzNXX0NNRDBfSE9MRDsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBTV18zV19DTUQwLCB1MWJUbXApOworCisJCS8vIFNldCB1cCBjb21tYW5kOiBXRSBvciBSRS4KKwkJaWYoYldyaXRlKQorCQl7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFNXXzNXX0NNRDEsIFNXXzNXX0NNRDFfV0UpOworCQl9CisJCWVsc2UKKwkJeworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBTV18zV19DTUQxLCBTV18zV19DTUQxX1JFKTsKKwkJfQorCisJCS8vIENoZWNrIGlmIFdFIGFuZCBSRSBhcmUgY2xlYXJlZCBhbmQgRE9ORSBpcyBzZXQuCisJCWZvcihUcnlDbnQgPSAwOyBUcnlDbnQgPCBUQ18zV19QT0xMX01BWF9UUllfQ05UOyBUcnlDbnQrKykKKwkJeworCQkJdTFiVG1wID0gcmVhZF9uaWNfYnl0ZShkZXYsIFNXXzNXX0NNRDEpOworCQkJaWYoICh1MWJUbXAgJiAoU1dfM1dfQ01EMV9SRXxTV18zV19DTUQxX1dFKSkgPT0gMCAmJgorCQkJCSh1MWJUbXAgJiBTV18zV19DTUQxX0RPTkUpICE9IDAgKQorCQkJeworCQkJCWJyZWFrOworCQkJfQorCQkJdWRlbGF5KDEwKTsKKwkJfQorCQlpZihUcnlDbnQgPT0gVENfM1dfUE9MTF9NQVhfVFJZX0NOVCkKKwkJeworCQkJLy9SVF9BU1NFUlQoVHJ5Q250ICE9IFRDXzNXX1BPTExfTUFYX1RSWV9DTlQsCisJCQkvLwkoIkh3VGhyZWVXaXJlKCk6IENtZFJlZzogJSNYIFJFfFdFIGJpdHMgYXJlIG5vdCBjbGVhciBvciBET05FIGlzIG5vdCBzZXQhIVxuIiwgdTFiVG1wKSk7CisJCQkvLyBXb3JrYXJvdW5kIHN1Z2dlc3RlZCBieSB3Y2NodTogY2xlYXIgV0UgaGVyZS4gMjAwNi4wNy4wNywgYnkgcmNuamtvLgorCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBTV18zV19DTUQxLCAwKTsKKwkJfQorCisJCS8vIFJlYWQgYmFjayBkYXRhIGZvciByZWFkIG9wZXJhdGlvbi4KKwkJLy8gPFJKX1RPRE8+IEkgYW0gbm90IHN1cmUgaWYgdGhpcyBpcyBjb3JyZWN0IG91dHB1dCBmb3JtYXQgb2YgYSByZWFkIG9wZXJhdGlvbi4KKwkJaWYoYldyaXRlID09IDApCisJCXsKKwkJCWlmKG5EYXRhQnVmQml0Q250ID09IDE2KQorCQkJeworCQkJCSooKHUxNiAqKXBEYXRhQnVmKSA9IHJlYWRfbmljX3dvcmQoZGV2LCBTV18zV19EQjApOworCQkJfQorCQkJZWxzZSBpZihuRGF0YUJ1ZkJpdENudCA9PSA2NCkKKwkJCXsKKwkJCQkqKCh1MzIgKilwRGF0YUJ1ZikgPSByZWFkX25pY19kd29yZChkZXYsIFNXXzNXX0RCMCk7CisJCQkJKigodTMyICopKHBEYXRhQnVmICsgNCkpID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBTV18zV19EQjEpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWludCBpZHg7CisJCQkJaW50IEJ5dGVDbnQgPSBuRGF0YUJ1ZkJpdENudCAvIDg7CisKKwkJCQlpZiAoKG5EYXRhQnVmQml0Q250ICUgOCkgIT0gMCkKKwkJCQkJcGFuaWMoIkh3VGhyZWVXaXJlKCk6IG5EYXRhQnVmQml0Q250KCVkKSBzaG91bGQgYmUgbXVsdGlwbGUgb2YgOCEhIVxuIiwKKwkJCQkJbkRhdGFCdWZCaXRDbnQpOworCisJCQkJaWYgKG5EYXRhQnVmQml0Q250ID4gNjQpCisJCQkJCXBhbmljKCJId1RocmVlV2lyZSgpOiBuRGF0YUJ1ZkJpdENudCglZCkgc2hvdWxkIDw9IDY0ISEhXG4iLAorCQkJCQluRGF0YUJ1ZkJpdENudCk7CisKKwkJCQlmb3IoaWR4ID0gMDsgaWR4IDwgQnl0ZUNudDsgaWR4KyspCisJCQkJeworCQkJCQkqKHBEYXRhQnVmK2lkeCkgPSByZWFkX25pY19ieXRlKGRldiwgKFNXXzNXX0RCMCtpZHgpKTsKKwkJCQl9CisJCQl9CisJCX0KKworCX13aGlsZSgwKTsKKworCXJldHVybiBiUmVzdWx0OworfQorCisKK3ZvaWQKK1JGX1dyaXRlUmVnKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdTgJCW9mZnNldCwKKwl1MzIJCWRhdGEKKwkpCit7CisJLy9SRlJlZwkJCXJlZzsKKwl1MzIJCQlkYXRhMldyaXRlOworCXU4CQkJbGVuOworCXU4CQkJbG93MmhpZ2g7CisJLy91MzIJCQlSRl9SZWFkID0gMDsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKworCXN3aXRjaChwcml2LT5yZl9jaGlwKQorCXsKKwljYXNlIFJGQ0hJUElEX1JUTDgyMjU6CisJY2FzZSBSRl9aRUJSQTI6CQkvLyBBbm5pZSAyMDA2LTA1LTEyLgorCWNhc2UgUkZfWkVCUkE0OiAgICAgICAgLy9ieSBhbXkKKwkJc3dpdGNoKHByaXYtPlJlZ1RocmVlV2lyZU1vZGUpCisJCXsKKwkJY2FzZSBTV19USFJFRV9XSVJFOgorCQkJeyAvLyBQZXJmb3JtIFNXIDMtd2lyZSBwcm9ncmFtbWluZyBieSBkcml2ZXIuCisJCQkJZGF0YTJXcml0ZSA9IChkYXRhIDw8IDQpIHwgKHUzMikob2Zmc2V0ICYgMHgwZik7CisJCQkJbGVuID0gMTY7CisJCQkJbG93MmhpZ2ggPSAwOworCQkJCVpFQlJBX1JGU2VyaWFsV3JpdGUoZGV2LCBkYXRhMldyaXRlLCBsZW4sIGxvdzJoaWdoKTsKKyAgICAgICAJCQl9CisJCQlicmVhazsKKworIAkJY2FzZSBIV19USFJFRV9XSVJFOgorCQkJeyAvLyBQdXJlIEhXIDMtd2lyZS4KKwkJCQlkYXRhMldyaXRlID0gKGRhdGEgPDwgNCkgfCAodTMyKShvZmZzZXQgJiAweDBmKTsKKwkJCQlsZW4gPSAxNjsKKwkJCQlId1RocmVlV2lyZSgKKwkJCQkJZGV2LAorCQkJCQkodTggKikoJmRhdGEyV3JpdGUpLAkvLyBwRGF0YUJ1ZiwKKwkJCQkJbGVuLAkJCQkvLyBuRGF0YUJ1ZkJpdENudCwKKwkJCQkJMCwJCQkJCS8vIGJIb2xkLAorCQkJCQkxKTsJCQkJCS8vIGJXcml0ZQorICAgICAgICAgCQl9CisJCQlicmVhazsKKyAgI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKwkJCWNhc2UgSFdfVEhSRUVfV0lSRV9QSTogLy9QYXJhbGxlbCBJbnRlcmZhY2UKKwkJCXsgLy8gUHVyZSBIVyAzLXdpcmUuCisJCQkJZGF0YTJXcml0ZSA9IChkYXRhIDw8IDQpIHwgKHUzMikob2Zmc2V0ICYgMHgwZik7CisJCQkJbGVuID0gMTY7CisJCQkJCUh3SFNTSVRocmVlV2lyZSgKKwkJCQkJCWRldiwKKwkJCQkJCSh1OCopKCZkYXRhMldyaXRlKSwJLy8gcERhdGFCdWYsCisJCQkJCQlsZW4sCQkJCQkJLy8gbkRhdGFCdWZCaXRDbnQsCisJCQkJCQkwLCAJCQkJCS8vIGJTSQorCQkJCQkJMSk7IAkJCQkJLy8gYldyaXRlCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmludGsoIjMzMzMzXG4iKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCQljYXNlIEhXX1RIUkVFX1dJUkVfU0k6IC8vU2VyaWFsIEludGVyZmFjZQorCQkJeyAvLyBQdXJlIEhXIDMtd2lyZS4KKwkJCQlkYXRhMldyaXRlID0gKGRhdGEgPDwgNCkgfCAodTMyKShvZmZzZXQgJiAweDBmKTsKKwkJCQlsZW4gPSAxNjsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIiBlbnRlciAgWkVCUkFfUkZTZXJpYWxXcml0ZVxuICIpOworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvdzJoaWdoID0gMDsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaRUJSQV9SRlNlcmlhbFdyaXRlKGRldiwgZGF0YTJXcml0ZSwgbGVuLCBsb3cyaGlnaCk7CisKKwkJCQlId0hTU0lUaHJlZVdpcmUoCisJCQkJCWRldiwKKwkJCQkJKHU4KikoJmRhdGEyV3JpdGUpLAkvLyBwRGF0YUJ1ZiwKKwkJCQkJbGVuLAkJCQkJCS8vIG5EYXRhQnVmQml0Q250LAorCQkJCQkxLCAJCQkJCS8vIGJTSQorCQkJCQkxKTsgCQkJCQkvLyBiV3JpdGUKKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIiBleGl0IFpFQlJBX1JGU2VyaWFsV3JpdGVcbiAiKTsKKwkJCX0KKwkJCWJyZWFrOworICAjZW5kaWYKKworCisJCWRlZmF1bHQ6CisJCQlETUVTR0UoIlJGX1dyaXRlUmVnKCk6IGludmFsaWQgUmVnVGhyZWVXaXJlTW9kZSglZCkgISEhIiwgcHJpdi0+UmVnVGhyZWVXaXJlTW9kZSk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCURNRVNHRSgiUkZfV3JpdGVSZWcoKTogdW5rbm93biBSRkNoaXBJRDogJSNYIiwgcHJpdi0+cmZfY2hpcCk7CisJCWJyZWFrOworCX0KK30KKworCit2b2lkCitaRUJSQV9SRlNlcmlhbFJlYWQoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl1MzIJCWRhdGEyV3JpdGUsCisJdTgJCXdMZW5ndGgsCisJdTMyCQkqZGF0YTJSZWFkLAorCXU4CQlyTGVuZ3RoLAorCXU4CQlsb3cyaGlnaAorCSkKK3sKKwlUaHJlZVdpcmVSZWcJdHdyZWc7CisJaW50CQkJCWk7CisJdTE2CQkJb3ZhbCxvdmFsMixvdmFsMyx0bXAsIHdSZWc4MDsKKwl1MzIJCQltYXNrOworCXU4CQkJdTFiVG1wOworCVRocmVlV2lyZVJlZwl0ZGF0YTsKKwkvL1BIQUxfREFUQV84MTg3CXBIYWxEYXRhID0gR2V0SGFsRGF0YTgxODcocEFkYXB0ZXIpOworI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKwl7IC8vIFJUTDgxODdTIEhTU0kgUmVhZC9Xcml0ZSBGdW5jdGlvbgorCQl1MWJUbXAgPSByZWFkX25pY19ieXRlKGRldiwgUkZfU1dfQ09ORklHKTsKKwkJdTFiVG1wIHw9ICAgUkZfU1dfQ0ZHX1NJOyAgIC8vcmVnMDhbMV09MSBTZXJpYWwgSW50ZXJmYWNlKFNJKQorCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFJGX1NXX0NPTkZJRywgdTFiVG1wKTsKKwl9CisjZW5kaWYKKworCXdSZWc4MCA9IG92YWwgPSByZWFkX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0KTsKKwlvdmFsMiA9IHJlYWRfbmljX3dvcmQoZGV2LCBSRlBpbnNFbmFibGUpOworCW92YWwzID0gcmVhZF9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCk7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc0VuYWJsZSwgb3ZhbDJ8MHhmKTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCwgb3ZhbDN8MHhmKTsKKworCSpkYXRhMlJlYWQgPSAwOworCisJLy8gV2UgbXVzdCBjbGVhciBCSVQwLTMgaGVyZSwgb3RoZXJ3aXNlLAorCS8vIFNXX0VuYWxiZSB3aWxsIGJlIHRydWUgd2hlbiB3ZSBmaXJzdCBjYWxsIFpFQlJBX1JGU2VyaWFsUmVhZCgpIGFmdGVyIDgxODdNUFZDIG9wZW4sCisJLy8gd2hpY2ggd2lsbCBjYXVzZSB0aGUgdmFsdWUgcmVhZCBiZWNvbWUgMC4gMjAwNS4wNC4xMSwgYnkgcmNuamtvLgorCW92YWwgJj0gfjB4ZjsKKworCS8vIEF2b2lkIGNvbGxpc2lvbiB3aXRoIGhhcmR3YXJlIHRocmVlLXdpcmUuCisJdHdyZWcubG9uZ0RhdGEgPSAwOworCXR3cmVnLnN0cnVjLmVuYWJsZUIgPSAxOworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCB0d3JlZy5sb25nRGF0YXxvdmFsKTsgdWRlbGF5KDQpOworCisJdHdyZWcubG9uZ0RhdGEgPSAwOworCXR3cmVnLnN0cnVjLmVuYWJsZUIgPSAwOworCXR3cmVnLnN0cnVjLmNsayA9IDA7CisJdHdyZWcuc3RydWMucmVhZF93cml0ZSA9IDA7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIHR3cmVnLmxvbmdEYXRhfG92YWwpOyB1ZGVsYXkoNSk7CisKKwltYXNrID0gKGxvdzJoaWdoKSA/IDB4MDEgOiAoKHUzMikweDAxPDwoMzItMSkpOworCWZvcihpID0gMDsgaSA8IHdMZW5ndGgvMjsgaSsrKQorCXsKKwkJdHdyZWcuc3RydWMuZGF0YSA9ICgoZGF0YTJXcml0ZSZtYXNrKSAhPSAwKSA/IDEgOiAwOworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgdHdyZWcubG9uZ0RhdGF8b3ZhbCk7IHVkZWxheSgxKTsKKwkJdHdyZWcuc3RydWMuY2xrID0gMTsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIHR3cmVnLmxvbmdEYXRhfG92YWwpOyB1ZGVsYXkoMik7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCB0d3JlZy5sb25nRGF0YXxvdmFsKTsgdWRlbGF5KDIpOworCisJCW1hc2sgPSAobG93MmhpZ2gpID8gKG1hc2s8PDEpOiAobWFzaz4+MSk7CisKKwkJaWYoaSA9PSAyKQorCQl7CisJCQkvLyBDb21tZW50ZWQgb3V0IGJ5IEphY2tpZSwgMjAwNC4wOC4yNi4gPFJKX05PVEU+IFdlIG11c3QgY29tbWVudCBvdXQgdGhlIGZvbGxvd2luZyB0d28gbGluZXMgZm9yIHdlIGNhbm5vdCBwdWxsIGRvd24gVkNPUEROIGR1cmluZyBSRiBTZXJhaWwgUmVhZC4KKwkJCS8vUGxhdGZvcm1FRklPV3JpdGUyQnl0ZShwQWRhcHRlciwgUkZQaW5zRW5hYmxlLCAweGUpOyAgICAgLy8gdHVybiBvZmYgZGF0YSBlbmFibGUKKwkJCS8vUGxhdGZvcm1FRklPV3JpdGUyQnl0ZShwQWRhcHRlciwgUkZQaW5zU2VsZWN0LCAweGUpOworCisJCQl0d3JlZy5zdHJ1Yy5yZWFkX3dyaXRlPTE7CisJCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgdHdyZWcubG9uZ0RhdGF8b3ZhbCk7IHVkZWxheSgyKTsKKwkJCXR3cmVnLnN0cnVjLmNsayA9IDA7CisJCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgdHdyZWcubG9uZ0RhdGF8b3ZhbCk7IHVkZWxheSgyKTsKKwkJCWJyZWFrOworCQl9CisJCXR3cmVnLnN0cnVjLmRhdGEgPSAoKGRhdGEyV3JpdGUmbWFzaykgIT0gMCkgPyAxOiAwOworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgdHdyZWcubG9uZ0RhdGF8b3ZhbCk7IHVkZWxheSgyKTsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIHR3cmVnLmxvbmdEYXRhfG92YWwpOyB1ZGVsYXkoMik7CisKKwkJdHdyZWcuc3RydWMuY2xrID0gMDsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIHR3cmVnLmxvbmdEYXRhfG92YWwpOyB1ZGVsYXkoMSk7CisKKwkJbWFzayA9IChsb3cyaGlnaCkgPyAobWFzazw8MSkgOiAobWFzaz4+MSk7CisJfQorCisJdHdyZWcuc3RydWMuY2xrID0gMDsKKwl0d3JlZy5zdHJ1Yy5kYXRhID0gMDsKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgdHdyZWcubG9uZ0RhdGF8b3ZhbCk7IHVkZWxheSgyKTsKKwltYXNrID0gKGxvdzJoaWdoKSA/IDB4MDEgOiAoKHUzMikweDAxIDw8ICgxMi0xKSk7CisKKwkvLworCS8vIDA2MTAxNiwgYnkgcmNuamtvOgorCS8vIFdlIG11c3Qgc2V0IGRhdGEgcGluIHRvIEhXIGNvbnRyb2xlZCwgb3RoZXJ3aXNlIFJGIGNhbid0IGRyaXZlciBpdCBhbmQKKwkvLyB2YWx1ZSBSRiByZWdpc3RlciB3b24ndCBiZSBhYmxlIHRvIHJlYWQgYmFjayBwcm9wZXJseS4KKwkvLworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zRW5hYmxlLCAoICgob3ZhbDJ8MHgwRSkgJiAofjB4MDEpKSkgKTsKKworCWZvcihpID0gMDsgaSA8IHJMZW5ndGg7IGkrKykKKwl7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCB0d3JlZy5sb25nRGF0YXxvdmFsKTsgdWRlbGF5KDEpOworCQl0d3JlZy5zdHJ1Yy5jbGsgPSAxOworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgdHdyZWcubG9uZ0RhdGF8b3ZhbCk7IHVkZWxheSgyKTsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIHR3cmVnLmxvbmdEYXRhfG92YWwpOyB1ZGVsYXkoMik7CisJCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCB0d3JlZy5sb25nRGF0YXxvdmFsKTsgdWRlbGF5KDIpOworCQl0bXAgPSByZWFkX25pY193b3JkKGRldiwgUkZQaW5zSW5wdXQpOworCQl0ZGF0YS5sb25nRGF0YSA9IHRtcDsKKwkJKmRhdGEyUmVhZCB8PSB0ZGF0YS5zdHJ1Yy5jbGsgPyBtYXNrIDogMDsKKworCQl0d3JlZy5zdHJ1Yy5jbGsgPSAwOworCQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgdHdyZWcubG9uZ0RhdGF8b3ZhbCk7IHVkZWxheSgyKTsKKworCQltYXNrID0gKGxvdzJoaWdoKSA/IChtYXNrPDwxKSA6IChtYXNrPj4xKTsKKwl9CisJdHdyZWcuc3RydWMuZW5hYmxlQiA9IDE7CisJdHdyZWcuc3RydWMuY2xrID0gMDsKKwl0d3JlZy5zdHJ1Yy5kYXRhID0gMDsKKwl0d3JlZy5zdHJ1Yy5yZWFkX3dyaXRlID0gMTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgdHdyZWcubG9uZ0RhdGF8b3ZhbCk7IHVkZWxheSgyKTsKKworCS8vUGxhdGZvcm1FRklPV3JpdGUyQnl0ZShwQWRhcHRlciwgUkZQaW5zRW5hYmxlLCBvdmFsMnwweDgpOyAgIC8vIFNldCBUbyBPdXRwdXQgRW5hYmxlCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNFbmFibGUsIG92YWwyKTsgICAvLyBTZXQgVG8gT3V0cHV0IEVuYWJsZSwgPFJKX05PVEU+IFdlIGNhbm5vdCBlbmFibGUgQklUMyBoZXJlLCBvdGhlcndpc2UsIHdlIHdpbGwgZmFpbGVkIHRvIHN3aXRjaCBjaGFubmVsLiAyMDA1LjA0LjEyLgorCS8vUGxhdGZvcm1FRklPV3JpdGUyQnl0ZShwQWRhcHRlciwgUkZQaW5zRW5hYmxlLCAweDFiZmYpOworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0LCBvdmFsMyk7ICAgLy8gU2V0IFRvIFNXIFN3aXRjaAorCS8vUGxhdGZvcm1FRklPV3JpdGUyQnl0ZShwQWRhcHRlciwgUkZQaW5zU2VsZWN0LCAweDA0ODgpOworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0LCAweDNhMCk7CisJLy9QbGF0Zm9ybUVGSU9Xcml0ZTJCeXRlKHBBZGFwdGVyLCBSRlBpbnNPdXRwdXQsIDB4MDQ4MCk7Cit9CisKKwordTMyCitSRl9SZWFkUmVnKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdTgJCW9mZnNldAorCSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJdTMyCQkJZGF0YTJXcml0ZTsKKwl1OAkJCXdsZW47CisJdTgJCQlybGVuOworCXU4CQkJbG93MmhpZ2g7CisJdTMyCQkJZGF0YVJlYWQ7CisKKwlzd2l0Y2gocHJpdi0+cmZfY2hpcCkKKwl7CisJY2FzZSBSRkNISVBJRF9SVEw4MjI1OgorCWNhc2UgUkZfWkVCUkEyOgorCWNhc2UgUkZfWkVCUkE0OgorCQlzd2l0Y2gocHJpdi0+UmVnVGhyZWVXaXJlTW9kZSkKKwkJeworI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKwkJCWNhc2UgSFdfVEhSRUVfV0lSRV9QSTogLy8gRm9yIDg3UyAgUGFyYWxsZWwgSW50ZXJmYWNlLgorCQkJeworCQkJCWRhdGEyV3JpdGUgPSAoKHUzMikob2Zmc2V0JjB4MGYpKTsKKwkJCQl3bGVuPTE2OworCQkJCUh3SFNTSVRocmVlV2lyZSgKKwkJCQkJZGV2LAorCQkJCQkodTgqKSgmZGF0YTJXcml0ZSksCS8vIHBEYXRhQnVmLAorCQkJCQl3bGVuLAkJCQkJLy8gbkRhdGFCdWZCaXRDbnQsCisJCQkJCTAsIAkJCQkJLy8gYlNJCisJCQkJCTApOyAJCQkJCS8vIGJXcml0ZQorCQkJCWRhdGFSZWFkPSBkYXRhMldyaXRlOworCQkJfQorCQkJYnJlYWs7CisKKwkJCWNhc2UgSFdfVEhSRUVfV0lSRV9TSTogLy8gRm9yIDg3UyBTZXJpYWwgSW50ZXJmYWNlLgorCQkJeworCQkJCWRhdGEyV3JpdGUgPSAoKHUzMikob2Zmc2V0JjB4MGYpKSA7CisJCQkJd2xlbj0xNjsKKwkJCQlId0hTU0lUaHJlZVdpcmUoCisJCQkJCWRldiwKKwkJCQkJKHU4KikoJmRhdGEyV3JpdGUpLAkvLyBwRGF0YUJ1ZiwKKwkJCQkJd2xlbiwJCQkJCS8vIG5EYXRhQnVmQml0Q250LAorCQkJCQkxLCAJCQkJCS8vIGJTSQorCQkJCQkwCQkJCQkvLyBiV3JpdGUKKwkJCQkJKTsKKwkJCQlkYXRhUmVhZD0gZGF0YTJXcml0ZTsKKwkJCX0KKwkJCWJyZWFrOworCisjZW5kaWYKKwkJCS8vIFBlcmZvcm0gU1cgMy13aXJlIHByb2dyYW1taW5nIGJ5IGRyaXZlci4KKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJZGF0YTJXcml0ZSA9ICgodTMyKShvZmZzZXQmMHgxZikpIDw8IDI3OyAvLyBGb3IgWmVicmEgRS1jdXQuIDIwMDUuMDQuMTEsIGJ5IHJjbmprby4KKwkJCQl3bGVuID0gNjsKKwkJCQlybGVuID0gMTI7CisJCQkJbG93MmhpZ2ggPSAwOworCQkJCVpFQlJBX1JGU2VyaWFsUmVhZChkZXYsIGRhdGEyV3JpdGUsIHdsZW4sJmRhdGFSZWFkLHJsZW4sIGxvdzJoaWdoKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRhdGFSZWFkID0gMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGRhdGFSZWFkOworfQorCisKKy8vIGJ5IE93ZW4gb24gMDQvMDcvMTQgZm9yIHdyaXRpbmcgQkIgcmVnaXN0ZXIgc3VjY2Vzc2Z1bGx5Cit2b2lkCitXcml0ZUJCUG9ydFVjaGFyKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdTMyCQlEYXRhCisJKQoreworCS8vdTgJVGltZW91dENvdW50ZXI7CisJdTgJUmVnaXN0ZXJDb250ZW50OworCXU4CVVDaGFyRGF0YTsKKworCVVDaGFyRGF0YSA9ICh1OCkoKERhdGEgJiAweDAwMDBmZjAwKSA+PiA4KTsKKwlQbGF0Zm9ybUlPV3JpdGU0Qnl0ZShkZXYsIFBoeUFkZHIsIERhdGEpOworCS8vZm9yKFRpbWVvdXRDb3VudGVyID0gMTA7IFRpbWVvdXRDb3VudGVyID4gMDsgVGltZW91dENvdW50ZXItLSkKKwl7CisJCVBsYXRmb3JtSU9Xcml0ZTRCeXRlKGRldiwgUGh5QWRkciwgRGF0YSAmIDB4ZmZmZmZmN2YpOworCQlSZWdpc3RlckNvbnRlbnQgPSBQbGF0Zm9ybUlPUmVhZDFCeXRlKGRldiwgUGh5RGF0YVIpOworCQkvL2lmKFVDaGFyRGF0YSA9PSBSZWdpc3RlckNvbnRlbnQpCisJCS8vCWJyZWFrOworCX0KK30KKwordTgKK1JlYWRCQlBvcnRVY2hhcigKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXUzMgkJYWRkcgorCSkKK3sKKwkvL3U4CVRpbWVvdXRDb3VudGVyOworCXU4CVJlZ2lzdGVyQ29udGVudDsKKworCVBsYXRmb3JtSU9Xcml0ZTRCeXRlKGRldiwgUGh5QWRkciwgYWRkciAmIDB4ZmZmZmZmN2YpOworCVJlZ2lzdGVyQ29udGVudCA9IFBsYXRmb3JtSU9SZWFkMUJ5dGUoZGV2LCBQaHlEYXRhUik7CisKKwlyZXR1cm4gUmVnaXN0ZXJDb250ZW50OworfQorLy97YnkgYW15IDA4MDMxMgorI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKy8vCisvLwlEZXNjcmlwdGlvbjoKKy8vCQlQZXJmb3JtIEFudGVubmEgc2V0dGluZ3Mgd2l0aCBhbnRlbm5hIGRpdmVyc2l0eSBvbiA4N1NFLgorLy8gICAgQ3JlYXRlZCBieSBSb2dlciwgMjAwOC4wMS4yNS4KKy8vCitib29sCitTZXRBbnRlbm5hQ29uZmlnODdTRSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXU4CQkJRGVmYXVsdEFudCwJCS8vIDA6IE1haW4sIDE6IEF1eC4KKwlib29sCQliQW50RGl2ZXJzaXR5IAkvLyAxOkVuYWJsZSwgMDogRGlzYWJsZS4KKykKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJYm9vbCAgIGJBbnRlbm5hU3dpdGNoZWQgPSB0cnVlOworCisJLy9wcmludGsoIlNldEFudGVubmFDb25maWc4N1NFKCk6IERlZmF1bHRBbnQoJWQpLCBiQW50RGl2ZXJzaXR5KCVkKVxuIiwgRGVmYXVsdEFudCwgYkFudERpdmVyc2l0eSk7CisKKwkvLyBUaHJlc2hvbGQgZm9yIGFudGVubmEgZGl2ZXJzaXR5LgorCXdyaXRlX3BoeV9jY2soZGV2LCAweDBjLCAweDA5KTsgLy8gUmVnMGMgOiAwOQorCisJaWYoIGJBbnREaXZlcnNpdHkgKSAgLy8gIEVuYWJsZSBBbnRlbm5hIERpdmVyc2l0eS4KKwl7CisJCWlmKCBEZWZhdWx0QW50ID09IDEgKSAgLy8gYXV4IGFudGVubmEKKwkJeworCQkJLy8gTWFjIHJlZ2lzdGVyLCBhdXggYW50ZW5uYQorCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBBTlRTRUwsIDB4MDApOworCisJCQkvLyBDb25maWcgQ0NLIFJYIGFudGVubmEuCisJCQl3cml0ZV9waHlfY2NrKGRldiwgMHgxMSwgMHhiYik7IC8vIFJlZzExIDogYmIKKwkJCXdyaXRlX3BoeV9jY2soZGV2LCAweDAxLCAweGM3KTsgLy8gUmVnMDEgOiBjNworCisJCQkvLyBDb25maWcgT0ZETSBSWCBhbnRlbm5hLgorCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDBELCAweDU0KTsgICAvLyBSZWcwZCA6IDU0CisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTgsIDB4YjIpOyAgLy8gUmVnMTggOiBiMgorCQl9CisJCWVsc2UgLy8gIHVzZSBtYWluIGFudGVubmEKKwkJeworCQkJLy8gTWFjIHJlZ2lzdGVyLCBtYWluIGFudGVubmEKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgQU5UU0VMLCAweDAzKTsKKwkJCS8vYmFzZSBiYW5kCisJCQkvLyBDb25maWcgQ0NLIFJYIGFudGVubmEuCisJCQl3cml0ZV9waHlfY2NrKGRldiwgMHgxMSwgMHg5Yik7IC8vIFJlZzExIDogOWIKKwkJCXdyaXRlX3BoeV9jY2soZGV2LCAweDAxLCAweGM3KTsgLy8gUmVnMDEgOiBjNworCisJCQkvLyBDb25maWcgT0ZETSBSWCBhbnRlbm5hLgorCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDBkLCAweDVjKTsgICAvLyBSZWcwZCA6IDVjCisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTgsIDB4YjIpOyAgLy8gUmVnMTggOiBiMgorCQl9CisJfQorCWVsc2UgICAvLyBEaXNhYmxlIEFudGVubmEgRGl2ZXJzaXR5LgorCXsKKwkJaWYoIERlZmF1bHRBbnQgPT0gMSApIC8vIGF1eCBBbnRlbm5hCisJCXsKKwkJCS8vIE1hYyByZWdpc3RlciwgYXV4IGFudGVubmEKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgQU5UU0VMLCAweDAwKTsKKworCQkJLy8gQ29uZmlnIENDSyBSWCBhbnRlbm5hLgorCQkJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTEsIDB4YmIpOyAvLyBSZWcxMSA6IGJiCisJCQl3cml0ZV9waHlfY2NrKGRldiwgMHgwMSwgMHg0Nyk7IC8vIFJlZzAxIDogNDcKKworCQkJLy8gQ29uZmlnIE9GRE0gUlggYW50ZW5uYS4KKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwRCwgMHg1NCk7ICAgLy8gUmVnMGQgOiA1NAorCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE4LCAweDMyKTsgIC8vIFJlZzE4IDogMzIKKwkJfQorCQllbHNlIC8vIG1haW4gQW50ZW5uYQorCQl7CisJCQkvLyBNYWMgcmVnaXN0ZXIsIG1haW4gYW50ZW5uYQorCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBBTlRTRUwsIDB4MDMpOworCisJCQkvLyBDb25maWcgQ0NLIFJYIGFudGVubmEuCisJCQl3cml0ZV9waHlfY2NrKGRldiwgMHgxMSwgMHg5Yik7IC8vIFJlZzExIDogOWIKKwkJCXdyaXRlX3BoeV9jY2soZGV2LCAweDAxLCAweDQ3KTsgLy8gUmVnMDEgOiA0NworCisJCQkvLyBDb25maWcgT0ZETSBSWCBhbnRlbm5hLgorCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDBELCAweDVjKTsgICAvLyBSZWcwZCA6IDVjCisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTgsIDB4MzIpOyAgLy8gUmVnMTggOiAzMgorCQl9CisJfQorCXByaXYtPkN1cnJBbnRlbm5hSW5kZXggPSBEZWZhdWx0QW50OyAvLyBVcGRhdGUgZGVmYXVsdCBzZXR0aW5ncy4KKwlyZXR1cm4JYkFudGVubmFTd2l0Y2hlZDsKK30KKyNlbmRpZgorLy9ieSBhbXkgMDgwMzEyCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAqIEhhcmR3YXJlIEluaXRpYWxpemF0aW9uLgorICAqIHRoZSBjb2RlIGlzIHBvcnRlZCBmcm9tIFdpbmRvd3Mgc291cmNlIGNvZGUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQKK1pFQlJBX0NvbmZpZ184NUJBU0lDX0hhcmRDb2RlKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYKKwkpCit7CisKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJdTMyCQkJaTsKKwl1MzIJYWRkcixkYXRhOworCXUzMgl1NGJSZWdPZmZzZXQsIHU0YlJlZ1ZhbHVlLCB1NGJSRjIzLCB1NGJSRjI0OworICAgICAgIHU4CQkJdTFiMjRFOworCisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUworCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIDg3U19QQ0lFIDo6IFJBRElPQ0ZHLlRYVAorCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisJLy8gUGFnZTEgOiByZWcxNi1yZWczMAorCVJGX1dyaXRlUmVnKGRldiwgMHgwMCwgMHgwMTNmKTsJCQltZGVsYXkoMSk7IC8vIHN3aXRjaCB0byBwYWdlMQorCXU0YlJGMjM9IFJGX1JlYWRSZWcoZGV2LCAweDA4KTsJCQltZGVsYXkoMSk7CisJdTRiUkYyND0gUkZfUmVhZFJlZyhkZXYsIDB4MDkpOwkJCW1kZWxheSgxKTsKKworCWlmICh1NGJSRjIzPT0weDgxOCAmJiB1NGJSRjI0PT0weDcwQyAmJiBwcml2LT5jYXJkXzgxODUgPT0gVkVSU0lPTl84MTg3U19DKQorCQlwcml2LT5jYXJkXzgxODUgPSBWRVJTSU9OXzgxODdTX0Q7CisKKwkvLyBQYWdlMCA6IHJlZzAtcmVnMTUKKworLy8JUkZfV3JpdGVSZWcoZGV2LCAweDAwLCAweDAwM2YpOwkJCW1kZWxheSgxKTsvLzEKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDAsIDB4MDA5Zik7ICAgICAgCW1kZWxheSgxKTsvLyAxCisKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDEsIDB4MDZlMCk7CQkJbWRlbGF5KDEpOworCisvLwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDIsIDB4MDA0Yyk7CQkJbWRlbGF5KDEpOy8vMgorCVJGX1dyaXRlUmVnKGRldiwgMHgwMiwgMHgwMDRkKTsJCQltZGVsYXkoMSk7Ly8gMgorCisvLwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDMsIDB4MDAwMCk7CQkJbWRlbGF5KDEpOy8vMworCVJGX1dyaXRlUmVnKGRldiwgMHgwMywgMHgwN2YxKTsJCQltZGVsYXkoMSk7Ly8gMworCisJUkZfV3JpdGVSZWcoZGV2LCAweDA0LCAweDA5NzUpOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDUsIDB4MGM3Mik7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwNiwgMHgwYWU2KTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDA3LCAweDAwY2EpOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDgsIDB4MGUxYyk7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwOSwgMHgwMmYwKTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDBhLCAweDA5ZDApOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MGIsIDB4MDFiYSk7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwYywgMHgwNjQwKTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDBkLCAweDA4ZGYpOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MGUsIDB4MDAyMCk7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwZiwgMHgwOTkwKTsJCQltZGVsYXkoMSk7CisKKworCS8vIFBhZ2UxIDogcmVnMTYtcmVnMzAKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDAsIDB4MDEzZik7CQkJbWRlbGF5KDEpOworCisJUkZfV3JpdGVSZWcoZGV2LCAweDAzLCAweDA4MDYpOwkJCW1kZWxheSgxKTsKKworCWlmKHByaXYtPmNhcmRfODE4NSA8IFZFUlNJT05fODE4N1NfQykKKwl7CisJCVJGX1dyaXRlUmVnKGRldiwgMHgwNCwgMHgwM2Y3KTsJCQltZGVsYXkoMSk7CisJCVJGX1dyaXRlUmVnKGRldiwgMHgwNSwgMHgwNWFiKTsJCQltZGVsYXkoMSk7CisJCVJGX1dyaXRlUmVnKGRldiwgMHgwNiwgMHgwMGMxKTsJCQltZGVsYXkoMSk7CisJfQorCWVsc2UKKwl7CisJCVJGX1dyaXRlUmVnKGRldiwgMHgwNCwgMHgwM2E3KTsJCQltZGVsYXkoMSk7CisJCVJGX1dyaXRlUmVnKGRldiwgMHgwNSwgMHgwNTliKTsJCQltZGVsYXkoMSk7CisJCVJGX1dyaXRlUmVnKGRldiwgMHgwNiwgMHgwMDgxKTsJCQltZGVsYXkoMSk7CisJfQorCisKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDcsIDB4MDFBMCk7CQkJbWRlbGF5KDEpOworLy8gRG9uJ3Qgd3JpdGUgUkYyMy9SRjI0IHRvIG1ha2UgYSBkaWZmZXJlbmNlIGJldHdlZW4gODdTIEMgY3V0IGFuZCBEIGN1dC4gYXNrZWQgYnkgU0QzIHN0ZXZlbmwuCisvLwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDgsIDB4MDU5Nyk7CQkJbWRlbGF5KDEpOworLy8JUkZfV3JpdGVSZWcoZGV2LCAweDA5LCAweDA1MGEpOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MGEsIDB4MDAwMSk7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwYiwgMHgwNDE4KTsJCQltZGVsYXkoMSk7CisKKwlpZihwcml2LT5jYXJkXzgxODUgPT0gVkVSU0lPTl84MTg3U19EKQorCXsKKwkJUkZfV3JpdGVSZWcoZGV2LCAweDBjLCAweDBmYmUpOwkJCW1kZWxheSgxKTsKKwkJUkZfV3JpdGVSZWcoZGV2LCAweDBkLCAweDAwMDgpOwkJCW1kZWxheSgxKTsKKwkJUkZfV3JpdGVSZWcoZGV2LCAweDBlLCAweDA4MDcpOwkJCW1kZWxheSgxKTsgLy8gUlggTE8gYnVmZmVyCisJfQorCWVsc2UKKwl7CisJCVJGX1dyaXRlUmVnKGRldiwgMHgwYywgMHgwZmJlKTsJCQltZGVsYXkoMSk7CisJCVJGX1dyaXRlUmVnKGRldiwgMHgwZCwgMHgwMDA4KTsJCQltZGVsYXkoMSk7CisJCVJGX1dyaXRlUmVnKGRldiwgMHgwZSwgMHgwODA2KTsJCQltZGVsYXkoMSk7IC8vIFJYIExPIGJ1ZmZlcgorCX0KKworCVJGX1dyaXRlUmVnKGRldiwgMHgwZiwgMHgwYWNjKTsJCQltZGVsYXkoMSk7CisKKy8vCVJGX1dyaXRlUmVnKGRldiwgMHgwMCwgMHgwMTdmKTsJCQltZGVsYXkoMSk7Ly82CisJUkZfV3JpdGVSZWcoZGV2LCAweDAwLCAweDAxZDcpOwkJCW1kZWxheSgxKTsvLyA2CisKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDMsIDB4MGUwMCk7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwNCwgMHgwZTUwKTsJCQltZGVsYXkoMSk7CisJZm9yKGk9MDtpPD0zNjtpKyspCisJeworCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MDEsIGkpOyAgICAgICAgICAgICAgICAgICAgIG1kZWxheSgxKTsKKwkJUkZfV3JpdGVSZWcoZGV2LCAweDAyLCBaRUJSQV9SRl9SWF9HQUlOX1RBQkxFW2ldKTsgbWRlbGF5KDEpOworCQkvL0RiZ1ByaW50KCJSRiAtIDB4JXggPSAweCV4IiwgaSwgWkVCUkFfUkZfUlhfR0FJTl9UQUJMRVtpXSk7CisJfQorCisJUkZfV3JpdGVSZWcoZGV2LCAweDA1LCAweDAyMDMpOwkJCW1kZWxheSgxKTsgCS8vLyAyMDMsIDM0MworCS8vUkZfV3JpdGVSZWcoZGV2LCAweDA2LCAweDAzMDApOwkJCW1kZWxheSgxKTsJLy8gNDAwCisJUkZfV3JpdGVSZWcoZGV2LCAweDA2LCAweDAyMDApOwkJCW1kZWxheSgxKTsJLy8gNDAwCisKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDAsIDB4MDEzNyk7CQkJbWRlbGF5KDEpOwkvLyBzd2l0Y2ggdG8gcmVnMTYtcmVnMzAsIGFuZCBIU1NJIGRpc2FibGUgMTM3CisJbWRlbGF5KDEwKTsgCS8vIERlYXkgMTAgbXMuIC8vMHhmZAorCisvLwlSRl9Xcml0ZVJlZyhkZXYsIDB4MGMsIDB4MDliZSk7CQkJbWRlbGF5KDEpOwkvLyA3CisJLy9SRl9Xcml0ZVJlZyhkZXYsIDB4MGMsIDB4MDdiZSk7CQkJbWRlbGF5KDEpOworCS8vbWRlbGF5KDEwKTsgCS8vIERlYXkgMTAgbXMuIC8vMHhmZAorCisJUkZfV3JpdGVSZWcoZGV2LCAweDBkLCAweDAwMDgpOwkJCW1kZWxheSgxKTsJLy8gWjQgc3ludGhlc2l6ZXIgbG9vcCBmaWx0ZXIgc2V0dGluZywgMzkyCisJbWRlbGF5KDEwKTsgCS8vIERlYXkgMTAgbXMuIC8vMHhmZAorCisJUkZfV3JpdGVSZWcoZGV2LCAweDAwLCAweDAwMzcpOwkJCW1kZWxheSgxKTsJLy8gc3dpdGNoIHRvIHJlZzAtcmVnMTUsIGFuZCBIU1NJIGRpc2FibGUKKwltZGVsYXkoMTApOyAJLy8gRGVheSAxMCBtcy4gLy8weGZkCisKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDQsIDB4MDE2MCk7CQkJbWRlbGF5KDEpOyAJLy8gQ0JDIG9uLCBUeCBSeCBkaXNhYmxlLCBIaWdoIGdhaW4KKwltZGVsYXkoMTApOyAJLy8gRGVheSAxMCBtcy4gLy8weGZkCisKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDcsIDB4MDA4MCk7CQkJbWRlbGF5KDEpOwkvLyBaNCBzZXR0ZWQgY2hhbm5lbCAxCisJbWRlbGF5KDEwKTsgCS8vIERlYXkgMTAgbXMuIC8vMHhmZAorCisJUkZfV3JpdGVSZWcoZGV2LCAweDAyLCAweDA4OEQpOwkJCW1kZWxheSgxKTsJLy8gTEMgY2FsaWJyYXRpb24KKwltZGVsYXkoMjAwKTsgCS8vIERlYXkgMjAwIG1zLiAvLzB4ZmQKKwltZGVsYXkoMTApOyAJLy8gRGVheSAxMCBtcy4gLy8weGZkCisJbWRlbGF5KDEwKTsgCS8vIERlYXkgMTAgbXMuIC8vMHhmZAorCisJUkZfV3JpdGVSZWcoZGV2LCAweDAwLCAweDAxMzcpOwkJCW1kZWxheSgxKTsJLy8gc3dpdGNoIHRvIHJlZzE2LXJlZzMwIDEzNywgYW5kIEhTU0kgZGlzYWJsZSAxMzcKKwltZGVsYXkoMTApOyAJLy8gRGVheSAxMCBtcy4gLy8weGZkCisKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDcsIDB4MDAwMCk7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwNywgMHgwMTgwKTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDA3LCAweDAyMjApOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDcsIDB4MDNFMCk7CQkJbWRlbGF5KDEpOworCisJLy8gREFDIGNhbGlicmF0aW9uIG9mZiAyMDA3MDcwMgorCVJGX1dyaXRlUmVnKGRldiwgMHgwNiwgMHgwMGMxKTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDBhLCAweDAwMDEpOwkJCW1kZWxheSgxKTsKKy8ve2J5IGFteSAwODAzMTIKKwkvLyBGb3IgY3J5c3RhbCBjYWxpYnJhdGlvbiwgYWRkZWQgYnkgUm9nZXIsIDIwMDcuMTIuMTEuCisJaWYoIHByaXYtPmJYdGFsQ2FsaWJyYXRpb24gKSAvLyByZWcgMzAuCisJeyAvLyBlbmFibGUgY3J5c3RhbCBjYWxpYnJhdGlvbi4KKwkJLy8gUkYgUmVnWzMwXSwgKDEpWGluOlsxMjo5XSwgWG91dDpbODo1XSwgIGFkZHJbNDowXS4KKwkJLy8gKDIpUEEgUHdyIGRlbGF5IHRpbWVyWzE1OjE0XSwgZGVmYXVsdDogMi40dXMsIHNldCBCSVQxNT0wCisJCS8vICgzKVJGIHNpZ25hbCBvbi9vZmYgd2hlbiBjYWxpYnJhdGlvblsxM10sIGRlZmF1bHQ6IG9uLCBzZXQgQklUMTM9MC4KKwkJLy8gU28gd2Ugc2hvdWxkIG1pbnVzIDQgQklUcyBvZmZzZXQuCisJCVJGX1dyaXRlUmVnKGRldiwgMHgwZiwgKHByaXYtPlh0YWxDYWxfWGluPDw1KXwocHJpdi0+WHRhbENhbF9Yb3V0PDwxKXxCSVQxMXxCSVQ5KTsJCQltZGVsYXkoMSk7CisJCXByaW50aygiWkVCUkFfQ29uZmlnXzg1QkFTSUNfSGFyZENvZGUoKTogKCUwMngpXG4iLAorCQkJCShwcml2LT5YdGFsQ2FsX1hpbjw8NSkgfCAocHJpdi0+WHRhbENhbF9Yb3V0PDwxKSB8IEJJVDExfCBCSVQ5KTsKKwl9CisJZWxzZQorCXsgLy8gdXNpbmcgZGVmYXVsdCB2YWx1ZS4gWGluPTYsIFhvdXQ9Ni4KKwkJUkZfV3JpdGVSZWcoZGV2LCAweDBmLCAweDBhY2MpOwkJCW1kZWxheSgxKTsKKwl9CisvL2J5IGFteSAwODAzMTIKKy8vCVJGX1dyaXRlUmVnKGRldiwgMHgwZiwgMHgwYWNjKTsJCQltZGVsYXkoMSk7ICAvLy1ieSBhbXkgMDgwMzEyCisKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDAsIDB4MDBiZik7CQkJbWRlbGF5KDEpOyAvLyBzd2l0Y2ggdG8gcmVnMC1yZWcxNSwgYW5kIEhTU0kgZW5hYmxlCisvLwlSRl9Xcml0ZVJlZyhkZXYsIDB4MGQsIDB4MDA5Zik7CQkJbWRlbGF5KDEpOyAvLyBSeCBCQiBzdGFydCBjYWxpYnJhdGlvbiwgMDBjLy8tZWR3YXJkCisJUkZfV3JpdGVSZWcoZGV2LCAweDBkLCAweDA4ZGYpOwkJCW1kZWxheSgxKTsgLy8gUnggQkIgc3RhcnQgY2FsaWJyYXRpb24sIDAwYy8vK2Vkd2FyZAorCVJGX1dyaXRlUmVnKGRldiwgMHgwMiwgMHgwMDRkKTsJCQltZGVsYXkoMSk7IC8vIHRlbXBlcmF0dXJlIG1ldGVyIG9mZgorCVJGX1dyaXRlUmVnKGRldiwgMHgwNCwgMHgwOTc1KTsJCQltZGVsYXkoMSk7IC8vIFJ4IG1vZGUKKwltZGVsYXkoMTApOwkvLyBEZWF5IDEwIG1zLiAvLzB4ZmUKKwltZGVsYXkoMTApOwkvLyBEZWF5IDEwIG1zLiAvLzB4ZmUKKwltZGVsYXkoMTApOwkvLyBEZWF5IDEwIG1zLiAvLzB4ZmUKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDAsIDB4MDE5Nyk7CQkJbWRlbGF5KDEpOyAvLyBSeCBtb2RlLy8rZWR3YXJkCisJUkZfV3JpdGVSZWcoZGV2LCAweDA1LCAweDA1YWIpOwkJCW1kZWxheSgxKTsgLy8gUnggbW9kZS8vK2Vkd2FyZAorCVJGX1dyaXRlUmVnKGRldiwgMHgwMCwgMHgwMDlmKTsJCQltZGVsYXkoMSk7IC8vIFJ4IG1vZGUvLytlZHdhcmQKKworI2lmIDAvLy1lZHdhcmQKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDAsIDB4MDE5Nyk7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwNSwgMHgwNWFiKTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDAwLCAweDAwOUYpOwkJCW1kZWxheSgxKTsKKyNlbmRpZgorCVJGX1dyaXRlUmVnKGRldiwgMHgwMSwgMHgwMDAwKTsJCQltZGVsYXkoMSk7IC8vIFJ4IG1vZGUvLytlZHdhcmQKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDIsIDB4MDAwMCk7CQkJbWRlbGF5KDEpOyAvLyBSeCBtb2RlLy8rZWR3YXJkCisJLy9wb3dlciBzYXZlIHBhcmFtZXRlcnMuCisJdTFiMjRFID0gcmVhZF9uaWNfYnl0ZShkZXYsIDB4MjRFKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4MjRFLCAodTFiMjRFICYgKH4oQklUNXxCSVQ2KSkpKTsKKworCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDQ0tDT05GLlRYVAorCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qCVtQT1dFUiBTQVZFXSBQb3dlciBTYXZpbmcgUGFyYW1ldGVycyBieSBqb25nLiAyMDA3LTExLTI3CisJICAgCUNDSyByZWcweDAwWzddPTEnYjEgOnBvd2VyIHNhdmluZyBmb3IgVFggKGRlZmF1bHQpCisJCUNDSyByZWcweDAwWzZdPTEnYjE6IHBvd2VyIHNhdmluZyBmb3IgUlggKGRlZmF1bHQpCisJCUNDSyByZWcweDA2WzRdPTEnYjE6IHR1cm4gb2ZmIGNoYW5uZWwgZXN0aW1hdGlvbiByZWxhdGVkIGNpcmN1aXRzIGlmIG5vdCBkb2luZyBjaGFubmVsIGVzdGltYXRpb24uCisJCUNDSyByZWcweDA2WzNdPTEnYjE6IHR1cm4gb2ZmIHVudXNlZCBjaXJjdWl0cyBiZWZvcmUgY2NhID0gMQorCQlDQ0sgcmVnMHgwNlsyXT0xJ2IxOiB0dXJuIG9mZiBjY2sncyBjaXJjdWl0IGlmIG1hY3JzdCA9MAorCSovCisjaWYgMAorCXdyaXRlX25pY19kd29yZChkZXYsIFBIWV9BRFIsIDB4MDEwMGM4ODApOworCXdyaXRlX25pY19kd29yZChkZXYsIFBIWV9BRFIsIDB4MDEwMDFjODYpOworCXdyaXRlX25pY19kd29yZChkZXYsIFBIWV9BRFIsIDB4MDEwMDc4OTApOworCXdyaXRlX25pY19kd29yZChkZXYsIFBIWV9BRFIsIDB4MDEwMGQwYWUpOworCXdyaXRlX25pY19kd29yZChkZXYsIFBIWV9BRFIsIDB4MDEwMDA2YWYpOworCXdyaXRlX25pY19kd29yZChkZXYsIFBIWV9BRFIsIDB4MDEwMDQ2ODEpOworI2VuZGlmCisJd3JpdGVfcGh5X2NjayhkZXYsMHgwMCwweGM4KTsKKwl3cml0ZV9waHlfY2NrKGRldiwweDA2LDB4MWMpOworCXdyaXRlX3BoeV9jY2soZGV2LDB4MTAsMHg3OCk7CisJd3JpdGVfcGh5X2NjayhkZXYsMHgyZSwweGQwKTsKKwl3cml0ZV9waHlfY2NrKGRldiwweDJmLDB4MDYpOworCXdyaXRlX3BoeV9jY2soZGV2LDB4MDEsMHg0Nik7CisKKwkvLyBwb3dlciBjb250cm9sCisJd3JpdGVfbmljX2J5dGUoZGV2LCBDQ0tfVFhBR0MsIDB4MTApOworCXdyaXRlX25pY19ieXRlKGRldiwgT0ZETV9UWEFHQywgMHgxQik7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBBTlRTRUwsIDB4MDMpOworI2Vsc2UKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUkFESU9DRkcuVFhUCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUkZfV3JpdGVSZWcoZGV2LCAweDAwLCAweDAwYjcpOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDEsIDB4MGVlMCk7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwMiwgMHgwNDRkKTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDAzLCAweDA0NDEpOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDQsIDB4MDhjMyk7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwNSwgMHgwYzcyKTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDA2LCAweDAwZTYpOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDcsIDB4MDgyYSk7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwOCwgMHgwMDNmKTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDA5LCAweDAzMzUpOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MGEsIDB4MDlkNCk7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwYiwgMHgwN2JiKTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDBjLCAweDA4NTApOwkJCW1kZWxheSgxKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MGQsIDB4MGNkZik7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwZSwgMHgwMDJiKTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDBmLCAweDAxMTQpOwkJCW1kZWxheSgxKTsKKworCVJGX1dyaXRlUmVnKGRldiwgMHgwMCwgMHgwMWI3KTsJCQltZGVsYXkoMSk7CisKKworCWZvcihpPTE7aTw9OTU7aSsrKQorCXsKKwkJUkZfV3JpdGVSZWcoZGV2LCAweDAxLCBpKTsJbWRlbGF5KDEpOworCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MDIsIFpFQlJBX1JGX1JYX0dBSU5fVEFCTEVbaV0pOyBtZGVsYXkoMSk7CisJCS8vRGJnUHJpbnQoIlJGIC0gMHgleCA9IDB4JXgiLCBpLCBaRUJSQV9SRl9SWF9HQUlOX1RBQkxFW2ldKTsKKwl9CisKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDMsIDB4MDA4MCk7CQkJbWRlbGF5KDEpOyAJLy8gd3JpdGUgcmVnIDE4CisJUkZfV3JpdGVSZWcoZGV2LCAweDA1LCAweDAwMDQpOwkJCW1kZWxheSgxKTsJLy8gd3JpdGUgcmVnIDIwCisJUkZfV3JpdGVSZWcoZGV2LCAweDAwLCAweDAwYjcpOwkJCW1kZWxheSgxKTsJLy8gc3dpdGNoIHRvIHJlZzAtcmVnMTUKKwkvLzB4ZmQKKwkvLzB4ZmQKKwkvLzB4ZmQKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDIsIDB4MGM0ZCk7CQkJbWRlbGF5KDEpOworCW1kZWxheSgxMDApOwkvLyBEZWF5IDEwMCBtcy4gLy8weGZlCisJbWRlbGF5KDEwMCk7CS8vIERlYXkgMTAwIG1zLiAvLzB4ZmUKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDIsIDB4MDQ0ZCk7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwMCwgMHgwMmJmKTsJCQltZGVsYXkoMSk7CS8vMHgwMDJmIGRpc2FibGUgNnVzIGNvcm5lciBjaGFuZ2UsICAwNmYtLT4gZW5hYmxlCisKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ0NLQ09ORi5UWFQKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gRm9sbG93IFdNQUMgUlRMODIyNV9Db25maWcoKQorCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8vIHBvd2VyIGNvbnRyb2wKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENDS19UWEFHQywgMHgwMyk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBPRkRNX1RYQUdDLCAweDA3KTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIEFOVFNFTCwgMHgwMyk7CisKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvLyBPRkRNIEJCUCBzZXR1cAorLy8JU2V0T3V0cHV0RW5hYmxlT2ZSZlBpbnMoZGV2KTsvL2J5IGFteQorI2VuZGlmCisKKworCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEFHQy50eHQKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vCVBsYXRmb3JtSU9Xcml0ZTRCeXRlKCBkZXYsIFBoeUFkZHIsIDB4MDAwMDEyODApOwkvLyBBbm5pZSwgMjAwNi0wNS0wNQorCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwMCwgMHgxMik7CisJLy9Xcml0ZUJCUG9ydFVjaGFyKGRldiwgMHgwMDAwMTI4MCk7CisKKwlmb3IgKGk9MDsgaTwxMjg7IGkrKykKKwl7CisJCS8vRGJnUHJpbnQoIkFHQyAtIFsleCsxXSA9IDB4JXhcbiIsIGksIFpFQlJBX0FHQ1tpKzFdKTsKKworCQlkYXRhID0gWkVCUkFfQUdDW2krMV07CisJCWRhdGEgPSBkYXRhIDw8IDg7CisJCWRhdGEgPSBkYXRhIHwgMHgwMDAwMDA4RjsKKworCQlhZGRyID0gaSArIDB4ODA7IC8vZW5hYmxlIHdyaXRpbmcgQUdDIHRhYmxlCisJCWFkZHIgPSBhZGRyIDw8IDg7CisJCWFkZHIgPSBhZGRyIHwgMHgwMDAwMDA4RTsKKworCQlXcml0ZUJCUG9ydFVjaGFyKGRldiwgZGF0YSk7CisJCVdyaXRlQkJQb3J0VWNoYXIoZGV2LCBhZGRyKTsKKwkJV3JpdGVCQlBvcnRVY2hhcihkZXYsIDB4MDAwMDAwOEUpOworCX0KKworCVBsYXRmb3JtSU9Xcml0ZTRCeXRlKCBkZXYsIFBoeUFkZHIsIDB4MDAwMDEwODApOwkvLyBBbm5pZSwgMjAwNi0wNS0wNQorCS8vV3JpdGVCQlBvcnRVY2hhcihkZXYsIDB4MDAwMDEwODApOworCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIE9GRE1DT05GLlRYVAorCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCWZvcihpPTA7IGk8NjA7IGkrKykKKwl7CisJCXU0YlJlZ09mZnNldD1pOworCQl1NGJSZWdWYWx1ZT1PRkRNX0NPTkZJR1tpXTsKKworCQkvL0RiZ1ByaW50KCJPRkRNIC0gMHgleCA9IDB4JXhcbiIsIHU0YlJlZ09mZnNldCwgdTRiUmVnVmFsdWUpOworCisJCVdyaXRlQkJQb3J0VWNoYXIoZGV2LAorCQkJCQkJKDB4MDAwMDAwODAgfAorCQkJCQkJKHU0YlJlZ09mZnNldCAmIDB4N2YpIHwKKwkJCQkJCSgodTRiUmVnVmFsdWUgJiAweGZmKSA8PCA4KSkpOworCX0KKworCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vYnkgYW15IGZvciBhbnRlbm5hCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy97YnkgYW15IDA4MDMxMgorI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKwkvLyBDb25maWcgU3cvSHcgIENvbWJpbmF0aW9uYWwgQW50ZW5uYSBEaXZlcnNpdHkuIEFkZGVkIGJ5IFJvZ2VyLCAyMDA4LjAyLjI2LgorCVNldEFudGVubmFDb25maWc4N1NFKGRldiwgcHJpdi0+YkRlZmF1bHRBbnRlbm5hMSwgcHJpdi0+YlN3QW50ZW5uYURpdmVyaXR5KTsKKyNlbmRpZgorLy9ieSBhbXkgMDgwMzEyfQorI2lmIDAKKwkvLyBDb25maWcgU3cvSHcgIEFudGVubmEgRGl2ZXJzaXR5CisJaWYoIHByaXYtPmJTd0FudGVubmFEaXZlcml0eSApICAvLyAgVXNlIFNXK0h3IEFudGVubmEgRGl2ZXJzaXR5CisJeworCQlpZiggcHJpdi0+YkRlZmF1bHRBbnRlbm5hMSA9PSB0cnVlICkgIC8vIGF1eCBhbnRlbm5hCisJCXsKKwkJCS8vIE1hYyByZWdpc3RlciwgYXV4IGFudGVubmEKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgQU5UU0VMLCAweDAwKTsKKwkJCS8vIENvbmZpZyBDQ0sgUlggYW50ZW5uYS4KKwkJCXdyaXRlX3BoeV9jY2soZGV2LCAweDExLCAweGJiKTsgLy8gUmVnMTEgOiBiYgorCQkJd3JpdGVfcGh5X2NjayhkZXYsIDB4MGMsIDB4MDkpOyAvLyBSZWcwYyA6IDA5CisJCQl3cml0ZV9waHlfY2NrKGRldiwgMHgwMSwgMHhjNyk7IC8vIFJlZzAxIDogYzcKKwkJCS8vIENvbmZpZyBPRkRNIFJYIGFudGVubmEuCisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MGQsIDB4NTQpOyAgIC8vIFJlZzBkIDogNTQKKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxOCwgMHhiMik7ICAvLyBSZWcxOCA6IGIyCisJCX0KKwkJZWxzZSAvLyAgbWFpbiBhbnRlbm5hCisJCXsKKwkJCS8vIE1hYyByZWdpc3RlciwgbWFpbiBhbnRlbm5hCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEFOVFNFTCwgMHgwMyk7CisJCQkvL2Jhc2UgYmFuZAorCQkJLy8gQ29uZmlnIENDSyBSWCBhbnRlbm5hLgorCQkJd3JpdGVfcGh5X2NjayhkZXYsIDB4MTEsIDB4OWIpOyAvLyBSZWcxMSA6IDliCisJCQl3cml0ZV9waHlfY2NrKGRldiwgMHgwYywgMHgwOSk7IC8vIFJlZzBjIDogMDkKKwkJCXdyaXRlX3BoeV9jY2soZGV2LCAweDAxLCAweGM3KTsgLy8gUmVnMDEgOiBjNworCQkJLy8gQ29uZmlnIE9GRE0gUlggYW50ZW5uYS4KKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwZCwgMHg1Yyk7ICAgLy8gUmVnMGQgOiA1YworCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE4LCAweGIyKTsgIC8vIFJlZzE4IDogYjIKKwkJfQorCX0KKwllbHNlICAgLy8gRGlzYWJsZSBBbnRlbm5hIERpdmVyc2l0eQorCXsKKwkJaWYoIHByaXYtPmJEZWZhdWx0QW50ZW5uYTEgPT0gdHJ1ZSApIC8vIGF1eCBBbnRlbm5hCisJCXsKKwkJCS8vIE1hYyByZWdpc3RlciwgYXV4IGFudGVubmEKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgQU5UU0VMLCAweDAwKTsKKwkJCS8vIENvbmZpZyBDQ0sgUlggYW50ZW5uYS4KKwkJCXdyaXRlX3BoeV9jY2soZGV2LCAweDExLCAweGJiKTsgLy8gUmVnMTEgOiBiYgorCQkJd3JpdGVfcGh5X2NjayhkZXYsIDB4MGMsIDB4MDkpOyAvLyBSZWcwYyA6IDA5CisJCQl3cml0ZV9waHlfY2NrKGRldiwgMHgwMSwgMHg0Nyk7IC8vIFJlZzAxIDogNDcKKwkJCS8vIENvbmZpZyBPRkRNIFJYIGFudGVubmEuCisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MGQsIDB4NTQpOyAgIC8vIFJlZzBkIDogNTQKKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxOCwgMHgzMik7ICAvLyBSZWcxOCA6IDMyCisJCX0KKwkJZWxzZSAvLyBtYWluIEFudGVubmEKKwkJeworCQkJLy8gTWFjIHJlZ2lzdGVyLCBtYWluIGFudGVubmEKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgQU5UU0VMLCAweDAzKTsKKwkJCS8vIENvbmZpZyBDQ0sgUlggYW50ZW5uYS4KKwkJCXdyaXRlX3BoeV9jY2soZGV2LCAweDExLCAweDliKTsgLy8gUmVnMTEgOiA5YgorCQkJd3JpdGVfcGh5X2NjayhkZXYsIDB4MGMsIDB4MDkpOyAvLyBSZWcwYyA6IDA5CisJCQl3cml0ZV9waHlfY2NrKGRldiwgMHgwMSwgMHg0Nyk7IC8vIFJlZzAxIDogNDcKKwkJCS8vIENvbmZpZyBPRkRNIFJYIGFudGVubmEuCisJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MGQsIDB4NWMpOyAgIC8vIFJlZzBkIDogNWMKKwkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxOCwgMHgzMik7ICAvLyBSZWcxOCA6IDMyCisJCX0KKwl9CisjZW5kaWYKKy8vYnkgYW15IGZvciBhbnRlbm5hCit9CisKKwordm9pZAorVXBkYXRlSW5pdGlhbEdhaW4oCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldgorCSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJLy91bnNpZ25lZCBjaGFyKiBJR1RhYmxlOworCS8vdTgJCQlESUdfQ3VycmVudEluaXRpYWxHYWluID0gNDsKKwkvL3Vuc2lnbmVkIGNoYXIgdTFUbXA7CisKKwkvL2x6bSBhZGQgMDgwODI2CisJaWYocHJpdi0+ZVJGUG93ZXJTdGF0ZSAhPSBlUmZPbikKKwl7CisJCS8vRG9uJ3QgYWNjZXNzIEJCL1JGIHVuZGVyIGRpc2FibGUgUExMIHNpdHVhdGlvbi4KKwkJLy9SVF9UUkFDRShDT01QX0RJRywgREJHX0xPVUQsICgiVXBkYXRlSW5pdGlhbEdhaW4gLSBwSGFsRGF0YS0+ZVJGUG93ZXJTdGF0ZSE9ZVJmT25cbiIpKTsKKwkJLy8gQmFjayB0byB0aGUgb3JpZ2luYWwgc3RhdGUKKwkJcHJpdi0+SW5pdGlhbEdhaW49IHByaXYtPkluaXRpYWxHYWluQmFja1VwOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoKHByaXYtPnJmX2NoaXApCisJeworI2lmIDAKKwljYXNlIFJGX1pFQlJBMjoKKwkJLy8gRHluYW1pYyBzZXQgaW5pdGlhbCBnYWluLCBieSBzaGllbiBjaGFuZywgMjAwNi4wNy4xNAorCQlzd2l0Y2gocHJpdi0+SW5pdGlhbEdhaW4pCisJCXsKKwkJCWNhc2UgMTogLy9tODYxZEJtCisJCQkJRE1FU0coIlJUTDgxODVCICsgODIyNSBJbml0aWFsIEdhaW4gU3RhdGUgMTogLTgyIGRCbSBcbiIpOworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4MjY5Nyk7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweDg2YTQpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHhmYTg1KTsJbWRlbGF5KDEpOworCQkJCWJyZWFrOworCisJCQljYXNlIDI6IC8vbTg2MmRCbQorCQkJCURNRVNHKCJSVEw4MTg1QiArIDgyMjUgSW5pdGlhbCBHYWluIFN0YXRlIDI6IC04MiBkQm0gXG4iKTsKKwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweDI2OTcpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHg4NmE0KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4ZmI4NSk7CW1kZWxheSgxKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAzOiAvL204NjNkQm0KKwkJCQlETUVTRygiUlRMODE4NUIgKyA4MjI1IEluaXRpYWwgR2FpbiBTdGF0ZSAzOiAtODIgZEJtIFxuIik7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHgyNjk3KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4OTZhNCk7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweGZiODUpOwltZGVsYXkoMSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgNDogLy9tODY0ZEJtCisJCQkJRE1FU0coIlJUTDgxODVCICsgODIyNSBJbml0aWFsIEdhaW4gU3RhdGUgNDogLTc4IGRCbSBcbiIpOworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4MjY5Nyk7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweGE2YTQpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHhmYjg1KTsJbWRlbGF5KDEpOworCQkJCWJyZWFrOworCisJCQljYXNlIDU6IC8vbTgyZEJtCisJCQkJRE1FU0coIlJUTDgxODVCICsgODIyNSBJbml0aWFsIEdhaW4gU3RhdGUgNTogLTc0IGRCbSBcbiIpOworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4MzY5Nyk7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweGE2YTQpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHhmYjg1KTsJbWRlbGF5KDEpOworCQkJCWJyZWFrOworCisJCQljYXNlIDY6IC8vbTc4ZEJtCisJCQkJRE1FU0coIlJUTDgxODVCICsgODIyNSBJbml0aWFsIEdhaW4gU3RhdGUgNjogLTcwIGRCbSBcbiIpOworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4NDY5Nyk7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweGE2YTQpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHhmYjg1KTsJbWRlbGF5KDEpOworCQkJCWJyZWFrOworCisJCQljYXNlIDc6IC8vbTc0ZEJtCisJCQkJRE1FU0coIlJUTDgxODVCICsgODIyNSBJbml0aWFsIEdhaW4gU3RhdGUgNzogLTY2IGRCbSBcbiIpOworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4NTY5Nyk7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweGE2YTQpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHhmYjg1KTsJbWRlbGF5KDEpOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgkvL01QCisJCQkJRE1FU0coIlJUTDgxODVCICsgODIyNSBJbml0aWFsIEdhaW4gU3RhdGUgMTogLTgyIGRCbSAoZGVmYXVsdClcbiIpOworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFBoeUFkZHIsIDB4MjY5Nyk7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBQaHlBZGRyLCAweDg2YTQpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUGh5QWRkciwgMHhmYTg1KTsJbWRlbGF5KDEpOworCQkJCWJyZWFrOworCQl9CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBSRl9aRUJSQTQ6CisJCS8vIER5bmFtaWMgc2V0IGluaXRpYWwgZ2FpbiwgZm9sbG93IDg3QgorCQlzd2l0Y2gocHJpdi0+SW5pdGlhbEdhaW4pCisJCXsKKwkJCWNhc2UgMTogLy9tODYxZEJtCisJCQkJLy9ETUVTRygiUlRMODE4NyArIDgyMjUgSW5pdGlhbCBHYWluIFN0YXRlIDE6IC04MiBkQm0gXG4iKTsKKwkJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTcsIDB4MjYpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI0LCAweDg2KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwNSwgMHhmYSk7CW1kZWxheSgxKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAyOiAvL204NjJkQm0KKwkJCQkvL0RNRVNHKCJSVEw4MTg3ICsgODIyNSBJbml0aWFsIEdhaW4gU3RhdGUgMjogLTgyIGRCbSBcbiIpOworCQkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNywgMHgzNik7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjQsIDB4ODYpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDA1LCAweGZhKTsJbWRlbGF5KDEpOworCQkJCWJyZWFrOworCisJCQljYXNlIDM6IC8vbTg2M2RCbQorCQkJCS8vRE1FU0coIlJUTDgxODcgKyA4MjI1IEluaXRpYWwgR2FpbiBTdGF0ZSAzOiAtODIgZEJtIFxuIik7CisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE3LCAweDM2KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNCwgMHg4Nik7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MDUsIDB4ZmIpOwltZGVsYXkoMSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgNDogLy9tODY0ZEJtCisJCQkJLy9ETUVTRygiUlRMODE4NyArIDgyMjUgSW5pdGlhbCBHYWluIFN0YXRlIDQ6IC03OCBkQm0gXG4iKTsKKwkJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTcsIDB4NDYpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI0LCAweDg2KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwNSwgMHhmYik7CW1kZWxheSgxKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSA1OiAvL204MmRCbQorCQkJCS8vRE1FU0coIlJUTDgxODcgKyA4MjI1IEluaXRpYWwgR2FpbiBTdGF0ZSA1OiAtNzQgZEJtIFxuIik7CisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE3LCAweDQ2KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNCwgMHg5Nik7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MDUsIDB4ZmIpOwltZGVsYXkoMSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgNjogLy9tNzhkQm0KKwkJCQkvL0RNRVNHICgiUlRMODE4NyArIDgyMjUgSW5pdGlhbCBHYWluIFN0YXRlIDY6IC03MCBkQm0gXG4iKTsKKwkJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MTcsIDB4NTYpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDI0LCAweDk2KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwNSwgMHhmYyk7CW1kZWxheSgxKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSA3OiAvL203NGRCbQorCQkJCS8vRE1FU0coIlJUTDgxODcgKyA4MjI1IEluaXRpYWwgR2FpbiBTdGF0ZSA3OiAtNjYgZEJtIFxuIik7CisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDE3LCAweDU2KTsJbWRlbGF5KDEpOworCQkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgyNCwgMHhhNik7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MDUsIDB4ZmMpOwltZGVsYXkoMSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgODoKKwkJCQkvL0RNRVNHKCJSVEw4MTg3ICsgODIyNSBJbml0aWFsIEdhaW4gU3RhdGUgODpcbiIpOworCQkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNywgMHg2Nik7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjQsIDB4YjYpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDA1LCAweGZjKTsJbWRlbGF5KDEpOworCQkJCWJyZWFrOworCisKKwkJCWRlZmF1bHQ6CS8vTVAKKwkJCQkvL0RNRVNHKCJSVEw4MTg3ICsgODIyNSBJbml0aWFsIEdhaW4gU3RhdGUgMTogLTgyIGRCbSAoZGVmYXVsdClcbiIpOworCQkJCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgxNywgMHgyNik7CW1kZWxheSgxKTsKKwkJCQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MjQsIDB4ODYpOwltZGVsYXkoMSk7CisJCQkJd3JpdGVfcGh5X29mZG0oZGV2LCAweDA1LCAweGZhKTsJbWRlbGF5KDEpOworCQkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisKKwlkZWZhdWx0OgorCQlETUVTRygiVXBkYXRlSW5pdGlhbEdhaW4oKTogdW5rbm93biBSRkNoaXBJRDogJSNYXG4iLCBwcml2LT5yZl9jaGlwKTsKKwkJYnJlYWs7CisJfQorfQorI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKy8vCisvLwlEZXNjcmlwdGlvbjoKKy8vCQlUeCBQb3dlciB0cmFja2luZyBtZWNoYW5pc20gcm91dGluZSBvbiA4N1NFLgorLy8gCUNyZWF0ZWQgYnkgUm9nZXIsIDIwMDcuMTIuMTEuCisvLwordm9pZAorSW5pdFR4UHdyVHJhY2tpbmc4N1NFKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYKKykKK3sKKwkvL3N0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIJdTRiUmZSZWc7CisKKwl1NGJSZlJlZyA9IFJGX1JlYWRSZWcoZGV2LCAweDAyKTsKKworCS8vIEVuYWJsZSBUaGVybWFsIG1ldGVyIGluZGljYXRpb24uCisJLy9wcmludGsoIkluaXRUeFB3clRyYWNraW5nODdTRSgpOiBFbmFibGUgdGhlcm1hbCBtZXRlciBpbmRpY2F0aW9uLCBXcml0ZSBSRlsweDAyXSA9ICUjeCIsIHU0YlJmUmVnfFBXUl9NRVRFUl9FTik7CisJUkZfV3JpdGVSZWcoZGV2LCAweDAyLCB1NGJSZlJlZ3xQV1JfTUVURVJfRU4pOwkJCW1kZWxheSgxKTsKK30KKworI2VuZGlmCit2b2lkCitQaHlDb25maWc4MTg1KAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYKKwkpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworICAgICAgIHdyaXRlX25pY19kd29yZChkZXYsIFJDUiwgcHJpdi0+UmVjZWl2ZUNvbmZpZyk7CisJICAgcHJpdi0+UkZQcm9nVHlwZSA9IHJlYWRfbmljX2J5dGUoZGV2LCBDT05GSUc0KSAmIDB4MDM7CisgICAgIAkvLyBSRiBjb25maWcKKwlzd2l0Y2gocHJpdi0+cmZfY2hpcCkKKwl7CisJY2FzZSBSRl9aRUJSQTI6CisJY2FzZSBSRl9aRUJSQTQ6CisJCVpFQlJBX0NvbmZpZ184NUJBU0lDX0hhcmRDb2RlKCBkZXYpOworCQlicmVhazsKKwl9CisvL3tieSBhbXkgMDgwMzEyCisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUworCS8vIFNldCBkZWZhdWx0IGluaXRpYWwgZ2FpbiBzdGF0ZSB0byA0LCBhcHByb3ZlZCBieSBTRDMgRFosIGJ5IEJydWNlLCAyMDA3LTA2LTA2LgorCWlmKHByaXYtPmJEaWdNZWNoYW5pc20pCisJeworCQlpZihwcml2LT5Jbml0aWFsR2FpbiA9PSAwKQorCQkJcHJpdi0+SW5pdGlhbEdhaW4gPSA0OworCQkvL3ByaW50aygiUGh5Q29uZmlnODE4NSgpOiBESUcgaXMgZW5hYmxlZCwgc2V0IGRlZmF1bHQgaW5pdGlhbCBnYWluIGluZGV4IHRvICVkXG4iLCBwcml2LT5Jbml0aWFsR2Fpbik7CisJfQorCisJLy8KKwkvLyBFbmFibGUgdGhlcm1hbCBtZXRlciBpbmRpY2F0aW9uIHRvIGltcGxlbWVudCBUeFBvd2VyIHRyYWNraW5nIG9uIDg3U0UuCisJLy8gV2UgaW5pdGlhbGl6ZSB0aGVybWFsIG1ldGVyIGhlcmUgdG8gYXZvaWQgdW5zdWNjZXNzZnVsIGNvbmZpZ3VyYXRpb24uCisJLy8gQWRkZWQgYnkgUm9nZXIsIDIwMDcuMTIuMTEuCisJLy8KKwlpZihwcml2LT5iVHhQb3dlclRyYWNrKQorCQlJbml0VHhQd3JUcmFja2luZzg3U0UoZGV2KTsKKworI2VuZGlmCisvL2J5IGFteSAwODAzMTJ9CisJcHJpdi0+SW5pdGlhbEdhaW5CYWNrVXA9IHByaXYtPkluaXRpYWxHYWluOworCVVwZGF0ZUluaXRpYWxHYWluKGRldik7CisKKwlyZXR1cm47Cit9CisKKworCisKK3ZvaWQKK0h3Q29uZmlndXJlUlRMODE4NSgKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldgorCQkpCit7CisJLy9SVEw4MTg1X1RPRE86IERldGVybWluZSBSZXRyeWxpbWl0LCBUeEFHQywgQXV0b1JhdGVGYWxsYmFjayBjb250cm9sLgorLy8JdTgJCWJVTklWRVJTQUxfQ09OVFJPTF9STCA9IDE7CisgICAgICAgIHU4ICAgICAgICAgICAgICBiVU5JVkVSU0FMX0NPTlRST0xfUkwgPSAwOworCisJdTgJCWJVTklWRVJTQUxfQ09OVFJPTF9BR0MgPSAxOworCXU4CQliVU5JVkVSU0FMX0NPTlRST0xfQU5UID0gMTsKKwl1OAkJYkFVVE9fUkFURV9GQUxMQkFDS19DVEwgPSAxOworCXU4CQl2YWw4OworCS8vc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCS8vc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBwcml2LT5pZWVlODAyMTE7CisgICAgICAJLy9pZihJU19XSVJFTEVTU19NT0RFX0EoZGV2KSB8fCBJU19XSVJFTEVTU19NT0RFX0coZGV2KSkKKy8ve2J5IGFteSAwODAzMTIJaWYoKGllZWUtPm1vZGUgPT0gSUVFRV9HKXx8KGllZWUtPm1vZGUgPT0gSUVFRV9BKSkKKy8vCXsKKy8vCQl3cml0ZV9uaWNfd29yZChkZXYsIEJSU1IsIDB4ZmZmZik7CisvLwl9CisvLwllbHNlCisvLwl7CisvLwkJd3JpdGVfbmljX3dvcmQoZGV2LCBCUlNSLCAweDAwMGYpOworLy8JfQorLy9ieSBhbXkgMDgwMzEyfQorICAgICAgICB3cml0ZV9uaWNfd29yZChkZXYsIEJSU1IsIDB4MGZmZik7CisJLy8gUmV0cnkgbGltaXQKKwl2YWw4ID0gcmVhZF9uaWNfYnl0ZShkZXYsIENXX0NPTkYpOworCisJaWYoYlVOSVZFUlNBTF9DT05UUk9MX1JMKQorCQl2YWw4ID0gdmFsOCAmIDB4ZmQ7CisJZWxzZQorCQl2YWw4ID0gdmFsOCB8IDB4MDI7CisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENXX0NPTkYsIHZhbDgpOworCisJLy8gVHggQUdDCisJdmFsOCA9IHJlYWRfbmljX2J5dGUoZGV2LCBUWEFHQ19DVEwpOworCWlmKGJVTklWRVJTQUxfQ09OVFJPTF9BR0MpCisJeworCQl3cml0ZV9uaWNfYnl0ZShkZXYsIENDS19UWEFHQywgMTI4KTsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBPRkRNX1RYQUdDLCAxMjgpOworCQl2YWw4ID0gdmFsOCAmIDB4ZmU7CisJfQorCWVsc2UKKwl7CisJCXZhbDggPSB2YWw4IHwgMHgwMSA7CisJfQorCisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFRYQUdDX0NUTCwgdmFsOCk7CisKKwkvLyBUeCBBbnRlbm5hIGluY2x1ZGluZyBGZWVkYmFjayBjb250cm9sCisJdmFsOCA9IHJlYWRfbmljX2J5dGUoZGV2LCBUWEFHQ19DVEwgKTsKKworCWlmKGJVTklWRVJTQUxfQ09OVFJPTF9BTlQpCisJeworCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEFOVFNFTCwgMHgwMCk7CisJCXZhbDggPSB2YWw4ICYgMHhmZDsKKwl9CisJZWxzZQorCXsKKwkJdmFsOCA9IHZhbDggJiAodmFsOHwweDAyKTsgLy94aW9uZy0yMDA2LTExLTE1CisJfQorCisJd3JpdGVfbmljX2J5dGUoZGV2LCBUWEFHQ19DVEwsIHZhbDgpOworCisJLy8gQXV0byBSYXRlIGZhbGxiYWNrIGNvbnRyb2wKKwl2YWw4ID0gcmVhZF9uaWNfYnl0ZShkZXYsIFJBVEVfRkFMTEJBQ0spOworCXZhbDggJj0gMHg3YzsKKwlpZiggYkFVVE9fUkFURV9GQUxMQkFDS19DVEwgKQorCXsKKwkJdmFsOCB8PSBSQVRFX0ZBTExCQUNLX0NUTF9FTkFCTEUgfCBSQVRFX0ZBTExCQUNLX0NUTF9BVVRPX1NURVAxOworCisJCS8vIDxSSl9UT0RPXzgxODVCPiBXZSBzaGFsbCBzZXQgdXAgdGhlIEFSRlIgYWNjb3JkaW5nIHRvIHVzZXIncyBzZXR0aW5nLgorCQkvL3dyaXRlX25pY193b3JkKGRldiwgQVJGUiwgMHgwZmZmKTsgLy8gc2V0IDFNIH4gNTRNCisvL2J5IGFteQorI2lmIDAKKwkJUGxhdGZvcm1JT1dyaXRlMkJ5dGUoZGV2LCBBUkZSLCAweDBmZmYpOyAJLy8gc2V0IDFNIH4gNTRNCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisJICAgICAgICAvLyBBYWRkZWQgYnkgUm9nZXIsIDIwMDcuMTEuMTUuCisJICAgICAgICBQbGF0Zm9ybUlPV3JpdGUyQnl0ZShkZXYsIEFSRlIsIDB4MGZmZik7IC8vc2V0IDFNIH4gNTRNYnBzLgorI2Vsc2UKKwkJUGxhdGZvcm1JT1dyaXRlMkJ5dGUoZGV2LCBBUkZSLCAweDBjMDApOyAvL3NldCA0OE1icHMsIDU0TWJwcy4KKyAgICAgICAgICAgICAgICAvLyBCeSBTRDMgc3p1eWkncyByZXF1ZXN0LiBieSBSb2dlciwgMjAwNy4wMy4yNi4KKyNlbmRpZgorLy9ieSBhbXkKKwl9CisJZWxzZQorCXsKKwl9CisJd3JpdGVfbmljX2J5dGUoZGV2LCBSQVRFX0ZBTExCQUNLLCB2YWw4KTsKK30KKworCisKK3N0YXRpYyB2b2lkCitNYWNDb25maWdfODVCQVNJQ19IYXJkQ29kZSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIE1BQ1JFRy5UWFQKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlpbnQJCQluTGluZXNSZWFkID0gMDsKKworCXUzMgl1NGJSZWdPZmZzZXQsIHU0YlJlZ1ZhbHVlLHU0YlBhZ2VJbmRleCA9IDA7CisJaW50CWk7CisKKwluTGluZXNSZWFkPXNpemVvZihNQUNfUkVHX1RBQkxFKS8yOworCisJZm9yKGkgPSAwOyBpIDwgbkxpbmVzUmVhZDsgaSsrKSAgLy9uTGluZXNSZWFkPTEwMQorCXsKKwkJdTRiUmVnT2Zmc2V0PU1BQ19SRUdfVEFCTEVbaV1bMF07CisJCXU0YlJlZ1ZhbHVlPU1BQ19SRUdfVEFCTEVbaV1bMV07CisKKyAgICAgICAgICAgICAgICBpZih1NGJSZWdPZmZzZXQgPT0gMHg1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHU0YlBhZ2VJbmRleCA9IHU0YlJlZ1ZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1NGJSZWdPZmZzZXQgfD0gKHU0YlBhZ2VJbmRleCA8PCA4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy9EYmdQcmludCgiTUFDIC0gMHgleCA9IDB4JXhcbiIsIHU0YlJlZ09mZnNldCwgdTRiUmVnVmFsdWUpOworCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHU0YlJlZ09mZnNldCwgKHU4KXU0YlJlZ1ZhbHVlKTsKKwl9CisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit9CisKKworCitzdGF0aWMgdm9pZAorTWFjQ29uZmlnXzg1QkFTSUMoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKworICAgICAgIHU4CQkJdTFEQTsKKwlNYWNDb25maWdfODVCQVNJQ19IYXJkQ29kZShkZXYpOworCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvLyBGb2xsb3cgVElEX0FDX01BUCBvZiBXTWFjLgorCXdyaXRlX25pY193b3JkKGRldiwgVElEX0FDX01BUCwgMHhmYTUwKTsKKworCS8vIEludGVycnVwdCBNaWdyYXRpb24sIEpvbmcgc3VnZ2VzdGVkIHdlIHVzZSBzZXQgMHgwMDAwIGZpcnN0LCAyMDA1LjEyLjE0LCBieSByY25qa28uCisJd3JpdGVfbmljX3dvcmQoZGV2LCBJbnRNaWcsIDB4MDAwMCk7CisKKwkvLyBQcmV2ZW50IFRQQyB0byBjYXVzZSBDUkMgZXJyb3IuIEFkZGVkIGJ5IEFubmllLCAyMDA2LTA2LTEwLgorCVBsYXRmb3JtSU9Xcml0ZTRCeXRlKGRldiwgMHgxRjAsIDB4MDAwMDAwMDApOworCVBsYXRmb3JtSU9Xcml0ZTRCeXRlKGRldiwgMHgxRjQsIDB4MDAwMDAwMDApOworCVBsYXRmb3JtSU9Xcml0ZTFCeXRlKGRldiwgMHgxRjgsIDB4MDApOworCisJLy8gQXNrZWQgZm9yIGJ5IFNEMyBDTSBMaW4sIDIwMDYuMDYuMjcsIGJ5IHJjbmprby4KKwkvL1BsYXRmb3JtSU9Xcml0ZTRCeXRlKGRldiwgUkZUaW1pbmcsIDB4MDAwMDQwMDEpOworLy9ieSBhbXkKKyNpZiAwCisJd3JpdGVfbmljX2R3b3JkKGRldiwgUkZUaW1pbmcsIDB4MDAwMDQwMDEpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1JUTDgxOFhfUworCS8vIHBvd2VyIHNhdmUgcGFyYW1ldGVyIGJhc2VkIG9uICI4N1NFIHBvd2VyIHNhdmUgcGFyYW1ldGVycyAyMDA3MTEyNy5kb2MiLCBhcyBmb2xsb3cuCisKKwkvL0VuYWJsZSBEQTEwIFRYIHBvd2VyIHNhdmluZworCXUxREEgPSByZWFkX25pY19ieXRlKGRldiwgUEhZUFIpOworCXdyaXRlX25pY19ieXRlKGRldiwgUEhZUFIsICh1MURBIHwgQklUMikgKTsKKworCS8vUE9XRVI6CisJd3JpdGVfbmljX3dvcmQoZGV2LCAweDM2MCwgMHgxMDAwKTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIDB4MzYyLCAweDEwMDApOworCisJLy8gQUZFLgorCXdyaXRlX25pY193b3JkKGRldiwgMHgzNzAsIDB4MDU2MCk7CisJd3JpdGVfbmljX3dvcmQoZGV2LCAweDM3MiwgMHgwNTYwKTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIDB4Mzc0LCAweDBEQTQpOworCXdyaXRlX25pY193b3JkKGRldiwgMHgzNzYsIDB4MERBNCk7CisJd3JpdGVfbmljX3dvcmQoZGV2LCAweDM3OCwgMHgwNTYwKTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIDB4MzdBLCAweDA1NjApOworCXdyaXRlX25pY193b3JkKGRldiwgMHgzN0MsIDB4MDBFQyk7CisvLwl3cml0ZV9uaWNfd29yZChkZXYsIDB4MzdFLCAweDAwRkUpOy8vLWVkd2FyZAorCXdyaXRlX25pY193b3JkKGRldiwgMHgzN0UsIDB4MDBFQyk7Ly8rZWR3YXJkCisjZWxzZQorICAgICAgIHdyaXRlX25pY19kd29yZChkZXYsIFJGVGltaW5nLCAweDAwMDA0MDAzKTsKKyNlbmRpZgorICAgICAgIHdyaXRlX25pY19ieXRlKGRldiwgMHgyNEUsMHgwMSk7CisvL2J5IGFteQorCit9CisKKworCisKK3U4CitHZXRTdXBwb3J0ZWRXaXJlbGVzc01vZGU4MTg1KAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYKKykKK3sKKwl1OAkJCWJ0U3VwcG9ydGVkV2lyZWxlc3NNb2RlID0gMDsKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwlzd2l0Y2gocHJpdi0+cmZfY2hpcCkKKwl7CisJY2FzZSBSRl9aRUJSQTI6CisJY2FzZSBSRl9aRUJSQTQ6CisJCWJ0U3VwcG9ydGVkV2lyZWxlc3NNb2RlID0gKFdJUkVMRVNTX01PREVfQiB8IFdJUkVMRVNTX01PREVfRyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJ0U3VwcG9ydGVkV2lyZWxlc3NNb2RlID0gV0lSRUxFU1NfTU9ERV9COworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gYnRTdXBwb3J0ZWRXaXJlbGVzc01vZGU7Cit9CisKK3ZvaWQKK0FjdFVwZGF0ZUNoYW5uZWxBY2Nlc3NTZXR0aW5nKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJV0lSRUxFU1NfTU9ERQkJCVdpcmVsZXNzTW9kZSwKKwlQQ0hBTk5FTF9BQ0NFU1NfU0VUVElORwlDaG5sQWNjZXNzU2V0dGluZworCSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBwcml2LT5pZWVlODAyMTE7CisJQUNfQ09ESU5HCWVBQ0k7CisJQUNfUEFSQU0JQWNQYXJhbTsKKwkvL1BTVEFfUU9TCXBTdGFRb3MgPSBBZGFwdGVyLT5NZ250SW5mby5wU3RhUW9zOworCXU4CWJGb2xsb3dMZWdhY3lTZXR0aW5nID0gMDsKKwl1OCAgIHUxYkFJRlM7CisKKwkvLworCS8vIDxSSl9UT0RPXzgxODVCPgorCS8vIFRPRE86IFdlIHN0aWxsIGRvbid0IGtub3cgaG93IHRvIHNldCB1cCB0aGVzZSByZWdpc3RlcnMsIGp1c3QgZm9sbG93IFdNQUMgdG8KKwkvLyB2ZXJpZnkgODE4NUIgRlBBRy4KKwkvLworCS8vIDxSSl9UT0RPXzgxODVCPgorCS8vIEpvbmcgc2FpZCBDV21pbi9DV21heCByZWdpc3RlciBhcmUgbm90IGZ1bmN0aW9uYWwgaW4gODE4NUIsCisJLy8gc28gd2Ugc2hhbGwgZmlsbCBjaGFubmVsIGFjY2VzcyByZWFsdGVkIHJlZ2lzdGVyIGludG8gQUMgcGFyYW1ldGVyIHJlZ2lzdGVycywKKwkvLyBldmVuIGluIG5RQnNzLgorCS8vCisJQ2hubEFjY2Vzc1NldHRpbmctPlNJRlNfVGltZXIgPSAweDIyOyAvLyBTdWdnZXN0ZWQgYnkgSm9uZywgMjAwNS4xMi4wOC4KKwlDaG5sQWNjZXNzU2V0dGluZy0+RElGU19UaW1lciA9IDB4MUM7IC8vIDIwMDYuMDYuMDIsIGJ5IHJjbmprby4KKwlDaG5sQWNjZXNzU2V0dGluZy0+U2xvdFRpbWVUaW1lciA9IDk7IC8vIDIwMDYuMDYuMDIsIGJ5IHJjbmprby4KKwlDaG5sQWNjZXNzU2V0dGluZy0+RUlGU19UaW1lciA9IDB4NUI7IC8vIFN1Z2dlc3RlZCBieSB3Y2NodSwgaXQgaXMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgRUlGUyByZWdpc3RlciwgMjAwNS4xMi4wOC4KKwlDaG5sQWNjZXNzU2V0dGluZy0+Q1dtaW5JbmRleCA9IDM7IC8vIDIwMDYuMDYuMDIsIGJ5IHJjbmprby4KKwlDaG5sQWNjZXNzU2V0dGluZy0+Q1dtYXhJbmRleCA9IDc7IC8vIDIwMDYuMDYuMDIsIGJ5IHJjbmprby4KKworCXdyaXRlX25pY19ieXRlKGRldiwgU0lGUywgQ2hubEFjY2Vzc1NldHRpbmctPlNJRlNfVGltZXIpOworCS8vQWRhcHRlci0+SGFsRnVuYy5TZXRId1JlZ0hhbmRsZXIoIEFkYXB0ZXIsIEhXX1ZBUl9TTE9UX1RJTUUsICZDaG5sQWNjZXNzU2V0dGluZy0+U2xvdFRpbWVUaW1lciApOwkvLyBSZXdyaXRlZCBmcm9tIGRpcmVjdGx5IHVzZSBQbGF0Zm9ybUVGSU9Xcml0ZTFCeXRlKCksIGJ5IEFubmllLCAyMDA2LTAzLTI5LgorCXdyaXRlX25pY19ieXRlKGRldiwgU0xPVCwgQ2hubEFjY2Vzc1NldHRpbmctPlNsb3RUaW1lVGltZXIpOwkvLyBSZXdyaXRlZCBmcm9tIGRpcmVjdGx5IHVzZSBQbGF0Zm9ybUVGSU9Xcml0ZTFCeXRlKCksIGJ5IEFubmllLCAyMDA2LTAzLTI5LgorCisJdTFiQUlGUyA9IGFTaWZzVGltZSArICgyICogQ2hubEFjY2Vzc1NldHRpbmctPlNsb3RUaW1lVGltZXIgKTsKKworCS8vd3JpdGVfbmljX2J5dGUoZGV2LCBBQ19WT19QQVJBTSwgdTFiQUlGUyk7CisJLy93cml0ZV9uaWNfYnl0ZShkZXYsIEFDX1ZJX1BBUkFNLCB1MWJBSUZTKTsKKwkvL3dyaXRlX25pY19ieXRlKGRldiwgQUNfQkVfUEFSQU0sIHUxYkFJRlMpOworCS8vd3JpdGVfbmljX2J5dGUoZGV2LCBBQ19CS19QQVJBTSwgdTFiQUlGUyk7CisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIEVJRlMsIENobmxBY2Nlc3NTZXR0aW5nLT5FSUZTX1RpbWVyKTsKKworCXdyaXRlX25pY19ieXRlKGRldiwgQWNrVGltZU91dFJlZywgMHg1Qik7IC8vIDxSSl9FWFBSX1FPUz4gU3VnZ2VzdGVkIGJ5IHdjY2h1LCBpdCBpcyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBFSUZTIHJlZ2lzdGVyLCAyMDA1LjEyLjA4LgorCisjaWZkZWYgVE9ETworCS8vIDxSSl9UT0RPX05PV184MTg1Qj4gVXBkYXRlIEVDV21pbi9FQ1dtYXgsIEFJRlMsIFRYT1AgTGltaXQgb2YgZWFjaCBBQyB0byB0aGUgdmFsdWUgZGVmaW5lZCBieSBTUEVDLgorCWlmKCBwU3RhUW9zLT5DdXJyZW50UW9zTW9kZSA+IFFPU19ESVNBQkxFICkKKwl7IC8vIFFvUyBtb2RlLgorCQlpZihwU3RhUW9zLT5RQnNzV2lyZWxlc3NNb2RlID09IFdpcmVsZXNzTW9kZSkKKwkJeworCQkJLy8gRm9sbG93IEFDIFBhcmFtZXRlcnMgb2YgdGhlIFFCU1MuCisJCQlmb3IoZUFDSSA9IDA7IGVBQ0kgPCBBQ19NQVg7IGVBQ0krKykKKwkJCXsKKwkJCQlBZGFwdGVyLT5IYWxGdW5jLlNldEh3UmVnSGFuZGxlcihBZGFwdGVyLCBIV19WQVJfQUNfUEFSQU0sIChwdTFCeXRlKSgmKHBTdGFRb3MtPldNTVBhcmFtRWxlLkFjUGFyYW1bZUFDSV0pKSApOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJLy8gRm9sbG93IERlZmF1bHQgV01NIEFDIFBhcmFtZXRlcnMuCisJCQliRm9sbG93TGVnYWN5U2V0dGluZyA9IDE7CisJCX0KKwl9CisJZWxzZQorI2VuZGlmCisJeyAvLyBMZWdhY3kgODAyLjExLgorCQliRm9sbG93TGVnYWN5U2V0dGluZyA9IDE7CisKKwl9CisKKwkvLyB0aGlzIHNldHRpbmcgaXMgY29waWVkIGZyb20gcnRsODE4N0IuICB4aW9uZy0yMDA2LTExLTEzCisJaWYoYkZvbGxvd0xlZ2FjeVNldHRpbmcpCisJeworCisKKwkJLy8KKwkJLy8gRm9sbG93IDgwMi4xMSBzZWV0aW5nIHRvIEFDIHBhcmFtZXRlciwgYWxsIEFDIHNoYWxsIHVzZSB0aGUgc2FtZSBwYXJhbWV0ZXIuCisJCS8vIDIwMDUuMTIuMDEsIGJ5IHJjbmprby4KKwkJLy8KKwkJQWNQYXJhbS5sb25nRGF0YSA9IDA7CisJCUFjUGFyYW0uZi5BY2lBaWZzbi5mLkFJRlNOID0gMjsgLy8gRm9sbG93IDgwMi4xMSBESUZTLgorCQlBY1BhcmFtLmYuQWNpQWlmc24uZi5BQ00gPSAwOworCQlBY1BhcmFtLmYuRWN3LmYuRUNXbWluID0gQ2hubEFjY2Vzc1NldHRpbmctPkNXbWluSW5kZXg7IC8vIEZvbGxvdyA4MDIuMTEgQ1dtaW4uCisJCUFjUGFyYW0uZi5FY3cuZi5FQ1dtYXggPSBDaG5sQWNjZXNzU2V0dGluZy0+Q1dtYXhJbmRleDsgLy8gRm9sbG93IDgwMi4xMSBDV21heC4KKwkJQWNQYXJhbS5mLlRYT1BMaW1pdCA9IDA7CisKKwkJLy9sem0gcmVzZXJ2ZWQgMDgwODI2CisjaWYgMQorI2lmZGVmIFRIT01BU19UVVJCTworCQkvLyBGb3IgdHVyYm8gbW9kZSBzZXR0aW5nLiBwb3J0IGZyb20gODdCIGJ5IElzYWlhaCAyMDA4LTA4LTAxCisJCWlmKCBpZWVlLT5jdXJyZW50X25ldHdvcmsuVHVyYm9fRW5hYmxlID09IDEgKQorCQkJQWNQYXJhbS5mLlRYT1BMaW1pdCA9IDB4MDFGRjsKKyNlbmRpZgorCQkvLyBGb3IgODdTRSB3aXRoIEludGVsIDQ5NjUgIEFkLUhvYyBtb2RlIGhhdmUgcG9vciB0aHJvdWdocHV0ICgxOU1CKQorCQlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKQorCQkJQWNQYXJhbS5mLlRYT1BMaW1pdCA9IDB4MDAyMDsKKyNlbmRpZgorCisJCWZvcihlQUNJID0gMDsgZUFDSSA8IEFDX01BWDsgZUFDSSsrKQorCQl7CisJCQlBY1BhcmFtLmYuQWNpQWlmc24uZi5BQ0kgPSAodTgpZUFDSTsKKwkJCXsKKwkJCQlQQUNfUEFSQU0JcEFjUGFyYW0gPSAoUEFDX1BBUkFNKSgmQWNQYXJhbSk7CisJCQkJQUNfQ09ESU5HCWVBQ0k7CisJCQkJdTgJCXUxYkFJRlM7CisJCQkJdTMyCQl1NGJBY1BhcmFtOworCisJCQkJLy8gUmV0cml2ZSBwYXJhbXRlcnMgdG8gdWRwYXRlLgorCQkJCWVBQ0kgPSBwQWNQYXJhbS0+Zi5BY2lBaWZzbi5mLkFDSTsKKwkJCQl1MWJBSUZTID0gcEFjUGFyYW0tPmYuQWNpQWlmc24uZi5BSUZTTiAqIENobmxBY2Nlc3NTZXR0aW5nLT5TbG90VGltZVRpbWVyICsgYVNpZnNUaW1lOworCQkJCXU0YkFjUGFyYW0gPSAoCSgoKHUzMikocEFjUGFyYW0tPmYuVFhPUExpbWl0KSkgPDwgQUNfUEFSQU1fVFhPUF9MSU1JVF9PRkZTRVQpCXwKKwkJCQkJCSgoKHUzMikocEFjUGFyYW0tPmYuRWN3LmYuRUNXbWF4KSkgPDwgQUNfUEFSQU1fRUNXX01BWF9PRkZTRVQpCXwKKwkJCQkJCSgoKHUzMikocEFjUGFyYW0tPmYuRWN3LmYuRUNXbWluKSkgPDwgQUNfUEFSQU1fRUNXX01JTl9PRkZTRVQpCXwKKwkJCQkJCSgoKHUzMil1MWJBSUZTKSA8PCBBQ19QQVJBTV9BSUZTX09GRlNFVCkpOworCisJCQkJc3dpdGNoKGVBQ0kpCisJCQkJeworCQkJCQljYXNlIEFDMV9CSzoKKwkJCQkJCS8vd3JpdGVfbmljX2R3b3JkKGRldiwgQUNfQktfUEFSQU0sIHU0YkFjUGFyYW0pOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBBQzBfQkU6CisJCQkJCQkvL3dyaXRlX25pY19kd29yZChkZXYsIEFDX0JFX1BBUkFNLCB1NGJBY1BhcmFtKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgQUMyX1ZJOgorCQkJCQkJLy93cml0ZV9uaWNfZHdvcmQoZGV2LCBBQ19WSV9QQVJBTSwgdTRiQWNQYXJhbSk7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIEFDM19WTzoKKwkJCQkJCS8vd3JpdGVfbmljX2R3b3JkKGRldiwgQUNfVk9fUEFSQU0sIHU0YkFjUGFyYW0pOworCQkJCQkJYnJlYWs7CisKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCURNRVNHVyggIlNldEh3UmVnODE4NSgpOiBpbnZhbGlkIEFDSTogJWQgIVxuIiwgZUFDSSk7CisJCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvLyBDZWhjayBBQ00gYml0LgorCQkJCS8vIElmIGl0IGlzIHNldCwgaW1tZWRpYXRlbHkgc2V0IEFDTSBjb250cm9sIGJpdCB0byBkb3duZ3JhZGluZyBBQyBmb3IgcGFzc2luZyBXTU0gdGVzdHBsYW4uIEFubmllLCAyMDA1LTEyLTEzLgorCQkJCS8vd3JpdGVfbmljX2J5dGUoZGV2LCBBQ01fQ09OVFJPTCwgcEFjUGFyYW0tPmYuQWNpQWlmc24pOworCQkJCXsKKwkJCQkJUEFDSV9BSUZTTglwQWNpQWlmc24gPSAoUEFDSV9BSUZTTikoJnBBY1BhcmFtLT5mLkFjaUFpZnNuKTsKKwkJCQkJQUNfQ09ESU5HCWVBQ0kgPSBwQWNpQWlmc24tPmYuQUNJOworCisJCQkJCS8vbW9kaWZpZWQgSm9zZXBoCisJCQkJCS8vZm9yIDgxODdCIEFzeW5JT1JlYWQgaXNzdWUKKyNpZmRlZiBUT0RPCisJCQkJCXU4CUFjbUN0cmwgPSBwSGFsRGF0YS0+QWNtQ29udHJvbDsKKyNlbHNlCisJCQkJCXU4CUFjbUN0cmwgPSAwOworI2VuZGlmCisJCQkJCWlmKCBwQWNpQWlmc24tPmYuQUNNICkKKwkJCQkJeyAvLyBBQ00gYml0IGlzIDEuCisJCQkJCQlzd2l0Y2goZUFDSSkKKwkJCQkJCXsKKwkJCQkJCQljYXNlIEFDMF9CRToKKwkJCQkJCQkJQWNtQ3RybCB8PSAoQkVRX0FDTV9FTnxCRVFfQUNNX0NUTHxBQ01fSFdfRU4pOwkvLyBvciAweDIxCisJCQkJCQkJCWJyZWFrOworCisJCQkJCQkJY2FzZSBBQzJfVkk6CisJCQkJCQkJCUFjbUN0cmwgfD0gKFZJUV9BQ01fRU58VklRX0FDTV9DVEx8QUNNX0hXX0VOKTsJLy8gb3IgMHg0MgorCQkJCQkJCQlicmVhazsKKworCQkJCQkJCWNhc2UgQUMzX1ZPOgorCQkJCQkJCQlBY21DdHJsIHw9IChWT1FfQUNNX0VOfFZPUV9BQ01fQ1RMfEFDTV9IV19FTik7CS8vIG9yIDB4ODQKKwkJCQkJCQkJYnJlYWs7CisKKwkJCQkJCQlkZWZhdWx0OgorCQkJCQkJCQlETUVTR1coIlNldEh3UmVnODE4NSgpOiBbSFdfVkFSX0FDTV9DVFJMXSBBQ00gc2V0IGZhaWxlZDogZUFDSSBpcyAlZFxuIiwgZUFDSSApOworCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsgLy8gQUNNIGJpdCBpcyAwLgorCQkJCQkJc3dpdGNoKGVBQ0kpCisJCQkJCQl7CisJCQkJCQkJY2FzZSBBQzBfQkU6CisJCQkJCQkJCUFjbUN0cmwgJj0gKCAofkJFUV9BQ01fRU4pICYgKH5CRVFfQUNNX0NUTCkgJiAofkFDTV9IV19FTikgKTsJLy8gYW5kIDB4REUKKwkJCQkJCQkJYnJlYWs7CisKKwkJCQkJCQljYXNlIEFDMl9WSToKKwkJCQkJCQkJQWNtQ3RybCAmPSAoICh+VklRX0FDTV9FTikgJiAoflZJUV9BQ01fQ1RMKSAmICh+QUNNX0hXX0VOKSApOwkvLyBhbmQgMHhCRAorCQkJCQkJCQlicmVhazsKKworCQkJCQkJCWNhc2UgQUMzX1ZPOgorCQkJCQkJCQlBY21DdHJsICY9ICggKH5WT1FfQUNNX0VOKSAmICh+Vk9RX0FDTV9DVEwpICYgKH5BQ01fSFdfRU4pICk7CS8vIGFuZCAweDdCCisJCQkJCQkJCWJyZWFrOworCisJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQkvL3ByaW50ayhLRVJOX1dBUk5JTkcgIlNldEh3UmVnODE4NSgpOiBbSFdfVkFSX0FDTV9DVFJMXSBXcml0ZSAweCVYXG4iLCBBY21DdHJsKTsKKworI2lmZGVmIFRPX0RPCisJCQkJCXBIYWxEYXRhLT5BY21Db250cm9sID0gQWNtQ3RybDsKKyNlbmRpZgorCQkJCQkvL3dyaXRlX25pY19ieXRlKGRldiwgQUNNX0NPTlRST0wsIEFjbUN0cmwpOworCQkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEFDTV9DT05UUk9MLCAwKTsKKwkJCQl9CisJCQl9CisJCX0KKworCisJfQorfQorCit2b2lkCitBY3RTZXRXaXJlbGVzc01vZGU4MTg1KAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdTgJCQkJYnRXaXJlbGVzc01vZGUKKwkpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gcHJpdi0+aWVlZTgwMjExOworCS8vUE1HTlRfSU5GTwkJcE1nbnRJbmZvID0gJihBZGFwdGVyLT5NZ250SW5mbyk7CisJdTgJYnRTdXBwb3J0ZWRXaXJlbGVzc01vZGUgPSBHZXRTdXBwb3J0ZWRXaXJlbGVzc01vZGU4MTg1KGRldik7CisKKwlpZiggKGJ0V2lyZWxlc3NNb2RlICYgYnRTdXBwb3J0ZWRXaXJlbGVzc01vZGUpID09IDAgKQorCXsgLy8gRG9uJ3Qgc3dpdGNoIHRvIHVuc3VwcG9ydGVkIHdpcmVsZXNzIG1vZGUsIDIwMDYuMDIuMTUsIGJ5IHJjbmprby4KKwkJRE1FU0dXKCJBY3RTZXRXaXJlbGVzc01vZGU4MTg1KCk6IFdpcmVsZXNzTW9kZSglZCkgaXMgbm90IHN1cHBvcnRlZCAoJWQpIVxuIiwKKwkJCWJ0V2lyZWxlc3NNb2RlLCBidFN1cHBvcnRlZFdpcmVsZXNzTW9kZSk7CisJCXJldHVybjsKKwl9CisKKwkvLyAxLiBBc3NpZ24gd2lyZWxlc3MgbW9kZSB0byBzd3RpY2ggaWYgbmVjZXNzYXJ5LgorCWlmIChidFdpcmVsZXNzTW9kZSA9PSBXSVJFTEVTU19NT0RFX0FVVE8pCisJeworCQlpZigoYnRTdXBwb3J0ZWRXaXJlbGVzc01vZGUgJiBXSVJFTEVTU19NT0RFX0EpKQorCQl7CisJCQlidFdpcmVsZXNzTW9kZSA9IFdJUkVMRVNTX01PREVfQTsKKwkJfQorCQllbHNlIGlmKChidFN1cHBvcnRlZFdpcmVsZXNzTW9kZSAmIFdJUkVMRVNTX01PREVfRykpCisJCXsKKwkJCWJ0V2lyZWxlc3NNb2RlID0gV0lSRUxFU1NfTU9ERV9HOworCQl9CisJCWVsc2UgaWYoKGJ0U3VwcG9ydGVkV2lyZWxlc3NNb2RlICYgV0lSRUxFU1NfTU9ERV9CKSkKKwkJeworCQkJYnRXaXJlbGVzc01vZGUgPSBXSVJFTEVTU19NT0RFX0I7CisJCX0KKwkJZWxzZQorCQl7CisJCQlETUVTR1coIkFjdFNldFdpcmVsZXNzTW9kZTgxODUoKTogTm8gdmFsaWQgd2lyZWxlc3MgbW9kZSBzdXBwb3J0ZWQsIGJ0U3VwcG9ydGVkV2lyZWxlc3NNb2RlKCV4KSEhIVxuIiwKKwkJCQkJIGJ0U3VwcG9ydGVkV2lyZWxlc3NNb2RlKTsKKwkJCWJ0V2lyZWxlc3NNb2RlID0gV0lSRUxFU1NfTU9ERV9COworCQl9CisJfQorCisKKwkvLyAyLiBTd3RpY2ggYmFuZDogUkYgb3IgQkIgc3BlY2lmaWMgYWN0aW9ucywKKwkvLyBmb3IgZXhhbXBsZSwgcmVmcmVzaCB0YWJsZXMgaW4gb21jODI1NSwgb3IgY2hhbmdlIGluaXRpYWwgZ2FpbiBpZiBuZWNlc3NhcnkuCisJc3dpdGNoKHByaXYtPnJmX2NoaXApCisJeworCWNhc2UgUkZfWkVCUkEyOgorCWNhc2UgUkZfWkVCUkE0OgorCQl7CisJCQkvLyBOb3RoaW5nIHRvIGRvIGZvciBaZWJyYSB0byBzd2l0Y2ggYmFuZC4KKwkJCS8vIFVwZGF0ZSBjdXJyZW50IHdpcmVsZXNzIG1vZGUgaWYgd2Ugc3d0aWNoIHRvIHNwZWNpZmllZCBiYW5kIHN1Y2Nlc3NmdWxseS4KKwkJCWllZWUtPm1vZGUgPSAoV0lSRUxFU1NfTU9ERSlidFdpcmVsZXNzTW9kZTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCURNRVNHVygiQWN0U2V0V2lyZWxlc3NNb2RlODE4NSgpOiB1bnN1cHBvcnRlZCBSRjogMHglWCAhISFcbiIsIHByaXYtPnJmX2NoaXApOworCQlicmVhazsKKwl9CisKKwkvLyAzLiBDaGFuZ2UgcmVsYXRlZCBzZXR0aW5nLgorCWlmKCBpZWVlLT5tb2RlID09IFdJUkVMRVNTX01PREVfQSApeworCQlETUVTRygiV0lSRUxFU1NfTU9ERV9BXG4iKTsKKwl9CisJZWxzZSBpZiggaWVlZS0+bW9kZSA9PSBXSVJFTEVTU19NT0RFX0IgKXsKKwkJRE1FU0coIldJUkVMRVNTX01PREVfQlxuIik7CisJfQorCWVsc2UgaWYoIGllZWUtPm1vZGUgPT0gV0lSRUxFU1NfTU9ERV9HICl7CisJCURNRVNHKCJXSVJFTEVTU19NT0RFX0dcbiIpOworCX0KKworCUFjdFVwZGF0ZUNoYW5uZWxBY2Nlc3NTZXR0aW5nKCBkZXYsIGllZWUtPm1vZGUsICZwcml2LT5DaGFubmVsQWNjZXNzU2V0dGluZyk7Cit9CisKK3ZvaWQgcnRsODE4NWJfaXJxX2VuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXByaXYtPmlycV9lbmFibGVkID0gMTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBJTVIsIHByaXYtPkludHJNYXNrKTsKK30KKy8vYnkgYW15IGZvciBwb3dlciBzYXZlCit2b2lkCitEcnZJRkluZGljYXRlRGlzYXNzb2NpYXRpb24oCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl1MTYJCQlyZWFzb24KKwkpCit7CisJLy9wcmludGsoIj09PiBEcnZJRkluZGljYXRlRGlzYXNzb2NpYXRpb24oKVxuIik7CisKKwkvLyBub3RoaW5nIGlzIG5lZWRlZCBhZnRlciBkaXNhc3NvY2lhdGlvbiByZXF1ZXN0LgorCisJLy9wcmludGsoIjw9PSBEcnZJRkluZGljYXRlRGlzYXNzb2NpYXRpb24oKVxuIik7Cit9Cit2b2lkCitNZ250RGlzY29ubmVjdElCU1MoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldgorKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1OAkJCWk7CisKKwkvL3ByaW50aygiWFhYWFhYWFhYWCBNZ250RGlzY29ubmVjdCBJQlNTXG4iKTsKKworCURydklGSW5kaWNhdGVEaXNhc3NvY2lhdGlvbihkZXYsIHVuc3BlY19yZWFzb24pOworCisvLwlQbGF0Zm9ybVplcm9NZW1vcnkoIHBNZ250SW5mby0+QnNzaWQsIDYgKTsKKwlmb3IoaT0wO2k8NjtpKyspICBwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5ic3NpZFtpXSA9IDB4NTU7CisKKwlwcml2LT5pZWVlODAyMTEtPnN0YXRlID0gSUVFRTgwMjExX05PTElOSzsKKworCS8vU3RvcCBCZWFjb24uCisKKwkvLyBWaXN0YSBhZGQgYSBBZGhvYyBwcm9maWxlLCBIVyByYWRpbyBvZmYgdW50aWxsIE9JRF9ET1QxMV9SRVNFVF9SRVFVRVNUCisJLy8gRHJpdmVyIHdvdWxkIHNldCBNU1I9Tk9fTElOSywgdGhlbiBIVyBSYWRpbyBPTiwgTWdudFF1ZXVlIFN0dWNrLgorCS8vIEJlY2F1c2UgQmNuIERNQSBpc24ndCBjb21wbGV0ZSwgbWdudCBxdWV1ZSB3b3VsZCBzdHVjayB1bnRpbCBCY24gcGFja2V0IHNlbmQuCisKKwkvLyBEaXNhYmxlIEJlYWNvbiBRdWV1ZSBPd24gYml0LCBzdWdnZXN0ZWQgYnkgam9uZworLy8JQWRhcHRlci0+SGFsRnVuYy5TZXRUeERlc2NPV05IYW5kbGVyKEFkYXB0ZXIsIEJFQUNPTl9RVUVVRSwgMCwgMCk7CisJaWVlZTgwMjExX3N0b3Bfc2VuZF9iZWFjb25zKHByaXYtPmllZWU4MDIxMSk7CisKKwlwcml2LT5pZWVlODAyMTEtPmxpbmtfY2hhbmdlKGRldik7CisJbm90aWZ5X3d4X2Fzc29jX2V2ZW50KHByaXYtPmllZWU4MDIxMSk7CisKKwkvLyBTdG9wIFNXIEJlYWNvbi5Vc2UgaHcgYmVhY29uIHNvIGRvIG5vdCBuZWVkIHRvIGRvIHNvLmJ5IGFteQorI2lmIDAKKwlpZihwTWdudEluZm8tPmJFbmFibGVTd0JlYWNvblRpbWVyKQorCXsKKwkJLy8gU3dCZWFjb25UaW1lciB3aWxsIHN0b3AgaWYgcE1nbnRJbmZvLT5tSWJzcz09RkFMU0UsIHNlZSBTd0JlYWNvbkNhbGxiYWNrKCkgZm9yIGRldGFpbHMuCisvLyBjb21tZW50IG91dCBieSBoYWljaCwgMjAwNy4xMC4wMQorLy8jaWYgREVWX0JVU19UWVBFPT1VU0JfSU5URVJGQUNFCisJCVBsYXRmb3JtQ2FuY2VsVGltZXIoIEFkYXB0ZXIsICZwTWdudEluZm8tPlN3QmVhY29uVGltZXIpOworLy8jZW5kaWYKKwl9CisjZW5kaWYKKworLy8JCU1nbnRJbmRpY2F0ZU1lZGlhU3RhdHVzKCBBZGFwdGVyLCBSVF9NRURJQV9ESVNDT05ORUNULCBHRU5FUkFMX0lORElDQVRFICk7CisKK30KK3ZvaWQKK01sbWVEaXNhc3NvY2lhdGVSZXF1ZXN0KAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdTgqCQkJYXNTdGEsCisJdTgJCQlhc1JzbgorCSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJdTggaTsKKworCVNlbmREaXNhc3NvY2lhdGlvbihwcml2LT5pZWVlODAyMTEsIGFzU3RhLCBhc1JzbiApOworCisJaWYoIG1lbWNtcChwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgYXNTdGEsIDYgKSA9PSAwICl7CisJCS8vU2h1Q2hlbiBUT0RPOiBjaGFuZ2UgbWVkaWEgc3RhdHVzLgorCQkvL1NodUNoZW4gVE9ETzogV2hhdCB0byBkbyB3aGVuIGRpc2Fzc29jaWF0ZS4KKwkJRHJ2SUZJbmRpY2F0ZURpc2Fzc29jaWF0aW9uKGRldiwgdW5zcGVjX3JlYXNvbik7CisKKworCS8vCXBNZ250SW5mby0+QXNvY1RpbWVzdGFtcCA9IDA7CisJCWZvcihpPTA7aTw2O2krKykgIHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkW2ldID0gMHgyMjsKKy8vCQlwTWdudEluZm8tPm1CcmF0ZXMuTGVuZ3RoID0gMDsKKy8vCQlBZGFwdGVyLT5IYWxGdW5jLlNldEh3UmVnSGFuZGxlciggQWRhcHRlciwgSFdfVkFSX0JBU0lDX1JBVEUsIChwdTFCeXRlKSgmcE1nbnRJbmZvLT5tQnJhdGVzKSApOworCisJCWllZWU4MDIxMV9kaXNhc3NvY2lhdGUocHJpdi0+aWVlZTgwMjExKTsKKworCisJfQorCit9CisKK3ZvaWQKK01nbnREaXNjb25uZWN0QVAoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl1OAkJCWFzUnNuCispCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisvLworLy8gQ29tbWVudGVkIG91dCBieSByY25qa28sIDIwMDUuMDEuMjc6CisvLyBJIG1vdmUgU2VjQ2xlYXJBbGxLZXlzKCkgdG8gTWdudEFjdFNldF84MDJfMTFfRElTQVNTT0NJQVRFKCkuCisvLworLy8JLy8yMDA0LzA5LzE1LCBrY3d1LCB0aGUga2V5IHNob3VsZCBiZSBjbGVhcmVkLCBvciB0aGUgbmV3IGhhbmRzaGFraW5nIHdpbGwgbm90IHN1Y2Nlc3MKKy8vCVNlY0NsZWFyQWxsS2V5cyhBZGFwdGVyKTsKKworCS8vIEluIFdQQSBXUEEyIG5lZWQgdG8gQ2xlYXIgYWxsIGtleSAuLi4gYmVjYXVzZSBuZXcga2V5IHdpbGwgc2V0IGFmdGVyIG5ldyBoYW5kc2hha2luZy4KKyNpZmRlZiBUT0RPCisJaWYoICAgcE1nbnRJbmZvLT5TZWN1cml0eUluZm8uQXV0aE1vZGUgPiBSVF84MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2ggfHwKKwkJKHBNZ250SW5mby0+YkFQU3Vwb3J0Q0NLTSAmJiBwTWdudEluZm8tPmJDQ1g4MDIxeGVuYWJsZSkgKSAgLy8gSW4gQ0NLTSBtb2RlIHdpbGwgQ2xlYXIga2V5CisJeworCQlTZWNDbGVhckFsbEtleXMoQWRhcHRlcik7CisJCVJUX1RSQUNFKENPTVBfU0VDLCBEQkdfTE9VRCwoIj09PT09PT5DQ0tNIGNsZWFyIGtleS4uLiIpKQorCX0KKyNlbmRpZgorCS8vIDIwMDQuMTAuMTEsIGJ5IHJjbmprby4KKwkvL01sbWVEaXNhc3NvY2lhdGVSZXF1ZXN0KCBBZGFwdGVyLCBwTWdudEluZm8tPkJzc2lkLCBkaXNhc19sdl9zcyApOworCU1sbWVEaXNhc3NvY2lhdGVSZXF1ZXN0KCBkZXYsIHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBhc1JzbiApOworCisJcHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9IElFRUU4MDIxMV9OT0xJTks7CisvLwlwTWdudEluZm8tPkFzb2NUaW1lc3RhbXAgPSAwOworfQorYm9vbAorTWdudERpc2Nvbm5lY3QoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl1OAkJCWFzUnNuCispCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCS8vCisJLy8gU2NoZWR1bGUgYW4gd29ya2l0ZW0gdG8gd2FrZSB1cCBmb3IgcHMgbW9kZSwgMDcwMTA5LCBieSByY25qa28uCisJLy8KKyNpZmRlZiBUT0RPCisJaWYocE1nbnRJbmZvLT5tUHNzICE9IGVBd2FrZSkKKwl7CisJCS8vCisJCS8vIFVzaW5nIEF3a2FlVGltZXIgdG8gcHJldmVudCBtaXNtYXRjaCBwcyBzdGF0ZS4KKwkJLy8gSW4gdGhlIHRpbWVyIHRoZSBzdGF0ZSB3aWxsIGJlIGNoYW5nZWQgYWNjb3JkaW5nIHRvIHRoZSBSRiBpcyBiZWluZyBhd29rZSBvciBub3QuIEJ5IEJydWNlLCAyMDA3LTEwLTMxLgorCQkvLworCQkvLyBQbGF0Zm9ybVNjaGVkdWxlV29ya0l0ZW0oICYocE1nbnRJbmZvLT5Bd2FrZVdvcmtJdGVtKSApOworCQlQbGF0Zm9ybVNldFRpbWVyKCBBZGFwdGVyLCAmKHBNZ250SW5mby0+QXdha2VUaW1lciksIDAgKTsKKwl9CisjZW5kaWYKKworCS8vIEluZGljYXRpb24gb2YgZGlzYXNzb2NpYXRpb24gZXZlbnQuCisJLy9EcnZJRkluZGljYXRlRGlzYXNzb2NpYXRpb24oQWRhcHRlciwgYXNSc24pOworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwlpZihJU19ET1QxMURfRU5BQkxFKHByaXYtPmllZWU4MDIxMSkpCisJCURvdDExZF9SZXNldChwcml2LT5pZWVlODAyMTEpOworI2VuZGlmCisJLy8gSW4gYWRob2MgbW9kZSwgdXBkYXRlIGJlYWNvbiBmcmFtZS4KKwlpZiggcHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEICkKKwl7CisJCWlmKCBwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQyApCisJCXsKKy8vCQkJUlRfVFJBQ0UoQ09NUF9NTE1FLCBEQkdfTE9VRCwgKCJNZ250RGlzY29ubmVjdCgpID09PT4gTWdudERpc2Nvbm5lY3RJQlNTXG4iKSk7CisJCQkvL3ByaW50aygiTWdudERpc2Nvbm5lY3QoKSA9PT0+IE1nbnREaXNjb25uZWN0SUJTU1xuIik7CisJCQlNZ250RGlzY29ubmVjdElCU1MoZGV2KTsKKwkJfQorCQlpZiggcHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfSU5GUkEgKQorCQl7CisJCQkvLyBXZSBjbGVhciBrZXkgaGVyZSBpbnN0ZWFkIG9mIE1nbnREaXNjb25uZWN0QVAoKSBiZWNhdXNlIHRoYXQKKwkJCS8vIE1nbnRBY3RTZXRfODAyXzExX0RJU0FTU09DSUFURSgpIGlzIGFuIGludGVyZmFjZSBjYWxsZWQgYnkgT1MsCisJCQkvLyBlLmcuIE9JRF84MDJfMTFfRElTQVNTT0NJQVRFIGluIFdpbmRvd3Mgd2hpbGUgYXMgTWdudERpc2Nvbm5lY3RBUCgpIGlzCisJCQkvLyB1c2VkIHRvIGhhbmRsZSBkaXNhc3NvY2lhdGlvbiByZWxhdGVkIHRoaW5ncyB0byBBUCwgZS5nLiBzZW5kIERpc2Fzc29jCisJCQkvLyBmcmFtZSB0byBBUC4gIDIwMDUuMDEuMjcsIGJ5IHJjbmprby4KKy8vCQkJU2VjQ2xlYXJBbGxLZXlzKEFkYXB0ZXIpOworCisvLwkJCVJUX1RSQUNFKENPTVBfTUxNRSwgREJHX0xPVUQsICgiTWdudERpc2Nvbm5lY3QoKSA9PT0+IE1nbnREaXNjb25uZWN0QVBcbiIpKTsKKwkJCS8vcHJpbnRrKCJNZ250RGlzY29ubmVjdCgpID09PT4gTWdudERpc2Nvbm5lY3RBUFxuIik7CisJCQlNZ250RGlzY29ubmVjdEFQKGRldiwgYXNSc24pOworCQl9CisKKwkJLy8gSW5pZGljYXRlIERpc2Nvbm5lY3QsIDIwMDUuMDIuMjMsIGJ5IHJjbmprby4KKy8vCQlNZ250SW5kaWNhdGVNZWRpYVN0YXR1cyggQWRhcHRlciwgUlRfTUVESUFfRElTQ09OTkVDVCwgR0VORVJBTF9JTkRJQ0FURSk7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisvLworLy8JRGVzY3JpcHRpb246CisvLwkJQ2hhbmcgUkYgUG93ZXIgU3RhdGUuCisvLwkJTm90ZSB0aGF0LCBvbmx5IE1nbnRBY3RTZXRfUkZfU3RhdGUoKSBpcyBhbGxvd2VkIHRvIHNldCBIV19WQVJfUkZfU1RBVEUuCisvLworLy8JQXNzdW1wdGlvbjoKKy8vCQlQQVNTSVZFIExFVkVMLgorLy8KK2Jvb2wKK1NldFJGUG93ZXJTdGF0ZSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCVJUX1JGX1BPV0VSX1NUQVRFCWVSRlBvd2VyU3RhdGUKKwkpCit7CisJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTgwX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCWJvb2wJCQliUmVzdWx0ID0gZmFsc2U7CisKKy8vCXByaW50aygiLS0tLS0tLS0tPiBTZXRSRlBvd2VyU3RhdGUoKTogZVJGUG93ZXJTdGF0ZSglZClcbiIsIGVSRlBvd2VyU3RhdGUpOworCWlmKGVSRlBvd2VyU3RhdGUgPT0gcHJpdi0+ZVJGUG93ZXJTdGF0ZSkKKwl7CisvLwkJcHJpbnRrKCI8LS0tLS0tLS0tIFNldFJGUG93ZXJTdGF0ZSgpOiBkaXNjYXJkIHRoZSByZXF1ZXN0IGZvciBlUkZQb3dlclN0YXRlKCVkKSBpcyB0aGUgc2FtZS5cbiIsIGVSRlBvd2VyU3RhdGUpOworCQlyZXR1cm4gYlJlc3VsdDsKKwl9CisKKwlzd2l0Y2gocHJpdi0+cmZfY2hpcCkKKwl7CisJCWNhc2UgUkZfWkVCUkEyOgorCQljYXNlIFJGX1pFQlJBNDoKKwkJCSBiUmVzdWx0ID0gU2V0WmVicmFSRlBvd2VyU3RhdGU4MTg1KGRldiwgZVJGUG93ZXJTdGF0ZSk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcHJpbnRrKCJTZXRSRlBvd2VyU3RhdGU4MTg1KCk6IHVua25vd24gUkZDaGlwSUQ6IDB4JVghISFcbiIsIHByaXYtPnJmX2NoaXApOworCQkJYnJlYWs7OworfQorLy8JcHJpbnRrKCI8LS0tLS0tLS0tIFNldFJGUG93ZXJTdGF0ZSgpOiBiUmVzdWx0KCVkKVxuIiwgYlJlc3VsdCk7CisKKwlyZXR1cm4gYlJlc3VsdDsKK30KK3ZvaWQKK0hhbEVuYWJsZVJ4ODE4NUR1bW15KAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYKKwkpCit7Cit9Cit2b2lkCitIYWxEaXNhYmxlUng4MTg1RHVtbXkoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldgorCSkKK3sKK30KKworYm9vbAorTWdudEFjdFNldF9SRl9TdGF0ZSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCVJUX1JGX1BPV0VSX1NUQVRFCVN0YXRlVG9TZXQsCisJdTMyCUNoYW5nZVNvdXJjZQorCSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJYm9vbAkJCQliQWN0aW9uQWxsb3dlZCA9IGZhbHNlOworCWJvb2wJCQkJYkNvbm5lY3RCeVNTSUQgPSBmYWxzZTsKKwlSVF9SRl9QT1dFUl9TVEFURSAJcnRTdGF0ZTsKKwl1MTYJCQkJUkZXYWl0Q291bnRlciA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnOworLy8JIHByaW50aygiPT09Pk1nbnRBY3RTZXRfUkZfU3RhdGUoKTogU3RhdGVUb1NldCglZCksIENoYW5nZVNvdXJjZSgweCV4KVxuIixTdGF0ZVRvU2V0LCBDaGFuZ2VTb3VyY2UpOworCS8vCisJLy8gUHJldmVudCB0aGUgcmFjZSBjb25kaXRpb24gb2YgUkYgc3RhdGUgY2hhbmdlLiBCeSBCcnVjZSwgMjAwNy0xMS0yOC4KKwkvLyBPbmx5IG9uZSB0aHJlYWQgY2FuIGNoYW5nZSB0aGUgUkYgc3RhdGUgYXQgb25lIHRpbWUsIGFuZCBvdGhlcnMgc2hvdWxkIHdhaXQgdG8gYmUgZXhlY3V0ZWQuCisJLy8KKyNpZiAxCisJd2hpbGUodHJ1ZSkKKwl7CisvLwkJZG93bigmcHJpdi0+cmZfc3RhdGUpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cmZfcHNfbG9jayxmbGFnKTsKKwkJaWYocHJpdi0+UkZDaGFuZ2VJblByb2dyZXNzKQorCQl7CisvLwkJCXByaW50aygiPT09PT09PT09PT09PT09PT09PT0+aGFoYTExMTExMTExMVxuIik7CisvLwkJCXVwKCZwcml2LT5yZl9zdGF0ZSk7CisvLwkJCVJUX1RSQUNFKENPTVBfUkYsIERCR19MT1VELCAoIk1nbnRBY3RTZXRfUkZfU3RhdGUoKTogUkYgQ2hhbmdlIGluIHByb2dyZXNzISBXYWl0IHRvIHNldC4uU3RhdGVUb1NldCglZCkuXG4iLCBTdGF0ZVRvU2V0KSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yZl9wc19sb2NrLGZsYWcpOworCQkJLy8gU2V0IFJGIGFmdGVyIHRoZSBwcmV2aW91cyBhY3Rpb24gaXMgZG9uZS4KKwkJCXdoaWxlKHByaXYtPlJGQ2hhbmdlSW5Qcm9ncmVzcykKKwkJCXsKKwkJCQlSRldhaXRDb3VudGVyICsrOworLy8JCQkJUlRfVFJBQ0UoQ09NUF9SRiwgREJHX0xPVUQsICgiTWdudEFjdFNldF9SRl9TdGF0ZSgpOiBXYWl0IDEgbXMgKCVkIHRpbWVzKS4uLlxuIiwgUkZXYWl0Q291bnRlcikpOworCQkJCXVkZWxheSgxMDAwKTsgLy8gMSBtcworCisJCQkJLy8gV2FpdCB0b28gbG9uZywgcmV0dXJuIEZBTFNFIHRvIGF2b2lkIHRvIGJlIHN0dWNrIGhlcmUuCisJCQkJaWYoUkZXYWl0Q291bnRlciA+IDEwMDApIC8vIDFzZWMKKwkJCQl7CisvLwkJCQkJUlRfQVNTRVJUKEZBTFNFLCAoIk1nbnRBY3RTZXRfUkZfU3RhdGUoKTogV2FpdCB0b28gbG9nbiB0byBzZXQgUkZcbiIpKTsKKwkJCQkJcHJpbnRrKCJNZ250QWN0U2V0X1JGX1N0YXRlKCk6IFdhaXQgdG9vIGxvbmcgdG8gc2V0IFJGXG4iKTsKKwkJCQkJLy8gVE9ETzogUmVzZXQgUkYgc3RhdGU/CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisvLwkJCXByaW50aygiPT09PT09PT09PT09PT09PT09PT09PT09PmhhaGEyXG4iKTsKKwkJCXByaXYtPlJGQ2hhbmdlSW5Qcm9ncmVzcyA9IHRydWU7CisvLwkJCXVwKCZwcml2LT5yZl9zdGF0ZSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yZl9wc19sb2NrLGZsYWcpOworCQkJYnJlYWs7CisJCX0KKwl9CisjZW5kaWYKKwlydFN0YXRlID0gcHJpdi0+ZVJGUG93ZXJTdGF0ZTsKKworCisJc3dpdGNoKFN0YXRlVG9TZXQpCisJeworCWNhc2UgZVJmT246CisJCS8vCisJCS8vIFR1cm4gT24gUkYgbm8gbWF0dGVyIHRoZSBJUFMgc2V0dGluZyBiZWNhdXNlIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBSRiBzdGF0ZSB0byBOZGlzIHVuZGVyIFZpc3RhLCBvcgorCQkvLyB0aGUgV2luZG93cyBkb2VzIG5vdCBhbGxvdyB0aGUgZHJpdmVyIHRvIHBlcmZvcm0gc2l0ZSBzdXJ2ZXkgYW55IG1vcmUuIEJ5IEJydWNlLCAyMDA3LTEwLTAyLgorCQkvLworCQlwcml2LT5SZk9mZlJlYXNvbiAmPSAofkNoYW5nZVNvdXJjZSk7CisKKwkJaWYoISBwcml2LT5SZk9mZlJlYXNvbikKKwkJeworCQkJcHJpdi0+UmZPZmZSZWFzb24gPSAwOworCQkJYkFjdGlvbkFsbG93ZWQgPSB0cnVlOworCisJCQlpZihydFN0YXRlID09IGVSZk9mZiAmJiBDaGFuZ2VTb3VyY2UgPj1SRl9DSEFOR0VfQllfSFcgJiYgIXByaXYtPmJJbkhjdFRlc3QpCisJCQl7CisJCQkJYkNvbm5lY3RCeVNTSUQgPSB0cnVlOworCQkJfQorCQl9CisJCWVsc2UKKy8vCQkJUlRfVFJBQ0UoQ09NUF9SRiwgREJHX0xPVUQsICgiTWdudEFjdFNldF9SRl9TdGF0ZSAtIGVSZm9uIHJlamVjdCBwTWdudEluZm8tPlJmT2ZmUmVhc29uPSAweCV4LCBDaGFuZ2VTb3VyY2U9MHglWFxuIiwgcE1nbnRJbmZvLT5SZk9mZlJlYXNvbiwgQ2hhbmdlU291cmNlKSk7CisJCQk7CisJCWJyZWFrOworCisJY2FzZSBlUmZPZmY6CisJCSAvLyAwNzAxMjUsIHJjbmprbzogd2UgYWx3YXlzIGtlZXAgY29ubmVjdGVkIGluIEFQIG1vZGUuCisKKwkJCWlmIChwcml2LT5SZk9mZlJlYXNvbiA+IFJGX0NIQU5HRV9CWV9JUFMpCisJCQl7CisJCQkJLy8KKwkJCQkvLyAwNjA4MDgsIEFubmllOgorCQkJCS8vIERpc2Nvbm5lY3QgdG8gY3VycmVudCBCU1Mgd2hlbiByYWRpbyBvZmYuIEFza2VkIGJ5IFF1YW5UYS4KKwkJCQkvLworCisJCQkJLy8KKwkJCQkvLyBDYWxsaW5nIE1nbnREaXNjb25uZWN0KCkgaW5zdGVhZCBvZiBNZ250QWN0U2V0XzgwMl8xMV9ESVNBU1NPQ0lBVEUoKSwKKwkJCQkvLyBiZWNhdXNlIHdlIGRvIE5PVCBuZWVkIHRvIHNldCBzc2lkIHRvIGR1bW15IG9uZXMuCisJCQkJLy8gUmV2aXNlZCBieSBSb2dlciwgMjAwNy4xMi4wNC4KKwkJCQkvLworCQkJCU1nbnREaXNjb25uZWN0KCBkZXYsIGRpc2FzX2x2X3NzICk7CisKKwkJCQkvLyBDbGVhciBjb250ZW50IG9mIGJzc0Rlc2NbXSBhbmQgYnNzRGVzYzRRdWVyeVtdIHRvIGF2b2lkIHJlcG9ydGluZyBvbGQgYnNzIHRvIFVJLgorCQkJCS8vIDIwMDcuMDUuMjgsIGJ5IHNoaWVuIGNoYW5nLgorLy8JCQkJUGxhdGZvcm1aZXJvTWVtb3J5KCBwTWdudEluZm8tPmJzc0Rlc2MsIHNpemVvZihSVF9XTEFOX0JTUykqTUFYX0JTU19ERVNDICk7CisvLwkJCQlwTWdudEluZm8tPk51bUJzc0Rlc2MgPSAwOworLy8JCQkJUGxhdGZvcm1aZXJvTWVtb3J5KCBwTWdudEluZm8tPmJzc0Rlc2M0UXVlcnksIHNpemVvZihSVF9XTEFOX0JTUykqTUFYX0JTU19ERVNDICk7CisvLwkJCQlwTWdudEluZm8tPk51bUJzc0Rlc2M0UXVlcnkgPSAwOworCQkJfQorCisKKworCQlwcml2LT5SZk9mZlJlYXNvbiB8PSBDaGFuZ2VTb3VyY2U7CisJCWJBY3Rpb25BbGxvd2VkID0gdHJ1ZTsKKwkJYnJlYWs7CisKKwljYXNlIGVSZlNsZWVwOgorCQlwcml2LT5SZk9mZlJlYXNvbiB8PSBDaGFuZ2VTb3VyY2U7CisJCWJBY3Rpb25BbGxvd2VkID0gdHJ1ZTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlpZihiQWN0aW9uQWxsb3dlZCkKKwl7CisvLwkJUlRfVFJBQ0UoQ09NUF9SRiwgREJHX0xPVUQsICgiTWdudEFjdFNldF9SRl9TdGF0ZSgpOiBBY3Rpb24gaXMgYWxsb3dlZC4uLi4gU3RhdGVUb1NldCglZCksIFJmT2ZmUmVhc29uKCUjWClcbiIsIFN0YXRlVG9TZXQsIHBNZ250SW5mby0+UmZPZmZSZWFzb24pKTsKKyAgICAgICAgICAgICAgICAvLyBDb25maWcgSFcgdG8gdGhlIHNwZWNpZmllZCBtb2RlLgorLy8JCXByaW50aygiTWdudEFjdFNldF9SRl9TdGF0ZSgpOiBBY3Rpb24gaXMgYWxsb3dlZC4uLi4gU3RhdGVUb1NldCglZCksIFJmT2ZmUmVhc29uKCUjWClcbiIsIFN0YXRlVG9TZXQsIHByaXYtPlJmT2ZmUmVhc29uKTsKKwkJU2V0UkZQb3dlclN0YXRlKGRldiwgU3RhdGVUb1NldCk7CisKKwkJLy8gVHVybiBvbiBSRi4KKwkJaWYoU3RhdGVUb1NldCA9PSBlUmZPbikKKwkJeworCQkJSGFsRW5hYmxlUng4MTg1RHVtbXkoZGV2KTsKKwkJCWlmKGJDb25uZWN0QnlTU0lEKQorCQkJeworCQkJLy8gYnkgYW15IG5vdCBzdXBwb3J0ZWQKKy8vCQkJCU1nbnRBY3RTZXRfODAyXzExX1NTSUQoQWRhcHRlciwgQWRhcHRlci0+TWdudEluZm8uU3NpZC5PY3RldCwgQWRhcHRlci0+TWdudEluZm8uU3NpZC5MZW5ndGgsIFRSVUUgKTsKKwkJCX0KKwkJfQorCQkvLyBUdXJuIG9mZiBSRi4KKwkJZWxzZSBpZihTdGF0ZVRvU2V0ID09IGVSZk9mZikKKwkJeworCQkJSGFsRGlzYWJsZVJ4ODE4NUR1bW15KGRldik7CisJCX0KKwl9CisJZWxzZQorCXsKKwkvLwlwcmludGsoIk1nbnRBY3RTZXRfUkZfU3RhdGUoKTogQWN0aW9uIGlzIHJlamVjdGVkLi4uLiBTdGF0ZVRvU2V0KCVkKSwgQ2hhbmdlU291cmNlKCUjWCksIFJmT2ZmUmVhc29uKCUjWClcbiIsIFN0YXRlVG9TZXQsIENoYW5nZVNvdXJjZSwgcHJpdi0+UmZPZmZSZWFzb24pOworCX0KKworCS8vIFJlbGVhc2UgUkYgc3BpbmxvY2sKKy8vCWRvd24oJnByaXYtPnJmX3N0YXRlKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cmZfcHNfbG9jayxmbGFnKTsKKwlwcml2LT5SRkNoYW5nZUluUHJvZ3Jlc3MgPSBmYWxzZTsKKy8vCXVwKCZwcml2LT5yZl9zdGF0ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cmZfcHNfbG9jayxmbGFnKTsKKy8vCXByaW50aygiPD09PU1nbnRBY3RTZXRfUkZfU3RhdGUoKVxuIik7CisJcmV0dXJuIGJBY3Rpb25BbGxvd2VkOworfQordm9pZAorSW5hY3RpdmVQb3dlclNhdmUoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldgorCSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJLy91OCBpbmRleCA9IDA7CisKKwkvLworCS8vIFRoaXMgZmxhZyAiYlN3UmZQcm9jZXNzaW5nIiwgaW5kaWNhdGVzIHRoZSBzdGF0dXMgb2YgSVBTIHByb2NlZHVyZSwgc2hvdWxkIGJlIHNldCBpZiB0aGUgSVBTIHdvcmtpdGVtCisJLy8gaXMgcmVhbGx5IHNjaGVkdWxlZC4KKwkvLyBUaGUgb2xkIGNvZGUsIHNldHMgdGhpcyBmbGFnIGJlZm9yZSBzY2hlZHVsaW5nIHRoZSBJUFMgd29ya2l0ZW0gYW5kIGhvd2V2ZXIsIGF0IHRoZSBzYW1lIHRpbWUgdGhlCisJLy8gcHJldmlvdXMgSVBTIHdvcmtpdGVtIGRpZCBub3QgZW5kIHlldCwgZmFpbHMgdG8gc2NoZWR1bGUgdGhlIGN1cnJlbnQgd29ya2l0ZW0uIFRodXMsIGJTd1JmUHJvY2Vzc2luZworCS8vIGJsb2NrcyB0aGUgSVBTIHByb2NlZHVyZSBvZiBzd2l0Y2hpbmcgUkYuCisJLy8gQnkgQnJ1Y2UsIDIwMDctMTItMjUuCisJLy8KKwlwcml2LT5iU3dSZlByb2Nlc3NpbmcgPSB0cnVlOworCisJTWdudEFjdFNldF9SRl9TdGF0ZShkZXYsIHByaXYtPmVJbmFjdGl2ZVBvd2VyU3RhdGUsIFJGX0NIQU5HRV9CWV9JUFMpOworCisJLy8KKwkvLyBUbyBzb2x2ZSBDQU0gdmFsdWVzIG1pc3MgaW4gUkYgT0ZGLCByZXdyaXRlIENBTSB2YWx1ZXMgYWZ0ZXIgUkYgT04uIEJ5IEJydWNlLCAyMDA3LTA5LTIwLgorCS8vCisjaWYgMAorCXdoaWxlKCBpbmRleCA8IDQgKQorCXsKKwkJaWYoICggcE1nbnRJbmZvLT5TZWN1cml0eUluZm8uUGFpcndpc2VFbmNBbGdvcml0aG0gPT0gV0VQMTA0X0VuY3J5cHRpb24gKSB8fAorCQkJKHBNZ250SW5mby0+U2VjdXJpdHlJbmZvLlBhaXJ3aXNlRW5jQWxnb3JpdGhtID09IFdFUDQwX0VuY3J5cHRpb24pICkKKwkJeworCQkJaWYoIHBNZ250SW5mby0+U2VjdXJpdHlJbmZvLktleUxlbltpbmRleF0gIT0gMCkKKwkJCXBBZGFwdGVyLT5IYWxGdW5jLlNldEtleUhhbmRsZXIocEFkYXB0ZXIsIGluZGV4LCAwLCBGQUxTRSwgcE1nbnRJbmZvLT5TZWN1cml0eUluZm8uUGFpcndpc2VFbmNBbGdvcml0aG0sIFRSVUUsIEZBTFNFKTsKKworCQl9CisJCWluZGV4Kys7CisJfQorI2VuZGlmCisJcHJpdi0+YlN3UmZQcm9jZXNzaW5nID0gZmFsc2U7Cit9CisKKy8vCisvLwlEZXNjcmlwdGlvbjoKKy8vCQlFbnRlciB0aGUgaW5hY3RpdmUgcG93ZXIgc2F2ZSBtb2RlLiBSRiB3aWxsIGJlIG9mZgorLy8JMjAwNy4wOC4xNywgYnkgc2hpZW4gY2hhbmcuCisvLwordm9pZAorSVBTRW50ZXIoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldgorCSkKK3sKKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJUlRfUkZfUE9XRVJfU1RBVEUgcnRTdGF0ZTsKKwkvL3ByaW50aygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PmVudGVyIElQU1xuIik7CisJaWYgKHByaXYtPmJJbmFjdGl2ZVBzKQorCXsKKwkJcnRTdGF0ZSA9IHByaXYtPmVSRlBvd2VyU3RhdGU7CisKKwkJLy8KKwkJLy8gQWRkZWQgYnkgQnJ1Y2UsIDIwMDctMTItMjUuCisJCS8vIERvIG5vdCBlbnRlciBJUFMgaW4gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCQkvLyAoMSkgUkYgaXMgYWxyZWFkeSBPRkYgb3IgU2xlZXAKKwkJLy8gKDIpIGJTd1JmUHJvY2Vzc2luZyAoaW5kaWNhdGVzIHRoZSBJUFMgaXMgc3RpbGwgdW5kZXIgZ29pbmcpCisJCS8vICgzKSBDb25uZWN0dGVkIChvbmx5IGRpc2Nvbm5lY3RlZCBjYW4gdHJpZ2dlciBJUFMpCisJCS8vICg0KSBJQlNTIChzZW5kIEJlYWNvbikKKwkJLy8gKDUpIEFQIG1vZGUgKHNlbmQgQmVhY29uKQorCQkvLworCQlpZiAocnRTdGF0ZSA9PSBlUmZPbiAmJiAhcHJpdi0+YlN3UmZQcm9jZXNzaW5nCisJCQkmJiAocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSAhPSBJRUVFODAyMTFfTElOS0VEICkpCisJCXsKKwkvLwkJcHJpbnRrKCJJUFNFbnRlcigpOiBUdXJuIG9mZiBSRi5cbiIpOworCQkJcHJpdi0+ZUluYWN0aXZlUG93ZXJTdGF0ZSA9IGVSZk9mZjsKKwkJCUluYWN0aXZlUG93ZXJTYXZlKGRldik7CisJCX0KKwl9CisvLwlwcmludGsoInByaXYtPmVSRlBvd2VyU3RhdGUgaXMgJWRcbiIscHJpdi0+ZVJGUG93ZXJTdGF0ZSk7Cit9Cit2b2lkCitJUFNMZWF2ZSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2CisJKQoreworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlSVF9SRl9QT1dFUl9TVEFURSBydFN0YXRlOworCS8vcHJpbnRrKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT5sZWF2ZSBJUFNcbiIpOworCWlmIChwcml2LT5iSW5hY3RpdmVQcykKKwl7CisJCXJ0U3RhdGUgPSBwcml2LT5lUkZQb3dlclN0YXRlOworCQlpZiAoKHJ0U3RhdGUgPT0gZVJmT2ZmIHx8IHJ0U3RhdGUgPT0gZVJmU2xlZXApICYmICghcHJpdi0+YlN3UmZQcm9jZXNzaW5nKSAmJiBwcml2LT5SZk9mZlJlYXNvbiA8PSBSRl9DSEFOR0VfQllfSVBTKQorCQl7CisvLwkJCXByaW50aygiSVBTTGVhdmUoKTogVHVybiBvbiBSRi5cbiIpOworCQkJcHJpdi0+ZUluYWN0aXZlUG93ZXJTdGF0ZSA9IGVSZk9uOworCQkJSW5hY3RpdmVQb3dlclNhdmUoZGV2KTsKKwkJfQorCX0KKy8vCXByaW50aygicHJpdi0+ZVJGUG93ZXJTdGF0ZSBpcyAlZFxuIixwcml2LT5lUkZQb3dlclN0YXRlKTsKK30KKy8vYnkgYW15IGZvciBwb3dlciBzYXZlCit2b2lkIHJ0bDgxODViX2FkYXB0ZXJfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgIHN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IHByaXYtPmllZWU4MDIxMTsKKworCXU4IFN1cHBvcnRlZFdpcmVsZXNzTW9kZTsKKwl1OAkJCUluaXRXaXJlbGVzc01vZGU7CisJdTgJCQliSW52YWxpZFdpcmVsZXNzTW9kZSA9IDA7CisJLy9pbnQgaTsKKwl1OCB0bXB1ODsKKyAgICAJLy91OCB1MXRtcCx1MnRtcDsKKwl1OCBidENSOTM0NjsKKwl1OCBUbXBVMWI7CisJdTggYnRQU1I7CisKKwkvL3J0bDgxODBfcnR4X2Rpc2FibGUoZGV2KTsKKy8ve2J5IGFteSAwODAzMTIKKwl3cml0ZV9uaWNfYnl0ZShkZXYsMHgyNGUsIChCSVQ1fEJJVDZ8QklUMCkpOworLy9ieSBhbXkgMDgwMzEyfQorCXJ0bDgxODBfcmVzZXQoZGV2KTsKKworCXByaXYtPmRtYV9wb2xsX21hc2sgPSAwOworCXByaXYtPmRtYV9wb2xsX3N0b3BfbWFzayA9IDA7CisKKwkvL3J0bDgxODBfYmVhY29uX3R4X2Rpc2FibGUoZGV2KTsKKworCUh3Q29uZmlndXJlUlRMODE4NShkZXYpOworCisJd3JpdGVfbmljX2R3b3JkKGRldiwgTUFDMCwgKCh1MzIqKWRldi0+ZGV2X2FkZHIpWzBdKTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIE1BQzQsICgodTMyKilkZXYtPmRldl9hZGRyKVsxXSAmIDB4ZmZmZiApOworCisJd3JpdGVfbmljX2J5dGUoZGV2LCBNU1IsIHJlYWRfbmljX2J5dGUoZGV2LCBNU1IpICYgMHhmMyk7CS8vIGRlZmF1bHQgbmV0d29yayB0eXBlIHRvICdObwlMaW5rJworCisJLy93cml0ZV9uaWNfYnl0ZShkZXYsIEJSU1IsIDB4MCk7CQkvLyBTZXQgQlJTUj0gMU0KKworCXdyaXRlX25pY193b3JkKGRldiwgQmNuSXR2LCAxMDApOworCXdyaXRlX25pY193b3JkKGRldiwgQXRpbVduZCwgMik7CisKKwkvL1BsYXRmb3JtRUZJT1dyaXRlMkJ5dGUoZGV2LCBGRU1SLCAweEZGRkYpOworCVBsYXRmb3JtSU9Xcml0ZTJCeXRlKGRldiwgRkVNUiwgMHhGRkZGKTsKKworCXdyaXRlX25pY19ieXRlKGRldiwgV1BBX0NPTkZJRywgMCk7CisKKwlNYWNDb25maWdfODVCQVNJQyhkZXYpOworCisJLy8gT3ZlcnJpZGUgdGhlIFJGU1dfQ1RSTCAoTUFDIG9mZnNldCAweDI3Mi0weDI3MyksIDIwMDYuMDYuMDcsIGJ5IHJjbmprby4KKwkvLyBCVF9ERU1PX0JPQVJEIHR5cGUKKwlQbGF0Zm9ybUlPV3JpdGUyQnl0ZShkZXYsIFJGU1dfQ1RSTCwgMHg1NjlhKTsKKy8vYnkgYW15CisvLyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisJCS8vIGZvciBqb25nIHJlcXVpcmVkCisvLwlQbGF0Zm9ybUlPV3JpdGUyQnl0ZShkZXYsIFJGU1dfQ1RSTCwgMHg5YTU2KTsKKy8vI2VuZGlmCisvL2J5IGFteQorCS8vQlRfUUFfQk9BUkQKKwkvL1BsYXRmb3JtSU9Xcml0ZTJCeXRlKGRldiwgUkZTV19DVFJMLCAweDlhNTYpOworCisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vIFNldCB1cCBQSFkgcmVsYXRlZC4KKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8gRW5hYmxlIENvbmZpZzMuUEFSQU1fRW4gdG8gcmV2aXNlIEFuYWFQYXJtLgorCXdyaXRlX25pY19ieXRlKGRldiwgQ1I5MzQ2LCAweGMwKTsJLy8gZW5hYmxlIGNvbmZpZyByZWdpc3RlciB3cml0ZQorLy9ieSBhbXkKKwl0bXB1OCA9IHJlYWRfbmljX2J5dGUoZGV2LCBDT05GSUczKTsKKyNpZmRlZiBDT05GSUdfUlRMODE4WF9TCisJd3JpdGVfbmljX2J5dGUoZGV2LCBDT05GSUczLCAodG1wdTggfENPTkZJRzNfUEFSTV9FbikgKTsKKyNlbHNlCisJd3JpdGVfbmljX2J5dGUoZGV2LCBDT05GSUczLCAodG1wdTggfENPTkZJRzNfUEFSTV9FbiB8IENPTkZJRzNfQ0xLUlVOX0VuKSApOworI2VuZGlmCisvL2J5IGFteQorCS8vIFR1cm4gb24gQW5hbG9nIHBvd2VyLgorCS8vIEFza2VkIGZvciBieSBXaWxsaWFtLCBvdGhlcndpc2UsIE1BQyAzLXdpcmUgY2FuJ3Qgd29yaywgMjAwNi4wNi4yNywgYnkgcmNuamtvLgorCXdyaXRlX25pY19kd29yZChkZXYsIEFOQVBBUkFNMiwgQU5BUEFSTTJfQVNJQ19PTik7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgQU5BUEFSQU0sIEFOQVBBUk1fQVNJQ19PTik7CisvL2J5IGFteQorI2lmZGVmIENPTkZJR19SVEw4MThYX1MKKwl3cml0ZV9uaWNfd29yZChkZXYsIEFOQVBBUkFNMywgMHgwMDEwKTsKKyNlbHNlCisgICAgICB3cml0ZV9uaWNfYnl0ZShkZXYsIEFOQVBBUkFNMywgMHgwMCk7CisjZW5kaWYKKy8vYnkgYW15CisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENPTkZJRzMsIHRtcHU4KTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENSOTM0NiwgMHgwMCk7CisvL3tieSBhbXkgMDgwMzEyIGZvciBsZWQKKwkvLyBlbmFibGUgRUVNMCBhbmQgRUVNMSBpbiA5MzQ2Q1IKKwlidENSOTM0NiA9IHJlYWRfbmljX2J5dGUoZGV2LCBDUjkzNDYpOworCXdyaXRlX25pY19ieXRlKGRldiwgQ1I5MzQ2LCAoYnRDUjkzNDZ8MHhDMCkgKTsKKworCS8vIEIgY3V0IHVzZSBMRUQxIHRvIGNvbnRyb2wgSFcgUkYgb24vb2ZmCisJVG1wVTFiID0gcmVhZF9uaWNfYnl0ZShkZXYsIENPTkZJRzUpOworCVRtcFUxYiA9IFRtcFUxYiAmIH5CSVQzOworCXdyaXRlX25pY19ieXRlKGRldixDT05GSUc1LCBUbXBVMWIpOworCisJLy8gZGlzYWJsZSBFRU0wIGFuZCBFRU0xIGluIDkzNDZDUgorCWJ0Q1I5MzQ2ICY9IH4oMHhDMCk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBDUjkzNDYsIGJ0Q1I5MzQ2KTsKKworCS8vRW5hYmxlIExlZCAoc3VnZ2VzdGVkIGJ5IEpvbmcpCisJLy8gQi1jdXQgUkYgUmFkaW8gb24vb2ZmICA1ZVszXT0wCisJYnRQU1IgPSByZWFkX25pY19ieXRlKGRldiwgUFNSKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFBTUiwgKGJ0UFNSIHwgQklUMykpOworLy9ieSBhbXkgMDgwMzEyIGZvciBsZWR9CisJLy8gc2V0dXAgaW5pdGlhbCB0aW1pbmcgZm9yIFJGRS4KKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc091dHB1dCwgMHgwNDgwKTsKKwlTZXRPdXRwdXRFbmFibGVPZlJmUGlucyhkZXYpOworCXdyaXRlX25pY193b3JkKGRldiwgUkZQaW5zU2VsZWN0LCAweDI0ODgpOworCisJLy8gUEhZIGNvbmZpZy4KKwlQaHlDb25maWc4MTg1KGRldik7CisKKwkvLyBXZSBhc3N1bWUgUmVnV2lyZWxlc3NNb2RlIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgYmVmb3JlLAorCS8vIGhvd2V2ZXIsIHdlIGhhcyB0byB2YWxpZGF0ZSB0aGUgd2lyZWxlc3MgbW9kZSBoZXJlIGFuZCBwcm92aWRlIGEgcmVhc29uYmxlCisJLy8gaW5pdGlhbGl6ZWQgdmFsdWUgaWYgbmVjZXNzYXJ5LiAyMDA1LjAxLjEzLCBieSByY25qa28uCisJU3VwcG9ydGVkV2lyZWxlc3NNb2RlID0gR2V0U3VwcG9ydGVkV2lyZWxlc3NNb2RlODE4NShkZXYpOworCWlmKAkoaWVlZS0+bW9kZSAhPSBXSVJFTEVTU19NT0RFX0IpICYmCisJCShpZWVlLT5tb2RlICE9IFdJUkVMRVNTX01PREVfRykgJiYKKwkJKGllZWUtPm1vZGUgIT0gV0lSRUxFU1NfTU9ERV9BKSAmJgorCQkoaWVlZS0+bW9kZSAhPSBXSVJFTEVTU19NT0RFX0FVVE8pKQorCXsgLy8gSXQgc2hvdWxkIGJlIG9uZSBvZiBCLCBHLCBBLCBvciBBVVRPLgorCQliSW52YWxpZFdpcmVsZXNzTW9kZSA9IDE7CisJfQorCWVsc2UKKwl7IC8vIE9uZSBvZiBCLCBHLCBBLCBvciBBVVRPLgorCQkvLyBDaGVjayBpZiB0aGUgd2lyZWxlc3MgbW9kZSBpcyBzdXBwb3J0ZWQgYnkgUkYuCisJCWlmKCAoaWVlZS0+bW9kZSAhPSBXSVJFTEVTU19NT0RFX0FVVE8pICYmCisJCQkoaWVlZS0+bW9kZSAmIFN1cHBvcnRlZFdpcmVsZXNzTW9kZSkgPT0gMCApCisJCXsKKwkJCWJJbnZhbGlkV2lyZWxlc3NNb2RlID0gMTsKKwkJfQorCX0KKworCWlmKGJJbnZhbGlkV2lyZWxlc3NNb2RlIHx8IGllZWUtPm1vZGU9PVdJUkVMRVNTX01PREVfQVVUTykKKwl7IC8vIEF1dG8gb3Igb3RoZXIgaW52YWxpZCB2YWx1ZS4KKwkJLy8gQXNzaWduZSBhIHdpcmVsZXNzIG1vZGUgdG8gaW5pdGlhbGl6ZS4KKwkJaWYoKFN1cHBvcnRlZFdpcmVsZXNzTW9kZSAmIFdJUkVMRVNTX01PREVfQSkpCisJCXsKKwkJCUluaXRXaXJlbGVzc01vZGUgPSBXSVJFTEVTU19NT0RFX0E7CisJCX0KKwkJZWxzZSBpZigoU3VwcG9ydGVkV2lyZWxlc3NNb2RlICYgV0lSRUxFU1NfTU9ERV9HKSkKKwkJeworCQkJSW5pdFdpcmVsZXNzTW9kZSA9IFdJUkVMRVNTX01PREVfRzsKKwkJfQorCQllbHNlIGlmKChTdXBwb3J0ZWRXaXJlbGVzc01vZGUgJiBXSVJFTEVTU19NT0RFX0IpKQorCQl7CisJCQlJbml0V2lyZWxlc3NNb2RlID0gV0lSRUxFU1NfTU9ERV9COworCQl9CisJCWVsc2UKKwkJeworCQkJRE1FU0dXKCJJbml0aWFsaXplQWRhcHRlcjgxODUoKTogTm8gdmFsaWQgd2lyZWxlc3MgbW9kZSBzdXBwb3J0ZWQsIFN1cHBvcnRlZFdpcmVsZXNzTW9kZSgleCkhISFcbiIsCisJCQkJIFN1cHBvcnRlZFdpcmVsZXNzTW9kZSk7CisJCQlJbml0V2lyZWxlc3NNb2RlID0gV0lSRUxFU1NfTU9ERV9COworCQl9CisKKwkJLy8gSW5pdGlhbGl6ZSBSZWdXaXJlbGVzc01vZGUgaWYgaXQgaXMgbm90IGEgdmFsaWQgb25lLgorCQlpZihiSW52YWxpZFdpcmVsZXNzTW9kZSkKKwkJeworCQkJaWVlZS0+bW9kZSA9IChXSVJFTEVTU19NT0RFKUluaXRXaXJlbGVzc01vZGU7CisJCX0KKwl9CisJZWxzZQorCXsgLy8gT25lIG9mIEIsIEcsIEEuCisJCUluaXRXaXJlbGVzc01vZGUgPSBpZWVlLT5tb2RlOworCX0KKy8vYnkgYW15IGZvciBwb3dlciBzYXZlCisjaWZkZWYgRU5BQkxFX0lQUworLy8JcHJpbnRrKCJpbml0aWFsaXplIEVOQUJMRV9JUFNcbiIpOworCXByaXYtPmVSRlBvd2VyU3RhdGUgPSBlUmZPZmY7CisJcHJpdi0+UmZPZmZSZWFzb24gPSAwOworCXsKKwkvLwl1MzIgdG1wMjsKKwkvLwl1MzIgdG1wID0gamlmZmllczsKKwkJTWdudEFjdFNldF9SRl9TdGF0ZShkZXYsIGVSZk9uLCAwKTsKKwkvLwl0bXAyID0gamlmZmllczsKKwkvLwlwcmludGsoInJmIG9uIGNvc3QgamlmZmllczolbHhcbiIsICh0bXAyLXRtcCkqMTAwMC9IWik7CisJfQorLy8JRHJ2SUZJbmRpY2F0ZUN1cnJlbnRQaHlTdGF0dXMocHJpdik7CisJCS8vCisJCS8vIElmIGluYWN0aXZlIHBvd2VyIG1vZGUgaXMgZW5hYmxlZCwgZGlzYWJsZSByZiB3aGlsZSBpbiBkaXNjb25uZWN0ZWQgc3RhdGUuCisJCS8vIDIwMDcuMDcuMTYsIGJ5IHNoaWVuIGNoYW5nLgorCQkvLworCWlmIChwcml2LT5iSW5hY3RpdmVQcykKKwl7CisJLy8JdTMyIHRtcDI7CisJLy8JdTMyIHRtcCA9IGppZmZpZXM7CisJCU1nbnRBY3RTZXRfUkZfU3RhdGUoZGV2LGVSZk9mZiwgUkZfQ0hBTkdFX0JZX0lQUyk7CisJLy8JdG1wMiA9IGppZmZpZXM7CisJLy8JcHJpbnRrKCJyZiBvZmYgY29zdCBqaWZmaWVzOiVseFxuIiwgKHRtcDItdG1wKSoxMDAwL0haKTsKKworCX0KKyNlbmRpZgorLy8JSVBTRW50ZXIoZGV2KTsKKy8vYnkgYW15IGZvciBwb3dlciBzYXZlCisjaWZkZWYgVE9ETworCS8vIFR1cm4gb2ZmIFJGIGlmIG5lY2Vzc2FyeS4gMjAwNS4wOC4yMywgYnkgcmNuamtvLgorCS8vIFdlIHNoYWxsIHR1cm4gb2ZmIFJGIGFmdGVyIHNldHRpbmcgQ01EUiwgb3RoZXJ3aXNlLAorCS8vIFJGIHdpbGwgYmUgdHVybm5lZCBvbiBhZnRlciB3ZSBlbmFibGUgTUFDIFR4L1J4LgorCWlmKEFkYXB0ZXItPk1nbnRJbmZvLlJlZ1JmT2ZmID09IFRSVUUpCisJeworCQlTZXRSRlBvd2VyU3RhdGU4MTg1KEFkYXB0ZXIsIFJGX09GRik7CisJfQorCWVsc2UKKwl7CisJCVNldFJGUG93ZXJTdGF0ZTgxODUoQWRhcHRlciwgUkZfT04pOworCX0KKyNlbmRpZgorCisvKiAgIC8vdGhlc2UgaXMgZXF1YWwgd2l0aCBhYm92ZSBUT0RPLgorCXdyaXRlX25pY19ieXRlKGRldiwgQ1I5MzQ2LCAweGMwKTsJLy8gZW5hYmxlIGNvbmZpZyByZWdpc3RlciB3cml0ZQorCXdyaXRlX25pY19ieXRlKGRldiwgQ09ORklHMywgcmVhZF9uaWNfYnl0ZShkZXYsIENPTkZJRzMpIHwgQ09ORklHM19QQVJNX0VuKTsKKwlSRl9Xcml0ZVJlZyhkZXYsIDB4NCwgMHg5RkYpOworCXdyaXRlX25pY19kd29yZChkZXYsIEFOQVBBUkFNMiwgQU5BUEFSTTJfQVNJQ19PTik7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgQU5BUEFSQU0sIEFOQVBBUk1fQVNJQ19PTik7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBDT05GSUczLCAocmVhZF9uaWNfYnl0ZShkZXYsIENPTkZJRzMpJih+Q09ORklHM19QQVJNX0VuKSkpOworCXdyaXRlX25pY19ieXRlKGRldiwgQ1I5MzQ2LCAweDAwKTsKKyovCisKKwlBY3RTZXRXaXJlbGVzc01vZGU4MTg1KGRldiwgKHU4KShJbml0V2lyZWxlc3NNb2RlKSk7CisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlydGw4MTg1Yl9pcnFfZW5hYmxlKGRldik7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisgfQorCisKK3ZvaWQgcnRsODE4NWJfcnhfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdTggY21kOworCS8vdTMyIHJ4Y29uZjsKKwkvKiBmb3Igbm93IHdlIGFjY2VwdCBkYXRhLCBtYW5hZ2VtZW50ICYgY3RsIGZyYW1lKi8KKwlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxODBfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisjaWYgMAorCXJ4Y29uZj1yZWFkX25pY19kd29yZChkZXYsUlhfQ09ORik7CisJcnhjb25mID0gcnhjb25mICZ+IE1BQ19GSUxURVJfTUFTSzsKKwlyeGNvbmYgPSByeGNvbmYgfCAoMTw8QUNDRVBUX01OR19GUkFNRV9TSElGVCk7CisJcnhjb25mID0gcnhjb25mIHwgKDE8PEFDQ0VQVF9EQVRBX0ZSQU1FX1NISUZUKTsKKwlyeGNvbmYgPSByeGNvbmYgfCAoMTw8QUNDRVBUX0JDQVNUX0ZSQU1FX1NISUZUKTsKKwlyeGNvbmYgPSByeGNvbmYgfCAoMTw8QUNDRVBUX01DQVNUX0ZSQU1FX1NISUZUKTsKKy8vCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxBQ0NFUFRfQ1JDRVJSX0ZSQU1FX1NISUZUKTsKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSBETUVTRyAoIk5JQyBpbiBwcm9taXNjIG1vZGUiKTsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IgfHwgXAorCSAgIGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQyl7CisJCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxBQ0NFUFRfQUxMTUFDX0ZSQU1FX1NISUZUKTsKKwl9ZWxzZXsKKwkJcnhjb25mID0gcnhjb25mIHwgKDE8PEFDQ0VQVF9OSUNNQUNfRlJBTUVfU0hJRlQpOworCQlpZihwcml2LT5jYXJkXzgxODUgPT0gMCkKKwkJCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxSWF9DSEVDS19CU1NJRF9TSElGVCk7CisJfQorCisJLyppZihwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpeworCQlyeGNvbmYgPSByeGNvbmYgfCAoMTw8QUNDRVBUX0FMTE1BQ19GUkFNRV9TSElGVCk7CisJCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxSWF9DSEVDS19CU1NJRF9TSElGVCk7CisJfSovCisKKwlpZihwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKXsKKwkJcnhjb25mID0gcnhjb25mIHwgKDE8PEFDQ0VQVF9DVExfRlJBTUVfU0hJRlQpOworCQlyeGNvbmYgPSByeGNvbmYgfCAoMTw8QUNDRVBUX0lDVkVSUl9GUkFNRV9TSElGVCk7CisJCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxBQ0NFUFRfUFdSX0ZSQU1FX1NISUZUKTsKKwl9CisKKwlpZiggcHJpdi0+Y3JjbW9uID09IDEgJiYgcHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikKKwkJcnhjb25mID0gcnhjb25mIHwgKDE8PEFDQ0VQVF9DUkNFUlJfRlJBTUVfU0hJRlQpOworCisJLy9pZighcHJpdi0+Y2FyZF84MTg1KXsKKwkJcnhjb25mID0gcnhjb25mICZ+IFJYX0ZJRk9fVEhSRVNIT0xEX01BU0s7CisJCXJ4Y29uZiA9IHJ4Y29uZiB8IChSWF9GSUZPX1RIUkVTSE9MRF9OT05FPDxSWF9GSUZPX1RIUkVTSE9MRF9TSElGVCk7CisJLy99CisKKwlyeGNvbmYgPSByeGNvbmYgfCAoMTw8UlhfQVVUT1JFU0VUUEhZX1NISUZUKTsKKwlyeGNvbmYgPSByeGNvbmYgJn4gTUFYX1JYX0RNQV9NQVNLOworCXJ4Y29uZiA9IHJ4Y29uZiB8IChNQVhfUlhfRE1BXzIwNDg8PE1BWF9SWF9ETUFfU0hJRlQpOworCisJLy9pZighcHJpdi0+Y2FyZF84MTg1KQorCQlyeGNvbmYgPSByeGNvbmYgfCBSQ1JfT05MWUVSTFBLVDsKKworCXJ4Y29uZiA9IHJ4Y29uZiAmfiBSQ1JfQ1NfTUFTSzsKKwlpZighcHJpdi0+Y2FyZF84MTg1KQorCQlyeGNvbmYgfD0gKHByaXYtPnJjcl9jc2Vuc2U8PFJDUl9DU19TSElGVCk7CisvLwlyeGNvbmYgJj1+IDB4ZmZmMDAwMDA7CisvLwlyeGNvbmYgfD0gMHg5MDEwMDAwMDsvLzkwMTRmNzZmOworCXdyaXRlX25pY19kd29yZChkZXYsIFJYX0NPTkYsIHJ4Y29uZik7CisjZW5kaWYKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIERNRVNHICgiTklDIGluIHByb21pc2MgbW9kZSIpOworCisJaWYocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUiB8fCBcCisJICAgZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKXsKKwkgICAJcHJpdi0+UmVjZWl2ZUNvbmZpZyA9IHByaXYtPlJlY2VpdmVDb25maWcgJiAoflJDUl9BUE0pOworCQlwcml2LT5SZWNlaXZlQ29uZmlnID0gcHJpdi0+UmVjZWl2ZUNvbmZpZyB8IFJDUl9BQVA7CisJfQorCisJLyppZihwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpeworCQlyeGNvbmYgPSByeGNvbmYgfCAoMTw8QUNDRVBUX0FMTE1BQ19GUkFNRV9TSElGVCk7CisJCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxSWF9DSEVDS19CU1NJRF9TSElGVCk7CisJfSovCisKKwlpZihwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKXsKKwkJcHJpdi0+UmVjZWl2ZUNvbmZpZyA9IHByaXYtPlJlY2VpdmVDb25maWcgfCBSQ1JfQUNGIHwgUkNSX0FQV1JNR1QgfCBSQ1JfQUlDVjsKKwl9CisKKwlpZiggcHJpdi0+Y3JjbW9uID09IDEgJiYgcHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikKKwkJcHJpdi0+UmVjZWl2ZUNvbmZpZyA9IHByaXYtPlJlY2VpdmVDb25maWcgfCBSQ1JfQUNSQzMyOworCisJd3JpdGVfbmljX2R3b3JkKGRldiwgUkNSLCBwcml2LT5SZWNlaXZlQ29uZmlnKTsKKworCWZpeF9yeF9maWZvKGRldik7CisKKyNpZmRlZiBERUJVR19SWAorCURNRVNHKCJyeGNvbmY6ICV4ICV4Iixwcml2LT5SZWNlaXZlQ29uZmlnICxyZWFkX25pY19kd29yZChkZXYsUkNSKSk7CisjZW5kaWYKKwljbWQ9cmVhZF9uaWNfYnl0ZShkZXYsQ01EKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsQ01ELGNtZCB8ICgxPDxDTURfUlhfRU5BQkxFX1NISUZUKSk7CisKK30KKwordm9pZCBydGw4MTg1Yl90eF9lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1OCBjbWQ7CisJLy91OCB0eF9hZ2NfY3RsOworCXU4IGJ5dGU7CisJLy91MzIgdHhjb25mOworCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gKHN0cnVjdCByODE4MF9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKworI2lmIDAKKwl0eGNvbmY9IHJlYWRfbmljX2R3b3JkKGRldixUWF9DT05GKTsKKwlpZihwcml2LT5jYXJkXzgxODUpeworCisKKwkJYnl0ZSA9IHJlYWRfbmljX2J5dGUoZGV2LENXX0NPTkYpOworCQlieXRlICY9IH4oMTw8Q1dfQ09ORl9QRVJQQUNLRVRfQ1dfU0hJRlQpOworCQlieXRlICY9IH4oMTw8Q1dfQ09ORl9QRVJQQUNLRVRfUkVUUllfU0hJRlQpOworCQl3cml0ZV9uaWNfYnl0ZShkZXYsIENXX0NPTkYsIGJ5dGUpOworCisJCXR4X2FnY19jdGwgPSByZWFkX25pY19ieXRlKGRldiwgVFhfQUdDX0NUTCk7CisJCXR4X2FnY19jdGwgJj0gfigxPDxUWF9BR0NfQ1RMX1BFUlBBQ0tFVF9HQUlOX1NISUZUKTsKKwkJdHhfYWdjX2N0bCAmPSB+KDE8PFRYX0FHQ19DVExfUEVSUEFDS0VUX0FOVFNFTF9TSElGVCk7CisJCXR4X2FnY19jdGwgfD0oMTw8VFhfQUdDX0NUTF9GRUVEQkFDS19BTlQpOworCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFRYX0FHQ19DVEwsIHR4X2FnY19jdGwpOworCQkvKgorCQl3cml0ZV9uaWNfd29yZChkZXYsIDB4NWUsIDB4MDEpOworCQlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCQltZGVsYXkoMSk7CisJCXdyaXRlX25pY193b3JkKGRldiwgMHhmZSwgMHgxMCk7CisJCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJCW1kZWxheSgxKTsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCAweDVlLCAweDAwKTsKKwkJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwkJbWRlbGF5KDEpOworCQkqLworCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4ZWMsIDB4M2YpOyAvKiBEaXNhYmxlIGVhcmx5IFRYICovCisJfQorCisJaWYocHJpdi0+Y2FyZF84MTg1KXsKKworCQl0eGNvbmYgPSB0eGNvbmYgJn4gKDE8PFRDUl9QUk9CRV9OT1RJTUVTVEFNUF9TSElGVCk7CisKKwl9ZWxzZXsKKworCQlpZihod3NlcW51bSkKKwkJCXR4Y29uZj0gdHhjb25mICZ+ICgxPDxUWF9DT05GX0hFQURFUl9BVVRPSUNSRU1FTlRfU0hJRlQpOworCQllbHNlCisJCQl0eGNvbmY9IHR4Y29uZiB8ICgxPDxUWF9DT05GX0hFQURFUl9BVVRPSUNSRU1FTlRfU0hJRlQpOworCX0KKworCXR4Y29uZiA9IHR4Y29uZiAmfiBUWF9MT09QQkFDS19NQVNLOworCXR4Y29uZiA9IHR4Y29uZiB8IChUWF9MT09QQkFDS19OT05FIDw8VFhfTE9PUEJBQ0tfU0hJRlQpOworCXR4Y29uZiA9IHR4Y29uZiAmfiBUQ1JfRFBSRVRSWV9NQVNLOworCXR4Y29uZiA9IHR4Y29uZiAmfiBUQ1JfUlRTUkVUUllfTUFTSzsKKwl0eGNvbmYgPSB0eGNvbmYgfCAocHJpdi0+cmV0cnlfZGF0YTw8VFhfRFBSRVRSWV9TSElGVCk7CisJdHhjb25mID0gdHhjb25mIHwgKHByaXYtPnJldHJ5X3J0czw8VFhfUlRTUkVUUllfU0hJRlQpOworCXR4Y29uZiA9IHR4Y29uZiAmfiAoMTw8VFhfTk9DUkNfU0hJRlQpOworCisJaWYocHJpdi0+Y2FyZF84MTg1KXsKKwkJaWYocHJpdi0+aHdfcGxjcF9sZW4pCisJCQl0eGNvbmYgPSB0eGNvbmYgJn4gVENSX1BMQ1BfTEVOOworCQllbHNlCisJCQl0eGNvbmYgPSB0eGNvbmYgfCBUQ1JfUExDUF9MRU47CisJfWVsc2V7CisJCXR4Y29uZiA9IHR4Y29uZiAmfiBUQ1JfU0FUOworCX0KKwl0eGNvbmYgPSB0eGNvbmYgJn4gVENSX01YRE1BX01BU0s7CisJdHhjb25mID0gdHhjb25mIHwgKFRDUl9NWERNQV8yMDQ4PDxUQ1JfTVhETUFfU0hJRlQpOworCXR4Y29uZiA9IHR4Y29uZiB8IFRDUl9DV01JTjsKKwl0eGNvbmYgPSB0eGNvbmYgfCBUQ1JfRElTQ1c7CisKKy8vCWlmKHByaXYtPmllZWU4MDIxMS0+aHdfd2VwKQorLy8JCXR4Y29uZj10eGNvbmYgJn4gKDE8PFRYX05PSUNWX1NISUZUKTsKKy8vCWVsc2UKKwkJdHhjb25mPXR4Y29uZiB8ICgxPDxUWF9OT0lDVl9TSElGVCk7CisKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LFRYX0NPTkYsdHhjb25mKTsKKyNlbmRpZgorCisJd3JpdGVfbmljX2R3b3JkKGRldiwgVENSLCBwcml2LT5UcmFuc21pdENvbmZpZyk7CisJYnl0ZSA9IHJlYWRfbmljX2J5dGUoZGV2LCBNU1IpOworCWJ5dGUgfD0gTVNSX0xJTktfRU5FRENBOworCXdyaXRlX25pY19ieXRlKGRldiwgTVNSLCBieXRlKTsKKworCWZpeF90eF9maWZvKGRldik7CisKKyNpZmRlZiBERUJVR19UWAorCURNRVNHKCJ0eGNvbmY6ICV4ICV4Iixwcml2LT5UcmFuc21pdENvbmZpZyxyZWFkX25pY19kd29yZChkZXYsVENSKSk7CisjZW5kaWYKKworCWNtZD1yZWFkX25pY19ieXRlKGRldixDTUQpOworCXdyaXRlX25pY19ieXRlKGRldixDTUQsY21kIHwgKDE8PENNRF9UWF9FTkFCTEVfU0hJRlQpKTsKKworCS8vd3JpdGVfbmljX2R3b3JkKGRldixUWF9DT05GLHR4Y29uZik7CisKKworLyoKKwlydGw4MTgwX3NldF9tb2RlKGRldixFUFJPTV9DTURfQ09ORklHKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFRYX0RNQV9QT0xMSU5HLCBwcml2LT5kbWFfcG9sbF9tYXNrKTsKKwlydGw4MTgwX3NldF9tb2RlKGRldixFUFJPTV9DTURfTk9STUFMKTsKKwkqLworfQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpYy5oIGIvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpYy5oCmluZGV4IDBkNWRjMjQuLmE4ZWE1OWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9zbGljLmgKQEAgLTQxLDYgKzQxLDQwIEBACiAjaWZuZGVmIF9fU0xJQ19EUklWRVJfSF9fCiAjZGVmaW5lIF9fU0xJQ19EUklWRVJfSF9fCiAKKy8qIGZpcm13YXJlIHN0dWZmICovCisjZGVmaW5lIE9BU0lTX1VDT0RFX1ZFUlNfU1RSSU5HCSIxLjIiCisjZGVmaW5lIE9BU0lTX1VDT0RFX1ZFUlNfREFURSAgCSIyMDA2LzAzLzI3IDE1OjEwOjM3IgorI2RlZmluZSBPQVNJU19VQ09ERV9IT1NUSUZfSUQgIAkzCisKK3N0YXRpYyBzMzIgT051bVNlY3Rpb25zID0gMHgyOworc3RhdGljIHUzMiBPU2VjdGlvblNpemVbXSA9IHsKKwkweDAwMDA0MDAwLCAweDAwMDEwMDAwLAorfTsKKworc3RhdGljIHUzMiBPU2VjdGlvblN0YXJ0W10gPSB7CisJMHgwMDAwMDAwMCwgMHgwMDAwODAwMCwKK307CisKKyNkZWZpbmUgTU9KQVZFX1VDT0RFX1ZFUlNfU1RSSU5HCSIxLjIiCisjZGVmaW5lIE1PSkFWRV9VQ09ERV9WRVJTX0RBVEUgIAkiMjAwNi8wMy8yNyAxNToxMjoyMiIKKyNkZWZpbmUgTU9KQVZFX1VDT0RFX0hPU1RJRl9JRCAgCTMKKworc3RhdGljIHMzMiBNTnVtU2VjdGlvbnMgPSAweDI7CitzdGF0aWMgdTMyIE1TZWN0aW9uU2l6ZVtdID0KK3sKKwkweDAwMDA4MDAwLCAweDAwMDEwMDAwLAorfTsKKworc3RhdGljIHUzMiBNU2VjdGlvblN0YXJ0W10gPQoreworCTB4MDAwMDAwMDAsIDB4MDAwMDgwMDAsCit9OworCisjZGVmaW5lIEdCX1JDVlVDT0RFX1ZFUlNfU1RSSU5HCSIxLjIiCisjZGVmaW5lIEdCX1JDVlVDT0RFX1ZFUlNfREFURSAgCSIyMDA2LzAzLzI3IDE1OjEyOjE1Igorc3RhdGljIHUzMiBPYXNpc1JjdlVDb2RlTGVuID0gNTEyOworc3RhdGljIHUzMiBHQlJjdlVDb2RlTGVuID0gNTEyOworI2RlZmluZSBTRUNUSU9OX1NJWkUgNjU1MzYKIAogc3RydWN0IHNsaWNfc3BpbmxvY2sgewogCXNwaW5sb2NrX3QJbG9jazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWNvc3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWNvc3MuYwppbmRleCAwMDM5MDM2Li5iZjdkYThmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9zbGljb3NzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpY29zcy5jCkBAIC05NCw2ICs5NCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KIAorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L21paS5oPgpAQCAtMTA1LDE1ICsxMDYsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgInNsaWNpbmMuaCIKLSNpbmNsdWRlICJnYmRvd25sb2FkLmgiCi0jaW5jbHVkZSAiZ2JyY3Z1Y29kZS5oIgotI2luY2x1ZGUgIm9hc2lzcmN2dWNvZGUuaCIKLQotI2lmZGVmIERFQlVHX01JQ1JPQ09ERQotI2luY2x1ZGUgIm9hc2lzZGJnZG93bmxvYWQuaCIKLSNlbHNlCi0jaW5jbHVkZSAib2FzaXNkb3dubG9hZC5oIgotI2VuZGlmCiAKICNpZiBTTElDX0RVTVBfRU5BQkxFRAogI2luY2x1ZGUgInNsaWNkdW1wLmgiCkBAIC0zMjMsNyArMzE1LDcgQEAKIAlpbmRleCwgcHNsaWNfaGFuZGxlLCBhZGFwdGVyLT5wZnJlZV9zbGljX2hhbmRsZXMsIHBzbGljX2hhbmRsZS0+bmV4dCk7Ki8KIAlhZGFwdGVyLT5wc2htZW0gPSAoc3RydWN0IHNsaWNfc2htZW0gKikKIAkJCQkJcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWRhcHRlci0+cGNpZGV2LAotCQkJCQlzaXplb2Yoc3RydWN0IHNsaWNfc2htZW0gKiksCisJCQkJCXNpemVvZihzdHJ1Y3Qgc2xpY19zaG1lbSksCiAJCQkJCSZhZGFwdGVyLT4KIAkJCQkJcGh5c19zaG1lbSk7CiAvKgpAQCAtMTQzMSw3ICsxNDIzLDcgQEAKIAkJREJHX01TRygiYWRhcHRlclslcF0gcG9ydCAlZCBwc2htZW1bJXBdIEZyZWVTaG1lbSAiLAogCQkJYWRhcHRlciwgYWRhcHRlci0+cG9ydCwgKHZvaWQgKikgYWRhcHRlci0+cHNobWVtKTsKIAkJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wY2lkZXYsCi0JCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2xpY19zaG1lbSAqKSwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzbGljX3NobWVtKSwKIAkJCQkgICAgYWRhcHRlci0+cHNobWVtLCBhZGFwdGVyLT5waHlzX3NobWVtKTsKIAkJYWRhcHRlci0+cHNobWVtID0gTlVMTDsKIAkJYWRhcHRlci0+cGh5c19zaG1lbSA9IChkbWFfYWRkcl90KSBOVUxMOwpAQCAtMjE4Niw2ICsyMTc4LDkgQEAKIAogc3RhdGljIGludCBzbGljX2NhcmRfZG93bmxvYWRfZ2JyY3Yoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCiB7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKKwljb25zdCBjaGFyICpmaWxlID0gIiI7CisJaW50IHJldDsKIAlfX2lvbWVtIHN0cnVjdCBzbGljX3JlZ3MgKnNsaWNfcmVncyA9IGFkYXB0ZXItPnNsaWNfcmVnczsKIAl1MzIgY29kZWFkZHI7CiAJdW5zaWduZWQgY2hhciAqaW5zdHJ1Y3Rpb24gPSBOVUxMOwpAQCAtMjE5MywxMiArMjE4OCwzMiBAQAogCiAJc3dpdGNoIChhZGFwdGVyLT5kZXZpZCkgewogCWNhc2UgU0xJQ18yR0JfREVWSUNFX0lEOgotCQlpbnN0cnVjdGlvbiA9ICh1bnNpZ25lZCBjaGFyICopJk9hc2lzUmN2VUNvZGVbMF07Ci0JCXJjdnVjb2RlbGVuID0gT2FzaXNSY3ZVQ29kZUxlbjsKKwkJZmlsZSA9ICJvYXNpc19yY3YuYmluIjsKIAkJYnJlYWs7CiAJY2FzZSBTTElDXzFHQl9ERVZJQ0VfSUQ6Ci0JCWluc3RydWN0aW9uID0gKHVuc2lnbmVkIGNoYXIgKikmR0JSY3ZVQ29kZVswXTsKLQkJcmN2dWNvZGVsZW4gPSBHQlJjdlVDb2RlTGVuOworCQlmaWxlID0gImdiX3Jjdi5iaW4iOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlBU1NFUlQoMCk7CisJCWJyZWFrOworCX0KKworCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmaWxlLCAmYWRhcHRlci0+cGNpZGV2LT5kZXYpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTTElDT1NTOiBGYWlsZWQgdG8gbG9hZCBmaXJtd2FyZSAlc1xuIiwgZmlsZSk7CisJCXJldHVybiByZXQ7CisJfQorCisJaW5zdHJ1Y3Rpb24gPSAodW5zaWduZWQgY2hhciAqKWZ3LT5kYXRhOworCXJjdnVjb2RlbGVuID0gZnctPnNpemU7CisJc3dpdGNoIChhZGFwdGVyLT5kZXZpZCkgeworCWNhc2UgU0xJQ18yR0JfREVWSUNFX0lEOgorCQlpZiAocmN2dWNvZGVsZW4gIT0gT2FzaXNSY3ZVQ29kZUxlbikKKwkJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIFNMSUNfMUdCX0RFVklDRV9JRDoKKwkJaWYgKHJjdnVjb2RlbGVuICE9IEdCUmN2VUNvZGVMZW4pCisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQVNTRVJUKDApOwpAQCAtMjIyNSwxMyArMjI0MCwxNiBAQAogCX0KIAogCS8qIGRvd25sb2FkIGZpbmlzaGVkICovCisJcmVsZWFzZV9maXJtd2FyZShmdyk7CiAJV1JJVEVfUkVHKHNsaWNfcmVncy0+c2xpY19yY3Zfd2NzLCBTTElDX1JDVldDU19GSU5JU0gsIEZMVVNIKTsKLQogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHNsaWNfY2FyZF9kb3dubG9hZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKIHsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OworCWNvbnN0IGNoYXIgKmZpbGUgPSAiIjsKKwlpbnQgcmV0OwogCXUzMiBzZWN0aW9uOwogCWludCB0aGlzc2VjdGlvbnNpemU7CiAJaW50IGNvZGVhZGRyOwpAQCAtMjI1NSw2ICsyMjczLDcgQEAKIAljYXNlIFNMSUNfMkdCX0RFVklDRV9JRDoKIC8qICAgICAgREJHX01TRyAoInNsaWNvc3M6ICVzIGRldmlkPT1TTElDXzJHQl9ERVZJQ0VfSUQgc2VjdGlvbnNbJXhdXG4iLAogCV9fZnVuY19fLCAodWludCkgT051bVNlY3Rpb25zKTsgKi8KKwkJZmlsZSA9ICJzbGljX29hc2lzLmJpbiI7CiAJCW51bXNlY3RzID0gT051bVNlY3Rpb25zOwogCQlmb3IgKGkgPSAwOyBpIDwgbnVtc2VjdHM7IGkrKykgewogCQkJc2VjdHNpemVbaV0gPSBPU2VjdGlvblNpemVbaV07CkBAIC0yMjY0LDYgKzIyODMsNyBAQAogCWNhc2UgU0xJQ18xR0JfREVWSUNFX0lEOgogLyogICAgICAgICAgICAgIERCR19NU0cgKCJzbGljb3NzOiAlcyBkZXZpZD09U0xJQ18xR0JfREVWSUNFX0lEIHNlY3Rpb25zWyV4XVxuIiwKIAkJX19mdW5jX18sICh1aW50KSBNTnVtU2VjdGlvbnMpOyAqLworCQlmaWxlID0gInNsaWNfbW9qYXZlLmJpbiI7CiAJCW51bXNlY3RzID0gTU51bVNlY3Rpb25zOwogCQlmb3IgKGkgPSAwOyBpIDwgbnVtc2VjdHM7IGkrKykgewogCQkJc2VjdHNpemVbaV0gPSBNU2VjdGlvblNpemVbaV07CkBAIC0yMjc0LDI2ICsyMjk0LDMzIEBACiAJCUFTU0VSVCgwKTsKIAkJYnJlYWs7CiAJfQorCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmaWxlLCAmYWRhcHRlci0+cGNpZGV2LT5kZXYpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTTElDT1NTOiBGYWlsZWQgdG8gbG9hZCBmaXJtd2FyZSAlc1xuIiwgZmlsZSk7CisJCXJldHVybiByZXQ7CisJfQogCiAJQVNTRVJUKG51bXNlY3RzIDw9IDMpOwogCiAJZm9yIChzZWN0aW9uID0gMDsgc2VjdGlvbiA8IG51bXNlY3RzOyBzZWN0aW9uKyspIHsKIAkJc3dpdGNoIChhZGFwdGVyLT5kZXZpZCkgewogCQljYXNlIFNMSUNfMkdCX0RFVklDRV9JRDoKLQkJCWluc3RydWN0aW9uID0gKHUzMiAqKSAmT2FzaXNVQ29kZVtzZWN0aW9uXVswXTsKKwkJCWluc3RydWN0aW9uID0gKHUzMiAqKShmdy0+ZGF0YSArIChTRUNUSU9OX1NJWkUgKgorCQkJCQkJCQlzZWN0aW9uKSk7CiAJCQliYXNlYWRkcmVzcyA9IHNlY3RzdGFydFtzZWN0aW9uXTsKIAkJCXRoaXNzZWN0aW9uc2l6ZSA9IHNlY3RzaXplW3NlY3Rpb25dID4+IDM7CiAJCQlsYXN0aW5zdHJ1Y3QgPQotCQkJICAgICh1MzIgKikgJk9hc2lzVUNvZGVbc2VjdGlvbl1bc2VjdHNpemVbc2VjdGlvbl0gLQotCQkJCQkJCSAgICAgOF07CisJCQkgICAgKHUzMiAqKShmdy0+ZGF0YSArIChTRUNUSU9OX1NJWkUgKiBzZWN0aW9uKSArCisJCQkJCXNlY3RzaXplW3NlY3Rpb25dIC0gOCk7CiAJCQlicmVhazsKIAkJY2FzZSBTTElDXzFHQl9ERVZJQ0VfSUQ6Ci0JCQlpbnN0cnVjdGlvbiA9ICh1MzIgKikgJk1vamF2ZVVDb2RlW3NlY3Rpb25dWzBdOworCQkJaW5zdHJ1Y3Rpb24gPSAodTMyICopKGZ3LT5kYXRhICsgKFNFQ1RJT05fU0laRSAqCisJCQkJCQkJCXNlY3Rpb24pKTsKIAkJCWJhc2VhZGRyZXNzID0gc2VjdHN0YXJ0W3NlY3Rpb25dOwogCQkJdGhpc3NlY3Rpb25zaXplID0gc2VjdHNpemVbc2VjdGlvbl0gPj4gMzsKIAkJCWxhc3RpbnN0cnVjdCA9Ci0JCQkgICAgKHUzMiAqKSAmTW9qYXZlVUNvZGVbc2VjdGlvbl1bc2VjdHNpemVbc2VjdGlvbl0KLQkJCQkJCQkgICAgICAtIDhdOworCQkJICAgICh1MzIgKikoZnctPmRhdGEgKyAoU0VDVElPTl9TSVpFICogc2VjdGlvbikgKworCQkJCQlzZWN0c2l6ZVtzZWN0aW9uXSAtIDgpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlBU1NFUlQoMCk7CkBAIC0yMzI5LDEwICsyMzU2LDEyIEBACiAJZm9yIChzZWN0aW9uID0gMDsgc2VjdGlvbiA8IG51bXNlY3RzOyBzZWN0aW9uKyspIHsKIAkJc3dpdGNoIChhZGFwdGVyLT5kZXZpZCkgewogCQljYXNlIFNMSUNfMkdCX0RFVklDRV9JRDoKLQkJCWluc3RydWN0aW9uID0gKHUzMiAqKSZPYXNpc1VDb2RlW3NlY3Rpb25dWzBdOworCQkJaW5zdHJ1Y3Rpb24gPSAodTMyICopZnctPmRhdGEgKyAoU0VDVElPTl9TSVpFICoKKwkJCQkJCQkJc2VjdGlvbik7CiAJCQlicmVhazsKIAkJY2FzZSBTTElDXzFHQl9ERVZJQ0VfSUQ6Ci0JCQlpbnN0cnVjdGlvbiA9ICh1MzIgKikmTW9qYXZlVUNvZGVbc2VjdGlvbl1bMF07CisJCQlpbnN0cnVjdGlvbiA9ICh1MzIgKilmdy0+ZGF0YSArIChTRUNUSU9OX1NJWkUgKgorCQkJCQkJCQlzZWN0aW9uKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJQVNTRVJUKDApOwpAQCAtMjM3NCwxMyArMjQwMywxMyBAQAogCQkJCSAgICB0aGlzc2VjdGlvbnNpemVbJXhdIGZhaWx1cmVbJXhdXG4iLAogCQkJCSAgICAgX19mdW5jX18sIGNvZGVhZGRyLCB0aGlzc2VjdGlvbnNpemUsCiAJCQkJICAgICBmYWlsdXJlKTsKLQorCQkJCXJlbGVhc2VfZmlybXdhcmUoZncpOwogCQkJCXJldHVybiAtRUlPOwogCQkJfQogCQl9CiAJfQogLyogICAgREJHX01TRyAoInNsaWNvc3M6IENvbXBhcmUgZG9uZVxuIik7Ki8KLQorCXJlbGVhc2VfZmlybXdhcmUoZncpOwogCS8qIEV2ZXJ5dGhpbmcgT0ssIGtpY2sgb2ZmIHRoZSBjYXJkICovCiAJbWRlbGF5KDEwKTsKIAlXUklURV9SRUcoc2xpY19yZWdzLT5zbGljX3djcywgU0xJQ19XQ1NfU1RBUlQsIEZMVVNIKTsKQEAgLTI4MzIsOSArMjg2MSw4IEBACiAJfQogCWlmICghcGh5c2NhcmQpIHsKIAkJLyogbm8gc3RydWN0dXJlIGFsbG9jYXRlZCBmb3IgdGhpcyBwaHlzaWNhbCBjYXJkIHlldCAqLwotCQlwaHlzY2FyZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwaHlzY2FyZCAqKSwgR0ZQX0FUT01JQyk7CisJCXBoeXNjYXJkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBoeXNjYXJkKSwgR0ZQX0FUT01JQyk7CiAJCUFTU0VSVChwaHlzY2FyZCk7Ci0JCW1lbXNldChwaHlzY2FyZCwgMCwgc2l6ZW9mKHN0cnVjdCBwaHlzY2FyZCAqKSk7CiAKIAkJREJHX01TRwogCQkgICAgKCJcbiVzIEFsbG9jYXRlIGEgUEhZU0lDQUxjYXJkOlxuICAgIFBIWVNJQ0FMX0NhcmRbJXBdXG5cCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3hnL1JFQURNRSBiL2RyaXZlcnMvc3RhZ2luZy9zeGcvUkVBRE1FCmluZGV4IGQ1MTRkMTguLmU0MmYzNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zeGcvUkVBRE1FCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zeGcvUkVBRE1FCkBAIC0yLDggKzIsNiBAQAogTm9uLUFjY2VsZXJhdGVkIDEwR2JlIG5ldHdvcmsgZHJpdmVyLgogCiBUT0RPOgotCS0gbGluZGVudCB0aGUgY29kZQotCS0gcmVtb3ZlIHR5cGVkZWZzCiAJLSByZW1vdmUgd3JhcHBlcnMKIAktIGNoZWNrcGF0Y2gucGwgY2xlYW51cHMKIAktIG5ldyBmdW5jdGlvbmFsaXR5IHRoYXQgdGhlIGNhcmQgbmVlZHMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zeGcvc3hnLmMgYi9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Zy5jCmluZGV4IDUyNzJhMTguLjFlMGNmY2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zeGcvc3hnLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3N4Zy9zeGcuYwpAQCAtODAsMTMgKzgwLDEzIEBACiAjaW5jbHVkZSAic3hncGh5Y29kZS5oIgogI2luY2x1ZGUgInNhaGFyYWRiZ2Rvd25sb2FkLmgiCiAKLXN0YXRpYyBpbnQgc3hnX2FsbG9jYXRlX2J1ZmZlcl9tZW1vcnkocF9hZGFwdGVyX3QgYWRhcHRlciwgdTMyIFNpemUsCi0JCQkJICAgICAgU1hHX0JVRkZFUl9UWVBFIEJ1ZmZlclR5cGUpOwotc3RhdGljIHZvaWQgc3hnX2FsbG9jYXRlX3JjdmJsb2NrX2NvbXBsZXRlKHBfYWRhcHRlcl90IGFkYXB0ZXIsIHZvaWQgKlJjdkJsb2NrLAorc3RhdGljIGludCBzeGdfYWxsb2NhdGVfYnVmZmVyX21lbW9yeShzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLCB1MzIgU2l6ZSwKKwkJCQkgICAgICBlbnVtIFNYR19CVUZGRVJfVFlQRSBCdWZmZXJUeXBlKTsKK3N0YXRpYyB2b2lkIHN4Z19hbGxvY2F0ZV9yY3ZibG9ja19jb21wbGV0ZShzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLCB2b2lkICpSY3ZCbG9jaywKIAkJCQkJICAgZG1hX2FkZHJfdCBQaHlzaWNhbEFkZHJlc3MsCiAJCQkJCSAgIHUzMiBMZW5ndGgpOwotc3RhdGljIHZvaWQgc3hnX2FsbG9jYXRlX3NnbF9idWZmZXJfY29tcGxldGUocF9hZGFwdGVyX3QgYWRhcHRlciwKLQkJCQkJICAgICBQU1hHX1NDQVRURVJfR0FUSEVSIFN4Z1NnbCwKK3N0YXRpYyB2b2lkIHN4Z19hbGxvY2F0ZV9zZ2xfYnVmZmVyX2NvbXBsZXRlKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkJCSAgICAgc3RydWN0IFNYR19TQ0FUVEVSX0dBVEhFUiAqU3hnU2dsLAogCQkJCQkgICAgIGRtYV9hZGRyX3QgUGh5c2ljYWxBZGRyZXNzLAogCQkJCQkgICAgIHUzMiBMZW5ndGgpOwogCkBAIC05NiwxNyArOTYsMTcgQEAKIHN0YXRpYyBpbnQgc3hnX2VudHJ5X2hhbHQocF9uZXRfZGV2aWNlIGRldik7CiBzdGF0aWMgaW50IHN4Z19pb2N0bChwX25ldF9kZXZpY2UgZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKIHN0YXRpYyBpbnQgc3hnX3NlbmRfcGFja2V0cyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBwX25ldF9kZXZpY2UgZGV2KTsKLXN0YXRpYyBpbnQgc3hnX3RyYW5zbWl0X3BhY2tldChwX2FkYXB0ZXJfdCBhZGFwdGVyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLXN0YXRpYyB2b2lkIHN4Z19kdW1iX3NnbChQU0NBVFRFUl9HQVRIRVJfTElTVCBwU2dsLCBQU1hHX1NDQVRURVJfR0FUSEVSIFN4Z1NnbCk7CitzdGF0aWMgaW50IHN4Z190cmFuc21pdF9wYWNrZXQoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgdm9pZCBzeGdfZHVtYl9zZ2woc3RydWN0IFNDQVRURVJfR0FUSEVSX0xJU1QgKnBTZ2wsIHN0cnVjdCBTWEdfU0NBVFRFUl9HQVRIRVIgKlN4Z1NnbCk7CiAKLXN0YXRpYyB2b2lkIHN4Z19oYW5kbGVfaW50ZXJydXB0KHBfYWRhcHRlcl90IGFkYXB0ZXIpOwotc3RhdGljIGludCBzeGdfcHJvY2Vzc19pc3IocF9hZGFwdGVyX3QgYWRhcHRlciwgdTMyIE1lc3NhZ2VJZCk7Ci1zdGF0aWMgdTMyIHN4Z19wcm9jZXNzX2V2ZW50X3F1ZXVlKHBfYWRhcHRlcl90IGFkYXB0ZXIsIHUzMiBSc3NJZCk7Ci1zdGF0aWMgdm9pZCBzeGdfY29tcGxldGVfc2xvd19zZW5kKHBfYWRhcHRlcl90IGFkYXB0ZXIpOwotc3RhdGljIHN0cnVjdCBza19idWZmICpzeGdfc2xvd19yZWNlaXZlKHBfYWRhcHRlcl90IGFkYXB0ZXIsIFBTWEdfRVZFTlQgRXZlbnQpOwotc3RhdGljIHZvaWQgc3hnX3Byb2Nlc3NfcmN2X2Vycm9yKHBfYWRhcHRlcl90IGFkYXB0ZXIsIHUzMiBFcnJvclN0YXR1cyk7Ci1zdGF0aWMgYm9vbCBzeGdfbWFjX2ZpbHRlcihwX2FkYXB0ZXJfdCBhZGFwdGVyLAotCQkJICAgcF9ldGhlcl9oZWFkZXIgRXRoZXJIZHIsIHVzaG9ydCBsZW5ndGgpOworc3RhdGljIHZvaWQgc3hnX2hhbmRsZV9pbnRlcnJ1cHQoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcik7CitzdGF0aWMgaW50IHN4Z19wcm9jZXNzX2lzcihzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLCB1MzIgTWVzc2FnZUlkKTsKK3N0YXRpYyB1MzIgc3hnX3Byb2Nlc3NfZXZlbnRfcXVldWUoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwgdTMyIFJzc0lkKTsKK3N0YXRpYyB2b2lkIHN4Z19jb21wbGV0ZV9zbG93X3NlbmQoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcik7CitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnN4Z19zbG93X3JlY2VpdmUoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwgc3RydWN0IFNYR19FVkVOVCAqRXZlbnQpOworc3RhdGljIHZvaWQgc3hnX3Byb2Nlc3NfcmN2X2Vycm9yKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsIHUzMiBFcnJvclN0YXR1cyk7CitzdGF0aWMgYm9vbCBzeGdfbWFjX2ZpbHRlcihzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLAorCQkJICAgc3RydWN0IGV0aGVyX2hlYWRlciAqRXRoZXJIZHIsIHVzaG9ydCBsZW5ndGgpOwogCiAjaWYgU0xJQ19HRVRfU1RBVFNfRU5BQkxFRAogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzeGdfZ2V0X3N0YXRzKHBfbmV0X2RldmljZSBkZXYpOwpAQCAtMTE5LDIyICsxMTksMjIgQEAKIHN0YXRpYyB2b2lkIHN4Z19tY2FzdF9zZXRfbGlzdChwX25ldF9kZXZpY2UgZGV2KTsKICNlbmRpZgogCi1zdGF0aWMgdm9pZCBzeGdfYWRhcHRlcl9zZXRfaHdhZGRyKHBfYWRhcHRlcl90IGFkYXB0ZXIpOworc3RhdGljIHZvaWQgc3hnX2FkYXB0ZXJfc2V0X2h3YWRkcihzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyKTsKIAotc3RhdGljIHZvaWQgc3hnX3VubWFwX21taW9fc3BhY2UocF9hZGFwdGVyX3QgYWRhcHRlcik7CitzdGF0aWMgdm9pZCBzeGdfdW5tYXBfbW1pb19zcGFjZShzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyKTsKIAotc3RhdGljIGludCBzeGdfaW5pdGlhbGl6ZV9hZGFwdGVyKHBfYWRhcHRlcl90IGFkYXB0ZXIpOwotc3RhdGljIHZvaWQgc3hnX3N0b2NrX3Jjdl9idWZmZXJzKHBfYWRhcHRlcl90IGFkYXB0ZXIpOwotc3RhdGljIHZvaWQgc3hnX2NvbXBsZXRlX2Rlc2NyaXB0b3JfYmxvY2tzKHBfYWRhcHRlcl90IGFkYXB0ZXIsCitzdGF0aWMgaW50IHN4Z19pbml0aWFsaXplX2FkYXB0ZXIoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcik7CitzdGF0aWMgdm9pZCBzeGdfc3RvY2tfcmN2X2J1ZmZlcnMoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcik7CitzdGF0aWMgdm9pZCBzeGdfY29tcGxldGVfZGVzY3JpcHRvcl9ibG9ja3Moc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwKIAkJCQkJICAgdW5zaWduZWQgY2hhciBJbmRleCk7Ci1zdGF0aWMgaW50IHN4Z19pbml0aWFsaXplX2xpbmsocF9hZGFwdGVyX3QgYWRhcHRlcik7Ci1zdGF0aWMgaW50IHN4Z19waHlfaW5pdChwX2FkYXB0ZXJfdCBhZGFwdGVyKTsKLXN0YXRpYyB2b2lkIHN4Z19saW5rX2V2ZW50KHBfYWRhcHRlcl90IGFkYXB0ZXIpOwotc3RhdGljIFNYR19MSU5LX1NUQVRFIHN4Z19nZXRfbGlua19zdGF0ZShwX2FkYXB0ZXJfdCBhZGFwdGVyKTsKLXN0YXRpYyB2b2lkIHN4Z19saW5rX3N0YXRlKHBfYWRhcHRlcl90IGFkYXB0ZXIsIFNYR19MSU5LX1NUQVRFIExpbmtTdGF0ZSk7Ci1zdGF0aWMgaW50IHN4Z193cml0ZV9tZGlvX3JlZyhwX2FkYXB0ZXJfdCBhZGFwdGVyLAorc3RhdGljIGludCBzeGdfaW5pdGlhbGl6ZV9saW5rKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIpOworc3RhdGljIGludCBzeGdfcGh5X2luaXQoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcik7CitzdGF0aWMgdm9pZCBzeGdfbGlua19ldmVudChzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyKTsKK3N0YXRpYyBlbnVtIFNYR19MSU5LX1NUQVRFIHN4Z19nZXRfbGlua19zdGF0ZShzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyKTsKK3N0YXRpYyB2b2lkIHN4Z19saW5rX3N0YXRlKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsIGVudW0gU1hHX0xJTktfU1RBVEUgTGlua1N0YXRlKTsKK3N0YXRpYyBpbnQgc3hnX3dyaXRlX21kaW9fcmVnKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsCiAJCQkgICAgICB1MzIgRGV2QWRkciwgdTMyIFJlZ0FkZHIsIHUzMiBWYWx1ZSk7Ci1zdGF0aWMgaW50IHN4Z19yZWFkX21kaW9fcmVnKHBfYWRhcHRlcl90IGFkYXB0ZXIsCitzdGF0aWMgaW50IHN4Z19yZWFkX21kaW9fcmVnKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsCiAJCQkgICAgIHUzMiBEZXZBZGRyLCB1MzIgUmVnQWRkciwgdTMyICpwVmFsdWUpOwogCiBzdGF0aWMgdW5zaWduZWQgaW50IHN4Z19maXJzdF9pbml0ID0gMTsKQEAgLTE0NSw3ICsxNDUsNyBAQAogc3RhdGljIGludCBkZWJ1ZyA9IC0xOwogc3RhdGljIHBfbmV0X2RldmljZSBoZWFkX25ldGRldmljZSA9IE5VTEw7CiAKLXN0YXRpYyBzeGdiYXNlX2RyaXZlcl90IHN4Z19nbG9iYWwgPSB7CitzdGF0aWMgc3RydWN0IHN4Z2Jhc2VfZHJpdmVyX3Qgc3hnX2dsb2JhbCA9IHsKIAkuZHluYW1pY19pbnRhZ2cgPSAxLAogfTsKIHN0YXRpYyBpbnQgaW50YWdnX2RlbGF5ID0gMTAwOwpAQCAtMTg2LDcgKzE4Niw3IEBACiAJCW1iKCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzeGdfcmVnNjRfd3JpdGUocF9hZGFwdGVyX3QgYWRhcHRlciwgdm9pZCBfX2lvbWVtICpyZWcsCitzdGF0aWMgaW5saW5lIHZvaWQgc3hnX3JlZzY0X3dyaXRlKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsIHZvaWQgX19pb21lbSAqcmVnLAogCQkJCSAgIHU2NCB2YWx1ZSwgdTMyIGNwdSkKIHsKIAl1MzIgdmFsdWVfaGlnaCA9ICh1MzIpICh2YWx1ZSA+PiAzMik7CkBAIC0yMDksNyArMjA5LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHN4Z19kYmdfbWFjYWRkcnMocF9hZGFwdGVyX3QgYWRhcHRlcikKK3N0YXRpYyB2b2lkIHN4Z19kYmdfbWFjYWRkcnMoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcikKIHsKIAlEQkdfRVJST1IoIiAgKCVzKSBjdXJyICUyLjJYOiUyLjJYOiUyLjJYOiUyLjJYOiUyLjJYOiUyLjJYXG4iLAogCQkgIGFkYXB0ZXItPm5ldGRldi0+bmFtZSwgYWRhcHRlci0+Y3Vycm1hY2FkZHJbMF0sCkBAIC0yMjUsMTIgKzIyNSwxMiBAQAogfQogCiAvKiBTWEcgR2xvYmFscyAqLwotc3RhdGljIFNYR19EUklWRVIgU3hnRHJpdmVyOworc3RhdGljIHN0cnVjdCBTWEdfRFJJVkVSIFN4Z0RyaXZlcjsKIAogI2lmZGVmICBBVEtEQkcKLXN0YXRpYyBzeGdfdHJhY2VfYnVmZmVyX3QgTFN4Z1RyYWNlQnVmZmVyOworc3RhdGljIHN0cnVjdCBzeGdfdHJhY2VfYnVmZmVyX3QgTFN4Z1RyYWNlQnVmZmVyOwogI2VuZGlmIC8qIEFUS0RCRyAqLwotc3RhdGljIHN4Z190cmFjZV9idWZmZXJfdCAqU3hnVHJhY2VCdWZmZXIgPSBOVUxMOworc3RhdGljIHN0cnVjdCBzeGdfdHJhY2VfYnVmZmVyX3QgKlN4Z1RyYWNlQnVmZmVyID0gTlVMTDsKIAogLyoKICAqIHN4Z19kb3dubG9hZF9taWNyb2NvZGUKQEAgLTI0NCw5ICsyNDQsOSBAQAogICogUmV0dXJuCiAgKglpbnQKICAqLwotc3RhdGljIGJvb2wgc3hnX2Rvd25sb2FkX21pY3JvY29kZShwX2FkYXB0ZXJfdCBhZGFwdGVyLCBTWEdfVUNPREVfU0VMIFVjb2RlU2VsKQorc3RhdGljIGJvb2wgc3hnX2Rvd25sb2FkX21pY3JvY29kZShzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLCBlbnVtIFNYR19VQ09ERV9TRUwgVWNvZGVTZWwpCiB7Ci0JUFNYR19IV19SRUdTIEh3UmVncyA9IGFkYXB0ZXItPkh3UmVnczsKKwlzdHJ1Y3QgU1hHX0hXX1JFR1MgKkh3UmVncyA9IGFkYXB0ZXItPkh3UmVnczsKIAl1MzIgU2VjdGlvbjsKIAl1MzIgVGhpc1NlY3Rpb25TaXplOwogCXUzMiAqSW5zdHJ1Y3Rpb24gPSBOVUxMOwpAQCAtNDE2LDEzICs0MTYsMTMgQEAKICAqIFJldHVybgogICoJaW50CiAgKi8KLXN0YXRpYyBpbnQgc3hnX2FsbG9jYXRlX3Jlc291cmNlcyhwX2FkYXB0ZXJfdCBhZGFwdGVyKQorc3RhdGljIGludCBzeGdfYWxsb2NhdGVfcmVzb3VyY2VzKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIpCiB7CiAJaW50IHN0YXR1czsKIAl1MzIgaTsKIAl1MzIgUnNzSWRzLCBJc3JDb3VudDsKLS8qICAgICAgUFNYR19YTVRfUklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG10UmluZzsgKi8KLS8qICAgICAgUFNYR19SQ1ZfUklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmN2UmluZzsgKi8KKy8qICAgICAgc3RydWN0IFNYR19YTVRfUklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlhtdFJpbmc7ICovCisvKiAgICAgIHN0cnVjdCBTWEdfUkNWX1JJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpSY3ZSaW5nOyAqLwogCiAJREJHX0VSUk9SKCIlcyBFTlRFUlxuIiwgX19mdW5jX18pOwogCkBAIC00NjEsMTMgKzQ2MSwxMyBAQAogCiAJZm9yICg7OykgewogCQlEQkdfRVJST1IoIiVzIEFsbG9jYXRlIFhtdFJpbmdzIHNpemVbJXhdXG4iLCBfX2Z1bmNfXywKLQkJCSAgKHVuc2lnbmVkIGludCkoc2l6ZW9mKFNYR19YTVRfUklORykgKiAxKSk7CisJCQkgICh1bnNpZ25lZCBpbnQpKHNpemVvZihzdHJ1Y3QgU1hHX1hNVF9SSU5HKSAqIDEpKTsKIAogCQkvKiBTdGFydCB3aXRoIGJpZyBpdGVtcyBmaXJzdCAtIHJlY2VpdmUgYW5kIHRyYW5zbWl0IHJpbmdzLiAgQXQgdGhlIG1vbWVudCAqLwogCQkvKiBJJ20gZ29pbmcgdG8ga2VlcCB0aGUgcmluZyBzaXplIGZpeGVkIGFuZCBhZGp1c3QgdGhlIG51bWJlciBvZiAqLwogCQkvKiBUQ0JzIGlmIHdlIGZhaWwuICBMYXRlciB3ZSBtaWdodCBjb25zaWRlciByZWR1Y2luZyB0aGUgcmluZyBzaXplIGFzIHdlbGwuLiAqLwogCQlhZGFwdGVyLT5YbXRSaW5ncyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBjaWRldiwKLQkJCQkJCQkgc2l6ZW9mKFNYR19YTVRfUklORykgKgorCQkJCQkJCSBzaXplb2Yoc3RydWN0IFNYR19YTVRfUklORykgKgogCQkJCQkJCSAxLAogCQkJCQkJCSAmYWRhcHRlci0+UFhtdFJpbmdzKTsKIAkJREJHX0VSUk9SKCIlcyBYbXRSaW5nc1slcF1cbiIsIF9fZnVuY19fLCBhZGFwdGVyLT5YbXRSaW5ncyk7CkBAIC00NzUsMzMgKzQ3NSwzMyBAQAogCQlpZiAoIWFkYXB0ZXItPlhtdFJpbmdzKSB7CiAJCQlnb3RvIHBlcl90Y2JfYWxsb2NhdGlvbl9mYWlsZWQ7CiAJCX0KLQkJbWVtc2V0KGFkYXB0ZXItPlhtdFJpbmdzLCAwLCBzaXplb2YoU1hHX1hNVF9SSU5HKSAqIDEpOworCQltZW1zZXQoYWRhcHRlci0+WG10UmluZ3MsIDAsIHNpemVvZihzdHJ1Y3QgU1hHX1hNVF9SSU5HKSAqIDEpOwogCiAJCURCR19FUlJPUigiJXMgQWxsb2NhdGUgUmN2UmluZ3Mgc2l6ZVsleF1cbiIsIF9fZnVuY19fLAotCQkJICAodW5zaWduZWQgaW50KShzaXplb2YoU1hHX1JDVl9SSU5HKSAqIDEpKTsKKwkJCSAgKHVuc2lnbmVkIGludCkoc2l6ZW9mKHN0cnVjdCBTWEdfUkNWX1JJTkcpICogMSkpOwogCQlhZGFwdGVyLT5SY3ZSaW5ncyA9CiAJCSAgICBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wY2lkZXYsCi0JCQkJCSBzaXplb2YoU1hHX1JDVl9SSU5HKSAqIDEsCisJCQkJCSBzaXplb2Yoc3RydWN0IFNYR19SQ1ZfUklORykgKiAxLAogCQkJCQkgJmFkYXB0ZXItPlBSY3ZSaW5ncyk7CiAJCURCR19FUlJPUigiJXMgUmN2UmluZ3NbJXBdXG4iLCBfX2Z1bmNfXywgYWRhcHRlci0+UmN2UmluZ3MpOwogCQlpZiAoIWFkYXB0ZXItPlJjdlJpbmdzKSB7CiAJCQlnb3RvIHBlcl90Y2JfYWxsb2NhdGlvbl9mYWlsZWQ7CiAJCX0KLQkJbWVtc2V0KGFkYXB0ZXItPlJjdlJpbmdzLCAwLCBzaXplb2YoU1hHX1JDVl9SSU5HKSAqIDEpOworCQltZW1zZXQoYWRhcHRlci0+UmN2UmluZ3MsIDAsIHNpemVvZihzdHJ1Y3QgU1hHX1JDVl9SSU5HKSAqIDEpOwogCQlicmVhazsKIAogCSAgICAgIHBlcl90Y2JfYWxsb2NhdGlvbl9mYWlsZWQ6CiAJCS8qIGFuIGFsbG9jYXRpb24gZmFpbGVkLiAgRnJlZSBhbnkgc3VjY2Vzc2Z1bCBhbGxvY2F0aW9ucy4gKi8KIAkJaWYgKGFkYXB0ZXItPlhtdFJpbmdzKSB7CiAJCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBjaWRldiwKLQkJCQkJICAgIHNpemVvZihTWEdfWE1UX1JJTkcpICogNDA5NiwKKwkJCQkJICAgIHNpemVvZihzdHJ1Y3QgU1hHX1hNVF9SSU5HKSAqIDQwOTYsCiAJCQkJCSAgICBhZGFwdGVyLT5YbXRSaW5ncywKIAkJCQkJICAgIGFkYXB0ZXItPlBYbXRSaW5ncyk7CiAJCQlhZGFwdGVyLT5YbXRSaW5ncyA9IE5VTEw7CiAJCX0KIAkJaWYgKGFkYXB0ZXItPlJjdlJpbmdzKSB7CiAJCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBjaWRldiwKLQkJCQkJICAgIHNpemVvZihTWEdfUkNWX1JJTkcpICogNDA5NiwKKwkJCQkJICAgIHNpemVvZihzdHJ1Y3QgU1hHX1JDVl9SSU5HKSAqIDQwOTYsCiAJCQkJCSAgICBhZGFwdGVyLT5SY3ZSaW5ncywKIAkJCQkJICAgIGFkYXB0ZXItPlBSY3ZSaW5ncyk7CiAJCQlhZGFwdGVyLT5SY3ZSaW5ncyA9IE5VTEw7CkBAIC01MTcsNyArNTE3LDcgQEAKIAkvKiBTYW5pdHkgY2hlY2sgcmVjZWl2ZSBkYXRhIHN0cnVjdHVyZSBmb3JtYXQgKi8KIAlBU1NFUlQoKGFkYXB0ZXItPlJlY2VpdmVCdWZmZXJTaXplID09IFNYR19SQ1ZfREFUQV9CVUZGRVJfU0laRSkgfHwKIAkgICAgICAgKGFkYXB0ZXItPlJlY2VpdmVCdWZmZXJTaXplID09IFNYR19SQ1ZfSlVNQk9fQlVGRkVSX1NJWkUpKTsKLQlBU1NFUlQoc2l6ZW9mKFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DSykgPT0KKwlBU1NFUlQoc2l6ZW9mKHN0cnVjdCBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0spID09CiAJICAgICAgIFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DS19TSVpFKTsKIAogCS8qIEFsbG9jYXRlIHJlY2VpdmUgZGF0YSBidWZmZXJzLiAgV2UgYWxsb2NhdGUgYSBibG9jayBvZiBidWZmZXJzIGFuZCAqLwpAQCAtNTM5LDExICs1MzksMTEgQEAKIAl9CiAKIAlEQkdfRVJST1IoIiVzIEFsbG9jYXRlIEV2ZW50UmluZ3Mgc2l6ZVsleF1cbiIsIF9fZnVuY19fLAotCQkgICh1bnNpZ25lZCBpbnQpKHNpemVvZihTWEdfRVZFTlRfUklORykgKiBSc3NJZHMpKTsKKwkJICAodW5zaWduZWQgaW50KShzaXplb2Yoc3RydWN0IFNYR19FVkVOVF9SSU5HKSAqIFJzc0lkcykpOwogCiAJLyogQWxsb2NhdGUgZXZlbnQgcXVldWVzLiAqLwogCWFkYXB0ZXItPkV2ZW50UmluZ3MgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wY2lkZXYsCi0JCQkJCQkgICBzaXplb2YoU1hHX0VWRU5UX1JJTkcpICoKKwkJCQkJCSAgIHNpemVvZihzdHJ1Y3QgU1hHX0VWRU5UX1JJTkcpICoKIAkJCQkJCSAgIFJzc0lkcywKIAkJCQkJCSAgICZhZGFwdGVyLT5QRXZlbnRSaW5ncyk7CiAKQEAgLTU1NCw3ICs1NTQsNyBAQAogCQlzdGF0dXMgPSBTVEFUVVNfUkVTT1VSQ0VTOwogCQlnb3RvIHBlcl90Y2JfYWxsb2NhdGlvbl9mYWlsZWQ7CiAJfQotCW1lbXNldChhZGFwdGVyLT5FdmVudFJpbmdzLCAwLCBzaXplb2YoU1hHX0VWRU5UX1JJTkcpICogUnNzSWRzKTsKKwltZW1zZXQoYWRhcHRlci0+RXZlbnRSaW5ncywgMCwgc2l6ZW9mKHN0cnVjdCBTWEdfRVZFTlRfUklORykgKiBSc3NJZHMpOwogCiAJREJHX0VSUk9SKCIlcyBBbGxvY2F0ZSBJU1Igc2l6ZVsleF1cbiIsIF9fZnVuY19fLCBJc3JDb3VudCk7CiAJLyogQWxsb2NhdGUgSVNSICovCkBAIC02MjgsNyArNjI4LDcgQEAKIAlzdGF0aWMgaW50IGRpZF92ZXJzaW9uID0gMDsKIAlpbnQgZXJyOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7Ci0JcF9hZGFwdGVyX3QgYWRhcHRlcjsKKwlzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyOwogCXZvaWQgX19pb21lbSAqbWVtbWFwcGVkX2lvYWRkcjsKIAl1MzIgc3RhdHVzID0gMDsKIAl1bG9uZyBtbWlvX3N0YXJ0ID0gMDsKQEAgLTY4MSw3ICs2ODEsNyBAQAogCXBjaV9zZXRfbWFzdGVyKHBjaWRldik7CiAKIAlEQkdfRVJST1IoImNhbGwgYWxsb2NfZXRoZXJkZXZcbiIpOwotCW5ldGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihhZGFwdGVyX3QpKTsKKwluZXRkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGFkYXB0ZXJfdCkpOwogCWlmICghbmV0ZGV2KSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX291dF9leGl0X3N4Z19wcm9iZTsKQEAgLTg3MSw3ICs4NzEsNyBAQAogICogUmV0dXJuIFZhbHVlOgogICogCU5vbmUuCiAgKi8KLXN0YXRpYyB2b2lkIHN4Z19kaXNhYmxlX2ludGVycnVwdChwX2FkYXB0ZXJfdCBhZGFwdGVyKQorc3RhdGljIHZvaWQgc3hnX2Rpc2FibGVfaW50ZXJydXB0KHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIpCiB7CiAJU1hHX1RSQUNFKFRSQUNFX1NYRywgU3hnVHJhY2VCdWZmZXIsIFRSQUNFX05PSVNZLCAiRGlzSW50ciIsCiAJCSAgYWRhcHRlciwgYWRhcHRlci0+SW50ZXJydXB0c0VuYWJsZWQsIDAsIDApOwpAQCAtOTAyLDcgKzkwMiw3IEBACiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAJTm9uZS4KICAqLwotc3RhdGljIHZvaWQgc3hnX2VuYWJsZV9pbnRlcnJ1cHQocF9hZGFwdGVyX3QgYWRhcHRlcikKK3N0YXRpYyB2b2lkIHN4Z19lbmFibGVfaW50ZXJydXB0KHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIpCiB7CiAJU1hHX1RSQUNFKFRSQUNFX1NYRywgU3hnVHJhY2VCdWZmZXIsIFRSQUNFX05PSVNZLCAiRW5JbnRyIiwKIAkJICBhZGFwdGVyLCBhZGFwdGVyLT5JbnRlcnJ1cHRzRW5hYmxlZCwgMCwgMCk7CkBAIC05MzUsNyArOTM1LDcgQEAKIHN0YXRpYyBpcnFyZXR1cm5fdCBzeGdfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlwX25ldF9kZXZpY2UgZGV2ID0gKHBfbmV0X2RldmljZSkgZGV2X2lkOwotCXBfYWRhcHRlcl90IGFkYXB0ZXIgPSAocF9hZGFwdGVyX3QpIG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlcl90ICopIG5ldGRldl9wcml2KGRldik7CiAvKiAgICAgIHUzMiAgICAgICAgICAgICAgICAgQ3B1TWFzayA9IDAsIGk7ICovCiAKIAlhZGFwdGVyLT5TdGF0cy5OdW1JbnRzKys7CkBAIC05NjMsOCArOTYzLDggQEAKIAkJZm9yIChpID0gMDsKIAkJICAgICBpIDwgYWRhcHRlci0+UnNzU3lzdGVtSW5mby0+UHJvY2Vzc29ySW5mby5Sc3NDcHVDb3VudDsKIAkJICAgICBpKyspIHsKLQkJCVBTWEdfRVZFTlRfUklORyBFdmVudFJpbmcgPSAmYWRhcHRlci0+RXZlbnRSaW5nc1tpXTsKLQkJCVBTWEdfRVZFTlQgRXZlbnQgPQorCQkJc3RydWN0IFhHX0VWRU5UX1JJTkcgKkV2ZW50UmluZyA9ICZhZGFwdGVyLT5FdmVudFJpbmdzW2ldOworCQkJc3RydWN0IFNYR19FVkVOVCAqRXZlbnQgPQogCQkJICAgICZFdmVudFJpbmctPlJpbmdbYWRhcHRlci0+TmV4dEV2ZW50W2ldXTsKIAkJCXVuc2lnbmVkIGNoYXIgQ3B1ID0KIAkJCSAgICBhZGFwdGVyLT5Sc3NTeXN0ZW1JbmZvLT5Sc3NJZFRvQ3B1W2ldOwpAQCAtOTkyLDcgKzk5Miw3IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgdm9pZCBzeGdfaGFuZGxlX2ludGVycnVwdChwX2FkYXB0ZXJfdCBhZGFwdGVyKQorc3RhdGljIHZvaWQgc3hnX2hhbmRsZV9pbnRlcnJ1cHQoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcikKIHsKIC8qICAgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgIFJzc0lkICAgPSAwOyAqLwogCXUzMiBOZXdJc3I7CkBAIC0xMDU2LDcgKzEwNTYsNyBAQAogICogUmV0dXJuIFZhbHVlOgogICogCU5vbmUKICAqLwotc3RhdGljIGludCBzeGdfcHJvY2Vzc19pc3IocF9hZGFwdGVyX3QgYWRhcHRlciwgdTMyIE1lc3NhZ2VJZCkKK3N0YXRpYyBpbnQgc3hnX3Byb2Nlc3NfaXNyKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsIHUzMiBNZXNzYWdlSWQpCiB7CiAJdTMyIElzciA9IGFkYXB0ZXItPklzckNvcHlbTWVzc2FnZUlkXTsKIAl1MzIgTmV3SXNyID0gMDsKQEAgLTExNTMsMTAgKzExNTMsMTAgQEAKICAqIFJldHVybiBWYWx1ZToKICAqIAlOb25lLgogICovCi1zdGF0aWMgdTMyIHN4Z19wcm9jZXNzX2V2ZW50X3F1ZXVlKHBfYWRhcHRlcl90IGFkYXB0ZXIsIHUzMiBSc3NJZCkKK3N0YXRpYyB1MzIgc3hnX3Byb2Nlc3NfZXZlbnRfcXVldWUoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwgdTMyIFJzc0lkKQogewotCVBTWEdfRVZFTlRfUklORyBFdmVudFJpbmcgPSAmYWRhcHRlci0+RXZlbnRSaW5nc1tSc3NJZF07Ci0JUFNYR19FVkVOVCBFdmVudCA9ICZFdmVudFJpbmctPlJpbmdbYWRhcHRlci0+TmV4dEV2ZW50W1Jzc0lkXV07CisJc3RydWN0IFNYR19FVkVOVF9SSU5HICpFdmVudFJpbmcgPSAmYWRhcHRlci0+RXZlbnRSaW5nc1tSc3NJZF07CisJc3RydWN0IFNYR19FVkVOVCAqRXZlbnQgPSAmRXZlbnRSaW5nLT5SaW5nW2FkYXB0ZXItPk5leHRFdmVudFtSc3NJZF1dOwogCXUzMiBFdmVudHNQcm9jZXNzZWQgPSAwLCBCYXRjaGVzID0gMDsKIAl1MzIgbnVtX3NrYnMgPSAwOwogCXN0cnVjdCBza19idWZmICpza2I7CkBAIC0xMTY0LDcgKzExNjQsNyBAQAogCXN0cnVjdCBza19idWZmICpwcmV2X3NrYiA9IE5VTEw7CiAJc3RydWN0IHNrX2J1ZmYgKkluZGljYXRpb25MaXN0W1NYR19SQ1ZfQVJSQVlTSVpFXTsKIAl1MzIgSW5kZXg7Ci0JUFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSIFJjdkRhdGFCdWZmZXJIZHI7CisJc3RydWN0IFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSICpSY3ZEYXRhQnVmZmVySGRyOwogI2VuZGlmCiAJdTMyIFJldHVyblN0YXR1cyA9IDA7CiAKQEAgLTEyOTMsMTIgKzEyOTMsMTIgQEAKICAqIFJldHVybgogICoJTm9uZQogICovCi1zdGF0aWMgdm9pZCBzeGdfY29tcGxldGVfc2xvd19zZW5kKHBfYWRhcHRlcl90IGFkYXB0ZXIpCitzdGF0aWMgdm9pZCBzeGdfY29tcGxldGVfc2xvd19zZW5kKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIpCiB7Ci0JUFNYR19YTVRfUklORyBYbXRSaW5nID0gJmFkYXB0ZXItPlhtdFJpbmdzWzBdOwotCVBTWEdfUklOR19JTkZPIFhtdFJpbmdJbmZvID0gJmFkYXB0ZXItPlhtdFJpbmdaZXJvSW5mbzsKKwlzdHJ1Y3QgU1hHX1hNVF9SSU5HICpYbXRSaW5nID0gJmFkYXB0ZXItPlhtdFJpbmdzWzBdOworCXN0cnVjdCBTWEdfUklOR19JTkZPICpYbXRSaW5nSW5mbyA9ICZhZGFwdGVyLT5YbXRSaW5nWmVyb0luZm87CiAJdTMyICpDb250ZXh0VHlwZTsKLQlQU1hHX0NNRCBYbXRDbWQ7CisJc3RydWN0IFNYR19DTUQgKlhtdENtZDsKIAogCS8qIE5PVEUgLSBUaGlzIGxvY2sgaXMgZHJvcHBlZCBhbmQgcmVncmFiYmVkIGluIHRoaXMgbG9vcC4gKi8KIAkvKiBUaGlzIG1lYW5zIHR3byBkaWZmZXJlbnQgcHJvY2Vzc29ycyBjYW4gYm90aCBiZSBydW5uaW5nICovCkBAIC0xMzU5LDEyICsxMzU5LDEyIEBACiAgKiBSZXR1cm4KICAqCSBza2IKICAqLwotc3RhdGljIHN0cnVjdCBza19idWZmICpzeGdfc2xvd19yZWNlaXZlKHBfYWRhcHRlcl90IGFkYXB0ZXIsIFBTWEdfRVZFTlQgRXZlbnQpCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnN4Z19zbG93X3JlY2VpdmUoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwgc3RydWN0IFNYR19FVkVOVCAqRXZlbnQpCiB7Ci0JUFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSIFJjdkRhdGFCdWZmZXJIZHI7CisJc3RydWN0IFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSICpSY3ZEYXRhQnVmZmVySGRyOwogCXN0cnVjdCBza19idWZmICpQYWNrZXQ7CiAKLQlSY3ZEYXRhQnVmZmVySGRyID0gKFBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUikgRXZlbnQtPkhvc3RIYW5kbGU7CisJUmN2RGF0YUJ1ZmZlckhkciA9IChzdHJ1Y3QgU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFIqKSBFdmVudC0+SG9zdEhhbmRsZTsKIAlBU1NFUlQoUmN2RGF0YUJ1ZmZlckhkcik7CiAJQVNTRVJUKFJjdkRhdGFCdWZmZXJIZHItPlN0YXRlID09IFNYR19CVUZGRVJfT05DQVJEKTsKIAlBU1NFUlQoU1hHX1JFQ0VJVkVfREFUQV9MT0NBVElPTihSY3ZEYXRhQnVmZmVySGRyKSA9PQpAQCAtMTQwMCw3ICsxNDAwLDcgQEAKIAl9CiAjaWYgWFhYVE9ETwkJCS8qIFZMQU4gc3R1ZmYgKi8KIAkvKiBJZiB0aGVyZSdzIGEgVkxBTiB0YWcsIGV4dHJhY3QgaXQgYW5kIHZhbGlkYXRlIGl0ICovCi0JaWYgKCgocF9ldGhlcl9oZWFkZXIpIChTWEdfUkVDRUlWRV9EQVRBX0xPQ0FUSU9OKFJjdkRhdGFCdWZmZXJIZHIpKSktPgorCWlmICgoKHN0cnVjdCBldGhlcl9oZWFkZXIqKSAoU1hHX1JFQ0VJVkVfREFUQV9MT0NBVElPTihSY3ZEYXRhQnVmZmVySGRyKSkpLT4KIAkgICAgRXRoZXJUeXBlID09IEVUSEVSVFlQRV9WTEFOKSB7CiAJCWlmIChTeGdFeHRyYWN0VmxhbkhlYWRlcihhZGFwdGVyLCBSY3ZEYXRhQnVmZmVySGRyLCBFdmVudCkgIT0KIAkJICAgIFNUQVRVU19TVUNDRVNTKSB7CkBAIC0xNDE1LDcgKzE0MTUsNyBAQAogCS8qICovCiAJLyogRHVtYi1uaWMgZnJhbWUuICBTZWUgaWYgaXQgcGFzc2VzIG91ciBtYWMgZmlsdGVyIGFuZCB1cGRhdGUgc3RhdHMgKi8KIAkvKiAqLwotCWlmICghc3hnX21hY19maWx0ZXIoYWRhcHRlciwgKHBfZXRoZXJfaGVhZGVyKQorCWlmICghc3hnX21hY19maWx0ZXIoYWRhcHRlciwgKHN0cnVjdCBldGhlcl9oZWFkZXIqKQogCQkJICAgIFNYR19SRUNFSVZFX0RBVEFfTE9DQVRJT04oUmN2RGF0YUJ1ZmZlckhkciksCiAJCQkgICAgRXZlbnQtPkxlbmd0aCkpIHsKIAkJU1hHX1RSQUNFKFRSQUNFX1NYRywgU3hnVHJhY2VCdWZmZXIsIFRSQUNFX05PSVNZLCAiUmN2RmlsdHIiLApAQCAtMTQ1Niw3ICsxNDU2LDcgQEAKICAqIFJldHVybiBWYWx1ZToKICAqIAlOb25lCiAgKi8KLXN0YXRpYyB2b2lkIHN4Z19wcm9jZXNzX3Jjdl9lcnJvcihwX2FkYXB0ZXJfdCBhZGFwdGVyLCB1MzIgRXJyb3JTdGF0dXMpCitzdGF0aWMgdm9pZCBzeGdfcHJvY2Vzc19yY3ZfZXJyb3Ioc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwgdTMyIEVycm9yU3RhdHVzKQogewogCXUzMiBFcnJvcjsKIApAQCAtMTUzNSw3ICsxNTM1LDcgQEAKICAqIFJldHVybiBWYWx1ZToKICAqIAlUUlVFIGlmIHRoZSBmcmFtZSBpcyB0byBiZSBhbGxvd2VkCiAgKi8KLXN0YXRpYyBib29sIHN4Z19tYWNfZmlsdGVyKHBfYWRhcHRlcl90IGFkYXB0ZXIsIHBfZXRoZXJfaGVhZGVyIEV0aGVySGRyLAorc3RhdGljIGJvb2wgc3hnX21hY19maWx0ZXIoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwgc3RydWN0IGV0aGVyX2hlYWRlciAqRXRoZXJIZHIsCiAJCQkgICB1c2hvcnQgbGVuZ3RoKQogewogCWJvb2wgRXF1YWxBZGRyOwpAQCAtMTU2MCw3ICsxNTYwLDcgQEAKIAkJCQlyZXR1cm4gKFRSVUUpOwogCQkJfQogCQkJaWYgKGFkYXB0ZXItPk1hY0ZpbHRlciAmIE1BQ19NQ0FTVCkgewotCQkJCVBTWEdfTVVMVElDQVNUX0FERFJFU1MgTXVsdGljYXN0QWRkcnMgPQorCQkJCXN0cnVjdCBTWEdfTVVMVElDQVNUX0FERFJFU1MgKk11bHRpY2FzdEFkZHJzID0KIAkJCQkgICAgYWRhcHRlci0+TXVsdGljYXN0QWRkcnM7CiAJCQkJd2hpbGUgKE11bHRpY2FzdEFkZHJzKSB7CiAJCQkJCUVUSEVSX0VRX0FERFIoTXVsdGljYXN0QWRkcnMtPkFkZHJlc3MsCkBAIC0xNjAwLDcgKzE2MDAsNyBAQAogCXJldHVybiAoRkFMU0UpOwogfQogCi1zdGF0aWMgaW50IHN4Z19yZWdpc3Rlcl9pbnRlcnJ1cHQocF9hZGFwdGVyX3QgYWRhcHRlcikKK3N0YXRpYyBpbnQgc3hnX3JlZ2lzdGVyX2ludGVycnVwdChzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyKQogewogCWlmICghYWRhcHRlci0+aW50cnJlZ2lzdGVyZWQpIHsKIAkJaW50IHJldHZhbDsKQEAgLTE2MzUsNyArMTYzNSw3IEBACiAJcmV0dXJuIChTVEFUVVNfU1VDQ0VTUyk7CiB9CiAKLXN0YXRpYyB2b2lkIHN4Z19kZXJlZ2lzdGVyX2ludGVycnVwdChwX2FkYXB0ZXJfdCBhZGFwdGVyKQorc3RhdGljIHZvaWQgc3hnX2RlcmVnaXN0ZXJfaW50ZXJydXB0KHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIpCiB7CiAJREJHX0VSUk9SKCJzeGc6ICVzIEVOVEVSIGFkYXB0ZXJbJXBdXG4iLCBfX2Z1bmNfXywgYWRhcHRlcik7CiAjaWYgWFhYVE9ETwpAQCAtMTY2MSw3ICsxNjYxLDcgQEAKICAqICBQZXJmb3JtIGluaXRpYWxpemF0aW9uIG9mIG91ciBzbGljIGludGVyZmFjZS4KICAqCiAgKi8KLXN0YXRpYyBpbnQgc3hnX2lmX2luaXQocF9hZGFwdGVyX3QgYWRhcHRlcikKK3N0YXRpYyBpbnQgc3hnX2lmX2luaXQoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlcikKIHsKIAlwX25ldF9kZXZpY2UgZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwogCWludCBzdGF0dXMgPSAwOwpAQCAtMTcyMSw3ICsxNzIxLDcgQEAKIAogc3RhdGljIGludCBzeGdfZW50cnlfb3BlbihwX25ldF9kZXZpY2UgZGV2KQogewotCXBfYWRhcHRlcl90IGFkYXB0ZXIgPSAocF9hZGFwdGVyX3QpIG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlcl90ICopIG5ldGRldl9wcml2KGRldik7CiAJaW50IHN0YXR1czsKIAogCUFTU0VSVChhZGFwdGVyKTsKQEAgLTE3NzcsNyArMTc3Nyw3IEBACiAJcF9uZXRfZGV2aWNlIGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lkZXYpOwogCXUzMiBtbWlvX3N0YXJ0ID0gMDsKIAl1bnNpZ25lZCBpbnQgbW1pb19sZW4gPSAwOwotCXBfYWRhcHRlcl90IGFkYXB0ZXIgPSAocF9hZGFwdGVyX3QpIG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlcl90ICopIG5ldGRldl9wcml2KGRldik7CiAKIAlBU1NFUlQoYWRhcHRlcik7CiAJREJHX0VSUk9SKCJzeGc6ICVzIEVOVEVSIGRldlslcF0gYWRhcHRlclslcF1cbiIsIF9fZnVuY19fLCBkZXYsCkBAIC0xODA1LDcgKzE4MDUsNyBAQAogCiBzdGF0aWMgaW50IHN4Z19lbnRyeV9oYWx0KHBfbmV0X2RldmljZSBkZXYpCiB7Ci0JcF9hZGFwdGVyX3QgYWRhcHRlciA9IChwX2FkYXB0ZXJfdCkgbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyX3QgKikgbmV0ZGV2X3ByaXYoZGV2KTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZzeGdfZ2xvYmFsLmRyaXZlcl9sb2NrLCBzeGdfZ2xvYmFsLmZsYWdzKTsKIAlEQkdfRVJST1IoInN4ZzogJXMgKCVzKSBFTlRFUlxuIiwgX19mdW5jX18sIGRldi0+bmFtZSk7CkBAIC0xODMwLDcgKzE4MzAsNyBAQAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBTSU9DU0xJQ1NFVElOVEFHRzoKIAkJewotLyogICAgICAgICAgICAgICAgICAgICAgcF9hZGFwdGVyX3QgYWRhcHRlciA9IChwX2FkYXB0ZXJfdCkgbmV0ZGV2X3ByaXYoZGV2KTsgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXJfdCAqKSBuZXRkZXZfcHJpdihkZXYpOyAqLwogCQkJdTMyIGRhdGFbN107CiAJCQl1MzIgaW50YWdnOwogCkBAIC0xODY4LDcgKzE4NjgsNyBAQAogICovCiBzdGF0aWMgaW50IHN4Z19zZW5kX3BhY2tldHMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgcF9uZXRfZGV2aWNlIGRldikKIHsKLQlwX2FkYXB0ZXJfdCBhZGFwdGVyID0gKHBfYWRhcHRlcl90KSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXJfdCAqKSBuZXRkZXZfcHJpdihkZXYpOwogCXUzMiBzdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKIAogCURCR19FUlJPUigic3hnOiAlcyBFTlRFUiBzeGdfc2VuZF9wYWNrZXRzIHNrYlslcF1cbiIsIF9fZnVuY19fLApAQCAtMTkzNCwxMCArMTkzNCwxMCBAQAogICogUmV0dXJuIC0KICAqIAkJU1RBVFVTIG9mIHNlbmQKICAqLwotc3RhdGljIGludCBzeGdfdHJhbnNtaXRfcGFja2V0KHBfYWRhcHRlcl90IGFkYXB0ZXIsIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgaW50IHN4Z190cmFuc21pdF9wYWNrZXQoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlQU0NBVFRFUl9HQVRIRVJfTElTVCBwU2dsOwotCVBTWEdfU0NBVFRFUl9HQVRIRVIgU3hnU2dsOworCXN0cnVjdCBTQ0FUVEVSX0dBVEhFUl9MSVNUICpwU2dsOworCXN0cnVjdCBTWEdfU0NBVFRFUl9HQVRIRVIgKlN4Z1NnbDsKIAl2b2lkICpTZ2xCdWZmZXI7CiAJdTMyIFNnbEJ1ZmZlckxlbmd0aDsKIApAQCAtMTk4MCwxNCArMTk4MCwxNCBAQAogICogUmV0dXJuIFZhbHVlOgogICogCU5vbmUuCiAgKi8KLXN0YXRpYyB2b2lkIHN4Z19kdW1iX3NnbChQU0NBVFRFUl9HQVRIRVJfTElTVCBwU2dsLCBQU1hHX1NDQVRURVJfR0FUSEVSIFN4Z1NnbCkKK3N0YXRpYyB2b2lkIHN4Z19kdW1iX3NnbChzdHJ1Y3QgU0NBVFRFUl9HQVRIRVJfTElTVCAqcFNnbCwgc3RydWN0IFNYR19TQ0FUVEVSX0dBVEhFUiAqU3hnU2dsKQogewotCXBfYWRhcHRlcl90IGFkYXB0ZXIgPSBTeGdTZ2wtPmFkYXB0ZXI7CisJc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciA9IFN4Z1NnbC0+YWRhcHRlcjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gU3hnU2dsLT5EdW1iUGFja2V0OwogCS8qIEZvciBub3csIGFsbCBkdW1iLW5pYyBzZW5kcyBnbyBvbiBSU1MgcXVldWUgemVybyAqLwotCVBTWEdfWE1UX1JJTkcgWG10UmluZyA9ICZhZGFwdGVyLT5YbXRSaW5nc1swXTsKLQlQU1hHX1JJTkdfSU5GTyBYbXRSaW5nSW5mbyA9ICZhZGFwdGVyLT5YbXRSaW5nWmVyb0luZm87Ci0JUFNYR19DTUQgWG10Q21kID0gTlVMTDsKKwlzdHJ1Y3QgU1hHX1hNVF9SSU5HICpYbXRSaW5nID0gJmFkYXB0ZXItPlhtdFJpbmdzWzBdOworCXN0cnVjdCBTWEdfUklOR19JTkZPICpYbXRSaW5nSW5mbyA9ICZhZGFwdGVyLT5YbXRSaW5nWmVyb0luZm87CisJc3RydWN0IFNYR19DTUQgKlhtdENtZCA9IE5VTEw7CiAvKiAgICAgIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleCA9IDA7ICovCiAJdTMyIERhdGFMZW5ndGggPSBza2ItPmxlbjsKIC8qICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZkxlbjsgKi8KQEAgLTIxMTcsOSArMjExNyw5IEBACiAgKiBSZXR1cm4KICAqCXN0YXR1cwogICovCi1zdGF0aWMgaW50IHN4Z19pbml0aWFsaXplX2xpbmsocF9hZGFwdGVyX3QgYWRhcHRlcikKK3N0YXRpYyBpbnQgc3hnX2luaXRpYWxpemVfbGluayhzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyKQogewotCVBTWEdfSFdfUkVHUyBId1JlZ3MgPSBhZGFwdGVyLT5Id1JlZ3M7CisJc3RydWN0IFNYR19IV19SRUdTICpId1JlZ3MgPSBhZGFwdGVyLT5Id1JlZ3M7CiAJdTMyIFZhbHVlOwogCXUzMiBDb25maWdEYXRhOwogCXUzMiBNYXhGcmFtZTsKQEAgLTIyNzQsMTAgKzIyNzQsMTAgQEAKICAqIFJldHVybgogICoJc3RhdHVzCiAgKi8KLXN0YXRpYyBpbnQgc3hnX3BoeV9pbml0KHBfYWRhcHRlcl90IGFkYXB0ZXIpCitzdGF0aWMgaW50IHN4Z19waHlfaW5pdChzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyKQogewogCXUzMiBWYWx1ZTsKLQlQUEhZX1VDT0RFIHA7CisJc3RydWN0IFBIWV9VQ09ERSAqcDsKIAlpbnQgc3RhdHVzOwogCiAJREJHX0VSUk9SKCJFTlRFUiAlc1xuIiwgX19mdW5jX18pOwpAQCAtMjMyMiwxMCArMjMyMiwxMCBAQAogICogUmV0dXJuCiAgKglOb25lCiAgKi8KLXN0YXRpYyB2b2lkIHN4Z19saW5rX2V2ZW50KHBfYWRhcHRlcl90IGFkYXB0ZXIpCitzdGF0aWMgdm9pZCBzeGdfbGlua19ldmVudChzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyKQogewotCVBTWEdfSFdfUkVHUyBId1JlZ3MgPSBhZGFwdGVyLT5Id1JlZ3M7Ci0JU1hHX0xJTktfU1RBVEUgTGlua1N0YXRlOworCXN0cnVjdCBTWEdfSFdfUkVHUyAqSHdSZWdzID0gYWRhcHRlci0+SHdSZWdzOworCWVudW0gU1hHX0xJTktfU1RBVEUgTGlua1N0YXRlOwogCWludCBzdGF0dXM7CiAJdTMyIFZhbHVlOwogCkBAIC0yMzc5LDcgKzIzNzksNyBAQAogICogUmV0dXJuCiAgKglMaW5rIFN0YXRlCiAgKi8KLXN0YXRpYyBTWEdfTElOS19TVEFURSBzeGdfZ2V0X2xpbmtfc3RhdGUocF9hZGFwdGVyX3QgYWRhcHRlcikKK3N0YXRpYyBlbnVtIFNYR19MSU5LX1NUQVRFIHN4Z19nZXRfbGlua19zdGF0ZShzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyKQogewogCWludCBzdGF0dXM7CiAJdTMyIFZhbHVlOwpAQCAtMjQzMyw4ICsyNDMzLDggQEAKIAlyZXR1cm4gKFNYR19MSU5LX0RPV04pOwogfQogCi1zdGF0aWMgdm9pZCBzeGdfaW5kaWNhdGVfbGlua19zdGF0ZShwX2FkYXB0ZXJfdCBhZGFwdGVyLAotCQkJCSAgICBTWEdfTElOS19TVEFURSBMaW5rU3RhdGUpCitzdGF0aWMgdm9pZCBzeGdfaW5kaWNhdGVfbGlua19zdGF0ZShzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLAorCQkJCSAgICBlbnVtIFNYR19MSU5LX1NUQVRFIExpbmtTdGF0ZSkKIHsKIAlpZiAoYWRhcHRlci0+TGlua1N0YXRlID09IFNYR19MSU5LX1VQKSB7CiAJCURCR19FUlJPUigiJXM6IExJTksgbm93IFVQLCBjYWxsIG5ldGlmX3N0YXJ0X3F1ZXVlXG4iLApAQCAtMjQ2MCw3ICsyNDYwLDcgQEAKICAqIFJldHVybgogICoJTm9uZQogICovCi1zdGF0aWMgdm9pZCBzeGdfbGlua19zdGF0ZShwX2FkYXB0ZXJfdCBhZGFwdGVyLCBTWEdfTElOS19TVEFURSBMaW5rU3RhdGUpCitzdGF0aWMgdm9pZCBzeGdfbGlua19zdGF0ZShzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLCBlbnVtIFNYR19MSU5LX1NUQVRFIExpbmtTdGF0ZSkKIHsKIAlTWEdfVFJBQ0UoVFJBQ0VfU1hHLCBTeGdUcmFjZUJ1ZmZlciwgVFJBQ0VfSU1QT1JUQU5ULCAiTG5rSU5EQ1QiLAogCQkgIGFkYXB0ZXIsIExpbmtTdGF0ZSwgYWRhcHRlci0+TGlua1N0YXRlLCBhZGFwdGVyLT5TdGF0ZSk7CkBAIC0yNDk4LDEwICsyNDk4LDEwIEBACiAgKiBSZXR1cm4KICAqCXN0YXR1cwogICovCi1zdGF0aWMgaW50IHN4Z193cml0ZV9tZGlvX3JlZyhwX2FkYXB0ZXJfdCBhZGFwdGVyLAorc3RhdGljIGludCBzeGdfd3JpdGVfbWRpb19yZWcoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwKIAkJCSAgICAgIHUzMiBEZXZBZGRyLCB1MzIgUmVnQWRkciwgdTMyIFZhbHVlKQogewotCVBTWEdfSFdfUkVHUyBId1JlZ3MgPSBhZGFwdGVyLT5Id1JlZ3M7CisJc3RydWN0IFNYR19IV19SRUdTICpId1JlZ3MgPSBhZGFwdGVyLT5Id1JlZ3M7CiAJdTMyIEFkZHJPcDsJCS8qIEFkZHJlc3Mgb3BlcmF0aW9uICh3cml0dGVuIHRvIE1JSU0gZmllbGQgcmVnKSAqLwogCXUzMiBXcml0ZU9wOwkJLyogV3JpdGUgb3BlcmF0aW9uICh3cml0dGVuIHRvIE1JSU0gZmllbGQgcmVnKSAqLwogCXUzMiBDbWQ7CQkvKiBDb21tYW5kICh3cml0dGVuIHRvIE1JSU0gY29tbWFuZCByZWcpICovCkBAIC0yNTg4LDEwICsyNTg4LDEwIEBACiAgKiBSZXR1cm4KICAqCXN0YXR1cwogICovCi1zdGF0aWMgaW50IHN4Z19yZWFkX21kaW9fcmVnKHBfYWRhcHRlcl90IGFkYXB0ZXIsCitzdGF0aWMgaW50IHN4Z19yZWFkX21kaW9fcmVnKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsCiAJCQkgICAgIHUzMiBEZXZBZGRyLCB1MzIgUmVnQWRkciwgdTMyICpwVmFsdWUpCiB7Ci0JUFNYR19IV19SRUdTIEh3UmVncyA9IGFkYXB0ZXItPkh3UmVnczsKKwlzdHJ1Y3QgU1hHX0hXX1JFR1MgKkh3UmVncyA9IGFkYXB0ZXItPkh3UmVnczsKIAl1MzIgQWRkck9wOwkJLyogQWRkcmVzcyBvcGVyYXRpb24gKHdyaXR0ZW4gdG8gTUlJTSBmaWVsZCByZWcpICovCiAJdTMyIFJlYWRPcDsJCS8qIFJlYWQgb3BlcmF0aW9uICh3cml0dGVuIHRvIE1JSU0gZmllbGQgcmVnKSAqLwogCXUzMiBDbWQ7CQkvKiBDb21tYW5kICh3cml0dGVuIHRvIE1JSU0gY29tbWFuZCByZWcpICovCkBAIC0yNzM1LDkgKzI3MzUsOSBAQAogCXJldHVybiAobWFjaGFzaCk7CiB9CiAKLXN0YXRpYyB2b2lkIHN4Z19tY2FzdF9zZXRfbWFzayhwX2FkYXB0ZXJfdCBhZGFwdGVyKQorc3RhdGljIHZvaWQgc3hnX21jYXN0X3NldF9tYXNrKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIpCiB7Ci0JUFNYR19VQ09ERV9SRUdTIHN4Z19yZWdzID0gYWRhcHRlci0+VWNvZGVSZWdzOworCXN0cnVjdCBTWEdfVUNPREVfUkVHUyAqc3hnX3JlZ3MgPSBhZGFwdGVyLT5VY29kZVJlZ3M7CiAKIAlEQkdfRVJST1IoIiVzIEVOVEVSICglcykgbWFjb3B0c1sleF0gbWFza1slbGx4XVxuIiwgX19mdW5jX18sCiAJCSAgYWRhcHRlci0+bmV0ZGV2LT5uYW1lLCAodW5zaWduZWQgaW50KWFkYXB0ZXItPk1hY0ZpbHRlciwKQEAgLTI3NzUsNyArMjc3NSw3IEBACiAgKiAgQWxsb2NhdGUgYSBtY2FzdF9hZGRyZXNzIHN0cnVjdHVyZSB0byBob2xkIHRoZSBtdWx0aWNhc3QgYWRkcmVzcy4KICAqICBMaW5rIGl0IGluLgogICovCi1zdGF0aWMgaW50IHN4Z19tY2FzdF9hZGRfbGlzdChwX2FkYXB0ZXJfdCBhZGFwdGVyLCBjaGFyICphZGRyZXNzKQorc3RhdGljIGludCBzeGdfbWNhc3RfYWRkX2xpc3Qoc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciwgY2hhciAqYWRkcmVzcykKIHsKIAlwX21jYXN0X2FkZHJlc3NfdCBtY2FkZHIsIG1saXN0OwogCWJvb2wgZXF1YWxhZGRyOwpAQCAtMjgwMyw3ICsyODAzLDcgQEAKIAlyZXR1cm4gKFNUQVRVU19TVUNDRVNTKTsKIH0KIAotc3RhdGljIHZvaWQgc3hnX21jYXN0X3NldF9iaXQocF9hZGFwdGVyX3QgYWRhcHRlciwgY2hhciAqYWRkcmVzcykKK3N0YXRpYyB2b2lkIHN4Z19tY2FzdF9zZXRfYml0KHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsIGNoYXIgKmFkZHJlc3MpCiB7CiAJdW5zaWduZWQgY2hhciBjcmNwb2x5OwogCkBAIC0yODIxLDcgKzI4MjEsNyBAQAogCiBzdGF0aWMgdm9pZCBzeGdfbWNhc3Rfc2V0X2xpc3QocF9uZXRfZGV2aWNlIGRldikKIHsKLQlwX2FkYXB0ZXJfdCBhZGFwdGVyID0gKHBfYWRhcHRlcl90KSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXJfdCAqKSBuZXRkZXZfcHJpdihkZXYpOwogCWludCBzdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKIAlpbnQgaTsKIAljaGFyICphZGRyZXNzZXM7CkBAIC0yODc2LDcgKzI4NzYsNyBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIHN4Z191bm1hcF9tbWlvX3NwYWNlKHBfYWRhcHRlcl90IGFkYXB0ZXIpCitzdGF0aWMgdm9pZCBzeGdfdW5tYXBfbW1pb19zcGFjZShzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyKQogewogI2lmIExJTlVYX0ZSRUVTX0FEQVBURVJfUkVTT1VSQ0VTCiAvKiAgICAgIGlmIChhZGFwdGVyLT5SZWdzKSB7ICovCkBAIC0yODk2LDcgKzI4OTYsNyBAQAogICogUmV0dXJuCiAgKglub25lCiAgKi8KLXZvaWQgU3hnRnJlZVJlc291cmNlcyhwX2FkYXB0ZXJfdCBhZGFwdGVyKQordm9pZCBTeGdGcmVlUmVzb3VyY2VzKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIpCiB7CiAJdTMyIFJzc0lkcywgSXNyQ291bnQ7CiAJUFRDUF9PQkpFQ1QgVGNwT2JqZWN0OwpAQCAtMjkyNCw3ICsyOTI0LDcgQEAKIAkvKiBGcmVlIGV2ZW50IHF1ZXVlcy4gKi8KIAlpZiAoYWRhcHRlci0+RXZlbnRSaW5ncykgewogCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBjaWRldiwKLQkJCQkgICAgc2l6ZW9mKFNYR19FVkVOVF9SSU5HKSAqIFJzc0lkcywKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBTWEdfRVZFTlRfUklORykgKiBSc3NJZHMsCiAJCQkJICAgIGFkYXB0ZXItPkV2ZW50UmluZ3MsIGFkYXB0ZXItPlBFdmVudFJpbmdzKTsKIAl9CiAJaWYgKGFkYXB0ZXItPklzcikgewpAQCAtMjk5MSw3ICsyOTkxLDcgQEAKICAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbiBhIG1lbW9yeSBhbGxvY2F0aW9uIGhhcyBjb21wbGV0ZWQuCiAgKgogICogQXJndW1lbnRzIC0KLSAqCXBfYWRhcHRlcl90ICAgIAktIE91ciBhZGFwdGVyIHN0cnVjdHVyZQorICoJc3RydWN0IGFkYXB0ZXJfdCAqICAgCS0gT3VyIGFkYXB0ZXIgc3RydWN0dXJlCiAgKglWaXJ0dWFsQWRkcmVzcwktIE1lbW9yeSB2aXJ0dWFsIGFkZHJlc3MKICAqCVBoeXNpY2FsQWRkcmVzcwktIE1lbW9yeSBwaHlzaWNhbCBhZGRyZXNzCiAgKglMZW5ndGgJCS0gTGVuZ3RoIG9mIG1lbW9yeSBhbGxvY2F0ZWQgKG9yIDApCkBAIC0zMDAwLDEwICszMDAwLDEwIEBACiAgKiBSZXR1cm4KICAqCU5vbmUuCiAgKi8KLXN0YXRpYyB2b2lkIHN4Z19hbGxvY2F0ZV9jb21wbGV0ZShwX2FkYXB0ZXJfdCBhZGFwdGVyLAorc3RhdGljIHZvaWQgc3hnX2FsbG9jYXRlX2NvbXBsZXRlKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsCiAJCQkJICB2b2lkICpWaXJ0dWFsQWRkcmVzcywKIAkJCQkgIGRtYV9hZGRyX3QgUGh5c2ljYWxBZGRyZXNzLAotCQkJCSAgdTMyIExlbmd0aCwgU1hHX0JVRkZFUl9UWVBFIENvbnRleHQpCisJCQkJICB1MzIgTGVuZ3RoLCBlbnVtIFNYR19CVUZGRVJfVFlQRSBDb250ZXh0KQogewogCVNYR19UUkFDRShUUkFDRV9TWEcsIFN4Z1RyYWNlQnVmZmVyLCBUUkFDRV9OT0lTWSwgIkFsbG9jQ21wIiwKIAkJICBhZGFwdGVyLCBWaXJ0dWFsQWRkcmVzcywgTGVuZ3RoLCBDb250ZXh0KTsKQEAgLTMwMTgsNyArMzAxOCw3IEBACiAJCQkJCSAgICAgICBQaHlzaWNhbEFkZHJlc3MsIExlbmd0aCk7CiAJCWJyZWFrOwogCWNhc2UgU1hHX0JVRkZFUl9UWVBFX1NHTDoKLQkJc3hnX2FsbG9jYXRlX3NnbF9idWZmZXJfY29tcGxldGUoYWRhcHRlciwgKFBTWEdfU0NBVFRFUl9HQVRIRVIpCisJCXN4Z19hbGxvY2F0ZV9zZ2xfYnVmZmVyX2NvbXBsZXRlKGFkYXB0ZXIsIChzdHJ1Y3QgU1hHX1NDQVRURVJfR0FUSEVSKikKIAkJCQkJCSBWaXJ0dWFsQWRkcmVzcywKIAkJCQkJCSBQaHlzaWNhbEFkZHJlc3MsIExlbmd0aCk7CiAJCWJyZWFrOwpAQCAtMzAzOSw4ICszMDM5LDggQEAKICAqIFJldHVybgogICoJaW50CiAgKi8KLXN0YXRpYyBpbnQgc3hnX2FsbG9jYXRlX2J1ZmZlcl9tZW1vcnkocF9hZGFwdGVyX3QgYWRhcHRlciwKLQkJCQkgICAgICB1MzIgU2l6ZSwgU1hHX0JVRkZFUl9UWVBFIEJ1ZmZlclR5cGUpCitzdGF0aWMgaW50IHN4Z19hbGxvY2F0ZV9idWZmZXJfbWVtb3J5KHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkJICAgICAgdTMyIFNpemUsIGVudW0gU1hHX0JVRkZFUl9UWVBFIEJ1ZmZlclR5cGUpCiB7CiAJaW50IHN0YXR1czsKIAl2b2lkICpCdWZmZXI7CkBAIC0zMDkxLDcgKzMwOTEsNyBAQAogICogUmV0dXJuCiAgKgogICovCi1zdGF0aWMgdm9pZCBzeGdfYWxsb2NhdGVfcmN2YmxvY2tfY29tcGxldGUocF9hZGFwdGVyX3QgYWRhcHRlciwKK3N0YXRpYyB2b2lkIHN4Z19hbGxvY2F0ZV9yY3ZibG9ja19jb21wbGV0ZShzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLAogCQkJCQkgICB2b2lkICpSY3ZCbG9jaywKIAkJCQkJICAgZG1hX2FkZHJfdCBQaHlzaWNhbEFkZHJlc3MsCiAJCQkJCSAgIHUzMiBMZW5ndGgpCkBAIC0zMDk5LDExICszMDk5LDExIEBACiAJdTMyIGk7CiAJdTMyIEJ1ZmZlclNpemUgPSBhZGFwdGVyLT5SZWNlaXZlQnVmZmVyU2l6ZTsKIAl1NjQgUGFkZHI7Ci0JUFNYR19SQ1ZfQkxPQ0tfSERSIFJjdkJsb2NrSGRyOworCXN0cnVjdCBTWEdfUkNWX0JMT0NLX0hEUiAqUmN2QmxvY2tIZHI7CiAJdW5zaWduZWQgY2hhciAqUmN2RGF0YUJ1ZmZlcjsKLQlQU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFIgUmN2RGF0YUJ1ZmZlckhkcjsKLQlQU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLIFJjdkRlc2NyaXB0b3JCbG9jazsKLQlQU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLX0hEUiBSY3ZEZXNjcmlwdG9yQmxvY2tIZHI7CisJc3RydWN0IFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSICpSY3ZEYXRhQnVmZmVySGRyOworCXN0cnVjdCBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0sgKlJjdkRlc2NyaXB0b3JCbG9jazsKKwlzdHJ1Y3QgU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLX0hEUiAqUmN2RGVzY3JpcHRvckJsb2NrSGRyOwogCiAJU1hHX1RSQUNFKFRSQUNFX1NYRywgU3hnVHJhY2VCdWZmZXIsIFRSQUNFX05PSVNZLCAiQWxSY3ZCbGsiLAogCQkgIGFkYXB0ZXIsIFJjdkJsb2NrLCBMZW5ndGgsIDApOwpAQCAtMzEyOSw3ICszMTI5LDcgQEAKIAkJICAgICBpKyssIFBhZGRyICs9IEJ1ZmZlclNpemUsIFJjdkRhdGFCdWZmZXIgKz0gQnVmZmVyU2l6ZSkgewogCQkJLyogKi8KIAkJCVJjdkRhdGFCdWZmZXJIZHIgPQotCQkJICAgIChQU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFIpIChSY3ZEYXRhQnVmZmVyICsKKwkJCSAgICAoc3RydWN0IFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSKikgKFJjdkRhdGFCdWZmZXIgKwogCQkJCQkJCVNYR19SQ1ZfREFUQV9CVUZGRVJfSERSX09GRlNFVAogCQkJCQkJCShCdWZmZXJTaXplKSk7CiAJCQlSY3ZEYXRhQnVmZmVySGRyLT5WaXJ0dWFsQWRkcmVzcyA9IFJjdkRhdGFCdWZmZXI7CkBAIC0zMTQ3LDcgKzMxNDcsNyBAQAogCS8qIFBsYWNlIHRoaXMgZW50aXJlIGJsb2NrIG9mIG1lbW9yeSBvbiB0aGUgQWxsUmN2QmxvY2tzIHF1ZXVlIHNvIGl0IGNhbiBiZSAqLwogCS8qIGZyZWUgbGF0ZXIgKi8KIAlSY3ZCbG9ja0hkciA9Ci0JICAgIChQU1hHX1JDVl9CTE9DS19IRFIpICgodW5zaWduZWQgY2hhciAqKVJjdkJsb2NrICsKKwkgICAgKHN0cnVjdCBTWEdfUkNWX0JMT0NLX0hEUiopICgodW5zaWduZWQgY2hhciAqKVJjdkJsb2NrICsKIAkJCQkgIFNYR19SQ1ZfQkxPQ0tfSERSX09GRlNFVChCdWZmZXJTaXplKSk7CiAJUmN2QmxvY2tIZHItPlZpcnR1YWxBZGRyZXNzID0gUmN2QmxvY2s7CiAJUmN2QmxvY2tIZHItPlBoeXNpY2FsQWRkcmVzcyA9IFBoeXNpY2FsQWRkcmVzczsKQEAgLTMxNjEsNyArMzE2MSw3IEBACiAJZm9yIChpID0gMCwgUGFkZHIgPSBQaHlzaWNhbEFkZHJlc3M7CiAJICAgICBpIDwgU1hHX1JDVl9ERVNDUklQVE9SU19QRVJfQkxPQ0s7CiAJICAgICBpKyssIFBhZGRyICs9IEJ1ZmZlclNpemUsIFJjdkRhdGFCdWZmZXIgKz0gQnVmZmVyU2l6ZSkgewotCQlSY3ZEYXRhQnVmZmVySGRyID0gKFBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUikgKFJjdkRhdGFCdWZmZXIgKworCQlSY3ZEYXRhQnVmZmVySGRyID0gKHN0cnVjdCBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUiopIChSY3ZEYXRhQnVmZmVyICsKIAkJCQkJCQkgICAgICAgU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFJfT0ZGU0VUCiAJCQkJCQkJICAgICAgIChCdWZmZXJTaXplKSk7CiAJCXNwaW5fbG9jaygmYWRhcHRlci0+UmN2UUxvY2spOwpAQCAtMzE3MSwxMSArMzE3MSwxMSBAQAogCiAJLyogTG9jYXRlIHRoZSBkZXNjcmlwdG9yIGJsb2NrIGFuZCBwdXQgaXQgb24gYSBzZXBhcmF0ZSBmcmVlIHF1ZXVlICovCiAJUmN2RGVzY3JpcHRvckJsb2NrID0KLQkgICAgKFBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0spICgodW5zaWduZWQgY2hhciAqKVJjdkJsb2NrICsKKwkgICAgKHN0cnVjdCBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0sqKSAoKHVuc2lnbmVkIGNoYXIgKilSY3ZCbG9jayArCiAJCQkJCSBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfT0ZGU0VUCiAJCQkJCSAoQnVmZmVyU2l6ZSkpOwogCVJjdkRlc2NyaXB0b3JCbG9ja0hkciA9Ci0JICAgIChQU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLX0hEUikgKCh1bnNpZ25lZCBjaGFyICopUmN2QmxvY2sgKworCSAgICAoc3RydWN0IFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DS19IRFIqKSAoKHVuc2lnbmVkIGNoYXIgKilSY3ZCbG9jayArCiAJCQkJCSAgICAgU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLX0hEUl9PRkZTRVQKIAkJCQkJICAgICAoQnVmZmVyU2l6ZSkpOwogCVJjdkRlc2NyaXB0b3JCbG9ja0hkci0+VmlydHVhbEFkZHJlc3MgPSBSY3ZEZXNjcmlwdG9yQmxvY2s7CkBAIC0zMTkzLDcgKzMxOTMsNyBAQAogCQlmb3IgKGkgPSAwOyBpIDwgU1hHX1JDVl9ERVNDUklQVE9SU19QRVJfQkxPQ0s7CiAJCSAgICAgaSsrLCBSY3ZEYXRhQnVmZmVyICs9IEJ1ZmZlclNpemUpIHsKIAkJCVJjdkRhdGFCdWZmZXJIZHIgPQotCQkJICAgIChQU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFIpIChSY3ZEYXRhQnVmZmVyICsKKwkJCSAgICAoc3RydWN0IFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSKikgKFJjdkRhdGFCdWZmZXIgKwogCQkJCQkJCVNYR19SQ1ZfREFUQV9CVUZGRVJfSERSX09GRlNFVAogCQkJCQkJCShCdWZmZXJTaXplKSk7CiAJCQlTWEdfRlJFRV9SQ1ZfUEFDS0VUKFJjdkRhdGFCdWZmZXJIZHIpOwpAQCAtMzIyMCw4ICszMjIwLDggQEAKICAqIFJldHVybgogICoKICAqLwotc3RhdGljIHZvaWQgc3hnX2FsbG9jYXRlX3NnbF9idWZmZXJfY29tcGxldGUocF9hZGFwdGVyX3QgYWRhcHRlciwKLQkJCQkJICAgICBQU1hHX1NDQVRURVJfR0FUSEVSIFN4Z1NnbCwKK3N0YXRpYyB2b2lkIHN4Z19hbGxvY2F0ZV9zZ2xfYnVmZmVyX2NvbXBsZXRlKHN0cnVjdCBhZGFwdGVyX3QgKmFkYXB0ZXIsCisJCQkJCSAgICAgc3RydWN0IFNYR19TQ0FUVEVSX0dBVEhFUiAqU3hnU2dsLAogCQkJCQkgICAgIGRtYV9hZGRyX3QgUGh5c2ljYWxBZGRyZXNzLAogCQkJCQkgICAgIHUzMiBMZW5ndGgpCiB7CkBAIC0zMjI5LDcgKzMyMjksNyBAQAogCQkgIGFkYXB0ZXIsIFN4Z1NnbCwgTGVuZ3RoLCAwKTsKIAlzcGluX2xvY2soJmFkYXB0ZXItPlNnbFFMb2NrKTsKIAlhZGFwdGVyLT5BbGxTZ2xCdWZmZXJDb3VudCsrOwotCW1lbXNldChTeGdTZ2wsIDAsIHNpemVvZihTWEdfU0NBVFRFUl9HQVRIRVIpKTsKKwltZW1zZXQoU3hnU2dsLCAwLCBzaXplb2Yoc3RydWN0IFNYR19TQ0FUVEVSX0dBVEhFUiopKTsKIAlTeGdTZ2wtPlBoeXNpY2FsQWRkcmVzcyA9IFBoeXNpY2FsQWRkcmVzczsJLyogKlBoeXNpY2FsQWRkcmVzczsgKi8KIAlTeGdTZ2wtPmFkYXB0ZXIgPSBhZGFwdGVyOwkvKiBJbml0aWFsaXplIGJhY2twb2ludGVyIG9uY2UgKi8KIAlJbnNlcnRUYWlsTGlzdCgmYWRhcHRlci0+QWxsU2dsQnVmZmVycywgJlN4Z1NnbC0+QWxsTGlzdCk7CkBAIC0zMjQzLDE0ICszMjQzLDE0IEBACiBzdGF0aWMgdW5zaWduZWQgY2hhciB0ZW1wX21hY19hZGRyZXNzWzZdID0KICAgICB7IDB4MDAsIDB4YWIsIDB4Y2QsIDB4ZWYsIDB4MTIsIDB4NjkgfTsKIAotc3RhdGljIHZvaWQgc3hnX2FkYXB0ZXJfc2V0X2h3YWRkcihwX2FkYXB0ZXJfdCBhZGFwdGVyKQorc3RhdGljIHZvaWQgc3hnX2FkYXB0ZXJfc2V0X2h3YWRkcihzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyKQogewogLyogIERCR19FUlJPUiAoIiVzIEVOVEVSIGNhcmQtPmNvbmZpZ19zZXRbJXhdIHBvcnRbJWRdIHBoeXNwb3J0WyVkXSBmdW5jdCNbJWRdXG4iLCBfX2Z1bmNfXywgKi8KIC8qICAgICAgICAgICAgIGNhcmQtPmNvbmZpZ19zZXQsIGFkYXB0ZXItPnBvcnQsIGFkYXB0ZXItPnBoeXNwb3J0LCBhZGFwdGVyLT5mdW5jdGlvbm51bWJlcik7ICovCiAvKiAqLwogLyogIHN4Z19kYmdfbWFjYWRkcnMoYWRhcHRlcik7ICovCiAKLQltZW1jcHkoYWRhcHRlci0+bWFjYWRkciwgdGVtcF9tYWNfYWRkcmVzcywgc2l6ZW9mKFNYR19DT05GSUdfTUFDKSk7CisJbWVtY3B5KGFkYXB0ZXItPm1hY2FkZHIsIHRlbXBfbWFjX2FkZHJlc3MsIHNpemVvZihzdHJ1Y3QgU1hHX0NPTkZJR19NQUMpKTsKIC8qICAgICAgREJHX0VSUk9SICgiJXMgQUZURVIgY29weWluZyBmcm9tIGNvbmZpZy5tYWNpbmZvIGludG8gY3Vycm1hY2FkZHJcbiIsIF9fZnVuY19fKTsgKi8KIC8qICAgICAgc3hnX2RiZ19tYWNhZGRycyhhZGFwdGVyKTsgKi8KIAlpZiAoIShhZGFwdGVyLT5jdXJybWFjYWRkclswXSB8fApAQCAtMzI3MSw3ICszMjcxLDcgQEAKICNpZiBYWFhUT0RPCiBzdGF0aWMgaW50IHN4Z19tYWNfc2V0X2FkZHJlc3MocF9uZXRfZGV2aWNlIGRldiwgdm9pZCAqcHRyKQogewotCXBfYWRhcHRlcl90IGFkYXB0ZXIgPSAocF9hZGFwdGVyX3QpIG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGFkYXB0ZXJfdCAqYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlcl90ICopIG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IHNvY2thZGRyICphZGRyID0gcHRyOwogCiAJREJHX0VSUk9SKCIlcyBFTlRFUiAoJXMpXG4iLCBfX2Z1bmNfXywgYWRhcHRlci0+bmV0ZGV2LT5uYW1lKTsKQEAgLTMzMTMsNyArMzMxMyw3IEBACiAgKiBSZXR1cm4KICAqCWludAogICovCi1zdGF0aWMgaW50IHN4Z19pbml0aWFsaXplX2FkYXB0ZXIocF9hZGFwdGVyX3QgYWRhcHRlcikKK3N0YXRpYyBpbnQgc3hnX2luaXRpYWxpemVfYWRhcHRlcihzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyKQogewogCXUzMiBSc3NJZHMsIElzckNvdW50OwogCXUzMiBpOwpAQCAtMzMyNyw3ICszMzI3LDcgQEAKIAogCS8qIFNhbml0eSBjaGVjayBTWEdfVUNPREVfUkVHUyBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiB0byAqLwogCS8qIG1ha2Ugc3VyZSB0aGUgbGVuZ3RoIGlzIGNvcnJlY3QgKi8KLQlBU1NFUlQoc2l6ZW9mKFNYR19VQ09ERV9SRUdTKSA9PSBTWEdfUkVHSVNURVJfU0laRV9QRVJfQ1BVKTsKKwlBU1NFUlQoc2l6ZW9mKHN0cnVjdCBTWEdfVUNPREVfUkVHUykgPT0gU1hHX1JFR0lTVEVSX1NJWkVfUEVSX0NQVSk7CiAKIAkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KIAlTWEdfRElTQUJMRV9BTExfSU5URVJSVVBUUyhhZGFwdGVyKTsKQEAgLTM0MTIsMTYgKzM0MTIsMTYgQEAKICAqIFJldHVybgogICoJc3RhdHVzCiAgKi8KLXN0YXRpYyBpbnQgc3hnX2ZpbGxfZGVzY3JpcHRvcl9ibG9jayhwX2FkYXB0ZXJfdCBhZGFwdGVyLAotCQkJCSAgICAgUFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DS19IRFIKLQkJCQkgICAgIFJjdkRlc2NyaXB0b3JCbG9ja0hkcikKK3N0YXRpYyBpbnQgc3hnX2ZpbGxfZGVzY3JpcHRvcl9ibG9jayhzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLAorCQkJCSAgICAgc3RydWN0IFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DS19IRFIKKwkJCQkgICAgICpSY3ZEZXNjcmlwdG9yQmxvY2tIZHIpCiB7CiAJdTMyIGk7Ci0JUFNYR19SSU5HX0lORk8gUmN2UmluZ0luZm8gPSAmYWRhcHRlci0+UmN2UmluZ1plcm9JbmZvOwotCVBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUiBSY3ZEYXRhQnVmZmVySGRyOwotCVBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0sgUmN2RGVzY3JpcHRvckJsb2NrOwotCVBTWEdfQ01EIFJpbmdEZXNjcmlwdG9yQ21kOwotCVBTWEdfUkNWX1JJTkcgUmluZ1plcm8gPSAmYWRhcHRlci0+UmN2UmluZ3NbMF07CisJc3RydWN0IFNYR19SSU5HX0lORk8gKlJjdlJpbmdJbmZvID0gJmFkYXB0ZXItPlJjdlJpbmdaZXJvSW5mbzsKKwlzdHJ1Y3QgU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFIgKlJjdkRhdGFCdWZmZXJIZHI7CisJc3RydWN0IFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DSyAqUmN2RGVzY3JpcHRvckJsb2NrOworCXN0cnVjdCBTWEdfQ01EICpSaW5nRGVzY3JpcHRvckNtZDsKKwlzdHJ1Y3QgU1hHX1JDVl9SSU5HICpSaW5nWmVybyA9ICZhZGFwdGVyLT5SY3ZSaW5nc1swXTsKIAogCVNYR19UUkFDRShUUkFDRV9TWEcsIFN4Z1RyYWNlQnVmZmVyLCBUUkFDRV9OT0lTWSwgIkZpbEJsayIsCiAJCSAgYWRhcHRlciwgYWRhcHRlci0+UmN2QnVmZmVyc09uQ2FyZCwKQEAgLTM0NDIsNyArMzQ0Miw3IEBACiAJQVNTRVJUKFJpbmdEZXNjcmlwdG9yQ21kKTsKIAlSY3ZEZXNjcmlwdG9yQmxvY2tIZHItPlN0YXRlID0gU1hHX0JVRkZFUl9PTkNBUkQ7CiAJUmN2RGVzY3JpcHRvckJsb2NrID0KLQkgICAgKFBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0spIFJjdkRlc2NyaXB0b3JCbG9ja0hkci0+VmlydHVhbEFkZHJlc3M7CisJICAgIChzdHJ1Y3QgU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLKikgUmN2RGVzY3JpcHRvckJsb2NrSGRyLT5WaXJ0dWFsQWRkcmVzczsKIAogCS8qIEZpbGwgaW4gdGhlIGRlc2NyaXB0b3IgYmxvY2sgKi8KIAlmb3IgKGkgPSAwOyBpIDwgU1hHX1JDVl9ERVNDUklQVE9SU19QRVJfQkxPQ0s7IGkrKykgewpAQCAtMzQ4NCw5ICszNDg0LDkgQEAKICAqIFJldHVybgogICoJTm9uZQogICovCi1zdGF0aWMgdm9pZCBzeGdfc3RvY2tfcmN2X2J1ZmZlcnMocF9hZGFwdGVyX3QgYWRhcHRlcikKK3N0YXRpYyB2b2lkIHN4Z19zdG9ja19yY3ZfYnVmZmVycyhzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyKQogewotCVBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfSERSIFJjdkRlc2NyaXB0b3JCbG9ja0hkcjsKKwlzdHJ1Y3QgU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLX0hEUiAqUmN2RGVzY3JpcHRvckJsb2NrSGRyOwogCiAJU1hHX1RSQUNFKFRSQUNFX1NYRywgU3hnVHJhY2VCdWZmZXIsIFRSQUNFX05PSVNZLCAiU3RvY2tCdWYiLAogCQkgIGFkYXB0ZXIsIGFkYXB0ZXItPlJjdkJ1ZmZlcnNPbkNhcmQsCkBAIC0zNTA2LDE0ICszNTA2LDE0IEBACiAJLyogTm93IGdyYWIgdGhlIFJjdlFMb2NrIGxvY2sgYW5kIHByb2NlZWQgKi8KIAlzcGluX2xvY2soJmFkYXB0ZXItPlJjdlFMb2NrKTsKIAl3aGlsZSAoYWRhcHRlci0+UmN2QnVmZmVyc09uQ2FyZCA8IFNYR19SQ1ZfREFUQV9CVUZGRVJTKSB7Ci0JCVBMSVNUX0VOVFJZIF9wbGU7CisJCXN0cnVjdCBMSVNUX0VOVFJZICpfcGxlOwogCiAJCS8qIEdldCBhIGRlc2NyaXB0b3IgYmxvY2sgKi8KIAkJUmN2RGVzY3JpcHRvckJsb2NrSGRyID0gTlVMTDsKIAkJaWYgKGFkYXB0ZXItPkZyZWVSY3ZCbG9ja0NvdW50KSB7CiAJCQlfcGxlID0gUmVtb3ZlSGVhZExpc3QoJmFkYXB0ZXItPkZyZWVSY3ZCbG9ja3MpOwogCQkJUmN2RGVzY3JpcHRvckJsb2NrSGRyID0KLQkJCSAgICBjb250YWluZXJfb2YoX3BsZSwgU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLX0hEUiwKKwkJCSAgICBjb250YWluZXJfb2YoX3BsZSwgc3RydWN0IFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DS19IRFIsCiAJCQkJCSBGcmVlTGlzdCk7CiAJCQlhZGFwdGVyLT5GcmVlUmN2QmxvY2tDb3VudC0tOwogCQkJUmN2RGVzY3JpcHRvckJsb2NrSGRyLT5TdGF0ZSA9IFNYR19CVUZGRVJfQlVTWTsKQEAgLTM1NTAsMTMgKzM1NTAsMTMgQEAKICAqIFJldHVybgogICoJTm9uZQogICovCi1zdGF0aWMgdm9pZCBzeGdfY29tcGxldGVfZGVzY3JpcHRvcl9ibG9ja3MocF9hZGFwdGVyX3QgYWRhcHRlciwKK3N0YXRpYyB2b2lkIHN4Z19jb21wbGV0ZV9kZXNjcmlwdG9yX2Jsb2NrcyhzdHJ1Y3QgYWRhcHRlcl90ICphZGFwdGVyLAogCQkJCQkgICB1bnNpZ25lZCBjaGFyIEluZGV4KQogewotCVBTWEdfUkNWX1JJTkcgUmluZ1plcm8gPSAmYWRhcHRlci0+UmN2UmluZ3NbMF07Ci0JUFNYR19SSU5HX0lORk8gUmN2UmluZ0luZm8gPSAmYWRhcHRlci0+UmN2UmluZ1plcm9JbmZvOwotCVBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfSERSIFJjdkRlc2NyaXB0b3JCbG9ja0hkcjsKLQlQU1hHX0NNRCBSaW5nRGVzY3JpcHRvckNtZDsKKwlzdHJ1Y3QgU1hHX1JDVl9SSU5HICpSaW5nWmVybyA9ICZhZGFwdGVyLT5SY3ZSaW5nc1swXTsKKwlzdHJ1Y3QgU1hHX1JJTkdfSU5GTyAqUmN2UmluZ0luZm8gPSAmYWRhcHRlci0+UmN2UmluZ1plcm9JbmZvOworCXN0cnVjdCBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfSERSICpSY3ZEZXNjcmlwdG9yQmxvY2tIZHI7CisJc3RydWN0IFNYR19DTUQgKlJpbmdEZXNjcmlwdG9yQ21kOwogCiAJU1hHX1RSQUNFKFRSQUNFX1NYRywgU3hnVHJhY2VCdWZmZXIsIFRSQUNFX05PSVNZLCAiQ21wUkJsa3MiLAogCQkgIGFkYXB0ZXIsIEluZGV4LCBSY3ZSaW5nSW5mby0+SGVhZCwgUmN2UmluZ0luZm8tPlRhaWwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3N4Zy9zeGcuaCBiL2RyaXZlcnMvc3RhZ2luZy9zeGcvc3hnLmgKaW5kZXggODQ0Y2E1Ni4uNjUzY2YzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3N4Zy9zeGcuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Zy5oCkBAIC00NSw3ICs0NSw3IEBACiAjZGVmaW5lIHBfbmV0X2RldmljZSBzdHJ1Y3QgbmV0X2RldmljZSAqCiAvLyBTWEdfU1RBVFMgLSBQcm9iYWJseSBtb3ZlIHRoZXNlIHRvIHNvbWVwbGFjZSB3aGVyZQogLy8gdGhlIHNsaWNzdGF0IChzeGdzdGF0PykgcHJvZ3JhbSBjYW4gZ2V0IHRoZW0uCi10eXBlZGVmIHN0cnVjdCBfU1hHX1NUQVRTIHsKK3N0cnVjdCBTWEdfU1RBVFMgewogCS8vIFhtdAogCXUzMgkJCQlYbXROQkw7CQkJCS8vIE9mZmxvYWQgc2VuZCBOQkwgY291bnQKIAl1NjQJCQkJRHVtYlhtdEJ5dGVzOwkJLy8gRHVtYm5pYyBzZW5kIGJ5dGVzCkBAIC0xMDksNyArMTA5LDcgQEAKIAl1NjQJCQkJTGlua0NyYzsJCQkvLyBTWEdfUkNWX1NUQVRVU19MSU5LX0NSQzoKIAl1NjQJCQkJTGlua09mbG93OwkJCS8vIFNYR19SQ1ZfU1RBVFVTX0xJTktfT0ZMT1c6CiAJdTY0CQkJCUxpbmtVZmxvdzsJCQkvLyBTWEdfUkNWX1NUQVRVU19MSU5LX1VGTE9XOgotfSBTWEdfU1RBVFMsICpQU1hHX1NUQVRTOworfTsKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjE1LDEyICsyMTUsMTIgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vIE5PVEUgLSBMb2NrIG11c3QgYmUgaGVsZCB3aXRoIFJDViBtYWNyb3MKICNkZWZpbmUgU1hHX0dFVF9SQ1ZfREFUQV9CVUZGRVIoX3BBZGFwdCwgX0hkcikgewkJCQkJCQkJXAotCVBMSVNUX0VOVFJZICAgICAJCQkJX3BsZTsJCQkJCQkJCQkJXAorCXN0cnVjdCBMSVNUX0VOVFJZICAgICAJCQkJKl9wbGU7CQkJCQkJCQkJCVwKIAlfSGRyID0gTlVMTDsJCQkJCQkJCQkJCQkJCQkJXAogCWlmKChfcEFkYXB0KS0+RnJlZVJjdkJ1ZmZlckNvdW50KSB7CQkJCQkJCQkJCQlcCiAJCUFTU0VSVCghKElzTGlzdEVtcHR5KCYoX3BBZGFwdCktPkZyZWVSY3ZCdWZmZXJzKSkpOwkJCQkJCVwKIAkJX3BsZSA9IFJlbW92ZUhlYWRMaXN0KCYoX3BBZGFwdCktPkZyZWVSY3ZCdWZmZXJzKTsJICAgIAkJCQlcCi0JCShfSGRyKSA9IGNvbnRhaW5lcl9vZihfcGxlLCBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUiwgRnJlZUxpc3QpOwkgICAgICAgIFwKKwkJKF9IZHIpID0gY29udGFpbmVyX29mKF9wbGUsIHN0cnVjdCBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUiwgRnJlZUxpc3QpOwkgICAgICAgIFwKIAkJKF9wQWRhcHQpLT5GcmVlUmN2QnVmZmVyQ291bnQtLTsJCQkJCQkJCQkJXAogCQlBU1NFUlQoKF9IZHIpLT5TdGF0ZSA9PSBTWEdfQlVGRkVSX0ZSRUUpOwkJCQkJCQkJXAogCX0JCQkJCQkJCQkJCQkJCQkJCQkJXApAQCAtMjYzLDEyICsyNjMsMTIgQEAKIC8vIHVudGlsIGFmdGVyIHRoYXQuICBXZSdyZSBkZWFsaW5nIHdpdGggcm91bmQgbnVtYmVycyBoZXJlLCBzbyB3ZSBkb24ndCBuZWVkIHRvLAogLy8gYW5kIG5vdCBncmFiYmluZyBpdCBhdm9pZHMgYSBwb3NzaWJsZSBkb3VibGUtdHJpcC4KICNkZWZpbmUgU1hHX0dFVF9TR0xfQlVGRkVSKF9wQWRhcHQsIF9TZ2wpIHsJCQkJXAotCVBMSVNUX0VOVFJZIF9wbGU7CQkJCQkJXAorCXN0cnVjdCBMSVNUX0VOVFJZICpfcGxlOwkJCQkJCVwKIAlpZiAoKF9wQWRhcHQtPkZyZWVTZ2xCdWZmZXJDb3VudCA8IFNYR19NSU5fU0dMX0JVRkZFUlMpICYmCVwKIAkgICAoX3BBZGFwdC0+QWxsU2dsQnVmZmVyQ291bnQgPCBTWEdfTUFYX1NHTF9CVUZGRVJTKSAmJglcCiAJICAgKF9wQWRhcHQtPkFsbG9jYXRpb25zUGVuZGluZyA9PSAwKSkgewkJCVwKIAkJc3hnX2FsbG9jYXRlX2J1ZmZlcl9tZW1vcnkoX3BBZGFwdCwJCQlcCi0JCQkoc2l6ZW9mKFNYR19TQ0FUVEVSX0dBVEhFUikgKyBTWEdfU0dMX0JVRl9TSVpFKSxcCisJCQkoc2l6ZW9mKHN0cnVjdCBTWEdfU0NBVFRFUl9HQVRIRVIpICsgU1hHX1NHTF9CVUZfU0laRSksXAogCQkJU1hHX0JVRkZFUl9UWVBFX1NHTCk7CQkJCVwKIAl9CQkJCQkJCQlcCiAJX1NnbCA9IE5VTEw7CQkJCQkJCVwKQEAgLTI3Niw3ICsyNzYsNyBAQAogCWlmKChfcEFkYXB0KS0+RnJlZVNnbEJ1ZmZlckNvdW50KSB7CQkJCVwKIAkJQVNTRVJUKCEoSXNMaXN0RW1wdHkoJihfcEFkYXB0KS0+RnJlZVNnbEJ1ZmZlcnMpKSk7CVwKIAkJX3BsZSA9IFJlbW92ZUhlYWRMaXN0KCYoX3BBZGFwdCktPkZyZWVTZ2xCdWZmZXJzKTsJXAotCQkoX1NnbCkgPSBjb250YWluZXJfb2YoX3BsZSwgU1hHX1NDQVRURVJfR0FUSEVSLCBGcmVlTGlzdCk7IFwKKwkJKF9TZ2wpID0gY29udGFpbmVyX29mKF9wbGUsIHN0cnVjdCBTWEdfU0NBVFRFUl9HQVRIRVIsIEZyZWVMaXN0KTsgXAogICAgICAgICAgICAgKF9wQWRhcHQpLT5GcmVlU2dsQnVmZmVyQ291bnQtLTsJCQkJXAogCQlBU1NFUlQoKF9TZ2wpLT5TdGF0ZSA9PSBTWEdfQlVGRkVSX0ZSRUUpOwkJXAogCQkoX1NnbCktPlN0YXRlID0gU1hHX0JVRkZFUl9CVVNZOwkJCVwKQEAgLTI4OSwxNyArMjg5LDE3IEBACiAvLyBTWEdfTVVMVElDQVNUX0FERFJFU1MKIC8vCiAvLyBMaW5rZWQgbGlzdCBvZiBtdWx0aWNhc3QgYWRkcmVzc2VzLgotdHlwZWRlZiBzdHJ1Y3QgX1NYR19NVUxUSUNBU1RfQUREUkVTUyB7CitzdHJ1Y3QgU1hHX01VTFRJQ0FTVF9BRERSRVNTIHsKIAl1bnNpZ25lZCBjaGFyCQkJCQkJCUFkZHJlc3NbNl07Ci0Jc3RydWN0IF9TWEdfTVVMVElDQVNUX0FERFJFU1MJKk5leHQ7Ci19IFNYR19NVUxUSUNBU1RfQUREUkVTUywgKlBTWEdfTVVMVElDQVNUX0FERFJFU1M7CisJc3RydWN0IFNYR19NVUxUSUNBU1RfQUREUkVTUwkqTmV4dDsKK307CiAKIC8vIFN0cnVjdHVyZSB0byBtYWludGFpbiBjaGltbmV5IHNlbmQgYW5kIHJlY2VpdmUgYnVmZmVyIHF1ZXVlcy4KIC8vIFRoaXMgc3RydWN0dXJlIG1haW50YWlucyBORVRfQlVGRkVSX0xJU1QgcXVldWVzIHRoYXQgYXJlCiAvLyBnaXZlbiB0byB1cyB2aWEgdGhlIENoaW1uZXkgTWluaXBvcnRUY3BPZmZsb2FkU2VuZCBhbmQKIC8vIE1pbmlwb3J0VGNwT2ZmbG9hZFJlY2VpdmUgcm91dGluZXMuICBUaGlzIHN0cnVjdHVyZSBET0VTIE5PVAogLy8gbWFuYWdlIG91ciBkYXRhIGJ1ZmZlciBxdWV1ZQotdHlwZWRlZiBzdHJ1Y3QgX1NYR19CVUZGRVJfUVVFVUUgeworc3RydWN0IFNYR19CVUZGRVJfUVVFVUUgewogCXUzMgkJCQkJCVR5cGU7CQkJLy8gU2xvdyBvciBmYXN0IC0gU2VlIGJlbG93CiAJdTMyCQkJCQkJRGlyZWN0aW9uOwkJLy8gWG10IG9yIFJjdgogCXUzMgkJCQkJCUJ5dGVzOwkJCS8vIEJ5dGUgY291bnQKQEAgLTMwNyw3ICszMDcsNyBAQAogCXUzMiAqICAgICAgICAJCQlUYWlsOwkJCS8vIFNlbmQgcXVldWUgdGFpbAogLy8JUE5FVF9CVUZGRVJfTElTVAkJCU5leHROQkw7CQkvLyBTaG9ydCBjdXQgLSBuZXh0IE5CTAogLy8JUE5FVF9CVUZGRVIJCQkJCU5leHROQjsJCQkvLyBTaG9ydCBjdXQgLSBuZXh0IE5CCi19IFNYR19CVUZGRVJfUVVFVUUsICpQU1hHX0JVRkZFUl9RVUVVRTsKK307CiAKICNkZWZpbmUJCVNYR19TTE9XX1NFTkRfQlVGRkVSCTAKICNkZWZpbmUJCVNYR19GQVNUX1NFTkRfQlVGRkVSCTEKQEAgLTMzNSw3ICszMzUsNyBAQAogCiAvLyBBZGFwdGVyIHN0YXRlcyAtIFRoZXNlIHN0YXRlcyBjbG9zZWx5IG1hdGNoIHRoZSBhZGFwdGVyIHN0YXRlcwogLy8gZG9jdW1lbnRlZCBpbiB0aGUgRERLICh3aXRoIGEgZmV3IGV4Y2VwdGlvbnMpLgotdHlwZWRlZiBlbnVtIF9TWEdfU1RBVEUgeworZW51bSBTWEdfU1RBVEUgewogCVNYR19TVEFURV9JTklUSUFMSVpJTkcsCQkJLy8gSW5pdGlhbGl6aW5nCiAJU1hHX1NUQVRFX0JPT1RESUFHLAkJCQkvLyBCb290LURpYWdub3N0aWMgbW9kZQogCVNYR19TVEFURV9QQVVTSU5HLAkJCQkvLyBQYXVzaW5nCkBAIC0zNDcsMjQgKzM0NywyNCBAQAogCVNYR19TVEFURV9IQUxUSU5HLAkJCQkvLyBIYWx0aW5nCiAJU1hHX1NUQVRFX0hBTFRFRCwJCQkJLy8gRG93biBvciBub3QtaW5pdGlhbGl6ZWQKIAlTWEdfU1RBVEVfU0hVVERPV04JCQkJLy8gc2h1dGRvd24KLX0gU1hHX1NUQVRFLCAqUFNYR19TVEFURTsKK307CiAKIC8vIExpbmsgc3RhdGUKLXR5cGVkZWYgZW51bSBfU1hHX0xJTktfU1RBVEUgeworZW51bSBTWEdfTElOS19TVEFURSB7CiAJU1hHX0xJTktfRE9XTiwKIAlTWEdfTElOS19VUAotfSBTWEdfTElOS19TVEFURSwgKlBTWEdfTElOS19TVEFURTsKK307CiAKIC8vIExpbmsgaW5pdGlhbGl6YXRpb24gdGltZW91dCBpbiAxMDB1cyB1bml0cwogI2RlZmluZSBTWEdfTElOS19USU1FT1VUCTEwMDAwMAkJLy8gMTAgU2Vjb25kcyAtIFJFRFVDRSEKIAogCiAvLyBNaWNyb2NvZGUgZmlsZSBzZWxlY3Rpb24gY29kZXMKLXR5cGVkZWYgZW51bSBfU1hHX1VDT0RFX1NFTCB7CitlbnVtIFNYR19VQ09ERV9TRUwgewogCVNYR19VQ09ERV9TQUhBUkEsCQkJCS8vIFNhaGFyYSB1Y29kZQogCVNYR19VQ09ERV9TRElBR0NQVSwJCQkJLy8gU2FoYXJhIENQVSBkaWFnbm9zdGljIHVjb2RlCiAJU1hHX1VDT0RFX1NESUFHU1lTCQkJCS8vIFNhaGFyYSBzeXN0ZW0gZGlhZ25vc3RpYyB1Y29kZQotfSBTWEdfVUNPREVfU0VMOworfTsKIAogCiAjZGVmaW5lIFNYR19ESVNBQkxFX0FMTF9JTlRFUlJVUFRTKF9wYWRhcHQpIHN4Z19kaXNhYmxlX2ludGVycnVwdChfcGFkYXB0KQpAQCAtMzg0LDEwICszODQsMTAgQEAKIC8vCiAvLyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3hnIGRyaXZlci4gIFRoZXJlIGlzIG9ubHkKIC8vIG9uZSBvZiB0aGVzZSwgYW5kIGl0IGlzIGRlZmluZWQgYXMgYSBnbG9iYWwuCi10eXBlZGVmIHN0cnVjdCBfU1hHX0RSSVZFUiB7Ci0Jc3RydWN0IF9hZGFwdGVyX3QJKkFkYXB0ZXJzOwkJLy8gTGlua2VkIGxpc3Qgb2YgYWRhcHRlcnMKK3N0cnVjdCBTWEdfRFJJVkVSIHsKKwlzdHJ1Y3QgYWRhcHRlcl90CSpBZGFwdGVyczsJCS8vIExpbmtlZCBsaXN0IG9mIGFkYXB0ZXJzCiAJdXNob3J0CQkJCUFkYXB0ZXJJRDsJCS8vIE1haW50YWluIHVuaXF1ZSBhZGFwdGVyIElECi19IFNYR19EUklWRVIsICpQU1hHX0RSSVZFUjsKK307CiAKICNpZmRlZiBTVEFUVVNfU1VDQ0VTUwogI3VuZGVmIFNUQVRVU19TVUNDRVNTCkBAIC00MTYsMTEgKzQxNiwxMCBAQAogI2RlZmluZSBNSU4oYSwgYikgKCh1MzIpKGEpIDwgKHUzMikoYikgPyAoYSkgOiAoYikpCiAjZGVmaW5lIE1BWChhLCBiKSAoKHUzMikoYSkgPiAodTMyKShiKSA/IChhKSA6IChiKSkKIAotdHlwZWRlZiBzdHJ1Y3QgX21jYXN0X2FkZHJlc3NfdAoteworc3RydWN0IG1jYXN0X2FkZHJlc3NfdCB7CiAgICAgdW5zaWduZWQgY2hhciAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NbNl07Ci0gICAgc3RydWN0IF9tY2FzdF9hZGRyZXNzX3QgICAqbmV4dDsKLX0gIG1jYXN0X2FkZHJlc3NfdCwgKnBfbWNhc3RfYWRkcmVzc190OworICAgIHN0cnVjdCBtY2FzdF9hZGRyZXNzX3QgICAqbmV4dDsKK307CiAKICNkZWZpbmUgQ0FSRF9ET1dOICAgICAgICAweDAwMDAwMDAwCiAjZGVmaW5lIENBUkRfVVAgICAgICAgICAgMHgwMDAwMDAwMQpAQCAtNDcyLDQxICs0NzEsMzcgQEAKICNkZWZpbmUgU0xJQ19DQVJEX1NUQVRFKHgpICAgICgoeD09Q0FSRF9VUCkgPyAiVVAiIDogIkRvd24iKQogCiAKLXR5cGVkZWYgc3RydWN0IF9ldGhlcl9oZWFkZXIKLXsKK3N0cnVjdCBldGhlcl9oZWFkZXIgewogICAgIHVuc2lnbmVkIGNoYXIgICAgZXRoZXJfZGhvc3RbNl07CiAgICAgdW5zaWduZWQgY2hhciAgICBldGhlcl9zaG9zdFs2XTsKICAgICB1c2hvcnQgICBldGhlcl90eXBlOwotfSBldGhlcl9oZWFkZXIsICpwX2V0aGVyX2hlYWRlcjsKK307CiAKIAogI2RlZmluZSBOVU1fQ0ZHX1NQQUNFUyAgICAgIDIKICNkZWZpbmUgTlVNX0NGR19SRUdTICAgICAgICA2NAogCi10eXBlZGVmIHN0cnVjdCBfcGh5c2NhcmRfdAotewotICAgIHN0cnVjdCBfYWRhcHRlcl90ICAqYWRhcHRlcltTTElDX01BWF9QT1JUU107Ci0gICAgc3RydWN0IF9waHlzY2FyZF90ICpuZXh0Oworc3RydWN0IHBoeXNjYXJkX3QgeworICAgIHN0cnVjdCBhZGFwdGVyX3QgICphZGFwdGVyW1NMSUNfTUFYX1BPUlRTXTsKKyAgICBzdHJ1Y3QgcGh5c2NhcmRfdCAqbmV4dDsKICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgYWRhcHRlcnNfYWxsb2NkOwotfSBwaHlzY2FyZF90LCAqcF9waHlzY2FyZF90OworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX3N4Z2Jhc2VfZHJpdmVyCi17CitzdHJ1Y3Qgc3hnYmFzZV9kcml2ZXJfdCB7CiAJc3BpbmxvY2tfdAlkcml2ZXJfbG9jazsKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwkvKiBpcnFzYXZlIGZvciBzcGlubG9jayAqLwogCXUzMgkJbnVtX3N4Z19jYXJkczsKIAl1MzIJCW51bV9zeGdfcG9ydHM7CiAJdTMyCQludW1fc3hnX3BvcnRzX2FjdGl2ZTsKIAl1MzIJCWR5bmFtaWNfaW50YWdnOwotCXBfcGh5c2NhcmRfdAlwaHlzX2NhcmQ7Ci19IHN4Z2Jhc2VfZHJpdmVyX3Q7CisJc3RydWN0IHBoeXNjYXJkX3QJKnBoeXNfY2FyZDsKK307CiAKIAotdHlwZWRlZiBzdHJ1Y3QgX2FkYXB0ZXJfdAoteworc3RydWN0IGFkYXB0ZXJfdCB7CiAJdm9pZCAqICAgICAgICAgICAgICAgaWZwOwogCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgICBwb3J0OwotCXBfcGh5c2NhcmRfdCAgICAgICAgcGh5c2NhcmQ7CisJc3RydWN0IHBoeXNjYXJkX3QgICAgICAgICpwaHlzY2FyZDsKIAl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgcGh5c3BvcnQ7CiAJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIGNhcmRpbmRleDsKIAl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgY2FyZF9zaXplOwpAQCAtNTQ0LDcgKzUzOSw3IEBACiAJdTMyICAgICAgICAgICAgIG1hY29wdHM7CiAJdXNob3J0ICAgICAgICAgICAgICBkZXZmbGFnc19wcmV2OwogCXU2NCAgICAgICAgICAgICBtY2FzdG1hc2s7Ci0JcF9tY2FzdF9hZGRyZXNzX3QgICBtY2FzdGFkZHJzOworCXN0cnVjdCBtY2FzdF9hZGRyZXNzX3QgICAqbWNhc3RhZGRyczsKIAlzdHJ1Y3QgdGltZXJfbGlzdCAgIHBpbmd0aW1lcjsKIAl1MzIgICAgICAgICAgICAgcGluZ3RpbWVyc2V0OwogCXN0cnVjdCB0aW1lcl9saXN0ICAgc3RhdHN0aW1lcjsKQEAgLTU4MCwxMSArNTc1LDExIEBACiAJdTMyICAgICAgICAgICAgIGludGFnZ19wZXJpb2Q7CiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CiAJdTMyICoJCQkJCU1pbmlwb3J0SGFuZGxlOwkJLy8gT3VyIG1pbmlwb3J0IGhhbmRsZQotCVNYR19TVEFURQkJCQkJU3RhdGU7CQkJCS8vIEFkYXB0ZXIgc3RhdGUKLQlTWEdfTElOS19TVEFURQkJCQlMaW5rU3RhdGU7CQkJLy8gTGluayBzdGF0ZQorCWVudW0gU1hHX1NUQVRFCQkJCQlTdGF0ZTsJCQkJLy8gQWRhcHRlciBzdGF0ZQorCWVudW0gU1hHX0xJTktfU1RBVEUJCQkJTGlua1N0YXRlOwkJCS8vIExpbmsgc3RhdGUKIAl1NjQJCQkJCQlMaW5rU3BlZWQ7CQkJLy8gTGluayBTcGVlZAogCXUzMgkJCQkJCVBvd2VyU3RhdGU7CQkJLy8gTkRJUyBwb3dlciBzdGF0ZQotCXN0cnVjdCBfYWRhcHRlcl90ICAgCQkqTmV4dDsJCQkJLy8gTGlua2VkIGxpc3QKKwlzdHJ1Y3QgYWRhcHRlcl90ICAgCQkqTmV4dDsJCQkJLy8gTGlua2VkIGxpc3QKIAl1c2hvcnQJCQkJCQlBZGFwdGVySUQ7CQkJLy8gMS4ubgogCXVuc2lnbmVkIGNoYXIJCQkJCQlNYWNBZGRyWzZdOwkJCS8vIE91ciBwZXJtYW5lbnQgSFcgbWFjIGFkZHJlc3MKIAl1bnNpZ25lZCBjaGFyCQkJCQkJQ3Vyck1hY0FkZHJbNl07CQkvLyBPdXIgQ3VycmVudCBtYWMgYWRkcmVzcwpAQCAtNTkyLDE2ICs1ODcsMTYgQEAKIAlwX25ldF9kZXZpY2UgICAgICAgICAgICAgICAgbmV4dF9uZXRkZXZpY2U7CiAJc3RydWN0IHBjaV9kZXYgICAgICAgICAgICAqIHBjaWRldjsKIAotCVBTWEdfTVVMVElDQVNUX0FERFJFU1MJCU11bHRpY2FzdEFkZHJzOwkJLy8gTXVsdGljYXN0IGxpc3QKKwlzdHJ1Y3QgU1hHX01VTFRJQ0FTVF9BRERSRVNTCQkqTXVsdGljYXN0QWRkcnM7CQkvLyBNdWx0aWNhc3QgbGlzdAogCXU2NCAgICAgCQkJCU11bHRpY2FzdE1hc2s7CQkvLyBNdWx0aWNhc3QgbWFzawogCXUzMiAqCQkJCQlJbnRlcnJ1cHRIYW5kbGU7CS8vIFJlZ2lzdGVyIEludGVycnVwdCBoYW5kbGUKIAl1MzIJCQkJCQlJbnRlcnJ1cHRMZXZlbDsJCS8vIEZyb20gUmVzb3VyY2UgbGlzdAogCXUzMgkJCQkJCUludGVycnVwdFZlY3RvcjsJLy8gRnJvbSBSZXNvdXJjZSBsaXN0CiAJc3BpbmxvY2tfdAlBZGFwdGVyTG9jazsJLyogU2VyaWFsaXplIGFjY2VzcyBhZGFwdGVyIHJvdXRpbmVzICovCiAJc3BpbmxvY2tfdAlCaXQ2NFJlZ0xvY2s7CS8qIEZvciB3cml0aW5nIDY0LWJpdCBhZGRyZXNzZXMgKi8KLQlQU1hHX0hXX1JFR1MJCQkJSHdSZWdzOwkJCQkvLyBTYWhhcmEgSFcgUmVnaXN0ZXIgTWVtb3J5IChCQVIwLzEpCi0JUFNYR19VQ09ERV9SRUdTCQkJCVVjb2RlUmVnczsJCQkvLyBNaWNyb2NvZGUgUmVnaXN0ZXIgTWVtb3J5IChCQVIyLzMpCi0JUFNYR19UQ0JfUkVHUwkJCQlUY2JSZWdzOwkJCS8vIFNhbWUgYXMgVWNvZGUgcmVncyAtIFNlZSBzeGdody5oCisJc3RydWN0IFNYR19IV19SRUdTCQkJKkh3UmVnczsJCQkJLy8gU2FoYXJhIEhXIFJlZ2lzdGVyIE1lbW9yeSAoQkFSMC8xKQorCXN0cnVjdCBTWEdfVUNPREVfUkVHUwkJCSpVY29kZVJlZ3M7CQkJLy8gTWljcm9jb2RlIFJlZ2lzdGVyIE1lbW9yeSAoQkFSMi8zKQorCXN0cnVjdCBTWEdfVENCX1JFR1MJCQkqVGNiUmVnczsJCQkvLyBTYW1lIGFzIFVjb2RlIHJlZ3MgLSBTZWUgc3hnaHcuaAogCXVzaG9ydAkJCQkJCVJlc2V0RHBjQ291bnQ7CQkvLyBGb3IgdGltZW91dAogCXVzaG9ydAkJCQkJCVJzc0RwY0NvdW50OwkJLy8gRm9yIHRpbWVvdXQKIAl1c2hvcnQJCQkJCQlWZW5kb3JJRDsJCQkvLyBWZW5kb3IgSUQKQEAgLTYxMywyNSArNjA4LDI1IEBACiAJdTMyICoJCQkJCUJ1ZmZlclBvb2xIYW5kbGU7CS8vIFVzZWQgd2l0aCBORElTIDUuMiBvbmx5LiAgRG9uJ3QgaWZkZWYgb3V0CiAJdTMyCQkJCQkJTWFjRmlsdGVyOwkJCS8vIE5ESVMgTUFDIEZpbHRlcgogCXVzaG9ydAkJCQkJCUlwSWQ7CQkJCS8vIEZvciBzbG93cGF0aAotCVBTWEdfRVZFTlRfUklORwkJCQlFdmVudFJpbmdzOwkJCS8vIEhvc3QgZXZlbnQgcmluZ3MuICAxL0NQVSB0byAxNiBtYXgKKwlzdHJ1Y3QgU1hHX0VWRU5UX1JJTkcJCQkqRXZlbnRSaW5nczsJCQkvLyBIb3N0IGV2ZW50IHJpbmdzLiAgMS9DUFUgdG8gMTYgbWF4CiAJZG1hX2FkZHJfdCAgICAgICAgICAgICAgCVBFdmVudFJpbmdzOwkJLy8gUGh5c2ljYWwgYWRkcmVzcwogCXUzMgkJCQkJCU5leHRFdmVudFtTWEdfTUFYX1JTU107CS8vIEN1cnJlbnQgbG9jYXRpb24gaW4gcmluZwogCWRtYV9hZGRyX3QgICAgICAgICAgCQlQVGNiQnVmZmVyczsJCS8vIFRDQiBCdWZmZXJzIC0gcGh5c2ljYWwgYWRkcmVzcwogCWRtYV9hZGRyX3QJICAgICAgICAgICAgCVBUY2JDb21wQnVmZmVyczsJLy8gVENCIENvbXBvc2l0ZSBCdWZmZXJzIC0gcGh5cyBhZGRyCi0JUFNYR19YTVRfUklORwkJCQlYbXRSaW5nczsJCQkvLyBUcmFuc21pdCByaW5ncworCXN0cnVjdCBTWEdfWE1UX1JJTkcJCQkJKlhtdFJpbmdzOwkJCS8vIFRyYW5zbWl0IHJpbmdzCiAJZG1hX2FkZHJfdAkJICAgICAgICAgICAgUFhtdFJpbmdzOwkJCS8vIFRyYW5zbWl0IHJpbmdzIC0gcGh5c2ljYWwgYWRkcmVzcwotCVNYR19SSU5HX0lORk8JCQkJWG10UmluZ1plcm9JbmZvOwkvLyBUcmFuc21pdCByaW5nIDAgaW5mbworCXN0cnVjdCBTWEdfUklOR19JTkZPCQkJCVhtdFJpbmdaZXJvSW5mbzsJLy8gVHJhbnNtaXQgcmluZyAwIGluZm8KIAlzcGlubG9ja190CVhtdFplcm9Mb2NrOwkvKiBUcmFuc21pdCByaW5nIDAgbG9jayAqLwogCXUzMiAqCQkJCQlYbXRSaW5nWmVyb0luZGV4OwkvLyBTaGFyZWQgWE1UIHJpbmcgMCBpbmRleAogCWRtYV9hZGRyX3QgICAgICAgICAgCQlQWG10UmluZ1plcm9JbmRleDsJLy8gU2hhcmVkIFhNVCByaW5nIDAgaW5kZXggLSBwaHlzaWNhbAotCUxJU1RfRU5UUlkJCQkJCUZyZWVQcm90b2NvbEhlYWRlcnM7Ly8gRnJlZSBwcm90b2NvbCBoZWFkZXJzCisJc3RydWN0IExJU1RfRU5UUlkJCQkJCUZyZWVQcm90b2NvbEhlYWRlcnM7Ly8gRnJlZSBwcm90b2NvbCBoZWFkZXJzCiAJdTMyCQkJCQkJRnJlZVByb3RvSGRyQ291bnQ7CS8vIENvdW50CiAJdm9pZCAqCQkJCQkJUHJvdG9jb2xIZWFkZXJzOwkvLyBCbG9jayBvZiBwcm90b2NvbCBoZWFkZXIKIAlkbWFfYWRkcl90CSAgICAgICAgICAgIAlQUHJvdG9jb2xIZWFkZXJzOwkvLyBCbG9jayBvZiBwcm90b2NvbCBoZWFkZXJzIC0gcGh5cwogCi0JUFNYR19SQ1ZfUklORwkJCQlSY3ZSaW5nczsJCQkvLyBSZWNlaXZlIHJpbmdzCisJc3RydWN0IFNYR19SQ1ZfUklORwkJKlJjdlJpbmdzOwkJCS8vIFJlY2VpdmUgcmluZ3MKIAlkbWFfYWRkcl90CSAgICAgICAgICAgIAlQUmN2UmluZ3M7CQkJLy8gUmVjZWl2ZSByaW5ncyAtIHBoeXNpY2FsIGFkZHJlc3MKLQlTWEdfUklOR19JTkZPCQkJCVJjdlJpbmdaZXJvSW5mbzsJLy8gUmVjZWl2ZSByaW5nIDAgaW5mbworCXN0cnVjdCBTWEdfUklOR19JTkZPCQkJCVJjdlJpbmdaZXJvSW5mbzsJLy8gUmVjZWl2ZSByaW5nIDAgaW5mbwogCiAJdTMyICoJCQkJCUlzcjsJCQkJLy8gSW50ZXJydXB0IHN0YXR1cyByZWdpc3RlcgogCWRtYV9hZGRyX3QJICAgICAgICAgICAgCVBJc3I7CQkJCS8vIElTUiAtIHBoeXNpY2FsIGFkZHJlc3MKQEAgLTY0NSw5ICs2NDAsOSBAQAogCXUzMgkJCQkJCUhhc2hJbmZvcm1hdGlvbjsKIAkvLyBSZWNlaXZlIGJ1ZmZlciBxdWV1ZXMKIAlzcGlubG9ja190CVJjdlFMb2NrOwkvKiBSZWNlaXZlIFF1ZXVlIExvY2sgKi8KLQlMSVNUX0VOVFJZCQkJCQlGcmVlUmN2QnVmZmVyczsJCS8vIEZyZWUgU1hHX0RBVEFfQlVGRkVSIHF1ZXVlCi0JTElTVF9FTlRSWQkJCQkJRnJlZVJjdkJsb2NrczsJCS8vIEZyZWUgU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLIFEKLQlMSVNUX0VOVFJZCQkJCQlBbGxSY3ZCbG9ja3M7CQkvLyBBbGwgU1hHX1JDVl9CTE9DS3MKKwlzdHJ1Y3QgTElTVF9FTlRSWQkJCQkJRnJlZVJjdkJ1ZmZlcnM7CQkvLyBGcmVlIFNYR19EQVRBX0JVRkZFUiBxdWV1ZQorCXN0cnVjdCBMSVNUX0VOVFJZCQkJCQlGcmVlUmN2QmxvY2tzOwkJLy8gRnJlZSBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0sgUQorCXN0cnVjdCBMSVNUX0VOVFJZCQkJCQlBbGxSY3ZCbG9ja3M7CQkvLyBBbGwgU1hHX1JDVl9CTE9DS3MKIAl1c2hvcnQJCQkJCQlGcmVlUmN2QnVmZmVyQ291bnQ7CS8vIE51bWJlciBvZiBmcmVlIHJjdiBkYXRhIGJ1ZmZlcnMKIAl1c2hvcnQJCQkJCQlGcmVlUmN2QmxvY2tDb3VudDsJLy8gIyBvZiBmcmVlIHJjdiBkZXNjcmlwdG9yIGJsb2NrcwogCXVzaG9ydAkJCQkJCUFsbFJjdkJsb2NrQ291bnQ7CS8vIE51bWJlciBvZiB0b3RhbCByZWNlaXZlIGJsb2NrcwpAQCAtNjU2LDggKzY1MSw4IEBACiAJdTMyCQkJCQkJUmN2QnVmZmVyc09uQ2FyZDsJLy8gU1hHX0RBVEFfQlVGRkVSUyBvd25lZCBieSBjYXJkCiAJLy8gU0dMIGJ1ZmZlcnMKIAlzcGlubG9ja190CVNnbFFMb2NrOwkvKiBTR0wgUXVldWUgTG9jayAqLwotCUxJU1RfRU5UUlkJCQkJCUZyZWVTZ2xCdWZmZXJzOwkJLy8gRnJlZSBTWEdfU0NBVFRFUl9HQVRIRVIKLQlMSVNUX0VOVFJZCQkJCQlBbGxTZ2xCdWZmZXJzOwkJLy8gQWxsIFNYR19TQ0FUVEVSX0dBVEhFUgorCXN0cnVjdCBMSVNUX0VOVFJZCQkJCQlGcmVlU2dsQnVmZmVyczsJCS8vIEZyZWUgU1hHX1NDQVRURVJfR0FUSEVSCisJc3RydWN0IExJU1RfRU5UUlkJCQkJCUFsbFNnbEJ1ZmZlcnM7CQkvLyBBbGwgU1hHX1NDQVRURVJfR0FUSEVSCiAJdXNob3J0CQkJCQkJRnJlZVNnbEJ1ZmZlckNvdW50OwkvLyBOdW1iZXIgb2YgZnJlZSBTR0wgYnVmZmVycwogCXVzaG9ydAkJCQkJCUFsbFNnbEJ1ZmZlckNvdW50OwkvLyBOdW1iZXIgb2YgdG90YWwgU0dMIGJ1ZmZlcnMKIAl1MzIJCQkJCQlDdXJyZW50VGltZTsJCS8vIFRpY2sgY291bnQKQEAgLTY3OSw3ICs2NzQsNyBAQAogCS8vIFN0YXRzCiAJdTMyCQkJCQkJUGVuZGluZ1JjdkNvdW50OwkvLyBPdXRzdGFuZGluZyByY3YgaW5kaWNhdGlvbnMKIAl1MzIJCQkJCQlQZW5kaW5nWG10Q291bnQ7CS8vIE91dHN0YW5kaW5nIHNlbmQgcmVxdWVzdHMKLQlTWEdfU1RBVFMJCQkJCVN0YXRzOwkJCQkvLyBTdGF0aXN0aWNzCisJc3RydWN0IFNYR19TVEFUUwkJCQlTdGF0czsJCQkJLy8gU3RhdGlzdGljcwogCXUzMgkJCQkJCVJlYXNzQnVmczsJCQkvLyBOdW1iZXIgb2YgcmVhc3NlbWJseSBidWZmZXJzCiAJLy8gQ2FyZCBDcmFzaCBJbmZvCiAJdXNob3J0CQkJCQkJQ3Jhc2hMb2NhdGlvbjsJCS8vIE1pY3JvY29kZSBjcmFzaCBsb2NhdGlvbgpAQCAtNzA4LDcgKzcwMyw3IEBACiAJLy8JZG1hX2FkZHJfdAkJUER1bXBCdWZmZXI7CQkvLyBQaHlzaWNhbCBhZGRyZXNzCiAJLy8jZW5kaWYgLy8gU1hHX0ZBSUxVUkVfRFVNUAogCi19IGFkYXB0ZXJfdCwgKnBfYWRhcHRlcl90OworfTsKIAogI2lmIFNMSUNfRFVNUF9FTkFCTEVECiAjZGVmaW5lIFNMSUNfRFVNUF9SRVFVRVNURUQgICAgICAxCkBAIC03MjEsMTAgKzcxNiwxMCBAQAogICogc3RydWN0dXJlIGlzIHdyaXR0ZW4gb3V0IHRvIHRoZSBjYXJkJ3MgU1JBTSB3aGVuIHRoZSBtaWNyb2NvZGUgcGFuaWMncy4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0IF9zbGljX2NyYXNoX2luZm8geworc3RydWN0IHNsaWNfY3Jhc2hfaW5mbyB7CiAgICAgdXNob3J0ICBjcHVfaWQ7CiAgICAgdXNob3J0ICBjcmFzaF9wYzsKLX0gc2xpY19jcmFzaF9pbmZvLCAqcF9zbGljX2NyYXNoX2luZm87Cit9OwogCiAjZGVmaW5lIENSQVNIX0lORk9fT0ZGU0VUICAgMHgxNTVDCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zeGcvc3hnX29zLmggYi9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Z19vcy5oCmluZGV4IDAxMTgyNjguLjZkM2YyM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zeGcvc3hnX29zLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3N4Zy9zeGdfb3MuaApAQCAtNDQsMTAgKzQ0LDEwIEBACiAjZGVmaW5lIEZBTFNFCSgwKQogI2RlZmluZSBUUlVFCSgxKQogCi10eXBlZGVmIHN0cnVjdCBfTElTVF9FTlRSWSB7Ci0Jc3RydWN0IF9MSVNUX0VOVFJZICpubGVfZmxpbms7Ci0Jc3RydWN0IF9MSVNUX0VOVFJZICpubGVfYmxpbms7Ci19IGxpc3RfZW50cnksIExJU1RfRU5UUlksICpQTElTVF9FTlRSWTsKK3N0cnVjdCBMSVNUX0VOVFJZIHsKKwlzdHJ1Y3QgTElTVF9FTlRSWSAqbmxlX2ZsaW5rOworCXN0cnVjdCBMSVNUX0VOVFJZICpubGVfYmxpbms7Cit9OwogCiAjZGVmaW5lIEluaXRpYWxpemVMaXN0SGVhZChsKSAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIChsKS0+bmxlX2ZsaW5rID0gKGwpLT5ubGVfYmxpbmsgPSAobCkKQEAgLTY4LDEwICs2OCwxMCBAQAogCiAvKiBUaGVzZSB0d28gaGF2ZSB0byBiZSBpbmxpbmVkIHNpbmNlIHRoZXkgcmV0dXJuIHRoaW5ncy4gKi8KIAotc3RhdGljIF9faW5saW5lIFBMSVNUX0VOVFJZIFJlbW92ZUhlYWRMaXN0KGxpc3RfZW50cnkgKiBsKQorc3RhdGljIF9faW5saW5lIHN0cnVjdCBMSVNUX0VOVFJZICpSZW1vdmVIZWFkTGlzdChzdHJ1Y3QgTElTVF9FTlRSWSAqbCkKIHsKLQlsaXN0X2VudHJ5ICpmOwotCWxpc3RfZW50cnkgKmU7CisJc3RydWN0IExJU1RfRU5UUlkgKmY7CisJc3RydWN0IExJU1RfRU5UUlkgKmU7CiAKIAllID0gbC0+bmxlX2ZsaW5rOwogCWYgPSBlLT5ubGVfZmxpbms7CkBAIC04MSwxMCArODEsMTAgQEAKIAlyZXR1cm4gKGUpOwogfQogCi1zdGF0aWMgX19pbmxpbmUgUExJU1RfRU5UUlkgUmVtb3ZlVGFpbExpc3QobGlzdF9lbnRyeSAqIGwpCitzdGF0aWMgX19pbmxpbmUgc3RydWN0IExJU1RfRU5UUlkgKlJlbW92ZVRhaWxMaXN0KHN0cnVjdCBMSVNUX0VOVFJZICpsKQogewotCWxpc3RfZW50cnkgKmI7Ci0JbGlzdF9lbnRyeSAqZTsKKwlzdHJ1Y3QgTElTVF9FTlRSWSAqYjsKKwlzdHJ1Y3QgTElTVF9FTlRSWSAqZTsKIAogCWUgPSBsLT5ubGVfYmxpbms7CiAJYiA9IGUtPm5sZV9ibGluazsKQEAgLTk2LDcgKzk2LDcgQEAKIAogI2RlZmluZSBJbnNlcnRUYWlsTGlzdChsLCBlKSAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIGxpc3RfZW50cnkgICAgICAgICAgICAgICpiOyAgICAgXAorICAgICAgICAgICAgICAgIHN0cnVjdCBMSVNUX0VOVFJZICAgICAgICpiOyAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgIGIgPSAobCktPm5sZV9ibGluazsgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgIChlKS0+bmxlX2ZsaW5rID0gKGwpOyAgICAgICAgICAgXApAQCAtMTA3LDcgKzEwNyw3IEBACiAKICNkZWZpbmUgSW5zZXJ0SGVhZExpc3QobCwgZSkgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBsaXN0X2VudHJ5ICAgICAgICAgICAgICAqZjsgICAgIFwKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgTElTVF9FTlRSWSAgICAgICAqZjsgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICBmID0gKGwpLT5ubGVfZmxpbms7ICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAoZSktPm5sZV9mbGluayA9IGY7ICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zeGcvc3hnZGJnLmggYi9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Z2RiZy5oCmluZGV4IDQ1MjJiOGQuLmJiNThkZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zeGcvc3hnZGJnLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3N4Zy9zeGdkYmcuaApAQCAtODYsNyArODYsNyBAQAogICogbmVlZHMgb2YgdGhlIHRyYWNlIGVudHJ5LiAgVHlwaWNhbGx5IHRoZXkgYXJlIGZ1bmN0aW9uIGNhbGwKICAqIHBhcmFtZXRlcnMuCiAgKi8KLXR5cGVkZWYgc3RydWN0IF90cmFjZV9lbnRyeV9zIHsKK3N0cnVjdCB0cmFjZV9lbnRyeV90IHsKICAgICAgICAgY2hhciAgICAgIG5hbWVbOF07ICAgICAgICAvKiA4IGNoYXJhY3RlciBuYW1lIC0gbGlrZSAncydpJ20nYidhJ3InYyd2JyAqLwogICAgICAgICB1MzIgICB0aW1lOyAgICAgICAgICAgLyogQ3VycmVudCBjbG9jayB0aWMgKi8KICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgY3B1OyAgICAgICAgICAgIC8qIEN1cnJlbnQgQ1BVICovCkBAIC05Nyw3ICs5Nyw3IEBACiAgICAgICAgIHUzMiAgIGFyZzI7ICAgICAgICAgICAvKiBDYWxsZXIgYXJnMiAqLwogICAgICAgICB1MzIgICBhcmczOyAgICAgICAgICAgLyogQ2FsbGVyIGFyZzMgKi8KICAgICAgICAgdTMyICAgYXJnNDsgICAgICAgICAgIC8qIENhbGxlciBhcmc0ICovCi19IHRyYWNlX2VudHJ5X3QsICpwdHJhY2VfZW50cnlfdDsKK307CiAKIC8qCiAgKiBEcml2ZXIgdHlwZXMgZm9yIGRyaXZlciBmaWVsZCBpbiB0cmFjZV9lbnRyeV90CkBAIC0xMDgsMTQgKzEwOCwxMyBAQAogCiAjZGVmaW5lIFRSQUNFX0VOVFJJRVMgICAxMDI0CiAKLXR5cGVkZWYgc3RydWN0IF9zeGdfdHJhY2VfYnVmZmVyX3QKLXsKK3N0cnVjdCBzeGdfdHJhY2VfYnVmZmVyX3QgewogICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgICAgIHNpemU7ICAgICAgICAgICAgICAgICAgLyogYWlkIGZvciB3aW5kYmcgZXh0ZW5zaW9uICovCiAgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICAgICAgaW47ICAgICAgICAgICAgICAgICAgICAvKiBXaGVyZSB0byBhZGQgKi8KICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgICAgICBsZXZlbDsgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgVHJhY2UgbGV2ZWwgKi8KIAlzcGlubG9ja190CWxvY2s7ICAgICAgICAgICAgICAgICAgLyogRm9yIE1QIHRyYWNpbmcgKi8KLSAgICAgICAgdHJhY2VfZW50cnlfdCAgICAgICAgICAgZW50cmllc1tUUkFDRV9FTlRSSUVTXTsvKiBUaGUgY2lyY3VsYXIgYnVmZmVyICovCi19IHN4Z190cmFjZV9idWZmZXJfdDsKKyAgICAgICAgc3RydWN0IHRyYWNlX2VudHJ5X3QgICAgICAgICAgIGVudHJpZXNbVFJBQ0VfRU5UUklFU107LyogVGhlIGNpcmN1bGFyIGJ1ZmZlciAqLworfTsKIAogLyoKICAqIFRoZSB0cmFjZSBsZXZlbHMKQEAgLTEzNyw3ICsxMzYsNyBAQAogI2lmIEFUS19UUkFDRV9FTkFCTEVECiAjZGVmaW5lIFNYR19UUkFDRV9JTklUKGJ1ZmZlciwgdGxldmVsKQkJCQlcCiB7CQkJCQkJCQlcCi0JbWVtc2V0KChidWZmZXIpLCAwLCBzaXplb2Yoc3hnX3RyYWNlX2J1ZmZlcl90KSk7CVwKKwltZW1zZXQoKGJ1ZmZlciksIDAsIHNpemVvZihzdHJ1Y3Qgc3hnX3RyYWNlX2J1ZmZlcl90KSk7CVwKIAkoYnVmZmVyKS0+bGV2ZWwgPSAodGxldmVsKTsJCQkJXAogCShidWZmZXIpLT5zaXplID0gVFJBQ0VfRU5UUklFUzsJCQkJXAogCXNwaW5fbG9ja19pbml0KCYoYnVmZmVyKS0+bG9jayk7CQkJXApAQCAtMTU0LDcgKzE1Myw3IEBACiAgICAgICAgIGlmICgoYnVmZmVyKSAmJiAoKGJ1ZmZlciktPmxldmVsID49ICh0bGV2ZWwpKSkgeyAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgdHJhY2VfaXJxbCA9IDA7ICAgIC8qID8/Pz8/PyBGSVggVEhJUyAgKi8gICAgXAogICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgIHRyYWNlX2xlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBwdHJhY2VfZW50cnlfdCAgdHJhY2VfZW50cnk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN0cnVjdCB0cmFjZV9lbnRyeV90CSp0cmFjZV9lbnRyeTsJCQkJXAogICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1ldmFsICB0aW1ldjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICBzcGluX2xvY2soJihidWZmZXIpLT5sb2NrKTsgICAgICAgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zeGcvc3hnaGlmLmggYi9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Z2hpZi5oCmluZGV4IDg4YmZmYmEuLmE0ZTk0NjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zeGcvc3hnaGlmLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3N4Zy9zeGdoaWYuaApAQCAtMTIsNyArMTIsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFVDT0RFIFJlZ2lzdGVycwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIHN0cnVjdCBfU1hHX1VDT0RFX1JFR1Mgeworc3RydWN0IFNYR19VQ09ERV9SRUdTIHsKIAkvLyBBZGRyZXNzIDAgLSAweDNGID0gQ29tbWFuZCBjb2RlcyAwLTE1IGZvciBUQ0IgMC4gIEV4Y29kZSAwCiAJdTMyIEljcjsJCS8vIENvZGUgPSAwIChleHRlbmRlZCksIEV4Q29kZSA9IDAgLSBJbnQgY29udHJvbAogCXUzMiBSc3ZkUmVnMTsJCS8vIENvZGUgPSAxIC0gVE9FIC1OQQpAQCAtMTI3LDcgKzEyNyw3IEBACiAJLy8gYmFzZS4gIEFzIGV4dGVuZGVkIGNvZGVzIGFyZSBhZGRlZCwgcmVkdWNlIHRoZSBmaXJzdCBhcnJheSB2YWx1ZSBpbgogCS8vIHRoZSBmb2xsb3dpbmcgZmllbGQKIAl1MzIgUGFkVG9OZXh0Q3B1Wzk0XVsxNl07CS8vIDk0ID0gMTI4IC0gMzQgKDM0ID0gRXhjb2RlcyAwIC0gMzMpCi19IFNYR19VQ09ERV9SRUdTLCAqUFNYR19VQ09ERV9SRUdTOworfTsKIAogLy8gSW50ZXJydXB0IGNvbnRyb2wgcmVnaXN0ZXIgKDApIHZhbHVlcwogI2RlZmluZSBTWEdfSUNSX0RJU0FCTEUJCQkJCTB4MDAwMDAwMDAKQEAgLTE2OSw3ICsxNjksNyBAQAogICogaXMgaGFwcGVuaW5nIGlzIHRoYXQgdGhlc2UgcmVnaXN0ZXJzIG9jY3VweSB0aGUgIlBhZEV4WzE1XSIgYXJlYXMgaW4gdGhlCiAgKiBTWEdfVUNPREVfUkVHUyBkZWZpbml0aW9uIGFib3ZlCiAgKi8KLXR5cGVkZWYgc3RydWN0IF9TWEdfVENCX1JFR1Mgeworc3RydWN0IFNYR19UQ0JfUkVHUyB7CiAJdTMyIEV4Q29kZTsJCS8qIEV4dGVuZGVkIGNvZGVzIC0gc2VlIFNYR19VQ09ERV9SRUdTICovCiAJdTMyIFhtdDsJCS8qIENvZGUgPSAxIC0gIyBvZiBYbXQgZGVzY3JpcHRvcnMgYWRkZWQgdG8gcmluZyAqLwogCXUzMiBSY3Y7CQkvKiBDb2RlID0gMiAtICMgb2YgUmN2IGRlc2NyaXB0b3JzIGFkZGVkIHRvIHJpbmcgKi8KQEAgLTE4MCw3ICsxODAsNyBAQAogCXUzMiBSc3ZkNDsJCS8qIENvZGUgPSA3IC0gVE9FIE5BICovCiAJdTMyIFJzdmQ1OwkJLyogQ29kZSA9IDggLSBUT0UgTkEgKi8KIAl1MzIgUGFkWzddOwkJLyogQ29kZXMgOC0xNSAtIE5vdCB1c2VkLiAqLwotfSBTWEdfVENCX1JFR1MsICpQU1hHX1RDQl9SRUdTOworfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSVNSIEZvcm1hdApAQCAtMjcyLDcgKzI3Miw3IEBACiAgKgogICovCiAjcHJhZ21hIHBhY2socHVzaCwgMSkKLXR5cGVkZWYgc3RydWN0IF9TWEdfRVZFTlQgeworc3RydWN0IFNYR19FVkVOVCB7CiAJdTMyIFBhZFsxXTsJCS8vIG5vdCB1c2VkCiAJdTMyIFNuZFVuYTsJCS8vIFNuZFVuYSB2YWx1ZQogCXUzMiBSZXNpZDsJCS8vIHJlY2VpdmUgTURMIHJlc2lkCkBAIC0yOTQsNyArMjk0LDcgQEAKIAl1bnNpZ25lZCBjaGFyIENvZGU7CS8vIEV2ZW50IGNvZGUKIAl1bnNpZ25lZCBjaGFyIENvbW1hbmRJbmRleDsJLy8gTmV3IHJpbmcgaW5kZXgKIAl1bnNpZ25lZCBjaGFyIFN0YXR1czsJLy8gRXZlbnQgc3RhdHVzCi19IFNYR19FVkVOVCwgKlBTWEdfRVZFTlQ7Cit9OwogI3ByYWdtYSBwYWNrKHBvcCkKIAogLy8gRXZlbnQgY29kZSBkZWZpbml0aW9ucwpAQCAtMzIxLDkgKzMyMSw5IEBACiAjZGVmaW5lIEVWRU5UX1JJTkdfQkFUQ0gJMTYJLy8gSGFuZCBlbnRyaWVzIGJhY2sgMTYgYXQgYSB0aW1lLgogI2RlZmluZSBFVkVOVF9CQVRDSF9MSU1JVAkyNTYJLy8gU3RvcCBwcm9jZXNzaW5nIGV2ZW50cyBhZnRlciAyNTYgKDE2ICogMTYpCiAKLXR5cGVkZWYgc3RydWN0IF9TWEdfRVZFTlRfUklORyB7Ci0JU1hHX0VWRU5UIFJpbmdbRVZFTlRfUklOR19TSVpFXTsKLX0gU1hHX0VWRU5UX1JJTkcsICpQU1hHX0VWRU5UX1JJTkc7CitzdHJ1Y3QgU1hHX0VWRU5UX1JJTkcgeworCXN0cnVjdCBTWEdfRVZFTlQgUmluZ1tFVkVOVF9SSU5HX1NJWkVdOworfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTQwMCwxMiArNDAwLDEyIEBACiAjZGVmaW5lIFNYR19NQVhfRU5UUklFUyAgICAgNDA5NgogCiAvLyBTdHJ1Y3R1cmUgYW5kIG1hY3JvcyB0byBtYW5hZ2UgYSByaW5nCi10eXBlZGVmIHN0cnVjdCBfU1hHX1JJTkdfSU5GTyB7CitzdHJ1Y3QgU1hHX1JJTkdfSU5GTyB7CiAJdW5zaWduZWQgY2hhciBIZWFkOwkvLyBXaGVyZSB3ZSBhZGQgZW50cmllcyAtIE5vdGUgdW5zaWduZWQgY2hhcjpSSU5HX1NJWkUKIAl1bnNpZ25lZCBjaGFyIFRhaWw7CS8vIFdoZXJlIHdlIHB1bGwgb2ZmIGNvbXBsZXRlZCBlbnRyaWVzCiAJdXNob3J0IFNpemU7CQkvLyBSaW5nIHNpemUgLSBNdXN0IGJlIG11bHRpcGxlIG9mIDIKIAl2b2lkICpDb250ZXh0W1NYR19NQVhfUklOR19TSVpFXTsJLy8gU2hhZG93IHJpbmcKLX0gU1hHX1JJTkdfSU5GTywgKlBTWEdfUklOR19JTkZPOworfTsKIAogI2RlZmluZSBTWEdfSU5JVElBTElaRV9SSU5HKF9yaW5nLCBfc2l6ZSkgewkJCQkJCQlcCiAJKF9yaW5nKS5IZWFkID0gMDsJCQkJCQkJCQkJCQlcCkBAIC00ODEsNyArNDgxLDcgQEAKICAqICB8X19fX19fX19ffF9fX19fX19fX3xfX19fX19fX198X19fX19fX19ffDI4CQkweDFjCiAgKi8KICNwcmFnbWEgcGFjayhwdXNoLCAxKQotdHlwZWRlZiBzdHJ1Y3QgX1NYR19DTUQgeworc3RydWN0IFNYR19DTUQgewogCWRtYV9hZGRyX3QgU2dsOwkJLy8gUGh5c2ljYWwgYWRkcmVzcyBvZiBTR0wKIAl1bmlvbiB7CiAJCXN0cnVjdCB7CkBAIC01MTgsMTQgKzUxOCwxNCBAQAogCQkJdW5zaWduZWQgY2hhciBOb3RVc2VkOwogCQl9IFN0YXR1czsKIAl9OwotfSBTWEdfQ01ELCAqUFNYR19DTUQ7Cit9OwogI3ByYWdtYSBwYWNrKHBvcCkKIAogI3ByYWdtYSBwYWNrKHB1c2gsIDEpCi10eXBlZGVmIHN0cnVjdCBfVkxBTl9IRFIgeworc3RydWN0IFZMQU5fSERSIHsKIAl1c2hvcnQgVmxhblRjaTsKIAl1c2hvcnQgVmxhblRwaWQ7Ci19IFZMQU5fSERSLCAqUFZMQU5fSERSOworfTsKICNwcmFnbWEgcGFjayhwb3ApCiAKIC8qCkBAIC01NjQsMjIgKzU2NCwyMiBAQAogI2RlZmluZSBTWEdfU0xPV0NNRF9DU1VNX1RDUAkJMHgwMgkvLyBDaGVja3N1bSBUQ1AKICNkZWZpbmUgU1hHX1NMT1dDTURfTFNPCQkJCTB4MDQJLy8gTGFyZ2Ugc2VnbWVudCBzZW5kCiAKLXR5cGVkZWYgc3RydWN0IF9TWEdfWE1UX1JJTkcgewotCVNYR19DTUQgRGVzY3JpcHRvcnNbU1hHX1hNVF9SSU5HX1NJWkVdOwotfSBTWEdfWE1UX1JJTkcsICpQU1hHX1hNVF9SSU5HOworc3RydWN0IFNYR19YTVRfUklORyB7CisJc3RydWN0IFNYR19DTUQgRGVzY3JpcHRvcnNbU1hHX1hNVF9SSU5HX1NJWkVdOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1NYR19SQ1ZfUklORyB7Ci0JU1hHX0NNRCBEZXNjcmlwdG9yc1tTWEdfUkNWX1JJTkdfU0laRV07Ci19IFNYR19SQ1ZfUklORywgKlBTWEdfUkNWX1JJTkc7CitzdHJ1Y3QgU1hHX1JDVl9SSU5HIHsKKwlzdHJ1Y3QgU1hHX0NNRCBEZXNjcmlwdG9yc1tTWEdfUkNWX1JJTkdfU0laRV07Cit9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBTaGFyZSBtZW1vcnkgYnVmZmVyIHR5cGVzIC0gVXNlZCB0byBpZGVudGlmeSBhc3luY2hyb25vdXMKICAqIHNoYXJlZCBtZW1vcnkgYWxsb2NhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgZW51bSB7CitlbnVtIFNYR19CVUZGRVJfVFlQRSB7CiAJU1hHX0JVRkZFUl9UWVBFX1JDViwJLy8gUmVjZWl2ZSBidWZmZXIKIAlTWEdfQlVGRkVSX1RZUEVfU0dMCS8vIFNHTCBidWZmZXIKLX0gU1hHX0JVRkZFUl9UWVBFOworfTsKIAogLy8gU3RhdGUgZm9yIFNYRyBidWZmZXJzCiAjZGVmaW5lIFNYR19CVUZGRVJfRlJFRQkJMHgwMQpAQCAtNjcwLDE5ICs2NzAsMTkgQEAKICNkZWZpbmUgU1hHX01BWF9SQ1ZfQkxPQ0tTCQkJCTEyOAkvLyA9IDE2Mzg0IHJlY2VpdmUgYnVmZmVycwogCiAvLyBSZWNlaXZlIGJ1ZmZlciBoZWFkZXIKLXR5cGVkZWYgc3RydWN0IF9TWEdfUkNWX0RBVEFfQlVGRkVSX0hEUiB7CitzdHJ1Y3QgU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFIgewogCWRtYV9hZGRyX3QgUGh5c2ljYWxBZGRyZXNzOwkvLyBCdWZmZXIgcGh5c2ljYWwgYWRkcmVzcwogCS8vIE5vdGUgLSBETyBOT1QgVVNFIHRoZSBWaXJ0dWFsQWRkcmVzcyBmaWVsZCB0byBsb2NhdGUgZGF0YS4KIAkvLyBVc2UgdGhlIHN4Zy5oOlNYR19SRUNFSVZFX0RBVEFfTE9DQVRJT04gbWFjcm8gaW5zdGVhZC4KIAl2b2lkICpWaXJ0dWFsQWRkcmVzczsJLy8gU3RhcnQgb2YgYnVmZmVyCi0JTElTVF9FTlRSWSBGcmVlTGlzdDsJLy8gRnJlZSBxdWV1ZSBvZiBidWZmZXJzCi0Jc3RydWN0IF9TWEdfUkNWX0RBVEFfQlVGRkVSX0hEUiAqTmV4dDsJLy8gRmFzdHBhdGggZGF0YSBidWZmZXIgcXVldWUKKwlzdHJ1Y3QgTElTVF9FTlRSWSBGcmVlTGlzdDsJLy8gRnJlZSBxdWV1ZSBvZiBidWZmZXJzCisJc3RydWN0IFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSICpOZXh0OwkvLyBGYXN0cGF0aCBkYXRhIGJ1ZmZlciBxdWV1ZQogCXUzMiBTaXplOwkJLy8gQnVmZmVyIHNpemUKIAl1MzIgQnl0ZU9mZnNldDsJCS8vIFNlZSBTWEdfUkVTVE9SRV9NRExfT0ZGU0VUCiAJdW5zaWduZWQgY2hhciBTdGF0ZTsJLy8gU2VlIFNYR19CVUZGRVIgc3RhdGUgYWJvdmUKIAl1bnNpZ25lZCBjaGFyIFN0YXR1czsJLy8gRXZlbnQgc3RhdHVzICh0byBsb2cgUFVTSCkKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwkvLyBEb3VibGUgbWFwcGVkIChuYmwgYW5kIHBrdCkKLX0gU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFIsICpQU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFI7Cit9OwogCiAvLyBTeGdTbG93UmVjZWl2ZSB1c2VzIHRoZSBQQUNLRVQgKHNrYikgY29udGFpbmVkCiAvLyBpbiB0aGUgU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFIgd2hlbiBpbmRpY2F0aW5nIGR1bWItbmljIGRhdGEKQEAgLTY5Myw0MiArNjkzLDQzIEBACiAjZGVmaW5lIFNYR19SQ1ZfSlVNQk9fQlVGRkVSX1NJWkUJCTEwMjQwCS8vIGp1bWJvID0gMTBrIGluY2x1ZGluZyBIRFIKIAogLy8gUmVjZWl2ZSBkYXRhIGRlc2NyaXB0b3IKLXR5cGVkZWYgc3RydWN0IF9TWEdfUkNWX0RBVEFfREVTQ1JJUFRPUiB7CitzdHJ1Y3QgU1hHX1JDVl9EQVRBX0RFU0NSSVBUT1IgewogCXVuaW9uIHsKIAkJc3RydWN0IHNrX2J1ZmYgKlZpcnR1YWxBZGRyZXNzOwkvLyBIb3N0IGhhbmRsZQogCQl1NjQgRm9yY2VUbzhCeXRlczsJLy8gRm9yY2UgeDg2IHRvIDgtYnl0ZSBib3VuZGFyeQogCX07CiAJZG1hX2FkZHJfdCBQaHlzaWNhbEFkZHJlc3M7Ci19IFNYR19SQ1ZfREFUQV9ERVNDUklQVE9SLCAqUFNYR19SQ1ZfREFUQV9ERVNDUklQVE9SOworfTsKIAogLy8gUmVjZWl2ZSBkZXNjcmlwdG9yIGJsb2NrCiAjZGVmaW5lIFNYR19SQ1ZfREVTQ1JJUFRPUlNfUEVSX0JMT0NLCQkxMjgKICNkZWZpbmUgU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLX1NJWkUJCTIwNDgJLy8gRm9yIHNhbml0eSBjaGVjawotdHlwZWRlZiBzdHJ1Y3QgX1NYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DSyB7Ci0JU1hHX1JDVl9EQVRBX0RFU0NSSVBUT1IgRGVzY3JpcHRvcnNbU1hHX1JDVl9ERVNDUklQVE9SU19QRVJfQkxPQ0tdOwotfSBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0ssICpQU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLOworCitzdHJ1Y3QgU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLIHsKKwlzdHJ1Y3QgU1hHX1JDVl9EQVRBX0RFU0NSSVBUT1IgRGVzY3JpcHRvcnNbU1hHX1JDVl9ERVNDUklQVE9SU19QRVJfQkxPQ0tdOworfTsKIAogLy8gUmVjZWl2ZSBkZXNjcmlwdG9yIGJsb2NrIGhlYWRlcgotdHlwZWRlZiBzdHJ1Y3QgX1NYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DS19IRFIgeworc3RydWN0IFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DS19IRFIgewogCXZvaWQgKlZpcnR1YWxBZGRyZXNzOwkvLyBTdGFydCBvZiAyayBidWZmZXIKIAlkbWFfYWRkcl90IFBoeXNpY2FsQWRkcmVzczsJLy8gLi5hbmQgaXQncyBwaHlzaWNhbCBhZGRyZXNzCi0JTElTVF9FTlRSWSBGcmVlTGlzdDsJLy8gRnJlZSBxdWV1ZSBvZiBkZXNjcmlwdG9yIGJsb2NrcworCXN0cnVjdCBMSVNUX0VOVFJZIEZyZWVMaXN0OwkvLyBGcmVlIHF1ZXVlIG9mIGRlc2NyaXB0b3IgYmxvY2tzCiAJdW5zaWduZWQgY2hhciBTdGF0ZTsJLy8gU2VlIFNYR19CVUZGRVIgc3RhdGUgYWJvdmUKLX0gU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLX0hEUiwgKlBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfSERSOworfTsKIAogLy8gUmVjZWl2ZSBibG9jayBoZWFkZXIKLXR5cGVkZWYgc3RydWN0IF9TWEdfUkNWX0JMT0NLX0hEUiB7CitzdHJ1Y3QgU1hHX1JDVl9CTE9DS19IRFIgewogCXZvaWQgKlZpcnR1YWxBZGRyZXNzOwkvLyBTdGFydCBvZiB2aXJ0dWFsIG1lbW9yeQogCWRtYV9hZGRyX3QgUGh5c2ljYWxBZGRyZXNzOwkvLyAuLmFuZCBpdCdzIHBoeXNpY2FsIGFkZHJlc3MKLQlMSVNUX0VOVFJZIEFsbExpc3Q7CS8vIFF1ZXVlIG9mIGFsbCBTWEdfUkNWX0JMT0NLUwotfSBTWEdfUkNWX0JMT0NLX0hEUiwgKlBTWEdfUkNWX0JMT0NLX0hEUjsKKwlzdHJ1Y3QgTElTVF9FTlRSWSBBbGxMaXN0OwkvLyBRdWV1ZSBvZiBhbGwgU1hHX1JDVl9CTE9DS1MKK307CiAKIC8vIE1hY3JvcyB0byBkZXRlcm1pbmUgZGF0YSBzdHJ1Y3R1cmUgb2Zmc2V0cyBpbnRvIHJlY2VpdmUgYmxvY2sKICNkZWZpbmUgU1hHX1JDVl9CTE9DS19TSVpFKF9CdWZmZXJzaXplKSAJCQkJCVwKIAkoKChfQnVmZmVyc2l6ZSkgKiBTWEdfUkNWX0RFU0NSSVBUT1JTX1BFUl9CTE9DSykgKwkJXAotCSAoc2l6ZW9mKFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DSykpICAgICAgICAgICAgICArCQlcCi0JIChzaXplb2YoU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLX0hEUikpICAgICAgICAgICsJCVwKLQkgKHNpemVvZihTWEdfUkNWX0JMT0NLX0hEUikpKQorCSAoc2l6ZW9mKHN0cnVjdCBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0spKSAgICAgICAgICAgICAgKwkJXAorCSAoc2l6ZW9mKHN0cnVjdCBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfSERSKSkgICAgICAgICAgKwkJXAorCSAoc2l6ZW9mKHN0cnVjdCBTWEdfUkNWX0JMT0NLX0hEUikpKQogI2RlZmluZSBTWEdfUkNWX0JVRkZFUl9EQVRBX1NJWkUoX0J1ZmZlcnNpemUpCQkJCVwKIAkoKF9CdWZmZXJzaXplKSAtIFNYR19SQ1ZfREFUQV9IRFJfU0laRSkKICNkZWZpbmUgU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFJfT0ZGU0VUKF9CdWZmZXJzaXplKQkJCVwKQEAgLTczNywxOCArNzM4LDE4IEBACiAJKChfQnVmZmVyc2l6ZSkgKiBTWEdfUkNWX0RFU0NSSVBUT1JTX1BFUl9CTE9DSykKICNkZWZpbmUgU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLX0hEUl9PRkZTRVQoX0J1ZmZlcnNpemUpCVwKIAkoKChfQnVmZmVyc2l6ZSkgKiBTWEdfUkNWX0RFU0NSSVBUT1JTX1BFUl9CTE9DSykgKwkJXAotCSAoc2l6ZW9mKFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DSykpKQorCSAoc2l6ZW9mKHN0cnVjdCBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0spKSkKICNkZWZpbmUgU1hHX1JDVl9CTE9DS19IRFJfT0ZGU0VUKF9CdWZmZXJzaXplKQkJCQlcCiAJKCgoX0J1ZmZlcnNpemUpICogU1hHX1JDVl9ERVNDUklQVE9SU19QRVJfQkxPQ0spICsJCVwKLQkgKHNpemVvZihTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0spKSAgICAgICAgICAgICAgKwkJXAotCSAoc2l6ZW9mKFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DS19IRFIpKSkKKwkgKHNpemVvZihzdHJ1Y3QgU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLKSkgICAgICAgICAgICAgICsJCVwKKwkgKHNpemVvZihzdHJ1Y3QgU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLX0hEUikpKQogCiAvLyBVc2UgdGhlIG1pbmlwb3J0IHJlc2VydmVkIHBvcnRpb24gb2YgdGhlIE5CTCB0byBsb2NhdGUKIC8vIG91ciBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUiBzdHJ1Y3R1cmUuCi10eXBlZGVmIHN0cnVjdCBfU1hHX1JDVl9OQkxfUkVTRVJWRUQgewotCVBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUiBSY3ZEYXRhQnVmZmVySGRyOworc3RydWN0IFNYR19SQ1ZfTkJMX1JFU0VSVkVEIHsKKwlzdHJ1Y3QgU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFIgKlJjdkRhdGFCdWZmZXJIZHI7CiAJdm9pZCAqQXZhaWxhYmxlOwotfSBTWEdfUkNWX05CTF9SRVNFUlZFRCwgKlBTWEdfUkNWX05CTF9SRVNFUlZFRDsKK307CiAKICNkZWZpbmUgU1hHX1JDVl9OQkxfQlVGRkVSX0hEUihfTkJMKSAoKChQU1hHX1JDVl9OQkxfUkVTRVJWRUQpTkVUX0JVRkZFUl9MSVNUX01JTklQT1JUX1JFU0VSVkVEKF9OQkwpKS0+UmN2RGF0YUJ1ZmZlckhkcikKIApAQCAtNzYwLDExICs3NjEsMTEgQEAKICNkZWZpbmUgU1hHX01BWF9TR0xfQlVGRkVSUwkJCTE2Mzg0CS8vIE1heGltdW0gdG8gYWxsb2NhdGUgKG5vdGUgQURBUFQ6dXNob3J0KQogCiAvLyBTZWxmIGlkZW50aWZ5aW5nIHN0cnVjdHVyZSB0eXBlCi10eXBlZGVmIGVudW0gX1NYR19TR0xfVFlQRSB7CitlbnVtIFNYR19TR0xfVFlQRSB7CiAJU1hHX1NHTF9EVU1CLAkJLy8gRHVtYiBOSUMgU0dMCiAJU1hHX1NHTF9TTE9XLAkJLy8gU2xvd3BhdGggcHJvdG9jb2wgaGVhZGVyIC0gc2VlIGJlbG93CiAJU1hHX1NHTF9DSElNTkVZCQkvLyBDaGltbmV5IG9mZmxvYWQgU0dMCi19IFNYR19TR0xfVFlQRSwgUFNYR19TR0xfVFlQRTsKK307CiAKIC8vIE5vdGUgLSB0aGUgZGVzY3JpcHRpb24gYmVsb3cgaXMgTWljcm9zb2Z0IHNwZWNpZmljCiAvLwpAQCAtNzk4LDQxICs3OTksNDEgQEAKIC8vIHRvIHRoZSBjYXJkIGRpcmVjdGx5LiAgRm9yIHg4NiBzeXN0ZW1zIHdlIG11c3QgcmVjb25zdHJ1Y3QKIC8vIHRoZSBTR0wuICBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBkZWZpbmVzIGFuIHg2NAogLy8gZm9ybWF0dGVkIFNHTCBlbnRyeQotdHlwZWRlZiBzdHJ1Y3QgX1NYR19YNjRfU0dFIHsKK3N0cnVjdCBTWEdfWDY0X1NHRSB7CiAJZG1hNjRfYWRkcl90IEFkZHJlc3M7CS8vIHNhbWUgYXMgd2RtLmgKIAl1MzIgTGVuZ3RoOwkJLy8gc2FtZSBhcyB3ZG0uaAogCXUzMiBDb21waWxlclBhZDsJLy8gVGhlIGNvbXBpbGVyIHBhZHMgdG8gOC1ieXRlcwogCXU2NCBSZXNlcnZlZDsJCS8vIHUzMiAqIGluIHdkbS5oLiAgRm9yY2UgdG8gOCBieXRlcwotfSBTWEdfWDY0X1NHRSwgKlBTWEdfWDY0X1NHRTsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9TQ0FUVEVSX0dBVEhFUl9FTEVNRU5UIHsKK3N0cnVjdCBTQ0FUVEVSX0dBVEhFUl9FTEVNRU5UIHsKIAlkbWE2NF9hZGRyX3QgQWRkcmVzczsJLy8gc2FtZSBhcyB3ZG0uaAogCXUzMiBMZW5ndGg7CQkvLyBzYW1lIGFzIHdkbS5oCiAJdTMyIENvbXBpbGVyUGFkOwkvLyBUaGUgY29tcGlsZXIgcGFkcyB0byA4LWJ5dGVzCiAJdTY0IFJlc2VydmVkOwkJLy8gdTMyICogaW4gd2RtLmguICBGb3JjZSB0byA4IGJ5dGVzCi19IFNDQVRURVJfR0FUSEVSX0VMRU1FTlQsICpQU0NBVFRFUl9HQVRIRVJfRUxFTUVOVDsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9TQ0FUVEVSX0dBVEhFUl9MSVNUIHsKK3N0cnVjdCBTQ0FUVEVSX0dBVEhFUl9MSVNUIHsKIAl1MzIgTnVtYmVyT2ZFbGVtZW50czsKIAl1MzIgKlJlc2VydmVkOwotCVNDQVRURVJfR0FUSEVSX0VMRU1FTlQgRWxlbWVudHNbXTsKLX0gU0NBVFRFUl9HQVRIRVJfTElTVCwgKlBTQ0FUVEVSX0dBVEhFUl9MSVNUOworCXN0cnVjdCBTQ0FUVEVSX0dBVEhFUl9FTEVNRU5UIEVsZW1lbnRzW107Cit9OwogCiAvLyBUaGUgY2FyZCBkb2Vzbid0IGNhcmUgYWJvdXQgYW55dGhpbmcgZXhjZXB0IGVsZW1lbnRzLCBzbwogLy8gd2UgY2FuIGxlYXZlIHRoZSB1MzIgKiByZXNlcnZlZCBmaWVsZCBhbG9uZSBpbiB0aGUgZm9sbG93aW5nCiAvLyBTR0wgc3RydWN0dXJlLiAgQnV0IHJlZGVmaW5lIGZyb20gd2RtLmg6U0NBVFRFUl9HQVRIRVJfTElTVCBzbwogLy8gd2UgY2FuIHNwZWNpZnkgU1hHX1g2NF9TR0UgYW5kIGRlZmluZSBhIGZpeGVkIG51bWJlciBvZiBlbGVtZW50cwotdHlwZWRlZiBzdHJ1Y3QgX1NYR19YNjRfU0dMIHsKK3N0cnVjdCBTWEdfWDY0X1NHTCB7CiAJdTMyIE51bWJlck9mRWxlbWVudHM7CiAJdTMyICpSZXNlcnZlZDsKLQlTWEdfWDY0X1NHRSBFbGVtZW50c1tTWEdfU0dMX0VOVFJJRVNdOwotfSBTWEdfWDY0X1NHTCwgKlBTWEdfWDY0X1NHTDsKKwlzdHJ1Y3QgU1hHX1g2NF9TR0UgRWxlbWVudHNbU1hHX1NHTF9FTlRSSUVTXTsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9TWEdfU0NBVFRFUl9HQVRIRVIgewotCVNYR19TR0xfVFlQRSBUeXBlOwkvLyBGSVJTVCEgRHVtYi1uaWMgb3Igb2ZmbG9hZAorc3RydWN0IFNYR19TQ0FUVEVSX0dBVEhFUiB7CisJZW51bSBTWEdfU0dMX1RZUEUgVHlwZTsJLy8gRklSU1QhIER1bWItbmljIG9yIG9mZmxvYWQKIAl2b2lkICphZGFwdGVyOwkJLy8gQmFjayBwb2ludGVyIHRvIGFkYXB0ZXIKLQlMSVNUX0VOVFJZIEZyZWVMaXN0OwkvLyBGcmVlIFNYR19TQ0FUVEVSX0dBVEhFUiBibG9ja3MKLQlMSVNUX0VOVFJZIEFsbExpc3Q7CS8vIEFsbCBTWEdfU0NBVFRFUl9HQVRIRVIgYmxvY2tzCisJc3RydWN0IExJU1RfRU5UUlkgRnJlZUxpc3Q7CS8vIEZyZWUgU1hHX1NDQVRURVJfR0FUSEVSIGJsb2NrcworCXN0cnVjdCBMSVNUX0VOVFJZIEFsbExpc3Q7CS8vIEFsbCBTWEdfU0NBVFRFUl9HQVRIRVIgYmxvY2tzCiAJZG1hX2FkZHJfdCBQaHlzaWNhbEFkZHJlc3M7CS8vIHBoeXNpY2FsIGFkZHJlc3MKIAl1bnNpZ25lZCBjaGFyIFN0YXRlOwkvLyBTZWUgU1hHX0JVRkZFUiBzdGF0ZSBhYm92ZQogCXVuc2lnbmVkIGNoYXIgQ21kSW5kZXg7CS8vIENvbW1hbmQgcmluZyBpbmRleApAQCAtODQwLDE4ICs4NDEsMTggQEAKIAl1MzIgRGlyZWN0aW9uOwkJLy8gRm9yIGFzeW5jaHJvbm91cyBjb21wbGV0aW9ucwogCXUzMiBDdXJPZmZzZXQ7CQkvLyBDdXJyZW50IFNHTCBvZmZzZXQKIAl1MzIgU2dsUmVmOwkJLy8gU0dMIHJlZmVyZW5jZSBjb3VudAotCVZMQU5fSERSIFZsYW5UYWc7CS8vIFZMQU4gdGFnIHRvIGJlIGluc2VydGVkIGludG8gU0dMCi0JUFNDQVRURVJfR0FUSEVSX0xJU1QgcFNnbDsJLy8gU0dMIEFkZHIuIFBvc3NpYmx5ICZTZ2wKLQlTWEdfWDY0X1NHTCBTZ2w7CS8vIFNHTCBoYW5kZWQgdG8gY2FyZAotfSBTWEdfU0NBVFRFUl9HQVRIRVIsICpQU1hHX1NDQVRURVJfR0FUSEVSOworCXN0cnVjdCBWTEFOX0hEUiBWbGFuVGFnOwkvLyBWTEFOIHRhZyB0byBiZSBpbnNlcnRlZCBpbnRvIFNHTAorCXN0cnVjdCBTQ0FUVEVSX0dBVEhFUl9MSVNUICpwU2dsOwkvLyBTR0wgQWRkci4gUG9zc2libHkgJlNnbAorCXN0cnVjdCBTWEdfWDY0X1NHTCBTZ2w7CS8vIFNHTCBoYW5kZWQgdG8gY2FyZAorfTsKIAogI2lmIGRlZmluZWQoQ09ORklHX1g4Nl82NCkKICNkZWZpbmUgU1hHX1NHTF9CVUZGRVIoX1N4Z1NnbCkJCSgmX1N4Z1NnbC0+U2dsKQotI2RlZmluZSBTWEdfU0dMX0JVRl9TSVpFCQkJc2l6ZW9mKFNYR19YNjRfU0dMKQorI2RlZmluZSBTWEdfU0dMX0JVRl9TSVpFCQkJc2l6ZW9mKHN0cnVjdCBTWEdfWDY0X1NHTCkKICNlbGlmIGRlZmluZWQoQ09ORklHX1g4NikKIC8vIEZvcmNlIE5ESVMgdG8gZ2l2ZSB1cyBpdCdzIG93biBidWZmZXIgc28gd2UgY2FuIHJlZm9ybWF0IHRvIG91ciBvd24KICNkZWZpbmUgU1hHX1NHTF9CVUZGRVIoX1N4Z1NnbCkJCU5VTEwKICNkZWZpbmUgU1hHX1NHTF9CVUZfU0laRQkJCTAKICNlbHNlCi1TdG9wIENvbXBpbGF0aW9uOworI2Vycm9yIHN0YWdpbmc6IHN4ZzogZHJpdmVyIGlzIGZvciBYODYgb25seSEKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3N4Zy9zeGdody5oIGIvZHJpdmVycy9zdGFnaW5nL3N4Zy9zeGdody5oCmluZGV4IDIyMjJhZTkuLmIwZWZmZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zeGcvc3hnaHcuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Z2h3LmgKQEAgLTQ4LDcgKzQ4LDcgQEAKICNkZWZpbmUgU1hHX0hXUkVHX01FTVNJWkUJMHg0MDAwCQkvLyAxNmsKIAogI3ByYWdtYSBwYWNrKHB1c2gsIDEpCi10eXBlZGVmIHN0cnVjdCBfU1hHX0hXX1JFR1Mgeworc3RydWN0IFNYR19IV19SRUdTIHsKIAl1MzIJCVJlc2V0OwkJCQkvLyBXcml0ZSAweGRlYWQgdG8gaW52b2tlIHNvZnQgcmVzZXQKIAl1MzIJCVBhZDE7CQkJCS8vIE5vIHJlZ2lzdGVyIGRlZmluZWQgYXQgb2Zmc2V0IDQKIAl1MzIJCUludGVycnVwdE1hc2swOwkJLy8gRGVhc3NlcnQgbGVnYWN5IGludGVycnVwdCBvbiBmdW5jdGlvbiAwCkBAIC0xMTMsNyArMTEzLDcgQEAKIAl1MzIJCVNvZnR3YXJlWzE5MjBdOwkJLy8gMHgyMDAgLSAweDIwMDAgLSBTb2Z0d2FyZSBkZWZpbmVkIChub3QgdXNlZCkKIAl1MzIJCU1zaXhUYWJsZVsxMDI0XTsJLy8gMHgyMDAwIC0gMHgzMDAwIC0gTVNJWCBUYWJsZQogCXUzMgkJTXNpeEJpdEFycmF5WzEwMjRdOwkvLyAweDMwMDAgLSAweDQwMDAgLSBNU0lYIFBlbmRpbmcgQml0IEFycmF5Ci19IFNYR19IV19SRUdTLCAqUFNYR19IV19SRUdTOworfTsKICNwcmFnbWEgcGFjayhwb3ApCiAKIC8vIE1pY3JvY29kZSBBZGRyZXNzIEZsYWdzCkBAIC01MTksMTAgKzUxOSwxMCBAQAogI2RlZmluZQlYU19MQU5FX0FMSUdOCQkJMHgxMDAwCQkJLy8gWFMgdHJhbnNtaXQgbGFuZXMgYWxpZ25lZAogCiAvLyBQSFkgTWljcm9jb2RlIGRvd25sb2FkIGRhdGEgc3RydWN0dXJlCi10eXBlZGVmIHN0cnVjdCBfUEhZX1VDT0RFIHsKK3N0cnVjdCBQSFlfVUNPREUgewogCXVzaG9ydAlBZGRyOwogCXVzaG9ydAlEYXRhOwotfSBQSFlfVUNPREUsICpQUEhZX1VDT0RFOworfTsKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTUzNyw3ICs1MzcsNyBAQAogLy8gYWxsIGNvbW1hbmRzIC0gc2VlIHRoZSBTYWhhcmEgc3BlYyBmb3IgZGV0YWlscy4gIE5vdGUgdGhhdCB0aGlzIHN0cnVjdHVyZSBpcwogLy8gb25seSB2YWxpZCB3aGVuIGNvbXBpbGVkIG9uIGEgbGl0dGxlIGVuZGlhbiBtYWNoaW5lLgogI3ByYWdtYSBwYWNrKHB1c2gsIDEpCi10eXBlZGVmIHN0cnVjdCBfWE1UX0RFU0Mgeworc3RydWN0IFhNVF9ERVNDIHsKIAl1c2hvcnQJWG10TGVuOwkJCS8vIHdvcmQgMCwgYml0cyBbMTU6MF0gLSAgdHJhbnNtaXQgbGVuZ3RoCiAJdW5zaWduZWQgY2hhcglYbXRDdGw7CQkJLy8gd29yZCAwLCBiaXRzIFsyMzoxNl0gLSB0cmFuc21pdCBjb250cm9sIGJ5dGUKIAl1bnNpZ25lZCBjaGFyCUNtZDsJCQkvLyB3b3JkIDAsIGJpdHMgWzMxOjI0XSAtIHRyYW5zbWl0IGNvbW1hbmQgcGx1cyBtaXNjLgpAQCAtNTUxLDcgKzU1MSw3IEBACiAJdTMyCVJzdmQzOwkJCS8vIHdvcmQgNSwgYml0cyBbMzE6MF0gLSAgUEFECiAJdTMyCVJzdmQ0OwkJICAgIC8vIHdvcmQgNiwgYml0cyBbMzE6MF0gLSAgUEFECiAJdTMyCVJzdmQ1OwkJICAgIC8vIHdvcmQgNywgYml0cyBbMzE6MF0gLSAgUEFECi19IFhNVF9ERVNDLCAqUFhNVF9ERVNDOworfTsKICNwcmFnbWEgcGFjayhwb3ApCiAKIC8vIFhNVF9ERVNDIENtZCBieXRlIGRlZmluaXRpb25zCkBAIC02MDAsNyArNjAwLDcgQEAKIC8vIEZvcm1hdCBvZiB0aGUgMTggYnl0ZSBSZWNlaXZlIEJ1ZmZlciByZXR1cm5lZCBieSB0aGUKIC8vIFJlY2VpdmUgU2VxdWVuY2VyIGZvciByZWNlaXZlZCBwYWNrZXRzCiAjcHJhZ21hIHBhY2socHVzaCwgMSkKLXR5cGVkZWYgc3RydWN0IF9SQ1ZfQlVGX0hEUiB7CitzdHJ1Y3QgUkNWX0JVRl9IRFIgewogCXUzMglTdGF0dXM7CQkJCS8vIFN0YXR1cyB3b3JkIGZyb20gUmN2IFNlcSBQYXJzZXIKIAl1c2hvcnQJTGVuZ3RoOwkJCQkvLyBSY3YgcGFja2V0IGJ5dGUgY291bnQKIAl1bmlvbiB7CkBAIC02MTUsNyArNjE1LDcgQEAKIAl1bnNpZ25lZCBjaGFyCUlwSGRyT2Zmc2V0OwkJLy8gSVAgaGVhZGVyIG9mZnNldCBpbnRvIHBhY2tldAogCXUzMglUcHpIYXNoOwkJCS8vIFRvZXBsaXR6IGhhc2gKIAl1c2hvcnQJUmVzZXJ2ZWQ7CQkJLy8gUmVzZXJ2ZWQKLX0gUkNWX0JVRl9IRFIsICpQUkNWX0JVRl9IRFI7Cit9OwogI3ByYWdtYSBwYWNrKHBvcCkKIAogCkBAIC02NjUsMjggKzY2NSwyOCBAQAogI3ByYWdtYSBwYWNrKHB1c2gsIDEpCiAKIC8qICovCi10eXBlZGVmIHN0cnVjdCBfSFdfQ0ZHX0RBVEEgeworc3RydWN0IEhXX0NGR19EQVRBIHsKIAl1c2hvcnQJCUFkZHI7CiAJdW5pb24gewogCQl1c2hvcnQJRGF0YTsKIAkJdXNob3J0CUNoZWNrc3VtOwogCX07Ci19IEhXX0NGR19EQVRBLCAqUEhXX0NGR19EQVRBOworfTsKIAogLyogKi8KLSNkZWZpbmUJTlVNX0hXX0NGR19FTlRSSUVTCSgoMTI4L3NpemVvZihIV19DRkdfREFUQSkpIC0gNCkKKyNkZWZpbmUJTlVNX0hXX0NGR19FTlRSSUVTCSgoMTI4L3NpemVvZihzdHJ1Y3QgSFdfQ0ZHX0RBVEEpKSAtIDQpCiAKIC8qIE1BQyBhZGRyZXNzICovCi10eXBlZGVmIHN0cnVjdCBfU1hHX0NPTkZJR19NQUMgeworc3RydWN0IFNYR19DT05GSUdfTUFDIHsKIAl1bnNpZ25lZCBjaGFyCQlNYWNBZGRyWzZdOwkJCS8qIE1BQyBBZGRyZXNzICovCi19IFNYR19DT05GSUdfTUFDLCAqUFNYR19DT05GSUdfTUFDOworfTsKIAogLyogKi8KLXR5cGVkZWYgc3RydWN0IF9BVEtfRlJVIHsKK3N0cnVjdCBBVEtfRlJVIHsKIAl1bnNpZ25lZCBjaGFyCQlQYXJ0TnVtWzZdOwogCXVuc2lnbmVkIGNoYXIJCVJldmlzaW9uWzJdOwogCXVuc2lnbmVkIGNoYXIJCVNlcmlhbFsxNF07Ci19IEFUS19GUlUsICpQQVRLX0ZSVTsKK307CiAKIC8qIE9FTSBGUlUgRm9ybWF0IHR5cGVzICovCiAjZGVmaW5lCUFUS19GUlVfRk9STUFUCQkweDAwMDAKQEAgLTY5OCwyNCArNjk4LDI0IEBACiAjZGVmaW5lIE5PX0ZSVV9GT1JNQVQJCTB4RkZGRgogCiAvKiBFRVBST00vRmxhc2ggRm9ybWF0ICovCi10eXBlZGVmIHN0cnVjdCBfU1hHX0NPTkZJRyB7CitzdHJ1Y3QgU1hHX0NPTkZJRyB7CiAJLyogKi8KIAkvKiBTZWN0aW9uIDEgKDEyOCBieXRlcykgKi8KIAkvKiAqLwogCXVzaG9ydAkJCU1hZ2ljV29yZDsJCQkvKiBFRVBST00vRkxBU0ggTWFnaWMgY29kZSAnQTVBNScgKi8KIAl1c2hvcnQJCQlTcGlDbGtzOwkJCS8qIFNQSSBidXMgY2xvY2sgZGl2aWRlcnMgKi8KLQlIV19DRkdfREFUQQkJSHdDZmdbTlVNX0hXX0NGR19FTlRSSUVTXTsKKwlzdHJ1Y3QgSFdfQ0ZHX0RBVEEJCUh3Q2ZnW05VTV9IV19DRkdfRU5UUklFU107CiAJLyogKi8KIAkvKiAqLwogCS8qICovCiAJdXNob3J0CQkJVmVyc2lvbjsJCQkvKiBFRVBST00gZm9ybWF0IHZlcnNpb24gKi8KLQlTWEdfQ09ORklHX01BQwlNYWNBZGRyWzRdOwkJCS8qIHNwYWNlIGZvciA0IE1BQyBhZGRyZXNzZXMgKi8KLQlBVEtfRlJVCQkJQXRrRnJ1OwkJCQkvKiBGUlUgaW5mb3JtYXRpb24gKi8KKwlzdHJ1Y3QgU1hHX0NPTkZJR19NQUMJTWFjQWRkcls0XTsJCQkvKiBzcGFjZSBmb3IgNCBNQUMgYWRkcmVzc2VzICovCisJc3RydWN0IEFUS19GUlUJCQlBdGtGcnU7CQkJCS8qIEZSVSBpbmZvcm1hdGlvbiAqLwogCXVzaG9ydAkJCU9lbUZydUZvcm1hdDsJCS8qIE9FTSBGUlUgZm9ybWF0IHR5cGUgKi8KIAl1bnNpZ25lZCBjaGFyCQkJT2VtRnJ1Wzc2XTsJCQkvKiBPRU0gRlJVIGluZm9ybWF0aW9uIChvcHRpb25hbCkgKi8KIAl1c2hvcnQJCQlDaGVja3N1bTsJCQkvKiBDaGVja3N1bSBvZiBzZWN0aW9uIDIgKi8KIAkvKiBDUyBpbmZvIFhYWFRPRE8gKi8KLX0gU1hHX0NPTkZJRywgKlBTWEdfQ09ORklHOworfTsKICNwcmFnbWEgcGFjayhwb3ApCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3N4Zy9zeGdwaHljb2RlLmggYi9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Z3BoeWNvZGUuaAppbmRleCA4ZGJhZWRhLi4xNjdmMzU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Z3BoeWNvZGUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc3hnL3N4Z3BoeWNvZGUuaApAQCAtMTgsNyArMTgsNyBAQAogLyoKICAqIERvd25sb2FkIGZvciBBRUwyMDA1QyBQSFkgd2l0aCBTUi9MUiB0cmFuc2NlaXZlciAoMTBHQkFTRS1TUiBvciAxMEdCQVNFLUxSKQogICovCi1zdGF0aWMgUEhZX1VDT0RFIFBoeVVjb2RlW10gPSB7CitzdGF0aWMgc3RydWN0IFBIWV9VQ09ERSBQaHlVY29kZVtdID0gewogCS8qCiAJICogTk9URTogIEFuIGFkZHJlc3Mgb2YgMCBpcyBhIHNwZWNpYWwgY2FzZS4gIFdoZW4gdGhlIGRvd25sb2FkIHJvdXRpbmUKIAkgKiBzZWVzIGFuIGFkZHJlc3Mgb2YgMCwgaXQgZG9lcyBub3Qgd3JpdGUgdG8gdGhlIFBIWS4gIEluc3RlYWQsIGl0CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yi5oIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWIuaAppbmRleCBmNTQxYTNhLi4wMjJkMDY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViLmgKQEAgLTkxLDUgKzkxLDUgQEAKIHZvaWQgc3R1Yl9lbnF1ZXVlX3JldF91bmxpbmsoc3RydWN0IHN0dWJfZGV2aWNlICosIF9fdTMyLCBfX3UzMik7CiAKIC8qIHN0dWJfbWFpbi5jICovCi1pbnQgbWF0Y2hfYnVzaWQoY2hhciAqYnVzaWQpOworaW50IG1hdGNoX2J1c2lkKGNvbnN0IGNoYXIgKmJ1c2lkKTsKIHZvaWQgc3R1Yl9kZXZpY2VfY2xlYW51cF91cmJzKHN0cnVjdCBzdHViX2RldmljZSAqc2Rldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl9kZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX2Rldi5jCmluZGV4IGVlNDU1YTAuLjFlMzIwY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX2Rldi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX2Rldi5jCkBAIC0zODksNyArMzg5LDcgQEAKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKTsKIAlzdHJ1Y3Qgc3R1Yl9kZXZpY2UgKnNkZXYgPSBOVUxMOwotCWNoYXIgKnVkZXZfYnVzaWQgPSBpbnRlcmZhY2UtPmRldi5wYXJlbnQtPmJ1c19pZDsKKwljb25zdCBjaGFyICp1ZGV2X2J1c2lkID0gZGV2X25hbWUoaW50ZXJmYWNlLT5kZXYucGFyZW50KTsKIAlpbnQgZXJyID0gMDsKIAogCWRldl9kYmcoJmludGVyZmFjZS0+ZGV2LCAiRW50ZXJcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfbWFpbi5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfbWFpbi5jCmluZGV4IGM2NjVkN2YuLjA1ZTRjNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX21haW4uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl9tYWluLmMKQEAgLTQwLDExICs0MCwxMiBAQAogICogcmVtb3RlIGhvc3QuCiAgKi8KICNkZWZpbmUgTUFYX0JVU0lEIDE2Ci1zdGF0aWMgY2hhciBidXNpZF90YWJsZVtNQVhfQlVTSURdW0JVU19JRF9TSVpFXTsKKyNkZWZpbmUgQlVTSURfU0laRSAyMAorc3RhdGljIGNoYXIgYnVzaWRfdGFibGVbTUFYX0JVU0lEXVtCVVNJRF9TSVpFXTsKIHN0YXRpYyBzcGlubG9ja190IGJ1c2lkX3RhYmxlX2xvY2s7CiAKIAotaW50IG1hdGNoX2J1c2lkKGNoYXIgKmJ1c2lkKQoraW50IG1hdGNoX2J1c2lkKGNvbnN0IGNoYXIgKmJ1c2lkKQogewogCWludCBpOwogCkBAIC01Miw3ICs1Myw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0JVU0lEOyBpKyspCiAJCWlmIChidXNpZF90YWJsZVtpXVswXSkKLQkJCWlmICghc3RybmNtcChidXNpZF90YWJsZVtpXSwgYnVzaWQsIEJVU19JRF9TSVpFKSkgeworCQkJaWYgKCFzdHJuY21wKGJ1c2lkX3RhYmxlW2ldLCBidXNpZCwgQlVTSURfU0laRSkpIHsKIAkJCQkvKiBhbHJlYWR5IHJlZ2lzdGVyZCAqLwogCQkJCXNwaW5fdW5sb2NrKCZidXNpZF90YWJsZV9sb2NrKTsKIAkJCQlyZXR1cm4gMDsKQEAgLTkyLDcgKzkzLDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBNQVhfQlVTSUQ7IGkrKykKIAkJaWYgKCFidXNpZF90YWJsZVtpXVswXSkgewotCQkJc3RybmNweShidXNpZF90YWJsZVtpXSwgYnVzaWQsIEJVU19JRF9TSVpFKTsKKwkJCXN0cm5jcHkoYnVzaWRfdGFibGVbaV0sIGJ1c2lkLCBCVVNJRF9TSVpFKTsKIAkJCXNwaW5fdW5sb2NrKCZidXNpZF90YWJsZV9sb2NrKTsKIAkJCXJldHVybiAwOwogCQl9CkBAIC0xMDksOSArMTEwLDkgQEAKIAlzcGluX2xvY2soJmJ1c2lkX3RhYmxlX2xvY2spOwogCiAJZm9yIChpID0gMDsgaSA8IE1BWF9CVVNJRDsgaSsrKQotCQlpZiAoIXN0cm5jbXAoYnVzaWRfdGFibGVbaV0sIGJ1c2lkLCBCVVNfSURfU0laRSkpIHsKKwkJaWYgKCFzdHJuY21wKGJ1c2lkX3RhYmxlW2ldLCBidXNpZCwgQlVTSURfU0laRSkpIHsKIAkJCS8qIGZvdW5kICovCi0JCQltZW1zZXQoYnVzaWRfdGFibGVbaV0sIDAsIEJVU19JRF9TSVpFKTsKKwkJCW1lbXNldChidXNpZF90YWJsZVtpXSwgMCwgQlVTSURfU0laRSk7CiAJCQlzcGluX3VubG9jaygmYnVzaWRfdGFibGVfbG9jayk7CiAJCQlyZXR1cm4gMDsKIAkJfQpAQCAtMTI1LDE5ICsxMjYsMTkgQEAKIAkJc2l6ZV90IGNvdW50KQogewogCWludCBsZW47Ci0JY2hhciBidXNpZFtCVVNfSURfU0laRV07CisJY2hhciBidXNpZFtCVVNJRF9TSVpFXTsKIAogCWlmIChjb3VudCA8IDUpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyogc3RybmxlbigpIGRvZXMgbm90IGluY2x1ZGUgXDAgKi8KLQlsZW4gPSBzdHJubGVuKGJ1ZiArIDQsIEJVU19JRF9TSVpFKTsKKwlsZW4gPSBzdHJubGVuKGJ1ZiArIDQsIEJVU0lEX1NJWkUpOwogCiAJLyogYnVzaWQgbmVlZHMgdG8gaW5jbHVkZSBcMCB0ZXJtaW5hdGlvbiAqLwotCWlmICghKGxlbiA8IEJVU19JRF9TSVpFKSkKKwlpZiAoIShsZW4gPCBCVVNJRF9TSVpFKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzdHJuY3B5KGJ1c2lkLCBidWYgKyA0LCBCVVNfSURfU0laRSk7CisJc3RybmNweShidXNpZCwgYnVmICsgNCwgQlVTSURfU0laRSk7CiAKIAogCWlmICghc3RybmNtcChidWYsICJhZGQgIiwgNCkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX3J4LmMgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl9yeC5jCmluZGV4IDM2Y2U4OTguLjJlYjYxMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX3J4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfcnguYwpAQCAtMTU3LDcgKzE1Nyw3IEBACiAJICogQSB1c2VyIG1heSBuZWVkIHRvIHNldCBhIHNwZWNpYWwgY29uZmlndXJhdGlvbiB2YWx1ZSBiZWZvcmUKIAkgKiBleHBvcnRpbmcgdGhlIGRldmljZS4KIAkgKi8KLQl1aW5mbygic2V0X2NvbmZpZ3VyYXRpb24gKCVkKSB0byAlc1xuIiwgY29uZmlnLCB1cmItPmRldi0+ZGV2LmJ1c19pZCk7CisJdWluZm8oInNldF9jb25maWd1cmF0aW9uICglZCkgdG8gJXNcbiIsIGNvbmZpZywgZGV2X25hbWUoJnVyYi0+ZGV2LT5kZXYpKTsKIAl1aW5mbygiYnV0LCBza2lwIVxuIik7CiAKIAlyZXR1cm4gMDsKQEAgLTE3NSw3ICsxNzUsNyBAQAogCXZhbHVlID0gbGUxNl90b19jcHUocmVxLT53VmFsdWUpOwogCWluZGV4ID0gbGUxNl90b19jcHUocmVxLT53SW5kZXgpOwogCi0JdWluZm8oInJlc2V0X2RldmljZSAocG9ydCAlZCkgdG8gJXNcbiIsIGluZGV4LCB1cmItPmRldi0+ZGV2LmJ1c19pZCk7CisJdWluZm8oInJlc2V0X2RldmljZSAocG9ydCAlZCkgdG8gJXNcbiIsIGluZGV4LCBkZXZfbmFtZSgmdXJiLT5kZXYtPmRldikpOwogCiAJLyogYWxsIGludGVyZmFjZXMgc2hvdWxkIGJlIG93bmVkIGJ5IHVzYmlwIGRyaXZlciwgc28ganVzdCByZXNldCBpdC4gICovCiAJcmV0ID0gdXNiX2xvY2tfZGV2aWNlX2Zvcl9yZXNldCh1cmItPmRldiwgTlVMTCk7CkBAIC0yMzQsOCArMjM0LDYgQEAKIHN0YXRpYyBpbnQgc3R1Yl9yZWN2X2NtZF91bmxpbmsoc3RydWN0IHN0dWJfZGV2aWNlICpzZGV2LAogCQkJCQkJc3RydWN0IHVzYmlwX2hlYWRlciAqcGR1KQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3RoZWFkID0gJnNkZXYtPnByaXZfaW5pdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXN0cnVjdCBzdHViX3ByaXYgKnByaXY7CkBAIC0yNDMsOCArMjQxLDcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZzZGV2LT5wcml2X2xvY2ssIGZsYWdzKTsKIAotCWZvciAocHRyID0gbGlzdGhlYWQtPm5leHQ7IHB0ciAhPSBsaXN0aGVhZDsgcHRyID0gcHRyLT5uZXh0KSB7Ci0JCXByaXYgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IHN0dWJfcHJpdiwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwcml2LCAmc2Rldi0+cHJpdl9pbml0LCBsaXN0KSB7CiAJCWlmIChwcml2LT5zZXFudW0gPT0gcGR1LT51LmNtZF91bmxpbmsuc2VxbnVtKSB7CiAJCQlpbnQgcmV0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl90eC5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfdHguYwppbmRleCBkNTU2M2NkLi43ODA1OGY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl90eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX3R4LmMKQEAgLTU0LDcgKzU0LDYgQEAKIC8qKgogICogc3R1Yl9jb21wbGV0ZSAtIGNvbXBsZXRpb24gaGFuZGxlciBvZiBhIHVzYmlwIHVyYgogICogQHVyYjogcG9pbnRlciB0byB0aGUgdXJiIGNvbXBsZXRlZAotICogQHJlZ3M6CiAgKgogICogV2hlbiBhIHVyYiBoYXMgY29tcGxldGVkLCB0aGUgVVNCIGNvcmUgZHJpdmVyIGNhbGxzIHRoaXMgZnVuY3Rpb24gbW9zdGx5IGluCiAgKiB0aGUgaW50ZXJydXB0IGNvbnRleHQuIFRvIHJldHVybiB0aGUgcmVzdWx0IG9mIGEgdXJiLCB0aGUgY29tcGxldGVkIHVyYiBpcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3ZoY2lfaGNkLmMgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdmhjaV9oY2QuYwppbmRleCA1YjVhMmUzLi5mNjljYTM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdmhjaV9oY2QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdmhjaV9oY2QuYwpAQCAtMTA5MSw3ICsxMDkxLDcgQEAKIAkgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBoY2QuCiAJICogT3VyIHByaXZhdGUgZGF0YSBpcyBhbHNvIGFsbG9jYXRlZCBhdXRvbWF0aWNhbGx5LgogCSAqLwotCWhjZCA9IHVzYl9jcmVhdGVfaGNkKCZ2aGNpX2hjX2RyaXZlciwgJnBkZXYtPmRldiwgcGRldi0+ZGV2LmJ1c19pZCk7CisJaGNkID0gdXNiX2NyZWF0ZV9oY2QoJnZoY2lfaGNfZHJpdmVyLCAmcGRldi0+ZGV2LCBkZXZfbmFtZSgmcGRldi0+ZGV2KSk7CiAJaWYgKCFoY2QpIHsKIAkJdWVycigiY3JlYXRlIGhjZCBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC92aGNpX3N5c2ZzLmMgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdmhjaV9zeXNmcy5jCmluZGV4IDI0YzI4NTEuLjBmZDMzYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC92aGNpX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3ZoY2lfc3lzZnMuYwpAQCAtNjAsNyArNjAsNyBAQAogCQkJb3V0ICs9IHNwcmludGYob3V0LCAiJTAzdSAlMDh4ICIsCiAJCQkJCXZkZXYtPnNwZWVkLCB2ZGV2LT5kZXZpZCk7CiAJCQlvdXQgKz0gc3ByaW50ZihvdXQsICIlMTZwICIsIHZkZXYtPnVkLnRjcF9zb2NrZXQpOwotCQkJb3V0ICs9IHNwcmludGYob3V0LCAiJXMiLCB2ZGV2LT51ZGV2LT5kZXYuYnVzX2lkKTsKKwkJCW91dCArPSBzcHJpbnRmKG91dCwgIiVzIiwgZGV2X25hbWUoJnZkZXYtPnVkZXYtPmRldikpOwogCiAJCX0gZWxzZQogCQkJb3V0ICs9IHNwcmludGYob3V0LCAiMDAwIDAwMCAwMDAgMDAwMDAwMDAwMDAwMDAwMCAwLTAiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9LY29uZmlnCmluZGV4IDQyNTIxOWUuLjk0MDQ2MGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvS2NvbmZpZwpAQCAtMSw3ICsxLDExIEBACiBjb25maWcgVzM1VU5ECi0JdHJpc3RhdGUgIldpbmJvbmQgZHJpdmVyIgotCWRlcGVuZHMgb24gTUFDODAyMTEgJiYgV0xBTl84MDIxMSAmJiBVU0IgJiYgRVhQRVJJTUVOVEFMICYmICE0S1NUQUNLUworCXRyaXN0YXRlICJJUzg5QzM1IFdMQU4gVVNCIGRyaXZlciIKKwlkZXBlbmRzIG9uIE1BQzgwMjExICYmIFdMQU5fODAyMTEgJiYgVVNCICYmIEVYUEVSSU1FTlRBTAogCWRlZmF1bHQgbgogCS0tLWhlbHAtLS0KLQkgIFRoaXMgaXMgaGlnaGx5IGV4cGVyaW1lbnRhbCBkcml2ZXIgZm9yIHdpbmJvbmQgd2lmaSBjYXJkIG9uIHNvbWUgS29oamluc2hhIG5vdGVib29rcwotCSAgQ2hlY2sgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3dpbmJvbmRwb3J0LyBmb3IgbmV3IHZlcnNpb24KKwkgIFRoaXMgaXMgaGlnaGx5IGV4cGVyaW1lbnRhbCBkcml2ZXIgZm9yIFdpbmJvbmQgV0lGSSBjYXJkLgorCisJICBIYXJkd2FyZSBpcyBwcmVzZW50IGluIHNvbWUgS29oamluc2hhIHN1Ym5vdGVib29rcywgYW5kIGluIHNvbWUKKwkgIHN0YW5kLWFsb25lIFVTQiBtb2R1bGVzLiBDaGlwc2V0IG5hbWUgc2VlbXMgdG8gYmUgdzg5YzM1ZC4KKworCSAgQ2hlY2sgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3dpbmJvbmRwb3J0LyBmb3IgbmV3IHZlcnNpb24uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL01ha2VmaWxlCmluZGV4IDI5Yzk4YmYuLmI0OWM5NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL01ha2VmaWxlCkBAIC0xLDE1ICsxLDE0IEBACi0JRFJJVkVSX0RJUj0uL2xpbnV4Ci0KLXczNXVuZC1vYmpzIDo9ICQoRFJJVkVSX0RJUikvd2J1c2IubyAkKERSSVZFUl9ESVIpL3diMzVyZWcubyAkKERSSVZFUl9ESVIpL3diMzVyeC5vICQoRFJJVkVSX0RJUikvd2IzNXR4Lm8gXAotCW1kcy5vIFwKLQltbG1ldHhyeC5vIFwKLQltdG8ubwlcCit3MzV1bmQtb2JqcyA6PQkJCVwKKwltZHMubwkJCVwKKwltbG1ldHhyeC5vCQlcCisJbXRvLm8JCQlcCiAJcGh5X2NhbGlicmF0aW9uLm8JXAogCXJlZy5vCQkJXAotCXJ4aXNyLm8JCQlcCi0Jc21lX2FwaS5vCQlcCisJd2IzNXJlZy5vCQlcCisJd2IzNXJ4Lm8JCVwKKwl3YjM1dHgubwkJXAogCXdiaGFsLm8JCQlcCi0Jd2JsaW51eC5vCQlcCisJd2J1c2IubwkJCVwKIAogCiBvYmotJChDT05GSUdfVzM1VU5EKSArPSB3MzV1bmQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvYWRhcHRlci5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvYWRhcHRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDk3MDFkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2FkYXB0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8vCi0vLyBBREFQVEVSLkggLQotLy8gV2luZG93cyBORElTIGdsb2JhbCB2YXJpYWJsZSAnQWRhcHRlcicgdHlwZWRlZgotLy8KLSNkZWZpbmUgTUFYX0FOU0lfU1RSSU5HCQk0MAotdHlwZWRlZiBzdHJ1Y3QgV0IzMl9BREFQVEVSCi17Ci0JdTMyIEFkYXB0ZXJJbmRleDsgLy8gMjAwNjA3MDMuNCBBZGQgZm9yIHVzaW5nIHBBZGFwdGVyQ29udGV4dCBnbG9iYWwgQWRhcHRlciBwb2ludAotCi0JV0JfTE9DQUxERVNDUklQVAlzTG9jYWxQYXJhOwkJLy8gTXlzZWxmIGNvbm5lY3RlZCBwYXJhbWV0ZXJzCi0JUFdCX0JTU0RFU0NSSVBUSU9OCWFzQlNTRGVzY3JpcHRFbGVtZW50OwotCi0JTUxNRV9GUkFNRQkJc01sbWVGcmFtZTsJCS8vIGNvbm5lY3QgdG8gcGVlclNUQSBwYXJhbWV0ZXJzCi0KLQlNVE9fUEFSQU1FVEVSUwkJc010b1BhcmE7IC8vIE1UT19zdHJ1Y3QgLi4uCi0JaHdfZGF0YV90CQkJc0h3RGF0YTsgLy9Gb3IgSEFMCi0JTURTCQkJCQlNZHM7Ci0KLQlXQkxJTlVYCQlXYkxpbnV4OwotICAgICAgICBzdHJ1Y3QgaXdfc3RhdGlzdGljcyBpd19zdGF0czsKLQotCXU4CUxpbmtOYW1lW01BWF9BTlNJX1NUUklOR107Ci19IFdCMzJfQURBUFRFUiwgQURBUFRFUiwgKlBXQjMyX0FEQVBURVIsICpQQURBUFRFUjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2Jzc19mLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9ic3NfZi5oCmluZGV4IDAxMzE4MzEuLmE0MzNiNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2Jzc19mLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvYnNzX2YuaApAQCAtMSw1OSArMSw2MyBAQAorI2lmbmRlZiBfX1dJTkJPTkRfQlNTX0ZfSAorI2RlZmluZSBfX1dJTkJPTkRfQlNTX0ZfSAorCisjaW5jbHVkZSAiY29yZS5oIgorCitzdHJ1Y3QgUE1LSURfSW5mb3JtYXRpb25fRWxlbWVudDsKKwogLy8KIC8vIEJTUyBkZXNjcmlwdG9yIERhdGFCYXNlIG1hbmFnZW1lbnQgZ2xvYmFsIGZ1bmN0aW9uCiAvLwogCi12b2lkIHZCU1NkZXNjcmlwdGlvbkluaXQoUFdCMzJfQURBUFRFUiBBZGFwdGVyKTsKLXZvaWQgdkJTU2ZvdW5kTGlzdChQV0IzMl9BREFQVEVSIEFkYXB0ZXIpOwotdTggYm9DaGFuRmlsdGVyKFBXQjMyX0FEQVBURVIgQWRhcHRlciwgdTggQ2hhbk5vKTsKLXUxNiB3QlNTYWxsb2NhdGVFbnRyeShQV0IzMl9BREFQVEVSIEFkYXB0ZXIpOwotdTE2IHdCU1NHZXRFbnRyeShQV0IzMl9BREFQVEVSIEFkYXB0ZXIpOwotdm9pZCB2U2ltcGxlSG91c2VLZWVwaW5nKFBXQjMyX0FEQVBURVIgQWRhcHRlcik7Ci11MTYgd0JTU2hvdXNlS2VlcGluZyhQV0IzMl9BREFQVEVSIEFkYXB0ZXIpOwotdm9pZCBDbGVhckJTU2Rlc2NwdChQV0IzMl9BREFQVEVSIEFkYXB0ZXIsIHUxNiBpKTsKLXUxNiB3QlNTZmluZEJzc0lEKFBXQjMyX0FEQVBURVIgQWRhcHRlciwgdTggKnBiQnNzaWQpOwotdTE2IHdCU1NmaW5kRGVkaWNhdGVDYW5kaWRhdGUoUFdCMzJfQURBUFRFUiBBZGFwdGVyLCBzdHJ1Y3QgU1NJRF9FbGVtZW50ICpwc1NzaWQsIHU4ICpwYkJzc2lkKTsKLXUxNiB3QlNTZmluZE1BQ2FkZHIoUFdCMzJfQURBUFRFUiBBZGFwdGVyLCB1OCAqcGJNYWNBZGRyKTsKLXUxNiB3QlNTc2VhcmNoTUFDYWRkcihQV0IzMl9BREFQVEVSIEFkYXB0ZXIsIHU4ICpwYk1hY0FkZHIsIHU4IGJhbmQpOwotdTE2IHdCU1NhZGRTY2FuRGF0YShQV0IzMl9BREFQVEVSLCB1MTYsIHBzUlhEQVRBKTsKLXUxNiB3QlNTVXBkYXRlU2NhbkRhdGEoUFdCMzJfQURBUFRFUiBBZGFwdGVyLCB1MTYgd0Jzc0lkeCwgcHNSWERBVEEgcHNSY3ZEYXRhKTsKLXUxNiB3QlNTY3JlYXRlSUJTU2RhdGEoUFdCMzJfQURBUFRFUiBBZGFwdGVyLCBQV0JfQlNTREVTQ1JJUFRJT04gcHNEZXNEYXRhKTsKLXZvaWQgRGVzaXJlZFJhdGUyQlNTZGVzY3JpcHRvcihQV0IzMl9BREFQVEVSIEFkYXB0ZXIsIFBXQl9CU1NERVNDUklQVElPTiBwc0Rlc0RhdGEsCit2b2lkIHZCU1NkZXNjcmlwdGlvbkluaXQoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlcik7Cit2b2lkIHZCU1Nmb3VuZExpc3Qoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlcik7Cit1OCBib0NoYW5GaWx0ZXIoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlciwgdTggQ2hhbk5vKTsKK3UxNiB3QlNTYWxsb2NhdGVFbnRyeShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyKTsKK3UxNiB3QlNTR2V0RW50cnkoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlcik7Cit2b2lkIHZTaW1wbGVIb3VzZUtlZXBpbmcoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlcik7Cit1MTYgd0JTU2hvdXNlS2VlcGluZyhzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyKTsKK3ZvaWQgQ2xlYXJCU1NkZXNjcHQoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlciwgdTE2IGkpOwordTE2IHdCU1NmaW5kQnNzSUQoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlciwgdTggKnBiQnNzaWQpOwordTE2IHdCU1NmaW5kRGVkaWNhdGVDYW5kaWRhdGUoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlciwgc3RydWN0IFNTSURfRWxlbWVudCAqcHNTc2lkLCB1OCAqcGJCc3NpZCk7Cit1MTYgd0JTU2ZpbmRNQUNhZGRyKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsIHU4ICpwYk1hY0FkZHIpOwordTE2IHdCU1NzZWFyY2hNQUNhZGRyKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsIHU4ICpwYk1hY0FkZHIsIHU4IGJhbmQpOwordTE2IHdCU1NhZGRTY2FuRGF0YShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiwgdTE2LCBwc1JYREFUQSk7Cit1MTYgd0JTU1VwZGF0ZVNjYW5EYXRhKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsIHUxNiB3QnNzSWR4LCBwc1JYREFUQSBwc1JjdkRhdGEpOwordTE2IHdCU1NjcmVhdGVJQlNTZGF0YShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyLCBQV0JfQlNTREVTQ1JJUFRJT04gcHNEZXNEYXRhKTsKK3ZvaWQgRGVzaXJlZFJhdGUyQlNTZGVzY3JpcHRvcihzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyLCBQV0JfQlNTREVTQ1JJUFRJT04gcHNEZXNEYXRhLAogCQkJCQkJCSB1OCAqcEJhc2ljUmF0ZVNldCwgdTggQmFzaWNSYXRlQ291bnQsCiAJCQkJCQkJIHU4ICpwT3BlcmF0aW9uUmF0ZVNldCwgdTggT3BlcmF0aW9uUmF0ZUNvdW50KTsKLXZvaWQgRGVzaXJlZFJhdGUySW5mb0VsZW1lbnQoUFdCMzJfQURBUFRFUiBBZGFwdGVyLCB1OAkqYWRkciwgdTE2ICppRmlsZE9mZnNldCwKK3ZvaWQgRGVzaXJlZFJhdGUySW5mb0VsZW1lbnQoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlciwgdTgJKmFkZHIsIHUxNiAqaUZpbGRPZmZzZXQsCiAJCQkJCQkJIHU4ICpwQmFzaWNSYXRlU2V0LCB1OCBCYXNpY1JhdGVDb3VudCwKIAkJCQkJCQkgdTggKnBPcGVyYXRpb25SYXRlU2V0LCB1OCBPcGVyYXRpb25SYXRlQ291bnQpOwotdm9pZCBCU1NBZGRJQlNTZGF0YShQV0IzMl9BREFQVEVSIEFkYXB0ZXIsIFBXQl9CU1NERVNDUklQVElPTiBwc0Rlc0RhdGEpOwordm9pZCBCU1NBZGRJQlNTZGF0YShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyLCBQV0JfQlNTREVTQ1JJUFRJT04gcHNEZXNEYXRhKTsKIHVuc2lnbmVkIGNoYXIgYm9DbXBNYWNBZGRyKCB1OCAqLCB1OCAqKTsKIHVuc2lnbmVkIGNoYXIgYm9DbXBTU0lEKHN0cnVjdCBTU0lEX0VsZW1lbnQgKnBzU1NJRDEsIHN0cnVjdCBTU0lEX0VsZW1lbnQgKnBzU1NJRDIpOwotdTE2IHdCU1NmaW5kU1NJRChQV0IzMl9BREFQVEVSIEFkYXB0ZXIsIHN0cnVjdCBTU0lEX0VsZW1lbnQgKnBzU3NpZCk7Ci11MTYgd1JvYW1pbmdRdWVyeShQV0IzMl9BREFQVEVSIEFkYXB0ZXIpOwotdm9pZCB2UmF0ZVRvQml0bWFwKFBXQjMyX0FEQVBURVIgQWRhcHRlciwgdTE2IGluZGV4KTsKLXU4IGJSYXRlVG9CaXRtYXBJbmRleChQV0IzMl9BREFQVEVSIEFkYXB0ZXIsIHU4IGJSYXRlKTsKK3UxNiB3QlNTZmluZFNTSUQoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlciwgc3RydWN0IFNTSURfRWxlbWVudCAqcHNTc2lkKTsKK3UxNiB3Um9hbWluZ1F1ZXJ5KHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIpOwordm9pZCB2UmF0ZVRvQml0bWFwKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsIHUxNiBpbmRleCk7Cit1OCBiUmF0ZVRvQml0bWFwSW5kZXgoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlciwgdTggYlJhdGUpOwogdTggYkJpdG1hcFRvUmF0ZSh1OCBpKTsKLXVuc2lnbmVkIGNoYXIgYm9Jc0VSUHN0YShQV0IzMl9BREFQVEVSIEFkYXB0ZXIsIHUxNiBpKTsKLXVuc2lnbmVkIGNoYXIgYm9DaGVja0Nvbm5lY3QoUFdCMzJfQURBUFRFUiBBZGFwdGVyKTsKLXVuc2lnbmVkIGNoYXIgYm9DaGVja1NpZ25hbChQV0IzMl9BREFQVEVSIEFkYXB0ZXIpOwotdm9pZCBBZGRJQlNTSWUoUFdCMzJfQURBUFRFUiBBZGFwdGVyLFBXQl9CU1NERVNDUklQVElPTiBwc0Rlc0RhdGEgKTsvL2FkZGVkIGJ5IHdzIGZvciBXUEFfTm9uZTA2LzAxLzA0Ci12b2lkIEJzc1NjYW5VcFRvRGF0ZShQV0IzMl9BREFQVEVSIEFkYXB0ZXIpOwotdm9pZCBCc3NVcFRvRGF0ZShQV0IzMl9BREFQVEVSIEFkYXB0ZXIpOwordW5zaWduZWQgY2hhciBib0lzRVJQc3RhKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsIHUxNiBpKTsKK3Vuc2lnbmVkIGNoYXIgYm9DaGVja0Nvbm5lY3Qoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlcik7Cit1bnNpZ25lZCBjaGFyIGJvQ2hlY2tTaWduYWwoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlcik7Cit2b2lkIEFkZElCU1NJZShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyLFBXQl9CU1NERVNDUklQVElPTiBwc0Rlc0RhdGEgKTsvL2FkZGVkIGJ5IHdzIGZvciBXUEFfTm9uZTA2LzAxLzA0Cit2b2lkIEJzc1NjYW5VcFRvRGF0ZShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyKTsKK3ZvaWQgQnNzVXBUb0RhdGUoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlcik7CiB2b2lkIFJhdGVTb3J0KHU4ICpSYXRlQXJyYXksIHU4IG51bSwgdTggbW9kZSk7Ci12b2lkIFJhdGVSZVNvcnRGb3JTUmF0ZShQV0IzMl9BREFQVEVSIEFkYXB0ZXIsIHU4ICpSYXRlQXJyYXksIHU4IG51bSk7Ci12b2lkIEFzc2VtYmxlX0lFKFBXQjMyX0FEQVBURVIgQWRhcHRlciwgdTE2IHdCc3NJZHgpOwotdm9pZCBTZXRNYXhUeFJhdGUoUFdCMzJfQURBUFRFUiBBZGFwdGVyKTsKK3ZvaWQgUmF0ZVJlU29ydEZvclNSYXRlKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsIHU4ICpSYXRlQXJyYXksIHU4IG51bSk7Cit2b2lkIEFzc2VtYmxlX0lFKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsIHUxNiB3QnNzSWR4KTsKK3ZvaWQgU2V0TWF4VHhSYXRlKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIpOwogCi12b2lkIENyZWF0ZVdwYUlFKFBXQjMyX0FEQVBURVIgQWRhcHRlciwgdTE2KiBpRmlsZE9mZnNldCwgdTggKm1zZywgc3RydWN0ICBNYW5hZ2VtZW50X0ZyYW1lKiBtc2dIZWFkZXIsCit2b2lkIENyZWF0ZVdwYUlFKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsIHUxNiogaUZpbGRPZmZzZXQsIHU4ICptc2csIHN0cnVjdCAgTWFuYWdlbWVudF9GcmFtZSogbXNnSGVhZGVyLAogCQkJCSBzdHJ1Y3QgQXNzb2NpYXRpb25fUmVxdWVzdF9GcmFtZV9Cb2R5KiBtc2dCb2R5LCB1MTYgaU1TaW5kZXgpOyAvL2FkZGVkIGJ5IFdTIDA1LzE0LzA1CiAKICNpZmRlZiBfV1BBMl8KLXZvaWQgQ3JlYXRlUnNuSUUoUFdCMzJfQURBUFRFUiBBZGFwdGVyLCB1MTYqIGlGaWxkT2Zmc2V0LCB1OCAqbXNnLCBzdHJ1Y3QgIE1hbmFnZW1lbnRfRnJhbWUqIG1zZ0hlYWRlciwKK3ZvaWQgQ3JlYXRlUnNuSUUoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlciwgdTE2KiBpRmlsZE9mZnNldCwgdTggKm1zZywgc3RydWN0ICBNYW5hZ2VtZW50X0ZyYW1lKiBtc2dIZWFkZXIsCiAJCQkJIHN0cnVjdCBBc3NvY2lhdGlvbl9SZXF1ZXN0X0ZyYW1lX0JvZHkqIG1zZ0JvZHksIHUxNiBpTVNpbmRleCk7Ly9hZGRlZCBieSBXUyAwNS8xNC8wNQogCi11MTYgU2VhcmNoUG1raWQoUFdCMzJfQURBUFRFUiBBZGFwdGVyLCBzdHJ1Y3QgIE1hbmFnZW1lbnRfRnJhbWUqIG1zZ0hlYWRlciwKK3UxNiBTZWFyY2hQbWtpZChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyLCBzdHJ1Y3QgIE1hbmFnZW1lbnRfRnJhbWUqIG1zZ0hlYWRlciwKIAkJCQkgICBzdHJ1Y3QgUE1LSURfSW5mb3JtYXRpb25fRWxlbWVudCAqIEFzc29SZXFfUE1LSUQgKTsKICNlbmRpZgogCi0KLQotCi0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvYnNzZHNjcHQuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2Jzc2RzY3B0LmgKaW5kZXggOTcxNTBhMi4uM2E3MWQ0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvYnNzZHNjcHQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9ic3Nkc2NwdC5oCkBAIC0xLDMgKzEsMTEgQEAKKyNpZm5kZWYgX19XSU5CT05EX0JTU0RTQ1BUX0gKKyNkZWZpbmUgX19XSU5CT05EX0JTU0RTQ1BUX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICJtZHNfcy5oIgorI2luY2x1ZGUgIm1sbWVfcy5oIgorCiAvLysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiAvLwlic3Nkc2NwdC5jCiAvLwkJQlNTIGRlc2NyaXB0b3IgZGF0YSBiYXNlCkBAIC03OCw4ICs4Niw4IEBACiAgICAgdTE2CQl3U3RhdGU7CQkJLy8gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHN5c3RlbQogCXUxNgkJd0luZGV4OwkJCS8vIFRISVMgQlNTIGVsZW1lbnQgZW50cnkgaW5kZXgKIAotCXZvaWQqCXBzQWRhcHRlcjsJCS8vIHBvaW50ZXIgdG8gVEhJUyBBZGFwdGVyCi0JT1NfVElNRVIJblRpbWVyOyAgLy8gTUxNRSB0aW1lcgorCXZvaWQqCXBzYWRhcHRlcjsJCS8vIHBvaW50ZXIgdG8gVEhJUyBhZGFwdGVyCisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7ICAvLyBNTE1FIHRpbWVyCiAKICAgICAvLyBBdXRoZW50aWNhdGlvbgogICAgIHUxNgkJd0F1dGhBbGdvOyAgICAgIC8vIHBlZXIgTUFDIE1MTUUgdXNlIEF1dGggYWxnb3JpdGhtLCBkZWZhdWx0IE9QRU5fQVVUSApAQCAtMTQ4LDkgKzE1Niw5IEBACiAKIH0gV0JfQlNTREVTQ1JJUFRJT04sICpQV0JfQlNTREVTQ1JJUFRJT047CiAKLSNkZWZpbmUgd0JTU0Nvbm5lY3RlZFNUQShBZGFwdGVyKSAgICAgICAgICAgICBcCi0gICAgKCh1MTYpKEFkYXB0ZXIpLT5zTG9jYWxQYXJhLndDb25uZWN0ZWRTVEFpbmRleCkKKyNkZWZpbmUgd0JTU0Nvbm5lY3RlZFNUQShhZGFwdGVyKSAgICAgICAgICAgICBcCisgICAgKCh1MTYpKGFkYXB0ZXIpLT5zTG9jYWxQYXJhLndDb25uZWN0ZWRTVEFpbmRleCkKIAotI2RlZmluZSBwc0JTUyhpKQkJCSgmKEFkYXB0ZXItPmFzQlNTRGVzY3JpcHRFbGVtZW50WyhpKV0pKQorI2RlZmluZSBwc0JTUyhpKQkJCSgmKGFkYXB0ZXItPmFzQlNTRGVzY3JpcHRFbGVtZW50WyhpKV0pKQogCi0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvY29tbW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGQ5NjA0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvY29tbW9uLmgKQEAgLTAsMCArMSwyNyBAQAorLy8KKy8vIGNvbW1vbi5oCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBPUyBkZXBlbmRhbnQgZGVmaW5pdGlvbiBhbmQgZnVuY3Rpb24uCisvLyBFdmVyeSBPUyBoYXMgdGhpcyBmaWxlIGluZGl2aWR1YWwuCisvLworCisjZGVmaW5lIERlYnVnVXNiZFN0YXR1c0luZm9ybWF0aW9uKCBfQSApCisKKyNpZm5kZWYgQ09NTU9OX0RFRgorI2RlZmluZSBDT01NT05fREVGCisKKy8vI2RlZmluZSBERUJVR19FTkFCTEVEICAxCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIENvbW1vbiBmdW5jdGlvbiBkZWZpbml0aW9uCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIERFQlVHX0VOQUJMRUQKKyNkZWZpbmUgRVRIX0xFTkdUSF9PRl9BRERSRVNTCTYKKyNpZmRlZiBERUJVR19FTkFCTEVECisjZGVmaW5lIFdCREVCVUcoIF9NICkJcHJpbnRrIF9NCisjZWxzZQorI2RlZmluZSBXQkRFQlVHKCBfTSApCTAKKyNlbmRpZgorCisjZW5kaWYgLy8gQ09NTU9OX0RFRgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9jb3JlLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9jb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUxNDJhMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2NvcmUuaApAQCAtMCwwICsxLDQyIEBACisjaWZuZGVmIF9fV0lOQk9ORF9DT1JFX0gKKyNkZWZpbmUgX19XSU5CT05EX0NPUkVfSAorCisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKworI2luY2x1ZGUgImJzc2RzY3B0LmgiCisjaW5jbHVkZSAibXRvLmgiCisjaW5jbHVkZSAid2JoYWxfcy5oIgorCisjZGVmaW5lIFdCTElOVVhfUEFDS0VUX0FSUkFZX1NJWkUgKEVUSEVSTkVUX1RYX0RFU0NSSVBUT1JTKjQpCisKKyNkZWZpbmUgV0JfTUFYX0xJTktfTkFNRV9MRU4gNDAKKworc3RydWN0IHdic29mdF9wcml2IHsKKwl1MzIgYWRhcHRlckluZGV4OwkvLyAyMDA2MDcwMy40IEFkZCBmb3IgdXNpbmcgcGFkYXB0ZXJDb250ZXh0IGdsb2JhbCBhZGFwdGVyIHBvaW50CisKKwlXQl9MT0NBTERFU0NSSVBUIHNMb2NhbFBhcmE7CS8vIE15c2VsZiBjb25uZWN0ZWQgcGFyYW1ldGVycworCVBXQl9CU1NERVNDUklQVElPTiBhc0JTU0Rlc2NyaXB0RWxlbWVudDsKKworCU1MTUVfRlJBTUUgc01sbWVGcmFtZTsJLy8gY29ubmVjdCB0byBwZWVyU1RBIHBhcmFtZXRlcnMKKworCU1UT19QQVJBTUVURVJTIHNNdG9QYXJhOwkvLyBNVE9fc3RydWN0IC4uLgorCWh3X2RhdGFfdCBzSHdEYXRhOwkvL0ZvciBIQUwKKwlNRFMgTWRzOworCisJc3BpbmxvY2tfdCBTcGluTG9jazsKKworCWF0b21pY190IFRocmVhZENvdW50OworCisJdTMyIFJ4Qnl0ZUNvdW50OworCXUzMiBUeEJ5dGVDb3VudDsKKworCXN0cnVjdCBza19idWZmICpwYWNrZXRfcmV0dXJuOworCXMzMiBuZXRpZl9zdGF0ZV9zdG9wOwkvLyAxOiBzdG9wICAwOiBub3JtYWwKKwlzdHJ1Y3QgaXdfc3RhdGlzdGljcyBpd19zdGF0czsKKworCXU4IExpbmtOYW1lW1dCX01BWF9MSU5LX05BTUVfTEVOXTsKKworCWJvb2wgZW5hYmxlZDsKK307CisKKyNlbmRpZiAvKiBfX1dJTkJPTkRfQ09SRV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9kc190a2lwLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9kc190a2lwLmgKaW5kZXggNjg0MWQ2Ni4uOWM1YzRlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvZHNfdGtpcC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2RzX3RraXAuaApAQCAtMSwzICsxLDggQEAKKyNpZm5kZWYgX19XSU5CT05EX0RTX1RLSVBfSAorI2RlZmluZSBfX1dJTkJPTkRfRFNfVEtJUF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCiAvLyBSb3RhdGlvbiBmdW5jdGlvbnMgb24gMzIgYml0IHZhbHVlcwogI2RlZmluZSBST0wzMiggQSwgbiApIFwKICAgICAoICgoQSkgPDwgKG4pKSB8ICggKChBKT4+KDMyLShuKSkpICAmICggKDFVTCA8PCAobikpIC0gMSApICkgKQpAQCAtMjYsOCArMzEsNyBAQAogfSB0a2lwX3Q7CiAKIC8vdm9pZCBfYXBwZW5kX2RhdGEoIHU4ICpwRGF0YSwgdTE2IHNpemUsIHRraXBfdCAqcCApOwotdm9pZCBNZHNfTWljR2V0KCAgdm9pZCogQWRhcHRlciwgIHZvaWQqIHBSeExheWVyMSwgIHU4ICpwS2V5LCAgdTggKnBNaWMgKTsKLXZvaWQgTWRzX01pY0ZpbGwoICB2b2lkKiBBZGFwdGVyLCAgdm9pZCogcERlcywgIHU4ICpYbWl0QnVmQWRkcmVzcyApOwordm9pZCBNZHNfTWljR2V0KCAgdm9pZCogYWRhcHRlciwgIHZvaWQqIHBSeExheWVyMSwgIHU4ICpwS2V5LCAgdTggKnBNaWMgKTsKK3ZvaWQgTWRzX01pY0ZpbGwoICB2b2lkKiBhZGFwdGVyLCAgdm9pZCogcERlcywgIHU4ICpYbWl0QnVmQWRkcmVzcyApOwogCi0KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9nbF84MDIxMS5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvZ2xfODAyMTEuaAppbmRleCAxODA2ZDgxLi41YTI0NGM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9nbF84MDIxMS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2dsXzgwMjExLmgKQEAgLTEsNyArMSw4IEBACi0KICNpZm5kZWYgX19HTF84MDIxMV9IX18KICNkZWZpbmUgX19HTF84MDIxMV9IX18KIAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKIC8qKioqKioqKioqKioqKioqKiogQ09OU1RBTlQgQU5EIE1BQ1JPIFNFQ1RJT04gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBCU1MgVHlwZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvY29tbW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC9jb21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEyYTg2Yy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC9jb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vLwotLy8gY29tbW9uLmgKLS8vCi0vLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIE9TIGRlcGVuZGFudCBkZWZpbml0aW9uIGFuZCBmdW5jdGlvbi4KLS8vIEV2ZXJ5IE9TIGhhcyB0aGlzIGZpbGUgaW5kaXZpZHVhbC4KLS8vCi0KLSNkZWZpbmUgRGVidWdVc2JkU3RhdHVzSW5mb3JtYXRpb24oIF9BICkKLQotI2lmbmRlZiBDT01NT05fREVGCi0jZGVmaW5lIENPTU1PTl9ERUYKLQotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLSNpbmNsdWRlIDxsaW51eC91c2IuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4gLy9uZWVkIGZvciBrZXJuZWwgYWxlcnQKLSNpbmNsdWRlIDxsaW51eC9hdXRvY29uZi5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPiAvL21lbW9yeSBhbGxvY2F0ZQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPi8vbmVlZCBmb3IgaW5pdCBhbmQgZXhpdCBtb2R1bGVzIG1hcmNvCi0jaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotCi0KLS8vI2RlZmluZSBERUJVR19FTkFCTEVEICAxCi0KLQotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gQ29tbW9uIHR5cGUgZGVmaW5pdGlvbgotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jZGVmaW5lIElHTk9SRSAgICAgIDIKLSNkZWZpbmUJU1VDQ0VTUyAgICAgMQotI2RlZmluZQlGQUlMVVJFICAgICAwCi0KLQotI2lmbmRlZiB0cnVlCi0jZGVmaW5lIHRydWUgICAgICAgIDEKLSNlbmRpZgotCi0jaWZuZGVmIGZhbHNlCi0jZGVmaW5lIGZhbHNlICAgICAgIDAKLSNlbmRpZgotCi0vLyBQRDQzIDIwMDIxMTA4Ci0jaWZuZGVmIFRSVUUKLSNkZWZpbmUgVFJVRSAgICAgICAgMQotI2VuZGlmCi0KLSNpZm5kZWYgRkFMU0UKLSNkZWZpbmUgRkFMU0UgICAgICAgMAotI2VuZGlmCi0KLSNkZWZpbmUgU1RBVFVTX01FRElBX0NPTk5FQ1QgMQotI2RlZmluZSBTVEFUVVNfTUVESUFfRElTQ09OTkVDVCAwCi0KLSNpZm5kZWYgQklUCi0jZGVmaW5lIEJJVCh4KSAgICAgICAgICAgICAgICAgICgxIDw8ICh4KSkKLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdCB1cmIgKiBQVVJCOwotCi0KLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gQ29tbW9uIGZ1bmN0aW9uIGRlZmluaXRpb24KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSNpZm5kZWYgYWJzCi0jZGVmaW5lIGFicyhfVCkJCQkJCQkJKChfVCkgPCAwID8gLV9UIDogX1QpCi0jZW5kaWYKLSNkZWZpbmUgREVCVUdfRU5BQkxFRAotI2RlZmluZSBFVEhfTEVOR1RIX09GX0FERFJFU1MJNgotI2lmZGVmIERFQlVHX0VOQUJMRUQKLSNkZWZpbmUgV0JERUJVRyggX00gKQlwcmludGsgX00KLSNlbHNlCi0jZGVmaW5lIFdCREVCVUcoIF9NICkJMAotI2VuZGlmCi0KLSNkZWZpbmUgT1NfRElTQ09OTkVDVEVECTAKLSNkZWZpbmUgT1NfQ09OTkVDVEVECTEKLQotCi0jZGVmaW5lIE9TX0VWRU5UX0lORElDQVRFKCBfQSwgX0IsIF9GICkKLSNkZWZpbmUgT1NfUE1LSURfU1RBVFVTX0VWRU5UKCBfQSApCi0KLQotLyogVWZmLCBubywgbG9uZ3MgYXJlIG5vdCBhdG9taWMgb24gYWxsIGFyY2hpdGVjdHVyZXMgTGludXgKLSAqIHN1cHBvcnRzLiBUaGlzIHNob3VsZCByZWFsbHkgdXNlIGF0b21pY190ICovCi0KLSNkZWZpbmUgT1NfQVRPTUlDCQkJdTMyCi0jZGVmaW5lIE9TX0FUT01JQ19SRUFEKCBfQSwgX1YgKQlfVgotI2RlZmluZSBPU19BVE9NSUNfSU5DKCBfQSwgX1YgKQkJRW5jYXBBdG9taWNJbmMoIF9BLCAodm9pZCopX1YgKQotI2RlZmluZSBPU19BVE9NSUNfREVDKCBfQSwgX1YgKQkJRW5jYXBBdG9taWNEZWMoIF9BLCAodm9pZCopX1YgKQotI2RlZmluZSBPU19NRU1PUllfQ0xFQVIoIF9BLCBfUyApCW1lbXNldCggKHU4ICopX0EsMCxfUykKLSNkZWZpbmUgT1NfTUVNT1JZX0NPTVBBUkUoIF9BLCBfQiwgX1MgKQkobWVtY21wKF9BLF9CLF9TKT8gMCA6IDEpIC8vIERlZmluaXRpb24gaXMgcmV2ZXJzZSB3aXRoIE5kaXMgMTogdGhlIHNhbWUgMDogZGlmZmVyZW50Ci0KLSNkZWZpbmUgT1NfVElNRVIJc3RydWN0IHRpbWVyX2xpc3QKLSNkZWZpbmUgT1NfVElNRVJfSU5JVElBTCggX1QsIF9GLCBfUCApCQkJXAotewkJCQkJCQlcCi0JaW5pdF90aW1lciggX1QgKTsJCQkJXAotCShfVCktPmZ1bmN0aW9uID0gKHZvaWQgKilfRiMjXzFhOwkJXAotCShfVCktPmRhdGEgPSAodW5zaWduZWQgbG9uZylfUDsJCQlcCi19Ci0KLS8vIF9TIDogTWlsbGlzZWNvbmQKLS8vIDIwMDYwNDIwIEF0IGxlYXN0IDEgbGFyZ2UgdGhhbiBqaWZmaWVzCi0jZGVmaW5lIE9TX1RJTUVSX1NFVCggX1QsIF9TICkJCQkJCVwKLXsJCQkJCQkJCVwKLQkoX1QpLT5leHBpcmVzID0gamlmZmllcyArICgoX1MqSForOTk5KS8xMDAwKTtcCi0JYWRkX3RpbWVyKCBfVCApOwkJCQkJXAotfQotI2RlZmluZSBPU19USU1FUl9DQU5DRUwoIF9ULCBfQiApCQlkZWxfdGltZXJfc3luYyggX1QgKQotI2RlZmluZSBPU19USU1FUl9HRVRfU1lTX1RJTUUoIF9UICkJCSgqX1Q9amlmZmllcykKLQotCi0jZW5kaWYgLy8gQ09NTU9OX0RFRgotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC9zeXNkZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3N5c2RlZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDZkNjNlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3N5c2RlZi5oCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotCi0KLS8vCi0vLyBXaW5ib25kIFdMQU4gU3lzdGVtIENvbmZpZ3VyYXRpb24gZGVmaW5lcwotLy8KLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIEN1cnJlbnQgZGlyZWN0b3J5IGlzIExpbnV4Ci0vLyBUaGUgZGVmaW5pdGlvbiBXQl9MSU5VWCBpcyBhIGtleXdvcmQgZm9yIHRoaXMgT1MKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jaWZuZGVmIFNZU19ERUZfSAotI2RlZmluZSBTWVNfREVGX0gKLSNkZWZpbmUgV0JfTElOVVgKLSNkZWZpbmUgV0JfTElOVVhfV1BBX1BTSwotCi0KLS8vI2RlZmluZSBfSUJTU19CRUFDT05fU0VRX1NUSUNLXwotI2RlZmluZSBfVVNFX0ZBTExCQUNLX1JBVEVfCi0vLyNkZWZpbmUgQU5URElWX0RFRkFVTFRfT04KLQotI2RlZmluZSBfV1BBMl8JLy8gMjAwNjExMjIgSXQncyBuZWVkZWQgZm9yIGN1cnJlbnQgTGludXggZHJpdmVyCi0KLQotI2lmbmRlZiBfV1BBX1BTS19ERUJVRwotI3VuZGVmICBfV1BBX1BTS19ERUJVRwotI2VuZGlmCi0KLS8vIGRlYnVnIHByaW50IG9wdGlvbnMsIG1hcmsgd2hhdCBkZWJ1ZyB5b3UgZG9uJ3QgbmVlZAotCi0jaWZkZWYgRlVMTF9ERUJVRwotI2RlZmluZSBfUEVfU1RBVEVfRFVNUF8KLSNkZWZpbmUgX1BFX1RYX0RVTVBfCi0jZGVmaW5lIF9QRV9SWF9EVU1QXwotI2RlZmluZSBfUEVfT0lEX0RVTVBfCi0jZGVmaW5lIF9QRV9EVE9fRFVNUF8KLSNkZWZpbmUgX1BFX1JFR19EVU1QXwotI2RlZmluZSBfUEVfVVNCX0lOSV9EVU1QXwotI2VuZGlmCi0KLQotCi0jaW5jbHVkZSAiY29tbW9uLmgiCS8vIEluZGl2aWR1YWwgZmlsZSBkZXBlbmRzIG9uIE9TCi0KLSNpbmNsdWRlICIuLi93YjM1X3Zlci5oIgotI2luY2x1ZGUgIi4uL21hY19zdHJ1Y3R1cmVzLmgiCi0jaW5jbHVkZSAiLi4vZHNfdGtpcC5oIgotI2luY2x1ZGUgIi4uL2xvY2FscGFyYS5oIgotI2luY2x1ZGUgIi4uL3NtZV9zLmgiCi0jaW5jbHVkZSAiLi4vc2Nhbl9zLmgiCi0jaW5jbHVkZSAiLi4vbWRzX3MuaCIKLSNpbmNsdWRlICIuLi9tbG1lX3MuaCIKLSNpbmNsdWRlICIuLi9ic3Nkc2NwdC5oIgotI2luY2x1ZGUgIi4uL3NtZV9hcGkuaCIKLSNpbmNsdWRlICIuLi9nbF84MDIxMS5oIgotI2luY2x1ZGUgIi4uL210by5oIgotI2luY2x1ZGUgIi4uL3dibGludXhfcy5oIgotI2luY2x1ZGUgIi4uL3diaGFsX3MuaCIKLQotCi0jaW5jbHVkZSAiLi4vYWRhcHRlci5oIgotCi0jaW5jbHVkZSAiLi4vbWxtZV9taWIuaCIKLSNpbmNsdWRlICIuLi9tZHNfZi5oIgotI2luY2x1ZGUgIi4uL2Jzc19mLmgiCi0jaW5jbHVkZSAiLi4vbWxtZXR4cnhfZi5oIgotI2luY2x1ZGUgIi4uL210b19mLmgiCi0jaW5jbHVkZSAiLi4vd2JoYWxfZi5oIgotI2luY2x1ZGUgIi4uL3dibGludXhfZi5oIgotLy8gS2VybmVsIFRpbWVyIHJlc29sdXRpb24sIE5ESVMgaXMgMTBtcywgMTAwMDB1cwotI2RlZmluZSBNSU5fVElNRU9VVF9WQUwJKDEwKSAvL21zCi0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YjM1cmVnLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YjM1cmVnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYjZkYjUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2IzNXJlZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzQ0ICswLDAgQEAKLSNpbmNsdWRlICJzeXNkZWYuaCIKLQotZXh0ZXJuIHZvaWQgcGh5X2NhbGlicmF0aW9uX3dpbmJvbmQoaHdfZGF0YV90ICpwaHdfZGF0YSwgdTMyIGZyZXF1ZW5jeSk7Ci0KLS8vIFRSVUUgIDogcmVhZCBjb21tYW5kIHByb2Nlc3Mgc3VjY2Vzc2Z1bGx5Ci0vLyBGQUxTRSA6IHJlZ2lzdGVyIG5vdCBzdXBwb3J0Ci0vLyBSZWdpc3Rlck5vIDogc3RhcnQgYmFzZQotLy8gcFJlZ2lzdGVyRGF0YSA6IGRhdGEgcG9pbnQKLS8vIE51bWJlck9mRGF0YSA6IG51bWJlciBvZiByZWdpc3RlciBkYXRhCi0vLyBGbGFnIDogQVVUT19JTkNSRU1FTlQgLSBSZWdpc3Rlck5vIHdpbGwgYXV0byBpbmNyZW1lbnQgNAotLy8JCSAgTk9fSU5DUkVNRU5UIC0gRnVuY3Rpb24gd2lsbCB3cml0ZSBkYXRhIGludG8gdGhlIHNhbWUgcmVnaXN0ZXIKLXVuc2lnbmVkIGNoYXIKLVdiMzVSZWdfQnVyc3RXcml0ZShwaHdfZGF0YV90IHBId0RhdGEsIHUxNiBSZWdpc3Rlck5vLCB1MzIgKiBwUmVnaXN0ZXJEYXRhLCB1OCBOdW1iZXJPZkRhdGEsIHU4IEZsYWcpCi17Ci0JUFdCMzVSRUcgcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKLQlQVVJCCQlwVXJiID0gTlVMTDsKLQlQUkVHX1FVRVVFCXBSZWdRdWV1ZSA9IE5VTEw7Ci0JdTE2CQlVcmJTaXplOwotCXN0cnVjdCAgICAgIHVzYl9jdHJscmVxdWVzdCAqZHI7Ci0JdTE2CQlpLCBEYXRhU2l6ZSA9IE51bWJlck9mRGF0YSo0OwotCi0JLy8gTW9kdWxlIHNodXRkb3duCi0JaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQkvLyBUcnlpbmcgdG8gdXNlIGJ1cnN0IHdyaXRlIGZ1bmN0aW9uIGlmIHVzZSBuZXcgaGFyZHdhcmUKLQlVcmJTaXplID0gc2l6ZW9mKFJFR19RVUVVRSkgKyBEYXRhU2l6ZSArIHNpemVvZihzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0KTsKLQlPU19NRU1PUllfQUxMT0MoICh2b2lkKiAqKSZwUmVnUXVldWUsIFVyYlNpemUgKTsKLQlwVXJiID0gd2JfdXNiX2FsbG9jX3VyYigwKTsKLQlpZiggcFVyYiAmJiBwUmVnUXVldWUgKSB7Ci0JCXBSZWdRdWV1ZS0+RElSRUNUID0gMjsvLyBidXJzdCB3cml0ZSByZWdpc3RlcgotCQlwUmVnUXVldWUtPklOREVYID0gUmVnaXN0ZXJObzsKLQkJcFJlZ1F1ZXVlLT5wQnVmZmVyID0gKHUzMiAqKSgodTggKilwUmVnUXVldWUgKyBzaXplb2YoUkVHX1FVRVVFKSk7Ci0JCW1lbWNweSggcFJlZ1F1ZXVlLT5wQnVmZmVyLCBwUmVnaXN0ZXJEYXRhLCBEYXRhU2l6ZSApOwotCQkvL3RoZSBmdW5jdGlvbiBmb3IgcmV2ZXJzaW5nIHJlZ2lzdGVyIGRhdGEgZnJvbSBsaXR0bGUgZW5kaWFuIHRvIGJpZyBlbmRpYW4KLQkJZm9yKCBpPTA7IGk8TnVtYmVyT2ZEYXRhIDsgaSsrICkKLQkJCXBSZWdRdWV1ZS0+cEJ1ZmZlcltpXSA9IGNwdV90b19sZTMyKCBwUmVnUXVldWUtPnBCdWZmZXJbaV0gKTsKLQotCQlkciA9IChzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICopKCh1OCAqKXBSZWdRdWV1ZSArIHNpemVvZihSRUdfUVVFVUUpICsgRGF0YVNpemUpOwotCQlkci0+YlJlcXVlc3RUeXBlID0gVVNCX1RZUEVfVkVORE9SIHwgVVNCX0RJUl9PVVQgfCBVU0JfUkVDSVBfREVWSUNFOwotCQlkci0+YlJlcXVlc3QgPSAweDA0OyAvLyBVU0Igb3IgdmVuZG9yLWRlZmluZWQgcmVxdWVzdCBjb2RlLCBidXJzdCBtb2RlCi0JCWRyLT53VmFsdWUgPSBjcHVfdG9fbGUxNiggRmxhZyApOyAvLyAwOiBSZWdpc3RlciBudW1iZXIgYXV0by1pbmNyZW1lbnQsIDE6IE5vIGF1dG8gaW5jcmVtZW50Ci0JCWRyLT53SW5kZXggPSBjcHVfdG9fbGUxNiggUmVnaXN0ZXJObyApOwotCQlkci0+d0xlbmd0aCA9IGNwdV90b19sZTE2KCBEYXRhU2l6ZSApOwotCQlwUmVnUXVldWUtPk5leHQgPSBOVUxMOwotCQlwUmVnUXVldWUtPnBVc2JSZXEgPSBkcjsKLQkJcFJlZ1F1ZXVlLT5wVXJiID0gcFVyYjsKLQotCQlzcGluX2xvY2tfaXJxKCAmcFdiMzVSZWctPkVQMFZNX3NwaW5fbG9jayApOwotCQlpZiAocFdiMzVSZWctPnBSZWdGaXJzdCA9PSBOVUxMKQotCQkJcFdiMzVSZWctPnBSZWdGaXJzdCA9IHBSZWdRdWV1ZTsKLQkJZWxzZQotCQkJcFdiMzVSZWctPnBSZWdMYXN0LT5OZXh0ID0gcFJlZ1F1ZXVlOwotCQlwV2IzNVJlZy0+cFJlZ0xhc3QgPSBwUmVnUXVldWU7Ci0KLQkJc3Bpbl91bmxvY2tfaXJxKCAmcFdiMzVSZWctPkVQMFZNX3NwaW5fbG9jayApOwotCi0JCS8vIFN0YXJ0IEVQMFZNCi0JCVdiMzVSZWdfRVAwVk1fc3RhcnQocEh3RGF0YSk7Ci0KLQkJcmV0dXJuIFRSVUU7Ci0JfSBlbHNlIHsKLQkJaWYgKHBVcmIpCi0JCQl1c2JfZnJlZV91cmIocFVyYik7Ci0JCWlmIChwUmVnUXVldWUpCi0JCQlrZnJlZShwUmVnUXVldWUpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotICAgcmV0dXJuIEZBTFNFOwotfQotCi12b2lkCi1XYjM1UmVnX1VwZGF0ZShwaHdfZGF0YV90IHBId0RhdGEsICB1MTYgUmVnaXN0ZXJObywgIHUzMiBSZWdpc3RlclZhbHVlKQotewotCVBXQjM1UkVHCXBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7Ci0Jc3dpdGNoIChSZWdpc3Rlck5vKSB7Ci0JY2FzZSAweDNiMDogcFdiMzVSZWctPlUxQjAgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4M2JjOiBwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4NDAwOiBwV2IzNVJlZy0+RDAwX0RtYUNvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODAwOiBwV2IzNVJlZy0+TTAwX01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKLQljYXNlIDB4ODA0OiBwV2IzNVJlZy0+TTA0X011bHRpY2FzdEFkZHJlc3MxID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDgwODogcFdiMzVSZWctPk0wOF9NdWx0aWNhc3RBZGRyZXNzMiA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4MjQ6IHBXYjM1UmVnLT5NMjRfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4Mjg6IHBXYjM1UmVnLT5NMjhfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4MmM6IHBXYjM1UmVnLT5NMkNfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4Mzg6IHBXYjM1UmVnLT5NMzhfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4NDA6IHBXYjM1UmVnLT5NNDBfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4NDQ6IHBXYjM1UmVnLT5NNDRfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4NDg6IHBXYjM1UmVnLT5NNDhfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4NGM6IHBXYjM1UmVnLT5NNENfTWFjU3RhdHVzID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg2MDogcFdiMzVSZWctPk02MF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg2ODogcFdiMzVSZWctPk02OF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg3MDogcFdiMzVSZWctPk03MF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg3NDogcFdiMzVSZWctPk03NF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7Ci0JY2FzZSAweDg3ODogcFdiMzVSZWctPk03OF9FUlBJbmZvcm1hdGlvbiA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4N0M6IHBXYjM1UmVnLT5NN0NfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4ODA6IHBXYjM1UmVnLT5NODBfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4ODQ6IHBXYjM1UmVnLT5NODRfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4ODg6IHBXYjM1UmVnLT5NODhfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHg4OTg6IHBXYjM1UmVnLT5NOThfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHgxMDBjOiBwV2IzNVJlZy0+QkIwQyA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHgxMDJjOiBwV2IzNVJlZy0+QkIyQyA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHgxMDMwOiBwV2IzNVJlZy0+QkIzMCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHgxMDNjOiBwV2IzNVJlZy0+QkIzQyA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHgxMDQ4OiBwV2IzNVJlZy0+QkI0OCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHgxMDRjOiBwV2IzNVJlZy0+QkI0QyA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHgxMDUwOiBwV2IzNVJlZy0+QkI1MCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHgxMDU0OiBwV2IzNVJlZy0+QkI1NCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHgxMDU4OiBwV2IzNVJlZy0+QkI1OCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHgxMDVjOiBwV2IzNVJlZy0+QkI1QyA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCWNhc2UgMHgxMDYwOiBwV2IzNVJlZy0+QkI2MCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOwotCX0KLX0KLQotLy8gVFJVRSAgOiByZWFkIGNvbW1hbmQgcHJvY2VzcyBzdWNjZXNzZnVsbHkKLS8vIEZBTFNFIDogcmVnaXN0ZXIgbm90IHN1cHBvcnQKLXVuc2lnbmVkIGNoYXIKLVdiMzVSZWdfV3JpdGVTeW5jKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IFJlZ2lzdGVyTm8sICB1MzIgUmVnaXN0ZXJWYWx1ZSApCi17Ci0JUFdCMzVSRUcgcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKLQlpbnQgcmV0ID0gLTE7Ci0KLQkvLyBNb2R1bGUgc2h1dGRvd24KLQlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUpCi0JCXJldHVybiBGQUxTRTsKLQotCVJlZ2lzdGVyVmFsdWUgPSBjcHVfdG9fbGUzMihSZWdpc3RlclZhbHVlKTsKLQotCS8vIHVwZGF0ZSB0aGUgcmVnaXN0ZXIgYnkgc2VuZCB1c2IgbWVzc2FnZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCXBXYjM1UmVnLT5TeW5jSW9QYXVzZSA9IDE7Ci0KLQkvLyAyMDA2MDcxNy41IFdhaXQgdW50aWwgRVAwVk0gc3RvcAotCXdoaWxlIChwV2IzNVJlZy0+RVAwdm1fc3RhdGUgIT0gVk1fU1RPUCkKLQkJT1NfU0xFRVAoMTAwMDApOwotCi0JLy8gU3luYyBJb0NhbGxEcml2ZXIKLQlwV2IzNVJlZy0+RVAwdm1fc3RhdGUgPSBWTV9SVU5OSU5HOwotCXJldCA9IHVzYl9jb250cm9sX21zZyggcEh3RGF0YS0+V2JVc2IudWRldiwKLQkJCSAgICAgICB1c2Jfc25kY3RybHBpcGUoIHBId0RhdGEtPldiVXNiLnVkZXYsIDAgKSwKLQkJCSAgICAgICAweDAzLCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFIHwgVVNCX0RJUl9PVVQsCi0JCQkgICAgICAgMHgwLFJlZ2lzdGVyTm8sICZSZWdpc3RlclZhbHVlLCA0LCBIWioxMDAgKTsKLQlwV2IzNVJlZy0+RVAwdm1fc3RhdGUgPSBWTV9TVE9QOwotCXBXYjM1UmVnLT5TeW5jSW9QYXVzZSA9IDA7Ci0KLQlXYjM1UmVnX0VQMFZNX3N0YXJ0KHBId0RhdGEpOwotCi0JaWYgKHJldCA8IDApIHsKLQkJI2lmZGVmIF9QRV9SRUdfRFVNUF8KLQkJV0JERUJVRygoIkVQMCBXcml0ZSByZWdpc3RlciB1c2IgbWVzc2FnZSBzZW5kaW5nIGVycm9yXG4iKSk7Ci0JCSNlbmRpZgotCi0JCXBId0RhdGEtPlN1cnByaXNlUmVtb3ZlID0gMTsgLy8gMjAwNjA3MDQuMgotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8vIFRSVUUgIDogcmVhZCBjb21tYW5kIHByb2Nlc3Mgc3VjY2Vzc2Z1bGx5Ci0vLyBGQUxTRSA6IHJlZ2lzdGVyIG5vdCBzdXBwb3J0Ci11bnNpZ25lZCBjaGFyCi1XYjM1UmVnX1dyaXRlKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IFJlZ2lzdGVyTm8sICB1MzIgUmVnaXN0ZXJWYWx1ZSApCi17Ci0JUFdCMzVSRUcJcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKLQlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpkcjsKLQlQVVJCCQlwVXJiID0gTlVMTDsKLQlQUkVHX1FVRVVFCXBSZWdRdWV1ZSA9IE5VTEw7Ci0JdTE2CQlVcmJTaXplOwotCi0KLQkvLyBNb2R1bGUgc2h1dGRvd24KLQlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUpCi0JCXJldHVybiBGQUxTRTsKLQotCS8vIHVwZGF0ZSB0aGUgcmVnaXN0ZXIgYnkgc2VuZCB1cmIgcmVxdWVzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVVyYlNpemUgPSBzaXplb2YoUkVHX1FVRVVFKSArIHNpemVvZihzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0KTsKLQlPU19NRU1PUllfQUxMT0MoICh2b2lkKiAqKSZwUmVnUXVldWUsIFVyYlNpemUgKTsKLQlwVXJiID0gd2JfdXNiX2FsbG9jX3VyYigwKTsKLQlpZiAocFVyYiAmJiBwUmVnUXVldWUpIHsKLQkJcFJlZ1F1ZXVlLT5ESVJFQ1QgPSAxOy8vIGJ1cnN0IHdyaXRlIHJlZ2lzdGVyCi0JCXBSZWdRdWV1ZS0+SU5ERVggPSBSZWdpc3Rlck5vOwotCQlwUmVnUXVldWUtPlZBTFVFID0gY3B1X3RvX2xlMzIoUmVnaXN0ZXJWYWx1ZSk7Ci0JCXBSZWdRdWV1ZS0+UkVTRVJWRURfVkFMSUQgPSBGQUxTRTsKLQkJZHIgPSAoc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqKSgodTggKilwUmVnUXVldWUgKyBzaXplb2YoUkVHX1FVRVVFKSk7Ci0JCWRyLT5iUmVxdWVzdFR5cGUgPSBVU0JfVFlQRV9WRU5ET1J8VVNCX0RJUl9PVVQgfFVTQl9SRUNJUF9ERVZJQ0U7Ci0JCWRyLT5iUmVxdWVzdCA9IDB4MDM7IC8vIFVTQiBvciB2ZW5kb3ItZGVmaW5lZCByZXF1ZXN0IGNvZGUsIGJ1cnN0IG1vZGUKLQkJZHItPndWYWx1ZSA9IGNwdV90b19sZTE2KDB4MCk7Ci0JCWRyLT53SW5kZXggPSBjcHVfdG9fbGUxNihSZWdpc3Rlck5vKTsKLQkJZHItPndMZW5ndGggPSBjcHVfdG9fbGUxNig0KTsKLQotCQkvLyBFbnRlciB0aGUgc2VuZGluZyBxdWV1ZQotCQlwUmVnUXVldWUtPk5leHQgPSBOVUxMOwotCQlwUmVnUXVldWUtPnBVc2JSZXEgPSBkcjsKLQkJcFJlZ1F1ZXVlLT5wVXJiID0gcFVyYjsKLQotCQlzcGluX2xvY2tfaXJxKCZwV2IzNVJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7Ci0JCWlmIChwV2IzNVJlZy0+cFJlZ0ZpcnN0ID09IE5VTEwpCi0JCQlwV2IzNVJlZy0+cFJlZ0ZpcnN0ID0gcFJlZ1F1ZXVlOwotCQllbHNlCi0JCQlwV2IzNVJlZy0+cFJlZ0xhc3QtPk5leHQgPSBwUmVnUXVldWU7Ci0JCXBXYjM1UmVnLT5wUmVnTGFzdCA9IHBSZWdRdWV1ZTsKLQotCQlzcGluX3VubG9ja19pcnEoICZwV2IzNVJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7Ci0KLQkJLy8gU3RhcnQgRVAwVk0KLQkJV2IzNVJlZ19FUDBWTV9zdGFydChwSHdEYXRhKTsKLQotCQlyZXR1cm4gVFJVRTsKLQl9IGVsc2UgewotCQlpZiAocFVyYikKLQkJCXVzYl9mcmVlX3VyYihwVXJiKTsKLQkJa2ZyZWUocFJlZ1F1ZXVlKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLX0KLQotLy9UaGlzIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZCB3aXRoIGEgdXNlciBkZWZpbmVkIHZhbHVlLiBXaGVuIGl0IGNvbXBsZXRlcywKLS8vdGhpcyB2YWx1ZSBpcyB1c2VmdWwuIEZvciBleGFtcGxlLCBoYWxfc2V0X2N1cnJlbnRfY2hhbm5lbCB3aWxsIHVzZSBpdC4KLS8vIFRSVUUgIDogcmVhZCBjb21tYW5kIHByb2Nlc3Mgc3VjY2Vzc2Z1bGx5Ci0vLyBGQUxTRSA6IHJlZ2lzdGVyIG5vdCBzdXBwb3J0Ci11bnNpZ25lZCBjaGFyCi1XYjM1UmVnX1dyaXRlV2l0aENhbGxiYWNrVmFsdWUoIHBod19kYXRhX3QgcEh3RGF0YSwgdTE2IFJlZ2lzdGVyTm8sIHUzMiBSZWdpc3RlclZhbHVlLAotCQkJCXM4ICpwVmFsdWUsIHM4IExlbikKLXsKLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOwotCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmRyOwotCVBVUkIJCXBVcmIgPSBOVUxMOwotCVBSRUdfUVVFVUUJcFJlZ1F1ZXVlID0gTlVMTDsKLQl1MTYJCVVyYlNpemU7Ci0KLQkvLyBNb2R1bGUgc2h1dGRvd24KLQlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUpCi0JCXJldHVybiBGQUxTRTsKLQotCS8vIHVwZGF0ZSB0aGUgcmVnaXN0ZXIgYnkgc2VuZCB1cmIgcmVxdWVzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVVyYlNpemUgPSBzaXplb2YoUkVHX1FVRVVFKSArIHNpemVvZihzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0KTsKLQlPU19NRU1PUllfQUxMT0MoKHZvaWQqICopICZwUmVnUXVldWUsIFVyYlNpemUgKTsKLQlwVXJiID0gd2JfdXNiX2FsbG9jX3VyYigwKTsKLQlpZiAocFVyYiAmJiBwUmVnUXVldWUpIHsKLQkJcFJlZ1F1ZXVlLT5ESVJFQ1QgPSAxOy8vIGJ1cnN0IHdyaXRlIHJlZ2lzdGVyCi0JCXBSZWdRdWV1ZS0+SU5ERVggPSBSZWdpc3Rlck5vOwotCQlwUmVnUXVldWUtPlZBTFVFID0gY3B1X3RvX2xlMzIoUmVnaXN0ZXJWYWx1ZSk7Ci0JCS8vTk9URSA6IFVzZXJzIG11c3QgZ3VhcmFudGVlIHRoZSBzaXplIG9mIHZhbHVlIHdpbGwgbm90IGV4Y2VlZCB0aGUgYnVmZmVyIHNpemUuCi0JCW1lbWNweShwUmVnUXVldWUtPlJFU0VSVkVELCBwVmFsdWUsIExlbik7Ci0JCXBSZWdRdWV1ZS0+UkVTRVJWRURfVkFMSUQgPSBUUlVFOwotCQlkciA9IChzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICopKCh1OCAqKXBSZWdRdWV1ZSArIHNpemVvZihSRUdfUVVFVUUpKTsKLQkJZHItPmJSZXF1ZXN0VHlwZSA9IFVTQl9UWVBFX1ZFTkRPUnxVU0JfRElSX09VVCB8VVNCX1JFQ0lQX0RFVklDRTsKLQkJZHItPmJSZXF1ZXN0ID0gMHgwMzsgLy8gVVNCIG9yIHZlbmRvci1kZWZpbmVkIHJlcXVlc3QgY29kZSwgYnVyc3QgbW9kZQotCQlkci0+d1ZhbHVlID0gY3B1X3RvX2xlMTYoMHgwKTsKLQkJZHItPndJbmRleCA9IGNwdV90b19sZTE2KFJlZ2lzdGVyTm8pOwotCQlkci0+d0xlbmd0aCA9IGNwdV90b19sZTE2KDQpOwotCi0JCS8vIEVudGVyIHRoZSBzZW5kaW5nIHF1ZXVlCi0JCXBSZWdRdWV1ZS0+TmV4dCA9IE5VTEw7Ci0JCXBSZWdRdWV1ZS0+cFVzYlJlcSA9IGRyOwotCQlwUmVnUXVldWUtPnBVcmIgPSBwVXJiOwotCQlzcGluX2xvY2tfaXJxICgmcFdiMzVSZWctPkVQMFZNX3NwaW5fbG9jayApOwotCQlpZiggcFdiMzVSZWctPnBSZWdGaXJzdCA9PSBOVUxMICkKLQkJCXBXYjM1UmVnLT5wUmVnRmlyc3QgPSBwUmVnUXVldWU7Ci0JCWVsc2UKLQkJCXBXYjM1UmVnLT5wUmVnTGFzdC0+TmV4dCA9IHBSZWdRdWV1ZTsKLQkJcFdiMzVSZWctPnBSZWdMYXN0ID0gcFJlZ1F1ZXVlOwotCi0JCXNwaW5fdW5sb2NrX2lycSAoICZwV2IzNVJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7Ci0KLQkJLy8gU3RhcnQgRVAwVk0KLQkJV2IzNVJlZ19FUDBWTV9zdGFydChwSHdEYXRhKTsKLQkJcmV0dXJuIFRSVUU7Ci0JfSBlbHNlIHsKLQkJaWYgKHBVcmIpCi0JCQl1c2JfZnJlZV91cmIocFVyYik7Ci0JCWtmcmVlKHBSZWdRdWV1ZSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci19Ci0KLS8vIFRSVUUgIDogcmVhZCBjb21tYW5kIHByb2Nlc3Mgc3VjY2Vzc2Z1bGx5Ci0vLyBGQUxTRSA6IHJlZ2lzdGVyIG5vdCBzdXBwb3J0Ci0vLyBwUmVnaXN0ZXJWYWx1ZSA6IEl0IG11c3QgYmUgYSByZXNpZGVudCBidWZmZXIgZHVlIHRvIGFzeW5jaHJvbm91cyByZWFkIHJlZ2lzdGVyLgotdW5zaWduZWQgY2hhcgotV2IzNVJlZ19SZWFkU3luYyggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUxNiBSZWdpc3Rlck5vLCAgIHUzMiAqIHBSZWdpc3RlclZhbHVlICkKLXsKLQlQV0IzNVJFRyBwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOwotCXUzMiAqCXBsdG1wID0gcFJlZ2lzdGVyVmFsdWU7Ci0JaW50IHJldCA9IC0xOwotCi0JLy8gTW9kdWxlIHNodXRkb3duCi0JaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQkvLyBSZWFkIHRoZSByZWdpc3RlciBieSBzZW5kIHVzYiBtZXNzYWdlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQlwV2IzNVJlZy0+U3luY0lvUGF1c2UgPSAxOwotCi0JLy8gMjAwNjA3MTcuNSBXYWl0IHVudGlsIEVQMFZNIHN0b3AKLQl3aGlsZSAocFdiMzVSZWctPkVQMHZtX3N0YXRlICE9IFZNX1NUT1ApCi0JCU9TX1NMRUVQKDEwMDAwKTsKLQotCXBXYjM1UmVnLT5FUDB2bV9zdGF0ZSA9IFZNX1JVTk5JTkc7Ci0JcmV0ID0gdXNiX2NvbnRyb2xfbXNnKCBwSHdEYXRhLT5XYlVzYi51ZGV2LAotCQkJICAgICAgIHVzYl9yY3ZjdHJscGlwZShwSHdEYXRhLT5XYlVzYi51ZGV2LCAwKSwKLQkJCSAgICAgICAweDAxLCBVU0JfVFlQRV9WRU5ET1J8VVNCX1JFQ0lQX0RFVklDRXxVU0JfRElSX0lOLAotCQkJICAgICAgIDB4MCwgUmVnaXN0ZXJObywgcGx0bXAsIDQsIEhaKjEwMCApOwotCi0JKnBSZWdpc3RlclZhbHVlID0gY3B1X3RvX2xlMzIoKnBsdG1wKTsKLQotCXBXYjM1UmVnLT5FUDB2bV9zdGF0ZSA9IFZNX1NUT1A7Ci0KLQlXYjM1UmVnX1VwZGF0ZSggcEh3RGF0YSwgUmVnaXN0ZXJObywgKnBSZWdpc3RlclZhbHVlICk7Ci0JcFdiMzVSZWctPlN5bmNJb1BhdXNlID0gMDsKLQotCVdiMzVSZWdfRVAwVk1fc3RhcnQoIHBId0RhdGEgKTsKLQotCWlmIChyZXQgPCAwKSB7Ci0JCSNpZmRlZiBfUEVfUkVHX0RVTVBfCi0JCVdCREVCVUcoKCJFUDAgUmVhZCByZWdpc3RlciB1c2IgbWVzc2FnZSBzZW5kaW5nIGVycm9yXG4iKSk7Ci0JCSNlbmRpZgotCi0JCXBId0RhdGEtPlN1cnByaXNlUmVtb3ZlID0gMTsgLy8gMjAwNjA3MDQuMgotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8vIFRSVUUgIDogcmVhZCBjb21tYW5kIHByb2Nlc3Mgc3VjY2Vzc2Z1bGx5Ci0vLyBGQUxTRSA6IHJlZ2lzdGVyIG5vdCBzdXBwb3J0Ci0vLyBwUmVnaXN0ZXJWYWx1ZSA6IEl0IG11c3QgYmUgYSByZXNpZGVudCBidWZmZXIgZHVlIHRvIGFzeW5jaHJvbm91cyByZWFkIHJlZ2lzdGVyLgotdW5zaWduZWQgY2hhcgotV2IzNVJlZ19SZWFkKHBod19kYXRhX3QgcEh3RGF0YSwgdTE2IFJlZ2lzdGVyTm8sICB1MzIgKiBwUmVnaXN0ZXJWYWx1ZSApCi17Ci0JUFdCMzVSRUcJcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKLQlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICogZHI7Ci0JUFVSQgkJcFVyYjsKLQlQUkVHX1FVRVVFCXBSZWdRdWV1ZTsKLQl1MTYJCVVyYlNpemU7Ci0KLQkvLyBNb2R1bGUgc2h1dGRvd24KLQlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUpCi0JCXJldHVybiBGQUxTRTsKLQotCS8vIHVwZGF0ZSB0aGUgdmFyaWFibGUgYnkgc2VuZCBVcmIgdG8gcmVhZCByZWdpc3RlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlVcmJTaXplID0gc2l6ZW9mKFJFR19RVUVVRSkgKyBzaXplb2Yoc3RydWN0IHVzYl9jdHJscmVxdWVzdCk7Ci0JT1NfTUVNT1JZX0FMTE9DKCAodm9pZCogKikmcFJlZ1F1ZXVlLCBVcmJTaXplICk7Ci0JcFVyYiA9IHdiX3VzYl9hbGxvY191cmIoMCk7Ci0JaWYoIHBVcmIgJiYgcFJlZ1F1ZXVlICkKLQl7Ci0JCXBSZWdRdWV1ZS0+RElSRUNUID0gMDsvLyByZWFkIHJlZ2lzdGVyCi0JCXBSZWdRdWV1ZS0+SU5ERVggPSBSZWdpc3Rlck5vOwotCQlwUmVnUXVldWUtPnBCdWZmZXIgPSBwUmVnaXN0ZXJWYWx1ZTsKLQkJZHIgPSAoc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqKSgodTggKilwUmVnUXVldWUgKyBzaXplb2YoUkVHX1FVRVVFKSk7Ci0JCWRyLT5iUmVxdWVzdFR5cGUgPSBVU0JfVFlQRV9WRU5ET1J8VVNCX1JFQ0lQX0RFVklDRXxVU0JfRElSX0lOOwotCQlkci0+YlJlcXVlc3QgPSAweDAxOyAvLyBVU0Igb3IgdmVuZG9yLWRlZmluZWQgcmVxdWVzdCBjb2RlLCBidXJzdCBtb2RlCi0JCWRyLT53VmFsdWUgPSBjcHVfdG9fbGUxNigweDApOwotCQlkci0+d0luZGV4ID0gY3B1X3RvX2xlMTYgKFJlZ2lzdGVyTm8pOwotCQlkci0+d0xlbmd0aCA9IGNwdV90b19sZTE2ICg0KTsKLQotCQkvLyBFbnRlciB0aGUgc2VuZGluZyBxdWV1ZQotCQlwUmVnUXVldWUtPk5leHQgPSBOVUxMOwotCQlwUmVnUXVldWUtPnBVc2JSZXEgPSBkcjsKLQkJcFJlZ1F1ZXVlLT5wVXJiID0gcFVyYjsKLQkJc3Bpbl9sb2NrX2lycSAoICZwV2IzNVJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7Ci0JCWlmKCBwV2IzNVJlZy0+cFJlZ0ZpcnN0ID09IE5VTEwgKQotCQkJcFdiMzVSZWctPnBSZWdGaXJzdCA9IHBSZWdRdWV1ZTsKLQkJZWxzZQotCQkJcFdiMzVSZWctPnBSZWdMYXN0LT5OZXh0ID0gcFJlZ1F1ZXVlOwotCQlwV2IzNVJlZy0+cFJlZ0xhc3QgPSBwUmVnUXVldWU7Ci0KLQkJc3Bpbl91bmxvY2tfaXJxKCAmcFdiMzVSZWctPkVQMFZNX3NwaW5fbG9jayApOwotCi0JCS8vIFN0YXJ0IEVQMFZNCi0JCVdiMzVSZWdfRVAwVk1fc3RhcnQoIHBId0RhdGEgKTsKLQotCQlyZXR1cm4gVFJVRTsKLQl9IGVsc2UgewotCQlpZiAocFVyYikKLQkJCXVzYl9mcmVlX3VyYiggcFVyYiApOwotCQlrZnJlZShwUmVnUXVldWUpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotfQotCi0KLXZvaWQKLVdiMzVSZWdfRVAwVk1fc3RhcnQoICBwaHdfZGF0YV90IHBId0RhdGEgKQotewotCVBXQjM1UkVHIHBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7Ci0KLQlpZiAoT1NfQVRPTUlDX0lOQyggcEh3RGF0YS0+QWRhcHRlciwgJnBXYjM1UmVnLT5SZWdGaXJlQ291bnQpID09IDEpIHsKLQkJcFdiMzVSZWctPkVQMHZtX3N0YXRlID0gVk1fUlVOTklORzsKLQkJV2IzNVJlZ19FUDBWTShwSHdEYXRhKTsKLQl9IGVsc2UKLQkJT1NfQVRPTUlDX0RFQyggcEh3RGF0YS0+QWRhcHRlciwgJnBXYjM1UmVnLT5SZWdGaXJlQ291bnQgKTsKLX0KLQotdm9pZAotV2IzNVJlZ19FUDBWTShwaHdfZGF0YV90IHBId0RhdGEgKQotewotCVBXQjM1UkVHCXBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7Ci0JUFVSQgkJcFVyYjsKLQlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpkcjsKLQl1MzIgKgkJcEJ1ZmZlcjsKLQlpbnQJCQlyZXQgPSAtMTsKLQlQUkVHX1FVRVVFCXBSZWdRdWV1ZTsKLQotCi0JaWYgKHBXYjM1UmVnLT5TeW5jSW9QYXVzZSkKLQkJZ290byBjbGVhbnVwOwotCi0JaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlKQotCQlnb3RvIGNsZWFudXA7Ci0KLQkvLyBHZXQgdGhlIHJlZ2lzdGVyIGRhdGEgYW5kIHNlbmQgdG8gVVNCIHRocm91Z2ggSXJwCi0Jc3Bpbl9sb2NrX2lycSggJnBXYjM1UmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKLQlwUmVnUXVldWUgPSBwV2IzNVJlZy0+cFJlZ0ZpcnN0OwotCXNwaW5fdW5sb2NrX2lycSggJnBXYjM1UmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKLQotCWlmICghcFJlZ1F1ZXVlKQotCQlnb3RvIGNsZWFudXA7Ci0KLQkvLyBHZXQgYW4gVXJiLCBzZW5kIGl0Ci0JcFVyYiA9IChQVVJCKXBSZWdRdWV1ZS0+cFVyYjsKLQotCWRyID0gcFJlZ1F1ZXVlLT5wVXNiUmVxOwotCXBVcmIgPSBwUmVnUXVldWUtPnBVcmI7Ci0JcEJ1ZmZlciA9IHBSZWdRdWV1ZS0+cEJ1ZmZlcjsKLQlpZiAocFJlZ1F1ZXVlLT5ESVJFQ1QgPT0gMSkgLy8gb3V0cHV0Ci0JCXBCdWZmZXIgPSAmcFJlZ1F1ZXVlLT5WQUxVRTsKLQotCXVzYl9maWxsX2NvbnRyb2xfdXJiKCBwVXJiLCBwSHdEYXRhLT5XYlVzYi51ZGV2LAotCQkJICAgICAgUkVHX0RJUkVDVElPTihwSHdEYXRhLT5XYlVzYi51ZGV2LHBSZWdRdWV1ZSksCi0JCQkgICAgICAodTggKilkcixwQnVmZmVyLGNwdV90b19sZTE2KGRyLT53TGVuZ3RoKSwKLQkJCSAgICAgIFdiMzVSZWdfRVAwVk1fY29tcGxldGUsICh2b2lkKilwSHdEYXRhKTsKLQotCXBXYjM1UmVnLT5FUDB2bV9zdGF0ZSA9IFZNX1JVTk5JTkc7Ci0KLQlyZXQgPSB3Yl91c2Jfc3VibWl0X3VyYiggcFVyYiApOwotCi0JaWYgKHJldCA8IDApIHsKLSNpZmRlZiBfUEVfUkVHX0RVTVBfCi0JCVdCREVCVUcoKCJFUDAgSXJwIHNlbmRpbmcgZXJyb3JcbiIpKTsKLSNlbmRpZgotCQlnb3RvIGNsZWFudXA7Ci0JfQotCi0JcmV0dXJuOwotCi0gY2xlYW51cDoKLQlwV2IzNVJlZy0+RVAwdm1fc3RhdGUgPSBWTV9TVE9QOwotCU9TX0FUT01JQ19ERUMoIHBId0RhdGEtPkFkYXB0ZXIsICZwV2IzNVJlZy0+UmVnRmlyZUNvdW50ICk7Ci19Ci0KLQotdm9pZAotV2IzNVJlZ19FUDBWTV9jb21wbGV0ZShQVVJCIHBVcmIpCi17Ci0JcGh3X2RhdGFfdCAgcEh3RGF0YSA9IChwaHdfZGF0YV90KXBVcmItPmNvbnRleHQ7Ci0JUFdCMzVSRUcJcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKLQlQUkVHX1FVRVVFCXBSZWdRdWV1ZTsKLQotCi0JLy8gVmFyaWFibGUgc2V0dGluZwotCXBXYjM1UmVnLT5FUDB2bV9zdGF0ZSA9IFZNX0NPTVBMRVRFRDsKLQlwV2IzNVJlZy0+RVAwVk1fc3RhdHVzID0gcFVyYi0+c3RhdHVzOwotCi0JaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlKSB7IC8vIExldCBXYldsYW5IYWx0IHRvIGhhbmRsZSBzdXJwcmlzZSByZW1vdmUKLQkJcFdiMzVSZWctPkVQMHZtX3N0YXRlID0gVk1fU1RPUDsKLQkJT1NfQVRPTUlDX0RFQyggcEh3RGF0YS0+QWRhcHRlciwgJnBXYjM1UmVnLT5SZWdGaXJlQ291bnQgKTsKLQl9IGVsc2UgewotCQkvLyBDb21wbGV0ZSB0byBzZW5kLCByZW1vdmUgdGhlIFVSQiBmcm9tIHRoZSBmaXJzdAotCQlzcGluX2xvY2tfaXJxKCAmcFdiMzVSZWctPkVQMFZNX3NwaW5fbG9jayApOwotCQlwUmVnUXVldWUgPSBwV2IzNVJlZy0+cFJlZ0ZpcnN0OwotCQlpZiAocFJlZ1F1ZXVlID09IHBXYjM1UmVnLT5wUmVnTGFzdCkKLQkJCXBXYjM1UmVnLT5wUmVnTGFzdCA9IE5VTEw7Ci0JCXBXYjM1UmVnLT5wUmVnRmlyc3QgPSBwV2IzNVJlZy0+cFJlZ0ZpcnN0LT5OZXh0OwotCQlzcGluX3VubG9ja19pcnEoICZwV2IzNVJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7Ci0KLQkJaWYgKHBXYjM1UmVnLT5FUDBWTV9zdGF0dXMpIHsKLSNpZmRlZiBfUEVfUkVHX0RVTVBfCi0JCQlXQkRFQlVHKCgiRVAwIElvQ29tcGxldGVSb3V0aW5lIHJldHVybiBlcnJvclxuIikpOwotCQkJRGVidWdVc2JkU3RhdHVzSW5mb3JtYXRpb24oIHBXYjM1UmVnLT5FUDBWTV9zdGF0dXMgKTsKLSNlbmRpZgotCQkJcFdiMzVSZWctPkVQMHZtX3N0YXRlID0gVk1fU1RPUDsKLQkJCXBId0RhdGEtPlN1cnByaXNlUmVtb3ZlID0gMTsKLQkJfSBlbHNlIHsKLQkJCS8vIFN1Y2Nlc3MuIFVwZGF0ZSB0aGUgcmVzdWx0Ci0KLQkJCS8vIFN0YXJ0IHRoZSBuZXh0IHNlbmQKLQkJCVdiMzVSZWdfRVAwVk0ocEh3RGF0YSk7Ci0JCX0KLQotICAgCQlrZnJlZShwUmVnUXVldWUpOwotCX0KLQotCXVzYl9mcmVlX3VyYihwVXJiKTsKLX0KLQotCi12b2lkCi1XYjM1UmVnX2Rlc3Ryb3kocGh3X2RhdGFfdCBwSHdEYXRhKQotewotCVBXQjM1UkVHCXBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7Ci0JUFVSQgkJcFVyYjsKLQlQUkVHX1FVRVVFCXBSZWdRdWV1ZTsKLQotCi0JVXh4X3Bvd2VyX29mZl9wcm9jZWR1cmUocEh3RGF0YSk7Ci0KLQkvLyBXYWl0IGZvciBSZWcgb3BlcmF0aW9uIGNvbXBsZXRlZAotCWRvIHsKLQkJT1NfU0xFRVAoMTAwMDApOyAvLyBEZWxheSBmb3Igd2FpdGluZyBmdW5jdGlvbiBlbnRlciA5NDA2MjMuMS5hCi0JfSB3aGlsZSAocFdiMzVSZWctPkVQMHZtX3N0YXRlICE9IFZNX1NUT1ApOwotCU9TX1NMRUVQKDEwMDAwKTsgIC8vIERlbGF5IGZvciB3YWl0aW5nIGZ1bmN0aW9uIGVudGVyIDk0MDYyMy4xLmIKLQotCS8vIFJlbGVhc2UgYWxsIHRoZSBkYXRhIGluIFJlZ1F1ZXVlCi0Jc3Bpbl9sb2NrX2lycSggJnBXYjM1UmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKLQlwUmVnUXVldWUgPSBwV2IzNVJlZy0+cFJlZ0ZpcnN0OwotCXdoaWxlIChwUmVnUXVldWUpIHsKLQkJaWYgKHBSZWdRdWV1ZSA9PSBwV2IzNVJlZy0+cFJlZ0xhc3QpCi0JCQlwV2IzNVJlZy0+cFJlZ0xhc3QgPSBOVUxMOwotCQlwV2IzNVJlZy0+cFJlZ0ZpcnN0ID0gcFdiMzVSZWctPnBSZWdGaXJzdC0+TmV4dDsKLQotCQlwVXJiID0gcFJlZ1F1ZXVlLT5wVXJiOwotCQlzcGluX3VubG9ja19pcnEoICZwV2IzNVJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7Ci0JCWlmIChwVXJiKSB7Ci0JCQl1c2JfZnJlZV91cmIocFVyYik7Ci0JCQlrZnJlZShwUmVnUXVldWUpOwotCQl9IGVsc2UgewotCQkJI2lmZGVmIF9QRV9SRUdfRFVNUF8KLQkJCVdCREVCVUcoKCJFUDAgcXVldWUgcmVsZWFzZSBlcnJvclxuIikpOwotCQkJI2VuZGlmCi0JCX0KLQkJc3Bpbl9sb2NrX2lycSggJnBXYjM1UmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKLQotCQlwUmVnUXVldWUgPSBwV2IzNVJlZy0+cFJlZ0ZpcnN0OwotCX0KLQlzcGluX3VubG9ja19pcnEoICZwV2IzNVJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7Ci19Ci0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBUaGUgZnVuY3Rpb24gY2FuIGJlIHJ1biBpbiBwYXNzaXZlLWxldmVsIG9ubHkuCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotdW5zaWduZWQgY2hhciBXYjM1UmVnX2luaXRpYWwocGh3X2RhdGFfdCBwSHdEYXRhKQotewotCVBXQjM1UkVHIHBXYjM1UmVnPSZwSHdEYXRhLT5XYjM1UmVnOwotCXUzMiBsdG1wOwotCXUzMiBTb2Z0d2FyZVNldCwgVkNPX3RyaW0sIFR4VmdhLCBSZWdpb25fU2NhbkludGVydmFsOwotCi0JLy8gU3BpbiBsb2NrIGlzIGFjcXVpcmVkIGZvciByZWFkIGFuZCB3cml0ZSBJUlAgY29tbWFuZAotCXNwaW5fbG9ja19pbml0KCAmcFdiMzVSZWctPkVQMFZNX3NwaW5fbG9jayApOwotCi0JLy8gR2V0dGluZyBSRiBtb2R1bGUgdHlwZSBmcm9tIEVFUFJPTSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwM2I0LCAweDA4MGQwMDAwICk7IC8vIFN0YXJ0IEVFUFJPTSBhY2Nlc3MgKyBSZWFkICsgYWRkcmVzcygweDBkKQotCVdiMzVSZWdfUmVhZFN5bmMoIHBId0RhdGEsIDB4MDNiNCwgJmx0bXAgKTsKLQotCS8vVXBkYXRlIFJGIG1vZHVsZSB0eXBlIGFuZCBkZXRlcm1pbmUgdGhlIFBIWSB0eXBlIGJ5IGluZiBvciBFRVBST00KLQlwV2IzNVJlZy0+RUVQUk9NUGh5VHlwZSA9ICh1OCkoIGx0bXAgJiAweGZmICk7Ci0JLy8gMCBWIE1BWDI4MjUsIDEgViBNQVgyODI3LCAyIFYgTUFYMjgyOCwgMyBWIE1BWDI4MjkKLQkvLyAxNlYgQUwyMjMwLCAxNyAtIEFMNzIzMCwgMTggLSBBTDIyMzBTCi0JLy8gMzIgUmVzZXJ2ZWQKLQkvLyAzMyAtIFc4OVJGMjQyKFR4VkdBIDB+MTkpLCAzNCAtIFc4OVJGMjQyKFR4VkdBIDB+MzQpCi0JaWYgKHBXYjM1UmVnLT5FRVBST01QaHlUeXBlICE9IFJGX0RFQ0lERV9CWV9JTkYpIHsKLQkJaWYoIChwV2IzNVJlZy0+RUVQUk9NUGh5VHlwZSA9PSBSRl9NQVhJTV8yODI1KQl8fAotCQkJKHBXYjM1UmVnLT5FRVBST01QaHlUeXBlID09IFJGX01BWElNXzI4MjcpCXx8Ci0JCQkocFdiMzVSZWctPkVFUFJPTVBoeVR5cGUgPT0gUkZfTUFYSU1fMjgyOCkJfHwKLQkJCShwV2IzNVJlZy0+RUVQUk9NUGh5VHlwZSA9PSBSRl9NQVhJTV8yODI5KQl8fAotCQkJKHBXYjM1UmVnLT5FRVBST01QaHlUeXBlID09IFJGX01BWElNX1YxKQl8fAotCQkJKHBXYjM1UmVnLT5FRVBST01QaHlUeXBlID09IFJGX0FJUk9IQV8yMjMwKQl8fAotCQkJKHBXYjM1UmVnLT5FRVBST01QaHlUeXBlID09IFJGX0FJUk9IQV8yMjMwUykgICAgfHwKLQkJCShwV2IzNVJlZy0+RUVQUk9NUGh5VHlwZSA9PSBSRl9BSVJPSEFfNzIzMCkJfHwKLQkJCShwV2IzNVJlZy0+RUVQUk9NUGh5VHlwZSA9PSBSRl9XQl8yNDIpCQl8fAotCQkJKHBXYjM1UmVnLT5FRVBST01QaHlUeXBlID09IFJGX1dCXzI0Ml8xKSkKLQkJCXBId0RhdGEtPnBoeV90eXBlID0gcFdiMzVSZWctPkVFUFJPTVBoeVR5cGU7Ci0JfQotCi0JLy8gUG93ZXIgT24gcHJvY2VkdXJlIHJ1bm5pbmcuIFRoZSByZWxhdGl2ZSBwYXJhbWV0ZXIgd2lsbCBiZSBzZXQgYWNjb3JkaW5nIHRvIHBoeV90eXBlCi0JVXh4X3Bvd2VyX29uX3Byb2NlZHVyZSggcEh3RGF0YSApOwotCi0JLy8gUmVhZGluZyBNQUMgYWRkcmVzcwotCVV4eF9SZWFkRXRoZXJuZXRBZGRyZXNzKCBwSHdEYXRhICk7Ci0KLQkvLyBSZWFkIFZDTyB0cmltIGZvciBSRiBwYXJhbWV0ZXIKLQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwM2I0LCAweDA4MjAwMDAwICk7Ci0JV2IzNVJlZ19SZWFkU3luYyggcEh3RGF0YSwgMHgwM2I0LCAmVkNPX3RyaW0gKTsKLQotCS8vIFJlYWQgQW50ZW5uYSBPbi9PZmYgb2Ygc29mdHdhcmUgZmxhZwotCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDAzYjQsIDB4MDgyMTAwMDAgKTsKLQlXYjM1UmVnX1JlYWRTeW5jKCBwSHdEYXRhLCAweDAzYjQsICZTb2Z0d2FyZVNldCApOwotCi0JLy8gUmVhZCBUWFZHQQotCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDAzYjQsIDB4MDgxMDAwMDAgKTsKLQlXYjM1UmVnX1JlYWRTeW5jKCBwSHdEYXRhLCAweDAzYjQsICZUeFZnYSApOwotCi0JLy8gR2V0IFNjYW4gaW50ZXJ2YWwgc2V0dGluZyBmcm9tIEVFUFJPTSBvZmZzZXQgMHgxYwotCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDAzYjQsIDB4MDgxZDAwMDAgKTsKLQlXYjM1UmVnX1JlYWRTeW5jKCBwSHdEYXRhLCAweDAzYjQsICZSZWdpb25fU2NhbkludGVydmFsICk7Ci0KLQkvLyBVcGRhdGUgRXRoZXJuZXQgYWRkcmVzcwotCW1lbWNweSggcEh3RGF0YS0+Q3VycmVudE1hY0FkZHJlc3MsIHBId0RhdGEtPlBlcm1hbmVudE1hY0FkZHJlc3MsIEVUSF9MRU5HVEhfT0ZfQUREUkVTUyApOwotCi0JLy8gVXBkYXRlIHNvZnR3YXJlIHZhcmlhYmxlCi0JcEh3RGF0YS0+U29mdHdhcmVTZXQgPSAodTE2KShTb2Z0d2FyZVNldCAmIDB4ZmZmZik7Ci0JVHhWZ2EgJj0gMHgwMDAwMDBmZjsKLQlwSHdEYXRhLT5Qb3dlckluZGV4RnJvbUVFUFJPTSA9ICh1OClUeFZnYTsKLQlwSHdEYXRhLT5WQ09fdHJpbSA9ICh1OClWQ09fdHJpbSAmIDB4ZmY7Ci0JaWYgKHBId0RhdGEtPlZDT190cmltID09IDB4ZmYpCi0JCXBId0RhdGEtPlZDT190cmltID0gMHgyODsKLQotCXBXYjM1UmVnLT5FRVBST01SZWdpb24gPSAodTgpKFJlZ2lvbl9TY2FuSW50ZXJ2YWw+PjgpOyAvLyAyMDA2MDcyMAotCWlmKCBwV2IzNVJlZy0+RUVQUk9NUmVnaW9uPDEgfHwgcFdiMzVSZWctPkVFUFJPTVJlZ2lvbj42ICkKLQkJcFdiMzVSZWctPkVFUFJPTVJlZ2lvbiA9IFJFR0lPTl9BVVRPOwotCi0JLy9Gb3IgR2V0IFR4IFZHQSBmcm9tIEVFUFJPTSAyMDA2MDMxNS41IG1vdmUgaGVyZQotCUdldFR4VmdhRnJvbUVFUFJPTSggcEh3RGF0YSApOwotCi0JLy8gU2V0IFNjYW4gSW50ZXJ2YWwKLQlwSHdEYXRhLT5TY2FuX0ludGVydmFsID0gKHU4KShSZWdpb25fU2NhbkludGVydmFsICYgMHhmZikgKiAxMDsKLQlpZiAoKHBId0RhdGEtPlNjYW5fSW50ZXJ2YWwgPT0gMjU1MCkgfHwgKHBId0RhdGEtPlNjYW5fSW50ZXJ2YWwgPCAxMCkpIC8vIElzIGRlZmF1bHQgc2V0dGluZyAweGZmICogMTAKLQkJcEh3RGF0YS0+U2Nhbl9JbnRlcnZhbCA9IFNDQU5fTUFYX0NITkxfVElNRTsKLQotCS8vIEluaXRpYWwgcmVnaXN0ZXIKLQlSRlN5bnRoZXNpemVyX2luaXRpYWwocEh3RGF0YSk7Ci0KLQlCQlByb2Nlc3Nvcl9pbml0aWFsKHBId0RhdGEpOyAvLyBBc3luYyB3cml0ZSwgbXVzdCB3YWl0IHVudGlsIGNvbXBsZXRlCi0KLQlXYjM1UmVnX3BoeV9jYWxpYnJhdGlvbihwSHdEYXRhKTsKLQotCU14eF9pbml0aWFsKHBId0RhdGEpOwotCUR4eF9pbml0aWFsKHBId0RhdGEpOwotCi0JaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlKQotCQlyZXR1cm4gRkFMU0U7Ci0JZWxzZQotCQlyZXR1cm4gVFJVRTsgLy8gSW5pdGlhbCBmYWlsCi19Ci0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vICBDYXJkQ29tcHV0ZUNyYyAtLQotLy8KLS8vICBEZXNjcmlwdGlvbjoKLS8vICAgIFJ1bnMgdGhlIEFVVE9ESU4gSUkgQ1JDIGFsZ29yaXRobSBvbiBidWZmZXIgQnVmZmVyIG9mIGxlbmd0aCwgTGVuZ3RoLgotLy8KLS8vICBBcmd1bWVudHM6Ci0vLyAgICBCdWZmZXIgLSB0aGUgaW5wdXQgYnVmZmVyCi0vLyAgICBMZW5ndGggLSB0aGUgbGVuZ3RoIG9mIEJ1ZmZlcgotLy8KLS8vICBSZXR1cm4gVmFsdWU6Ci0vLyAgICBUaGUgMzItYml0IENSQyB2YWx1ZS4KLS8vCi0vLyAgTm90ZToKLS8vICAgIFRoaXMgaXMgYWRhcHRlZCBmcm9tIHRoZSBjb21tZW50cyBpbiB0aGUgYXNzZW1ibHkgbGFuZ3VhZ2UKLS8vICAgIHZlcnNpb24gaW4gX0dFTlJFUS5BU00gb2YgdGhlIERXQiBORTEwMDAvMjAwMCBkcml2ZXIuCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXUzMgotQ2FyZENvbXB1dGVDcmModTggKiBCdWZmZXIsIHUzMiBMZW5ndGgpCi17Ci0gICAgdTMyIENyYywgQ2Fycnk7Ci0gICAgdTMyICBpLCBqOwotICAgIHU4IEN1ckJ5dGU7Ci0KLSAgICBDcmMgPSAweGZmZmZmZmZmOwotCi0gICAgZm9yIChpID0gMDsgaSA8IExlbmd0aDsgaSsrKSB7Ci0KLSAgICAgICAgQ3VyQnl0ZSA9IEJ1ZmZlcltpXTsKLQotICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7Ci0KLSAgICAgICAgICAgIENhcnJ5ICAgICA9ICgoQ3JjICYgMHg4MDAwMDAwMCkgPyAxIDogMCkgXiAoQ3VyQnl0ZSAmIDB4MDEpOwotICAgICAgICAgICAgQ3JjICAgICA8PD0gMTsKLSAgICAgICAgICAgIEN1ckJ5dGUgPj49IDE7Ci0KLSAgICAgICAgICAgIGlmIChDYXJyeSkgewotICAgICAgICAgICAgICAgIENyYyA9KENyYyBeIDB4MDRjMTFkYjYpIHwgQ2Fycnk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gQ3JjOwotfQotCi0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBCaXRSZXZlcnNlIC0tCi0vLyAgIFJldmVyc2UgdGhlIGJpdHMgaW4gdGhlIGlucHV0IGFyZ3VtZW50LCBkd0RhdGEsIHdoaWNoIGlzCi0vLyAgIHJlZ2FyZGVkIGFzIGEgc3RyaW5nIG9mIGJpdHMgd2l0aCB0aGUgbGVuZ3RoLCBEYXRhTGVuZ3RoLgotLy8KLS8vIEFyZ3VtZW50czoKLS8vICAgZHdEYXRhICAgICA6Ci0vLyAgIERhdGFMZW5ndGggOgotLy8KLS8vIFJldHVybjoKLS8vICAgVGhlIGNvbnZlcnRlZCB2YWx1ZS4KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci11MzIgQml0UmV2ZXJzZSggdTMyIGR3RGF0YSwgdTMyIERhdGFMZW5ndGgpCi17Ci0JdTMyICAgSGFsZkxlbmd0aCwgaSwgajsKLQl1MzIgICBCaXRBLCBCaXRCOwotCi0JaWYgKCBEYXRhTGVuZ3RoIDw9IDApICAgICAgIHJldHVybiAwOyAgIC8vIE5vIGNvbnZlcnNpb24gaXMgZG9uZS4KLQlkd0RhdGEgPSBkd0RhdGEgJiAoMHhmZmZmZmZmZiA+PiAoMzIgLSBEYXRhTGVuZ3RoKSk7Ci0KLQlIYWxmTGVuZ3RoID0gRGF0YUxlbmd0aCAvIDI7Ci0JZm9yICggaSA9IDAsIGogPSBEYXRhTGVuZ3RoLTEgOyBpIDwgSGFsZkxlbmd0aDsgaSsrLCBqLS0pCi0JewotCQlCaXRBID0gR2V0Qml0KCBkd0RhdGEsIGkpOwotCQlCaXRCID0gR2V0Qml0KCBkd0RhdGEsIGopOwotCQlpZiAoQml0QSAmJiAhQml0QikgewotCQkJZHdEYXRhID0gQ2xlYXJCaXQoIGR3RGF0YSwgaSk7Ci0JCQlkd0RhdGEgPSBTZXRCaXQoIGR3RGF0YSwgaik7Ci0JCX0gZWxzZSBpZiAoIUJpdEEgJiYgQml0QikgewotCQkJZHdEYXRhID0gU2V0Qml0KCBkd0RhdGEsIGkpOwotCQkJZHdEYXRhID0gQ2xlYXJCaXQoIGR3RGF0YSwgaik7Ci0JCX0gZWxzZQotCQl7Ci0JCQkvLyBEbyBub3RoaW5nIHNpbmNlIHRoZXNlIHR3byBiaXRzIGFyZSBvZiB0aGUgc2F2ZSB2YWx1ZXMuCi0JCX0KLQl9Ci0KLQlyZXR1cm4gZHdEYXRhOwotfQotCi12b2lkIFdiMzVSZWdfcGh5X2NhbGlicmF0aW9uKCAgcGh3X2RhdGFfdCBwSHdEYXRhICkKLXsKLQl1MzIgQkIzYywgQkI1NDsKLQotCWlmICgocEh3RGF0YS0+cGh5X3R5cGUgPT0gUkZfV0JfMjQyKSB8fAotCQkocEh3RGF0YS0+cGh5X3R5cGUgPT0gUkZfV0JfMjQyXzEpKSB7Ci0JCXBoeV9jYWxpYnJhdGlvbl93aW5ib25kICggcEh3RGF0YSwgMjQxMiApOyAvLyBTeW5jIG9wZXJhdGlvbgotCQlXYjM1UmVnX1JlYWRTeW5jKCBwSHdEYXRhLCAweDEwM2MsICZCQjNjICk7Ci0JCVdiMzVSZWdfUmVhZFN5bmMoIHBId0RhdGEsIDB4MTA1NCwgJkJCNTQgKTsKLQotCQlwSHdEYXRhLT5CQjNjX2NhbCA9IEJCM2M7Ci0JCXBId0RhdGEtPkJCNTRfY2FsID0gQkI1NDsKLQotCQlSRlN5bnRoZXNpemVyX2luaXRpYWwocEh3RGF0YSk7Ci0JCUJCUHJvY2Vzc29yX2luaXRpYWwocEh3RGF0YSk7IC8vIEFzeW5jIG9wZXJhdGlvbgotCi0JCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDEwM2MsIEJCM2MgKTsKLQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MTA1NCwgQkI1NCApOwotCX0KLX0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YjM1cmVnX2YuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3diMzVyZWdfZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDA2Y2ZlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3diMzVyZWdfZi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIEludGVyZmFjZSBmdW5jdGlvbiBkZWNsYXJlCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotdW5zaWduZWQgY2hhciBXYjM1UmVnX2luaXRpYWwoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLXZvaWQgVXh4X3Bvd2VyX29uX3Byb2NlZHVyZSggIHBod19kYXRhX3QgcEh3RGF0YSApOwotdm9pZCBVeHhfcG93ZXJfb2ZmX3Byb2NlZHVyZSggIHBod19kYXRhX3QgcEh3RGF0YSApOwotdm9pZCBVeHhfUmVhZEV0aGVybmV0QWRkcmVzcyggIHBod19kYXRhX3QgcEh3RGF0YSApOwotdm9pZCBEeHhfaW5pdGlhbCggIHBod19kYXRhX3QgcEh3RGF0YSApOwotdm9pZCBNeHhfaW5pdGlhbCggIHBod19kYXRhX3QgcEh3RGF0YSApOwotdm9pZCBSRlN5bnRoZXNpemVyX2luaXRpYWwoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLS8vdm9pZCBSRlN5bnRoZXNpemVyX1N3aXRjaGluZ0NoYW5uZWwoICBwaHdfZGF0YV90IHBId0RhdGEsICBzOCBDaGFubmVsICk7Ci12b2lkIFJGU3ludGhlc2l6ZXJfU3dpdGNoaW5nQ2hhbm5lbCggIHBod19kYXRhX3QgcEh3RGF0YSwgIENoYW5JbmZvIENoYW5uZWwgKTsKLXZvaWQgQkJQcm9jZXNzb3JfaW5pdGlhbCggIHBod19kYXRhX3QgcEh3RGF0YSApOwotdm9pZCBCQlByb2Nlc3Nvcl9SYXRlQ2hhbmdpbmcoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCByYXRlICk7IC8vIDIwMDYwNjEzLjEKLS8vdm9pZCBSRl9SYXRlQ2hhbmdpbmcoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCByYXRlICk7IC8vIDIwMDYwNjI2LjUuYyBBZGQKLXU4IFJGU3ludGhlc2l6ZXJfU2V0UG93ZXJJbmRleCggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4IFBvd2VySW5kZXggKTsKLXU4IFJGU3ludGhlc2l6ZXJfU2V0TWF4aW0yODI4XzI0UG93ZXIoICBwaHdfZGF0YV90LCAgdTggaW5kZXggKTsKLXU4IFJGU3ludGhlc2l6ZXJfU2V0TWF4aW0yODI4XzUwUG93ZXIoICBwaHdfZGF0YV90LCAgdTggaW5kZXggKTsKLXU4IFJGU3ludGhlc2l6ZXJfU2V0TWF4aW0yODI3XzI0UG93ZXIoICBwaHdfZGF0YV90LCAgdTggaW5kZXggKTsKLXU4IFJGU3ludGhlc2l6ZXJfU2V0TWF4aW0yODI3XzUwUG93ZXIoICBwaHdfZGF0YV90LCAgdTggaW5kZXggKTsKLXU4IFJGU3ludGhlc2l6ZXJfU2V0TWF4aW0yODI1UG93ZXIoICBwaHdfZGF0YV90LCAgdTggaW5kZXggKTsKLXU4IFJGU3ludGhlc2l6ZXJfU2V0QWlyb2hhMjIzMFBvd2VyKCAgcGh3X2RhdGFfdCwgIHU4IGluZGV4ICk7Ci11OCBSRlN5bnRoZXNpemVyX1NldEFpcm9oYTcyMzBQb3dlciggIHBod19kYXRhX3QsICB1OCBpbmRleCApOwotdTggUkZTeW50aGVzaXplcl9TZXRXaW5ib25kMjQyUG93ZXIoICBwaHdfZGF0YV90LCAgdTggaW5kZXggKTsKLXZvaWQgR2V0VHhWZ2FGcm9tRUVQUk9NKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci12b2lkIEVFUFJPTVR4VmdhQWRqdXN0KCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7IC8vIDIwMDYwNjE5LjUgQWRkCi0KLSNkZWZpbmUgUkZXcml0ZUNvbnRyb2xEYXRhKCBfQSwgX1YgKSBXYjM1UmVnX1dyaXRlKCBfQSwgMHgwODY0LCBfViApCi0KLXZvaWQgV2IzNVJlZ19kZXN0cm95KCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci0KLXVuc2lnbmVkIGNoYXIgV2IzNVJlZ19SZWFkKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IFJlZ2lzdGVyTm8sICAgdTMyICogcFJlZ2lzdGVyVmFsdWUgKTsKLXVuc2lnbmVkIGNoYXIgV2IzNVJlZ19SZWFkU3luYyggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUxNiBSZWdpc3Rlck5vLCAgIHUzMiAqIHBSZWdpc3RlclZhbHVlICk7Ci11bnNpZ25lZCBjaGFyIFdiMzVSZWdfV3JpdGUoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MTYgUmVnaXN0ZXJObywgIHUzMiBSZWdpc3RlclZhbHVlICk7Ci11bnNpZ25lZCBjaGFyIFdiMzVSZWdfV3JpdGVTeW5jKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IFJlZ2lzdGVyTm8sICB1MzIgUmVnaXN0ZXJWYWx1ZSApOwotdW5zaWduZWQgY2hhciBXYjM1UmVnX1dyaXRlV2l0aENhbGxiYWNrVmFsdWUoICBwaHdfZGF0YV90IHBId0RhdGEsCi0JCQkJCQkJCSB1MTYgUmVnaXN0ZXJObywKLQkJCQkJCQkJIHUzMiBSZWdpc3RlclZhbHVlLAotCQkJCQkJCQkgczggKnBWYWx1ZSwKLQkJCQkJCQkJIHM4IExlbik7Ci11bnNpZ25lZCBjaGFyIFdiMzVSZWdfQnVyc3RXcml0ZSggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUxNiBSZWdpc3Rlck5vLCAgdTMyICogcFJlZ2lzdGVyRGF0YSwgIHU4IE51bWJlck9mRGF0YSwgIHU4IEZsYWcgKTsKLQotdm9pZCBXYjM1UmVnX0VQMFZNKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci12b2lkIFdiMzVSZWdfRVAwVk1fc3RhcnQoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLXZvaWQgV2IzNVJlZ19FUDBWTV9jb21wbGV0ZSggIFBVUkIgcFVyYiApOwotCi11MzIgQml0UmV2ZXJzZSggdTMyIGR3RGF0YSwgdTMyIERhdGFMZW5ndGgpOwotCi12b2lkIENhcmRHZXRNdWx0aWNhc3RCaXQoICAgdTggQWRkcmVzc1tNQUNfQUREUl9MRU5HVEhdLCAgdTggKkJ5dGUsICB1OCAqVmFsdWUgKTsKLXUzMiBDYXJkQ29tcHV0ZUNyYyggIHU4ICogQnVmZmVyLCAgdTMyIExlbmd0aCApOwotCi12b2lkIFdiMzVSZWdfcGh5X2NhbGlicmF0aW9uKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci12b2lkIFdiMzVSZWdfVXBkYXRlKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IFJlZ2lzdGVyTm8sICB1MzIgUmVnaXN0ZXJWYWx1ZSApOwotdW5zaWduZWQgY2hhciBhZGp1c3RfVFhWR0FfZm9yX2lxX21hZyggIHBod19kYXRhX3QgcEh3RGF0YSApOwotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3diMzVyZWdfcy5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2IzNXJlZ19zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMzViOTMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2IzNXJlZ19zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8qCi0JCQkJSEFMIHNldHRpbmcgZnVuY3Rpb24KLQotCQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JCXxVeHh8IAl8RHh4fAl8TXh4fAl8QkJ8CXxSRnwKLQkJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCQkJfAkJCQkJfAotCQlXYjM1UmVnX1JlYWQJCVdiMzVSZWdfV3JpdGUKLQotCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQkJV2JVc2JfQ2FsbFVTQkRBU3luYwkJCQkJc3VwcGxpZWQgQnkgV2JVc2IgbW9kdWxlCi0qLwotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotI2RlZmluZSAgICAgR2V0Qml0KCBkd0RhdGEsIGkpICAgICAgKCBkd0RhdGEgJiAoMHgwMDAwMDAwMSA8PCBpKSkKLSNkZWZpbmUgICAgIFNldEJpdCggZHdEYXRhLCBpKSAgICAgICggZHdEYXRhIHwgKDB4MDAwMDAwMDEgPDwgaSkpCi0jZGVmaW5lICAgICBDbGVhckJpdCggZHdEYXRhLCBpKSAgICAoIGR3RGF0YSAmIH4oMHgwMDAwMDAwMSA8PCBpKSkKLQotI2RlZmluZQkJSUdOT1JFX0lOQ1JFTUVOVAkwCi0jZGVmaW5lCQlBVVRPX0lOQ1JFTUVOVAkJMAotI2RlZmluZQkJTk9fSU5DUkVNRU5UCQkxCi0jZGVmaW5lIFJFR19ESVJFQ1RJT04oX3gsX3kpICAgKChfeSktPkRJUkVDVCA9PTAgPyB1c2JfcmN2Y3RybHBpcGUoX3gsMCkgOiB1c2Jfc25kY3RybHBpcGUoX3gsMCkpCi0jZGVmaW5lIFJFR19CVUZfU0laRShfeCkgICAgICAgKChfeCktPmJSZXF1ZXN0PT0gMHgwNCA/IGNwdV90b19sZTE2KChfeCktPndMZW5ndGgpIDogNCkKLQotLy8gMjAwNjA2MTMuMiBBZGQgdGhlIGZvbGxvdyBkZWZpbml0aW9uCi0jZGVmaW5lIEJCNDhfREVGQVVMVF9BTDIyMzBfMTFCCQkweDAwMzM0NDdjCi0jZGVmaW5lIEJCNENfREVGQVVMVF9BTDIyMzBfMTFCCQkweDBBMDBGRUZGCi0jZGVmaW5lIEJCNDhfREVGQVVMVF9BTDIyMzBfMTFHCQkweDAwMzMyQzFCCi0jZGVmaW5lIEJCNENfREVGQVVMVF9BTDIyMzBfMTFHCQkweDBBMDBGRUZGCi0KLQotI2RlZmluZSBCQjQ4X0RFRkFVTFRfV0IyNDJfMTFCCQkweDAwMjkyMzE1CS8vYmFja29mZiAgMmRCCi0jZGVmaW5lIEJCNENfREVGQVVMVF9XQjI0Ml8xMUIJCTB4MDgwMEZFRkYJLy9iYWNrb2ZmICAyZEIKLS8vI2RlZmluZSBCQjQ4X0RFRkFVTFRfV0IyNDJfMTFCCQkweDAwMjAxQjExCS8vYmFja29mZiAgNGRCCi0vLyNkZWZpbmUgQkI0Q19ERUZBVUxUX1dCMjQyXzExQgkJMHgwNjAwRkYwMAkvL2JhY2tvZmYgIDRkQgotI2RlZmluZSBCQjQ4X0RFRkFVTFRfV0IyNDJfMTFHCQkweDAwNDUzQjI0Ci0jZGVmaW5lIEJCNENfREVGQVVMVF9XQjI0Ml8xMUcJCTB4MEUwMEZFRkYKLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIERlZmF1bHQgc2V0dGluZyBmb3IgTXh4Ci0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotI2RlZmluZSBERUZBVUxUX0NXTUlOCQkJCQkzMQkJLy8oTTJDKSBDV21pbi4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAwLTMxLgotI2RlZmluZSBERUZBVUxUX0NXTUFYCQkJCQkxMDIzCS8vKE0yQykgQ1dtYXguIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC0xMDIzLgotI2RlZmluZSBERUZBVUxUX0FJRAkJCQkJCTEJCS8vKE0zNCkgQUlELiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDEtMjAwNy4KLQotI2lmZGVmIF9VU0VfRkFMTEJBQ0tfUkFURV8KLSNkZWZpbmUgREVGQVVMVF9SQVRFX1JFVFJZX0xJTUlUCQkyCQkvLyhNMzgpIGFzIG5hbWVkCi0jZWxzZQotI2RlZmluZSBERUZBVUxUX1JBVEVfUkVUUllfTElNSVQJCTcJCS8vKE0zOCkgYXMgbmFtZWQKLSNlbmRpZgotCi0jZGVmaW5lIERFRkFVTFRfTE9OR19SRVRSWV9MSU1JVAkJNwkJLy8oTTM4KSBMb25nUmV0cnlMaW1pdC4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAwLTE1LgotI2RlZmluZSBERUZBVUxUX1NIT1JUX1JFVFJZX0xJTUlUCQk3CQkvLyhNMzgpIFNob3J0UmV0cnlMaW1pdC4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAwLTE1LgotI2RlZmluZSBERUZBVUxUX1BJRlNUCQkJCQkyNQkJLy8oTTNDKSBQSUZTIFRpbWUuIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC02NTUzNS4KLSNkZWZpbmUgREVGQVVMVF9FSUZTVAkJCQkJMzU0CQkvLyhNM0MpIEVJRlMgVGltZS4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAwLTEwNDg1NzUuCi0jZGVmaW5lIERFRkFVTFRfRElGU1QJCQkJCTQ1CQkvLyhNM0MpIERJRlMgVGltZS4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAwLTY1NTM1LgotI2RlZmluZSBERUZBVUxUX1NJRlNUCQkJCQk1CQkvLyhNM0MpIFNJRlMgVGltZS4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAwLTY1NTM1LgotI2RlZmluZSBERUZBVUxUX09TSUZTVAkJCQkJMTAJCS8vKE0zQykgT3JpZ2luYWwgU0lGUyBUaW1lLiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtMTUuCi0jZGVmaW5lIERFRkFVTFRfQVRJTVdECQkJCQkwCQkvLyhNNDApIEFUSU0gV2luZG93LiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtNjU1MzUuCi0jZGVmaW5lIERFRkFVTFRfU0xPVF9USU1FCQkJCTIwCQkvLyhNNDApICgkKSBTbG90VGltZS4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAwLTI1NS4KLSNkZWZpbmUgREVGQVVMVF9NQVhfVFhfTVNEVV9MSUZFX1RJTUUJNTEyCS8vKE00NCkgTWF4VHhNU0RVTGlmZVRpbWUuIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC00Mjk0OTY3Mjk1LgotI2RlZmluZSBERUZBVUxUX0JFQUNPTl9JTlRFUlZBTAkJCTUwMAkJLy8oTTQ4KSBCZWFjb24gSW50ZXJ2YWwuIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC02NTUzNS4KLSNkZWZpbmUgREVGQVVMVF9QUk9CRV9ERUxBWV9USU1FCQkyMDAJCS8vKE00OCkgUHJvYmUgRGVsYXkgVGltZS4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAwLTY1NTM1LgotI2RlZmluZSBERUZBVUxUX1BST1RPQ09MX1ZFUlNJT04JCTAJCS8vKE00QykKLSNkZWZpbmUgREVGQVVMVF9NQUNfUE9XRVJfU1RBVEUJCQkyCQkvLyhNNEMpIDI6IE1BQyBhdCBwb3dlciBhY3RpdmUKLSNkZWZpbmUgREVGQVVMVF9EVElNX0FMRVJUX1RJTUUJCQkwCi0KLQotdHlwZWRlZiBzdHJ1Y3QgX1JFR19RVUVVRQotewotICAgIHN0cnVjdCAgdXJiICpwVXJiOwotCXZvaWQqCXBVc2JSZXE7Ci0Jdm9pZCoJTmV4dDsKLQl1bmlvbgotCXsKLQkJdTMyCVZBTFVFOwotCQl1MzIgKglwQnVmZmVyOwotCX07Ci0JdTgJUkVTRVJWRURbNF07Ly8gc3BhY2UgcmVzZXJ2ZWQgZm9yIGNvbW11bmljYXRpb24KLQotICAgIHUxNglJTkRFWDsgLy8gRm9yIHN0b3JpbmcgdGhlIHJlZ2lzdGVyIGluZGV4Ci0gICAgdTgJUkVTRVJWRURfVkFMSUQ7CS8vSW5kaWNhdGUgd2hldGhlciB0aGUgUkVTRVJWRUQgc3BhY2UgaXMgdmFsaWQgYXQgdGhpcyBjb21tYW5kLgotCXU4CURJUkVDVDsgLy8gMDpJbiAgIDE6T3V0Ci0KLX0gUkVHX1FVRVVFLCAqUFJFR19RVUVVRTsKLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIEludGVybmFsIHZhcmlhYmxlIGZvciBtb2R1bGUKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jZGVmaW5lIE1BWF9TUTNfRklMVEVSX1NJWkUJCTUKLXR5cGVkZWYgc3RydWN0IF9XQjM1UkVHCi17Ci0JLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JLy8gUmVnaXN0ZXIgQmFuayBiYWNrdXAKLQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQl1MzIJVTFCMDsJCQkvL2JpdDE2IHJlY29yZCB0aGUgaC93IHJhZGlvIG9uL29mZiBzdGF0dXMKLQl1MzIJVTFCQ19MRURDb25maWd1cmU7Ci0JdTMyCUQwMF9EbWFDb250cm9sOwotCXUzMglNMDBfTWFjQ29udHJvbDsKLQl1bmlvbiB7Ci0JCXN0cnVjdCB7Ci0JCQl1MzIJTTA0X011bHRpY2FzdEFkZHJlc3MxOwotCQkJdTMyCU0wOF9NdWx0aWNhc3RBZGRyZXNzMjsKLQkJfTsKLQkJdTgJCU11bHRpY2FzdFs4XTsJLy8gY29udGVudHMgb2YgY2FyZCBtdWx0aWNhc3QgcmVnaXN0ZXJzCi0JfTsKLQotCXUzMglNMjRfTWFjQ29udHJvbDsKLQl1MzIJTTI4X01hY0NvbnRyb2w7Ci0JdTMyCU0yQ19NYWNDb250cm9sOwotCXUzMglNMzhfTWFjQ29udHJvbDsKLQl1MzIJTTNDX01hY0NvbnRyb2w7IC8vIDIwMDYwMjE0IGJhY2t1cCBvbmx5Ci0JdTMyCU00MF9NYWNDb250cm9sOwotCXUzMglNNDRfTWFjQ29udHJvbDsgLy8gMjAwNjAyMTQgYmFja3VwIG9ubHkKLQl1MzIJTTQ4X01hY0NvbnRyb2w7IC8vIDIwMDYwMjE0IGJhY2t1cCBvbmx5Ci0JdTMyCU00Q19NYWNTdGF0dXM7Ci0JdTMyCU02MF9NYWNDb250cm9sOyAvLyAyMDA2MDIxNCBiYWNrdXAgb25seQotCXUzMglNNjhfTWFjQ29udHJvbDsgLy8gMjAwNjAyMTQgYmFja3VwIG9ubHkKLQl1MzIJTTcwX01hY0NvbnRyb2w7IC8vIDIwMDYwMjE0IGJhY2t1cCBvbmx5Ci0JdTMyCU03NF9NYWNDb250cm9sOyAvLyAyMDA2MDIxNCBiYWNrdXAgb25seQotCXUzMglNNzhfRVJQSW5mb3JtYXRpb247Ly85MzAyMDYuMi5iCi0JdTMyCU03Q19NYWNDb250cm9sOyAvLyAyMDA2MDIxNCBiYWNrdXAgb25seQotCXUzMglNODBfTWFjQ29udHJvbDsgLy8gMjAwNjAyMTQgYmFja3VwIG9ubHkKLQl1MzIJTTg0X01hY0NvbnRyb2w7IC8vIDIwMDYwMjE0IGJhY2t1cCBvbmx5Ci0JdTMyCU04OF9NYWNDb250cm9sOyAvLyAyMDA2MDIxNCBiYWNrdXAgb25seQotCXUzMglNOThfTWFjQ29udHJvbDsgLy8gMjAwNjAyMTQgYmFja3VwIG9ubHkKLQotCS8vWzIwMDQwNzIyIFdLXQotCS8vQmFzZWJhbmQgcmVnaXN0ZXIKLQl1MzIJQkIwQzsJLy8gVXNlZCBmb3IgTE5BIGNhbGN1bGF0aW9uCi0JdTMyCUJCMkM7CS8vCi0JdTMyCUJCMzA7CS8vMTFiIGFjcXVpc2l0aW9uIGNvbnRyb2wgcmVnaXN0ZXIKLQl1MzIJQkIzQzsKLQl1MzIJQkI0ODsJLy8gMjAwNTEyMjEuMS5hIDIwMDYwNjEzLjEgRml4IE9CVyBpc3N1ZSBvZiAxMWIvMTFnIHJhdGUKLQl1MzIJQkI0QzsJLy8gMjAwNjA2MTMuMSAgRml4IE9CVyBpc3N1ZSBvZiAxMWIvMTFnIHJhdGUKLQl1MzIJQkI1MDsJLy9tb2RlIGNvbnRyb2wgcmVnaXN0ZXIKLQl1MzIJQkI1NDsKLQl1MzIgCUJCNTg7CS8vSVFfQUxQSEEKLQl1MzIJQkI1QzsJLy8gRm9yIHRlc3QKLQl1MzIJQkI2MDsJLy8gZm9yIFdUTyByZWFkIHZhbHVlCi0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBWTQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLQotCXNwaW5sb2NrX3QJRVAwVk1fc3Bpbl9sb2NrOyAvLyA0QgotCXUzMgkgICAgICAgIEVQMFZNX3N0YXR1czsvLyQkCi0JUFJFR19RVUVVRQkgICAgcFJlZ0ZpcnN0OwotCVBSRUdfUVVFVUUJICAgIHBSZWdMYXN0OwotCU9TX0FUT01JQyAgICAgICBSZWdGaXJlQ291bnQ7Ci0KLQkvLyBIYXJkd2FyZSBzdGF0dXMKLQl1OAlFUDB2bV9zdGF0ZTsKLQl1OAltYWNfcG93ZXJfc2F2ZTsKLQl1OAlFRVBST01QaHlUeXBlOyAvLyAwIH4gMTUgZm9yIE1heGltICgwIMSEViBNQVgyODI1LCAxIMSEViBNQVgyODI3LCAyIMSEViBNQVgyODI4LCAzIMSEViBNQVgyODI5KSwKLQkJCQkJCSAgIC8vIDE2IH4gMzEgZm9yIEFpcm9oYSAoMTYgxIRWIEFMMjIzMCwgMTEgLSBBTDcyMzApCi0JCQkJCQkgICAvLyAzMiB+IFJlc2VydmVkCi0JCQkJCQkgICAvLyAzMyB+IDQ3IEZvciBXQjI0MiAoIDMzIC0gV0IyNDIsIDM0IC0gV0IyNDIgd2l0aCBuZXcgVHh2Z2EgMC41IGRiIHN0ZXApCi0JCQkJCQkgICAvLyA0OCB+IDI1NSBBUkUgUkVTRVJWRUQuCi0JdTgJRUVQUk9NUmVnaW9uOwkvL1JlZ2lvbiBzZXR0aW5nIGluIEVFUFJPTQotCi0JdTMyCVN5bmNJb1BhdXNlOyAvLyBJZiB1c2VyIHVzZSB0aGUgU3luYyBJbyB0byBhY2Nlc3MgSHcsIHRoZW4gcGF1c2UgdGhlIGFzeW5jIGFjY2VzcwotCi0JdTgJTE5BVmFsdWVbNF07IC8vVGFibGUgZm9yIHNwZWVkIHVwIHJ1bm5pbmcKLQl1MzIJU1EzX2ZpbHRlcltNQVhfU1EzX0ZJTFRFUl9TSVpFXTsKLQl1MzIJU1EzX2luZGV4OwotCi19IFdCMzVSRUcsICpQV0IzNVJFRzsKLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YjM1cnguYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3diMzVyeC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGI5ZjVmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3diMzVyeC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzM0ICswLDAgQEAKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gIENvcHlyaWdodCAoYykgMTk5Ni0yMDAyIFdpbmJvbmQgRWxlY3Ryb25pYyBDb3Jwb3JhdGlvbgotLy8KLS8vICBNb2R1bGUgTmFtZToKLS8vICAgIFdiMzVSeC5jCi0vLwotLy8gIEFic3RyYWN0OgotLy8gICAgUHJvY2Vzc2luZyB0aGUgUnggbWVzc2FnZSBmcm9tIGRvd24gbGF5ZXIKLS8vCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSNpbmNsdWRlICJzeXNkZWYuaCIKLQotCi12b2lkIFdiMzVSeF9zdGFydChwaHdfZGF0YV90IHBId0RhdGEpCi17Ci0JUFdCMzVSWCBwV2IzNVJ4ID0gJnBId0RhdGEtPldiMzVSeDsKLQotCS8vIEFsbG93IG9ubHkgb25lIHRocmVhZCB0byBydW4gaW50byB0aGUgV2IzNVJ4KCkgZnVuY3Rpb24KLQlpZiAoT1NfQVRPTUlDX0lOQyhwSHdEYXRhLT5BZGFwdGVyLCAmcFdiMzVSeC0+UnhGaXJlQ291bnRlcikgPT0gMSkgewotCQlwV2IzNVJ4LT5FUDN2bV9zdGF0ZSA9IFZNX1JVTk5JTkc7Ci0JCVdiMzVSeChwSHdEYXRhKTsKLQl9IGVsc2UKLQkJT1NfQVRPTUlDX0RFQyhwSHdEYXRhLT5BZGFwdGVyLCAmcFdiMzVSeC0+UnhGaXJlQ291bnRlcik7Ci19Ci0KLS8vIFRoaXMgZnVuY3Rpb24gY2Fubm90IHJlZW50cmFpbgotdm9pZCBXYjM1UngoICBwaHdfZGF0YV90IHBId0RhdGEgKQotewotCVBXQjM1UlgJcFdiMzVSeCA9ICZwSHdEYXRhLT5XYjM1Ung7Ci0JdTggKglwUnhCdWZmZXJBZGRyZXNzOwotCVBVUkIJcFVyYiA9IChQVVJCKXBXYjM1UngtPlJ4VXJiOwotCWludAlyZXR2OwotCXUzMglSeEJ1ZmZlcklkOwotCi0JLy8KLQkvLyBJc3N1aW5nIFVSQgotCS8vCi0JaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlIHx8IHBId0RhdGEtPkh3U3RvcCkKLQkJZ290byBlcnJvcjsKLQotCWlmIChwV2IzNVJ4LT5yeF9oYWx0KQotCQlnb3RvIGVycm9yOwotCi0JLy8gR2V0IFJ4QnVmZmVyJ3MgSUQKLQlSeEJ1ZmZlcklkID0gcFdiMzVSeC0+UnhCdWZmZXJJZDsKLQlpZiAoIXBXYjM1UngtPlJ4T3duZXJbUnhCdWZmZXJJZF0pIHsKLQkJLy8gSXQncyBpbXBvc3NpYmxlIHRvIHJ1biBoZXJlLgotCQkjaWZkZWYgX1BFX1JYX0RVTVBfCi0JCVdCREVCVUcoKCJSeCBkcml2ZXIgZmlmbyB1bmF2YWlsYWJsZVxuIikpOwotCQkjZW5kaWYKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQkvLyBVcGRhdGUgYnVmZmVyIHBvaW50LCB0aGVuIHN0YXJ0IHRvIGJ1bGtpbiB0aGUgZGF0YSBmcm9tIFVTQgotCXBXYjM1UngtPlJ4QnVmZmVySWQrKzsKLQlwV2IzNVJ4LT5SeEJ1ZmZlcklkICU9IE1BWF9VU0JfUlhfQlVGRkVSX05VTUJFUjsKLQotCXBXYjM1UngtPkN1cnJlbnRSeEJ1ZmZlcklkID0gUnhCdWZmZXJJZDsKLQotCWlmICgxICE9IE9TX01FTU9SWV9BTExPQygodm9pZCogKikmcFdiMzVSeC0+cERSeCwgTUFYX1VTQl9SWF9CVUZGRVIpKSB7Ci0JCXByaW50aygidzM1dW5kOiBSeCBtZW1vcnkgYWxsb2MgZmFpbGVkXG4iKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JcFJ4QnVmZmVyQWRkcmVzcyA9IHBXYjM1UngtPnBEUng7Ci0KLQl1c2JfZmlsbF9idWxrX3VyYihwVXJiLCBwSHdEYXRhLT5XYlVzYi51ZGV2LAotCQkJICB1c2JfcmN2YnVsa3BpcGUocEh3RGF0YS0+V2JVc2IudWRldiwgMyksCi0JCQkgIHBSeEJ1ZmZlckFkZHJlc3MsIE1BWF9VU0JfUlhfQlVGRkVSLAotCQkJICBXYjM1UnhfQ29tcGxldGUsIHBId0RhdGEpOwotCi0JcFdiMzVSeC0+RVAzdm1fc3RhdGUgPSBWTV9SVU5OSU5HOwotCi0JcmV0diA9IHdiX3VzYl9zdWJtaXRfdXJiKHBVcmIpOwotCi0JaWYgKHJldHYgIT0gMCkgewotCQlwcmludGsoIlJ4IFVSQiBzZW5kaW5nIGVycm9yXG4iKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JcmV0dXJuOwotCi1lcnJvcjoKLQkvLyBWTSBzdG9wCi0JcFdiMzVSeC0+RVAzdm1fc3RhdGUgPSBWTV9TVE9QOwotCU9TX0FUT01JQ19ERUMoIHBId0RhdGEtPkFkYXB0ZXIsICZwV2IzNVJ4LT5SeEZpcmVDb3VudGVyICk7Ci19Ci0KLXZvaWQgV2IzNVJ4X0NvbXBsZXRlKFBVUkIgcFVyYikKLXsKLQlwaHdfZGF0YV90CXBId0RhdGEgPSBwVXJiLT5jb250ZXh0OwotCVBXQjM1UlgJCXBXYjM1UnggPSAmcEh3RGF0YS0+V2IzNVJ4OwotCXU4ICoJCXBSeEJ1ZmZlckFkZHJlc3M7Ci0JdTMyCQlTaXplQ2hlY2s7Ci0JdTE2CQlCdWxrTGVuZ3RoOwotCXUzMgkJUnhCdWZmZXJJZDsKLQlSMDBfREVTQ1JJUFRPUiAJUjAwOwotCi0JLy8gVmFyaWFibGUgc2V0dGluZwotCXBXYjM1UngtPkVQM3ZtX3N0YXRlID0gVk1fQ09NUExFVEVEOwotCXBXYjM1UngtPkVQM1ZNX3N0YXR1cyA9IHBVcmItPnN0YXR1czsvL1N0b3JlIHRoZSBsYXN0IHJlc3VsdCBvZiBJcnAKLQotCVJ4QnVmZmVySWQgPSBwV2IzNVJ4LT5DdXJyZW50UnhCdWZmZXJJZDsKLQotCXBSeEJ1ZmZlckFkZHJlc3MgPSBwV2IzNVJ4LT5wRFJ4OwotCUJ1bGtMZW5ndGggPSAodTE2KXBVcmItPmFjdHVhbF9sZW5ndGg7Ci0KLQkvLyBUaGUgSVJQIGlzIGNvbXBsZXRlZAotCXBXYjM1UngtPkVQM3ZtX3N0YXRlID0gVk1fQ09NUExFVEVEOwotCi0JaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlIHx8IHBId0RhdGEtPkh3U3RvcCkgLy8gTXVzdCBiZSBoZXJlLCBvciBSeEJ1ZmZlcklkIGlzIGludmFsaWQKLQkJZ290byBlcnJvcjsKLQotCWlmIChwV2IzNVJ4LT5yeF9oYWx0KQotCQlnb3RvIGVycm9yOwotCi0JLy8gU3RhcnQgdG8gcHJvY2VzcyB0aGUgZGF0YSBvbmx5IGluIHN1Y2Nlc3NmdWwgY29uZGl0aW9uCi0JcFdiMzVSeC0+UnhPd25lclsgUnhCdWZmZXJJZCBdID0gMDsgLy8gU2V0IHRoZSBvd25lciB0byBkcml2ZXIKLQlSMDAudmFsdWUgPSBsZTMyX3RvX2NwdSgqKHUzMiAqKXBSeEJ1ZmZlckFkZHJlc3MpOwotCi0JLy8gVGhlIFVSQiBpcyBjb21wbGV0ZWQsIGNoZWNrIHRoZSByZXN1bHQKLQlpZiAocFdiMzVSeC0+RVAzVk1fc3RhdHVzICE9IDApIHsKLQkJI2lmZGVmIF9QRV9VU0JfU1RBVEVfRFVNUF8KLQkJV0JERUJVRygoIkVQMyBJb0NvbXBsZXRlUm91dGluZSByZXR1cm4gZXJyb3JcbiIpKTsKLQkJRGVidWdVc2JkU3RhdHVzSW5mb3JtYXRpb24oIHBXYjM1UngtPkVQM1ZNX3N0YXR1cyApOwotCQkjZW5kaWYKLQkJcFdiMzVSeC0+RVAzdm1fc3RhdGUgPSBWTV9TVE9QOwotCQlnb3RvIGVycm9yOwotCX0KLQotCS8vIDIwMDYwMjIwIEZvciByZWNvdmVyaW5nLiBjaGVjayBpZiBvcGVyYXRpbmcgaW4gc2luZ2xlIFVTQiBtb2RlCi0JaWYgKCFIQUxfVVNCX01PREVfQlVSU1QocEh3RGF0YSkpIHsKLQkJU2l6ZUNoZWNrID0gUjAwLlIwMF9yZWNlaXZlX2J5dGVfY291bnQ7ICAvLzIwMDYwOTI2IGFuc29uJ3MgZW5kaWFuCi0JCWlmICgoU2l6ZUNoZWNrICYgMHgwMykgPiAwKQotCQkJU2l6ZUNoZWNrIC09IDQ7Ci0JCVNpemVDaGVjayA9IChTaXplQ2hlY2sgKyAzKSAmIH4weDAzOwotCQlTaXplQ2hlY2sgKz0gMTI7IC8vIDggKyA0IGJhZGJlZWYKLQkJaWYgKChCdWxrTGVuZ3RoID4gMTYwMCkgfHwKLQkJCShTaXplQ2hlY2sgPiAxNjAwKSB8fAotCQkJKEJ1bGtMZW5ndGggIT0gU2l6ZUNoZWNrKSB8fAotCQkJKEJ1bGtMZW5ndGggPT0gMCkpIHsgLy8gQWRkIGZvciBmYWlsIFVyYgotCQkJcFdiMzVSeC0+RVAzdm1fc3RhdGUgPSBWTV9TVE9QOwotCQkJcFdiMzVSeC0+RXAzRXJyb3JDb3VudDIrKzsKLQkJfQotCX0KLQotCS8vIEluZGljYXRpbmcgdGhlIHJlY2VpdmluZyBkYXRhCi0JcFdiMzVSeC0+Qnl0ZVJlY2VpdmVkICs9IEJ1bGtMZW5ndGg7Ci0JcFdiMzVSeC0+UnhCdWZmZXJTaXplWyBSeEJ1ZmZlcklkIF0gPSBCdWxrTGVuZ3RoOwotCi0JaWYgKCFwV2IzNVJ4LT5SeE93bmVyWyBSeEJ1ZmZlcklkIF0pCi0JCVdiMzVSeF9pbmRpY2F0ZShwSHdEYXRhKTsKLQotCWtmcmVlKHBXYjM1UngtPnBEUngpOwotCS8vIERvIHRoZSBuZXh0IHJlY2VpdmUKLQlXYjM1UngocEh3RGF0YSk7Ci0JcmV0dXJuOwotCi1lcnJvcjoKLQlwV2IzNVJ4LT5SeE93bmVyWyBSeEJ1ZmZlcklkIF0gPSAxOyAvLyBTZXQgdGhlIG93bmVyIHRvIGhhcmR3YXJlCi0JT1NfQVRPTUlDX0RFQyggcEh3RGF0YS0+QWRhcHRlciwgJnBXYjM1UngtPlJ4RmlyZUNvdW50ZXIgKTsKLQlwV2IzNVJ4LT5FUDN2bV9zdGF0ZSA9IFZNX1NUT1A7Ci19Ci0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotdW5zaWduZWQgY2hhciBXYjM1UnhfaW5pdGlhbChwaHdfZGF0YV90IHBId0RhdGEpCi17Ci0JUFdCMzVSWCBwV2IzNVJ4ID0gJnBId0RhdGEtPldiMzVSeDsKLQotCS8vIEluaXRpYWwgdGhlIEJ1ZmZlciBRdWV1ZQotCVdiMzVSeF9yZXNldF9kZXNjcmlwdG9yKCBwSHdEYXRhICk7Ci0KLQlwV2IzNVJ4LT5SeFVyYiA9IHdiX3VzYl9hbGxvY191cmIoMCk7Ci0JcmV0dXJuICghIXBXYjM1UngtPlJ4VXJiKTsKLX0KLQotdm9pZCBXYjM1Unhfc3RvcChwaHdfZGF0YV90IHBId0RhdGEpCi17Ci0JUFdCMzVSWCBwV2IzNVJ4ID0gJnBId0RhdGEtPldiMzVSeDsKLQotCS8vIENhbmNlbGluZyB0aGUgSXJwIGlmIGFscmVhZHkgc2VuZHMgaXQgb3V0LgotCWlmIChwV2IzNVJ4LT5FUDN2bV9zdGF0ZSA9PSBWTV9SVU5OSU5HKSB7Ci0JCXVzYl91bmxpbmtfdXJiKCBwV2IzNVJ4LT5SeFVyYiApOyAvLyBPbmx5IHVzZSB1bmxpbmssIGxldCBXYjM1UnhfZGVzdHJveSB0byBmcmVlIHRoZW0KLQkJI2lmZGVmIF9QRV9SWF9EVU1QXwotCQlXQkRFQlVHKCgiRVAzIFJ4IHN0b3BcbiIpKTsKLQkJI2VuZGlmCi0JfQotfQotCi0vLyBOZWVkcyBwcm9jZXNzIGNvbnRleHQKLXZvaWQgV2IzNVJ4X2Rlc3Ryb3kocGh3X2RhdGFfdCBwSHdEYXRhKQotewotCVBXQjM1UlggcFdiMzVSeCA9ICZwSHdEYXRhLT5XYjM1Ung7Ci0KLQlkbyB7Ci0JCU9TX1NMRUVQKDEwMDAwKTsgLy8gRGVsYXkgZm9yIHdhaXRpbmcgZnVuY3Rpb24gZW50ZXIgOTQwNjIzLjEuYQotCX0gd2hpbGUgKHBXYjM1UngtPkVQM3ZtX3N0YXRlICE9IFZNX1NUT1ApOwotCU9TX1NMRUVQKDEwMDAwKTsgLy8gRGVsYXkgZm9yIHdhaXRpbmcgZnVuY3Rpb24gZXhpdCA5NDA2MjMuMS5iCi0KLQlpZiAocFdiMzVSeC0+UnhVcmIpCi0JCXVzYl9mcmVlX3VyYiggcFdiMzVSeC0+UnhVcmIgKTsKLQkjaWZkZWYgX1BFX1JYX0RVTVBfCi0JV0JERUJVRygoIldiMzVSeF9kZXN0cm95IE9LXG4iKSk7Ci0JI2VuZGlmCi19Ci0KLXZvaWQgV2IzNVJ4X3Jlc2V0X2Rlc2NyaXB0b3IoICBwaHdfZGF0YV90IHBId0RhdGEgKQotewotCVBXQjM1UlggcFdiMzVSeCA9ICZwSHdEYXRhLT5XYjM1Ung7Ci0JdTMyCWk7Ci0KLQlwV2IzNVJ4LT5CeXRlUmVjZWl2ZWQgPSAwOwotCXBXYjM1UngtPlJ4UHJvY2Vzc0luZGV4ID0gMDsKLQlwV2IzNVJ4LT5SeEJ1ZmZlcklkID0gMDsKLQlwV2IzNVJ4LT5FUDN2bV9zdGF0ZSA9IFZNX1NUT1A7Ci0JcFdiMzVSeC0+cnhfaGFsdCA9IDA7Ci0KLQkvLyBJbml0aWFsIHRoZSBRdWV1ZS4gVGhlIGxhc3QgYnVmZmVyIGlzIHJlc2VydmVkIGZvciB1c2VkIGlmIHRoZSBSeCByZXNvdXJjZSBpcyB1bmF2YWlsYWJsZS4KLQlmb3IoIGk9MDsgaTxNQVhfVVNCX1JYX0JVRkZFUl9OVU1CRVI7IGkrKyApCi0JCXBXYjM1UngtPlJ4T3duZXJbaV0gPSAxOwotfQotCi12b2lkIFdiMzVSeF9hZGp1c3QoUERFU0NSSVBUT1IgcFJ4RGVzKQotewotCXUzMiAqCXBSeEJ1ZmZlckFkZHJlc3M7Ci0JdTMyCURlY3J5cHRpb25NZXRob2Q7Ci0JdTMyCWk7Ci0JdTE2CUJ1ZmZlclNpemU7Ci0KLQlEZWNyeXB0aW9uTWV0aG9kID0gcFJ4RGVzLT5SMDEuUjAxX2RlY3J5cHRpb25fbWV0aG9kOwotCXBSeEJ1ZmZlckFkZHJlc3MgPSBwUnhEZXMtPmJ1ZmZlcl9hZGRyZXNzWzBdOwotCUJ1ZmZlclNpemUgPSBwUnhEZXMtPmJ1ZmZlcl9zaXplWzBdOwotCi0JLy8gQWRqdXN0IHRoZSBsYXN0IHBhcnQgb2YgZGF0YS4gT25seSBkYXRhIGxlZnQKLQlCdWZmZXJTaXplIC09IDQ7IC8vIEZvciBDUkMtMzIKLQlpZiAoRGVjcnlwdGlvbk1ldGhvZCkKLQkJQnVmZmVyU2l6ZSAtPSA0OwotCWlmIChEZWNyeXB0aW9uTWV0aG9kID09IDMpIC8vIEZvciBDQ01QCi0JCUJ1ZmZlclNpemUgLT0gNDsKLQotCS8vIEFkanVzdCB0aGUgSVYgZmllbGQgd2hpY2ggYWZ0ZXIgODAyLjExIGhlYWRlciBhbmQgSUNWIGZpZWxkLgotCWlmIChEZWNyeXB0aW9uTWV0aG9kID09IDEpIC8vIEZvciBXRVAKLQl7Ci0JCWZvciggaT02OyBpPjA7IGktLSApCi0JCQlwUnhCdWZmZXJBZGRyZXNzW2ldID0gcFJ4QnVmZmVyQWRkcmVzc1tpLTFdOwotCQlwUnhEZXMtPmJ1ZmZlcl9hZGRyZXNzWzBdID0gcFJ4QnVmZmVyQWRkcmVzcyArIDE7Ci0JCUJ1ZmZlclNpemUgLT0gNDsgLy8gNCBieXRlIGZvciBJVgotCX0KLQllbHNlIGlmKCBEZWNyeXB0aW9uTWV0aG9kICkgLy8gRm9yIFRLSVAgYW5kIENDTVAKLQl7Ci0JCWZvciAoaT03OyBpPjE7IGktLSkKLQkJCXBSeEJ1ZmZlckFkZHJlc3NbaV0gPSBwUnhCdWZmZXJBZGRyZXNzW2ktMl07Ci0JCXBSeERlcy0+YnVmZmVyX2FkZHJlc3NbMF0gPSBwUnhCdWZmZXJBZGRyZXNzICsgMjsvL1VwZGF0ZSB0aGUgZGVzY3JpcHRvciwgc2hpZnQgOCBieXRlCi0JCUJ1ZmZlclNpemUgLT0gODsgLy8gOCBieXRlIGZvciBJViArIElDVgotCX0KLQlwUnhEZXMtPmJ1ZmZlcl9zaXplWzBdID0gQnVmZmVyU2l6ZTsKLX0KLQotZXh0ZXJuIHZvaWQgcGFja2V0X2NhbWUoY2hhciAqcFJ4QnVmZmVyQWRkcmVzcywgaW50IFBhY2tldFNpemUpOwotCi0KLXUxNiBXYjM1UnhfaW5kaWNhdGUocGh3X2RhdGFfdCBwSHdEYXRhKQotewotCURFU0NSSVBUT1IJUnhEZXM7Ci0JUFdCMzVSWAlwV2IzNVJ4ID0gJnBId0RhdGEtPldiMzVSeDsKLQl1OCAqCQlwUnhCdWZmZXJBZGRyZXNzOwotCXUxNgkJUGFja2V0U2l6ZTsKLQl1MTYJCXN0bXAsIEJ1ZmZlclNpemUsIHN0bXAyID0gMDsKLQl1MzIJCVJ4QnVmZmVySWQ7Ci0KLQkvLyBPbmx5IG9uZSB0aHJlYWQgYmUgYWxsb3dlZCB0byBydW4gaW50byB0aGUgZm9sbG93aW5nCi0JZG8gewotCQlSeEJ1ZmZlcklkID0gcFdiMzVSeC0+UnhQcm9jZXNzSW5kZXg7Ci0JCWlmIChwV2IzNVJ4LT5SeE93bmVyWyBSeEJ1ZmZlcklkIF0pIC8vT3duZXIgYnkgVk0KLQkJCWJyZWFrOwotCi0JCXBXYjM1UngtPlJ4UHJvY2Vzc0luZGV4Kys7Ci0JCXBXYjM1UngtPlJ4UHJvY2Vzc0luZGV4ICU9IE1BWF9VU0JfUlhfQlVGRkVSX05VTUJFUjsKLQotCQlwUnhCdWZmZXJBZGRyZXNzID0gcFdiMzVSeC0+cERSeDsKLQkJQnVmZmVyU2l6ZSA9IHBXYjM1UngtPlJ4QnVmZmVyU2l6ZVsgUnhCdWZmZXJJZCBdOwotCi0JCS8vIFBhcnNlIHRoZSBidWxraW4gYnVmZmVyCi0JCXdoaWxlIChCdWZmZXJTaXplID49IDQpIHsKLQkJCWlmICgoY3B1X3RvX2xlMzIoKih1MzIgKilwUnhCdWZmZXJBZGRyZXNzKSAmIDB4MGZmZmZmZmYpID09IFJYX0VORF9UQUcpIC8vSXMgZW5kaW5nPyA5MjEwMDIuOS5hCi0JCQkJYnJlYWs7Ci0KLQkJCS8vIEdldCB0aGUgUjAwIFIwMSBmaXJzdAotCQkJUnhEZXMuUjAwLnZhbHVlID0gbGUzMl90b19jcHUoKih1MzIgKilwUnhCdWZmZXJBZGRyZXNzKTsKLQkJCVBhY2tldFNpemUgPSAodTE2KVJ4RGVzLlIwMC5SMDBfcmVjZWl2ZV9ieXRlX2NvdW50OwotCQkJUnhEZXMuUjAxLnZhbHVlID0gbGUzMl90b19jcHUoKigodTMyICopKHBSeEJ1ZmZlckFkZHJlc3MrNCkpKTsKLQkJCS8vIEZvciBuZXcgRE1BIDRrCi0JCQlpZiAoKFBhY2tldFNpemUgJiAweDAzKSA+IDApCi0JCQkJUGFja2V0U2l6ZSAtPSA0OwotCi0JCQkvLyBCYXNpYyBjaGVjayBmb3IgUnggbGVuZ3RoLiBJcyBsZW5ndGggdmFsaWQ/Ci0JCQlpZiAoUGFja2V0U2l6ZSA+IE1BWF9QQUNLRVRfU0laRSkgewotCQkJCSNpZmRlZiBfUEVfUlhfRFVNUF8KLQkJCQlXQkRFQlVHKCgiU2VyaW91cyBFUlJPUiA6IFJ4IGRhdGEgc2l6ZSB0b28gbG9uZywgc2l6ZSA9JWRcbiIsIFBhY2tldFNpemUpKTsKLQkJCQkjZW5kaWYKLQotCQkJCXBXYjM1UngtPkVQM3ZtX3N0YXRlID0gVk1fU1RPUDsKLQkJCQlwV2IzNVJ4LT5FcDNFcnJvckNvdW50MisrOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvLyBTdGFydCB0byBwcm9jZXNzIFJ4IGJ1ZmZlcgotLy8JCQlSeERlcy5EZXNjcmlwdG9yX0lEID0gUnhCdWZmZXJJZDsgLy8gRHVlIHRvIHN5bmNocm9ub3VzIGluZGljYXRlLCB0aGUgZmllbGQgZG9lc24ndCBuZWNlc3NhcnkgdG8gdXNlLgotCQkJQnVmZmVyU2l6ZSAtPSA4OyAvL3N1YnRyYWN0IDggYnl0ZSBmb3IgMzUncyBVU0IgaGVhZGVyIGxlbmd0aAotCQkJcFJ4QnVmZmVyQWRkcmVzcyArPSA4OwotCi0JCQlSeERlcy5idWZmZXJfYWRkcmVzc1swXSA9IHBSeEJ1ZmZlckFkZHJlc3M7Ci0JCQlSeERlcy5idWZmZXJfc2l6ZVswXSA9IFBhY2tldFNpemU7Ci0JCQlSeERlcy5idWZmZXJfbnVtYmVyID0gMTsKLQkJCVJ4RGVzLmJ1ZmZlcl9zdGFydF9pbmRleCA9IDA7Ci0JCQlSeERlcy5idWZmZXJfdG90YWxfc2l6ZSA9IFJ4RGVzLmJ1ZmZlcl9zaXplWzBdOwotCQkJV2IzNVJ4X2FkanVzdCgmUnhEZXMpOwotCi0JCQlwYWNrZXRfY2FtZShwUnhCdWZmZXJBZGRyZXNzLCBQYWNrZXRTaXplKTsKLQotCQkJLy8gTW92ZSBSeEJ1ZmZlciBwb2ludCB0byB0aGUgbmV4dAotCQkJc3RtcCA9IFBhY2tldFNpemUgKyAzOwotCQkJc3RtcCAmPSB+MHgwMzsgLy8gNG4gYWxpZ25tZW50Ci0JCQlwUnhCdWZmZXJBZGRyZXNzICs9IHN0bXA7Ci0JCQlCdWZmZXJTaXplIC09IHN0bXA7Ci0JCQlzdG1wMiArPSBzdG1wOwotCQl9Ci0KLQkJLy8gUmVjbGFpbSByZXNvdXJjZQotCQlwV2IzNVJ4LT5SeE93bmVyWyBSeEJ1ZmZlcklkIF0gPSAxOwotCX0gd2hpbGUoVFJVRSk7Ci0KLQlyZXR1cm4gc3RtcDI7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2IzNXJ4X2YuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3diMzVyeF9mLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYTNlNzMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2IzNXJ4X2YuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBJbnRlcmZhY2UgZnVuY3Rpb24gZGVjbGFyZQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXZvaWQJCVdiMzVSeF9yZXNldF9kZXNjcmlwdG9yKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci11bnNpZ25lZCBjaGFyCQlXYjM1UnhfaW5pdGlhbCggIHBod19kYXRhX3QgcEh3RGF0YSApOwotdm9pZAkJV2IzNVJ4X2Rlc3Ryb3koICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLXZvaWQJCVdiMzVSeF9zdG9wKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci11MTYJCVdiMzVSeF9pbmRpY2F0ZSggIHBod19kYXRhX3QgcEh3RGF0YSApOwotdm9pZAkJV2IzNVJ4X2FkanVzdCggIFBERVNDUklQVE9SIHBSeERlcyApOwotdm9pZAkJV2IzNVJ4X3N0YXJ0KCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci0KLXZvaWQJCVdiMzVSeCggIHBod19kYXRhX3QgcEh3RGF0YSApOwotdm9pZAkJV2IzNVJ4X0NvbXBsZXRlKCAgUFVSQiBwVXJiICk7Ci0KLQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3diMzVyeF9zLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YjM1cnhfcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTBjMjY5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3diMzVyeF9zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIHdiMzVyeC5oIC0tCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotLy8gRGVmaW5pdGlvbiBmb3IgdGhpcyBtb2R1bGUgdXNlZAotI2RlZmluZSBNQVhfVVNCX1JYX0JVRkZFUgk0MDk2CS8vIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgNDA5NiA5MzExMzAuNC5mCi0KLSNkZWZpbmUgTUFYX1VTQl9SWF9CVUZGRVJfTlVNQkVSCUVUSEVSTkVUX1JYX0RFU0NSSVBUT1JTCQkvLyBNYXhpbXVtIDI1NCwgMjU1IGlzIFJFU0VSVkVEIElECi0jZGVmaW5lIFJYX0lOVEVSRkFDRQkJCQkwCS8vIEludGVyZmFjZSAxCi0jZGVmaW5lIFJYX1BJUEUJCQkJCQkyCS8vIFBpcGUgMwotI2RlZmluZSBNQVhfUEFDS0VUX1NJWkUJCQkJMTYwMCAvLzE1NjgJLy8gOCArIDE1MzIgKyA0ICsgMjQoSVYgRUlWIE1JQyBJQ1YgQ1JDKSBmb3IgY2hlY2sgRE1BIGRhdGEgOTMxMTMwLjQuZwotI2RlZmluZSBSWF9FTkRfVEFHCQkJCQkweDBiYWRiZWVmCi0KLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIEludGVybmFsIHZhcmlhYmxlIGZvciBtb2R1bGUKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci10eXBlZGVmIHN0cnVjdCBfV0IzNVJYCi17Ci0JdTMyCQkJQnl0ZVJlY2VpdmVkOy8vIEZvciBjYWxjdWxhdGluZyB0aHJvdWdocHV0IG9mIEJ1bGtJbgotCU9TX0FUT01JQwkJUnhGaXJlQ291bnRlcjsvLyBEb2VzIFdiMzVSeCBtb2R1bGUgZmlyZT8KLQotCXU4CVJ4QnVmZmVyWyBNQVhfVVNCX1JYX0JVRkZFUl9OVU1CRVIgXVsgKChNQVhfVVNCX1JYX0JVRkZFUiszKSAmIH4weDAzICkgXTsKLQl1MTYJUnhCdWZmZXJTaXplWyAoKE1BWF9VU0JfUlhfQlVGRkVSX05VTUJFUisxKSAmIH4weDAxKSBdOwotCXU4CVJ4T3duZXJbICgoTUFYX1VTQl9SWF9CVUZGRVJfTlVNQkVSKzMpICYgfjB4MDMgKSBdOy8vT3duZXJzaGlwIG9mIGJ1ZmZlciAgMDogU1cgMTpIVwotCi0JdTMyCVJ4UHJvY2Vzc0luZGV4Oy8vVGhlIG5leHQgaW5kZXggdG8gcHJvY2VzcwotCXUzMglSeEJ1ZmZlcklkOwotCXUzMglFUDN2bV9zdGF0ZTsKLQotCXUzMglyeF9oYWx0OyAvLyBGb3IgVk0gc3RvcHBpbmcKLQotCXUxNglNb3JlRGF0YVNpemU7Ci0JdTE2CVBhY2tldFNpemU7Ci0KLQl1MzIJQ3VycmVudFJ4QnVmZmVySWQ7IC8vIEZvciBjb21wbGV0ZSByb3V0aW5lIHVzYWdlCi0JdTMyCVJ4M1VyYkNhbmNlbDsKLQotCXUzMglMYXN0UjE7IC8vIEZvciBSU1NJIHJlcG9ydGluZwotCXN0cnVjdCB1cmIgKgkJCQlSeFVyYjsKLQl1MzIJCUVwM0Vycm9yQ291bnQyOyAvLyAyMDA2MDYyNS4xIFVzYmQgZm9yIFJ4IERNQSBlcnJvciBjb3VudAotCi0JaW50CQlFUDNWTV9zdGF0dXM7Ci0JdTggKglwRFJ4OwotCi19IFdCMzVSWCwgKlBXQjM1Ulg7Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2IzNXR4LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YjM1dHguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE5ZDUxMi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YjM1dHguYworKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vICBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwMiBXaW5ib25kIEVsZWN0cm9uaWMgQ29ycG9yYXRpb24KLS8vCi0vLyAgTW9kdWxlIE5hbWU6Ci0vLyAgICBXYjM1VHguYwotLy8KLS8vICBBYnN0cmFjdDoKLS8vICAgIFByb2Nlc3NpbmcgdGhlIFR4IG1lc3NhZ2UgYW5kIHB1dCBpbnRvIGRvd24gbGF5ZXIKLS8vCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSNpbmNsdWRlICJzeXNkZWYuaCIKLQotCi11bnNpZ25lZCBjaGFyCi1XYjM1VHhfZ2V0X3R4X2J1ZmZlcihwaHdfZGF0YV90IHBId0RhdGEsIHU4ICoqcEJ1ZmZlcikKLXsKLQlQV0IzNVRYIHBXYjM1VHggPSAmcEh3RGF0YS0+V2IzNVR4OwotCi0JKnBCdWZmZXIgPSBwV2IzNVR4LT5UeEJ1ZmZlclswXTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotdm9pZCBXYjM1VHhfc3RhcnQocGh3X2RhdGFfdCBwSHdEYXRhKQotewotCVBXQjM1VFggcFdiMzVUeCA9ICZwSHdEYXRhLT5XYjM1VHg7Ci0KLQkvLyBBbGxvdyBvbmx5IG9uZSB0aHJlYWQgdG8gcnVuIGludG8gZnVuY3Rpb24KLQlpZiAoT1NfQVRPTUlDX0lOQyhwSHdEYXRhLT5BZGFwdGVyLCAmcFdiMzVUeC0+VHhGaXJlQ291bnRlcikgPT0gMSkgewotCQlwV2IzNVR4LT5FUDR2bV9zdGF0ZSA9IFZNX1JVTk5JTkc7Ci0JCVdiMzVUeChwSHdEYXRhKTsKLQl9IGVsc2UKLQkJT1NfQVRPTUlDX0RFQyggcEh3RGF0YS0+QWRhcHRlciwgJnBXYjM1VHgtPlR4RmlyZUNvdW50ZXIgKTsKLX0KLQotCi12b2lkIFdiMzVUeChwaHdfZGF0YV90IHBId0RhdGEpCi17Ci0JUFdCMzVUWAkJcFdiMzVUeCA9ICZwSHdEYXRhLT5XYjM1VHg7Ci0JUEFEQVBURVIJQWRhcHRlciA9IHBId0RhdGEtPkFkYXB0ZXI7Ci0JdTgJCSpwVHhCdWZmZXJBZGRyZXNzOwotCVBNRFMJCXBNZHMgPSAmQWRhcHRlci0+TWRzOwotCXN0cnVjdCB1cmIgKglwVXJiID0gKHN0cnVjdCB1cmIgKilwV2IzNVR4LT5UeDRVcmI7Ci0JaW50ICAgICAgICAgCXJldHY7Ci0JdTMyCQlTZW5kSW5kZXg7Ci0KLQotCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSB8fCBwSHdEYXRhLT5Id1N0b3ApCi0JCWdvdG8gY2xlYW51cDsKLQotCWlmIChwV2IzNVR4LT50eF9oYWx0KQotCQlnb3RvIGNsZWFudXA7Ci0KLQkvLyBPd25lcnNoaXAgY2hlY2tpbmcKLQlTZW5kSW5kZXggPSBwV2IzNVR4LT5UeFNlbmRJbmRleDsKLQlpZiAoIXBNZHMtPlR4T3duZXJbU2VuZEluZGV4XSkgLy9ObyBtb3JlIGRhdGEgbmVlZCB0byBiZSBzZW50LCByZXR1cm4gaW1tZWRpYXRlbHkKLQkJZ290byBjbGVhbnVwOwotCi0JcFR4QnVmZmVyQWRkcmVzcyA9IHBXYjM1VHgtPlR4QnVmZmVyW1NlbmRJbmRleF07Ci0JLy8KLQkvLyBJc3N1aW5nIFVSQgotCS8vCi0JdXNiX2ZpbGxfYnVsa191cmIocFVyYiwgcEh3RGF0YS0+V2JVc2IudWRldiwKLQkJCSAgdXNiX3NuZGJ1bGtwaXBlKHBId0RhdGEtPldiVXNiLnVkZXYsIDQpLAotCQkJICBwVHhCdWZmZXJBZGRyZXNzLCBwTWRzLT5UeEJ1ZmZlclNpemVbIFNlbmRJbmRleCBdLAotCQkJICBXYjM1VHhfY29tcGxldGUsIHBId0RhdGEpOwotCi0JcFdiMzVUeC0+RVA0dm1fc3RhdGUgPSBWTV9SVU5OSU5HOwotCXJldHYgPSB3Yl91c2Jfc3VibWl0X3VyYiggcFVyYiApOwotCWlmIChyZXR2PDApIHsKLQkJcHJpbnRrKCJFUDQgVHggSXJwIHNlbmRpbmcgZXJyb3JcbiIpOwotCQlnb3RvIGNsZWFudXA7Ci0JfQotCi0JLy8gQ2hlY2sgaWYgZHJpdmVyIG5lZWRzIGlzc3VlIElycCBmb3IgRVAyCi0JcFdiMzVUeC0+VHhGaWxsQ291bnQgKz0gcE1kcy0+VHhDb3VudEluQnVmZmVyW1NlbmRJbmRleF07Ci0JaWYgKHBXYjM1VHgtPlR4RmlsbENvdW50ID4gMTIpCi0JCVdiMzVUeF9FUDJWTV9zdGFydCggcEh3RGF0YSApOwotCi0JcFdiMzVUeC0+Qnl0ZVRyYW5zZmVyICs9IHBNZHMtPlR4QnVmZmVyU2l6ZVtTZW5kSW5kZXhdOwotCXJldHVybjsKLQotIGNsZWFudXA6Ci0JcFdiMzVUeC0+RVA0dm1fc3RhdGUgPSBWTV9TVE9QOwotCU9TX0FUT01JQ19ERUMoIHBId0RhdGEtPkFkYXB0ZXIsICZwV2IzNVR4LT5UeEZpcmVDb3VudGVyICk7Ci19Ci0KLQotdm9pZCBXYjM1VHhfY29tcGxldGUoc3RydWN0IHVyYiAqIHBVcmIpCi17Ci0JcGh3X2RhdGFfdAlwSHdEYXRhID0gcFVyYi0+Y29udGV4dDsKLQlQQURBUFRFUglBZGFwdGVyID0gKFBBREFQVEVSKXBId0RhdGEtPkFkYXB0ZXI7Ci0JUFdCMzVUWAkJcFdiMzVUeCA9ICZwSHdEYXRhLT5XYjM1VHg7Ci0JUE1EUwkJcE1kcyA9ICZBZGFwdGVyLT5NZHM7Ci0KLQlwcmludGsoIndiMzU6IHR4IGNvbXBsZXRlXG4iKTsKLQkvLyBWYXJpYWJsZSBzZXR0aW5nCi0JcFdiMzVUeC0+RVA0dm1fc3RhdGUgPSBWTV9DT01QTEVURUQ7Ci0JcFdiMzVUeC0+RVA0Vk1fc3RhdHVzID0gcFVyYi0+c3RhdHVzOyAvL1N0b3JlIHRoZSBsYXN0IHJlc3VsdCBvZiBJcnAKLQlwTWRzLT5UeE93bmVyWyBwV2IzNVR4LT5UeFNlbmRJbmRleCBdID0gMDsvLyBTZXQgdGhlIG93bmVyLiBGcmVlIHRoZSBvd25lciBiaXQgYWx3YXlzLgotCXBXYjM1VHgtPlR4U2VuZEluZGV4Kys7Ci0JcFdiMzVUeC0+VHhTZW5kSW5kZXggJT0gTUFYX1VTQl9UWF9CVUZGRVJfTlVNQkVSOwotCi0JaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlIHx8IHBId0RhdGEtPkh3U3RvcCkgLy8gTGV0IFdiV2xhbkhhbHQgdG8gaGFuZGxlIHN1cnByaXNlIHJlbW92ZQotCQlnb3RvIGVycm9yOwotCi0JaWYgKHBXYjM1VHgtPnR4X2hhbHQpCi0JCWdvdG8gZXJyb3I7Ci0KLQkvLyBUaGUgVVJCIGlzIGNvbXBsZXRlZCwgY2hlY2sgdGhlIHJlc3VsdAotCWlmIChwV2IzNVR4LT5FUDRWTV9zdGF0dXMgIT0gMCkgewotCQlwcmludGsoIlVSQiBzdWJtaXNzaW9uIGZhaWxlZFxuIik7Ci0JCXBXYjM1VHgtPkVQNHZtX3N0YXRlID0gVk1fU1RPUDsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQlNZHNfVHgoQWRhcHRlcik7Ci0JV2IzNVR4KHBId0RhdGEpOwotCXJldHVybjsKLQotZXJyb3I6Ci0JT1NfQVRPTUlDX0RFQyggcEh3RGF0YS0+QWRhcHRlciwgJnBXYjM1VHgtPlR4RmlyZUNvdW50ZXIgKTsKLQlwV2IzNVR4LT5FUDR2bV9zdGF0ZSA9IFZNX1NUT1A7Ci19Ci0KLXZvaWQgV2IzNVR4X3Jlc2V0X2Rlc2NyaXB0b3IoICBwaHdfZGF0YV90IHBId0RhdGEgKQotewotCVBXQjM1VFggcFdiMzVUeCA9ICZwSHdEYXRhLT5XYjM1VHg7Ci0KLQlwV2IzNVR4LT5UeFNlbmRJbmRleCA9IDA7Ci0JcFdiMzVUeC0+dHhfaGFsdCA9IDA7Ci19Ci0KLXVuc2lnbmVkIGNoYXIgV2IzNVR4X2luaXRpYWwocGh3X2RhdGFfdCBwSHdEYXRhKQotewotCVBXQjM1VFggcFdiMzVUeCA9ICZwSHdEYXRhLT5XYjM1VHg7Ci0KLQlwV2IzNVR4LT5UeDRVcmIgPSB3Yl91c2JfYWxsb2NfdXJiKDApOwotCWlmICghcFdiMzVUeC0+VHg0VXJiKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQlwV2IzNVR4LT5UeDJVcmIgPSB3Yl91c2JfYWxsb2NfdXJiKDApOwotCWlmICghcFdiMzVUeC0+VHgyVXJiKQotCXsKLQkJdXNiX2ZyZWVfdXJiKCBwV2IzNVR4LT5UeDRVcmIgKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCXJldHVybiBUUlVFOwotfQotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotdm9pZCBXYjM1VHhfc3RvcChwaHdfZGF0YV90IHBId0RhdGEpCi17Ci0JUFdCMzVUWCBwV2IzNVR4ID0gJnBId0RhdGEtPldiMzVUeDsKLQotCS8vIFRyeWluZyB0byBjYW5jZWxpbmcgdGhlIFRycCBvZiBFUDIKLQlpZiAocFdiMzVUeC0+RVAydm1fc3RhdGUgPT0gVk1fUlVOTklORykKLQkJdXNiX3VubGlua191cmIoIHBXYjM1VHgtPlR4MlVyYiApOyAvLyBPbmx5IHVzZSB1bmxpbmssIGxldCBXYjM1VHhfZGVzdHJvdCB0byBmcmVlIHRoZW0KLQkjaWZkZWYgX1BFX1RYX0RVTVBfCi0JV0JERUJVRygoIkVQMiBUeCBzdG9wXG4iKSk7Ci0JI2VuZGlmCi0KLQkvLyBUcnlpbmcgdG8gY2FuY2VsaW5nIHRoZSBJcnAgb2YgRVA0Ci0JaWYgKHBXYjM1VHgtPkVQNHZtX3N0YXRlID09IFZNX1JVTk5JTkcpCi0JCXVzYl91bmxpbmtfdXJiKCBwV2IzNVR4LT5UeDRVcmIgKTsgLy8gT25seSB1c2UgdW5saW5rLCBsZXQgV2IzNVR4X2Rlc3Ryb3QgdG8gZnJlZSB0aGVtCi0JI2lmZGVmIF9QRV9UWF9EVU1QXwotCVdCREVCVUcoKCJFUDQgVHggc3RvcFxuIikpOwotCSNlbmRpZgotfQotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotdm9pZCBXYjM1VHhfZGVzdHJveShwaHdfZGF0YV90IHBId0RhdGEpCi17Ci0JUFdCMzVUWCBwV2IzNVR4ID0gJnBId0RhdGEtPldiMzVUeDsKLQotCS8vIFdhaXQgZm9yIFZNIHN0b3AKLQlkbyB7Ci0JCU9TX1NMRUVQKDEwMDAwKTsgIC8vIERlbGF5IGZvciB3YWl0aW5nIGZ1bmN0aW9uIGVudGVyIDk0MDYyMy4xLmEKLQl9IHdoaWxlKCAocFdiMzVUeC0+RVAydm1fc3RhdGUgIT0gVk1fU1RPUCkgJiYgKHBXYjM1VHgtPkVQNHZtX3N0YXRlICE9IFZNX1NUT1ApICk7Ci0JT1NfU0xFRVAoMTAwMDApOyAgLy8gRGVsYXkgZm9yIHdhaXRpbmcgZnVuY3Rpb24gZW50ZXIgOTQwNjIzLjEuYgotCi0JaWYgKHBXYjM1VHgtPlR4NFVyYikKLQkJdXNiX2ZyZWVfdXJiKCBwV2IzNVR4LT5UeDRVcmIgKTsKLQotCWlmIChwV2IzNVR4LT5UeDJVcmIpCi0JCXVzYl9mcmVlX3VyYiggcFdiMzVUeC0+VHgyVXJiICk7Ci0KLQkjaWZkZWYgX1BFX1RYX0RVTVBfCi0JV0JERUJVRygoIldiMzVUeF9kZXN0cm95IE9LXG4iKSk7Ci0JI2VuZGlmCi19Ci0KLXZvaWQgV2IzNVR4X0N1cnJlbnRUaW1lKHBod19kYXRhX3QgcEh3RGF0YSwgdTMyIFRpbWVDb3VudCkKLXsKLQlQV0IzNVRYIHBXYjM1VHggPSAmcEh3RGF0YS0+V2IzNVR4OwotCXVuc2lnbmVkIGNoYXIgVHJpZ2dlciA9IEZBTFNFOwotCi0JaWYgKHBXYjM1VHgtPlR4VGltZXIgPiBUaW1lQ291bnQpCi0JCVRyaWdnZXIgPSBUUlVFOwotCWVsc2UgaWYgKFRpbWVDb3VudCA+IChwV2IzNVR4LT5UeFRpbWVyKzUwMCkpCi0JCVRyaWdnZXIgPSBUUlVFOwotCi0JaWYgKFRyaWdnZXIpIHsKLQkJcFdiMzVUeC0+VHhUaW1lciA9IFRpbWVDb3VudDsKLQkJV2IzNVR4X0VQMlZNX3N0YXJ0KCBwSHdEYXRhICk7Ci0JfQotfQotCi12b2lkIFdiMzVUeF9FUDJWTV9zdGFydChwaHdfZGF0YV90IHBId0RhdGEpCi17Ci0JUFdCMzVUWCBwV2IzNVR4ID0gJnBId0RhdGEtPldiMzVUeDsKLQotCS8vIEFsbG93IG9ubHkgb25lIHRocmVhZCB0byBydW4gaW50byBmdW5jdGlvbgotCWlmIChPU19BVE9NSUNfSU5DKCBwSHdEYXRhLT5BZGFwdGVyLCAmcFdiMzVUeC0+VHhSZXN1bHRDb3VudCApID09IDEpIHsKLQkJcFdiMzVUeC0+RVAydm1fc3RhdGUgPSBWTV9SVU5OSU5HOwotCQlXYjM1VHhfRVAyVk0oIHBId0RhdGEgKTsKLQl9Ci0JZWxzZQotCQlPU19BVE9NSUNfREVDKCBwSHdEYXRhLT5BZGFwdGVyLCAmcFdiMzVUeC0+VHhSZXN1bHRDb3VudCApOwotfQotCi0KLXZvaWQgV2IzNVR4X0VQMlZNKHBod19kYXRhX3QgcEh3RGF0YSkKLXsKLQlQV0IzNVRYIHBXYjM1VHggPSAmcEh3RGF0YS0+V2IzNVR4OwotCXN0cnVjdCB1cmIgKglwVXJiID0gKHN0cnVjdCB1cmIgKilwV2IzNVR4LT5UeDJVcmI7Ci0JdTMyICoJcGx0bXAgPSAodTMyICopcFdiMzVUeC0+RVAyX2J1ZjsKLQlpbnQJCXJldHY7Ci0KLQlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgfHwgcEh3RGF0YS0+SHdTdG9wKQotCQlnb3RvIGVycm9yOwotCi0JaWYgKHBXYjM1VHgtPnR4X2hhbHQpCi0JCWdvdG8gZXJyb3I7Ci0KLQkvLwotCS8vIElzc3VpbmcgVVJCCi0JLy8KLQl1c2JfZmlsbF9pbnRfdXJiKCBwVXJiLCBwSHdEYXRhLT5XYlVzYi51ZGV2LCB1c2JfcmN2aW50cGlwZShwSHdEYXRhLT5XYlVzYi51ZGV2LDIpLAotCQkJICBwbHRtcCwgTUFYX0lOVEVSUlVQVF9MRU5HVEgsIFdiMzVUeF9FUDJWTV9jb21wbGV0ZSwgcEh3RGF0YSwgMzIpOwotCi0JcFdiMzVUeC0+RVAydm1fc3RhdGUgPSBWTV9SVU5OSU5HOwotCXJldHYgPSB3Yl91c2Jfc3VibWl0X3VyYiggcFVyYiApOwotCi0JaWYgKHJldHYgPCAwKSB7Ci0JCSNpZmRlZiBfUEVfVFhfRFVNUF8KLQkJV0JERUJVRygoIkVQMiBUeCBJcnAgc2VuZGluZyBlcnJvclxuIikpOwotCQkjZW5kaWYKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQlyZXR1cm47Ci1lcnJvcjoKLQlwV2IzNVR4LT5FUDJ2bV9zdGF0ZSA9IFZNX1NUT1A7Ci0JT1NfQVRPTUlDX0RFQyggcEh3RGF0YS0+QWRhcHRlciwgJnBXYjM1VHgtPlR4UmVzdWx0Q291bnQgKTsKLX0KLQotCi12b2lkIFdiMzVUeF9FUDJWTV9jb21wbGV0ZShzdHJ1Y3QgdXJiICogcFVyYikKLXsKLQlwaHdfZGF0YV90CXBId0RhdGEgPSBwVXJiLT5jb250ZXh0OwotCVQwMl9ERVNDUklQVE9SCVQwMiwgVFNUQVRVUzsKLQlQQURBUFRFUglBZGFwdGVyID0gKFBBREFQVEVSKXBId0RhdGEtPkFkYXB0ZXI7Ci0JUFdCMzVUWAkJcFdiMzVUeCA9ICZwSHdEYXRhLT5XYjM1VHg7Ci0JdTMyICoJCXBsdG1wID0gKHUzMiAqKXBXYjM1VHgtPkVQMl9idWY7Ci0JdTMyCQlpOwotCXUxNgkJSW50ZXJydXB0SW5MZW5ndGg7Ci0KLQotCS8vIFZhcmlhYmxlIHNldHRpbmcKLQlwV2IzNVR4LT5FUDJ2bV9zdGF0ZSA9IFZNX0NPTVBMRVRFRDsKLQlwV2IzNVR4LT5FUDJWTV9zdGF0dXMgPSBwVXJiLT5zdGF0dXM7Ci0KLQkvLyBGb3IgTGludXggMi40LiBJbnRlcnJ1cHQgd2lsbCBhbHdheXMgdHJpZ2dlcgotCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSB8fCBwSHdEYXRhLT5Id1N0b3ApIC8vIExldCBXYldsYW5IYWx0IHRvIGhhbmRsZSBzdXJwcmlzZSByZW1vdmUKLQkJZ290byBlcnJvcjsKLQotCWlmIChwV2IzNVR4LT50eF9oYWx0KQotCQlnb3RvIGVycm9yOwotCi0JLy9UaGUgVXJiIGlzIGNvbXBsZXRlZCwgY2hlY2sgdGhlIHJlc3VsdAotCWlmIChwV2IzNVR4LT5FUDJWTV9zdGF0dXMgIT0gMCkgewotCQlXQkRFQlVHKCgiRVAyIElvQ29tcGxldGVSb3V0aW5lIHJldHVybiBlcnJvclxuIikpOwotCQlwV2IzNVR4LT5FUDJ2bV9zdGF0ZT0gVk1fU1RPUDsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQkvLyBVcGRhdGUgdGhlIFR4IHJlc3VsdAotCUludGVycnVwdEluTGVuZ3RoID0gcFVyYi0+YWN0dWFsX2xlbmd0aDsKLQkvLyBNb2RpZnkgZm9yIG1pbmltdW0gbWVtb3J5IGFjY2VzcyBhbmQgRFdPUkQgYWxpZ25tZW50LgotCVQwMi52YWx1ZSA9IGNwdV90b19sZTMyKHBsdG1wWzBdKSA+PiA4OyAvLyBbMzE6OF0gLT4gWzI0OjBdCi0JSW50ZXJydXB0SW5MZW5ndGggLT0gMTsvLyAyMDA1MTIyMS4xLmMgTW9kaWZ5IHRoZSBmb2xsb3cgZm9yIG1vcmUgc3RhYmxlCi0JSW50ZXJydXB0SW5MZW5ndGggPj49IDI7IC8vIEludGVycnVwdEluTGVuZ3RoLzQKLQlmb3IgKGkgPSAxOyBpIDw9IEludGVycnVwdEluTGVuZ3RoOyBpKyspIHsKLQkJVDAyLnZhbHVlIHw9ICgoY3B1X3RvX2xlMzIocGx0bXBbaV0pICYgMHhmZikgPDwgMjQpOwotCi0JCVRTVEFUVVMudmFsdWUgPSBUMDIudmFsdWU7ICAvLzIwMDYxMDA5IGFuc29uJ3MgZW5kaWFuCi0JCU1kc19TZW5kQ29tcGxldGUoIEFkYXB0ZXIsICZUU1RBVFVTICk7Ci0JCVQwMi52YWx1ZSA9IGNwdV90b19sZTMyKHBsdG1wW2ldKSA+PiA4OwotCX0KLQotCXJldHVybjsKLWVycm9yOgotCU9TX0FUT01JQ19ERUMoIHBId0RhdGEtPkFkYXB0ZXIsICZwV2IzNVR4LT5UeFJlc3VsdENvdW50ICk7Ci0JcFdiMzVUeC0+RVAydm1fc3RhdGUgPSBWTV9TVE9QOwotfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YjM1dHhfZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2IzNXR4X2YuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA3YjEyOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YjM1dHhfZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIEludGVyZmFjZSBmdW5jdGlvbiBkZWNsYXJlCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotdW5zaWduZWQgY2hhciBXYjM1VHhfaW5pdGlhbCgJIHBod19kYXRhX3QgcEh3RGF0YSApOwotdm9pZCBXYjM1VHhfZGVzdHJveSggIHBod19kYXRhX3QgcEh3RGF0YSApOwotdW5zaWduZWQgY2hhciBXYjM1VHhfZ2V0X3R4X2J1ZmZlciggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4ICoqcEJ1ZmZlciApOwotCi12b2lkIFdiMzVUeF9FUDJWTSggIHBod19kYXRhX3QgcEh3RGF0YSApOwotdm9pZCBXYjM1VHhfRVAyVk1fc3RhcnQoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLXZvaWQgV2IzNVR4X0VQMlZNX2NvbXBsZXRlKCAgUFVSQiBwdXJiICk7Ci0KLXZvaWQgV2IzNVR4X3N0YXJ0KCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci12b2lkIFdiMzVUeF9zdG9wKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Ci12b2lkIFdiMzVUeCggIHBod19kYXRhX3QgcEh3RGF0YSApOwotdm9pZCBXYjM1VHhfY29tcGxldGUoICBQVVJCIHB1cmIgKTsKLXZvaWQgV2IzNVR4X3Jlc2V0X2Rlc2NyaXB0b3IoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLQotdm9pZCBXYjM1VHhfQ3VycmVudFRpbWUoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MzIgVGltZUNvdW50ICk7Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2IzNXR4X3MuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3diMzV0eF9zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNDMyNTcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2IzNXR4X3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBJUzg5QzM1IFR4IHJlbGF0ZWQgZGVmaW5pdGlvbgotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSNkZWZpbmUgVFhfSU5URVJGQUNFCQkJMAkvLyBJbnRlcmZhY2UgMQotI2RlZmluZSBUWF9QSVBFCQkJCQkzCS8vIGVuZHBvaW50IDQKLSNkZWZpbmUgVFhfSU5URVJSVVBUCQkJMQkvLyBlbmRwb2ludCAyCi0jZGVmaW5lIE1BWF9JTlRFUlJVUFRfTEVOR1RICTY0CS8vIEl0IG11c3QgYmUgNjQgZm9yIEVQMiBoYXJkd2FyZQotCi0KLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIEludGVybmFsIHZhcmlhYmxlIGZvciBtb2R1bGUKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgX1dCMzVUWAotewotCS8vIEZvciBUeCBidWZmZXIKLQl1OAlUeEJ1ZmZlclsgTUFYX1VTQl9UWF9CVUZGRVJfTlVNQkVSIF1bIE1BWF9VU0JfVFhfQlVGRkVSIF07Ci0KLQkvLyBGb3IgSW50ZXJydXB0IHBpcGUKLQl1OAlFUDJfYnVmW01BWF9JTlRFUlJVUFRfTEVOR1RIXTsKLQotCU9TX0FUT01JQwlUeFJlc3VsdENvdW50Oy8vIEZvciB0aHJlYWQgY29udHJvbCBvZiBFUDIgOTMxMTMwLjQubQotCU9TX0FUT01JQwlUeEZpcmVDb3VudGVyOy8vIEZvciB0aHJlYWQgY29udHJvbCBvZiBFUDQgOTMxMTMwLjQubgotCXUzMgkJCUJ5dGVUcmFuc2ZlcjsKLQotCXUzMgkgICAgVHhTZW5kSW5kZXg7Ly8gVGhlIG5leHQgaW5kZXggb2YgTWRzIGFycmF5IHRvIGJlIHNlbnQKLQl1MzIJICAgIEVQMnZtX3N0YXRlOyAvLyBmb3IgRVAydm0gc3RhdGUKLQl1MzIJICAgIEVQNHZtX3N0YXRlOyAvLyBmb3IgRVA0dm0gc3RhdGUKLQl1MzIJICAgIHR4X2hhbHQ7IC8vIFN0b3BwaW5nIFZNCi0KLQlzdHJ1Y3QgdXJiICoJCQkJVHg0VXJiOwotCXN0cnVjdCB1cmIgKgkJCQlUeDJVcmI7Ci0KLQlpbnQJCUVQMlZNX3N0YXR1czsKLQlpbnQJCUVQNFZNX3N0YXR1czsKLQotCXUzMglUeEZpbGxDb3VudDsgLy8gMjAwNjA5MjgKLQl1MzIJVHhUaW1lcjsgLy8gMjAwNjA5MjggQWRkIGlmIHNlbmRpbmcgcGFja2V0IG5vdCBncmVhdCB0aGFuIDEzCi0KLX0gV0IzNVRYLCAqUFdCMzVUWDsKLQotCi0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YnVzYi5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2J1c2IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzljYTliOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YnVzYi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwOCBQYXZlbCBNYWNoZWsgPHBhdmVsQHN1c2UuY3o+Ci0gKgotICogRGlzdHJpYnV0ZSB1bmRlciBHUEx2Mi4KLSAqLwotI2luY2x1ZGUgInN5c2RlZi5oIgotI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgotCi1NT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOwotTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9WRVJTSU9OKCIwLjEiKTsKLQotc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHdiMzVfdGFibGVbXSBfX2RldmluaXRkYXRhID0gewotCXtVU0JfREVWSUNFKDB4MDQxNiwgMHgwMDM1KX0sCi0Je1VTQl9ERVZJQ0UoMHgxOEU4LCAweDYyMDEpfSwKLQl7VVNCX0RFVklDRSgweDE4RTgsIDB4NjIwNil9LAotCXtVU0JfREVWSUNFKDB4MThFOCwgMHg2MjE3KX0sCi0Je1VTQl9ERVZJQ0UoMHgxOEU4LCAweDYyMzApfSwKLQl7VVNCX0RFVklDRSgweDE4RTgsIDB4NjIzMyl9LAotCXtVU0JfREVWSUNFKDB4MTEzMSwgMHgyMDM1KX0sCi0JeyAwLCB9Ci19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgd2IzNV90YWJsZSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgd2Jzb2Z0X3JhdGVzW10gPSB7Ci0JeyAuYml0cmF0ZSA9IDEwLCAuZmxhZ3MgPSBJRUVFODAyMTFfUkFURV9TSE9SVF9QUkVBTUJMRSB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCB3YnNvZnRfY2hhbm5lbHNbXSA9IHsKLQl7IC5jZW50ZXJfZnJlcSA9IDI0MTJ9LAotfTsKLQotaW50IHdic29mdF9lbmFibGVkOwotc3RydWN0IGllZWU4MDIxMV9odyAqbXlfZGV2OwotUEFEQVBURVIgbXlfYWRhcHRlcjsKLQotc3RhdGljIGludCB3YnNvZnRfYWRkX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsCi0JCQkJIHN0cnVjdCBpZWVlODAyMTFfaWZfaW5pdF9jb25mICpjb25mKQotewotCXByaW50aygid2Jzb2Z0X2FkZCBpbnRlcmZhY2UgY2FsbGVkXG4iKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgd2Jzb2Z0X3JlbW92ZV9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LAotCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9pZl9pbml0X2NvbmYgKmNvbmYpCi17Ci0JcHJpbnRrKCJ3YnNvZnRfcmVtb3ZlIGludGVyZmFjZSBjYWxsZWRcbiIpOwotfQotCi1zdGF0aWMgdm9pZCB3YnNvZnRfc3RvcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKLXsKLQlwcmludGsoS0VSTl9JTkZPICIlcyBjYWxsZWRcbiIsIF9fZnVuY19fKTsKLX0KLQotc3RhdGljIGludCB3YnNvZnRfZ2V0X3N0YXRzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfbG93X2xldmVsX3N0YXRzICpzdGF0cykKLXsKLQlwcmludGsoS0VSTl9JTkZPICIlcyBjYWxsZWRcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB3YnNvZnRfZ2V0X3R4X3N0YXRzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdHhfcXVldWVfc3RhdHMgKnN0YXRzKQotewotCXByaW50ayhLRVJOX0lORk8gIiVzIGNhbGxlZFxuIiwgX19mdW5jX18pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCB3YnNvZnRfY29uZmlndXJlX2ZpbHRlcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsCi0JCQkJICAgICB1bnNpZ25lZCBpbnQgY2hhbmdlZF9mbGFncywKLQkJCQkgICAgIHVuc2lnbmVkIGludCAqdG90YWxfZmxhZ3MsCi0JCQkJICAgICBpbnQgbWNfY291bnQsIHN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0KQotewotCXVuc2lnbmVkIGludCBiaXRfbnIsIG5ld19mbGFnczsKLQl1MzIgbWNfZmlsdGVyWzJdOwotCWludCBpOwotCi0JbmV3X2ZsYWdzID0gMDsKLQotCWlmICgqdG90YWxfZmxhZ3MgJiBGSUZfUFJPTUlTQ19JTl9CU1MpIHsKLQkJbmV3X2ZsYWdzIHw9IEZJRl9QUk9NSVNDX0lOX0JTUzsKLQkJbWNfZmlsdGVyWzFdID0gbWNfZmlsdGVyWzBdID0gfjA7Ci0JfSBlbHNlIGlmICgoKnRvdGFsX2ZsYWdzICYgRklGX0FMTE1VTFRJKSB8fCAobWNfY291bnQgPiAzMikpIHsKLQkJbmV3X2ZsYWdzIHw9IEZJRl9BTExNVUxUSTsKLQkJbWNfZmlsdGVyWzFdID0gbWNfZmlsdGVyWzBdID0gfjA7Ci0JfSBlbHNlIHsKLQkJbWNfZmlsdGVyWzFdID0gbWNfZmlsdGVyWzBdID0gMDsKLQkJZm9yIChpID0gMDsgaSA8IG1jX2NvdW50OyBpKyspIHsKLQkJCWlmICghbWNsaXN0KQotCQkJCWJyZWFrOwotCQkJcHJpbnRrKCJTaG91bGQgY2FsbCBldGhlcl9jcmMgaGVyZVxuIik7Ci0JCQkvL2JpdF9uciA9IGV0aGVyX2NyYyhFVEhfQUxFTiwgbWNsaXN0LT5kbWlfYWRkcikgPj4gMjY7Ci0JCQliaXRfbnIgPSAwOwotCi0JCQliaXRfbnIgJj0gMHgzRjsKLQkJCW1jX2ZpbHRlcltiaXRfbnIgPj4gNV0gfD0gMSA8PCAoYml0X25yICYgMzEpOwotCQkJbWNsaXN0ID0gbWNsaXN0LT5uZXh0OwotCQl9Ci0JfQotCi0JZGV2LT5mbGFncyAmPSB+SUVFRTgwMjExX0hXX1JYX0lOQ0xVREVTX0ZDUzsKLQotCSp0b3RhbF9mbGFncyA9IG5ld19mbGFnczsKLX0KLQotc3RhdGljIGludCB3YnNvZnRfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCWNoYXIgKmJ1ZmZlciA9IGttYWxsb2Moc2tiLT5sZW4sIEdGUF9BVE9NSUMpOwotCXByaW50aygiU2VuZGluZyBmcmFtZSAlZCBieXRlc1xuIiwgc2tiLT5sZW4pOwotCW1lbWNweShidWZmZXIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwotCWlmICgxID09IE1MTUVTZW5kRnJhbWUobXlfYWRhcHRlciwgYnVmZmVyLCBza2ItPmxlbiwgRlJBTUVfVFlQRV84MDJfMTFfTUFOQUdFTUVOVCkpCi0JCXByaW50aygiZnJhbWUgc2VudCBvayAoJWQgYnl0ZXMpP1xuIiwgc2tiLT5sZW4pOwotCXJldHVybiBORVRERVZfVFhfT0s7Ci19Ci0KLQotc3RhdGljIGludCB3YnNvZnRfc3RhcnQoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2KQotewotCXdic29mdF9lbmFibGVkID0gMTsKLQlwcmludGsoIndic29mdF9zdGFydCBjYWxsZWRcbiIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHdic29mdF9jb25maWcoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LCBzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYpCi17Ci0JQ2hhbkluZm8gY2g7Ci0JcHJpbnRrKCJ3YnNvZnRfY29uZmlnIGNhbGxlZFxuIik7Ci0KLQljaC5iYW5kID0gMTsKLQljaC5DaGFuTm8gPSAxOwkvKiBTaG91bGQgdXNlIGNoYW5uZWxfbnVtLCBvciBzb21ldGhpbmcsIGFzIHRoYXQgaXMgYWxyZWFkeSBwcmUtdHJhbnNsYXRlZCAqLwotCi0KLQloYWxfc2V0X2N1cnJlbnRfY2hhbm5lbCgmbXlfYWRhcHRlci0+c0h3RGF0YSwgY2gpOwotCWhhbF9zZXRfYmVhY29uX3BlcmlvZCgmbXlfYWRhcHRlci0+c0h3RGF0YSwgY29uZi0+YmVhY29uX2ludCk7Ci0vLwloYWxfc2V0X2NhcF9pbmZvKCZteV9hZGFwdGVyLT5zSHdEYXRhLCA/PyApOwotLy8gaGFsX3NldF9zc2lkKHBod19kYXRhX3QgcEh3RGF0YSwgIHU4ICogcHNzaWQsICB1OCBzc2lkX2xlbik7ID8/Ci0JaGFsX3NldF9hY2NlcHRfYnJvYWRjYXN0KCZteV9hZGFwdGVyLT5zSHdEYXRhLCAxKTsKLQloYWxfc2V0X2FjY2VwdF9wcm9taXNjdW91cygmbXlfYWRhcHRlci0+c0h3RGF0YSwgIDEpOwotCWhhbF9zZXRfYWNjZXB0X211bHRpY2FzdCgmbXlfYWRhcHRlci0+c0h3RGF0YSwgIDEpOwotCWhhbF9zZXRfYWNjZXB0X2JlYWNvbigmbXlfYWRhcHRlci0+c0h3RGF0YSwgIDEpOwotCWhhbF9zZXRfcmFkaW9fbW9kZSgmbXlfYWRhcHRlci0+c0h3RGF0YSwgIDApOwotCS8vaGFsX3NldF9hbnRlbm5hX251bWJlciggIHBod19kYXRhX3QgcEh3RGF0YSwgdTggbnVtYmVyICkKLQkvL2hhbF9zZXRfcmZfcG93ZXIocGh3X2RhdGFfdCBwSHdEYXRhLCB1OCBQb3dlckluZGV4KQotCi0KLS8vCWhhbF9zdGFydF9ic3MoJm15X2FkYXB0ZXItPnNId0RhdGEsIFdMQU5fQlNTVFlQRV9JTkZSQVNUUlVDVFVSRSk7CT8/Ci0KLS8vdm9pZCBoYWxfc2V0X3JhdGVzKHBod19kYXRhX3QgcEh3RGF0YSwgdTggKiBwYnNzX3JhdGVzLAotLy8JCSAgIHU4IGxlbmd0aCwgdW5zaWduZWQgY2hhciBiYXNpY19yYXRlX3NldCkKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHdic29mdF9jb25maWdfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwKLQkJCQkgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCQkgICAgc3RydWN0IGllZWU4MDIxMV9pZl9jb25mICpjb25mKQotewotCXByaW50aygid2Jzb2Z0X2NvbmZpZ19pbnRlcmZhY2UgY2FsbGVkXG4iKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHU2NCB3YnNvZnRfZ2V0X3RzZihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYpCi17Ci0JcHJpbnRrKCJ3YnNvZnRfZ2V0X3RzZiBjYWxsZWRcbiIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9vcHMgd2Jzb2Z0X29wcyA9IHsKLQkudHgJCQk9IHdic29mdF90eCwKLQkuc3RhcnQJCQk9IHdic29mdF9zdGFydCwJCS8qIFN0YXJ0IGNhbiBiZSBwcmV0dHkgbXVjaCBlbXB0eSBhcyB3ZSBkbyBXYldMYW5Jbml0aWFsaXplKCkgZHVyaW5nIHByb2JlPyAqLwotCS5zdG9wCQkJPSB3YnNvZnRfc3RvcCwKLQkuYWRkX2ludGVyZmFjZQkJPSB3YnNvZnRfYWRkX2ludGVyZmFjZSwKLQkucmVtb3ZlX2ludGVyZmFjZQk9IHdic29mdF9yZW1vdmVfaW50ZXJmYWNlLAotCS5jb25maWcJCQk9IHdic29mdF9jb25maWcsCi0JLmNvbmZpZ19pbnRlcmZhY2UJPSB3YnNvZnRfY29uZmlnX2ludGVyZmFjZSwKLQkuY29uZmlndXJlX2ZpbHRlcgk9IHdic29mdF9jb25maWd1cmVfZmlsdGVyLAotCS5nZXRfc3RhdHMJCT0gd2Jzb2Z0X2dldF9zdGF0cywKLQkuZ2V0X3R4X3N0YXRzCQk9IHdic29mdF9nZXRfdHhfc3RhdHMsCi0JLmdldF90c2YJCT0gd2Jzb2Z0X2dldF90c2YsCi0vLyBjb25mX3R4OiBoYWxfc2V0X2N3bWluKCkvaGFsX3NldF9jd21heDsKLX07Ci0KLXN0cnVjdCB3YnNvZnRfcHJpdiB7Ci19OwotCi0KLS8vIFVzYiBrZXJuZWwgc3Vic3lzdGVtIHdpbGwgY2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gYSBuZXcgZGV2aWNlIGlzIHBsdWdnZWQgaW50by4KLWludCB3YjM1X3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWRfdGFibGUpCi17Ci0JUEFEQVBURVIJQWRhcHRlcjsKLQlQV0JMSU5VWAlwV2JMaW51eDsKLQlQV0JVU0IJCXBXYlVzYjsKLSAgICAgICAgc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaW50ZXJmYWNlOwotCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7Ci0JaW50CXJldCA9IC0xOwotCXUzMglsdG1wOwotCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKLQotCXVzYl9nZXRfZGV2KHVkZXYpOwotCi0JcHJpbnRrKCJbdzM1dW5kXXdiMzVfcHJvYmUgLT5cbiIpOwotCi0JLy8gMjAwNjA2MzAuMiBDaGVjayB0aGUgZGV2aWNlIGlmIGl0IGFscmVhZHkgYmUgb3BlbmVkCi0JcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9yY3ZjdHJscGlwZSggdWRldiwgMCApLAotCQkJICAgICAgMHgwMSwgVVNCX1RZUEVfVkVORE9SfFVTQl9SRUNJUF9ERVZJQ0V8VVNCX0RJUl9JTiwKLQkJCSAgICAgIDB4MCwgMHg0MDAsICZsdG1wLCA0LCBIWioxMDAgKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJvcjsKLQotCWx0bXAgPSBjcHVfdG9fbGUzMihsdG1wKTsKLQlpZiAobHRtcCkgIC8vIElzIGFscmVhZHkgaW5pdGlhbGl6ZWQ/Ci0JCWdvdG8gZXJyb3I7Ci0KLQlBZGFwdGVyID0ga3phbGxvYyhzaXplb2YoQURBUFRFUiksIEdGUF9LRVJORUwpOwotCi0JbXlfYWRhcHRlciA9IEFkYXB0ZXI7Ci0JcFdiTGludXggPSAmQWRhcHRlci0+V2JMaW51eDsKLQlwV2JVc2IgPSAmQWRhcHRlci0+c0h3RGF0YS5XYlVzYjsKLQlwV2JVc2ItPnVkZXYgPSB1ZGV2OwotCi0gICAgICAgIGludGVyZmFjZSA9IGludGYtPmN1cl9hbHRzZXR0aW5nOwotICAgICAgICBlbmRwb2ludCA9ICZpbnRlcmZhY2UtPmVuZHBvaW50WzBdLmRlc2M7Ci0KLQlpZiAoZW5kcG9pbnRbMl0ud01heFBhY2tldFNpemUgPT0gNTEyKSB7Ci0JCXByaW50aygiW3czNXVuZF0gV29ya2luZyBvbiBVU0IgMi4wXG4iKTsKLQkJcFdiVXNiLT5Jc1VzYjIwID0gMTsKLQl9Ci0KLQlpZiAoIVdiV0xhbkluaXRpYWxpemUoQWRhcHRlcikpIHsKLQkJcHJpbnRrKCJbdzM1dW5kXVdiV0xhbkluaXRpYWxpemUgZmFpbFxuIik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JewotCQlzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKnByaXY7Ci0JCXN0cnVjdCBpZWVlODAyMTFfaHcgKmRldjsKLQkJc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgYmFuZDsKLQkJaW50IHJlczsKLQotCQlkZXYgPSBpZWVlODAyMTFfYWxsb2NfaHcoc2l6ZW9mKCpwcml2KSwgJndic29mdF9vcHMpOwotCi0JCWlmICghZGV2KSB7Ci0JCQlwcmludGsoInczNXVuZDogaWVlZTgwMjExIGFsbG9jIGZhaWxlZFxuIiApOwotCQkJQlVHKCk7Ci0JCX0KLQotCQlteV9kZXYgPSBkZXY7Ci0KLQkJU0VUX0lFRUU4MDIxMV9ERVYoZGV2LCAmdWRldi0+ZGV2KTsKLQkJewotCQkJcGh3X2RhdGFfdCBwSHdEYXRhID0gJkFkYXB0ZXItPnNId0RhdGE7Ci0JCQl1bnNpZ25lZCBjaGFyCQlkZXZfYWRkcltNQVhfQUREUl9MRU5dOwotCQkJaGFsX2dldF9wZXJtYW5lbnRfYWRkcmVzcyhwSHdEYXRhLCBkZXZfYWRkcik7Ci0JCQlTRVRfSUVFRTgwMjExX1BFUk1fQUREUihkZXYsIGRldl9hZGRyKTsKLQkJfQotCi0KLQkJZGV2LT5leHRyYV90eF9oZWFkcm9vbSA9IDEyOwkvKiBGSVhNRSAqLwotCQlkZXYtPmZsYWdzID0gMDsKLQotCQlkZXYtPmNoYW5uZWxfY2hhbmdlX3RpbWUgPSAxMDAwOwotLy8JCWRldi0+bWF4X3Jzc2kgPSAxMDA7Ci0KLQkJZGV2LT5xdWV1ZXMgPSAxOwotCi0JCWJhbmQuY2hhbm5lbHMgPSB3YnNvZnRfY2hhbm5lbHM7Ci0JCWJhbmQubl9jaGFubmVscyA9IEFSUkFZX1NJWkUod2Jzb2Z0X2NoYW5uZWxzKTsKLQkJYmFuZC5iaXRyYXRlcyA9IHdic29mdF9yYXRlczsKLQkJYmFuZC5uX2JpdHJhdGVzID0gQVJSQVlfU0laRSh3YnNvZnRfcmF0ZXMpOwotCi0JCWRldi0+d2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdID0gJmJhbmQ7Ci0jaWYgMAotCQl3YnNvZnRfbW9kZXNbMF0ubnVtX2NoYW5uZWxzID0gMTsKLQkJd2Jzb2Z0X21vZGVzWzBdLmNoYW5uZWxzID0gd2Jzb2Z0X2NoYW5uZWxzOwotCQl3YnNvZnRfbW9kZXNbMF0ubW9kZSA9IE1PREVfSUVFRTgwMjExQjsKLQkJd2Jzb2Z0X21vZGVzWzBdLm51bV9yYXRlcyA9IEFSUkFZX1NJWkUod2Jzb2Z0X3JhdGVzKTsKLQkJd2Jzb2Z0X21vZGVzWzBdLnJhdGVzID0gd2Jzb2Z0X3JhdGVzOwotCi0JCXJlcyA9IGllZWU4MDIxMV9yZWdpc3Rlcl9od21vZGUoZGV2LCAmd2Jzb2Z0X21vZGVzWzBdKTsKLQkJQlVHX09OKHJlcyk7Ci0jZW5kaWYKLQotCQlyZXMgPSBpZWVlODAyMTFfcmVnaXN0ZXJfaHcoZGV2KTsKLQkJQlVHX09OKHJlcyk7Ci0JfQotCi0JdXNiX3NldF9pbnRmZGF0YSggaW50ZiwgQWRhcHRlciApOwotCi0JcHJpbnRrKCJbdzM1dW5kXSBfcHJvYmUgT0tcbiIpOwotCXJldHVybiAwOwotZXJyb3I6Ci0JcmV0dXJuIC1FTk9NRU07Ci19Ci0KLXZvaWQgcGFja2V0X2NhbWUoY2hhciAqcFJ4QnVmZmVyQWRkcmVzcywgaW50IFBhY2tldFNpemUpCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyByeF9zdGF0dXMgPSB7MH07Ci0KLQlpZiAoIXdic29mdF9lbmFibGVkKQotCQlyZXR1cm47Ci0KLQlza2IgPSBkZXZfYWxsb2Nfc2tiKFBhY2tldFNpemUpOwotCWlmICghc2tiKSB7Ci0JCXByaW50aygiTm90IGVub3VnaCBtZW1vcnkgZm9yIHBhY2tldCwgRklYTUVcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JbWVtY3B5KHNrYl9wdXQoc2tiLCBQYWNrZXRTaXplKSwKLQkgICAgICAgcFJ4QnVmZmVyQWRkcmVzcywKLQkgICAgICAgUGFja2V0U2l6ZSk7Ci0KLS8qCi0Jcnhfc3RhdHVzLnJhdGUgPSAxMDsKLQlyeF9zdGF0dXMuY2hhbm5lbCA9IDE7Ci0Jcnhfc3RhdHVzLmZyZXEgPSAxMjM0NTsKLQlyeF9zdGF0dXMucGh5bW9kZSA9IE1PREVfSUVFRTgwMjExQjsKLSovCi0KLQlpZWVlODAyMTFfcnhfaXJxc2FmZShteV9kZXYsIHNrYiwgJnJ4X3N0YXR1cyk7Ci19Ci0KLXVuc2lnbmVkIGNoYXIKLVdiVXNiX2luaXRpYWwocGh3X2RhdGFfdCBwSHdEYXRhKQotewotCXJldHVybiAxOwotfQotCi0KLXZvaWQKLVdiVXNiX2Rlc3Ryb3kocGh3X2RhdGFfdCBwSHdEYXRhKQotewotfQotCi1pbnQgd2IzNV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCi17Ci0JLyogbmV0ZGV2X3ByaXYoKSBvciBuZXRkZXYtPm1sX3ByaXYgc2hvdWxkIHJlZmVyZW5jZSB0byB0aGUgYWRkcmVzcyBvZgotCSAqIHByaXZhdGUgZGF0YShQQURBUFRFUikuIEl0IGRlcGVuZHMgb24gd2hldGhlciBwcml2YXRlIGRhdGEgbWVtb3J5IGlzCi0JICogYWxsb2NhdGVkIHdoZW4gYWxsb2NfbmV0ZGV2KCkuCi0JICovCi0JUEFEQVBURVIgQWRhcHRlciA9IChQQURBUFRFUiluZXRkZXZfcHJpdihuZXRkZXYpOwotCXBod19kYXRhX3QgcEh3RGF0YSA9ICZBZGFwdGVyLT5zSHdEYXRhOwotCi0gICAgICAgIG5ldGlmX3N0YXJ0X3F1ZXVlKG5ldGRldik7Ci0KLQkvL1RPRE8gOiBwdXQgaGVyZSB0ZW1wb3JhcmlseQotCWhhbF9zZXRfYWNjZXB0X2Jyb2FkY2FzdChwSHdEYXRhLCAxKTsgLy8gb3BlbiBhY2NlcHQgYnJvYWRjYXN0Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IHdiMzVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKLXsKLQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgd2IzNV9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQotewotCVBXQkxJTlVYIHBXYkxpbnV4OwotCVBBREFQVEVSIEFkYXB0ZXIgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwotCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7Ci0KLSAgICAgICAgcFdiTGludXggPSAmQWRhcHRlci0+V2JMaW51eDsKLQotCS8vIENhcmQgcmVtb3ZlCi0JV2JXbGFuSGFsdChBZGFwdGVyKTsKLQotfQotCi1zdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgd2IzNV9kcml2ZXIgPSB7Ci0JLm5hbWUJCT0gInczNXVuZCIsCi0JLmlkX3RhYmxlCT0gd2IzNV90YWJsZSwKLQkucHJvYmUJCT0gd2IzNV9wcm9iZSwKLQkuZGlzY29ubmVjdAk9IHdiMzVfZGlzY29ubmVjdCwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHdiMzVfaW5pdCh2b2lkKQotewotCXJldHVybiB1c2JfcmVnaXN0ZXIoJndiMzVfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHdiMzVfZXhpdCh2b2lkKQotewotCXVzYl9kZXJlZ2lzdGVyKCZ3YjM1X2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KHdiMzVfaW5pdCk7Ci1tb2R1bGVfZXhpdCh3YjM1X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2J1c2JfZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbGludXgvd2J1c2JfZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWUyOWUxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3didXNiX2YuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8vKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwotLy8gQ29weXJpZ2h0IChjKSAxOTk2LTIwMDQgV2luYm9uZCBFbGVjdHJvbmljIENvcnBvcmF0aW9uCi0vLwotLy8gIE1vZHVsZSBOYW1lOgotLy8gICAgd2J1c2JfZi5oCi0vLwotLy8gIEFic3RyYWN0OgotLy8gICAgTGludXggZHJpdmVyLgotLy8KLS8vICBBdXRob3I6Ci0vLwotLy8rKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwotCi1pbnQgd2IzNV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOwotaW50IHdiMzVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7Ci11bnNpZ25lZCBjaGFyIFdiVXNiX2luaXRpYWwocGh3X2RhdGFfdCBwSHdEYXRhKTsKLXZvaWQgV2JVc2JfZGVzdHJveShwaHdfZGF0YV90IHBId0RhdGEpOwotdW5zaWduZWQgY2hhciBXYldMYW5Jbml0aWFsaXplKFBBREFQVEVSIEFkYXB0ZXIpOwotI2RlZmluZQlXYlVzYl9TdG9wKCBfQSApCi0KLWludCB3YjM1X3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZF90YWJsZSk7Ci12b2lkIHdiMzVfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7Ci0KLQotI2RlZmluZSB3Yl91c2Jfc3VibWl0X3VyYihfQSkgdXNiX3N1Ym1pdF91cmIoX0EsIEdGUF9BVE9NSUMpCi0jZGVmaW5lIHdiX3VzYl9hbGxvY191cmIoX0EpIHVzYl9hbGxvY191cmIoX0EsIEdGUF9BVE9NSUMpCi0KLSNkZWZpbmUgV2JVc2JfQ2hlY2tGb3JIYW5nKCBfUCApCi0jZGVmaW5lIFdiVXNiX0RldGVjdFN0YXJ0KCBfUCwgX0kgKQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3didXNiX3MuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xpbnV4L3didXNiX3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVjMWQ1My4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9saW51eC93YnVzYl9zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vLysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKLS8vIENvcHlyaWdodCAoYykgMTk5Ni0yMDA0IFdpbmJvbmQgRWxlY3Ryb25pYyBDb3Jwb3JhdGlvbgotLy8KLS8vICBNb2R1bGUgTmFtZToKLS8vICAgIHdidXNiX3MuaAotLy8KLS8vICBBYnN0cmFjdDoKLS8vICAgIExpbnV4IGRyaXZlci4KLS8vCi0vLyAgQXV0aG9yOgotLy8KLS8vKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKLQotI2RlZmluZSBPU19TTEVFUCggX01UICkJeyBzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOyBcCi0JCQkgIHNjaGVkdWxlX3RpbWVvdXQoIF9NVCpIWi8xMDAwMDAwICk7IH0KLQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gIFJXX0NPTlRFWFQgLS0KLS8vCi0vLyAgVXNlZCB0byB0cmFjayBkcml2ZXItZ2VuZXJhdGVkIGlvIGlycHMKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi10eXBlZGVmIHN0cnVjdCBfUldfQ09OVEVYVAotewotCXZvaWQqCQkJcEh3RGF0YTsKLQlQVVJCCQkJcFVyYjsKLQl2b2lkKgkJCXBDYWxsQmFja0Z1bmN0aW9uUGFyYW1ldGVyOwotfSBSV19DT05URVhULCAqUFJXX0NPTlRFWFQ7Ci0KLQotCi0KLSNkZWZpbmUgRFJJVkVSX0FVVEhPUiAiT3JpZ2luYWwgYnk6IEplZmYgTGVlPFlZX0xlZUBpc3NjLmNvbS50dz4gQWRhcHRlZCB0byAyLjYueCBieSBDb3N0YW50aW5vIExlYW5kcm8gKFJ4YXJ0IERlc2t0b3ApIDxsZV9jb3N0YW50aW5vQHBpeGFydGFyZ2VudGluYS5jb20uYXI+IgotI2RlZmluZSBEUklWRVJfREVTQyAgICJJUzg5QzM1IDgwMi4xMWJnIFdMQU4gVVNCIERyaXZlciIKLQotCi0KLXR5cGVkZWYgc3RydWN0IF9XQlVTQiB7Ci0JdTMyCUlzVXNiMjA7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7Ci0JdTMyCURldGVjdENvdW50OwotfSBXQlVTQiwgKlBXQlVTQjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2xvY2FscGFyYS5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbG9jYWxwYXJhLmgKaW5kZXggMjY4Y2Y5MS4uNjA3YmIwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbG9jYWxwYXJhLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbG9jYWxwYXJhLmgKQEAgLTEsNiArMSwxMiBAQAorI2lmbmRlZiBfX1dJTkJPTkRfTE9DQUxQQVJBX0gKKyNkZWZpbmUgX19XSU5CT05EX0xPQ0FMUEFSQV9ICisKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gTG9jYWxQYXJhLmggLQogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpbmNsdWRlICJtYWNfc3RydWN0dXJlcy5oIgorCiAvL0RlZmluZSB0aGUgbG9jYWwgYWJpbGl0eQogCiAjZGVmaW5lIExPQ0FMX0RFRkFVTFRfQkVBQ09OX1BFUklPRAkJCTEwMAkJLy9tcwpAQCAtMjUsNyArMzEsNyBAQAogI2RlZmluZSBMT0NBTF9VTktOT1dOXzVfQ0hBTk5FTF9OVU0JCQkzNAkvL25vdCBpbmNsdWRlIDE2NQogCiAKLSNkZWZpbmUgcHNMT0NBTAkJCSgmKEFkYXB0ZXItPnNMb2NhbFBhcmEpKQorI2RlZmluZSBwc0xPQ0FMCQkJKCYoYWRhcHRlci0+c0xvY2FsUGFyYSkpCiAKICNkZWZpbmUgTU9ERV84MDJfMTFfQkcJCQkwCiAjZGVmaW5lIE1PREVfODAyXzExX0EJCQkxCkBAIC0xNDMsNyArMTQ5LDYgQEAKIAogICAgIC8vLy8gcG93ZXItc2F2ZSB2YXJpYWJsZXMKICAgICB1OCAgCQkgIAlpUG93ZXJTYXZlTW9kZTsgICAgIC8vIDAgaW5kaWNhdGVzIGl0IGlzIG9uLCAxIGluZGljYXRlcyBpdCBpcyBvZmYKLQl1OAkJCVNodXREb3duZWQ7CiAJdTgJCQlBVElNbW9kZTsKIAl1OAkJCUV4Y2x1ZGVVbmVuY3J5cHRlZDsKIApAQCAtMjcyLDQgKzI3Nyw0IEBACiAKIH0gV0JfTE9DQUxERVNDUklQVCwgKlBXQl9MT0NBTERFU0NSSVBUOwogCi0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWFjX3N0cnVjdHVyZXMuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21hY19zdHJ1Y3R1cmVzLmgKaW5kZXggMDMxZDJjYi4uMGQxNjE5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWFjX3N0cnVjdHVyZXMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tYWNfc3RydWN0dXJlcy5oCkBAIC0yMSw2ICsyMSw3IEBACiAjaWZuZGVmIF9NQUNfU3RydWN0dXJlc19IXwogI2RlZmluZSBfTUFDX1N0cnVjdHVyZXNfSF8KIAorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gU29tZSBtaXNjZWxsYW5lb3VzIGRlZmluaXRpb25zCkBAIC0xMTUsMTAgKzExNiw2IEBACiAjZGVmaW5lIFdMQU5fTUFYX1BBSVJXSVNFX0NJUEhFUl9TVUlURV9DT1VOVCAgICAoKHUxNikgNikKICNkZWZpbmUgV0xBTl9NQVhfQVVUSF9LRVlfTUdUX1NVSVRFX0xJU1RfQ09VTlQgICgodTE2KSAyKQogCi0jaWZkZWYgV0JfTElOVVgKLSNkZWZpbmUgVU5BTElHTkVECi0jZW5kaWYKLQogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogdHlwZWRlZiBlbnVtIGVudW1fUG93ZXJNYW5hZ2VtZW50TW9kZQogewpAQCAtNDY0LDcgKzQ2MSw3IEBACiB7CiAJdTgJCQkJCUVsZW1lbnRfSUQ7CiAJdTgJCQkJCUxlbmd0aDsKLQlVTkFMSUdORUQgU1VJVEVfU0VMRUNUT1IJT3VpV1BBQWRkaXRpb25hbDsvL1dQQSB2ZXJzaW9uIDIuMCBhZGRpdGlvbmFsIGZpZWxkLCBhbmQgc2hvdWxkIGJlIDAwOjUwOkYyOjAxCisJU1VJVEVfU0VMRUNUT1IJT3VpV1BBQWRkaXRpb25hbDsvL1dQQSB2ZXJzaW9uIDIuMCBhZGRpdGlvbmFsIGZpZWxkLCBhbmQgc2hvdWxkIGJlIDAwOjUwOkYyOjAxCiAJdTE2CQkJCQlWZXJzaW9uOwogCVNVSVRFX1NFTEVDVE9SCQlHcm91cEtleVN1aXRlOwogCXUxNgkJCQkJUGFpcndpc2VLZXlTdWl0ZUNvdW50OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWRzLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tZHMuYwppbmRleCBmMWRlODEzLi5lNDMxNDA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tZHMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tZHMuYwpAQCAtMSw0NDUgKzEsMzkgQEAKKyNpbmNsdWRlICJkc190a2lwLmgiCisjaW5jbHVkZSAiZ2xfODAyMTEuaCIKKyNpbmNsdWRlICJtZHNfZi5oIgorI2luY2x1ZGUgIm1sbWV0eHJ4X2YuaCIKKyNpbmNsdWRlICJtdG9fZi5oIgogI2luY2x1ZGUgIm9zX2NvbW1vbi5oIgotCi12b2lkCi1NZHNfcmVzZXRfZGVzY3JpcHRvcihQQURBUFRFUiBBZGFwdGVyKQotewotCVBNRFMgcE1kcyA9ICZBZGFwdGVyLT5NZHM7Ci0KLQlwTWRzLT5UeFBhdXNlID0gMDsKLQlwTWRzLT5UeFRocmVhZENvdW50ID0gMDsKLQlwTWRzLT5UeEZpbGxJbmRleCA9IDA7Ci0JcE1kcy0+VHhEZXNJbmRleCA9IDA7Ci0JcE1kcy0+U2NhblR4UGF1c2UgPSAwOwotCW1lbXNldChwTWRzLT5UeE93bmVyLCAwLCAoKE1BWF9VU0JfVFhfQlVGRkVSX05VTUJFUiArIDMpICYgfjB4MDMpKTsKLX0KKyNpbmNsdWRlICJ3YmhhbF9mLmgiCisjaW5jbHVkZSAid2JsaW51eF9mLmgiCiAKIHVuc2lnbmVkIGNoYXIKLU1kc19pbml0aWFsKFBBREFQVEVSIEFkYXB0ZXIpCitNZHNfaW5pdGlhbChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyKQogewotCVBNRFMgcE1kcyA9ICZBZGFwdGVyLT5NZHM7CisJUE1EUyBwTWRzID0gJmFkYXB0ZXItPk1kczsKIAotCXBNZHMtPlR4UGF1c2UgPSBGQUxTRTsKKwlwTWRzLT5UeFBhdXNlID0gZmFsc2U7CiAJcE1kcy0+VHhSVFNUaHJlc2hvbGQgPSBERUZBVUxUX1JUU1RocmVzaG9sZDsKIAlwTWRzLT5UeEZyYWdtZW50VGhyZXNob2xkID0gREVGQVVMVF9GUkFHTUVOVF9USFJFU0hPTEQ7CiAKLQl2UnhUaW1lckluaXQoQWRhcHRlcik7Ly9mb3IgV1BBIGNvdW50ZXJtZWFzdXJlCi0KLQlyZXR1cm4gaGFsX2dldF90eF9idWZmZXIoICZBZGFwdGVyLT5zSHdEYXRhLCAmcE1kcy0+cFR4QnVmZmVyICk7CisJcmV0dXJuIGhhbF9nZXRfdHhfYnVmZmVyKCAmYWRhcHRlci0+c0h3RGF0YSwgJnBNZHMtPnBUeEJ1ZmZlciApOwogfQogCiB2b2lkCi1NZHNfRGVzdHJveShQQURBUFRFUiBBZGFwdGVyKQorTWRzX0Rlc3Ryb3koc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlcikKIHsKLQl2UnhUaW1lclN0b3AoQWRhcHRlcik7CiB9CiAKLXZvaWQKLU1kc19UeChQQURBUFRFUiBBZGFwdGVyKQotewotCXBod19kYXRhX3QJcEh3RGF0YSA9ICZBZGFwdGVyLT5zSHdEYXRhOwotCVBNRFMJCXBNZHMgPSAmQWRhcHRlci0+TWRzOwotCURFU0NSSVBUT1IJVHhEZXM7Ci0JUERFU0NSSVBUT1IJcFR4RGVzID0gJlR4RGVzOwotCXU4CQkqWG1pdEJ1ZkFkZHJlc3M7Ci0JdTE2CQlYbWl0QnVmU2l6ZSwgUGFja2V0U2l6ZSwgc3RtcCwgQ3VycmVudFNpemUsIEZyYWdtZW50VGhyZXNob2xkOwotCXU4CQlGaWxsSW5kZXgsIFR4RGVzSW5kZXgsIEZyYWdtZW50Q291bnQsIEZpbGxDb3VudDsKLQl1bnNpZ25lZCBjaGFyCUJ1ZmZlckZpbGxlZCA9IEZBTFNFLCBNSUNBZGQgPSAwOwotCi0KLQlpZiAocE1kcy0+VHhQYXVzZSkKLQkJcmV0dXJuOwotCWlmICghaGFsX2RyaXZlcl9pbml0X09LKHBId0RhdGEpKQotCQlyZXR1cm47Ci0KLQkvL09ubHkgb25lIHRocmVhZCBjYW4gYmUgcnVuIGhlcmUKLQlpZiAoIU9TX0FUT01JQ19JTkMoIEFkYXB0ZXIsICZwTWRzLT5UeFRocmVhZENvdW50KSA9PSAxKQotCQlnb3RvIGNsZWFudXA7Ci0KLQkvLyBTdGFydCB0byBmaWxsIHRoZSBkYXRhCi0JZG8gewotCQlGaWxsSW5kZXggPSBwTWRzLT5UeEZpbGxJbmRleDsKLQkJaWYgKHBNZHMtPlR4T3duZXJbRmlsbEluZGV4XSkgeyAvLyBJcyBvd25lZCBieSBzb2Z0d2FyZSAwOlllcyAxOk5vCi0jaWZkZWYgX1BFX1RYX0RVTVBfCi0JCQlXQkRFQlVHKCgiW01kc19UeF0gVHggT3duZXIgaXMgSC9XLlxuIikpOwotI2VuZGlmCi0JCQlicmVhazsKLQkJfQotCi0JCVhtaXRCdWZBZGRyZXNzID0gcE1kcy0+cFR4QnVmZmVyICsgKE1BWF9VU0JfVFhfQlVGRkVSICogRmlsbEluZGV4KTsgLy9HZXQgYnVmZmVyCi0JCVhtaXRCdWZTaXplID0gMDsKLQkJRmlsbENvdW50ID0gMDsKLQkJZG8gewotCQkJUGFja2V0U2l6ZSA9IEFkYXB0ZXItPnNNbG1lRnJhbWUubGVuOwotCQkJaWYgKCFQYWNrZXRTaXplKQotCQkJCWJyZWFrOwotCi0JCQkvL0ZvciBDaGVjayB0aGUgYnVmZmVyIHJlc291cmNlCi0JCQlGcmFnbWVudFRocmVzaG9sZCA9IENVUlJFTlRfRlJBR01FTlRfVEhSRVNIT0xEOwotCQkJLy85MzExMzAuNS5iCi0JCQlGcmFnbWVudENvdW50ID0gUGFja2V0U2l6ZS9GcmFnbWVudFRocmVzaG9sZCArIDE7Ci0JCQlzdG1wID0gUGFja2V0U2l6ZSArIEZyYWdtZW50Q291bnQqMzIgKyA4Oy8vOTMxMTMwLjUuYyA4Ok1JQwotCQkJaWYgKChYbWl0QnVmU2l6ZSArIHN0bXApID49IE1BWF9VU0JfVFhfQlVGRkVSKSB7Ci0JCQkJcHJpbnRrKCJbTWRzX1R4XSBFeGNlc3MgbWF4IHR4IGJ1ZmZlci5cbiIpOwotCQkJCWJyZWFrOyAvLyBidWZmZXIgaXMgbm90IGVub3VnaAotCQkJfQotCi0KLQkJCS8vCi0JCQkvLyBTdGFydCB0cmFuc21pdHRpbmcKLQkJCS8vCi0JCQlCdWZmZXJGaWxsZWQgPSBUUlVFOwotCi0JCQkvKiBMZWF2ZXMgZmlyc3QgdTggaW50YWN0ICovCi0JCQltZW1zZXQoKHU4ICopcFR4RGVzICsgMSwgMCwgc2l6ZW9mKERFU0NSSVBUT1IpIC0gMSk7Ci0KLQkJCVR4RGVzSW5kZXggPSBwTWRzLT5UeERlc0luZGV4Oy8vR2V0IHRoZSBjdXJyZW50IElECi0JCQlwVHhEZXMtPkRlc2NyaXB0b3JfSUQgPSBUeERlc0luZGV4OwotCQkJcE1kcy0+VHhEZXNGcm9tWyBUeERlc0luZGV4IF0gPSAyOy8vU3RvcmluZyB0aGUgaW5mb3JtYXRpb24gb2Ygc291cmNlIGNvbW1pbmcgZnJvbQotCQkJcE1kcy0+VHhEZXNJbmRleCsrOwotCQkJcE1kcy0+VHhEZXNJbmRleCAlPSBNQVhfVVNCX1RYX0RFU0NSSVBUT1I7Ci0KLQkJCU1MTUVfR2V0TmV4dFBhY2tldCggQWRhcHRlciwgcFR4RGVzICk7Ci0KLQkJCS8vIENvcHkgaGVhZGVyLiA4Ynl0ZSBVU0IgKyAyNGJ5dGUgODAyLjExSGRyLiBTZXQgVHhSYXRlLCBQcmVhbWJsZSB0eXBlCi0JCQlNZHNfSGVhZGVyQ29weSggQWRhcHRlciwgcFR4RGVzLCBYbWl0QnVmQWRkcmVzcyApOwotCi0JCQkvLyBGb3Igc3BlZWQgdXAgS2V5IHNldHRpbmcKLQkJCWlmIChwVHhEZXMtPkVhcEZpeCkgewotI2lmZGVmIF9QRV9UWF9EVU1QXwotCQkJCVdCREVCVUcoKCIzNTogRVBBIDR0aCBmcmFtZSBkZXRlY3RlZC4gU2l6ZSA9ICVkXG4iLCBQYWNrZXRTaXplKSk7Ci0jZW5kaWYKLQkJCQlwSHdEYXRhLT5Jc0tleVByZVNldCA9IDE7Ci0JCQl9Ci0KLQkJCS8vIENvcHkgKGZyYWdtZW50KSBmcmFtZSBib2R5LCBhbmQgc2V0IFVTQiwgODAyLjExIGhkciBmbGFnCi0JCQlDdXJyZW50U2l6ZSA9IE1kc19Cb2R5Q29weShBZGFwdGVyLCBwVHhEZXMsIFhtaXRCdWZBZGRyZXNzKTsKLQotCQkJLy8gU2V0IFJUUy9DVFMgYW5kIE5vcm1hbCBkdXJhdGlvbiBmaWVsZCBpbnRvIGJ1ZmZlcgotCQkJTWRzX0R1cmF0aW9uU2V0KEFkYXB0ZXIsIHBUeERlcywgWG1pdEJ1ZkFkZHJlc3MpOwotCi0JCQkvLwotCQkJLy8gQ2FsY3VsYXRpb24gTUlDIGZyb20gYnVmZmVyIHdoaWNoIG1heWJlIGZyYWdtZW50LCB0aGVuIGZpbGwgaW50byB0ZW1wb3JhcnkgYWRkcmVzcyA4IGJ5dGUKLQkJCS8vIDkzMTEzMC41LmUKLQkJCWlmIChNSUNBZGQpCi0JCQkJTWRzX01pY0ZpbGwoIEFkYXB0ZXIsIHBUeERlcywgWG1pdEJ1ZkFkZHJlc3MgKTsKLQotCQkJLy9TaGlmdCB0byB0aGUgbmV4dCBhZGRyZXNzCi0JCQlYbWl0QnVmU2l6ZSArPSBDdXJyZW50U2l6ZTsKLQkJCVhtaXRCdWZBZGRyZXNzICs9IEN1cnJlbnRTaXplOwotCi0jaWZkZWYgX0lCU1NfQkVBQ09OX1NFUV9TVElDS18KLQkJCWlmICgoWG1pdEJ1ZkFkZHJlc3NbIERPVF8xMV9EQV9PRkZTRVQrOCBdICYgMHhmYykgIT0gTUFDX1NVQlRZUEVfTU5HTU5UX1BST0JFX1JFUVVFU1QpIC8vICs4IGZvciBVU0IgaGRyCi0jZW5kaWYKLQkJCQlwTWRzLT5UeFRvZ2dsZSA9IFRSVUU7Ci0KLQkJCS8vIEdldCBwYWNrZXQgdG8gdHJhbnNtaXQgY29tcGxldGVkLCAxOlRFU1RTVEEgMjpNTE1FIDM6IE5kaXMgZGF0YQotCQkJTUxNRV9TZW5kQ29tcGxldGUoQWRhcHRlciwgMCwgVFJVRSk7Ci0KLQkJCS8vIFNvZnR3YXJlIFRTQyBjb3VudCAyMDA2MDIxNAotCQkJcE1kcy0+VHhUc2MrKzsKLQkJCWlmIChwTWRzLT5UeFRzYyA9PSAwKQotCQkJCXBNZHMtPlR4VHNjXzIrKzsKLQotCQkJRmlsbENvdW50Kys7IC8vIDIwMDYwOTI4Ci0JCX0gd2hpbGUgKEhBTF9VU0JfTU9ERV9CVVJTVChwSHdEYXRhKSk7IC8vIEVuZCBvZiBtdWx0aXBsZSBNU0RVIGNvcHkgbG9vcC4gRkFMU0UgPSBzaW5nbGUgVFJVRSA9IG11bHRpcGxlIHNlbmRpbmcKLQotCQkvLyBNb3ZlIHRvIHRoZSBuZXh0IG9uZSwgaWYgbmVjZXNzYXJ5Ci0JCWlmIChCdWZmZXJGaWxsZWQpIHsKLQkJCS8vIHNpemUgc2V0dGluZwotCQkJcE1kcy0+VHhCdWZmZXJTaXplWyBGaWxsSW5kZXggXSA9IFhtaXRCdWZTaXplOwotCi0JCQkvLyAyMDA2MDkyOCBzZXQgVHggY291bnQKLQkJCXBNZHMtPlR4Q291bnRJbkJ1ZmZlcltGaWxsSW5kZXhdID0gRmlsbENvdW50OwotCi0JCQkvLyBTZXQgb3duZXIgZmxhZwotCQkJcE1kcy0+VHhPd25lcltGaWxsSW5kZXhdID0gMTsKLQotCQkJcE1kcy0+VHhGaWxsSW5kZXgrKzsKLQkJCXBNZHMtPlR4RmlsbEluZGV4ICU9IE1BWF9VU0JfVFhfQlVGRkVSX05VTUJFUjsKLQkJCUJ1ZmZlckZpbGxlZCA9IEZBTFNFOwotCQl9IGVsc2UKLQkJCWJyZWFrOwotCi0JCWlmICghUGFja2V0U2l6ZSkgLy8gTm8gbW9yZSBwayBmb3IgdHJhbnNtaXR0aW5nCi0JCQlicmVhazsKLQotCX0gd2hpbGUoVFJVRSk7Ci0KLQkvLwotCS8vIFN0YXJ0IHRvIHNlbmQgYnkgbG93ZXIgbW9kdWxlCi0JLy8KLQlpZiAoIXBId0RhdGEtPklzS2V5UHJlU2V0KQotCQlXYjM1VHhfc3RhcnQocEh3RGF0YSk7Ci0KLSBjbGVhbnVwOgotCU9TX0FUT01JQ19ERUMoIEFkYXB0ZXIsICZwTWRzLT5UeFRocmVhZENvdW50ICk7Ci19Ci0KLXZvaWQKLU1kc19TZW5kQ29tcGxldGUoUEFEQVBURVIgQWRhcHRlciwgUFQwMl9ERVNDUklQVE9SIHBUMDIpCi17Ci0JUE1EUwlwTWRzID0gJkFkYXB0ZXItPk1kczsKLQlwaHdfZGF0YV90CXBId0RhdGEgPSAmQWRhcHRlci0+c0h3RGF0YTsKLQl1OAlQYWNrZXRJZCA9ICh1OClwVDAyLT5UMDJfVHhfUGt0SUQ7Ci0JdW5zaWduZWQgY2hhcglTZW5kT0sgPSBUUlVFOwotCXU4CVJldHJ5Q291bnQsIFR4UmF0ZTsKLQotCWlmIChwVDAyLT5UMDJfSWdub3JlUmVzdWx0KSAvLyBEb24ndCBjYXJlIHRoZSByZXN1bHQKLQkJcmV0dXJuOwotCWlmIChwVDAyLT5UMDJfSXNMYXN0TXBkdSkgewotCQkvL1RPRE86IERUTyAtLSBnZXQgdGhlIHJldHJ5IGNvdW50IGFuZCBmcmFnbWVudCBjb3VudAotCQkvLyBUeCByYXRlCi0JCVR4UmF0ZSA9IHBNZHMtPlR4UmF0ZVsgUGFja2V0SWQgXVsgMCBdOwotCQlSZXRyeUNvdW50ID0gKHU4KXBUMDItPlQwMl9NUERVX0NudDsKLQkJaWYgKHBUMDItPnZhbHVlICYgRkxBR19FUlJPUl9UWF9NQVNLKSB7Ci0JCQlTZW5kT0sgPSBGQUxTRTsKLQotCQkJaWYgKHBUMDItPlQwMl90cmFuc21pdF9hYm9ydCB8fCBwVDAyLT5UMDJfb3V0X29mX01heFR4TVNEVUxpZnRUaW1lKSB7Ci0JCQkJLy9yZXRyeSBlcnJvcgotCQkJCXBId0RhdGEtPmR0b190eF9yZXRyeV9jb3VudCArPSAoUmV0cnlDb3VudCsxKTsKLQkJCQkvL1tmb3IgdHggZGVidWddCi0JCQkJaWYgKFJldHJ5Q291bnQ8NykKLQkJCQkJcEh3RGF0YS0+dHhfcmV0cnlfY291bnRbUmV0cnlDb3VudF0gKz0gUmV0cnlDb3VudDsKLQkJCQllbHNlCi0JCQkJCXBId0RhdGEtPnR4X3JldHJ5X2NvdW50WzddICs9IFJldHJ5Q291bnQ7Ci0JCQkJI2lmZGVmIF9QRV9TVEFURV9EVU1QXwotCQkJCVdCREVCVUcoKCJkdG9fdHhfcmV0cnlfY291bnQgPSVkXG4iLCBwSHdEYXRhLT5kdG9fdHhfcmV0cnlfY291bnQpKTsKLQkJCQkjZW5kaWYKLQkJCQlNVE9fU2V0VHhDb3VudChBZGFwdGVyLCBUeFJhdGUsIFJldHJ5Q291bnQpOwotCQkJfQotCQkJcEh3RGF0YS0+ZHRvX3R4X2ZyYWdfY291bnQgKz0gKFJldHJ5Q291bnQrMSk7Ci0KLQkJCS8vW2ZvciB0eCBkZWJ1Z10KLQkJCWlmIChwVDAyLT5UMDJfdHJhbnNtaXRfYWJvcnRfZHVlX3RvX1RCVFQpCi0JCQkJcEh3RGF0YS0+dHhfVEJUVF9zdGFydF9jb3VudCsrOwotCQkJaWYgKHBUMDItPlQwMl90cmFuc21pdF93aXRob3V0X2VuY3J5cHRpb25fZHVlX3RvX3dlcF9vbl9mYWxzZSkKLQkJCQlwSHdEYXRhLT50eF9XZXBPbl9mYWxzZV9jb3VudCsrOwotCQkJaWYgKHBUMDItPlQwMl9kaXNjYXJkX2R1ZV90b19udWxsX3dlcF9rZXkpCi0JCQkJcEh3RGF0YS0+dHhfTnVsbF9rZXlfY291bnQrKzsKLQkJfSBlbHNlIHsKLQkJCWlmIChwVDAyLT5UMDJfZWZmZWN0aXZlX3RyYW5zbWlzc2lvbl9yYXRlKQotCQkJCXBId0RhdGEtPnR4X0VUUl9jb3VudCsrOwotCQkJTVRPX1NldFR4Q291bnQoQWRhcHRlciwgVHhSYXRlLCBSZXRyeUNvdW50KTsKLQkJfQotCi0JCS8vIENsZWFyIHNlbmQgcmVzdWx0IGJ1ZmZlcgotCQlwTWRzLT5UeFJlc3VsdFsgUGFja2V0SWQgXSA9IDA7Ci0JfSBlbHNlCi0JCXBNZHMtPlR4UmVzdWx0WyBQYWNrZXRJZCBdIHw9ICgodTE2KShwVDAyLT52YWx1ZSAmIDB4MGZmZmYpKTsKLX0KLQotdm9pZAotTWRzX0hlYWRlckNvcHkoUEFEQVBURVIgQWRhcHRlciwgUERFU0NSSVBUT1IgcERlcywgdTggKlRhcmdldEJ1ZmZlcikKLXsKLQlQTURTCXBNZHMgPSAmQWRhcHRlci0+TWRzOwotCXU4CSpzcmNfYnVmZmVyID0gcERlcy0+YnVmZmVyX2FkZHJlc3NbMF07Ly85MzExMzAuNS5nCi0JUFQwMF9ERVNDUklQVE9SCXBUMDA7Ci0JUFQwMV9ERVNDUklQVE9SCXBUMDE7Ci0JdTE2CXN0bXA7Ci0JdTgJaSwgY3RtcDEsIGN0bXAyLCBjdG1wZjsKLQl1MTYJRnJhZ21lbnRUaHJlc2hvbGQgPSBDVVJSRU5UX0ZSQUdNRU5UX1RIUkVTSE9MRDsKLQotCi0Jc3RtcCA9IHBEZXMtPmJ1ZmZlcl90b3RhbF9zaXplOwotCS8vCi0JLy8gU2V0IFVTQiBoZWFkZXIgOCBieXRlCi0JLy8KLQlwVDAwID0gKFBUMDBfREVTQ1JJUFRPUilUYXJnZXRCdWZmZXI7Ci0JVGFyZ2V0QnVmZmVyICs9IDQ7Ci0JcFQwMSA9IChQVDAxX0RFU0NSSVBUT1IpVGFyZ2V0QnVmZmVyOwotCVRhcmdldEJ1ZmZlciArPSA0OwotCi0JcFQwMC0+dmFsdWUgPSAwOy8vIENsZWFyCi0JcFQwMS0+dmFsdWUgPSAwOy8vIENsZWFyCi0KLQlwVDAwLT5UMDBfdHhfcGFja2V0X2lkID0gcERlcy0+RGVzY3JpcHRvcl9JRDsvLyBTZXQgcGFja2V0IElECi0JcFQwMC0+VDAwX2hlYWRlcl9sZW5ndGggPSAyNDsvLyBTZXQgaGVhZGVyIGxlbmd0aAotCXBUMDEtPlQwMV9yZXRyeV9hYm9ydF9lYmFibGUgPSAxOy8vOTIxMDEzIDkzMTEzMC41LmgKLQotCS8vIEtleSBJRCBzZXR1cAotCXBUMDEtPlQwMV93ZXBfaWQgPSAwOwotCi0JRnJhZ21lbnRUaHJlc2hvbGQgPSBERUZBVUxUX0ZSQUdNRU5UX1RIUkVTSE9MRDsJLy9EbyBub3QgZnJhZ21lbnQKLQkvLyBDb3B5IGZ1bGwgZGF0YSwgdGhlIDEnc3QgYnVmZmVyIGNvbnRhaW4gYWxsIHRoZSBkYXRhIDkzMTEzMC41LmoKLQltZW1jcHkoIFRhcmdldEJ1ZmZlciwgc3JjX2J1ZmZlciwgRE9UXzExX01BQ19IRUFERVJfU0laRSApOy8vIENvcHkgaGVhZGVyCi0JcERlcy0+YnVmZmVyX2FkZHJlc3NbMF0gPSBzcmNfYnVmZmVyICsgRE9UXzExX01BQ19IRUFERVJfU0laRTsKLQlwRGVzLT5idWZmZXJfdG90YWxfc2l6ZSAtPSBET1RfMTFfTUFDX0hFQURFUl9TSVpFOwotCXBEZXMtPmJ1ZmZlcl9zaXplWzBdID0gcERlcy0+YnVmZmVyX3RvdGFsX3NpemU7Ci0KLQkvLyBTZXQgZnJhZ21lbnQgdGhyZXNob2xkCi0JRnJhZ21lbnRUaHJlc2hvbGQgLT0gKERPVF8xMV9NQUNfSEVBREVSX1NJWkUgKyA0KTsKLQlwRGVzLT5GcmFnbWVudFRocmVzaG9sZCA9IEZyYWdtZW50VGhyZXNob2xkOwotCi0JLy8gU2V0IG1vcmUgZnJhZyBiaXQKLQlUYXJnZXRCdWZmZXJbMV0gfD0gMHgwNDsvLyBTZXQgbW9yZSBmcmFnIGJpdAotCi0JLy8KLQkvLyBTZXQgdHggcmF0ZQotCS8vCi0Jc3RtcCA9ICoodTE2ICopKFRhcmdldEJ1ZmZlciszMCk7IC8vIDJuIGFsaWdubWVudCBhZGRyZXNzCi0KLQkvL1VzZSBiYXNpYyByYXRlCi0JY3RtcDEgPSBjdG1wZiA9IENVUlJFTlRfVFhfUkFURV9GT1JfTU5HOwotCi0JcERlcy0+VHhSYXRlID0gY3RtcDE7Ci0JI2lmZGVmIF9QRV9UWF9EVU1QXwotCVdCREVCVUcoKCJUeCByYXRlID0leFxuIiwgY3RtcDEpKTsKLQkjZW5kaWYKLQotCXBUMDEtPlQwMV9tb2R1bGF0aW9uX3R5cGUgPSAoY3RtcDElMykgPyAwIDogMTsKLQotCWZvciggaT0wOyBpPDI7IGkrKyApIHsKLQkJaWYoIGkgPT0gMSApCi0JCQljdG1wMSA9IGN0bXBmOwotCi0JCXBNZHMtPlR4UmF0ZVtwRGVzLT5EZXNjcmlwdG9yX0lEXVtpXSA9IGN0bXAxOyAvLyBiYWNrdXAgdGhlIHRhIHJhdGUgYW5kIGZhbGwgYmFjayByYXRlCi0KLQkJaWYoIGN0bXAxID09IDEwOCkgY3RtcDIgPSA3OwotCQllbHNlIGlmKCBjdG1wMSA9PSA5NiApIGN0bXAyID0gNjsgLy8gUmF0ZSBjb252ZXJ0IGZvciBVU0IKLQkJZWxzZSBpZiggY3RtcDEgPT0gNzIgKSBjdG1wMiA9IDU7Ci0JCWVsc2UgaWYoIGN0bXAxID09IDQ4ICkgY3RtcDIgPSA0OwotCQllbHNlIGlmKCBjdG1wMSA9PSAzNiApIGN0bXAyID0gMzsKLQkJZWxzZSBpZiggY3RtcDEgPT0gMjQgKSBjdG1wMiA9IDI7Ci0JCWVsc2UgaWYoIGN0bXAxID09IDE4ICkgY3RtcDIgPSAxOwotCQllbHNlIGlmKCBjdG1wMSA9PSAxMiApIGN0bXAyID0gMDsKLQkJZWxzZSBpZiggY3RtcDEgPT0gMjIgKSBjdG1wMiA9IDM7Ci0JCWVsc2UgaWYoIGN0bXAxID09IDExICkgY3RtcDIgPSAyOwotCQllbHNlIGlmKCBjdG1wMSA9PSA0ICApIGN0bXAyID0gMTsKLQkJZWxzZSBjdG1wMiA9IDA7IC8vIGlmKCBjdG1wMSA9PSAyICApIG9yIGRlZmF1bHQKLQotCQlpZiggaSA9PSAwICkKLQkJCXBUMDEtPlQwMV90cmFuc21pdF9yYXRlID0gY3RtcDI7Ci0JCWVsc2UKLQkJCXBUMDEtPlQwMV9mYWxsX2JhY2tfcmF0ZSA9IGN0bXAyOwotCX0KLQotCS8vCi0JLy8gU2V0IHByZWFtYmxlIHR5cGUKLQkvLwotCWlmICgocFQwMS0+VDAxX21vZHVsYXRpb25fdHlwZSA9PSAwKSAmJiAocFQwMS0+VDAxX3RyYW5zbWl0X3JhdGUgPT0gMCkpCS8vIFJBVEVfMU0KLQkJcERlcy0+UHJlYW1ibGVNb2RlID0gIFdMQU5fUFJFQU1CTEVfVFlQRV9MT05HOwotCWVsc2UKLQkJcERlcy0+UHJlYW1ibGVNb2RlID0gIENVUlJFTlRfUFJFQU1CTEVfTU9ERTsKLQlwVDAxLT5UMDFfcGxjcF9oZWFkZXJfbGVuZ3RoID0gcERlcy0+UHJlYW1ibGVNb2RlOwkvLyBTZXQgcHJlYW1ibGUKLQotfQotCi0vLyBUaGUgZnVuY3Rpb24gcmV0dXJuIHRoZSA0biBzaXplIG9mIHVzYiBwawotdTE2Ci1NZHNfQm9keUNvcHkoUEFEQVBURVIgQWRhcHRlciwgUERFU0NSSVBUT1IgcERlcywgdTggKlRhcmdldEJ1ZmZlcikKLXsKLQlQVDAwX0RFU0NSSVBUT1IJcFQwMDsKLQlQTURTCXBNZHMgPSAmQWRhcHRlci0+TWRzOwotCXU4CSpidWZmZXI7Ci0JdTgJKnNyY19idWZmZXI7Ci0JdTgJKnBjdG1wOwotCXUxNglTaXplID0gMDsKLQl1MTYJU2l6ZUxlZnQsIENvcHlTaXplLCBDb3B5TGVmdCwgc3RtcDsKLQl1OAlidWZfaW5kZXgsIEZyYWdtZW50Q291bnQgPSAwOwotCi0KLQkvLyBDb3B5IGZyYWdtZW50IGJvZHkKLQlidWZmZXIgPSBUYXJnZXRCdWZmZXI7IC8vIHNoaWZ0IDhCIHVzYiArIDI0QiA4MDIuMTEKLQlTaXplTGVmdCA9IHBEZXMtPmJ1ZmZlcl90b3RhbF9zaXplOwotCWJ1Zl9pbmRleCA9IHBEZXMtPmJ1ZmZlcl9zdGFydF9pbmRleDsKLQotCXBUMDAgPSAoUFQwMF9ERVNDUklQVE9SKWJ1ZmZlcjsKLQl3aGlsZSAoU2l6ZUxlZnQpIHsKLQkJcFQwMCA9IChQVDAwX0RFU0NSSVBUT1IpYnVmZmVyOwotCQlDb3B5U2l6ZSA9IFNpemVMZWZ0OwotCQlpZiAoU2l6ZUxlZnQgPiBwRGVzLT5GcmFnbWVudFRocmVzaG9sZCkgewotCQkJQ29weVNpemUgPSBwRGVzLT5GcmFnbWVudFRocmVzaG9sZDsKLQkJCXBUMDAtPlQwMF9mcmFtZV9sZW5ndGggPSAyNCArIENvcHlTaXplOy8vU2V0IFVTQiBsZW5ndGgKLQkJfSBlbHNlCi0JCQlwVDAwLT5UMDBfZnJhbWVfbGVuZ3RoID0gMjQgKyBTaXplTGVmdDsvL1NldCBVU0IgbGVuZ3RoCi0KLQkJU2l6ZUxlZnQgLT0gQ29weVNpemU7Ci0KLQkJLy8gMSBCeXRlIG9wZXJhdGlvbgotCQlwY3RtcCA9ICh1OCAqKSggYnVmZmVyICsgOCArIERPVF8xMV9TRVFVRU5DRV9PRkZTRVQgKTsKLQkJKnBjdG1wICY9IDB4ZjA7Ci0JCSpwY3RtcCB8PSBGcmFnbWVudENvdW50Oy8vOTMxMTMwLjUubQotCQlpZiggIUZyYWdtZW50Q291bnQgKQotCQkJcFQwMC0+VDAwX2ZpcnN0X21wZHUgPSAxOwotCi0JCWJ1ZmZlciArPSAzMjsgLy8gOEIgdXNiICsgMjRCIDgwMi4xMSBoZWFkZXIKLQkJU2l6ZSArPSAzMjsKLQotCQkvLyBDb3B5IGludG8gYnVmZmVyCi0JCXN0bXAgPSBDb3B5U2l6ZSArIDM7Ci0JCXN0bXAgJj0gfjB4MDM7Ly80biBBbGlnbm1lbnQKLQkJU2l6ZSArPSBzdG1wOy8vIEN1cnJlbnQgNG4gb2Zmc2V0IG9mIG1wZHUKLQotCQl3aGlsZSAoQ29weVNpemUpIHsKLQkJCS8vIENvcHkgYm9keQotCQkJc3JjX2J1ZmZlciA9IHBEZXMtPmJ1ZmZlcl9hZGRyZXNzW2J1Zl9pbmRleF07Ci0JCQlDb3B5TGVmdCA9IENvcHlTaXplOwotCQkJaWYgKENvcHlTaXplID49IHBEZXMtPmJ1ZmZlcl9zaXplW2J1Zl9pbmRleF0pIHsKLQkJCQlDb3B5TGVmdCA9IHBEZXMtPmJ1ZmZlcl9zaXplW2J1Zl9pbmRleF07Ci0KLQkJCQkvLyBHZXQgdGhlIG5leHQgYnVmZmVyIG9mIGRlc2NyaXB0b3IKLQkJCQlidWZfaW5kZXgrKzsKLQkJCQlidWZfaW5kZXggJT0gTUFYX0RFU0NSSVBUT1JfQlVGRkVSX0lOREVYOwotCQkJfSBlbHNlIHsKLQkJCQl1OAkqcGN0bXAgPSBwRGVzLT5idWZmZXJfYWRkcmVzc1tidWZfaW5kZXhdOwotCQkJCXBjdG1wICs9IENvcHlTaXplOwotCQkJCXBEZXMtPmJ1ZmZlcl9hZGRyZXNzW2J1Zl9pbmRleF0gPSBwY3RtcDsKLQkJCQlwRGVzLT5idWZmZXJfc2l6ZVtidWZfaW5kZXhdIC09IENvcHlTaXplOwotCQkJfQotCi0JCQltZW1jcHkoYnVmZmVyLCBzcmNfYnVmZmVyLCBDb3B5TGVmdCk7Ci0JCQlidWZmZXIgKz0gQ29weUxlZnQ7Ci0JCQlDb3B5U2l6ZSAtPSBDb3B5TGVmdDsKLQkJfQotCi0JCS8vIDkzMTEzMC41Lm4KLQkJaWYgKHBNZHMtPk1pY0FkZCkgewotCQkJaWYgKCFTaXplTGVmdCkgewotCQkJCXBNZHMtPk1pY1dyaXRlQWRkcmVzc1sgcE1kcy0+TWljV3JpdGVJbmRleCBdID0gYnVmZmVyIC0gcE1kcy0+TWljQWRkOwotCQkJCXBNZHMtPk1pY1dyaXRlU2l6ZVsgcE1kcy0+TWljV3JpdGVJbmRleCBdID0gcE1kcy0+TWljQWRkOwotCQkJCXBNZHMtPk1pY0FkZCA9IDA7Ci0JCQl9Ci0JCQllbHNlIGlmKCBTaXplTGVmdCA8IDggKSAvLzkzMTEzMC41LnAKLQkJCXsKLQkJCQlwTWRzLT5NaWNBZGQgPSBTaXplTGVmdDsKLQkJCQlwTWRzLT5NaWNXcml0ZUFkZHJlc3NbIHBNZHMtPk1pY1dyaXRlSW5kZXggXSA9IGJ1ZmZlciAtICggOCAtIFNpemVMZWZ0ICk7Ci0JCQkJcE1kcy0+TWljV3JpdGVTaXplWyBwTWRzLT5NaWNXcml0ZUluZGV4IF0gPSA4IC0gU2l6ZUxlZnQ7Ci0JCQkJcE1kcy0+TWljV3JpdGVJbmRleCsrOwotCQkJfQotCQl9Ci0KLQkJLy8gRG9lcyBpdCBuZWVkIHRvIGdlbmVyYXRlIHRoZSBuZXcgaGVhZGVyIGZvciBuZXh0IG1wZHU/Ci0JCWlmIChTaXplTGVmdCkgewotCQkJYnVmZmVyID0gVGFyZ2V0QnVmZmVyICsgU2l6ZTsgLy8gR2V0IHRoZSBuZXh0IDRuIHN0YXJ0IGFkZHJlc3MKLQkJCW1lbWNweSggYnVmZmVyLCBUYXJnZXRCdWZmZXIsIDMyICk7Ly9Db3B5IDhCIFVTQiArMjRCIDgwMi4xMQotCQkJcFQwMCA9IChQVDAwX0RFU0NSSVBUT1IpYnVmZmVyOwotCQkJcFQwMC0+VDAwX2ZpcnN0X21wZHUgPSAwOwotCQl9Ci0KLQkJRnJhZ21lbnRDb3VudCsrOwotCX0KLQotCXBUMDAtPlQwMF9sYXN0X21wZHUgPSAxOwotCXBUMDAtPlQwMF9Jc0xhc3RNcGR1ID0gMTsKLQlidWZmZXIgPSAodTggKilwVDAwICsgODsgLy8gKzggZm9yIFVTQiBoZHIKLQlidWZmZXJbMV0gJj0gfjB4MDQ7IC8vIENsZWFyIG1vcmUgZnJhZyBiaXQgb2YgODAyLjExIGZyYW1lIGNvbnRyb2wKLQlwRGVzLT5GcmFnbWVudENvdW50ID0gRnJhZ21lbnRDb3VudDsgLy8gVXBkYXRlIHRoZSBjb3JyZWN0IGZyYWdtZW50IG51bWJlcgotCXJldHVybiBTaXplOwotfQotCi0KLXZvaWQKLU1kc19EdXJhdGlvblNldCggIFBBREFQVEVSIEFkYXB0ZXIsICBQREVTQ1JJUFRPUiBwRGVzLCAgdTggKmJ1ZmZlciApCitzdGF0aWMgdm9pZCBNZHNfRHVyYXRpb25TZXQoc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyLCAgUERFU0NSSVBUT1IgcERlcywgIHU4ICpidWZmZXIpCiB7CiAJUFQwMF9ERVNDUklQVE9SCXBUMDA7CiAJUFQwMV9ERVNDUklQVE9SCXBUMDE7CiAJdTE2CUR1cmF0aW9uLCBOZXh0Qm9keUxlbiwgT2Zmc2V0U2l6ZTsKIAl1OAlSYXRlLCBpOwotCXVuc2lnbmVkIGNoYXIJQ1RTX29uID0gRkFMU0UsIFJUU19vbiA9IEZBTFNFOworCXVuc2lnbmVkIGNoYXIJQ1RTX29uID0gZmFsc2UsIFJUU19vbiA9IGZhbHNlOwogCVBUMDBfREVTQ1JJUFRPUiBwTmV4dFQwMDsKIAl1MTYgQm9keUxlbiA9IDA7Ci0JdW5zaWduZWQgY2hhciBib0dyb3VwQWRkciA9IEZBTFNFOwotCisJdW5zaWduZWQgY2hhciBib0dyb3VwQWRkciA9IGZhbHNlOwogCiAJT2Zmc2V0U2l6ZSA9IHBEZXMtPkZyYWdtZW50VGhyZXNob2xkICsgMzIgKyAzOwogCU9mZnNldFNpemUgJj0gfjB4MDM7CkBAIC00NTIsNyArNDYsNyBAQAogCXBOZXh0VDAwID0gKFBUMDBfREVTQ1JJUFRPUikoYnVmZmVyK09mZnNldFNpemUpOwogCiAJaWYoIGJ1ZmZlclsgRE9UXzExX0RBX09GRlNFVCs4IF0gJiAweDEgKSAvLyArOCBmb3IgVVNCIGhkcgotCQlib0dyb3VwQWRkciA9IFRSVUU7CisJCWJvR3JvdXBBZGRyID0gdHJ1ZTsKIAogCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCS8vIFNldCBSVFMvQ1RTIG1lY2hhbmlzbQpAQCAtNDY3LDEzICs2MSwxMyBAQAogCQlCb2R5TGVuICs9IDQ7CS8vQ1JDCiAKIAkJaWYoIEJvZHlMZW4gPj0gQ1VSUkVOVF9SVFNfVEhSRVNIT0xEICkKLQkJCVJUU19vbiA9IFRSVUU7IC8vIFVzaW5nIFJUUworCQkJUlRTX29uID0gdHJ1ZTsgLy8gVXNpbmcgUlRTCiAJCWVsc2UKIAkJewogCQkJaWYoIHBUMDEtPlQwMV9tb2R1bGF0aW9uX3R5cGUgKSAvLyBJcyB1c2luZyBPRkRNCiAJCQl7CiAJCQkJaWYoIENVUlJFTlRfUFJPVEVDVF9NRUNIQU5JU00gKSAvLyBJcyB1c2luZyBwcm90ZWN0Ci0JCQkJCUNUU19vbiA9IFRSVUU7IC8vIFVzaW5nIENUUworCQkJCQlDVFNfb24gPSB0cnVlOyAvLyBVc2luZyBDVFMKIAkJCX0KIAkJfQogCX0KQEAgLTYyNCw5ICsyMTgsMzk0IEBACiAKIH0KIAotdm9pZCBNRFNfRXRoZXJuZXRQYWNrZXRSZWNlaXZlKCAgUEFEQVBURVIgQWRhcHRlciwgIFBSWExBWUVSMSBwUnhMYXllcjEgKQorLy8gVGhlIGZ1bmN0aW9uIHJldHVybiB0aGUgNG4gc2l6ZSBvZiB1c2IgcGsKK3N0YXRpYyB1MTYgTWRzX0JvZHlDb3B5KHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciwgUERFU0NSSVBUT1IgcERlcywgdTggKlRhcmdldEJ1ZmZlcikKIHsKLQkJT1NfUkVDRUlWRV9QQUNLRVRfSU5ESUNBVEUoIEFkYXB0ZXIsIHBSeExheWVyMSApOworCVBUMDBfREVTQ1JJUFRPUglwVDAwOworCVBNRFMJcE1kcyA9ICZhZGFwdGVyLT5NZHM7CisJdTgJKmJ1ZmZlcjsKKwl1OAkqc3JjX2J1ZmZlcjsKKwl1OAkqcGN0bXA7CisJdTE2CVNpemUgPSAwOworCXUxNglTaXplTGVmdCwgQ29weVNpemUsIENvcHlMZWZ0LCBzdG1wOworCXU4CWJ1Zl9pbmRleCwgRnJhZ21lbnRDb3VudCA9IDA7CisKKworCS8vIENvcHkgZnJhZ21lbnQgYm9keQorCWJ1ZmZlciA9IFRhcmdldEJ1ZmZlcjsgLy8gc2hpZnQgOEIgdXNiICsgMjRCIDgwMi4xMQorCVNpemVMZWZ0ID0gcERlcy0+YnVmZmVyX3RvdGFsX3NpemU7CisJYnVmX2luZGV4ID0gcERlcy0+YnVmZmVyX3N0YXJ0X2luZGV4OworCisJcFQwMCA9IChQVDAwX0RFU0NSSVBUT1IpYnVmZmVyOworCXdoaWxlIChTaXplTGVmdCkgeworCQlwVDAwID0gKFBUMDBfREVTQ1JJUFRPUilidWZmZXI7CisJCUNvcHlTaXplID0gU2l6ZUxlZnQ7CisJCWlmIChTaXplTGVmdCA+IHBEZXMtPkZyYWdtZW50VGhyZXNob2xkKSB7CisJCQlDb3B5U2l6ZSA9IHBEZXMtPkZyYWdtZW50VGhyZXNob2xkOworCQkJcFQwMC0+VDAwX2ZyYW1lX2xlbmd0aCA9IDI0ICsgQ29weVNpemU7Ly9TZXQgVVNCIGxlbmd0aAorCQl9IGVsc2UKKwkJCXBUMDAtPlQwMF9mcmFtZV9sZW5ndGggPSAyNCArIFNpemVMZWZ0Oy8vU2V0IFVTQiBsZW5ndGgKKworCQlTaXplTGVmdCAtPSBDb3B5U2l6ZTsKKworCQkvLyAxIEJ5dGUgb3BlcmF0aW9uCisJCXBjdG1wID0gKHU4ICopKCBidWZmZXIgKyA4ICsgRE9UXzExX1NFUVVFTkNFX09GRlNFVCApOworCQkqcGN0bXAgJj0gMHhmMDsKKwkJKnBjdG1wIHw9IEZyYWdtZW50Q291bnQ7Ly85MzExMzAuNS5tCisJCWlmKCAhRnJhZ21lbnRDb3VudCApCisJCQlwVDAwLT5UMDBfZmlyc3RfbXBkdSA9IDE7CisKKwkJYnVmZmVyICs9IDMyOyAvLyA4QiB1c2IgKyAyNEIgODAyLjExIGhlYWRlcgorCQlTaXplICs9IDMyOworCisJCS8vIENvcHkgaW50byBidWZmZXIKKwkJc3RtcCA9IENvcHlTaXplICsgMzsKKwkJc3RtcCAmPSB+MHgwMzsvLzRuIEFsaWdubWVudAorCQlTaXplICs9IHN0bXA7Ly8gQ3VycmVudCA0biBvZmZzZXQgb2YgbXBkdQorCisJCXdoaWxlIChDb3B5U2l6ZSkgeworCQkJLy8gQ29weSBib2R5CisJCQlzcmNfYnVmZmVyID0gcERlcy0+YnVmZmVyX2FkZHJlc3NbYnVmX2luZGV4XTsKKwkJCUNvcHlMZWZ0ID0gQ29weVNpemU7CisJCQlpZiAoQ29weVNpemUgPj0gcERlcy0+YnVmZmVyX3NpemVbYnVmX2luZGV4XSkgeworCQkJCUNvcHlMZWZ0ID0gcERlcy0+YnVmZmVyX3NpemVbYnVmX2luZGV4XTsKKworCQkJCS8vIEdldCB0aGUgbmV4dCBidWZmZXIgb2YgZGVzY3JpcHRvcgorCQkJCWJ1Zl9pbmRleCsrOworCQkJCWJ1Zl9pbmRleCAlPSBNQVhfREVTQ1JJUFRPUl9CVUZGRVJfSU5ERVg7CisJCQl9IGVsc2UgeworCQkJCXU4CSpwY3RtcCA9IHBEZXMtPmJ1ZmZlcl9hZGRyZXNzW2J1Zl9pbmRleF07CisJCQkJcGN0bXAgKz0gQ29weVNpemU7CisJCQkJcERlcy0+YnVmZmVyX2FkZHJlc3NbYnVmX2luZGV4XSA9IHBjdG1wOworCQkJCXBEZXMtPmJ1ZmZlcl9zaXplW2J1Zl9pbmRleF0gLT0gQ29weVNpemU7CisJCQl9CisKKwkJCW1lbWNweShidWZmZXIsIHNyY19idWZmZXIsIENvcHlMZWZ0KTsKKwkJCWJ1ZmZlciArPSBDb3B5TGVmdDsKKwkJCUNvcHlTaXplIC09IENvcHlMZWZ0OworCQl9CisKKwkJLy8gOTMxMTMwLjUubgorCQlpZiAocE1kcy0+TWljQWRkKSB7CisJCQlpZiAoIVNpemVMZWZ0KSB7CisJCQkJcE1kcy0+TWljV3JpdGVBZGRyZXNzWyBwTWRzLT5NaWNXcml0ZUluZGV4IF0gPSBidWZmZXIgLSBwTWRzLT5NaWNBZGQ7CisJCQkJcE1kcy0+TWljV3JpdGVTaXplWyBwTWRzLT5NaWNXcml0ZUluZGV4IF0gPSBwTWRzLT5NaWNBZGQ7CisJCQkJcE1kcy0+TWljQWRkID0gMDsKKwkJCX0KKwkJCWVsc2UgaWYoIFNpemVMZWZ0IDwgOCApIC8vOTMxMTMwLjUucAorCQkJeworCQkJCXBNZHMtPk1pY0FkZCA9IFNpemVMZWZ0OworCQkJCXBNZHMtPk1pY1dyaXRlQWRkcmVzc1sgcE1kcy0+TWljV3JpdGVJbmRleCBdID0gYnVmZmVyIC0gKCA4IC0gU2l6ZUxlZnQgKTsKKwkJCQlwTWRzLT5NaWNXcml0ZVNpemVbIHBNZHMtPk1pY1dyaXRlSW5kZXggXSA9IDggLSBTaXplTGVmdDsKKwkJCQlwTWRzLT5NaWNXcml0ZUluZGV4Kys7CisJCQl9CisJCX0KKworCQkvLyBEb2VzIGl0IG5lZWQgdG8gZ2VuZXJhdGUgdGhlIG5ldyBoZWFkZXIgZm9yIG5leHQgbXBkdT8KKwkJaWYgKFNpemVMZWZ0KSB7CisJCQlidWZmZXIgPSBUYXJnZXRCdWZmZXIgKyBTaXplOyAvLyBHZXQgdGhlIG5leHQgNG4gc3RhcnQgYWRkcmVzcworCQkJbWVtY3B5KCBidWZmZXIsIFRhcmdldEJ1ZmZlciwgMzIgKTsvL0NvcHkgOEIgVVNCICsyNEIgODAyLjExCisJCQlwVDAwID0gKFBUMDBfREVTQ1JJUFRPUilidWZmZXI7CisJCQlwVDAwLT5UMDBfZmlyc3RfbXBkdSA9IDA7CisJCX0KKworCQlGcmFnbWVudENvdW50Kys7CisJfQorCisJcFQwMC0+VDAwX2xhc3RfbXBkdSA9IDE7CisJcFQwMC0+VDAwX0lzTGFzdE1wZHUgPSAxOworCWJ1ZmZlciA9ICh1OCAqKXBUMDAgKyA4OyAvLyArOCBmb3IgVVNCIGhkcgorCWJ1ZmZlclsxXSAmPSB+MHgwNDsgLy8gQ2xlYXIgbW9yZSBmcmFnIGJpdCBvZiA4MDIuMTEgZnJhbWUgY29udHJvbAorCXBEZXMtPkZyYWdtZW50Q291bnQgPSBGcmFnbWVudENvdW50OyAvLyBVcGRhdGUgdGhlIGNvcnJlY3QgZnJhZ21lbnQgbnVtYmVyCisJcmV0dXJuIFNpemU7CiB9CiAKK3N0YXRpYyB2b2lkIE1kc19IZWFkZXJDb3B5KHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsIFBERVNDUklQVE9SIHBEZXMsIHU4ICpUYXJnZXRCdWZmZXIpCit7CisJUE1EUwlwTWRzID0gJmFkYXB0ZXItPk1kczsKKwl1OAkqc3JjX2J1ZmZlciA9IHBEZXMtPmJ1ZmZlcl9hZGRyZXNzWzBdOy8vOTMxMTMwLjUuZworCVBUMDBfREVTQ1JJUFRPUglwVDAwOworCVBUMDFfREVTQ1JJUFRPUglwVDAxOworCXUxNglzdG1wOworCXU4CWksIGN0bXAxLCBjdG1wMiwgY3RtcGY7CisJdTE2CUZyYWdtZW50VGhyZXNob2xkID0gQ1VSUkVOVF9GUkFHTUVOVF9USFJFU0hPTEQ7CiAKKworCXN0bXAgPSBwRGVzLT5idWZmZXJfdG90YWxfc2l6ZTsKKwkvLworCS8vIFNldCBVU0IgaGVhZGVyIDggYnl0ZQorCS8vCisJcFQwMCA9IChQVDAwX0RFU0NSSVBUT1IpVGFyZ2V0QnVmZmVyOworCVRhcmdldEJ1ZmZlciArPSA0OworCXBUMDEgPSAoUFQwMV9ERVNDUklQVE9SKVRhcmdldEJ1ZmZlcjsKKwlUYXJnZXRCdWZmZXIgKz0gNDsKKworCXBUMDAtPnZhbHVlID0gMDsvLyBDbGVhcgorCXBUMDEtPnZhbHVlID0gMDsvLyBDbGVhcgorCisJcFQwMC0+VDAwX3R4X3BhY2tldF9pZCA9IHBEZXMtPkRlc2NyaXB0b3JfSUQ7Ly8gU2V0IHBhY2tldCBJRAorCXBUMDAtPlQwMF9oZWFkZXJfbGVuZ3RoID0gMjQ7Ly8gU2V0IGhlYWRlciBsZW5ndGgKKwlwVDAxLT5UMDFfcmV0cnlfYWJvcnRfZWJhYmxlID0gMTsvLzkyMTAxMyA5MzExMzAuNS5oCisKKwkvLyBLZXkgSUQgc2V0dXAKKwlwVDAxLT5UMDFfd2VwX2lkID0gMDsKKworCUZyYWdtZW50VGhyZXNob2xkID0gREVGQVVMVF9GUkFHTUVOVF9USFJFU0hPTEQ7CS8vRG8gbm90IGZyYWdtZW50CisJLy8gQ29weSBmdWxsIGRhdGEsIHRoZSAxJ3N0IGJ1ZmZlciBjb250YWluIGFsbCB0aGUgZGF0YSA5MzExMzAuNS5qCisJbWVtY3B5KCBUYXJnZXRCdWZmZXIsIHNyY19idWZmZXIsIERPVF8xMV9NQUNfSEVBREVSX1NJWkUgKTsvLyBDb3B5IGhlYWRlcgorCXBEZXMtPmJ1ZmZlcl9hZGRyZXNzWzBdID0gc3JjX2J1ZmZlciArIERPVF8xMV9NQUNfSEVBREVSX1NJWkU7CisJcERlcy0+YnVmZmVyX3RvdGFsX3NpemUgLT0gRE9UXzExX01BQ19IRUFERVJfU0laRTsKKwlwRGVzLT5idWZmZXJfc2l6ZVswXSA9IHBEZXMtPmJ1ZmZlcl90b3RhbF9zaXplOworCisJLy8gU2V0IGZyYWdtZW50IHRocmVzaG9sZAorCUZyYWdtZW50VGhyZXNob2xkIC09IChET1RfMTFfTUFDX0hFQURFUl9TSVpFICsgNCk7CisJcERlcy0+RnJhZ21lbnRUaHJlc2hvbGQgPSBGcmFnbWVudFRocmVzaG9sZDsKKworCS8vIFNldCBtb3JlIGZyYWcgYml0CisJVGFyZ2V0QnVmZmVyWzFdIHw9IDB4MDQ7Ly8gU2V0IG1vcmUgZnJhZyBiaXQKKworCS8vCisJLy8gU2V0IHR4IHJhdGUKKwkvLworCXN0bXAgPSAqKHUxNiAqKShUYXJnZXRCdWZmZXIrMzApOyAvLyAybiBhbGlnbm1lbnQgYWRkcmVzcworCisJLy9Vc2UgYmFzaWMgcmF0ZQorCWN0bXAxID0gY3RtcGYgPSBDVVJSRU5UX1RYX1JBVEVfRk9SX01ORzsKKworCXBEZXMtPlR4UmF0ZSA9IGN0bXAxOworCSNpZmRlZiBfUEVfVFhfRFVNUF8KKwlXQkRFQlVHKCgiVHggcmF0ZSA9JXhcbiIsIGN0bXAxKSk7CisJI2VuZGlmCisKKwlwVDAxLT5UMDFfbW9kdWxhdGlvbl90eXBlID0gKGN0bXAxJTMpID8gMCA6IDE7CisKKwlmb3IoIGk9MDsgaTwyOyBpKysgKSB7CisJCWlmKCBpID09IDEgKQorCQkJY3RtcDEgPSBjdG1wZjsKKworCQlwTWRzLT5UeFJhdGVbcERlcy0+RGVzY3JpcHRvcl9JRF1baV0gPSBjdG1wMTsgLy8gYmFja3VwIHRoZSB0YSByYXRlIGFuZCBmYWxsIGJhY2sgcmF0ZQorCisJCWlmKCBjdG1wMSA9PSAxMDgpIGN0bXAyID0gNzsKKwkJZWxzZSBpZiggY3RtcDEgPT0gOTYgKSBjdG1wMiA9IDY7IC8vIFJhdGUgY29udmVydCBmb3IgVVNCCisJCWVsc2UgaWYoIGN0bXAxID09IDcyICkgY3RtcDIgPSA1OworCQllbHNlIGlmKCBjdG1wMSA9PSA0OCApIGN0bXAyID0gNDsKKwkJZWxzZSBpZiggY3RtcDEgPT0gMzYgKSBjdG1wMiA9IDM7CisJCWVsc2UgaWYoIGN0bXAxID09IDI0ICkgY3RtcDIgPSAyOworCQllbHNlIGlmKCBjdG1wMSA9PSAxOCApIGN0bXAyID0gMTsKKwkJZWxzZSBpZiggY3RtcDEgPT0gMTIgKSBjdG1wMiA9IDA7CisJCWVsc2UgaWYoIGN0bXAxID09IDIyICkgY3RtcDIgPSAzOworCQllbHNlIGlmKCBjdG1wMSA9PSAxMSApIGN0bXAyID0gMjsKKwkJZWxzZSBpZiggY3RtcDEgPT0gNCAgKSBjdG1wMiA9IDE7CisJCWVsc2UgY3RtcDIgPSAwOyAvLyBpZiggY3RtcDEgPT0gMiAgKSBvciBkZWZhdWx0CisKKwkJaWYoIGkgPT0gMCApCisJCQlwVDAxLT5UMDFfdHJhbnNtaXRfcmF0ZSA9IGN0bXAyOworCQllbHNlCisJCQlwVDAxLT5UMDFfZmFsbF9iYWNrX3JhdGUgPSBjdG1wMjsKKwl9CisKKwkvLworCS8vIFNldCBwcmVhbWJsZSB0eXBlCisJLy8KKwlpZiAoKHBUMDEtPlQwMV9tb2R1bGF0aW9uX3R5cGUgPT0gMCkgJiYgKHBUMDEtPlQwMV90cmFuc21pdF9yYXRlID09IDApKQkvLyBSQVRFXzFNCisJCXBEZXMtPlByZWFtYmxlTW9kZSA9ICBXTEFOX1BSRUFNQkxFX1RZUEVfTE9ORzsKKwllbHNlCisJCXBEZXMtPlByZWFtYmxlTW9kZSA9ICBDVVJSRU5UX1BSRUFNQkxFX01PREU7CisJcFQwMS0+VDAxX3BsY3BfaGVhZGVyX2xlbmd0aCA9IHBEZXMtPlByZWFtYmxlTW9kZTsJLy8gU2V0IHByZWFtYmxlCisKK30KKwordm9pZAorTWRzX1R4KHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIpCit7CisJcGh3X2RhdGFfdAlwSHdEYXRhID0gJmFkYXB0ZXItPnNId0RhdGE7CisJUE1EUwkJcE1kcyA9ICZhZGFwdGVyLT5NZHM7CisJREVTQ1JJUFRPUglUeERlczsKKwlQREVTQ1JJUFRPUglwVHhEZXMgPSAmVHhEZXM7CisJdTgJCSpYbWl0QnVmQWRkcmVzczsKKwl1MTYJCVhtaXRCdWZTaXplLCBQYWNrZXRTaXplLCBzdG1wLCBDdXJyZW50U2l6ZSwgRnJhZ21lbnRUaHJlc2hvbGQ7CisJdTgJCUZpbGxJbmRleCwgVHhEZXNJbmRleCwgRnJhZ21lbnRDb3VudCwgRmlsbENvdW50OworCXVuc2lnbmVkIGNoYXIJQnVmZmVyRmlsbGVkID0gZmFsc2UsIE1JQ0FkZCA9IDA7CisKKworCWlmIChwTWRzLT5UeFBhdXNlKQorCQlyZXR1cm47CisJaWYgKCFoYWxfZHJpdmVyX2luaXRfT0socEh3RGF0YSkpCisJCXJldHVybjsKKworCS8vT25seSBvbmUgdGhyZWFkIGNhbiBiZSBydW4gaGVyZQorCWlmICghYXRvbWljX2luY19yZXR1cm4oJnBNZHMtPlR4VGhyZWFkQ291bnQpID09IDEpCisJCWdvdG8gY2xlYW51cDsKKworCS8vIFN0YXJ0IHRvIGZpbGwgdGhlIGRhdGEKKwlkbyB7CisJCUZpbGxJbmRleCA9IHBNZHMtPlR4RmlsbEluZGV4OworCQlpZiAocE1kcy0+VHhPd25lcltGaWxsSW5kZXhdKSB7IC8vIElzIG93bmVkIGJ5IHNvZnR3YXJlIDA6WWVzIDE6Tm8KKyNpZmRlZiBfUEVfVFhfRFVNUF8KKwkJCVdCREVCVUcoKCJbTWRzX1R4XSBUeCBPd25lciBpcyBIL1cuXG4iKSk7CisjZW5kaWYKKwkJCWJyZWFrOworCQl9CisKKwkJWG1pdEJ1ZkFkZHJlc3MgPSBwTWRzLT5wVHhCdWZmZXIgKyAoTUFYX1VTQl9UWF9CVUZGRVIgKiBGaWxsSW5kZXgpOyAvL0dldCBidWZmZXIKKwkJWG1pdEJ1ZlNpemUgPSAwOworCQlGaWxsQ291bnQgPSAwOworCQlkbyB7CisJCQlQYWNrZXRTaXplID0gYWRhcHRlci0+c01sbWVGcmFtZS5sZW47CisJCQlpZiAoIVBhY2tldFNpemUpCisJCQkJYnJlYWs7CisKKwkJCS8vRm9yIENoZWNrIHRoZSBidWZmZXIgcmVzb3VyY2UKKwkJCUZyYWdtZW50VGhyZXNob2xkID0gQ1VSUkVOVF9GUkFHTUVOVF9USFJFU0hPTEQ7CisJCQkvLzkzMTEzMC41LmIKKwkJCUZyYWdtZW50Q291bnQgPSBQYWNrZXRTaXplL0ZyYWdtZW50VGhyZXNob2xkICsgMTsKKwkJCXN0bXAgPSBQYWNrZXRTaXplICsgRnJhZ21lbnRDb3VudCozMiArIDg7Ly85MzExMzAuNS5jIDg6TUlDCisJCQlpZiAoKFhtaXRCdWZTaXplICsgc3RtcCkgPj0gTUFYX1VTQl9UWF9CVUZGRVIpIHsKKwkJCQlwcmludGsoIltNZHNfVHhdIEV4Y2VzcyBtYXggdHggYnVmZmVyLlxuIik7CisJCQkJYnJlYWs7IC8vIGJ1ZmZlciBpcyBub3QgZW5vdWdoCisJCQl9CisKKworCQkJLy8KKwkJCS8vIFN0YXJ0IHRyYW5zbWl0dGluZworCQkJLy8KKwkJCUJ1ZmZlckZpbGxlZCA9IHRydWU7CisKKwkJCS8qIExlYXZlcyBmaXJzdCB1OCBpbnRhY3QgKi8KKwkJCW1lbXNldCgodTggKilwVHhEZXMgKyAxLCAwLCBzaXplb2YoREVTQ1JJUFRPUikgLSAxKTsKKworCQkJVHhEZXNJbmRleCA9IHBNZHMtPlR4RGVzSW5kZXg7Ly9HZXQgdGhlIGN1cnJlbnQgSUQKKwkJCXBUeERlcy0+RGVzY3JpcHRvcl9JRCA9IFR4RGVzSW5kZXg7CisJCQlwTWRzLT5UeERlc0Zyb21bIFR4RGVzSW5kZXggXSA9IDI7Ly9TdG9yaW5nIHRoZSBpbmZvcm1hdGlvbiBvZiBzb3VyY2UgY29tbWluZyBmcm9tCisJCQlwTWRzLT5UeERlc0luZGV4Kys7CisJCQlwTWRzLT5UeERlc0luZGV4ICU9IE1BWF9VU0JfVFhfREVTQ1JJUFRPUjsKKworCQkJTUxNRV9HZXROZXh0UGFja2V0KCBhZGFwdGVyLCBwVHhEZXMgKTsKKworCQkJLy8gQ29weSBoZWFkZXIuIDhieXRlIFVTQiArIDI0Ynl0ZSA4MDIuMTFIZHIuIFNldCBUeFJhdGUsIFByZWFtYmxlIHR5cGUKKwkJCU1kc19IZWFkZXJDb3B5KCBhZGFwdGVyLCBwVHhEZXMsIFhtaXRCdWZBZGRyZXNzICk7CisKKwkJCS8vIEZvciBzcGVlZCB1cCBLZXkgc2V0dGluZworCQkJaWYgKHBUeERlcy0+RWFwRml4KSB7CisjaWZkZWYgX1BFX1RYX0RVTVBfCisJCQkJV0JERUJVRygoIjM1OiBFUEEgNHRoIGZyYW1lIGRldGVjdGVkLiBTaXplID0gJWRcbiIsIFBhY2tldFNpemUpKTsKKyNlbmRpZgorCQkJCXBId0RhdGEtPklzS2V5UHJlU2V0ID0gMTsKKwkJCX0KKworCQkJLy8gQ29weSAoZnJhZ21lbnQpIGZyYW1lIGJvZHksIGFuZCBzZXQgVVNCLCA4MDIuMTEgaGRyIGZsYWcKKwkJCUN1cnJlbnRTaXplID0gTWRzX0JvZHlDb3B5KGFkYXB0ZXIsIHBUeERlcywgWG1pdEJ1ZkFkZHJlc3MpOworCisJCQkvLyBTZXQgUlRTL0NUUyBhbmQgTm9ybWFsIGR1cmF0aW9uIGZpZWxkIGludG8gYnVmZmVyCisJCQlNZHNfRHVyYXRpb25TZXQoYWRhcHRlciwgcFR4RGVzLCBYbWl0QnVmQWRkcmVzcyk7CisKKwkJCS8vCisJCQkvLyBDYWxjdWxhdGlvbiBNSUMgZnJvbSBidWZmZXIgd2hpY2ggbWF5YmUgZnJhZ21lbnQsIHRoZW4gZmlsbCBpbnRvIHRlbXBvcmFyeSBhZGRyZXNzIDggYnl0ZQorCQkJLy8gOTMxMTMwLjUuZQorCQkJaWYgKE1JQ0FkZCkKKwkJCQlNZHNfTWljRmlsbCggYWRhcHRlciwgcFR4RGVzLCBYbWl0QnVmQWRkcmVzcyApOworCisJCQkvL1NoaWZ0IHRvIHRoZSBuZXh0IGFkZHJlc3MKKwkJCVhtaXRCdWZTaXplICs9IEN1cnJlbnRTaXplOworCQkJWG1pdEJ1ZkFkZHJlc3MgKz0gQ3VycmVudFNpemU7CisKKyNpZmRlZiBfSUJTU19CRUFDT05fU0VRX1NUSUNLXworCQkJaWYgKChYbWl0QnVmQWRkcmVzc1sgRE9UXzExX0RBX09GRlNFVCs4IF0gJiAweGZjKSAhPSBNQUNfU1VCVFlQRV9NTkdNTlRfUFJPQkVfUkVRVUVTVCkgLy8gKzggZm9yIFVTQiBoZHIKKyNlbmRpZgorCQkJCXBNZHMtPlR4VG9nZ2xlID0gdHJ1ZTsKKworCQkJLy8gR2V0IHBhY2tldCB0byB0cmFuc21pdCBjb21wbGV0ZWQsIDE6VEVTVFNUQSAyOk1MTUUgMzogTmRpcyBkYXRhCisJCQlNTE1FX1NlbmRDb21wbGV0ZShhZGFwdGVyLCAwLCB0cnVlKTsKKworCQkJLy8gU29mdHdhcmUgVFNDIGNvdW50IDIwMDYwMjE0CisJCQlwTWRzLT5UeFRzYysrOworCQkJaWYgKHBNZHMtPlR4VHNjID09IDApCisJCQkJcE1kcy0+VHhUc2NfMisrOworCisJCQlGaWxsQ291bnQrKzsgLy8gMjAwNjA5MjgKKwkJfSB3aGlsZSAoSEFMX1VTQl9NT0RFX0JVUlNUKHBId0RhdGEpKTsgLy8gRW5kIG9mIG11bHRpcGxlIE1TRFUgY29weSBsb29wLiBmYWxzZSA9IHNpbmdsZSB0cnVlID0gbXVsdGlwbGUgc2VuZGluZworCisJCS8vIE1vdmUgdG8gdGhlIG5leHQgb25lLCBpZiBuZWNlc3NhcnkKKwkJaWYgKEJ1ZmZlckZpbGxlZCkgeworCQkJLy8gc2l6ZSBzZXR0aW5nCisJCQlwTWRzLT5UeEJ1ZmZlclNpemVbIEZpbGxJbmRleCBdID0gWG1pdEJ1ZlNpemU7CisKKwkJCS8vIDIwMDYwOTI4IHNldCBUeCBjb3VudAorCQkJcE1kcy0+VHhDb3VudEluQnVmZmVyW0ZpbGxJbmRleF0gPSBGaWxsQ291bnQ7CisKKwkJCS8vIFNldCBvd25lciBmbGFnCisJCQlwTWRzLT5UeE93bmVyW0ZpbGxJbmRleF0gPSAxOworCisJCQlwTWRzLT5UeEZpbGxJbmRleCsrOworCQkJcE1kcy0+VHhGaWxsSW5kZXggJT0gTUFYX1VTQl9UWF9CVUZGRVJfTlVNQkVSOworCQkJQnVmZmVyRmlsbGVkID0gZmFsc2U7CisJCX0gZWxzZQorCQkJYnJlYWs7CisKKwkJaWYgKCFQYWNrZXRTaXplKSAvLyBObyBtb3JlIHBrIGZvciB0cmFuc21pdHRpbmcKKwkJCWJyZWFrOworCisJfSB3aGlsZSh0cnVlKTsKKworCS8vCisJLy8gU3RhcnQgdG8gc2VuZCBieSBsb3dlciBtb2R1bGUKKwkvLworCWlmICghcEh3RGF0YS0+SXNLZXlQcmVTZXQpCisJCVdiMzVUeF9zdGFydChhZGFwdGVyKTsKKworIGNsZWFudXA6CisJYXRvbWljX2RlYygmcE1kcy0+VHhUaHJlYWRDb3VudCk7Cit9CisKK3ZvaWQKK01kc19TZW5kQ29tcGxldGUoc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlciwgUFQwMl9ERVNDUklQVE9SIHBUMDIpCit7CisJUE1EUwlwTWRzID0gJmFkYXB0ZXItPk1kczsKKwlwaHdfZGF0YV90CXBId0RhdGEgPSAmYWRhcHRlci0+c0h3RGF0YTsKKwl1OAlQYWNrZXRJZCA9ICh1OClwVDAyLT5UMDJfVHhfUGt0SUQ7CisJdW5zaWduZWQgY2hhcglTZW5kT0sgPSB0cnVlOworCXU4CVJldHJ5Q291bnQsIFR4UmF0ZTsKKworCWlmIChwVDAyLT5UMDJfSWdub3JlUmVzdWx0KSAvLyBEb24ndCBjYXJlIHRoZSByZXN1bHQKKwkJcmV0dXJuOworCWlmIChwVDAyLT5UMDJfSXNMYXN0TXBkdSkgeworCQkvL1RPRE86IERUTyAtLSBnZXQgdGhlIHJldHJ5IGNvdW50IGFuZCBmcmFnbWVudCBjb3VudAorCQkvLyBUeCByYXRlCisJCVR4UmF0ZSA9IHBNZHMtPlR4UmF0ZVsgUGFja2V0SWQgXVsgMCBdOworCQlSZXRyeUNvdW50ID0gKHU4KXBUMDItPlQwMl9NUERVX0NudDsKKwkJaWYgKHBUMDItPnZhbHVlICYgRkxBR19FUlJPUl9UWF9NQVNLKSB7CisJCQlTZW5kT0sgPSBmYWxzZTsKKworCQkJaWYgKHBUMDItPlQwMl90cmFuc21pdF9hYm9ydCB8fCBwVDAyLT5UMDJfb3V0X29mX01heFR4TVNEVUxpZnRUaW1lKSB7CisJCQkJLy9yZXRyeSBlcnJvcgorCQkJCXBId0RhdGEtPmR0b190eF9yZXRyeV9jb3VudCArPSAoUmV0cnlDb3VudCsxKTsKKwkJCQkvL1tmb3IgdHggZGVidWddCisJCQkJaWYgKFJldHJ5Q291bnQ8NykKKwkJCQkJcEh3RGF0YS0+dHhfcmV0cnlfY291bnRbUmV0cnlDb3VudF0gKz0gUmV0cnlDb3VudDsKKwkJCQllbHNlCisJCQkJCXBId0RhdGEtPnR4X3JldHJ5X2NvdW50WzddICs9IFJldHJ5Q291bnQ7CisJCQkJI2lmZGVmIF9QRV9TVEFURV9EVU1QXworCQkJCVdCREVCVUcoKCJkdG9fdHhfcmV0cnlfY291bnQgPSVkXG4iLCBwSHdEYXRhLT5kdG9fdHhfcmV0cnlfY291bnQpKTsKKwkJCQkjZW5kaWYKKwkJCQlNVE9fU2V0VHhDb3VudChhZGFwdGVyLCBUeFJhdGUsIFJldHJ5Q291bnQpOworCQkJfQorCQkJcEh3RGF0YS0+ZHRvX3R4X2ZyYWdfY291bnQgKz0gKFJldHJ5Q291bnQrMSk7CisKKwkJCS8vW2ZvciB0eCBkZWJ1Z10KKwkJCWlmIChwVDAyLT5UMDJfdHJhbnNtaXRfYWJvcnRfZHVlX3RvX1RCVFQpCisJCQkJcEh3RGF0YS0+dHhfVEJUVF9zdGFydF9jb3VudCsrOworCQkJaWYgKHBUMDItPlQwMl90cmFuc21pdF93aXRob3V0X2VuY3J5cHRpb25fZHVlX3RvX3dlcF9vbl9mYWxzZSkKKwkJCQlwSHdEYXRhLT50eF9XZXBPbl9mYWxzZV9jb3VudCsrOworCQkJaWYgKHBUMDItPlQwMl9kaXNjYXJkX2R1ZV90b19udWxsX3dlcF9rZXkpCisJCQkJcEh3RGF0YS0+dHhfTnVsbF9rZXlfY291bnQrKzsKKwkJfSBlbHNlIHsKKwkJCWlmIChwVDAyLT5UMDJfZWZmZWN0aXZlX3RyYW5zbWlzc2lvbl9yYXRlKQorCQkJCXBId0RhdGEtPnR4X0VUUl9jb3VudCsrOworCQkJTVRPX1NldFR4Q291bnQoYWRhcHRlciwgVHhSYXRlLCBSZXRyeUNvdW50KTsKKwkJfQorCisJCS8vIENsZWFyIHNlbmQgcmVzdWx0IGJ1ZmZlcgorCQlwTWRzLT5UeFJlc3VsdFsgUGFja2V0SWQgXSA9IDA7CisJfSBlbHNlCisJCXBNZHMtPlR4UmVzdWx0WyBQYWNrZXRJZCBdIHw9ICgodTE2KShwVDAyLT52YWx1ZSAmIDB4MGZmZmYpKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21kc19mLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tZHNfZi5oCmluZGV4IDdhNjgyZDQuLmVlMGYxMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21kc19mLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWRzX2YuaApAQCAtMSwzMyArMSwyMyBAQAotdW5zaWduZWQgY2hhciBNZHNfaW5pdGlhbCggIFBBREFQVEVSIEFkYXB0ZXIgKTsKLXZvaWQgTWRzX0Rlc3Ryb3koICBQQURBUFRFUiBBZGFwdGVyICk7Ci12b2lkIE1kc19UeCggIFBBREFQVEVSIEFkYXB0ZXIgKTsKLXZvaWQgTWRzX0hlYWRlckNvcHkoICBQQURBUFRFUiBBZGFwdGVyLCAgUERFU0NSSVBUT1IgcERlcywgIHU4ICpUYXJnZXRCdWZmZXIgKTsKLXUxNiBNZHNfQm9keUNvcHkoICBQQURBUFRFUiBBZGFwdGVyLCAgUERFU0NSSVBUT1IgcERlcywgIHU4ICpUYXJnZXRCdWZmZXIgKTsKLXZvaWQgTWRzX0R1cmF0aW9uU2V0KCAgUEFEQVBURVIgQWRhcHRlciwgIFBERVNDUklQVE9SIHBEZXMsICB1OCAqVGFyZ2V0QnVmZmVyICk7Ci12b2lkIE1kc19TZW5kQ29tcGxldGUoICBQQURBUFRFUiBBZGFwdGVyLCAgUFQwMl9ERVNDUklQVE9SIHBUMDIgKTsKLXZvaWQgTWRzX01wZHVQcm9jZXNzKCAgUEFEQVBURVIgQWRhcHRlciwgIFBERVNDUklQVE9SIHBSeERlcyApOwotdm9pZCBNZHNfcmVzZXRfZGVzY3JpcHRvciggIFBBREFQVEVSIEFkYXB0ZXIgKTsKKyNpZm5kZWYgX19XSU5CT05EX01EU19GX0gKKyNkZWZpbmUgX19XSU5CT05EX01EU19GX0gKKworI2luY2x1ZGUgIndiaGFsX3MuaCIKKyNpbmNsdWRlICJjb3JlLmgiCisKK3Vuc2lnbmVkIGNoYXIgTWRzX2luaXRpYWwoICBzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIgKTsKK3ZvaWQgTWRzX0Rlc3Ryb3koICBzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIgKTsKK3ZvaWQgTWRzX1R4KCAgc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyICk7Cit2b2lkIE1kc19TZW5kQ29tcGxldGUoICBzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIsICBQVDAyX0RFU0NSSVBUT1IgcFQwMiApOwordm9pZCBNZHNfTXBkdVByb2Nlc3MoICBzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIsICBQREVTQ1JJUFRPUiBwUnhEZXMgKTsKIGV4dGVybiB2b2lkIERhdGFEbXAodTggKnBkYXRhLCB1MzIgbGVuLCB1MzIgb2Zmc2V0KTsKIAotCi12b2lkIHZSeFRpbWVySW5pdChQV0IzMl9BREFQVEVSIEFkYXB0ZXIpOwotdm9pZCB2UnhUaW1lclN0YXJ0KFBXQjMyX0FEQVBURVIgQWRhcHRlciwgaW50IHRpbWVvdXRfdmFsdWUpOwotdm9pZCBSeFRpbWVySGFuZGxlcl8xYSggUEFEQVBURVIgQWRhcHRlcik7Ci12b2lkIHZSeFRpbWVyU3RvcChQV0IzMl9BREFQVEVSIEFkYXB0ZXIpOwotdm9pZCBSeFRpbWVySGFuZGxlciggdm9pZCoJCQlTeXN0ZW1TcGVjaWZpYzEsCi0JCQkJCSAgIFBXQjMyX0FEQVBURVIgCUFkYXB0ZXIsCi0JCQkJCSAgIHZvaWQqCQkJU3lzdGVtU3BlY2lmaWMyLAotCQkJCQkgICB2b2lkKgkJCVN5c3RlbVNwZWNpZmljMyk7Ci0KLQogLy8gRm9yIEFzeW5jaHJvbm91cyBpbmRpY2F0aW5nLiBUaGUgcm91dGluZSBjb2xsb2NhdGVzIHdpdGggVVNCLgotdm9pZCBNZHNfTXNkdVByb2Nlc3MoICBQV0IzMl9BREFQVEVSIEFkYXB0ZXIsICBQUlhMQVlFUjEgcFJ4TGF5ZXIxLCAgdTggU2xvdEluZGV4KTsKK3ZvaWQgTWRzX01zZHVQcm9jZXNzKCAgc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyLCAgUFJYTEFZRVIxIHBSeExheWVyMSwgIHU4IFNsb3RJbmRleCk7CiAKIC8vIEZvciBkYXRhIGZyYW1lIHNlbmRpbmcgMjAwNjA4MDIKLXUxNiBNRFNfR2V0UGFja2V0U2l6ZSggIFBBREFQVEVSIEFkYXB0ZXIgKTsKLXZvaWQgTURTX0dldE5leHRQYWNrZXQoICBQQURBUFRFUiBBZGFwdGVyLCAgUERFU0NSSVBUT1IgcERlcyApOwotdm9pZCBNRFNfR2V0TmV4dFBhY2tldENvbXBsZXRlKCAgUEFEQVBURVIgQWRhcHRlciwgIFBERVNDUklQVE9SIHBEZXMgKTsKLXZvaWQgTURTX1NlbmRSZXN1bHQoICBQQURBUFRFUiBBZGFwdGVyLCAgdTggUGFja2V0SWQsICB1bnNpZ25lZCBjaGFyIFNlbmRPSyApOwotdm9pZCBNRFNfRXRoZXJuZXRQYWNrZXRSZWNlaXZlKCAgUEFEQVBURVIgQWRhcHRlciwgIFBSWExBWUVSMSBwUnhMYXllcjEgKTsKK3UxNiBNRFNfR2V0UGFja2V0U2l6ZSggIHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciApOwordm9pZCBNRFNfR2V0TmV4dFBhY2tldCggIHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciwgIFBERVNDUklQVE9SIHBEZXMgKTsKK3ZvaWQgTURTX0dldE5leHRQYWNrZXRDb21wbGV0ZSggIHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciwgIFBERVNDUklQVE9SIHBEZXMgKTsKK3ZvaWQgTURTX1NlbmRSZXN1bHQoICBzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIsICB1OCBQYWNrZXRJZCwgIHVuc2lnbmVkIGNoYXIgU2VuZE9LICk7CiAKLQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tZHNfcy5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWRzX3MuaAppbmRleCA5ZGYyZTA5Li5lYmY2MWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tZHNfcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21kc19zLmgKQEAgLTEsOSArMSwxOSBAQAorI2lmbmRlZiBfX1dJTkJPTkRfTURTX0gKKyNkZWZpbmUgX19XSU5CT05EX01EU19ICisKKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorCisjaW5jbHVkZSAibG9jYWxwYXJhLmgiCisjaW5jbHVkZSAibWFjX3N0cnVjdHVyZXMuaCIKKyNpbmNsdWRlICJzY2FuX3MuaCIKKwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICNkZWZpbmUgTUFYX1VTQl9UWF9ERVNDUklQVE9SCQkxNQkJLy8gSVM4OUMzNSBhYmlsaXR5CiAjZGVmaW5lIE1BWF9VU0JfVFhfQlVGRkVSX05VTUJFUgk0CQkvLyBWaXJ0dWFsIHByZS1idWZmZXIgbnVtYmVyIG9mIE1BWF9VU0JfVFhfQlVGRkVSCiAjZGVmaW5lIE1BWF9VU0JfVFhfQlVGRkVSCQkJNDA5NgkvLyBJUzg5QzM1IGFiaWxpdHkgNG4gYWxpZ25tZW50IGlzIHJlcXVpcmVkIGZvciBoYXJkd2FyZQogCi0jZGVmaW5lIE1EU19FVkVOVF9JTkRJQ0FURSggX0EsIF9CLCBfRiApCU9TX0VWRU5UX0lORElDQVRFKCBfQSwgX0IsIF9GICkKICNkZWZpbmUgQVVUSF9SRVFVRVNUX1BBSVJXSVNFX0VSUk9SCQkJMAkJLy8gX0YgZmxhZyBzZXR0aW5nCiAjZGVmaW5lIEFVVEhfUkVRVUVTVF9HUk9VUF9FUlJPUgkJCTEJCS8vIF9GIGZsYWcgc2V0dGluZwogCkBAIC0yMSwyMCArMzEsMTkgQEAKICNkZWZpbmUgQ1VSUkVOVF9QQUlSV0lTRV9LRVkJCQlwc1NNRS0+dHhfbWljX2tleQogI2RlZmluZSBDVVJSRU5UX0dST1VQX0tFWQkJCQlwc1NNRS0+Z3JvdXBfdHhfbWljX2tleQogI2RlZmluZSBDVVJSRU5UX0VOQ1JZUFRfU1RBVFVTCQkJcHNTTUUtPmVuY3J5cHRfc3RhdHVzCi0jZGVmaW5lIENVUlJFTlRfV0VQX0lECQkJCQlBZGFwdGVyLT5zU21lUGFyYS5fZG90MTFXRVBEZWZhdWx0S2V5SUQKLSNkZWZpbmUgQ1VSUkVOVF9DT05UUk9MX1BPUlRfQkxPQ0sJCSggcHNTTUUtPndwYV9vayE9MSB8fCAoQWRhcHRlci0+TWRzLmJvQ291bnRlck1lYXN1cmVCbG9jaz09MSAmJiAoQ1VSUkVOVF9FTkNSWVBUX1NUQVRVUz09RU5DUllQVF9US0lQKSkgKQotI2RlZmluZSBDVVJSRU5UX0ZSQUdNRU5UX1RIUkVTSE9MRAkJKEFkYXB0ZXItPk1kcy5UeEZyYWdtZW50VGhyZXNob2xkICYgfjB4MSkKKyNkZWZpbmUgQ1VSUkVOVF9XRVBfSUQJCQkJCWFkYXB0ZXItPnNTbWVQYXJhLl9kb3QxMVdFUERlZmF1bHRLZXlJRAorI2RlZmluZSBDVVJSRU5UX0NPTlRST0xfUE9SVF9CTE9DSwkJKCBwc1NNRS0+d3BhX29rIT0xIHx8IChhZGFwdGVyLT5NZHMuYm9Db3VudGVyTWVhc3VyZUJsb2NrPT0xICYmIChDVVJSRU5UX0VOQ1JZUFRfU1RBVFVTPT1FTkNSWVBUX1RLSVApKSApCisjZGVmaW5lIENVUlJFTlRfRlJBR01FTlRfVEhSRVNIT0xECQkoYWRhcHRlci0+TWRzLlR4RnJhZ21lbnRUaHJlc2hvbGQgJiB+MHgxKQogI2RlZmluZSBDVVJSRU5UX1BSRUFNQkxFX01PREUJCQlwc0xPQ0FMLT5ib1Nob3J0UHJlYW1ibGU/V0xBTl9QUkVBTUJMRV9UWVBFX1NIT1JUOldMQU5fUFJFQU1CTEVfVFlQRV9MT05HCi0jZGVmaW5lIENVUlJFTlRfTElOS19PTgkJCQkJT1NfTElOS19TVEFUVVMKLSNkZWZpbmUgQ1VSUkVOVF9UWF9SQVRFCQkJCQlBZGFwdGVyLT5zTG9jYWxQYXJhLkN1cnJlbnRUeFJhdGUKLSNkZWZpbmUgQ1VSUkVOVF9GQUxMX0JBQ0tfVFhfUkFURQkJQWRhcHRlci0+c0xvY2FsUGFyYS5DdXJyZW50VHhGYWxsYmFja1JhdGUKLSNkZWZpbmUgQ1VSUkVOVF9UWF9SQVRFX0ZPUl9NTkcJCQlBZGFwdGVyLT5zTG9jYWxQYXJhLkN1cnJlbnRUeFJhdGVGb3JNbmcKKyNkZWZpbmUgQ1VSUkVOVF9UWF9SQVRFCQkJCQlhZGFwdGVyLT5zTG9jYWxQYXJhLkN1cnJlbnRUeFJhdGUKKyNkZWZpbmUgQ1VSUkVOVF9GQUxMX0JBQ0tfVFhfUkFURQkJYWRhcHRlci0+c0xvY2FsUGFyYS5DdXJyZW50VHhGYWxsYmFja1JhdGUKKyNkZWZpbmUgQ1VSUkVOVF9UWF9SQVRFX0ZPUl9NTkcJCQlhZGFwdGVyLT5zTG9jYWxQYXJhLkN1cnJlbnRUeFJhdGVGb3JNbmcKICNkZWZpbmUgQ1VSUkVOVF9QUk9URUNUX01FQ0hBTklTTQkJcHNMT0NBTC0+Ym9Qcm90ZWN0TWVjaGFuaXNtCi0jZGVmaW5lIENVUlJFTlRfUlRTX1RIUkVTSE9MRAkJCUFkYXB0ZXItPk1kcy5UeFJUU1RocmVzaG9sZAorI2RlZmluZSBDVVJSRU5UX1JUU19USFJFU0hPTEQJCQlhZGFwdGVyLT5NZHMuVHhSVFNUaHJlc2hvbGQKIAotI2RlZmluZSBNSUJfR1NfWE1JVF9PS19JTkMJCQkJQWRhcHRlci0+c0xvY2FsUGFyYS5HU19YTUlUX09LKysKLSNkZWZpbmUgTUlCX0dTX1JDVl9PS19JTkMJCQkJQWRhcHRlci0+c0xvY2FsUGFyYS5HU19SQ1ZfT0srKwotI2RlZmluZSBNSUJfR1NfWE1JVF9FUlJPUl9JTkMJCQlBZGFwdGVyLT5zTG9jYWxQYXJhLkdTX1hNSVRfRVJST1IKKyNkZWZpbmUgTUlCX0dTX1hNSVRfT0tfSU5DCQkJCWFkYXB0ZXItPnNMb2NhbFBhcmEuR1NfWE1JVF9PSysrCisjZGVmaW5lIE1JQl9HU19SQ1ZfT0tfSU5DCQkJCWFkYXB0ZXItPnNMb2NhbFBhcmEuR1NfUkNWX09LKysKKyNkZWZpbmUgTUlCX0dTX1hNSVRfRVJST1JfSU5DCQkJYWRhcHRlci0+c0xvY2FsUGFyYS5HU19YTUlUX0VSUk9SCiAKIC8vLS0tLS0tLS0tLSBUWCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogI2RlZmluZSBFVEhFUk5FVF9UWF9ERVNDUklQVE9SUyAgICAgICAgIE1BWF9VU0JfVFhfQlVGRkVSX05VTUJFUgpAQCAtOTYsOSArMTA1LDkgQEAKIAl1OAlTY2FuVHhQYXVzZTsJLy9kYXRhIFR4IHBhdXNlIGJlY2F1c2UgdGhlIHNjYW5uaW5nIGlzIHByb2dyZXNzaW5nLCBidXQgcHJvYmUgcmVxdWVzdCBUeCB3b24ndC4KIAl1OAlUeFBhdXNlOy8vRm9yIHBhdXNlIHRoZSBNZHNfVHggbW9kdWx0CiAKLQlPU19BVE9NSUMJVHhUaHJlYWRDb3VudDsvL0ZvciB0aHJlYWQgY291bnRpbmcgOTMxMTMwLjQudgorCWF0b21pY190CVR4VGhyZWFkQ291bnQ7Ly9Gb3IgdGhyZWFkIGNvdW50aW5nIDkzMTEzMC40LnYKIC8vOTUwMzAxIGRlbGV0ZSBkdWUgdG8gSFcKLS8vCU9TX0FUT01JQwlUeENvbmN1cnJlbnRDb3VudDsvLzkzMTEzMC40LncKKy8vCWF0b21pY190CVR4Q29uY3VycmVudENvdW50Oy8vOTMxMTMwLjQudwogCiAJdTE2CVR4UmVzdWx0WyAoKE1BWF9VU0JfVFhfREVTQ1JJUFRPUiArIDEpICYgfjB4MDEpIF07Ly9Db2xsZWN0IHRoZSBzZW5kaW5nIHJlc3VsdCBvZiBNcGR1CiAKQEAgLTEzMyw5ICsxNDIsNiBAQAogCXU4CQlib0NvdW50ZXJNZWFzdXJlQmxvY2s7CiAJdTgJCXJlc2VydmVkXzRbMl07CiAKLQkvL05ESVNfTUlOSVBPUlRfVElNRVIJblRpbWVyOwotCU9TX1RJTUVSCW5UaW1lcjsKLQogCXUzMglUeFRzYzsgLy8gMjAwNjAyMTQKIAl1MzIJVHhUc2NfMjsgLy8gMjAwNjAyMTQKIApAQCAtMTgwLDQgKzE4Niw0IEBACiAKIH1SWExBWUVSMSwgKiBQUlhMQVlFUjE7CiAKLQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tbG1lX21pYi5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWxtZV9taWIuaAppbmRleCA4OTc1OTczLi5jYTg5MjJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tbG1lX21pYi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21sbWVfbWliLmgKQEAgLTIyLDE1ICsyMiwxNSBAQAogLy8gICBTZXQgdGhlIGRvdDExRXhjbHVkZVVuZW5jcnlwdGVkIHZhbHVlLgogLy8KIC8vIEFyZ3VtZW50czoKLS8vICAgQWRhcHRlciAgICAgICAgLSBUaGUgcG9pbnRlciB0byB0aGUgbWluaXBvcnQgYWRhcHRlciBjb250ZXh0LgorLy8gICBhZGFwdGVyICAgICAgICAtIFRoZSBwb2ludGVyIHRvIHRoZSBtaW5pcG9ydCBhZGFwdGVyIGNvbnRleHQuCiAvLyAgIEV4VW5lbmNyeXB0ZWQgIC0gdW5zaWduZWQgY2hhciB0eXBlLiBUaGUgdmFsdWUgdG8gYmUgc2V0LgogLy8KIC8vIFJldHVybiB2YWx1ZXM6CiAvLyAgIE5vbmUuCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSNkZWZpbmUgTUxNRVNldEV4Y2x1ZGVVbmVuY3J5cHRlZChBZGFwdGVyLCBFeFVuZW5jcnlwdGVkKSAgICAgXAorI2RlZmluZSBNTE1FU2V0RXhjbHVkZVVuZW5jcnlwdGVkKGFkYXB0ZXIsIEV4VW5lbmNyeXB0ZWQpICAgICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKEFkYXB0ZXIpLT5zTG9jYWxQYXJhLkV4Y2x1ZGVVbmVuY3J5cHRlZCA9IEV4VW5lbmNyeXB0ZWQ7ICAgICAgICAgICAgIFwKKyAgICAoYWRhcHRlciktPnNMb2NhbFBhcmEuRXhjbHVkZVVuZW5jcnlwdGVkID0gRXhVbmVuY3J5cHRlZDsgICAgICAgICAgICAgXAogfQogCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTQwLDEyICs0MCwxMiBAQAogLy8gICBHZXQgdGhlIGRvdDExRXhjbHVkZVVuZW5jcnlwdGVkIHZhbHVlLgogLy8KIC8vIEFyZ3VtZW50czoKLS8vICAgQWRhcHRlciAgICAgICAgLSBUaGUgcG9pbnRlciB0byB0aGUgbWluaXBvcnQgYWRhcHRlciBjb250ZXh0LgorLy8gICBhZGFwdGVyICAgICAgICAtIFRoZSBwb2ludGVyIHRvIHRoZSBtaW5pcG9ydCBhZGFwdGVyIGNvbnRleHQuCiAvLwogLy8gUmV0dXJuIHZhbHVlczoKIC8vICAgdW5zaWduZWQgY2hhciB0eXBlLiBUaGUgY3VycmVudCBkb3QxMUV4Y2x1ZGVVbmVuY3J5cHRlZCB2YWx1ZS4KIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotI2RlZmluZSBNTE1FR2V0RXhjbHVkZVVuZW5jcnlwdGVkKEFkYXB0ZXIpICgodW5zaWduZWQgY2hhcikgKEFkYXB0ZXIpLT5zTG9jYWxQYXJhLkV4Y2x1ZGVVbmVuY3J5cHRlZCkKKyNkZWZpbmUgTUxNRUdldEV4Y2x1ZGVVbmVuY3J5cHRlZChhZGFwdGVyKSAoKHVuc2lnbmVkIGNoYXIpIChhZGFwdGVyKS0+c0xvY2FsUGFyYS5FeGNsdWRlVW5lbmNyeXB0ZWQpCiAKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gTUxNRVNldE1heFJlY2VpdmVMaWZlVGltZSAtLQpAQCAtNTQsMTUgKzU0LDE1IEBACiAvLyAgIFNldCB0aGUgZG90MTFNYXhSZWNlaXZlTGlmZVRpbWUgdmFsdWUuCiAvLwogLy8gQXJndW1lbnRzOgotLy8gICBBZGFwdGVyICAgICAgICAtIFRoZSBwb2ludGVyIHRvIHRoZSBtaW5pcG9ydCBhZGFwdGVyIGNvbnRleHQuCisvLyAgIGFkYXB0ZXIgICAgICAgIC0gVGhlIHBvaW50ZXIgdG8gdGhlIG1pbmlwb3J0IGFkYXB0ZXIgY29udGV4dC4KIC8vICAgUmVjZWl2ZUxpZmVUaW1lLSB1MzIgdHlwZS4gVGhlIHZhbHVlIHRvIGJlIHNldC4KIC8vCiAvLyBSZXR1cm4gdmFsdWVzOgogLy8gICBOb25lLgogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jZGVmaW5lIE1MTUVTZXRNYXhSZWNlaXZlTGlmZVRpbWUoQWRhcHRlciwgUmVjZWl2ZUxpZmVUaW1lKSAgICBcCisjZGVmaW5lIE1MTUVTZXRNYXhSZWNlaXZlTGlmZVRpbWUoYWRhcHRlciwgUmVjZWl2ZUxpZmVUaW1lKSAgICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIChBZGFwdGVyKS0+TWRzLk1heFJlY2VpdmVUaW1lID0gUmVjZWl2ZUxpZmVUaW1lOyAgICAgICAgICAgICAgICBcCisgICAgKGFkYXB0ZXIpLT5NZHMuTWF4UmVjZWl2ZVRpbWUgPSBSZWNlaXZlTGlmZVRpbWU7ICAgICAgICAgICAgICAgIFwKIH0KIAogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC03MiwxMiArNzIsMTIgQEAKIC8vICAgR2V0IHRoZSBkb3QxMU1heFJlY2VpdmVMaWZlVGltZSB2YWx1ZS4KIC8vCiAvLyBBcmd1bWVudHM6Ci0vLyAgIEFkYXB0ZXIgICAgICAgIC0gVGhlIHBvaW50ZXIgdG8gdGhlIG1pbmlwb3J0IGFkYXB0ZXIgY29udGV4dC4KKy8vICAgYWRhcHRlciAgICAgICAgLSBUaGUgcG9pbnRlciB0byB0aGUgbWluaXBvcnQgYWRhcHRlciBjb250ZXh0LgogLy8KIC8vIFJldHVybiB2YWx1ZXM6CiAvLyAgIHUzMiB0eXBlLiBUaGUgY3VycmVudCBkb3QxMU1heFJlY2VpdmVMaWZlVGltZSB2YWx1ZS4KIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotI2RlZmluZSBNTE1FR2V0TWF4UmVjZWl2ZUxpZmVUaW1lKEFkYXB0ZXIpICgodTMyKSAoQWRhcHRlciktPk1kcy5NYXhSZWNlaXZlVGltZSkKKyNkZWZpbmUgTUxNRUdldE1heFJlY2VpdmVMaWZlVGltZShhZGFwdGVyKSAoKHUzMikgKGFkYXB0ZXIpLT5NZHMuTWF4UmVjZWl2ZVRpbWUpCiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tbG1lX3MuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21sbWVfcy5oCmluZGV4IDAzOWZkNDAuLmVhMTI2ODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21sbWVfcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21sbWVfcy5oCkBAIC0xLDMgKzEsMTIgQEAKKyNpZm5kZWYgX19XSU5CT05EX01MTUVfSAorI2RlZmluZSBfX1dJTkJPTkRfTUxNRV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlICJtYWNfc3RydWN0dXJlcy5oIgorI2luY2x1ZGUgIm1kc19zLmgiCisKIC8vKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIC8vCU1sbWUuaAogLy8JCURlZmluZSB0aGUgcmVsYXRlZCBkZWZpbml0aW9ucyBvZiBNTE1FIG1vZHVsZQpAQCAtMTkyLDQgKzIwMSw0IEBACiAKIH1fX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgUlhEQVRBLCAqcHNSWERBVEE7CiAKLQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tbG1ldHhyeC5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWxtZXR4cnguYwppbmRleCBlODUzM2I4ZDEuLjA3ODAyYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21sbWV0eHJ4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWxtZXR4cnguYwpAQCAtMTcsMTEzICsxNyw1NiBAQAogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAjaW5jbHVkZSAib3NfY29tbW9uLmgiCiAKLXZvaWQgTUxNRVJlc2V0VHhSeChQV0IzMl9BREFQVEVSIEFkYXB0ZXIpCi17Ci0JczMyICAgICBpOwotCi0JLy8gUmVzZXQgdGhlIGludGVyZmFjZSBiZXR3ZWVuIE1EUyBhbmQgTUxNRQotCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX1RYX01NUERVOyBpKyspCi0JCUFkYXB0ZXItPnNNbG1lRnJhbWUuVHhNTVBEVUluVXNlW2ldID0gRkFMU0U7Ci0JZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fUlhfTU1QRFU7IGkrKykKLQkJQWRhcHRlci0+c01sbWVGcmFtZS5TYXZlUnhCdWZTbG90SW5Vc2VbaV0gPSBGQUxTRTsKLQotCUFkYXB0ZXItPnNNbG1lRnJhbWUud051bVJ4TU1QRFVJbk1MTUUgICA9IDA7Ci0JQWRhcHRlci0+c01sbWVGcmFtZS53TnVtUnhNTVBEVURpc2NhcmRlZCA9IDA7Ci0JQWRhcHRlci0+c01sbWVGcmFtZS53TnVtUnhNTVBEVSAgICAgICAgICA9IDA7Ci0JQWRhcHRlci0+c01sbWVGcmFtZS53TnVtVHhNTVBEVURpc2NhcmRlZCA9IDA7Ci0JQWRhcHRlci0+c01sbWVGcmFtZS53TnVtVHhNTVBEVSAgICAgICAgICA9IDA7Ci0JQWRhcHRlci0+c0xvY2FsUGFyYS5ib0NDQWJ1c3kgICAgPSBGQUxTRTsKLQlBZGFwdGVyLT5zTG9jYWxQYXJhLmlQb3dlclNhdmVNb2RlICAgICA9IFBXUl9BQ1RJVkU7ICAgICAvLyBQb3dlciBhY3RpdmUKLX0KKyNpbmNsdWRlICJtZHNfZi5oIgogCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLwlGdW5jdGlvbjoKLS8vICAgIE1MTUVHZXRNTVBEVUJ1ZmZlcigpCi0vLwotLy8JRGVzY3JpcHRpb246Ci0vLyAgICBSZXR1cm4gdGhlIHBvaW50ZXIgdG8gYW4gYXZhaWxhYmxlIGRhdGEgYnVmZmVyIHdpdGgKLS8vICAgIHRoZSBzaXplIE1BWF9NTVBEVV9TSVpFIGZvciBhIE1NUERVLgotLy8KLS8vICBBcmd1bWVudHM6Ci0vLyAgICBBZGFwdGVyICAgLSBwb2ludGVyIHRvIHRoZSBtaW5pcG9ydCBhZGFwdGVyIGNvbnRleHQuCi0vLwotLy8JUmV0dXJuIHZhbHVlOgotLy8gICAgTlVMTCAgICAgOiBObyBhdmFpbGFibGUgZGF0YSBidWZmZXIgYXZhaWxhYmxlCi0vLyAgICBPdGhlcndpc2U6IFBvaW50ZXIgdG8gdGhlIGRhdGEgYnVmZmVyCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8qIEZJWE1FOiBTaG91bGQgdGhpcyBqdXN0IGJlIHJlcGxhY2VkIHdpdGgga21hbGxvYygpIGFuZCBrZnJlZSgpPyAqLwotdTggKk1MTUVHZXRNTVBEVUJ1ZmZlcihQV0IzMl9BREFQVEVSIEFkYXB0ZXIpCi17Ci0JczMyIGk7Ci0JdTggKnJldHVyblZhbDsKLQotCWZvciAoaSA9IDA7IGk8IE1BWF9OVU1fVFhfTU1QRFU7IGkrKykgewotCQlpZiAoQWRhcHRlci0+c01sbWVGcmFtZS5UeE1NUERVSW5Vc2VbaV0gPT0gRkFMU0UpCi0JCQlicmVhazsKLQl9Ci0JaWYgKGkgPj0gTUFYX05VTV9UWF9NTVBEVSkgcmV0dXJuIE5VTEw7Ci0KLQlyZXR1cm5WYWwgPSAodTggKikmKEFkYXB0ZXItPnNNbG1lRnJhbWUuVHhNTVBEVVtpXSk7Ci0JQWRhcHRlci0+c01sbWVGcmFtZS5UeE1NUERVSW5Vc2VbaV0gPSBUUlVFOwotCi0JcmV0dXJuIHJldHVyblZhbDsKLX0KLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotdTggTUxNRVNlbmRGcmFtZShQV0IzMl9BREFQVEVSIEFkYXB0ZXIsIHU4ICpwTU1QRFUsIHUxNiBsZW4sIHU4IERhdGFUeXBlKQordTggTUxNRVNlbmRGcmFtZShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyLCB1OCAqcE1NUERVLCB1MTYgbGVuLCB1OCBEYXRhVHlwZSkKIC8qCURhdGFUeXBlIDogRlJBTUVfVFlQRV84MDJfMTFfTUFOQUdFTUVOVCwgRlJBTUVfVFlQRV84MDJfMTFfTUFOQUdFTUVOVF9DSEFMTEVOR0UsCiAJCQkJRlJBTUVfVFlQRV84MDJfMTFfREFUQSAqLwogewotCWlmIChBZGFwdGVyLT5zTWxtZUZyYW1lLklzSW5Vc2VkICE9IFBBQ0tFVF9GUkVFX1RPX1VTRSkgewotCQlBZGFwdGVyLT5zTWxtZUZyYW1lLndOdW1UeE1NUERVRGlzY2FyZGVkKys7Ci0JCXJldHVybiBGQUxTRTsKKwlpZiAoYWRhcHRlci0+c01sbWVGcmFtZS5Jc0luVXNlZCAhPSBQQUNLRVRfRlJFRV9UT19VU0UpIHsKKwkJYWRhcHRlci0+c01sbWVGcmFtZS53TnVtVHhNTVBEVURpc2NhcmRlZCsrOworCQlyZXR1cm4gZmFsc2U7CiAJfQotCUFkYXB0ZXItPnNNbG1lRnJhbWUuSXNJblVzZWQgPSBQQUNLRVRfQ09NRV9GUk9NX01MTUU7CisJYWRhcHRlci0+c01sbWVGcmFtZS5Jc0luVXNlZCA9IFBBQ0tFVF9DT01FX0ZST01fTUxNRTsKIAogCS8vIEtlZXAgaW5mb3JtYXRpb24gZm9yIHNlbmRpbmcKLQlBZGFwdGVyLT5zTWxtZUZyYW1lLnBNTVBEVSA9IHBNTVBEVTsKLQlBZGFwdGVyLT5zTWxtZUZyYW1lLkRhdGFUeXBlID0gRGF0YVR5cGU7CisJYWRhcHRlci0+c01sbWVGcmFtZS5wTU1QRFUgPSBwTU1QRFU7CisJYWRhcHRlci0+c01sbWVGcmFtZS5EYXRhVHlwZSA9IERhdGFUeXBlOwogCS8vIGxlbiBtdXN0IGJlIHRoZSBsYXN0IHNldHRpbmcgZHVlIHRvIFFVRVJZX1NJWkVfU0VDT05EIG9mIE1kcwotCUFkYXB0ZXItPnNNbG1lRnJhbWUubGVuID0gbGVuOwotCUFkYXB0ZXItPnNNbG1lRnJhbWUud051bVR4TU1QRFUrKzsKKwlhZGFwdGVyLT5zTWxtZUZyYW1lLmxlbiA9IGxlbjsKKwlhZGFwdGVyLT5zTWxtZUZyYW1lLndOdW1UeE1NUERVKys7CiAKIAkvLyBIL1cgd2lsbCBlbnRlciBwb3dlciBzYXZlIGJ5IHNldCB0aGUgcmVnaXN0ZXIuIFMvVyBkb24ndCBzZW5kIG51bGwgZnJhbWUKIAkvL3dpdGggUFdSTWd0IGJpdCBlbmJsZWQgdG8gZW50ZXIgcG93ZXIgc2F2ZSBub3cuCiAKIAkvLyBUcmFuc21pdCBORElTIHBhY2tldAotCU1kc19UeChBZGFwdGVyKTsKLQlyZXR1cm4gVFJVRTsKKwlNZHNfVHgoYWRhcHRlcik7CisJcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQKLU1MTUVfR2V0TmV4dFBhY2tldChQQURBUFRFUiBBZGFwdGVyLCBQREVTQ1JJUFRPUiBwRGVzKQordm9pZCBNTE1FX0dldE5leHRQYWNrZXQoc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyLCBQREVTQ1JJUFRPUiBkZXNjKQogewotI2RlZmluZSBERVNDUklQVE9SX0FERF9CVUZGRVIoIF9ELCBfQSwgX1MgKSBcCi17XAotCV9ELT5JbnRlcm5hbFVzZWQgPSBfRC0+YnVmZmVyX3N0YXJ0X2luZGV4ICsgX0QtPmJ1ZmZlcl9udW1iZXI7IFwKLQlfRC0+SW50ZXJuYWxVc2VkICU9IE1BWF9ERVNDUklQVE9SX0JVRkZFUl9JTkRFWDsgXAotCV9ELT5idWZmZXJfYWRkcmVzc1sgX0QtPkludGVybmFsVXNlZCBdID0gX0E7IFwKLQlfRC0+YnVmZmVyX3NpemVbIF9ELT5JbnRlcm5hbFVzZWQgXSA9IF9TOyBcCi0JX0QtPmJ1ZmZlcl90b3RhbF9zaXplICs9IF9TOyBcCi0JX0QtPmJ1ZmZlcl9udW1iZXIrKztcCisJZGVzYy0+SW50ZXJuYWxVc2VkID0gZGVzYy0+YnVmZmVyX3N0YXJ0X2luZGV4ICsgZGVzYy0+YnVmZmVyX251bWJlcjsKKwlkZXNjLT5JbnRlcm5hbFVzZWQgJT0gTUFYX0RFU0NSSVBUT1JfQlVGRkVSX0lOREVYOworCWRlc2MtPmJ1ZmZlcl9hZGRyZXNzW2Rlc2MtPkludGVybmFsVXNlZF0gPSBhZGFwdGVyLT5zTWxtZUZyYW1lLnBNTVBEVTsKKwlkZXNjLT5idWZmZXJfc2l6ZVtkZXNjLT5JbnRlcm5hbFVzZWRdID0gYWRhcHRlci0+c01sbWVGcmFtZS5sZW47CisJZGVzYy0+YnVmZmVyX3RvdGFsX3NpemUgKz0gYWRhcHRlci0+c01sbWVGcmFtZS5sZW47CisJZGVzYy0+YnVmZmVyX251bWJlcisrOworCWRlc2MtPlR5cGUgPSBhZGFwdGVyLT5zTWxtZUZyYW1lLkRhdGFUeXBlOwogfQogCi0JREVTQ1JJUFRPUl9BRERfQlVGRkVSKCBwRGVzLCBBZGFwdGVyLT5zTWxtZUZyYW1lLnBNTVBEVSwgQWRhcHRlci0+c01sbWVGcmFtZS5sZW4gKTsKLQlwRGVzLT5UeXBlID0gQWRhcHRlci0+c01sbWVGcmFtZS5EYXRhVHlwZTsKLX0KLQotdm9pZCBNTE1FZnJlZU1NUERVQnVmZmVyKFBXQjMyX0FEQVBURVIgQWRhcHRlciwgczggKnBEYXRhKQorc3RhdGljIHZvaWQgTUxNRWZyZWVNTVBEVUJ1ZmZlcihzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIsIHM4ICpwRGF0YSkKIHsKIAlpbnQgaTsKIAogCS8vIFJlY2xhaW0gdGhlIGRhdGEgYnVmZmVyCiAJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fVFhfTU1QRFU7IGkrKykgewotCQlpZiAocERhdGEgPT0gKHM4ICopJihBZGFwdGVyLT5zTWxtZUZyYW1lLlR4TU1QRFVbaV0pKQorCQlpZiAocERhdGEgPT0gKHM4ICopJihhZGFwdGVyLT5zTWxtZUZyYW1lLlR4TU1QRFVbaV0pKQogCQkJYnJlYWs7CiAJfQotCWlmIChBZGFwdGVyLT5zTWxtZUZyYW1lLlR4TU1QRFVJblVzZVtpXSkKLQkJQWRhcHRlci0+c01sbWVGcmFtZS5UeE1NUERVSW5Vc2VbaV0gPSBGQUxTRTsKKwlpZiAoYWRhcHRlci0+c01sbWVGcmFtZS5UeE1NUERVSW5Vc2VbaV0pCisJCWFkYXB0ZXItPnNNbG1lRnJhbWUuVHhNTVBEVUluVXNlW2ldID0gZmFsc2U7CiAJZWxzZSAgewogCQkvLyBTb21ldGhpbmcgd3JvbmcKIAkJLy8gUEQ0MyBBZGQgZGVidWcgY29kZSBoZXJlPz8/CkBAIC0xMzEsMTkgKzc0LDE5IEBACiB9CiAKIHZvaWQKLU1MTUVfU2VuZENvbXBsZXRlKFBBREFQVEVSIEFkYXB0ZXIsIHU4IFBhY2tldElELCB1bnNpZ25lZCBjaGFyIFNlbmRPSykKK01MTUVfU2VuZENvbXBsZXRlKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsIHU4IFBhY2tldElELCB1bnNpZ25lZCBjaGFyIFNlbmRPSykKIHsKIAlNTE1FX1RYQ0FMTEJBQ0sJVHhDYWxsYmFjazsKIAogICAgIC8vIFJlY2xhaW0gdGhlIGRhdGEgYnVmZmVyCi0JQWRhcHRlci0+c01sbWVGcmFtZS5sZW4gPSAwOwotCU1MTUVmcmVlTU1QRFVCdWZmZXIoIEFkYXB0ZXIsIEFkYXB0ZXItPnNNbG1lRnJhbWUucE1NUERVICk7CisJYWRhcHRlci0+c01sbWVGcmFtZS5sZW4gPSAwOworCU1MTUVmcmVlTU1QRFVCdWZmZXIoIGFkYXB0ZXIsIGFkYXB0ZXItPnNNbG1lRnJhbWUucE1NUERVICk7CiAKIAogCVR4Q2FsbGJhY2suYlJlc3VsdCA9IE1MTUVfU1VDQ0VTUzsKIAogCS8vIFJldHVybiByZXNvdXJjZQotCUFkYXB0ZXItPnNNbG1lRnJhbWUuSXNJblVzZWQgPSBQQUNLRVRfRlJFRV9UT19VU0U7CisJYWRhcHRlci0+c01sbWVGcmFtZS5Jc0luVXNlZCA9IFBBQ0tFVF9GUkVFX1RPX1VTRTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tbG1ldHhyeF9mLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tbG1ldHhyeF9mLmgKaW5kZXggMjRjZDVmMy4uNWYwNWE2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWxtZXR4cnhfZi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21sbWV0eHJ4X2YuaApAQCAtOCwzMiArOCwyNSBAQAogI2lmbmRlZiBfTUxNRVRYUlhfSAogI2RlZmluZSBfTUxNRVRYUlhfSAogCisjaW5jbHVkZSAiY29yZS5oIgorCiB2b2lkCiBNTE1FUHJvY1RocmVhZCgKLSAgICAgUFdCMzJfQURBUFRFUiAgICBBZGFwdGVyCisgICAgIHN0cnVjdCB3YnNvZnRfcHJpdiAqICAgIGFkYXB0ZXIKIAkpOwogCi12b2lkIE1MTUVSZXNldFR4UngoIFBXQjMyX0FEQVBURVIgQWRhcHRlcik7Ci0KLXU4ICoKLU1MTUVHZXRNTVBEVUJ1ZmZlcigKLSAgICAgUFdCMzJfQURBUFRFUiAgICBBZGFwdGVyCi0gICApOwotCi12b2lkIE1MTUVmcmVlTU1QRFVCdWZmZXIoIFBXQjMyX0FEQVBURVIgQWRhcHRlciwgIHM4ICogcERhdGEpOwotCi12b2lkIE1MTUVfR2V0TmV4dFBhY2tldCggIFBBREFQVEVSIEFkYXB0ZXIsICBQREVTQ1JJUFRPUiBwRGVzICk7Ci11OCBNTE1FU2VuZEZyYW1lKCBQV0IzMl9BREFQVEVSIEFkYXB0ZXIsCit2b2lkIE1MTUVfR2V0TmV4dFBhY2tldCggIHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsICBQREVTQ1JJUFRPUiBwRGVzICk7Cit1OCBNTE1FU2VuZEZyYW1lKCBzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyLAogCQkJCQl1OAkqcE1NUERVLAogCQkJCQl1MTYJbGVuLAogCQkJCQkgdTgJRGF0YVR5cGUpOwogCiB2b2lkCi1NTE1FX1NlbmRDb21wbGV0ZSggIFBXQjMyX0FEQVBURVIgQWRhcHRlciwgIHU4IFBhY2tldElELCAgdW5zaWduZWQgY2hhciBTZW5kT0sgKTsKK01MTUVfU2VuZENvbXBsZXRlKCAgc3RydWN0IHdic29mdF9wcml2ICogYWRhcHRlciwgIHU4IFBhY2tldElELCAgdW5zaWduZWQgY2hhciBTZW5kT0sgKTsKIAogdm9pZAogTUxNRVJjdkZyYW1lKAotICAgICBQV0IzMl9BREFQVEVSICAgIEFkYXB0ZXIsCisgICAgIHN0cnVjdCB3YnNvZnRfcHJpdiAqICAgIGFkYXB0ZXIsCiAgICAgIFBSWEJVRkZFUiAgICAgICAgcFJ4QnVmZmVyQXJyYXksCiAgICAgIHU4ICAgICAgICAgICAgTnVtT2ZCdWZmZXIsCiAgICAgIHU4ICAgICAgICAgICAgUmV0dXJuU2xvdEluZGV4CkBAIC00MSwxMSArMzQsMTEgQEAKIAogdm9pZAogTUxNRVJldHVyblBhY2tldCgKLSAgICAgUFdCMzJfQURBUFRFUiAgICBBZGFwdGVyLAorICAgICBzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiAgICBhZGFwdGVyLAogICAgICB1OCAqICAgICAgICAgIHBSeEJ1ZmVyCiAgICApOwogI2lmZGVmIF9JQlNTX0JFQUNPTl9TRVFfU1RJQ0tfCi1zOCBTZW5kQkNOdWxsRGF0YShQV0IzMl9BREFQVEVSIEFkYXB0ZXIsIHUxNiB3SWR4KTsKK3M4IFNlbmRCQ051bGxEYXRhKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIsIHUxNiB3SWR4KTsKICNlbmRpZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL210by5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbXRvLmMKaW5kZXggMmVmNjBlNS4uZGUxMWEwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbXRvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbXRvLmMKQEAgLTIzLDEwICsyMywxMiBAQAogCiAvLyBMQTIwMDQwMjEwX0RUTyBrZXZpbgogI2luY2x1ZGUgIm9zX2NvbW1vbi5oIgorI2luY2x1ZGUgInNtZV9hcGkuaCIKKyNpbmNsdWRlICJnbF84MDIxMS5oIgorI2luY2x1ZGUgIndiaGFsX2YuaCIKIAogLy8gRGVjbGFyZSBTUTMgdG8gcmF0ZSBhbmQgZnJhZ21lbnRhdGlvbiB0aHJlc2hvbGQgdGFibGUKIC8vIERlY2xhcmUgZnJhZ21lbnRhdGlvbiB0aHJlc2hvbGRzIHRhYmxlCi0jZGVmaW5lIE1UT19NQVhfU1EzX0xFVkVMUyAgICAgICAgICAgICAgICAgICAgICAxNAogI2RlZmluZSBNVE9fTUFYX0ZSQUdfVEhfTEVWRUxTICAgICAgICAgICAgICAgICAgNQogI2RlZmluZSBNVE9fTUFYX0RBVEFfUkFURV9MRVZFTFMgICAgICAgICAgICAgICAgMTIKIApAQCAtMzUsMTgxICszNywxNSBAQAogICAgIDI1NiwgMzg0LCA1MTIsIDc2OCwgMTUzNgogfTsKIAotdTggIE1UT19TUTNfTGV2ZWxbTVRPX01BWF9TUTNfTEVWRUxTXSA9Ci17Ci0gICAgMCwgMjYsIDMwLCAzMiwgMzQsIDM1LCAzNywgNDIsIDQ0LCA0NiwgNTQsIDYyLCA3OCwgODEKLX07Ci11OCAgTVRPX1NRM3RvUmF0ZVtNVE9fTUFYX1NRM19MRVZFTFNdID0KLXsKLSAgICAwLCAxLCAxLCAyLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEKLX07Ci11OCAgTVRPX1NRM3RvRnJhZ1tNVE9fTUFYX1NRM19MRVZFTFNdID0KLXsKLSAgICAwLCAyLCAyLCAzLCAzLCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0Ci19OwotCi0vLyBPbmUgRXhjaGFuZ2UgVGltZSB0YWJsZQotLy8KLXUxNiBNVE9fT25lX0V4Y2hhbmdlX1RpbWVfVGJsX2xbTVRPX01BWF9GUkFHX1RIX0xFVkVMU11bTVRPX01BWF9EQVRBX1JBVEVfTEVWRUxTXSA9Ci17Ci0gICAgeyAyNTU0LCAxNDc0LCAgODIyLCAgICAwLCAgICAwLCAgNjM2LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwfSwKLSAgICB7IDM1NzgsIDE5ODYsIDEwMDksICAgIDAsICAgIDAsICA3MjksICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDB9LAotICAgIHsgNDYwMiwgMjQ5OCwgMTE5NSwgICAgMCwgICAgMCwgIDgyMiwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMH0sCi0gICAgeyA2NjUwLCAzNTIyLCAxNTY3LCAgICAwLCAgICAwLCAxMDA5LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwfSwKLSAgICB7MTI3OTQsIDY1OTQsIDI2ODQsICAgIDAsICAgIDAsIDE1NjcsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDB9Ci19OwotCi11MTYgTVRPX09uZV9FeGNoYW5nZV9UaW1lX1RibF9zW01UT19NQVhfRlJBR19USF9MRVZFTFNdW01UT19NQVhfREFUQV9SQVRFX0xFVkVMU10gPQotewotICAgIHsgICAgMCwgMTI4MiwgIDYzMCwgIDQwNCwgIDI4OCwgIDQ0NCwgIDIzMiwgIDE3MiwgIDE0NCwgIDExNiwgIDEwMCwgICA5Nn0sCi0gICAgeyAgICAwLCAxNzk0LCAgODE3LCAgNTcyLCAgNDAwLCAgNTM3LCAgMzE2LCAgMjI4LCAgMTg4LCAgMTQ0LCAgMTI0LCAgMTE2fSwKLSAgICB7ICAgIDAsIDIzMDYsIDEwMDMsICA3NDQsICA1MTYsICA2MzAsICA0MDAsICAyODgsICAyMjgsICAxNzIsICAxNDQsICAxMzZ9LAotICAgIHsgICAgMCwgMzMzMCwgMTM3NSwgMTA4NCwgIDc0NCwgIDgxNywgIDU3MiwgIDQwMCwgIDMxNiwgIDIyOCwgIDE4OCwgIDE3Mn0sCi0gICAgeyAgICAwLCA2NDAyLCAyNDkyLCAyMTA4LCAxNDI0LCAxMzc1LCAxMDg0LCAgNzQwLCAgNTcyLCAgNDAwLCAgMzE2LCAgMjg0fQotfTsKLQotI2RlZmluZSBNVE9fT05FX0VYQ0hBTkdFX1RJTUUocHJlYW1ibGVfdHlwZSwgZnJhZ190aF9sdmwsIGRhdGFfcmF0ZV9sdmwpIFwKLSAgICAgICAgICAgIChwcmVhbWJsZV90eXBlKSA/ICAgTVRPX09uZV9FeGNoYW5nZV9UaW1lX1RibF9zW2ZyYWdfdGhfbHZsXVtkYXRhX3JhdGVfbHZsXSA6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVRPX09uZV9FeGNoYW5nZV9UaW1lX1RibF9sW2ZyYWdfdGhfbHZsXVtkYXRhX3JhdGVfbHZsXQotCiAvLyBEZWNsYXJlIGRhdGEgcmF0ZSB0YWJsZQogLy9UaGUgZm9sbG93aW5nIHRhYmxlIHdpbGwgYmUgY2hhbmdlZCBhdCBhbnl0aW1lIGlmIHRoZSBvcHJhdGlvbiByYXRlIHN1cHBvcnRlZCBieSBBUCBkb24ndAogLy9tYXRjaCB0aGUgdGFibGUKLXU4ICBNVE9fRGF0YV9SYXRlX1RibFtNVE9fTUFYX0RBVEFfUkFURV9MRVZFTFNdID0KLXsKK3N0YXRpYyB1OCBNVE9fRGF0YV9SYXRlX1RibFtNVE9fTUFYX0RBVEFfUkFURV9MRVZFTFNdID0gewogICAgIDIsIDQsIDExLCAyMiwgMTIsIDE4LCAyNCwgMzYsIDQ4LCA3MiwgOTYsIDEwOAogfTsKIAotLy9UaGUgU3RhcmRhcmRfRGF0YV9SYXRlX1RibCBhbmQgTGV2ZWwyUGVyVGJsIHRhYmxlIGlzIHVzZWQgdG8gaW5kaXJlY3RseSByZXRyZWl2ZSBQRVIKLS8vaW5mb3JtYXRpb24gZnJvbSBSYXRlX1BFUl9UQkwKLS8vVGhlIGRlZmF1bHQgc2V0dGluZ3MgaXMgQVAgY2FuIHN1cHBvcnQgZnVsbCByYXRlIHNldC4KLXN0YXRpYyB1OCAgU3RhcmRhcmRfRGF0YV9SYXRlX1RibFtNVE9fTUFYX0RBVEFfUkFURV9MRVZFTFNdID0KLXsKLQkyLCA0LCAxMSwgMjIsIDEyLCAxOCwgMjQsIDM2LCA0OCwgNzIsIDk2LCAxMDgKLX07Ci1zdGF0aWMgdTggIExldmVsMlBlclRibFtNVE9fTUFYX0RBVEFfUkFURV9MRVZFTFNdID0KLXsKLQkwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEKLX07Ci0vL0hvdyBtYW55IGtpbmQgb2YgdHggcmF0ZSBjYW4gYmUgc3VwcG9ydGVkIGJ5IEFQCi0vL0RUTyB3aWxsIGNoYW5nZSBSYXRlIGJldHdlZW4gTVRPX0RhdGFfUmF0ZV9UYmxbMF0gYW5kIE1UT19EYXRhX1JhdGVfVGJsW01UT19EYXRhUmF0ZUF2YWlsYWJsZUxldmVsLTFdCi1zdGF0aWMgdTggIE1UT19EYXRhUmF0ZUF2YWlsYWJsZUxldmVsID0gTVRPX01BWF9EQVRBX1JBVEVfTEVWRUxTOwotLy9TbW9vdGhlZCBQRVIgdGFibGUgZm9yIGVhY2ggZGlmZmVyZW50IFJBVEUgYmFzZWQgb24gcGFja2V0IGxlbmd0aCBvZiAxNTE0Ci1zdGF0aWMgaW50IFJhdGVfUEVSX1RCTFs5MV1bTVRPX01BWF9EQVRBX1JBVEVfTEVWRUxTXSA9IHsKLS8vICAgICAgICAxTSAgICAyTSAgICA1LjVNICAxMU0gICA2TSAgICA5TSAgICAxMk0gICAgIDE4TSAgICAyNE0gICAgMzZNICAgIDQ4TSAgIDU0TQotLyogMCUgICoveyA5MywgICAxNzcsICA0MjAsICA1MzgsICA2OTAsICA3NzQsICAxMDAxLCAgMTQwMSwgIDE3NjgsICAyMzU4LCAgMjgzOCwgIDMwMzl9LAotLyogMSUgICoveyA5MiwgICAxNzYsICA0MTYsICA1MzMsICA2ODMsICA3NjcsICA5OTIsICAgMTM4OSwgIDE3NTIsICAyMzM2LCAgMjgxMSwgIDMwMTB9LAotLyogMiUgICoveyA5MSwgICAxNzQsICA0MTIsICA1MjgsICA2NzUsICA3NjAsICA5ODMsICAgMTM3NiwgIDE3MzUsICAyMzEzLCAgMjc4MywgIDI5Nzl9LAotLyogMyUgICoveyA5MCwgICAxNzIsICA0MDcsICA1MjMsICA2NjcsICA3NTMsICA5NzMsICAgMTM2MywgIDE3MTksICAyMjkwLCAgMjc1NSwgIDI5NDh9LAotLyogNCUgICoveyA5MCwgICAxNzAsICA0MDMsICA1MTgsICA2NTksICA3NDYsICA5NjQsICAgMTM1MCwgIDE3MDEsICAyMjY2LCAgMjcyNiwgIDI5MTZ9LAotLyogNSUgICoveyA4OSwgICAxNjksICAzOTgsICA1MTIsICA2NTEsICA3MzgsICA5NTQsICAgMTMzNiwgIDE2ODQsICAyMjQyLCAgMjY5NiwgIDI4ODR9LAotLyogNiUgICoveyA4OCwgICAxNjcsICAzOTQsICA1MDcsICA2NDMsICA3MzEsICA5NDQsICAgMTMyMiwgIDE2NjYsICAyMjE3LCAgMjY2NSwgIDI4NTF9LAotLyogNyUgICoveyA4NywgICAxNjUsICAzODksICA1MDIsICA2MzUsICA3MjMsICA5MzUsICAgMTMwOCwgIDE2NDgsICAyMTkyLCAgMjYzNCwgIDI4MTd9LAotLyogOCUgICoveyA4NiwgICAxNjMsICAzODQsICA0OTcsICA2MjYsICA3MTYsICA5MjQsICAgMTI5NCwgIDE2MjksICAyMTY2LCAgMjYwMiwgIDI3ODJ9LAotLyogOSUgICoveyA4NSwgICAxNjEsICAzODAsICA0OTEsICA2MTgsICA3MDgsICA5MTQsICAgMTI3OSwgIDE2MTEsICAyMTQwLCAgMjU3MCwgIDI3NDd9LAotLyogMTAlICoveyA4NCwgICAxNjAsICAzNzUsICA0ODYsICA2MDksICA3MDAsICA5MDQsICAgMTI2NSwgIDE1OTEsICAyMTEzLCAgMjUzNywgIDI3MTF9LAotLyogMTElICoveyA4MywgICAxNTgsICAzNzAsICA0ODAsICA2MDAsICA2OTIsICA4OTQsICAgMTI1MCwgIDE1NzIsICAyMDg2LCAgMjUwMywgIDI2NzV9LAotLyogMTIlICoveyA4MiwgICAxNTYsICAzNjUsICA0NzUsICA1OTIsICA2ODQsICA4ODMsICAgMTIzNCwgIDE1NTIsICAyMDU5LCAgMjQ2OSwgIDI2Mzh9LAotLyogMTMlICoveyA4MSwgICAxNTQsICAzNjAsICA0NjksICA1ODMsICA2NzYsICA4NzIsICAgMTIxOSwgIDE1MzIsICAyMDMxLCAgMjQzNSwgIDI2MDB9LAotLyogMTQlICoveyA4MCwgICAxNTIsICAzNTUsICA0NjQsICA1NzQsICA2NjgsICA4NjIsICAgMTIwNCwgIDE1MTIsICAyMDAzLCAgMjQwMCwgIDI1NjJ9LAotLyogMTUlICoveyA3OSwgICAxNTAsICAzNTAsICA0NTgsICA1NjUsICA2NjAsICA4NTEsICAgMTE4OCwgIDE0OTIsICAxOTc0LCAgMjM2NSwgIDI1MjR9LAotLyogMTYlICoveyA3OCwgICAxNDgsICAzNDUsICA0NTMsICA1NTYsICA2NTIsICA4NDAsICAgMTE3MiwgIDE0NzEsICAxOTQ1LCAgMjMyOSwgIDI0ODV9LAotLyogMTclICoveyA3NywgICAxNDYsICAzNDAsICA0NDcsICA1NDcsICA2NDMsICA4MjksICAgMTE1NiwgIDE0NTAsICAxOTE2LCAgMjI5MywgIDI0NDZ9LAotLyogMTglICoveyA3NiwgICAxNDQsICAzMzUsICA0NDEsICA1MzgsICA2MzUsICA4MTgsICAgMTE0MCwgIDE0MjksICAxODg3LCAgMjI1NiwgIDI0MDZ9LAotLyogMTklICoveyA3NSwgICAxNDMsICAzMzAsICA0MzYsICA1MjksICA2MjcsICA4MDcsICAgMTEyNCwgIDE0MDgsICAxODU3LCAgMjIxOSwgIDIzNjZ9LAotLyogMjAlICoveyA3NCwgICAxNDEsICAzMjUsICA0MzAsICA1MjAsICA2MTgsICA3OTUsICAgMTEwNywgIDEzODYsICAxODI3LCAgMjE4MiwgIDIzMjZ9LAotLyogMjElICoveyA3MywgICAxMzksICAzMjAsICA0MjQsICA1MTAsICA2MTAsICA3ODQsICAgMTA5MSwgIDEzNjUsICAxNzk3LCAgMjE0NSwgIDIyODV9LAotLyogMjIlICoveyA3MiwgICAxMzcsICAzMTQsICA0MTgsICA1MDEsICA2MDEsICA3NzIsICAgMTA3NCwgIDEzNDMsICAxNzY2LCAgMjEwNywgIDIyNDR9LAotLyogMjMlICoveyA3MSwgICAxMzUsICAzMDksICA0MTIsICA0OTIsICA1OTIsICA3NjEsICAgMTA1NywgIDEzMjEsICAxNzM2LCAgMjA2OSwgIDIyMDN9LAotLyogMjQlICoveyA3MCwgICAxMzMsICAzMDQsICA0MDcsICA0ODIsICA1ODQsICA3NDksICAgMTA0MCwgIDEyOTksICAxNzA1LCAgMjAzMSwgIDIxNjF9LAotLyogMjUlICoveyA2OSwgICAxMzEsICAyOTksICA0MDEsICA0NzMsICA1NzUsICA3MzgsICAgMTAyMywgIDEyNzcsICAxNjc0LCAgMTk5MiwgIDIxMjB9LAotLyogMjYlICoveyA2OCwgICAxMjksICAyOTMsICAzOTUsICA0NjQsICA1NjYsICA3MjYsICAgMTAwNiwgIDEyNTQsICAxNjQyLCAgMTk1MywgIDIwNzh9LAotLyogMjclICoveyA2NywgICAxMjcsICAyODgsICAzODksICA0NTQsICA1NTcsICA3MTQsICAgOTg5LCAgIDEyMzIsICAxNjExLCAgMTkxNSwgIDIwMzV9LAotLyogMjglICoveyA2NiwgICAxMjUsICAyODMsICAzODMsICA0NDUsICA1NDksICA3MDMsICAgOTcyLCAgIDEyMDksICAxNTc5LCAgMTg3NiwgIDE5OTN9LAotLyogMjklICoveyA2NSwgICAxMjMsICAyNzgsICAzNzcsICA0MzYsICA1NDAsICA2OTEsICAgOTU1LCAgIDExODcsICAxNTQ4LCAgMTgzNiwgIDE5NTF9LAotLyogMzAlICoveyA2NCwgICAxMjEsICAyNzIsICAzNzEsICA0MjYsICA1MzEsICA2NzksICAgOTM3LCAgIDExNjQsICAxNTE2LCAgMTc5NywgIDE5MDh9LAotLyogMzElICoveyA2MywgICAxMTksICAyNjcsICAzNjUsICA0MTcsICA1MjIsICA2NjcsICAgOTIwLCAgIDExNDEsICAxNDg0LCAgMTc1OCwgIDE4NjZ9LAotLyogMzIlICoveyA2MiwgICAxMTcsICAyNjIsICAzNTksICA0MDcsICA1MTMsICA2NTUsICAgOTAyLCAgIDExMTgsICAxNDUzLCAgMTcxOSwgIDE4MjN9LAotLyogMzMlICoveyA2MSwgICAxMTUsICAyNTYsICAzNTMsICAzOTgsICA1MDQsICA2NDMsICAgODg1LCAgIDEwOTUsICAxNDIxLCAgMTY3OSwgIDE3ODF9LAotLyogMzQlICoveyA2MCwgICAxMTMsICAyNTEsICAzNDcsICAzODksICA0OTUsICA2MzEsICAgODY3LCAgIDEwNzIsICAxMzg5LCAgMTY0MCwgIDE3Mzh9LAotLyogMzUlICoveyA1OSwgICAxMTEsICAyNDYsICAzNDEsICAzNzksICA0ODYsICA2MTksICAgODUwLCAgIDEwNDksICAxMzU3LCAgMTYwMCwgIDE2OTV9LAotLyogMzYlICoveyA1OCwgICAxMDgsICAyNDAsICAzMzUsICAzNzAsICA0NzcsICA2MDcsICAgODMyLCAgIDEwMjcsICAxMzI1LCAgMTU2MSwgIDE2NTN9LAotLyogMzclICoveyA1NywgICAxMDYsICAyMzUsICAzMjksICAzNjEsICA0NjgsICA1OTUsICAgODE1LCAgIDEwMDQsICAxMjkzLCAgMTUyMiwgIDE2MTB9LAotLyogMzglICoveyA1NiwgICAxMDQsICAyMzAsICAzMjMsICAzNTEsICA0NTksICA1ODQsICAgNzk3LCAgIDk4MSwgICAxMjYxLCAgMTQ4MywgIDE1Njh9LAotLyogMzklICoveyA1NSwgICAxMDIsICAyMjQsICAzMTcsICAzNDIsICA0NTAsICA1NzIsICAgNzgwLCAgIDk1OCwgICAxMjMwLCAgMTQ0MywgIDE1MjZ9LAotLyogNDAlICoveyA1NCwgICAxMDAsICAyMTksICAzMTEsICAzMzMsICA0NDEsICA1NjAsICAgNzYyLCAgIDkzNSwgICAxMTk4LCAgMTQwNCwgIDE0ODR9LAotLyogNDElICoveyA1MywgICA5OCwgICAyMTQsICAzMDUsICAzMjQsICA0MzIsICA1NDgsICAgNzQ0LCAgIDkxMiwgICAxMTY2LCAgMTM2NiwgIDE0NDJ9LAotLyogNDIlICoveyA1MiwgICA5NiwgICAyMDksICAyOTksICAzMTUsICA0MjMsICA1MzYsICAgNzI3LCAgIDg4OSwgICAxMTM1LCAgMTMyNywgIDE0MDB9LAotLyogNDMlICoveyA1MSwgICA5NCwgICAyMDMsICAyOTMsICAzMDYsICA0MTQsICA1MjQsICAgNzA5LCAgIDg2NiwgICAxMTA0LCAgMTI4OSwgIDEzNTh9LAotLyogNDQlICoveyA1MCwgICA5MiwgICAxOTgsICAyODcsICAyOTcsICA0MDUsICA1MTIsICAgNjkyLCAgIDg0NCwgICAxMDcyLCAgMTI1MCwgIDEzMTd9LAotLyogNDUlICoveyA0OSwgICA5MCwgICAxOTMsICAyODEsICAyODgsICAzOTYsICA1MDAsICAgNjc1LCAgIDgyMSwgICAxMDQxLCAgMTIxMiwgIDEyNzZ9LAotLyogNDYlICoveyA0OCwgICA4OCwgICAxODgsICAyNzUsICAyNzksICAzODcsICA0ODgsICAgNjU3LCAgIDc5OSwgICAxMDExLCAgMTE3NCwgIDEyMzZ9LAotLyogNDclICoveyA0NywgICA4NiwgICAxODMsICAyNjksICAyNzEsICAzNzgsICA0NzYsICAgNjQwLCAgIDc3NywgICA5ODAsICAgMTEzNywgIDExOTV9LAotLyogNDglICoveyA0NiwgICA4NCwgICAxNzgsICAyNjIsICAyNjIsICAzNjksICA0NjQsICAgNjIzLCAgIDc1NCwgICA5NDksICAgMTEwMCwgIDExNTV9LAotLyogNDklICoveyA0NSwgICA4MiwgICAxNzMsICAyNTYsICAyNTQsICAzNjAsICA0NTIsICAgNjA2LCAgIDczMiwgICA5MTksICAgMTA2MywgIDExMTZ9LAotLyogNTAlICoveyA0NCwgICA4MCwgICAxNjgsICAyNTEsICAyNDUsICAzNTEsICA0NDEsICAgNTg5LCAgIDcxMCwgICA4ODksICAgMTAyNiwgIDEwNzZ9LAotLyogNTElICoveyA0MywgICA3OCwgICAxNjMsICAyNDUsICAyMzcsICAzNDIsICA0MjksICAgNTcyLCAgIDY4OSwgICA4NjAsICAgOTkwLCAgIDEwMzh9LAotLyogNTIlICoveyA0MiwgICA3NiwgICAxNTgsICAyMzksICAyMjgsICAzMzMsICA0MTcsICAgNTU1LCAgIDY2NywgICA4MzAsICAgOTU1LCAgIDk5OX0sCi0vKiA1MyUgKi97IDQxLCAgIDc0LCAgIDE1MywgIDIzMywgIDIyMCwgIDMyNCwgIDQwNiwgICA1MzgsICAgNjQ1LCAgIDgwMSwgICA5MTksICAgOTYxfSwKLS8qIDU0JSAqL3sgNDAsICAgNzIsICAgMTQ4LCAgMjI3LCAgMjEyLCAgMzE1LCAgMzk0LCAgIDUyMiwgICA2MjQsICAgNzczLCAgIDg4NCwgICA5MjR9LAotLyogNTUlICoveyAzOSwgICA3MCwgICAxNDMsICAyMjEsICAyMDQsICAzMDcsICAzODMsICAgNTA1LCAgIDYwMywgICA3NDQsICAgODUwLCAgIDg4N30sCi0vKiA1NiUgKi97IDM4LCAgIDY4LCAgIDEzOCwgIDIxNSwgIDE5NiwgIDI5OCwgIDM3MSwgICA0ODksICAgNTgyLCAgIDcxNiwgICA4MTYsICAgODUxfSwKLS8qIDU3JSAqL3sgMzcsICAgNjcsICAgMTM0LCAgMjA5LCAgMTg5LCAgMjg5LCAgMzYwLCAgIDQ3MywgICA1NjIsICAgNjg4LCAgIDc4MywgICA4MTV9LAotLyogNTglICoveyAzNiwgICA2NSwgICAxMjksICAyMDMsICAxODEsICAyODEsICAzNDksICAgNDU3LCAgIDU0MSwgICA2NjEsICAgNzUwLCAgIDc4MH0sCi0vKiA1OSUgKi97IDM1LCAgIDYzLCAgIDEyNCwgIDE5NywgIDE3NCwgIDI3MiwgIDMzOCwgICA0NDEsICAgNTIxLCAgIDYzNCwgICA3MTcsICAgNzQ1fSwKLS8qIDYwJSAqL3sgMzQsICAgNjEsICAgMTIwLCAgMTkyLCAgMTY2LCAgMjY0LCAgMzI3LCAgIDQyNSwgICA1MDEsICAgNjA4LCAgIDY4NiwgICA3MTJ9LAotLyogNjElICoveyAzMywgICA1OSwgICAxMTUsICAxODYsICAxNTksICAyNTUsICAzMTYsICAgNDA5LCAgIDQ4MiwgICA1ODIsICAgNjU1LCAgIDY3OH0sCi0vKiA2MiUgKi97IDMyLCAgIDU3LCAgIDExMSwgIDE4MCwgIDE1MiwgIDI0NywgIDMwNSwgICAzOTQsICAgNDYyLCAgIDU1NiwgICA2MjQsICAgNjQ2fSwKLS8qIDYzJSAqL3sgMzEsICAgNTUsICAgMTA3LCAgMTc0LCAgMTQ1LCAgMjM4LCAgMjk0LCAgIDM3OSwgICA0NDMsICAgNTMxLCAgIDU5NCwgICA2MTR9LAotLyogNjQlICoveyAzMCwgICA1MywgICAxMDIsICAxNjksICAxMzgsICAyMzAsICAyODMsICAgMzY0LCAgIDQyNSwgICA1MDYsICAgNTY1LCAgIDU4M30sCi0vKiA2NSUgKi97IDI5LCAgIDUyLCAgIDk4LCAgIDE2MywgIDEzMiwgIDIyMiwgIDI3MywgICAzNDksICAgNDA2LCAgIDQ4MiwgICA1MzYsICAgNTUzfSwKLS8qIDY2JSAqL3sgMjgsICAgNTAsICAgOTQsICAgMTU4LCAgMTI1LCAgMjE0LCAgMjYyLCAgIDMzNCwgICAzODgsICAgNDU5LCAgIDUwOCwgICA1MjN9LAotLyogNjclICoveyAyNywgICA0OCwgICA5MCwgICAxNTIsICAxMTksICAyMDYsICAyNTIsICAgMzIwLCAgIDM3MCwgICA0MzYsICAgNDgxLCAgIDQ5NX0sCi0vKiA2OCUgKi97IDI2LCAgIDQ2LCAgIDg2LCAgIDE0NywgIDExMywgIDE5OCwgIDI0MiwgICAzMDYsICAgMzUzLCAgIDQxMywgICA0NTUsICAgNDY3fSwKLS8qIDY5JSAqL3sgMjYsICAgNDQsICAgODIsICAgMTQxLCAgMTA3LCAgMTkwLCAgMjMxLCAgIDI5MiwgICAzMzYsICAgMzkxLCAgIDQyOSwgICA0NDB9LAotLyogNzAlICoveyAyNSwgICA0MywgICA3OCwgICAxMzYsICAxMDEsICAxODIsICAyMjEsICAgMjc4LCAgIDMxOSwgICAzNzAsICAgNDA1LCAgIDQxNH0sCi0vKiA3MSUgKi97IDI0LCAgIDQxLCAgIDc0LCAgIDEzMCwgIDk1LCAgIDE3NCwgIDIxMiwgICAyNjUsICAgMzAzLCAgIDM1MCwgICAzODEsICAgMzg5fSwKLS8qIDcyJSAqL3sgMjMsICAgMzksICAgNzEsICAgMTI1LCAgOTAsICAgMTY3LCAgMjAyLCAgIDI1MiwgICAyODcsICAgMzI5LCAgIDM1OCwgICAzNjV9LAotLyogNzMlICoveyAyMiwgICAzNywgICA2NywgICAxMTksICA4NSwgICAxNTksICAxOTIsICAgMjM5LCAgIDI3MSwgICAzMTAsICAgMzM1LCAgIDM0Mn0sCi0vKiA3NCUgKi97IDIxLCAgIDM2LCAgIDYzLCAgIDExNCwgIDgwLCAgIDE1MSwgIDE4MywgICAyMjYsICAgMjU2LCAgIDI5MSwgICAzMTQsICAgMzIwfSwKLS8qIDc1JSAqL3sgMjAsICAgMzQsICAgNjAsICAgMTA5LCAgNzUsICAgMTQ0LCAgMTc0LCAgIDIxNCwgICAyNDEsICAgMjczLCAgIDI5NCwgICAyOTh9LAotLyogNzYlICoveyAxOSwgICAzMiwgICA1NywgICAxMDQsICA3MCwgICAxMzcsICAxNjQsICAgMjAyLCAgIDIyNywgICAyNTYsICAgMjc0LCAgIDI3OH0sCi0vKiA3NyUgKi97IDE4LCAgIDMxLCAgIDUzLCAgIDk5LCAgIDY2LCAgIDEzMCwgIDE1NSwgICAxOTAsICAgMjEzLCAgIDIzOSwgICAyNTYsICAgMjU5fSwKLS8qIDc4JSAqL3sgMTcsICAgMjksICAgNTAsICAgOTQsICAgNjIsICAgMTIyLCAgMTQ2LCAgIDE3OCwgICAyMDAsICAgMjIzLCAgIDIzOCwgICAyNDF9LAotLyogNzklICoveyAxNiwgICAyOCwgICA0NywgICA4OSwgICA1OCwgICAxMTUsICAxMzgsICAgMTY3LCAgIDE4NywgICAyMDgsICAgMjIyLCAgIDIyNX0sCi0vKiA4MCUgKi97IDE2LCAgIDI2LCAgIDQ0LCAgIDg0LCAgIDU0LCAgIDEwOSwgIDEyOSwgICAxNTYsICAgMTc1LCAgIDE5NCwgICAyMDYsICAgMjA5fSwKLS8qIDgxJSAqL3sgMTUsICAgMjQsICAgNDEsICAgNzksICAgNTAsICAgMTAyLCAgMTIxLCAgIDE0NiwgICAxNjMsICAgMTgwLCAgIDE5MiwgICAxOTR9LAotLyogODIlICoveyAxNCwgICAyMywgICAzOSwgICA3NCwgICA0NywgICA5NSwgICAxMTMsICAgMTM2LCAgIDE1MSwgICAxNjcsICAgMTc4LCAgIDE4MX0sCi0vKiA4MyUgKi97IDEzLCAgIDIxLCAgIDM2LCAgIDY5LCAgIDQ0LCAgIDg5LCAgIDEwNSwgICAxMjYsICAgMTQwLCAgIDE1NSwgICAxNjYsICAgMTY5fSwKLS8qIDg0JSAqL3sgMTIsICAgMjAsICAgMzMsICAgNjQsICAgNDEsICAgODIsICAgOTcsICAgIDExNiwgICAxMzAsICAgMTQ0LCAgIDE1NSwgICAxNTh9LAotLyogODUlICoveyAxMSwgICAxOSwgICAzMSwgICA2MCwgICAzOSwgICA3NiwgICA4OSwgICAgMTA3LCAgIDEyMCwgICAxMzQsICAgMTQ1LCAgIDE0OX0sCi0vKiA4NiUgKi97IDExLCAgIDE3LCAgIDI5LCAgIDU1LCAgIDM2LCAgIDcwLCAgIDgyLCAgICA5OCwgICAgMTEwLCAgIDEyNSwgICAxMzYsICAgMTQwfSwKLS8qIDg3JSAqL3sgMTAsICAgMTYsICAgMjYsICAgNTEsICAgMzQsICAgNjQsICAgNzUsICAgIDkwLCAgICAxMDIsICAgMTE2LCAgIDEyOCwgICAxMzN9LAotLyogODglICoveyA5LCAgICAxNCwgICAyNCwgICA0NiwgICAzMiwgICA1OCwgICA2OCwgICAgODEsICAgIDkzLCAgICAxMDgsICAgMTIxLCAgIDEyOH0sCi0vKiA4OSUgKi97IDgsICAgIDEzLCAgIDIyLCAgIDQyLCAgIDMxLCAgIDUyLCAgIDYxLCAgICA3NCwgICAgODYsICAgIDEwMiwgICAxMTYsICAgMTI0fSwKLS8qIDkwJSAqL3sgNywgICAgMTIsICAgMjEsICAgMzcsICAgMjksICAgNDYsICAgNTQsICAgIDY2LCAgICA3OSwgICAgOTYsICAgIDExMiwgICAxMjF9Ci19OwotCi0jZGVmaW5lIFJTU0lCVUZfTlVNIDEwCi0jZGVmaW5lIFJTU0kyUkFURV9TSVpFIDkKLQotc3RhdGljIFRYUkVUUllfUkVDIFR4UmF0ZVJlYz17TVRPX01BWF9EQVRBX1JBVEVfTEVWRUxTIC0gMSwgMH07ICAgLy9uZXcgcmVjb3JkPT5UeFJhdGVSZWMKLXN0YXRpYyBpbnQgVHhSZXRyeVJhdGU7Ci0vL3N0YXRpYyBpbnQgU1EzLCBCU1NfUEtfQ05ULCBOSURMRVNMT1QsIFNMT1RfQ05ULCBJTlRFUkZfQ05ULCBHQVBfQ05ULCBEU19FVk07Ci1zdGF0aWMgczMyIFJTU0lCdWZbUlNTSUJVRl9OVU1dPXstNzAsIC03MCwgLTcwLCAtNzAsIC03MCwgLTcwLCAtNzAsIC03MCwgLTcwLCAtNzB9Owotc3RhdGljIHMzMiBSU1NJU21vb3RoZWQ9LTcwMDsKLXN0YXRpYyBpbnQgUlNTSUJ1ZkluZGV4PTA7Ci1zdGF0aWMgdTggbWF4X3Jzc2lfcmF0ZTsKLXN0YXRpYyBpbnQgcmF0ZV90YmxbMTNdID0gezAsMSwyLDUsMTEsNiw5LDEyLDE4LDI0LDM2LDQ4LDU0fTsKLS8vW1dLQ0hFTl1zdGF0aWMgY29yZV9kYXRhX3QgKnBNVE9jb3JlX2RhdGE9TlVMTDsKLQogc3RhdGljIGludCBUb3RhbFR4UGt0ID0gMDsKIHN0YXRpYyBpbnQgVG90YWxUeFBrdFJldHJ5ID0gMDsKLXN0YXRpYyBpbnQgVHhQa3RQZXJBbnRbM10gPSB7MCwwLDB9Owotc3RhdGljIGludCBSWFJTU0lBTlRbM10gPXstNzAsLTcwLC03MH07Ci1zdGF0aWMgaW50IFR4UGt0UmV0cnlQZXJBbnRbM10gPSB7MCwwLDB9OwotLy9zdGF0aWMgaW50IFR4RG9taW5hdGVGbGFnPUZBTFNFOwotc3RhdGljIHU4IG9sZF9hbnRlbm5hWzRdPXsxICwwICwxICwwfTsKIHN0YXRpYyBpbnQgcmV0cnlyYXRlX3JlY1tNVE9fTUFYX0RBVEFfUkFURV9MRVZFTFNdOy8vdGhpcyByZWNvcmQgdGhlIHJldHJ5IHJhdGUgYXQgZGlmZmVyZW50IGRhdGEgcmF0ZQogCiBzdGF0aWMgaW50IFBlcmlvZFRvdGFsVHhQa3QgPSAwOwpAQCAtMjIxLDEyOCArNTcsMTQgQEAKIAl1OCAgVHhSYXRlOwogfVJTU0kyUkFURTsKIAotc3RhdGljIFJTU0kyUkFURSBSU1NJMlJhdGVUYmxbUlNTSTJSQVRFX1NJWkVdID0KLXsKLQl7LTc0MCwgMTA4fSwgIC8vIDU0TQotCXstNzYwLCA5Nn0sICAvLyA0OE0KLQl7LTgyMCwgNzJ9LCAgLy8gMzZNCi0Jey04NTAsIDQ4fSwgIC8vIDI0TQotCXstODcwLCAzNn0sICAvLyAxOE0KLQl7LTg5MCwgMjR9LCAgLy8gMTJNCi0Jey05MDAsIDEyfSwgIC8vIDZNCi0Jey05MjAsIDExfSwgLy8gNS41TQotCXstOTUwLCA0fSwgLy8gMk0KLX07Ci1zdGF0aWMgdTggdW50b2dnbGVjb3VudDsKLXN0YXRpYyB1OCBsYXN0X3JhdGVfYW50OyAvL3RoaXMgaXMgdXNlZCBmb3IgYW50ZW5uYSBiYWNrb2ZmLWhoCi0KLXU4CWJvU3BhcnNlVHhUcmFmZmljID0gRkFMU0U7CitzdGF0aWMgdTggYm9TcGFyc2VUeFRyYWZmaWMgPSBmYWxzZTsKIAogdm9pZCBNVE9fSW5pdChNVE9fRlVOQ19JTlBVVCk7Ci12b2lkIEFudGVubmFUb2dnbGVJbml0aWF0b3IoTVRPX0ZVTkNfSU5QVVQpOwotdm9pZCBBbnRlbm5hVG9nZ2xlU3RhdGUoTVRPX0ZVTkNfSU5QVVQpOwotdm9pZCBUeFB3ckNvbnRyb2woTVRPX0ZVTkNfSU5QVVQpOwotdm9pZCBHZXRGcmVzaEFudGVubmFEYXRhKE1UT19GVU5DX0lOUFVUKTsKIHZvaWQgVHhSYXRlUmVkdWN0aW9uQ3RybChNVE9fRlVOQ19JTlBVVCk7CiAvKiogMS4xLjMxLjEwMDAgVHVyYm8gbW9kaWZ5ICovCi0vL3ZvaWQgTVRPX1NldERUT1JhdGVSYW5nZShpbnQgdHlwZSk7Ci12b2lkIE1UT19TZXREVE9SYXRlUmFuZ2UoTVRPX0ZVTkNfSU5QVVQsIHU4ICpwUmF0ZUFycmF5LCB1OCBBcnJheVNpemUpOwogdm9pZCBNVE9fU2V0VHhDb3VudChNVE9fRlVOQ19JTlBVVCwgdTggdDAsIHU4IGluZGV4KTsKIHZvaWQgTVRPX1R4RmFpbGVkKE1UT19GVU5DX0lOUFVUKTsKLXZvaWQgU21vb3RoUlNTSShzMzIgbmV3X3Jzc2kpOwogdm9pZCBoYWxfZ2V0X2R0b19wYXJhKE1UT19GVU5DX0lOUFVULCBjaGFyICpidWZmZXIpOwotdTggQ2FsY05ld1JhdGUoTVRPX0ZVTkNfSU5QVVQsIHU4IG9sZF9yYXRlLCB1MzIgcmV0cnlfY250LCB1MzIgdHhfZnJhZ19jbnQpOwotdTggR2V0TWF4UmF0ZUxldmVsRnJvbVJTU0kodm9pZCk7Ci11OCBNVE9fR2V0VHhGYWxsYmFja1JhdGUoTVRPX0ZVTkNfSU5QVVQpOwotaW50IERpdmlkZShpbnQgYSwgaW50IGIpOwotdm9pZCBtdWx0aWFnYyhNVE9fRlVOQ19JTlBVVCwgdTggaGlnaF9nYWluX21vZGUpOwotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gIE1UT19Jbml0IC0tCi0vLwotLy8gIERlc2NyaXB0aW9uOgotLy8gICAgU2V0IERUTyBUeCBSYXRlIFNjb3BlIGJlY2F1c2UgZGlmZmVyZW50IEFQIGNvdWxkIGhhdmUgZGlmZmVyZW50IFJhdGUgc2V0LgotLy8gICAgQWZ0ZXIgb3VyIHN0YWlvbiBqb2luIHdpdGggQVAsIExNIGNvcmUgd2lsbCBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZQotLy8gICAgVHggUmF0ZSB0YWJsZS4KLS8vCi0vLyAgQXJndW1lbnRzOgotLy8gICAgcFJhdGVBcnJheSAgICAgIC0gVGhlIHBvaW50ZXIgdG8gdGhlIFR4IFJhdGUgQXJyYXkgYnkgdGhlIGZvbGxvd2luZyBvcmRlcgotLy8gICAgICAgICAgICAgICAgICAgIC0gMiwgNCwgMTEsIDIyLCAxMiwgMTgsIDI0LCAzNiwgNDgsIDcyLCA5NiwgMTA4Ci0vLyAgICAgICAgICAgICAgICAgICAgLSBEVE8gd29uJ3QgY2hlY2sgd2hldGhlciByYXRlIG9yZGVyIGlzIGludmFsaWQgb3Igbm90Ci0vLyAgICBBcnJheVNpemUgICAgICAgLSBUaGUgYXJyYXkgc2l6ZSB0byBpbmRpY2F0ZSBob3cgbWFueSB0eCByYXRlIHdlIGNhbiBjaG9vc2UKLS8vCi0vLyAgc2FtcGxlIGNvZGU6Ci0vLwl7Ci0vLwkJdTggUmF0ZUFycmF5WzRdID0gezIsIDQsIDExLCAyMn07Ci0vLwkJTVRPX1NldERUT1JhdGVSYW5nZShSYXRlQXJyYXksIDQpOwotLy8JfQotLy8KLS8vICBSZXR1cm4gVmFsdWU6Ci0vLyAgICBOb25lCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXZvaWQgTVRPX1NldERUT1JhdGVSYW5nZShNVE9fRlVOQ19JTlBVVCx1OCAqcFJhdGVBcnJheSwgdTggQXJyYXlTaXplKQotewotCXU4CWksIGo9MDsKLQotCWZvcihpPTA7aTxBcnJheVNpemU7aSsrKQotCXsKLQkJaWYocFJhdGVBcnJheVtpXSA9PSAyMikKLQkJCWJyZWFrOwotCX0KLQlpZihpIDwgQXJyYXlTaXplKSAvL3dlIG5lZWQgYWRqdXN0IHRoZSBvcmRlciBvZiByYXRlIGxpc3QgYmVjYXVzZSAxMU1icHMgcmF0ZSBleGlzdHMKLQl7Ci0JCWZvcig7aT4wO2ktLSkKLQkJewotCQkJaWYocFJhdGVBcnJheVtpLTFdIDw9IDExKQotCQkJCWJyZWFrOwotCQkJcFJhdGVBcnJheVtpXSA9IHBSYXRlQXJyYXlbaS0xXTsKLQkJfQotCQlwUmF0ZUFycmF5W2ldID0gMjI7Ci0JCU1UT19PRkRNX1JBVEVfTEVWRUwoKSA9IGk7Ci0JfQotCWVsc2UKLQl7Ci0JCWZvcihpPTA7IGk8QXJyYXlTaXplOyBpKyspCi0JCXsKLQkJCWlmIChwUmF0ZUFycmF5W2ldID49IDEyKQotCQkJCWJyZWFrOwotCQl9Ci0JCU1UT19PRkRNX1JBVEVfTEVWRUwoKSA9IGk7Ci0JfQotCi0JZm9yKGk9MDtpPEFycmF5U2l6ZTtpKyspCi0JewotCQlNVE9fRGF0YV9SYXRlX1RibFtpXSA9IHBSYXRlQXJyYXlbaV07Ci0JCWZvcig7ajxNVE9fTUFYX0RBVEFfUkFURV9MRVZFTFM7aisrKQotCQl7Ci0JCQlpZihTdGFyZGFyZF9EYXRhX1JhdGVfVGJsW2pdID09IHBSYXRlQXJyYXlbaV0pCi0JCQkJYnJlYWs7Ci0JCX0KLQkJTGV2ZWwyUGVyVGJsW2ldID0gajsKLQkJI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQkJV0JERUJVRygoIltNVE9dOk9wIFJhdGVbJWRdOiAlZFxuIixpLCBNVE9fRGF0YV9SYXRlX1RibFtpXSkpOwotCQkjZW5kaWYKLQl9Ci0JTVRPX0RhdGFSYXRlQXZhaWxhYmxlTGV2ZWwgPSBBcnJheVNpemU7Ci0JaWYoIE1UT19EQVRBKCkuUmF0ZVBvbGljeSApIC8vIDAgbWVhbnMgdGhhdCBubyByZWdpc3RyeSBzZXR0aW5nCi0JewotCQlpZiggTVRPX0RBVEEoKS5SYXRlUG9saWN5ID09IDEgKQotCQkJVHhSYXRlUmVjLnR4X3JhdGUgPSAwOwkvL2FzY2VudAotCQllbHNlCi0JCQlUeFJhdGVSZWMudHhfcmF0ZSA9IE1UT19EYXRhUmF0ZUF2YWlsYWJsZUxldmVsIC0xIDsJLy9kZXNjZW50Ci0JfQotCWVsc2UKLQl7Ci0JCWlmKCBNVE9fSU5JVFRYUkFURV9NT0RFICkKLQkJCVR4UmF0ZVJlYy50eF9yYXRlID0gMDsJLy9hc2NlbnQKLQkJZWxzZQotCQkJVHhSYXRlUmVjLnR4X3JhdGUgPSBNVE9fRGF0YVJhdGVBdmFpbGFibGVMZXZlbCAtMSA7CS8vZGVzY2VudAotCX0KLQlUeFJhdGVSZWMudHhfcmV0cnlfcmF0ZSA9IDA7Ci0JLy9zZXQgZGVmYXVsdCByYXRlIGZvciBpbml0aWFsIHVzZQotCU1UT19SQVRFX0xFVkVMKCkgPSBUeFJhdGVSZWMudHhfcmF0ZTsKLQlNVE9fRkFMTEJBQ0tfUkFURV9MRVZFTCgpID0gTVRPX1JBVEVfTEVWRUwoKTsKLX0KIAogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC8vICBNVE9fSW5pdCAtLQpAQCAtMzUzLDcgKzc1LDcgQEAKIC8vICAgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGludm9rZWQgZHVyaW5nIHN5c3RlbSBpbml0aWFsaXphdGlvbi4KIC8vCiAvLyAgQXJndW1lbnRzOgotLy8gICAgQWRhcHRlciAgICAgIC0gVGhlIHBvaW50ZXIgdG8gdGhlIE1pbmlwb3J0IEFkYXB0ZXIgQ29udGV4dAorLy8gICAgYWRhcHRlciAgICAgIC0gVGhlIHBvaW50ZXIgdG8gdGhlIE1pbmlwb3J0IGFkYXB0ZXIgQ29udGV4dAogLy8KIC8vICBSZXR1cm4gVmFsdWU6CiAvLyAgICBOb25lCkBAIC0zOTMsOCArMTE1LDggQEAKICAgICBNVE9fU1FfQU5UKDApICAgICAgID0gMDsKICAgICBNVE9fU1FfQU5UKDEpICAgICAgID0gMDsKICAgICBNVE9fQU5UX0RJVkVSU0lUWSgpID0gTVRPX0FOVEVOTkFfRElWRVJTSVRZX09OOwotICAgIC8vQ2FyZFNldF9BbnRlbm5hRGl2ZXJzaXR5KEFkYXB0ZXIsIE1UT19BTlRfRElWRVJTSVRZKCkpOwotICAgIC8vUExNRVNldEFudGVubmFEaXZlcnNpdHkoIEFkYXB0ZXIsIE1UT19BTlRfRElWRVJTSVRZKCkpOworICAgIC8vQ2FyZFNldF9BbnRlbm5hRGl2ZXJzaXR5KGFkYXB0ZXIsIE1UT19BTlRfRElWRVJTSVRZKCkpOworICAgIC8vUExNRVNldEFudGVubmFEaXZlcnNpdHkoIGFkYXB0ZXIsIE1UT19BTlRfRElWRVJTSVRZKCkpOwogCiAgICAgTVRPX0FHSU5HX1RJTUVPVVQoKSA9IDA7Ly9NVE9fVE1SX0FHSU5HKCkgLyBNVE9fVE1SX1BFUklPRElDKCk7CiAKQEAgLTQwMiw3ICsxMjQsNiBAQAogICAgIC8vCiAgICAgLy9NVE9fUkFURV9MRVZFTCgpICAgICAgICAgICAgPSAxMDsKICAgICBNVE9fUkFURV9MRVZFTCgpICAgICAgICAgICAgPSAwOwotCU1UT19GQUxMQkFDS19SQVRFX0xFVkVMKCkJPSBNVE9fUkFURV9MRVZFTCgpOwogICAgIE1UT19GUkFHX1RIX0xFVkVMKCkgICAgICAgICA9IDQ7CiAgICAgLyoqIDEuMS4yMy4xMDAwIFR1cmJvIG1vZGlmeSBmcm9tIC0xIHRvICsxCiAJTVRPX1JUU19USFJFU0hPTEQoKSAgICAgICAgID0gTVRPX0ZSQUdfVEgoKSAtIDE7CkBAIC00NzAsNjY5ICsxOTEsNiBAQAogCU1UT19EQVRBKCkuUlNTSV9sb3cgPSAtNjA7CiB9CiAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KLXN0YXRpYyB1MzIgRFRPX1J4X0luZm9bMTNdWzNdOwotc3RhdGljIHUzMiBEVE9fUnhDUkNGYWlsX0luZm9bMTNdWzNdOwotc3RhdGljIHUzMiBBbnRlbm5hVG9nZ2xlQmtvZmZUaW1lcj01OwotdHlwZWRlZiBzdHJ1Y3R7Ci0JaW50IFJ4UmF0ZTsKLQlpbnQgUnhSYXRlUGt0czsKLQlpbnQgaW5kZXg7Ci19UlhSQVRFX0FOVDsKLVJYUkFURV9BTlQgUnhSYXRlUGVha0FudFszXTsKLQotI2RlZmluZSBBTlQwICAgIDAKLSNkZWZpbmUgQU5UMSAgICAxCi0jZGVmaW5lIE9MRF9BTlQgMgotCi12b2lkIFNlYXJjaFBlYWtSeFJhdGUoaW50IGluZGV4KQotewotCWludCBpOwotCVJ4UmF0ZVBlYWtBbnRbaW5kZXhdLlJ4UmF0ZVBrdHM9MDsKLQkvL0ZpbmQgb3V0IHRoZSBiZXN0IHJ4IHJhdGUgd2hpY2ggaXMgdXNlZCBvbiBkaWZmZXJlbnQgYW50ZW5uYQotCWZvcihpPTE7aTwxMztpKyspCi0JewotCQlpZihEVE9fUnhfSW5mb1tpXVtpbmRleF0gPiAodTMyKSBSeFJhdGVQZWFrQW50W2luZGV4XS5SeFJhdGVQa3RzKQotCQl7Ci0JCQlSeFJhdGVQZWFrQW50W2luZGV4XS5SeFJhdGVQa3RzID0gRFRPX1J4X0luZm9baV1baW5kZXhdOwotCQkJUnhSYXRlUGVha0FudFtpbmRleF0uUnhSYXRlID0gcmF0ZV90YmxbaV07Ci0JCQlSeFJhdGVQZWFrQW50W2luZGV4XS5pbmRleCA9IGk7Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgUmVzZXREVE9fUnhJbmZvKGludCBpbmRleCwgTVRPX0ZVTkNfSU5QVVQpCi17Ci0JaW50IGk7Ci0KLQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCVdCREVCVUcoKCJSZXNldERUT3J4XG4iKSk7Ci0JI2VuZGlmCi0KLQlmb3IoaT0wO2k8MTM7aSsrKQotCQlEVE9fUnhfSW5mb1tpXVtpbmRleF0gPSBNVE9fSEFMKCktPnJ4X29rX2NvdW50W2ldOwotCi0JZm9yKGk9MDtpPDEzO2krKykKLQkJRFRPX1J4Q1JDRmFpbF9JbmZvW2ldW2luZGV4XSA9IE1UT19IQUwoKS0+cnhfZXJyX2NvdW50W2ldOwotCi0JVG90YWxUeFBrdCA9IDA7Ci0JVG90YWxUeFBrdFJldHJ5ID0gMDsKLX0KLQotdm9pZCBHZXREVE9fUnhJbmZvKGludCBpbmRleCwgTVRPX0ZVTkNfSU5QVVQpCi17Ci0JaW50IGk7Ci0KLQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCVdCREVCVUcoKCJHZXREVE9yeFxuIikpOwotCSNlbmRpZgotCi0JLy9QREVCVUcoKCJbTVRPXTpEVE9fUnhfSW5mb1slZF09JWQsIHJ4X29rX2NvdW50PSVkXG4iLCBpbmRleCwgRFRPX1J4X0luZm9bMF1baW5kZXhdLCBwaHdfZGF0YS0+cnhfb2tfY291bnRbMF0pKTsKLQlmb3IoaT0wO2k8MTM7aSsrKQotCQlEVE9fUnhfSW5mb1tpXVtpbmRleF0gPSBhYnMoTVRPX0hBTCgpLT5yeF9va19jb3VudFtpXSAtIERUT19SeF9JbmZvW2ldW2luZGV4XSk7Ci0JaWYoRFRPX1J4X0luZm9bMF1baW5kZXhdPT0wKSBEVE9fUnhfSW5mb1swXVtpbmRleF0gPSAxOwotCi0JZm9yKGk9MDtpPDEzO2krKykKLQkJRFRPX1J4Q1JDRmFpbF9JbmZvW2ldW2luZGV4XSA9IE1UT19IQUwoKS0+cnhfZXJyX2NvdW50W2ldIC0gRFRPX1J4Q1JDRmFpbF9JbmZvW2ldW2luZGV4XTsKLQotCVR4UGt0UGVyQW50W2luZGV4XSA9IFRvdGFsVHhQa3Q7Ci0JVHhQa3RSZXRyeVBlckFudFtpbmRleF0gPSBUb3RhbFR4UGt0UmV0cnk7Ci0JVG90YWxUeFBrdCA9IDA7Ci0JVG90YWxUeFBrdFJldHJ5ID0gMDsKLX0KLQotdm9pZCBPdXRwdXREZWJ1Z0luZm8oaW50IGluZGV4MSwgaW50IGluZGV4MikKLXsKLQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCVdCREVCVUcoKCJbSEhEVE9dOlRvdGFsIFJ4ICglZClcdFx0KCVkKSBcbiAiLCBEVE9fUnhfSW5mb1swXVtpbmRleDFdLCBEVE9fUnhfSW5mb1swXVtpbmRleDJdKSk7Ci0gICAgV0JERUJVRygoIltISERUT106UkVDRUlWRSBSU1NJOiAoJWQpXHRcdCglZCkgXG4gIiwgUlhSU1NJQU5UW2luZGV4MV0sIFJYUlNTSUFOVFtpbmRleDJdKSk7Ci0JV0JERUJVRygoIltISERUT106VFggcGFja2V0IGNvcnJlY3QgcmF0ZTogKCVkKSUlXHRcdCglZCklJSBcbiAiLERpdmlkZShUeFBrdFBlckFudFtpbmRleDFdKjEwMCxUeFBrdFJldHJ5UGVyQW50W2luZGV4MV0pLCBEaXZpZGUoVHhQa3RQZXJBbnRbaW5kZXgyXSoxMDAsVHhQa3RSZXRyeVBlckFudFtpbmRleDJdKSkpOwotCSNlbmRpZgotCXsKLQkJaW50IHRtcDEsIHRtcDI7Ci0JCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JCVdCREVCVUcoKCJbSEhEVE9dOlRvdGFsIFR4ICglZClcdFx0KCVkKSBcbiAiLCBUeFBrdFBlckFudFtpbmRleDFdLCBUeFBrdFBlckFudFtpbmRleDJdKSk7Ci0JCVdCREVCVUcoKCJbSEhEVE9dOlRvdGFsIFR4IHJldHJ5ICglZClcdFx0KCVkKSBcbiAiLCBUeFBrdFJldHJ5UGVyQW50W2luZGV4MV0sIFR4UGt0UmV0cnlQZXJBbnRbaW5kZXgyXSkpOwotCQkjZW5kaWYKLQkJdG1wMSA9IFR4UGt0UGVyQW50W2luZGV4MV0gKyBEVE9fUnhfSW5mb1swXVtpbmRleDFdOwotCQl0bXAyID0gVHhQa3RQZXJBbnRbaW5kZXgyXSArIERUT19SeF9JbmZvWzBdW2luZGV4Ml07Ci0JCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JCVdCREVCVUcoKCJbSEhEVE9dOlRvdGFsIFR4K1JYICglZClcdFx0KCVkKSBcbiAiLCB0bXAxLCB0bXAyKSk7Ci0JCSNlbmRpZgotCX0KLX0KLQotdW5zaWduZWQgY2hhciBUeERvbWluYXRlKGludCBpbmRleCkKLXsKLQlpbnQgdG1wOwotCi0JdG1wID0gVHhQa3RQZXJBbnRbaW5kZXhdICsgRFRPX1J4X0luZm9bMF1baW5kZXhdOwotCi0JaWYoRGl2aWRlKFR4UGt0UGVyQW50W2luZGV4XSoxMDAsIHRtcCkgPiA0MCkKLQkJcmV0dXJuIFRSVUU7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7Ci19Ci0KLXVuc2lnbmVkIGNoYXIgQ21wVHhSZXRyeVJhdGUoaW50IGluZGV4MSwgaW50IGluZGV4MikKLXsKLQlpbnQgdHhfcmV0cnlfcmF0ZTEsIHR4X3JldHJ5X3JhdGUyOwotCXR4X3JldHJ5X3JhdGUxID0gRGl2aWRlKChUeFBrdFJldHJ5UGVyQW50W2luZGV4MV0gLSBUeFBrdFBlckFudFtpbmRleDFdKSoxMDAsIFR4UGt0UmV0cnlQZXJBbnRbaW5kZXgxXSk7Ci0JdHhfcmV0cnlfcmF0ZTIgPSBEaXZpZGUoKFR4UGt0UmV0cnlQZXJBbnRbaW5kZXgyXSAtIFR4UGt0UGVyQW50W2luZGV4Ml0pKjEwMCwgVHhQa3RSZXRyeVBlckFudFtpbmRleDJdKTsKLQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCVdCREVCVUcoKCJbTVRPXTpUeFJldHJ5IEFudDA6ICglZCUlKSAgQW50MTogKCVkJSUpIFxuICIsIHR4X3JldHJ5X3JhdGUxLCB0eF9yZXRyeV9yYXRlMikpOwotCSNlbmRpZgotCi0JaWYodHhfcmV0cnlfcmF0ZTEgPiB0eF9yZXRyeV9yYXRlMikKLQkJcmV0dXJuIFRSVUU7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7Ci19Ci0KLXZvaWQgR2V0RnJlc2hBbnRlbm5hRGF0YShNVE9fRlVOQ19JTlBVVCkKLXsKLSAgICB1OCAgICAgIHg7Ci0KLQl4ID0gaGFsX2dldF9hbnRlbm5hX251bWJlcihNVE9fSEFMKCkpOwotCS8vaGFsX2dldF9ic3NfcGtfY250KE1UT19IQUwoKSk7Ci0JLy9oYWxfZ2V0X2VzdF9zcTMoTVRPX0hBTCgpLCAxKTsKLQlvbGRfYW50ZW5uYVswXSA9IHg7Ci0JLy9pZiB0aGlzIGlzIHRoZSBmdW5jdGlvbiBmb3IgdGltZXIKLQlSZXNldERUT19SeEluZm8oeCwgTVRPX0ZVTkNfSU5QVVRfREFUQSk7Ci0JaWYoQW50ZW5uYVRvZ2dsZUJrb2ZmVGltZXIpCi0JCQlBbnRlbm5hVG9nZ2xlQmtvZmZUaW1lci0tOwotCWlmIChhYnMobGFzdF9yYXRlX2FudC1NVE9fUkFURV9MRVZFTCgpKT4xKSAgLy9iYWNrb2ZmIHRpbWVyIHJlc2V0Ci0JCUFudGVubmFUb2dnbGVCa29mZlRpbWVyPTA7Ci0KLQlpZiAoTVRPX0FOVF9ESVZFUlNJVFkoKSAhPSBNVE9fQU5URU5OQV9ESVZFUlNJVFlfT04gfHwKLQkJTVRPX0FOVF9ESVZFUlNJVFlfRU5BQkxFKCkgIT0gMSkKLQlBbnRlbm5hVG9nZ2xlQmtvZmZUaW1lcj0xOwotCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JV0JERUJVRygoIltISERUT106KipsYXN0IGRhdGEgcmF0ZT0lZCxub3cgZGF0YSByYXRlPSVkKiphbnRlbm5hIHRvZ2dsZSB0aW1lcj0lZCIsbGFzdF9yYXRlX2FudCxNVE9fUkFURV9MRVZFTCgpLEFudGVubmFUb2dnbGVCa29mZlRpbWVyKSk7Ci0JI2VuZGlmCi0JbGFzdF9yYXRlX2FudD1NVE9fUkFURV9MRVZFTCgpOwotCWlmKEFudGVubmFUb2dnbGVCa29mZlRpbWVyPT0wKQotCXsKLQkJTVRPX1RPR0dMRV9TVEFURSgpID0gVE9HR0xFX1NUQVRFX1dBSVQwOwotCQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCQlXQkRFQlVHKCgiW0hIRFRPXTo9PT1zdGF0ZSBpcyBzdGFydGluZz09Zm9yIGFudGVubmEgdG9nZ2xlPT09IikpOwotCQkjZW5kaWYKLQl9Ci0JZWxzZQotCQlNVE9fVE9HR0xFX1NUQVRFKCkgPSBUT0dHTEVfU1RBVEVfSURMRTsKLQotCWlmICgoTVRPX0JBQ0tPRkZfVE1SKCkhPTApJiYoTVRPX1JBVEVfTEVWRUwoKT5NVE9fRGF0YVJhdGVBdmFpbGFibGVMZXZlbCAtIDMpKQotCXsKLQkJTVRPX1RPR0dMRV9TVEFURSgpID0gVE9HR0xFX1NUQVRFX0lETEU7Ci0JCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JCVdCREVCVUcoKCJbSEhEVE9dOj09PXRoZSBkYXRhIHJhdGUgaXMgJWQgKGdvb2QpYW5kIHdpbGwgbm90IHRvb2dsZSAgPT09IixNVE9fREFUQV9SQVRFKCk+PjEpKTsKLQkJI2VuZGlmCi0JfQotCi0KLX0KLQotaW50IFdCX1BDUlsyXTsgLy9wYWNrZXQgY29ycmVjdCByYXRlCi0KLXZvaWQgQW50ZW5uYVRvZ2dsZVN0YXRlKE1UT19GVU5DX0lOUFVUKQotewotICAgIGludCBkZWNpZGVhbnRmbGFnID0gMDsKLQl1OCAgICAgIHg7Ci0JczMyICAgICByc3NpOwotCi0JaWYoTVRPX0FOVF9ESVZFUlNJVFlfRU5BQkxFKCkgIT0gMSkKLQkJcmV0dXJuOwotCXggPSBoYWxfZ2V0X2FudGVubmFfbnVtYmVyKE1UT19IQUwoKSk7Ci0Jc3dpdGNoKE1UT19UT0dHTEVfU1RBVEUoKSkKLQl7Ci0KLQkgICAvL01pc3NpbmcuLi4uLgotCSAgIGNhc2UgVE9HR0xFX1NUQVRFX0lETEU6Ci0JIGNhc2UgVE9HR0xFX1NUQVRFX0JLT0ZGOgotCSAgICAgICAgICAgICBicmVhazs7Ci0KLQkJY2FzZSBUT0dHTEVfU1RBVEVfV0FJVDA6Ly89PT09PT09PQotCSAgICAgICAgICAgICAgIEdldERUT19SeEluZm8oeCwgTVRPX0ZVTkNfSU5QVVRfREFUQSk7Ci0JCQlzbWVfZ2V0X3Jzc2koTVRPX0ZVTkNfSU5QVVRfREFUQSwgJnJzc2kpOwotCQkJUlhSU1NJQU5UW3hdID0gcnNzaTsKLQkJCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JCQlXQkRFQlVHKCgiW0hIRFRPXSAqKndhaXQwPT09PSBDb2xsZWN0aW5nIEFudCVkLS1yc3NpPSVkXG4iLCB4LFJYUlNTSUFOVFt4XSkpOwotCQkJI2VuZGlmCi0KLQkJCS8vY2hhbmdlIGFudGVubmEgYW5kIHJlc2V0IHRoZSBkYXRhIGF0IGNoYW5nZWQgYW50ZW5uYQotCQkJeCA9ICh+eCkgJiAweDAxOwotCQkJTVRPX0FOVF9TRUwoKSA9IHg7Ci0JCQloYWxfc2V0X2FudGVubmFfbnVtYmVyKE1UT19IQUwoKSwgTVRPX0FOVF9TRUwoKSk7Ci0JCQlMT0NBTF9BTlRFTk5BX05PKCkgPSB4OwotCi0JCQlNVE9fVE9HR0xFX1NUQVRFKCkgPSBUT0dHTEVfU1RBVEVfV0FJVDE7Ly9nbyB0byB3YWl0MQotCQkJUmVzZXREVE9fUnhJbmZvKHgsIE1UT19GVU5DX0lOUFVUX0RBVEEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVE9HR0xFX1NUQVRFX1dBSVQxOi8vPT09PT13YWl0MQotCQkJLy9NVE9fQ05UX0FOVCh4KSA9IGhhbF9nZXRfYnNzX3BrX2NudChNVE9fSEFMKCkpOwotCQkJLy9SWFJTU0lBTlRbeF0gPSBoYWxfZ2V0X3Jzc2koTVRPX0hBTCgpKTsKLQkJCXNtZV9nZXRfcnNzaShNVE9fRlVOQ19JTlBVVF9EQVRBLCAmcnNzaSk7Ci0JCQlSWFJTU0lBTlRbeF0gPSByc3NpOwotCQkJR2V0RFRPX1J4SW5mbyh4LCBNVE9fRlVOQ19JTlBVVF9EQVRBKTsKLQkJCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JCQlXQkRFQlVHKCgiW0hIRFRPXSAqKndhaXQxPT09PSBDb2xsZWN0aW5nIEFudCVkLS1yc3NpPSVkXG4iLCB4LFJYUlNTSUFOVFt4XSkpOwotCQkJI2VuZGlmCi0JCQlNVE9fVE9HR0xFX1NUQVRFKCkgPSBUT0dHTEVfU1RBVEVfTUFLRURFU0lTSU9OOwotCQkJYnJlYWs7Ci0JCWNhc2UgVE9HR0xFX1NUQVRFX01BS0VERVNJU0lPTjoKLQkJCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JCQlXQkRFQlVHKCgiW0hIRFRPXTpBbnQtLTAtLS0tLS0tLS0tLS0tLS0tLTEtLS1cbiIpKTsKLQkJCU91dHB1dERlYnVnSW5mbyhBTlQwLEFOVDEpOwotCQkJI2VuZGlmCi0JCQkvL1BERUJVRygoIltISERUT10gKipkZWNpc2lvbj09PT1cbiAiKSk7Ci0KLQkJCS8vPT09PT1mb2xsb3dpbmcgaXMgdGhlIGRlY2lzaW9uIHByb2R1cmNlCi0JCQkvLwotCQkJLy8gICAgZmlyc3Q6IGNvbXBhcmUgdGhlIHJzc2kgaWYgZGlmZmVyZW5jZSA+MTAKLQkJCS8vICAgICAgICAgICBzZWxlY3QgdGhlIGxhcmdlciBvbmUKLQkJCS8vICAgICAgICAgICAsb3RoZXJzIGdvIHRvIHNlY29uZAotCQkJLy8gICAgc2Vjb25kOiBjb21hcHJlIHRoZSB0eCtyeCBwYWNrZXQgY291bnQgaWYgZGlmZmVyZW5jZSA+MTAwCi0JCQkvLyAgICAgICAgICAgIHVzZSBsYXJnZXIgdG90YWwgcGFja2V0cyBhbnRlbm5hCi0JCQkvLyAgICB0aGlyZDo6Y29tcGFyZSB0aGUgdHggUEVSIGlmIHBhY2tldHM+MjAKLQkJCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZGlmZmVyZW5jZSA+NSUgdXNpbmcgdGhlIGJpZ2dlciBvbmUKLQkJCS8vCi0JCQkvLyAgICBmb3VydGg6Y29tcGFyZSB0aGUgUlggUEVSIGlmIHBhY2tldHM+MjAKLQkJCS8vICAgICAgICAgICAgICAgICAgICBpZiBQRVIgZGlmZmVyZW5jZSA8NSUKLQkJCS8vICAgICAgICAgICAgICAgICAgIHVzaW5nIG9sZCBhbnRlbm5hCi0JCQkvLwotCQkJLy8KLQkJCWlmIChhYnMoUlhSU1NJQU5UW0FOVDBdLVJYUlNTSUFOVFtBTlQxXSkgPiBNVE9QQVJBX1JTU0lfVEhfRk9SX0FOVERJVigpKS8vPT09PXJzc2lfdGgKLQkJCXsKLQkJCQlpZiAoUlhSU1NJQU5UW0FOVDBdPlJYUlNTSUFOVFtBTlQxXSkKLQkJCQl7Ci0JCQkJCWRlY2lkZWFudGZsYWc9MTsKLQkJCQkJTVRPX0FOVF9NQUMoKSA9IEFOVDA7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCWRlY2lkZWFudGZsYWc9MTsKLQkJCQkJTVRPX0FOVF9NQUMoKSA9IEFOVDE7Ci0JCQkJfQotCQkJCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JCQkJV0JERUJVRygoIlNlbGVjdCBhbnRlbm5hIGJ5IFJTU0lcbiIpKTsKLQkJCQkjZW5kaWYKLQkJCX0KLQkJCWVsc2UgaWYgIChhYnMoVHhQa3RQZXJBbnRbQU5UMF0gKyBEVE9fUnhfSW5mb1swXVtBTlQwXS1UeFBrdFBlckFudFtBTlQxXS1EVE9fUnhfSW5mb1swXVtBTlQxXSk8NTApLy89PT09PXRvdGFsIHBhY2tldF90aAotCQkJewotCQkJCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JCQkJV0JERUJVRygoIlRvdGFsIHR4L3J4IGlzIGNsb3NlXG4iKSk7Ci0JCQkJI2VuZGlmCi0JCQkJaWYgKFR4RG9taW5hdGUoQU5UMCkgJiYgVHhEb21pbmF0ZShBTlQxKSkKLQkJCQl7Ci0JCQkJCWlmICgoVHhQa3RQZXJBbnRbQU5UMF0+MTApICYmIChUeFBrdFBlckFudFtBTlQxXT4xMCkpLy89PT09dHggcGFja2V0X3RoCi0JCQkJCXsKLQkJCQkJCVdCX1BDUltBTlQwXT1EaXZpZGUoVHhQa3RQZXJBbnRbQU5UMF0qMTAwLFR4UGt0UmV0cnlQZXJBbnRbQU5UMF0pOwotCQkJCQkJV0JfUENSW0FOVDFdPURpdmlkZShUeFBrdFBlckFudFtBTlQxXSoxMDAsVHhQa3RSZXRyeVBlckFudFtBTlQxXSk7Ci0JCQkJCQlpZiAoYWJzKFdCX1BDUltBTlQwXS1XQl9QQ1JbQU5UMV0pPjUpLy8gdHggUEVSX3RoCi0JCQkJCQl7Ci0JCQkJCQkJI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQkJCQkJCQlXQkRFQlVHKCgiRGVjaWRlIGJ5IFR4IGNvcnJlY3QgcmF0ZVxuIikpOwotCQkJCQkJCSNlbmRpZgotCQkJCQkJCWlmIChXQl9QQ1JbQU5UMF0+V0JfUENSW0FOVDFdKQotCQkJCQkJCXsKLQkJCQkJCQkJZGVjaWRlYW50ZmxhZz0xOwotCQkJCQkJCQlNVE9fQU5UX01BQygpID0gQU5UMDsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZQotCQkJCQkJCXsKLQkJCQkJCQkJZGVjaWRlYW50ZmxhZz0xOwotCQkJCQkJCQlNVE9fQU5UX01BQygpID0gQU5UMTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQkJZGVjaWRlYW50ZmxhZz0wOwotCQkJCQkJCXVudG9nZ2xlY291bnQrKzsKLQkJCQkJCQlNVE9fQU5UX01BQygpID0gb2xkX2FudGVubmFbMF07Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlkZWNpZGVhbnRmbGFnPTA7Ci0JCQkJCQlNVE9fQU5UX01BQygpID0gb2xkX2FudGVubmFbMF07Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKERUT19SeF9JbmZvWzBdW0FOVDBdPjEwKSYmKERUT19SeF9JbmZvWzBdW0FOVDFdPjEwKSkvL3J4IHBhY2tldCB0aAotCQkJCXsKLQkJCQkJI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQkJCQkJV0JERUJVRygoIkRlY2lkZSBieSBSeFxuIikpOwotCQkJCQkjZW5kaWYKLQkJCQkJaWYgKGFicyhEVE9fUnhfSW5mb1swXVtBTlQwXSAtIERUT19SeF9JbmZvWzBdW0FOVDFdKT41MCkKLQkJCQkJewotCQkJCQkJaWYgKERUT19SeF9JbmZvWzBdW0FOVDBdID4gRFRPX1J4X0luZm9bMF1bQU5UMV0pCi0JCQkJCQl7Ci0JCQkJCQkJZGVjaWRlYW50ZmxhZz0xOwotCQkJCQkJCU1UT19BTlRfTUFDKCkgPSBBTlQwOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCWRlY2lkZWFudGZsYWc9MTsKLQkJCQkJCQlNVE9fQU5UX01BQygpID0gQU5UMTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCWRlY2lkZWFudGZsYWc9MDsKLQkJCQkJCXVudG9nZ2xlY291bnQrKzsKLQkJCQkJCU1UT19BTlRfTUFDKCkgPSBvbGRfYW50ZW5uYVswXTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlkZWNpZGVhbnRmbGFnPTA7Ci0JCQkJCU1UT19BTlRfTUFDKCkgPSBvbGRfYW50ZW5uYVswXTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmICgoVHhQa3RQZXJBbnRbQU5UMF0rRFRPX1J4X0luZm9bMF1bQU5UMF0pPihUeFBrdFBlckFudFtBTlQxXStEVE9fUnhfSW5mb1swXVtBTlQxXSkpLy91c2UgbW9yZSBwYWNrZWt0cwotCQkJewotCQkJCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JCQkJV0JERUJVRygoImRlY2lkZSBieSB0b3RhbCB0eC9yeCA6IEFOVCAwXG4iKSk7Ci0JCQkJI2VuZGlmCi0KLQkJCQlkZWNpZGVhbnRmbGFnPTE7Ci0JCQkJTVRPX0FOVF9NQUMoKSA9IEFOVDA7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQkJCQlXQkRFQlVHKCgiZGVjaWRlIGJ5IHRvdGFsIHR4L3J4IDogQU5UIDFcbiIpKTsKLQkJCQkjZW5kaWYKLQkJCQlkZWNpZGVhbnRmbGFnPTE7Ci0JCQkJTVRPX0FOVF9NQUMoKSA9IEFOVDE7Ci0KLQkJCX0KLQkJCS8vdGhpcyBpcyBmb3JjZSBhbnQgdG9nZ2xlCi0JCQlpZiAoZGVjaWRlYW50ZmxhZz09MSkKLQkJCQl1bnRvZ2dsZWNvdW50PTA7Ci0KLQkJCXVudG9nZ2xlY291bnQ9dW50b2dnbGVjb3VudCU0OwotCQkJaWYgKHVudG9nZ2xlY291bnQ9PTMpIC8vY2hhbmdlIGFudGVubmEKLQkJCQlNVE9fQU5UX01BQygpID0gKCh+b2xkX2FudGVubmFbMF0pICYgMHgxKTsKLQkJCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JCQlXQkRFQlVHKCgiW0hIRFRPXTo9PT09PT09PT09PT09PT09PT11bnRvZ2dsZS1jb3VudD0lZCIsdW50b2dnbGVjb3VudCkpOwotCQkJI2VuZGlmCi0KLQotCi0KLQkJCS8vUERFQlVHKCgiW0hIRFRPXSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqRFRPIEVOQUJMRT0lZCIsTVRPX0FOVF9ESVZFUlNJVFlfRU5BQkxFKCkpKTsKLQkJCWlmKE1UT19BTlRfRElWRVJTSVRZX0VOQUJMRSgpID09IDEpCi0JCQl7Ci0JCQkJCU1UT19BTlRfU0VMKCkgPSBNVE9fQU5UX01BQygpOwotCQkJCQloYWxfc2V0X2FudGVubmFfbnVtYmVyKE1UT19IQUwoKSwgTVRPX0FOVF9TRUwoKSk7Ci0JCQkJCUxPQ0FMX0FOVEVOTkFfTk8oKSA9IE1UT19BTlRfU0VMKCk7Ci0JCQkJCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JCQkJCVdCREVCVUcoKCJbSEhEVE9dID09ZGVjaXNpb249PSoqKioqKiphbnRmbGFnPSVkKioqKioqKioqKioqKioqKioqc2VsZWN0ZWQgYW50ZW5uYT0lZFxuIixkZWNpZGVhbnRmbGFnLE1UT19BTlRfU0VMKCkpKTsKLQkJCQkJI2VuZGlmCi0JCQl9Ci0JCQlpZiAoZGVjaWRlYW50ZmxhZykKLQkJCXsKLQkJCQlvbGRfYW50ZW5uYVszXT1vbGRfYW50ZW5uYVsyXTsvL3N0b3JlIGFudGVubmEgaW5mbwotCQkJCW9sZF9hbnRlbm5hWzJdPW9sZF9hbnRlbm5hWzFdOwotCQkJCW9sZF9hbnRlbm5hWzFdPW9sZF9hbnRlbm5hWzBdOwotCQkJCW9sZF9hbnRlbm5hWzBdPSBNVE9fQU5UX01BQygpOwotCQkJfQotCQkJI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQkJCVdCREVCVUcoKCJbSEhEVE9dOioqb2xkIGFudGVubmE9WyVkXVslZF1bJWRdWyVkXVxuIixvbGRfYW50ZW5uYVswXSxvbGRfYW50ZW5uYVsxXSxvbGRfYW50ZW5uYVsyXSxvbGRfYW50ZW5uYVszXSkpOwotCQkJI2VuZGlmCi0JCQlpZiAob2xkX2FudGVubmFbMF0hPW9sZF9hbnRlbm5hWzFdKQotCQkJCUFudGVubmFUb2dnbGVCa29mZlRpbWVyPTA7Ci0JCQllbHNlIGlmIChvbGRfYW50ZW5uYVsxXSE9b2xkX2FudGVubmFbMl0pCi0JCQkJQW50ZW5uYVRvZ2dsZUJrb2ZmVGltZXI9MTsKLQkJCWVsc2UgaWYgKG9sZF9hbnRlbm5hWzJdIT1vbGRfYW50ZW5uYVszXSkKLQkJCQlBbnRlbm5hVG9nZ2xlQmtvZmZUaW1lcj0yOwotCQkJZWxzZQotCQkJCUFudGVubmFUb2dnbGVCa29mZlRpbWVyPTQ7Ci0KLQkJCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JCQlXQkRFQlVHKCgiW0hIRFRPXToqKmJhY2sgb2ZmIHRpbWVyPSVkIixBbnRlbm5hVG9nZ2xlQmtvZmZUaW1lcikpOwotCQkJI2VuZGlmCi0KLQkJCVJlc2V0RFRPX1J4SW5mbyhNVE9fQU5UX01BQygpLCBNVE9fRlVOQ19JTlBVVF9EQVRBKTsKLQkJCWlmIChBbnRlbm5hVG9nZ2xlQmtvZmZUaW1lcj09MCAmJiBkZWNpZGVhbnRmbGFnKQotCQkJCU1UT19UT0dHTEVfU1RBVEUoKSA9IFRPR0dMRV9TVEFURV9XQUlUMDsKLQkJCWVsc2UKLQkJCQlNVE9fVE9HR0xFX1NUQVRFKCkgPSBUT0dHTEVfU1RBVEVfSURMRTsKLQkJCWJyZWFrOwotCX0KLQotfQotCi12b2lkIG11bHRpYWdjKE1UT19GVU5DX0lOUFVULCB1OCBoaWdoX2dhaW5fbW9kZSApCi17Ci0JczMyCQlyc3NpOwotCWh3X2RhdGFfdAkqcEh3RGF0YSA9IE1UT19IQUwoKTsKLQotCXNtZV9nZXRfcnNzaShNVE9fRlVOQ19JTlBVVF9EQVRBLCAmcnNzaSk7Ci0KLQlpZiggKFJGX1dCXzI0MiA9PSBwSHdEYXRhLT5waHlfdHlwZSkgfHwKLQkJKFJGX1dCXzI0Ml8xID09IHBId0RhdGEtPnBoeV90eXBlKSApIC8vIDIwMDYwNjE5LjUgQWRkCi0JewotCQlpZiAoaGlnaF9nYWluX21vZGU9PTEpCi0JCXsKLQkJCS8vaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIDB4MEMsIDB4ZjhmNTIyMzApOwotCQkJLy9od19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHgyMCwgMHgwNkM0MzQ0MCk7Ci0JCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDEwMEMsIDB4RjJGMzIyMzIgKTsgLy8gOTQwOTE2IDB4ZjhmNTIyMzAgKTsKLQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MTAyMCwgMHgwNGNiMzQ0MCApOyAvLyA5NDA5MTUgMHgwNkM0MzQ0MAotCQl9Ci0JCWVsc2UgaWYgKGhpZ2hfZ2Fpbl9tb2RlPT0wKQotCQl7Ci0JCQkvL2h3X3NldF9keHhfcmVnKHBod19kYXRhLCAweDBDLCAweEVFRUUwMDBEKTsKLQkJCS8vaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIDB4MjAsIDB4MDZjNDE0NDApOwotCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgxMDBDLCAweEVFRUUwMDBEICk7Ci0JCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDEwMjAsIDB4MDRjYjE0NDAgKTsgLy8gOTQwOTE1IDB4MDZjNDE0NDAKLQkJfQotCQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCQlXQkRFQlVHKCgiW0hIRFRPQUdDXSAqKnJzc2k9JWQsIGhpZ2ggZ2FpbiBtb2RlPSVkIiwgcnNzaSwgaGlnaF9nYWluX21vZGUpKTsKLQkJI2VuZGlmCi0JfQotfQotCi12b2lkIFR4UHdyQ29udHJvbChNVE9fRlVOQ19JTlBVVCkKLXsKLSAgICBzMzIgICAgIHJzc2k7Ci0JaHdfZGF0YV90CSpwSHdEYXRhID0gTVRPX0hBTCgpOwotCi0Jc21lX2dldF9yc3NpKE1UT19GVU5DX0lOUFVUX0RBVEEsICZyc3NpKTsKLQlpZiggKFJGX1dCXzI0MiA9PSBwSHdEYXRhLT5waHlfdHlwZSkgfHwKLQkJKFJGX1dCXzI0Ml8xID09IHBId0RhdGEtPnBoeV90eXBlKSApIC8vIDIwMDYwNjE5LjUgQWRkCi0JewotCQlzdGF0aWMgdTggaGlnaF9nYWluX21vZGU7IC8vdGhpcyBpcyBmb3Igd2luYm9uZCBSRiBzd2l0Y2ggTE5BCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgLy91c2luZyBkaWZmZXJlbnQgcmVnaXN0ZXIgc2V0dGluZwotCi0JCWlmIChoaWdoX2dhaW5fbW9kZT09MSkKLQkJewotCQkJaWYoIHJzc2kgPiBNVE9fREFUQSgpLlJTU0lfaGlnaCApCi0JCQl7Ci0JCQkJLy9od19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHgwQywgMHhmOGY1MjIzMCk7Ci0JCQkJLy9od19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHgyMCwgMHgwNTU0MTY0MCk7Ci0JCQkJaGlnaF9nYWluX21vZGU9MDsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkvL2h3X3NldF9keHhfcmVnKHBod19kYXRhLCAweDBDLCAweGY4ZjUxODMwKTsKLQkJCQkvL2h3X3NldF9keHhfcmVnKHBod19kYXRhLCAweDIwLCAweDA1NTQzRTQwKTsKLQkJCQloaWdoX2dhaW5fbW9kZT0xOwotCQkJfQotCQl9Ci0JCWVsc2UgLy9pZiAoaGlnaF9nYWluX21vZGU9PTApCi0JCXsKLQkJCWlmKCByc3NpIDwgTVRPX0RBVEEoKS5SU1NJX2xvdyApCi0JCQl7Ci0JCQkJLy9od19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHgwQywgMHhmOGY1MTgzMCk7Ci0JCQkJLy9od19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHgyMCwgMHgwNTU0M0U0MCk7Ci0JCQkJaGlnaF9nYWluX21vZGU9MTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkvL2h3X3NldF9keHhfcmVnKHBod19kYXRhLCAweDBDLCAweGY4ZjUyMjMwKTsKLQkJCQkvL2h3X3NldF9keHhfcmVnKHBod19kYXRhLCAweDIwLCAweDA1NTQxNjQwKTsKLQkJCQloaWdoX2dhaW5fbW9kZT0wOwotCQkJfQotCQl9Ci0KLQkJLy8gQWx3YXlzIGhpZ2ggZ2FpbiAyMDA1MTAxNC4gVXNpbmcgdGhlIGluaXRpYWwgdmFsdWUgb25seS4KLQkJbXVsdGlhZ2MoTVRPX0ZVTkNfSU5QVVRfREFUQSwgaGlnaF9nYWluX21vZGUpOwotCX0KLX0KLQotCi11OCBDYWxjTmV3UmF0ZShNVE9fRlVOQ19JTlBVVCwgdTggb2xkX3JhdGUsIHUzMiByZXRyeV9jbnQsIHUzMiB0eF9mcmFnX2NudCkKLXsKLQlpbnQgaTsKLQl1OCBuZXdfcmF0ZTsKLSAgICB1MzIgcmV0cnlfcmF0ZTsKLQlpbnQgVHhUaHJvdXB1dDEsIFR4VGhyb3VwdXQyLCBUeFRocm91cHV0MywgQmVzdFRocm91cGh0OwotCi0JaWYodHhfZnJhZ19jbnQgPCBNVE9QQVJBX1RYQ09VTlRfVEhfRk9SX0NBTENfUkFURSgpKSAvL3RvbyBmZXcgcGFja2V0cyB0cmFuc21pdAotCXsKLQkJcmV0dXJuIDB4ZmY7Ci0JfQotCXJldHJ5X3JhdGUgPSBEaXZpZGUocmV0cnlfY250ICogMTAwLCB0eF9mcmFnX2NudCk7Ci0KLQlpZihyZXRyeV9yYXRlID4gOTApIHJldHJ5X3JhdGUgPSA5MDsgLy9hbHdheXMgdHJ1bmNhdGUgdG8gOTAlIGR1ZSB0byBsb29rdXAgdGFibGUgc2l6ZQotCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JV0JERUJVRygoIiMjIyMjIEN1cnJlbnQgbGV2ZWwgPSVkLCBSZXRyeSBjb3VudCA9JWQsIEZyYWcgY291bnQgPSVkXG4iLAotCQkJCQkJb2xkX3JhdGUsIHJldHJ5X2NudCwgdHhfZnJhZ19jbnQpKTsKLQlXQkRFQlVHKCgiKiMjKiBSZXRyeSByYXRlID0lZCwgdGhyb3VnaHB1dCA9JWRcbiIsCi0JCQkJCQlyZXRyeV9yYXRlLCBSYXRlX1BFUl9UQkxbcmV0cnlfcmF0ZV1bb2xkX3JhdGVdKSk7Ci0JV0JERUJVRygoIlR4UmF0ZVJlYy50eF9yYXRlID0lZCwgUmV0cnkgcmF0ZSA9ICVkLCB0aHJvdWdocHV0ID0gJWRcbiIsCi0JCQkJCQlUeFJhdGVSZWMudHhfcmF0ZSwgVHhSYXRlUmVjLnR4X3JldHJ5X3JhdGUsCi0JCQkJCQlSYXRlX1BFUl9UQkxbVHhSYXRlUmVjLnR4X3JldHJ5X3JhdGVdW0xldmVsMlBlclRibFtUeFJhdGVSZWMudHhfcmF0ZV1dKSk7Ci0JV0JERUJVRygoIm9sZF9yYXRlLTEgPSVkLCBSZXRyeSByYXRlID0gJWQsIHRocm91Z2hwdXQgPSAlZFxuIiwKLQkJCQkJCW9sZF9yYXRlLTEsIHJldHJ5cmF0ZV9yZWNbb2xkX3JhdGUtMV0sCi0JCQkJCQlSYXRlX1BFUl9UQkxbcmV0cnlyYXRlX3JlY1tvbGRfcmF0ZS0xXV1bb2xkX3JhdGUtMV0pKTsKLQlXQkRFQlVHKCgib2xkX3JhdGUrMSA9JWQsIFJldHJ5IHJhdGUgPSAlZCwgdGhyb3VnaHB1dCA9ICVkXG4iLAotCQkJCQkJb2xkX3JhdGUrMSwgcmV0cnlyYXRlX3JlY1tvbGRfcmF0ZSsxXSwKLQkJCQkJCVJhdGVfUEVSX1RCTFtyZXRyeXJhdGVfcmVjW29sZF9yYXRlKzFdXVtvbGRfcmF0ZSsxXSkpOwotCSNlbmRpZgotCi0JLy9mb2xsb3dpbmcgaXMgZm9yIHJlY29yZCB0aGUgcmV0cnkgcmF0ZSBhdCB0aGUgZGlmZmVyZW50IGRhdGEgcmF0ZQotCWlmIChhYnMocmV0cnlfcmF0ZS1yZXRyeXJhdGVfcmVjW29sZF9yYXRlXSk8NTApLy8tLS10aGUgcGVyIFRICi0JCXJldHJ5cmF0ZV9yZWNbb2xkX3JhdGVdID0gcmV0cnlfcmF0ZTsgLy91cGRhdGUgcmV0cnkgcmF0ZQotCWVsc2UKLQl7Ci0JCWZvciAoaT0wO2k8TVRPX0RhdGFSYXRlQXZhaWxhYmxlTGV2ZWw7aSsrKSAvL3Jlc2V0IGFsbCByZXRyeSByYXRlCi0JCQlyZXRyeXJhdGVfcmVjW2ldPTA7Ci0JCXJldHJ5cmF0ZV9yZWNbb2xkX3JhdGVdID0gcmV0cnlfcmF0ZTsKLQkJI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQkJV0JERUJVRygoIlJlc2V0IHJldHJ5IHJhdGUgdGFibGVcbiIpKTsKLQkJI2VuZGlmCi0JfQotCi0JaWYoVHhSYXRlUmVjLnR4X3JhdGUgPiBvbGRfcmF0ZSkgICAvL0RlY3JlYXNlIFR4IFJhdGUKLQl7Ci0JCVR4VGhyb3VwdXQxID0gUmF0ZV9QRVJfVEJMW1R4UmF0ZVJlYy50eF9yZXRyeV9yYXRlXVtMZXZlbDJQZXJUYmxbVHhSYXRlUmVjLnR4X3JhdGVdXTsKLQkJVHhUaHJvdXB1dDIgPSBSYXRlX1BFUl9UQkxbcmV0cnlfcmF0ZV1bTGV2ZWwyUGVyVGJsW29sZF9yYXRlXV07Ci0JCWlmKFR4VGhyb3VwdXQxID4gVHhUaHJvdXB1dDIpCi0JCXsKLQkJCW5ld19yYXRlID0gVHhSYXRlUmVjLnR4X3JhdGU7Ci0JCQlCZXN0VGhyb3VwaHQgPSBUeFRocm91cHV0MTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCW5ld19yYXRlID0gb2xkX3JhdGU7Ci0JCQlCZXN0VGhyb3VwaHQgPSBUeFRocm91cHV0MjsKLQkJfQotCQlpZigob2xkX3JhdGUgPiAwKSAmJihyZXRyeV9yYXRlPk1UT1BBUkFfVFhSQVRFX0RFQ19USCgpKSkgICAvL01pbiBSYXRlCi0JCXsKLQkJCVR4VGhyb3VwdXQzID0gUmF0ZV9QRVJfVEJMW3JldHJ5cmF0ZV9yZWNbb2xkX3JhdGUtMV1dW0xldmVsMlBlclRibFtvbGRfcmF0ZS0xXV07Ci0JCQlpZihCZXN0VGhyb3VwaHQgPCBUeFRocm91cHV0MykKLQkJCXsKLQkJCQluZXdfcmF0ZSA9IG9sZF9yYXRlIC0gMTsKLQkJCQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCQkJCVdCREVCVUcoKCItLS0tLS0tLVxuIikpOwotCQkJCSNlbmRpZgotCQkJCUJlc3RUaHJvdXBodCA9IFR4VGhyb3VwdXQzOwotCQkJfQotCQl9Ci0JfQotCWVsc2UgaWYoVHhSYXRlUmVjLnR4X3JhdGUgPCBvbGRfcmF0ZSkgIC8vSW5jcmVhc2UgVHggUmF0ZQotCXsKLQkJVHhUaHJvdXB1dDEgPSBSYXRlX1BFUl9UQkxbVHhSYXRlUmVjLnR4X3JldHJ5X3JhdGVdW0xldmVsMlBlclRibFtUeFJhdGVSZWMudHhfcmF0ZV1dOwotCQlUeFRocm91cHV0MiA9IFJhdGVfUEVSX1RCTFtyZXRyeV9yYXRlXVtMZXZlbDJQZXJUYmxbb2xkX3JhdGVdXTsKLQkJaWYoVHhUaHJvdXB1dDEgPiBUeFRocm91cHV0MikKLQkJewotCQkJbmV3X3JhdGUgPSBUeFJhdGVSZWMudHhfcmF0ZTsKLQkJCUJlc3RUaHJvdXBodCA9IFR4VGhyb3VwdXQxOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJbmV3X3JhdGUgPSBvbGRfcmF0ZTsKLQkJCUJlc3RUaHJvdXBodCA9IFR4VGhyb3VwdXQyOwotCQl9Ci0JCWlmICgob2xkX3JhdGUgPCBNVE9fRGF0YVJhdGVBdmFpbGFibGVMZXZlbCAtIDEpJiYocmV0cnlfcmF0ZTxNVE9QQVJBX1RYUkFURV9JTkNfVEgoKSkpCi0JCXsKLQkJCS8vVHhUaHJvdXB1dDMgPSBSYXRlX1BFUl9UQkxbcmV0cnlyYXRlX3JlY1tvbGRfcmF0ZSsxXV1bTGV2ZWwyUGVyVGJsW29sZF9yYXRlKzFdXTsKLQkJCWlmIChyZXRyeXJhdGVfcmVjW29sZF9yYXRlKzFdID4gTVRPUEFSQV9UWFJFVFJZUkFURV9SRURVQ0UoKSkKLQkJCQlUeFRocm91cHV0MyA9IFJhdGVfUEVSX1RCTFtyZXRyeXJhdGVfcmVjW29sZF9yYXRlKzFdLU1UT1BBUkFfVFhSRVRSWVJBVEVfUkVEVUNFKCldW0xldmVsMlBlclRibFtvbGRfcmF0ZSsxXV07Ci0JCQllbHNlCi0JCQkJVHhUaHJvdXB1dDMgPSBSYXRlX1BFUl9UQkxbcmV0cnlyYXRlX3JlY1tvbGRfcmF0ZSsxXV1bTGV2ZWwyUGVyVGJsW29sZF9yYXRlKzFdXTsKLQkJCWlmKEJlc3RUaHJvdXBodCA8IFR4VGhyb3VwdXQzKQotCQkJewotCQkJCW5ld19yYXRlID0gb2xkX3JhdGUgKyAxOwotCQkJCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JCQkJV0JERUJVRygoIisrKysrKysrKytcbiIpKTsKLQkJCQkjZW5kaWYKLQkJCQlCZXN0VGhyb3VwaHQgPSBUeFRocm91cHV0MzsKLQkJCX0KLQkJfQotCX0KLQllbHNlICAvL1R4IFJhdGUgbm8gY2hhbmdlCi0JewotCQlUeFRocm91cHV0MiA9IFJhdGVfUEVSX1RCTFtyZXRyeV9yYXRlXVtMZXZlbDJQZXJUYmxbb2xkX3JhdGVdXTsKLQkJbmV3X3JhdGUgPSBvbGRfcmF0ZTsKLQkJQmVzdFRocm91cGh0ID0gVHhUaHJvdXB1dDI7Ci0KLQkJaWYgKHJldHJ5X3JhdGUgPE1UT1BBUkFfVFhSQVRFX0VRX1RIKCkpICAgIC8vdGggZm9yIGNoYW5nZSBoaWdoZXIgcmF0ZQotCQl7Ci0JCQlpZihvbGRfcmF0ZSA8IE1UT19EYXRhUmF0ZUF2YWlsYWJsZUxldmVsIC0gMSkKLQkJCXsKLQkJCQkvL1R4VGhyb3VwdXQzID0gUmF0ZV9QRVJfVEJMW3JldHJ5cmF0ZV9yZWNbb2xkX3JhdGUrMV1dW0xldmVsMlBlclRibFtvbGRfcmF0ZSsxXV07Ci0JCQkJaWYgKHJldHJ5cmF0ZV9yZWNbb2xkX3JhdGUrMV0gPiBNVE9QQVJBX1RYUkVUUllSQVRFX1JFRFVDRSgpKQotCQkJCQlUeFRocm91cHV0MyA9IFJhdGVfUEVSX1RCTFtyZXRyeXJhdGVfcmVjW29sZF9yYXRlKzFdLU1UT1BBUkFfVFhSRVRSWVJBVEVfUkVEVUNFKCldW0xldmVsMlBlclRibFtvbGRfcmF0ZSsxXV07Ci0JCQkJZWxzZQotCQkJCQlUeFRocm91cHV0MyA9IFJhdGVfUEVSX1RCTFtyZXRyeXJhdGVfcmVjW29sZF9yYXRlKzFdXVtMZXZlbDJQZXJUYmxbb2xkX3JhdGUrMV1dOwotCQkJCWlmKEJlc3RUaHJvdXBodCA8IFR4VGhyb3VwdXQzKQotCQkJCXsKLQkJCQkJbmV3X3JhdGUgPSBvbGRfcmF0ZSArIDE7Ci0JCQkJCUJlc3RUaHJvdXBodCA9IFR4VGhyb3VwdXQzOwotCQkJCQkjaWZkZWYgX1BFX0RUT19EVU1QXwotCQkJCQlXQkRFQlVHKCgiPSsrKysrKysrKytcbiIpKTsKLQkJCQkJI2VuZGlmCi0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UKLQkJaWYob2xkX3JhdGUgPiAwKSAgIC8vTWluIFJhdGUKLQkJewotCQkJVHhUaHJvdXB1dDMgPSBSYXRlX1BFUl9UQkxbcmV0cnlyYXRlX3JlY1tvbGRfcmF0ZS0xXV1bTGV2ZWwyUGVyVGJsW29sZF9yYXRlLTFdXTsKLQkJCWlmKEJlc3RUaHJvdXBodCA8IFR4VGhyb3VwdXQzKQotCQkJewotCQkJCW5ld19yYXRlID0gb2xkX3JhdGUgLSAxOwotCQkJCSNpZmRlZiBfUEVfRFRPX0RVTVBfCi0JCQkJV0JERUJVRygoIj0tLS0tLS0tLVxuIikpOwotCQkJCSNlbmRpZgotCQkJCUJlc3RUaHJvdXBodCA9IFR4VGhyb3VwdXQzOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKCFMT0NBTF9JU19JQlNTX01PREUoKSkKLQl7Ci0JbWF4X3Jzc2lfcmF0ZSA9IEdldE1heFJhdGVMZXZlbEZyb21SU1NJKCk7Ci0JI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQlXQkRFQlVHKCgiW01UT106UlNTSTJSYXRlPSVkXG4iLCBNVE9fRGF0YV9SYXRlX1RibFttYXhfcnNzaV9yYXRlXSkpOwotCSNlbmRpZgotCWlmKG5ld19yYXRlID4gbWF4X3Jzc2lfcmF0ZSkKLQkJbmV3X3JhdGUgPSBtYXhfcnNzaV9yYXRlOwotCX0KLQotCS8vc2F2ZSBuZXcgcmF0ZTsKLQlUeFJhdGVSZWMudHhfcmF0ZSA9IG9sZF9yYXRlOwotCVR4UmF0ZVJlYy50eF9yZXRyeV9yYXRlID0gKHU4KSByZXRyeV9yYXRlOwotCVR4UmV0cnlSYXRlID0gcmV0cnlfcmF0ZTsKLQlyZXR1cm4gbmV3X3JhdGU7Ci19Ci0KLXZvaWQgU21vb3RoUlNTSShzMzIgbmV3X3Jzc2kpCi17Ci0JUlNTSVNtb290aGVkID0gUlNTSVNtb290aGVkICsgbmV3X3Jzc2kgLSBSU1NJQnVmW1JTU0lCdWZJbmRleF07Ci0JUlNTSUJ1ZltSU1NJQnVmSW5kZXhdID0gbmV3X3Jzc2k7Ci0JUlNTSUJ1ZkluZGV4ID0gKFJTU0lCdWZJbmRleCArIDEpICUgMTA7Ci19Ci0KLXU4IEdldE1heFJhdGVMZXZlbEZyb21SU1NJKHZvaWQpCi17Ci0JdTggaTsKLQl1OCBUeFJhdGU7Ci0KLQlmb3IoaT0wO2k8UlNTSTJSQVRFX1NJWkU7aSsrKQotCXsKLQkJaWYoUlNTSVNtb290aGVkID4gUlNTSTJSYXRlVGJsW2ldLlJTU0kpCi0JCQlicmVhazsKLQl9Ci0JI2lmZGVmIF9QRV9EVE9fRFVNUF8KLQlXQkRFQlVHKCgiW01UT106UlNTST0lZFxuIiwgRGl2aWRlKFJTU0lTbW9vdGhlZCwgMTApKSk7Ci0JI2VuZGlmCi0JaWYoaSA8IFJTU0kyUkFURV9TSVpFKQotCQlUeFJhdGUgPSBSU1NJMlJhdGVUYmxbaV0uVHhSYXRlOwotCWVsc2UKLQkJVHhSYXRlID0gMjsgIC8vZGl2aWRlZCBieSAyID0gMU1icHMKLQotCWZvcihpPU1UT19EYXRhUmF0ZUF2YWlsYWJsZUxldmVsLTE7aT4wO2ktLSkKLQl7Ci0JCWlmKFR4UmF0ZSA+PU1UT19EYXRhX1JhdGVfVGJsW2ldKQotCQkJYnJlYWs7Ci0JfQotCXJldHVybiBpOwotfQotCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gIERlc2NyaXB0aW9uOgogLy8gICAgICBJZiB3ZSBlbmFibGUgRFRPLCB3ZSB3aWxsIGlnbm9yZSB0aGUgdHggY291bnQgd2l0aCBkaWZmZXJlbnQgdHggcmF0ZSBmcm9tCkBAIC0xMTk0LDM2ICsyNTIsMyBAQAogCVBlcmlvZFRvdGFsVHhQa3QgKys7CiAJUGVyaW9kVG90YWxUeFBrdFJldHJ5ICs9IChpbmRleCsxKTsKIH0KLQotdTggTVRPX0dldFR4RmFsbGJhY2tSYXRlKE1UT19GVU5DX0lOUFVUKQotewotCXJldHVybiBNVE9fREFUQV9GQUxMQkFDS19SQVRFKCk7Ci19Ci0KLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vICBNVE9fVHhGYWlsZWQgLS0KLS8vCi0vLyAgRGVzY3JpcHRpb246Ci0vLyAgICBGYWlsdXJlIG9mIHRyYW5zbWl0dGluZyBhIHBhY2tldCBpbmRpY2F0ZXMgdGhhdCBjZXJ0YWluIE1UTyBwYXJtZXRlcnMKLS8vICAgIG1heSBuZWVkIHRvIGJlIGFkanVzdGVkLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIE5JQyBqdXN0IGZhaWxlZAotLy8gICAgdG8gdHJhbnNtaXQgYSBwYWNrZXQgb3Igd2hlbiBNU0RVTGlmZVRpbWUgZXhwaXJlZC4KLS8vCi0vLyAgQXJndW1lbnRzOgotLy8gICAgQWRhcHRlciAgICAgIC0gVGhlIHBvaW50ZXIgdG8gdGhlIE1pbmlwb3J0IEFkYXB0ZXIgQ29udGV4dAotLy8KLS8vICBSZXR1cm4gVmFsdWU6Ci0vLyAgICBOb25lCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXZvaWQgTVRPX1R4RmFpbGVkKE1UT19GVU5DX0lOUFVUKQotewotCXJldHVybjsKLX0KLQotaW50IERpdmlkZShpbnQgYSwgaW50IGIpCi17Ci0JaWYgKGI9PTApIGI9MTsKLQlyZXR1cm4gYS9iOwotfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL210by5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbXRvLmgKaW5kZXggZjQ3OTM2Zi4uMGQzNzc1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbXRvLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbXRvLmgKQEAgLTExLDYgKzExLDggQEAKICNpZm5kZWYgX19NVE9fSF9fCiAjZGVmaW5lIF9fTVRPX0hfXwogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKwogI2RlZmluZSBNVE9fREVGQVVMVF9USF9DTlQgICAgICAgICAgICAgIDUKICNkZWZpbmUgTVRPX0RFRkFVTFRfVEhfU1EzICAgICAgICAgICAgICAxMTIgIC8vT0xEIElTIDEzIHJlZmVyZW5jZSBKb2huWHUKICNkZWZpbmUgTVRPX0RFRkFVTFRfVEhfSURMRV9TTE9UICAgICAgICAxNQpAQCAtMTI5LDE3ICsxMzEsMTcgQEAKIH0gTVRPX1BBUkFNRVRFUlMsICpQTVRPX1BBUkFNRVRFUlM7CiAKIAotI2RlZmluZSBNVE9fRlVOQ19JTlBVVCAgICAgICAgICAgICAgUFdCMzJfQURBUFRFUglBZGFwdGVyCi0jZGVmaW5lIE1UT19GVU5DX0lOUFVUX0RBVEEgICAgICAgICBBZGFwdGVyCi0jZGVmaW5lIE1UT19EQVRBKCkgICAgICAgICAgICAgICAgICAoQWRhcHRlci0+c010b1BhcmEpCi0jZGVmaW5lIE1UT19IQUwoKSAgICAgICAgICAgICAgICAgICAoJkFkYXB0ZXItPnNId0RhdGEpCisjZGVmaW5lIE1UT19GVU5DX0lOUFVUICAgICAgICAgICAgICBzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKglhZGFwdGVyCisjZGVmaW5lIE1UT19GVU5DX0lOUFVUX0RBVEEgICAgICAgICBhZGFwdGVyCisjZGVmaW5lIE1UT19EQVRBKCkgICAgICAgICAgICAgICAgICAoYWRhcHRlci0+c010b1BhcmEpCisjZGVmaW5lIE1UT19IQUwoKSAgICAgICAgICAgICAgICAgICAoJmFkYXB0ZXItPnNId0RhdGEpCiAjZGVmaW5lIE1UT19TRVRfUFJFQU1CTEVfVFlQRSh4KSAgICAvLyAyMDA0MDUxMSBUdXJibyBtYXJrIExNX1BSRUFNQkxFX1RZUEUoJnBjb3JlX2RhdGEtPmxtX2RhdGEpID0gKHgpCi0jZGVmaW5lIE1UT19FTkFCTEUJCQkJCShBZGFwdGVyLT5zTG9jYWxQYXJhLlR4UmF0ZU1vZGUgPT0gUkFURV9BVVRPKQotI2RlZmluZSBNVE9fVFhQT1dFUl9GUk9NX0VFUFJPTQkJKEFkYXB0ZXItPnNId0RhdGEuUG93ZXJJbmRleEZyb21FRVBST00pCi0jZGVmaW5lIExPQ0FMX0FOVEVOTkFfTk8oKQkJCShBZGFwdGVyLT5zTG9jYWxQYXJhLmJBbnRlbm5hTm8pCi0jZGVmaW5lIExPQ0FMX0lTX0NPTk5FQ1RFRCgpCQkoQWRhcHRlci0+c0xvY2FsUGFyYS53Q29ubmVjdGVkU1RBaW5kZXggIT0gMCkKLSNkZWZpbmUgTE9DQUxfSVNfSUJTU19NT0RFKCkJCShBZGFwdGVyLT5hc0JTU0Rlc2NyaXB0RWxlbWVudFtBZGFwdGVyLT5zTG9jYWxQYXJhLndDb25uZWN0ZWRTVEFpbmRleF0uYkJzc1R5cGUgPT0gSUJTU19ORVQpCi0jZGVmaW5lIE1UT19JTklUVFhSQVRFX01PREUJCQkoQWRhcHRlci0+c0h3RGF0YS5Tb2Z0d2FyZVNldCYweDIpCS8vYml0IDEKKyNkZWZpbmUgTVRPX0VOQUJMRQkJCQkJKGFkYXB0ZXItPnNMb2NhbFBhcmEuVHhSYXRlTW9kZSA9PSBSQVRFX0FVVE8pCisjZGVmaW5lIE1UT19UWFBPV0VSX0ZST01fRUVQUk9NCQkoYWRhcHRlci0+c0h3RGF0YS5Qb3dlckluZGV4RnJvbUVFUFJPTSkKKyNkZWZpbmUgTE9DQUxfQU5URU5OQV9OTygpCQkJKGFkYXB0ZXItPnNMb2NhbFBhcmEuYkFudGVubmFObykKKyNkZWZpbmUgTE9DQUxfSVNfQ09OTkVDVEVEKCkJCShhZGFwdGVyLT5zTG9jYWxQYXJhLndDb25uZWN0ZWRTVEFpbmRleCAhPSAwKQorI2RlZmluZSBMT0NBTF9JU19JQlNTX01PREUoKQkJKGFkYXB0ZXItPmFzQlNTRGVzY3JpcHRFbGVtZW50W2FkYXB0ZXItPnNMb2NhbFBhcmEud0Nvbm5lY3RlZFNUQWluZGV4XS5iQnNzVHlwZSA9PSBJQlNTX05FVCkKKyNkZWZpbmUgTVRPX0lOSVRUWFJBVEVfTU9ERQkJCShhZGFwdGVyLT5zSHdEYXRhLlNvZnR3YXJlU2V0JjB4MikJLy9iaXQgMQogLy8gMjAwNDA1MTAgVHVyYm8gYWRkCiAjZGVmaW5lIE1UT19UTVJfQ05UKCkgICAgICAgICAgICAgICBNVE9fREFUQSgpLlRtckNudAogI2RlZmluZSBNVE9fVE9HR0xFX1NUQVRFKCkgICAgICAgICAgTVRPX0RBVEEoKS5Ub2dnbGVTdGF0ZQpAQCAtMTU3LDcgKzE1OSw3IEBACiAjZGVmaW5lIE1UT19UTVJfUEVSSU9ESUMoKSAgICAgICAgICBNVE9fREFUQSgpLlRtcl9QZXJpb2RpYwogCiAjZGVmaW5lIE1UT19QT1dFUl9DSEFOR0VfRU5BQkxFKCkgICBNVE9fREFUQSgpLlBvd2VyQ2hhbmdlRW5hYmxlCi0jZGVmaW5lIE1UT19BTlRfRElWRVJTSVRZX0VOQUJMRSgpICBBZGFwdGVyLT5zTG9jYWxQYXJhLmJvQW50ZW5uYURpdmVyc2l0eQorI2RlZmluZSBNVE9fQU5UX0RJVkVSU0lUWV9FTkFCTEUoKSAgYWRhcHRlci0+c0xvY2FsUGFyYS5ib0FudGVubmFEaXZlcnNpdHkKICNkZWZpbmUgTVRPX0FOVF9NQUMoKSAgICAgICAgICAgICAgIE1UT19EQVRBKCkuQW50X21hYwogI2RlZmluZSBNVE9fQU5UX0RJVkVSU0lUWSgpICAgICAgICAgTVRPX0RBVEEoKS5BbnRfZGl2CiAjZGVmaW5lIE1UT19DQ0FfTU9ERSgpICAgICAgICAgICAgICBNVE9fREFUQSgpLkNDQV9Nb2RlCkBAIC0xNjYsNyArMTY4LDYgQEAKICNkZWZpbmUgTVRPX1BSRUFNQkxFX0NIQU5HRV9FTkFCTEUoKSAgICAgICAgIE1UT19EQVRBKCkuUHJlYW1ibGVDaGFuZ2VFbmFibGUKIAogI2RlZmluZSBNVE9fUkFURV9MRVZFTCgpICAgICAgICAgICAgTVRPX0RBVEEoKS5EYXRhUmF0ZUxldmVsCi0jZGVmaW5lIE1UT19GQUxMQkFDS19SQVRFX0xFVkVMKCkJTVRPX0RBVEEoKS5GYWxsYmFja1JhdGVMZXZlbAogI2RlZmluZSBNVE9fT0ZETV9SQVRFX0xFVkVMKCkJCU1UT19EQVRBKCkuT2ZkbVJhdGVMZXZlbAogI2RlZmluZSBNVE9fUkFURV9DSEFOR0VfRU5BQkxFKCkgICAgTVRPX0RBVEEoKS5EYXRhUmF0ZUNoYW5nZUVuYWJsZQogI2RlZmluZSBNVE9fRlJBR19USF9MRVZFTCgpICAgICAgICAgTVRPX0RBVEEoKS5GcmFnVGhyZXNob2xkTGV2ZWwKQEAgLTE5OSwxMSArMjAwLDkgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIAotZXh0ZXJuIHU4ICAgTVRPX0RhdGFfUmF0ZV9UYmxbXTsKIGV4dGVybiB1MTYgIE1UT19GcmFnX1RoX1RibFtdOwogCiAjZGVmaW5lIE1UT19EQVRBX1JBVEUoKSAgICAgICAgICBNVE9fRGF0YV9SYXRlX1RibFtNVE9fUkFURV9MRVZFTCgpXQotI2RlZmluZSBNVE9fREFUQV9GQUxMQkFDS19SQVRFKCkgTVRPX0RhdGFfUmF0ZV9UYmxbTVRPX0ZBTExCQUNLX1JBVEVfTEVWRUwoKV0JLy9uZXh0IGxldmVsCiAjZGVmaW5lIE1UT19GUkFHX1RIKCkgICAgICAgICAgICBNVE9fRnJhZ19UaF9UYmxbTVRPX0ZSQUdfVEhfTEVWRUwoKV0KIAogdHlwZWRlZiBzdHJ1Y3QgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbXRvX2YuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL210b19mLmgKaW5kZXggMzBiM2RmMi4uODFmNTkxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbXRvX2YuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tdG9fZi5oCkBAIC0xLDcgKzEsMTMgQEAKLWV4dGVybiB2b2lkIE1UT19Jbml0KFBXQjMyX0FEQVBURVIpOwotZXh0ZXJuIHZvaWQgTVRPX1BlcmlvZGljVGltZXJFeHBpcmVkKFBXQjMyX0FEQVBURVIpOwotZXh0ZXJuIHZvaWQgTVRPX1NldERUT1JhdGVSYW5nZShQV0IzMl9BREFQVEVSLCB1OCAqLCB1OCk7CisjaWZuZGVmIF9fV0lOQk9ORF9NVE9fRl9ICisjZGVmaW5lIF9fV0lOQk9ORF9NVE9fRl9ICisKKyNpbmNsdWRlICJjb3JlLmgiCisKK2V4dGVybiB2b2lkIE1UT19Jbml0KHN0cnVjdCB3YnNvZnRfcHJpdiAqKTsKK2V4dGVybiB2b2lkIE1UT19QZXJpb2RpY1RpbWVyRXhwaXJlZChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKik7CitleHRlcm4gdm9pZCBNVE9fU2V0RFRPUmF0ZVJhbmdlKHN0cnVjdCB3YnNvZnRfcHJpdiAqLCB1OCAqLCB1OCk7CiBleHRlcm4gdTggTVRPX0dldFR4UmF0ZShNVE9fRlVOQ19JTlBVVCwgdTMyIGZwZHVfbGVuKTsKIGV4dGVybiB1OCBNVE9fR2V0VHhGYWxsYmFja1JhdGUoTVRPX0ZVTkNfSU5QVVQpOwogZXh0ZXJuIHZvaWQgTVRPX1NldFR4Q291bnQoTVRPX0ZVTkNfSU5QVVQsIHU4IHQwLCB1OCBpbmRleCk7CiAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvb3NfY29tbW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9vc19jb21tb24uaAppbmRleCBlMjRmZjQxLi4yYzI3NmUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9vc19jb21tb24uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9vc19jb21tb24uaApAQCAtMSwyICsxLDIgQEAKLSNpbmNsdWRlICJsaW51eC9zeXNkZWYuaCIKKyNpbmNsdWRlICJzeXNkZWYuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvcGh5X2NhbGlicmF0aW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9waHlfY2FsaWJyYXRpb24uYwppbmRleCAyNzJhNjUwLi42NzgyNTUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9waHlfY2FsaWJyYXRpb24uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9waHlfY2FsaWJyYXRpb24uYwpAQCAtMTIsNiArMTIsNyBAQAogLyoqKioqKioqKioqKioqKioqKiBJTkNMVURFIEZJTEVTIFNFQ1RJT04gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaW5jbHVkZSAib3NfY29tbW9uLmgiCiAjaW5jbHVkZSAicGh5X2NhbGlicmF0aW9uLmgiCisjaW5jbHVkZSAid2JoYWxfZi5oIgogCiAKIC8qKioqKioqKioqKioqKioqKiogREVCVUcgQ09OU1RBTlQgQU5EIE1BQ1JPIFNFQ1RJT04gKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNDMxLDcgKzQzMiw2IEBACiAKIAl2YWwgfD0gTUFTS19BRENfRENfQ0FMX1NUUjsKIAlod19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX01PREVfQ1RSTCwgdmFsKTsKLQlwYV9zdGFsbF9leGVjdXRpb24oVVMpOyAvLyAqTVVTVCogd2FpdCBmb3IgYSB3aGlsZQogCiAJLy8gZS4gVGhlIHJlc3VsdCBhcmUgc2hvd24gaW4gImFkY19kY19jYWxfaVs4OjBdIGFuZCBhZGNfZGNfY2FsX3FbODowXSIKICNpZmRlZiBfREVCVUcKQEAgLTUyMiw3ICs1MjIsNiBAQAogCXJlZ19tb2RlX2N0cmwgfD0gKE1BU0tfQ0FMSUJfU1RBUlR8MnwoMjw8MikpOwogCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCBSRUdfTU9ERV9DVFJMLCByZWdfbW9kZV9jdHJsKTsKIAlQSFlfREVCVUcoKCJbQ0FMXSAgICBNT0RFX0NUUkwgKHdyaXRlKSA9IDB4JTA4WFxuIiwgcmVnX21vZGVfY3RybCkpOwotCXBhX3N0YWxsX2V4ZWN1dGlvbihVUyk7CiAKIAlod19nZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHg1QywgJnJlZ19kY19jYW5jZWwpOwogCVBIWV9ERUJVRygoIltDQUxdICAgIERDX0NBTkNFTCAocmVhZCkgPSAweCUwOFhcbiIsIHJlZ19kY19jYW5jZWwpKTsKQEAgLTUzNiw3ICs1MzUsNiBAQAogCQlyZWdfZGNfY2FuY2VsICY9IH4oMHgwM0ZGKTsKIAkJUEhZX0RFQlVHKCgiW0NBTF0gICAgRENfQ0FOQ0VMICh3cml0ZSkgPSAweCUwOFhcbiIsIHJlZ19kY19jYW5jZWwpKTsKIAkJaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIDB4NUMsIHJlZ19kY19jYW5jZWwpOwotCQlwYV9zdGFsbF9leGVjdXRpb24oVVMpOwogCiAJCWh3X2dldF9keHhfcmVnKHBod19kYXRhLCBSRUdfQ0FMSUJfUkVBRDIsICZ2YWwpOwogCQlQSFlfREVCVUcoKCJbQ0FMXSAgICBDQUxJQl9SRUFEMiA9IDB4JTA4WFxuIiwgdmFsKSk7CkBAIC01NTIsNyArNTUwLDYgQEAKIAkJcmVnX2RjX2NhbmNlbCB8PSAoMSA8PCBDQU5DRUxfRENfSV9TSElGVCk7CiAJCVBIWV9ERUJVRygoIltDQUxdICAgIERDX0NBTkNFTCAod3JpdGUpID0gMHglMDhYXG4iLCByZWdfZGNfY2FuY2VsKSk7CiAJCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCAweDVDLCByZWdfZGNfY2FuY2VsKTsKLQkJcGFfc3RhbGxfZXhlY3V0aW9uKFVTKTsKIAogCQlod19nZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX0NBTElCX1JFQUQyLCAmdmFsKTsKIAkJUEhZX0RFQlVHKCgiW0NBTF0gICAgQ0FMSUJfUkVBRDIgPSAweCUwOFhcbiIsIHZhbCkpOwpAQCAtNjAwLDcgKzU5Nyw2IEBACiAJcmVnX21vZGVfY3RybCAmPSB+TUFTS19DQUxJQl9TVEFSVDsKIAlod19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX01PREVfQ1RSTCwgcmVnX21vZGVfY3RybCk7CiAJUEhZX0RFQlVHKCgiW0NBTF0gICAgTU9ERV9DVFJMICh3cml0ZSkgPSAweCUwOFhcbiIsIHJlZ19tb2RlX2N0cmwpKTsKLQlwYV9zdGFsbF9leGVjdXRpb24oVVMpOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC02NTEsNyArNjQ3LDYgQEAKIAlyZWdfbW9kZV9jdHJsIHw9IChNQVNLX0NBTElCX1NUQVJUfDMpOwogCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCBSRUdfTU9ERV9DVFJMLCByZWdfbW9kZV9jdHJsKTsKIAlQSFlfREVCVUcoKCJbQ0FMXSAgICBNT0RFX0NUUkwgKHdyaXRlKSA9IDB4JTA4WFxuIiwgcmVnX21vZGVfY3RybCkpOwotCXBhX3N0YWxsX2V4ZWN1dGlvbihVUyk7CiAKIAlod19nZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHg1QywgJnJlZ19kY19jYW5jZWwpOwogCVBIWV9ERUJVRygoIltDQUxdICAgIERDX0NBTkNFTCAocmVhZCkgPSAweCUwOFhcbiIsIHJlZ19kY19jYW5jZWwpKTsKQEAgLTY2NSwxMSArNjYwLDkgQEAKIAkJcmVnX2RjX2NhbmNlbCAmPSB+KDB4MDAxRik7CiAJCVBIWV9ERUJVRygoIltDQUxdICAgIERDX0NBTkNFTCAod3JpdGUpID0gMHglMDhYXG4iLCByZWdfZGNfY2FuY2VsKSk7CiAJCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCAweDVDLCByZWdfZGNfY2FuY2VsKTsKLQkJcGFfc3RhbGxfZXhlY3V0aW9uKFVTKTsKIAogCQlod19nZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX0NBTElCX1JFQUQyLCAmdmFsKTsKIAkJUEhZX0RFQlVHKCgiW0NBTF0gICAgQ0FMSUJfUkVBRDIgPSAweCUwOFhcbiIsIHZhbCkpOwotCQlwYV9zdGFsbF9leGVjdXRpb24oVVMpOwogCiAJCWlxY2FsX2ltYWdlX2kgPSBfczEzX3RvX3MzMih2YWwgJiAweDAwMDAxRkZGKTsKIAkJaXFjYWxfaW1hZ2VfcSA9IF9zMTNfdG9fczMyKCh2YWwgJiAweDAzRkZFMDAwKSA+PiAxMyk7CkBAIC02ODIsMTEgKzY3NSw5IEBACiAJCXJlZ19kY19jYW5jZWwgfD0gKDEgPDwgQ0FOQ0VMX0RDX1FfU0hJRlQpOwogCQlQSFlfREVCVUcoKCJbQ0FMXSAgICBEQ19DQU5DRUwgKHdyaXRlKSA9IDB4JTA4WFxuIiwgcmVnX2RjX2NhbmNlbCkpOwogCQlod19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgMHg1QywgcmVnX2RjX2NhbmNlbCk7Ci0JCXBhX3N0YWxsX2V4ZWN1dGlvbihVUyk7CiAKIAkJaHdfZ2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19DQUxJQl9SRUFEMiwgJnZhbCk7CiAJCVBIWV9ERUJVRygoIltDQUxdICAgIENBTElCX1JFQUQyID0gMHglMDhYXG4iLCB2YWwpKTsKLQkJcGFfc3RhbGxfZXhlY3V0aW9uKFVTKTsKIAogCQlpcWNhbF9pbWFnZV9pID0gX3MxM190b19zMzIodmFsICYgMHgwMDAwMUZGRik7CiAJCWlxY2FsX2ltYWdlX3EgPSBfczEzX3RvX3MzMigodmFsICYgMHgwM0ZGRTAwMCkgPj4gMTMpOwpAQCAtNzMyLDcgKzcyMyw2IEBACiAJcmVnX21vZGVfY3RybCAmPSB+TUFTS19DQUxJQl9TVEFSVDsKIAlod19zZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX01PREVfQ1RSTCwgcmVnX21vZGVfY3RybCk7CiAJUEhZX0RFQlVHKCgiW0NBTF0gICAgTU9ERV9DVFJMICh3cml0ZSkgPSAweCUwOFhcbiIsIHJlZ19tb2RlX2N0cmwpKTsKLQlwYV9zdGFsbF9leGVjdXRpb24oVVMpOwogfQogCiAvLzIwMDYwNjEyLjEuYSAyMDA2MDcxOC4xIE1vZGlmeQpAQCAtNzkyLDEyICs3ODIsMTAgQEAKIAkJCXJlZ19tb2RlX2N0cmwgfD0gKE1BU0tfQ0FMSUJfU1RBUlR8MHgwMnwyPDwyKTsKIAkJCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCBSRUdfTU9ERV9DVFJMLCByZWdfbW9kZV9jdHJsKTsKIAkJCVBIWV9ERUJVRygoIltDQUxdICAgIE1PREVfQ1RSTCAod3JpdGUpID0gMHglMDhYXG4iLCByZWdfbW9kZV9jdHJsKSk7Ci0JCQlwYV9zdGFsbF9leGVjdXRpb24oVVMpOwogCiAJCQkvLyBiLgogCQkJaHdfZ2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19DQUxJQl9SRUFEMSwgJnZhbCk7CiAJCQlQSFlfREVCVUcoKCJbQ0FMXSAgICBDQUxJQl9SRUFEMSA9IDB4JTA4WFxuIiwgdmFsKSk7Ci0JCQlwYV9zdGFsbF9leGVjdXRpb24oVVMpOwogCiAJCQlpcWNhbF90b25lX2kwID0gX3MxM190b19zMzIodmFsICYgMHgwMDAwMUZGRik7CiAJCQlpcWNhbF90b25lX3EwID0gX3MxM190b19zMzIoKHZhbCAmIDB4MDNGRkUwMDApID4+IDEzKTsKQEAgLTgxMyw3ICs4MDEsNiBAQAogCQkJcmVnX21vZGVfY3RybCAmPSB+TUFTS19DQUxJQl9TVEFSVDsKIAkJCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCBSRUdfTU9ERV9DVFJMLCByZWdfbW9kZV9jdHJsKTsKIAkJCVBIWV9ERUJVRygoIltDQUxdICAgIE1PREVfQ1RSTCAod3JpdGUpID0gMHglMDhYXG4iLCByZWdfbW9kZV9jdHJsKSk7Ci0JCQlwYV9zdGFsbF9leGVjdXRpb24oVVMpOwogCiAJCQkvLyBkLiBTZXQgaXFjYWxfbW9kZVsxOjBdIHRvIDB4MyBhbmQgc2V0ICJjYWxpYl9zdGFydCIgdG8gMHgxIHRvCiAJCQkvLyAgICBlbmFibGUgIklRIGFsaWJyYXRpb24gTW9kZSBJSSIKQEAgLTgyMywxMiArODEwLDEwIEBACiAJCQlyZWdfbW9kZV9jdHJsIHw9IChNQVNLX0NBTElCX1NUQVJUfDB4MDMpOwogCQkJaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19NT0RFX0NUUkwsIHJlZ19tb2RlX2N0cmwpOwogCQkJUEhZX0RFQlVHKCgiW0NBTF0gICAgTU9ERV9DVFJMICh3cml0ZSkgPSAweCUwOFhcbiIsIHJlZ19tb2RlX2N0cmwpKTsKLQkJCXBhX3N0YWxsX2V4ZWN1dGlvbihVUyk7CiAKIAkJCS8vIGUuCiAJCQlod19nZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX0NBTElCX1JFQUQxLCAmdmFsKTsKIAkJCVBIWV9ERUJVRygoIltDQUxdICAgIENBTElCX1JFQUQxID0gMHglMDhYXG4iLCB2YWwpKTsKLQkJCXBhX3N0YWxsX2V4ZWN1dGlvbihVUyk7CiAKIAkJCWlxY2FsX3RvbmVfaSA9IF9zMTNfdG9fczMyKHZhbCAmIDB4MDAwMDFGRkYpOwogCQkJaXFjYWxfdG9uZV9xID0gX3MxM190b19zMzIoKHZhbCAmIDB4MDNGRkUwMDApID4+IDEzKTsKQEAgLTEwNzUsNyArMTA2MCw3IEBACiAJLy87IFtCQi1jaGlwXTogQ2FsaWJyYXRpb24gKDZoKS4gQ2FjdWxhdGUgVFgtcGF0aCBJUSBpbWJhbGFuY2UgYW5kIHNldHRpbmcgVFggcGF0aCBJUSBjb21wZW5zYXRpb24gdGFibGUKIAkvL3BoeV9zZXRfcmZfZGF0YShwaHdfZGF0YSwgMywgKDM8PDI0KXwweDAyNTU4Nik7CiAKLQlPU19TTEVFUCgzMDAwMCk7IC8vIDIwMDYwNjEyLjEuYSAzMG1zIGRlbGF5LiBBZGQgdGhlIGZvbGxvdyAyIGxpbmVzCisJbXNsZWVwKDMwKTsgLy8gMjAwNjA2MTIuMS5hIDMwbXMgZGVsYXkuIEFkZCB0aGUgZm9sbG93IDIgbGluZXMKIAkvL1RvIGFkanVzdCBUWFZHQSB0byBmaXQgaXFfbWFnXzAgcmFuZ2UgZnJvbSAxMjUwIH4gMTc1MAogCWFkanVzdF9UWFZHQV9mb3JfaXFfbWFnKCBwaHdfZGF0YSApOwogCkBAIC0xMjgyLDEzICsxMjY3LDExIEBACiAJCWlmKCAhaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19NT0RFX0NUUkwsIHJlZ19tb2RlX2N0cmwpICkvLzIwMDYwNzE4LjEgbW9kaWZ5CiAJCQlyZXR1cm4gMDsKIAkJUEhZX0RFQlVHKCgiW0NBTF0gICAgTU9ERV9DVFJMICh3cml0ZSkgPSAweCUwOFhcbiIsIHJlZ19tb2RlX2N0cmwpKTsKLQkJcGFfc3RhbGxfZXhlY3V0aW9uKFVTKTsKIAogCQlyZWdfbW9kZV9jdHJsICY9IH5NQVNLX0lRQ0FMX01PREU7CiAJCXJlZ19tb2RlX2N0cmwgfD0gKE1BU0tfQ0FMSUJfU1RBUlR8MHgxKTsKIAkJaHdfc2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19NT0RFX0NUUkwsIHJlZ19tb2RlX2N0cmwpOwogCQlQSFlfREVCVUcoKCJbQ0FMXSAgICBNT0RFX0NUUkwgKHdyaXRlKSA9IDB4JTA4WFxuIiwgcmVnX21vZGVfY3RybCkpOwotCQlwYV9zdGFsbF9leGVjdXRpb24oVVMpOyAgLy9TaG91bGQgYmUgcmVhZCBvdXQgYWZ0ZXIgNDUwdXMKIAogCQkvLyBjLgogCQlod19nZXRfZHh4X3JlZyhwaHdfZGF0YSwgUkVHX0NBTElCX1JFQUQxLCAmdmFsKTsKQEAgLTE2OTcsMTEgKzE2ODAsMTAgQEAKIAkJcGh5X3NldF9yZl9kYXRhKHBod19kYXRhLCA1LCAoKDU8PDI0KXxjdXJyZW50X3R4dmdhKSApOwogCQlwaHdfZGF0YS0+dHh2Z2Ffc2V0dGluZ19mb3JfY2FsID0gY3VycmVudF90eHZnYTsKIAotCQkvL3BhX3N0YWxsX2V4ZWN1dGlvbigzMDAwMCk7Ly9TbGVlcCgzMCk7Ci0JCU9TX1NMRUVQKDMwMDAwKTsgLy8gMjAwNjA2MTIuMS5hCisJCW1zbGVlcCgzMCk7IC8vIDIwMDYwNjEyLjEuYQogCiAJCWlmKCAhaHdfZ2V0X2R4eF9yZWcocGh3X2RhdGEsIFJFR19NT0RFX0NUUkwsICZyZWdfbW9kZV9jdHJsKSApIC8vIDIwMDYwNzE4LjEgbW9kaWZ5Ci0JCQlyZXR1cm4gRkFMU0U7CisJCQlyZXR1cm4gZmFsc2U7CiAKIAkJUEhZX0RFQlVHKCgiW0NBTF0gICAgTU9ERV9DVFJMIChyZWFkKSA9IDB4JTA4WFxuIiwgcmVnX21vZGVfY3RybCkpOwogCkBAIC0xNzE0LDE5ICsxNjk2LDE1IEBACiAJCWh3X3NldF9keHhfcmVnKHBod19kYXRhLCBSRUdfTU9ERV9DVFJMLCByZWdfbW9kZV9jdHJsKTsKIAkJUEhZX0RFQlVHKCgiW0NBTF0gICAgTU9ERV9DVFJMICh3cml0ZSkgPSAweCUwOFhcbiIsIHJlZ19tb2RlX2N0cmwpKTsKIAotCQkvL3BhX3N0YWxsX2V4ZWN1dGlvbihVUyk7Ci0JCU9TX1NMRUVQKDEpOyAvLyAyMDA2MDYxMi4xLmEKKwkJdWRlbGF5KDEpOyAvLyAyMDA2MDYxMi4xLmEKIAotCQkvL3BhX3N0YWxsX2V4ZWN1dGlvbigzMDApOy8vU2xlZXAoMzApOwotCQlPU19TTEVFUCgzMDApOyAvLyAyMDA2MDYxMi4xLmEKKwkJdWRlbGF5KDMwMCk7IC8vIDIwMDYwNjEyLjEuYQogCiAJCS8vIGIuCiAJCWh3X2dldF9keHhfcmVnKHBod19kYXRhLCBSRUdfQ0FMSUJfUkVBRDEsICZ2YWwpOwogCiAJCVBIWV9ERUJVRygoIltDQUxdICAgIENBTElCX1JFQUQxID0gMHglMDhYXG4iLCB2YWwpKTsKLQkJLy9wYV9zdGFsbF9leGVjdXRpb24oVVMpOwotCQkvL3BhX3N0YWxsX2V4ZWN1dGlvbigzMDApOy8vU2xlZXAoMzApOwotCQlPU19TTEVFUCgzMDApOyAvLyAyMDA2MDYxMi4xLmEKKwkJdWRlbGF5KDMwMCk7IC8vIDIwMDYwNjEyLjEuYQogCiAJCWlxY2FsX3RvbmVfaTAgPSBfczEzX3RvX3MzMih2YWwgJiAweDAwMDAxRkZGKTsKIAkJaXFjYWxfdG9uZV9xMCA9IF9zMTNfdG9fczMyKCh2YWwgJiAweDAzRkZFMDAwKSA+PiAxMyk7CkBAIC0xNzUwLDkgKzE3MjgsOSBAQAogCX0KIAogCWlmKCBpcV9tYWdfMF90eD49NzAwICYmIGlxX21hZ18wX3R4PD0xNzUwICkKLQkJcmV0dXJuIFRSVUU7CisJCXJldHVybiB0cnVlOwogCWVsc2UKLQkJcmV0dXJuIEZBTFNFOworCQlyZXR1cm4gZmFsc2U7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvcGh5X2NhbGlicmF0aW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9waHlfY2FsaWJyYXRpb24uaAppbmRleCBiNmE2NWQzLi4wM2I4MjBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9waHlfY2FsaWJyYXRpb24uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9waHlfY2FsaWJyYXRpb24uaApAQCAtMSwzICsxLDggQEAKKyNpZm5kZWYgX19XSU5CT05EX1BIWV9DQUxJQlJBVElPTl9ICisjZGVmaW5lIF9fV0lOQk9ORF9QSFlfQ0FMSUJSQVRJT05fSAorCisjaW5jbHVkZSAid2JoYWxfZi5oIgorCiAvLyAyMDAzMTIyOSBUdXJibyBhZGQKICNkZWZpbmUgUkVHX0FHQ19DVFJMMSAgICAgICAgICAgICAgIDB4MTAwMAogI2RlZmluZSBSRUdfQUdDX0NUUkwyICAgICAgICAgICAgICAgMHgxMDA0CkBAIC05OSwzICsxMDQsNCBAQAogdm9pZCBwaHlfc2V0X3JmX2RhdGEoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MzIgaW5kZXgsICB1MzIgdmFsdWUgKTsKICNkZWZpbmUgcGh5X2luaXRfcmYoIF9BICkJLy9SRlN5bnRoZXNpemVyX2luaXRpYWwoIF9BICkKIAorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9yZWcuYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3JlZy5jCmluZGV4IDU3YWY1YjguLmNkMjEyNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3JlZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3JlZy5jCkBAIC0xLDQgKzEsNSBAQAogI2luY2x1ZGUgIm9zX2NvbW1vbi5oIgorI2luY2x1ZGUgIndiaGFsX2YuaCIKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyBPcmlnaW5hbCBQaHkuaApAQCAtOTc2LDkgKzk3Nyw5IEBACiAKIAkJLy8gMjAwNjA1MTEuMSBGaXggdGhlIGZvbGxvd2luZyA0IHN0ZXBzIGZvciBSeCBvZiBSRiAyMjMwIGluaXRpYWwgZmFpbAogCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwM2Q0LCAweDgwICk7Ly8gcmVndWxhdG9yIG9uIG9ubHkKLQkJT1NfU0xFRVAoMTAwMDApOyAvLyBNb2RpZnkgMjAwNTEyMjEuMS5iCisJCW1zbGVlcCgxMCk7IC8vIE1vZGlmeSAyMDA1MTIyMS4xLmIKIAkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDNkNCwgMHhiOCApOy8vIFJFR19PTiBSRl9SU1ROIG9uLCBhbmQKLQkJT1NfU0xFRVAoMTAwMDApOyAvLyBNb2RpZnkgMjAwNTEyMjEuMS5iCisJCW1zbGVlcCgxMCk7IC8vIE1vZGlmeSAyMDA1MTIyMS4xLmIKIAogCQlsdG1wID0gMHg0OTY4OwogCQlpZiggKHBId0RhdGEtPnBoeV90eXBlID09IFJGX1dCXzI0MikgfHwKQEAgLTk4OCwxMiArOTg5LDEyIEBACiAKIAkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDNkNCwgMHhhMCApOy8vIFBMTF9QRCBSRUZfUEQgc2V0IHRvIDAKIAotCQlPU19TTEVFUCgyMDAwMCk7IC8vIE1vZGlmeSAyMDA1MTIyMS4xLmIKKwkJbXNsZWVwKDIwKTsgLy8gTW9kaWZ5IDIwMDUxMjIxLjEuYgogCQlXYjM1UmVnX1JlYWRTeW5jKCBwSHdEYXRhLCAweDAzZDAsICZsdG1wICk7CiAJCWxvb3AgPSA1MDA7IC8vIFdhaXQgZm9yIDUgc2Vjb25kIDIwMDYxMTAxCiAJCXdoaWxlKCAhKGx0bXAgJiAweDIwKSAmJiBsb29wLS0gKQogCQl7Ci0JCQlPU19TTEVFUCgxMDAwMCk7IC8vIE1vZGlmeSAyMDA1MTIyMS4xLmIKKwkJCW1zbGVlcCgxMCk7IC8vIE1vZGlmeSAyMDA1MTIyMS4xLmIKIAkJCWlmKCAhV2IzNVJlZ19SZWFkU3luYyggcEh3RGF0YSwgMHgwM2QwLCAmbHRtcCApICkKIAkJCQlicmVhazsKIAkJfQpAQCAtMTAwMiw3ICsxMDAzLDcgQEAKIAl9CiAKIAlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwM2IwLCAxICk7Ly8gUmVzZXQgaGFyZHdhcmUgZmlyc3QKLQlPU19TTEVFUCgxMDAwMCk7IC8vIEFkZCB0aGlzIDIwMDUxMjIxLjEuYgorCW1zbGVlcCgxMCk7IC8vIEFkZCB0aGlzIDIwMDUxMjIxLjEuYgogCiAJLy8gU2V0IGJ1cnN0IHdyaXRlIGRlbGF5CiAJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDNmOCwgMHg3ZmYgKTsKQEAgLTExNjcsMjMgKzExNjgsMjMgQEAKIAkJCS8vIDIwMDYwNTExLjEgLS0tIE1vZGlmeWluZyB0aGUgZm9sbG93IHN0ZXAgZm9yIFJ4IGlzc3VlLS0tLS0tLS0tLS0tLS0tLS0KIAkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjAgPDwgMjQpIHwgQml0UmV2ZXJzZSggKDB4MDc8PDIwKXwweEUxNjhFLCAyMCk7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7Ci0JCQlPU19TTEVFUCgxMDAwMCk7CisJCQltc2xlZXAoMTApOwogCQkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyMCA8PCAyNCkgfCBCaXRSZXZlcnNlKCBhbDIyMzBfcmZfZGF0YVs3XSwgMjApOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwotCQkJT1NfU0xFRVAoMTAwMDApOworCQkJbXNsZWVwKDEwKTsKIAogCQljYXNlIFJGX0FJUk9IQV8yMjMwUzogLy8gMjAwNjA0MjAgQWRkIHRoaXMKIAogCQkJLy8gMjAwNjA1MTEuMSAtLS0gTW9kaWZ5aW5nIHRoZSBmb2xsb3cgc3RlcCBmb3IgUnggaXNzdWUtLS0tLS0tLS0tLS0tLS0tLQogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDNkNCwgMHg4MCApOy8vIHJlZ3VsYXRvciBvbiBvbmx5Ci0JCQlPU19TTEVFUCgxMDAwMCk7IC8vIE1vZGlmeSAyMDA1MTIyMS4xLmIKKwkJCW1zbGVlcCgxMCk7IC8vIE1vZGlmeSAyMDA1MTIyMS4xLmIKIAogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDNkNCwgMHhhMCApOy8vIFBMTF9QRCBSRUZfUEQgc2V0IHRvIDAKLQkJCU9TX1NMRUVQKDEwMDAwKTsgLy8gTW9kaWZ5IDIwMDUxMjIxLjEuYgorCQkJbXNsZWVwKDEwKTsgLy8gTW9kaWZ5IDIwMDUxMjIxLjEuYgogCiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwM2Q0LCAweGUwICk7Ly8gTUxLX0VOCiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwM2IwLCAxICk7Ly8gUmVzZXQgaGFyZHdhcmUgZmlyc3QKLQkJCU9TX1NMRUVQKDEwMDAwKTsgLy8gQWRkIHRoaXMgMjAwNTEyMjEuMS5iCisJCQltc2xlZXAoMTApOyAvLyBBZGQgdGhpcyAyMDA1MTIyMS4xLmIKIAkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIAkJCS8vIFRoZSBmb2xsb3cgY29kZSBkb2Vzbid0IHVzZSB0aGUgYnVyc3Qtd3JpdGUgbW9kZQpAQCAtMTE5MSwzMCArMTE5MiwzMCBAQAogCQkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyMCA8PCAyNCkgfCBCaXRSZXZlcnNlKCAoMHgwRjw8MjApIHwgMHhGMDFBMCwgMjApOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwogCi0JCQlsdG1wID0gcEh3RGF0YS0+V2IzNVJlZy5CQjVDICYgMHhmZmZmZjAwMDsKKwkJCWx0bXAgPSBwSHdEYXRhLT5yZWcuQkI1QyAmIDB4ZmZmZmYwMDA7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgxMDVjLCBsdG1wICk7Ci0JCQlwSHdEYXRhLT5XYjM1UmVnLkJCNTAgfD0gMHgxMzsvLyhNQVNLX0lRQ0FMX01PREV8TUFTS19DQUxJQl9TVEFSVCk7Ly8yMDA2MDMxNS4xIG1vZGlmeQotICAgICAgICAJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MTA1MCwgcEh3RGF0YS0+V2IzNVJlZy5CQjUwKTsKLQkJCU9TX1NMRUVQKDUwMDApOworCQkJcEh3RGF0YS0+cmVnLkJCNTAgfD0gMHgxMzsvLyhNQVNLX0lRQ0FMX01PREV8TUFTS19DQUxJQl9TVEFSVCk7Ly8yMDA2MDMxNS4xIG1vZGlmeQorCSAgICAgICAgCVdiMzVSZWdfV3JpdGVTeW5jKHBId0RhdGEsIDB4MTA1MCwgcEh3RGF0YS0+cmVnLkJCNTApOworCQkJbXNsZWVwKDUpOwogCiAJCQkvL3BoeV9zZXRfcmZfZGF0YShwaHdfZGF0YSwgMHgwRiwgKDB4MEY8PDIwKSB8IDB4RjAxQjApOyAvL0FjdGl2YXRlIEZpbHRlciBDYWwuCiAJCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDIwIDw8IDI0KSB8IEJpdFJldmVyc2UoICgweDBGPDwyMCkgfCAweEYwMUIwLCAyMCk7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7Ci0JCQlPU19TTEVFUCg1MDAwKTsKKwkJCW1zbGVlcCg1KTsKIAogCQkJLy9waHlfc2V0X3JmX2RhdGEocGh3X2RhdGEsIDB4MEYsICgweDBGPDwyMCkgfCAweEYwMWUwKTsgLy9BY3RpdmF0ZSBUWCBEQ0MKIAkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjAgPDwgMjQpIHwgQml0UmV2ZXJzZSggKDB4MEY8PDIwKSB8IDB4RjAxRTAsIDIwKTsKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKLQkJCU9TX1NMRUVQKDUwMDApOworCQkJbXNsZWVwKDUpOwogCiAJCQkvL3BoeV9zZXRfcmZfZGF0YShwaHdfZGF0YSwgMHgwRiwgKDB4MEY8PDIwKSB8IDB4RjAxQTApOyAvL1Jlc290cmUgSW5pdGlhbCBTZXR0aW5nCiAJCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDIwIDw8IDI0KSB8IEJpdFJldmVyc2UoICgweDBGPDwyMCkgfCAweEYwMUEwLCAyMCk7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7CiAKIC8vCQkJLy9Gb3JjZSBUWEkoUSlQKE4pIHRvIG5vcm1hbCBjb250cm9sCi0JCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgxMDVjLCBwSHdEYXRhLT5XYjM1UmVnLkJCNUMgKTsKLQkJCXBId0RhdGEtPldiMzVSZWcuQkI1MCAmPSB+MHgxMzsvLyhNQVNLX0lRQ0FMX01PREV8TUFTS19DQUxJQl9TVEFSVCk7Ci0gICAgICAgIAlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgxMDUwLCBwSHdEYXRhLT5XYjM1UmVnLkJCNTApOworCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MTA1YywgcEh3RGF0YS0+cmVnLkJCNUMgKTsKKwkJCXBId0RhdGEtPnJlZy5CQjUwICY9IH4weDEzOy8vKE1BU0tfSVFDQUxfTU9ERXxNQVNLX0NBTElCX1NUQVJUKTsKKyAgICAgICAgCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDEwNTAsIHBId0RhdGEtPnJlZy5CQjUwKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgUkZfQUlST0hBXzcyMzA6CkBAIC0xMjI5LDE2ICsxMjMwLDE2IEBACiAJCQkvLzIuNEdIegogCQkJLy9sdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDI0IDw8IDI0KSB8IDB4MUFCQThGOwogCQkJLy9XYjM1UmVnX1dyaXRlU3luYyBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKLQkJCS8vT1NfU0xFRVAoMTAwMCk7IC8vIFNsZWVwIDEgbXMKKwkJCS8vbXNsZWVwKDEpOyAvLyBTbGVlcCAxIG1zCiAJCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDI0IDw8IDI0KSB8IDB4OUFCQThGOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwotCQkJT1NfU0xFRVAoNTAwMCk7CisJCQltc2xlZXAoNSk7CiAJCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDI0IDw8IDI0KSB8IDB4M0FCQThGOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwotCQkJT1NfU0xFRVAoNTAwMCk7CisJCQltc2xlZXAoNSk7CiAJCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDI0IDw8IDI0KSB8IDB4MUFCQThGOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwotCQkJT1NfU0xFRVAoNTAwMCk7CisJCQltc2xlZXAoNSk7CiAKIAkJCS8vNUdIegogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDNkYywgMHgwMDAwMDAwMCApOwpAQCAtMTI1MSw3ICsxMjUyLDcgQEAKIAkJCS8vIFdyaXRlIHRvIHJlZ2lzdGVyLiBudW1iZXIgbXVzdCBsZXNzIGFuZCBlcXVhbCB0aGFuIDE2CiAJCQlmb3IoIGk9MDsgaTxudW1iZXI7IGkrKyApCiAJCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgcGx0bXBbaV0gKTsKLQkJCU9TX1NMRUVQKDUwMDApOworCQkJbXNsZWVwKDUpOwogCiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwM2RjLCAweDAwMDAwMDgwICk7CiAJCQkjaWZkZWYgX1BFX1NUQVRFX0RVTVBfCkBAIC0xMjYyLDEzICsxMjYzLDEzIEBACiAJCQkvL1diMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKIAkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjQgPDwgMjQpIHwgMHg5QUJBOEY7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7Ci0JCQlPU19TTEVFUCg1MDAwKTsKKwkJCW1zbGVlcCg1KTsKIAkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjQgPDwgMjQpIHwgMHgzQUJBOEY7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7Ci0JCQlPU19TTEVFUCg1MDAwKTsKKwkJCW1zbGVlcCg1KTsKIAkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjQgPDwgMjQpIHwgMHgxMkJBQ0Y7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7Ci0JCQlPU19TTEVFUCg1MDAwKTsKKwkJCW1zbGVlcCg1KTsKIAogCQkJLy9XYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwM2RjLCAweDAwMDAwMDgwICk7CiAJCQkvL1dCREVCVUcoKCIqIFBMTF9PTiAgICBoaWdoXG4iKSk7CkBAIC0xMjgwLDIxICsxMjgxLDIxIEBACiAJCQkvLwogCQkJLy8gOyBWZXJzaW9uIDEuM0IgcmV2aXNpb24gaXRlbXM6IGZvciBGQTU5NzZBICwgT2N0b2JlciAzLCAyMDA1IGJ5IEhUSG8KIAkJCS8vCi0JCQlsdG1wID0gcEh3RGF0YS0+V2IzNVJlZy5CQjVDICYgMHhmZmZmZjAwMDsKKwkJCWx0bXAgPSBwSHdEYXRhLT5yZWcuQkI1QyAmIDB4ZmZmZmYwMDA7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgxMDVjLCBsdG1wICk7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgxMDU4LCAwICk7Ci0JCQlwSHdEYXRhLT5XYjM1UmVnLkJCNTAgfD0gMHgzOy8vKE1BU0tfSVFDQUxfTU9ERXxNQVNLX0NBTElCX1NUQVJUKTsvLzIwMDYwNjMwCi0JICAgICAgCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDEwNTAsIHBId0RhdGEtPldiMzVSZWcuQkI1MCk7CisJCQlwSHdEYXRhLT5yZWcuQkI1MCB8PSAweDM7Ly8oTUFTS19JUUNBTF9NT0RFfE1BU0tfQ0FMSUJfU1RBUlQpOy8vMjAwNjA2MzAKKwkJICAgICAgCVdiMzVSZWdfV3JpdGVTeW5jKHBId0RhdGEsIDB4MTA1MCwgcEh3RGF0YS0+cmVnLkJCNTApOwogCiAJCQkvLy0tLS0tIENhbGlicmF0aW9uICgxKS4gVkNPIGZyZXF1ZW5jeSBjYWxpYnJhdGlvbgogCQkJLy9DYWxpYnJhdGlvbiAoMWEuMCkuIFN5bnRoZXNpemVyIHJlc2V0IChIVEhvIGNvcnJlY3RlZCAyMDA1LzA1LzEwKQogCQkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyNCA8PCAyNCkgfCBCaXRSZXZlcnNlKCAoMHgwRjw8MjQpIHwgMHgwMDEwMUUsIDI0KTsKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKLQkJCU9TX1NMRUVQKCA1MDAwICk7IC8vIFNsZWVwIDVtcworCQkJbXNsZWVwKDUpOyAvLyBTbGVlcCA1bXMKIAkJCS8vQ2FsaWJyYXRpb24gKDFhKS4gVkNPIGZyZXF1ZW5jeSBjYWxpYnJhdGlvbiBtb2RlIDsgd2FpdGluZyAybXNlYyBWQ08gY2FsaWJyYXRpb24gdGltZQogCQkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyNCA8PCAyNCkgfCBCaXRSZXZlcnNlKCAoMHgwMDw8MjQpIHwgMHhGRTY5YzAsIDI0KTsKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKLQkJCU9TX1NMRUVQKCAyMDAwICk7IC8vIFNsZWVwIDJtcworCQkJbXNsZWVwKDIpOyAvLyBTbGVlcCAybXMKIAogCQkJLy8tLS0tLSBDYWxpYnJhdGlvbiAoMikuIFRYIGJhc2ViYW5kIEdtLUMgZmlsdGVyIGF1dG8tdHVuaW5nCiAJCQkvL0NhbGlicmF0aW9uICgyYSkuIHR1cm4gb2ZmIEVOQ0FMIHNpZ25hbApAQCAtMTMwOSw3ICsxMzEwLDcgQEAKIAkJCS8vQ2FsaWJyYXRpb24gKDJjKS4gdHVybi1vbiBUWCBHbS1DIGZpbHRlciBhdXRvLXR1bmluZwogCQkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyNCA8PCAyNCkgfCBCaXRSZXZlcnNlKCAoMHgwMDw8MjQpIHwgMHhGQ0VCQzAsIDI0KTsKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKLQkJCU9TX1NMRUVQKCAxNTAgKTsgLy8gU2xlZXAgMTUwIHVzCisJCQl1ZGVsYXkoMTUwKTsgLy8gU2xlZXAgMTUwIHVzCiAJCQkvL3R1cm4gb2ZmIEVOQ0FMIHNpZ25hbAogCQkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyNCA8PCAyNCkgfCBCaXRSZXZlcnNlKCAoMHgwMDw8MjQpIHwgMHhGOEVCQzAsIDI0KTsKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKQEAgLTEzMjcsNyArMTMyOCw3IEBACiAJCQkvL0NhbGlicmF0aW9uICgzYykuIHR1cm4tb24gUlggR20tQyBmaWx0ZXIgYXV0by10dW5pbmcKIAkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjQgPDwgMjQpIHwgQml0UmV2ZXJzZSggKDB4MDA8PDI0KSB8IDB4RkVFREMwLCAyNCk7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7Ci0JCQlPU19TTEVFUCggMTUwICk7IC8vIFNsZWVwIDE1MCB1cworCQkJdWRlbGF5KDE1MCk7IC8vIFNsZWVwIDE1MCB1cwogCQkJLy9DYWxpYnJhdGlvbiAoM2UpLiB0dXJuIG9mZiBFTkNBTCBzaWduYWwKIAkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjQgPDwgMjQpIHwgQml0UmV2ZXJzZSggKDB4MDA8PDI0KSB8IDB4RkFFREMwLCAyNCk7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7CkBAIC0xMzM2LDcgKzEzMzcsNyBAQAogCQkJLy9DYWxpYnJhdGlvbiAoNGEpLiBUWCBMTyBsZWFrYWdlIGNhbGlicmF0aW9uCiAJCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDI0IDw8IDI0KSB8IEJpdFJldmVyc2UoICgweDAwPDwyNCkgfCAweEZENkJDMCwgMjQpOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwotCQkJT1NfU0xFRVAoIDE1MCApOyAvLyBTbGVlcCAxNTAgdXMKKwkJCXVkZWxheSgxNTApOyAvLyBTbGVlcCAxNTAgdXMKIAogCQkJLy8tLS0tLSBDYWxpYnJhdGlvbiAoNSkuIFJYIERDIG9mZnNldCBjYWxpYnJhdGlvbgogCQkJLy9DYWxpYnJhdGlvbiAoNWEpLiB0dXJuIG9mZiBFTkNBTCBzaWduYWwgYW5kIHNldCB0byBSWCBTVyBEQyBjYWxpcmF0aW9uIG1vZGUKQEAgLTEzNTMsNyArMTM1NCw3IEBACiAJCQkvL0NhbGlicmF0aW9uICg1ZCkuIHR1cm4gb24gUlggREMgb2Zmc2V0IGNhbCBmdW5jdGlvbjsgYW5kIHdhaXRpbmcgMiBtc2VjIGNhbCB0aW1lCiAJCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDI0IDw8IDI0KSB8IEJpdFJldmVyc2UoICgweDAwPDwyNCkgfCAweEZGNkRDMCwgMjQpOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwotCQkJT1NfU0xFRVAoMjAwMCk7IC8vIFNsZWVwIDJtcworCQkJbXNsZWVwKDIpOyAvLyBTbGVlcCAybXMKIAkJCS8vQ2FsaWJyYXRpb24gKDVmKS4gdHVybiBvZmYgRU5DQUwgc2lnbmFsCiAJCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDI0IDw8IDI0KSB8IEJpdFJldmVyc2UoICgweDAwPDwyNCkgfCAweEZBRURDMCwgMjQpOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwpAQCAtMTM2NSw3ICsxMzY2LDcgQEAKIAkJCS8vQ2FsaWJyYXRpb24gKDVkKS4gdHVybiBvbiBSWCBEQyBvZmZzZXQgY2FsIGZ1bmN0aW9uOyBhbmQgd2FpdGluZyAyIG1zZWMgY2FsIHRpbWUKIAkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjQgPDwgMjQpIHwgQml0UmV2ZXJzZSggKDB4MDA8PDI0KSB8IDB4RkY2REMwLCAyNCk7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7Ci0JCQlPU19TTEVFUCgyMDAwKTsgLy8gU2xlZXAgMm1zCisJCQltc2xlZXAoMik7IC8vIFNsZWVwIDJtcwogCQkJLy9DYWxpYnJhdGlvbiAoNWYpLiB0dXJuIG9mZiBFTkNBTCBzaWduYWwKIAkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjQgPDwgMjQpIHwgQml0UmV2ZXJzZSggKDB4MDA8PDI0KSB8IDB4RkFFREMwLCAyNCk7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7CkBAIC0xMzc3LDcgKzEzNzgsNyBAQAogCQkJLy9DYWxpYnJhdGlvbiAoNWQpLiB0dXJuIG9uIFJYIERDIG9mZnNldCBjYWwgZnVuY3Rpb247IGFuZCB3YWl0aW5nIDIgbXNlYyBjYWwgdGltZQogCQkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyNCA8PCAyNCkgfCBCaXRSZXZlcnNlKCAoMHgwMDw8MjQpIHwgMHhGRjZEQzAsIDI0KTsKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKLQkJCU9TX1NMRUVQKDIwMDApOyAvLyBTbGVlcCAybXMKKwkJCW1zbGVlcCgyKTsgLy8gU2xlZXAgMm1zCiAJCQkvL0NhbGlicmF0aW9uICg1ZikuIHR1cm4gb2ZmIEVOQ0FMIHNpZ25hbAogCQkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyNCA8PCAyNCkgfCBCaXRSZXZlcnNlKCAoMHgwMDw8MjQpIHwgMHhGQUVEQzAsIDI0KTsKIAkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjQsIGx0bXAgKTsKQEAgLTEzODksNyArMTM5MCw3IEBACiAJCQkvL0NhbGlicmF0aW9uICg1ZCkuIHR1cm4gb24gUlggREMgb2Zmc2V0IGNhbCBmdW5jdGlvbjsgYW5kIHdhaXRpbmcgMiBtc2VjIGNhbCB0aW1lCiAJCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDI0IDw8IDI0KSB8IEJpdFJldmVyc2UoICgweDAwPDwyNCkgfCAweEZGNkRDMCwgMjQpOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwotCQkJT1NfU0xFRVAoMjAwMCk7IC8vIFNsZWVwIDJtcworCQkJbXNsZWVwKDIpOyAvLyBTbGVlcCAybXMKIAkJCS8vQ2FsaWJyYXRpb24gKDVmKS4gdHVybiBvZmYgRU5DQUwgc2lnbmFsCiAJCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDI0IDw8IDI0KSB8IEJpdFJldmVyc2UoICgweDAwPDwyNCkgfCAweEZBRURDMCwgMjQpOwogCQkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2NCwgbHRtcCApOwpAQCAtMTM5OSwzMCArMTQwMCwzMCBAQAogCiAJCQkvLzsgLS0tLS0gQ2FsaWJyYXRpb24gKDcpLiBTd2l0Y2ggUkYgY2hpcCB0byBub3JtYWwgbW9kZQogCQkJLy8weDAwIDB4Rjg2MTAwIDsgM0UxODQgICA7IFN3aXRjaCBSRiBjaGlwIHRvIG5vcm1hbCBtb2RlCi0vLwkJCU9TX1NMRUVQKDEwMDAwKTsgLy8gQEAgMjAwNjA3MjEKKy8vCQkJbXNsZWVwKDEwKTsgLy8gQEAgMjAwNjA3MjEKIAkJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjQgPDwgMjQpIHwgQml0UmV2ZXJzZSggKDB4MDA8PDI0KSB8IDB4Rjg2MTAwLCAyNCk7CiAJCQlXYjM1UmVnX1dyaXRlU3luYyggcEh3RGF0YSwgMHgwODY0LCBsdG1wICk7Ci0JCQlPU19TTEVFUCg1MDAwKTsgLy8gU2xlZXAgNSBtcworCQkJbXNsZWVwKDUpOyAvLyBTbGVlcCA1IG1zCiAKIC8vCQkJLy93cml0ZSBiYWNrCi0vLwkJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDEwNWMsIHBId0RhdGEtPldiMzVSZWcuQkI1QyApOwotLy8JCQlwSHdEYXRhLT5XYjM1UmVnLkJCNTAgJj0gfjB4MTM7Ly8oTUFTS19JUUNBTF9NT0RFfE1BU0tfQ0FMSUJfU1RBUlQpOyAvLyAyMDA2MDMxNS4xIGZpeAotLy8gICAgICAJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MTA1MCwgcEh3RGF0YS0+V2IzNVJlZy5CQjUwKTsKLS8vCQkJT1NfU0xFRVAoMTAwMCk7IC8vIFNsZWVwIDEgbXMKKy8vCQkJV2IzNVJlZ19Xcml0ZVN5bmMocEh3RGF0YSwgMHgxMDVjLCBwSHdEYXRhLT5yZWcuQkI1Qyk7CisvLwkJCXBId0RhdGEtPnJlZy5CQjUwICY9IH4weDEzOy8vKE1BU0tfSVFDQUxfTU9ERXxNQVNLX0NBTElCX1NUQVJUKTsgLy8gMjAwNjAzMTUuMSBmaXgKKy8vCQkgICAgICAJV2IzNVJlZ19Xcml0ZVN5bmMocEh3RGF0YSwgMHgxMDUwLCBwSHdEYXRhLT5yZWcuQkI1MCk7CisvLwkJCW1zbGVlcCgxKTsgLy8gU2xlZXAgMSBtcwogCQkJYnJlYWs7CiAJfQogfQogCiB2b2lkIEJCUHJvY2Vzc29yX0FMNzIzMF8yNDAwKCAgcGh3X2RhdGFfdCBwSHdEYXRhKQogewotCVBXQjM1UkVHCXBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7CisJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOwogCXUzMglwbHRtcFsxMl07CiAKIAlwbHRtcFswXSA9IDB4MTZBODMzN0E7IC8vIDB4MTZhNTIxNWY7IC8vIDB4MTAwMCBBR0NfQ3RybDEKIAlwbHRtcFsxXSA9IDB4OUFGRjlBQTY7IC8vIDB4OWFmZjljYTY7IC8vIDB4MTAwNCBBR0NfQ3RybDIKIAlwbHRtcFsyXSA9IDB4NTVEMDBBMDQ7IC8vIDB4NTVkMDBhMDQ7IC8vIDB4MTAwOCBBR0NfQ3RybDMKIAlwbHRtcFszXSA9IDB4RkZGNzIwMzE7IC8vIDB4RmZGZjIxMzg7IC8vIDB4MTAwYyBBR0NfQ3RybDQKLQlwV2IzNVJlZy0+QkIwQyA9IDB4RkZGNzIwMzE7CisJcmVnLT5CQjBDID0gMHhGRkY3MjAzMTsKIAlwbHRtcFs0XSA9IDB4MEZhY0RDQzU7IC8vIDB4MTAxMCBBR0NfQ3RybDUgLy8gMjAwNTA5MjcgMHgwRmFjRENCNwogCXBsdG1wWzVdID0gMHgwMENBQTMzMzsgLy8gMHgwMGVhYTMzMzsgLy8gMHgxMDE0IEFHQ19DdHJsNgogCXBsdG1wWzZdID0gMHhGMjIxMTExMTsgLy8gMHgxMTExMTExMTsgLy8gMHgxMDE4IEFHQ19DdHJsNwpAQCAtMTQzMSwyNSArMTQzMiwyNSBAQAogCXBsdG1wWzldID0gMHhBODAwMkE3OTsgLy8gMHhhOTAwMkE3OTsgLy8gMHgxMDI0IEFHQ19DdHJsMTAKIAlwbHRtcFsxMF0gPSAweDQwMDAwNTI4OyAvLyAyMDA1MDkyNyAweDQwMDAwMjI4CiAJcGx0bXBbMTFdID0gMHgyMzJEN0YzMDsgLy8gMHgyMzQ1N2YzMDsvLyAweDEwMmMgQV9BQ1FfQ3RybAotCXBXYjM1UmVnLT5CQjJDID0gMHgyMzJEN0YzMDsKKwlyZWctPkJCMkMgPSAweDIzMkQ3RjMwOwogCVdiMzVSZWdfQnVyc3RXcml0ZSggcEh3RGF0YSwgMHgxMDAwLCBwbHRtcCwgMTIsIEFVVE9fSU5DUkVNRU5UICk7CiAKIAlwbHRtcFswXSA9IDB4MDAwMDJjNTQ7IC8vIDB4MTAzMCBCX0FDUV9DdHJsCi0JcFdiMzVSZWctPkJCMzAgPSAweDAwMDAyYzU0OworCXJlZy0+QkIzMCA9IDB4MDAwMDJjNTQ7CiAJcGx0bXBbMV0gPSAweDAwQzBENkM1OyAvLyAweDEwMzQgQV9UWFJYX0N0cmwKIAlwbHRtcFsyXSA9IDB4NUIyQzg3Njk7IC8vIDB4MTAzOCBCX1RYUlhfQ3RybAogCXBsdG1wWzNdID0gMHgwMDAwMDAwMDsgLy8gMHgxMDNjIDExYSBUWCBMUyBmaWx0ZXIKLQlwV2IzNVJlZy0+QkIzQyA9IDB4MDAwMDAwMDA7CisJcmVnLT5CQjNDID0gMHgwMDAwMDAwMDsKIAlwbHRtcFs0XSA9IDB4MDAwMDNGMjk7IC8vIDB4MTA0MCAxMWEgVFggTFMgZmlsdGVyCiAJcGx0bXBbNV0gPSAweDBFRkVGQkZFOyAvLyAweDEwNDQgMTFhIFRYIExTIGZpbHRlcgogCXBsdG1wWzZdID0gMHgwMDMzMkMxQjsgLy8gMHgwMDQ1M0IyNDsgLy8gMHgxMDQ4IDExYiBUWCBSQyBmaWx0ZXIKIAlwbHRtcFs3XSA9IDB4MEEwMEZFRkY7IC8vIDB4MEUwMEZFRkY7IC8vIDB4MTA0YyAxMWIgVFggUkMgZmlsdGVyCiAJcGx0bXBbOF0gPSAweDJCMTA2MjA4OyAvLyAweDEwNTAgTU9ERV9DdHJsCi0JcFdiMzVSZWctPkJCNTAgPSAweDJCMTA2MjA4OworCXJlZy0+QkI1MCA9IDB4MkIxMDYyMDg7CiAJcGx0bXBbOV0gPSAwOyAvLyAweDEwNTQKLQlwV2IzNVJlZy0+QkI1NCA9IDB4MDAwMDAwMDA7CisJcmVnLT5CQjU0ID0gMHgwMDAwMDAwMDsKIAlwbHRtcFsxMF0gPSAweDUyNTI0MjQyOyAvLyAweDY0NjQ1MjUyOyAvLyAweDEwNTggSVFfQWxwaGEKLQlwV2IzNVJlZy0+QkI1OCA9IDB4NTI1MjQyNDI7CisJcmVnLT5CQjU4ID0gMHg1MjUyNDI0MjsKIAlwbHRtcFsxMV0gPSAweEFBMEFDMDAwOyAvLyAweDEwNWMgRENfQ2FuY2VsCiAJV2IzNVJlZ19CdXJzdFdyaXRlKCBwSHdEYXRhLCAweDEwMzAsIHBsdG1wLCAxMiwgQVVUT19JTkNSRU1FTlQgKTsKIApAQCAtMTQ1NywxNCArMTQ1OCwxNCBAQAogCiB2b2lkIEJCUHJvY2Vzc29yX0FMNzIzMF81MDAwKCAgcGh3X2RhdGFfdCBwSHdEYXRhKQogewotCVBXQjM1UkVHCXBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7CisJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOwogCXUzMglwbHRtcFsxMl07CiAKIAlwbHRtcFswXSA9IDB4MTZBQTY2Nzg7IC8vIDB4MTAwMCBBR0NfQ3RybDEKIAlwbHRtcFsxXSA9IDB4OUFGRkEwQjI7IC8vIDB4MTAwNCBBR0NfQ3RybDIKIAlwbHRtcFsyXSA9IDB4NTVEMDBBMDQ7IC8vIDB4MTAwOCBBR0NfQ3RybDMKIAlwbHRtcFszXSA9IDB4RUZGRjIzM0U7IC8vIDB4MTAwYyBBR0NfQ3RybDQKLQlwV2IzNVJlZy0+QkIwQyA9IDB4RUZGRjIzM0U7CisJcmVnLT5CQjBDID0gMHhFRkZGMjMzRTsKIAlwbHRtcFs0XSA9IDB4MEZhY0RDQzU7IC8vIDB4MTAxMCBBR0NfQ3RybDUgLy8gMjAwNTA5MjcgMHgwRmFjRENCNwogCXBsdG1wWzVdID0gMHgwMENBQTMzMzsgLy8gMHgxMDE0IEFHQ19DdHJsNgogCXBsdG1wWzZdID0gMHhGMjQzMjExMTsgLy8gMHgxMDE4IEFHQ19DdHJsNwpAQCAtMTQ3MywyNCArMTQ3NCwyNCBAQAogCXBsdG1wWzldID0gMHgwMDAwMkE3OTsgLy8gMHgxMDI0IEFHQ19DdHJsMTAKIAlwbHRtcFsxMF0gPSAweDQwMDAwNTI4OyAvLyAyMDA1MDkyNyAweDQwMDAwMjI4CiAJcGx0bXBbMTFdID0gMHgyMzJGREYzMDsvLyAweDEwMmMgQV9BQ1FfQ3RybAotCXBXYjM1UmVnLT5CQjJDID0gMHgyMzJGREYzMDsKKwlyZWctPkJCMkMgPSAweDIzMkZERjMwOwogCVdiMzVSZWdfQnVyc3RXcml0ZSggcEh3RGF0YSwgMHgxMDAwLCBwbHRtcCwgMTIsIEFVVE9fSU5DUkVNRU5UICk7CiAKIAlwbHRtcFswXSA9IDB4ODAwMDJDN0M7IC8vIDB4MTAzMCBCX0FDUV9DdHJsCiAJcGx0bXBbMV0gPSAweDAwQzBENkM1OyAvLyAweDEwMzQgQV9UWFJYX0N0cmwKIAlwbHRtcFsyXSA9IDB4NUIyQzg3Njk7IC8vIDB4MTAzOCBCX1RYUlhfQ3RybAogCXBsdG1wWzNdID0gMHgwMDAwMDAwMDsgLy8gMHgxMDNjIDExYSBUWCBMUyBmaWx0ZXIKLQlwV2IzNVJlZy0+QkIzQyA9IDB4MDAwMDAwMDA7CisJcmVnLT5CQjNDID0gMHgwMDAwMDAwMDsKIAlwbHRtcFs0XSA9IDB4MDAwMDNGMjk7IC8vIDB4MTA0MCAxMWEgVFggTFMgZmlsdGVyCiAJcGx0bXBbNV0gPSAweDBFRkVGQkZFOyAvLyAweDEwNDQgMTFhIFRYIExTIGZpbHRlcgogCXBsdG1wWzZdID0gMHgwMDMzMkMxQjsgLy8gMHgxMDQ4IDExYiBUWCBSQyBmaWx0ZXIKIAlwbHRtcFs3XSA9IDB4MEEwMEZFRkY7IC8vIDB4MTA0YyAxMWIgVFggUkMgZmlsdGVyCiAJcGx0bXBbOF0gPSAweDJCMTA3MjA4OyAvLyAweDEwNTAgTU9ERV9DdHJsCi0JcFdiMzVSZWctPkJCNTAgPSAweDJCMTA3MjA4OworCXJlZy0+QkI1MCA9IDB4MkIxMDcyMDg7CiAJcGx0bXBbOV0gPSAwOyAvLyAweDEwNTQKLQlwV2IzNVJlZy0+QkI1NCA9IDB4MDAwMDAwMDA7CisJcmVnLT5CQjU0ID0gMHgwMDAwMDAwMDsKIAlwbHRtcFsxMF0gPSAweDUyNTI0MjQyOyAvLyAweDEwNTggSVFfQWxwaGEKLQlwV2IzNVJlZy0+QkI1OCA9IDB4NTI1MjQyNDI7CisJcmVnLT5CQjU4ID0gMHg1MjUyNDI0MjsKIAlwbHRtcFsxMV0gPSAweEFBMEFDMDAwOyAvLyAweDEwNWMgRENfQ2FuY2VsCiAJV2IzNVJlZ19CdXJzdFdyaXRlKCBwSHdEYXRhLCAweDEwMzAsIHBsdG1wLCAxMiwgQVVUT19JTkNSRU1FTlQgKTsKIApAQCAtMTUxMSw3ICsxNTEyLDcgQEAKIHZvaWQKIEJCUHJvY2Vzc29yX2luaXRpYWwoICBwaHdfZGF0YV90IHBId0RhdGEgKQogewotCVBXQjM1UkVHCXBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7CisJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOwogCXUzMglpLCBwbHRtcFsxMl07CiAKICAgICBzd2l0Y2goIHBId0RhdGEtPnBoeV90eXBlICkKQEAgLTE1MjIsNyArMTUyMyw3IEBACiAJCQlwbHRtcFsxXSA9IDB4OUFGRkFFQTQ7IC8vIDB4MTAwNCBBR0NfQ3RybDIKIAkJCXBsdG1wWzJdID0gMHg1NUQwMEEwNDsgLy8gMHgxMDA4IEFHQ19DdHJsMwogCQkJcGx0bXBbM10gPSAweEVGRkYxQTM0OyAvLyAweDEwMGMgQUdDX0N0cmw0Ci0JCQlwV2IzNVJlZy0+QkIwQyA9IDB4RUZGRjFBMzQ7CisJCQlyZWctPkJCMEMgPSAweEVGRkYxQTM0OwogCQkJcGx0bXBbNF0gPSAweDBGQUJFMEI3OyAvLyAweDEwMTAgQUdDX0N0cmw1CiAJCQlwbHRtcFs1XSA9IDB4MDBDQUEzMzI7IC8vIDB4MTAxNCBBR0NfQ3RybDYKIAkJCXBsdG1wWzZdID0gMHhGNjYzMjExMTsgLy8gMHgxMDE4IEFHQ19DdHJsNwpAQCAtMTUzMSwyNSArMTUzMiwyNSBAQAogCQkJcGx0bXBbOV0gPSAweDAwMDAyQTc5OyAvLyAweDEwMjQgQUdDX0N0cmwxMAogCQkJcGx0bXBbMTBdID0gKHBId0RhdGEtPnBoeV90eXBlPT0zKSA/IDB4NDAwMDBhMjggOiAweDQwMDAwMjI4OyAvLyAweDEwMjggTUFYSU1fMzMxKGIzMT0wKSArIFdCUkZfVjEoYjExPTEpIDogTUFYSU1fMzMxKGIzMT0wKSArIFdCUkZfVjIoYjExPTApCiAJCQlwbHRtcFsxMV0gPSAweDIzMkZERjMwOyAvLyAweDEwMmMgQV9BQ1FfQ3RybAotCQkJcFdiMzVSZWctPkJCMkMgPSAweDIzMkZERjMwOyAvL01vZGlmeSBmb3IgMzMncyAxLjAuOTUueHh4IHZlcnNpb24sIGFudGVubmEgMQorCQkJcmVnLT5CQjJDID0gMHgyMzJGREYzMDsgLy9Nb2RpZnkgZm9yIDMzJ3MgMS4wLjk1Lnh4eCB2ZXJzaW9uLCBhbnRlbm5hIDEKIAkJCVdiMzVSZWdfQnVyc3RXcml0ZSggcEh3RGF0YSwgMHgxMDAwLCBwbHRtcCwgMTIsIEFVVE9fSU5DUkVNRU5UICk7CiAKIAkJCXBsdG1wWzBdID0gMHgwMDAwMkM1NDsgLy8gMHgxMDMwIEJfQUNRX0N0cmwKLQkJCXBXYjM1UmVnLT5CQjMwID0gMHgwMDAwMkM1NDsKKwkJCXJlZy0+QkIzMCA9IDB4MDAwMDJDNTQ7CiAJCQlwbHRtcFsxXSA9IDB4MDBDMEQ2QzU7IC8vIDB4MTAzNCBBX1RYUlhfQ3RybAogCQkJcGx0bXBbMl0gPSAweDVCNkM4NzY5OyAvLyAweDEwMzggQl9UWFJYX0N0cmwKIAkJCXBsdG1wWzNdID0gMHgwMDAwMDAwMDsgLy8gMHgxMDNjIDExYSBUWCBMUyBmaWx0ZXIKLQkJCXBXYjM1UmVnLT5CQjNDID0gMHgwMDAwMDAwMDsKKwkJCXJlZy0+QkIzQyA9IDB4MDAwMDAwMDA7CiAJCQlwbHRtcFs0XSA9IDB4MDAwMDNGMjk7IC8vIDB4MTA0MCAxMWEgVFggTFMgZmlsdGVyCiAJCQlwbHRtcFs1XSA9IDB4MEVGRUZCRkU7IC8vIDB4MTA0NCAxMWEgVFggTFMgZmlsdGVyCiAJCQlwbHRtcFs2XSA9IDB4MDA0NTNCMjQ7IC8vIDB4MTA0OCAxMWIgVFggUkMgZmlsdGVyCiAJCQlwbHRtcFs3XSA9IDB4MEUwMEZFRkY7IC8vIDB4MTA0YyAxMWIgVFggUkMgZmlsdGVyCiAJCQlwbHRtcFs4XSA9IDB4MjcxMDYyMDg7IC8vIDB4MTA1MCBNT0RFX0N0cmwKLQkJCXBXYjM1UmVnLT5CQjUwID0gMHgyNzEwNjIwODsKKwkJCXJlZy0+QkI1MCA9IDB4MjcxMDYyMDg7CiAJCQlwbHRtcFs5XSA9IDA7IC8vIDB4MTA1NAotCQkJcFdiMzVSZWctPkJCNTQgPSAweDAwMDAwMDAwOworCQkJcmVnLT5CQjU0ID0gMHgwMDAwMDAwMDsKIAkJCXBsdG1wWzEwXSA9IDB4NjQ2NDY0NjQ7IC8vIDB4MTA1OCBJUV9BbHBoYQotCQkJcFdiMzVSZWctPkJCNTggPSAweDY0NjQ2NDY0OworCQkJcmVnLT5CQjU4ID0gMHg2NDY0NjQ2NDsKIAkJCXBsdG1wWzExXSA9IDB4QUEwQUMwMDA7IC8vIDB4MTA1YyBEQ19DYW5jZWwKIAkJCVdiMzVSZWdfQnVyc3RXcml0ZSggcEh3RGF0YSwgMHgxMDMwLCBwbHRtcCwgMTIsIEFVVE9fSU5DUkVNRU5UICk7CiAKQEAgLTE1NjgsNyArMTU2OSw3IEBACiAJCQlwbHRtcFsxXSA9IDB4OWFmZmFlYTQ7IC8vIDB4MTAwNCBBR0NfQ3RybDIKIAkJCXBsdG1wWzJdID0gMHg1NWQwMGEwNDsgLy8gMHgxMDA4IEFHQ19DdHJsMwogCQkJcGx0bXBbM10gPSAweGVmZmYxYTM0OyAvLyAweDEwMGMgQUdDX0N0cmw0Ci0JCQlwV2IzNVJlZy0+QkIwQyA9IDB4ZWZmZjFhMzQ7CisJCQlyZWctPkJCMEMgPSAweGVmZmYxYTM0OwogCQkJcGx0bXBbNF0gPSAweDBmYWJlMGI3OyAvLyAweDEwMTAgQUdDX0N0cmw1CiAJCQlwbHRtcFs1XSA9IDB4MDBjYWEzMzI7IC8vIDB4MTAxNCBBR0NfQ3RybDYKIAkJCXBsdG1wWzZdID0gMHhmNjYzMjExMTsgLy8gMHgxMDE4IEFHQ19DdHJsNwpAQCAtMTU3NywyNSArMTU3OCwyNSBAQAogCQkJcGx0bXBbOV0gPSAweDAwMDAyQTc5OyAvLyAweDEwMjQgQUdDX0N0cmwxMAogCQkJcGx0bXBbMTBdID0gMHg0MDAwMDUyODsgLy8gMHg0MDAwMDEyODsgTW9kaWZ5IGZvciAzMydzIDEuMC45NQogCQkJcGx0bXBbMTFdID0gMHgyMzJmZGYzMDsgLy8gMHgxMDJjIEFfQUNRX0N0cmwKLQkJCXBXYjM1UmVnLT5CQjJDID0gMHgyMzJmZGYzMDsgLy9Nb2RpZnkgZm9yIDMzJ3MgMS4wLjk1Lnh4eCB2ZXJzaW9uLCBhbnRlbm5hIDEKKwkJCXJlZy0+QkIyQyA9IDB4MjMyZmRmMzA7IC8vTW9kaWZ5IGZvciAzMydzIDEuMC45NS54eHggdmVyc2lvbiwgYW50ZW5uYSAxCiAJCQlXYjM1UmVnX0J1cnN0V3JpdGUoIHBId0RhdGEsIDB4MTAwMCwgcGx0bXAsIDEyLCBBVVRPX0lOQ1JFTUVOVCApOwogCiAJCQlwbHRtcFswXSA9IDB4MDAwMDJDNTQ7IC8vIDB4MTAzMCBCX0FDUV9DdHJsCi0JCQlwV2IzNVJlZy0+QkIzMCA9IDB4MDAwMDJDNTQ7CisJCQlyZWctPkJCMzAgPSAweDAwMDAyQzU0OwogCQkJcGx0bXBbMV0gPSAweDAwQzBENkM1OyAvLyAweDEwMzQgQV9UWFJYX0N0cmwKIAkJCXBsdG1wWzJdID0gMHg1QjZDODc2OTsgLy8gMHgxMDM4IEJfVFhSWF9DdHJsCiAJCQlwbHRtcFszXSA9IDB4MDAwMDAwMDA7IC8vIDB4MTAzYyAxMWEgVFggTFMgZmlsdGVyCi0JCQlwV2IzNVJlZy0+QkIzQyA9IDB4MDAwMDAwMDA7CisJCQlyZWctPkJCM0MgPSAweDAwMDAwMDAwOwogCQkJcGx0bXBbNF0gPSAweDAwMDAzRjI5OyAvLyAweDEwNDAgMTFhIFRYIExTIGZpbHRlcgogCQkJcGx0bXBbNV0gPSAweDBFRkVGQkZFOyAvLyAweDEwNDQgMTFhIFRYIExTIGZpbHRlcgogCQkJcGx0bXBbNl0gPSAweDAwNDUzQjI0OyAvLyAweDEwNDggMTFiIFRYIFJDIGZpbHRlcgogCQkJcGx0bXBbN10gPSAweDBEMDBGREZGOyAvLyAweDEwNGMgMTFiIFRYIFJDIGZpbHRlcgogCQkJcGx0bXBbOF0gPSAweDI3MTA2MjA4OyAvLyAweDEwNTAgTU9ERV9DdHJsCi0JCQlwV2IzNVJlZy0+QkI1MCA9IDB4MjcxMDYyMDg7CisJCQlyZWctPkJCNTAgPSAweDI3MTA2MjA4OwogCQkJcGx0bXBbOV0gPSAwOyAvLyAweDEwNTQKLQkJCXBXYjM1UmVnLT5CQjU0ID0gMHgwMDAwMDAwMDsKKwkJCXJlZy0+QkI1NCA9IDB4MDAwMDAwMDA7CiAJCQlwbHRtcFsxMF0gPSAweDY0NjQ2NDY0OyAvLyAweDEwNTggSVFfQWxwaGEKLQkJCXBXYjM1UmVnLT5CQjU4ID0gMHg2NDY0NjQ2NDsKKwkJCXJlZy0+QkI1OCA9IDB4NjQ2NDY0NjQ7CiAJCQlwbHRtcFsxMV0gPSAweEFBMjhDMDAwOyAvLyAweDEwNWMgRENfQ2FuY2VsCiAJCQlXYjM1UmVnX0J1cnN0V3JpdGUoIHBId0RhdGEsIDB4MTAzMCwgcGx0bXAsIDEyLCBBVVRPX0lOQ1JFTUVOVCApOwogCkBAIC0xNjA4LDcgKzE2MDksNyBAQAogCQkJcGx0bXBbMV0gPSAweDlhZmZhZWE0OyAvLyAweDEwMDQgQUdDX0N0cmwyCiAJCQlwbHRtcFsyXSA9IDB4NTVkMDBhMDQ7IC8vIDB4MTAwOCBBR0NfQ3RybDMKIAkJCXBsdG1wWzNdID0gMHhmNGZmMTYzMjsgLy8gMHhlZmZmMWEzNDsgLy8gMHgxMDBjIEFHQ19DdHJsNCBNb2RpZnkgZm9yIDMzJ3MgMS4wLjk1Ci0JCQlwV2IzNVJlZy0+QkIwQyA9IDB4ZjRmZjE2MzI7IC8vIDB4ZWZmZjFhMzQ7IE1vZGlmeSBmb3IgMzMncyAxLjAuOTUKKwkJCXJlZy0+QkIwQyA9IDB4ZjRmZjE2MzI7IC8vIDB4ZWZmZjFhMzQ7IE1vZGlmeSBmb3IgMzMncyAxLjAuOTUKIAkJCXBsdG1wWzRdID0gMHgwZmFiZTBiNzsgLy8gMHgxMDEwIEFHQ19DdHJsNQogCQkJcGx0bXBbNV0gPSAweDAwY2FhMzMyOyAvLyAweDEwMTQgQUdDX0N0cmw2CiAJCQlwbHRtcFs2XSA9IDB4Zjg2MzIxMTI7IC8vIDB4ZjY2MzIxMTE7IC8vIDB4MTAxOCBBR0NfQ3RybDcgTW9kaWZ5IGZvciAzMydzIDEuMC45NQpAQCAtMTYxNywyNSArMTYxOCwyNSBAQAogCQkJcGx0bXBbOV0gPSAweDAwMDAyQTc5OyAvLyAweDEwMjQgQUdDX0N0cmwxMAogCQkJcGx0bXBbMTBdID0gMHg0MDAwMDUyODsgLy8gMHg0MDAwMDEyODsgbW9kaWZ5IGZvciAzMydzIDEuMC45NQogCQkJcGx0bXBbMTFdID0gMHgyMzJmZGYzMDsgLy8gMHgxMDJjIEFfQUNRX0N0cmwKLQkJCXBXYjM1UmVnLT5CQjJDID0gMHgyMzJmZGYzMDsgLy9Nb2RpZnkgZm9yIDMzJ3MgMS4wLjk1Lnh4eCB2ZXJzaW9uLCBhbnRlbm5hIDEKKwkJCXJlZy0+QkIyQyA9IDB4MjMyZmRmMzA7IC8vTW9kaWZ5IGZvciAzMydzIDEuMC45NS54eHggdmVyc2lvbiwgYW50ZW5uYSAxCiAJCQlXYjM1UmVnX0J1cnN0V3JpdGUoIHBId0RhdGEsIDB4MTAwMCwgcGx0bXAsIDEyLCBBVVRPX0lOQ1JFTUVOVCApOwogCiAJCQlwbHRtcFswXSA9IDB4MDAwMDJDNTQ7IC8vIDB4MTAzMCBCX0FDUV9DdHJsCi0JCQlwV2IzNVJlZy0+QkIzMCA9IDB4MDAwMDJDNTQ7CisJCQlyZWctPkJCMzAgPSAweDAwMDAyQzU0OwogCQkJcGx0bXBbMV0gPSAweDAwQzBENkM1OyAvLyAweDEwMzQgQV9UWFJYX0N0cmwKIAkJCXBsdG1wWzJdID0gMHg1YjJjODc2OTsgLy8gMHg1QjZDODc2OTsgLy8gMHgxMDM4IEJfVFhSWF9DdHJsIE1vZGlmeSBmb3IgMzMncyAxLjAuOTUKIAkJCXBsdG1wWzNdID0gMHgwMDAwMDAwMDsgLy8gMHgxMDNjIDExYSBUWCBMUyBmaWx0ZXIKLQkJCXBXYjM1UmVnLT5CQjNDID0gMHgwMDAwMDAwMDsKKwkJCXJlZy0+QkIzQyA9IDB4MDAwMDAwMDA7CiAJCQlwbHRtcFs0XSA9IDB4MDAwMDNGMjk7IC8vIDB4MTA0MCAxMWEgVFggTFMgZmlsdGVyCiAJCQlwbHRtcFs1XSA9IDB4MEVGRUZCRkU7IC8vIDB4MTA0NCAxMWEgVFggTFMgZmlsdGVyCiAJCQlwbHRtcFs2XSA9IDB4MDAyYzI2MTc7IC8vIDB4MDA0NTNCMjQ7IC8vIDB4MTA0OCAxMWIgVFggUkMgZmlsdGVyIE1vZGlmeSBmb3IgMzMncyAxLjAuOTUKIAkJCXBsdG1wWzddID0gMHgwODAwZmVmZjsgLy8gMHgwRDAwRkRGRjsgLy8gMHgxMDRjIDExYiBUWCBSQyBmaWx0ZXIgTW9kaWZ5IGZvciAzMydzIDEuMC45NQogCQkJcGx0bXBbOF0gPSAweDI3MTA2MjA4OyAvLyAweDEwNTAgTU9ERV9DdHJsCi0JCQlwV2IzNVJlZy0+QkI1MCA9IDB4MjcxMDYyMDg7CisJCQlyZWctPkJCNTAgPSAweDI3MTA2MjA4OwogCQkJcGx0bXBbOV0gPSAwOyAvLyAweDEwNTQKLQkJCXBXYjM1UmVnLT5CQjU0ID0gMHgwMDAwMDAwMDsKKwkJCXJlZy0+QkI1NCA9IDB4MDAwMDAwMDA7CiAJCQlwbHRtcFsxMF0gPSAweDY0NjQ0YTRhOyAvLyAweDY0NjQ2NDY0OyAvLyAweDEwNTggSVFfQWxwaGEgTW9kaWZ5IGZvciAzMydzIDEuMC45NQotCQkJcFdiMzVSZWctPkJCNTggPSAweDY0NjQ2NDY0OworCQkJcmVnLT5CQjU4ID0gMHg2NDY0NjQ2NDsKIAkJCXBsdG1wWzExXSA9IDB4QUEyOEMwMDA7IC8vIDB4MTA1YyBEQ19DYW5jZWwKIAkJCVdiMzVSZWdfQnVyc3RXcml0ZSggcEh3RGF0YSwgMHgxMDMwLCBwbHRtcCwgMTIsIEFVVE9fSU5DUkVNRU5UICk7CiAKQEAgLTE2NDgsNyArMTY0OSw3IEBACiAJCQlwbHRtcFsxXSA9IDB4OWFmZmFmYjI7IC8vIDB4MTAwNCBBR0NfQ3RybDIKIAkJCXBsdG1wWzJdID0gMHg1NWQwMGEwNDsgLy8gMHgxMDA4IEFHQ19DdHJsMwogCQkJcGx0bXBbM10gPSAweEZGRmQyMDNjOyAvLyAweEZGRmIyMDNhOyAvLyAweDEwMGMgQUdDX0N0cmw0IE1vZGlmeSBmb3IgMzMncyAxLjAuOTUueHh4IHZlcnNpb24KLQkJCXBXYjM1UmVnLT5CQjBDID0gMHhGRkZkMjAzYzsKKwkJCXJlZy0+QkIwQyA9IDB4RkZGZDIwM2M7CiAJCQlwbHRtcFs0XSA9IDBYMEZCRkRDYzU7IC8vIDBYMEZCRkRDQTA7IC8vIDB4MTAxMCBBR0NfQ3RybDUgLy8weDBGQjJFMEI3IE1vZGlmeSBmb3IgMzMncyAxLjAuOTUueHh4IHZlcnNpb24KIAkJCXBsdG1wWzVdID0gMHgwMGNhYTMzMjsgLy8gMHgwMGNhYTMzMzsgLy8gMHgxMDE0IEFHQ19DdHJsNiBNb2RpZnkgZm9yIDMzJ3MgMS4wLjk1Lnh4eCB2ZXJzaW9uCiAJCQlwbHRtcFs2XSA9IDBYRjY2MzIxMTE7IC8vIDBYRjE2MzIxMTI7IC8vIDB4MTAxOCBBR0NfQ3RybDcJCS8vMHhmNjYzMjExMiBNb2RpZnkgZm9yIDMzJ3MgMS4wLjk1Lnh4eCB2ZXJzaW9uCkBAIC0xNjU3LDI3ICsxNjU4LDI3IEBACiAJCQlwbHRtcFs5XSA9IDB4MDAwMDJBNzk7IC8vIDB4MTAyNCBBR0NfQ3RybDEwCiAJCQlwbHRtcFsxMF0gPSAwWDQwMDAwNTI4OwkJCQkJCQkvLzB4NDAwMDAyMjgKIAkJCXBsdG1wWzExXSA9IDB4MjMyZGZGMzA7IC8vIDB4MjMyQTlGMzA7IC8vIDB4MTAyYyBBX0FDUV9DdHJsCS8vMHgyMzJhOTczMAotCQkJcFdiMzVSZWctPkJCMkMgPSAweDIzMmRmRjMwOyAvL01vZGlmeSBmb3IgMzMncyAxLjAuOTUueHh4IHZlcnNpb24sIGFudGVubmEgMQorCQkJcmVnLT5CQjJDID0gMHgyMzJkZkYzMDsgLy9Nb2RpZnkgZm9yIDMzJ3MgMS4wLjk1Lnh4eCB2ZXJzaW9uLCBhbnRlbm5hIDEKIAkJCVdiMzVSZWdfQnVyc3RXcml0ZSggcEh3RGF0YSwgMHgxMDAwLCBwbHRtcCwgMTIsIEFVVE9fSU5DUkVNRU5UICk7CiAKIAkJCXBsdG1wWzBdID0gMHgwMDAwMkM1NDsgLy8gMHgxMDMwIEJfQUNRX0N0cmwKLQkJCXBXYjM1UmVnLT5CQjMwID0gMHgwMDAwMkM1NDsKKwkJCXJlZy0+QkIzMCA9IDB4MDAwMDJDNTQ7CiAJCQlwbHRtcFsxXSA9IDB4MDBDMEQ2QzU7IC8vIDB4MTAzNCBBX1RYUlhfQ3RybAogCQkJcGx0bXBbMl0gPSAweDVCMkM4NzY5OyAvLyAweDEwMzggQl9UWFJYX0N0cmwJLy8weDVCNkM4NzY5CiAJCQlwbHRtcFszXSA9IDB4MDAwMDAwMDA7IC8vIDB4MTAzYyAxMWEgVFggTFMgZmlsdGVyCi0JCQlwV2IzNVJlZy0+QkIzQyA9IDB4MDAwMDAwMDA7CisJCQlyZWctPkJCM0MgPSAweDAwMDAwMDAwOwogCQkJcGx0bXBbNF0gPSAweDAwMDAzRjI5OyAvLyAweDEwNDAgMTFhIFRYIExTIGZpbHRlcgogCQkJcGx0bXBbNV0gPSAweDBFRkVGQkZFOyAvLyAweDEwNDQgMTFhIFRYIExTIGZpbHRlcgogCQkJcGx0bXBbNl0gPSBCQjQ4X0RFRkFVTFRfQUwyMjMwXzExRzsgLy8gMHgxMDQ4IDExYiBUWCBSQyBmaWx0ZXIgMjAwNjA2MTMuMgotCQkJcFdiMzVSZWctPkJCNDggPSBCQjQ4X0RFRkFVTFRfQUwyMjMwXzExRzsgLy8gMjAwNTEyMjEgY2gxNCAyMDA2MDYxMy4yCisJCQlyZWctPkJCNDggPSBCQjQ4X0RFRkFVTFRfQUwyMjMwXzExRzsgLy8gMjAwNTEyMjEgY2gxNCAyMDA2MDYxMy4yCiAJCQlwbHRtcFs3XSA9IEJCNENfREVGQVVMVF9BTDIyMzBfMTFHOyAvLyAweDEwNGMgMTFiIFRYIFJDIGZpbHRlciAyMDA2MDYxMy4yCi0JCQlwV2IzNVJlZy0+QkI0QyA9IEJCNENfREVGQVVMVF9BTDIyMzBfMTFHOyAvLyAyMDA2MDYxMy4xIDIwMDYwNjEzLjIKKwkJCXJlZy0+QkI0QyA9IEJCNENfREVGQVVMVF9BTDIyMzBfMTFHOyAvLyAyMDA2MDYxMy4xIDIwMDYwNjEzLjIKIAkJCXBsdG1wWzhdID0gMHgyNzEwNjIwMDsgLy8gMHgxMDUwIE1PREVfQ3RybAotCQkJcFdiMzVSZWctPkJCNTAgPSAweDI3MTA2MjAwOworCQkJcmVnLT5CQjUwID0gMHgyNzEwNjIwMDsKIAkJCXBsdG1wWzldID0gMDsgLy8gMHgxMDU0Ci0JCQlwV2IzNVJlZy0+QkI1NCA9IDB4MDAwMDAwMDA7CisJCQlyZWctPkJCNTQgPSAweDAwMDAwMDAwOwogCQkJcGx0bXBbMTBdID0gMHg1MjUyNDI0MjsgLy8gMHgxMDU4IElRX0FscGhhCi0JCQlwV2IzNVJlZy0+QkI1OCA9IDB4NTI1MjQyNDI7CisJCQlyZWctPkJCNTggPSAweDUyNTI0MjQyOwogCQkJcGx0bXBbMTFdID0gMHhBQTBBQzAwMDsgLy8gMHgxMDVjIERDX0NhbmNlbAogCQkJV2IzNVJlZ19CdXJzdFdyaXRlKCBwSHdEYXRhLCAweDEwMzAsIHBsdG1wLCAxMiwgQVVUT19JTkNSRU1FTlQgKTsKIApAQCAtMTY5MCw3ICsxNjkxLDcgQEAKIAkJCXBsdG1wWzFdID0gMHg5YWZmYWZiMjsgLy8gMHgxMDA0IEFHQ19DdHJsMgogCQkJcGx0bXBbMl0gPSAweDU1ZDAwYTA0OyAvLyAweDEwMDggQUdDX0N0cmwzCiAJCQlwbHRtcFszXSA9IDB4RkZGZDIwM2M7IC8vIDB4RkZGYjIwM2E7IC8vIDB4MTAwYyBBR0NfQ3RybDQgTW9kaWZ5IGZvciAzMydzIDEuMC45NS54eHggdmVyc2lvbgotCQkJcFdiMzVSZWctPkJCMEMgPSAweEZGRmQyMDNjOworCQkJcmVnLT5CQjBDID0gMHhGRkZkMjAzYzsKIAkJCXBsdG1wWzRdID0gMFgwRkJGRENjNTsgLy8gMFgwRkJGRENBMDsgLy8gMHgxMDEwIEFHQ19DdHJsNSAvLzB4MEZCMkUwQjcgTW9kaWZ5IGZvciAzMydzIDEuMC45NS54eHggdmVyc2lvbgogCQkJcGx0bXBbNV0gPSAweDAwY2FhMzMyOyAvLyAweDAwY2FhMzMzOyAvLyAweDEwMTQgQUdDX0N0cmw2IE1vZGlmeSBmb3IgMzMncyAxLjAuOTUueHh4IHZlcnNpb24KIAkJCXBsdG1wWzZdID0gMFhGNjYzMjExMTsgLy8gMFhGMTYzMjExMjsgLy8gMHgxMDE4IEFHQ19DdHJsNwkJLy8weGY2NjMyMTEyIE1vZGlmeSBmb3IgMzMncyAxLjAuOTUueHh4IHZlcnNpb24KQEAgLTE2OTksMjcgKzE3MDAsMjcgQEAKIAkJCXBsdG1wWzldID0gMHgwMDAwMkE3OTsgLy8gMHgxMDI0IEFHQ19DdHJsMTAKIAkJCXBsdG1wWzEwXSA9IDBYNDAwMDA1Mjg7CQkJCQkJCS8vMHg0MDAwMDIyOAogCQkJcGx0bXBbMTFdID0gMHgyMzJkZkYzMDsgLy8gMHgyMzJBOUYzMDsgLy8gMHgxMDJjIEFfQUNRX0N0cmwJLy8weDIzMmE5NzMwCi0JCQlwV2IzNVJlZy0+QkIyQyA9IDB4MjMyZGZGMzA7IC8vTW9kaWZ5IGZvciAzMydzIDEuMC45NS54eHggdmVyc2lvbiwgYW50ZW5uYSAxCisJCQlyZWctPkJCMkMgPSAweDIzMmRmRjMwOyAvL01vZGlmeSBmb3IgMzMncyAxLjAuOTUueHh4IHZlcnNpb24sIGFudGVubmEgMQogCQkJV2IzNVJlZ19CdXJzdFdyaXRlKCBwSHdEYXRhLCAweDEwMDAsIHBsdG1wLCAxMiwgQVVUT19JTkNSRU1FTlQgKTsKIAogCQkJcGx0bXBbMF0gPSAweDAwMDAyQzU0OyAvLyAweDEwMzAgQl9BQ1FfQ3RybAotCQkJcFdiMzVSZWctPkJCMzAgPSAweDAwMDAyQzU0OworCQkJcmVnLT5CQjMwID0gMHgwMDAwMkM1NDsKIAkJCXBsdG1wWzFdID0gMHgwMEMwRDZDNTsgLy8gMHgxMDM0IEFfVFhSWF9DdHJsCiAJCQlwbHRtcFsyXSA9IDB4NUIyQzg3Njk7IC8vIDB4MTAzOCBCX1RYUlhfQ3RybAkvLzB4NUI2Qzg3NjkKIAkJCXBsdG1wWzNdID0gMHgwMDAwMDAwMDsgLy8gMHgxMDNjIDExYSBUWCBMUyBmaWx0ZXIKLQkJCXBXYjM1UmVnLT5CQjNDID0gMHgwMDAwMDAwMDsKKwkJCXJlZy0+QkIzQyA9IDB4MDAwMDAwMDA7CiAJCQlwbHRtcFs0XSA9IDB4MDAwMDNGMjk7IC8vIDB4MTA0MCAxMWEgVFggTFMgZmlsdGVyCiAJCQlwbHRtcFs1XSA9IDB4MEVGRUZCRkU7IC8vIDB4MTA0NCAxMWEgVFggTFMgZmlsdGVyCiAJCQlwbHRtcFs2XSA9IEJCNDhfREVGQVVMVF9BTDIyMzBfMTFHOyAvLyAweDEwNDggMTFiIFRYIFJDIGZpbHRlciAyMDA2MDYxMy4yCi0JCQlwV2IzNVJlZy0+QkI0OCA9IEJCNDhfREVGQVVMVF9BTDIyMzBfMTFHOyAvLyAyMDA1MTIyMSBjaDE0IDIwMDYwNjEzLjIKKwkJCXJlZy0+QkI0OCA9IEJCNDhfREVGQVVMVF9BTDIyMzBfMTFHOyAvLyAyMDA1MTIyMSBjaDE0IDIwMDYwNjEzLjIKIAkJCXBsdG1wWzddID0gQkI0Q19ERUZBVUxUX0FMMjIzMF8xMUc7IC8vIDB4MTA0YyAxMWIgVFggUkMgZmlsdGVyIDIwMDYwNjEzLjIKLQkJCXBXYjM1UmVnLT5CQjRDID0gQkI0Q19ERUZBVUxUX0FMMjIzMF8xMUc7IC8vIDIwMDYwNjEzLjEKKwkJCXJlZy0+QkI0QyA9IEJCNENfREVGQVVMVF9BTDIyMzBfMTFHOyAvLyAyMDA2MDYxMy4xCiAJCQlwbHRtcFs4XSA9IDB4MjcxMDYyMDA7IC8vIDB4MTA1MCBNT0RFX0N0cmwKLQkJCXBXYjM1UmVnLT5CQjUwID0gMHgyNzEwNjIwMDsKKwkJCXJlZy0+QkI1MCA9IDB4MjcxMDYyMDA7CiAJCQlwbHRtcFs5XSA9IDA7IC8vIDB4MTA1NAotCQkJcFdiMzVSZWctPkJCNTQgPSAweDAwMDAwMDAwOworCQkJcmVnLT5CQjU0ID0gMHgwMDAwMDAwMDsKIAkJCXBsdG1wWzEwXSA9IDB4NTI1MjMyMzI7IC8vIDIwMDYwNDE5IDB4NTI1MjQyNDI7IC8vIDB4MTA1OCBJUV9BbHBoYQotCQkJcFdiMzVSZWctPkJCNTggPSAweDUyNTIzMjMyOyAvLyAyMDA2MDQxOSAweDUyNTI0MjQyOworCQkJcmVnLT5CQjU4ID0gMHg1MjUyMzIzMjsgLy8gMjAwNjA0MTkgMHg1MjUyNDI0MjsKIAkJCXBsdG1wWzExXSA9IDB4QUEwQUMwMDA7IC8vIDB4MTA1YyBEQ19DYW5jZWwKIAkJCVdiMzVSZWdfQnVyc3RXcml0ZSggcEh3RGF0YSwgMHgxMDMwLCBwbHRtcCwgMTIsIEFVVE9fSU5DUkVNRU5UICk7CiAKQEAgLTE3MzIsNyArMTczMyw3IEBACiAJCQlwbHRtcFsxXSA9IDB4OWFmZmFmYjI7IC8vIDB4MTAwNCBBR0NfQ3RybDIKIAkJCXBsdG1wWzJdID0gMHg1NWQwMGEwNDsgLy8gMHgxMDA4IEFHQ19DdHJsMwogCQkJcGx0bXBbM10gPSAweEZGRmIyMDNhOyAvLyAweDEwMGMgQUdDX0N0cmw0Ci0JCQlwV2IzNVJlZy0+QkIwYyA9IDB4RkZGYjIwM2E7CisJCQlyZWctPkJCMGMgPSAweEZGRmIyMDNhOwogCQkJcGx0bXBbNF0gPSAweDBGQkZEQ0I3OyAvLyAweDEwMTAgQUdDX0N0cmw1CiAJCQlwbHRtcFs1XSA9IDB4MDBjYWEzMzM7IC8vIDB4MTAxNCBBR0NfQ3RybDYKIAkJCXBsdG1wWzZdID0gMHhmNjYzMjExMjsgLy8gMHgxMDE4IEFHQ19DdHJsNwpAQCAtMTc0MSwyNSArMTc0MiwyNSBAQAogCQkJcGx0bXBbOV0gPSAweDAwMDAyQTc5OyAvLyAweDEwMjQgQUdDX0N0cmwxMAogCQkJcGx0bXBbMTBdID0gMHg0MDAwMDIyODsKIAkJCXBsdG1wWzExXSA9IDB4MjMyQTlGMzA7Ly8gMHgxMDJjIEFfQUNRX0N0cmwKLQkJCXBXYjM1UmVnLT5CQjJjID0gMHgyMzJBOUYzMDsKKwkJCXJlZy0+QkIyYyA9IDB4MjMyQTlGMzA7CiAJCQlXYjM1UmVnX0J1cnN0V3JpdGUoIHBId0RhdGEsIDB4MTAwMCwgcGx0bXAsIDEyLCBBVVRPX0lOQ1JFTUVOVCApOwogCiAJCQlwbHRtcFswXSA9IDB4MDAwMDJDNTQ7IC8vIDB4MTAzMCBCX0FDUV9DdHJsCi0JCQlwV2IzNVJlZy0+QkIzMCA9IDB4MDAwMDJDNTQ7CisJCQlyZWctPkJCMzAgPSAweDAwMDAyQzU0OwogCQkJcGx0bXBbMV0gPSAweDAwQzBENkM1OyAvLyAweDEwMzQgQV9UWFJYX0N0cmwKIAkJCXBsdG1wWzJdID0gMHg1QjJDODc2OTsgLy8gMHgxMDM4IEJfVFhSWF9DdHJsCiAJCQlwbHRtcFszXSA9IDB4MDAwMDAwMDA7IC8vIDB4MTAzYyAxMWEgVFggTFMgZmlsdGVyCi0JCQlwV2IzNVJlZy0+QkIzYyA9IDB4MDAwMDAwMDA7CisJCQlyZWctPkJCM2MgPSAweDAwMDAwMDAwOwogCQkJcGx0bXBbNF0gPSAweDAwMDAzRjI5OyAvLyAweDEwNDAgMTFhIFRYIExTIGZpbHRlcgogCQkJcGx0bXBbNV0gPSAweDBFRkVGQkZFOyAvLyAweDEwNDQgMTFhIFRYIExTIGZpbHRlcgogCQkJcGx0bXBbNl0gPSAweDAwNDUzQjI0OyAvLyAweDEwNDggMTFiIFRYIFJDIGZpbHRlcgogCQkJcGx0bXBbN10gPSAweDBFMDBGRUZGOyAvLyAweDEwNGMgMTFiIFRYIFJDIGZpbHRlcgogCQkJcGx0bXBbOF0gPSAweDI3MTA2MjAwOyAvLyAweDEwNTAgTU9ERV9DdHJsCi0JCQlwV2IzNVJlZy0+QkI1MCA9IDB4MjcxMDYyMDA7CisJCQlyZWctPkJCNTAgPSAweDI3MTA2MjAwOwogCQkJcGx0bXBbOV0gPSAwOyAvLyAweDEwNTQKLQkJCXBXYjM1UmVnLT5CQjU0ID0gMHgwMDAwMDAwMDsKKwkJCXJlZy0+QkI1NCA9IDB4MDAwMDAwMDA7CiAJCQlwbHRtcFsxMF0gPSAweDY0NjQ1MjUyOyAvLyAweDEwNTggSVFfQWxwaGEKLQkJCXBXYjM1UmVnLT5CQjU4ID0gMHg2NDY0NTI1MjsKKwkJCXJlZy0+QkI1OCA9IDB4NjQ2NDUyNTI7CiAJCQlwbHRtcFsxMV0gPSAweEFBMEFDMDAwOyAvLyAweDEwNWMgRENfQ2FuY2VsCiAJCQlXYjM1UmVnX0J1cnN0V3JpdGUoIHBId0RhdGEsIDB4MTAzMCwgcGx0bXAsIDEyLCBBVVRPX0lOQ1JFTUVOVCApOwogKi8KQEAgLTE3NzUsNyArMTc3Niw3IEBACiAJCQlwbHRtcFsxXSA9IDB4OUFGRjlBQkE7IC8vIDB4MTAwNCBBR0NfQ3RybDIKIAkJCXBsdG1wWzJdID0gMHg1NUQwMEEwNDsgLy8gMHgxMDA4IEFHQ19DdHJsMwogCQkJcGx0bXBbM10gPSAweEVFRTkxQzMyOyAvLyAweDEwMGMgQUdDX0N0cmw0Ci0JCQlwV2IzNVJlZy0+QkIwQyA9IDB4RUVFOTFDMzI7CisJCQlyZWctPkJCMEMgPSAweEVFRTkxQzMyOwogCQkJcGx0bXBbNF0gPSAweDBGQUNEQ0M1OyAvLyAweDEwMTAgQUdDX0N0cmw1CiAJCQlwbHRtcFs1XSA9IDB4MDAwQUEzNDQ7IC8vIDB4MTAxNCBBR0NfQ3RybDYKIAkJCXBsdG1wWzZdID0gMHgyMjIyMjIyMTsgLy8gMHgxMDE4IEFHQ19DdHJsNwpAQCAtMTc4NCwyNyArMTc4NSwyNyBAQAogCQkJcGx0bXBbOV0gPSAweEE5MDAyQTc5OyAvLyAweDEwMjQgQUdDX0N0cmwxMAogCQkJcGx0bXBbMTBdID0gMHg0MDAwMDUyODsgLy8gMHgxMDI4CiAJCQlwbHRtcFsxMV0gPSAweDIzNDU3RjMwOyAvLyAweDEwMmMgQV9BQ1FfQ3RybAotCQkJcFdiMzVSZWctPkJCMkMgPSAweDIzNDU3RjMwOworCQkJcmVnLT5CQjJDID0gMHgyMzQ1N0YzMDsKIAkJCVdiMzVSZWdfQnVyc3RXcml0ZSggcEh3RGF0YSwgMHgxMDAwLCBwbHRtcCwgMTIsIEFVVE9fSU5DUkVNRU5UICk7CiAKIAkJCXBsdG1wWzBdID0gMHgwMDAwMkM1NDsgLy8gMHgxMDMwIEJfQUNRX0N0cmwKLQkJCXBXYjM1UmVnLT5CQjMwID0gMHgwMDAwMkM1NDsKKwkJCXJlZy0+QkIzMCA9IDB4MDAwMDJDNTQ7CiAJCQlwbHRtcFsxXSA9IDB4MDBDMEQ2QzU7IC8vIDB4MTAzNCBBX1RYUlhfQ3RybAogCQkJcGx0bXBbMl0gPSAweDVCMkM4NzY5OyAvLyAweDEwMzggQl9UWFJYX0N0cmwKIAkJCXBsdG1wWzNdID0gcEh3RGF0YS0+QkIzY19jYWw7IC8vIDB4MTAzYyAxMWEgVFggTFMgZmlsdGVyCi0JCQlwV2IzNVJlZy0+QkIzQyA9IHBId0RhdGEtPkJCM2NfY2FsOworCQkJcmVnLT5CQjNDID0gcEh3RGF0YS0+QkIzY19jYWw7CiAJCQlwbHRtcFs0XSA9IDB4MDAwMDNGMjk7IC8vIDB4MTA0MCAxMWEgVFggTFMgZmlsdGVyCiAJCQlwbHRtcFs1XSA9IDB4MEVGRUZCRkU7IC8vIDB4MTA0NCAxMWEgVFggTFMgZmlsdGVyCiAJCQlwbHRtcFs2XSA9IEJCNDhfREVGQVVMVF9XQjI0Ml8xMUc7IC8vIDB4MTA0OCAxMWIgVFggUkMgZmlsdGVyIDIwMDYwNjEzLjIKLQkJCXBXYjM1UmVnLT5CQjQ4ID0gQkI0OF9ERUZBVUxUX1dCMjQyXzExRzsgLy8gMjAwNjA2MTMuMSAyMDA2MDYxMy4yCisJCQlyZWctPkJCNDggPSBCQjQ4X0RFRkFVTFRfV0IyNDJfMTFHOyAvLyAyMDA2MDYxMy4xIDIwMDYwNjEzLjIKIAkJCXBsdG1wWzddID0gQkI0Q19ERUZBVUxUX1dCMjQyXzExRzsgLy8gMHgxMDRjIDExYiBUWCBSQyBmaWx0ZXIgMjAwNjA2MTMuMgotCQkJcFdiMzVSZWctPkJCNEMgPSBCQjRDX0RFRkFVTFRfV0IyNDJfMTFHOyAvLyAyMDA2MDYxMy4xIDIwMDYwNjEzLjIKKwkJCXJlZy0+QkI0QyA9IEJCNENfREVGQVVMVF9XQjI0Ml8xMUc7IC8vIDIwMDYwNjEzLjEgMjAwNjA2MTMuMgogCQkJcGx0bXBbOF0gPSAweDI3MTA2MjA4OyAvLyAweDEwNTAgTU9ERV9DdHJsCi0JCQlwV2IzNVJlZy0+QkI1MCA9IDB4MjcxMDYyMDg7CisJCQlyZWctPkJCNTAgPSAweDI3MTA2MjA4OwogCQkJcGx0bXBbOV0gPSBwSHdEYXRhLT5CQjU0X2NhbDsgLy8gMHgxMDU0Ci0JCQlwV2IzNVJlZy0+QkI1NCA9IHBId0RhdGEtPkJCNTRfY2FsOworCQkJcmVnLT5CQjU0ID0gcEh3RGF0YS0+QkI1NF9jYWw7CiAJCQlwbHRtcFsxMF0gPSAweDUyNTIzMTMxOyAvLyAweDEwNTggSVFfQWxwaGEKLQkJCXBXYjM1UmVnLT5CQjU4ID0gMHg1MjUyMzEzMTsKKwkJCXJlZy0+QkI1OCA9IDB4NTI1MjMxMzE7CiAJCQlwbHRtcFsxMV0gPSAweEFBMEFDMDAwOyAvLyAyMDA2MDgyNSAweEFBMkFDMDAwOyAvLyAweDEwNWMgRENfQ2FuY2VsCiAJCQlXYjM1UmVnX0J1cnN0V3JpdGUoIHBId0RhdGEsIDB4MTAzMCwgcGx0bXAsIDEyLCBBVVRPX0lOQ1JFTUVOVCApOwogCkBAIC0xODEzLDE0ICsxODE0LDE0IEBACiAgICAgfQogCiAJLy8gRmlsbCB0aGUgTE5BIHRhYmxlCi0JcFdiMzVSZWctPkxOQVZhbHVlWzBdID0gKHU4KShwV2IzNVJlZy0+QkIwQyAmIDB4ZmYpOwotCXBXYjM1UmVnLT5MTkFWYWx1ZVsxXSA9IDA7Ci0JcFdiMzVSZWctPkxOQVZhbHVlWzJdID0gKHU4KSgocFdiMzVSZWctPkJCMEMgJiAweGZmMDApPj44KTsKLQlwV2IzNVJlZy0+TE5BVmFsdWVbM10gPSAwOworCXJlZy0+TE5BVmFsdWVbMF0gPSAodTgpKHJlZy0+QkIwQyAmIDB4ZmYpOworCXJlZy0+TE5BVmFsdWVbMV0gPSAwOworCXJlZy0+TE5BVmFsdWVbMl0gPSAodTgpKChyZWctPkJCMEMgJiAweGZmMDApPj44KTsKKwlyZWctPkxOQVZhbHVlWzNdID0gMDsKIAogCS8vIEZpbGwgU1EzIHRhYmxlCiAJZm9yKCBpPTA7IGk8TUFYX1NRM19GSUxURVJfU0laRTsgaSsrICkKLQkJcFdiMzVSZWctPlNRM19maWx0ZXJbaV0gPSAweDJmOyAvLyBoYWxmIG9mIEJpdCAwIH4gNgorCQlyZWctPlNRM19maWx0ZXJbaV0gPSAweDJmOyAvLyBoYWxmIG9mIEJpdCAwIH4gNgogfQogCiB2b2lkIHNldF90eF9wb3dlcl9wZXJfY2hhbm5lbF9tYXgyODI5KCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgQ2hhbkluZm8gQ2hhbm5lbCkKQEAgLTE5MDMsNyArMTkwNCw3IEBACiB2b2lkCiBSRlN5bnRoZXNpemVyX1N3aXRjaGluZ0NoYW5uZWwoICBwaHdfZGF0YV90IHBId0RhdGEsICBDaGFuSW5mbyBDaGFubmVsICkKIHsKLQlQV0IzNVJFRyBwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKIAl1MzIJcGx0bXBbMTZdOyAvLyBUaGUgMTYgaXMgdGhlIG1heGltdW0gY2FwYWJpbGl0eSBvZiBoYXJkd2FyZQogCXUzMgljb3VudCwgbHRtcDsKIAl1OAlpLCBqLCBudW1iZXI7CkBAIC0yMDkwLDQwICsyMDkxLDQwIEBACiAJaWYoIENoYW5uZWwuYmFuZCA8PSBCQU5EX1RZUEVfT0ZETV8yNCApCiAJewogICAgICAgICAvLyBCQjogc2VsZWN0IDIuNCBHSHosIGJpdFsxMi0xMV09MDAKLQkJcFdiMzVSZWctPkJCNTAgJj0gfihCSVQoMTEpfEJJVCgxMikpOwotCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDEwNTAsIHBXYjM1UmVnLT5CQjUwICk7IC8vIE1PREVfQ3RybAorCQlyZWctPkJCNTAgJj0gfihCSVQoMTEpfEJJVCgxMikpOworCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDEwNTAsIHJlZy0+QkI1MCApOyAvLyBNT0RFX0N0cmwKICAgICAgICAgLy8gTUFDOiBzZWxlY3QgMi40IEdIeiwgYml0WzVdPTAKLQkJcFdiMzVSZWctPk03OF9FUlBJbmZvcm1hdGlvbiAmPSB+QklUKDUpOwotCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDA4NzgsIHBXYjM1UmVnLT5NNzhfRVJQSW5mb3JtYXRpb24gKTsKKwkJcmVnLT5NNzhfRVJQSW5mb3JtYXRpb24gJj0gfkJJVCg1KTsKKwkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwODc4LCByZWctPk03OF9FUlBJbmZvcm1hdGlvbiApOwogICAgICAgICAvLyBlbmFibGUgMTFiIEJhc2ViYW5kCi0JCXBXYjM1UmVnLT5CQjMwICY9IH5CSVQoMzEpOwotCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDEwMzAsIHBXYjM1UmVnLT5CQjMwICk7CisJCXJlZy0+QkIzMCAmPSB+QklUKDMxKTsKKwkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgxMDMwLCByZWctPkJCMzAgKTsKIAl9CiAJZWxzZSBpZiggKENoYW5uZWwuYmFuZCA9PSBCQU5EX1RZUEVfT0ZETV81KSApCiAJewogICAgICAgICAvLyBCQjogc2VsZWN0IDUgR0h6Ci0JCXBXYjM1UmVnLT5CQjUwICY9IH4oQklUKDExKXxCSVQoMTIpKTsKKwkJcmVnLT5CQjUwICY9IH4oQklUKDExKXxCSVQoMTIpKTsKIAkJaWYgKENoYW5uZWwuQ2hhbk5vIDw9NjQgKQotCQkJcFdiMzVSZWctPkJCNTAgfD0gQklUKDEyKTsJCQkJLy8gMTAtNS4yNUdIegorCQkJcmVnLT5CQjUwIHw9IEJJVCgxMik7CQkJCS8vIDEwLTUuMjVHSHoKIAkJZWxzZSBpZiAoKENoYW5uZWwuQ2hhbk5vID49IDEwMCkgJiYgKENoYW5uZWwuQ2hhbk5vIDw9IDEyNCkpCi0JCQlwV2IzNVJlZy0+QkI1MCB8PSBCSVQoMTEpOwkJCQkvLyAwMS01LjQ4R0h6CisJCQlyZWctPkJCNTAgfD0gQklUKDExKTsJCQkJLy8gMDEtNS40OEdIegogCQllbHNlIGlmICgoQ2hhbm5lbC5DaGFuTm8gPj0xMjgpICYmIChDaGFubmVsLkNoYW5ObyA8PSAxNjEpKQotCQkJcFdiMzVSZWctPkJCNTAgfD0gKEJJVCgxMil8QklUKDExKSk7CS8vIDExLTUuNzc1R0h6CisJCQlyZWctPkJCNTAgfD0gKEJJVCgxMil8QklUKDExKSk7CS8vIDExLTUuNzc1R0h6CiAJCWVsc2UJLy9DaGFuIDE4NCB+IDE5NiB3aWxsIHVzZSBiaXRbMTItMTFdID0gMTAgaW4gdmVyc2lvbiBzaC1zcmMtMS4yLjI1Ci0JCQlwV2IzNVJlZy0+QkI1MCB8PSBCSVQoMTIpOwotCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDEwNTAsIHBXYjM1UmVnLT5CQjUwICk7IC8vIE1PREVfQ3RybAorCQkJcmVnLT5CQjUwIHw9IEJJVCgxMik7CisJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MTA1MCwgcmVnLT5CQjUwICk7IC8vIE1PREVfQ3RybAogCiAJCS8vKDEpIE03OCBzaG91bGQgYWx3YXkgdXNlIDIuNEcgc2V0dGluZyB3aGVuIHVzaW5nIFJGX0FJUk9IQV83MjMwCiAJCS8vKDIpIEJCMzAgaGFzIGJlZW4gdXBkYXRlZCBwcmV2aW91c2x5LgogCQlpZiAocEh3RGF0YS0+cGh5X3R5cGUgIT0gUkZfQUlST0hBXzcyMzApCiAJCXsKICAgICAJICAgIC8vIE1BQzogc2VsZWN0IDUgR0h6LCBiaXRbNV09MQotCQkJcFdiMzVSZWctPk03OF9FUlBJbmZvcm1hdGlvbiB8PSBCSVQoNSk7Ci0JCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDA4NzgsIHBXYjM1UmVnLT5NNzhfRVJQSW5mb3JtYXRpb24gKTsKKwkJCXJlZy0+TTc4X0VSUEluZm9ybWF0aW9uIHw9IEJJVCg1KTsKKwkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDg3OCwgcmVnLT5NNzhfRVJQSW5mb3JtYXRpb24gKTsKIAogICAgIAkgICAgLy8gZGlzYWJsZSAxMWIgQmFzZWJhbmQKLQkJCXBXYjM1UmVnLT5CQjMwIHw9IEJJVCgzMSk7Ci0JCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDEwMzAsIHBXYjM1UmVnLT5CQjMwICk7CisJCQlyZWctPkJCMzAgfD0gQklUKDMxKTsKKwkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MTAzMCwgcmVnLT5CQjMwICk7CiAJCX0KIAl9CiB9CkBAIC0yMzEzLDIxICsyMzE0LDIxIEBACiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiB2b2lkIER4eF9pbml0aWFsKCAgcGh3X2RhdGFfdCBwSHdEYXRhICkKIHsKLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKIAogCS8vIE9sZCBJQzpTaW5nbGUgbW9kZSBvbmx5LgogCS8vIE5ldyBJQzogb3BlcmF0aW9uIGRlY2lkZSBieSBTb2Z0d2FyZSBzZXQgYml0WzRdLiAxOm11bHRpcGxlIDA6IHNpbmdsZQotCXBXYjM1UmVnLT5EMDBfRG1hQ29udHJvbCA9IDB4YzAwMDAwMDQ7CS8vVHhvbiwgUnhvbiwgbXVsdGlwbGUgUnggZm9yIG5ldyA0ayBETUEKKwlyZWctPkQwMF9EbWFDb250cm9sID0gMHhjMDAwMDAwNDsJLy9UeG9uLCBSeG9uLCBtdWx0aXBsZSBSeCBmb3IgbmV3IDRrIERNQQogCQkJCQkJCQkJCQkvL1R4b24sIFJ4b24sIHNpbmdsZSBSeCBmb3Igb2xkIDhrIEFTSUMKIAlpZiggIUhBTF9VU0JfTU9ERV9CVVJTVCggcEh3RGF0YSApICkKLQkJcFdiMzVSZWctPkQwMF9EbWFDb250cm9sID0gMHhjMDAwMDAwMDsvL1R4b24sIFJ4b24sIHNpbmdsZSBSeCBmb3IgbmV3IDRrIERNQQorCQlyZWctPkQwMF9EbWFDb250cm9sID0gMHhjMDAwMDAwMDsvL1R4b24sIFJ4b24sIHNpbmdsZSBSeCBmb3IgbmV3IDRrIERNQQogCi0JV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDQwMCwgcFdiMzVSZWctPkQwMF9EbWFDb250cm9sICk7CisJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDQwMCwgcmVnLT5EMDBfRG1hQ29udHJvbCApOwogfQogCiB2b2lkIE14eF9pbml0aWFsKCAgcGh3X2RhdGFfdCBwSHdEYXRhICkKIHsKLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKIAl1MzIJCXRtcDsKIAl1MzIJCXBsdG1wWzExXTsKIAl1MTYJaTsKQEAgLTIzMzksMjMgKzIzNDAsMjMgQEAKIAogCS8vIE0wMCBiaXQgc2V0CiAjaWZkZWYgX0lCU1NfQkVBQ09OX1NFUV9TVElDS18KLQlwV2IzNVJlZy0+TTAwX01hY0NvbnRyb2wgPSAwOyAvLyBTb2x2ZSBiZWFjb24gc2VxdWVuY2UgbnVtYmVyIHN0b3AgYnkgc29mdHdhcmUKKwlyZWctPk0wMF9NYWNDb250cm9sID0gMDsgLy8gU29sdmUgYmVhY29uIHNlcXVlbmNlIG51bWJlciBzdG9wIGJ5IHNvZnR3YXJlCiAjZWxzZQotCXBXYjM1UmVnLT5NMDBfTWFjQ29udHJvbCA9IDB4ODAwMDAwMDA7IC8vIFNvbHZlIGJlYWNvbiBzZXF1ZW5jZSBudW1iZXIgc3RvcCBieSBoYXJkd2FyZQorCXJlZy0+TTAwX01hY0NvbnRyb2wgPSAweDgwMDAwMDAwOyAvLyBTb2x2ZSBiZWFjb24gc2VxdWVuY2UgbnVtYmVyIHN0b3AgYnkgaGFyZHdhcmUKICNlbmRpZgogCiAJLy8gTTI0IGRpc2FibGUgZW50ZXIgcG93ZXIgc2F2ZSwgQkIgUnhPbiBhbmQgZW5hYmxlIE5BViBhdHRhY2sKLQlwV2IzNVJlZy0+TTI0X01hY0NvbnRyb2wgPSAweDA4MDQwMDQyOwotCXBsdG1wWzBdID0gcFdiMzVSZWctPk0yNF9NYWNDb250cm9sOworCXJlZy0+TTI0X01hY0NvbnRyb2wgPSAweDA4MDQwMDQyOworCXBsdG1wWzBdID0gcmVnLT5NMjRfTWFjQ29udHJvbDsKIAogCXBsdG1wWzFdID0gMDsgLy8gU2tpcCBNMjgsIGJlY2F1c2Ugbm8gaW5pdGlhbGl6ZSB2YWx1ZSBpcyByZXF1aXJlZC4KIAogCS8vIE0yQyBDV21pbiBhbmQgQ1dtYXggc2V0dGluZwogCXBId0RhdGEtPmN3bWluID0gREVGQVVMVF9DV01JTjsKIAlwSHdEYXRhLT5jd21heCA9IERFRkFVTFRfQ1dNQVg7Ci0JcFdiMzVSZWctPk0yQ19NYWNDb250cm9sID0gREVGQVVMVF9DV01JTiA8PCAxMDsKLQlwV2IzNVJlZy0+TTJDX01hY0NvbnRyb2wgfD0gREVGQVVMVF9DV01BWDsKLQlwbHRtcFsyXSA9IHBXYjM1UmVnLT5NMkNfTWFjQ29udHJvbDsKKwlyZWctPk0yQ19NYWNDb250cm9sID0gREVGQVVMVF9DV01JTiA8PCAxMDsKKwlyZWctPk0yQ19NYWNDb250cm9sIHw9IERFRkFVTFRfQ1dNQVg7CisJcGx0bXBbMl0gPSByZWctPk0yQ19NYWNDb250cm9sOwogCiAJLy8gTTMwIEJTU0lECiAJcGx0bXBbM10gPSAqKHUzMiAqKXBId0RhdGEtPmJzc2lkOwpAQCAtMjM2NywzNSArMjM2OCwzNSBAQAogCXBsdG1wWzRdID0gdG1wOwogCiAJLy8gTTM4Ci0JcFdiMzVSZWctPk0zOF9NYWNDb250cm9sID0gKERFRkFVTFRfUkFURV9SRVRSWV9MSU1JVDw8OCkgfCAoREVGQVVMVF9MT05HX1JFVFJZX0xJTUlUIDw8IDQpIHwgREVGQVVMVF9TSE9SVF9SRVRSWV9MSU1JVDsKLQlwbHRtcFs1XSA9IHBXYjM1UmVnLT5NMzhfTWFjQ29udHJvbDsKKwlyZWctPk0zOF9NYWNDb250cm9sID0gKERFRkFVTFRfUkFURV9SRVRSWV9MSU1JVDw8OCkgfCAoREVGQVVMVF9MT05HX1JFVFJZX0xJTUlUIDw8IDQpIHwgREVGQVVMVF9TSE9SVF9SRVRSWV9MSU1JVDsKKwlwbHRtcFs1XSA9IHJlZy0+TTM4X01hY0NvbnRyb2w7CiAKIAkvLyBNM0MKIAl0bXAgPSAoREVGQVVMVF9QSUZTVCA8PCAyNikgfCAoREVGQVVMVF9FSUZTVCA8PCAxNikgfCAoREVGQVVMVF9ESUZTVCA8PCA4KSB8IChERUZBVUxUX1NJRlNUIDw8IDQpIHwgREVGQVVMVF9PU0lGU1QgOwotCXBXYjM1UmVnLT5NM0NfTWFjQ29udHJvbCA9IHRtcDsKKwlyZWctPk0zQ19NYWNDb250cm9sID0gdG1wOwogCXBsdG1wWzZdID0gdG1wOwogCiAJLy8gTTQwCiAJcEh3RGF0YS0+c2xvdF90aW1lX3NlbGVjdCA9IERFRkFVTFRfU0xPVF9USU1FOwogCXRtcCA9IChERUZBVUxUX0FUSU1XRCA8PCAxNikgfCBERUZBVUxUX1NMT1RfVElNRTsKLQlwV2IzNVJlZy0+TTQwX01hY0NvbnRyb2wgPSB0bXA7CisJcmVnLT5NNDBfTWFjQ29udHJvbCA9IHRtcDsKIAlwbHRtcFs3XSA9IHRtcDsKIAogCS8vIE00NAogCXRtcCA9IERFRkFVTFRfTUFYX1RYX01TRFVfTElGRV9USU1FIDw8IDEwOyAvLyAqMTAyNAotCXBXYjM1UmVnLT5NNDRfTWFjQ29udHJvbCA9IHRtcDsKKwlyZWctPk00NF9NYWNDb250cm9sID0gdG1wOwogCXBsdG1wWzhdID0gdG1wOwogCiAJLy8gTTQ4CiAJcEh3RGF0YS0+QmVhY29uUGVyaW9kID0gREVGQVVMVF9CRUFDT05fSU5URVJWQUw7CiAJcEh3RGF0YS0+UHJvYmVEZWxheSA9IERFRkFVTFRfUFJPQkVfREVMQVlfVElNRTsKIAl0bXAgPSAoREVGQVVMVF9CRUFDT05fSU5URVJWQUwgPDwgMTYpIHwgREVGQVVMVF9QUk9CRV9ERUxBWV9USU1FOwotCXBXYjM1UmVnLT5NNDhfTWFjQ29udHJvbCA9IHRtcDsKKwlyZWctPk00OF9NYWNDb250cm9sID0gdG1wOwogCXBsdG1wWzldID0gdG1wOwogCiAJLy9NNEMKLQlwV2IzNVJlZy0+TTRDX01hY1N0YXR1cyA9IChERUZBVUxUX1BST1RPQ09MX1ZFUlNJT04gPDwgMzApIHwgKERFRkFVTFRfTUFDX1BPV0VSX1NUQVRFIDw8IDI4KSB8IChERUZBVUxUX0RUSU1fQUxFUlRfVElNRSA8PCAyNCk7Ci0JcGx0bXBbMTBdID0gcFdiMzVSZWctPk00Q19NYWNTdGF0dXM7CisJcmVnLT5NNENfTWFjU3RhdHVzID0gKERFRkFVTFRfUFJPVE9DT0xfVkVSU0lPTiA8PCAzMCkgfCAoREVGQVVMVF9NQUNfUE9XRVJfU1RBVEUgPDwgMjgpIHwgKERFRkFVTFRfRFRJTV9BTEVSVF9USU1FIDw8IDI0KTsKKwlwbHRtcFsxMF0gPSByZWctPk00Q19NYWNTdGF0dXM7CiAKIAkvLyBCdXJzdCB3cml0ZQogCS8vV2IzNVJlZ19CdXJzdFdyaXRlKCBwSHdEYXRhLCAweDA4MjQsIHBsdG1wLCAxMSwgQVVUT19JTkNSRU1FTlQgKTsKQEAgLTI0MDQsMTUgKzI0MDUsMTUgQEAKIAogCS8vIE02MAogCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4NjAsIDB4MTI0ODEyNDggKTsKLQlwV2IzNVJlZy0+TTYwX01hY0NvbnRyb2wgPSAweDEyNDgxMjQ4OworCXJlZy0+TTYwX01hY0NvbnRyb2wgPSAweDEyNDgxMjQ4OwogCiAJLy8gTTY4CiAJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDg2OCwgMHgwMDA1MDkwMCApOyAvLyAyMDA1MTAxOCAweDAwMEYwRjAwICk7IC8vIDk0MDkzMCAweDAwMTMxMzAwCi0JcFdiMzVSZWctPk02OF9NYWNDb250cm9sID0gMHgwMDA1MDkwMDsKKwlyZWctPk02OF9NYWNDb250cm9sID0gMHgwMDA1MDkwMDsKIAogCS8vIE05OAogCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDA4OTgsIDB4ZmZmZjg4ODggKTsKLQlwV2IzNVJlZy0+TTk4X01hY0NvbnRyb2wgPSAweGZmZmY4ODg4OworCXJlZy0+TTk4X01hY0NvbnRyb2wgPSAweGZmZmY4ODg4OwogfQogCiAKQEAgLTI2MjAsNyArMjYyMSw3IEBACiAKIHZvaWQgQkJQcm9jZXNzb3JfUmF0ZUNoYW5naW5nKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggcmF0ZSApIC8vIDIwMDYwNjEzLjEKIHsKLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKIAl1bnNpZ25lZCBjaGFyCQlJczExYlJhdGU7CiAKIAlJczExYlJhdGUgPSAocmF0ZSAlIDYpID8gMSA6IDA7CkBAIC0yNjMwLDggKzI2MzEsOCBAQAogCQljYXNlIFJGX0FJUk9IQV8yMjMwUzogLy8gMjAwNjA0MjAgQWRkIHRoaXMKIAkJCWlmKCBJczExYlJhdGUgKQogCQkJewotCQkJCWlmKCAocFdiMzVSZWctPkJCNDggIT0gQkI0OF9ERUZBVUxUX0FMMjIzMF8xMUIpICYmCi0JCQkJCShwV2IzNVJlZy0+QkI0QyAhPSBCQjRDX0RFRkFVTFRfQUwyMjMwXzExQikgKQorCQkJCWlmKCAocmVnLT5CQjQ4ICE9IEJCNDhfREVGQVVMVF9BTDIyMzBfMTFCKSAmJgorCQkJCQkocmVnLT5CQjRDICE9IEJCNENfREVGQVVMVF9BTDIyMzBfMTFCKSApCiAJCQkJewogCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDEwNDgsIEJCNDhfREVGQVVMVF9BTDIyMzBfMTFCICk7CiAJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MTA0YywgQkI0Q19ERUZBVUxUX0FMMjIzMF8xMUIgKTsKQEAgLTI2MzksOCArMjY0MCw4IEBACiAJCQl9CiAJCQllbHNlCiAJCQl7Ci0JCQkJaWYoIChwV2IzNVJlZy0+QkI0OCAhPSBCQjQ4X0RFRkFVTFRfQUwyMjMwXzExRykgJiYKLQkJCQkJKHBXYjM1UmVnLT5CQjRDICE9IEJCNENfREVGQVVMVF9BTDIyMzBfMTFHKSApCisJCQkJaWYoIChyZWctPkJCNDggIT0gQkI0OF9ERUZBVUxUX0FMMjIzMF8xMUcpICYmCisJCQkJCShyZWctPkJCNEMgIT0gQkI0Q19ERUZBVUxUX0FMMjIzMF8xMUcpICkKIAkJCQl7CiAJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MTA0OCwgQkI0OF9ERUZBVUxUX0FMMjIzMF8xMUcgKTsKIAkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgxMDRjLCBCQjRDX0RFRkFVTFRfQUwyMjMwXzExRyApOwpAQCAtMjY1MSwyMiArMjY1MiwyMiBAQAogCQljYXNlIFJGX1dCXzI0MjogLy8gMjAwNjA2MjMgVGhlIGZpeCBvbmx5IGZvciBvbGQgVHhWR0Egc2V0dGluZwogCQkJaWYoIElzMTFiUmF0ZSApCiAJCQl7Ci0JCQkJaWYoIChwV2IzNVJlZy0+QkI0OCAhPSBCQjQ4X0RFRkFVTFRfV0IyNDJfMTFCKSAmJgotCQkJCQkocFdiMzVSZWctPkJCNEMgIT0gQkI0Q19ERUZBVUxUX1dCMjQyXzExQikgKQorCQkJCWlmKCAocmVnLT5CQjQ4ICE9IEJCNDhfREVGQVVMVF9XQjI0Ml8xMUIpICYmCisJCQkJCShyZWctPkJCNEMgIT0gQkI0Q19ERUZBVUxUX1dCMjQyXzExQikgKQogCQkJCXsKLQkJCQkJcFdiMzVSZWctPkJCNDggPSBCQjQ4X0RFRkFVTFRfV0IyNDJfMTFCOwotCQkJCQlwV2IzNVJlZy0+QkI0QyA9IEJCNENfREVGQVVMVF9XQjI0Ml8xMUI7CisJCQkJCXJlZy0+QkI0OCA9IEJCNDhfREVGQVVMVF9XQjI0Ml8xMUI7CisJCQkJCXJlZy0+QkI0QyA9IEJCNENfREVGQVVMVF9XQjI0Ml8xMUI7CiAJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MTA0OCwgQkI0OF9ERUZBVUxUX1dCMjQyXzExQiApOwogCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDEwNGMsIEJCNENfREVGQVVMVF9XQjI0Ml8xMUIgKTsKIAkJCQl9CiAJCQl9CiAJCQllbHNlCiAJCQl7Ci0JCQkJaWYoIChwV2IzNVJlZy0+QkI0OCAhPSBCQjQ4X0RFRkFVTFRfV0IyNDJfMTFHKSAmJgotCQkJCQkocFdiMzVSZWctPkJCNEMgIT0gQkI0Q19ERUZBVUxUX1dCMjQyXzExRykgKQorCQkJCWlmKCAocmVnLT5CQjQ4ICE9IEJCNDhfREVGQVVMVF9XQjI0Ml8xMUcpICYmCisJCQkJCShyZWctPkJCNEMgIT0gQkI0Q19ERUZBVUxUX1dCMjQyXzExRykgKQogCQkJCXsKLQkJCQkJcFdiMzVSZWctPkJCNDggPSBCQjQ4X0RFRkFVTFRfV0IyNDJfMTFHOwotCQkJCQlwV2IzNVJlZy0+QkI0QyA9IEJCNENfREVGQVVMVF9XQjI0Ml8xMUc7CisJCQkJCXJlZy0+QkI0OCA9IEJCNDhfREVGQVVMVF9XQjI0Ml8xMUc7CisJCQkJCXJlZy0+QkI0QyA9IEJCNENfREVGQVVMVF9XQjI0Ml8xMUc7CiAJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MTA0OCwgQkI0OF9ERUZBVUxUX1dCMjQyXzExRyApOwogCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDEwNGMsIEJCNENfREVGQVVMVF9XQjI0Ml8xMUcgKTsKIAkJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9yeGlzci5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvcnhpc3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThlOTQyYy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9yeGlzci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotI2luY2x1ZGUgIm9zX2NvbW1vbi5oIgotCi12b2lkIHZSeFRpbWVySW5pdChQV0IzMl9BREFQVEVSIEFkYXB0ZXIpCi17Ci0JT1NfVElNRVJfSU5JVElBTCgmKEFkYXB0ZXItPk1kcy5uVGltZXIpLCAodm9pZCopIFJ4VGltZXJIYW5kbGVyLCAodm9pZCopIEFkYXB0ZXIpOwotfQotCi12b2lkIHZSeFRpbWVyU3RhcnQoUFdCMzJfQURBUFRFUiBBZGFwdGVyLCBpbnQgdGltZW91dF92YWx1ZSkKLXsKLQlpZiAodGltZW91dF92YWx1ZTxNSU5fVElNRU9VVF9WQUwpCi0JCXRpbWVvdXRfdmFsdWU9TUlOX1RJTUVPVVRfVkFMOwotCi0JT1NfVElNRVJfU0VUKCAmKEFkYXB0ZXItPk1kcy5uVGltZXIpLCB0aW1lb3V0X3ZhbHVlICk7Ci19Ci0KLXZvaWQgdlJ4VGltZXJTdG9wKFBXQjMyX0FEQVBURVIgQWRhcHRlcikKLXsKLQlPU19USU1FUl9DQU5DRUwoICYoQWRhcHRlci0+TWRzLm5UaW1lciksIDAgKTsKLX0KLQotdm9pZCBSeFRpbWVySGFuZGxlcl8xYSggUEFEQVBURVIgQWRhcHRlcikKLXsKLQlSeFRpbWVySGFuZGxlcihOVUxMLCBBZGFwdGVyLCBOVUxMLCBOVUxMKTsKLX0KLQotdm9pZCBSeFRpbWVySGFuZGxlcih2b2lkKiBTeXN0ZW1TcGVjaWZpYzEsIFBXQjMyX0FEQVBURVIgQWRhcHRlciwKLQkJICAgIHZvaWQqIFN5c3RlbVNwZWNpZmljMiwgdm9pZCogU3lzdGVtU3BlY2lmaWMzKQotewotCVdBUk5fT04oMSk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9zY2FuX3MuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3NjYW5fcy5oCmluZGV4IDFkMWIwYzQuLjc3NWJiODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3NjYW5fcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3NjYW5fcy5oCkBAIC0xLDMgKzEsOSBAQAorI2lmbmRlZiBfX1dJTkJPTkRfU0NBTl9TX0gKKyNkZWZpbmUgX19XSU5CT05EX1NDQU5fU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgImxvY2FscGFyYS5oIgorCiAvLwogLy8gU0NBTiB0YXNrIGdsb2JhbCBDT05TVEFOVFMsIFNUUlVDVFVSRVMsIHZhcmlhYmxlcwogLy8KQEAgLTYyLDggKzY4LDcgQEAKIAl1OAkJCQlib0NDQWJ1c3k7CQkJCQkvLyBXYjogSFdNQUMgQ0NBIGJ1c3kgc3RhdHVzCiAJdTgJCQkJcmVzZXJ2ZWRfMjsKIAotCS8vTkRJU19NSU5JUE9SVF9USU1FUgluVGltZXI7Ci0JT1NfVElNRVIJCQluVGltZXI7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CiAKIAl1MzIJCQkJU2NhblRpbWVTdGFtcDsJCQkvL0luY3JlYXNlIDEgcGVyIGJhY2tncm91bmQgc2NhbigxIG1pbnV0ZSkKIAl1MzIJCQkJQnNzVGltZVN0YW1wOwkJCS8vSW5jcmVhc2UgMSBwZXIgY29ubmVjdCBzdGF0dXMgY2hlY2sKQEAgLTc4LDkgKzgzLDkgQEAKIAogfSBTQ0FOX1BBUkFNRVRFUlMsICpwc1NDQU5fUEFSQU1FVEVSUzsKIAotLy8gRW5jYXBzdWxhdGUgJ0FkYXB0ZXInIGRhdGEgc3RydWN0dXJlCi0jZGVmaW5lIHBzU0NBTgkJCSgmKEFkYXB0ZXItPnNTY2FuUGFyYSkpCi0jZGVmaW5lIHBzU0NBTlJFUQkJCSgmKEFkYXB0ZXItPnNTY2FuUGFyYS5zU2NhblJlcSkpCisvLyBFbmNhcHN1bGF0ZSAnYWRhcHRlcicgZGF0YSBzdHJ1Y3R1cmUKKyNkZWZpbmUgcHNTQ0FOCQkJKCYoYWRhcHRlci0+c1NjYW5QYXJhKSkKKyNkZWZpbmUgcHNTQ0FOUkVRCQkJKCYoYWRhcHRlci0+c1NjYW5QYXJhLnNTY2FuUmVxKSkKIAogLy8rKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogLy8Jc2Nhbi5oCkBAIC0xMDksNyArMTE0LDggQEAKIAogLy8gc3RhdGljIGZ1bmN0aW9ucwogCi0vL3N0YXRpYyB2b2lkIFNjYW5UaW1lckhhbmRsZXIoUFdCMzJfQURBUFRFUiBBZGFwdGVyKTsKLS8vc3RhdGljIHZvaWQgdlNjYW5UaW1lclN0YXJ0KFBXQjMyX0FEQVBURVIJQWRhcHRlciwgaW50IHRpbWVvdXRfdmFsdWUpOwotLy9zdGF0aWMgdm9pZCB2U2NhblRpbWVyU3RvcChQV0IzMl9BREFQVEVSIEFkYXB0ZXIpOworLy9zdGF0aWMgdm9pZCBTY2FuVGltZXJIYW5kbGVyKHN0cnVjdCB3YnNvZnRfcHJpdiAqIGFkYXB0ZXIpOworLy9zdGF0aWMgdm9pZCB2U2NhblRpbWVyU3RhcnQoc3RydWN0IHdic29mdF9wcml2ICoJYWRhcHRlciwgaW50IHRpbWVvdXRfdmFsdWUpOworLy9zdGF0aWMgdm9pZCB2U2NhblRpbWVyU3RvcChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKiBhZGFwdGVyKTsKIAorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9zbWVfYXBpLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9zbWVfYXBpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYzk2NzMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvc21lX2FwaS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHNtZV9hcGkuYwotLy8KLS8vIENvcHlyaWdodChDKSAyMDAyIFdpbmJvbmQgRWxlY3Ryb25pY3MgQ29ycC4KLS8vCi0vLwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNpbmNsdWRlICJvc19jb21tb24uaCIKLQotczggc21lX2dldF9yc3NpKHZvaWQgKnBjb3JlX2RhdGEsIHMzMiAqcHJzc2kpCi17Ci0gICAgICAgQlVHKCk7Ci0gICAgICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9zbWVfYXBpLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9zbWVfYXBpLmgKaW5kZXggNzQ1ZWIzNy4uMTg4YTI1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvc21lX2FwaS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3NtZV9hcGkuaApAQCAtMTMsNiArMTMsMTAgQEAKICNpZm5kZWYgX19TTUVfQVBJX0hfXwogI2RlZmluZSBfX1NNRV9BUElfSF9fCiAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSAibG9jYWxwYXJhLmgiCisKIC8qKioqKioqKioqKioqKioqKiogSU5DTFVERSBGSUxFUyBTRUNUSU9OICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLy8jaW5jbHVkZSAiR0xcZ2xfY29yZS5oIgogCkBAIC01Miw5ICs1Niw2IEBACiBzOCBzbWVfZ2V0X3J0c190aHJlc2hvbGQodm9pZCAqcGNvcmVfZGF0YSwgdTMyICpwdGhyZXNob2xkKTsKIHM4IHNtZV9zZXRfcnRzX3RocmVzaG9sZCh2b2lkICpwY29yZV9kYXRhLCB1MzIgdGhyZXNob2xkKTsKIAotLy8gT0lEXzgwMl8xMV9SU1NJCi1zOCBzbWVfZ2V0X3Jzc2kodm9pZCAqcGNvcmVfZGF0YSwgczMyICpwcnNzaSk7Ci0KIC8vIE9JRF84MDJfMTFfQ09ORklHVVJBVElPTgogczggc21lX2dldF9iZWFjb25fcGVyaW9kKHZvaWQgKnBjb3JlX2RhdGEsIHUxNiAqcGJlYWNvbl9wZXJpb2QpOwogczggc21lX3NldF9iZWFjb25fcGVyaW9kKHZvaWQgKnBjb3JlX2RhdGEsIHUxNiBiZWFjb25fcGVyaW9kKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3NtZV9zLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9zbWVfcy5oCmluZGV4IGRmZDJmYmMuLjFiZDExOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3NtZV9zLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvc21lX3MuaApAQCAtMSwzICsxLDExIEBACisjaWZuZGVmIF9fV0lOQk9ORF9TTUVfU19ICisjZGVmaW5lIF9fV0lOQk9ORF9TTUVfU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSAibWFjX3N0cnVjdHVyZXMuaCIKKyNpbmNsdWRlICJsb2NhbHBhcmEuaCIKKwogLy8KIC8vIFNNRV9TLkggLQogLy8gU01FIHRhc2sgZ2xvYmFsIENPTlNUQU5UUywgU1RSVUNUVVJFUywgdmFyaWFibGVzCkBAIC0xMDYsOCArMTE0LDcgQEAKIAl1OAkJCQliRGVzaXJlZFBvd2VyU2F2ZTsKIAogCS8vIFNNRSB0aW1lciBhbmQgdGltZW91dCB2YWx1ZQotCS8vTkRJU19NSU5JUE9SVF9USU1FUgluVGltZXI7Ci0JT1NfVElNRVIJCQluVGltZXI7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CiAKIAl1OAkJCQlib0luVGltZXJIYW5kbGVyOwogCXU4IAkJCQlib0F1dGhSZXRyeUFjdGl2ZTsKQEAgLTE5Niw5ICsyMDMsOSBAQAogCiB9IFNNRV9QQVJBTUVURVJTLCAqUFNNRV9QQVJBTUVURVJTOwogCi0jZGVmaW5lIHBzU01FCQkJKCYoQWRhcHRlci0+c1NtZVBhcmEpKQorI2RlZmluZSBwc1NNRQkJCSgmKGFkYXB0ZXItPnNTbWVQYXJhKSkKIAotI2RlZmluZSB3U01FR2V0Q3VycmVudFNUQVN0YXRlKEFkYXB0ZXIpCQkoKHUxNikoQWRhcHRlciktPnNTbWVQYXJhLndTdGF0ZSkKKyNkZWZpbmUgd1NNRUdldEN1cnJlbnRTVEFTdGF0ZShhZGFwdGVyKQkJKCh1MTYpKGFkYXB0ZXIpLT5zU21lUGFyYS53U3RhdGUpCiAKIAogCkBAIC0yMjYsMyArMjMzLDQgQEAKIAogLy8gU3RhdGljIGZ1bmN0aW9uCiAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvc3lzZGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9zeXNkZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTFiOWM1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvc3lzZGVmLmgKQEAgLTAsMCArMSw0MCBAQAorCisKKy8vCisvLyBXaW5ib25kIFdMQU4gU3lzdGVtIENvbmZpZ3VyYXRpb24gZGVmaW5lcworLy8KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEN1cnJlbnQgZGlyZWN0b3J5IGlzIExpbnV4CisvLyBUaGUgZGVmaW5pdGlvbiBXQl9MSU5VWCBpcyBhIGtleXdvcmQgZm9yIHRoaXMgT1MKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjaWZuZGVmIFNZU19ERUZfSAorI2RlZmluZSBTWVNfREVGX0gKKyNkZWZpbmUgV0JfTElOVVgKKyNkZWZpbmUgV0JfTElOVVhfV1BBX1BTSworCisKKy8vI2RlZmluZSBfSUJTU19CRUFDT05fU0VRX1NUSUNLXworI2RlZmluZSBfVVNFX0ZBTExCQUNLX1JBVEVfCisvLyNkZWZpbmUgQU5URElWX0RFRkFVTFRfT04KKworI2RlZmluZSBfV1BBMl8JLy8gMjAwNjExMjIgSXQncyBuZWVkZWQgZm9yIGN1cnJlbnQgTGludXggZHJpdmVyCisKKworI2lmbmRlZiBfV1BBX1BTS19ERUJVRworI3VuZGVmICBfV1BBX1BTS19ERUJVRworI2VuZGlmCisKKy8vIGRlYnVnIHByaW50IG9wdGlvbnMsIG1hcmsgd2hhdCBkZWJ1ZyB5b3UgZG9uJ3QgbmVlZAorCisjaWZkZWYgRlVMTF9ERUJVRworI2RlZmluZSBfUEVfU1RBVEVfRFVNUF8KKyNkZWZpbmUgX1BFX1RYX0RVTVBfCisjZGVmaW5lIF9QRV9SWF9EVU1QXworI2RlZmluZSBfUEVfT0lEX0RVTVBfCisjZGVmaW5lIF9QRV9EVE9fRFVNUF8KKyNkZWZpbmUgX1BFX1JFR19EVU1QXworI2RlZmluZSBfUEVfVVNCX0lOSV9EVU1QXworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJlZy5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJlZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NGIzZmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cmVnLmMKQEAgLTAsMCArMSw3NDcgQEAKKyNpbmNsdWRlICJzeXNkZWYuaCIKKyNpbmNsdWRlICJ3YjM1cmVnX2YuaCIKKworI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCitleHRlcm4gdm9pZCBwaHlfY2FsaWJyYXRpb25fd2luYm9uZChod19kYXRhX3QgKnBod19kYXRhLCB1MzIgZnJlcXVlbmN5KTsKKworLy8gdHJ1ZSAgOiByZWFkIGNvbW1hbmQgcHJvY2VzcyBzdWNjZXNzZnVsbHkKKy8vIGZhbHNlIDogcmVnaXN0ZXIgbm90IHN1cHBvcnQKKy8vIFJlZ2lzdGVyTm8gOiBzdGFydCBiYXNlCisvLyBwUmVnaXN0ZXJEYXRhIDogZGF0YSBwb2ludAorLy8gTnVtYmVyT2ZEYXRhIDogbnVtYmVyIG9mIHJlZ2lzdGVyIGRhdGEKKy8vIEZsYWcgOiBBVVRPX0lOQ1JFTUVOVCAtIFJlZ2lzdGVyTm8gd2lsbCBhdXRvIGluY3JlbWVudCA0CisvLwkJICBOT19JTkNSRU1FTlQgLSBGdW5jdGlvbiB3aWxsIHdyaXRlIGRhdGEgaW50byB0aGUgc2FtZSByZWdpc3RlcgordW5zaWduZWQgY2hhcgorV2IzNVJlZ19CdXJzdFdyaXRlKHBod19kYXRhX3QgcEh3RGF0YSwgdTE2IFJlZ2lzdGVyTm8sIHUzMiAqIHBSZWdpc3RlckRhdGEsIHU4IE51bWJlck9mRGF0YSwgdTggRmxhZykKK3sKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZyA9ICZwSHdEYXRhLT5yZWc7CisJc3RydWN0IHVyYgkqdXJiID0gTlVMTDsKKwlzdHJ1Y3Qgd2IzNV9yZWdfcXVldWUgKnJlZ19xdWV1ZSA9IE5VTEw7CisJdTE2CQlVcmJTaXplOworCXN0cnVjdCAgICAgIHVzYl9jdHJscmVxdWVzdCAqZHI7CisJdTE2CQlpLCBEYXRhU2l6ZSA9IE51bWJlck9mRGF0YSo0OworCisJLy8gTW9kdWxlIHNodXRkb3duCisJaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvLyBUcnlpbmcgdG8gdXNlIGJ1cnN0IHdyaXRlIGZ1bmN0aW9uIGlmIHVzZSBuZXcgaGFyZHdhcmUKKwlVcmJTaXplID0gc2l6ZW9mKHN0cnVjdCB3YjM1X3JlZ19xdWV1ZSkgKyBEYXRhU2l6ZSArIHNpemVvZihzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0KTsKKwlyZWdfcXVldWUgPSBremFsbG9jKFVyYlNpemUsIEdGUF9BVE9NSUMpOworCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7CisJaWYoIHVyYiAmJiByZWdfcXVldWUgKSB7CisJCXJlZ19xdWV1ZS0+RElSRUNUID0gMjsvLyBidXJzdCB3cml0ZSByZWdpc3RlcgorCQlyZWdfcXVldWUtPklOREVYID0gUmVnaXN0ZXJObzsKKwkJcmVnX3F1ZXVlLT5wQnVmZmVyID0gKHUzMiAqKSgodTggKilyZWdfcXVldWUgKyBzaXplb2Yoc3RydWN0IHdiMzVfcmVnX3F1ZXVlKSk7CisJCW1lbWNweSggcmVnX3F1ZXVlLT5wQnVmZmVyLCBwUmVnaXN0ZXJEYXRhLCBEYXRhU2l6ZSApOworCQkvL3RoZSBmdW5jdGlvbiBmb3IgcmV2ZXJzaW5nIHJlZ2lzdGVyIGRhdGEgZnJvbSBsaXR0bGUgZW5kaWFuIHRvIGJpZyBlbmRpYW4KKwkJZm9yKCBpPTA7IGk8TnVtYmVyT2ZEYXRhIDsgaSsrICkKKwkJCXJlZ19xdWV1ZS0+cEJ1ZmZlcltpXSA9IGNwdV90b19sZTMyKCByZWdfcXVldWUtPnBCdWZmZXJbaV0gKTsKKworCQlkciA9IChzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICopKCh1OCAqKXJlZ19xdWV1ZSArIHNpemVvZihzdHJ1Y3Qgd2IzNV9yZWdfcXVldWUpICsgRGF0YVNpemUpOworCQlkci0+YlJlcXVlc3RUeXBlID0gVVNCX1RZUEVfVkVORE9SIHwgVVNCX0RJUl9PVVQgfCBVU0JfUkVDSVBfREVWSUNFOworCQlkci0+YlJlcXVlc3QgPSAweDA0OyAvLyBVU0Igb3IgdmVuZG9yLWRlZmluZWQgcmVxdWVzdCBjb2RlLCBidXJzdCBtb2RlCisJCWRyLT53VmFsdWUgPSBjcHVfdG9fbGUxNiggRmxhZyApOyAvLyAwOiBSZWdpc3RlciBudW1iZXIgYXV0by1pbmNyZW1lbnQsIDE6IE5vIGF1dG8gaW5jcmVtZW50CisJCWRyLT53SW5kZXggPSBjcHVfdG9fbGUxNiggUmVnaXN0ZXJObyApOworCQlkci0+d0xlbmd0aCA9IGNwdV90b19sZTE2KCBEYXRhU2l6ZSApOworCQlyZWdfcXVldWUtPk5leHQgPSBOVUxMOworCQlyZWdfcXVldWUtPnBVc2JSZXEgPSBkcjsKKwkJcmVnX3F1ZXVlLT51cmIgPSB1cmI7CisKKwkJc3Bpbl9sb2NrX2lycSggJnJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7CisJCWlmIChyZWctPnJlZ19maXJzdCA9PSBOVUxMKQorCQkJcmVnLT5yZWdfZmlyc3QgPSByZWdfcXVldWU7CisJCWVsc2UKKwkJCXJlZy0+cmVnX2xhc3QtPk5leHQgPSByZWdfcXVldWU7CisJCXJlZy0+cmVnX2xhc3QgPSByZWdfcXVldWU7CisKKwkJc3Bpbl91bmxvY2tfaXJxKCAmcmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKKworCQkvLyBTdGFydCBFUDBWTQorCQlXYjM1UmVnX0VQMFZNX3N0YXJ0KHBId0RhdGEpOworCisJCXJldHVybiB0cnVlOworCX0gZWxzZSB7CisJCWlmICh1cmIpCisJCQl1c2JfZnJlZV91cmIodXJiKTsKKwkJaWYgKHJlZ19xdWV1ZSkKKwkJCWtmcmVlKHJlZ19xdWV1ZSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQKK1diMzVSZWdfVXBkYXRlKHBod19kYXRhX3QgcEh3RGF0YSwgIHUxNiBSZWdpc3Rlck5vLCAgdTMyIFJlZ2lzdGVyVmFsdWUpCit7CisJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOworCXN3aXRjaCAoUmVnaXN0ZXJObykgeworCWNhc2UgMHgzYjA6IHJlZy0+VTFCMCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHgzYmM6IHJlZy0+VTFCQ19MRURDb25maWd1cmUgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4NDAwOiByZWctPkQwMF9EbWFDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDgwMDogcmVnLT5NMDBfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHg4MDQ6IHJlZy0+TTA0X011bHRpY2FzdEFkZHJlc3MxID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDgwODogcmVnLT5NMDhfTXVsdGljYXN0QWRkcmVzczIgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4ODI0OiByZWctPk0yNF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDgyODogcmVnLT5NMjhfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHg4MmM6IHJlZy0+TTJDX01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4ODM4OiByZWctPk0zOF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDg0MDogcmVnLT5NNDBfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHg4NDQ6IHJlZy0+TTQ0X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4ODQ4OiByZWctPk00OF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDg0YzogcmVnLT5NNENfTWFjU3RhdHVzID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDg2MDogcmVnLT5NNjBfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHg4Njg6IHJlZy0+TTY4X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4ODcwOiByZWctPk03MF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDg3NDogcmVnLT5NNzRfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHg4Nzg6IHJlZy0+TTc4X0VSUEluZm9ybWF0aW9uID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDg3QzogcmVnLT5NN0NfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHg4ODA6IHJlZy0+TTgwX01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4ODg0OiByZWctPk04NF9NYWNDb250cm9sID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDg4ODogcmVnLT5NODhfTWFjQ29udHJvbCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHg4OTg6IHJlZy0+TTk4X01hY0NvbnRyb2wgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4MTAwYzogcmVnLT5CQjBDID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDEwMmM6IHJlZy0+QkIyQyA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHgxMDMwOiByZWctPkJCMzAgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4MTAzYzogcmVnLT5CQjNDID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDEwNDg6IHJlZy0+QkI0OCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHgxMDRjOiByZWctPkJCNEMgPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4MTA1MDogcmVnLT5CQjUwID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDEwNTQ6IHJlZy0+QkI1NCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCWNhc2UgMHgxMDU4OiByZWctPkJCNTggPSBSZWdpc3RlclZhbHVlOyBicmVhazsKKwljYXNlIDB4MTA1YzogcmVnLT5CQjVDID0gUmVnaXN0ZXJWYWx1ZTsgYnJlYWs7CisJY2FzZSAweDEwNjA6IHJlZy0+QkI2MCA9IFJlZ2lzdGVyVmFsdWU7IGJyZWFrOworCX0KK30KKworLy8gdHJ1ZSAgOiByZWFkIGNvbW1hbmQgcHJvY2VzcyBzdWNjZXNzZnVsbHkKKy8vIGZhbHNlIDogcmVnaXN0ZXIgbm90IHN1cHBvcnQKK3Vuc2lnbmVkIGNoYXIKK1diMzVSZWdfV3JpdGVTeW5jKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IFJlZ2lzdGVyTm8sICB1MzIgUmVnaXN0ZXJWYWx1ZSApCit7CisJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOworCWludCByZXQgPSAtMTsKKworCS8vIE1vZHVsZSBzaHV0ZG93bgorCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSkKKwkJcmV0dXJuIGZhbHNlOworCisJUmVnaXN0ZXJWYWx1ZSA9IGNwdV90b19sZTMyKFJlZ2lzdGVyVmFsdWUpOworCisJLy8gdXBkYXRlIHRoZSByZWdpc3RlciBieSBzZW5kIHVzYiBtZXNzYWdlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJcmVnLT5TeW5jSW9QYXVzZSA9IDE7CisKKwkvLyAyMDA2MDcxNy41IFdhaXQgdW50aWwgRVAwVk0gc3RvcAorCXdoaWxlIChyZWctPkVQMHZtX3N0YXRlICE9IFZNX1NUT1ApCisJCW1zbGVlcCgxMCk7CisKKwkvLyBTeW5jIElvQ2FsbERyaXZlcgorCXJlZy0+RVAwdm1fc3RhdGUgPSBWTV9SVU5OSU5HOworCXJldCA9IHVzYl9jb250cm9sX21zZyggcEh3RGF0YS0+V2JVc2IudWRldiwKKwkJCSAgICAgICB1c2Jfc25kY3RybHBpcGUoIHBId0RhdGEtPldiVXNiLnVkZXYsIDAgKSwKKwkJCSAgICAgICAweDAzLCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFIHwgVVNCX0RJUl9PVVQsCisJCQkgICAgICAgMHgwLFJlZ2lzdGVyTm8sICZSZWdpc3RlclZhbHVlLCA0LCBIWioxMDAgKTsKKwlyZWctPkVQMHZtX3N0YXRlID0gVk1fU1RPUDsKKwlyZWctPlN5bmNJb1BhdXNlID0gMDsKKworCVdiMzVSZWdfRVAwVk1fc3RhcnQocEh3RGF0YSk7CisKKwlpZiAocmV0IDwgMCkgeworCQkjaWZkZWYgX1BFX1JFR19EVU1QXworCQlXQkRFQlVHKCgiRVAwIFdyaXRlIHJlZ2lzdGVyIHVzYiBtZXNzYWdlIHNlbmRpbmcgZXJyb3JcbiIpKTsKKwkJI2VuZGlmCisKKwkJcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgPSAxOyAvLyAyMDA2MDcwNC4yCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLy8gdHJ1ZSAgOiByZWFkIGNvbW1hbmQgcHJvY2VzcyBzdWNjZXNzZnVsbHkKKy8vIGZhbHNlIDogcmVnaXN0ZXIgbm90IHN1cHBvcnQKK3Vuc2lnbmVkIGNoYXIKK1diMzVSZWdfV3JpdGUoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MTYgUmVnaXN0ZXJObywgIHUzMiBSZWdpc3RlclZhbHVlICkKK3sKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZyA9ICZwSHdEYXRhLT5yZWc7CisJc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqZHI7CisJc3RydWN0IHVyYgkqdXJiID0gTlVMTDsKKwlzdHJ1Y3Qgd2IzNV9yZWdfcXVldWUgKnJlZ19xdWV1ZSA9IE5VTEw7CisJdTE2CQlVcmJTaXplOworCisKKwkvLyBNb2R1bGUgc2h1dGRvd24KKwlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUpCisJCXJldHVybiBmYWxzZTsKKworCS8vIHVwZGF0ZSB0aGUgcmVnaXN0ZXIgYnkgc2VuZCB1cmIgcmVxdWVzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVVyYlNpemUgPSBzaXplb2Yoc3RydWN0IHdiMzVfcmVnX3F1ZXVlKSArIHNpemVvZihzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0KTsKKwlyZWdfcXVldWUgPSBremFsbG9jKFVyYlNpemUsIEdGUF9BVE9NSUMpOworCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7CisJaWYgKHVyYiAmJiByZWdfcXVldWUpIHsKKwkJcmVnX3F1ZXVlLT5ESVJFQ1QgPSAxOy8vIGJ1cnN0IHdyaXRlIHJlZ2lzdGVyCisJCXJlZ19xdWV1ZS0+SU5ERVggPSBSZWdpc3Rlck5vOworCQlyZWdfcXVldWUtPlZBTFVFID0gY3B1X3RvX2xlMzIoUmVnaXN0ZXJWYWx1ZSk7CisJCXJlZ19xdWV1ZS0+UkVTRVJWRURfVkFMSUQgPSBmYWxzZTsKKwkJZHIgPSAoc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqKSgodTggKilyZWdfcXVldWUgKyBzaXplb2Yoc3RydWN0IHdiMzVfcmVnX3F1ZXVlKSk7CisJCWRyLT5iUmVxdWVzdFR5cGUgPSBVU0JfVFlQRV9WRU5ET1J8VVNCX0RJUl9PVVQgfFVTQl9SRUNJUF9ERVZJQ0U7CisJCWRyLT5iUmVxdWVzdCA9IDB4MDM7IC8vIFVTQiBvciB2ZW5kb3ItZGVmaW5lZCByZXF1ZXN0IGNvZGUsIGJ1cnN0IG1vZGUKKwkJZHItPndWYWx1ZSA9IGNwdV90b19sZTE2KDB4MCk7CisJCWRyLT53SW5kZXggPSBjcHVfdG9fbGUxNihSZWdpc3Rlck5vKTsKKwkJZHItPndMZW5ndGggPSBjcHVfdG9fbGUxNig0KTsKKworCQkvLyBFbnRlciB0aGUgc2VuZGluZyBxdWV1ZQorCQlyZWdfcXVldWUtPk5leHQgPSBOVUxMOworCQlyZWdfcXVldWUtPnBVc2JSZXEgPSBkcjsKKwkJcmVnX3F1ZXVlLT51cmIgPSB1cmI7CisKKwkJc3Bpbl9sb2NrX2lycSgmcmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKKwkJaWYgKHJlZy0+cmVnX2ZpcnN0ID09IE5VTEwpCisJCQlyZWctPnJlZ19maXJzdCA9IHJlZ19xdWV1ZTsKKwkJZWxzZQorCQkJcmVnLT5yZWdfbGFzdC0+TmV4dCA9IHJlZ19xdWV1ZTsKKwkJcmVnLT5yZWdfbGFzdCA9IHJlZ19xdWV1ZTsKKworCQlzcGluX3VubG9ja19pcnEoICZyZWctPkVQMFZNX3NwaW5fbG9jayApOworCisJCS8vIFN0YXJ0IEVQMFZNCisJCVdiMzVSZWdfRVAwVk1fc3RhcnQocEh3RGF0YSk7CisKKwkJcmV0dXJuIHRydWU7CisJfSBlbHNlIHsKKwkJaWYgKHVyYikKKwkJCXVzYl9mcmVlX3VyYih1cmIpOworCQlrZnJlZShyZWdfcXVldWUpOworCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCisvL1RoaXMgY29tbWFuZCB3aWxsIGJlIGV4ZWN1dGVkIHdpdGggYSB1c2VyIGRlZmluZWQgdmFsdWUuIFdoZW4gaXQgY29tcGxldGVzLAorLy90aGlzIHZhbHVlIGlzIHVzZWZ1bC4gRm9yIGV4YW1wbGUsIGhhbF9zZXRfY3VycmVudF9jaGFubmVsIHdpbGwgdXNlIGl0LgorLy8gdHJ1ZSAgOiByZWFkIGNvbW1hbmQgcHJvY2VzcyBzdWNjZXNzZnVsbHkKKy8vIGZhbHNlIDogcmVnaXN0ZXIgbm90IHN1cHBvcnQKK3Vuc2lnbmVkIGNoYXIKK1diMzVSZWdfV3JpdGVXaXRoQ2FsbGJhY2tWYWx1ZSggcGh3X2RhdGFfdCBwSHdEYXRhLCB1MTYgUmVnaXN0ZXJObywgdTMyIFJlZ2lzdGVyVmFsdWUsCisJCQkJczggKnBWYWx1ZSwgczggTGVuKQoreworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKKwlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpkcjsKKwlzdHJ1Y3QgdXJiCSp1cmIgPSBOVUxMOworCXN0cnVjdCB3YjM1X3JlZ19xdWV1ZSAqcmVnX3F1ZXVlID0gTlVMTDsKKwl1MTYJCVVyYlNpemU7CisKKwkvLyBNb2R1bGUgc2h1dGRvd24KKwlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUpCisJCXJldHVybiBmYWxzZTsKKworCS8vIHVwZGF0ZSB0aGUgcmVnaXN0ZXIgYnkgc2VuZCB1cmIgcmVxdWVzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVVyYlNpemUgPSBzaXplb2Yoc3RydWN0IHdiMzVfcmVnX3F1ZXVlKSArIHNpemVvZihzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0KTsKKwlyZWdfcXVldWUgPSBremFsbG9jKFVyYlNpemUsIEdGUF9BVE9NSUMpOworCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7CisJaWYgKHVyYiAmJiByZWdfcXVldWUpIHsKKwkJcmVnX3F1ZXVlLT5ESVJFQ1QgPSAxOy8vIGJ1cnN0IHdyaXRlIHJlZ2lzdGVyCisJCXJlZ19xdWV1ZS0+SU5ERVggPSBSZWdpc3Rlck5vOworCQlyZWdfcXVldWUtPlZBTFVFID0gY3B1X3RvX2xlMzIoUmVnaXN0ZXJWYWx1ZSk7CisJCS8vTk9URSA6IFVzZXJzIG11c3QgZ3VhcmFudGVlIHRoZSBzaXplIG9mIHZhbHVlIHdpbGwgbm90IGV4Y2VlZCB0aGUgYnVmZmVyIHNpemUuCisJCW1lbWNweShyZWdfcXVldWUtPlJFU0VSVkVELCBwVmFsdWUsIExlbik7CisJCXJlZ19xdWV1ZS0+UkVTRVJWRURfVkFMSUQgPSB0cnVlOworCQlkciA9IChzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICopKCh1OCAqKXJlZ19xdWV1ZSArIHNpemVvZihzdHJ1Y3Qgd2IzNV9yZWdfcXVldWUpKTsKKwkJZHItPmJSZXF1ZXN0VHlwZSA9IFVTQl9UWVBFX1ZFTkRPUnxVU0JfRElSX09VVCB8VVNCX1JFQ0lQX0RFVklDRTsKKwkJZHItPmJSZXF1ZXN0ID0gMHgwMzsgLy8gVVNCIG9yIHZlbmRvci1kZWZpbmVkIHJlcXVlc3QgY29kZSwgYnVyc3QgbW9kZQorCQlkci0+d1ZhbHVlID0gY3B1X3RvX2xlMTYoMHgwKTsKKwkJZHItPndJbmRleCA9IGNwdV90b19sZTE2KFJlZ2lzdGVyTm8pOworCQlkci0+d0xlbmd0aCA9IGNwdV90b19sZTE2KDQpOworCisJCS8vIEVudGVyIHRoZSBzZW5kaW5nIHF1ZXVlCisJCXJlZ19xdWV1ZS0+TmV4dCA9IE5VTEw7CisJCXJlZ19xdWV1ZS0+cFVzYlJlcSA9IGRyOworCQlyZWdfcXVldWUtPnVyYiA9IHVyYjsKKwkJc3Bpbl9sb2NrX2lycSAoJnJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7CisJCWlmKCByZWctPnJlZ19maXJzdCA9PSBOVUxMICkKKwkJCXJlZy0+cmVnX2ZpcnN0ID0gcmVnX3F1ZXVlOworCQllbHNlCisJCQlyZWctPnJlZ19sYXN0LT5OZXh0ID0gcmVnX3F1ZXVlOworCQlyZWctPnJlZ19sYXN0ID0gcmVnX3F1ZXVlOworCisJCXNwaW5fdW5sb2NrX2lycSAoICZyZWctPkVQMFZNX3NwaW5fbG9jayApOworCisJCS8vIFN0YXJ0IEVQMFZNCisJCVdiMzVSZWdfRVAwVk1fc3RhcnQocEh3RGF0YSk7CisJCXJldHVybiB0cnVlOworCX0gZWxzZSB7CisJCWlmICh1cmIpCisJCQl1c2JfZnJlZV91cmIodXJiKTsKKwkJa2ZyZWUocmVnX3F1ZXVlKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKworLy8gdHJ1ZSAgOiByZWFkIGNvbW1hbmQgcHJvY2VzcyBzdWNjZXNzZnVsbHkKKy8vIGZhbHNlIDogcmVnaXN0ZXIgbm90IHN1cHBvcnQKKy8vIHBSZWdpc3RlclZhbHVlIDogSXQgbXVzdCBiZSBhIHJlc2lkZW50IGJ1ZmZlciBkdWUgdG8gYXN5bmNocm9ub3VzIHJlYWQgcmVnaXN0ZXIuCit1bnNpZ25lZCBjaGFyCitXYjM1UmVnX1JlYWRTeW5jKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IFJlZ2lzdGVyTm8sICAgdTMyICogcFJlZ2lzdGVyVmFsdWUgKQoreworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKKwl1MzIgKglwbHRtcCA9IHBSZWdpc3RlclZhbHVlOworCWludCByZXQgPSAtMTsKKworCS8vIE1vZHVsZSBzaHV0ZG93bgorCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSkKKwkJcmV0dXJuIGZhbHNlOworCisJLy8gUmVhZCB0aGUgcmVnaXN0ZXIgYnkgc2VuZCB1c2IgbWVzc2FnZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJcmVnLT5TeW5jSW9QYXVzZSA9IDE7CisKKwkvLyAyMDA2MDcxNy41IFdhaXQgdW50aWwgRVAwVk0gc3RvcAorCXdoaWxlIChyZWctPkVQMHZtX3N0YXRlICE9IFZNX1NUT1ApCisJCW1zbGVlcCgxMCk7CisKKwlyZWctPkVQMHZtX3N0YXRlID0gVk1fUlVOTklORzsKKwlyZXQgPSB1c2JfY29udHJvbF9tc2coIHBId0RhdGEtPldiVXNiLnVkZXYsCisJCQkgICAgICAgdXNiX3JjdmN0cmxwaXBlKHBId0RhdGEtPldiVXNiLnVkZXYsIDApLAorCQkJICAgICAgIDB4MDEsIFVTQl9UWVBFX1ZFTkRPUnxVU0JfUkVDSVBfREVWSUNFfFVTQl9ESVJfSU4sCisJCQkgICAgICAgMHgwLCBSZWdpc3Rlck5vLCBwbHRtcCwgNCwgSFoqMTAwICk7CisKKwkqcFJlZ2lzdGVyVmFsdWUgPSBjcHVfdG9fbGUzMigqcGx0bXApOworCisJcmVnLT5FUDB2bV9zdGF0ZSA9IFZNX1NUT1A7CisKKwlXYjM1UmVnX1VwZGF0ZSggcEh3RGF0YSwgUmVnaXN0ZXJObywgKnBSZWdpc3RlclZhbHVlICk7CisJcmVnLT5TeW5jSW9QYXVzZSA9IDA7CisKKwlXYjM1UmVnX0VQMFZNX3N0YXJ0KCBwSHdEYXRhICk7CisKKwlpZiAocmV0IDwgMCkgeworCQkjaWZkZWYgX1BFX1JFR19EVU1QXworCQlXQkRFQlVHKCgiRVAwIFJlYWQgcmVnaXN0ZXIgdXNiIG1lc3NhZ2Ugc2VuZGluZyBlcnJvclxuIikpOworCQkjZW5kaWYKKworCQlwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSA9IDE7IC8vIDIwMDYwNzA0LjIKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCisvLyB0cnVlICA6IHJlYWQgY29tbWFuZCBwcm9jZXNzIHN1Y2Nlc3NmdWxseQorLy8gZmFsc2UgOiByZWdpc3RlciBub3Qgc3VwcG9ydAorLy8gcFJlZ2lzdGVyVmFsdWUgOiBJdCBtdXN0IGJlIGEgcmVzaWRlbnQgYnVmZmVyIGR1ZSB0byBhc3luY2hyb25vdXMgcmVhZCByZWdpc3Rlci4KK3Vuc2lnbmVkIGNoYXIKK1diMzVSZWdfUmVhZChwaHdfZGF0YV90IHBId0RhdGEsIHUxNiBSZWdpc3Rlck5vLCAgdTMyICogcFJlZ2lzdGVyVmFsdWUgKQoreworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKKwlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICogZHI7CisJc3RydWN0IHVyYgkqdXJiOworCXN0cnVjdCB3YjM1X3JlZ19xdWV1ZSAqcmVnX3F1ZXVlOworCXUxNgkJVXJiU2l6ZTsKKworCS8vIE1vZHVsZSBzaHV0ZG93bgorCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSkKKwkJcmV0dXJuIGZhbHNlOworCisJLy8gdXBkYXRlIHRoZSB2YXJpYWJsZSBieSBzZW5kIFVyYiB0byByZWFkIHJlZ2lzdGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVVyYlNpemUgPSBzaXplb2Yoc3RydWN0IHdiMzVfcmVnX3F1ZXVlKSArIHNpemVvZihzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0KTsKKwlyZWdfcXVldWUgPSBremFsbG9jKFVyYlNpemUsIEdGUF9BVE9NSUMpOworCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7CisJaWYoIHVyYiAmJiByZWdfcXVldWUgKQorCXsKKwkJcmVnX3F1ZXVlLT5ESVJFQ1QgPSAwOy8vIHJlYWQgcmVnaXN0ZXIKKwkJcmVnX3F1ZXVlLT5JTkRFWCA9IFJlZ2lzdGVyTm87CisJCXJlZ19xdWV1ZS0+cEJ1ZmZlciA9IHBSZWdpc3RlclZhbHVlOworCQlkciA9IChzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICopKCh1OCAqKXJlZ19xdWV1ZSArIHNpemVvZihzdHJ1Y3Qgd2IzNV9yZWdfcXVldWUpKTsKKwkJZHItPmJSZXF1ZXN0VHlwZSA9IFVTQl9UWVBFX1ZFTkRPUnxVU0JfUkVDSVBfREVWSUNFfFVTQl9ESVJfSU47CisJCWRyLT5iUmVxdWVzdCA9IDB4MDE7IC8vIFVTQiBvciB2ZW5kb3ItZGVmaW5lZCByZXF1ZXN0IGNvZGUsIGJ1cnN0IG1vZGUKKwkJZHItPndWYWx1ZSA9IGNwdV90b19sZTE2KDB4MCk7CisJCWRyLT53SW5kZXggPSBjcHVfdG9fbGUxNiAoUmVnaXN0ZXJObyk7CisJCWRyLT53TGVuZ3RoID0gY3B1X3RvX2xlMTYgKDQpOworCisJCS8vIEVudGVyIHRoZSBzZW5kaW5nIHF1ZXVlCisJCXJlZ19xdWV1ZS0+TmV4dCA9IE5VTEw7CisJCXJlZ19xdWV1ZS0+cFVzYlJlcSA9IGRyOworCQlyZWdfcXVldWUtPnVyYiA9IHVyYjsKKwkJc3Bpbl9sb2NrX2lycSAoICZyZWctPkVQMFZNX3NwaW5fbG9jayApOworCQlpZiggcmVnLT5yZWdfZmlyc3QgPT0gTlVMTCApCisJCQlyZWctPnJlZ19maXJzdCA9IHJlZ19xdWV1ZTsKKwkJZWxzZQorCQkJcmVnLT5yZWdfbGFzdC0+TmV4dCA9IHJlZ19xdWV1ZTsKKwkJcmVnLT5yZWdfbGFzdCA9IHJlZ19xdWV1ZTsKKworCQlzcGluX3VubG9ja19pcnEoICZyZWctPkVQMFZNX3NwaW5fbG9jayApOworCisJCS8vIFN0YXJ0IEVQMFZNCisJCVdiMzVSZWdfRVAwVk1fc3RhcnQoIHBId0RhdGEgKTsKKworCQlyZXR1cm4gdHJ1ZTsKKwl9IGVsc2UgeworCQlpZiAodXJiKQorCQkJdXNiX2ZyZWVfdXJiKCB1cmIgKTsKKwkJa2ZyZWUocmVnX3F1ZXVlKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKworCit2b2lkCitXYjM1UmVnX0VQMFZNX3N0YXJ0KCAgcGh3X2RhdGFfdCBwSHdEYXRhICkKK3sKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZyA9ICZwSHdEYXRhLT5yZWc7CisKKwlpZiAoYXRvbWljX2luY19yZXR1cm4oJnJlZy0+UmVnRmlyZUNvdW50KSA9PSAxKSB7CisJCXJlZy0+RVAwdm1fc3RhdGUgPSBWTV9SVU5OSU5HOworCQlXYjM1UmVnX0VQMFZNKHBId0RhdGEpOworCX0gZWxzZQorCQlhdG9taWNfZGVjKCZyZWctPlJlZ0ZpcmVDb3VudCk7Cit9CisKK3ZvaWQKK1diMzVSZWdfRVAwVk0ocGh3X2RhdGFfdCBwSHdEYXRhICkKK3sKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZyA9ICZwSHdEYXRhLT5yZWc7CisJc3RydWN0IHVyYgkqdXJiOworCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmRyOworCXUzMiAqCQlwQnVmZmVyOworCWludAkJCXJldCA9IC0xOworCXN0cnVjdCB3YjM1X3JlZ19xdWV1ZSAqcmVnX3F1ZXVlOworCisKKwlpZiAocmVnLT5TeW5jSW9QYXVzZSkKKwkJZ290byBjbGVhbnVwOworCisJaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlKQorCQlnb3RvIGNsZWFudXA7CisKKwkvLyBHZXQgdGhlIHJlZ2lzdGVyIGRhdGEgYW5kIHNlbmQgdG8gVVNCIHRocm91Z2ggSXJwCisJc3Bpbl9sb2NrX2lycSggJnJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7CisJcmVnX3F1ZXVlID0gcmVnLT5yZWdfZmlyc3Q7CisJc3Bpbl91bmxvY2tfaXJxKCAmcmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKKworCWlmICghcmVnX3F1ZXVlKQorCQlnb3RvIGNsZWFudXA7CisKKwkvLyBHZXQgYW4gVXJiLCBzZW5kIGl0CisJdXJiID0gKHN0cnVjdCB1cmIgKilyZWdfcXVldWUtPnVyYjsKKworCWRyID0gcmVnX3F1ZXVlLT5wVXNiUmVxOworCXVyYiA9IHJlZ19xdWV1ZS0+dXJiOworCXBCdWZmZXIgPSByZWdfcXVldWUtPnBCdWZmZXI7CisJaWYgKHJlZ19xdWV1ZS0+RElSRUNUID09IDEpIC8vIG91dHB1dAorCQlwQnVmZmVyID0gJnJlZ19xdWV1ZS0+VkFMVUU7CisKKwl1c2JfZmlsbF9jb250cm9sX3VyYiggdXJiLCBwSHdEYXRhLT5XYlVzYi51ZGV2LAorCQkJICAgICAgUkVHX0RJUkVDVElPTihwSHdEYXRhLT5XYlVzYi51ZGV2LHJlZ19xdWV1ZSksCisJCQkgICAgICAodTggKilkcixwQnVmZmVyLGNwdV90b19sZTE2KGRyLT53TGVuZ3RoKSwKKwkJCSAgICAgIFdiMzVSZWdfRVAwVk1fY29tcGxldGUsICh2b2lkKilwSHdEYXRhKTsKKworCXJlZy0+RVAwdm1fc3RhdGUgPSBWTV9SVU5OSU5HOworCisJcmV0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKworCWlmIChyZXQgPCAwKSB7CisjaWZkZWYgX1BFX1JFR19EVU1QXworCQlXQkRFQlVHKCgiRVAwIElycCBzZW5kaW5nIGVycm9yXG4iKSk7CisjZW5kaWYKKwkJZ290byBjbGVhbnVwOworCX0KKworCXJldHVybjsKKworIGNsZWFudXA6CisJcmVnLT5FUDB2bV9zdGF0ZSA9IFZNX1NUT1A7CisJYXRvbWljX2RlYygmcmVnLT5SZWdGaXJlQ291bnQpOworfQorCisKK3ZvaWQKK1diMzVSZWdfRVAwVk1fY29tcGxldGUoc3RydWN0IHVyYiAqdXJiKQoreworCXBod19kYXRhX3QgIHBId0RhdGEgPSAocGh3X2RhdGFfdCl1cmItPmNvbnRleHQ7CisJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOworCXN0cnVjdCB3YjM1X3JlZ19xdWV1ZSAqcmVnX3F1ZXVlOworCisKKwkvLyBWYXJpYWJsZSBzZXR0aW5nCisJcmVnLT5FUDB2bV9zdGF0ZSA9IFZNX0NPTVBMRVRFRDsKKwlyZWctPkVQMFZNX3N0YXR1cyA9IHVyYi0+c3RhdHVzOworCisJaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlKSB7IC8vIExldCBXYldsYW5IYWx0IHRvIGhhbmRsZSBzdXJwcmlzZSByZW1vdmUKKwkJcmVnLT5FUDB2bV9zdGF0ZSA9IFZNX1NUT1A7CisJCWF0b21pY19kZWMoJnJlZy0+UmVnRmlyZUNvdW50KTsKKwl9IGVsc2UgeworCQkvLyBDb21wbGV0ZSB0byBzZW5kLCByZW1vdmUgdGhlIFVSQiBmcm9tIHRoZSBmaXJzdAorCQlzcGluX2xvY2tfaXJxKCAmcmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKKwkJcmVnX3F1ZXVlID0gcmVnLT5yZWdfZmlyc3Q7CisJCWlmIChyZWdfcXVldWUgPT0gcmVnLT5yZWdfbGFzdCkKKwkJCXJlZy0+cmVnX2xhc3QgPSBOVUxMOworCQlyZWctPnJlZ19maXJzdCA9IHJlZy0+cmVnX2ZpcnN0LT5OZXh0OworCQlzcGluX3VubG9ja19pcnEoICZyZWctPkVQMFZNX3NwaW5fbG9jayApOworCisJCWlmIChyZWctPkVQMFZNX3N0YXR1cykgeworI2lmZGVmIF9QRV9SRUdfRFVNUF8KKwkJCVdCREVCVUcoKCJFUDAgSW9Db21wbGV0ZVJvdXRpbmUgcmV0dXJuIGVycm9yXG4iKSk7CisJCQlEZWJ1Z1VzYmRTdGF0dXNJbmZvcm1hdGlvbiggcmVnLT5FUDBWTV9zdGF0dXMgKTsKKyNlbmRpZgorCQkJcmVnLT5FUDB2bV9zdGF0ZSA9IFZNX1NUT1A7CisJCQlwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSA9IDE7CisJCX0gZWxzZSB7CisJCQkvLyBTdWNjZXNzLiBVcGRhdGUgdGhlIHJlc3VsdAorCisJCQkvLyBTdGFydCB0aGUgbmV4dCBzZW5kCisJCQlXYjM1UmVnX0VQMFZNKHBId0RhdGEpOworCQl9CisKKyAgIAkJa2ZyZWUocmVnX3F1ZXVlKTsKKwl9CisKKwl1c2JfZnJlZV91cmIodXJiKTsKK30KKworCit2b2lkCitXYjM1UmVnX2Rlc3Ryb3kocGh3X2RhdGFfdCBwSHdEYXRhKQoreworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKKwlzdHJ1Y3QgdXJiCSp1cmI7CisJc3RydWN0IHdiMzVfcmVnX3F1ZXVlICpyZWdfcXVldWU7CisKKworCVV4eF9wb3dlcl9vZmZfcHJvY2VkdXJlKHBId0RhdGEpOworCisJLy8gV2FpdCBmb3IgUmVnIG9wZXJhdGlvbiBjb21wbGV0ZWQKKwlkbyB7CisJCW1zbGVlcCgxMCk7IC8vIERlbGF5IGZvciB3YWl0aW5nIGZ1bmN0aW9uIGVudGVyIDk0MDYyMy4xLmEKKwl9IHdoaWxlIChyZWctPkVQMHZtX3N0YXRlICE9IFZNX1NUT1ApOworCW1zbGVlcCgxMCk7ICAvLyBEZWxheSBmb3Igd2FpdGluZyBmdW5jdGlvbiBlbnRlciA5NDA2MjMuMS5iCisKKwkvLyBSZWxlYXNlIGFsbCB0aGUgZGF0YSBpbiBSZWdRdWV1ZQorCXNwaW5fbG9ja19pcnEoICZyZWctPkVQMFZNX3NwaW5fbG9jayApOworCXJlZ19xdWV1ZSA9IHJlZy0+cmVnX2ZpcnN0OworCXdoaWxlIChyZWdfcXVldWUpIHsKKwkJaWYgKHJlZ19xdWV1ZSA9PSByZWctPnJlZ19sYXN0KQorCQkJcmVnLT5yZWdfbGFzdCA9IE5VTEw7CisJCXJlZy0+cmVnX2ZpcnN0ID0gcmVnLT5yZWdfZmlyc3QtPk5leHQ7CisKKwkJdXJiID0gcmVnX3F1ZXVlLT51cmI7CisJCXNwaW5fdW5sb2NrX2lycSggJnJlZy0+RVAwVk1fc3Bpbl9sb2NrICk7CisJCWlmICh1cmIpIHsKKwkJCXVzYl9mcmVlX3VyYih1cmIpOworCQkJa2ZyZWUocmVnX3F1ZXVlKTsKKwkJfSBlbHNlIHsKKwkJCSNpZmRlZiBfUEVfUkVHX0RVTVBfCisJCQlXQkRFQlVHKCgiRVAwIHF1ZXVlIHJlbGVhc2UgZXJyb3JcbiIpKTsKKwkJCSNlbmRpZgorCQl9CisJCXNwaW5fbG9ja19pcnEoICZyZWctPkVQMFZNX3NwaW5fbG9jayApOworCisJCXJlZ19xdWV1ZSA9IHJlZy0+cmVnX2ZpcnN0OworCX0KKwlzcGluX3VubG9ja19pcnEoICZyZWctPkVQMFZNX3NwaW5fbG9jayApOworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gVGhlIGZ1bmN0aW9uIGNhbiBiZSBydW4gaW4gcGFzc2l2ZS1sZXZlbCBvbmx5LgorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3Vuc2lnbmVkIGNoYXIgV2IzNVJlZ19pbml0aWFsKHBod19kYXRhX3QgcEh3RGF0YSkKK3sKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZz0mcEh3RGF0YS0+cmVnOworCXUzMiBsdG1wOworCXUzMiBTb2Z0d2FyZVNldCwgVkNPX3RyaW0sIFR4VmdhLCBSZWdpb25fU2NhbkludGVydmFsOworCisJLy8gU3BpbiBsb2NrIGlzIGFjcXVpcmVkIGZvciByZWFkIGFuZCB3cml0ZSBJUlAgY29tbWFuZAorCXNwaW5fbG9ja19pbml0KCAmcmVnLT5FUDBWTV9zcGluX2xvY2sgKTsKKworCS8vIEdldHRpbmcgUkYgbW9kdWxlIHR5cGUgZnJvbSBFRVBST00gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDNiNCwgMHgwODBkMDAwMCApOyAvLyBTdGFydCBFRVBST00gYWNjZXNzICsgUmVhZCArIGFkZHJlc3MoMHgwZCkKKwlXYjM1UmVnX1JlYWRTeW5jKCBwSHdEYXRhLCAweDAzYjQsICZsdG1wICk7CisKKwkvL1VwZGF0ZSBSRiBtb2R1bGUgdHlwZSBhbmQgZGV0ZXJtaW5lIHRoZSBQSFkgdHlwZSBieSBpbmYgb3IgRUVQUk9NCisJcmVnLT5FRVBST01QaHlUeXBlID0gKHU4KSggbHRtcCAmIDB4ZmYgKTsKKwkvLyAwIFYgTUFYMjgyNSwgMSBWIE1BWDI4MjcsIDIgViBNQVgyODI4LCAzIFYgTUFYMjgyOQorCS8vIDE2ViBBTDIyMzAsIDE3IC0gQUw3MjMwLCAxOCAtIEFMMjIzMFMKKwkvLyAzMiBSZXNlcnZlZAorCS8vIDMzIC0gVzg5UkYyNDIoVHhWR0EgMH4xOSksIDM0IC0gVzg5UkYyNDIoVHhWR0EgMH4zNCkKKwlpZiAocmVnLT5FRVBST01QaHlUeXBlICE9IFJGX0RFQ0lERV9CWV9JTkYpIHsKKwkJaWYoIChyZWctPkVFUFJPTVBoeVR5cGUgPT0gUkZfTUFYSU1fMjgyNSkJfHwKKwkJCShyZWctPkVFUFJPTVBoeVR5cGUgPT0gUkZfTUFYSU1fMjgyNykJfHwKKwkJCShyZWctPkVFUFJPTVBoeVR5cGUgPT0gUkZfTUFYSU1fMjgyOCkJfHwKKwkJCShyZWctPkVFUFJPTVBoeVR5cGUgPT0gUkZfTUFYSU1fMjgyOSkJfHwKKwkJCShyZWctPkVFUFJPTVBoeVR5cGUgPT0gUkZfTUFYSU1fVjEpCXx8CisJCQkocmVnLT5FRVBST01QaHlUeXBlID09IFJGX0FJUk9IQV8yMjMwKQl8fAorCQkJKHJlZy0+RUVQUk9NUGh5VHlwZSA9PSBSRl9BSVJPSEFfMjIzMFMpICAgIHx8CisJCQkocmVnLT5FRVBST01QaHlUeXBlID09IFJGX0FJUk9IQV83MjMwKQl8fAorCQkJKHJlZy0+RUVQUk9NUGh5VHlwZSA9PSBSRl9XQl8yNDIpCQl8fAorCQkJKHJlZy0+RUVQUk9NUGh5VHlwZSA9PSBSRl9XQl8yNDJfMSkpCisJCQlwSHdEYXRhLT5waHlfdHlwZSA9IHJlZy0+RUVQUk9NUGh5VHlwZTsKKwl9CisKKwkvLyBQb3dlciBPbiBwcm9jZWR1cmUgcnVubmluZy4gVGhlIHJlbGF0aXZlIHBhcmFtZXRlciB3aWxsIGJlIHNldCBhY2NvcmRpbmcgdG8gcGh5X3R5cGUKKwlVeHhfcG93ZXJfb25fcHJvY2VkdXJlKCBwSHdEYXRhICk7CisKKwkvLyBSZWFkaW5nIE1BQyBhZGRyZXNzCisJVXh4X1JlYWRFdGhlcm5ldEFkZHJlc3MoIHBId0RhdGEgKTsKKworCS8vIFJlYWQgVkNPIHRyaW0gZm9yIFJGIHBhcmFtZXRlcgorCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDAzYjQsIDB4MDgyMDAwMDAgKTsKKwlXYjM1UmVnX1JlYWRTeW5jKCBwSHdEYXRhLCAweDAzYjQsICZWQ09fdHJpbSApOworCisJLy8gUmVhZCBBbnRlbm5hIE9uL09mZiBvZiBzb2Z0d2FyZSBmbGFnCisJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDNiNCwgMHgwODIxMDAwMCApOworCVdiMzVSZWdfUmVhZFN5bmMoIHBId0RhdGEsIDB4MDNiNCwgJlNvZnR3YXJlU2V0ICk7CisKKwkvLyBSZWFkIFRYVkdBCisJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDNiNCwgMHgwODEwMDAwMCApOworCVdiMzVSZWdfUmVhZFN5bmMoIHBId0RhdGEsIDB4MDNiNCwgJlR4VmdhICk7CisKKwkvLyBHZXQgU2NhbiBpbnRlcnZhbCBzZXR0aW5nIGZyb20gRUVQUk9NIG9mZnNldCAweDFjCisJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MDNiNCwgMHgwODFkMDAwMCApOworCVdiMzVSZWdfUmVhZFN5bmMoIHBId0RhdGEsIDB4MDNiNCwgJlJlZ2lvbl9TY2FuSW50ZXJ2YWwgKTsKKworCS8vIFVwZGF0ZSBFdGhlcm5ldCBhZGRyZXNzCisJbWVtY3B5KCBwSHdEYXRhLT5DdXJyZW50TWFjQWRkcmVzcywgcEh3RGF0YS0+UGVybWFuZW50TWFjQWRkcmVzcywgRVRIX0xFTkdUSF9PRl9BRERSRVNTICk7CisKKwkvLyBVcGRhdGUgc29mdHdhcmUgdmFyaWFibGUKKwlwSHdEYXRhLT5Tb2Z0d2FyZVNldCA9ICh1MTYpKFNvZnR3YXJlU2V0ICYgMHhmZmZmKTsKKwlUeFZnYSAmPSAweDAwMDAwMGZmOworCXBId0RhdGEtPlBvd2VySW5kZXhGcm9tRUVQUk9NID0gKHU4KVR4VmdhOworCXBId0RhdGEtPlZDT190cmltID0gKHU4KVZDT190cmltICYgMHhmZjsKKwlpZiAocEh3RGF0YS0+VkNPX3RyaW0gPT0gMHhmZikKKwkJcEh3RGF0YS0+VkNPX3RyaW0gPSAweDI4OworCisJcmVnLT5FRVBST01SZWdpb24gPSAodTgpKFJlZ2lvbl9TY2FuSW50ZXJ2YWw+PjgpOyAvLyAyMDA2MDcyMAorCWlmKCByZWctPkVFUFJPTVJlZ2lvbjwxIHx8IHJlZy0+RUVQUk9NUmVnaW9uPjYgKQorCQlyZWctPkVFUFJPTVJlZ2lvbiA9IFJFR0lPTl9BVVRPOworCisJLy9Gb3IgR2V0IFR4IFZHQSBmcm9tIEVFUFJPTSAyMDA2MDMxNS41IG1vdmUgaGVyZQorCUdldFR4VmdhRnJvbUVFUFJPTSggcEh3RGF0YSApOworCisJLy8gU2V0IFNjYW4gSW50ZXJ2YWwKKwlwSHdEYXRhLT5TY2FuX0ludGVydmFsID0gKHU4KShSZWdpb25fU2NhbkludGVydmFsICYgMHhmZikgKiAxMDsKKwlpZiAoKHBId0RhdGEtPlNjYW5fSW50ZXJ2YWwgPT0gMjU1MCkgfHwgKHBId0RhdGEtPlNjYW5fSW50ZXJ2YWwgPCAxMCkpIC8vIElzIGRlZmF1bHQgc2V0dGluZyAweGZmICogMTAKKwkJcEh3RGF0YS0+U2Nhbl9JbnRlcnZhbCA9IFNDQU5fTUFYX0NITkxfVElNRTsKKworCS8vIEluaXRpYWwgcmVnaXN0ZXIKKwlSRlN5bnRoZXNpemVyX2luaXRpYWwocEh3RGF0YSk7CisKKwlCQlByb2Nlc3Nvcl9pbml0aWFsKHBId0RhdGEpOyAvLyBBc3luYyB3cml0ZSwgbXVzdCB3YWl0IHVudGlsIGNvbXBsZXRlCisKKwlXYjM1UmVnX3BoeV9jYWxpYnJhdGlvbihwSHdEYXRhKTsKKworCU14eF9pbml0aWFsKHBId0RhdGEpOworCUR4eF9pbml0aWFsKHBId0RhdGEpOworCisJaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlKQorCQlyZXR1cm4gZmFsc2U7CisJZWxzZQorCQlyZXR1cm4gdHJ1ZTsgLy8gSW5pdGlhbCBmYWlsCit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBDYXJkQ29tcHV0ZUNyYyAtLQorLy8KKy8vICBEZXNjcmlwdGlvbjoKKy8vICAgIFJ1bnMgdGhlIEFVVE9ESU4gSUkgQ1JDIGFsZ29yaXRobSBvbiBidWZmZXIgQnVmZmVyIG9mIGxlbmd0aCwgTGVuZ3RoLgorLy8KKy8vICBBcmd1bWVudHM6CisvLyAgICBCdWZmZXIgLSB0aGUgaW5wdXQgYnVmZmVyCisvLyAgICBMZW5ndGggLSB0aGUgbGVuZ3RoIG9mIEJ1ZmZlcgorLy8KKy8vICBSZXR1cm4gVmFsdWU6CisvLyAgICBUaGUgMzItYml0IENSQyB2YWx1ZS4KKy8vCisvLyAgTm90ZToKKy8vICAgIFRoaXMgaXMgYWRhcHRlZCBmcm9tIHRoZSBjb21tZW50cyBpbiB0aGUgYXNzZW1ibHkgbGFuZ3VhZ2UKKy8vICAgIHZlcnNpb24gaW4gX0dFTlJFUS5BU00gb2YgdGhlIERXQiBORTEwMDAvMjAwMCBkcml2ZXIuCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3UzMgorQ2FyZENvbXB1dGVDcmModTggKiBCdWZmZXIsIHUzMiBMZW5ndGgpCit7CisgICAgdTMyIENyYywgQ2Fycnk7CisgICAgdTMyICBpLCBqOworICAgIHU4IEN1ckJ5dGU7CisKKyAgICBDcmMgPSAweGZmZmZmZmZmOworCisgICAgZm9yIChpID0gMDsgaSA8IExlbmd0aDsgaSsrKSB7CisKKyAgICAgICAgQ3VyQnl0ZSA9IEJ1ZmZlcltpXTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisKKyAgICAgICAgICAgIENhcnJ5ICAgICA9ICgoQ3JjICYgMHg4MDAwMDAwMCkgPyAxIDogMCkgXiAoQ3VyQnl0ZSAmIDB4MDEpOworICAgICAgICAgICAgQ3JjICAgICA8PD0gMTsKKyAgICAgICAgICAgIEN1ckJ5dGUgPj49IDE7CisKKyAgICAgICAgICAgIGlmIChDYXJyeSkgeworICAgICAgICAgICAgICAgIENyYyA9KENyYyBeIDB4MDRjMTFkYjYpIHwgQ2Fycnk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQ3JjOworfQorCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBCaXRSZXZlcnNlIC0tCisvLyAgIFJldmVyc2UgdGhlIGJpdHMgaW4gdGhlIGlucHV0IGFyZ3VtZW50LCBkd0RhdGEsIHdoaWNoIGlzCisvLyAgIHJlZ2FyZGVkIGFzIGEgc3RyaW5nIG9mIGJpdHMgd2l0aCB0aGUgbGVuZ3RoLCBEYXRhTGVuZ3RoLgorLy8KKy8vIEFyZ3VtZW50czoKKy8vICAgZHdEYXRhICAgICA6CisvLyAgIERhdGFMZW5ndGggOgorLy8KKy8vIFJldHVybjoKKy8vICAgVGhlIGNvbnZlcnRlZCB2YWx1ZS4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit1MzIgQml0UmV2ZXJzZSggdTMyIGR3RGF0YSwgdTMyIERhdGFMZW5ndGgpCit7CisJdTMyICAgSGFsZkxlbmd0aCwgaSwgajsKKwl1MzIgICBCaXRBLCBCaXRCOworCisJaWYgKCBEYXRhTGVuZ3RoIDw9IDApICAgICAgIHJldHVybiAwOyAgIC8vIE5vIGNvbnZlcnNpb24gaXMgZG9uZS4KKwlkd0RhdGEgPSBkd0RhdGEgJiAoMHhmZmZmZmZmZiA+PiAoMzIgLSBEYXRhTGVuZ3RoKSk7CisKKwlIYWxmTGVuZ3RoID0gRGF0YUxlbmd0aCAvIDI7CisJZm9yICggaSA9IDAsIGogPSBEYXRhTGVuZ3RoLTEgOyBpIDwgSGFsZkxlbmd0aDsgaSsrLCBqLS0pCisJeworCQlCaXRBID0gR2V0Qml0KCBkd0RhdGEsIGkpOworCQlCaXRCID0gR2V0Qml0KCBkd0RhdGEsIGopOworCQlpZiAoQml0QSAmJiAhQml0QikgeworCQkJZHdEYXRhID0gQ2xlYXJCaXQoIGR3RGF0YSwgaSk7CisJCQlkd0RhdGEgPSBTZXRCaXQoIGR3RGF0YSwgaik7CisJCX0gZWxzZSBpZiAoIUJpdEEgJiYgQml0QikgeworCQkJZHdEYXRhID0gU2V0Qml0KCBkd0RhdGEsIGkpOworCQkJZHdEYXRhID0gQ2xlYXJCaXQoIGR3RGF0YSwgaik7CisJCX0gZWxzZQorCQl7CisJCQkvLyBEbyBub3RoaW5nIHNpbmNlIHRoZXNlIHR3byBiaXRzIGFyZSBvZiB0aGUgc2F2ZSB2YWx1ZXMuCisJCX0KKwl9CisKKwlyZXR1cm4gZHdEYXRhOworfQorCit2b2lkIFdiMzVSZWdfcGh5X2NhbGlicmF0aW9uKCAgcGh3X2RhdGFfdCBwSHdEYXRhICkKK3sKKwl1MzIgQkIzYywgQkI1NDsKKworCWlmICgocEh3RGF0YS0+cGh5X3R5cGUgPT0gUkZfV0JfMjQyKSB8fAorCQkocEh3RGF0YS0+cGh5X3R5cGUgPT0gUkZfV0JfMjQyXzEpKSB7CisJCXBoeV9jYWxpYnJhdGlvbl93aW5ib25kICggcEh3RGF0YSwgMjQxMiApOyAvLyBTeW5jIG9wZXJhdGlvbgorCQlXYjM1UmVnX1JlYWRTeW5jKCBwSHdEYXRhLCAweDEwM2MsICZCQjNjICk7CisJCVdiMzVSZWdfUmVhZFN5bmMoIHBId0RhdGEsIDB4MTA1NCwgJkJCNTQgKTsKKworCQlwSHdEYXRhLT5CQjNjX2NhbCA9IEJCM2M7CisJCXBId0RhdGEtPkJCNTRfY2FsID0gQkI1NDsKKworCQlSRlN5bnRoZXNpemVyX2luaXRpYWwocEh3RGF0YSk7CisJCUJCUHJvY2Vzc29yX2luaXRpYWwocEh3RGF0YSk7IC8vIEFzeW5jIG9wZXJhdGlvbgorCisJCVdiMzVSZWdfV3JpdGVTeW5jKCBwSHdEYXRhLCAweDEwM2MsIEJCM2MgKTsKKwkJV2IzNVJlZ19Xcml0ZVN5bmMoIHBId0RhdGEsIDB4MTA1NCwgQkI1NCApOworCX0KK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cmVnX2YuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyZWdfZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NzIxNWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cmVnX2YuaApAQCAtMCwwICsxLDYxIEBACisjaWZuZGVmIF9fV0lOQk9ORF9XQjM1UkVHX0ZfSAorI2RlZmluZSBfX1dJTkJPTkRfV0IzNVJFR19GX0gKKworI2luY2x1ZGUgIndiaGFsX3MuaCIKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEludGVyZmFjZSBmdW5jdGlvbiBkZWNsYXJlCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQordW5zaWduZWQgY2hhciBXYjM1UmVnX2luaXRpYWwoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKK3ZvaWQgVXh4X3Bvd2VyX29uX3Byb2NlZHVyZSggIHBod19kYXRhX3QgcEh3RGF0YSApOwordm9pZCBVeHhfcG93ZXJfb2ZmX3Byb2NlZHVyZSggIHBod19kYXRhX3QgcEh3RGF0YSApOwordm9pZCBVeHhfUmVhZEV0aGVybmV0QWRkcmVzcyggIHBod19kYXRhX3QgcEh3RGF0YSApOwordm9pZCBEeHhfaW5pdGlhbCggIHBod19kYXRhX3QgcEh3RGF0YSApOwordm9pZCBNeHhfaW5pdGlhbCggIHBod19kYXRhX3QgcEh3RGF0YSApOwordm9pZCBSRlN5bnRoZXNpemVyX2luaXRpYWwoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKKy8vdm9pZCBSRlN5bnRoZXNpemVyX1N3aXRjaGluZ0NoYW5uZWwoICBwaHdfZGF0YV90IHBId0RhdGEsICBzOCBDaGFubmVsICk7Cit2b2lkIFJGU3ludGhlc2l6ZXJfU3dpdGNoaW5nQ2hhbm5lbCggIHBod19kYXRhX3QgcEh3RGF0YSwgIENoYW5JbmZvIENoYW5uZWwgKTsKK3ZvaWQgQkJQcm9jZXNzb3JfaW5pdGlhbCggIHBod19kYXRhX3QgcEh3RGF0YSApOwordm9pZCBCQlByb2Nlc3Nvcl9SYXRlQ2hhbmdpbmcoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCByYXRlICk7IC8vIDIwMDYwNjEzLjEKKy8vdm9pZCBSRl9SYXRlQ2hhbmdpbmcoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCByYXRlICk7IC8vIDIwMDYwNjI2LjUuYyBBZGQKK3U4IFJGU3ludGhlc2l6ZXJfU2V0UG93ZXJJbmRleCggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4IFBvd2VySW5kZXggKTsKK3U4IFJGU3ludGhlc2l6ZXJfU2V0TWF4aW0yODI4XzI0UG93ZXIoICBwaHdfZGF0YV90LCAgdTggaW5kZXggKTsKK3U4IFJGU3ludGhlc2l6ZXJfU2V0TWF4aW0yODI4XzUwUG93ZXIoICBwaHdfZGF0YV90LCAgdTggaW5kZXggKTsKK3U4IFJGU3ludGhlc2l6ZXJfU2V0TWF4aW0yODI3XzI0UG93ZXIoICBwaHdfZGF0YV90LCAgdTggaW5kZXggKTsKK3U4IFJGU3ludGhlc2l6ZXJfU2V0TWF4aW0yODI3XzUwUG93ZXIoICBwaHdfZGF0YV90LCAgdTggaW5kZXggKTsKK3U4IFJGU3ludGhlc2l6ZXJfU2V0TWF4aW0yODI1UG93ZXIoICBwaHdfZGF0YV90LCAgdTggaW5kZXggKTsKK3U4IFJGU3ludGhlc2l6ZXJfU2V0QWlyb2hhMjIzMFBvd2VyKCAgcGh3X2RhdGFfdCwgIHU4IGluZGV4ICk7Cit1OCBSRlN5bnRoZXNpemVyX1NldEFpcm9oYTcyMzBQb3dlciggIHBod19kYXRhX3QsICB1OCBpbmRleCApOwordTggUkZTeW50aGVzaXplcl9TZXRXaW5ib25kMjQyUG93ZXIoICBwaHdfZGF0YV90LCAgdTggaW5kZXggKTsKK3ZvaWQgR2V0VHhWZ2FGcm9tRUVQUk9NKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Cit2b2lkIEVFUFJPTVR4VmdhQWRqdXN0KCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7IC8vIDIwMDYwNjE5LjUgQWRkCisKKyNkZWZpbmUgUkZXcml0ZUNvbnRyb2xEYXRhKCBfQSwgX1YgKSBXYjM1UmVnX1dyaXRlKCBfQSwgMHgwODY0LCBfViApCisKK3ZvaWQgV2IzNVJlZ19kZXN0cm95KCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7CisKK3Vuc2lnbmVkIGNoYXIgV2IzNVJlZ19SZWFkKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IFJlZ2lzdGVyTm8sICAgdTMyICogcFJlZ2lzdGVyVmFsdWUgKTsKK3Vuc2lnbmVkIGNoYXIgV2IzNVJlZ19SZWFkU3luYyggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUxNiBSZWdpc3Rlck5vLCAgIHUzMiAqIHBSZWdpc3RlclZhbHVlICk7Cit1bnNpZ25lZCBjaGFyIFdiMzVSZWdfV3JpdGUoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MTYgUmVnaXN0ZXJObywgIHUzMiBSZWdpc3RlclZhbHVlICk7Cit1bnNpZ25lZCBjaGFyIFdiMzVSZWdfV3JpdGVTeW5jKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IFJlZ2lzdGVyTm8sICB1MzIgUmVnaXN0ZXJWYWx1ZSApOwordW5zaWduZWQgY2hhciBXYjM1UmVnX1dyaXRlV2l0aENhbGxiYWNrVmFsdWUoICBwaHdfZGF0YV90IHBId0RhdGEsCisJCQkJCQkJCSB1MTYgUmVnaXN0ZXJObywKKwkJCQkJCQkJIHUzMiBSZWdpc3RlclZhbHVlLAorCQkJCQkJCQkgczggKnBWYWx1ZSwKKwkJCQkJCQkJIHM4IExlbik7Cit1bnNpZ25lZCBjaGFyIFdiMzVSZWdfQnVyc3RXcml0ZSggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUxNiBSZWdpc3Rlck5vLCAgdTMyICogcFJlZ2lzdGVyRGF0YSwgIHU4IE51bWJlck9mRGF0YSwgIHU4IEZsYWcgKTsKKwordm9pZCBXYjM1UmVnX0VQMFZNKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Cit2b2lkIFdiMzVSZWdfRVAwVk1fc3RhcnQoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKK3ZvaWQgV2IzNVJlZ19FUDBWTV9jb21wbGV0ZShzdHJ1Y3QgdXJiICp1cmIpOworCit1MzIgQml0UmV2ZXJzZSggdTMyIGR3RGF0YSwgdTMyIERhdGFMZW5ndGgpOworCit2b2lkIENhcmRHZXRNdWx0aWNhc3RCaXQoICAgdTggQWRkcmVzc1tNQUNfQUREUl9MRU5HVEhdLCAgdTggKkJ5dGUsICB1OCAqVmFsdWUgKTsKK3UzMiBDYXJkQ29tcHV0ZUNyYyggIHU4ICogQnVmZmVyLCAgdTMyIExlbmd0aCApOworCit2b2lkIFdiMzVSZWdfcGh5X2NhbGlicmF0aW9uKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Cit2b2lkIFdiMzVSZWdfVXBkYXRlKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IFJlZ2lzdGVyTm8sICB1MzIgUmVnaXN0ZXJWYWx1ZSApOwordW5zaWduZWQgY2hhciBhZGp1c3RfVFhWR0FfZm9yX2lxX21hZyggIHBod19kYXRhX3QgcEh3RGF0YSApOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyZWdfcy5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJlZ19zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJlZjRiOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyZWdfcy5oCkBAIC0wLDAgKzEsMTcyIEBACisjaWZuZGVmIF9fV0lOQk9ORF9XQjM1UkVHX1NfSAorI2RlZmluZSBfX1dJTkJPTkRfV0IzNVJFR19TX0gKKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvKgorCQkJCUhBTCBzZXR0aW5nIGZ1bmN0aW9uCisKKwkJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQl8VXh4fCAJfER4eHwJfE14eHwJfEJCfAl8UkZ8CisJCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJCXwJCQkJCXwKKwkJV2IzNVJlZ19SZWFkCQlXYjM1UmVnX1dyaXRlCisKKwkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCVdiVXNiX0NhbGxVU0JEQVN5bmMJCQkJCXN1cHBsaWVkIEJ5IFdiVXNiIG1vZHVsZQorKi8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNkZWZpbmUgICAgIEdldEJpdCggZHdEYXRhLCBpKSAgICAgICggZHdEYXRhICYgKDB4MDAwMDAwMDEgPDwgaSkpCisjZGVmaW5lICAgICBTZXRCaXQoIGR3RGF0YSwgaSkgICAgICAoIGR3RGF0YSB8ICgweDAwMDAwMDAxIDw8IGkpKQorI2RlZmluZSAgICAgQ2xlYXJCaXQoIGR3RGF0YSwgaSkgICAgKCBkd0RhdGEgJiB+KDB4MDAwMDAwMDEgPDwgaSkpCisKKyNkZWZpbmUJCUlHTk9SRV9JTkNSRU1FTlQJMAorI2RlZmluZQkJQVVUT19JTkNSRU1FTlQJCTAKKyNkZWZpbmUJCU5PX0lOQ1JFTUVOVAkJMQorI2RlZmluZSBSRUdfRElSRUNUSU9OKF94LF95KSAgICgoX3kpLT5ESVJFQ1QgPT0wID8gdXNiX3JjdmN0cmxwaXBlKF94LDApIDogdXNiX3NuZGN0cmxwaXBlKF94LDApKQorI2RlZmluZSBSRUdfQlVGX1NJWkUoX3gpICAgICAgICgoX3gpLT5iUmVxdWVzdD09IDB4MDQgPyBjcHVfdG9fbGUxNigoX3gpLT53TGVuZ3RoKSA6IDQpCisKKy8vIDIwMDYwNjEzLjIgQWRkIHRoZSBmb2xsb3cgZGVmaW5pdGlvbgorI2RlZmluZSBCQjQ4X0RFRkFVTFRfQUwyMjMwXzExQgkJMHgwMDMzNDQ3YworI2RlZmluZSBCQjRDX0RFRkFVTFRfQUwyMjMwXzExQgkJMHgwQTAwRkVGRgorI2RlZmluZSBCQjQ4X0RFRkFVTFRfQUwyMjMwXzExRwkJMHgwMDMzMkMxQgorI2RlZmluZSBCQjRDX0RFRkFVTFRfQUwyMjMwXzExRwkJMHgwQTAwRkVGRgorCisKKyNkZWZpbmUgQkI0OF9ERUZBVUxUX1dCMjQyXzExQgkJMHgwMDI5MjMxNQkvL2JhY2tvZmYgIDJkQgorI2RlZmluZSBCQjRDX0RFRkFVTFRfV0IyNDJfMTFCCQkweDA4MDBGRUZGCS8vYmFja29mZiAgMmRCCisvLyNkZWZpbmUgQkI0OF9ERUZBVUxUX1dCMjQyXzExQgkJMHgwMDIwMUIxMQkvL2JhY2tvZmYgIDRkQgorLy8jZGVmaW5lIEJCNENfREVGQVVMVF9XQjI0Ml8xMUIJCTB4MDYwMEZGMDAJLy9iYWNrb2ZmICA0ZEIKKyNkZWZpbmUgQkI0OF9ERUZBVUxUX1dCMjQyXzExRwkJMHgwMDQ1M0IyNAorI2RlZmluZSBCQjRDX0RFRkFVTFRfV0IyNDJfMTFHCQkweDBFMDBGRUZGCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBEZWZhdWx0IHNldHRpbmcgZm9yIE14eAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgREVGQVVMVF9DV01JTgkJCQkJMzEJCS8vKE0yQykgQ1dtaW4uIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC0zMS4KKyNkZWZpbmUgREVGQVVMVF9DV01BWAkJCQkJMTAyMwkvLyhNMkMpIENXbWF4LiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtMTAyMy4KKyNkZWZpbmUgREVGQVVMVF9BSUQJCQkJCQkxCQkvLyhNMzQpIEFJRC4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAxLTIwMDcuCisKKyNpZmRlZiBfVVNFX0ZBTExCQUNLX1JBVEVfCisjZGVmaW5lIERFRkFVTFRfUkFURV9SRVRSWV9MSU1JVAkJMgkJLy8oTTM4KSBhcyBuYW1lZAorI2Vsc2UKKyNkZWZpbmUgREVGQVVMVF9SQVRFX1JFVFJZX0xJTUlUCQk3CQkvLyhNMzgpIGFzIG5hbWVkCisjZW5kaWYKKworI2RlZmluZSBERUZBVUxUX0xPTkdfUkVUUllfTElNSVQJCTcJCS8vKE0zOCkgTG9uZ1JldHJ5TGltaXQuIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC0xNS4KKyNkZWZpbmUgREVGQVVMVF9TSE9SVF9SRVRSWV9MSU1JVAkJNwkJLy8oTTM4KSBTaG9ydFJldHJ5TGltaXQuIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC0xNS4KKyNkZWZpbmUgREVGQVVMVF9QSUZTVAkJCQkJMjUJCS8vKE0zQykgUElGUyBUaW1lLiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtNjU1MzUuCisjZGVmaW5lIERFRkFVTFRfRUlGU1QJCQkJCTM1NAkJLy8oTTNDKSBFSUZTIFRpbWUuIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC0xMDQ4NTc1LgorI2RlZmluZSBERUZBVUxUX0RJRlNUCQkJCQk0NQkJLy8oTTNDKSBESUZTIFRpbWUuIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC02NTUzNS4KKyNkZWZpbmUgREVGQVVMVF9TSUZTVAkJCQkJNQkJLy8oTTNDKSBTSUZTIFRpbWUuIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC02NTUzNS4KKyNkZWZpbmUgREVGQVVMVF9PU0lGU1QJCQkJCTEwCQkvLyhNM0MpIE9yaWdpbmFsIFNJRlMgVGltZS4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAwLTE1LgorI2RlZmluZSBERUZBVUxUX0FUSU1XRAkJCQkJMAkJLy8oTTQwKSBBVElNIFdpbmRvdy4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAwLTY1NTM1LgorI2RlZmluZSBERUZBVUxUX1NMT1RfVElNRQkJCQkyMAkJLy8oTTQwKSAoJCkgU2xvdFRpbWUuIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC0yNTUuCisjZGVmaW5lIERFRkFVTFRfTUFYX1RYX01TRFVfTElGRV9USU1FCTUxMgkvLyhNNDQpIE1heFR4TVNEVUxpZmVUaW1lLiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtNDI5NDk2NzI5NS4KKyNkZWZpbmUgREVGQVVMVF9CRUFDT05fSU5URVJWQUwJCQk1MDAJCS8vKE00OCkgQmVhY29uIEludGVydmFsLiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtNjU1MzUuCisjZGVmaW5lIERFRkFVTFRfUFJPQkVfREVMQVlfVElNRQkJMjAwCQkvLyhNNDgpIFByb2JlIERlbGF5IFRpbWUuIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC02NTUzNS4KKyNkZWZpbmUgREVGQVVMVF9QUk9UT0NPTF9WRVJTSU9OCQkwCQkvLyhNNEMpCisjZGVmaW5lIERFRkFVTFRfTUFDX1BPV0VSX1NUQVRFCQkJMgkJLy8oTTRDKSAyOiBNQUMgYXQgcG93ZXIgYWN0aXZlCisjZGVmaW5lIERFRkFVTFRfRFRJTV9BTEVSVF9USU1FCQkJMAorCisKK3N0cnVjdCB3YjM1X3JlZ19xdWV1ZSB7CisJc3RydWN0IHVyYiAJKnVyYjsKKwl2b2lkCQkqcFVzYlJlcTsKKwl2b2lkCQkqTmV4dDsKKwl1bmlvbiB7CisJCXUzMglWQUxVRTsKKwkJdTMyCSpwQnVmZmVyOworCX07CisJdTgJCVJFU0VSVkVEWzRdOyAvLyBzcGFjZSByZXNlcnZlZCBmb3IgY29tbXVuaWNhdGlvbgorCXUxNgkJSU5ERVg7IC8vIEZvciBzdG9yaW5nIHRoZSByZWdpc3RlciBpbmRleAorCXU4CQlSRVNFUlZFRF9WQUxJRDsJLy8gSW5kaWNhdGUgd2hldGhlciB0aGUgUkVTRVJWRUQgc3BhY2UgaXMgdmFsaWQgYXQgdGhpcyBjb21tYW5kLgorCXU4CQlESVJFQ1Q7IC8vIDA6SW4gICAxOk91dAorfTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEludGVybmFsIHZhcmlhYmxlIGZvciBtb2R1bGUKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIE1BWF9TUTNfRklMVEVSX1NJWkUJCTUKK3N0cnVjdCB3YjM1X3JlZyB7CisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUmVnaXN0ZXIgQmFuayBiYWNrdXAKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwl1MzIJVTFCMDsJCQkvL2JpdDE2IHJlY29yZCB0aGUgaC93IHJhZGlvIG9uL29mZiBzdGF0dXMKKwl1MzIJVTFCQ19MRURDb25maWd1cmU7CisJdTMyCUQwMF9EbWFDb250cm9sOworCXUzMglNMDBfTWFjQ29udHJvbDsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1MzIJTTA0X011bHRpY2FzdEFkZHJlc3MxOworCQkJdTMyCU0wOF9NdWx0aWNhc3RBZGRyZXNzMjsKKwkJfTsKKwkJdTgJCU11bHRpY2FzdFs4XTsJLy8gY29udGVudHMgb2YgY2FyZCBtdWx0aWNhc3QgcmVnaXN0ZXJzCisJfTsKKworCXUzMglNMjRfTWFjQ29udHJvbDsKKwl1MzIJTTI4X01hY0NvbnRyb2w7CisJdTMyCU0yQ19NYWNDb250cm9sOworCXUzMglNMzhfTWFjQ29udHJvbDsKKwl1MzIJTTNDX01hY0NvbnRyb2w7IC8vIDIwMDYwMjE0IGJhY2t1cCBvbmx5CisJdTMyCU00MF9NYWNDb250cm9sOworCXUzMglNNDRfTWFjQ29udHJvbDsgLy8gMjAwNjAyMTQgYmFja3VwIG9ubHkKKwl1MzIJTTQ4X01hY0NvbnRyb2w7IC8vIDIwMDYwMjE0IGJhY2t1cCBvbmx5CisJdTMyCU00Q19NYWNTdGF0dXM7CisJdTMyCU02MF9NYWNDb250cm9sOyAvLyAyMDA2MDIxNCBiYWNrdXAgb25seQorCXUzMglNNjhfTWFjQ29udHJvbDsgLy8gMjAwNjAyMTQgYmFja3VwIG9ubHkKKwl1MzIJTTcwX01hY0NvbnRyb2w7IC8vIDIwMDYwMjE0IGJhY2t1cCBvbmx5CisJdTMyCU03NF9NYWNDb250cm9sOyAvLyAyMDA2MDIxNCBiYWNrdXAgb25seQorCXUzMglNNzhfRVJQSW5mb3JtYXRpb247Ly85MzAyMDYuMi5iCisJdTMyCU03Q19NYWNDb250cm9sOyAvLyAyMDA2MDIxNCBiYWNrdXAgb25seQorCXUzMglNODBfTWFjQ29udHJvbDsgLy8gMjAwNjAyMTQgYmFja3VwIG9ubHkKKwl1MzIJTTg0X01hY0NvbnRyb2w7IC8vIDIwMDYwMjE0IGJhY2t1cCBvbmx5CisJdTMyCU04OF9NYWNDb250cm9sOyAvLyAyMDA2MDIxNCBiYWNrdXAgb25seQorCXUzMglNOThfTWFjQ29udHJvbDsgLy8gMjAwNjAyMTQgYmFja3VwIG9ubHkKKworCS8vWzIwMDQwNzIyIFdLXQorCS8vQmFzZWJhbmQgcmVnaXN0ZXIKKwl1MzIJQkIwQzsJLy8gVXNlZCBmb3IgTE5BIGNhbGN1bGF0aW9uCisJdTMyCUJCMkM7CS8vCisJdTMyCUJCMzA7CS8vMTFiIGFjcXVpc2l0aW9uIGNvbnRyb2wgcmVnaXN0ZXIKKwl1MzIJQkIzQzsKKwl1MzIJQkI0ODsJLy8gMjAwNTEyMjEuMS5hIDIwMDYwNjEzLjEgRml4IE9CVyBpc3N1ZSBvZiAxMWIvMTFnIHJhdGUKKwl1MzIJQkI0QzsJLy8gMjAwNjA2MTMuMSAgRml4IE9CVyBpc3N1ZSBvZiAxMWIvMTFnIHJhdGUKKwl1MzIJQkI1MDsJLy9tb2RlIGNvbnRyb2wgcmVnaXN0ZXIKKwl1MzIJQkI1NDsKKwl1MzIgCUJCNTg7CS8vSVFfQUxQSEEKKwl1MzIJQkI1QzsJLy8gRm9yIHRlc3QKKwl1MzIJQkI2MDsJLy8gZm9yIFdUTyByZWFkIHZhbHVlCisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBWTQorCS8vLS0tLS0tLS0tLS0tLS0tLS0tLQorCXNwaW5sb2NrX3QJRVAwVk1fc3Bpbl9sb2NrOyAvLyA0QgorCXUzMgkgICAgICAgIEVQMFZNX3N0YXR1czsvLyQkCisJc3RydWN0IHdiMzVfcmVnX3F1ZXVlICpyZWdfZmlyc3Q7CisJc3RydWN0IHdiMzVfcmVnX3F1ZXVlICpyZWdfbGFzdDsKKwlhdG9taWNfdCAgICAgICBSZWdGaXJlQ291bnQ7CisKKwkvLyBIYXJkd2FyZSBzdGF0dXMKKwl1OAlFUDB2bV9zdGF0ZTsKKwl1OAltYWNfcG93ZXJfc2F2ZTsKKwl1OAlFRVBST01QaHlUeXBlOyAvLyAwIH4gMTUgZm9yIE1heGltICgwIMSEViBNQVgyODI1LCAxIMSEViBNQVgyODI3LCAyIMSEViBNQVgyODI4LCAzIMSEViBNQVgyODI5KSwKKwkJCQkJCSAgIC8vIDE2IH4gMzEgZm9yIEFpcm9oYSAoMTYgxIRWIEFMMjIzMCwgMTEgLSBBTDcyMzApCisJCQkJCQkgICAvLyAzMiB+IFJlc2VydmVkCisJCQkJCQkgICAvLyAzMyB+IDQ3IEZvciBXQjI0MiAoIDMzIC0gV0IyNDIsIDM0IC0gV0IyNDIgd2l0aCBuZXcgVHh2Z2EgMC41IGRiIHN0ZXApCisJCQkJCQkgICAvLyA0OCB+IDI1NSBBUkUgUkVTRVJWRUQuCisJdTgJRUVQUk9NUmVnaW9uOwkvL1JlZ2lvbiBzZXR0aW5nIGluIEVFUFJPTQorCisJdTMyCVN5bmNJb1BhdXNlOyAvLyBJZiB1c2VyIHVzZSB0aGUgU3luYyBJbyB0byBhY2Nlc3MgSHcsIHRoZW4gcGF1c2UgdGhlIGFzeW5jIGFjY2VzcworCisJdTgJTE5BVmFsdWVbNF07IC8vVGFibGUgZm9yIHNwZWVkIHVwIHJ1bm5pbmcKKwl1MzIJU1EzX2ZpbHRlcltNQVhfU1EzX0ZJTFRFUl9TSVpFXTsKKwl1MzIJU1EzX2luZGV4OworCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyeC5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y4YjZkNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyeC5jCkBAIC0wLDAgKzEsMzczIEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwMiBXaW5ib25kIEVsZWN0cm9uaWMgQ29ycG9yYXRpb24KKy8vCisvLyAgTW9kdWxlIE5hbWU6CisvLyAgICBXYjM1UnguYworLy8KKy8vICBBYnN0cmFjdDoKKy8vICAgIFByb2Nlc3NpbmcgdGhlIFJ4IG1lc3NhZ2UgZnJvbSBkb3duIGxheWVyCisvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisKKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAic3lzZGVmLmgiCisjaW5jbHVkZSAid2IzNXJ4X2YuaCIKKworc3RhdGljIHZvaWQgcGFja2V0X2NhbWUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGNoYXIgKnBSeEJ1ZmZlckFkZHJlc3MsIGludCBQYWNrZXRTaXplKQoreworCXN0cnVjdCB3YnNvZnRfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgcnhfc3RhdHVzID0gezB9OworCisJaWYgKCFwcml2LT5lbmFibGVkKQorCQlyZXR1cm47CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKFBhY2tldFNpemUpOworCWlmICghc2tiKSB7CisJCXByaW50aygiTm90IGVub3VnaCBtZW1vcnkgZm9yIHBhY2tldCwgRklYTUVcbiIpOworCQlyZXR1cm47CisJfQorCisJbWVtY3B5KHNrYl9wdXQoc2tiLCBQYWNrZXRTaXplKSwKKwkgICAgICAgcFJ4QnVmZmVyQWRkcmVzcywKKwkgICAgICAgUGFja2V0U2l6ZSk7CisKKy8qCisJcnhfc3RhdHVzLnJhdGUgPSAxMDsKKwlyeF9zdGF0dXMuY2hhbm5lbCA9IDE7CisJcnhfc3RhdHVzLmZyZXEgPSAxMjM0NTsKKwlyeF9zdGF0dXMucGh5bW9kZSA9IE1PREVfSUVFRTgwMjExQjsKKyovCisKKwlpZWVlODAyMTFfcnhfaXJxc2FmZShodywgc2tiLCAmcnhfc3RhdHVzKTsKK30KKworc3RhdGljIHZvaWQgV2IzNVJ4X2FkanVzdChQREVTQ1JJUFRPUiBwUnhEZXMpCit7CisJdTMyICoJcFJ4QnVmZmVyQWRkcmVzczsKKwl1MzIJRGVjcnlwdGlvbk1ldGhvZDsKKwl1MzIJaTsKKwl1MTYJQnVmZmVyU2l6ZTsKKworCURlY3J5cHRpb25NZXRob2QgPSBwUnhEZXMtPlIwMS5SMDFfZGVjcnlwdGlvbl9tZXRob2Q7CisJcFJ4QnVmZmVyQWRkcmVzcyA9IHBSeERlcy0+YnVmZmVyX2FkZHJlc3NbMF07CisJQnVmZmVyU2l6ZSA9IHBSeERlcy0+YnVmZmVyX3NpemVbMF07CisKKwkvLyBBZGp1c3QgdGhlIGxhc3QgcGFydCBvZiBkYXRhLiBPbmx5IGRhdGEgbGVmdAorCUJ1ZmZlclNpemUgLT0gNDsgLy8gRm9yIENSQy0zMgorCWlmIChEZWNyeXB0aW9uTWV0aG9kKQorCQlCdWZmZXJTaXplIC09IDQ7CisJaWYgKERlY3J5cHRpb25NZXRob2QgPT0gMykgLy8gRm9yIENDTVAKKwkJQnVmZmVyU2l6ZSAtPSA0OworCisJLy8gQWRqdXN0IHRoZSBJViBmaWVsZCB3aGljaCBhZnRlciA4MDIuMTEgaGVhZGVyIGFuZCBJQ1YgZmllbGQuCisJaWYgKERlY3J5cHRpb25NZXRob2QgPT0gMSkgLy8gRm9yIFdFUAorCXsKKwkJZm9yKCBpPTY7IGk+MDsgaS0tICkKKwkJCXBSeEJ1ZmZlckFkZHJlc3NbaV0gPSBwUnhCdWZmZXJBZGRyZXNzW2ktMV07CisJCXBSeERlcy0+YnVmZmVyX2FkZHJlc3NbMF0gPSBwUnhCdWZmZXJBZGRyZXNzICsgMTsKKwkJQnVmZmVyU2l6ZSAtPSA0OyAvLyA0IGJ5dGUgZm9yIElWCisJfQorCWVsc2UgaWYoIERlY3J5cHRpb25NZXRob2QgKSAvLyBGb3IgVEtJUCBhbmQgQ0NNUAorCXsKKwkJZm9yIChpPTc7IGk+MTsgaS0tKQorCQkJcFJ4QnVmZmVyQWRkcmVzc1tpXSA9IHBSeEJ1ZmZlckFkZHJlc3NbaS0yXTsKKwkJcFJ4RGVzLT5idWZmZXJfYWRkcmVzc1swXSA9IHBSeEJ1ZmZlckFkZHJlc3MgKyAyOy8vVXBkYXRlIHRoZSBkZXNjcmlwdG9yLCBzaGlmdCA4IGJ5dGUKKwkJQnVmZmVyU2l6ZSAtPSA4OyAvLyA4IGJ5dGUgZm9yIElWICsgSUNWCisJfQorCXBSeERlcy0+YnVmZmVyX3NpemVbMF0gPSBCdWZmZXJTaXplOworfQorCitzdGF0aWMgdTE2IFdiMzVSeF9pbmRpY2F0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlwaHdfZGF0YV90IHBId0RhdGEgPSAmcHJpdi0+c0h3RGF0YTsKKwlERVNDUklQVE9SCVJ4RGVzOworCVBXQjM1UlgJcFdiMzVSeCA9ICZwSHdEYXRhLT5XYjM1Ung7CisJdTggKgkJcFJ4QnVmZmVyQWRkcmVzczsKKwl1MTYJCVBhY2tldFNpemU7CisJdTE2CQlzdG1wLCBCdWZmZXJTaXplLCBzdG1wMiA9IDA7CisJdTMyCQlSeEJ1ZmZlcklkOworCisJLy8gT25seSBvbmUgdGhyZWFkIGJlIGFsbG93ZWQgdG8gcnVuIGludG8gdGhlIGZvbGxvd2luZworCWRvIHsKKwkJUnhCdWZmZXJJZCA9IHBXYjM1UngtPlJ4UHJvY2Vzc0luZGV4OworCQlpZiAocFdiMzVSeC0+UnhPd25lclsgUnhCdWZmZXJJZCBdKSAvL093bmVyIGJ5IFZNCisJCQlicmVhazsKKworCQlwV2IzNVJ4LT5SeFByb2Nlc3NJbmRleCsrOworCQlwV2IzNVJ4LT5SeFByb2Nlc3NJbmRleCAlPSBNQVhfVVNCX1JYX0JVRkZFUl9OVU1CRVI7CisKKwkJcFJ4QnVmZmVyQWRkcmVzcyA9IHBXYjM1UngtPnBEUng7CisJCUJ1ZmZlclNpemUgPSBwV2IzNVJ4LT5SeEJ1ZmZlclNpemVbIFJ4QnVmZmVySWQgXTsKKworCQkvLyBQYXJzZSB0aGUgYnVsa2luIGJ1ZmZlcgorCQl3aGlsZSAoQnVmZmVyU2l6ZSA+PSA0KSB7CisJCQlpZiAoKGNwdV90b19sZTMyKCoodTMyICopcFJ4QnVmZmVyQWRkcmVzcykgJiAweDBmZmZmZmZmKSA9PSBSWF9FTkRfVEFHKSAvL0lzIGVuZGluZz8gOTIxMDAyLjkuYQorCQkJCWJyZWFrOworCisJCQkvLyBHZXQgdGhlIFIwMCBSMDEgZmlyc3QKKwkJCVJ4RGVzLlIwMC52YWx1ZSA9IGxlMzJfdG9fY3B1KCoodTMyICopcFJ4QnVmZmVyQWRkcmVzcyk7CisJCQlQYWNrZXRTaXplID0gKHUxNilSeERlcy5SMDAuUjAwX3JlY2VpdmVfYnl0ZV9jb3VudDsKKwkJCVJ4RGVzLlIwMS52YWx1ZSA9IGxlMzJfdG9fY3B1KCooKHUzMiAqKShwUnhCdWZmZXJBZGRyZXNzKzQpKSk7CisJCQkvLyBGb3IgbmV3IERNQSA0aworCQkJaWYgKChQYWNrZXRTaXplICYgMHgwMykgPiAwKQorCQkJCVBhY2tldFNpemUgLT0gNDsKKworCQkJLy8gQmFzaWMgY2hlY2sgZm9yIFJ4IGxlbmd0aC4gSXMgbGVuZ3RoIHZhbGlkPworCQkJaWYgKFBhY2tldFNpemUgPiBNQVhfUEFDS0VUX1NJWkUpIHsKKwkJCQkjaWZkZWYgX1BFX1JYX0RVTVBfCisJCQkJV0JERUJVRygoIlNlcmlvdXMgRVJST1IgOiBSeCBkYXRhIHNpemUgdG9vIGxvbmcsIHNpemUgPSVkXG4iLCBQYWNrZXRTaXplKSk7CisJCQkJI2VuZGlmCisKKwkJCQlwV2IzNVJ4LT5FUDN2bV9zdGF0ZSA9IFZNX1NUT1A7CisJCQkJcFdiMzVSeC0+RXAzRXJyb3JDb3VudDIrKzsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLy8gU3RhcnQgdG8gcHJvY2VzcyBSeCBidWZmZXIKKy8vCQkJUnhEZXMuRGVzY3JpcHRvcl9JRCA9IFJ4QnVmZmVySWQ7IC8vIER1ZSB0byBzeW5jaHJvbm91cyBpbmRpY2F0ZSwgdGhlIGZpZWxkIGRvZXNuJ3QgbmVjZXNzYXJ5IHRvIHVzZS4KKwkJCUJ1ZmZlclNpemUgLT0gODsgLy9zdWJ0cmFjdCA4IGJ5dGUgZm9yIDM1J3MgVVNCIGhlYWRlciBsZW5ndGgKKwkJCXBSeEJ1ZmZlckFkZHJlc3MgKz0gODsKKworCQkJUnhEZXMuYnVmZmVyX2FkZHJlc3NbMF0gPSBwUnhCdWZmZXJBZGRyZXNzOworCQkJUnhEZXMuYnVmZmVyX3NpemVbMF0gPSBQYWNrZXRTaXplOworCQkJUnhEZXMuYnVmZmVyX251bWJlciA9IDE7CisJCQlSeERlcy5idWZmZXJfc3RhcnRfaW5kZXggPSAwOworCQkJUnhEZXMuYnVmZmVyX3RvdGFsX3NpemUgPSBSeERlcy5idWZmZXJfc2l6ZVswXTsKKwkJCVdiMzVSeF9hZGp1c3QoJlJ4RGVzKTsKKworCQkJcGFja2V0X2NhbWUoaHcsIHBSeEJ1ZmZlckFkZHJlc3MsIFBhY2tldFNpemUpOworCisJCQkvLyBNb3ZlIFJ4QnVmZmVyIHBvaW50IHRvIHRoZSBuZXh0CisJCQlzdG1wID0gUGFja2V0U2l6ZSArIDM7CisJCQlzdG1wICY9IH4weDAzOyAvLyA0biBhbGlnbm1lbnQKKwkJCXBSeEJ1ZmZlckFkZHJlc3MgKz0gc3RtcDsKKwkJCUJ1ZmZlclNpemUgLT0gc3RtcDsKKwkJCXN0bXAyICs9IHN0bXA7CisJCX0KKworCQkvLyBSZWNsYWltIHJlc291cmNlCisJCXBXYjM1UngtPlJ4T3duZXJbIFJ4QnVmZmVySWQgXSA9IDE7CisJfSB3aGlsZSAodHJ1ZSk7CisKKwlyZXR1cm4gc3RtcDI7Cit9CisKK3N0YXRpYyB2b2lkIFdiMzVSeChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CisKK3N0YXRpYyB2b2lkIFdiMzVSeF9Db21wbGV0ZShzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSB1cmItPmNvbnRleHQ7CisJc3RydWN0IHdic29mdF9wcml2ICpwcml2ID0gaHctPnByaXY7CisJcGh3X2RhdGFfdCBwSHdEYXRhID0gJnByaXYtPnNId0RhdGE7CisJUFdCMzVSWAkJcFdiMzVSeCA9ICZwSHdEYXRhLT5XYjM1Ung7CisJdTggKgkJcFJ4QnVmZmVyQWRkcmVzczsKKwl1MzIJCVNpemVDaGVjazsKKwl1MTYJCUJ1bGtMZW5ndGg7CisJdTMyCQlSeEJ1ZmZlcklkOworCVIwMF9ERVNDUklQVE9SIAlSMDA7CisKKwkvLyBWYXJpYWJsZSBzZXR0aW5nCisJcFdiMzVSeC0+RVAzdm1fc3RhdGUgPSBWTV9DT01QTEVURUQ7CisJcFdiMzVSeC0+RVAzVk1fc3RhdHVzID0gdXJiLT5zdGF0dXM7Ly9TdG9yZSB0aGUgbGFzdCByZXN1bHQgb2YgSXJwCisKKwlSeEJ1ZmZlcklkID0gcFdiMzVSeC0+Q3VycmVudFJ4QnVmZmVySWQ7CisKKwlwUnhCdWZmZXJBZGRyZXNzID0gcFdiMzVSeC0+cERSeDsKKwlCdWxrTGVuZ3RoID0gKHUxNil1cmItPmFjdHVhbF9sZW5ndGg7CisKKwkvLyBUaGUgSVJQIGlzIGNvbXBsZXRlZAorCXBXYjM1UngtPkVQM3ZtX3N0YXRlID0gVk1fQ09NUExFVEVEOworCisJaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlIHx8IHBId0RhdGEtPkh3U3RvcCkgLy8gTXVzdCBiZSBoZXJlLCBvciBSeEJ1ZmZlcklkIGlzIGludmFsaWQKKwkJZ290byBlcnJvcjsKKworCWlmIChwV2IzNVJ4LT5yeF9oYWx0KQorCQlnb3RvIGVycm9yOworCisJLy8gU3RhcnQgdG8gcHJvY2VzcyB0aGUgZGF0YSBvbmx5IGluIHN1Y2Nlc3NmdWwgY29uZGl0aW9uCisJcFdiMzVSeC0+UnhPd25lclsgUnhCdWZmZXJJZCBdID0gMDsgLy8gU2V0IHRoZSBvd25lciB0byBkcml2ZXIKKwlSMDAudmFsdWUgPSBsZTMyX3RvX2NwdSgqKHUzMiAqKXBSeEJ1ZmZlckFkZHJlc3MpOworCisJLy8gVGhlIFVSQiBpcyBjb21wbGV0ZWQsIGNoZWNrIHRoZSByZXN1bHQKKwlpZiAocFdiMzVSeC0+RVAzVk1fc3RhdHVzICE9IDApIHsKKwkJI2lmZGVmIF9QRV9VU0JfU1RBVEVfRFVNUF8KKwkJV0JERUJVRygoIkVQMyBJb0NvbXBsZXRlUm91dGluZSByZXR1cm4gZXJyb3JcbiIpKTsKKwkJRGVidWdVc2JkU3RhdHVzSW5mb3JtYXRpb24oIHBXYjM1UngtPkVQM1ZNX3N0YXR1cyApOworCQkjZW5kaWYKKwkJcFdiMzVSeC0+RVAzdm1fc3RhdGUgPSBWTV9TVE9QOworCQlnb3RvIGVycm9yOworCX0KKworCS8vIDIwMDYwMjIwIEZvciByZWNvdmVyaW5nLiBjaGVjayBpZiBvcGVyYXRpbmcgaW4gc2luZ2xlIFVTQiBtb2RlCisJaWYgKCFIQUxfVVNCX01PREVfQlVSU1QocEh3RGF0YSkpIHsKKwkJU2l6ZUNoZWNrID0gUjAwLlIwMF9yZWNlaXZlX2J5dGVfY291bnQ7ICAvLzIwMDYwOTI2IGFuc29uJ3MgZW5kaWFuCisJCWlmICgoU2l6ZUNoZWNrICYgMHgwMykgPiAwKQorCQkJU2l6ZUNoZWNrIC09IDQ7CisJCVNpemVDaGVjayA9IChTaXplQ2hlY2sgKyAzKSAmIH4weDAzOworCQlTaXplQ2hlY2sgKz0gMTI7IC8vIDggKyA0IGJhZGJlZWYKKwkJaWYgKChCdWxrTGVuZ3RoID4gMTYwMCkgfHwKKwkJCShTaXplQ2hlY2sgPiAxNjAwKSB8fAorCQkJKEJ1bGtMZW5ndGggIT0gU2l6ZUNoZWNrKSB8fAorCQkJKEJ1bGtMZW5ndGggPT0gMCkpIHsgLy8gQWRkIGZvciBmYWlsIFVyYgorCQkJcFdiMzVSeC0+RVAzdm1fc3RhdGUgPSBWTV9TVE9QOworCQkJcFdiMzVSeC0+RXAzRXJyb3JDb3VudDIrKzsKKwkJfQorCX0KKworCS8vIEluZGljYXRpbmcgdGhlIHJlY2VpdmluZyBkYXRhCisJcFdiMzVSeC0+Qnl0ZVJlY2VpdmVkICs9IEJ1bGtMZW5ndGg7CisJcFdiMzVSeC0+UnhCdWZmZXJTaXplWyBSeEJ1ZmZlcklkIF0gPSBCdWxrTGVuZ3RoOworCisJaWYgKCFwV2IzNVJ4LT5SeE93bmVyWyBSeEJ1ZmZlcklkIF0pCisJCVdiMzVSeF9pbmRpY2F0ZShodyk7CisKKwlrZnJlZShwV2IzNVJ4LT5wRFJ4KTsKKwkvLyBEbyB0aGUgbmV4dCByZWNlaXZlCisJV2IzNVJ4KGh3KTsKKwlyZXR1cm47CisKK2Vycm9yOgorCXBXYjM1UngtPlJ4T3duZXJbIFJ4QnVmZmVySWQgXSA9IDE7IC8vIFNldCB0aGUgb3duZXIgdG8gaGFyZHdhcmUKKwlhdG9taWNfZGVjKCZwV2IzNVJ4LT5SeEZpcmVDb3VudGVyKTsKKwlwV2IzNVJ4LT5FUDN2bV9zdGF0ZSA9IFZNX1NUT1A7Cit9CisKKy8vIFRoaXMgZnVuY3Rpb24gY2Fubm90IHJlZW50cmFpbgorc3RhdGljIHZvaWQgV2IzNVJ4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCB3YnNvZnRfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCXBod19kYXRhX3QgcEh3RGF0YSA9ICZwcml2LT5zSHdEYXRhOworCVBXQjM1UlgJcFdiMzVSeCA9ICZwSHdEYXRhLT5XYjM1Ung7CisJdTggKglwUnhCdWZmZXJBZGRyZXNzOworCXN0cnVjdCB1cmIgKnVyYiA9IHBXYjM1UngtPlJ4VXJiOworCWludAlyZXR2OworCXUzMglSeEJ1ZmZlcklkOworCisJLy8KKwkvLyBJc3N1aW5nIFVSQgorCS8vCisJaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlIHx8IHBId0RhdGEtPkh3U3RvcCkKKwkJZ290byBlcnJvcjsKKworCWlmIChwV2IzNVJ4LT5yeF9oYWx0KQorCQlnb3RvIGVycm9yOworCisJLy8gR2V0IFJ4QnVmZmVyJ3MgSUQKKwlSeEJ1ZmZlcklkID0gcFdiMzVSeC0+UnhCdWZmZXJJZDsKKwlpZiAoIXBXYjM1UngtPlJ4T3duZXJbUnhCdWZmZXJJZF0pIHsKKwkJLy8gSXQncyBpbXBvc3NpYmxlIHRvIHJ1biBoZXJlLgorCQkjaWZkZWYgX1BFX1JYX0RVTVBfCisJCVdCREVCVUcoKCJSeCBkcml2ZXIgZmlmbyB1bmF2YWlsYWJsZVxuIikpOworCQkjZW5kaWYKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvLyBVcGRhdGUgYnVmZmVyIHBvaW50LCB0aGVuIHN0YXJ0IHRvIGJ1bGtpbiB0aGUgZGF0YSBmcm9tIFVTQgorCXBXYjM1UngtPlJ4QnVmZmVySWQrKzsKKwlwV2IzNVJ4LT5SeEJ1ZmZlcklkICU9IE1BWF9VU0JfUlhfQlVGRkVSX05VTUJFUjsKKworCXBXYjM1UngtPkN1cnJlbnRSeEJ1ZmZlcklkID0gUnhCdWZmZXJJZDsKKworCXBXYjM1UngtPnBEUnggPSBremFsbG9jKE1BWF9VU0JfUlhfQlVGRkVSLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXBXYjM1UngtPnBEUngpIHsKKwkJcHJpbnRrKCJ3MzV1bmQ6IFJ4IG1lbW9yeSBhbGxvYyBmYWlsZWRcbiIpOworCQlnb3RvIGVycm9yOworCX0KKwlwUnhCdWZmZXJBZGRyZXNzID0gcFdiMzVSeC0+cERSeDsKKworCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwgcEh3RGF0YS0+V2JVc2IudWRldiwKKwkJCSAgdXNiX3JjdmJ1bGtwaXBlKHBId0RhdGEtPldiVXNiLnVkZXYsIDMpLAorCQkJICBwUnhCdWZmZXJBZGRyZXNzLCBNQVhfVVNCX1JYX0JVRkZFUiwKKwkJCSAgV2IzNVJ4X0NvbXBsZXRlLCBodyk7CisKKwlwV2IzNVJ4LT5FUDN2bV9zdGF0ZSA9IFZNX1JVTk5JTkc7CisKKwlyZXR2ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKworCWlmIChyZXR2ICE9IDApIHsKKwkJcHJpbnRrKCJSeCBVUkIgc2VuZGluZyBlcnJvclxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCXJldHVybjsKKworZXJyb3I6CisJLy8gVk0gc3RvcAorCXBXYjM1UngtPkVQM3ZtX3N0YXRlID0gVk1fU1RPUDsKKwlhdG9taWNfZGVjKCZwV2IzNVJ4LT5SeEZpcmVDb3VudGVyKTsKK30KKwordm9pZCBXYjM1Unhfc3RhcnQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IHdic29mdF9wcml2ICpwcml2ID0gaHctPnByaXY7CisJcGh3X2RhdGFfdCBwSHdEYXRhID0gJnByaXYtPnNId0RhdGE7CisJUFdCMzVSWCBwV2IzNVJ4ID0gJnBId0RhdGEtPldiMzVSeDsKKworCS8vIEFsbG93IG9ubHkgb25lIHRocmVhZCB0byBydW4gaW50byB0aGUgV2IzNVJ4KCkgZnVuY3Rpb24KKwlpZiAoYXRvbWljX2luY19yZXR1cm4oJnBXYjM1UngtPlJ4RmlyZUNvdW50ZXIpID09IDEpIHsKKwkJcFdiMzVSeC0+RVAzdm1fc3RhdGUgPSBWTV9SVU5OSU5HOworCQlXYjM1UngoaHcpOworCX0gZWxzZQorCQlhdG9taWNfZGVjKCZwV2IzNVJ4LT5SeEZpcmVDb3VudGVyKTsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitzdGF0aWMgdm9pZCBXYjM1UnhfcmVzZXRfZGVzY3JpcHRvciggIHBod19kYXRhX3QgcEh3RGF0YSApCit7CisJUFdCMzVSWCBwV2IzNVJ4ID0gJnBId0RhdGEtPldiMzVSeDsKKwl1MzIJaTsKKworCXBXYjM1UngtPkJ5dGVSZWNlaXZlZCA9IDA7CisJcFdiMzVSeC0+UnhQcm9jZXNzSW5kZXggPSAwOworCXBXYjM1UngtPlJ4QnVmZmVySWQgPSAwOworCXBXYjM1UngtPkVQM3ZtX3N0YXRlID0gVk1fU1RPUDsKKwlwV2IzNVJ4LT5yeF9oYWx0ID0gMDsKKworCS8vIEluaXRpYWwgdGhlIFF1ZXVlLiBUaGUgbGFzdCBidWZmZXIgaXMgcmVzZXJ2ZWQgZm9yIHVzZWQgaWYgdGhlIFJ4IHJlc291cmNlIGlzIHVuYXZhaWxhYmxlLgorCWZvciggaT0wOyBpPE1BWF9VU0JfUlhfQlVGRkVSX05VTUJFUjsgaSsrICkKKwkJcFdiMzVSeC0+UnhPd25lcltpXSA9IDE7Cit9CisKK3Vuc2lnbmVkIGNoYXIgV2IzNVJ4X2luaXRpYWwocGh3X2RhdGFfdCBwSHdEYXRhKQoreworCVBXQjM1UlggcFdiMzVSeCA9ICZwSHdEYXRhLT5XYjM1Ung7CisKKwkvLyBJbml0aWFsIHRoZSBCdWZmZXIgUXVldWUKKwlXYjM1UnhfcmVzZXRfZGVzY3JpcHRvciggcEh3RGF0YSApOworCisJcFdiMzVSeC0+UnhVcmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOworCXJldHVybiAoISFwV2IzNVJ4LT5SeFVyYik7Cit9CisKK3ZvaWQgV2IzNVJ4X3N0b3AocGh3X2RhdGFfdCBwSHdEYXRhKQoreworCVBXQjM1UlggcFdiMzVSeCA9ICZwSHdEYXRhLT5XYjM1Ung7CisKKwkvLyBDYW5jZWxpbmcgdGhlIElycCBpZiBhbHJlYWR5IHNlbmRzIGl0IG91dC4KKwlpZiAocFdiMzVSeC0+RVAzdm1fc3RhdGUgPT0gVk1fUlVOTklORykgeworCQl1c2JfdW5saW5rX3VyYiggcFdiMzVSeC0+UnhVcmIgKTsgLy8gT25seSB1c2UgdW5saW5rLCBsZXQgV2IzNVJ4X2Rlc3Ryb3kgdG8gZnJlZSB0aGVtCisJCSNpZmRlZiBfUEVfUlhfRFVNUF8KKwkJV0JERUJVRygoIkVQMyBSeCBzdG9wXG4iKSk7CisJCSNlbmRpZgorCX0KK30KKworLy8gTmVlZHMgcHJvY2VzcyBjb250ZXh0Cit2b2lkIFdiMzVSeF9kZXN0cm95KHBod19kYXRhX3QgcEh3RGF0YSkKK3sKKwlQV0IzNVJYIHBXYjM1UnggPSAmcEh3RGF0YS0+V2IzNVJ4OworCisJZG8geworCQltc2xlZXAoMTApOyAvLyBEZWxheSBmb3Igd2FpdGluZyBmdW5jdGlvbiBlbnRlciA5NDA2MjMuMS5hCisJfSB3aGlsZSAocFdiMzVSeC0+RVAzdm1fc3RhdGUgIT0gVk1fU1RPUCk7CisJbXNsZWVwKDEwKTsgLy8gRGVsYXkgZm9yIHdhaXRpbmcgZnVuY3Rpb24gZXhpdCA5NDA2MjMuMS5iCisKKwlpZiAocFdiMzVSeC0+UnhVcmIpCisJCXVzYl9mcmVlX3VyYiggcFdiMzVSeC0+UnhVcmIgKTsKKwkjaWZkZWYgX1BFX1JYX0RVTVBfCisJV0JERUJVRygoIldiMzVSeF9kZXN0cm95IE9LXG4iKSk7CisJI2VuZGlmCit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyeF9mLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cnhfZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5OTMwNDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cnhfZi5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgX19XSU5CT05EX1dCMzVSWF9GX0gKKyNkZWZpbmUgX19XSU5CT05EX1dCMzVSWF9GX0gKKworI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgorI2luY2x1ZGUgIndiaGFsX3MuaCIKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEludGVyZmFjZSBmdW5jdGlvbiBkZWNsYXJlCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQordW5zaWduZWQgY2hhcgkJV2IzNVJ4X2luaXRpYWwoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKK3ZvaWQJCVdiMzVSeF9kZXN0cm95KCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Cit2b2lkCQlXYjM1Unhfc3RvcCggIHBod19kYXRhX3QgcEh3RGF0YSApOwordm9pZAkJV2IzNVJ4X3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cnhfcy5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJ4X3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTgzNTBiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJ4X3MuaApAQCAtMCwwICsxLDQ4IEBACisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIHdiMzVyeC5oIC0tCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gRGVmaW5pdGlvbiBmb3IgdGhpcyBtb2R1bGUgdXNlZAorI2RlZmluZSBNQVhfVVNCX1JYX0JVRkZFUgk0MDk2CS8vIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgNDA5NiA5MzExMzAuNC5mCisKKyNkZWZpbmUgTUFYX1VTQl9SWF9CVUZGRVJfTlVNQkVSCUVUSEVSTkVUX1JYX0RFU0NSSVBUT1JTCQkvLyBNYXhpbXVtIDI1NCwgMjU1IGlzIFJFU0VSVkVEIElECisjZGVmaW5lIFJYX0lOVEVSRkFDRQkJCQkwCS8vIEludGVyZmFjZSAxCisjZGVmaW5lIFJYX1BJUEUJCQkJCQkyCS8vIFBpcGUgMworI2RlZmluZSBNQVhfUEFDS0VUX1NJWkUJCQkJMTYwMCAvLzE1NjgJLy8gOCArIDE1MzIgKyA0ICsgMjQoSVYgRUlWIE1JQyBJQ1YgQ1JDKSBmb3IgY2hlY2sgRE1BIGRhdGEgOTMxMTMwLjQuZworI2RlZmluZSBSWF9FTkRfVEFHCQkJCQkweDBiYWRiZWVmCisKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEludGVybmFsIHZhcmlhYmxlIGZvciBtb2R1bGUKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit0eXBlZGVmIHN0cnVjdCBfV0IzNVJYCit7CisJdTMyCQkJQnl0ZVJlY2VpdmVkOy8vIEZvciBjYWxjdWxhdGluZyB0aHJvdWdocHV0IG9mIEJ1bGtJbgorCWF0b21pY190CQlSeEZpcmVDb3VudGVyOy8vIERvZXMgV2IzNVJ4IG1vZHVsZSBmaXJlPworCisJdTgJUnhCdWZmZXJbIE1BWF9VU0JfUlhfQlVGRkVSX05VTUJFUiBdWyAoKE1BWF9VU0JfUlhfQlVGRkVSKzMpICYgfjB4MDMgKSBdOworCXUxNglSeEJ1ZmZlclNpemVbICgoTUFYX1VTQl9SWF9CVUZGRVJfTlVNQkVSKzEpICYgfjB4MDEpIF07CisJdTgJUnhPd25lclsgKChNQVhfVVNCX1JYX0JVRkZFUl9OVU1CRVIrMykgJiB+MHgwMyApIF07Ly9Pd25lcnNoaXAgb2YgYnVmZmVyICAwOiBTVyAxOkhXCisKKwl1MzIJUnhQcm9jZXNzSW5kZXg7Ly9UaGUgbmV4dCBpbmRleCB0byBwcm9jZXNzCisJdTMyCVJ4QnVmZmVySWQ7CisJdTMyCUVQM3ZtX3N0YXRlOworCisJdTMyCXJ4X2hhbHQ7IC8vIEZvciBWTSBzdG9wcGluZworCisJdTE2CU1vcmVEYXRhU2l6ZTsKKwl1MTYJUGFja2V0U2l6ZTsKKworCXUzMglDdXJyZW50UnhCdWZmZXJJZDsgLy8gRm9yIGNvbXBsZXRlIHJvdXRpbmUgdXNhZ2UKKwl1MzIJUngzVXJiQ2FuY2VsOworCisJdTMyCUxhc3RSMTsgLy8gRm9yIFJTU0kgcmVwb3J0aW5nCisJc3RydWN0IHVyYiAqCQkJCVJ4VXJiOworCXUzMgkJRXAzRXJyb3JDb3VudDI7IC8vIDIwMDYwNjI1LjEgVXNiZCBmb3IgUnggRE1BIGVycm9yIGNvdW50CisKKwlpbnQJCUVQM1ZNX3N0YXR1czsKKwl1OCAqCXBEUng7CisKK30gV0IzNVJYLCAqUFdCMzVSWDsKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1dHguYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzV0eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YjQ0NTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1dHguYwpAQCAtMCwwICsxLDMwNSBAQAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgQ29weXJpZ2h0IChjKSAxOTk2LTIwMDIgV2luYm9uZCBFbGVjdHJvbmljIENvcnBvcmF0aW9uCisvLworLy8gIE1vZHVsZSBOYW1lOgorLy8gICAgV2IzNVR4LmMKKy8vCisvLyAgQWJzdHJhY3Q6CisvLyAgICBQcm9jZXNzaW5nIHRoZSBUeCBtZXNzYWdlIGFuZCBwdXQgaW50byBkb3duIGxheWVyCisvLworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisKKyNpbmNsdWRlICJ3YjM1dHhfZi5oIgorI2luY2x1ZGUgIm1kc19mLmgiCisjaW5jbHVkZSAic3lzZGVmLmgiCisKK3Vuc2lnbmVkIGNoYXIKK1diMzVUeF9nZXRfdHhfYnVmZmVyKHBod19kYXRhX3QgcEh3RGF0YSwgdTggKipwQnVmZmVyKQoreworCVBXQjM1VFggcFdiMzVUeCA9ICZwSHdEYXRhLT5XYjM1VHg7CisKKwkqcEJ1ZmZlciA9IHBXYjM1VHgtPlR4QnVmZmVyWzBdOworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBXYjM1VHgoc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyKTsKKworc3RhdGljIHZvaWQgV2IzNVR4X2NvbXBsZXRlKHN0cnVjdCB1cmIgKiBwVXJiKQoreworCXN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciA9IHBVcmItPmNvbnRleHQ7CisJcGh3X2RhdGFfdAlwSHdEYXRhID0gJmFkYXB0ZXItPnNId0RhdGE7CisJUFdCMzVUWAkJcFdiMzVUeCA9ICZwSHdEYXRhLT5XYjM1VHg7CisJUE1EUwkJcE1kcyA9ICZhZGFwdGVyLT5NZHM7CisKKwlwcmludGsoIndiMzU6IHR4IGNvbXBsZXRlXG4iKTsKKwkvLyBWYXJpYWJsZSBzZXR0aW5nCisJcFdiMzVUeC0+RVA0dm1fc3RhdGUgPSBWTV9DT01QTEVURUQ7CisJcFdiMzVUeC0+RVA0Vk1fc3RhdHVzID0gcFVyYi0+c3RhdHVzOyAvL1N0b3JlIHRoZSBsYXN0IHJlc3VsdCBvZiBJcnAKKwlwTWRzLT5UeE93bmVyWyBwV2IzNVR4LT5UeFNlbmRJbmRleCBdID0gMDsvLyBTZXQgdGhlIG93bmVyLiBGcmVlIHRoZSBvd25lciBiaXQgYWx3YXlzLgorCXBXYjM1VHgtPlR4U2VuZEluZGV4Kys7CisJcFdiMzVUeC0+VHhTZW5kSW5kZXggJT0gTUFYX1VTQl9UWF9CVUZGRVJfTlVNQkVSOworCisJaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlIHx8IHBId0RhdGEtPkh3U3RvcCkgLy8gTGV0IFdiV2xhbkhhbHQgdG8gaGFuZGxlIHN1cnByaXNlIHJlbW92ZQorCQlnb3RvIGVycm9yOworCisJaWYgKHBXYjM1VHgtPnR4X2hhbHQpCisJCWdvdG8gZXJyb3I7CisKKwkvLyBUaGUgVVJCIGlzIGNvbXBsZXRlZCwgY2hlY2sgdGhlIHJlc3VsdAorCWlmIChwV2IzNVR4LT5FUDRWTV9zdGF0dXMgIT0gMCkgeworCQlwcmludGsoIlVSQiBzdWJtaXNzaW9uIGZhaWxlZFxuIik7CisJCXBXYjM1VHgtPkVQNHZtX3N0YXRlID0gVk1fU1RPUDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlNZHNfVHgoYWRhcHRlcik7CisJV2IzNVR4KGFkYXB0ZXIpOworCXJldHVybjsKKworZXJyb3I6CisJYXRvbWljX2RlYygmcFdiMzVUeC0+VHhGaXJlQ291bnRlcik7CisJcFdiMzVUeC0+RVA0dm1fc3RhdGUgPSBWTV9TVE9QOworfQorCitzdGF0aWMgdm9pZCBXYjM1VHgoc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyKQoreworCXBod19kYXRhX3QJcEh3RGF0YSA9ICZhZGFwdGVyLT5zSHdEYXRhOworCVBXQjM1VFgJCXBXYjM1VHggPSAmcEh3RGF0YS0+V2IzNVR4OworCXU4CQkqcFR4QnVmZmVyQWRkcmVzczsKKwlQTURTCQlwTWRzID0gJmFkYXB0ZXItPk1kczsKKwlzdHJ1Y3QgdXJiICoJcFVyYiA9IChzdHJ1Y3QgdXJiICopcFdiMzVUeC0+VHg0VXJiOworCWludCAgICAgICAgIAlyZXR2OworCXUzMgkJU2VuZEluZGV4OworCisKKwlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgfHwgcEh3RGF0YS0+SHdTdG9wKQorCQlnb3RvIGNsZWFudXA7CisKKwlpZiAocFdiMzVUeC0+dHhfaGFsdCkKKwkJZ290byBjbGVhbnVwOworCisJLy8gT3duZXJzaGlwIGNoZWNraW5nCisJU2VuZEluZGV4ID0gcFdiMzVUeC0+VHhTZW5kSW5kZXg7CisJaWYgKCFwTWRzLT5UeE93bmVyW1NlbmRJbmRleF0pIC8vTm8gbW9yZSBkYXRhIG5lZWQgdG8gYmUgc2VudCwgcmV0dXJuIGltbWVkaWF0ZWx5CisJCWdvdG8gY2xlYW51cDsKKworCXBUeEJ1ZmZlckFkZHJlc3MgPSBwV2IzNVR4LT5UeEJ1ZmZlcltTZW5kSW5kZXhdOworCS8vCisJLy8gSXNzdWluZyBVUkIKKwkvLworCXVzYl9maWxsX2J1bGtfdXJiKHBVcmIsIHBId0RhdGEtPldiVXNiLnVkZXYsCisJCQkgIHVzYl9zbmRidWxrcGlwZShwSHdEYXRhLT5XYlVzYi51ZGV2LCA0KSwKKwkJCSAgcFR4QnVmZmVyQWRkcmVzcywgcE1kcy0+VHhCdWZmZXJTaXplWyBTZW5kSW5kZXggXSwKKwkJCSAgV2IzNVR4X2NvbXBsZXRlLCBhZGFwdGVyKTsKKworCXBXYjM1VHgtPkVQNHZtX3N0YXRlID0gVk1fUlVOTklORzsKKwlyZXR2ID0gdXNiX3N1Ym1pdF91cmIocFVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKHJldHY8MCkgeworCQlwcmludGsoIkVQNCBUeCBJcnAgc2VuZGluZyBlcnJvclxuIik7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvLyBDaGVjayBpZiBkcml2ZXIgbmVlZHMgaXNzdWUgSXJwIGZvciBFUDIKKwlwV2IzNVR4LT5UeEZpbGxDb3VudCArPSBwTWRzLT5UeENvdW50SW5CdWZmZXJbU2VuZEluZGV4XTsKKwlpZiAocFdiMzVUeC0+VHhGaWxsQ291bnQgPiAxMikKKwkJV2IzNVR4X0VQMlZNX3N0YXJ0KGFkYXB0ZXIpOworCisJcFdiMzVUeC0+Qnl0ZVRyYW5zZmVyICs9IHBNZHMtPlR4QnVmZmVyU2l6ZVtTZW5kSW5kZXhdOworCXJldHVybjsKKworIGNsZWFudXA6CisJcFdiMzVUeC0+RVA0dm1fc3RhdGUgPSBWTV9TVE9QOworCWF0b21pY19kZWMoJnBXYjM1VHgtPlR4RmlyZUNvdW50ZXIpOworfQorCit2b2lkIFdiMzVUeF9zdGFydChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIpCit7CisJcGh3X2RhdGFfdCBwSHdEYXRhID0gJmFkYXB0ZXItPnNId0RhdGE7CisJUFdCMzVUWCBwV2IzNVR4ID0gJnBId0RhdGEtPldiMzVUeDsKKworCS8vIEFsbG93IG9ubHkgb25lIHRocmVhZCB0byBydW4gaW50byBmdW5jdGlvbgorCWlmIChhdG9taWNfaW5jX3JldHVybigmcFdiMzVUeC0+VHhGaXJlQ291bnRlcikgPT0gMSkgeworCQlwV2IzNVR4LT5FUDR2bV9zdGF0ZSA9IFZNX1JVTk5JTkc7CisJCVdiMzVUeChhZGFwdGVyKTsKKwl9IGVsc2UKKwkJYXRvbWljX2RlYygmcFdiMzVUeC0+VHhGaXJlQ291bnRlcik7Cit9CisKK3Vuc2lnbmVkIGNoYXIgV2IzNVR4X2luaXRpYWwocGh3X2RhdGFfdCBwSHdEYXRhKQoreworCVBXQjM1VFggcFdiMzVUeCA9ICZwSHdEYXRhLT5XYjM1VHg7CisKKwlwV2IzNVR4LT5UeDRVcmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOworCWlmICghcFdiMzVUeC0+VHg0VXJiKQorCQlyZXR1cm4gZmFsc2U7CisKKwlwV2IzNVR4LT5UeDJVcmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOworCWlmICghcFdiMzVUeC0+VHgyVXJiKQorCXsKKwkJdXNiX2ZyZWVfdXJiKCBwV2IzNVR4LT5UeDRVcmIgKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQordm9pZCBXYjM1VHhfc3RvcChwaHdfZGF0YV90IHBId0RhdGEpCit7CisJUFdCMzVUWCBwV2IzNVR4ID0gJnBId0RhdGEtPldiMzVUeDsKKworCS8vIFRyeWluZyB0byBjYW5jZWxpbmcgdGhlIFRycCBvZiBFUDIKKwlpZiAocFdiMzVUeC0+RVAydm1fc3RhdGUgPT0gVk1fUlVOTklORykKKwkJdXNiX3VubGlua191cmIoIHBXYjM1VHgtPlR4MlVyYiApOyAvLyBPbmx5IHVzZSB1bmxpbmssIGxldCBXYjM1VHhfZGVzdHJvdCB0byBmcmVlIHRoZW0KKwkjaWZkZWYgX1BFX1RYX0RVTVBfCisJV0JERUJVRygoIkVQMiBUeCBzdG9wXG4iKSk7CisJI2VuZGlmCisKKwkvLyBUcnlpbmcgdG8gY2FuY2VsaW5nIHRoZSBJcnAgb2YgRVA0CisJaWYgKHBXYjM1VHgtPkVQNHZtX3N0YXRlID09IFZNX1JVTk5JTkcpCisJCXVzYl91bmxpbmtfdXJiKCBwV2IzNVR4LT5UeDRVcmIgKTsgLy8gT25seSB1c2UgdW5saW5rLCBsZXQgV2IzNVR4X2Rlc3Ryb3QgdG8gZnJlZSB0aGVtCisJI2lmZGVmIF9QRV9UWF9EVU1QXworCVdCREVCVUcoKCJFUDQgVHggc3RvcFxuIikpOworCSNlbmRpZgorfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQordm9pZCBXYjM1VHhfZGVzdHJveShwaHdfZGF0YV90IHBId0RhdGEpCit7CisJUFdCMzVUWCBwV2IzNVR4ID0gJnBId0RhdGEtPldiMzVUeDsKKworCS8vIFdhaXQgZm9yIFZNIHN0b3AKKwlkbyB7CisJCW1zbGVlcCgxMCk7ICAvLyBEZWxheSBmb3Igd2FpdGluZyBmdW5jdGlvbiBlbnRlciA5NDA2MjMuMS5hCisJfSB3aGlsZSggKHBXYjM1VHgtPkVQMnZtX3N0YXRlICE9IFZNX1NUT1ApICYmIChwV2IzNVR4LT5FUDR2bV9zdGF0ZSAhPSBWTV9TVE9QKSApOworCW1zbGVlcCgxMCk7ICAvLyBEZWxheSBmb3Igd2FpdGluZyBmdW5jdGlvbiBlbnRlciA5NDA2MjMuMS5iCisKKwlpZiAocFdiMzVUeC0+VHg0VXJiKQorCQl1c2JfZnJlZV91cmIoIHBXYjM1VHgtPlR4NFVyYiApOworCisJaWYgKHBXYjM1VHgtPlR4MlVyYikKKwkJdXNiX2ZyZWVfdXJiKCBwV2IzNVR4LT5UeDJVcmIgKTsKKworCSNpZmRlZiBfUEVfVFhfRFVNUF8KKwlXQkRFQlVHKCgiV2IzNVR4X2Rlc3Ryb3kgT0tcbiIpKTsKKwkjZW5kaWYKK30KKwordm9pZCBXYjM1VHhfQ3VycmVudFRpbWUoc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyLCB1MzIgVGltZUNvdW50KQoreworCXBod19kYXRhX3QgcEh3RGF0YSA9ICZhZGFwdGVyLT5zSHdEYXRhOworCVBXQjM1VFggcFdiMzVUeCA9ICZwSHdEYXRhLT5XYjM1VHg7CisJdW5zaWduZWQgY2hhciBUcmlnZ2VyID0gZmFsc2U7CisKKwlpZiAocFdiMzVUeC0+VHhUaW1lciA+IFRpbWVDb3VudCkKKwkJVHJpZ2dlciA9IHRydWU7CisJZWxzZSBpZiAoVGltZUNvdW50ID4gKHBXYjM1VHgtPlR4VGltZXIrNTAwKSkKKwkJVHJpZ2dlciA9IHRydWU7CisKKwlpZiAoVHJpZ2dlcikgeworCQlwV2IzNVR4LT5UeFRpbWVyID0gVGltZUNvdW50OworCQlXYjM1VHhfRVAyVk1fc3RhcnQoYWRhcHRlcik7CisJfQorfQorCitzdGF0aWMgdm9pZCBXYjM1VHhfRVAyVk0oc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyKTsKKworc3RhdGljIHZvaWQgV2IzNVR4X0VQMlZNX2NvbXBsZXRlKHN0cnVjdCB1cmIgKiBwVXJiKQoreworCXN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciA9IHBVcmItPmNvbnRleHQ7CisJcGh3X2RhdGFfdAlwSHdEYXRhID0gJmFkYXB0ZXItPnNId0RhdGE7CisJVDAyX0RFU0NSSVBUT1IJVDAyLCBUU1RBVFVTOworCVBXQjM1VFgJCXBXYjM1VHggPSAmcEh3RGF0YS0+V2IzNVR4OworCXUzMiAqCQlwbHRtcCA9ICh1MzIgKilwV2IzNVR4LT5FUDJfYnVmOworCXUzMgkJaTsKKwl1MTYJCUludGVycnVwdEluTGVuZ3RoOworCisKKwkvLyBWYXJpYWJsZSBzZXR0aW5nCisJcFdiMzVUeC0+RVAydm1fc3RhdGUgPSBWTV9DT01QTEVURUQ7CisJcFdiMzVUeC0+RVAyVk1fc3RhdHVzID0gcFVyYi0+c3RhdHVzOworCisJLy8gRm9yIExpbnV4IDIuNC4gSW50ZXJydXB0IHdpbGwgYWx3YXlzIHRyaWdnZXIKKwlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgfHwgcEh3RGF0YS0+SHdTdG9wKSAvLyBMZXQgV2JXbGFuSGFsdCB0byBoYW5kbGUgc3VycHJpc2UgcmVtb3ZlCisJCWdvdG8gZXJyb3I7CisKKwlpZiAocFdiMzVUeC0+dHhfaGFsdCkKKwkJZ290byBlcnJvcjsKKworCS8vVGhlIFVyYiBpcyBjb21wbGV0ZWQsIGNoZWNrIHRoZSByZXN1bHQKKwlpZiAocFdiMzVUeC0+RVAyVk1fc3RhdHVzICE9IDApIHsKKwkJV0JERUJVRygoIkVQMiBJb0NvbXBsZXRlUm91dGluZSByZXR1cm4gZXJyb3JcbiIpKTsKKwkJcFdiMzVUeC0+RVAydm1fc3RhdGU9IFZNX1NUT1A7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLy8gVXBkYXRlIHRoZSBUeCByZXN1bHQKKwlJbnRlcnJ1cHRJbkxlbmd0aCA9IHBVcmItPmFjdHVhbF9sZW5ndGg7CisJLy8gTW9kaWZ5IGZvciBtaW5pbXVtIG1lbW9yeSBhY2Nlc3MgYW5kIERXT1JEIGFsaWdubWVudC4KKwlUMDIudmFsdWUgPSBjcHVfdG9fbGUzMihwbHRtcFswXSkgPj4gODsgLy8gWzMxOjhdIC0+IFsyNDowXQorCUludGVycnVwdEluTGVuZ3RoIC09IDE7Ly8gMjAwNTEyMjEuMS5jIE1vZGlmeSB0aGUgZm9sbG93IGZvciBtb3JlIHN0YWJsZQorCUludGVycnVwdEluTGVuZ3RoID4+PSAyOyAvLyBJbnRlcnJ1cHRJbkxlbmd0aC80CisJZm9yIChpID0gMTsgaSA8PSBJbnRlcnJ1cHRJbkxlbmd0aDsgaSsrKSB7CisJCVQwMi52YWx1ZSB8PSAoKGNwdV90b19sZTMyKHBsdG1wW2ldKSAmIDB4ZmYpIDw8IDI0KTsKKworCQlUU1RBVFVTLnZhbHVlID0gVDAyLnZhbHVlOyAgLy8yMDA2MTAwOSBhbnNvbidzIGVuZGlhbgorCQlNZHNfU2VuZENvbXBsZXRlKCBhZGFwdGVyLCAmVFNUQVRVUyApOworCQlUMDIudmFsdWUgPSBjcHVfdG9fbGUzMihwbHRtcFtpXSkgPj4gODsKKwl9CisKKwlyZXR1cm47CitlcnJvcjoKKwlhdG9taWNfZGVjKCZwV2IzNVR4LT5UeFJlc3VsdENvdW50KTsKKwlwV2IzNVR4LT5FUDJ2bV9zdGF0ZSA9IFZNX1NUT1A7Cit9CisKK3N0YXRpYyB2b2lkIFdiMzVUeF9FUDJWTShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIpCit7CisJcGh3X2RhdGFfdAlwSHdEYXRhID0gJmFkYXB0ZXItPnNId0RhdGE7CisJUFdCMzVUWCBwV2IzNVR4ID0gJnBId0RhdGEtPldiMzVUeDsKKwlzdHJ1Y3QgdXJiICoJcFVyYiA9IChzdHJ1Y3QgdXJiICopcFdiMzVUeC0+VHgyVXJiOworCXUzMiAqCXBsdG1wID0gKHUzMiAqKXBXYjM1VHgtPkVQMl9idWY7CisJaW50CQlyZXR2OworCisJaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlIHx8IHBId0RhdGEtPkh3U3RvcCkKKwkJZ290byBlcnJvcjsKKworCWlmIChwV2IzNVR4LT50eF9oYWx0KQorCQlnb3RvIGVycm9yOworCisJLy8KKwkvLyBJc3N1aW5nIFVSQgorCS8vCisJdXNiX2ZpbGxfaW50X3VyYiggcFVyYiwgcEh3RGF0YS0+V2JVc2IudWRldiwgdXNiX3JjdmludHBpcGUocEh3RGF0YS0+V2JVc2IudWRldiwyKSwKKwkJCSAgcGx0bXAsIE1BWF9JTlRFUlJVUFRfTEVOR1RILCBXYjM1VHhfRVAyVk1fY29tcGxldGUsIGFkYXB0ZXIsIDMyKTsKKworCXBXYjM1VHgtPkVQMnZtX3N0YXRlID0gVk1fUlVOTklORzsKKwlyZXR2ID0gdXNiX3N1Ym1pdF91cmIocFVyYiwgR0ZQX0FUT01JQyk7CisKKwlpZiAocmV0diA8IDApIHsKKwkJI2lmZGVmIF9QRV9UWF9EVU1QXworCQlXQkRFQlVHKCgiRVAyIFR4IElycCBzZW5kaW5nIGVycm9yXG4iKSk7CisJCSNlbmRpZgorCQlnb3RvIGVycm9yOworCX0KKworCXJldHVybjsKK2Vycm9yOgorCXBXYjM1VHgtPkVQMnZtX3N0YXRlID0gVk1fU1RPUDsKKwlhdG9taWNfZGVjKCZwV2IzNVR4LT5UeFJlc3VsdENvdW50KTsKK30KKwordm9pZCBXYjM1VHhfRVAyVk1fc3RhcnQoc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyKQoreworCXBod19kYXRhX3QgcEh3RGF0YSA9ICZhZGFwdGVyLT5zSHdEYXRhOworCVBXQjM1VFggcFdiMzVUeCA9ICZwSHdEYXRhLT5XYjM1VHg7CisKKwkvLyBBbGxvdyBvbmx5IG9uZSB0aHJlYWQgdG8gcnVuIGludG8gZnVuY3Rpb24KKwlpZiAoYXRvbWljX2luY19yZXR1cm4oJnBXYjM1VHgtPlR4UmVzdWx0Q291bnQpID09IDEpIHsKKwkJcFdiMzVUeC0+RVAydm1fc3RhdGUgPSBWTV9SVU5OSU5HOworCQlXYjM1VHhfRVAyVk0oYWRhcHRlcik7CisJfQorCWVsc2UKKwkJYXRvbWljX2RlYygmcFdiMzVUeC0+VHhSZXN1bHRDb3VudCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1dHhfZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXR4X2YuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjIyZmE4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXR4X2YuaApAQCAtMCwwICsxLDIxIEBACisjaWZuZGVmIF9fV0lOQk9ORF9XQjM1VFhfRl9ICisjZGVmaW5lIF9fV0lOQk9ORF9XQjM1VFhfRl9ICisKKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAid2JoYWxfZi5oIgorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gSW50ZXJmYWNlIGZ1bmN0aW9uIGRlY2xhcmUKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit1bnNpZ25lZCBjaGFyIFdiMzVUeF9pbml0aWFsKAkgcGh3X2RhdGFfdCBwSHdEYXRhICk7Cit2b2lkIFdiMzVUeF9kZXN0cm95KCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7Cit1bnNpZ25lZCBjaGFyIFdiMzVUeF9nZXRfdHhfYnVmZmVyKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggKipwQnVmZmVyICk7CisKK3ZvaWQgV2IzNVR4X0VQMlZNX3N0YXJ0KHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlcik7CisKK3ZvaWQgV2IzNVR4X3N0YXJ0KHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlcik7Cit2b2lkIFdiMzVUeF9zdG9wKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7CisKK3ZvaWQgV2IzNVR4X0N1cnJlbnRUaW1lKHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciwgIHUzMiBUaW1lQ291bnQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzV0eF9zLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1dHhfcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NjAyNzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1dHhfcy5oCkBAIC0wLDAgKzEsNDkgQEAKKyNpZm5kZWYgX19XSU5CT05EX1dCMzVfVFhfU19ICisjZGVmaW5lIF9fV0lOQk9ORF9XQjM1X1RYX1NfSAorCisjaW5jbHVkZSAibWRzX3MuaCIKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIElTODlDMzUgVHggcmVsYXRlZCBkZWZpbml0aW9uCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2RlZmluZSBUWF9JTlRFUkZBQ0UJCQkwCS8vIEludGVyZmFjZSAxCisjZGVmaW5lIFRYX1BJUEUJCQkJCTMJLy8gZW5kcG9pbnQgNAorI2RlZmluZSBUWF9JTlRFUlJVUFQJCQkxCS8vIGVuZHBvaW50IDIKKyNkZWZpbmUgTUFYX0lOVEVSUlVQVF9MRU5HVEgJNjQJLy8gSXQgbXVzdCBiZSA2NCBmb3IgRVAyIGhhcmR3YXJlCisKKworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gSW50ZXJuYWwgdmFyaWFibGUgZm9yIG1vZHVsZQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCit0eXBlZGVmIHN0cnVjdCBfV0IzNVRYCit7CisJLy8gRm9yIFR4IGJ1ZmZlcgorCXU4CVR4QnVmZmVyWyBNQVhfVVNCX1RYX0JVRkZFUl9OVU1CRVIgXVsgTUFYX1VTQl9UWF9CVUZGRVIgXTsKKworCS8vIEZvciBJbnRlcnJ1cHQgcGlwZQorCXU4CUVQMl9idWZbTUFYX0lOVEVSUlVQVF9MRU5HVEhdOworCisJYXRvbWljX3QJVHhSZXN1bHRDb3VudDsvLyBGb3IgdGhyZWFkIGNvbnRyb2wgb2YgRVAyIDkzMTEzMC40Lm0KKwlhdG9taWNfdAlUeEZpcmVDb3VudGVyOy8vIEZvciB0aHJlYWQgY29udHJvbCBvZiBFUDQgOTMxMTMwLjQubgorCXUzMgkJCUJ5dGVUcmFuc2ZlcjsKKworCXUzMgkgICAgVHhTZW5kSW5kZXg7Ly8gVGhlIG5leHQgaW5kZXggb2YgTWRzIGFycmF5IHRvIGJlIHNlbnQKKwl1MzIJICAgIEVQMnZtX3N0YXRlOyAvLyBmb3IgRVAydm0gc3RhdGUKKwl1MzIJICAgIEVQNHZtX3N0YXRlOyAvLyBmb3IgRVA0dm0gc3RhdGUKKwl1MzIJICAgIHR4X2hhbHQ7IC8vIFN0b3BwaW5nIFZNCisKKwlzdHJ1Y3QgdXJiICoJCQkJVHg0VXJiOworCXN0cnVjdCB1cmIgKgkJCQlUeDJVcmI7CisKKwlpbnQJCUVQMlZNX3N0YXR1czsKKwlpbnQJCUVQNFZNX3N0YXR1czsKKworCXUzMglUeEZpbGxDb3VudDsgLy8gMjAwNjA5MjgKKwl1MzIJVHhUaW1lcjsgLy8gMjAwNjA5MjggQWRkIGlmIHNlbmRpbmcgcGFja2V0IG5vdCBncmVhdCB0aGFuIDEzCisKK30gV0IzNVRYLCAqUFdCMzVUWDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmhhbC5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JoYWwuYwppbmRleCA1ZDY4ZWNlLi44YTlkMjFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmhhbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diaGFsLmMKQEAgLTEsMTEgKzEsNiBAQAogI2luY2x1ZGUgIm9zX2NvbW1vbi5oIgotCi12b2lkIGhhbF9nZXRfZXRoZXJuZXRfYWRkcmVzcyggcGh3X2RhdGFfdCBwSHdEYXRhLCB1OCAqY3VycmVudF9hZGRyZXNzICkKLXsKLQlpZiggcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgKSByZXR1cm47Ci0KLQltZW1jcHkoIGN1cnJlbnRfYWRkcmVzcywgcEh3RGF0YS0+Q3VycmVudE1hY0FkZHJlc3MsIEVUSF9MRU5HVEhfT0ZfQUREUkVTUyApOwotfQorI2luY2x1ZGUgIndiaGFsX2YuaCIKKyNpbmNsdWRlICJ3YmxpbnV4X2YuaCIKIAogdm9pZCBoYWxfc2V0X2V0aGVybmV0X2FkZHJlc3MoIHBod19kYXRhX3QgcEh3RGF0YSwgdTggKmN1cnJlbnRfYWRkcmVzcyApCiB7CkBAIC0yOCw0MjMgKzIzLDExIEBACiAJbWVtY3B5KCBwZXRoZXJuZXRfYWRkcmVzcywgcEh3RGF0YS0+UGVybWFuZW50TWFjQWRkcmVzcywgNiApOwogfQogCi11OCBoYWxfaW5pdF9oYXJkd2FyZShwaHdfZGF0YV90IHBId0RhdGEsIFBXQjMyX0FEQVBURVIgQWRhcHRlcikKK3N0YXRpYyB2b2lkIGhhbF9sZWRfY29udHJvbCh1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0JdTE2IFNvZnR3YXJlU2V0OwotCXBId0RhdGEtPkFkYXB0ZXIgPSBBZGFwdGVyOwotCi0JLy8gSW5pdGlhbCB0aGUgdmFyaWFibGUKLQlwSHdEYXRhLT5NYXhSZWNlaXZlTGlmZVRpbWUgPSBERUZBVUxUX01TRFVfTElGRV9USU1FOyAvLyBTZXR0aW5nIFJ4IG1heGltdW0gTVNEVSBsaWZlIHRpbWUKLQlwSHdEYXRhLT5GcmFnbWVudFRocmVzaG9sZCA9IERFRkFVTFRfRlJBR01FTlRfVEhSRVNIT0xEOyAvLyBTZXR0aW5nIGRlZmF1bHQgZnJhZ21lbnQgdGhyZXNob2xkCi0KLQlpZiAoV2JVc2JfaW5pdGlhbChwSHdEYXRhKSkgewotCQlwSHdEYXRhLT5Jbml0aWFsUmVzb3VyY2UgPSAxOwotCQlpZiggV2IzNVJlZ19pbml0aWFsKHBId0RhdGEpKSB7Ci0JCQlwSHdEYXRhLT5Jbml0aWFsUmVzb3VyY2UgPSAyOwotCQkJaWYgKFdiMzVUeF9pbml0aWFsKHBId0RhdGEpKSB7Ci0JCQkJcEh3RGF0YS0+SW5pdGlhbFJlc291cmNlID0gMzsKLQkJCQlpZiAoV2IzNVJ4X2luaXRpYWwocEh3RGF0YSkpIHsKLQkJCQkJcEh3RGF0YS0+SW5pdGlhbFJlc291cmNlID0gNDsKLQkJCQkJT1NfVElNRVJfSU5JVElBTCggJnBId0RhdGEtPkxFRFRpbWVyLCBoYWxfbGVkX2NvbnRyb2wsIHBId0RhdGEgKTsKLQkJCQkJT1NfVElNRVJfU0VUKCAmcEh3RGF0YS0+TEVEVGltZXIsIDEwMDAgKTsgLy8gMjAwNjA2MjMKLQotCQkJCQkvLwotCQkJCQkvLyBGb3IgcmVzdHJpY3QgdG8gdmVuZG9yJ3MgaGFyZHdhcmUKLQkJCQkJLy8KLQkJCQkJU29mdHdhcmVTZXQgPSBoYWxfc29mdHdhcmVfc2V0KCBwSHdEYXRhICk7Ci0KLQkJCQkJI2lmZGVmIFZlbmRvcjIKLQkJCQkJLy8gVHJ5IHRvIG1ha2Ugc3VyZSB0aGUgRUVQUk9NIGNvbnRhaW4KLQkJCQkJU29mdHdhcmVTZXQgPj49IDg7Ci0JCQkJCWlmKCBTb2Z0d2FyZVNldCAhPSAweDgyICkKLQkJCQkJCXJldHVybiBGQUxTRTsKLQkJCQkJI2VuZGlmCi0KLQkJCQkJV2IzNVJ4X3N0YXJ0KCBwSHdEYXRhICk7Ci0JCQkJCVdiMzVUeF9FUDJWTV9zdGFydCggcEh3RGF0YSApOwotCi0JCQkJCXJldHVybiBUUlVFOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXBId0RhdGEtPlN1cnByaXNlUmVtb3ZlID0gMTsKLQlyZXR1cm4gRkFMU0U7Ci19Ci0KLQotdm9pZCBoYWxfaGFsdChwaHdfZGF0YV90IHBId0RhdGEsIHZvaWQgKnBwYV9kYXRhKQotewotCXN3aXRjaCggcEh3RGF0YS0+SW5pdGlhbFJlc291cmNlICkKLQl7Ci0JCWNhc2UgNDoKLQkJY2FzZSAzOiBPU19USU1FUl9DQU5DRUwoICZwSHdEYXRhLT5MRURUaW1lciwgJmNhbmNlbCApOwotCQkJT1NfU0xFRVAoMTAwMDAwKTsgLy8gV2FpdCBmb3IgVGltZXIgRFBDIGV4aXQgOTQwNjIzLjIKLQkJCVdiMzVSeF9kZXN0cm95KCBwSHdEYXRhICk7IC8vIFJlbGVhc2UgdGhlIFJ4Ci0JCWNhc2UgMjogV2IzNVR4X2Rlc3Ryb3koIHBId0RhdGEgKTsgLy8gUmVsZWFzZSB0aGUgVHgKLQkJY2FzZSAxOiBXYjM1UmVnX2Rlc3Ryb3koIHBId0RhdGEgKTsgLy8gUmVsZWFzZSB0aGUgV2IzNSBSZWdpc3N0ZXIgcmVzb3VyY2VzCi0JCQkJV2JVc2JfZGVzdHJveSggcEh3RGF0YSApOy8vIFJlbGVhc2UgdGhlIFdiVXNiCi0JfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdm9pZCBoYWxfc2V0X3JhdGVzKHBod19kYXRhX3QgcEh3RGF0YSwgdTggKnBic3NfcmF0ZXMsCi0JCSAgIHU4IGxlbmd0aCwgdW5zaWduZWQgY2hhciBiYXNpY19yYXRlX3NldCkKLXsKLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOwotCXUzMgkJdG1wLCB0bXAxOwotCXU4CQlSYXRlWzEyXT17IDIsIDQsIDExLCAyMiwgMTIsIDE4LCAyNCwgMzYsIDQ4LCA3MiwgOTYsIDEwOCB9OwotCXU4CQlTdXBwb3J0ZWRSYXRlWzE2XTsKLQl1OAkJaSwgaiwgaywgQ291bnQxLCBDb3VudDIsIEJ5dGU7Ci0KLQlpZiggcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgKSByZXR1cm47Ci0KLQlpZiAoYmFzaWNfcmF0ZV9zZXQpIHsKLQkJcFdiMzVSZWctPk0yOF9NYWNDb250cm9sICY9IH4weDAwMGZmZjAwOwotCQl0bXAxID0gMHgwMDAwMDEwMDsKLQl9IGVsc2UgewotCQlwV2IzNVJlZy0+TTI4X01hY0NvbnRyb2wgJj0gfjB4ZmZmMDAwMDA7Ci0JCXRtcDEgPSAweDAwMTAwMDAwOwotCX0KLQotCXRtcCA9IDA7Ci0JZm9yIChpPTA7IGk8bGVuZ3RoOyBpKyspIHsKLQkJQnl0ZSA9IHBic3NfcmF0ZXNbaV0gJiAweDdmOwotCQlmb3IgKGo9MDsgajwxMjsgaisrKSB7Ci0JCQlpZiggQnl0ZSA9PSBSYXRlW2pdICkKLQkJCQlicmVhazsKLQkJfQotCi0JCWlmIChqIDwgMTIpCi0JCQl0bXAgfD0gKHRtcDE8PGopOwotCX0KLQotCXBXYjM1UmVnLT5NMjhfTWFjQ29udHJvbCB8PSB0bXA7Ci0JV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwODI4LCBwV2IzNVJlZy0+TTI4X01hY0NvbnRyb2wgKTsKLQotCS8vIDkzMDIwNi4yLmMgTTc4IHNldHRpbmcKLQlqID0gayA9IENvdW50MSA9IENvdW50MiA9IDA7Ci0JbWVtc2V0KCBTdXBwb3J0ZWRSYXRlLCAwLCAxNiApOwotCXRtcCA9IDB4MDAxMDAwMDA7Ci0JdG1wMSA9IDB4MDAwMDAxMDA7Ci0JZm9yIChpPTA7IGk8MTI7IGkrKykgeyAvLyBHZXQgdGhlIHN1cHBvcnRlZCByYXRlCi0JCWlmICh0bXAgJiBwV2IzNVJlZy0+TTI4X01hY0NvbnRyb2wpIHsKLQkJCVN1cHBvcnRlZFJhdGVbal0gPSBSYXRlW2ldOwotCi0JCQlpZiAodG1wMSAmIHBXYjM1UmVnLT5NMjhfTWFjQ29udHJvbCkKLQkJCQlTdXBwb3J0ZWRSYXRlW2pdIHw9IDB4ODA7Ci0KLQkJCWlmIChrKQotCQkJCUNvdW50MisrOwotCQkJZWxzZQotCQkJCUNvdW50MSsrOwotCi0JCQlqKys7Ci0JCX0KLQotCQlpZiAoaT09NCAmJiBrPT0wKSB7Ci0JCQlpZiggIShwV2IzNVJlZy0+TTI4X01hY0NvbnRyb2wgJiAweDAwMGZmMDAwKSApIC8vIGlmIGJhc2ljIHJhdGUgaW4gMTFnIGRvbWFpbikKLQkJCXsKLQkJCQlrID0gMTsKLQkJCQlqID0gODsKLQkJCX0KLQkJfQotCi0JCXRtcCA8PD0gMTsKLQkJdG1wMSA8PD0gMTsKLQl9Ci0KLQkvLyBGaWxsIGRhdGEgaW50byBzdXBwb3J0IHJhdGUgdW50aWwgYnVmZmVyIGZ1bGwKLQkvLy0tLTIwMDYwOTI2IGFkZCBieSBhbnNvbidzIGVuZGlhbgotCWZvciAoaT0wOyBpPDQ7IGkrKykKLQkJKih1MzIgKikoU3VwcG9ydGVkUmF0ZSsoaTw8MikpID0gY3B1X3RvX2xlMzIoICoodTMyICopKFN1cHBvcnRlZFJhdGUrKGk8PDIpKSApOwotCS8vLS0tIGVuZCAyMDA2MDkyNiBhZGQgYnkgYW5zb24ncyBlbmRpYW4KLQlXYjM1UmVnX0J1cnN0V3JpdGUoIHBId0RhdGEsMHgwODdjLCAodTMyICopU3VwcG9ydGVkUmF0ZSwgNCwgQVVUT19JTkNSRU1FTlQgKTsKLQlwV2IzNVJlZy0+TTdDX01hY0NvbnRyb2wgPSAoKHUzMiAqKVN1cHBvcnRlZFJhdGUpWzBdOwotCXBXYjM1UmVnLT5NODBfTWFjQ29udHJvbCA9ICgodTMyICopU3VwcG9ydGVkUmF0ZSlbMV07Ci0JcFdiMzVSZWctPk04NF9NYWNDb250cm9sID0gKCh1MzIgKilTdXBwb3J0ZWRSYXRlKVsyXTsKLQlwV2IzNVJlZy0+TTg4X01hY0NvbnRyb2wgPSAoKHUzMiAqKVN1cHBvcnRlZFJhdGUpWzNdOwotCi0JLy8gRmlsbCBsZW5ndGgKLQl0bXAgPSBDb3VudDE8PDI4IHwgQ291bnQyPDwyNDsKLQlwV2IzNVJlZy0+TTc4X0VSUEluZm9ybWF0aW9uICY9IH4weGZmMDAwMDAwOwotCXBXYjM1UmVnLT5NNzhfRVJQSW5mb3JtYXRpb24gfD0gdG1wOwotCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDg3OCwgcFdiMzVSZWctPk03OF9FUlBJbmZvcm1hdGlvbiApOwotfQotCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi12b2lkIGhhbF9zZXRfYmVhY29uX3BlcmlvZCggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUxNiBiZWFjb25fcGVyaW9kICkKLXsKLQl1MzIJdG1wOwotCi0JaWYoIHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlICkgcmV0dXJuOwotCi0JcEh3RGF0YS0+QmVhY29uUGVyaW9kID0gYmVhY29uX3BlcmlvZDsKLQl0bXAgPSBwSHdEYXRhLT5CZWFjb25QZXJpb2QgPDwgMTY7Ci0JdG1wIHw9IHBId0RhdGEtPlByb2JlRGVsYXk7Ci0JV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwODQ4LCB0bXAgKTsKLX0KLQotCi12b2lkIGhhbF9zZXRfY3VycmVudF9jaGFubmVsX2V4KCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgQ2hhbkluZm8gY2hhbm5lbCApCi17Ci0JUFdCMzVSRUcgcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKLQotCWlmKCBwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSApCi0JCXJldHVybjsKLQotCXByaW50aygiR29pbmcgdG8gY2hhbm5lbDogJWQvJWRcbiIsIGNoYW5uZWwuYmFuZCwgY2hhbm5lbC5DaGFuTm8pOwotCi0JUkZTeW50aGVzaXplcl9Td2l0Y2hpbmdDaGFubmVsKCBwSHdEYXRhLCBjaGFubmVsICk7Ly8gU3dpdGNoIGNoYW5uZWwKLQlwSHdEYXRhLT5DaGFubmVsID0gY2hhbm5lbC5DaGFuTm87Ci0JcEh3RGF0YS0+YmFuZCA9IGNoYW5uZWwuYmFuZDsKLQkjaWZkZWYgX1BFX1NUQVRFX0RVTVBfCi0JV0JERUJVRygoIlNldCBjaGFubmVsIGlzICVkLCBiYW5kID0lZFxuIiwgcEh3RGF0YS0+Q2hhbm5lbCwgcEh3RGF0YS0+YmFuZCkpOwotCSNlbmRpZgotCXBXYjM1UmVnLT5NMjhfTWFjQ29udHJvbCAmPSB+MHhmZjsgLy8gQ2xlYW4gY2hhbm5lbCBpbmZvcm1hdGlvbiBmaWVsZAotCXBXYjM1UmVnLT5NMjhfTWFjQ29udHJvbCB8PSBjaGFubmVsLkNoYW5ObzsKLQlXYjM1UmVnX1dyaXRlV2l0aENhbGxiYWNrVmFsdWUoIHBId0RhdGEsIDB4MDgyOCwgcFdiMzVSZWctPk0yOF9NYWNDb250cm9sLAotCQkJCQkoczggKikmY2hhbm5lbCwgc2l6ZW9mKENoYW5JbmZvKSk7Ci19Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdm9pZCBoYWxfc2V0X2N1cnJlbnRfY2hhbm5lbCggIHBod19kYXRhX3QgcEh3RGF0YSwgIENoYW5JbmZvIGNoYW5uZWwgKQotewotCWhhbF9zZXRfY3VycmVudF9jaGFubmVsX2V4KCBwSHdEYXRhLCBjaGFubmVsICk7Ci19Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdm9pZCBoYWxfZ2V0X2N1cnJlbnRfY2hhbm5lbCggIHBod19kYXRhX3QgcEh3RGF0YSwgIENoYW5JbmZvICpjaGFubmVsICkKLXsKLQljaGFubmVsLT5DaGFuTm8gPSBwSHdEYXRhLT5DaGFubmVsOwotCWNoYW5uZWwtPmJhbmQgPSBwSHdEYXRhLT5iYW5kOwotfQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXZvaWQgaGFsX3NldF9hY2NlcHRfYnJvYWRjYXN0KCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggZW5hYmxlICkKLXsKLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOwotCi0JaWYoIHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlICkgcmV0dXJuOwotCi0JcFdiMzVSZWctPk0wMF9NYWNDb250cm9sICY9IH4weDAyMDAwMDAwOy8vVGhlIEhXIHZhbHVlCi0KLQlpZiAoZW5hYmxlKQotCQlwV2IzNVJlZy0+TTAwX01hY0NvbnRyb2wgfD0gMHgwMjAwMDAwMDsvL1RoZSBIVyB2YWx1ZQotCi0JV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwODAwLCBwV2IzNVJlZy0+TTAwX01hY0NvbnRyb2wgKTsKLX0KLQotLy9mb3Igd2VwIGtleSBlcnJvciBkZXRlY3Rpb24sIHdlIG5lZWQgdG8gYWNjZXB0IGJyb2FkY2FzdCBwYWNrZXRzIHRvIGJlIHJlY2VpdmVkIHRlbXBvcmFyeS4KLXZvaWQgaGFsX3NldF9hY2NlcHRfcHJvbWlzY3VvdXMoIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4IGVuYWJsZSkKLXsKLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOwotCi0JaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlKSByZXR1cm47Ci0JaWYgKGVuYWJsZSkgewotCQlwV2IzNVJlZy0+TTAwX01hY0NvbnRyb2wgfD0gMHgwMDQwMDAwMDsKLQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwODAwLCBwV2IzNVJlZy0+TTAwX01hY0NvbnRyb2wgKTsKLQl9IGVsc2UgewotCQlwV2IzNVJlZy0+TTAwX01hY0NvbnRyb2wmPX4weDAwNDAwMDAwOwotCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDA4MDAsIHBXYjM1UmVnLT5NMDBfTWFjQ29udHJvbCApOwotCX0KLX0KLQotdm9pZCBoYWxfc2V0X2FjY2VwdF9tdWx0aWNhc3QoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCBlbmFibGUgKQotewotCVBXQjM1UkVHCXBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7Ci0KLQlpZiggcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgKSByZXR1cm47Ci0KLQlwV2IzNVJlZy0+TTAwX01hY0NvbnRyb2wgJj0gfjB4MDEwMDAwMDA7Ly9UaGUgSFcgdmFsdWUKLQlpZiAoZW5hYmxlKSAgcFdiMzVSZWctPk0wMF9NYWNDb250cm9sIHw9IDB4MDEwMDAwMDA7Ly9UaGUgSFcgdmFsdWUKLQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDA4MDAsIHBXYjM1UmVnLT5NMDBfTWFjQ29udHJvbCApOwotfQotCi12b2lkIGhhbF9zZXRfYWNjZXB0X2JlYWNvbiggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4IGVuYWJsZSApCi17Ci0JUFdCMzVSRUcJcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKLQotCWlmKCBwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSApIHJldHVybjsKLQotCS8vIDIwMDQwMTA4IGRlYnVnCi0JaWYoICFlbmFibGUgKS8vRHVlIHRvIFNNRSBhbmQgTUxNRSBhcmUgbm90IHN1aXRhYmxlIGZvciAzNQotCQlyZXR1cm47Ci0KLQlwV2IzNVJlZy0+TTAwX01hY0NvbnRyb2wgJj0gfjB4MDQwMDAwMDA7Ly9UaGUgSFcgdmFsdWUKLQlpZiggZW5hYmxlICkKLQkJcFdiMzVSZWctPk0wMF9NYWNDb250cm9sIHw9IDB4MDQwMDAwMDA7Ly9UaGUgSFcgdmFsdWUKLQotCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDgwMCwgcFdiMzVSZWctPk0wMF9NYWNDb250cm9sICk7Ci19Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdm9pZCBoYWxfc2V0X211bHRpY2FzdF9hZGRyZXNzKCBwaHdfZGF0YV90IHBId0RhdGEsIHU4ICphZGRyZXNzLCB1OCBudW1iZXIgKQotewotCVBXQjM1UkVHCXBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7Ci0JdTgJCUJ5dGUsIEJpdDsKLQotCWlmKCBwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSApIHJldHVybjsKLQotCS8vRXJhc2VzIGFuZCByZWZpbGxzIHRoZSBjYXJkIG11bHRpY2FzdCByZWdpc3RlcnMuIFVzZWQgd2hlbiBhbiBhZGRyZXNzCi0JLy8gICAgaGFzIGJlZW4gZGVsZXRlZCBhbmQgYWxsIGJpdHMgbXVzdCBiZSByZWNvbXB1dGVkLgotCXBXYjM1UmVnLT5NMDRfTXVsdGljYXN0QWRkcmVzczEgPSAwOwotCXBXYjM1UmVnLT5NMDhfTXVsdGljYXN0QWRkcmVzczIgPSAwOwotCi0Jd2hpbGUoIG51bWJlciApCi0JewotCQludW1iZXItLTsKLQkJQ2FyZEdldE11bHRpY2FzdEJpdCggKGFkZHJlc3MrKG51bWJlcipFVEhfTEVOR1RIX09GX0FERFJFU1MpKSwgJkJ5dGUsICZCaXQpOwotCQlwV2IzNVJlZy0+TXVsdGljYXN0W0J5dGVdIHw9IEJpdDsKLQl9Ci0KLQkvLyBVcGRhdGluZyByZWdpc3RlcgotCVdiMzVSZWdfQnVyc3RXcml0ZSggcEh3RGF0YSwgMHgwODA0LCAodTMyICopcFdiMzVSZWctPk11bHRpY2FzdCwgMiwgQVVUT19JTkNSRU1FTlQgKTsKLX0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi11OCBoYWxfZ2V0X2FjY2VwdF9iZWFjb24oICBwaHdfZGF0YV90IHBId0RhdGEgKQotewotCVBXQjM1UkVHIHBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7Ci0KLQlpZiggcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgKSByZXR1cm4gMDsKLQotCWlmKCBwV2IzNVJlZy0+TTAwX01hY0NvbnRyb2wgJiAweDA0MDAwMDAwICkKLQkJcmV0dXJuIDE7Ci0JZWxzZQotCQlyZXR1cm4gMDsKLX0KLQotdW5zaWduZWQgY2hhciBoYWxfcmVzZXRfaGFyZHdhcmUoIHBod19kYXRhX3QgcEh3RGF0YSwgdm9pZCogcHBhICkKLXsKLQkvLyBOb3QgaW1wbGVtZW50IHlldAotCXJldHVybiBUUlVFOwotfQotCi12b2lkIGhhbF9zdG9wKCAgcGh3X2RhdGFfdCBwSHdEYXRhICkKLXsKLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOwotCi0JcEh3RGF0YS0+V2IzNVJ4LnJ4X2hhbHQgPSAxOwotCVdiMzVSeF9zdG9wKCBwSHdEYXRhICk7Ci0KLQlwSHdEYXRhLT5XYjM1VHgudHhfaGFsdCA9IDE7Ci0JV2IzNVR4X3N0b3AoIHBId0RhdGEgKTsKLQotCXBXYjM1UmVnLT5EMDBfRG1hQ29udHJvbCAmPSB+MHhjMDAwMDAwMDsvL1R4IE9mZiwgUnggT2ZmCi0JV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwNDAwLCBwV2IzNVJlZy0+RDAwX0RtYUNvbnRyb2wgKTsKLQotCVdiVXNiX1N0b3AoIHBId0RhdGEgKTsgLy8gMjAwNTEyMzAgQWRkLjQKLX0KLQotdW5zaWduZWQgY2hhciBoYWxfaWRsZShwaHdfZGF0YV90IHBId0RhdGEpCi17Ci0JUFdCMzVSRUcJcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKLQlQV0JVU0IJcFdiVXNiID0gJnBId0RhdGEtPldiVXNiOwotCi0JaWYoICFwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSAmJiAoIHBXYlVzYi0+RGV0ZWN0Q291bnQgfHwgcFdiMzVSZWctPkVQMHZtX3N0YXRlIT1WTV9TVE9QICkgKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi12b2lkIGhhbF9zZXRfY3dtaW4oICBwaHdfZGF0YV90IHBId0RhdGEsICB1OAljd2luX21pbiApCi17Ci0JUFdCMzVSRUcJcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKLQotCWlmKCBwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSApIHJldHVybjsKLQotCXBId0RhdGEtPmN3bWluID0gY3dpbl9taW47Ci0JcFdiMzVSZWctPk0yQ19NYWNDb250cm9sICY9IH4weDdjMDA7CS8vYml0IDEwIH4gMTQKLQlwV2IzNVJlZy0+TTJDX01hY0NvbnRyb2wgfD0gKHBId0RhdGEtPmN3bWluPDwxMCk7Ci0JV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwODJjLCBwV2IzNVJlZy0+TTJDX01hY0NvbnRyb2wgKTsKLX0KLQotczMyIGhhbF9nZXRfcnNzaSggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUzMiAqSGFsUnNzaUFycnksICB1OCBDb3VudCApCi17Ci0JUFdCMzVSRUcgcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKLQlSMDFfREVTQ1JJUFRPUglyMDE7Ci0JczMyIGx0bXAgPSAwLCB0bXA7Ci0JdTgJaTsKLQotCWlmKCBwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSApIHJldHVybiAtMjAwOwotCWlmKCBDb3VudCA+IE1BWF9BQ0NfUlNTSV9DT1VOVCApIC8vIEJlY2F1c2UgdGhlIFRTIG1heSB1c2UgdGhpcyBmdW50aW9uCi0JCUNvdW50ID0gTUFYX0FDQ19SU1NJX0NPVU5UOwotCi0JLy8gUlNTSSA9IEMxICsgQzIgKiAoYWdjX3N0YXRlWzc6MF0gKyBvZmZzZXRfbWFwKGxuYV9zdGF0ZVsxOjBdKSkKLQkvLyBDMSA9IC0xOTUsIEMyID0gMC42NiA9IDg1LzEyOAotCWZvciAoaT0wOyBpPENvdW50OyBpKyspCi0JewotCQlyMDEudmFsdWUgPSBIYWxSc3NpQXJyeVtpXTsKLQkJdG1wID0gKCgoIHIwMS5SMDFfQUdDX3N0YXRlICsgcFdiMzVSZWctPkxOQVZhbHVlW3IwMS5SMDFfTE5BX3N0YXRlXSkgKiA4NSApID4+NyApIC0gMTk1OwotCQlsdG1wICs9IHRtcDsKLQl9Ci0JbHRtcCAvPSBDb3VudDsKLQlpZiggcEh3RGF0YS0+cGh5X3R5cGUgPT0gUkZfQUlST0hBXzIyMzAgKSBsdG1wIC09IDU7IC8vIDEwOwotCWlmKCBwSHdEYXRhLT5waHlfdHlwZSA9PSBSRl9BSVJPSEFfMjIzMFMgKSBsdG1wIC09IDU7IC8vIDEwOyAyMDA2MDQyMCBBZGQgdGhpcwotCi0JLy9pZiggbHRtcCA8IC0yMDAgKSBsdG1wID0gLTIwMDsKLQlpZiggbHRtcCA8IC0xMTAgKSBsdG1wID0gLTExMDsvLyAxLjAuMjQuMCBGb3IgTkpSQwotCi0JcmV0dXJuIGx0bXA7Ci19Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXMzMiBoYWxfZ2V0X3Jzc2lfYnNzKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IGlkeCwgIHU4IENvdW50ICkKLXsKLQlQV0IzNVJFRyBwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOwotCVIwMV9ERVNDUklQVE9SCXIwMTsKLQlzMzIgbHRtcCA9IDAsIHRtcDsKLQl1OAlpLCBqOwotCVBBREFQVEVSCUFkYXB0ZXIgPSBwSHdEYXRhLT5BZGFwdGVyOwotLy8JdTMyICpIYWxSc3NpQXJyeSA9IHBzQlNTKGlkeCktPkhhbFJzc2k7Ci0KLQlpZiggcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgKSByZXR1cm4gLTIwMDsKLQlpZiggQ291bnQgPiBNQVhfQUNDX1JTU0lfQ09VTlQgKSAvLyBCZWNhdXNlIHRoZSBUUyBtYXkgdXNlIHRoaXMgZnVudGlvbgotCQlDb3VudCA9IE1BWF9BQ0NfUlNTSV9DT1VOVDsKLQotCS8vIFJTU0kgPSBDMSArIEMyICogKGFnY19zdGF0ZVs3OjBdICsgb2Zmc2V0X21hcChsbmFfc3RhdGVbMTowXSkpCi0JLy8gQzEgPSAtMTk1LCBDMiA9IDAuNjYgPSA4NS8xMjgKLSNpZiAwCi0JZm9yIChpPTA7IGk8Q291bnQ7IGkrKykKLQl7Ci0JCXIwMS52YWx1ZSA9IEhhbFJzc2lBcnJ5W2ldOwotCQl0bXAgPSAoKCggcjAxLlIwMV9BR0Nfc3RhdGUgKyBwV2IzNVJlZy0+TE5BVmFsdWVbcjAxLlIwMV9MTkFfc3RhdGVdKSAqIDg1ICkgPj43ICkgLSAxOTU7Ci0JCWx0bXAgKz0gdG1wOwotCX0KLSNlbHNlCi0JaWYgKHBzQlNTKGlkeCktPkhhbFJzc2lJbmRleCA9PSAwKQotCQlwc0JTUyhpZHgpLT5IYWxSc3NpSW5kZXggPSBNQVhfQUNDX1JTU0lfQ09VTlQ7Ci0JaiA9ICh1OClwc0JTUyhpZHgpLT5IYWxSc3NpSW5kZXgtMTsKLQotCWZvciAoaT0wOyBpPENvdW50OyBpKyspCi0JewotCQlyMDEudmFsdWUgPSBwc0JTUyhpZHgpLT5IYWxSc3NpW2pdOwotCQl0bXAgPSAoKCggcjAxLlIwMV9BR0Nfc3RhdGUgKyBwV2IzNVJlZy0+TE5BVmFsdWVbcjAxLlIwMV9MTkFfc3RhdGVdKSAqIDg1ICkgPj43ICkgLSAxOTU7Ci0JCWx0bXAgKz0gdG1wOwotCQlpZiAoaiA9PSAwKQotCQl7Ci0JCQlqID0gTUFYX0FDQ19SU1NJX0NPVU5UOwotCQl9Ci0JCWotLTsKLQl9Ci0jZW5kaWYKLQlsdG1wIC89IENvdW50OwotCWlmKCBwSHdEYXRhLT5waHlfdHlwZSA9PSBSRl9BSVJPSEFfMjIzMCApIGx0bXAgLT0gNTsgLy8gMTA7Ci0JaWYoIHBId0RhdGEtPnBoeV90eXBlID09IFJGX0FJUk9IQV8yMjMwUyApIGx0bXAgLT0gNTsgLy8gMTA7IDIwMDYwNDIwIEFkZCB0aGlzCi0KLQkvL2lmKCBsdG1wIDwgLTIwMCApIGx0bXAgPSAtMjAwOwotCWlmKCBsdG1wIDwgLTExMCApIGx0bXAgPSAtMTEwOy8vIDEuMC4yNC4wIEZvciBOSlJDCi0KLQlyZXR1cm4gbHRtcDsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXZvaWQgaGFsX2xlZF9jb250cm9sXzFhKCAgcGh3X2RhdGFfdCBwSHdEYXRhICkKLXsKLQloYWxfbGVkX2NvbnRyb2woIE5VTEwsIHBId0RhdGEsIE5VTEwsIE5VTEwgKTsKLX0KLQotdm9pZCBoYWxfbGVkX2NvbnRyb2woICB2b2lkKiBTMSwgIHBod19kYXRhX3QgcEh3RGF0YSwgIHZvaWQqIFMzLCAgdm9pZCogUzQgKQotewotCVBBREFQVEVSCUFkYXB0ZXIgPSBwSHdEYXRhLT5BZGFwdGVyOwotCVBXQjM1UkVHCXBXYjM1UmVnID0gJnBId0RhdGEtPldiMzVSZWc7CisJc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyID0gKHN0cnVjdCB3YnNvZnRfcHJpdiAqKSBkYXRhOworCXBod19kYXRhX3QgcEh3RGF0YSA9ICZhZGFwdGVyLT5zSHdEYXRhOworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKIAl1MzIJTEVEU2V0ID0gKHBId0RhdGEtPlNvZnR3YXJlU2V0ICYgSEFMX0xFRF9TRVRfTUFTSykgPj4gSEFMX0xFRF9TRVRfU0hJRlQ7CiAJdTgJTEVEZ3JheVsyMF0gPSB7IDAsMyw0LDYsOCwxMCwxMSwxMiwxMywxNCwxNSwxNCwxMywxMiwxMSwxMCw4LDYsNCwyIH07CiAJdTgJTEVEZ3JheTJbMzBdID0geyA3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDE1LDE0LDEzLDEyLDExLDEwLDksOCB9OwpAQCAtNDg3LDIxICs3MCwyMSBAQAogCQkJfQogCQkJcEh3RGF0YS0+TEVEX0JsaW5raW5nKys7CiAKLQkJCXBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSA9IGx0bXA7CisJCQlyZWctPlUxQkNfTEVEQ29uZmlndXJlID0gbHRtcDsKIAkJCWlmKCBMRURTZXQgIT0gNyApIC8vIE9ubHkgMTExIG1vZGUgaGFzIDIgTEVEcyBvbiBQQ0IuCiAJCQl7Ci0JCQkJcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlIHw9IChsdG1wICYweGZmKTw8ODsgLy8gQ29weSBMRUQgcmVzdWx0IHRvIGVhY2ggTEVEIGNvbnRyb2wgcmVnaXN0ZXIKLQkJCQlwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gKGx0bXAgJjB4ZmYwMCk+Pjg7CisJCQkJcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSAobHRtcCAmMHhmZik8PDg7IC8vIENvcHkgTEVEIHJlc3VsdCB0byBlYWNoIExFRCBjb250cm9sIHJlZ2lzdGVyCisJCQkJcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSAobHRtcCAmMHhmZjAwKT4+ODsKIAkJCX0KLQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICk7CisJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsKIAkJfQogCX0KIAllbHNlIGlmKCBwSHdEYXRhLT5DdXJyZW50UmFkaW9TdyB8fCBwSHdEYXRhLT5DdXJyZW50UmFkaW9IdyApIC8vIElmIHJhZGlvIG9mZgogCXsKLQkJaWYoIHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmIDB4MTAxMCApCisJCWlmKCByZWctPlUxQkNfTEVEQ29uZmlndXJlICYgMHgxMDEwICkKIAkJewotCQkJcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICY9IH4weDEwMTA7Ci0JCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOworCQkJcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmPSB+MHgxMDEwOworCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCByZWctPlUxQkNfTEVEQ29uZmlndXJlICk7CiAJCX0KIAl9CiAJZWxzZQpAQCAtNTE2LDE1ICs5OSwxNSBAQAogCQkJCQl7CiAJCQkJCQlpZiggcEh3RGF0YS0+TEVEX0JsaW5raW5nID09IDAgKQogCQkJCQkJewotCQkJCQkJCXBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSAweDEwOwotCQkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICk7IC8vIExFRF8wIE9uCisJCQkJCQkJcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSAweDEwOworCQkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMCBPbgogCQkJCQkJCXBId0RhdGEtPkxFRF9CbGlua2luZyA9IDE7CiAJCQkJCQkJVGltZUludGVydmFsID0gMzAwOwogCQkJCQkJfQogCQkJCQkJZWxzZQogCQkJCQkJewotCQkJCQkJCXBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmPSB+MHgxMDsKLQkJCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMCBPZmYKKwkJCQkJCQlyZWctPlUxQkNfTEVEQ29uZmlndXJlICY9IH4weDEwOworCQkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMCBPZmYKIAkJCQkJCQlwSHdEYXRhLT5MRURfQmxpbmtpbmcgPSAwOwogCQkJCQkJCVRpbWVJbnRlcnZhbCA9IDMwMDsKIAkJCQkJCX0KQEAgLTUzMiwyMCArMTE1LDIwIEBACiAJCQkJCWVsc2UKIAkJCQkJewogCQkJCQkJLy9UdXJuIE9mZiBMRURfMAotCQkJCQkJaWYoIHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmIDB4MTAgKQorCQkJCQkJaWYoIHJlZy0+VTFCQ19MRURDb25maWd1cmUgJiAweDEwICkKIAkJCQkJCXsKLQkJCQkJCQlwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgJj0gfjB4MTA7Ci0JCQkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCBwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsgLy8gTEVEXzAgT2ZmCisJCQkJCQkJcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmPSB+MHgxMDsKKwkJCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsgLy8gTEVEXzAgT2ZmCiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9CiAJCQkJZWxzZQogCQkJCXsKIAkJCQkJLy8gVHVybiBPbiBMRURfMAotCQkJCQlpZiggKHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmIDB4MTApID09IDAgKQorCQkJCQlpZiggKHJlZy0+VTFCQ19MRURDb25maWd1cmUgJiAweDEwKSA9PSAwICkKIAkJCQkJewotCQkJCQkJcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlIHw9IDB4MTA7Ci0JCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMCBPZmYKKwkJCQkJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gMHgxMDsKKwkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMCBPZmYKIAkJCQkJfQogCQkJCX0KIAkJCQlicmVhazsKQEAgLTU1OCwxNiArMTQxLDE2IEBACiAJCQkJCXsKIAkJCQkJCWlmKCBwSHdEYXRhLT5MRURfQmxpbmtpbmcgPT0gMCApCiAJCQkJCQl7Ci0JCQkJCQkJcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICY9IH4weGY7Ci0JCQkJCQkJcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlIHw9IDB4MTA7Ci0JCQkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCBwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsgLy8gTEVEXzAgT24KKwkJCQkJCQlyZWctPlUxQkNfTEVEQ29uZmlndXJlICY9IH4weGY7CisJCQkJCQkJcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSAweDEwOworCQkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMCBPbgogCQkJCQkJCXBId0RhdGEtPkxFRF9CbGlua2luZyA9IDE7CiAJCQkJCQkJVGltZUludGVydmFsID0gMzAwOwogCQkJCQkJfQogCQkJCQkJZWxzZQogCQkJCQkJewotCQkJCQkJCXBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmPSB+MHgxZjsKLQkJCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMCBPZmYKKwkJCQkJCQlyZWctPlUxQkNfTEVEQ29uZmlndXJlICY9IH4weDFmOworCQkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMCBPZmYKIAkJCQkJCQlwSHdEYXRhLT5MRURfQmxpbmtpbmcgPSAwOwogCQkJCQkJCVRpbWVJbnRlcnZhbCA9IDMwMDsKIAkJCQkJCX0KQEAgLTU3NSwyNiArMTU4LDI2IEBACiAJCQkJCWVsc2UKIAkJCQkJewogCQkJCQkJLy8gMjAwNjA5MDEgR3JheSBibGlua2luZyBpZiBpbiBkaXNjb25uZWN0IHN0YXRlIGFuZCBub3Qgc2Nhbm5pbmcKLQkJCQkJCWx0bXAgPSBwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmU7Ci0JCQkJCQlwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgJj0gfjB4MWY7CisJCQkJCQlsdG1wID0gcmVnLT5VMUJDX0xFRENvbmZpZ3VyZTsKKwkJCQkJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgJj0gfjB4MWY7CiAJCQkJCQlpZiggTEVEZ3JheTJbKHBId0RhdGEtPkxFRF9CbGlua2luZyUzMCldICkKIAkJCQkJCXsKLQkJCQkJCQlwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gMHgxMDsKLQkJCQkJCQlwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gTEVEZ3JheTJbIChwSHdEYXRhLT5MRURfQmxpbmtpbmclMzApIF07CisJCQkJCQkJcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSAweDEwOworCQkJCQkJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gTEVEZ3JheTJbIChwSHdEYXRhLT5MRURfQmxpbmtpbmclMzApIF07CiAJCQkJCQl9CiAJCQkJCQlwSHdEYXRhLT5MRURfQmxpbmtpbmcrKzsKLQkJCQkJCWlmKCBwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgIT0gbHRtcCApCi0JCQkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCBwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsgLy8gTEVEXzAgT2ZmCisJCQkJCQlpZiggcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAhPSBsdG1wICkKKwkJCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsgLy8gTEVEXzAgT2ZmCiAJCQkJCQlUaW1lSW50ZXJ2YWwgPSAxMDA7CiAJCQkJCX0KIAkJCQl9CiAJCQkJZWxzZQogCQkJCXsKIAkJCQkJLy8gVHVybiBPbiBMRURfMAotCQkJCQlpZiggKHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmIDB4MTApID09IDAgKQorCQkJCQlpZiggKHJlZy0+VTFCQ19MRURDb25maWd1cmUgJiAweDEwKSA9PSAwICkKIAkJCQkJewotCQkJCQkJcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlIHw9IDB4MTA7Ci0JCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMCBPZmYKKwkJCQkJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gMHgxMDsKKwkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMCBPZmYKIAkJCQkJfQogCQkJCX0KIAkJCQlicmVhazsKQEAgLTYwNywxNSArMTkwLDE1IEBACiAJCQkJCXsKIAkJCQkJCWlmKCBwSHdEYXRhLT5MRURfQmxpbmtpbmcgPT0gMCApCiAJCQkJCQl7Ci0JCQkJCQkJcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlIHw9IDB4MTAwMDsKLQkJCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMSBPbgorCQkJCQkJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gMHgxMDAwOworCQkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMSBPbgogCQkJCQkJCXBId0RhdGEtPkxFRF9CbGlua2luZyA9IDE7CiAJCQkJCQkJVGltZUludGVydmFsID0gMzAwOwogCQkJCQkJfQogCQkJCQkJZWxzZQogCQkJCQkJewotCQkJCQkJCXBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmPSB+MHgxMDAwOwotCQkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICk7IC8vIExFRF8xIE9mZgorCQkJCQkJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgJj0gfjB4MTAwMDsKKwkJCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsgLy8gTEVEXzEgT2ZmCiAJCQkJCQkJcEh3RGF0YS0+TEVEX0JsaW5raW5nID0gMDsKIAkJCQkJCQlUaW1lSW50ZXJ2YWwgPSAzMDA7CiAJCQkJCQl9CkBAIC02MjMsNTcgKzIwNiw1NyBAQAogCQkJCQllbHNlCiAJCQkJCXsKIAkJCQkJCS8vVHVybiBPZmYgTEVEXzEKLQkJCQkJCWlmKCBwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgJiAweDEwMDAgKQorCQkJCQkJaWYoIHJlZy0+VTFCQ19MRURDb25maWd1cmUgJiAweDEwMDAgKQogCQkJCQkJewotCQkJCQkJCXBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmPSB+MHgxMDAwOwotCQkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICk7IC8vIExFRF8xIE9mZgorCQkJCQkJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgJj0gfjB4MTAwMDsKKwkJCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsgLy8gTEVEXzEgT2ZmCiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9CiAJCQkJZWxzZQogCQkJCXsKIAkJCQkJLy8gSXMgdHJhbnNtaXR0aW5nL3JlY2VpdmluZyA/PwotCQkJCQlpZiggKE9TX0NVUlJFTlRfUlhfQllURSggQWRhcHRlciApICE9IHBId0RhdGEtPlJ4Qnl0ZUNvdW50TGFzdCApIHx8Ci0JCQkJCQkoT1NfQ1VSUkVOVF9UWF9CWVRFKCBBZGFwdGVyICkgIT0gcEh3RGF0YS0+VHhCeXRlQ291bnRMYXN0ICkgKQorCQkJCQlpZiggKGFkYXB0ZXItPlJ4Qnl0ZUNvdW50ICE9IHBId0RhdGEtPlJ4Qnl0ZUNvdW50TGFzdCApIHx8CisJCQkJCQkoYWRhcHRlci0+VHhCeXRlQ291bnQgIT0gcEh3RGF0YS0+VHhCeXRlQ291bnRMYXN0ICkgKQogCQkJCQl7Ci0JCQkJCQlpZiggKHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmIDB4MzAwMCkgIT0gMHgzMDAwICkKKwkJCQkJCWlmKCAocmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmIDB4MzAwMCkgIT0gMHgzMDAwICkKIAkJCQkJCXsKLQkJCQkJCQlwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gMHgzMDAwOwotCQkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICk7IC8vIExFRF8xIE9uCisJCQkJCQkJcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSAweDMwMDA7CisJCQkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCByZWctPlUxQkNfTEVEQ29uZmlndXJlICk7IC8vIExFRF8xIE9uCiAJCQkJCQl9CiAKIAkJCQkJCS8vIFVwZGF0ZSB2YXJpYWJsZQotCQkJCQkJcEh3RGF0YS0+UnhCeXRlQ291bnRMYXN0ID0gT1NfQ1VSUkVOVF9SWF9CWVRFKCBBZGFwdGVyICk7Ci0JCQkJCQlwSHdEYXRhLT5UeEJ5dGVDb3VudExhc3QgPSBPU19DVVJSRU5UX1RYX0JZVEUoIEFkYXB0ZXIgKTsKKwkJCQkJCXBId0RhdGEtPlJ4Qnl0ZUNvdW50TGFzdCA9IGFkYXB0ZXItPlJ4Qnl0ZUNvdW50OworCQkJCQkJcEh3RGF0YS0+VHhCeXRlQ291bnRMYXN0ID0gYWRhcHRlci0+VHhCeXRlQ291bnQ7CiAJCQkJCQlUaW1lSW50ZXJ2YWwgPSAyMDA7CiAJCQkJCX0KIAkJCQkJZWxzZQogCQkJCQl7CiAJCQkJCQkvLyBUdXJuIE9uIExFRF8xIGFuZCBibGlua2luZyBpZiB0cmFuc21pdHRpbmcvcmVjZWl2aW5nCi0JCQkJCQkgaWYoIChwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgJiAweDMwMDApICE9IDB4MTAwMCApCisJCQkJCQkgaWYoIChyZWctPlUxQkNfTEVEQ29uZmlndXJlICYgMHgzMDAwKSAhPSAweDEwMDAgKQogCQkJCQkJIHsKLQkJCQkJCQkgcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICY9IH4weDMwMDA7Ci0JCQkJCQkJIHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSAweDEwMDA7Ci0JCQkJCQkJIFdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICk7IC8vIExFRF8xIE9uCisJCQkJCQkJIHJlZy0+VTFCQ19MRURDb25maWd1cmUgJj0gfjB4MzAwMDsKKwkJCQkJCQkgcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSAweDEwMDA7CisJCQkJCQkJIFdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOyAvLyBMRURfMSBPbgogCQkJCQkJIH0KIAkJCQkJfQogCQkJCX0KIAkJCQlicmVhazsKIAogCQkJZGVmYXVsdDogLy8gRGVmYXVsdCBzZXR0aW5nLiAyIExFRCBiZSBwbGFjZWQgb24gUENCLiBMRURfMDogTGluayBPbiBMRURfMSBBY3RpdmUKLQkJCQlpZiggKHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmIDB4MzAwMCkgIT0gMHgzMDAwICkKKwkJCQlpZiggKHJlZy0+VTFCQ19MRURDb25maWd1cmUgJiAweDMwMDApICE9IDB4MzAwMCApCiAJCQkJewotCQkJCQlwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gMHgzMDAwOy8vIExFRF8xIGlzIGFsd2F5cyBvbiBhbmQgZXZlbnQgZW5hYmxlCi0JCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICk7CisJCQkJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gMHgzMDAwOy8vIExFRF8xIGlzIGFsd2F5cyBvbiBhbmQgZXZlbnQgZW5hYmxlCisJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOwogCQkJCX0KIAogCQkJCWlmKCBwSHdEYXRhLT5MRURfQmxpbmtpbmcgKQogCQkJCXsKIAkJCQkJLy8gR3JheSBibGlua2luZwotCQkJCQlwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgJj0gfjB4MGY7Ci0JCQkJCXBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSB8PSAweDEwOwotCQkJCQlwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gTEVEZ3JheVsgKHBId0RhdGEtPkxFRF9CbGlua2luZy0xKSUyMCBdOwotCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOworCQkJCQlyZWctPlUxQkNfTEVEQ29uZmlndXJlICY9IH4weDBmOworCQkJCQlyZWctPlUxQkNfTEVEQ29uZmlndXJlIHw9IDB4MTA7CisJCQkJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gTEVEZ3JheVsgKHBId0RhdGEtPkxFRF9CbGlua2luZy0xKSUyMCBdOworCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsKIAogCQkJCQlwSHdEYXRhLT5MRURfQmxpbmtpbmcgKz0gMjsKIAkJCQkJaWYoIHBId0RhdGEtPkxFRF9CbGlua2luZyA8IDQwICkKQEAgLTY4MSwyOCArMjY0LDI4IEBACiAJCQkJCWVsc2UKIAkJCQkJewogCQkJCQkJcEh3RGF0YS0+TEVEX0JsaW5raW5nID0gMDsgLy8gU3RvcCBibGlua2luZwotCQkJCQkJcFdiMzVSZWctPlUxQkNfTEVEQ29uZmlndXJlICY9IH4weDBmOwotCQkJCQkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwM2JjLCBwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsKKwkJCQkJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgJj0gfjB4MGY7CisJCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHJlZy0+VTFCQ19MRURDb25maWd1cmUgKTsKIAkJCQkJfQogCQkJCQlicmVhazsKIAkJCQl9CiAKIAkJCQlpZiggcEh3RGF0YS0+TEVEX0xpbmtPbiApCiAJCQkJewotCQkJCQlpZiggIShwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgJiAweDEwKSApIC8vIENoZWNrIHRoZSBMRURfMAorCQkJCQlpZiggIShyZWctPlUxQkNfTEVEQ29uZmlndXJlICYgMHgxMCkgKSAvLyBDaGVjayB0aGUgTEVEXzAKIAkJCQkJewogCQkJCQkJLy9UcnkgdG8gdHVybiBPTiBMRURfMCBhZnRlciBncmF5IGJsaW5raW5nCi0JCQkJCQlwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gMHgxMDsKKwkJCQkJCXJlZy0+VTFCQ19MRURDb25maWd1cmUgfD0gMHgxMDsKIAkJCQkJCXBId0RhdGEtPkxFRF9CbGlua2luZyA9IDE7IC8vU3RhcnQgYmxpbmtpbmcKIAkJCQkJCVRpbWVJbnRlcnZhbCA9IDUwOwogCQkJCQl9CiAJCQkJfQogCQkJCWVsc2UKIAkJCQl7Ci0JCQkJCWlmKCBwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgJiAweDEwICkgLy8gQ2hlY2sgdGhlIExFRF8wCisJCQkJCWlmKCByZWctPlUxQkNfTEVEQ29uZmlndXJlICYgMHgxMCApIC8vIENoZWNrIHRoZSBMRURfMAogCQkJCQl7Ci0JCQkJCQlwV2IzNVJlZy0+VTFCQ19MRURDb25maWd1cmUgJj0gfjB4MTA7Ci0JCQkJCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDAzYmMsIHBXYjM1UmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOworCQkJCQkJcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSAmPSB+MHgxMDsKKwkJCQkJCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDNiYywgcmVnLT5VMUJDX0xFRENvbmZpZ3VyZSApOwogCQkJCQl9CiAJCQkJfQogCQkJCWJyZWFrOwpAQCAtNzIwLDg0ICszMDMsMjQwIEBACiAJfQogCiAJcEh3RGF0YS0+dGltZV9jb3VudCArPSBUaW1lSW50ZXJ2YWw7Ci0JV2IzNVR4X0N1cnJlbnRUaW1lKCBwSHdEYXRhLCBwSHdEYXRhLT50aW1lX2NvdW50ICk7IC8vIDIwMDYwOTI4IGFkZAotCU9TX1RJTUVSX1NFVCggJnBId0RhdGEtPkxFRFRpbWVyLCBUaW1lSW50ZXJ2YWwgKTsgLy8gMjAwNjA2MjMuMQorCVdiMzVUeF9DdXJyZW50VGltZShhZGFwdGVyLCBwSHdEYXRhLT50aW1lX2NvdW50KTsgLy8gMjAwNjA5MjggYWRkCisJcEh3RGF0YS0+TEVEVGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKFRpbWVJbnRlcnZhbCk7CisJYWRkX3RpbWVyKCZwSHdEYXRhLT5MRURUaW1lcik7Cit9CisKK3U4IGhhbF9pbml0X2hhcmR3YXJlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCB3YnNvZnRfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCXBod19kYXRhX3QgcEh3RGF0YSA9ICZwcml2LT5zSHdEYXRhOworCXUxNiBTb2Z0d2FyZVNldDsKKworCS8vIEluaXRpYWwgdGhlIHZhcmlhYmxlCisJcEh3RGF0YS0+TWF4UmVjZWl2ZUxpZmVUaW1lID0gREVGQVVMVF9NU0RVX0xJRkVfVElNRTsgLy8gU2V0dGluZyBSeCBtYXhpbXVtIE1TRFUgbGlmZSB0aW1lCisJcEh3RGF0YS0+RnJhZ21lbnRUaHJlc2hvbGQgPSBERUZBVUxUX0ZSQUdNRU5UX1RIUkVTSE9MRDsgLy8gU2V0dGluZyBkZWZhdWx0IGZyYWdtZW50IHRocmVzaG9sZAorCisJcEh3RGF0YS0+SW5pdGlhbFJlc291cmNlID0gMTsKKwlpZiggV2IzNVJlZ19pbml0aWFsKHBId0RhdGEpKSB7CisJCXBId0RhdGEtPkluaXRpYWxSZXNvdXJjZSA9IDI7CisJCWlmIChXYjM1VHhfaW5pdGlhbChwSHdEYXRhKSkgeworCQkJcEh3RGF0YS0+SW5pdGlhbFJlc291cmNlID0gMzsKKwkJCWlmIChXYjM1UnhfaW5pdGlhbChwSHdEYXRhKSkgeworCQkJCXBId0RhdGEtPkluaXRpYWxSZXNvdXJjZSA9IDQ7CisJCQkJaW5pdF90aW1lcigmcEh3RGF0YS0+TEVEVGltZXIpOworCQkJCXBId0RhdGEtPkxFRFRpbWVyLmZ1bmN0aW9uID0gaGFsX2xlZF9jb250cm9sOworCQkJCXBId0RhdGEtPkxFRFRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgcHJpdjsKKwkJCQlwSHdEYXRhLT5MRURUaW1lci5leHBpcmVzID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCk7CisJCQkJYWRkX3RpbWVyKCZwSHdEYXRhLT5MRURUaW1lcik7CisKKwkJCQkvLworCQkJCS8vIEZvciByZXN0cmljdCB0byB2ZW5kb3IncyBoYXJkd2FyZQorCQkJCS8vCisJCQkJU29mdHdhcmVTZXQgPSBoYWxfc29mdHdhcmVfc2V0KCBwSHdEYXRhICk7CisKKwkJCQkjaWZkZWYgVmVuZG9yMgorCQkJCS8vIFRyeSB0byBtYWtlIHN1cmUgdGhlIEVFUFJPTSBjb250YWluCisJCQkJU29mdHdhcmVTZXQgPj49IDg7CisJCQkJaWYoIFNvZnR3YXJlU2V0ICE9IDB4ODIgKQorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJI2VuZGlmCisKKwkJCQlXYjM1Unhfc3RhcnQoaHcpOworCQkJCVdiMzVUeF9FUDJWTV9zdGFydChwcml2KTsKKworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJfQorCisJcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgPSAxOworCXJldHVybiBmYWxzZTsKIH0KIAogCit2b2lkIGhhbF9oYWx0KHBod19kYXRhX3QgcEh3RGF0YSwgdm9pZCAqcHBhX2RhdGEpCit7CisJc3dpdGNoKCBwSHdEYXRhLT5Jbml0aWFsUmVzb3VyY2UgKQorCXsKKwkJY2FzZSA0OgorCQljYXNlIDM6IGRlbF90aW1lcl9zeW5jKCZwSHdEYXRhLT5MRURUaW1lcik7CisJCQltc2xlZXAoMTAwKTsgLy8gV2FpdCBmb3IgVGltZXIgRFBDIGV4aXQgOTQwNjIzLjIKKwkJCVdiMzVSeF9kZXN0cm95KCBwSHdEYXRhICk7IC8vIFJlbGVhc2UgdGhlIFJ4CisJCWNhc2UgMjogV2IzNVR4X2Rlc3Ryb3koIHBId0RhdGEgKTsgLy8gUmVsZWFzZSB0aGUgVHgKKwkJY2FzZSAxOiBXYjM1UmVnX2Rlc3Ryb3koIHBId0RhdGEgKTsgLy8gUmVsZWFzZSB0aGUgV2IzNSBSZWdpc3N0ZXIgcmVzb3VyY2VzCisJfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCBoYWxfc2V0X2JlYWNvbl9wZXJpb2QoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MTYgYmVhY29uX3BlcmlvZCApCit7CisJdTMyCXRtcDsKKworCWlmKCBwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSApIHJldHVybjsKKworCXBId0RhdGEtPkJlYWNvblBlcmlvZCA9IGJlYWNvbl9wZXJpb2Q7CisJdG1wID0gcEh3RGF0YS0+QmVhY29uUGVyaW9kIDw8IDE2OworCXRtcCB8PSBwSHdEYXRhLT5Qcm9iZURlbGF5OworCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDg0OCwgdG1wICk7Cit9CisKKworc3RhdGljIHZvaWQgaGFsX3NldF9jdXJyZW50X2NoYW5uZWxfZXgoICBwaHdfZGF0YV90IHBId0RhdGEsICBDaGFuSW5mbyBjaGFubmVsICkKK3sKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZyA9ICZwSHdEYXRhLT5yZWc7CisKKwlpZiggcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgKQorCQlyZXR1cm47CisKKwlwcmludGsoIkdvaW5nIHRvIGNoYW5uZWw6ICVkLyVkXG4iLCBjaGFubmVsLmJhbmQsIGNoYW5uZWwuQ2hhbk5vKTsKKworCVJGU3ludGhlc2l6ZXJfU3dpdGNoaW5nQ2hhbm5lbCggcEh3RGF0YSwgY2hhbm5lbCApOy8vIFN3aXRjaCBjaGFubmVsCisJcEh3RGF0YS0+Q2hhbm5lbCA9IGNoYW5uZWwuQ2hhbk5vOworCXBId0RhdGEtPmJhbmQgPSBjaGFubmVsLmJhbmQ7CisJI2lmZGVmIF9QRV9TVEFURV9EVU1QXworCVdCREVCVUcoKCJTZXQgY2hhbm5lbCBpcyAlZCwgYmFuZCA9JWRcbiIsIHBId0RhdGEtPkNoYW5uZWwsIHBId0RhdGEtPmJhbmQpKTsKKwkjZW5kaWYKKwlyZWctPk0yOF9NYWNDb250cm9sICY9IH4weGZmOyAvLyBDbGVhbiBjaGFubmVsIGluZm9ybWF0aW9uIGZpZWxkCisJcmVnLT5NMjhfTWFjQ29udHJvbCB8PSBjaGFubmVsLkNoYW5ObzsKKwlXYjM1UmVnX1dyaXRlV2l0aENhbGxiYWNrVmFsdWUoIHBId0RhdGEsIDB4MDgyOCwgcmVnLT5NMjhfTWFjQ29udHJvbCwKKwkJCQkJKHM4ICopJmNoYW5uZWwsIHNpemVvZihDaGFuSW5mbykpOworfQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZvaWQgaGFsX3NldF9jdXJyZW50X2NoYW5uZWwoICBwaHdfZGF0YV90IHBId0RhdGEsICBDaGFuSW5mbyBjaGFubmVsICkKK3sKKwloYWxfc2V0X2N1cnJlbnRfY2hhbm5lbF9leCggcEh3RGF0YSwgY2hhbm5lbCApOworfQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZvaWQgaGFsX3NldF9hY2NlcHRfYnJvYWRjYXN0KCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggZW5hYmxlICkKK3sKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZyA9ICZwSHdEYXRhLT5yZWc7CisKKwlpZiggcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgKSByZXR1cm47CisKKwlyZWctPk0wMF9NYWNDb250cm9sICY9IH4weDAyMDAwMDAwOy8vVGhlIEhXIHZhbHVlCisKKwlpZiAoZW5hYmxlKQorCQlyZWctPk0wMF9NYWNDb250cm9sIHw9IDB4MDIwMDAwMDA7Ly9UaGUgSFcgdmFsdWUKKworCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDgwMCwgcmVnLT5NMDBfTWFjQ29udHJvbCApOworfQorCisvL2ZvciB3ZXAga2V5IGVycm9yIGRldGVjdGlvbiwgd2UgbmVlZCB0byBhY2NlcHQgYnJvYWRjYXN0IHBhY2tldHMgdG8gYmUgcmVjZWl2ZWQgdGVtcG9yYXJ5Lgordm9pZCBoYWxfc2V0X2FjY2VwdF9wcm9taXNjdW91cyggcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggZW5hYmxlKQoreworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKKworCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSkgcmV0dXJuOworCWlmIChlbmFibGUpIHsKKwkJcmVnLT5NMDBfTWFjQ29udHJvbCB8PSAweDAwNDAwMDAwOworCQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDA4MDAsIHJlZy0+TTAwX01hY0NvbnRyb2wgKTsKKwl9IGVsc2UgeworCQlyZWctPk0wMF9NYWNDb250cm9sJj1+MHgwMDQwMDAwMDsKKwkJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwODAwLCByZWctPk0wMF9NYWNDb250cm9sICk7CisJfQorfQorCit2b2lkIGhhbF9zZXRfYWNjZXB0X211bHRpY2FzdCggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4IGVuYWJsZSApCit7CisJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOworCisJaWYoIHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlICkgcmV0dXJuOworCisJcmVnLT5NMDBfTWFjQ29udHJvbCAmPSB+MHgwMTAwMDAwMDsvL1RoZSBIVyB2YWx1ZQorCWlmIChlbmFibGUpICByZWctPk0wMF9NYWNDb250cm9sIHw9IDB4MDEwMDAwMDA7Ly9UaGUgSFcgdmFsdWUKKwlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDA4MDAsIHJlZy0+TTAwX01hY0NvbnRyb2wgKTsKK30KKwordm9pZCBoYWxfc2V0X2FjY2VwdF9iZWFjb24oICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCBlbmFibGUgKQoreworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKKworCWlmKCBwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSApIHJldHVybjsKKworCS8vIDIwMDQwMTA4IGRlYnVnCisJaWYoICFlbmFibGUgKS8vRHVlIHRvIFNNRSBhbmQgTUxNRSBhcmUgbm90IHN1aXRhYmxlIGZvciAzNQorCQlyZXR1cm47CisKKwlyZWctPk0wMF9NYWNDb250cm9sICY9IH4weDA0MDAwMDAwOy8vVGhlIEhXIHZhbHVlCisJaWYoIGVuYWJsZSApCisJCXJlZy0+TTAwX01hY0NvbnRyb2wgfD0gMHgwNDAwMDAwMDsvL1RoZSBIVyB2YWx1ZQorCisJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwODAwLCByZWctPk0wMF9NYWNDb250cm9sICk7Cit9CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIGhhbF9zdG9wKCAgcGh3X2RhdGFfdCBwSHdEYXRhICkKK3sKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZyA9ICZwSHdEYXRhLT5yZWc7CisKKwlwSHdEYXRhLT5XYjM1UngucnhfaGFsdCA9IDE7CisJV2IzNVJ4X3N0b3AoIHBId0RhdGEgKTsKKworCXBId0RhdGEtPldiMzVUeC50eF9oYWx0ID0gMTsKKwlXYjM1VHhfc3RvcCggcEh3RGF0YSApOworCisJcmVnLT5EMDBfRG1hQ29udHJvbCAmPSB+MHhjMDAwMDAwMDsvL1R4IE9mZiwgUnggT2ZmCisJV2IzNVJlZ19Xcml0ZSggcEh3RGF0YSwgMHgwNDAwLCByZWctPkQwMF9EbWFDb250cm9sICk7Cit9CisKK3Vuc2lnbmVkIGNoYXIgaGFsX2lkbGUocGh3X2RhdGFfdCBwSHdEYXRhKQoreworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKKwlQV0JVU0IJcFdiVXNiID0gJnBId0RhdGEtPldiVXNiOworCisJaWYoICFwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSAmJiAoIHBXYlVzYi0+RGV0ZWN0Q291bnQgfHwgcmVnLT5FUDB2bV9zdGF0ZSE9Vk1fU1RPUCApICkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogdm9pZCBoYWxfc2V0X3BoeV90eXBlKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggUGh5VHlwZSApCiB7CiAJcEh3RGF0YS0+cGh5X3R5cGUgPSBQaHlUeXBlOwogfQogCi12b2lkIGhhbF9nZXRfcGh5X3R5cGUoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCAqUGh5VHlwZSApCi17Ci0JKlBoeVR5cGUgPSBwSHdEYXRhLT5waHlfdHlwZTsKLX0KLQotdm9pZCBoYWxfcmVzZXRfY291bnRlciggIHBod19kYXRhX3QgcEh3RGF0YSApCi17Ci0JcEh3RGF0YS0+ZHRvX3R4X3JldHJ5X2NvdW50ID0gMDsKLQlwSHdEYXRhLT5kdG9fdHhfZnJhZ19jb3VudCA9IDA7Ci0JbWVtc2V0KCBwSHdEYXRhLT50eF9yZXRyeV9jb3VudCwgMCwgOCk7Ci19Ci0KIHZvaWQgaGFsX3NldF9yYWRpb19tb2RlKCBwaHdfZGF0YV90IHBId0RhdGEsICB1bnNpZ25lZCBjaGFyIHJhZGlvX29mZikKIHsKLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKIAogCWlmKCBwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSApIHJldHVybjsKIAogCWlmIChyYWRpb19vZmYpCS8vZGlzYWJsZSBCYXNlYmFuZCByZWNlaXZlIG9mZgogCXsKIAkJcEh3RGF0YS0+Q3VycmVudFJhZGlvU3cgPSAxOyAvLyBvZmYKLQkJcFdiMzVSZWctPk0yNF9NYWNDb250cm9sICY9IDB4ZmZmZmZmYmY7CisJCXJlZy0+TTI0X01hY0NvbnRyb2wgJj0gMHhmZmZmZmZiZjsKIAl9CiAJZWxzZQogCXsKIAkJcEh3RGF0YS0+Q3VycmVudFJhZGlvU3cgPSAwOyAvLyBvbgotCQlwV2IzNVJlZy0+TTI0X01hY0NvbnRyb2wgfD0gMHgwMDAwMDA0MDsKKwkJcmVnLT5NMjRfTWFjQ29udHJvbCB8PSAweDAwMDAwMDQwOwogCX0KLQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDA4MjQsIHBXYjM1UmVnLT5NMjRfTWFjQ29udHJvbCApOworCVdiMzVSZWdfV3JpdGUoIHBId0RhdGEsIDB4MDgyNCwgcmVnLT5NMjRfTWFjQ29udHJvbCApOwogfQogCiB1OCBoYWxfZ2V0X2FudGVubmFfbnVtYmVyKCAgcGh3X2RhdGFfdCBwSHdEYXRhICkKIHsKLQlQV0IzNVJFRwlwV2IzNVJlZyA9ICZwSHdEYXRhLT5XYjM1UmVnOworCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKIAotCWlmICgocFdiMzVSZWctPkJCMkMgJiBCSVQoMTEpKSA9PSAwKQorCWlmICgocmVnLT5CQjJDICYgQklUKDExKSkgPT0gMCkKIAkJcmV0dXJuIDA7CiAJZWxzZQogCQlyZXR1cm4gMTsKIH0KIAotdm9pZCBoYWxfc2V0X2FudGVubmFfbnVtYmVyKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCB1OCBudW1iZXIgKQotewotCi0JUFdCMzVSRUcJcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKLQotCWlmIChudW1iZXIgPT0gMSkgewotCQlwV2IzNVJlZy0+QkIyQyB8PSBCSVQoMTEpOwotCX0gZWxzZSB7Ci0JCXBXYjM1UmVnLT5CQjJDICY9IH5CSVQoMTEpOwotCX0KLQlXYjM1UmVnX1dyaXRlKCBwSHdEYXRhLCAweDEwMmMsIHBXYjM1UmVnLT5CQjJDICk7Ci0jaWZkZWYgX1BFX1NUQVRFX0RVTVBfCi0JV0JERUJVRygoIkN1cnJlbnQgYW50ZW5uYSBudW1iZXIgOiAlZFxuIiwgbnVtYmVyKSk7Ci0jZW5kaWYKLX0KLQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLzAgOiByYWRpbyBvbjsgMTogcmFkaW8gb2ZmCiB1OCBoYWxfZ2V0X2h3X3JhZGlvX29mZiggIHBod19kYXRhX3QgcEh3RGF0YSApCiB7Ci0JUFdCMzVSRUcJcFdiMzVSZWcgPSAmcEh3RGF0YS0+V2IzNVJlZzsKKwlzdHJ1Y3Qgd2IzNV9yZWcgKnJlZyA9ICZwSHdEYXRhLT5yZWc7CiAKIAlpZiggcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgKSByZXR1cm4gMTsKIAogCS8vcmVhZCB0aGUgYml0MTYgb2YgcmVnaXN0ZXIgVTFCMAotCVdiMzVSZWdfUmVhZCggcEh3RGF0YSwgMHgzYjAsICZwV2IzNVJlZy0+VTFCMCApOwotCWlmICgocFdiMzVSZWctPlUxQjAgJiAweDAwMDEwMDAwKSkgeworCVdiMzVSZWdfUmVhZCggcEh3RGF0YSwgMHgzYjAsICZyZWctPlUxQjAgKTsKKwlpZiAoKHJlZy0+VTFCMCAmIDB4MDAwMTAwMDApKSB7CiAJCXBId0RhdGEtPkN1cnJlbnRSYWRpb0h3ID0gMTsKIAkJcmV0dXJuIDE7CiAJfSBlbHNlIHsKQEAgLTgyMyw1NiArNTYyLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi12b2lkIGhhbF9zY2FuX3N0YXR1c19pbmRpY2F0ZShwaHdfZGF0YV90IHBId0RhdGEsIHVuc2lnbmVkIGNoYXIgSXNPblByb2dyZXNzKQotewotCWlmKCBwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSApIHJldHVybjsKLQlwSHdEYXRhLT5MRURfU2Nhbm5pbmcgPSBJc09uUHJvZ3Jlc3MgPyAxIDogMDsKLX0KLQotdm9pZCBoYWxfc3lzdGVtX3Bvd2VyX2NoYW5nZShwaHdfZGF0YV90IHBId0RhdGEsIHUzMiBQb3dlclN0YXRlKQotewotCWlmKCBQb3dlclN0YXRlICE9IDAgKQotCXsKLQkJcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgPSAxOwotCQlpZiggcEh3RGF0YS0+V2JVc2IuSXNVc2IyMCApCi0JCQloYWxfc3RvcCggcEh3RGF0YSApOwotCX0KLQllbHNlCi0JewotCQlpZiggIXBId0RhdGEtPldiVXNiLklzVXNiMjAgKQotCQkJaGFsX3N0b3AoIHBId0RhdGEgKTsKLQl9Ci19Ci0KLXZvaWQgaGFsX3N1cnByaXNlX3JlbW92ZSggIHBod19kYXRhX3QgcEh3RGF0YSApCi17Ci0JUEFEQVBURVIgQWRhcHRlciA9IHBId0RhdGEtPkFkYXB0ZXI7Ci0JaWYgKE9TX0FUT01JQ19JTkMoIEFkYXB0ZXIsICZwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZUNvdW50ICkgPT0gMSkgewotCQkjaWZkZWYgX1BFX1NUQVRFX0RVTVBfCi0JCVdCREVCVUcoKCJDYWxsaW5nIGhhbF9zdXJwcmlzZV9yZW1vdmVcbiIpKTsKLQkJI2VuZGlmCi0JCU9TX1NUT1AoIEFkYXB0ZXIgKTsKLQl9Ci19Ci0KLXZvaWQgaGFsX3JhdGVfY2hhbmdlKCAgcGh3X2RhdGFfdCBwSHdEYXRhICkgLy8gTm90aWZ5IHRoZSBIQUwgcmF0ZSBpcyBjaGFuZ2luZyAyMDA2MDYxMy4xCi17Ci0JUEFEQVBURVIJQWRhcHRlciA9IHBId0RhdGEtPkFkYXB0ZXI7Ci0JdTgJCXJhdGUgPSBDVVJSRU5UX1RYX1JBVEU7Ci0KLQlCQlByb2Nlc3Nvcl9SYXRlQ2hhbmdpbmcoIHBId0RhdGEsIHJhdGUgKTsKLX0KLQogdm9pZCBoYWxfc2V0X3JmX3Bvd2VyKHBod19kYXRhX3QgcEh3RGF0YSwgdTggUG93ZXJJbmRleCkKIHsKIAlSRlN5bnRoZXNpemVyX1NldFBvd2VySW5kZXgoIHBId0RhdGEsIFBvd2VySW5kZXggKTsKIH0KLQotdW5zaWduZWQgY2hhciBoYWxfc2V0X0xFRChwaHdfZGF0YV90IHBId0RhdGEsIHUzMiBNb2RlKSAvLyAyMDA2MTEwOCBmb3IgV1BTIGxlZCBjb250cm9sCi17Ci0JcEh3RGF0YS0+TEVEX0JsaW5raW5nID0gMDsKLQlwSHdEYXRhLT5MRURfY29udHJvbCA9IE1vZGU7Ci0JT1NfVElNRVJfU0VUKCAmcEh3RGF0YS0+TEVEVGltZXIsIDEwICk7IC8vIDIwMDYwNjIzCi0JcmV0dXJuIFRSVUU7Ci19Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diaGFsX2YuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diaGFsX2YuaAppbmRleCBlYTk1MzFhLi5lODA1ZjQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmhhbF9mLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JoYWxfZi5oCkBAIC0xLDI1ICsxLDE5IEBACiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gRGV2aWNlIHJlbGF0ZWQgaW5jbHVkZQogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSNpZmRlZiBXQl9MSU5VWAotCSNpbmNsdWRlICJsaW51eC93YnVzYl9mLmgiCi0JI2luY2x1ZGUgImxpbnV4L3diMzVyZWdfZi5oIgotCSNpbmNsdWRlICJsaW51eC93YjM1dHhfZi5oIgotCSNpbmNsdWRlICJsaW51eC93YjM1cnhfZi5oIgotI2Vsc2UKLQkjaW5jbHVkZSAid2J1c2JfZi5oIgotCSNpbmNsdWRlICJ3YjM1cmVnX2YuaCIKLQkjaW5jbHVkZSAid2IzNXR4X2YuaCIKLQkjaW5jbHVkZSAid2IzNXJ4X2YuaCIKLSNlbmRpZgorI2luY2x1ZGUgIndiMzVyZWdfZi5oIgorI2luY2x1ZGUgIndiMzV0eF9mLmgiCisjaW5jbHVkZSAid2IzNXJ4X2YuaCIKKworI2luY2x1ZGUgImNvcmUuaCIKIAogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC8vIEZ1bmN0aW9uIGRlY2xhcmF0aW9uCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogdm9pZCBoYWxfcmVtb3ZlX21hcHBpbmdfa2V5KCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggKnBtYWNfYWRkciApOwogdm9pZCBoYWxfcmVtb3ZlX2RlZmF1bHRfa2V5KCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTMyIGluZGV4ICk7Ci11bnNpZ25lZCBjaGFyIGhhbF9zZXRfbWFwcGluZ19rZXkoICBwaHdfZGF0YV90IEFkYXB0ZXIsICB1OCAqcG1hY19hZGRyLCAgdTggbnVsbF9rZXksICB1OCB3ZXBfb24sICB1OCAqcHR4X3RzYywgIHU4ICpwcnhfdHNjLCAgdTgga2V5X3R5cGUsICB1OCBrZXlfbGVuLCAgdTggKnBrZXlfZGF0YSApOwotdW5zaWduZWQgY2hhciBoYWxfc2V0X2RlZmF1bHRfa2V5KCAgcGh3X2RhdGFfdCBBZGFwdGVyLCAgdTggaW5kZXgsICB1OCBudWxsX2tleSwgIHU4IHdlcF9vbiwgIHU4ICpwdHhfdHNjLCAgdTggKnByeF90c2MsICB1OCBrZXlfdHlwZSwgIHU4IGtleV9sZW4sICB1OCAqcGtleV9kYXRhICk7Cit1bnNpZ25lZCBjaGFyIGhhbF9zZXRfbWFwcGluZ19rZXkoICBwaHdfZGF0YV90IGFkYXB0ZXIsICB1OCAqcG1hY19hZGRyLCAgdTggbnVsbF9rZXksICB1OCB3ZXBfb24sICB1OCAqcHR4X3RzYywgIHU4ICpwcnhfdHNjLCAgdTgga2V5X3R5cGUsICB1OCBrZXlfbGVuLCAgdTggKnBrZXlfZGF0YSApOwordW5zaWduZWQgY2hhciBoYWxfc2V0X2RlZmF1bHRfa2V5KCAgcGh3X2RhdGFfdCBhZGFwdGVyLCAgdTggaW5kZXgsICB1OCBudWxsX2tleSwgIHU4IHdlcF9vbiwgIHU4ICpwdHhfdHNjLCAgdTggKnByeF90c2MsICB1OCBrZXlfdHlwZSwgIHU4IGtleV9sZW4sICB1OCAqcGtleV9kYXRhICk7CiB2b2lkIGhhbF9jbGVhcl9hbGxfZGVmYXVsdF9rZXkoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKIHZvaWQgaGFsX2NsZWFyX2FsbF9ncm91cF9rZXkoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKIHZvaWQgaGFsX2NsZWFyX2FsbF9tYXBwaW5nX2tleSggIHBod19kYXRhX3QgcEh3RGF0YSApOwpAQCAtMjcsMTQgKzIxLDExIEBACiB2b2lkIGhhbF9nZXRfZXRoZXJuZXRfYWRkcmVzcyggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4ICpjdXJyZW50X2FkZHJlc3MgKTsKIHZvaWQgaGFsX3NldF9ldGhlcm5ldF9hZGRyZXNzKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggKmN1cnJlbnRfYWRkcmVzcyApOwogdm9pZCBoYWxfZ2V0X3Blcm1hbmVudF9hZGRyZXNzKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggKnBldGhlcm5ldF9hZGRyZXNzICk7Ci11bnNpZ25lZCBjaGFyIGhhbF9pbml0X2hhcmR3YXJlKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgUEFEQVBURVIgQWRhcHRlciApOwordTggaGFsX2luaXRfaGFyZHdhcmUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwogdm9pZCBoYWxfc2V0X3Bvd2VyX3NhdmVfbW9kZSggIHBod19kYXRhX3QgcEh3RGF0YSwgIHVuc2lnbmVkIGNoYXIgcG93ZXJfc2F2ZSwgIHVuc2lnbmVkIGNoYXIgd2FrZXVwLCAgdW5zaWduZWQgY2hhciBkdGltICk7CiB2b2lkIGhhbF9nZXRfcG93ZXJfc2F2ZV9tb2RlKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgIHU4ICpwaW5fcHdyX3NhdmUgKTsKIHZvaWQgaGFsX3NldF9zbG90X3RpbWUoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCB0eXBlICk7CiAjZGVmaW5lIGhhbF9zZXRfYXRpbV93aW5kb3coIF9BLCBfQVRNICkKLXZvaWQgaGFsX3NldF9yYXRlcyggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4ICpwYnNzX3JhdGVzLCAgdTggbGVuZ3RoLCAgdW5zaWduZWQgY2hhciBiYXNpY19yYXRlX3NldCApOwotI2RlZmluZSBoYWxfc2V0X2Jhc2ljX3JhdGVzKCBfQSwgX1IsIF9MICkgaGFsX3NldF9yYXRlcyggX0EsIF9SLCBfTCwgVFJVRSApCi0jZGVmaW5lIGhhbF9zZXRfb3BfcmF0ZXMoIF9BLCBfUiwgX0wgKSBoYWxfc2V0X3JhdGVzKCBfQSwgX1IsIF9MLCBGQUxTRSApCiB2b2lkIGhhbF9zdGFydF9ic3MoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCBtYWNfb3BfbW9kZSApOwogdm9pZCBoYWxfam9pbl9yZXF1ZXN0KCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggYnNzX3R5cGUgKTsgLy8gMDpCU1MgU1RBIDE6SUJTUyBTVEEvLwogdm9pZCBoYWxfc3RvcF9zeW5jX2JzcyggIHBod19kYXRhX3QgcEh3RGF0YSApOwpAQCAtNDcsMzkgKzM4LDI1IEBACiB2b2lkIGhhbF9zZXRfY2FwX2luZm8oICBwaHdfZGF0YV90IHBId0RhdGEsICB1MTYgY2FwYWJpbGl0eV9pbmZvICk7CiB2b2lkIGhhbF9zZXRfc3NpZCggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4ICpwc3NpZCwgIHU4IHNzaWRfbGVuICk7CiB2b2lkIGhhbF9zZXRfY3VycmVudF9jaGFubmVsKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgQ2hhbkluZm8gY2hhbm5lbCApOwotdm9pZCBoYWxfc2V0X2N1cnJlbnRfY2hhbm5lbF9leCggIHBod19kYXRhX3QgcEh3RGF0YSwgIENoYW5JbmZvIGNoYW5uZWwgKTsKLXZvaWQgaGFsX2dldF9jdXJyZW50X2NoYW5uZWwoICBwaHdfZGF0YV90IHBId0RhdGEsICBDaGFuSW5mbyAqY2hhbm5lbCApOwogdm9pZCBoYWxfc2V0X2FjY2VwdF9icm9hZGNhc3QoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCBlbmFibGUgKTsKIHZvaWQgaGFsX3NldF9hY2NlcHRfbXVsdGljYXN0KCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggZW5hYmxlICk7CiB2b2lkIGhhbF9zZXRfYWNjZXB0X2JlYWNvbiggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4IGVuYWJsZSApOwotdm9pZCBoYWxfc2V0X211bHRpY2FzdF9hZGRyZXNzKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggKmFkZHJlc3MsICB1OCBudW1iZXIgKTsKLXU4IGhhbF9nZXRfYWNjZXB0X2JlYWNvbiggIHBod19kYXRhX3QgcEh3RGF0YSApOwogdm9pZCBoYWxfc3RvcCggIHBod19kYXRhX3QgcEh3RGF0YSApOwogdm9pZCBoYWxfaGFsdCggIHBod19kYXRhX3QgcEh3RGF0YSwgdm9pZCAqcHBhX2RhdGEgKTsKIHZvaWQgaGFsX3N0YXJ0X3R4MCggIHBod19kYXRhX3QgcEh3RGF0YSApOwogdm9pZCBoYWxfc2V0X3BoeV90eXBlKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggUGh5VHlwZSApOwotdm9pZCBoYWxfZ2V0X3BoeV90eXBlKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTggKlBoeVR5cGUgKTsKLXVuc2lnbmVkIGNoYXIgaGFsX3Jlc2V0X2hhcmR3YXJlKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdm9pZCogcHBhICk7Ci12b2lkIGhhbF9zZXRfY3dtaW4oICBwaHdfZGF0YV90IHBId0RhdGEsICB1OAljd2luX21pbiApOwogI2RlZmluZSBoYWxfZ2V0X2N3bWluKCBfQSApICggKF9BKS0+Y3dtaW4gKQogdm9pZCBoYWxfc2V0X2N3bWF4KCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IGN3aW5fbWF4ICk7CiAjZGVmaW5lIGhhbF9nZXRfY3dtYXgoIF9BICkgKCAoX0EpLT5jd21heCApCiB2b2lkIGhhbF9zZXRfcnNuX3dwYSggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUzMiAqIFJTTl9JRV9CaXRtYXAgLCB1MzIgKiBSU05fT1VJX3R5cGUgLCB1bnNpZ25lZCBjaGFyIGJEZXNpcmVkQXV0aE1vZGUpOwotLy9zMzIgaGFsX2dldF9yc3NpKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTMyIEhhbFJzc2kgKTsKLXMzMiBoYWxfZ2V0X3Jzc2koICBwaHdfZGF0YV90IHBId0RhdGEsICB1MzIgKkhhbFJzc2lBcnJ5LCAgdTggQ291bnQgKTsKLXMzMiBoYWxfZ2V0X3Jzc2lfYnNzKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IGlkeCwgIHU4IENvdW50ICk7CiB2b2lkIGhhbF9zZXRfY29ubmVjdF9pbmZvKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdW5zaWduZWQgY2hhciBib0Nvbm5lY3QgKTsKIHU4IGhhbF9nZXRfZXN0X3NxMyggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4IENvdW50ICk7Ci12b2lkIGhhbF9sZWRfY29udHJvbF8xYSggIHBod19kYXRhX3QgcEh3RGF0YSApOwotdm9pZCBoYWxfbGVkX2NvbnRyb2woICB2b2lkKiBTMSwgIHBod19kYXRhX3QgcEh3RGF0YSwgIHZvaWQqIFMzLCAgdm9pZCogUzQgKTsKIHZvaWQgaGFsX3NldF9yZl9wb3dlciggIHBod19kYXRhX3QgcEh3RGF0YSwgIHU4IFBvd2VySW5kZXggKTsgLy8gMjAwNjA2MjEgTW9kaWZ5Ci12b2lkIGhhbF9yZXNldF9jb3VudGVyKCAgcGh3X2RhdGFfdCBwSHdEYXRhICk7CiB2b2lkIGhhbF9zZXRfcmFkaW9fbW9kZSggIHBod19kYXRhX3QgcEh3RGF0YSwgIHVuc2lnbmVkIGNoYXIgYm9WYWx1ZSk7CiB2b2lkIGhhbF9kZXNjcmlwdG9yX2luZGljYXRlKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgUERFU0NSSVBUT1IgcERlcyApOwogdTggaGFsX2dldF9hbnRlbm5hX251bWJlciggIHBod19kYXRhX3QgcEh3RGF0YSApOwotdm9pZCBoYWxfc2V0X2FudGVubmFfbnVtYmVyKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCB1OCBudW1iZXIgKTsKIHUzMiBoYWxfZ2V0X2Jzc19wa19jbnQoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLSNkZWZpbmUgaGFsX2dldF9yZWdpb25fZnJvbV9FRVBST00oIF9BICkgKCAoX0EpLT5XYjM1UmVnLkVFUFJPTVJlZ2lvbiApCisjZGVmaW5lIGhhbF9nZXRfcmVnaW9uX2Zyb21fRUVQUk9NKCBfQSApICggKF9BKS0+cmVnLkVFUFJPTVJlZ2lvbiApCiB2b2lkIGhhbF9zZXRfYWNjZXB0X3Byb21pc2N1b3VzCQkoICBwaHdfZGF0YV90IHBId0RhdGEsICB1OCBlbmFibGUpOwogI2RlZmluZSBoYWxfZ2V0X3R4X2J1ZmZlciggX0EsIF9CICkgV2IzNVR4X2dldF90eF9idWZmZXIoIF9BLCBfQiApCiB1OCBoYWxfZ2V0X2h3X3JhZGlvX29mZgkJCSggIHBod19kYXRhX3QgcEh3RGF0YSApOwpAQCAtODgsMjAgKzY1LDEzIEBACiAjZGVmaW5lIGhhbF9yc3NpX2JvdW5kYXJ5X2hpZ2goIF9BICkgKF9BLT5SU1NJX2hpZ2gpCiAjZGVmaW5lIGhhbF9yc3NpX2JvdW5kYXJ5X2xvdyggX0EgKSAoX0EtPlJTU0lfbG93KQogI2RlZmluZSBoYWxfc2Nhbl9pbnRlcnZhbCggX0EgKQkJKF9BLT5TY2FuX0ludGVydmFsKQotdm9pZCBoYWxfc2Nhbl9zdGF0dXNfaW5kaWNhdGUoICBwaHdfZGF0YV90IHBId0RhdGEsIHU4IHN0YXR1cyk7CS8vIDA6IGNvbXBsZXRlLCAxOiBpbiBwcm9ncmVzcwotdm9pZCBoYWxfc3lzdGVtX3Bvd2VyX2NoYW5nZSggIHBod19kYXRhX3QgcEh3RGF0YSwgdTMyIFBvd2VyU3RhdGUgKTsgLy8gMjAwNTEyMzAgLT1EMCAxPUQxIC4uCi12b2lkIGhhbF9zdXJwcmlzZV9yZW1vdmUoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKIAogI2RlZmluZSBQSFlfREVCVUcoIG1zZywgYXJncy4uLiApCiAKLQotCi12b2lkIGhhbF9yYXRlX2NoYW5nZSggIHBod19kYXRhX3QgcEh3RGF0YSApOyAvLyBOb3RpZnkgdGhlIEhBTCByYXRlIGlzIGNoYW5naW5nIDIwMDYwNjEzLjEKIHVuc2lnbmVkIGNoYXIgaGFsX2dldF9keHhfcmVnKCAgcGh3X2RhdGFfdCBwSHdEYXRhLCAgdTE2IG51bWJlciwgIHUzMiAqIHBWYWx1ZSApOwogdW5zaWduZWQgY2hhciBoYWxfc2V0X2R4eF9yZWcoICBwaHdfZGF0YV90IHBId0RhdGEsICB1MTYgbnVtYmVyLCAgdTMyIHZhbHVlICk7CiAjZGVmaW5lIGhhbF9nZXRfdGltZV9jb3VudCggX1AgKQkoX1AtPnRpbWVfY291bnQvMTApCS8vIHJldHVybiAxMDBtcyBjb3VudAogI2RlZmluZSBoYWxfZGV0ZWN0X2Vycm9yKCBfUCApCQkoX1AtPldiVXNiLkRldGVjdENvdW50KQotdW5zaWduZWQgY2hhciBoYWxfc2V0X0xFRCggIHBod19kYXRhX3QgcEh3RGF0YSwgIHUzMiBNb2RlICk7IC8vIDIwMDYxMTA4IGZvciBXUFMgbGVkIGNvbnRyb2wKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBUaGUgZm9sbG93IGZ1bmN0aW9uIGlzIHVudXNlZCBmb3IgSVM4OUMzNQpAQCAtMTEzLDcgKzgzLDYgQEAKICNkZWZpbmUgaGFsX2lic3NfZGlzY29ubmVjdChfQSkgaGFsX3N0b3Bfc3luY19ic3MoX0EpCiAjZGVmaW5lIGhhbF9qb2luX3JlcXVlc3Rfc3RvcChfQSkKIHVuc2lnbmVkIGNoYXIJaGFsX2lkbGUoICBwaHdfZGF0YV90IHBId0RhdGEgKTsKLSNkZWZpbmUgcGFfc3RhbGxfZXhlY3V0aW9uKCBfQSApCS8vT1NfU0xFRVAoIDEgKQogI2RlZmluZSBod19nZXRfY3h4X3JlZyggX0EsIF9CLCBfQyApCiAjZGVmaW5lIGh3X3NldF9jeHhfcmVnKCBfQSwgX0IsIF9DICkKICNkZWZpbmUgaHdfZ2V0X2R4eF9yZWcoIF9BLCBfQiwgX0MgKQloYWxfZ2V0X2R4eF9yZWcoIF9BLCBfQiwgKHUzMiAqKV9DICkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diaGFsX3MuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diaGFsX3MuaAppbmRleCAyZWUzZjBmLi4yNzZkMmIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmhhbF9zLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JoYWxfcy5oCkBAIC0xLDMgKzEsMTAgQEAKKyNpZm5kZWYgX19XSU5CT05EX1dCSEFMX1NfSAorI2RlZmluZSBfX1dJTkJPTkRfV0JIQUxfU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisKIC8vWzIwMDQwNzIyIFdLXQogI2RlZmluZSBIQUxfTEVEX1NFVF9NQVNLCQkweDAwMWMJLy8yMDA2MDkwMSBFeHRlbmQKICNkZWZpbmUgSEFMX0xFRF9TRVRfU0hJRlQJCTIKQEAgLTQxNSwxMCArNDIyLDEwIEBACiAvLyBEZXZpY2UgcmVsYXRlZCBpbmNsdWRlCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0jaW5jbHVkZSAibGludXgvd2J1c2Jfcy5oIgotI2luY2x1ZGUgImxpbnV4L3diMzVyZWdfcy5oIgotI2luY2x1ZGUgImxpbnV4L3diMzV0eF9zLmgiCi0jaW5jbHVkZSAibGludXgvd2IzNXJ4X3MuaCIKKyNpbmNsdWRlICJ3YnVzYl9zLmgiCisjaW5jbHVkZSAid2IzNXJlZ19zLmgiCisjaW5jbHVkZSAid2IzNXR4X3MuaCIKKyNpbmNsdWRlICJ3YjM1cnhfcy5oIgogCiAKIC8vIEZvciBIYWwgdXNpbmcgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC00NDIsMTYgKzQ0OSw2IEBACiAJdTMyCUZyYWdDb3VudDsKIAl1MzIJRE1BRml4OyAvL1YxX0RNQV9GSVggVGhlIHZhcmlhYmxlIGNhbiBiZSByZW1vdmVkIGlmIGRyaXZlciB3YW50IHRvIHNhdmUgbWVtIHNwYWNlIGZvciBWMi4KIAotCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JLy8gRm9yIFVTQiBkcml2ZXIsIGhhbCBuZWVkIG1vcmUgdmFyaWFibGVzLiBEdWUgdG8KLQkvLwkxLiBORElTLVdETSBvcGVyYXRpb24KLQkvLwkyLiBUaGUgU01FLCBNTE1FIGFuZCBPTEQgTURTIG5lZWQgQWRhcHRlciBzdHJ1Y3R1cmUsIGJ1dCB0aGUgZHJpdmVyIHVuZGVyIEhBTCBkb2Vzbid0Ci0JLy8JCWhhdmUgdGhhdCBwYXJhbWV0ZXIgd2hlbiByZWNlaXZpbmcgYW5kIGluZGljYXRpbmcgcGFja2V0LgotCS8vCQlUaGUgTURTIG11c3QgaW5wdXQgdGhlIEFkYXB0ZXIgcG9pbnRlciBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlciBvZiBoYWxfaW5pdF9oYXJkd2FyZS4KLQkvLwkJVGhlIGZ1bmN0aW9uIHVzYWdlIGlzIGRpZmZlcmVudCB0aGFuIFBDSSBkcml2ZXIuCi0JLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQl2b2lkKiBBZGFwdGVyOwotCiAJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCS8vIERlZmluaXRpb24gZm9yIE1BQyBhZGRyZXNzCiAJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtNTA2LDExICs1MDMsMTEgQEAKIAkvLyBWYXJpYWJsZSBmb3IgZWFjaCBtb2R1bGUKIAkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCVdCVVNCCQlXYlVzYjsgLy8gTmVlZCBXYlVzYi5oCi0JV0IzNVJFRwkJV2IzNVJlZzsgLy8gTmVlZCBXYjM1UmVnLmgKKwlzdHJ1Y3Qgd2IzNV9yZWcJcmVnOyAvLyBOZWVkIFdiMzVSZWcuaAogCVdCMzVUWAkJV2IzNVR4OyAvLyBOZWVkIFdiMzVUeC5oCiAJV0IzNVJYCQlXYjM1Ung7IC8vIE5lZWQgV2IzNVJ4LmgKIAotCU9TX1RJTUVSCUxFRFRpbWVyOy8vIEZvciBMRUQKKwlzdHJ1Y3QgdGltZXJfbGlzdAlMRURUaW1lcjsvLyBGb3IgTEVECiAKIAl1MzIJCUxFRHBvaW50Oy8vIEZvciBMRUQKIApAQCAtNTcwLDcgKzU2Nyw3IEBACiAJdTMyCQlSeEJ5dGVDb3VudExhc3Q7CiAJdTMyCQlUeEJ5dGVDb3VudExhc3Q7CiAKLQlzMzIJCVN1cnByaXNlUmVtb3ZlQ291bnQ7CisJYXRvbWljX3QJU3VycHJpc2VSZW1vdmVDb3VudDsKIAogCS8vIEZvciBnbG9iYWwgdGltZXIKIAl1MzIJCXRpbWVfY291bnQ7Ly9USUNLX1RJTUVfMTAwbXMgMSA9IDEwMG1zCkBAIC02MTIsNCArNjA5LDQgQEAKIAl1MzIgICBOdW1SYXRlNTRNOwogfSBIQUxfUkFURSwgKlBIQUxfUkFURTsKIAotCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3dibGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3dibGludXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVkNDVlNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmxpbnV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyAgQ29weXJpZ2h0IChjKSAxOTk2LTIwMDUgV2luYm9uZCBFbGVjdHJvbmljIENvcnBvcmF0aW9uCi0vLwotLy8gIE1vZHVsZSBOYW1lOgotLy8gICAgd2JsaW51eC5jCi0vLwotLy8gIEFic3RyYWN0OgotLy8gICAgTGludXggcmVsZWF0ZWQgcm91dGluZXMKLS8vCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSNpbmNsdWRlICJvc19jb21tb24uaCIKLQotdTMyCi1XQkxJTlVYX01lbW9yeUFsbG9jKHZvaWQqICpWaXJ0dWFsQWRkcmVzcywgdTMyIExlbmd0aCkKLXsKLQkqVmlydHVhbEFkZHJlc3MgPSBremFsbG9jKCBMZW5ndGgsIEdGUF9BVE9NSUMgKTsgLy9HRlBfS0VSTkVMIGlzIG5vdCBzdWl0YWJsZQotCi0JaWYgKCpWaXJ0dWFsQWRkcmVzcyA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKLX0KLQotczMyCi1FbmNhcEF0b21pY0luYyhQQURBUFRFUiBBZGFwdGVyLCB2b2lkKiBwQXRvbWljKQotewotCVBXQkxJTlVYIHBXYkxpbnV4ID0gJkFkYXB0ZXItPldiTGludXg7Ci0JdTMyCWx0bXA7Ci0JdTMyICoJcGx0bXAgPSAodTMyICopcEF0b21pYzsKLQlzcGluX2xvY2tfaXJxKCAmcFdiTGludXgtPkF0b21pY1NwaW5Mb2NrICk7Ci0JKCpwbHRtcCkrKzsKLQlsdG1wID0gKCpwbHRtcCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCAmcFdiTGludXgtPkF0b21pY1NwaW5Mb2NrICk7Ci0JcmV0dXJuIGx0bXA7Ci19Ci0KLXMzMgotRW5jYXBBdG9taWNEZWMoUEFEQVBURVIgQWRhcHRlciwgdm9pZCogcEF0b21pYykKLXsKLQlQV0JMSU5VWCBwV2JMaW51eCA9ICZBZGFwdGVyLT5XYkxpbnV4OwotCXUzMglsdG1wOwotCXUzMiAqCXBsdG1wID0gKHUzMiAqKXBBdG9taWM7Ci0Jc3Bpbl9sb2NrX2lycSggJnBXYkxpbnV4LT5BdG9taWNTcGluTG9jayApOwotCSgqcGx0bXApLS07Ci0JbHRtcCA9ICgqcGx0bXApOwotCXNwaW5fdW5sb2NrX2lycSggJnBXYkxpbnV4LT5BdG9taWNTcGluTG9jayApOwotCXJldHVybiBsdG1wOwotfQotCi11bnNpZ25lZCBjaGFyCi1XQkxJTlVYX0luaXRpYWwoUEFEQVBURVIgQWRhcHRlcikKLXsKLQlQV0JMSU5VWCBwV2JMaW51eCA9ICZBZGFwdGVyLT5XYkxpbnV4OwotCi0Jc3Bpbl9sb2NrX2luaXQoICZwV2JMaW51eC0+U3BpbkxvY2sgKTsKLQlzcGluX2xvY2tfaW5pdCggJnBXYkxpbnV4LT5BdG9taWNTcGluTG9jayApOwotCXJldHVybiBUUlVFOwotfQotCi12b2lkCi1XQkxpbnV4X1JlY2VpdmVQYWNrZXQoUEFEQVBURVIgQWRhcHRlciwgUFJYTEFZRVIxIHBSeExheWVyMSkKLXsKLQlCVUcoKTsKLX0KLQotCi12b2lkCi1XQkxJTlVYX0dldE5leHRQYWNrZXQoUEFEQVBURVIgQWRhcHRlciwgIFBERVNDUklQVE9SIHBEZXMpCi17Ci0JQlVHKCk7Ci19Ci0KLXZvaWQKLVdCTElOVVhfR2V0TmV4dFBhY2tldENvbXBsZXRlZChQQURBUFRFUiBBZGFwdGVyLCBQREVTQ1JJUFRPUiBwRGVzKQotewotCUJVRygpOwotfQotCi12b2lkCi1XQkxJTlVYX0Rlc3Ryb3koUEFEQVBURVIgQWRhcHRlcikKLXsKLQlXQkxJTlVYX3N0b3AoIEFkYXB0ZXIgKTsKLSNpZmRlZiBfUEVfVVNCX0lOSV9EVU1QXwotCVdCREVCVUcoKCJbdzM1dW5kXSB1bnJlZ2lzdGVyX25ldGRldiFcbiIpKTsKLSNlbmRpZgotfQotCi12b2lkCi1XQkxJTlVYX3N0b3AoICBQQURBUFRFUiBBZGFwdGVyICkKLXsKLQlQV0JMSU5VWAlwV2JMaW51eCA9ICZBZGFwdGVyLT5XYkxpbnV4OwotCXN0cnVjdCBza19idWZmICpwU2tiOwotCi0JaWYgKE9TX0FUT01JQ19JTkMoIEFkYXB0ZXIsICZwV2JMaW51eC0+VGhyZWFkQ291bnQgKSA9PSAxKSB7Ci0JCS8vIFNodXRkb3duIG1vZHVsZSBpbW1lZGlhdGVseQotCQlwV2JMaW51eC0+c2h1dGRvd24gPSAxOwotCi0JCXdoaWxlIChwV2JMaW51eC0+c2tiX2FycmF5WyBwV2JMaW51eC0+c2tiX0dldEluZGV4IF0pIHsKLQkJCS8vIFRyeWluZyB0byBmcmVlIHRoZSB1bi1zZW5kaW5nIHBhY2tldAotCQkJcFNrYiA9IHBXYkxpbnV4LT5za2JfYXJyYXlbIHBXYkxpbnV4LT5za2JfR2V0SW5kZXggXTsKLQkJCXBXYkxpbnV4LT5za2JfYXJyYXlbIHBXYkxpbnV4LT5za2JfR2V0SW5kZXggXSA9IE5VTEw7Ci0JCQlpZiggaW5faXJxKCkgKQotCQkJCWRldl9rZnJlZV9za2JfaXJxKCBwU2tiICk7Ci0JCQllbHNlCi0JCQkJZGV2X2tmcmVlX3NrYiggcFNrYiApOwotCi0JCQlwV2JMaW51eC0+c2tiX0dldEluZGV4Kys7Ci0JCQlwV2JMaW51eC0+c2tiX0dldEluZGV4ICU9IFdCTElOVVhfUEFDS0VUX0FSUkFZX1NJWkU7Ci0JCX0KLQotI2lmZGVmIF9QRV9TVEFURV9EVU1QXwotCQlXQkRFQlVHKCggIlt3MzV1bmRdIFNLQl9SRUxFQVNFIE9LXG4iICkpOwotI2VuZGlmCi0JfQotCi0JT1NfQVRPTUlDX0RFQyggQWRhcHRlciwgJnBXYkxpbnV4LT5UaHJlYWRDb3VudCApOwotfQotCi12b2lkCi1XYldsYW5IYWx0KCAgUEFEQVBURVIgQWRhcHRlciApCi17Ci0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlBZGFwdGVyLT5zTG9jYWxQYXJhLlNodXREb3duZWQgPSBUUlVFOwotCi0JTWRzX0Rlc3Ryb3koIEFkYXB0ZXIgKTsKLQotCS8vIFR1cm4gb2ZmIFJ4IGFuZCBUeCBoYXJkd2FyZSBhYmlsaXR5Ci0JaGFsX3N0b3AoICZBZGFwdGVyLT5zSHdEYXRhICk7Ci0jaWZkZWYgX1BFX1VTQl9JTklfRFVNUF8KLQlXQkRFQlVHKCgiW3czNXVuZF0gSGFsX3N0b3AgTy5LLlxuIikpOwotI2VuZGlmCi0JT1NfU0xFRVAoMTAwMDAwKTsvLyBXYWl0aW5nIElycCBjb21wbGV0ZWQKLQotCS8vIERlc3Ryb3kgdGhlIE5ESVMgbW9kdWxlCi0JV0JMSU5VWF9EZXN0cm95KCBBZGFwdGVyICk7Ci0KLQkvLyBIYWx0IHRoZSBIQUwKLQloYWxfaGFsdCgmQWRhcHRlci0+c0h3RGF0YSwgTlVMTCk7Ci19Ci0KLXVuc2lnbmVkIGNoYXIKLVdiV0xhbkluaXRpYWxpemUoUEFEQVBURVIgQWRhcHRlcikKLXsKLQlwaHdfZGF0YV90CXBId0RhdGE7Ci0JdTgJCSpwTWFjQWRkcjsKLQl1OAkJKnBNYWNBZGRyMjsKLQl1MzIJCUluaXRTdGVwID0gMDsKLQl1OAkJRUVQUk9NX3JlZ2lvbjsKLQl1OAkJSHdSYWRpb09mZjsKLQotCS8vCi0JLy8gU2V0dGluZyBkZWZhdWx0IHZhbHVlIGZvciBMaW51eAotCS8vCi0JQWRhcHRlci0+c0xvY2FsUGFyYS5yZWdpb25fSU5GID0gUkVHSU9OX0FVVE87Ci0JQWRhcHRlci0+c0xvY2FsUGFyYS5UeFJhdGVNb2RlID0gUkFURV9BVVRPOwotCXBzTE9DQUwtPmJNYWNPcGVyYXRpb25Nb2RlID0gTU9ERV84MDJfMTFfQkc7CS8vIEIvRyBtb2RlCi0JQWRhcHRlci0+TWRzLlR4UlRTVGhyZXNob2xkID0gREVGQVVMVF9SVFNUaHJlc2hvbGQ7Ci0JQWRhcHRlci0+TWRzLlR4RnJhZ21lbnRUaHJlc2hvbGQgPSBERUZBVUxUX0ZSQUdNRU5UX1RIUkVTSE9MRDsKLQloYWxfc2V0X3BoeV90eXBlKCAmQWRhcHRlci0+c0h3RGF0YSwgUkZfV0JfMjQyXzEgKTsKLQlBZGFwdGVyLT5zTG9jYWxQYXJhLk1UVXNpemUgPSBNQVhfRVRIRVJORVRfUEFDS0VUX1NJWkU7Ci0JcHNMT0NBTC0+YlByZWFtYmxlTW9kZSA9IEFVVE9fTU9ERTsKLQlBZGFwdGVyLT5zTG9jYWxQYXJhLlJhZGlvT2ZmU3RhdHVzLmJvU3dSYWRpb09mZiA9IEZBTFNFOwotCXBId0RhdGEgPSAmQWRhcHRlci0+c0h3RGF0YTsKLQloYWxfc2V0X3BoeV90eXBlKCBwSHdEYXRhLCBSRl9ERUNJREVfQllfSU5GICk7Ci0KLQkvLwotCS8vIEluaXRpYWwgZWFjaCBtb2R1bGUgYW5kIHZhcmlhYmxlCi0JLy8KLQlpZiAoIVdCTElOVVhfSW5pdGlhbChBZGFwdGVyKSkgewotI2lmZGVmIF9QRV9VU0JfSU5JX0RVTVBfCi0JCVdCREVCVUcoKCJbdzM1dW5kXVdCTkRJUyBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpKTsKLSNlbmRpZgotCQlnb3RvIGVycm9yOwotCX0KLQotCS8vIEluaXRpYWwgU29mdHdhcmUgdmFyaWFibGUKLQlBZGFwdGVyLT5zTG9jYWxQYXJhLlNodXREb3duZWQgPSBGQUxTRTsKLQotCS8vYWRkZWQgYnkgd3MgZm9yIHdlcCBrZXkgZXJyb3IgZGV0ZWN0aW9uCi0JQWRhcHRlci0+c0xvY2FsUGFyYS5iV2VwS2V5RXJyb3I9IEZBTFNFOwotCUFkYXB0ZXItPnNMb2NhbFBhcmEuYlRvU2VsZlBhY2tldFJlY2VpdmVkID0gRkFMU0U7Ci0JQWRhcHRlci0+c0xvY2FsUGFyYS5XZXBLZXlEZXRlY3RUaW1lckNvdW50PSAyICogMTAwOyAvLy8gMiBzZWNvbmRzCi0KLQkvLyBJbml0aWFsIFVTQiBoYWwKLQlJbml0U3RlcCA9IDE7Ci0JcEh3RGF0YSA9ICZBZGFwdGVyLT5zSHdEYXRhOwotCWlmICghaGFsX2luaXRfaGFyZHdhcmUocEh3RGF0YSwgQWRhcHRlcikpCi0JCWdvdG8gZXJyb3I7Ci0KLQlFRVBST01fcmVnaW9uID0gaGFsX2dldF9yZWdpb25fZnJvbV9FRVBST00oIHBId0RhdGEgKTsKLQlpZiAoRUVQUk9NX3JlZ2lvbiAhPSBSRUdJT05fQVVUTykKLQkJcHNMT0NBTC0+cmVnaW9uID0gRUVQUk9NX3JlZ2lvbjsKLQllbHNlIHsKLQkJaWYgKHBzTE9DQUwtPnJlZ2lvbl9JTkYgIT0gUkVHSU9OX0FVVE8pCi0JCQlwc0xPQ0FMLT5yZWdpb24gPSBwc0xPQ0FMLT5yZWdpb25fSU5GOwotCQllbHNlCi0JCQlwc0xPQ0FMLT5yZWdpb24gPSBSRUdJT05fVVNBOwkvL2RlZmF1bHQgc2V0dGluZwotCX0KLQotCS8vIEdldCBTb2Z0d2FyZSBzZXR0aW5nIGZsYWcgZnJvbSBoYWwKLQlBZGFwdGVyLT5zTG9jYWxQYXJhLmJvQW50ZW5uYURpdmVyc2l0eSA9IEZBTFNFOwotCWlmIChoYWxfc29mdHdhcmVfc2V0KHBId0RhdGEpICYgMHgwMDAwMDAwMSkKLQkJQWRhcHRlci0+c0xvY2FsUGFyYS5ib0FudGVubmFEaXZlcnNpdHkgPSBUUlVFOwotCi0JLy8KLQkvLyBGb3IgVFMgbW9kdWxlCi0JLy8KLQlJbml0U3RlcCA9IDI7Ci0KLQkvLyBGb3IgTURTIG1vZHVsZQotCUluaXRTdGVwID0gMzsKLQlNZHNfaW5pdGlhbChBZGFwdGVyKTsKLQotCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JLy8gSW5pdGlhbGl6ZSB0aGUgU01FLCBTQ0FOLCBNTE1FLCBST0FNCi0JLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlJbml0U3RlcCA9IDQ7Ci0JSW5pdFN0ZXAgPSA1OwotCUluaXRTdGVwID0gNjsKLQotCS8vIElmIG5vIHVzZXItZGVmaW5lZCBhZGRyZXNzIGluIHRoZSByZWdpc3RyeSwgdXNlIHRoZSBhZGRyZXNzcyAiYnVybmVkIiBvbiB0aGUgTklDIGluc3RlYWQuCi0JcE1hY0FkZHIgPSBBZGFwdGVyLT5zTG9jYWxQYXJhLlRoaXNNYWNBZGRyZXNzOwotCXBNYWNBZGRyMiA9IEFkYXB0ZXItPnNMb2NhbFBhcmEuUGVybWFuZW50QWRkcmVzczsKLQloYWxfZ2V0X3Blcm1hbmVudF9hZGRyZXNzKCBwSHdEYXRhLCBBZGFwdGVyLT5zTG9jYWxQYXJhLlBlcm1hbmVudEFkZHJlc3MgKTsvLyBSZWFkaW5nIGV0aGVybmV0IGFkZHJlc3MgZnJvbSBFRVBST00KLQlpZiAoT1NfTUVNT1JZX0NPTVBBUkUocE1hY0FkZHIsICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLCBNQUNfQUREUl9MRU5HVEggKSkgLy8gSXMgZXF1YWwKLQl7Ci0JCW1lbWNweSggcE1hY0FkZHIsIHBNYWNBZGRyMiwgTUFDX0FERFJfTEVOR1RIICk7Ci0JfSBlbHNlIHsKLQkJLy8gU2V0IHRoZSB1c2VyIGRlZmluZSBNQUMgYWRkcmVzcwotCQloYWxfc2V0X2V0aGVybmV0X2FkZHJlc3MoIHBId0RhdGEsIEFkYXB0ZXItPnNMb2NhbFBhcmEuVGhpc01hY0FkZHJlc3MgKTsKLQl9Ci0KLQkvL2dldCBjdXJyZW50IGFudGVubmEKLQlwc0xPQ0FMLT5iQW50ZW5uYU5vID0gaGFsX2dldF9hbnRlbm5hX251bWJlcihwSHdEYXRhKTsKLSNpZmRlZiBfUEVfU1RBVEVfRFVNUF8KLQlXQkRFQlVHKCgiRHJpdmVyIGluaXQsIGFudGVubmEgbm8gPSAlZFxuIiwgcHNMT0NBTC0+YkFudGVubmFObykpOwotI2VuZGlmCi0JaGFsX2dldF9od19yYWRpb19vZmYoIHBId0RhdGEgKTsKLQotCS8vIFdhaXRpbmcgZm9yIEhBTCBzZXR0aW5nIE9LCi0Jd2hpbGUgKCFoYWxfaWRsZShwSHdEYXRhKSkKLQkJT1NfU0xFRVAoMTAwMDApOwotCi0JTVRPX0luaXQoQWRhcHRlcik7Ci0KLQlId1JhZGlvT2ZmID0gaGFsX2dldF9od19yYWRpb19vZmYoIHBId0RhdGEgKTsKLQlwc0xPQ0FMLT5SYWRpb09mZlN0YXR1cy5ib0h3UmFkaW9PZmYgPSAhIUh3UmFkaW9PZmY7Ci0KLQloYWxfc2V0X3JhZGlvX21vZGUoIHBId0RhdGEsICh1bnNpZ25lZCBjaGFyKShwc0xPQ0FMLT5SYWRpb09mZlN0YXR1cy5ib1N3UmFkaW9PZmYgfHwgcHNMT0NBTC0+UmFkaW9PZmZTdGF0dXMuYm9Id1JhZGlvT2ZmKSApOwotCi0JaGFsX2RyaXZlcl9pbml0X09LKHBId0RhdGEpID0gMTsgLy8gTm90aWZ5IGhhbCB0aGF0IHRoZSBkcml2ZXIgaXMgcmVhZHkgbm93LgotCS8vc2V0IGEgdHggcG93ZXIgZm9yIHJlZmVyZW5jZS4uLi4uCi0vLwlzbWVfc2V0X3R4X3Bvd2VyX2xldmVsKEFkYXB0ZXIsIDEyKTsJRklYTUU/Ci0JcmV0dXJuIFRSVUU7Ci0KLWVycm9yOgotCXN3aXRjaCAoSW5pdFN0ZXApIHsKLQljYXNlIDU6Ci0JY2FzZSA0OgotCWNhc2UgMzogTWRzX0Rlc3Ryb3koIEFkYXB0ZXIgKTsKLQljYXNlIDI6Ci0JY2FzZSAxOiBXQkxJTlVYX0Rlc3Ryb3koIEFkYXB0ZXIgKTsKLQkJaGFsX2hhbHQoIHBId0RhdGEsIE5VTEwgKTsKLQljYXNlIDA6IGJyZWFrOwotCX0KLQotCXJldHVybiBGQUxTRTsKLX0KLQotdm9pZCBXQkxJTlVYX0Nvbm5lY3RTdGF0dXMoUEFEQVBURVIgQWRhcHRlciwgdTMyIGZsYWcpCi17Ci0JUFdCTElOVVgJcFdiTGludXggPSAmQWRhcHRlci0+V2JMaW51eDsKLQotCXBXYkxpbnV4LT5MaW5rU3RhdHVzID0gZmxhZzsgLy8gT1NfRElTQ09OTkVDVEVECW9yICBPU19DT05ORUNURUQKLX0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JsaW51eF9mLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmxpbnV4X2YuaAppbmRleCA2ODI0MGM1Li44NjhlODc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmxpbnV4X2YuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmxpbnV4X2YuaApAQCAtMSwyMyArMSwxNiBAQAorI2lmbmRlZiBfX1dCTElOVVhfRl9ICisjZGVmaW5lIF9fV0JMSU5VWF9GX0gKKworI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJtZHNfcy5oIgorCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC8vIENvcHlyaWdodCAoYykgMTk5Ni0yMDA0IFdpbmJvbmQgRWxlY3Ryb25pYyBDb3Jwb3JhdGlvbgogLy8KIC8vIHdibGludXhfZi5oCiAvLwotdTMyIFdCTElOVVhfTWVtb3J5QWxsb2MoICB2b2lkKiAqVmlydHVhbEFkZHJlc3MsICB1MzIgTGVuZ3RoICk7Ci1zMzIgRW5jYXBBdG9taWNJbmMoICBQQURBUFRFUiBBZGFwdGVyLCAgdm9pZCogcEF0b21pYyApOwotczMyIEVuY2FwQXRvbWljRGVjKCAgUEFEQVBURVIgQWRhcHRlciwgIHZvaWQqIHBBdG9taWMgKTsKLXZvaWQgV0JMaW51eF9SZWNlaXZlUGFja2V0KCAgUEFEQVBURVIgQWRhcHRlciwgIFBSWExBWUVSMSBwUnhMYXllcjEgKTsKLXVuc2lnbmVkIGNoYXIgV0JMSU5VWF9Jbml0aWFsKCAgUEFEQVBURVIgQWRhcHRlciApOwogaW50IHdiMzVfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICk7Ci12b2lkIFdCTElOVVhfR2V0TmV4dFBhY2tldCggIFBBREFQVEVSIEFkYXB0ZXIsICBQREVTQ1JJUFRPUiBwRGVzICk7Ci12b2lkIFdCTElOVVhfR2V0TmV4dFBhY2tldENvbXBsZXRlZCggIFBBREFQVEVSIEFkYXB0ZXIsICBQREVTQ1JJUFRPUiBwRGVzICk7Ci12b2lkIFdCTElOVVhfc3RvcCggIFBBREFQVEVSIEFkYXB0ZXIgKTsKLXZvaWQgV0JMSU5VWF9EZXN0cm95KCAgUEFEQVBURVIgQWRhcHRlciApOwogdm9pZCB3YjM1X3NldF9tdWx0aWNhc3QoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgKTsKIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICogd2IzNV9uZXRkZXZfc3RhdHMoIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgKTsKLXZvaWQgV0JMSU5VWF9zdG9wKCAgUEFEQVBURVIgQWRhcHRlciApOwotdm9pZCBXYldsYW5IYWx0KCAgUEFEQVBURVIgQWRhcHRlciApOwotdm9pZCBXQkxJTlVYX0Nvbm5lY3RTdGF0dXMoICBQQURBUFRFUiBBZGFwdGVyLCAgdTMyIGZsYWcgKTsKIAotCi0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JsaW51eF9zLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmxpbnV4X3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQyYmI0My4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmxpbnV4X3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyB3YmxpbnV4X3MuaAotLy8KLSNkZWZpbmUgT1NfTUVNT1JZX0FMTE9DKCBfViwgX1MgKQlXQkxJTlVYX01lbW9yeUFsbG9jKCBfViwgX1MgKQotI2RlZmluZSBPU19MSU5LX1NUQVRVUwkJCShBZGFwdGVyLT5XYkxpbnV4LkxpbmtTdGF0dXMgPT0gT1NfQ09OTkVDVEVEKQotI2RlZmluZSBPU19TRVRfU0hVVERPV04oIF9BICkJCV9BLT5XYkxpbnV4LnNodXRkb3duPTEKLSNkZWZpbmUgT1NfU0VUX1JFU1VNRSggX0EgKQkJX0EtPldiTGludXguc2h1dGRvd249MAotI2RlZmluZSBPU19DT05ORUNUX1NUQVRVU19JTkRJQ0FURSggX0EsIF9GICkJCVdCTElOVVhfQ29ubmVjdFN0YXR1cyggX0EsIF9GICkKLSNkZWZpbmUgT1NfRElTQ09OTkVDVEVECTAKLSNkZWZpbmUgT1NfQ09OTkVDVEVECTEKLSNkZWZpbmUgT1NfU1RPUCggX0EgKQlXQkxJTlVYX3N0b3AoIF9BICkKLQotI2RlZmluZSBPU19DVVJSRU5UX1JYX0JZVEUoIF9BICkJCV9BLT5XYkxpbnV4LlJ4Qnl0ZUNvdW50Ci0jZGVmaW5lIE9TX0NVUlJFTlRfVFhfQllURSggX0EgKQkJX0EtPldiTGludXguVHhCeXRlQ291bnQKLSNkZWZpbmUgT1NfRVZFTlRfSU5ESUNBVEUoIF9BLCBfQiwgX0YgKQotI2RlZmluZSBPU19QTUtJRF9TVEFUVVNfRVZFTlQoIF9BICkKLSNkZWZpbmUgT1NfUkVDRUlWRV9QQUNLRVRfSU5ESUNBVEUoIF9BLCBfRCApCQlXQkxpbnV4X1JlY2VpdmVQYWNrZXQoIF9BLCBfRCApCi0jZGVmaW5lIE9TX1JFQ0VJVkVfODAyXzFYX1BBQ0tFVF9JTkRJQ0FURSggX0EsIF9EICkJRUFQX1JlY2VpdmVQYWNrZXQoIF9BLCBfRCApCi0jZGVmaW5lIE9TX0dFVF9QQUNLRVQoIF9BLCBfRCApCQkJCVdCTElOVVhfR2V0TmV4dFBhY2tldCggX0EsIF9EICkKLSNkZWZpbmUgT1NfR0VUX1BBQ0tFVF9DT01QTEVURSggX0EsIF9EICkJV0JMSU5VWF9HZXROZXh0UGFja2V0Q29tcGxldGVkKCBfQSwgX0QgKQotI2RlZmluZSBPU19TRU5EX1JFU1VMVCggX0EsIF9JRCwgX1IgKQotCi0jZGVmaW5lIFdCTElOVVhfUEFDS0VUX0FSUkFZX1NJWkUJKEVUSEVSTkVUX1RYX0RFU0NSSVBUT1JTKjQpCi0KLXR5cGVkZWYgc3RydWN0IF9XQkxJTlVYCi17Ci0Jc3BpbmxvY2tfdAlBdG9taWNTcGluTG9jazsKLQlzcGlubG9ja190CVNwaW5Mb2NrOwotCXUzMglzaHV0ZG93bjsKLQotCU9TX0FUT01JQwlUaHJlYWRDb3VudDsKLQotCXUzMglMaW5rU3RhdHVzOwkJLy8gT1NfRElTQ09OTkVDVEVEIG9yIE9TX0NPTk5FQ1RFRAotCi0JdTMyCVJ4Qnl0ZUNvdW50OwotCXUzMglUeEJ5dGVDb3VudDsKLQotCXN0cnVjdCBza19idWZmICpza2JfYXJyYXlbIFdCTElOVVhfUEFDS0VUX0FSUkFZX1NJWkUgXTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqcGFja2V0X3JldHVybjsKLQlzMzIJc2tiX1NldEluZGV4OwotCXMzMglza2JfR2V0SW5kZXg7Ci0JczMyCW5ldGlmX3N0YXRlX3N0b3A7IC8vIDE6IHN0b3AgIDA6IG5vcm1hbAotfSBXQkxJTlVYLCAqUFdCTElOVVg7Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2J1c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3didXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAwM2Y5YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3didXNiLmMKQEAgLTAsMCArMSw0MzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCBQYXZlbCBNYWNoZWsgPHBhdmVsQHN1c2UuY3o+CisgKgorICogRGlzdHJpYnV0ZSB1bmRlciBHUEx2Mi4KKyAqLworI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgIm1kc19mLmgiCisjaW5jbHVkZSAibWxtZXR4cnhfZi5oIgorI2luY2x1ZGUgIm10b19mLmgiCisjaW5jbHVkZSAid2JoYWxfZi5oIgorI2luY2x1ZGUgIndibGludXhfZi5oIgorCitNT0RVTEVfQVVUSE9SKCJPcmlnaW5hbCBieTogSmVmZiBMZWU8WVlfTGVlQGlzc2MuY29tLnR3PiBBZGFwdGVkIHRvIDIuNi54IGJ5IENvc3RhbnRpbm8gTGVhbmRybyAoUnhhcnQgRGVza3RvcCkgPGxlX2Nvc3RhbnRpbm9AcGl4YXJ0YXJnZW50aW5hLmNvbS5hcj4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSVM4OUMzNSA4MDIuMTFiZyBXTEFOIFVTQiBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKCIwLjEiKTsKKworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHdiMzVfdGFibGVbXSBfX2RldmluaXRkYXRhID0geworCXtVU0JfREVWSUNFKDB4MDQxNiwgMHgwMDM1KX0sCisJe1VTQl9ERVZJQ0UoMHgxOEU4LCAweDYyMDEpfSwKKwl7VVNCX0RFVklDRSgweDE4RTgsIDB4NjIwNil9LAorCXtVU0JfREVWSUNFKDB4MThFOCwgMHg2MjE3KX0sCisJe1VTQl9ERVZJQ0UoMHgxOEU4LCAweDYyMzApfSwKKwl7VVNCX0RFVklDRSgweDE4RTgsIDB4NjIzMyl9LAorCXtVU0JfREVWSUNFKDB4MTEzMSwgMHgyMDM1KX0sCisJeyAwLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgd2IzNV90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgd2Jzb2Z0X3JhdGVzW10gPSB7CisJeyAuYml0cmF0ZSA9IDEwLCAuZmxhZ3MgPSBJRUVFODAyMTFfUkFURV9TSE9SVF9QUkVBTUJMRSB9LAorfTsKKworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCB3YnNvZnRfY2hhbm5lbHNbXSA9IHsKKwl7IC5jZW50ZXJfZnJlcSA9IDI0MTJ9LAorfTsKKworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgd2Jzb2Z0X2JhbmRfMkdIeiA9IHsKKwkuY2hhbm5lbHMJPSB3YnNvZnRfY2hhbm5lbHMsCisJLm5fY2hhbm5lbHMJPSBBUlJBWV9TSVpFKHdic29mdF9jaGFubmVscyksCisJLmJpdHJhdGVzCT0gd2Jzb2Z0X3JhdGVzLAorCS5uX2JpdHJhdGVzCT0gQVJSQVlfU0laRSh3YnNvZnRfcmF0ZXMpLAorfTsKKworc3RhdGljIGludCB3YnNvZnRfYWRkX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsCisJCQkJIHN0cnVjdCBpZWVlODAyMTFfaWZfaW5pdF9jb25mICpjb25mKQoreworCXByaW50aygid2Jzb2Z0X2FkZCBpbnRlcmZhY2UgY2FsbGVkXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgd2Jzb2Z0X3JlbW92ZV9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LAorCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9pZl9pbml0X2NvbmYgKmNvbmYpCit7CisJcHJpbnRrKCJ3YnNvZnRfcmVtb3ZlIGludGVyZmFjZSBjYWxsZWRcbiIpOworfQorCitzdGF0aWMgdm9pZCB3YnNvZnRfc3RvcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlwcmludGsoS0VSTl9JTkZPICIlcyBjYWxsZWRcbiIsIF9fZnVuY19fKTsKK30KKworc3RhdGljIGludCB3YnNvZnRfZ2V0X3N0YXRzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfbG93X2xldmVsX3N0YXRzICpzdGF0cykKK3sKKwlwcmludGsoS0VSTl9JTkZPICIlcyBjYWxsZWRcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3YnNvZnRfZ2V0X3R4X3N0YXRzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdHhfcXVldWVfc3RhdHMgKnN0YXRzKQoreworCXByaW50ayhLRVJOX0lORk8gIiVzIGNhbGxlZFxuIiwgX19mdW5jX18pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB3YnNvZnRfY29uZmlndXJlX2ZpbHRlcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgY2hhbmdlZF9mbGFncywKKwkJCQkgICAgIHVuc2lnbmVkIGludCAqdG90YWxfZmxhZ3MsCisJCQkJICAgICBpbnQgbWNfY291bnQsIHN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0KQoreworCXVuc2lnbmVkIGludCBiaXRfbnIsIG5ld19mbGFnczsKKwl1MzIgbWNfZmlsdGVyWzJdOworCWludCBpOworCisJbmV3X2ZsYWdzID0gMDsKKworCWlmICgqdG90YWxfZmxhZ3MgJiBGSUZfUFJPTUlTQ19JTl9CU1MpIHsKKwkJbmV3X2ZsYWdzIHw9IEZJRl9QUk9NSVNDX0lOX0JTUzsKKwkJbWNfZmlsdGVyWzFdID0gbWNfZmlsdGVyWzBdID0gfjA7CisJfSBlbHNlIGlmICgoKnRvdGFsX2ZsYWdzICYgRklGX0FMTE1VTFRJKSB8fCAobWNfY291bnQgPiAzMikpIHsKKwkJbmV3X2ZsYWdzIHw9IEZJRl9BTExNVUxUSTsKKwkJbWNfZmlsdGVyWzFdID0gbWNfZmlsdGVyWzBdID0gfjA7CisJfSBlbHNlIHsKKwkJbWNfZmlsdGVyWzFdID0gbWNfZmlsdGVyWzBdID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IG1jX2NvdW50OyBpKyspIHsKKwkJCWlmICghbWNsaXN0KQorCQkJCWJyZWFrOworCQkJcHJpbnRrKCJTaG91bGQgY2FsbCBldGhlcl9jcmMgaGVyZVxuIik7CisJCQkvL2JpdF9uciA9IGV0aGVyX2NyYyhFVEhfQUxFTiwgbWNsaXN0LT5kbWlfYWRkcikgPj4gMjY7CisJCQliaXRfbnIgPSAwOworCisJCQliaXRfbnIgJj0gMHgzRjsKKwkJCW1jX2ZpbHRlcltiaXRfbnIgPj4gNV0gfD0gMSA8PCAoYml0X25yICYgMzEpOworCQkJbWNsaXN0ID0gbWNsaXN0LT5uZXh0OworCQl9CisJfQorCisJZGV2LT5mbGFncyAmPSB+SUVFRTgwMjExX0hXX1JYX0lOQ0xVREVTX0ZDUzsKKworCSp0b3RhbF9mbGFncyA9IG5ld19mbGFnczsKK30KKworc3RhdGljIGludCB3YnNvZnRfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCB3YnNvZnRfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKworCU1MTUVTZW5kRnJhbWUocHJpdiwgc2tiLT5kYXRhLCBza2ItPmxlbiwgRlJBTUVfVFlQRV84MDJfMTFfTUFOQUdFTUVOVCk7CisKKwlyZXR1cm4gTkVUREVWX1RYX09LOworfQorCisKK3N0YXRpYyBpbnQgd2Jzb2Z0X3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldikKK3sKKwlzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisKKwlwcml2LT5lbmFibGVkID0gdHJ1ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdic29mdF9jb25maWcoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LCB1MzIgY2hhbmdlZCkKK3sKKwlzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisJc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mID0gJmRldi0+Y29uZjsKKwlDaGFuSW5mbyBjaDsKKworCXByaW50aygid2Jzb2Z0X2NvbmZpZyBjYWxsZWRcbiIpOworCisJY2guYmFuZCA9IDE7CisJY2guQ2hhbk5vID0gMTsJLyogU2hvdWxkIHVzZSBjaGFubmVsX251bSwgb3Igc29tZXRoaW5nLCBhcyB0aGF0IGlzIGFscmVhZHkgcHJlLXRyYW5zbGF0ZWQgKi8KKworCisJaGFsX3NldF9jdXJyZW50X2NoYW5uZWwoJnByaXYtPnNId0RhdGEsIGNoKTsKKwloYWxfc2V0X2JlYWNvbl9wZXJpb2QoJnByaXYtPnNId0RhdGEsIGNvbmYtPmJlYWNvbl9pbnQpOworLy8JaGFsX3NldF9jYXBfaW5mbygmcHJpdi0+c0h3RGF0YSwgPz8gKTsKKy8vIGhhbF9zZXRfc3NpZChwaHdfZGF0YV90IHBId0RhdGEsICB1OCAqIHBzc2lkLCAgdTggc3NpZF9sZW4pOyA/PworCWhhbF9zZXRfYWNjZXB0X2Jyb2FkY2FzdCgmcHJpdi0+c0h3RGF0YSwgMSk7CisJaGFsX3NldF9hY2NlcHRfcHJvbWlzY3VvdXMoJnByaXYtPnNId0RhdGEsICAxKTsKKwloYWxfc2V0X2FjY2VwdF9tdWx0aWNhc3QoJnByaXYtPnNId0RhdGEsICAxKTsKKwloYWxfc2V0X2FjY2VwdF9iZWFjb24oJnByaXYtPnNId0RhdGEsICAxKTsKKwloYWxfc2V0X3JhZGlvX21vZGUoJnByaXYtPnNId0RhdGEsICAwKTsKKwkvL2hhbF9zZXRfYW50ZW5uYV9udW1iZXIoICBwaHdfZGF0YV90IHBId0RhdGEsIHU4IG51bWJlciApCisJLy9oYWxfc2V0X3JmX3Bvd2VyKHBod19kYXRhX3QgcEh3RGF0YSwgdTggUG93ZXJJbmRleCkKKworCisvLwloYWxfc3RhcnRfYnNzKCZwcml2LT5zSHdEYXRhLCBXTEFOX0JTU1RZUEVfSU5GUkFTVFJVQ1RVUkUpOwk/PworCisvL3ZvaWQgaGFsX3NldF9yYXRlcyhwaHdfZGF0YV90IHBId0RhdGEsIHU4ICogcGJzc19yYXRlcywKKy8vCQkgICB1OCBsZW5ndGgsIHVuc2lnbmVkIGNoYXIgYmFzaWNfcmF0ZV9zZXQpCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3YnNvZnRfY29uZmlnX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsCisJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfaWZfY29uZiAqY29uZikKK3sKKwlwcmludGsoIndic29mdF9jb25maWdfaW50ZXJmYWNlIGNhbGxlZFxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1NjQgd2Jzb2Z0X2dldF90c2Yoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2KQoreworCXByaW50aygid2Jzb2Z0X2dldF90c2YgY2FsbGVkXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfb3BzIHdic29mdF9vcHMgPSB7CisJLnR4CQkJPSB3YnNvZnRfdHgsCisJLnN0YXJ0CQkJPSB3YnNvZnRfc3RhcnQsCQkvKiBTdGFydCBjYW4gYmUgcHJldHR5IG11Y2ggZW1wdHkgYXMgd2UgZG8gd2IzNV9od19pbml0KCkgZHVyaW5nIHByb2JlPyAqLworCS5zdG9wCQkJPSB3YnNvZnRfc3RvcCwKKwkuYWRkX2ludGVyZmFjZQkJPSB3YnNvZnRfYWRkX2ludGVyZmFjZSwKKwkucmVtb3ZlX2ludGVyZmFjZQk9IHdic29mdF9yZW1vdmVfaW50ZXJmYWNlLAorCS5jb25maWcJCQk9IHdic29mdF9jb25maWcsCisJLmNvbmZpZ19pbnRlcmZhY2UJPSB3YnNvZnRfY29uZmlnX2ludGVyZmFjZSwKKwkuY29uZmlndXJlX2ZpbHRlcgk9IHdic29mdF9jb25maWd1cmVfZmlsdGVyLAorCS5nZXRfc3RhdHMJCT0gd2Jzb2Z0X2dldF9zdGF0cywKKwkuZ2V0X3R4X3N0YXRzCQk9IHdic29mdF9nZXRfdHhfc3RhdHMsCisJLmdldF90c2YJCT0gd2Jzb2Z0X2dldF90c2YsCisvLyBjb25mX3R4OiBoYWxfc2V0X2N3bWluKCkvaGFsX3NldF9jd21heDsKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHdiMzVfaHdfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlwaHdfZGF0YV90CXBId0RhdGE7CisJdTgJCSpwTWFjQWRkcjsKKwl1OAkJKnBNYWNBZGRyMjsKKwl1MzIJCUluaXRTdGVwID0gMDsKKwl1OAkJRUVQUk9NX3JlZ2lvbjsKKwl1OAkJSHdSYWRpb09mZjsKKworCS8vCisJLy8gU2V0dGluZyBkZWZhdWx0IHZhbHVlIGZvciBMaW51eAorCS8vCisJcHJpdi0+c0xvY2FsUGFyYS5yZWdpb25fSU5GID0gUkVHSU9OX0FVVE87CisJcHJpdi0+c0xvY2FsUGFyYS5UeFJhdGVNb2RlID0gUkFURV9BVVRPOworCXByaXYtPnNMb2NhbFBhcmEuYk1hY09wZXJhdGlvbk1vZGUgPSBNT0RFXzgwMl8xMV9CRzsJLy8gQi9HIG1vZGUKKwlwcml2LT5NZHMuVHhSVFNUaHJlc2hvbGQgPSBERUZBVUxUX1JUU1RocmVzaG9sZDsKKwlwcml2LT5NZHMuVHhGcmFnbWVudFRocmVzaG9sZCA9IERFRkFVTFRfRlJBR01FTlRfVEhSRVNIT0xEOworCWhhbF9zZXRfcGh5X3R5cGUoICZwcml2LT5zSHdEYXRhLCBSRl9XQl8yNDJfMSApOworCXByaXYtPnNMb2NhbFBhcmEuTVRVc2l6ZSA9IE1BWF9FVEhFUk5FVF9QQUNLRVRfU0laRTsKKwlwcml2LT5zTG9jYWxQYXJhLmJQcmVhbWJsZU1vZGUgPSBBVVRPX01PREU7CisJcHJpdi0+c0xvY2FsUGFyYS5SYWRpb09mZlN0YXR1cy5ib1N3UmFkaW9PZmYgPSBmYWxzZTsKKwlwSHdEYXRhID0gJnByaXYtPnNId0RhdGE7CisJaGFsX3NldF9waHlfdHlwZSggcEh3RGF0YSwgUkZfREVDSURFX0JZX0lORiApOworCisJLy9hZGRlZCBieSB3cyBmb3Igd2VwIGtleSBlcnJvciBkZXRlY3Rpb24KKwlwcml2LT5zTG9jYWxQYXJhLmJXZXBLZXlFcnJvcj0gZmFsc2U7CisJcHJpdi0+c0xvY2FsUGFyYS5iVG9TZWxmUGFja2V0UmVjZWl2ZWQgPSBmYWxzZTsKKwlwcml2LT5zTG9jYWxQYXJhLldlcEtleURldGVjdFRpbWVyQ291bnQ9IDIgKiAxMDA7IC8vLyAyIHNlY29uZHMKKworCS8vIEluaXRpYWwgVVNCIGhhbAorCUluaXRTdGVwID0gMTsKKwlwSHdEYXRhID0gJnByaXYtPnNId0RhdGE7CisJaWYgKCFoYWxfaW5pdF9oYXJkd2FyZShodykpCisJCWdvdG8gZXJyb3I7CisKKwlFRVBST01fcmVnaW9uID0gaGFsX2dldF9yZWdpb25fZnJvbV9FRVBST00oIHBId0RhdGEgKTsKKwlpZiAoRUVQUk9NX3JlZ2lvbiAhPSBSRUdJT05fQVVUTykKKwkJcHJpdi0+c0xvY2FsUGFyYS5yZWdpb24gPSBFRVBST01fcmVnaW9uOworCWVsc2UgeworCQlpZiAocHJpdi0+c0xvY2FsUGFyYS5yZWdpb25fSU5GICE9IFJFR0lPTl9BVVRPKQorCQkJcHJpdi0+c0xvY2FsUGFyYS5yZWdpb24gPSBwcml2LT5zTG9jYWxQYXJhLnJlZ2lvbl9JTkY7CisJCWVsc2UKKwkJCXByaXYtPnNMb2NhbFBhcmEucmVnaW9uID0gUkVHSU9OX1VTQTsJLy9kZWZhdWx0IHNldHRpbmcKKwl9CisKKwkvLyBHZXQgU29mdHdhcmUgc2V0dGluZyBmbGFnIGZyb20gaGFsCisJcHJpdi0+c0xvY2FsUGFyYS5ib0FudGVubmFEaXZlcnNpdHkgPSBmYWxzZTsKKwlpZiAoaGFsX3NvZnR3YXJlX3NldChwSHdEYXRhKSAmIDB4MDAwMDAwMDEpCisJCXByaXYtPnNMb2NhbFBhcmEuYm9BbnRlbm5hRGl2ZXJzaXR5ID0gdHJ1ZTsKKworCS8vCisJLy8gRm9yIFRTIG1vZHVsZQorCS8vCisJSW5pdFN0ZXAgPSAyOworCisJLy8gRm9yIE1EUyBtb2R1bGUKKwlJbml0U3RlcCA9IDM7CisJTWRzX2luaXRpYWwocHJpdik7CisKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluaXRpYWxpemUgdGhlIFNNRSwgU0NBTiwgTUxNRSwgUk9BTQorCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJSW5pdFN0ZXAgPSA0OworCUluaXRTdGVwID0gNTsKKwlJbml0U3RlcCA9IDY7CisKKwkvLyBJZiBubyB1c2VyLWRlZmluZWQgYWRkcmVzcyBpbiB0aGUgcmVnaXN0cnksIHVzZSB0aGUgYWRkcmVzc3MgImJ1cm5lZCIgb24gdGhlIE5JQyBpbnN0ZWFkLgorCXBNYWNBZGRyID0gcHJpdi0+c0xvY2FsUGFyYS5UaGlzTWFjQWRkcmVzczsKKwlwTWFjQWRkcjIgPSBwcml2LT5zTG9jYWxQYXJhLlBlcm1hbmVudEFkZHJlc3M7CisJaGFsX2dldF9wZXJtYW5lbnRfYWRkcmVzcyggcEh3RGF0YSwgcHJpdi0+c0xvY2FsUGFyYS5QZXJtYW5lbnRBZGRyZXNzICk7Ly8gUmVhZGluZyBldGhlcm5ldCBhZGRyZXNzIGZyb20gRUVQUk9NCisJaWYgKG1lbWNtcChwTWFjQWRkciwgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsIE1BQ19BRERSX0xFTkdUSCkgPT0gMCkKKwkJbWVtY3B5KHBNYWNBZGRyLCBwTWFjQWRkcjIsIE1BQ19BRERSX0xFTkdUSCk7CisJZWxzZSB7CisJCS8vIFNldCB0aGUgdXNlciBkZWZpbmUgTUFDIGFkZHJlc3MKKwkJaGFsX3NldF9ldGhlcm5ldF9hZGRyZXNzKHBId0RhdGEsIHByaXYtPnNMb2NhbFBhcmEuVGhpc01hY0FkZHJlc3MpOworCX0KKworCS8vZ2V0IGN1cnJlbnQgYW50ZW5uYQorCXByaXYtPnNMb2NhbFBhcmEuYkFudGVubmFObyA9IGhhbF9nZXRfYW50ZW5uYV9udW1iZXIocEh3RGF0YSk7CisjaWZkZWYgX1BFX1NUQVRFX0RVTVBfCisJV0JERUJVRygoIkRyaXZlciBpbml0LCBhbnRlbm5hIG5vID0gJWRcbiIsIHBzTE9DQUwtPmJBbnRlbm5hTm8pKTsKKyNlbmRpZgorCWhhbF9nZXRfaHdfcmFkaW9fb2ZmKCBwSHdEYXRhICk7CisKKwkvLyBXYWl0aW5nIGZvciBIQUwgc2V0dGluZyBPSworCXdoaWxlICghaGFsX2lkbGUocEh3RGF0YSkpCisJCW1zbGVlcCgxMCk7CisKKwlNVE9fSW5pdChwcml2KTsKKworCUh3UmFkaW9PZmYgPSBoYWxfZ2V0X2h3X3JhZGlvX29mZiggcEh3RGF0YSApOworCXByaXYtPnNMb2NhbFBhcmEuUmFkaW9PZmZTdGF0dXMuYm9Id1JhZGlvT2ZmID0gISFId1JhZGlvT2ZmOworCisJaGFsX3NldF9yYWRpb19tb2RlKCBwSHdEYXRhLCAodW5zaWduZWQgY2hhcikocHJpdi0+c0xvY2FsUGFyYS5SYWRpb09mZlN0YXR1cy5ib1N3UmFkaW9PZmYgfHwgcHJpdi0+c0xvY2FsUGFyYS5SYWRpb09mZlN0YXR1cy5ib0h3UmFkaW9PZmYpICk7CisKKwloYWxfZHJpdmVyX2luaXRfT0socEh3RGF0YSkgPSAxOyAvLyBOb3RpZnkgaGFsIHRoYXQgdGhlIGRyaXZlciBpcyByZWFkeSBub3cuCisJLy9zZXQgYSB0eCBwb3dlciBmb3IgcmVmZXJlbmNlLi4uLi4KKy8vCXNtZV9zZXRfdHhfcG93ZXJfbGV2ZWwocHJpdiwgMTIpOwlGSVhNRT8KKwlyZXR1cm4gdHJ1ZTsKKworZXJyb3I6CisJc3dpdGNoIChJbml0U3RlcCkgeworCWNhc2UgNToKKwljYXNlIDQ6CisJY2FzZSAzOiBNZHNfRGVzdHJveSggcHJpdiApOworCWNhc2UgMjoKKwljYXNlIDE6IGhhbF9oYWx0KCBwSHdEYXRhLCBOVUxMICk7CisJY2FzZSAwOiBicmVhazsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQgd2IzNV9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkX3RhYmxlKQoreworCVBXQlVTQgkJcFdiVXNiOworICAgICAgICBzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppbnRlcmZhY2U7CisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludDsKKwl1MzIJbHRtcDsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJc3RydWN0IHdic29mdF9wcml2ICpwcml2OworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmRldjsKKwlpbnQgZXJyOworCisJdXNiX2dldF9kZXYodWRldik7CisKKwkvLyAyMDA2MDYzMC4yIENoZWNrIHRoZSBkZXZpY2UgaWYgaXQgYWxyZWFkeSBiZSBvcGVuZWQKKwllcnIgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3JjdmN0cmxwaXBlKCB1ZGV2LCAwICksCisJCQkgICAgICAweDAxLCBVU0JfVFlQRV9WRU5ET1J8VVNCX1JFQ0lQX0RFVklDRXxVU0JfRElSX0lOLAorCQkJICAgICAgMHgwLCAweDQwMCwgJmx0bXAsIDQsIEhaKjEwMCApOworCWlmIChlcnIpCisJCWdvdG8gZXJyb3I7CisKKwlsdG1wID0gY3B1X3RvX2xlMzIobHRtcCk7CisJaWYgKGx0bXApIHsgIC8vIElzIGFscmVhZHkgaW5pdGlhbGl6ZWQ/CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlkZXYgPSBpZWVlODAyMTFfYWxsb2NfaHcoc2l6ZW9mKCpwcml2KSwgJndic29mdF9vcHMpOworCWlmICghZGV2KQorCQlnb3RvIGVycm9yOworCisJcHJpdiA9IGRldi0+cHJpdjsKKworCXNwaW5fbG9ja19pbml0KCZwcml2LT5TcGluTG9jayk7CisKKwlwV2JVc2IgPSAmcHJpdi0+c0h3RGF0YS5XYlVzYjsKKwlwV2JVc2ItPnVkZXYgPSB1ZGV2OworCisgICAgICAgIGludGVyZmFjZSA9IGludGYtPmN1cl9hbHRzZXR0aW5nOworICAgICAgICBlbmRwb2ludCA9ICZpbnRlcmZhY2UtPmVuZHBvaW50WzBdLmRlc2M7CisKKwlpZiAoZW5kcG9pbnRbMl0ud01heFBhY2tldFNpemUgPT0gNTEyKSB7CisJCXByaW50aygiW3czNXVuZF0gV29ya2luZyBvbiBVU0IgMi4wXG4iKTsKKwkJcFdiVXNiLT5Jc1VzYjIwID0gMTsKKwl9CisKKwlpZiAoIXdiMzVfaHdfaW5pdChkZXYpKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3JfZnJlZV9odzsKKwl9CisKKwlTRVRfSUVFRTgwMjExX0RFVihkZXYsICZ1ZGV2LT5kZXYpOworCXsKKwkJcGh3X2RhdGFfdCBwSHdEYXRhID0gJnByaXYtPnNId0RhdGE7CisJCXVuc2lnbmVkIGNoYXIJCWRldl9hZGRyW01BWF9BRERSX0xFTl07CisJCWhhbF9nZXRfcGVybWFuZW50X2FkZHJlc3MocEh3RGF0YSwgZGV2X2FkZHIpOworCQlTRVRfSUVFRTgwMjExX1BFUk1fQUREUihkZXYsIGRldl9hZGRyKTsKKwl9CisKKwlkZXYtPmV4dHJhX3R4X2hlYWRyb29tID0gMTI7CS8qIEZJWE1FICovCisJZGV2LT5mbGFncyA9IDA7CisKKwlkZXYtPmNoYW5uZWxfY2hhbmdlX3RpbWUgPSAxMDAwOworCWRldi0+cXVldWVzID0gMTsKKworCWRldi0+d2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdID0gJndic29mdF9iYW5kXzJHSHo7CisKKwllcnIgPSBpZWVlODAyMTFfcmVnaXN0ZXJfaHcoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycm9yX2ZyZWVfaHc7CisKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIHByaXYpOworCisJcmV0dXJuIDA7CisKK2Vycm9yX2ZyZWVfaHc6CisJaWVlZTgwMjExX2ZyZWVfaHcoZGV2KTsKK2Vycm9yOgorCXVzYl9wdXRfZGV2KHVkZXYpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHdiMzVfaHdfaGFsdChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIpCit7CisJTWRzX0Rlc3Ryb3koIGFkYXB0ZXIgKTsKKworCS8vIFR1cm4gb2ZmIFJ4IGFuZCBUeCBoYXJkd2FyZSBhYmlsaXR5CisJaGFsX3N0b3AoICZhZGFwdGVyLT5zSHdEYXRhICk7CisjaWZkZWYgX1BFX1VTQl9JTklfRFVNUF8KKwlXQkRFQlVHKCgiW3czNXVuZF0gSGFsX3N0b3AgTy5LLlxuIikpOworI2VuZGlmCisJbXNsZWVwKDEwMCk7Ly8gV2FpdGluZyBJcnAgY29tcGxldGVkCisKKwkvLyBIYWx0IHRoZSBIQUwKKwloYWxfaGFsdCgmYWRhcHRlci0+c0h3RGF0YSwgTlVMTCk7Cit9CisKKworc3RhdGljIHZvaWQgd2IzNV9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCB3YnNvZnRfcHJpdiAqcHJpdiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisKKwl3YjM1X2h3X2hhbHQocHJpdik7CisKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOworCXVzYl9wdXRfZGV2KGludGVyZmFjZV90b191c2JkZXYoaW50ZikpOworfQorCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgd2IzNV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gInczNXVuZCIsCisJLmlkX3RhYmxlCT0gd2IzNV90YWJsZSwKKwkucHJvYmUJCT0gd2IzNV9wcm9iZSwKKwkuZGlzY29ubmVjdAk9IHdiMzVfZGlzY29ubmVjdCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHdiMzVfaW5pdCh2b2lkKQoreworCXJldHVybiB1c2JfcmVnaXN0ZXIoJndiMzVfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHdiMzVfZXhpdCh2b2lkKQoreworCXVzYl9kZXJlZ2lzdGVyKCZ3YjM1X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHdiMzVfaW5pdCk7Cittb2R1bGVfZXhpdCh3YjM1X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2J1c2Jfcy5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2J1c2Jfcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZTkzNjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YnVzYl9zLmgKQEAgLTAsMCArMSwzNyBAQAorLy8rKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCisvLyBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwNCBXaW5ib25kIEVsZWN0cm9uaWMgQ29ycG9yYXRpb24KKy8vCisvLyAgTW9kdWxlIE5hbWU6CisvLyAgICB3YnVzYl9zLmgKKy8vCisvLyAgQWJzdHJhY3Q6CisvLyAgICBMaW51eCBkcml2ZXIuCisvLworLy8gIEF1dGhvcjoKKy8vCisvLysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCisKKyNpZm5kZWYgX19XSU5CT05EX1dCVVNCX1NfSAorI2RlZmluZSBfX1dJTkJPTkRfV0JVU0JfU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFJXX0NPTlRFWFQgLS0KKy8vCisvLyAgVXNlZCB0byB0cmFjayBkcml2ZXItZ2VuZXJhdGVkIGlvIGlycHMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0eXBlZGVmIHN0cnVjdCBfUldfQ09OVEVYVAoreworCXZvaWQqCQkJcEh3RGF0YTsKKwlzdHJ1Y3QgdXJiCQkqdXJiOworCXZvaWQqCQkJcENhbGxCYWNrRnVuY3Rpb25QYXJhbWV0ZXI7Cit9IFJXX0NPTlRFWFQsICpQUldfQ09OVEVYVDsKKwordHlwZWRlZiBzdHJ1Y3QgX1dCVVNCIHsKKwl1MzIJSXNVc2IyMDsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKKwl1MzIJRGV0ZWN0Q291bnQ7Cit9IFdCVVNCLCAqUFdCVVNCOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9LY29uZmlnCmluZGV4IDI0MjVkODYuLjk5NTliNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvS2NvbmZpZwpAQCAtMSw5ICsxLDkgQEAKIGNvbmZpZyBQUklTTTJfVVNCCi0JdHJpc3RhdGUgIlByaXNtMi41IFVTQiBkcml2ZXIiCi0JZGVwZW5kcyBvbiBXTEFOXzgwMjExICYmIFVTQgorCXRyaXN0YXRlICJQcmlzbTIuNS8zIFVTQiBkcml2ZXIiCisJZGVwZW5kcyBvbiBXTEFOXzgwMjExICYmIFVTQiAmJiBXSVJFTEVTU19FWFQKIAlkZWZhdWx0IG4KIAktLS1oZWxwLS0tCi0JICBUaGlzIGlzIHRoZSB3bGFuLW5nIHByaXNtIDIuNSBVU0IgZHJpdmVyIGZvciBhIHdpZGUgcmFuZ2Ugb2YKKwkgIFRoaXMgaXMgdGhlIHdsYW4tbmcgcHJpc20gMi41LzMgVVNCIGRyaXZlciBmb3IgYSB3aWRlIHJhbmdlIG9mCiAJICBvbGQgVVNCIHdpcmVsZXNzIGRldmljZXMuCiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvTWFrZWZpbGUKaW5kZXggNzc3YjUxMS4uNWVkYWM1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvTWFrZWZpbGUKQEAgLTEsNyArMSw2IEBACiBvYmotJChDT05GSUdfUFJJU00yX1VTQikgKz0gcHJpc20yX3VzYi5vCi1vYmotJChDT05GSUdfUFJJU00yX1VTQikgKz0gcDgwMjExLm8KIAotcDgwMjExLW9ianMgOj0gcDgwMjExbW9kLm8gXAorcHJpc20yX3VzYi1vYmpzIDo9IHByaXNtMnVzYi5vIFwKIAkJcDgwMjExY29udi5vIFwKIAkJcDgwMjExcmVxLm8gXAogCQlwODAyMTF3ZXAubyBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9SRUFETUUgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9SRUFETUUKaW5kZXggZjUwZTRlYi4uOWMxMGRiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvUkVBRE1FCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL1JFQURNRQpAQCAtMyw2ICszLDUgQEAKIAktIHNwYXJzZSB3YXJuaW5ncwogCS0gTGluZGVudCBjbGVhbnVwcwogCS0gbW92ZSB0byB1c2UgdGhlIGluLWtlcm5lbCB3aXJlbGVzcyBzdGFjawotCS0gcG9zc2libGUgZW5hYmxlIHRoZSBwY21jaWEgYW5kIHBjaSBwb3J0aW9ucyBvZiB0aGUgZHJpdmVyCiAKIFBsZWFzZSBzZW5kIGFsbCBwYXRjaGVzIHRvIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9oZmEzODR4LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9oZmEzODR4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZGYzZmQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvaGZhMzg0eC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDAxOCArMCwwIEBACi0vKiBzcmMvcHJpc20yL2RyaXZlci9oZmEzODR4LmMKLSoKLSogSW1wbGVtZW50cyB0aGUgZnVuY3Rpb25zIG9mIHRoZSBJbnRlcnNpbCBoZmEzODR4IE1BQwotKgotKiBDb3B5cmlnaHQgKEMpIDE5OTkgQWJzb2x1dGVWYWx1ZSBTeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKgotKiBsaW51eC13bGFuCi0qCi0qICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMKLSogICBMaWNlbnNlIFZlcnNpb24gMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwotKgotKiAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUwotKiAgIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlCi0qICAgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKHRoZSAiR1BMIiksIGluIHdoaWNoCi0qICAgY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhlCi0qICAgYWJvdmUuICBJZiB5b3Ugd2lzaCB0byBhbGxvdyB0aGUgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUKLSogICBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZQotKiAgIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIE1QTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbgotKiAgIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCi0qICAgYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTC4gIElmIHlvdSBkbyBub3QgZGVsZXRlCi0qICAgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMKLSogICBmaWxlIHVuZGVyIGVpdGhlciB0aGUgTVBMIG9yIHRoZSBHUEwuCi0qCi0qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qCi0qIElucXVpcmllcyByZWdhcmRpbmcgdGhlIGxpbnV4LXdsYW4gT3BlbiBTb3VyY2UgcHJvamVjdCBjYW4gYmUKLSogbWFkZSBkaXJlY3RseSB0bzoKLSoKLSogQWJzb2x1dGVWYWx1ZSBTeXN0ZW1zIEluYy4KLSogaW5mb0BsaW51eC13bGFuLmNvbQotKiBodHRwOi8vd3d3LmxpbnV4LXdsYW4uY29tCi0qCi0qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qCi0qIFBvcnRpb25zIG9mIHRoZSBkZXZlbG9wbWVudCBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgZnVuZGVkIGJ5Ci0qIEludGVyc2lsIENvcnBvcmF0aW9uIGFzIHBhcnQgb2YgUFJJU00oUikgY2hpcHNldCBwcm9kdWN0IGRldmVsb3BtZW50LgotKgotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKgotKiBUaGlzIGZpbGUgaW1wbGVtZW50cyBmdW5jdGlvbnMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBwcmlzbTIvaGZhMzg0eAotKiA4MDIuMTEgTUFDIGhhcmR3YXJlIGFuZCBmaXJtd2FyZSBob3N0IGludGVyZmFjZS4KLSoKLSogVGhlIGZ1bmN0aW9ucyBjYW4gYmUgY29uc2lkZXJlZCB0byByZXByZXNlbnQgc2V2ZXJhbCBsZXZlbHMgb2YKLSogYWJzdHJhY3Rpb24uICBUaGUgbG93ZXN0IGxldmVsIGZ1bmN0aW9ucyBhcmUgc2ltcGx5IEMtY2FsbGFibGUgd3JhcHBlcnMKLSogYXJvdW5kIHRoZSByZWdpc3RlciBhY2Nlc3Nlcy4gIFRoZSBuZXh0IGhpZ2hlciBsZXZlbCByZXByZXNlbnRzIEMtY2FsbGFibGUKLSogcHJpc20yIEFQSSBmdW5jdGlvbnMgdGhhdCBtYXRjaCB0aGUgSW50ZXJzaWwgZG9jdW1lbnRhdGlvbiBhcyBjbG9zZWx5Ci0qIGFzIGlzIHJlYXNvbmFibGUuICBUaGUgbmV4dCBoaWdoZXIgbGF5ZXIgaW1wbGVtZW50cyBjb21tb24gc2VxdWVuY2VzCi0qIG9mIGludm9rYXRpb25zIG9mIHRoZSBBUEkgbGF5ZXIgKGUuZy4gd3JpdGUgdG8gYmFwLCBmb2xsb3dlZCBieSBjbWQpLgotKgotKiBDb21tb24gc2VxdWVuY2VzOgotKiBoZmEzODR4X2RydnJfeHh4CUhpZ2hlc3QgbGV2ZWwgYWJzdHJhY3Rpb25zIHByb3ZpZGVkIGJ5IHRoZQotKgkJCWhmYTM4NHggY29kZS4gIFRoZXkgYXJlIGRyaXZlciBkZWZpbmVkIHdyYXBwZXJzCi0qCQkJZm9yIGNvbW1vbiBzZXF1ZW5jZXMuICBUaGVzZSBmdW5jdGlvbnMgZ2VuZXJhbGx5Ci0qCQkJdXNlIHRoZSBzZXJ2aWNlcyBvZiB0aGUgbG93ZXIgbGV2ZWxzLgotKgotKiBoZmEzODR4X2RydnJfeHh4Y29uZmlnICBBbiBleGFtcGxlIG9mIHRoZSBkcnZyIGxldmVsIGFic3RyYWN0aW9uLiBUaGVzZQotKgkJCWZ1bmN0aW9ucyBhcmUgd3JhcHBlcnMgZm9yIHRoZSBSSUQgZ2V0L3NldAotKgkJCXNlcXVlbmNlLiBUaGV5IAljYWxsIGNvcHlfW3RvfGZyb21dX2JhcCgpIGFuZAotKgkJCWNtZF9hY2Nlc3MoKS4JVGhlc2UgZnVuY3Rpb25zIG9wZXJhdGUgb24gdGhlCi0qCQkJUklEcyBhbmQgYnVmZmVycyB3aXRob3V0IHZhbGlkYXRpb24uICBUaGUgY2FsbGVyCi0qCQkJaXMgcmVzcG9uc2libGUgZm9yIHRoYXQuCi0qCi0qIEFQSSB3cmFwcGVyIGZ1bmN0aW9uczoKLSogaGZhMzg0eF9jbWRfeHh4CWZ1bmN0aW9ucyB0aGF0IHByb3ZpZGUgYWNjZXNzIHRvIHRoZSBmL3cgY29tbWFuZHMuCi0qCQkJVGhlIGZ1bmN0aW9uIGFyZ3VtZW50cyBjb3JyZXNwb25kIHRvIGVhY2ggY29tbWFuZAotKgkJCWFyZ3VtZW50LCBldmVuIGNvbW1hbmQgYXJndW1lbnRzIHRoYXQgZ2V0IHBhY2tlZAotKgkJCWludG8gc2luZ2xlIHJlZ2lzdGVycy4gIFRoZXNlIGZ1bmN0aW9ucyBfanVzdF8KLSoJCQlpc3N1ZSB0aGUgY29tbWFuZCBieSBzZXR0aW5nIHRoZSBjbWQvcGFybSByZWdzCi0qCQkJJiByZWFkaW5nIHRoZSBzdGF0dXMvcmVzcCByZWdzLiAgQWRkaXRpb25hbAotKgkJCWFjdGl2aXRpZXMgcmVxdWlyZWQgdG8gZnVsbHkgdXNlIGEgY29tbWFuZAotKgkJCShyZWFkL3dyaXRlIGZyb20vdG8gYmFwLCBnZXQvc2V0IGludCBzdGF0dXMgZXRjLikKLSoJCQlhcmUgaW1wbGVtZW50ZWQgc2VwYXJhdGVseS4gIFRoaW5rIG9mIHRoZXNlIGFzCi0qCQkJQy1jYWxsYWJsZSBwcmlzbTIgY29tbWFuZHMuCi0qCi0qIExvd2VzdCBMYXllciBGdW5jdGlvbnM6Ci0qIGhmYTM4NHhfZG9jbWRfeHh4CVRoZXNlIGZ1bmN0aW9ucyBpbXBsZW1lbnQgdGhlIHNlcXVlbmNlIHJlcXVpcmVkCi0qCQkJdG8gaXNzdWUgYW55IHByaXNtMiBjb21tYW5kLiAgUHJpbWFyaWx5IHVzZWQgYnkgdGhlCi0qCQkJaGZhMzg0eF9jbWRfeHh4IGZ1bmN0aW9ucy4KLSoKLSogaGZhMzg0eF9iYXBfeHh4CUJBUCByZWFkL3dyaXRlIGFjY2VzcyBmdW5jdGlvbnMuCi0qCQkJTm90ZTogd2UgdXN1YWxseSB1c2UgQkFQMCBmb3Igbm9uLWludGVycnVwdCBjb250ZXh0Ci0qCQkJIGFuZCBCQVAxIGZvciBpbnRlcnJ1cHQgY29udGV4dC4KLSoKLSogaGZhMzg0eF9kbF94eHgJZG93bmxvYWQgcmVsYXRlZCBmdW5jdGlvbnMuCi0qCi0qIERyaXZlciBTdGF0ZSBJc3N1ZXM6Ci0qIE5vdGUgdGhhdCB0aGVyZSBhcmUgdHdvIHBhaXJzIG9mIGZ1bmN0aW9ucyB0aGF0IG1hbmFnZSB0aGUKLSogJ2luaXRpYWxpemVkJyBhbmQgJ3J1bm5pbmcnIHN0YXRlcyBvZiB0aGUgaHcvTUFDIGNvbWJvLiAgVGhlIGZvdXIKLSogZnVuY3Rpb25zIGFyZSBjcmVhdGUoKSwgZGVzdHJveSgpLCBzdGFydCgpLCBhbmQgc3RvcCgpLiAgY3JlYXRlKCkKLSogc2V0cyB1cCB0aGUgZGF0YSBzdHJ1Y3R1cmVzIHJlcXVpcmVkIHRvIHN1cHBvcnQgdGhlIGhmYTM4NHhfKgotKiBmdW5jdGlvbnMgYW5kIGRlc3Ryb3koKSBjbGVhbnMgdGhlbSB1cC4gIFRoZSBzdGFydCgpIGZ1bmN0aW9uIGdldHMKLSogdGhlIGFjdHVhbCBoYXJkd2FyZSBydW5uaW5nIGFuZCBlbmFibGVzIHRoZSBpbnRlcnJ1cHRzLiAgVGhlIHN0b3AoKQotKiBmdW5jdGlvbiBzaHV0cyB0aGUgaGFyZHdhcmUgZG93bi4gIFRoZSBzZXF1ZW5jZSBzaG91bGQgYmU6Ci0qIGNyZWF0ZSgpCi0qICAuCi0qICAuICBTZWxmIGNvbnRhaW5lZCB0ZXN0IHJvdXRpbmVzIGNhbiBydW4gaGVyZSwgcGFydGljdWxhcmx5Ci0qICAuICBjb3JlcmVzZXQoKSBhbmQgdGVzdF9ob3N0aWYoKS4KLSogIC4KLSogc3RhcnQoKQotKiAgLgotKiAgLiAgRG8gaW50ZXJlc3RpbmcgdGhpbmdzIHcvIHRoZSBoYXJkd2FyZQotKiAgLgotKiBzdG9wKCkKLSogZGVzdHJveSgpCi0qCi0qIE5vdGUgdGhhdCBkZXN0cm95KCkgY2FuIGJlIGNhbGxlZCB3aXRob3V0IGNhbGxpbmcgc3RvcCgpIGZpcnN0LgotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotLyogU3lzdGVtIEluY2x1ZGVzICovCi0jZGVmaW5lIFdMQU5fREJWQVIJcHJpc20yX2RlYnVnCi0jaW5jbHVkZSAidmVyc2lvbi5oIgotCi0KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKLSNpbmNsdWRlIDxsaW51eC90cXVldWUuaD4KLSNlbHNlCi0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Ci0jZW5kaWYKLQotI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDTUNJQSkKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDEzKSApCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KLSNlbmRpZgotI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgotI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgotI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KLSNpbmNsdWRlIDxwY21jaWEvZHMuaD4KLSNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+Ci0jZW5kaWYKLQotI2lmICgoV0xBTl9IT1NUSUYgPT0gV0xBTl9QTFgpIHx8IChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDSSkpCi0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIndsYW5fY29tcGF0LmgiCi0KLS8vIFhYWFggI2RlZmluZSBDTURfSVJRCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBQcm9qZWN0IEluY2x1ZGVzICovCi0KLSNpbmNsdWRlICJwODAyMTF0eXBlcy5oIgotI2luY2x1ZGUgInA4MDIxMWhkci5oIgotI2luY2x1ZGUgInA4MDIxMW1nbXQuaCIKLSNpbmNsdWRlICJwODAyMTFjb252LmgiCi0jaW5jbHVkZSAicDgwMjExbXNnLmgiCi0jaW5jbHVkZSAicDgwMjExbmV0ZGV2LmgiCi0jaW5jbHVkZSAicDgwMjExcmVxLmgiCi0jaW5jbHVkZSAicDgwMjExbWV0YWRlZi5oIgotI2luY2x1ZGUgInA4MDIxMW1ldGFzdHJ1Y3QuaCIKLSNpbmNsdWRlICJoZmEzODR4LmgiCi0jaW5jbHVkZSAicHJpc20ybWdtdC5oIgotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogTG9jYWwgQ29uc3RhbnRzICovCi0KLXN0YXRpYyBjb25zdCBVSU5UMTYgY3JjMTZ0YWJbMjU2XSA9Ci17Ci0JMHgwMDAwLCAweGMwYzEsIDB4YzE4MSwgMHgwMTQwLCAweGMzMDEsIDB4MDNjMCwgMHgwMjgwLCAweGMyNDEsCi0JMHhjNjAxLCAweDA2YzAsIDB4MDc4MCwgMHhjNzQxLCAweDA1MDAsIDB4YzVjMSwgMHhjNDgxLCAweDA0NDAsCi0JMHhjYzAxLCAweDBjYzAsIDB4MGQ4MCwgMHhjZDQxLCAweDBmMDAsIDB4Y2ZjMSwgMHhjZTgxLCAweDBlNDAsCi0JMHgwYTAwLCAweGNhYzEsIDB4Y2I4MSwgMHgwYjQwLCAweGM5MDEsIDB4MDljMCwgMHgwODgwLCAweGM4NDEsCi0JMHhkODAxLCAweDE4YzAsIDB4MTk4MCwgMHhkOTQxLCAweDFiMDAsIDB4ZGJjMSwgMHhkYTgxLCAweDFhNDAsCi0JMHgxZTAwLCAweGRlYzEsIDB4ZGY4MSwgMHgxZjQwLCAweGRkMDEsIDB4MWRjMCwgMHgxYzgwLCAweGRjNDEsCi0JMHgxNDAwLCAweGQ0YzEsIDB4ZDU4MSwgMHgxNTQwLCAweGQ3MDEsIDB4MTdjMCwgMHgxNjgwLCAweGQ2NDEsCi0JMHhkMjAxLCAweDEyYzAsIDB4MTM4MCwgMHhkMzQxLCAweDExMDAsIDB4ZDFjMSwgMHhkMDgxLCAweDEwNDAsCi0JMHhmMDAxLCAweDMwYzAsIDB4MzE4MCwgMHhmMTQxLCAweDMzMDAsIDB4ZjNjMSwgMHhmMjgxLCAweDMyNDAsCi0JMHgzNjAwLCAweGY2YzEsIDB4Zjc4MSwgMHgzNzQwLCAweGY1MDEsIDB4MzVjMCwgMHgzNDgwLCAweGY0NDEsCi0JMHgzYzAwLCAweGZjYzEsIDB4ZmQ4MSwgMHgzZDQwLCAweGZmMDEsIDB4M2ZjMCwgMHgzZTgwLCAweGZlNDEsCi0JMHhmYTAxLCAweDNhYzAsIDB4M2I4MCwgMHhmYjQxLCAweDM5MDAsIDB4ZjljMSwgMHhmODgxLCAweDM4NDAsCi0JMHgyODAwLCAweGU4YzEsIDB4ZTk4MSwgMHgyOTQwLCAweGViMDEsIDB4MmJjMCwgMHgyYTgwLCAweGVhNDEsCi0JMHhlZTAxLCAweDJlYzAsIDB4MmY4MCwgMHhlZjQxLCAweDJkMDAsIDB4ZWRjMSwgMHhlYzgxLCAweDJjNDAsCi0JMHhlNDAxLCAweDI0YzAsIDB4MjU4MCwgMHhlNTQxLCAweDI3MDAsIDB4ZTdjMSwgMHhlNjgxLCAweDI2NDAsCi0JMHgyMjAwLCAweGUyYzEsIDB4ZTM4MSwgMHgyMzQwLCAweGUxMDEsIDB4MjFjMCwgMHgyMDgwLCAweGUwNDEsCi0JMHhhMDAxLCAweDYwYzAsIDB4NjE4MCwgMHhhMTQxLCAweDYzMDAsIDB4YTNjMSwgMHhhMjgxLCAweDYyNDAsCi0JMHg2NjAwLCAweGE2YzEsIDB4YTc4MSwgMHg2NzQwLCAweGE1MDEsIDB4NjVjMCwgMHg2NDgwLCAweGE0NDEsCi0JMHg2YzAwLCAweGFjYzEsIDB4YWQ4MSwgMHg2ZDQwLCAweGFmMDEsIDB4NmZjMCwgMHg2ZTgwLCAweGFlNDEsCi0JMHhhYTAxLCAweDZhYzAsIDB4NmI4MCwgMHhhYjQxLCAweDY5MDAsIDB4YTljMSwgMHhhODgxLCAweDY4NDAsCi0JMHg3ODAwLCAweGI4YzEsIDB4Yjk4MSwgMHg3OTQwLCAweGJiMDEsIDB4N2JjMCwgMHg3YTgwLCAweGJhNDEsCi0JMHhiZTAxLCAweDdlYzAsIDB4N2Y4MCwgMHhiZjQxLCAweDdkMDAsIDB4YmRjMSwgMHhiYzgxLCAweDdjNDAsCi0JMHhiNDAxLCAweDc0YzAsIDB4NzU4MCwgMHhiNTQxLCAweDc3MDAsIDB4YjdjMSwgMHhiNjgxLCAweDc2NDAsCi0JMHg3MjAwLCAweGIyYzEsIDB4YjM4MSwgMHg3MzQwLCAweGIxMDEsIDB4NzFjMCwgMHg3MDgwLCAweGIwNDEsCi0JMHg1MDAwLCAweDkwYzEsIDB4OTE4MSwgMHg1MTQwLCAweDkzMDEsIDB4NTNjMCwgMHg1MjgwLCAweDkyNDEsCi0JMHg5NjAxLCAweDU2YzAsIDB4NTc4MCwgMHg5NzQxLCAweDU1MDAsIDB4OTVjMSwgMHg5NDgxLCAweDU0NDAsCi0JMHg5YzAxLCAweDVjYzAsIDB4NWQ4MCwgMHg5ZDQxLCAweDVmMDAsIDB4OWZjMSwgMHg5ZTgxLCAweDVlNDAsCi0JMHg1YTAwLCAweDlhYzEsIDB4OWI4MSwgMHg1YjQwLCAweDk5MDEsIDB4NTljMCwgMHg1ODgwLCAweDk4NDEsCi0JMHg4ODAxLCAweDQ4YzAsIDB4NDk4MCwgMHg4OTQxLCAweDRiMDAsIDB4OGJjMSwgMHg4YTgxLCAweDRhNDAsCi0JMHg0ZTAwLCAweDhlYzEsIDB4OGY4MSwgMHg0ZjQwLCAweDhkMDEsIDB4NGRjMCwgMHg0YzgwLCAweDhjNDEsCi0JMHg0NDAwLCAweDg0YzEsIDB4ODU4MSwgMHg0NTQwLCAweDg3MDEsIDB4NDdjMCwgMHg0NjgwLCAweDg2NDEsCi0JMHg4MjAxLCAweDQyYzAsIDB4NDM4MCwgMHg4MzQxLCAweDQxMDAsIDB4ODFjMSwgMHg4MDgxLCAweDQwNDAKLX07Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBMb2NhbCBNYWNyb3MgKi8KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIExvY2FsIFR5cGVzICovCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBMb2NhbCBTdGF0aWMgRGVmaW5pdGlvbnMgKi8KLWV4dGVybiBpbnQgcHJpc20yX2RlYnVnOwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogTG9jYWwgRnVuY3Rpb24gRGVjbGFyYXRpb25zICovCi0KLXN0YXRpYyB2b2lkCWhmYTM4NHhfaW50X2R0aW0od2xhbmRldmljZV90ICp3bGFuZGV2KTsKLXN0YXRpYyB2b2lkCWhmYTM4NHhfaW50X2luZmRyb3Aod2xhbmRldmljZV90ICp3bGFuZGV2KTsKLQotc3RhdGljIHZvaWQgICAgIGhmYTM4NHhfYmFwX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKLQotc3RhdGljIHZvaWQJaGZhMzg0eF9pbnRfaW5mbyh3bGFuZGV2aWNlX3QgKndsYW5kZXYpOwotc3RhdGljIHZvaWQJaGZhMzg0eF9pbnRfdHhleGMod2xhbmRldmljZV90ICp3bGFuZGV2KTsKLXN0YXRpYyB2b2lkCWhmYTM4NHhfaW50X3R4KHdsYW5kZXZpY2VfdCAqd2xhbmRldik7Ci1zdGF0aWMgdm9pZAloZmEzODR4X2ludF9yeCh3bGFuZGV2aWNlX3QgKndsYW5kZXYpOwotCi0jaWZkZWYgQ01EX0lSUQotc3RhdGljIHZvaWQJaGZhMzg0eF9pbnRfY21kKHdsYW5kZXZpY2VfdCAqd2xhbmRldik7Ci0jZW5kaWYKLXN0YXRpYyB2b2lkCWhmYTM4NHhfaW50X3J4bW9uaXRvciggd2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJVUlOVDE2IHJ4ZmlkLCBoZmEzODR4X3J4X2ZyYW1lX3QgKnJ4ZGVzYyk7Ci1zdGF0aWMgdm9pZAloZmEzODR4X2ludF9hbGxvYyh3bGFuZGV2aWNlX3QgKndsYW5kZXYpOwotCi1zdGF0aWMgaW50IGhmYTM4NHhfZG9jbWRfd2FpdCggaGZhMzg0eF90ICpodywgaGZhMzg0eF9tZXRhY21kX3QgKmNtZCk7Ci0KLXN0YXRpYyBpbnQgaGZhMzg0eF9kbF9kb2NtZF93YWl0KCBoZmEzODR4X3QgKmh3LCBoZmEzODR4X21ldGFjbWRfdCAqY21kKTsKLQotc3RhdGljIFVJTlQxNgotaGZhMzg0eF9ta2NyYzE2KFVJTlQ4ICpwLCBpbnQgbGVuKTsKLQotaW50IGhmYTM4NHhfY29weV90b19iYXA0KGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBiYXAsIFVJTlQxNiBpZCwgVUlOVDE2IG9mZnNldCwKLQkJCSB2b2lkICpidWYsIFVJTlQgbGVuLCB2b2lkKiBidWYyLCBVSU5UIGxlbjIsCi0JCQkgdm9pZCAqYnVmMywgVUlOVCBsZW4zLCB2b2lkKiBidWY0LCBVSU5UIGxlbjQpOwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogRnVuY3Rpb24gRGVmaW5pdGlvbnMgKi8KLQotc3RhdGljIFVJTlQxNgotdHhmaWRfcXVldWVfZW1wdHkoaGZhMzg0eF90ICpodykKLXsKLQlyZXR1cm4gKGh3LT50eGZpZF9oZWFkID09IGh3LT50eGZpZF90YWlsKSA/IDEgOiAwOwotfQotCi1zdGF0aWMgVUlOVDE2Ci10eGZpZF9xdWV1ZV9yZW1vdmUoaGZhMzg0eF90ICpodykKLXsKLQlVSU5UMTYgcmVzdWx0PSAwOwotCi0JaWYgKHR4ZmlkX3F1ZXVlX2VtcHR5KGh3KSkgewotCQlXTEFOX0xPR19ERUJVRygzLCJxdWV1ZSBlbXB0eS5cbiIpOwotCX0gZWxzZSB7Ci0JCXJlc3VsdCA9IGh3LT50eGZpZF9xdWV1ZVtody0+dHhmaWRfaGVhZF07Ci0JCWh3LT50eGZpZF9oZWFkID0gKGh3LT50eGZpZF9oZWFkICsgMSkgJSBody0+dHhmaWRfTjsKLQl9Ci0KLQlyZXR1cm4gKFVJTlQxNilyZXN1bHQ7Ci19Ci0KLXN0YXRpYyBJTlQxNgotdHhmaWRfcXVldWVfYWRkKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiB2YWwpCi17Ci0JSU5UMTYgcmVzdWx0ID0gMDsKLQotCWlmIChody0+dHhmaWRfaGVhZCA9PSAoKGh3LT50eGZpZF90YWlsICsgMSkgJSBody0+dHhmaWRfTikpIHsKLQkJcmVzdWx0ID0gLTE7Ci0JCVdMQU5fTE9HX0RFQlVHKDMsInF1ZXVlIGZ1bGwuXG4iKTsKLQl9IGVsc2UgewotCQlody0+dHhmaWRfcXVldWVbaHctPnR4ZmlkX3RhaWxdID0gdmFsOwotCQlyZXN1bHQgPSBody0+dHhmaWRfdGFpbDsKLQkJaHctPnR4ZmlkX3RhaWwgPSAoaHctPnR4ZmlkX3RhaWwgKyAxKSAlIGh3LT50eGZpZF9OOwotCX0KLQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2NyZWF0ZQotKgotKiBJbml0aWFsaXplcyB0aGUgaGZhMzg0eF90IGRhdGEgc3RydWN0dXJlIGZvciB1c2UuICBOb3RlIHRoaXMKLSogZG9lcyBfbm90XyBpbnRpYWxpemUgdGhlIGFjdHVhbCBoYXJkd2FyZSwganVzdCB0aGUgZGF0YSBzdHJ1Y3R1cmVzCi0qIHdlIHVzZSB0byBrZWVwIHRyYWNrIG9mIGl0cyBzdGF0ZS4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKglpcnEJCWRldmljZSBpcnEgbnVtYmVyCi0qCWlvYmFzZQkJW3BjbWNpYV0gaS9vIGJhc2UgYWRkcmVzcyBmb3IgcmVnaXN0ZXIgYWNjZXNzCi0qCQkJW3BjaV0gemVybwotKgkJCVtwbHhdIGkvbyBiYXNlIGFkZHJlc3MgZm9yIHJlZ2lzdGVyIGFjY2VzcwotKgltZW1iYXNlCQlbcGNtY2lhXSBwY21jaWFfY3MgImxpbmsiIHBvaW50ZXIKLSoJCQlbcGNpXSBtZW1vcnkgYmFzZSBhZGRyZXNzIGZvciByZWdpc3RlciBhY2Nlc3MKLSoJCQlbcGx4XSBtZW1vcnkgYmFzZSBhZGRyZXNzIGZvciBjYXJkIGF0dHJpYnV0ZSBtZW1vcnkKLSoKLSogUmV0dXJuczoKLSoJbm90aGluZwotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBoZmEzODR4X2NyZWF0ZShoZmEzODR4X3QgKmh3LCBVSU5UIGlycSwgVUlOVDMyIGlvYmFzZSwKLQkJICAgIFVJTlQ4IF9faW9tZW0gKm1lbWJhc2UpCi17Ci0JREJGRU5URVI7Ci0JbWVtc2V0KGh3LCAwLCBzaXplb2YoaGZhMzg0eF90KSk7Ci0JaHctPmlycSA9IGlycTsKLQlody0+aW9iYXNlID0gaW9iYXNlOwotCWh3LT5tZW1iYXNlID0gbWVtYmFzZTsKLQlzcGluX2xvY2tfaW5pdCgmKGh3LT5jbWRsb2NrKSk7Ci0KLQkvKiBCQVAgc2V0dXAgKi8KLSAJc3Bpbl9sb2NrX2luaXQoJihody0+YmFwbG9jaykpOwotCXRhc2tsZXRfaW5pdCgmaHctPmJhcF90YXNrbGV0LAotCQkgICAgIGhmYTM4NHhfYmFwX3Rhc2tsZXQsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcpIGh3KTsKLQotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmh3LT5jbWRxKTsKLQlzZW1hX2luaXQoJmh3LT5pbmZvZmlkX3NlbSwgMSk7Ci0KLSAgICAgICAgaHctPnR4ZmlkX2hlYWQgPSAwOwotICAgICAgICBody0+dHhmaWRfdGFpbCA9IDA7Ci0gICAgICAgIGh3LT50eGZpZF9OID0gSEZBMzg0eF9EUlZSX0ZJRFNUQUNLTEVOX01BWDsKLSAgICAgICAgbWVtc2V0KGh3LT50eGZpZF9xdWV1ZSwgMCwgc2l6ZW9mKGh3LT50eGZpZF9xdWV1ZSkpOwotCi0JaHctPmlzcmFtMTYgPSAxOwotCi0JLyogSW5pdCB0aGUgYXV0aCBxdWV1ZSBoZWFkICovCi0Jc2tiX3F1ZXVlX2hlYWRfaW5pdCgmaHctPmF1dGhxKTsKLQotCUlOSVRfV09SSzIoJmh3LT5saW5rX2JoLCBwcmlzbTJzdGFfcHJvY2Vzc2luZ19kZWZlcik7Ci0KLSAgICAgICAgSU5JVF9XT1JLMigmaHctPmNvbW1zcXVhbF9iaCwgcHJpc20yc3RhX2NvbW1zcXVhbF9kZWZlcik7Ci0KLQlpbml0X3RpbWVyKCZody0+Y29tbXNxdWFsX3RpbWVyKTsKLQlody0+Y29tbXNxdWFsX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgaHc7Ci0JaHctPmNvbW1zcXVhbF90aW1lci5mdW5jdGlvbiA9IHByaXNtMnN0YV9jb21tc3F1YWxfdGltZXI7Ci0KLQlody0+bGlua19zdGF0dXMgPSBIRkEzODR4X0xJTktfTk9UQ09OTkVDVEVEOwotCWh3LT5zdGF0ZSA9IEhGQTM4NHhfU1RBVEVfSU5JVDsKLQotCURCRkVYSVQ7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2Rlc3Ryb3kKLSoKLSogUGFydG5lciB0byBoZmEzODR4X2NyZWF0ZSgpLiAgVGhpcyBmdW5jdGlvbiBjbGVhbnMgdXAgdGhlIGh3Ci0qIHN0cnVjdHVyZSBzbyB0aGF0IGl0IGNhbiBiZSBmcmVlZCBieSB0aGUgY2FsbGVyIHVzaW5nIGEgc2ltcGxlCi0qIGtmcmVlLiAgQ3VycmVudGx5LCB0aGlzIGZ1bmN0aW9uIGlzIGp1c3QgYSBwbGFjZWhvbGRlci4gIElmLCBhdCBzb21lCi0qIHBvaW50IGluIHRoZSBmdXR1cmUsIGFuIGh3IGluIHRoZSAnc2h1dGRvd24nIHN0YXRlIHJlcXVpcmVzIGEgJ2RlZXAnCi0qIGtmcmVlLCB0aGlzIGlzIHdoZXJlIGl0IHNob3VsZCBiZSBkb25lLiAgTm90ZSB0aGF0IGlmIHRoaXMgZnVuY3Rpb24KLSogaXMgY2FsbGVkIG9uIGEgX3J1bm5pbmdfIGh3IHN0cnVjdHVyZSwgdGhlIGRydnJfc3RvcCgpIGZ1bmN0aW9uIGlzCi0qIGNhbGxlZC4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKgotKiBSZXR1cm5zOgotKglub3RoaW5nLCB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBhbGxvd2VkIHRvIGZhaWwuCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQKLWhmYTM4NHhfZGVzdHJveSggaGZhMzg0eF90ICpodykKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCi0JREJGRU5URVI7Ci0KLQlpZiAoIGh3LT5zdGF0ZSA9PSBIRkEzODR4X1NUQVRFX1JVTk5JTkcgKSB7Ci0JCWhmYTM4NHhfZHJ2cl9zdG9wKGh3KTsKLQl9Ci0JaHctPnN0YXRlID0gSEZBMzg0eF9TVEFURV9QUkVJTklUOwotCi0JaWYgKGh3LT5zY2FucmVzdWx0cykgewotCQlrZnJlZShody0+c2NhbnJlc3VsdHMpOwotCQlody0+c2NhbnJlc3VsdHMgPSBOVUxMOwotCX0KLQotICAgICAgICAvKiBOb3cgdG8gY2xlYW4gb3V0IHRoZSBhdXRoIHF1ZXVlICovCi0gICAgICAgIHdoaWxlICggKHNrYiA9IHNrYl9kZXF1ZXVlKCZody0+YXV0aHEpKSApIHsKLSAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiKHNrYik7Ci0gICAgICAgIH0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9kcnZyX2dldGNvbmZpZwotKgotKiBQZXJmb3JtcyB0aGUgc2VxdWVuY2UgbmVjZXNzYXJ5IHRvIHJlYWQgYSBjb25maWcvaW5mbyBpdGVtLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCXJpZAkJY29uZmlnL2luZm8gcmVjb3JkIGlkIChob3N0IG9yZGVyKQotKglidWYJCWhvc3Qgc2lkZSByZWNvcmQgYnVmZmVyLiAgVXBvbiByZXR1cm4gaXQgd2lsbAotKgkJCWNvbnRhaW4gdGhlIGJvZHkgcG9ydGlvbiBvZiB0aGUgcmVjb3JkIChtaW51cyB0aGUKLSoJCQlSSUQgYW5kIGxlbikuCi0qCWxlbgkJYnVmZmVyIGxlbmd0aCAoaW4gYnl0ZXMsIHNob3VsZCBtYXRjaCByZWNvcmQgbGVuZ3RoKQotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZXJyb3IgLSBmL3cgc3RhdHVzIGNvZGUKLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvcgotKgktRU5PREFUQSAJbGVuZ3RoIG1pc21hdGNoIGJldHdlZW4gYXJndW1lbnQgYW5kIHJldHJpZXZlZAotKgkJCXJlY29yZC4KLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiByaWQsIHZvaWQgKmJ1ZiwgVUlOVDE2IGxlbikKLXsKLQlpbnQgCQlyZXN1bHQgPSAwOwotCURCRkVOVEVSOwotCi0JcmVzdWx0ID0gaGZhMzg0eF9jbWRfYWNjZXNzKCBodywgMCwgcmlkLCBidWYsIGxlbik7Ci0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfZHJ2cl9zZXRjb25maWcKLSoKLSogUGVyZm9ybXMgdGhlIHNlcXVlbmNlIG5lY2Vzc2FyeSB0byB3cml0ZSBhIGNvbmZpZy9pbmZvIGl0ZW0uCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoJcmlkCQljb25maWcvaW5mbyByZWNvcmQgaWQgKGluIGhvc3Qgb3JkZXIpCi0qCWJ1ZgkJaG9zdCBzaWRlIHJlY29yZCBidWZmZXIKLSoJbGVuCQlidWZmZXIgbGVuZ3RoIChpbiBieXRlcykKLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGVycm9yIC0gZi93IHN0YXR1cyBjb2RlCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfc2V0Y29uZmlnKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiByaWQsIHZvaWQgKmJ1ZiwgVUlOVDE2IGxlbikKLXsKLQlpbnQJCXJlc3VsdCA9IDA7Ci0JREJGRU5URVI7Ci0KLQlyZXN1bHQgPSBoZmEzODR4X2NtZF9hY2Nlc3MoIGh3LCAxLCByaWQsIGJ1ZiwgbGVuKTsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9kcnZyX3JlYWRwZGEKLSoKLSogUGVyZm9ybXMgdGhlIHNlcXVlbmNlIHRvIHJlYWQgdGhlIFBEQSBzcGFjZS4gIE5vdGUgdGhlcmUgaXMgbm8KLSogZHJ2cl93cml0ZXBkYSgpIGZ1bmN0aW9uLiAgV3JpdGluZyBhIFBEQSBpcwotKiBnZW5lcmFsbHkgaW1wbGVtZW50ZWQgYnkgYSBjYWxsaW5nIGNvbXBvbmVudCB2aWEgY2FsbHMgdG8KLSogY21kX2Rvd25sb2FkIGFuZCB3cml0aW5nIHRvIHRoZSBmbGFzaCBkb3dubG9hZCBidWZmZXIgdmlhIHRoZQotKiBhdXggcmVncy4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKglidWYJCWJ1ZmZlciB0byBzdG9yZSBQREEgaW4KLSoJbGVuCQlidWZmZXIgbGVuZ3RoCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBlcnJvciAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yCi0qCS1FVElNRU9VVAl0aW1vdXQgd2FpdGluZyBmb3IgdGhlIGNtZCByZWdzIHRvIGJlY29tZQotKgkJCWF2YWlsYWJsZSwgb3Igd2FpdGluZyBmb3IgdGhlIGNvbnRyb2wgcmVnCi0qCQkJdG8gaW5kaWNhdGUgdGhlIEF1eCBwb3J0IGlzIGVuYWJsZWQuCi0qCS1FTk9EQVRBCXRoZSBidWZmZXIgZG9lcyBOT1QgY29udGFpbiBhIHZhbGlkIFBEQS4KLSoJCQlFaXRoZXIgdGhlIGNhcmQgUERBIGlzIGJhZCwgb3IgdGhlIGF1eGRhdGEKLSoJCQlyZWFkcyBhcmUgZ2l2aW5nIHVzIGdhcmJhZ2UuCi0KLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkIG9yIG5vbi1jYXJkIGludGVycnVwdC4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9yZWFkcGRhKGhmYTM4NHhfdCAqaHcsIHZvaWQgKmJ1ZiwgVUlOVCBsZW4pCi17Ci0JaW50CQlyZXN1bHQgPSAwOwotCVVJTlQxNgkJKnBkYSA9IGJ1ZjsKLQlpbnQJCXBkYW9rID0gMDsKLQlpbnQJCW1vcmVwZHJzID0gMTsKLQlpbnQJCWN1cnJwZHIgPSAwOwkvKiB3b3JkIG9mZnNldCBvZiB0aGUgY3VycmVudCBwZHIgKi8KLQlpbnQJCWk7Ci0JVUlOVDE2CQlwZHJsZW47CQkvKiBwZHIgbGVuZ3RoIGluIGJ5dGVzLCBob3N0IG9yZGVyICovCi0JVUlOVDE2CQlwZHJjb2RlOwkvKiBwZHIgY29kZSwgaG9zdCBvcmRlciAqLwotCVVJTlQxNgkJY3JjOwotCVVJTlQxNgkJcGRhY3JjOwotCXN0cnVjdCBwZGFsb2MgewotCQlVSU5UMzIJY2FyZGFkZHI7Ci0JCVVJTlQxNglhdXhjdGw7Ci0JfSBwZGFsb2NbXSA9Ci0JewotCQl7IEhGQTM4NDJfUERBX0JBU0UsCQlIRkEzODR4X0FVWF9DVExfTlZ9LAotCQl7IEhGQTM4NDJfUERBX0JBU0UsCQlIRkEzODR4X0FVWF9DVExfRVhURFN9LAotCQl7IEhGQTM4NDFfUERBX0JBU0UsCQlIRkEzODR4X0FVWF9DVExfTlZ9LAotCQl7IEhGQTM4NDFfUERBX0JBU0UsCQlIRkEzODR4X0FVWF9DVExfRVhURFN9LAotCQl7IEhGQTM4NDFfUERBX0JPR1VTX0JBU0UsCUhGQTM4NHhfQVVYX0NUTF9OVn0KLQl9OwotCi0JREJGRU5URVI7Ci0JLyogQ2hlY2sgZm9yIGF1eCBhdmFpbGFibGUgKi8KLQlyZXN1bHQgPSBoZmEzODR4X2NtZF9hdXhfZW5hYmxlKGh3LCAwKTsKLQlpZiAoIHJlc3VsdCApIHsKLQkJV0xBTl9MT0dfREVCVUcoMSwiYXV4X2VuYWJsZSgpIGZhaWxlZC4gcmVzdWx0PSVkXG4iLCByZXN1bHQpOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLQkvKiBSZWFkIHRoZSBwZGEgZnJvbSBlYWNoIGtub3duIGFkZHJlc3MuICAqLwotCWZvciAoIGkgPSAwOyBpIDwgKHNpemVvZihwZGFsb2MpL3NpemVvZihwZGFsb2NbMF0pKTsgaSsrKSB7Ci0JCVdMQU5fTE9HX0RFQlVHKCAzLCAiQ2hlY2tpbmcgUERBQCgweCUwOHgsJXMpXG4iLAotCQkJcGRhbG9jW2ldLmNhcmRhZGRyLAotCQkJcGRhbG9jW2ldLmF1eGN0bCA9PSBIRkEzODR4X0FVWF9DVExfTlYgPwotCQkJIkNUTF9OViIgOiAiQ1RMX0VYVERTIik7Ci0KLQkJLyogQ29weSBidWZzaXplIGJ5dGVzIGZyb20gb3VyIGN1cnJlbnQgcGRhbG9jICovCi0JCWhmYTM4NHhfY29weV9mcm9tX2F1eChodywKLQkJCXBkYWxvY1tpXS5jYXJkYWRkciwKLQkJCXBkYWxvY1tpXS5hdXhjdGwsCi0JCQlidWYsCi0JCQlsZW4pOwotCi0JCS8qIFRlc3QgZm9yIGdhcmJhZ2UgKi8KLQkJLyogVHJhdmVyc2UgdGhlIFBEUiBsaXN0IExvb2tpbmcgZm9yIFBEQS1FTkQgKi8KLQkJcGRhb2sgPSAxOwkvKiBpbnRpYWxseSBhc3N1bWUgZ29vZCAqLwotCQltb3JlcGRycyA9IDE7Ci0JCWN1cnJwZHIgPSAwOwotCQl3aGlsZSAoIHBkYW9rICYmIG1vcmVwZHJzICkgewotCQkJcGRybGVuID0gaGZhMzg0eDJob3N0XzE2KHBkYVtjdXJycGRyXSkgKiAyOwotCQkJcGRyY29kZSA9IGhmYTM4NHgyaG9zdF8xNihwZGFbY3VycnBkcisxXSk7Ci0KLQkJCS8qIFRlc3QgZm9yIGNvbXBsZXRpb24gYXQgRU5EIHJlY29yZCAqLwotCQkJaWYgKCBwZHJjb2RlID09IEhGQTM4NHhfUERSX0VORF9PRl9QREEgKSB7Ci0JCQkJaWYgKCBwZHJsZW4gPT0gNCApIHsKLQkJCQkJbW9yZXBkcnMgPSAwOwotCQkJCQkvKiBDYWxjdWxhdGUgQ1JDLTE2IGFuZCBjb21wYXJlIHRvIFBEQQotCQkJCQkgKiB2YWx1ZS4gIE5vdGUgdGhlIGFkZGl0aW9uIG9mIDIgd29yZHMKLQkJCQkJICogZm9yIEVORFJFQy5sZW4gYW5kIEVORFJFQy5jb2RlCi0JCQkJCSAqIGZpZWxkcy4KLQkJCQkJICovCi0JCQkJCWNyYyA9IGhmYTM4NHhfbWtjcmMxNiggKFVJTlQ4KilwZGEsCi0JCQkJCQkoY3VycnBkciArIDIpICogc2l6ZW9mKFVJTlQxNikpOwotCQkJCQlwZGFjcmMgPWhmYTM4NHgyaG9zdF8xNihwZGFbY3VycnBkcisyXSk7Ci0JCQkJCWlmICggY3JjICE9IHBkYWNyYyApIHsKLQkJCQkJCVdMQU5fTE9HX0RFQlVHKDMsCi0JCQkJCQkiUERBIGNyYyBmYWlsZWQ6IgotCQkJCQkJImNhbGNfY3JjPTB4JTA0eCwiCi0JCQkJCQkicGRyX2NyYz0weCUwNHguXG4iLAotCQkJCQkJY3JjLCBwZGFjcmMpOwotCQkJCQkJcGRhb2sgPSAwOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJV0xBTl9MT0dfREVCVUcoMywKLQkJCQkJIkVORCByZWNvcmQgZGV0ZWN0ZWQgdy8gIgotCQkJCQkibGVuKCVkKSAhPSAyLCBhc3N1bWluZyBiYWQgUERBXG4iLAotCQkJCQlwZHJsZW4pOwotCQkJCQlwZGFvayA9IDA7Ci0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8qIFRlc3QgdGhlIHJlY29yZCBsZW5ndGggKi8KLQkJCWlmICggcGRybGVuID4gSEZBMzg0eF9QRFJfTEVOX01BWCB8fCBwZHJsZW4gPT0gMCkgewotCQkJCVdMQU5fTE9HX0RFQlVHKDMsCi0JCQkJCSJwZHJsZW4gZm9yIGFkZHJlc3MgIyVkICIKLQkJCQkJImF0ICUjeDolI3g6JWRcbiIsCi0JCQkJCWksIHBkYWxvY1tpXS5jYXJkYWRkciwKLQkJCQkJcGRhbG9jW2ldLmF1eGN0bCwgcGRybGVuKTsKLQkJCQlXTEFOX0xPR19ERUJVRygzLCJwZHJsZW4gaW52YWxpZD0lZFxuIiwKLQkJCQkJcGRybGVuKTsKLQkJCQlwZGFvayA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8qIE1vdmUgdG8gdGhlIG5leHQgcGRyICovCi0JCQlpZiAoIG1vcmVwZHJzICkgewotCQkJCS8qIG5vdGUgdGhlIGFjY2VzcyB0byBwZGFbXSwgd2UgbmVlZCB3b3JkcyAqLwotCQkJCWN1cnJwZHIgKz0gaGZhMzg0eDJob3N0XzE2KHBkYVtjdXJycGRyXSkgKyAxOwotCQkJCWlmIChjdXJycGRyKnNpemVvZihVSU5UMTYpID4gbGVuKSB7Ci0JCQkJCVdMQU5fTE9HX0RFQlVHKDMsCi0JCQkJCSJEaWRuJ3QgZmluZCBQREFfRU5EIGluIGJ1ZmZlciwgIgotCQkJCQkidHJ5aW5nIG5leHQgbG9jYXRpb24uXG4iKTsKLQkJCQkJcGRhb2sgPSAwOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKCBwZGFvayApIHsKLQkJCVdMQU5fTE9HX0lORk8oCi0JCQkJIlBEQSBSZWFkIGZyb20gMHglMDh4IGluICVzIHNwYWNlLlxuIiwKLQkJCQlwZGFsb2NbaV0uY2FyZGFkZHIsCi0JCQkJcGRhbG9jW2ldLmF1eGN0bCA9PSAwID8gIkVYVERTIiA6Ci0JCQkJcGRhbG9jW2ldLmF1eGN0bCA9PSAxID8gIk5WIiA6Ci0JCQkJcGRhbG9jW2ldLmF1eGN0bCA9PSAyID8gIlBIWSIgOgotCQkJCXBkYWxvY1tpXS5hdXhjdGwgPT0gMyA/ICJJQ1NSQU0iIDoKLQkJCQkiPGJvZ3VzIGF1eGN0bD4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJlc3VsdCA9IHBkYW9rID8gMCA6IC1FTk9EQVRBOwotCi0JaWYgKCByZXN1bHQgKSB7Ci0JCVdMQU5fTE9HX0RFQlVHKDMsIkZhaWx1cmU6IHBkYSBpcyBub3Qgb2theVxuIik7Ci0JfQotCi0JaGZhMzg0eF9jbWRfYXV4X2Rpc2FibGUoaHcpOwotZmFpbGVkOgotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBta3BkYV9jcmMKLSoKLSogQ2FsY3VsYXRlcyB0aGUgQ1JDMTYgZm9yIHRoZSBnaXZlbiBQREEgYW5kIGluc2VydHMgdGhlIHZhbHVlCi0qIGludG8gdGhlIGVuZCByZWNvcmQuCi0qCi0qIEFyZ3VtZW50czoKLSoJcGRhCXB0ciB0byB0aGUgUERBIGRhdGEgc3RydWN0dXJlLgotKgotKiBSZXR1cm5zOgotKgkwCS0gc3VjY2VzcwotKgl+MAktIGZhaWx1cmUgKHByb2JhYmx5IGFuIGVycm5vKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgVUlOVDE2Ci1oZmEzODR4X21rY3JjMTYoVUlOVDggKnAsIGludCBsZW4pCi17Ci0JVUlOVDE2CWNyYyA9IDA7Ci0JVUlOVDgJKmxpbSA9IHAgKyBsZW47Ci0KLQl3aGlsZSAocCA8IGxpbSkgewotCQljcmMgPSAoY3JjID4+IDggKSBeIGNyYzE2dGFiWyhjcmMgJiAweGZmKSBeICpwKytdOwotCX0KLQotCXJldHVybiBjcmM7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfZHJ2cl9yYW1kbF9lbmFibGUKLSoKLSogQmVnaW5zIHRoZSByYW0gZG93bmxvYWQgc3RhdGUuICBDaGVja3MgdG8gc2VlIHRoYXQgd2UncmUgbm90Ci0qIGFscmVhZHkgaW4gYSBkb3dubG9hZCBzdGF0ZSBhbmQgdGhhdCBhIHBvcnQgaXNuJ3QgZW5hYmxlZC4KLSogU2V0cyB0aGUgZG93bmxvYWQgc3RhdGUgYW5kIGNhbGxzIGNtZF9kb3dubG9hZCB3aXRoIHRoZQotKiBFTkFCTEVfVk9MQVRJTEUgc3ViY29tbWFuZCBhbmQgdGhlIGV4ZWFkZHIgYXJndW1lbnQuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoJZXhlYWRkcgkJdGhlIGNhcmQgZXhlY3V0aW9uIGFkZHJlc3MgdGhhdCB3aWxsIGJlCi0qICAgICAgICAgICAgICAgICAgICAgICBqdW1wZWQgdG8gd2hlbiByYW1kbF9kaXNhYmxlKCkgaXMgY2FsbGVkCi0qCQkJKGhvc3Qgb3JkZXIpLgotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZXJyb3IgLSBmL3cgc3RhdHVzIGNvZGUKLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvcgotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9yYW1kbF9lbmFibGUoaGZhMzg0eF90ICpodywgVUlOVDMyIGV4ZWFkZHIpCi17Ci0JaW50CQlyZXN1bHQgPSAwOwotCVVJTlQxNgkJbG93YWRkcjsKLQlVSU5UMTYJCWhpYWRkcjsKLQlpbnQJCWk7Ci0JREJGRU5URVI7Ci0JLyogQ2hlY2sgdGhhdCBhIHBvcnQgaXNuJ3QgYWN0aXZlICovCi0JZm9yICggaSA9IDA7IGkgPCBIRkEzODR4X1BPUlRJRF9NQVg7IGkrKykgewotCQlpZiAoIGh3LT5wb3J0X2VuYWJsZWRbaV0gKSB7Ci0JCQlXTEFOX0xPR19ERUJVRygxLCJDYW4ndCBkb3dubG9hZCB3aXRoIGEgcG9ydCBlbmFibGVkLlxuIik7Ci0JCQlyZXN1bHQgPSAtRUlOVkFMOwotCQkJZ290byBkb25lOwotCQl9Ci0JfQotCi0JLyogQ2hlY2sgdGhhdCB3ZSdyZSBub3QgYWxyZWFkeSBpbiBhIGRvd25sb2FkIHN0YXRlICovCi0JaWYgKCBody0+ZGxzdGF0ZSAhPSBIRkEzODR4X0RMU1RBVEVfRElTQUJMRUQgKSB7Ci0JCVdMQU5fTE9HX0RFQlVHKDEsIkRvd25sb2FkIHN0YXRlIG5vdCBkaXNhYmxlZC5cbiIpOwotCQlyZXN1bHQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyogQXJlIHdlIHN1cHBvc2VkIHRvIGdvIGludG8gZ2VuZXNpcyBtb2RlPyAqLwotCWlmIChleGVhZGRyID09IDB4M2YwMDAwKSB7Ci0JCVVJTlQxNiBpbml0c2VxWzJdID0geyAweGUxMDAsIDB4ZmZhMSB9OwotCQlVSU5UMTYgcmVhZGJ1ZlsyXTsKLQkJVUlOVDggaGNyID0gMHgwZjsgLyogRGVmYXVsdCB0byB4MTYgU1JBTSAqLwotCQlody0+aXNyYW0xNiA9IDE7Ci0KLQkJV0xBTl9MT0dfREVCVUcoMSwgIkRyb3BwaW5nIGludG8gR2VuZXNpcyBtb2RlXG4iKTsKLQotCQkvKiBJc3N1ZSBjYXJkIHJlc2V0IGFuZCBlbmFibGUgYXV4IHBvcnQgKi8KLQkJaGZhMzg0eF9jb3JlcmVzZXQoaHcsIHByaXNtMl9yZXNldF9ob2xkdGltZSwKLQkJCQkgIHByaXNtMl9yZXNldF9zZXR0bGV0aW1lLCAwKTsKLQkJaGZhMzg0eF9jbWRfYXV4X2VuYWJsZShodywgMSk7Ci0KLQkJLyogR2VuZXNpcyBzZXQgKi8KLQkJaGZhMzg0eF9jb3B5X3RvX2F1eChodywgMHg3RTAwMzgsIEhGQTM4NHhfQVVYX0NUTF9FWFREUywKLQkJCQkgICAgaW5pdHNlcSwgc2l6ZW9mKGluaXRzZXEpKTsKLQotCQloZmEzODR4X2NvcmVyZXNldChodywgcHJpc20yX3Jlc2V0X2hvbGR0aW1lLAotCQkJCSAgcHJpc20yX3Jlc2V0X3NldHRsZXRpbWUsIGhjcik7Ci0KLQkJLyogVmFsaWRhdGUgbWVtb3J5IGNvbmZpZyAqLwotCQloZmEzODR4X2NvcHlfdG9fYXV4KGh3LCAweDdFMDAzOCwgSEZBMzg0eF9BVVhfQ1RMX0VYVERTLAotCQkJCSAgICBpbml0c2VxLCBzaXplb2YoaW5pdHNlcSkpOwotCQloZmEzODR4X2NvcHlfZnJvbV9hdXgoaHcsIDB4N0UwMDM4LCBIRkEzODR4X0FVWF9DVExfRVhURFMsCi0JCQkJICAgIHJlYWRidWYsIHNpemVvZihpbml0c2VxKSk7Ci0JCVdMQU5fSEVYX0RVTVAoMywgInJlYWRiYWNrIiwgcmVhZGJ1Ziwgc2l6ZW9mKHJlYWRidWYpKTsKLQotCQlpZiAobWVtY21wKGluaXRzZXEsIHJlYWRidWYsIHNpemVvZihyZWFkYnVmKSkpIHsKLQkJCWhjciA9IDB4MWY7IC8qIHg4IFNSQU0gKi8KLQkJCWh3LT5pc3JhbTE2ID0gMDsKLQotCQkJaGZhMzg0eF9jb3B5X3RvX2F1eChodywgMHg3RTAwMzgsIEhGQTM4NHhfQVVYX0NUTF9FWFREUywKLQkJCQkJICAgIGluaXRzZXEsIHNpemVvZihpbml0c2VxKSk7Ci0JCQloZmEzODR4X2NvcmVyZXNldChodywgcHJpc20yX3Jlc2V0X2hvbGR0aW1lLAotCQkJCQkgIHByaXNtMl9yZXNldF9zZXR0bGV0aW1lLCBoY3IpOwotCi0JCQloZmEzODR4X2NvcHlfdG9fYXV4KGh3LCAweDdFMDAzOCwgSEZBMzg0eF9BVVhfQ1RMX0VYVERTLAotCQkJCQkgICAgaW5pdHNlcSwgc2l6ZW9mKGluaXRzZXEpKTsKLQkJCWhmYTM4NHhfY29weV9mcm9tX2F1eChodywgMHg3RTAwMzgsIEhGQTM4NHhfQVVYX0NUTF9FWFREUywKLQkJCQkJICAgIHJlYWRidWYsIHNpemVvZihpbml0c2VxKSk7Ci0JCQlXTEFOX0hFWF9EVU1QKDIsICJyZWFkYmFjayIsIHJlYWRidWYsIHNpemVvZihyZWFkYnVmKSk7Ci0KLQkJCWlmIChtZW1jbXAoaW5pdHNlcSwgcmVhZGJ1Ziwgc2l6ZW9mKHJlYWRidWYpKSkgewotCQkJCVdMQU5fTE9HX0VSUk9SKCJHZW5lc2lzIG1vZGUgZmFpbGVkXG4iKTsKLQkJCQlyZXN1bHQgPSAtMTsKLQkJCQlnb3RvIGRvbmU7Ci0JCQl9Ci0JCX0KLQotCQkvKiBOb3cgd2UncmUgaW4gZ2VuZXNpcyBtb2RlICovCi0JCWh3LT5kbHN0YXRlID0gSEZBMzg0eF9ETFNUQVRFX0dFTkVTSVM7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKiBSZXRyaWV2ZSB0aGUgYnVmZmVyIGxvYyZzaXplIGFuZCB0aW1lb3V0ICovCi0JaWYgKCAocmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhodywgSEZBMzg0eF9SSURfRE9XTkxPQURCVUZGRVIsCi0JCQkJJihody0+YnVmaW5mbyksIHNpemVvZihody0+YnVmaW5mbykpKSApIHsKLQkJZ290byBkb25lOwotCX0KLQlody0+YnVmaW5mby5wYWdlID0gaGZhMzg0eDJob3N0XzE2KGh3LT5idWZpbmZvLnBhZ2UpOwotCWh3LT5idWZpbmZvLm9mZnNldCA9IGhmYTM4NHgyaG9zdF8xNihody0+YnVmaW5mby5vZmZzZXQpOwotCWh3LT5idWZpbmZvLmxlbiA9IGhmYTM4NHgyaG9zdF8xNihody0+YnVmaW5mby5sZW4pOwotCWlmICggKHJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcxNihodywgSEZBMzg0eF9SSURfTUFYTE9BRFRJTUUsCi0JCQkJJihody0+ZGx0aW1lb3V0KSkpICkgewotCQlnb3RvIGRvbmU7Ci0JfQotCWh3LT5kbHRpbWVvdXQgPSBoZmEzODR4Mmhvc3RfMTYoaHctPmRsdGltZW91dCk7Ci0KLQkvKiBFbmFibGUgdGhlIGF1eCBwb3J0ICovCi0JaWYgKCAocmVzdWx0ID0gaGZhMzg0eF9jbWRfYXV4X2VuYWJsZShodywgMCkpICkgewotCQlXTEFOX0xPR19ERUJVRygxLCJBdXggZW5hYmxlIGZhaWxlZCwgcmVzdWx0PSVkLlxuIiwgcmVzdWx0KTsKLQkJZ290byBkb25lOwotCX0KLQotCS8qIENhbGwgdGhlIGRvd25sb2FkKDEsYWRkcikgZnVuY3Rpb24gKi8KLQlsb3dhZGRyID0gSEZBMzg0eF9BRERSX0NNRF9NS09GRihleGVhZGRyKTsKLQloaWFkZHIgPSAgSEZBMzg0eF9BRERSX0NNRF9NS1BBR0UoZXhlYWRkcik7Ci0KLQlyZXN1bHQgPSBoZmEzODR4X2NtZF9kb3dubG9hZChodywgSEZBMzg0eF9QUk9HTU9ERV9SQU0sCi0JCQlsb3dhZGRyLCBoaWFkZHIsIDApOwotCWlmICggcmVzdWx0ID09IDApIHsKLQkJLyogU2V0IHRoZSBkb3dubG9hZCBzdGF0ZSAqLwotCQlody0+ZGxzdGF0ZSA9IEhGQTM4NHhfRExTVEFURV9SQU1FTkFCTEVEOwotCX0gZWxzZSB7Ci0JCVdMQU5fTE9HX0RFQlVHKDEsImNtZF9kb3dubG9hZCgweCUwNHgsIDB4JTA0eCkgZmFpbGVkLCByZXN1bHQ9JWQuXG4iLAotCQkJCWxvd2FkZHIsaGlhZGRyLCByZXN1bHQpOwotCQkvKiBEaXNhYmxlICB0aGUgYXV4IHBvcnQgKi8KLQkJaGZhMzg0eF9jbWRfYXV4X2Rpc2FibGUoaHcpOwotCX0KLQotIGRvbmU6Ci0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2RydnJfcmFtZGxfZGlzYWJsZQotKgotKiBFbmRzIHRoZSByYW0gZG93bmxvYWQgc3RhdGUuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGVycm9yIC0gZi93IHN0YXR1cyBjb2RlCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfcmFtZGxfZGlzYWJsZShoZmEzODR4X3QgKmh3KQotewotCURCRkVOVEVSOwotCS8qIENoZWNrIHRoYXQgd2UncmUgYWxyZWFkeSBpbiB0aGUgZG93bmxvYWQgc3RhdGUgKi8KLQlpZiAoICggaHctPmRsc3RhdGUgIT0gSEZBMzg0eF9ETFNUQVRFX1JBTUVOQUJMRUQgKSAmJgotCSAgICAgKCBody0+ZGxzdGF0ZSAhPSBIRkEzODR4X0RMU1RBVEVfR0VORVNJUyApICkgewotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoaHctPmRsc3RhdGUgPT0gSEZBMzg0eF9ETFNUQVRFX0dFTkVTSVMpIHsKLQkJaGZhMzg0eF9jb3JlcmVzZXQoaHcsIHByaXNtMl9yZXNldF9ob2xkdGltZSwKLQkJCQkgIHByaXNtMl9yZXNldF9zZXR0bGV0aW1lLAotCQkJCSAgaHctPmlzcmFtMTYgPyAweDA3OiAweDE3KTsKLQkJZ290byBkb25lOwotCX0KLQotCS8qIERpc2FibGUgdGhlIGF1eCBwb3J0ICovCi0JaGZhMzg0eF9jbWRfZG93bmxvYWQoaHcsIEhGQTM4NHhfUFJPR01PREVfRElTQUJMRSwgMCwgMCAsIDApOwotCi0gZG9uZToKLQlody0+ZGxzdGF0ZSA9IEhGQTM4NHhfRExTVEFURV9ESVNBQkxFRDsKLQloZmEzODR4X2NtZF9hdXhfZGlzYWJsZShodyk7Ci0KLQlEQkZFWElUOwotCXJldHVybiAwOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2RydnJfcmFtZGxfd3JpdGUKLSoKLSogUGVyZm9ybXMgYSBSQU0gZG93bmxvYWQgb2YgYSBjaHVuayBvZiBkYXRhLiBGaXJzdCBjaGVja3MgdG8gc2VlCi0qIHRoYXQgd2UncmUgaW4gdGhlIFJBTSBkb3dubG9hZCBzdGF0ZSwgdGhlbiB1c2VzIHRoZSBhdXggZnVuY3Rpb25zCi0qIHRvIDEpIGNvcHkgdGhlIGRhdGEsIDIpIHJlYWRiYWNrIGFuZCBjb21wYXJlLiAgVGhlIGRvd25sb2FkCi0qIHN0YXRlIGlzIHVuYWZmZWN0ZWQuICBXaGVuIGFsbCBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4gdXNpbmcKLSogdGhpcyBmdW5jdGlvbiwgY2FsbCBkcnZyX3JhbWRsX2Rpc2FibGUoKSB0byBlbmQgdGhlIGRvd25sb2FkIHN0YXRlCi0qIGFuZCByZXN0YXJ0IHRoZSBNQUMuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoJZGFkZHIJCUNhcmQgYWRkcmVzcyB0byB3cml0ZSB0by4gKGhvc3Qgb3JkZXIpCi0qCWJ1ZgkJUHRyIHRvIGRhdGEgdG8gd3JpdGUuCi0qCWxlbgkJTGVuZ3RoIG9mIGRhdGEgKGhvc3Qgb3JkZXIpLgotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZXJyb3IgLSBmL3cgc3RhdHVzIGNvZGUKLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvcgotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9yYW1kbF93cml0ZShoZmEzODR4X3QgKmh3LCBVSU5UMzIgZGFkZHIsIHZvaWQqIGJ1ZiwgVUlOVDMyIGxlbikKLXsKLQlpbnQJCXJlc3VsdCA9IDA7Ci0JVUlOVDgJCSp2ZXJidWY7Ci0JREJGRU5URVI7Ci0JLyogQ2hlY2sgdGhhdCB3ZSdyZSBpbiB0aGUgcmFtIGRvd25sb2FkIHN0YXRlICovCi0JaWYgKCAoIGh3LT5kbHN0YXRlICE9IEhGQTM4NHhfRExTVEFURV9SQU1FTkFCTEVEICkgJiYKLQkgICAgICggaHctPmRsc3RhdGUgIT0gSEZBMzg0eF9ETFNUQVRFX0dFTkVTSVMgKSApIHsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JV0xBTl9MT0dfSU5GTygiV3JpdGluZyAlZCBieXRlcyB0byByYW0gQDB4JTA2eFxuIiwgbGVuLCBkYWRkcik7Ci0jaWYgMAotV0xBTl9IRVhfRFVNUCgxLCAiZGxkYXRhIiwgYnVmLCBsZW4pOwotI2VuZGlmCi0JLyogQ29weSB0aGUgZGF0YSB2aWEgdGhlIGF1eCBwb3J0ICovCi0JaGZhMzg0eF9jb3B5X3RvX2F1eChodywgZGFkZHIsIEhGQTM4NHhfQVVYX0NUTF9FWFREUywgYnVmLCBsZW4pOwotCi0JLyogQ3JlYXRlIGEgYnVmZmVyIGZvciB0aGUgdmVyaWZ5ICovCi0JdmVyYnVmID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOwotCWlmICh2ZXJidWYgPT0gTlVMTCApIHJldHVybiAxOwotCi0JLyogUmVhZCBiYWNrIGFuZCBjb21wYXJlICovCi0JaGZhMzg0eF9jb3B5X2Zyb21fYXV4KGh3LCBkYWRkciwgSEZBMzg0eF9BVVhfQ1RMX0VYVERTLCB2ZXJidWYsIGxlbik7Ci0KLQlpZiAoIG1lbWNtcChidWYsIHZlcmJ1ZiwgbGVuKSApIHsKLQkJV0xBTl9MT0dfREVCVUcoMSwicmFtZGwgdmVyaWZ5IGZhaWxlZCFcbiIpOwotCQlyZXN1bHQgPSAtRUlOVkFMOwotCX0KLQotCWtmcmVlX3ModmVyYnVmLCBsZW4pOwotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9kcnZyX2ZsYXNoZGxfZW5hYmxlCi0qCi0qIEJlZ2lucyB0aGUgZmxhc2ggZG93bmxvYWQgc3RhdGUuICBDaGVja3MgdG8gc2VlIHRoYXQgd2UncmUgbm90Ci0qIGFscmVhZHkgaW4gYSBkb3dubG9hZCBzdGF0ZSBhbmQgdGhhdCBhIHBvcnQgaXNuJ3QgZW5hYmxlZC4KLSogU2V0cyB0aGUgZG93bmxvYWQgc3RhdGUgYW5kIHJldHJpZXZlcyB0aGUgZmxhc2ggZG93bmxvYWQKLSogYnVmZmVyIGxvY2F0aW9uLCBidWZmZXIgc2l6ZSwgYW5kIHRpbWVvdXQgbGVuZ3RoLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBlcnJvciAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX2ZsYXNoZGxfZW5hYmxlKGhmYTM4NHhfdCAqaHcpCi17Ci0JaW50CQlyZXN1bHQgPSAwOwotCWludAkJaTsKLQotCURCRkVOVEVSOwotCS8qIENoZWNrIHRoYXQgYSBwb3J0IGlzbid0IGFjdGl2ZSAqLwotCWZvciAoIGkgPSAwOyBpIDwgSEZBMzg0eF9QT1JUSURfTUFYOyBpKyspIHsKLQkJaWYgKCBody0+cG9ydF9lbmFibGVkW2ldICkgewotCQkJV0xBTl9MT0dfREVCVUcoMSwiY2FsbGVkIHdoZW4gcG9ydCBlbmFibGVkLlxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0KLQotCS8qIENoZWNrIHRoYXQgd2UncmUgbm90IGFscmVhZHkgaW4gYSBkb3dubG9hZCBzdGF0ZSAqLwotCWlmICggaHctPmRsc3RhdGUgIT0gSEZBMzg0eF9ETFNUQVRFX0RJU0FCTEVEICkgewotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBSZXRyaWV2ZSB0aGUgYnVmZmVyIGxvYyZzaXplIGFuZCB0aW1lb3V0ICovCi0JaWYgKCAocmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhodywgSEZBMzg0eF9SSURfRE9XTkxPQURCVUZGRVIsCi0JCQkJJihody0+YnVmaW5mbyksIHNpemVvZihody0+YnVmaW5mbykpKSApIHsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JaHctPmJ1ZmluZm8ucGFnZSA9IGhmYTM4NHgyaG9zdF8xNihody0+YnVmaW5mby5wYWdlKTsKLQlody0+YnVmaW5mby5vZmZzZXQgPSBoZmEzODR4Mmhvc3RfMTYoaHctPmJ1ZmluZm8ub2Zmc2V0KTsKLQlody0+YnVmaW5mby5sZW4gPSBoZmEzODR4Mmhvc3RfMTYoaHctPmJ1ZmluZm8ubGVuKTsKLQlpZiAoIChyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnMTYoaHcsIEhGQTM4NHhfUklEX01BWExPQURUSU1FLAotCQkJCSYoaHctPmRsdGltZW91dCkpKSApIHsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JaHctPmRsdGltZW91dCA9IGhmYTM4NHgyaG9zdF8xNihody0+ZGx0aW1lb3V0KTsKLQotCS8qIEVuYWJsZSB0aGUgYXV4IHBvcnQgKi8KLQlpZiAoIChyZXN1bHQgPSBoZmEzODR4X2NtZF9hdXhfZW5hYmxlKGh3LCAwKSkgKSB7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JaHctPmRsc3RhdGUgPSBIRkEzODR4X0RMU1RBVEVfRkxBU0hFTkFCTEVEOwotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9kcnZyX2ZsYXNoZGxfZGlzYWJsZQotKgotKiBFbmRzIHRoZSBmbGFzaCBkb3dubG9hZCBzdGF0ZS4gIE5vdGUgdGhhdCB0aGlzIHdpbGwgY2F1c2UgdGhlIE1BQwotKiBmaXJtd2FyZSB0byByZXN0YXJ0LgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBlcnJvciAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX2ZsYXNoZGxfZGlzYWJsZShoZmEzODR4X3QgKmh3KQotewotCURCRkVOVEVSOwotCS8qIENoZWNrIHRoYXQgd2UncmUgYWxyZWFkeSBpbiB0aGUgZG93bmxvYWQgc3RhdGUgKi8KLQlpZiAoIGh3LT5kbHN0YXRlICE9IEhGQTM4NHhfRExTVEFURV9GTEFTSEVOQUJMRUQgKSB7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIFRoZXJlIGlzbid0IG11Y2ggd2UgY2FuIGRvIGF0IHRoaXMgcG9pbnQsIHNvIEkgZG9uJ3QgKi8KLQkvKiAgYm90aGVyICB3LyB0aGUgcmV0dXJuIHZhbHVlICovCi0JaGZhMzg0eF9jbWRfZG93bmxvYWQoaHcsIEhGQTM4NHhfUFJPR01PREVfRElTQUJMRSwgMCwgMCAsIDApOwotCWh3LT5kbHN0YXRlID0gSEZBMzg0eF9ETFNUQVRFX0RJU0FCTEVEOwotCi0JLyogRGlzYWJsZSB0aGUgYXV4IHBvcnQgKi8KLQloZmEzODR4X2NtZF9hdXhfZGlzYWJsZShodyk7Ci0KLQlEQkZFWElUOwotCXJldHVybiAwOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2RydnJfZmxhc2hkbF93cml0ZQotKgotKiBQZXJmb3JtcyBhIEZMQVNIIGRvd25sb2FkIG9mIGEgY2h1bmsgb2YgZGF0YS4gRmlyc3QgY2hlY2tzIHRvIHNlZQotKiB0aGF0IHdlJ3JlIGluIHRoZSBGTEFTSCBkb3dubG9hZCBzdGF0ZSwgdGhlbiBzZXRzIHRoZSBkb3dubG9hZAotKiBtb2RlLCB1c2VzIHRoZSBhdXggZnVuY3Rpb25zIHRvIDEpIGNvcHkgdGhlIGRhdGEgdG8gdGhlIGZsYXNoCi0qIGJ1ZmZlciwgMikgc2V0cyB0aGUgZG93bmxvYWQgJ3dyaXRlIGZsYXNoJyBtb2RlLCAzKSByZWFkYmFjayBhbmQKLSogY29tcGFyZS4gIExhdGhlciByaW5zZSwgcmVwZWF0IGFzIG1hbnkgdGltZXMgYW4gbmVjZXNzYXJ5IHRvIGdldAotKiBhbGwgdGhlIGdpdmVuIGRhdGEgaW50byBmbGFzaC4KLSogV2hlbiBhbGwgZGF0YSBoYXMgYmVlbiB3cml0dGVuIHVzaW5nIHRoaXMgZnVuY3Rpb24gKHBvc3NpYmx5Ci0qIHJlcGVhdGVkbHkpLCBjYWxsIGRydnJfZmxhc2hkbF9kaXNhYmxlKCkgdG8gZW5kIHRoZSBkb3dubG9hZCBzdGF0ZQotKiBhbmQgcmVzdGFydCB0aGUgTUFDLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCWRhZGRyCQlDYXJkIGFkZHJlc3MgdG8gd3JpdGUgdG8uIChob3N0IG9yZGVyKQotKglidWYJCVB0ciB0byBkYXRhIHRvIHdyaXRlLgotKglsZW4JCUxlbmd0aCBvZiBkYXRhIChob3N0IG9yZGVyKS4KLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGVycm9yIC0gZi93IHN0YXR1cyBjb2RlCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfZmxhc2hkbF93cml0ZShoZmEzODR4X3QgKmh3LCBVSU5UMzIgZGFkZHIsIHZvaWQqIGJ1ZiwgVUlOVDMyIGxlbikKLXsKLQlpbnQJCXJlc3VsdCA9IDA7Ci0JVUlOVDgJCSp2ZXJidWY7Ci0JVUlOVDMyCQlkbGJ1ZmFkZHI7Ci0JVUlOVDMyCQljdXJybGVuOwotCVVJTlQzMgkJY3VycmRhZGRyOwotCVVJTlQxNgkJZGVzdGxvOwotCVVJTlQxNgkJZGVzdGhpOwotCWludAkJbndyaXRlczsKLQlpbnQJCWk7Ci0KLQlEQkZFTlRFUjsKLQkvKiBDaGVjayB0aGF0IHdlJ3JlIGluIHRoZSBmbGFzaCBkb3dubG9hZCBzdGF0ZSAqLwotCWlmICggaHctPmRsc3RhdGUgIT0gSEZBMzg0eF9ETFNUQVRFX0ZMQVNIRU5BQkxFRCApIHsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JV0xBTl9MT0dfSU5GTygiRG93bmxvYWQgJWQgYnl0ZXMgdG8gZmxhc2ggQDB4JTA2eFxuIiwgbGVuLCBkYWRkcik7Ci0KLQkvKiBOZWVkIGEgZmxhdCBhZGRyZXNzIGZvciBhcml0aG1ldGljICovCi0JZGxidWZhZGRyID0gSEZBMzg0eF9BRERSX0FVWF9NS0ZMQVQoCi0JCQlody0+YnVmaW5mby5wYWdlLAotCQkJaHctPmJ1ZmluZm8ub2Zmc2V0KTsKLQl2ZXJidWYgPSBrbWFsbG9jKGh3LT5idWZpbmZvLmxlbiwgR0ZQX0tFUk5FTCk7Ci0KLSNpZiAwCi1XTEFOX0xPR19XQVJOSU5HKCJkbGJ1ZkAweCUwNmx4IGxlbj0lZCB0bz0lZFxuIiwgZGxidWZhZGRyLCBody0+YnVmaW5mby5sZW4sIGh3LT5kbHRpbWVvdXQpOwotI2VuZGlmCi0JLyogRmlndXJlIG91dCBob3cgbWFueSB0aW1lcyB0byB0byB0aGUgZmxhc2ggcHJvZyAqLwotCW53cml0ZXMgPSBsZW4gLyBody0+YnVmaW5mby5sZW47Ci0JbndyaXRlcyArPSAobGVuICUgaHctPmJ1ZmluZm8ubGVuKSA/IDEgOiAwOwotCi0JaWYgKCB2ZXJidWYgPT0gTlVMTCApIHsKLQkJV0xBTl9MT0dfRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBmbGFzaCB2ZXJpZnkgYnVmZmVyXG4iKTsKLQkJcmV0dXJuIDE7Ci0JfQotCS8qIEZvciBlYWNoICovCi0JZm9yICggaSA9IDA7IGkgPCBud3JpdGVzOyBpKyspIHsKLQkJLyogR2V0IHRoZSBkZXN0IGFkZHJlc3MgYW5kIGxlbiAqLwotCQljdXJybGVuID0gKGxlbiAtIChody0+YnVmaW5mby5sZW4gKiBpKSkgPiBody0+YnVmaW5mby5sZW4gPwotCQkJCWh3LT5idWZpbmZvLmxlbiA6Ci0JCQkJKGxlbiAtIChody0+YnVmaW5mby5sZW4gKiBpKSk7Ci0JCWN1cnJkYWRkciA9IGRhZGRyICsgKGh3LT5idWZpbmZvLmxlbiAqIGkpOwotCQlkZXN0bG8gPSBIRkEzODR4X0FERFJfQ01EX01LT0ZGKGN1cnJkYWRkcik7Ci0JCWRlc3RoaSA9IEhGQTM4NHhfQUREUl9DTURfTUtQQUdFKGN1cnJkYWRkcik7Ci0JCVdMQU5fTE9HX0lORk8oIldyaXRpbmcgJWQgYnl0ZXMgdG8gZmxhc2ggQDB4JTA2eFxuIiwgY3VycmxlbiwgY3VycmRhZGRyKTsKLSNpZiAwCi1XTEFOX0hFWF9EVU1QKDEsICJkbGRhdGEiLCBidWYrKGh3LT5idWZpbmZvLmxlbippKSwgY3Vycmxlbik7Ci0jZW5kaWYKLQkJLyogU2V0IHRoZSBkb3dubG9hZCBtb2RlICovCi0JCXJlc3VsdCA9IGhmYTM4NHhfY21kX2Rvd25sb2FkKGh3LCBIRkEzODR4X1BST0dNT0RFX05WLAotCQkJCWRlc3RsbywgZGVzdGhpLCBjdXJybGVuKTsKLQkJaWYgKCByZXN1bHQgKSB7Ci0JCQlXTEFOX0xPR19FUlJPUigiZG93bmxvYWQoTlYsbG89JXgsaGk9JXgsbGVuPSV4KSAiCi0JCQkJImNtZCBmYWlsZWQsIHJlc3VsdD0lZC4gQWJvcnRpbmcgZC9sXG4iLAotCQkJCWRlc3RsbywgZGVzdGhpLCBjdXJybGVuLCByZXN1bHQpOwotCQkJZ290byBleGl0X3Byb2M7Ci0JCX0KLQkJLyogY29weSB0aGUgZGF0YSB0byB0aGUgZmxhc2ggYnVmZmVyICovCi0JCWhmYTM4NHhfY29weV90b19hdXgoaHcsIGRsYnVmYWRkciwgSEZBMzg0eF9BVVhfQ1RMX0VYVERTLAotCQkJCQlidWYrKGh3LT5idWZpbmZvLmxlbippKSwgY3Vycmxlbik7Ci0JCS8qIHNldCB0aGUgZG93bmxvYWQgJ3dyaXRlIGZsYXNoJyBtb2RlICovCi0JCXJlc3VsdCA9IGhmYTM4NHhfY21kX2Rvd25sb2FkKGh3LCBIRkEzODR4X1BST0dNT0RFX05WV1JJVEUsIDAsMCwwKTsKLQkJaWYgKCByZXN1bHQgKSB7Ci0JCQlXTEFOX0xPR19FUlJPUigKLQkJCQkiZG93bmxvYWQoTlZXUklURSxsbz0leCxoaT0leCxsZW49JXgpICIKLQkJCQkiY21kIGZhaWxlZCwgcmVzdWx0PSVkLiBBYm9ydGluZyBkL2xcbiIsCi0JCQkJZGVzdGxvLCBkZXN0aGksIGN1cnJsZW4sIHJlc3VsdCk7Ci0JCQlnb3RvIGV4aXRfcHJvYzsKLQkJfQotCQkvKiByZWFkYmFjayBhbmQgY29tcGFyZSwgaWYgZmFpbC4uLmJhaWwgKi8KLQkJaGZhMzg0eF9jb3B5X2Zyb21fYXV4KGh3LAotCQkJCWN1cnJkYWRkciwgSEZBMzg0eF9BVVhfQ1RMX05WLAotCQkJCXZlcmJ1ZiwgY3Vycmxlbik7Ci0KLQkJaWYgKCBtZW1jbXAoYnVmKyhody0+YnVmaW5mby5sZW4qaSksIHZlcmJ1ZiwgY3VycmxlbikgKSB7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0KLQotZXhpdF9wcm9jOgotICAgICAgICAgLyogRE9IISBUaGlzIGtmcmVlJ3MgZm9yIHlvdSBNYXJrIDotKSBNeSBmb3JlaGVhZCBodXJ0cy4uLiAqLwotICAgICAgICAga2ZyZWUodmVyYnVmKTsKLQotCS8qIExlYXZlIHRoZSBmaXJtd2FyZSBpbiB0aGUgJ3Bvc3QtcHJvZycgbW9kZS4gIGZsYXNoZGxfZGlzYWJsZSB3aWxsICovCi0JLyogIGFjdHVhbGx5IGRpc2FibGUgcHJvZ3JhbW1pbmcgbW9kZS4gIFJlbWVtYmVyLCB0aGF0IHdpbGwgY2F1c2UgdGhlICovCi0JLyogIHRoZSBmaXJtd2FyZSB0byBlZmZlY3RpdmVseSByZXNldCBpdHNlbGYuICovCi0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfY21kX2luaXRpYWxpemUKLSoKLSogSXNzdWVzIHRoZSBpbml0aWFsaXplIGNvbW1hbmQgYW5kIHNldHMgdGhlIGh3LT5zdGF0ZSBiYXNlZAotKiBvbiB0aGUgcmVzdWx0LgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBlcnJvciAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9jbWRfaW5pdGlhbGl6ZShoZmEzODR4X3QgKmh3KQotewotCWludCByZXN1bHQgPSAwOwotCWludCBpOwotCWhmYTM4NHhfbWV0YWNtZF90IGNtZDsKLQotCURCRkVOVEVSOwotCi0JLyogd2UgZG9uJ3Qgd2FudCB0byBiZSBpbnRlcnJ1cHRlZCBkdXJpbmcgdGhlIHJlc2V0ICovCi0JaGZhMzg0eF9zZXRyZWcoaHcsIDAsIEhGQTM4NHhfSU5URU4pOwotCWhmYTM4NHhfc2V0cmVnKGh3LCAweGZmZmYsIEhGQTM4NHhfRVZBQ0spOwotCi0JY21kLmNtZCA9IEhGQTM4NHhfQ01EQ09ERV9JTklUOwotCWNtZC5wYXJtMCA9IDA7Ci0JY21kLnBhcm0xID0gMDsKLQljbWQucGFybTIgPSAwOwotCi0Jc3Bpbl9sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0JcmVzdWx0ID0gaGZhMzg0eF9kb2NtZF93YWl0KGh3LCAmY21kKTsKLQlzcGluX3VubG9ja19iaCgmaHctPmNtZGxvY2spOwotCi0JaWYgKCByZXN1bHQgPT0gMCApIHsKLQkJZm9yICggaSA9IDA7IGkgPCBIRkEzODR4X05VTVBPUlRTX01BWDsgaSsrKSB7Ci0JCQlody0+cG9ydF9lbmFibGVkW2ldID0gMDsKLQkJfQotCX0KLQotICAgICAgICBody0+bGlua19zdGF0dXMgPSBIRkEzODR4X0xJTktfTk9UQ09OTkVDVEVEOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2RydnJfY29tbXRhbGxpZXMKLSoKLSogU2VuZCBhIGNvbW10YWxsaWVzIGlucXVpcnkgdG8gdGhlIE1BQy4gIE5vdGUgdGhhdCB0aGlzIGlzIGFuIGFzeW5jCi0qIGNhbGwgdGhhdCB3aWxsIHJlc3VsdCBpbiBhbiBpbmZvIGZyYW1lIGFycml2aW5nIHNvbWV0aW1lIGxhdGVyLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCi0qIFJldHVybnM6Ci0qCXplcm8JCXN1Y2Nlc3MuCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfY29tbXRhbGxpZXMoIGhmYTM4NHhfdCAqaHcgKQotewotCWhmYTM4NHhfbWV0YWNtZF90IGNtZDsKLQlpbnQgcmVzdWx0OwotCi0JREJGRU5URVI7Ci0KLQljbWQuY21kID0gSEZBMzg0eF9DTURDT0RFX0lOUTsKLQljbWQucGFybTAgPSBIRkEzODR4X0lUX0NPTU1UQUxMSUVTOwotCWNtZC5wYXJtMSA9IDA7Ci0JY21kLnBhcm0yID0gMDsKLQotCXNwaW5fbG9ja19iaCgmaHctPmNtZGxvY2spOwotCXJlc3VsdCA9IGhmYTM4NHhfZG9jbWRfd2FpdChodywgJmNtZCk7Ci0Jc3Bpbl91bmxvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9kcnZyX2VuYWJsZQotKgotKiBJc3N1ZXMgdGhlIGVuYWJsZSBjb21tYW5kIHRvIGVuYWJsZSBjb21tdW5pY2F0aW9ucyBvbiBvbmUgb2YKLSogdGhlIE1BQ3MgJ3BvcnRzJy4gIE9ubHkgbWFjcG9ydCAwIGlzIHZhbGlkICBmb3Igc3RhdGlvbnMuCi0qIEFQcyBtYXkgYWxzbyBlbmFibGUgbWFjcG9ydHMgMS02LiAgT25seSBwb3J0cyB0aGF0IGFyZSBjdXJyZW50bHkKLSogZGlzYWJsZWQgbWF5IGJlIGVuYWJsZWQuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoJbWFjcG9ydAkJTUFDIHBvcnQgbnVtYmVyCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBmYWlsdXJlIC0gZi93IHN0YXR1cyBjb2RlCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IgKHRpbWVvdXR8YmFkIGFyZykKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfZW5hYmxlKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBtYWNwb3J0KQotewotCWludAlyZXN1bHQgPSAwOwotCi0JREJGRU5URVI7Ci0JaWYgKCghaHctPmlzYXAgJiYgbWFjcG9ydCAhPSAwKSB8fAotCSAgICAoaHctPmlzYXAgJiYgIShtYWNwb3J0IDw9IEhGQTM4NHhfUE9SVElEX01BWCkpIHx8Ci0JICAgIChody0+cG9ydF9lbmFibGVkW21hY3BvcnRdKSApewotCQlyZXN1bHQgPSAtRUlOVkFMOwotCX0gZWxzZSB7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfY21kX2VuYWJsZShodywgbWFjcG9ydCk7Ci0JCWlmICggcmVzdWx0ID09IDAgKSB7Ci0JCQlody0+cG9ydF9lbmFibGVkW21hY3BvcnRdID0gMTsKLQkJfQotCX0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfY21kX2VuYWJsZQotKgotKiBJc3N1ZXMgdGhlIHRoZSBlbmFibGUgY29tbWFuZCB0byBlbmFibGUgY29tbXVuaWNhdGlvbnMgb24gb25lIG9mIHRoZQotKiBNQUNzICdwb3J0cycuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoJbWFjcG9ydAkJTUFDIHBvcnQgbnVtYmVyCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBmYWlsdXJlIC0gZi93IHN0YXR1cyBjb2RlCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IgKHRpbWVvdXR8YmFkIGFyZykKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2NtZF9lbmFibGUoaGZhMzg0eF90ICpodywgVUlOVDE2IG1hY3BvcnQpCi17Ci0JaW50CXJlc3VsdCA9IDA7Ci0JaGZhMzg0eF9tZXRhY21kX3QgY21kOwotCi0JREJGRU5URVI7Ci0KLQljbWQuY21kID0gSEZBMzg0eF9DTURfQ01EQ09ERV9TRVQoSEZBMzg0eF9DTURDT0RFX0VOQUJMRSkgfAotCQkgIEhGQTM4NHhfQ01EX01BQ1BPUlRfU0VUKG1hY3BvcnQpOwotCWNtZC5wYXJtMCA9IDA7Ci0JY21kLnBhcm0xID0gMDsKLQljbWQucGFybTIgPSAwOwotCi0Jc3Bpbl9sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0JcmVzdWx0ID0gaGZhMzg0eF9kb2NtZF93YWl0KGh3LCAmY21kKTsKLQlzcGluX3VubG9ja19iaCgmaHctPmNtZGxvY2spOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2RydnJfZGlzYWJsZQotKgotKiBJc3N1ZXMgdGhlIGRpc2FibGUgY29tbWFuZCB0byBzdG9wIGNvbW11bmljYXRpb25zIG9uIG9uZSBvZgotKiB0aGUgTUFDcyAncG9ydHMnLiAgT25seSBtYWNwb3J0IDAgaXMgdmFsaWQgIGZvciBzdGF0aW9ucy4KLSogQVBzIG1heSBhbHNvIGRpc2FibGUgbWFjcG9ydHMgMS02LiAgT25seSBwb3J0cyB0aGF0IGhhdmUgYmVlbgotKiBwcmV2aW91c2x5IGVuYWJsZWQgbWF5IGJlIGRpc2FibGVkLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCW1hY3BvcnQJCU1BQyBwb3J0IG51bWJlciAoaG9zdCBvcmRlcikKLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGZhaWx1cmUgLSBmL3cgc3RhdHVzIGNvZGUKLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvciAodGltZW91dHxiYWQgYXJnKQotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9kaXNhYmxlKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBtYWNwb3J0KQotewotCWludAlyZXN1bHQgPSAwOwotCi0JREJGRU5URVI7Ci0JaWYgKCghaHctPmlzYXAgJiYgbWFjcG9ydCAhPSAwKSB8fAotCSAgICAoaHctPmlzYXAgJiYgIShtYWNwb3J0IDw9IEhGQTM4NHhfUE9SVElEX01BWCkpIHx8Ci0JICAgICEoaHctPnBvcnRfZW5hYmxlZFttYWNwb3J0XSkgKXsKLQkJcmVzdWx0ID0gLUVJTlZBTDsKLQl9IGVsc2UgewotCQlyZXN1bHQgPSBoZmEzODR4X2NtZF9kaXNhYmxlKGh3LCBtYWNwb3J0KTsKLQkJaWYgKCByZXN1bHQgPT0gMCApIHsKLQkJCWh3LT5wb3J0X2VuYWJsZWRbbWFjcG9ydF0gPSAwOwotCQl9Ci0JfQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9jbWRfZGlzYWJsZQotKgotKiBJc3N1ZXMgdGhlIGNvbW1hbmQgdG8gZGlzYWJsZSBhIHBvcnQuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoJbWFjcG9ydAkJTUFDIHBvcnQgbnVtYmVyIChob3N0IG9yZGVyKQotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZmFpbHVyZSAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yICh0aW1lb3V0fGJhZCBhcmcpCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9jbWRfZGlzYWJsZShoZmEzODR4X3QgKmh3LCBVSU5UMTYgbWFjcG9ydCkKLXsKLQlpbnQJcmVzdWx0ID0gMDsKLQloZmEzODR4X21ldGFjbWRfdCBjbWQ7Ci0KLQlEQkZFTlRFUjsKLQotCWNtZC5jbWQgPSBIRkEzODR4X0NNRF9DTURDT0RFX1NFVChIRkEzODR4X0NNRENPREVfRElTQUJMRSkgfAotCQkgIEhGQTM4NHhfQ01EX01BQ1BPUlRfU0VUKG1hY3BvcnQpOwotCWNtZC5wYXJtMCA9IDA7Ci0JY21kLnBhcm0xID0gMDsKLQljbWQucGFybTIgPSAwOwotCi0Jc3Bpbl9sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0JcmVzdWx0ID0gaGZhMzg0eF9kb2NtZF93YWl0KGh3LCAmY21kKTsKLQlzcGluX3VubG9ja19iaCgmaHctPmNtZGxvY2spOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2NtZF9kaWFnbm9zZQotKgotKiBJc3N1ZXMgdGhlIGRpYWdub3NlIGNvbW1hbmQgdG8gdGVzdCB0aGU6IHJlZ2lzdGVyIGludGVyZmFjZSwKLSogTUFDIGNvbnRyb2xsZXIgKGluY2x1ZGluZyBsb29wYmFjayksIEV4dGVybmFsIFJBTSwgTm9uLXZvbGF0aWxlCi0qIG1lbW9yeSBpbnRlZ3JpdHksIGFuZCBzeW50aGVzaXplcnMuICBGb2xsb3dpbmcgZXhlY3V0aW9uIG9mIHRoaXMKLSogY29tbWFuZCwgTUFDL2Zpcm13YXJlIGFyZSBpbiB0aGUgJ2luaXRpYWwgc3RhdGUnLiAgVGhlcmVmb3JlLAotKiB0aGUgSW5pdGlhbGl6ZSBjb21tYW5kIHNob3VsZCBiZSBpc3N1ZWQgYWZ0ZXIgc3VjY2Vzc2Z1bAotKiBjb21wbGV0aW9uIG9mIHRoaXMgY29tbWFuZC4gIFRoaXMgZnVuY3Rpb24gbWF5IG9ubHkgYmUgY2FsbGVkCi0qIHdoZW4gdGhlIE1BQyBpcyBpbiB0aGUgJ2NvbW11bmljYXRpb24gZGlzYWJsZWQnIHN0YXRlLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBmYWlsdXJlIC0gZi93IHN0YXR1cyBjb2RlCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IgKHRpbWVvdXR8YmFkIGFyZykKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgRElBR19QQVRURVJOQSAoKFVJTlQxNikweGFhYWEpCi0jZGVmaW5lIERJQUdfUEFUVEVSTkIgKChVSU5UMTYpMHg1NTU1KQotCi1pbnQgaGZhMzg0eF9jbWRfZGlhZ25vc2UoaGZhMzg0eF90ICpodykKLXsKLQlpbnQJcmVzdWx0ID0gMDsKLQloZmEzODR4X21ldGFjbWRfdCBjbWQ7Ci0KLQlEQkZFTlRFUjsKLQotCWNtZC5jbWQgPSBIRkEzODR4X0NNRF9DTURDT0RFX1NFVChIRkEzODR4X0NNRENPREVfRElBRyk7Ci0JY21kLnBhcm0wID0gRElBR19QQVRURVJOQTsKLQljbWQucGFybTEgPSBESUFHX1BBVFRFUk5COwotCWNtZC5wYXJtMiA9IDA7Ci0KLQlzcGluX2xvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQlyZXN1bHQgPSBoZmEzODR4X2RvY21kX3dhaXQoaHcsICZjbWQpOwotCXNwaW5fdW5sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfY21kX2FsbG9jYXRlCi0qCi0qIElzc3VlcyB0aGUgYWxsb2NhdGUgY29tbWFuZCBpbnN0cnVjdGluZyB0aGUgZmlybXdhcmUgdG8gYWxsb2NhdGUKLSogYSAnZnJhbWUgc3RydWN0dXJlIGJ1ZmZlcicgaW4gTUFDIGNvbnRyb2xsZXIgUkFNLiAgVGhpcyBjb21tYW5kCi0qIGRvZXMgbm90IHByb3ZpZGUgdGhlIHJlc3VsdCwgaXQgb25seSBpbml0aWF0ZXMgb25lIG9mIHRoZSBmL3cncwotKiBhc3luY2hyb25vdXMgcHJvY2Vzc2VzIHRvIGNvbnN0cnVjdCB0aGUgYnVmZmVyLiAgV2hlbiB0aGUKLSogYWxsb2NhdGlvbiBpcyBjb21wbGV0ZSwgaXQgd2lsbCBiZSBpbmRpY2F0ZWQgdmlhIHRoZSBBbGxvYwotKiBiaXQgaW4gdGhlIEV2U3RhdCByZWdpc3RlciBhbmQgdGhlIEZJRCBpZGVudGlmeWluZyB0aGUgYWxsb2NhdGVkCi0qIHNwYWNlIHdpbGwgYmUgYXZhaWxhYmxlIGZyb20gdGhlIEFsbG9jRklEIHJlZ2lzdGVyLiAgU29tZSBjYXJlCi0qIHNob3VsZCBiZSB0YWtlbiB3aGVuIHdhaXRpbmcgZm9yIHRoZSBBbGxvYyBldmVudC4gIElmIGEgVHggb3IKLSogTm90aWZ5IGNvbW1hbmQgdy8gUmVjbGFpbSBoYXMgYmVlbiBwcmV2aW91c2x5IGV4ZWN1dGVkLCBpdCdzCi0qIHBvc3NpYmxlIHRoZSBmaXJzdCBBbGxvYyBldmVudCBhZnRlciBleGVjdXRpb24gb2YgdGhpcyBjb21tYW5kCi0qIHdpbGwgYmUgZm9yIHRoZSByZWNsYWltZWQgYnVmZmVyIGFuZCBub3QgdGhlIG9uZSB5b3UgYXNrZWQgZm9yLgotKiBUaGlzIGNhc2UgbXVzdCBiZSBoYW5kbGVkIGluIHRoZSBBbGxvYyBldmVudCBoYW5kbGVyLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCWxlbgkJYWxsb2NhdGlvbiBsZW5ndGgsIG11c3QgYmUgYW4gZXZlbiB2YWx1ZQotKgkJCWluIHRoZSByYW5nZSBbNC0yNDAwXS4gKGhvc3Qgb3JkZXIpCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBmYWlsdXJlIC0gZi93IHN0YXR1cyBjb2RlCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IgKHRpbWVvdXR8YmFkIGFyZykKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2NtZF9hbGxvY2F0ZShoZmEzODR4X3QgKmh3LCBVSU5UMTYgbGVuKQotewotCWludAlyZXN1bHQgPSAwOwotCWhmYTM4NHhfbWV0YWNtZF90IGNtZDsKLQotCURCRkVOVEVSOwotCi0JaWYgKCAobGVuICUgMikgfHwKLQkgICAgIGxlbiA8IEhGQTM4NHhfQ01EX0FMTE9DX0xFTl9NSU4gfHwKLQkgICAgIGxlbiA+IEhGQTM4NHhfQ01EX0FMTE9DX0xFTl9NQVggKSB7Ci0JCXJlc3VsdCA9IC1FSU5WQUw7Ci0JfSBlbHNlIHsKLQkJY21kLmNtZCA9IEhGQTM4NHhfQ01EX0NNRENPREVfU0VUKEhGQTM4NHhfQ01EQ09ERV9BTExPQyk7Ci0JCWNtZC5wYXJtMCA9IGxlbjsKLQkJY21kLnBhcm0xID0gMDsKLQkJY21kLnBhcm0yID0gMDsKLQotCQlzcGluX2xvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQkJcmVzdWx0ID0gaGZhMzg0eF9kb2NtZF93YWl0KGh3LCAmY21kKTsKLQkJc3Bpbl91bmxvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQl9Ci0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2NtZF90cmFuc21pdAotKgotKiBJbnN0cnVjdHMgdGhlIGZpcm13YXJlIHRvIHRyYW5zbWl0IGEgZnJhbWUgcHJldmlvdXNseSBjb3BpZWQKLSogdG8gYSBnaXZlbiBidWZmZXIuICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgaW1tZWRpYXRlbHksIHRoZSBUeAotKiByZXN1bHRzIGFyZSBhdmFpbGFibGUgdmlhIHRoZSBUeCBvciBUeEV4YyBldmVudHMgKGlmIHRoZSBmcmFtZQotKiBjb250cm9sIGJpdHMgYXJlIHNldCkuICBUaGUgcmVjbGFpbSBhcmd1bWVudCBzcGVjaWZpZXMgaWYgdGhlCi0qIEZJRCBwYXNzZWQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBmL3cgdHggcHJvY2VzcyBvciByZXR1cm5lZCBmb3IKLSogdXNlIHcvIGFub3RoZXIgdHJhbnNtaXQgY29tbWFuZC4gIElmIHJlY2xhaW0gaXMgc2V0LCBleHBlY3QgYW4KLSogQWxsb2MgZXZlbnQgc2lnbmFsbGluZyB0aGUgYXZhaWxpYmlsaXR5IG9mIHRoZSBGSUQgZm9yIHJldXNlLgotKgotKiBOT1RFOiBody0+Y21kbG9jayBNVVNUIEJFIEhFTEQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiEKLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKglyZWNsYWltCQlbMHwxXSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZ2l2ZW4gRklEIHdpbGwKLSoJCQliZSBoYW5kZWQgYmFjayAodmlhIEFsbG9jIGV2ZW50KSBmb3IgcmV1c2UuCi0qCQkJKGhvc3Qgb3JkZXIpCi0qCXFvcwkJWzAtM10gVmFsdWUgdG8gcHV0IGluIHRoZSBRb1MgZmllbGQgb2YgdGhlCi0qCQkJdHggY29tbWFuZCwgaWRlbnRpZmllcyBhIHF1ZXVlIHRvIHBsYWNlIHRoZQotKgkJCW91dGdvaW5nIGZyYW1lIGluLgotKgkJCShob3N0IG9yZGVyKQotKglmaWQJCUZJRCBvZiBidWZmZXIgY29udGFpbmluZyB0aGUgZnJhbWUgdGhhdCB3YXMKLSoJCQlwcmV2aW91c2x5IGNvcGllZCB0byBNQUMgbWVtb3J5IHZpYSB0aGUgYmFwLgotKgkJCShob3N0IG9yZGVyKQotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZmFpbHVyZSAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yICh0aW1lb3V0fGJhZCBhcmcpCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoJaHctPnJlc3AwIHdpbGwgY29udGFpbiB0aGUgRklEIGJlaW5nIHVzZWQgYnkgYXN5bmMgdHgKLSoJcHJvY2Vzcy4gIElmIHJlY2xhaW09PTAsIHJlc3AwIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIGZpZAotKglhcmd1bWVudC4gIElmIHJlY2xhaW09PTEsIHJlc3AwIHdpbGwgYmUgdGhlIGRpZmZlcmVudCBhbmQKLSoJaXMgdGhlIHZhbHVlIHRvIHdhdGNoIGZvciBpbiB0aGUgVHh8VHhFeGMgdG8gaW5kaWNhdGUgY29tcGxldGlvbgotKglvZiB0aGUgZnJhbWUgcGFzc2VkIGluIGZpZC4KLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9jbWRfdHJhbnNtaXQoaGZhMzg0eF90ICpodywgVUlOVDE2IHJlY2xhaW0sIFVJTlQxNiBxb3MsIFVJTlQxNiBmaWQpCi17Ci0JaW50CXJlc3VsdCA9IDA7Ci0JaGZhMzg0eF9tZXRhY21kX3QgY21kOwotCi0JREJGRU5URVI7Ci0JY21kLmNtZCA9IEhGQTM4NHhfQ01EX0NNRENPREVfU0VUKEhGQTM4NHhfQ01EQ09ERV9UWCkgfAotCQlIRkEzODR4X0NNRF9SRUNMX1NFVChyZWNsYWltKSB8Ci0JCUhGQTM4NHhfQ01EX1FPU19TRVQocW9zKTsKLQljbWQucGFybTAgPSBmaWQ7Ci0JY21kLnBhcm0xID0gMDsKLQljbWQucGFybTIgPSAwOwotCi0JcmVzdWx0ID0gaGZhMzg0eF9kb2NtZF93YWl0KGh3LCAmY21kKTsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9jbWRfY2xlYXJwZXJzaXN0Ci0qCi0qIEluc3RydWN0cyB0aGUgZmlybXdhcmUgdG8gY2xlYXIgdGhlIHBlcnNpc3RlbmNlIGJpdCBpbiBhIGdpdmVuCi0qIEZJRC4gIFRoaXMgaGFzIHRoZSBlZmZlY3Qgb2YgdGVsbGluZyB0aGUgZmlybXdhcmUgdG8gZHJvcCB0aGUKLSogcGVyc2lzdGVudCBmcmFtZS4gIFRoZSBGSUQgbXVzdCBiZSBvbmUgdGhhdCB3YXMgcHJldmlvdXNseSB1c2VkCi0qIHRvIHRyYW5zbWl0IGEgUFJTVCBmcmFtZS4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKglmaWQJCUZJRCBvZiB0aGUgcGVyc2lzdGVudCBmcmFtZSAoaG9zdCBvcmRlcikKLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGZhaWx1cmUgLSBmL3cgc3RhdHVzIGNvZGUKLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvciAodGltZW91dHxiYWQgYXJnKQotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfY21kX2NsZWFycGVyc2lzdChoZmEzODR4X3QgKmh3LCBVSU5UMTYgZmlkKQotewotCWludAlyZXN1bHQgPSAwOwotCWhmYTM4NHhfbWV0YWNtZF90IGNtZDsKLQotCURCRkVOVEVSOwotCi0JY21kLmNtZCA9IEhGQTM4NHhfQ01EX0NNRENPREVfU0VUKEhGQTM4NHhfQ01EQ09ERV9DTFJQUlNUKTsKLQljbWQucGFybTAgPSBmaWQ7Ci0JY21kLnBhcm0xID0gMDsKLQljbWQucGFybTIgPSAwOwotCi0Jc3Bpbl9sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0JcmVzdWx0ID0gaGZhMzg0eF9kb2NtZF93YWl0KGh3LCAmY21kKTsKLQlzcGluX3VubG9ja19iaCgmaHctPmNtZGxvY2spOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9jbWRfbm90aWZ5Ci0qCi0qIFNlbmRzIGFuIGluZm8gZnJhbWUgdG8gdGhlIGZpcm13YXJlIHRvIGFsdGVyIHRoZSBiZWhhdmlvcgotKiBvZiB0aGUgZi93IGFzeW5jaCBwcm9jZXNzZXMuICBDYW4gb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgTUFDCi0qIGlzIGluIHRoZSBlbmFibGVkIHN0YXRlLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCXJlY2xhaW0JCVswfDFdIGluZGljYXRlcyB3aGV0aGVyIHRoZSBnaXZlbiBGSUQgd2lsbAotKgkJCWJlIGhhbmRlZCBiYWNrICh2aWEgQWxsb2MgZXZlbnQpIGZvciByZXVzZS4KLSoJCQkoaG9zdCBvcmRlcikKLSoJZmlkCQlGSUQgb2YgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGZyYW1lIHRoYXQgd2FzCi0qCQkJcHJldmlvdXNseSBjb3BpZWQgdG8gTUFDIG1lbW9yeSB2aWEgdGhlIGJhcC4KLSoJCQkoaG9zdCBvcmRlcikKLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGZhaWx1cmUgLSBmL3cgc3RhdHVzIGNvZGUKLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvciAodGltZW91dHxiYWQgYXJnKQotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCWh3LT5yZXNwMCB3aWxsIGNvbnRhaW4gdGhlIEZJRCBiZWluZyB1c2VkIGJ5IGFzeW5jIG5vdGlmeQotKglwcm9jZXNzLiAgSWYgcmVjbGFpbT09MCwgcmVzcDAgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgZmlkCi0qCWFyZ3VtZW50LiAgSWYgcmVjbGFpbT09MSwgcmVzcDAgd2lsbCBiZSB0aGUgZGlmZmVyZW50LgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2NtZF9ub3RpZnkoaGZhMzg0eF90ICpodywgVUlOVDE2IHJlY2xhaW0sIFVJTlQxNiBmaWQsCi0JCSAgICAgICB2b2lkICpidWYsIFVJTlQxNiBsZW4pCi17Ci0JaW50CXJlc3VsdCA9IDA7Ci0JaGZhMzg0eF9tZXRhY21kX3QgY21kOwotCi0JREJGRU5URVI7Ci0JY21kLmNtZCA9IEhGQTM4NHhfQ01EX0NNRENPREVfU0VUKEhGQTM4NHhfQ01EQ09ERV9OT1RJRlkpIHwKLQkJSEZBMzg0eF9DTURfUkVDTF9TRVQocmVjbGFpbSk7Ci0JY21kLnBhcm0wID0gZmlkOwotCWNtZC5wYXJtMSA9IDA7Ci0JY21kLnBhcm0yID0gMDsKLQotCXNwaW5fbG9ja19iaCgmaHctPmNtZGxvY2spOwotCi0gICAgICAgIC8qIENvcHkgdGhlIHJlY29yZCB0byBGSUQgKi8KLSAgICAgICAgcmVzdWx0ID0gaGZhMzg0eF9jb3B5X3RvX2JhcChodywgSEZBMzg0eF9CQVBfUFJPQywgaHctPmluZm9maWQsIDAsIGJ1ZiwgbGVuKTsKLSAgICAgICAgaWYgKCByZXN1bHQgKSB7Ci0gICAgICAgICAgICAgICAgV0xBTl9MT0dfREVCVUcoMSwKLQkJCSJjb3B5X3RvX2JhcCglMDR4LCAwLCAlZCkgZmFpbGVkLCByZXN1bHQ9MHgleFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGh3LT5pbmZvZmlkLCBsZW4sIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IC1FSU87Ci0gICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgIH0KLQotCXJlc3VsdCA9IGhmYTM4NHhfZG9jbWRfd2FpdChodywgJmNtZCk7Ci0KLSBmYWlsZWQ6Ci0Jc3Bpbl91bmxvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0jaWYgMAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfY21kX2lucXVpcnkKLSoKLSogUmVxdWVzdHMgYW4gaW5mbyBmcmFtZSBmcm9tIHRoZSBmaXJtd2FyZS4gIFRoZSBpbmZvIGZyYW1lIHdpbGwKLSogYmUgZGVsaXZlcmVkIGFzeW5jaHJvbm91c2x5IHZpYSB0aGUgSW5mbyBldmVudC4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKglmaWQJCUZJRCBvZiB0aGUgaW5mbyBmcmFtZSByZXF1ZXN0ZWQuIChob3N0IG9yZGVyKQotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZmFpbHVyZSAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yICh0aW1lb3V0fGJhZCBhcmcpCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50IGhmYTM4NHhfY21kX2lucXVpcnkoaGZhMzg0eF90ICpodywgVUlOVDE2IGZpZCkKLXsKLQlpbnQJcmVzdWx0ID0gMDsKLQloZmEzODR4X21ldGFjbWRfdCBjbWQ7Ci0KLQlEQkZFTlRFUjsKLQotCWNtZC5jbWQgPSBIRkEzODR4X0NNRF9DTURDT0RFX1NFVChIRkEzODR4X0NNRENPREVfSU5RKTsKLQljbWQucGFybTAgPSBmaWQ7Ci0JY21kLnBhcm0xID0gMDsKLQljbWQucGFybTIgPSAwOwotCi0Jc3Bpbl9sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0JcmVzdWx0ID0gaGZhMzg0eF9kb2NtZF93YWl0KGh3LCAmY21kKTsKLQlzcGluX3VubG9ja19iaCgmaHctPmNtZGxvY2spOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotI2VuZGlmCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfY21kX2FjY2VzcwotKgotKiBSZXF1ZXN0cyB0aGF0IGEgZ2l2ZW4gcmVjb3JkIGJlIGNvcGllZCB0by9mcm9tIHRoZSByZWNvcmQKLSogYnVmZmVyLiAgSWYgd2UncmUgd3JpdGluZyBmcm9tIHRoZSByZWNvcmQgYnVmZmVyLCB0aGUgY29udGVudHMKLSogbXVzdCBwcmV2aW91c2x5IGhhdmUgYmVlbiB3cml0dGVuIHRvIHRoZSByZWNvcmQgYnVmZmVyIHZpYSB0aGUKLSogYmFwLiAgSWYgd2UncmUgcmVhZGluZyBpbnRvIHRoZSByZWNvcmQgYnVmZmVyLCB0aGUgcmVjb3JkIGNhbgotKiBiZSByZWFkIG91dCBvZiB0aGUgcmVjb3JkIGJ1ZmZlciBhZnRlciB0aGlzIGNhbGwuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoJd3JpdGUJCVswfDFdIGNvcHkgdGhlIHJlY29yZCBidWZmZXIgdG8gdGhlIGdpdmVuCi0qCQkJY29uZmlndXJhdGlvbiByZWNvcmQuIChob3N0IG9yZGVyKQotKglyaWQJCVJJRCBvZiB0aGUgcmVjb3JkIHRvIHJlYWQvd3JpdGUuIChob3N0IG9yZGVyKQotKglidWYJCWhvc3Qgc2lkZSByZWNvcmQgYnVmZmVyLiAgVXBvbiByZXR1cm4gaXQgd2lsbAotKgkJCWNvbnRhaW4gdGhlIGJvZHkgcG9ydGlvbiBvZiB0aGUgcmVjb3JkIChtaW51cyB0aGUKLSoJCQlSSUQgYW5kIGxlbikuCi0qCWxlbgkJYnVmZmVyIGxlbmd0aCAoaW4gYnl0ZXMsIHNob3VsZCBtYXRjaCByZWNvcmQgbGVuZ3RoKQotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZmFpbHVyZSAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yICh0aW1lb3V0fGJhZCBhcmcpCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9jbWRfYWNjZXNzKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiB3cml0ZSwgVUlOVDE2IHJpZCwKLQkJICAgICAgIHZvaWQqIGJ1ZiwgVUlOVDE2IGxlbikKLXsKLQlpbnQJcmVzdWx0ID0gMDsKLQloZmEzODR4X21ldGFjbWRfdCBjbWQ7Ci0JaGZhMzg0eF9yZWNfdAlyZWM7Ci0KLQlEQkZFTlRFUjsKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw0LDApKQotCS8qIFRoaXMgc2hvdWxkIE5PVCBiZSBjYWxsZWQgaW4gaW50ZXJydXB0IGNvbnRleHQhICovCi0JaWYgKGluX2lycSgpKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCJLcmFwLCBpbiBJbnRlcnJ1cHQgY29udGV4dCEiKTsKLSNpZmRlZiBXTEFOX0lOQ0xVREVfREVCVUcKLQkJQlVHKCk7Ci0jZW5kaWYKLQl9Ci0jZW5kaWYKLQlzcGluX2xvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQotCWlmICh3cml0ZSkgewotCQlyZWMucmlkID0gaG9zdDJoZmEzODR4XzE2KHJpZCk7Ci0JCXJlYy5yZWNsZW4gPSBob3N0MmhmYTM4NHhfMTYoKGxlbi8yKSArIDEpOyAvKiBub3RlIGNvbnZlcnNpb24gdG8gd29yZHMsICsxIGZvciByaWQgZmllbGQgKi8KLQkJLyogd3JpdGUgdGhlIHJlY29yZCAqLwotCQlyZXN1bHQgPSBoZmEzODR4X2NvcHlfdG9fYmFwNCggaHcsIEhGQTM4NHhfQkFQX1BST0MsIHJpZCwgMCwKLQkJCQkJICAgICAgICZyZWMsIHNpemVvZihyZWMpLAotCQkJCQkgICAgICAgYnVmLCBsZW4sCi0JCQkJCSAgICAgICBOVUxMLCAwLCBOVUxMLCAwKTsKLQkJaWYgKCByZXN1bHQgKSB7Ci0JCQlXTEFOX0xPR19ERUJVRygzLCJGYWlsdXJlIHdyaXRpbmcgcmVjb3JkIGhlYWRlcitkYXRhXG4iKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCi0JfQotCi0JY21kLmNtZCA9IEhGQTM4NHhfQ01EX0NNRENPREVfU0VUKEhGQTM4NHhfQ01EQ09ERV9BQ0NFU1MpIHwKLQkJSEZBMzg0eF9DTURfV1JJVEVfU0VUKHdyaXRlKTsKLQljbWQucGFybTAgPSByaWQ7Ci0JY21kLnBhcm0xID0gMDsKLQljbWQucGFybTIgPSAwOwotCi0JcmVzdWx0ID0gaGZhMzg0eF9kb2NtZF93YWl0KGh3LCAmY21kKTsKLQlpZiAoIHJlc3VsdCApIHsKLQkJV0xBTl9MT0dfRVJST1IoIkNhbGwgdG8gaGZhMzg0eF9kb2NtZF93YWl0IGZhaWxlZCAoJWQgJWQpXG4iLAotCQkJCXJlc3VsdCwgY21kLnJlc3VsdC5yZXNwMCk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlpZiAoIXdyaXRlKSB7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfY29weV9mcm9tX2JhcCggaHcsIEhGQTM4NHhfQkFQX1BST0MsIHJpZCwgMCwgJnJlYywgc2l6ZW9mKHJlYykpOwotCQlpZiAoIHJlc3VsdCApIHsKLQkJCVdMQU5fTE9HX0RFQlVHKDMsIkNhbGwgdG8gaGZhMzg0eF9jb3B5X2Zyb21fYmFwIGZhaWxlZFxuIik7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQotCQkvKiBWYWxpZGF0ZSB0aGUgcmVjb3JkIGxlbmd0aCAqLwotCQlpZiAoICgoaGZhMzg0eDJob3N0XzE2KHJlYy5yZWNsZW4pLTEpKjIpICE9IGxlbiApIHsgIC8qIG5vdGUgYm9keSBsZW4gY2FsY3VsYXRpb24gaW4gYnl0ZXMgKi8KLQkJCVdMQU5fTE9HX0RFQlVHKDEsICJSSUQgbGVuIG1pc21hdGNoLCByaWQ9MHglMDR4IGhsZW49JWQgZndsZW49JWRcbiIsCi0JCQkJCXJpZCwgbGVuLCAoaGZhMzg0eDJob3N0XzE2KHJlYy5yZWNsZW4pLTEpKjIpOwotCQkJcmVzdWx0ID0gLUVOT0RBVEE7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQotCQlyZXN1bHQgPSBoZmEzODR4X2NvcHlfZnJvbV9iYXAoIGh3LCBIRkEzODR4X0JBUF9QUk9DLCByaWQsIHNpemVvZihyZWMpLCBidWYsIGxlbik7Ci0KLQl9Ci0KLSBmYWlsOgotCXNwaW5fdW5sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2NtZF9tb25pdG9yCi0qCi0qIEVuYWJsZXMgdGhlICdtb25pdG9yIG1vZGUnIG9mIHRoZSBNQUMuICBIZXJlJ3MgdGhlIGRlc2NyaXB0aW9uIG9mCi0qIG1vbml0b3IgbW9kZSB0aGF0IEkndmUgcmVjZWl2ZWQgdGh1cyBmYXI6Ci0qCi0qICAiVGhlICJtb25pdG9yIG1vZGUiIG9mIG9wZXJhdGlvbiBpcyB0aGF0IHRoZSBNQUMgcGFzc2VzIGFsbAotKiAgZnJhbWVzIGZvciB3aGljaCB0aGUgUExDUCBjaGVja3MgYXJlIGNvcnJlY3QuIEFsbCByZWNlaXZlZAotKiAgTVBEVXMgYXJlIHBhc3NlZCB0byB0aGUgaG9zdCB3aXRoIE1BQyBQb3J0ID0gNywgd2l0aCBhCi0qICByZWNlaXZlIHN0YXR1cyBvZiBnb29kLCBGQ1MgZXJyb3IsIG9yIHVuZGVjcnlwdGFibGUuIFBhc3NpbmcKLSogIGNlcnRhaW4gTVBEVXMgaXMgYSB2aW9sYXRpb24gb2YgdGhlIDgwMi4xMSBzdGFuZGFyZCwgYnV0IHVzZWZ1bAotKiAgZm9yIGEgZGVidWdnaW5nIHRvb2wuIiAgTm9ybWFsIGNvbW11bmljYXRpb24gaXMgbm90IHBvc3NpYmxlCi0qICB3aGlsZSBtb25pdG9yIG1vZGUgaXMgZW5hYmxlZC4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKgllbmFibGUJCWEgY29kZSAoMHgwYnwweDBmKSB0aGF0IGVuYWJsZXMvZGlzYWJsZXMKLSoJCQltb25pdG9yIG1vZGUuIChob3N0IG9yZGVyKQotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZmFpbHVyZSAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yICh0aW1lb3V0fGJhZCBhcmcpCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9jbWRfbW9uaXRvcihoZmEzODR4X3QgKmh3LCBVSU5UMTYgZW5hYmxlKQotewotCWludAlyZXN1bHQgPSAwOwotCWhmYTM4NHhfbWV0YWNtZF90IGNtZDsKLQotCURCRkVOVEVSOwotCi0JY21kLmNtZCA9IEhGQTM4NHhfQ01EX0NNRENPREVfU0VUKEhGQTM4NHhfQ01EQ09ERV9NT05JVE9SKSB8Ci0JCUhGQTM4NHhfQ01EX0FJTkZPX1NFVChlbmFibGUpOwotCWNtZC5wYXJtMCA9IDA7Ci0JY21kLnBhcm0xID0gMDsKLQljbWQucGFybTIgPSAwOwotCi0Jc3Bpbl9sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0JcmVzdWx0ID0gaGZhMzg0eF9kb2NtZF93YWl0KGh3LCAmY21kKTsKLQlzcGluX3VubG9ja19iaCgmaHctPmNtZGxvY2spOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2NtZF9kb3dubG9hZAotKgotKiBTZXRzIHRoZSBjb250cm9scyBmb3IgdGhlIE1BQyBjb250cm9sbGVyIGNvZGUvZGF0YSBkb3dubG9hZAotKiBwcm9jZXNzLiAgVGhlIGFyZ3VtZW50cyBzZXQgdGhlIG1vZGUgYW5kIGFkZHJlc3MgYXNzb2NpYXRlZAotKiB3aXRoIGEgZG93bmxvYWQuICBOb3RlIHRoYXQgdGhlIGF1eCByZWdpc3RlcnMgc2hvdWxkIGJlIGVuYWJsZWQKLSogcHJpb3IgdG8gc2V0dGluZyBvbmUgb2YgdGhlIGRvd25sb2FkIGVuYWJsZSBtb2Rlcy4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKgltb2RlCQkwIC0gRGlzYWJsZSBwcm9ncmFtbWluZyBhbmQgYmVnaW4gY29kZSBleGVjCi0qCQkJMSAtIEVuYWJsZSB2b2xhdGlsZSBtZW0gcHJvZ3JhbW1pbmcKLSoJCQkyIC0gRW5hYmxlIG5vbi12b2xhdGlsZSBtZW0gcHJvZ3JhbW1pbmcKLSoJCQkzIC0gUHJvZ3JhbSBub24tdm9sYXRpbGUgc2VjdGlvbiBmcm9tIE5WIGRvd25sb2FkCi0qCQkJICAgIGJ1ZmZlci4KLSoJCQkoaG9zdCBvcmRlcikKLSoJbG93YWRkcgotKgloaWdoYWRkcglGb3IgbW9kZSAxLCBzZXRzIHRoZSBoaWdoICYgbG93IG9yZGVyIGJpdHMgb2YKLSoJCQl0aGUgImRlc3RpbmF0aW9uIGFkZHJlc3MiLiAgVGhpcyBhZGRyZXNzIHdpbGwgYmUKLSoJCQl0aGUgZXhlY3V0aW9uIHN0YXJ0IGFkZHJlc3Mgd2hlbiBkb3dubG9hZCBpcwotKgkJCXN1YnNlcXVlbnRseSBkaXNhYmxlZC4KLSoJCQlGb3IgbW9kZSAyLCBzZXRzIHRoZSBoaWdoICYgbG93IG9yZGVyIGJpdHMgb2YKLSoJCQl0aGUgZGVzdGluYXRpb24gaW4gTlYgcmFtLgotKgkJCUZvciBtb2RlcyAwICYgMywgc2hvdWxkIGJlIHplcm8uIChob3N0IG9yZGVyKQotKgkJCU5PVEU6IHRoZXNlIGFkZHJlc3MgYXJncyBhcmUgaW4gQ01EIGZvcm1hdAotKgljb2RlbGVuCQlMZW5ndGggb2YgdGhlIGRhdGEgdG8gd3JpdGUgaW4gbW9kZSAyLAotKgkJCXplcm8gb3RoZXJ3aXNlLiAoaG9zdCBvcmRlcikKLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGZhaWx1cmUgLSBmL3cgc3RhdHVzIGNvZGUKLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvciAodGltZW91dHxiYWQgYXJnKQotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfY21kX2Rvd25sb2FkKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBtb2RlLCBVSU5UMTYgbG93YWRkciwKLQkJCQlVSU5UMTYgaGlnaGFkZHIsIFVJTlQxNiBjb2RlbGVuKQotewotCWludAlyZXN1bHQgPSAwOwotCWhmYTM4NHhfbWV0YWNtZF90IGNtZDsKLQotCURCRkVOVEVSOwotCi0JY21kLmNtZCA9IEhGQTM4NHhfQ01EX0NNRENPREVfU0VUKEhGQTM4NHhfQ01EQ09ERV9ET1dOTEQpIHwKLQkJSEZBMzg0eF9DTURfUFJPR01PREVfU0VUKG1vZGUpOwotCWNtZC5wYXJtMCA9IGxvd2FkZHI7Ci0JY21kLnBhcm0xID0gaGlnaGFkZHI7Ci0JY21kLnBhcm0yID0gY29kZWxlbjsKLQotCXNwaW5fbG9ja19iaCgmaHctPmNtZGxvY2spOwotCXJlc3VsdCA9IGhmYTM4NHhfZGxfZG9jbWRfd2FpdChodywgJmNtZCk7Ci0Jc3Bpbl91bmxvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9jbWRfYXV4X2VuYWJsZQotKgotKiBHb2VzIHRocm91Z2ggdGhlIHByb2Nlc3Mgb2YgZW5hYmxpbmcgdGhlIGF1eGlsYXJ5IHBvcnQuICBUaGlzCi0qIGlzIG5lY2Vzc2FyeSBwcmlvciB0byByYXcgcmVhZHMvd3JpdGVzIHRvIGNhcmQgZGF0YSBzcGFjZS4KLSogRGlyZWN0IGFjY2VzcyB0byB0aGUgY2FyZCBkYXRhIHNwYWNlIGlzIG9ubHkgdXNlZCBmb3IgZG93bmxvYWRpbmcKLSogY29kZSBhbmQgZGVidWdnaW5nLgotKiBOb3RlIHRoYXQgYSBjYWxsIHRvIHRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgYmVmb3JlIGF0dGVtcHRpbmcKLSogYSBkb3dubG9hZC4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZmFpbHVyZSAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yICh0aW1lb3V0KQotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfY21kX2F1eF9lbmFibGUoaGZhMzg0eF90ICpodywgaW50IGZvcmNlKQotewotCWludAkJcmVzdWx0ID0gLUVUSU1FRE9VVDsKLQl1bnNpZ25lZCBsb25nCWZsYWdzOwotCVVJTlQzMgkJcmV0cmllc19yZW1haW5pbmc7Ci0JVUlOVDE2CQlyZWc7Ci0JVUlOVAkJYXV4ZW5fbWlycm9yID0gaHctPmF1eGVuOwotCi0JREJGRU5URVI7Ci0KLQkvKiBDaGVjayBmb3IgZXhpc3RpbmcgZW5hYmxlICovCi0JaWYgKCBody0+YXV4ZW4gKSB7Ci0JCWh3LT5hdXhlbisrOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBhY3F1aXJlIHRoZSBsb2NrICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoICYoaHctPmNtZGxvY2spLCBmbGFncyk7Ci0JLyogd2FpdCBmb3IgY21kIHJlZ2lzdGVyIGJ1c3kgYml0IHRvIGNsZWFyICovCi0JcmV0cmllc19yZW1haW5pbmcgPSAxMDAwMDA7Ci0JZG8gewotCQlyZWcgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9DTUQpOwotCQl1ZGVsYXkoMTApOwotCX0KLQl3aGlsZSAoSEZBMzg0eF9DTURfSVNCVVNZKHJlZykgJiYgLS1yZXRyaWVzX3JlbWFpbmluZyk7Ci0JaWYgKHJldHJpZXNfcmVtYWluaW5nICE9IDApIHsKLQkJLyogYnVzeSBiaXQgY2xlYXIsIGl0J3MgT0sgdG8gd3JpdGUgdG8gUGFyYW1YIHJlZ3MgKi8KLQkJaGZhMzg0eF9zZXRyZWcoaHcsIEhGQTM4NHhfQVVYUFcwLAotCQkJSEZBMzg0eF9QQVJBTTApOwotCQloZmEzODR4X3NldHJlZyhodywgSEZBMzg0eF9BVVhQVzEsCi0JCQlIRkEzODR4X1BBUkFNMSk7Ci0JCWhmYTM4NHhfc2V0cmVnKGh3LCBIRkEzODR4X0FVWFBXMiwKLQkJCUhGQTM4NHhfUEFSQU0yKTsKLQotCQkvKiBTZXQgdGhlIGF1eCBlbmFibGUgaW4gdGhlIENvbnRyb2wgcmVnaXN0ZXIgKi8KLQkJaGZhMzg0eF9zZXRyZWcoaHcsIEhGQTM4NHhfQ09OVFJPTF9BVVhfRE9FTkFCTEUsCi0JCQlIRkEzODR4X0NPTlRST0wpOwotCi0JCS8qIE5vdyB3YWl0IGZvciBjb21wbGV0aW9uICovCi0JCXJldHJpZXNfcmVtYWluaW5nID0gMTAwMDAwOwotCQlkbyB7Ci0JCQlyZWcgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9DT05UUk9MKTsKLQkJCXVkZWxheSgxMCk7Ci0JCX0KLQkJd2hpbGUgKCAoKHJlZyAmIChCSVQxNHxCSVQxNSkpICE9IEhGQTM4NHhfQ09OVFJPTF9BVVhfSVNFTkFCTEVEKSAmJgotCQkJLS1yZXRyaWVzX3JlbWFpbmluZyApOwotCQlpZiAocmV0cmllc19yZW1haW5pbmcgIT0gMCkgewotCQkJcmVzdWx0ID0gMDsKLQkJCWh3LT5hdXhlbisrOwotCQl9Ci0JfQotCi0JLyogRm9yY2UgaXQgZW5hYmxlZCBldmVuIGlmIHRoZSBjb21tYW5kIGZhaWxlZCwgaWYgdG9sZC4uICovCi0JaWYgKChody0+YXV4ZW4gPT0gYXV4ZW5fbWlycm9yKSAmJiBmb3JjZSkKLQkJaHctPmF1eGVuKys7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCAmKGh3LT5jbWRsb2NrKSwgZmxhZ3MpOwotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9jbWRfYXV4X2Rpc2FibGUKLSoKLSogR29lcyB0aHJvdWdoIHRoZSBwcm9jZXNzIG9mIGRpc2FibGluZyB0aGUgYXV4aWxhcnkgcG9ydAotKiBlbmFibGVkIHdpdGggYXV4X2VuYWJsZSgpLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBmYWlsdXJlIC0gZi93IHN0YXR1cyBjb2RlCi0qCTwwCQlkcml2ZXIgcmVwb3J0ZWQgZXJyb3IgKHRpbWVvdXQpCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9jbWRfYXV4X2Rpc2FibGUoaGZhMzg0eF90ICpodykKLXsKLQlpbnQJCXJlc3VsdCA9IC1FVElNRURPVVQ7Ci0JdW5zaWduZWQgbG9uZyAgIHRpbWVvdXQ7Ci0JVUlOVDE2CQlyZWcgPSAwOwotCi0JREJGRU5URVI7Ci0KLQkvKiBTZWUgaWYgdGhlcmUncyBtb3JlIHRoYW4gb25lIGVuYWJsZSAqLwotCWlmIChody0+YXV4ZW4pIGh3LT5hdXhlbi0tOwotCWlmIChody0+YXV4ZW4pIHJldHVybiAwOwotCi0JLyogQ2xlYXIgdGhlIGF1eCBlbmFibGUgaW4gdGhlIENvbnRyb2wgcmVnaXN0ZXIgKi8KLQloZmEzODR4X3NldHJlZyhodywgMCwgSEZBMzg0eF9QQVJBTTApOwotCWhmYTM4NHhfc2V0cmVnKGh3LCAwLCBIRkEzODR4X1BBUkFNMSk7Ci0JaGZhMzg0eF9zZXRyZWcoaHcsIDAsIEhGQTM4NHhfUEFSQU0yKTsKLQloZmEzODR4X3NldHJlZyhodywgSEZBMzg0eF9DT05UUk9MX0FVWF9ET0RJU0FCTEUsCi0JCUhGQTM4NHhfQ09OVFJPTCk7Ci0KLQkvKiBOb3cgd2FpdCBmb3IgY29tcGxldGlvbiAqLwotCXRpbWVvdXQgPSBqaWZmaWVzICsgMSpIWjsKLQlyZWcgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9DT05UUk9MKTsKLQl3aGlsZSAoICgocmVnICYgKEJJVDE0fEJJVDE1KSkgIT0gSEZBMzg0eF9DT05UUk9MX0FVWF9JU0RJU0FCTEVEKSAmJgotCQl0aW1lX2JlZm9yZShqaWZmaWVzLHRpbWVvdXQpICl7Ci0JCXVkZWxheSgxMCk7Ci0JCXJlZyA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X0NPTlRST0wpOwotCX0KLQlpZiAoKHJlZyAmIChCSVQxNHxCSVQxNSkpID09IEhGQTM4NHhfQ09OVFJPTF9BVVhfSVNESVNBQkxFRCApIHsKLQkJcmVzdWx0ID0gMDsKLQl9Ci0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9kcnZyX2xvd19sZXZlbAotKgotKiBXcml0ZSB0ZXN0IGNvbW1hbmRzIHRvIHRoZSBjYXJkLiAgU29tZSB0ZXN0IGNvbW1hbmRzIGRvbid0IG1ha2UKLSogc2Vuc2Ugd2l0aG91dCBwcmlvciBzZXQtdXAuICBGb3IgZXhhbXBsZSwgY29udGlub3VzIFRYIGlzbid0IHZlcnkKLSogdXNlZnVsIHVudGlsIHlvdSBzZXQgdGhlIGNoYW5uZWwuICBUaGF0IGZ1bmN0aW9uYWxpdHkgc2hvdWxkIGJlCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKiAgICAgIHByb2Nlc3MgdGhyZWFkCi0qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfbG93X2xldmVsKGhmYTM4NHhfdCAqaHcsIGhmYTM4NHhfbWV0YWNtZF90ICpjbWQpCi17Ci0JaW50ICAgICAgICAgICAgIHJlc3VsdCA9IDA7Ci0JREJGRU5URVI7Ci0KLQkvKiBEbyBpIG5lZWQgYSBob3N0MmhmYS4uLiBjb252ZXJzaW9uID8gKi8KLSNpZiAwCi0JcHJpbnRrKEtFUk5fSU5GTyAiJSN4ICUjeCAlI3ggJSN4XG4iLCBjbWQtPmNtZCwgY21kLT5wYXJtMCwgY21kLT5wYXJtMSwgY21kLT5wYXJtMik7Ci0jZW5kaWYKLQlzcGluX2xvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQlyZXN1bHQgPSBoZmEzODR4X2RvY21kX3dhaXQoaHcsIGNtZCk7Ci0Jc3Bpbl91bmxvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKiBUT0RPOiBkZXRlcm1pbmUgaWYgdGhlc2Ugd2lsbCBldmVyIGJlIG5lZWRlZCAqLwotI2lmIDAKLWludCBoZmEzODR4X2NtZF9yZWFkbWlmKGhmYTM4NHhfdCAqaHcpCi17Ci0JREJGRU5URVI7Ci0JREJGRVhJVDsKLQlyZXR1cm4gMDsKLX0KLQotCi1pbnQgaGZhMzg0eF9jbWRfd3JpdGVtaWYoaGZhMzg0eF90ICpodykKLXsKLQlEQkZFTlRFUjsKLQlEQkZFWElUOwotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2RydnJfbW1pX3JlYWQKLSoKLSogUmVhZCBtbWkgcmVnaXN0ZXJzLiAgbW1pIGlzIGludGVyc2lsLXNwZWFrIGZvciB0aGUgYmFzZWJhbmQKLSogcHJvY2Vzc29yIHJlZ2lzdGVycy4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBodyAgICAgICAgICAgICAgZGV2aWNlIHN0cnVjdHVyZQotKiAgICAgICByZWdpc3RlciAgICAgICAgVGhlIHRlc3QgcmVnaXN0ZXIgdG8gYmUgYWNjZXNzZWQgKG11c3QgYmUgZXZlbiAjKS4KLSoKLSogUmV0dXJuczoKLSogICAgICAgMCAgICAgICAgICAgICAgIHN1Y2Nlc3MKLSogICAgICAgPjAgICAgICAgICAgICAgIGYvdyByZXBvcnRlZCBlcnJvciAtIGYvdyBzdGF0dXMgY29kZQotKiAgICAgICA8MCAgICAgICAgICAgICAgZHJpdmVyIHJlcG9ydGVkIGVycm9yCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKiAgICAgICBwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX21taV9yZWFkKGhmYTM4NHhfdCAqaHcsIFVJTlQzMiBhZGRyLCBVSU5UMzIgKnJlc3ApCi17Ci0gICAgICAgIGludCAgICAgICAgICAgICByZXN1bHQgPSAwOwotCWhmYTM4NHhfbWV0YWNtZF90IGNtZDsKLQotICAgICAgICBEQkZFTlRFUjsKLQljbWQuY21kID0gKFVJTlQxNikgMHgzMDsKLQljbWQucGFybTAgPSAoVUlOVDE2KSBhZGRyOwotCWNtZC5wYXJtMSA9IDA7Ci0JY21kLnBhcm0yID0gMDsKLQotICAgICAgICAvKiBEbyBpIG5lZWQgYSBob3N0MmhmYS4uLiBjb252ZXJzaW9uID8gKi8KLQlzcGluX2xvY2tfYmgoJmh3LT5jbWRsb2NrKTsKLQlyZXN1bHQgPSBoZmEzODR4X2RvY21kX3dhaXQoaHcsICZjbWQpOwotCXNwaW5fdW5sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0KLQkqcmVzcCA9IChVSU5UMzIpIGNtZC5yZXN1bHQucmVzcDA7Ci0KLSAgICAgICAgREJGRVhJVDsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfZHJ2cl9tbWlfd3JpdGUKLSoKLSogUmVhZCBtbWkgcmVnaXN0ZXJzLiAgbW1pIGlzIGludGVyc2lsLXNwZWFrIGZvciB0aGUgYmFzZWJhbmQKLSogcHJvY2Vzc29yIHJlZ2lzdGVycy4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBodyAgICAgICAgICAgICAgZGV2aWNlIHN0cnVjdHVyZQotKiAgICAgICBhZGRyICAgICAgICAgICAgVGhlIHRlc3QgcmVnaXN0ZXIgdG8gYmUgYWNjZXNzZWQgKG11c3QgYmUgZXZlbiAjKS4KLSogICAgICAgZGF0YSAgICAgICAgICAgIFRoZSBkYXRhIHZhbHVlIHRvIHdyaXRlIHRvIHRoZSByZWdpc3Rlci4KLSoKLSogUmV0dXJuczoKLSogICAgICAgMCAgICAgICAgICAgICAgIHN1Y2Nlc3MKLSogICAgICAgPjAgICAgICAgICAgICAgIGYvdyByZXBvcnRlZCBlcnJvciAtIGYvdyBzdGF0dXMgY29kZQotKiAgICAgICA8MCAgICAgICAgICAgICAgZHJpdmVyIHJlcG9ydGVkIGVycm9yCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKiAgICAgICBwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWludAotaGZhMzg0eF9kcnZyX21taV93cml0ZShoZmEzODR4X3QgKmh3LCBVSU5UMzIgYWRkciwgVUlOVDMyIGRhdGEpCi17Ci0gICAgICAgIGludCAgICAgICAgICAgICByZXN1bHQgPSAwOwotCWhmYTM4NHhfbWV0YWNtZF90IGNtZDsKLQotICAgICAgICBEQkZFTlRFUjsKLQljbWQuY21kID0gKFVJTlQxNikgMHgzMTsKLQljbWQucGFybTAgPSAoVUlOVDE2KSBhZGRyOwotCWNtZC5wYXJtMSA9IChVSU5UMTYpIGRhdGE7Ci0JY21kLnBhcm0yID0gMDsKLQotICAgICAgICBXTEFOX0xPR19ERUJVRygxLCJtbWkgd3JpdGUgOiBhZGRyID0gMHglMDh4XG4iLCBhZGRyKTsKLSAgICAgICAgV0xBTl9MT0dfREVCVUcoMSwibW1pIHdyaXRlIDogZGF0YSA9IDB4JTA4eFxuIiwgZGF0YSk7Ci0KLSAgICAgICAgLyogRG8gaSBuZWVkIGEgaG9zdDJoZmEuLi4gY29udmVyc2lvbiA/ICovCi0Jc3Bpbl9sb2NrX2JoKCZody0+Y21kbG9jayk7Ci0JcmVzdWx0ID0gaGZhMzg0eF9kb2NtZF93YWl0KGh3LCAmY21kKTsKLQlzcGluX3VubG9ja19iaCgmaHctPmNtZGxvY2spOwotCi0gICAgICAgIERCRkVYSVQ7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyogVE9ETzogZGV0ZXJtaW5lIGlmIHRoZXNlIHdpbGwgZXZlciBiZSBuZWVkZWQgKi8KLSNpZiAwCi1pbnQgaGZhMzg0eF9jbWRfcmVhZG1pZihoZmEzODR4X3QgKmh3KQotewotICAgICAgICBEQkZFTlRFUjsKLSAgICAgICAgREJGRVhJVDsKLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0KLQotaW50IGhmYTM4NHhfY21kX3dyaXRlbWlmKGhmYTM4NHhfdCAqaHcpCi17Ci0gICAgICAgIERCRkVOVEVSOwotICAgICAgICBEQkZFWElUOwotICAgICAgICByZXR1cm4gMDsKLX0KLSNlbmRpZgotCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfY29weV9mcm9tX2JhcAotKgotKiBDb3BpZXMgYSBjb2xsZWN0aW9uIG9mIGJ5dGVzIGZyb20gdGhlIE1BQyBjb250cm9sbGVyIG1lbW9yeSB2aWEKLSogb25lIHNldCBvZiBCQVAgcmVnaXN0ZXJzLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCWJhcAkJWzB8MV0gd2hpY2ggQkFQIHRvIHVzZQotKglpZAkJRklEIG9yIFJJRCwgZGVzdGluZWQgZm9yIHRoZSBzZWxlY3QgcmVnaXN0ZXIgKGhvc3Qgb3JkZXIpCi0qCW9mZnNldAkJQW4gX2V2ZW5fIG9mZnNldCBpbnRvIHRoZSBidWZmZXIgZm9yIHRoZSBnaXZlbgotKgkJCUZJRC9SSUQuICBXZSBoYXZlbid0IHRoZSBtZWFucyB0byB2YWxpZGF0ZSB0aGlzLAotKgkJCXNvIGJlIGNhcmVmdWwuIChob3N0IG9yZGVyKQotKglidWYJCXB0ciB0byBhcnJheSBvZiBieXRlcwotKglsZW4JCWxlbmd0aCBvZiBkYXRhIHRvIHRyYW5zZmVyIGluIGJ5dGVzCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBmYWlsdXJlIC0gdmFsdWUgb2Ygb2Zmc2V0IHJlZy4KLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvciAodGltZW91dHxiYWQgYXJnKQotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLSoJaW50ZXJydXB0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2NvcHlfZnJvbV9iYXAoaGZhMzg0eF90ICpodywgVUlOVDE2IGJhcCwgVUlOVDE2IGlkLCBVSU5UMTYgb2Zmc2V0LAotCQkJCXZvaWQgKmJ1ZiwgVUlOVCBsZW4pCi17Ci0JaW50CQlyZXN1bHQgPSAwOwotCXVuc2lnbmVkIGxvbmcJZmxhZ3MgPSAwOwotCVVJTlQ4CQkqZCA9IChVSU5UOCopYnVmOwotCVVJTlQJCXNlbGVjdHJlZzsKLQlVSU5UCQlvZmZzZXRyZWc7Ci0JVUlOVAkJZGF0YXJlZzsKLQlVSU5UCQlpOwotCVVJTlQxNgkJcmVnID0gMDsKLQotCURCRkVOVEVSOwotCi0JLyogVmFsaWRhdGUgYmFwLCBvZmZzZXQsIGJ1ZiwgYW5kIGxlbiAqLwotCWlmICggKGJhcCA+IDEpIHx8Ci0JICAgICAob2Zmc2V0ID4gSEZBMzg0eF9CQVBfT0ZGU0VUX01BWCkgfHwKLQkgICAgIChvZmZzZXQgJSAyKSB8fAotCSAgICAgKGJ1ZiA9PSBOVUxMKSB8fAotCSAgICAgKGxlbiA+IEhGQTM4NHhfQkFQX0RBVEFMRU5fTUFYKSApewotCSAgICAgCXJlc3VsdCA9IC1FSU5WQUw7Ci0JfSBlbHNlIHsKLQkJc2VsZWN0cmVnID0gKGJhcCA9PSAxKSA/ICBIRkEzODR4X1NFTEVDVDEgOiBIRkEzODR4X1NFTEVDVDAgOwotCQlvZmZzZXRyZWcgPSAoYmFwID09IDEpID8gIEhGQTM4NHhfT0ZGU0VUMSA6IEhGQTM4NHhfT0ZGU0VUMCA7Ci0JCWRhdGFyZWcgPSAgIChiYXAgPT0gMSkgPyAgSEZBMzg0eF9EQVRBMSA6IEhGQTM4NHhfREFUQTAgOwotCi0JCS8qIE9idGFpbiBsb2NrICovCi0JCXNwaW5fbG9ja19pcnFzYXZlKCAmKGh3LT5iYXBsb2NrKSwgZmxhZ3MpOwotCi0JCS8qIFdyaXRlIGlkIHRvIHNlbGVjdCByZWcgKi8KLQkJaGZhMzg0eF9zZXRyZWcoaHcsIGlkLCBzZWxlY3RyZWcpOwotCQkvKiBXcml0ZSBvZmZzZXQgdG8gb2Zmc2V0IHJlZyAqLwotCQloZmEzODR4X3NldHJlZyhodywgb2Zmc2V0LCBvZmZzZXRyZWcpOwotCQkvKiBXYWl0IGZvciBvZmZzZXRbYnVzeV0gdG8gY2xlYXIgKHNlZSBCQVBfVElNRU9VVCkgKi8KLQkJaSA9IDA7Ci0JCWRvIHsKLQkJCXJlZyA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBvZmZzZXRyZWcpOwotCQkJaWYgKCBpID4gMCApIHVkZWxheSgxMCk7Ci0JCQlpKys7Ci0JCX0gd2hpbGUgKCBpIDwgcHJpc20yX2JhcF90aW1lb3V0ICYmIEhGQTM4NHhfT0ZGU0VUX0lTQlVTWShyZWcpKTsKLSNpZiAoV0xBTl9IT1NUSUYgIT0gV0xBTl9QQ0kpCi0JCS8qIFJlbGVhc2UgbG9jayAqLwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCAmKGh3LT5iYXBsb2NrKSwgZmxhZ3MpOwotI2VuZGlmCi0KLQkJaWYgKCBIRkEzODR4X09GRlNFVF9JU0JVU1kocmVnKSApewotCQkJLyogSWYgdGltZW91dCwgcmV0dXJuIC1FVElNRURPVVQgKi8KLQkJCXJlc3VsdCA9IHJlZzsKLQkJfSBlbHNlIGlmICggSEZBMzg0eF9PRkZTRVRfSVNFUlIocmVnKSApewotCQkJLyogSWYgb2Zmc2V0W2Vycl0gPT0gMSwgcmV0dXJuIC1FSU5WQUwgKi8KLQkJCXJlc3VsdCA9IHJlZzsKLQkJfSBlbHNlIHsKLQkJCS8qIFJlYWQgZXZlbihsZW4pIGJ1ZiBjb250ZW50cyBmcm9tIGRhdGEgcmVnICovCi0JCQlmb3IgKCBpID0gMDsgaSA8IChsZW4gJiAweGZmZmUpOyBpKz0yICkgewotCQkJCSooVUlOVDE2KikoJihkW2ldKSkgPQotCQkJCQloZmEzODR4X2dldHJlZ19ub3N3YXAoaHcsIGRhdGFyZWcpOwotCQkJfQotCQkJLyogSWYgbGVuIG9kZCwgaGFuZGxlIGxhc3QgYnl0ZSAqLwotCQkJaWYgKCBsZW4gJSAyICl7Ci0JCQkJcmVnID0gaGZhMzg0eF9nZXRyZWdfbm9zd2FwKGh3LCBkYXRhcmVnKTsKLQkJCQlkW2xlbi0xXSA9ICgoVUlOVDgqKSgmcmVnKSlbMF07Ci0JCQl9Ci0JCX0KLQotCQkvKiBBY2NvcmRpbmcgdG8gSW50ZXJzaWwgZXJyYXRhIGRhdGVkIDkvMTYvMDI6Ci0KLQkJIkluIFBSSVNNIFBDSSBNQUMgaG9zdCBpbnRlcmZhY2UsIGlmIGJvdGggQkFQcyBhcmUgY29uY3VycmVudGx5Ci0JCSByZXF1ZXNpbmcgbWVtb3J5IGFjY2VzcywgYm90aCB3aWxsIGFjY2VwdCB0aGUgQWNrLiAgIFRoZXJlIGlzIG5vCi0JCSBmaXJtd2FyZSB3b3JrYXJvdW5kIHBvc3NpYmxlLiAgVG8gcHJldmVudCBCQVAgYWNjZXNzIGZhaWx1cmVzIG9yCi0JCSBoYW5nIGNvbmRpdGlvbnMgdGhlIGhvc3QgTVVTVCBOT1QgYWNjZXNzIGJvdGggQkFQcyBpbiBzdWNlc3Npb24KLQkJIHVubGVzcyBhdCBsZWFzdCA1dXMgZWxhcHNlcyBiZXR3ZWVuIGFjY2Vzc2VzLiAgVGhlIHNhZmVzdCBjaG9pY2UKLQkJIGlzIHRvIFVTRSBPTkxZIE9ORSBCQVAgZm9yIGFsbCBkYXRhIG1vdmVtZW50IG9wZXJhdGlvbnMuIgotCi0JCSBXaGF0IHRoaXMgbWVhbnM6Ci0KLQkJIFdlIGhhdmUgdG8gc2VyaWFsaXplIEFMTCBCQVAgYWNjZXNzZXMsIGFuZCBmdXJ0aGVybW9yZSwgYWRkIGEgNXVzCi0JCSBkZWxheSBhZnRlciBhY2Nlc3MgaWYgd2UncmUgdXNpbmcgYSBQQ0kgcGxhdGZvcm0uCi0KLQkJIFVuZm9ydHVuYXRlbHksIHRoaXMgbWVhbnMgd2UgaGF2ZSB0byBsb2NrIG91dCBpbnRlcnJ1cHRzIHRocm91Z291dAotCQkgdGhlIGVudGlyZSBCQVAgY29weS4KLQotCQkgSXQgcmVtYWlucyB0byBiZSBzZWVuIGlmICJCQVAgYWNjZXNzIiBtZWFucyAiQkFQIHNldHVwIiBvciB0aGUgbW9yZQotCQkgbGl0ZXJhbCBkZWZpbml0aW9uIG9mICJjb3B5aW5nIGRhdGEgYmFjayBhbmQgZm9ydGgiICBJJ20gZXJyaW5nIGZvcgotCQkgdGhlIGxhdHRlciwgc2FmZXIgZGVmaW5pdGlvbi4gIC0tIFNMUC4KLQotCQkqLwotCi0jaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUENJKQotCQl1ZGVsYXkoNSk7Ci0JCS8qIFJlbGVhc2UgbG9jayAqLwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCAmKGh3LT5iYXBsb2NrKSwgZmxhZ3MpOwotI2VuZGlmCi0KLQl9Ci0KLQlpZiAocmVzdWx0KSB7Ci0JICBXTEFOX0xPR19ERUJVRygxLAotCQkJICAiY29weV9mcm9tX2JhcCgweCUwNHgsIDAsICVkKSBmYWlsZWQsIHJlc3VsdD0weCV4XG4iLAotCQkJICByZWcsIGxlbiwgcmVzdWx0KTsKLQl9Ci0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2NvcHlfdG9fYmFwCi0qCi0qIENvcGllcyBhIGNvbGxlY3Rpb24gb2YgYnl0ZXMgdG8gdGhlIE1BQyBjb250cm9sbGVyIG1lbW9yeSB2aWEKLSogb25lIHNldCBvZiBCQVAgcmVnaXN0ZXJzLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCWJhcAkJWzB8MV0gd2hpY2ggQkFQIHRvIHVzZQotKglpZAkJRklEIG9yIFJJRCwgZGVzdGluZWQgZm9yIHRoZSBzZWxlY3QgcmVnaXN0ZXIgKGhvc3Qgb3JkZXIpCi0qCW9mZnNldAkJQW4gX2V2ZW5fIG9mZnNldCBpbnRvIHRoZSBidWZmZXIgZm9yIHRoZSBnaXZlbgotKgkJCUZJRC9SSUQuICBXZSBoYXZlbid0IHRoZSBtZWFucyB0byB2YWxpZGF0ZSB0aGlzLAotKgkJCXNvIGJlIGNhcmVmdWwuIChob3N0IG9yZGVyKQotKglidWYJCXB0ciB0byBhcnJheSBvZiBieXRlcwotKglsZW4JCWxlbmd0aCBvZiBkYXRhIHRvIHRyYW5zZmVyIChpbiBieXRlcykKLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgk+MAkJZi93IHJlcG9ydGVkIGZhaWx1cmUgLSB2YWx1ZSBvZiBvZmZzZXQgcmVnLgotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yICh0aW1lb3V0fGJhZCBhcmcpCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotKglpbnRlcnJ1cHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfY29weV90b19iYXAoaGZhMzg0eF90ICpodywgVUlOVDE2IGJhcCwgVUlOVDE2IGlkLCBVSU5UMTYgb2Zmc2V0LAotCQkJCXZvaWQgKmJ1ZiwgVUlOVCBsZW4pCi17Ci0JcmV0dXJuIGhmYTM4NHhfY29weV90b19iYXA0KGh3LCBiYXAsIGlkLCBvZmZzZXQsIGJ1ZiwgbGVuLCBOVUxMLCAwLCBOVUxMLCAwLCBOVUxMLCAwKTsKLX0KLQotaW50IGhmYTM4NHhfY29weV90b19iYXA0KGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBiYXAsIFVJTlQxNiBpZCwgVUlOVDE2IG9mZnNldCwKLQkJCSB2b2lkICpidWYsIFVJTlQgbGVuMSwgdm9pZCogYnVmMiwgVUlOVCBsZW4yLAotCQkJIHZvaWQgKmJ1ZjMsIFVJTlQgbGVuMywgdm9pZCAqYnVmNCwgVUlOVCBsZW40KQotewotCWludAkJcmVzdWx0ID0gMDsKLQl1bnNpZ25lZCBsb25nCWZsYWdzID0gMDsKLQlVSU5UOAkJKmQ7Ci0JVUlOVAkJc2VsZWN0cmVnOwotCVVJTlQJCW9mZnNldHJlZzsKLQlVSU5UCQlkYXRhcmVnOwotCVVJTlQJCWk7Ci0JVUlOVDE2CQlyZWc7Ci0KLQlEQkZFTlRFUjsKLQotLy8JcHJpbnRrKEtFUk5fREVCVUcgImN0YjEgJWQgaWQgJTA0eCBvICVkICVkICVkICVkICVkXG4iLCBiYXAsIGlkLCBvZmZzZXQsIGxlbjEsIGxlbjIsIGxlbjMsIGxlbjQpOwotCi0JLyogVmFsaWRhdGUgYmFwLCBvZmZzZXQsIGJ1ZiwgYW5kIGxlbiAqLwotCWlmICggKGJhcCA+IDEpIHx8Ci0JICAgICAob2Zmc2V0ID4gSEZBMzg0eF9CQVBfT0ZGU0VUX01BWCkgfHwKLQkgICAgIChvZmZzZXQgJSAyKSB8fAotCSAgICAgKGJ1ZiA9PSBOVUxMKSB8fAotCSAgICAgKGxlbjErbGVuMitsZW4zK2xlbjQgPiBIRkEzODR4X0JBUF9EQVRBTEVOX01BWCkgKXsKLQkgICAgIAlyZXN1bHQgPSAtRUlOVkFMOwotCX0gZWxzZSB7Ci0JCXNlbGVjdHJlZyA9IChiYXAgPT0gMSkgPyBIRkEzODR4X1NFTEVDVDEgOiBIRkEzODR4X1NFTEVDVDA7Ci0JCW9mZnNldHJlZyA9IChiYXAgPT0gMSkgPyBIRkEzODR4X09GRlNFVDEgOiBIRkEzODR4X09GRlNFVDA7Ci0JCWRhdGFyZWcgPSAgIChiYXAgPT0gMSkgPyBIRkEzODR4X0RBVEExICAgOiBIRkEzODR4X0RBVEEwOwotCQkvKiBPYnRhaW4gbG9jayAqLwotCQlzcGluX2xvY2tfaXJxc2F2ZSggJihody0+YmFwbG9jayksIGZsYWdzKTsKLQotCQkvKiBXcml0ZSBpZCB0byBzZWxlY3QgcmVnICovCi0JCWhmYTM4NHhfc2V0cmVnKGh3LCBpZCwgc2VsZWN0cmVnKTsKLQkJdWRlbGF5KDEwKTsKLQkJLyogV3JpdGUgb2Zmc2V0IHRvIG9mZnNldCByZWcgKi8KLQkJaGZhMzg0eF9zZXRyZWcoaHcsIG9mZnNldCwgb2Zmc2V0cmVnKTsKLQkJLyogV2FpdCBmb3Igb2Zmc2V0W2J1c3ldIHRvIGNsZWFyIChzZWUgQkFQX1RJTUVPVVQpICovCi0JCWkgPSAwOwotCQlkbyB7Ci0JCQlyZWcgPSBoZmEzODR4X2dldHJlZyhodywgb2Zmc2V0cmVnKTsKLQkJCWlmICggaSA+IDAgKSB1ZGVsYXkoMTApOwotCQkJaSsrOwotCQl9IHdoaWxlICggaSA8IHByaXNtMl9iYXBfdGltZW91dCAmJiBIRkEzODR4X09GRlNFVF9JU0JVU1kocmVnKSk7Ci0KLSNpZiAoV0xBTl9IT1NUSUYgIT0gV0xBTl9QQ0kpCi0JCS8qIFJlbGVhc2UgbG9jayAqLwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCAmKGh3LT5iYXBsb2NrKSwgZmxhZ3MpOwotI2VuZGlmCi0KLQkJaWYgKCBIRkEzODR4X09GRlNFVF9JU0JVU1kocmVnKSApewotCQkJLyogSWYgdGltZW91dCwgcmV0dXJuIHJlZyAqLwotCQkJcmVzdWx0ID0gcmVnOwotCQl9IGVsc2UgaWYgKCBIRkEzODR4X09GRlNFVF9JU0VSUihyZWcpICl7Ci0JCQkvKiBJZiBvZmZzZXRbZXJyXSA9PSAxLCByZXR1cm4gcmVnICovCi0JCQlyZXN1bHQgPSByZWc7Ci0JCX0gZWxzZSB7Ci0JCQlkID0gKFVJTlQ4KilidWY7Ci0JCQkvKiBXcml0ZSBldmVuKGxlbjEpIGJ1ZiBjb250ZW50cyB0byBkYXRhIHJlZyAqLwotCQkJZm9yICggaSA9IDA7IGkgPCAobGVuMSAmIDB4ZmZmZSk7IGkrPTIgKSB7Ci0JCQkJaGZhMzg0eF9zZXRyZWdfbm9zd2FwKGh3LAotCQkJCQkqKFVJTlQxNiopKCYoZFtpXSkpLCBkYXRhcmVnKTsKLQkJCX0KLQkJCWlmIChsZW4xICYgMSkgewotCQkJCVVJTlQxNiBkYXRhOwotCQkJCVVJTlQ4ICpiID0gKFVJTlQ4ICopICZkYXRhOwotCQkJCWJbMF0gPSBkW2xlbjEtMV07Ci0JCQkJaWYgKGJ1ZjIgIT0gTlVMTCkgewotCQkJCQlkID0gKFVJTlQ4KilidWYyOwotCQkJCQliWzFdID0gZFswXTsKLQkJCQkJbGVuMi0tOwotCQkJCQlidWYyKys7Ci0JCQkJfQotCQkJCWhmYTM4NHhfc2V0cmVnX25vc3dhcChodywgZGF0YSwgZGF0YXJlZyk7Ci0JCQl9Ci0JCQlpZiAoKGJ1ZjIgIT0gTlVMTCkgJiYgKGxlbjIgPiAwKSkgewotCQkJCS8qIFdyaXRlIGV2ZW4obGVuMikgYnVmIGNvbnRlbnRzIHRvIGRhdGEgcmVnICovCi0JCQkJZCA9IChVSU5UOCopYnVmMjsKLQkJCQlmb3IgKCBpID0gMDsgaSA8IChsZW4yICYgMHhmZmZlKTsgaSs9MiApIHsKLQkJCQkJaGZhMzg0eF9zZXRyZWdfbm9zd2FwKGh3LCAqKFVJTlQxNiopKCYoZFtpXSkpLCBkYXRhcmVnKTsKLQkJCQl9Ci0JCQkJaWYgKGxlbjIgJiAxKSB7Ci0JCQkJCVVJTlQxNiBkYXRhOwotCQkJCQlVSU5UOCAqYiA9IChVSU5UOCAqKSAmZGF0YTsKLQkJCQkJYlswXSA9IGRbbGVuMi0xXTsKLQkJCQkJaWYgKGJ1ZjMgIT0gTlVMTCkgewotCQkJCQkJZCA9IChVSU5UOCopYnVmMzsKLQkJCQkJCWJbMV0gPSBkWzBdOwotCQkJCQkJbGVuMy0tOwotCQkJCQkJYnVmMysrOwotCQkJCQl9Ci0JCQkJCWhmYTM4NHhfc2V0cmVnX25vc3dhcChodywgZGF0YSwgZGF0YXJlZyk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoKGJ1ZjMgIT0gTlVMTCkgJiYgKGxlbjMgPiAwKSkgewotCQkJCS8qIFdyaXRlIGV2ZW4obGVuMykgYnVmIGNvbnRlbnRzIHRvIGRhdGEgcmVnICovCi0JCQkJZCA9IChVSU5UOCopYnVmMzsKLQkJCQlmb3IgKCBpID0gMDsgaSA8IChsZW4zICYgMHhmZmZlKTsgaSs9MiApIHsKLQkJCQkJaGZhMzg0eF9zZXRyZWdfbm9zd2FwKGh3LCAqKFVJTlQxNiopKCYoZFtpXSkpLCBkYXRhcmVnKTsKLQkJCQl9Ci0JCQkJaWYgKGxlbjMgJiAxKSB7Ci0JCQkJCVVJTlQxNiBkYXRhOwotCQkJCQlVSU5UOCAqYiA9IChVSU5UOCAqKSAmZGF0YTsKLQkJCQkJYlswXSA9IGRbbGVuMy0xXTsKLQkJCQkJaWYgKGJ1ZjQgIT0gTlVMTCkgewotCQkJCQkJZCA9IChVSU5UOCopYnVmNDsKLQkJCQkJCWJbMV0gPSBkWzBdOwotCQkJCQkJbGVuNC0tOwotCQkJCQkJYnVmNCsrOwotCQkJCQl9Ci0JCQkJCWhmYTM4NHhfc2V0cmVnX25vc3dhcChodywgZGF0YSwgZGF0YXJlZyk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKChidWY0ICE9IE5VTEwpICYmIChsZW40ID4gMCkpIHsKLQkJCQkvKiBXcml0ZSBldmVuKGxlbjQpIGJ1ZiBjb250ZW50cyB0byBkYXRhIHJlZyAqLwotCQkJCWQgPSAoVUlOVDgqKWJ1ZjQ7Ci0JCQkJZm9yICggaSA9IDA7IGkgPCAobGVuNCAmIDB4ZmZmZSk7IGkrPTIgKSB7Ci0JCQkJCWhmYTM4NHhfc2V0cmVnX25vc3dhcChodywgKihVSU5UMTYqKSgmKGRbaV0pKSwgZGF0YXJlZyk7Ci0JCQkJfQotCQkJCWlmIChsZW40ICYgMSkgewotCQkJCQlVSU5UMTYgZGF0YTsKLQkJCQkJVUlOVDggKmIgPSAoVUlOVDggKikgJmRhdGE7Ci0JCQkJCWJbMF0gPSBkW2xlbjQtMV07Ci0JCQkJCWJbMV0gPSAwOwotCi0JCQkJCWhmYTM4NHhfc2V0cmVnX25vc3dhcChodywgZGF0YSwgZGF0YXJlZyk7Ci0JCQkJfQotCQkJfQotLy8JCQlwcmludGsoS0VSTl9ERUJVRyAiY3RiMiAlZCBpZCAlMDR4IG8gJWQgJWQgJWQgJWQgJWRcbiIsIGJhcCwgaWQsIG9mZnNldCwgbGVuMSwgbGVuMiwgbGVuMywgbGVuNCk7Ci0KLQkJfQotCi0jaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUENJKQotCQl1ZGVsYXkoNSk7Ci0JCS8qIFJlbGVhc2UgbG9jayAqLwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCAmKGh3LT5iYXBsb2NrKSwgZmxhZ3MpOwotI2VuZGlmCi0KLQl9Ci0KLQlpZiAocmVzdWx0KQotCQlXTEFOX0xPR19FUlJPUigiY29weV90b19iYXAoKSBmYWlsZWQuXG4iKTsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9jb3B5X2Zyb21fYXV4Ci0qCi0qIENvcGllcyBhIGNvbGxlY3Rpb24gb2YgYnl0ZXMgZnJvbSB0aGUgY29udHJvbGxlciBtZW1vcnkuICBUaGUKLSogQXV4aWxpYXJ5IHBvcnQgTVVTVCBiZSBlbmFibGVkIHByaW9yIHRvIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KLSogV2UgX21pZ2h0XyBiZSBpbiBhIGRvd25sb2FkIHN0YXRlLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qCWNhcmRhZGRyCWFkZHJlc3MgaW4gaGZhMzg0eCBkYXRhIHNwYWNlIHRvIHJlYWQKLSoJYXV4Y3RsCQlhZGRyZXNzIHNwYWNlIHNlbGVjdAotKglidWYJCXB0ciB0byBkZXN0aW5hdGlvbiBob3N0IGJ1ZmZlcgotKglsZW4JCWxlbmd0aCBvZiBkYXRhIHRvIHRyYW5zZmVyIChpbiBieXRlcykKLSoKLSogUmV0dXJuczoKLSoJbm90aGluZwotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCWJ1ZiBjb250YWlucyB0aGUgZGF0YSBjb3BpZWQKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotKglpbnRlcnJ1cHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZAotaGZhMzg0eF9jb3B5X2Zyb21fYXV4KAotCWhmYTM4NHhfdCAqaHcsIFVJTlQzMiBjYXJkYWRkciwgVUlOVDMyIGF1eGN0bCwgdm9pZCAqYnVmLCBVSU5UIGxlbikKLXsKLQlVSU5UMTYJCWN1cnJwYWdlOwotCVVJTlQxNgkJY3Vycm9mZnNldDsKLQlVSU5UCQlpID0gMDsKLQotCURCRkVOVEVSOwotCi0JaWYgKCAhKGh3LT5hdXhlbikgKSB7Ci0JCVdMQU5fTE9HX0RFQlVHKDEsCi0JCQkiQXR0ZW1wdCB0byByZWFkIDB4JTA0eCB3aGVuIGF1eCBub3QgZW5hYmxlZFxuIiwKLQkJCWNhcmRhZGRyKTsKLQkJcmV0dXJuOwotCi0JfQotCS8qIEJ1aWxkIGFwcHJvcHJpYXRlIGF1eCBwYWdlIGFuZCBvZmZzZXQgKi8KLQljdXJycGFnZSA9IEhGQTM4NHhfQVVYX01LUEFHRShjYXJkYWRkcik7Ci0JY3Vycm9mZnNldCA9IEhGQTM4NHhfQVVYX01LT0ZGKGNhcmRhZGRyLCBhdXhjdGwpOwotCWhmYTM4NHhfc2V0cmVnKGh3LCBjdXJycGFnZSwgSEZBMzg0eF9BVVhQQUdFKTsKLQloZmEzODR4X3NldHJlZyhodywgY3Vycm9mZnNldCwgSEZBMzg0eF9BVVhPRkZTRVQpOwotCXVkZWxheSg1KTsJLyogYmVhdCAqLwotCi0JLyogcmVhZCB0aGUgZGF0YSAqLwotCXdoaWxlICggaSA8IGxlbikgewotCQkqKChVSU5UMTYqKShidWYraSkpID0gaGZhMzg0eF9nZXRyZWdfbm9zd2FwKGh3LCBIRkEzODR4X0FVWERBVEEpOwotCQlpKz0yOwotCQljdXJyb2Zmc2V0Kz0yOwotCQlpZiAoIChjdXJyb2Zmc2V0JkhGQTM4NHhfQUREUl9BVVhfT0ZGX01BU0spID4KLQkJCUhGQTM4NHhfQUREUl9BVVhfT0ZGX01BWCApIHsKLQkJCWN1cnJwYWdlKys7Ci0JCQljdXJyb2Zmc2V0ID0gMDsKLQkJCWN1cnJvZmZzZXQgPSBIRkEzODR4X0FVWF9NS09GRihjdXJyb2Zmc2V0LCBhdXhjdGwpOwotCQkJaGZhMzg0eF9zZXRyZWcoaHcsIGN1cnJwYWdlLCBIRkEzODR4X0FVWFBBR0UpOwotCQkJaGZhMzg0eF9zZXRyZWcoaHcsIGN1cnJvZmZzZXQsIEhGQTM4NHhfQVVYT0ZGU0VUKTsKLQkJCXVkZWxheSg1KTsJLyogYmVhdCAqLwotCQl9Ci0JfQotCS8qIE1ha2Ugc3VyZSB0aGUgYXV4Y3RsIGJpdHMgYXJlIGNsZWFyICovCi0JaGZhMzg0eF9zZXRyZWcoaHcsIDAsIEhGQTM4NHhfQVVYT0ZGU0VUKTsKLQlEQkZFWElUOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2NvcHlfdG9fYXV4Ci0qCi0qIENvcGllcyBhIGNvbGxlY3Rpb24gb2YgYnl0ZXMgdG8gdGhlIGNvbnRyb2xsZXIgbWVtb3J5LiAgVGhlCi0qIEF1eGlsaWFyeSBwb3J0IE1VU1QgYmUgZW5hYmxlZCBwcmlvciB0byBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCi0qIFdlIF9taWdodF8gYmUgaW4gYSBkb3dubG9hZCBzdGF0ZS4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKgljYXJkYWRkcglhZGRyZXNzIGluIGhmYTM4NHggZGF0YSBzcGFjZSB0byByZWFkCi0qCWF1eGN0bAkJYWRkcmVzcyBzcGFjZSBzZWxlY3QKLSoJYnVmCQlwdHIgdG8gZGVzdGluYXRpb24gaG9zdCBidWZmZXIKLSoJbGVuCQlsZW5ndGggb2YgZGF0YSB0byB0cmFuc2ZlciAoaW4gYnl0ZXMpCi0qCi0qIFJldHVybnM6Ci0qCW5vdGhpbmcKLSoKLSogU2lkZSBlZmZlY3RzOgotKglDb250cm9sbGVyIG1lbW9yeSBub3cgY29udGFpbnMgYSBjb3B5IG9mIGJ1ZgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0qCWludGVycnVwdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkCi1oZmEzODR4X2NvcHlfdG9fYXV4KAotCWhmYTM4NHhfdCAqaHcsIFVJTlQzMiBjYXJkYWRkciwgVUlOVDMyIGF1eGN0bCwgdm9pZCAqYnVmLCBVSU5UIGxlbikKLXsKLQlVSU5UMTYJCWN1cnJwYWdlOwotCVVJTlQxNgkJY3Vycm9mZnNldDsKLQlVSU5UCQlpID0gMDsKLQotCURCRkVOVEVSOwotCi0JaWYgKCAhKGh3LT5hdXhlbikgKSB7Ci0JCVdMQU5fTE9HX0RFQlVHKDEsCi0JCQkiQXR0ZW1wdCB0byByZWFkIDB4JTA0eCB3aGVuIGF1eCBub3QgZW5hYmxlZFxuIiwKLQkJCWNhcmRhZGRyKTsKLQkJcmV0dXJuOwotCi0JfQotCS8qIEJ1aWxkIGFwcHJvcHJpYXRlIGF1eCBwYWdlIGFuZCBvZmZzZXQgKi8KLQljdXJycGFnZSA9IEhGQTM4NHhfQVVYX01LUEFHRShjYXJkYWRkcik7Ci0JY3Vycm9mZnNldCA9IEhGQTM4NHhfQVVYX01LT0ZGKGNhcmRhZGRyLCBhdXhjdGwpOwotCWhmYTM4NHhfc2V0cmVnKGh3LCBjdXJycGFnZSwgSEZBMzg0eF9BVVhQQUdFKTsKLQloZmEzODR4X3NldHJlZyhodywgY3Vycm9mZnNldCwgSEZBMzg0eF9BVVhPRkZTRVQpOwotCXVkZWxheSg1KTsJLyogYmVhdCAqLwotCi0JLyogd3JpdGUgdGhlIGRhdGEgKi8KLQl3aGlsZSAoIGkgPCBsZW4pIHsKLQkJaGZhMzg0eF9zZXRyZWdfbm9zd2FwKGh3LAotCQkJKigoVUlOVDE2KikoYnVmK2kpKSwgSEZBMzg0eF9BVVhEQVRBKTsKLQkJaSs9MjsKLQkJY3Vycm9mZnNldCs9MjsKLQkJaWYgKCBjdXJyb2Zmc2V0ID4gSEZBMzg0eF9BRERSX0FVWF9PRkZfTUFYICkgewotCQkJY3VycnBhZ2UrKzsKLQkJCWN1cnJvZmZzZXQgPSAwOwotCQkJaGZhMzg0eF9zZXRyZWcoaHcsIGN1cnJwYWdlLCBIRkEzODR4X0FVWFBBR0UpOwotCQkJaGZhMzg0eF9zZXRyZWcoaHcsIGN1cnJvZmZzZXQsIEhGQTM4NHhfQVVYT0ZGU0VUKTsKLQkJCXVkZWxheSg1KTsJLyogYmVhdCAqLwotCQl9Ci0JfQotCURCRkVYSVQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfY21kX3dhaXQKLSoKLSogV2FpdHMgZm9yIGF2YWlsYWJpbGl0eSBvZiB0aGUgQ29tbWFuZCByZWdpc3RlciwgdGhlbgotKiBpc3N1ZXMgdGhlIGdpdmVuIGNvbW1hbmQuICBUaGVuIHBvbGxzIHRoZSBFdnN0YXQgcmVnaXN0ZXIKLSogd2FpdGluZyBmb3IgY29tbWFuZCBjb21wbGV0aW9uLiAgVGltZW91dHMgc2hvdWxkbid0IGJlCi0qIHBvc3NpYmxlIHNpbmNlIHdlJ3JlIHByZXZlbnRpbmcgb3ZlcmxhcHBpbmcgY29tbWFuZHMgYW5kIGFsbAotKiBjb21tYW5kcyBzaG91bGQgYmUgY2xlYXJlZCBhbmQgYWNrbm93bGVkZ2VkLgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCWRldmljZSBzdHJ1Y3R1cmUKLSogICAgICAgY21kICAgICAgICAgICAgIGNtZCBzdHJ1Y3R1cmUuICBJbmNsdWRlcyBhbGwgYXJndW1lbnRzIGFuZCByZXN1bHQKLSogICAgICAgICAgICAgICAgICAgICAgIGRhdGEgcG9pbnRzLiAgQWxsIGluIGhvc3Qgb3JkZXIuCi0qCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJLUVUSU1FRE9VVAl0aW1lZCBvdXQgd2FpdGluZyBmb3IgcmVnaXN0ZXIgcmVhZHkgb3IKLSoJCQljb21tYW5kIGNvbXBsZXRpb24KLSoJPjAJCWNvbW1hbmQgaW5kaWNhdGVkIGVycm9yLCBTdGF0dXMgYW5kIFJlc3AwLTIgYXJlCi0qCQkJaW4gaHcgc3RydWN0dXJlLgotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludCBoZmEzODR4X2RvY21kX3dhaXQoIGhmYTM4NHhfdCAqaHcsIGhmYTM4NHhfbWV0YWNtZF90ICpjbWQpCi17Ci0JaW50CQlyZXN1bHQgPSAtRVRJTUVET1VUOwotCVVJTlQxNgkJcmVnID0gMDsKLQlVSU5UMTYgICAgICAgICAgY291bnRlcjsKLQotCURCRkVOVEVSOwotCi0JaHctPmNtZGZsYWcgPSAwOwotCWh3LT5jbWRkYXRhID0gY21kOwotCi0JLyogd2FpdCBmb3IgdGhlIGJ1c3kgYml0IHRvIGNsZWFyICovCi0JY291bnRlciA9IDA7Ci0JcmVnID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfQ01EKTsKLQl3aGlsZSAoIEhGQTM4NHhfQ01EX0lTQlVTWShyZWcpICYmCi0JCShjb3VudGVyIDwgMTApKSB7Ci0JCXJlZyA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X0NNRCk7Ci0JCWNvdW50ZXIrKzsKLQkJdWRlbGF5KDEwKTsKLQl9Ci0KLQlpZiAoSEZBMzg0eF9DTURfSVNCVVNZKHJlZykpIHsKLQkJV0xBTl9MT0dfRVJST1IoImhmYTM4NHhfY21kIHRpbWVvdXQoMSksIHJlZz0weCUwaHguXG4iLCByZWcpOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0JaWYgKCFIRkEzODR4X0NNRF9JU0JVU1kocmVnKSkgewotCQkvKiBidXN5IGJpdCBjbGVhciwgd3JpdGUgY29tbWFuZCAqLwotCQloZmEzODR4X3NldHJlZyhodywgY21kLT5wYXJtMCwgSEZBMzg0eF9QQVJBTTApOwotCQloZmEzODR4X3NldHJlZyhodywgY21kLT5wYXJtMSwgSEZBMzg0eF9QQVJBTTEpOwotCQloZmEzODR4X3NldHJlZyhodywgY21kLT5wYXJtMiwgSEZBMzg0eF9QQVJBTTIpOwotCQloZmEzODR4X3NldHJlZyhodywgY21kLT5jbWQsIEhGQTM4NHhfQ01EKTsKLQotI2lmZGVmIENNRF9JUlEKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDIsMCkpCi0JCXdoaWxlICghIGh3LT5jbWRmbGFnKQotCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmaHctPmNtZHEpOwotI2Vsc2UKLQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGh3LT5jbWRxLCBody0+Y21kZmxhZyk7Ci0jZW5kaWYKLQkJcmVzdWx0ID0gSEZBMzg0eF9TVEFUVVNfUkVTVUxUX0dFVChjbWQtPnN0YXR1cyk7Ci0jZWxzZSAvLyBDTURfSVJRCi0JCS8qIE5vdyB3YWl0IGZvciBjb21wbGV0aW9uICovCi0JCWNvdW50ZXIgPSAwOwotCQlyZWcgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9FVlNUQVQpOwotCQkvKiBJbml0aWFsaXphdGlvbiBpcyB0aGUgcHJvYmxlbS4gIEl0IHRha2VzIGFib3V0Ci0gICAgICAgICAgICAgICAgICAgMTAwbXMuICJub3JtYWwiIGNvbW1hbmRzIGFyZSB0eXBpY2FsbHkgaXMgYWJvdXQKLSAgICAgICAgICAgICAgICAgICAyMDAtNDAwIHVzIChJJ3ZlIG5ldmVyIHNlZW4gbGVzcyB0aGFuIDIwMCkuICBMb25nZXIKLSAgICAgICAgICAgICAgICAgICBpcyBiZXR0ZXIgc28gdGhhdCB3ZSdyZSBub3QgaGFtbWVyaW5nIHRoZSBidXMuICovCi0JCXdoaWxlICggIUhGQTM4NHhfRVZTVEFUX0lTQ01EKHJlZykgJiYKLQkJCShjb3VudGVyIDwgNTAwMCkpIHsKLQkJCXJlZyA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X0VWU1RBVCk7Ci0JCQljb3VudGVyKys7Ci0JCQl1ZGVsYXkoMjAwKTsKLQkJfQotCi0JCWlmICggSEZBMzg0eF9FVlNUQVRfSVNDTUQocmVnKSApIHsKLQkJCXJlc3VsdCA9IDA7Ci0JCQljbWQtPnJlc3VsdC5zdGF0dXMgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9TVEFUVVMpOwotCQkJY21kLT5yZXN1bHQucmVzcDAgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9SRVNQMCk7Ci0JCQljbWQtPnJlc3VsdC5yZXNwMSA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X1JFU1AxKTsKLQkJCWNtZC0+cmVzdWx0LnJlc3AyID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfUkVTUDIpOwotCQkJaGZhMzg0eF9zZXRyZWcoaHcsIEhGQTM4NHhfRVZBQ0tfQ01ELAotCQkJCUhGQTM4NHhfRVZBQ0spOwotCQkJcmVzdWx0ID0gSEZBMzg0eF9TVEFUVVNfUkVTVUxUX0dFVChjbWQtPnJlc3VsdC5zdGF0dXMpOwotCQl9IGVsc2UgewotCQkJV0xBTl9MT0dfRVJST1IoImhmYTM4NHhfY21kIHRpbWVvdXQoMiksIHJlZz0weCUwaHguXG4iLCByZWcpOwotCQl9Ci0jZW5kaWYgIC8qIENNRF9JUlEgKi8KLQl9Ci0KLSBmYWlsZWQ6Ci0JaHctPmNtZGZsYWcgPSAwOwotCWh3LT5jbWRkYXRhID0gTlVMTDsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9kbF9kb2NtZF93YWl0Ci0qCi0qIFdhaXRzIGZvciBhdmFpbGFiaWxpdHkgb2YgdGhlIENvbW1hbmQgcmVnaXN0ZXIsIHRoZW4KLSogaXNzdWVzIHRoZSBnaXZlbiBjb21tYW5kLiAgVGhlbiBwb2xscyB0aGUgRXZzdGF0IHJlZ2lzdGVyCi0qIHdhaXRpbmcgZm9yIGNvbW1hbmQgY29tcGxldGlvbi4gIFRpbWVvdXRzIHNob3VsZG4ndCBiZQotKiBwb3NzaWJsZSBzaW5jZSB3ZSdyZSBwcmV2ZW50aW5nIG92ZXJsYXBwaW5nIGNvbW1hbmRzIGFuZCBhbGwKLSogY29tbWFuZHMgc2hvdWxkIGJlIGNsZWFyZWQgYW5kIGFja25vd2xlZGdlZC4KLSoKLSogVGhpcyByb3V0aW5lIGlzIG9ubHkgdXNlZCBmb3IgZG93bmxvYWRzLiAgU2luY2UgaXQgZG9lc24ndCBsb2NrIG91dAotKiBpbnRlcnJ1cHRzIHRoZSBzeXN0ZW0gcmVzcG9uc2UgaXMgbXVjaCBiZXR0ZXIuCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJZGV2aWNlIHN0cnVjdHVyZQotKiAgICAgICBjbWQgICAgICAgICAgICAgY21kIHN0cnVjdHVyZS4gIEluY2x1ZGVzIGFsbCBhcmd1bWVudHMgYW5kIHJlc3VsdAotKiAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBwb2ludHMuICBBbGwgaW4gaG9zdCBvcmRlci4KLSoKLSogUmV0dXJuczoKLSoJMAkJc3VjY2VzcwotKgktRVRJTUVET1VUCXRpbWVkIG91dCB3YWl0aW5nIGZvciByZWdpc3RlciByZWFkeSBvcgotKgkJCWNvbW1hbmQgY29tcGxldGlvbgotKgk+MAkJY29tbWFuZCBpbmRpY2F0ZWQgZXJyb3IsIFN0YXR1cyBhbmQgUmVzcDAtMiBhcmUKLSoJCQlpbiBodyBzdHJ1Y3R1cmUuCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50IGhmYTM4NHhfZGxfZG9jbWRfd2FpdCggaGZhMzg0eF90ICpodywgaGZhMzg0eF9tZXRhY21kX3QgKmNtZCkKLXsKLQlpbnQJCXJlc3VsdCA9IC1FVElNRURPVVQ7Ci0JdW5zaWduZWQgbG9uZwl0aW1lb3V0OwotCVVJTlQxNgkJcmVnID0gMDsKLQotCURCRkVOVEVSOwotCS8qIHdhaXQgZm9yIHRoZSBidXN5IGJpdCB0byBjbGVhciAqLwotCXRpbWVvdXQgPSBqaWZmaWVzICsgMSpIWjsKLQlyZWcgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9DTUQpOwotCXdoaWxlICggSEZBMzg0eF9DTURfSVNCVVNZKHJlZykgJiYgdGltZV9iZWZvcmUoIGppZmZpZXMsIHRpbWVvdXQpICkgewotCQlyZWcgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9DTUQpOwotCQl1ZGVsYXkoMTApOwotCX0KLQlpZiAoSEZBMzg0eF9DTURfSVNCVVNZKHJlZykpIHsKLQkJV0xBTl9MT0dfV0FSTklORygiVGltZWQgb3V0IHdhaXRpbmcgZm9yIGNtZCByZWdpc3Rlci5cbiIpOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLQlpZiAoIUhGQTM4NHhfQ01EX0lTQlVTWShyZWcpKSB7Ci0JCS8qIGJ1c3kgYml0IGNsZWFyLCB3cml0ZSBjb21tYW5kICovCi0JCWhmYTM4NHhfc2V0cmVnKGh3LCBjbWQtPnBhcm0wLCBIRkEzODR4X1BBUkFNMCk7Ci0JCWhmYTM4NHhfc2V0cmVnKGh3LCBjbWQtPnBhcm0xLCBIRkEzODR4X1BBUkFNMSk7Ci0JCWhmYTM4NHhfc2V0cmVnKGh3LCBjbWQtPnBhcm0yLCBIRkEzODR4X1BBUkFNMik7Ci0JCWhmYTM4NHhfc2V0cmVnKGh3LCBjbWQtPmNtZCwgSEZBMzg0eF9DTUQpOwotCi0JCS8qIE5vdyB3YWl0IGZvciBjb21wbGV0aW9uICovCi0JCWlmICggKEhGQTM4NHhfQ01EX0NNRENPREVfR0VUKGNtZC0+Y21kKSA9PSBIRkEzODR4X0NNRENPREVfRE9XTkxEKSApIHsKLQkJCS8qIGRsdGltZW91dCBpcyBpbiBtcyAqLwotCQkJdGltZW91dCA9ICgoKFVJTlQzMilody0+ZGx0aW1lb3V0KSAvIDEwMDBVTCkgKiBIWjsKLQkJCWlmICggdGltZW91dCA+IDAgKSB7Ci0JCQkJdGltZW91dCArPSBqaWZmaWVzOwotCQkJfSBlbHNlIHsKLQkJCQl0aW1lb3V0ID0gamlmZmllcyArIDEqSFo7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl0aW1lb3V0ID0gamlmZmllcyArIDEqSFo7Ci0JCX0KLQkJcmVnID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfRVZTVEFUKTsKLQkJd2hpbGUgKCAhSEZBMzg0eF9FVlNUQVRfSVNDTUQocmVnKSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLHRpbWVvdXQpICkgewotCQkJdWRlbGF5KDEwMCk7Ci0JCQlyZWcgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9FVlNUQVQpOwotCQl9Ci0JCWlmICggSEZBMzg0eF9FVlNUQVRfSVNDTUQocmVnKSApIHsKLQkJCXJlc3VsdCA9IDA7Ci0JCQljbWQtPnJlc3VsdC5zdGF0dXMgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9TVEFUVVMpOwotCQkJY21kLT5yZXN1bHQucmVzcDAgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9SRVNQMCk7Ci0JCQljbWQtPnJlc3VsdC5yZXNwMSA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X1JFU1AxKTsKLQkJCWNtZC0+cmVzdWx0LnJlc3AyID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfUkVTUDIpOwotCQkJaGZhMzg0eF9zZXRyZWcoaHcsIEhGQTM4NHhfRVZBQ0tfQ01ELCBIRkEzODR4X0VWQUNLKTsKLQkJCXJlc3VsdCA9IEhGQTM4NHhfU1RBVFVTX1JFU1VMVF9HRVQoY21kLT5yZXN1bHQuc3RhdHVzKTsKLQkJfQotCX0KLQotZmFpbGVkOgotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfZHJ2cl9zdGFydAotKgotKiBJc3N1ZXMgdGhlIE1BQyBpbml0aWFsaXplIGNvbW1hbmQsIHNldHMgdXAgc29tZSBkYXRhIHN0cnVjdHVyZXMsCi0qIGFuZCBlbmFibGVzIHRoZSBpbnRlcnJ1cHRzLiAgQWZ0ZXIgdGhpcyBmdW5jdGlvbiBjb21wbGV0ZXMsIHRoZQotKiBsb3ctbGV2ZWwgc3R1ZmYgc2hvdWxkIGJlIHJlYWR5IGZvciBhbnkvYWxsIGNvbW1hbmRzLgotKgotKiBBcmd1bWVudHM6Ci0qCWh3CQlkZXZpY2Ugc3RydWN0dXJlCi0qIFJldHVybnM6Ci0qCTAJCXN1Y2Nlc3MKLSoJPjAJCWYvdyByZXBvcnRlZCBlcnJvciAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX3N0YXJ0KGhmYTM4NHhfdCAqaHcpCi17Ci0JaW50CXJlc3VsdCA9IDA7Ci0JVUlOVDE2CQkJcmVnOwotCWludAkJCWk7Ci0JaW50CQkJajsKLQlEQkZFTlRFUjsKLQotCS8qIGNhbGwgaW5pdGlhbGl6ZSAqLwotCXJlc3VsdCA9IGhmYTM4NHhfY21kX2luaXRpYWxpemUoaHcpOwotCWlmIChyZXN1bHQgIT0gMCkgewotCQlXTEFOX0xPR19FUlJPUigiSW5pdGlhbGl6ZSBjb21tYW5kIGZhaWxlZC5cbiIpOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLQkvKiBtYWtlIHN1cmUgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgYW5kIGFueSBsYXlhYm91dCBldmVudHMgY2xlYXJlZCAqLwotCWhmYTM4NHhfc2V0cmVnKGh3LCAwLCBIRkEzODR4X0lOVEVOKTsKLQloZmEzODR4X3NldHJlZyhodywgMHhmZmZmLCBIRkEzODR4X0VWQUNLKTsKLQotICAgICAgICBody0+dHhmaWRfaGVhZCA9IDA7Ci0gICAgICAgIGh3LT50eGZpZF90YWlsID0gMDsKLSAgICAgICAgaHctPnR4ZmlkX04gPSBIRkEzODR4X0RSVlJfRklEU1RBQ0tMRU5fTUFYOwotICAgICAgICBtZW1zZXQoaHctPnR4ZmlkX3F1ZXVlLCAwLCBzaXplb2YoaHctPnR4ZmlkX3F1ZXVlKSk7Ci0KLQkvKiBBbGxvY2F0ZSB0eCBhbmQgbm90aWZ5IEZJRHMgKi8KLQkvKiBGaXJzdCwgdHggKi8KLQlmb3IgKCBpID0gMDsgaSA8IEhGQTM4NHhfRFJWUl9GSURTVEFDS0xFTl9NQVgtMTsgaSsrKSB7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfY21kX2FsbG9jYXRlKGh3LCBIRkEzODR4X0RSVlJfVFhCVUZfTUFYKTsKLQkJaWYgKHJlc3VsdCAhPSAwKSB7Ci0JCQlXTEFOX0xPR19FUlJPUigiQWxsb2NhdGUodHgpIGNvbW1hbmQgZmFpbGVkLlxuIik7Ci0JCQlnb3RvIGZhaWxlZDsKLQkJfQotCQlqID0gMDsKLQkJZG8gewotCQkJcmVnID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfRVZTVEFUKTsKLQkJCXVkZWxheSgxMCk7Ci0JCQlqKys7Ci0JCX0gd2hpbGUgKCAhSEZBMzg0eF9FVlNUQVRfSVNBTExPQyhyZWcpICYmIGogPCA1MCk7IC8qIDUwIGlzIHRpbWVvdXQgKi8KLQkJaWYgKCBqID49IDUwICkgewotCQkJV0xBTl9MT0dfRVJST1IoIlRpbWVkIG91dCB3YWl0aW5nIGZvciBldmFsbG9jKHR4KS5cbiIpOwotCQkJcmVzdWx0ID0gLUVUSU1FRE9VVDsKLQkJCWdvdG8gZmFpbGVkOwotCQl9Ci0JCXJlZyA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X0FMTE9DRklEKTsKLQotCQl0eGZpZF9xdWV1ZV9hZGQoaHcsIHJlZyk7Ci0KLQkJV0xBTl9MT0dfREVCVUcoNCwiaHctPnR4ZmlkX3F1ZXVlWyVkXT0weCUwNHhcbiIsaSxyZWcpOwotCi0JCXJlZyA9IEhGQTM4NHhfRVZBQ0tfQUxMT0NfU0VUKDEpOwotCQloZmEzODR4X3NldHJlZyhodywgcmVnLCBIRkEzODR4X0VWQUNLKTsKLQotCX0KLQotCS8qIE5vdywgdGhlIGluZm8gZnJhbWUgZmlkICovCi0JcmVzdWx0ID0gaGZhMzg0eF9jbWRfYWxsb2NhdGUoaHcsIEhGQTM4NHhfSU5GT0ZSTV9NQVhMRU4pOwotCWlmIChyZXN1bHQgIT0gMCkgewotCQlXTEFOX0xPR19FUlJPUigiQWxsb2NhdGUodHgpIGNvbW1hbmQgZmFpbGVkLlxuIik7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQlpID0gMDsKLQlkbyB7Ci0JCXJlZyA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X0VWU1RBVCk7Ci0JCXVkZWxheSgxMCk7Ci0JCWkrKzsKLQl9IHdoaWxlICggIUhGQTM4NHhfRVZTVEFUX0lTQUxMT0MocmVnKSAmJiBpIDwgNTApOyAvKiA1MCBpcyB0aW1lb3V0ICovCi0JaWYgKCBpID49IDUwICkgewotCQlXTEFOX0xPR19FUlJPUigiVGltZWQgb3V0IHdhaXRpbmcgZm9yIGV2YWxsb2MoaW5mbykuXG4iKTsKLQkJcmVzdWx0ID0gLUVUSU1FRE9VVDsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCWh3LT5pbmZvZmlkID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfQUxMT0NGSUQpOwotCXJlZyA9IEhGQTM4NHhfRVZBQ0tfQUxMT0NfU0VUKDEpOwotCWhmYTM4NHhfc2V0cmVnKGh3LCByZWcsIEhGQTM4NHhfRVZBQ0spOwotCVdMQU5fTE9HX0RFQlVHKDQsImh3LT5pbmZvZmlkPTB4JTA0eFxuIiwgaHctPmluZm9maWQpOwotCi0JLyogU2V0IHN3c3VwcG9ydCByZWdzIHRvIG1hZ2ljICMgZm9yIGNhcmQgcHJlc2VuY2UgZGV0ZWN0aW9uICovCi0JaGZhMzg0eF9zZXRyZWcoaHcsIEhGQTM4NHhfRFJWUl9NQUdJQywgSEZBMzg0eF9TV1NVUFBPUlQwKTsKLQotCS8qIE5vdyBlbmFibGUgdGhlIGludGVycnVwdHMgYW5kIHNldCB0aGUgcnVubmluZyBzdGF0ZSAqLwotCWhmYTM4NHhfc2V0cmVnKGh3LCAweGZmZmYsIEhGQTM4NHhfRVZTVEFUKTsKLQloZmEzODR4X2V2ZW50c19hbGwoaHcpOwotCi0JaHctPnN0YXRlID0gSEZBMzg0eF9TVEFURV9SVU5OSU5HOwotCi0JZ290byBkb25lOwotZmFpbGVkOgotCVdMQU5fTE9HX0VSUk9SKCJGYWlsZWQsIHJlc3VsdD0lZFxuIiwgcmVzdWx0KTsKLWRvbmU6Ci0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2RydnJfc3RvcAotKgotKiBJc3N1ZXMgdGhlIGluaXRpYWxpemUgY29tbWFuZCB0byBsZWF2ZSB1cyBpbiB0aGUgJ3Jlc2V0JyBzdGF0ZS4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZXJyb3IgLSBmL3cgc3RhdHVzIGNvZGUKLSoJPDAJCWRyaXZlciByZXBvcnRlZCBlcnJvcgotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9zdG9wKGhmYTM4NHhfdCAqaHcpCi17Ci0JaW50CXJlc3VsdCA9IDA7Ci0JaW50IGk7Ci0JREJGRU5URVI7Ci0KLQlkZWxfdGltZXJfc3luYygmaHctPmNvbW1zcXVhbF90aW1lcik7Ci0KLQlpZiAoIGh3LT53bGFuZGV2LT5od3JlbW92ZWQgKSB7Ci0JCS8qIG9ubHkgZmx1c2ggd2hlbiB3ZSdyZSBzaHV0dGluZyBkb3duIGZvciBnb29kICovCi0JCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7Ci0JfQotCi0JaWYgKGh3LT5zdGF0ZSA9PSBIRkEzODR4X1NUQVRFX1JVTk5JTkcpIHsKLQkJLyoKLQkJICogU2VuZCB0aGUgTUFDIGluaXRpYWxpemUgY21kLgotCQkgKi8KLQkJaGZhMzg0eF9jbWRfaW5pdGlhbGl6ZShodyk7Ci0KLQkJLyoKLQkJICogTWFrZSBhYnNvbHV0ZWx5IHN1cmUgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgYW5kIGFueQotCQkgKiBsYXlhYm91dCBldmVudHMgY2xlYXJlZAotCQkgKi8KLQkJaGZhMzg0eF9zZXRyZWcoaHcsIDAsIEhGQTM4NHhfSU5URU4pOwotCQloZmEzODR4X3NldHJlZyhodywgMHhmZmZmLCBIRkEzODR4X0VWQUNLKTsKLQl9Ci0KLQl0YXNrbGV0X2tpbGwoJmh3LT5iYXBfdGFza2xldCk7Ci0KLQlody0+bGlua19zdGF0dXMgPSBIRkEzODR4X0xJTktfTk9UQ09OTkVDVEVEOwotCWh3LT5zdGF0ZSA9IEhGQTM4NHhfU1RBVEVfSU5JVDsKLQotCS8qIENsZWFyIGFsbCB0aGUgcG9ydCBzdGF0dXMgKi8KLQlmb3IgKCBpID0gMDsgaSA8IEhGQTM4NHhfTlVNUE9SVFNfTUFYOyBpKyspIHsKLQkJaHctPnBvcnRfZW5hYmxlZFtpXSA9IDA7Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2RydnJfdHhmcmFtZQotKgotKiBUYWtlcyBhIGZyYW1lIGZyb20gcHJpc20yc3RhIGFuZCBxdWV1ZXMgaXQgZm9yIHRyYW5zbWlzc2lvbi4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKglza2IJCXBhY2tldCBidWZmZXIgc3RydWN0LiAgQ29udGFpbnMgYW4gODAyLjExCi0qCQkJZGF0YSBmcmFtZS4KLSogICAgICAgcDgwMjExX2hkciAgICAgIHBvaW50cyB0byB0aGUgODAyLjExIGhlYWRlciBmb3IgdGhlIHBhY2tldC4KLSogUmV0dXJuczoKLSoJMAkJU3VjY2VzcyBhbmQgbW9yZSBidWZmcyBhdmFpbGFibGUKLSoJMQkJU3VjY2VzcyBidXQgbm8gbW9yZSBidWZmcwotKgkyCQlBbGxvY2F0aW9uIGZhaWx1cmUKLSoJMwkJTUFDIFR4IGNvbW1hbmQgZmFpbGVkCi0qCTQJCUJ1ZmZlciBmdWxsIG9yIHF1ZXVlIGJ1c3kKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfdHhmcmFtZShoZmEzODR4X3QgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBwODAyMTFfaGRyX3QgKnA4MDIxMV9oZHIsIHA4MDIxMV9tZXRhd2VwX3QgKnA4MDIxMV93ZXApCi17Ci0JaGZhMzg0eF90eF9mcmFtZV90CXR4ZGVzYzsKLQlVSU5UMTYJCQltYWNxID0gMDsKLQlVSU5UMTYJCQlmaWQ7Ci0JaW50CQkJcmVzdWx0OwotCi0JREJGRU5URVI7Ci0KLQkvKiBCdWlsZCBUeCBmcmFtZSBzdHJ1Y3R1cmUgKi8KLQkvKiBTZXQgdXAgdGhlIGNvbnRyb2wgZmllbGQgKi8KLQltZW1zZXQoJnR4ZGVzYywgMCwgc2l6ZW9mKHR4ZGVzYykpOwotCi0vKiBUeCBjb21wbGV0ZSBhbmQgVHggZXhjZXB0aW9uIGRpc2FibGUgcGVyIGRsZWFjaC4gIE1pZ2h0IGJlIGNhdXNpbmcKLSAqIGJ1ZiBkZXBsZXRpb24KLSAqLwotI2RlZmluZSBET0JPVEggMQotI2lmIERPQk9USAotCXR4ZGVzYy50eF9jb250cm9sID0KLQkJSEZBMzg0eF9UWF9NQUNQT1JUX1NFVCgwKSB8IEhGQTM4NHhfVFhfU1RSVUNUWVBFX1NFVCgxKSB8Ci0JCUhGQTM4NHhfVFhfVFhFWF9TRVQoMSkgfCBIRkEzODR4X1RYX1RYT0tfU0VUKDEpOwotI2VsaWYgRE9FWEMKLQl0eGRlc2MudHhfY29udHJvbCA9Ci0JCUhGQTM4NHhfVFhfTUFDUE9SVF9TRVQoMCkgfCBIRkEzODR4X1RYX1NUUlVDVFlQRV9TRVQoMSkgfAotCQlIRkEzODR4X1RYX1RYRVhfU0VUKDEpIHwgSEZBMzg0eF9UWF9UWE9LX1NFVCgwKTsKLSNlbHNlCi0JdHhkZXNjLnR4X2NvbnRyb2wgPQotCQlIRkEzODR4X1RYX01BQ1BPUlRfU0VUKDApIHwgSEZBMzg0eF9UWF9TVFJVQ1RZUEVfU0VUKDEpIHwKLQkJSEZBMzg0eF9UWF9UWEVYX1NFVCgwKSB8IEhGQTM4NHhfVFhfVFhPS19TRVQoMCk7Ci0jZW5kaWYKLQotCS8qIGlmIHdlJ3JlIHVzaW5nIGhvc3QgV0VQLCBpbmNyZWFzZSBzaXplIGJ5IElWK0lDViAqLwotCWlmIChwODAyMTFfd2VwLT5kYXRhKSB7Ci0JCXR4ZGVzYy5kYXRhX2xlbiA9IGhvc3QyaGZhMzg0eF8xNihza2ItPmxlbis4KTsKLQkJLy8JCXR4ZGVzYy50eF9jb250cm9sIHw9IEhGQTM4NHhfVFhfTk9FTkNSWVBUX1NFVCgxKTsKLQl9IGVsc2UgewotCQl0eGRlc2MuZGF0YV9sZW4gPSAgaG9zdDJoZmEzODR4XzE2KHNrYi0+bGVuKTsKLQl9Ci0KLQl0eGRlc2MudHhfY29udHJvbCA9IGhvc3QyaGZhMzg0eF8xNih0eGRlc2MudHhfY29udHJvbCk7Ci0JLyogY29weSB0aGUgaGVhZGVyIG92ZXIgdG8gdGhlIHR4ZGVzYyAqLwotCW1lbWNweSgmKHR4ZGVzYy5mcmFtZV9jb250cm9sKSwgcDgwMjExX2hkciwgc2l6ZW9mKHA4MDIxMV9oZHJfdCkpOwotCi0JLyogU2luY2UgdGJ1c3kgaXMgc2V0IHdoZW5ldmVyIHRoZSBzdGFjayBpcyBlbXB0eSwgdGhlcmUgc2hvdWxkCi0JICogYWx3YXlzIGJlIHNvbWV0aGluZyBvbiB0aGUgc3RhY2sgaWYgd2UgZ2V0IHRvIHRoaXMgcG9pbnQuCi0JICogW01TTV06IE5PVCBUUlVFISEhISEgc28gSSBhZGRlZCB0aGUgdGVzdCBvZiBmaWQgYmVsb3cuCi0JICovCi0KLQkvKiBBbGxvY2F0ZSBGSUQgKi8KLQotCWZpZCA9IHR4ZmlkX3F1ZXVlX3JlbW92ZShodyk7Ci0KLQlpZiAoIGZpZCA9PSAwICkgeyAvKiBzdGFjayBvciBxdWV1ZSB3YXMgZW1wdHkgKi8KLQkJcmV0dXJuIDQ7Ci0JfQotCi0JLyogbm93IGxldCdzIGdldCB0aGUgY21kbG9jayAqLwotCXNwaW5fbG9jaygmaHctPmNtZGxvY2spOwotCi0JLyogQ29weSBkZXNjcmlwdG9yK3BheWxvYWQgdG8gRklEICovCi0gICAgICAgIGlmIChwODAyMTFfd2VwLT5kYXRhKSB7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfY29weV90b19iYXA0KGh3LCBIRkEzODR4X0JBUF9QUk9DLCBmaWQsIDAsCi0JCQkJCSAgICAgICZ0eGRlc2MsIHNpemVvZih0eGRlc2MpLAotCQkJCQkgICAgICBwODAyMTFfd2VwLT5pdiwgc2l6ZW9mKHA4MDIxMV93ZXAtPml2KSwKLQkJCQkJICAgICAgcDgwMjExX3dlcC0+ZGF0YSwgc2tiLT5sZW4sCi0JCQkJCSAgICAgIHA4MDIxMV93ZXAtPmljdiwgc2l6ZW9mKHA4MDIxMV93ZXAtPmljdikpOwotCX0gZWxzZSB7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfY29weV90b19iYXA0KGh3LCBIRkEzODR4X0JBUF9QUk9DLCBmaWQsIDAsCi0JCQkJCSAgICAgICZ0eGRlc2MsIHNpemVvZih0eGRlc2MpLAotCQkJCQkgICAgICBza2ItPmRhdGEsIHNrYi0+bGVuLAotCQkJCQkgICAgICBOVUxMLCAwLCBOVUxMLCAwKTsKLQl9Ci0KLQlpZiAoIHJlc3VsdCApIHsKLQkJV0xBTl9MT0dfREVCVUcoMSwKLQkJCSJjb3B5X3RvX2JhcCglMDR4LCAlZCwgJWQpIGZhaWxlZCwgcmVzdWx0PTB4JXhcbiIsCi0JCQlmaWQsCi0JCSAJc2l6ZW9mKHR4ZGVzYyksCi0JIAkJc2tiLT5sZW4sCi0JCQlyZXN1bHQpOwotCi0JCS8qIHB1dCB0aGUgZmlkIGJhY2sgaW4gdGhlIHF1ZXVlICovCi0JCXR4ZmlkX3F1ZXVlX2FkZChodywgZmlkKTsKLQotCQlyZXN1bHQgPSAzOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLQkvKiBJc3N1ZSBUeCBjb21tYW5kICovCi0JcmVzdWx0ID0gaGZhMzg0eF9jbWRfdHJhbnNtaXQoaHcsIEhGQTM4NHhfVFhDTURfUkVDTCwgbWFjcSwgZmlkKTsKLQotCWlmICggcmVzdWx0ICE9IDAgKSB7Ci0JCXR4ZmlkX3F1ZXVlX2FkZChodywgZmlkKTsKLQotCQlXTEFOX0xPR19ERUJVRygxLCJjbWRfdHgoJTA0eCkgZmFpbGVkLCByZXN1bHQ9JWRcbiIsCi0JCQlmaWQsIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IDM7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQotCS8qIGluZGljYXRlIHdlIGhhdmVuJ3QgYW55IGJ1ZmZlcnMsIGludF9hbGxvYyB3aWxsIGNsZWFyICovCi0JcmVzdWx0ID0gdHhmaWRfcXVldWVfZW1wdHkoaHcpOwotZmFpbGVkOgotCi0Jc3Bpbl91bmxvY2soJmh3LT5jbWRsb2NrKTsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfaW50ZXJydXB0Ci0qCi0qIERyaXZlciBpbnRlcnJ1cHQgaGFuZGxlci4KLSoKLSogQXJndW1lbnRzOgotKglpcnEJCWlycSBudW1iZXIKLSoJZGV2X2lkCQlwb2ludGVyIHRvIHRoZSBkZXZpY2UKLSoJcmVncwkJcmVnaXN0ZXJzCi0qCi0qIFJldHVybnM6Ci0qCW5vdGhpbmcKLSoKLSogU2lkZSBlZmZlY3RzOgotKglNYXkgcmVzdWx0IGluIGEgZnJhbWUgYmVpbmcgcGFzc2VkIHVwIHRoZSBzdGFjayBvciBhbiBpbmZvCi0qCWZyYW1lIGJlaW5nIGhhbmRsZWQuCi0qCi0qIENhbGwgY29udGV4dDoKLSoJVW1tbSwgY291bGQgaXQgYmUgaW50ZXJydXB0PwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pcnFyZXR1cm5fdCBoZmEzODR4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQgUFRfUkVHUykKLXsKLQlpbnQJCQlyZWc7Ci0Jd2xhbmRldmljZV90CQkqd2xhbmRldiA9ICh3bGFuZGV2aWNlX3QqKWRldl9pZDsKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0JaW50CQkJZXZfcmVhZCA9IDA7Ci0JREJGRU5URVI7Ci0KLQlpZiAoIXdsYW5kZXYgfHwgd2xhbmRldi0+aHdyZW1vdmVkKQotCQlyZXR1cm4gSVJRX05PTkU7ICAvKiBOb3QgbXVjaCB3ZSBjYW4gZG8gdy9vIGhhcmR3YXJlICovCi0jaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUENNQ0lBKQotCWlmIChody0+aW9iYXNlID09IDApICAvKiBYWFggRklYTUUgUHJvcGVybHkgKi8KLQkJcmV0dXJuIElSUV9OT05FOwotI2VuZGlmCi0KLQlmb3IgKDs7ZXZfcmVhZCsrKSB7Ci0JCWlmIChldl9yZWFkID49IHByaXNtMl9pcnFfZXZyZWFkX21heCkKLQkJCWJyZWFrOwotCi0JCS8qIENoZWNrIHN3c3VwcG9ydCByZWcgbWFnaWMgIyBmb3IgY2FyZCBwcmVzZW5jZSAqLwotCQlyZWcgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9TV1NVUFBPUlQwKTsKLQkJaWYgKCByZWcgIT0gSEZBMzg0eF9EUlZSX01BR0lDKSB7Ci0JCQlXTEFOX0xPR19ERUJVRygyLCAiaXJxPSVkLCBubyBtYWdpYy4gIENhcmQgcmVtb3ZlZD8uXG4iLCBpcnEpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiByZWFkIHRoZSBFdlN0YXQgcmVnaXN0ZXIgZm9yIGludGVycnVwdCBlbmFibGVkIGV2ZW50cyAqLwotCQlyZWcgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9FVlNUQVQpOwotCi0JCS8qIEFORCB3aXRoIHRoZSBlbmFibGVkIGludGVycnVwdHMgKi8KLQkJcmVnICY9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X0lOVEVOKTsKLQotCQkvKiBIYW5kbGUgdGhlIGV2ZW50cyAqLwotCQlpZiAoIEhGQTM4NHhfRVZTVEFUX0lTV1RFUlIocmVnKSApewotCQkJV0xBTl9MT0dfRVJST1IoCi0JCQkiRXJyb3I6IFdURVJSIGludGVycnVwdCByZWNlaXZlZCAodW5oYW5kbGVkKS5cbiIpOwotCQkJaGZhMzg0eF9zZXRyZWcoaHcsIEhGQTM4NHhfRVZBQ0tfV1RFUlJfU0VUKDEpLAotCQkJCUhGQTM4NHhfRVZBQ0spOwotCQl9Ci0KLQkJaWYgKCBIRkEzODR4X0VWU1RBVF9JU0lORkRST1AocmVnKSApewotCQkJaGZhMzg0eF9pbnRfaW5mZHJvcCh3bGFuZGV2KTsKLQkJCWhmYTM4NHhfc2V0cmVnKGh3LCBIRkEzODR4X0VWQUNLX0lORkRST1BfU0VUKDEpLAotCQkJCUhGQTM4NHhfRVZBQ0spOwotCQl9Ci0KLQkJaWYgKEhGQTM4NHhfRVZTVEFUX0lTQkFQX09QKHJlZykpIHsKLQkJCS8qIERpc2FibGUgdGhlIEJBUCBpbnRlcnJ1cHRzICovCi0JCQloZmEzODR4X2V2ZW50c19ub2JhcChodyk7Ci0JCQl0YXNrbGV0X3NjaGVkdWxlKCZody0+YmFwX3Rhc2tsZXQpOwotCQl9Ci0KLQkJaWYgKCBIRkEzODR4X0VWU1RBVF9JU0FMTE9DKHJlZykgKXsKLQkJCWhmYTM4NHhfaW50X2FsbG9jKHdsYW5kZXYpOwotCQkJaGZhMzg0eF9zZXRyZWcoaHcsIEhGQTM4NHhfRVZBQ0tfQUxMT0NfU0VUKDEpLAotCQkJCUhGQTM4NHhfRVZBQ0spOwotCQl9Ci0KLQkJaWYgKCBIRkEzODR4X0VWU1RBVF9JU0RUSU0ocmVnKSApewotCQkJaGZhMzg0eF9pbnRfZHRpbSh3bGFuZGV2KTsKLQkJCWhmYTM4NHhfc2V0cmVnKGh3LCBIRkEzODR4X0VWQUNLX0RUSU1fU0VUKDEpLAotCQkJCUhGQTM4NHhfRVZBQ0spOwotCQl9Ci0jaWZkZWYgQ01EX0lSUQotCQlpZiAoIEhGQTM4NHhfRVZTVEFUX0lTQ01EKHJlZykgKXsKLQkJCWhmYTM4NHhfaW50X2NtZCh3bGFuZGV2KTsKLQkJCWhmYTM4NHhfc2V0cmVnKGh3LCBIRkEzODR4X0VWQUNLX0NNRF9TRVQoMSksCi0JCQkJICAgICAgIEhGQTM4NHhfRVZBQ0spOwotCQl9Ci0jZW5kaWYKLQotCQkvKiBhbGxvdyB0aGUgZXZzdGF0IHRvIGJlIHVwZGF0ZWQgYWZ0ZXIgdGhlIGV2YWNrICovCi0JCXVkZWxheSgyMCk7Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLSNpZmRlZiBDTURfSVJRCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9pbnRfY21kCi0qCi0qIEhhbmRsZXMgY29tbWFuZCBjb21wbGV0aW9uIGV2ZW50LgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgotKiBSZXR1cm5zOgotKglub3RoaW5nCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglpbnRlcnJ1cHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBoZmEzODR4X2ludF9jbWQod2xhbmRldmljZV90ICp3bGFuZGV2KQotewotCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlEQkZFTlRFUjsKLQotCS8vIGNoZWNrIHRvIG1ha2Ugc3VyZSBpdCdzIHRoZSByaWdodCBjb21tYW5kPwotCWlmIChody0+Y21kZGF0YSkgewotCQlody0+Y21kZGF0YS0+c3RhdHVzID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfU1RBVFVTKTsKLQkJaHctPmNtZGRhdGEtPnJlc3AwID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfUkVTUDApOwotCQlody0+Y21kZGF0YS0+cmVzcDEgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9SRVNQMSk7Ci0JCWh3LT5jbWRkYXRhLT5yZXNwMiA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X1JFU1AyKTsKLQl9Ci0JaHctPmNtZGZsYWcgPSAxOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAidW0uIGludF9jbWRcbiIpOwotCi0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZody0+Y21kcSk7Ci0KLQkvLyBYWFhYIHBlcmZvcm0gYSBiYXAgY29weSB0b28/Ci0KLQlEQkZFWElUOwotCXJldHVybjsKLX0KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9pbnRfZHRpbQotKgotKiBIYW5kbGVzIHRoZSBEVElNIGVhcmx5IHdhcm5pbmcgZXZlbnQuCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qCi0qIFJldHVybnM6Ci0qCW5vdGhpbmcKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCWludGVycnVwdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdm9pZCBoZmEzODR4X2ludF9kdGltKHdsYW5kZXZpY2VfdCAqd2xhbmRldikKLXsKLSNpZiAwCi0JaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwotI2VuZGlmCi0JREJGRU5URVI7Ci0JcHJpc20yc3RhX2V2X2R0aW0od2xhbmRldik7Ci0JREJGRVhJVDsKLQlyZXR1cm47Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfaW50X2luZmRyb3AKLSoKLSogSGFuZGxlcyB0aGUgSW5mRHJvcCBldmVudC4KLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQl3bGFuIGRldmljZSBzdHJ1Y3R1cmUKLSoKLSogUmV0dXJuczoKLSoJbm90aGluZwotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJaW50ZXJydXB0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyB2b2lkIGhmYTM4NHhfaW50X2luZmRyb3Aod2xhbmRldmljZV90ICp3bGFuZGV2KQotewotI2lmIDAKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0jZW5kaWYKLQlEQkZFTlRFUjsKLQlwcmlzbTJzdGFfZXZfaW5mZHJvcCh3bGFuZGV2KTsKLQlEQkZFWElUOwotCXJldHVybjsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9pbnRfaW5mbwotKgotKiBIYW5kbGVzIHRoZSBJbmZvIGV2ZW50LgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgotKiBSZXR1cm5zOgotKglub3RoaW5nCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKgl0YXNrbGV0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyB2b2lkIGhmYTM4NHhfaW50X2luZm8od2xhbmRldmljZV90ICp3bGFuZGV2KQotewotCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlVSU5UMTYJCQlyZWc7Ci0JaGZhMzg0eF9JbmZGcmFtZV90CWluZjsKLQlpbnQJCQlyZXN1bHQ7Ci0JREJGRU5URVI7Ci0JLyogUmV0cmlldmUgdGhlIEZJRCAqLwotCXJlZyA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X0lORk9GSUQpOwotCi0JLyogUmV0cmlldmUgdGhlIGxlbmd0aCAqLwotCXJlc3VsdCA9IGhmYTM4NHhfY29weV9mcm9tX2JhcCggaHcsCi0JCUhGQTM4NHhfQkFQX0lOVCwgcmVnLCAwLCAmaW5mLmZyYW1lbGVuLCBzaXplb2YoVUlOVDE2KSk7Ci0JaWYgKCByZXN1bHQgKSB7Ci0JCVdMQU5fTE9HX0RFQlVHKDEsCi0JCQkiY29weV9mcm9tX2JhcCgweCUwNHgsIDAsICVkKSBmYWlsZWQsIHJlc3VsdD0weCV4XG4iLAotCQkJcmVnLCBzaXplb2YoaW5mKSwgcmVzdWx0KTsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCWluZi5mcmFtZWxlbiA9IGhmYTM4NHgyaG9zdF8xNihpbmYuZnJhbWVsZW4pOwotCi0JLyogUmV0cmlldmUgdGhlIHJlc3QgKi8KLQlyZXN1bHQgPSBoZmEzODR4X2NvcHlfZnJvbV9iYXAoIGh3LAotCQlIRkEzODR4X0JBUF9JTlQsIHJlZywgc2l6ZW9mKFVJTlQxNiksCi0JCSYoaW5mLmluZm90eXBlKSwgaW5mLmZyYW1lbGVuICogc2l6ZW9mKFVJTlQxNikpOwotCWlmICggcmVzdWx0ICkgewotCQlXTEFOX0xPR19ERUJVRygxLAotCQkJImNvcHlfZnJvbV9iYXAoMHglMDR4LCAwLCAlZCkgZmFpbGVkLCByZXN1bHQ9MHgleFxuIiwKLQkJCXJlZywgc2l6ZW9mKGluZiksIHJlc3VsdCk7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQotCXByaXNtMnN0YV9ldl9pbmZvKHdsYW5kZXYsICZpbmYpOwotZmFpbGVkOgotCURCRkVYSVQ7Ci0JcmV0dXJuOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2ludF90eGV4YwotKgotKiBIYW5kbGVzIHRoZSBUeEV4YyBldmVudC4gIEEgVHJhbnNtaXQgRXhjZXB0aW9uIGV2ZW50IGluZGljYXRlcwotKiB0aGF0IHRoZSBNQUMncyBUWCBwcm9jZXNzIHdhcyB1bnN1Y2Nlc3NmdWwgLSBzbyB0aGUgcGFja2V0IGRpZAotKiBub3QgZ2V0IHRyYW5zbWl0dGVkLgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgotKiBSZXR1cm5zOgotKglub3RoaW5nCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKgl0YXNrbGV0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyB2b2lkIGhmYTM4NHhfaW50X3R4ZXhjKHdsYW5kZXZpY2VfdCAqd2xhbmRldikKLXsKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0JVUlOVDE2CQkJc3RhdHVzOwotCVVJTlQxNgkJCWZpZDsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCURCRkVOVEVSOwotCS8qIENvbGxlY3QgdGhlIHN0YXR1cyBhbmQgZGlzcGxheSAqLwotCWZpZCA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X1RYQ09NUExGSUQpOwotCXJlc3VsdCA9IGhmYTM4NHhfY29weV9mcm9tX2JhcChodywgSEZBMzg0eF9CQVBfSU5ULCBmaWQsIDAsICZzdGF0dXMsIHNpemVvZihzdGF0dXMpKTsKLQlpZiAoIHJlc3VsdCApIHsKLQkJV0xBTl9MT0dfREVCVUcoMSwKLQkJCSJjb3B5X2Zyb21fYmFwKDB4JTA0eCwgMCwgJWQpIGZhaWxlZCwgcmVzdWx0PTB4JXhcbiIsCi0JCQlmaWQsIHNpemVvZihzdGF0dXMpLCByZXN1bHQpOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0Jc3RhdHVzID0gaGZhMzg0eDJob3N0XzE2KHN0YXR1cyk7Ci0JcHJpc20yc3RhX2V2X3R4ZXhjKHdsYW5kZXYsIHN0YXR1cyk7Ci1mYWlsZWQ6Ci0JREJGRVhJVDsKLQlyZXR1cm47Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfaW50X3R4Ci0qCi0qIEhhbmRsZXMgdGhlIFR4IGV2ZW50LgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgotKiBSZXR1cm5zOgotKglub3RoaW5nCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKgl0YXNrbGV0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyB2b2lkIGhmYTM4NHhfaW50X3R4KHdsYW5kZXZpY2VfdCAqd2xhbmRldikKLXsKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0JVUlOVDE2CQkJZmlkOwotCVVJTlQxNgkJCXN0YXR1czsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCURCRkVOVEVSOwotCWZpZCA9IGhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X1RYQ09NUExGSUQpOwotCXJlc3VsdCA9IGhmYTM4NHhfY29weV9mcm9tX2JhcChodywgSEZBMzg0eF9CQVBfSU5ULCBmaWQsIDAsICZzdGF0dXMsIHNpemVvZihzdGF0dXMpKTsKLQlpZiAoIHJlc3VsdCApIHsKLQkJV0xBTl9MT0dfREVCVUcoMSwKLQkJCSJjb3B5X2Zyb21fYmFwKDB4JTA0eCwgMCwgJWQpIGZhaWxlZCwgcmVzdWx0PTB4JXhcbiIsCi0JCQlmaWQsIHNpemVvZihzdGF0dXMpLCByZXN1bHQpOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0Jc3RhdHVzID0gaGZhMzg0eDJob3N0XzE2KHN0YXR1cyk7Ci0JcHJpc20yc3RhX2V2X3R4KHdsYW5kZXYsIHN0YXR1cyk7Ci1mYWlsZWQ6Ci0JREJGRVhJVDsKLQlyZXR1cm47Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2ludF9yeAotKgotKiBIYW5kbGVzIHRoZSBSeCBldmVudC4KLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQl3bGFuIGRldmljZSBzdHJ1Y3R1cmUKLSoKLSogUmV0dXJuczoKLSoJbm90aGluZwotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJdGFza2xldAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdm9pZCBoZmEzODR4X2ludF9yeCh3bGFuZGV2aWNlX3QgKndsYW5kZXYpCi17Ci0JaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwotCVVJTlQxNgkJCXJ4ZmlkOwotCWhmYTM4NHhfcnhfZnJhbWVfdAlyeGRlc2M7Ci0JaW50CQkJcmVzdWx0OwotCWludCAgICAgICAgICAgICAgICAgICAgIGhkcmxlbjsKLQlVSU5UMTYgICAgICAgICAgICAgICAgICBmYzsKLQlwODAyMTFfcnhtZXRhX3QJKnJ4bWV0YTsKLQlzdHJ1Y3Qgc2tfYnVmZiAgICAgICAgICAqc2tiID0gTlVMTDsKLQlVSU5UOCAqZGF0YXA7Ci0KLQlEQkZFTlRFUjsKLQotCS8qIEdldCB0aGUgRklEICovCi0JcnhmaWQgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9SWEZJRCk7Ci0JLyogR2V0IHRoZSBkZXNjcmlwdG9yIChpbmNsdWRpbmcgaGVhZGVycykgKi8KLQlyZXN1bHQgPSBoZmEzODR4X2NvcHlfZnJvbV9iYXAoaHcsCi0JCQlIRkEzODR4X0JBUF9JTlQsCi0JCQlyeGZpZCwKLQkJCTAsCi0JCQkmcnhkZXNjLAotCQkJc2l6ZW9mKHJ4ZGVzYykpOwotCWlmICggcmVzdWx0ICkgewotCQlXTEFOX0xPR19ERUJVRygxLAotCQkJImNvcHlfZnJvbV9iYXAoMHglMDR4LCAlZCwgJWQpIGZhaWxlZCwgcmVzdWx0PTB4JXhcbiIsCi0JCQlyeGZpZCwKLQkJCTAsCi0JCQlzaXplb2YocnhkZXNjKSwKLQkJCXJlc3VsdCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKiBCeXRlIG9yZGVyIGNvbnZlcnQgb25jZSB1cCBmcm9udC4gKi8KLQlyeGRlc2Muc3RhdHVzID0JaGZhMzg0eDJob3N0XzE2KHJ4ZGVzYy5zdGF0dXMpOwotCXJ4ZGVzYy50aW1lID0JaGZhMzg0eDJob3N0XzMyKHJ4ZGVzYy50aW1lKTsKLQotCS8qIGRyb3AgZXJyb3JzIGFuZCB3aGF0bm90IGluIHByb21pc2MgbW9kZSAqLwotCWlmICgoIHdsYW5kZXYtPm5ldGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQyApICYmCi0JICAgIChIRkEzODR4X1JYU1RBVFVTX0lTRkNTRVJSKHJ4ZGVzYy5zdGF0dXMpIHx8Ci0JICAgICBIRkEzODR4X1JYU1RBVFVTX0lTVU5ERUNSKHJ4ZGVzYy5zdGF0dXMpKSkKLQkgIGdvdG8gZG9uZTsKLQotCS8qIE5vdyBoYW5kbGUgZnJhbWUgYmFzZWQgb24gcG9ydCMgKi8KLQlzd2l0Y2goIEhGQTM4NHhfUlhTVEFUVVNfTUFDUE9SVF9HRVQocnhkZXNjLnN0YXR1cykgKQotCXsKLQljYXNlIDA6Ci0KLQkJZmMgPSBpZWVlMmhvc3QxNihyeGRlc2MuZnJhbWVfY29udHJvbCk7Ci0KLQkJLyogSWYgZXhjbHVkZSBhbmQgd2UgcmVjZWl2ZSBhbiB1bmVuY3J5cHRlZCwgZHJvcCBpdCAqLwotCQlpZiAoICh3bGFuZGV2LT5ob3N0d2VwICYgSE9TVFdFUF9FWENMVURFVU5FTkNSWVBURUQpICYmCi0JCSAgICAgIVdMQU5fR0VUX0ZDX0lTV0VQKGZjKSkgewotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJaGRybGVuID0gcDgwMjExX2hlYWRlcmxlbihmYyk7Ci0KLQkJLyogQWxsb2NhdGUgdGhlIGJ1ZmZlciwgbm90ZSBDUkMgKGFrYSBGQ1MpLiBwYmFsbG9jICovCi0JCS8qIGFzc3VtZXMgdGhlcmUgbmVlZHMgdG8gYmUgc3BhY2UgZm9yIG9uZSAqLwotCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGhmYTM4NHgyaG9zdF8xNihyeGRlc2MuZGF0YV9sZW4pICsgaGRybGVuICsgV0xBTl9DUkNfTEVOICsgMik7IC8qIGEgbGl0dGxlIGV4dHJhICovCi0KLQkJaWYgKCAhIHNrYiApIHsKLQkJCVdMQU5fTE9HX0VSUk9SKCJhbGxvY19za2IgZmFpbGVkLlxuIik7Ci0JCQlnb3RvIGRvbmU7Ci0gICAgICAgICAgICAgICAgfQotCi0JCXNrYi0+ZGV2ID0gd2xhbmRldi0+bmV0ZGV2OwotCi0JCS8qIHRoZW9yZXRpY2FsbHkgYWxpZ24gdGhlIElQIGhlYWRlciBvbiBhIDMyLWJpdCB3b3JkLiAqLwotCQlpZiAoIGhkcmxlbiA9PSBXTEFOX0hEUl9BNF9MRU4gKQotCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKLQotCQkvKiBDb3B5IHRoZSA4MDIuMTEgaGRyIHRvIHRoZSBidWZmZXIgKi8KLQkJZGF0YXAgPSBza2JfcHV0KHNrYiwgV0xBTl9IRFJfQTNfTEVOKTsKLQkJbWVtY3B5KGRhdGFwLCAmcnhkZXNjLmZyYW1lX2NvbnRyb2wsIFdMQU5fSERSX0EzX0xFTik7Ci0KLQkJLyogU25hZyB0aGUgQTQgYWRkcmVzcyBpZiBwcmVzZW50ICovCi0JCWlmIChoZHJsZW4gPT0gV0xBTl9IRFJfQTRfTEVOKSB7Ci0JCQlkYXRhcCA9IHNrYl9wdXQoc2tiLCBXTEFOX0FERFJfTEVOKTsKLQkJCW1lbWNweShkYXRhcCwgJnJ4ZGVzYy5hZGRyZXNzNCwgV0xBTl9IRFJfQTNfTEVOKTsKLQkJfQotCi0JCS8qIHdlIGNhbiBjb252ZXJ0IHRoZSBkYXRhX2xlbiBhcyB3ZSBwYXNzZWQgdGhlIG9yaWdpbmFsIG9uICovCi0JCXJ4ZGVzYy5kYXRhX2xlbiA9IGhmYTM4NHgyaG9zdF8xNihyeGRlc2MuZGF0YV9sZW4pOwotCi0JCS8qIENvcHkgdGhlIHBheWxvYWQgZGF0YSB0byB0aGUgYnVmZmVyICovCi0JCWlmICggcnhkZXNjLmRhdGFfbGVuID4gMCApIHsKLQkJCWRhdGFwID0gc2tiX3B1dChza2IsIHJ4ZGVzYy5kYXRhX2xlbik7Ci0JCQlyZXN1bHQgPSBoZmEzODR4X2NvcHlfZnJvbV9iYXAoaHcsCi0JCQkJSEZBMzg0eF9CQVBfSU5ULCByeGZpZCwgSEZBMzg0eF9SWF9EQVRBX09GRiwKLQkJCQlkYXRhcCwgcnhkZXNjLmRhdGFfbGVuKTsKLQkJCWlmICggcmVzdWx0ICkgewotCQkJCVdMQU5fTE9HX0RFQlVHKDEsCi0JCQkJCSJjb3B5X2Zyb21fYmFwKDB4JTA0eCwgJWQsICVkKSBmYWlsZWQsIHJlc3VsdD0weCV4XG4iLAotCQkJCQlyeGZpZCwKLQkJCQkJSEZBMzg0eF9SWF9EQVRBX09GRiwKLQkJCQkJcnhkZXNjLmRhdGFfbGVuLAotCQkJCQlyZXN1bHQpOwotCQkJCWdvdG8gZmFpbGVkOwotCQkJfQotCQl9Ci0JCS8qIHRoZSBwcmlzbTIgY2FyZHMgZG9uJ3QgcmV0dXJuIHRoZSBGQ1MgKi8KLQkJZGF0YXAgPSBza2JfcHV0KHNrYiwgV0xBTl9DUkNfTEVOKTsKLQkJbWVtc2V0IChkYXRhcCwgMHhmZiwgV0xBTl9DUkNfTEVOKTsKLQkJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKLQotCQkvKiBBdHRhY2ggdGhlIHJ4bWV0YSwgc2V0IHNvbWUgc3R1ZmYgKi8KLQkJcDgwMjExc2tiX3J4bWV0YV9hdHRhY2god2xhbmRldiwgc2tiKTsKLQkJcnhtZXRhID0gUDgwMjExU0tCX1JYTUVUQShza2IpOwotCQlyeG1ldGEtPm1hY3RpbWUgPSByeGRlc2MudGltZTsKLQkJcnhtZXRhLT5yeHJhdGUgPSByeGRlc2MucmF0ZTsKLQkJcnhtZXRhLT5zaWduYWwgPSByeGRlc2Muc2lnbmFsIC0gaHctPmRibWFkanVzdDsKLQkJcnhtZXRhLT5ub2lzZSA9IHJ4ZGVzYy5zaWxlbmNlIC0gaHctPmRibWFkanVzdDsKLQotCQlwcmlzbTJzdGFfZXZfcngod2xhbmRldiwgc2tiKTsKLQkJZ290byBkb25lOwotCWNhc2UgNzoKLQotICAgICAgICAJaWYgKCAhIEhGQTM4NHhfUlhTVEFUVVNfSVNGQ1NFUlIocnhkZXNjLnN0YXR1cykgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoZmEzODR4X2ludF9yeG1vbml0b3IoIHdsYW5kZXYsIHJ4ZmlkLCAmcnhkZXNjKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgV0xBTl9MT0dfREVCVUcoMywiUmVjZWl2ZWQgbW9uaXRvciBmcmFtZTogRkNTZXJyIHNldFxuIik7Ci0gICAgICAgICAgICAgICAgfQotCQlnb3RvIGRvbmU7Ci0KLQlkZWZhdWx0OgotCi0JCVdMQU5fTE9HX1dBUk5JTkcoIlJlY2VpdmVkIGZyYW1lIG9uIHVuc3VwcG9ydGVkIHBvcnQ9JWRcbiIsCi0JCQlIRkEzODR4X1JYU1RBVFVTX01BQ1BPUlRfR0VUKHJ4ZGVzYy5zdGF0dXMpICk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLSBmYWlsZWQ6Ci0JZGV2X2tmcmVlX3NrYihza2IpOwotCi0gZG9uZToKLQlEQkZFWElUOwotCXJldHVybjsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9pbnRfcnhtb25pdG9yCi0qCi0qIEhlbHBlciBmdW5jdGlvbiBmb3IgaW50X3J4LiAgSGFuZGxlcyBtb25pdG9yIGZyYW1lcy4KLSogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIHNwYWNlIGZvciB0aGUgRkNTIGFuZCBzZXRzIGl0Ci0qIHRvIDB4ZmZmZmZmZmYuICBUaGUgaGZhMzg0eCBkb2Vzbid0IGdpdmUgdXMgdGhlIEZDUyB2YWx1ZSBidXQgdGhlCi0qIGhpZ2hlciBsYXllcnMgZXhwZWN0IGl0LiAgMHhmZmZmZmZmZiBpcyB1c2VkIGFzIGEgZmxhZyB0byBpbmRpY2F0ZQotKiB0aGUgRkNTIGlzIGJvZ3VzLgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKglyeGZpZAkJcmVjZWl2ZWQgRklECi0qCXJ4ZGVzYwkJcnggZGVzY3JpcHRvciByZWFkIGZyb20gY2FyZCBpbiBpbnRfcngKLSoKLSogUmV0dXJuczoKLSoJbm90aGluZwotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCUFsbG9jYXRlcyBhbiBza2IgYW5kIHBhc3NlcyBpdCB1cCB2aWEgdGhlIFBGX1BBQ0tFVCBpbnRlcmZhY2UuCi0qIENhbGwgY29udGV4dDoKLSoJaW50ZXJydXB0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyB2b2lkIGhmYTM4NHhfaW50X3J4bW9uaXRvciggd2xhbmRldmljZV90ICp3bGFuZGV2LCBVSU5UMTYgcnhmaWQsCi0JCQkJICAgaGZhMzg0eF9yeF9mcmFtZV90ICpyeGRlc2MpCi17Ci0JaGZhMzg0eF90CQkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlVSU5UCQkJCWhkcmxlbiA9IDA7Ci0JVUlOVAkJCQlkYXRhbGVuID0gMDsKLQlVSU5UCQkJCXNrYmxlbiA9IDA7Ci0JVUlOVAkJCQl0cnVuY2F0ZWQgPSAwOwotCVVJTlQ4CQkJCSpkYXRhcDsKLQlVSU5UMTYJCQkJZmM7Ci0Jc3RydWN0IHNrX2J1ZmYJCQkqc2tiOwotCi0JREJGRU5URVI7Ci0JLyogRG9uJ3QgZm9yZ2V0IHRoZSBzdGF0dXMsIHRpbWUsIGFuZCBkYXRhX2xlbiBmaWVsZHMgYXJlIGluIGhvc3Qgb3JkZXIgKi8KLQkvKiBGaWd1cmUgb3V0IGhvdyBiaWcgdGhlIGZyYW1lIGlzICovCi0JZmMgPSBpZWVlMmhvc3QxNihyeGRlc2MtPmZyYW1lX2NvbnRyb2wpOwotCWhkcmxlbiA9IHA4MDIxMV9oZWFkZXJsZW4oZmMpOwotCWRhdGFsZW4gPSBoZmEzODR4Mmhvc3RfMTYocnhkZXNjLT5kYXRhX2xlbik7Ci0KLQkvKiBBbGxvY2F0ZSBhbiBpbmQgbWVzc2FnZStmcmFtZXNpemUgc2tiICovCi0Jc2tibGVuID0gc2l6ZW9mKHA4MDIxMW1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fdCkgKwotCQloZHJsZW4gKyBkYXRhbGVuICsgV0xBTl9DUkNfTEVOOwotCi0JLyogc2FuaXR5IGNoZWNrIHRoZSBsZW5ndGggKi8KLQlpZiAoIHNrYmxlbiA+Ci0JCShzaXplb2YocDgwMjExbXNnX2xueGluZF93bGFuc25pZmZybV90KSArCi0JCVdMQU5fSERSX0E0X0xFTiArIFdMQU5fREFUQV9NQVhMRU4gKyBXTEFOX0NSQ19MRU4pICkgewotCQlXTEFOX0xPR19ERUJVRygxLCAib3ZlcmxlbiBmcm06IGxlbj0lZFxuIiwKLQkJCXNrYmxlbiAtIHNpemVvZihwODAyMTFtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3QpKTsKLQl9Ci0KLQlpZiAoIChza2IgPSBkZXZfYWxsb2Nfc2tiKHNrYmxlbikpID09IE5VTEwgKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCJhbGxvY19za2IgZmFpbGVkIHRyeWluZyB0byBhbGxvY2F0ZSAlZCBieXRlc1xuIiwgc2tibGVuKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIG9ubHkgcHJlcGVuZCB0aGUgcHJpc20gaGVhZGVyIGlmIGluIHRoZSByaWdodCBtb2RlICovCi0JaWYgKCh3bGFuZGV2LT5uZXRkZXYtPnR5cGUgPT0gQVJQSFJEX0lFRUU4MDIxMV9QUklTTSkgJiYKLQkgICAgKGh3LT5zbmlmZmhkciA9PSAwKSkgewotCQlwODAyMTFtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3QJKm1zZzsKLQkJZGF0YXAgPSBza2JfcHV0KHNrYiwgc2l6ZW9mKHA4MDIxMW1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fdCkpOwotCQltc2cgPSAocDgwMjExbXNnX2xueGluZF93bGFuc25pZmZybV90KikgZGF0YXA7Ci0KLQkJLyogSW5pdGlhbGl6ZSB0aGUgbWVzc2FnZSBtZW1iZXJzICovCi0JCW1zZy0+bXNnY29kZSA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm07Ci0JCW1zZy0+bXNnbGVuID0gc2l6ZW9mKHA4MDIxMW1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fdCk7Ci0JCXN0cmNweShtc2ctPmRldm5hbWUsIHdsYW5kZXYtPm5hbWUpOwotCi0JCW1zZy0+aG9zdHRpbWUuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9ob3N0dGltZTsKLQkJbXNnLT5ob3N0dGltZS5zdGF0dXMgPSAwOwotCQltc2ctPmhvc3R0aW1lLmxlbiA9IDQ7Ci0JCW1zZy0+aG9zdHRpbWUuZGF0YSA9IGppZmZpZXM7Ci0KLQkJbXNnLT5tYWN0aW1lLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fbWFjdGltZTsKLQkJbXNnLT5tYWN0aW1lLnN0YXR1cyA9IDA7Ci0JCW1zZy0+bWFjdGltZS5sZW4gPSA0OwotCQltc2ctPm1hY3RpbWUuZGF0YSA9IHJ4ZGVzYy0+dGltZSAqIDEwMDA7Ci0KLQkJbXNnLT5jaGFubmVsLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fY2hhbm5lbDsKLQkJbXNnLT5jaGFubmVsLnN0YXR1cyA9IDA7Ci0JCW1zZy0+Y2hhbm5lbC5sZW4gPSA0OwotCQltc2ctPmNoYW5uZWwuZGF0YSA9IGh3LT5zbmlmZl9jaGFubmVsOwotCi0JCW1zZy0+cnNzaS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3Jzc2k7Ci0JCW1zZy0+cnNzaS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX25vX3ZhbHVlOwotCQltc2ctPnJzc2kubGVuID0gNDsKLQkJbXNnLT5yc3NpLmRhdGEgPSAwOwotCi0JCW1zZy0+c3EuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9zcTsKLQkJbXNnLT5zcS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX25vX3ZhbHVlOwotCQltc2ctPnNxLmxlbiA9IDQ7Ci0JCW1zZy0+c3EuZGF0YSA9IDA7Ci0KLQkJbXNnLT5zaWduYWwuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9zaWduYWw7Ci0JCW1zZy0+c2lnbmFsLnN0YXR1cyA9IDA7Ci0JCW1zZy0+c2lnbmFsLmxlbiA9IDQ7Ci0JCW1zZy0+c2lnbmFsLmRhdGEgPSByeGRlc2MtPnNpZ25hbDsKLQotCQltc2ctPm5vaXNlLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fbm9pc2U7Ci0JCW1zZy0+bm9pc2Uuc3RhdHVzID0gMDsKLQkJbXNnLT5ub2lzZS5sZW4gPSA0OwotCQltc2ctPm5vaXNlLmRhdGEgPSByeGRlc2MtPnNpbGVuY2U7Ci0KLQkJbXNnLT5yYXRlLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fcmF0ZTsKLQkJbXNnLT5yYXRlLnN0YXR1cyA9IDA7Ci0JCW1zZy0+cmF0ZS5sZW4gPSA0OwotCQltc2ctPnJhdGUuZGF0YSA9IHJ4ZGVzYy0+cmF0ZSAvIDU7IC8qIHNldCB0byA4MDIuMTEgdW5pdHMgKi8KLQotCQltc2ctPmlzdHguZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9pc3R4OwotCQltc2ctPmlzdHguc3RhdHVzID0gMDsKLQkJbXNnLT5pc3R4LmxlbiA9IDQ7Ci0JCW1zZy0+aXN0eC5kYXRhID0gUDgwMjExRU5VTV90cnV0aF9mYWxzZTsKLQotCQltc2ctPmZybWxlbi5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2ZybWxlbjsKLQkJbXNnLT5mcm1sZW4uc3RhdHVzID0gMDsKLQkJbXNnLT5mcm1sZW4ubGVuID0gNDsKLQkJbXNnLT5mcm1sZW4uZGF0YSA9IGhkcmxlbiArIGRhdGFsZW4gKyBXTEFOX0NSQ19MRU47Ci0JfSBlbHNlIGlmICgod2xhbmRldi0+bmV0ZGV2LT50eXBlID09IEFSUEhSRF9JRUVFODAyMTFfUFJJU00pICYmCi0JCSAgIChody0+c25pZmZoZHIgIT0gMCkpIHsKLQkJcDgwMjExX2NhcGhkcl90CQkqY2FwaGRyOwotCQkvKiBUaGUgTkVXIGhlYWRlciBmb3JtYXQhICovCi0JCWRhdGFwID0gc2tiX3B1dChza2IsIHNpemVvZihwODAyMTFfY2FwaGRyX3QpKTsKLQkJY2FwaGRyID0gKHA4MDIxMV9jYXBoZHJfdCopIGRhdGFwOwotCi0JCWNhcGhkci0+dmVyc2lvbiA9CWh0b25sKFA4MDIxMUNBUFRVUkVfVkVSU0lPTik7Ci0JCWNhcGhkci0+bGVuZ3RoID0JaHRvbmwoc2l6ZW9mKHA4MDIxMV9jYXBoZHJfdCkpOwotCQljYXBoZHItPm1hY3RpbWUgPQlfX2NwdV90b19iZTY0KHJ4ZGVzYy0+dGltZSk7Ci0JCWNhcGhkci0+aG9zdHRpbWUgPQlfX2NwdV90b19iZTY0KGppZmZpZXMpOwotCQljYXBoZHItPnBoeXR5cGUgPQlodG9ubCg0KTsgLyogZHNzX2RvdDExX2IgKi8KLQkJY2FwaGRyLT5jaGFubmVsID0JaHRvbmwoaHctPnNuaWZmX2NoYW5uZWwpOwotCQljYXBoZHItPmRhdGFyYXRlID0JaHRvbmwocnhkZXNjLT5yYXRlKTsKLQkJY2FwaGRyLT5hbnRlbm5hID0JaHRvbmwoMCk7IC8qIHVua25vd24gKi8KLQkJY2FwaGRyLT5wcmlvcml0eSA9CWh0b25sKDApOyAvKiB1bmtub3duICovCi0JCWNhcGhkci0+c3NpX3R5cGUgPQlodG9ubCgzKTsgLyogcnNzaV9yYXcgKi8KLQkJY2FwaGRyLT5zc2lfc2lnbmFsID0JaHRvbmwocnhkZXNjLT5zaWduYWwpOwotCQljYXBoZHItPnNzaV9ub2lzZSA9CWh0b25sKHJ4ZGVzYy0+c2lsZW5jZSk7Ci0JCWNhcGhkci0+cHJlYW1ibGUgPQlodG9ubCgwKTsgLyogdW5rbm93biAqLwotCQljYXBoZHItPmVuY29kaW5nID0JaHRvbmwoMSk7IC8qIGNjayAqLwotCX0KLQkvKiBDb3B5IHRoZSA4MDIuMTEgaGVhZGVyIHRvIHRoZSBza2IgKGN0bCBmcmFtZXMgbWF5IGJlIGxlc3MgdGhhbiBhIGZ1bGwgaGVhZGVyKSAqLwotCWRhdGFwID0gc2tiX3B1dChza2IsIGhkcmxlbik7Ci0JbWVtY3B5KCBkYXRhcCwgJihyeGRlc2MtPmZyYW1lX2NvbnRyb2wpLCBoZHJsZW4pOwotCi0JLyogSWYgYW55LCBjb3B5IHRoZSBkYXRhIGZyb20gdGhlIGNhcmQgdG8gdGhlIHNrYiAqLwotCWlmICggZGF0YWxlbiA+IDAgKQotCXsKLQkJLyogVHJ1bmNhdGUgdGhlIHBhY2tldCBpZiB0aGUgdXNlciB3YW50cyB1cyB0byAqLwotCQlVSU5UCWRhdGFyZWFkID0gZGF0YWxlbjsKLQkJaWYoaHctPnNuaWZmX3RydW5jYXRlID4gMCAmJiBkYXRhcmVhZCA+IGh3LT5zbmlmZl90cnVuY2F0ZSkgewotCQkJZGF0YXJlYWQgPSBody0+c25pZmZfdHJ1bmNhdGU7Ci0JCQl0cnVuY2F0ZWQgPSAxOwotCQl9Ci0KLQkJZGF0YXAgPSBza2JfcHV0KHNrYiwgZGF0YXJlYWQpOwotCQloZmEzODR4X2NvcHlfZnJvbV9iYXAoaHcsCi0JCQlIRkEzODR4X0JBUF9JTlQsIHJ4ZmlkLCBIRkEzODR4X1JYX0RBVEFfT0ZGLAotCQkJZGF0YXAsIGRhdGFyZWFkKTsKLQotCQkvKiBjaGVjayBmb3IgdW5lbmNyeXB0ZWQgc3R1ZmYgaWYgV0VQIGJpdCBzZXQuICovCi0JCWlmICgqKGRhdGFwIC0gaGRybGVuICsgMSkgJiAweDQwKSAvLyB3ZXAgc2V0Ci0JCSAgaWYgKCgqKGRhdGFwKSA9PSAweGFhKSAmJiAoKihkYXRhcCsxKSA9PSAweGFhKSkKLQkJICAgICooZGF0YXAgLSBoZHJsZW4gKyAxKSAmPSAweGJmOyAvLyBjbGVhciB3ZXA7IGl0J3MgdGhlIDgwMi4yIGhlYWRlciEKLQl9Ci0KLQlpZiAoIXRydW5jYXRlZCAmJiBody0+c25pZmZfZmNzKSB7Ci0JCS8qIFNldCB0aGUgRkNTICovCi0JCWRhdGFwID0gc2tiX3B1dChza2IsIFdMQU5fQ1JDX0xFTik7Ci0JCW1lbXNldCggZGF0YXAsIDB4ZmYsIFdMQU5fQ1JDX0xFTik7Ci0JfQotCi0JLyogcGFzcyBpdCBiYWNrIHVwICovCi0JcHJpc20yc3RhX2V2X3J4KHdsYW5kZXYsIHNrYik7Ci0KLQlEQkZFWElUOwotCXJldHVybjsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfaW50X2FsbG9jCi0qCi0qIEhhbmRsZXMgdGhlIEFsbG9jIGV2ZW50LgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgotKiBSZXR1cm5zOgotKglub3RoaW5nCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglpbnRlcnJ1cHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQgaGZhMzg0eF9pbnRfYWxsb2Mod2xhbmRldmljZV90ICp3bGFuZGV2KQotewotCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlVSU5UMTYJCQlmaWQ7Ci0JSU5UMTYJCQlyZXN1bHQ7Ci0KLQlEQkZFTlRFUjsKLQotCS8qIEhhbmRsZSB0aGUgcmVjbGFpbWVkIEZJRCAqLwotCS8qICAgY29sbGVjdCB0aGUgRklEIGFuZCBwdXNoIGl0IG9udG8gdGhlIHN0YWNrICovCi0JZmlkID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfQUxMT0NGSUQpOwotCi0JaWYgKCBmaWQgIT0gaHctPmluZm9maWQgKSB7IC8qIEl0J3MgYSB0cmFuc21pdCBmaWQgKi8KLQkJV0xBTl9MT0dfREVCVUcoNSwgImludF9hbGxvYyglI3gpXG4iLCBmaWQpOwotCQlyZXN1bHQgPSB0eGZpZF9xdWV1ZV9hZGQoaHcsIGZpZCk7Ci0JCWlmIChyZXN1bHQgIT0gLTEpIHsKLQkJCXByaXNtMnN0YV9ldl9hbGxvYyh3bGFuZGV2KTsKLQkJCVdMQU5fTE9HX0RFQlVHKDUsICJxX2FkZC5cbiIpOwotCQl9IGVsc2UgewotCQkJV0xBTl9MT0dfREVCVUcoNSwgInFfZnVsbC5cbiIpOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogdW5sb2NrIHRoZSBpbmZvIGZpZCAqLwotCQl1cCgmaHctPmluZm9maWRfc2VtKTsKLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybjsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9kcnZyX2hhbmRvdmVyCi0qCi0qIFNlbmRzIGEgaGFuZG92ZXIgbm90aWZpY2F0aW9uIHRvIHRoZSBNQUMuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoJYWRkcgkJYWRkcmVzcyBvZiBzdGF0aW9uIHRoYXQncyBsZWZ0Ci0qCi0qIFJldHVybnM6Ci0qCXplcm8JCXN1Y2Nlc3MuCi0qCS1FUkVTVEFSVFNZUwlyZWNlaXZlZCBzaWduYWwgd2hpbGUgd2FpdGluZyBmb3Igc2VtYXBob3JlLgotKgktRUlPCQlmYWlsZWQgdG8gd3JpdGUgdG8gYmFwLCBvciBmYWlsZWQgaW4gY21kLgotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQsIE5PVEU6IHRoaXMgY2FsbCBtYXkgYmxvY2sgb24gYSBzZW1hcGhvcmUhCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfaGFuZG92ZXIoIGhmYTM4NHhfdCAqaHcsIFVJTlQ4ICphZGRyKQotewotCWludAkJCXJlc3VsdCA9IDA7Ci0gICAgICAgIGhmYTM4NHhfSGFuZG92ZXJBZGRyX3QgIHJlYzsKLSAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgbGVuOwotICAgICAgICBEQkZFTlRFUjsKLQotCS8qIEFjcXVpcmUgdGhlIGluZm9maWQgKi8KLQlpZiAoIGRvd25faW50ZXJydXB0aWJsZSgmaHctPmluZm9maWRfc2VtKSApIHsKLQkJcmVzdWx0ID0gLUVSRVNUQVJUU1lTOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLSAgICAgICAgLyogU2V0IHVwIHRoZSByZWNvcmQgKi8KLSAgICAgICAgbGVuID0gc2l6ZW9mKGhmYTM4NHhfSGFuZG92ZXJBZGRyX3QpOwotICAgICAgICByZWMuZnJhbWVsZW4gPSBob3N0MmhmYTM4NHhfMTYobGVuLzIgLSAxKTsKLSAgICAgICAgcmVjLmluZm90eXBlID0gaG9zdDJoZmEzODR4XzE2KEhGQTM4NHhfSVRfSEFORE9WRVJBRERSKTsKLSAgICAgICAgbWVtY3B5KHJlYy5oYW5kb3Zlcl9hZGRyLCBhZGRyLCBzaXplb2YocmVjLmhhbmRvdmVyX2FkZHIpKTsKLQotICAgICAgICAvKiBJc3N1ZSB0aGUgY29tbWFuZCAqLwotICAgICAgICByZXN1bHQgPSBoZmEzODR4X2NtZF9ub3RpZnkoaHcsIDEsIGh3LT5pbmZvZmlkLCAmcmVjLCBsZW4pOwotCi0gICAgICAgIGlmICggcmVzdWx0ICE9IDAgKSB7Ci0gICAgICAgICAgICAgICAgV0xBTl9MT0dfREVCVUcoMSwiY21kX25vdGlmeSglMDR4KSBmYWlsZWQsIHJlc3VsdD0lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBody0+aW5mb2ZpZCwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gLUVJTzsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgfQotCi1mYWlsZWQ6Ci0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi12b2lkIGhmYTM4NHhfdHhfdGltZW91dCh3bGFuZGV2aWNlX3QgKndsYW5kZXYpCi17Ci0JREJGRU5URVI7Ci0KLQlXTEFOX0xPR19XQVJOSU5HKCJJbXBsZW1lbnQgbWUuXG4iKTsKLQotCURCRkVYSVQ7Ci19Ci0KLS8qIEhhbmRsZXMgYWxsICJyeCIgQkFQIG9wZXJhdGlvbnMgKi8KLXN0YXRpYyB2b2lkICAgICBoZmEzODR4X2JhcF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQloZmEzODR4X3QgKmh3ID0gKGhmYTM4NHhfdCAqKSBkYXRhOwotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IGh3LT53bGFuZGV2OwotCWludCBjb3VudGVyID0gcHJpc20yX2lycV9ldnJlYWRfbWF4OwotCWludAkJCXJlZzsKLQotCURCRkVOVEVSOwotCi0Jd2hpbGUgKGNvdW50ZXItLSA+IDApIHsKLQkJLyogR2V0IGludGVycnVwdCByZWdpc3RlciAqLwotCQlyZWcgPSBoZmEzODR4X2dldHJlZyhodywgSEZBMzg0eF9FVlNUQVQpOwotCi0JCWlmICgocmVnID09IDB4ZmZmZikgfHwKLQkJICAgICEocmVnICYgSEZBMzg0eF9JTlRfQkFQX09QKSkgewotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoIEhGQTM4NHhfRVZTVEFUX0lTSU5GTyhyZWcpICl7Ci0JCQloZmEzODR4X2ludF9pbmZvKHdsYW5kZXYpOwotCQkJaGZhMzg0eF9zZXRyZWcoaHcsIEhGQTM4NHhfRVZBQ0tfSU5GT19TRVQoMSksCi0JCQkJSEZBMzg0eF9FVkFDSyk7Ci0JCX0KLQkJaWYgKCBIRkEzODR4X0VWU1RBVF9JU1RYRVhDKHJlZykgKXsKLQkJCWhmYTM4NHhfaW50X3R4ZXhjKHdsYW5kZXYpOwotCQkJaGZhMzg0eF9zZXRyZWcoaHcsIEhGQTM4NHhfRVZBQ0tfVFhFWENfU0VUKDEpLAotCQkJCUhGQTM4NHhfRVZBQ0spOwotCQl9Ci0JCWlmICggSEZBMzg0eF9FVlNUQVRfSVNUWChyZWcpICl7Ci0JCQloZmEzODR4X2ludF90eCh3bGFuZGV2KTsKLQkJCWhmYTM4NHhfc2V0cmVnKGh3LCBIRkEzODR4X0VWQUNLX1RYX1NFVCgxKSwKLQkJCQlIRkEzODR4X0VWQUNLKTsKLQkJfQotCQlpZiAoIEhGQTM4NHhfRVZTVEFUX0lTUlgocmVnKSApewotCQkJaGZhMzg0eF9pbnRfcngod2xhbmRldik7Ci0JCQloZmEzODR4X3NldHJlZyhodywgSEZBMzg0eF9FVkFDS19SWF9TRVQoMSksCi0JCQkJSEZBMzg0eF9FVkFDSyk7Ci0JCX0KLQl9Ci0KLQkvKiByZS1lbmFibGUgaW50ZXJydXB0cyAqLwotCWhmYTM4NHhfZXZlbnRzX2FsbChodyk7Ci0KLQlEQkZFWElUOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvaGZhMzg0eC5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvaGZhMzg0eC5oCmluZGV4IDBkZmI4Y2UuLjliNzQ2NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2hmYTM4NHguaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9oZmEzODR4LmgKQEAgLTYzLDE4ICs2MywxOCBAQAogCiAvKi0tLS0tLSBDb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyotLS0gTWlucyAmIE1heHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9DTURfQUxMT0NfTEVOX01JTgkoKFVJTlQxNik0KQotI2RlZmluZQkJSEZBMzg0eF9DTURfQUxMT0NfTEVOX01BWAkoKFVJTlQxNikyNDAwKQotI2RlZmluZQkJSEZBMzg0eF9CQVBfREFUQUxFTl9NQVgJCSgoVUlOVDE2KTQwOTYpCi0jZGVmaW5lCQlIRkEzODR4X0JBUF9PRkZTRVRfTUFYCQkoKFVJTlQxNik0MDk2KQotI2RlZmluZQkJSEZBMzg0eF9QT1JUSURfTUFYCQkoKFVJTlQxNik3KQotI2RlZmluZQkJSEZBMzg0eF9OVU1QT1JUU19NQVgJCSgoVUlOVDE2KShIRkEzODR4X1BPUlRJRF9NQVgrMSkpCi0jZGVmaW5lCQlIRkEzODR4X1BEUl9MRU5fTUFYCQkoKFVJTlQxNik1MTIpCS8qIGluIGJ5dGVzLCBmcm9tIEVLICovCi0jZGVmaW5lCQlIRkEzODR4X1BEQV9SRUNTX01BWAkJKChVSU5UMTYpMjAwKQkvKiBhIGd1ZXNzICovCi0jZGVmaW5lCQlIRkEzODR4X1BEQV9MRU5fTUFYCQkoKFVJTlQxNikxMDI0KQkvKiBpbiBieXRlcywgZnJvbSBFSyAqLwotI2RlZmluZQkJSEZBMzg0eF9TQ0FOUkVTVUxUX01BWAkJKChVSU5UMTYpMzEpCi0jZGVmaW5lCQlIRkEzODR4X0hTQ0FOUkVTVUxUX01BWAkJKChVSU5UMTYpMzEpCi0jZGVmaW5lCQlIRkEzODR4X0NISU5GT1JFU1VMVF9NQVgJKChVSU5UMTYpMTYpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9BTExPQ19MRU5fTUlOCSgodTE2KTQpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9BTExPQ19MRU5fTUFYCSgodTE2KTI0MDApCisjZGVmaW5lCQlIRkEzODR4X0JBUF9EQVRBTEVOX01BWAkJKCh1MTYpNDA5NikKKyNkZWZpbmUJCUhGQTM4NHhfQkFQX09GRlNFVF9NQVgJCSgodTE2KTQwOTYpCisjZGVmaW5lCQlIRkEzODR4X1BPUlRJRF9NQVgJCSgodTE2KTcpCisjZGVmaW5lCQlIRkEzODR4X05VTVBPUlRTX01BWAkJKCh1MTYpKEhGQTM4NHhfUE9SVElEX01BWCsxKSkKKyNkZWZpbmUJCUhGQTM4NHhfUERSX0xFTl9NQVgJCSgodTE2KTUxMikJLyogaW4gYnl0ZXMsIGZyb20gRUsgKi8KKyNkZWZpbmUJCUhGQTM4NHhfUERBX1JFQ1NfTUFYCQkoKHUxNikyMDApCS8qIGEgZ3Vlc3MgKi8KKyNkZWZpbmUJCUhGQTM4NHhfUERBX0xFTl9NQVgJCSgodTE2KTEwMjQpCS8qIGluIGJ5dGVzLCBmcm9tIEVLICovCisjZGVmaW5lCQlIRkEzODR4X1NDQU5SRVNVTFRfTUFYCQkoKHUxNikzMSkKKyNkZWZpbmUJCUhGQTM4NHhfSFNDQU5SRVNVTFRfTUFYCQkoKHUxNikzMSkKKyNkZWZpbmUJCUhGQTM4NHhfQ0hJTkZPUkVTVUxUX01BWAkoKHUxNikxNikKICNkZWZpbmUJCUhGQTM4NHhfRFJWUl9GSURTVEFDS0xFTl9NQVgJKDEwKQogI2RlZmluZQkJSEZBMzg0eF9EUlZSX1RYQlVGX01BWAkJKHNpemVvZihoZmEzODR4X3R4X2ZyYW1lX3QpICsgXAogCQkJCQkJV0xBTl9EQVRBX01BWExFTiAtIFwKQEAgLTg4LDQyICs4OCw0MiBAQAogI2RlZmluZQkJSEZBMzg0eF9VU0JfUldNRU1fTUFYTEVOCTIwNDgKIAogLyotLS0gU3VwcG9ydCBDb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9CQVBfUFJPQwkJCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X0JBUF9JTlQJCQkJKChVSU5UMTYpMSkKLSNkZWZpbmUJCUhGQTM4NHhfUE9SVFRZUEVfSUJTUwkJCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1BPUlRUWVBFX0JTUwkJCSgoVUlOVDE2KTEpCi0jZGVmaW5lCQlIRkEzODR4X1BPUlRUWVBFX1dEUwkJCSgoVUlOVDE2KTIpCi0jZGVmaW5lCQlIRkEzODR4X1BPUlRUWVBFX1BTVUVET0lCU1MJCSgoVUlOVDE2KTMpCi0jZGVmaW5lCQlIRkEzODR4X1BPUlRUWVBFX0hPU1RBUCAgICAJCSgoVUlOVDE2KTYpCi0jZGVmaW5lCQlIRkEzODR4X1dFUEZMQUdTX1BSSVZJTlZPS0VECQkoKFVJTlQxNilCSVQwKQotI2RlZmluZQkJSEZBMzg0eF9XRVBGTEFHU19FWENMVURFCQkoKFVJTlQxNilCSVQxKQotI2RlZmluZQkJSEZBMzg0eF9XRVBGTEFHU19ESVNBQkxFX1RYQ1JZUFQJKChVSU5UMTYpQklUNCkKLSNkZWZpbmUJCUhGQTM4NHhfV0VQRkxBR1NfRElTQUJMRV9SWENSWVBUCSgoVUlOVDE2KUJJVDcpCi0jZGVmaW5lCQlIRkEzODR4X1dFUEZMQUdTX0RJU0FMTE9XX01JWEVEIAkoKFVJTlQxNilCSVQxMSkKLSNkZWZpbmUJCUhGQTM4NHhfV0VQRkxBR1NfSVZfSU5URVJWQUwxCQkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9XRVBGTEFHU19JVl9JTlRFUlZBTDEwCQkoKFVJTlQxNilCSVQ1KQotI2RlZmluZQkJSEZBMzg0eF9XRVBGTEFHU19JVl9JTlRFUlZBTDUwCQkoKFVJTlQxNilCSVQ2KQotI2RlZmluZQkJSEZBMzg0eF9XRVBGTEFHU19JVl9JTlRFUlZBTDEwMAkJKChVSU5UMTYpKEJJVDUgfCBCSVQ2KSkKLSNkZWZpbmUJCUhGQTM4NHhfV0VQRkxBR1NfRklSTVdBUkVfV1BBICAJCSgoVUlOVDE2KUJJVDgpCi0jZGVmaW5lCQlIRkEzODR4X1dFUEZMQUdTX0hPU1RfTUlDICAgICAgCQkoKFVJTlQxNilCSVQ5KQotI2RlZmluZSAJSEZBMzg0eF9ST0FNTU9ERV9GV1NDQU5fRldST0FNCQkoKFVJTlQxNikxKQotI2RlZmluZSAJSEZBMzg0eF9ST0FNTU9ERV9GV1NDQU5fSE9TVFJPQU0JKChVSU5UMTYpMikKLSNkZWZpbmUgCUhGQTM4NHhfUk9BTU1PREVfSE9TVFNDQU5fSE9TVFJPQU0JKChVSU5UMTYpMykKLSNkZWZpbmUgCUhGQTM4NHhfUE9SVFNUQVRVU19ESVNBQkxFRAkJKChVSU5UMTYpMSkKLSNkZWZpbmUgCUhGQTM4NHhfUE9SVFNUQVRVU19JTklUU1JDSAkJKChVSU5UMTYpMikKLSNkZWZpbmUgCUhGQTM4NHhfUE9SVFNUQVRVU19DT05OX0lCU1MJCSgoVUlOVDE2KTMpCi0jZGVmaW5lIAlIRkEzODR4X1BPUlRTVEFUVVNfQ09OTl9FU1MJCSgoVUlOVDE2KTQpCi0jZGVmaW5lIAlIRkEzODR4X1BPUlRTVEFUVVNfT09SX0VTUwkJKChVSU5UMTYpNSkKLSNkZWZpbmUgCUhGQTM4NHhfUE9SVFNUQVRVU19DT05OX1dEUwkJKChVSU5UMTYpNikKLSNkZWZpbmUgCUhGQTM4NHhfUE9SVFNUQVRVU19IT1NUQVAJCSgoVUlOVDE2KTgpCi0jZGVmaW5lCQlIRkEzODR4X1JBVEVCSVRfMQkJCSgoVUlOVDE2KTEpCi0jZGVmaW5lCQlIRkEzODR4X1JBVEVCSVRfMgkJCSgoVUlOVDE2KTIpCi0jZGVmaW5lCQlIRkEzODR4X1JBVEVCSVRfNWRvdDUJCQkoKFVJTlQxNik0KQotI2RlZmluZQkJSEZBMzg0eF9SQVRFQklUXzExCQkJKChVSU5UMTYpOCkKKyNkZWZpbmUJCUhGQTM4NHhfQkFQX1BST0MJCQkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9CQVBfaW50CQkJCSgodTE2KTEpCisjZGVmaW5lCQlIRkEzODR4X1BPUlRUWVBFX0lCU1MJCQkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9QT1JUVFlQRV9CU1MJCQkoKHUxNikxKQorI2RlZmluZQkJSEZBMzg0eF9QT1JUVFlQRV9XRFMJCQkoKHUxNikyKQorI2RlZmluZQkJSEZBMzg0eF9QT1JUVFlQRV9QU1VFRE9JQlNTCQkoKHUxNikzKQorI2RlZmluZQkJSEZBMzg0eF9QT1JUVFlQRV9IT1NUQVAgICAgCQkoKHUxNik2KQorI2RlZmluZQkJSEZBMzg0eF9XRVBGTEFHU19QUklWSU5WT0tFRAkJKCh1MTYpQklUMCkKKyNkZWZpbmUJCUhGQTM4NHhfV0VQRkxBR1NfRVhDTFVERQkJKCh1MTYpQklUMSkKKyNkZWZpbmUJCUhGQTM4NHhfV0VQRkxBR1NfRElTQUJMRV9UWENSWVBUCSgodTE2KUJJVDQpCisjZGVmaW5lCQlIRkEzODR4X1dFUEZMQUdTX0RJU0FCTEVfUlhDUllQVAkoKHUxNilCSVQ3KQorI2RlZmluZQkJSEZBMzg0eF9XRVBGTEFHU19ESVNBTExPV19NSVhFRCAJKCh1MTYpQklUMTEpCisjZGVmaW5lCQlIRkEzODR4X1dFUEZMQUdTX0lWX2ludEVSVkFMMQkJKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfV0VQRkxBR1NfSVZfaW50RVJWQUwxMAkJKCh1MTYpQklUNSkKKyNkZWZpbmUJCUhGQTM4NHhfV0VQRkxBR1NfSVZfaW50RVJWQUw1MAkJKCh1MTYpQklUNikKKyNkZWZpbmUJCUhGQTM4NHhfV0VQRkxBR1NfSVZfaW50RVJWQUwxMDAJCSgodTE2KShCSVQ1IHwgQklUNikpCisjZGVmaW5lCQlIRkEzODR4X1dFUEZMQUdTX0ZJUk1XQVJFX1dQQSAgCQkoKHUxNilCSVQ4KQorI2RlZmluZQkJSEZBMzg0eF9XRVBGTEFHU19IT1NUX01JQyAgICAgIAkJKCh1MTYpQklUOSkKKyNkZWZpbmUgCUhGQTM4NHhfUk9BTU1PREVfRldTQ0FOX0ZXUk9BTQkJKCh1MTYpMSkKKyNkZWZpbmUgCUhGQTM4NHhfUk9BTU1PREVfRldTQ0FOX0hPU1RST0FNCSgodTE2KTIpCisjZGVmaW5lIAlIRkEzODR4X1JPQU1NT0RFX0hPU1RTQ0FOX0hPU1RST0FNCSgodTE2KTMpCisjZGVmaW5lIAlIRkEzODR4X1BPUlRTVEFUVVNfRElTQUJMRUQJCSgodTE2KTEpCisjZGVmaW5lIAlIRkEzODR4X1BPUlRTVEFUVVNfSU5JVFNSQ0gJCSgodTE2KTIpCisjZGVmaW5lIAlIRkEzODR4X1BPUlRTVEFUVVNfQ09OTl9JQlNTCQkoKHUxNikzKQorI2RlZmluZSAJSEZBMzg0eF9QT1JUU1RBVFVTX0NPTk5fRVNTCQkoKHUxNik0KQorI2RlZmluZSAJSEZBMzg0eF9QT1JUU1RBVFVTX09PUl9FU1MJCSgodTE2KTUpCisjZGVmaW5lIAlIRkEzODR4X1BPUlRTVEFUVVNfQ09OTl9XRFMJCSgodTE2KTYpCisjZGVmaW5lIAlIRkEzODR4X1BPUlRTVEFUVVNfSE9TVEFQCQkoKHUxNik4KQorI2RlZmluZQkJSEZBMzg0eF9SQVRFQklUXzEJCQkoKHUxNikxKQorI2RlZmluZQkJSEZBMzg0eF9SQVRFQklUXzIJCQkoKHUxNikyKQorI2RlZmluZQkJSEZBMzg0eF9SQVRFQklUXzVkb3Q1CQkJKCh1MTYpNCkKKyNkZWZpbmUJCUhGQTM4NHhfUkFURUJJVF8xMQkJCSgodTE2KTgpCiAKIC8qLS0tIEp1c3Qgc29tZSBzeW1ib2xpYyBuYW1lcyBmb3IgbGVnaWJpbGl0eSAtLS0tLS0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfVFhDTURfTk9SRUNMCQkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9UWENNRF9SRUNMCQkoKFVJTlQxNikxKQorI2RlZmluZQkJSEZBMzg0eF9UWENNRF9OT1JFQ0wJCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1RYQ01EX1JFQ0wJCSgodTE2KTEpCiAKIC8qLS0tIE1BQyBJbnRlcm5hbCBtZW1vcnkgY29uc3RhbnRzIGFuZCBtYWNyb3MgLS0tLS0tKi8KIC8qIG1hc2tzIGFuZCBtYWNyb3MgdXNlZCB0byBtYW5pcHVsYXRlIE1BQyBpbnRlcm5hbCBtZW1vcnkgYWRkcmVzc2VzLiAqLwpAQCAtMTQwLDcgKzE0MCw3IEBACiAgKi8KIAogLyogSGFuZHkgY29uc3RhbnQgKi8KLSNkZWZpbmUJCUhGQTM4NHhfQUREUl9BVVhfT0ZGX01BWAkoKFVJTlQxNikweDAwN2YpCisjZGVmaW5lCQlIRkEzODR4X0FERFJfQVVYX09GRl9NQVgJKCh1MTYpMHgwMDdmKQogCiAvKiBNYXNrIGJpdHMgZm9yIGRpc2NhcmRpbmcgdW53YW50ZWQgcGllY2VzIGluIGEgZmxhdCBhZGRyZXNzICovCiAjZGVmaW5lCQlIRkEzODR4X0FERFJfRkxBVF9BVVhfUEFHRV9NQVNLCSgweDAwN2ZmZjgwKQpAQCAtMTU4LDI1ICsxNTgsMjUgQEAKIAogLyogTWFrZSBhIDMyLWJpdCBmbGF0IGFkZHJlc3MgZnJvbSBBVVggZm9ybWF0IDE2LWJpdCBwYWdlIGFuZCBvZmZzZXQgKi8KICNkZWZpbmUJCUhGQTM4NHhfQUREUl9BVVhfTUtGTEFUKHAsbykJXAotCQkoKChVSU5UMzIpKCgoVUlOVDE2KShwKSkmSEZBMzg0eF9BRERSX0FVWF9QQUdFX01BU0spKSA8PDcpIHwgXAotCQkoKFVJTlQzMikoKChVSU5UMTYpKG8pKSZIRkEzODR4X0FERFJfQVVYX09GRl9NQVNLKSkKKwkJKCgodTMyKSgoKHUxNikocCkpJkhGQTM4NHhfQUREUl9BVVhfUEFHRV9NQVNLKSkgPDw3KSB8IFwKKwkJKCh1MzIpKCgodTE2KShvKSkmSEZBMzg0eF9BRERSX0FVWF9PRkZfTUFTSykpCiAKIC8qIE1ha2UgYSAzMi1iaXQgZmxhdCBhZGRyZXNzIGZyb20gQ01EIGZvcm1hdCAxNi1iaXQgcGFnZSBhbmQgb2Zmc2V0ICovCiAjZGVmaW5lCQlIRkEzODR4X0FERFJfQ01EX01LRkxBVChwLG8pCVwKLQkJKCgoVUlOVDMyKSgoKFVJTlQxNikocCkpJkhGQTM4NHhfQUREUl9DTURfUEFHRV9NQVNLKSkgPDwxNikgfCBcCi0JCSgoVUlOVDMyKSgoKFVJTlQxNikobykpJkhGQTM4NHhfQUREUl9DTURfT0ZGX01BU0spKQorCQkoKCh1MzIpKCgodTE2KShwKSkmSEZBMzg0eF9BRERSX0NNRF9QQUdFX01BU0spKSA8PDE2KSB8IFwKKwkJKCh1MzIpKCgodTE2KShvKSkmSEZBMzg0eF9BRERSX0NNRF9PRkZfTUFTSykpCiAKIC8qIE1ha2UgQVVYIGZvcm1hdCBvZmZzZXQgYW5kIHBhZ2UgZnJvbSBhIDMyLWJpdCBmbGF0IGFkZHJlc3MgKi8KICNkZWZpbmUJCUhGQTM4NHhfQUREUl9BVVhfTUtQQUdFKGYpIFwKLQkJKChVSU5UMTYpKCgoKFVJTlQzMikoZikpJkhGQTM4NHhfQUREUl9GTEFUX0FVWF9QQUdFX01BU0spPj43KSkKKwkJKCh1MTYpKCgoKHUzMikoZikpJkhGQTM4NHhfQUREUl9GTEFUX0FVWF9QQUdFX01BU0spPj43KSkKICNkZWZpbmUJCUhGQTM4NHhfQUREUl9BVVhfTUtPRkYoZikgXAotCQkoKFVJTlQxNikoKChVSU5UMzIpKGYpKSZIRkEzODR4X0FERFJfRkxBVF9BVVhfT0ZGX01BU0spKQorCQkoKHUxNikoKCh1MzIpKGYpKSZIRkEzODR4X0FERFJfRkxBVF9BVVhfT0ZGX01BU0spKQogCiAvKiBNYWtlIENNRCBmb3JtYXQgb2Zmc2V0IGFuZCBwYWdlIGZyb20gYSAzMi1iaXQgZmxhdCBhZGRyZXNzICovCiAjZGVmaW5lCQlIRkEzODR4X0FERFJfQ01EX01LUEFHRShmKSBcCi0JCSgoVUlOVDE2KSgoKChVSU5UMzIpKGYpKSZIRkEzODR4X0FERFJfRkxBVF9DTURfUEFHRV9NQVNLKT4+MTYpKQorCQkoKHUxNikoKCgodTMyKShmKSkmSEZBMzg0eF9BRERSX0ZMQVRfQ01EX1BBR0VfTUFTSyk+PjE2KSkKICNkZWZpbmUJCUhGQTM4NHhfQUREUl9DTURfTUtPRkYoZikgXAotCQkoKFVJTlQxNikoKChVSU5UMzIpKGYpKSZIRkEzODR4X0FERFJfRkxBVF9DTURfT0ZGX01BU0spKQorCQkoKHUxNikoKCh1MzIpKGYpKSZIRkEzODR4X0FERFJfRkxBVF9DTURfT0ZGX01BU0spKQogCiAvKi0tLSBBdXggcmVnaXN0ZXIgbWFza3MvdGVzdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBTb21lIG9mIHRoZSB1cHBlciBiaXRzIG9mIHRoZSBBVVggb2Zmc2V0IHJlZ2lzdGVyIGFyZSB1c2VkIHRvICovCkBAIC0xODgsNyArMTg4LDcgQEAKIAogLyogTWFrZSBBVVggcmVnaXN0ZXIgb2Zmc2V0IGFuZCBwYWdlIHZhbHVlcyBmcm9tIGEgZmxhdCBhZGRyZXNzICovCiAjZGVmaW5lCQlIRkEzODR4X0FVWF9NS09GRihmLCBjKSBcCi0JKEhGQTM4NHhfQUREUl9BVVhfTUtPRkYoZikgfCAoKChVSU5UMTYpKGMpKTw8MTIpKQorCShIRkEzODR4X0FERFJfQVVYX01LT0ZGKGYpIHwgKCgodTE2KShjKSk8PDEyKSkKICNkZWZpbmUJCUhGQTM4NHhfQVVYX01LUEFHRShmKQlIRkEzODR4X0FERFJfQVVYX01LUEFHRShmKQogCiAKQEAgLTIwNSw0MCArMjA1LDYgQEAKICNkZWZpbmUJCUhGQTM4NHhfRExTVEFURV9GTEFTSFdSSVRFUEVORElORwk0CiAjZGVmaW5lCQlIRkEzODR4X0RMU1RBVEVfR0VORVNJUyAJCTUKIAotLyotLS0gUmVnaXN0ZXIgSS9PIG9mZnNldHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmICgoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ01DSUEpIHx8IChXTEFOX0hPU1RJRiA9PSBXTEFOX1BMWCkpCi0KLSNkZWZpbmUJCUhGQTM4NHhfQ01EX09GRgkJCSgweDAwKQotI2RlZmluZQkJSEZBMzg0eF9QQVJBTTBfT0ZGCQkoMHgwMikKLSNkZWZpbmUJCUhGQTM4NHhfUEFSQU0xX09GRgkJKDB4MDQpCi0jZGVmaW5lCQlIRkEzODR4X1BBUkFNMl9PRkYJCSgweDA2KQotI2RlZmluZQkJSEZBMzg0eF9TVEFUVVNfT0ZGCQkoMHgwOCkKLSNkZWZpbmUJCUhGQTM4NHhfUkVTUDBfT0ZGCQkoMHgwQSkKLSNkZWZpbmUJCUhGQTM4NHhfUkVTUDFfT0ZGCQkoMHgwQykKLSNkZWZpbmUJCUhGQTM4NHhfUkVTUDJfT0ZGCQkoMHgwRSkKLSNkZWZpbmUJCUhGQTM4NHhfSU5GT0ZJRF9PRkYJCSgweDEwKQotI2RlZmluZQkJSEZBMzg0eF9SWEZJRF9PRkYJCSgweDIwKQotI2RlZmluZQkJSEZBMzg0eF9BTExPQ0ZJRF9PRkYJCSgweDIyKQotI2RlZmluZQkJSEZBMzg0eF9UWENPTVBMRklEX09GRgkJKDB4MjQpCi0jZGVmaW5lCQlIRkEzODR4X1NFTEVDVDBfT0ZGCQkoMHgxOCkKLSNkZWZpbmUJCUhGQTM4NHhfT0ZGU0VUMF9PRkYJCSgweDFDKQotI2RlZmluZQkJSEZBMzg0eF9EQVRBMF9PRkYJCSgweDM2KQotI2RlZmluZQkJSEZBMzg0eF9TRUxFQ1QxX09GRgkJKDB4MUEpCi0jZGVmaW5lCQlIRkEzODR4X09GRlNFVDFfT0ZGCQkoMHgxRSkKLSNkZWZpbmUJCUhGQTM4NHhfREFUQTFfT0ZGCQkoMHgzOCkKLSNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX09GRgkJKDB4MzApCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX09GRgkJKDB4MzIpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX09GRgkJKDB4MzQpCi0jZGVmaW5lCQlIRkEzODR4X0NPTlRST0xfT0ZGCQkoMHgxNCkKLSNkZWZpbmUJCUhGQTM4NHhfU1dTVVBQT1JUMF9PRkYJCSgweDI4KQotI2RlZmluZQkJSEZBMzg0eF9TV1NVUFBPUlQxX09GRgkJKDB4MkEpCi0jZGVmaW5lCQlIRkEzODR4X1NXU1VQUE9SVDJfT0ZGCQkoMHgyQykKLSNkZWZpbmUJCUhGQTM4NHhfQVVYUEFHRV9PRkYJCSgweDNBKQotI2RlZmluZQkJSEZBMzg0eF9BVVhPRkZTRVRfT0ZGCQkoMHgzQykKLSNkZWZpbmUJCUhGQTM4NHhfQVVYREFUQV9PRkYJCSgweDNFKQotCi0jZWxpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ0kgfHwgV0xBTl9IT1NUSUYgPT0gV0xBTl9VU0IpCi0KICNkZWZpbmUJCUhGQTM4NHhfQ01EX09GRgkJCSgweDAwKQogI2RlZmluZQkJSEZBMzg0eF9QQVJBTTBfT0ZGCQkoMHgwNCkKICNkZWZpbmUJCUhGQTM4NHhfUEFSQU0xX09GRgkJKDB4MDgpCkBAIC0yNTgsNyArMjI0LDcgQEAKICNkZWZpbmUJCUhGQTM4NHhfT0ZGU0VUMV9PRkYJCSgweDNjKQogI2RlZmluZQkJSEZBMzg0eF9EQVRBMV9PRkYJCSgweDcwKQogI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfT0ZGCQkoMHg2MCkKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fT0ZGCQkoMHg2NCkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fT0ZGCQkoMHg2NCkKICNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfT0ZGCQkoMHg2OCkKICNkZWZpbmUJCUhGQTM4NHhfQ09OVFJPTF9PRkYJCSgweDI4KQogI2RlZmluZQkJSEZBMzg0eF9TV1NVUFBPUlQwX09GRgkJKDB4NTApCkBAIC0yNzksOTQgKzI0NSw5MiBAQAogI2RlZmluZQkJSEZBMzg0eF9QQ0lfTTFfTEVOX09GRgkJKDB4YTgpCiAjZGVmaW5lCQlIRkEzODR4X1BDSV9NMV9DVExfT0ZGCQkoMHhhYykKIAotI2VuZGlmCi0KIC8qLS0tIFJlZ2lzdGVyIEZpZWxkIE1hc2tzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfQ01EX0JVU1kJCSgoVUlOVDE2KUJJVDE1KQotI2RlZmluZQkJSEZBMzg0eF9DTURfQUlORk8JCSgoVUlOVDE2KShCSVQxNCB8IEJJVDEzIHwgQklUMTIgfCBCSVQxMSB8IEJJVDEwIHwgQklUOSB8IEJJVDgpKQotI2RlZmluZQkJSEZBMzg0eF9DTURfTUFDUE9SVAkJKChVSU5UMTYpKEJJVDEwIHwgQklUOSB8IEJJVDgpKQotI2RlZmluZQkJSEZBMzg0eF9DTURfUkVDTAkJKChVSU5UMTYpQklUOCkKLSNkZWZpbmUJCUhGQTM4NHhfQ01EX1dSSVRFCQkoKFVJTlQxNilCSVQ4KQotI2RlZmluZQkJSEZBMzg0eF9DTURfUFJPR01PREUJCSgoVUlOVDE2KShCSVQ5IHwgQklUOCkpCi0jZGVmaW5lCQlIRkEzODR4X0NNRF9DTURDT0RFCQkoKFVJTlQxNikoQklUNSB8IEJJVDQgfCBCSVQzIHwgQklUMiB8IEJJVDEgfCBCSVQwKSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX0JVU1kJCSgodTE2KUJJVDE1KQorI2RlZmluZQkJSEZBMzg0eF9DTURfQUlORk8JCSgodTE2KShCSVQxNCB8IEJJVDEzIHwgQklUMTIgfCBCSVQxMSB8IEJJVDEwIHwgQklUOSB8IEJJVDgpKQorI2RlZmluZQkJSEZBMzg0eF9DTURfTUFDUE9SVAkJKCh1MTYpKEJJVDEwIHwgQklUOSB8IEJJVDgpKQorI2RlZmluZQkJSEZBMzg0eF9DTURfUkVDTAkJKCh1MTYpQklUOCkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX1dSSVRFCQkoKHUxNilCSVQ4KQorI2RlZmluZQkJSEZBMzg0eF9DTURfUFJPR01PREUJCSgodTE2KShCSVQ5IHwgQklUOCkpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9DTURDT0RFCQkoKHUxNikoQklUNSB8IEJJVDQgfCBCSVQzIHwgQklUMiB8IEJJVDEgfCBCSVQwKSkKIAotI2RlZmluZQkJSEZBMzg0eF9TVEFUVVNfUkVTVUxUCQkoKFVJTlQxNikoQklUMTQgfCBCSVQxMyB8IEJJVDEyIHwgQklUMTEgfCBCSVQxMCB8IEJJVDkgfCBCSVQ4KSkKLSNkZWZpbmUJCUhGQTM4NHhfU1RBVFVTX0NNRENPREUJCSgoVUlOVDE2KShCSVQ1IHwgQklUNCB8IEJJVDMgfCBCSVQyIHwgQklUMSB8IEJJVDApKQorI2RlZmluZQkJSEZBMzg0eF9TVEFUVVNfUkVTVUxUCQkoKHUxNikoQklUMTQgfCBCSVQxMyB8IEJJVDEyIHwgQklUMTEgfCBCSVQxMCB8IEJJVDkgfCBCSVQ4KSkKKyNkZWZpbmUJCUhGQTM4NHhfU1RBVFVTX0NNRENPREUJCSgodTE2KShCSVQ1IHwgQklUNCB8IEJJVDMgfCBCSVQyIHwgQklUMSB8IEJJVDApKQogCi0jZGVmaW5lCQlIRkEzODR4X09GRlNFVF9CVVNZCQkoKFVJTlQxNilCSVQxNSkKLSNkZWZpbmUJCUhGQTM4NHhfT0ZGU0VUX0VSUgkJKChVSU5UMTYpQklUMTQpCi0jZGVmaW5lCQlIRkEzODR4X09GRlNFVF9EQVRBT0ZGCQkoKFVJTlQxNikoQklUMTEgfCBCSVQxMCB8IEJJVDkgfCBCSVQ4IHwgQklUNyB8IEJJVDYgfCBCSVQ1IHwgQklUNCB8IEJJVDMgfCBCSVQyIHwgQklUMSkpCisjZGVmaW5lCQlIRkEzODR4X09GRlNFVF9CVVNZCQkoKHUxNilCSVQxNSkKKyNkZWZpbmUJCUhGQTM4NHhfT0ZGU0VUX0VSUgkJKCh1MTYpQklUMTQpCisjZGVmaW5lCQlIRkEzODR4X09GRlNFVF9EQVRBT0ZGCQkoKHUxNikoQklUMTEgfCBCSVQxMCB8IEJJVDkgfCBCSVQ4IHwgQklUNyB8IEJJVDYgfCBCSVQ1IHwgQklUNCB8IEJJVDMgfCBCSVQyIHwgQklUMSkpCiAKLSNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX1RJQ0sJCSgoVUlOVDE2KUJJVDE1KQotI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfV1RFUlIJCSgoVUlOVDE2KUJJVDE0KQotI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSU5GRFJPUAkJKChVSU5UMTYpQklUMTMpCi0jZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9JTkZPCQkoKFVJTlQxNilCSVQ3KQotI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfRFRJTQkJKChVSU5UMTYpQklUNSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0NNRAkJKChVSU5UMTYpQklUNCkKLSNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0FMTE9DCQkoKFVJTlQxNilCSVQzKQotI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfVFhFWEMJCSgoVUlOVDE2KUJJVDIpCi0jZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9UWAkJKChVSU5UMTYpQklUMSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX1JYCQkoKFVJTlQxNilCSVQwKQorI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfVElDSwkJKCh1MTYpQklUMTUpCisjZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9XVEVSUgkJKCh1MTYpQklUMTQpCisjZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9JTkZEUk9QCQkoKHUxNilCSVQxMykKKyNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lORk8JCSgodTE2KUJJVDcpCisjZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9EVElNCQkoKHUxNilCSVQ1KQorI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfQ01ECQkoKHUxNilCSVQ0KQorI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfQUxMT0MJCSgodTE2KUJJVDMpCisjZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9UWEVYQwkJKCh1MTYpQklUMikKKyNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX1RYCQkoKHUxNilCSVQxKQorI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfUlgJCSgodTE2KUJJVDApCiAKLSNkZWZpbmUgICAgICAgICBIRkEzODR4X0lOVF9CQVBfT1AgICAgICAgICAgIChIRkEzODR4X0VWU1RBVF9JTkZPfEhGQTM4NHhfRVZTVEFUX1JYfEhGQTM4NHhfRVZTVEFUX1RYfEhGQTM4NHhfRVZTVEFUX1RYRVhDKQorI2RlZmluZSAgICAgICAgIEhGQTM4NHhfaW50X0JBUF9PUCAgICAgICAgICAgKEhGQTM4NHhfRVZTVEFUX0lORk98SEZBMzg0eF9FVlNUQVRfUlh8SEZBMzg0eF9FVlNUQVRfVFh8SEZBMzg0eF9FVlNUQVRfVFhFWEMpCiAKLSNkZWZpbmUgICAgICAgICBIRkEzODR4X0lOVF9OT1JNQUwgICAgICAgICAgIChIRkEzODR4X0VWU1RBVF9JTkZPfEhGQTM4NHhfRVZTVEFUX1JYfEhGQTM4NHhfRVZTVEFUX1RYfEhGQTM4NHhfRVZTVEFUX1RYRVhDfEhGQTM4NHhfRVZTVEFUX0lORkRST1B8SEZBMzg0eF9FVlNUQVRfQUxMT0N8SEZBMzg0eF9FVlNUQVRfRFRJTSkKKyNkZWZpbmUgICAgICAgICBIRkEzODR4X2ludF9OT1JNQUwgICAgICAgICAgIChIRkEzODR4X0VWU1RBVF9JTkZPfEhGQTM4NHhfRVZTVEFUX1JYfEhGQTM4NHhfRVZTVEFUX1RYfEhGQTM4NHhfRVZTVEFUX1RYRVhDfEhGQTM4NHhfRVZTVEFUX0lORkRST1B8SEZBMzg0eF9FVlNUQVRfQUxMT0N8SEZBMzg0eF9FVlNUQVRfRFRJTSkKIAotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9USUNLCQkoKFVJTlQxNilCSVQxNSkKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fV1RFUlIJCSgoVUlOVDE2KUJJVDE0KQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9JTkZEUk9QCQkoKFVJTlQxNilCSVQxMykKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fSU5GTwkJKChVSU5UMTYpQklUNykKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fRFRJTQkJKChVSU5UMTYpQklUNSkKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fQ01ECQkoKFVJTlQxNilCSVQ0KQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9BTExPQwkJKChVSU5UMTYpQklUMykKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fVFhFWEMJCSgoVUlOVDE2KUJJVDIpCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX1RYCQkoKFVJTlQxNilCSVQxKQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9SWAkJKChVSU5UMTYpQklUMCkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fVElDSwkJKCh1MTYpQklUMTUpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX1dURVJSCQkoKHUxNilCSVQxNCkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fSU5GRFJPUAkJKCh1MTYpQklUMTMpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX0lORk8JCSgodTE2KUJJVDcpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX0RUSU0JCSgodTE2KUJJVDUpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX0NNRAkJKCh1MTYpQklUNCkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fQUxMT0MJCSgodTE2KUJJVDMpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX1RYRVhDCQkoKHUxNilCSVQyKQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9UWAkJKCh1MTYpQklUMSkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fUlgJCSgodTE2KUJJVDApCiAKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfVElDSwkJKChVSU5UMTYpQklUMTUpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX1dURVJSCQkoKFVJTlQxNilCSVQxNCkKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSU5GRFJPUAkJKChVSU5UMTYpQklUMTMpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lORk8JCSgoVUlOVDE2KUJJVDcpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX0RUSU0JCSgoVUlOVDE2KUJJVDUpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX0NNRAkJKChVSU5UMTYpQklUNCkKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfQUxMT0MJCSgoVUlOVDE2KUJJVDMpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX1RYRVhDCQkoKFVJTlQxNilCSVQyKQotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19UWAkJKChVSU5UMTYpQklUMSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfUlgJCSgoVUlOVDE2KUJJVDApCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX1RJQ0sJCSgodTE2KUJJVDE1KQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19XVEVSUgkJKCh1MTYpQklUMTQpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lORkRST1AJCSgodTE2KUJJVDEzKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JTkZPCQkoKHUxNilCSVQ3KQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19EVElNCQkoKHUxNilCSVQ1KQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19DTUQJCSgodTE2KUJJVDQpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX0FMTE9DCQkoKHUxNilCSVQzKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19UWEVYQwkJKCh1MTYpQklUMikKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfVFgJCSgodTE2KUJJVDEpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX1JYCQkoKHUxNilCSVQwKQogCi0jZGVmaW5lCQlIRkEzODR4X0NPTlRST0xfQVVYRU4JCSgoVUlOVDE2KShCSVQxNSB8IEJJVDE0KSkKKyNkZWZpbmUJCUhGQTM4NHhfQ09OVFJPTF9BVVhFTgkJKCh1MTYpKEJJVDE1IHwgQklUMTQpKQogCiAKIC8qLS0tIENvbW1hbmQgQ29kZSBDb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyotLS0gQ29udHJvbGxlciBDb21tYW5kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lCQlIRkEzODR4X0NNRENPREVfSU5JVAkJKChVSU5UMTYpMHgwMCkKLSNkZWZpbmUJCUhGQTM4NHhfQ01EQ09ERV9FTkFCTEUJCSgoVUlOVDE2KTB4MDEpCi0jZGVmaW5lCQlIRkEzODR4X0NNRENPREVfRElTQUJMRQkJKChVSU5UMTYpMHgwMikKLSNkZWZpbmUJCUhGQTM4NHhfQ01EQ09ERV9ESUFHCQkoKFVJTlQxNikweDAzKQorI2RlZmluZQkJSEZBMzg0eF9DTURDT0RFX0lOSVQJCSgodTE2KTB4MDApCisjZGVmaW5lCQlIRkEzODR4X0NNRENPREVfRU5BQkxFCQkoKHUxNikweDAxKQorI2RlZmluZQkJSEZBMzg0eF9DTURDT0RFX0RJU0FCTEUJCSgodTE2KTB4MDIpCisjZGVmaW5lCQlIRkEzODR4X0NNRENPREVfRElBRwkJKCh1MTYpMHgwMykKIAogLyotLS0gQnVmZmVyIE1nbXQgQ29tbWFuZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9DTURDT0RFX0FMTE9DCQkoKFVJTlQxNikweDBBKQotI2RlZmluZQkJSEZBMzg0eF9DTURDT0RFX1RYCQkoKFVJTlQxNikweDBCKQotI2RlZmluZQkJSEZBMzg0eF9DTURDT0RFX0NMUlBSU1QJCSgoVUlOVDE2KTB4MTIpCisjZGVmaW5lCQlIRkEzODR4X0NNRENPREVfQUxMT0MJCSgodTE2KTB4MEEpCisjZGVmaW5lCQlIRkEzODR4X0NNRENPREVfVFgJCSgodTE2KTB4MEIpCisjZGVmaW5lCQlIRkEzODR4X0NNRENPREVfQ0xSUFJTVAkJKCh1MTYpMHgxMikKIAogLyotLS0gUmVndWxhdGUgQ29tbWFuZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9DTURDT0RFX05PVElGWQkJKChVSU5UMTYpMHgxMCkKLSNkZWZpbmUJCUhGQTM4NHhfQ01EQ09ERV9JTlEJCSgoVUlOVDE2KTB4MTEpCisjZGVmaW5lCQlIRkEzODR4X0NNRENPREVfTk9USUZZCQkoKHUxNikweDEwKQorI2RlZmluZQkJSEZBMzg0eF9DTURDT0RFX0lOUQkJKCh1MTYpMHgxMSkKIAogLyotLS0gQ29uZmlndXJlIENvbW1hbmRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfQ01EQ09ERV9BQ0NFU1MJCSgoVUlOVDE2KTB4MjEpCi0jZGVmaW5lCQlIRkEzODR4X0NNRENPREVfRE9XTkxECQkoKFVJTlQxNikweDIyKQorI2RlZmluZQkJSEZBMzg0eF9DTURDT0RFX0FDQ0VTUwkJKCh1MTYpMHgyMSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EQ09ERV9ET1dOTEQJCSgodTE2KTB4MjIpCiAKIC8qLS0tIERlYnVnZ2luZyBDb21tYW5kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lIAlIRkEzODR4X0NNRENPREVfTU9OSVRPUgkJKChVSU5UMTYpKDB4MzgpKQotI2RlZmluZQkJSEZBMzg0eF9NT05JVE9SX0VOQUJMRQkJKChVSU5UMTYpKDB4MGIpKQotI2RlZmluZQkJSEZBMzg0eF9NT05JVE9SX0RJU0FCTEUJCSgoVUlOVDE2KSgweDBmKSkKKyNkZWZpbmUgCUhGQTM4NHhfQ01EQ09ERV9NT05JVE9SCQkoKHUxNikoMHgzOCkpCisjZGVmaW5lCQlIRkEzODR4X01PTklUT1JfRU5BQkxFCQkoKHUxNikoMHgwYikpCisjZGVmaW5lCQlIRkEzODR4X01PTklUT1JfRElTQUJMRQkJKCh1MTYpKDB4MGYpKQogCiAvKi0tLSBSZXN1bHQgQ29kZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9TVUNDRVNTCQkJKChVSU5UMTYpKDB4MDApKQotI2RlZmluZQkJSEZBMzg0eF9DQVJEX0ZBSUwJCSgoVUlOVDE2KSgweDAxKSkKLSNkZWZpbmUJCUhGQTM4NHhfTk9fQlVGRgkJCSgoVUlOVDE2KSgweDA1KSkKLSNkZWZpbmUJCUhGQTM4NHhfQ01EX0VSUgkJCSgoVUlOVDE2KSgweDdGKSkKKyNkZWZpbmUJCUhGQTM4NHhfU1VDQ0VTUwkJCSgodTE2KSgweDAwKSkKKyNkZWZpbmUJCUhGQTM4NHhfQ0FSRF9GQUlMCQkoKHUxNikoMHgwMSkpCisjZGVmaW5lCQlIRkEzODR4X05PX0JVRkYJCQkoKHUxNikoMHgwNSkpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9FUlIJCQkoKHUxNikoMHg3RikpCiAKIC8qLS0tIFByb2dyYW1taW5nIE1vZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJTU9ERSAwOiBEaXNhYmxlIHByb2dyYW1taW5nCkBAIC0zNzQsNDggKzMzOCw0OCBAQAogCU1PREUgMjogRW5hYmxlIG5vbi12b2xhdGlsZSBtZW1vcnkgcHJvZ3JhbW1pbmcKIAlNT0RFIDM6IFByb2dyYW0gbm9uLXZvbGF0aWxlIG1lbW9yeSBzZWN0aW9uCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lCQlIRkEzODR4X1BST0dNT0RFX0RJU0FCTEUJKChVSU5UMTYpMHgwMCkKLSNkZWZpbmUJCUhGQTM4NHhfUFJPR01PREVfUkFNCQkoKFVJTlQxNikweDAxKQotI2RlZmluZQkJSEZBMzg0eF9QUk9HTU9ERV9OVgkJKChVSU5UMTYpMHgwMikKLSNkZWZpbmUJCUhGQTM4NHhfUFJPR01PREVfTlZXUklURQkoKFVJTlQxNikweDAzKQorI2RlZmluZQkJSEZBMzg0eF9QUk9HTU9ERV9ESVNBQkxFCSgodTE2KTB4MDApCisjZGVmaW5lCQlIRkEzODR4X1BST0dNT0RFX1JBTQkJKCh1MTYpMHgwMSkKKyNkZWZpbmUJCUhGQTM4NHhfUFJPR01PREVfTlYJCSgodTE2KTB4MDIpCisjZGVmaW5lCQlIRkEzODR4X1BST0dNT0RFX05WV1JJVEUJKCh1MTYpMHgwMykKIAogLyotLS0gQVVYIHJlZ2lzdGVyIGVuYWJsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lCQlIRkEzODR4X0FVWFBXMAkJCSgoVUlOVDE2KTB4ZmUwMSkKLSNkZWZpbmUJCUhGQTM4NHhfQVVYUFcxCQkJKChVSU5UMTYpMHhkYzIzKQotI2RlZmluZQkJSEZBMzg0eF9BVVhQVzIJCQkoKFVJTlQxNikweGJhNDUpCisjZGVmaW5lCQlIRkEzODR4X0FVWFBXMAkJCSgodTE2KTB4ZmUwMSkKKyNkZWZpbmUJCUhGQTM4NHhfQVVYUFcxCQkJKCh1MTYpMHhkYzIzKQorI2RlZmluZQkJSEZBMzg0eF9BVVhQVzIJCQkoKHUxNikweGJhNDUpCiAKLSNkZWZpbmUJCUhGQTM4NHhfQ09OVFJPTF9BVVhfSVNESVNBQkxFRAkoKFVJTlQxNikweDAwMDApCi0jZGVmaW5lCQlIRkEzODR4X0NPTlRST0xfQVVYX0lTRU5BQkxFRAkoKFVJTlQxNikweGMwMDApCi0jZGVmaW5lCQlIRkEzODR4X0NPTlRST0xfQVVYX0RPRU5BQkxFCSgoVUlOVDE2KTB4ODAwMCkKLSNkZWZpbmUJCUhGQTM4NHhfQ09OVFJPTF9BVVhfRE9ESVNBQkxFCSgoVUlOVDE2KTB4NDAwMCkKKyNkZWZpbmUJCUhGQTM4NHhfQ09OVFJPTF9BVVhfSVNESVNBQkxFRAkoKHUxNikweDAwMDApCisjZGVmaW5lCQlIRkEzODR4X0NPTlRST0xfQVVYX0lTRU5BQkxFRAkoKHUxNikweGMwMDApCisjZGVmaW5lCQlIRkEzODR4X0NPTlRST0xfQVVYX0RPRU5BQkxFCSgodTE2KTB4ODAwMCkKKyNkZWZpbmUJCUhGQTM4NHhfQ09OVFJPTF9BVVhfRE9ESVNBQkxFCSgodTE2KTB4NDAwMCkKIAogLyotLS0gUmVjb3JkIElEIENvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBDb25maWd1cmF0aW9uIFJJRHM6IE5ldHdvcmsgUGFyYW1ldGVycywgU3RhdGljIENvbmZpZ3VyYXRpb24gRW50aXRpZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBPUlRUWVBFCQkoKFVJTlQxNikweEZDMDApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05NQUNBRERSCSgoVUlOVDE2KTB4RkMwMSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkRFU0lSRURTU0lECSgoVUlOVDE2KTB4RkMwMikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTkNIQU5ORUwJKChVSU5UMTYpMHhGQzAzKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dOU1NJRAkJKChVSU5UMTYpMHhGQzA0KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dOQVRJTVdJTgkoKFVJTlQxNikweEZDMDUpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZTWVNTQ0FMRQkJKChVSU5UMTYpMHhGQzA2KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GTUFYREFUQUxFTgkoKFVJTlQxNikweEZDMDcpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSCQkoKFVJTlQxNikweEZDMDgpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZQTUVOQUJMRUQJKChVSU5UMTYpMHhGQzA5KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUE1FUFMJCSgoVUlOVDE2KTB4RkMwQSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk1VTFRJQ0FTVFJYCSgoVUlOVDE2KTB4RkMwQikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk1BWFNMRUVQRFVSCSgoVUlOVDE2KTB4RkMwQykKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBNSE9MRERVUgkoKFVJTlQxNikweEZDMEQpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05OQU1FCQkoKFVJTlQxNikweEZDMEUpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05EVElNUEVSCSgoVUlOVDE2KTB4RkMxMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFIxCQkoKFVJTlQxNikweEZDMTEpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSMgkJKChVSU5UMTYpMHhGQzEyKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUjMJCSgoVUlOVDE2KTB4RkMxMykKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFI0CQkoKFVJTlQxNikweEZDMTQpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSNQkJKChVSU5UMTYpMHhGQzE1KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUjYJCSgoVUlOVDE2KTB4RkMxNikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk1DQVNUUE1CVUZGCSgoVUlOVDE2KTB4RkMxNykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBPUlRUWVBFCQkoKHUxNikweEZDMDApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05NQUNBRERSCSgodTE2KTB4RkMwMSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkRFU0lSRURTU0lECSgodTE2KTB4RkMwMikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTkNIQU5ORUwJKCh1MTYpMHhGQzAzKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dOU1NJRAkJKCh1MTYpMHhGQzA0KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dOQVRJTVdJTgkoKHUxNikweEZDMDUpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZTWVNTQ0FMRQkJKCh1MTYpMHhGQzA2KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GTUFYREFUQUxFTgkoKHUxNikweEZDMDcpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSCQkoKHUxNikweEZDMDgpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZQTUVOQUJMRUQJKCh1MTYpMHhGQzA5KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUE1FUFMJCSgodTE2KTB4RkMwQSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk1VTFRJQ0FTVFJYCSgodTE2KTB4RkMwQikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk1BWFNMRUVQRFVSCSgodTE2KTB4RkMwQykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBNSE9MRERVUgkoKHUxNikweEZDMEQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05OQU1FCQkoKHUxNikweEZDMEUpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05EVElNUEVSCSgodTE2KTB4RkMxMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFIxCQkoKHUxNikweEZDMTEpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSMgkJKCh1MTYpMHhGQzEyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUjMJCSgodTE2KTB4RkMxMykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFI0CQkoKHUxNikweEZDMTQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSNQkJKCh1MTYpMHhGQzE1KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUjYJCSgodTE2KTB4RkMxNikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk1DQVNUUE1CVUZGCSgodTE2KTB4RkMxNykKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogQ29uZmlndXJhdGlvbiBSSUQgbGVuZ3RoczogTmV0d29yayBQYXJhbXMsIFN0YXRpYyBDb25maWcgRW50aXRpZXMKQEAgLTQyMyw2MiArMzg3LDYyIEBACiAgIGluY2x1ZGUgdGhlIGxlbiBvciBjb2RlIGZpZWxkcykKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIFRPRE86IGZpbGwgaW4gdGhlIHJlc3Qgb2YgdGhlc2UgKi8KLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBPUlRUWVBFX0xFTgkoKFVJTlQxNikyKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dOTUFDQUREUl9MRU4JKChVSU5UMTYpNikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkRFU0lSRURTU0lEX0xFTgkoKFVJTlQxNikzNCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTkNIQU5ORUxfTEVOCSgoVUlOVDE2KTIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05TU0lEX0xFTgkoKFVJTlQxNikzNCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTkFUSU1XSU5fTEVOCSgoVUlOVDE2KTIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZTWVNTQ0FMRV9MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk1BWERBVEFMRU5fTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSX0xFTgkoKFVJTlQxNik2KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUE1FTkFCTEVEX0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUE1FUFNfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZNVUxUSUNBU1RSWF9MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk1BWFNMRUVQRFVSX0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUE1IT0xERFVSX0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dOTkFNRV9MRU4JKChVSU5UMTYpMzQpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05EVElNUEVSX0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUjFfTEVOCSgoVUlOVDE2KTYpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSMl9MRU4JKChVSU5UMTYpNikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFIzX0xFTgkoKFVJTlQxNik2KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUjRfTEVOCSgoVUlOVDE2KTYpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSNV9MRU4JKChVSU5UMTYpNikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFI2X0xFTgkoKFVJTlQxNik2KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GTUNBU1RQTUJVRkZfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZBVVRIRU5USUNBVElPTl9MRU4gKChVSU5UMTYpc2l6ZW9mKFVJTlQxNikpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZNQVhTTEVFUERVUl9MRU4JKChVSU5UMTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBPUlRUWVBFX0xFTgkoKHUxNikyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dOTUFDQUREUl9MRU4JKCh1MTYpNikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkRFU0lSRURTU0lEX0xFTgkoKHUxNikzNCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTkNIQU5ORUxfTEVOCSgodTE2KTIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05TU0lEX0xFTgkoKHUxNikzNCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTkFUSU1XSU5fTEVOCSgodTE2KTIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZTWVNTQ0FMRV9MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk1BWERBVEFMRU5fTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSX0xFTgkoKHUxNik2KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUE1FTkFCTEVEX0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUE1FUFNfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZNVUxUSUNBU1RSWF9MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk1BWFNMRUVQRFVSX0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUE1IT0xERFVSX0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dOTkFNRV9MRU4JKCh1MTYpMzQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05EVElNUEVSX0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUjFfTEVOCSgodTE2KTYpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSMl9MRU4JKCh1MTYpNikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFIzX0xFTgkoKHUxNik2KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0RTQUREUjRfTEVOCSgodTE2KTYpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRFNBRERSNV9MRU4JKCh1MTYpNikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldEU0FERFI2X0xFTgkoKHUxNik2KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GTUNBU1RQTUJVRkZfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZBVVRIRU5USUNBVElPTl9MRU4gKCh1MTYpc2l6ZW9mKHUxNikpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZNQVhTTEVFUERVUl9MRU4JKCh1MTYpMCkKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogQ29uZmlndXJhdGlvbiBSSURzOiBOZXR3b3JrIFBhcmFtZXRlcnMsIER5bmFtaWMgQ29uZmlndXJhdGlvbiBFbnRpdGllcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9SSURfR1JPVVBBRERSCQkoKFVJTlQxNikweEZDODApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DUkVBVEVJQlNTCQkoKFVJTlQxNikweEZDODEpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNICQkoKFVJTlQxNikweEZDODIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0gJCSgoVUlOVDE2KTB4RkM4MykKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEwJCSgoVUlOVDE2KTB4RkM4NCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1BST01JU0NNT0RFCQkoKFVJTlQxNikweEZDODUpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNIMAkJKChVSU5UMTYpMHhGQzkwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDEJCSgoVUlOVDE2KTB4RkM5MSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0gyCQkoKFVJTlQxNikweEZDOTIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNIMwkJKChVSU5UMTYpMHhGQzkzKQotI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDQJCSgoVUlOVDE2KTB4RkM5NCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0g1CQkoKFVJTlQxNikweEZDOTUpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNINgkJKChVSU5UMTYpMHhGQzk2KQotI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNIMAkJKChVSU5UMTYpMHhGQzk3KQotI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNIMQkJKChVSU5UMTYpMHhGQzk4KQotI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNIMgkJKChVSU5UMTYpMHhGQzk5KQotI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNIMwkJKChVSU5UMTYpMHhGQzlBKQotI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNINAkJKChVSU5UMTYpMHhGQzlCKQotI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNINQkJKChVSU5UMTYpMHhGQzlDKQotI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNINgkJKChVSU5UMTYpMHhGQzlEKQotI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDAJCSgoVUlOVDE2KTB4RkM5RSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEwxCQkoKFVJTlQxNikweEZDOUYpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMMgkJKChVSU5UMTYpMHhGQ0EwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDMJCSgoVUlOVDE2KTB4RkNBMSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEw0CQkoKFVJTlQxNikweEZDQTIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMNQkJKChVSU5UMTYpMHhGQ0EzKQotI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDYJCSgoVUlOVDE2KTB4RkNBNCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0dST1VQQUREUgkJKCh1MTYpMHhGQzgwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1JFQVRFSUJTUwkJKCh1MTYpMHhGQzgxKQorI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSAkJKCh1MTYpMHhGQzgyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNICQkoKHUxNikweEZDODMpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMCQkoKHUxNikweEZDODQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9QUk9NSVNDTU9ERQkJKCh1MTYpMHhGQzg1KQorI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDAJCSgodTE2KTB4RkM5MCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0gxCQkoKHUxNikweEZDOTEpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNIMgkJKCh1MTYpMHhGQzkyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDMJCSgodTE2KTB4RkM5MykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0g0CQkoKHUxNikweEZDOTQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNINQkJKCh1MTYpMHhGQzk1KQorI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDYJCSgodTE2KTB4RkM5NikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDAJCSgodTE2KTB4RkM5NykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDEJCSgodTE2KTB4RkM5OCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDIJCSgodTE2KTB4RkM5OSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDMJCSgodTE2KTB4RkM5QSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDQJCSgodTE2KTB4RkM5QikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDUJCSgodTE2KTB4RkM5QykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDYJCSgodTE2KTB4RkM5RCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEwwCQkoKHUxNikweEZDOUUpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMMQkJKCh1MTYpMHhGQzlGKQorI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDIJCSgodTE2KTB4RkNBMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEwzCQkoKHUxNikweEZDQTEpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMNAkJKCh1MTYpMHhGQ0EyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDUJCSgodTE2KTB4RkNBMykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEw2CQkoKHUxNikweEZDQTQpCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIENvbmZpZ3VyYXRpb24gUklEIExlbmd0aHM6IE5ldHdvcmsgUGFyYW0sIER5bmFtaWMgQ29uZmlnIEVudGl0aWVzCkBAIC00ODYsMjk2ICs0NTAsMjk2IEBACiAgIGluY2x1ZGUgdGhlIGxlbiBvciBjb2RlIGZpZWxkcykKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIFRPRE86IGZpbGwgaW4gdGhlIHJlc3Qgb2YgdGhlc2UgKi8KLSNkZWZpbmUJCUhGQTM4NHhfUklEX0dST1VQQUREUl9MRU4JKChVSU5UMTYpMTYgKiBXTEFOX0FERFJfTEVOKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ1JFQVRFSUJTU19MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0hfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0hfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMX0xFTgkoKFVJTlQxNik0KQotI2RlZmluZQkJSEZBMzg0eF9SSURfUFJPTUlTQ01PREVfTEVOCSgoVUlOVDE2KTIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNIMF9MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0gxX0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDJfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNIM19MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0g0X0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDVfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNINl9MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDBfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0gxX0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNIMl9MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDNfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0g0X0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNINV9MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDZfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMMF9MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEwxX0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDJfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMM19MRU4JKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEw0X0xFTgkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDVfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMNl9MRU4JKChVSU5UMTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0dST1VQQUREUl9MRU4JKCh1MTYpMTYgKiBXTEFOX0FERFJfTEVOKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1JFQVRFSUJTU19MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0hfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0hfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMX0xFTgkoKHUxNik0KQorI2RlZmluZQkJSEZBMzg0eF9SSURfUFJPTUlTQ01PREVfTEVOCSgodTE2KTIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNIMF9MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0gxX0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDJfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNIM19MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0g0X0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfRlJBR1RIUkVTSDVfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNINl9MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDBfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0gxX0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNIMl9MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDNfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0g0X0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfUlRTVEhSRVNINV9MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSDZfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMMF9MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEwxX0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDJfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMM19MRU4JKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1RYUkFURUNOVEw0X0xFTgkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfVFhSQVRFQ05UTDVfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9UWFJBVEVDTlRMNl9MRU4JKCh1MTYpMCkKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogQ29uZmlndXJhdGlvbiBSSURzOiBCZWhhdmlvciBQYXJhbWV0ZXJzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9JVElDS1RJTUUJCSgoVUlOVDE2KTB4RkNFMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0lUSUNLVElNRQkJKCh1MTYpMHhGQ0UwKQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBDb25maWd1cmF0aW9uIFJJRCBMZW5ndGhzOiBCZWhhdmlvciBQYXJhbWV0ZXJzCiAgIFRoaXMgaXMgdGhlIGxlbmd0aCBvZiBKVVNUIHRoZSBEQVRBIHBhcnQgb2YgdGhlIFJJRCAoZG9lcyBub3QKICAgaW5jbHVkZSB0aGUgbGVuIG9yIGNvZGUgZmllbGRzKQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9SSURfSVRJQ0tUSU1FX0xFTgkoKFVJTlQxNikyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfSVRJQ0tUSU1FX0xFTgkoKHUxNikyKQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIEluZm9ybWF0aW9uIFJJRHM6IE5JQyBJbmZvcm1hdGlvbgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9SSURfTUFYTE9BRFRJTUUJCSgoVUlOVDE2KTB4RkQwMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0RPV05MT0FEQlVGRkVSCSgoVUlOVDE2KTB4RkQwMSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1BSSUlERU5USVRZCQkoKFVJTlQxNikweEZEMDIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9QUklTVVBSQU5HRQkJKChVSU5UMTYpMHhGRDAzKQotI2RlZmluZQkJSEZBMzg0eF9SSURfUFJJX0NGSUFDVFJBTkdFUwkoKFVJTlQxNikweEZEMDQpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9OSUNTRVJJQUxOVU1CRVIJKChVSU5UMTYpMHhGRDBBKQotI2RlZmluZQkJSEZBMzg0eF9SSURfTklDSURFTlRJVFkJCSgoVUlOVDE2KTB4RkQwQikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX01GSVNVUFJBTkdFCQkoKFVJTlQxNikweEZEMEMpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DRklTVVBSQU5HRQkJKChVSU5UMTYpMHhGRDBEKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ0hBTk5FTExJU1QJCSgoVUlOVDE2KTB4RkQxMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1JFR1VMQVRPUllET01BSU5TCSgoVUlOVDE2KTB4RkQxMSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1RFTVBUWVBFCQkoKFVJTlQxNikweEZEMTIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DSVMJCQkoKFVJTlQxNikweEZEMTMpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9TVEFJREVOVElUWQkJKChVSU5UMTYpMHhGRDIwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfU1RBU1VQUkFOR0UJCSgoVUlOVDE2KTB4RkQyMSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1NUQV9NRklBQ1RSQU5HRVMJKChVSU5UMTYpMHhGRDIyKQotI2RlZmluZQkJSEZBMzg0eF9SSURfU1RBX0NGSUFDVFJBTkdFUwkoKFVJTlQxNikweEZEMjMpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9CVUlMRFNFUQkJKChVSU5UMTYpMHhGRkZFKQotI2RlZmluZQkJSEZBMzg0eF9SSURfRldJRAkJKChVSU5UMTYpMHhGRkZGKQorI2RlZmluZQkJSEZBMzg0eF9SSURfTUFYTE9BRFRJTUUJCSgodTE2KTB4RkQwMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0RPV05MT0FEQlVGRkVSCSgodTE2KTB4RkQwMSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1BSSUlERU5USVRZCQkoKHUxNikweEZEMDIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9QUklTVVBSQU5HRQkJKCh1MTYpMHhGRDAzKQorI2RlZmluZQkJSEZBMzg0eF9SSURfUFJJX0NGSUFDVFJBTkdFUwkoKHUxNikweEZEMDQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9OSUNTRVJJQUxOVU1CRVIJKCh1MTYpMHhGRDBBKQorI2RlZmluZQkJSEZBMzg0eF9SSURfTklDSURFTlRJVFkJCSgodTE2KTB4RkQwQikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX01GSVNVUFJBTkdFCQkoKHUxNikweEZEMEMpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DRklTVVBSQU5HRQkJKCh1MTYpMHhGRDBEKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ0hBTk5FTExJU1QJCSgodTE2KTB4RkQxMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1JFR1VMQVRPUllET01BSU5TCSgodTE2KTB4RkQxMSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1RFTVBUWVBFCQkoKHUxNikweEZEMTIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DSVMJCQkoKHUxNikweEZEMTMpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9TVEFJREVOVElUWQkJKCh1MTYpMHhGRDIwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfU1RBU1VQUkFOR0UJCSgodTE2KTB4RkQyMSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1NUQV9NRklBQ1RSQU5HRVMJKCh1MTYpMHhGRDIyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfU1RBX0NGSUFDVFJBTkdFUwkoKHUxNikweEZEMjMpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9CVUlMRFNFUQkJKCh1MTYpMHhGRkZFKQorI2RlZmluZQkJSEZBMzg0eF9SSURfRldJRAkJKCh1MTYpMHhGRkZGKQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIEluZm9ybWF0aW9uIFJJRCBMZW5ndGhzOiBOSUMgSW5mb3JtYXRpb24KICAgVGhpcyBpcyB0aGUgbGVuZ3RoIG9mIEpVU1QgdGhlIERBVEEgcGFydCBvZiB0aGUgUklEIChkb2VzIG5vdAogICBpbmNsdWRlIHRoZSBsZW4gb3IgY29kZSBmaWVsZHMpCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9NQVhMT0FEVElNRV9MRU4JCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9ET1dOTE9BREJVRkZFUl9MRU4JCSgoVUlOVDE2KXNpemVvZihoZmEzODR4X2Rvd25sb2FkYnVmZmVyX3QpKQotI2RlZmluZQkJSEZBMzg0eF9SSURfUFJJSURFTlRJVFlfTEVOCQkoKFVJTlQxNik4KQotI2RlZmluZQkJSEZBMzg0eF9SSURfUFJJU1VQUkFOR0VfTEVOCQkoKFVJTlQxNikxMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NGSUFDVFJBTkdFU19MRU4JCSgoVUlOVDE2KTEwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfTklDU0VSSUFMTlVNQkVSX0xFTgkJKChVSU5UMTYpMTIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9OSUNJREVOVElUWV9MRU4JCSgoVUlOVDE2KTgpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9NRklTVVBSQU5HRV9MRU4JCSgoVUlOVDE2KTEwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ0ZJU1VQUkFOR0VfTEVOCQkoKFVJTlQxNikxMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NIQU5ORUxMSVNUX0xFTgkJKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1JFR1VMQVRPUllET01BSU5TX0xFTgkoKFVJTlQxNikxMikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1RFTVBUWVBFX0xFTgkJKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NJU19MRU4JCQkoKFVJTlQxNik0ODApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9TVEFJREVOVElUWV9MRU4JCSgoVUlOVDE2KTgpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9TVEFTVVBSQU5HRV9MRU4JCSgoVUlOVDE2KTEwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfTUZJQUNUUkFOR0VTX0xFTgkJKChVSU5UMTYpMTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DRklBQ1RSQU5HRVMyX0xFTgkJKChVSU5UMTYpMTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9CVUlMRFNFUV9MRU4JCSgoVUlOVDE2KXNpemVvZihoZmEzODR4X0J1aWxkU2VxX3QpKQotI2RlZmluZQkJSEZBMzg0eF9SSURfRldJRF9MRU4JCQkoKFVJTlQxNilzaXplb2YoaGZhMzg0eF9GV0lEX3QpKQorI2RlZmluZQkJSEZBMzg0eF9SSURfTUFYTE9BRFRJTUVfTEVOCQkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfRE9XTkxPQURCVUZGRVJfTEVOCQkoKHUxNilzaXplb2YoaGZhMzg0eF9kb3dubG9hZGJ1ZmZlcl90KSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1BSSUlERU5USVRZX0xFTgkJKCh1MTYpOCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1BSSVNVUFJBTkdFX0xFTgkJKCh1MTYpMTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DRklBQ1RSQU5HRVNfTEVOCQkoKHUxNikxMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX05JQ1NFUklBTE5VTUJFUl9MRU4JCSgodTE2KTEyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfTklDSURFTlRJVFlfTEVOCQkoKHUxNik4KQorI2RlZmluZQkJSEZBMzg0eF9SSURfTUZJU1VQUkFOR0VfTEVOCQkoKHUxNikxMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NGSVNVUFJBTkdFX0xFTgkJKCh1MTYpMTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DSEFOTkVMTElTVF9MRU4JCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9SRUdVTEFUT1JZRE9NQUlOU19MRU4JKCh1MTYpMTIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9URU1QVFlQRV9MRU4JCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DSVNfTEVOCQkJKCh1MTYpNDgwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfU1RBSURFTlRJVFlfTEVOCQkoKHUxNik4KQorI2RlZmluZQkJSEZBMzg0eF9SSURfU1RBU1VQUkFOR0VfTEVOCQkoKHUxNikxMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX01GSUFDVFJBTkdFU19MRU4JCSgodTE2KTEwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ0ZJQUNUUkFOR0VTMl9MRU4JCSgodTE2KTEwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQlVJTERTRVFfTEVOCQkoKHUxNilzaXplb2YoaGZhMzg0eF9CdWlsZFNlcV90KSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0ZXSURfTEVOCQkJKCh1MTYpc2l6ZW9mKGhmYTM4NHhfRldJRF90KSkKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogSW5mb3JtYXRpb24gUklEczogIE1BQyBJbmZvcm1hdGlvbgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9SSURfUE9SVFNUQVRVUwkJKChVSU5UMTYpMHhGRDQwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFNTSUQJCSgoVUlOVDE2KTB4RkQ0MSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRCU1NJRAkoKFVJTlQxNikweEZENDIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DT01NU1FVQUxJVFkJKChVSU5UMTYpMHhGRDQzKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURQkoKFVJTlQxNikweEZENDQpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UQkNOSU5UCSgoVUlOVDE2KTB4RkQ0NSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRTQ0FMRVRIUkVTSAkoKFVJTlQxNikweEZENDYpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9QUk9UT0NPTFJTUFRJTUUJKChVSU5UMTYpMHhGRDQ3KQotI2RlZmluZQkJSEZBMzg0eF9SSURfU0hPUlRSRVRSWUxJTUlUCSgoVUlOVDE2KTB4RkQ0OCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0xPTkdSRVRSWUxJTUlUCSgoVUlOVDE2KTB4RkQ0OSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX01BWFRYTElGRVRJTUUJKChVSU5UMTYpMHhGRDRBKQotI2RlZmluZQkJSEZBMzg0eF9SSURfTUFYUlhMSUZFVElNRQkoKFVJTlQxNikweEZENEIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DRlBPTExBQkxFCQkoKFVJTlQxNikweEZENEMpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9BVVRIQUxHT1JJVEhNUwkoKFVJTlQxNikweEZENEQpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9QUklWQUNZT1BUSU1QCSgoVUlOVDE2KTB4RkQ0RikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0RCTUNPTU1TUVVBTElUWQkoKFVJTlQxNikweEZENTEpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFMQkoKFVJTlQxNikweEZEODApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFMgkoKFVJTlQxNikweEZEODEpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFMwkoKFVJTlQxNikweEZEODIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFNAkoKFVJTlQxNikweEZEODMpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFNQkoKFVJTlQxNikweEZEODQpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFNgkoKFVJTlQxNikweEZEODUpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9PV05NQUNBRERSRVNTCSgoVUlOVDE2KTB4RkQ4NikKLS8vICNkZWZpbmUJSEZBMzg0eF9SSURfUENGSU5GTwkJKChVSU5UMTYpMHhGRDg3KQotI2RlZmluZQkJSEZBMzg0eF9SSURfU0NBTlJFU1VMVFMgICAgICAgCSgoVUlOVDE2KTB4RkQ4OCkgLy8gTkVXCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9IT1NUU0NBTlJFU1VMVFMgICAJKChVSU5UMTYpMHhGRDg5KSAvLyBORVcKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0FVVEhFTlRJQ0FUSU9OVVNFRAkoKFVJTlQxNikweEZEOEEpIC8vIE5FVwotI2RlZmluZQkJSEZBMzg0eF9SSURfQVNTT0NJQVRFRkFJTFVSRSAgCSgoVUlOVDE2KTB4RkQ4RCkgLy8gMS44LjAKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1BPUlRTVEFUVVMJCSgodTE2KTB4RkQ0MCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRTU0lECQkoKHUxNikweEZENDEpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UQlNTSUQJKCh1MTYpMHhGRDQyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ09NTVNRVUFMSVRZCSgodTE2KTB4RkQ0MykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEUJKCh1MTYpMHhGRDQ0KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVEJDTmludAkoKHUxNikweEZENDUpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UU0NBTEVUSFJFU0gJKCh1MTYpMHhGRDQ2KQorI2RlZmluZQkJSEZBMzg0eF9SSURfUFJPVE9DT0xSU1BUSU1FCSgodTE2KTB4RkQ0NykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1NIT1JUUkVUUllMSU1JVAkoKHUxNikweEZENDgpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9MT05HUkVUUllMSU1JVAkoKHUxNikweEZENDkpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9NQVhUWExJRkVUSU1FCSgodTE2KTB4RkQ0QSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX01BWFJYTElGRVRJTUUJKCh1MTYpMHhGRDRCKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ0ZQT0xMQUJMRQkJKCh1MTYpMHhGRDRDKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQVVUSEFMR09SSVRITVMJKCh1MTYpMHhGRDREKQorI2RlZmluZQkJSEZBMzg0eF9SSURfUFJJVkFDWU9QVElNUAkoKHUxNikweEZENEYpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9EQk1DT01NU1FVQUxJVFkJKCh1MTYpMHhGRDUxKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURTEJKCh1MTYpMHhGRDgwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURTIJKCh1MTYpMHhGRDgxKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURTMJKCh1MTYpMHhGRDgyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURTQJKCh1MTYpMHhGRDgzKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURTUJKCh1MTYpMHhGRDg0KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURTYJKCh1MTYpMHhGRDg1KQorI2RlZmluZQkJSEZBMzg0eF9SSURfT1dOTUFDQUREUkVTUwkoKHUxNikweEZEODYpCisvLyAjZGVmaW5lCUhGQTM4NHhfUklEX1BDRklORk8JCSgodTE2KTB4RkQ4NykKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1NDQU5SRVNVTFRTICAgICAgIAkoKHUxNikweEZEODgpIC8vIE5FVworI2RlZmluZQkJSEZBMzg0eF9SSURfSE9TVFNDQU5SRVNVTFRTICAgCSgodTE2KTB4RkQ4OSkgLy8gTkVXCisjZGVmaW5lCQlIRkEzODR4X1JJRF9BVVRIRU5USUNBVElPTlVTRUQJKCh1MTYpMHhGRDhBKSAvLyBORVcKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0FTU09DSUFURUZBSUxVUkUgIAkoKHUxNikweEZEOEQpIC8vIDEuOC4wCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIEluZm9ybWF0aW9uIFJJRCBMZW5ndGhzOiAgTUFDIEluZm9ybWF0aW9uCiAgIFRoaXMgaXMgdGhlIGxlbmd0aCBvZiBKVVNUIHRoZSBEQVRBIHBhcnQgb2YgdGhlIFJJRCAoZG9lcyBub3QKICAgaW5jbHVkZSB0aGUgbGVuIG9yIGNvZGUgZmllbGRzKQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9SSURfUE9SVFNUQVRVU19MRU4JCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UU1NJRF9MRU4JCSgoVUlOVDE2KTM0KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVEJTU0lEX0xFTgkJKChVSU5UMTYpV0xBTl9CU1NJRF9MRU4pCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DT01NU1FVQUxJVFlfTEVOCQkoKFVJTlQxNilzaXplb2YoaGZhMzg0eF9jb21tc3F1YWxpdHlfdCkpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9EQk1DT01NU1FVQUxJVFlfTEVOCQkoKFVJTlQxNilzaXplb2YoaGZhMzg0eF9kYm1jb21tc3F1YWxpdHlfdCkpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFX0xFTgkJKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRCQ05JTlRfTEVOCQkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfU1RBQ1VSU0NBTEVUSFJFU0hfTEVOCSgoVUlOVDE2KTEyKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQVBDVVJTQ0FMRVRIUkVTSF9MRU4JKChVSU5UMTYpNikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1BST1RPQ09MUlNQVElNRV9MRU4JCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9TSE9SVFJFVFJZTElNSVRfTEVOCQkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfTE9OR1JFVFJZTElNSVRfTEVOCQkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfTUFYVFhMSUZFVElNRV9MRU4JCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9NQVhSWExJRkVUSU1FX0xFTgkJKChVSU5UMTYpMCkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NGUE9MTEFCTEVfTEVOCQkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQVVUSEFMR09SSVRITVNfTEVOCQkoKFVJTlQxNik0KQotI2RlZmluZQkJSEZBMzg0eF9SSURfUFJJVkFDWU9QVElNUF9MRU4JCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFMV9MRU4JCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFMl9MRU4JCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFM19MRU4JCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFNF9MRU4JCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFNV9MRU4JCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFNl9MRU4JCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9PV05NQUNBRERSRVNTX0xFTgkJKChVSU5UMTYpNikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1BDRklORk9fTEVOCQkJKChVSU5UMTYpNikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkFQUENGSU5GT19MRU4JCSgoVUlOVDE2KXNpemVvZihoZmEzODR4X1BDRkluZm9fZGF0YV90KSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1NDQU5SRVFVRVNUX0xFTgkJKChVSU5UMTYpc2l6ZW9mKGhmYTM4NHhfU2NhblJlcXVlc3RfZGF0YV90KSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0pPSU5SRVFVRVNUX0xFTgkJKChVSU5UMTYpc2l6ZW9mKGhmYTM4NHhfSm9pblJlcXVlc3RfZGF0YV90KSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0FVVEhFTlRJQ0FURVNUQV9MRU4JCSgoVUlOVDE2KXNpemVvZihoZmEzODR4X2F1dGhlbnRpY2F0ZVN0YXRpb25fZGF0YV90KSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NIQU5ORUxJTkZPUkVRVUVTVF9MRU4JKChVSU5UMTYpc2l6ZW9mKGhmYTM4NHhfQ2hhbm5lbEluZm9SZXF1ZXN0X2RhdGFfdCkpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9QT1JUU1RBVFVTX0xFTgkJKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRTU0lEX0xFTgkJKCh1MTYpMzQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UQlNTSURfTEVOCQkoKHUxNilXTEFOX0JTU0lEX0xFTikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NPTU1TUVVBTElUWV9MRU4JCSgodTE2KXNpemVvZihoZmEzODR4X2NvbW1zcXVhbGl0eV90KSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0RCTUNPTU1TUVVBTElUWV9MRU4JCSgodTE2KXNpemVvZihoZmEzODR4X2RibWNvbW1zcXVhbGl0eV90KSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEVfTEVOCQkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVEJDTmludF9MRU4JCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9TVEFDVVJTQ0FMRVRIUkVTSF9MRU4JKCh1MTYpMTIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9BUENVUlNDQUxFVEhSRVNIX0xFTgkoKHUxNik2KQorI2RlZmluZQkJSEZBMzg0eF9SSURfUFJPVE9DT0xSU1BUSU1FX0xFTgkJKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1NIT1JUUkVUUllMSU1JVF9MRU4JCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9MT05HUkVUUllMSU1JVF9MRU4JCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9NQVhUWExJRkVUSU1FX0xFTgkJKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX01BWFJYTElGRVRJTUVfTEVOCQkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ0ZQT0xMQUJMRV9MRU4JCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9BVVRIQUxHT1JJVEhNU19MRU4JCSgodTE2KTQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9QUklWQUNZT1BUSU1QX0xFTgkJKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEUxX0xFTgkJKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEUyX0xFTgkJKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEUzX0xFTgkJKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEU0X0xFTgkJKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEU1X0xFTgkJKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEU2X0xFTgkJKCh1MTYpMCkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX09XTk1BQ0FERFJFU1NfTEVOCQkoKHUxNik2KQorI2RlZmluZQkJSEZBMzg0eF9SSURfUENGSU5GT19MRU4JCQkoKHUxNik2KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GQVBQQ0ZJTkZPX0xFTgkJKCh1MTYpc2l6ZW9mKGhmYTM4NHhfUENGSW5mb19kYXRhX3QpKQorI2RlZmluZQkJSEZBMzg0eF9SSURfU0NBTlJFUVVFU1RfTEVOCQkoKHUxNilzaXplb2YoaGZhMzg0eF9TY2FuUmVxdWVzdF9kYXRhX3QpKQorI2RlZmluZQkJSEZBMzg0eF9SSURfSk9JTlJFUVVFU1RfTEVOCQkoKHUxNilzaXplb2YoaGZhMzg0eF9Kb2luUmVxdWVzdF9kYXRhX3QpKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQVVUSEVOVElDQVRFU1RBX0xFTgkJKCh1MTYpc2l6ZW9mKGhmYTM4NHhfYXV0aGVudGljYXRlU3RhdGlvbl9kYXRhX3QpKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ0hBTk5FTElORk9SRVFVRVNUX0xFTgkoKHUxNilzaXplb2YoaGZhMzg0eF9DaGFubmVsSW5mb1JlcXVlc3RfZGF0YV90KSkKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIEluZm9ybWF0aW9uIFJJRHM6ICBNb2RlbSBJbmZvcm1hdGlvbgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9SSURfUEhZVFlQRQkJKChVSU5UMTYpMHhGREMwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVENIQU5ORUwJKChVSU5UMTYpMHhGREMxKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFBPV0VSU1RBVEUJKChVSU5UMTYpMHhGREMyKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ0NBTU9ERQkJKChVSU5UMTYpMHhGREMzKQotI2RlZmluZQkJSEZBMzg0eF9SSURfU1VQUE9SVEVEREFUQVJBVEVTCSgoVUlOVDE2KTB4RkRDNikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0xGT1NUQVRVUyAgICAgICAgICAgKChVSU5UMTYpMHhGREM3KSAvLyAxLjcuMQorI2RlZmluZQkJSEZBMzg0eF9SSURfUEhZVFlQRQkJKCh1MTYpMHhGREMwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVENIQU5ORUwJKCh1MTYpMHhGREMxKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFBPV0VSU1RBVEUJKCh1MTYpMHhGREMyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ0NBTU9ERQkJKCh1MTYpMHhGREMzKQorI2RlZmluZQkJSEZBMzg0eF9SSURfU1VQUE9SVEVEREFUQVJBVEVTCSgodTE2KTB4RkRDNikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0xGT1NUQVRVUyAgICAgICAgICAgKCh1MTYpMHhGREM3KSAvLyAxLjcuMQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBJbmZvcm1hdGlvbiBSSUQgTGVuZ3RoczogIE1vZGVtIEluZm9ybWF0aW9uCiAgIFRoaXMgaXMgdGhlIGxlbmd0aCBvZiBKVVNUIHRoZSBEQVRBIHBhcnQgb2YgdGhlIFJJRCAoZG9lcyBub3QKICAgaW5jbHVkZSB0aGUgbGVuIG9yIGNvZGUgZmllbGRzKQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9SSURfUEhZVFlQRV9MRU4JCQkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVENIQU5ORUxfTEVOCQkoKFVJTlQxNikwKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFBPV0VSU1RBVEVfTEVOCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DQ0FNT0RFX0xFTgkJCSgoVUlOVDE2KTApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9TVVBQT1JURUREQVRBUkFURVNfTEVOCSgoVUlOVDE2KTEwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfUEhZVFlQRV9MRU4JCQkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVENIQU5ORUxfTEVOCQkoKHUxNikwKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVFBPV0VSU1RBVEVfTEVOCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DQ0FNT0RFX0xFTgkJCSgodTE2KTApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9TVVBQT1JURUREQVRBUkFURVNfTEVOCSgodTE2KTEwKQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBBUEkgRU5IQU5DRU1FTlRTIChOT1QgQUxSRUFEWSBJTVBMRU1FTlRFRCkKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVlJRAkoKFVJTlQxNikweEZDMjMpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZMAkoKFVJTlQxNikweEZDMjQpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZMQkoKFVJTlQxNikweEZDMjUpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZMgkoKFVJTlQxNikweEZDMjYpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZMwkoKFVJTlQxNikweEZDMjcpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRVBGTEFHUwkJKChVSU5UMTYpMHhGQzI4KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0VQS0VZTUFQVEFCTEUJKChVSU5UMTYpMHhGQzI5KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GQVVUSEVOVElDQVRJT04JKChVSU5UMTYpMHhGQzJBKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GTUFYQVNTT0NTVEFUSU9OUwkoKFVJTlQxNikweEZDMkIpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZUWENPTlRST0wJKChVSU5UMTYpMHhGQzJDKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUk9BTUlOR01PREUJKChVSU5UMTYpMHhGQzJEKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GSE9TVEFVVEhBU1NPQwkoKFVJTlQxNikweEZDMkUpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZSQ1ZDUkNFUlJPUgkoKFVJTlQxNikweEZDMzApCi0vLyAjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZNTUxJRkUJCSgoVUlOVDE2KTB4RkMzMSkKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkFMVFJFVFJZQ05UCSgoVUlOVDE2KTB4RkMzMikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkFQQkNOSU5UCQkoKFVJTlQxNikweEZDMzMpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZBUFBDRklORk8JKChVSU5UMTYpMHhGQzM0KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GU1RBUENGSU5GTwkoKFVJTlQxNikweEZDMzUpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZQUklPUklUWVFVU0FHRQkoKFVJTlQxNikweEZDMzcpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZUSU1DVFJMCQkoKFVJTlQxNikweEZDNDApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZUSElSVFkyVEFMTFkJKChVSU5UMTYpMHhGQzQyKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GRU5IU0VDVVJJVFkJKChVSU5UMTYpMHhGQzQzKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GREJNQURKVVNUICAJKChVSU5UMTYpMHhGQzQ2KSAvLyBORVcKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldQQURBVEEgICAgICAgCSgoVUlOVDE2KTB4RkM0OCkgLy8gMS43LjAKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBST1BPR0FUSU9OREVMQVkJKChVSU5UMTYpMHhGQzQ5KSAvLyAxLjcuNgotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GU0hPUlRQUkVBTUJMRQkoKFVJTlQxNikweEZDQjApCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZFWENMT05HUFJFQU1CTEUJKChVSU5UMTYpMHhGQ0IxKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GQVVUSFJTUFRJTUVPVVQJKChVSU5UMTYpMHhGQ0IyKQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GQkFTSUNSQVRFUwkoKFVJTlQxNikweEZDQjMpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZTVVBQUkFURVMJKChVSU5UMTYpMHhGQ0I0KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GRkFMTEJBQ0tDVFJMCSgoVUlOVDE2KTB4RkNCNSkgLy8gTkVXCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9XRVBLRVlTVEFUVVMgICAJKChVSU5UMTYpMHhGQ0I2KSAvLyBORVcKLSNkZWZpbmUJCUhGQTM4NHhfUklEX1dFUEtFWU1BUElOREVYIAkoKFVJTlQxNikweEZDQjcpIC8vIE5FVwotI2RlZmluZQkJSEZBMzg0eF9SSURfQlJPQURDQVNUS0VZSUQgCSgoVUlOVDE2KTB4RkNCOCkgLy8gTkVXCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9FTlRTRUNGTEFHRVlJRCAJKChVSU5UMTYpMHhGQ0I5KSAvLyBORVcKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBBU1NJVkVTQ0FOQ1RSTAkoKFVJTlQxNikweEZDQkEpIC8vIE5FVyBTVEEKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldQQUhBTkRMSU5HCSgoVUlOVDE2KTB4RkNCQikgLy8gMS43LjAKLSNkZWZpbmUJCUhGQTM4NHhfUklEX01EQ0NPTlRST0wgICAgICAgIAkoKFVJTlQxNikweEZDQkMpIC8vIDEuNy4wLzEuNC4wCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9NRENDT1VOVFJZICAgICAgICAJKChVSU5UMTYpMHhGQ0JEKSAvLyAxLjcuMC8xLjQuMAotI2RlZmluZQkJSEZBMzg0eF9SSURfVFhQT1dFUk1BWCAgICAgICAgCSgoVUlOVDE2KTB4RkNCRSkgLy8gMS43LjAvMS40LjAKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkxGT0VOQkxFRCAgICAgIAkoKFVJTlQxNikweEZDQkYpIC8vIDEuNi4zCi0jZGVmaW5lICAgICAgICAgSEZBMzg0eF9SSURfQ0FQSU5GTyAgICAgICAgICAgICAoKFVJTlQxNikweEZDQzApIC8vIDEuNy4wLzEuMy43Ci0jZGVmaW5lICAgICAgICAgSEZBMzg0eF9SSURfTElTVEVOSU5URVJWQUwgICAgICAoKFVJTlQxNikweEZDQzEpIC8vIDEuNy4wLzEuMy43Ci0jZGVmaW5lICAgICAgICAgSEZBMzg0eF9SSURfRElWRVJTSVRZRU5BQkxFRCAgICAoKFVJTlQxNikweEZDQzIpIC8vIDEuNy4wLzEuMy43Ci0jZGVmaW5lICAgICAgICAgSEZBMzg0eF9SSURfTEVEX0NPTlRST0wgICAgICAgICAoKFVJTlQxNikweEZDQzQpIC8vIDEuNy42Ci0jZGVmaW5lICAgICAgICAgSEZBMzg0eF9SSURfSEZPX0RFTEFZICAgICAgICAgICAoKFVJTlQxNikweEZDQzUpIC8vIDEuNy42Ci0jZGVmaW5lICAgICAgICAgSEZBMzg0eF9SSURfRElTU0FMT1dFREJTU0lEICAgICAoKFVJTlQxNikweEZDQzYpIC8vIDEuOC4wCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9TQ0FOUkVRVUVTVAkJKChVSU5UMTYpMHhGQ0UxKQotI2RlZmluZQkJSEZBMzg0eF9SSURfSk9JTlJFUVVFU1QJCSgoVUlOVDE2KTB4RkNFMikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0FVVEhFTlRJQ0FURVNUQQkoKFVJTlQxNikweEZDRTMpCi0jZGVmaW5lCQlIRkEzODR4X1JJRF9DSEFOTkVMSU5GT1JFUVVFU1QJKChVSU5UMTYpMHhGQ0U0KQotI2RlZmluZQkJSEZBMzg0eF9SSURfSE9TVFNDQU4gICAgICAgICAgCSgoVUlOVDE2KTB4RkNFNSkgLy8gTkVXIFNUQQotI2RlZmluZQkJSEZBMzg0eF9SSURfQVNTT0NJQVRFU1RBCSgoVUlOVDE2KTB4RkNFNikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVlJRAkoKHUxNikweEZDMjMpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZMAkoKHUxNikweEZDMjQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZMQkoKHUxNikweEZDMjUpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZMgkoKHUxNikweEZDMjYpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZMwkoKHUxNikweEZDMjcpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRVBGTEFHUwkJKCh1MTYpMHhGQzI4KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0VQS0VZTUFQVEFCTEUJKCh1MTYpMHhGQzI5KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GQVVUSEVOVElDQVRJT04JKCh1MTYpMHhGQzJBKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GTUFYQVNTT0NTVEFUSU9OUwkoKHUxNikweEZDMkIpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZUWENPTlRST0wJKCh1MTYpMHhGQzJDKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUk9BTUlOR01PREUJKCh1MTYpMHhGQzJEKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GSE9TVEFVVEhBU1NPQwkoKHUxNikweEZDMkUpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZSQ1ZDUkNFUlJPUgkoKHUxNikweEZDMzApCisvLyAjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZNTUxJRkUJCSgodTE2KTB4RkMzMSkKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkFMVFJFVFJZQ05UCSgodTE2KTB4RkMzMikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkFQQkNOaW50CQkoKHUxNikweEZDMzMpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZBUFBDRklORk8JKCh1MTYpMHhGQzM0KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GU1RBUENGSU5GTwkoKHUxNikweEZDMzUpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZQUklPUklUWVFVU0FHRQkoKHUxNikweEZDMzcpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZUSU1DVFJMCQkoKHUxNikweEZDNDApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZUSElSVFkyVEFMTFkJKCh1MTYpMHhGQzQyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GRU5IU0VDVVJJVFkJKCh1MTYpMHhGQzQzKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GREJNQURKVVNUICAJKCh1MTYpMHhGQzQ2KSAvLyBORVcKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldQQURBVEEgICAgICAgCSgodTE2KTB4RkM0OCkgLy8gMS43LjAKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBST1BPR0FUSU9OREVMQVkJKCh1MTYpMHhGQzQ5KSAvLyAxLjcuNgorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GU0hPUlRQUkVBTUJMRQkoKHUxNikweEZDQjApCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZFWENMT05HUFJFQU1CTEUJKCh1MTYpMHhGQ0IxKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GQVVUSFJTUFRJTUVPVVQJKCh1MTYpMHhGQ0IyKQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GQkFTSUNSQVRFUwkoKHUxNikweEZDQjMpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZTVVBQUkFURVMJKCh1MTYpMHhGQ0I0KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GRkFMTEJBQ0tDVFJMCSgodTE2KTB4RkNCNSkgLy8gTkVXCisjZGVmaW5lCQlIRkEzODR4X1JJRF9XRVBLRVlTVEFUVVMgICAJKCh1MTYpMHhGQ0I2KSAvLyBORVcKKyNkZWZpbmUJCUhGQTM4NHhfUklEX1dFUEtFWU1BUElOREVYIAkoKHUxNikweEZDQjcpIC8vIE5FVworI2RlZmluZQkJSEZBMzg0eF9SSURfQlJPQURDQVNUS0VZSUQgCSgodTE2KTB4RkNCOCkgLy8gTkVXCisjZGVmaW5lCQlIRkEzODR4X1JJRF9FTlRTRUNGTEFHRVlJRCAJKCh1MTYpMHhGQ0I5KSAvLyBORVcKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORlBBU1NJVkVTQ0FOQ1RSTAkoKHUxNikweEZDQkEpIC8vIE5FVyBTVEEKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldQQUhBTkRMSU5HCSgodTE2KTB4RkNCQikgLy8gMS43LjAKKyNkZWZpbmUJCUhGQTM4NHhfUklEX01EQ0NPTlRST0wgICAgICAgIAkoKHUxNikweEZDQkMpIC8vIDEuNy4wLzEuNC4wCisjZGVmaW5lCQlIRkEzODR4X1JJRF9NRENDT1VOVFJZICAgICAgICAJKCh1MTYpMHhGQ0JEKSAvLyAxLjcuMC8xLjQuMAorI2RlZmluZQkJSEZBMzg0eF9SSURfVFhQT1dFUk1BWCAgICAgICAgCSgodTE2KTB4RkNCRSkgLy8gMS43LjAvMS40LjAKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkxGT0VOQkxFRCAgICAgIAkoKHUxNikweEZDQkYpIC8vIDEuNi4zCisjZGVmaW5lICAgICAgICAgSEZBMzg0eF9SSURfQ0FQSU5GTyAgICAgICAgICAgICAoKHUxNikweEZDQzApIC8vIDEuNy4wLzEuMy43CisjZGVmaW5lICAgICAgICAgSEZBMzg0eF9SSURfTElTVEVOaW50RVJWQUwgICAgICAoKHUxNikweEZDQzEpIC8vIDEuNy4wLzEuMy43CisjZGVmaW5lICAgICAgICAgSEZBMzg0eF9SSURfRElWRVJTSVRZRU5BQkxFRCAgICAoKHUxNikweEZDQzIpIC8vIDEuNy4wLzEuMy43CisjZGVmaW5lICAgICAgICAgSEZBMzg0eF9SSURfTEVEX0NPTlRST0wgICAgICAgICAoKHUxNikweEZDQzQpIC8vIDEuNy42CisjZGVmaW5lICAgICAgICAgSEZBMzg0eF9SSURfSEZPX0RFTEFZICAgICAgICAgICAoKHUxNikweEZDQzUpIC8vIDEuNy42CisjZGVmaW5lICAgICAgICAgSEZBMzg0eF9SSURfRElTU0FMT1dFREJTU0lEICAgICAoKHUxNikweEZDQzYpIC8vIDEuOC4wCisjZGVmaW5lCQlIRkEzODR4X1JJRF9TQ0FOUkVRVUVTVAkJKCh1MTYpMHhGQ0UxKQorI2RlZmluZQkJSEZBMzg0eF9SSURfSk9JTlJFUVVFU1QJCSgodTE2KTB4RkNFMikKKyNkZWZpbmUJCUhGQTM4NHhfUklEX0FVVEhFTlRJQ0FURVNUQQkoKHUxNikweEZDRTMpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DSEFOTkVMSU5GT1JFUVVFU1QJKCh1MTYpMHhGQ0U0KQorI2RlZmluZQkJSEZBMzg0eF9SSURfSE9TVFNDQU4gICAgICAgICAgCSgodTE2KTB4RkNFNSkgLy8gTkVXIFNUQQorI2RlZmluZQkJSEZBMzg0eF9SSURfQVNTT0NJQVRFU1RBCSgodTE2KTB4RkNFNikKIAotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0VQREVGQVVMVEtFWV9MRU4JKChVSU5UMTYpNikKLSNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldFUDEyOERFRkFVTFRLRVlfTEVOCSgoVUlOVDE2KTE0KQotI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUFJJT1FVU0FHRV9MRU4JCSgoVUlOVDE2KTQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZX0xFTgkoKHUxNik2KQorI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0VQMTI4REVGQVVMVEtFWV9MRU4JKCh1MTYpMTQpCisjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZQUklPUVVTQUdFX0xFTgkJKCh1MTYpNCkKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFBEIFJlY29yZCBjb2RlcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBIRkEzODR4X1BEUl9QQ0JfUEFSVE5VTQkJKChVSU5UMTYpMHgwMDAxKQotI2RlZmluZSBIRkEzODR4X1BEUl9QREFWRVIJCSgoVUlOVDE2KTB4MDAwMikKLSNkZWZpbmUgSEZBMzg0eF9QRFJfTklDX1NFUklBTAkJKChVSU5UMTYpMHgwMDAzKQotI2RlZmluZSBIRkEzODR4X1BEUl9NS0tfTUVBU1VSRU1FTlRTCSgoVUlOVDE2KTB4MDAwNCkKLSNkZWZpbmUgSEZBMzg0eF9QRFJfTklDX1JBTVNJWkUJCSgoVUlOVDE2KTB4MDAwNSkKLSNkZWZpbmUgSEZBMzg0eF9QRFJfTUZJU1VQUkFOR0UJCSgoVUlOVDE2KTB4MDAwNikKLSNkZWZpbmUgSEZBMzg0eF9QRFJfQ0ZJU1VQUkFOR0UJCSgoVUlOVDE2KTB4MDAwNykKLSNkZWZpbmUgSEZBMzg0eF9QRFJfTklDSUQJCSgoVUlOVDE2KTB4MDAwOCkKLS8vI2RlZmluZSBIRkEzODR4X1BEUl9SRUZEQUNfTUVBU1VSRU1FTlRTCSgoVUlOVDE2KTB4MDAxMCkKLS8vI2RlZmluZSBIRkEzODR4X1BEUl9WR0RBQ19NRUFTVVJFTUVOVFMJKChVSU5UMTYpMHgwMDIwKQotLy8jZGVmaW5lIEhGQTM4NHhfUERSX0xFVkVMX0NPTVBfTUVBU1VSRU1FTlRTCSgoVUlOVDE2KTB4MDAzMCkKLS8vI2RlZmluZSBIRkEzODR4X1BEUl9NT0RFTV9UUklNREFDX01FQVNVUkVNRU5UUwkoKFVJTlQxNikweDAwNDApCi0vLyNkZWZpbmUgSEZBMzg0eF9QRFJfQ09SRUdBX0hBQ0sJCSgoVUlOVDE2KTB4MDBmZikKLSNkZWZpbmUgSEZBMzg0eF9QRFJfTUFDX0FERFJFU1MJCSgoVUlOVDE2KTB4MDEwMSkKLS8vI2RlZmluZSBIRkEzODR4X1BEUl9NS0tfQ0FMTE5BTUUJKChVSU5UMTYpMHgwMTAyKQotI2RlZmluZSBIRkEzODR4X1BEUl9SRUdET01BSU4JCSgoVUlOVDE2KTB4MDEwMykKLSNkZWZpbmUgSEZBMzg0eF9QRFJfQUxMT1dFRF9DSEFOTkVMCSgoVUlOVDE2KTB4MDEwNCkKLSNkZWZpbmUgSEZBMzg0eF9QRFJfREVGQVVMVF9DSEFOTkVMCSgoVUlOVDE2KTB4MDEwNSkKLS8vI2RlZmluZSBIRkEzODR4X1BEUl9QUklWQUNZX09QVElPTgkoKFVJTlQxNikweDAxMDYpCi0jZGVmaW5lIEhGQTM4NHhfUERSX1RFTVBUWVBFCQkoKFVJTlQxNikweDAxMDcpCi0vLyNkZWZpbmUgSEZBMzg0eF9QRFJfUkVGREFDX1NFVFVQCSgoVUlOVDE2KTB4MDExMCkKLS8vI2RlZmluZSBIRkEzODR4X1BEUl9WR0RBQ19TRVRVUAkJKChVSU5UMTYpMHgwMTIwKQotLy8jZGVmaW5lIEhGQTM4NHhfUERSX0xFVkVMX0NPTVBfU0VUVVAJKChVSU5UMTYpMHgwMTMwKQotLy8jZGVmaW5lIEhGQTM4NHhfUERSX1RSSU1EQUNfU0VUVVAJKChVSU5UMTYpMHgwMTQwKQotI2RlZmluZSBIRkEzODR4X1BEUl9JRlJfU0VUVElORwkJKChVSU5UMTYpMHgwMjAwKQotI2RlZmluZSBIRkEzODR4X1BEUl9SRlJfU0VUVElORwkJKChVSU5UMTYpMHgwMjAxKQotI2RlZmluZSBIRkEzODR4X1BEUl9IRkEzODYxX0JBU0VMSU5FCSgoVUlOVDE2KTB4MDIwMikKLSNkZWZpbmUgSEZBMzg0eF9QRFJfSEZBMzg2MV9TSEFET1cJKChVSU5UMTYpMHgwMjAzKQotI2RlZmluZSBIRkEzODR4X1BEUl9IRkEzODYxX0lGUkYJKChVSU5UMTYpMHgwMjA0KQotI2RlZmluZSBIRkEzODR4X1BEUl9IRkEzODYxX0NIQ0FMU1AJKChVSU5UMTYpMHgwMzAwKQotI2RlZmluZSBIRkEzODR4X1BEUl9IRkEzODYxX0NIQ0FMSQkoKFVJTlQxNikweDAzMDEpCi0jZGVmaW5lIEhGQTM4NHhfUERSX01BWF9UWF9QT1dFUiAgCSgoVUlOVDE2KTB4MDMwMikKLSNkZWZpbmUgSEZBMzg0eF9QRFJfTUFTVEVSX0NIQU5fTElTVAkoKFVJTlQxNikweDAzMDMpCi0jZGVmaW5lIEhGQTM4NHhfUERSXzM4NDJfTklDX0NPTkZJRwkoKFVJTlQxNikweDA0MDApCi0jZGVmaW5lIEhGQTM4NHhfUERSX1VTQl9JRAkJKChVSU5UMTYpMHgwNDAxKQotI2RlZmluZSBIRkEzODR4X1BEUl9QQ0lfSUQJCSgoVUlOVDE2KTB4MDQwMikKLSNkZWZpbmUgSEZBMzg0eF9QRFJfUENJX0lGQ09ORgkJKChVSU5UMTYpMHgwNDAzKQotI2RlZmluZSBIRkEzODR4X1BEUl9QQ0lfUE1DT05GCQkoKFVJTlQxNikweDA0MDQpCi0jZGVmaW5lIEhGQTM4NHhfUERSX1JGRU5SR1kJCSgoVUlOVDE2KTB4MDQwNikKLSNkZWZpbmUgSEZBMzg0eF9QRFJfVVNCX1BPV0VSX1RZUEUgICAgICAoKFVJTlQxNikweDA0MDcpCi0vLyNkZWZpbmUgSEZBMzg0eF9QRFJfVU5LTk9XTjQwOAkJKChVSU5UMTYpMHgwNDA4KQotI2RlZmluZSBIRkEzODR4X1BEUl9VU0JfTUFYX1BPV0VSCSgoVUlOVDE2KTB4MDQwOSkKLSNkZWZpbmUgSEZBMzg0eF9QRFJfVVNCX01BTlVGQUNUVVJFUgkoKFVJTlQxNikweDA0MTApCi0jZGVmaW5lIEhGQTM4NHhfUERSX1VTQl9QUk9EVUNUICAJKChVSU5UMTYpMHgwNDExKQotI2RlZmluZSBIRkEzODR4X1BEUl9BTlRfRElWRVJTSVRZICAgCSgoVUlOVDE2KTB4MDQxMikKLSNkZWZpbmUgSEZBMzg0eF9QRFJfSEZPX0RFTEFZICAgICAgIAkoKFVJTlQxNikweDA0MTMpCi0jZGVmaW5lIEhGQTM4NHhfUERSX1NDQUxFX1RIUkVTSCAJKChVSU5UMTYpMHgwNDE0KQorI2RlZmluZSBIRkEzODR4X1BEUl9QQ0JfUEFSVE5VTQkJKCh1MTYpMHgwMDAxKQorI2RlZmluZSBIRkEzODR4X1BEUl9QREFWRVIJCSgodTE2KTB4MDAwMikKKyNkZWZpbmUgSEZBMzg0eF9QRFJfTklDX1NFUklBTAkJKCh1MTYpMHgwMDAzKQorI2RlZmluZSBIRkEzODR4X1BEUl9NS0tfTUVBU1VSRU1FTlRTCSgodTE2KTB4MDAwNCkKKyNkZWZpbmUgSEZBMzg0eF9QRFJfTklDX1JBTVNJWkUJCSgodTE2KTB4MDAwNSkKKyNkZWZpbmUgSEZBMzg0eF9QRFJfTUZJU1VQUkFOR0UJCSgodTE2KTB4MDAwNikKKyNkZWZpbmUgSEZBMzg0eF9QRFJfQ0ZJU1VQUkFOR0UJCSgodTE2KTB4MDAwNykKKyNkZWZpbmUgSEZBMzg0eF9QRFJfTklDSUQJCSgodTE2KTB4MDAwOCkKKy8vI2RlZmluZSBIRkEzODR4X1BEUl9SRUZEQUNfTUVBU1VSRU1FTlRTCSgodTE2KTB4MDAxMCkKKy8vI2RlZmluZSBIRkEzODR4X1BEUl9WR0RBQ19NRUFTVVJFTUVOVFMJKCh1MTYpMHgwMDIwKQorLy8jZGVmaW5lIEhGQTM4NHhfUERSX0xFVkVMX0NPTVBfTUVBU1VSRU1FTlRTCSgodTE2KTB4MDAzMCkKKy8vI2RlZmluZSBIRkEzODR4X1BEUl9NT0RFTV9UUklNREFDX01FQVNVUkVNRU5UUwkoKHUxNikweDAwNDApCisvLyNkZWZpbmUgSEZBMzg0eF9QRFJfQ09SRUdBX0hBQ0sJCSgodTE2KTB4MDBmZikKKyNkZWZpbmUgSEZBMzg0eF9QRFJfTUFDX0FERFJFU1MJCSgodTE2KTB4MDEwMSkKKy8vI2RlZmluZSBIRkEzODR4X1BEUl9NS0tfQ0FMTE5BTUUJKCh1MTYpMHgwMTAyKQorI2RlZmluZSBIRkEzODR4X1BEUl9SRUdET01BSU4JCSgodTE2KTB4MDEwMykKKyNkZWZpbmUgSEZBMzg0eF9QRFJfQUxMT1dFRF9DSEFOTkVMCSgodTE2KTB4MDEwNCkKKyNkZWZpbmUgSEZBMzg0eF9QRFJfREVGQVVMVF9DSEFOTkVMCSgodTE2KTB4MDEwNSkKKy8vI2RlZmluZSBIRkEzODR4X1BEUl9QUklWQUNZX09QVElPTgkoKHUxNikweDAxMDYpCisjZGVmaW5lIEhGQTM4NHhfUERSX1RFTVBUWVBFCQkoKHUxNikweDAxMDcpCisvLyNkZWZpbmUgSEZBMzg0eF9QRFJfUkVGREFDX1NFVFVQCSgodTE2KTB4MDExMCkKKy8vI2RlZmluZSBIRkEzODR4X1BEUl9WR0RBQ19TRVRVUAkJKCh1MTYpMHgwMTIwKQorLy8jZGVmaW5lIEhGQTM4NHhfUERSX0xFVkVMX0NPTVBfU0VUVVAJKCh1MTYpMHgwMTMwKQorLy8jZGVmaW5lIEhGQTM4NHhfUERSX1RSSU1EQUNfU0VUVVAJKCh1MTYpMHgwMTQwKQorI2RlZmluZSBIRkEzODR4X1BEUl9JRlJfU0VUVElORwkJKCh1MTYpMHgwMjAwKQorI2RlZmluZSBIRkEzODR4X1BEUl9SRlJfU0VUVElORwkJKCh1MTYpMHgwMjAxKQorI2RlZmluZSBIRkEzODR4X1BEUl9IRkEzODYxX0JBU0VMSU5FCSgodTE2KTB4MDIwMikKKyNkZWZpbmUgSEZBMzg0eF9QRFJfSEZBMzg2MV9TSEFET1cJKCh1MTYpMHgwMjAzKQorI2RlZmluZSBIRkEzODR4X1BEUl9IRkEzODYxX0lGUkYJKCh1MTYpMHgwMjA0KQorI2RlZmluZSBIRkEzODR4X1BEUl9IRkEzODYxX0NIQ0FMU1AJKCh1MTYpMHgwMzAwKQorI2RlZmluZSBIRkEzODR4X1BEUl9IRkEzODYxX0NIQ0FMSQkoKHUxNikweDAzMDEpCisjZGVmaW5lIEhGQTM4NHhfUERSX01BWF9UWF9QT1dFUiAgCSgodTE2KTB4MDMwMikKKyNkZWZpbmUgSEZBMzg0eF9QRFJfTUFTVEVSX0NIQU5fTElTVAkoKHUxNikweDAzMDMpCisjZGVmaW5lIEhGQTM4NHhfUERSXzM4NDJfTklDX0NPTkZJRwkoKHUxNikweDA0MDApCisjZGVmaW5lIEhGQTM4NHhfUERSX1VTQl9JRAkJKCh1MTYpMHgwNDAxKQorI2RlZmluZSBIRkEzODR4X1BEUl9QQ0lfSUQJCSgodTE2KTB4MDQwMikKKyNkZWZpbmUgSEZBMzg0eF9QRFJfUENJX0lGQ09ORgkJKCh1MTYpMHgwNDAzKQorI2RlZmluZSBIRkEzODR4X1BEUl9QQ0lfUE1DT05GCQkoKHUxNikweDA0MDQpCisjZGVmaW5lIEhGQTM4NHhfUERSX1JGRU5SR1kJCSgodTE2KTB4MDQwNikKKyNkZWZpbmUgSEZBMzg0eF9QRFJfVVNCX1BPV0VSX1RZUEUgICAgICAoKHUxNikweDA0MDcpCisvLyNkZWZpbmUgSEZBMzg0eF9QRFJfVU5LTk9XTjQwOAkJKCh1MTYpMHgwNDA4KQorI2RlZmluZSBIRkEzODR4X1BEUl9VU0JfTUFYX1BPV0VSCSgodTE2KTB4MDQwOSkKKyNkZWZpbmUgSEZBMzg0eF9QRFJfVVNCX01BTlVGQUNUVVJFUgkoKHUxNikweDA0MTApCisjZGVmaW5lIEhGQTM4NHhfUERSX1VTQl9QUk9EVUNUICAJKCh1MTYpMHgwNDExKQorI2RlZmluZSBIRkEzODR4X1BEUl9BTlRfRElWRVJTSVRZICAgCSgodTE2KTB4MDQxMikKKyNkZWZpbmUgSEZBMzg0eF9QRFJfSEZPX0RFTEFZICAgICAgIAkoKHUxNikweDA0MTMpCisjZGVmaW5lIEhGQTM4NHhfUERSX1NDQUxFX1RIUkVTSCAJKCh1MTYpMHgwNDE0KQogCi0jZGVmaW5lIEhGQTM4NHhfUERSX0hGQTM4NjFfTUFORl9URVNUU1AJKChVSU5UMTYpMHgwOTAwKQotI2RlZmluZSBIRkEzODR4X1BEUl9IRkEzODYxX01BTkZfVEVTVEkJKChVSU5UMTYpMHgwOTAxKQotI2RlZmluZSBIRkEzODR4X1BEUl9FTkRfT0ZfUERBCQkoKFVJTlQxNikweDAwMDApCisjZGVmaW5lIEhGQTM4NHhfUERSX0hGQTM4NjFfTUFORl9URVNUU1AJKCh1MTYpMHgwOTAwKQorI2RlZmluZSBIRkEzODR4X1BEUl9IRkEzODYxX01BTkZfVEVTVEkJKCh1MTYpMHgwOTAxKQorI2RlZmluZSBIRkEzODR4X1BEUl9FTkRfT0ZfUERBCQkoKHUxNikweDAwMDApCiAKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KQEAgLTgwMiw3ICs3NjYsNyBAQAogI2RlZmluZQkJSEZBMzg0eF9PRkZTRVQxCQlIRkEzODR4X09GRlNFVDFfT0ZGCiAjZGVmaW5lCQlIRkEzODR4X0RBVEExCQlIRkEzODR4X0RBVEExX09GRgogI2RlZmluZQkJSEZBMzg0eF9FVlNUQVQJCUhGQTM4NHhfRVZTVEFUX09GRgotI2RlZmluZQkJSEZBMzg0eF9JTlRFTgkJSEZBMzg0eF9JTlRFTl9PRkYKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU4JCUhGQTM4NHhfSU5URU5fT0ZGCiAjZGVmaW5lCQlIRkEzODR4X0VWQUNLCQlIRkEzODR4X0VWQUNLX09GRgogI2RlZmluZQkJSEZBMzg0eF9DT05UUk9MCQlIRkEzODR4X0NPTlRST0xfT0ZGCiAjZGVmaW5lCQlIRkEzODR4X1NXU1VQUE9SVDAJSEZBMzg0eF9TV1NVUFBPUlQwX09GRgpAQCAtODE3LDk2ICs3ODEsOTYgQEAKIAogLyotLS0gUmVnaXN0ZXIgVGVzdC9HZXQvU2V0IEZpZWxkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0jZGVmaW5lCQlIRkEzODR4X0NNRF9JU0JVU1kodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpdmFsdWUpICYgSEZBMzg0eF9DTURfQlVTWSkpCi0jZGVmaW5lCQlIRkEzODR4X0NNRF9BSU5GT19HRVQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSAmIEhGQTM4NHhfQ01EX0FJTkZPKSA+PiA4KSkKLSNkZWZpbmUJCUhGQTM4NHhfQ01EX0FJTkZPX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KSgoVUlOVDE2KSh2YWx1ZSkgPDwgOCkpCi0jZGVmaW5lCQlIRkEzODR4X0NNRF9NQUNQT1JUX0dFVCh2YWx1ZSkJCSgoVUlOVDE2KShIRkEzODR4X0NNRF9BSU5GT19HRVQoKFVJTlQxNikodmFsdWUpICYgSEZBMzg0eF9DTURfTUFDUE9SVCkpKQotI2RlZmluZQkJSEZBMzg0eF9DTURfTUFDUE9SVF9TRVQodmFsdWUpCQkoKFVJTlQxNilIRkEzODR4X0NNRF9BSU5GT19TRVQodmFsdWUpKQotI2RlZmluZQkJSEZBMzg0eF9DTURfSVNSRUNMKHZhbHVlKQkJKChVSU5UMTYpKEhGQTM4NHhfQ01EX0FJTkZPX0dFVCgoVUlOVDE2KSh2YWx1ZSkgJiBIRkEzODR4X0NNRF9SRUNMKSkpCi0jZGVmaW5lCQlIRkEzODR4X0NNRF9SRUNMX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KUhGQTM4NHhfQ01EX0FJTkZPX1NFVCh2YWx1ZSkpCi0jZGVmaW5lCQlIRkEzODR4X0NNRF9RT1NfR0VUKHZhbHVlKQkJKChVSU5UMTYpKCgoKFVJTlQxNikodmFsdWUpKSYoKFVJTlQxNikweDMwMDApKSA+PiAxMikpCi0jZGVmaW5lCQlIRkEzODR4X0NNRF9RT1NfU0VUKHZhbHVlKQkJKChVSU5UMTYpKCgoKFVJTlQxNikodmFsdWUpKSA8PCAxMikgJiAweDMwMDApKQotI2RlZmluZQkJSEZBMzg0eF9DTURfSVNXUklURSh2YWx1ZSkJCSgoVUlOVDE2KShIRkEzODR4X0NNRF9BSU5GT19HRVQoKFVJTlQxNikodmFsdWUpICYgSEZBMzg0eF9DTURfV1JJVEUpKSkKLSNkZWZpbmUJCUhGQTM4NHhfQ01EX1dSSVRFX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KUhGQTM4NHhfQ01EX0FJTkZPX1NFVCgoVUlOVDE2KXZhbHVlKSkKLSNkZWZpbmUJCUhGQTM4NHhfQ01EX1BST0dNT0RFX0dFVCh2YWx1ZSkJCSgoVUlOVDE2KShIRkEzODR4X0NNRF9BSU5GT19HRVQoKFVJTlQxNikodmFsdWUpICYgSEZBMzg0eF9DTURfUFJPR01PREUpKSkKLSNkZWZpbmUJCUhGQTM4NHhfQ01EX1BST0dNT0RFX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KUhGQTM4NHhfQ01EX0FJTkZPX1NFVCgoVUlOVDE2KXZhbHVlKSkKLSNkZWZpbmUJCUhGQTM4NHhfQ01EX0NNRENPREVfR0VUKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9DTURfQ01EQ09ERSkpCi0jZGVmaW5lCQlIRkEzODR4X0NNRF9DTURDT0RFX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KSh2YWx1ZSkpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9JU0JVU1kodmFsdWUpCQkoKHUxNikoKCh1MTYpdmFsdWUpICYgSEZBMzg0eF9DTURfQlVTWSkpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9BSU5GT19HRVQodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSAmIEhGQTM4NHhfQ01EX0FJTkZPKSA+PiA4KSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX0FJTkZPX1NFVCh2YWx1ZSkJCSgodTE2KSgodTE2KSh2YWx1ZSkgPDwgOCkpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9NQUNQT1JUX0dFVCh2YWx1ZSkJCSgodTE2KShIRkEzODR4X0NNRF9BSU5GT19HRVQoKHUxNikodmFsdWUpICYgSEZBMzg0eF9DTURfTUFDUE9SVCkpKQorI2RlZmluZQkJSEZBMzg0eF9DTURfTUFDUE9SVF9TRVQodmFsdWUpCQkoKHUxNilIRkEzODR4X0NNRF9BSU5GT19TRVQodmFsdWUpKQorI2RlZmluZQkJSEZBMzg0eF9DTURfSVNSRUNMKHZhbHVlKQkJKCh1MTYpKEhGQTM4NHhfQ01EX0FJTkZPX0dFVCgodTE2KSh2YWx1ZSkgJiBIRkEzODR4X0NNRF9SRUNMKSkpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9SRUNMX1NFVCh2YWx1ZSkJCSgodTE2KUhGQTM4NHhfQ01EX0FJTkZPX1NFVCh2YWx1ZSkpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9RT1NfR0VUKHZhbHVlKQkJKCh1MTYpKCgoKHUxNikodmFsdWUpKSYoKHUxNikweDMwMDApKSA+PiAxMikpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9RT1NfU0VUKHZhbHVlKQkJKCh1MTYpKCgoKHUxNikodmFsdWUpKSA8PCAxMikgJiAweDMwMDApKQorI2RlZmluZQkJSEZBMzg0eF9DTURfSVNXUklURSh2YWx1ZSkJCSgodTE2KShIRkEzODR4X0NNRF9BSU5GT19HRVQoKHUxNikodmFsdWUpICYgSEZBMzg0eF9DTURfV1JJVEUpKSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX1dSSVRFX1NFVCh2YWx1ZSkJCSgodTE2KUhGQTM4NHhfQ01EX0FJTkZPX1NFVCgodTE2KXZhbHVlKSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX1BST0dNT0RFX0dFVCh2YWx1ZSkJCSgodTE2KShIRkEzODR4X0NNRF9BSU5GT19HRVQoKHUxNikodmFsdWUpICYgSEZBMzg0eF9DTURfUFJPR01PREUpKSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX1BST0dNT0RFX1NFVCh2YWx1ZSkJCSgodTE2KUhGQTM4NHhfQ01EX0FJTkZPX1NFVCgodTE2KXZhbHVlKSkKKyNkZWZpbmUJCUhGQTM4NHhfQ01EX0NNRENPREVfR0VUKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9DTURfQ01EQ09ERSkpCisjZGVmaW5lCQlIRkEzODR4X0NNRF9DTURDT0RFX1NFVCh2YWx1ZSkJCSgodTE2KSh2YWx1ZSkpCiAKLSNkZWZpbmUJCUhGQTM4NHhfU1RBVFVTX1JFU1VMVF9HRVQodmFsdWUpCSgoVUlOVDE2KSgoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X1NUQVRVU19SRVNVTFQpID4+IDgpKQotI2RlZmluZQkJSEZBMzg0eF9TVEFUVVNfUkVTVUxUX1NFVCh2YWx1ZSkJKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDgpCi0jZGVmaW5lCQlIRkEzODR4X1NUQVRVU19DTURDT0RFX0dFVCh2YWx1ZSkJKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9TVEFUVVNfQ01EQ09ERSkKLSNkZWZpbmUJCUhGQTM4NHhfU1RBVFVTX0NNRENPREVfU0VUKHZhbHVlKQkoKFVJTlQxNikodmFsdWUpKQorI2RlZmluZQkJSEZBMzg0eF9TVEFUVVNfUkVTVUxUX0dFVCh2YWx1ZSkJKCh1MTYpKCgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfU1RBVFVTX1JFU1VMVCkgPj4gOCkpCisjZGVmaW5lCQlIRkEzODR4X1NUQVRVU19SRVNVTFRfU0VUKHZhbHVlKQkoKCh1MTYpKHZhbHVlKSkgPDwgOCkKKyNkZWZpbmUJCUhGQTM4NHhfU1RBVFVTX0NNRENPREVfR0VUKHZhbHVlKQkoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X1NUQVRVU19DTURDT0RFKQorI2RlZmluZQkJSEZBMzg0eF9TVEFUVVNfQ01EQ09ERV9TRVQodmFsdWUpCSgodTE2KSh2YWx1ZSkpCiAKLSNkZWZpbmUJCUhGQTM4NHhfT0ZGU0VUX0lTQlVTWSh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfT0ZGU0VUX0JVU1kpKQotI2RlZmluZQkJSEZBMzg0eF9PRkZTRVRfSVNFUlIodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X09GRlNFVF9FUlIpKQotI2RlZmluZQkJSEZBMzg0eF9PRkZTRVRfREFUQU9GRl9HRVQodmFsdWUpCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfT0ZGU0VUX0RBVEFPRkYpKQotI2RlZmluZQkJSEZBMzg0eF9PRkZTRVRfREFUQU9GRl9TRVQodmFsdWUpCSgoVUlOVDE2KSh2YWx1ZSkpCisjZGVmaW5lCQlIRkEzODR4X09GRlNFVF9JU0JVU1kodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X09GRlNFVF9CVVNZKSkKKyNkZWZpbmUJCUhGQTM4NHhfT0ZGU0VUX0lTRVJSKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9PRkZTRVRfRVJSKSkKKyNkZWZpbmUJCUhGQTM4NHhfT0ZGU0VUX0RBVEFPRkZfR0VUKHZhbHVlKQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X09GRlNFVF9EQVRBT0ZGKSkKKyNkZWZpbmUJCUhGQTM4NHhfT0ZGU0VUX0RBVEFPRkZfU0VUKHZhbHVlKQkoKHUxNikodmFsdWUpKQogCi0jZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9JU1RJQ0sodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWU1RBVF9USUNLKSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lTV1RFUlIodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWU1RBVF9XVEVSUikpCi0jZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9JU0lORkRST1AodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWU1RBVF9JTkZEUk9QKSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lTSU5GTyh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZTVEFUX0lORk8pKQotI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSVNEVElNKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVlNUQVRfRFRJTSkpCi0jZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9JU0NNRCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZTVEFUX0NNRCkpCi0jZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9JU0FMTE9DKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVlNUQVRfQUxMT0MpKQotI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSVNUWEVYQyh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZTVEFUX1RYRVhDKSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lTVFgodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWU1RBVF9UWCkpCi0jZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9JU1JYKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVlNUQVRfUlgpKQorI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSVNUSUNLKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVlNUQVRfVElDSykpCisjZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9JU1dURVJSKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVlNUQVRfV1RFUlIpKQorI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSVNJTkZEUk9QKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVlNUQVRfSU5GRFJPUCkpCisjZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9JU0lORk8odmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWU1RBVF9JTkZPKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lTRFRJTSh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZTVEFUX0RUSU0pKQorI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSVNDTUQodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWU1RBVF9DTUQpKQorI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSVNBTExPQyh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZTVEFUX0FMTE9DKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZTVEFUX0lTVFhFWEModmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWU1RBVF9UWEVYQykpCisjZGVmaW5lCQlIRkEzODR4X0VWU1RBVF9JU1RYKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVlNUQVRfVFgpKQorI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSVNSWCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZTVEFUX1JYKSkKIAotI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSVNCQVBfT1AodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0lOVF9CQVBfT1ApKQorI2RlZmluZQkJSEZBMzg0eF9FVlNUQVRfSVNCQVBfT1AodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X2ludF9CQVBfT1ApKQogCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX0lTVElDSyh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfSU5URU5fVElDSykpCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX1RJQ0tfU0VUKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDE1KSkKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fSVNXVEVSUih2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfSU5URU5fV1RFUlIpKQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9XVEVSUl9TRVQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgMTQpKQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9JU0lORkRST1AodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0lOVEVOX0lORkRST1ApKQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9JTkZEUk9QX1NFVCh2YWx1ZSkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDEzKSkKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fSVNJTkZPKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9JTlRFTl9JTkZPKSkKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fSU5GT19TRVQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgNykpCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX0lTRFRJTSh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfSU5URU5fRFRJTSkpCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX0RUSU1fU0VUKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDUpKQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9JU0NNRCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfSU5URU5fQ01EKSkKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fQ01EX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSA8PCA0KSkKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fSVNBTExPQyh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfSU5URU5fQUxMT0MpKQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9BTExPQ19TRVQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgMykpCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX0lTVFhFWEModmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0lOVEVOX1RYRVhDKSkKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fVFhFWENfU0VUKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDIpKQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9JU1RYKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9JTlRFTl9UWCkpCi0jZGVmaW5lCQlIRkEzODR4X0lOVEVOX1RYX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSA8PCAxKSkKLSNkZWZpbmUJCUhGQTM4NHhfSU5URU5fSVNSWCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfSU5URU5fUlgpKQotI2RlZmluZQkJSEZBMzg0eF9JTlRFTl9SWF9TRVQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgMCkpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX0lTVElDSyh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfSU5URU5fVElDSykpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX1RJQ0tfU0VUKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpIDw8IDE1KSkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fSVNXVEVSUih2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfSU5URU5fV1RFUlIpKQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9XVEVSUl9TRVQodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgPDwgMTQpKQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9JU0lORkRST1AodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X0lOVEVOX0lORkRST1ApKQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9JTkZEUk9QX1NFVCh2YWx1ZSkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpIDw8IDEzKSkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fSVNJTkZPKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9JTlRFTl9JTkZPKSkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fSU5GT19TRVQodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgPDwgNykpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX0lTRFRJTSh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfSU5URU5fRFRJTSkpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX0RUSU1fU0VUKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpIDw8IDUpKQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9JU0NNRCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfSU5URU5fQ01EKSkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fQ01EX1NFVCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSA8PCA0KSkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fSVNBTExPQyh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfSU5URU5fQUxMT0MpKQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9BTExPQ19TRVQodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgPDwgMykpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX0lTVFhFWEModmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X0lOVEVOX1RYRVhDKSkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fVFhFWENfU0VUKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpIDw8IDIpKQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9JU1RYKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9JTlRFTl9UWCkpCisjZGVmaW5lCQlIRkEzODR4X2ludEVOX1RYX1NFVCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSA8PCAxKSkKKyNkZWZpbmUJCUhGQTM4NHhfaW50RU5fSVNSWCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfSU5URU5fUlgpKQorI2RlZmluZQkJSEZBMzg0eF9pbnRFTl9SWF9TRVQodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgPDwgMCkpCiAKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSVNUSUNLKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVkFDS19USUNLKSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfVElDS19TRVQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgMTUpKQotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JU1dURVJSKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVkFDS19XVEVSUikpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX1dURVJSX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSA8PCAxNCkpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lTSU5GRFJPUCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZBQ0tfSU5GRFJPUCkpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lORkRST1BfU0VUKHZhbHVlKQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgMTMpKQotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JU0lORk8odmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWQUNLX0lORk8pKQotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JTkZPX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSA8PCA3KSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSVNEVElNKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVkFDS19EVElNKSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfRFRJTV9TRVQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgNSkpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lTQ01EKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVkFDS19DTUQpKQotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19DTURfU0VUKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDQpKQotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JU0FMTE9DKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVkFDS19BTExPQykpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX0FMTE9DX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSA8PCAzKSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSVNUWEVYQyh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZBQ0tfVFhFWEMpKQotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19UWEVYQ19TRVQodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgPDwgMikpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lTVFgodmFsdWUpCQkoKFVJTlQxNikoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWQUNLX1RYKSkKLSNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfVFhfU0VUKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDEpKQotI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JU1JYKHZhbHVlKQkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVkFDS19SWCkpCi0jZGVmaW5lCQlIRkEzODR4X0VWQUNLX1JYX1NFVCh2YWx1ZSkJCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSA8PCAwKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSVNUSUNLKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVkFDS19USUNLKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfVElDS19TRVQodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgPDwgMTUpKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JU1dURVJSKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVkFDS19XVEVSUikpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX1dURVJSX1NFVCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSA8PCAxNCkpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lTSU5GRFJPUCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZBQ0tfSU5GRFJPUCkpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lORkRST1BfU0VUKHZhbHVlKQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgPDwgMTMpKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JU0lORk8odmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWQUNLX0lORk8pKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JTkZPX1NFVCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSA8PCA3KSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSVNEVElNKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVkFDS19EVElNKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfRFRJTV9TRVQodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgPDwgNSkpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lTQ01EKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVkFDS19DTUQpKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19DTURfU0VUKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpIDw8IDQpKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JU0FMTE9DKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVkFDS19BTExPQykpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX0FMTE9DX1NFVCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSA8PCAzKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfSVNUWEVYQyh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfRVZBQ0tfVFhFWEMpKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19UWEVYQ19TRVQodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgPDwgMikpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX0lTVFgodmFsdWUpCQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X0VWQUNLX1RYKSkKKyNkZWZpbmUJCUhGQTM4NHhfRVZBQ0tfVFhfU0VUKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpIDw8IDEpKQorI2RlZmluZQkJSEZBMzg0eF9FVkFDS19JU1JYKHZhbHVlKQkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9FVkFDS19SWCkpCisjZGVmaW5lCQlIRkEzODR4X0VWQUNLX1JYX1NFVCh2YWx1ZSkJCSgodTE2KSgoKHUxNikodmFsdWUpKSA8PCAwKSkKIAotI2RlZmluZQkJSEZBMzg0eF9DT05UUk9MX0FVWEVOX1NFVCh2YWx1ZSkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDE0KSkKLSNkZWZpbmUJCUhGQTM4NHhfQ09OVFJPTF9BVVhFTl9HRVQodmFsdWUpCSgoVUlOVDE2KSgoKFVJTlQxNikodmFsdWUpKSA+PiAxNCkpCisjZGVmaW5lCQlIRkEzODR4X0NPTlRST0xfQVVYRU5fU0VUKHZhbHVlKQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgPDwgMTQpKQorI2RlZmluZQkJSEZBMzg0eF9DT05UUk9MX0FVWEVOX0dFVCh2YWx1ZSkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpID4+IDE0KSkKIAogLyogQnl0ZSBPcmRlciAqLwogI2lmZGVmIF9fS0VSTkVMX18KLSNkZWZpbmUgaGZhMzg0eDJob3N0XzE2KG4pCShfX2xlMTZfdG9fY3B1KChVSU5UMTYpKG4pKSkKLSNkZWZpbmUgaGZhMzg0eDJob3N0XzMyKG4pCShfX2xlMzJfdG9fY3B1KChVSU5UMzIpKG4pKSkKLSNkZWZpbmUgaG9zdDJoZmEzODR4XzE2KG4pCShfX2NwdV90b19sZTE2KChVSU5UMTYpKG4pKSkKLSNkZWZpbmUgaG9zdDJoZmEzODR4XzMyKG4pCShfX2NwdV90b19sZTMyKChVSU5UMzIpKG4pKSkKKyNkZWZpbmUgaGZhMzg0eDJob3N0XzE2KG4pCShfX2xlMTZfdG9fY3B1KCh1MTYpKG4pKSkKKyNkZWZpbmUgaGZhMzg0eDJob3N0XzMyKG4pCShfX2xlMzJfdG9fY3B1KCh1MzIpKG4pKSkKKyNkZWZpbmUgaG9zdDJoZmEzODR4XzE2KG4pCShfX2NwdV90b19sZTE2KCh1MTYpKG4pKSkKKyNkZWZpbmUgaG9zdDJoZmEzODR4XzMyKG4pCShfX2NwdV90b19sZTMyKCh1MzIpKG4pKSkKICNlbmRpZgogCiAvKiBIb3N0IE1haW50YWluZWQgU3RhdGUgSW5mbyAqLwpAQCAtOTI3LDE0ICs4OTEsMTQgQEAKIC8qIENvbW1vbmx5IHVzZWQgYmFzaWMgdHlwZXMgKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfYnl0ZXN0cgogewotCVVJTlQxNglsZW47Ci0JVUlOVDgJZGF0YVswXTsKKwl1MTYJbGVuOworCXU4CWRhdGFbMF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfYnl0ZXN0cl90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2J5dGVzdHIzMgogewotCVVJTlQxNglsZW47Ci0JVUlOVDgJZGF0YVszMl07CisJdTE2CWxlbjsKKwl1OAlkYXRhWzMyXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9ieXRlc3RyMzJfdDsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtOTQ2LDExMiArOTEwLDExMiBAQAogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3JlY29yZAogewotCVVJTlQxNglyZWNsZW47Ci0JVUlOVDE2CXJpZDsKKwl1MTYJcmVjbGVuOworCXUxNglyaWQ7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcmVjX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcmVjb3JkMTYKIHsKLQlVSU5UMTYJcmVjbGVuOwotCVVJTlQxNglyaWQ7Ci0JVUlOVDE2CXZhbDsKKwl1MTYJcmVjbGVuOworCXUxNglyaWQ7CisJdTE2CXZhbDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9yZWMxNl90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3JlY29yZDMyCiB7Ci0JVUlOVDE2CXJlY2xlbjsKLQlVSU5UMTYJcmlkOwotCVVJTlQzMgl2YWw7CisJdTE2CXJlY2xlbjsKKwl1MTYJcmlkOworCXUzMgl2YWw7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcmVjMzI7CiAKIC8qLS0gSGFyZHdhcmUvRmlybXdhcmUgQ29tcG9uZW50IEluZm9ybWF0aW9uIC0tLS0tLS0tLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jb21waWRlbnQKIHsKLQlVSU5UMTYJaWQ7Ci0JVUlOVDE2CXZhcmlhbnQ7Ci0JVUlOVDE2CW1ham9yOwotCVVJTlQxNgltaW5vcjsKKwl1MTYJaWQ7CisJdTE2CXZhcmlhbnQ7CisJdTE2CW1ham9yOworCXUxNgltaW5vcjsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9jb21waWRlbnRfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jYXBsZXZlbAogewotCVVJTlQxNglyb2xlOwotCVVJTlQxNglpZDsKLQlVSU5UMTYJdmFyaWFudDsKLQlVSU5UMTYJYm90dG9tOwotCVVJTlQxNgl0b3A7CisJdTE2CXJvbGU7CisJdTE2CWlkOworCXUxNgl2YXJpYW50OworCXUxNglib3R0b207CisJdTE2CXRvcDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9jYXBsZXZlbF90OwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBjbmZQb3J0VHlwZSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2NuZlBvcnRUeXBlCiB7Ci0JVUlOVDE2CWNuZlBvcnRUeXBlOworCXUxNgljbmZQb3J0VHlwZTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9jbmZQb3J0VHlwZV90OwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBjbmZPd25NQUNBZGRyZXNzIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfY25mT3duTUFDQWRkcmVzcwogewotCVVJTlQ4CWNuZk93bk1BQ0FkZHJlc3NbNl07CisJdTgJY25mT3duTUFDQWRkcmVzc1s2XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9jbmZPd25NQUNBZGRyZXNzX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGNuZkRlc2lyZWRTU0lEIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfY25mRGVzaXJlZFNTSUQKIHsKLQlVSU5UOAljbmZEZXNpcmVkU1NJRFszNF07CisJdTgJY25mRGVzaXJlZFNTSURbMzRdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2NuZkRlc2lyZWRTU0lEX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGNuZk93bkNoYW5uZWwgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jbmZPd25DaGFubmVsCiB7Ci0JVUlOVDE2CWNuZk93bkNoYW5uZWw7CisJdTE2CWNuZk93bkNoYW5uZWw7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfY25mT3duQ2hhbm5lbF90OwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBjbmZPd25TU0lEIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfY25mT3duU1NJRAogewotCVVJTlQ4CWNuZk93blNTSURbMzRdOworCXU4CWNuZk93blNTSURbMzRdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2NuZk93blNTSURfdDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogY25mT3duQVRJTVdpbmRvdyAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2NuZk93bkFUSU1XaW5kb3cKIHsKLQlVSU5UMTYJY25mT3duQVRJTVdpbmRvdzsKKwl1MTYJY25mT3duQVRJTVdpbmRvdzsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9jbmZPd25BVElNV2luZG93X3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGNuZlN5c3RlbVNjYWxlIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfY25mU3lzdGVtU2NhbGUKIHsKLQlVSU5UMTYJY25mU3lzdGVtU2NhbGU7CisJdTE2CWNuZlN5c3RlbVNjYWxlOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2NuZlN5c3RlbVNjYWxlX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGNuZk1heERhdGFMZW5ndGggLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jbmZNYXhEYXRhTGVuZ3RoCiB7Ci0JVUlOVDE2CWNuZk1heERhdGFMZW5ndGg7CisJdTE2CWNuZk1heERhdGFMZW5ndGg7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfY25mTWF4RGF0YUxlbmd0aF90OwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBjbmZXRFNBZGRyZXNzIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfY25mV0RTQWRkcmVzcwogewotCVVJTlQ4CWNuZldEU0FkZHJlc3NbNl07CisJdTgJY25mV0RTQWRkcmVzc1s2XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9jbmZXRFNBZGRyZXNzX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGNuZlBNRW5hYmxlZCAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2NuZlBNRW5hYmxlZAogewotCVVJTlQxNgljbmZQTUVuYWJsZWQ7CisJdTE2CWNuZlBNRW5hYmxlZDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9jbmZQTUVuYWJsZWRfdDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogY25mUE1FUFMgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jbmZQTUVQUwogewotCVVJTlQxNgljbmZQTUVQUzsKKwl1MTYJY25mUE1FUFM7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfY25mUE1FUFNfdDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogY25mTXVsdGljYXN0UmVjZWl2ZSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2NuZk11bHRpY2FzdFJlY2VpdmUKIHsKLQlVSU5UMTYJY25mTXVsdGljYXN0UmVjZWl2ZTsKKwl1MTYJY25mTXVsdGljYXN0UmVjZWl2ZTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9jbmZNdWx0aWNhc3RSZWNlaXZlX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGNuZkF1dGhlbnRpY2F0aW9uIC0tKi8KQEAgLTEwNjIsMzcgKzEwMjYsMzcgQEAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGNuZk1heFNsZWVwRHVyYXRpb24gLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jbmZNYXhTbGVlcER1cmF0aW9uCiB7Ci0JVUlOVDE2CWNuZk1heFNsZWVwRHVyYXRpb247CisJdTE2CWNuZk1heFNsZWVwRHVyYXRpb247CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfY25mTWF4U2xlZXBEdXJhdGlvbl90OwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBjbmZQTUhvbGRvdmVyRHVyYXRpb24gLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jbmZQTUhvbGRvdmVyRHVyYXRpb24KIHsKLQlVSU5UMTYJY25mUE1Ib2xkb3ZlckR1cmF0aW9uOworCXUxNgljbmZQTUhvbGRvdmVyRHVyYXRpb247CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfY25mUE1Ib2xkb3ZlckR1cmF0aW9uX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGNuZk93bk5hbWUgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jbmZPd25OYW1lCiB7Ci0JVUlOVDgJY25mT3duTmFtZVszNF07CisJdTgJY25mT3duTmFtZVszNF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfY25mT3duTmFtZV90OwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBjbmZPd25EVElNUGVyaW9kIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfY25mT3duRFRJTVBlcmlvZAogewotCVVJTlQxNgljbmZPd25EVElNUGVyaW9kOworCXUxNgljbmZPd25EVElNUGVyaW9kOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2NuZk93bkRUSU1QZXJpb2RfdDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogY25mV0RTQWRkcmVzcyAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2NuZldEU0FkZHJlc3NOCiB7Ci0JVUlOVDgJY25mV0RTQWRkcmVzc1s2XTsKKwl1OAljbmZXRFNBZGRyZXNzWzZdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2NuZldEU0FkZHJlc3NOX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGNuZk11bHRpY2FzdFBNQnVmZmVyaW5nIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfY25mTXVsdGljYXN0UE1CdWZmZXJpbmcKIHsKLQlVSU5UMTYJY25mTXVsdGljYXN0UE1CdWZmZXJpbmc7CisJdTE2CWNuZk11bHRpY2FzdFBNQnVmZmVyaW5nOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2NuZk11bHRpY2FzdFBNQnVmZmVyaW5nX3Q7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTExMDMsMTMgKzEwNjcsMTMgQEAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IEdyb3VwQWRkcmVzc2VzIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfR3JvdXBBZGRyZXNzZXMKIHsKLQlVSU5UOAlNQUNBZGRyZXNzWzE2XVs2XTsKKwl1OAlNQUNBZGRyZXNzWzE2XVs2XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9Hcm91cEFkZHJlc3Nlc190OwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBDcmVhdGVJQlNTIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQ3JlYXRlSUJTUwogewotCVVJTlQxNglDcmVhdGVJQlNTOworCXUxNglDcmVhdGVJQlNTOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0NyZWF0ZUlCU1NfdDsKIAogI2RlZmluZSBIRkEzODR4X0NSRUFURUlCU1NfSk9JTkNSRUFURUlCU1MgICAgICAgICAgMApAQCAtMTEyMCw4NyArMTA4NCw4NyBAQAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogRnJhZ21lbnRhdGlvblRocmVzaG9sZCAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0ZyYWdtZW50YXRpb25UaHJlc2hvbGQKIHsKLQlVSU5UMTYJRnJhZ21lbnRhdGlvblRocmVzaG9sZDsKKwl1MTYJRnJhZ21lbnRhdGlvblRocmVzaG9sZDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9GcmFnbWVudGF0aW9uVGhyZXNob2xkX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IFJUU1RocmVzaG9sZCAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X1JUU1RocmVzaG9sZAogewotCVVJTlQxNglSVFNUaHJlc2hvbGQ7CisJdTE2CVJUU1RocmVzaG9sZDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9SVFNUaHJlc2hvbGRfdDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogVHhSYXRlQ29udHJvbCAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X1R4UmF0ZUNvbnRyb2wKIHsKLQlVSU5UMTYJVHhSYXRlQ29udHJvbDsKKwl1MTYJVHhSYXRlQ29udHJvbDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9UeFJhdGVDb250cm9sX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IFByb21pc2N1b3VzTW9kZSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X1Byb21pc2N1b3VzTW9kZQogewotCVVJTlQxNglQcm9taXNjdW91c01vZGU7CisJdTE2CVByb21pc2N1b3VzTW9kZTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9Qcm9taXNjdW91c01vZGVfdDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogU2NhblJlcXVlc3QgKGRhdGEgcG9ydGlvbiBvbmx5KSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X1NjYW5SZXF1ZXN0X2RhdGEKIHsKLQlVSU5UMTYJY2hhbm5lbExpc3Q7Ci0JVUlOVDE2CXR4UmF0ZTsKKwl1MTYJY2hhbm5lbExpc3Q7CisJdTE2CXR4UmF0ZTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9TY2FuUmVxdWVzdF9kYXRhX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IEhvc3RTY2FuUmVxdWVzdCAoZGF0YSBwb3J0aW9uIG9ubHkpIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfSG9zdFNjYW5SZXF1ZXN0X2RhdGEKIHsKLQlVSU5UMTYJY2hhbm5lbExpc3Q7Ci0JVUlOVDE2CXR4UmF0ZTsKKwl1MTYJY2hhbm5lbExpc3Q7CisJdTE2CXR4UmF0ZTsKIAloZmEzODR4X2J5dGVzdHIzMl90IHNzaWQ7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfSG9zdFNjYW5SZXF1ZXN0X2RhdGFfdDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogSm9pblJlcXVlc3QgKGRhdGEgcG9ydGlvbiBvbmx5KSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0pvaW5SZXF1ZXN0X2RhdGEKIHsKLQlVSU5UOAlic3NpZFtXTEFOX0JTU0lEX0xFTl07Ci0JVUlOVDE2CWNoYW5uZWw7CisJdTgJYnNzaWRbV0xBTl9CU1NJRF9MRU5dOworCXUxNgljaGFubmVsOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0pvaW5SZXF1ZXN0X2RhdGFfdDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogYXV0aGVudGljYXRlU3RhdGlvbiAoZGF0YSBwb3J0aW9uIG9ubHkpIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfYXV0aGVudGljYXRlU3RhdGlvbl9kYXRhCiB7Ci0JVUlOVDgJYWRkcmVzc1tXTEFOX0FERFJfTEVOXTsKLQlVSU5UMTYJc3RhdHVzOwotCVVJTlQxNglhbGdvcml0aG07CisJdTgJYWRkcmVzc1tXTEFOX0FERFJfTEVOXTsKKwl1MTYJc3RhdHVzOworCXUxNglhbGdvcml0aG07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfYXV0aGVudGljYXRlU3RhdGlvbl9kYXRhX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGFzc29jaWF0ZVN0YXRpb24gKGRhdGEgcG9ydGlvbiBvbmx5KSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2Fzc29jaWF0ZVN0YXRpb25fZGF0YQogewotCVVJTlQ4CWFkZHJlc3NbV0xBTl9BRERSX0xFTl07Ci0JVUlOVDE2CXN0YXR1czsKLQlVSU5UMTYJdHlwZTsKKwl1OAlhZGRyZXNzW1dMQU5fQUREUl9MRU5dOworCXUxNglzdGF0dXM7CisJdTE2CXR5cGU7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfYXNzb2NpYXRlU3RhdGlvbl9kYXRhX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IENoYW5uZWxJbmZvUmVxdWVzdCAoZGF0YSBwb3J0aW9uIG9ubHkpIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQ2hhbm5lbEluZm9SZXF1ZXN0X2RhdGEKIHsKLQlVSU5UMTYJY2hhbm5lbExpc3Q7Ci0JVUlOVDE2CWNoYW5uZWxEd2VsbFRpbWU7CisJdTE2CWNoYW5uZWxMaXN0OworCXUxNgljaGFubmVsRHdlbGxUaW1lOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0NoYW5uZWxJbmZvUmVxdWVzdF9kYXRhX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IFdFUEtleU1hcHBpbmcgKGRhdGEgcG9ydGlvbiBvbmx5KSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X1dFUEtleU1hcHBpbmcKIHsKLQlVSU5UOAlhZGRyZXNzW1dMQU5fQUREUl9MRU5dOwotCVVJTlQxNglrZXlfaW5kZXg7Ci0JVUlOVDggCWtleVsxNl07Ci0JVUlOVDggCW1pY190cmFuc21pdF9rZXlbNF07Ci0JVUlOVDggCW1pY19yZWNlaXZlX2tleVs0XTsKKwl1OAlhZGRyZXNzW1dMQU5fQUREUl9MRU5dOworCXUxNglrZXlfaW5kZXg7CisJdTggCWtleVsxNl07CisJdTggCW1pY190cmFuc21pdF9rZXlbNF07CisJdTggCW1pY19yZWNlaXZlX2tleVs0XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9XRVBLZXlNYXBwaW5nX3Q7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IFdQQURhdGEgICAgICAgKGRhdGEgcG9ydGlvbiBvbmx5KSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X1dQQURhdGEKIHsKLQlVSU5UMTYJZGF0YWxlbjsKLSAgICAgICAgVUlOVDggCWRhdGFbMF07IC8vIG1heCA4MAorCXUxNglkYXRhbGVuOworICAgICAgICB1OCAJZGF0YVswXTsgLy8gbWF4IDgwCiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfV1BBRGF0YV90OwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMjEwLDcgKzExNzQsNyBAQAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogVGlja1RpbWUgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9UaWNrVGltZQogewotCVVJTlQxNglUaWNrVGltZTsKKwl1MTYJVGlja1RpbWU7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfVGlja1RpbWVfdDsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTIyMCwxNDYgKzExODQsMTQ2IEBACiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogTWF4TG9hZFRpbWUgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9NYXhMb2FkVGltZQogewotCVVJTlQxNglNYXhMb2FkVGltZTsKKwl1MTYJTWF4TG9hZFRpbWU7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfTWF4TG9hZFRpbWVfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IERvd25Mb2FkQnVmZmVyIC0tKi8KIC8qIE5PVEU6IFRoZSBwYWdlIGFuZCBvZmZzZXQgYXJlIGluIEFVWCBmb3JtYXQgKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfZG93bmxvYWRidWZmZXIKIHsKLQlVSU5UMTYJcGFnZTsKLQlVSU5UMTYJb2Zmc2V0OwotCVVJTlQxNglsZW47CisJdTE2CXBhZ2U7CisJdTE2CW9mZnNldDsKKwl1MTYJbGVuOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2Rvd25sb2FkYnVmZmVyX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBQUklJZGVudGl0eSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X1BSSUlkZW50aXR5CiB7Ci0JVUlOVDE2CVBSSUNvbXBJRDsKLQlVSU5UMTYJUFJJVmFyaWFudDsKLQlVSU5UMTYJUFJJTWFqb3JWZXJzaW9uOwotCVVJTlQxNglQUklNaW5vclZlcnNpb247CisJdTE2CVBSSUNvbXBJRDsKKwl1MTYJUFJJVmFyaWFudDsKKwl1MTYJUFJJTWFqb3JWZXJzaW9uOworCXUxNglQUklNaW5vclZlcnNpb247CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfUFJJSWRlbnRpdHlfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IFBSSVN1cFJhbmdlIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfUFJJU3VwUmFuZ2UKIHsKLQlVSU5UMTYJUFJJUm9sZTsKLQlVSU5UMTYJUFJJSUQ7Ci0JVUlOVDE2CVBSSVZhcmlhbnQ7Ci0JVUlOVDE2CVBSSUJvdHRvbTsKLQlVSU5UMTYJUFJJVG9wOworCXUxNglQUklSb2xlOworCXUxNglQUklJRDsKKwl1MTYJUFJJVmFyaWFudDsKKwl1MTYJUFJJQm90dG9tOworCXUxNglQUklUb3A7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfUFJJU3VwUmFuZ2VfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IENGSUFjdFJhbmdlcyAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0NGSUFjdFJhbmdlcwogewotCVVJTlQxNglDRklSb2xlOwotCVVJTlQxNglDRklJRDsKLQlVSU5UMTYJQ0ZJVmFyaWFudDsKLQlVSU5UMTYJQ0ZJQm90dG9tOwotCVVJTlQxNglDRklUb3A7CisJdTE2CUNGSVJvbGU7CisJdTE2CUNGSUlEOworCXUxNglDRklWYXJpYW50OworCXUxNglDRklCb3R0b207CisJdTE2CUNGSVRvcDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9DRklBY3RSYW5nZXNfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IE5JQ1NlcmlhbE51bWJlciAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X05JQ1NlcmlhbE51bWJlcgogewotCVVJTlQ4CU5JQ1NlcmlhbE51bWJlclsxMl07CisJdTgJTklDU2VyaWFsTnVtYmVyWzEyXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9OSUNTZXJpYWxOdW1iZXJfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IE5JQ0lkZW50aXR5IC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfTklDSWRlbnRpdHkKIHsKLQlVSU5UMTYJTklDQ29tcElEOwotCVVJTlQxNglOSUNWYXJpYW50OwotCVVJTlQxNglOSUNNYWpvclZlcnNpb247Ci0JVUlOVDE2CU5JQ01pbm9yVmVyc2lvbjsKKwl1MTYJTklDQ29tcElEOworCXUxNglOSUNWYXJpYW50OworCXUxNglOSUNNYWpvclZlcnNpb247CisJdTE2CU5JQ01pbm9yVmVyc2lvbjsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9OSUNJZGVudGl0eV90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogTUZJU3VwUmFuZ2UgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9NRklTdXBSYW5nZQogewotCVVJTlQxNglNRklSb2xlOwotCVVJTlQxNglNRklJRDsKLQlVSU5UMTYJTUZJVmFyaWFudDsKLQlVSU5UMTYJTUZJQm90dG9tOwotCVVJTlQxNglNRklUb3A7CisJdTE2CU1GSVJvbGU7CisJdTE2CU1GSUlEOworCXUxNglNRklWYXJpYW50OworCXUxNglNRklCb3R0b207CisJdTE2CU1GSVRvcDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9NRklTdXBSYW5nZV90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogQ0ZJU3VwUmFuZ2UgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9DRklTdXBSYW5nZQogewotCVVJTlQxNglDRklSb2xlOwotCVVJTlQxNglDRklJRDsKLQlVSU5UMTYJQ0ZJVmFyaWFudDsKLQlVSU5UMTYJQ0ZJQm90dG9tOwotCVVJTlQxNglDRklUb3A7CisJdTE2CUNGSVJvbGU7CisJdTE2CUNGSUlEOworCXUxNglDRklWYXJpYW50OworCXUxNglDRklCb3R0b207CisJdTE2CUNGSVRvcDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9DRklTdXBSYW5nZV90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogQlVJTERTRVE6QnVpbGRTZXEgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9CdWlsZFNlcSB7Ci0JVUlOVDE2CXByaW1hcnk7Ci0JVUlOVDE2CXNlY29uZGFyeTsKKwl1MTYJcHJpbWFyeTsKKwl1MTYJc2Vjb25kYXJ5OwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0J1aWxkU2VxX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBGV0lEIC0tKi8KICNkZWZpbmUgSEZBMzg0eF9GV0lEX0xFTgkxNAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9GV0lEIHsKLQlVSU5UOAlwcmltYXJ5W0hGQTM4NHhfRldJRF9MRU5dOwotCVVJTlQ4CXNlY29uZGFyeVtIRkEzODR4X0ZXSURfTEVOXTsKKwl1OAlwcmltYXJ5W0hGQTM4NHhfRldJRF9MRU5dOworCXU4CXNlY29uZGFyeVtIRkEzODR4X0ZXSURfTEVOXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9GV0lEX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBDaGFubmVsTGlzdCAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0NoYW5uZWxMaXN0CiB7Ci0JVUlOVDE2CUNoYW5uZWxMaXN0OworCXUxNglDaGFubmVsTGlzdDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9DaGFubmVsTGlzdF90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogUmVndWxhdG9yeURvbWFpbnMgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9SZWd1bGF0b3J5RG9tYWlucwogewotCVVJTlQ4CVJlZ3VsYXRvcnlEb21haW5zWzEyXTsKKwl1OAlSZWd1bGF0b3J5RG9tYWluc1sxMl07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfUmVndWxhdG9yeURvbWFpbnNfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IFRlbXBUeXBlIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfVGVtcFR5cGUKIHsKLQlVSU5UMTYJVGVtcFR5cGU7CisJdTE2CVRlbXBUeXBlOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1RlbXBUeXBlX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBDSVMgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9DSVMKIHsKLQlVSU5UOAlDSVNbNDgwXTsKKwl1OAlDSVNbNDgwXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9DSVNfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IFNUQUlkZW50aXR5IC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfU1RBSWRlbnRpdHkKIHsKLQlVSU5UMTYJU1RBQ29tcElEOwotCVVJTlQxNglTVEFWYXJpYW50OwotCVVJTlQxNglTVEFNYWpvclZlcnNpb247Ci0JVUlOVDE2CVNUQU1pbm9yVmVyc2lvbjsKKwl1MTYJU1RBQ29tcElEOworCXUxNglTVEFWYXJpYW50OworCXUxNglTVEFNYWpvclZlcnNpb247CisJdTE2CVNUQU1pbm9yVmVyc2lvbjsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9TVEFJZGVudGl0eV90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogU1RBU3VwUmFuZ2UgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9TVEFTdXBSYW5nZQogewotCVVJTlQxNglTVEFSb2xlOwotCVVJTlQxNglTVEFJRDsKLQlVSU5UMTYJU1RBVmFyaWFudDsKLQlVSU5UMTYJU1RBQm90dG9tOwotCVVJTlQxNglTVEFUb3A7CisJdTE2CVNUQVJvbGU7CisJdTE2CVNUQUlEOworCXUxNglTVEFWYXJpYW50OworCXUxNglTVEFCb3R0b207CisJdTE2CVNUQVRvcDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9TVEFTdXBSYW5nZV90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogTUZJQWN0UmFuZ2VzIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfTUZJQWN0UmFuZ2VzCiB7Ci0JVUlOVDE2CU1GSVJvbGU7Ci0JVUlOVDE2CU1GSUlEOwotCVVJTlQxNglNRklWYXJpYW50OwotCVVJTlQxNglNRklCb3R0b207Ci0JVUlOVDE2CU1GSVRvcDsKKwl1MTYJTUZJUm9sZTsKKwl1MTYJTUZJSUQ7CisJdTE2CU1GSVZhcmlhbnQ7CisJdTE2CU1GSUJvdHRvbTsKKwl1MTYJTUZJVG9wOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X01GSUFjdFJhbmdlc190OwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMzY5LDE0NSArMTMzMywxNDUgQEAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBQb3J0U3RhdHVzIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfUG9ydFN0YXR1cwogewotCVVJTlQxNglQb3J0U3RhdHVzOworCXUxNglQb3J0U3RhdHVzOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1BvcnRTdGF0dXNfdDsKIAotI2RlZmluZSBIRkEzODR4X1BTVEFUVVNfRElTQUJMRUQJKChVSU5UMTYpMSkKLSNkZWZpbmUgSEZBMzg0eF9QU1RBVFVTX1NFQVJDSElORwkoKFVJTlQxNikyKQotI2RlZmluZSBIRkEzODR4X1BTVEFUVVNfQ09OTl9JQlNTCSgoVUlOVDE2KTMpCi0jZGVmaW5lIEhGQTM4NHhfUFNUQVRVU19DT05OX0VTUwkoKFVJTlQxNik0KQotI2RlZmluZSBIRkEzODR4X1BTVEFUVVNfT1VUT0ZSQU5HRQkoKFVJTlQxNik1KQotI2RlZmluZSBIRkEzODR4X1BTVEFUVVNfQ09OTl9XRFMJKChVSU5UMTYpNikKKyNkZWZpbmUgSEZBMzg0eF9QU1RBVFVTX0RJU0FCTEVECSgodTE2KTEpCisjZGVmaW5lIEhGQTM4NHhfUFNUQVRVU19TRUFSQ0hJTkcJKCh1MTYpMikKKyNkZWZpbmUgSEZBMzg0eF9QU1RBVFVTX0NPTk5fSUJTUwkoKHUxNikzKQorI2RlZmluZSBIRkEzODR4X1BTVEFUVVNfQ09OTl9FU1MJKCh1MTYpNCkKKyNkZWZpbmUgSEZBMzg0eF9QU1RBVFVTX09VVE9GUkFOR0UJKCh1MTYpNSkKKyNkZWZpbmUgSEZBMzg0eF9QU1RBVFVTX0NPTk5fV0RTCSgodTE2KTYpCiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBDdXJyZW50U1NJRCAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0N1cnJlbnRTU0lECiB7Ci0JVUlOVDgJQ3VycmVudFNTSURbMzRdOworCXU4CUN1cnJlbnRTU0lEWzM0XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9DdXJyZW50U1NJRF90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogQ3VycmVudEJTU0lEIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQ3VycmVudEJTU0lECiB7Ci0JVUlOVDgJQ3VycmVudEJTU0lEWzZdOworCXU4CUN1cnJlbnRCU1NJRFs2XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9DdXJyZW50QlNTSURfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IGNvbW1zcXVhbGl0eSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2NvbW1zcXVhbGl0eQogewotCVVJTlQxNglDUV9jdXJyQlNTOwotCVVJTlQxNglBU0xfY3VyckJTUzsKLQlVSU5UMTYJQU5MX2N1cnJGQzsKKwl1MTYJQ1FfY3VyckJTUzsKKwl1MTYJQVNMX2N1cnJCU1M7CisJdTE2CUFOTF9jdXJyRkM7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfY29tbXNxdWFsaXR5X3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBkbWJjb21tc3F1YWxpdHkgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9kYm1jb21tc3F1YWxpdHkKIHsKLQlVSU5UMTYJQ1FkYm1fY3VyckJTUzsKLQlVSU5UMTYJQVNMZGJtX2N1cnJCU1M7Ci0JVUlOVDE2CUFOTGRibV9jdXJyRkM7CisJdTE2CUNRZGJtX2N1cnJCU1M7CisJdTE2CUFTTGRibV9jdXJyQlNTOworCXUxNglBTkxkYm1fY3VyckZDOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X2RibWNvbW1zcXVhbGl0eV90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogQ3VycmVudFR4UmF0ZSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0N1cnJlbnRUeFJhdGUKIHsKLQlVSU5UMTYJQ3VycmVudFR4UmF0ZTsKKwl1MTYJQ3VycmVudFR4UmF0ZTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9DdXJyZW50VHhSYXRlX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBDdXJyZW50QmVhY29uSW50ZXJ2YWwgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9DdXJyZW50QmVhY29uSW50ZXJ2YWwKIHsKLQlVSU5UMTYJQ3VycmVudEJlYWNvbkludGVydmFsOworCXUxNglDdXJyZW50QmVhY29uSW50ZXJ2YWw7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfQ3VycmVudEJlYWNvbkludGVydmFsX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBDdXJyZW50U2NhbGVUaHJlc2hvbGRzIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQ3VycmVudFNjYWxlVGhyZXNob2xkcwogewotCVVJTlQxNglFbmVyZ3lEZXRlY3RUaHJlc2hvbGQ7Ci0JVUlOVDE2CUNhcnJpZXJEZXRlY3RUaHJlc2hvbGQ7Ci0JVUlOVDE2CURlZmVyRGV0ZWN0VGhyZXNob2xkOwotCVVJTlQxNglDZWxsU2VhcmNoVGhyZXNob2xkOyAvKiBTdGF0aW9ucyBvbmx5ICovCi0JVUlOVDE2CURlYWRTcG90VGhyZXNob2xkOyAvKiBTdGF0aW9ucyBvbmx5ICovCisJdTE2CUVuZXJneURldGVjdFRocmVzaG9sZDsKKwl1MTYJQ2FycmllckRldGVjdFRocmVzaG9sZDsKKwl1MTYJRGVmZXJEZXRlY3RUaHJlc2hvbGQ7CisJdTE2CUNlbGxTZWFyY2hUaHJlc2hvbGQ7IC8qIFN0YXRpb25zIG9ubHkgKi8KKwl1MTYJRGVhZFNwb3RUaHJlc2hvbGQ7IC8qIFN0YXRpb25zIG9ubHkgKi8KIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9DdXJyZW50U2NhbGVUaHJlc2hvbGRzX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBQcm90b2NvbFJzcFRpbWUgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9Qcm90b2NvbFJzcFRpbWUKIHsKLQlVSU5UMTYJUHJvdG9jb2xSc3BUaW1lOworCXUxNglQcm90b2NvbFJzcFRpbWU7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfUHJvdG9jb2xSc3BUaW1lX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBTaG9ydFJldHJ5TGltaXQgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9TaG9ydFJldHJ5TGltaXQKIHsKLQlVSU5UMTYJU2hvcnRSZXRyeUxpbWl0OworCXUxNglTaG9ydFJldHJ5TGltaXQ7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfU2hvcnRSZXRyeUxpbWl0X3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBMb25nUmV0cnlMaW1pdCAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0xvbmdSZXRyeUxpbWl0CiB7Ci0JVUlOVDE2CUxvbmdSZXRyeUxpbWl0OworCXUxNglMb25nUmV0cnlMaW1pdDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9Mb25nUmV0cnlMaW1pdF90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogTWF4VHJhbnNtaXRMaWZldGltZSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X01heFRyYW5zbWl0TGlmZXRpbWUKIHsKLQlVSU5UMTYJTWF4VHJhbnNtaXRMaWZldGltZTsKKwl1MTYJTWF4VHJhbnNtaXRMaWZldGltZTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9NYXhUcmFuc21pdExpZmV0aW1lX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBNYXhSZWNlaXZlTGlmZXRpbWUgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9NYXhSZWNlaXZlTGlmZXRpbWUKIHsKLQlVSU5UMTYJTWF4UmVjZWl2ZUxpZmV0aW1lOworCXUxNglNYXhSZWNlaXZlTGlmZXRpbWU7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfTWF4UmVjZWl2ZUxpZmV0aW1lX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBDRlBvbGxhYmxlIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQ0ZQb2xsYWJsZQogewotCVVJTlQxNglDRlBvbGxhYmxlOworCXUxNglDRlBvbGxhYmxlOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0NGUG9sbGFibGVfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IEF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtcyAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0F1dGhlbnRpY2F0aW9uQWxnb3JpdGhtcwogewotCVVJTlQxNglBdXRoZW50aWNhdGlvblR5cGU7Ci0JVUlOVDE2CVR5cGVFbmFibGVkOworCXUxNglBdXRoZW50aWNhdGlvblR5cGU7CisJdTE2CVR5cGVFbmFibGVkOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0F1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc190OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogQXV0aGVudGljYXRpb25BbGdvcml0aG1zCiAoZGF0YSBvbmx5IC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQXV0aGVudGljYXRpb25BbGdvcml0aG1zX2RhdGEKIHsKLQlVSU5UMTYJQXV0aGVudGljYXRpb25UeXBlOwotCVVJTlQxNglUeXBlRW5hYmxlZDsKKwl1MTYJQXV0aGVudGljYXRpb25UeXBlOworCXUxNglUeXBlRW5hYmxlZDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9BdXRoZW50aWNhdGlvbkFsZ29yaXRobXNfZGF0YV90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogUHJpdmFjeU9wdGlvbkltcGxlbWVudGVkIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfUHJpdmFjeU9wdGlvbkltcGxlbWVudGVkCiB7Ci0JVUlOVDE2CVByaXZhY3lPcHRpb25JbXBsZW1lbnRlZDsKKwl1MTYJUHJpdmFjeU9wdGlvbkltcGxlbWVudGVkOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1ByaXZhY3lPcHRpb25JbXBsZW1lbnRlZF90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogT3duTUFDQWRkcmVzcyAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X093bk1BQ0FkZHJlc3MKIHsKLQlVSU5UOAlPd25NQUNBZGRyZXNzWzZdOworCXU4CU93bk1BQ0FkZHJlc3NbNl07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfT3duTUFDQWRkcmVzc190OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogUENGSW5mbyAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X1BDRkluZm8KIHsKLQlVSU5UMTYJTWVkaXVtT2NjdXBhbmN5TGltaXQ7Ci0JVUlOVDE2CUNGUFBlcmlvZDsKLQlVSU5UMTYJQ0ZQTWF4RHVyYXRpb247Ci0JVUlOVDE2CUNGUEZsYWdzOworCXUxNglNZWRpdW1PY2N1cGFuY3lMaW1pdDsKKwl1MTYJQ0ZQUGVyaW9kOworCXUxNglDRlBNYXhEdXJhdGlvbjsKKwl1MTYJQ0ZQRmxhZ3M7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfUENGSW5mb190OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogUENGSW5mbyAoZGF0YSBwb3J0aW9uIG9ubHkpIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfUENGSW5mb19kYXRhCiB7Ci0JVUlOVDE2CU1lZGl1bU9jY3VwYW5jeUxpbWl0OwotCVVJTlQxNglDRlBQZXJpb2Q7Ci0JVUlOVDE2CUNGUE1heER1cmF0aW9uOwotCVVJTlQxNglDRlBGbGFnczsKKwl1MTYJTWVkaXVtT2NjdXBhbmN5TGltaXQ7CisJdTE2CUNGUFBlcmlvZDsKKwl1MTYJQ0ZQTWF4RHVyYXRpb247CisJdTE2CUNGUEZsYWdzOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1BDRkluZm9fZGF0YV90OwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xNTE3LDM5ICsxNDgxLDM5IEBACiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogUEhZVHlwZSAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X1BIWVR5cGUKIHsKLQlVSU5UMTYJUEhZVHlwZTsKKwl1MTYJUEhZVHlwZTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9QSFlUeXBlX3Q7CiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBDdXJyZW50Q2hhbm5lbCAtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0N1cnJlbnRDaGFubmVsCiB7Ci0JVUlOVDE2CUN1cnJlbnRDaGFubmVsOworCXUxNglDdXJyZW50Q2hhbm5lbDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9DdXJyZW50Q2hhbm5lbF90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogQ3VycmVudFBvd2VyU3RhdGUgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9DdXJyZW50UG93ZXJTdGF0ZQogewotCVVJTlQxNglDdXJyZW50UG93ZXJTdGF0ZTsKKwl1MTYJQ3VycmVudFBvd2VyU3RhdGU7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfQ3VycmVudFBvd2VyU3RhdGVfdDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IENDQU1vZGUgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9DQ0FNb2RlCiB7Ci0JVUlOVDE2CUNDQU1vZGU7CisJdTE2CUNDQU1vZGU7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfQ0NBTW9kZV90OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogU3VwcG9ydGVkRGF0YVJhdGVzIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfU3VwcG9ydGVkRGF0YVJhdGVzCiB7Ci0JVUlOVDgJU3VwcG9ydGVkRGF0YVJhdGVzWzEwXTsKKwl1OAlTdXBwb3J0ZWREYXRhUmF0ZXNbMTBdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1N1cHBvcnRlZERhdGFSYXRlc190OwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogTEZPU3RhdHVzIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfTEZPU3RhdHVzCiB7Ci0JVUlOVDE2ICBUZXN0UmVzdWx0czsKLQlVSU5UMTYgIExGT1Jlc3VsdDsKLQlVSU5UMTYgIFZSSEZPUmVzdWx0OworCXUxNiAgVGVzdFJlc3VsdHM7CisJdTE2ICBMRk9SZXN1bHQ7CisJdTE2ICBWUkhGT1Jlc3VsdDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9MRk9TdGF0dXNfdDsKIAogI2RlZmluZSBIRkEzODR4X1RFU1RSRVNVTFRfQUxMUEFTU0VEICAgIEJJVDAKQEAgLTE1NjEsMTEgKzE1MjUsMTEgQEAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBMRURDb250cm9sIC0tKi8KIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfTEVEQ29udHJvbAogewotCVVJTlQxNiAgc2VhcmNoaW5nX29uOwotCVVJTlQxNiAgc2VhcmNoaW5nX29mZjsKLQlVSU5UMTYgIGFzc29jX29uOwotCVVJTlQxNiAgYXNzb2Nfb2ZmOwotCVVJTlQxNiAgYWN0aXZpdHk7CisJdTE2ICBzZWFyY2hpbmdfb247CisJdTE2ICBzZWFyY2hpbmdfb2ZmOworCXUxNiAgYXNzb2Nfb247CisJdTE2ICBhc3NvY19vZmY7CisJdTE2ICBhY3Rpdml0eTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9MRURDb250cm9sX3Q7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE1NzYsMzIgKzE1NDAsMzIgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIENvbnRyb2wgSW5mbyAob2Zmc2V0IDQ0LTUxKQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9GRF9TVEFUVVNfT0ZGCQkJKChVSU5UMTYpMHg0NCkKLSNkZWZpbmUJCUhGQTM4NHhfRkRfVElNRV9PRkYJCQkoKFVJTlQxNikweDQ2KQotI2RlZmluZQkJSEZBMzg0eF9GRF9TV1NVUFBPUlRfT0ZGCQkoKFVJTlQxNikweDRBKQotI2RlZmluZQkJSEZBMzg0eF9GRF9TSUxFTkNFX09GRgkJCSgoVUlOVDE2KTB4NEEpCi0jZGVmaW5lCQlIRkEzODR4X0ZEX1NJR05BTF9PRkYJCQkoKFVJTlQxNikweDRCKQotI2RlZmluZQkJSEZBMzg0eF9GRF9SQVRFX09GRgkJCSgoVUlOVDE2KTB4NEMpCi0jZGVmaW5lCQlIRkEzODR4X0ZEX1JYRkxPV19PRkYJCQkoKFVJTlQxNikweDREKQotI2RlZmluZQkJSEZBMzg0eF9GRF9SRVNFUlZFRF9PRkYJCQkoKFVJTlQxNikweDRFKQotI2RlZmluZQkJSEZBMzg0eF9GRF9UWENPTlRST0xfT0ZGCQkoKFVJTlQxNikweDUwKQorI2RlZmluZQkJSEZBMzg0eF9GRF9TVEFUVVNfT0ZGCQkJKCh1MTYpMHg0NCkKKyNkZWZpbmUJCUhGQTM4NHhfRkRfVElNRV9PRkYJCQkoKHUxNikweDQ2KQorI2RlZmluZQkJSEZBMzg0eF9GRF9TV1NVUFBPUlRfT0ZGCQkoKHUxNikweDRBKQorI2RlZmluZQkJSEZBMzg0eF9GRF9TSUxFTkNFX09GRgkJCSgodTE2KTB4NEEpCisjZGVmaW5lCQlIRkEzODR4X0ZEX1NJR05BTF9PRkYJCQkoKHUxNikweDRCKQorI2RlZmluZQkJSEZBMzg0eF9GRF9SQVRFX09GRgkJCSgodTE2KTB4NEMpCisjZGVmaW5lCQlIRkEzODR4X0ZEX1JYRkxPV19PRkYJCQkoKHUxNikweDREKQorI2RlZmluZQkJSEZBMzg0eF9GRF9SRVNFUlZFRF9PRkYJCQkoKHUxNikweDRFKQorI2RlZmluZQkJSEZBMzg0eF9GRF9UWENPTlRST0xfT0ZGCQkoKHUxNikweDUwKQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogODAyLjExIEhlYWRlciAob2Zmc2V0IDUyLTZCKQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9GRF9GUkFNRUNPTlRST0xfT0ZGCQkoKFVJTlQxNikweDUyKQotI2RlZmluZQkJSEZBMzg0eF9GRF9EVVJBVElPTklEX09GRgkJKChVSU5UMTYpMHg1NCkKLSNkZWZpbmUJCUhGQTM4NHhfRkRfQUREUkVTUzFfT0ZGCQkJKChVSU5UMTYpMHg1NikKLSNkZWZpbmUJCUhGQTM4NHhfRkRfQUREUkVTUzJfT0ZGCQkJKChVSU5UMTYpMHg1QykKLSNkZWZpbmUJCUhGQTM4NHhfRkRfQUREUkVTUzNfT0ZGCQkJKChVSU5UMTYpMHg2MikKLSNkZWZpbmUJCUhGQTM4NHhfRkRfU0VRQ09OVFJPTF9PRkYJCSgoVUlOVDE2KTB4NjgpCi0jZGVmaW5lCQlIRkEzODR4X0ZEX0FERFJFU1M0X09GRgkJCSgoVUlOVDE2KTB4NkEpCi0jZGVmaW5lCQlIRkEzODR4X0ZEX0RBVEFMRU5fT0ZGCQkJKChVSU5UMTYpMHg3MCkKKyNkZWZpbmUJCUhGQTM4NHhfRkRfRlJBTUVDT05UUk9MX09GRgkJKCh1MTYpMHg1MikKKyNkZWZpbmUJCUhGQTM4NHhfRkRfRFVSQVRJT05JRF9PRkYJCSgodTE2KTB4NTQpCisjZGVmaW5lCQlIRkEzODR4X0ZEX0FERFJFU1MxX09GRgkJCSgodTE2KTB4NTYpCisjZGVmaW5lCQlIRkEzODR4X0ZEX0FERFJFU1MyX09GRgkJCSgodTE2KTB4NUMpCisjZGVmaW5lCQlIRkEzODR4X0ZEX0FERFJFU1MzX09GRgkJCSgodTE2KTB4NjIpCisjZGVmaW5lCQlIRkEzODR4X0ZEX1NFUUNPTlRST0xfT0ZGCQkoKHUxNikweDY4KQorI2RlZmluZQkJSEZBMzg0eF9GRF9BRERSRVNTNF9PRkYJCQkoKHUxNikweDZBKQorI2RlZmluZQkJSEZBMzg0eF9GRF9EQVRBTEVOX09GRgkJCSgodTE2KTB4NzApCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiA4MDIuMyBIZWFkZXIgKG9mZnNldCA3Mi03RikKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfRkRfREVTVEFERFJFU1NfT0ZGCQkoKFVJTlQxNikweDcyKQotI2RlZmluZQkJSEZBMzg0eF9GRF9TUkNBRERSRVNTX09GRgkJKChVSU5UMTYpMHg3OCkKLSNkZWZpbmUJCUhGQTM4NHhfRkRfREFUQUxFTkdUSF9PRkYJCSgoVUlOVDE2KTB4N0UpCisjZGVmaW5lCQlIRkEzODR4X0ZEX0RFU1RBRERSRVNTX09GRgkJKCh1MTYpMHg3MikKKyNkZWZpbmUJCUhGQTM4NHhfRkRfU1JDQUREUkVTU19PRkYJCSgodTE2KTB4NzgpCisjZGVmaW5lCQlIRkEzODR4X0ZEX0RBVEFMRU5HVEhfT0ZGCQkoKHUxNikweDdFKQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBGUkFNRSBTVFJVQ1RVUkVTOiBDb21tdW5pY2F0aW9uIEZyYW1lcwpAQCAtMTYxMSw2NyArMTU3NSw2NyBAQAogLyotLSBDb21tdW5pY2F0aW9uIEZyYW1lOiBUcmFuc21pdCBGcmFtZSBTdHJ1Y3R1cmUgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF90eF9mcmFtZQogewotCVVJTlQxNglzdGF0dXM7Ci0JVUlOVDE2CXJlc2VydmVkMTsKLQlVSU5UMTYJcmVzZXJ2ZWQyOwotCVVJTlQzMglzd19zdXBwb3J0OwotCVVJTlQ4CXR4X3JldHJ5Y291bnQ7Ci0JVUlOVDggICB0eF9yYXRlOwotCVVJTlQxNgl0eF9jb250cm9sOworCXUxNglzdGF0dXM7CisJdTE2CXJlc2VydmVkMTsKKwl1MTYJcmVzZXJ2ZWQyOworCXUzMglzd19zdXBwb3J0OworCXU4CXR4X3JldHJ5Y291bnQ7CisJdTggICB0eF9yYXRlOworCXUxNgl0eF9jb250cm9sOwogCiAJLyotLSA4MDIuMTEgSGVhZGVyIEluZm9ybWF0aW9uIC0tKi8KIAotCVVJTlQxNglmcmFtZV9jb250cm9sOwotCVVJTlQxNglkdXJhdGlvbl9pZDsKLQlVSU5UOAlhZGRyZXNzMVs2XTsKLQlVSU5UOAlhZGRyZXNzMls2XTsKLQlVSU5UOAlhZGRyZXNzM1s2XTsKLQlVSU5UMTYJc2VxdWVuY2VfY29udHJvbDsKLQlVSU5UOAlhZGRyZXNzNFs2XTsKLQlVSU5UMTYJZGF0YV9sZW47IC8qIGxpdHRsZSBlbmRpYW4gZm9ybWF0ICovCisJdTE2CWZyYW1lX2NvbnRyb2w7CisJdTE2CWR1cmF0aW9uX2lkOworCXU4CWFkZHJlc3MxWzZdOworCXU4CWFkZHJlc3MyWzZdOworCXU4CWFkZHJlc3MzWzZdOworCXUxNglzZXF1ZW5jZV9jb250cm9sOworCXU4CWFkZHJlc3M0WzZdOworCXUxNglkYXRhX2xlbjsgLyogbGl0dGxlIGVuZGlhbiBmb3JtYXQgKi8KIAogCS8qLS0gODAyLjMgSGVhZGVyIEluZm9ybWF0aW9uIC0tKi8KIAotCVVJTlQ4CWRlc3RfYWRkcls2XTsKLQlVSU5UOAlzcmNfYWRkcls2XTsKLQlVSU5UMTYJZGF0YV9sZW5ndGg7IC8qIGJpZyBlbmRpYW4gZm9ybWF0ICovCisJdTgJZGVzdF9hZGRyWzZdOworCXU4CXNyY19hZGRyWzZdOworCXUxNglkYXRhX2xlbmd0aDsgLyogYmlnIGVuZGlhbiBmb3JtYXQgKi8KIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF90eF9mcmFtZV90OwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogQ29tbXVuaWNhdGlvbiBGcmFtZXM6IEZpZWxkIE1hc2tzIGZvciBUcmFuc21pdCBGcmFtZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qLS0gU3RhdHVzIEZpZWxkIC0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfVFhTVEFUVVNfQUNLRVJSCQkJKChVSU5UMTYpQklUNSkKLSNkZWZpbmUJCUhGQTM4NHhfVFhTVEFUVVNfRk9STUVSUgkJKChVSU5UMTYpQklUMykKLSNkZWZpbmUJCUhGQTM4NHhfVFhTVEFUVVNfRElTQ09OCQkJKChVSU5UMTYpQklUMikKLSNkZWZpbmUJCUhGQTM4NHhfVFhTVEFUVVNfQUdFREVSUgkJKChVSU5UMTYpQklUMSkKLSNkZWZpbmUJCUhGQTM4NHhfVFhTVEFUVVNfUkVUUllFUlIJCSgoVUlOVDE2KUJJVDApCisjZGVmaW5lCQlIRkEzODR4X1RYU1RBVFVTX0FDS0VSUgkJCSgodTE2KUJJVDUpCisjZGVmaW5lCQlIRkEzODR4X1RYU1RBVFVTX0ZPUk1FUlIJCSgodTE2KUJJVDMpCisjZGVmaW5lCQlIRkEzODR4X1RYU1RBVFVTX0RJU0NPTgkJCSgodTE2KUJJVDIpCisjZGVmaW5lCQlIRkEzODR4X1RYU1RBVFVTX0FHRURFUlIJCSgodTE2KUJJVDEpCisjZGVmaW5lCQlIRkEzODR4X1RYU1RBVFVTX1JFVFJZRVJSCQkoKHUxNilCSVQwKQogLyotLSBUcmFuc21pdCBDb250cm9sIEZpZWxkIC0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfVFhfQ0ZQT0xMCQkJKChVSU5UMTYpQklUMTIpCi0jZGVmaW5lCQlIRkEzODR4X1RYX1BSU1QJCQkJKChVSU5UMTYpQklUMTEpCi0jZGVmaW5lCQlIRkEzODR4X1RYX01BQ1BPUlQJCQkoKFVJTlQxNikoQklUMTAgfCBCSVQ5IHwgQklUOCkpCi0jZGVmaW5lCQlIRkEzODR4X1RYX05PRU5DUllQVAkJCSgoVUlOVDE2KUJJVDcpCi0jZGVmaW5lCQlIRkEzODR4X1RYX1JFVFJZU1RSQVQJCQkoKFVJTlQxNikoQklUNiB8IEJJVDUpKQotI2RlZmluZQkJSEZBMzg0eF9UWF9TVFJVQ1RZUEUJCQkoKFVJTlQxNikoQklUNCB8IEJJVDMpKQotI2RlZmluZQkJSEZBMzg0eF9UWF9UWEVYCQkJCSgoVUlOVDE2KUJJVDIpCi0jZGVmaW5lCQlIRkEzODR4X1RYX1RYT0sJCQkJKChVSU5UMTYpQklUMSkKKyNkZWZpbmUJCUhGQTM4NHhfVFhfQ0ZQT0xMCQkJKCh1MTYpQklUMTIpCisjZGVmaW5lCQlIRkEzODR4X1RYX1BSU1QJCQkJKCh1MTYpQklUMTEpCisjZGVmaW5lCQlIRkEzODR4X1RYX01BQ1BPUlQJCQkoKHUxNikoQklUMTAgfCBCSVQ5IHwgQklUOCkpCisjZGVmaW5lCQlIRkEzODR4X1RYX05PRU5DUllQVAkJCSgodTE2KUJJVDcpCisjZGVmaW5lCQlIRkEzODR4X1RYX1JFVFJZU1RSQVQJCQkoKHUxNikoQklUNiB8IEJJVDUpKQorI2RlZmluZQkJSEZBMzg0eF9UWF9TVFJVQ1RZUEUJCQkoKHUxNikoQklUNCB8IEJJVDMpKQorI2RlZmluZQkJSEZBMzg0eF9UWF9UWEVYCQkJCSgodTE2KUJJVDIpCisjZGVmaW5lCQlIRkEzODR4X1RYX1RYT0sJCQkJKCh1MTYpQklUMSkKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIENvbW11bmljYXRpb24gRnJhbWVzOiBUZXN0L0dldC9TZXQgRmllbGQgVmFsdWVzIGZvciBUcmFuc21pdCBGcmFtZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qLS0gU3RhdHVzIEZpZWxkIC0tKi8KICNkZWZpbmUgSEZBMzg0eF9UWFNUQVRVU19JU0VSUk9SKHYpCVwKLQkoKChVSU5UMTYpKHYpKSZcCisJKCgodTE2KSh2KSkmXAogCShIRkEzODR4X1RYU1RBVFVTX0FDS0VSUnxIRkEzODR4X1RYU1RBVFVTX0ZPUk1FUlJ8XAogCUhGQTM4NHhfVFhTVEFUVVNfRElTQ09OfEhGQTM4NHhfVFhTVEFUVVNfQUdFREVSUnxcCiAJSEZBMzg0eF9UWFNUQVRVU19SRVRSWUVSUikpCiAKLSNkZWZpbmUJSEZBMzg0eF9UWFNUQVRVU19JU0FDS0VSUih2KQkoKFVJTlQxNikoKChVSU5UMTYpKHYpKSAmIEhGQTM4NHhfVFhTVEFUVVNfQUNLRVJSKSkKLSNkZWZpbmUJSEZBMzg0eF9UWFNUQVRVU19JU0ZPUk1FUlIodikJKChVSU5UMTYpKCgoVUlOVDE2KSh2KSkgJiBIRkEzODR4X1RYU1RBVFVTX0ZPUk1FUlIpKQotI2RlZmluZQlIRkEzODR4X1RYU1RBVFVTX0lTRElTQ09OKHYpCSgoVUlOVDE2KSgoKFVJTlQxNikodikpICYgSEZBMzg0eF9UWFNUQVRVU19ESVNDT04pKQotI2RlZmluZQlIRkEzODR4X1RYU1RBVFVTX0lTQUdFREVSUih2KQkoKFVJTlQxNikoKChVSU5UMTYpKHYpKSAmIEhGQTM4NHhfVFhTVEFUVVNfQUdFREVSUikpCi0jZGVmaW5lCUhGQTM4NHhfVFhTVEFUVVNfSVNSRVRSWUVSUih2KQkoKFVJTlQxNikoKChVSU5UMTYpKHYpKSAmIEhGQTM4NHhfVFhTVEFUVVNfUkVUUllFUlIpKQorI2RlZmluZQlIRkEzODR4X1RYU1RBVFVTX0lTQUNLRVJSKHYpCSgodTE2KSgoKHUxNikodikpICYgSEZBMzg0eF9UWFNUQVRVU19BQ0tFUlIpKQorI2RlZmluZQlIRkEzODR4X1RYU1RBVFVTX0lTRk9STUVSUih2KQkoKHUxNikoKCh1MTYpKHYpKSAmIEhGQTM4NHhfVFhTVEFUVVNfRk9STUVSUikpCisjZGVmaW5lCUhGQTM4NHhfVFhTVEFUVVNfSVNESVNDT04odikJKCh1MTYpKCgodTE2KSh2KSkgJiBIRkEzODR4X1RYU1RBVFVTX0RJU0NPTikpCisjZGVmaW5lCUhGQTM4NHhfVFhTVEFUVVNfSVNBR0VERVJSKHYpCSgodTE2KSgoKHUxNikodikpICYgSEZBMzg0eF9UWFNUQVRVU19BR0VERVJSKSkKKyNkZWZpbmUJSEZBMzg0eF9UWFNUQVRVU19JU1JFVFJZRVJSKHYpCSgodTE2KSgoKHUxNikodikpICYgSEZBMzg0eF9UWFNUQVRVU19SRVRSWUVSUikpCiAKLSNkZWZpbmUJSEZBMzg0eF9UWF9HRVQodixtLHMpCQkoKCgoVUlOVDE2KSh2KSkmKChVSU5UMTYpKG0pKSk+PigoVUlOVDE2KShzKSkpCi0jZGVmaW5lCUhGQTM4NHhfVFhfU0VUKHYsbSxzKQkJKCgoKFVJTlQxNikodikpPDwoKFVJTlQxNikocykpKSYoKFVJTlQxNikobSkpKQorI2RlZmluZQlIRkEzODR4X1RYX0dFVCh2LG0scykJCSgoKCh1MTYpKHYpKSYoKHUxNikobSkpKT4+KCh1MTYpKHMpKSkKKyNkZWZpbmUJSEZBMzg0eF9UWF9TRVQodixtLHMpCQkoKCgodTE2KSh2KSk8PCgodTE2KShzKSkpJigodTE2KShtKSkpCiAKICNkZWZpbmUJSEZBMzg0eF9UWF9DRlBPTExfR0VUKHYpCUhGQTM4NHhfVFhfR0VUKHYsIEhGQTM4NHhfVFhfQ0ZQT0xMLDEyKQogI2RlZmluZQlIRkEzODR4X1RYX0NGUE9MTF9TRVQodikJSEZBMzg0eF9UWF9TRVQodiwgSEZBMzg0eF9UWF9DRlBPTEwsMTIpCkBAIC0xNjk2LDcwICsxNjYwLDcwIEBACiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3J4X2ZyYW1lCiB7CiAJLyotLSBNQUMgcnggZGVzY3JpcHRvciAoaGZhMzg0eCBieXRlIG9yZGVyKSAtLSovCi0JVUlOVDE2CXN0YXR1czsKLQlVSU5UMzIJdGltZTsKLQlVSU5UOAlzaWxlbmNlOwotCVVJTlQ4CXNpZ25hbDsKLQlVSU5UOAlyYXRlOwotCVVJTlQ4CXJ4X2Zsb3c7Ci0JVUlOVDE2CXJlc2VydmVkMTsKLQlVSU5UMTYJcmVzZXJ2ZWQyOworCXUxNglzdGF0dXM7CisJdTMyCXRpbWU7CisJdTgJc2lsZW5jZTsKKwl1OAlzaWduYWw7CisJdTgJcmF0ZTsKKwl1OAlyeF9mbG93OworCXUxNglyZXNlcnZlZDE7CisJdTE2CXJlc2VydmVkMjsKIAogCS8qLS0gODAyLjExIEhlYWRlciBJbmZvcm1hdGlvbiAoODAyLjExIGJ5dGUgb3JkZXIpIC0tKi8KLQlVSU5UMTYJZnJhbWVfY29udHJvbDsKLQlVSU5UMTYJZHVyYXRpb25faWQ7Ci0JVUlOVDgJYWRkcmVzczFbNl07Ci0JVUlOVDgJYWRkcmVzczJbNl07Ci0JVUlOVDgJYWRkcmVzczNbNl07Ci0JVUlOVDE2CXNlcXVlbmNlX2NvbnRyb2w7Ci0JVUlOVDgJYWRkcmVzczRbNl07Ci0JVUlOVDE2CWRhdGFfbGVuOyAvKiBoZmEzODR4IChsaXR0bGUgZW5kaWFuKSBmb3JtYXQgKi8KKwl1MTYJZnJhbWVfY29udHJvbDsKKwl1MTYJZHVyYXRpb25faWQ7CisJdTgJYWRkcmVzczFbNl07CisJdTgJYWRkcmVzczJbNl07CisJdTgJYWRkcmVzczNbNl07CisJdTE2CXNlcXVlbmNlX2NvbnRyb2w7CisJdTgJYWRkcmVzczRbNl07CisJdTE2CWRhdGFfbGVuOyAvKiBoZmEzODR4IChsaXR0bGUgZW5kaWFuKSBmb3JtYXQgKi8KIAogCS8qLS0gODAyLjMgSGVhZGVyIEluZm9ybWF0aW9uIC0tKi8KLQlVSU5UOAlkZXN0X2FkZHJbNl07Ci0JVUlOVDgJc3JjX2FkZHJbNl07Ci0JVUlOVDE2CWRhdGFfbGVuZ3RoOyAvKiBJRUVFPyAoYmlnIGVuZGlhbikgZm9ybWF0ICovCisJdTgJZGVzdF9hZGRyWzZdOworCXU4CXNyY19hZGRyWzZdOworCXUxNglkYXRhX2xlbmd0aDsgLyogSUVFRT8gKGJpZyBlbmRpYW4pIGZvcm1hdCAqLwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3J4X2ZyYW1lX3Q7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBDb21tdW5pY2F0aW9uIEZyYW1lczogRmllbGQgTWFza3MgZm9yIFJlY2VpdmUgRnJhbWVzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKi0tIE9mZnNldHMgLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9SWF9EQVRBX0xFTl9PRkYJCQkoKFVJTlQxNik0NCkKLSNkZWZpbmUJCUhGQTM4NHhfUlhfODAyMTFIRFJfT0ZGCQkJKChVSU5UMTYpMTQpCi0jZGVmaW5lCQlIRkEzODR4X1JYX0RBVEFfT0ZGCQkJKChVSU5UMTYpNjApCisjZGVmaW5lCQlIRkEzODR4X1JYX0RBVEFfTEVOX09GRgkJCSgodTE2KTQ0KQorI2RlZmluZQkJSEZBMzg0eF9SWF84MDIxMUhEUl9PRkYJCQkoKHUxNikxNCkKKyNkZWZpbmUJCUhGQTM4NHhfUlhfREFUQV9PRkYJCQkoKHUxNik2MCkKIAogLyotLSBTdGF0dXMgRmllbGRzIC0tKi8KLSNkZWZpbmUJCUhGQTM4NHhfUlhTVEFUVVNfTVNHVFlQRQkJKChVSU5UMTYpKEJJVDE1IHwgQklUMTQgfCBCSVQxMykpCi0jZGVmaW5lCQlIRkEzODR4X1JYU1RBVFVTX01BQ1BPUlQJCSgoVUlOVDE2KShCSVQxMCB8IEJJVDkgfCBCSVQ4KSkKLSNkZWZpbmUJCUhGQTM4NHhfUlhTVEFUVVNfVU5ERUNSCQkJKChVSU5UMTYpQklUMSkKLSNkZWZpbmUJCUhGQTM4NHhfUlhTVEFUVVNfRkNTRVJSCQkJKChVSU5UMTYpQklUMCkKKyNkZWZpbmUJCUhGQTM4NHhfUlhTVEFUVVNfTVNHVFlQRQkJKCh1MTYpKEJJVDE1IHwgQklUMTQgfCBCSVQxMykpCisjZGVmaW5lCQlIRkEzODR4X1JYU1RBVFVTX01BQ1BPUlQJCSgodTE2KShCSVQxMCB8IEJJVDkgfCBCSVQ4KSkKKyNkZWZpbmUJCUhGQTM4NHhfUlhTVEFUVVNfVU5ERUNSCQkJKCh1MTYpQklUMSkKKyNkZWZpbmUJCUhGQTM4NHhfUlhTVEFUVVNfRkNTRVJSCQkJKCh1MTYpQklUMCkKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIENvbW11bmljYXRpb24gRnJhbWVzOiBUZXN0L0dldC9TZXQgRmllbGQgVmFsdWVzIGZvciBSZWNlaXZlIEZyYW1lcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9SWFNUQVRVU19NU0dUWVBFX0dFVCh2YWx1ZSkJKChVSU5UMTYpKCgoKFVJTlQxNikodmFsdWUpKSAmIEhGQTM4NHhfUlhTVEFUVVNfTVNHVFlQRSkgPj4gMTMpKQotI2RlZmluZQkJSEZBMzg0eF9SWFNUQVRVU19NU0dUWVBFX1NFVCh2YWx1ZSkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDEzKSkKLSNkZWZpbmUJCUhGQTM4NHhfUlhTVEFUVVNfTUFDUE9SVF9HRVQodmFsdWUpCSgoVUlOVDE2KSgoKChVSU5UMTYpKHZhbHVlKSkgJiBIRkEzODR4X1JYU1RBVFVTX01BQ1BPUlQpID4+IDgpKQotI2RlZmluZQkJSEZBMzg0eF9SWFNUQVRVU19NQUNQT1JUX1NFVCh2YWx1ZSkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpIDw8IDgpKQotI2RlZmluZQkJSEZBMzg0eF9SWFNUQVRVU19JU1VOREVDUih2YWx1ZSkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9SWFNUQVRVU19VTkRFQ1IpKQotI2RlZmluZQkJSEZBMzg0eF9SWFNUQVRVU19JU0ZDU0VSUih2YWx1ZSkJKChVSU5UMTYpKCgoVUlOVDE2KSh2YWx1ZSkpICYgSEZBMzg0eF9SWFNUQVRVU19GQ1NFUlIpKQorI2RlZmluZQkJSEZBMzg0eF9SWFNUQVRVU19NU0dUWVBFX0dFVCh2YWx1ZSkJKCh1MTYpKCgoKHUxNikodmFsdWUpKSAmIEhGQTM4NHhfUlhTVEFUVVNfTVNHVFlQRSkgPj4gMTMpKQorI2RlZmluZQkJSEZBMzg0eF9SWFNUQVRVU19NU0dUWVBFX1NFVCh2YWx1ZSkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpIDw8IDEzKSkKKyNkZWZpbmUJCUhGQTM4NHhfUlhTVEFUVVNfTUFDUE9SVF9HRVQodmFsdWUpCSgodTE2KSgoKCh1MTYpKHZhbHVlKSkgJiBIRkEzODR4X1JYU1RBVFVTX01BQ1BPUlQpID4+IDgpKQorI2RlZmluZQkJSEZBMzg0eF9SWFNUQVRVU19NQUNQT1JUX1NFVCh2YWx1ZSkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpIDw8IDgpKQorI2RlZmluZQkJSEZBMzg0eF9SWFNUQVRVU19JU1VOREVDUih2YWx1ZSkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9SWFNUQVRVU19VTkRFQ1IpKQorI2RlZmluZQkJSEZBMzg0eF9SWFNUQVRVU19JU0ZDU0VSUih2YWx1ZSkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpICYgSEZBMzg0eF9SWFNUQVRVU19GQ1NFUlIpKQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIEZSQU1FIFNUUlVDVFVSRVM6IEluZm9ybWF0aW9uIFR5cGVzIGFuZCBJbmZvcm1hdGlvbiBGcmFtZSBTdHJ1Y3R1cmVzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBJbmZvcm1hdGlvbiBUeXBlcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQkJSEZBMzg0eF9JVF9IQU5ET1ZFUkFERFIJCQkoKFVJTlQxNikweEYwMDBVTCkKLSNkZWZpbmUJCUhGQTM4NHhfSVRfSEFORE9WRVJERUFVVEhBRERSRVNTCSgoVUlOVDE2KTB4RjAwMVVMKS8vQVAgMS4zLjcKLSNkZWZpbmUJCUhGQTM4NHhfSVRfQ09NTVRBTExJRVMJCQkoKFVJTlQxNikweEYxMDBVTCkKLSNkZWZpbmUJCUhGQTM4NHhfSVRfU0NBTlJFU1VMVFMJCQkoKFVJTlQxNikweEYxMDFVTCkKLSNkZWZpbmUJCUhGQTM4NHhfSVRfQ0hJTkZPUkVTVUxUUwkJKChVSU5UMTYpMHhGMTAyVUwpCi0jZGVmaW5lCQlIRkEzODR4X0lUX0hPU1RTQ0FOUkVTVUxUUwkJKChVSU5UMTYpMHhGMTAzVUwpCi0jZGVmaW5lCQlIRkEzODR4X0lUX0xJTktTVEFUVVMJCQkoKFVJTlQxNikweEYyMDBVTCkKLSNkZWZpbmUJCUhGQTM4NHhfSVRfQVNTT0NTVEFUVVMJCQkoKFVJTlQxNikweEYyMDFVTCkKLSNkZWZpbmUJCUhGQTM4NHhfSVRfQVVUSFJFUQkJCSgoVUlOVDE2KTB4RjIwMlVMKQotI2RlZmluZQkJSEZBMzg0eF9JVF9QU1VTRVJDTlQJCQkoKFVJTlQxNikweEYyMDNVTCkKLSNkZWZpbmUJCUhGQTM4NHhfSVRfS0VZSURDSEFOR0VECQkJKChVSU5UMTYpMHhGMjA0VUwpCi0jZGVmaW5lCQlIRkEzODR4X0lUX0FTU09DUkVRICAgIAkJCSgoVUlOVDE2KTB4RjIwNVVMKQotI2RlZmluZQkJSEZBMzg0eF9JVF9NSUNGQUlMVVJFICAJCQkoKFVJTlQxNikweEYyMDZVTCkKKyNkZWZpbmUJCUhGQTM4NHhfSVRfSEFORE9WRVJBRERSCQkJKCh1MTYpMHhGMDAwVUwpCisjZGVmaW5lCQlIRkEzODR4X0lUX0hBTkRPVkVSREVBVVRIQUREUkVTUwkoKHUxNikweEYwMDFVTCkvL0FQIDEuMy43CisjZGVmaW5lCQlIRkEzODR4X0lUX0NPTU1UQUxMSUVTCQkJKCh1MTYpMHhGMTAwVUwpCisjZGVmaW5lCQlIRkEzODR4X0lUX1NDQU5SRVNVTFRTCQkJKCh1MTYpMHhGMTAxVUwpCisjZGVmaW5lCQlIRkEzODR4X0lUX0NISU5GT1JFU1VMVFMJCSgodTE2KTB4RjEwMlVMKQorI2RlZmluZQkJSEZBMzg0eF9JVF9IT1NUU0NBTlJFU1VMVFMJCSgodTE2KTB4RjEwM1VMKQorI2RlZmluZQkJSEZBMzg0eF9JVF9MSU5LU1RBVFVTCQkJKCh1MTYpMHhGMjAwVUwpCisjZGVmaW5lCQlIRkEzODR4X0lUX0FTU09DU1RBVFVTCQkJKCh1MTYpMHhGMjAxVUwpCisjZGVmaW5lCQlIRkEzODR4X0lUX0FVVEhSRVEJCQkoKHUxNikweEYyMDJVTCkKKyNkZWZpbmUJCUhGQTM4NHhfSVRfUFNVU0VSQ05UCQkJKCh1MTYpMHhGMjAzVUwpCisjZGVmaW5lCQlIRkEzODR4X0lUX0tFWUlEQ0hBTkdFRAkJCSgodTE2KTB4RjIwNFVMKQorI2RlZmluZQkJSEZBMzg0eF9JVF9BU1NPQ1JFUSAgICAJCQkoKHUxNikweEYyMDVVTCkKKyNkZWZpbmUJCUhGQTM4NHhfSVRfTUlDRkFJTFVSRSAgCQkJKCh1MTYpMHhGMjA2VUwpCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIEluZm9ybWF0aW9uIEZyYW1lcyBTdHJ1Y3R1cmVzCkBAIC0xNzY5LDgwICsxNzMzLDgwIEBACiAvKi0tICBOb3RpZmljYXRpb24gRnJhbWUsTUFDIE1nbXQ6IEhhbmRvdmVyIEFkZHJlc3MgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9IYW5kb3ZlckFkZHIKIHsKLQlVSU5UMTYJZnJhbWVsZW47Ci0JVUlOVDE2CWluZm90eXBlOwotCVVJTlQ4CWhhbmRvdmVyX2FkZHJbV0xBTl9CU1NJRF9MRU5dOworCXUxNglmcmFtZWxlbjsKKwl1MTYJaW5mb3R5cGU7CisJdTgJaGFuZG92ZXJfYWRkcltXTEFOX0JTU0lEX0xFTl07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfSGFuZG92ZXJBZGRyX3Q7CiAKIC8qLS0gIElucXVpcnkgRnJhbWUsIERpYWdub3NlOiBDb21tdW5pY2F0aW9uIFRhbGxpZXMgLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9Db21tVGFsbGllczE2CiB7Ci0JVUlOVDE2CXR4dW5pY2FzdGZyYW1lczsKLQlVSU5UMTYJdHhtdWx0aWNhc3RmcmFtZXM7Ci0JVUlOVDE2CXR4ZnJhZ21lbnRzOwotCVVJTlQxNgl0eHVuaWNhc3RvY3RldHM7Ci0JVUlOVDE2CXR4bXVsdGljYXN0b2N0ZXRzOwotCVVJTlQxNgl0eGRlZmVycmVkdHJhbnM7Ci0JVUlOVDE2CXR4c2luZ2xlcmV0cnlmcmFtZXM7Ci0JVUlOVDE2CXR4bXVsdGlwbGVyZXRyeWZyYW1lczsKLQlVSU5UMTYJdHhyZXRyeWxpbWl0ZXhjZWVkZWQ7Ci0JVUlOVDE2CXR4ZGlzY2FyZHM7Ci0JVUlOVDE2CXJ4dW5pY2FzdGZyYW1lczsKLQlVSU5UMTYJcnhtdWx0aWNhc3RmcmFtZXM7Ci0JVUlOVDE2CXJ4ZnJhZ21lbnRzOwotCVVJTlQxNglyeHVuaWNhc3RvY3RldHM7Ci0JVUlOVDE2CXJ4bXVsdGljYXN0b2N0ZXRzOwotCVVJTlQxNglyeGZjc2Vycm9yczsKLQlVSU5UMTYJcnhkaXNjYXJkc25vYnVmZmVyOwotCVVJTlQxNgl0eGRpc2NhcmRzd3JvbmdzYTsKLQlVSU5UMTYJcnhkaXNjYXJkc3dlcHVuZGVjcjsKLQlVSU5UMTYJcnhtc2dpbm1zZ2ZyYWc7Ci0JVUlOVDE2CXJ4bXNnaW5iYWRtc2dmcmFnOworCXUxNgl0eHVuaWNhc3RmcmFtZXM7CisJdTE2CXR4bXVsdGljYXN0ZnJhbWVzOworCXUxNgl0eGZyYWdtZW50czsKKwl1MTYJdHh1bmljYXN0b2N0ZXRzOworCXUxNgl0eG11bHRpY2FzdG9jdGV0czsKKwl1MTYJdHhkZWZlcnJlZHRyYW5zOworCXUxNgl0eHNpbmdsZXJldHJ5ZnJhbWVzOworCXUxNgl0eG11bHRpcGxlcmV0cnlmcmFtZXM7CisJdTE2CXR4cmV0cnlsaW1pdGV4Y2VlZGVkOworCXUxNgl0eGRpc2NhcmRzOworCXUxNglyeHVuaWNhc3RmcmFtZXM7CisJdTE2CXJ4bXVsdGljYXN0ZnJhbWVzOworCXUxNglyeGZyYWdtZW50czsKKwl1MTYJcnh1bmljYXN0b2N0ZXRzOworCXUxNglyeG11bHRpY2FzdG9jdGV0czsKKwl1MTYJcnhmY3NlcnJvcnM7CisJdTE2CXJ4ZGlzY2FyZHNub2J1ZmZlcjsKKwl1MTYJdHhkaXNjYXJkc3dyb25nc2E7CisJdTE2CXJ4ZGlzY2FyZHN3ZXB1bmRlY3I7CisJdTE2CXJ4bXNnaW5tc2dmcmFnOworCXUxNglyeG1zZ2luYmFkbXNnZnJhZzsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9Db21tVGFsbGllczE2X3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQ29tbVRhbGxpZXMzMgogewotCVVJTlQzMgl0eHVuaWNhc3RmcmFtZXM7Ci0JVUlOVDMyCXR4bXVsdGljYXN0ZnJhbWVzOwotCVVJTlQzMgl0eGZyYWdtZW50czsKLQlVSU5UMzIJdHh1bmljYXN0b2N0ZXRzOwotCVVJTlQzMgl0eG11bHRpY2FzdG9jdGV0czsKLQlVSU5UMzIJdHhkZWZlcnJlZHRyYW5zOwotCVVJTlQzMgl0eHNpbmdsZXJldHJ5ZnJhbWVzOwotCVVJTlQzMgl0eG11bHRpcGxlcmV0cnlmcmFtZXM7Ci0JVUlOVDMyCXR4cmV0cnlsaW1pdGV4Y2VlZGVkOwotCVVJTlQzMgl0eGRpc2NhcmRzOwotCVVJTlQzMglyeHVuaWNhc3RmcmFtZXM7Ci0JVUlOVDMyCXJ4bXVsdGljYXN0ZnJhbWVzOwotCVVJTlQzMglyeGZyYWdtZW50czsKLQlVSU5UMzIJcnh1bmljYXN0b2N0ZXRzOwotCVVJTlQzMglyeG11bHRpY2FzdG9jdGV0czsKLQlVSU5UMzIJcnhmY3NlcnJvcnM7Ci0JVUlOVDMyCXJ4ZGlzY2FyZHNub2J1ZmZlcjsKLQlVSU5UMzIJdHhkaXNjYXJkc3dyb25nc2E7Ci0JVUlOVDMyCXJ4ZGlzY2FyZHN3ZXB1bmRlY3I7Ci0JVUlOVDMyCXJ4bXNnaW5tc2dmcmFnOwotCVVJTlQzMglyeG1zZ2luYmFkbXNnZnJhZzsKKwl1MzIJdHh1bmljYXN0ZnJhbWVzOworCXUzMgl0eG11bHRpY2FzdGZyYW1lczsKKwl1MzIJdHhmcmFnbWVudHM7CisJdTMyCXR4dW5pY2FzdG9jdGV0czsKKwl1MzIJdHhtdWx0aWNhc3RvY3RldHM7CisJdTMyCXR4ZGVmZXJyZWR0cmFuczsKKwl1MzIJdHhzaW5nbGVyZXRyeWZyYW1lczsKKwl1MzIJdHhtdWx0aXBsZXJldHJ5ZnJhbWVzOworCXUzMgl0eHJldHJ5bGltaXRleGNlZWRlZDsKKwl1MzIJdHhkaXNjYXJkczsKKwl1MzIJcnh1bmljYXN0ZnJhbWVzOworCXUzMglyeG11bHRpY2FzdGZyYW1lczsKKwl1MzIJcnhmcmFnbWVudHM7CisJdTMyCXJ4dW5pY2FzdG9jdGV0czsKKwl1MzIJcnhtdWx0aWNhc3RvY3RldHM7CisJdTMyCXJ4ZmNzZXJyb3JzOworCXUzMglyeGRpc2NhcmRzbm9idWZmZXI7CisJdTMyCXR4ZGlzY2FyZHN3cm9uZ3NhOworCXUzMglyeGRpc2NhcmRzd2VwdW5kZWNyOworCXUzMglyeG1zZ2lubXNnZnJhZzsKKwl1MzIJcnhtc2dpbmJhZG1zZ2ZyYWc7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfQ29tbVRhbGxpZXMzMl90OwogCiAvKi0tICBJbnF1aXJ5IEZyYW1lLCBEaWFnbm9zZTogU2NhbiBSZXN1bHRzICYgU3ViZmllbGRzLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9TY2FuUmVzdWx0U3ViCiB7Ci0JVUlOVDE2CWNoaWQ7Ci0JVUlOVDE2CWFubDsKLQlVSU5UMTYJc2w7Ci0JVUlOVDgJYnNzaWRbV0xBTl9CU1NJRF9MRU5dOwotCVVJTlQxNgliY25pbnQ7Ci0JVUlOVDE2CWNhcGluZm87CisJdTE2CWNoaWQ7CisJdTE2CWFubDsKKwl1MTYJc2w7CisJdTgJYnNzaWRbV0xBTl9CU1NJRF9MRU5dOworCXUxNgliY25pbnQ7CisJdTE2CWNhcGluZm87CiAJaGZhMzg0eF9ieXRlc3RyMzJfdAlzc2lkOwotCVVJTlQ4CXN1cHByYXRlc1sxMF07IC8qIDgwMi4xMSBpbmZvIGVsZW1lbnQgKi8KLQlVSU5UMTYJcHJvYmVyZXNwX3JhdGU7CisJdTgJc3VwcHJhdGVzWzEwXTsgLyogODAyLjExIGluZm8gZWxlbWVudCAqLworCXUxNglwcm9iZXJlc3BfcmF0ZTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9TY2FuUmVzdWx0U3ViX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfU2NhblJlc3VsdAogewotCVVJTlQxNglyc3ZkOwotCVVJTlQxNglzY2FucmVhc29uOworCXUxNglyc3ZkOworCXUxNglzY2FucmVhc29uOwogCWhmYTM4NHhfU2NhblJlc3VsdFN1Yl90CiAJCXJlc3VsdFtIRkEzODR4X1NDQU5SRVNVTFRfTUFYXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9TY2FuUmVzdWx0X3Q7CkBAIC0xODUwLDEwICsxODE0LDEwIEBACiAvKi0tICBJbnF1aXJ5IEZyYW1lLCBEaWFnbm9zZTogQ2hJbmZvIFJlc3VsdHMgJiBTdWJmaWVsZHMtLSovCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0NoSW5mb1Jlc3VsdFN1YgogewotCVVJTlQxNgljaGlkOwotCVVJTlQxNglhbmw7Ci0JVUlOVDE2CXBubDsKLQlVSU5UMTYJYWN0aXZlOworCXUxNgljaGlkOworCXUxNglhbmw7CisJdTE2CXBubDsKKwl1MTYJYWN0aXZlOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0NoSW5mb1Jlc3VsdFN1Yl90OwogCiAjZGVmaW5lIEhGQTM4NHhfQ0hJTkZPUkVTVUxUX0JTU0FDVElWRQlCSVQwCkBAIC0xODYxLDcgKzE4MjUsNyBAQAogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0NoSW5mb1Jlc3VsdAogewotCVVJTlQxNglzY2FuY2hhbm5lbHM7CisJdTE2CXNjYW5jaGFubmVsczsKIAloZmEzODR4X0NoSW5mb1Jlc3VsdFN1Yl90CiAJCXJlc3VsdFtIRkEzODR4X0NISU5GT1JFU1VMVF9NQVhdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0NoSW5mb1Jlc3VsdF90OwpAQCAtMTg2OSw3NSArMTgzMyw3NSBAQAogLyotLSAgSW5xdWlyeSBGcmFtZSwgRGlhZ25vc2U6IEhvc3QgU2NhbiBSZXN1bHRzICYgU3ViZmllbGRzLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9IU2NhblJlc3VsdFN1YgogewotCVVJTlQxNgljaGlkOwotCVVJTlQxNglhbmw7Ci0JVUlOVDE2CXNsOwotCVVJTlQ4CWJzc2lkW1dMQU5fQlNTSURfTEVOXTsKLQlVSU5UMTYJYmNuaW50OwotCVVJTlQxNgljYXBpbmZvOworCXUxNgljaGlkOworCXUxNglhbmw7CisJdTE2CXNsOworCXU4CWJzc2lkW1dMQU5fQlNTSURfTEVOXTsKKwl1MTYJYmNuaW50OworCXUxNgljYXBpbmZvOwogCWhmYTM4NHhfYnl0ZXN0cjMyX3QJc3NpZDsKLQlVSU5UOAlzdXBwcmF0ZXNbMTBdOyAvKiA4MDIuMTEgaW5mbyBlbGVtZW50ICovCi0JVUlOVDE2CXByb2JlcmVzcF9yYXRlOwotCVVJTlQxNglhdGltOworCXU4CXN1cHByYXRlc1sxMF07IC8qIDgwMi4xMSBpbmZvIGVsZW1lbnQgKi8KKwl1MTYJcHJvYmVyZXNwX3JhdGU7CisJdTE2CWF0aW07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfSFNjYW5SZXN1bHRTdWJfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9IU2NhblJlc3VsdAogewotCVVJTlQxNglucmVzdWx0OwotCVVJTlQxNglyc3ZkOworCXUxNglucmVzdWx0OworCXUxNglyc3ZkOwogCWhmYTM4NHhfSFNjYW5SZXN1bHRTdWJfdAogCQlyZXN1bHRbSEZBMzg0eF9IU0NBTlJFU1VMVF9NQVhdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0hTY2FuUmVzdWx0X3Q7CiAKIC8qLS0gIFVuc29saWNpdGVkIEZyYW1lLCBNQUMgTWdtdDogTGlua1N0YXR1cyAtLSovCiAKLSNkZWZpbmUgSEZBMzg0eF9MSU5LX05PVENPTk5FQ1RFRAkoKFVJTlQxNikwKQotI2RlZmluZSBIRkEzODR4X0xJTktfQ09OTkVDVEVECQkoKFVJTlQxNikxKQotI2RlZmluZSBIRkEzODR4X0xJTktfRElTQ09OTkVDVEVECSgoVUlOVDE2KTIpCi0jZGVmaW5lIEhGQTM4NHhfTElOS19BUF9DSEFOR0UJCSgoVUlOVDE2KTMpCi0jZGVmaW5lIEhGQTM4NHhfTElOS19BUF9PVVRPRlJBTkdFCSgoVUlOVDE2KTQpCi0jZGVmaW5lIEhGQTM4NHhfTElOS19BUF9JTlJBTkdFCQkoKFVJTlQxNik1KQotI2RlZmluZSBIRkEzODR4X0xJTktfQVNTT0NGQUlMCQkoKFVJTlQxNik2KQorI2RlZmluZSBIRkEzODR4X0xJTktfTk9UQ09OTkVDVEVECSgodTE2KTApCisjZGVmaW5lIEhGQTM4NHhfTElOS19DT05ORUNURUQJCSgodTE2KTEpCisjZGVmaW5lIEhGQTM4NHhfTElOS19ESVNDT05ORUNURUQJKCh1MTYpMikKKyNkZWZpbmUgSEZBMzg0eF9MSU5LX0FQX0NIQU5HRQkJKCh1MTYpMykKKyNkZWZpbmUgSEZBMzg0eF9MSU5LX0FQX09VVE9GUkFOR0UJKCh1MTYpNCkKKyNkZWZpbmUgSEZBMzg0eF9MSU5LX0FQX0lOUkFOR0UJCSgodTE2KTUpCisjZGVmaW5lIEhGQTM4NHhfTElOS19BU1NPQ0ZBSUwJCSgodTE2KTYpCiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfTGlua1N0YXR1cwogewotCVVJTlQxNglsaW5rc3RhdHVzOworCXUxNglsaW5rc3RhdHVzOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0xpbmtTdGF0dXNfdDsKIAogCiAvKi0tICBVbnNvbGljaXRlZCBGcmFtZSwgTUFDIE1nbXQ6IEFzc29jaWF0aW9uU3RhdHVzICgtLSovCiAKLSNkZWZpbmUgSEZBMzg0eF9BU1NPQ1NUQVRVU19TVEFBU1NPQwkoKFVJTlQxNikxKQotI2RlZmluZSBIRkEzODR4X0FTU09DU1RBVFVTX1JFQVNTT0MJKChVSU5UMTYpMikKLSNkZWZpbmUgSEZBMzg0eF9BU1NPQ1NUQVRVU19ESVNBU1NPQwkoKFVJTlQxNikzKQotI2RlZmluZSBIRkEzODR4X0FTU09DU1RBVFVTX0FTU09DRkFJTAkoKFVJTlQxNik0KQotI2RlZmluZSBIRkEzODR4X0FTU09DU1RBVFVTX0FVVEhGQUlMCSgoVUlOVDE2KTUpCisjZGVmaW5lIEhGQTM4NHhfQVNTT0NTVEFUVVNfU1RBQVNTT0MJKCh1MTYpMSkKKyNkZWZpbmUgSEZBMzg0eF9BU1NPQ1NUQVRVU19SRUFTU09DCSgodTE2KTIpCisjZGVmaW5lIEhGQTM4NHhfQVNTT0NTVEFUVVNfRElTQVNTT0MJKCh1MTYpMykKKyNkZWZpbmUgSEZBMzg0eF9BU1NPQ1NUQVRVU19BU1NPQ0ZBSUwJKCh1MTYpNCkKKyNkZWZpbmUgSEZBMzg0eF9BU1NPQ1NUQVRVU19BVVRIRkFJTAkoKHUxNik1KQogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0Fzc29jU3RhdHVzCiB7Ci0JVUlOVDE2CWFzc29jc3RhdHVzOwotCVVJTlQ4CXN0YV9hZGRyW1dMQU5fQUREUl9MRU5dOworCXUxNglhc3NvY3N0YXR1czsKKwl1OAlzdGFfYWRkcltXTEFOX0FERFJfTEVOXTsKIAkvKiBvbGRfYXBfYWRkciBpcyBvbmx5IHZhbGlkIGlmIGFzc29jc3RhdHVzID09IDIgKi8KLQlVSU5UOAlvbGRfYXBfYWRkcltXTEFOX0FERFJfTEVOXTsKLQlVSU5UMTYJcmVhc29uOwotCVVJTlQxNglyZXNlcnZlZDsKKwl1OAlvbGRfYXBfYWRkcltXTEFOX0FERFJfTEVOXTsKKwl1MTYJcmVhc29uOworCXUxNglyZXNlcnZlZDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9Bc3NvY1N0YXR1c190OwogCiAvKi0tICBVbnNvbGljaXRlZCBGcmFtZSwgTUFDIE1nbXQ6IEF1dGhSZXF1ZXN0IChBUCBPbmx5KSAtLSovCiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQXV0aFJlcXVlc3QKIHsKLQlVSU5UOAlzdGFfYWRkcltXTEFOX0FERFJfTEVOXTsKLQlVSU5UMTYJYWxnb3JpdGhtOworCXU4CXN0YV9hZGRyW1dMQU5fQUREUl9MRU5dOworCXUxNglhbGdvcml0aG07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfQXV0aFJlcV90OwogCiAvKi0tICBVbnNvbGljaXRlZCBGcmFtZSwgTUFDIE1nbXQ6IEFzc29jUmVxdWVzdCAoQVAgT25seSkgLS0qLwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0Fzc29jUmVxdWVzdAogewotCVVJTlQ4CXN0YV9hZGRyW1dMQU5fQUREUl9MRU5dOwotCVVJTlQxNgl0eXBlOwotCVVJTlQ4ICAgd3BhX2RhdGFbODBdOworCXU4CXN0YV9hZGRyW1dMQU5fQUREUl9MRU5dOworCXUxNgl0eXBlOworCXU4ICAgd3BhX2RhdGFbODBdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X0Fzc29jUmVxX3Q7CiAKIApAQCAtMTk0OCwyMSArMTkxMiwyMSBAQAogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X01pY0ZhaWx1cmUKIHsKLQlVSU5UOAlzZW5kZXJbV0xBTl9BRERSX0xFTl07Ci0JVUlOVDgJZGVzdFtXTEFOX0FERFJfTEVOXTsKKwl1OAlzZW5kZXJbV0xBTl9BRERSX0xFTl07CisJdTgJZGVzdFtXTEFOX0FERFJfTEVOXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9NaWNGYWlsdXJlX3Q7CiAKIC8qLS0gIFVuc29saWNpdGVkIEZyYW1lLCBNQUMgTWdtdDogUFNVc2VyQ291bnQgKEFQIE9ubHkpIC0tKi8KIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9QU1VzZXJDb3VudAogewotCVVJTlQxNgl1c2VyY250OworCXUxNgl1c2VyY250OwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X1BTVXNlckNvdW50X3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfS2V5SURDaGFuZ2VkCiB7Ci0JVUlOVDgJc3RhX2FkZHJbV0xBTl9BRERSX0xFTl07Ci0JVUlOVDE2CWtleWlkOworCXU4CXN0YV9hZGRyW1dMQU5fQUREUl9MRU5dOworCXUxNglrZXlpZDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9LZXlJRENoYW5nZWRfdDsKIAogLyotLSAgQ29sbGVjdGlvbiBvZiBhbGwgSW5mIGZyYW1lcyAtLS0tLS0tLS0tLS0tLS0qLwpAQCAtMTk4MSwxMiArMTk0NSwxMSBAQAogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X0luZkZyYW1lCiB7Ci0JVUlOVDE2CQkJZnJhbWVsZW47Ci0JVUlOVDE2CQkJaW5mb3R5cGU7CisJdTE2CQkJZnJhbWVsZW47CisJdTE2CQkJaW5mb3R5cGU7CiAJaGZhMzg0eF9pbmZvZGF0YV90CWluZm87CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfSW5mRnJhbWVfdDsKIAotI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1VTQikKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFVTQiBQYWNrZXQgc3RydWN0dXJlcyBhbmQgY29uc3RhbnRzLgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMjAyMCw0NiArMTk4Myw0NiBAQAogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3VzYl90eGZybSB7CiAJaGZhMzg0eF90eF9mcmFtZV90CWRlc2M7Ci0JVUlOVDgJCQlkYXRhW1dMQU5fREFUQV9NQVhMRU5dOworCXU4CQkJZGF0YVtXTEFOX0RBVEFfTUFYTEVOXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF91c2JfdHhmcm1fdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2JfY21kcmVxIHsKLQlVSU5UMTYJCXR5cGU7Ci0JVUlOVDE2CQljbWQ7Ci0JVUlOVDE2CQlwYXJtMDsKLQlVSU5UMTYJCXBhcm0xOwotCVVJTlQxNgkJcGFybTI7Ci0JVUlOVDgJCXBhZFs1NF07CisJdTE2CQl0eXBlOworCXUxNgkJY21kOworCXUxNgkJcGFybTA7CisJdTE2CQlwYXJtMTsKKwl1MTYJCXBhcm0yOworCXU4CQlwYWRbNTRdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3VzYl9jbWRyZXFfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2Jfd3JpZHJlcSB7Ci0JVUlOVDE2CQl0eXBlOwotCVVJTlQxNgkJZnJtbGVuOwotCVVJTlQxNgkJcmlkOwotCVVJTlQ4CQlkYXRhW0hGQTM4NHhfUklEREFUQV9NQVhMRU5dOworCXUxNgkJdHlwZTsKKwl1MTYJCWZybWxlbjsKKwl1MTYJCXJpZDsKKwl1OAkJZGF0YVtIRkEzODR4X1JJRERBVEFfTUFYTEVOXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF91c2Jfd3JpZHJlcV90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3VzYl9ycmlkcmVxIHsKLQlVSU5UMTYJCXR5cGU7Ci0JVUlOVDE2CQlmcm1sZW47Ci0JVUlOVDE2CQlyaWQ7Ci0JVUlOVDgJCXBhZFs1OF07CisJdTE2CQl0eXBlOworCXUxNgkJZnJtbGVuOworCXUxNgkJcmlkOworCXU4CQlwYWRbNThdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3VzYl9ycmlkcmVxX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfdXNiX3dtZW1yZXEgewotCVVJTlQxNgkJdHlwZTsKLQlVSU5UMTYJCWZybWxlbjsKLQlVSU5UMTYJCW9mZnNldDsKLQlVSU5UMTYJCXBhZ2U7Ci0JVUlOVDgJCWRhdGFbSEZBMzg0eF9VU0JfUldNRU1fTUFYTEVOXTsKKwl1MTYJCXR5cGU7CisJdTE2CQlmcm1sZW47CisJdTE2CQlvZmZzZXQ7CisJdTE2CQlwYWdlOworCXU4CQlkYXRhW0hGQTM4NHhfVVNCX1JXTUVNX01BWExFTl07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfdXNiX3dtZW1yZXFfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2Jfcm1lbXJlcSB7Ci0JVUlOVDE2CQl0eXBlOwotCVVJTlQxNgkJZnJtbGVuOwotCVVJTlQxNgkJb2Zmc2V0OwotCVVJTlQxNgkJcGFnZTsKLQlVSU5UOAkJcGFkWzU2XTsKKwl1MTYJCXR5cGU7CisJdTE2CQlmcm1sZW47CisJdTE2CQlvZmZzZXQ7CisJdTE2CQlwYWdlOworCXU4CQlwYWRbNTZdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3VzYl9ybWVtcmVxX3Q7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTIwNjcsNTQgKzIwMzAsNTQgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2Jfcnhmcm0gewogCWhmYTM4NHhfcnhfZnJhbWVfdAlkZXNjOwotCVVJTlQ4CQkJZGF0YVtXTEFOX0RBVEFfTUFYTEVOXTsKKwl1OAkJCWRhdGFbV0xBTl9EQVRBX01BWExFTl07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfdXNiX3J4ZnJtX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfdXNiX2luZm9mcm0gewotCVVJTlQxNgkJCXR5cGU7CisJdTE2CQkJdHlwZTsKIAloZmEzODR4X0luZkZyYW1lX3QJaW5mbzsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF91c2JfaW5mb2ZybV90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3VzYl9zdGF0dXNyZXNwIHsKLQlVSU5UMTYJCXR5cGU7Ci0JVUlOVDE2CQlzdGF0dXM7Ci0JVUlOVDE2CQlyZXNwMDsKLQlVSU5UMTYJCXJlc3AxOwotCVVJTlQxNgkJcmVzcDI7CisJdTE2CQl0eXBlOworCXUxNgkJc3RhdHVzOworCXUxNgkJcmVzcDA7CisJdTE2CQlyZXNwMTsKKwl1MTYJCXJlc3AyOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3VzYl9jbWRyZXNwX3Q7CiAKIHR5cGVkZWYgaGZhMzg0eF91c2JfY21kcmVzcF90IGhmYTM4NHhfdXNiX3dyaWRyZXNwX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfdXNiX3JyaWRyZXNwIHsKLQlVSU5UMTYJCXR5cGU7Ci0JVUlOVDE2CQlmcm1sZW47Ci0JVUlOVDE2CQlyaWQ7Ci0JVUlOVDgJCWRhdGFbSEZBMzg0eF9SSUREQVRBX01BWExFTl07CisJdTE2CQl0eXBlOworCXUxNgkJZnJtbGVuOworCXUxNgkJcmlkOworCXU4CQlkYXRhW0hGQTM4NHhfUklEREFUQV9NQVhMRU5dOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3VzYl9ycmlkcmVzcF90OwogCiB0eXBlZGVmIGhmYTM4NHhfdXNiX2NtZHJlc3BfdCBoZmEzODR4X3VzYl93bWVtcmVzcF90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3VzYl9ybWVtcmVzcCB7Ci0JVUlOVDE2CQl0eXBlOwotCVVJTlQxNgkJZnJtbGVuOwotCVVJTlQ4CQlkYXRhW0hGQTM4NHhfVVNCX1JXTUVNX01BWExFTl07CisJdTE2CQl0eXBlOworCXUxNgkJZnJtbGVuOworCXU4CQlkYXRhW0hGQTM4NHhfVVNCX1JXTUVNX01BWExFTl07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfdXNiX3JtZW1yZXNwX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfdXNiX2J1ZmF2YWlsIHsKLQlVSU5UMTYJCXR5cGU7Ci0JVUlOVDE2CQlmcm1sZW47CisJdTE2CQl0eXBlOworCXUxNgkJZnJtbGVuOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3VzYl9idWZhdmFpbF90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3VzYl9lcnJvciB7Ci0JVUlOVDE2CQl0eXBlOwotCVVJTlQxNgkJZXJyb3J0eXBlOworCXUxNgkJdHlwZTsKKwl1MTYJCWVycm9ydHlwZTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF91c2JfZXJyb3JfdDsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIFVuaW9ucyBmb3IgcGFja2FnaW5nIGFsbCB0aGUga25vd24gcGFja2V0IHR5cGVzIHRvZ2V0aGVyICovCiAKIHR5cGVkZWYgdW5pb24gaGZhMzg0eF91c2JvdXQgewotCVVJTlQxNgkJCXR5cGU7CisJdTE2CQkJdHlwZTsKIAloZmEzODR4X3VzYl90eGZybV90CXR4ZnJtOwogCWhmYTM4NHhfdXNiX2NtZHJlcV90CWNtZHJlcTsKIAloZmEzODR4X3VzYl93cmlkcmVxX3QJd3JpZHJlcTsKQEAgLTIxMjQsNyArMjA4Nyw3IEBACiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfdXNib3V0X3Q7CiAKIHR5cGVkZWYgdW5pb24gaGZhMzg0eF91c2JpbiB7Ci0JVUlOVDE2CQkJdHlwZTsKKwl1MTYJCQl0eXBlOwogCWhmYTM4NHhfdXNiX3J4ZnJtX3QJcnhmcm07CiAJaGZhMzg0eF91c2JfdHhmcm1fdAl0eGZybTsKIAloZmEzODR4X3VzYl9pbmZvZnJtX3QJaW5mb2ZybTsKQEAgLTIxMzUsMjggKzIwOTgsMjYgQEAKIAloZmEzODR4X3VzYl9ybWVtcmVzcF90CXJtZW1yZXNwOwogCWhmYTM4NHhfdXNiX2J1ZmF2YWlsX3QJYnVmYXZhaWw7CiAJaGZhMzg0eF91c2JfZXJyb3JfdAl1c2JlcnJvcjsKLQlVSU5UOAkJCWJvZ3VzcGFkWzMwMDBdOworCXU4CQkJYm9ndXNwYWRbMzAwMF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfdXNiaW5fdDsKIAotI2VuZGlmIC8qIFdMQU5fVVNCICovCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFBEIHJlY29yZCBzdHJ1Y3R1cmVzLgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9wY2JfcGFydG51bQogewotCVVJTlQ4CW51bVs4XTsKKwl1OAludW1bOF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX3BjYl9wYXJ0bnVtX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX3BjYl90cmFjZW51bQogewotCVVJTlQ4CW51bVs4XTsKKwl1OAludW1bOF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX3BjYl90cmFjZW51bV90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9uaWNfc2VyaWFsCiB7Ci0JVUlOVDgJbnVtWzEyXTsKKwl1OAludW1bMTJdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9uaWNfc2VyaWFsX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX21ra19tZWFzdXJlbWVudHMKQEAgLTIxODAsMTcwICsyMTQxLDE3MCBAQAogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9uaWNfcmFtc2l6ZQogewotCVVJTlQ4CXNpemVbMTJdOyAvKiB1bml0cyBvZiBLQiAqLworCXU4CXNpemVbMTJdOyAvKiB1bml0cyBvZiBLQiAqLwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9uaWNfcmFtc2l6ZV90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9tZmlzdXByYW5nZQogewotCVVJTlQxNglpZDsKLQlVSU5UMTYJdmFyaWFudDsKLQlVSU5UMTYJYm90dG9tOwotCVVJTlQxNgl0b3A7CisJdTE2CWlkOworCXUxNgl2YXJpYW50OworCXUxNglib3R0b207CisJdTE2CXRvcDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfbWZpc3VwcmFuZ2VfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfY2Zpc3VwcmFuZ2UKIHsKLQlVSU5UMTYJaWQ7Ci0JVUlOVDE2CXZhcmlhbnQ7Ci0JVUlOVDE2CWJvdHRvbTsKLQlVSU5UMTYJdG9wOworCXUxNglpZDsKKwl1MTYJdmFyaWFudDsKKwl1MTYJYm90dG9tOworCXUxNgl0b3A7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX2NmaXN1cHJhbmdlX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX25pY2lkCiB7Ci0JVUlOVDE2CWlkOwotCVVJTlQxNgl2YXJpYW50OwotCVVJTlQxNgltYWpvcjsKLQlVSU5UMTYJbWlub3I7CisJdTE2CWlkOworCXUxNgl2YXJpYW50OworCXUxNgltYWpvcjsKKwl1MTYJbWlub3I7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX25pY2lkX3Q7CiAKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfcmVmZGFjX21lYXN1cmVtZW50cwogewotCVVJTlQxNgl2YWx1ZVswXTsKKwl1MTYJdmFsdWVbMF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX3JlZmRhY19tZWFzdXJlbWVudHNfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfdmdkYWNfbWVhc3VyZW1lbnRzCiB7Ci0JVUlOVDE2CXZhbHVlWzBdOworCXUxNgl2YWx1ZVswXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfdmdkYWNfbWVhc3VyZW1lbnRzX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX2xldmVsX2NvbXBfbWVhc3VyZW1lbnRzCiB7Ci0JVUlOVDE2CXZhbHVlWzBdOworCXUxNgl2YWx1ZVswXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfbGV2ZWxfY29tcGNfbWVhc3VyZW1lbnRzX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX21hY19hZGRyZXNzCiB7Ci0JVUlOVDgJYWRkcls2XTsKKwl1OAlhZGRyWzZdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9tYWNfYWRkcmVzc190OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9ta2tfY2FsbG5hbWUKIHsKLQlVSU5UOAljYWxsbmFtZVs4XTsKKwl1OAljYWxsbmFtZVs4XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfbWtrX2NhbGxuYW1lX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX3JlZ2RvbWFpbgogewotCVVJTlQxNgludW1kb21haW5zOwotCVVJTlQxNglkb21haW5bNV07CisJdTE2CW51bWRvbWFpbnM7CisJdTE2CWRvbWFpbls1XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfcmVnZG9tYWluX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX2FsbG93ZWRfY2hhbm5lbAogewotCVVJTlQxNgljaF9iaXRtYXA7CisJdTE2CWNoX2JpdG1hcDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfYWxsb3dlZF9jaGFubmVsX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX2RlZmF1bHRfY2hhbm5lbAogewotCVVJTlQxNgljaGFubmVsOworCXUxNgljaGFubmVsOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9kZWZhdWx0X2NoYW5uZWxfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfcHJpdmFjeV9vcHRpb24KIHsKLQlVSU5UMTYJYXZhaWxhYmxlOworCXUxNglhdmFpbGFibGU7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX3ByaXZhY3lfb3B0aW9uX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX3RlbXB0eXBlCiB7Ci0JVUlOVDE2CXR5cGU7CisJdTE2CXR5cGU7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX3RlbXB0eXBlX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX3JlZmRhY19zZXR1cAogewotCVVJTlQxNgljaF92YWx1ZVsxNF07CisJdTE2CWNoX3ZhbHVlWzE0XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfcmVmZGFjX3NldHVwX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX3ZnZGFjX3NldHVwCiB7Ci0JVUlOVDE2CWNoX3ZhbHVlWzE0XTsKKwl1MTYJY2hfdmFsdWVbMTRdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl92Z2RhY19zZXR1cF90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9sZXZlbF9jb21wX3NldHVwCiB7Ci0JVUlOVDE2CWNoX3ZhbHVlWzE0XTsKKwl1MTYJY2hfdmFsdWVbMTRdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9sZXZlbF9jb21wX3NldHVwX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX3RyaW1kYWNfc2V0dXAKIHsKLQlVSU5UMTYJdHJpbWlkYWM7Ci0JVUlOVDE2CXRyaW1xZGFjOworCXUxNgl0cmltaWRhYzsKKwl1MTYJdHJpbXFkYWM7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX3RyaW1kYWNfc2V0dXBfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfaWZyX3NldHRpbmcKIHsKLQlVSU5UMTYJdmFsdWVbM107CisJdTE2CXZhbHVlWzNdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9pZnJfc2V0dGluZ190OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9yZnJfc2V0dGluZwogewotCVVJTlQxNgl2YWx1ZVszXTsKKwl1MTYJdmFsdWVbM107CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX3Jmcl9zZXR0aW5nX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX2hmYTM4NjFfYmFzZWxpbmUKIHsKLQlVSU5UMTYJdmFsdWVbNTBdOworCXUxNgl2YWx1ZVs1MF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX2hmYTM4NjFfYmFzZWxpbmVfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9zaGFkb3cKIHsKLQlVSU5UMzIJdmFsdWVbMzJdOworCXUzMgl2YWx1ZVszMl07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX2hmYTM4NjFfc2hhZG93X3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX2hmYTM4NjFfaWZyZgogewotCVVJTlQzMgl2YWx1ZVsyMF07CisJdTMyCXZhbHVlWzIwXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfaGZhMzg2MV9pZnJmX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX2hmYTM4NjFfY2hjYWxzcAogewotCVVJTlQxNgl2YWx1ZVsxNF07CisJdTE2CXZhbHVlWzE0XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfaGZhMzg2MV9jaGNhbHNwX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX2hmYTM4NjFfY2hjYWxpCiB7Ci0JVUlOVDE2CXZhbHVlWzE3XTsKKwl1MTYJdmFsdWVbMTddOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBoZmEzODR4X3Bkcl9oZmEzODYxX2NoY2FsaV90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX25pY19jb25maWcKIHsKLQlVSU5UMTYJY29uZmlnX2JpdG1hcDsKKwl1MTYJY29uZmlnX2JpdG1hcDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfbmljX2NvbmZpZ190OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9oZm9fZGVsYXkKIHsKLQlVSU5UOCAgIGhmb19kZWxheTsKKwl1OCAgIGhmb19kZWxheTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9oZm9fZGVsYXlfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9tYW5mX3Rlc3RzcAogewotCVVJTlQxNgl2YWx1ZVszMF07CisJdTE2CXZhbHVlWzMwXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gaGZhMzg0eF9wZHJfaGZhMzg2MV9tYW5mX3Rlc3RzcF90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX21hbmZfdGVzdGkKIHsKLQlVSU5UMTYJdmFsdWVbMzBdOworCXUxNgl2YWx1ZVszMF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX2hmYTM4NjFfbWFuZl90ZXN0aV90OwogCiB0eXBlZGVmIHN0cnVjdCBoZmEzODR4X2VuZF9vZl9wZGEKIHsKLQlVSU5UMTYJY3JjOworCXUxNgljcmM7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIGhmYTM4NHhfcGRyX2VuZF9vZl9wZGFfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJlYwogewotCVVJTlQxNglsZW47IC8qIGluIHdvcmRzICovCi0JVUlOVDE2CWNvZGU7CisJdTE2CWxlbjsgLyogaW4gd29yZHMgKi8KKwl1MTYJY29kZTsKIAl1bmlvbiBwZHIgewogCWhmYTM4NHhfcGRyX3BjYl9wYXJ0bnVtX3QJcGNiX3BhcnRudW07CiAJaGZhMzg0eF9wZHJfcGNiX3RyYWNlbnVtX3QJcGNiX3RyYWNlbnVtOwpAQCAtMjM5MSwxNCArMjM1MiwxMiBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9zdGF0dXNyZXN1bHQKIHsKLQlVSU5UMTYJc3RhdHVzOwotCVVJTlQxNglyZXNwMDsKLQlVSU5UMTYJcmVzcDE7Ci0JVUlOVDE2CXJlc3AyOworCXUxNglzdGF0dXM7CisJdTE2CXJlc3AwOworCXUxNglyZXNwMTsKKwl1MTYJcmVzcDI7CiB9IGhmYTM4NHhfY21kcmVzdWx0X3Q7CiAKLSNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9VU0IpCi0KIC8qIFVTQiBDb250cm9sIEV4Y2hhbmdlIChDVExYKToKICAqICBBIHF1ZXVlIG9mIHRoZSBzdHJ1Y3R1cmUgYmVsb3cgaXMgbWFpbnRhaW5lZCBmb3IgYWxsIG9mIHRoZQogICogIFJlcXVlc3QvUmVzcG9uc2UgdHlwZSBVU0IgcGFja2V0cyBzdXBwb3J0ZWQgYnkgUHJpc20yLgpAQCAtMjQxMSw5ICsyMzcwLDkgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9ycmlkcmVzdWx0CiB7Ci0JVUlOVDE2CQlyaWQ7CisJdTE2CQlyaWQ7CiAJY29uc3Qgdm9pZAkqcmlkZGF0YTsKLQlVSU5UCQlyaWRkYXRhX2xlbjsKKwl1bnNpZ25lZCBpbnQJCXJpZGRhdGFfbGVuOwogfSBoZmEzODR4X3JyaWRyZXN1bHRfdDsKIAogZW51bSBjdGx4X3N0YXRlIHsKQEAgLTI0NjcsMjEgKzI0MjYsMTQgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkCWNvbXBsZXRpbmc7CiAJc3RydWN0IGxpc3RfaGVhZAlyZWFwYWJsZTsKIH0gaGZhMzg0eF91c2JjdGx4cV90OwotI2VuZGlmCiAKIHR5cGVkZWYgc3RydWN0IGhmYTQ4NHhfbWV0YWNtZAogewotCVVJTlQxNgkJY21kOworCXUxNgkJY21kOwogCi0JVUlOVDE2ICAgICAgICAgIHBhcm0wOwotCVVJTlQxNiAgICAgICAgICBwYXJtMTsKLQlVSU5UMTYgICAgICAgICAgcGFybTI7Ci0KLSNpZiAwIC8vWFhYIGNtZCBpcnEgc3R1ZmYKLQlVSU5UMTYgICAgICAgICAgYnVsa2lkOyAgICAgICAgIC8qIHdoYXQgUklEL0ZJRCB0byBjb3B5IGRvd24uICovCi0JaW50ICAgICAgICAgICAgIGJ1bGtsZW47ICAgICAgICAvKiBob3cgbXVjaCB0byBjb3B5IGZyb20gQkFQICovCi0gICAgICAgIGNoYXIgICAgICAgICAgICAqYnVsa2RhdGE7ICAgICAgLyogQW5kIHRvIHdoZXJlPyAqLwotI2VuZGlmCisJdTE2ICAgICAgICAgIHBhcm0wOworCXUxNiAgICAgICAgICBwYXJtMTsKKwl1MTYgICAgICAgICAgcGFybTI7CiAKIAloZmEzODR4X2NtZHJlc3VsdF90IHJlc3VsdDsKIH0gaGZhMzg0eF9tZXRhY21kX3Q7CkBAIC0yNTA3LDI4ICsyNDU5LDIyIEBACiAvKiBYWFggVGhlc2UgYXJlIGdvaW5nIGF3YXkgQVNBUCAqLwogdHlwZWRlZiBzdHJ1Y3QgcHJpc20yc3RhX2F1dGhsaXN0CiB7Ci0JVUlOVAljbnQ7Ci0JVUlOVDgJYWRkcltXTEFOX0FVVEhfTUFYXVtXTEFOX0FERFJfTEVOXTsKLQlVSU5UOAlhc3NvY1tXTEFOX0FVVEhfTUFYXTsKKwl1bnNpZ25lZCBpbnQJY250OworCXU4CWFkZHJbV0xBTl9BVVRIX01BWF1bV0xBTl9BRERSX0xFTl07CisJdTgJYXNzb2NbV0xBTl9BVVRIX01BWF07CiB9IHByaXNtMnN0YV9hdXRobGlzdF90OwogCiB0eXBlZGVmIHN0cnVjdCBwcmlzbTJzdGFfYWNjZXNzbGlzdAogewotCVVJTlQJbW9kaWZ5OwotCVVJTlQJY250OwotCVVJTlQ4CWFkZHJbV0xBTl9BQ0NFU1NfTUFYXVtXTEFOX0FERFJfTEVOXTsKLQlVSU5UCWNudDE7Ci0JVUlOVDgJYWRkcjFbV0xBTl9BQ0NFU1NfTUFYXVtXTEFOX0FERFJfTEVOXTsKKwl1bnNpZ25lZCBpbnQJbW9kaWZ5OworCXVuc2lnbmVkIGludAljbnQ7CisJdTgJYWRkcltXTEFOX0FDQ0VTU19NQVhdW1dMQU5fQUREUl9MRU5dOworCXVuc2lnbmVkIGludAljbnQxOworCXU4CWFkZHIxW1dMQU5fQUNDRVNTX01BWF1bV0xBTl9BRERSX0xFTl07CiB9IHByaXNtMnN0YV9hY2Nlc3NsaXN0X3Q7CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHgKIHsKLSNpZiAoV0xBTl9IT1NUSUYgIT0gV0xBTl9VU0IpCi0JLyogUmVzb3VyY2UgY29uZmlnICovCi0JVUlOVDMyCQkJaW9iYXNlOwotCWNoYXIJCQlfX2lvbWVtICptZW1iYXNlOwotCVVJTlQzMgkJCWlycTsKLSNlbHNlCiAJLyogVVNCIHN1cHBvcnQgZGF0YSAqLwogCXN0cnVjdCB1c2JfZGV2aWNlCSp1c2I7CiAJc3RydWN0IHVyYgkJcnhfdXJiOwpAQCAtMjU2MCwxNiArMjUwNiw2IEBACiAKIAlpbnQgICAgICAgICAgICAgICAgICAgICBlbmRwX2luOwogCWludCAgICAgICAgICAgICAgICAgICAgIGVuZHBfb3V0OwotI2VuZGlmIC8qICFVU0IgKi8KLQotI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDTUNJQSkKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTYpCi0Jc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBkZXY7Ci0jZWxzZQotCWRldl9saW5rX3QJKmxpbms7Ci0jZW5kaWYKLQlkZXZfbm9kZV90CW5vZGU7Ci0jZW5kaWYKIAogCWludCAgICAgICAgICAgICAgICAgICAgIHNuaWZmX2ZjczsKIAlpbnQgICAgICAgICAgICAgICAgICAgICBzbmlmZl9jaGFubmVsOwpAQCAtMjU3OSwzNiArMjUxNSwxNCBAQAogCXdhaXRfcXVldWVfaGVhZF90IGNtZHE7CSAgICAgICAgLyogd2FpdCBxdWV1ZSBpdHNlbGYgKi8KIAogCS8qIENvbnRyb2xsZXIgc3RhdGUgKi8KLQlVSU5UMzIJCXN0YXRlOwotCVVJTlQzMgkJaXNhcDsKLQlVSU5UOAkJcG9ydF9lbmFibGVkW0hGQTM4NHhfTlVNUE9SVFNfTUFYXTsKLSNpZiAoV0xBTl9IT1NUSUYgIT0gV0xBTl9VU0IpCi0JVUlOVAkJYXV4ZW47Ci0JVUlOVCAgICAgICAgICAgIGlzcmFtMTY7Ci0jZW5kaWYgLyogIVVTQiAqLworCXUzMgkJc3RhdGU7CisJdTMyCQlpc2FwOworCXU4CQlwb3J0X2VuYWJsZWRbSEZBMzg0eF9OVU1QT1JUU19NQVhdOwogCiAJLyogRG93bmxvYWQgc3VwcG9ydCAqLwotCVVJTlQJCQkJZGxzdGF0ZTsKKwl1bnNpZ25lZCBpbnQJCQkJZGxzdGF0ZTsKIAloZmEzODR4X2Rvd25sb2FkYnVmZmVyX3QJYnVmaW5mbzsKLQlVSU5UMTYJCQkJZGx0aW1lb3V0OwotCi0jaWYgKFdMQU5fSE9TVElGICE9IFdMQU5fVVNCKQotCXNwaW5sb2NrX3QJY21kbG9jazsKLQl2b2xhdGlsZSBpbnQgICAgY21kZmxhZzsgICAgICAgIC8qIHdhaXQgcXVldWUgZmxhZyAqLwotCWhmYTM4NHhfbWV0YWNtZF90ICpjbWRkYXRhOyAgICAgIC8qIGZvciBvdXIgYXN5bmMgY2FsbGJhY2sgKi8KLQotCS8qIEJBUCBzdXBwb3J0ICovCi0Jc3BpbmxvY2tfdAliYXBsb2NrOwotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAgIGJhcF90YXNrbGV0OwotCi0JLyogTUFDIGJ1ZmZlciBpZHMgKi8KLSAgICAgICAgVUlOVDE2ICAgICAgICAgIHR4ZmlkX2hlYWQ7Ci0gICAgICAgIFVJTlQxNiAgICAgICAgICB0eGZpZF90YWlsOwotICAgICAgICBVSU5UICAgICAgICAgICAgdHhmaWRfTjsKLSAgICAgICAgVUlOVDE2ICAgICAgICAgIHR4ZmlkX3F1ZXVlW0hGQTM4NHhfRFJWUl9GSURTVEFDS0xFTl9NQVhdOwotCVVJTlQxNgkJCWluZm9maWQ7Ci0Jc3RydWN0IHNlbWFwaG9yZQlpbmZvZmlkX3NlbTsKLSNlbmRpZiAvKiAhVVNCICovCisJdTE2CQkJCWRsdGltZW91dDsKIAogCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbmZsYWc7ICAgIC8qIHRvIHNpZ25hbCBzY2FuIGNvbWxldGUgKi8KIAlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5fYXA7ICAgICAgICAvKiBhcmUgd2Ugam9pbmVkIHRvIGEgc3BlY2lmaWMgYXAgKi8KQEAgLTI2MjMsMzEgKzI1MzcsMzAgQEAKIAloZmEzODR4X2NvbW1zcXVhbGl0eV90ICBxdWFsOwogCXN0cnVjdCB0aW1lcl9saXN0CWNvbW1zcXVhbF90aW1lcjsKIAotCVVJTlQxNiBsaW5rX3N0YXR1czsKLQlVSU5UMTYgbGlua19zdGF0dXNfbmV3OworCXUxNiBsaW5rX3N0YXR1czsKKwl1MTYgbGlua19zdGF0dXNfbmV3OwogCXN0cnVjdCBza19idWZmX2hlYWQgICAgICAgIGF1dGhxOwogCiAJLyogQW5kIGhlcmUgd2UgaGF2ZSBzdHVmZiB0aGF0IHVzZWQgdG8gYmUgaW4gcHJpdiAqLwogCiAJLyogU3RhdGUgdmFyaWFibGVzICovCi0JVUlOVAkJcHJlc25pZmZfcG9ydF90eXBlOwotCVVJTlQxNgkJcHJlc25pZmZfd2VwZmxhZ3M7Ci0JVUlOVDMyCQlkb3QxMV9kZXNpcmVkX2Jzc190eXBlOwotCWludAkJYXA7CS8qIEFQIGZsYWc6IDAgLSBTdGF0aW9uLCAxIC0gQWNjZXNzIFBvaW50LiAqLworCXVuc2lnbmVkIGludAkJcHJlc25pZmZfcG9ydF90eXBlOworCXUxNgkJcHJlc25pZmZfd2VwZmxhZ3M7CisJdTMyCQlkb3QxMV9kZXNpcmVkX2Jzc190eXBlOwogCiAJaW50ICAgICAgICAgICAgIGRibWFkanVzdDsKIAogCS8qIEdyb3VwIEFkZHJlc3NlcyAtIHJpZ2h0IG5vdywgdGhlcmUgYXJlIHVwIHRvIGEgdG90YWwKIAlvZiBNQVhfR1JQX0FERFIgZ3JvdXAgYWRkcmVzc2VzICovCi0JVUlOVDgJCWRvdDExX2dycF9hZGRyW01BWF9HUlBfQUREUl1bV0xBTl9BRERSX0xFTl07Ci0JVUlOVAkJZG90MTFfZ3JwY250OworCXU4CQlkb3QxMV9ncnBfYWRkcltNQVhfR1JQX0FERFJdW1dMQU5fQUREUl9MRU5dOworCXVuc2lnbmVkIGludAkJZG90MTFfZ3JwY250OwogCiAJLyogQ29tcG9uZW50IElkZW50aXRpZXMgKi8KIAloZmEzODR4X2NvbXBpZGVudF90CWlkZW50X25pYzsKIAloZmEzODR4X2NvbXBpZGVudF90CWlkZW50X3ByaV9mdzsKIAloZmEzODR4X2NvbXBpZGVudF90CWlkZW50X3N0YV9mdzsKIAloZmEzODR4X2NvbXBpZGVudF90CWlkZW50X2FwX2Z3OwotCVVJTlQxNgkJCW1tX21vZHM7CisJdTE2CQkJbW1fbW9kczsKIAogCS8qIFN1cHBsaWVyIGNvbXBhdGliaWxpdHkgcmFuZ2VzICovCiAJaGZhMzg0eF9jYXBsZXZlbF90CWNhcF9zdXBfbWZpOwpAQCAtMjY2MywxNCArMjU3NiwxNCBAQAogCWhmYTM4NHhfY2FwbGV2ZWxfdAljYXBfYWN0X2FwX2NmaTsgIC8qIGFwIGYvdyB0byBjb250cm9sbGVyIGludGVyZmFjZSAqLwogCWhmYTM4NHhfY2FwbGV2ZWxfdAljYXBfYWN0X2FwX21maTsgIC8qIGFwIGYvdyB0byBtb2RlbSBpbnRlcmZhY2UgKi8KIAotCVVJTlQzMgkJCXBzdXNlcmNvdW50OyAgLyogUG93ZXIgc2F2ZSB1c2VyIGNvdW50LiAqLworCXUzMgkJCXBzdXNlcmNvdW50OyAgLyogUG93ZXIgc2F2ZSB1c2VyIGNvdW50LiAqLwogCWhmYTM4NHhfQ29tbVRhbGxpZXMzMl90CXRhbGxpZXM7ICAgICAgLyogQ29tbXVuaWNhdGlvbiB0YWxsaWVzLiAqLwotCVVJTlQ4CQkJY29tbWVudFtXTEFOX0NPTU1FTlRfTUFYKzFdOyAvKiBVc2VyIGNvbW1lbnQgKi8KKwl1OAkJCWNvbW1lbnRbV0xBTl9DT01NRU5UX01BWCsxXTsgLyogVXNlciBjb21tZW50ICovCiAKIAkvKiBDaGFubmVsIEluZm8gcmVxdWVzdCByZXN1bHRzIChBUCBvbmx5KSAqLwogCXN0cnVjdCB7CiAJCWF0b21pY190CQlkb25lOwotCQlVSU5UOAkJCWNvdW50OworCQl1OAkJCWNvdW50OwogCQloZmEzODR4X0NoSW5mb1Jlc3VsdF90CXJlc3VsdHM7CiAJfSBjaGFubmVsX2luZm87CiAKQEAgLTI2NzgsNyArMjU5MSw3IEBACiAKIAogICAgICAgICBwcmlzbTJzdGFfYXV0aGxpc3RfdAlhdXRobGlzdDsgICAgIC8qIEF1dGhlbnRpY2F0ZWQgc3RhdGlvbiBsaXN0LiAqLwotCVVJTlQJCQlhY2Nlc3Ntb2RlOyAgIC8qIEFjY2VzcyBtb2RlLiAqLworCXVuc2lnbmVkIGludAkJCWFjY2Vzc21vZGU7ICAgLyogQWNjZXNzIG1vZGUuICovCiAgICAgICAgIHByaXNtMnN0YV9hY2Nlc3NsaXN0X3QJYWxsb3c7ICAgICAgICAvKiBBbGxvd2VkIHN0YXRpb24gbGlzdC4gKi8KICAgICAgICAgcHJpc20yc3RhX2FjY2Vzc2xpc3RfdAlkZW55OyAgICAgICAgIC8qIERlbmllZCBzdGF0aW9uIGxpc3QuICovCiAKQEAgLTI2ODcsMjQgKzI2MDAsMTMgQEAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKi0tLSBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLSNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9VU0IpCiB2b2lkCiBoZmEzODR4X2NyZWF0ZSgKIAloZmEzODR4X3QgKmh3LAogCXN0cnVjdCB1c2JfZGV2aWNlICp1c2IpOwotI2Vsc2UKLXZvaWQKLWhmYTM4NHhfY3JlYXRlKAotCWhmYTM4NHhfdCAqaHcsCi0JVUlOVCBpcnEsCi0JVUlOVDMyIGlvYmFzZSwKLQlVSU5UOCBfX2lvbWVtICptZW1iYXNlKTsKLSNlbmRpZgogCiB2b2lkIGhmYTM4NHhfZGVzdHJveShoZmEzODR4X3QgKmh3KTsKIAotaXJxcmV0dXJuX3QKLWhmYTM4NHhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCBQVF9SRUdTKTsKIGludAogaGZhMzg0eF9jb3JlcmVzZXQoIGhmYTM4NHhfdCAqaHcsIGludCBob2xkdGltZSwgaW50IHNldHRsZXRpbWUsIGludCBnZW5lc2lzKTsKIGludApAQCAtMjcxMiwxMTYgKzI2MTQsMTA1IEBACiBpbnQKIGhmYTM4NHhfZHJ2cl9jb21tdGFsbGllcyggaGZhMzg0eF90ICpodyk7CiBpbnQKLWhmYTM4NHhfZHJ2cl9kaXNhYmxlKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBtYWNwb3J0KTsKK2hmYTM4NHhfZHJ2cl9kaXNhYmxlKGhmYTM4NHhfdCAqaHcsIHUxNiBtYWNwb3J0KTsKIGludAotaGZhMzg0eF9kcnZyX2VuYWJsZShoZmEzODR4X3QgKmh3LCBVSU5UMTYgbWFjcG9ydCk7CitoZmEzODR4X2RydnJfZW5hYmxlKGhmYTM4NHhfdCAqaHcsIHUxNiBtYWNwb3J0KTsKIGludAogaGZhMzg0eF9kcnZyX2ZsYXNoZGxfZW5hYmxlKGhmYTM4NHhfdCAqaHcpOwogaW50CiBoZmEzODR4X2RydnJfZmxhc2hkbF9kaXNhYmxlKGhmYTM4NHhfdCAqaHcpOwogaW50Ci1oZmEzODR4X2RydnJfZmxhc2hkbF93cml0ZShoZmEzODR4X3QgKmh3LCBVSU5UMzIgZGFkZHIsIHZvaWQqIGJ1ZiwgVUlOVDMyIGxlbik7CitoZmEzODR4X2RydnJfZmxhc2hkbF93cml0ZShoZmEzODR4X3QgKmh3LCB1MzIgZGFkZHIsIHZvaWQqIGJ1ZiwgdTMyIGxlbik7CiBpbnQKLWhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaGZhMzg0eF90ICpodywgVUlOVDE2IHJpZCwgdm9pZCAqYnVmLCBVSU5UMTYgbGVuKTsKK2hmYTM4NHhfZHJ2cl9nZXRjb25maWcoaGZhMzg0eF90ICpodywgdTE2IHJpZCwgdm9pZCAqYnVmLCB1MTYgbGVuKTsKIGludAotaGZhMzg0eF9kcnZyX2hhbmRvdmVyKCBoZmEzODR4X3QgKmh3LCBVSU5UOCAqYWRkcik7CitoZmEzODR4X2RydnJfaGFuZG92ZXIoIGhmYTM4NHhfdCAqaHcsIHU4ICphZGRyKTsKIGludAogaGZhMzg0eF9kcnZyX2hvc3RzY2FucmVzdWx0cyggaGZhMzg0eF90ICpodyk7CiBpbnQKIGhmYTM4NHhfZHJ2cl9sb3dfbGV2ZWwoaGZhMzg0eF90ICpodywgaGZhMzg0eF9tZXRhY21kX3QgKmNtZCk7CiBpbnQKLWhmYTM4NHhfZHJ2cl9tbWlfcmVhZChoZmEzODR4X3QgKmh3LCBVSU5UMzIgYWRkcmVzcywgVUlOVDMyICpyZXN1bHQpOworaGZhMzg0eF9kcnZyX21taV9yZWFkKGhmYTM4NHhfdCAqaHcsIHUzMiBhZGRyZXNzLCB1MzIgKnJlc3VsdCk7CiBpbnQKLWhmYTM4NHhfZHJ2cl9tbWlfd3JpdGUoaGZhMzg0eF90ICpodywgVUlOVDMyIGFkZHJlc3MsIFVJTlQzMiBkYXRhKTsKK2hmYTM4NHhfZHJ2cl9tbWlfd3JpdGUoaGZhMzg0eF90ICpodywgdTMyIGFkZHJlc3MsIHUzMiBkYXRhKTsKIGludAotaGZhMzg0eF9kcnZyX3JhbWRsX2VuYWJsZShoZmEzODR4X3QgKmh3LCBVSU5UMzIgZXhlYWRkcik7CitoZmEzODR4X2RydnJfcmFtZGxfZW5hYmxlKGhmYTM4NHhfdCAqaHcsIHUzMiBleGVhZGRyKTsKIGludAogaGZhMzg0eF9kcnZyX3JhbWRsX2Rpc2FibGUoaGZhMzg0eF90ICpodyk7CiBpbnQKLWhmYTM4NHhfZHJ2cl9yYW1kbF93cml0ZShoZmEzODR4X3QgKmh3LCBVSU5UMzIgZGFkZHIsIHZvaWQqIGJ1ZiwgVUlOVDMyIGxlbik7CitoZmEzODR4X2RydnJfcmFtZGxfd3JpdGUoaGZhMzg0eF90ICpodywgdTMyIGRhZGRyLCB2b2lkKiBidWYsIHUzMiBsZW4pOwogaW50Ci1oZmEzODR4X2RydnJfcmVhZHBkYShoZmEzODR4X3QgKmh3LCB2b2lkICpidWYsIFVJTlQgbGVuKTsKK2hmYTM4NHhfZHJ2cl9yZWFkcGRhKGhmYTM4NHhfdCAqaHcsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbik7CiBpbnQKIGhmYTM4NHhfZHJ2cl9zY2FucmVzdWx0cyggaGZhMzg0eF90ICpodyk7CiAKIGludAotaGZhMzg0eF9kcnZyX3NldGNvbmZpZyhoZmEzODR4X3QgKmh3LCBVSU5UMTYgcmlkLCB2b2lkICpidWYsIFVJTlQxNiBsZW4pOworaGZhMzg0eF9kcnZyX3NldGNvbmZpZyhoZmEzODR4X3QgKmh3LCB1MTYgcmlkLCB2b2lkICpidWYsIHUxNiBsZW4pOwogCiBzdGF0aWMgaW5saW5lIGludAotaGZhMzg0eF9kcnZyX2dldGNvbmZpZzE2KGhmYTM4NHhfdCAqaHcsIFVJTlQxNiByaWQsIHZvaWQgKnZhbCkKK2hmYTM4NHhfZHJ2cl9nZXRjb25maWcxNihoZmEzODR4X3QgKmh3LCB1MTYgcmlkLCB2b2lkICp2YWwpCiB7CiAJaW50CQlyZXN1bHQgPSAwOwotCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaHcsIHJpZCwgdmFsLCBzaXplb2YoVUlOVDE2KSk7CisJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhodywgcmlkLCB2YWwsIHNpemVvZih1MTYpKTsKIAlpZiAoIHJlc3VsdCA9PSAwICkgewotCQkqKChVSU5UMTYqKXZhbCkgPSBoZmEzODR4Mmhvc3RfMTYoKigoVUlOVDE2Kil2YWwpKTsKKwkJKigodTE2Kil2YWwpID0gaGZhMzg0eDJob3N0XzE2KCooKHUxNiopdmFsKSk7CiAJfQogCXJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1oZmEzODR4X2RydnJfZ2V0Y29uZmlnMzIoaGZhMzg0eF90ICpodywgVUlOVDE2IHJpZCwgdm9pZCAqdmFsKQoraGZhMzg0eF9kcnZyX2dldGNvbmZpZzMyKGhmYTM4NHhfdCAqaHcsIHUxNiByaWQsIHZvaWQgKnZhbCkKIHsKIAlpbnQJCXJlc3VsdCA9IDA7CiAKLQlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGh3LCByaWQsIHZhbCwgc2l6ZW9mKFVJTlQzMikpOworCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaHcsIHJpZCwgdmFsLCBzaXplb2YodTMyKSk7CiAJaWYgKCByZXN1bHQgPT0gMCApIHsKLQkJKigoVUlOVDMyKil2YWwpID0gaGZhMzg0eDJob3N0XzMyKCooKFVJTlQzMiopdmFsKSk7CisJCSooKHUzMiopdmFsKSA9IGhmYTM4NHgyaG9zdF8zMigqKCh1MzIqKXZhbCkpOwogCX0KIAogCXJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1oZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaGZhMzg0eF90ICpodywgVUlOVDE2IHJpZCwgVUlOVDE2IHZhbCkKK2hmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihoZmEzODR4X3QgKmh3LCB1MTYgcmlkLCB1MTYgdmFsKQogewotCVVJTlQxNiB2YWx1ZSA9IGhvc3QyaGZhMzg0eF8xNih2YWwpOworCXUxNiB2YWx1ZSA9IGhvc3QyaGZhMzg0eF8xNih2YWwpOwogCXJldHVybiBoZmEzODR4X2RydnJfc2V0Y29uZmlnKGh3LCByaWQsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1oZmEzODR4X2RydnJfc2V0Y29uZmlnMzIoaGZhMzg0eF90ICpodywgVUlOVDE2IHJpZCwgVUlOVDMyIHZhbCkKK2hmYTM4NHhfZHJ2cl9zZXRjb25maWczMihoZmEzODR4X3QgKmh3LCB1MTYgcmlkLCB1MzIgdmFsKQogewotCVVJTlQzMiB2YWx1ZSA9IGhvc3QyaGZhMzg0eF8zMih2YWwpOworCXUzMiB2YWx1ZSA9IGhvc3QyaGZhMzg0eF8zMih2YWwpOwogCXJldHVybiBoZmEzODR4X2RydnJfc2V0Y29uZmlnKGh3LCByaWQsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7CiB9CiAKLSNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9VU0IpCiBpbnQKIGhmYTM4NHhfZHJ2cl9nZXRjb25maWdfYXN5bmMoaGZhMzg0eF90ICAgICAqaHcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgICAgICAgIHJpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiAgICAgICAgcmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RseF91c2VyY2JfdCB1c2VyY2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICp1c2VyY2JfZGF0YSk7CiAKIGludAogaGZhMzg0eF9kcnZyX3NldGNvbmZpZ19hc3luYyhoZmEzODR4X3QgKmh3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IHJpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiByaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2IGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0bHhfdXNlcmNiX3QgdXNlcmNiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmNiX2RhdGEpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50Ci1oZmEzODR4X2RydnJfc2V0Y29uZmlnX2FzeW5jKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiByaWQsIHZvaWQgKmJ1ZiwgVUlOVDE2IGxlbiwKLQkJCSAgICAgdm9pZCAqcHRyMSwgdm9pZCAqcHRyMikKLXsKLSAgICAgICAgICh2b2lkKXB0cjE7Ci0gICAgICAgICAodm9pZClwdHIyOwotICAgICAgICAgcmV0dXJuIGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoaHcsIHJpZCwgYnVmLCBsZW4pOwotfQotI2VuZGlmCiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1oZmEzODR4X2RydnJfc2V0Y29uZmlnMTZfYXN5bmMoaGZhMzg0eF90ICpodywgVUlOVDE2IHJpZCwgVUlOVDE2IHZhbCkKK2hmYTM4NHhfZHJ2cl9zZXRjb25maWcxNl9hc3luYyhoZmEzODR4X3QgKmh3LCB1MTYgcmlkLCB1MTYgdmFsKQogewotCVVJTlQxNiB2YWx1ZSA9IGhvc3QyaGZhMzg0eF8xNih2YWwpOworCXUxNiB2YWx1ZSA9IGhvc3QyaGZhMzg0eF8xNih2YWwpOwogCXJldHVybiBoZmEzODR4X2RydnJfc2V0Y29uZmlnX2FzeW5jKGh3LCByaWQsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSwKIAkJCQkJICAgIE5VTEwgLCBOVUxMKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLWhmYTM4NHhfZHJ2cl9zZXRjb25maWczMl9hc3luYyhoZmEzODR4X3QgKmh3LCBVSU5UMTYgcmlkLCBVSU5UMzIgdmFsKQoraGZhMzg0eF9kcnZyX3NldGNvbmZpZzMyX2FzeW5jKGhmYTM4NHhfdCAqaHcsIHUxNiByaWQsIHUzMiB2YWwpCiB7Ci0JVUlOVDMyIHZhbHVlID0gaG9zdDJoZmEzODR4XzMyKHZhbCk7CisJdTMyIHZhbHVlID0gaG9zdDJoZmEzODR4XzMyKHZhbCk7CiAJcmV0dXJuIGhmYTM4NHhfZHJ2cl9zZXRjb25maWdfYXN5bmMoaHcsIHJpZCwgJnZhbHVlLCBzaXplb2YodmFsdWUpLAogCQkJCQkgICAgTlVMTCAsIE5VTEwpOwogfQpAQCAtMjgzOSwzMiArMjczMCwyOCBAQAogaW50CiBoZmEzODR4X2NtZF9pbml0aWFsaXplKGhmYTM4NHhfdCAqaHcpOwogaW50Ci1oZmEzODR4X2NtZF9lbmFibGUoaGZhMzg0eF90ICpodywgVUlOVDE2IG1hY3BvcnQpOworaGZhMzg0eF9jbWRfZW5hYmxlKGhmYTM4NHhfdCAqaHcsIHUxNiBtYWNwb3J0KTsKIGludAotaGZhMzg0eF9jbWRfZGlzYWJsZShoZmEzODR4X3QgKmh3LCBVSU5UMTYgbWFjcG9ydCk7CitoZmEzODR4X2NtZF9kaXNhYmxlKGhmYTM4NHhfdCAqaHcsIHUxNiBtYWNwb3J0KTsKIGludAogaGZhMzg0eF9jbWRfZGlhZ25vc2UoaGZhMzg0eF90ICpodyk7CiBpbnQKLWhmYTM4NHhfY21kX2FsbG9jYXRlKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBsZW4pOworaGZhMzg0eF9jbWRfYWxsb2NhdGUoaGZhMzg0eF90ICpodywgdTE2IGxlbik7CiBpbnQKLWhmYTM4NHhfY21kX3RyYW5zbWl0KGhmYTM4NHhfdCAqaHcsIFVJTlQxNiByZWNsYWltLCBVSU5UMTYgcW9zLCBVSU5UMTYgZmlkKTsKK2hmYTM4NHhfY21kX3RyYW5zbWl0KGhmYTM4NHhfdCAqaHcsIHUxNiByZWNsYWltLCB1MTYgcW9zLCB1MTYgZmlkKTsKIGludAotaGZhMzg0eF9jbWRfY2xlYXJwZXJzaXN0KGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBmaWQpOworaGZhMzg0eF9jbWRfY2xlYXJwZXJzaXN0KGhmYTM4NHhfdCAqaHcsIHUxNiBmaWQpOwogaW50Ci1oZmEzODR4X2NtZF9ub3RpZnkoaGZhMzg0eF90ICpodywgVUlOVDE2IHJlY2xhaW0sIFVJTlQxNiBmaWQsIHZvaWQgKmJ1ZiwgVUlOVDE2IGxlbik7CitoZmEzODR4X2NtZF9hY2Nlc3MoaGZhMzg0eF90ICpodywgdTE2IHdyaXRlLCB1MTYgcmlkLCB2b2lkICpidWYsIHUxNiBsZW4pOwogaW50Ci1oZmEzODR4X2NtZF9pbnF1aXJlKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBmaWQpOwotaW50Ci1oZmEzODR4X2NtZF9hY2Nlc3MoaGZhMzg0eF90ICpodywgVUlOVDE2IHdyaXRlLCBVSU5UMTYgcmlkLCB2b2lkICpidWYsIFVJTlQxNiBsZW4pOwotaW50Ci1oZmEzODR4X2NtZF9tb25pdG9yKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBlbmFibGUpOworaGZhMzg0eF9jbWRfbW9uaXRvcihoZmEzODR4X3QgKmh3LCB1MTYgZW5hYmxlKTsKIGludAogaGZhMzg0eF9jbWRfZG93bmxvYWQoCiAJaGZhMzg0eF90ICpodywKLQlVSU5UMTYgbW9kZSwKLQlVSU5UMTYgbG93YWRkciwKLQlVSU5UMTYgaGlnaGFkZHIsCi0JVUlOVDE2IGNvZGVsZW4pOworCXUxNiBtb2RlLAorCXUxNiBsb3dhZGRyLAorCXUxNiBoaWdoYWRkciwKKwl1MTYgY29kZWxlbik7CiBpbnQKIGhmYTM4NHhfY21kX2F1eF9lbmFibGUoaGZhMzg0eF90ICpodywgaW50IGZvcmNlKTsKIGludApAQCAtMjg3MiwxOTYgKzI3NTksMzQgQEAKIGludAogaGZhMzg0eF9jb3B5X2Zyb21fYmFwKAogCWhmYTM4NHhfdCAqaHcsCi0JVUlOVDE2CWJhcCwKLQlVSU5UMTYJaWQsCi0JVUlOVDE2CW9mZnNldCwKKwl1MTYJYmFwLAorCXUxNglpZCwKKwl1MTYJb2Zmc2V0LAogCXZvaWQJKmJ1ZiwKLQlVSU5UCWxlbik7CisJdW5zaWduZWQgaW50CWxlbik7CiBpbnQKIGhmYTM4NHhfY29weV90b19iYXAoCiAJaGZhMzg0eF90ICpodywKLQlVSU5UMTYJYmFwLAotCVVJTlQxNglpZCwKLQlVSU5UMTYJb2Zmc2V0LAorCXUxNgliYXAsCisJdTE2CWlkLAorCXUxNglvZmZzZXQsCiAJdm9pZAkqYnVmLAotCVVJTlQJbGVuKTsKKwl1bnNpZ25lZCBpbnQJbGVuKTsKIHZvaWQKIGhmYTM4NHhfY29weV9mcm9tX2F1eCgKIAloZmEzODR4X3QgKmh3LAotCVVJTlQzMgljYXJkYWRkciwKLQlVSU5UMzIJYXV4Y3RsLAorCXUzMgljYXJkYWRkciwKKwl1MzIJYXV4Y3RsLAogCXZvaWQJKmJ1ZiwKLQlVSU5UCWxlbik7CisJdW5zaWduZWQgaW50CWxlbik7CiB2b2lkCiBoZmEzODR4X2NvcHlfdG9fYXV4KAogCWhmYTM4NHhfdCAqaHcsCi0JVUlOVDMyCWNhcmRhZGRyLAotCVVJTlQzMglhdXhjdGwsCisJdTMyCWNhcmRhZGRyLAorCXUzMglhdXhjdGwsCiAJdm9pZAkqYnVmLAotCVVJTlQJbGVuKTsKKwl1bnNpZ25lZCBpbnQJbGVuKTsKIAotI2lmIChXTEFOX0hPU1RJRiAhPSBXTEFOX1VTQikKLQotLyoKLSAgIEhGQTM4NHggaXMgYSBMSVRUTEUgRU5ESUFOIHBhcnQuCi0KLSAgIHRoZSBnZXQvc2V0cmVnIGZ1bmN0aW9ucyBpbXBsaWNpdGx5IGJ5dGUtc3dhcCB0aGUgZGF0YSB0byBMRS4KLSAgIHRoZSBfbm9zd2FwIHZhcmlhbnRzIGRvIG5vdCBwZXJmb3JtIGEgYnl0ZS1zd2FwIG9uIHRoZSBkYXRhLgotKi8KLQotc3RhdGljIGlubGluZSBVSU5UMTYKLV9faGZhMzg0eF9nZXRyZWcoaGZhMzg0eF90ICpodywgVUlOVCByZWcpOwotCi1zdGF0aWMgaW5saW5lIHZvaWQKLV9faGZhMzg0eF9zZXRyZWcoaGZhMzg0eF90ICpodywgVUlOVDE2IHZhbCwgVUlOVCByZWcpOwotCi1zdGF0aWMgaW5saW5lIFVJTlQxNgotX19oZmEzODR4X2dldHJlZ19ub3N3YXAoaGZhMzg0eF90ICpodywgVUlOVCByZWcpOwotCi1zdGF0aWMgaW5saW5lIHZvaWQKLV9faGZhMzg0eF9zZXRyZWdfbm9zd2FwKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiB2YWwsIFVJTlQgcmVnKTsKLQotI2lmZGVmIFJFVkVSU0VfRU5ESUFOCi0jZGVmaW5lIGhmYTM4NHhfZ2V0cmVnIF9faGZhMzg0eF9nZXRyZWdfbm9zd2FwCi0jZGVmaW5lIGhmYTM4NHhfc2V0cmVnIF9faGZhMzg0eF9zZXRyZWdfbm9zd2FwCi0jZGVmaW5lIGhmYTM4NHhfZ2V0cmVnX25vc3dhcCBfX2hmYTM4NHhfZ2V0cmVnCi0jZGVmaW5lIGhmYTM4NHhfc2V0cmVnX25vc3dhcCBfX2hmYTM4NHhfc2V0cmVnCi0jZWxzZQotI2RlZmluZSBoZmEzODR4X2dldHJlZyBfX2hmYTM4NHhfZ2V0cmVnCi0jZGVmaW5lIGhmYTM4NHhfc2V0cmVnIF9faGZhMzg0eF9zZXRyZWcKLSNkZWZpbmUgaGZhMzg0eF9nZXRyZWdfbm9zd2FwIF9faGZhMzg0eF9nZXRyZWdfbm9zd2FwCi0jZGVmaW5lIGhmYTM4NHhfc2V0cmVnX25vc3dhcCBfX2hmYTM4NHhfc2V0cmVnX25vc3dhcAotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2dldHJlZwotKgotKiBSZXRyaWV2ZSB0aGUgdmFsdWUgb2Ygb25lIG9mIHRoZSBNQUMgcmVnaXN0ZXJzLiAgRG9uZSBoZXJlCi0qIGJlY2F1c2UgZGlmZmVyZW50IFBSSVNNMiBNQUMgcGFydHMgdXNlIGRpZmZlcmVudCBidXNlcyBhbmQgc3VjaC4KLSogTk9URTogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB2YWx1ZSBpbiBIT1NUIE9SREVSISEhISEhCi0qCi0qIEFyZ3VtZW50czoKLSogICAgICAgaHcgICAgICAgICBNQUMgcGFydCBzdHJ1Y3R1cmUKLSogICAgICAgcmVnICAgICAgICBSZWdpc3RlciBpZGVudGlmaWVyIChvZmZzZXQgZm9yIEkvTyBiYXNlZCBpL2YpCi0qCi0qIFJldHVybnM6Ci0qICAgICAgIFZhbHVlIGZyb20gdGhlIHJlZ2lzdGVyIGluIEhPU1QgT1JERVIhISEhCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbmxpbmUgVUlOVDE2Ci1fX2hmYTM4NHhfZ2V0cmVnKGhmYTM4NHhfdCAqaHcsIFVJTlQgcmVnKQotewotLyoJcHJpbnRrKEtFUk5fREVCVUcgIlJlYWRpbmcgZnJvbSAweCUweFxuIiwgaHctPm1lbWJhc2UgKyByZWcpOyAqLwotI2lmICgoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ01DSUEpIHx8IChXTEFOX0hPU1RJRiA9PSBXTEFOX1BMWCkpCi0JcmV0dXJuIHdsYW5faW53X2xlMTZfdG9fY3B1KGh3LT5pb2Jhc2UrcmVnKTsKLSNlbGlmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDSSkKLQlyZXR1cm4gX19sZTE2X3RvX2NwdShyZWFkdyhody0+bWVtYmFzZSArIHJlZykpOwotI2VuZGlmCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X3NldHJlZwotKgotKiBTZXQgdGhlIHZhbHVlIG9mIG9uZSBvZiB0aGUgTUFDIHJlZ2lzdGVycy4gIERvbmUgaGVyZQotKiBiZWNhdXNlIGRpZmZlcmVudCBQUklTTTIgTUFDIHBhcnRzIHVzZSBkaWZmZXJlbnQgYnVzZXMgYW5kIHN1Y2guCi0qIE5PVEU6IFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGUgdmFsdWUgaXMgaW4gSE9TVCBPUkRFUiEhISEhIQotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIGh3CU1BQyBwYXJ0IHN0cnVjdHVyZQotKgl2YWwJVmFsdWUsIGluIEhPU1QgT1JERVIhISwgdG8gcHV0IGluIHRoZSByZWdpc3RlcgotKiAgICAgICByZWcJUmVnaXN0ZXIgaWRlbnRpZmllciAob2Zmc2V0IGZvciBJL08gYmFzZWQgaS9mKQotKgotKiBSZXR1cm5zOgotKiAgICAgICBOb3RoaW5nCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbmxpbmUgdm9pZAotX19oZmEzODR4X3NldHJlZyhoZmEzODR4X3QgKmh3LCBVSU5UMTYgdmFsLCBVSU5UIHJlZykKLXsKLSNpZiAoKFdMQU5fSE9TVElGID09IFdMQU5fUENNQ0lBKSB8fCAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QTFgpKQotCXdsYW5fb3V0d19jcHVfdG9fbGUxNiggdmFsLCBody0+aW9iYXNlICsgcmVnKTsKLQlyZXR1cm47Ci0jZWxpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ0kpCi0Jd3JpdGV3KF9fY3B1X3RvX2xlMTYodmFsKSwgaHctPm1lbWJhc2UgKyByZWcpOwotCXJldHVybjsKLSNlbmRpZgotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2dldHJlZ19ub3N3YXAKLSoKLSogUmV0cmlldmUgdGhlIHZhbHVlIG9mIG9uZSBvZiB0aGUgTUFDIHJlZ2lzdGVycy4gIERvbmUgaGVyZQotKiBiZWNhdXNlIGRpZmZlcmVudCBQUklTTTIgTUFDIHBhcnRzIHVzZSBkaWZmZXJlbnQgYnVzZXMgYW5kIHN1Y2guCi0qCi0qIEFyZ3VtZW50czoKLSogICAgICAgaHcgICAgICAgICBNQUMgcGFydCBzdHJ1Y3R1cmUKLSogICAgICAgcmVnICAgICAgICBSZWdpc3RlciBpZGVudGlmaWVyIChvZmZzZXQgZm9yIEkvTyBiYXNlZCBpL2YpCi0qCi0qIFJldHVybnM6Ci0qICAgICAgIFZhbHVlIGZyb20gdGhlIHJlZ2lzdGVyLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW5saW5lIFVJTlQxNgotX19oZmEzODR4X2dldHJlZ19ub3N3YXAoaGZhMzg0eF90ICpodywgVUlOVCByZWcpCi17Ci0jaWYgKChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDTUNJQSkgfHwgKFdMQU5fSE9TVElGID09IFdMQU5fUExYKSkKLQlyZXR1cm4gd2xhbl9pbncoaHctPmlvYmFzZStyZWcpOwotI2VsaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUENJKQotCXJldHVybiByZWFkdyhody0+bWVtYmFzZSArIHJlZyk7Ci0jZW5kaWYKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogaGZhMzg0eF9zZXRyZWdfbm9zd2FwCi0qCi0qIFNldCB0aGUgdmFsdWUgb2Ygb25lIG9mIHRoZSBNQUMgcmVnaXN0ZXJzLiAgRG9uZSBoZXJlCi0qIGJlY2F1c2UgZGlmZmVyZW50IFBSSVNNMiBNQUMgcGFydHMgdXNlIGRpZmZlcmVudCBidXNlcyBhbmQgc3VjaC4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBodwlNQUMgcGFydCBzdHJ1Y3R1cmUKLSoJdmFsCVZhbHVlIHRvIHB1dCBpbiB0aGUgcmVnaXN0ZXIKLSogICAgICAgcmVnCVJlZ2lzdGVyIGlkZW50aWZpZXIgKG9mZnNldCBmb3IgSS9PIGJhc2VkIGkvZikKLSoKLSogUmV0dXJuczoKLSogICAgICAgTm90aGluZwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW5saW5lIHZvaWQKLV9faGZhMzg0eF9zZXRyZWdfbm9zd2FwKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiB2YWwsIFVJTlQgcmVnKQotewotI2lmICgoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ01DSUEpIHx8IChXTEFOX0hPU1RJRiA9PSBXTEFOX1BMWCkpCi0Jd2xhbl9vdXR3KCB2YWwsIGh3LT5pb2Jhc2UgKyByZWcpOwotCXJldHVybjsKLSNlbGlmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDSSkKLQl3cml0ZXcodmFsLCBody0+bWVtYmFzZSArIHJlZyk7Ci0JcmV0dXJuOwotI2VuZGlmCi19Ci0KLQotc3RhdGljIGlubGluZSB2b2lkIGhmYTM4NHhfZXZlbnRzX2FsbChoZmEzODR4X3QgKmh3KQotewotCWhmYTM4NHhfc2V0cmVnKGh3LAotCQkgICAgICAgSEZBMzg0eF9JTlRfTk9STUFMCi0jaWZkZWYgQ01EX0lSUQotCQkgICAgICAgfCBIRkEzODR4X0lOVEVOX0NNRF9TRVQoMSkKLSNlbmRpZgotCQkgICAgICAgLAotCQkgICAgICAgSEZBMzg0eF9JTlRFTik7Ci0KLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGhmYTM4NHhfZXZlbnRzX25vYmFwKGhmYTM4NHhfdCAqaHcpCi17Ci0JaGZhMzg0eF9zZXRyZWcoaHcsCi0JCSAgICAgICAgKEhGQTM4NHhfSU5UX05PUk1BTCAmIH5IRkEzODR4X0lOVF9CQVBfT1ApCi0jaWZkZWYgQ01EX0lSUQotCQkgICAgICAgfCBIRkEzODR4X0lOVEVOX0NNRF9TRVQoMSkKLSNlbmRpZgotCQkgICAgICAgLAotCQkgICAgICAgSEZBMzg0eF9JTlRFTik7Ci0KLX0KLQotI2VuZGlmIC8qIFdMQU5fSE9TVElGICE9IFdMQU5fVVNCICovCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCiAjZW5kaWYgIC8qIF9IRkEzODR4X0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2hmYTM4NHhfdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9oZmEzODR4X3VzYi5jCmluZGV4IGRiMGM1MDIuLjhhNzViNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2hmYTM4NHhfdXNiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvaGZhMzg0eF91c2IuYwpAQCAtMTE0LDkgKzExNCw2IEBACiAvKiBTeXN0ZW0gSW5jbHVkZXMgKi8KICNkZWZpbmUgV0xBTl9EQlZBUglwcmlzbTJfZGVidWcKIAotI2luY2x1ZGUgInZlcnNpb24uaCIKLQotCiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0xMzYsNjMgKzEzMyw3IEBACiAKICNpbmNsdWRlICJ3bGFuX2NvbXBhdC5oIgogCi0jaWYgKFdMQU5fSE9TVElGICE9IFdMQU5fVVNCKQotI2Vycm9yICJUaGlzIGZpbGUgaXMgc3BlY2lmaWMgdG8gVVNCIgotI2VuZGlmCi0KLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwxMCkKLXN0YXRpYyBpbnQKLXdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZShzdHJ1Y3QgY29tcGxldGlvbiAqeCkKLXsKLSAgaW50IHJldCA9IDA7Ci0KLSAgbWlnaHRfc2xlZXAoKTsKLQotICBzcGluX2xvY2tfaXJxKCZ4LT53YWl0LmxvY2spOwotICBpZiAoIXgtPmRvbmUpIHsKLSAgICBERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKLQotICAgIHdhaXQuZmxhZ3MgfD0gV1FfRkxBR19FWENMVVNJVkU7Ci0gICAgX19hZGRfd2FpdF9xdWV1ZV90YWlsKCZ4LT53YWl0LCAmd2FpdCk7Ci0gICAgZG8gewotICAgICAgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0gICAgICAgIHJldCA9IC1FUkVTVEFSVFNZUzsKLSAgICAgICAgX19yZW1vdmVfd2FpdF9xdWV1ZSgmeC0+d2FpdCwgJndhaXQpOwotICAgICAgICBnb3RvIG91dDsKLSAgICAgIH0KLSAgICAgIF9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLSAgICAgIHNwaW5fdW5sb2NrX2lycSgmeC0+d2FpdC5sb2NrKTsKLSAgICAgIHNjaGVkdWxlKCk7Ci0gICAgICBzcGluX2xvY2tfaXJxKCZ4LT53YWl0LmxvY2spOwotICAgIH0gd2hpbGUgKCF4LT5kb25lKTsKLSAgICBfX3JlbW92ZV93YWl0X3F1ZXVlKCZ4LT53YWl0LCAmd2FpdCk7Ci0gIH0KLSAgeC0+ZG9uZS0tOwotb3V0OgotICBzcGluX3VubG9ja19pcnEoJngtPndhaXQubG9jayk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLSNlbmRpZgotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDY5KQotc3RhdGljIHZvaWQKLXVzYl9pbml0X3VyYihzdHJ1Y3QgdXJiICp1cmIpCi17Ci0JbWVtc2V0KHVyYiwgMCwgc2l6ZW9mKCp1cmIpKTsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApIC8qIHR1bmUgbWUhICovCi0JdXJiLT5jb3VudCA9IChhdG9taWNfdClBVE9NSUNfSU5JVCgxKTsKLSNlbmRpZgotCXNwaW5fbG9ja19pbml0KCZ1cmItPmxvY2spOwotfQotI2VuZGlmCi0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApIC8qIHR1bmUgbWUhICovCi0jICBkZWZpbmUgU1VCTUlUX1VSQih1LGYpICB1c2Jfc3VibWl0X3VyYih1LGYpCi0jZWxzZQotIyAgZGVmaW5lIFNVQk1JVF9VUkIodSxmKSAgdXNiX3N1Ym1pdF91cmIodSkKLSNlbmRpZgorI2RlZmluZSBTVUJNSVRfVVJCKHUsZikgIHVzYl9zdWJtaXRfdXJiKHUsZikKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qIFByb2plY3QgSW5jbHVkZXMgKi8KQEAgLTI1NywyMSArMTk4LDEyIEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIENhbGxiYWNrcyAqLwotI2lmZGVmIFVSQl9PTkxZX0NBTExCQUNLCiBzdGF0aWMgdm9pZAogaGZhMzg0eF91c2JvdXRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKTsKIHN0YXRpYyB2b2lkCiBoZmEzODR4X2N0bHhvdXRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKTsKIHN0YXRpYyB2b2lkCiBoZmEzODR4X3VzYmluX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYik7Ci0jZWxzZQotc3RhdGljIHZvaWQKLWhmYTM4NHhfdXNib3V0X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwotc3RhdGljIHZvaWQKLWhmYTM4NHhfY3RseG91dF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLXN0YXRpYyB2b2lkCi1oZmEzODR4X3VzYmluX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwotI2VuZGlmCiAKIHN0YXRpYyB2b2lkCiBoZmEzODR4X3VzYmluX3R4Y29tcGwod2xhbmRldmljZV90ICp3bGFuZGV2LCBoZmEzODR4X3VzYmluX3QgKnVzYmluKTsKQEAgLTM1OCw5ICsyOTAsOSBAQAogaGZhMzg0eF9kb3JyaWQoCiAJaGZhMzg0eF90ICpodywKIAlDTURfTU9ERSBtb2RlLAotCVVJTlQxNglyaWQsCisJdTE2CXJpZCwKIAl2b2lkCSpyaWRkYXRhLAotCVVJTlQJcmlkZGF0YWxlbiwKKwl1bnNpZ25lZCBpbnQJcmlkZGF0YWxlbiwKIAljdGx4X2NtZGNiX3QgY21kY2IsCiAJY3RseF91c2VyY2JfdCB1c2VyY2IsCiAJdm9pZAkqdXNlcmNiX2RhdGEpOwpAQCAtMzY5LDkgKzMwMSw5IEBACiBoZmEzODR4X2Rvd3JpZCgKIAloZmEzODR4X3QgKmh3LAogCUNNRF9NT0RFIG1vZGUsCi0JVUlOVDE2CXJpZCwKKwl1MTYJcmlkLAogCXZvaWQJKnJpZGRhdGEsCi0JVUlOVAlyaWRkYXRhbGVuLAorCXVuc2lnbmVkIGludAlyaWRkYXRhbGVuLAogCWN0bHhfY21kY2JfdCBjbWRjYiwKIAljdGx4X3VzZXJjYl90IHVzZXJjYiwKIAl2b2lkCSp1c2VyY2JfZGF0YSk7CkBAIC0zODAsMTAgKzMxMiwxMCBAQAogaGZhMzg0eF9kb3JtZW0oCiAJaGZhMzg0eF90ICpodywKIAlDTURfTU9ERSBtb2RlLAotCVVJTlQxNglwYWdlLAotCVVJTlQxNglvZmZzZXQsCisJdTE2CXBhZ2UsCisJdTE2CW9mZnNldCwKIAl2b2lkCSpkYXRhLAotCVVJTlQJbGVuLAorCXVuc2lnbmVkIGludAlsZW4sCiAJY3RseF9jbWRjYl90IGNtZGNiLAogCWN0bHhfdXNlcmNiX3QgdXNlcmNiLAogCXZvaWQJKnVzZXJjYl9kYXRhKTsKQEAgLTM5MiwxNiArMzI0LDE2IEBACiBoZmEzODR4X2Rvd21lbSgKIAloZmEzODR4X3QgKmh3LAogCUNNRF9NT0RFIG1vZGUsCi0JVUlOVDE2CXBhZ2UsCi0JVUlOVDE2CW9mZnNldCwKKwl1MTYJcGFnZSwKKwl1MTYJb2Zmc2V0LAogCXZvaWQJKmRhdGEsCi0JVUlOVAlsZW4sCisJdW5zaWduZWQgaW50CWxlbiwKIAljdGx4X2NtZGNiX3QgY21kY2IsCiAJY3RseF91c2VyY2JfdCB1c2VyY2IsCiAJdm9pZAkqdXNlcmNiX2RhdGEpOwogCiBzdGF0aWMgaW50Ci1oZmEzODR4X2lzZ29vZF9wZHJjb2RlKFVJTlQxNiBwZHJjb2RlKTsKK2hmYTM4NHhfaXNnb29kX3BkcmNvZGUodTE2IHBkcmNvZGUpOwogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyogRnVuY3Rpb24gRGVmaW5pdGlvbnMgKi8KQEAgLTQzNSwxNyArMzY3LDE3IEBACiAJV0xBTl9MT0dfREVCVUcoMywidXJiLT5waXBlPTB4JTA4eFxuIiwgdXJiLT5waXBlKTsKIAlXTEFOX0xPR19ERUJVRygzLCJ1cmItPnN0YXR1cz0weCUwOHhcbiIsIHVyYi0+c3RhdHVzKTsKIAlXTEFOX0xPR19ERUJVRygzLCJ1cmItPnRyYW5zZmVyX2ZsYWdzPTB4JTA4eFxuIiwgdXJiLT50cmFuc2Zlcl9mbGFncyk7Ci0JV0xBTl9MT0dfREVCVUcoMywidXJiLT50cmFuc2Zlcl9idWZmZXI9MHglMDh4XG4iLCAoVUlOVCl1cmItPnRyYW5zZmVyX2J1ZmZlcik7CisJV0xBTl9MT0dfREVCVUcoMywidXJiLT50cmFuc2Zlcl9idWZmZXI9MHglMDh4XG4iLCAodW5zaWduZWQgaW50KXVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKIAlXTEFOX0xPR19ERUJVRygzLCJ1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGg9MHglMDh4XG4iLCB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpOwogCVdMQU5fTE9HX0RFQlVHKDMsInVyYi0+YWN0dWFsX2xlbmd0aD0weCUwOHhcbiIsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJV0xBTl9MT0dfREVCVUcoMywidXJiLT5iYW5kd2lkdGg9MHglMDh4XG4iLCB1cmItPmJhbmR3aWR0aCk7Ci0JV0xBTl9MT0dfREVCVUcoMywidXJiLT5zZXR1cF9wYWNrZXQoY3RsKT0weCUwOHhcbiIsIChVSU5UKXVyYi0+c2V0dXBfcGFja2V0KTsKKwlXTEFOX0xPR19ERUJVRygzLCJ1cmItPnNldHVwX3BhY2tldChjdGwpPTB4JTA4eFxuIiwgKHVuc2lnbmVkIGludCl1cmItPnNldHVwX3BhY2tldCk7CiAJV0xBTl9MT0dfREVCVUcoMywidXJiLT5zdGFydF9mcmFtZShpc28vaXJxKT0weCUwOHhcbiIsIHVyYi0+c3RhcnRfZnJhbWUpOwogCVdMQU5fTE9HX0RFQlVHKDMsInVyYi0+aW50ZXJ2YWwoaXJxKT0weCUwOHhcbiIsIHVyYi0+aW50ZXJ2YWwpOwogCVdMQU5fTE9HX0RFQlVHKDMsInVyYi0+ZXJyb3JfY291bnQoaXNvKT0weCUwOHhcbiIsIHVyYi0+ZXJyb3JfY291bnQpOwogCVdMQU5fTE9HX0RFQlVHKDMsInVyYi0+dGltZW91dD0weCUwOHhcbiIsIHVyYi0+dGltZW91dCk7Ci0JV0xBTl9MT0dfREVCVUcoMywidXJiLT5jb250ZXh0PTB4JTA4eFxuIiwgKFVJTlQpdXJiLT5jb250ZXh0KTsKLQlXTEFOX0xPR19ERUJVRygzLCJ1cmItPmNvbXBsZXRlPTB4JTA4eFxuIiwgKFVJTlQpdXJiLT5jb21wbGV0ZSk7CisJV0xBTl9MT0dfREVCVUcoMywidXJiLT5jb250ZXh0PTB4JTA4eFxuIiwgKHVuc2lnbmVkIGludCl1cmItPmNvbnRleHQpOworCVdMQU5fTE9HX0RFQlVHKDMsInVyYi0+Y29tcGxldGU9MHglMDh4XG4iLCAodW5zaWduZWQgaW50KXVyYi0+Y29tcGxldGUpOwogfQogI2VuZGlmCiAKQEAgLTY1Miw3ICs1ODQsNyBAQAogCiAJLyogUmVzdW1lIHRyYW5zbWl0dGluZy4gKi8KIAlpZiAoIHRlc3RfYW5kX2NsZWFyX2JpdChXT1JLX1RYX1JFU1VNRSwgJmh3LT51c2JfZmxhZ3MpICkgewotCQlwODAyMTFuZXRkZXZfd2FrZV9xdWV1ZShody0+d2xhbmRldik7CisJCW5ldGlmX3dha2VfcXVldWUoaHctPndsYW5kZXYtPm5ldGRldik7CiAJfQogCiAJREJGRVhJVDsKQEAgLTcxMSw4ICs2NDMsOCBAQAogCXRhc2tsZXRfaW5pdCgmaHctPmNvbXBsZXRpb25fYmgsCiAJICAgICAgICAgICAgIGhmYTM4NHhfdXNiY3RseF9jb21wbGV0aW9uX3Rhc2ssCiAJICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKWh3KTsKLQlJTklUX1dPUksyKCZody0+bGlua19iaCwgcHJpc20yc3RhX3Byb2Nlc3NpbmdfZGVmZXIpOwotCUlOSVRfV09SSzIoJmh3LT51c2Jfd29yaywgaGZhMzg0eF91c2JfZGVmZXIpOworCUlOSVRfV09SSygmaHctPmxpbmtfYmgsIHByaXNtMnN0YV9wcm9jZXNzaW5nX2RlZmVyKTsKKwlJTklUX1dPUksoJmh3LT51c2Jfd29yaywgaGZhMzg0eF91c2JfZGVmZXIpOwogCiAJaW5pdF90aW1lcigmaHctPnRocm90dGxlKTsKIAlody0+dGhyb3R0bGUuZnVuY3Rpb24gPSBoZmEzODR4X3VzYl90aHJvdHRsZWZuOwpAQCAtNzMzLDcgKzY2NSw3IEBACiAJaHctPmxpbmtfc3RhdHVzID0gSEZBMzg0eF9MSU5LX05PVENPTk5FQ1RFRDsKIAlody0+c3RhdGUgPSBIRkEzODR4X1NUQVRFX0lOSVQ7CiAKLSAgICAgICAgSU5JVF9XT1JLMigmaHctPmNvbW1zcXVhbF9iaCwgcHJpc20yc3RhX2NvbW1zcXVhbF9kZWZlcik7CisgICAgICAgIElOSVRfV09SSygmaHctPmNvbW1zcXVhbF9iaCwgcHJpc20yc3RhX2NvbW1zcXVhbF9kZWZlcik7CiAJaW5pdF90aW1lcigmaHctPmNvbW1zcXVhbF90aW1lcik7CiAJaHctPmNvbW1zcXVhbF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGh3OwogCWh3LT5jb21tc3F1YWxfdGltZXIuZnVuY3Rpb24gPSBwcmlzbTJzdGFfY29tbXNxdWFsX3RpbWVyOwpAQCAtODg4LDcgKzgyMCw3IEBACiAKIAljb25zdCBoZmEzODR4X3VzYl9ycmlkcmVzcF90CSpycmlkcmVzcDsKIAl2b2lkCQkJKnJpZGRhdGE7Ci0JVUlOVAkJCXJpZGRhdGFsZW47CisJdW5zaWduZWQgaW50CQkJcmlkZGF0YWxlbjsKIH07CiB0eXBlZGVmIHN0cnVjdCB1c2JjdGx4X3JyaWRfY29tcGxldG9yIHVzYmN0bHhfcnJpZF9jb21wbGV0b3JfdDsKIApAQCAtOTE5LDcgKzg1MSw3IEBACiBpbml0X3JyaWRfY29tcGxldG9yKHVzYmN0bHhfcnJpZF9jb21wbGV0b3JfdCAqY29tcGxldG9yLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBoZmEzODR4X3VzYl9ycmlkcmVzcF90ICpycmlkcmVzcCwKICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcmlkZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgVUlOVCByaWRkYXRhbGVuKQorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcmlkZGF0YWxlbikKIHsKIAljb21wbGV0b3ItPmhlYWQuY29tcGxldGUgPSB1c2JjdGx4X3JyaWRfY29tcGxldG9yX2ZuOwogCWNvbXBsZXRvci0+cnJpZHJlc3AgPSBycmlkcmVzcDsKQEAgLTk1Miw3ICs4ODQsNyBAQAogCiAgICAgICAgIGNvbnN0IGhmYTM4NHhfdXNiX3JtZW1yZXNwX3QgICpybWVtcmVzcDsKICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGE7Ci0gICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbjsKKyAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBsZW47CiB9OwogdHlwZWRlZiBzdHJ1Y3QgdXNiY3RseF9ybWVtX2NvbXBsZXRvciB1c2JjdGx4X3JtZW1fY29tcGxldG9yX3Q7CiAKQEAgLTk2OSw3ICs5MDEsNyBAQAogaW5pdF9ybWVtX2NvbXBsZXRvcih1c2JjdGx4X3JtZW1fY29tcGxldG9yX3QgKmNvbXBsZXRvciwKICAgICAgICAgICAgICAgICAgICAgaGZhMzg0eF91c2Jfcm1lbXJlc3BfdCAqcm1lbXJlc3AsCiAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsCi0gICAgICAgICAgICAgICAgICAgIFVJTlQgbGVuKQorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGVuKQogewogCWNvbXBsZXRvci0+aGVhZC5jb21wbGV0ZSA9IHVzYmN0bHhfcm1lbV9jb21wbGV0b3JfZm47CiAJY29tcGxldG9yLT5ybWVtcmVzcCA9IHJtZW1yZXNwOwpAQCAtMTA4MCw3ICsxMDEyLDcgQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLWhmYTM4NHhfZG9ycmlkX3dhaXQoaGZhMzg0eF90ICpodywgVUlOVDE2IHJpZCwgdm9pZCAqcmlkZGF0YSwgVUlOVCByaWRkYXRhbGVuKQoraGZhMzg0eF9kb3JyaWRfd2FpdChoZmEzODR4X3QgKmh3LCB1MTYgcmlkLCB2b2lkICpyaWRkYXRhLCB1bnNpZ25lZCBpbnQgcmlkZGF0YWxlbikKIHsKIAlyZXR1cm4gaGZhMzg0eF9kb3JyaWQoaHcsIERPV0FJVCwKIAkgICAgICAgICAgICAgICAgICAgICAgcmlkLCByaWRkYXRhLCByaWRkYXRhbGVuLApAQCAtMTA4OSw3ICsxMDIxLDcgQEAKIAogc3RhdGljIGlubGluZSBpbnQKIGhmYTM4NHhfZG9ycmlkX2FzeW5jKGhmYTM4NHhfdCAqaHcsCi0gICAgICAgICAgICAgICAgICAgICBVSU5UMTYgcmlkLCB2b2lkICpyaWRkYXRhLCBVSU5UIHJpZGRhdGFsZW4sCisgICAgICAgICAgICAgICAgICAgICB1MTYgcmlkLCB2b2lkICpyaWRkYXRhLCB1bnNpZ25lZCBpbnQgcmlkZGF0YWxlbiwKICAgICAgICAgICAgICAgICAgICAgIGN0bHhfY21kY2JfdCBjbWRjYiwKICAgICAgICAgICAgICAgICAgICAgIGN0bHhfdXNlcmNiX3QgdXNlcmNiLAogICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmNiX2RhdGEpCkBAIC0xMTAwLDcgKzEwMzIsNyBAQAogfQogCiBzdGF0aWMgaW5saW5lIGludAotaGZhMzg0eF9kb3dyaWRfd2FpdChoZmEzODR4X3QgKmh3LCBVSU5UMTYgcmlkLCB2b2lkICpyaWRkYXRhLCBVSU5UIHJpZGRhdGFsZW4pCitoZmEzODR4X2Rvd3JpZF93YWl0KGhmYTM4NHhfdCAqaHcsIHUxNiByaWQsIHZvaWQgKnJpZGRhdGEsIHVuc2lnbmVkIGludCByaWRkYXRhbGVuKQogewogCXJldHVybiBoZmEzODR4X2Rvd3JpZChodywgRE9XQUlULAogCSAgICAgICAgICAgICAgICAgICAgICByaWQsIHJpZGRhdGEsIHJpZGRhdGFsZW4sCkBAIC0xMTA5LDcgKzEwNDEsNyBAQAogCiBzdGF0aWMgaW5saW5lIGludAogaGZhMzg0eF9kb3dyaWRfYXN5bmMoaGZhMzg0eF90ICpodywKLSAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiByaWQsIHZvaWQgKnJpZGRhdGEsIFVJTlQgcmlkZGF0YWxlbiwKKyAgICAgICAgICAgICAgICAgICAgIHUxNiByaWQsIHZvaWQgKnJpZGRhdGEsIHVuc2lnbmVkIGludCByaWRkYXRhbGVuLAogICAgICAgICAgICAgICAgICAgICAgY3RseF9jbWRjYl90IGNtZGNiLAogICAgICAgICAgICAgICAgICAgICAgY3RseF91c2VyY2JfdCB1c2VyY2IsCiAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyY2JfZGF0YSkKQEAgLTExMjEsNyArMTA1Myw3IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50CiBoZmEzODR4X2Rvcm1lbV93YWl0KGhmYTM4NHhfdCAqaHcsCi0gICAgICAgICAgICAgICAgICAgIFVJTlQxNiBwYWdlLCBVSU5UMTYgb2Zmc2V0LCB2b2lkICpkYXRhLCBVSU5UIGxlbikKKyAgICAgICAgICAgICAgICAgICAgdTE2IHBhZ2UsIHUxNiBvZmZzZXQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4pCiB7CiAJcmV0dXJuIGhmYTM4NHhfZG9ybWVtKGh3LCBET1dBSVQsCiAJICAgICAgICAgICAgICAgICAgICAgIHBhZ2UsIG9mZnNldCwgZGF0YSwgbGVuLApAQCAtMTEzMCw3ICsxMDYyLDcgQEAKIAogc3RhdGljIGlubGluZSBpbnQKIGhmYTM4NHhfZG9ybWVtX2FzeW5jKGhmYTM4NHhfdCAqaHcsCi0gICAgICAgICAgICAgICAgICAgICBVSU5UMTYgcGFnZSwgVUlOVDE2IG9mZnNldCwgdm9pZCAqZGF0YSwgVUlOVCBsZW4sCisgICAgICAgICAgICAgICAgICAgICB1MTYgcGFnZSwgdTE2IG9mZnNldCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbiwKICAgICAgICAgICAgICAgICAgICAgIGN0bHhfY21kY2JfdCBjbWRjYiwKICAgICAgICAgICAgICAgICAgICAgIGN0bHhfdXNlcmNiX3QgdXNlcmNiLAogICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmNiX2RhdGEpCkBAIC0xMTQzLDEwICsxMDc1LDEwIEBACiBzdGF0aWMgaW5saW5lIGludAogaGZhMzg0eF9kb3dtZW1fd2FpdCgKICAgICAgICAgaGZhMzg0eF90ICpodywKLSAgICAgICAgVUlOVDE2ICBwYWdlLAotICAgICAgICBVSU5UMTYgIG9mZnNldCwKKyAgICAgICAgdTE2ICBwYWdlLAorICAgICAgICB1MTYgIG9mZnNldCwKICAgICAgICAgdm9pZCAgICAqZGF0YSwKLSAgICAgICAgVUlOVCAgICBsZW4pCisgICAgICAgIHVuc2lnbmVkIGludCAgICBsZW4pCiB7CiAJcmV0dXJuIGhmYTM4NHhfZG93bWVtKGh3LCBET1dBSVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSwgb2Zmc2V0LCBkYXRhLCBsZW4sCkBAIC0xMTU2LDEwICsxMDg4LDEwIEBACiBzdGF0aWMgaW5saW5lIGludAogaGZhMzg0eF9kb3dtZW1fYXN5bmMoCiAgICAgICAgIGhmYTM4NHhfdCAqaHcsCi0gICAgICAgIFVJTlQxNiAgcGFnZSwKLSAgICAgICAgVUlOVDE2ICBvZmZzZXQsCisgICAgICAgIHUxNiAgcGFnZSwKKyAgICAgICAgdTE2ICBvZmZzZXQsCiAgICAgICAgIHZvaWQgICAgKmRhdGEsCi0gICAgICAgIFVJTlQgICAgbGVuLAorICAgICAgICB1bnNpZ25lZCBpbnQgICAgbGVuLAogICAgICAgICBjdGx4X2NtZGNiX3QgY21kY2IsCiAgICAgICAgIGN0bHhfdXNlcmNiX3QgdXNlcmNiLAogICAgICAgICB2b2lkICAgICp1c2VyY2JfZGF0YSkKQEAgLTEyNDYsNyArMTE3OCw3IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9jbWRfZGlzYWJsZShoZmEzODR4X3QgKmh3LCBVSU5UMTYgbWFjcG9ydCkKK2ludCBoZmEzODR4X2NtZF9kaXNhYmxlKGhmYTM4NHhfdCAqaHcsIHUxNiBtYWNwb3J0KQogewogCWludAlyZXN1bHQgPSAwOwogCWhmYTM4NHhfbWV0YWNtZF90IGNtZDsKQEAgLTEyODYsNyArMTIxOCw3IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9jbWRfZW5hYmxlKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBtYWNwb3J0KQoraW50IGhmYTM4NHhfY21kX2VuYWJsZShoZmEzODR4X3QgKmh3LCB1MTYgbWFjcG9ydCkKIHsKIAlpbnQJcmVzdWx0ID0gMDsKIAloZmEzODR4X21ldGFjbWRfdCBjbWQ7CkBAIC0xMzA1LDk1ICsxMjM3LDYgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2NtZF9ub3RpZnkKLSoKLSogU2VuZHMgYW4gaW5mbyBmcmFtZSB0byB0aGUgZmlybXdhcmUgdG8gYWx0ZXIgdGhlIGJlaGF2aW9yCi0qIG9mIHRoZSBmL3cgYXN5bmNoIHByb2Nlc3Nlcy4gIENhbiBvbmx5IGJlIGNhbGxlZCB3aGVuIHRoZSBNQUMKLSogaXMgaW4gdGhlIGVuYWJsZWQgc3RhdGUuCi0qCi0qIEFyZ3VtZW50czoKLSoJaHcJCWRldmljZSBzdHJ1Y3R1cmUKLSoJcmVjbGFpbQkJWzB8MV0gaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGdpdmVuIEZJRCB3aWxsCi0qCQkJYmUgaGFuZGVkIGJhY2sgKHZpYSBBbGxvYyBldmVudCkgZm9yIHJldXNlLgotKgkJCShob3N0IG9yZGVyKQotKglmaWQJCUZJRCBvZiBidWZmZXIgY29udGFpbmluZyB0aGUgZnJhbWUgdGhhdCB3YXMKLSoJCQlwcmV2aW91c2x5IGNvcGllZCB0byBNQUMgbWVtb3J5IHZpYSB0aGUgYmFwLgotKgkJCShob3N0IG9yZGVyKQotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZmFpbHVyZSAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yICh0aW1lb3V0fGJhZCBhcmcpCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoJaHctPnJlc3AwIHdpbGwgY29udGFpbiB0aGUgRklEIGJlaW5nIHVzZWQgYnkgYXN5bmMgbm90aWZ5Ci0qCXByb2Nlc3MuICBJZiByZWNsYWltPT0wLCByZXNwMCB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSBmaWQKLSoJYXJndW1lbnQuICBJZiByZWNsYWltPT0xLCByZXNwMCB3aWxsIGJlIHRoZSBkaWZmZXJlbnQuCi0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9jbWRfbm90aWZ5KGhmYTM4NHhfdCAqaHcsIFVJTlQxNiByZWNsYWltLCBVSU5UMTYgZmlkLAotCQkgICAgICAgdm9pZCAqYnVmLCBVSU5UMTYgbGVuKQotewotI2lmIDAKLQlpbnQJcmVzdWx0ID0gMDsKLQlVSU5UMTYJY21kOwotCURCRkVOVEVSOwotCWNtZCA9CUhGQTM4NHhfQ01EX0NNRENPREVfU0VUKEhGQTM4NHhfQ01EQ09ERV9OT1RJRlkpIHwKLQkJSEZBMzg0eF9DTURfUkVDTF9TRVQocmVjbGFpbSk7Ci0JcmVzdWx0ID0gaGZhMzg0eF9kb2NtZF93YWl0KGh3LCBjbWQpOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotI2VuZGlmCi1yZXR1cm4gMDsKLX0KLQotCi0jaWYgMAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfY21kX2lucXVpcnkKLSoKLSogUmVxdWVzdHMgYW4gaW5mbyBmcmFtZSBmcm9tIHRoZSBmaXJtd2FyZS4gIFRoZSBpbmZvIGZyYW1lIHdpbGwKLSogYmUgZGVsaXZlcmVkIGFzeW5jaHJvbm91c2x5IHZpYSB0aGUgSW5mbyBldmVudC4KLSoKLSogQXJndW1lbnRzOgotKglodwkJZGV2aWNlIHN0cnVjdHVyZQotKglmaWQJCUZJRCBvZiB0aGUgaW5mbyBmcmFtZSByZXF1ZXN0ZWQuIChob3N0IG9yZGVyKQotKgotKiBSZXR1cm5zOgotKgkwCQlzdWNjZXNzCi0qCT4wCQlmL3cgcmVwb3J0ZWQgZmFpbHVyZSAtIGYvdyBzdGF0dXMgY29kZQotKgk8MAkJZHJpdmVyIHJlcG9ydGVkIGVycm9yICh0aW1lb3V0fGJhZCBhcmcpCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2NtZF9pbnF1aXJ5KGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBmaWQpCi17Ci0JaW50CXJlc3VsdCA9IDA7Ci0JaGZhMzg0eF9tZXRhY21kX3QgY21kOwotCi0JREJGRU5URVI7Ci0KLQljbWQuY21kID0gSEZBMzg0eF9DTURfQ01EQ09ERV9TRVQoSEZBMzg0eF9DTURDT0RFX0lOUSk7Ci0JY21kLnBhcm0wID0gMDsKLQljbWQucGFybTEgPSAwOwotCWNtZC5wYXJtMiA9IDA7Ci0KLQlyZXN1bHQgPSBoZmEzODR4X2RvY21kX3dhaXQoaHcsICZjbWQpOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotI2VuZGlmCi0KLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIGhmYTM4NHhfY21kX21vbml0b3IKICoKQEAgLTE0MjMsNyArMTI2Niw3IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9jbWRfbW9uaXRvcihoZmEzODR4X3QgKmh3LCBVSU5UMTYgZW5hYmxlKQoraW50IGhmYTM4NHhfY21kX21vbml0b3IoaGZhMzg0eF90ICpodywgdTE2IGVuYWJsZSkKIHsKIAlpbnQJcmVzdWx0ID0gMDsKIAloZmEzODR4X21ldGFjbWRfdCBjbWQ7CkBAIC0xNDgxLDggKzEzMjQsOCBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfY21kX2Rvd25sb2FkKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBtb2RlLCBVSU5UMTYgbG93YWRkciwKLQkJCQlVSU5UMTYgaGlnaGFkZHIsIFVJTlQxNiBjb2RlbGVuKQoraW50IGhmYTM4NHhfY21kX2Rvd25sb2FkKGhmYTM4NHhfdCAqaHcsIHUxNiBtb2RlLCB1MTYgbG93YWRkciwKKwkJCQl1MTYgaGlnaGFkZHIsIHUxNiBjb2RlbGVuKQogewogCWludAlyZXN1bHQgPSAwOwogCWhmYTM4NHhfbWV0YWNtZF90IGNtZDsKQEAgLTE1MzIsNyArMTM3NSw3IEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHZvaWQKIGhmYTM4NHhfY29weV9mcm9tX2F1eCgKLQloZmEzODR4X3QgKmh3LCBVSU5UMzIgY2FyZGFkZHIsIFVJTlQzMiBhdXhjdGwsIHZvaWQgKmJ1ZiwgVUlOVCBsZW4pCisJaGZhMzg0eF90ICpodywgdTMyIGNhcmRhZGRyLCB1MzIgYXV4Y3RsLCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4pCiB7CiAJREJGRU5URVI7CiAJV0xBTl9MT0dfRVJST1IoIm5vdCB1c2VkIGluIFVTQi5cbiIpOwpAQCAtMTU2Niw3ICsxNDA5LDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogdm9pZAogaGZhMzg0eF9jb3B5X3RvX2F1eCgKLQloZmEzODR4X3QgKmh3LCBVSU5UMzIgY2FyZGFkZHIsIFVJTlQzMiBhdXhjdGwsIHZvaWQgKmJ1ZiwgVUlOVCBsZW4pCisJaGZhMzg0eF90ICpodywgdTMyIGNhcmRhZGRyLCB1MzIgYXV4Y3RsLCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4pCiB7CiAJREJGRU5URVI7CiAJV0xBTl9MT0dfRVJST1IoIm5vdCB1c2VkIGluIFVTQi5cbiIpOwpAQCAtMTU5OSw3OCArMTQ0MiwxMCBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBpbnQgaGZhMzg0eF9jb3JlcmVzZXQoaGZhMzg0eF90ICpodywgaW50IGhvbGR0aW1lLCBpbnQgc2V0dGxldGltZSwgaW50IGdlbmVzaXMpCiB7Ci0jaWYgMAotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpCi0Jc3RydWN0IHVzYl9kZXZpY2UJKnBhcmVudCA9IGh3LT51c2ItPnBhcmVudDsKLQlpbnQJCQlpOwotCWludAkJCXBvcnQgPSAtMTsKLSNlbmRpZgotI2VuZGlmCiAJaW50IAkJCXJlc3VsdCA9IDA7CiAKLQotI2RlZmluZSBQMl9VU0JfUlRfUE9SVAkJKFVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX09USEVSKQotI2RlZmluZSBQMl9VU0JfRkVBVF9SRVNFVAk0Ci0jZGVmaW5lIFAyX1VTQl9GRUFUX0NfUkVTRVQJMjAKLQogCURCRkVOVEVSOwogCi0jaWYgMAotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpCi0JLyogRmluZCB0aGUgaHViIHBvcnQgKi8KLQlmb3IgKCBpID0gMDsgaSA8IHBhcmVudC0+bWF4Y2hpbGQ7IGkrKykgewotCQlpZiAocGFyZW50LT5jaGlsZHJlbltpXSA9PSBody0+dXNiKSB7Ci0JCQlwb3J0ID0gaTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChwb3J0IDwgMCkgcmV0dXJuIC1FTk9FTlQ7Ci0KLQkvKiBTZXQgYW5kIGNsZWFyIHRoZSByZXNldCAqLwotCXVzYl9jb250cm9sX21zZyhwYXJlbnQsIHVzYl9zbmRjdHJscGlwZShwYXJlbnQsIDApLAotCQlVU0JfUkVRX1NFVF9GRUFUVVJFLCBQMl9VU0JfUlRfUE9SVCwgUDJfVVNCX0ZFQVRfUkVTRVQsCi0JCXBvcnQrMSwgTlVMTCwgMCwgMSpIWik7Ci0Jd2FpdF9tcyhob2xkdGltZSk7Ci0JdXNiX2NvbnRyb2xfbXNnKHBhcmVudCwgdXNiX3NuZGN0cmxwaXBlKHBhcmVudCwgMCksCi0JCVVTQl9SRVFfQ0xFQVJfRkVBVFVSRSwgUDJfVVNCX1JUX1BPUlQsIFAyX1VTQl9GRUFUX0NfUkVTRVQsCi0JCXBvcnQrMSwgTlVMTCwgMCwgMSpIWik7Ci0Jd2FpdF9tcyhzZXR0bGV0aW1lKTsKLQotCS8qIFNldCB0aGUgZGV2aWNlIGFkZHJlc3MgKi8KLQlyZXN1bHQ9dXNiX3NldF9hZGRyZXNzKGh3LT51c2IpOwotCWlmIChyZXN1bHQgPCAwKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCJyZXNldF91c2JkZXY6IERldiBub3QgYWNjZXB0aW5nIGFkZHJlc3MsICIKLQkJCSJyZXN1bHQ9JWRcbiIsIHJlc3VsdCk7Ci0JCWNsZWFyX2JpdChody0+dXNiLT5kZXZudW0sICZody0+dXNiLT5idXMtPmRldm1hcC5kZXZpY2VtYXApOwotCQlody0+dXNiLT5kZXZudW0gPSAtMTsKLQkJZ290byBkb25lOwotCX0KLQkvKiBMZXQgdGhlIGFkZHJlc3Mgc2V0dGxlICovCi0Jd2FpdF9tcygyMCk7Ci0KLQkvKiBBc3N1bWUgd2UncmUgcmV1c2luZyB0aGUgb3JpZ2luYWwgZGVzY3JpcHRvciBkYXRhICovCi0KLQkvKiBTZXQgdGhlIGNvbmZpZ3VyYXRpb24uICovCi0JV0xBTl9MT0dfREVCVUcoMywgIlNldHRpbmcgQ29uZmlndXJhdGlvbiAlZFxuIiwKLQkJaHctPnVzYi0+Y29uZmlnWzBdLmJDb25maWd1cmF0aW9uVmFsdWUpOwotCXJlc3VsdD11c2Jfc2V0X2NvbmZpZ3VyYXRpb24oaHctPnVzYiwgaHctPnVzYi0+Y29uZmlnWzBdLmJDb25maWd1cmF0aW9uVmFsdWUpOwotCWlmICggcmVzdWx0ICkgewotCQlXTEFOX0xPR19FUlJPUigidXNiX3NldF9jb25maWd1cmF0aW9uKCkgZmFpbGVkLCByZXN1bHQ9JWQuXG4iLAotCQkJCXJlc3VsdCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JLyogTGV0IHRoZSBjb25maWd1cmF0aW9uIHNldHRsZSAqLwotCXdhaXRfbXMoMjApOwotCi0gZG9uZToKLSNlbHNlCi0JcmVzdWx0PXVzYl9yZXNldF9kZXZpY2UoaHctPnVzYik7Ci0JaWYocmVzdWx0PDApIHsKLQkJV0xBTl9MT0dfRVJST1IoInVzYl9yZXNldF9kZXZpY2UoKSBmYWlsZWQsIHJlc3VsdD0lZC5cbiIscmVzdWx0KTsKLQl9Ci0jZW5kaWYKLSNlbmRpZgotCiAJcmVzdWx0PXVzYl9yZXNldF9kZXZpY2UoaHctPnVzYik7CiAJaWYocmVzdWx0PDApIHsKIAkJV0xBTl9MT0dfRVJST1IoInVzYl9yZXNldF9kZXZpY2UoKSBmYWlsZWQsIHJlc3VsdD0lZC5cbiIscmVzdWx0KTsKQEAgLTE5MjUsOSArMTcwMCw5IEBACiBoZmEzODR4X2RvcnJpZCgKIAloZmEzODR4X3QgKmh3LAogCUNNRF9NT0RFIG1vZGUsCi0JVUlOVDE2CXJpZCwKKwl1MTYJcmlkLAogCXZvaWQJKnJpZGRhdGEsCi0JVUlOVAlyaWRkYXRhbGVuLAorCXVuc2lnbmVkIGludAlyaWRkYXRhbGVuLAogICAgICAgICBjdGx4X2NtZGNiX3QgY21kY2IsCiAJY3RseF91c2VyY2JfdCB1c2VyY2IsCiAJdm9pZAkqdXNlcmNiX2RhdGEpCkBAIC0yMDExLDkgKzE3ODYsOSBAQAogaGZhMzg0eF9kb3dyaWQoCiAJaGZhMzg0eF90ICpodywKIAlDTURfTU9ERSBtb2RlLAotCVVJTlQxNglyaWQsCisJdTE2CXJpZCwKIAl2b2lkCSpyaWRkYXRhLAotCVVJTlQJcmlkZGF0YWxlbiwKKwl1bnNpZ25lZCBpbnQJcmlkZGF0YWxlbiwKIAljdGx4X2NtZGNiX3QgY21kY2IsCiAJY3RseF91c2VyY2JfdCB1c2VyY2IsCiAJdm9pZAkqdXNlcmNiX2RhdGEpCkBAIC0yMTA0LDEwICsxODc5LDEwIEBACiBoZmEzODR4X2Rvcm1lbSgKIAloZmEzODR4X3QgKmh3LAogCUNNRF9NT0RFIG1vZGUsCi0JVUlOVDE2CXBhZ2UsCi0JVUlOVDE2CW9mZnNldCwKKwl1MTYJcGFnZSwKKwl1MTYJb2Zmc2V0LAogCXZvaWQJKmRhdGEsCi0JVUlOVAlsZW4sCisJdW5zaWduZWQgaW50CWxlbiwKIAljdGx4X2NtZGNiX3QgY21kY2IsCiAJY3RseF91c2VyY2JfdCB1c2VyY2IsCiAJdm9pZAkqdXNlcmNiX2RhdGEpCkBAIC0yMjA1LDEwICsxOTgwLDEwIEBACiBoZmEzODR4X2Rvd21lbSgKIAloZmEzODR4X3QgKmh3LAogCUNNRF9NT0RFIG1vZGUsCi0JVUlOVDE2CXBhZ2UsCi0JVUlOVDE2CW9mZnNldCwKKwl1MTYJcGFnZSwKKwl1MTYJb2Zmc2V0LAogCXZvaWQJKmRhdGEsCi0JVUlOVAlsZW4sCisJdW5zaWduZWQgaW50CWxlbiwKIAljdGx4X2NtZGNiX3QgY21kY2IsCiAJY3RseF91c2VyY2JfdCB1c2VyY2IsCiAJdm9pZAkqdXNlcmNiX2RhdGEpCkBAIC0yMzI1LDcgKzIxMDAsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9kaXNhYmxlKGhmYTM4NHhfdCAqaHcsIFVJTlQxNiBtYWNwb3J0KQoraW50IGhmYTM4NHhfZHJ2cl9kaXNhYmxlKGhmYTM4NHhfdCAqaHcsIHUxNiBtYWNwb3J0KQogewogCWludAlyZXN1bHQgPSAwOwogCkBAIC0yMzY3LDcgKzIxNDIsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9lbmFibGUoaGZhMzg0eF90ICpodywgVUlOVDE2IG1hY3BvcnQpCitpbnQgaGZhMzg0eF9kcnZyX2VuYWJsZShoZmEzODR4X3QgKmh3LCB1MTYgbWFjcG9ydCkKIHsKIAlpbnQJcmVzdWx0ID0gMDsKIApAQCAtMjUyMCwyMiArMjI5NSwyMiBAQAogaW50CiBoZmEzODR4X2RydnJfZmxhc2hkbF93cml0ZSgKIAloZmEzODR4X3QJKmh3LAotCVVJTlQzMgkJZGFkZHIsCisJdTMyCQlkYWRkciwKIAl2b2lkCQkqYnVmLAotCVVJTlQzMgkJbGVuKQorCXUzMgkJbGVuKQogewogCWludAkJcmVzdWx0ID0gMDsKLQlVSU5UMzIJCWRsYnVmYWRkcjsKKwl1MzIJCWRsYnVmYWRkcjsKIAlpbnQJCW5idXJuczsKLQlVSU5UMzIJCWJ1cm5sZW47Ci0JVUlOVDMyCQlidXJuZGFkZHI7Ci0JVUlOVDE2CQlidXJubG87Ci0JVUlOVDE2CQlidXJuaGk7CisJdTMyCQlidXJubGVuOworCXUzMgkJYnVybmRhZGRyOworCXUxNgkJYnVybmxvOworCXUxNgkJYnVybmhpOwogCWludAkJbndyaXRlczsKLQlVSU5UOAkJKndyaXRlYnVmOwotCVVJTlQxNgkJd3JpdGVwYWdlOwotCVVJTlQxNgkJd3JpdGVvZmZzZXQ7Ci0JVUlOVDMyCQl3cml0ZWxlbjsKKwl1OAkJKndyaXRlYnVmOworCXUxNgkJd3JpdGVwYWdlOworCXUxNgkJd3JpdGVvZmZzZXQ7CisJdTMyCQl3cml0ZWxlbjsKIAlpbnQJCWk7CiAJaW50CQlqOwogCkBAIC0yNjg2LDcgKzI0NjEsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaGZhMzg0eF90ICpodywgVUlOVDE2IHJpZCwgdm9pZCAqYnVmLCBVSU5UMTYgbGVuKQoraW50IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaGZhMzg0eF90ICpodywgdTE2IHJpZCwgdm9pZCAqYnVmLCB1MTYgbGVuKQogewogCWludCAJCQlyZXN1bHQ7CiAJREJGRU5URVI7CkBAIC0yNzI3LDcgKzI1MDIsNyBAQAogaW50CiBoZmEzODR4X2RydnJfZ2V0Y29uZmlnX2FzeW5jKAogICAgICAgICAgaGZhMzg0eF90ICAgICAgICAgICAgICAgKmh3LAotICAgICAgICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgcmlkLAorICAgICAgICAgdTE2ICAgICAgICAgICAgICAgICAgcmlkLAogICAgICAgICAgY3RseF91c2VyY2JfdCAgICAgICAgICAgdXNlcmNiLAogICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKnVzZXJjYl9kYXRhKQogewpAQCAtMjc2MSw5ICsyNTM2LDkgQEAKIGludAogaGZhMzg0eF9kcnZyX3NldGNvbmZpZ19hc3luYygKICAgICAgICAgIGhmYTM4NHhfdCAgICAgICAqaHcsCi0gICAgICAgICBVSU5UMTYgICAgICAgICAgcmlkLAorICAgICAgICAgdTE2ICAgICAgICAgIHJpZCwKICAgICAgICAgIHZvaWQgICAgICAgICAgICAqYnVmLAotICAgICAgICAgVUlOVDE2ICAgICAgICAgIGxlbiwKKyAgICAgICAgIHUxNiAgICAgICAgICBsZW4sCiAgICAgICAgICBjdGx4X3VzZXJjYl90ICAgdXNlcmNiLAogICAgICAgICAgdm9pZCAgICAgICAgICAgICp1c2VyY2JfZGF0YSkKIHsKQEAgLTI3OTAsNyArMjU2NSw3IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX2hhbmRvdmVyKCBoZmEzODR4X3QgKmh3LCBVSU5UOCAqYWRkcikKK2ludCBoZmEzODR4X2RydnJfaGFuZG92ZXIoIGhmYTM4NHhfdCAqaHcsIHU4ICphZGRyKQogewogICAgICAgICBEQkZFTlRFUjsKIAlXTEFOX0xPR19FUlJPUigiTm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgaW4gVVNCIVxuIik7CkBAIC0yODI0LDg4ICsyNTk5LDYgQEAKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGhmYTM4NHhfZHJ2cl9tbWlfcmVhZAotKgotKiBSZWFkIG1taSByZWdpc3RlcnMuICBtbWkgaXMgaW50ZXJzaWwtc3BlYWsgZm9yIHRoZSBiYXNlYmFuZAotKiBwcm9jZXNzb3IgcmVnaXN0ZXJzLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIGh3ICAgICAgICAgICAgICBkZXZpY2Ugc3RydWN0dXJlCi0qICAgICAgIHJlZ2lzdGVyICAgICAgICBUaGUgdGVzdCByZWdpc3RlciB0byBiZSBhY2Nlc3NlZCAobXVzdCBiZSBldmVuICMpLgotKgotKiBSZXR1cm5zOgotKiAgICAgICAwICAgICAgICAgICAgICAgc3VjY2VzcwotKiAgICAgICA+MCAgICAgICAgICAgICAgZi93IHJlcG9ydGVkIGVycm9yIC0gZi93IHN0YXR1cyBjb2RlCi0qICAgICAgIDwwICAgICAgICAgICAgICBkcml2ZXIgcmVwb3J0ZWQgZXJyb3IKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qICAgICAgIHByb2Nlc3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9tbWlfcmVhZChoZmEzODR4X3QgKmh3LCBVSU5UMzIgYWRkciwgVUlOVDMyICpyZXNwKQotewotI2lmIDAKLSAgICAgICAgaW50ICAgICAgICAgICAgIHJlc3VsdCA9IDA7Ci0gICAgICAgIFVJTlQxNiAgY21kX2NvZGUgPSAoVUlOVDE2KSAweDMwOwotICAgICAgICBVSU5UMTYgcGFyYW0gPSAoVUlOVDE2KSBhZGRyOwotICAgICAgICBEQkZFTlRFUjsKLQotICAgICAgICAvKiBEbyBpIG5lZWQgYSBob3N0MmhmYS4uLiBjb252ZXJzaW9uID8gKi8KLSAgICAgICAgcmVzdWx0ID0gaGZhMzg0eF9kb2NtZF93YWl0KGh3LCBjbWRfY29kZSk7Ci0KLSAgICAgICAgREJGRVhJVDsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSNlbmRpZgotcmV0dXJuIDA7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBoZmEzODR4X2RydnJfbW1pX3dyaXRlCi0qCi0qIFJlYWQgbW1pIHJlZ2lzdGVycy4gIG1taSBpcyBpbnRlcnNpbC1zcGVhayBmb3IgdGhlIGJhc2ViYW5kCi0qIHByb2Nlc3NvciByZWdpc3RlcnMuCi0qCi0qIEFyZ3VtZW50czoKLSogICAgICAgaHcgICAgICAgICAgICAgIGRldmljZSBzdHJ1Y3R1cmUKLSogICAgICAgYWRkciAgICAgICAgICAgIFRoZSB0ZXN0IHJlZ2lzdGVyIHRvIGJlIGFjY2Vzc2VkIChtdXN0IGJlIGV2ZW4gIykuCi0qICAgICAgIGRhdGEgICAgICAgICAgICBUaGUgZGF0YSB2YWx1ZSB0byB3cml0ZSB0byB0aGUgcmVnaXN0ZXIuCi0qCi0qIFJldHVybnM6Ci0qICAgICAgIDAgICAgICAgICAgICAgICBzdWNjZXNzCi0qICAgICAgID4wICAgICAgICAgICAgICBmL3cgcmVwb3J0ZWQgZXJyb3IgLSBmL3cgc3RhdHVzIGNvZGUKLSogICAgICAgPDAgICAgICAgICAgICAgIGRyaXZlciByZXBvcnRlZCBlcnJvcgotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSogICAgICAgcHJvY2VzcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWludAotaGZhMzg0eF9kcnZyX21taV93cml0ZShoZmEzODR4X3QgKmh3LCBVSU5UMzIgYWRkciwgVUlOVDMyIGRhdGEpCi17Ci0jaWYgMAotICAgICAgICBpbnQgICAgICAgICAgICAgcmVzdWx0ID0gMDsKLSAgICAgICAgVUlOVDE2ICBjbWRfY29kZSA9IChVSU5UMTYpIDB4MzE7Ci0gICAgICAgIFVJTlQxNiBwYXJhbTAgPSAoVUlOVDE2KSBhZGRyOwotICAgICAgICBVSU5UMTYgcGFyYW0xID0gKFVJTlQxNikgZGF0YTsKLSAgICAgICAgREJGRU5URVI7Ci0KLSAgICAgICAgV0xBTl9MT0dfREVCVUcoMSwibW1pIHdyaXRlIDogYWRkciA9IDB4JTA4bHhcbiIsIGFkZHIpOwotICAgICAgICBXTEFOX0xPR19ERUJVRygxLCJtbWkgd3JpdGUgOiBkYXRhID0gMHglMDhseFxuIiwgZGF0YSk7Ci0KLSAgICAgICAgLyogRG8gaSBuZWVkIGEgaG9zdDJoZmEuLi4gY29udmVyc2lvbiA/ICovCi0gICAgICAgIHJlc3VsdCA9IGhmYTM4NHhfZG9jbWRfd2FpdChodywgY21kX2NvZGUpOwotCi0gICAgICAgIERCRkVYSVQ7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0jZW5kaWYKLXJldHVybiAwOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBoZmEzODR4X2RydnJfcmFtZGxfZGlzYWJsZQogKgogKiBFbmRzIHRoZSByYW0gZG93bmxvYWQgc3RhdGUuCkBAIC0yOTY5LDExICsyNjYyLDExIEBACiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogaW50Ci1oZmEzODR4X2RydnJfcmFtZGxfZW5hYmxlKGhmYTM4NHhfdCAqaHcsIFVJTlQzMiBleGVhZGRyKQoraGZhMzg0eF9kcnZyX3JhbWRsX2VuYWJsZShoZmEzODR4X3QgKmh3LCB1MzIgZXhlYWRkcikKIHsKIAlpbnQJCXJlc3VsdCA9IDA7Ci0JVUlOVDE2CQlsb3dhZGRyOwotCVVJTlQxNgkJaGlhZGRyOworCXUxNgkJbG93YWRkcjsKKwl1MTYJCWhpYWRkcjsKIAlpbnQJCWk7CiAJREJGRU5URVI7CiAJLyogQ2hlY2sgdGhhdCBhIHBvcnQgaXNuJ3QgYWN0aXZlICovCkBAIC0zMDQ0LDE2ICsyNzM3LDE2IEBACiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogaW50Ci1oZmEzODR4X2RydnJfcmFtZGxfd3JpdGUoaGZhMzg0eF90ICpodywgVUlOVDMyIGRhZGRyLCB2b2lkKiBidWYsIFVJTlQzMiBsZW4pCitoZmEzODR4X2RydnJfcmFtZGxfd3JpdGUoaGZhMzg0eF90ICpodywgdTMyIGRhZGRyLCB2b2lkKiBidWYsIHUzMiBsZW4pCiB7CiAJaW50CQlyZXN1bHQgPSAwOwogCWludAkJbndyaXRlczsKLQlVSU5UOAkJKmRhdGEgPSBidWY7CisJdTgJCSpkYXRhID0gYnVmOwogCWludAkJaTsKLQlVSU5UMzIJCWN1cnJhZGRyOwotCVVJTlQxNgkJY3VycnBhZ2U7Ci0JVUlOVDE2CQljdXJyb2Zmc2V0OwotCVVJTlQxNgkJY3VycmxlbjsKKwl1MzIJCWN1cnJhZGRyOworCXUxNgkJY3VycnBhZ2U7CisJdTE2CQljdXJyb2Zmc2V0OworCXUxNgkJY3VycmxlbjsKIAlEQkZFTlRFUjsKIAkvKiBDaGVjayB0aGF0IHdlJ3JlIGluIHRoZSByYW0gZG93bmxvYWQgc3RhdGUgKi8KIAlpZiAoIGh3LT5kbHN0YXRlICE9IEhGQTM4NHhfRExTVEFURV9SQU1FTkFCTEVEICkgewpAQCAtMzEyNSwyMSArMjgxOCwyMSBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3Mgb3Igbm9uLWNhcmQgaW50ZXJydXB0LgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX3JlYWRwZGEoaGZhMzg0eF90ICpodywgdm9pZCAqYnVmLCBVSU5UIGxlbikKK2ludCBoZmEzODR4X2RydnJfcmVhZHBkYShoZmEzODR4X3QgKmh3LCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4pCiB7CiAJaW50CQlyZXN1bHQgPSAwOwotCVVJTlQxNgkJKnBkYSA9IGJ1ZjsKKwl1MTYJCSpwZGEgPSBidWY7CiAJaW50CQlwZGFvayA9IDA7CiAJaW50CQltb3JlcGRycyA9IDE7CiAJaW50CQljdXJycGRyID0gMDsJLyogd29yZCBvZmZzZXQgb2YgdGhlIGN1cnJlbnQgcGRyICovCiAJc2l6ZV90CQlpOwotCVVJTlQxNgkJcGRybGVuOwkJLyogcGRyIGxlbmd0aCBpbiBieXRlcywgaG9zdCBvcmRlciAqLwotCVVJTlQxNgkJcGRyY29kZTsJLyogcGRyIGNvZGUsIGhvc3Qgb3JkZXIgKi8KLQlVSU5UMTYJCWN1cnJwYWdlOwotCVVJTlQxNgkJY3Vycm9mZnNldDsKKwl1MTYJCXBkcmxlbjsJCS8qIHBkciBsZW5ndGggaW4gYnl0ZXMsIGhvc3Qgb3JkZXIgKi8KKwl1MTYJCXBkcmNvZGU7CS8qIHBkciBjb2RlLCBob3N0IG9yZGVyICovCisJdTE2CQljdXJycGFnZTsKKwl1MTYJCWN1cnJvZmZzZXQ7CiAJc3RydWN0IHBkYWxvYyB7Ci0JCVVJTlQzMgljYXJkYWRkcjsKLQkJVUlOVDE2CWF1eGN0bDsKKwkJdTMyCWNhcmRhZGRyOworCQl1MTYJYXV4Y3RsOwogCX0gcGRhbG9jW10gPQogCXsKIAkJeyBIRkEzODQyX1BEQV9CQVNFLAkJMH0sCkBAIC0zMjQzLDcgKzI5MzYsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoaGZhMzg0eF90ICpodywgVUlOVDE2IHJpZCwgdm9pZCAqYnVmLCBVSU5UMTYgbGVuKQoraW50IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoaGZhMzg0eF90ICpodywgdTE2IHJpZCwgdm9pZCAqYnVmLCB1MTYgbGVuKQogewogCXJldHVybiBoZmEzODR4X2Rvd3JpZF93YWl0KGh3LCByaWQsIGJ1ZiwgbGVuKTsKIH0KQEAgLTMyNjcsMTkgKzI5NjAsMzggQEAKICogQ2FsbCBjb250ZXh0OgogKglwcm9jZXNzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwogaW50IGhmYTM4NHhfZHJ2cl9zdGFydChoZmEzODR4X3QgKmh3KQogewotCWludAkJcmVzdWx0OworCWludAkJcmVzdWx0LCByZXN1bHQxLCByZXN1bHQyOworCXUxNgkJc3RhdHVzOwogCURCRkVOVEVSOwogCiAJbWlnaHRfc2xlZXAoKTsKIAotCWlmICh1c2JfY2xlYXJfaGFsdChody0+dXNiLCBody0+ZW5kcF9pbikpIHsKKwkvKiBDbGVhciBlbmRwb2ludCBzdGFsbHMgLSBidXQgb25seSBkbyB0aGlzIGlmIHRoZSBlbmRwb2ludAorCSAqIGlzIHNob3dpbmcgYSBzdGFsbCBzdGF0dXMuIFNvbWUgcHJpc20yIGNhcmRzIHNlZW0gdG8gYmVoYXZlCisJICogYmFkbHkgaWYgYSBjbGVhcl9oYWx0IGlzIGNhbGxlZCB3aGVuIHRoZSBlbmRwb2ludCBpcyBhbHJlYWR5CisJICogb2sKKwkgKi8KKwlyZXN1bHQgPSB1c2JfZ2V0X3N0YXR1cyhody0+dXNiLCBVU0JfUkVDSVBfRU5EUE9JTlQsIGh3LT5lbmRwX2luLCAmc3RhdHVzKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlXTEFOX0xPR19FUlJPUigKKwkJCSJDYW5ub3QgZ2V0IGJ1bGsgaW4gZW5kcG9pbnQgc3RhdHVzLlxuIik7CisJCWdvdG8gZG9uZTsKKwl9CisJaWYgKChzdGF0dXMgPT0gMSkgJiYgdXNiX2NsZWFyX2hhbHQoaHctPnVzYiwgaHctPmVuZHBfaW4pKSB7CiAJCVdMQU5fTE9HX0VSUk9SKAogCQkJIkZhaWxlZCB0byByZXNldCBidWxrIGluIGVuZHBvaW50LlxuIik7CiAJfQogCi0JaWYgKHVzYl9jbGVhcl9oYWx0KGh3LT51c2IsIGh3LT5lbmRwX291dCkpIHsKKwlyZXN1bHQgPSB1c2JfZ2V0X3N0YXR1cyhody0+dXNiLCBVU0JfUkVDSVBfRU5EUE9JTlQsIGh3LT5lbmRwX291dCwgJnN0YXR1cyk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJV0xBTl9MT0dfRVJST1IoCisJCQkiQ2Fubm90IGdldCBidWxrIG91dCBlbmRwb2ludCBzdGF0dXMuXG4iKTsKKwkJZ290byBkb25lOworCX0KKwlpZiAoKHN0YXR1cyA9PSAxKSAmJiB1c2JfY2xlYXJfaGFsdChody0+dXNiLCBody0+ZW5kcF9vdXQpKSB7CiAJCVdMQU5fTE9HX0VSUk9SKAogCQkJIkZhaWxlZCB0byByZXNldCBidWxrIG91dCBlbmRwb2ludC5cbiIpOwogCX0KQEAgLTMyOTYsMTQgKzMwMDgsMzcgQEAKIAkJZ290byBkb25lOwogCX0KIAotCS8qIGNhbGwgaW5pdGlhbGl6ZSAqLwotCXJlc3VsdCA9IGhmYTM4NHhfY21kX2luaXRpYWxpemUoaHcpOwotCWlmIChyZXN1bHQgIT0gMCkgewotCQl1c2Jfa2lsbF91cmIoJmh3LT5yeF91cmIpOwotCQlXTEFOX0xPR19FUlJPUigKLQkJCSJjbWRfaW5pdGlhbGl6ZSgpIGZhaWxlZCwgcmVzdWx0PSVkXG4iLAotCQkJcmVzdWx0KTsKLQkJZ290byBkb25lOworCS8qIENhbGwgaW5pdGlhbGl6ZSB0d2ljZSwgd2l0aCBhIDEgc2Vjb25kIHNsZWVwIGluIGJldHdlZW4uCisJICogVGhpcyBpcyBhIG5hc3R5IHdvcmstYXJvdW5kIHNpbmNlIG1hbnkgcHJpc20yIGNhcmRzIHNlZW0gdG8KKwkgKiBuZWVkIHRpbWUgdG8gc2V0dGxlIGFmdGVyIGFuIGluaXQgZnJvbSBjb2xkLiBUaGUgc2Vjb25kCisJICogY2FsbCB0byBpbml0aWFsaXplIGluIHRoZW9yeSBpcyBub3QgbmVjZXNzYXJ5IC0gYnV0IHdlIGNhbGwKKwkgKiBpdCBhbnl3YXkgYXMgYSBkb3VibGUgaW5zdXJhbmNlIHBvbGljeToKKwkgKiAxKSBJZiB0aGUgZmlyc3QgaW5pdCBzaG91bGQgZmFpbCwgdGhlIHNlY29uZCBtYXkgd2VsbCBzdWNjZWVkCisJICogICAgYW5kIHRoZSBjYXJkIGNhbiBzdGlsbCBiZSB1c2VkCisJICogMikgSXQgaGVscHMgZW5zdXJlcyBhbGwgaXMgd2VsbCB3aXRoIHRoZSBjYXJkIGFmdGVyIHRoZSBmaXJzdAorCSAqICAgIGluaXQgYW5kIHNldHRsZSB0aW1lLgorCSAqLworCXJlc3VsdDEgPSBoZmEzODR4X2NtZF9pbml0aWFsaXplKGh3KTsKKwltc2xlZXAoMTAwMCk7CisJcmVzdWx0ID0gcmVzdWx0MiA9IGhmYTM4NHhfY21kX2luaXRpYWxpemUoaHcpOworCWlmIChyZXN1bHQxICE9IDApIHsKKwkJaWYgKHJlc3VsdDIgIT0gMCkgeworCQkJV0xBTl9MT0dfRVJST1IoCisJCQkJImNtZF9pbml0aWFsaXplKCkgZmFpbGVkIG9uIHR3byBhdHRlbXB0cywgcmVzdWx0cyAlZCBhbmQgJWRcbiIsCisJCQkJcmVzdWx0MSwgcmVzdWx0Mik7CisJCQl1c2Jfa2lsbF91cmIoJmh3LT5yeF91cmIpOworCQkJZ290byBkb25lOworCQl9IGVsc2UgeworCQkJV0xBTl9MT0dfREVCVUcoMCwgIkZpcnN0IGNtZF9pbml0aWFsaXplKCkgZmFpbGVkIChyZXN1bHQgJWQpLFxuIiwKKwkJCQlyZXN1bHQxKTsKKwkJCVdMQU5fTE9HX0RFQlVHKDAsICJidXQgc2Vjb25kIGF0dGVtcHQgc3VjY2VlZGVkLiBBbGwgc2hvdWxkIGJlIG9rXG4iKTsKKwkJfQorCX0gZWxzZSBpZiAocmVzdWx0MiAhPSAwKSB7CisJCVdMQU5fTE9HX1dBUk5JTkcoCisJCQkiRmlyc3QgY21kX2luaXRpYWxpemUoKSBzdWNjZWVkZWQsIGJ1dCBzZWNvbmQgYXR0ZW1wdCBmYWlsZWQgKHJlc3VsdD0lZClcbiIsCisJCQlyZXN1bHQyKTsKKwkJV0xBTl9MT0dfV0FSTklORygiTW9zdCBsaWtlbHkgdGhlIGNhcmQgd2lsbCBiZSBmdW5jdGlvbmFsXG4iKTsKKwkJCWdvdG8gZG9uZTsKIAl9CiAKIAlody0+c3RhdGUgPSBIRkEzODR4X1NUQVRFX1JVTk5JTkc7CkBAIC0zODQ5LDExICszNTg0LDcgQEAKICogQ2FsbCBjb250ZXh0OgogKglpbnRlcnJ1cHQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmZGVmIFVSQl9PTkxZX0NBTExCQUNLCiBzdGF0aWMgdm9pZCBoZmEzODR4X3VzYmluX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKLSNlbHNlCi1zdGF0aWMgdm9pZCBoZmEzODR4X3VzYmluX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi0jZW5kaWYKIHsKIAl3bGFuZGV2aWNlX3QJCSp3bGFuZGV2ID0gdXJiLT5jb250ZXh0OwogCWhmYTM4NHhfdAkJKmh3OwpAQCAtMzg2MSw3ICszNTkyLDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAgICAgICAgICAqc2tiID0gTlVMTDsKIAlpbnQJCQlyZXN1bHQ7CiAJaW50ICAgICAgICAgICAgICAgICAgICAgdXJiX3N0YXR1czsKLQlVSU5UMTYJCQl0eXBlOworCXUxNgkJCXR5cGU7CiAKIAllbnVtIFVTQklOX0FDVElPTiB7CiAJCUhBTkRMRSwKQEAgLTM4NzMsNyArMzYwNCw3IEBACiAKIAlpZiAoICF3bGFuZGV2IHx8CiAJICAgICAhd2xhbmRldi0+bmV0ZGV2IHx8Ci0JICAgICAhbmV0aWZfZGV2aWNlX3ByZXNlbnQod2xhbmRldi0+bmV0ZGV2KSApCisJICAgICB3bGFuZGV2LT5od3JlbW92ZWQgKQogCQlnb3RvIGV4aXQ7CiAKIAlodyA9IHdsYW5kZXYtPnByaXY7CkBAIC00MDg4LDcgKzM4MTksNyBAQAogCQlpZiAodW5sb2NrZWRfdXNiY3RseF9jYW5jZWxfYXN5bmMoaHcsIGN0bHgpID09IDApCiAJCQlydW5fcXVldWUgPSAxOwogCX0gZWxzZSB7Ci0JCWNvbnN0IFVJTlQxNiBpbnR5cGUgPSAodXNiaW4tPnR5cGUmfmhvc3QyaGZhMzg0eF8xNigweDgwMDApKTsKKwkJY29uc3QgdTE2IGludHlwZSA9ICh1c2Jpbi0+dHlwZSZ+aG9zdDJoZmEzODR4XzE2KDB4ODAwMCkpOwogCiAJCS8qCiAJCSAqIENoZWNrIHRoYXQgb3VyIG1lc3NhZ2UgaXMgd2hhdCB3ZSdyZSBleHBlY3RpbmcgLi4uCkBAIC00MTY4LDcgKzM4OTksNyBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzdGF0aWMgdm9pZCBoZmEzODR4X3VzYmluX3R4Y29tcGwod2xhbmRldmljZV90ICp3bGFuZGV2LCBoZmEzODR4X3VzYmluX3QgKnVzYmluKQogewotCVVJTlQxNgkJCXN0YXR1czsKKwl1MTYJCQlzdGF0dXM7CiAJREJGRU5URVI7CiAKIAlzdGF0dXMgPSBoZmEzODR4Mmhvc3RfMTYodXNiaW4tPnR5cGUpOyAvKiB5ZWFoIEkga25vdyBpdCBzYXlzIHR5cGUuLi4qLwpAQCAtNDIwOCw4ICszOTM5LDggQEAKIAloZmEzODR4X3QgICAgICAgICAgICAgICAqaHcgPSB3bGFuZGV2LT5wcml2OwogCWludCAgICAgICAgICAgICAgICAgICAgIGhkcmxlbjsKIAlwODAyMTFfcnhtZXRhX3QgICAgICAgICAqcnhtZXRhOwotCVVJTlQxNiAgICAgICAgICAgICAgICAgIGRhdGFfbGVuOwotCVVJTlQxNiAgICAgICAgICAgICAgICAgIGZjOworCXUxNiAgICAgICAgICAgICAgICAgIGRhdGFfbGVuOworCXUxNiAgICAgICAgICAgICAgICAgIGZjOwogCiAJREJGRU5URVI7CiAKQEAgLTQzMTUsMTIgKzQwNDYsMTEgQEAKIHN0YXRpYyB2b2lkIGhmYTM4NHhfaW50X3J4bW9uaXRvciggd2xhbmRldmljZV90ICp3bGFuZGV2LCBoZmEzODR4X3VzYl9yeGZybV90ICpyeGZybSkKIHsKIAloZmEzODR4X3J4X2ZyYW1lX3QgICAgICAgICAgICAgICpyeGRlc2MgPSAmKHJ4ZnJtLT5kZXNjKTsKLQlVSU5UCQkJCWhkcmxlbiA9IDA7Ci0JVUlOVAkJCQlkYXRhbGVuID0gMDsKLQlVSU5UCQkJCXNrYmxlbiA9IDA7Ci0JcDgwMjExbXNnX2xueGluZF93bGFuc25pZmZybV90CSptc2c7Ci0JVUlOVDgJCQkJKmRhdGFwOwotCVVJTlQxNgkJCQlmYzsKKwl1bnNpZ25lZCBpbnQJCQkJaGRybGVuID0gMDsKKwl1bnNpZ25lZCBpbnQJCQkJZGF0YWxlbiA9IDA7CisJdW5zaWduZWQgaW50CQkJCXNrYmxlbiA9IDA7CisJdTgJCQkJKmRhdGFwOworCXUxNgkJCQlmYzsKIAlzdHJ1Y3Qgc2tfYnVmZgkJCSpza2I7CiAJaGZhMzg0eF90CQkgICAgICAgICpodyA9IHdsYW5kZXYtPnByaXY7CiAKQEAgLTQzMzMsMTUgKzQwNjMsMTUgQEAKIAlkYXRhbGVuID0gaGZhMzg0eDJob3N0XzE2KHJ4ZGVzYy0+ZGF0YV9sZW4pOwogCiAJLyogQWxsb2NhdGUgYW4gaW5kIG1lc3NhZ2UrZnJhbWVzaXplIHNrYiAqLwotCXNrYmxlbiA9IHNpemVvZihwODAyMTFtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3QpICsKKwlza2JsZW4gPSBzaXplb2YocDgwMjExX2NhcGhkcl90KSArCiAJCWhkcmxlbiArIGRhdGFsZW4gKyBXTEFOX0NSQ19MRU47CiAKIAkvKiBzYW5pdHkgY2hlY2sgdGhlIGxlbmd0aCAqLwogCWlmICggc2tibGVuID4KLQkJKHNpemVvZihwODAyMTFtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3QpICsKLQkJV0xBTl9IRFJfQTRfTEVOICsgV0xBTl9EQVRBX01BWExFTiArIFdMQU5fQ1JDX0xFTikgKSB7CisJICAgICAoc2l6ZW9mKHA4MDIxMV9jYXBoZHJfdCkgKworCSAgICAgIFdMQU5fSERSX0E0X0xFTiArIFdMQU5fREFUQV9NQVhMRU4gKyBXTEFOX0NSQ19MRU4pICkgewogCQlXTEFOX0xPR19ERUJVRygxLCAib3ZlcmxlbiBmcm06IGxlbj0lemRcbiIsCi0JCQlza2JsZW4gLSBzaXplb2YocDgwMjExbXNnX2xueGluZF93bGFuc25pZmZybV90KSk7CisJCQkgICAgICAgc2tibGVuIC0gc2l6ZW9mKHA4MDIxMV9jYXBoZHJfdCkpOwogCX0KIAogCWlmICggKHNrYiA9IGRldl9hbGxvY19za2Ioc2tibGVuKSkgPT0gTlVMTCApIHsKQEAgLTQzNTEsNjYgKzQwODEsNyBAQAogCiAJLyogb25seSBwcmVwZW5kIHRoZSBwcmlzbSBoZWFkZXIgaWYgaW4gdGhlIHJpZ2h0IG1vZGUgKi8KIAlpZiAoKHdsYW5kZXYtPm5ldGRldi0+dHlwZSA9PSBBUlBIUkRfSUVFRTgwMjExX1BSSVNNKSAmJgotCSAgICAoaHctPnNuaWZmaGRyID09IDApKSB7Ci0JCWRhdGFwID0gc2tiX3B1dChza2IsIHNpemVvZihwODAyMTFtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3QpKTsKLQkJbXNnID0gKHA4MDIxMW1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fdCopIGRhdGFwOwotCi0JCS8qIEluaXRpYWxpemUgdGhlIG1lc3NhZ2UgbWVtYmVycyAqLwotCQltc2ctPm1zZ2NvZGUgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtOwotCQltc2ctPm1zZ2xlbiA9IHNpemVvZihwODAyMTFtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3QpOwotCQlzdHJjcHkobXNnLT5kZXZuYW1lLCB3bGFuZGV2LT5uYW1lKTsKLQotCQltc2ctPmhvc3R0aW1lLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1faG9zdHRpbWU7Ci0JCW1zZy0+aG9zdHRpbWUuc3RhdHVzID0gMDsKLQkJbXNnLT5ob3N0dGltZS5sZW4gPSA0OwotCQltc2ctPmhvc3R0aW1lLmRhdGEgPSBqaWZmaWVzOwotCi0JCW1zZy0+bWFjdGltZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX21hY3RpbWU7Ci0JCW1zZy0+bWFjdGltZS5zdGF0dXMgPSAwOwotCQltc2ctPm1hY3RpbWUubGVuID0gNDsKLQkJbXNnLT5tYWN0aW1lLmRhdGEgPSByeGRlc2MtPnRpbWU7Ci0KLQkJbXNnLT5jaGFubmVsLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fY2hhbm5lbDsKLQkJbXNnLT5jaGFubmVsLnN0YXR1cyA9IDA7Ci0JCW1zZy0+Y2hhbm5lbC5sZW4gPSA0OwotCQltc2ctPmNoYW5uZWwuZGF0YSA9IGh3LT5zbmlmZl9jaGFubmVsOwotCi0JCW1zZy0+cnNzaS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3Jzc2k7Ci0JCW1zZy0+cnNzaS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX25vX3ZhbHVlOwotCQltc2ctPnJzc2kubGVuID0gNDsKLQkJbXNnLT5yc3NpLmRhdGEgPSAwOwotCi0JCW1zZy0+c3EuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9zcTsKLQkJbXNnLT5zcS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX25vX3ZhbHVlOwotCQltc2ctPnNxLmxlbiA9IDQ7Ci0JCW1zZy0+c3EuZGF0YSA9IDA7Ci0KLQkJbXNnLT5zaWduYWwuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9zaWduYWw7Ci0JCW1zZy0+c2lnbmFsLnN0YXR1cyA9IDA7Ci0JCW1zZy0+c2lnbmFsLmxlbiA9IDQ7Ci0JCW1zZy0+c2lnbmFsLmRhdGEgPSByeGRlc2MtPnNpZ25hbDsKLQotCQltc2ctPm5vaXNlLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fbm9pc2U7Ci0JCW1zZy0+bm9pc2Uuc3RhdHVzID0gMDsKLQkJbXNnLT5ub2lzZS5sZW4gPSA0OwotCQltc2ctPm5vaXNlLmRhdGEgPSByeGRlc2MtPnNpbGVuY2U7Ci0KLQkJbXNnLT5yYXRlLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fcmF0ZTsKLQkJbXNnLT5yYXRlLnN0YXR1cyA9IDA7Ci0JCW1zZy0+cmF0ZS5sZW4gPSA0OwotCQltc2ctPnJhdGUuZGF0YSA9IHJ4ZGVzYy0+cmF0ZSAvIDU7IC8qIHNldCB0byA4MDIuMTEgdW5pdHMgKi8KLQotCQltc2ctPmlzdHguZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9pc3R4OwotCQltc2ctPmlzdHguc3RhdHVzID0gMDsKLQkJbXNnLT5pc3R4LmxlbiA9IDQ7Ci0JCW1zZy0+aXN0eC5kYXRhID0gUDgwMjExRU5VTV90cnV0aF9mYWxzZTsKLQotCQltc2ctPmZybWxlbi5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2ZybWxlbjsKLQkJbXNnLT5mcm1sZW4uc3RhdHVzID0gMDsKLQkJbXNnLT5mcm1sZW4ubGVuID0gNDsKLQkJbXNnLT5mcm1sZW4uZGF0YSA9IGhkcmxlbiArIGRhdGFsZW4gKyBXTEFOX0NSQ19MRU47Ci0JfSBlbHNlIGlmICgod2xhbmRldi0+bmV0ZGV2LT50eXBlID09IEFSUEhSRF9JRUVFODAyMTFfUFJJU00pICYmCi0JCSAgIChody0+c25pZmZoZHIgIT0gMCkpIHsKKwkgICAgKGh3LT5zbmlmZmhkciAhPSAwKSkgewogCQlwODAyMTFfY2FwaGRyX3QJCSpjYXBoZHI7CiAJCS8qIFRoZSBORVcgaGVhZGVyIGZvcm1hdCEgKi8KIAkJZGF0YXAgPSBza2JfcHV0KHNrYiwgc2l6ZW9mKHA4MDIxMV9jYXBoZHJfdCkpOwpAQCAtNDUwOCwxMSArNDE3OSw3IEBACiAqIENhbGwgY29udGV4dDoKICoJaW50ZXJydXB0CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZmRlZiBVUkJfT05MWV9DQUxMQkFDSwogc3RhdGljIHZvaWQgaGZhMzg0eF91c2JvdXRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQotI2Vsc2UKLXN0YXRpYyB2b2lkIGhmYTM4NHhfdXNib3V0X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi0jZW5kaWYKIHsKIAl3bGFuZGV2aWNlX3QJCSp3bGFuZGV2ID0gdXJiLT5jb250ZXh0OwogCWhmYTM4NHhfdXNib3V0X3QJKnVzYm91dCA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwpAQCAtNDU4OSwxMSArNDI1Niw3IEBACiAqIENhbGwgY29udGV4dDoKICogaW50ZXJydXB0CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZmRlZiBVUkJfT05MWV9DQUxMQkFDSwogc3RhdGljIHZvaWQgaGZhMzg0eF9jdGx4b3V0X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKLSNlbHNlCi1zdGF0aWMgdm9pZCBoZmEzODR4X2N0bHhvdXRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLSNlbmRpZgogewogCWhmYTM4NHhfdAkqaHcgPSB1cmItPmNvbnRleHQ7CiAJaW50ICAgICAgICAgICAgIGRlbGV0ZV9yZXNwdGltZXIgPSAwOwpAQCAtNDk2OSw3ICs0NjMyLDcgQEAKICogQ2FsbCBjb250ZXh0OgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzdGF0aWMgaW50Ci1oZmEzODR4X2lzZ29vZF9wZHJjb2RlKFVJTlQxNiBwZHJjb2RlKQoraGZhMzg0eF9pc2dvb2RfcGRyY29kZSh1MTYgcGRyY29kZSkKIHsKIAlzd2l0Y2gocGRyY29kZSkgewogCWNhc2UgSEZBMzg0eF9QRFJfRU5EX09GX1BEQToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMWNvbnYuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMWNvbnYuYwppbmRleCA2ODEyMWI5Li5kZmM3YjNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFjb252LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExY29udi5jCkBAIC01MiwxMCArNTIsNiBAQAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qIFN5c3RlbSBJbmNsdWRlcyAqLwogCi0jZGVmaW5lIF9fTk9fVkVSU0lPTl9fCQkvKiBwcmV2ZW50IHRoZSBzdGF0aWMgZGVmaW5pdGlvbiAqLwotCi0KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTcwLDcgKzY2LDYgQEAKIAogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KIAotI2luY2x1ZGUgInZlcnNpb24uaCIKICNpbmNsdWRlICJ3bGFuX2NvbXBhdC5oIgogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpAQCAtMTAwLDggKzk1LDggQEAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKiBMb2NhbCBTdGF0aWMgRGVmaW5pdGlvbnMgKi8KIAotc3RhdGljIFVJTlQ4CW91aV9yZmMxMDQyW10gPSB7MHgwMCwgMHgwMCwgMHgwMH07Ci1zdGF0aWMgVUlOVDgJb3VpXzgwMjFoW10gPSB7MHgwMCwgMHgwMCwgMHhmOH07CitzdGF0aWMgdTgJb3VpX3JmYzEwNDJbXSA9IHsweDAwLCAweDAwLCAweDAwfTsKK3N0YXRpYyB1OAlvdWlfODAyMWhbXSA9IHsweDAwLCAweDAwLCAweGY4fTsKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qIExvY2FsIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyAqLwpAQCAtMTM1LDExICsxMzAsMTEgQEAKICogQ2FsbCBjb250ZXh0OgogKglNYXkgYmUgY2FsbGVkIGluIGludGVycnVwdCBvciBub24taW50ZXJydXB0IGNvbnRleHQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHNrYl9ldGhlcl90b19wODAyMTEoIHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgVUlOVDMyIGV0aGNvbnYsIHN0cnVjdCBza19idWZmICpza2IsIHA4MDIxMV9oZHJfdCAqcDgwMjExX2hkciwgcDgwMjExX21ldGF3ZXBfdCAqcDgwMjExX3dlcCkKK2ludCBza2JfZXRoZXJfdG9fcDgwMjExKCB3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHUzMiBldGhjb252LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBwODAyMTFfaGRyX3QgKnA4MDIxMV9oZHIsIHA4MDIxMV9tZXRhd2VwX3QgKnA4MDIxMV93ZXApCiB7CiAKLQlVSU5UMTYgICAgICAgICAgZmM7Ci0JVUlOVDE2ICAgICAgICAgIHByb3RvOworCXUxNiAgICAgICAgICBmYzsKKwl1MTYgICAgICAgICAgcHJvdG87CiAJd2xhbl9ldGhoZHJfdCAgIGVfaGRyOwogCXdsYW5fbGxjX3QgICAgICAqZV9sbGM7CiAJd2xhbl9zbmFwX3QgICAgICplX3NuYXA7CkBAIC0yOTgsMTQgKzI5MywxNCBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCU1heSBiZSBjYWxsZWQgaW4gaW50ZXJydXB0IG9yIG5vbi1pbnRlcnJ1cHQgY29udGV4dAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgc2tiX3A4MDIxMV90b19ldGhlciggd2xhbmRldmljZV90ICp3bGFuZGV2LCBVSU5UMzIgZXRoY29udiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK2ludCBza2JfcDgwMjExX3RvX2V0aGVyKCB3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHUzMiBldGhjb252LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCW5ldGRldmljZV90ICAgICAqbmV0ZGV2ID0gd2xhbmRldi0+bmV0ZGV2OwotCVVJTlQxNiAgICAgICAgICBmYzsKLQlVSU5UICAgICAgICAgICAgcGF5bG9hZF9sZW5ndGg7Ci0JVUlOVCAgICAgICAgICAgIHBheWxvYWRfb2Zmc2V0OwotCVVJTlQ4CQlkYWRkcltXTEFOX0VUSEFERFJfTEVOXTsKLQlVSU5UOAkJc2FkZHJbV0xBTl9FVEhBRERSX0xFTl07CisJdTE2ICAgICAgICAgIGZjOworCXVuc2lnbmVkIGludCAgICAgICAgICAgIHBheWxvYWRfbGVuZ3RoOworCXVuc2lnbmVkIGludCAgICAgICAgICAgIHBheWxvYWRfb2Zmc2V0OworCXU4CQlkYWRkcltXTEFOX0VUSEFERFJfTEVOXTsKKwl1OAkJc2FkZHJbV0xBTl9FVEhBRERSX0xFTl07CiAJcDgwMjExX2hkcl90ICAgICp3X2hkcjsKIAl3bGFuX2V0aGhkcl90ICAgKmVfaGRyOwogCXdsYW5fbGxjX3QgICAgICAqZV9sbGM7CkBAIC0zMzMsMTEgKzMyOCwxMSBAQAogCQltZW1jcHkoc2FkZHIsIHdfaGRyLT5hMy5hMiwgV0xBTl9FVEhBRERSX0xFTik7CiAJfSBlbHNlIHsKIAkJcGF5bG9hZF9vZmZzZXQgPSBXTEFOX0hEUl9BNF9MRU47Ci0JCXBheWxvYWRfbGVuZ3RoIC09ICggV0xBTl9IRFJfQTRfTEVOIC0gV0xBTl9IRFJfQTNfTEVOICk7Ci0JCWlmIChwYXlsb2FkX2xlbmd0aCA8IDAgKSB7CisJCWlmIChwYXlsb2FkX2xlbmd0aCA8IFdMQU5fSERSX0E0X0xFTiAtIFdMQU5fSERSX0EzX0xFTikgewogCQkJV0xBTl9MT0dfRVJST1IoIkE0IGZyYW1lIHRvbyBzaG9ydCFcbiIpOwogCQkJcmV0dXJuIDE7CiAJCX0KKwkJcGF5bG9hZF9sZW5ndGggLT0gKFdMQU5fSERSX0E0X0xFTiAtIFdMQU5fSERSX0EzX0xFTik7CiAJCW1lbWNweShkYWRkciwgd19oZHItPmE0LmEzLCBXTEFOX0VUSEFERFJfTEVOKTsKIAkJbWVtY3B5KHNhZGRyLCB3X2hkci0+YTQuYTQsIFdMQU5fRVRIQUREUl9MRU4pOwogCX0KQEAgLTQ5Nyw4ICs0OTIsMTYgQEAKIAogCX0KIAorICAgICAgICAvKgorICAgICAgICAgKiBOb3RlIHRoYXQgZXRoX3R5cGVfdHJhbnMoKSBleHBlY3RzIGFuIHNrYiB3LyBza2ItPmRhdGEgcG9pbnRpbmcKKyAgICAgICAgICogYXQgdGhlIE1BQyBoZWFkZXIsIGl0IHRoZW4gc2V0cyB0aGUgZm9sbG93aW5nIHNrYiBtZW1iZXJzOgorICAgICAgICAgKiBza2ItPm1hY19oZWFkZXIsCisgICAgICAgICAqIHNrYi0+ZGF0YSwgYW5kCisgICAgICAgICAqIHNrYi0+cGt0X3R5cGUuCisgICAgICAgICAqIEl0IHRoZW4gX3JldHVybnNfIHRoZSB2YWx1ZSB0aGF0IF93ZSdyZV8gc3VwcG9zZWQgdG8gc3R1ZmYgaW4KKyAgICAgICAgICogc2tiLT5wcm90b2NvbC4gIFRoaXMgaXMgbnV0cy4KKyAgICAgICAgICovCiAJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgbmV0ZGV2KTsKLQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCiAgICAgICAgIC8qIGprcmllZ2w6IHByb2Nlc3Mgc2lnbmFsIGFuZCBub2lzZSBhcyBzZXQgaW4gaGZhMzg0eF9pbnRfcngoKSAqLwogCS8qIGprcmllZ2w6IG9ubHkgcHJvY2VzcyBzaWduYWwvbm9pc2UgaWYgcmVxdWVzdGVkIGJ5IGl3c3B5ICovCkBAIC01MjgsNyArNTMxLDcgQEAKICogQ2FsbCBjb250ZXh0OgogKglNYXkgYmUgY2FsbGVkIGluIGludGVycnVwdCBvciBub24taW50ZXJydXB0IGNvbnRleHQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHA4MDIxMV9zdHRfZmluZHByb3RvKFVJTlQxNiBwcm90bykKK2ludCBwODAyMTFfc3R0X2ZpbmRwcm90byh1MTYgcHJvdG8pCiB7CiAJLyogQWx3YXlzIHJldHVybiBmb3VuZCBmb3Igbm93LiAgVGhpcyBpcyB0aGUgYmVoYXZpb3IgdXNlZCBieSB0aGUgKi8KIAkvKiAgWm9vbSBXaW45NSBkcml2ZXIgd2hlbiA4MDIuMWggbW9kZSBpcyBzZWxlY3RlZCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExY29udi5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExY29udi5oCmluZGV4IDNmNWFiNTdjLi41MzhlOWJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFjb252LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExY29udi5oCkBAIC04NiwyMiArODYsMjIgQEAKIHsKIAlzdHJ1Y3Qgd2xhbmRldmljZQkqd2xhbmRldjsKIAotCVVJTlQ2NAltYWN0aW1lOwkvKiBIaS1yZXogTUFDLXN1cHBsaWVkIHRpbWUgdmFsdWUgKi8KLQlVSU5UNjQJaG9zdHRpbWU7CS8qIEJlc3QtcmV6IGhvc3Qgc3VwcGxpZWQgdGltZSB2YWx1ZSAqLworCXU2NAltYWN0aW1lOwkvKiBIaS1yZXogTUFDLXN1cHBsaWVkIHRpbWUgdmFsdWUgKi8KKwl1NjQJaG9zdHRpbWU7CS8qIEJlc3QtcmV6IGhvc3Qgc3VwcGxpZWQgdGltZSB2YWx1ZSAqLwogCi0JVUlOVAlyeHJhdGU7CQkvKiBSZWNlaXZlIGRhdGEgcmF0ZSBpbiAxMDBrYnBzICovCi0JVUlOVAlwcmlvcml0eTsJLyogMC0xNSwgMD1jb250ZW50aW9uLCA2PUNGICovCi0JSU5UCXNpZ25hbDsJCS8qIEFuIFNTSSwgc2VlIHA4MDIxMW5ldGRldi5oICovCi0JSU5UCW5vaXNlOwkJLyogQW4gU1NJLCBzZWUgcDgwMjExbmV0ZGV2LmggKi8KLQlVSU5UCWNoYW5uZWw7CS8qIFJlY2VpdmUgY2hhbm5lbCAobW9zdGx5IGZvciBzbmlmcykgKi8KLQlVSU5UCXByZWFtYmxlOwkvKiBQODAyMTFFTlVNX3ByZWFtYmxldHlwZV8qICovCi0JVUlOVAllbmNvZGluZzsJLyogUDgwMjExRU5VTV9lbmNvZGluZ18qICovCisJdW5zaWduZWQgaW50CXJ4cmF0ZTsJCS8qIFJlY2VpdmUgZGF0YSByYXRlIGluIDEwMGticHMgKi8KKwl1bnNpZ25lZCBpbnQJcHJpb3JpdHk7CS8qIDAtMTUsIDA9Y29udGVudGlvbiwgNj1DRiAqLworCWludAlzaWduYWw7CQkvKiBBbiBTU0ksIHNlZSBwODAyMTFuZXRkZXYuaCAqLworCWludAlub2lzZTsJCS8qIEFuIFNTSSwgc2VlIHA4MDIxMW5ldGRldi5oICovCisJdW5zaWduZWQgaW50CWNoYW5uZWw7CS8qIFJlY2VpdmUgY2hhbm5lbCAobW9zdGx5IGZvciBzbmlmcykgKi8KKwl1bnNpZ25lZCBpbnQJcHJlYW1ibGU7CS8qIFA4MDIxMUVOVU1fcHJlYW1ibGV0eXBlXyogKi8KKwl1bnNpZ25lZCBpbnQJZW5jb2Rpbmc7CS8qIFA4MDIxMUVOVU1fZW5jb2RpbmdfKiAqLwogCiB9IHA4MDIxMV9yeG1ldGFfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExX2ZybW1ldGEKIHsKLQlVSU5UCQkJbWFnaWM7CisJdW5zaWduZWQgaW50CQkJbWFnaWM7CiAJcDgwMjExX3J4bWV0YV90CQkqcng7CiB9IHA4MDIxMV9mcm1tZXRhX3Q7CiAKQEAgLTExNywyMCArMTE3LDIwIEBACiAgKi8KIHR5cGVkZWYgc3RydWN0IHA4MDIxMV9jYXBoZHIKIHsKLQlVSU5UMzIJCXZlcnNpb247Ci0JVUlOVDMyCQlsZW5ndGg7Ci0JVUlOVDY0CQltYWN0aW1lOwotCVVJTlQ2NAkJaG9zdHRpbWU7Ci0JVUlOVDMyCQlwaHl0eXBlOwotCVVJTlQzMgkJY2hhbm5lbDsKLQlVSU5UMzIJCWRhdGFyYXRlOwotCVVJTlQzMgkJYW50ZW5uYTsKLQlVSU5UMzIJCXByaW9yaXR5OwotCVVJTlQzMgkJc3NpX3R5cGU7Ci0JSU5UMzIJCXNzaV9zaWduYWw7Ci0JSU5UMzIJCXNzaV9ub2lzZTsKLQlVSU5UMzIJCXByZWFtYmxlOwotCVVJTlQzMgkJZW5jb2Rpbmc7CisJdTMyCQl2ZXJzaW9uOworCXUzMgkJbGVuZ3RoOworCXU2NAkJbWFjdGltZTsKKwl1NjQJCWhvc3R0aW1lOworCXUzMgkJcGh5dHlwZTsKKwl1MzIJCWNoYW5uZWw7CisJdTMyCQlkYXRhcmF0ZTsKKwl1MzIJCWFudGVubmE7CisJdTMyCQlwcmlvcml0eTsKKwl1MzIJCXNzaV90eXBlOworCXMzMgkJc3NpX3NpZ25hbDsKKwlzMzIJCXNzaV9ub2lzZTsKKwl1MzIJCXByZWFtYmxlOworCXUzMgkJZW5jb2Rpbmc7CiB9IHA4MDIxMV9jYXBoZHJfdDsKIAogLyogYnVmZmVyIGZyZWUgbWV0aG9kIHBvaW50ZXIgdHlwZSAqLwpAQCAtMTM4LDMxICsxMzgsMzEgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExX21ldGF3ZXAgewogCXZvaWQgICpkYXRhOwotCVVJTlQ4IGl2WzRdOwotCVVJTlQ4IGljdls0XTsKKwl1OCBpdls0XTsKKwl1OCBpY3ZbNF07CiB9IHA4MDIxMV9tZXRhd2VwX3Q7CiAKIC8qIGxvY2FsIGV0aGVyIGhlYWRlciB0eXBlICovCiB0eXBlZGVmIHN0cnVjdCB3bGFuX2V0aGhkcgogewotCVVJTlQ4CWRhZGRyW1dMQU5fRVRIQUREUl9MRU5dOwotCVVJTlQ4CXNhZGRyW1dMQU5fRVRIQUREUl9MRU5dOwotCVVJTlQxNgl0eXBlOworCXU4CWRhZGRyW1dMQU5fRVRIQUREUl9MRU5dOworCXU4CXNhZGRyW1dMQU5fRVRIQUREUl9MRU5dOworCXUxNgl0eXBlOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyB3bGFuX2V0aGhkcl90OwogCiAvKiBsb2NhbCBsbGMgaGVhZGVyIHR5cGUgKi8KIHR5cGVkZWYgc3RydWN0IHdsYW5fbGxjCiB7Ci0JVUlOVDgJZHNhcDsKLQlVSU5UOAlzc2FwOwotCVVJTlQ4CWN0bDsKKwl1OAlkc2FwOworCXU4CXNzYXA7CisJdTgJY3RsOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyB3bGFuX2xsY190OwogCiAvKiBsb2NhbCBzbmFwIGhlYWRlciB0eXBlICovCiB0eXBlZGVmIHN0cnVjdCB3bGFuX3NuYXAKIHsKLQlVSU5UOAlvdWlbV0xBTl9JRUVFX09VSV9MRU5dOwotCVVJTlQxNgl0eXBlOworCXU4CW91aVtXTEFOX0lFRUVfT1VJX0xFTl07CisJdTE2CXR5cGU7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHdsYW5fc25hcF90OwogCiAvKiBDaXJjdWxhciBpbmNsdWRlIHRyaWNrICovCkBAIC0xNzQsMTMgKzE3NCwxMyBAQAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qRnVuY3Rpb24gRGVjbGFyYXRpb25zICovCiAKLWludCBza2JfcDgwMjExX3RvX2V0aGVyKCBzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgVUlOVDMyIGV0aGNvbnYsCitpbnQgc2tiX3A4MDIxMV90b19ldGhlciggc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHUzMiBldGhjb252LAogCQkJIHN0cnVjdCBza19idWZmICpza2IpOwotaW50IHNrYl9ldGhlcl90b19wODAyMTEoIHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCBVSU5UMzIgZXRoY29udiwKK2ludCBza2JfZXRoZXJfdG9fcDgwMjExKCBzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdTMyIGV0aGNvbnYsCiAJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwgcDgwMjExX2hkcl90ICpwODAyMTFfaGRyLAogCQkJIHA4MDIxMV9tZXRhd2VwX3QgKnA4MDIxMV93ZXAgKTsKIAotaW50IHA4MDIxMV9zdHRfZmluZHByb3RvKFVJTlQxNiBwcm90byk7Ci1pbnQgcDgwMjExX3N0dF9hZGRwcm90byhVSU5UMTYgcHJvdG8pOworaW50IHA4MDIxMV9zdHRfZmluZHByb3RvKHUxNiBwcm90byk7CitpbnQgcDgwMjExX3N0dF9hZGRwcm90byh1MTYgcHJvdG8pOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMWhkci5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExaGRyLmgKaW5kZXggYjdiMDg3Mi4uNzJmMTJhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExaGRyLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExaGRyLmgKQEAgLTE2NiwyOSArMTY2LDI5IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9GQ19GU1RZUEUoV0xBTl9GU1RZUEVfUlRTKSApOyAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLSNkZWZpbmUgV0xBTl9HRVRfRkNfUFZFUihuKQkgKCgoVUlOVDE2KShuKSkgJiAoQklUMCB8IEJJVDEpKQotI2RlZmluZSBXTEFOX0dFVF9GQ19GVFlQRShuKQkoKCgoVUlOVDE2KShuKSkgJiAoQklUMiB8IEJJVDMpKSA+PiAyKQotI2RlZmluZSBXTEFOX0dFVF9GQ19GU1RZUEUobikJKCgoKFVJTlQxNikobikpICYgKEJJVDR8QklUNXxCSVQ2fEJJVDcpKSA+PiA0KQotI2RlZmluZSBXTEFOX0dFVF9GQ19UT0RTKG4pIAkoKCgoVUlOVDE2KShuKSkgJiAoQklUOCkpID4+IDgpCi0jZGVmaW5lIFdMQU5fR0VUX0ZDX0ZST01EUyhuKQkoKCgoVUlOVDE2KShuKSkgJiAoQklUOSkpID4+IDkpCi0jZGVmaW5lIFdMQU5fR0VUX0ZDX01PUkVGUkFHKG4pICgoKChVSU5UMTYpKG4pKSAmIChCSVQxMCkpID4+IDEwKQotI2RlZmluZSBXTEFOX0dFVF9GQ19SRVRSWShuKQkoKCgoVUlOVDE2KShuKSkgJiAoQklUMTEpKSA+PiAxMSkKLSNkZWZpbmUgV0xBTl9HRVRfRkNfUFdSTUdUKG4pCSgoKChVSU5UMTYpKG4pKSAmIChCSVQxMikpID4+IDEyKQotI2RlZmluZSBXTEFOX0dFVF9GQ19NT1JFREFUQShuKSAoKCgoVUlOVDE2KShuKSkgJiAoQklUMTMpKSA+PiAxMykKLSNkZWZpbmUgV0xBTl9HRVRfRkNfSVNXRVAobikJKCgoKFVJTlQxNikobikpICYgKEJJVDE0KSkgPj4gMTQpCi0jZGVmaW5lIFdMQU5fR0VUX0ZDX09SREVSKG4pCSgoKChVSU5UMTYpKG4pKSAmIChCSVQxNSkpID4+IDE1KQorI2RlZmluZSBXTEFOX0dFVF9GQ19QVkVSKG4pCSAoKCh1MTYpKG4pKSAmIChCSVQwIHwgQklUMSkpCisjZGVmaW5lIFdMQU5fR0VUX0ZDX0ZUWVBFKG4pCSgoKCh1MTYpKG4pKSAmIChCSVQyIHwgQklUMykpID4+IDIpCisjZGVmaW5lIFdMQU5fR0VUX0ZDX0ZTVFlQRShuKQkoKCgodTE2KShuKSkgJiAoQklUNHxCSVQ1fEJJVDZ8QklUNykpID4+IDQpCisjZGVmaW5lIFdMQU5fR0VUX0ZDX1RPRFMobikgCSgoKCh1MTYpKG4pKSAmIChCSVQ4KSkgPj4gOCkKKyNkZWZpbmUgV0xBTl9HRVRfRkNfRlJPTURTKG4pCSgoKCh1MTYpKG4pKSAmIChCSVQ5KSkgPj4gOSkKKyNkZWZpbmUgV0xBTl9HRVRfRkNfTU9SRUZSQUcobikgKCgoKHUxNikobikpICYgKEJJVDEwKSkgPj4gMTApCisjZGVmaW5lIFdMQU5fR0VUX0ZDX1JFVFJZKG4pCSgoKCh1MTYpKG4pKSAmIChCSVQxMSkpID4+IDExKQorI2RlZmluZSBXTEFOX0dFVF9GQ19QV1JNR1QobikJKCgoKHUxNikobikpICYgKEJJVDEyKSkgPj4gMTIpCisjZGVmaW5lIFdMQU5fR0VUX0ZDX01PUkVEQVRBKG4pICgoKCh1MTYpKG4pKSAmIChCSVQxMykpID4+IDEzKQorI2RlZmluZSBXTEFOX0dFVF9GQ19JU1dFUChuKQkoKCgodTE2KShuKSkgJiAoQklUMTQpKSA+PiAxNCkKKyNkZWZpbmUgV0xBTl9HRVRfRkNfT1JERVIobikJKCgoKHUxNikobikpICYgKEJJVDE1KSkgPj4gMTUpCiAKLSNkZWZpbmUgV0xBTl9TRVRfRkNfUFZFUihuKQkoKFVJTlQxNikobikpCi0jZGVmaW5lIFdMQU5fU0VUX0ZDX0ZUWVBFKG4pCSgoKFVJTlQxNikobikpIDw8IDIpCi0jZGVmaW5lIFdMQU5fU0VUX0ZDX0ZTVFlQRShuKQkoKChVSU5UMTYpKG4pKSA8PCA0KQotI2RlZmluZSBXTEFOX1NFVF9GQ19UT0RTKG4pIAkoKChVSU5UMTYpKG4pKSA8PCA4KQotI2RlZmluZSBXTEFOX1NFVF9GQ19GUk9NRFMobikJKCgoVUlOVDE2KShuKSkgPDwgOSkKLSNkZWZpbmUgV0xBTl9TRVRfRkNfTU9SRUZSQUcobikgKCgoVUlOVDE2KShuKSkgPDwgMTApCi0jZGVmaW5lIFdMQU5fU0VUX0ZDX1JFVFJZKG4pCSgoKFVJTlQxNikobikpIDw8IDExKQotI2RlZmluZSBXTEFOX1NFVF9GQ19QV1JNR1QobikJKCgoVUlOVDE2KShuKSkgPDwgMTIpCi0jZGVmaW5lIFdMQU5fU0VUX0ZDX01PUkVEQVRBKG4pICgoKFVJTlQxNikobikpIDw8IDEzKQotI2RlZmluZSBXTEFOX1NFVF9GQ19JU1dFUChuKQkoKChVSU5UMTYpKG4pKSA8PCAxNCkKLSNkZWZpbmUgV0xBTl9TRVRfRkNfT1JERVIobikJKCgoVUlOVDE2KShuKSkgPDwgMTUpCisjZGVmaW5lIFdMQU5fU0VUX0ZDX1BWRVIobikJKCh1MTYpKG4pKQorI2RlZmluZSBXTEFOX1NFVF9GQ19GVFlQRShuKQkoKCh1MTYpKG4pKSA8PCAyKQorI2RlZmluZSBXTEFOX1NFVF9GQ19GU1RZUEUobikJKCgodTE2KShuKSkgPDwgNCkKKyNkZWZpbmUgV0xBTl9TRVRfRkNfVE9EUyhuKSAJKCgodTE2KShuKSkgPDwgOCkKKyNkZWZpbmUgV0xBTl9TRVRfRkNfRlJPTURTKG4pCSgoKHUxNikobikpIDw8IDkpCisjZGVmaW5lIFdMQU5fU0VUX0ZDX01PUkVGUkFHKG4pICgoKHUxNikobikpIDw8IDEwKQorI2RlZmluZSBXTEFOX1NFVF9GQ19SRVRSWShuKQkoKCh1MTYpKG4pKSA8PCAxMSkKKyNkZWZpbmUgV0xBTl9TRVRfRkNfUFdSTUdUKG4pCSgoKHUxNikobikpIDw8IDEyKQorI2RlZmluZSBXTEFOX1NFVF9GQ19NT1JFREFUQShuKSAoKCh1MTYpKG4pKSA8PCAxMykKKyNkZWZpbmUgV0xBTl9TRVRfRkNfSVNXRVAobikJKCgodTE2KShuKSkgPDwgMTQpCisjZGVmaW5lIFdMQU5fU0VUX0ZDX09SREVSKG4pCSgoKHUxNikobikpIDw8IDE1KQogCiAvKi0tLSBEdXJhdGlvbiBNYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBNYWNyb3MgdG8gZ2V0L3NldCB0aGUgYml0ZmllbGRzIG9mIHRoZSBEdXJhdGlvbiBGaWVsZCAgICAgICovCkBAIC0yMDEsNDUgKzIwMSw0NSBAQAogLyogTWFjcm9zIHRvIGdldC9zZXQgdGhlIGJpdGZpZWxkcyBvZiB0aGUgU2VxdWVuY2UgQ29udHJvbCAgICAqLwogLyogRmllbGQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBXTEFOX0dFVF9TRVFfRlJHTlVNKG4pICgoKFVJTlQxNikobikpICYgKEJJVDB8QklUMXxCSVQyfEJJVDMpKQotI2RlZmluZSBXTEFOX0dFVF9TRVFfU0VRTlVNKG4pICgoKChVSU5UMTYpKG4pKSAmICh+KEJJVDB8QklUMXxCSVQyfEJJVDMpKSkgPj4gNCkKKyNkZWZpbmUgV0xBTl9HRVRfU0VRX0ZSR05VTShuKSAoKCh1MTYpKG4pKSAmIChCSVQwfEJJVDF8QklUMnxCSVQzKSkKKyNkZWZpbmUgV0xBTl9HRVRfU0VRX1NFUU5VTShuKSAoKCgodTE2KShuKSkgJiAofihCSVQwfEJJVDF8QklUMnxCSVQzKSkpID4+IDQpCiAKIC8qLS0tIERhdGEgcHRyIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENyZWF0ZXMgYSBVSU5UOCogdG8gdGhlIGRhdGEgcG9ydGlvbiBvZiBhIGZyYW1lICAgICAgICAgICAgKi8KKy8qIENyZWF0ZXMgYSB1OCogdG8gdGhlIGRhdGEgcG9ydGlvbiBvZiBhIGZyYW1lICAgICAgICAgICAgKi8KIC8qIEFzc3VtZXMgeW91J3JlIHBhc3NpbmcgaW4gYSBwdHIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgaGRyKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgV0xBTl9IRFJfQTNfREFUQVAocCkgKCgoVUlOVDgqKShwKSkgKyBXTEFOX0hEUl9BM19MRU4pCi0jZGVmaW5lIFdMQU5fSERSX0E0X0RBVEFQKHApICgoKFVJTlQ4KikocCkpICsgV0xBTl9IRFJfQTRfTEVOKQorI2RlZmluZSBXTEFOX0hEUl9BM19EQVRBUChwKSAoKCh1OCopKHApKSArIFdMQU5fSERSX0EzX0xFTikKKyNkZWZpbmUgV0xBTl9IRFJfQTRfREFUQVAocCkgKCgodTgqKShwKSkgKyBXTEFOX0hEUl9BNF9MRU4pCiAKLSNkZWZpbmUgRE9UMTFfUkFURTVfSVNCQVNJQ19HRVQocikgICAgICgoKFVJTlQ4KShyKSkgJiBCSVQ3KQorI2RlZmluZSBET1QxMV9SQVRFNV9JU0JBU0lDX0dFVChyKSAgICAgKCgodTgpKHIpKSAmIEJJVDcpCiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKiBUeXBlcyAqLwogCiAvKiBCU1MgVGltZXN0YW1wICovCi10eXBlZGVmIFVJTlQ4IHdsYW5fYnNzX3RzX3RbV0xBTl9CU1NfVFNfTEVOXTsKK3R5cGVkZWYgdTggd2xhbl9ic3NfdHNfdFtXTEFOX0JTU19UU19MRU5dOwogCiAvKiBHZW5lcmljIDgwMi4xMSBIZWFkZXIgdHlwZXMgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExX2hkcl9hMwogewotCVVJTlQxNglmYzsKLQlVSU5UMTYJZHVyOwotCVVJTlQ4CWExW1dMQU5fQUREUl9MRU5dOwotCVVJTlQ4CWEyW1dMQU5fQUREUl9MRU5dOwotCVVJTlQ4CWEzW1dMQU5fQUREUl9MRU5dOwotCVVJTlQxNglzZXE7CisJdTE2CWZjOworCXUxNglkdXI7CisJdTgJYTFbV0xBTl9BRERSX0xFTl07CisJdTgJYTJbV0xBTl9BRERSX0xFTl07CisJdTgJYTNbV0xBTl9BRERSX0xFTl07CisJdTE2CXNlcTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExX2hkcl9hM190OwogCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFfaGRyX2E0CiB7Ci0JVUlOVDE2CWZjOwotCVVJTlQxNglkdXI7Ci0JVUlOVDgJYTFbV0xBTl9BRERSX0xFTl07Ci0JVUlOVDgJYTJbV0xBTl9BRERSX0xFTl07Ci0JVUlOVDgJYTNbV0xBTl9BRERSX0xFTl07Ci0JVUlOVDE2CXNlcTsKLQlVSU5UOAlhNFtXTEFOX0FERFJfTEVOXTsKKwl1MTYJZmM7CisJdTE2CWR1cjsKKwl1OAlhMVtXTEFOX0FERFJfTEVOXTsKKwl1OAlhMltXTEFOX0FERFJfTEVOXTsKKwl1OAlhM1tXTEFOX0FERFJfTEVOXTsKKwl1MTYJc2VxOworCXU4CWE0W1dMQU5fQUREUl9MRU5dOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFfaGRyX2E0X3Q7CiAKIHR5cGVkZWYgdW5pb24gcDgwMjExX2hkcgpAQCAtMjcxLDkgKzI3MSw5IEBACiAjZGVmaW5lIFdMQU5fRkNTX0xFTgkJCTQKIAogLyogZnRjbCBpbiBIT1NUIG9yZGVyICovCi1pbmxpbmUgc3RhdGljIFVJTlQxNiBwODAyMTFfaGVhZGVybGVuKFVJTlQxNiBmY3RsKQoraW5saW5lIHN0YXRpYyB1MTYgcDgwMjExX2hlYWRlcmxlbih1MTYgZmN0bCkKIHsKLQlVSU5UMTYgaGRybGVuID0gMDsKKwl1MTYgaGRybGVuID0gMDsKIAogCXN3aXRjaCAoIFdMQU5fR0VUX0ZDX0ZUWVBFKGZjdGwpICkgewogCWNhc2UgV0xBTl9GVFlQRV9NR01UOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExaW9jdGwuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMWlvY3RsLmgKaW5kZXggMjViMmVhOC4uYWQ2N2I2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExaW9jdGwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFpb2N0bC5oCkBAIC0xMDYsOSArMTA2LDkgQEAKIHsKIAljaGFyIAluYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdOwogCWNhZGRyX3QgZGF0YTsKLQlVSU5UMzIJbWFnaWM7Ci0JVUlOVDE2CWxlbjsKLQlVSU5UMzIJcmVzdWx0OworCXUzMgltYWdpYzsKKwl1MTYJbGVuOworCXUzMglyZXN1bHQ7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMWlvY3RsX3JlcV90OwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1ldGEuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1ldGEuaAppbmRleCA1Y2IzZjVhLi44YjYxZTVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZXRhLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWV0YS5oCkBAIC05MCw3ICs5MCw3IEBACiAjZGVmaW5lIE1LTUlCTUVUQVNJWkUobmFtZSkJCXA4MDIxMW1ldGFfICMjIG1pYiAjIyBfICMjIG5hbWUgIyMgXyAjIyBzaXplCiAjZGVmaW5lIE1LR1JQTUVUQVNJWkUobmFtZSkJCXA4MDIxMW1ldGFfICMjIGdycCAjIyBfICMjIG5hbWUgIyMgXyAjIyBzaXplCiAKLSNkZWZpbmUgR0VUTUVUQVNJWkUoYXB0cikJCSgqKigoVUlOVDMyKiopKGFwdHIpKSkKKyNkZWZpbmUgR0VUTUVUQVNJWkUoYXB0cikJCSgqKigodTMyKiopKGFwdHIpKSkKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIFRoZSBmb2xsb3dpbmcgaWZkZWYgZGVwZW5kcyBvbiB0aGUgZm9sbG93aW5nIGRlZmluZXM6ICovCkBAIC0xMTQsMTQgKzExNCwxNCBAQAogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbWV0YQogewogCWNoYXIJCQkqbmFtZTsJCS8qIGRhdGEgaXRlbSBuYW1lICovCi0JVUlOVDMyCQkJZGlkOwkJLyogcGFydGlhbCBkaWQgKi8KLQlVSU5UMzIJCQlmbGFnczsJCS8qIHNldCBvZiB2YXJpb3VzIGZsYWcgYml0cyAqLwotCVVJTlQzMgkJCW1pbjsJCS8qIG1pbiB2YWx1ZSBvZiBhIEJPVU5ERURJTlQgKi8KLQlVSU5UMzIJCQltYXg7CQkvKiBtYXggdmFsdWUgb2YgYSBCT1VOREVESU5UICovCisJdTMyCQkJZGlkOwkJLyogcGFydGlhbCBkaWQgKi8KKwl1MzIJCQlmbGFnczsJCS8qIHNldCBvZiB2YXJpb3VzIGZsYWcgYml0cyAqLworCXUzMgkJCW1pbjsJCS8qIG1pbiB2YWx1ZSBvZiBhIEJPVU5ERURpbnQgKi8KKwl1MzIJCQltYXg7CQkvKiBtYXggdmFsdWUgb2YgYSBCT1VOREVEaW50ICovCiAKLQlVSU5UMzIJCQltYXhsZW47CQkvKiBtYXhsZW4gb2YgYSBPQ1RFVFNUUiBvciBESVNQTEFZU1RSICovCi0JVUlOVDMyCQkJbWlubGVuOwkJLyogbWlubGVuIG9mIGEgT0NURVRTVFIgb3IgRElTUExBWVNUUiAqLwotCXA4MDIxMWVudW1fdAkJKmVudW1wdHI7CS8qIHB0ciB0byB0aGUgZW51bSB0eXBlIGZvciBFTlVNSU5UICovCisJdTMyCQkJbWF4bGVuOwkJLyogbWF4bGVuIG9mIGEgT0NURVRTVFIgb3IgRElTUExBWVNUUiAqLworCXUzMgkJCW1pbmxlbjsJCS8qIG1pbmxlbiBvZiBhIE9DVEVUU1RSIG9yIERJU1BMQVlTVFIgKi8KKwlwODAyMTFlbnVtX3QJCSplbnVtcHRyOwkvKiBwdHIgdG8gdGhlIGVudW0gdHlwZSBmb3IgRU5VTWludCAqLwogCXA4MDIxMV90b3RleHRfdAkJdG90ZXh0cHRyOwkvKiBwdHIgdG8gdG90ZXh0IGNvbnZlcnNpb24gZnVuY3Rpb24gKi8KIAlwODAyMTFfZnJvbXRleHRfdAlmcm9tdGV4dHB0cjsJLyogcHRyIHRvIHRvdGV4dCBjb252ZXJzaW9uIGZ1bmN0aW9uICovCiAJcDgwMjExX3ZhbGlkX3QJCXZhbGlkZnVucHRyOwkvKiBwdHIgdG8gdG90ZXh0IGNvbnZlcnNpb24gZnVuY3Rpb24gKi8KQEAgLTE1MCwyMCArMTUwLDIwIEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiAqLwotVUlOVDMyIHA4MDIxMV90ZXh0MmRpZChjYXRsaXN0aXRlbV90ICpjYXRsaXN0LCBjaGFyICpjYXRuYW1lLCBjaGFyICpncnBuYW1lLCBjaGFyICppdGVtbmFtZSk7Ci1VSU5UMzIgcDgwMjExX3RleHQyY2F0ZGlkKGNhdGxpc3RpdGVtX3QgKmxpc3QsIGNoYXIgKm5hbWUgKTsKLVVJTlQzMiBwODAyMTFfdGV4dDJncnBkaWQoZ3JwbGlzdGl0ZW1fdCAqbGlzdCwgY2hhciAqbmFtZSApOwotVUlOVDMyIHA4MDIxMV90ZXh0Mml0ZW1kaWQocDgwMjExbWV0YV90ICpsaXN0LCBjaGFyICpuYW1lICk7Ci1VSU5UMzIgcDgwMjExX2lzdmFsaWRfZGlkKCBjYXRsaXN0aXRlbV90ICpjYXRsaXN0LCBVSU5UMzIgZGlkICk7Ci1VSU5UMzIgcDgwMjExX2lzdmFsaWRfY2F0ZGlkKCBjYXRsaXN0aXRlbV90ICpjYXRsaXN0LCBVSU5UMzIgZGlkICk7Ci1VSU5UMzIgcDgwMjExX2lzdmFsaWRfZ3JwZGlkKCBjYXRsaXN0aXRlbV90ICpjYXRsaXN0LCBVSU5UMzIgZGlkICk7Ci1VSU5UMzIgcDgwMjExX2lzdmFsaWRfaXRlbWRpZCggY2F0bGlzdGl0ZW1fdCAqY2F0bGlzdCwgVUlOVDMyIGRpZCApOwotY2F0bGlzdGl0ZW1fdCAqcDgwMjExX2RpZDJjYXQoIGNhdGxpc3RpdGVtX3QgKmNhdGxpc3QsIFVJTlQzMiBkaWQgKTsKLWdycGxpc3RpdGVtX3QgKnA4MDIxMV9kaWQyZ3JwKCBjYXRsaXN0aXRlbV90ICpjYXRsaXN0LCBVSU5UMzIgZGlkICk7Ci1wODAyMTFtZXRhX3QgKnA4MDIxMV9kaWQyaXRlbSggY2F0bGlzdGl0ZW1fdCAqY2F0bGlzdCwgVUlOVDMyIGRpZCApOwotVUlOVDMyIHA4MDIxMWl0ZW1fbWF4ZGF0YWxlbiggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCApOwotVUlOVDMyIHA4MDIxMV9tZXRhbmFtZTJkaWQoc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgY2hhciAqaXRlbW5hbWUpOwotVUlOVDMyIHA4MDIxMWl0ZW1fZ2V0b2Zmc2V0KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBVSU5UMzIgZGlkICk7Cit1MzIgcDgwMjExX3RleHQyZGlkKGNhdGxpc3RpdGVtX3QgKmNhdGxpc3QsIGNoYXIgKmNhdG5hbWUsIGNoYXIgKmdycG5hbWUsIGNoYXIgKml0ZW1uYW1lKTsKK3UzMiBwODAyMTFfdGV4dDJjYXRkaWQoY2F0bGlzdGl0ZW1fdCAqbGlzdCwgY2hhciAqbmFtZSApOwordTMyIHA4MDIxMV90ZXh0MmdycGRpZChncnBsaXN0aXRlbV90ICpsaXN0LCBjaGFyICpuYW1lICk7Cit1MzIgcDgwMjExX3RleHQyaXRlbWRpZChwODAyMTFtZXRhX3QgKmxpc3QsIGNoYXIgKm5hbWUgKTsKK3UzMiBwODAyMTFfaXN2YWxpZF9kaWQoIGNhdGxpc3RpdGVtX3QgKmNhdGxpc3QsIHUzMiBkaWQgKTsKK3UzMiBwODAyMTFfaXN2YWxpZF9jYXRkaWQoIGNhdGxpc3RpdGVtX3QgKmNhdGxpc3QsIHUzMiBkaWQgKTsKK3UzMiBwODAyMTFfaXN2YWxpZF9ncnBkaWQoIGNhdGxpc3RpdGVtX3QgKmNhdGxpc3QsIHUzMiBkaWQgKTsKK3UzMiBwODAyMTFfaXN2YWxpZF9pdGVtZGlkKCBjYXRsaXN0aXRlbV90ICpjYXRsaXN0LCB1MzIgZGlkICk7CitjYXRsaXN0aXRlbV90ICpwODAyMTFfZGlkMmNhdCggY2F0bGlzdGl0ZW1fdCAqY2F0bGlzdCwgdTMyIGRpZCApOworZ3JwbGlzdGl0ZW1fdCAqcDgwMjExX2RpZDJncnAoIGNhdGxpc3RpdGVtX3QgKmNhdGxpc3QsIHUzMiBkaWQgKTsKK3A4MDIxMW1ldGFfdCAqcDgwMjExX2RpZDJpdGVtKCBjYXRsaXN0aXRlbV90ICpjYXRsaXN0LCB1MzIgZGlkICk7Cit1MzIgcDgwMjExaXRlbV9tYXhkYXRhbGVuKCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCB1MzIgZGlkICk7Cit1MzIgcDgwMjExX21ldGFuYW1lMmRpZChzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBjaGFyICppdGVtbmFtZSk7Cit1MzIgcDgwMjExaXRlbV9nZXRvZmZzZXQoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIHUzMiBkaWQgKTsKIGludCBwODAyMTFpdGVtX2dldHR5cGUocDgwMjExbWV0YV90ICptZXRhKTsKIAogI2VuZGlmIC8qIF9QODAyMTFNRVRBX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1ldGFkZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1ldGFkZWYuaAppbmRleCAyYzdmNDM1Li5jZTRmZGQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZXRhZGVmLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWV0YWRlZi5oCkBAIC03MiwyNSArNzIsNiBAQAogCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCiAJCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKIAkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfcG93ZXJtZ210IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykpCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9wb3dlcm1nbXRfcG93ZXJtZ210bW9kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9wb3dlcm1nbXRfd2FrZXVwIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX3Bvd2VybWdtdF9yZWNlaXZlZHRpbXMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfcG93ZXJtZ210X3Jlc3VsdGNvZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDAwMDAwMDAwKQogI2RlZmluZSBESURtc2dfZG90MTFyZXFfc2NhbiBcCiAJCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKIAkJCVA4MDIxMURJRF9NS0dST1VQKDQpKQpAQCAtMzAxLDIxMSArMjgyLDYgQEAKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCiAJCQlQODAyMTFESURfTUtJVEVNKDQwKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9qb2luIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikpCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9qb2luX2Jzc2lkIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2pvaW5fam9pbmZhaWx1cmV0aW1lb3V0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2pvaW5fYmFzaWNyYXRlMSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9qb2luX2Jhc2ljcmF0ZTIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfam9pbl9iYXNpY3JhdGUzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDUpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2pvaW5fYmFzaWNyYXRlNCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg2KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9qb2luX2Jhc2ljcmF0ZTUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfam9pbl9iYXNpY3JhdGU2IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDgpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2pvaW5fYmFzaWNyYXRlNyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg5KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9qb2luX2Jhc2ljcmF0ZTggXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTApIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2pvaW5fb3BlcmF0aW9uYWxyYXRlMSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfam9pbl9vcGVyYXRpb25hbHJhdGUyIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEyKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9qb2luX29wZXJhdGlvbmFscmF0ZTMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTMpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2pvaW5fb3BlcmF0aW9uYWxyYXRlNCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNCkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfam9pbl9vcGVyYXRpb25hbHJhdGU1IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE1KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9qb2luX29wZXJhdGlvbmFscmF0ZTYgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTYpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2pvaW5fb3BlcmF0aW9uYWxyYXRlNyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfam9pbl9vcGVyYXRpb25hbHJhdGU4IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE4KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9qb2luX3Jlc3VsdGNvZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTkpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2F1dGhlbnRpY2F0ZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDcpKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfYXV0aGVudGljYXRlX3BlZXJzdGFhZGRyZXNzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2F1dGhlbnRpY2F0ZV9hdXRoZW50aWNhdGlvbnR5cGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg3KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfYXV0aGVudGljYXRlX2F1dGhlbnRpY2F0aW9uZmFpbHVyZXRpbWVvdXQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg3KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfYXV0aGVudGljYXRlX3Jlc3VsdGNvZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg3KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfZGVhdXRoZW50aWNhdGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg4KSkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2RlYXV0aGVudGljYXRlX3BlZXJzdGFhZGRyZXNzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2RlYXV0aGVudGljYXRlX3JlYXNvbmNvZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg4KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfZGVhdXRoZW50aWNhdGVfcmVzdWx0Y29kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDgpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9hc3NvY2lhdGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg5KSkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2Fzc29jaWF0ZV9wZWVyc3RhYWRkcmVzcyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDkpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9hc3NvY2lhdGVfYXNzb2NpYXRlZmFpbHVyZXRpbWVvdXQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg5KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfYXNzb2NpYXRlX2NmcG9sbGFibGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg5KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfYXNzb2NpYXRlX2NmcG9sbHJlcSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDkpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9hc3NvY2lhdGVfcHJpdmFjeSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDkpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg1KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9hc3NvY2lhdGVfbGlzdGVuaW50ZXJ2YWwgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg5KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfYXNzb2NpYXRlX3Jlc3VsdGNvZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg5KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfcmVhc3NvY2lhdGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxMCkpCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9yZWFzc29jaWF0ZV9uZXdhcGFkZHJlc3MgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxMCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX3JlYXNzb2NpYXRlX3JlYXNzb2NpYXRlZmFpbHVyZXRpbWVvdXQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxMCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX3JlYXNzb2NpYXRlX2NmcG9sbGFibGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxMCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX3JlYXNzb2NpYXRlX2NmcG9sbHJlcSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEwKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfcmVhc3NvY2lhdGVfcHJpdmFjeSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEwKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfcmVhc3NvY2lhdGVfbGlzdGVuaW50ZXJ2YWwgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxMCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDYpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX3JlYXNzb2NpYXRlX3Jlc3VsdGNvZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxMCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDcpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2Rpc2Fzc29jaWF0ZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDExKSkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2Rpc2Fzc29jaWF0ZV9wZWVyc3RhYWRkcmVzcyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDExKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfZG90MTFyZXFfZGlzYXNzb2NpYXRlX3JlYXNvbmNvZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX2Rpc2Fzc29jaWF0ZV9yZXN1bHRjb2RlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19kb3QxMXJlcV9yZXNldCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEyKSkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX3Jlc2V0X3NldGRlZmF1bHRtaWIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX3Jlc2V0X21hY2FkZHJlc3MgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2RvdDExcmVxX3Jlc2V0X3Jlc3VsdGNvZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgwMDAwMDAwMCkKICNkZWZpbmUgRElEbXNnX2RvdDExcmVxX3N0YXJ0IFwKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoMTMpKQpAQCAtNzk1LDE0NyArNTcxLDggQEAKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCiAJCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2NhdF9sbnhpbmQgXAotCQkJUDgwMjExRElEX01LU0VDVElPTig0KQotI2RlZmluZSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDQpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkpCi0jZGVmaW5lIERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1faG9zdHRpbWUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNCkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX21hY3RpbWUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNCkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2NoYW5uZWwgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNCkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3Jzc2kgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNCkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3NxIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDQpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDUpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2xueGluZF93bGFuc25pZmZybV9zaWduYWwgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNCkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX25vaXNlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDQpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDcpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2xueGluZF93bGFuc25pZmZybV9yYXRlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDQpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDgpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2xueGluZF93bGFuc25pZmZybV9pc3R4IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDQpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDkpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2xueGluZF93bGFuc25pZmZybV9mcm1sZW4gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNCkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTApIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX2xueGluZF9yb2FtIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDQpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikpCi0jZGVmaW5lIERJRG1zZ19sbnhpbmRfcm9hbV9yZWFzb24gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNCkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDAwMDAwMDAwKQogI2RlZmluZSBESURtc2dfY2F0X3AycmVxIFwKIAkJCVA4MDIxMURJRF9NS1NFQ1RJT04oNSkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2pvaW4gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2pvaW5fYnNzaWQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfam9pbl9iYXNpY3JhdGUxIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2pvaW5fYmFzaWNyYXRlMiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9qb2luX2Jhc2ljcmF0ZTMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfam9pbl9iYXNpY3JhdGU0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDUpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2pvaW5fYmFzaWNyYXRlNSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg2KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9qb2luX2Jhc2ljcmF0ZTYgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfam9pbl9iYXNpY3JhdGU3IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDgpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2pvaW5fYmFzaWNyYXRlOCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg5KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9qb2luX29wZXJhdGlvbmFscmF0ZTEgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTApIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2pvaW5fb3BlcmF0aW9uYWxyYXRlMiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfam9pbl9vcGVyYXRpb25hbHJhdGUzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEyKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9qb2luX29wZXJhdGlvbmFscmF0ZTQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTMpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2pvaW5fb3BlcmF0aW9uYWxyYXRlNSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNCkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfam9pbl9vcGVyYXRpb25hbHJhdGU2IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE1KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9qb2luX29wZXJhdGlvbmFscmF0ZTcgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTYpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2pvaW5fb3BlcmF0aW9uYWxyYXRlOCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfam9pbl9zc2lkIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE4KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9qb2luX2NoYW5uZWwgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTkpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2pvaW5fYXV0aHR5cGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjApIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2pvaW5fcmVzdWx0Y29kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyMSkgfCAweDAwMDAwMDAwKQogI2RlZmluZSBESURtc2dfcDJyZXFfcmVhZHBkYSBcCiAJCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKIAkJCVA4MDIxMURJRF9NS0dST1VQKDIpKQpAQCAtOTQ3LDE2MiArNTg0LDYgQEAKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCiAJCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX3JlYWRjaXMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSkKLSNkZWZpbmUgRElEbXNnX3AycmVxX3JlYWRjaXNfY2lzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX3JlYWRjaXNfcmVzdWx0Y29kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9hdXhwb3J0X3N0YXRlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNCkpCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9hdXhwb3J0X3N0YXRlX2VuYWJsZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDQpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9hdXhwb3J0X3N0YXRlX3Jlc3VsdGNvZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg0KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfYXV4cG9ydF9yZWFkIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkpCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9hdXhwb3J0X3JlYWRfYWRkciBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9hdXhwb3J0X3JlYWRfbGVuIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2F1eHBvcnRfcmVhZF9kYXRhIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2F1eHBvcnRfcmVhZF9yZXN1bHRjb2RlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2F1eHBvcnRfd3JpdGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2F1eHBvcnRfd3JpdGVfYWRkciBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9hdXhwb3J0X3dyaXRlX2xlbiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9hdXhwb3J0X3dyaXRlX2RhdGEgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfYXV4cG9ydF93cml0ZV9yZXN1bHRjb2RlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2xvd19sZXZlbCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDcpKQotI2RlZmluZSBESURtc2dfcDJyZXFfbG93X2xldmVsX2NvbW1hbmQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg3KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfbG93X2xldmVsX3BhcmFtMCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDcpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9sb3dfbGV2ZWxfcGFyYW0xIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2xvd19sZXZlbF9wYXJhbTIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg3KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfbG93X2xldmVsX3Jlc3AwIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDUpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2xvd19sZXZlbF9yZXNwMSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDcpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg2KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9sb3dfbGV2ZWxfcmVzcDIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg3KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfbG93X2xldmVsX3Jlc3VsdGNvZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg3KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOCkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfdGVzdF9jb21tYW5kIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOCkpCi0jZGVmaW5lIERJRG1zZ19wMnJlcV90ZXN0X2NvbW1hbmRfdGVzdGNvZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg4KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfdGVzdF9jb21tYW5kX3Rlc3RwYXJhbSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDgpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV90ZXN0X2NvbW1hbmRfcmVzdWx0Y29kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDgpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV90ZXN0X2NvbW1hbmRfc3RhdHVzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX3Rlc3RfY29tbWFuZF9yZXNwMCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDgpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg1KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV90ZXN0X2NvbW1hbmRfcmVzcDEgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg4KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfdGVzdF9jb21tYW5kX3Jlc3AyIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDcpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX21taV9yZWFkIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOSkpCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9tbWlfcmVhZF9hZGRyIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX21taV9yZWFkX3ZhbHVlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX21taV9yZWFkX3Jlc3VsdGNvZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg5KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfbW1pX3dyaXRlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTApKQotI2RlZmluZSBESURtc2dfcDJyZXFfbW1pX3dyaXRlX2FkZHIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxMCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX21taV93cml0ZV9kYXRhIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTApIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9tbWlfd3JpdGVfcmVzdWx0Y29kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEwKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDAwMDAwMDAwKQogI2RlZmluZSBESURtc2dfcDJyZXFfcmFtZGxfc3RhdGUgXAogCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCiAJCQlQODAyMTFESURfTUtHUk9VUCgxMSkpCkBAIC0xMTY3LDIyNCArNjQ4LDggQEAKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoMTQpIHwgXAogCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9tbV9zdGF0ZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDE1KSkKLSNkZWZpbmUgRElEbXNnX3AycmVxX21tX3N0YXRlX2VuYWJsZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDE1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfbW1fc3RhdGVfcmVzdWx0Y29kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDE1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfZHVtcF9zdGF0ZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDE2KSkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2R1bXBfc3RhdGVfbGV2ZWwgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2R1bXBfc3RhdGVfcmVzdWx0Y29kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDE2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfY2hhbm5lbF9pbmZvIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTcpKQotI2RlZmluZSBESURtc2dfcDJyZXFfY2hhbm5lbF9pbmZvX2NoYW5uZWxsaXN0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTcpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9jaGFubmVsX2luZm9fY2hhbm5lbGR3ZWxsdGltZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDE3KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfY2hhbm5lbF9pbmZvX3Jlc3VsdGNvZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxNykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2NoYW5uZWxfaW5mb19udW1jaGluZm8gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxNykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2NoYW5uZWxfaW5mb19yZXN1bHRzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTgpKQotI2RlZmluZSBESURtc2dfcDJyZXFfY2hhbm5lbF9pbmZvX3Jlc3VsdHNfY2hhbm5lbCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDE4KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfY2hhbm5lbF9pbmZvX3Jlc3VsdHNfcmVzdWx0Y29kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDE4KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfY2hhbm5lbF9pbmZvX3Jlc3VsdHNfYXZnbm9pc2VsZXZlbCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDE4KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfY2hhbm5lbF9pbmZvX3Jlc3VsdHNfcGVha25vaXNlbGV2ZWwgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxOCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgwMDAwMDAwMCkKLSNkZWZpbmUgRElEbXNnX3AycmVxX2NoYW5uZWxfaW5mb19yZXN1bHRzX2Jzc2FjdGl2ZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDE4KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNSkgfCAweDAwMDAwMDAwKQotI2RlZmluZSBESURtc2dfcDJyZXFfY2hhbm5lbF9pbmZvX3Jlc3VsdHNfcGNmYWN0aXZlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTgpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg2KSB8IDB4MDAwMDAwMDApCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9lbmFibGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxOSkpCi0jZGVmaW5lIERJRG1zZ19wMnJlcV9lbmFibGVfcmVzdWx0Y29kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDE5KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDAwMDAwMDAwKQogI2RlZmluZSBESURtaWJfY2F0X2RvdDExc210IFwKIAkJCVA4MDIxMURJRF9NS1NFQ1RJT04oMSkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X3A4MDIxMVRhYmxlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkpCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9wODAyMTFUYWJsZV9wODAyMTFfaWZzdGF0ZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFTdGF0aW9uSUQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFNZWRpdW1PY2N1cGFuY3lMaW1pdCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMUNGUG9sbGFibGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFDRlBQZXJpb2QgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFDRlBNYXhEdXJhdGlvbiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg1KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMUF1dGhlbnRpY2F0aW9uUmVzcG9uc2VUaW1lT3V0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDYpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExUHJpdmFjeU9wdGlvbkltcGxlbWVudGVkIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDcpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExUG93ZXJNYW5hZ2VtZW50TW9kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg4KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMURlc2lyZWRTU0lEIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDkpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExRGVzaXJlZEJTU1R5cGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTApIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExT3BlcmF0aW9uYWxSYXRlU2V0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDExKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMUJlYWNvblBlcmlvZCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMikgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFEVElNUGVyaW9kIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEzKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMUFzc29jaWF0aW9uUmVzcG9uc2VUaW1lT3V0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE0KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMURpc2Fzc29jaWF0ZVJlYXNvbiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFEaXNhc3NvY2lhdGVTdGF0aW9uIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE2KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMURlYXV0aGVudGljYXRlUmVhc29uIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE3KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMURlYXV0aGVudGljYXRlU3RhdGlvbiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxOCkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFBdXRoZW50aWNhdGVGYWlsU3RhdHVzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE5KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMUF1dGhlbnRpY2F0ZUZhaWxTdGF0aW9uIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIwKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykpCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlX2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG0xIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgxNDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zVGFibGVfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNFbmFibGUxIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zVGFibGVfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobTIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDE0MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNUYWJsZV9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc0VuYWJsZTIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNUYWJsZV9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtMyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg1KSB8IDB4MTQwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlX2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zRW5hYmxlMyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg2KSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlX2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG00IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDcpIHwgMHgxNDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zVGFibGVfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNFbmFibGU0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDgpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zVGFibGVfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobTUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOSkgfCAweDE0MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNUYWJsZV9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc0VuYWJsZTUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTApIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zVGFibGVfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobTYgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTEpIHwgMHgxNDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zVGFibGVfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNFbmFibGU2IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEyKSB8IDB4MWMwMDAwMDApCiAjZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGUgXAogCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCiAJCQlQODAyMTFESURfTUtHUk9VUCg0KSkKQEAgLTE0MDQsMjUgKzY2OSw2IEBACiAJCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKIAkJCVA4MDIxMURJRF9NS0dST1VQKDQpIHwgXAogCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MGMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUEtleU1hcHBpbmdzVGFibGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExV0VQS2V5TWFwcGluZ3NUYWJsZV9kb3QxMVdFUEtleU1hcHBpbmdJbmRleCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUEtleU1hcHBpbmdzVGFibGVfZG90MTFXRVBLZXlNYXBwaW5nQWRkcmVzcyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUEtleU1hcHBpbmdzVGFibGVfZG90MTFXRVBLZXlNYXBwaW5nV0VQT24gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBLZXlNYXBwaW5nc1RhYmxlX2RvdDExV0VQS2V5TWFwcGluZ1ZhbHVlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgxYzAwMDAwMCkKICNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlIFwKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoNikpCkBAIC0xNDM0LDMxICs2ODAsMTkgQEAKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCiAJCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlX2RvdDExV0VQS2V5TWFwcGluZ0xlbmd0aCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MTgwMDAwMDApCiAjZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVByaXZhY3lUYWJsZV9kb3QxMUV4Y2x1ZGVVbmVuY3J5cHRlZCBcCiAJCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKIAkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAogCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVByaXZhY3lUYWJsZV9kb3QxMVdFUElDVkVycm9yQ291bnQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFQcml2YWN5VGFibGVfZG90MTFXRVBFeGNsdWRlZENvdW50IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDYpIHwgMHgxMDAwMDAwMCkKICNkZWZpbmUgRElEbWliX2NhdF9kb3QxMW1hYyBcCiAJCQlQODAyMTFESURfTUtTRUNUSU9OKDIpCiAjZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMU9wZXJhdGlvblRhYmxlIFwKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoMSkpCiAjZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMU9wZXJhdGlvblRhYmxlX2RvdDExTUFDQWRkcmVzcyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MTgwMDAwMDApCisgICAgICAgICAgICAgICAgICAgICAgICAoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MTgwMDAwMDApCiAjZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMU9wZXJhdGlvblRhYmxlX2RvdDExUlRTVGhyZXNob2xkIFwKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCkBAIC0xNDc2LDMyOSArNzEwLDE4IEBACiAJCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKIAkJCVA4MDIxMURJRF9NS0lURU0oNSkgfCAweDE4MDAwMDAwKQogI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFPcGVyYXRpb25UYWJsZV9kb3QxMU1heFRyYW5zbWl0TVNEVUxpZmV0aW1lIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDYpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExT3BlcmF0aW9uVGFibGVfZG90MTFNYXhSZWNlaXZlTGlmZXRpbWUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNykgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFPcGVyYXRpb25UYWJsZV9kb3QxMU1hbnVmYWN0dXJlcklEIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDgpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExT3BlcmF0aW9uVGFibGVfZG90MTFQcm9kdWN0SUQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFDb3VudGVyc1RhYmxlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikpCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUNvdW50ZXJzVGFibGVfZG90MTFUcmFuc21pdHRlZEZyYWdtZW50Q291bnQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFDb3VudGVyc1RhYmxlX2RvdDExTXVsdGljYXN0VHJhbnNtaXR0ZWRGcmFtZUNvdW50IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMUZhaWxlZENvdW50IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMVJldHJ5Q291bnQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFDb3VudGVyc1RhYmxlX2RvdDExTXVsdGlwbGVSZXRyeUNvdW50IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDUpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMUZyYW1lRHVwbGljYXRlQ291bnQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNikgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFDb3VudGVyc1RhYmxlX2RvdDExUlRTU3VjY2Vzc0NvdW50IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDcpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMVJUU0ZhaWx1cmVDb3VudCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg4KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUNvdW50ZXJzVGFibGVfZG90MTFBQ0tGYWlsdXJlQ291bnQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFDb3VudGVyc1RhYmxlX2RvdDExUmVjZWl2ZWRGcmFnbWVudENvdW50IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEwKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUNvdW50ZXJzVGFibGVfZG90MTFNdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTEpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMUZDU0Vycm9yQ291bnQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTIpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMVRyYW5zbWl0dGVkRnJhbWVDb3VudCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMykgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFDb3VudGVyc1RhYmxlX2RvdDExV0VQVW5kZWNyeXB0YWJsZUNvdW50IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE0KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3M0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3M1IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDUpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3M2IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDYpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3M3IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDcpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3M4IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDgpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3M5IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDkpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxMCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMCkgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczExIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDExKSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTIpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxMyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMykgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczE0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE0KSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTUpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxNiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNikgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczE3IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE3KSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTggXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTgpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxOSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxOSkgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczIwIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIwKSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjEgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjEpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyMiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyMikgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczIzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIzKSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjQpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyNSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyNSkgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczI2IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDI2KSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjcgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjcpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyOCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyOCkgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczI5IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDI5KSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMzAgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMikgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMzApIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MzMSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzMSkgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczMyIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMyKSB8IDB4MWMwMDAwMDApCisgICAgICAgICAgICAgICAgICAgICAgIChQODAyMTFESURfTUtTRUNUSU9OKDIpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICBQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgUDgwMjExRElEX01LSVRFTSg2KSB8IDB4MTAwMDAwMDApCiAjZGVmaW5lIERJRG1pYl9jYXRfZG90MTFwaHkgXAogCQkJUDgwMjExRElEX01LU0VDVElPTigzKQogI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlPcGVyYXRpb25UYWJsZSBcCiAJCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKIAkJCVA4MDIxMURJRF9NS0dST1VQKDEpKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlPcGVyYXRpb25UYWJsZV9kb3QxMVBIWVR5cGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlPcGVyYXRpb25UYWJsZV9kb3QxMUN1cnJlbnRSZWdEb21haW4gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlPcGVyYXRpb25UYWJsZV9kb3QxMVRlbXBUeXBlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5T3BlcmF0aW9uVGFibGVfZG90MTFDaGFubmVsQWdpbGl0eVByZXNlbnQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlPcGVyYXRpb25UYWJsZV9kb3QxMUNoYW5uZWxBZ2lsaXR5RW5hYmxlZCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg1KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeU9wZXJhdGlvblRhYmxlX2RvdDExU2hvcnRQcmVhbWJsZUVuYWJsZWQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNikgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlBbnRlbm5hVGFibGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5QW50ZW5uYVRhYmxlX2RvdDExQ3VycmVudFR4QW50ZW5uYSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUFudGVubmFUYWJsZV9kb3QxMURpdmVyc2l0eVN1cHBvcnQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlBbnRlbm5hVGFibGVfZG90MTFDdXJyZW50UnhBbnRlbm5hIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykpCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMU51bWJlclN1cHBvcnRlZFBvd2VyTGV2ZWxzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExVHhQb3dlckxldmVsMSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMVR4UG93ZXJMZXZlbDIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFUeFBvd2VyTGV2ZWwzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExVHhQb3dlckxldmVsNCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg1KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMVR4UG93ZXJMZXZlbDUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNikgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFUeFBvd2VyTGV2ZWw2IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDcpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExVHhQb3dlckxldmVsNyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg4KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMVR4UG93ZXJMZXZlbDggXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOSkgfCAweDEwMDAwMDAwKQogI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFDdXJyZW50VHhQb3dlckxldmVsIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEwKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUZIU1NUYWJsZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDQpKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlGSFNTVGFibGVfZG90MTFIb3BUaW1lIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5RkhTU1RhYmxlX2RvdDExQ3VycmVudENoYW5uZWxOdW1iZXIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg0KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlGSFNTVGFibGVfZG90MTFNYXhEd2VsbFRpbWUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg0KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlGSFNTVGFibGVfZG90MTFDdXJyZW50RHdlbGxUaW1lIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5RkhTU1RhYmxlX2RvdDExQ3VycmVudFNldCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDQpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg1KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUZIU1NUYWJsZV9kb3QxMUN1cnJlbnRQYXR0ZXJuIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDYpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5RkhTU1RhYmxlX2RvdDExQ3VycmVudEluZGV4IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDcpIHwgMHgxODAwMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCisgICAgICAgICAgICAgICAgICAgICAgIFA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICBQODAyMTFESURfTUtJVEVNKDEwKSB8IDB4MTgwMDAwMDApCiAjZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeURTU1NUYWJsZSBcCiAJCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKIAkJCVA4MDIxMURJRF9NS0dST1VQKDUpKQpAQCAtMTgwNiw5NyArNzI5LDYgQEAKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCiAJCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5RFNTU1RhYmxlX2RvdDExQ0NBTW9kZVN1cHBvcnRlZCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeURTU1NUYWJsZV9kb3QxMUN1cnJlbnRDQ0FNb2RlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5RFNTU1RhYmxlX2RvdDExRURUaHJlc2hvbGQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlEU1NTVGFibGVfZG90MTFTaG9ydFByZWFtYmxlT3B0aW9uSW1wbGVtZW50ZWQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlEU1NTVGFibGVfZG90MTFQQkNDT3B0aW9uSW1wbGVtZW50ZWQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNikgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlJUlRhYmxlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikpCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUlSVGFibGVfZG90MTFDQ0FXYXRjaGRvZ1RpbWVyTWF4IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUGh5SVJUYWJsZV9kb3QxMUNDQVdhdGNoZG9nQ291bnRNYXggXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlJUlRhYmxlX2RvdDExQ0NBV2F0Y2hkb2dUaW1lck1pbiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUlSVGFibGVfZG90MTFDQ0FXYXRjaGRvZ0NvdW50TWluIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExUmVnRG9tYWluc1N1cHBvcnRlZFRhYmxlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNykpCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVJlZ0RvbWFpbnNTdXBwb3J0ZWRUYWJsZV9kb3QxMVJlZ0RvbWFpbnNTdXBwb3J0SW5kZXggXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg3KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFSZWdEb21haW5zU3VwcG9ydGVkVGFibGVfZG90MTFSZWdEb21haW5zU3VwcG9ydFZhbHVlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIpIHwgMHgxNDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExQW50ZW5uYXNMaXN0VGFibGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg4KSkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExQW50ZW5uYXNMaXN0VGFibGVfZG90MTFBbnRlbm5hTGlzdEluZGV4IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOCkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExQW50ZW5uYXNMaXN0VGFibGVfZG90MTFTdXBwb3J0ZWRUeEFudGVubmEgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg4KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFBbnRlbm5hc0xpc3RUYWJsZV9kb3QxMVN1cHBvcnRlZFJ4QW50ZW5uYSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDgpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MWMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMUFudGVubmFzTGlzdFRhYmxlX2RvdDExRGl2ZXJzaXR5U2VsZWN0aW9uUnggXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg4KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFTdXBwb3J0ZWREYXRhUmF0ZXNUeFRhYmxlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOSkpCi0jZGVmaW5lIERJRG1pYl9kb3QxMXBoeV9kb3QxMVN1cHBvcnRlZERhdGFSYXRlc1R4VGFibGVfZG90MTFTdXBwb3J0ZWREYXRhUmF0ZXNUeEluZGV4IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoOSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgxYzAwMDAwMCkKLSNkZWZpbmUgRElEbWliX2RvdDExcGh5X2RvdDExU3VwcG9ydGVkRGF0YVJhdGVzVHhUYWJsZV9kb3QxMVN1cHBvcnRlZERhdGFSYXRlc1R4VmFsdWUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMykgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg5KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDE0MDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFTdXBwb3J0ZWREYXRhUmF0ZXNSeFRhYmxlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDMpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMTApKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFTdXBwb3J0ZWREYXRhUmF0ZXNSeFRhYmxlX2RvdDExU3VwcG9ydGVkRGF0YVJhdGVzUnhJbmRleCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEwKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDFjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFwaHlfZG90MTFTdXBwb3J0ZWREYXRhUmF0ZXNSeFRhYmxlX2RvdDExU3VwcG9ydGVkRGF0YVJhdGVzUnhWYWx1ZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEwKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDE0MDAwMDAwKQogI2RlZmluZSBESURtaWJfY2F0X2xueCBcCiAJCQlQODAyMTFESURfTUtTRUNUSU9OKDQpCiAjZGVmaW5lIERJRG1pYl9sbnhfbG54Q29uZmlnVGFibGUgXApAQCAtMTkwOCw1NyArNzQwLDYgQEAKIAkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDE4MDAwMDAwKQogI2RlZmluZSBESURtaWJfY2F0X3AyIFwKIAkJCVA4MDIxMURJRF9NS1NFQ1RJT04oNSkKLSNkZWZpbmUgRElEbWliX3AyX3AyVGFibGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSkKLSNkZWZpbmUgRElEbWliX3AyX3AyVGFibGVfcDJNTVR4IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyVGFibGVfcDJFYXJseUJlYWNvbiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlRhYmxlX3AyUmVjZWl2ZWRGcmFtZVN0YXRpc3RpY3MgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJUYWJsZV9wMkNvbW11bmljYXRpb25UYWxsaWVzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyVGFibGVfcDJBdXRoZW50aWNhdGVkIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDUpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyVGFibGVfcDJBc3NvY2lhdGVkIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDYpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyVGFibGVfcDJQb3dlclNhdmVVc2VyQ291bnQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNykgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJUYWJsZV9wMkNvbW1lbnQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJUYWJsZV9wMkFjY2Vzc01vZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJUYWJsZV9wMkFjY2Vzc0FsbG93IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEwKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlRhYmxlX3AyQWNjZXNzRGVueSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJUYWJsZV9wMkNoYW5uZWxJbmZvUmVzdWx0cyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDEpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMikgfCAweDEwMDAwMDAwKQogI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWMgXAogCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCiAJCQlQODAyMTFESURfTUtHUk9VUCgyKSkKQEAgLTE5NjYsNTU5ICs3NDcsMTEgQEAKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCiAJCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mT3duTUFDQWRkcmVzcyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZkRlc2lyZWRTU0lEIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mT3duQ2hhbm5lbCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZk93blNTSUQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZPd25BVElNV2luZG93IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDYpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mU3lzdGVtU2NhbGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNykgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZNYXhEYXRhTGVuZ3RoIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDgpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mV0RTQWRkcmVzcyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg5KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlBNRW5hYmxlZCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZQTUVQUyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZNdWx0aWNhc3RSZWNlaXZlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEyKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZk1heFNsZWVwRHVyYXRpb24gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTMpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mUE1Ib2xkb3ZlckR1cmF0aW9uIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE0KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZk93bk5hbWUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTUpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mT3duRFRJTVBlcmlvZCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNikgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRFNBZGRyZXNzMSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNykgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRFNBZGRyZXNzMiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxOCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRFNBZGRyZXNzMyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxOSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRFNBZGRyZXNzNCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyMCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRFNBZGRyZXNzNSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyMSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRFNBZGRyZXNzNiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyMikgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZNdWx0aWNhc3RQTUJ1ZmZlcmluZyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyMykgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRVBEZWZhdWx0S2V5SUQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjQpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mV0VQRGVmYXVsdEtleTAgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjUpIHwgMHgwODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mV0VQRGVmYXVsdEtleTEgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjYpIHwgMHgwODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mV0VQRGVmYXVsdEtleTIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjcpIHwgMHgwODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mV0VQRGVmYXVsdEtleTMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjgpIHwgMHgwODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mV0VQRmxhZ3MgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjkpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mQXV0aGVudGljYXRpb24gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMzApIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mTWF4QXNzb2NpYXRlZFN0YXRpb25zIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMxKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlR4Q29udHJvbCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzMikgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZSb2FtaW5nTW9kZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzMykgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZIb3N0QXV0aGVudGljYXRpb24gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMzQpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mUmN2Q3JjRXJyb3IgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMzUpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mQWx0UmV0cnlDb3VudCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzNikgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZCZWFjb25JbnRlcnZhbCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzNykgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZNZWRpdW1PY2N1cGFuY3lMaW1pdCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzOCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZDRlBQZXJpb2QgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMzkpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mQ0ZQTWF4RHVyYXRpb24gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNDApIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mQ0ZQRmxhZ3MgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNDEpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mU1RBUENGSW5mbyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0MikgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZQcmlvcml0eVFVc2FnZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0MykgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZUSU1DdHJsIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQ0KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlRoaXJ0eTJUYWxseSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0NSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZFbmhTZWN1cml0eSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0NikgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZTaG9ydFByZWFtYmxlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDQ3KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZkV4Y2x1ZGVMb25nUHJlYW1ibGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgyKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNDgpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mQXV0aGVudGljYXRpb25Sc3BUTyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDIpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0OSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZCYXNpY1JhdGVzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDUwKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlN1cHBvcnRlZFJhdGVzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDUxKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMkR5bmFtaWMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSkKLSNkZWZpbmUgRElEbWliX3AyX3AyRHluYW1pY19wMkNyZWF0ZUlCU1MgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyRnJhZ21lbnRhdGlvblRocmVzaG9sZCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMkR5bmFtaWNfcDJSVFNUaHJlc2hvbGQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyVHhSYXRlQ29udHJvbCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMkR5bmFtaWNfcDJQcm9taXNjdW91c01vZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyRnJhZ21lbnRhdGlvblRocmVzaG9sZDAgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNikgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyRnJhZ21lbnRhdGlvblRocmVzaG9sZDEgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNykgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyRnJhZ21lbnRhdGlvblRocmVzaG9sZDIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyRnJhZ21lbnRhdGlvblRocmVzaG9sZDMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyRnJhZ21lbnRhdGlvblRocmVzaG9sZDQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTApIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyRHluYW1pY19wMkZyYWdtZW50YXRpb25UaHJlc2hvbGQ1IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDExKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMkR5bmFtaWNfcDJGcmFnbWVudGF0aW9uVGhyZXNob2xkNiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMikgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyUlRTVGhyZXNob2xkMCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMykgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyUlRTVGhyZXNob2xkMSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyUlRTVGhyZXNob2xkMiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyUlRTVGhyZXNob2xkMyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNikgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyUlRTVGhyZXNob2xkNCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNykgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyUlRTVGhyZXNob2xkNSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxOCkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyUlRTVGhyZXNob2xkNiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxOSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyVHhSYXRlQ29udHJvbDAgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjApIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyRHluYW1pY19wMlR4UmF0ZUNvbnRyb2wxIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIxKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMkR5bmFtaWNfcDJUeFJhdGVDb250cm9sMiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyMikgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyVHhSYXRlQ29udHJvbDMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjMpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyRHluYW1pY19wMlR4UmF0ZUNvbnRyb2w0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoMykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDI0KSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMkR5bmFtaWNfcDJUeFJhdGVDb250cm9sNSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDMpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyNSkgfCAweDE4MDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJEeW5hbWljX3AyVHhSYXRlQ29udHJvbDYgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCgzKSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjYpIHwgMHgxODAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyQmVoYXZpb3IgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg0KSkKLSNkZWZpbmUgRElEbWliX3AyX3AyQmVoYXZpb3JfcDJUaWNrVGltZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDQpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MTgwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk5JQyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpKQotI2RlZmluZSBESURtaWJfcDJfcDJOSUNfcDJNYXhMb2FkVGltZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk5JQ19wMkRMQnVmZmVyUGFnZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk5JQ19wMkRMQnVmZmVyT2Zmc2V0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDMpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTklDX3AyRExCdWZmZXJMZW5ndGggXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJOSUNfcDJQUklJZGVudGl0eSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg1KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk5JQ19wMlBSSVN1cFJhbmdlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDYpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTklDX3AyQ0ZJQWN0UmFuZ2VzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDcpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTklDX3AyTklDU2VyaWFsTnVtYmVyIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDgpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTklDX3AyTklDSWRlbnRpdHkgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJOSUNfcDJNRklTdXBSYW5nZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMCkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJOSUNfcDJDRklTdXBSYW5nZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJOSUNfcDJDaGFubmVsTGlzdCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMikgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJOSUNfcDJSZWd1bGF0b3J5RG9tYWlucyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxMykgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJOSUNfcDJUZW1wVHlwZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNCkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJOSUNfcDJTVEFJZGVudGl0eSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJOSUNfcDJTVEFTdXBSYW5nZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNikgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJOSUNfcDJNRklBY3RSYW5nZXMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTcpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTklDX3AyU1RBQ0ZJQWN0UmFuZ2VzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNSkgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE4KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk5JQ19wMkJ1aWxkU2VxdWVuY2UgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTkpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTklDX3AyUHJpbWFyeUZXSUQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjApIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTklDX3AyU2Vjb25kYXJ5RldJRCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDUpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyMSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJOSUNfcDJUZXJ0aWFyeUZXSUQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjIpIHwgMHgxMDAwMDAwMCkKICNkZWZpbmUgRElEbWliX3AyX3AyTUFDIFwKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoNikpCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMlBvcnRTdGF0dXMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNQUNfcDJDdXJyZW50U1NJRCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMkN1cnJlbnRCU1NJRCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMkNvbW1zUXVhbGl0eSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMkNvbW1zUXVhbGl0eUNRIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDUpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyQ29tbXNRdWFsaXR5QVNMIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDYpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyQ29tbXNRdWFsaXR5QU5MIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDcpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyZGJtQ29tbXNRdWFsaXR5IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDgpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyZGJtQ29tbXNRdWFsaXR5Q1EgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oOSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNQUNfcDJkYm1Db21tc1F1YWxpdHlBU0wgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTApIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyZGJtQ29tbXNRdWFsaXR5QU5MIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDExKSB8IDB4MTAwMDAwMDApCiAjZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMkN1cnJlbnRUeFJhdGUgXAogCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCiAJCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKIAkJCVA4MDIxMURJRF9NS0lURU0oMTIpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyQ3VycmVudEJlYWNvbkludGVydmFsIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEzKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMlN0YUN1cnJlbnRTY2FsZVRocmVzaG9sZHMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTQpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyQVBDdXJyZW50U2NhbGVUaHJlc2hvbGRzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDE1KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMlByb3RvY29sUnNwVGltZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxNikgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNQUNfcDJTaG9ydFJldHJ5TGltaXQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTcpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyTG9uZ1JldHJ5TGltaXQgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMTgpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyTWF4VHJhbnNtaXRMaWZldGltZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxOSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNQUNfcDJNYXhSZWNlaXZlTGlmZXRpbWUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjApIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyQ0ZQb2xsYWJsZSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDYpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyMSkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNQUNfcDJBdXRoZW50aWNhdGlvbkFsZ29yaXRobXMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMjIpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTUFDX3AyUHJpdmFjeU9wdGlvbkltcGxlbWVudGVkIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDIzKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMkN1cnJlbnRUeFJhdGUxIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDI0KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMkN1cnJlbnRUeFJhdGUyIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDI1KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMkN1cnJlbnRUeFJhdGUzIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDI2KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMkN1cnJlbnRUeFJhdGU0IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDI3KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMkN1cnJlbnRUeFJhdGU1IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDI4KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMkN1cnJlbnRUeFJhdGU2IFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNikgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDI5KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1BQ19wMk93bk1BQ0FkZHJlc3MgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg2KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMzApIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTW9kZW0gXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg3KSkKLSNkZWZpbmUgRElEbWliX3AyX3AyTW9kZW1fcDJQSFlUeXBlIFwKLQkJCShQODAyMTFESURfTUtTRUNUSU9OKDUpIHwgXAotCQkJUDgwMjExRElEX01LR1JPVVAoNykgfCBcCi0JCQlQODAyMTFESURfTUtJVEVNKDEpIHwgMHgxMDAwMDAwMCkKLSNkZWZpbmUgRElEbWliX3AyX3AyTW9kZW1fcDJDdXJyZW50Q2hhbm5lbCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDcpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1vZGVtX3AyQ3VycmVudFBvd2VyU3RhdGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg3KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNb2RlbV9wMkNDQU1vZGUgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oNSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg3KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDEwMDAwMDAwKQotI2RlZmluZSBESURtaWJfcDJfcDJNb2RlbV9wMlN1cHBvcnRlZERhdGFSYXRlcyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDcpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg1KSB8IDB4MTAwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9wMl9wMk1vZGVtX3AyVHhQb3dlck1heCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTig1KSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDcpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg2KSB8IDB4MTgwMDAwMDApCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1ldGFtaWIuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1ldGFtaWIuaAppbmRleCAxOTg2N2ZkLi45Y2Q3MmVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZXRhbWliLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWV0YW1pYi5oCkBAIC05Myw3ICs5Myw3IEBACiAvKiBjYXRlZ29yeSBtZXRhZGF0YSBsaXN0ICovCiAKIGV4dGVybiBjYXRsaXN0aXRlbV90IG1pYl9jYXRsaXN0W107Ci1leHRlcm4gVUlOVDMyIG1pYl9jYXRsaXN0X3NpemU7CitleHRlcm4gdTMyIG1pYl9jYXRsaXN0X3NpemU7CiAKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1ldGFtc2cuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1ldGFtc2cuaAppbmRleCA0ZDZkZmNjLi42ZTY1OWVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZXRhbXNnLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWV0YW1zZy5oCkBAIC05Myw3ICs5Myw3IEBACiAvKiBjYXRlZ29yeSBtZXRhZGF0YSBsaXN0ICovCiAKIGV4dGVybiBjYXRsaXN0aXRlbV90IG1zZ19jYXRsaXN0W107Ci1leHRlcm4gVUlOVDMyIG1zZ19jYXRsaXN0X3NpemU7CitleHRlcm4gdTMyIG1zZ19jYXRsaXN0X3NpemU7CiAKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1ldGFzdHJ1Y3QuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1ldGFzdHJ1Y3QuaAppbmRleCA3MTVmNGIyLi5kMjI1OGIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZXRhc3RydWN0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWV0YXN0cnVjdC5oCkBAIC01MCw0NyArNTAsMzYgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYmdldAogewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKKwl1MzIJCW1zZ2NvZGUJOworCXUzMgkJbXNnbGVuCTsKKwl1OAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CiAJcDgwMjExaXRlbV91bmszOTJfdAltaWJhdHRyaWJ1dGUJOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19kb3QxMXJlcV9taWJnZXRfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYnNldAogewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKKwl1MzIJCW1zZ2NvZGUJOworCXUzMgkJbXNnbGVuCTsKKwl1OAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CiAJcDgwMjExaXRlbV91bmszOTJfdAltaWJhdHRyaWJ1dGUJOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdDsKIAotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX3Bvd2VybWdtdAotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXBvd2VybWdtdG1vZGUJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJd2FrZXVwCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlY2VpdmVkdGltcwk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX2RvdDExcmVxX3Bvd2VybWdtdF90OwotCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfc2NhbgogewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKKwl1MzIJCW1zZ2NvZGUJOworCXUzMgkJbXNnbGVuCTsKKwl1OAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlic3N0eXBlCTsKIAlwODAyMTFpdGVtX3BzdHI2X3QJYnNzaWQJOwotCVVJTlQ4CXBhZF8wQ1sxXQk7CisJdTgJcGFkXzBDWzFdCTsKIAlwODAyMTFpdGVtX3BzdHIzMl90CXNzaWQJOwotCVVJTlQ4CXBhZF8xRFszXQk7CisJdTgJcGFkXzFEWzNdCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CXNjYW50eXBlCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CXByb2JlZGVsYXkJOwogCXA4MDIxMWl0ZW1fcHN0cjE0X3QJY2hhbm5lbGxpc3QJOwotCVVJTlQ4CXBhZF8yQ1sxXQk7CisJdTgJcGFkXzJDWzFdCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CW1pbmNoYW5uZWx0aW1lCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CW1heGNoYW5uZWx0aW1lCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwpAQCAtMTAwLDE3ICs4OSwxNyBAQAogCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfc2Nhbl9yZXN1bHRzCiB7Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOworCXUzMgkJbXNnY29kZQk7CisJdTMyCQltc2dsZW4JOworCXU4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CWJzc2luZGV4CTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJc2lnbmFsCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CW5vaXNlCTsKIAlwODAyMTFpdGVtX3BzdHI2X3QJYnNzaWQJOwotCVVJTlQ4CXBhZF8zQ1sxXQk7CisJdTgJcGFkXzNDWzFdCTsKIAlwODAyMTFpdGVtX3BzdHIzMl90CXNzaWQJOwotCVVJTlQ4CXBhZF80RFszXQk7CisJdTgJcGFkXzREWzNdCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CWJzc3R5cGUJOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJYmVhY29ucGVyaW9kCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CWR0aW1wZXJpb2QJOwpAQCAtMTQ3LDExNSArMTM2LDEzIEBACiAJcDgwMjExaXRlbV91aW50MzJfdAlzdXBwcmF0ZTgJOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfZG90MTFyZXFfc2Nhbl9yZXN1bHRzX3Q7CiAKLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9qb2luCi17Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwotCXA4MDIxMWl0ZW1fcHN0cjZfdAlic3NpZAk7Ci0JVUlOVDgJcGFkXzVDWzFdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWpvaW5mYWlsdXJldGltZW91dAk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAliYXNpY3JhdGUxCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWJhc2ljcmF0ZTIJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJYmFzaWNyYXRlMwk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAliYXNpY3JhdGU0CTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWJhc2ljcmF0ZTUJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJYmFzaWNyYXRlNgk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAliYXNpY3JhdGU3CTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWJhc2ljcmF0ZTgJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJb3BlcmF0aW9uYWxyYXRlMQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlvcGVyYXRpb25hbHJhdGUyCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CW9wZXJhdGlvbmFscmF0ZTMJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJb3BlcmF0aW9uYWxyYXRlNAk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlvcGVyYXRpb25hbHJhdGU1CTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CW9wZXJhdGlvbmFscmF0ZTYJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJb3BlcmF0aW9uYWxyYXRlNwk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlvcGVyYXRpb25hbHJhdGU4CTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwotfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfZG90MTFyZXFfam9pbl90OwotCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfYXV0aGVudGljYXRlCi17Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwotCXA4MDIxMWl0ZW1fcHN0cjZfdAlwZWVyc3RhYWRkcmVzcwk7Ci0JVUlOVDgJcGFkXzZDWzFdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWF1dGhlbnRpY2F0aW9udHlwZQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlhdXRoZW50aWNhdGlvbmZhaWx1cmV0aW1lb3V0CTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwotfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfZG90MTFyZXFfYXV0aGVudGljYXRlX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9kZWF1dGhlbnRpY2F0ZQotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3BzdHI2X3QJcGVlcnN0YWFkZHJlc3MJOwotCVVJTlQ4CXBhZF83Q1sxXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZWFzb25jb2RlCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwotfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfZG90MTFyZXFfZGVhdXRoZW50aWNhdGVfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX2Fzc29jaWF0ZQotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3BzdHI2X3QJcGVlcnN0YWFkZHJlc3MJOwotCVVJTlQ4CXBhZF84Q1sxXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlhc3NvY2lhdGVmYWlsdXJldGltZW91dAk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAljZnBvbGxhYmxlCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWNmcG9sbHJlcQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlwcml2YWN5CTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWxpc3RlbmludGVydmFsCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwotfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfZG90MTFyZXFfYXNzb2NpYXRlX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9yZWFzc29jaWF0ZQotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3BzdHI2X3QJbmV3YXBhZGRyZXNzCTsKLQlVSU5UOAlwYWRfOUNbMV0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVhc3NvY2lhdGVmYWlsdXJldGltZW91dAk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAljZnBvbGxhYmxlCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWNmcG9sbHJlcQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlwcml2YWN5CTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWxpc3RlbmludGVydmFsCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwotfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfZG90MTFyZXFfcmVhc3NvY2lhdGVfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX2Rpc2Fzc29jaWF0ZQotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3BzdHI2X3QJcGVlcnN0YWFkZHJlc3MJOwotCVVJTlQ4CXBhZF8xMENbMV0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVhc29uY29kZQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX2RvdDExcmVxX2Rpc2Fzc29jaWF0ZV90OwotCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfcmVzZXQKLXsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlzZXRkZWZhdWx0bWliCTsKLQlwODAyMTFpdGVtX3BzdHI2X3QJbWFjYWRkcmVzcwk7Ci0JVUlOVDgJcGFkXzExQ1sxXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX2RvdDExcmVxX3Jlc2V0X3Q7Ci0KIHR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9zdGFydAogewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKKwl1MzIJCW1zZ2NvZGUJOworCXUzMgkJbXNnbGVuCTsKKwl1OAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CiAJcDgwMjExaXRlbV9wc3RyMzJfdAlzc2lkCTsKLQlVSU5UOAlwYWRfMTJEWzNdCTsKKwl1OAlwYWRfMTJEWzNdCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CWJzc3R5cGUJOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJYmVhY29ucGVyaW9kCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CWR0aW1wZXJpb2QJOwpAQCAtMjg4LDcyICsxNzUsMjAgQEAKIAlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfZG90MTFyZXFfc3RhcnRfdDsKIAotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExaW5kX2F1dGhlbnRpY2F0ZQotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3BzdHI2X3QJcGVlcnN0YWFkZHJlc3MJOwotCVVJTlQ4CXBhZF8xM0NbMV0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJYXV0aGVudGljYXRpb250eXBlCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX2RvdDExaW5kX2F1dGhlbnRpY2F0ZV90OwotCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfZG90MTFpbmRfZGVhdXRoZW50aWNhdGUKLXsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7Ci0JcDgwMjExaXRlbV9wc3RyNl90CXBlZXJzdGFhZGRyZXNzCTsKLQlVSU5UOAlwYWRfMTRDWzFdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlYXNvbmNvZGUJOwotfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfZG90MTFpbmRfZGVhdXRoZW50aWNhdGVfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExaW5kX2Fzc29jaWF0ZQotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3BzdHI2X3QJcGVlcnN0YWFkZHJlc3MJOwotCVVJTlQ4CXBhZF8xNUNbMV0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJYWlkCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX2RvdDExaW5kX2Fzc29jaWF0ZV90OwotCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfZG90MTFpbmRfcmVhc3NvY2lhdGUKLXsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7Ci0JcDgwMjExaXRlbV9wc3RyNl90CXBlZXJzdGFhZGRyZXNzCTsKLQlVSU5UOAlwYWRfMTZDWzFdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWFpZAk7Ci0JcDgwMjExaXRlbV9wc3RyNl90CW9sZGFwYWRkcmVzcwk7Ci0JVUlOVDgJcGFkXzE3Q1sxXQk7Ci19IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19kb3QxMWluZF9yZWFzc29jaWF0ZV90OwotCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfZG90MTFpbmRfZGlzYXNzb2NpYXRlCi17Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwotCXA4MDIxMWl0ZW1fcHN0cjZfdAlwZWVyc3RhYWRkcmVzcwk7Ci0JVUlOVDgJcGFkXzE4Q1sxXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZWFzb25jb2RlCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX2RvdDExaW5kX2Rpc2Fzc29jaWF0ZV90OwotCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfbG54cmVxX2lmc3RhdGUKIHsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CisJdTMyCQltc2djb2RlCTsKKwl1MzIJCW1zZ2xlbgk7CisJdTgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJaWZzdGF0ZQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX2xueHJlcV9pZnN0YXRlX3Q7CiAKIHR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19sbnhyZXFfd2xhbnNuaWZmCiB7Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOworCXUzMgkJbXNnY29kZQk7CisJdTMyCQltc2dsZW4JOworCXU4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CWVuYWJsZQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAljaGFubmVsCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CXByaXNtaGVhZGVyCTsKQEAgLTM2Niw5ICsyMDEsOSBAQAogCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfbG54cmVxX2hvc3R3ZXAKIHsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CisJdTMyCQltc2djb2RlCTsKKwl1MzIJCW1zZ2xlbgk7CisJdTgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlkZWNyeXB0CTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CWVuY3J5cHQJOwpAQCAtMzc2LDkgKzIxMSw5IEBACiAKIHR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19sbnhyZXFfY29tbXNxdWFsaXR5CiB7Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOworCXUzMgkJbXNnY29kZQk7CisJdTMyCQltc2dsZW4JOworCXU4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJZGJtCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CWxpbmsJOwpAQCAtMzg4LDE3MyArMjIzLDI5IEBACiAKIHR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19sbnhyZXFfYXV0b2pvaW4KIHsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CisJdTMyCQltc2djb2RlCTsKKwl1MzIJCW1zZ2xlbgk7CisJdTgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwogCXA4MDIxMWl0ZW1fcHN0cjMyX3QJc3NpZAk7Ci0JVUlOVDgJcGFkXzE5RFszXQk7CisJdTgJcGFkXzE5RFszXQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlhdXRodHlwZQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX2xueHJlcV9hdXRvam9pbl90OwogCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfbG54aW5kX3dsYW5zbmlmZnJtCi17Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJaG9zdHRpbWUJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJbWFjdGltZQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAljaGFubmVsCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJzc2kJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJc3EJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJc2lnbmFsCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CW5vaXNlCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJhdGUJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJaXN0eAk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlmcm1sZW4JOwotfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19sbnhpbmRfcm9hbQotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlYXNvbgk7Ci19IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19sbnhpbmRfcm9hbV90OwotCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfcDJyZXFfam9pbgotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3BzdHI2X3QJYnNzaWQJOwotCVVJTlQ4CXBhZF8yMENbMV0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJYmFzaWNyYXRlMQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAliYXNpY3JhdGUyCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWJhc2ljcmF0ZTMJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJYmFzaWNyYXRlNAk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAliYXNpY3JhdGU1CTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWJhc2ljcmF0ZTYJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJYmFzaWNyYXRlNwk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAliYXNpY3JhdGU4CTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CW9wZXJhdGlvbmFscmF0ZTEJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJb3BlcmF0aW9uYWxyYXRlMgk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlvcGVyYXRpb25hbHJhdGUzCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CW9wZXJhdGlvbmFscmF0ZTQJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJb3BlcmF0aW9uYWxyYXRlNQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlvcGVyYXRpb25hbHJhdGU2CTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CW9wZXJhdGlvbmFscmF0ZTcJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJb3BlcmF0aW9uYWxyYXRlOAk7Ci0JcDgwMjExaXRlbV9wc3RyMzJfdAlzc2lkCTsKLQlVSU5UOAlwYWRfMjFEWzNdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWNoYW5uZWwJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJYXV0aHR5cGUJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7Ci19IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19wMnJlcV9qb2luX3Q7Ci0KIHR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9yZWFkcGRhCiB7Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOworCXUzMgkJbXNnY29kZQk7CisJdTMyCQltc2dsZW4JOworCXU4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKIAlwODAyMTFpdGVtX3VuazEwMjRfdAlwZGEJOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19wMnJlcV9yZWFkcGRhX3Q7CiAKLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9yZWFkY2lzCi17Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwotCXA4MDIxMWl0ZW1fdW5rMTAyNF90CWNpcwk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX3AycmVxX3JlYWRjaXNfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX2F1eHBvcnRfc3RhdGUKLXsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAllbmFibGUJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7Ci19IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19wMnJlcV9hdXhwb3J0X3N0YXRlX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9hdXhwb3J0X3JlYWQKLXsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlhZGRyCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWxlbgk7Ci0JcDgwMjExaXRlbV91bmsxMDI0X3QJZGF0YQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX3AycmVxX2F1eHBvcnRfcmVhZF90OwotCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfcDJyZXFfYXV4cG9ydF93cml0ZQotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWFkZHIJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJbGVuCTsKLQlwODAyMTFpdGVtX3VuazEwMjRfdAlkYXRhCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwotfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfcDJyZXFfYXV4cG9ydF93cml0ZV90OwotCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfcDJyZXFfbG93X2xldmVsCi17Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJY29tbWFuZAk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlwYXJhbTAJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcGFyYW0xCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXBhcmFtMgk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXNwMAk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXNwMQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXNwMgk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX3AycmVxX2xvd19sZXZlbF90OwotCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfcDJyZXFfdGVzdF9jb21tYW5kCi17Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJdGVzdGNvZGUJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJdGVzdHBhcmFtCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJc3RhdHVzCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3AwCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3AxCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3AyCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX3AycmVxX3Rlc3RfY29tbWFuZF90OwotCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfcDJyZXFfbW1pX3JlYWQKLXsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlhZGRyCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXZhbHVlCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwotfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFtc2dfcDJyZXFfbW1pX3JlYWRfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX21taV93cml0ZQotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWFkZHIJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJZGF0YQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX3AycmVxX21taV93cml0ZV90OwotCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfcDJyZXFfcmFtZGxfc3RhdGUKIHsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CisJdTMyCQltc2djb2RlCTsKKwl1MzIJCW1zZ2xlbgk7CisJdTgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJZW5hYmxlCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CWV4ZWFkZHIJOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7CkBAIC01NjIsOSArMjUzLDkgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX3JhbWRsX3dyaXRlCiB7Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOworCXUzMgkJbXNnY29kZQk7CisJdTMyCQltc2dsZW4JOworCXU4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CWFkZHIJOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJbGVuCTsKIAlwODAyMTFpdGVtX3VuazQwOTZfdAlkYXRhCTsKQEAgLTU3Myw3MiArMjY0LDIyIEBACiAKIHR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9mbGFzaGRsX3N0YXRlCiB7Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOworCXUzMgkJbXNnY29kZQk7CisJdTMyCQltc2dsZW4JOworCXU4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKIAlwODAyMTFpdGVtX3VpbnQzMl90CWVuYWJsZQk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX3AycmVxX2ZsYXNoZGxfc3RhdGVfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX2ZsYXNoZGxfd3JpdGUKIHsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7CisJdTMyCQltc2djb2RlCTsKKwl1MzIJCW1zZ2xlbgk7CisJdTgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJYWRkcgk7CiAJcDgwMjExaXRlbV91aW50MzJfdAlsZW4JOwogCXA4MDIxMWl0ZW1fdW5rNDA5Nl90CWRhdGEJOwogCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19wMnJlcV9mbGFzaGRsX3dyaXRlX3Q7CiAKLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9tbV9zdGF0ZQotewotCVVJTlQzMgkJbXNnY29kZQk7Ci0JVUlOVDMyCQltc2dsZW4JOwotCVVJTlQ4CQlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CWVuYWJsZQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX3AycmVxX21tX3N0YXRlX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9kdW1wX3N0YXRlCi17Ci0JVUlOVDMyCQltc2djb2RlCTsKLQlVSU5UMzIJCW1zZ2xlbgk7Ci0JVUlOVDgJCWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF0JOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJbGV2ZWwJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcmVzdWx0Y29kZQk7Ci19IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ19wMnJlcV9kdW1wX3N0YXRlX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9jaGFubmVsX2luZm8KLXsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAljaGFubmVsbGlzdAk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAljaGFubmVsZHdlbGx0aW1lCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJbnVtY2hpbmZvCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX3AycmVxX2NoYW5uZWxfaW5mb190OwotCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dfcDJyZXFfY2hhbm5lbF9pbmZvX3Jlc3VsdHMKLXsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAljaGFubmVsCTsKLQlwODAyMTFpdGVtX3VpbnQzMl90CXJlc3VsdGNvZGUJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJYXZnbm9pc2VsZXZlbAk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlwZWFrbm9pc2VsZXZlbAk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlic3NhY3RpdmUJOwotCXA4MDIxMWl0ZW1fdWludDMyX3QJcGNmYWN0aXZlCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX3AycmVxX2NoYW5uZWxfaW5mb19yZXN1bHRzX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9lbmFibGUKLXsKLQlVSU5UMzIJCW1zZ2NvZGUJOwotCVVJTlQzMgkJbXNnbGVuCTsKLQlVSU5UOAkJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXQk7Ci0JcDgwMjExaXRlbV91aW50MzJfdAlyZXN1bHRjb2RlCTsKLX0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExbXNnX3AycmVxX2VuYWJsZV90OwotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1nbXQuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1nbXQuaAppbmRleCBiZDRjMTYyOS4uNmNjMTZjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWdtdC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1nbXQuaApAQCAtMTcyLDE0ICsxNzIsMTQgQEAKIC8qIE5vdGU6IFRoZXNlIG9mZnNldHMgYXJlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmcmFtZSBkYXRhICAgICAgICovCiAKICNkZWZpbmUgV0xBTl9CRUFDT05fT0ZGX1RTCQkJMAotI2RlZmluZSBXTEFOX0JFQUNPTl9PRkZfQkNOX0lOVAkJCTgKKyNkZWZpbmUgV0xBTl9CRUFDT05fT0ZGX0JDTl9pbnQJCQk4CiAjZGVmaW5lIFdMQU5fQkVBQ09OX09GRl9DQVBJTkZPCQkJMTAKICNkZWZpbmUgV0xBTl9CRUFDT05fT0ZGX1NTSUQJCQkxMgogCiAjZGVmaW5lIFdMQU5fRElTQVNTT0NfT0ZGX1JFQVNPTgkJMAogCiAjZGVmaW5lIFdMQU5fQVNTT0NSRVFfT0ZGX0NBUF9JTkZPCQkwCi0jZGVmaW5lIFdMQU5fQVNTT0NSRVFfT0ZGX0xJU1RFTl9JTlQJCTIKKyNkZWZpbmUgV0xBTl9BU1NPQ1JFUV9PRkZfTElTVEVOX2ludAkJMgogI2RlZmluZSBXTEFOX0FTU09DUkVRX09GRl9TU0lECQkJNAogCiAjZGVmaW5lIFdMQU5fQVNTT0NSRVNQX09GRl9DQVBfSU5GTwkJMApAQCAtMTg4LDcgKzE4OCw3IEBACiAjZGVmaW5lIFdMQU5fQVNTT0NSRVNQX09GRl9TVVBQX1JBVEVTCQk2CiAKICNkZWZpbmUgV0xBTl9SRUFTU09DUkVRX09GRl9DQVBfSU5GTwkJMAotI2RlZmluZSBXTEFOX1JFQVNTT0NSRVFfT0ZGX0xJU1RFTl9JTlQJCTIKKyNkZWZpbmUgV0xBTl9SRUFTU09DUkVRX09GRl9MSVNURU5faW50CQkyCiAjZGVmaW5lIFdMQU5fUkVBU1NPQ1JFUV9PRkZfQ1VSUl9BUAkJNAogI2RlZmluZSBXTEFOX1JFQVNTT0NSRVFfT0ZGX1NTSUQJCTEwCiAKQEAgLTIwMCw3ICsyMDAsNyBAQAogI2RlZmluZSBXTEFOX1BST0JFUkVRX09GRl9TU0lECQkJMAogCiAjZGVmaW5lIFdMQU5fUFJPQkVSRVNQX09GRl9UUwkJCTAKLSNkZWZpbmUgV0xBTl9QUk9CRVJFU1BfT0ZGX0JDTl9JTlQJCTgKKyNkZWZpbmUgV0xBTl9QUk9CRVJFU1BfT0ZGX0JDTl9pbnQJCTgKICNkZWZpbmUgV0xBTl9QUk9CRVJFU1BfT0ZGX0NBUF9JTkZPCQkxMAogI2RlZmluZSBXTEFOX1BST0JFUkVTUF9PRkZfU1NJRAkJCTEyCiAKQEAgLTI0NSw4MiArMjQ1LDgyIEBACiAKIHR5cGVkZWYgc3RydWN0IHdsYW5faWUKIHsKLQlVSU5UOAllaWQ7Ci0JVUlOVDgJbGVuOworCXU4CWVpZDsKKwl1OAlsZW47CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHdsYW5faWVfdDsKIAogLyotLSBTZXJ2aWNlIFNldCBJZGVudGl0eSAoU1NJRCkgIC0tLS0tLS0tLS0tLS0tLS0tKi8KIHR5cGVkZWYgc3RydWN0IHdsYW5faWVfc3NpZAogewotCVVJTlQ4CWVpZDsKLQlVSU5UOAlsZW47Ci0JVUlOVDgJc3NpZFsxXTsgIC8qIG1heSBiZSB6ZXJvLCBwdHJzIG1heSBvdmVybGFwICovCisJdTgJZWlkOworCXU4CWxlbjsKKwl1OAlzc2lkWzFdOyAgLyogbWF5IGJlIHplcm8sIHB0cnMgbWF5IG92ZXJsYXAgKi8KIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gd2xhbl9pZV9zc2lkX3Q7CiAKIC8qLS0gU3VwcG9ydGVkIFJhdGVzICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiB0eXBlZGVmIHN0cnVjdCB3bGFuX2llX3N1cHBfcmF0ZXMKIHsKLQlVSU5UOAllaWQ7Ci0JVUlOVDgJbGVuOwotCVVJTlQ4CXJhdGVzWzFdOyAgLyogaGFkIGJldHRlciBiZSBhdCBMRUFTVCBvbmUhICovCisJdTgJZWlkOworCXU4CWxlbjsKKwl1OAlyYXRlc1sxXTsgIC8qIGhhZCBiZXR0ZXIgYmUgYXQgTEVBU1Qgb25lISAqLwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyB3bGFuX2llX3N1cHBfcmF0ZXNfdDsKIAogLyotLSBGSCBQYXJhbWV0ZXIgU2V0ICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHR5cGVkZWYgc3RydWN0IHdsYW5faWVfZmhfcGFybXMKIHsKLQlVSU5UOAllaWQ7Ci0JVUlOVDgJbGVuOwotCVVJTlQxNglkd2VsbDsKLQlVSU5UOAlob3BzZXQ7Ci0JVUlOVDgJaG9wcGF0dGVybjsKLQlVSU5UOAlob3BpbmRleDsKKwl1OAllaWQ7CisJdTgJbGVuOworCXUxNglkd2VsbDsKKwl1OAlob3BzZXQ7CisJdTgJaG9wcGF0dGVybjsKKwl1OAlob3BpbmRleDsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gd2xhbl9pZV9maF9wYXJtc190OwogCiAvKi0tIERTIFBhcmFtZXRlciBTZXQgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9pZV9kc19wYXJtcwogewotCVVJTlQ4CWVpZDsKLQlVSU5UOAlsZW47Ci0JVUlOVDgJY3Vycl9jaDsKKwl1OAllaWQ7CisJdTgJbGVuOworCXU4CWN1cnJfY2g7CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHdsYW5faWVfZHNfcGFybXNfdDsKIAogLyotLSBDRiBQYXJhbWV0ZXIgU2V0ICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9pZV9jZl9wYXJtcwogewotCVVJTlQ4CWVpZDsKLQlVSU5UOAlsZW47Ci0JVUlOVDgJY2ZwX2NudDsKLQlVSU5UOAljZnBfcGVyaW9kOwotCVVJTlQxNgljZnBfbWF4ZHVyOwotCVVJTlQxNgljZnBfZHVycmVtYWluaW5nOworCXU4CWVpZDsKKwl1OAlsZW47CisJdTgJY2ZwX2NudDsKKwl1OAljZnBfcGVyaW9kOworCXUxNgljZnBfbWF4ZHVyOworCXUxNgljZnBfZHVycmVtYWluaW5nOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyB3bGFuX2llX2NmX3Bhcm1zX3Q7CiAKIC8qLS0gVElNIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiB0eXBlZGVmIHN0cnVjdCB3bGFuX2llX3RpbQogewotCVVJTlQ4CWVpZDsKLQlVSU5UOAlsZW47Ci0JVUlOVDgJZHRpbV9jbnQ7Ci0JVUlOVDgJZHRpbV9wZXJpb2Q7Ci0JVUlOVDgJYml0bWFwX2N0bDsKLQlVSU5UOAl2aXJ0X2JtWzFdOworCXU4CWVpZDsKKwl1OAlsZW47CisJdTgJZHRpbV9jbnQ7CisJdTgJZHRpbV9wZXJpb2Q7CisJdTgJYml0bWFwX2N0bDsKKwl1OAl2aXJ0X2JtWzFdOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyB3bGFuX2llX3RpbV90OwogCiAvKi0tIElCU1MgUGFyYW1ldGVyIFNldCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9pZV9pYnNzX3Bhcm1zCiB7Ci0JVUlOVDgJZWlkOwotCVVJTlQ4CWxlbjsKLQlVSU5UMTYJYXRpbV93aW47CisJdTgJZWlkOworCXU4CWxlbjsKKwl1MTYJYXRpbV93aW47CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHdsYW5faWVfaWJzc19wYXJtc190OwogCiAvKi0tIENoYWxsZW5nZSBUZXh0ICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9pZV9jaGFsbGVuZ2UKIHsKLQlVSU5UOAllaWQ7Ci0JVUlOVDgJbGVuOwotCVVJTlQ4CWNoYWxsZW5nZVsxXTsKKwl1OAllaWQ7CisJdTgJbGVuOworCXU4CWNoYWxsZW5nZVsxXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gd2xhbl9pZV9jaGFsbGVuZ2VfdDsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTMyOSw5ICszMjksOSBAQAogLyogcHJvdG90eXBlIHN0cnVjdHVyZSwgYWxsIG1nbXQgZnJhbWUgdHlwZXMgd2lsbCBzdGFydCB3aXRoIHRoZXNlIG1lbWJlcnMgKi8KIHR5cGVkZWYgc3RydWN0IHdsYW5fZnJfbWdtdAogewotCVVJTlQxNgkJCXR5cGU7Ci0JVUlOVDE2CQkJbGVuOwkvKiBET0VTIE5PVCBpbmNsdWRlIENSQyAhISEhKi8KLQlVSU5UOAkJCSpidWY7CisJdTE2CQkJdHlwZTsKKwl1MTYJCQlsZW47CS8qIERPRVMgTk9UIGluY2x1ZGUgQ1JDICEhISEqLworCXU4CQkJKmJ1ZjsKIAlwODAyMTFfaGRyX3QJCSpoZHI7CiAJLyogdXNlZCBmb3IgdGFyZ2V0IHNwZWNpZmljIGRhdGEsIHNrYiBpbiBMaW51eCAqLwogCXZvaWQJCQkqcHJpdjsKQEAgLTM0MiwxNiArMzQyLDE2IEBACiAvKi0tIEJlYWNvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9mcl9iZWFjb24KIHsKLQlVSU5UMTYJCQl0eXBlOwotCVVJTlQxNgkJCWxlbjsKLQlVSU5UOAkJCSpidWY7CisJdTE2CQkJdHlwZTsKKwl1MTYJCQlsZW47CisJdTgJCQkqYnVmOwogCXA4MDIxMV9oZHJfdAkJKmhkcjsKIAkvKiB1c2VkIGZvciB0YXJnZXQgc3BlY2lmaWMgZGF0YSwgc2tiIGluIExpbnV4ICovCiAJdm9pZAkJCSpwcml2OwogCS8qLS0gZml4ZWQgZmllbGRzIC0tLS0tLS0tLS0tKi8KLQlVSU5UNjQJCQkqdHM7Ci0JVUlOVDE2CQkJKmJjbl9pbnQ7Ci0JVUlOVDE2CQkJKmNhcF9pbmZvOworCXU2NAkJCSp0czsKKwl1MTYJCQkqYmNuX2ludDsKKwl1MTYJCQkqY2FwX2luZm87CiAJLyotLSBpbmZvIGVsZW1lbnRzIC0tLS0tLS0tLS0qLwogCXdsYW5faWVfc3NpZF90CQkqc3NpZDsKIAl3bGFuX2llX3N1cHBfcmF0ZXNfdAkqc3VwcF9yYXRlczsKQEAgLTM2Nyw5ICszNjcsOSBAQAogLyotLSBJQlNTIEFUSU0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHR5cGVkZWYgc3RydWN0IHdsYW5fZnJfaWJzc2F0aW0KIHsKLQlVSU5UMTYJCQl0eXBlOwotCVVJTlQxNgkJCWxlbjsKLQlVSU5UOCoJCQlidWY7CisJdTE2CQkJdHlwZTsKKwl1MTYJCQlsZW47CisJdTgqCQkJYnVmOwogCXA4MDIxMV9oZHJfdAkJKmhkcjsKIAkvKiB1c2VkIGZvciB0YXJnZXQgc3BlY2lmaWMgZGF0YSwgc2tiIGluIExpbnV4ICovCiAJdm9pZAkJCSpwcml2OwpAQCAtMzg0LDE0ICszODQsMTQgQEAKIC8qLS0gRGlzYXNzb2NpYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiB0eXBlZGVmIHN0cnVjdCB3bGFuX2ZyX2Rpc2Fzc29jCiB7Ci0JVUlOVDE2CQkJdHlwZTsKLQlVSU5UMTYJCQlsZW47Ci0JVUlOVDgJCQkqYnVmOworCXUxNgkJCXR5cGU7CisJdTE2CQkJbGVuOworCXU4CQkJKmJ1ZjsKIAlwODAyMTFfaGRyX3QJCSpoZHI7CiAJLyogdXNlZCBmb3IgdGFyZ2V0IHNwZWNpZmljIGRhdGEsIHNrYiBpbiBMaW51eCAqLwogCXZvaWQJCQkqcHJpdjsKIAkvKi0tIGZpeGVkIGZpZWxkcyAtLS0tLS0tLS0tLSovCi0JVUlOVDE2CQkJKnJlYXNvbjsKKwl1MTYJCQkqcmVhc29uOwogCiAJLyotLSBpbmZvIGVsZW1lbnRzIC0tLS0tLS0tLS0qLwogCkBAIC00MDAsMTUgKzQwMCwxNSBAQAogLyotLSBBc3NvY2lhdGlvbiBSZXF1ZXN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHR5cGVkZWYgc3RydWN0IHdsYW5fZnJfYXNzb2NyZXEKIHsKLQlVSU5UMTYJCQl0eXBlOwotCVVJTlQxNgkJCWxlbjsKLQlVSU5UOCoJCQlidWY7CisJdTE2CQkJdHlwZTsKKwl1MTYJCQlsZW47CisJdTgqCQkJYnVmOwogCXA4MDIxMV9oZHJfdAkJKmhkcjsKIAkvKiB1c2VkIGZvciB0YXJnZXQgc3BlY2lmaWMgZGF0YSwgc2tiIGluIExpbnV4ICovCiAJdm9pZAkJCSpwcml2OwogCS8qLS0gZml4ZWQgZmllbGRzIC0tLS0tLS0tLS0tKi8KLQlVSU5UMTYJCQkqY2FwX2luZm87Ci0JVUlOVDE2CQkJKmxpc3Rlbl9pbnQ7CisJdTE2CQkJKmNhcF9pbmZvOworCXUxNgkJCSpsaXN0ZW5faW50OwogCS8qLS0gaW5mbyBlbGVtZW50cyAtLS0tLS0tLS0tKi8KIAl3bGFuX2llX3NzaWRfdAkJKnNzaWQ7CiAJd2xhbl9pZV9zdXBwX3JhdGVzX3QJKnN1cHBfcmF0ZXM7CkBAIC00MTgsMTYgKzQxOCwxNiBAQAogLyotLSBBc3NvY2lhdGlvbiBSZXNwb25zZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHR5cGVkZWYgc3RydWN0IHdsYW5fZnJfYXNzb2NyZXNwCiB7Ci0JVUlOVDE2CQkJdHlwZTsKLQlVSU5UMTYJCQlsZW47Ci0JVUlOVDgJCQkqYnVmOworCXUxNgkJCXR5cGU7CisJdTE2CQkJbGVuOworCXU4CQkJKmJ1ZjsKIAlwODAyMTFfaGRyX3QJCSpoZHI7CiAJLyogdXNlZCBmb3IgdGFyZ2V0IHNwZWNpZmljIGRhdGEsIHNrYiBpbiBMaW51eCAqLwogCXZvaWQJCQkqcHJpdjsKIAkvKi0tIGZpeGVkIGZpZWxkcyAtLS0tLS0tLS0tLSovCi0JVUlOVDE2CQkJKmNhcF9pbmZvOwotCVVJTlQxNgkJCSpzdGF0dXM7Ci0JVUlOVDE2CQkJKmFpZDsKKwl1MTYJCQkqY2FwX2luZm87CisJdTE2CQkJKnN0YXR1czsKKwl1MTYJCQkqYWlkOwogCS8qLS0gaW5mbyBlbGVtZW50cyAtLS0tLS0tLS0tKi8KIAl3bGFuX2llX3N1cHBfcmF0ZXNfdAkqc3VwcF9yYXRlczsKIApAQCAtNDM2LDE2ICs0MzYsMTYgQEAKIC8qLS0gUmVhc3NvY2lhdGlvbiBSZXF1ZXN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiB0eXBlZGVmIHN0cnVjdCB3bGFuX2ZyX3JlYXNzb2NyZXEKIHsKLQlVSU5UMTYJCQl0eXBlOwotCVVJTlQxNgkJCWxlbjsKLQlVSU5UOAkJCSpidWY7CisJdTE2CQkJdHlwZTsKKwl1MTYJCQlsZW47CisJdTgJCQkqYnVmOwogCXA4MDIxMV9oZHJfdAkJKmhkcjsKIAkvKiB1c2VkIGZvciB0YXJnZXQgc3BlY2lmaWMgZGF0YSwgc2tiIGluIExpbnV4ICovCiAJdm9pZAkJCSpwcml2OwogCS8qLS0gZml4ZWQgZmllbGRzIC0tLS0tLS0tLS0tKi8KLQlVSU5UMTYJCQkqY2FwX2luZm87Ci0JVUlOVDE2CQkJKmxpc3Rlbl9pbnQ7Ci0JVUlOVDgJCQkqY3Vycl9hcDsKKwl1MTYJCQkqY2FwX2luZm87CisJdTE2CQkJKmxpc3Rlbl9pbnQ7CisJdTgJCQkqY3Vycl9hcDsKIAkvKi0tIGluZm8gZWxlbWVudHMgLS0tLS0tLS0tLSovCiAJd2xhbl9pZV9zc2lkX3QJCSpzc2lkOwogCXdsYW5faWVfc3VwcF9yYXRlc190CSpzdXBwX3JhdGVzOwpAQCAtNDU1LDE2ICs0NTUsMTYgQEAKIC8qLS0gUmVhc3NvY2lhdGlvbiBSZXNwb25zZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiB0eXBlZGVmIHN0cnVjdCB3bGFuX2ZyX3JlYXNzb2NyZXNwCiB7Ci0JVUlOVDE2CQkJdHlwZTsKLQlVSU5UMTYJCQlsZW47Ci0JVUlOVDgJCQkqYnVmOworCXUxNgkJCXR5cGU7CisJdTE2CQkJbGVuOworCXU4CQkJKmJ1ZjsKIAlwODAyMTFfaGRyX3QJCSpoZHI7CiAJLyogdXNlZCBmb3IgdGFyZ2V0IHNwZWNpZmljIGRhdGEsIHNrYiBpbiBMaW51eCAqLwogCXZvaWQJCQkqcHJpdjsKIAkvKi0tIGZpeGVkIGZpZWxkcyAtLS0tLS0tLS0tLSovCi0JVUlOVDE2CQkJKmNhcF9pbmZvOwotCVVJTlQxNgkJCSpzdGF0dXM7Ci0JVUlOVDE2CQkJKmFpZDsKKwl1MTYJCQkqY2FwX2luZm87CisJdTE2CQkJKnN0YXR1czsKKwl1MTYJCQkqYWlkOwogCS8qLS0gaW5mbyBlbGVtZW50cyAtLS0tLS0tLS0tKi8KIAl3bGFuX2llX3N1cHBfcmF0ZXNfdAkqc3VwcF9yYXRlczsKIApAQCAtNDczLDkgKzQ3Myw5IEBACiAvKi0tIFByb2JlIFJlcXVlc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9mcl9wcm9iZXJlcQogewotCVVJTlQxNgkJCXR5cGU7Ci0JVUlOVDE2CQkJbGVuOwotCVVJTlQ4CQkJKmJ1ZjsKKwl1MTYJCQl0eXBlOworCXUxNgkJCWxlbjsKKwl1OAkJCSpidWY7CiAJcDgwMjExX2hkcl90CQkqaGRyOwogCS8qIHVzZWQgZm9yIHRhcmdldCBzcGVjaWZpYyBkYXRhLCBza2IgaW4gTGludXggKi8KIAl2b2lkCQkJKnByaXY7CkBAIC00ODksMTYgKzQ4OSwxNiBAQAogLyotLSBQcm9iZSBSZXNwb25zZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHR5cGVkZWYgc3RydWN0IHdsYW5fZnJfcHJvYmVyZXNwCiB7Ci0JVUlOVDE2CQkJdHlwZTsKLQlVSU5UMTYJCQlsZW47Ci0JVUlOVDgJCQkqYnVmOworCXUxNgkJCXR5cGU7CisJdTE2CQkJbGVuOworCXU4CQkJKmJ1ZjsKIAlwODAyMTFfaGRyX3QJCSpoZHI7CiAJLyogdXNlZCBmb3IgdGFyZ2V0IHNwZWNpZmljIGRhdGEsIHNrYiBpbiBMaW51eCAqLwogCXZvaWQJCQkqcHJpdjsKIAkvKi0tIGZpeGVkIGZpZWxkcyAtLS0tLS0tLS0tLSovCi0JVUlOVDY0CQkJKnRzOwotCVVJTlQxNgkJCSpiY25faW50OwotCVVJTlQxNgkJCSpjYXBfaW5mbzsKKwl1NjQJCQkqdHM7CisJdTE2CQkJKmJjbl9pbnQ7CisJdTE2CQkJKmNhcF9pbmZvOwogCS8qLS0gaW5mbyBlbGVtZW50cyAtLS0tLS0tLS0tKi8KIAl3bGFuX2llX3NzaWRfdAkJKnNzaWQ7CiAJd2xhbl9pZV9zdXBwX3JhdGVzX3QJKnN1cHBfcmF0ZXM7CkBAIC01MTEsMTYgKzUxMSwxNiBAQAogLyotLSBBdXRoZW50aWNhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHR5cGVkZWYgc3RydWN0IHdsYW5fZnJfYXV0aGVuCiB7Ci0JVUlOVDE2CQkJdHlwZTsKLQlVSU5UMTYJCQlsZW47Ci0JVUlOVDgJCQkqYnVmOworCXUxNgkJCXR5cGU7CisJdTE2CQkJbGVuOworCXU4CQkJKmJ1ZjsKIAlwODAyMTFfaGRyX3QJCSpoZHI7CiAJLyogdXNlZCBmb3IgdGFyZ2V0IHNwZWNpZmljIGRhdGEsIHNrYiBpbiBMaW51eCAqLwogCXZvaWQJCQkqcHJpdjsKIAkvKi0tIGZpeGVkIGZpZWxkcyAtLS0tLS0tLS0tLSovCi0JVUlOVDE2CQkJKmF1dGhfYWxnOwotCVVJTlQxNgkJCSphdXRoX3NlcTsKLQlVSU5UMTYJCQkqc3RhdHVzOworCXUxNgkJCSphdXRoX2FsZzsKKwl1MTYJCQkqYXV0aF9zZXE7CisJdTE2CQkJKnN0YXR1czsKIAkvKi0tIGluZm8gZWxlbWVudHMgLS0tLS0tLS0tLSovCiAJd2xhbl9pZV9jaGFsbGVuZ2VfdAkqY2hhbGxlbmdlOwogCkBAIC01MjksMTQgKzUyOSwxNCBAQAogLyotLSBEZWF1dGhlbmljYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogdHlwZWRlZiBzdHJ1Y3Qgd2xhbl9mcl9kZWF1dGhlbgogewotCVVJTlQxNgkJCXR5cGU7Ci0JVUlOVDE2CQkJbGVuOwotCVVJTlQ4CQkJKmJ1ZjsKKwl1MTYJCQl0eXBlOworCXUxNgkJCWxlbjsKKwl1OAkJCSpidWY7CiAJcDgwMjExX2hkcl90CQkqaGRyOwogCS8qIHVzZWQgZm9yIHRhcmdldCBzcGVjaWZpYyBkYXRhLCBza2IgaW4gTGludXggKi8KIAl2b2lkCQkJKnByaXY7CiAJLyotLSBmaXhlZCBmaWVsZHMgLS0tLS0tLS0tLS0qLwotCVVJTlQxNgkJCSpyZWFzb247CisJdTE2CQkJKnJlYXNvbjsKIAogCS8qLS0gaW5mbyBlbGVtZW50cyAtLS0tLS0tLS0tKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbW9kLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtb2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJjM2Y2My4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtb2QuYworKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vKiBzcmMvcDgwMjExL3A4MDIxMW1vZC5jCi0qCi0qIE1vZHVsZSBlbnRyeSBhbmQgZXhpdCBmb3IgcDgwMjExCi0qCi0qIENvcHlyaWdodCAoQykgMTk5OSBBYnNvbHV0ZVZhbHVlIFN5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qCi0qIGxpbnV4LXdsYW4KLSoKLSogICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYwotKiAgIExpY2Vuc2UgVmVyc2lvbiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCi0qCi0qICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTCi0qICAgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUKLSogICB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiAodGhlICJHUEwiKSwgaW4gd2hpY2gKLSogICBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZCBvZiB0aGUKLSogICBhYm92ZS4gIElmIHlvdSB3aXNoIHRvIGFsbG93IHRoZSB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZQotKiAgIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHUEwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8gdXNlCi0qICAgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uCi0qICAgYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKLSogICBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMLiAgSWYgeW91IGRvIG5vdCBkZWxldGUKLSogICB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcwotKiAgIGZpbGUgdW5kZXIgZWl0aGVyIHRoZSBNUEwgb3IgdGhlIEdQTC4KLSoKLSogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoKLSogSW5xdWlyaWVzIHJlZ2FyZGluZyB0aGUgbGludXgtd2xhbiBPcGVuIFNvdXJjZSBwcm9qZWN0IGNhbiBiZQotKiBtYWRlIGRpcmVjdGx5IHRvOgotKgotKiBBYnNvbHV0ZVZhbHVlIFN5c3RlbXMgSW5jLgotKiBpbmZvQGxpbnV4LXdsYW4uY29tCi0qIGh0dHA6Ly93d3cubGludXgtd2xhbi5jb20KLSoKLSogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoKLSogUG9ydGlvbnMgb2YgdGhlIGRldmVsb3BtZW50IG9mIHRoaXMgc29mdHdhcmUgd2VyZSBmdW5kZWQgYnkKLSogSW50ZXJzaWwgQ29ycG9yYXRpb24gYXMgcGFydCBvZiBQUklTTShSKSBjaGlwc2V0IHByb2R1Y3QgZGV2ZWxvcG1lbnQuCi0qCi0qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qCi0qIFRoaXMgZmlsZSBjb250YWlucyB0aGUgcDgwMjExLm8gZW50cnkgYW5kIGV4aXQgcG9pbnRzIGRlZmluZWQgZm9yIGxpbnV4Ci0qIGtlcm5lbCBtb2R1bGVzLgotKgotKiBOb3RlczoKLSogLSBhbGwgbW9kdWxlIHBhcmFtZXRlcnMgZm9yICBwODAyMTEubyBzaG91bGQgYmUgZGVmaW5lZCBoZXJlLgotKgotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIFN5c3RlbSBJbmNsdWRlcyAqLwotCi0KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNCwyNSkpCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0KLSNpbmNsdWRlICJ2ZXJzaW9uLmgiCi0jaW5jbHVkZSAid2xhbl9jb21wYXQuaCIKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIFByb2plY3QgSW5jbHVkZXMgKi8KLQotI2luY2x1ZGUgInA4MDIxMXR5cGVzLmgiCi0jaW5jbHVkZSAicDgwMjExaGRyLmgiCi0jaW5jbHVkZSAicDgwMjExbWdtdC5oIgotI2luY2x1ZGUgInA4MDIxMWNvbnYuaCIKLSNpbmNsdWRlICJwODAyMTFtc2cuaCIKLSNpbmNsdWRlICJwODAyMTFuZXRkZXYuaCIKLSNpbmNsdWRlICJwODAyMTFyZXEuaCIKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIExvY2FsIENvbnN0YW50cyAqLwotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBMb2NhbCBNYWNyb3MgKi8KLQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogTG9jYWwgVHlwZXMgKi8KLQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogTG9jYWwgU3RhdGljIERlZmluaXRpb25zICovCi0KLXN0YXRpYyBjaGFyICp2ZXJzaW9uID0gInA4MDIxMS5vOiAiIFdMQU5fUkVMRUFTRTsKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogLS1Nb2R1bGUgUGFyYW1ldGVycyAqLwotCi1pbnQgd2xhbl93YXRjaGRvZyA9IDUwMDA7Ci1tb2R1bGVfcGFyYW0od2xhbl93YXRjaGRvZywgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0Mod2xhbl93YXRjaGRvZywgInRyYW5zbWl0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIik7Ci0KLWludCB3bGFuX3dleHRfd3JpdGUgPSAwOwotI2lmIFdJUkVMRVNTX0VYVCA+IDEyCi1tb2R1bGVfcGFyYW0od2xhbl93ZXh0X3dyaXRlLCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyh3bGFuX3dleHRfd3JpdGUsICJlbmFibGUgd3JpdGUgd2lyZWxlc3MgZXh0ZW5zaW9ucyIpOwotI2VuZGlmCi0KLSNpZmRlZiBXTEFOX0lOQ0xVREVfREVCVUcKLWludCB3bGFuX2RlYnVnPTA7Ci1tb2R1bGVfcGFyYW0od2xhbl9kZWJ1ZywgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0Mod2xhbl9kZWJ1ZywgInA4MDIxMSBkZWJ1ZyBsZXZlbCIpOwotI2VuZGlmCi0KLU1PRFVMRV9MSUNFTlNFKCJEdWFsIE1QTC9HUEwiKTsKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIExvY2FsIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyAqLwotCi1pbnQJaW5pdF9tb2R1bGUodm9pZCk7Ci12b2lkCWNsZWFudXBfbW9kdWxlKHZvaWQpOwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogRnVuY3Rpb24gRGVmaW5pdGlvbnMgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGluaXRfbW9kdWxlCi0qCi0qIE1vZHVsZSBpbml0aWFsaXphdGlvbiByb3V0aW5lLCBjYWxsZWQgb25jZSBhdCBtb2R1bGUgbG9hZCB0aW1lLgotKgotKiBBcmd1bWVudHM6Ci0qCW5vbmUKLSoKLSogUmV0dXJuczoKLSoJMAktIHN1Y2Nlc3MKLSoJfjAJLSBmYWlsdXJlLCBtb2R1bGUgaXMgdW5sb2FkZWQuCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoJVE9ETzogZGVmaW5lCi0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQgKGluc21vZCBvciBtb2Rwcm9iZSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGluaXRfbW9kdWxlKHZvaWQpCi17Ci0gICAgICAgIERCRkVOVEVSOwotCi0jaWYgMAotICAgICAgICBwcmludGsoS0VSTl9OT1RJQ0UgIiVzICglcykgTG9hZGVkXG4iLCB2ZXJzaW9uLCBXTEFOX0JVSUxEX0RBVEUpOwotI2VuZGlmCi0KLQlwODAyMTFuZXRkZXZfc3RhcnR1cCgpOwotI2lmZGVmIENPTkZJR19IT1RQTFVHCi0JcDgwMjExX3J1bl9zYmluX2hvdHBsdWcoTlVMTCwgV0xBTl9IT1RQTFVHX1NUQVJUVVApOwotI2VuZGlmCi0KLSAgICAgICAgREJGRVhJVDsKLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIGNsZWFudXBfbW9kdWxlCi0qCi0qIENhbGxlZCBhdCBtb2R1bGUgdW5sb2FkIHRpbWUuICBUaGlzIGlzIG91ciBsYXN0IGNoYW5jZSB0bwotKiBjbGVhbiB1cCBhZnRlciBvdXJzZWx2ZXMuCi0qCi0qIEFyZ3VtZW50czoKLSoJbm9uZQotKgotKiBSZXR1cm5zOgotKglub3RoaW5nCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoJVE9ETzogZGVmaW5lCi0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQotewotICAgICAgICBEQkZFTlRFUjsKLQotI2lmZGVmIENPTkZJR19IT1RQTFVHCi0JcDgwMjExX3J1bl9zYmluX2hvdHBsdWcoTlVMTCwgV0xBTl9IT1RQTFVHX1NIVVRET1dOKTsKLSNlbmRpZgotCXA4MDIxMW5ldGRldl9zaHV0ZG93bigpOwotICAgICAgICBwcmludGsoS0VSTl9OT1RJQ0UgIiVzIFVubG9hZGVkXG4iLCB2ZXJzaW9uKTsKLQotICAgICAgICBEQkZFWElUOwotICAgICAgICByZXR1cm47Ci19Ci0KLUVYUE9SVF9TWU1CT0wocDgwMjExbmV0ZGV2X2h3cmVtb3ZlZCk7Ci1FWFBPUlRfU1lNQk9MKHJlZ2lzdGVyX3dsYW5kZXYpOwotRVhQT1JUX1NZTUJPTChwODAyMTFuZXRkZXZfcngpOwotRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX3dsYW5kZXYpOwotRVhQT1JUX1NZTUJPTCh3bGFuX3NldHVwKTsKLUVYUE9SVF9TWU1CT0wod2xhbl91bnNldHVwKTsKLUVYUE9SVF9TWU1CT0wocDgwMjExX3N1c3BlbmQpOwotRVhQT1JUX1NZTUJPTChwODAyMTFfcmVzdW1lKTsKLQotRVhQT1JUX1NZTUJPTChwODAyMTFza2JfZnJlZSk7Ci1FWFBPUlRfU1lNQk9MKHA4MDIxMXNrYl9yeG1ldGFfYXR0YWNoKTsKLQotRVhQT1JUX1NZTUJPTChwODAyMTF3ZXh0X2V2ZW50X2Fzc29jaWF0ZWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbXNnLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtc2cuaAppbmRleCBjMTRlOWZiLi4zYTU3NWQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtc2cuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtc2cuaApAQCAtNzgsMTcgKzc4LDE3IEBACiAKIHR5cGVkZWYgc3RydWN0IHA4MDIxMW1zZwogewotCVVJTlQzMgltc2djb2RlOwotCVVJTlQzMgltc2dsZW47Ci0JVUlOVDgJZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKKwl1MzIJbXNnY29kZTsKKwl1MzIJbXNnbGVuOworCXU4CWRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ190OwogCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFtc2dkCiB7Ci0JVUlOVDMyCW1zZ2NvZGU7Ci0JVUlOVDMyCW1zZ2xlbjsKLQlVSU5UOAlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdOwotCVVJTlQ4CWFyZ3NbMF07CisJdTMyCW1zZ2NvZGU7CisJdTMyCW1zZ2xlbjsKKwl1OAlkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdOworCXU4CWFyZ3NbMF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1zZ2RfdDsKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW5ldGRldi5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbmV0ZGV2LmMKaW5kZXggMmI3MDVlYS4uNTllNWFkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbmV0ZGV2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbmV0ZGV2LmMKQEAgLTc5LDE1ICs3OSwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KICNlbmRpZgogCi0jaWYgV0lSRUxFU1NfRVhUID4gMTIKICNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgotI2VuZGlmCiAjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qIFByb2plY3QgSW5jbHVkZXMgKi8KIAotI2luY2x1ZGUgInZlcnNpb24uaCIKICNpbmNsdWRlICJ3bGFuX2NvbXBhdC5oIgogI2luY2x1ZGUgInA4MDIxMXR5cGVzLmgiCiAjaW5jbHVkZSAicDgwMjExaGRyLmgiCkBAIC0xMTEsMTUgKzEwOCw2IEBACiAvKiBMb2NhbCBUeXBlcyAqLwogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogTG9jYWwgU3RhdGljIERlZmluaXRpb25zICovCi0KLSNkZWZpbmUgX19OT19WRVJTSU9OX18JCS8qIHByZXZlbnQgdGhlIHN0YXRpYyBkZWZpbml0aW9uICovCi0KLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqcHJvY19wODAyMTE7Ci0jZW5kaWYKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qIExvY2FsIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyAqLwogCiAvKiBTdXBwb3J0IGZ1bmN0aW9ucyAqLwpAQCAtMTM1LDc1ICsxMjMsMjYgQEAKIHN0YXRpYyBpbnQgcDgwMjExa25ldGRldl9kb19pb2N0bChuZXRkZXZpY2VfdCAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCk7CiBzdGF0aWMgaW50IHA4MDIxMWtuZXRkZXZfc2V0X21hY19hZGRyZXNzKG5ldGRldmljZV90ICpkZXYsIHZvaWQgKmFkZHIpOwogc3RhdGljIHZvaWQgcDgwMjExa25ldGRldl90eF90aW1lb3V0KG5ldGRldmljZV90ICpuZXRkZXYpOwotc3RhdGljIGludCBwODAyMTFfcnhfdHlwZWRyb3AoIHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgVUlOVDE2IGZjKTsKK3N0YXRpYyBpbnQgcDgwMjExX3J4X3R5cGVkcm9wKCB3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHUxNiBmYyk7CiAKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotc3RhdGljIGludAotcDgwMjExbmV0ZGV2X3Byb2NfcmVhZCgKLQljaGFyCSpwYWdlLAotCWNoYXIJKipzdGFydCwKLQlvZmZfdAlvZmZzZXQsCi0JaW50CWNvdW50LAotCWludAkqZW9mLAotCXZvaWQJKmRhdGEpOworaW50IHdsYW5fd2F0Y2hkb2cgPSA1MDAwOworbW9kdWxlX3BhcmFtKHdsYW5fd2F0Y2hkb2csIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHdsYW5fd2F0Y2hkb2csICJ0cmFuc21pdCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyIpOworCitpbnQgd2xhbl93ZXh0X3dyaXRlID0gMTsKK21vZHVsZV9wYXJhbSh3bGFuX3dleHRfd3JpdGUsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHdsYW5fd2V4dF93cml0ZSwgImVuYWJsZSB3cml0ZSB3aXJlbGVzcyBleHRlbnNpb25zIik7CisKKyNpZmRlZiBXTEFOX0lOQ0xVREVfREVCVUcKK2ludCB3bGFuX2RlYnVnPTA7Cittb2R1bGVfcGFyYW0od2xhbl9kZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0Mod2xhbl9kZWJ1ZywgInA4MDIxMSBkZWJ1ZyBsZXZlbCIpOwogI2VuZGlmCiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKiBGdW5jdGlvbiBEZWZpbml0aW9ucyAqLwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcDgwMjExa25ldGRldl9zdGFydHVwCi0qCi0qIEluaXRpYWxpemUgdGhlIHdsYW5kZXZpY2UvbmV0ZGV2aWNlIHBhcnQgb2YgODAyLjExIHNlcnZpY2VzIGF0Ci0qIGxvYWQgdGltZS4KLSoKLSogQXJndW1lbnRzOgotKglub25lCi0qCi0qIFJldHVybnM6Ci0qCW5vdGhpbmcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBwODAyMTFuZXRkZXZfc3RhcnR1cCh2b2lkKQotewotCURCRkVOVEVSOwotCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLQlpZiAoaW5pdF9uZXQucHJvY19uZXQgIT0gTlVMTCkgewotCQlwcm9jX3A4MDIxMSA9IGNyZWF0ZV9wcm9jX2VudHJ5KAotCQkJCSJwODAyMTEiLAotCQkJCShTX0lGRElSfFNfSVJVR098U19JWFVHTyksCi0JCQkJaW5pdF9uZXQucHJvY19uZXQpOwotCX0KLSNlbmRpZgotCURCRkVYSVQ7Ci0JcmV0dXJuOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcDgwMjExa25ldGRldl9zaHV0ZG93bgotKgotKiBTaHV0ZG93biB0aGUgd2xhbmRldmljZS9uZXRkZXZpY2UgcGFydCBvZiA4MDIuMTEgc2VydmljZXMgYXQKLSogdW5sb2FkIHRpbWUuCi0qCi0qIEFyZ3VtZW50czoKLSoJbm9uZQotKgotKiBSZXR1cm5zOgotKglub3RoaW5nCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQKLXA4MDIxMW5ldGRldl9zaHV0ZG93bih2b2lkKQotewotCURCRkVOVEVSOwotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0JaWYgKHByb2NfcDgwMjExICE9IE5VTEwpIHsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoInA4MDIxMSIsIGluaXRfbmV0LnByb2NfbmV0KTsKLQl9Ci0jZW5kaWYKLQlEQkZFWElUOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogcDgwMjExa25ldGRldl9pbml0CiAqCiAqIEluaXQgbWV0aG9kIGZvciBhIExpbnV4IG5ldGRldmljZS4gIENhbGxlZCBpbiByZXNwb25zZSB0bwpAQCAtMjg1LDEwICsyMjQsNyBAQAogCWlmICggd2xhbmRldi0+b3BlbiAhPSBOVUxMKSB7CiAJCXJlc3VsdCA9IHdsYW5kZXYtPm9wZW4od2xhbmRldik7CiAJCWlmICggcmVzdWx0ID09IDAgKSB7Ci0jaWYgKCBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDMsNDMpICkKLQkJCW5ldGRldi0+aW50ZXJydXB0ID0gMDsKLSNlbmRpZgotCQkJcDgwMjExbmV0ZGV2X3N0YXJ0X3F1ZXVlKHdsYW5kZXYpOworCQkJbmV0aWZfc3RhcnRfcXVldWUod2xhbmRldi0+bmV0ZGV2KTsKIAkJCXdsYW5kZXYtPnN0YXRlID0gV0xBTl9ERVZJQ0VfT1BFTjsKIAkJfQogCX0gZWxzZSB7CkBAIC0zMjMsNyArMjU5LDcgQEAKIAkJcmVzdWx0ID0gd2xhbmRldi0+Y2xvc2Uod2xhbmRldik7CiAJfQogCi0JcDgwMjExbmV0ZGV2X3N0b3BfcXVldWUod2xhbmRldik7CisJbmV0aWZfc3RvcF9xdWV1ZSh3bGFuZGV2LT5uZXRkZXYpOwogCXdsYW5kZXYtPnN0YXRlID0gV0xBTl9ERVZJQ0VfQ0xPU0VEOwogCiAJREJGRVhJVDsKQEAgLTM3Niw3ICszMTIsNyBAQAogCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOwogCW5ldGRldmljZV90ICAgICAqZGV2ID0gd2xhbmRldi0+bmV0ZGV2OwogCXA4MDIxMV9oZHJfYTNfdCAqaGRyOwotCVVJTlQxNiBmYzsKKwl1MTYgZmM7CiAKICAgICAgICAgREJGRU5URVI7CiAKQEAgLTQ3OCwxNSArNDE0LDYgQEAKIAltZW1zZXQoJnA4MDIxMV9oZHIsIDAsIHNpemVvZihwODAyMTFfaGRyX3QpKTsKIAltZW1zZXQoJnA4MDIxMV93ZXAsIDAsIHNpemVvZihwODAyMTFfbWV0YXdlcF90KSk7CiAKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwzLDM4KSApCi0JaWYgKCB0ZXN0X2FuZF9zZXRfYml0KDAsICh2b2lkKikmKG5ldGRldi0+dGJ1c3kpKSAhPSAwICkgewotCQkvKiBXZSd2ZSBiZWVuIGNhbGxlZCB3LyB0YnVzeSBzZXQsIGhhcyB0aGUgdHggKi8KLQkJLyogcGF0aCBzdGFsbGVkPyAgICovCi0JCVdMQU5fTE9HX0RFQlVHKDEsICJjYWxsZWQgd2hlbiB0YnVzeSBzZXRcbiIpOwotCQlyZXN1bHQgPSAxOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0jZWxzZQogCWlmICggbmV0aWZfcXVldWVfc3RvcHBlZChuZXRkZXYpICkgewogCQlXTEFOX0xPR19ERUJVRygxLCAiY2FsbGVkIHdoZW4gcXVldWUgc3RvcHBlZC5cbiIpOwogCQlyZXN1bHQgPSAxOwpAQCAtNDk1LDEyICs0MjIsNiBAQAogCiAJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOwogCi0JLyogTm8gdGltZW91dCBoYW5kbGluZyBoZXJlLCAyLjMuMzgrIGtlcm5lbHMgY2FsbCB0aGUKLQkgKiB0aW1lb3V0IGZ1bmN0aW9uIGRpcmVjdGx5LgotCSAqIFRPRE86IEFkZCB0aW1lb3V0IGhhbmRsaW5nLgotCSovCi0jZW5kaWYKLQogCS8qIENoZWNrIHRvIHNlZSB0aGF0IGEgdmFsaWQgbW9kZSBpcyBzZXQgKi8KIAlzd2l0Y2goIHdsYW5kZXYtPm1hY21vZGUgKSB7CiAJY2FzZSBXTEFOX01BQ01PREVfSUJTU19TVEE6CkBAIC01MTMsNyArNDM0LDcgQEAKIAkJICogVE9ETzogd2UgbmVlZCBhIHNhbmVyIHdheSB0byBoYW5kbGUgdGhpcwogCQkgKi8KIAkJaWYoc2tiLT5wcm90b2NvbCAhPSBFVEhfUF84MDIxMV9SQVcpIHsKLQkJCXA4MDIxMW5ldGRldl9zdGFydF9xdWV1ZSh3bGFuZGV2KTsKKwkJCW5ldGlmX3N0YXJ0X3F1ZXVlKHdsYW5kZXYtPm5ldGRldik7CiAJCQlXTEFOX0xPR19OT1RJQ0UoCiAJCQkJIlR4IGF0dGVtcHQgcHJpb3IgdG8gYXNzb2NpYXRpb24sIGZyYW1lIGRyb3BwZWQuXG4iKTsKIAkJCXdsYW5kZXYtPmxpbnV4X3N0YXRzLnR4X2Ryb3BwZWQrKzsKQEAgLTU1Nyw3ICs0NzgsNyBAQAogCWlmICggdHhyZXN1bHQgPT0gMCkgewogCQkvKiBzdWNjZXNzIGFuZCBtb3JlIGJ1ZiAqLwogCQkvKiBhdmFpbCwgcmU6IGh3X3R4ZGF0YSAqLwotCQlwODAyMTFuZXRkZXZfd2FrZV9xdWV1ZSh3bGFuZGV2KTsKKwkJbmV0aWZfd2FrZV9xdWV1ZSh3bGFuZGV2LT5uZXRkZXYpOwogCQlyZXN1bHQgPSAwOwogCX0gZWxzZSBpZiAoIHR4cmVzdWx0ID09IDEgKSB7CiAJCS8qIHN1Y2Nlc3MsIG5vIG1vcmUgYXZhaWwgKi8KQEAgLTYxOSw3ICs1NDAsNyBAQAogCiBzdGF0aWMgaW50IHA4MDIxMW5ldGRldl9ldGh0b29sKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCBfX3VzZXIgKnVzZXJhZGRyKQogewotCVVJTlQzMiBldGhjbWQ7CisJdTMyIGV0aGNtZDsKIAlzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvIGluZm87CiAJc3RydWN0IGV0aHRvb2xfdmFsdWUgZWRhdGE7CiAKQEAgLTY4Niw3ICs2MDcsNyBAQAogKgkJLUVGQVVMVCBtZW1vcnkgZmF1bHQgY29weWluZyBtc2cgZnJvbSB1c2VyIGJ1ZmZlcgogKgkJLUVOT01FTSB1bmFibGUgdG8gYWxsb2NhdGUga2VybmVsIG1zZyBidWZmZXIKICoJCS1FTk9TWVMJYmFkIG1hZ2ljLCBpdCB0aGUgY21kIHJlYWxseSBmb3IgdXM/Ci0qCQktRUlOVFIJc2xlZXBpbmcgb24gY21kLCBhd2FrZW5lZCBieSBzaWduYWwsIGNtZCBjYW5jZWxsZWQuCisqCQktRWludFIJc2xlZXBpbmcgb24gY21kLCBhd2FrZW5lZCBieSBzaWduYWwsIGNtZCBjYW5jZWxsZWQuCiAqCiAqIENhbGwgQ29udGV4dDoKICoJUHJvY2VzcyB0aHJlYWQgKGlvY3RsIGNhbGxlcikuICBUT0RPOiBTTVAgc3VwcG9ydCBtYXkgcmVxdWlyZQpAQCAtNjk3LDIxICs2MTgsMTEgQEAKIAlpbnQJCQlyZXN1bHQgPSAwOwogCXA4MDIxMWlvY3RsX3JlcV90CSpyZXEgPSAocDgwMjExaW9jdGxfcmVxX3QqKWlmcjsKIAl3bGFuZGV2aWNlX3QJCSp3bGFuZGV2ID0gZGV2LT5tbF9wcml2OwotCVVJTlQ4CQkJKm1zZ2J1ZjsKKwl1OAkJCSptc2didWY7CiAJREJGRU5URVI7CiAKIAlXTEFOX0xPR19ERUJVRygyLCAicngnZCBpb2N0bCwgY21kPSVkLCBsZW49JWRcbiIsIGNtZCwgcmVxLT5sZW4pOwogCi0jaWYgV0lSRUxFU1NfRVhUIDwgMTMKLQkvKiBJcyB0aGlzIGEgd2lyZWxlc3MgZXh0ZW5zaW9ucyBpb2N0bD8gKi8KLQlpZiAoKGNtZCA+PSBTSU9DSVdGSVJTVCkgJiYgKGNtZCA8PSBTSU9DSVdMQVNUKSkgewotCQlpZiAoKHJlc3VsdCA9IHA4MDIxMXdleHRfc3VwcG9ydF9pb2N0bChkZXYsIGlmciwgY21kKSkKLQkJICAgICE9ICgtRU9QTk9UU1VQUCkpIHsKLQkJCWdvdG8gYmFpbDsKLQkJfQotCX0KLSNlbmRpZgotCiAjaWZkZWYgU0lPQ0VUSFRPT0wKIAlpZiAoY21kID09IFNJT0NFVEhUT09MKSB7CiAJCXJlc3VsdCA9IHA4MDIxMW5ldGRldl9ldGh0b29sKHdsYW5kZXYsICh2b2lkIF9fdXNlciAqKSBpZnItPmlmcl9kYXRhKTsKQEAgLTc5MiwxNSArNzAzLDkgQEAKIAogCURCRkVOVEVSOwogCS8qIElmIHdlJ3JlIHJ1bm5pbmcsIHdlIGRvbid0IGFsbG93IE1BQyBhZGRyZXNzIGNoYW5nZXMgKi8KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwzLDM4KSApCi0JaWYgKCBkZXYtPnN0YXJ0KSB7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotI2Vsc2UKIAlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CiAJCXJldHVybiAtRUJVU1k7CiAJfQotI2VuZGlmCiAKIAkvKiBTZXQgdXAgc29tZSBjb252ZW5pZW5jZSBwb2ludGVycy4gKi8KIAltaWJhdHRyID0gJmRvdDExcmVxLm1pYmF0dHJpYnV0ZTsKQEAgLTgzMyw3ICs3MzgsNyBAQAogCXJlc3VsdGNvZGUtPmRhdGEgPSAwOwogCiAJLyogbm93IGZpcmUgdGhlIHJlcXVlc3QgKi8KLQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KGRldi0+bWxfcHJpdiwgKFVJTlQ4ICopJmRvdDExcmVxKTsKKwlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KGRldi0+bWxfcHJpdiwgKHU4ICopJmRvdDExcmVxKTsKIAogCS8qIElmIHRoZSByZXF1ZXN0IHdhc24ndCBzdWNjZXNzZnVsLCByZXBvcnQgYW4gZXJyb3IgYW5kIGRvbid0CiAJICogY2hhbmdlIHRoZSBuZXRkZXYgYWRkcmVzcwpAQCAtOTA5LDEzICs4MTQsMTEgQEAKIAkJICAgICAodW5zaWduZWQgbG9uZyl3bGFuZGV2KTsKIAogCS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBzdHJ1Y3QgZGV2aWNlICovCi0JZGV2ID0ga21hbGxvYyhzaXplb2YobmV0ZGV2aWNlX3QpLCBHRlBfQVRPTUlDKTsKKwlkZXYgPSBhbGxvY19uZXRkZXYoMCwid2xhbiVkIixldGhlcl9zZXR1cCk7CiAJaWYgKCBkZXYgPT0gTlVMTCApIHsKIAkJV0xBTl9MT0dfRVJST1IoIkZhaWxlZCB0byBhbGxvYyBuZXRkZXYuXG4iKTsKIAkJcmVzdWx0ID0gMTsKIAl9IGVsc2UgewotCQltZW1zZXQoIGRldiwgMCwgc2l6ZW9mKG5ldGRldmljZV90KSk7Ci0JCWV0aGVyX3NldHVwKGRldik7CiAJCXdsYW5kZXYtPm5ldGRldiA9IGRldjsKIAkJZGV2LT5tbF9wcml2ID0gd2xhbmRldjsKIAkJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPQlwODAyMTFrbmV0ZGV2X2hhcmRfc3RhcnRfeG1pdDsKQEAgLTkzMCwyMSArODMzLDEyIEBACiAJCWRldi0+b3BlbiA9CQlwODAyMTFrbmV0ZGV2X29wZW47CiAJCWRldi0+c3RvcCA9CQlwODAyMTFrbmV0ZGV2X3N0b3A7CiAKLSNpZmRlZiBDT05GSUdfTkVUX1dJUkVMRVNTCi0jaWYgKChXSVJFTEVTU19FWFQgPCAxNykgJiYgKFdJUkVMRVNTX0VYVCA8IDIxKSkKKyNpZiAoV0lSRUxFU1NfRVhUIDwgMjEpCiAJCWRldi0+Z2V0X3dpcmVsZXNzX3N0YXRzID0gcDgwMjExd2V4dF9nZXRfd2lyZWxlc3Nfc3RhdHM7CiAjZW5kaWYKLSNpZiBXSVJFTEVTU19FWFQgPiAxMgogCQlkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gJnA4MDIxMXdleHRfaGFuZGxlcl9kZWY7Ci0jZW5kaWYKLSNlbmRpZgogCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsMywzOCkgKQotCQlkZXYtPnRidXN5ID0gMTsKLQkJZGV2LT5zdGFydCA9IDA7Ci0jZWxzZQogCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7Ci0jZW5kaWYKICNpZmRlZiBIQVZFX0NIQU5HRV9NVFUKIAkJZGV2LT5jaGFuZ2VfbXR1ID0gd2xhbl9jaGFuZ2VfbXR1OwogI2VuZGlmCkBAIC0xMDI3LDQ0ICs5MjEsMTIgQEAKIGludCByZWdpc3Rlcl93bGFuZGV2KHdsYW5kZXZpY2VfdCAqd2xhbmRldikKIHsKIAlpbnQJCWkgPSAwOwotCW5ldGRldmljZV90CSpkZXYgPSB3bGFuZGV2LT5uZXRkZXY7CiAKIAlEQkZFTlRFUjsKIAotCWkgPSBkZXZfYWxsb2NfbmFtZSh3bGFuZGV2LT5uZXRkZXYsICJ3bGFuJWQiKTsKLQlpZiAoaSA+PSAwKSB7Ci0JCWkgPSByZWdpc3Rlcl9uZXRkZXYod2xhbmRldi0+bmV0ZGV2KTsKLQl9Ci0JaWYgKGkgIT0gMCkgewotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLSNpZiAoIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNCwwKSApCi0JZGV2LT5uYW1lID0gd2xhbmRldi0+bmFtZTsKLSNlbHNlCi0Jc3RyY3B5KHdsYW5kZXYtPm5hbWUsIGRldi0+bmFtZSk7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0JaWYgKHByb2NfcDgwMjExKSB7Ci0JCXdsYW5kZXYtPnByb2NkaXIgPSBwcm9jX21rZGlyKHdsYW5kZXYtPm5hbWUsIHByb2NfcDgwMjExKTsKLQkJaWYgKCB3bGFuZGV2LT5wcm9jZGlyICkKLQkJCXdsYW5kZXYtPnByb2N3bGFuZGV2ID0KLQkJCQljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJ3bGFuZGV2IiwgMCwKLQkJCQkJCSAgICAgICB3bGFuZGV2LT5wcm9jZGlyLAotCQkJCQkJICAgICAgIHA4MDIxMW5ldGRldl9wcm9jX3JlYWQsCi0JCQkJCQkgICAgICAgd2xhbmRldik7Ci0JCWlmICh3bGFuZGV2LT5uc2RfcHJvY19yZWFkKQotCQkJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgibnNkIiwgMCwKLQkJCQkJICAgICAgIHdsYW5kZXYtPnByb2NkaXIsCi0JCQkJCSAgICAgICB3bGFuZGV2LT5uc2RfcHJvY19yZWFkLAotCQkJCQkgICAgICAgd2xhbmRldik7Ci0JfQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfSE9UUExVRwotCXA4MDIxMV9ydW5fc2Jpbl9ob3RwbHVnKHdsYW5kZXYsIFdMQU5fSE9UUExVR19SRUdJU1RFUik7Ci0jZW5kaWYKKwlpID0gcmVnaXN0ZXJfbmV0ZGV2KHdsYW5kZXYtPm5ldGRldik7CisJaWYgKGkpCisJCXJldHVybiBpOwogCiAJREJGRVhJVDsKIAlyZXR1cm4gMDsKQEAgLTEwOTQsMjIgKzk1Niw2IEBACiAKIAlEQkZFTlRFUjsKIAotI2lmZGVmIENPTkZJR19IT1RQTFVHCi0JcDgwMjExX3J1bl9zYmluX2hvdHBsdWcod2xhbmRldiwgV0xBTl9IT1RQTFVHX1JFTU9WRSk7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0JaWYgKCB3bGFuZGV2LT5wcm9jd2xhbmRldiApIHsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoIndsYW5kZXYiLCB3bGFuZGV2LT5wcm9jZGlyKTsKLQl9Ci0JaWYgKCB3bGFuZGV2LT5uc2RfcHJvY19yZWFkICkgewotCQlyZW1vdmVfcHJvY19lbnRyeSgibnNkIiwgd2xhbmRldi0+cHJvY2Rpcik7Ci0JfQotCWlmICh3bGFuZGV2LT5wcm9jZGlyKSB7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KHdsYW5kZXYtPm5hbWUsIHByb2NfcDgwMjExKTsKLQl9Ci0jZW5kaWYKLQogCXVucmVnaXN0ZXJfbmV0ZGV2KHdsYW5kZXYtPm5ldGRldik7CiAKIAkvKiBOb3cgdG8gY2xlYW4gb3V0IHRoZSByeCBxdWV1ZSAqLwpAQCAtMTEyMSw3NiArOTY3LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJvY19yZWFkCi0qCi0qIFJlYWQgZnVuY3Rpb24gZm9yIC9wcm9jL25ldC9wODAyMTEvPGRldmljZT4vd2xhbmRldgotKgotKiBBcmd1bWVudHM6Ci0qCWJ1ZgotKglzdGFydAotKglvZmZzZXQKLSoJY291bnQKLSoJZW9mCi0qCWRhdGEKLSogUmV0dXJuczoKLSoJemVybyBvbiBzdWNjZXNzLCBub24temVybyBvdGhlcndpc2UuCi0qIENhbGwgQ29udGV4dDoKLSoJQ2FuIGJlIGVpdGhlciBpbnRlcnJ1cHQgb3Igbm90LgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50Ci1wODAyMTFuZXRkZXZfcHJvY19yZWFkKAotCWNoYXIJKnBhZ2UsCi0JY2hhcgkqKnN0YXJ0LAotCW9mZl90CW9mZnNldCwKLQlpbnQJY291bnQsCi0JaW50CSplb2YsCi0Jdm9pZAkqZGF0YSkKLXsKLQljaGFyCSAqcCA9IHBhZ2U7Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2ID0gKHdsYW5kZXZpY2VfdCAqKSBkYXRhOwotCi0JREJGRU5URVI7Ci0JaWYgKG9mZnNldCAhPSAwKSB7Ci0JCSplb2YgPSAxOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcCArPSBzcHJpbnRmKHAsICJwODAyMTEgdmVyc2lvbjogJXMgKCVzKVxuXG4iLAotCQkgICAgIFdMQU5fUkVMRUFTRSwgV0xBTl9CVUlMRF9EQVRFKTsKLQlwICs9IHNwcmludGYocCwgIm5hbWUgICAgICAgOiAlc1xuIiwgd2xhbmRldi0+bmFtZSk7Ci0JcCArPSBzcHJpbnRmKHAsICJuc2QgbmFtZSAgIDogJXNcbiIsIHdsYW5kZXYtPm5zZG5hbWUpOwotCXAgKz0gc3ByaW50ZihwLCAiYWRkcmVzcyAgICA6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotCQkgICAgIHdsYW5kZXYtPm5ldGRldi0+ZGV2X2FkZHJbMF0sIHdsYW5kZXYtPm5ldGRldi0+ZGV2X2FkZHJbMV0sIHdsYW5kZXYtPm5ldGRldi0+ZGV2X2FkZHJbMl0sCi0JCSAgICAgd2xhbmRldi0+bmV0ZGV2LT5kZXZfYWRkclszXSwgd2xhbmRldi0+bmV0ZGV2LT5kZXZfYWRkcls0XSwgd2xhbmRldi0+bmV0ZGV2LT5kZXZfYWRkcls1XSk7Ci0JcCArPSBzcHJpbnRmKHAsICJuc2QgY2FwcyAgIDogJXMlcyVzJXMlcyVzJXMlcyVzJXNcbiIsCi0JCSAgICAgKHdsYW5kZXYtPm5zZGNhcHMgJiBQODAyMTFfTlNEQ0FQX0hBUkRXQVJFV0VQKSA/ICJ3ZXBfaHcgIiA6ICIiLAotCQkgICAgICh3bGFuZGV2LT5uc2RjYXBzICYgUDgwMjExX05TRENBUF9USUVEV0VQKSA/ICJ3ZXBfdGllZCAiIDogIiIsCi0JCSAgICAgKHdsYW5kZXYtPm5zZGNhcHMgJiBQODAyMTFfTlNEQ0FQX05PSE9TVFdFUCkgPyAid2VwX2h3X29ubHkgIiA6ICIiLAotCQkgICAgICh3bGFuZGV2LT5uc2RjYXBzICYgUDgwMjExX05TRENBUF9QQkNDKSA/ICJwYmNjICIgOiAiIiwKLQkJICAgICAod2xhbmRldi0+bnNkY2FwcyAmIFA4MDIxMV9OU0RDQVBfU0hPUlRfUFJFQU1CTEUpID8gInNob3J0X3ByZWFtYmxlICIgOiAiIiwKLQkJICAgICAod2xhbmRldi0+bnNkY2FwcyAmIFA4MDIxMV9OU0RDQVBfQUdJTElUWSkgPyAiYWdpbGl0eSAiIDogIiIsCi0JCSAgICAgKHdsYW5kZXYtPm5zZGNhcHMgJiBQODAyMTFfTlNEQ0FQX0FQX1JFVFJBTlNNSVQpID8gImFwX3JldHJhbnNtaXQgIiA6ICIiLAotCQkgICAgICh3bGFuZGV2LT5uc2RjYXBzICYgUDgwMjExX05TRENBUF9IV0ZSQUdNRU5UKSA/ICJod19mcmFnICIgOiAiIiwKLQkJICAgICAod2xhbmRldi0+bnNkY2FwcyAmIFA4MDIxMV9OU0RDQVBfQVVUT0pPSU4pID8gImF1dG9qb2luICIgOiAiIiwKLQkJICAgICAod2xhbmRldi0+bnNkY2FwcyAmIFA4MDIxMV9OU0RDQVBfTk9TQ0FOKSA/ICIiIDogInNjYW4gIik7Ci0KLQotCXAgKz0gc3ByaW50ZihwLCAiYnNzaWQgICAgICA6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotCQkgICAgIHdsYW5kZXYtPmJzc2lkWzBdLCB3bGFuZGV2LT5ic3NpZFsxXSwgd2xhbmRldi0+YnNzaWRbMl0sCi0JCSAgICAgd2xhbmRldi0+YnNzaWRbM10sIHdsYW5kZXYtPmJzc2lkWzRdLCB3bGFuZGV2LT5ic3NpZFs1XSk7Ci0KLQlwICs9IHNwcmludGYocCwgIkVuYWJsZWQgICAgOiAlcyVzXG4iLAotCQkgICAgICh3bGFuZGV2LT5zaG9ydHByZWFtYmxlKSA/ICJzaG9ydF9wcmVhbWJsZSAiIDogIiIsCi0JCSAgICAgKHdsYW5kZXYtPmhvc3R3ZXAgJiBIT1NUV0VQX1BSSVZBQ1lJTlZPS0VEKSA/ICJwcml2YWN5IiA6ICIiKTsKLQotCi0gZXhpdDoKLQlEQkZFWElUOwotCXJldHVybiAocCAtIHBhZ2UpOwotfQotI2VuZGlmCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBwODAyMTFuZXRkZXZfaHdyZW1vdmVkCkBAIC0xMjI3LDcgKzEwMDMsNyBAQAogCURCRkVOVEVSOwogCXdsYW5kZXYtPmh3cmVtb3ZlZCA9IDE7CiAJaWYgKCB3bGFuZGV2LT5zdGF0ZSA9PSBXTEFOX0RFVklDRV9PUEVOKSB7Ci0JCXA4MDIxMW5ldGRldl9zdG9wX3F1ZXVlKHdsYW5kZXYpOworCQluZXRpZl9zdG9wX3F1ZXVlKHdsYW5kZXYtPm5ldGRldik7CiAJfQogCiAJbmV0aWZfZGV2aWNlX2RldGFjaCh3bGFuZGV2LT5uZXRkZXYpOwpAQCAtMTI1NywxMCArMTAzMywxMCBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCWludGVycnVwdAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50IHA4MDIxMV9yeF90eXBlZHJvcCggd2xhbmRldmljZV90ICp3bGFuZGV2LCBVSU5UMTYgZmMpCitzdGF0aWMgaW50IHA4MDIxMV9yeF90eXBlZHJvcCggd2xhbmRldmljZV90ICp3bGFuZGV2LCB1MTYgZmMpCiB7Ci0JVUlOVDE2CWZ0eXBlOwotCVVJTlQxNglmc3R5cGU7CisJdTE2CWZ0eXBlOworCXUxNglmc3R5cGU7CiAJaW50CWRyb3AgPSAwOwogCS8qIENsYXNzaWZ5IGZyYW1lLCBpbmNyZW1lbnQgY291bnRlciAqLwogCWZ0eXBlID0gV0xBTl9HRVRfRkNfRlRZUEUoZmMpOwpAQCAtMTQxNiw3NSArMTE5Miw2IEBACiAJcmV0dXJuIGRyb3A7CiB9CiAKLSNpZmRlZiBDT05GSUdfSE9UUExVRwotLyogTm90aWZ5IHVzZXJzcGFjZSB3aGVuIGEgbmV0ZGV2aWNlIGV2ZW50IG9jY3VycywKLSAqIGJ5IHJ1bm5pbmcgJy9zYmluL2hvdHBsdWcgbmV0JyB3aXRoIGNlcnRhaW4KLSAqIGVudmlyb25tZW50IHZhcmlhYmxlcyBzZXQuCi0gKi8KLWludCBwODAyMTFfcnVuX3NiaW5faG90cGx1Zyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIGNoYXIgKmFjdGlvbikKLXsKLSAgICAgICAgY2hhciAqYXJndlszXSwgKmVudnBbN10sIGlmbmFtZVsxMiArIElGTkFNU0laXSwgYWN0aW9uX3N0clszMl07Ci0JY2hhciBuc2RuYW1lWzMyXSwgd2xhbl93ZXh0WzMyXTsKLSAgICAgICAgaW50IGk7Ci0KLQlpZiAod2xhbmRldikgewotCQlzcHJpbnRmKGlmbmFtZSwgIklOVEVSRkFDRT0lcyIsIHdsYW5kZXYtPm5hbWUpOwotCQlzcHJpbnRmKG5zZG5hbWUsICJOU0ROQU1FPSVzIiwgd2xhbmRldi0+bnNkbmFtZSk7Ci0JfSBlbHNlIHsKLQkJc3ByaW50ZihpZm5hbWUsICJJTlRFUkZBQ0U9bnVsbCIpOwotCQlzcHJpbnRmKG5zZG5hbWUsICJOU0ROQU1FPW51bGwiKTsKLQl9Ci0KLQlzcHJpbnRmKHdsYW5fd2V4dCwgIldMQU5fV0VYVD0lcyIsIHdsYW5fd2V4dF93cml0ZSA/ICJ5IiA6ICIiKTsKLSAgICAgICAgc3ByaW50ZihhY3Rpb25fc3RyLCAiQUNUSU9OPSVzIiwgYWN0aW9uKTsKLQotICAgICAgICBpID0gMDsKLSAgICAgICAgYXJndltpKytdID0gaG90cGx1Z19wYXRoOwotICAgICAgICBhcmd2W2krK10gPSAid2xhbiI7Ci0gICAgICAgIGFyZ3ZbaV0gPSBOVUxMOwotCi0gICAgICAgIGkgPSAwOwotICAgICAgICAvKiBtaW5pbWFsIGNvbW1hbmQgZW52aXJvbm1lbnQgKi8KLSAgICAgICAgZW52cCBbaSsrXSA9ICJIT01FPS8iOwotICAgICAgICBlbnZwIFtpKytdID0gIlBBVEg9L3NiaW46L2JpbjovdXNyL3NiaW46L3Vzci9iaW4iOwotICAgICAgICBlbnZwIFtpKytdID0gaWZuYW1lOwotICAgICAgICBlbnZwIFtpKytdID0gYWN0aW9uX3N0cjsKLSAgICAgICAgZW52cCBbaSsrXSA9IG5zZG5hbWU7Ci0gICAgICAgIGVudnAgW2krK10gPSB3bGFuX3dleHQ7Ci0gICAgICAgIGVudnAgW2ldID0gTlVMTDsKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsNjIpKQotICAgICAgICByZXR1cm4gY2FsbF91c2VybW9kZWhlbHBlcihhcmd2IFswXSwgYXJndiwgZW52cCk7Ci0jZWxzZQotICAgICAgICByZXR1cm4gY2FsbF91c2VybW9kZWhlbHBlcihhcmd2IFswXSwgYXJndiwgZW52cCwgMCk7Ci0jZW5kaWYKLX0KLQotI2VuZGlmCi0KLQotdm9pZCAgICBwODAyMTFfc3VzcGVuZCh3bGFuZGV2aWNlX3QgKndsYW5kZXYpCi17Ci0JREJGRU5URVI7Ci0KLSNpZmRlZiBDT05GSUdfSE9UUExVRwotCXA4MDIxMV9ydW5fc2Jpbl9ob3RwbHVnKHdsYW5kZXYsIFdMQU5fSE9UUExVR19TVVNQRU5EKTsKLSNlbmRpZgotCi0JREJGRVhJVDsKLX0KLQotdm9pZCAgICBwODAyMTFfcmVzdW1lKHdsYW5kZXZpY2VfdCAqd2xhbmRldikKLXsKLQlEQkZFTlRFUjsKLQotI2lmZGVmIENPTkZJR19IT1RQTFVHCi0JcDgwMjExX3J1bl9zYmluX2hvdHBsdWcod2xhbmRldiwgV0xBTl9IT1RQTFVHX1JFU1VNRSk7Ci0jZW5kaWYKLQotCURCRkVYSVQ7Ci19Ci0KIHN0YXRpYyB2b2lkIHA4MDIxMWtuZXRkZXZfdHhfdGltZW91dCggbmV0ZGV2aWNlX3QgKm5ldGRldikKIHsKIAl3bGFuZGV2aWNlX3QJKndsYW5kZXYgPSBuZXRkZXYtPm1sX3ByaXY7CkBAIC0xNDk1LDcgKzEyMDIsNyBAQAogCX0gZWxzZSB7CiAJCVdMQU5fTE9HX1dBUk5JTkcoIkltcGxlbWVudCB0eF90aW1lb3V0IGZvciAlc1xuIiwKIAkJCQkgd2xhbmRldi0+bnNkbmFtZSk7Ci0JCXA4MDIxMW5ldGRldl93YWtlX3F1ZXVlKHdsYW5kZXYpOworCQluZXRpZl93YWtlX3F1ZXVlKHdsYW5kZXYtPm5ldGRldik7CiAJfQogCiAJREJGRVhJVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW5ldGRldi5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbmV0ZGV2LmgKaW5kZXggOWIyZTBjZC4uOTQwMTQ2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbmV0ZGV2LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbmV0ZGV2LmgKQEAgLTExMyw1NCArMTEzLDQ4IEBACiAvKiBSZWNlaXZlZCBmcmFtZSBzdGF0aXN0aWNzICovCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFfZnJtcnhfdAogewotCVVJTlQzMgltZ210OwotCVVJTlQzMglhc3NvY3JlcTsKLQlVSU5UMzIJYXNzb2NyZXNwOwotCVVJTlQzMglyZWFzc29jcmVxOwotCVVJTlQzMglyZWFzc29jcmVzcDsKLQlVSU5UMzIJcHJvYmVyZXE7Ci0JVUlOVDMyCXByb2JlcmVzcDsKLQlVSU5UMzIJYmVhY29uOwotCVVJTlQzMglhdGltOwotCVVJTlQzMglkaXNhc3NvYzsKLQlVSU5UMzIJYXV0aGVuOwotCVVJTlQzMglkZWF1dGhlbjsKLQlVSU5UMzIJbWdtdF91bmtub3duOwotCVVJTlQzMgljdGw7Ci0JVUlOVDMyCXBzcG9sbDsKLQlVSU5UMzIJcnRzOwotCVVJTlQzMgljdHM7Ci0JVUlOVDMyCWFjazsKLQlVSU5UMzIJY2ZlbmQ7Ci0JVUlOVDMyCWNmZW5kY2ZhY2s7Ci0JVUlOVDMyCWN0bF91bmtub3duOwotCVVJTlQzMglkYXRhOwotCVVJTlQzMglkYXRhb25seTsKLQlVSU5UMzIJZGF0YV9jZmFjazsKLQlVSU5UMzIJZGF0YV9jZnBvbGw7Ci0JVUlOVDMyCWRhdGFfX2NmYWNrX2NmcG9sbDsKLQlVSU5UMzIJbnVsbDsKLQlVSU5UMzIJY2ZhY2s7Ci0JVUlOVDMyCWNmcG9sbDsKLQlVSU5UMzIJY2ZhY2tfY2Zwb2xsOwotCVVJTlQzMglkYXRhX3Vua25vd247Ci0JVUlOVDMyICBkZWNyeXB0OwotCVVJTlQzMiAgZGVjcnlwdF9lcnI7CisJdTMyCW1nbXQ7CisJdTMyCWFzc29jcmVxOworCXUzMglhc3NvY3Jlc3A7CisJdTMyCXJlYXNzb2NyZXE7CisJdTMyCXJlYXNzb2NyZXNwOworCXUzMglwcm9iZXJlcTsKKwl1MzIJcHJvYmVyZXNwOworCXUzMgliZWFjb247CisJdTMyCWF0aW07CisJdTMyCWRpc2Fzc29jOworCXUzMglhdXRoZW47CisJdTMyCWRlYXV0aGVuOworCXUzMgltZ210X3Vua25vd247CisJdTMyCWN0bDsKKwl1MzIJcHNwb2xsOworCXUzMglydHM7CisJdTMyCWN0czsKKwl1MzIJYWNrOworCXUzMgljZmVuZDsKKwl1MzIJY2ZlbmRjZmFjazsKKwl1MzIJY3RsX3Vua25vd247CisJdTMyCWRhdGE7CisJdTMyCWRhdGFvbmx5OworCXUzMglkYXRhX2NmYWNrOworCXUzMglkYXRhX2NmcG9sbDsKKwl1MzIJZGF0YV9fY2ZhY2tfY2Zwb2xsOworCXUzMgludWxsOworCXUzMgljZmFjazsKKwl1MzIJY2Zwb2xsOworCXUzMgljZmFja19jZnBvbGw7CisJdTMyCWRhdGFfdW5rbm93bjsKKwl1MzIgIGRlY3J5cHQ7CisJdTMyICBkZWNyeXB0X2VycjsKIH0gcDgwMjExX2ZybXJ4X3Q7CiAKLSNpZmRlZiBXSVJFTEVTU19FWFQKIC8qIGNhbGxlZCBieSAvcHJvYy9uZXQvd2lyZWxlc3MgKi8KIHN0cnVjdCBpd19zdGF0aXN0aWNzKiBwODAyMTF3ZXh0X2dldF93aXJlbGVzc19zdGF0cyhuZXRkZXZpY2VfdCAqZGV2KTsKIC8qIHdpcmVsZXNzIGV4dGVuc2lvbnMnIGlvY3RscyAqLwogaW50IHA4MDIxMXdleHRfc3VwcG9ydF9pb2N0bChuZXRkZXZpY2VfdCAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCk7Ci0jaWYgV0lSRUxFU1NfRVhUID4gMTIKIGV4dGVybiBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgcDgwMjExd2V4dF9oYW5kbGVyX2RlZjsKLSNlbmRpZgotCiBpbnQgcDgwMjExd2V4dF9ldmVudF9hc3NvY2lhdGVkKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCBpbnQgYXNzb2MpOwogCi0jZW5kaWYgLyogd2lyZWxlc3MgZXh0ZW5zaW9ucyAqLwotCiAvKiBXRVAgc3R1ZmYgKi8KICNkZWZpbmUgTlVNX1dFUEtFWVMgNAogI2RlZmluZSBNQVhfS0VZTEVOIDMyCkBAIC0xODQsMTggKzE3OCwxOCBAQAogCWNoYXIJCW5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF07IC8qIERldiBuYW1lLCBmcm9tIHJlZ2lzdGVyX3dsYW5kZXYoKSovCiAJY2hhcgkJKm5zZG5hbWU7CiAKLQlVSU5UMzIgICAgICAgICAgc3RhdGU7ICAgICAgICAgIC8qIERldmljZSBJL0Ygc3RhdGUgKG9wZW4vY2xvc2VkKSAqLwotCVVJTlQzMgkJbXNkc3RhdGU7CS8qIHN0YXRlIG9mIHVuZGVybHlpbmcgZHJpdmVyICovCi0JVUlOVDMyCQlod3JlbW92ZWQ7CS8qIEhhcyB0aGUgaHcgYmVlbiB5YW5rZWQgb3V0PyAqLworCXUzMiAgICAgICAgICBzdGF0ZTsgICAgICAgICAgLyogRGV2aWNlIEkvRiBzdGF0ZSAob3Blbi9jbG9zZWQpICovCisJdTMyCQltc2RzdGF0ZTsJLyogc3RhdGUgb2YgdW5kZXJseWluZyBkcml2ZXIgKi8KKwl1MzIJCWh3cmVtb3ZlZDsJLyogSGFzIHRoZSBodyBiZWVuIHlhbmtlZCBvdXQ/ICovCiAKIAkvKiBIYXJkd2FyZSBjb25maWcgKi8KLQlVSU5UCQlpcnE7Ci0JVUlOVAkJaW9iYXNlOwotCVVJTlQJCW1lbWJhc2U7Ci0JVUlOVDMyICAgICAgICAgIG5zZGNhcHM7ICAvKiBOU0QgQ2FwYWJpbGl0aWVzIGZsYWdzICovCisJdW5zaWduZWQgaW50CQlpcnE7CisJdW5zaWduZWQgaW50CQlpb2Jhc2U7CisJdW5zaWduZWQgaW50CQltZW1iYXNlOworCXUzMiAgICAgICAgICBuc2RjYXBzOyAgLyogTlNEIENhcGFiaWxpdGllcyBmbGFncyAqLwogCiAJLyogQ29uZmlnIHZhcnMgKi8KLQlVSU5UCQlldGhjb252OworCXVuc2lnbmVkIGludAkJZXRoY29udjsKIAogCS8qIGRldmljZSBtZXRob2RzIChpbml0IGJ5IE1TRCwgdXNlZCBieSBwODAyMTEgKi8KIAlpbnQJCSgqb3Blbikoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpOwpAQCAtMjA3LDIwICsyMDEsMTUgQEAKIAkJCQkJICAgICAgbmV0ZGV2aWNlX3QgKmRldik7CiAJdm9pZAkJKCp0eF90aW1lb3V0KShzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldik7CiAKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotCWludCAgICAgICAgICAgICAoKm5zZF9wcm9jX3JlYWQpKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsIGludAkqZW9mLCB2b2lkICpkYXRhKTsKLSNlbmRpZgotCiAJLyogODAyLjExIFN0YXRlICovCi0JVUlOVDgJCWJzc2lkW1dMQU5fQlNTSURfTEVOXTsKKwl1OAkJYnNzaWRbV0xBTl9CU1NJRF9MRU5dOwogCXA4MDIxMXBzdHIzMl90CXNzaWQ7Ci0JVUlOVDMyCQltYWNtb2RlOworCXUzMgkJbWFjbW9kZTsKIAlpbnQgICAgICAgICAgICAgbGlua3N0YXR1czsKLQlpbnQgICAgICAgICAgICAgc2hvcnRwcmVhbWJsZTsgIC8qIEMgYm9vbCAqLwogCiAJLyogV0VQIFN0YXRlICovCi0JVUlOVDggd2VwX2tleXNbTlVNX1dFUEtFWVNdW01BWF9LRVlMRU5dOwotCVVJTlQ4IHdlcF9rZXlsZW5zW05VTV9XRVBLRVlTXTsKKwl1OCB3ZXBfa2V5c1tOVU1fV0VQS0VZU11bTUFYX0tFWUxFTl07CisJdTggd2VwX2tleWxlbnNbTlVNX1dFUEtFWVNdOwogCWludCAgIGhvc3R3ZXA7CiAKIAkvKiBSZXF1ZXN0L0NvbmZpcm0gaS9mIHN0YXRlICh1c2VkIGJ5IHA4MDIxMSkgKi8KQEAgLTIzMiwxMiArMjIxLDYgQEAKIAluZXRkZXZpY2VfdAkJKm5ldGRldjsJLyogcHRyIHRvIGxpbnV4IG5ldGRldmljZSAqLwogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIGxpbnV4X3N0YXRzOwogCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLQkvKiBQcm9jZnMgc3VwcG9ydCAqLwotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqcHJvY2RpcjsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkJKnByb2N3bGFuZGV2OwotI2VuZGlmCi0KIAkvKiBSeCBib3R0b20gaGFsZiAqLwogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAlyeF9iaDsKIApAQCAtMjQ2LDI5ICsyMjksMTggQEAKIAkvKiA4MDIuMTEgZGV2aWNlIHN0YXRpc3RpY3MgKi8KIAlzdHJ1Y3QgcDgwMjExX2ZybXJ4X3QJcng7CiAKLS8qIGNvbXBhdGliaWxpdHkgdG8gd2lyZWxlc3MgZXh0ZW5zaW9ucyAqLwotI2lmZGVmIFdJUkVMRVNTX0VYVAogCXN0cnVjdCBpd19zdGF0aXN0aWNzCXdzdGF0czsKIAogCS8qIGprcmllZ2w6IGl3c3B5IGZpZWxkcyAqLwotICAgICAgICBVSU5UOAkJCXNweV9udW1iZXI7CisgICAgICAgIHU4CQkJc3B5X251bWJlcjsKICAgICAgICAgY2hhcgkJCXNweV9hZGRyZXNzW0lXX01BWF9TUFldW0VUSF9BTEVOXTsKICAgICAgICAgc3RydWN0IGl3X3F1YWxpdHkgICAgICAgc3B5X3N0YXRbSVdfTUFYX1NQWV07Ci0KLSNlbmRpZgotCiB9IHdsYW5kZXZpY2VfdDsKIAogLyogV0VQIHN0dWZmICovCi1pbnQgd2VwX2NoYW5nZV9rZXkod2xhbmRldmljZV90ICp3bGFuZGV2LCBpbnQga2V5bnVtLCBVSU5UOCoga2V5LCBpbnQga2V5bGVuKTsKLWludCB3ZXBfZGVjcnlwdCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIFVJTlQ4ICpidWYsIFVJTlQzMiBsZW4sIGludCBrZXlfb3ZlcnJpZGUsIFVJTlQ4ICppdiwgVUlOVDggKmljdik7Ci1pbnQgd2VwX2VuY3J5cHQod2xhbmRldmljZV90ICp3bGFuZGV2LCBVSU5UOCAqYnVmLCBVSU5UOCAqZHN0LCBVSU5UMzIgbGVuLCBpbnQga2V5bnVtLCBVSU5UOCAqaXYsIFVJTlQ4ICppY3YpOwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogRXh0ZXJucyAqLwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogRnVuY3Rpb24gRGVjbGFyYXRpb25zICovCitpbnQgd2VwX2NoYW5nZV9rZXkod2xhbmRldmljZV90ICp3bGFuZGV2LCBpbnQga2V5bnVtLCB1OCoga2V5LCBpbnQga2V5bGVuKTsKK2ludCB3ZXBfZGVjcnlwdCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHU4ICpidWYsIHUzMiBsZW4sIGludCBrZXlfb3ZlcnJpZGUsIHU4ICppdiwgdTggKmljdik7CitpbnQgd2VwX2VuY3J5cHQod2xhbmRldmljZV90ICp3bGFuZGV2LCB1OCAqYnVmLCB1OCAqZHN0LCB1MzIgbGVuLCBpbnQga2V5bnVtLCB1OCAqaXYsIHU4ICppY3YpOwogCiB2b2lkCXA4MDIxMW5ldGRldl9zdGFydHVwKHZvaWQpOwogdm9pZAlwODAyMTFuZXRkZXZfc2h1dGRvd24odm9pZCk7CkBAIC0yNzgsNTkgKzI1MCw1IEBACiBpbnQJdW5yZWdpc3Rlcl93bGFuZGV2KHdsYW5kZXZpY2VfdCAqd2xhbmRldik7CiB2b2lkCXA4MDIxMW5ldGRldl9yeCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHN0cnVjdCBza19idWZmICpza2IpOwogdm9pZAlwODAyMTFuZXRkZXZfaHdyZW1vdmVkKHdsYW5kZXZpY2VfdCAqd2xhbmRldik7Ci12b2lkICAgIHA4MDIxMV9zdXNwZW5kKHdsYW5kZXZpY2VfdCAqd2xhbmRldik7Ci12b2lkICAgIHA4MDIxMV9yZXN1bWUod2xhbmRldmljZV90ICp3bGFuZGV2KTsKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIEZ1bmN0aW9uIERlZmluaXRpb25zICovCi0KLXN0YXRpYyBpbmxpbmUgdm9pZAotcDgwMjExbmV0ZGV2X3N0b3BfcXVldWUod2xhbmRldmljZV90ICp3bGFuZGV2KQotewotCWlmICggIXdsYW5kZXYgKSByZXR1cm47Ci0JaWYgKCAhd2xhbmRldi0+bmV0ZGV2ICkgcmV0dXJuOwotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDMsMzgpICkKLQl3bGFuZGV2LT5uZXRkZXYtPnRidXN5ID0gMTsKLQl3bGFuZGV2LT5uZXRkZXYtPnN0YXJ0ID0gMDsKLSNlbHNlCi0JbmV0aWZfc3RvcF9xdWV1ZSh3bGFuZGV2LT5uZXRkZXYpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotcDgwMjExbmV0ZGV2X3N0YXJ0X3F1ZXVlKHdsYW5kZXZpY2VfdCAqd2xhbmRldikKLXsKLQlpZiAoICF3bGFuZGV2ICkgcmV0dXJuOwotCWlmICggIXdsYW5kZXYtPm5ldGRldiApIHJldHVybjsKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwzLDM4KSApCi0Jd2xhbmRldi0+bmV0ZGV2LT50YnVzeSA9IDA7Ci0Jd2xhbmRldi0+bmV0ZGV2LT5zdGFydCA9IDE7Ci0jZWxzZQotCW5ldGlmX3N0YXJ0X3F1ZXVlKHdsYW5kZXYtPm5ldGRldik7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1wODAyMTFuZXRkZXZfd2FrZV9xdWV1ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYpCi17Ci0JaWYgKCAhd2xhbmRldiApIHJldHVybjsKLQlpZiAoICF3bGFuZGV2LT5uZXRkZXYgKSByZXR1cm47Ci0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsMywzOCkgKQotCXdsYW5kZXYtPm5ldGRldi0+dGJ1c3kgPSAwOwotCW1hcmtfYmgoTkVUX0JIKTsKLSNlbHNlCi0JbmV0aWZfd2FrZV9xdWV1ZSh3bGFuZGV2LT5uZXRkZXYpOwotI2VuZGlmCi19Ci0KLSNpZmRlZiBDT05GSUdfSE9UUExVRwotI2RlZmluZSBXTEFOX0hPVFBMVUdfUkVHSVNURVIgInJlZ2lzdGVyIgotI2RlZmluZSBXTEFOX0hPVFBMVUdfUkVNT1ZFICAgInJlbW92ZSIKLSNkZWZpbmUgV0xBTl9IT1RQTFVHX1NUQVJUVVAgICJzdGFydHVwIgotI2RlZmluZSBXTEFOX0hPVFBMVUdfU0hVVERPV04gInNodXRkb3duIgotI2RlZmluZSBXTEFOX0hPVFBMVUdfU1VTUEVORCAic3VzcGVuZCIKLSNkZWZpbmUgV0xBTl9IT1RQTFVHX1JFU1VNRSAicmVzdW1lIgotaW50IHA4MDIxMV9ydW5fc2Jpbl9ob3RwbHVnKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgY2hhciAqYWN0aW9uKTsKLSNlbmRpZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXJlcS5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExcmVxLmMKaW5kZXggMDIzM2FiZS4uNmUyMGJmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExcmVxLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExcmVxLmMKQEAgLTU0LDcgKzU0LDYgQEAKIC8qIFN5c3RlbSBJbmNsdWRlcyAqLwogCiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTY4LDcgKzY3LDYgQEAKICNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KIAotI2luY2x1ZGUgInZlcnNpb24uaCIKICNpbmNsdWRlICJ3bGFuX2NvbXBhdC5oIgogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpAQCAtMTI2LDcgKzEyNCw3IEBACiAqCVBvdGVudGlhbGx5IGJsb2NrcyB0aGUgY2FsbGVyLCBzbyBpdCdzIGEgZ29vZCBpZGVhIHRvCiAqCW5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gZnJvbSBhbiBpbnRlcnJ1cHQgY29udGV4dC4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHA4MDIxMXJlcV9kb3JlcXVlc3QoIHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgVUlOVDggKm1zZ2J1ZikKK2ludCBwODAyMTFyZXFfZG9yZXF1ZXN0KCB3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHU4ICptc2didWYpCiB7CiAJaW50CQlyZXN1bHQgPSAwOwogCXA4MDIxMW1zZ190CSptc2cgPSAocDgwMjExbXNnX3QqKW1zZ2J1ZjsKQEAgLTIyNCwzOCArMjIyLDExIEBACiB7CiAJcDgwMjExaXRlbWRfdCAgICptaWJpdGVtID0gKHA4MDIxMWl0ZW1kX3QgKikgbWliX21zZy0+bWliYXR0cmlidXRlLmRhdGE7CiAJcDgwMjExcHN0cmRfdCAgKnBzdHIgPSAocDgwMjExcHN0cmRfdCopIG1pYml0ZW0tPmRhdGE7Ci0JVUlOVDggKmtleSA9IG1pYml0ZW0tPmRhdGEgKyBzaXplb2YocDgwMjExcHN0cmRfdCk7CisJdTggKmtleSA9IG1pYml0ZW0tPmRhdGEgKyBzaXplb2YocDgwMjExcHN0cmRfdCk7CiAKIAlEQkZFTlRFUjsKIAogCXN3aXRjaCAobWliaXRlbS0+ZGlkKSB7Ci0JY2FzZSBESURtaWJfZG90MTFzbXRfcDgwMjExVGFibGVfcDgwMjExX2lmc3RhdGU6IHsKLQkJVUlOVDMyICpkYXRhID0gKFVJTlQzMiAqKSBtaWJpdGVtLT5kYXRhOwotCQlpZiAoaXNnZXQpCi0JCQlzd2l0Y2ggKHdsYW5kZXYtPm1zZHN0YXRlKSB7Ci0JCQljYXNlIFdMQU5fTVNEX0hXUFJFU0VOVDoKLQkJCQkqZGF0YSA9IFA4MDIxMUVOVU1faWZzdGF0ZV9kaXNhYmxlOwotCQkJCWJyZWFrOwotCQkJY2FzZSBXTEFOX01TRF9GV0xPQUQ6Ci0JCQkJKmRhdGEgPSBQODAyMTFFTlVNX2lmc3RhdGVfZndsb2FkOwotCQkJCWJyZWFrOwotCQkJY2FzZSBXTEFOX01TRF9SVU5OSU5HOgotCQkJCSpkYXRhID0gUDgwMjExRU5VTV9pZnN0YXRlX2VuYWJsZTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJKmRhdGEgPSBQODAyMTFFTlVNX2lmc3RhdGVfZW5hYmxlOwotCQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlPcGVyYXRpb25UYWJsZV9kb3QxMVNob3J0UHJlYW1ibGVFbmFibGVkOiB7Ci0JCVVJTlQzMiAqZGF0YSA9IChVSU5UMzIgKikgbWliaXRlbS0+ZGF0YTsKLQotCQlpZiAoaXNnZXQpCi0JCQkqZGF0YSA9IHdsYW5kZXYtPnNob3J0cHJlYW1ibGU7Ci0JCWVsc2UKLQkJCXdsYW5kZXYtPnNob3J0cHJlYW1ibGUgPSAqZGF0YTsKLQkJYnJlYWs7Ci0JfQogCWNhc2UgRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXkwOiB7CiAJCWlmICghaXNnZXQpCiAJCQl3ZXBfY2hhbmdlX2tleSh3bGFuZGV2LCAwLCBrZXksIHBzdHItPmxlbik7CkBAIC0yNzcsNyArMjQ4LDcgQEAKIAkJYnJlYWs7CiAJfQogCWNhc2UgRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlX2RvdDExV0VQRGVmYXVsdEtleUlEOiB7Ci0JCVVJTlQzMiAqZGF0YSA9IChVSU5UMzIgKikgbWliaXRlbS0+ZGF0YTsKKwkJdTMyICpkYXRhID0gKHUzMiAqKSBtaWJpdGVtLT5kYXRhOwogCiAJCWlmIChpc2dldCkgewogCQkJKmRhdGEgPSB3bGFuZGV2LT5ob3N0d2VwICYgSE9TVFdFUF9ERUZBVUxUS0VZX01BU0s7CkBAIC0yODksNyArMjYwLDcgQEAKIAkJYnJlYWs7CiAJfQogCWNhc2UgRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlX2RvdDExUHJpdmFjeUludm9rZWQ6IHsKLQkJVUlOVDMyICpkYXRhID0gKFVJTlQzMiAqKSBtaWJpdGVtLT5kYXRhOworCQl1MzIgKmRhdGEgPSAodTMyICopIG1pYml0ZW0tPmRhdGE7CiAKIAkJaWYgKGlzZ2V0KSB7CiAJCQlpZiAod2xhbmRldi0+aG9zdHdlcCAmIEhPU1RXRVBfUFJJVkFDWUlOVk9LRUQpCkBAIC0zMDQsNyArMjc1LDcgQEAKIAkJYnJlYWs7CiAJfQogCWNhc2UgRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlX2RvdDExRXhjbHVkZVVuZW5jcnlwdGVkOiB7Ci0JCVVJTlQzMiAqZGF0YSA9IChVSU5UMzIgKikgbWliaXRlbS0+ZGF0YTsKKwkJdTMyICpkYXRhID0gKHUzMiAqKSBtaWJpdGVtLT5kYXRhOwogCiAJCWlmIChpc2dldCkgewogCQkJaWYgKHdsYW5kZXYtPmhvc3R3ZXAgJiBIT1NUV0VQX0VYQ0xVREVVTkVOQ1JZUFRFRCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXJlcS5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExcmVxLmgKaW5kZXggNTRhYmRjZS4uNDk3YTRkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExcmVxLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExcmVxLmgKQEAgLTYzLDYgKzYzLDYgQEAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKiBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgKi8KIAotaW50CXA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldmljZV90ICp3bGFuZGV2LCBVSU5UOCAqbXNnYnVmKTsKK2ludAlwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdTggKm1zZ2J1Zik7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExdHlwZXMuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXR5cGVzLmgKaW5kZXggODExYjBjZS4uNWJlNjczNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExdHlwZXMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTF0eXBlcy5oCkBAIC04MCwxMyArODAsMTMgQEAKIAogI2RlZmluZSBQODAyMTFfVFlQRV9PQ1RFVFNUUgkJMQkvKiBwYXNjYWwgYXJyYXkgb2YgYnl0ZXMgKi8KICNkZWZpbmUgUDgwMjExX1RZUEVfRElTUExBWVNUUgkJMgkvKiBwYXNjYWwgYXJyYXkgb2YgYnl0ZXMgY29udGFpbmluZyBhc2NpaSAqLwotI2RlZmluZSBQODAyMTFfVFlQRV9JTlQJCQk0CS8qIFVJTlQzMiBtaW4gYW5kIG1heCBsaW1pdGVkIGJ5IDMyIGJpdHMgKi8KLSNkZWZpbmUgUDgwMjExX1RZUEVfRU5VTUlOVAkJNQkvKiBVSU5UMzIgaG9sZGluZyBhIG51bWVyaWMKKyNkZWZpbmUgUDgwMjExX1RZUEVfaW50CQkJNAkvKiB1MzIgbWluIGFuZCBtYXggbGltaXRlZCBieSAzMiBiaXRzICovCisjZGVmaW5lIFA4MDIxMV9UWVBFX0VOVU1pbnQJCTUJLyogdTMyIGhvbGRpbmcgYSBudW1lcmljCiAJCQkJCQkgICBjb2RlIHRoYXQgY2FuIGJlIG1hcHBlZAogCQkJCQkJICAgdG8gYSB0ZXh0dWFsIG5hbWUgKi8KICNkZWZpbmUgUDgwMjExX1RZUEVfVU5LREFUQQkJNgkvKiBEYXRhIGl0ZW0gY29udGFpbmluZyBhbgogCQkJCQkJICAgdW5rbm93biBkYXRhIHR5cGUgKi8KLSNkZWZpbmUgUDgwMjExX1RZUEVfSU5UQVJSQVkJCTcJLyogQXJyYXkgb2YgMzItYml0IGludGVnZXJzLiAqLworI2RlZmluZSBQODAyMTFfVFlQRV9pbnRBUlJBWQkJNwkvKiBBcnJheSBvZiAzMi1iaXQgaW50ZWdlcnMuICovCiAjZGVmaW5lIFA4MDIxMV9UWVBFX0JJVEFSUkFZCQk4CS8qIEFycmF5IG9mIGJpdHMuICovCiAjZGVmaW5lIFA4MDIxMV9UWVBFX01BQ0FSUkFZCQk5CS8qIEFycmF5IG9mIE1BQyBhZGRyZXNzZXMuICovCiAKQEAgLTI0Myw3ICsyNDMsNyBAQAogCQkJCQkvKiBpcyBhIERJRC1MRU4tREFUQSB0cmlwbGUgKi8KIAkJCQkJLyogd2l0aCBhIG1heCBzaXplIG9mIDQrNCszODQgKi8KIAotI2RlZmluZSBQODAyMTFfU0VUX0lOVChpdGVtLCB2YWx1ZSkgZG8geyBcCisjZGVmaW5lIFA4MDIxMV9TRVRfaW50KGl0ZW0sIHZhbHVlKSBkbyB7IFwKIAkoaXRlbSkuZGF0YSAgID0gKHZhbHVlKTsgXAogCShpdGVtKS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7IFwKIAl9IHdoaWxlKDApCkBAIC0yNzksOSArMjc5LDkgQEAKIAogI2RlZmluZSBQODAyMTFJVEVNX1NFVEZMQUdTKHEsIHIsIGMpCSggcSB8IHIgfCBjICkKIAotI2RlZmluZSBQODAyMTFJVEVNX0lTUkVRVUlSRUQoZmxhZ3MpCSgoKFVJTlQzMikoZmxhZ3MgJiBJU1JFUVVJUkVEKSkgPj4gMzEgKQotI2RlZmluZSBQODAyMTFJVEVNX0lTUkVRVUVTVChmbGFncykJKCgoVUlOVDMyKShmbGFncyAmIElTUkVRVUVTVCkpID4+IDMwICkKLSNkZWZpbmUgUDgwMjExSVRFTV9JU0NPTkZJUk0oZmxhZ3MpCSgoKFVJTlQzMikoZmxhZ3MgJiBJU0NPTkZJUk0pKSA+PiAyOSApCisjZGVmaW5lIFA4MDIxMUlURU1fSVNSRVFVSVJFRChmbGFncykJKCgodTMyKShmbGFncyAmIElTUkVRVUlSRUQpKSA+PiAzMSApCisjZGVmaW5lIFA4MDIxMUlURU1fSVNSRVFVRVNUKGZsYWdzKQkoKCh1MzIpKGZsYWdzICYgSVNSRVFVRVNUKSkgPj4gMzAgKQorI2RlZmluZSBQODAyMTFJVEVNX0lTQ09ORklSTShmbGFncykJKCgodTMyKShmbGFncyAmIElTQ09ORklSTSkpID4+IDI5ICkKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIFRoZSBmb2xsb3dpbmcgbWFjcm8gY3JlYXRlcyBhIG5hbWUgZm9yIGFuIGVudW0gKi8KQEAgLTMyMCw3ICszMjAsNyBAQAogI2RlZmluZSBQODAyMTFESURfTUFTS19BQ0NFU1MgCQkoMHgwMDAwMDAwM1VMKQogCiAKLSNkZWZpbmUgUDgwMjExRElEX01LKGEsbSxsKQkoKCgoVUlOVDMyKShhKSkgJiAobSkpIDw8IChsKSkKKyNkZWZpbmUgUDgwMjExRElEX01LKGEsbSxsKQkoKCgodTMyKShhKSkgJiAobSkpIDw8IChsKSkKIAogI2RlZmluZSBQODAyMTFESURfTUtTRUNUSU9OKGEpCVA4MDIxMURJRF9NSyhhLCBcCiAJCQkJCVA4MDIxMURJRF9NQVNLX1NFQ1RJT04sIFwKQEAgLTM0Nyw3ICszNDcsNyBAQAogCQkJCQkJKGEpICkKIAogCi0jZGVmaW5lIFA4MDIxMURJRF9HRVQoYSxtLGwpCSgoKChVSU5UMzIpKGEpKSA+PiAobCkpICYgKG0pKQorI2RlZmluZSBQODAyMTFESURfR0VUKGEsbSxsKQkoKCgodTMyKShhKSkgPj4gKGwpKSAmIChtKSkKIAogI2RlZmluZSBQODAyMTFESURfU0VDVElPTihhKQlQODAyMTFESURfR0VUKGEsIFwKIAkJCQkJUDgwMjExRElEX01BU0tfU0VDVElPTiwgXApAQCAtMzczLDE3ICszNzMsMTcgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIHR5cGVzIGFyZSB1c2VkIGZvciB0aGUgcmVwcmVzZW5hdGlvbiAqLwotLyogIG9mIEVOVU1JTlQgdHlwZSBtZXRhZGF0YS4gKi8KKy8qICBvZiBFTlVNaW50IHR5cGUgbWV0YWRhdGEuICovCiAKIHR5cGVkZWYgc3RydWN0IHA4MDIxMWVudW1wYWlyCiB7Ci0JVUlOVDMyCQkJdmFsOworCXUzMgkJCXZhbDsKIAljaGFyCQkJKm5hbWU7CiB9IHA4MDIxMWVudW1wYWlyX3Q7CiAKIHR5cGVkZWYgc3RydWN0IHA4MDIxMWVudW0KIHsKLQlJTlQJCQluaXRlbXM7CisJaW50CQkJbml0ZW1zOwogCXA4MDIxMWVudW1wYWlyX3QJKmxpc3Q7CiB9IHA4MDIxMWVudW1fdDsKIApAQCAtMzk0LDEzNyArMzk0LDEzNyBAQAogLyogVGVtcGxhdGUgcGFzY2FsIHN0cmluZyAqLwogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExcHN0cgogewotCVVJTlQ4CQlsZW47CisJdTgJCWxlbjsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExcHN0cl90OwogCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFwc3RyZAogewotCVVJTlQ4CQlsZW47Ci0JVUlOVDgJCWRhdGFbMF07CisJdTgJCWxlbjsKKwl1OAkJZGF0YVswXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExcHN0cmRfdDsKIAogLyogTWF4aW11bSBwYXNjYWwgc3RyaW5nICovCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFwc3RyMjU1CiB7Ci0JVUlOVDgJCWxlbjsKLQlVSU5UOAkJZGF0YVtNQVhMRU5fUFNUUjI1NV07CisJdTgJCWxlbjsKKwl1OAkJZGF0YVtNQVhMRU5fUFNUUjI1NV07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMXBzdHIyNTVfdDsKIAogLyogcGFzY2FsIHN0cmluZyBmb3IgbWFjYWRkcmVzcyBhbmQgYnNzaWQgKi8KIHR5cGVkZWYgc3RydWN0IHA4MDIxMXBzdHI2CiB7Ci0JVUlOVDgJCWxlbjsKLQlVSU5UOAkJZGF0YVtNQVhMRU5fUFNUUjZdOworCXU4CQlsZW47CisJdTgJCWRhdGFbTUFYTEVOX1BTVFI2XTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExcHN0cjZfdDsKIAogLyogcGFzY2FsIHN0cmluZyBmb3IgY2hhbm5lbCBsaXN0ICovCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFwc3RyMTQKIHsKLQlVSU5UOAkJbGVuOwotCVVJTlQ4CQlkYXRhW01BWExFTl9QU1RSMTRdOworCXU4CQlsZW47CisJdTgJCWRhdGFbTUFYTEVOX1BTVFIxNF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMXBzdHIxNF90OwogCiAvKiBwYXNjYWwgc3RyaW5nIGZvciBzc2lkICovCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFwc3RyMzIKIHsKLQlVSU5UOAkJbGVuOwotCVVJTlQ4CQlkYXRhW01BWExFTl9QU1RSMzJdOworCXU4CQlsZW47CisJdTgJCWRhdGFbTUFYTEVOX1BTVFIzMl07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMXBzdHIzMl90OwogCiAvKiBNQUMgYWRkcmVzcyBhcnJheSAqLwogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbWFjYXJyYXkKIHsKLQlVSU5UMzIJCWNudDsKLQlVSU5UOAkJZGF0YVsxXVtNQVhMRU5fUFNUUjZdOworCXUzMgkJY250OworCXU4CQlkYXRhWzFdW01BWExFTl9QU1RSNl07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMW1hY2FycmF5X3Q7CiAKIC8qIHByb3RvdHlwZSB0ZW1wbGF0ZSAqLwogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExaXRlbQogewotCVVJTlQzMgkJZGlkOwotCVVJTlQxNgkJc3RhdHVzOwotCVVJTlQxNgkJbGVuOworCXUzMgkJZGlkOworCXUxNgkJc3RhdHVzOworCXUxNgkJbGVuOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFpdGVtX3Q7CiAKIC8qIHByb3RvdHlwZSB0ZW1wbGF0ZSB3LyBkYXRhIGl0ZW0gKi8KIHR5cGVkZWYgc3RydWN0IHA4MDIxMWl0ZW1kCiB7Ci0JVUlOVDMyCQlkaWQ7Ci0JVUlOVDE2CQlzdGF0dXM7Ci0JVUlOVDE2CQlsZW47Ci0JVUlOVDgJCWRhdGFbMF07CisJdTMyCQlkaWQ7CisJdTE2CQlzdGF0dXM7CisJdTE2CQlsZW47CisJdTgJCWRhdGFbMF07CiB9IF9fV0xBTl9BVFRSSUJfUEFDS19fIHA4MDIxMWl0ZW1kX3Q7CiAKLS8qIG1lc3NhZ2UgZGF0YSBpdGVtIGZvciBJTlQsIEJPVU5ERURJTlQsIEVOVU1JTlQgKi8KKy8qIG1lc3NhZ2UgZGF0YSBpdGVtIGZvciBpbnQsIEJPVU5ERURJTlQsIEVOVU1JTlQgKi8KIHR5cGVkZWYgc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyCiB7Ci0JVUlOVDMyCQlkaWQ7Ci0JVUlOVDE2CQlzdGF0dXM7Ci0JVUlOVDE2CQlsZW47Ci0JVUlOVDMyCQlkYXRhOworCXUzMgkJZGlkOworCXUxNgkJc3RhdHVzOworCXUxNgkJbGVuOworCXUzMgkJZGF0YTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExaXRlbV91aW50MzJfdDsKIAogLyogbWVzc2FnZSBkYXRhIGl0ZW0gZm9yIE9DVEVUU1RSLCBESVNQTEFZU1RSICovCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFpdGVtX3BzdHI2CiB7Ci0JVUlOVDMyCQlkaWQ7Ci0JVUlOVDE2CQlzdGF0dXM7Ci0JVUlOVDE2CQlsZW47CisJdTMyCQlkaWQ7CisJdTE2CQlzdGF0dXM7CisJdTE2CQlsZW47CiAJcDgwMjExcHN0cjZfdAlkYXRhOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFpdGVtX3BzdHI2X3Q7CiAKIC8qIG1lc3NhZ2UgZGF0YSBpdGVtIGZvciBPQ1RFVFNUUiwgRElTUExBWVNUUiAqLwogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExaXRlbV9wc3RyMTQKIHsKLQlVSU5UMzIJCQlkaWQ7Ci0JVUlOVDE2CQkJc3RhdHVzOwotCVVJTlQxNgkJCWxlbjsKKwl1MzIJCQlkaWQ7CisJdTE2CQkJc3RhdHVzOworCXUxNgkJCWxlbjsKIAlwODAyMTFwc3RyMTRfdAkJZGF0YTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExaXRlbV9wc3RyMTRfdDsKIAogLyogbWVzc2FnZSBkYXRhIGl0ZW0gZm9yIE9DVEVUU1RSLCBESVNQTEFZU1RSICovCiB0eXBlZGVmIHN0cnVjdCBwODAyMTFpdGVtX3BzdHIzMgogewotCVVJTlQzMgkJCWRpZDsKLQlVSU5UMTYJCQlzdGF0dXM7Ci0JVUlOVDE2CQkJbGVuOworCXUzMgkJCWRpZDsKKwl1MTYJCQlzdGF0dXM7CisJdTE2CQkJbGVuOwogCXA4MDIxMXBzdHIzMl90CQlkYXRhOwogfSBfX1dMQU5fQVRUUklCX1BBQ0tfXyBwODAyMTFpdGVtX3BzdHIzMl90OwogCiAvKiBtZXNzYWdlIGRhdGEgaXRlbSBmb3IgT0NURVRTVFIsIERJU1BMQVlTVFIgKi8KIHR5cGVkZWYgc3RydWN0IHA4MDIxMWl0ZW1fcHN0cjI1NQogewotCVVJTlQzMgkJCWRpZDsKLQlVSU5UMTYJCQlzdGF0dXM7Ci0JVUlOVDE2CQkJbGVuOworCXUzMgkJCWRpZDsKKwl1MTYJCQlzdGF0dXM7CisJdTE2CQkJbGVuOwogCXA4MDIxMXBzdHIyNTVfdAkJZGF0YTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExaXRlbV9wc3RyMjU1X3Q7CiAKIC8qIG1lc3NhZ2UgZGF0YSBpdGVtIGZvciBVTksgMzkyLCBuYW1lbHkgbWliIGl0ZW1zICovCiB0eXBlZGVmIHN0cnVjdCAgcDgwMjExaXRlbV91bmszOTIKIHsKLQlVSU5UMzIJCWRpZDsKLQlVSU5UMTYJCXN0YXR1czsKLQlVSU5UMTYJCWxlbjsKLQlVSU5UOAkJZGF0YVtNQVhMRU5fTUlCQVRUUklCVVRFXTsKKwl1MzIJCWRpZDsKKwl1MTYJCXN0YXR1czsKKwl1MTYJCWxlbjsKKwl1OAkJZGF0YVtNQVhMRU5fTUlCQVRUUklCVVRFXTsKIH0gX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExaXRlbV91bmszOTJfdDsKIAogLyogbWVzc2FnZSBkYXRhIGl0ZW0gZm9yIFVOSyAxMDI1LCBuYW1lbHkgcDIgcGRhcyAqLwogdHlwZWRlZiBzdHJ1Y3QgIHA4MDIxMWl0ZW1fdW5rMTAyNAogewotCVVJTlQzMgkJZGlkOwotCVVJTlQxNgkJc3RhdHVzOwotCVVJTlQxNgkJbGVuOwotCVVJTlQ4CQlkYXRhWzEwMjRdOworCXUzMgkJZGlkOworCXUxNgkJc3RhdHVzOworCXUxNgkJbGVuOworCXU4CQlkYXRhWzEwMjRdOwogfSAgX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExaXRlbV91bmsxMDI0X3Q7CiAKIC8qIG1lc3NhZ2UgZGF0YSBpdGVtIGZvciBVTksgNDA5NiwgbmFtZWx5IHAyIGRvd25sb2FkIGNodW5rcyAqLwogdHlwZWRlZiBzdHJ1Y3QgIHA4MDIxMWl0ZW1fdW5rNDA5NgogewotCVVJTlQzMgkJZGlkOwotCVVJTlQxNgkJc3RhdHVzOwotCVVJTlQxNgkJbGVuOwotCVVJTlQ4CQlkYXRhWzQwOTZdOworCXUzMgkJZGlkOworCXUxNgkJc3RhdHVzOworCXUxNgkJbGVuOworCXU4CQlkYXRhWzQwOTZdOwogfSAgX19XTEFOX0FUVFJJQl9QQUNLX18gcDgwMjExaXRlbV91bms0MDk2X3Q7CiAKIHN0cnVjdCBjYXRsaXN0aXRlbTsKQEAgLTUzNCw5ICs1MzQsOSBAQAogLyogIG1ldGFkYXRhIGl0ZW1zLiAgU29tZSBjb21wb25lbnRzIG1heSBjaG9vc2UgdG8gdXNlIG1vcmUsICovCiAvKiAgbGVzcyBvciBkaWZmZXJlbnQgbWV0YWRhdGEgaXRlbXMuICovCiAKLXR5cGVkZWYgdm9pZCAoKnA4MDIxMV90b3RleHRfdCkoIHN0cnVjdCBjYXRsaXN0aXRlbSAqLCBVSU5UMzIgZGlkLCBVSU5UOCogaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1Zik7Ci10eXBlZGVmIHZvaWQgKCpwODAyMTFfZnJvbXRleHRfdCkoIHN0cnVjdCBjYXRsaXN0aXRlbSAqLCBVSU5UMzIgZGlkLCBVSU5UOCogaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1Zik7Ci10eXBlZGVmIFVJTlQzMiAoKnA4MDIxMV92YWxpZF90KSggc3RydWN0IGNhdGxpc3RpdGVtICosIFVJTlQzMiBkaWQsIFVJTlQ4KiBpdGVtYnVmKTsKK3R5cGVkZWYgdm9pZCAoKnA4MDIxMV90b3RleHRfdCkoIHN0cnVjdCBjYXRsaXN0aXRlbSAqLCB1MzIgZGlkLCB1OCogaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1Zik7Cit0eXBlZGVmIHZvaWQgKCpwODAyMTFfZnJvbXRleHRfdCkoIHN0cnVjdCBjYXRsaXN0aXRlbSAqLCB1MzIgZGlkLCB1OCogaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1Zik7Cit0eXBlZGVmIHUzMiAoKnA4MDIxMV92YWxpZF90KSggc3RydWN0IGNhdGxpc3RpdGVtICosIHUzMiBkaWQsIHU4KiBpdGVtYnVmKTsKIAogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpAQCAtNTc1LDggKzU3NSw4IEBACiAvKiBUaGUgZm9sbG93aW5nIGRlY2xhcmUgc29tZSB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgdXNlIHdpdGggdGhlICovCiAvKiAgcDgwMjExZW51bV90IHR5cGUuICovCiAKLVVJTlQzMiBwODAyMTFlbnVtX3RleHQyaW50KHA4MDIxMWVudW1fdCAqZXAsIGNoYXIgKnRleHQpOwotVUlOVDMyIHA4MDIxMWVudW1faW50MnRleHQocDgwMjExZW51bV90ICplcCwgVUlOVDMyIHZhbCwgY2hhciAqdGV4dCk7Cit1MzIgcDgwMjExZW51bV90ZXh0MmludChwODAyMTFlbnVtX3QgKmVwLCBjaGFyICp0ZXh0KTsKK3UzMiBwODAyMTFlbnVtX2ludDJ0ZXh0KHA4MDIxMWVudW1fdCAqZXAsIHUzMiB2YWwsIGNoYXIgKnRleHQpOwogdm9pZCBwODAyMTFfZXJyb3IydGV4dChpbnQgZXJyX2NvZGUsIGNoYXIgKmVycl9zdHIpOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtNTkxLDg1ICs1OTEsODUgQEAKIAogLyotLSBESVNQTEFZU1RSIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBwc3RyID09PiBjc3RyICovCi12b2lkIHA4MDIxMV90b3RleHRfZGlzcGxheXN0ciggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCwgVUlOVDggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKK3ZvaWQgcDgwMjExX3RvdGV4dF9kaXNwbGF5c3RyKCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCB1MzIgZGlkLCB1OCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOwogCiAvKiBjc3RyID09PiBwc3RyICovCi12b2lkIHA4MDIxMV9mcm9tdGV4dF9kaXNwbGF5c3RyKCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBVSU5UMzIgZGlkLCBVSU5UOCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOwordm9pZCBwODAyMTFfZnJvbXRleHRfZGlzcGxheXN0ciggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKIAogLyogZnVuY3Rpb24gdGhhdCBjaGVja3MgdmFsaWRpdHkgb2YgYSBkaXNwbGF5c3RyIGJpbmFyeSB2YWx1ZSAqLwotVUlOVDMyIHA4MDIxMV9pc3ZhbGlkX2Rpc3BsYXlzdHIoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQsIFVJTlQ4ICppdGVtYnVmICk7Cit1MzIgcDgwMjExX2lzdmFsaWRfZGlzcGxheXN0ciggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYgKTsKIAogLyotLSBPQ1RFVFNUUiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBwc3RyID09PiAieHg6eHg6Li4uLiIgKi8KLXZvaWQgcDgwMjExX3RvdGV4dF9vY3RldHN0ciggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCwgVUlOVDggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKK3ZvaWQgcDgwMjExX3RvdGV4dF9vY3RldHN0ciggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKIAogLyogInh4Onh4Oi4uLi4iID09PiBwc3RyICovCi12b2lkIHA4MDIxMV9mcm9tdGV4dF9vY3RldHN0ciggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCwgVUlOVDggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKK3ZvaWQgcDgwMjExX2Zyb210ZXh0X29jdGV0c3RyKCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCB1MzIgZGlkLCB1OCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOwogCiAvKiBmdW5jdGlvbiB0aGF0IGNoZWNrcyB2YWxpZGl0eSBvZiBhbiBvY3RldHN0ciBiaW5hcnkgdmFsdWUgKi8KLVVJTlQzMiBwODAyMTFfaXN2YWxpZF9vY3RldHN0ciggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCwgVUlOVDggKml0ZW1idWYgKTsKK3UzMiBwODAyMTFfaXN2YWxpZF9vY3RldHN0ciggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYgKTsKIAotLyotLSBJTlQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBVSU5UMzIgPT0+ICVkICovCi12b2lkIHA4MDIxMV90b3RleHRfaW50KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBVSU5UMzIgZGlkLCBVSU5UOCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOworLyotLSBpbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiB1MzIgPT0+ICVkICovCit2b2lkIHA4MDIxMV90b3RleHRfaW50KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCB1MzIgZGlkLCB1OCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOwogCi0vKiAlZCA9PT4gVUlOVDMyICovCi12b2lkIHA4MDIxMV9mcm9tdGV4dF9pbnQoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQsIFVJTlQ4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7CisvKiAlZCA9PT4gdTMyICovCit2b2lkIHA4MDIxMV9mcm9tdGV4dF9pbnQoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIHUzMiBkaWQsIHU4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7CiAKIC8qIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIHZhbGlkaXR5IG9mIGFuIGludCdzIGJpbmFyeSB2YWx1ZSAoYWx3YXlzIHN1Y2Nlc3NmdWwpICovCi1VSU5UMzIgcDgwMjExX2lzdmFsaWRfaW50KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBVSU5UMzIgZGlkLCBVSU5UOCAqaXRlbWJ1ZiApOwordTMyIHA4MDIxMV9pc3ZhbGlkX2ludCggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYgKTsKIAotLyotLSBFTlVNSU5UIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBVSU5UMzIgPT0+IDx2YWx1ZW5hbWU+ICovCi12b2lkIHA4MDIxMV90b3RleHRfZW51bWludCggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCwgVUlOVDggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKKy8qLS0gRU5VTWludCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogdTMyID09PiA8dmFsdWVuYW1lPiAqLwordm9pZCBwODAyMTFfdG90ZXh0X2VudW1pbnQoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIHUzMiBkaWQsIHU4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7CiAKLS8qIDx2YWx1ZW5hbWU+ID09PiBVSU5UMzIgKi8KLXZvaWQgcDgwMjExX2Zyb210ZXh0X2VudW1pbnQoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQsIFVJTlQ4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7CisvKiA8dmFsdWVuYW1lPiA9PT4gdTMyICovCit2b2lkIHA4MDIxMV9mcm9tdGV4dF9lbnVtaW50KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCB1MzIgZGlkLCB1OCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOwogCiAvKiBmdW5jdGlvbiB0aGF0IGNoZWNrcyB2YWxpZGl0eSBvZiBhbiBlbnVtJ3MgYmluYXJ5IHZhbHVlICovCi1VSU5UMzIgcDgwMjExX2lzdmFsaWRfZW51bWludCggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCwgVUlOVDggKml0ZW1idWYgKTsKK3UzMiBwODAyMTFfaXN2YWxpZF9lbnVtaW50KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCB1MzIgZGlkLCB1OCAqaXRlbWJ1ZiApOwogCi0vKi0tIElOVEFSUkFZIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIFVJTlQzMltdID0+ICVkLCVkLCVkLC4uLiAqLwotdm9pZCBwODAyMTFfdG90ZXh0X2ludGFycmF5KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBVSU5UMzIgZGlkLCBVSU5UOCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOworLyotLSBpbnRBUlJBWSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiB1MzJbXSA9PiAlZCwlZCwlZCwuLi4gKi8KK3ZvaWQgcDgwMjExX3RvdGV4dF9pbnRhcnJheSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKIAotLyogJWQsJWQsJWQsLi4uID09PiBVSU5UMzJbXSAqLwotdm9pZCBwODAyMTFfZnJvbXRleHRfaW50YXJyYXkoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQsIFVJTlQ4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7CisvKiAlZCwlZCwlZCwuLi4gPT0+IHUzMltdICovCit2b2lkIHA4MDIxMV9mcm9tdGV4dF9pbnRhcnJheSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKIAogLyogZnVuY3Rpb24gdGhhdCBjaGVja3MgdmFsaWRpdHkgb2YgYW4gaW50ZWdlciBhcnJheSdzIHZhbHVlICovCi1VSU5UMzIgcDgwMjExX2lzdmFsaWRfaW50YXJyYXkoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQsIFVJTlQ4ICppdGVtYnVmICk7Cit1MzIgcDgwMjExX2lzdmFsaWRfaW50YXJyYXkoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIHUzMiBkaWQsIHU4ICppdGVtYnVmICk7CiAKIC8qLS0gQklUQVJSQVkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogVUlOVDMyID09PiAlZCwlZCwlZCwuLi4gKi8KLXZvaWQgcDgwMjExX3RvdGV4dF9iaXRhcnJheSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCwgVUlOVDggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKKy8qIHUzMiA9PT4gJWQsJWQsJWQsLi4uICovCit2b2lkIHA4MDIxMV90b3RleHRfYml0YXJyYXkoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIHUzMiBkaWQsIHU4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7CiAKLS8qICVkLCVkLCVkLC4uLiA9PT4gVUlOVDMyICovCi12b2lkIHA4MDIxMV9mcm9tdGV4dF9iaXRhcnJheSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCwgVUlOVDggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKKy8qICVkLCVkLCVkLC4uLiA9PT4gdTMyICovCit2b2lkIHA4MDIxMV9mcm9tdGV4dF9iaXRhcnJheSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKIAogLyogZnVuY3Rpb24gdGhhdCBjaGVja3MgdmFsaWRpdHkgb2YgYSBiaXQgYXJyYXkncyB2YWx1ZSAqLwotVUlOVDMyIHA4MDIxMV9pc3ZhbGlkX2JpdGFycmF5KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBVSU5UMzIgZGlkLCBVSU5UOCAqaXRlbWJ1ZiApOwordTMyIHA4MDIxMV9pc3ZhbGlkX2JpdGFycmF5KCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCB1MzIgZGlkLCB1OCAqaXRlbWJ1ZiApOwogCiAvKi0tIE1BQ0FSUkFZIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgcDgwMjExX3RvdGV4dF9tYWNhcnJheSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCwgVUlOVDggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKK3ZvaWQgcDgwMjExX3RvdGV4dF9tYWNhcnJheSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKIAotdm9pZCBwODAyMTFfZnJvbXRleHRfbWFjYXJyYXkoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQsIFVJTlQ4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7Cit2b2lkIHA4MDIxMV9mcm9tdGV4dF9tYWNhcnJheSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKIAogLyogZnVuY3Rpb24gdGhhdCBjaGVja3MgdmFsaWRpdHkgb2YgYSBNQUMgYWRkcmVzcyBhcnJheSdzIHZhbHVlICovCi1VSU5UMzIgcDgwMjExX2lzdmFsaWRfbWFjYXJyYXkoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQsIFVJTlQ4ICppdGVtYnVmICk7Cit1MzIgcDgwMjExX2lzdmFsaWRfbWFjYXJyYXkoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIHUzMiBkaWQsIHU4ICppdGVtYnVmICk7CiAKIC8qLS0gTUlCQVRUUklVQlRFIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiA8bWlidmFsdWU+ID09PiA8dGV4dHVhbCByZXByZXNlbnRhdGlvbiBpZGVudGlmaWVkIGluIE1JQiBtZXRhZGF0YT4gKi8KLXZvaWQgcDgwMjExX3RvdGV4dF9nZXRtaWJhdHRyaWJ1dGUoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQsIFVJTlQ4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7Ci12b2lkIHA4MDIxMV90b3RleHRfc2V0bWliYXR0cmlidXRlKCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCBVSU5UMzIgZGlkLCBVSU5UOCAqaXRlbWJ1ZiwgY2hhciAqdGV4dGJ1ZiApOwordm9pZCBwODAyMTFfdG90ZXh0X2dldG1pYmF0dHJpYnV0ZSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYsIGNoYXIgKnRleHRidWYgKTsKK3ZvaWQgcDgwMjExX3RvdGV4dF9zZXRtaWJhdHRyaWJ1dGUoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIHUzMiBkaWQsIHU4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7CiAKIAogLyogPHRleHR1YWwgcmVwcmVzZW50YXRpb24gaWRlbnRpZmllZCBpbiBNSUIgbWV0YWRhdGE+ID09PiA8bWlidmFsdWU+ICovCi12b2lkIHA4MDIxMV9mcm9tdGV4dF9nZXRtaWJhdHRyaWJ1dGUoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQsIFVJTlQ4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7Ci12b2lkIHA4MDIxMV9mcm9tdGV4dF9zZXRtaWJhdHRyaWJ1dGUoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQsIFVJTlQ4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7Cit2b2lkIHA4MDIxMV9mcm9tdGV4dF9nZXRtaWJhdHRyaWJ1dGUoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIHUzMiBkaWQsIHU4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7Cit2b2lkIHA4MDIxMV9mcm9tdGV4dF9zZXRtaWJhdHRyaWJ1dGUoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIHUzMiBkaWQsIHU4ICppdGVtYnVmLCBjaGFyICp0ZXh0YnVmICk7CiAKIC8qIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIHZhbGlkaXR5IG9mIGEgbWliaXRlbSdzIGJpbmFyeSB2YWx1ZSAqLwotVUlOVDMyIHA4MDIxMV9pc3ZhbGlkX2dldG1pYmF0dHJpYnV0ZSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgVUlOVDMyIGRpZCwgVUlOVDggKml0ZW1idWYgKTsKLVVJTlQzMiBwODAyMTFfaXN2YWxpZF9zZXRtaWJhdHRyaWJ1dGUoIHN0cnVjdCBjYXRsaXN0aXRlbSAqbWV0YWxpc3QsIFVJTlQzMiBkaWQsIFVJTlQ4ICppdGVtYnVmICk7Cit1MzIgcDgwMjExX2lzdmFsaWRfZ2V0bWliYXR0cmlidXRlKCBzdHJ1Y3QgY2F0bGlzdGl0ZW0gKm1ldGFsaXN0LCB1MzIgZGlkLCB1OCAqaXRlbWJ1ZiApOwordTMyIHA4MDIxMV9pc3ZhbGlkX3NldG1pYmF0dHJpYnV0ZSggc3RydWN0IGNhdGxpc3RpdGVtICptZXRhbGlzdCwgdTMyIGRpZCwgdTggKml0ZW1idWYgKTsKIAogI2VuZGlmIC8qIF9QODAyMTFUWVBFU19IICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXdlcC5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExd2VwLmMKaW5kZXggMTFhNTBjNy4uNDZhMmE2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExd2VwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExd2VwLmMKQEAgLTU2LDcgKzU2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAKLSNpbmNsdWRlICJ2ZXJzaW9uLmgiCiAjaW5jbHVkZSAid2xhbl9jb21wYXQuaCIKIAogLy8gI2RlZmluZSBXRVBfREVCVUcKQEAgLTczLDcgKzcyLDcgQEAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKiBMb2NhbCBDb25zdGFudHMgKi8KIAotI2RlZmluZSBTU1dBUChhLGIpIHtVSU5UOCB0bXAgPSBzW2FdOyBzW2FdID0gc1tiXTsgc1tiXSA9IHRtcDt9CisjZGVmaW5lIFNTV0FQKGEsYikge3U4IHRtcCA9IHNbYV07IHNbYV0gPSBzW2JdOyBzW2JdID0gdG1wO30KICNkZWZpbmUgV0VQX0tFWSh4KSAgICAgICAoKCh4KSAmIDB4QzApID4+IDYpCiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCkBAIC04Nyw3ICs4Niw3IEBACiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyogTG9jYWwgU3RhdGljIERlZmluaXRpb25zICovCiAKLXN0YXRpYyBjb25zdCBVSU5UMzIgd2VwX2NyYzMyX3RhYmxlWzI1Nl0gPSB7CitzdGF0aWMgY29uc3QgdTMyIHdlcF9jcmMzMl90YWJsZVsyNTZdID0gewogICAgICAgICAweDAwMDAwMDAwTCwgMHg3NzA3MzA5NkwsIDB4ZWUwZTYxMmNMLCAweDk5MDk1MWJhTCwgMHgwNzZkYzQxOUwsCiAgICAgICAgIDB4NzA2YWY0OGZMLCAweGU5NjNhNTM1TCwgMHg5ZTY0OTVhM0wsIDB4MGVkYjg4MzJMLCAweDc5ZGNiOGE0TCwKICAgICAgICAgMHhlMGQ1ZTkxZUwsIDB4OTdkMmQ5ODhMLCAweDA5YjY0YzJiTCwgMHg3ZWIxN2NiZEwsIDB4ZTdiODJkMDdMLApAQCAtMTUwLDcgKzE0OSw3IEBACiAKIC8qIGtleWxlbiBpbiBieXRlcyEgKi8KIAotaW50IHdlcF9jaGFuZ2Vfa2V5KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgaW50IGtleW51bSwgVUlOVDgqIGtleSwgaW50IGtleWxlbikKK2ludCB3ZXBfY2hhbmdlX2tleSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIGludCBrZXludW0sIHU4KiBrZXksIGludCBrZXlsZW4pCiB7CiAJaWYgKGtleWxlbiA8IDApICByZXR1cm4gLTE7CiAJaWYgKGtleWxlbiA+PSBNQVhfS0VZTEVOKSByZXR1cm4gLTE7CkBAIC0xNzMsMTEgKzE3MiwxMSBAQAogICA0LWJ5dGUgSVYgYXQgc3RhcnQgb2YgYnVmZmVyLCA0LWJ5dGUgSUNWIGF0IGVuZCBvZiBidWZmZXIuCiAgIGlmIHN1Y2Nlc3NmdWwsIGJ1ZiBzdGFydCBpcyBwYXlsb2FkIGJlZ2luLCBsZW5ndGggLT0gODsKICAqLwotaW50IHdlcF9kZWNyeXB0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgVUlOVDggKmJ1ZiwgVUlOVDMyIGxlbiwgaW50IGtleV9vdmVycmlkZSwgVUlOVDggKml2LCBVSU5UOCAqaWN2KQoraW50IHdlcF9kZWNyeXB0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdTggKmJ1ZiwgdTMyIGxlbiwgaW50IGtleV9vdmVycmlkZSwgdTggKml2LCB1OCAqaWN2KQogewotCVVJTlQzMiBpLCBqLCBrLCBjcmMsIGtleWxlbjsKLQlVSU5UOCBzWzI1Nl0sIGtleVs2NF0sIGNfY3JjWzRdOwotCVVJTlQ4IGtleWlkeDsKKwl1MzIgaSwgaiwgaywgY3JjLCBrZXlsZW47CisJdTggc1syNTZdLCBrZXlbNjRdLCBjX2NyY1s0XTsKKwl1OCBrZXlpZHg7CiAKIAkvKiBOZWVkcyB0byBiZSBhdCBsZWFzdCA4IGJ5dGVzIG9mIHBheWxvYWQgKi8KIAlpZiAobGVuIDw9IDApIHJldHVybiAtMTsKQEAgLTI0NSwxMCArMjQ0LDEwIEBACiB9CiAKIC8qIGVuY3J5cHRzIGluLXBsYWNlLiAqLwotaW50IHdlcF9lbmNyeXB0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgVUlOVDggKmJ1ZiwgVUlOVDggKmRzdCwgVUlOVDMyIGxlbiwgaW50IGtleW51bSwgVUlOVDggKml2LCBVSU5UOCAqaWN2KQoraW50IHdlcF9lbmNyeXB0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdTggKmJ1ZiwgdTggKmRzdCwgdTMyIGxlbiwgaW50IGtleW51bSwgdTggKml2LCB1OCAqaWN2KQogewotCVVJTlQzMiBpLCBqLCBrLCBjcmMsIGtleWxlbjsKLQlVSU5UOCBzWzI1Nl0sIGtleVs2NF07CisJdTMyIGksIGosIGssIGNyYywga2V5bGVuOworCXU4IHNbMjU2XSwga2V5WzY0XTsKIAogCS8qIG5vIHBvaW50IGluIFdFUHBpbmcgYW4gZW1wdHkgZnJhbWUgKi8KIAlpZiAobGVuIDw9IDApIHJldHVybiAtMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXdleHQuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXdleHQuYwppbmRleCBiMmM5ZWEyLi4wZDU3MGYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTF3ZXh0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExd2V4dC5jCkBAIC0zOCw3ICszOCw2IEBACiAvKiBTeXN0ZW0gSW5jbHVkZXMgKi8KIAogCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KQEAgLTQ3LDkgKzQ2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+Ci0jaWYgV0lSRUxFU1NfRVhUID4gMTIKICNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgotI2VuZGlmCiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC01OCw3ICs1NSw2IEBACiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyogUHJvamVjdCBJbmNsdWRlcyAqLwogCi0jaW5jbHVkZSAidmVyc2lvbi5oIgogI2luY2x1ZGUgIndsYW5fY29tcGF0LmgiCiAKICNpbmNsdWRlICJwODAyMTF0eXBlcy5oIgpAQCAtNzgsMTAgKzc0LDggQEAKIHN0YXRpYyBpbnQgcDgwMjExd2V4dF9naXdlc3NpZChuZXRkZXZpY2VfdCAqZGV2LAogCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCQkgICAgICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICplc3NpZCk7Ci0vKiBjb21wYXRpYmlsaXR5IHRvIHdpcmVsZXNzIGV4dGVuc2lvbnMgKi8KLSNpZmRlZiBXSVJFTEVTU19FWFQKIAotc3RhdGljIFVJTlQ4IHA4MDIxMV9taHpfdG9fY2hhbm5lbChVSU5UMTYgbWh6KQorc3RhdGljIHU4IHA4MDIxMV9taHpfdG9fY2hhbm5lbCh1MTYgbWh6KQogewogCWlmIChtaHogPj0gNTAwMCkgewogCQlyZXR1cm4gKChtaHogLSA1MDAwKSAvIDUpOwpAQCAtOTcsNyArOTEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgVUlOVDE2IHA4MDIxMV9jaGFubmVsX3RvX21oeihVSU5UOCBjaCwgaW50IGRvdDExYSkKK3N0YXRpYyB1MTYgcDgwMjExX2NoYW5uZWxfdG9fbWh6KHU4IGNoLCBpbnQgZG90MTFhKQogewogCiAJaWYgKGNoID09IDApCkBAIC0xMjgsNyArMTIyLDcgQEAKIAkyNDEyLCAyNDE3LCAyNDIyLCAyNDI3LCAyNDMyLCAyNDM3LCAyNDQyLAogCTI0NDcsIDI0NTIsIDI0NTcsIDI0NjIsIDI0NjcsIDI0NzIsIDI0ODQKIH07Ci0jZGVmaW5lIE5VTV9DSEFOTkVMUyAoc2l6ZW9mKHA4MDIxMXdleHRfY2hhbm5lbF9mcmVxKSAvIHNpemVvZihwODAyMTF3ZXh0X2NoYW5uZWxfZnJlcVswXSkpCisjZGVmaW5lIE5VTV9DSEFOTkVMUyBBUlJBWV9TSVpFKHA4MDIxMXdleHRfY2hhbm5lbF9mcmVxKQogCiAvKiBzdGVhbCBhIHNwYXJlIGJpdCB0byBzdG9yZSB0aGUgc2hhcmVkL29wZW5zeXN0ZW1zIHN0YXRlLiBzaG91bGQgZGVmYXVsdCB0byBvcGVuIGlmIG5vdCBzZXQgKi8KICNkZWZpbmUgSE9TVFdFUF9TSEFSRURLRVkgQklUMwpAQCAtMTQ3LDcgKzE0MSw3IEBACiAKIAogCi1zdGF0aWMgaW50IHA4MDIxMXdleHRfZG9yZXF1ZXN0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgVUlOVDMyIGRpZCwgVUlOVDMyIGRhdGEpCitzdGF0aWMgaW50IHA4MDIxMXdleHRfZG9yZXF1ZXN0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdTMyIGRpZCwgdTMyIGRhdGEpCiB7CiAJcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90CW1zZzsKIAlwODAyMTFpdGVtX3VpbnQzMl90CQltaWJpdGVtOwpAQCAtMTU5LDcgKzE1Myw3IEBACiAJbWliaXRlbS5kaWQgPSBkaWQ7CiAJbWliaXRlbS5kYXRhID0gZGF0YTsKIAltZW1jcHkoJm1zZy5taWJhdHRyaWJ1dGUuZGF0YSwgJm1pYml0ZW0sIHNpemVvZihtaWJpdGVtKSk7Ci0JcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAoVUlOVDgqKSZtc2cpOworCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4KikmbXNnKTsKIAogCURCRkVYSVQ7CiAJcmV0dXJuIHJlc3VsdDsKQEAgLTIwMCw3ICsxOTQsNyBAQAogCW1lbWNweShtc2cuc3NpZC5kYXRhLmRhdGEsIHNzaWQsIGRhdGEubGVuZ3RoKTsKIAltc2cuc3NpZC5kYXRhLmxlbiA9IGRhdGEubGVuZ3RoOwogCi0JcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAoVUlOVDgqKSZtc2cpOworCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4KikmbXNnKTsKIAogCWlmIChyZXN1bHQpIHsKIAkJZXJyID0gLUVGQVVMVDsKQEAgLTI0NSwyMCArMjM5LDE0IEBACiAJd3N0YXRzLT5xdWFsLmxldmVsID0gcXVhbGl0eS5sZXZlbC5kYXRhOyAgLyogaW5zdGFudCBzaWduYWwgbGV2ZWwgKi8KIAl3c3RhdHMtPnF1YWwubm9pc2UgPSBxdWFsaXR5Lm5vaXNlLmRhdGE7ICAvKiBpbnN0YW50IG5vaXNlIGxldmVsICovCiAKLSNpZiBXSVJFTEVTU19FWFQgPiAxOAogCXdzdGF0cy0+cXVhbC51cGRhdGVkID0gSVdfUVVBTF9BTExfVVBEQVRFRCB8IElXX1FVQUxfREJNOwotI2Vsc2UKLQl3c3RhdHMtPnF1YWwudXBkYXRlZCA9IDc7Ci0jZW5kaWYKIAl3c3RhdHMtPmRpc2NhcmQuY29kZSA9IHdsYW5kZXYtPnJ4LmRlY3J5cHRfZXJyOwogCXdzdGF0cy0+ZGlzY2FyZC5ud2lkID0gMDsKIAl3c3RhdHMtPmRpc2NhcmQubWlzYyA9IDA7CiAKLSNpZiBXSVJFTEVTU19FWFQgPiAxMQogCXdzdGF0cy0+ZGlzY2FyZC5mcmFnbWVudCA9IDA7ICAvLyBpbmNvbXBsZXRlIGZyYWdtZW50cwogCXdzdGF0cy0+ZGlzY2FyZC5yZXRyaWVzID0gMDsgICAvLyB0eCByZXRyaWVzLgogCXdzdGF0cy0+bWlzcy5iZWFjb24gPSAwOwotI2VuZGlmCiAKIAlEQkZFWElUOwogCkBAIC0zMTIsNyArMzAwLDcgQEAKIAltc2cubXNnY29kZSA9IERJRG1zZ19kb3QxMXJlcV9taWJnZXQ7CiAJbWliaXRlbS5kaWQgPSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlEU1NTVGFibGVfZG90MTFDdXJyZW50Q2hhbm5lbDsKIAltZW1jcHkoJm1zZy5taWJhdHRyaWJ1dGUuZGF0YSwgJm1pYml0ZW0sIHNpemVvZihtaWJpdGVtKSk7Ci0JcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAoVUlOVDgqKSZtc2cpOworCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4KikmbXNnKTsKIAogCWlmIChyZXN1bHQpIHsKIAkJZXJyID0gLUVGQVVMVDsKQEAgLTM2Miw3ICszNTAsNyBAQAogCQltaWJpdGVtLmRhdGEgPSBwODAyMTFfbWh6X3RvX2NoYW5uZWwoZnJlcS0+bSk7CiAKIAltZW1jcHkoJm1zZy5taWJhdHRyaWJ1dGUuZGF0YSwgJm1pYml0ZW0sIHNpemVvZihtaWJpdGVtKSk7Ci0JcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAoVUlOVDgqKSZtc2cpOworCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4KikmbXNnKTsKIAogCWlmIChyZXN1bHQpIHsKIAkJZXJyID0gLUVGQVVMVDsKQEAgLTM3NCw4ICszNjIsNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLSNpZiBXSVJFTEVTU19FWFQgPiA4Ci0KIHN0YXRpYyBpbnQgcDgwMjExd2V4dF9naXdtb2RlKG5ldGRldmljZV90ICpkZXYsCiAJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQkJICAgICAgX191MzIgKm1vZGUsIGNoYXIgKmV4dHJhKQpAQCAtNDQ3LDE0ICs0MzMsMTEgQEAKIAl9CiAKIAkvKiBTZXQgT3BlcmF0aW9uIG1vZGUgdG8gdGhlIFBPUlQgVFlQRSBSSUQgKi8KLQotI3dhcm5pbmcgImdldCByaWQgb2YgcDJtaWIgaGVyZSIKLQogCW1zZy5tc2djb2RlID0gRElEbXNnX2RvdDExcmVxX21pYnNldDsKIAltaWJpdGVtLmRpZCA9IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlBvcnRUeXBlOwogCW1pYml0ZW0uZGF0YSA9ICgqbW9kZSA9PSBJV19NT0RFX0FESE9DKSA/IDAgOiAxOwogCW1lbWNweSgmbXNnLm1pYmF0dHJpYnV0ZS5kYXRhLCAmbWliaXRlbSwgc2l6ZW9mKG1pYml0ZW0pKTsKLQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsIChVSU5UOCopJm1zZyk7CisJcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAodTgqKSZtc2cpOwogCiAJaWYgKHJlc3VsdCkKIAkJZXJyID0gLUVGQVVMVDsKQEAgLTQ3OSwxMiArNDYyLDkgQEAKIAlkYXRhLT5sZW5ndGggPSBzaXplb2YoKnJhbmdlKTsKIAltZW1zZXQocmFuZ2UsMCxzaXplb2YoKnJhbmdlKSk7CiAKLSNpZiBXSVJFTEVTU19FWFQgPiA5CiAJcmFuZ2UtPnR4cG93ZXJfY2FwYSA9IElXX1RYUE9XX0RCTTsKIAkvLyBYWFggd2hhdCBhYm91dCBtaW4vbWF4X3BtcCwgbWluL21heF9wbXQsIGV0Yy4KLSNlbmRpZgogCi0jaWYgV0lSRUxFU1NfRVhUID4gMTAKIAlyYW5nZS0+d2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKIAlyYW5nZS0+d2VfdmVyc2lvbl9zb3VyY2UgPSAxMzsKIApAQCAtNDkyLDE2ICs0NzIsMTMgQEAKIAlyYW5nZS0+cmV0cnlfZmxhZ3MgPSBJV19SRVRSWV9MSU1JVDsKIAlyYW5nZS0+bWluX3JldHJ5ID0gMDsKIAlyYW5nZS0+bWF4X3JldHJ5ID0gMjU1OwotI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDEwICovCiAKLSNpZiBXSVJFTEVTU19FWFQgPiAxNgogICAgICAgICByYW5nZS0+ZXZlbnRfY2FwYVswXSA9IChJV19FVkVOVF9DQVBBX0tfMCB8ICAvL21vZGUvZnJlcS9zc2lkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElXX0VWRU5UX0NBUEFfTUFTSyhTSU9DR0lXQVApIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVdfRVZFTlRfQ0FQQV9NQVNLKFNJT0NHSVdTQ0FOKSk7CiAgICAgICAgIHJhbmdlLT5ldmVudF9jYXBhWzFdID0gSVdfRVZFTlRfQ0FQQV9LXzE7ICAvL2VuY29kZQogICAgICAgICByYW5nZS0+ZXZlbnRfY2FwYVs0XSA9IChJV19FVkVOVF9DQVBBX01BU0soSVdFVlFVQUwpIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVdfRVZFTlRfQ0FQQV9NQVNLKElXRVZDVVNUT00pICk7Ci0jZW5kaWYKIAogCXJhbmdlLT5udW1fY2hhbm5lbHMgPSBOVU1fQ0hBTk5FTFM7CiAKQEAgLTU0Myw3ICs1MjAsNiBAQAogCURCRkVYSVQ7CiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYKIAogc3RhdGljIGludCBwODAyMTF3ZXh0X2dpd2FwKG5ldGRldmljZV90ICpkZXYsCiAJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKQEAgLTU2MSw3ICs1MzcsNiBAQAogCXJldHVybiAwOwogfQogCi0jaWYgV0lSRUxFU1NfRVhUID4gOAogc3RhdGljIGludCBwODAyMTF3ZXh0X2dpd2VuY29kZShuZXRkZXZpY2VfdCAqZGV2LAogCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCQkJc3RydWN0IGl3X3BvaW50ICplcnEsIGNoYXIgKmtleSkKQEAgLTU3MiwxMCArNTQ3LDEzIEBACiAKIAlEQkZFTlRFUjsKIAorCWkgPSAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOworCWVycS0+ZmxhZ3MgPSAwOworCiAJaWYgKHdsYW5kZXYtPmhvc3R3ZXAgJiBIT1NUV0VQX1BSSVZBQ1lJTlZPS0VEKQotCQllcnEtPmZsYWdzID0gSVdfRU5DT0RFX0VOQUJMRUQ7CisJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0VOQUJMRUQ7CiAJZWxzZQotCQllcnEtPmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9ESVNBQkxFRDsKIAogCWlmICh3bGFuZGV2LT5ob3N0d2VwICYgSE9TVFdFUF9FWENMVURFVU5FTkNSWVBURUQpCiAJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX1JFU1RSSUNURUQ7CkBAIC02MTMsNyArNTkxLDYgQEAKIAogCWludCBlcnIgPSAwOwogCWludCByZXN1bHQgPSAwOwotCWludCBlbmFibGUgPSAwOwogCWludCBpOwogCiAJREJGRU5URVI7CkBAIC02MzIsMjMgKzYwOSwyMyBAQAogCQllbHNlCiAJCQlpLS07CiAKLQkJcmVzdWx0ID0gcDgwMjExd2V4dF9kb3JlcXVlc3Qod2xhbmRldiwgRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlX2RvdDExV0VQRGVmYXVsdEtleUlELCBpKTsKKwkJLyogU2V0IGN1cnJlbnQga2V5IG51bWJlciBvbmx5IGlmIG5vIGtleXMgYXJlIGdpdmVuICovCisJCWlmIChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX05PS0VZKSB7CisJCQlyZXN1bHQgPSBwODAyMTF3ZXh0X2RvcmVxdWVzdCh3bGFuZGV2LCBESURtaWJfZG90MTFzbXRfZG90MTFQcml2YWN5VGFibGVfZG90MTFXRVBEZWZhdWx0S2V5SUQsIGkpOwogCi0JCWlmIChyZXN1bHQpIHsKLQkJCWVyciA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQllbmFibGUgPSAxOworCQkJaWYgKHJlc3VsdCkgeworCQkJCWVyciA9IC1FRkFVTFQ7CisJCQkJZ290byBleGl0OworCQkJfQogCQl9CiAKLQl9Ci0JZWxzZSB7Ci0JCS8vIERvIG5vdCB0aGluZyB3aGVuIG5vIEtleSBJbmRleAorCX0gZWxzZSB7CisJCS8vIFVzZSBkZWZhdWx0a2V5IGlmIG5vIEtleSBJbmRleAorCQlpID0gd2xhbmRldi0+aG9zdHdlcCAmIEhPU1RXRVBfREVGQVVMVEtFWV9NQVNLOwogCX0KIAogCS8qIENoZWNrIGlmIHRoZXJlIGlzIG5vIGtleSBpbmZvcm1hdGlvbiBpbiB0aGUgaXdjb25maWcgcmVxdWVzdCAqLwotCWlmKChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX05PS0VZKSA9PSAwICYmIGVuYWJsZSA9PSAxKSB7CisJaWYoKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfTk9LRVkpID09IDAgKSB7CiAKIAkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJICogSWYgdGhlcmUgaXMgV0VQIEtleSBmb3Igc2V0dGluZywgY2hlY2sgdGhlIEtleSBJbmZvcm1hdGlvbgpAQCAtNjkwLDcgKzY2Nyw3IEBACiAKIAkJCW1zZy5tc2djb2RlID0gRElEbXNnX2RvdDExcmVxX21pYnNldDsKIAkJCW1lbWNweSgmbXNnLm1pYmF0dHJpYnV0ZS5kYXRhLCAmcHN0ciwgc2l6ZW9mKHBzdHIpKTsKLQkJCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKFVJTlQ4KikmbXNnKTsKKwkJCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4KikmbXNnKTsKIAogCQkJaWYgKHJlc3VsdCkgewogCQkJCWVyciA9IC1FRkFVTFQ7CkBAIC03MDMsOCArNjgwLDcgQEAKIAkvKiBDaGVjayB0aGUgUHJpdmFjeUludm9rZWQgZmxhZyAqLwogCWlmIChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKSB7CiAJCXJlc3VsdCA9IHA4MDIxMXdleHRfZG9yZXF1ZXN0KHdsYW5kZXYsIERJRG1pYl9kb3QxMXNtdF9kb3QxMVByaXZhY3lUYWJsZV9kb3QxMVByaXZhY3lJbnZva2VkLCBQODAyMTFFTlVNX3RydXRoX2ZhbHNlKTsKLQl9Ci0JZWxzZSBpZigoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9FTkFCTEVEKSB8fCBlbmFibGUgPT0gMSkgeworCX0gZWxzZSB7CiAJCXJlc3VsdCA9IHA4MDIxMXdleHRfZG9yZXF1ZXN0KHdsYW5kZXYsIERJRG1pYl9kb3QxMXNtdF9kb3QxMVByaXZhY3lUYWJsZV9kb3QxMVByaXZhY3lJbnZva2VkLCBQODAyMTFFTlVNX3RydXRoX3RydWUpOwogCX0KIApAQCAtNzEzLDcgKzY4OSwxMyBAQAogCQlnb3RvIGV4aXQ7CiAJfQogCi0JLyogQ2hlY2sgdGhlIEV4Y2x1ZGVVbmVuY3J5cHRlZCBmbGFnICovCisJLyogIFRoZSAgc2VjdXJpdHkgIG1vZGUgIG1heSAgYmUgb3BlbiBvciByZXN0cmljdGVkLCBhbmQgaXRzIG1lYW5pbmcKKwkgICAgZGVwZW5kcyBvbiB0aGUgY2FyZCB1c2VkLiBXaXRoICBtb3N0ICBjYXJkcywgIGluICBvcGVuICBtb2RlICBubworCSAgICBhdXRoZW50aWNhdGlvbiAgaXMgIHVzZWQgIGFuZCAgdGhlICBjYXJkICBtYXkgIGFsc28gIGFjY2VwdCBub24tCisJICAgIGVuY3J5cHRlZCBzZXNzaW9ucywgd2hlcmVhcyBpbiByZXN0cmljdGVkICBtb2RlICBvbmx5ICBlbmNyeXB0ZWQKKwkgICAgc2Vzc2lvbnMgIGFyZSAgYWNjZXB0ZWQgIGFuZCB0aGUgY2FyZCB3aWxsIHVzZSBhdXRoZW50aWNhdGlvbiBpZgorCSAgICBhdmFpbGFibGUuCisJKi8KIAlpZiAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEKSB7CiAJCXJlc3VsdCA9IHA4MDIxMXdleHRfZG9yZXF1ZXN0KHdsYW5kZXYsIERJRG1pYl9kb3QxMXNtdF9kb3QxMVByaXZhY3lUYWJsZV9kb3QxMUV4Y2x1ZGVVbmVuY3J5cHRlZCwgUDgwMjExRU5VTV90cnV0aF90cnVlKTsKIAl9CkBAIC03OTgsNyArNzgwLDcgQEAKIAltc2cuc3NpZC5kYXRhLmxlbiA9IGxlbmd0aDsKIAogCVdMQU5fTE9HX0RFQlVHKDEsImF1dG9qb2luX3NzaWQgZm9yICVzIFxuIixlc3NpZCk7Ci0JcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAoVUlOVDgqKSZtc2cpOworCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4KikmbXNnKTsKICAgICAgICAgV0xBTl9MT0dfREVCVUcoMSwiYXV0b2pvaW5fc3NpZCAlZFxuIixyZXN1bHQpOwogCiAJaWYgKHJlc3VsdCkgewpAQCAtODUwLDcgKzgzMiw3IEBACiAJbXNnLm1zZ2NvZGUgPSBESURtc2dfZG90MTFyZXFfbWliZ2V0OwogCW1pYml0ZW0uZGlkID0gRElEbWliX3AyX3AyTUFDX3AyQ3VycmVudFR4UmF0ZTsKIAltZW1jcHkoJm1zZy5taWJhdHRyaWJ1dGUuZGF0YSwgJm1pYml0ZW0sIHNpemVvZihtaWJpdGVtKSk7Ci0JcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAoVUlOVDgqKSZtc2cpOworCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4KikmbXNnKTsKIAogCWlmIChyZXN1bHQpIHsKIAkJZXJyID0gLUVGQVVMVDsKQEAgLTg2MywxMCArODQ1LDEwIEBACiAJcnJxLT5kaXNhYmxlZCA9IDA7CiAJcnJxLT52YWx1ZSA9IDA7CiAKLSNkZWZpbmUJCUhGQTM4NHhfUkFURUJJVF8xCQkJKChVSU5UMTYpMSkKLSNkZWZpbmUJCUhGQTM4NHhfUkFURUJJVF8yCQkJKChVSU5UMTYpMikKLSNkZWZpbmUJCUhGQTM4NHhfUkFURUJJVF81ZG90NQkJCSgoVUlOVDE2KTQpCi0jZGVmaW5lCQlIRkEzODR4X1JBVEVCSVRfMTEJCQkoKFVJTlQxNik4KQorI2RlZmluZQkJSEZBMzg0eF9SQVRFQklUXzEJCQkoKHUxNikxKQorI2RlZmluZQkJSEZBMzg0eF9SQVRFQklUXzIJCQkoKHUxNikyKQorI2RlZmluZQkJSEZBMzg0eF9SQVRFQklUXzVkb3Q1CQkJKCh1MTYpNCkKKyNkZWZpbmUJCUhGQTM4NHhfUkFURUJJVF8xMQkJCSgodTE2KTgpCiAKIAlzd2l0Y2ggKG1pYml0ZW0uZGF0YSkgewogCWNhc2UgSEZBMzg0eF9SQVRFQklUXzE6CkBAIC05MDQsNyArODg2LDcgQEAKIAltc2cubXNnY29kZSA9IERJRG1zZ19kb3QxMXJlcV9taWJnZXQ7CiAJbWliaXRlbS5kaWQgPSBESURtaWJfZG90MTFtYWNfZG90MTFPcGVyYXRpb25UYWJsZV9kb3QxMVJUU1RocmVzaG9sZDsKIAltZW1jcHkoJm1zZy5taWJhdHRyaWJ1dGUuZGF0YSwgJm1pYml0ZW0sIHNpemVvZihtaWJpdGVtKSk7Ci0JcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAoVUlOVDgqKSZtc2cpOworCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4KikmbXNnKTsKIAogCWlmIChyZXN1bHQpIHsKIAkJZXJyID0gLUVGQVVMVDsKQEAgLTk0OCw3ICs5MzAsNyBAQAogCQltaWJpdGVtLmRhdGEgPSBydHMtPnZhbHVlOwogCiAJbWVtY3B5KCZtc2cubWliYXR0cmlidXRlLmRhdGEsICZtaWJpdGVtLCBzaXplb2YobWliaXRlbSkpOwotCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKFVJTlQ4KikmbXNnKTsKKwlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCopJm1zZyk7CiAKIAlpZiAocmVzdWx0KSB7CiAJCWVyciA9IC1FRkFVTFQ7CkBAIC05NzUsNyArOTU3LDcgQEAKIAltc2cubXNnY29kZSA9IERJRG1zZ19kb3QxMXJlcV9taWJnZXQ7CiAJbWliaXRlbS5kaWQgPSBESURtaWJfZG90MTFtYWNfZG90MTFPcGVyYXRpb25UYWJsZV9kb3QxMUZyYWdtZW50YXRpb25UaHJlc2hvbGQ7CiAJbWVtY3B5KCZtc2cubWliYXR0cmlidXRlLmRhdGEsICZtaWJpdGVtLCBzaXplb2YobWliaXRlbSkpOwotCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKFVJTlQ4KikmbXNnKTsKKwlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCopJm1zZyk7CiAKIAlpZiAocmVzdWx0KSB7CiAJCWVyciA9IC1FRkFVTFQ7CkBAIC0xMDE5LDcgKzEwMDEsNyBAQAogCQltaWJpdGVtLmRhdGEgPSBmcmFnLT52YWx1ZTsKIAogCW1lbWNweSgmbXNnLm1pYmF0dHJpYnV0ZS5kYXRhLCAmbWliaXRlbSwgc2l6ZW9mKG1pYml0ZW0pKTsKLQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsIChVSU5UOCopJm1zZyk7CisJcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAodTgqKSZtc2cpOwogCiAJaWYgKHJlc3VsdCkgewogCQllcnIgPSAtRUZBVUxUOwpAQCAtMTAzMSwxMCArMTAxMyw2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotI2VuZGlmICAvKiBXSVJFTEVTU19FWFQgPiA4ICovCi0KLSNpZiBXSVJFTEVTU19FWFQgPiAxMAotCiAjaWZuZGVmIElXX1JFVFJZX0xPTkcKICNkZWZpbmUgSVdfUkVUUllfTE9ORyBJV19SRVRSWV9NQVgKICNlbmRpZgpAQCAtMTA1Miw3ICsxMDMwLDcgQEAKIAlwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICAgIG1zZzsKIAlpbnQgcmVzdWx0OwogCWludCBlcnIgPSAwOwotCVVJTlQxNiBzaG9ydHJldHJ5LCBsb25ncmV0cnksIGxpZmV0aW1lOworCXUxNiBzaG9ydHJldHJ5LCBsb25ncmV0cnksIGxpZmV0aW1lOwogCiAJREJGRU5URVI7CiAKQEAgLTEwNjAsNyArMTAzOCw3IEBACiAJbWliaXRlbS5kaWQgPSBESURtaWJfZG90MTFtYWNfZG90MTFPcGVyYXRpb25UYWJsZV9kb3QxMVNob3J0UmV0cnlMaW1pdDsKIAogCW1lbWNweSgmbXNnLm1pYmF0dHJpYnV0ZS5kYXRhLCAmbWliaXRlbSwgc2l6ZW9mKG1pYml0ZW0pKTsKLQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsIChVSU5UOCopJm1zZyk7CisJcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAodTgqKSZtc2cpOwogCiAJaWYgKHJlc3VsdCkgewogCQllcnIgPSAtRUZBVUxUOwpAQCAtMTA3NCw3ICsxMDUyLDcgQEAKIAltaWJpdGVtLmRpZCA9IERJRG1pYl9kb3QxMW1hY19kb3QxMU9wZXJhdGlvblRhYmxlX2RvdDExTG9uZ1JldHJ5TGltaXQ7CiAKIAltZW1jcHkoJm1zZy5taWJhdHRyaWJ1dGUuZGF0YSwgJm1pYml0ZW0sIHNpemVvZihtaWJpdGVtKSk7Ci0JcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAoVUlOVDgqKSZtc2cpOworCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4KikmbXNnKTsKIAogCWlmIChyZXN1bHQpIHsKIAkJZXJyID0gLUVGQVVMVDsKQEAgLTEwODgsNyArMTA2Niw3IEBACiAJbWliaXRlbS5kaWQgPSBESURtaWJfZG90MTFtYWNfZG90MTFPcGVyYXRpb25UYWJsZV9kb3QxMU1heFRyYW5zbWl0TVNEVUxpZmV0aW1lOwogCiAJbWVtY3B5KCZtc2cubWliYXR0cmlidXRlLmRhdGEsICZtaWJpdGVtLCBzaXplb2YobWliaXRlbSkpOwotCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKFVJTlQ4KikmbXNnKTsKKwlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCopJm1zZyk7CiAKIAlpZiAocmVzdWx0KSB7CiAJCWVyciA9IC1FRkFVTFQ7CkBAIC0xMTUxLDcgKzExMjksNyBAQAogCQltaWJpdGVtLmRhdGEgPSAgcnJxLT52YWx1ZSAvPSAxMDI0OwogCiAJCW1lbWNweSgmbXNnLm1pYmF0dHJpYnV0ZS5kYXRhLCAmbWliaXRlbSwgc2l6ZW9mKG1pYml0ZW0pKTsKLQkJcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAoVUlOVDgqKSZtc2cpOworCQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCopJm1zZyk7CiAKIAkJaWYgKHJlc3VsdCkgewogCQkJZXJyID0gLUVGQVVMVDsKQEAgLTExNjMsNyArMTE0MSw3IEBACiAJCQltaWJpdGVtLmRhdGEgPSBycnEtPnZhbHVlOwogCiAJCQltZW1jcHkoJm1zZy5taWJhdHRyaWJ1dGUuZGF0YSwgJm1pYml0ZW0sIHNpemVvZihtaWJpdGVtKSk7Ci0JCQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsIChVSU5UOCopJm1zZyk7CisJCQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCopJm1zZyk7CiAKIAkJCWlmIChyZXN1bHQpIHsKIAkJCQllcnIgPSAtRUZBVUxUOwpAQCAtMTE3Niw3ICsxMTU0LDcgQEAKIAkJCW1pYml0ZW0uZGF0YSA9IHJycS0+dmFsdWU7CiAKIAkJCW1lbWNweSgmbXNnLm1pYmF0dHJpYnV0ZS5kYXRhLCAmbWliaXRlbSwgc2l6ZW9mKG1pYml0ZW0pKTsKLQkJCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKFVJTlQ4KikmbXNnKTsKKwkJCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4KikmbXNnKTsKIAogCQkJaWYgKHJlc3VsdCkgewogCQkJCWVyciA9IC1FRkFVTFQ7CkBAIC0xMTkxLDkgKzExNjksNiBAQAogCiB9CiAKLSNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiAxMCAqLwotCi0jaWYgV0lSRUxFU1NfRVhUID4gOQogc3RhdGljIGludCBwODAyMTF3ZXh0X3Npd3R4cG93KG5ldGRldmljZV90ICpkZXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKnJycSwgY2hhciAqZXh0cmEpCkBAIC0xMjEyLDIyICsxMTg3LDEzIEBACiAgICAgICAgIH0KIAogICAgICAgICBtc2cubXNnY29kZSA9IERJRG1zZ19kb3QxMXJlcV9taWJzZXQ7Ci0KLSAgICAgICAgc3dpdGNoIChycnEtPnZhbHVlKSB7Ci0KLSAgICAgICAgICBjYXNlIDEgOiBtaWJpdGVtLmRpZCA9IERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMVR4UG93ZXJMZXZlbDE7IGJyZWFrOwotICAgICAgICAgIGNhc2UgMiA6IG1pYml0ZW0uZGlkID0gRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExVHhQb3dlckxldmVsMjsgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAzIDogbWliaXRlbS5kaWQgPSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFUeFBvd2VyTGV2ZWwzOyBicmVhazsKLSAgICAgICAgICBjYXNlIDQgOiBtaWJpdGVtLmRpZCA9IERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMVR4UG93ZXJMZXZlbDQ7IGJyZWFrOwotICAgICAgICAgIGNhc2UgNSA6IG1pYml0ZW0uZGlkID0gRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExVHhQb3dlckxldmVsNTsgYnJlYWs7Ci0gICAgICAgICAgY2FzZSA2IDogbWliaXRlbS5kaWQgPSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFUeFBvd2VyTGV2ZWw2OyBicmVhazsKLSAgICAgICAgICBjYXNlIDcgOiBtaWJpdGVtLmRpZCA9IERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMVR4UG93ZXJMZXZlbDc7IGJyZWFrOwotICAgICAgICAgIGNhc2UgOCA6IG1pYml0ZW0uZGlkID0gRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExVHhQb3dlckxldmVsODsgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDogbWliaXRlbS5kaWQgPSBESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFUeFBvd2VyTGV2ZWw4OyBicmVhazsKLQl9Ci0KKwltaWJpdGVtLmRpZCA9IERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMUN1cnJlbnRUeFBvd2VyTGV2ZWw7CisJaWYgKHJycS0+Zml4ZWQgPT0gMCkKKwkgIG1pYml0ZW0uZGF0YSA9IDMwOworCWVsc2UKKwkgIG1pYml0ZW0uZGF0YSA9IHJycS0+dmFsdWU7CiAgICAgICAgIG1lbWNweSgmbXNnLm1pYmF0dHJpYnV0ZS5kYXRhLCAmbWliaXRlbSwgc2l6ZW9mKG1pYml0ZW0pKTsKLSAgICAgICAgcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAoVUlOVDgqKSZtc2cpOworICAgICAgICByZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCopJm1zZyk7CiAKICAgICAgICAgaWYgKHJlc3VsdCkgewogICAgICAgICAgICAgICAgIGVyciA9IC1FRkFVTFQ7CkBAIC0xMjU1LDcgKzEyMjEsNyBAQAogCW1pYml0ZW0uZGlkID0gRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExQ3VycmVudFR4UG93ZXJMZXZlbDsKIAogCW1lbWNweSgmbXNnLm1pYmF0dHJpYnV0ZS5kYXRhLCAmbWliaXRlbSwgc2l6ZW9mKG1pYml0ZW0pKTsKLQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsIChVSU5UOCopJm1zZyk7CisJcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAodTgqKSZtc2cpOwogCiAJaWYgKHJlc3VsdCkgewogCQllcnIgPSAtRUZBVUxUOwpAQCAtMTI3NSw3ICsxMjQxLDYgQEAKIAlEQkZFWElUOwogCXJldHVybiBlcnI7CiB9Ci0jZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gOSAqLwogCiBzdGF0aWMgaW50IHA4MDIxMXdleHRfc2l3c3B5KG5ldGRldmljZV90ICpkZXYsCiAJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCkBAIC0xMzczLDcgKzEzMzgsNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLSNpZiBXSVJFTEVTU19FWFQgPiAxMwogc3RhdGljIGludCBwODAyMTF3ZXh0X3Npd3NjYW4obmV0ZGV2aWNlX3QgKmRldiwKIAkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKIAkJCSAgICAgc3RydWN0IGl3X3BvaW50ICpzcnEsIGNoYXIgKmV4dHJhKQpAQCAtMTQwOSw3ICsxMzczLDcgQEAKIAltc2cubWF4Y2hhbm5lbHRpbWUuZGF0YSA9IDI1MDsKIAltc2cubWluY2hhbm5lbHRpbWUuZGF0YSA9IDIwMDsKIAotCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKFVJTlQ4KikmbXNnKTsKKwlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCopJm1zZyk7CiAJaWYgKHJlc3VsdCkKIAkJZXJyID0gcHJpc20yX3Jlc3VsdDJlcnIgKG1zZy5yZXN1bHRjb2RlLmRhdGEpOwogCkBAIC0xNTIwLDcgKzE0ODQsNyBAQAogCQltc2cubXNnY29kZSA9IERJRG1zZ19kb3QxMXJlcV9zY2FuX3Jlc3VsdHM7CiAJCW1zZy5ic3NpbmRleC5kYXRhID0gaTsKIAotCQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsIChVSU5UOCopJm1zZyk7CisJCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4KikmbXNnKTsKIAkJaWYgKChyZXN1bHQgIT0gMCkgfHwKIAkJICAgIChtc2cucmVzdWx0Y29kZS5kYXRhICE9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9zdWNjZXNzKSkgewogCQkJYnJlYWs7CkBAIC0xNTQwLDEyICsxNTA0LDEwIEBACiAJREJGRVhJVDsKIAlyZXR1cm4gZXJyOwogfQotI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8vZXh0cmEgd2lyZWxlc3MgZXh0ZW5zaW9ucyBzdHVmZiB0byBzdXBwb3J0IE5ldHdvcmtNYW5hZ2VyIChJIGhvcGUpCiAKLSNpZiBXSVJFTEVTU19FWFQgPiAxNwogLyogU0lPQ1NJV0VOQ09ERUVYVCAqLwogc3RhdGljIGludCBwODAyMTF3ZXh0X3NldF9lbmNvZGVleHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLApAQCAtMTU4MCw3ICsxNTQyLDcgQEAKIAogCiAgIGlmICggZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX1NFVF9UWF9LRVkgKSB7Ci0gICAgaWYgKCAhIGV4dC0+YWxnICYgSVdfRU5DT0RFX0FMR19XRVApIHsKKyAgICBpZiAoIShleHQtPmFsZyAmIElXX0VOQ09ERV9BTEdfV0VQKSkgewogICAgICAgV0xBTl9MT0dfREVCVUcoMSwiYXNrZWQgdG8gc2V0IGEgbm9uIHdlcCBrZXkgOigiKTsKICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KQEAgLTE2MTUsNyArMTU3Nyw3IEBACiAgICAgICBicmVhazsKICAgICB9CiAgICAgbXNnLm1zZ2NvZGUgPSBESURtc2dfZG90MTFyZXFfbWlic2V0OwotICAgIHJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwoVUlOVDgqKSZtc2cpOworICAgIHJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwodTgqKSZtc2cpOwogICAgIFdMQU5fTE9HX0RFQlVHKDEsInJlc3VsdCAoJWQpXG4iLHJlc3VsdCk7CiAgIH0KICAgcmV0dXJuIHJlc3VsdDsKQEAgLTE3NjMsMjYgKzE3MjUsNiBAQAogICByZXR1cm4gcmVzdWx0OwogfQogCi0KLSNlbmRpZgotCi0KLQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLQotCi0KLS8qCi10eXBlZGVmIGludCAoKml3X2hhbmRsZXIpKG5ldGRldmljZV90ICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKLSovCi0KLSNpZiBXSVJFTEVTU19FWFQgPiAxMgogc3RhdGljIGl3X2hhbmRsZXIgcDgwMjExd2V4dF9oYW5kbGVyc1tdID0gIHsKIAkoaXdfaGFuZGxlcikgcDgwMjExd2V4dF9zaXdjb21taXQsCQkvKiBTSU9DU0lXQ09NTUlUICovCiAJKGl3X2hhbmRsZXIpIHA4MDIxMXdleHRfZ2l3bmFtZSwJCS8qIFNJT0NHSVdOQU1FICovCkBAIC0xODA4LDEzICsxNzUwLDggQEAKIAkoaXdfaGFuZGxlcikgcDgwMjExd2V4dF9naXdhcCwgICAgICAgICAJCS8qIFNJT0NHSVdBUCAqLwogCShpd19oYW5kbGVyKSBOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCiAJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgCQkvKiBTSU9DR0lXQVBMSVNUICovCi0jaWYgV0lSRUxFU1NfRVhUID4gMTMKLQkoaXdfaGFuZGxlcikgcDgwMjExd2V4dF9zaXdzY2FuLAkJCS8qIFNJT0NTSVdTQ0FOICovCi0JKGl3X2hhbmRsZXIpIHA4MDIxMXdleHRfZ2l3c2NhbiwJCQkvKiBTSU9DR0lXU0NBTiAqLwotI2Vsc2UgLyogV0lSRUxFU1NfRVhUID4gMTMgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJLyogbnVsbCAqLwkJLyogU0lPQ1NJV1NDQU4gKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJLyogbnVsbCAqLwkJLyogU0lPQ0dJV1NDQU4gKi8KLSNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiAxMyAqLworCShpd19oYW5kbGVyKSBwODAyMTF3ZXh0X3Npd3NjYW4sCQkvKiBTSU9DU0lXU0NBTiAqLworCShpd19oYW5kbGVyKSBwODAyMTF3ZXh0X2dpd3NjYW4sCQkvKiBTSU9DR0lXU0NBTiAqLwogCShpd19oYW5kbGVyKSBwODAyMTF3ZXh0X3Npd2Vzc2lkLCAgCQkvKiBTSU9DU0lXRVNTSUQgKi8KIAkoaXdfaGFuZGxlcikgcDgwMjExd2V4dF9naXdlc3NpZCwgICAgICAJCS8qIFNJT0NHSVdFU1NJRCAqLwogCShpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgCQkvKiBTSU9DU0lXTklDS04gKi8KQEAgLTE4MzUsOSArMTc3Miw3IEBACiAJKGl3X2hhbmRsZXIpIHA4MDIxMXdleHRfZ2l3ZW5jb2RlLCAgCQkvKiBTSU9DR0lXRU5DT0RFICovCiAJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAJCS8qIFNJT0NTSVdQT1dFUiAqLwogCShpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgIAkJLyogU0lPQ0dJV1BPV0VSICovCi0jaWYgV0lSRUxFU1NfRVhUID4gMTcKIC8qIFdQQSBvcGVyYXRpb25zICovCi0KIAkoaXdfaGFuZGxlcikgTlVMTCwJCQkJLyogLS0gaG9sZSAtLSAqLwogCShpd19oYW5kbGVyKSBOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCiAJKGl3X2hhbmRsZXIpIE5VTEwsIC8qIFNJT0NTSVdHRU5JRQlzZXQgZ2VuZXJpYyBJRSAqLwpAQCAtMTg0OCwxNzAgKzE3ODMsMTggQEAKIAkoaXdfaGFuZGxlcikgcDgwMjExd2V4dF9zZXRfZW5jb2RlZXh0LCAvKiBTSU9DU0lXRU5DT0RFRVhUICBzZXQgZW5jb2RpbmcgdG9rZW4gJiBtb2RlICovCiAJKGl3X2hhbmRsZXIpIHA4MDIxMXdleHRfZ2V0X2VuY29kZWV4dCwgLyogU0lPQ0dJV0VOQ09ERUVYVCAgZ2V0IGVuY29kaW5nIHRva2VuICYgbW9kZSAqLwogCShpd19oYW5kbGVyKSBOVUxMLCAvKiBTSU9DU0lXUE1LU0EJUE1LU0EgY2FjaGUgb3BlcmF0aW9uICovCi0jZW5kaWYKIH07CiAKIHN0cnVjdCBpd19oYW5kbGVyX2RlZiBwODAyMTF3ZXh0X2hhbmRsZXJfZGVmID0gewotCS5udW1fc3RhbmRhcmQgPSBzaXplb2YocDgwMjExd2V4dF9oYW5kbGVycykgLyBzaXplb2YoaXdfaGFuZGxlciksCisJLm51bV9zdGFuZGFyZCA9IEFSUkFZX1NJWkUocDgwMjExd2V4dF9oYW5kbGVycyksCiAJLm51bV9wcml2YXRlID0gMCwKIAkubnVtX3ByaXZhdGVfYXJncyA9IDAsCiAgICAgICAgIC5zdGFuZGFyZCA9IHA4MDIxMXdleHRfaGFuZGxlcnMsCiAJLnByaXZhdGUgPSBOVUxMLAogCS5wcml2YXRlX2FyZ3MgPSBOVUxMLAotI2lmIFdJUkVMRVNTX0VYVCA+IDE2CiAJLmdldF93aXJlbGVzc19zdGF0cyA9IHA4MDIxMXdleHRfZ2V0X3dpcmVsZXNzX3N0YXRzCi0jZW5kaWYKIH07CiAKLSNlbmRpZgotCi0vKiB3aXJlbGVzcyBleHRlbnNpb25zJyBpb2N0bHMgKi8KLWludCBwODAyMTF3ZXh0X3N1cHBvcnRfaW9jdGwobmV0ZGV2aWNlX3QgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCi17Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2ID0gZGV2LT5tbF9wcml2OwotCi0jaWYgV0lSRUxFU1NfRVhUIDwgMTMKLQlzdHJ1Y3QgaXdyZXEgKml3ciA9IChzdHJ1Y3QgaXdyZXEqKWlmcjsKLSNlbmRpZgotCi0JcDgwMjExaXRlbV91aW50MzJfdCAgICAgICAgICAgICBtaWJpdGVtOwotCWludCBlcnIgPSAwOwotCi0JREJGRU5URVI7Ci0KLQltaWJpdGVtLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQotCWlmICggd2xhbmRldi0+bXNkc3RhdGUgIT0gV0xBTl9NU0RfUlVOTklORyApIHsKLQkJZXJyID0gLUVOT0RFVjsKLQkJZ290byBleGl0OwotCX0KLQotCVdMQU5fTE9HX0RFQlVHKDEsICJSZWNlaXZlZCB3aXJlbGVzcyBleHRlbnNpb24gaW9jdGwgIyVkLlxuIiwgY21kKTsKLQotCXN3aXRjaCAoY21kKSB7Ci0jaWYgV0lSRUxFU1NfRVhUIDwgMTMKLQljYXNlIFNJT0NTSVdOQU1FOiAgLyogdW51c2VkICAqLwotCQllcnIgPSAoLUVPUE5PVFNVUFApOwotCQlicmVhazsKLQljYXNlIFNJT0NHSVdOQU1FOiAvKiBnZXQgbmFtZSA9PSB3aXJlbGVzcyBwcm90b2NvbCAqLwotICAgICAgICAgICAgICAgIGVyciA9IHA4MDIxMXdleHRfZ2l3bmFtZShkZXYsIE5VTEwsIChjaGFyICopICZpd3ItPnUsIE5VTEwpOwotCQlicmVhazsKLQljYXNlIFNJT0NTSVdOV0lEOgotCWNhc2UgU0lPQ0dJV05XSUQ6Ci0JCWVyciA9ICgtRU9QTk9UU1VQUCk7Ci0JCWJyZWFrOwotCWNhc2UgU0lPQ1NJV0ZSRVE6IC8qIHNldCBjaGFubmVsICovCi0gICAgICAgICAgICAgICAgZXJyID0gcDgwMjExd2V4dF9zaXdmcmVxKGRldiwgTlVMTCwgJihpd3ItPnUuZnJlcSksIE5VTEwpOwotCQlicmVhazsKLQljYXNlIFNJT0NHSVdGUkVROiAvKiBnZXQgY2hhbm5lbCAqLwotICAgICAgICAgICAgICAgIGVyciA9IHA4MDIxMXdleHRfZ2l3ZnJlcShkZXYsIE5VTEwsICYoaXdyLT51LmZyZXEpLCBOVUxMKTsKLQkJYnJlYWs7Ci0JY2FzZSBTSU9DU0lXUkFOR0U6Ci0JY2FzZSBTSU9DU0lXUFJJVjoKLQljYXNlIFNJT0NTSVdBUDogLyogc2V0IGFjY2VzcyBwb2ludCBNQUMgYWRkcmVzc2VzIChCU1NJRCkgKi8KLQkJZXJyID0gKC1FT1BOT1RTVVBQKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNJT0NHSVdBUDoJLyogZ2V0IGFjY2VzcyBwb2ludCBNQUMgYWRkcmVzc2VzIChCU1NJRCkgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBwODAyMTF3ZXh0X2dpd2FwKGRldiwgTlVMTCwgJihpd3ItPnUuYXBfYWRkciksIE5VTEwpOwotCQlicmVhazsKLQotI2lmIFdJUkVMRVNTX0VYVCA+IDgKLQljYXNlIFNJT0NTSVdNT0RFOiAvKiBzZXQgb3BlcmF0aW9uIG1vZGUgKi8KLQljYXNlIFNJT0NTSVdFU1NJRDogLyogc2V0IFNTSUQgKG5ldHdvcmsgbmFtZSkgKi8KLQljYXNlIFNJT0NTSVdSQVRFOiAvKiBzZXQgZGVmYXVsdCBiaXQgcmF0ZSAoYnBzKSAqLwotCQllcnIgPSAoLUVPUE5PVFNVUFApOwotCQlicmVhazsKLQotCWNhc2UgU0lPQ0dJV01PREU6IC8qIGdldCBvcGVyYXRpb24gbW9kZSAqLwotCQllcnIgPSBwODAyMTF3ZXh0X2dpd21vZGUoZGV2LCBOVUxMLCAmaXdyLT51Lm1vZGUsIE5VTEwpOwotCi0JCWJyZWFrOwotCWNhc2UgU0lPQ0dJV05JQ0tOOiAvKiBnZXQgbm9kZSBuYW1lL25pY2tuYW1lICovCi0JY2FzZSBTSU9DR0lXRVNTSUQ6IC8qIGdldCBTU0lEICovCi0JCWlmKGl3ci0+dS5lc3NpZC5wb2ludGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHNzaWRbSVdfRVNTSURfTUFYX1NJWkUrMV07Ci0JCQltZW1zZXQoc3NpZCwgMCwgc2l6ZW9mKHNzaWQpKTsKLQotCQkJZXJyID0gcDgwMjExd2V4dF9naXdlc3NpZChkZXYsIE5VTEwsICZpd3ItPnUuZXNzaWQsIHNzaWQpOwotCQkJaWYoY29weV90b191c2VyKGl3ci0+dS5lc3NpZC5wb2ludGVyLCBzc2lkLCBzaXplb2Yoc3NpZCkpKQotCQkJCWVyciA9ICgtRUZBVUxUKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFNJT0NHSVdSQVRFOgotICAgICAgICAgICAgICAgIGVyciA9IHA4MDIxMXdleHRfZ2l3cmF0ZShkZXYsIE5VTEwsICZpd3ItPnUuYml0cmF0ZSwgTlVMTCk7Ci0JCWJyZWFrOwotCWNhc2UgU0lPQ0dJV1JUUzoKLQkJZXJyID0gcDgwMjExd2V4dF9naXdydHMoZGV2LCBOVUxMLCAmaXdyLT51LnJ0cywgTlVMTCk7Ci0JCWJyZWFrOwotCWNhc2UgU0lPQ0dJV0ZSQUc6Ci0JCWVyciA9IHA4MDIxMXdleHRfZ2l3ZnJhZyhkZXYsIE5VTEwsICZpd3ItPnUucnRzLCBOVUxMKTsKLQkJYnJlYWs7Ci0JY2FzZSBTSU9DR0lXRU5DT0RFOgotCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCi0JCQllcnIgPSAtRVBFUk07Ci0JCWVsc2UgaWYgKGl3ci0+dS5lbmNvZGluZy5wb2ludGVyKSB7Ci0JCQljaGFyIGtleWJ1ZltNQVhfS0VZTEVOXTsKLQkJCWVyciA9IHA4MDIxMXdleHRfZ2l3ZW5jb2RlKGRldiwgTlVMTCwKLQkJCQkJCSAgICAgJml3ci0+dS5lbmNvZGluZywga2V5YnVmKTsKLQkJCWlmIChjb3B5X3RvX3VzZXIoaXdyLT51LmVuY29kaW5nLnBvaW50ZXIsIGtleWJ1ZiwKLQkJCQkJIGl3ci0+dS5lbmNvZGluZy5sZW5ndGgpKQotCQkJCWVyciA9IC1FRkFVTFQ7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBTSU9DR0lXQVBMSVNUOgotCWNhc2UgU0lPQ1NJV1JUUzoKLQljYXNlIFNJT0NTSVdGUkFHOgotCWNhc2UgU0lPQ1NJV1NFTlM6Ci0JY2FzZSBTSU9DR0lXU0VOUzoKLQljYXNlIFNJT0NTSVdOSUNLTjogLyogc2V0IG5vZGUgbmFtZS9uaWNrbmFtZSAqLwotCWNhc2UgU0lPQ1NJV0VOQ09ERTogLyogc2V0IGVuY29kaW5nIHRva2VuICYgbW9kZSAqLwotCWNhc2UgU0lPQ1NJV1NQWToKLQljYXNlIFNJT0NHSVdTUFk6Ci0JY2FzZSBTSU9DU0lXUE9XRVI6Ci0JY2FzZSBTSU9DR0lXUE9XRVI6Ci0JY2FzZSBTSU9DR0lXUFJJVjoKLQkJZXJyID0gKC1FT1BOT1RTVVBQKTsKLQkJYnJlYWs7Ci0JY2FzZSBTSU9DR0lXUkFOR0U6Ci0JCWlmKGl3ci0+dS5kYXRhLnBvaW50ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JhbmdlIHJhbmdlOwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gcDgwMjExd2V4dF9naXdyYW5nZShkZXYsIE5VTEwsICZpd3ItPnUuZGF0YSwKLQkJCQkJCSAgKGNoYXIgKikgJnJhbmdlKTsKLQkJCS8qIFB1c2ggdGhhdCB1cCB0byB0aGUgY2FsbGVyICovCi0JCQlpZiAoY29weV90b191c2VyKGl3ci0+dS5kYXRhLnBvaW50ZXIsICZyYW5nZSwgc2l6ZW9mKHJhbmdlKSkpCi0JCQkJZXJyID0gLUVGQVVMVDsKLQkJfQotCQlicmVhazsKLSNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiA4ICovCi0jaWYgV0lSRUxFU1NfRVhUID4gOQotCWNhc2UgU0lPQ1NJV1RYUE9XOgotCQllcnIgPSAoLUVPUE5PVFNVUFApOwotCQlicmVhazsKLQljYXNlIFNJT0NHSVdUWFBPVzoKLQkJZXJyID0gcDgwMjExd2V4dF9naXd0eHBvdyhkZXYsIE5VTEwsICZpd3ItPnUudHhwb3dlciwgTlVMTCk7Ci0JCWJyZWFrOwotI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDkgKi8KLSNpZiBXSVJFTEVTU19FWFQgPiAxMAotCWNhc2UgU0lPQ1NJV1JFVFJZOgotCQllcnIgPSAoLUVPUE5PVFNVUFApOwotCQlicmVhazsKLQljYXNlIFNJT0NHSVdSRVRSWToKLQkJZXJyID0gcDgwMjExd2V4dF9naXdyZXRyeShkZXYsIE5VTEwsICZpd3ItPnUucmV0cnksIE5VTEwpOwotCQlicmVhazsKLSNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiAxMCAqLwotCi0jZW5kaWYgLyogV0lSRUxFU1NfRVhUIDw9IDEyICovCi0KLQlkZWZhdWx0OgotCQllcnIgPSAoLUVPUE5PVFNVUFApOwotCQlicmVhazsKLQl9Ci0KLSBleGl0OgotCURCRkVYSVQ7Ci0JcmV0dXJuIChlcnIpOwotfQogCiBpbnQgcDgwMjExd2V4dF9ldmVudF9hc3NvY2lhdGVkKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgaW50IGFzc29jKQogewpAQCAtMjAxOSw3ICsxODAyLDYgQEAKIAogICAgICAgICBEQkZFTlRFUjsKIAotI2lmIFdJUkVMRVNTX0VYVCA+IDEzCiAgICAgICAgIC8qIFNlbmQgdGhlIGFzc29jaWF0aW9uIHN0YXRlIGZpcnN0ICovCiAgICAgICAgIGRhdGEuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CiAgICAgICAgIGlmIChhc3NvYykgewpAQCAtMjAzNCwxNSArMTgxNiwxMiBAQAogICAgICAgICBpZiAoIWFzc29jKSBnb3RvIGRvbmU7CiAKICAgICAgICAgLy8gWFhYIHNlbmQgYXNzb2NpYXRpb24gZGF0YSwgbGlrZSBJRXMsIGV0YyBldGMuCi0jZW5kaWYKKwogIGRvbmU6CiAgICAgICAgIERCRkVYSVQ7CiAgICAgICAgIHJldHVybiAwOwogfQogCiAKLSNlbmRpZiAvKiBjb21wYXRpYmlsaXR5IHRvIHdpcmVsZXNzIGV4dGVuc2lvbnMgKi8KLQotCiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yX2NzLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJfY3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNjZTU2NS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJfY3MuYworKysgL2Rldi9udWxsCkBAIC0xLDE0ODcgKzAsMCBAQAotI2RlZmluZSBXTEFOX0hPU1RJRiBXTEFOX1BDTUNJQQotI2luY2x1ZGUgImhmYTM4NHguYyIKLSNpbmNsdWRlICJwcmlzbTJtZ210LmMiCi0jaW5jbHVkZSAicHJpc20ybWliLmMiCi0jaW5jbHVkZSAicHJpc20yc3RhLmMiCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDw9IEtFUk5FTF9WRVJTSU9OKDIsNCwyMSkgKQotI2lmIChXTEFOX0NQVV9GQU1JTFkgPT0gV0xBTl9JeDg2KQotI2lmbmRlZiBDT05GSUdfSVNBCi0jd2FybmluZyAiWW91IG1heSBuZWVkIHRvIGVuYWJsZSBJU0Egc3VwcG9ydCBpbiB5b3VyIGtlcm5lbC4iCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDExKSApCi1zdGF0aWMgdV9pbnQJaXJxX21hc2sgPSAweGRlYjg7CQkvKiBJbnRlcnJ1cHQgbWFzayAqLwotc3RhdGljIGludAlpcnFfbGlzdFs0XSA9IHsgLTEgfTsJCS8qIEludGVycnVwdCBsaXN0ICovCi0jZW5kaWYKLXN0YXRpYyB1X2ludAlwcmlzbTJfaWdub3JldmNjPTE7CQkvKiBCb29sZWFuLCBpZiBzZXQsIHdlCi0JCQkJCQkgKiBpZ25vcmUgd2hhdCB0aGUgVmNjCi0JCQkJCQkgKiBpcyBzZXQgdG8gYW5kIHdoYXQgdGhlIENJUwotCQkJCQkJICogc2F5cy4KLQkJCQkJCSAqLwotbW9kdWxlX3BhcmFtKCBwcmlzbTJfaWdub3JldmNjLCBpbnQsIDA2NDQpOwotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwxMSkgKQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPD0gS0VSTkVMX1ZFUlNJT04oMiw2LDkpKQotc3RhdGljIGludCBudW1saXN0ID0gNDsKLW1vZHVsZV9wYXJhbV9hcnJheShpcnFfbGlzdCwgaW50LCBudW1saXN0LCAwNDQ0KTsKLSNlbHNlCi1tb2R1bGVfcGFyYW1fYXJyYXkoaXJxX2xpc3QsIGludCwgTlVMTCwgMDQ0NCk7Ci0jZW5kaWYKLW1vZHVsZV9wYXJhbSggaXJxX21hc2ssIGludCwgMDY0NCk7Ci0jZW5kaWYKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxNSkKLXN0YXRpYyBpbnQgcHJpc20yX2NzX3N1c3BlbmQoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBkZXYpOwotc3RhdGljIGludCBwcmlzbTJfY3NfcmVzdW1lKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwZGV2KTsKLXN0YXRpYyB2b2lkIHByaXNtMl9jc19yZW1vdmUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBkZXYpOwotc3RhdGljIGludCBwcmlzbTJfY3NfcHJvYmUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBkZXYpOwotI2Vsc2UKLWRldl9saW5rX3QJKnByaXNtMnN0YV9hdHRhY2godm9pZCk7Ci1zdGF0aWMgdm9pZAlwcmlzbTJzdGFfZGV0YWNoKGRldl9saW5rX3QgKmxpbmspOwotc3RhdGljIHZvaWQJcHJpc20yc3RhX2NvbmZpZyhkZXZfbGlua190ICpsaW5rKTsKLXN0YXRpYyB2b2lkCXByaXNtMnN0YV9yZWxlYXNlKHVfbG9uZyBhcmcpOwotc3RhdGljIGludCAJcHJpc20yc3RhX2V2ZW50IChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncyk7Ci0KLXN0YXRpYyBkZXZfbGlua190CSpkZXZfbGlzdCA9IE5VTEw7CS8qIGhlYWQgb2YgaW5zdGFuY2UgbGlzdCAqLwotI2VuZGlmCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDY4KSkKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBjc19lcnJvcgotKgotKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIHByaW50IGNhcmQgc2VydmljZXMgZXJyb3IgbWVzc2FnZXMuCi0qCi0qIEFyZ3VtZW50czoKLSoJaGFuZGxlCWNsaWVudCBoYW5kbGUgaWRlbnRpZnlpbmcgdGhpcyBDUyBjbGllbnQKLSoJZnVuYwlDUyBmdW5jdGlvbiBudW1iZXIgdGhhdCBnZW5lcmF0ZWQgdGhlIGVycm9yCi0qCXJldAlDUyBmdW5jdGlvbiByZXR1cm4gY29kZQotKgotKiBSZXR1cm5zOgotKglub3RoaW5nCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotKglpbnRlcnJ1cHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQgY3NfZXJyb3IoY2xpZW50X2hhbmRsZV90IGhhbmRsZSwgaW50IGZ1bmMsIGludCByZXQpCi17Ci0jaWYgKGRlZmluZWQoQ1NfUkVMRUFTRV9DT0RFKSAmJiAoQ1NfUkVMRUFTRV9DT0RFIDwgMHgyOTExKSkKLQlDYXJkU2VydmljZXMoUmVwb3J0RXJyb3IsIGRldl9pbmZvLCAodm9pZCAqKWZ1bmMsICh2b2lkICopcmV0KTsKLSNlbHNlCi0JZXJyb3JfaW5mb190IGVyciA9IHsgZnVuYywgcmV0IH07Ci0JcGNtY2lhX3JlcG9ydF9lcnJvcihoYW5kbGUsICZlcnIpOwotI2VuZGlmCi19Ci0jZWxzZSAvLyBrZXJuZWxfdmVyc2lvbgotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDEyKQotc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkIHByaXNtMl9jc19pZHNbXSA9IHsKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiSU5URVJTSUwiLCAgIkhGQTM4NHgvSUVFRSIsIDB4NzRjNWU0MGQsIDB4ZGI0NzJhMTgpLCAvLyBJbnRlcnNpbCBQUklTTTIgUmVmZXJlbmNlIERlc2lnbiAxMU1iL3MgODAyLjExYiBXTEFOIENhcmQKLQlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxMzgsIDB4MDAwMiksIC8vIENvbXBhcSBXTDEwMC8yMDAgMTFNYi9zIDgwMi4xMWIgV0xBTiBDYXJkCi0JUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMjhhLCAweDAwMDIpLCAvLyBDb21wYXEgaVBhcSBITlctMTAwIDExTWIvcyA4MDIuMTFiIFdMQU4gQ2FyZAotCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDI1MCwgMHgwMDAyKSwgLy8gU2Ftc3VuZyBTV0wyMDAwLU4gMTFNYi9zIDgwMi4xMWIgV0xBTiBDYXJkCi0JUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHhkNjAxLCAweDAwMDIpLCAvLyBaLUNvbSBYSTMwMCAxMU1iL3MgODAyLjExYiBXTEFOIENhcmQKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiWm9vbUFpciAxMU1icHMgSGlnaCIsICAiUmF0ZSB3aXJlbGVzcyBOZXR3b3JraW5nIiwgMHgyNzNmZTNkYiwgMHgzMmExZWFlZSksIC8vIFpvb21BaXIgNDEwMCAxMU1iL3MgODAyLjExYiBXTEFOIENhcmQKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIkluc3RhbnQgV2lyZWxlc3MgIiwgICIgTmV0d29yayBQQyBDQVJEIiwgICJWZXJzaW9uIDAxLjAyIiwgMHgxMWQ5MDFhZiwgMHg2ZTliZDkyNiwgMHg0Yjc0YmFhMCksIC8vIExpbmtzeXMgV1BDMTEgMTFNYnBzIDgwMi4xMWIgV0xBTiBDYXJkCi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzKCJBZGR0cm9uIiwgICJBV1AtMTAwIFdpcmVsZXNzIFBDTUNJQSIsICAiVmVyc2lvbiAwMS4wMiIsIDB4ZTZlYzUyY2UsIDB4ODY0OWFmMiwgMHg0Yjc0YmFhMCksIC8vIEFkZHRyb24gQVdQLTEwMCAxMU1icHMgODAyLjExYiBXTEFOIENhcmQKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIkQiLCAgIkxpbmsgRFdMLTY1MCAxMU1icHMgV0xBTiBDYXJkIiwgICJWZXJzaW9uIDAxLjAyIiwgMHg3MWIxODU4OSwgMHhiNmYxYjBhYiwgMHg0Yjc0YmFhMCksIC8vIEQtTGluayBEV0wtNjUwIDExTWJwcyA4MDIuMTFiIFdMQU4gQ2FyZAotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygiU01DIiwgICJTTUMyNjMyVyIsICAiVmVyc2lvbiAwMS4wMiIsIDB4YzRmOGIxOGIsIDB4NDc0YTFmMmEsIDB4NGI3NGJhYTApLCAvLyBTTUMgMjYzMlcgMTFNYnBzIDgwMi4xMWIgV0xBTiBDYXJkCi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzNCgiSW50ZXJzaWwiLCAgIlBSSVNNIDJfNSBQQ01DSUEgQURBUFRFUiIsICAiSVNMMzczMDBQIiwgICJFdmFsLVJldkEiLCAweDRiODAxYTE3LCAweDYzNDVhMGJmLCAweGM5MDQ5YTM5LCAweGMyM2FkYzBlKSwgLy8gQnJvTWF4IEZyZWVwb3J0IDExTWJwcyA4MDIuMTFiIFdMQU4gQ2FyZCAoUHJpc20gMi41KQotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygiVS5TLiBSb2JvdGljcyIsICAiSUVFRSA4MDIuMTFiIFBDLUNBUkQiLCAgIlZlcnNpb24gMDEuMDIiLCAweGM3YjhkZjlkLCAweDE3MDBkMDg3LCAweDRiNzRiYWEwKSwgLy8gVS5TLiBSb2JvdGljcyBJRUVFIDgwMi4xMWIgUEMtQ0FSRAotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJEaWdpdGFsIERhdGEgQ29tbXVuaWNhdGlvbnMiLCAgIldQQy0wMTAwIiwgMHhmZGQ3MzQ3MCwgMHhlMGI2ZjE0NiksIC8vIExldmVsLU9uZSBXUEMtMDEwMAotCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDI3NCwgMHgxNjEyKSwgLy8gQnJvbWF4IE9FTSAxMU1icHMgODAyLjExYiBXTEFOIENhcmQgKFByaXNtIDIuNSkKLQlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAyNzQsIDB4MTYxMyksIC8vIEJyb21heCBPRU0gMTFNYnBzIDgwMi4xMWIgV0xBTiBDYXJkIChQcmlzbSAzKQotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJjb3JlZ2EgSy5LLiIsICAiV2lyZWxlc3MgTEFOIFBDQy0xMSIsIDB4NTI2MTQ0MGYsIDB4YTY0MDU1ODQpLCAvLyBjb3JlZ2EgSy5LLiBXaXJlbGVzcyBMQU4gUENDLTExCi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoImNvcmVnYSBLLksuIiwgICJXaXJlbGVzcyBMQU4gUENDQS0xMSIsIDB4NTI2MTQ0MGYsIDB4ZGY2MTE1ZjkpLCAvLyBjb3JlZ2EgSy5LLiBXaXJlbGVzcyBMQU4gUENDQS0xMQotCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4YzAwMSwgMHgwMDA4KSwgLy8gQ09OVEVDIEZMRVhTQ0FOL0ZYLUREUzExMC1QQ0MKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiUExBTkVYIiwgICJHZW9XYXZlL0dXLU5TMTEwIiwgMHgyMDlmNDBhYiwgMHg0NjI2MzE3OCksIC8vIFBMQU5FWCBHZW9XYXZlL0dXLU5TMTEwCi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzKCJPRU0iLCAgIlBSSVNNMiBJRUVFIDgwMi4xMSBQQy1DYXJkIiwgICJWZXJzaW9uIDAxLjAyIiwgMHhmZWE1NGM5MCwgMHg0OGYyYmRkNiwgMHg0Yjc0YmFhMCksIC8vIEFtYmljb20gV0wxMTAwIDExTWJwcyA4MDIuMTFiIFdMQU4gQ2FyZAotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygiTGVBcnRlcnkiLCAgIlNZTkNCWUFJUiAxMU1icHMgV2lyZWxlc3MgTEFOIFBDIENhcmQiLCAgIlZlcnNpb24gMDEuMDIiLCAweDdlM2IzMjZhLCAweDQ5ODkzZTkyLCAweDRiNzRiYWEwKSwgLy8gTGVBcnRlcnkgU1lOQ0JZQUlSIDExTWJwcyA4MDIuMTFiIFdMQU4gQ2FyZAotUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMWZmLCAweDAwMDgpLCAvLyBJbnRlcm1lYyBNb2JpbGVMQU4gMTFNYnBzIDgwMi4xMWIgV0xBTiBDYXJkCi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzKCJORVRHRUFSIE1BNDAxIFdpcmVsZXNzIFBDIiwgICJDYXJkIiwgICJWZXJzaW9uIDAxLjAwIiwgMHhhMzc0MzRlOSwgMHg5NzYyZThmMSwgMHhhNTdhZGI4YyksIC8vIE5FVEdFQVIgTUE0MDEgMTFNYnBzIDgwMi4xMSBXTEFOIENhcmQKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjM0KCJJbnRlcnNpbCIsICAiUFJJU00gRnJlZWRvbSBQQ01DSUEgQWRhcHRlciIsICAiSVNMMzcxMDBQIiwgICJFdmFsLVJldkEiLCAweDRiODAxYTE3LCAweGYyMjJlYzJkLCAweDYzMGQ1MmIyLCAweGMyM2FkYzBlKSwgLy8gSW50ZXJzaWwgUFJJU00gRnJlZWRvbSAxMW1icHMgODAyLjExIFdMQU4gQ2FyZAotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygiT1RDIiwgICJXaXJlbGVzcyBBaXJFWlkgMjQxMS1QQ0MgV0xBTiBDYXJkIiwgICJWZXJzaW9uIDAxLjAyIiwgMHg0YWM0NDI4NywgMHgyMzVhNmJlZCwgMHg0Yjc0YmFhMCksIC8vIE9UQyBXaXJlbGVzcyBBaXJFWlkgMjQxMS1QQ0MgMTFNYnBzIDgwMi4xMSBXTEFOIENhcmQKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjM0KCI4MDIuMTEiLCAgIjExTWJwcyBXaXJlbGVzcyBMQU4gQ2FyZCIsICAidjA4QzEiLCAgIiIgICAsIDB4YjY3YTYxMGUsIDB4NjU1YWE3YjcsIDB4MjY0YjQ1MWEsIDB4MCksIC8vIER5bmFsaW5rIEwxMUhEVCAxMU1icHMgODAyLjExIFdMQU4gQ2FyZAotCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4YzI1MCwgMHgwMDAyKSwgLy8gRHluYWxpbmsgTDExSERUIDExTWJwcyA4MDIuMTEgV0xBTiBDYXJkCi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlBST1hJTSIsICAiUmFuZ2VMQU4tRFMvTEFOIFBDIENBUkQiLCAweGM2NTM2YTVlLCAweDNmMzU3OTdkKSwgLy8gUFJPWElNIFJhbmdlTEFOLURTL0xBTiBQQyBDQVJECi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzNCgiQUNUSU9OVEVDIiwgICJQUklTTSBXaXJlbGVzcyBMQU4gUEMgQ2FyZCIsICAiMDM4MSIsICAiUmV2QSIsIDB4MzkzMDg5ZGEsIDB4YTcxZTY5ZDUsIDB4OTA0NzFmYTksIDB4NTdhNjYxOTQpLCAvLyBBQ1RJT05URUMgUFJJU00gV2lyZWxlc3MgTEFOIFBDIENhcmQKLQlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDE2NjgsIDB4MDEwMSksIC8vIEFDVElPTlRFQyBQUklTTSBXaXJlbGVzcyBMQU4gUEMgQ2FyZAotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCIzQ29tIiwgICIzQ1JXRTczN0EgQWlyQ29ubmVjdCBXaXJlbGVzcyBMQU4gUEMgQ2FyZCIsIDB4NDEyNDBlNWIsIDB4NTYwMTBhZjMpLCAvLyAzQ29tIEFpckNvbm5lY3QgM0NSV0U3MzdBCi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIjNDb20iLCAgIjNDUldFNzc3QSBBaXJDb25uZWN0IFdpcmVsZXNzIExBTiBQQ0kgQ2FyZCIgICwgMHg0MTI0MGU1YiwgMHhhZmM3YzMzZSksIC8vIDNDb20gQWlyQ29ubmVjdCAzQ1JXRTc3N0EKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQVNVUyIsICAiODAyXzExYl9QQ19DQVJEXzI1IiwgMHg3OGZjMDZlZSwgMHhkYjlhYTg0MiksIC8vIEFTVVMgV0wtMTAwIDgwMi4xMWIgV0xBTiAgUEMgQ2FyZAotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJBU1VTIiwgICI4MDJfMTFCX0NGX0NBUkRfMjUiLCAweDc4ZmMwNmVlLCAweDQ1YTUwYzFlKSwgLy8gQVNVUyBXTC0xMTAgODAyLjExYiBXTEFOIENGIENhcmQKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQlVGRkFMTyIsICAiV0xJLUNGLVMxMUciLCAweDJkZWNlY2UzLCAweDgyMDY3YzE4KSwgLy8gQlVGRkFMTyBXTEktQ0YtUzExRyA4MDIuMTFiIFdMQU4gQ2FyZAotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMzQoIlRoZSBMaW5rc3lzIEdyb3VwLCBJbmMuIiwgIldpcmVsZXNzIE5ldHdvcmsgQ0YgQ2FyZCIsICJJU0wzNzMwMFAiLCAiUmV2QSIsIDB4YTVmNDcyYzIsIDB4OWMwNTU5OGQsIDB4YzkwNDlhMzksIDB4NTdhNjYxOTQpLCAvLyBMaW5rc3lzIFdDRjExIDExTWJwcyA4MDIuMTFiIFdMQU4gQ2FyZCAoUHJpc20gMi41KQotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMzQoIkxpbmtzeXMiLCAgIldpcmVsZXNzIENvbXBhY3RGbGFzaCBDYXJkIiwgICIiLCAgIiIsIDB4NzMzY2M4MSwgMHhjNTJmMzk1LCAweDAsIDB4MCksIC8vIExpbmtzeXMgV0NGMTIgMTFNYnBzIDgwMi4xMWIgV0xBTiBDYXJkIChQcmlzbSAzKQotCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDI4YSwgMHgwNjczKSwgLy8gTGlua3N5cyBXQ0YxMiAxMU1icHMgODAyLjExYiBXTEFOIENhcmQgKFByaXNtIDMpCi0JUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzNCgiTkVUR0VBUiBNQTQwMVJBIFdpcmVsZXNzIFBDIiwgICJDYXJkIiwgICJJU0wzNzMwMFAiLCAgIkV2YWwtUmV2QSIsIDB4MzA2NDY3ZiwgMHg5NzYyZThmMSwgMHhjOTA0OWEzOSwgMHhjMjNhZGMwZSksIC8vIE5FVEdFQVIgTUE0MDFSQSAxMU1icHMgODAyLjExIFdMQU4gQ2FyZAotCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4ZDYwMSwgMHgwMDA1KSwgLy8gRC1MaW5rIERDRi02NjBXICAxMU1icHMgODAyLjExYiBXTEFOIENhcmQKLQlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAyZDIsIDB4MDAwMSksIC8vIE1pY3Jvc29mdCBXaXJlbGVzcyBOb3RlYm9vayBBZGFwdGVyIE1OLTUyMAotCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDA4OSwgMHgwMDAyKSwgLy8gQW55UG9pbnQoVE0pIFdpcmVsZXNzIElJIFBDIENhcmQKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjM0KCJEIiwgICJMaW5rIERSQy02NTAgMTFNYnBzIFdMQU4gQ2FyZCIsICAiVmVyc2lvbiAwMS4wMiIsICAiIiAsIDB4NzFiMTg1ODksIDB4ZjE0NGUzYWMsIDB4NGI3NGJhYTAsIDB4MCksIC8vIEQtTGluayBEUkMtNjUwIDgwMi4xMWIgV0xBTiBDYXJkCi0JUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHg5MDA1LCAweDAwMjEpLCAvLyBBZGFwdGVjIEFXTi04MDMwCi0JUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMDBiLCAweDcxMTApLCAvLyBELUxpbmsgRFdMLTY1MCByZXYgUCA4MDIuMTFiIFdMQU4gY2FyZAotCS8vIFBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMzQoIkQtTGluayIsICAiRFdMLTY1MCBXaXJlbGVzcyBQQyBDYXJkIFJldlAiLCAgIklTTDM3MTAxUC0xMCIsICAiQTMiLCAweDFhNDI0YTFjLCAweDZlYTU3NjMyLCAweGRkOTdhMjZiLCAweDU2YjIxZjUyKSwgLy8gRC1MaW5rIERXTC02NTAgcmV2IFAgODAyLjExYiBXTEFOIGNhcmQKLQlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIklOVEVSU0lMIiwgICAiSS1HQVRFIDExTSBQQyBDYXJkIC8gUEMgQ2FyZCBwbHVzIiwgICJWZXJzaW9uIDAxLjAyIiwgMHg3NGM1ZTQwZCwgMHg4MzA0ZmY3NywgMHg0Yjc0YmFhMCksIC8vIEktR2F0ZSAxMU0gUEMgQ2FyZAotCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMzQoIkJFTlEiLCAgIkFXTDEwMCBQQ01DSUEgQURBUFRFUiIsICAiSVNMMzczMDBQIiwgICJFdmFsLVJldkEiLCAweDM1ZGFkYzc0LCAweDFmN2ZlZGIsIDB4YzkwNDlhMzksIDB4YzIzYWRjMGUpLCAvLyBiZW5RIEFXTDEwMCA4MDIuMTFiIFdMQU4gQ2FyZAotCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDAwYiwgMHg3MzAwKSwgLy8gYmVuUSBBV0wxMDAgODAyLjExYiBXTEFOIENhcmQKLQkvLyBQQ01DSUFfREVWSUNFX1BST0RfSUQxKCJJTlRFUlNJTCIsIDB4NzRjNWU0MGQpLCAvLyBJbnRlcnNpbCBQcmlzbSAyIGNhcmQKLQkvLyBQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxNTYsIDB4MDAwMiksIC8vIEludGVyc2lsIFByaXNtIDIgY2FyZAotCi0JUENNQ0lBX0RFVklDRV9OVUxMCi19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKHBjbWNpYSwgcHJpc20yX2NzX2lkcyk7Ci0jZW5kaWYKLQotc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIHByaXNtMl9jc19kcml2ZXIgPSB7Ci0JLmRydiA9IHsKLQkJLm5hbWUgPSAicHJpc20yX2NzIiwKLQl9LAotCS5vd25lciA9IFRISVNfTU9EVUxFLAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxNSkKLQkuc3VzcGVuZCA9IHByaXNtMl9jc19zdXNwZW5kLAotCS5yZXN1bWUgPSBwcmlzbTJfY3NfcmVzdW1lLAotCS5yZW1vdmUgPSBwcmlzbTJfY3NfcmVtb3ZlLAotCS5wcm9iZSA9IHByaXNtMl9jc19wcm9iZSwKLQkuaWRfdGFibGUgPSBwcmlzbTJfY3NfaWRzLAotI2Vsc2UKLQkuYXR0YWNoID0gcHJpc20yc3RhX2F0dGFjaCwKLQkuZGV0YWNoID0gcHJpc20yc3RhX2RldGFjaCwKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTIpCi0JLmlkX3RhYmxlID0gcHJpc20yX2NzX2lkcywKLQkuZXZlbnQgPSAgcHJpc20yc3RhX2V2ZW50LAotI2VuZGlmIC8vID4gMi42LjEyCi0jZW5kaWYgLy8gPD0gMi42LjE1Ci19OwotI2VuZGlmIC8qIGtlcm5lbF92ZXJzaW9uICovCi0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTUpCi0jZGVmaW5lIENTX0NIRUNLKGZuLCByZXQpIFwKLWRvIHsgbGFzdF9mbiA9IChmbik7IGlmICgobGFzdF9yZXQgPSAocmV0KSkgIT0gMCkgZ290byBjc19mYWlsZWQ7IH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQ0ZHX0NIRUNLKGZuLCByZXRmKSBcCi1kbyB7IGludCByZXQgPSAocmV0Zik7IFwKLWlmIChyZXQgIT0gMCkgeyBcCi0gICAgICAgIFdMQU5fTE9HX0RFQlVHKDEsICJDYXJkU2VydmljZXMoIiAjZm4gIikgcmV0dXJuZWQgJWRcbiIsIHJldCk7IFwKLSAgICAgICAgY3NfZXJyb3IocGRldiwgZm4sIHJldCk7IFwKLSAgICAgICAgZ290byBuZXh0X2VudHJ5OyBcCi19IFwKLX0gd2hpbGUgKDApCi0KLXN0YXRpYyB2b2lkIHByaXNtMl9jc19yZW1vdmUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHdsYW5kZXZpY2UgICp3bGFuZGV2OwotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDE3KQotICAgICAgICBkZXZfbGlua190ICpsaW5rID0gZGV2X3RvX2luc3RhbmNlKHBkZXYpOwotI2VuZGlmCi0KLQlEQkZFTlRFUjsKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxNikKLQl3bGFuZGV2ID0gcGRldi0+cHJpdjsKLSNlbHNlCi0Jd2xhbmRldiA9IGxpbmstPnByaXY7Ci0jZW5kaWYKLQotCWlmICh3bGFuZGV2KSB7Ci0JCXA4MDIxMW5ldGRldl9od3JlbW92ZWQod2xhbmRldik7Ci0JCXVucmVnaXN0ZXJfd2xhbmRldih3bGFuZGV2KTsKLQkJd2xhbl91bnNldHVwKHdsYW5kZXYpOwotCQlpZiAod2xhbmRldi0+cHJpdikgewotCQkJaGZhMzg0eF90ICpodyA9IHdsYW5kZXYtPnByaXY7Ci0JCQl3bGFuZGV2LT5wcml2ID0gTlVMTDsKLQkJCWlmIChodykgewotCQkJCWhmYTM4NHhfZGVzdHJveShodyk7Ci0JCQkJa2ZyZWUoaHcpOwotCQkJfQotCQl9Ci0JCWtmcmVlKHdsYW5kZXYpOwotCX0KLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxNikKLQlwZGV2LT5wcml2ID0gTlVMTDsKLSAgICAgICAgcGNtY2lhX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotI2Vsc2UKLSAgICAgICAgaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgewotCSAgICAgICAgaWYgKGxpbmstPndpbikKLQkJCXBjbWNpYV9yZWxlYXNlX3dpbmRvdyhsaW5rLT53aW4pOwotCQlwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7Ci0JCWlmIChsaW5rLT5pby5OdW1Qb3J0czEpCi0JCQlwY21jaWFfcmVsZWFzZV9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7Ci0JCWlmIChsaW5rLT5pcnEuQXNzaWduZWRJUlEpCi0JCQlwY21jaWFfcmVsZWFzZV9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKTsKLQotCQlsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJRzsKLQl9Ci0KLQlsaW5rLT5wcml2ID0gTlVMTDsKLQlrZnJlZShsaW5rKTsKLSNlbmRpZgotCi0JREJGRVhJVDsKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyBpbnQgcHJpc20yX2NzX3N1c3BlbmQoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHdsYW5kZXZpY2UgICp3bGFuZGV2OwotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDE3KQotICAgICAgICBkZXZfbGlua190ICpsaW5rID0gZGV2X3RvX2luc3RhbmNlKHBkZXYpOwotI2VuZGlmCi0KLQlEQkZFTlRFUjsKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxNikKLQl3bGFuZGV2ID0gcGRldi0+cHJpdjsKLQlwcmlzbTJzdGFfaWZzdGF0ZSh3bGFuZGV2LCBQODAyMTFFTlVNX2lmc3RhdGVfZGlzYWJsZSk7Ci0jZWxzZQotCXdsYW5kZXYgPSBsaW5rLT5wcml2OwotCi0gICAgICAgIGxpbmstPnN0YXRlIHw9IERFVl9TVVNQRU5EOwotICAgICAgICBpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7Ci0JCXByaXNtMnN0YV9pZnN0YXRlKHdsYW5kZXYsIFA4MDIxMUVOVU1faWZzdGF0ZV9kaXNhYmxlKTsKLQkJcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOwotCX0KLSNlbmRpZgotCi0JREJGRVhJVDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHByaXNtMl9jc19yZXN1bWUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHdsYW5kZXZpY2UgICp3bGFuZGV2OwotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDE3KQotICAgICAgICBkZXZfbGlua190ICpsaW5rID0gZGV2X3RvX2luc3RhbmNlKHBkZXYpOwotI2VuZGlmCi0KLQlEQkZFTlRFUjsKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxNikKLQl3bGFuZGV2ID0gcGRldi0+cHJpdjsKLQkvLyBYWFggZG8gc29tZXRoaW5nIGhlcmU/Ci0jZWxzZQotCXdsYW5kZXYgPSBsaW5rLT5wcml2OwotICAgICAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX1NVU1BFTkQ7Ci0gICAgICAgIGlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKLSAgICAgICAgICAgICAgICBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpOwotCQkvLyBYWFggZG8gc29tZXRoaW5nIGhlcmU/Ci0JfQotI2VuZGlmCi0KLQotCURCRkVYSVQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBwcmlzbTJfY3NfcHJvYmUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBkZXYpCi17Ci0JaW50IHJ2YWwgPSAwOwotCXN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2ID0gTlVMTDsKLQloZmEzODR4X3QgKmh3ID0gTlVMTDsKLQotICAgICAgICBjb25maWdfaW5mb190IHNvY2tldGNvbmY7Ci0gICAgICAgIGNpc3BhcnNlX3QgKnBhcnNlID0gTlVMTDsKLQl0dXBsZV90IHR1cGxlOwotCXVpbnQ4X3QJYnVmWzY0XTsKLSAgICAgICAgaW50IGxhc3RfZm4sIGxhc3RfcmV0OwotICAgICAgICBjaXN0cGxfY2Z0YWJsZV9lbnRyeV90IGRmbHQgPSB7IDAgfTsKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwxNykKLQlkZXZfbGlua190ICpsaW5rOwotI2VuZGlmCi0KLQlEQkZFTlRFUjsKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxNikKLQkvKiBTZXQgdXAgaW50ZXJydXB0IHR5cGUgKi8KLSAgICAgICAgcGRldi0+Y29uZi5JbnRUeXBlID0gSU5UX01FTU9SWV9BTkRfSU87Ci0jZWxzZQotICAgICAgICBsaW5rID0ga21hbGxvYyhzaXplb2YoZGV2X2xpbmtfdCksIEdGUF9LRVJORUwpOwotICAgICAgICBpZiAobGluayA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwotICAgICAgICBtZW1zZXQobGluaywgMCwgc2l6ZW9mKGRldl9saW5rX3QpKTsKLQotICAgICAgICBsaW5rLT5jb25mLlZjYyA9IDMzOwotICAgICAgICBsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKLQotICAgICAgICBsaW5rLT5oYW5kbGUgPSBwZGV2OwotICAgICAgICBwZGV2LT5pbnN0YW5jZSA9IGxpbms7Ci0gICAgICAgIGxpbmstPnN0YXRlIHw9IERFVl9QUkVTRU5UIHwgREVWX0NPTkZJR19QRU5ESU5HOwotCi0jZW5kaWYKLQotCS8vIFZDQyBjcmFwPwotICAgICAgICBwYXJzZSA9IGttYWxsb2Moc2l6ZW9mKGNpc3BhcnNlX3QpLCBHRlBfS0VSTkVMKTsKLQotCXdsYW5kZXYgPSBjcmVhdGVfd2xhbigpOwotCWlmICghd2xhbmRldiB8fCAhcGFyc2UpIHsKLQkJV0xBTl9MT0dfRVJST1IoIiVzOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlLlxuIiwgZGV2X2luZm8pOwotCQlydmFsID0gLUVJTzsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCWh3ID0gd2xhbmRldi0+cHJpdjsKLQotCWlmICggd2xhbl9zZXR1cCh3bGFuZGV2KSAhPSAwICkgewotCQlXTEFOX0xPR19FUlJPUigiJXM6IHdsYW5fc2V0dXAoKSBmYWlsZWQuXG4iLCBkZXZfaW5mbyk7Ci0JCXJ2YWwgPSAtRUlPOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBodyBzdHJ1Y3QgZm9yIG5vdyAqLwotCWhmYTM4NHhfY3JlYXRlKGh3LCAwLCAwLCBOVUxMKTsKLQlody0+d2xhbmRldiA9IHdsYW5kZXY7Ci0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTYpCi0JaHctPnBkZXYgPSBwZGV2OwotCXBkZXYtPnByaXYgPSB3bGFuZGV2OwotI2Vsc2UKLQlody0+bGluayA9IGxpbms7Ci0JbGluay0+cHJpdiA9IHdsYW5kZXY7Ci0jZW5kaWYKLQotICAgICAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOwotICAgICAgICB0dXBsZS5BdHRyaWJ1dGVzID0gMDsKLSAgICAgICAgdHVwbGUuVHVwbGVEYXRhID0gYnVmOwotICAgICAgICB0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKLSAgICAgICAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwotICAgICAgICBDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKHBkZXYsICZ0dXBsZSkpOwotICAgICAgICBDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShwZGV2LCAmdHVwbGUpKTsKLSAgICAgICAgQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKHBkZXYsICZ0dXBsZSwgcGFyc2UpKTsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTYpCi0gICAgICAgIHBkZXYtPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLT5jb25maWcuYmFzZTsKLSAgICAgICAgcGRldi0+Y29uZi5QcmVzZW50ID0gcGFyc2UtPmNvbmZpZy5ybWFza1swXTsKLSNlbHNlCi0gICAgICAgIGxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLT5jb25maWcuYmFzZTsKLSAgICAgICAgbGluay0+Y29uZi5QcmVzZW50ID0gcGFyc2UtPmNvbmZpZy5ybWFza1swXTsKLQotCWxpbmstPmNvbmYuVmNjID0gc29ja2V0Y29uZi5WY2M7Ci0jZW5kaWYKLSAgICAgICAgQ1NfQ0hFQ0soR2V0Q29uZmlndXJhdGlvbkluZm8sCi0gICAgICAgICAgICAgICAgIHBjbWNpYV9nZXRfY29uZmlndXJhdGlvbl9pbmZvKHBkZXYsICZzb2NrZXRjb25mKSk7Ci0KLQl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ0ZUQUJMRV9FTlRSWTsKLQlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKHBkZXYsICZ0dXBsZSkpOwotICAgICAgICBmb3IgKDs7KSB7Ci0JCWNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmZyA9ICYocGFyc2UtPmNmdGFibGVfZW50cnkpOwotICAgICAgICAgICAgICAgIENGR19DSEVDSyhHZXRUdXBsZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwY21jaWFfZ2V0X3R1cGxlX2RhdGEocGRldiwgJnR1cGxlKSk7Ci0gICAgICAgICAgICAgICAgQ0ZHX0NIRUNLKFBhcnNlVHVwbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwY21jaWFfcGFyc2VfdHVwbGUocGRldiwgJnR1cGxlLCBwYXJzZSkpOwotCi0gICAgICAgICAgICAgICAgaWYgKGNmZy0+ZmxhZ3MgJiBDSVNUUExfQ0ZUQUJMRV9ERUZBVUxUKQotICAgICAgICAgICAgICAgICAgICAgICAgZGZsdCA9ICpjZmc7Ci0gICAgICAgICAgICAgICAgaWYgKGNmZy0+aW5kZXggPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbmV4dF9lbnRyeTsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTYpCi0gICAgICAgICAgICAgICAgcGRldi0+Y29uZi5Db25maWdJbmRleCA9IGNmZy0+aW5kZXg7Ci0jZWxzZQotICAgICAgICAgICAgICAgIGxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSBjZmctPmluZGV4OwotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICAvKiBEb2VzIHRoaXMgY2FyZCBuZWVkIGF1ZGlvIG91dHB1dD8gKi8KLSAgICAgICAgICAgICAgICBpZiAoY2ZnLT5mbGFncyAmIENJU1RQTF9DRlRBQkxFX0FVRElPKSB7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDE2KQotICAgICAgICAgICAgICAgICAgICAgICAgcGRldi0+Y29uZi5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX1NQS1I7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwZGV2LT5jb25mLlN0YXR1cyA9IENDU1JfQVVESU9fRU5BOwotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmstPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9TUEtSOwotICAgICAgICAgICAgICAgICAgICAgICAgbGluay0+Y29uZi5TdGF0dXMgPSBDQ1NSX0FVRElPX0VOQTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIFVzZSBwb3dlciBzZXR0aW5ncyBmb3IgVmNjIGFuZCBWcHAgaWYgcHJlc2VudCAqLwotICAgICAgICAgICAgICAgIC8qICBOb3RlIHRoYXQgdGhlIENJUyB2YWx1ZXMgbmVlZCB0byBiZSByZXNjYWxlZCAqLwotICAgICAgICAgICAgICAgIGlmIChjZmctPnZjYy5wcmVzZW50ICYgKDEgPDwgQ0lTVFBMX1BPV0VSX1ZOT00pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc29ja2V0Y29uZi5WY2MgIT0gY2ZnLT52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMCAmJiAhcHJpc20yX2lnbm9yZXZjYykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOX0xPR19ERUJVRygxLCAiICBWY2MgbWlzbWF0Y2ggLSBza2lwcGluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdGhpcyBlbnRyeVxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbmV4dF9lbnRyeTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRmbHQudmNjLnByZXNlbnQgJiAoMSA8PCBDSVNUUExfUE9XRVJfVk5PTSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb2NrZXRjb25mLlZjYyAhPSBkZmx0LnZjYy5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwICYmICFwcmlzbTJfaWdub3JldmNjKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5fTE9HX0RFQlVHKDEsICIgIFZjYyAoZGVmYXVsdCkgbWlzbWF0Y2ggIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0gc2tpcHBpbmcgdGhpcyBlbnRyeVxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbmV4dF9lbnRyeTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2ZnLT52cHAxLnByZXNlbnQgJiAoMSA8PCBDSVNUUExfUE9XRVJfVk5PTSkpIHsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTYpCi0gICAgICAgICAgICAgICAgICAgICAgICBwZGV2LT5jb25mLlZwcCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmZy0+dnBwMS5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLyAxMDAwMDsKLSNlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBsaW5rLT5jb25mLlZwcDEgPSBsaW5rLT5jb25mLlZwcDIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmctPnZwcDEucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dIC8gMTAwMDA7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRmbHQudnBwMS5wcmVzZW50ICYgKDEgPDwgQ0lTVFBMX1BPV0VSX1ZOT00pKSB7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDE2KQotICAgICAgICAgICAgICAgICAgICAgICAgcGRldi0+Y29uZi5WcHAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmx0LnZwcDEucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dIC8gMTAwMDA7Ci0jZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgbGluay0+Y29uZi5WcHAxID0gbGluay0+Y29uZi5WcHAyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZsdC52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwOwotI2VuZGlmCi0JCX0KLQotCQkvKiBEbyB3ZSBuZWVkIHRvIGFsbG9jYXRlIGFuIGludGVycnVwdD8gKi8KLQkJLyogSEFDSzogZHVlIHRvIGEgYmFkIENJUy4uLi53ZSBBTFdBWVMgbmVlZCBhbiBpbnRlcnJ1cHQgKi8KLQkJLyogaWYgKGNmZy0+aXJxLklSUUluZm8xIHx8IGRmbHQuaXJxLklSUUluZm8xKSAqLwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxNikKLQkJcGRldi0+Y29uZi5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX0lSUTsKLSNlbHNlCi0JCWxpbmstPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9JUlE7Ci0jZW5kaWYKLQotCQkvKiBJTyB3aW5kb3cgc2V0dGluZ3MgKi8KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTYpCi0JCXBkZXYtPmlvLk51bVBvcnRzMSA9IHBkZXYtPmlvLk51bVBvcnRzMiA9IDA7Ci0JCWlmICgoY2ZnLT5pby5ud2luID4gMCkgfHwgKGRmbHQuaW8ubndpbiA+IDApKSB7Ci0JCQljaXN0cGxfaW9fdCAqaW8gPSAoY2ZnLT5pby5ud2luKSA/ICZjZmctPmlvIDogJmRmbHQuaW87Ci0JCQlwZGV2LT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOwotCQkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzhCSVQpKQotCQkJCXBkZXYtPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzE2OwotCQkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzE2QklUKSkKLQkJCQlwZGV2LT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF84OwotCQkJcGRldi0+aW8uQmFzZVBvcnQxID0gaW8tPndpblswXS5iYXNlOwotCQkJaWYgICggcGRldi0+aW8uQmFzZVBvcnQxICE9IDAgKSB7Ci0JCQkJV0xBTl9MT0dfV0FSTklORygKLQkJCQkiQnJhaW4gZGFtYWdlZCBDSVM6IGhhcmQgY29kZWQgaW9iYXNlPSIKLQkJCQkiMHgleCwgdHJ5IGxldHRpbmcgcGNtY2lhX2NzIGRlY2lkZS4uLlxuIiwKLQkJCQlwZGV2LT5pby5CYXNlUG9ydDEgKTsKLQkJCQlwZGV2LT5pby5CYXNlUG9ydDEgPSAwOwotCQkJfQotCQkJcGRldi0+aW8uTnVtUG9ydHMxID0gaW8tPndpblswXS5sZW47Ci0JCQlpZiAoaW8tPm53aW4gPiAxKSB7Ci0JCQkJcGRldi0+aW8uQXR0cmlidXRlczIgPSBwZGV2LT5pby5BdHRyaWJ1dGVzMTsKLQkJCQlwZGV2LT5pby5CYXNlUG9ydDIgPSBpby0+d2luWzFdLmJhc2U7Ci0JCQkJcGRldi0+aW8uTnVtUG9ydHMyID0gaW8tPndpblsxXS5sZW47Ci0JCQl9Ci0JCX0KLQkJLyogVGhpcyByZXNlcnZlcyBJTyBzcGFjZSBidXQgZG9lc24ndCBhY3R1YWxseSBlbmFibGUgaXQgKi8KLQkJQ0ZHX0NIRUNLKFJlcXVlc3RJTywgcGNtY2lhX3JlcXVlc3RfaW8ocGRldiwgJnBkZXYtPmlvKSk7Ci0jZWxzZQotCQlsaW5rLT5pby5OdW1Qb3J0czEgPSBsaW5rLT5pby5OdW1Qb3J0czIgPSAwOwotCQlpZiAoKGNmZy0+aW8ubndpbiA+IDApIHx8IChkZmx0LmlvLm53aW4gPiAwKSkgewotCQkJY2lzdHBsX2lvX3QgKmlvID0gKGNmZy0+aW8ubndpbikgPyAmY2ZnLT5pbyA6ICZkZmx0LmlvOwotCQkJbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKLQkJCWlmICghKGlvLT5mbGFncyAmIENJU1RQTF9JT184QklUKSkKLQkJCQlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF8xNjsKLQkJCWlmICghKGlvLT5mbGFncyAmIENJU1RQTF9JT18xNkJJVCkpCi0JCQkJbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKLQkJCWxpbmstPmlvLkJhc2VQb3J0MSA9IGlvLT53aW5bMF0uYmFzZTsKLQkJCWlmICAoIGxpbmstPmlvLkJhc2VQb3J0MSAhPSAwICkgewotCQkJCVdMQU5fTE9HX1dBUk5JTkcoCi0JCQkJIkJyYWluIGRhbWFnZWQgQ0lTOiBoYXJkIGNvZGVkIGlvYmFzZT0iCi0JCQkJIjB4JXgsIHRyeSBsZXR0aW5nIHBjbWNpYV9jcyBkZWNpZGUuLi5cbiIsCi0JCQkJbGluay0+aW8uQmFzZVBvcnQxICk7Ci0JCQkJbGluay0+aW8uQmFzZVBvcnQxID0gMDsKLQkJCX0KLQkJCWxpbmstPmlvLk51bVBvcnRzMSA9IGlvLT53aW5bMF0ubGVuOwotCQkJaWYgKGlvLT5ud2luID4gMSkgewotCQkJCWxpbmstPmlvLkF0dHJpYnV0ZXMyID0gbGluay0+aW8uQXR0cmlidXRlczE7Ci0JCQkJbGluay0+aW8uQmFzZVBvcnQyID0gaW8tPndpblsxXS5iYXNlOwotCQkJCWxpbmstPmlvLk51bVBvcnRzMiA9IGlvLT53aW5bMV0ubGVuOwotCQkJfQotCQl9Ci0JCS8qIFRoaXMgcmVzZXJ2ZXMgSU8gc3BhY2UgYnV0IGRvZXNuJ3QgYWN0dWFsbHkgZW5hYmxlIGl0ICovCi0JCUNGR19DSEVDSyhSZXF1ZXN0SU8sIHBjbWNpYV9yZXF1ZXN0X2lvKHBkZXYsICZsaW5rLT5pbykpOwotI2VuZGlmCi0JCS8qIElmIHdlIGdvdCB0aGlzIGZhciwgd2UncmUgY29vbCEgKi8KLQkJYnJlYWs7Ci0KLQluZXh0X2VudHJ5OgotCQlpZiAoY2ZnLT5mbGFncyAmIENJU1RQTF9DRlRBQkxFX0RFRkFVTFQpCi0JCQlkZmx0ID0gKmNmZzsKLQkJQ1NfQ0hFQ0soR2V0TmV4dFR1cGxlLCBwY21jaWFfZ2V0X25leHRfdHVwbGUocGRldiwgJnR1cGxlKSk7Ci0KLQl9Ci0KLQkvKiBMZXQgcGNtY2lhIGtub3cgdGhlIGRldmljZSBuYW1lICovCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDE2KQotCXBkZXYtPmRldl9ub2RlID0gJmh3LT5ub2RlOwotI2Vsc2UKLQlsaW5rLT5kZXYgPSAmaHctPm5vZGU7Ci0jZW5kaWYKLQotCS8qIFJlZ2lzdGVyIHRoZSBuZXR3b3JrIGRldmljZSBhbmQgZ2V0IGFzc2lnbmVkIGEgbmFtZSAqLwotCVNFVF9NT0RVTEVfT1dORVIod2xhbmRldi0+bmV0ZGV2KTsKLQlTRVRfTkVUREVWX0RFVih3bGFuZGV2LT5uZXRkZXYsICAmaGFuZGxlX3RvX2RldihwZGV2KSk7Ci0JaWYgKHJlZ2lzdGVyX3dsYW5kZXYod2xhbmRldikgIT0gMCkgewotCQlXTEFOX0xPR19OT1RJQ0UoInByaXNtMnN0YV9jczogcmVnaXN0ZXJfd2xhbmRldigpIGZhaWxlZC5cbiIpOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLQlzdHJjcHkoaHctPm5vZGUuZGV2X25hbWUsIHdsYW5kZXYtPm5hbWUpOwotCi0JLyogQWxsb2NhdGUgYW4gaW50ZXJydXB0IGxpbmUuICBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBhc3NpZ24gYSAqLwotCS8qIGhhbmRsZXIgdG8gdGhlIGludGVycnVwdCwgdW5sZXNzIHRoZSAnSGFuZGxlcicgbWVtYmVyIG9mIHRoZSAqLwotCS8qIGlycSBzdHJ1Y3R1cmUgaXMgaW5pdGlhbGl6ZWQuICovCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDE2KQotCWlmIChwZGV2LT5jb25mLkF0dHJpYnV0ZXMgJiBDT05GX0VOQUJMRV9JUlEpIHsKLQkJcGRldi0+aXJxLklSUUluZm8xID0gSVJRX0xFVkVMX0lEOwotCQlwZGV2LT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRSB8IElSUV9IQU5ETEVfUFJFU0VOVDsKLQkJcGRldi0+aXJxLkhhbmRsZXIgPSBoZmEzODR4X2ludGVycnVwdDsKLQkJcGRldi0+aXJxLkluc3RhbmNlID0gd2xhbmRldjsKLQkJQ1NfQ0hFQ0soUmVxdWVzdElSUSwgcGNtY2lhX3JlcXVlc3RfaXJxKHBkZXYsICZwZGV2LT5pcnEpKTsKLQl9Ci0jZWxzZQotCWlmIChsaW5rLT5jb25mLkF0dHJpYnV0ZXMgJiBDT05GX0VOQUJMRV9JUlEpIHsKLQkJbGluay0+aXJxLklSUUluZm8xID0gSVJRX0xFVkVMX0lEOwotCQlsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRSB8IElSUV9IQU5ETEVfUFJFU0VOVDsKLQkJbGluay0+aXJxLkhhbmRsZXIgPSBoZmEzODR4X2ludGVycnVwdDsKLQkJbGluay0+aXJxLkluc3RhbmNlID0gd2xhbmRldjsKLQkJQ1NfQ0hFQ0soUmVxdWVzdElSUSwgcGNtY2lhX3JlcXVlc3RfaXJxKHBkZXYsICZsaW5rLT5pcnEpKTsKLQl9Ci0jZW5kaWYKLQotCS8qIFRoaXMgYWN0dWFsbHkgY29uZmlndXJlcyB0aGUgUENNQ0lBIHNvY2tldCAtLSBzZXR0aW5nIHVwICovCi0JLyogdGhlIEkvTyB3aW5kb3dzIGFuZCB0aGUgaW50ZXJydXB0IG1hcHBpbmcsIGFuZCBwdXR0aW5nIHRoZSAqLwotCS8qIGNhcmQgYW5kIGhvc3QgaW50ZXJmYWNlIGludG8gIk1lbW9yeSBhbmQgSU8iIG1vZGUuICovCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDE2KQotCUNTX0NIRUNLKFJlcXVlc3RDb25maWd1cmF0aW9uLCBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKHBkZXYsICZwZGV2LT5jb25mKSk7Ci0jZWxzZQotCUNTX0NIRUNLKFJlcXVlc3RDb25maWd1cmF0aW9uLCBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKHBkZXYsICZsaW5rLT5jb25mKSk7Ci0jZW5kaWYKLQotCS8qIEZpbGwgdGhlIG5ldGRldmljZSB3aXRoIHRoaXMgaW5mbyAqLwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxNikKLQl3bGFuZGV2LT5uZXRkZXYtPmlycSA9IHBkZXYtPmlycS5Bc3NpZ25lZElSUTsKLQl3bGFuZGV2LT5uZXRkZXYtPmJhc2VfYWRkciA9IHBkZXYtPmlvLkJhc2VQb3J0MTsKLSNlbHNlCi0Jd2xhbmRldi0+bmV0ZGV2LT5pcnEgPSBsaW5rLT5pcnEuQXNzaWduZWRJUlE7Ci0Jd2xhbmRldi0+bmV0ZGV2LT5iYXNlX2FkZHIgPSBsaW5rLT5pby5CYXNlUG9ydDE7Ci0jZW5kaWYKLQotCS8qIEFuZCB0aGUgcmVzdCBvZiB0aGUgaHcgc3RydWN0dXJlICovCi0JaHctPmlycSA9IHdsYW5kZXYtPm5ldGRldi0+aXJxOwotCWh3LT5pb2Jhc2UgPSB3bGFuZGV2LT5uZXRkZXYtPmJhc2VfYWRkcjsKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwxNykKLQlsaW5rLT5zdGF0ZSB8PSBERVZfQ09ORklHOwotCWxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7Ci0jZW5kaWYKLQotCS8qIEFuZCBub3cgd2UncmUgZG9uZSEgKi8KLQl3bGFuZGV2LT5tc2RzdGF0ZSA9IFdMQU5fTVNEX0hXUFJFU0VOVDsKLQotCWdvdG8gZG9uZTsKLQotIGNzX2ZhaWxlZDoKLSAgICAgICAgY3NfZXJyb3IocGRldiwgbGFzdF9mbiwgbGFzdF9yZXQpOwotCi1mYWlsZWQ6Ci0JLy8gd2xhbmRldiwgaHcsIGV0YyBldGMuLgotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxNikKLQlwZGV2LT5wcml2ID0gTlVMTDsKLSNlbHNlCi0JcGRldi0+aW5zdGFuY2UgPSBOVUxMOwotCWlmIChsaW5rKSB7Ci0JCWxpbmstPnByaXYgPSBOVUxMOwotCQlrZnJlZShsaW5rKTsKLQl9Ci0jZW5kaWYKLQlpZiAod2xhbmRldikgewotCQl3bGFuX3Vuc2V0dXAod2xhbmRldik7Ci0JCWlmICh3bGFuZGV2LT5wcml2KSB7Ci0JCQlodyA9IHdsYW5kZXYtPnByaXY7Ci0JCQl3bGFuZGV2LT5wcml2ID0gTlVMTDsKLQkJCWlmIChodykgewotCQkJCWhmYTM4NHhfZGVzdHJveShodyk7Ci0JCQkJa2ZyZWUoaHcpOwotCQkJfQotCQl9Ci0JCWtmcmVlKHdsYW5kZXYpOwotCX0KLQotZG9uZToKLQlpZiAocGFyc2UpIGtmcmVlKHBhcnNlKTsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJ2YWw7Ci19Ci0jZWxzZSAgLy8gPD0gMi42LjE1Ci0jZGVmaW5lIENTX0NIRUNLKGZuLCByZXQpIFwKLWRvIHsgbGFzdF9mbiA9IChmbik7IGlmICgobGFzdF9yZXQgPSAocmV0KSkgIT0gMCkgZ290byBjc19mYWlsZWQ7IH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQ0ZHX0NIRUNLKGZuLCByZXRmKSBcCi1kbyB7IGludCByZXQgPSAocmV0Zik7IFwKLWlmIChyZXQgIT0gMCkgeyBcCi0gICAgICAgIFdMQU5fTE9HX0RFQlVHKDEsICJDYXJkU2VydmljZXMoIiAjZm4gIikgcmV0dXJuZWQgJWRcbiIsIHJldCk7IFwKLSAgICAgICAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBmbiwgcmV0KTsgXAotICAgICAgICBnb3RvIG5leHRfZW50cnk7IFwKLX0gXAotfSB3aGlsZSAoMCkKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMnN0YV9hdHRhY2gKLSoKLSogSGFsZiBvZiB0aGUgYXR0YWNoL2RldGFjaCBwYWlyLiAgQ3JlYXRlcyBhbmQgcmVnaXN0ZXJzIGEgZGV2aWNlCi0qIGluc3RhbmNlIHdpdGggQ2FyZCBTZXJ2aWNlcy4gIEluIHRoaXMgY2FzZSwgaXQgYWxzbyBjcmVhdGVzIHRoZQotKiB3bGFuZGV2IHN0cnVjdHVyZSBhbmQgZGV2aWNlIHByaXZhdGUgc3RydWN0dXJlLiAgVGhlc2UgYXJlCi0qIGxpbmtlZCB0byB0aGUgZGV2aWNlIGluc3RhbmNlIHZpYSBpdHMgcHJpdiBtZW1iZXIuCi0qCi0qIEFyZ3VtZW50czoKLSoJbm9uZQotKgotKiBSZXR1cm5zOgotKglBIHZhbGlkIHB0ciB0byBkZXZfbGlua190IG9uIHN1Y2Nlc3MsIE5VTEwgb3RoZXJ3aXNlCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZCAoaW5zbW9kL2luaXRfbW9kdWxlL3JlZ2lzdGVyX3BjY2FyZF9kcml2ZXIpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWRldl9saW5rX3QgKnByaXNtMnN0YV9hdHRhY2godm9pZCkKLXsKLQljbGllbnRfcmVnX3QJCWNsaWVudF9yZWc7Ci0JaW50CQkJcmVzdWx0OwotCWRldl9saW5rX3QJCSpsaW5rID0gTlVMTDsKLQl3bGFuZGV2aWNlX3QJCSp3bGFuZGV2ID0gTlVMTDsKLQloZmEzODR4X3QJCSpodyA9IE5VTEw7Ci0KLQlEQkZFTlRFUjsKLQotCS8qIEFsbG9jIG91ciBzdHJ1Y3R1cmVzICovCi0JbGluayA9CQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGV2X2xpbmtfdCksIEdGUF9LRVJORUwpOwotCi0JaWYgKCFsaW5rIHx8ICgod2xhbmRldiA9IGNyZWF0ZV93bGFuKCkpID09IE5VTEwpKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZS5cbiIsIGRldl9pbmZvKTsKLQkJcmVzdWx0ID0gLUVJTzsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCWh3ID0gd2xhbmRldi0+cHJpdjsKLQotCS8qIENsZWFyIGFsbCB0aGUgc3RydWN0cyAqLwotCW1lbXNldChsaW5rLCAwLCBzaXplb2Yoc3RydWN0IGRldl9saW5rX3QpKTsKLQotCWlmICggd2xhbl9zZXR1cCh3bGFuZGV2KSAhPSAwICkgewotCQlXTEFOX0xPR19FUlJPUigiJXM6IHdsYW5fc2V0dXAoKSBmYWlsZWQuXG4iLCBkZXZfaW5mbyk7Ci0JCXJlc3VsdCA9IC1FSU87Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQotCS8qIEluaXRpYWxpemUgdGhlIGh3IHN0cnVjdCBmb3Igbm93ICovCi0JaGZhMzg0eF9jcmVhdGUoaHcsIDAsIDAsIE5VTEwpOwotCWh3LT53bGFuZGV2ID0gd2xhbmRldjsKLQotCS8qIEluaXRpYWxpemUgdGhlIFBDIGNhcmQgZGV2aWNlIG9iamVjdC4gKi8KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDApKQotCWluaXRfdGltZXIoJmxpbmstPnJlbGVhc2UpOwotCWxpbmstPnJlbGVhc2UuZnVuY3Rpb24gPSAmcHJpc20yc3RhX3JlbGVhc2U7Ci0JbGluay0+cmVsZWFzZS5kYXRhID0gKHVfbG9uZylsaW5rOwotI2VuZGlmCi0JbGluay0+Y29uZi5JbnRUeXBlID0gSU5UX01FTU9SWV9BTkRfSU87Ci0JbGluay0+cHJpdiA9IHdsYW5kZXY7Ci0jaWYgKGRlZmluZWQoQ1NfUkVMRUFTRV9DT0RFKSAmJiAoQ1NfUkVMRUFTRV9DT0RFIDwgMHgyOTExKSkKLQlsaW5rLT5pcnEuSW5zdGFuY2UgPSB3bGFuZGV2OwotI2VuZGlmCi0KLQkvKiBMaW5rIGluIHRvIHRoZSBsaXN0IG9mIGRldmljZXMgbWFuYWdlZCBieSB0aGlzIGRyaXZlciAqLwotCWxpbmstPm5leHQgPSBkZXZfbGlzdDsKLQlkZXZfbGlzdCA9IGxpbms7Ci0KLQkvKiBSZWdpc3RlciB3aXRoIENhcmQgU2VydmljZXMgKi8KLQljbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOwotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMTEpICkKLQljbGllbnRfcmVnLkF0dHJpYnV0ZXMgPSBJTkZPX0lPX0NMSUVOVCB8IElORk9fQ0FSRF9TSEFSRTsKLSNlbmRpZgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwxMykgKQotCWNsaWVudF9yZWcuRXZlbnRNYXNrID0KLQkJQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAotCQlDU19FVkVOVF9SRVNFVF9SRVFVRVNUIHwKLQkJQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLQkJQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKLQljbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmcHJpc20yc3RhX2V2ZW50OwotI2VuZGlmCi0KLQljbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7Ci0JY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKLQotCXJlc3VsdCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOwotCWlmIChyZXN1bHQgIT0gMCkgewotCQljc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlZ2lzdGVyQ2xpZW50LCByZXN1bHQpOwotCQlwcmlzbTJzdGFfZGV0YWNoKGxpbmspOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlnb3RvIGRvbmU7Ci0KLSBmYWlsZWQ6Ci0JaWYgKGxpbmspCWtmcmVlKGxpbmspOwotCWlmICh3bGFuZGV2KQlrZnJlZSh3bGFuZGV2KTsKLQlpZiAoaHcpCQlrZnJlZShodyk7Ci0JbGluayA9IE5VTEw7Ci0KLSBkb25lOgotCURCRkVYSVQ7Ci0JcmV0dXJuIGxpbms7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMnN0YV9kZXRhY2gKLSoKLSogUmVtb3ZlIG9uZSBvZiB0aGUgZGV2aWNlIGluc3RhbmNlcyBtYW5hZ2VkIGJ5IHRoaXMgZHJpdmVyLgotKiAgIFNlYXJjaCB0aGUgbGlzdCBmb3IgdGhlIGdpdmVuIGluc3RhbmNlLAotKiAgIGNoZWNrIG91ciBmbGFncyBmb3IgYSB3YWl0aW5nIHRpbWVyJ2QgcmVsZWFzZSBjYWxsCi0qICAgY2FsbCByZWxlYXNlCi0qICAgRGVyZWdpc3RlciB0aGUgaW5zdGFuY2Ugd2l0aCBDYXJkIFNlcnZpY2VzCi0qICAgKG5ldGRldmljZSkgdW5yZWdpc3RlciB0aGUgbmV0d29yayBkZXZpY2UuCi0qICAgdW5saW5rIHRoZSBpbnN0YW5jZSBmcm9tIHRoZSBsaXN0Ci0qICAgZnJlZSB0aGUgbGluaywgcHJpdiwgYW5kIHByaXYtPnByaXYgbWVtb3J5Ci0qIE5vdGU6IHRoZSBkZXZfbGlzdCB2YXJpYWJsZSBpcyBhIGRyaXZlciBzY29wZWQgc3RhdGljIHVzZWQgdG8KLSoJbWFpbnRhaW4gYSBsaXN0IG9mIGRldmljZSBpbnN0YW5jZXMgbWFuYWdlZCBieSB0aGlzCi0qCWRyaXZlci4KLSoKLSogQXJndW1lbnRzOgotKglsaW5rCXB0ciB0byB0aGUgaW5zdGFuY2UgdG8gZGV0YWNoCi0qCi0qIFJldHVybnM6Ci0qCW5vdGhpbmcKLSoKLSogU2lkZSBlZmZlY3RzOgotKgl0aGUgbGluayBzdHJ1Y3R1cmUgaXMgZ29uZSwgdGhlIG5ldGRldmljZSBpcyBnb25lCi0qCi0qIENhbGwgY29udGV4dDoKLSoJTWlnaHQgYmUgaW50ZXJydXB0LCBkb24ndCBibG9jay4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBwcmlzbTJzdGFfZGV0YWNoKGRldl9saW5rX3QgKmxpbmspCi17Ci0JZGV2X2xpbmtfdAkJKipsaW5rcDsKLQl3bGFuZGV2aWNlX3QJCSp3bGFuZGV2OwotCWhmYTM4NHhfdAkJKmh3OwotCi0JREJGRU5URVI7Ci0KLQkvKiBMb2NhdGUgcHJldiBkZXZpY2Ugc3RydWN0dXJlICovCi0JZm9yIChsaW5rcCA9ICZkZXZfbGlzdDsgKmxpbmtwOyBsaW5rcCA9ICYoKmxpbmtwKS0+bmV4dCkgewotCQlpZiAoKmxpbmtwID09IGxpbmspIGJyZWFrOwotCX0KLQotCWlmICgqbGlua3AgIT0gTlVMTCkgewotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDQsMCkpCi0JCXVuc2lnbmVkIGxvbmcJZmxhZ3M7Ci0JCS8qIEdldCByaWQgb2YgYW55IHRpbWVyJ2QgcmVsZWFzZSBjYWxsICovCi0JCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCQljbGkoKTsKLSNlbmRpZgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwwKSkKLQkJaWYgKGxpbmstPnN0YXRlICYgREVWX1JFTEVBU0VfUEVORElORykgewotCQkJZGVsX3RpbWVyX3N5bmMoJmxpbmstPnJlbGVhc2UpOwotCQkJbGluay0+c3RhdGUgJj0gfkRFVl9SRUxFQVNFX1BFTkRJTkc7Ci0JCX0KLSNlbmRpZgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNCwwKSkKLQkJcmVzdG9yZV9mbGFncyhmbGFncyk7Ci0jZW5kaWYKLQotCQkvKiBJZiBsaW5rIHNheXMgd2UncmUgc3RpbGwgY29uZmlnJ2QsIGNhbGwgcmVsZWFzZSAqLwotCQlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7Ci0JCQlwcmlzbTJzdGFfcmVsZWFzZSgodV9sb25nKWxpbmspOwotCQkJaWYgKGxpbmstPnN0YXRlICYgREVWX1NUQUxFX0NPTkZJRykgewotCQkJCWxpbmstPnN0YXRlIHw9IERFVl9TVEFMRV9MSU5LOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCS8qIFRlbGwgQ2FyZCBTZXJ2aWNlcyB3ZSdyZSBub3QgYXJvdW5kIGFueSBtb3JlICovCi0JCWlmIChsaW5rLT5oYW5kbGUpIHsKLQkJCXBjbWNpYV9kZXJlZ2lzdGVyX2NsaWVudChsaW5rLT5oYW5kbGUpOwotCQl9Ci0KLQkJLyogVW5saW5rIGRldmljZSBzdHJ1Y3R1cmUsIGZyZWUgYml0cyAqLwotCQkqbGlua3AgPSBsaW5rLT5uZXh0OwotCQlpZiAoIGxpbmstPnByaXYgIT0gTlVMTCApIHsKLQkJCXdsYW5kZXYgPSAod2xhbmRldmljZV90KilsaW5rLT5wcml2OwotCQkJcDgwMjExbmV0ZGV2X2h3cmVtb3ZlZCh3bGFuZGV2KTsKLQkJCWlmIChsaW5rLT5kZXYgIT0gTlVMTCkgewotCQkJCXVucmVnaXN0ZXJfd2xhbmRldih3bGFuZGV2KTsKLQkJCX0KLQkJCXdsYW5fdW5zZXR1cCh3bGFuZGV2KTsKLQkJCWlmICh3bGFuZGV2LT5wcml2KSB7Ci0JCQkJaHcgPSB3bGFuZGV2LT5wcml2OwotCQkJCXdsYW5kZXYtPnByaXYgPSBOVUxMOwotCQkJCWlmIChodykgewotCQkJCQloZmEzODR4X2Rlc3Ryb3koaHcpOwotCQkJCQlrZnJlZShodyk7Ci0JCQkJfQotCQkJfQotCQkJbGluay0+cHJpdiA9IE5VTEw7Ci0JCQlrZnJlZSh3bGFuZGV2KTsKLQkJfQotCQlrZnJlZShsaW5rKTsKLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybjsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMnN0YV9jb25maWcKLSoKLSogSGFsZiBvZiB0aGUgY29uZmlnL3JlbGVhc2UgcGFpci4gIFVzdWFsbHkgY2FsbGVkIGluIHJlc3BvbnNlIHRvCi0qIGEgY2FyZCBpbnNlcnRpb24gZXZlbnQuICBBdCB0aGlzIHBvaW50LCB3ZSBfa25vd18gdGhlcmUncyBzb21lCi0qIHBoeXNpY2FsIGRldmljZSBwcmVzZW50LiAgVGhhdCBtZWFucyB3ZSBjYW4gc3RhcnQgcG9raW5nIGFyb3VuZAotKiBhdCB0aGUgQ0lTIGFuZCBhdCBhbnkgZGV2aWNlIHNwZWNpZmljIGNvbmZpZyBkYXRhIHdlIHdhbnQuCi0qCi0qIE5vdGUgdGhlIGdvdG9zIGFuZCB0aGUgbWFjcm9zLiAgSSByZWNvZGVkIHRoaXMgb25jZSB3aXRob3V0Ci0qIHRoZW0sIGFuZCBpdCBnb3QgaW5jcmVkaWJseSB1Z2x5LiAgSXQncyBhY3R1YWxseSBzaW1wbGVyIHdpdGgKLSogdGhlbS4KLSoKLSogQXJndW1lbnRzOgotKglsaW5rCXRoZSBkZXZfbGlua190IHN0cnVjdHVyZSBjcmVhdGVkIGluIGF0dGFjaCB0aGF0Ci0qCQlyZXByZXNlbnRzIHRoaXMgZGV2aWNlIGluc3RhbmNlLgotKgotKiBSZXR1cm5zOgotKglub3RoaW5nCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoJUmVzb3VyY2VzIChpcnEsIGlvLCBtZW0pIGFyZSBhbGxvY2F0ZWQKLSoJVGhlIHBjbWNpYSBkZXZfbGluay0+bm9kZS0+bmFtZSBpcyBzZXQKLSoJKEZvciBuZXRjYXJkcykgVGhlIGRldmljZSBzdHJ1Y3R1cmUgaXMgZmluaXNoZWQgYW5kLAotKgkgIG1vc3QgaW1wb3J0YW50bHksIHJlZ2lzdGVyZWQuICBUaGlzIG1lYW5zIHRoYXQgdGhlcmUKLSoJICBpcyBub3cgYSBfbmFtZWRfIGRldmljZSB0aGF0IGNhbiBiZSBjb25maWd1cmVkIGZyb20KLSoJICB1c2VybGFuZC4KLSoKLSogQ2FsbCBjb250ZXh0OgotKglNYXkgYmUgY2FsbGVkIGZyb20gYSB0aW1lci4gIERvbid0IGJsb2NrIQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lIENTX0NIRUNLKGZuLCByZXQpIFwKLWRvIHsgbGFzdF9mbiA9IChmbik7IGlmICgobGFzdF9yZXQgPSAocmV0KSkgIT0gMCkgZ290byBjc19mYWlsZWQ7IH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQ0ZHX0NIRUNLKGZuLCByZXRmKSBcCi1kbyB7IGludCByZXQgPSAocmV0Zik7IFwKLWlmIChyZXQgIT0gMCkgeyBcCi0gICAgICAgIFdMQU5fTE9HX0RFQlVHKDEsICJDYXJkU2VydmljZXMoIiAjZm4gIikgcmV0dXJuZWQgJWRcbiIsIHJldCk7IFwKLSAgICAgICAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBmbiwgcmV0KTsgXAotICAgICAgICBnb3RvIG5leHRfZW50cnk7IFwKLX0gXAotfSB3aGlsZSAoMCkKLQotdm9pZCBwcmlzbTJzdGFfY29uZmlnKGRldl9saW5rX3QgKmxpbmspCi17Ci0JY2xpZW50X2hhbmRsZV90CQloYW5kbGU7Ci0Jd2xhbmRldmljZV90CQkqd2xhbmRldjsKLQloZmEzODR4X3QgICAgICAgICAgICAgICAqaHc7Ci0JaW50CQkJbGFzdF9mbjsKLQlpbnQJCQlsYXN0X3JldDsKLQl0dXBsZV90CQkJdHVwbGU7Ci0JY2lzcGFyc2VfdAkJcGFyc2U7Ci0JY29uZmlnX2luZm9fdAkJc29ja2V0Y29uZjsKLQlVSU5UOAkJCWJ1Zls2NF07Ci0JaW50CQkJbWluVmNjID0gMDsKLQlpbnQJCQltYXhWY2MgPSAwOwotCWNpc3RwbF9jZnRhYmxlX2VudHJ5X3QJZGZsdCA9IHsgMCB9OwotCi0JREJGRU5URVI7Ci0KLQloYW5kbGUgPSBsaW5rLT5oYW5kbGU7Ci0Jd2xhbmRldiA9ICh3bGFuZGV2aWNlX3QqKWxpbmstPnByaXY7Ci0JaHcgPSB3bGFuZGV2LT5wcml2OwotCi0JLyogQ29sbGVjdCB0aGUgY29uZmlnIHJlZ2lzdGVyIGluZm8gKi8KLQl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOwotCXR1cGxlLkF0dHJpYnV0ZXMgPSAwOwotCXR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKLQl0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKLQl0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0JQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOwotCUNTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSk7Ci0JQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpKTsKLQotCWxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOwotCWxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKLQotCS8qIENvbmZpZ3VyZSBjYXJkICovCi0JbGluay0+c3RhdGUgfD0gREVWX0NPTkZJRzsKLQotCS8qIEFjcXVpcmUgdGhlIGN1cnJlbnQgc29ja2V0IGNvbmZpZyAobmVlZCBWY2Mgc2V0dGluZykgKi8KLQlDU19DSEVDSyhHZXRDb25maWd1cmF0aW9uSW5mbywgcGNtY2lhX2dldF9jb25maWd1cmF0aW9uX2luZm8oaGFuZGxlLCAmc29ja2V0Y29uZikpOwotCi0JLyogTG9vcCB0aHJvdWdoIHRoZSBjb25maWcgdGFibGUgZW50cmllcyB1bnRpbCB3ZSBmaW5kIG9uZSB0aGF0IHdvcmtzICovCi0JLyogQXNzdW1lcyBhIGNvbXBsZXRlIGFuZCB2YWxpZCBDSVMgKi8KLQl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ0ZUQUJMRV9FTlRSWTsKLQlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7Ci0Jd2hpbGUgKDEpIHsKLQkJY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqY2ZnID0gJihwYXJzZS5jZnRhYmxlX2VudHJ5KTsKLQkJQ0ZHX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSk7Ci0JCUNGR19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkpOwotCi0JCWlmIChjZmctPmluZGV4ID09IDApIGdvdG8gbmV4dF9lbnRyeTsKLQkJbGluay0+Y29uZi5Db25maWdJbmRleCA9IGNmZy0+aW5kZXg7Ci0KLQkJLyogTGV0cyBwcmludCBvdXQgdGhlIFZjYyB0aGF0IHRoZSBjb250cm9sbGVyK3BjbWNpYS1jcyBzZXQKLQkJICogZm9yIHVzLCBjYXVzZSB0aGF0J3Mgd2hhdCB3ZSdyZSBnb2luZyB0byB1c2UuCi0JCSAqLwotCQlXTEFOX0xPR19ERUJVRygxLCJJbml0aWFsIFZjYz0lZC8xMHZcbiIsIHNvY2tldGNvbmYuVmNjKTsKLQkJaWYgKHByaXNtMl9pZ25vcmV2Y2MpIHsKLQkJCWxpbmstPmNvbmYuVmNjID0gc29ja2V0Y29uZi5WY2M7Ci0JCQlnb3RvIHNraXB2Y2M7Ci0JCX0KLQotCQkvKiBVc2UgcG93ZXIgc2V0dGluZ3MgZm9yIFZjYyBhbmQgVnBwIGlmIHByZXNlbnQgKi8KLQkJLyogTm90ZSB0aGF0IHRoZSBDSVMgdmFsdWVzIG5lZWQgdG8gYmUgcmVzY2FsZWQgKi8KLQkJaWYgKGNmZy0+dmNjLnByZXNlbnQgJiAoMTw8Q0lTVFBMX1BPV0VSX1ZOT00pKSB7Ci0JCQlXTEFOX0xPR19ERUJVRygxLCAiVmNjIG9idGFpbmVkIGZyb20gY3VydHVwbC5WTk9NXG4iKTsKLQkJCW1pblZjYyA9IG1heFZjYyA9Ci0JCQkJY2ZnLT52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dLzEwMDAwOwotCQl9IGVsc2UgaWYgKGRmbHQudmNjLnByZXNlbnQgJiAoMTw8Q0lTVFBMX1BPV0VSX1ZOT00pKSB7Ci0JCQlXTEFOX0xPR19ERUJVRygxLCAiVmNjIHNldCBmcm9tIGRmbHQuVk5PTVxuIik7Ci0JCQltaW5WY2MgPSBtYXhWY2MgPQotCQkJCWRmbHQudmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXS8xMDAwMDsKLQkJfSBlbHNlIGlmICgoY2ZnLT52Y2MucHJlc2VudCAmICgxPDxDSVNUUExfUE9XRVJfVk1BWCkpICYmCi0JCQkgICAoY2ZnLT52Y2MucHJlc2VudCAmICgxPDxDSVNUUExfUE9XRVJfVk1JTikpICkgewotCQkJV0xBTl9MT0dfREVCVUcoMSwgIlZjYyBzZXQgZnJvbSBjdXJ0dXBsKFZNSU4sVk1BWClcbiIpOwkJCW1pblZjYyA9IGNmZy0+dmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTUlOXS8xMDAwMDsKLQkJCW1heFZjYyA9IGNmZy0+dmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTUFYXS8xMDAwMDsKLQkJfSBlbHNlIGlmICgoZGZsdC52Y2MucHJlc2VudCAmICgxPDxDSVNUUExfUE9XRVJfVk1BWCkpICYmCi0JCQkgICAoZGZsdC52Y2MucHJlc2VudCAmICgxPDxDSVNUUExfUE9XRVJfVk1JTikpICkgewotCQkJV0xBTl9MT0dfREVCVUcoMSwgIlZjYyBzZXQgZnJvbSBkZmx0KFZNSU4sVk1BWClcbiIpOwotCQkJbWluVmNjID0gZGZsdC52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZNSU5dLzEwMDAwOwotCQkJbWF4VmNjID0gZGZsdC52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZNQVhdLzEwMDAwOwotCQl9Ci0KLQkJaWYgKCBzb2NrZXRjb25mLlZjYyA+PSBtaW5WY2MgJiYgc29ja2V0Y29uZi5WY2MgPD0gbWF4VmNjKSB7Ci0JCQlsaW5rLT5jb25mLlZjYyA9IHNvY2tldGNvbmYuVmNjOwotCQl9IGVsc2UgewotCQkJLyogW01TTV06IE5vdGUgdGhhdCBJJ3ZlIGdpdmVuIHVwIHRyeWluZyB0byBjaGFuZ2UKLQkJCSAqIHRoZSBWY2MgaWYgYSBjaGFuZ2UgaXMgaW5kaWNhdGVkLiAgSXQgc2VlbXMgdGhlCi0JCQkgKiBzeXN0ZW0mc29ja2V0Y29udHJvbGxlciZjYXJkIHZlbmRvcnMgY2FuJ3Qgc2VlbQotCQkJICogdG8gZ2V0IGl0IHJpZ2h0LCBzbyBJJ20gdGlyZWQgb2YgdHJ5aW5nIHRvIGhhY2sKLQkJCSAqIG15IHdheSBhcm91bmQgaXQuICBwY21jaWEtY3MgZG9lcyBpdHMgYmVzdCB1c2luZwotCQkJICogdGhlIHZvbHRhZ2Ugc2Vuc2UgcGlucyBidXQgc29tZXRpbWVzIHRoZSBjb250cm9sbGVyCi0JCQkgKiBsaWVzLiAgVGhlbiwgZXZlbiBpZiB3ZSBoYXZlIGEgZ29vZCByZWFkIG9uIHRoZSBWUwotCQkJICogcGlucywgc29tZSBzeXN0ZW0gZGVzaWducyB3aWxsIHNpbGVudGx5IGlnbm9yZSBvdXIKLQkJCSAqIHJlcXVlc3RzIHRvIHNldCB0aGUgdm9sdGFnZS4gIEFkZGl0aW9uYWxseSwgc29tZQotCQkJICogdmVuZG9ycyBoYXZlIDMuM3YgaW5kaWNhdGVkIG9uIHRoZWlyIHNlbnNlIHBpbnMsCi0JCQkgKiBidXQgNXYgc3BlY2lmaWVkIGluIHRoZSBDSVMgb3IgdmljZS12ZXJzYS4gIEkndmUKLQkJCSAqIGhhZCBpdC4gIE15IG9ubHkgcmVjb21tZW5kYXRpb24gaXMgImxldCB0aGUgYnV5ZXIKLQkJCSAqIGJld2FyZSIuICBZb3VyIHN5c3RlbSBtaWdodCBzdXBwbHkgNXYgdG8gYSAzdiBjYXJkCi0JCQkgKiAocG9zc2libHkgY2F1c2luZyBkYW1hZ2UpIG9yIGEgM3YgY2FwYWJsZSBzeXN0ZW0KLQkJCSAqIG1pZ2h0IHN1cHBseSA1diB0byBhIDN2IGNhcGFibGUgY2FyZCAod2FzdGluZwotCQkJICogcHJlY2lvdXMgYmF0dGVyeSBsaWZlKS4KLQkJCSAqIE15IG9ubHkgcmVjb21tZW5kYXRpb24gKGlmIHlvdSBjYXJlKSBpcyB0byBnZXQKLQkJCSAqIHlvdXJzZWxmIGFuIGV4dGVuZGVyIGNhcmQgKEkgZG9uJ3Qga25vdyB3aGVyZSwgSQotCQkJICogaGF2ZSBvbmx5IG9uZSBteXNlbGYpIGFuZCBhIG1ldGVyIGFuZCB0ZXN0IGl0IGZvcgotCQkJICogeW91cnNlbGYuCi0JCQkgKi8KLQkJCWdvdG8gbmV4dF9lbnRyeTsKLQkJfQotc2tpcHZjYzoKLQkJV0xBTl9MT0dfREVCVUcoMSwgImxpbmstPmNvbmYuVmNjPSVkXG4iLCBsaW5rLT5jb25mLlZjYyk7Ci0KLQkJLyogRG8gd2UgbmVlZCB0byBhbGxvY2F0ZSBhbiBpbnRlcnJ1cHQ/ICovCi0JCS8qIEhBQ0s6IGR1ZSB0byBhIGJhZCBDSVMuLi4ud2UgQUxXQVlTIG5lZWQgYW4gaW50ZXJydXB0ICovCi0JCS8qIGlmIChjZmctPmlycS5JUlFJbmZvMSB8fCBkZmx0LmlycS5JUlFJbmZvMSkgKi8KLQkJCWxpbmstPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9JUlE7Ci0KLQkJLyogSU8gd2luZG93IHNldHRpbmdzICovCi0JCWxpbmstPmlvLk51bVBvcnRzMSA9IGxpbmstPmlvLk51bVBvcnRzMiA9IDA7Ci0JCWlmICgoY2ZnLT5pby5ud2luID4gMCkgfHwgKGRmbHQuaW8ubndpbiA+IDApKSB7Ci0JCQljaXN0cGxfaW9fdCAqaW8gPSAoY2ZnLT5pby5ud2luKSA/ICZjZmctPmlvIDogJmRmbHQuaW87Ci0JCQlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOwotCQkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzhCSVQpKQotCQkJCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzE2OwotCQkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzE2QklUKSkKLQkJCQlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF84OwotCQkJbGluay0+aW8uQmFzZVBvcnQxID0gaW8tPndpblswXS5iYXNlOwotCQkJaWYgICggbGluay0+aW8uQmFzZVBvcnQxICE9IDAgKSB7Ci0JCQkJV0xBTl9MT0dfV0FSTklORygKLQkJCQkiQnJhaW4gZGFtYWdlZCBDSVM6IGhhcmQgY29kZWQgaW9iYXNlPSIKLQkJCQkiMHgleCwgdHJ5IGxldHRpbmcgcGNtY2lhX2NzIGRlY2lkZS4uLlxuIiwKLQkJCQlsaW5rLT5pby5CYXNlUG9ydDEgKTsKLQkJCQlsaW5rLT5pby5CYXNlUG9ydDEgPSAwOwotCQkJfQotCQkJbGluay0+aW8uTnVtUG9ydHMxID0gaW8tPndpblswXS5sZW47Ci0JCQlpZiAoaW8tPm53aW4gPiAxKSB7Ci0JCQkJbGluay0+aW8uQXR0cmlidXRlczIgPSBsaW5rLT5pby5BdHRyaWJ1dGVzMTsKLQkJCQlsaW5rLT5pby5CYXNlUG9ydDIgPSBpby0+d2luWzFdLmJhc2U7Ci0JCQkJbGluay0+aW8uTnVtUG9ydHMyID0gaW8tPndpblsxXS5sZW47Ci0JCQl9Ci0JCX0KLQotCQkvKiBUaGlzIHJlc2VydmVzIElPIHNwYWNlIGJ1dCBkb2Vzbid0IGFjdHVhbGx5IGVuYWJsZSBpdCAqLwotCQlDRkdfQ0hFQ0soUmVxdWVzdElPLCBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbykpOwotCi0JCS8qIElmIHdlIGdvdCB0aGlzIGZhciwgd2UncmUgY29vbCEgKi8KLQkJYnJlYWs7Ci0KLW5leHRfZW50cnk6Ci0JCWlmIChjZmctPmZsYWdzICYgQ0lTVFBMX0NGVEFCTEVfREVGQVVMVCkKLQkJCWRmbHQgPSAqY2ZnOwotCQlDU19DSEVDSyhHZXROZXh0VHVwbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGNtY2lhX2dldF9uZXh0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7Ci0JfQotCi0JLyogQWxsb2NhdGUgYW4gaW50ZXJydXB0IGxpbmUuICBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBhc3NpZ24gYSAqLwotCS8qIGhhbmRsZXIgdG8gdGhlIGludGVycnVwdCwgdW5sZXNzIHRoZSAnSGFuZGxlcicgbWVtYmVyIG9mIHRoZSAqLwotCS8qIGlycSBzdHJ1Y3R1cmUgaXMgaW5pdGlhbGl6ZWQuICovCi0JaWYgKGxpbmstPmNvbmYuQXR0cmlidXRlcyAmIENPTkZfRU5BQkxFX0lSUSkKLQl7Ci0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwxMSkgKQotCQlpbnQJCQlpOwotCQlsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfSU5GTzJfVkFMSUQgfCBJUlFfTEVWRUxfSUQ7Ci0JCWlmIChpcnFfbGlzdFswXSA9PSAtMSkKLQkJCWxpbmstPmlycS5JUlFJbmZvMiA9IGlycV9tYXNrOwotCQllbHNlCi0JCQlmb3IgKGk9MDsgaTw0OyBpKyspCi0JCQkJbGluay0+aXJxLklSUUluZm8yIHw9IDEgPDwgaXJxX2xpc3RbaV07Ci0jZWxzZQotCQlsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfTEVWRUxfSUQ7Ci0jZW5kaWYKLQkJbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9FWENMVVNJVkUgfCBJUlFfSEFORExFX1BSRVNFTlQ7Ci0JCWxpbmstPmlycS5IYW5kbGVyID0gaGZhMzg0eF9pbnRlcnJ1cHQ7Ci0JCWxpbmstPmlycS5JbnN0YW5jZSA9IHdsYW5kZXY7Ci0JCUNTX0NIRUNLKFJlcXVlc3RJUlEsIHBjbWNpYV9yZXF1ZXN0X2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpKTsKLQl9Ci0KLQkvKiBUaGlzIGFjdHVhbGx5IGNvbmZpZ3VyZXMgdGhlIFBDTUNJQSBzb2NrZXQgLS0gc2V0dGluZyB1cCAqLwotCS8qIHRoZSBJL08gd2luZG93cyBhbmQgdGhlIGludGVycnVwdCBtYXBwaW5nLCBhbmQgcHV0dGluZyB0aGUgKi8KLQkvKiBjYXJkIGFuZCBob3N0IGludGVyZmFjZSBpbnRvICJNZW1vcnkgYW5kIElPIiBtb2RlLiAqLwotCUNTX0NIRUNLKFJlcXVlc3RDb25maWd1cmF0aW9uLCBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpKTsKLQotCS8qIEZpbGwgdGhlIG5ldGRldmljZSB3aXRoIHRoaXMgaW5mbyAqLwotCXdsYW5kZXYtPm5ldGRldi0+aXJxID0gbGluay0+aXJxLkFzc2lnbmVkSVJROwotCXdsYW5kZXYtPm5ldGRldi0+YmFzZV9hZGRyID0gbGluay0+aW8uQmFzZVBvcnQxOwotCi0JLyogUmVwb3J0IHdoYXQgd2UndmUgZG9uZSAqLwotCVdMQU5fTE9HX0lORk8oIiVzOiBpbmRleCAweCUwMng6IFZjYyAlZC4lZCIsCi0JCWRldl9pbmZvLCBsaW5rLT5jb25mLkNvbmZpZ0luZGV4LAotCQlsaW5rLT5jb25mLlZjYy8xMCwgbGluay0+Y29uZi5WY2MlMTApOwotCWlmIChsaW5rLT5jb25mLlZwcDEpCi0JCXByaW50aygiLCBWcHAgJWQuJWQiLCBsaW5rLT5jb25mLlZwcDEvMTAsIGxpbmstPmNvbmYuVnBwMSUxMCk7Ci0JaWYgKGxpbmstPmNvbmYuQXR0cmlidXRlcyAmIENPTkZfRU5BQkxFX0lSUSkKLQkJcHJpbnRrKCIsIGlycSAlZCIsIGxpbmstPmlycS5Bc3NpZ25lZElSUSk7Ci0JaWYgKGxpbmstPmlvLk51bVBvcnRzMSkKLQkJcHJpbnRrKCIsIGlvIDB4JTA0eC0weCUwNHgiLCBsaW5rLT5pby5CYXNlUG9ydDEsIGxpbmstPmlvLkJhc2VQb3J0MStsaW5rLT5pby5OdW1Qb3J0czEtMSk7Ci0JaWYgKGxpbmstPmlvLk51bVBvcnRzMikKLQkJcHJpbnRrKCIgJiAweCUwNHgtMHglMDR4IiwgbGluay0+aW8uQmFzZVBvcnQyLCBsaW5rLT5pby5CYXNlUG9ydDIrbGluay0+aW8uTnVtUG9ydHMyLTEpOwotCXByaW50aygiXG4iKTsKLQotCWxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7Ci0KLQkvKiBMZXQgcGNtY2lhIGtub3cgdGhlIGRldmljZSBuYW1lICovCi0JbGluay0+ZGV2ID0gJmh3LT5ub2RlOwotCi0JLyogUmVnaXN0ZXIgdGhlIG5ldHdvcmsgZGV2aWNlIGFuZCBnZXQgYXNzaWduZWQgYSBuYW1lICovCi0JU0VUX01PRFVMRV9PV05FUih3bGFuZGV2LT5uZXRkZXYpOwotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDExKSApCi0JU0VUX05FVERFVl9ERVYod2xhbmRldi0+bmV0ZGV2LCAgJmhhbmRsZV90b19kZXYobGluay0+aGFuZGxlKSk7Ci0jZW5kaWYKLQlpZiAocmVnaXN0ZXJfd2xhbmRldih3bGFuZGV2KSAhPSAwKSB7Ci0JCVdMQU5fTE9HX05PVElDRSgicHJpc20yc3RhX2NzOiByZWdpc3Rlcl93bGFuZGV2KCkgZmFpbGVkLlxuIik7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQotCXN0cmNweShody0+bm9kZS5kZXZfbmFtZSwgd2xhbmRldi0+bmFtZSk7Ci0KLQkvKiBBbnkgZGV2aWNlIGN1c3RvbSBjb25maWcvcXVlcnkgc3R1ZmYgc2hvdWxkIGJlIGRvbmUgaGVyZSAqLwotCS8qIEZvciBhIG5ldGRldmljZSwgd2Ugc2hvdWxkIGF0IGxlYXN0IGdyYWIgdGhlIG1hYyBhZGRyZXNzICovCi0KLQlyZXR1cm47Ci1jc19mYWlsZWQ6Ci0JY3NfZXJyb3IobGluay0+aGFuZGxlLCBsYXN0X2ZuLCBsYXN0X3JldCk7Ci0JV0xBTl9MT0dfRVJST1IoIk5leHRUdXBsZSBmYWlsdXJlPyBJdCdzIHByb2JhYmx5IGEgVmNjIG1pc21hdGNoLlxuIik7Ci0KLWZhaWxlZDoKLQlwcmlzbTJzdGFfcmVsZWFzZSgodV9sb25nKWxpbmspOwotCXJldHVybjsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMnN0YV9yZWxlYXNlCi0qCi0qIEhhbGYgb2YgdGhlIGNvbmZpZy9yZWxlYXNlIHBhaXIuICBVc3VhbGx5IGNhbGxlZCBpbiByZXNwb25zZSB0bwotKiBhIGNhcmQgZWplY3Rpb24gZXZlbnQuICBDaGVja3MgdG8gbWFrZSBzdXJlIG5vIGhpZ2hlciBsYXllcnMKLSogYXJlIHN0aWxsIChvciB0aGluayB0aGV5IGFyZSkgdXNpbmcgdGhlIGNhcmQgdmlhIHRoZSBsaW5rLT5vcGVuCi0qIGZpZWxkLgotKgotKiBOT1RFOiBEb24ndCBmb3JnZXQgdG8gaW5jcmVtZW50IHRoZSBsaW5rLT5vcGVuIHZhcmlhYmxlIGluIHRoZQotKiAgZGV2aWNlX29wZW4gbWV0aG9kLCBhbmQgZGVjcmVtZW50IGl0IGluIHRoZSBkZXZpY2VfY2xvc2UKLSogIG1ldGhvZC4KLSoKLSogQXJndW1lbnRzOgotKglhcmcJYSBnZW5lcmljIDMyIGJpdCB2YXJpYWJsZS4gIEl0J3MgdGhlIHZhbHVlIHRoYXQKLSoJCXdlIGFzc2lnbmVkIHRvIGxpbmstPnJlbGVhc2UuZGF0YSBpbiBzdGFfYXR0YWNoKCkuCi0qCi0qIFJldHVybnM6Ci0qCW5vdGhpbmcKLSoKLSogU2lkZSBlZmZlY3RzOgotKglBbGwgcmVzb3VyY2VzIHNob3VsZCBiZSByZWxlYXNlZCBhZnRlciB0aGlzIGZ1bmN0aW9uCi0qCWV4ZWN1dGVzIGFuZCBmaW5kcyB0aGUgZGV2aWNlICFvcGVuLgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCVBvc3NpYmx5IGluIGEgdGltZXIgY29udGV4dC4gIERvbid0IGRvIGFueXRoaW5nIHRoYXQnbGwKLSoJYmxvY2suCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgcHJpc20yc3RhX3JlbGVhc2UodV9sb25nIGFyZykKLXsKLSAgICAgICAgZGV2X2xpbmtfdAkqbGluayA9IChkZXZfbGlua190ICopYXJnOwotCi0JREJGRU5URVI7Ci0KLQkvKiBGaXJzdCB0aGluZyB3ZSBzaG91bGQgZG8gaXMgZ2V0IHRoZSBNU0QgYmFjayB0byB0aGUKLQkgKiBIV1BSRVNFTlQgc3RhdGUuICBJLmUuIGV2ZXJ5dGhpbmcgcXVpZXNjZW50LgotCSAqLwotCXByaXNtMnN0YV9pZnN0YXRlKGxpbmstPnByaXYsIFA4MDIxMUVOVU1faWZzdGF0ZV9kaXNhYmxlKTsKLQotICAgICAgICBpZiAobGluay0+b3BlbikgewotCQkvKiBUT0RPOiBJIGRvbid0IHRoaW5rIHdlJ3JlIGV2ZW4gdXNpbmcgdGhpcyBiaXQgb2YgY29kZQotCQkgKiBhbmQgSSBkb24ndCB0aGluayBpdCdzIGh1cnRpbmcgdXMgYXQgdGhlIG1vbWVudC4KLQkJICovCi0gICAgICAgICAgICAgICAgV0xBTl9MT0dfREVCVUcoMSwKLQkJCSJwcmlzbTJzdGFfY3M6IHJlbGVhc2UgcG9zdHBvbmVkLCAnJXMnIHN0aWxsIG9wZW5cbiIsCi0JCQlsaW5rLT5kZXYtPmRldl9uYW1lKTsKLSAgICAgICAgICAgICAgICBsaW5rLT5zdGF0ZSB8PSBERVZfU1RBTEVfQ09ORklHOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKLSAgICAgICAgcGNtY2lhX3JlbGVhc2VfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOwotICAgICAgICBwY21jaWFfcmVsZWFzZV9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKTsKLQotICAgICAgICBsaW5rLT5zdGF0ZSAmPSB+KERFVl9DT05GSUcgfCBERVZfUkVMRUFTRV9QRU5ESU5HKTsKLQotCURCRkVYSVQ7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJzdGFfZXZlbnQKLSoKLSogSGFuZGxlciBmb3IgY2FyZCBzZXJ2aWNlcyBldmVudHMuCi0qCi0qIEFyZ3VtZW50czoKLSoJZXZlbnQJCVRoZSBldmVudCBjb2RlCi0qCXByaW9yaXR5CWhpL2xvdyAtIFJFTU9WQUwgaXMgdGhlIG9ubHkgaGkKLSoJYXJncwkJcHRyIHRvIGNhcmQgc2VydmljZXMgc3RydWN0IGNvbnRhaW5pbmcgaW5mbyBhYm91dAotKgkJCXBjbWNpYSBzdGF0dXMKLSoKLSogUmV0dXJuczoKLSoJWmVybyBvbiBzdWNjZXNzLCBub24temVybyBvdGhlcndpc2UKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCUJvdGggaW50ZXJydXB0IGFuZCBwcm9jZXNzIHRocmVhZCwgZGVwZW5kcyBvbiB0aGUgZXZlbnQuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbnQKLXByaXNtMnN0YV9ldmVudCAoCi0JZXZlbnRfdCBldmVudCwKLQlpbnQgcHJpb3JpdHksCi0JZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKQotewotCWludAkJCXJlc3VsdCA9IDA7Ci0JZGV2X2xpbmtfdAkJKmxpbmsgPSAoZGV2X2xpbmtfdCAqKSBhcmdzLT5jbGllbnRfZGF0YTsKLQl3bGFuZGV2aWNlX3QJCSp3bGFuZGV2ID0gKHdsYW5kZXZpY2VfdCopbGluay0+cHJpdjsKLQloZmEzODR4X3QJCSpodyA9IE5VTEw7Ci0KLQlEQkZFTlRFUjsKLQotCWlmICh3bGFuZGV2KSBodyA9IHdsYW5kZXYtPnByaXY7Ci0KLQlzd2l0Y2ggKGV2ZW50KQotCXsKLQljYXNlIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OOgotCQlXTEFOX0xPR19ERUJVRyg1LCJldmVudCBpcyBJTlNFUlRJT05cbiIpOwotCQlsaW5rLT5zdGF0ZSB8PSBERVZfUFJFU0VOVCB8IERFVl9DT05GSUdfUEVORElORzsKLQkJcHJpc20yc3RhX2NvbmZpZyhsaW5rKTsKLQkJaWYgKCEobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSkgewotCQkJd2xhbmRldi0+bmV0ZGV2LT5pcnEgPSAwOwotCQkJV0xBTl9MT0dfRVJST1IoCi0JCQkJIiVzOiBJbml0aWFsaXphdGlvbiBmYWlsZWQhXG4iLCBkZXZfaW5mbyk7Ci0JCQl3bGFuZGV2LT5tc2RzdGF0ZSA9IFdMQU5fTVNEX0hXRkFJTDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogRmlsbCBpbiB0aGUgcmVzdCBvZiB0aGUgaHcgc3RydWN0ICovCi0JCWh3LT5pcnEgPSB3bGFuZGV2LT5uZXRkZXYtPmlycTsKLQkJaHctPmlvYmFzZSA9IHdsYW5kZXYtPm5ldGRldi0+YmFzZV9hZGRyOwotCQlody0+bGluayA9IGxpbms7Ci0KLQkJaWYgKHByaXNtMl9kb3Jlc2V0KSB7Ci0JCQlyZXN1bHQgPSBoZmEzODR4X2NvcmVyZXNldChodywKLQkJCQkJcHJpc20yX3Jlc2V0X2hvbGR0aW1lLAotCQkJCQlwcmlzbTJfcmVzZXRfc2V0dGxldGltZSwgMCk7Ci0JCQlpZiAoIHJlc3VsdCApIHsKLQkJCQlXTEFOX0xPR19FUlJPUigKLQkJCQkJImNvcmVyZXNldCgpIGZhaWxlZCwgcmVzdWx0PSVkLlxuIiwKLQkJCQkJcmVzdWx0KTsKLQkJCQl3bGFuZGV2LT5tc2RzdGF0ZSA9IFdMQU5fTVNEX0hXRkFJTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0jaWYgMAotCQkvKgotCQkgKiBUT0RPOiB0ZXN0X2hvc3RpZigpIG5vdCBpbXBsZW1lbnRlZCB5ZXQuCi0JCSAqLwotCQlyZXN1bHQgPSBoZmEzODR4X3Rlc3RfaG9zdGlmKGh3KTsKLQkJaWYgKHJlc3VsdCkgewotCQkJV0xBTl9MT0dfRVJST1IoCi0JCQkidGVzdF9ob3N0aWYoKSBmYWlsZWQsIHJlc3VsdD0lZC5cbiIsIHJlc3VsdCk7Ci0JCQl3bGFuZGV2LT5tc2RzdGF0ZSA9IFdMQU5fTVNEX0hXRkFJTDsKLQkJCWJyZWFrOwotCQl9Ci0jZW5kaWYKLQkJd2xhbmRldi0+bXNkc3RhdGUgPSBXTEFOX01TRF9IV1BSRVNFTlQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBDU19FVkVOVF9DQVJEX1JFTU9WQUw6Ci0JCVdMQU5fTE9HX0RFQlVHKDUsImV2ZW50IGlzIFJFTU9WQUxcbiIpOwotCQlsaW5rLT5zdGF0ZSAmPSB+REVWX1BSRVNFTlQ7Ci0KLQkJaWYgKHdsYW5kZXYpIHsKLQkJCXA4MDIxMW5ldGRldl9od3JlbW92ZWQod2xhbmRldik7Ci0JCX0KLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMCkpCi0JCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCi0JCXsKLQkJCWxpbmstPnJlbGVhc2UuZXhwaXJlcyA9IGppZmZpZXMgKyAoSFovMjApOwotCQkJYWRkX3RpbWVyKCZsaW5rLT5yZWxlYXNlKTsKLQkJfQotI2VuZGlmCi0JCWJyZWFrOwotCWNhc2UgQ1NfRVZFTlRfUkVTRVRfUkVRVUVTVDoKLQkJV0xBTl9MT0dfREVCVUcoNSwiZXZlbnQgaXMgUkVTRVRfUkVRVUVTVFxuIik7Ci0JCVdMQU5fTE9HX05PVElDRSgKLQkJCSJwcmlzbTIgY2FyZCByZXNldCBub3Qgc3VwcG9ydGVkICIKLQkJCSJkdWUgdG8gcG9zdC1yZXNldCB1c2VyIG1vZGUgY29uZmlndXJhdGlvbiAiCi0JCQkicmVxdWlyZW1lbnRzLlxuIik7Ci0JCVdMQU5fTE9HX05PVElDRSgKLQkJCSIgIEZyb20gdXNlciBtb2RlLCB1c2UgIgotCQkJIidjYXJkY3RsIHN1c3BlbmQ7Y2FyZGN0bCByZXN1bWUnICIKLQkJCSJpbnN0ZWFkLlxuIik7Ci0JCWJyZWFrOwotCWNhc2UgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUw6Ci0JY2FzZSBDU19FVkVOVF9DQVJEX1JFU0VUOgotCQlXTEFOX0xPR19XQVJOSU5HKCJSeCdkIENTX0VWRU5UX1JFU0VUX3h4eCwgc2hvdWxkIG5vdCAiCi0JCQkiYmUgcG9zc2libGUgc2luY2UgUkVTRVRfUkVRVUVTVCB3YXMgZGVuaWVkLlxuIik7Ci0JCWJyZWFrOwotCi0JY2FzZSBDU19FVkVOVF9QTV9TVVNQRU5EOgotCQlXTEFOX0xPR19ERUJVRyg1LCJldmVudCBpcyBTVVNQRU5EXG4iKTsKLQkJbGluay0+c3RhdGUgfD0gREVWX1NVU1BFTkQ7Ci0JCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCi0JCXsKLQkJCXByaXNtMnN0YV9pZnN0YXRlKHdsYW5kZXYsIFA4MDIxMUVOVU1faWZzdGF0ZV9kaXNhYmxlKTsKLQkJCXBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQ1NfRVZFTlRfUE1fUkVTVU1FOgotCQlXTEFOX0xPR19ERUJVRyg1LCJldmVudCBpcyBSRVNVTUVcbiIpOwotCQlsaW5rLT5zdGF0ZSAmPSB+REVWX1NVU1BFTkQ7Ci0JCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKLQkJCXBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZik7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm4gMDsgIC8qIG5vb25lIGVsc2UgZG9lcyBhbnRoaW5nIHdpdGggdGhlIHJldHVybiB2YWx1ZSAqLwotfQotI2VuZGlmIC8vIDw9IDIuNi4xNQotCi0KLQotaW50IGhmYTM4NHhfY29yZXJlc2V0KGhmYTM4NHhfdCAqaHcsIGludCBob2xkdGltZSwgaW50IHNldHRsZXRpbWUsIGludCBnZW5lc2lzKQotewotCWludAkJcmVzdWx0ID0gMDsKLQljb25mX3JlZ190CXJlZzsKLQlVSU5UOAkJY29yc2F2ZTsKLQlEQkZFTlRFUjsKLQotCVdMQU5fTE9HX0RFQlVHKDMsICJEb2luZyByZXNldCB2aWEgQ2FyZFNlcnZpY2VzKCkuXG4iKTsKLQotCS8qIENvbGxlY3QgQ09SICovCi0JcmVnLkZ1bmN0aW9uID0gMDsKLQlyZWcuQWN0aW9uID0gQ1NfUkVBRDsKLQlyZWcuT2Zmc2V0ID0gQ0lTUkVHX0NPUjsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTYpCi0JcmVzdWx0ID0gcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKGh3LT5wZGV2LCAmcmVnKTsKLSNlbHNlCi0JcmVzdWx0ID0gcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKAotCQkJaHctPmxpbmstPmhhbmRsZSwKLQkJCSZyZWcpOwotI2VuZGlmCi0JaWYgKHJlc3VsdCAhPSBDU19TVUNDRVNTICkgewotCQlXTEFOX0xPR19FUlJPUigKLQkJCSI6MDogQWNjZXNzQ29uZmlndXJhdGlvblJlZ2lzdGVyKENTX1JFQUQpIGZhaWxlZCwiCi0JCQkicmVzdWx0PSVkLlxuIiwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gLUVJTzsKLQl9Ci0JY29yc2F2ZSA9IHJlZy5WYWx1ZTsKLQotCS8qIFdyaXRlIHJlc2V0IGJpdCAoQklUNykgKi8KLQlyZWcuVmFsdWUgfD0gQklUNzsKLQlyZWcuQWN0aW9uID0gQ1NfV1JJVEU7Ci0JcmVnLk9mZnNldCA9IENJU1JFR19DT1I7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDE2KQotCXJlc3VsdCA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3Rlcihody0+cGRldiwgJnJlZyk7Ci0jZWxzZQotCXJlc3VsdCA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcigKLQkJCWh3LT5saW5rLT5oYW5kbGUsCi0JCQkmcmVnKTsKLSNlbmRpZgotCWlmIChyZXN1bHQgIT0gQ1NfU1VDQ0VTUyApIHsKLQkJV0xBTl9MT0dfRVJST1IoCi0JCQkiOjE6IEFjY2Vzc0NvbmZpZ3VyYXRpb25SZWdpc3RlcihDU19XUklURSkgZmFpbGVkLCIKLQkJCSJyZXN1bHQ9JWQuXG4iLCByZXN1bHQpOwotCQlyZXN1bHQgPSAtRUlPOwotCX0KLQotCS8qIEhvbGQgZm9yIGhvbGR0aW1lICovCi0JbWRlbGF5KGhvbGR0aW1lKTsKLQotCWlmIChnZW5lc2lzKSB7Ci0JCXJlZy5WYWx1ZSA9IGdlbmVzaXM7Ci0JCXJlZy5BY3Rpb24gPSBDU19XUklURTsKLQkJcmVnLk9mZnNldCA9IENJU1JFR19DQ1NSOwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwxNikKLQkJcmVzdWx0ID0gcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKGh3LT5wZGV2LCAmcmVnKTsKLSNlbHNlCi0JCXJlc3VsdCA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcigKLQkJCQkgICAgICBody0+bGluay0+aGFuZGxlLAotCQkJCSAgICAgICZyZWcpOwotI2VuZGlmCi0JCWlmIChyZXN1bHQgIT0gQ1NfU1VDQ0VTUyApIHsKLQkJCVdMQU5fTE9HX0VSUk9SKAotCQkJCSI6MTogQWNjZXNzQ29uZmlndXJhdGlvblJlZ2lzdGVyKENTX1dSSVRFKSBmYWlsZWQsIgotCQkJCSJyZXN1bHQ9JWQuXG4iLCByZXN1bHQpOwotCQkJcmVzdWx0ID0gLUVJTzsKLQkJfQotCX0KLQotCS8qIEhvbGQgZm9yIGhvbGR0aW1lICovCi0JbWRlbGF5KGhvbGR0aW1lKTsKLQotCS8qIENsZWFyIHJlc2V0IGJpdCAqLwotCXJlZy5WYWx1ZSAmPSB+QklUNzsKLQlyZWcuQWN0aW9uID0gQ1NfV1JJVEU7Ci0JcmVnLk9mZnNldCA9IENJU1JFR19DT1I7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDE2KQotCXJlc3VsdCA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3Rlcihody0+cGRldiwgJnJlZyk7Ci0jZWxzZQotCXJlc3VsdCA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcigKLQkJCQkgICAgICBody0+bGluay0+aGFuZGxlLAotCQkJCSAgICAgICZyZWcpOwotI2VuZGlmCi0JaWYgKHJlc3VsdCAhPSBDU19TVUNDRVNTICkgewotCQlXTEFOX0xPR19FUlJPUigKLQkJCSI6MjogQWNjZXNzQ29uZmlndXJhdGlvblJlZ2lzdGVyKENTX1dSSVRFKSBmYWlsZWQsIgotCQkJInJlc3VsdD0lZC5cbiIsIHJlc3VsdCk7Ci0JCXJlc3VsdCA9IC1FSU87Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKiBXYWl0IGZvciBzZXR0bGV0aW1lICovCi0JbWRlbGF5KHNldHRsZXRpbWUpOwotCi0JLyogU2V0IG5vbi1yZXNldCBiaXRzIGJhY2sgd2hhdCB0aGV5IHdlcmUgKi8KLQlyZWcuVmFsdWUgPSBjb3JzYXZlOwotCXJlZy5BY3Rpb24gPSBDU19XUklURTsKLQlyZWcuT2Zmc2V0ID0gQ0lTUkVHX0NPUjsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTYpCi0JcmVzdWx0ID0gcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKGh3LT5wZGV2LCAmcmVnKTsKLSNlbHNlCi0JcmVzdWx0ID0gcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKAotCQkJCSAgICAgIGh3LT5saW5rLT5oYW5kbGUsCi0JCQkJICAgICAgJnJlZyk7Ci0jZW5kaWYKLQlpZiAocmVzdWx0ICE9IENTX1NVQ0NFU1MgKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKAotCQkJIjoyOiBBY2Nlc3NDb25maWd1cmF0aW9uUmVnaXN0ZXIoQ1NfV1JJVEUpIGZhaWxlZCwiCi0JCQkicmVzdWx0PSVkLlxuIiwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gLUVJTzsKLQkJZ290byBkb25lOwotCX0KLQotZG9uZToKLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLSNpZmRlZiBNT0RVTEUKLQotc3RhdGljIGludCBfX2luaXQgcHJpc20yY3NfaW5pdCh2b2lkKQotewotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsNjgpKQotCXNlcnZpbmZvX3QJc2VydjsKLSNlbmRpZgotCi0JREJGRU5URVI7Ci0KLSAgICAgICAgV0xBTl9MT0dfTk9USUNFKCIlcyBMb2FkZWRcbiIsIHZlcnNpb24pOwotICAgICAgICBXTEFOX0xPR19OT1RJQ0UoImRldl9pbmZvIGlzOiAlc1xuIiwgZGV2X2luZm8pOwotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSw2OCkpCi0JcGNtY2lhX2dldF9jYXJkX3NlcnZpY2VzX2luZm8oJnNlcnYpOwotCWlmICggc2Vydi5SZXZpc2lvbiAhPSBDU19SRUxFQVNFX0NPREUgKQotCXsKLQkJcHJpbnRrKEtFUk5fTk9USUNFIiVzOiBDYXJkU2VydmljZXMgcmVsZWFzZSBkb2VzIG5vdCBtYXRjaCFcbiIsIGRldl9pbmZvKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIFRoaXMgY2FsbCB3aWxsIHJlc3VsdCBpbiBhIGNhbGwgdG8gcHJpc20yc3RhX2F0dGFjaCAqLwotCS8qICAgYW5kIGV2ZW50dWFsbHkgcHJpc20yc3RhX2RldGFjaCAqLwotCXJlZ2lzdGVyX3BjY2FyZF9kcml2ZXIoICZkZXZfaW5mbywgJnByaXNtMnN0YV9hdHRhY2gsICZwcmlzbTJzdGFfZGV0YWNoKTsKLSNlbHNlCi0JcGNtY2lhX3JlZ2lzdGVyX2RyaXZlcigmcHJpc20yX2NzX2RyaXZlcik7Ci0jZW5kaWYKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBwcmlzbTJjc19jbGVhbnVwKHZvaWQpCi17Ci0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSw2OCkpCi0gICAgICAgIGRldl9saW5rX3QgKmxpbmsgPSBkZXZfbGlzdDsKLSAgICAgICAgZGV2X2xpbmtfdCAqbmxpbms7Ci0gICAgICAgIERCRkVOVEVSOwotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwxMCkgKQotCWZvciAobGluaz1kZXZfbGlzdDsgbGluayAhPSBOVUxMOyBsaW5rID0gbmxpbmspIHsKLQkJbmxpbmsgPSBsaW5rLT5uZXh0OwotCQlpZiAoIGxpbmstPnN0YXRlICYgREVWX0NPTkZJRyApIHsKLQkJCXByaXNtMnN0YV9yZWxlYXNlKCh1X2xvbmcpbGluayk7Ci0JCX0KLQkJcHJpc20yc3RhX2RldGFjaChsaW5rKTsgLyogcmVtZW1iZXIgZGV0YWNoKCkgZnJlZXMgbGluayAqLwotCX0KLSNlbmRpZgotCi0JdW5yZWdpc3Rlcl9wY2NhcmRfZHJpdmVyKCAmZGV2X2luZm8pOwotI2Vsc2UKLQlwY21jaWFfdW5yZWdpc3Rlcl9kcml2ZXIoJnByaXNtMl9jc19kcml2ZXIpOwotI2VuZGlmCi0KLSAgICAgICAgcHJpbnRrKEtFUk5fTk9USUNFICIlcyBVbmxvYWRlZFxuIiwgdmVyc2lvbik7Ci0KLSAgICAgICAgREJGRVhJVDsKLSAgICAgICAgcmV0dXJuOwotfQotCi1tb2R1bGVfaW5pdChwcmlzbTJjc19pbml0KTsKLW1vZHVsZV9leGl0KHByaXNtMmNzX2NsZWFudXApOwotCi0jZW5kaWYgLy8gTU9EVUxFCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMl9wY2kuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMl9wY2kuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZlMzJkZi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJfcGNpLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzIgKzAsMCBAQAotI2RlZmluZSBXTEFOX0hPU1RJRiBXTEFOX1BDSQotI2luY2x1ZGUgImhmYTM4NHguYyIKLSNpbmNsdWRlICJwcmlzbTJtZ210LmMiCi0jaW5jbHVkZSAicHJpc20ybWliLmMiCi0jaW5jbHVkZSAicHJpc20yc3RhLmMiCi0KLSNkZWZpbmUgUENJX1NJWkUJCTB4MTAwMAkJLyogTWVtb3J5IHNpemUgLSA0SyBieXRlcyAqLwotCi0vKiBJU0wzODc0QSAxMU1iL3MgV0xBTiBjb250cm9sbGVyICovCi0jZGVmaW5lIFBDSVZFTkRPUl9JTlRFUlNJTAkweDEyNjBVTAotI2RlZmluZSBQQ0lERVZJQ0VfSVNMMzg3NAkweDM4NzNVTCAvKiBbTVNNXSB5ZWFoIEkga25vdy4uLnRoZSBJRCBzYXlzCi0JCQkJCSAgICAzODczLiBUcnVzdCBtZSwgaXQncyBhIDM4NzQuICovCi0KLS8qIFNhbXN1bmcgU1dMLTIyMTBQIDExTWIvcyBXTEFOIGNvbnRyb2xsZXIgKHVzZXMgSVNMMzg3NEEpICovCi0jZGVmaW5lIFBDSVZFTkRPUl9TQU1TVU5HICAgICAgMHgxNjdkVUwKLSNkZWZpbmUgUENJREVWSUNFX1NXTF8yMjEwUCAgICAweGEwMDBVTAotCi0jZGVmaW5lIFBDSVZFTkRPUl9ORVRHRUFSICAgICAgMHgxMzg1VUwgLyogZm9yIE1BMzExICovCi0KLS8qIFBDSSBDbGFzcyAmIFN1Yi1DbGFzcyBjb2RlLCBOZXR3b3JrLSdPdGhlciBjb250cm9sbGVyJyAqLwotI2RlZmluZSBQQ0lfQ0xBU1NfTkVUV09SS19PVEhFUlMgMHgyODAKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20yc3RhX3Byb2JlX3BjaQotKgotKiBQcm9iZSByb3V0aW5lIGNhbGxlZCB3aGVuIGEgUENJIGRldmljZSB3LyBtYXRjaGluZyBJRCBpcyBmb3VuZC4KLSogVGhlIElTTDM4NzQgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgZm9sbG93aW5nIG1hcDoKLSogICBCQVIwOiBQcmlzbTIueCByZWdpc3RlcnMgbWVtb3J5IG1hcHBlZCwgc2l6ZT00awotKiBIZXJlJ3MgdGhlIHNlcXVlbmNlOgotKiAgIC0gQWxsb2NhdGUgdGhlIFBDSSByZXNvdXJjZXMuCi0qICAgLSBSZWFkIHRoZSBQQ01DSUEgYXR0cmlidXRlIG1lbW9yeSB0byBtYWtlIHN1cmUgd2UgaGF2ZSBhIFdMQU4gY2FyZAotKiAgIC0gUmVzZXQgdGhlIE1BQwotKiAgIC0gSW5pdGlhbGl6ZSB0aGUgbmV0ZGV2IGFuZCB3bGFuIGRhdGEKLSogICAtIEluaXRpYWxpemUgdGhlIE1BQwotKgotKiBBcmd1bWVudHM6Ci0qCXBkZXYJCXB0ciB0byBwY2kgZGV2aWNlIHN0cnVjdHVyZSBjb250YWluaW5nIGluZm8gYWJvdXQKLSoJCQlwY2kgY29uZmlndXJhdGlvbi4KLSoJaWQJCXB0ciB0byB0aGUgZGV2aWNlIGlkIGVudHJ5IHRoYXQgbWF0Y2hlZCB0aGlzIGRldmljZS4KLSoKLSogUmV0dXJuczoKLSoJemVybwkJLSBzdWNjZXNzCi0qCW5lZ2F0aXZlCS0gZmFpbGVkCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZAotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50IF9fZGV2aW5pdAotcHJpc20yc3RhX3Byb2JlX3BjaSgKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCi17Ci0JaW50CQlyZXN1bHQ7Ci0JcGh5c190CQlwaHltZW0gPSAwOwotCXZvaWQJCV9faW9tZW0gKm1lbSA9IE5VTEw7Ci0gICAgICAgIHdsYW5kZXZpY2VfdCAgICAqd2xhbmRldiA9IE5VTEw7Ci0JaGZhMzg0eF90CSpodyA9IE5VTEw7Ci0KLQlEQkZFTlRFUjsKLQotCS8qIEVuYWJsZSB0aGUgcGNpIGRldmljZSAqLwotCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkgewotCQlXTEFOX0xPR19FUlJPUigiJXM6IHBjaV9lbmFibGVfZGV2aWNlKCkgZmFpbGVkLlxuIiwgZGV2X2luZm8pOwotCQlyZXN1bHQgPSAtRUlPOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JLyogRmlndXJlIG91dCBvdXIgcmVzb3VyY2VzICovCi0JcGh5bWVtID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOwotCi0gICAgICAgIGlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHBoeW1lbSwgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSwgIlByaXNtMiIpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAicHJpc20yOiBDYW5ub3QgcmVzZXJ2ZSBQQ0kgbWVtb3J5IHJlZ2lvblxuIik7Ci0JCXJlc3VsdCA9IC1FSU87Ci0JCWdvdG8gZmFpbDsKLSAgICAgICAgfQotCi0JbWVtID0gaW9yZW1hcChwaHltZW0sIFBDSV9TSVpFKTsKLQlpZiAoIG1lbSA9PSAwICkgewotCQlXTEFOX0xPR19FUlJPUigiJXM6IGlvcmVtYXAoKSBmYWlsZWQuXG4iLCBkZXZfaW5mbyk7Ci0JCXJlc3VsdCA9IC1FSU87Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQkvKiBMb2cgdGhlIGRldmljZSAqLwotICAgICAgICBXTEFOX0xPR19JTkZPKCJBIFByaXNtMi41IFBDSSBkZXZpY2UgZm91bmQsICIKLQkJInBoeW1lbToweCVsbHgsIGlycTolZCwgbWVtOjB4JXBcbiIsCi0JCSh1bnNpZ25lZCBsb25nIGxvbmcpcGh5bWVtLCBwZGV2LT5pcnEsIG1lbSk7Ci0KLQlpZiAoKHdsYW5kZXYgPSBjcmVhdGVfd2xhbigpKSA9PSBOVUxMKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZS5cbiIsIGRldl9pbmZvKTsKLQkJcmVzdWx0ID0gLUVJTzsKLQkJZ290byBmYWlsOwotCX0KLQlodyA9IHdsYW5kZXYtPnByaXY7Ci0KLQlpZiAoIHdsYW5fc2V0dXAod2xhbmRldikgIT0gMCApIHsKLQkJV0xBTl9MT0dfRVJST1IoIiVzOiB3bGFuX3NldHVwKCkgZmFpbGVkLlxuIiwgZGV2X2luZm8pOwotCQlyZXN1bHQgPSAtRUlPOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JLyogU2V0dXAgbmV0ZGV2aWNlJ3MgYWJpbGl0eSB0byByZXBvcnQgcmVzb3VyY2VzCi0JICogTm90ZTogdGhlIG5ldGRldmljZSB3YXMgYWxsb2NhdGVkIGJ5IHdsYW5fc2V0dXAoKQotCSAqLwotICAgICAgICB3bGFuZGV2LT5uZXRkZXYtPmlycSA9IHBkZXYtPmlycTsKLSAgICAgICAgd2xhbmRldi0+bmV0ZGV2LT5tZW1fc3RhcnQgPSAodW5zaWduZWQgbG9uZykgbWVtOwotICAgICAgICB3bGFuZGV2LT5uZXRkZXYtPm1lbV9lbmQgPSB3bGFuZGV2LT5uZXRkZXYtPm1lbV9zdGFydCArCi0JCXBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCk7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBodyBkYXRhICovCi0gICAgICAgIGhmYTM4NHhfY3JlYXRlKGh3LCB3bGFuZGV2LT5uZXRkZXYtPmlycSwgMCwgbWVtKTsKLQlody0+d2xhbmRldiA9IHdsYW5kZXY7Ci0KLQkvKiBSZWdpc3RlciB0aGUgd2xhbmRldiwgdGhpcyBnZXRzIHVzIGEgbmFtZSBhbmQgcmVnaXN0ZXJzIHRoZQotCSAqIGxpbnV4IG5ldGRldmljZS4KLQkgKi8KLQlTRVRfTU9EVUxFX09XTkVSKHdsYW5kZXYtPm5ldGRldik7Ci0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkpCi0gICAgICAgU0VUX05FVERFVl9ERVYod2xhbmRldi0+bmV0ZGV2LCAmKHBkZXYtPmRldikpOwotI2VuZGlmCi0gICAgICAgIGlmICggcmVnaXN0ZXJfd2xhbmRldih3bGFuZGV2KSAhPSAwICkgewotCQlXTEFOX0xPR19FUlJPUigiJXM6IHJlZ2lzdGVyX3dsYW5kZXYoKSBmYWlsZWQuXG4iLCBkZXZfaW5mbyk7Ci0JCXJlc3VsdCA9IC1FSU87Ci0JCWdvdG8gZmFpbDsKLSAgICAgICAgfQotCi0jaWYgMAotCS8qIFRPRE86IE1vdmUgdGhpcyBhbmQgYW4gaXJxIHRlc3QgaW50byBhbiBoZmEzODR4X3Rlc3RpZigpIHJvdXRpbmUuCi0JICovCi0Jb3V0dyhQUklTTTJTVEFfTUFHSUMsIEhGQTM4NHhfU1dTVVBQT1JUKHdsYW5kZXYtPm5ldGRldi0+YmFzZV9hZGRyKSk7Ci0JcmVnPWludyggSEZBMzg0eF9TV1NVUFBPUlQod2xhbmRldi0+bmV0ZGV2LT5iYXNlX2FkZHIpKTsKLQlpZiAoIHJlZyAhPSBQUklTTTJTVEFfTUFHSUMgKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCJNQUMgcmVnaXN0ZXIgYWNjZXNzIHRlc3QgZmFpbGVkIVxuIik7Ci0JCXJlc3VsdCA9IC1FSU87Ci0JCWdvdG8gZmFpbDsKLQl9Ci0jZW5kaWYKLQotCS8qIERvIGEgY2hpcC1sZXZlbCByZXNldCBvbiB0aGUgTUFDICovCi0JaWYgKHByaXNtMl9kb3Jlc2V0KSB7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfY29yZXJlc2V0KGh3LAotCQkJCXByaXNtMl9yZXNldF9ob2xkdGltZSwKLQkJCQlwcmlzbTJfcmVzZXRfc2V0dGxldGltZSwgMCk7Ci0JCWlmIChyZXN1bHQgIT0gMCkgewotCQkJV0xBTl9MT0dfRVJST1IoCi0JCQkJIiVzOiBoZmEzODR4X2NvcmVyZXNldCgpIGZhaWxlZC5cbiIsCi0JCQkJZGV2X2luZm8pOwotCQkJdW5yZWdpc3Rlcl93bGFuZGV2KHdsYW5kZXYpOwotCQkJaGZhMzg0eF9kZXN0cm95KGh3KTsKLQkJCXJlc3VsdCA9IC1FSU87Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQl9Ci0KLSAgICAgICAgcGNpX3NldF9kcnZkYXRhKHBkZXYsIHdsYW5kZXYpOwotCi0JLyogU2hvdWxkbid0IGFjdHVhbGx5IGhvb2sgdXAgdGhlIElSUSB1bnRpbCB3ZQotCSAqIF9rbm93XyB0aGluZ3MgYXJlIGFscmlnaHQuICBBIHRlc3Qgcm91dGluZSB3b3VsZCBoZWxwLgotCSAqLwotICAgICAgIAlyZXF1ZXN0X2lycSh3bGFuZGV2LT5uZXRkZXYtPmlycSwgaGZhMzg0eF9pbnRlcnJ1cHQsCi0JCVNBX1NISVJRLCB3bGFuZGV2LT5uYW1lLCB3bGFuZGV2KTsKLQotCXdsYW5kZXYtPm1zZHN0YXRlID0gV0xBTl9NU0RfSFdQUkVTRU5UOwotCi0JcmVzdWx0ID0gMDsKLQlnb3RvIGRvbmU7Ci0KLSBmYWlsOgotCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKLQlpZiAod2xhbmRldikJa2ZyZWUod2xhbmRldik7Ci0JaWYgKGh3KQkJa2ZyZWUoaHcpOwotICAgICAgICBpZiAobWVtKSAgICAgICAgaW91bm1hcChtZW0pOwotCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7Ci0gICAgICAgIHBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLQotIGRvbmU6Ci0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgdm9pZCBfX2RldmV4aXQgcHJpc20yc3RhX3JlbW92ZV9wY2koc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0gICAgICAgCXdsYW5kZXZpY2VfdAkJKndsYW5kZXY7Ci0JaGZhMzg0eF90CSpodzsKLQotCXdsYW5kZXYgPSAod2xhbmRldmljZV90ICopIHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlodyA9IHdsYW5kZXYtPnByaXY7Ci0KLQlwODAyMTFuZXRkZXZfaHdyZW1vdmVkKHdsYW5kZXYpOwotCi0JLyogcmVzZXQgaGFyZHdhcmUgKi8KLQlwcmlzbTJzdGFfaWZzdGF0ZSh3bGFuZGV2LCBQODAyMTFFTlVNX2lmc3RhdGVfZGlzYWJsZSk7Ci0KLSAgICAgICAgaWYgKHBkZXYtPmlycSkKLQkJZnJlZV9pcnEocGRldi0+aXJxLCB3bGFuZGV2KTsKLQotCXVucmVnaXN0ZXJfd2xhbmRldih3bGFuZGV2KTsKLQotCS8qIGZyZWUgbG9jYWwgc3R1ZmYgKi8KLQlpZiAoaHcpIHsKLQkJaGZhMzg0eF9kZXN0cm95KGh3KTsKLQkJa2ZyZWUoaHcpOwotCX0KLQotCWlvdW5tYXAoKHZvaWQgX19pb21lbSAqKXdsYW5kZXYtPm5ldGRldi0+bWVtX3N0YXJ0KTsKLQl3bGFuX3Vuc2V0dXAod2xhbmRldik7Ci0KLQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwotICAgICAgICBwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci0JcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwotCi0Ja2ZyZWUod2xhbmRldik7Ci19Ci0KLQotc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaV9pZF90YmxbXSA9IHsKLQl7Ci0JCVBDSVZFTkRPUl9JTlRFUlNJTCwgUENJREVWSUNFX0lTTDM4NzQsCi0JCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsCi0JCTAsIDAsCi0JCS8qIERyaXZlciBkYXRhLCB3ZSBqdXN0IHB1dCB0aGUgbmFtZSBoZXJlICovCi0JCSh1bnNpZ25lZCBsb25nKSJJbnRlcnNpbCBQcmlzbTIuNSBJU0wzODc0IDExTWIvcyBXTEFOIENvbnRyb2xsZXIiCi0JfSwKLQl7Ci0JCVBDSVZFTkRPUl9JTlRFUlNJTCwgMHgzODcyLAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAotCQkwLCAwLAotCQkvKiBEcml2ZXIgZGF0YSwgd2UganVzdCBwdXQgdGhlIG5hbWUgaGVyZSAqLwotCQkodW5zaWduZWQgbG9uZykiSW50ZXJzaWwgUHJpc20yLjUgSVNMMzg3MiAxMU1iL3MgV0xBTiBDb250cm9sbGVyIgotCX0sCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgIFBDSVZFTkRPUl9TQU1TVU5HLCBQQ0lERVZJQ0VfU1dMXzIyMTBQLAotICAgICAgICAgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKLSAgICAgICAgICAgICAgIDAsIDAsCi0gICAgICAgICAgICAgICAvKiBEcml2ZXIgZGF0YSwgd2UganVzdCBwdXQgdGhlIG5hbWUgaGVyZSAqLwotICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIlNhbXN1bmcgTWFnaWNMQU4gU1dMLTIyMTBQIDExTWIvcyBXTEFOIENvbnRyb2xsZXIiCi0JfSwKLQl7IC8qIGZvciBOZXRHZWFyIE1BMzExICovCi0JCVBDSVZFTkRPUl9ORVRHRUFSLCAweDM4NzIsCi0JCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsCi0JCTAsIDAsCi0JCS8qIERyaXZlciBkYXRhLCB3ZSBqdXN0IHB1dCB0aGUgbmFtZSBoZXJlICovCi0JCSh1bnNpZ25lZCBsb25nKSJOZXRnZWFyIE1BMzExIFdMQU4gQ29udHJvbGxlciIKLQl9LAotCXsKLQkJMCwgMCwgMCwgMCwgMCwgMCwgMAotCX0KLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBwY2lfaWRfdGJsKTsKLQotLyogRnVuY3Rpb24gZGVjbGFyZWQgaGVyZSBiZWNhdXNlIG9mIHB0ciByZWZlcmVuY2UgYmVsb3cgKi8KLXN0YXRpYyBpbnQgIF9fZGV2aW5pdCBwcmlzbTJzdGFfcHJvYmVfcGNpKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAotCQkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCk7Ci1zdGF0aWMgdm9pZCAgX19kZXZleGl0IHByaXNtMnN0YV9yZW1vdmVfcGNpKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKLQotc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHByaXNtMl9wY2lfZHJ2X2lkID0gewotICAgICAgICAubmFtZSA9ICJwcmlzbTJfcGNpIiwKLSAgICAgICAgLmlkX3RhYmxlID0gcGNpX2lkX3RibCwKLSAgICAgICAgLnByb2JlID0gcHJpc20yc3RhX3Byb2JlX3BjaSwKLSAgICAgICAgLnJlbW92ZSA9IHByaXNtMnN0YV9yZW1vdmVfcGNpLAotI2lmZGVmIENPTkZJR19QTQotICAgICAgICAuc3VzcGVuZCA9IHByaXNtMnN0YV9zdXNwZW5kX3BjaSwKLSAgICAgICAgLnJlc3VtZSA9IHByaXNtMnN0YV9yZXN1bWVfcGNpLAotI2VuZGlmCi19OwotCi0jaWZkZWYgTU9EVUxFCi0KLXN0YXRpYyBpbnQgX19pbml0IHByaXNtMnBjaV9pbml0KHZvaWQpCi17Ci0gICAgICAgIFdMQU5fTE9HX05PVElDRSgiJXMgTG9hZGVkXG4iLCB2ZXJzaW9uKTsKLQlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZwcmlzbTJfcGNpX2Rydl9pZCk7Ci19OwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgcHJpc20ycGNpX2NsZWFudXAodm9pZCkKLXsKLQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnByaXNtMl9wY2lfZHJ2X2lkKTsKLX07Ci0KLW1vZHVsZV9pbml0KHByaXNtMnBjaV9pbml0KTsKLW1vZHVsZV9leGl0KHByaXNtMnBjaV9jbGVhbnVwKTsKLQotI2VuZGlmCi0KLWludCBoZmEzODR4X2NvcmVyZXNldChoZmEzODR4X3QgKmh3LCBpbnQgaG9sZHRpbWUsIGludCBzZXR0bGV0aW1lLCBpbnQgZ2VuZXNpcykKLXsKLQlpbnQJCXJlc3VsdCA9IDA7Ci0JdW5zaWduZWQgbG9uZwl0aW1lb3V0OwotCVVJTlQxNglyZWc7Ci0JREJGRU5URVI7Ci0KLQkvKiBBc3NlcnQgcmVzZXQgYW5kIHdhaXQgYXdoaWxlCi0JICogKG5vdGU6IHRoZXNlIGRlbGF5cyBhcmUgX3JlYWxseV8gbG9uZywgYnV0IHRoZXkgYXBwZWFyIHRvIGJlCi0JICogICAgICAgIG5lY2Vzc2FyeS4pCi0JICovCi0JaGZhMzg0eF9zZXRyZWcoaHcsIDB4YzUsIEhGQTM4NHhfUENJQ09SKTsKLQl0aW1lb3V0ID0gamlmZmllcyArIEhaLzQ7Ci0Jd2hpbGUodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHVkZWxheSg1KTsKLQotCWlmIChnZW5lc2lzKSB7Ci0JCWhmYTM4NHhfc2V0cmVnKGh3LCBnZW5lc2lzLCBIRkEzODR4X1BDSUhDUik7Ci0JCXRpbWVvdXQgPSBqaWZmaWVzICsgSFovNDsKLQkJd2hpbGUodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHVkZWxheSg1KTsKLQl9Ci0KLQkvKiBDbGVhciB0aGUgcmVzZXQgYW5kIHdhaXQgc29tZSBtb3JlCi0JICovCi0JaGZhMzg0eF9zZXRyZWcoaHcsIDB4NDUsIEhGQTM4NHhfUENJQ09SKTsKLQl0aW1lb3V0ID0gamlmZmllcyArIEhaLzI7Ci0Jd2hpbGUodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHVkZWxheSg1KTsKLQotCS8qIFdhaXQgZm9yIGYvdyB0byBjb21wbGV0ZSBpbml0aWFsaXphdGlvbiAoQ01EOkJVU1kgPT0gMCkKLQkgKi8KLQl0aW1lb3V0ID0gamlmZmllcyArIDIqSFo7Ci0JcmVnID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfQ01EKTsKLQl3aGlsZSAoIEhGQTM4NHhfQ01EX0lTQlVTWShyZWcpICYmIHRpbWVfYmVmb3JlKCBqaWZmaWVzLCB0aW1lb3V0KSApIHsKLQkJcmVnID0gaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfQ01EKTsKLQkJdWRlbGF5KDEwKTsKLQl9Ci0JaWYgKEhGQTM4NHhfQ01EX0lTQlVTWShyZWcpKSB7Ci0JCVdMQU5fTE9HX1dBUk5JTkcoImNvcmVyZXNldDogVGltZWQgb3V0IHdhaXRpbmcgZm9yIGNtZCByZWdpc3Rlci5cbiIpOwotCQlyZXN1bHQ9MTsKLQl9Ci0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yX3BseC5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yX3BseC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjA0NDNmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMl9wbHguYworKysgL2Rldi9udWxsCkBAIC0xLDQ3MiArMCwwIEBACi0jZGVmaW5lIFdMQU5fSE9TVElGIFdMQU5fUExYCi0jaW5jbHVkZSAiaGZhMzg0eC5jIgotI2luY2x1ZGUgInByaXNtMm1nbXQuYyIKLSNpbmNsdWRlICJwcmlzbTJtaWIuYyIKLSNpbmNsdWRlICJwcmlzbTJzdGEuYyIKLQotI2RlZmluZSBQTFhfQVRUUl9TSVpFCTB4MTAwMAkvKiBBdHRyaWJ1dGUgbWVtb3J5IHNpemUgLSA0SyBieXRlcyAqLwotI2RlZmluZSBDT1JfT0ZGU0VUCTB4M2UwCS8qIENPUiBhdHRyaWJ1dGUgb2Zmc2V0IG9mIFByaXNtMiBQQyBjYXJkICovCi0jZGVmaW5lIENPUl9WQUxVRQkweDQxCS8qIEVuYWJsZSBQQyBjYXJkIHdpdGggaXJxIGluIGxldmVsIHRyaWdnZXIgKi8KLSNkZWZpbmUgUExYX0lOVENTUgkweDRjCS8qIEludGVycnVwdCBDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgUExYX0lOVENTUl9JTlRFTiAoMTw8NikgLyogSW50ZXJydXB0IEVuYWJsZSBiaXQgKi8KLSNkZWZpbmUgUExYX01JTl9BVFRSX0xFTiA1MTIgICAgLyogYXQgbGVhc3QgMiB4IDI1NiBpcyBuZWVkZWQgZm9yIENJUyAqLwotCi0vKiAzQ29tIDNDUlc3NzdBIChQTFgpIGJvYXJkIElEICovCi0jZGVmaW5lIFBDSVZFTkRPUl8zQ09NICAgICAgIDB4MTBCNwotI2RlZmluZSBQQ0lERVZJQ0VfQUlSQ09OTkVDVCAweDc3NzAKLQotLyogRXVtaXRjb20gUENJIFdMMTEwMDAgUENJIEFkYXB0ZXIgKFBMWCkgYm9hcmQgZGV2aWNlK3ZlbmRvciBJRCAqLwotI2RlZmluZSBQQ0lWRU5ET1JfRVVNSVRDT00JMHgxNjM4VUwKLSNkZWZpbmUgUENJREVWSUNFX1dMMTEwMDAJMHgxMTAwVUwKLQotLyogR2xvYmFsIFN1biBUZWNoIEdMMjQxMTBQIFBDSSBBZGFwdGVyIChQTFgpIGJvYXJkIGRldmljZSt2ZW5kb3IgSUQgKi8KLSNkZWZpbmUgUENJVkVORE9SX0dMT0JBTFNVTgkweDE2YWJVTAotI2RlZmluZSBQQ0lERVZJQ0VfR0wyNDExMFAJMHgxMTAxVUwKLSNkZWZpbmUgUENJREVWSUNFX0dMMjQxMTBQX0FMVAkweDExMDJVTAotCi0vKiBOZXRnZWFyIE1BMzAxIFBDSSBBZGFwdGVyIChQTFgpIGJvYXJkIGRldmljZSt2ZW5kb3IgSUQgKi8KLSNkZWZpbmUgUENJVkVORE9SX05FVEdFQVIJMHgxMzg1VUwKLSNkZWZpbmUgUENJREVWSUNFX01BMzAxCQkweDQxMDBVTAotCi0vKiBVUyBSb2JvdGljcyBVU1IyNDEwIFBDSSBBZGFwdGVyIChQTFgpIGJvYXJkIGRldmljZSt2ZW5kb3IgSUQgKi8KLSNkZWZpbmUJUENJVkVORE9SX1VTUk9CT1RJQ1MgICAgMHgxNmVjVUwKLSNkZWZpbmUgUENJREVWSUNFX1VTUjI0MTAgICAgICAgMHgzNjg1VUwKLQotLyogTGlua3N5cyBXUEMxMSBjYXJkIHdpdGggdGhlIFdEVDExIGFkYXB0ZXIgKFBMWCkgYm9hcmQgZGV2aWNlK3ZlbmRvciBJRCAqLwotI2RlZmluZQlQQ0lWRU5ET1JfTGlua3N5cyAgICAgICAweDE2YWJVTAotI2RlZmluZSBQQ0lERVZJQ0VfV3BjMTFXZHQxMSAgICAweDExMDJVTAotCi0vKiBOYXRpb25hbCBEYXRhY29tbSBDb3JwIFNPSE93YXJlIE5ldGJsYXN0ZXIgSUkgUENJICovCi0jZGVmaW5lIFBDSVZFTkRPUl9OREMJICAgICAgICAweDE1ZThVTAotI2RlZmluZSBQQ0lERVZJQ0VfTkNQMTMwX1BMWCAJMHgwMTMwVUwKLSNkZWZpbmUgUENJREVWSUNFX05DUDEzMF9BU0lDCTB4MDEzMVVMCi0KLS8qIE5EQyBOQ1AxMzBfUExYIGlzIGFsc28gc29sZCBieSBDb3JlZ2EuIFRoZWlyIG5hbWUgaXMgQ0dXTFBDSUExMSAqLwotI2RlZmluZSBQQ0lWRU5ET1JfQ09SRUdBICAgICAgIFBDSVZFTkRPUl9OREMKLSNkZWZpbmUgUENJREVWSUNFX0NHV0xQQ0lBMTEgICBQQ0lERVZJQ0VfTkNQMTMwX1BMWAotCi0vKiBQQ0kgQ2xhc3MgJiBTdWItQ2xhc3MgY29kZSwgTmV0d29yay0nT3RoZXIgY29udHJvbGxlcicgKi8KLSNkZWZpbmUgUENJX0NMQVNTX05FVFdPUktfT1RIRVJTIDB4MjgwCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJzdGFfcHJvYmVfcGx4Ci0qCi0qIFByb2JlIHJvdXRpbmUgY2FsbGVkIHdoZW4gYSBQQ0kgZGV2aWNlIHcvIG1hdGNoaW5nIElEIGlzIGZvdW5kLgotKiBUaGlzIFBMWCBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSBmb2xsb3dpbmcgbWFwOgotKiAgIEJBUjA6IFVudXNlZAotKiAgIEJBUjE6ID8/Pz8KLSogICBCQVIyOiBQQ01DSUEgYXR0cmlidXRlIG1lbW9yeQotKiAgIEJBUjM6IFBDTUNJQSBpL28gc3BhY2UKLSogSGVyZSdzIHRoZSBzZXF1ZW5jZToKLSogICAtIEFsbG9jYXRlIHRoZSBQQ0kgcmVzb3VyY2VzLgotKiAgIC0gUmVhZCB0aGUgUENNQ0lBIGF0dHJpYnV0ZSBtZW1vcnkgdG8gbWFrZSBzdXJlIHdlIGhhdmUgYSBXTEFOIGNhcmQKLSogICAtIFJlc2V0IHRoZSBNQUMgdXNpbmcgdGhlIFBDTUNJQSBDT1IKLSogICAtIEluaXRpYWxpemUgdGhlIG5ldGRldiBhbmQgd2xhbiBkYXRhCi0qICAgLSBJbml0aWFsaXplIHRoZSBNQUMKLSoKLSogQXJndW1lbnRzOgotKglwZGV2CQlwdHIgdG8gcGNpIGRldmljZSBzdHJ1Y3R1cmUgY29udGFpbmluZyBpbmZvIGFib3V0Ci0qCQkJcGNpIGNvbmZpZ3VyYXRpb24uCi0qCWlkCQlwdHIgdG8gdGhlIGRldmljZSBpZCBlbnRyeSB0aGF0IG1hdGNoZWQgdGhpcyBkZXZpY2UuCi0qCi0qIFJldHVybnM6Ci0qCXplcm8JCS0gc3VjY2VzcwotKgluZWdhdGl2ZQktIGZhaWxlZAotKgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQKLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludCBfX2RldmluaXQKLXByaXNtMnN0YV9wcm9iZV9wbHgoCi0Jc3RydWN0IHBjaV9kZXYJCQkqcGRldiwKLQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZAkqaWQpCi17Ci0JaW50CQlyZXN1bHQ7Ci0gICAgICAgIHBoeXNfdAlwY2NhcmRfaW9hZGRyOwotCXBoeXNfdCAgcGNjYXJkX2F0dHJfbWVtOwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgcGNjYXJkX2F0dHJfbGVuOwotCXZvaWQgX19pb21lbSAqYXR0cl9tZW0gPSBOVUxMOwotCVVJTlQzMgkJcGx4X2FkZHI7Ci0gICAgICAgIHdsYW5kZXZpY2VfdCAgICAqd2xhbmRldiA9IE5VTEw7Ci0JaGZhMzg0eF90CSpodyA9IE5VTEw7Ci0JaW50CQlyZWc7Ci0gICAgICAgIHUzMgkJcmVnaWM7Ci0KLQlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpCi0JCXJldHVybiAtRUlPOwotCi0JLyogVE1DNzE2MCBib2FyZHMgYXJlIHNwZWNpYWwgKi8KLQlpZiAoKHBkZXYtPnZlbmRvciA9PSBQQ0lWRU5ET1JfTkRDKSAmJgotCSAgICAocGRldi0+ZGV2aWNlID09IFBDSURFVklDRV9OQ1AxMzBfQVNJQykpIHsKLQkJdW5zaWduZWQgbG9uZyBkZWxheTsKLQotCQlwY2NhcmRfYXR0cl9tZW0gPSAwOwotCQlwY2NhcmRfaW9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpOwotCi0JCW91dGIoMHg0NSwgcGNjYXJkX2lvYWRkcik7Ci0JCWRlbGF5ID0gamlmZmllcyArIDEqSFo7Ci0JCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBkZWxheSkpOwotCi0JCWlmIChpbmIocGNjYXJkX2lvYWRkcikgIT0gMHg0NSkgewotCQkJV0xBTl9MT0dfRVJST1IoIkluaXRpYWxpemUgdGhlIFRNQzcxNjAgZmFpbGVkLiAoMHgleClcbiIsIGluYihwY2NhcmRfaW9hZGRyKSk7Ci0JCQlyZXR1cm4gLUVJTzsKLQkJfQotCi0JCXBjY2FyZF9pb2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMik7Ci0JCXByaXNtMl9kb3Jlc2V0ID0gMDsKLQotCQlXTEFOX0xPR19JTkZPKCJOREMgTkNQMTMwIHdpdGggVE1DNzE2KEFTSUMpIFBDSSBpbnRlcmZhY2UgZGV2aWNlIGZvdW5kIGF0IGlvOjB4JXgsIGlycTolZFxuIiwgcGNjYXJkX2lvYWRkciwgcGRldi0+aXJxKTsKLQkJZ290byBpbml0OwotCX0KLQotCS8qIENvbGxlY3QgdGhlIHJlc291cmNlIHJlcXVpcmVtZW50cyAqLwotCXBjY2FyZF9hdHRyX21lbSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAyKTsKLQlwY2NhcmRfYXR0cl9sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDIpOwotICAgICAgICBpZiAocGNjYXJkX2F0dHJfbGVuIDwgUExYX01JTl9BVFRSX0xFTikKLQkJcmV0dXJuIC1FSU87Ci0KLQlwY2NhcmRfaW9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDMpOwotCi0JLyogYmpvZXJuOiBXZSBuZWVkIHRvIHRlbGwgdGhlIGNhcmQgdG8gZW5hYmxlIGludGVycnVwdHMsIGluCi0JICogY2FzZSB0aGUgc2VyaWFsIGVwcm9tIGRpZG4ndCBkbyB0aGlzIGFscmVhZHkuIFNlZSB0aGUKLQkgKiBQTFg5MDUyIGRhdGEgYm9vaywgcDgtMSBhbmQgOC0yNCBmb3IgcmVmZXJlbmNlLgotCSAqIFtNU01dOiBUaGlzIGJpdCBvZiBjb2RlIGNhbWUgZnJvbSB0aGUgb3Jpbm9jb19jcyBkcml2ZXIuCi0JICovCi0JcGx4X2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSk7Ci0KLQlyZWdpYyA9IDA7Ci0JcmVnaWMgPSBpbmwocGx4X2FkZHIrUExYX0lOVENTUik7Ci0JaWYocmVnaWMgJiBQTFhfSU5UQ1NSX0lOVEVOKSB7Ci0JCVdMQU5fTE9HX0RFQlVHKDEsCi0JCQkiJXM6IExvY2FsIEludGVycnVwdCBhbHJlYWR5IGVuYWJsZWRcbiIsIGRldl9pbmZvKTsKLQl9IGVsc2UgewotCQlyZWdpYyB8PSBQTFhfSU5UQ1NSX0lOVEVOOwotCQlvdXRsKHJlZ2ljLCBwbHhfYWRkcitQTFhfSU5UQ1NSKTsKLQkJcmVnaWMgPSBpbmwocGx4X2FkZHIrUExYX0lOVENTUik7Ci0JCWlmKCEocmVnaWMgJiBQTFhfSU5UQ1NSX0lOVEVOKSkgewotCQkJV0xBTl9MT0dfRVJST1IoCi0JCQkJIiVzOiBDb3VsZG4ndCBlbmFibGUgTG9jYWwgSW50ZXJydXB0c1xuIiwKLQkJCQlkZXZfaW5mbyk7Ci0JCQlyZXR1cm4gLUVJTzsKLQkJfQotCX0KLQotCS8qIFRoZXNlIGFzc2lnbm1lbnRzIGFyZSBoZXJlIGluIGNhc2Ugb2YgZnV0dXJlIG1hcHBpbmdzIGZvcgotCSAqIGlvIHNwYWNlIGFuZCBpcnEgdGhhdCBtaWdodCBiZSBzaW1pbGFyIHRvIGlvcmVtYXAKLQkgKi8KLSAgICAgICAgaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocGNjYXJkX2F0dHJfbWVtLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDIpLCAiUHJpc20yIikpIHsKLQkJV0xBTl9MT0dfRVJST1IoIiVzOiBDb3VsZG4ndCByZXNlcnZlIFBDSSBtZW1vcnkgcmVnaW9uXG4iLCBkZXZfaW5mbyk7Ci0JCXJldHVybiAtRUlPOwotICAgICAgICB9Ci0KLQlhdHRyX21lbSA9IGlvcmVtYXAocGNjYXJkX2F0dHJfbWVtLCBwY2NhcmRfYXR0cl9sZW4pOwotCi0JV0xBTl9MT0dfSU5GTygiQSBQTFggUENJL1BDTUNJQSBpbnRlcmZhY2UgZGV2aWNlIGZvdW5kLCAiCi0JCSJwaHltZW06MHglbGx4LCBwaHlpbz0weCV4LCBpcnE6JWQsICIKLQkJIm1lbTogMHglbHhcbiIsCi0JCSh1bnNpZ25lZCBsb25nIGxvbmcpcGNjYXJkX2F0dHJfbWVtLCBwY2NhcmRfaW9hZGRyLCBwZGV2LT5pcnEsCi0JCSh1bnNpZ25lZCBsb25nKWF0dHJfbWVtKTsKLQotCS8qIFZlcmlmeSB3aGV0aGVyIFBDIGNhcmQgaXMgcHJlc2VudC4KLQkgKiBbTVNNXSBUaGlzIG5lZWRzIGltcHJvdmVtZW50LCB0aGUgcmlnaHQgdGhpbmcgdG8gZG8gaXMKLQkgKiBwcm9iYWJseSB0byB3YWxrIHRoZSBDSVMgbG9va2luZyBmb3IgdGhlIHZlbmRvciBhbmQgcHJvZHVjdAotCSAqIElEcy4gIEl0IHdvdWxkIGJlIG5pY2UgaWYgdGhpcyBjb3VsZCBiZSB0aWVkIGluIHdpdGggdGhlCi0JICogZXRjL3BjbWNpYS93bGFuLW5nLmNvbmYgZmlsZS4gIEFueSB2b2x1bnRlZXJzPyAgOy0pCi0JICovCi0JaWYgKAotCXJlYWRiKGF0dHJfbWVtICsgMCkgIT0gMHgwMSB8fCByZWFkYihhdHRyX21lbSArIDIpICE9IDB4MDMgfHwKLQlyZWFkYihhdHRyX21lbSArIDQpICE9IDB4MDAgfHwgcmVhZGIoYXR0cl9tZW0gKyA2KSAhPSAweDAwIHx8Ci0JcmVhZGIoYXR0cl9tZW0gKyA4KSAhPSAweEZGIHx8IHJlYWRiKGF0dHJfbWVtICsgMTApICE9IDB4MTcgfHwKLQlyZWFkYihhdHRyX21lbSArIDEyKSAhPSAweDA0IHx8IHJlYWRiKGF0dHJfbWVtICsgMTQpICE9IDB4NjcpIHsKLQkJV0xBTl9MT0dfRVJST1IoIlByaXNtMiBQQyBjYXJkIENJUyBpcyBpbnZhbGlkLlxuIik7Ci0JCXJldHVybiAtRUlPOwotICAgICAgICB9Ci0gICAgICAgIFdMQU5fTE9HX0lORk8oIkEgUENNQ0lBIFdMQU4gYWRhcHRlciB3YXMgZm91bmQuXG4iKTsKLQotICAgICAgICAvKiBXcml0ZSBDT1IgdG8gZW5hYmxlIFBDIGNhcmQgKi8KLQl3cml0ZWIoQ09SX1ZBTFVFLCBhdHRyX21lbSArIENPUl9PRkZTRVQpOwotCXJlZyA9IHJlYWRiKGF0dHJfbWVtICsgQ09SX09GRlNFVCk7Ci0KLSBpbml0OgotCi0JLyoKLQkgKiBOb3cgZG8gZXZlcnl0aGluZyB0aGUgc2FtZSBhcyBhIFBDSSBkZXZpY2UKLQkgKiBbTVNNXSBUT0RPOiBXZSBjb3VsZCBwcm9iYWJseSBmYWN0b3IgdGhpcyBvdXQgb2YgcGNtY2lhL3BjaS9wbHgKLQkgKiBhbmQgcGVyaGFwcyB1c2IuICBQZXJoYXBzIGEgdGFzayBmb3IgYW5vdGhlciBkYXkuLi4uLi4uCi0JICovCi0KLQlpZiAoKHdsYW5kZXYgPSBjcmVhdGVfd2xhbigpKSA9PSBOVUxMKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZS5cbiIsIGRldl9pbmZvKTsKLQkJcmVzdWx0ID0gLUVJTzsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCi0JaHcgPSB3bGFuZGV2LT5wcml2OwotCi0JaWYgKCB3bGFuX3NldHVwKHdsYW5kZXYpICE9IDAgKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCIlczogd2xhbl9zZXR1cCgpIGZhaWxlZC5cbiIsIGRldl9pbmZvKTsKLQkJcmVzdWx0ID0gLUVJTzsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCi0JLyogU2V0dXAgbmV0ZGV2aWNlJ3MgYWJpbGl0eSB0byByZXBvcnQgcmVzb3VyY2VzCi0JICogTm90ZTogdGhlIG5ldGRldmljZSB3YXMgYWxsb2NhdGVkIGJ5IHdsYW5fc2V0dXAoKQotCSAqLwotICAgICAgICB3bGFuZGV2LT5uZXRkZXYtPmlycSA9IHBkZXYtPmlycTsKLSAgICAgICAgd2xhbmRldi0+bmV0ZGV2LT5iYXNlX2FkZHIgPSBwY2NhcmRfaW9hZGRyOwotICAgICAgICB3bGFuZGV2LT5uZXRkZXYtPm1lbV9zdGFydCA9ICh1bnNpZ25lZCBsb25nKWF0dHJfbWVtOwotICAgICAgICB3bGFuZGV2LT5uZXRkZXYtPm1lbV9lbmQgPSAodW5zaWduZWQgbG9uZylhdHRyX21lbSArIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCk7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBodyBkYXRhICovCi0gICAgICAgIGhmYTM4NHhfY3JlYXRlKGh3LCB3bGFuZGV2LT5uZXRkZXYtPmlycSwgcGNjYXJkX2lvYWRkciwgYXR0cl9tZW0pOwotCWh3LT53bGFuZGV2ID0gd2xhbmRldjsKLQotCS8qIFJlZ2lzdGVyIHRoZSB3bGFuZGV2LCB0aGlzIGdldHMgdXMgYSBuYW1lIGFuZCByZWdpc3RlcnMgdGhlCi0JICogbGludXggbmV0ZGV2aWNlLgotCSAqLwotCVNFVF9NT0RVTEVfT1dORVIod2xhbmRldi0+bmV0ZGV2KTsKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKSkKLSAgICAgICBTRVRfTkVUREVWX0RFVih3bGFuZGV2LT5uZXRkZXYsICYocGRldi0+ZGV2KSk7Ci0jZW5kaWYKLSAgICAgICAgaWYgKCByZWdpc3Rlcl93bGFuZGV2KHdsYW5kZXYpICE9IDAgKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCIlczogcmVnaXN0ZXJfd2xhbmRldigpIGZhaWxlZC5cbiIsIGRldl9pbmZvKTsKLQkJcmVzdWx0ID0gLUVJTzsKLQkJZ290byBmYWlsZWQ7Ci0gICAgICAgIH0KLQotI2lmIDAKLQkvKiBUT0RPOiBNb3ZlIHRoaXMgYW5kIGFuIGlycSB0ZXN0IGludG8gYW4gaGZhMzg0eF90ZXN0aWYoKSByb3V0aW5lLgotCSAqLwotCW91dHcoUFJJU00yU1RBX01BR0lDLCBIRkEzODR4X1NXU1VQUE9SVCh3bGFuZGV2LT5uZXRkZXYtPmJhc2VfYWRkcikpOwotCXJlZz1pbncoIEhGQTM4NHhfU1dTVVBQT1JUKHdsYW5kZXYtPm5ldGRldi0+YmFzZV9hZGRyKSk7Ci0JaWYgKCByZWcgIT0gUFJJU00yU1RBX01BR0lDICkgewotCQlXTEFOX0xPR19FUlJPUigiTUFDIHJlZ2lzdGVyIGFjY2VzcyB0ZXN0IGZhaWxlZCFcbiIpOwotIAkJcmVzdWx0ID0gLUVJTzsKLQkJZ290byBmYWlsZWQ7Ci0JfQotI2VuZGlmCi0KLQkvKiBEbyBhIGNoaXAtbGV2ZWwgcmVzZXQgb24gdGhlIE1BQyAqLwotCWlmIChwcmlzbTJfZG9yZXNldCkgewotCQlyZXN1bHQgPSBoZmEzODR4X2NvcmVyZXNldChodywKLQkJCQlwcmlzbTJfcmVzZXRfaG9sZHRpbWUsCi0JCQkJcHJpc20yX3Jlc2V0X3NldHRsZXRpbWUsIDApOwotCQlpZiAocmVzdWx0ICE9IDApIHsKLQkJCXVucmVnaXN0ZXJfd2xhbmRldih3bGFuZGV2KTsKLQkJCWhmYTM4NHhfZGVzdHJveShodyk7Ci0JCQlXTEFOX0xPR19FUlJPUigKLQkJCQkiJXM6IGhmYTM4NHhfY29yZXJlc2V0KCkgZmFpbGVkLlxuIiwKLQkJCQlkZXZfaW5mbyk7Ci0JCQlyZXN1bHQgPSAtRUlPOwotCQkJZ290byBmYWlsZWQ7Ci0JCX0KLQl9Ci0KLQlwY2lfc2V0X2RydmRhdGEocGRldiwgd2xhbmRldik7Ci0KLQkvKiBTaG91bGRuJ3QgYWN0dWFsbHkgaG9vayB1cCB0aGUgSVJRIHVudGlsIHdlCi0JICogX2tub3dfIHRoaW5ncyBhcmUgYWxyaWdodC4gIEEgdGVzdCByb3V0aW5lIHdvdWxkIGhlbHAuCi0JICovCi0gICAgICAgCXJlcXVlc3RfaXJxKHdsYW5kZXYtPm5ldGRldi0+aXJxLCBoZmEzODR4X2ludGVycnVwdCwKLQkJU0FfU0hJUlEsIHdsYW5kZXYtPm5hbWUsIHdsYW5kZXYpOwotCi0Jd2xhbmRldi0+bXNkc3RhdGUgPSBXTEFOX01TRF9IV1BSRVNFTlQ7Ci0KLQlyZXN1bHQgPSAwOwotCi0JZ290byBkb25lOwotCi0gZmFpbGVkOgotCi0JcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwotCWlmICh3bGFuZGV2KQlrZnJlZSh3bGFuZGV2KTsKLQlpZiAoaHcpCQlrZnJlZShodyk7Ci0gICAgICAgIGlmIChhdHRyX21lbSkgICAgICAgIGlvdW5tYXAoYXR0cl9tZW0pOwotCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7Ci0gICAgICAgIHBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLQotIGRvbmU6Ci0JREJGRVhJVDsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHZvaWQgX19kZXZleGl0IHByaXNtMnN0YV9yZW1vdmVfcGx4KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotICAgICAgIAl3bGFuZGV2aWNlX3QJCSp3bGFuZGV2OwotCWhmYTM4NHhfdCAgICAgICAgICAgICAgICpodzsKLQotCXdsYW5kZXYgPSAod2xhbmRldmljZV90ICopIHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlodyA9IHdsYW5kZXYtPnByaXY7Ci0KLQlwODAyMTFuZXRkZXZfaHdyZW1vdmVkKHdsYW5kZXYpOwotCi0JLyogcmVzZXQgaGFyZHdhcmUgKi8KLQlwcmlzbTJzdGFfaWZzdGF0ZSh3bGFuZGV2LCBQODAyMTFFTlVNX2lmc3RhdGVfZGlzYWJsZSk7Ci0KLSAgICAgICAgaWYgKHBkZXYtPmlycSkKLQkJZnJlZV9pcnEocGRldi0+aXJxLCB3bGFuZGV2KTsKLQotCXVucmVnaXN0ZXJfd2xhbmRldih3bGFuZGV2KTsKLQotCS8qIGZyZWUgbG9jYWwgc3R1ZmYgKi8KLQlpZiAoaHcpIHsKLQkJaGZhMzg0eF9kZXN0cm95KGh3KTsKLQkJa2ZyZWUoaHcpOwotCX0KLQotCWlvdW5tYXAoKHZvaWQgX19pb21lbSAqKXdsYW5kZXYtPm5ldGRldi0+bWVtX3N0YXJ0KTsKLQl3bGFuX3Vuc2V0dXAod2xhbmRldik7Ci0KLQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwotICAgICAgICBwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci0JcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwotCi0Ja2ZyZWUod2xhbmRldik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwbHhfaWRfdGJsW10gPSB7Ci0JewotCQlQQ0lWRU5ET1JfRVVNSVRDT00sIFBDSURFVklDRV9XTDExMDAwLAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAotCQkwLCAwLAotCQkvKiBEcml2ZXIgZGF0YSwgd2UganVzdCBwdXQgdGhlIG5hbWUgaGVyZSAqLwotCQkodW5zaWduZWQgbG9uZykiRXVtaXRjb20gV0wxMTAwMCBQQ0koUExYKSBjYXJkIgotCX0sCi0JewotCQlQQ0lWRU5ET1JfR0xPQkFMU1VOLCBQQ0lERVZJQ0VfR0wyNDExMFAsCi0JCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsCi0JCTAsIDAsCi0JCS8qIERyaXZlciBkYXRhLCB3ZSBqdXN0IHB1dCB0aGUgbmFtZSBoZXJlICovCi0JCSh1bnNpZ25lZCBsb25nKSJHbG9iYWwgU3VuIFRlY2ggR0wyNDExMFAgUENJKFBMWCkgY2FyZCIKLQl9LAotCXsKLQkJUENJVkVORE9SX0dMT0JBTFNVTiwgUENJREVWSUNFX0dMMjQxMTBQX0FMVCwKLQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKLQkJMCwgMCwKLQkJLyogRHJpdmVyIGRhdGEsIHdlIGp1c3QgcHV0IHRoZSBuYW1lIGhlcmUgKi8KLQkJKHVuc2lnbmVkIGxvbmcpIkdsb2JhbCBTdW4gVGVjaCBHTDI0MTEwUCBQQ0koUExYKSBjYXJkIgotCX0sCi0JewotCQlQQ0lWRU5ET1JfTkVUR0VBUiwgUENJREVWSUNFX01BMzAxLAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAotCQkwLCAwLAotCQkvKiBEcml2ZXIgZGF0YSwgd2UganVzdCBwdXQgdGhlIG5hbWUgaGVyZSAqLwotCQkodW5zaWduZWQgbG9uZykiR2xvYmFsIFN1biBUZWNoIEdMMjQxMTBQIFBDSShQTFgpIGNhcmQiCi0JfSwKLQl7Ci0JCVBDSVZFTkRPUl9VU1JPQk9USUNTLCBQQ0lERVZJQ0VfVVNSMjQxMCwKLQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKLQkJMCwgMCwKLQkJLyogRHJpdmVyIGRhdGEsIHdlIGp1c3QgcHV0IHRoZSBuYW1lIGhlcmUgKi8KLQkJKHVuc2lnbmVkIGxvbmcpIlVTIFJvYm90aWNzIFVTUjI0MTAgUENJKFBMWCkgY2FyZCIKLQl9LAotCXsKLQkJUENJVkVORE9SX0xpbmtzeXMsIFBDSURFVklDRV9XcGMxMVdkdDExLAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAotCQkwLCAwLAotCQkvKiBEcml2ZXIgZGF0YSwgd2UganVzdCBwdXQgdGhlIG5hbWUgaGVyZSAqLwotCQkodW5zaWduZWQgbG9uZykiTGlua3N5cyBXUEMxMSB3aXRoIFdEVDExIFBDSShQTFgpIGFkYXB0ZXIiCi0JfSwKLQl7Ci0JICAgICAgICBQQ0lWRU5ET1JfTkRDLCBQQ0lERVZJQ0VfTkNQMTMwX1BMWCwKLQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKLQkJMCwgMCwKLQkJLyogRHJpdmVyIGRhdGEsIHdlIGp1c3QgcHV0IHRoZSBuYW1lIGhlcmUgKi8KLQkJKHVuc2lnbmVkIGxvbmcpIk5EQyBOZXRibGFzdGVyIElJIFBDSShQTFgpIgotCX0sCi0JewotCSAgICAgICAgUENJVkVORE9SX05EQywgUENJREVWSUNFX05DUDEzMF9BU0lDLAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAotCQkwLCAwLAotCQkvKiBEcml2ZXIgZGF0YSwgd2UganVzdCBwdXQgdGhlIG5hbWUgaGVyZSAqLwotCQkodW5zaWduZWQgbG9uZykiTkRDIE5ldGJsYXN0ZXIgSUkgUENJKFRNQzcxNjApIgotCX0sCi0JewotCQlQQ0lWRU5ET1JfM0NPTSwgUENJREVWSUNFX0FJUkNPTk5FQ1QsCi0JCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsCi0JCTAsIDAsCi0JCS8qIERyaXZlciBkYXRhLCB3ZSBqdXN0IHB1dCB0aGUgbmFtZSBoZXJlICovCi0JCSh1bnNpZ25lZCBsb25nKSIzQ29tIEFpckNvbm5lY3QgUENJIDgwMi4xMWIgMTFNYi9zIFdMQU4gQ29udHJvbGxlciIKLQl9LAotCXsKLQkJMCwgMCwgMCwgMCwgMCwgMCwgMAotCX0KLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBwbHhfaWRfdGJsKTsKLQotLyogRnVuY3Rpb24gZGVjbGFyZWQgaGVyZSBiZWNhdXNlIG9mIHB0ciByZWZlcmVuY2UgYmVsb3cgKi8KLXN0YXRpYyBpbnQgX19kZXZpbml0IHByaXNtMnN0YV9wcm9iZV9wbHgoc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCQkJCSBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqKTsKLXN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBwcmlzbTJzdGFfcmVtb3ZlX3BseChzdHJ1Y3QgcGNpX2RldiAqcGRldik7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBwcmlzbTJfcGx4X2Rydl9pZCA9IHsKLSAgICAgICAgLm5hbWUgPSAicHJpc20yX3BseCIsCi0gICAgICAgIC5pZF90YWJsZSA9IHBseF9pZF90YmwsCi0gICAgICAgIC5wcm9iZSA9IHByaXNtMnN0YV9wcm9iZV9wbHgsCi0gICAgICAgIC5yZW1vdmUgPSBwcmlzbTJzdGFfcmVtb3ZlX3BseCwKLSNpZmRlZiBDT05GSUdfUE0KLSAgICAgICAgLnN1c3BlbmQgPSBwcmlzbTJzdGFfc3VzcGVuZF9wY2ksCi0gICAgICAgIC5yZXN1bWUgPSBwcmlzbTJzdGFfcmVzdW1lX3BjaSwKLSNlbmRpZgotfTsKLQotI2lmZGVmIE1PRFVMRQotCi1zdGF0aWMgaW50IF9faW5pdCBwcmlzbTJwbHhfaW5pdCh2b2lkKQotewotICAgICAgICBXTEFOX0xPR19OT1RJQ0UoIiVzIExvYWRlZFxuIiwgdmVyc2lvbik7Ci0JcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmcHJpc20yX3BseF9kcnZfaWQpOwotfTsKLQotc3RhdGljIHZvaWQgX19leGl0IHByaXNtMnBseF9jbGVhbnVwKHZvaWQpCi17Ci0JcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZwcmlzbTJfcGx4X2Rydl9pZCk7Ci19OwotCi1tb2R1bGVfaW5pdChwcmlzbTJwbHhfaW5pdCk7Ci1tb2R1bGVfZXhpdChwcmlzbTJwbHhfY2xlYW51cCk7Ci0KLSNlbmRpZiAvLyBNT0RVTEUKLQotCi1pbnQgaGZhMzg0eF9jb3JlcmVzZXQoaGZhMzg0eF90ICpodywgaW50IGhvbGR0aW1lLCBpbnQgc2V0dGxldGltZSwgaW50IGdlbmVzaXMpCi17Ci0JaW50CQlyZXN1bHQgPSAwOwotCi0jZGVmaW5lIENPUl9PRkZTRVQJMHgzZTAJLyogQ09SIGF0dHJpYnV0ZSBvZmZzZXQgb2YgUHJpc20yIFBDIGNhcmQgKi8KLSNkZWZpbmUgQ09SX1ZBTFVFCTB4NDEJLyogRW5hYmxlIFBDIGNhcmQgd2l0aCBpcnEgaW4gbGV2ZWwgdHJpZ2dlciAqLwotCi0jZGVmaW5lIEhDUl9PRkZTRVQJMHgzZTIJLyogSENSIGF0dHJpYnV0ZSBvZmZzZXQgb2YgUHJpc20yIFBDIGNhcmQgKi8KLQotCVVJTlQ4CQljb3JzYXZlOwotCURCRkVOVEVSOwotCi0JV0xBTl9MT0dfREVCVUcoMywgIkRvaW5nIHJlc2V0IHZpYSBkaXJlY3QgQ09SIGFjY2Vzcy5cbiIpOwotCi0JLyogQ29sbGVjdCBDT1IgKi8KLQljb3JzYXZlID0gcmVhZGIoaHctPm1lbWJhc2UgKyBDT1JfT0ZGU0VUKTsKLQkvKiBXcml0ZSByZXNldCBiaXQgKEJJVDcpICovCi0Jd3JpdGViKGNvcnNhdmUgfCBCSVQ3LCBody0+bWVtYmFzZSArIENPUl9PRkZTRVQpOwotCS8qIEhvbGQgZm9yIGhvbGR0aW1lICovCi0JbWRlbGF5KGhvbGR0aW1lKTsKLQotCWlmIChnZW5lc2lzKSB7Ci0JCXdyaXRlYihnZW5lc2lzLCBody0+bWVtYmFzZSArIEhDUl9PRkZTRVQpOwotCQkvKiBIb2xkIGZvciBob2xkdGltZSAqLwotCQltZGVsYXkoaG9sZHRpbWUpOwotCX0KLQotCS8qIENsZWFyIHJlc2V0IGJpdCAqLwotCXdyaXRlYihjb3JzYXZlICYgfkJJVDcsIGh3LT5tZW1iYXNlICsgQ09SX09GRlNFVCk7Ci0JLyogV2FpdCBmb3Igc2V0dGxldGltZSAqLwotCW1kZWxheShzZXR0bGV0aW1lKTsKLQkvKiBTZXQgbm9uLXJlc2V0IGJpdHMgYmFjayB3aGF0IHRoZXkgd2VyZSAqLwotCXdyaXRlYihjb3JzYXZlLCBody0+bWVtYmFzZSArIENPUl9PRkZTRVQpOwotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMl91c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMl91c2IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ1YmUyMy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJfdXNiLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNjEgKzAsMCBAQAotI2RlZmluZSBXTEFOX0hPU1RJRiBXTEFOX1VTQgotI2luY2x1ZGUgImhmYTM4NHhfdXNiLmMiCi0jaW5jbHVkZSAicHJpc20ybWdtdC5jIgotI2luY2x1ZGUgInByaXNtMm1pYi5jIgotI2luY2x1ZGUgInByaXNtMnN0YS5jIgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNCwwKSkKLSNlcnJvciAicHJpc20yX3VzYiByZXF1aXJlcyBhdCBsZWFzdCBhIDIuNC54IGtlcm5lbCEiCi0jZW5kaWYKLQotI2RlZmluZSBQUklTTV9VU0JfREVWSUNFKHZpZCwgcGlkLCBuYW1lKSBcCi0gICAgICAgICAgIFVTQl9ERVZJQ0UodmlkLCBwaWQpLCAgXAotICAgICAgICAgICAuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgbmFtZQotCi1zdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgdXNiX3ByaXNtX3RibFtdID0gewotCXtQUklTTV9VU0JfREVWSUNFKDB4MDRiYiwgMHgwOTIyLCAiSU9EYXRhIEFpclBvcnQgV04tQjExL1VTQlMiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgwN2FhLCAweDAwMTIsICJDb3JlZ2EgV2lyZWxlc3MgTEFOIFVTQiBTdGljay0xMSIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDA5YWEsIDB4MzY0MiwgIlByaXNtMi54IDExTWJwcyBXTEFOIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MTY2OCwgMHgwNDA4LCAiQWN0aW9udGVjIFByaXNtMi41IDExTWJwcyBXTEFOIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MTY2OCwgMHgwNDIxLCAiQWN0aW9udGVjIFByaXNtMi41IDExTWJwcyBXTEFOIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MTkxNSwgMHgyMjM2LCAiTGlua3N5cyBXVVNCMTF2My4wIDExTWJwcyBXTEFOIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MDY2YiwgMHgyMjEyLCAiTGlua3N5cyBXVVNCMTF2Mi41IDExTWJwcyBXTEFOIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MDY2YiwgMHgyMjEzLCAiTGlua3N5cyBXVVNCMTJ2MS4xIDExTWJwcyBXTEFOIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MDY3YywgMHgxMDIyLCAiU2llbWVucyBTcGVlZFN0cmVhbSAxMDIyIDExTWJwcyBXTEFOIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MDQ5ZiwgMHgwMDMzLCAiQ29tcGFxL0ludGVsIFcxMDAgUFJPL1dpcmVsZXNzIDExTWJwcyBtdWx0aXBvcnQgV0xBTiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MDQxMSwgMHgwMDE2LCAiTWVsY28gV0xJLVVTQi1TMTEgMTFNYnBzIFdMQU4gQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDA4ZGUsIDB4N2EwMSwgIlBSSVNNMjUgSUVFRSA4MDIuMTEgTWluaSBVU0IgQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDgwODYsIDB4MTExMSwgIkludGVsIFBSTy9XaXJlbGVzcyAyMDExQiBMQU4gVVNCIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgwZDhlLCAweDdhMDEsICJQUklTTTI1IElFRUUgODAyLjExIE1pbmkgVVNCIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgwNDVlLCAweDAwNmUsICJNaWNyb3NvZnQgTU41MTAgV2lyZWxlc3MgVVNCIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgwOTY3LCAweDAyMDQsICJBY2VyIFdhcnBsaW5rIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MGNkZSwgMHgwMDAyLCAiWi1Db20gNzI1LzcyNiBQcmlzbTIuNSBVU0IvVVNCIEludGVncmF0ZWQiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgwY2RlLCAweDAwMDUsICJaLUNvbSBYbDczNSBXaXJlbGVzcyA4MDIuMTFiIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4NDEzYywgMHg4MTAwLCAiRGVsbCBUcnVlTW9iaWxlIDExODAgV2lyZWxlc3MgVVNCIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgwYjNiLCAweDE2MDEsICJBTExORVQgMDE5MyAxMU1icHMgV0xBTiBVU0IgQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDBiM2IsIDB4MTYwMiwgIlp5WEVMIFp5QUlSIEIyMDAgV2lyZWxlc3MgVVNCIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgwYmFmLCAweDAwZWIsICJVU1JvYm90aWNzIFVTUjExMjAgV2lyZWxlc3MgVVNCIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgwNDExLCAweDAwMjcsICJNZWxjbyBXTEktVVNCLUtTMTFHIDExTWJwcyBXTEFOIEFkYXB0ZXIiKX0sCi0gICAgICAgIHtQUklTTV9VU0JfREVWSUNFKDB4MDRmMSwgMHgzMDA5LCAiSlZDIE1QLVhQNzI1MCBCdWlsdGluIFVTQiBXTEFOIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgwODQ2LCAweDQxMTAsICJOZXRHZWFyIE1BMTExIil9LAotICAgICAgICB7UFJJU01fVVNCX0RFVklDRSgweDAzZjMsIDB4MDAyMCwgIkFkYXB0ZWMgQVdOLTgwMjAgVVNCIFdMQU4gQWRhcHRlciIpfSwKLS8vCXtQUklTTV9VU0JfREVWSUNFKDB4MGFjZSwgMHgxMjAxLCAiWnlEQVMgWkQxMjAxIFdpcmVsZXNzIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MjgyMSwgMHgzMzAwLCAiQVNVUy1XTDE0MCBXaXJlbGVzcyBVU0IgQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDIwMDEsIDB4MzcwMCwgIkRXTC0xMjIgV2lyZWxlc3MgVVNCIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgyMDAxLCAweDM3MDIsICJEV0wtMTIwIFJldiBGIFdpcmVsZXNzIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4NTBjMiwgMHg0MDEzLCAiQXZlcmF0ZWMgVVNCIFdMQU4gQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDJjMDIsIDB4MTRlYSwgIlBsYW5leCBHVy1VUzExSCBXTEFOIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MTI0YSwgMHgxNjhiLCAiQWlydmFzdCBQUklTTTMgV0xBTiBVU0IgQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDA4M2EsIDB4MzUwMywgIlQtU2ludXMgMTExIFVTQiBXTEFOIEFkYXB0ZXIiKX0sCi0Je1BSSVNNX1VTQl9ERVZJQ0UoMHgyODIxLCAweDMzMDAsICJIYXdraW5nIEhpZ2hEQiBVU0IgQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDA0MTEsIDB4MDA0NCwgIk1lbGNvIFdMSS1VU0ItS0IxMSAxMU1icHMgV0xBTiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MTY2OCwgMHg2MTA2LCAiUk9QRVggRnJlZUxhbiA4MDIuMTFiIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MTI0YSwgMHg0MDE3LCAiUGhlZW5ldCBXTC01MDNJQSA4MDIuMTFiIFVTQiBBZGFwdGVyIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4MGJiMiwgMHgwMzAyLCAiQW1iaXQgTWljcm9zeXN0ZW1zIENvcnAuIil9LAotCXtQUklTTV9VU0JfREVWSUNFKDB4OTAxNiwgMHgxODJkLCAiU2l0ZWNvbSBXTC0wMjIgODAyLjExYiBVU0IgQWRhcHRlciIpfSwKLQl7UFJJU01fVVNCX0RFVklDRSgweDA1NDMsIDB4MGYwMSwgIlZpZXdTb25pYyBBaXJzeW5jIFVTQiBBZGFwdGVyIDExTWJwcyAoUHJpc20yLjUpIil9LAotCXsgLyogdGVybWluYXRvciAqLyB9Ci19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgdXNiX3ByaXNtX3RibCk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJzdGFfcHJvYmVfdXNiCi0qCi0qIFByb2JlIHJvdXRpbmUgY2FsbGVkIGJ5IHRoZSBVU0Igc3Vic3lzdGVtLgotKgotKiBBcmd1bWVudHM6Ci0qCWRldgkJcHRyIHRvIHRoZSB1c2JfZGV2aWNlIHN0cnVjdAotKglpZm51bQkJaW50ZXJmYWNlIG51bWJlciBiZWluZyBvZmZlcmVkCi0qCi0qIFJldHVybnM6Ci0qCU5VTEwJCS0gd2UncmUgbm90IGNsYWltaW5nIHRoZSBkZXZpY2UraW50ZXJmYWNlCi0qCW5vbi1OVUxMCS0gd2UgYXJlIGNsYWltaW5nIHRoZSBkZXZpY2UraW50ZXJmYWNlIGFuZAotKgkJCSAgdGhpcyBpcyBhIHB0ciB0byB0aGUgZGF0YSB3ZSB3YW50IGJhY2sKLSoJCQkgIHdoZW4gZGlzY29ubmVjdCBpcyBjYWxsZWQuCi0qCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglJJ20gbm90IHN1cmUsIGFzc3VtZSBpdCdzIGludGVycnVwdC4KLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgKnByaXNtMnN0YV9wcm9iZV91c2IoCi0Jc3RydWN0IHVzYl9kZXZpY2UgKmRldiwKLQl1bnNpZ25lZCBpbnQgaWZudW0sCi0JY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQotI2Vsc2UKLXN0YXRpYyBpbnQgcHJpc20yc3RhX3Byb2JlX3VzYigKLQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLAotCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKLSNlbmRpZgotewotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKLQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlOwotI2Vsc2UKLQlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2OwotI2VuZGlmCi0KLQl3bGFuZGV2aWNlX3QJKndsYW5kZXYgPSBOVUxMOwotCWhmYTM4NHhfdAkqaHcgPSBOVUxMOwotCWludCAgICAgICAgICAgICAgcmVzdWx0ID0gMDsKLQotCURCRkVOVEVSOwotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKLQlpbnRlcmZhY2UgPSAmZGV2LT5hY3Rjb25maWctPmludGVyZmFjZVtpZm51bV07Ci0jZWxzZQotCWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKTsKLSNlbmRpZgotCi0KLQlpZiAoKHdsYW5kZXYgPSBjcmVhdGVfd2xhbigpKSA9PSBOVUxMKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZS5cbiIsIGRldl9pbmZvKTsKLQkJcmVzdWx0ID0gLUVJTzsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCWh3ID0gd2xhbmRldi0+cHJpdjsKLQotCWlmICggd2xhbl9zZXR1cCh3bGFuZGV2KSAhPSAwICkgewotCQlXTEFOX0xPR19FUlJPUigiJXM6IHdsYW5fc2V0dXAoKSBmYWlsZWQuXG4iLCBkZXZfaW5mbyk7Ci0JCXJlc3VsdCA9IC1FSU87Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQotCS8qIEluaXRpYWxpemUgdGhlIGh3IGRhdGEgKi8KLQloZmEzODR4X2NyZWF0ZShodywgZGV2KTsKLQlody0+d2xhbmRldiA9IHdsYW5kZXY7Ci0KLQkvKiBSZWdpc3RlciB0aGUgd2xhbmRldiwgdGhpcyBnZXRzIHVzIGEgbmFtZSBhbmQgcmVnaXN0ZXJzIHRoZQotCSAqIGxpbnV4IG5ldGRldmljZS4KLQkgKi8KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKSkKLQlTRVRfTkVUREVWX0RFVih3bGFuZGV2LT5uZXRkZXYsICYoaW50ZXJmYWNlLT5kZXYpKTsKLSNlbmRpZgotICAgICAgICBpZiAoIHJlZ2lzdGVyX3dsYW5kZXYod2xhbmRldikgIT0gMCApIHsKLQkJV0xBTl9MT0dfRVJST1IoIiVzOiByZWdpc3Rlcl93bGFuZGV2KCkgZmFpbGVkLlxuIiwgZGV2X2luZm8pOwotCQlyZXN1bHQgPSAtRUlPOwotCQlnb3RvIGZhaWxlZDsKLSAgICAgICAgfQotCi0JLyogRG8gYSBjaGlwLWxldmVsIHJlc2V0IG9uIHRoZSBNQUMgKi8KLQlpZiAocHJpc20yX2RvcmVzZXQpIHsKLQkJcmVzdWx0ID0gaGZhMzg0eF9jb3JlcmVzZXQoaHcsCi0JCQkJcHJpc20yX3Jlc2V0X2hvbGR0aW1lLAotCQkJCXByaXNtMl9yZXNldF9zZXR0bGV0aW1lLCAwKTsKLQkJaWYgKHJlc3VsdCAhPSAwKSB7Ci0JCQl1bnJlZ2lzdGVyX3dsYW5kZXYod2xhbmRldik7Ci0JCQloZmEzODR4X2Rlc3Ryb3koaHcpOwotCQkJcmVzdWx0ID0gLUVJTzsKLQkJCVdMQU5fTE9HX0VSUk9SKAotCQkJCSIlczogaGZhMzg0eF9jb3JlcmVzZXQoKSBmYWlsZWQuXG4iLAotCQkJCWRldl9pbmZvKTsKLQkJCWdvdG8gZmFpbGVkOwotCQl9Ci0JfQotCi0jaWZuZGVmIE5FV19NT0RVTEVfQ09ERQotCXVzYl9pbmNfZGV2X3VzZShkZXYpOwotI2VuZGlmCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMTUpKQotCXVzYl9nZXRfZGV2KGRldik7Ci0jZW5kaWYKLQotCXdsYW5kZXYtPm1zZHN0YXRlID0gV0xBTl9NU0RfSFdQUkVTRU5UOwotCi0JZ290byBkb25lOwotCi0gZmFpbGVkOgotCWlmICh3bGFuZGV2KQlrZnJlZSh3bGFuZGV2KTsKLQlpZiAoaHcpCQlrZnJlZShodyk7Ci0Jd2xhbmRldiA9IE5VTEw7Ci0KLSBkb25lOgotCURCRkVYSVQ7Ci0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApKQotCXJldHVybiB3bGFuZGV2OwotI2Vsc2UKLQl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgd2xhbmRldik7Ci0JcmV0dXJuIHJlc3VsdDsKLSNlbmRpZgotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJzdGFfZGlzY29ubmVjdF91c2IKLSoKLSogQ2FsbGVkIHdoZW4gYSBkZXZpY2UgcHJldmlvdXNseSBjbGFpbWVkIGJ5IHByb2JlIGlzIHJlbW92ZWQKLSogZnJvbSB0aGUgVVNCLgotKgotKiBBcmd1bWVudHM6Ci0qCWRldgkJcHRyIHRvIHRoZSB1c2JfZGV2aWNlIHN0cnVjdAotKglwdHIJCXB0ciByZXR1cm5lZCBieSBwcm9iZSgpIHdoZW4gdGhlIGRldmljZQotKiAgICAgICAgICAgICAgICAgICAgICAgd2FzIGNsYWltZWQuCi0qCi0qIFJldHVybnM6Ci0qCU5vdGhpbmcKLSoKLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpCi1zdGF0aWMgdm9pZCBfX2RldmV4aXQKLXByaXNtMnN0YV9kaXNjb25uZWN0X3VzYihzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB2b2lkICpwdHIpCi0jZWxzZQotc3RhdGljIHZvaWQKLXByaXNtMnN0YV9kaXNjb25uZWN0X3VzYihzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQotI2VuZGlmCi17Ci0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkpCi0Jd2xhbmRldmljZV90CQkqd2xhbmRldjsKLSNlbHNlCi0Jd2xhbmRldmljZV90CQkqd2xhbmRldiA9ICh3bGFuZGV2aWNlX3QqKXB0cjsKLSNlbmRpZgotCi0gICAgICAgIERCRkVOVEVSOwotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkpCi0Jd2xhbmRldiA9ICh3bGFuZGV2aWNlX3QgKikgdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOwotI2VuZGlmCi0KLQlpZiAoIHdsYW5kZXYgIT0gTlVMTCApIHsKLQkJTElTVF9IRUFEKGNsZWFubGlzdCk7Ci0JCXN0cnVjdCBsaXN0X2hlYWQJKmVudHJ5OwotCQlzdHJ1Y3QgbGlzdF9oZWFkCSp0ZW1wOwotCQl1bnNpZ25lZCBsb25nCQlmbGFnczsKLQotCQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0KLQkJaWYgKCFodykKLQkJCWdvdG8gZXhpdDsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPmN0bHhxLmxvY2ssIGZsYWdzKTsKLQotCQlwODAyMTFuZXRkZXZfaHdyZW1vdmVkKHdsYW5kZXYpOwotCQlsaXN0X3NwbGljZV9pbml0KCZody0+Y3RseHEucmVhcGFibGUsICZjbGVhbmxpc3QpOwotCQlsaXN0X3NwbGljZV9pbml0KCZody0+Y3RseHEuY29tcGxldGluZywgJmNsZWFubGlzdCk7Ci0JCWxpc3Rfc3BsaWNlX2luaXQoJmh3LT5jdGx4cS5wZW5kaW5nLCAmY2xlYW5saXN0KTsKLQkJbGlzdF9zcGxpY2VfaW5pdCgmaHctPmN0bHhxLmFjdGl2ZSwgJmNsZWFubGlzdCk7Ci0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPmN0bHhxLmxvY2ssIGZsYWdzKTsKLQotCQkvKiBUaGVyZSdzIG5vIGhhcmR3YXJlIHRvIHNodXRkb3duLCBidXQgdGhlIGRyaXZlcgotCQkgKiBtaWdodCBoYXZlIHNvbWUgdGFza3Mgb3IgdGFza2xldHMgdGhhdCBtdXN0IGJlCi0JCSAqIHN0b3BwZWQgYmVmb3JlIHdlIGNhbiB0ZWFyIGV2ZXJ5dGhpbmcgZG93bi4KLQkJICovCi0JCXByaXNtMnN0YV9pZnN0YXRlKHdsYW5kZXYsIFA4MDIxMUVOVU1faWZzdGF0ZV9kaXNhYmxlKTsKLQotCQlkZWxfc2luZ2xlc2hvdF90aW1lcl9zeW5jKCZody0+dGhyb3R0bGUpOwotCQlkZWxfc2luZ2xlc2hvdF90aW1lcl9zeW5jKCZody0+cmVxdGltZXIpOwotCQlkZWxfc2luZ2xlc2hvdF90aW1lcl9zeW5jKCZody0+cmVzcHRpbWVyKTsKLQotCQkvKiBVbmxpbmsgYWxsIHRoZSBVUkJzLiBUaGlzICJyZW1vdmVzIHRoZSB3aGVlbHMiCi0JCSAqIGZyb20gdGhlIGVudGlyZSBDVExYIGhhbmRsaW5nIG1lY2hhbmlzbS4KLQkJICovCi0JCXVzYl9raWxsX3VyYigmaHctPnJ4X3VyYik7Ci0JCXVzYl9raWxsX3VyYigmaHctPnR4X3VyYik7Ci0JCXVzYl9raWxsX3VyYigmaHctPmN0bHhfdXJiKTsKLQotCQl0YXNrbGV0X2tpbGwoJmh3LT5jb21wbGV0aW9uX2JoKTsKLQkJdGFza2xldF9raWxsKCZody0+cmVhcGVyX2JoKTsKLQotCQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwotCi0JCS8qIE5vdyB3ZSBjb21wbGV0ZSBhbnkgb3V0c3RhbmRpbmcgY29tbWFuZHMKLQkJICogYW5kIHRlbGwgZXZlcnlvbmUgd2hvIGlzIHdhaXRpbmcgZm9yIHRoZWlyCi0JCSAqIHJlc3BvbnNlcyB0aGF0IHdlIGhhdmUgc2h1dCBkb3duLgotCQkgKi8KLQkJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmNsZWFubGlzdCkgewotCQkJaGZhMzg0eF91c2JjdGx4X3QJKmN0bHg7Ci0KLQkJCWN0bHggPSBsaXN0X2VudHJ5KGVudHJ5LCBoZmEzODR4X3VzYmN0bHhfdCwgbGlzdCk7Ci0JCQljb21wbGV0ZSgmY3RseC0+ZG9uZSk7Ci0JCX0KLQotCQkvKiBHaXZlIGFueSBvdXRzdGFuZGluZyBzeW5jaHJvbm91cyBjb21tYW5kcwotCQkgKiBhIGNoYW5jZSB0byBjb21wbGV0ZS4gQWxsIHRoZXkgbmVlZCB0byBkbwotCQkgKiBpcyAid2FrZSB1cCIsIHNvIHRoYXQncyBlYXN5LgotCQkgKiAoSSdkIGxpa2UgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMsIHJlYWxseS4pCi0JCSAqLwotCQltc2xlZXAoMTAwKTsKLQotCQkvKiBOb3cgZGVsZXRlIHRoZSBDVExYcywgYmVjYXVzZSBuby1vbmUgZWxzZSBjYW4gbm93LiAqLwotCQlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cnksIHRlbXAsICZjbGVhbmxpc3QpIHsKLQkJCWhmYTM4NHhfdXNiY3RseF90ICpjdGx4OwotCi0JCQljdGx4ID0gbGlzdF9lbnRyeShlbnRyeSwgaGZhMzg0eF91c2JjdGx4X3QsIGxpc3QpOwotCQkJa2ZyZWUoY3RseCk7Ci0JCX0KLQotCQkvKiBVbmhvb2sgdGhlIHdsYW5kZXYgKi8KLQkJdW5yZWdpc3Rlcl93bGFuZGV2KHdsYW5kZXYpOwotCQl3bGFuX3Vuc2V0dXAod2xhbmRldik7Ci0KLSNpZm5kZWYgTkVXX01PRFVMRV9DT0RFCi0JCXVzYl9kZWNfZGV2X3VzZShody0+dXNiKTsKLSNlbmRpZgotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDE1KSkKLQkJdXNiX3B1dF9kZXYoaHctPnVzYik7Ci0jZW5kaWYKLQotCQloZmEzODR4X2Rlc3Ryb3koaHcpOwotCQlrZnJlZShodyk7Ci0KLQkJa2ZyZWUod2xhbmRldik7Ci0JfQotCi0gZXhpdDoKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApKQotCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKLSNlbmRpZgotCURCRkVYSVQ7Ci19Ci0KLQotc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHByaXNtMl91c2JfZHJpdmVyID0gewotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDQsMTkpKSAmJiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDE2KSkKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLSNlbmRpZgotCS5uYW1lID0gInByaXNtMl91c2IiLAotCS5wcm9iZSA9IHByaXNtMnN0YV9wcm9iZV91c2IsCi0JLmRpc2Nvbm5lY3QgPSBwcmlzbTJzdGFfZGlzY29ubmVjdF91c2IsCi0JLmlkX3RhYmxlID0gdXNiX3ByaXNtX3RibCwKLQkvKiBmb3BzLCBtaW5vcj8gKi8KLX07Ci0KLSNpZmRlZiBNT0RVTEUKLQotc3RhdGljIGludCBfX2luaXQgcHJpc20ydXNiX2luaXQodm9pZCkKLXsKLSAgICAgICAgREJGRU5URVI7Ci0KLSAgICAgICAgV0xBTl9MT0dfTk9USUNFKCIlcyBMb2FkZWRcbiIsIHZlcnNpb24pOwotICAgICAgICBXTEFOX0xPR19OT1RJQ0UoImRldl9pbmZvIGlzOiAlc1xuIiwgZGV2X2luZm8pOwotCi0JLyogVGhpcyBjYWxsIHdpbGwgcmVzdWx0IGluIGNhbGxzIHRvIHByaXNtMnN0YV9wcm9iZV91c2IuICovCi0JcmV0dXJuIHVzYl9yZWdpc3RlcigmcHJpc20yX3VzYl9kcml2ZXIpOwotCi0JREJGRVhJVDsKLX07Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBwcmlzbTJ1c2JfY2xlYW51cCh2b2lkKQotewotICAgICAgICBEQkZFTlRFUjsKLQotCXVzYl9kZXJlZ2lzdGVyKCZwcmlzbTJfdXNiX2RyaXZlcik7Ci0KLSAgICAgICAgcHJpbnRrKEtFUk5fTk9USUNFICIlcyBVbmxvYWRlZFxuIiwgdmVyc2lvbik7Ci0KLQlEQkZFWElUOwotfTsKLQotbW9kdWxlX2luaXQocHJpc20ydXNiX2luaXQpOwotbW9kdWxlX2V4aXQocHJpc20ydXNiX2NsZWFudXApOwotCi0jZW5kaWYgLy8gbW9kdWxlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJtZ210LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJtZ210LmMKaW5kZXggYzk3NTAyNS4uZjE3MjdiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWdtdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMm1nbXQuYwpAQCAtNjEsMTAgKzYxLDYgQEAKIC8qIFN5c3RlbSBJbmNsdWRlcyAqLwogI2RlZmluZSBXTEFOX0RCVkFSCXByaXNtMl9kZWJ1ZwogCi0jaW5jbHVkZSAidmVyc2lvbi5oIgotCi0KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAKICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTc5LDE5ICs3NSw3IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgotCi0jaWYgKFdMQU5fSE9TVElGID09IFdMQU5fVVNCKQogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgotI2VuZGlmCi0KLSNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ01DSUEpCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KLSNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KLSNpbmNsdWRlIDxwY21jaWEvY3MuaD4KLSNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+Ci0jaW5jbHVkZSA8cGNtY2lhL2RzLmg+Ci0jaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgotI2VuZGlmCiAKICNpbmNsdWRlICJ3bGFuX2NvbXBhdC5oIgogCkBAIC0xMDksODkgKzkzLDEyIEBACiAjaW5jbHVkZSAiaGZhMzg0eC5oIgogI2luY2x1ZGUgInByaXNtMm1nbXQuaCIKIAotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIExvY2FsIENvbnN0YW50cyAqLwotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBMb2NhbCBNYWNyb3MgKi8KLQogLyogQ29udmVydHMgODAyLjExIGZvcm1hdCByYXRlIHNwZWNpZmljYXRpb25zIHRvIHByaXNtMiAqLwogI2RlZmluZSBwODAyMTFyYXRlX3RvX3AyYml0KG4pCSgoKChuKSZ+QklUNykgPT0gMikgPyBCSVQwIDogXAogCQkJCSAoKChuKSZ+QklUNykgPT0gNCkgPyBCSVQxIDogXAogCQkJCSAoKChuKSZ+QklUNykgPT0gMTEpID8gQklUMiA6IFwKIAkJCQkgKCgobikmfkJJVDcpID09IDIyKSA/IEJJVDMgOiAwKQogCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogTG9jYWwgVHlwZXMgKi8KLQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogTG9jYWwgU3RhdGljIERlZmluaXRpb25zICovCi0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIExvY2FsIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyAqLwotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBGdW5jdGlvbiBEZWZpbml0aW9ucyAqLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X3Bvd2VybWdtdAotKgotKiBTZXQgdGhlIHBvd2VyIG1hbmFnZW1lbnQgc3RhdGUgb2YgdGhpcyBzdGF0aW9uJ3MgTUFDLgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgltc2dwCQlwdHIgdG8gbXNnIGJ1ZmZlcgotKgotKiBSZXR1cm5zOgotKgkwCXN1Y2Nlc3MgYW5kIGRvbmUKLSoJPDAJc3VjY2VzcywgYnV0IHdlJ3JlIHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byBmaW5pc2guCi0qCT4wCWFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGhhbmRsaW5nIHRoZSBtZXNzYWdlLgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQotKglpbnRlcnJ1cHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMm1nbXRfcG93ZXJtZ210KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKLXsKLQlpbnQgCQkJcmVzdWx0ID0gMDsKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0JcDgwMjExbXNnX2RvdDExcmVxX3Bvd2VybWdtdF90CSptc2cgPSBtc2dwOwotCi0JREJGRU5URVI7Ci0KLQlpZiAoIWh3LT5hcCkgewotCi0JCS8qKiogU1RBVElPTiAqKiovCi0KLQkJLyoKLQkJICogU2V0IENORlBNRU5BQkxFRCAob24gb3Igb2ZmKQotCQkgKiBTZXQgQ05GTVVMVElDQVNUUlggKGlmIFBNIG9uLCBvdGhlcndpc2UgY2xlYXIpCi0JCSAqIFNwb3V0IGEgbm90aWNlIHN0YXRpbmcgdGhhdCBTbGVlcER1cmF0aW9uIGFuZAotCQkgKiBIb2xkb3ZlckR1cmF0aW9uIGFuZCBQTUVQUyBhbHNvIGhhdmUgYW4gaW1wYWN0LgotCQkgKi8KLQkJLyogUG93ZXJtZ210IGlzIGN1cnJlbnRseSB1bnN1cHBvcnRlZCBmb3IgU1RBICovCi0JCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX25vdF9zdXBwb3J0ZWQ7Ci0JfSBlbHNlIHsKLQotCQkvKioqIEFDQ0VTUyBQT0lOVCAqKiovCi0KLQkJLyogUG93ZXJtZ210IGlzIG5ldmVyIHN1cHBvcnRlZCBmb3IgQVAgKi8KLQkJbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZDsKLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIHByaXNtMm1nbXRfc2NhbgogKgpAQCAtMjIxLDcgKzEyOCw3IEBACiAJaW50IAkJCXJlc3VsdCA9IDA7CiAJaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwogCXA4MDIxMW1zZ19kb3QxMXJlcV9zY2FuX3QJKm1zZyA9IG1zZ3A7Ci0gICAgICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgIHJvYW1pbmdtb2RlLCB3b3JkOworICAgICAgICB1MTYgICAgICAgICAgICAgICAgICByb2FtaW5nbW9kZSwgd29yZDsKIAlpbnQgICAgICAgICAgICAgICAgICAgICBpLCB0aW1lb3V0OwogCWludCAgICAgICAgICAgICAgICAgICAgIGlzdG1wZW5hYmxlID0gMDsKIApAQCAtMjI5LDEzICsxMzYsNiBAQAogCiAJREJGRU5URVI7CiAKLSAgICAgICAgaWYgKGh3LT5hcCkgewotICAgICAgICAgICAgICAgIFdMQU5fTE9HX0VSUk9SKCJQcmlzbTIgaW4gQVAgbW9kZSBjYW5ub3QgcGVyZm9ybSBzY2Fucy5cbiIpOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IDE7Ci0gICAgICAgICAgICAgICAgbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZDsKLSAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgICAgIH0KLQogICAgICAgICAvKiBnYXRla2VlcGVyIGNoZWNrICovCiAgICAgICAgIGlmIChIRkEzODR4X0ZJUk1XQVJFX1ZFUlNJT04oaHctPmlkZW50X3N0YV9mdy5tYWpvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBody0+aWRlbnRfc3RhX2Z3Lm1pbm9yLApAQCAtMjk2LDcgKzE5Niw3IEBACiAgICAgICAgIC8qIHNldCB1cCB0aGUgY2hhbm5lbCBsaXN0ICovCiAgICAgICAgIHdvcmQgPSAwOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbXNnLT5jaGFubmVsbGlzdC5kYXRhLmxlbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgVUlOVDggY2hhbm5lbCA9IG1zZy0+Y2hhbm5lbGxpc3QuZGF0YS5kYXRhW2ldOworICAgICAgICAgICAgICAgIHU4IGNoYW5uZWwgPSBtc2ctPmNoYW5uZWxsaXN0LmRhdGEuZGF0YVtpXTsKICAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbCA+IDE0KSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAvKiBjaGFubmVsIDEgaXMgQklUMCAuLi4gY2hhbm5lbCAxNCBpcyBCSVQxMyAqLwogICAgICAgICAgICAgICAgIHdvcmQgfD0gKDEgPDwgKGNoYW5uZWwtMSkpOwpAQCAtMzE3LDcgKzIxNyw3IEBACiAJCWdvdG8gZXhpdDsKIAl9CiAJaWYgKHdvcmQgPT0gSEZBMzg0eF9QT1JUU1RBVFVTX0RJU0FCTEVEKSB7Ci0JCVVJTlQxNiB3b3JkYnVmWzE3XTsKKwkJdTE2IHdvcmRidWZbMTddOwogCiAJCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywKIAkJCUhGQTM4NHhfUklEX0NORlJPQU1JTkdNT0RFLApAQCAtNDgwLDEyICszODAsNiBAQAogCiAJcmVxLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKIAotCWlmIChody0+YXApIHsKLQkJcmVzdWx0ID0gMTsKLQkJcmVxLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZDsKLQkJZ290byBleGl0OwotCX0KLQogCWlmICghIGh3LT5zY2FucmVzdWx0cykgewogCQlXTEFOX0xPR19FUlJPUigiZG90MTFyZXFfc2Nhbl9yZXN1bHRzIGNhbiBvbmx5IGJlIHVzZWQgYWZ0ZXIgYSBzdWNjZXNzZnVsIGRvdDExcmVxX3NjYW4uXG4iKTsKIAkJcmVzdWx0ID0gMjsKQEAgLTYxMiw1NjcgKzUwNiw2IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWdtdF9qb2luCi0qCi0qIEpvaW4gYSBCU1Mgd2hvc2UgQlNTIGRlc2NyaXB0aW9uIHdhcyBwcmV2aW91c2x5IG9idGFpbmVkIHdpdGgKLSogYSBzY2FuLgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgltc2dwCQlwdHIgdG8gbXNnIGJ1ZmZlcgotKgotKiBSZXR1cm5zOgotKgkwCXN1Y2Nlc3MgYW5kIGRvbmUKLSoJPDAJc3VjY2VzcywgYnV0IHdlJ3JlIHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byBmaW5pc2guCi0qCT4wCWFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGhhbmRsaW5nIHRoZSBtZXNzYWdlLgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQotKglpbnRlcnJ1cHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMm1nbXRfam9pbih3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCi17Ci0JaW50IAkJCXJlc3VsdCA9IDA7Ci0JaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwotCXA4MDIxMW1zZ19kb3QxMXJlcV9qb2luX3QJKm1zZyA9IG1zZ3A7Ci0JREJGRU5URVI7Ci0KLQlpZiAoIWh3LT5hcCkgewotCi0JCS8qKiogU1RBVElPTiAqKiovCi0KLQkJLyogVE9ETzogSW1wbGVtZW50IGFmdGVyIHNjYW4gKi8KLQkJbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZDsKLQl9IGVsc2UgewotCi0JCS8qKiogQUNDRVNTIFBPSU5UICoqKi8KLQotCQkvKiBOZXZlciBzdXBwb3J0ZWQgYnkgQVBzICovCi0JCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX25vdF9zdXBwb3J0ZWQ7Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X3AyX2pvaW4KLSoKLSogSm9pbiBhIHNwZWNpZmljIEJTUwotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgltc2dwCQlwdHIgdG8gbXNnIGJ1ZmZlcgotKgotKiBSZXR1cm5zOgotKgkwCXN1Y2Nlc3MgYW5kIGRvbmUKLSoJPDAJc3VjY2VzcywgYnV0IHdlJ3JlIHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byBmaW5pc2guCi0qCT4wCWFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGhhbmRsaW5nIHRoZSBtZXNzYWdlLgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQotKglpbnRlcnJ1cHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMm1nbXRfcDJfam9pbih3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCi17Ci0JaW50IAkJCXJlc3VsdCA9IDA7Ci0JaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwotCXA4MDIxMW1zZ19wMnJlcV9qb2luX3QJKm1zZyA9IG1zZ3A7Ci0JVUlOVDE2CQkJcmVnOwotCXA4MDIxMXBzdHJkX3QJCSpwc3RyOwotCVVJTlQ4CQkJYnl0ZWJ1ZlsyNTZdOwotCWhmYTM4NHhfYnl0ZXN0cl90CSpwMmJ5dGVzdHIgPSAoaGZhMzg0eF9ieXRlc3RyX3QqKWJ5dGVidWY7Ci0gICAgICAgIGhmYTM4NHhfSm9pblJlcXVlc3RfZGF0YV90CWpvaW5yZXE7Ci0JREJGRU5URVI7Ci0KLQlpZiAoIWh3LT5hcCkgewotCi0JCXdsYW5kZXYtPm1hY21vZGUgPSBXTEFOX01BQ01PREVfTk9ORTsKLQotCQkvKioqIFNUQVRJT04gKioqLwotCQkvKiBTZXQgdGhlIFBvcnRUeXBlICovCi0JCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX3N1Y2Nlc3M7Ci0KLQkJLyogZXNzIHBvcnQgKi8KLQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LCBIRkEzODR4X1JJRF9DTkZQT1JUVFlQRSwgMSk7Ci0JCWlmICggcmVzdWx0ICkgewotCQkJV0xBTl9MT0dfRVJST1IoIkZhaWxlZCB0byBzZXQgUG9ydCBUeXBlXG4iKTsKLQkJCWdvdG8gZmFpbGVkOwotCQl9Ci0KLQkJLyogU2V0IHRoZSBhdXRoIHR5cGUgKi8KLQkJaWYgKCBtc2ctPmF1dGh0eXBlLmRhdGEgPT0gUDgwMjExRU5VTV9hdXRoYWxnX3NoYXJlZGtleSApIHsKLQkJCXJlZyA9IEhGQTM4NHhfQ05GQVVUSEVOVElDQVRJT05fU0hBUkVES0VZOwotCQl9IGVsc2UgewotCQkJcmVnID0gSEZBMzg0eF9DTkZBVVRIRU5USUNBVElPTl9PUEVOU1lTVEVNOwotCQl9Ci0JCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgSEZBMzg0eF9SSURfQ05GQVVUSEVOVElDQVRJT04sIHJlZyk7Ci0JCWlmICggcmVzdWx0ICkgewotCQkJV0xBTl9MT0dfRVJST1IoIkZhaWxlZCB0byBzZXQgQXV0aGVudGljYXRpb25cbiIpOwotCQkJZ290byBmYWlsZWQ7Ci0JCX0KLQotCQkvKiBUdXJuIG9mZiBhbGwgcm9hbWluZyAqLwotCQloZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsIEhGQTM4NHhfUklEX0NORlJPQU1JTkdNT0RFLCAzKTsKLQkJaWYgKCByZXN1bHQgKSB7Ci0JCQlXTEFOX0xPR19FUlJPUigiRmFpbGVkIHRvIFR1cm4gb2ZmIFJvYW1pbmdcbiIpOwotCQkJZ290byBmYWlsZWQ7Ci0JCX0KLQotCQkvKiBCYXNpYyByYXRlcyAqLwotICAgICAgICAgICAgICAgIHJlZyA9IDA7Ci0JCWlmICggbXNnLT5iYXNpY3JhdGUxLnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQlyZWcgPSBwODAyMTFyYXRlX3RvX3AyYml0KG1zZy0+YmFzaWNyYXRlMS5kYXRhKTsKLQkJfQotCQlpZiAoIG1zZy0+YmFzaWNyYXRlMi5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rICkgewotCQkJcmVnIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5iYXNpY3JhdGUyLmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5iYXNpY3JhdGUzLnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQlyZWcgfD0gcDgwMjExcmF0ZV90b19wMmJpdChtc2ctPmJhc2ljcmF0ZTMuZGF0YSk7Ci0JCX0KLQkJaWYgKCBtc2ctPmJhc2ljcmF0ZTQuc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vayApIHsKLQkJCXJlZyB8PSBwODAyMTFyYXRlX3RvX3AyYml0KG1zZy0+YmFzaWNyYXRlNC5kYXRhKTsKLQkJfQotCQlpZiAoIG1zZy0+YmFzaWNyYXRlNS5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rICkgewotCQkJcmVnIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5iYXNpY3JhdGU1LmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5iYXNpY3JhdGU2LnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQlyZWcgfD0gcDgwMjExcmF0ZV90b19wMmJpdChtc2ctPmJhc2ljcmF0ZTYuZGF0YSk7Ci0JCX0KLQkJaWYgKCBtc2ctPmJhc2ljcmF0ZTcuc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vayApIHsKLQkJCXJlZyB8PSBwODAyMTFyYXRlX3RvX3AyYml0KG1zZy0+YmFzaWNyYXRlNy5kYXRhKTsKLQkJfQotCQlpZiAoIG1zZy0+YmFzaWNyYXRlOC5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rICkgewotCQkJcmVnIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5iYXNpY3JhdGU4LmRhdGEpOwotCQl9Ci0JCWlmKCByZWcgPT0gMCkKLQkJCSByZWcgPSAweDAzOwotCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsIEhGQTM4NHhfUklEX0NORkJBU0lDUkFURVMsIHJlZyk7Ci0JCWlmICggcmVzdWx0ICkgewotCQkJV0xBTl9MT0dfRVJST1IoIkZhaWxlZCB0byBzZXQgYmFzaWNyYXRlcz0lZC5cbiIsIHJlZyk7Ci0JCQlnb3RvIGZhaWxlZDsKLQkJfQotCi0JCS8qIE9wZXJhdGlvbmFsIHJhdGVzIChzdXBwcmF0ZXMgYW5kIHR4cmF0ZWNvbnRyb2wpICovCi0JCXJlZyA9IDA7Ci0JCWlmICggbXNnLT5vcGVyYXRpb25hbHJhdGUxLnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQlyZWcgPSBwODAyMTFyYXRlX3RvX3AyYml0KG1zZy0+b3BlcmF0aW9uYWxyYXRlMS5kYXRhKTsKLQkJfQotCQlpZiAoIG1zZy0+b3BlcmF0aW9uYWxyYXRlMi5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rICkgewotCQkJcmVnIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5vcGVyYXRpb25hbHJhdGUyLmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5vcGVyYXRpb25hbHJhdGUzLnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQlyZWcgfD0gcDgwMjExcmF0ZV90b19wMmJpdChtc2ctPm9wZXJhdGlvbmFscmF0ZTMuZGF0YSk7Ci0JCX0KLQkJaWYgKCBtc2ctPm9wZXJhdGlvbmFscmF0ZTQuc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vayApIHsKLQkJCXJlZyB8PSBwODAyMTFyYXRlX3RvX3AyYml0KG1zZy0+b3BlcmF0aW9uYWxyYXRlNC5kYXRhKTsKLQkJfQotCQlpZiAoIG1zZy0+b3BlcmF0aW9uYWxyYXRlNS5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rICkgewotCQkJcmVnIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5vcGVyYXRpb25hbHJhdGU1LmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5vcGVyYXRpb25hbHJhdGU2LnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQlyZWcgfD0gcDgwMjExcmF0ZV90b19wMmJpdChtc2ctPm9wZXJhdGlvbmFscmF0ZTYuZGF0YSk7Ci0JCX0KLQkJaWYgKCBtc2ctPm9wZXJhdGlvbmFscmF0ZTcuc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vayApIHsKLQkJCXJlZyB8PSBwODAyMTFyYXRlX3RvX3AyYml0KG1zZy0+b3BlcmF0aW9uYWxyYXRlNy5kYXRhKTsKLQkJfQotCQlpZiAoIG1zZy0+b3BlcmF0aW9uYWxyYXRlOC5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rICkgewotCQkJcmVnIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5vcGVyYXRpb25hbHJhdGU4LmRhdGEpOwotCQl9Ci0JCWlmKCByZWcgPT0gMCkKLQkJCSByZWcgPSAweDBmOwotCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsIEhGQTM4NHhfUklEX0NORlNVUFBSQVRFUywgcmVnKTsKLQkJaWYgKCByZXN1bHQgKSB7Ci0JCQlXTEFOX0xPR19FUlJPUigiRmFpbGVkIHRvIHNldCBzdXBwcmF0ZXM9JWQuXG4iLCByZWcpOwotCQkJZ290byBmYWlsZWQ7Ci0JCX0KLQotIAkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LCBIRkEzODR4X1JJRF9UWFJBVEVDTlRMLCByZWcpOwotCQlpZiAoIHJlc3VsdCApIHsKLQkJCVdMQU5fTE9HX0VSUk9SKCJGYWlsZWQgdG8gc2V0IHR4cmF0ZXM9JWQuXG4iLCByZWcpOwotCQkJZ290byBmYWlsZWQ7Ci0JCX0KLQotCQkvKiBTZXQgdGhlIHNzaWQgKi8KLQkJbWVtc2V0KGJ5dGVidWYsIDAsIDI1Nik7Ci0JCXBzdHIgPSAocDgwMjExcHN0cmRfdCopJihtc2ctPnNzaWQuZGF0YSk7Ci0JCXByaXNtMm1nbXRfcHN0cjJieXRlc3RyKHAyYnl0ZXN0ciwgcHN0cik7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoCi0JCQlodywgSEZBMzg0eF9SSURfQ05GREVTSVJFRFNTSUQsCi0JCQlieXRlYnVmLCBIRkEzODR4X1JJRF9DTkZERVNJUkVEU1NJRF9MRU4pOwotCQlpZiAoIHJlc3VsdCApIHsKLQkJCVdMQU5fTE9HX0VSUk9SKCJGYWlsZWQgdG8gc2V0IFNTSURcbiIpOwotCQkJZ290byBmYWlsZWQ7Ci0JCX0KLQotCQkvKiBFbmFibGUgdGhlIFBvcnQgKi8KLQkJcmVzdWx0ID0gaGZhMzg0eF9jbWRfZW5hYmxlKGh3LCAwKTsKLQkJaWYgKCByZXN1bHQgKSB7Ci0JCQlXTEFOX0xPR19FUlJPUigiRW5hYmxlIG1hY3BvcnQgZmFpbGVkLCByZXN1bHQ9JWQuXG4iLCByZXN1bHQpOwotCQkJZ290byBmYWlsZWQ7Ci0JCX0KLQotCQkvKiBGaWxsIGluIHRoZSBqb2luIHJlcXVlc3QgKi8KLQkJam9pbnJlcS5jaGFubmVsID0gbXNnLT5jaGFubmVsLmRhdGE7Ci0JCW1lbWNweSggam9pbnJlcS5ic3NpZCwgKCh1bnNpZ25lZCBjaGFyICopICZtc2ctPmJzc2lkLmRhdGEpICsgMSwgV0xBTl9CU1NJRF9MRU4pOwotCQlody0+am9pbnJlcSA9IGpvaW5yZXE7Ci0JCWh3LT5qb2luX2FwID0gMTsKLQotCQkvKiBTZW5kIHRoZSBqb2luIHJlcXVlc3QgKi8KLQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZyggaHcsCi0JCQlIRkEzODR4X1JJRF9KT0lOUkVRVUVTVCwKLQkJCSZqb2lucmVxLCBIRkEzODR4X1JJRF9KT0lOUkVRVUVTVF9MRU4pOwotICAgICAgICAgICAgICAgIGlmKHJlc3VsdCAhPSAwKSB7Ci0JCQlXTEFOX0xPR19FUlJPUigiSm9pbiByZXF1ZXN0IGZhaWxlZCwgcmVzdWx0PSVkLlxuIiwgcmVzdWx0KTsKLQkJCWdvdG8gZmFpbGVkOwotCQl9Ci0KLQl9IGVsc2UgewotCi0JCS8qKiogQUNDRVNTIFBPSU5UICoqKi8KLQotCQkvKiBOZXZlciBzdXBwb3J0ZWQgYnkgQVBzICovCi0JCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX25vdF9zdXBwb3J0ZWQ7Ci0JfQotCi0gICAgICAgIGdvdG8gZG9uZTsKLWZhaWxlZDoKLQlXTEFOX0xPR19ERUJVRygxLCAiRmFpbGVkIHRvIHNldCBhIGNvbmZpZyBvcHRpb24sIHJlc3VsdD0lZFxuIiwgcmVzdWx0KTsKLQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9pbnZhbGlkX3BhcmFtZXRlcnM7Ci0KLWRvbmU6Ci0gICAgICAgIHJlc3VsdCA9IDA7Ci0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1nbXRfYXV0aGVudGljYXRlCi0qCi0qIFN0YXRpb24gc2hvdWxkIGJlIGJlZ2luIGFuIGF1dGhlbnRpY2F0aW9uIGV4Y2hhbmdlLgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgltc2dwCQlwdHIgdG8gbXNnIGJ1ZmZlcgotKgotKiBSZXR1cm5zOgotKgkwCXN1Y2Nlc3MgYW5kIGRvbmUKLSoJPDAJc3VjY2VzcywgYnV0IHdlJ3JlIHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byBmaW5pc2guCi0qCT4wCWFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGhhbmRsaW5nIHRoZSBtZXNzYWdlLgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQotKglpbnRlcnJ1cHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMm1nbXRfYXV0aGVudGljYXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKLXsKLQlpbnQgCQkJcmVzdWx0ID0gMDsKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0JcDgwMjExbXNnX2RvdDExcmVxX2F1dGhlbnRpY2F0ZV90CSptc2cgPSBtc2dwOwotCURCRkVOVEVSOwotCi0JaWYgKCFody0+YXApIHsKLQotCQkvKioqIFNUQVRJT04gKioqLwotCi0JCS8qIFRPRE86IERlY2lkZSBob3cgd2UncmUgZ29pbmcgdG8gaGFuZGxlIHRoaXMgb25lIHcvIFByaXNtMiAqLwotCQkvKiAgICAgICBJdCBjb3VsZCBiZSBlbnRlcnRhaW5pbmcgc2luY2UgUHJpc20yIGRvZXNuJ3QgaGF2ZSAgKi8KLQkJLyogICAgICAgYW4gZXhwbGljaXQgd2F5IHRvIGNvbnRyb2wgdGhpcyAqLwotCQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9ub3Rfc3VwcG9ydGVkOwotCX0gZWxzZSB7Ci0KLQkJLyoqKiBBQ0NFU1MgUE9JTlQgKioqLwotCi0JCS8qIE5ldmVyIHN1cHBvcnRlZCBieSBBUHMgKi8KLQkJbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZDsKLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1nbXRfZGVhdXRoZW50aWNhdGUKLSoKLSogU2VuZCBhIGRlYXV0aGVudGljYXRlIG5vdGlmaWNhdGlvbi4KLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQl3bGFuIGRldmljZSBzdHJ1Y3R1cmUKLSoJbXNncAkJcHRyIHRvIG1zZyBidWZmZXIKLSoKLSogUmV0dXJuczoKLSoJMAlzdWNjZXNzIGFuZCBkb25lCi0qCTwwCXN1Y2Nlc3MsIGJ1dCB3ZSdyZSB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gZmluaXNoLgotKgk+MAlhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyB0aGUgbWVzc2FnZS4KLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKLSoJaW50ZXJydXB0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X2RlYXV0aGVudGljYXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKLXsKLQlpbnQgCQkJcmVzdWx0ID0gMDsKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0JcDgwMjExbXNnX2RvdDExcmVxX2RlYXV0aGVudGljYXRlX3QJKm1zZyA9IG1zZ3A7Ci0JREJGRU5URVI7Ci0KLQlpZiAoIWh3LT5hcCkgewotCi0JCS8qKiogU1RBVElPTiAqKiovCi0KLQkJLyogVE9ETzogRGVjaWRlIGhvdyB3ZSdyZSBnb2luZyB0byBoYW5kbGUgdGhpcyBvbmUgdy8gUHJpc20yICovCi0JCS8qICAgICAgIEl0IGNvdWxkIGJlIGVudGVydGFpbmluZyBzaW5jZSBQcmlzbTIgZG9lc24ndCBoYXZlICAqLwotCQkvKiAgICAgICBhbiBleHBsaWNpdCB3YXkgdG8gY29udHJvbCB0aGlzICovCi0JCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX25vdF9zdXBwb3J0ZWQ7Ci0JfSBlbHNlIHsKLQotCQkvKioqIEFDQ0VTUyBQT0lOVCAqKiovCi0JCWhmYTM4NHhfZHJ2cl9oYW5kb3ZlcihodywgbXNnLT5wZWVyc3RhYWRkcmVzcy5kYXRhLmRhdGEpOwotCQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9zdWNjZXNzOwotCX0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWdtdF9hc3NvY2lhdGUKLSoKLSogQXNzb2NpYXRlIHdpdGggYW4gRVNTLgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgltc2dwCQlwdHIgdG8gbXNnIGJ1ZmZlcgotKgotKiBSZXR1cm5zOgotKgkwCXN1Y2Nlc3MgYW5kIGRvbmUKLSoJPDAJc3VjY2VzcywgYnV0IHdlJ3JlIHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byBmaW5pc2guCi0qCT4wCWFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGhhbmRsaW5nIHRoZSBtZXNzYWdlLgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQotKglpbnRlcnJ1cHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMm1nbXRfYXNzb2NpYXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKLXsKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0JaW50IAkJCXJlc3VsdCA9IDA7Ci0JcDgwMjExbXNnX2RvdDExcmVxX2Fzc29jaWF0ZV90CSptc2cgPSBtc2dwOwotCURCRkVOVEVSOwotCi0JaWYgKCFody0+YXApIHsKLQotCQkvKioqIFNUQVRJT04gKioqLwotCi0jaWYgMAotCQkvKiBTZXQgdGhlIFR4UmF0ZXMgKi8KLQkJcmVnID0gMHgwMDBmOwotCQloZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsIEhGQTM4NHhfUklEX1RYUkFURUNOVEwsIHJlZyk7Ci0jZW5kaWYKLQotCQkvKiBTZXQgdGhlIFBvcnRUeXBlICovCi0JCS8qIGVzcyBwb3J0ICovCi0JCWhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgSEZBMzg0eF9SSURfQ05GUE9SVFRZUEUsIDEpOwotCi0JCS8qIEVuYWJsZSB0aGUgUG9ydCAqLwotCQloZmEzODR4X2RydnJfZW5hYmxlKGh3LCAwKTsKLQotCQkvKiBTZXQgdGhlIHJlc3VsdGNvZGUgKi8KLQkJbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfc3VjY2VzczsKLQotCX0gZWxzZSB7Ci0KLQkJLyoqKiBBQ0NFU1MgUE9JTlQgKioqLwotCi0JCS8qIE5ldmVyIHN1cHBvcnRlZCBvbiBBUCAqLwotCQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9ub3Rfc3VwcG9ydGVkOwotCX0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWdtdF9yZWFzc29jaWF0ZQotKgotKiBSZW5ldyBhc3NvY2lhdGlvbiBiZWNhdXNlIG9mIGEgQlNTIGNoYW5nZS4KLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQl3bGFuIGRldmljZSBzdHJ1Y3R1cmUKLSoJbXNncAkJcHRyIHRvIG1zZyBidWZmZXIKLSoKLSogUmV0dXJuczoKLSoJMAlzdWNjZXNzIGFuZCBkb25lCi0qCTwwCXN1Y2Nlc3MsIGJ1dCB3ZSdyZSB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gZmluaXNoLgotKgk+MAlhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyB0aGUgbWVzc2FnZS4KLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKLSoJaW50ZXJydXB0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X3JlYXNzb2NpYXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKLXsKLQlpbnQgCQkJcmVzdWx0ID0gMDsKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0JcDgwMjExbXNnX2RvdDExcmVxX3JlYXNzb2NpYXRlX3QJKm1zZyA9IG1zZ3A7Ci0JREJGRU5URVI7Ci0KLQlpZiAoIWh3LT5hcCkgewotCi0JCS8qKiogU1RBVElPTiAqKiovCi0KLQkJLyogVE9ETzogTm90IHN1cHBvcnRlZCB5ZXQuLi5ub3Qgc3VyZSBob3cgd2UncmUgZ29pbmcgdG8gZG8gaXQgKi8KLQkJbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZDsKLQl9IGVsc2UgewotCi0JCS8qKiogQUNDRVNTIFBPSU5UICoqKi8KLQotCQkvKiBOZXZlciBzdXBwb3J0ZWQgb24gQVAgKi8KLQkJbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZDsKLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1nbXRfZGlzYXNzb2NpYXRlCi0qCi0qIFNlbmQgYSBkaXNhc3NvY2lhdGlvbiBub3RpZmljYXRpb24uCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qCW1zZ3AJCXB0ciB0byBtc2cgYnVmZmVyCi0qCi0qIFJldHVybnM6Ci0qCTAJc3VjY2VzcyBhbmQgZG9uZQotKgk8MAlzdWNjZXNzLCBidXQgd2UncmUgd2FpdGluZyBmb3Igc29tZXRoaW5nIHRvIGZpbmlzaC4KLSoJPjAJYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgdGhlIG1lc3NhZ2UuCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCi0qCWludGVycnVwdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9kaXNhc3NvY2lhdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKQotewotCWludCAJCQlyZXN1bHQgPSAwOwotCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlwODAyMTFtc2dfZG90MTFyZXFfZGlzYXNzb2NpYXRlX3QJKm1zZyA9IG1zZ3A7Ci0JREJGRU5URVI7Ci0KLQlpZiAoIWh3LT5hcCkgewotCi0JCS8qKiogU1RBVElPTiAqKiovCi0KLQkJLyogVE9ETzogTm90IHN1cHBvcnRlZCB5ZXQuLi5ub3Qgc3VyZSBob3cgdG8gZG8gaXQgKi8KLQkJbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZDsKLQl9IGVsc2UgewotCi0JCS8qKiogQUNDRVNTIFBPSU5UICoqKi8KLQkJaGZhMzg0eF9kcnZyX2hhbmRvdmVyKGh3LCBtc2ctPnBlZXJzdGFhZGRyZXNzLmRhdGEuZGF0YSk7Ci0JCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX3N1Y2Nlc3M7Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X3Jlc2V0Ci0qCi0qIFJlc2V0IHRoZSBNQUMgYW5kIE1TRC4gIFRoZSBwODAyMTEgbGF5ZXIgaGFzIGl0J3Mgb3duIGhhbmRsaW5nCi0qIHRoYXQgc2hvdWxkIGJlIGRvbmUgYmVmb3JlIGFuZCBhZnRlciB0aGlzIGZ1bmN0aW9uLgotKiBQcm9jZWR1cmU6Ci0qICAgLSBkaXNhYmxlIHN5c3RlbSBpbnRlcnJ1cHRzID8/Ci0qICAgLSBkaXNhYmxlIE1BQyBpbnRlcnJ1cHRzCi0qICAgLSByZXN0b3JlIHN5c3RlbSBpbnRlcnJ1cHRzCi0qICAgLSBpc3N1ZSB0aGUgTUFDIGluaXRpYWxpemUgY29tbWFuZAotKiAgIC0gY2xlYXIgYW55IE1TRCBsZXZlbCBzdGF0ZSAoaW5jbHVkaW5nIHRpbWVycywgcXVldWVkIGV2ZW50cywKLSogICAgIGV0Yy4pLiAgTm90ZSB0aGF0IGlmIHdlJ3JlIHJlbW92aW5nIHRpbWVyJ2QvcXVldWUgZXZlbnRzLCB3ZSBtYXkKLSogICAgIG5lZWQgdG8gaGF2ZSByZW1haW5lZCBpbiB0aGUgc3lzdGVtIGludGVycnVwdCBkaXNhYmxlZCBzdGF0ZS4KLSogICAgIFdlIHNob3VsZCBiZSBsZWZ0IGluIHRoZSBzYW1lIHN0YXRlIHRoYXQgd2UncmUgaW4gZm9sbG93aW5nCi0qICAgICBkcml2ZXIgaW5pdGlhbGl6YXRpb24uCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qCW1zZ3AJCXB0ciB0byBtc2cgYnVmZmVyLCBNQVkgQkUgTlVMTCEgZm9yIGEgZHJpdmVyIGxvY2FsCi0qCQkJY2FsbC4KLSoKLSogUmV0dXJuczoKLSoJMAlzdWNjZXNzIGFuZCBkb25lCi0qCTwwCXN1Y2Nlc3MsIGJ1dCB3ZSdyZSB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gZmluaXNoLgotKgk+MAlhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyB0aGUgbWVzc2FnZS4KLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkLCBjb21tb25seSB3bGFuY3RsLCBidXQgbWlnaHQgYmUgcm1tb2QvcGNpX2Nsb3NlLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9yZXNldCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCi17Ci0JaW50IAkJCXJlc3VsdCA9IDA7Ci0JaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwotCXA4MDIxMW1zZ19kb3QxMXJlcV9yZXNldF90CSptc2cgPSBtc2dwOwotCURCRkVOVEVSOwotCi0JLyoKLQkgKiBUaGlzIGlzIHN1cHBvcnRlZCBvbiBib3RoIEFQIGFuZCBTVEEgYW5kIGl0J3Mgbm90IGFsbG93ZWQKLQkgKiB0byBmYWlsLgotCSAqLwotCWlmICggbXNncCApIHsKLQkJbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfc3VjY2VzczsKLQkJV0xBTl9MT0dfSU5GTygiZG90MTFyZXFfcmVzZXQ6IHRoZSBtYWNhZGRyZXNzIGFuZCAiCi0JCQkic2V0ZGVmYXVsdG1pYiBhcmd1bWVudHMgYXJlIGN1cnJlbnRseSB1bnN1cHBvcnRlZC5cbiIpOwotCX0KLQotCS8qCi0JICogSWYgd2UgZ290IHRoaXMgZmFyLCB0aGUgTVNEIG11c3QgYmUgaW4gdGhlIE1TRFJVTk5JTkcgc3RhdGUKLQkgKiB0aGVyZWZvcmUsIHdlIG11c3Qgc3RvcCBhbmQgdGhlbiByZXN0YXJ0IHRoZSBody9NQUMgY29tYm8uCi0JICovCi0JaGZhMzg0eF9kcnZyX3N0b3AoaHcpOwotCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zdGFydChodyk7Ci0JaWYgKHJlc3VsdCAhPSAwKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCJkb3QxMXJlcV9yZXNldDogSW5pdGlhbGl6ZSBjb21tYW5kIGZhaWxlZCwiCi0JCQkJIiBiYWQgdGhpbmdzIHdpbGwgaGFwcGVuIGZyb20gaGVyZS5cbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybiAwOwotfQotCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBwcmlzbTJtZ210X3N0YXJ0CiAqCkBAIC0xMTk5LDEwICs1MzIsOSBAQAogCXA4MDIxMW1zZ19kb3QxMXJlcV9zdGFydF90CSptc2cgPSBtc2dwOwogCiAJcDgwMjExcHN0cmRfdAkJKnBzdHI7Ci0JVUlOVDgJCQlieXRlYnVmWzgwXTsKKwl1OAkJCWJ5dGVidWZbODBdOwogCWhmYTM4NHhfYnl0ZXN0cl90CSpwMmJ5dGVzdHIgPSAoaGZhMzg0eF9ieXRlc3RyX3QqKWJ5dGVidWY7Ci0JaGZhMzg0eF9QQ0ZJbmZvX2RhdGFfdAkqcGNmaW5mbyA9IChoZmEzODR4X1BDRkluZm9fZGF0YV90KilieXRlYnVmOwotCVVJTlQxNgkJCXdvcmQ7CisJdTE2CQkJd29yZDsKIAlEQkZFTlRFUjsKIAogCXdsYW5kZXYtPm1hY21vZGUgPSBXTEFOX01BQ01PREVfTk9ORTsKQEAgLTEyMTAsMTcwICs1NDIsNDUgQEAKIAkvKiBTZXQgdGhlIFNTSUQgKi8KIAltZW1jcHkoJndsYW5kZXYtPnNzaWQsICZtc2ctPnNzaWQuZGF0YSwgc2l6ZW9mKG1zZy0+c3NpZC5kYXRhKSk7CiAKLQlpZiAoIWh3LT5hcCkgewotCQkvKioqIEFESE9DIElCU1MgKioqLwotCQkvKiBzZWUgaWYgY3VycmVudCBmL3cgaXMgbGVzcyB0aGFuIDhjMyAqLwotCQlpZiAoSEZBMzg0eF9GSVJNV0FSRV9WRVJTSU9OKGh3LT5pZGVudF9zdGFfZncubWFqb3IsCi0JCQkJCSAgICAgaHctPmlkZW50X3N0YV9mdy5taW5vciwKLQkJCQkJICAgICBody0+aWRlbnRfc3RhX2Z3LnZhcmlhbnQpIDwKLQkJICAgIEhGQTM4NHhfRklSTVdBUkVfVkVSU0lPTigwLDgsMykpIHsKLQkJCS8qIEFkLUhvYyBub3QgcXVpdGUgc3VwcG9ydGVkIG9uIFByaXNtMiAqLwotCQkJbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQkJCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX25vdF9zdXBwb3J0ZWQ7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQotICAJCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0KLQkJLyoqKiBTVEFUSU9OICoqKi8KLQkJLyogU2V0IHRoZSBSRVFVSVJFRCBjb25maWcgaXRlbXMgKi8KLQkJLyogU1NJRCAqLwotCQlwc3RyID0gKHA4MDIxMXBzdHJkX3QqKSYobXNnLT5zc2lkLmRhdGEpOwotCQlwcmlzbTJtZ210X3BzdHIyYnl0ZXN0cihwMmJ5dGVzdHIsIHBzdHIpOwotCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnKCBodywgSEZBMzg0eF9SSURfQ05GT1dOU1NJRCwKLQkJCQlieXRlYnVmLCBIRkEzODR4X1JJRF9DTkZPV05TU0lEX0xFTik7Ci0JCWlmICggcmVzdWx0ICkgewotCQkJV0xBTl9MT0dfRVJST1IoIkZhaWxlZCB0byBzZXQgQ25mT3duU1NJRFxuIik7Ci0JCQlnb3RvIGZhaWxlZDsKLQkJfQotCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnKCBodywgSEZBMzg0eF9SSURfQ05GREVTSVJFRFNTSUQsCi0JCQkJYnl0ZWJ1ZiwgSEZBMzg0eF9SSURfQ05GREVTSVJFRFNTSURfTEVOKTsKLQkJaWYgKCByZXN1bHQgKSB7Ci0JCQlXTEFOX0xPR19FUlJPUigiRmFpbGVkIHRvIHNldCBDbmZEZXNpcmVkU1NJRFxuIik7Ci0JCQlnb3RvIGZhaWxlZDsKLQkJfQotCi0JCS8qIGJzc3R5cGUgLSB3ZSB1c2UgdGhlIGRlZmF1bHQgaW4gdGhlIGFwIGZpcm13YXJlICovCi0JCS8qIElCU1MgcG9ydCAqLwotCQloZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsIEhGQTM4NHhfUklEX0NORlBPUlRUWVBFLCAwKTsKLQotCQkvKiBiZWFjb24gcGVyaW9kICovCi0JCXdvcmQgPSBtc2ctPmJlYWNvbnBlcmlvZC5kYXRhOwotCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsIEhGQTM4NHhfUklEX0NORkFQQkNOSU5ULCB3b3JkKTsKLQkJaWYgKCByZXN1bHQgKSB7Ci0JCQlXTEFOX0xPR19FUlJPUigiRmFpbGVkIHRvIHNldCBiZWFjb24gcGVyaW9kPSVkLlxuIiwgd29yZCk7Ci0JCQlnb3RvIGZhaWxlZDsKLQkJfQotCi0JCS8qIGRzY2hhbm5lbCAqLwotCQl3b3JkID0gbXNnLT5kc2NoYW5uZWwuZGF0YTsKLQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LCBIRkEzODR4X1JJRF9DTkZPV05DSEFOTkVMLCB3b3JkKTsKLQkJaWYgKCByZXN1bHQgKSB7Ci0JCQlXTEFOX0xPR19FUlJPUigiRmFpbGVkIHRvIHNldCBjaGFubmVsPSVkLlxuIiwgd29yZCk7Ci0JCQlnb3RvIGZhaWxlZDsKLQkJfQotCQkvKiBCYXNpYyByYXRlcyAqLwotCQl3b3JkID0gcDgwMjExcmF0ZV90b19wMmJpdChtc2ctPmJhc2ljcmF0ZTEuZGF0YSk7Ci0JCWlmICggbXNnLT5iYXNpY3JhdGUyLnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQl3b3JkIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5iYXNpY3JhdGUyLmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5iYXNpY3JhdGUzLnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQl3b3JkIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5iYXNpY3JhdGUzLmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5iYXNpY3JhdGU0LnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQl3b3JkIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5iYXNpY3JhdGU0LmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5iYXNpY3JhdGU1LnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQl3b3JkIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5iYXNpY3JhdGU1LmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5iYXNpY3JhdGU2LnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQl3b3JkIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5iYXNpY3JhdGU2LmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5iYXNpY3JhdGU3LnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQl3b3JkIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5iYXNpY3JhdGU3LmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5iYXNpY3JhdGU4LnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQl3b3JkIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5iYXNpY3JhdGU4LmRhdGEpOwotCQl9Ci0JCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgSEZBMzg0eF9SSURfQ05GQkFTSUNSQVRFUywgd29yZCk7Ci0JCWlmICggcmVzdWx0ICkgewotCQkJV0xBTl9MT0dfRVJST1IoIkZhaWxlZCB0byBzZXQgYmFzaWNyYXRlcz0lZC5cbiIsIHdvcmQpOwotCQkJZ290byBmYWlsZWQ7Ci0JCX0KLQotCQkvKiBPcGVyYXRpb25hbCByYXRlcyAoc3VwcHJhdGVzIGFuZCB0eHJhdGVjb250cm9sKSAqLwotCQl3b3JkID0gcDgwMjExcmF0ZV90b19wMmJpdChtc2ctPm9wZXJhdGlvbmFscmF0ZTEuZGF0YSk7Ci0JCWlmICggbXNnLT5vcGVyYXRpb25hbHJhdGUyLnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQl3b3JkIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5vcGVyYXRpb25hbHJhdGUyLmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5vcGVyYXRpb25hbHJhdGUzLnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQl3b3JkIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5vcGVyYXRpb25hbHJhdGUzLmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5vcGVyYXRpb25hbHJhdGU0LnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQl3b3JkIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5vcGVyYXRpb25hbHJhdGU0LmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5vcGVyYXRpb25hbHJhdGU1LnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQl3b3JkIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5vcGVyYXRpb25hbHJhdGU1LmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5vcGVyYXRpb25hbHJhdGU2LnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQl3b3JkIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5vcGVyYXRpb25hbHJhdGU2LmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5vcGVyYXRpb25hbHJhdGU3LnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQl3b3JkIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5vcGVyYXRpb25hbHJhdGU3LmRhdGEpOwotCQl9Ci0JCWlmICggbXNnLT5vcGVyYXRpb25hbHJhdGU4LnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2sgKSB7Ci0JCQl3b3JkIHw9IHA4MDIxMXJhdGVfdG9fcDJiaXQobXNnLT5vcGVyYXRpb25hbHJhdGU4LmRhdGEpOwotCQl9Ci0JCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgSEZBMzg0eF9SSURfQ05GU1VQUFJBVEVTLCB3b3JkKTsKLQkJaWYgKCByZXN1bHQgKSB7Ci0JCQlXTEFOX0xPR19FUlJPUigiRmFpbGVkIHRvIHNldCBzdXBwcmF0ZXM9JWQuXG4iLCB3b3JkKTsKLQkJCWdvdG8gZmFpbGVkOwotCQl9Ci0KLSAJCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgSEZBMzg0eF9SSURfVFhSQVRFQ05UTCwgd29yZCk7Ci0JCWlmICggcmVzdWx0ICkgewotCQkJV0xBTl9MT0dfRVJST1IoIkZhaWxlZCB0byBzZXQgdHhyYXRlcz0lZC5cbiIsIHdvcmQpOwotCQkJZ290byBmYWlsZWQ7Ci0JCX0KLQotCQkvKiBTZXQgdGhlIG1hY21vZGUgc28gdGhlIGZyYW1lIHNldHVwIGNvZGUga25vd3Mgd2hhdCB0byBkbyAqLwotCQlpZiAoIG1zZy0+YnNzdHlwZS5kYXRhID09IFA4MDIxMUVOVU1fYnNzdHlwZV9pbmRlcGVuZGVudCApIHsKLQkJCXdsYW5kZXYtPm1hY21vZGUgPSBXTEFOX01BQ01PREVfSUJTU19TVEE7Ci0JCQkvKiBsZXRzIGV4dGVuZCB0aGUgZGF0YSBsZW5ndGggYSBiaXQgKi8KLQkJCWhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgSEZBMzg0eF9SSURfQ05GTUFYREFUQUxFTiwgMjMwNCk7Ci0JCX0KLQotCQkvKiBFbmFibGUgdGhlIFBvcnQgKi8KLQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2VuYWJsZShodywgMCk7Ci0JCWlmICggcmVzdWx0ICkgewotCQkJV0xBTl9MT0dfRVJST1IoIkVuYWJsZSBtYWNwb3J0IGZhaWxlZCwgcmVzdWx0PSVkLlxuIiwgcmVzdWx0KTsKLQkJCWdvdG8gZmFpbGVkOwotCQl9Ci0KLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfc3VjY2VzczsKLQorCS8qKiogQURIT0MgSUJTUyAqKiovCisJLyogc2VlIGlmIGN1cnJlbnQgZi93IGlzIGxlc3MgdGhhbiA4YzMgKi8KKwlpZiAoSEZBMzg0eF9GSVJNV0FSRV9WRVJTSU9OKGh3LT5pZGVudF9zdGFfZncubWFqb3IsCisJCQkJICAgICBody0+aWRlbnRfc3RhX2Z3Lm1pbm9yLAorCQkJCSAgICAgaHctPmlkZW50X3N0YV9mdy52YXJpYW50KSA8CisJICAgIEhGQTM4NHhfRklSTVdBUkVfVkVSU0lPTigwLDgsMykpIHsKKwkJLyogQWQtSG9jIG5vdCBxdWl0ZSBzdXBwb3J0ZWQgb24gUHJpc20yICovCisJCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7CisJCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX25vdF9zdXBwb3J0ZWQ7CiAJCWdvdG8gZG9uZTsKIAl9CiAKLQkvKioqIEFDQ0VTUyBQT0lOVCAqKiovCi0KIAltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwogCi0JLyogVmFsaWRhdGUgdGhlIGNvbW1hbmQsIGlmIEJTU3R5cGU9aW5mcmEgaXMgdGhlIHRlcnRpYXJ5IGxvYWRlZD8gKi8KLQlpZiAoIG1zZy0+YnNzdHlwZS5kYXRhID09IFA4MDIxMUVOVU1fYnNzdHlwZV9pbmRlcGVuZGVudCApIHsKLQkJV0xBTl9MT0dfRVJST1IoIkFQIGRyaXZlciBjYW5ub3QgY3JlYXRlIElCU1MuXG4iKTsKLQkJZ290byBmYWlsZWQ7Ci0JfSBlbHNlIGlmICggaHctPmNhcF9zdXBfc3RhLmlkICE9IDUpIHsKLQkJV0xBTl9MT0dfRVJST1IoIkFQIGRyaXZlciBmYWlsZWQgdG8gZGV0ZWN0IEFQIGZpcm13YXJlLlxuIik7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQorCS8qKiogU1RBVElPTiAqKiovCiAJLyogU2V0IHRoZSBSRVFVSVJFRCBjb25maWcgaXRlbXMgKi8KIAkvKiBTU0lEICovCiAJcHN0ciA9IChwODAyMTFwc3RyZF90KikmKG1zZy0+c3NpZC5kYXRhKTsKIAlwcmlzbTJtZ210X3BzdHIyYnl0ZXN0cihwMmJ5dGVzdHIsIHBzdHIpOwogCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoIGh3LCBIRkEzODR4X1JJRF9DTkZPV05TU0lELAotCQkJCWJ5dGVidWYsIEhGQTM4NHhfUklEX0NORk9XTlNTSURfTEVOKTsKKwkJCQkJIGJ5dGVidWYsIEhGQTM4NHhfUklEX0NORk9XTlNTSURfTEVOKTsKIAlpZiAoIHJlc3VsdCApIHsKLQkJV0xBTl9MT0dfRVJST1IoIkZhaWxlZCB0byBzZXQgU1NJRCwgcmVzdWx0PTB4JTA0eFxuIiwgcmVzdWx0KTsKKwkJV0xBTl9MT0dfRVJST1IoIkZhaWxlZCB0byBzZXQgQ25mT3duU1NJRFxuIik7CisJCWdvdG8gZmFpbGVkOworCX0KKwlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnKCBodywgSEZBMzg0eF9SSURfQ05GREVTSVJFRFNTSUQsCisJCQkJCSBieXRlYnVmLCBIRkEzODR4X1JJRF9DTkZERVNJUkVEU1NJRF9MRU4pOworCWlmICggcmVzdWx0ICkgeworCQlXTEFOX0xPR19FUlJPUigiRmFpbGVkIHRvIHNldCBDbmZEZXNpcmVkU1NJRFxuIik7CiAJCWdvdG8gZmFpbGVkOwogCX0KIAogCS8qIGJzc3R5cGUgLSB3ZSB1c2UgdGhlIGRlZmF1bHQgaW4gdGhlIGFwIGZpcm13YXJlICovCisJLyogSUJTUyBwb3J0ICovCisJaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LCBIRkEzODR4X1JJRF9DTkZQT1JUVFlQRSwgMCk7CiAKIAkvKiBiZWFjb24gcGVyaW9kICovCiAJd29yZCA9IG1zZy0+YmVhY29ucGVyaW9kLmRhdGE7Ci0JcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LCBIRkEzODR4X1JJRF9DTkZBUEJDTklOVCwgd29yZCk7CisJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LCBIRkEzODR4X1JJRF9DTkZBUEJDTmludCwgd29yZCk7CiAJaWYgKCByZXN1bHQgKSB7CiAJCVdMQU5fTE9HX0VSUk9SKCJGYWlsZWQgdG8gc2V0IGJlYWNvbiBwZXJpb2Q9JWQuXG4iLCB3b3JkKTsKIAkJZ290byBmYWlsZWQ7CkBAIC0xNDQzLDk4ICs2NTAsMjAgQEAKIAkJV0xBTl9MT0dfRVJST1IoIkZhaWxlZCB0byBzZXQgc3VwcHJhdGVzPSVkLlxuIiwgd29yZCk7CiAJCWdvdG8gZmFpbGVkOwogCX0KLQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsIEhGQTM4NHhfUklEX1RYUkFURUNOVEwwLCB3b3JkKTsKKworCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgSEZBMzg0eF9SSURfVFhSQVRFQ05UTCwgd29yZCk7CiAJaWYgKCByZXN1bHQgKSB7CiAJCVdMQU5fTE9HX0VSUk9SKCJGYWlsZWQgdG8gc2V0IHR4cmF0ZXM9JWQuXG4iLCB3b3JkKTsKIAkJZ290byBmYWlsZWQ7CiAJfQogCi0JLyogaWJzc2F0aW13aW5kb3cgKi8KLQlpZiAobXNnLT5pYnNzYXRpbXdpbmRvdy5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rKSB7Ci0JCVdMQU5fTE9HX0lORk8oInByaXNtMm1nbXRfc3RhcnQ6IGF0aW13aW5kb3cgbm90IHVzZWQgaW4gIgotCQkJICAgICAgICJJbmZyYXN0cnVjdHVyZSBtb2RlLCBpZ25vcmVkLlxuIik7Ci0JfQotCi0JLyogRFRJTSBwZXJpb2QgKi8KLQl3b3JkID0gbXNnLT5kdGltcGVyaW9kLmRhdGE7Ci0JcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LCBIRkEzODR4X1JJRF9DTkZPV05EVElNUEVSLCB3b3JkKTsKLQlpZiAoIHJlc3VsdCApIHsKLQkJV0xBTl9MT0dfRVJST1IoIkZhaWxlZCB0byBzZXQgZHRpbSBwZXJpb2Q9JWQuXG4iLCB3b3JkKTsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCi0JLyogcHJvYmVkZWxheSAqLwotCWlmIChtc2ctPnByb2JlZGVsYXkuc3RhdHVzID09IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vaykgewotCQlXTEFOX0xPR19JTkZPKCJwcmlzbTJtZ210X3N0YXJ0OiBwcm9iZWRlbGF5IG5vdCAiCi0JCQkgICAgICAgInN1cHBvcnRlZCBpbiBwcmlzbTIsIGlnbm9yZWQuXG4iKTsKLQl9Ci0KLQkvKiBjZnBvbGxhYmxlLCBjZnBvbGxyZXEsIGNmcHBlcmlvZCwgY2ZwbWF4ZHVyYXRpb24gKi8KLQlpZiAobXNnLT5jZnBvbGxhYmxlLmRhdGEgPT0gUDgwMjExRU5VTV90cnV0aF90cnVlICYmCi0JICAgIG1zZy0+Y2Zwb2xscmVxLmRhdGEgPT0gUDgwMjExRU5VTV90cnV0aF90cnVlICkgewotCQlXTEFOX0xPR19FUlJPUigiY2Zwb2xsYWJsZT1jZnBvbGxyZXE9dHJ1ZSBpcyBpbGxlZ2FsLlxuIik7Ci0JCXJlc3VsdCA9IC0xOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLQkvKiByZWFkIHRoZSBQQ0ZJbmZvIGFuZCB1cGRhdGUgKi8KLQlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGh3LCBIRkEzODR4X1JJRF9DTkZBUFBDRklORk8sCi0JCQkJCXBjZmluZm8sIEhGQTM4NHhfUklEX0NORkFQUENGSU5GT19MRU4pOwotCWlmICggcmVzdWx0ICkgewotCQlXTEFOX0xPR19JTkZPKCJwcmlzbTJtZ210X3N0YXJ0OiByZWFkKHBjZmluZm8pIGZhaWxlZCwgIgotCQkJCSJhc3N1bWUgaXQncyAiCi0JCQkJIm5vdCBzdXBwb3J0ZWQsIHBjZiBzZXR0aW5ncyBpZ25vcmVkLlxuIik7Ci0JCWdvdG8gcGNmX3NraXA7Ci0JfQotCWlmICgobXNnLT5jZnBvbGxhYmxlLmRhdGEgPT0gUDgwMjExRU5VTV90cnV0aF9mYWxzZSAmJgotCSAgICAgbXNnLT5jZnBvbGxyZXEuZGF0YSA9PSBQODAyMTFFTlVNX3RydXRoX2ZhbHNlKSApIHsKLQkgICAgCXBjZmluZm8tPk1lZGl1bU9jY3VwYW5jeUxpbWl0ID0gMDsKLQkJcGNmaW5mby0+Q0ZQUGVyaW9kID0gMDsKLQkJcGNmaW5mby0+Q0ZQTWF4RHVyYXRpb24gPSAwOwotCQlwY2ZpbmZvLT5DRlBGbGFncyAmPSBob3N0MmhmYTM4NHhfMTYoKFVJTlQxNil+QklUMCk7Ci0KLQkJaWYgKCBtc2ctPmNmcHBlcmlvZC5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rIHx8Ci0JCSAgICAgbXNnLT5jZnBtYXhkdXJhdGlvbi5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rICkgewotCQkJV0xBTl9MT0dfV0FSTklORygKLQkJCQkiU2V0dGluZyBjZnBwZXJpb2Qgb3IgY2ZwbWF4ZHVyYXRpb24gd2hlbiAiCi0JCQkJImNmcG9sbGFibGUgYW5kIGNmcmVxIGFyZSBmYWxzZSBpcyBwb2ludGxlc3MuXG4iKTsKLQkJfQotCX0KLQlpZiAoKG1zZy0+Y2Zwb2xsYWJsZS5kYXRhID09IFA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZSB8fAotCSAgICAgbXNnLT5jZnBvbGxyZXEuZGF0YSA9PSBQODAyMTFFTlVNX3RydXRoX3RydWUpICkgewotCQlpZiAoIG1zZy0+Y2Zwb2xsYWJsZS5kYXRhID09IFA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZSkgewotCQkJcGNmaW5mby0+Q0ZQRmxhZ3MgfD0gaG9zdDJoZmEzODR4XzE2KChVSU5UMTYpQklUMCk7Ci0JCX0KLQotCQlpZiAoIG1zZy0+Y2ZwcGVyaW9kLnN0YXR1cyA9PSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2spIHsKLQkJCXBjZmluZm8tPkNGUFBlcmlvZCA9IG1zZy0+Y2ZwcGVyaW9kLmRhdGE7Ci0JCQlwY2ZpbmZvLT5DRlBQZXJpb2QgPSBob3N0MmhmYTM4NHhfMTYocGNmaW5mby0+Q0ZQUGVyaW9kKTsKLQkJfQotCi0JCWlmICggbXNnLT5jZnBtYXhkdXJhdGlvbi5zdGF0dXMgPT0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rKSB7Ci0JCQlwY2ZpbmZvLT5DRlBNYXhEdXJhdGlvbiA9IG1zZy0+Y2ZwbWF4ZHVyYXRpb24uZGF0YTsKLQkJCXBjZmluZm8tPkNGUE1heER1cmF0aW9uID0gaG9zdDJoZmEzODR4XzE2KHBjZmluZm8tPkNGUE1heER1cmF0aW9uKTsKLQkJCXBjZmluZm8tPk1lZGl1bU9jY3VwYW5jeUxpbWl0ID0gcGNmaW5mby0+Q0ZQTWF4RHVyYXRpb247Ci0JCX0KLQl9Ci0JcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZyhodywgSEZBMzg0eF9SSURfQ05GQVBQQ0ZJTkZPLAotCQkJCQlwY2ZpbmZvLCBIRkEzODR4X1JJRF9DTkZBUFBDRklORk9fTEVOKTsKLQlpZiAoIHJlc3VsdCApIHsKLQkJV0xBTl9MT0dfRVJST1IoIndyaXRlKHBjZmluZm8pIGZhaWxlZC5cbiIpOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLXBjZl9za2lwOgogCS8qIFNldCB0aGUgbWFjbW9kZSBzbyB0aGUgZnJhbWUgc2V0dXAgY29kZSBrbm93cyB3aGF0IHRvIGRvICovCi0JaWYgKCBtc2ctPmJzc3R5cGUuZGF0YSA9PSBQODAyMTFFTlVNX2Jzc3R5cGVfaW5mcmFzdHJ1Y3R1cmUgKSB7Ci0JCXdsYW5kZXYtPm1hY21vZGUgPSBXTEFOX01BQ01PREVfRVNTX0FQOworCWlmICggbXNnLT5ic3N0eXBlLmRhdGEgPT0gUDgwMjExRU5VTV9ic3N0eXBlX2luZGVwZW5kZW50ICkgeworCQl3bGFuZGV2LT5tYWNtb2RlID0gV0xBTl9NQUNNT0RFX0lCU1NfU1RBOwogCQkvKiBsZXRzIGV4dGVuZCB0aGUgZGF0YSBsZW5ndGggYSBiaXQgKi8KIAkJaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LCBIRkEzODR4X1JJRF9DTkZNQVhEQVRBTEVOLCAyMzA0KTsKIAl9CiAKLQkvKiBTZXQgdGhlIEJTU0lEIHRvIHRoZSBzYW1lIGFzIG91ciBNQUMgKi8KLQltZW1jcHkoIHdsYW5kZXYtPmJzc2lkLCB3bGFuZGV2LT5uZXRkZXYtPmRldl9hZGRyLCBXTEFOX0JTU0lEX0xFTik7Ci0KIAkvKiBFbmFibGUgdGhlIFBvcnQgKi8KIAlyZXN1bHQgPSBoZmEzODR4X2RydnJfZW5hYmxlKGh3LCAwKTsKIAlpZiAoIHJlc3VsdCApIHsKQEAgLTE1NTYsODAgKzY4NSw2IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWdtdF9lbmFibGUKLSoKLSogU3RhcnQgYSBCU1MuICBBbnkgc3RhdGlvbiBjYW4gZG8gdGhpcyBmb3IgSUJTUywgb25seSBBUCBmb3IgRVNTLgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgltc2dwCQlwdHIgdG8gbXNnIGJ1ZmZlcgotKgotKiBSZXR1cm5zOgotKgkwCXN1Y2Nlc3MgYW5kIGRvbmUKLSoJPDAJc3VjY2VzcywgYnV0IHdlJ3JlIHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byBmaW5pc2guCi0qCT4wCWFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGhhbmRsaW5nIHRoZSBtZXNzYWdlLgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQotKglpbnRlcnJ1cHQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMm1nbXRfZW5hYmxlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKLXsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlwODAyMTFtc2dfcDJyZXFfZW5hYmxlX3QJKm1zZyA9IG1zZ3A7Ci0JREJGRU5URVI7Ci0KLQlpZiAoIWh3LT5hcCkgewotCi0JCS8qKiogU1RBVElPTiAqKiovCi0KLQkJLyogQWQtSG9jIG5vdCBxdWl0ZSBzdXBwb3J0ZWQgb24gUHJpc20yICovCi0JCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX25vdF9zdXBwb3J0ZWQ7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKioqIEFDQ0VTUyBQT0lOVCAqKiovCi0KLQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCi0JLyogSXMgdGhlIHRlcnRpYXJ5IGxvYWRlZD8gKi8KLQlpZiAoIGh3LT5jYXBfc3VwX3N0YS5pZCAhPSA1KSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCJBUCBkcml2ZXIgZmFpbGVkIHRvIGRldGVjdCBBUCBmaXJtd2FyZS5cbiIpOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLQkvKiBTZXQgdGhlIG1hY21vZGUgc28gdGhlIGZyYW1lIHNldHVwIGNvZGUga25vd3Mgd2hhdCB0byBkbyAqLwotCXdsYW5kZXYtPm1hY21vZGUgPSBXTEFOX01BQ01PREVfRVNTX0FQOwotCi0JLyogU2V0IHRoZSBCU1NJRCB0byB0aGUgc2FtZSBhcyBvdXIgTUFDICovCi0JbWVtY3B5KCB3bGFuZGV2LT5ic3NpZCwgd2xhbmRldi0+bmV0ZGV2LT5kZXZfYWRkciwgV0xBTl9CU1NJRF9MRU4pOwotCi0JLyogRW5hYmxlIHRoZSBQb3J0ICovCi0JcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2VuYWJsZShodywgMCk7Ci0JaWYgKCByZXN1bHQgKSB7Ci0JCVdMQU5fTE9HX0VSUk9SKCJFbmFibGUgbWFjcG9ydCBmYWlsZWQsIHJlc3VsdD0lZC5cbiIsIHJlc3VsdCk7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQotCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX3N1Y2Nlc3M7Ci0KLQlnb3RvIGRvbmU7Ci1mYWlsZWQ6Ci0JbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfaW52YWxpZF9wYXJhbWV0ZXJzOwotCi1kb25lOgotCXJlc3VsdCA9IDA7Ci0KLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIHByaXNtMm1nbXRfcmVhZHBkYQogKgpAQCAtMTY5Niw0MDIgKzc1MSw2IEBACiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X3JlYWRjaXMKLSoKLSogQ29sbGVjdCB0aGUgQ0lTIGRhdGEgYW5kIHB1dCBpdCBpbiB0aGUgbWVzc2FnZS4KLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQl3bGFuIGRldmljZSBzdHJ1Y3R1cmUKLSoJbXNncAkJcHRyIHRvIG1zZyBidWZmZXIKLSoKLSogUmV0dXJuczoKLSoJMAlzdWNjZXNzIGFuZCBkb25lCi0qCTwwCXN1Y2Nlc3MsIGJ1dCB3ZSdyZSB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gZmluaXNoLgotKgk+MAlhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyB0aGUgbWVzc2FnZS4KLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMm1nbXRfcmVhZGNpcyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCi17Ci0JaW50CQkJcmVzdWx0OwotCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlwODAyMTFtc2dfcDJyZXFfcmVhZGNpc190CSptc2cgPSBtc2dwOwotCi0JREJGRU5URVI7Ci0KLSAgICAgICAgbWVtc2V0KG1zZy0+Y2lzLmRhdGEsIDAsIHNpemVvZihtc2ctPmNpcy5kYXRhKSk7Ci0KLQlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGh3LCBIRkEzODR4X1JJRF9DSVMsCi0JCQkJCW1zZy0+Y2lzLmRhdGEsIEhGQTM4NHhfUklEX0NJU19MRU4pOwotCWlmICggcmVzdWx0ICkgewotCQlXTEFOX0xPR19JTkZPKCJwcmlzbTJtZ210X3JlYWRjaXM6IHJlYWQoY2lzKSBmYWlsZWQuXG4iKTsKLQkJbXNnLT5jaXMuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19ub192YWx1ZTsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfaW1wbGVtZW50YXRpb25fZmFpbHVyZTsKLQotCQl9Ci0JZWxzZSB7Ci0JCW1zZy0+Y2lzLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfc3VjY2VzczsKLQkJfQotCi0JbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X2F1eHBvcnRfc3RhdGUKLSoKLSogRW5hYmxlcy9EaXNhYmxlcyB0aGUgY2FyZCdzIGF1eGlsaWFyeSBwb3J0LiAgU2hvdWxkIGJlIGNhbGxlZAotKiBiZWZvcmUgYW5kIGFmdGVyIGEgc2VxdWVuY2Ugb2YgYXV4cG9ydF9yZWFkKCkvYXV4cG9ydF93cml0ZSgpCi0qIGNhbGxzLgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgltc2dwCQlwdHIgdG8gbXNnIGJ1ZmZlcgotKgotKiBSZXR1cm5zOgotKgkwCXN1Y2Nlc3MgYW5kIGRvbmUKLSoJPDAJc3VjY2VzcywgYnV0IHdlJ3JlIHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byBmaW5pc2guCi0qCT4wCWFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGhhbmRsaW5nIHRoZSBtZXNzYWdlLgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9hdXhwb3J0X3N0YXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKLXsKLQlwODAyMTFtc2dfcDJyZXFfYXV4cG9ydF9zdGF0ZV90CSptc2cgPSBtc2dwOwotCi0jaWYgKFdMQU5fSE9TVElGICE9IFdMQU5fVVNCKQotCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlEQkZFTlRFUjsKLQotCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JaWYgKG1zZy0+ZW5hYmxlLmRhdGEgPT0gUDgwMjExRU5VTV90cnV0aF90cnVlKSB7Ci0JCWlmICggaGZhMzg0eF9jbWRfYXV4X2VuYWJsZShodywgMCkgKSB7Ci0JCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9pbXBsZW1lbnRhdGlvbl9mYWlsdXJlOwotCQl9IGVsc2UgewotCQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfc3VjY2VzczsKLQkJfQotCX0gZWxzZSB7Ci0JCWhmYTM4NHhfY21kX2F1eF9kaXNhYmxlKGh3KTsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfc3VjY2VzczsKLQl9Ci0KLSNlbHNlIC8qICFVU0IgKi8KLQlEQkZFTlRFUjsKLQotCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZDsKLQotI2VuZGlmIC8qIFdMQU5fSE9TVElGICE9IFdMQU5fVVNCICovCi0KLQlEQkZFWElUOwotCXJldHVybiAwOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X2F1eHBvcnRfcmVhZAotKgotKiBDb3BpZXMgZGF0YSBmcm9tIHRoZSBjYXJkIHVzaW5nIHRoZSBhdXhwb3J0LiAgVGhlIGF1eHBvcnQgbXVzdAotKiBoYXZlIHByZXZpb3VzbHkgYmVlbiBlbmFibGVkLiAgTm90ZTogdGhpcyBpcyBub3QgdGhlIHdheSB0bwotKiBkbyBkb3dubG9hZHMsIHNlZSB0aGUgW3JhbXxmbGFzaF1kbCBmdW5jdGlvbnMuCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qCW1zZ3AJCXB0ciB0byBtc2cgYnVmZmVyCi0qCi0qIFJldHVybnM6Ci0qCTAJc3VjY2VzcyBhbmQgZG9uZQotKgk8MAlzdWNjZXNzLCBidXQgd2UncmUgd2FpdGluZyBmb3Igc29tZXRoaW5nIHRvIGZpbmlzaC4KLSoJPjAJYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgdGhlIG1lc3NhZ2UuCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X2F1eHBvcnRfcmVhZCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCi17Ci0jaWYgKFdMQU5fSE9TVElGICE9IFdMQU5fVVNCKQotCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlwODAyMTFtc2dfcDJyZXFfYXV4cG9ydF9yZWFkX3QJKm1zZyA9IG1zZ3A7Ci0JVUlOVDMyCQkJYWRkcjsKLQlVSU5UMzIJCQlsZW47Ci0JVUlOVDgqCQkJYnVmOwotCVVJTlQzMgkJCW1heGxlbiA9IHNpemVvZihtc2ctPmRhdGEuZGF0YSk7Ci0JREJGRU5URVI7Ci0KLQlpZiAoIGh3LT5hdXhlbiApIHsKLQkJYWRkciA9IG1zZy0+YWRkci5kYXRhOwotCQlsZW4gPSBtc2ctPmxlbi5kYXRhOwotCQlidWYgPSBtc2ctPmRhdGEuZGF0YTsKLQkJaWYgKCBsZW4gPD0gbWF4bGVuICkgeyAgLyogbWF4IHJlYWQvd3JpdGUgc2l6ZSAqLwotCQkJaGZhMzg0eF9jb3B5X2Zyb21fYXV4KGh3LCBhZGRyLCBIRkEzODR4X0FVWF9DVExfRVhURFMsIGJ1ZiwgbGVuKTsKLQkJCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX3N1Y2Nlc3M7Ci0JCX0gZWxzZSB7Ci0JCQlXTEFOX0xPR19ERUJVRygxLCJBdHRlbXB0IHRvIHJlYWQgPiBtYXhsZW4gZnJvbSBhdXhwb3J0LlxuIik7Ci0JCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9yZWZ1c2VkOwotCQl9Ci0KLQl9IGVsc2UgewotCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9yZWZ1c2VkOwotCX0KLQltc2ctPmRhdGEuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0KLQlEQkZFWElUOwotCXJldHVybiAwOwotI2Vsc2UKLQlEQkZFTlRFUjsKLQotCVdMQU5fTE9HX0VSUk9SKCJwcmlzbTJtZ210X2F1eHBvcnRfcmVhZDogTm90IHN1cHBvcnRlZCBvbiBVU0IuXG4iKTsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIDA7Ci0jZW5kaWYKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWdtdF9hdXhwb3J0X3dyaXRlCi0qCi0qIENvcGllcyBkYXRhIHRvIHRoZSBjYXJkIHVzaW5nIHRoZSBhdXhwb3J0LiAgVGhlIGF1eHBvcnQgbXVzdAotKiBoYXZlIHByZXZpb3VzbHkgYmVlbiBlbmFibGVkLiAgTm90ZTogdGhpcyBpcyBub3QgdGhlIHdheSB0bwotKiBkbyBkb3dubG9hZHMsIHNlZSB0aGUgW3JhbXxmbGFzaF1kbCBmdW5jdGlvbnMuCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qCW1zZ3AJCXB0ciB0byBtc2cgYnVmZmVyCi0qCi0qIFJldHVybnM6Ci0qCTAJc3VjY2VzcyBhbmQgZG9uZQotKgk8MAlzdWNjZXNzLCBidXQgd2UncmUgd2FpdGluZyBmb3Igc29tZXRoaW5nIHRvIGZpbmlzaC4KLSoJPjAJYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgdGhlIG1lc3NhZ2UuCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X2F1eHBvcnRfd3JpdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKQotewotI2lmIChXTEFOX0hPU1RJRiAhPSBXTEFOX1VTQikKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0JcDgwMjExbXNnX3AycmVxX2F1eHBvcnRfd3JpdGVfdAkqbXNnID0gbXNncDsKLQlVSU5UMzIJCQlhZGRyOwotCVVJTlQzMgkJCWxlbjsKLQlVSU5UOCoJCQlidWY7Ci0JVUlOVDMyCQkJbWF4bGVuID0gc2l6ZW9mKG1zZy0+ZGF0YS5kYXRhKTsKLQlEQkZFTlRFUjsKLQotCWlmICggaHctPmF1eGVuICkgewotCQlhZGRyID0gbXNnLT5hZGRyLmRhdGE7Ci0JCWxlbiA9IG1zZy0+bGVuLmRhdGE7Ci0JCWJ1ZiA9IG1zZy0+ZGF0YS5kYXRhOwotCQlpZiAoIGxlbiA8PSBtYXhsZW4gKSB7ICAvKiBtYXggcmVhZC93cml0ZSBzaXplICovCi0JCQloZmEzODR4X2NvcHlfdG9fYXV4KGh3LCBhZGRyLCBIRkEzODR4X0FVWF9DVExfRVhURFMsIGJ1ZiwgbGVuKTsKLQkJfSBlbHNlIHsKLQkJCVdMQU5fTE9HX0RFQlVHKDEsIkF0dGVtcHQgdG8gd3JpdGUgPiBtYXhsZW4gZnJvbSBhdXhwb3J0LlxuIik7Ci0JCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9yZWZ1c2VkOwotCQl9Ci0KLQl9IGVsc2UgewotCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9yZWZ1c2VkOwotCX0KLQltc2ctPmRhdGEuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0KLQlEQkZFWElUOwotCXJldHVybiAwOwotI2Vsc2UKLQlEQkZFTlRFUjsKLQlXTEFOX0xPR19FUlJPUigicHJpc20ybWdtdF9hdXhwb3J0X3JlYWQ6IE5vdCBzdXBwb3J0ZWQgb24gVVNCLlxuIik7Ci0JREJGRVhJVDsKLQlyZXR1cm4gMDsKLSNlbmRpZgotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWdtdF9sb3dfbGV2ZWwKLSoKLSogUHV0cyB0aGUgY2FyZCBpbnRvIHRoZSBkZXNpcmVkIHRlc3QgbW9kZS4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICB3bGFuZGV2ICAgICAgICAgd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qICAgICAgIG1zZ3AgICAgICAgICAgICBwdHIgdG8gbXNnIGJ1ZmZlcgotKgotKiBSZXR1cm5zOgotKiAgICAgICAwICAgICAgIHN1Y2Nlc3MgYW5kIGRvbmUKLSogICAgICAgPDAgICAgICBzdWNjZXNzLCBidXQgd2UncmUgd2FpdGluZyBmb3Igc29tZXRoaW5nIHRvIGZpbmlzaC4KLSogICAgICAgPjAgICAgICBhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyB0aGUgbWVzc2FnZS4KLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qICAgICAgIHByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMm1nbXRfbG93X2xldmVsKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKLXsKLQloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0gICAgICAgIHA4MDIxMW1zZ19wMnJlcV9sb3dfbGV2ZWxfdCAgICAgKm1zZyA9IG1zZ3A7Ci0JaGZhMzg0eF9tZXRhY21kX3QgY21kOwotICAgICAgICBEQkZFTlRFUjsKLQotICAgICAgICBtc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCi0gICAgICAgIC8qIGNhbGwgc29tZSByb3V0aW5lIHRvIGV4ZWN1dGUgdGhlIHRlc3QgY29tbWFuZCAqLwotCWNtZC5jbWQgPSAoVUlOVDE2KSBtc2ctPmNvbW1hbmQuZGF0YTsKLQljbWQucGFybTAgPSAoVUlOVDE2KSBtc2ctPnBhcmFtMC5kYXRhOwotCWNtZC5wYXJtMSA9IChVSU5UMTYpIG1zZy0+cGFyYW0xLmRhdGE7Ci0JY21kLnBhcm0yID0gKFVJTlQxNikgbXNnLT5wYXJhbTIuZGF0YTsKLQotICAgICAgICBoZmEzODR4X2RydnJfbG93X2xldmVsKGh3LCZjbWQpOwotCi0gICAgICAgIG1zZy0+cmVzcDAuZGF0YSA9IChVSU5UMzIpIGNtZC5yZXN1bHQucmVzcDA7Ci0gICAgICAgIG1zZy0+cmVzcDEuZGF0YSA9IChVSU5UMzIpIGNtZC5yZXN1bHQucmVzcDE7Ci0gICAgICAgIG1zZy0+cmVzcDIuZGF0YSA9IChVSU5UMzIpIGNtZC5yZXN1bHQucmVzcDI7Ci0KLSAgICAgICAgbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfc3VjY2VzczsKLQotICAgICAgICBEQkZFWElUOwotICAgICAgICByZXR1cm4gMDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1nbXRfdGVzdF9jb21tYW5kCi0qCi0qIFB1dHMgdGhlIGNhcmQgaW50byB0aGUgZGVzaXJlZCB0ZXN0IG1vZGUuCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qCW1zZ3AJCXB0ciB0byBtc2cgYnVmZmVyCi0qCi0qIFJldHVybnM6Ci0qCTAJc3VjY2VzcyBhbmQgZG9uZQotKgk8MAlzdWNjZXNzLCBidXQgd2UncmUgd2FpdGluZyBmb3Igc29tZXRoaW5nIHRvIGZpbmlzaC4KLSoJPjAJYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgdGhlIG1lc3NhZ2UuCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X3Rlc3RfY29tbWFuZCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCi17Ci0JaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwotCXA4MDIxMW1zZ19wMnJlcV90ZXN0X2NvbW1hbmRfdAkqbXNnID0gbXNncDsKLQloZmEzODR4X21ldGFjbWRfdCBjbWQ7Ci0KLSAgICAgICAgREJGRU5URVI7Ci0KLQljbWQuY21kID0gKChVSU5UMTYpIG1zZy0+dGVzdGNvZGUuZGF0YSkgPDwgOCB8IDB4Mzg7Ci0JY21kLnBhcm0wID0gKFVJTlQxNikgbXNnLT50ZXN0cGFyYW0uZGF0YTsKLQljbWQucGFybTEgPSAwOwotCWNtZC5wYXJtMiA9IDA7Ci0KLSAgICAgICAgLyogY2FsbCBzb21lIHJvdXRpbmUgdG8gZXhlY3V0ZSB0aGUgdGVzdCBjb21tYW5kICovCi0KLSAgICAgICAgaGZhMzg0eF9kcnZyX2xvd19sZXZlbChodywmY21kKTsKLQotICAgICAgICBtc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotICAgICAgICBtc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9zdWNjZXNzOwotCi0gICAgICAgIG1zZy0+c3RhdHVzLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLSAgICAgICAgbXNnLT5zdGF0dXMuZGF0YSA9IGNtZC5yZXN1bHQuc3RhdHVzOwotICAgICAgICBtc2ctPnJlc3AwLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLSAgICAgICAgbXNnLT5yZXNwMC5kYXRhID0gY21kLnJlc3VsdC5yZXNwMDsKLSAgICAgICAgbXNnLT5yZXNwMS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0gICAgICAgIG1zZy0+cmVzcDEuZGF0YSA9IGNtZC5yZXN1bHQucmVzcDE7Ci0gICAgICAgIG1zZy0+cmVzcDIuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotICAgICAgICBtc2ctPnJlc3AyLmRhdGEgPSBjbWQucmVzdWx0LnJlc3AyOwotCi0JREJGRVhJVDsKLQlyZXR1cm4gMDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWdtdF9tbWlfcmVhZAotKgotKiBSZWFkIGZyb20gb25lIG9mIHRoZSBNTUkgcmVnaXN0ZXJzLgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgltc2dwCQlwdHIgdG8gbXNnIGJ1ZmZlcgotKgotKiBSZXR1cm5zOgotKgkwCXN1Y2Nlc3MgYW5kIGRvbmUKLSoJPDAJc3VjY2VzcywgYnV0IHdlJ3JlIHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byBmaW5pc2guCi0qCT4wCWFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGhhbmRsaW5nIHRoZSBtZXNzYWdlLgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9tbWlfcmVhZCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCi17Ci0JaGZhMzg0eF90CQkqaHcgPSB3bGFuZGV2LT5wcml2OwotCXA4MDIxMW1zZ19wMnJlcV9tbWlfcmVhZF90CSptc2cgPSBtc2dwOwotCVVJTlQzMiByZXNwID0gMDsKLQotCURCRkVOVEVSOwotCi0JbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKLQotCS8qIGNhbGwgc29tZSByb3V0aW5lIHRvIGV4ZWN1dGUgdGhlIHRlc3QgY29tbWFuZCAqLwotCi0JaGZhMzg0eF9kcnZyX21taV9yZWFkKGh3LCBtc2ctPmFkZHIuZGF0YSwgJnJlc3ApOwotCi0JLyogSSdtIG5vdCBzdXJlIGlmIHRoaXMgaXMgImFyY2hpdGVjdHVyYWxseSIgY29ycmVjdCwgYnV0IGl0Ci0gICAgICAgICAgIGlzIGV4cGVkaWVudC4gKi8KLQotCW1zZy0+dmFsdWUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCW1zZy0+dmFsdWUuZGF0YSA9IHJlc3A7Ci0JbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfc3VjY2VzczsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X21taV93cml0ZQotKgotKiBXcml0ZSBhIGRhdGEgdmFsdWUgdG8gb25lIG9mIHRoZSBNTUkgcmVnaXN0ZXJzLgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgltc2dwCQlwdHIgdG8gbXNnIGJ1ZmZlcgotKgotKiBSZXR1cm5zOgotKgkwCXN1Y2Nlc3MgYW5kIGRvbmUKLSoJPDAJc3VjY2VzcywgYnV0IHdlJ3JlIHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byBmaW5pc2guCi0qCT4wCWFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGhhbmRsaW5nIHRoZSBtZXNzYWdlLgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9tbWlfd3JpdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKQotewotCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlwODAyMTFtc2dfcDJyZXFfbW1pX3dyaXRlX3QJKm1zZyA9IG1zZ3A7Ci0JREJGRU5URVI7Ci0KLQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCi0JLyogY2FsbCBzb21lIHJvdXRpbmUgdG8gZXhlY3V0ZSB0aGUgdGVzdCBjb21tYW5kICovCi0KLQloZmEzODR4X2RydnJfbW1pX3dyaXRlKGh3LCBtc2ctPmFkZHIuZGF0YSwgbXNnLT5kYXRhLmRhdGEpOwotCi0JbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfc3VjY2VzczsKLQotCURCRkVYSVQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBwcmlzbTJtZ210X3JhbWRsX3N0YXRlCiAqCiAqIEVzdGFibGlzaGVzIHRoZSBiZWdpbm5pbmcvZW5kIG9mIGEgY2FyZCBSQU0gZG93bmxvYWQgc2Vzc2lvbi4KQEAgLTIxNzksOSArODM4LDkgQEAKIHsKIAloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7CiAJcDgwMjExbXNnX3AycmVxX3JhbWRsX3dyaXRlX3QJKm1zZyA9IG1zZ3A7Ci0JVUlOVDMyCQkJYWRkcjsKLQlVSU5UMzIJCQlsZW47Ci0JVUlOVDgJCQkqYnVmOworCXUzMgkJCWFkZHI7CisJdTMyCQkJbGVuOworCXU4CQkJKmJ1ZjsKIAlEQkZFTlRFUjsKIAogCWlmICh3bGFuZGV2LT5tc2RzdGF0ZSAhPSBXTEFOX01TRF9GV0xPQUQpIHsKQEAgLTIzMTksOSArOTc4LDkgQEAKIHsKIAloZmEzODR4X3QJCSpodyA9IHdsYW5kZXYtPnByaXY7CiAJcDgwMjExbXNnX3AycmVxX2ZsYXNoZGxfd3JpdGVfdAkqbXNnID0gbXNncDsKLQlVSU5UMzIJCQlhZGRyOwotCVVJTlQzMgkJCWxlbjsKLQlVSU5UOAkJCSpidWY7CisJdTMyCQkJYWRkcjsKKwl1MzIJCQlsZW47CisJdTgJCQkqYnVmOwogCURCRkVOVEVSOwogCiAJaWYgKHdsYW5kZXYtPm1zZHN0YXRlICE9IFdMQU5fTVNEX0ZXTE9BRCkgewpAQCAtMjM2MSwyNDcgKzEwMjAsNiBAQAogCXJldHVybiAwOwogfQogCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X2R1bXBfc3RhdGUKLSoKLSogRHVtcHMgdGhlIGRyaXZlcidzIGFuZCBoYXJkd2FyZSdzIGN1cnJlbnQgc3RhdGUgdmlhIHRoZSBrZXJuZWwKLSogbG9nIGF0IEtFUk5fTk9USUNFIGxldmVsLgotKgotKiBBcmd1bWVudHM6Ci0qCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQotKgltc2dwCQlwdHIgdG8gbXNnIGJ1ZmZlcgotKgotKiBSZXR1cm5zOgotKgkwCXN1Y2Nlc3MgYW5kIGRvbmUKLSoJPDAJc3VjY2VzcywgYnV0IHdlJ3JlIHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byBmaW5pc2guCi0qCT4wCWFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGhhbmRsaW5nIHRoZSBtZXNzYWdlLgotKiBTaWRlIGVmZmVjdHM6Ci0qCi0qIENhbGwgY29udGV4dDoKLSoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9kdW1wX3N0YXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKLXsKLQlwODAyMTFtc2dfcDJyZXFfZHVtcF9zdGF0ZV90CSptc2cgPSBtc2dwOwotCWludAkJCQlyZXN1bHQgPSAwOwotCi0jaWYgKFdMQU5fSE9TVElGICE9IFdMQU5fVVNCKQotCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKLQlVSU5UMTYJCQkJYXV4YnVmWzE1XTsKLQlEQkZFTlRFUjsKLQotCVdMQU5fTE9HX05PVElDRSgicHJpc20yIGRyaXZlciBhbmQgaGFyZHdhcmUgc3RhdGU6XG4iKTsKLQlpZiAgKCAocmVzdWx0ID0gaGZhMzg0eF9jbWRfYXV4X2VuYWJsZShodywgMCkpICkgewotCQlXTEFOX0xPR19FUlJPUigiYXV4X2VuYWJsZSBmYWlsZWQsIHJlc3VsdD0lZFxuIiwgcmVzdWx0KTsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCWhmYTM4NHhfY29weV9mcm9tX2F1eChodywKLQkJMHgwMWUyLAotCQlIRkEzODR4X0FVWF9DVExfRVhURFMsCi0JCWF1eGJ1ZiwKLQkJc2l6ZW9mKGF1eGJ1ZikpOwotCWhmYTM4NHhfY21kX2F1eF9kaXNhYmxlKGh3KTsKLQlXTEFOX0xPR19OT1RJQ0UoIiAgY21hYzogRnJlZUJsb2Nrcz0lZFxuIiwgYXV4YnVmWzVdKTsKLQlXTEFOX0xPR19OT1RJQ0UoIiAgY21hYzogSW50RW49MHglMDJ4IEV2U3RhdD0weCUwMnhcbiIsCi0JCWhmYTM4NHhfZ2V0cmVnKGh3LCBIRkEzODR4X0lOVEVOKSwKLQkJaGZhMzg0eF9nZXRyZWcoaHcsIEhGQTM4NHhfRVZTVEFUKSk7Ci0KLQkjaWZkZWYgVVNFX0ZJRF9TVEFDSwotCVdMQU5fTE9HX05PVElDRSgiICBkcnZyOiB0eGZpZF90b3A9JWQgc3RhY2tzaXplPSVkXG4iLAotCQlody0+dHhmaWRfdG9wLEhGQTM4NHhfRFJWUl9GSURTVEFDS0xFTl9NQVgpOwotCSNlbHNlCi0JV0xBTl9MT0dfTk9USUNFKCIgIGRydnI6IHR4ZmlkX2hlYWQ9JWQgdHhmaWRfdGFpbD0lZCB0eGZpZF9OPSVkXG4iLAotCQlody0+dHhmaWRfaGVhZCwgaHctPnR4ZmlkX3RhaWwsIGh3LT50eGZpZF9OKTsKLQkjZW5kaWYKLQotCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfc3VjY2VzczsKLQotI2Vsc2UgLyogKFdMQU5fSE9TVElGID09IFdMQU5fVVNCKSAqLwotCi0JREJGRU5URVI7Ci0KLQltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwotCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX25vdF9zdXBwb3J0ZWQ7Ci0JZ290byBmYWlsZWQ7Ci0KLSNlbmRpZiAvKiAoV0xBTl9IT1NUSUYgIT0gV0xBTl9VU0IpICovCi0KLWZhaWxlZDoKLQlEQkZFWElUOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X2NoYW5uZWxfaW5mbwotKgotKiBJc3N1ZXMgYSBDaGFubmVsSW5mb1JlcXVlc3QuCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qCW1zZ3AJCXB0ciB0byBtc2cgYnVmZmVyCi0qCi0qIFJldHVybnM6Ci0qCTAJc3VjY2VzcyBhbmQgZG9uZQotKgk8MAlzdWNjZXNzLCBidXQgd2UncmUgd2FpdGluZyBmb3Igc29tZXRoaW5nIHRvIGZpbmlzaC4KLSoJPjAJYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgdGhlIG1lc3NhZ2UuCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X2NoYW5uZWxfaW5mbyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCi17Ci0JcDgwMjExbXNnX3AycmVxX2NoYW5uZWxfaW5mb190CSptc2c9bXNncDsKLQloZmEzODR4X3QJCQkqaHcgPSB3bGFuZGV2LT5wcml2OwotCWludAkJCQlyZXN1bHQsIGksIG49MDsKLQlVSU5UMTYJCQkJY2hhbm5lbF9tYXNrPTA7Ci0JaGZhMzg0eF9DaGFubmVsSW5mb1JlcXVlc3RfZGF0YV90CWNoaW5mb3JlcTsKLQkvLyB1bnNpZ25lZCBsb25nIAkJCW5vdzsKLQotCURCRkVOVEVSOwotCi0JaWYgKCFody0+YXApIHsKLQotCQkvKioqIFNUQVRJT04gKioqLwotCi0JCS8qIE5vdCBzdXBwb3J0ZWQgaW4gU1RBIGYvdyAqLwotCQlQODAyMTFfU0VUX0lOVChtc2ctPnJlc3VsdGNvZGUsIFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9ub3Rfc3VwcG9ydGVkKTsKLQkJZ290byBkb25lOwotCX0KLQotCS8qKiogQUNDRVNTIFBPSU5UICoqKi8KLQotI2RlZmluZSBDSElORk9fVElNRU9VVCAyCi0KLQlQODAyMTFfU0VUX0lOVChtc2ctPnJlc3VsdGNvZGUsIFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9zdWNjZXNzKTsKLQotCS8qIHNldHRpbmcgZGVmYXVsdCB2YWx1ZSBmb3IgY2hhbm5lbGxpc3QgPSBhbGwgY2hhbm5lbHMgKi8KLQlpZiAoIW1zZy0+Y2hhbm5lbGxpc3QuZGF0YSkgewotCQlQODAyMTFfU0VUX0lOVChtc2ctPmNoYW5uZWxsaXN0LCAweDAwMDA3RkZFKTsKLQl9Ci0JLyogc2V0dGluZyBkZWZhdWx0IHZhbHVlIGZvciBjaGFubmVsZHdlbGx0aW1lID0gMTAwIG1zICovCi0JaWYgKCFtc2ctPmNoYW5uZWxkd2VsbHRpbWUuZGF0YSkgewotCQlQODAyMTFfU0VUX0lOVChtc2ctPmNoYW5uZWxkd2VsbHRpbWUsIDEwMCk7Ci0JfQotCWNoYW5uZWxfbWFzayA9IChVSU5UMTYpIChtc2ctPmNoYW5uZWxsaXN0LmRhdGEgPj4gMSk7Ci0JZm9yIChpPTAsIG49MDsgaSA8IDE0OyBpKyspIHsKLQkJaWYgKGNoYW5uZWxfbWFzayAmICgxPDxpKSkgewotCQkJbisrOwotCQl9Ci0JfQotCVA4MDIxMV9TRVRfSU5UKG1zZy0+bnVtY2hpbmZvLCBuKTsKLQljaGluZm9yZXEuY2hhbm5lbExpc3QgPSBob3N0MmhmYTM4NHhfMTYoY2hhbm5lbF9tYXNrKTsKLQljaGluZm9yZXEuY2hhbm5lbER3ZWxsVGltZSA9IGhvc3QyaGZhMzg0eF8xNihtc2ctPmNoYW5uZWxkd2VsbHRpbWUuZGF0YSk7Ci0KLQlhdG9taWNfc2V0KCZody0+Y2hhbm5lbF9pbmZvLmRvbmUsIDEpOwotCi0JcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZyggaHcsIEhGQTM4NHhfUklEX0NIQU5ORUxJTkZPUkVRVUVTVCwKLQkJCQkJICZjaGluZm9yZXEsIEhGQTM4NHhfUklEX0NIQU5ORUxJTkZPUkVRVUVTVF9MRU4pOwotCWlmICggcmVzdWx0ICkgewotCQlXTEFOX0xPR19FUlJPUigic2V0Y29uZmlnKENIQU5ORUxJTkZPUkVRVUVTVCkgZmFpbGVkLiByZXN1bHQ9JWRcbiIsCi0JCQkJcmVzdWx0KTsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZDsKLQkJZ290byBkb25lOwotCX0KLQkvKgotCW5vdyA9IGppZmZpZXM7Ci0Jd2hpbGUgKGF0b21pY19yZWFkKCZody0+Y2hhbm5lbF9pbmZvLmRvbmUpICE9IDEpIHsKLQkJaWYgKChqaWZmaWVzIC0gbm93KSA+IENISU5GT19USU1FT1VUKkhaKSB7Ci0JCQlXTEFOX0xPR19OT1RJQ0UoIkNoYW5uZWxJbmZvIHJlc3VsdHMgbm90IHJlY2VpdmVkIGluICVkIHNlY29uZHMsIGFib3J0aW5nLlxuIiwKLQkJCQkJQ0hJTkZPX1RJTUVPVVQpOwotCQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfdGltZW91dDsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLQkJc2NoZWR1bGVfdGltZW91dChIWi80KTsKLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7Ci0JfQotCSovCi0KLWRvbmU6Ci0KLQlEQkZFWElUOwotCXJldHVybiAwOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWdtdF9jaGFubmVsX2luZm9fcmVzdWx0cwotKgotKiBSZXR1cm5zIHJlcXVpcmVkIENoYW5uZWxJbmZvIHJlc3VsdC4KLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQl3bGFuIGRldmljZSBzdHJ1Y3R1cmUKLSoJbXNncAkJcHRyIHRvIG1zZyBidWZmZXIKLSoKLSogUmV0dXJuczoKLSoJMAlzdWNjZXNzIGFuZCBkb25lCi0qCTwwCXN1Y2Nlc3MsIGJ1dCB3ZSdyZSB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gZmluaXNoLgotKgk+MAlhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyB0aGUgbWVzc2FnZS4KLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMm1nbXRfY2hhbm5lbF9pbmZvX3Jlc3VsdHMod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKQotewotCWhmYTM4NHhfdAkJCSpodyA9IHdsYW5kZXYtPnByaXY7Ci0KLQlwODAyMTFtc2dfcDJyZXFfY2hhbm5lbF9pbmZvX3Jlc3VsdHNfdAkqbXNnPW1zZ3A7Ci0JaW50CQkJCXJlc3VsdD0wOwotCWludAkJY2hhbm5lbDsKLQotCURCRkVOVEVSOwotCi0JaWYgKCFody0+YXApIHsKLQotCQkvKioqIFNUQVRJT04gKioqLwotCi0JCS8qIE5vdCBzdXBwb3J0ZWQgaW4gU1RBIGYvdyAqLwotCQlQODAyMTFfU0VUX0lOVChtc2ctPnJlc3VsdGNvZGUsIFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9ub3Rfc3VwcG9ydGVkKTsKLQkJZ290byBkb25lOwotCX0KLQotCS8qKiogQUNDRVNTIFBPSU5UICoqKi8KLQotCXN3aXRjaCAoYXRvbWljX3JlYWQoJmh3LT5jaGFubmVsX2luZm8uZG9uZSkpIHsKLQljYXNlIDA6IG1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX25vX3ZhbHVlOwotCQlnb3RvIGRvbmU7Ci0JY2FzZSAxOiBtc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19pbmNvbXBsZXRlX2l0ZW1kYXRhOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JUDgwMjExX1NFVF9JTlQobXNnLT5yZXN1bHRjb2RlLCBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfc3VjY2Vzcyk7Ci0JY2hhbm5lbD1tc2ctPmNoYW5uZWwuZGF0YS0xOwotCi0JaWYgKGNoYW5uZWwgPCAwIHx8ICEgKGh3LT5jaGFubmVsX2luZm8ucmVzdWx0cy5zY2FuY2hhbm5lbHMgJiAxPDxjaGFubmVsKSApIHsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfaW52YWxpZF9wYXJhbWV0ZXJzOwotCQlnb3RvIGRvbmU7Ci0JfQotCVdMQU5fTE9HX0RFQlVHKDIsICJjaGluZm9fcmVzdWx0czogY2hhbm5lbCAlZCwgYXZnL3BlYWsgbGV2ZWw9JWQvJWQgZEIsIGFjdGl2ZT0lZFxuIiwKLQkJCWNoYW5uZWwrMSwKLQkJCWh3LT5jaGFubmVsX2luZm8ucmVzdWx0cy5yZXN1bHRbY2hhbm5lbF0uYW5sLAotCQkJaHctPmNoYW5uZWxfaW5mby5yZXN1bHRzLnJlc3VsdFtjaGFubmVsXS5wbmwsCi0JCQlody0+Y2hhbm5lbF9pbmZvLnJlc3VsdHMucmVzdWx0W2NoYW5uZWxdLmFjdGl2ZQotCQkpOwotCVA4MDIxMV9TRVRfSU5UKG1zZy0+YXZnbm9pc2VsZXZlbCwgaHctPmNoYW5uZWxfaW5mby5yZXN1bHRzLnJlc3VsdFtjaGFubmVsXS5hbmwpOwotCVA4MDIxMV9TRVRfSU5UKG1zZy0+cGVha25vaXNlbGV2ZWwsIGh3LT5jaGFubmVsX2luZm8ucmVzdWx0cy5yZXN1bHRbY2hhbm5lbF0ucG5sKTsKLQlQODAyMTFfU0VUX0lOVChtc2ctPmJzc2FjdGl2ZSwgaHctPmNoYW5uZWxfaW5mby5yZXN1bHRzLnJlc3VsdFtjaGFubmVsXS5hY3RpdmUgJgotCQlIRkEzODR4X0NISU5GT1JFU1VMVF9CU1NBQ1RJVkUKLSAgICAgICAgICAgICAgICA/IFA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZQotICAgICAgICAgICAgICAgIDogUDgwMjExRU5VTV90cnV0aF9mYWxzZSkgOwotCVA4MDIxMV9TRVRfSU5UKG1zZy0+cGNmYWN0aXZlLCBody0+Y2hhbm5lbF9pbmZvLnJlc3VsdHMucmVzdWx0W2NoYW5uZWxdLmFjdGl2ZSAmCi0JCUhGQTM4NHhfQ0hJTkZPUkVTVUxUX1BDRkFDVElWRQotICAgICAgICAgICAgICAgID8gUDgwMjExRU5VTV90cnV0aF90cnVlCi0gICAgICAgICAgICAgICAgOiBQODAyMTFFTlVNX3RydXRoX2ZhbHNlKSA7Ci0KLWRvbmU6Ci0JREJGRVhJVDsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBwcmlzbTJtZ210X2F1dG9qb2luCiAqCkBAIC0yNjI1LDExICsxMDQzLDExIEBACiB7CiAJaGZhMzg0eF90CQkJKmh3ID0gd2xhbmRldi0+cHJpdjsKIAlpbnQgCQkJcmVzdWx0ID0gMDsKLQlVSU5UMTYJCQlyZWc7Ci0JVUlOVDE2CQkJcG9ydF90eXBlOworCXUxNgkJCXJlZzsKKwl1MTYJCQlwb3J0X3R5cGU7CiAJcDgwMjExbXNnX2xueHJlcV9hdXRvam9pbl90CSptc2cgPSBtc2dwOwogCXA4MDIxMXBzdHJkX3QJCSpwc3RyOwotCVVJTlQ4CQkJYnl0ZWJ1ZlsyNTZdOworCXU4CQkJYnl0ZWJ1ZlsyNTZdOwogCWhmYTM4NHhfYnl0ZXN0cl90CSpwMmJ5dGVzdHIgPSAoaGZhMzg0eF9ieXRlc3RyX3QqKWJ5dGVidWY7CiAJREJGRU5URVI7CiAKQEAgLTI2MzgsMTYgKzEwNTYsNiBAQAogCS8qIFNldCB0aGUgU1NJRCAqLwogCW1lbWNweSgmd2xhbmRldi0+c3NpZCwgJm1zZy0+c3NpZC5kYXRhLCBzaXplb2YobXNnLT5zc2lkLmRhdGEpKTsKIAotCWlmIChody0+YXApIHsKLQotCQkvKioqIEFDQ0VTUyBQT0lOVCAqKiovCi0KLQkJLyogTmV2ZXIgc3VwcG9ydGVkIG9uIEFQICovCi0JCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7Ci0JCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX25vdF9zdXBwb3J0ZWQ7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KIAkvKiBEaXNhYmxlIHRoZSBQb3J0ICovCiAJaGZhMzg0eF9kcnZyX2Rpc2FibGUoaHcsIDApOwogCkBAIC0yNjk5LDcgKzExMDcsNiBAQAogCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7CiAJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfc3VjY2VzczsKIAotZG9uZToKIAlEQkZFWElUOwogCXJldHVybiByZXN1bHQ7CiB9CkBAIC0yNzMwLDcgKzExMzcsNyBAQAogCXA4MDIxMW1zZ19sbnhyZXFfd2xhbnNuaWZmX3QJKm1zZyA9IG1zZ3A7CiAKIAloZmEzODR4X3QJCQkqaHcgPSB3bGFuZGV2LT5wcml2OwotCVVJTlQxNgkJCXdvcmQ7CisJdTE2CQkJd29yZDsKIAogCURCRkVOVEVSOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJtZ210LmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJtZ210LmgKaW5kZXggNzMzZmQ5OS4uY2FmODA4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWdtdC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMm1nbXQuaApAQCAtNzMsMTAgKzczLDYgQEAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKi0tLS0tLSBTdGF0aWMgdmFyaWFibGUgZXh0ZXJucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0jaWYgKFdMQU5fSE9TVElGICE9IFdMQU5fVVNCKQotZXh0ZXJuIGludCAgICAgIHByaXNtMl9iYXBfdGltZW91dDsKLWV4dGVybiBpbnQJcHJpc20yX2lycV9ldnJlYWRfbWF4OwotI2VuZGlmCiBleHRlcm4gaW50CXByaXNtMl9kZWJ1ZzsKIGV4dGVybiBpbnQgICAgICBwcmlzbTJfcmVzZXRfaG9sZHRpbWU7CiBleHRlcm4gaW50ICAgICAgcHJpc20yX3Jlc2V0X3NldHRsZXRpbWU7CkBAIC04NCw4ICs4MCw4IEBACiAvKi0tLSBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAotVUlOVDMyCi1wcmlzbTJzdGFfaWZzdGF0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIFVJTlQzMiBpZnN0YXRlKTsKK3UzMgorcHJpc20yc3RhX2lmc3RhdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB1MzIgaWZzdGF0ZSk7CiAKIHZvaWQKIHByaXNtMnN0YV9ldl9kdGltKHdsYW5kZXZpY2VfdCAqd2xhbmRldik7CkBAIC05NCw0NyArOTAsMjQgQEAKIHZvaWQKIHByaXNtMnN0YV9ldl9pbmZvKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgaGZhMzg0eF9JbmZGcmFtZV90ICppbmYpOwogdm9pZAotcHJpc20yc3RhX2V2X3R4ZXhjKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgVUlOVDE2IHN0YXR1cyk7CitwcmlzbTJzdGFfZXZfdHhleGMod2xhbmRldmljZV90ICp3bGFuZGV2LCB1MTYgc3RhdHVzKTsKIHZvaWQKLXByaXNtMnN0YV9ldl90eCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIFVJTlQxNiBzdGF0dXMpOworcHJpc20yc3RhX2V2X3R4KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdTE2IHN0YXR1cyk7CiB2b2lkCiBwcmlzbTJzdGFfZXZfcngod2xhbmRldmljZV90ICp3bGFuZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIHZvaWQKIHByaXNtMnN0YV9ldl9hbGxvYyh3bGFuZGV2aWNlX3QgKndsYW5kZXYpOwogCi0KIGludCBwcmlzbTJtZ210X21pYnNldF9taWJnZXQod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X3Bvd2VybWdtdCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwogaW50IHByaXNtMm1nbXRfc2Nhbih3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwogaW50IHByaXNtMm1nbXRfc2Nhbl9yZXN1bHRzKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9qb2luKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9wMl9qb2luKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9hdXRoZW50aWNhdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X2RlYXV0aGVudGljYXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9hc3NvY2lhdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X3JlYXNzb2NpYXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9kaXNhc3NvY2lhdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X3Jlc2V0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7CiBpbnQgcHJpc20ybWdtdF9zdGFydCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwogaW50IHByaXNtMm1nbXRfd2xhbnNuaWZmKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7CiBpbnQgcHJpc20ybWdtdF9yZWFkcGRhKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9yZWFkY2lzKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9hdXhwb3J0X3N0YXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9hdXhwb3J0X3JlYWQod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X2F1eHBvcnRfd3JpdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X2xvd19sZXZlbCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwotaW50IHByaXNtMm1nbXRfdGVzdF9jb21tYW5kKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9tbWlfcmVhZCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwotaW50IHByaXNtMm1nbXRfbW1pX3dyaXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7CiBpbnQgcHJpc20ybWdtdF9yYW1kbF9zdGF0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwogaW50IHByaXNtMm1nbXRfcmFtZGxfd3JpdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKIGludCBwcmlzbTJtZ210X2ZsYXNoZGxfc3RhdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKIGludCBwcmlzbTJtZ210X2ZsYXNoZGxfd3JpdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X21tX3N0YXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9kdW1wX3N0YXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9lbmFibGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X2NoYW5uZWxfaW5mbyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwotaW50IHByaXNtMm1nbXRfY2hhbm5lbF9pbmZvX3Jlc3VsdHMod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKIGludCBwcmlzbTJtZ210X2F1dG9qb2luKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xNDIsMzEgKzExNSwzMSBAQAogKiBQcmlzbTIgZGF0YSB0eXBlcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIGJ5dGUgYXJlYSBjb252ZXJzaW9uIGZ1bmN0aW9ucyovCi12b2lkIHByaXNtMm1nbXRfcHN0cjJieXRlYXJlYShVSU5UOCAqYnl0ZWFyZWEsIHA4MDIxMXBzdHJkX3QgKnBzdHIpOwotdm9pZCBwcmlzbTJtZ210X2J5dGVhcmVhMnBzdHIoVUlOVDggKmJ5dGVhcmVhLCBwODAyMTFwc3RyZF90ICpwc3RyLCBpbnQgbGVuKTsKK3ZvaWQgcHJpc20ybWdtdF9wc3RyMmJ5dGVhcmVhKHU4ICpieXRlYXJlYSwgcDgwMjExcHN0cmRfdCAqcHN0cik7Cit2b2lkIHByaXNtMm1nbXRfYnl0ZWFyZWEycHN0cih1OCAqYnl0ZWFyZWEsIHA4MDIxMXBzdHJkX3QgKnBzdHIsIGludCBsZW4pOwogCiAvKiBieXRlIHN0cmluZyBjb252ZXJzaW9uIGZ1bmN0aW9ucyovCiB2b2lkIHByaXNtMm1nbXRfcHN0cjJieXRlc3RyKGhmYTM4NHhfYnl0ZXN0cl90ICpieXRlc3RyLCBwODAyMTFwc3RyZF90ICpwc3RyKTsKIHZvaWQgcHJpc20ybWdtdF9ieXRlc3RyMnBzdHIoaGZhMzg0eF9ieXRlc3RyX3QgKmJ5dGVzdHIsIHA4MDIxMXBzdHJkX3QgKnBzdHIpOwogCiAvKiBpbnRlZ2VyIGNvbnZlcnNpb24gZnVuY3Rpb25zICovCi12b2lkIHByaXNtMm1nbXRfcHJpc20yaW50MnA4MDIxMWludChVSU5UMTYgKnByaXNtMmludCwgVUlOVDMyICp3bGFuaW50KTsKLXZvaWQgcHJpc20ybWdtdF9wODAyMTFpbnQycHJpc20yaW50KFVJTlQxNiAqcHJpc20yaW50LCBVSU5UMzIgKndsYW5pbnQpOwordm9pZCBwcmlzbTJtZ210X3ByaXNtMmludDJwODAyMTFpbnQodTE2ICpwcmlzbTJpbnQsIHUzMiAqd2xhbmludCk7Cit2b2lkIHByaXNtMm1nbXRfcDgwMjExaW50MnByaXNtMmludCh1MTYgKnByaXNtMmludCwgdTMyICp3bGFuaW50KTsKIAogLyogZW51bWVyYXRlZCBpbnRlZ2VyIGNvbnZlcnNpb24gZnVuY3Rpb25zICovCi12b2lkIHByaXNtMm1nbXRfcHJpc20yZW51bTJwODAyMTFlbnVtKFVJTlQxNiAqcHJpc20yZW51bSwgVUlOVDMyICp3bGFuZW51bSwgVUlOVDE2IHJpZCk7Ci12b2lkIHByaXNtMm1nbXRfcDgwMjExZW51bTJwcmlzbTJlbnVtKFVJTlQxNiAqcHJpc20yZW51bSwgVUlOVDMyICp3bGFuZW51bSwgVUlOVDE2IHJpZCk7Cit2b2lkIHByaXNtMm1nbXRfcHJpc20yZW51bTJwODAyMTFlbnVtKHUxNiAqcHJpc20yZW51bSwgdTMyICp3bGFuZW51bSwgdTE2IHJpZCk7Cit2b2lkIHByaXNtMm1nbXRfcDgwMjExZW51bTJwcmlzbTJlbnVtKHUxNiAqcHJpc20yZW51bSwgdTMyICp3bGFuZW51bSwgdTE2IHJpZCk7CiAKIC8qIGZ1bmN0aW9ucyB0byBjb252ZXJ0IGEgYml0IGFyZWEgdG8vZnJvbSBhbiBPcGVyYXRpb25hbCBSYXRlIFNldCAqLwotdm9pZCBwcmlzbTJtZ210X2dldF9vcHJhdGVzZXQoVUlOVDE2ICpyYXRlLCBwODAyMTFwc3RyZF90ICpwc3RyKTsKLXZvaWQgcHJpc20ybWdtdF9zZXRfb3ByYXRlc2V0KFVJTlQxNiAqcmF0ZSwgcDgwMjExcHN0cmRfdCAqcHN0cik7Cit2b2lkIHByaXNtMm1nbXRfZ2V0X29wcmF0ZXNldCh1MTYgKnJhdGUsIHA4MDIxMXBzdHJkX3QgKnBzdHIpOwordm9pZCBwcmlzbTJtZ210X3NldF9vcHJhdGVzZXQodTE2ICpyYXRlLCBwODAyMTFwc3RyZF90ICpwc3RyKTsKIAogLyogZnVuY3Rpb25zIHRvIGNvbnZlcnQgR3JvdXAgQWRkcmVzc2VzICovCi12b2lkIHByaXNtMm1nbXRfZ2V0X2dycGFkZHIoVUlOVDMyIGRpZCwKK3ZvaWQgcHJpc20ybWdtdF9nZXRfZ3JwYWRkcih1MzIgZGlkLAogCXA4MDIxMXBzdHJkX3QgKnBzdHIsIGhmYTM4NHhfdCAqcHJpdiApOwotaW50IHByaXNtMm1nbXRfc2V0X2dycGFkZHIoVUlOVDMyIGRpZCwKLQlVSU5UOCAqcHJpc20yYnVmLCBwODAyMTFwc3RyZF90ICpwc3RyLCBoZmEzODR4X3QgKnByaXYgKTsKLWludCBwcmlzbTJtZ210X2dldF9ncnBhZGRyX2luZGV4KCBVSU5UMzIgZGlkICk7CitpbnQgcHJpc20ybWdtdF9zZXRfZ3JwYWRkcih1MzIgZGlkLAorCXU4ICpwcmlzbTJidWYsIHA4MDIxMXBzdHJkX3QgKnBzdHIsIGhmYTM4NHhfdCAqcHJpdiApOworaW50IHByaXNtMm1nbXRfZ2V0X2dycGFkZHJfaW5kZXgoIHUzMiBkaWQgKTsKIAogdm9pZCBwcmlzbTJzdGFfcHJvY2Vzc2luZ19kZWZlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmRhdGEpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJtaWIuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMm1pYi5jCmluZGV4IGVhYzA2ZjcuLjUzOWM0NDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMm1pYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMm1pYi5jCkBAIC01NCw5ICs1NCw2IEBACiAvKiBTeXN0ZW0gSW5jbHVkZXMgKi8KICNkZWZpbmUgV0xBTl9EQlZBUglwcmlzbTJfZGVidWcKIAotI2luY2x1ZGUgInZlcnNpb24uaCIKLQotCiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC02OSwyNiArNjYsNyBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgotCi0jaW5jbHVkZSAid2xhbl9jb21wYXQuaCIKLQotLy8jaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUENNQ0lBKQotLy8jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KLS8vI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgotLy8jaW5jbHVkZSA8cGNtY2lhL2NzLmg+Ci0vLyNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+Ci0vLyNpbmNsdWRlIDxwY21jaWEvZHMuaD4KLS8vI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KLS8vI2VuZGlmCi0vLwotLy8jaWYgKChXTEFOX0hPU1RJRiA9PSBXTEFOX1BMWCkgfHwgKFdMQU5fSE9TVElGID09IFdMQU5fUENJKSkKLS8vI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotLy8jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0vL2VuZGlmCi0KLS8vI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1VTQikKICNpbmNsdWRlIDxsaW51eC91c2IuaD4KLS8vI2VuZGlmCiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKiBQcm9qZWN0IEluY2x1ZGVzICovCkBAIC0xMTIsMTggKzkwLDE3IEBACiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyogTG9jYWwgVHlwZXMgKi8KIAotI2RlZmluZSAgRl9BUCAgICAgICAgIDB4MSAgICAgICAgLyogTUlCIGlzIHN1cHBvcnRlZCBvbiBBY2Nlc3MgUG9pbnRzLiAqLwotI2RlZmluZSAgRl9TVEEgICAgICAgIDB4MiAgICAgICAgLyogTUlCIGlzIHN1cHBvcnRlZCBvbiBzdGF0aW9ucy4gKi8KLSNkZWZpbmUgIEZfUkVBRCAgICAgICAweDQgICAgICAgIC8qIE1JQiBtYXkgYmUgcmVhZC4gKi8KLSNkZWZpbmUgIEZfV1JJVEUgICAgICAweDggICAgICAgIC8qIE1JQiBtYXkgYmUgd3JpdHRlbi4gKi8KKyNkZWZpbmUgIEZfU1RBICAgICAgICAweDEgICAgICAgIC8qIE1JQiBpcyBzdXBwb3J0ZWQgb24gc3RhdGlvbnMuICovCisjZGVmaW5lICBGX1JFQUQgICAgICAgMHgyICAgICAgICAvKiBNSUIgbWF5IGJlIHJlYWQuICovCisjZGVmaW5lICBGX1dSSVRFICAgICAgMHg0ICAgICAgICAvKiBNSUIgbWF5IGJlIHdyaXR0ZW4uICovCiAKIHR5cGVkZWYgc3RydWN0IG1pYnJlYwogewotICAgIFVJTlQzMiAgIGRpZDsKLSAgICBVSU5UMTYgICBmbGFnOwotICAgIFVJTlQxNiAgIHBhcm0xOwotICAgIFVJTlQxNiAgIHBhcm0yOwotICAgIFVJTlQxNiAgIHBhcm0zOworICAgIHUzMiAgIGRpZDsKKyAgICB1MTYgICBmbGFnOworICAgIHUxNiAgIHBhcm0xOworICAgIHUxNiAgIHBhcm0yOworICAgIHUxNiAgIHBhcm0zOwogICAgIGludCAgICAgICgqZnVuYykoc3RydWN0IG1pYnJlYyAgICAgICAgICAgICAgICAqbWliLAogICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKICAgICAgICAgICAgICAgICAgICAgIHdsYW5kZXZpY2VfdCAgICAgICAgICAgICAgICAgKndsYW5kZXYsCkBAIC0xMzUsMTQgKzExMiw2IEBACiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyogTG9jYWwgRnVuY3Rpb24gRGVjbGFyYXRpb25zICovCiAKLXN0YXRpYyBpbnQgcHJpc20ybWliX2J5dGVzdHIycHN0cigKLW1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKLWludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCi13bGFuZGV2aWNlX3QgICAgICAgICAgICAgICAgICp3bGFuZGV2LAotaGZhMzg0eF90ICAgICAgICAgICAgICAgICAgICAqaHcsCi1wODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCi12b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKTsKLQogc3RhdGljIGludCBwcmlzbTJtaWJfYnl0ZWFyZWEycHN0cigKIG1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCkBAIC0xNTksMzggKzEyOCw2IEBACiBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCiB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKTsKIAotc3RhdGljIGludCBwcmlzbTJtaWJfdWludDMyYXJyYXkoCi1taWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCi1pbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LAotd2xhbmRldmljZV90ICAgICAgICAgICAgICAgICAqd2xhbmRldiwKLWhmYTM4NHhfdCAgICAgICAgICAgICAgICAgICAgKmh3LAotcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAotdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSk7Ci0KLXN0YXRpYyBpbnQgcHJpc20ybWliX3VpbnQzMm9mZnNldCgKLW1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKLWludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCi13bGFuZGV2aWNlX3QgICAgICAgICAgICAgICAgICp3bGFuZGV2LAotaGZhMzg0eF90ICAgICAgICAgICAgICAgICAgICAqaHcsCi1wODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCi12b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKTsKLQotc3RhdGljIGludCBwcmlzbTJtaWJfdHJ1dGgoCi1taWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCi1pbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LAotd2xhbmRldmljZV90ICAgICAgICAgICAgICAgICAqd2xhbmRldiwKLWhmYTM4NHhfdCAgICAgICAgICAgICAgICAgICAgKmh3LAotcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAotdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSk7Ci0KLXN0YXRpYyBpbnQgcHJpc20ybWliX3ByZWFtYmxlKAotbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAotaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKLXdsYW5kZXZpY2VfdCAgICAgICAgICAgICAgICAgKndsYW5kZXYsCi1oZmEzODR4X3QgICAgICAgICAgICAgICAgICAgICpodywKLXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKLXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpOwotCiBzdGF0aWMgaW50IHByaXNtMm1pYl9mbGFnKAogbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAogaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKQEAgLTE5OSwyMiArMTM2LDYgQEAKIHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpOwogCi1zdGF0aWMgaW50IHByaXNtMm1pYl9hcHBjZmluZm9mbGFnKAotbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAotaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKLXdsYW5kZXZpY2VfdCAgICAgICAgICAgICAgICAgKndsYW5kZXYsCi1oZmEzODR4X3QgICAgICAgICAgICAgICAgICAgICpodywKLXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKLXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpOwotCi1zdGF0aWMgaW50IHByaXNtMm1pYl9yZWd1bGF0b3J5ZG9tYWlucygKLW1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKLWludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCi13bGFuZGV2aWNlX3QgICAgICAgICAgICAgICAgICp3bGFuZGV2LAotaGZhMzg0eF90ICAgICAgICAgICAgICAgICAgICAqaHcsCi1wODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCi12b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKTsKLQogc3RhdGljIGludCBwcmlzbTJtaWJfd2VwZGVmYXVsdGtleSgKIG1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCkBAIC0yMjMsMTQgKzE0NCw2IEBACiBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCiB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKTsKIAotc3RhdGljIGludCBwcmlzbTJtaWJfcG93ZXJtYW5hZ2VtZW50KAotbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAotaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKLXdsYW5kZXZpY2VfdCAgICAgICAgICAgICAgICAgKndsYW5kZXYsCi1oZmEzODR4X3QgICAgICAgICAgICAgICAgICAgICpodywKLXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKLXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpOwotCiBzdGF0aWMgaW50IHByaXNtMm1pYl9wcml2YWN5aW52b2tlZCgKIG1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCkBAIC0yNTUsNDYgKzE2OCw2IEBACiBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCiB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKTsKIAotc3RhdGljIGludCBwcmlzbTJtaWJfb3BlcmF0aW9uYWxyYXRlc2V0KAotbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAotaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKLXdsYW5kZXZpY2VfdCAgICAgICAgICAgICAgICAgKndsYW5kZXYsCi1oZmEzODR4X3QgICAgICAgICAgICAgICAgICAgICpodywKLXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKLXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpOwotCi1zdGF0aWMgaW50IHByaXNtMm1pYl9ncm91cGFkZHJlc3MoCi1taWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCi1pbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LAotd2xhbmRldmljZV90ICAgICAgICAgICAgICAgICAqd2xhbmRldiwKLWhmYTM4NHhfdCAgICAgICAgICAgICAgICAgICAgKmh3LAotcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAotdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSk7Ci0KLXN0YXRpYyBpbnQgcHJpc20ybWliX2Z3aWQoCi1taWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCi1pbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LAotd2xhbmRldmljZV90ICAgICAgICAgICAgICAgICAqd2xhbmRldiwKLWhmYTM4NHhfdCAgICAgICAgICAgICAgICAgICAgKmh3LAotcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAotdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSk7Ci0KLXN0YXRpYyBpbnQgcHJpc20ybWliX2F1dGhhbGcoCi1taWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCi1pbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LAotd2xhbmRldmljZV90ICAgICAgICAgICAgICAgICAqd2xhbmRldiwKLWhmYTM4NHhfdCAgICAgICAgICAgICAgICAgICAgKmh3LAotcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAotdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSk7Ci0KLXN0YXRpYyBpbnQgcHJpc20ybWliX2F1dGhhbGdlbmFibGUoCi1taWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCi1pbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LAotd2xhbmRldmljZV90ICAgICAgICAgICAgICAgICAqd2xhbmRldiwKLWhmYTM4NHhfdCAgICAgICAgICAgICAgICAgICAgKmh3LAotcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAotdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSk7Ci0KIHN0YXRpYyBpbnQgcHJpc20ybWliX3ByaXYoCiBtaWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCiBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LApAQCAtMzAzLDQxNCArMTc2LDc4IEBACiBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCiB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKTsKIAotc3RhdGljIHZvaWQgcHJpc20ybWliX3ByaXZfYXV0aGxpc3QoCi1oZmEzODR4X3QgICAgICAqaHcsCi1wcmlzbTJzdGFfYXV0aGxpc3RfdCAgKmxpc3QpOwotCi1zdGF0aWMgdm9pZCBwcmlzbTJtaWJfcHJpdl9hY2Nlc3Ntb2RlKAotaGZhMzg0eF90ICAgICAgICAgKmh3LAotVUlOVDMyICAgICAgICAgICAgbW9kZSk7Ci0KLXN0YXRpYyB2b2lkIHByaXNtMm1pYl9wcml2X2FjY2Vzc2FsbG93KAotaGZhMzg0eF90ICAgICAgICAgKmh3LAotcDgwMjExbWFjYXJyYXlfdCAgKm1hY2FycmF5KTsKLQotc3RhdGljIHZvaWQgcHJpc20ybWliX3ByaXZfYWNjZXNzZGVueSgKLWhmYTM4NHhfdCAgICAgICAgICpodywKLXA4MDIxMW1hY2FycmF5X3QgICptYWNhcnJheSk7Ci0KLXN0YXRpYyB2b2lkIHByaXNtMm1pYl9wcml2X2RlYXV0aGVudGljYXRlKAotaGZhMzg0eF90ICAgICAgICAgKmh3LAotVUlOVDggICAgICAgICAgICAgKmFkZHIpOwotCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyogTG9jYWwgU3RhdGljIERlZmluaXRpb25zICovCiAKIHN0YXRpYyBtaWJyZWNfdCBtaWJ0YWJbXSA9IHsKIAogICAgIC8qIGRvdDExc210IE1JQidzICovCi0KLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMVN0YXRpb25JRCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORk9XTk1BQ0FERFIsIEhGQTM4NHhfUklEX0NORk9XTk1BQ0FERFJfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ieXRlYXJlYTJwc3RyIH0sCi0gICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFNZWRpdW1PY2N1cGFuY3lMaW1pdCwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZBUFBDRklORk8sIEhGQTM4NHhfUklEX0NORkFQUENGSU5GT19MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMm9mZnNldCB9LAotICAgIHsgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExQ0ZQb2xsYWJsZSwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DRlBPTExBQkxFLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMUNGUFBlcmlvZCwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZBUFBDRklORk8sIEhGQTM4NHhfUklEX0NORkFQUENGSU5GT19MRU4sIDEsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMm9mZnNldCB9LAotICAgIHsgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExQ0ZQTWF4RHVyYXRpb24sCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GQVBQQ0ZJTkZPLCBIRkEzODR4X1JJRF9DTkZBUFBDRklORk9fTEVOLCAyLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJvZmZzZXQgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMUF1dGhlbnRpY2F0aW9uUmVzcG9uc2VUaW1lT3V0LAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZBVVRIUlNQVElNRU9VVCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFQcml2YWN5T3B0aW9uSW1wbGVtZW50ZWQsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX1BSSVZBQ1lPUFRJTVAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExUG93ZXJNYW5hZ2VtZW50TW9kZSwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GUE1FTkFCTEVELCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9wb3dlcm1hbmFnZW1lbnQgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMURlc2lyZWRTU0lELAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZERVNJUkVEU1NJRCwgSEZBMzg0eF9SSURfQ05GREVTSVJFRFNTSURfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ieXRlc3RyMnBzdHIgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMURlc2lyZWRCU1NUeXBlLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9wcml2IH0sCi0gICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFPcGVyYXRpb25hbFJhdGVTZXQsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX1RYUkFURUNOVEwsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX29wZXJhdGlvbmFscmF0ZXNldCB9LAotICAgIHsgRElEbWliX2RvdDExc210X2RvdDExU3RhdGlvbkNvbmZpZ1RhYmxlX2RvdDExT3BlcmF0aW9uYWxSYXRlU2V0LAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX1RYUkFURUNOVEwwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9vcGVyYXRpb25hbHJhdGVzZXQgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMUJlYWNvblBlcmlvZCwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZBUEJDTklOVCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFEVElNUGVyaW9kLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GT1dORFRJTVBFUiwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFTdGF0aW9uQ29uZmlnVGFibGVfZG90MTFBc3NvY2lhdGlvblJlc3BvbnNlVGltZU91dCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfUFJPVE9DT0xSU1BUSU1FLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlX2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG0xLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICAxLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9hdXRoYWxnIH0sCi0gICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNUYWJsZV9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtMiwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgMiwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYXV0aGFsZyB9LAotICAgIHsgRElEbWliX2RvdDExc210X2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zVGFibGVfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobTMsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIDMsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2F1dGhhbGcgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlX2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG00LAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICA0LCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9hdXRoYWxnIH0sCi0gICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobXNUYWJsZV9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtNSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgNSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYXV0aGFsZyB9LAotICAgIHsgRElEbWliX2RvdDExc210X2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zVGFibGVfZG90MTFBdXRoZW50aWNhdGlvbkFsZ29yaXRobTYsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIDYsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2F1dGhhbGcgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlX2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zRW5hYmxlMSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDEsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2F1dGhhbGdlbmFibGUgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlX2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zRW5hYmxlMiwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDIsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2F1dGhhbGdlbmFibGUgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlX2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zRW5hYmxlMywKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDMsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2F1dGhhbGdlbmFibGUgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlX2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zRW5hYmxlNCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDQsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2F1dGhhbGdlbmFibGUgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlX2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zRW5hYmxlNSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDUsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2F1dGhhbGdlbmFibGUgfSwKLSAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMUF1dGhlbnRpY2F0aW9uQWxnb3JpdGhtc1RhYmxlX2RvdDExQXV0aGVudGljYXRpb25BbGdvcml0aG1zRW5hYmxlNiwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDYsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2F1dGhhbGdlbmFibGUgfSwKICAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1dSSVRFLAorICAgICAgICAgIEZfU1RBIHwgRl9XUklURSwKICAgICAgICAgICBIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZMCwgMCwgMCwKICAgICAgICAgICBwcmlzbTJtaWJfd2VwZGVmYXVsdGtleSB9LAogICAgIHsgRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXkxLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfV1JJVEUsCisgICAgICAgICAgRl9TVEEgfCBGX1dSSVRFLAogICAgICAgICAgIEhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVkxLCAwLCAwLAogICAgICAgICAgIHByaXNtMm1pYl93ZXBkZWZhdWx0a2V5IH0sCiAgICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2RvdDExV0VQRGVmYXVsdEtleTIsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9XUklURSwKKyAgICAgICAgICBGX1NUQSB8IEZfV1JJVEUsCiAgICAgICAgICAgSEZBMzg0eF9SSURfQ05GV0VQREVGQVVMVEtFWTIsIDAsIDAsCiAgICAgICAgICAgcHJpc20ybWliX3dlcGRlZmF1bHRrZXkgfSwKICAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MywKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1dSSVRFLAorICAgICAgICAgIEZfU1RBIHwgRl9XUklURSwKICAgICAgICAgICBIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZMywgMCwgMCwKICAgICAgICAgICBwcmlzbTJtaWJfd2VwZGVmYXVsdGtleSB9LAogICAgIHsgRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlX2RvdDExUHJpdmFjeUludm9rZWQsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKKyAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCiAgICAgICAgICAgSEZBMzg0eF9SSURfQ05GV0VQRkxBR1MsIEhGQTM4NHhfV0VQRkxBR1NfUFJJVklOVk9LRUQsIDAsCiAgICAgICAgICAgcHJpc20ybWliX3ByaXZhY3lpbnZva2VkIH0sCiAgICAgeyBESURtaWJfZG90MTFzbXRfZG90MTFQcml2YWN5VGFibGVfZG90MTFXRVBEZWZhdWx0S2V5SUQsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKKyAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCiAgICAgICAgICAgSEZBMzg0eF9SSURfQ05GV0VQREVGQVVMVEtFWUlELCAwLCAwLAogICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKICAgICB7IERJRG1pYl9kb3QxMXNtdF9kb3QxMVByaXZhY3lUYWJsZV9kb3QxMUV4Y2x1ZGVVbmVuY3J5cHRlZCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAorICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKICAgICAgICAgICBIRkEzODR4X1JJRF9DTkZXRVBGTEFHUywgSEZBMzg0eF9XRVBGTEFHU19FWENMVURFLCAwLAogICAgICAgICAgIHByaXNtMm1pYl9leGNsdWRldW5lbmNyeXB0ZWQgfSwKLSAgICB7IERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeU9wZXJhdGlvblRhYmxlX2RvdDExU2hvcnRQcmVhbWJsZUVuYWJsZWQsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZTSE9SVFBSRUFNQkxFLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9wcmVhbWJsZSB9LAogCiAgICAgLyogZG90MTFtYWMgTUlCJ3MgKi8KIAogICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExT3BlcmF0aW9uVGFibGVfZG90MTFNQUNBZGRyZXNzLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCisgICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAogICAgICAgICAgIEhGQTM4NHhfUklEX0NORk9XTk1BQ0FERFIsIEhGQTM4NHhfUklEX0NORk9XTk1BQ0FERFJfTEVOLCAwLAogICAgICAgICAgIHByaXNtMm1pYl9ieXRlYXJlYTJwc3RyIH0sCiAgICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFPcGVyYXRpb25UYWJsZV9kb3QxMVJUU1RocmVzaG9sZCwKICAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCiAgICAgICAgICAgSEZBMzg0eF9SSURfUlRTVEhSRVNILCAwLCAwLAogICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMU9wZXJhdGlvblRhYmxlX2RvdDExUlRTVGhyZXNob2xkLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX1JUU1RIUkVTSDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAogICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExT3BlcmF0aW9uVGFibGVfZG90MTFTaG9ydFJldHJ5TGltaXQsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAorICAgICAgICAgIEZfU1RBIHwgRl9SRUFELAogICAgICAgICAgIEhGQTM4NHhfUklEX1NIT1JUUkVUUllMSU1JVCwgMCwgMCwKICAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCiAgICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFPcGVyYXRpb25UYWJsZV9kb3QxMUxvbmdSZXRyeUxpbWl0LAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKKyAgICAgICAgICBGX1NUQSB8IEZfUkVBRCwKICAgICAgICAgICBIRkEzODR4X1JJRF9MT05HUkVUUllMSU1JVCwgMCwgMCwKICAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCiAgICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFPcGVyYXRpb25UYWJsZV9kb3QxMUZyYWdtZW50YXRpb25UaHJlc2hvbGQsCiAgICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAogICAgICAgICAgIEhGQTM4NHhfUklEX0ZSQUdUSFJFU0gsIDAsIDAsCiAgICAgICAgICAgcHJpc20ybWliX2ZyYWdtZW50YXRpb250aHJlc2hvbGQgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMU9wZXJhdGlvblRhYmxlX2RvdDExRnJhZ21lbnRhdGlvblRocmVzaG9sZCwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9GUkFHVEhSRVNIMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZnJhZ21lbnRhdGlvbnRocmVzaG9sZCB9LAogICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExT3BlcmF0aW9uVGFibGVfZG90MTFNYXhUcmFuc21pdE1TRFVMaWZldGltZSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCisgICAgICAgICAgRl9TVEEgfCBGX1JFQUQsCiAgICAgICAgICAgSEZBMzg0eF9SSURfTUFYVFhMSUZFVElNRSwgMCwgMCwKICAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFPcGVyYXRpb25UYWJsZV9kb3QxMU1heFJlY2VpdmVMaWZldGltZSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfTUFYUlhMSUZFVElNRSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczEsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMywKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczQsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3M1LAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzNiwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczcsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3M4LAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzOSwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczEwLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTEsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxMiwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczEzLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTQsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxNSwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczE2LAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTcsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxOCwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczE5LAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjAsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyMSwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczIyLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjMsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyNCwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczI1LAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjYsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyNywKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczI4LAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjksCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAotICAgIHsgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MzMCwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZ3JvdXBhZGRyZXNzIH0sCi0gICAgeyBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczMxLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ncm91cGFkZHJlc3MgfSwKLSAgICB7IERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMzIsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2dyb3VwYWRkcmVzcyB9LAogCiAgICAgLyogZG90MTFwaHkgTUlCJ3MgKi8KIAotICAgIHsgRElEbWliX2RvdDExcGh5X2RvdDExUGh5T3BlcmF0aW9uVGFibGVfZG90MTFQSFlUeXBlLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9QSFlUWVBFLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeU9wZXJhdGlvblRhYmxlX2RvdDExVGVtcFR5cGUsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX1RFTVBUWVBFLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKICAgICB7IERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeURTU1NUYWJsZV9kb3QxMUN1cnJlbnRDaGFubmVsLAogICAgICAgICAgIEZfU1RBIHwgRl9SRUFELAogICAgICAgICAgIEhGQTM4NHhfUklEX0NVUlJFTlRDSEFOTkVMLCAwLCAwLAogICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeURTU1NUYWJsZV9kb3QxMUN1cnJlbnRDaGFubmVsLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GT1dOQ0hBTk5FTCwgMCwgMCwKKyAgICB7IERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMUN1cnJlbnRUeFBvd2VyTGV2ZWwsCisgICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAorICAgICAgICAgIEhGQTM4NHhfUklEX1RYUE9XRVJNQVgsIDAsIDAsCiAgICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX2RvdDExcGh5X2RvdDExUGh5RFNTU1RhYmxlX2RvdDExQ3VycmVudENDQU1vZGUsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0NDQU1PREUsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotCi0gICAgLyogcDJUYWJsZSBNSUIncyAqLwotCi0gICAgeyBESURtaWJfcDJfcDJUYWJsZV9wMk1NVHgsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9wcml2IH0sCi0gICAgeyBESURtaWJfcDJfcDJUYWJsZV9wMkVhcmx5QmVhY29uLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEJJVDcsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2FwcGNmaW5mb2ZsYWcgfSwKLSAgICB7IERJRG1pYl9wMl9wMlRhYmxlX3AyUmVjZWl2ZWRGcmFtZVN0YXRpc3RpY3MsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3ByaXYgfSwKLSAgICB7IERJRG1pYl9wMl9wMlRhYmxlX3AyQ29tbXVuaWNhdGlvblRhbGxpZXMsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3ByaXYgfSwKLSAgICB7IERJRG1pYl9wMl9wMlRhYmxlX3AyQXV0aGVudGljYXRlZCwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFELAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3ByaXYgfSwKLSAgICB7IERJRG1pYl9wMl9wMlRhYmxlX3AyQXNzb2NpYXRlZCwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFELAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3ByaXYgfSwKLSAgICB7IERJRG1pYl9wMl9wMlRhYmxlX3AyUG93ZXJTYXZlVXNlckNvdW50LAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfcHJpdiB9LAotICAgIHsgRElEbWliX3AyX3AyVGFibGVfcDJDb21tZW50LAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfcHJpdiB9LAotICAgIHsgRElEbWliX3AyX3AyVGFibGVfcDJBY2Nlc3NNb2RlLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3ByaXYgfSwKLSAgICB7IERJRG1pYl9wMl9wMlRhYmxlX3AyQWNjZXNzQWxsb3csCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfcHJpdiB9LAotICAgIHsgRElEbWliX3AyX3AyVGFibGVfcDJBY2Nlc3NEZW55LAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIDAsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3ByaXYgfSwKLSAgICB7IERJRG1pYl9wMl9wMlRhYmxlX3AyQ2hhbm5lbEluZm9SZXN1bHRzLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQsCi0gICAgICAgICAgMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfcHJpdiB9LAogCiAgICAgLyogcDJTdGF0aWMgTUlCJ3MgKi8KIApAQCAtNzE4LDU2NSArMjU1LDEzIEBACiAgICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAogICAgICAgICAgIEhGQTM4NHhfUklEX0NORlBPUlRUWVBFLCAwLCAwLAogICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZk93bk1BQ0FkZHJlc3MsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZPV05NQUNBRERSLCBIRkEzODR4X1JJRF9DTkZPV05NQUNBRERSX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYnl0ZWFyZWEycHN0ciB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mRGVzaXJlZFNTSUQsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORkRFU0lSRURTU0lELCBIRkEzODR4X1JJRF9DTkZERVNJUkVEU1NJRF9MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX2J5dGVzdHIycHN0ciB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mT3duQ2hhbm5lbCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORk9XTkNIQU5ORUwsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mT3duU1NJRCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORk9XTlNTSUQsIEhGQTM4NHhfUklEX0NORk9XTlNTSURfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ieXRlc3RyMnBzdHIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZk93bkFUSU1XaW5kb3csCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORk9XTkFUSU1XSU4sIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mU3lzdGVtU2NhbGUsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZTWVNTQ0FMRSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZNYXhEYXRhTGVuZ3RoLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GTUFYREFUQUxFTiwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRFNBZGRyZXNzLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZXRFNBRERSLCBIRkEzODR4X1JJRF9DTkZXRFNBRERSX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYnl0ZWFyZWEycHN0ciB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mUE1FbmFibGVkLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZQTUVOQUJMRUQsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3RydXRoIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZQTUVQUywKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GUE1FUFMsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3RydXRoIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZNdWx0aWNhc3RSZWNlaXZlLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZNVUxUSUNBU1RSWCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdHJ1dGggfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZk1heFNsZWVwRHVyYXRpb24sCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORk1BWFNMRUVQRFVSLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlBNSG9sZG92ZXJEdXJhdGlvbiwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GUE1IT0xERFVSLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZk93bk5hbWUsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZPV05OQU1FLCBIRkEzODR4X1JJRF9DTkZPV05OQU1FX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYnl0ZXN0cjJwc3RyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZPd25EVElNUGVyaW9kLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GT1dORFRJTVBFUiwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRFNBZGRyZXNzMSwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZXRFNBRERSMSwgSEZBMzg0eF9SSURfQ05GV0RTQUREUjFfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ieXRlYXJlYTJwc3RyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRFNBZGRyZXNzMiwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZXRFNBRERSMiwgSEZBMzg0eF9SSURfQ05GV0RTQUREUjJfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ieXRlYXJlYTJwc3RyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRFNBZGRyZXNzMywKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZXRFNBRERSMywgSEZBMzg0eF9SSURfQ05GV0RTQUREUjNfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ieXRlYXJlYTJwc3RyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRFNBZGRyZXNzNCwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZXRFNBRERSNCwgSEZBMzg0eF9SSURfQ05GV0RTQUREUjRfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ieXRlYXJlYTJwc3RyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRFNBZGRyZXNzNSwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZXRFNBRERSNSwgSEZBMzg0eF9SSURfQ05GV0RTQUREUjVfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ieXRlYXJlYTJwc3RyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRFNBZGRyZXNzNiwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZXRFNBRERSNiwgSEZBMzg0eF9SSURfQ05GV0RTQUREUjZfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9ieXRlYXJlYTJwc3RyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZNdWx0aWNhc3RQTUJ1ZmZlcmluZywKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZNQ0FTVFBNQlVGRiwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdHJ1dGggfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZldFUERlZmF1bHRLZXlJRCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVlJRCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRVBEZWZhdWx0S2V5MCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVkwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl93ZXBkZWZhdWx0a2V5IH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRVBEZWZhdWx0S2V5MSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVkxLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl93ZXBkZWZhdWx0a2V5IH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRVBEZWZhdWx0S2V5MiwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVkyLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl93ZXBkZWZhdWx0a2V5IH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRVBEZWZhdWx0S2V5MywKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVkzLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl93ZXBkZWZhdWx0a2V5IH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZXRVBGbGFncywKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORldFUEZMQUdTLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZkF1dGhlbnRpY2F0aW9uLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GQVVUSEVOVElDQVRJT04sIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mTWF4QXNzb2NpYXRlZFN0YXRpb25zLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORk1BWEFTU09DU1RBVElPTlMsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mVHhDb250cm9sLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GVFhDT05UUk9MLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlJvYW1pbmdNb2RlLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZST0FNSU5HTU9ERSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZIb3N0QXV0aGVudGljYXRpb24sCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GSE9TVEFVVEhBU1NPQywgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdHJ1dGggfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlJjdkNyY0Vycm9yLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GUkNWQ1JDRVJST1IsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mQWx0UmV0cnlDb3VudCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORkFMVFJFVFJZQ05ULCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZkJlYWNvbkludGVydmFsLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORkFQQkNOSU5ULCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZk1lZGl1bU9jY3VwYW5jeUxpbWl0LAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORkFQUENGSU5GTywgSEZBMzg0eF9SSURfQ05GQVBQQ0ZJTkZPX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyb2Zmc2V0IH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZDRlBQZXJpb2QsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GQVBQQ0ZJTkZPLCBIRkEzODR4X1JJRF9DTkZBUFBDRklORk9fTEVOLCAxLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJvZmZzZXQgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZkNGUE1heER1cmF0aW9uLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORkFQUENGSU5GTywgSEZBMzg0eF9SSURfQ05GQVBQQ0ZJTkZPX0xFTiwgMiwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyb2Zmc2V0IH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZDRlBGbGFncywKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZBUFBDRklORk8sIEhGQTM4NHhfUklEX0NORkFQUENGSU5GT19MRU4sIDMsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMm9mZnNldCB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mU1RBUENGSW5mbywKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GU1RBUENGSU5GTywgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZQcmlvcml0eVFVc2FnZSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORlBSSU9SSVRZUVVTQUdFLCBIRkEzODR4X1JJRF9DTkZQUklPUVVTQUdFX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyYXJyYXkgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlRJTUN0cmwsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZUSU1DVFJMLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlRoaXJ0eTJUYWxseSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORlRISVJUWTJUQUxMWSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdHJ1dGggfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZkVuaFNlY3VyaXR5LAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORkVOSFNFQ1VSSVRZLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMlN0YXRpY19wMkNuZlNob3J0UHJlYW1ibGUsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZTSE9SVFBSRUFNQkxFLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9wcmVhbWJsZSB9LAotICAgIHsgRElEbWliX3AyX3AyU3RhdGljX3AyQ25mRXhjbHVkZUxvbmdQcmVhbWJsZSwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZFWENMT05HUFJFQU1CTEUsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3RydXRoIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZBdXRoZW50aWNhdGlvblJzcFRPLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DTkZBVVRIUlNQVElNRU9VVCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZCYXNpY1JhdGVzLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ05GQkFTSUNSQVRFUywgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJTdGF0aWNfcDJDbmZTdXBwb3J0ZWRSYXRlcywKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NORlNVUFBSQVRFUywgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0KLSAgICAvKiBwMkR5bmFtaWMgTUlCJ3MgKi8KLQotICAgIHsgRElEbWliX3AyX3AyRHluYW1pY19wMkNyZWF0ZUlCU1MsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0NSRUFURUlCU1MsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3RydXRoIH0sCi0gICAgeyBESURtaWJfcDJfcDJEeW5hbWljX3AyRnJhZ21lbnRhdGlvblRocmVzaG9sZCwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfRlJBR1RIUkVTSCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZnJhZ21lbnRhdGlvbnRocmVzaG9sZCB9LAotICAgIHsgRElEbWliX3AyX3AyRHluYW1pY19wMlJUU1RocmVzaG9sZCwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfUlRTVEhSRVNILCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMkR5bmFtaWNfcDJUeFJhdGVDb250cm9sLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9UWFJBVEVDTlRMLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMkR5bmFtaWNfcDJQcm9taXNjdW91c01vZGUsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX1BST01JU0NNT0RFLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl90cnV0aCB9LAotICAgIHsgRElEbWliX3AyX3AyRHluYW1pY19wMkZyYWdtZW50YXRpb25UaHJlc2hvbGQwLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0ZSQUdUSFJFU0gwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9mcmFnbWVudGF0aW9udGhyZXNob2xkIH0sCi0gICAgeyBESURtaWJfcDJfcDJEeW5hbWljX3AyRnJhZ21lbnRhdGlvblRocmVzaG9sZDEsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfRlJBR1RIUkVTSDEsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2ZyYWdtZW50YXRpb250aHJlc2hvbGQgfSwKLSAgICB7IERJRG1pYl9wMl9wMkR5bmFtaWNfcDJGcmFnbWVudGF0aW9uVGhyZXNob2xkMiwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9GUkFHVEhSRVNIMiwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZnJhZ21lbnRhdGlvbnRocmVzaG9sZCB9LAotICAgIHsgRElEbWliX3AyX3AyRHluYW1pY19wMkZyYWdtZW50YXRpb25UaHJlc2hvbGQzLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0ZSQUdUSFJFU0gzLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9mcmFnbWVudGF0aW9udGhyZXNob2xkIH0sCi0gICAgeyBESURtaWJfcDJfcDJEeW5hbWljX3AyRnJhZ21lbnRhdGlvblRocmVzaG9sZDQsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfRlJBR1RIUkVTSDQsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX2ZyYWdtZW50YXRpb250aHJlc2hvbGQgfSwKLSAgICB7IERJRG1pYl9wMl9wMkR5bmFtaWNfcDJGcmFnbWVudGF0aW9uVGhyZXNob2xkNSwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9GUkFHVEhSRVNINSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfZnJhZ21lbnRhdGlvbnRocmVzaG9sZCB9LAotICAgIHsgRElEbWliX3AyX3AyRHluYW1pY19wMkZyYWdtZW50YXRpb25UaHJlc2hvbGQ2LAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX0ZSQUdUSFJFU0g2LCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9mcmFnbWVudGF0aW9udGhyZXNob2xkIH0sCi0gICAgeyBESURtaWJfcDJfcDJEeW5hbWljX3AyUlRTVGhyZXNob2xkMCwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9SVFNUSFJFU0gwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMkR5bmFtaWNfcDJSVFNUaHJlc2hvbGQxLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX1JUU1RIUkVTSDEsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyRHluYW1pY19wMlJUU1RocmVzaG9sZDIsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfUlRTVEhSRVNIMiwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJEeW5hbWljX3AyUlRTVGhyZXNob2xkMywKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9SVFNUSFJFU0gzLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMkR5bmFtaWNfcDJSVFNUaHJlc2hvbGQ0LAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX1JUU1RIUkVTSDQsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyRHluYW1pY19wMlJUU1RocmVzaG9sZDUsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfUlRTVEhSRVNINSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJEeW5hbWljX3AyUlRTVGhyZXNob2xkNiwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9SVFNUSFJFU0g2LCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMkR5bmFtaWNfcDJUeFJhdGVDb250cm9sMCwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9UWFJBVEVDTlRMMCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJEeW5hbWljX3AyVHhSYXRlQ29udHJvbDEsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfVFhSQVRFQ05UTDEsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyRHluYW1pY19wMlR4UmF0ZUNvbnRyb2wyLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX1RYUkFURUNOVEwyLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMkR5bmFtaWNfcDJUeFJhdGVDb250cm9sMywKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9UWFJBVEVDTlRMMywgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJEeW5hbWljX3AyVHhSYXRlQ29udHJvbDQsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCB8IEZfV1JJVEUsCi0gICAgICAgICAgSEZBMzg0eF9SSURfVFhSQVRFQ05UTDQsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyRHluYW1pY19wMlR4UmF0ZUNvbnRyb2w1LAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX1RYUkFURUNOVEw1LCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMkR5bmFtaWNfcDJUeFJhdGVDb250cm9sNiwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9UWFJBVEVDTlRMNiwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0KLSAgICAvKiBwMkJlaGF2aW9yIE1JQidzICovCi0KLSAgICB7IERJRG1pYl9wMl9wMkJlaGF2aW9yX3AyVGlja1RpbWUsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFEIHwgRl9XUklURSwKLSAgICAgICAgICBIRkEzODR4X1JJRF9JVElDS1RJTUUsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotCi0gICAgLyogcDJOSUMgTUlCJ3MgKi8KLQotICAgIHsgRElEbWliX3AyX3AyTklDX3AyTWF4TG9hZFRpbWUsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX01BWExPQURUSU1FLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk5JQ19wMkRMQnVmZmVyUGFnZSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfRE9XTkxPQURCVUZGRVIsIEhGQTM4NHhfUklEX0RPV05MT0FEQlVGRkVSX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyb2Zmc2V0IH0sCi0gICAgeyBESURtaWJfcDJfcDJOSUNfcDJETEJ1ZmZlck9mZnNldCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfRE9XTkxPQURCVUZGRVIsIEhGQTM4NHhfUklEX0RPV05MT0FEQlVGRkVSX0xFTiwgMSwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyb2Zmc2V0IH0sCi0gICAgeyBESURtaWJfcDJfcDJOSUNfcDJETEJ1ZmZlckxlbmd0aCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfRE9XTkxPQURCVUZGRVIsIEhGQTM4NHhfUklEX0RPV05MT0FEQlVGRkVSX0xFTiwgMiwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyb2Zmc2V0IH0sCi0gICAgeyBESURtaWJfcDJfcDJOSUNfcDJQUklJZGVudGl0eSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfUFJJSURFTlRJVFksIEhGQTM4NHhfUklEX1BSSUlERU5USVRZX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyYXJyYXkgfSwKLSAgICB7IERJRG1pYl9wMl9wMk5JQ19wMlBSSVN1cFJhbmdlLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9QUklTVVBSQU5HRSwgSEZBMzg0eF9SSURfUFJJU1VQUkFOR0VfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJhcnJheSB9LAotICAgIHsgRElEbWliX3AyX3AyTklDX3AyQ0ZJQWN0UmFuZ2VzLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9QUklfQ0ZJQUNUUkFOR0VTLCBIRkEzODR4X1JJRF9DRklBQ1RSQU5HRVNfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJhcnJheSB9LAotICAgIHsgRElEbWliX3AyX3AyTklDX3AyQnVpbGRTZXF1ZW5jZSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQlVJTERTRVEsIEhGQTM4NHhfUklEX0JVSUxEU0VRX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyYXJyYXkgfSwKLSAgICB7IERJRG1pYl9wMl9wMk5JQ19wMlByaW1hcnlGV0lELAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9md2lkIH0sCi0gICAgeyBESURtaWJfcDJfcDJOSUNfcDJTZWNvbmRhcnlGV0lELAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9md2lkIH0sCi0gICAgeyBESURtaWJfcDJfcDJOSUNfcDJUZXJ0aWFyeUZXSUQsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCwKLSAgICAgICAgICAwLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9md2lkIH0sCi0gICAgeyBESURtaWJfcDJfcDJOSUNfcDJOSUNTZXJpYWxOdW1iZXIsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX05JQ1NFUklBTE5VTUJFUiwgSEZBMzg0eF9SSURfTklDU0VSSUFMTlVNQkVSX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYnl0ZWFyZWEycHN0ciB9LAotICAgIHsgRElEbWliX3AyX3AyTklDX3AyTklDSWRlbnRpdHksCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX05JQ0lERU5USVRZLCBIRkEzODR4X1JJRF9OSUNJREVOVElUWV9MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMmFycmF5IH0sCi0gICAgeyBESURtaWJfcDJfcDJOSUNfcDJNRklTdXBSYW5nZSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfTUZJU1VQUkFOR0UsIEhGQTM4NHhfUklEX01GSVNVUFJBTkdFX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyYXJyYXkgfSwKLSAgICB7IERJRG1pYl9wMl9wMk5JQ19wMkNGSVN1cFJhbmdlLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DRklTVVBSQU5HRSwgSEZBMzg0eF9SSURfQ0ZJU1VQUkFOR0VfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJhcnJheSB9LAotICAgIHsgRElEbWliX3AyX3AyTklDX3AyQ2hhbm5lbExpc3QsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0NIQU5ORUxMSVNULCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk5JQ19wMlJlZ3VsYXRvcnlEb21haW5zLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9SRUdVTEFUT1JZRE9NQUlOUywgSEZBMzg0eF9SSURfUkVHVUxBVE9SWURPTUFJTlNfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl9yZWd1bGF0b3J5ZG9tYWlucyB9LAotICAgIHsgRElEbWliX3AyX3AyTklDX3AyVGVtcFR5cGUsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX1RFTVBUWVBFLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk5JQ19wMlNUQUlkZW50aXR5LAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9TVEFJREVOVElUWSwgSEZBMzg0eF9SSURfU1RBSURFTlRJVFlfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJhcnJheSB9LAotICAgIHsgRElEbWliX3AyX3AyTklDX3AyU1RBU3VwUmFuZ2UsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX1NUQVNVUFJBTkdFLCBIRkEzODR4X1JJRF9TVEFTVVBSQU5HRV9MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMmFycmF5IH0sCi0gICAgeyBESURtaWJfcDJfcDJOSUNfcDJNRklBY3RSYW5nZXMsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX1NUQV9NRklBQ1RSQU5HRVMsIEhGQTM4NHhfUklEX01GSUFDVFJBTkdFU19MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMmFycmF5IH0sCi0gICAgeyBESURtaWJfcDJfcDJOSUNfcDJTVEFDRklBY3RSYW5nZXMsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX1NUQV9DRklBQ1RSQU5HRVMsIEhGQTM4NHhfUklEX0NGSUFDVFJBTkdFUzJfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJhcnJheSB9LAogCiAgICAgLyogcDJNQUMgTUlCJ3MgKi8KIAotICAgIHsgRElEbWliX3AyX3AyTUFDX3AyUG9ydFN0YXR1cywKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9QT1JUU1RBVFVTLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMkN1cnJlbnRTU0lELAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0NVUlJFTlRTU0lELCBIRkEzODR4X1JJRF9DVVJSRU5UU1NJRF9MRU4sIDAsCi0gICAgICAgICAgcHJpc20ybWliX2J5dGVzdHIycHN0ciB9LAotICAgIHsgRElEbWliX3AyX3AyTUFDX3AyQ3VycmVudEJTU0lELAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0NVUlJFTlRCU1NJRCwgSEZBMzg0eF9SSURfQ1VSUkVOVEJTU0lEX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYnl0ZWFyZWEycHN0ciB9LAotICAgIHsgRElEbWliX3AyX3AyTUFDX3AyQ29tbXNRdWFsaXR5LAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0NPTU1TUVVBTElUWSwgSEZBMzg0eF9SSURfQ09NTVNRVUFMSVRZX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyYXJyYXkgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMkNvbW1zUXVhbGl0eUNRLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0NPTU1TUVVBTElUWSwgSEZBMzg0eF9SSURfQ09NTVNRVUFMSVRZX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyb2Zmc2V0IH0sCi0gICAgeyBESURtaWJfcDJfcDJNQUNfcDJDb21tc1F1YWxpdHlBU0wsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ09NTVNRVUFMSVRZLCBIRkEzODR4X1JJRF9DT01NU1FVQUxJVFlfTEVOLCAxLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJvZmZzZXQgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMkNvbW1zUXVhbGl0eUFOTCwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DT01NU1FVQUxJVFksIEhGQTM4NHhfUklEX0NPTU1TUVVBTElUWV9MRU4sIDIsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMm9mZnNldCB9LAotICAgIHsgRElEbWliX3AyX3AyTUFDX3AyZGJtQ29tbXNRdWFsaXR5LAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0RCTUNPTU1TUVVBTElUWSwgSEZBMzg0eF9SSURfREJNQ09NTVNRVUFMSVRZX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyYXJyYXkgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMmRibUNvbW1zUXVhbGl0eUNRLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0NPTU1TUVVBTElUWSwgSEZBMzg0eF9SSURfQ09NTVNRVUFMSVRZX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyb2Zmc2V0IH0sCi0gICAgeyBESURtaWJfcDJfcDJNQUNfcDJkYm1Db21tc1F1YWxpdHlBU0wsCi0gICAgICAgICAgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ09NTVNRVUFMSVRZLCBIRkEzODR4X1JJRF9DT01NU1FVQUxJVFlfTEVOLCAxLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJvZmZzZXQgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMmRibUNvbW1zUXVhbGl0eUFOTCwKLSAgICAgICAgICBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DT01NU1FVQUxJVFksIEhGQTM4NHhfUklEX0NPTU1TUVVBTElUWV9MRU4sIDIsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMm9mZnNldCB9LAogICAgIHsgRElEbWliX3AyX3AyTUFDX3AyQ3VycmVudFR4UmF0ZSwKICAgICAgICAgICBGX1NUQSB8IEZfUkVBRCwKICAgICAgICAgICBIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFLCAwLCAwLAogICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMkN1cnJlbnRCZWFjb25JbnRlcnZhbCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ1VSUkVOVEJDTklOVCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJNQUNfcDJTdGFDdXJyZW50U2NhbGVUaHJlc2hvbGRzLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0NVUlJFTlRTQ0FMRVRIUkVTSCwgSEZBMzg0eF9SSURfU1RBQ1VSU0NBTEVUSFJFU0hfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJhcnJheSB9LAotICAgIHsgRElEbWliX3AyX3AyTUFDX3AyQVBDdXJyZW50U2NhbGVUaHJlc2hvbGRzLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ1VSUkVOVFNDQUxFVEhSRVNILCBIRkEzODR4X1JJRF9BUENVUlNDQUxFVEhSRVNIX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyYXJyYXkgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMlByb3RvY29sUnNwVGltZSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfUFJPVE9DT0xSU1BUSU1FLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMlNob3J0UmV0cnlMaW1pdCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfU0hPUlRSRVRSWUxJTUlULCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMkxvbmdSZXRyeUxpbWl0LAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9MT05HUkVUUllMSU1JVCwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJNQUNfcDJNYXhUcmFuc21pdExpZmV0aW1lLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9NQVhUWExJRkVUSU1FLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMk1heFJlY2VpdmVMaWZldGltZSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfTUFYUlhMSUZFVElNRSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJNQUNfcDJDRlBvbGxhYmxlLAotICAgICAgICAgIEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0NGUE9MTEFCTEUsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyTUFDX3AyQXV0aGVudGljYXRpb25BbGdvcml0aG1zLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9BVVRIQUxHT1JJVEhNUywgSEZBMzg0eF9SSURfQVVUSEFMR09SSVRITVNfTEVOLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzJhcnJheSB9LAotICAgIHsgRElEbWliX3AyX3AyTUFDX3AyUHJpdmFjeU9wdGlvbkltcGxlbWVudGVkLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9QUklWQUNZT1BUSU1QLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMkN1cnJlbnRUeFJhdGUxLAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURTEsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyTUFDX3AyQ3VycmVudFR4UmF0ZTIsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFMiwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJNQUNfcDJDdXJyZW50VHhSYXRlMywKLSAgICAgICAgICBGX0FQIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEUzLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMkN1cnJlbnRUeFJhdGU0LAotICAgICAgICAgIEZfQVAgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ1VSUkVOVFRYUkFURTQsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyTUFDX3AyQ3VycmVudFR4UmF0ZTUsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DVVJSRU5UVFhSQVRFNSwgMCwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfdWludDMyIH0sCi0gICAgeyBESURtaWJfcDJfcDJNQUNfcDJDdXJyZW50VHhSYXRlNiwKLSAgICAgICAgICBGX0FQIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX0NVUlJFTlRUWFJBVEU2LCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1BQ19wMk93bk1BQ0FkZHJlc3MsCi0gICAgICAgICAgRl9BUCB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9PV05NQUNBRERSRVNTLCBIRkEzODR4X1JJRF9PV05NQUNBRERSRVNTX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYnl0ZWFyZWEycHN0ciB9LAotCi0gICAgLyogcDJNb2RlbSBNSUIncyAqLwotCi0gICAgeyBESURtaWJfcDJfcDJNb2RlbV9wMlBIWVR5cGUsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX1BIWVRZUEUsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyTW9kZW1fcDJDdXJyZW50Q2hhbm5lbCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ1VSUkVOVENIQU5ORUwsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyTW9kZW1fcDJDdXJyZW50UG93ZXJTdGF0ZSwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQsCi0gICAgICAgICAgSEZBMzg0eF9SSURfQ1VSUkVOVFBPV0VSU1RBVEUsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyTW9kZW1fcDJDQ0FNb2RlLAotICAgICAgICAgIEZfQVAgfCBGX1NUQSB8IEZfUkVBRCwKLSAgICAgICAgICBIRkEzODR4X1JJRF9DQ0FNT0RFLCAwLCAwLAotICAgICAgICAgIHByaXNtMm1pYl91aW50MzIgfSwKLSAgICB7IERJRG1pYl9wMl9wMk1vZGVtX3AyVHhQb3dlck1heCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX1RYUE9XRVJNQVgsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX2RvdDExcGh5X2RvdDExUGh5VHhQb3dlclRhYmxlX2RvdDExQ3VycmVudFR4UG93ZXJMZXZlbCwKLSAgICAgICAgICBGX0FQIHwgRl9TVEEgfCBGX1JFQUQgfCBGX1dSSVRFLAotICAgICAgICAgIEhGQTM4NHhfUklEX1RYUE9XRVJNQVgsIDAsIDAsCi0gICAgICAgICAgcHJpc20ybWliX3VpbnQzMiB9LAotICAgIHsgRElEbWliX3AyX3AyTW9kZW1fcDJTdXBwb3J0ZWREYXRhUmF0ZXMsCi0gICAgICAgICAgRl9BUCB8IEZfU1RBIHwgRl9SRUFELAotICAgICAgICAgIEhGQTM4NHhfUklEX1NVUFBPUlRFRERBVEFSQVRFUywgSEZBMzg0eF9SSURfU1VQUE9SVEVEREFUQVJBVEVTX0xFTiwgMCwKLSAgICAgICAgICBwcmlzbTJtaWJfYnl0ZXN0cjJwc3RyIH0sCiAKICAgICAvKiBBbmQgZmluYWxseSwgbG54IG1pYnMgKi8KICAgICB7IERJRG1pYl9sbnhfbG54Q29uZmlnVGFibGVfbG54UlNOQUlFLApAQCAtMTI4NSw5NCArMjcwLDYgQEAKICAgICAgICAgICBwcmlzbTJtaWJfcHJpdiB9LAogICAgIHsgMCwgMCwgMCwgMCwgMCwgTlVMTH19OwogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVRoZXNlIE1JQidzIGFyZSBub3Qgc3VwcG9ydGVkIGF0IHRoaXMgdGltZToKLQotRElEbWliX2RvdDExcGh5X2RvdDExUGh5T3BlcmF0aW9uVGFibGVfZG90MTFDaGFubmVsQWdpbGl0eVByZXNlbnQKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeU9wZXJhdGlvblRhYmxlX2RvdDExQ2hhbm5lbEFnaWxpdHlFbmFibGVkCi1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlEU1NTVGFibGVfZG90MTFQQkNDT3B0aW9uSW1wbGVtZW50ZWQKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVJlZ0RvbWFpbnNTdXBwb3J0ZWRUYWJsZV9kb3QxMVJlZ0RvbWFpbnNTdXBwb3J0SW5kZXgKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVN1cHBvcnRlZERhdGFSYXRlc1R4VGFibGVfZG90MTFTdXBwb3J0ZWREYXRhUmF0ZXNUeEluZGV4Ci1ESURtaWJfZG90MTFwaHlfZG90MTFTdXBwb3J0ZWREYXRhUmF0ZXNUeFRhYmxlX2RvdDExU3VwcG9ydGVkRGF0YVJhdGVzVHhWYWx1ZQotRElEbWliX2RvdDExcGh5X2RvdDExU3VwcG9ydGVkRGF0YVJhdGVzUnhUYWJsZV9kb3QxMVN1cHBvcnRlZERhdGFSYXRlc1J4SW5kZXgKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVN1cHBvcnRlZERhdGFSYXRlc1J4VGFibGVfZG90MTFTdXBwb3J0ZWREYXRhUmF0ZXNSeFZhbHVlCi0KLURJRG1pYl9kb3QxMXBoeV9kb3QxMVJlZ0RvbWFpbnNTdXBwb3J0ZWRUYWJsZV9kb3QxMVJlZ0RvbWFpbnNTdXBwb3J0VmFsdWUKLVRPRE86IG5lZWQgdG8gaW52ZXN0aWdhdGUgd2h5IHdsYW4gaGFzIHRoaXMgYXMgZW51bWVyYXRlZCBhbmQgUHJpc20yIGhhcyB0aGlzCi0gICAgICBhcyBidHllIHN0ci4KLQotRElEbWliX2RvdDExcGh5X2RvdDExUGh5RFNTU1RhYmxlX2RvdDExU2hvcnRQcmVhbWJsZU9wdGlvbkltcGxlbWVudGVkCi1UT0RPOiBGaW5kIG91dCB0aGUgZmlybXdhcmUgdmVyc2lvbiBudW1iZXIocykgZm9yIGlkZW50aWZ5aW5nCi0gICAgICB3aGV0aGVyIHRoZSBmaXJtd2FyZSBpcyBjYXBhYmxlIG9mIHNob3J0IHByZWFtYmxlLiBUUlVFIG9yIEZBTFNFCi0gICAgICB3aWxsIGJlIHJldHVybmVkIGJhc2VkIG9uIHRoZSB2ZXJzaW9uIG9mIHRoZSBmaXJtd2FyZS4KLQotV0VQIEtleSBtYXBwaW5ncyBhcmVuJ3Qgc3VwcG9ydGVkIGluIHRoZSBmL3cuCi1ESURtaWJfZG90MTFzbXRfZG90MTFXRVBLZXlNYXBwaW5nc1RhYmxlX2RvdDExV0VQS2V5TWFwcGluZ0luZGV4Ci1ESURtaWJfZG90MTFzbXRfZG90MTFXRVBLZXlNYXBwaW5nc1RhYmxlX2RvdDExV0VQS2V5TWFwcGluZ0FkZHJlc3MKLURJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUEtleU1hcHBpbmdzVGFibGVfZG90MTFXRVBLZXlNYXBwaW5nV0VQT24KLURJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUEtleU1hcHBpbmdzVGFibGVfZG90MTFXRVBLZXlNYXBwaW5nVmFsdWUKLURJRG1pYl9kb3QxMXNtdF9kb3QxMVByaXZhY3lUYWJsZV9kb3QxMVdFUEtleU1hcHBpbmdMZW5ndGgKLQotVE9ETzogaW1wbGVtZW50IGNvdW50ZXJzLgotRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlX2RvdDExV0VQSUNWRXJyb3JDb3VudAotRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlX2RvdDExV0VQRXhjbHVkZWRDb3VudAotRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMVRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudAotRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMU11bHRpY2FzdFRyYW5zbWl0dGVkRnJhbWVDb3VudAotRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMUZhaWxlZENvdW50Ci1ESURtaWJfZG90MTFtYWNfZG90MTFDb3VudGVyc1RhYmxlX2RvdDExUmV0cnlDb3VudAotRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMU11bHRpcGxlUmV0cnlDb3VudAotRElEbWliX2RvdDExbWFjX2RvdDExQ291bnRlcnNUYWJsZV9kb3QxMUZyYW1lRHVwbGljYXRlQ291bnQKLURJRG1pYl9kb3QxMW1hY19kb3QxMUNvdW50ZXJzVGFibGVfZG90MTFSVFNTdWNjZXNzQ291bnQKLURJRG1pYl9kb3QxMW1hY19kb3QxMUNvdW50ZXJzVGFibGVfZG90MTFSVFNGYWlsdXJlQ291bnQKLURJRG1pYl9kb3QxMW1hY19kb3QxMUNvdW50ZXJzVGFibGVfZG90MTFBQ0tGYWlsdXJlQ291bnQKLURJRG1pYl9kb3QxMW1hY19kb3QxMUNvdW50ZXJzVGFibGVfZG90MTFSZWNlaXZlZEZyYWdtZW50Q291bnQKLURJRG1pYl9kb3QxMW1hY19kb3QxMUNvdW50ZXJzVGFibGVfZG90MTFNdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQKLURJRG1pYl9kb3QxMW1hY19kb3QxMUNvdW50ZXJzVGFibGVfZG90MTFGQ1NFcnJvckNvdW50Ci1ESURtaWJfZG90MTFtYWNfZG90MTFDb3VudGVyc1RhYmxlX2RvdDExVHJhbnNtaXR0ZWRGcmFtZUNvdW50Ci1ESURtaWJfZG90MTFtYWNfZG90MTFDb3VudGVyc1RhYmxlX2RvdDExV0VQVW5kZWNyeXB0YWJsZUNvdW50Ci0KLVRPRE86IGltcGxlbWVudCBzYW5lIHZhbHVlcyBmb3IgdGhlc2UuCi1ESURtaWJfZG90MTFtYWNfZG90MTFPcGVyYXRpb25UYWJsZV9kb3QxMU1hbnVmYWN0dXJlcklECi1ESURtaWJfZG90MTFtYWNfZG90MTFPcGVyYXRpb25UYWJsZV9kb3QxMVByb2R1Y3RJRAotCi1Ob3QgdG9vIHdvcnJpZWQgYWJvdXQgdGhlc2UgYXQgdGhlIG1vbWVudC4KLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUFudGVubmFUYWJsZV9kb3QxMUN1cnJlbnRUeEFudGVubmEKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUFudGVubmFUYWJsZV9kb3QxMURpdmVyc2l0eVN1cHBvcnQKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUFudGVubmFUYWJsZV9kb3QxMUN1cnJlbnRSeEFudGVubmEKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMU51bWJlclN1cHBvcnRlZFBvd2VyTGV2ZWxzCi1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFUeFBvd2VyTGV2ZWwxCi1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFUeFBvd2VyTGV2ZWwyCi1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFUeFBvd2VyTGV2ZWwzCi1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFUeFBvd2VyTGV2ZWw0Ci1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFUeFBvd2VyTGV2ZWw1Ci1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFUeFBvd2VyTGV2ZWw2Ci1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFUeFBvd2VyTGV2ZWw3Ci1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFUeFBvd2VyTGV2ZWw4Ci1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFDdXJyZW50VHhQb3dlckxldmVsCi0KLVVtbW0sIEZIIGFuZCBJUiBkb24ndCBhcHBseQotRElEbWliX2RvdDExcGh5X2RvdDExUGh5RkhTU1RhYmxlX2RvdDExSG9wVGltZQotRElEbWliX2RvdDExcGh5X2RvdDExUGh5RkhTU1RhYmxlX2RvdDExQ3VycmVudENoYW5uZWxOdW1iZXIKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUZIU1NUYWJsZV9kb3QxMU1heER3ZWxsVGltZQotRElEbWliX2RvdDExcGh5X2RvdDExUGh5RkhTU1RhYmxlX2RvdDExQ3VycmVudER3ZWxsVGltZQotRElEbWliX2RvdDExcGh5X2RvdDExUGh5RkhTU1RhYmxlX2RvdDExQ3VycmVudFNldAotRElEbWliX2RvdDExcGh5X2RvdDExUGh5RkhTU1RhYmxlX2RvdDExQ3VycmVudFBhdHRlcm4KLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUZIU1NUYWJsZV9kb3QxMUN1cnJlbnRJbmRleAotRElEbWliX2RvdDExcGh5X2RvdDExUGh5RFNTU1RhYmxlX2RvdDExQ0NBTW9kZVN1cHBvcnRlZAotRElEbWliX2RvdDExcGh5X2RvdDExUGh5RFNTU1RhYmxlX2RvdDExRURUaHJlc2hvbGQKLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUlSVGFibGVfZG90MTFDQ0FXYXRjaGRvZ1RpbWVyTWF4Ci1ESURtaWJfZG90MTFwaHlfZG90MTFQaHlJUlRhYmxlX2RvdDExQ0NBV2F0Y2hkb2dDb3VudE1heAotRElEbWliX2RvdDExcGh5X2RvdDExUGh5SVJUYWJsZV9kb3QxMUNDQVdhdGNoZG9nVGltZXJNaW4KLURJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeUlSVGFibGVfZG90MTFDQ0FXYXRjaGRvZ0NvdW50TWluCi0KLVdlIGp1c3QgZG9uJ3QgaGF2ZSBlbm91Z2ggYW50ZW5uYXMgcmlnaHQgbm93IHRvIHdvcnJ5IGFib3V0IHRoaXMuCi1ESURtaWJfZG90MTFwaHlfZG90MTFBbnRlbm5hc0xpc3RUYWJsZV9kb3QxMUFudGVubmFMaXN0SW5kZXgKLURJRG1pYl9kb3QxMXBoeV9kb3QxMUFudGVubmFzTGlzdFRhYmxlX2RvdDExU3VwcG9ydGVkVHhBbnRlbm5hCi1ESURtaWJfZG90MTFwaHlfZG90MTFBbnRlbm5hc0xpc3RUYWJsZV9kb3QxMVN1cHBvcnRlZFJ4QW50ZW5uYQotRElEbWliX2RvdDExcGh5X2RvdDExQW50ZW5uYXNMaXN0VGFibGVfZG90MTFEaXZlcnNpdHlTZWxlY3Rpb25SeAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyogRnVuY3Rpb24gRGVmaW5pdGlvbnMgKi8KIApAQCAtMTQwMSw3ICsyOTgsOCBAQAogCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKIAlpbnQJCQlyZXN1bHQsIGlzZ2V0OwogCW1pYnJlY190CQkqbWliOwotCVVJTlQxNgkJCXdoaWNoOworCisJdTE2CQkJd2hpY2g7CiAKIAlwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QJKm1zZyA9IG1zZ3A7CiAJcDgwMjExaXRlbWRfdAkJCSptaWJpdGVtOwpAQCAtMTQxNSw3ICszMTMsNyBAQAogCSoqIERldGVybWluZSBpZiB0aGlzIGlzIGFuIEFjY2VzcyBQb2ludCBvciBhIHN0YXRpb24uCiAJKi8KIAotCXdoaWNoID0gaHctPmFwID8gRl9BUCA6IEZfU1RBOworCXdoaWNoID0gRl9TVEE7CiAKIAkvKgogCSoqIEZpbmQgdGhlIE1JQiBpbiB0aGUgTUlCIHRhYmxlLiAgTm90ZSB0aGF0IGEgTUlCIG1heSBiZSBpbiB0aGUKQEAgLTE0OTEsNTkgKzM4OSw2IEBACiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtaWJfYnl0ZXN0cjJwc3RyCi0qCi0qIEdldC9zZXQgcHN0ciBkYXRhIHRvL2Zyb20gYSBieXRlIHN0cmluZy4KLSoKLSogTUlCIHJlY29yZCBwYXJhbWV0ZXJzOgotKiAgICAgICBwYXJtMSAgICBQcmlzbTIgUklEIHZhbHVlLgotKiAgICAgICBwYXJtMiAgICBOdW1iZXIgb2YgYnl0ZXMgb2YgUklEIGRhdGEuCi0qICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCi0qICAgICAgIGlzZ2V0ICAgIE1JQkdFVC9NSUJTRVQgZmxhZy4KLSogICAgICAgd2xhbmRldiAgd2xhbiBkZXZpY2Ugc3RydWN0dXJlLgotKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgotKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KLSogICAgICAgbXNnICAgICAgTWVzc2FnZSBzdHJ1Y3R1cmUuCi0qICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgotKgotKiBSZXR1cm5zOgotKiAgICAgICAwICAgLSBTdWNjZXNzLgotKiAgICAgICB+MCAgLSBFcnJvci4KLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50IHByaXNtMm1pYl9ieXRlc3RyMnBzdHIoCi1taWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCi1pbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LAotd2xhbmRldmljZV90ICAgICAgICAgICAgICAgICAqd2xhbmRldiwKLWhmYTM4NHhfdCAgICAgICAgICAgICAgICAgICAgKmh3LAotcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAotdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSkKLXsKLQlpbnQgICAgICAgICAgICAgICAgcmVzdWx0OwotCXA4MDIxMXBzdHJkX3QgICAgICAqcHN0ciA9IChwODAyMTFwc3RyZF90KikgZGF0YTsKLQlVSU5UOCAgICAgICAgICAgICAgYnl0ZWJ1ZltNSUJfVE1QX01BWExFTl07Ci0JaGZhMzg0eF9ieXRlc3RyX3QgICpwMmJ5dGVzdHIgPSAoaGZhMzg0eF9ieXRlc3RyX3QqKSBieXRlYnVmOwotCi0JREJGRU5URVI7Ci0KLQlpZiAoaXNnZXQpIHsKLQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhodywgbWliLT5wYXJtMSwgYnl0ZWJ1ZiwgbWliLT5wYXJtMik7Ci0JCXByaXNtMm1nbXRfYnl0ZXN0cjJwc3RyKHAyYnl0ZXN0ciwgcHN0cik7Ci0JfSBlbHNlIHsKLQkJbWVtc2V0KGJ5dGVidWYsIDAsIG1pYi0+cGFybTIpOwotCQlwcmlzbTJtZ210X3BzdHIyYnl0ZXN0cihwMmJ5dGVzdHIsIHBzdHIpOwotCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnKGh3LCBtaWItPnBhcm0xLCBieXRlYnVmLCBtaWItPnBhcm0yKTsKLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybihyZXN1bHQpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogcHJpc20ybWliX2J5dGVhcmVhMnBzdHIKICoKICogR2V0L3NldCBwc3RyIGRhdGEgdG8vZnJvbSBhIGJ5dGUgYXJlYS4KQEAgLTE1NzgsMTMgKzQyMywxMyBAQAogewogCWludCAgICAgICAgICAgIHJlc3VsdDsKIAlwODAyMTFwc3RyZF90ICAqcHN0ciA9IChwODAyMTFwc3RyZF90KikgZGF0YTsKLQlVSU5UOCAgICAgICAgICBieXRlYnVmW01JQl9UTVBfTUFYTEVOXTsKKwl1OCAgICAgICAgICBieXRlYnVmW01JQl9UTVBfTUFYTEVOXTsKIAogCURCRkVOVEVSOwogCiAJaWYgKGlzZ2V0KSB7CiAJCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaHcsIG1pYi0+cGFybTEsIGJ5dGVidWYsIG1pYi0+cGFybTIpOwotCQlwcmlzbTJtZ210X2J5dGVhcmVhMnBzdHIoYnl0ZWJ1ZiwgcHN0ciwJbWliLT5wYXJtMik7CisJCXByaXNtMm1nbXRfYnl0ZWFyZWEycHN0cihieXRlYnVmLCBwc3RyLCBtaWItPnBhcm0yKTsKIAl9IGVsc2UgewogCQltZW1zZXQoYnl0ZWJ1ZiwgMCwgbWliLT5wYXJtMik7CiAJCXByaXNtMm1nbXRfcHN0cjJieXRlYXJlYShieXRlYnVmLCBwc3RyKTsKQEAgLTE2MjksOSArNDc0LDkgQEAKIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpCiB7CiAJaW50ICAgICByZXN1bHQ7Ci0JVUlOVDMyICAqdWludDMyID0gKFVJTlQzMiopIGRhdGE7Ci0JVUlOVDggICBieXRlYnVmW01JQl9UTVBfTUFYTEVOXTsKLQlVSU5UMTYgICp3b3JkYnVmID0gKFVJTlQxNiopIGJ5dGVidWY7CisJdTMyICAqdWludDMyID0gKHUzMiopIGRhdGE7CisJdTggICBieXRlYnVmW01JQl9UTVBfTUFYTEVOXTsKKwl1MTYgICp3b3JkYnVmID0gKHUxNiopIGJ5dGVidWY7CiAKIAlEQkZFTlRFUjsKIApAQCAtMTY1NCwxNzggKzQ5OSw2IEBACiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtaWJfdWludDMyYXJyYXkKLSoKLSogR2V0L3NldCBhbiBhcnJheSBvZiB1aW50MzIgZGF0YS4KLSoKLSogTUlCIHJlY29yZCBwYXJhbWV0ZXJzOgotKiAgICAgICBwYXJtMSAgICBQcmlzbTIgUklEIHZhbHVlLgotKiAgICAgICBwYXJtMiAgICBOdW1iZXIgb2YgYnl0ZXMgb2YgUklEIGRhdGEuCi0qICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCi0qICAgICAgIGlzZ2V0ICAgIE1JQkdFVC9NSUJTRVQgZmxhZy4KLSogICAgICAgd2xhbmRldiAgd2xhbiBkZXZpY2Ugc3RydWN0dXJlLgotKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgotKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KLSogICAgICAgbXNnICAgICAgTWVzc2FnZSBzdHJ1Y3R1cmUuCi0qICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgotKgotKiBSZXR1cm5zOgotKiAgICAgICAwICAgLSBTdWNjZXNzLgotKiAgICAgICB+MCAgLSBFcnJvci4KLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50IHByaXNtMm1pYl91aW50MzJhcnJheSgKLW1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKLWludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCi13bGFuZGV2aWNlX3QgICAgICAgICAgICAgICAgICp3bGFuZGV2LAotaGZhMzg0eF90ICAgICAgICAgICAgICAgICAgICAqaHcsCi1wODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCi12b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKQotewotCWludCAgICAgcmVzdWx0OwotCVVJTlQzMiAgKnVpbnQzMiA9IChVSU5UMzIgKikgZGF0YTsKLQlVSU5UOCAgIGJ5dGVidWZbTUlCX1RNUF9NQVhMRU5dOwotCVVJTlQxNiAgKndvcmRidWYgPSAoVUlOVDE2KikgYnl0ZWJ1ZjsKLQlpbnQgICAgIGksIGNudDsKLQotCURCRkVOVEVSOwotCi0JY250ID0gbWliLT5wYXJtMiAvIHNpemVvZihVSU5UMTYpOwotCi0JaWYgKGlzZ2V0KSB7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaHcsIG1pYi0+cGFybTEsIHdvcmRidWYsIG1pYi0+cGFybTIpOwotCQlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspCi0JCQlwcmlzbTJtZ210X3ByaXNtMmludDJwODAyMTFpbnQod29yZGJ1ZitpLCB1aW50MzIraSk7Ci0JfSBlbHNlIHsKLQkJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKQotCQkJcHJpc20ybWdtdF9wODAyMTFpbnQycHJpc20yaW50KHdvcmRidWYraSwgdWludDMyK2kpOwotCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnKGh3LCBtaWItPnBhcm0xLCB3b3JkYnVmLCBtaWItPnBhcm0yKTsKLQkJfQotCi0JREJGRVhJVDsKLQlyZXR1cm4ocmVzdWx0KTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1pYl91aW50MzJvZmZzZXQKLSoKLSogR2V0L3NldCBhIHNpbmdsZSBlbGVtZW50IGluIGFuIGFycmF5IG9mIHVpbnQzMiBkYXRhLgotKgotKiBNSUIgcmVjb3JkIHBhcmFtZXRlcnM6Ci0qICAgICAgIHBhcm0xICAgIFByaXNtMiBSSUQgdmFsdWUuCi0qICAgICAgIHBhcm0yICAgIE51bWJlciBvZiBieXRlcyBvZiBSSUQgZGF0YS4KLSogICAgICAgcGFybTMgICAgRWxlbWVudCBpbmRleC4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBtaWIgICAgICBNSUIgcmVjb3JkLgotKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCi0qICAgICAgIHdsYW5kZXYgIHdsYW4gZGV2aWNlIHN0cnVjdHVyZS4KLSogICAgICAgcHJpdiAgICAgInByaXYiIHN0cnVjdHVyZS4KLSogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCi0qICAgICAgIG1zZyAgICAgIE1lc3NhZ2Ugc3RydWN0dXJlLgotKiAgICAgICBkYXRhICAgICBEYXRhIGJ1ZmZlci4KLSoKLSogUmV0dXJuczoKLSogICAgICAgMCAgIC0gU3VjY2Vzcy4KLSogICAgICAgfjAgIC0gRXJyb3IuCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludCBwcmlzbTJtaWJfdWludDMyb2Zmc2V0KAotbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAotaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKLXdsYW5kZXZpY2VfdCAgICAgICAgICAgICAgICAgKndsYW5kZXYsCi1oZmEzODR4X3QgICAgICAgICAgICAgICAgICAgICpodywKLXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKLXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpCi17Ci0JaW50ICAgICByZXN1bHQ7Ci0JVUlOVDMyICAqdWludDMyID0gKFVJTlQzMiopIGRhdGE7Ci0JVUlOVDggICBieXRlYnVmW01JQl9UTVBfTUFYTEVOXTsKLQlVSU5UMTYgICp3b3JkYnVmID0gKFVJTlQxNiopIGJ5dGVidWY7Ci0JVUlOVDE2ICBjbnQ7Ci0KLQlEQkZFTlRFUjsKLQotCWNudCA9IG1pYi0+cGFybTIgLyBzaXplb2YoVUlOVDE2KTsKLQotCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaHcsIG1pYi0+cGFybTEsIHdvcmRidWYsIG1pYi0+cGFybTIpOwotCWlmIChyZXN1bHQgPT0gMCkgewotCQlpZiAoaXNnZXQpIHsKLQkJCWlmIChtaWItPnBhcm0zIDwgY250KQotCQkJCXByaXNtMm1nbXRfcHJpc20yaW50MnA4MDIxMWludCh3b3JkYnVmK21pYi0+cGFybTMsIHVpbnQzMik7Ci0JCQllbHNlCi0JCQkJKnVpbnQzMiA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAobWliLT5wYXJtMyA8IGNudCkgewotCQkJCXByaXNtMm1nbXRfcDgwMjExaW50MnByaXNtMmludCh3b3JkYnVmK21pYi0+cGFybTMsIHVpbnQzMik7Ci0JCQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZyhodywgbWliLT5wYXJtMSwgd29yZGJ1ZiwgbWliLT5wYXJtMik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybihyZXN1bHQpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWliX3RydXRoCi0qCi0qIEdldC9zZXQgdHJ1dGggZGF0YS4KLSoKLSogTUlCIHJlY29yZCBwYXJhbWV0ZXJzOgotKiAgICAgICBwYXJtMSAgICBQcmlzbTIgUklEIHZhbHVlLgotKiAgICAgICBwYXJtMiAgICBOb3QgdXNlZC4KLSogICAgICAgcGFybTMgICAgTm90IHVzZWQuCi0qCi0qIEFyZ3VtZW50czoKLSogICAgICAgbWliICAgICAgTUlCIHJlY29yZC4KLSogICAgICAgaXNnZXQgICAgTUlCR0VUL01JQlNFVCBmbGFnLgotKiAgICAgICB3bGFuZGV2ICB3bGFuIGRldmljZSBzdHJ1Y3R1cmUuCi0qICAgICAgIHByaXYgICAgICJwcml2IiBzdHJ1Y3R1cmUuCi0qICAgICAgIGh3ICAgICAgICJodyIgc3RydWN0dXJlLgotKiAgICAgICBtc2cgICAgICBNZXNzYWdlIHN0cnVjdHVyZS4KLSogICAgICAgZGF0YSAgICAgRGF0YSBidWZmZXIuCi0qCi0qIFJldHVybnM6Ci0qICAgICAgIDAgICAtIFN1Y2Nlc3MuCi0qICAgICAgIH4wICAtIEVycm9yLgotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpbnQgcHJpc20ybWliX3RydXRoKAotbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAotaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKLXdsYW5kZXZpY2VfdCAgICAgICAgICAgICAgICAgKndsYW5kZXYsCi1oZmEzODR4X3QgICAgICAgICAgICAgICAgICAgICpodywKLXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKLXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpCi17Ci0JaW50ICAgICByZXN1bHQ7Ci0JVUlOVDMyICAqdWludDMyID0gKFVJTlQzMiopIGRhdGE7Ci0JVUlOVDggICBieXRlYnVmW01JQl9UTVBfTUFYTEVOXTsKLQlVSU5UMTYgICp3b3JkYnVmID0gKFVJTlQxNiopIGJ5dGVidWY7Ci0KLQlEQkZFTlRFUjsKLQotCWlmIChpc2dldCkgewotCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnMTYoaHcsIG1pYi0+cGFybTEsIHdvcmRidWYpOwotCQkqdWludDMyID0gKCp3b3JkYnVmKSA/Ci0JCQkJUDgwMjExRU5VTV90cnV0aF90cnVlIDogUDgwMjExRU5VTV90cnV0aF9mYWxzZTsKLQl9IGVsc2UgewotCQkqd29yZGJ1ZiA9ICgoKnVpbnQzMikgPT0gUDgwMjExRU5VTV90cnV0aF90cnVlKSA/IDEgOiAwOwotCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsIG1pYi0+cGFybTEsICp3b3JkYnVmKTsKLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybihyZXN1bHQpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogcHJpc20ybWliX2ZsYWcKICoKICogR2V0L3NldCBhIGZsYWcuCkBAIC0xODU5LDEwICs1MzIsMTAgQEAKIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpCiB7CiAJaW50ICAgICByZXN1bHQ7Ci0JVUlOVDMyICAqdWludDMyID0gKFVJTlQzMiopIGRhdGE7Ci0JVUlOVDggICBieXRlYnVmW01JQl9UTVBfTUFYTEVOXTsKLQlVSU5UMTYgICp3b3JkYnVmID0gKFVJTlQxNiopIGJ5dGVidWY7Ci0JVUlOVDMyICBmbGFnczsKKwl1MzIgICp1aW50MzIgPSAodTMyKikgZGF0YTsKKwl1OCAgIGJ5dGVidWZbTUlCX1RNUF9NQVhMRU5dOworCXUxNiAgKndvcmRidWYgPSAodTE2KikgYnl0ZWJ1ZjsKKwl1MzIgIGZsYWdzOwogCiAJREJGRU5URVI7CiAKQEAgLTE4OTMsMTIxICs1NjYsNiBAQAogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWliX2FwcGNmaW5mb2ZsYWcKLSoKLSogR2V0L3NldCBhIHNpbmdsZSBmbGFnIGluIHRoZSBBUFBDRklORk8gcmVjb3JkLgotKgotKiBNSUIgcmVjb3JkIHBhcmFtZXRlcnM6Ci0qICAgICAgIHBhcm0xICAgIEJpdCB0byBnZXQvc2V0LgotKiAgICAgICBwYXJtMiAgICBOb3QgdXNlZC4KLSogICAgICAgcGFybTMgICAgTm90IHVzZWQuCi0qCi0qIEFyZ3VtZW50czoKLSogICAgICAgbWliICAgICAgTUlCIHJlY29yZC4KLSogICAgICAgaXNnZXQgICAgTUlCR0VUL01JQlNFVCBmbGFnLgotKiAgICAgICB3bGFuZGV2ICB3bGFuIGRldmljZSBzdHJ1Y3R1cmUuCi0qICAgICAgIHByaXYgICAgICJwcml2IiBzdHJ1Y3R1cmUuCi0qICAgICAgIGh3ICAgICAgICJodyIgc3RydWN0dXJlLgotKiAgICAgICBtc2cgICAgICBNZXNzYWdlIHN0cnVjdHVyZS4KLSogICAgICAgZGF0YSAgICAgRGF0YSBidWZmZXIuCi0qCi0qIFJldHVybnM6Ci0qICAgICAgIDAgICAtIFN1Y2Nlc3MuCi0qICAgICAgIH4wICAtIEVycm9yLgotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpbnQgcHJpc20ybWliX2FwcGNmaW5mb2ZsYWcoCi1taWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCi1pbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LAotd2xhbmRldmljZV90ICAgICAgICAgICAgICAgICAqd2xhbmRldiwKLWhmYTM4NHhfdCAgICAgICAgICAgICAgICAgICAgKmh3LAotcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAotdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSkKLXsKLQlpbnQgICAgIHJlc3VsdDsKLQlVSU5UMzIgICp1aW50MzIgPSAoVUlOVDMyKikgZGF0YTsKLQlVSU5UOCAgIGJ5dGVidWZbTUlCX1RNUF9NQVhMRU5dOwotCVVJTlQxNiAgKndvcmRidWYgPSAoVUlOVDE2KikgYnl0ZWJ1ZjsKLQlVSU5UMTYgIHdvcmQ7Ci0KLQlEQkZFTlRFUjsKLQotCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaHcsIEhGQTM4NHhfUklEX0NORkFQUENGSU5GTywKLQkJCQkJYnl0ZWJ1ZiwgSEZBMzg0eF9SSURfQ05GQVBQQ0ZJTkZPX0xFTik7Ci0JaWYgKHJlc3VsdCA9PSAwKSB7Ci0JCWlmIChpc2dldCkgewotCQkJKnVpbnQzMiA9IChoZmEzODR4Mmhvc3RfMTYod29yZGJ1ZlszXSkgJiBtaWItPnBhcm0xKSA/Ci0JCQkJUDgwMjExRU5VTV90cnV0aF90cnVlIDogUDgwMjExRU5VTV90cnV0aF9mYWxzZTsKLQkJfSBlbHNlIHsKLQkJCXdvcmQgPSBoZmEzODR4Mmhvc3RfMTYod29yZGJ1ZlszXSk7Ci0JCQl3b3JkID0gKCgqdWludDMyKSA9PSBQODAyMTFFTlVNX3RydXRoX3RydWUpID8KLQkJCQkod29yZCB8IG1pYi0+cGFybTEpIDogKHdvcmQgJiB+bWliLT5wYXJtMSk7Ci0JCQl3b3JkYnVmWzNdID0gaG9zdDJoZmEzODR4XzE2KHdvcmQpOwotCQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZyhodywgSEZBMzg0eF9SSURfQ05GQVBQQ0ZJTkZPLAotCQkJCQlieXRlYnVmLCBIRkEzODR4X1JJRF9DTkZBUFBDRklORk9fTEVOKTsKLQkJfQotCX0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuKHJlc3VsdCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtaWJfcmVndWxhdG9yeWRvbWFpbnMKLSoKLSogR2V0IHJlZ3VsYXRvcnkgZG9tYWluIGRhdGEuCi0qCi0qIE1JQiByZWNvcmQgcGFyYW1ldGVyczoKLSogICAgICAgcGFybTEgICAgUHJpc20yIFJJRCB2YWx1ZS4KLSogICAgICAgcGFybTIgICAgTnVtYmVyIG9mIGJ5dGVzIG9mIFJJRCBkYXRhLgotKiAgICAgICBwYXJtMyAgICBOb3QgdXNlZC4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBtaWIgICAgICBNSUIgcmVjb3JkLgotKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCi0qICAgICAgIHdsYW5kZXYgIHdsYW4gZGV2aWNlIHN0cnVjdHVyZS4KLSogICAgICAgcHJpdiAgICAgInByaXYiIHN0cnVjdHVyZS4KLSogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCi0qICAgICAgIG1zZyAgICAgIE1lc3NhZ2Ugc3RydWN0dXJlLgotKiAgICAgICBkYXRhICAgICBEYXRhIGJ1ZmZlci4KLSoKLSogUmV0dXJuczoKLSogICAgICAgMCAgIC0gU3VjY2Vzcy4KLSogICAgICAgfjAgIC0gRXJyb3IuCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludCBwcmlzbTJtaWJfcmVndWxhdG9yeWRvbWFpbnMoCi1taWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCi1pbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LAotd2xhbmRldmljZV90ICAgICAgICAgICAgICAgICAqd2xhbmRldiwKLWhmYTM4NHhfdCAgICAgICAgICAgICAgICAgICAgKmh3LAotcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAotdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSkKLXsKLQlpbnQgICAgICAgICAgICByZXN1bHQ7Ci0JVUlOVDMyICAgICAgICAgY250OwotCXA4MDIxMXBzdHJkX3QgICpwc3RyID0gKHA4MDIxMXBzdHJkX3QqKSBkYXRhOwotCVVJTlQ4ICAgICAgICAgIGJ5dGVidWZbTUlCX1RNUF9NQVhMRU5dOwotCVVJTlQxNiAgICAgICAgICp3b3JkYnVmID0gKFVJTlQxNiopIGJ5dGVidWY7Ci0KLQlEQkZFTlRFUjsKLQotCXJlc3VsdCA9IDA7Ci0KLQlpZiAoaXNnZXQpIHsKLQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhodywgbWliLT5wYXJtMSwgd29yZGJ1ZiwgbWliLT5wYXJtMik7Ci0JCXByaXNtMm1nbXRfcHJpc20yaW50MnA4MDIxMWludCh3b3JkYnVmLCAmY250KTsKLQkJcHN0ci0+bGVuID0gKFVJTlQ4KSBjbnQ7Ci0JCW1lbWNweShwc3RyLT5kYXRhLCAmd29yZGJ1ZlsxXSwgcHN0ci0+bGVuKTsKLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybihyZXN1bHQpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogcHJpc20ybWliX3dlcGRlZmF1bHRrZXkKICoKICogR2V0L3NldCBXRVAgZGVmYXVsdCBrZXlzLgpAQCAtMjA0Miw4ICs2MDAsOCBAQAogewogCWludCAgICAgICAgICAgIHJlc3VsdDsKIAlwODAyMTFwc3RyZF90ICAqcHN0ciA9IChwODAyMTFwc3RyZF90KikgZGF0YTsKLQlVSU5UOCAgICAgICAgICBieXRlYnVmW01JQl9UTVBfTUFYTEVOXTsKLQlVSU5UMTYgICAgICAgICBsZW47CisJdTggICAgICAgICAgYnl0ZWJ1ZltNSUJfVE1QX01BWExFTl07CisJdTE2ICAgICAgICAgbGVuOwogCiAJREJGRU5URVI7CiAKQEAgLTIwNjIsMTE0ICs2MjAsNiBAQAogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWliX3Bvd2VybWFuYWdlbWVudAotKgotKiBHZXQvc2V0IDgwMi4xMSBwb3dlciBtYW5hZ2VtZW50IHZhbHVlLiAgTm90ZSB0aGF0IHRoaXMgaXMgZGVmaW5lZCBkaWZmZXJlbnRseQotKiBieSA4MDIuMTEgYW5kIFByaXNtMjoKLSoKLSogICAgICAgTWVhbmluZyAgICAgODAyLjExICAgICAgIFByaXNtMgotKiAgICAgICAgYWN0aXZlICAgICAgIDEgICAgICAgICAgIGZhbHNlCi0qICAgICAgcG93ZXJzYXZlICAgICAgMiAgICAgICAgICAgdHJ1ZQotKgotKiBNSUIgcmVjb3JkIHBhcmFtZXRlcnM6Ci0qICAgICAgIHBhcm0xICAgIFByaXNtMiBSSUQgdmFsdWUuCi0qICAgICAgIHBhcm0yICAgIE5vdCB1c2VkLgotKiAgICAgICBwYXJtMyAgICBOb3QgdXNlZC4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBtaWIgICAgICBNSUIgcmVjb3JkLgotKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCi0qICAgICAgIHdsYW5kZXYgIHdsYW4gZGV2aWNlIHN0cnVjdHVyZS4KLSogICAgICAgcHJpdiAgICAgInByaXYiIHN0cnVjdHVyZS4KLSogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCi0qICAgICAgIG1zZyAgICAgIE1lc3NhZ2Ugc3RydWN0dXJlLgotKiAgICAgICBkYXRhICAgICBEYXRhIGJ1ZmZlci4KLSoKLSogUmV0dXJuczoKLSogICAgICAgMCAgIC0gU3VjY2Vzcy4KLSogICAgICAgfjAgIC0gRXJyb3IuCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludCBwcmlzbTJtaWJfcG93ZXJtYW5hZ2VtZW50KAotbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAotaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKLXdsYW5kZXZpY2VfdCAgICAgICAgICAgICAgICAgKndsYW5kZXYsCi1oZmEzODR4X3QgICAgICAgICAgICAgICAgICAgICpodywKLXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKLXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpCi17Ci0JaW50ICAgICByZXN1bHQ7Ci0JVUlOVDMyICAqdWludDMyID0gKFVJTlQzMiopIGRhdGE7Ci0JVUlOVDMyICB2YWx1ZTsKLQotCURCRkVOVEVSOwotCi0JaWYgKGlzZ2V0KSB7Ci0JCXJlc3VsdCA9IHByaXNtMm1pYl91aW50MzIobWliLCBpc2dldCwgd2xhbmRldiwgaHcsIG1zZywgJnZhbHVlKTsKLQkJKnVpbnQzMiA9ICh2YWx1ZSA9PSAwKSA/IDEgOiAyOwotCX0gZWxzZSB7Ci0JCXZhbHVlID0gKCgqdWludDMyKSA9PSAxKSA/IDAgOiAxOwotCQlyZXN1bHQgPSBwcmlzbTJtaWJfdWludDMyKG1pYiwgaXNnZXQsIHdsYW5kZXYsIGh3LCBtc2csICZ2YWx1ZSk7Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm4ocmVzdWx0KTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1pYl9wcmVhbWJsZQotKgotKiBHZXQvc2V0IFByaXNtMiBzaG9ydCBwcmVhbWJsZQotKgotKiBNSUIgcmVjb3JkIHBhcmFtZXRlcnM6Ci0qICAgICAgIHBhcm0xICAgIFByaXNtMiBSSUQgdmFsdWUuCi0qICAgICAgIHBhcm0yICAgIE5vdCB1c2VkLgotKiAgICAgICBwYXJtMyAgICBOb3QgdXNlZC4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBtaWIgICAgICBNSUIgcmVjb3JkLgotKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCi0qICAgICAgIHdsYW5kZXYgIHdsYW4gZGV2aWNlIHN0cnVjdHVyZS4KLSogICAgICAgcHJpdiAgICAgInByaXYiIHN0cnVjdHVyZS4KLSogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCi0qICAgICAgIG1zZyAgICAgIE1lc3NhZ2Ugc3RydWN0dXJlLgotKiAgICAgICBkYXRhICAgICBEYXRhIGJ1ZmZlci4KLSoKLSogUmV0dXJuczoKLSogICAgICAgMCAgIC0gU3VjY2Vzcy4KLSogICAgICAgfjAgIC0gRXJyb3IuCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludCBwcmlzbTJtaWJfcHJlYW1ibGUoCi1taWJyZWNfdCAgICAgICAgICAgICAgICAgICAgICptaWIsCi1pbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGlzZ2V0LAotd2xhbmRldmljZV90ICAgICAgICAgICAgICAgICAqd2xhbmRldiwKLWhmYTM4NHhfdCAgICAgICAgICAgICAgICAgICAgKmh3LAotcDgwMjExbXNnX2RvdDExcmVxX21pYnNldF90ICAqbXNnLAotdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSkKLXsKLQlpbnQgICAgIHJlc3VsdDsKLQlVSU5UMzIgICp1aW50MzIgPSAoVUlOVDMyKikgZGF0YTsKLQlVSU5UOCAgIGJ5dGVidWZbTUlCX1RNUF9NQVhMRU5dOwotCVVJTlQxNiAgKndvcmRidWYgPSAoVUlOVDE2KikgYnl0ZWJ1ZjsKLQotCURCRkVOVEVSOwotCi0JaWYgKGlzZ2V0KSB7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcxNihodywgbWliLT5wYXJtMSwgd29yZGJ1Zik7Ci0JCSp1aW50MzIgPSAqd29yZGJ1ZjsKLQl9IGVsc2UgewotCQkqd29yZGJ1ZiA9ICp1aW50MzI7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgbWliLT5wYXJtMSwgKndvcmRidWYpOwotCX0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuKHJlc3VsdCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBwcmlzbTJtaWJfcHJpdmFjeWludm9rZWQKICoKICogR2V0L3NldCB0aGUgZG90MTFQcml2YWN5SW52b2tlZCB2YWx1ZS4KQEAgLTIyOTYsNyArNzQ2LDcgQEAKIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpCiB7CiAJaW50ICAgICByZXN1bHQ7Ci0JVUlOVDMyICAqdWludDMyID0gKFVJTlQzMiopIGRhdGE7CisJdTMyICAqdWludDMyID0gKHUzMiopIGRhdGE7CiAKIAlEQkZFTlRFUjsKIApAQCAtMjMxNSwzNDkgKzc2NSw2IEBACiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtaWJfb3BlcmF0aW9uYWxyYXRlc2V0Ci0qCi0qIEdldC9zZXQgdGhlIG9wZXJhdGlvbmFsIHJhdGUgc2V0LgotKgotKiBNSUIgcmVjb3JkIHBhcmFtZXRlcnM6Ci0qICAgICAgIHBhcm0xICAgIFByaXNtMiBSSUQgdmFsdWUuCi0qICAgICAgIHBhcm0yICAgIE5vdCB1c2VkLgotKiAgICAgICBwYXJtMyAgICBOb3QgdXNlZC4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBtaWIgICAgICBNSUIgcmVjb3JkLgotKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCi0qICAgICAgIHdsYW5kZXYgIHdsYW4gZGV2aWNlIHN0cnVjdHVyZS4KLSogICAgICAgcHJpdiAgICAgInByaXYiIHN0cnVjdHVyZS4KLSogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCi0qICAgICAgIG1zZyAgICAgIE1lc3NhZ2Ugc3RydWN0dXJlLgotKiAgICAgICBkYXRhICAgICBEYXRhIGJ1ZmZlci4KLSoKLSogUmV0dXJuczoKLSogICAgICAgMCAgIC0gU3VjY2Vzcy4KLSogICAgICAgfjAgIC0gRXJyb3IuCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludCBwcmlzbTJtaWJfb3BlcmF0aW9uYWxyYXRlc2V0KAotbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAotaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKLXdsYW5kZXZpY2VfdCAgICAgICAgICAgICAgICAgKndsYW5kZXYsCi1oZmEzODR4X3QgICAgICAgICAgICAgICAgICAgICpodywKLXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKLXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpCi17Ci0JaW50ICAgICAgICAgICAgcmVzdWx0OwotCXA4MDIxMXBzdHJkX3QgICpwc3RyID0gKHA4MDIxMXBzdHJkX3QgKikgZGF0YTsKLQlVSU5UOCAgICAgICAgICBieXRlYnVmW01JQl9UTVBfTUFYTEVOXTsKLQlVSU5UMTYgICAgICAgICAqd29yZGJ1ZiA9IChVSU5UMTYqKSBieXRlYnVmOwotCi0JREJGRU5URVI7Ci0KLQlpZiAoaXNnZXQpIHsKLQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZzE2KGh3LCBtaWItPnBhcm0xLCB3b3JkYnVmKTsKLQkJcHJpc20ybWdtdF9nZXRfb3ByYXRlc2V0KHdvcmRidWYsIHBzdHIpOwotCX0gZWxzZSB7Ci0JCXByaXNtMm1nbXRfc2V0X29wcmF0ZXNldCh3b3JkYnVmLCBwc3RyKTsKLQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGh3LCBtaWItPnBhcm0xLCAqd29yZGJ1Zik7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgSEZBMzg0eF9SSURfQ05GU1VQUFJBVEVTLCAqd29yZGJ1Zik7Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm4ocmVzdWx0KTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1pYl9ncm91cGFkZHJlc3MKLSoKLSogR2V0L3NldCB0aGUgZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlLgotKgotKiBNSUIgcmVjb3JkIHBhcmFtZXRlcnM6Ci0qICAgICAgIHBhcm0xICAgIE5vdCB1c2VkLgotKiAgICAgICBwYXJtMiAgICBOb3QgdXNlZC4KLSogICAgICAgcGFybTMgICAgTm90IHVzZWQuCi0qCi0qIEFyZ3VtZW50czoKLSogICAgICAgbWliICAgICAgTUlCIHJlY29yZC4KLSogICAgICAgaXNnZXQgICAgTUlCR0VUL01JQlNFVCBmbGFnLgotKiAgICAgICB3bGFuZGV2ICB3bGFuIGRldmljZSBzdHJ1Y3R1cmUuCi0qICAgICAgIHByaXYgICAgICJwcml2IiBzdHJ1Y3R1cmUuCi0qICAgICAgIGh3ICAgICAgICJodyIgc3RydWN0dXJlLgotKiAgICAgICBtc2cgICAgICBNZXNzYWdlIHN0cnVjdHVyZS4KLSogICAgICAgZGF0YSAgICAgRGF0YSBidWZmZXIuCi0qCi0qIFJldHVybnM6Ci0qICAgICAgIDAgICAtIFN1Y2Nlc3MuCi0qICAgICAgIH4wICAtIEVycm9yLgotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpbnQgcHJpc20ybWliX2dyb3VwYWRkcmVzcygKLW1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKLWludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCi13bGFuZGV2aWNlX3QgICAgICAgICAgICAgICAgICp3bGFuZGV2LAotaGZhMzg0eF90ICAgICAgICAgICAgICAgICAgICAqaHcsCi1wODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCi12b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKQotewotCWludCAgICAgICAgICAgIHJlc3VsdDsKLQlwODAyMTFwc3RyZF90ICAqcHN0ciA9IChwODAyMTFwc3RyZF90ICopIGRhdGE7Ci0JVUlOVDggICAgICAgICAgYnl0ZWJ1ZltNSUJfVE1QX01BWExFTl07Ci0JVUlOVDE2ICAgICAgICAgbGVuOwotCi0JREJGRU5URVI7Ci0KLQkvKiBUT0RPOiBmaXggdGhpcy4gIGYvdyBkb2Vzbid0IHN1cHBvcnQgbWNhc3QgZmlsdGVycyAqLwotCi0JaWYgKGlzZ2V0KSB7Ci0JCXByaXNtMm1nbXRfZ2V0X2dycGFkZHIobWliLT5kaWQsIHBzdHIsIGh3KTsKLQkJcmV0dXJuKDApOwotCX0KLQotCXJlc3VsdCA9IHByaXNtMm1nbXRfc2V0X2dycGFkZHIobWliLT5kaWQsIGJ5dGVidWYsIHBzdHIsIGh3KTsKLQlpZiAocmVzdWx0ICE9IDApIHsKLQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZDsKLQkJcmV0dXJuKHJlc3VsdCk7Ci0JfQotCi0JaWYgKGh3LT5kb3QxMV9ncnBjbnQgPD0gTUFYX1BSSVNNMl9HUlBfQUREUikgewotCQlsZW4gPSBody0+ZG90MTFfZ3JwY250ICogV0xBTl9BRERSX0xFTjsKLQkJbWVtY3B5KGJ5dGVidWYsIGh3LT5kb3QxMV9ncnBfYWRkclswXSwgbGVuKTsKLQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZyhodywgSEZBMzg0eF9SSURfR1JPVVBBRERSLCBieXRlYnVmLCBsZW4pOwotCi0JCS8qCi0JCSoqIFR1cm4gb2ZmIHByb21pc2N1b3VzIG1vZGUgaWYgY291bnQgaXMgZXF1YWwgdG8gTUFYLiAgV2UgbWF5Ci0JCSoqIGhhdmUgYmVlbiBhdCBhIGhpZ2hlciBjb3VudCBpbiBwcm9taXNjdW91cyBtb2RlIGFuZCBuZWVkIHRvCi0JCSoqIHR1cm4gaXQgb2ZmLgotCQkqLwotCi0JCS8qIGJ1dCBvbmx5IGlmIHdlJ3JlIG5vdCBhbHJlYWR5IGluIHByb21pc2MgbW9kZS4gOikgKi8KLQkJaWYgKChody0+ZG90MTFfZ3JwY250ID09IE1BWF9QUklTTTJfR1JQX0FERFIpICYmCi0JCSAgICAhKCB3bGFuZGV2LT5uZXRkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpKSB7Ci0JCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsCi0JCQkJCSAgICAgSEZBMzg0eF9SSURfUFJPTUlTQ01PREUsIDApOwotCQl9Ci0JfSBlbHNlIHsKLQotCQkvKgotCQkqKiBDbGVhciBncm91cCBhZGRyZXNzZXMgaW4gY2FyZCBhbmQgc2V0IHRvIHByb21pc2N1b3VzIG1vZGUuCi0JCSovCi0KLQkJbWVtc2V0KGJ5dGVidWYsIDAsIHNpemVvZihieXRlYnVmKSk7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoaHcsIEhGQTM4NHhfUklEX0dST1VQQUREUiwKLQkJCQkJCWJ5dGVidWYsIDApOwotCQlpZiAocmVzdWx0ID09IDApIHsKLQkJCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywKLQkJCQkJSEZBMzg0eF9SSURfUFJPTUlTQ01PREUsIDEpOwotCQl9Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm4ocmVzdWx0KTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1pYl9md2lkCi0qCi0qIEdldCB0aGUgZmlybXdhcmUgSUQuCi0qCi0qIE1JQiByZWNvcmQgcGFyYW1ldGVyczoKLSogICAgICAgcGFybTEgICAgTm90IHVzZWQuCi0qICAgICAgIHBhcm0yICAgIE5vdCB1c2VkLgotKiAgICAgICBwYXJtMyAgICBOb3QgdXNlZC4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBtaWIgICAgICBNSUIgcmVjb3JkLgotKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCi0qICAgICAgIHdsYW5kZXYgIHdsYW4gZGV2aWNlIHN0cnVjdHVyZS4KLSogICAgICAgcHJpdiAgICAgInByaXYiIHN0cnVjdHVyZS4KLSogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCi0qICAgICAgIG1zZyAgICAgIE1lc3NhZ2Ugc3RydWN0dXJlLgotKiAgICAgICBkYXRhICAgICBEYXRhIGJ1ZmZlci4KLSoKLSogUmV0dXJuczoKLSogICAgICAgMCAgIC0gU3VjY2Vzcy4KLSogICAgICAgfjAgIC0gRXJyb3IuCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludCBwcmlzbTJtaWJfZndpZCgKLW1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKLWludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCi13bGFuZGV2aWNlX3QgICAgICAgICAgICAgICAgICp3bGFuZGV2LAotaGZhMzg0eF90ICAgICAgICAgICAgICAgICAgICAqaHcsCi1wODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCi12b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKQotewotCWludCAgICAgICAgICAgICByZXN1bHQ7Ci0JcDgwMjExcHN0cmRfdCAgICpwc3RyID0gKHA4MDIxMXBzdHJkX3QgKikgZGF0YTsKLQloZmEzODR4X0ZXSURfdCAgZndpZDsKLQotCURCRkVOVEVSOwotCi0JaWYgKGlzZ2V0KSB7Ci0JCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaHcsIEhGQTM4NHhfUklEX0ZXSUQsCi0JCQkJCQkmZndpZCwgSEZBMzg0eF9SSURfRldJRF9MRU4pOwotCQlpZiAobWliLT5kaWQgPT0gRElEbWliX3AyX3AyTklDX3AyUHJpbWFyeUZXSUQpIHsKLQkJCWZ3aWQucHJpbWFyeVtIRkEzODR4X0ZXSURfTEVOIC0gMV0gPSAnXDAnOwotCQkJcHN0ci0+bGVuID0gc3RybGVuKGZ3aWQucHJpbWFyeSk7Ci0JCQltZW1jcHkocHN0ci0+ZGF0YSwgZndpZC5wcmltYXJ5LCBwc3RyLT5sZW4pOwotCQl9IGVsc2UgewotCQkJZndpZC5zZWNvbmRhcnlbSEZBMzg0eF9GV0lEX0xFTiAtIDFdID0gJ1wwJzsKLQkJCXBzdHItPmxlbiA9IHN0cmxlbihmd2lkLnNlY29uZGFyeSk7Ci0JCQltZW1jcHkocHN0ci0+ZGF0YSwgZndpZC5zZWNvbmRhcnksIHBzdHItPmxlbik7Ci0JCX0KLQl9IGVsc2UKLQkJcmVzdWx0ID0gMDsgICAgIC8qIFNob3VsZCBuZXZlciBoYXBwZW4uICovCi0KLQlEQkZFWElUOwotCXJldHVybihyZXN1bHQpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWliX2F1dGhhbGcKLSoKLSogR2V0IHZhbHVlcyBmcm9tIHRoZSBBdWh0ZW50aWNhdGlvbkFsZ29yaXRobXNUYWJsZS4KLSoKLSogTUlCIHJlY29yZCBwYXJhbWV0ZXJzOgotKiAgICAgICBwYXJtMSAgICBUYWJsZSBpbmRleCAoMS02KS4KLSogICAgICAgcGFybTIgICAgTm90IHVzZWQuCi0qICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCi0qICAgICAgIGlzZ2V0ICAgIE1JQkdFVC9NSUJTRVQgZmxhZy4KLSogICAgICAgd2xhbmRldiAgd2xhbiBkZXZpY2Ugc3RydWN0dXJlLgotKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgotKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KLSogICAgICAgbXNnICAgICAgTWVzc2FnZSBzdHJ1Y3R1cmUuCi0qICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgotKgotKiBSZXR1cm5zOgotKiAgICAgICAwICAgLSBTdWNjZXNzLgotKiAgICAgICB+MCAgLSBFcnJvci4KLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50IHByaXNtMm1pYl9hdXRoYWxnKAotbWlicmVjX3QgICAgICAgICAgICAgICAgICAgICAqbWliLAotaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBpc2dldCwKLXdsYW5kZXZpY2VfdCAgICAgICAgICAgICAgICAgKndsYW5kZXYsCi1oZmEzODR4X3QgICAgICAgICAgICAgICAgICAgICpodywKLXA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKLXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpCi17Ci0JVUlOVDMyICAqdWludDMyID0gKFVJTlQzMiopIGRhdGE7Ci0KLQlEQkZFTlRFUjsKLQotCS8qIE1TTTogcGt4IHN1cHBsaWVkIGNvZGUgdGhhdCAgY29kZSBxdWVyaWVzIFJJRCBGRDRELi4uLmJ1dCB0aGUgZi93J3MKLSAgICAgICAgICogIHJlc3VsdHMgYXJlIGJvZ3VzLiBUaGVyZWZvcmUsIHdlIGhhdmUgdG8gc2ltdWxhdGUgdGhlIGFwcHJvcHJpYXRlCi0gICAgICAgICAqICByZXN1bHRzIGhlcmUgaW4gdGhlIGRyaXZlciBiYXNlZCBvbiBvdXIga25vd2xlZGdlIG9mIGV4aXN0aW5nIE1BQwotICAgICAgICAgKiAgZmVhdHVyZXMuICBUaGF0J3MgdGhlIHdob2xlIHBvaW50IGJlaGluZCB0aGlzIHVnbHkgZnVuY3Rpb24uCi0gICAgICAgICAqLwotCi0JaWYgKGlzZ2V0KSB7Ci0JCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX3N1Y2Nlc3M7Ci0JCXN3aXRjaCAobWliLT5wYXJtMSkgewotCQkJY2FzZSAxOiAvKiBPcGVuIFN5c3RlbSAqLwotCQkJCSp1aW50MzIgPSBQODAyMTFFTlVNX2F1dGhhbGdfb3BlbnN5c3RlbTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMjogLyogU2hhcmVkS2V5ICovCi0JCQkJKnVpbnQzMiA9IFA4MDIxMUVOVU1fYXV0aGFsZ19zaGFyZWRrZXk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCSp1aW50MzIgPSAwOwotCQkJCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX25vdF9zdXBwb3J0ZWQ7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybigwKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1pYl9hdXRoYWxnZW5hYmxlCi0qCi0qIEdldC9zZXQgdGhlIGVuYWJsZSB2YWx1ZXMgZnJvbSB0aGUgQXVodGVudGljYXRpb25BbGdvcml0aG1zVGFibGUuCi0qCi0qIE1JQiByZWNvcmQgcGFyYW1ldGVyczoKLSogICAgICAgcGFybTEgICAgVGFibGUgaW5kZXggKDEtNikuCi0qICAgICAgIHBhcm0yICAgIE5vdCB1c2VkLgotKiAgICAgICBwYXJtMyAgICBOb3QgdXNlZC4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBtaWIgICAgICBNSUIgcmVjb3JkLgotKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCi0qICAgICAgIHdsYW5kZXYgIHdsYW4gZGV2aWNlIHN0cnVjdHVyZS4KLSogICAgICAgcHJpdiAgICAgInByaXYiIHN0cnVjdHVyZS4KLSogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCi0qICAgICAgIG1zZyAgICAgIE1lc3NhZ2Ugc3RydWN0dXJlLgotKiAgICAgICBkYXRhICAgICBEYXRhIGJ1ZmZlci4KLSoKLSogUmV0dXJuczoKLSogICAgICAgMCAgIC0gU3VjY2Vzcy4KLSogICAgICAgfjAgIC0gRXJyb3IuCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludCBwcmlzbTJtaWJfYXV0aGFsZ2VuYWJsZSgKLW1pYnJlY190ICAgICAgICAgICAgICAgICAgICAgKm1pYiwKLWludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXNnZXQsCi13bGFuZGV2aWNlX3QgICAgICAgICAgICAgICAgICp3bGFuZGV2LAotaGZhMzg0eF90ICAgICAgICAgICAgICAgICAgICAqaHcsCi1wODAyMTFtc2dfZG90MTFyZXFfbWlic2V0X3QgICptc2csCi12b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhKQotewotCWludCAgICAgcmVzdWx0OwotCVVJTlQzMiAgKnVpbnQzMiA9IChVSU5UMzIqKSBkYXRhOwotCi0JaW50ICAgICBpbmRleDsKLQlVSU5UMTYgIGNuZl9hdXRoOwotCVVJTlQxNgltYXNrOwotCi0JREJGRU5URVI7Ci0KLQlpbmRleCA9IG1pYi0+cGFybTEgLSAxOwotCi0JcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZzE2KCBodywKLQkJCUhGQTM4NHhfUklEX0NORkFVVEhFTlRJQ0FUSU9OLCAmY25mX2F1dGgpOwotCVdMQU5fTE9HX0RFQlVHKDIsImNuZkF1dGhlbnRpY2F0aW9uMD0lZCwgaW5kZXg9JWRcbiIsIGNuZl9hdXRoLCBpbmRleCk7Ci0KLQlpZiAoaXNnZXQpIHsKLQkJaWYgKCBpbmRleCA9PSAwIHx8IGluZGV4ID09IDEgKSB7Ci0JCQkqdWludDMyID0gKGNuZl9hdXRoICYgKDE8PGluZGV4KSkgPwotCQkJCVA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZTogUDgwMjExRU5VTV90cnV0aF9mYWxzZTsKLQkJfSBlbHNlIHsKLQkJCSp1aW50MzIgPSBQODAyMTFFTlVNX3RydXRoX2ZhbHNlOwotCQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfbm90X3N1cHBvcnRlZDsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmICggaW5kZXggPT0gMCB8fCBpbmRleCA9PSAxICkgewotCQkJbWFzayA9IDEgPDwgaW5kZXg7Ci0JCQlpZiAoKnVpbnQzMj09UDgwMjExRU5VTV90cnV0aF90cnVlICkgewotCQkJCWNuZl9hdXRoIHw9IG1hc2s7Ci0JCQl9IGVsc2UgewotCQkJCWNuZl9hdXRoICY9IH5tYXNrOwotCQkJfQotCQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KCBodywKLQkJCQkJSEZBMzg0eF9SSURfQ05GQVVUSEVOVElDQVRJT04sIGNuZl9hdXRoKTsKLQkJCVdMQU5fTE9HX0RFQlVHKDIsImNuZkF1dGhlbnRpY2F0aW9uOj0lZFxuIiwgY25mX2F1dGgpOwotCQkJaWYgKCByZXN1bHQgKSB7Ci0JCQkJV0xBTl9MT0dfREVCVUcoMSwiVW5hYmxlIHRvIHNldCBwMmNuZkF1dGhlbnRpY2F0aW9uIHRvICVkXG4iLCBjbmZfYXV0aCk7Ci0JCQkJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfaW1wbGVtZW50YXRpb25fZmFpbHVyZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX25vdF9zdXBwb3J0ZWQ7Ci0JCX0KLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybihyZXN1bHQpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogcHJpc20ybWliX3ByaXYKICoKICogR2V0L3NldCB2YWx1ZXMgaW4gdGhlICJwcml2IiBkYXRhIHN0cnVjdHVyZS4KQEAgLTI2OTAsMjE4ICs3OTcsMTggQEAKIHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXRfdCAgKm1zZywKIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGEpCiB7Ci0JVUlOVDMyICAgICAgICAgICAgKnVpbnQzMiA9IChVSU5UMzIqKSBkYXRhOwogCXA4MDIxMXBzdHJkX3QgICAgICpwc3RyID0gKHA4MDIxMXBzdHJkX3QqKSBkYXRhOwotCXA4MDIxMW1hY2FycmF5X3QgICptYWNhcnJheSA9IChwODAyMTFtYWNhcnJheV90ICopIGRhdGE7CiAKLQlpbnQgIGksIGNudCwgcmVzdWx0LCBkb25lOwotCi0JcHJpc20yc3RhX2F1dGhsaXN0X3QgIG9sZDsKLQotCS8qCi0JKiogInRlc3QiIGlzIGEgbG90IGxvbmdlciB0aGFuIG5lY2Vzc2FyeSBidXQgd2hvIGNhcmVzPyAgLi4uYXMgbG9uZyBhcwotCSoqIGl0IGlzIGxvbmcgZW5vdWdoIQotCSovCi0KLQlVSU5UOCAgdGVzdFtzaXplb2Yod2xhbmRldi0+cngpICsgc2l6ZW9mKGh3LT50YWxsaWVzKV07CisJaW50ICByZXN1bHQ7CiAKIAlEQkZFTlRFUjsKIAogCXN3aXRjaCAobWliLT5kaWQpIHsKLQljYXNlIERJRG1pYl9wMl9wMlRhYmxlX3AyUmVjZWl2ZWRGcmFtZVN0YXRpc3RpY3M6Ci0KLQkJLyoKLQkJKiogTm90ZTogVGhlIHZhbHVlcyBpbiB0aGlzIHJlY29yZCBhcmUgY2hhbmdlZCBieSB0aGUKLQkJKiogaW50ZXJydXB0IGhhbmRsZXIgYW5kIHRoZXJlZm9yZSBjYW5ub3QgYmUgZ3VhcmFudGVlZAotCQkqKiB0byBiZSBzdGFibGUgd2hpbGUgdGhleSBhcmUgYmVpbmcgY29waWVkLiAgSG93ZXZlciwKLQkJKiogdGhlIGludGVycnVwdCBoYW5kbGVyIHdpbGwgdGFrZSBwcmlvcml0eSBvdmVyIHRoaXMKLQkJKiogY29kZS4gIEhlbmNlLCBpZiB0aGUgc2FtZSB2YWx1ZXMgYXJlIGNvcGllZCB0d2ljZSwKLQkJKiogdGhlbiB3ZSBhcmUgZW5zdXJlZCB0aGF0IHRoZSB2YWx1ZXMgaGF2ZSBub3QgYmVlbgotCQkqKiBjaGFuZ2VkLiAgSWYgdGhleSBoYXZlLCB0aGVuIGp1c3QgdHJ5IGFnYWluLiAgRG9uJ3QKLQkJKiogdHJ5IG1vcmUgdGhhbiAxMCB0aW1lcy4uLmlmIHdlIHN0aWxsIGhhdmVuJ3QgZ290IGl0LAotCQkqKiB0aGVuIHRoZSB2YWx1ZXMgd2UgZG8gaGF2ZSBhcmUgcHJvYmFibHkgZ29vZCBlbm91Z2guCi0JCSoqIFRoaXMgc2NoZW1lIGZvciBjb3B5aW5nIHZhbHVlcyBpcyB1c2VkIGluIG9yZGVyIHRvCi0JCSoqIHByZXZlbnQgaGF2aW5nIHRvIGJsb2NrIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB3aGlsZQotCQkqKiB3ZSBjb3B5IHRoZSB2YWx1ZXMuCi0JCSovCi0KLQkJaWYgKGlzZ2V0KQotCQkJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJCQltZW1jcHkoZGF0YSwgJndsYW5kZXYtPnJ4LCBzaXplb2Yod2xhbmRldi0+cngpKTsKLQkJCQltZW1jcHkodGVzdCwgJndsYW5kZXYtPnJ4LCBzaXplb2Yod2xhbmRldi0+cngpKTsKLQkJCQlpZiAobWVtY21wKGRhdGEsIHRlc3QsIHNpemVvZih3bGFuZGV2LT5yeCkpID09IDApIGJyZWFrOwotCQkJfQotCi0JCWJyZWFrOwotCi0JY2FzZSBESURtaWJfcDJfcDJUYWJsZV9wMkNvbW11bmljYXRpb25UYWxsaWVzOgotCi0JCS8qCi0JCSoqIE5vdGU6IFRoZSB2YWx1ZXMgaW4gdGhpcyByZWNvcmQgYXJlIGNoYW5nZWQgYnkgdGhlCi0JCSoqIGludGVycnVwdCBoYW5kbGVyIGFuZCB0aGVyZWZvcmUgY2Fubm90IGJlIGd1YXJhbnRlZWQKLQkJKiogdG8gYmUgc3RhYmxlIHdoaWxlIHRoZXkgYXJlIGJlaW5nIGNvcGllZC4gIFNlZSB0aGUKLQkJKiogbm90ZSBhYm92ZSBhYm91dCBjb3B5aW5nIHZhbHVlcy4KLQkJKi8KLQotCQlpZiAoaXNnZXQpIHsKLQkJCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9jb21tdGFsbGllcyhodyk7Ci0KLQkJCS8qID8/Pz8/PyBXZSBuZWVkIHRvIHdhaXQgYSBiaXQgaGVyZSBmb3IgdGhlICovCi0JCQkvKiAgIHRhbGxpZXMgdG8gZ2V0IHVwZGF0ZWQuID8/Pz8/PyAqLwotCQkJLyogTVNNOiBUT0RPOiBUaGUgcmlnaHQgd2F5IHRvIGRvIHRoaXMgaXMgdG8KLQkJCSAqICAgICAgYWRkIGEgImNvbW10YWxsaWUiIHdhaXQgcXVldWUgdG8gdGhlCi0JCQkgKiAgICAgIHByaXYgc3RydWN0dXJlIHRoYXQgZ2V0cyBydW4gZXZlcnkgdGltZQotCQkJICogICAgICB3ZSByZWNlaXZlIGEgY29tbXRhbGx5IGluZm8gZnJhbWUuCi0JCQkgKiAgICAgIFRoaXMgcHJvY2VzcyB3b3VsZCBzbGVlcCBvbiB0aGF0Ci0JCQkgKiAgICAgIHF1ZXVlIGFuZCBnZXQgYXdha2VuZWQgd2hlbiB0aGUKLQkJCSAqICAgICAgdGhlIHJlcXVlc3RlZCBpbmZvIGZyYW1lIGFycml2ZXMuCi0JCQkgKiAgICAgIERvbid0IGhhdmUgdGltZSB0byBkbyBhbmQgdGVzdCB0aGlzCi0JCQkgKiAgICAgIHJpZ2h0IG5vdy4KLQkJCSAqLwotCi0JCQkvKiBVZ2gsIHRoaXMgaXMgbmFzdHkuICovCi0JCQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQkJCW1lbWNweShkYXRhLAotCQkJCSAgICAgICAmaHctPnRhbGxpZXMsCi0JCQkJICAgICAgIHNpemVvZihody0+dGFsbGllcykpOwotCQkJCW1lbWNweSh0ZXN0LAotCQkJCSAgICAgICAmaHctPnRhbGxpZXMsCi0JCQkJICAgICAgIHNpemVvZihody0+dGFsbGllcykpOwotCQkJCWlmICggbWVtY21wKGRhdGEsCi0JCQkJCSAgICB0ZXN0LAotCQkJCQkgICAgc2l6ZW9mKGh3LT50YWxsaWVzKSkgPT0gMCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlicmVhazsKLQotCWNhc2UgRElEbWliX3AyX3AyVGFibGVfcDJBdXRoZW50aWNhdGVkOgotCi0JCWlmIChpc2dldCkgewotCQkJcHJpc20ybWliX3ByaXZfYXV0aGxpc3QoaHcsICZvbGQpOwotCi0JCQltYWNhcnJheS0+Y250ID0gMDsKLQkJCWZvciAoaSA9IDA7IGkgPCBvbGQuY250OyBpKyspIHsKLQkJCQlpZiAoIW9sZC5hc3NvY1tpXSkgewotCQkJCQltZW1jcHkobWFjYXJyYXktPmRhdGFbbWFjYXJyYXktPmNudF0sIG9sZC5hZGRyW2ldLCBXTEFOX0FERFJfTEVOKTsKLQkJCQkJbWFjYXJyYXktPmNudCsrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWJyZWFrOwotCi0JY2FzZSBESURtaWJfcDJfcDJUYWJsZV9wMkFzc29jaWF0ZWQ6Ci0KLQkJaWYgKGlzZ2V0KSB7Ci0JCQlwcmlzbTJtaWJfcHJpdl9hdXRobGlzdChodywgJm9sZCk7Ci0KLQkJCW1hY2FycmF5LT5jbnQgPSAwOwotCQkJZm9yIChpID0gMDsgaSA8IG9sZC5jbnQ7IGkrKykgewotCQkJCWlmIChvbGQuYXNzb2NbaV0pIHsKLQkJCQkJbWVtY3B5KG1hY2FycmF5LT5kYXRhW21hY2FycmF5LT5jbnRdLCBvbGQuYWRkcltpXSwgV0xBTl9BRERSX0xFTik7Ci0JCQkJCW1hY2FycmF5LT5jbnQrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlicmVhazsKLQotCWNhc2UgRElEbWliX3AyX3AyVGFibGVfcDJQb3dlclNhdmVVc2VyQ291bnQ6Ci0KLQkJaWYgKGlzZ2V0KQotCQkJKnVpbnQzMiA9IGh3LT5wc3VzZXJjb3VudDsKLQotCQlicmVhazsKLQotCWNhc2UgRElEbWliX3AyX3AyVGFibGVfcDJDb21tZW50OgotCi0JCWlmIChpc2dldCkgewotCQkJcHN0ci0+bGVuID0gc3RybGVuKGh3LT5jb21tZW50KTsKLQkJCW1lbWNweShwc3RyLT5kYXRhLCBody0+Y29tbWVudCwgcHN0ci0+bGVuKTsKLQkJfSBlbHNlIHsKLQkJCWNudCA9IHBzdHItPmxlbjsKLQkJCWlmIChjbnQgPCAwKSBjbnQgPSAwOwotCQkJaWYgKGNudCA+PSBzaXplb2YoaHctPmNvbW1lbnQpKQotCQkJCWNudCA9IHNpemVvZihody0+Y29tbWVudCktMTsKLQkJCW1lbWNweShody0+Y29tbWVudCwgcHN0ci0+ZGF0YSwgY250KTsKLQkJCXBzdHItPmRhdGFbY250XSA9ICdcMCc7Ci0JCX0KLQotCQlicmVhazsKLQotCWNhc2UgRElEbWliX3AyX3AyVGFibGVfcDJBY2Nlc3NNb2RlOgotCi0JCWlmIChpc2dldCkKLQkJCSp1aW50MzIgPSBody0+YWNjZXNzbW9kZTsKLQkJZWxzZQotCQkJcHJpc20ybWliX3ByaXZfYWNjZXNzbW9kZShodywgKnVpbnQzMik7Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIERJRG1pYl9wMl9wMlRhYmxlX3AyQWNjZXNzQWxsb3c6Ci0KLQkJaWYgKGlzZ2V0KSB7Ci0JCQltYWNhcnJheS0+Y250ID0gaHctPmFsbG93LmNudDsKLQkJCW1lbWNweShtYWNhcnJheS0+ZGF0YSwgaHctPmFsbG93LmFkZHIsCi0JCQkgICAgICAgbWFjYXJyYXktPmNudCpXTEFOX0FERFJfTEVOKTsKLQkJfSBlbHNlIHsKLQkJCXByaXNtMm1pYl9wcml2X2FjY2Vzc2FsbG93KGh3LCBtYWNhcnJheSk7Ci0JCX0KLQotCQlicmVhazsKLQotCWNhc2UgRElEbWliX3AyX3AyVGFibGVfcDJBY2Nlc3NEZW55OgotCi0JCWlmIChpc2dldCkgewotCQkJbWFjYXJyYXktPmNudCA9IGh3LT5kZW55LmNudDsKLQkJCW1lbWNweShtYWNhcnJheS0+ZGF0YSwgaHctPmRlbnkuYWRkciwKLQkJCSAgICAgICBtYWNhcnJheS0+Y250KldMQU5fQUREUl9MRU4pOwotCQl9IGVsc2UgewotCQkJcHJpc20ybWliX3ByaXZfYWNjZXNzZGVueShodywgbWFjYXJyYXkpOwotCQl9Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIERJRG1pYl9wMl9wMlRhYmxlX3AyQ2hhbm5lbEluZm9SZXN1bHRzOgotCi0JCWlmIChpc2dldCkgewotCQkJZG9uZSA9IGF0b21pY19yZWFkKCZody0+Y2hhbm5lbF9pbmZvLmRvbmUpOwotCQkJaWYgKGRvbmUgPT0gMCkgewotCQkJCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX25vX3ZhbHVlOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGRvbmUgPT0gMSkgewotCQkJCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2luY29tcGxldGVfaXRlbWRhdGE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWZvciAoaSA9IDA7IGkgPCAxNDsgaSsrLCB1aW50MzIgKz0gNSkgewotCQkJCXVpbnQzMlswXSA9IGkrMTsKLQkJCQl1aW50MzJbMV0gPSBody0+Y2hhbm5lbF9pbmZvLnJlc3VsdHMucmVzdWx0W2ldLmFubDsKLQkJCQl1aW50MzJbMl0gPSBody0+Y2hhbm5lbF9pbmZvLnJlc3VsdHMucmVzdWx0W2ldLnBubDsKLQkJCQl1aW50MzJbM10gPSAoaHctPmNoYW5uZWxfaW5mby5yZXN1bHRzLnJlc3VsdFtpXS5hY3RpdmUgJiBIRkEzODR4X0NISU5GT1JFU1VMVF9CU1NBQ1RJVkUpID8gMSA6IDA7Ci0JCQkJdWludDMyWzRdID0gKGh3LT5jaGFubmVsX2luZm8ucmVzdWx0cy5yZXN1bHRbaV0uYWN0aXZlICYgSEZBMzg0eF9DSElORk9SRVNVTFRfUENGQUNUSVZFKSA/IDEgOiAwOwotCQkJfQotCQl9Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIERJRG1pYl9kb3QxMXNtdF9kb3QxMVN0YXRpb25Db25maWdUYWJsZV9kb3QxMURlc2lyZWRCU1NUeXBlOgotCi0JCWlmIChpc2dldCkKLQkJCSp1aW50MzIgPSBody0+ZG90MTFfZGVzaXJlZF9ic3NfdHlwZTsKLQkJZWxzZQotCQkJaHctPmRvdDExX2Rlc2lyZWRfYnNzX3R5cGUgPSAqdWludDMyOwotCi0JCWJyZWFrOwotCiAJY2FzZSBESURtaWJfbG54X2xueENvbmZpZ1RhYmxlX2xueFJTTkFJRTogewogCQloZmEzODR4X1dQQURhdGFfdCB3cGE7CiAJCWlmIChpc2dldCkgewogCQkJaGZhMzg0eF9kcnZyX2dldGNvbmZpZyggaHcsIEhGQTM4NHhfUklEX0NORldQQURBVEEsCi0JCQkJCQkoVUlOVDggKikgJndwYSwgc2l6ZW9mKHdwYSkpOworCQkJCQkJKHU4ICopICZ3cGEsIHNpemVvZih3cGEpKTsKIAkJCXBzdHItPmxlbiA9IGhmYTM4NHgyaG9zdF8xNih3cGEuZGF0YWxlbik7CiAJCQltZW1jcHkocHN0ci0+ZGF0YSwgd3BhLmRhdGEsIHBzdHItPmxlbik7CiAJCX0gZWxzZSB7CkBAIC0yOTA5LDcgKzgxNiw3IEBACiAJCQltZW1jcHkod3BhLmRhdGEsIHBzdHItPmRhdGEsIHBzdHItPmxlbik7CiAKIAkJCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoaHcsIEhGQTM4NHhfUklEX0NORldQQURBVEEsCi0JCQkJKFVJTlQ4ICopICZ3cGEsIHNpemVvZih3cGEpKTsKKwkJCQkodTggKikgJndwYSwgc2l6ZW9mKHdwYSkpOwogCQl9CiAJCWJyZWFrOwogCX0KQEAgLTI5MjIsMzQ1ICs4MjksNiBAQAogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWliX3ByaXZfYXV0aGxpc3QKLSoKLSogR2V0IGEgY29weSBvZiB0aGUgbGlzdCBvZiBhdXRoZW50aWNhdGVkIHN0YXRpb25zLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIHByaXYgICAgICJwcml2IiBzdHJ1Y3R1cmUuCi0qICAgICAgIGxpc3QgICAgIExpc3Qgb2YgYXV0aGVudGljYXRlZCBzdGF0aW9ucy4KLSoKLSogUmV0dXJuczoKLSoJTm90aGluZwotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB2b2lkIHByaXNtMm1pYl9wcml2X2F1dGhsaXN0KAotaGZhMzg0eF90ICAgICAgICAgICAgICpodywKLXByaXNtMnN0YV9hdXRobGlzdF90ICAqbGlzdCkKLXsKLQlwcmlzbTJzdGFfYXV0aGxpc3RfdCAgdGVzdDsKLQlpbnQgICAgICAgICAgICAgICAgICAgaTsKLQotCURCRkVOVEVSOwotCi0JLyoKLQkqKiBOb3RlOiBUaGUgdmFsdWVzIGluIHRoaXMgcmVjb3JkIGFyZSBjaGFuZ2VkIGJ5IHRoZSBpbnRlcnJ1cHQKLQkqKiBoYW5kbGVyIGFuZCB0aGVyZWZvcmUgY2Fubm90IGJlIGd1YXJhbnRlZWQgdG8gYmUgc3RhYmxlIHdoaWxlCi0JKiogdGhleSBhcmUgYmVpbmcgY29waWVkLiAgSG93ZXZlciwgdGhlIGludGVycnVwdCBoYW5kbGVyIHdpbGwKLQkqKiB0YWtlIHByaW9yaXR5IG92ZXIgdGhpcyBjb2RlLiAgSGVuY2UsIGlmIHRoZSBzYW1lIHZhbHVlcyBhcmUKLQkqKiBjb3BpZWQgdHdpY2UsIHRoZW4gd2UgYXJlIGVuc3VyZWQgdGhhdCB0aGUgdmFsdWVzIGhhdmUgbm90Ci0JKiogYmVlbiBjaGFuZ2VkLiAgSWYgdGhleSBoYXZlLCB0aGVuIGp1c3QgdHJ5IGFnYWluLiAgRG9uJ3QgdHJ5Ci0JKiogbW9yZSB0aGFuIDEwIHRpbWVzLi4udGhlIGxpc3Qgb2YgYXV0aGVudGljYXRlZCBzdGF0aW9ucyBpcwotCSoqIHVubGlrZWx5IHRvIGJlIGNoYW5naW5nIGZyZXF1ZW50bHkgZW5vdWdoIHRoYXQgd2UgY2FuJ3QgZ2V0Ci0JKiogYSBzbmFwc2hvdCBpbiAxMCB0cmllcy4gIERvbid0IHRyeSBtb3JlIHRoYW4gdGhpcyBzbyB0aGF0IHdlCi0JKiogZG9uJ3QgcmlzayBsb2NraW5nLXVwIGZvciBsb25nIHBlcmlvZHMgb2YgdGltZS4gIElmIHdlIHN0aWxsCi0JKiogaGF2ZW4ndCBnb3QgdGhlIHNuYXBzaG90LCB0aGVuIGdlbmVyYXRlIGFuIGVycm9yIG1lc3NhZ2UgYW5kCi0JKiogcmV0dXJuIGFuIGVtcHR5IGxpc3QgKHNpbmNlIHRoaXMgaXMgdGhlIG9ubHkgdmFsaWQgbGlzdCB0aGF0Ci0JKiogd2UgY2FuIGd1YXJlbnRlZSkuICBUaGlzIHNjaGVtZSBmb3IgY29weWluZyB2YWx1ZXMgaXMgdXNlZCBpbgotCSoqIG9yZGVyIHRvIHByZXZlbnQgaGF2aW5nIHRvIGJsb2NrIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB3aGlsZQotCSoqIHdlIGNvcHkgdGhlIHZhbHVlcy4KLQkqLwotCi0JZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJbWVtY3B5KGxpc3QsICZody0+YXV0aGxpc3QsIHNpemVvZihwcmlzbTJzdGFfYXV0aGxpc3RfdCkpOwotCQltZW1jcHkoJnRlc3QsICZody0+YXV0aGxpc3QsIHNpemVvZihwcmlzbTJzdGFfYXV0aGxpc3RfdCkpOwotCQlpZiAobWVtY21wKGxpc3QsICZ0ZXN0LCBzaXplb2YocHJpc20yc3RhX2F1dGhsaXN0X3QpKSA9PSAwKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGkgPj0gMTApIHsKLQkJbGlzdC0+Y250ID0gMDsKLQkJV0xBTl9MT0dfRVJST1IoIkNvdWxkIG5vdCBvYnRhaW4gc25hcHNob3Qgb2YgYXV0aGVudGljYXRlZCBzdGF0aW9ucy5cbiIpOwotCQl9Ci0KLQlEQkZFWElUOwotCXJldHVybjsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1pYl9wcml2X2FjY2Vzc21vZGUKLSoKLSogU2V0IHRoZSBBY2Nlc3MgTW9kZS4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgotKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KLSogICAgICAgbW9kZSAgICAgTmV3IGFjY2VzcyBtb2RlLgotKgotKiBSZXR1cm5zOgotKglOb3RoaW5nCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHZvaWQgcHJpc20ybWliX3ByaXZfYWNjZXNzbW9kZSgKLWhmYTM4NHhfdCAgICAgICAgICpodywKLVVJTlQzMiAgICAgICAgICAgIG1vZGUpCi17Ci0JcHJpc20yc3RhX2F1dGhsaXN0X3QgIG9sZDsKLQlpbnQgICAgICAgICAgICAgICAgICAgaSwgaiwgZGVhdXRoOwotCVVJTlQ4ICAgICAgICAgICAgICAgICAqYWRkcjsKLQotCURCRkVOVEVSOwotCi0JLyoKLQkqKiBJZiB0aGUgbW9kZSBpcyBub3QgY2hhbmdpbmcgb3IgaXQgaXMgY2hhbmdpbmcgdG8gIkFsbCIsIHRoZW4gaXQncwotCSoqIG9rYXkgdG8gZ28gYWhlYWQgd2l0aG91dCBhIGxvdCBvZiBtZXNzaW5nIGFyb3VuZC4gIE90aGVyd2lzZSwgdGhlCi0JKiogYWNjZXNzIG1vZGUgaXMgY2hhbmdpbmcgaW4gYSB3YXkgdGhhdCBtYXkgbGVhdmUgc29tZSBzdGF0aW9ucwotCSoqIGF1dGhlbnRpY2F0ZWQgd2hpY2ggc2hvdWxkIG5vdCBiZSBhdXRoZW50aWNhdGVkLiAgSXQgd2lsbCBiZQotCSoqIG5lY2Vzc2FyeSB0byBkZS1hdXRoZW50aWNhdGUgdGhlc2Ugc3RhdGlvbnMuCi0JKi8KLQotCWlmIChtb2RlID09IFdMQU5fQUNDRVNTX0FMTCB8fCBtb2RlID09IGh3LT5hY2Nlc3Ntb2RlKSB7Ci0JCWh3LT5hY2Nlc3Ntb2RlID0gbW9kZTsKLQkJcmV0dXJuOwotCX0KLQotCS8qCi0JKiogU3dpdGNoIHRvIHRoZSBuZXcgYWNjZXNzIG1vZGUuICBPbmNlIHRoaXMgaXMgZG9uZSwgdGhlbiB0aGUgaW50ZXJydXB0Ci0JKiogaGFuZGxlciAod2hpY2ggdXNlcyB0aGlzIHZhbHVlKSB3aWxsIGJlIHByZXZlbnRlZCBmcm9tIGF1dGhlbnRpY2F0aW5nCi0JKiogQURESVRJT05BTCBzdGF0aW9ucyB3aGljaCBzaG91bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQuICBUaGVuIGdldCBhCi0JKiogY29weSBvZiB0aGUgY3VycmVudCBsaXN0IG9mIGF1dGhlbnRpY2F0ZWQgc3RhdGlvbnMuCi0JKi8KLQotCWh3LT5hY2Nlc3Ntb2RlID0gbW9kZTsKLQotCXByaXNtMm1pYl9wcml2X2F1dGhsaXN0KGh3LCAmb2xkKTsKLQotCS8qCi0JKiogTm93IGdvIHRocm91Z2ggdGhlIGxpc3Qgb2YgcHJldmlvdXNseSBhdXRoZW50aWNhdGVkIHN0YXRpb25zIChzb21lCi0JKiogb2Ygd2hpY2ggbWlnaHQgZGUtYXV0aGVudGljYXRlIHRoZW1zZWx2ZXMgd2hpbGUgd2UgYXJlIHByb2Nlc3NpbmcgaXQKLQkqKiBidXQgdGhhdCBpcyBva2F5KS4gIEFueSBzdGF0aW9uIHdoaWNoIG5vIGxvbmdlciBtYXRjaGVzIHRoZSBhY2Nlc3MKLQkqKiBtb2RlLCBtdXN0IGJlIGRlLWF1dGhlbnRpY2F0ZWQuCi0JKi8KLQotCWZvciAoaSA9IDA7IGkgPCBvbGQuY250OyBpKyspIHsKLQkJYWRkciA9IG9sZC5hZGRyW2ldOwotCi0JCWlmIChtb2RlID09IFdMQU5fQUNDRVNTX05PTkUpCi0JCQlkZWF1dGggPSAxOwotCQllbHNlIHsKLQkJCWlmIChtb2RlID09IFdMQU5fQUNDRVNTX0FMTE9XKSB7Ci0JCQkJZm9yIChqID0gMDsgaiA8IGh3LT5hbGxvdy5jbnQ7IGorKykKLQkJCQkJaWYgKG1lbWNtcChhZGRyLCBody0+YWxsb3cuYWRkcltqXSwKLQkJCQkJCQlXTEFOX0FERFJfTEVOKSA9PSAwKQotCQkJCQkJYnJlYWs7Ci0JCQkJZGVhdXRoID0gKGogPj0gaHctPmFsbG93LmNudCk7Ci0JCQl9IGVsc2UgewotCQkJCWZvciAoaiA9IDA7IGogPCBody0+ZGVueS5jbnQ7IGorKykKLQkJCQkJaWYgKG1lbWNtcChhZGRyLCBody0+ZGVueS5hZGRyW2pdLAotCQkJCQkJCVdMQU5fQUREUl9MRU4pID09IDApCi0JCQkJCQlicmVhazsKLQkJCQlkZWF1dGggPSAoaiA8IGh3LT5kZW55LmNudCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZGVhdXRoKSBwcmlzbTJtaWJfcHJpdl9kZWF1dGhlbnRpY2F0ZShodywgYWRkcik7Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm47Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtaWJfcHJpdl9hY2Nlc3NhbGxvdwotKgotKiBDaGFuZ2UgdGhlIGxpc3Qgb2YgYWxsb3dlZCBNQUMgYWRkcmVzc2VzLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIHByaXYgICAgICAicHJpdiIgc3RydWN0dXJlLgotKiAgICAgICBodyAgICAgICAgImh3IiBzdHJ1Y3R1cmUuCi0qICAgICAgIG1hY2FycmF5ICBOZXcgYXJyYXkgb2YgTUFDIGFkZHJlc3Nlcy4KLSoKLSogUmV0dXJuczoKLSoJTm90aGluZwotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB2b2lkIHByaXNtMm1pYl9wcml2X2FjY2Vzc2FsbG93KAotaGZhMzg0eF90ICAgICAgICAgKmh3LAotcDgwMjExbWFjYXJyYXlfdCAgKm1hY2FycmF5KQotewotCXByaXNtMnN0YV9hdXRobGlzdF90ICBvbGQ7Ci0JaW50ICAgICAgICAgICAgICAgICAgIGksIGo7Ci0KLQlEQkZFTlRFUjsKLQotCS8qCi0JKiogQ2hhbmdlIHRoZSBhY2Nlc3MgbGlzdC4gIE5vdGUgdGhhdCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgbWF5IGJlIGluCi0JKiogdGhlIG1pZGRsZSBvZiB1c2luZyB0aGUgYWNjZXNzIGxpc3QhISEgIFNpbmNlIHRoZSBpbnRlcnJ1cHQgaGFuZGxlcgotCSoqIHdpbGwJYWx3YXlzIGhhdmUgcHJpb3JpdHkgb3ZlciB0aGlzIHByb2Nlc3MgYW5kIHRoaXMgaXMgdGhlIG9ubHkKLQkqKiBwcm9jZXNzIHRoYXQgd2lsbCBtb2RpZnkgdGhlIGxpc3QsIHRoaXMgcHJvYmxlbSBjYW4gYmUgaGFuZGxlZCBhcwotCSoqIGZvbGxvd3M6Ci0JKioKLQkqKiAgICAxLiBTZXQgdGhlICJtb2RpZnkiIGZsYWcuCi0JKiogICAgMi4gQ2hhbmdlIHRoZSBmaXJzdCBjb3B5IG9mIHRoZSBsaXN0LgotCSoqICAgIDMuIENsZWFyIHRoZSAibW9kaWZ5IiBmbGFnLgotCSoqICAgIDQuIENoYW5nZSB0aGUgYmFja3VwIGNvcHkgb2YgdGhlIGxpc3QuCi0JKioKLQkqKiBUaGUgaW50ZXJydXB0IGhhbmRsZXIgd2lsbCBjaGVjayB0aGUgIm1vZGlmeSIgZmxhZy4gIElmIE5PVCBzZXQsIHRoZW4KLQkqKiB0aGUgZmlyc3QgY29weSBvZiB0aGUgbGlzdCBpcyB2YWxpZCBhbmQgbWF5IGJlIHVzZWQuICBPdGhlcndpc2UsIHRoZQotCSoqIGZpcnN0IGNvcHkgaXMgYmVpbmcgY2hhbmdlZCBidXQgdGhlIGJhY2t1cCBjb3B5IGlzIHZhbGlkIGFuZCBtYXkgYmUKLQkqKiB1c2VkLiAgRG9pbmcgdGhpbmdzIHRoaXMgd2F5IHByZXZlbnRzIGhhdmluZyB0byBoYXZlIHRoZSBpbnRlcnJ1cHQKLQkqKiBoYW5kbGVyIGJsb2NrIHdoaWxlIHRoZSBsaXN0IGlzIGJlaW5nIHVwZGF0ZWQuCi0JKi8KLQotCWh3LT5hbGxvdy5tb2RpZnkgPSAxOwotCi0JaHctPmFsbG93LmNudCA9IG1hY2FycmF5LT5jbnQ7Ci0JbWVtY3B5KGh3LT5hbGxvdy5hZGRyLCBtYWNhcnJheS0+ZGF0YSwgbWFjYXJyYXktPmNudCpXTEFOX0FERFJfTEVOKTsKLQotCWh3LT5hbGxvdy5tb2RpZnkgPSAwOwotCi0JaHctPmFsbG93LmNudDEgPSBtYWNhcnJheS0+Y250OwotCW1lbWNweShody0+YWxsb3cuYWRkcjEsIG1hY2FycmF5LT5kYXRhLCBtYWNhcnJheS0+Y250KldMQU5fQUREUl9MRU4pOwotCi0JLyoKLQkqKiBJZiB0aGUgY3VycmVudCBhY2Nlc3MgbW9kZSBpcyAiQWxsb3ciLCB0aGVuIGNoYW5naW5nIHRoZSBhY2Nlc3MKLQkqKiBsaXN0IG1heSBsZWF2ZSBzb21lIHN0YXRpb25zIGF1dGhlbnRpY2F0ZWQgd2hpY2ggc2hvdWxkIG5vdCBiZQotCSoqIGF1dGhlbnRpY2F0ZWQuICBJdCB3aWxsIGJlIG5lY2Vzc2FyeSB0byBkZS1hdXRoZW50aWNhdGUgdGhlc2UKLQkqKiBzdGF0aW9ucy4gIE90aGVyd2lzZSwgdGhlIGxpc3QgY2FuIGJlIGNoYW5nZWQgd2l0aG91dCBhIGxvdCBvZiBmdXNzLgotCSovCi0KLQlpZiAoaHctPmFjY2Vzc21vZGUgPT0gV0xBTl9BQ0NFU1NfQUxMT1cpIHsKLQotCQkvKgotCQkqKiBHbyB0aHJvdWdoIHRoZSBsaXN0IG9mIGF1dGhlbnRpY2F0ZWQgc3RhdGlvbnMgKHNvbWUgb2YKLQkJKiogd2hpY2ggbWlnaHQgZGUtYXV0aGVudGljYXRlIHRoZW1zZWx2ZXMgd2hpbGUgd2UgYXJlCi0JCSoqIHByb2Nlc3NpbmcgaXQgYnV0IHRoYXQgaXMgb2theSkuICBBbnkgc3RhdGlvbiB3aGljaCBpcwotCQkqKiBubyBsb25nZXIgaW4gdGhlIGxpc3Qgb2YgYWxsb3dlZCBzdGF0aW9ucywgbXVzdCBiZQotCQkqKiBkZS1hdXRoZW50aWNhdGVkLgotCQkqLwotCi0JCXByaXNtMm1pYl9wcml2X2F1dGhsaXN0KGh3LCAmb2xkKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgb2xkLmNudDsgaSsrKSB7Ci0JCQlmb3IgKGogPSAwOyBqIDwgaHctPmFsbG93LmNudDsgaisrKQotCQkJCWlmIChtZW1jbXAob2xkLmFkZHJbaV0sIGh3LT5hbGxvdy5hZGRyW2pdLAotCQkJCQkJCVdMQU5fQUREUl9MRU4pID09IDApCi0JCQkJCWJyZWFrOwotCQkJaWYgKGogPj0gaHctPmFsbG93LmNudCkKLQkJCQlwcmlzbTJtaWJfcHJpdl9kZWF1dGhlbnRpY2F0ZShodywgb2xkLmFkZHJbaV0pOwotCQl9Ci0JfQotCi0JREJGRVhJVDsKLQlyZXR1cm47Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtaWJfcHJpdl9hY2Nlc3NkZW55Ci0qCi0qIENoYW5nZSB0aGUgbGlzdCBvZiBkZW5pZWQgTUFDIGFkZHJlc3Nlcy4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBwcml2ICAgICAgInByaXYiIHN0cnVjdHVyZS4KLSogICAgICAgaHcgICAgICAgICJodyIgc3RydWN0dXJlLgotKiAgICAgICBtYWNhcnJheSAgTmV3IGFycmF5IG9mIE1BQyBhZGRyZXNzZXMuCi0qCi0qIFJldHVybnM6Ci0qCU5vdGhpbmcKLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdm9pZCBwcmlzbTJtaWJfcHJpdl9hY2Nlc3NkZW55KAotaGZhMzg0eF90ICAgICAgICAgKmh3LAotcDgwMjExbWFjYXJyYXlfdCAgKm1hY2FycmF5KQotewotCXByaXNtMnN0YV9hdXRobGlzdF90ICBvbGQ7Ci0JaW50ICAgICAgICAgICAgICAgICAgIGksIGo7Ci0KLQlEQkZFTlRFUjsKLQotCS8qCi0JKiogQ2hhbmdlIHRoZSBhY2Nlc3MgbGlzdC4gIE5vdGUgdGhhdCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgbWF5IGJlIGluCi0JKiogdGhlIG1pZGRsZSBvZiB1c2luZyB0aGUgYWNjZXNzIGxpc3QhISEgIFNpbmNlIHRoZSBpbnRlcnJ1cHQgaGFuZGxlcgotCSoqIHdpbGwgYWx3YXlzIGhhdmUgcHJpb3JpdHkgb3ZlciB0aGlzIHByb2Nlc3MgYW5kIHRoaXMgaXMgdGhlIG9ubHkKLQkqKiBwcm9jZXNzIHRoYXQgd2lsbCBtb2RpZnkgdGhlIGxpc3QsIHRoaXMgcHJvYmxlbSBjYW4gYmUgaGFuZGxlZCBhcwotCSoqIGZvbGxvd3M6Ci0JKioKLQkqKiAgICAxLiBTZXQgdGhlICJtb2RpZnkiIGZsYWcuCi0JKiogICAgMi4gQ2hhbmdlIHRoZSBmaXJzdCBjb3B5IG9mIHRoZSBsaXN0LgotCSoqICAgIDMuIENsZWFyIHRoZSAibW9kaWZ5IiBmbGFnLgotCSoqICAgIDQuIENoYW5nZSB0aGUgYmFja3VwIGNvcHkgb2YgdGhlIGxpc3QuCi0JKioKLQkqKiBUaGUgaW50ZXJydXB0IGhhbmRsZXIgd2lsbCBjaGVjayB0aGUgIm1vZGlmeSIgZmxhZy4gIElmIE5PVCBzZXQsIHRoZW4KLQkqKiB0aGUgZmlyc3QgY29weSBvZiB0aGUgbGlzdCBpcyB2YWxpZCBhbmQgbWF5IGJlIHVzZWQuICBPdGhlcndpc2UsIHRoZQotCSoqIGZpcnN0IGNvcHkgaXMgYmVpbmcgY2hhbmdlZCBidXQgdGhlIGJhY2t1cCBjb3B5IGlzIHZhbGlkIGFuZCBtYXkgYmUKLQkqKiB1c2VkLiAgRG9pbmcgdGhpbmdzIHRoaXMgd2F5IHByZXZlbnRzIGhhdmluZyB0byBoYXZlIHRoZSBpbnRlcnJ1cHQKLQkqKiBoYW5kbGVyIGJsb2NrIHdoaWxlIHRoZSBsaXN0IGlzIGJlaW5nIHVwZGF0ZWQuCi0JKi8KLQotCWh3LT5kZW55Lm1vZGlmeSA9IDE7Ci0KLQlody0+ZGVueS5jbnQgPSBtYWNhcnJheS0+Y250OwotCW1lbWNweShody0+ZGVueS5hZGRyLCBtYWNhcnJheS0+ZGF0YSwgbWFjYXJyYXktPmNudCpXTEFOX0FERFJfTEVOKTsKLQotCWh3LT5kZW55Lm1vZGlmeSA9IDA7Ci0KLQlody0+ZGVueS5jbnQxID0gbWFjYXJyYXktPmNudDsKLQltZW1jcHkoaHctPmRlbnkuYWRkcjEsIG1hY2FycmF5LT5kYXRhLCBtYWNhcnJheS0+Y250KldMQU5fQUREUl9MRU4pOwotCi0JLyoKLQkqKiBJZiB0aGUgY3VycmVudCBhY2Nlc3MgbW9kZSBpcyAiRGVueSIsIHRoZW4gY2hhbmdpbmcgdGhlIGFjY2VzcwotCSoqIGxpc3QgbWF5IGxlYXZlIHNvbWUgc3RhdGlvbnMgYXV0aGVudGljYXRlZCB3aGljaCBzaG91bGQgbm90IGJlCi0JKiogYXV0aGVudGljYXRlZC4gIEl0IHdpbGwgYmUgbmVjZXNzYXJ5IHRvIGRlLWF1dGhlbnRpY2F0ZSB0aGVzZQotCSoqIHN0YXRpb25zLiAgT3RoZXJ3aXNlLCB0aGUgbGlzdCBjYW4gYmUgY2hhbmdlZCB3aXRob3V0IGEgbG90IG9mIGZ1c3MuCi0JKi8KLQotCWlmIChody0+YWNjZXNzbW9kZSA9PSBXTEFOX0FDQ0VTU19ERU5ZKSB7Ci0KLQkJLyoKLQkJKiogR28gdGhyb3VnaCB0aGUgbGlzdCBvZiBhdXRoZW50aWNhdGVkIHN0YXRpb25zIChzb21lIG9mCi0JCSoqIHdoaWNoIG1pZ2h0IGRlLWF1dGhlbnRpY2F0ZSB0aGVtc2VsdmVzIHdoaWxlIHdlIGFyZQotCQkqKiBwcm9jZXNzaW5nIGl0IGJ1dCB0aGF0IGlzIG9rYXkpLiAgQW55IHN0YXRpb24gd2hpY2ggaXMKLQkJKiogbm93IGluIHRoZSBsaXN0IG9mIGRlbmllZCBzdGF0aW9ucywgbXVzdCBiZSBkZS1hdXRoZW50aWNhdGVkLgotCQkqLwotCi0JCXByaXNtMm1pYl9wcml2X2F1dGhsaXN0KGh3LCAmb2xkKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgb2xkLmNudDsgaSsrKQotCQkJZm9yIChqID0gMDsgaiA8IGh3LT5kZW55LmNudDsgaisrKQotCQkJCWlmIChtZW1jbXAob2xkLmFkZHJbaV0sIGh3LT5kZW55LmFkZHJbal0sCi0JCQkJCQkJIFdMQU5fQUREUl9MRU4pID09IDApIHsKLQkJCQkJcHJpc20ybWliX3ByaXZfZGVhdXRoZW50aWNhdGUoaHcsIG9sZC5hZGRyW2ldKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCX0KLQotCURCRkVYSVQ7Ci0JcmV0dXJuOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWliX3ByaXZfZGVhdXRoZW50aWNhdGUKLSoKLSogRGUtYXV0aGVudGljYXRlIGEgc3RhdGlvbi4gIFRoaXMgaXMgZG9uZSBieSBzZW5kaW5nIGEgSGFuZG92ZXJBZGRyZXNzCi0qIGluZm9ybWF0aW9uIGZyYW1lIHRvIHRoZSBmaXJtd2FyZS4gIFRoaXMgc2hvdWxkIHdvcmssIGFjY29yZGluZyB0bwotKiBJbnRlcnNpbC4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgotKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KLSogICAgICAgYWRkciAgICAgTUFDIGFkZHJlc3Mgb2Ygc3RhdGlvbiB0byBiZSBkZS1hdXRoZW50aWNhdGVkLgotKgotKiBSZXR1cm5zOgotKglOb3RoaW5nCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHZvaWQgcHJpc20ybWliX3ByaXZfZGVhdXRoZW50aWNhdGUoCi1oZmEzODR4X3QgICAgICAgICAqaHcsCi1VSU5UOCAgICAgICAgICAgICAqYWRkcikKLXsKLQlEQkZFTlRFUjsKLQloZmEzODR4X2RydnJfaGFuZG92ZXIoaHcsIGFkZHIpOwotCURCRkVYSVQ7Ci0JcmV0dXJuOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBwcmlzbTJtZ210X3BzdHIyYnl0ZXN0cgogKgogKiBDb252ZXJ0IHRoZSBwc3RyIGRhdGEgaW4gdGhlIFdMQU4gbWVzc2FnZSBzdHJ1Y3R1cmUgaW50byBhbiBoZmEzODR4CkBAIC0zMjc5LDcgKzg0Nyw3IEBACiB7CiAJREJGRU5URVI7CiAKLQlieXRlc3RyLT5sZW4gPSBob3N0MmhmYTM4NHhfMTYoKFVJTlQxNikocHN0ci0+bGVuKSk7CisJYnl0ZXN0ci0+bGVuID0gaG9zdDJoZmEzODR4XzE2KCh1MTYpKHBzdHItPmxlbikpOwogCW1lbWNweShieXRlc3RyLT5kYXRhLCBwc3RyLT5kYXRhLCBwc3RyLT5sZW4pOwogCURCRkVYSVQ7CiB9CkBAIC0zMzAwLDcgKzg2OCw3IEBACiAqCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotdm9pZCBwcmlzbTJtZ210X3BzdHIyYnl0ZWFyZWEoVUlOVDggKmJ5dGVhcmVhLCBwODAyMTFwc3RyZF90ICpwc3RyKQordm9pZCBwcmlzbTJtZ210X3BzdHIyYnl0ZWFyZWEodTggKmJ5dGVhcmVhLCBwODAyMTFwc3RyZF90ICpwc3RyKQogewogCURCRkVOVEVSOwogCkBAIC0zMzI4LDcgKzg5Niw3IEBACiB7CiAJREJGRU5URVI7CiAKLQlwc3RyLT5sZW4gPSAoVUlOVDgpKGhmYTM4NHgyaG9zdF8xNigoVUlOVDE2KShieXRlc3RyLT5sZW4pKSk7CisJcHN0ci0+bGVuID0gKHU4KShoZmEzODR4Mmhvc3RfMTYoKHUxNikoYnl0ZXN0ci0+bGVuKSkpOwogCW1lbWNweShwc3RyLT5kYXRhLCBieXRlc3RyLT5kYXRhLCBwc3RyLT5sZW4pOwogCURCRkVYSVQ7CiB9CkBAIC0zMzQ5LDExICs5MTcsMTEgQEAKICoKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi12b2lkIHByaXNtMm1nbXRfYnl0ZWFyZWEycHN0cihVSU5UOCAqYnl0ZWFyZWEsIHA4MDIxMXBzdHJkX3QgKnBzdHIsIGludCBsZW4pCit2b2lkIHByaXNtMm1nbXRfYnl0ZWFyZWEycHN0cih1OCAqYnl0ZWFyZWEsIHA4MDIxMXBzdHJkX3QgKnBzdHIsIGludCBsZW4pCiB7CiAJREJGRU5URVI7CiAKLQlwc3RyLT5sZW4gPSAoVUlOVDgpbGVuOworCXBzdHItPmxlbiA9ICh1OClsZW47CiAJbWVtY3B5KHBzdHItPmRhdGEsIGJ5dGVhcmVhLCBsZW4pOwogCURCRkVYSVQ7CiB9CkBAIC0zMzczLDExICs5NDEsMTEgQEAKICoKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi12b2lkIHByaXNtMm1nbXRfcHJpc20yaW50MnA4MDIxMWludChVSU5UMTYgKnByaXNtMmludCwgVUlOVDMyICp3bGFuaW50KQordm9pZCBwcmlzbTJtZ210X3ByaXNtMmludDJwODAyMTFpbnQodTE2ICpwcmlzbTJpbnQsIHUzMiAqd2xhbmludCkKIHsKIAlEQkZFTlRFUjsKIAotCSp3bGFuaW50ID0gKFVJTlQzMiloZmEzODR4Mmhvc3RfMTYoKnByaXNtMmludCk7CisJKndsYW5pbnQgPSAodTMyKWhmYTM4NHgyaG9zdF8xNigqcHJpc20yaW50KTsKIAlEQkZFWElUOwogfQogCkBAIC0zMzk2LDExICs5NjQsMTEgQEAKICoKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi12b2lkIHByaXNtMm1nbXRfcDgwMjExaW50MnByaXNtMmludChVSU5UMTYgKnByaXNtMmludCwgVUlOVDMyICp3bGFuaW50KQordm9pZCBwcmlzbTJtZ210X3A4MDIxMWludDJwcmlzbTJpbnQodTE2ICpwcmlzbTJpbnQsIHUzMiAqd2xhbmludCkKIHsKIAlEQkZFTlRFUjsKIAotCSpwcmlzbTJpbnQgPSBob3N0MmhmYTM4NHhfMTYoKFVJTlQxNikoKndsYW5pbnQpKTsKKwkqcHJpc20yaW50ID0gaG9zdDJoZmEzODR4XzE2KCh1MTYpKCp3bGFuaW50KSk7CiAJREJGRVhJVDsKIH0KIApAQCAtMzQxOSw3ICs5ODcsNyBAQAogKglOb3RoaW5nCiAqCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgcHJpc20ybWdtdF9wcmlzbTJlbnVtMnA4MDIxMWVudW0oVUlOVDE2ICpwcmlzbTJlbnVtLCBVSU5UMzIgKndsYW5lbnVtLCBVSU5UMTYgcmlkKQordm9pZCBwcmlzbTJtZ210X3ByaXNtMmVudW0ycDgwMjExZW51bSh1MTYgKnByaXNtMmVudW0sIHUzMiAqd2xhbmVudW0sIHUxNiByaWQpCiB7CiAJREJGRU5URVI7CiAKQEAgLTM0NDUsNyArMTAxMyw3IEBACiAqCU5vdGhpbmcKICoKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBwcmlzbTJtZ210X3A4MDIxMWVudW0ycHJpc20yZW51bShVSU5UMTYgKnByaXNtMmVudW0sIFVJTlQzMiAqd2xhbmVudW0sIFVJTlQxNiByaWQpCit2b2lkIHByaXNtMm1nbXRfcDgwMjExZW51bTJwcmlzbTJlbnVtKHUxNiAqcHJpc20yZW51bSwgdTMyICp3bGFuZW51bSwgdTE2IHJpZCkKIHsKIAlEQkZFTlRFUjsKIApAQCAtMzQ3MSwxMCArMTAzOSwxMCBAQAogKglOb3RoaW5nCiAqCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgcHJpc20ybWdtdF9nZXRfb3ByYXRlc2V0KFVJTlQxNiAqcmF0ZSwgcDgwMjExcHN0cmRfdCAqcHN0cikKK3ZvaWQgcHJpc20ybWdtdF9nZXRfb3ByYXRlc2V0KHUxNiAqcmF0ZSwgcDgwMjExcHN0cmRfdCAqcHN0cikKIHsKLQlVSU5UOAlsZW47Ci0JVUlOVDgJKmRhdGFyYXRlOworCXU4CWxlbjsKKwl1OAkqZGF0YXJhdGU7CiAKIAlEQkZFTlRFUjsKIApAQCAtMzQ4MywyOSArMTA1MSwyOSBAQAogCiAgCS8qIDEgTWJwcyAqLwogCWlmICggQklUMCAmICgqcmF0ZSkgKSB7Ci0JCWxlbiArPSAoVUlOVDgpMTsKLQkJKmRhdGFyYXRlID0gKFVJTlQ4KTI7CisJCWxlbiArPSAodTgpMTsKKwkJKmRhdGFyYXRlID0gKHU4KTI7CiAJCWRhdGFyYXRlKys7CiAJfQogCiAgCS8qIDIgTWJwcyAqLwogCWlmICggQklUMSAmICgqcmF0ZSkgKSB7Ci0JCWxlbiArPSAoVUlOVDgpMTsKLQkJKmRhdGFyYXRlID0gKFVJTlQ4KTQ7CisJCWxlbiArPSAodTgpMTsKKwkJKmRhdGFyYXRlID0gKHU4KTQ7CiAJCWRhdGFyYXRlKys7CiAJfQogCiAgCS8qIDUuNSBNYnBzICovCiAJaWYgKCBCSVQyICYgKCpyYXRlKSApIHsKLQkJbGVuICs9IChVSU5UOCkxOwotCQkqZGF0YXJhdGUgPSAoVUlOVDgpMTE7CisJCWxlbiArPSAodTgpMTsKKwkJKmRhdGFyYXRlID0gKHU4KTExOwogCQlkYXRhcmF0ZSsrOwogCX0KIAogIAkvKiAxMSBNYnBzICovCiAJaWYgKCBCSVQzICYgKCpyYXRlKSApIHsKLQkJbGVuICs9IChVSU5UOCkxOwotCQkqZGF0YXJhdGUgPSAoVUlOVDgpMjI7CisJCWxlbiArPSAodTgpMTsKKwkJKmRhdGFyYXRlID0gKHU4KTIyOwogCQlkYXRhcmF0ZSsrOwogCX0KIApAQCAtMzUzMCw5ICsxMDk4LDkgQEAKICoJTm90aGluZwogKgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIHByaXNtMm1nbXRfc2V0X29wcmF0ZXNldChVSU5UMTYgKnJhdGUsIHA4MDIxMXBzdHJkX3QgKnBzdHIpCit2b2lkIHByaXNtMm1nbXRfc2V0X29wcmF0ZXNldCh1MTYgKnJhdGUsIHA4MDIxMXBzdHJkX3QgKnBzdHIpCiB7Ci0JVUlOVDgJKmRhdGFyYXRlOworCXU4CSpkYXRhcmF0ZTsKIAlpbnQJaTsKIAogCURCRkVOVEVSOwpAQCAtMzU2NSwyMzMgKzExMzMsMyBAQAogCURCRkVYSVQ7CiAJcmV0dXJuOwogfQotCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1nbXRfZ2V0X2dycGFkZHIKLSoKLSogUmV0cmlldmVzIGEgcGFydGljdWxhciBncm91cCBhZGRyZXNzIGZyb20gdGhlIGxpc3Qgb2YKLSogZ3JvdXAgYWRkcmVzc2VzLgotKgotKiBBcmd1bWVudHM6Ci0qCWRpZAkJbWliaXRlbSBkaWQKLSoJcHN0cgkJd2xhbiBvY3RldCBzdHJpbmcKLSoJcHJpdgkJcHJpc20yIGRyaXZlciBwcml2YXRlIGRhdGEgc3RydWN0dXJlCi0qCi0qIFJldHVybnM6Ci0qCU5vdGhpbmcKLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBwcmlzbTJtZ210X2dldF9ncnBhZGRyKFVJTlQzMiBkaWQsIHA4MDIxMXBzdHJkX3QgKnBzdHIsCi0JaGZhMzg0eF90ICpodyApCi17Ci0JaW50CWluZGV4OwotCi0JREJGRU5URVI7Ci0KLQlpbmRleCA9IHByaXNtMm1nbXRfZ2V0X2dycGFkZHJfaW5kZXgoZGlkKTsKLQotCWlmICggaW5kZXggPj0gMCApIHsKLQkJcHN0ci0+bGVuID0gV0xBTl9BRERSX0xFTjsKLQkJbWVtY3B5KHBzdHItPmRhdGEsIGh3LT5kb3QxMV9ncnBfYWRkcltpbmRleF0sCi0JCQlXTEFOX0FERFJfTEVOKTsKLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybjsKLX0KLQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X3NldF9ncnBhZGRyCi0qCi0qIENvbnZlcnQgdGhlIHdsYW4gb2N0ZXQgc3RyaW5nIGludG8gYW4gaGZhMzg0eCBiaXQgYXJlYS4KLSoKLSogQXJndW1lbnRzOgotKglkaWQJCW1pYml0ZW0gZGlkCi0qCWJ1ZgotKglncm91cHMKLSoKLSogUmV0dXJuczoKLSoJMAlTdWNjZXNzCi0qCSEwCUVycm9yCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X3NldF9ncnBhZGRyKFVJTlQzMiBkaWQsIFVJTlQ4ICpwcmlzbTJidWYsCi0JcDgwMjExcHN0cmRfdCAqcHN0ciwgaGZhMzg0eF90ICpodyApCi17Ci0JVUlOVDgJbm9fYWRkcltXTEFOX0FERFJfTEVOXTsKLQlpbnQJaW5kZXg7Ci0KLQlEQkZFTlRFUjsKLQotCW1lbXNldChub19hZGRyLCAwLCBXTEFOX0FERFJfTEVOKTsKLQlpZiAobWVtY21wKG5vX2FkZHIsIHBzdHItPmRhdGEsIFdMQU5fQUREUl9MRU4pICE9IDApIHsKLQotCQkvKgotCQkqKiBUaGUgYWRkcmVzcyBpcyBOT1QgMCBzbyB3ZSBhcmUgImFkZGluZyIgYW4gYWRkcmVzcyB0byB0aGUKLQkJKiogZ3JvdXAgYWRkcmVzcyBsaXN0LiAgQ2hlY2sgdG8gbWFrZSBzdXJlIHdlIGFyZW4ndCB0cnlpbmcKLQkJKiogdG8gYWRkIG1vcmUgdGhhbiB0aGUgbWF4aW11bSBhbGxvd2VkIG51bWJlciBvZiBncm91cAotCQkqKiBhZGRyZXNzZXMgaW4gdGhlIGxpc3QuICBUaGUgbmV3IGFkZHJlc3MgaXMgYWRkZWQgdG8gdGhlCi0JCSoqIGVuZCBvZiB0aGUgbGlzdCByZWdhcmRsZXNzIG9mIHRoZSBESUQgdXNlZCB0byBhZGQgdGhlCi0JCSoqIGFkZHJlc3MuCi0JCSovCi0KLQkJaWYgKGh3LT5kb3QxMV9ncnBjbnQgPj0gTUFYX0dSUF9BRERSKSByZXR1cm4oLTEpOwotCi0JCW1lbWNweShody0+ZG90MTFfZ3JwX2FkZHJbaHctPmRvdDExX2dycGNudF0sIHBzdHItPmRhdGEsCi0JCQkJCQkJCSBXTEFOX0FERFJfTEVOKTsKLQkJaHctPmRvdDExX2dycGNudCArPSAxOwotCX0gZWxzZSB7Ci0KLQkJLyoKLQkJKiogVGhlIGFkZHJlc3MgaXMgMC4gIEludGVycHJldCB0aGlzIGFzICJkZWxldGluZyIgYW4gYWRkcmVzcwotCQkqKiBmcm9tIHRoZSBncm91cCBhZGRyZXNzIGxpc3QuICBHZXQgdGhlIGFkZHJlc3MgaW5kZXggZnJvbQotCQkqKiB0aGUgRElELiAgSWYgdGhpcyBpcyB3aXRoaW4gdGhlIHJhbmdlIG9mIHVzZWQgYWRkcmVzc2VzLAotCQkqKiB0aGVuIGRlbGV0ZSB0aGUgc3BlY2lmaWVkIGFkZHJlc3MgYnkgc2hpZnRpbmcgYWxsIGZvbGxvd2luZwotCQkqKiBhZGRyZXNzZXMgZG93bi4gIFRoZW4gY2xlYXIgdGhlIGxhc3QgYWRkcmVzcyAod2hpY2ggc2hvdWxkCi0JCSoqIG5vdyBiZSB1bnVzZWQpLiAgSWYgdGhlIGFkZHJlc3MgaW5kZXggaXMgTk9UIHdpdGhpbiB0aGUKLQkJKiogcmFuZ2Ugb2YgdXNlZCBhZGRyZXNzZXMsIHRoZW4ganVzdCBpZ25vcmUgdGhlIGFkZHJlc3MuCi0JCSovCi0KLQkJaW5kZXggPSBwcmlzbTJtZ210X2dldF9ncnBhZGRyX2luZGV4KGRpZCk7Ci0JCWlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgaHctPmRvdDExX2dycGNudCkgewotCQkJaHctPmRvdDExX2dycGNudCAtPSAxOwotCQkJbWVtbW92ZShody0+ZG90MTFfZ3JwX2FkZHJbaW5kZXhdLAotCQkJCWh3LT5kb3QxMV9ncnBfYWRkcltpbmRleCArIDFdLAotCQkJCSgoaHctPmRvdDExX2dycGNudCktaW5kZXgpICogV0xBTl9BRERSX0xFTik7Ci0JCQltZW1zZXQoaHctPmRvdDExX2dycF9hZGRyW2h3LT5kb3QxMV9ncnBjbnRdLCAwLAotCQkJCQkJCQkgV0xBTl9BRERSX0xFTik7Ci0JCX0KLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybigwKTsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWdtdF9nZXRfZ3JwYWRkcl9pbmRleAotKgotKiBHZXRzIHRoZSBpbmRleCBpbiB0aGUgZ3JvdXAgYWRkcmVzcyBsaXN0IGJhc2VkIG9uIHRoZSBkaWQuCi0qCi0qIEFyZ3VtZW50czoKLSoJZGlkCQltaWJpdGVtIGRpZAotKgotKiBSZXR1cm5zOgotKgk+PSAwCUlmIHZhbGlkIGRpZAotKgk8IDAJSWYgbm90IHZhbGlkIGRpZAotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9nZXRfZ3JwYWRkcl9pbmRleCggVUlOVDMyIGRpZCApCi17Ci0JaW50CWluZGV4OwotCi0JREJGRU5URVI7Ci0KLQlpbmRleCA9IC0xOwotCi0Jc3dpdGNoIChkaWQpIHsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMToKLQkJaW5kZXggPSAwOwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjoKLQkJaW5kZXggPSAxOwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMzoKLQkJaW5kZXggPSAyOwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzNDoKLQkJaW5kZXggPSAzOwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzNToKLQkJaW5kZXggPSA0OwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzNjoKLQkJaW5kZXggPSA1OwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzNzoKLQkJaW5kZXggPSA2OwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzODoKLQkJaW5kZXggPSA3OwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzOToKLQkJaW5kZXggPSA4OwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTA6Ci0JCWluZGV4ID0gOTsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczExOgotCQlpbmRleCA9IDEwOwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTI6Ci0JCWluZGV4ID0gMTE7Ci0JCWJyZWFrOwotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxMzoKLQkJaW5kZXggPSAxMjsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczE0OgotCQlpbmRleCA9IDEzOwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTU6Ci0JCWluZGV4ID0gMTQ7Ci0JCWJyZWFrOwotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxNjoKLQkJaW5kZXggPSAxNTsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczE3OgotCQlpbmRleCA9IDE2OwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMTg6Ci0JCWluZGV4ID0gMTc7Ci0JCWJyZWFrOwotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MxOToKLQkJaW5kZXggPSAxODsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczIwOgotCQlpbmRleCA9IDE5OwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjE6Ci0JCWluZGV4ID0gMjA7Ci0JCWJyZWFrOwotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyMjoKLQkJaW5kZXggPSAyMTsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczIzOgotCQlpbmRleCA9IDIyOwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjQ6Ci0JCWluZGV4ID0gMjM7Ci0JCWJyZWFrOwotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyNToKLQkJaW5kZXggPSAyNDsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczI2OgotCQlpbmRleCA9IDI1OwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMjc6Ci0JCWluZGV4ID0gMjY7Ci0JCWJyZWFrOwotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MyODoKLQkJaW5kZXggPSAyNzsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczI5OgotCQlpbmRleCA9IDI4OwotCQlicmVhazsKLQljYXNlIERJRG1pYl9kb3QxMW1hY19kb3QxMUdyb3VwQWRkcmVzc2VzVGFibGVfZG90MTFBZGRyZXNzMzA6Ci0JCWluZGV4ID0gMjk7Ci0JCWJyZWFrOwotCWNhc2UgRElEbWliX2RvdDExbWFjX2RvdDExR3JvdXBBZGRyZXNzZXNUYWJsZV9kb3QxMUFkZHJlc3MzMToKLQkJaW5kZXggPSAzMDsKLQkJYnJlYWs7Ci0JY2FzZSBESURtaWJfZG90MTFtYWNfZG90MTFHcm91cEFkZHJlc3Nlc1RhYmxlX2RvdDExQWRkcmVzczMyOgotCQlpbmRleCA9IDMxOwotCQlicmVhazsKLQl9Ci0KLQlEQkZFWElUOwotCXJldHVybiBpbmRleDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMnN0YS5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yc3RhLmMKaW5kZXggMThhYTE1Zi4uYjI3OWM5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yc3RhLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yc3RhLmMKQEAgLTU0LDE2ICs1NCw5IEBACiAvKiBTeXN0ZW0gSW5jbHVkZXMgKi8KICNkZWZpbmUgV0xBTl9EQlZBUglwcmlzbTJfZGVidWcKIAotI2luY2x1ZGUgInZlcnNpb24uaCIKLQotCiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDQsMjUpKQogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+Ci0jZW5kaWYKLQogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KQEAgLTcxLDM0ICs2NCwxNSBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwwKSkKLSNpbmNsdWRlIDxsaW51eC90cXVldWUuaD4KLSNlbHNlCiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Ci0jZW5kaWYKIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogCi0jaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUENNQ0lBKQotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+Ci0jaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+Ci0jaW5jbHVkZSA8cGNtY2lhL2NzLmg+Ci0jaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgotI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgotI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KLSNlbmRpZgotCiAjaW5jbHVkZSAid2xhbl9jb21wYXQuaCIKIAotI2lmICgoV0xBTl9IT1NUSUYgPT0gV0xBTl9QTFgpIHx8IChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDSSkpCi0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jZW5kaWYKLQogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qIFByb2plY3QgSW5jbHVkZXMgKi8KIApAQCAtMTI2LDM0ICsxMDAsNyBAQAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qIExvY2FsIFN0YXRpYyBEZWZpbml0aW9ucyAqLwogCi0jaWYgKFdMQU5fSE9TVElGID09IFdMQU5fUENNQ0lBKQotI2RlZmluZSBEUklWRVJfU1VGRklYCSJfY3MiCi0jZWxpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QTFgpCi0jZGVmaW5lIERSSVZFUl9TVUZGSVgJIl9wbHgiCi10eXBlZGVmIGNoYXIqIGRldl9pbmZvX3Q7Ci0jZWxpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ0kpCi0jZGVmaW5lIERSSVZFUl9TVUZGSVgJIl9wY2kiCi10eXBlZGVmIGNoYXIqIGRldl9pbmZvX3Q7Ci0jZWxpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9VU0IpCi0jZGVmaW5lIERSSVZFUl9TVUZGSVgJIl91c2IiCi10eXBlZGVmIGNoYXIqIGRldl9pbmZvX3Q7Ci0jZWxzZQotI2Vycm9yICJIT1NUSUYgdW5zdXBwb3J0ZWQgb3IgdW5kZWZpbmVkISIKLSNlbmRpZgotCi1zdGF0aWMgY2hhcgkJKnZlcnNpb24gPSAicHJpc20yIiBEUklWRVJfU1VGRklYICIubzogIiBXTEFOX1JFTEVBU0U7Ci1zdGF0aWMgZGV2X2luZm9fdAlkZXZfaW5mbyA9ICJwcmlzbTIiIERSSVZFUl9TVUZGSVg7Ci0KLSNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QTFggfHwgV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ0kpCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IHByaXNtMnN0YV9zdXNwZW5kX3BjaShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKLXN0YXRpYyBpbnQgcHJpc20yc3RhX3Jlc3VtZV9wY2koc3RydWN0IHBjaV9kZXYgKnBkZXYpOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDSSkKLQotI2VuZGlmIC8qIFdMQU5fUENJICovCitzdGF0aWMgY2hhciAqZGV2X2luZm8gPSAicHJpc20yX3VzYiI7CiAKIHN0YXRpYyB3bGFuZGV2aWNlX3QgKmNyZWF0ZV93bGFuKHZvaWQpOwogCkBAIC0xNjMsMTYgKzExMCw3IEBACiBpbnQgICAgICBwcmlzbTJfcmVzZXRfaG9sZHRpbWU9MzA7CS8qIFJlc2V0IGhvbGQgdGltZSBpbiBtcyAqLwogaW50CSBwcmlzbTJfcmVzZXRfc2V0dGxldGltZT0xMDA7CS8qIFJlc2V0IHNldHRsZSB0aW1lIGluIG1zICovCiAKLSNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9VU0IpCiBzdGF0aWMgaW50CXByaXNtMl9kb3Jlc2V0PTA7CQkvKiBEbyBhIHJlc2V0IGF0IGluaXQ/ICovCi0jZWxzZQotc3RhdGljIGludCAgICAgIHByaXNtMl9kb3Jlc2V0PTE7CQkvKiBEbyBhIHJlc2V0IGF0IGluaXQ/ICovCi1pbnQgICAgICAgICAgICAgcHJpc20yX2JhcF90aW1lb3V0PTEwMDA7ICAgICAgICAvKiBCQVAgdGltZW91dCAqLwotaW50CQlwcmlzbTJfaXJxX2V2cmVhZF9tYXg9MjA7CS8qIE1heGltdW0gbnVtYmVyIG9mCi0JCQkJCQkgKiBldl9yZWFkcyAobG9vcHMpCi0JCQkJCQkgKiBpbiBpcnEgaGFuZGxlcgotCQkJCQkJICovCi0jZW5kaWYKIAogI2lmZGVmIFdMQU5fSU5DTFVERV9ERUJVRwogaW50IHByaXNtMl9kZWJ1Zz0wOwpAQCAtMTg4LDEzICsxMjYsNiBAQAogbW9kdWxlX3BhcmFtKCBwcmlzbTJfcmVzZXRfc2V0dGxldGltZSwgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoIHByaXNtMl9yZXNldF9zZXR0bGV0aW1lLCAicmVzZXQgc2V0dGxlIHRpbWUgaW4gbXMiKTsKIAotI2lmIChXTEFOX0hPU1RJRiAhPSBXTEFOX1VTQikKLW1vZHVsZV9wYXJhbSggcHJpc20yX2JhcF90aW1lb3V0LCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhwcmlzbTJfYmFwX3RpbWVvdXQsICJCdWZmZXJBY2Nlc3NQYXRoIFRpbWVvdXQgaW4gMTAqbiB1cyIpOwotbW9kdWxlX3BhcmFtKCBwcmlzbTJfaXJxX2V2cmVhZF9tYXgsIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKCBwcmlzbTJfaXJxX2V2cmVhZF9tYXgsICJNYXhpbWltIG51bWJlciBvZiBldmVudCByZWFkcyBpbiBpbnRlcnJ1cHQgaGFuZGxlciIpOwotI2VuZGlmCi0KIE1PRFVMRV9MSUNFTlNFKCJEdWFsIE1QTC9HUEwiKTsKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KQEAgLTIzMSwxNyArMTYyLDYgQEAKIHN0YXRpYyB2b2lkCXByaXNtMnN0YV9pbmZfcHN1c2VyY250KAogCQkJd2xhbmRldmljZV90ICp3bGFuZGV2LCBoZmEzODR4X0luZkZyYW1lX3QgKmluZik7CiAKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotc3RhdGljIGludAotcHJpc20yc3RhX3Byb2NfcmVhZCgKLQljaGFyCSpwYWdlLAotCWNoYXIJKipzdGFydCwKLQlvZmZfdAlvZmZzZXQsCi0JaW50CWNvdW50LAotCWludAkqZW9mLAotCXZvaWQJKmRhdGEpOwotI2VuZGlmCi0KIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKiBGdW5jdGlvbiBEZWZpbml0aW9ucyAqLwogCkBAIC0yNjcsNyArMTg3LDcgQEAKIAlpbnQgYzsKIAlmb3IgKCBjPSAwOyBjIDwgbjsgYysrKSB7CiAJCWlmICggKGMgJSAxNikgPT0gMCApIHByaW50ayhLRVJOX0RFQlVHImRtcFslZF06ICIsIGMpOwotCQlwcmludGsoIiUwMnggIiwgKChVSU5UOCopYnVmKVtjXSk7CisJCXByaW50aygiJTAyeCAiLCAoKHU4KilidWYpW2NdKTsKIAkJaWYgKCAoYyAlIDE2KSA9PSAxNSApIHByaW50aygiXG4iKTsKIAl9CiAJaWYgKCAoYyAlIDE2KSAhPSAwICkgcHJpbnRrKCJcbiIpOwpAQCAtMjk5LDEwICsyMTksNiBAQAogewogCURCRkVOVEVSOwogCi0jaWZkZWYgQU5DSUVOVF9NT0RVTEVfQ09ERQotCU1PRF9JTkNfVVNFX0NPVU5UOwotI2VuZGlmCi0KIAkvKiBXZSBkb24ndCBjdXJyZW50bHkgaGF2ZSB0byBkbyBhbnl0aGluZyBlbHNlLgogCSAqIFRoZSBzZXR1cCBvZiB0aGUgTUFDIHNob3VsZCBiZSBzdWJzZXF1ZW50bHkgY29tcGxldGVkIHZpYQogCSAqIHRoZSBtbG1lIGNvbW1hbmRzLgpAQCAtMzQxLDEwICsyNTcsNiBAQAogewogCURCRkVOVEVSOwogCi0jaWZkZWYgQU5DSUVOVF9NT0RVTEVfQ09ERQotCU1PRF9ERUNfVVNFX0NPVU5UOwotI2VuZGlmCi0KIAkvKiBXZSBkb24ndCBjdXJyZW50bHkgaGF2ZSB0byBkbyBhbnl0aGluZyBlbHNlLgogCSAqIEhpZ2hlciBsYXllcnMga25vdyB3ZSdyZSBub3QgcmVhZHkgZnJvbSBkZXYtPnN0YXJ0PT0wIGFuZAogCSAqIGRldi0+dGJ1c3k9PTEuICBPdXIgcnggcGF0aCBrbm93cyB0byBub3QgcGFzcyB1cCByZWNlaXZlZApAQCAtNDYzLDEwICszNzUsNiBAQAogCQlXTEFOX0xPR19ERUJVRygyLCJSZWNlaXZlZCBtaWJzZXQgcmVxdWVzdFxuIik7CiAJCXJlc3VsdCA9IHByaXNtMm1nbXRfbWlic2V0X21pYmdldCh3bGFuZGV2LCBtc2cpOwogCQlicmVhazsKLQljYXNlIERJRG1zZ19kb3QxMXJlcV9wb3dlcm1nbXQgOgotCQlXTEFOX0xPR19ERUJVRygyLCJSZWNlaXZlZCBwb3dlcm1nbXQgcmVxdWVzdFxuIik7Ci0JCXJlc3VsdCA9IHByaXNtMm1nbXRfcG93ZXJtZ210KHdsYW5kZXYsIG1zZyk7Ci0JCWJyZWFrOwogCWNhc2UgRElEbXNnX2RvdDExcmVxX3NjYW4gOgogCQlXTEFOX0xPR19ERUJVRygyLCJSZWNlaXZlZCBzY2FuIHJlcXVlc3RcbiIpOwogCQlyZXN1bHQgPSBwcmlzbTJtZ210X3NjYW4od2xhbmRldiwgbXNnKTsKQEAgLTQ3NSwzNCArMzgzLDYgQEAKIAkJV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgc2Nhbl9yZXN1bHRzIHJlcXVlc3RcbiIpOwogCQlyZXN1bHQgPSBwcmlzbTJtZ210X3NjYW5fcmVzdWx0cyh3bGFuZGV2LCBtc2cpOwogCQlicmVhazsKLQljYXNlIERJRG1zZ19kb3QxMXJlcV9qb2luIDoKLQkJV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgam9pbiByZXF1ZXN0XG4iKTsKLQkJcmVzdWx0ID0gcHJpc20ybWdtdF9qb2luKHdsYW5kZXYsIG1zZyk7Ci0JCWJyZWFrOwotCWNhc2UgRElEbXNnX2RvdDExcmVxX2F1dGhlbnRpY2F0ZSA6Ci0JCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIGF1dGhlbnRpY2F0ZSByZXF1ZXN0XG4iKTsKLQkJcmVzdWx0ID0gcHJpc20ybWdtdF9hdXRoZW50aWNhdGUod2xhbmRldiwgbXNnKTsKLQkJYnJlYWs7Ci0JY2FzZSBESURtc2dfZG90MTFyZXFfZGVhdXRoZW50aWNhdGUgOgotCQlXTEFOX0xPR19ERUJVRygyLCJSZWNlaXZlZCBtbG1lIGRlYXV0aGVudGljYXRlIHJlcXVlc3RcbiIpOwotCQlyZXN1bHQgPSBwcmlzbTJtZ210X2RlYXV0aGVudGljYXRlKHdsYW5kZXYsIG1zZyk7Ci0JCWJyZWFrOwotCWNhc2UgRElEbXNnX2RvdDExcmVxX2Fzc29jaWF0ZSA6Ci0JCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIG1sbWUgYXNzb2NpYXRlIHJlcXVlc3RcbiIpOwotCQlyZXN1bHQgPSBwcmlzbTJtZ210X2Fzc29jaWF0ZSh3bGFuZGV2LCBtc2cpOwotCQlicmVhazsKLQljYXNlIERJRG1zZ19kb3QxMXJlcV9yZWFzc29jaWF0ZSA6Ci0JCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIG1sbWUgcmVhc3NvY2lhdGUgcmVxdWVzdFxuIik7Ci0JCXJlc3VsdCA9IHByaXNtMm1nbXRfcmVhc3NvY2lhdGUod2xhbmRldiwgbXNnKTsKLQkJYnJlYWs7Ci0JY2FzZSBESURtc2dfZG90MTFyZXFfZGlzYXNzb2NpYXRlIDoKLQkJV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgbWxtZSBkaXNhc3NvY2lhdGUgcmVxdWVzdFxuIik7Ci0JCXJlc3VsdCA9IHByaXNtMm1nbXRfZGlzYXNzb2NpYXRlKHdsYW5kZXYsIG1zZyk7Ci0JCWJyZWFrOwotCWNhc2UgRElEbXNnX2RvdDExcmVxX3Jlc2V0IDoKLQkJV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgbWxtZSByZXNldCByZXF1ZXN0XG4iKTsKLQkJcmVzdWx0ID0gcHJpc20ybWdtdF9yZXNldCh3bGFuZGV2LCBtc2cpOwotCQlicmVhazsKIAljYXNlIERJRG1zZ19kb3QxMXJlcV9zdGFydCA6CiAJCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIG1sbWUgc3RhcnQgcmVxdWVzdFxuIik7CiAJCXJlc3VsdCA9IHByaXNtMm1nbXRfc3RhcnQod2xhbmRldiwgbXNnKTsKQEAgLTUxMCw0NiArMzkwLDEwIEBACiAJLyoKIAkgKiBQcmlzbTIgc3BlY2lmaWMgbWVzc2FnZXMKIAkgKi8KLQljYXNlIERJRG1zZ19wMnJlcV9qb2luIDoKLQkJV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgcDIgam9pbiByZXF1ZXN0XG4iKTsKLQkJcmVzdWx0ID0gcHJpc20ybWdtdF9wMl9qb2luKHdsYW5kZXYsIG1zZyk7Ci0JCWJyZWFrOwogICAgICAgIAljYXNlIERJRG1zZ19wMnJlcV9yZWFkcGRhIDoKIAkJV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgbWxtZSByZWFkcGRhIHJlcXVlc3RcbiIpOwogCQlyZXN1bHQgPSBwcmlzbTJtZ210X3JlYWRwZGEod2xhbmRldiwgbXNnKTsKIAkJYnJlYWs7Ci0JY2FzZSBESURtc2dfcDJyZXFfcmVhZGNpcyA6Ci0JCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIG1sbWUgcmVhZGNpcyByZXF1ZXN0XG4iKTsKLQkJcmVzdWx0ID0gcHJpc20ybWdtdF9yZWFkY2lzKHdsYW5kZXYsIG1zZyk7Ci0JCWJyZWFrOwotCWNhc2UgRElEbXNnX3AycmVxX2F1eHBvcnRfc3RhdGUgOgotCQlXTEFOX0xPR19ERUJVRygyLCJSZWNlaXZlZCBtbG1lIGF1eHBvcnRfc3RhdGUgcmVxdWVzdFxuIik7Ci0JCXJlc3VsdCA9IHByaXNtMm1nbXRfYXV4cG9ydF9zdGF0ZSh3bGFuZGV2LCBtc2cpOwotCQlicmVhazsKLQljYXNlIERJRG1zZ19wMnJlcV9hdXhwb3J0X3JlYWQgOgotCQlXTEFOX0xPR19ERUJVRygyLCJSZWNlaXZlZCBtbG1lIGF1eHBvcnRfcmVhZCByZXF1ZXN0XG4iKTsKLQkJcmVzdWx0ID0gcHJpc20ybWdtdF9hdXhwb3J0X3JlYWQod2xhbmRldiwgbXNnKTsKLQkJYnJlYWs7Ci0JY2FzZSBESURtc2dfcDJyZXFfYXV4cG9ydF93cml0ZSA6Ci0JCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIG1sbWUgYXV4cG9ydF93cml0ZSByZXF1ZXN0XG4iKTsKLQkJcmVzdWx0ID0gcHJpc20ybWdtdF9hdXhwb3J0X3dyaXRlKHdsYW5kZXYsIG1zZyk7Ci0JCWJyZWFrOwotCWNhc2UgRElEbXNnX3AycmVxX2xvd19sZXZlbCA6Ci0JCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIG1sbWUgbG93X2xldmVsIHJlcXVlc3RcbiIpOwotCQlyZXN1bHQgPSBwcmlzbTJtZ210X2xvd19sZXZlbCh3bGFuZGV2LCBtc2cpOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBESURtc2dfcDJyZXFfdGVzdF9jb21tYW5kIDoKLSAgICAgICAgICAgICAgICBXTEFOX0xPR19ERUJVRygyLCJSZWNlaXZlZCBtbG1lIHRlc3RfY29tbWFuZCByZXF1ZXN0XG4iKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBwcmlzbTJtZ210X3Rlc3RfY29tbWFuZCh3bGFuZGV2LCBtc2cpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERJRG1zZ19wMnJlcV9tbWlfcmVhZCA6Ci0gICAgICAgICAgICAgICAgV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgbWxtZSBtbWlfcmVhZCByZXF1ZXN0XG4iKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBwcmlzbTJtZ210X21taV9yZWFkKHdsYW5kZXYsIG1zZyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRElEbXNnX3AycmVxX21taV93cml0ZSA6Ci0gICAgICAgICAgICAgICAgV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgbWxtZSBtbWlfd3JpdGUgcmVxdWVzdFxuIik7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gcHJpc20ybWdtdF9tbWlfd3JpdGUod2xhbmRldiwgbXNnKTsKLSAgICAgICAgICAgICAgICBicmVhazsKIAljYXNlIERJRG1zZ19wMnJlcV9yYW1kbF9zdGF0ZSA6CiAJCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIG1sbWUgcmFtZGxfc3RhdGUgcmVxdWVzdFxuIik7CiAJCXJlc3VsdCA9IHByaXNtMm1nbXRfcmFtZGxfc3RhdGUod2xhbmRldiwgbXNnKTsKQEAgLTU2NiwxOCArNDEwLDYgQEAKIAkJV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgbWxtZSBmbGFzaGRsX3dyaXRlIHJlcXVlc3RcbiIpOwogCQlyZXN1bHQgPSBwcmlzbTJtZ210X2ZsYXNoZGxfd3JpdGUod2xhbmRldiwgbXNnKTsKIAkJYnJlYWs7Ci0JY2FzZSBESURtc2dfcDJyZXFfZHVtcF9zdGF0ZSA6Ci0JCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIG1sbWUgZHVtcF9zdGF0ZSByZXF1ZXN0XG4iKTsKLQkJcmVzdWx0ID0gcHJpc20ybWdtdF9kdW1wX3N0YXRlKHdsYW5kZXYsIG1zZyk7Ci0JCWJyZWFrOwotCWNhc2UgRElEbXNnX3AycmVxX2NoYW5uZWxfaW5mbyA6Ci0JCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIG1sbWUgY2hhbm5lbF9pbmZvIHJlcXVlc3RcbiIpOwotCQlyZXN1bHQgPSBwcmlzbTJtZ210X2NoYW5uZWxfaW5mbyh3bGFuZGV2LCBtc2cpOwotCQlicmVhazsKLQljYXNlIERJRG1zZ19wMnJlcV9jaGFubmVsX2luZm9fcmVzdWx0cyA6Ci0JCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIG1sbWUgY2hhbm5lbF9pbmZvX3Jlc3VsdHMgcmVxdWVzdFxuIik7Ci0JCXJlc3VsdCA9IHByaXNtMm1nbXRfY2hhbm5lbF9pbmZvX3Jlc3VsdHMod2xhbmRldiwgbXNnKTsKLQkJYnJlYWs7CiAJLyoKIAkgKiBMaW51eCBzcGVjaWZpYyBtZXNzYWdlcwogCSAqLwpAQCAtNjAzLDE4ICs0MzUsMTEgQEAKIAkJV0xBTl9MT0dfREVCVUcoMiwiUmVjZWl2ZWQgbWxtZSBhdXRvam9pbiByZXF1ZXN0XG4iKTsKIAkJcmVzdWx0ID0gcHJpc20ybWdtdF9hdXRvam9pbih3bGFuZGV2LCBtc2cpOwogCQlicmVhazsKLQljYXNlIERJRG1zZ19wMnJlcV9lbmFibGUgOgotCQlXTEFOX0xPR19ERUJVRygyLCJSZWNlaXZlZCBtbG1lIGVuYWJsZSByZXF1ZXN0XG4iKTsKLQkJcmVzdWx0ID0gcHJpc20ybWdtdF9lbmFibGUod2xhbmRldiwgbXNnKTsKLQkJYnJlYWs7CiAJY2FzZSBESURtc2dfbG54cmVxX2NvbW1zcXVhbGl0eTogewogCQlwODAyMTFtc2dfbG54cmVxX2NvbW1zcXVhbGl0eV90ICpxdWFsbXNnOwogCiAJCVdMQU5fTE9HX0RFQlVHKDIsIlJlY2VpdmVkIGNvbW1zcXVhbGl0eSByZXF1ZXN0XG4iKTsKIAotCQlpZiAoaHctPmFwKQotCQkJYnJlYWs7Ci0KIAkJcXVhbG1zZyA9IChwODAyMTFtc2dfbG54cmVxX2NvbW1zcXVhbGl0eV90KikgbXNnOwogCiAJCXF1YWxtc2ctPmxpbmsuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwpAQCAtNjU5LDEwICs0ODQsMTAgQEAKICoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQogKglpbnRlcnJ1cHQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotVUlOVDMyIHByaXNtMnN0YV9pZnN0YXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgVUlOVDMyIGlmc3RhdGUpCit1MzIgcHJpc20yc3RhX2lmc3RhdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB1MzIgaWZzdGF0ZSkKIHsKICAgICAgICAgaGZhMzg0eF90ICAgICAgICAgICAgICAgKmh3ID0gKGhmYTM4NHhfdCAqKXdsYW5kZXYtPnByaXY7Ci0JVUlOVDMyIAkJCXJlc3VsdDsKKwl1MzIgCQkJcmVzdWx0OwogCURCRkVOVEVSOwogCiAJcmVzdWx0ID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX2ltcGxlbWVudGF0aW9uX2ZhaWx1cmU7CkBAIC02NzksOSArNTA0LDYgQEAKIAkJCSAqIEluaXRpYWxpemUgdGhlIGRldmljZStkcml2ZXIgc3VmZmljaWVudGx5CiAJCQkgKiBmb3IgZmlybXdhcmUgbG9hZGluZy4KIAkJCSAqLwotI2lmIChXTEFOX0hPU1RJRiAhPSBXTEFOX1VTQikKLQkJCXJlc3VsdD1oZmEzODR4X2NtZF9pbml0aWFsaXplKGh3KTsKLSNlbHNlCiAJCQlpZiAoKHJlc3VsdD1oZmEzODR4X2RydnJfc3RhcnQoaHcpKSkgewogCQkJCVdMQU5fTE9HX0VSUk9SKAogCQkJCQkiaGZhMzg0eF9kcnZyX3N0YXJ0KCkgZmFpbGVkLCIKQEAgLTY5MSw3ICs1MTMsNiBAQAogCQkJCXdsYW5kZXYtPm1zZHN0YXRlID0gV0xBTl9NU0RfSFdQUkVTRU5UOwogCQkJCWJyZWFrOwogCQkJfQotI2VuZGlmCiAJCQl3bGFuZGV2LT5tc2RzdGF0ZSA9IFdMQU5fTVNEX0ZXTE9BRDsKIAkJCXJlc3VsdCA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9zdWNjZXNzOwogCQkJYnJlYWs7CkBAIC04NDEsOCArNjYyLDggQEAKIHsKIAlpbnQgCQkJcmVzdWx0ID0gMDsKICAgICAgICAgaGZhMzg0eF90ICAgICAgICAgICAgICAgKmh3ID0gKGhmYTM4NHhfdCAqKXdsYW5kZXYtPnByaXY7Ci0JVUlOVDE2ICAgICAgICAgICAgICAgICAgdGVtcDsKLQlVSU5UOAkJCXNudW1bSEZBMzg0eF9SSURfTklDU0VSSUFMTlVNQkVSX0xFTl07CisJdTE2ICAgICAgICAgICAgICAgICAgdGVtcDsKKwl1OAkJCXNudW1bSEZBMzg0eF9SSURfTklDU0VSSUFMTlVNQkVSX0xFTl07CiAJY2hhcgkJCXBzdHJbKEhGQTM4NHhfUklEX05JQ1NFUklBTE5VTUJFUl9MRU4gKiA0KSArIDFdOwogCiAJREJGRU5URVI7CkBAIC05MDcsMjAgKzcyOCwyMCBAQAogCiAJLyogc3RyaXAgb3V0IHRoZSAnc3BlY2lhbCcgdmFyaWFudCBiaXRzICovCiAJaHctPm1tX21vZHMgPSBody0+aWRlbnRfc3RhX2Z3LnZhcmlhbnQgJiAoQklUMTQgfCBCSVQxNSk7Ci0JaHctPmlkZW50X3N0YV9mdy52YXJpYW50ICY9IH4oKFVJTlQxNikoQklUMTQgfCBCSVQxNSkpOworCWh3LT5pZGVudF9zdGFfZncudmFyaWFudCAmPSB+KCh1MTYpKEJJVDE0IHwgQklUMTUpKTsKIAogCWlmICAoIGh3LT5pZGVudF9zdGFfZncuaWQgPT0gMHgxZiApIHsKLQkJaHctPmFwID0gMDsKIAkJV0xBTl9MT0dfSU5GTygKIAkJCSJpZGVudDogc3RhIGYvdzogaWQ9MHglMDJ4ICVkLiVkLiVkXG4iLAogCQkJaHctPmlkZW50X3N0YV9mdy5pZCwgaHctPmlkZW50X3N0YV9mdy5tYWpvciwKIAkJCWh3LT5pZGVudF9zdGFfZncubWlub3IsIGh3LT5pZGVudF9zdGFfZncudmFyaWFudCk7CiAJfSBlbHNlIHsKLQkJaHctPmFwID0gMTsKIAkJV0xBTl9MT0dfSU5GTygKIAkJCSJpZGVudDogIGFwIGYvdzogaWQ9MHglMDJ4ICVkLiVkLiVkXG4iLAogCQkJaHctPmlkZW50X3N0YV9mdy5pZCwgaHctPmlkZW50X3N0YV9mdy5tYWpvciwKIAkJCWh3LT5pZGVudF9zdGFfZncubWlub3IsIGh3LT5pZGVudF9zdGFfZncudmFyaWFudCk7CisJCVdMQU5fTE9HX0VSUk9SKCJVbnN1cHBvcnRlZCBUZXJ0aWFyeSBBUCBmaXJtZWFyZSBsb2FkZWQhXG4iKTsKKwkJZ290byBmYWlsZWQ7CiAJfQogCiAJLyogQ29tcGF0aWJpbGl0eSByYW5nZSwgTW9kZW0gc3VwcGxpZXIgKi8KQEAgLTExNjgsNyArOTg5LDcgQEAKIAlpbnQgcmVzdWx0ID0gMDsKIAloZmEzODR4X3QgICAgICAgICAgICAgICAqaHcgPSAoaGZhMzg0eF90ICopd2xhbmRldi0+cHJpdjsKIAotCVVJTlQxNiAgcHJvbWlzYzsKKwl1MTYgIHByb21pc2M7CiAKIAlEQkZFTlRFUjsKIApAQCAtMTE3NiwxMCArOTk3LDYgQEAKIAlpZiAoIGh3LT5zdGF0ZSAhPSBIRkEzODR4X1NUQVRFX1JVTk5JTkcgKQogCQlnb3RvIGV4aXQ7CiAKLQkvKiBJZiB3ZSdyZSBhbiBBUCwgZG8gbm90aGluZyBoZXJlICovCi0JaWYgKGh3LT5hcCkKLQkJZ290byBleGl0OwotCiAJaWYgKCAoZGV2LT5mbGFncyAmIChJRkZfUFJPTUlTQyB8IElGRl9BTExNVUxUSSkpICE9IDAgKQogCQlwcm9taXNjID0gUDgwMjExRU5VTV90cnV0aF90cnVlOwogCWVsc2UKQEAgLTEyNDcsOSArMTA2NCw5IEBACiBzdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX3RhbGxpZXMod2xhbmRldmljZV90ICp3bGFuZGV2LCBoZmEzODR4X0luZkZyYW1lX3QgKmluZikKIHsKICAgICAgICAgaGZhMzg0eF90ICAgICAgICAgICAgICAgKmh3ID0gKGhmYTM4NHhfdCAqKXdsYW5kZXYtPnByaXY7Ci0JVUlOVDE2CQkJKnNyYzE2OwotCVVJTlQzMgkJCSpkc3Q7Ci0JVUlOVDMyCQkJKnNyYzMyOworCXUxNgkJCSpzcmMxNjsKKwl1MzIJCQkqZHN0OworCXUzMgkJCSpzcmMzMjsKIAlpbnQJCQlpOwogCWludAkJCWNudDsKIApAQCAtMTI2MCwxNSArMTA3NywxNSBAQAogCSoqIHJlY29yZCBsZW5ndGggb2YgdGhlIGluZm8gcmVjb3JkLgogCSovCiAKLQljbnQgPSBzaXplb2YoaGZhMzg0eF9Db21tVGFsbGllczMyX3QpIC8gc2l6ZW9mKFVJTlQzMik7CisJY250ID0gc2l6ZW9mKGhmYTM4NHhfQ29tbVRhbGxpZXMzMl90KSAvIHNpemVvZih1MzIpOwogCWlmIChpbmYtPmZyYW1lbGVuID4gMjIpIHsKLQkJZHN0ICAgPSAoVUlOVDMyICopICZody0+dGFsbGllczsKLQkJc3JjMzIgPSAoVUlOVDMyICopICZpbmYtPmluZm8uY29tbXRhbGxpZXMzMjsKKwkJZHN0ICAgPSAodTMyICopICZody0+dGFsbGllczsKKwkJc3JjMzIgPSAodTMyICopICZpbmYtPmluZm8uY29tbXRhbGxpZXMzMjsKIAkJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrLCBkc3QrKywgc3JjMzIrKykKIAkJCSpkc3QgKz0gaGZhMzg0eDJob3N0XzMyKCpzcmMzMik7CiAJfSBlbHNlIHsKLQkJZHN0ICAgPSAoVUlOVDMyICopICZody0+dGFsbGllczsKLQkJc3JjMTYgPSAoVUlOVDE2ICopICZpbmYtPmluZm8uY29tbXRhbGxpZXMxNjsKKwkJZHN0ICAgPSAodTMyICopICZody0+dGFsbGllczsKKwkJc3JjMTYgPSAodTE2ICopICZpbmYtPmluZm8uY29tbXRhbGxpZXMxNjsKIAkJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrLCBkc3QrKywgc3JjMTYrKykKIAkJCSpkc3QgKz0gaGZhMzg0eDJob3N0XzE2KCpzcmMxNik7CiAJfQpAQCAtMTMwOCw3ICsxMTI1LDcgQEAKIAlEQkZFTlRFUjsKIAogCS8qIEdldCB0aGUgbnVtYmVyIG9mIHJlc3VsdHMsIGZpcnN0IGluIGJ5dGVzLCB0aGVuIGluIHJlc3VsdHMgKi8KLQluYnNzID0gKGluZi0+ZnJhbWVsZW4gKiBzaXplb2YoVUlOVDE2KSkgLQorCW5ic3MgPSAoaW5mLT5mcmFtZWxlbiAqIHNpemVvZih1MTYpKSAtCiAJCXNpemVvZihpbmYtPmluZm90eXBlKSAtCiAJCXNpemVvZihpbmYtPmluZm8uc2NhbnJlc3VsdC5zY2FucmVhc29uKTsKIAluYnNzIC89IHNpemVvZihoZmEzODR4X1NjYW5SZXN1bHRTdWJfdCk7CkBAIC0xNTAwLDcgKzEzMTcsNyBAQAogCiAJCS8qIERvbid0IGNhbGwgdGhpcyBpbiBtb25pdG9yIG1vZGUgKi8KIAkJaWYgKCB3bGFuZGV2LT5uZXRkZXYtPnR5cGUgPT0gQVJQSFJEX0VUSEVSICkgewotCQkJVUlOVDE2CQkJcG9ydHN0YXR1czsKKwkJCXUxNgkJCXBvcnRzdGF0dXM7CiAKIAkJCVdMQU5fTE9HX0lORk8oImxpbmtzdGF0dXM9Q09OTkVDVEVEXG4iKTsKIApAQCAtMTgzNiw3ICsxNjUzLDcgQEAKIAloZmEzODR4X2F1dGhlbnRpY2F0ZVN0YXRpb25fZGF0YV90ICByZWM7CiAKIAlpbnQgICAgaSwgYWRkZWQsIHJlc3VsdCwgY250OwotCVVJTlQ4ICAqYWRkcjsKKwl1OCAgKmFkZHI7CiAKIAlEQkZFTlRFUjsKIApAQCAtMjE2Myw3ICsxOTgwLDcgQEAKICogQ2FsbCBjb250ZXh0OgogKglpbnRlcnJ1cHQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBwcmlzbTJzdGFfZXZfdHhleGMod2xhbmRldmljZV90ICp3bGFuZGV2LCBVSU5UMTYgc3RhdHVzKQordm9pZCBwcmlzbTJzdGFfZXZfdHhleGMod2xhbmRldmljZV90ICp3bGFuZGV2LCB1MTYgc3RhdHVzKQogewogCURCRkVOVEVSOwogCkBAIC0yMTkwLDcgKzIwMDcsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCWludGVycnVwdAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIHByaXNtMnN0YV9ldl90eCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIFVJTlQxNiBzdGF0dXMpCit2b2lkIHByaXNtMnN0YV9ldl90eCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHUxNiBzdGF0dXMpCiB7CiAJREJGRU5URVI7CiAJV0xBTl9MT0dfREVCVUcoNCwgIlR4IENvbXBsZXRlLCBzdGF0dXM9MHglMDR4XG4iLCBzdGF0dXMpOwpAQCAtMjI0Nyw0NyArMjA2NCwxMiBAQAogewogCURCRkVOVEVSOwogCi0JcDgwMjExbmV0ZGV2X3dha2VfcXVldWUod2xhbmRldik7CisJbmV0aWZfd2FrZV9xdWV1ZSh3bGFuZGV2LT5uZXRkZXYpOwogCiAJREJGRVhJVDsKIAlyZXR1cm47CiB9CiAKLSNpZiAoV0xBTl9IT1NUSUYgPT0gV0xBTl9QTFggfHwgV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ0kpCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IHByaXNtMnN0YV9zdXNwZW5kX3BjaShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQotewotICAgICAgIAl3bGFuZGV2aWNlX3QJCSp3bGFuZGV2OwotCi0Jd2xhbmRldiA9ICh3bGFuZGV2aWNlX3QgKikgcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JLyogcmVzZXQgaGFyZHdhcmUgKi8KLQlpZiAod2xhbmRldikgewotCQlwcmlzbTJzdGFfaWZzdGF0ZSh3bGFuZGV2LCBQODAyMTFFTlVNX2lmc3RhdGVfZGlzYWJsZSk7Ci0JCXA4MDIxMV9zdXNwZW5kKHdsYW5kZXYpOwotCX0KLQotCS8vIGNhbGwgYSBuZXRpZl9kZXZpY2VfZGV0YWNoKHdsYW5kZXYtPm5ldGRldikgPwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcHJpc20yc3RhX3Jlc3VtZV9wY2kgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotICAgICAgIAl3bGFuZGV2aWNlX3QJCSp3bGFuZGV2OwotCi0Jd2xhbmRldiA9ICh3bGFuZGV2aWNlX3QgKikgcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JaWYgKHdsYW5kZXYpIHsKLQkJcHJpc20yc3RhX2lmc3RhdGUod2xhbmRldiwgUDgwMjExRU5VTV9pZnN0YXRlX2Rpc2FibGUpOwotCQlwODAyMTFfcmVzdW1lKHdsYW5kZXYpOwotCX0KLQotICAgICAgICByZXR1cm4gMDsKLX0KLSNlbmRpZgotI2VuZGlmCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBjcmVhdGVfd2xhbgogKgpAQCAtMjMzNCw5ICsyMTE2LDYgQEAKIAl3bGFuZGV2LT5vcGVuID0gcHJpc20yc3RhX29wZW47CiAJd2xhbmRldi0+Y2xvc2UgPSBwcmlzbTJzdGFfY2xvc2U7CiAJd2xhbmRldi0+cmVzZXQgPSBwcmlzbTJzdGFfcmVzZXQ7Ci0jaWZkZWYgQ09ORklHX1BST0NfRlMKLQl3bGFuZGV2LT5uc2RfcHJvY19yZWFkID0gcHJpc20yc3RhX3Byb2NfcmVhZDsKLSNlbmRpZgogCXdsYW5kZXYtPnR4ZnJhbWUgPSBwcmlzbTJzdGFfdHhmcmFtZTsKIAl3bGFuZGV2LT5tbG1lcmVxdWVzdCA9IHByaXNtMnN0YV9tbG1lcmVxdWVzdDsKIAl3bGFuZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBwcmlzbTJzdGFfc2V0bXVsdGljYXN0OwpAQCAtMjM1MSw3NSArMjEzMCw2IEBACiAJcmV0dXJuIHdsYW5kZXY7CiB9CiAKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotc3RhdGljIGludAotcHJpc20yc3RhX3Byb2NfcmVhZCgKLQljaGFyCSpwYWdlLAotCWNoYXIJKipzdGFydCwKLQlvZmZfdAlvZmZzZXQsCi0JaW50CWNvdW50LAotCWludAkqZW9mLAotCXZvaWQJKmRhdGEpCi17Ci0JY2hhcgkgKnAgPSBwYWdlOwotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9ICh3bGFuZGV2aWNlX3QgKikgZGF0YTsKLQloZmEzODR4X3QgKmh3ID0gKGhmYTM4NHhfdCAqKSB3bGFuZGV2LT5wcml2OwotCi0JVUlOVDE2IGh3dHlwZSA9IDA7Ci0KLQlEQkZFTlRFUjsKLQlpZiAob2Zmc2V0ICE9IDApIHsKLQkJKmVvZiA9IDE7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQkvLyBYWFggMHgwMDAxIGZvciBwcmlzbTIuNS8zLCAweDAwMDAgZm9yIHByaXNtMi4KLQlod3R5cGUgPSBCSVQwOwotCi0jaWYgKFdMQU5fSE9TVElGICE9IFdMQU5fVVNCKQotCWlmIChody0+aXNyYW0xNikKLQkJaHd0eXBlIHw9IEJJVDE7Ci0jZW5kaWYKLQotI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDSSkKLQlod3R5cGUgfD0gQklUMjsKLSNlbmRpZgotCi0jZGVmaW5lIFBSSVNNMl9DVlNfSUQgIiRJZDogcHJpc20yc3RhLmMgMTgyNiAyMDA3LTAzLTE5IDE1OjM3OjAwWiBwaXp6YSAkIgotCi0JcCArPSBzcHJpbnRmKHAsICIjICVzIHZlcnNpb24gJXMgKCVzKSAnJXMnXG5cbiIsCi0JCSAgICAgZGV2X2luZm8sCi0JCSAgICAgV0xBTl9SRUxFQVNFLCBXTEFOX0JVSUxEX0RBVEUsIFBSSVNNMl9DVlNfSUQpOwotCi0JcCArPSBzcHJpbnRmKHAsICIjIG5pYyBoL3c6IGlkPTB4JTAyeCAlZC4lZC4lZFxuIiwKLQkJICAgICBody0+aWRlbnRfbmljLmlkLCBody0+aWRlbnRfbmljLm1ham9yLAotCQkgICAgIGh3LT5pZGVudF9uaWMubWlub3IsIGh3LT5pZGVudF9uaWMudmFyaWFudCk7Ci0KLQlwICs9IHNwcmludGYocCwgIiMgcHJpIGYvdzogaWQ9MHglMDJ4ICVkLiVkLiVkXG4iLAotCQkgICAgIGh3LT5pZGVudF9wcmlfZncuaWQsIGh3LT5pZGVudF9wcmlfZncubWFqb3IsCi0JCSAgICAgaHctPmlkZW50X3ByaV9mdy5taW5vciwgaHctPmlkZW50X3ByaV9mdy52YXJpYW50KTsKLQotCWlmIChody0+aWRlbnRfc3RhX2Z3LmlkID09IDB4MWYpIHsKLQkJcCArPSBzcHJpbnRmKHAsICIjIHN0YSBmL3c6IGlkPTB4JTAyeCAlZC4lZC4lZFxuIiwKLQkJCSAgICAgaHctPmlkZW50X3N0YV9mdy5pZCwgaHctPmlkZW50X3N0YV9mdy5tYWpvciwKLQkJCSAgICAgaHctPmlkZW50X3N0YV9mdy5taW5vciwgaHctPmlkZW50X3N0YV9mdy52YXJpYW50KTsKLQl9IGVsc2UgewotCQlwICs9IHNwcmludGYocCwgIiMgYXAgZi93OiBpZD0weCUwMnggJWQuJWQuJWRcbiIsCi0JCQkgICAgIGh3LT5pZGVudF9zdGFfZncuaWQsIGh3LT5pZGVudF9zdGFfZncubWFqb3IsCi0JCQkgICAgIGh3LT5pZGVudF9zdGFfZncubWlub3IsIGh3LT5pZGVudF9zdGFfZncudmFyaWFudCk7Ci0JfQotCi0jaWYgKFdMQU5fSE9TVElGICE9IFdMQU5fVVNCKQotCXAgKz0gc3ByaW50ZihwLCAiIyBpbml0aWFsIG5pYyBodyB0eXBlLCBuZWVkZWQgZm9yIFNTRiByYW1kbFxuIik7Ci0JcCArPSBzcHJpbnRmKHAsICJpbml0bmljaHc9JTA0eFxuIiwgaHd0eXBlKTsKLSNlbmRpZgotCi0gZXhpdDoKLQlEQkZFWElUOwotCXJldHVybiAocCAtIHBhZ2UpOwotfQotI2VuZGlmCi0KIHZvaWQgcHJpc20yc3RhX2NvbW1zcXVhbF9kZWZlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmRhdGEpCiB7CiAJaGZhMzg0eF90CQkqaHcgPSBjb250YWluZXJfb2YoZGF0YSwgc3RydWN0IGhmYTM4NHgsIGNvbW1zcXVhbF9iaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJ1c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMnVzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmN2IxZjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJ1c2IuYwpAQCAtMCwwICsxLDMwMiBAQAorI2luY2x1ZGUgImhmYTM4NHhfdXNiLmMiCisjaW5jbHVkZSAicHJpc20ybWdtdC5jIgorI2luY2x1ZGUgInByaXNtMm1pYi5jIgorI2luY2x1ZGUgInByaXNtMnN0YS5jIgorCisjZGVmaW5lIFBSSVNNX1VTQl9ERVZJQ0UodmlkLCBwaWQsIG5hbWUpIFwKKyAgICAgICAgICAgVVNCX0RFVklDRSh2aWQsIHBpZCksICBcCisgICAgICAgICAgIC5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSBuYW1lCisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCB1c2JfcHJpc21fdGJsW10gPSB7CisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgwNGJiLCAweDA5MjIsICJJT0RhdGEgQWlyUG9ydCBXTi1CMTEvVVNCUyIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDA3YWEsIDB4MDAxMiwgIkNvcmVnYSBXaXJlbGVzcyBMQU4gVVNCIFN0aWNrLTExIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MDlhYSwgMHgzNjQyLCAiUHJpc20yLnggMTFNYnBzIFdMQU4gVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgxNjY4LCAweDA0MDgsICJBY3Rpb250ZWMgUHJpc20yLjUgMTFNYnBzIFdMQU4gVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgxNjY4LCAweDA0MjEsICJBY3Rpb250ZWMgUHJpc20yLjUgMTFNYnBzIFdMQU4gVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgxOTE1LCAweDIyMzYsICJMaW5rc3lzIFdVU0IxMXYzLjAgMTFNYnBzIFdMQU4gVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgwNjZiLCAweDIyMTIsICJMaW5rc3lzIFdVU0IxMXYyLjUgMTFNYnBzIFdMQU4gVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgwNjZiLCAweDIyMTMsICJMaW5rc3lzIFdVU0IxMnYxLjEgMTFNYnBzIFdMQU4gVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgwNjdjLCAweDEwMjIsICJTaWVtZW5zIFNwZWVkU3RyZWFtIDEwMjIgMTFNYnBzIFdMQU4gVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgwNDlmLCAweDAwMzMsICJDb21wYXEvSW50ZWwgVzEwMCBQUk8vV2lyZWxlc3MgMTFNYnBzIG11bHRpcG9ydCBXTEFOIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgwNDExLCAweDAwMTYsICJNZWxjbyBXTEktVVNCLVMxMSAxMU1icHMgV0xBTiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MDhkZSwgMHg3YTAxLCAiUFJJU00yNSBJRUVFIDgwMi4xMSBNaW5pIFVTQiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4ODA4NiwgMHgxMTExLCAiSW50ZWwgUFJPL1dpcmVsZXNzIDIwMTFCIExBTiBVU0IgQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDBkOGUsIDB4N2EwMSwgIlBSSVNNMjUgSUVFRSA4MDIuMTEgTWluaSBVU0IgQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDA0NWUsIDB4MDA2ZSwgIk1pY3Jvc29mdCBNTjUxMCBXaXJlbGVzcyBVU0IgQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDA5NjcsIDB4MDIwNCwgIkFjZXIgV2FycGxpbmsgVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgwY2RlLCAweDAwMDIsICJaLUNvbSA3MjUvNzI2IFByaXNtMi41IFVTQi9VU0IgSW50ZWdyYXRlZCIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDBjZGUsIDB4MDAwNSwgIlotQ29tIFhsNzM1IFdpcmVsZXNzIDgwMi4xMWIgVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHg0MTNjLCAweDgxMDAsICJEZWxsIFRydWVNb2JpbGUgMTE4MCBXaXJlbGVzcyBVU0IgQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDBiM2IsIDB4MTYwMSwgIkFMTE5FVCAwMTkzIDExTWJwcyBXTEFOIFVTQiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MGIzYiwgMHgxNjAyLCAiWnlYRUwgWnlBSVIgQjIwMCBXaXJlbGVzcyBVU0IgQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDBiYWYsIDB4MDBlYiwgIlVTUm9ib3RpY3MgVVNSMTEyMCBXaXJlbGVzcyBVU0IgQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDA0MTEsIDB4MDAyNywgIk1lbGNvIFdMSS1VU0ItS1MxMUcgMTFNYnBzIFdMQU4gQWRhcHRlciIpfSwKKyAgICAgICAge1BSSVNNX1VTQl9ERVZJQ0UoMHgwNGYxLCAweDMwMDksICJKVkMgTVAtWFA3MjUwIEJ1aWx0aW4gVVNCIFdMQU4gQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDA4NDYsIDB4NDExMCwgIk5ldEdlYXIgTUExMTEiKX0sCisgICAgICAgIHtQUklTTV9VU0JfREVWSUNFKDB4MDNmMywgMHgwMDIwLCAiQWRhcHRlYyBBV04tODAyMCBVU0IgV0xBTiBBZGFwdGVyIil9LAorLy8Je1BSSVNNX1VTQl9ERVZJQ0UoMHgwYWNlLCAweDEyMDEsICJaeURBUyBaRDEyMDEgV2lyZWxlc3MgVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgyODIxLCAweDMzMDAsICJBU1VTLVdMMTQwIFdpcmVsZXNzIFVTQiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MjAwMSwgMHgzNzAwLCAiRFdMLTEyMiBXaXJlbGVzcyBVU0IgQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDIwMDEsIDB4MzcwMiwgIkRXTC0xMjAgUmV2IEYgV2lyZWxlc3MgVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHg1MGMyLCAweDQwMTMsICJBdmVyYXRlYyBVU0IgV0xBTiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MmMwMiwgMHgxNGVhLCAiUGxhbmV4IEdXLVVTMTFIIFdMQU4gVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgxMjRhLCAweDE2OGIsICJBaXJ2YXN0IFBSSVNNMyBXTEFOIFVTQiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MDgzYSwgMHgzNTAzLCAiVC1TaW51cyAxMTEgVVNCIFdMQU4gQWRhcHRlciIpfSwKKwl7UFJJU01fVVNCX0RFVklDRSgweDI4MjEsIDB4MzMwMCwgIkhhd2tpbmcgSGlnaERCIFVTQiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MDQxMSwgMHgwMDQ0LCAiTWVsY28gV0xJLVVTQi1LQjExIDExTWJwcyBXTEFOIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgxNjY4LCAweDYxMDYsICJST1BFWCBGcmVlTGFuIDgwMi4xMWIgVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgxMjRhLCAweDQwMTcsICJQaGVlbmV0IFdMLTUwM0lBIDgwMi4xMWIgVVNCIEFkYXB0ZXIiKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHgwYmIyLCAweDAzMDIsICJBbWJpdCBNaWNyb3N5c3RlbXMgQ29ycC4iKX0sCisJe1BSSVNNX1VTQl9ERVZJQ0UoMHg5MDE2LCAweDE4MmQsICJTaXRlY29tIFdMLTAyMiA4MDIuMTFiIFVTQiBBZGFwdGVyIil9LAorCXtQUklTTV9VU0JfREVWSUNFKDB4MDU0MywgMHgwZjAxLCAiVmlld1NvbmljIEFpcnN5bmMgVVNCIEFkYXB0ZXIgMTFNYnBzIChQcmlzbTIuNSkiKX0sCisJeyAvKiB0ZXJtaW5hdG9yICovIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCB1c2JfcHJpc21fdGJsKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqIHByaXNtMnN0YV9wcm9iZV91c2IKKyoKKyogUHJvYmUgcm91dGluZSBjYWxsZWQgYnkgdGhlIFVTQiBzdWJzeXN0ZW0uCisqCisqIEFyZ3VtZW50czoKKyoJZGV2CQlwdHIgdG8gdGhlIHVzYl9kZXZpY2Ugc3RydWN0CisqCWlmbnVtCQlpbnRlcmZhY2UgbnVtYmVyIGJlaW5nIG9mZmVyZWQKKyoKKyogUmV0dXJuczoKKyoJTlVMTAkJLSB3ZSdyZSBub3QgY2xhaW1pbmcgdGhlIGRldmljZStpbnRlcmZhY2UKKyoJbm9uLU5VTEwJLSB3ZSBhcmUgY2xhaW1pbmcgdGhlIGRldmljZStpbnRlcmZhY2UgYW5kCisqCQkJICB0aGlzIGlzIGEgcHRyIHRvIHRoZSBkYXRhIHdlIHdhbnQgYmFjaworKgkJCSAgd2hlbiBkaXNjb25uZWN0IGlzIGNhbGxlZC4KKyoKKyogU2lkZSBlZmZlY3RzOgorKgorKiBDYWxsIGNvbnRleHQ6CisqCUknbSBub3Qgc3VyZSwgYXNzdW1lIGl0J3MgaW50ZXJydXB0LgorKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IHByaXNtMnN0YV9wcm9iZV91c2IoCisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSwKKwljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldjsKKworCXdsYW5kZXZpY2VfdAkqd2xhbmRldiA9IE5VTEw7CisJaGZhMzg0eF90CSpodyA9IE5VTEw7CisJaW50ICAgICAgICAgICAgICByZXN1bHQgPSAwOworCisJREJGRU5URVI7CisKKwlkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSk7CisKKwlpZiAoKHdsYW5kZXYgPSBjcmVhdGVfd2xhbigpKSA9PSBOVUxMKSB7CisJCVdMQU5fTE9HX0VSUk9SKCIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZS5cbiIsIGRldl9pbmZvKTsKKwkJcmVzdWx0ID0gLUVJTzsKKwkJZ290byBmYWlsZWQ7CisJfQorCWh3ID0gd2xhbmRldi0+cHJpdjsKKworCWlmICggd2xhbl9zZXR1cCh3bGFuZGV2KSAhPSAwICkgeworCQlXTEFOX0xPR19FUlJPUigiJXM6IHdsYW5fc2V0dXAoKSBmYWlsZWQuXG4iLCBkZXZfaW5mbyk7CisJCXJlc3VsdCA9IC1FSU87CisJCWdvdG8gZmFpbGVkOworCX0KKworCS8qIEluaXRpYWxpemUgdGhlIGh3IGRhdGEgKi8KKwloZmEzODR4X2NyZWF0ZShodywgZGV2KTsKKwlody0+d2xhbmRldiA9IHdsYW5kZXY7CisKKwkvKiBSZWdpc3RlciB0aGUgd2xhbmRldiwgdGhpcyBnZXRzIHVzIGEgbmFtZSBhbmQgcmVnaXN0ZXJzIHRoZQorCSAqIGxpbnV4IG5ldGRldmljZS4KKwkgKi8KKwlTRVRfTkVUREVWX0RFVih3bGFuZGV2LT5uZXRkZXYsICYoaW50ZXJmYWNlLT5kZXYpKTsKKworCS8qIERvIGEgY2hpcC1sZXZlbCByZXNldCBvbiB0aGUgTUFDICovCisJaWYgKHByaXNtMl9kb3Jlc2V0KSB7CisJCXJlc3VsdCA9IGhmYTM4NHhfY29yZXJlc2V0KGh3LAorCQkJCXByaXNtMl9yZXNldF9ob2xkdGltZSwKKwkJCQlwcmlzbTJfcmVzZXRfc2V0dGxldGltZSwgMCk7CisJCWlmIChyZXN1bHQgIT0gMCkgeworCQkJdW5yZWdpc3Rlcl93bGFuZGV2KHdsYW5kZXYpOworCQkJaGZhMzg0eF9kZXN0cm95KGh3KTsKKwkJCXJlc3VsdCA9IC1FSU87CisJCQlXTEFOX0xPR19FUlJPUigKKwkJCQkiJXM6IGhmYTM4NHhfY29yZXJlc2V0KCkgZmFpbGVkLlxuIiwKKwkJCQlkZXZfaW5mbyk7CisJCQlnb3RvIGZhaWxlZDsKKwkJfQorCX0KKworCXVzYl9nZXRfZGV2KGRldik7CisKKwl3bGFuZGV2LT5tc2RzdGF0ZSA9IFdMQU5fTVNEX0hXUFJFU0VOVDsKKworICAgICAgICBpZiAoIHJlZ2lzdGVyX3dsYW5kZXYod2xhbmRldikgIT0gMCApIHsKKwkJV0xBTl9MT0dfRVJST1IoIiVzOiByZWdpc3Rlcl93bGFuZGV2KCkgZmFpbGVkLlxuIiwgZGV2X2luZm8pOworCQlyZXN1bHQgPSAtRUlPOworCQlnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorCisvKiBlbmFibGUgdGhlIGNhcmQgKi8KKwlwcmlzbTJzdGFfaWZzdGF0ZSh3bGFuZGV2LCBQODAyMTFFTlVNX2lmc3RhdGVfZW5hYmxlKTsKKworCWdvdG8gZG9uZTsKKworIGZhaWxlZDoKKwlpZiAod2xhbmRldikJa2ZyZWUod2xhbmRldik7CisJaWYgKGh3KQkJa2ZyZWUoaHcpOworCXdsYW5kZXYgPSBOVUxMOworCisgZG9uZToKKwlEQkZFWElUOworCisJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIHdsYW5kZXYpOworCXJldHVybiByZXN1bHQ7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqIHByaXNtMnN0YV9kaXNjb25uZWN0X3VzYgorKgorKiBDYWxsZWQgd2hlbiBhIGRldmljZSBwcmV2aW91c2x5IGNsYWltZWQgYnkgcHJvYmUgaXMgcmVtb3ZlZAorKiBmcm9tIHRoZSBVU0IuCisqCisqIEFyZ3VtZW50czoKKyoJZGV2CQlwdHIgdG8gdGhlIHVzYl9kZXZpY2Ugc3RydWN0CisqCXB0cgkJcHRyIHJldHVybmVkIGJ5IHByb2JlKCkgd2hlbiB0aGUgZGV2aWNlCisqICAgICAgICAgICAgICAgICAgICAgICB3YXMgY2xhaW1lZC4KKyoKKyogUmV0dXJuczoKKyoJTm90aGluZworKgorKiBTaWRlIGVmZmVjdHM6CisqCisqIENhbGwgY29udGV4dDoKKyoJcHJvY2VzcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZAorcHJpc20yc3RhX2Rpc2Nvbm5lY3RfdXNiKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCit7CisJd2xhbmRldmljZV90CQkqd2xhbmRldjsKKworICAgICAgICBEQkZFTlRFUjsKKworCXdsYW5kZXYgPSAod2xhbmRldmljZV90ICopIHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKKworCWlmICggd2xhbmRldiAhPSBOVUxMICkgeworCQlMSVNUX0hFQUQoY2xlYW5saXN0KTsKKwkJc3RydWN0IGxpc3RfaGVhZAkqZW50cnk7CisJCXN0cnVjdCBsaXN0X2hlYWQJKnRlbXA7CisJCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCisJCWhmYTM4NHhfdAkJKmh3ID0gd2xhbmRldi0+cHJpdjsKKworCQlpZiAoIWh3KQorCQkJZ290byBleGl0OworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZody0+Y3RseHEubG9jaywgZmxhZ3MpOworCisJCXA4MDIxMW5ldGRldl9od3JlbW92ZWQod2xhbmRldik7CisJCWxpc3Rfc3BsaWNlX2luaXQoJmh3LT5jdGx4cS5yZWFwYWJsZSwgJmNsZWFubGlzdCk7CisJCWxpc3Rfc3BsaWNlX2luaXQoJmh3LT5jdGx4cS5jb21wbGV0aW5nLCAmY2xlYW5saXN0KTsKKwkJbGlzdF9zcGxpY2VfaW5pdCgmaHctPmN0bHhxLnBlbmRpbmcsICZjbGVhbmxpc3QpOworCQlsaXN0X3NwbGljZV9pbml0KCZody0+Y3RseHEuYWN0aXZlLCAmY2xlYW5saXN0KTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+Y3RseHEubG9jaywgZmxhZ3MpOworCisJCS8qIFRoZXJlJ3Mgbm8gaGFyZHdhcmUgdG8gc2h1dGRvd24sIGJ1dCB0aGUgZHJpdmVyCisJCSAqIG1pZ2h0IGhhdmUgc29tZSB0YXNrcyBvciB0YXNrbGV0cyB0aGF0IG11c3QgYmUKKwkJICogc3RvcHBlZCBiZWZvcmUgd2UgY2FuIHRlYXIgZXZlcnl0aGluZyBkb3duLgorCQkgKi8KKwkJcHJpc20yc3RhX2lmc3RhdGUod2xhbmRldiwgUDgwMjExRU5VTV9pZnN0YXRlX2Rpc2FibGUpOworCisJCWRlbF9zaW5nbGVzaG90X3RpbWVyX3N5bmMoJmh3LT50aHJvdHRsZSk7CisJCWRlbF9zaW5nbGVzaG90X3RpbWVyX3N5bmMoJmh3LT5yZXF0aW1lcik7CisJCWRlbF9zaW5nbGVzaG90X3RpbWVyX3N5bmMoJmh3LT5yZXNwdGltZXIpOworCisJCS8qIFVubGluayBhbGwgdGhlIFVSQnMuIFRoaXMgInJlbW92ZXMgdGhlIHdoZWVscyIKKwkJICogZnJvbSB0aGUgZW50aXJlIENUTFggaGFuZGxpbmcgbWVjaGFuaXNtLgorCQkgKi8KKwkJdXNiX2tpbGxfdXJiKCZody0+cnhfdXJiKTsKKwkJdXNiX2tpbGxfdXJiKCZody0+dHhfdXJiKTsKKwkJdXNiX2tpbGxfdXJiKCZody0+Y3RseF91cmIpOworCisJCXRhc2tsZXRfa2lsbCgmaHctPmNvbXBsZXRpb25fYmgpOworCQl0YXNrbGV0X2tpbGwoJmh3LT5yZWFwZXJfYmgpOworCisJCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisKKwkJLyogTm93IHdlIGNvbXBsZXRlIGFueSBvdXRzdGFuZGluZyBjb21tYW5kcworCQkgKiBhbmQgdGVsbCBldmVyeW9uZSB3aG8gaXMgd2FpdGluZyBmb3IgdGhlaXIKKwkJICogcmVzcG9uc2VzIHRoYXQgd2UgaGF2ZSBzaHV0IGRvd24uCisJCSAqLworCQlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmY2xlYW5saXN0KSB7CisJCQloZmEzODR4X3VzYmN0bHhfdAkqY3RseDsKKworCQkJY3RseCA9IGxpc3RfZW50cnkoZW50cnksIGhmYTM4NHhfdXNiY3RseF90LCBsaXN0KTsKKwkJCWNvbXBsZXRlKCZjdGx4LT5kb25lKTsKKwkJfQorCisJCS8qIEdpdmUgYW55IG91dHN0YW5kaW5nIHN5bmNocm9ub3VzIGNvbW1hbmRzCisJCSAqIGEgY2hhbmNlIHRvIGNvbXBsZXRlLiBBbGwgdGhleSBuZWVkIHRvIGRvCisJCSAqIGlzICJ3YWtlIHVwIiwgc28gdGhhdCdzIGVhc3kuCisJCSAqIChJJ2QgbGlrZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcywgcmVhbGx5LikKKwkJICovCisJCW1zbGVlcCgxMDApOworCisJCS8qIE5vdyBkZWxldGUgdGhlIENUTFhzLCBiZWNhdXNlIG5vLW9uZSBlbHNlIGNhbiBub3cuICovCisJCWxpc3RfZm9yX2VhY2hfc2FmZShlbnRyeSwgdGVtcCwgJmNsZWFubGlzdCkgeworCQkJaGZhMzg0eF91c2JjdGx4X3QgKmN0bHg7CisKKwkJCWN0bHggPSBsaXN0X2VudHJ5KGVudHJ5LCBoZmEzODR4X3VzYmN0bHhfdCwgbGlzdCk7CisJCQlrZnJlZShjdGx4KTsKKwkJfQorCisJCS8qIFVuaG9vayB0aGUgd2xhbmRldiAqLworCQl1bnJlZ2lzdGVyX3dsYW5kZXYod2xhbmRldik7CisJCXdsYW5fdW5zZXR1cCh3bGFuZGV2KTsKKworCQl1c2JfcHV0X2Rldihody0+dXNiKTsKKworCQloZmEzODR4X2Rlc3Ryb3koaHcpOworCQlrZnJlZShodyk7CisKKwkJa2ZyZWUod2xhbmRldik7CisJfQorCisgZXhpdDoKKworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKKwlEQkZFWElUOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBwcmlzbTJfdXNiX2RyaXZlciA9IHsKKwkubmFtZSA9ICJwcmlzbTJfdXNiIiwKKwkucHJvYmUgPSBwcmlzbTJzdGFfcHJvYmVfdXNiLAorCS5kaXNjb25uZWN0ID0gcHJpc20yc3RhX2Rpc2Nvbm5lY3RfdXNiLAorCS5pZF90YWJsZSA9IHVzYl9wcmlzbV90YmwsCisJLyogZm9wcywgbWlub3I/ICovCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwcmlzbTJ1c2JfaW5pdCh2b2lkKQoreworICAgICAgICBEQkZFTlRFUjsKKworCS8qIFRoaXMgY2FsbCB3aWxsIHJlc3VsdCBpbiBjYWxscyB0byBwcmlzbTJzdGFfcHJvYmVfdXNiLiAqLworCXJldHVybiB1c2JfcmVnaXN0ZXIoJnByaXNtMl91c2JfZHJpdmVyKTsKKworCURCRkVYSVQ7Cit9OworCitzdGF0aWMgdm9pZCBfX2V4aXQgcHJpc20ydXNiX2NsZWFudXAodm9pZCkKK3sKKyAgICAgICAgREJGRU5URVI7CisKKwl1c2JfZGVyZWdpc3RlcigmcHJpc20yX3VzYl9kcml2ZXIpOworCisJREJGRVhJVDsKK307CisKK21vZHVsZV9pbml0KHByaXNtMnVzYl9pbml0KTsKK21vZHVsZV9leGl0KHByaXNtMnVzYl9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ZlcnNpb24uaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ZlcnNpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA1Zjg4Mi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy92ZXJzaW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKiBzcmMvaW5jbHVkZS93bGFuL3ZlcnNpb24uaAotKgotKgotKiBDb3B5cmlnaHQgKEMpIDE5OTkgQWJzb2x1dGVWYWx1ZSBTeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKgotKiBsaW51eC13bGFuCi0qCi0qICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMKLSogICBMaWNlbnNlIFZlcnNpb24gMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwotKgotKiAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUwotKiAgIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlCi0qICAgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKHRoZSAiR1BMIiksIGluIHdoaWNoCi0qICAgY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhlCi0qICAgYWJvdmUuICBJZiB5b3Ugd2lzaCB0byBhbGxvdyB0aGUgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUKLSogICBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZQotKiAgIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIE1QTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbgotKiAgIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCi0qICAgYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTC4gIElmIHlvdSBkbyBub3QgZGVsZXRlCi0qICAgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMKLSogICBmaWxlIHVuZGVyIGVpdGhlciB0aGUgTVBMIG9yIHRoZSBHUEwuCi0qCi0qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qCi0qIElucXVpcmllcyByZWdhcmRpbmcgdGhlIGxpbnV4LXdsYW4gT3BlbiBTb3VyY2UgcHJvamVjdCBjYW4gYmUKLSogbWFkZSBkaXJlY3RseSB0bzoKLSoKLSogQWJzb2x1dGVWYWx1ZSBTeXN0ZW1zIEluYy4KLSogaW5mb0BsaW51eC13bGFuLmNvbQotKiBodHRwOi8vd3d3LmxpbnV4LXdsYW4uY29tCi0qCi0qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qCi0qIFBvcnRpb25zIG9mIHRoZSBkZXZlbG9wbWVudCBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgZnVuZGVkIGJ5Ci0qIEludGVyc2lsIENvcnBvcmF0aW9uIGFzIHBhcnQgb2YgUFJJU00oUikgY2hpcHNldCBwcm9kdWN0IGRldmVsb3BtZW50LgotKgotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLSNpZm5kZWYgX1dMQU5fVkVSU0lPTl9ICi0jZGVmaW5lIF9XTEFOX1ZFUlNJT05fSAotI2lmbmRlZiBLRVJORUxfVkVSU0lPTgotI2RlZmluZSBLRVJORUxfVkVSU0lPTihhLGIsYykgKCgoYSkgPDwgMTYpICsgKChiKSA8PCA4KSArIChjKSkKLSNlbmRpZgotCi0vKiBXTEFOX0hPU1RJRiAoZ2VuZXJhbGx5IHNldCBvbiB0aGUgY29tbWFuZCBsaW5lLCBub3QgZGV0ZWN0ZWQpICovCi0jZGVmaW5lIFdMQU5fTk9ORSAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBXTEFOX1BDTUNJQSAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgV0xBTl9JU0EgICAgICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIFdMQU5fUENJICAgICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBXTEFOX1VTQiAgICAgICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgV0xBTl9QTFggICAgICAgICAgICAgICAgICAgICAgICA1Ci0jZGVmaW5lIFdMQU5fU0xBVkUgICAgICAgICAgICAgICAgICAgICAgNgotI2RlZmluZSBXTEFOX1JFTEVBU0UJIjAuMi44IgotI2RlZmluZSBXTEFOX1JFTEVBU0VfQ09ERSAweDAwMDIwOAotI2RlZmluZSBXTEFOX0JVSUxEX0RBVEUgIlRodSBPY3QgIDIgMTE6MDQ6NDIgUERUIDIwMDgiCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvd2xhbl9jb21wYXQuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3dsYW5fY29tcGF0LmgKaW5kZXggNTlkZmE4Zi4uOGI4YTUxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvd2xhbl9jb21wYXQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy93bGFuX2NvbXBhdC5oCkBAIC00OSwxMTQgKzQ5LDYgQEAKICNkZWZpbmUgX1dMQU5fQ09NUEFUX0gKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qLS0tLS0tIEVzdGFibGlzaCBQbGF0Zm9ybSBJZGVudGl0eSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogS2V5IG1hY3JvczogKi8KLS8qIFdMQU5fQ1BVX0ZBTUlMWSAqLwotCSNkZWZpbmUgV0xBTl9JeDg2CQkJMQotCSNkZWZpbmUgV0xBTl9QUEMJCQkyCi0JI2RlZmluZSBXTEFOX0l4OTYJCQkzCi0JI2RlZmluZSBXTEFOX0FSTQkJCTQKLQkjZGVmaW5lIFdMQU5fQUxQSEEJCQk1Ci0JI2RlZmluZSBXTEFOX01JUFMJCQk2Ci0JI2RlZmluZSBXTEFOX0hQUEEJCQk3Ci0JI2RlZmluZSBXTEFOX1NQQVJDCQkJOAotCSNkZWZpbmUgV0xBTl9TSCAgICAJCQk5Ci0JI2RlZmluZSBXTEFOX3g4Nl82NCAgICAgICAgICAgICAgICAgICAgIDEwCi0vKiBXTEFOX1NZU0FSQ0ggKi8KLQkjZGVmaW5lIFdMQU5fUENBVAkJCTEKLQkjZGVmaW5lIFdMQU5fTUJYCQkJMgotCSNkZWZpbmUgV0xBTl9SUFgJCQkzCi0JI2RlZmluZSBXTEFOX0xXQVJDSAkJCTQKLQkjZGVmaW5lIFdMQU5fUE1BQwkJCTUKLQkjZGVmaW5lIFdMQU5fU0tJRkYJCQk2Ci0JI2RlZmluZSBXTEFOX0JJVFNZCQkJNwotCSNkZWZpbmUgV0xBTl9BTFBIQUFSQ0gJCQk3Ci0JI2RlZmluZSBXTEFOX01JUFNBUkNICQkJOQotCSNkZWZpbmUgV0xBTl9IUFBBQVJDSAkJCTEwCi0JI2RlZmluZSBXTEFOX1NQQVJDQVJDSAkJCTExCi0JI2RlZmluZSBXTEFOX1NIQVJDSCAgIAkJCTEyCi0KLS8qIE5vdGU6IHRoZSBQTFggSE9TVElGIGFib3ZlIHJlZmVycyB0byBzb21lIHZlbmRvcnMgaW1wbGVtZW50YXRpb25zIGZvciAqLwotLyogICAgICAgUENJLiAgSXQncyBhIFBMWCBjaGlwIHRoYXQgaXMgYSBQQ0kgdG8gUENNQ0lBIGFkYXB0ZXIsIGJ1dCBpdCAgICovCi0vKiAgICAgICBpc24ndCBhIHJlYWwgUENNQ0lBIGhvc3QgaW50ZXJmYWNlIGFkYXB0ZXIgcHJvdmlkaW5nIGFsbCB0aGUgICAgKi8KLS8qICAgICAgIGNhcmQmc29ja2V0IHNlcnZpY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jaWYgKGRlZmluZWQoQ09ORklHX1BQQykgfHwgZGVmaW5lZChDT05GSUdfOHh4KSB8fCBkZWZpbmVkKF9fcG93ZXJwY19fKSkKLSNpZm5kZWYgX19wcGNfXwotI2RlZmluZSBfX3BwY19fCi0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX0tFUk5FTF9fKQotCi0jaWZuZGVmIEFVVE9DT05GX0lOQ0xVREVECi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoX194ODZfNjRfXykKLQkjZGVmaW5lIFdMQU5fQ1BVX0ZBTUlMWQkJV0xBTl94ODZfNjQKLQkjZGVmaW5lIFdMQU5fU1lTQVJDSAkJV0xBTl9QQ0FUCi0jZWxpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9faTQ4Nl9fKSB8fCBkZWZpbmVkKF9faTU4Nl9fKSB8fCBkZWZpbmVkKF9faTY4Nl9fKQotCSNkZWZpbmUgV0xBTl9DUFVfRkFNSUxZCQlXTEFOX0l4ODYKLQkjZGVmaW5lIFdMQU5fU1lTQVJDSAkJV0xBTl9QQ0FUCi0jZWxpZiBkZWZpbmVkKF9fcHBjX18pCi0JI2RlZmluZSBXTEFOX0NQVV9GQU1JTFkJCVdMQU5fUFBDCi0JI2lmIGRlZmluZWQoQ09ORklHX01CWCkKLQkJI2RlZmluZSBXTEFOX1NZU0FSQ0gJV0xBTl9NQlgKLQkjZWxpZiBkZWZpbmVkKENPTkZJR19SUFhMSVRFKQotCQkjZGVmaW5lIFdMQU5fU1lTQVJDSAlXTEFOX1JQWAotCSNlbGlmIGRlZmluZWQoQ09ORklHX1JQWENMQVNTSUMpCi0JCSNkZWZpbmUgV0xBTl9TWVNBUkNICVdMQU5fUlBYCi0JI2Vsc2UKLQkJI2RlZmluZSBXTEFOX1NZU0FSQ0gJV0xBTl9QTUFDCi0JI2VuZGlmCi0jZWxpZiBkZWZpbmVkKF9fYXJtX18pCi0JI2RlZmluZSBXTEFOX0NQVV9GQU1JTFkJCVdMQU5fQVJNCi0JI2RlZmluZSBXTEFOX1NZU0FSQ0gJCVdMQU5fU0tJRkYKLSNlbGlmIGRlZmluZWQoX19hbHBoYV9fKQotCSNkZWZpbmUgV0xBTl9DUFVfRkFNSUxZCQlXTEFOX0FMUEhBCi0JI2RlZmluZSBXTEFOX1NZU0FSQ0gJCVdMQU5fQUxQSEFBUkNICi0jZWxpZiBkZWZpbmVkKF9fbWlwc19fKQotCSNkZWZpbmUgV0xBTl9DUFVfRkFNSUxZCQlXTEFOX01JUFMKLQkjZGVmaW5lIFdMQU5fU1lTQVJDSAkJV0xBTl9NSVBTQVJDSAotI2VsaWYgZGVmaW5lZChfX2hwcGFfXykKLQkjZGVmaW5lIFdMQU5fQ1BVX0ZBTUlMWQkJV0xBTl9IUFBBCi0JI2RlZmluZSBXTEFOX1NZU0FSQ0gJCVdMQU5fSFBQQUFSQ0gKLSNlbGlmIGRlZmluZWQoX19zcGFyY19fKQotICAgICAgICAjZGVmaW5lIFdMQU5fQ1BVX0ZBTUlMWSAgICAgICAgIFdMQU5fU1BBUkMKLSAgICAgICAgI2RlZmluZSBXTEFOX1NZU0FSQ0ggICAgICAgICAgICBXTEFOX1NQQVJDCi0jZWxpZiBkZWZpbmVkKF9fc2hfXykKLSAgICAgICAgI2RlZmluZSBXTEFOX0NQVV9GQU1JTFkgICAgICAgICBXTEFOX1NICi0gICAgICAgICNkZWZpbmUgV0xBTl9TWVNBUkNIICAgICAgICAgICAgV0xBTl9TSEFSQ0gKLSAgICAgICAgI2lmbmRlZiBfX0xJVFRMRV9FTkRJQU5fXwotICAgICAgICAjZGVmaW5lIF9fTElUVExFX0VORElBTl9fCi0gICAgICAgICNlbmRpZgotI2Vsc2UKLQkjZXJyb3IgIk5vIENQVSBpZGVudGlmaWVkISIKLSNlbmRpZgotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQotLyoKLSAgIFNvbWUgYmlnIGVuZGlhbiBtYWNoaW5lcyBpbXBsaWNpdGx5IGRvIGFsbCBJL08gaW4gbGl0dGxlIGVuZGlhbiBtb2RlLgotCi0gICBJbiBwYXJ0aWN1bGFyOgotICAgICAgICAgIExpbnV4L1BQQyBvbiBQb3dlck1hY3MgKFBDSSkKLQkgIEFybS9JbnRlbCBYc2NhbGUgKFBDSSkKLQotICAgVGhpcyBtYXkgYWxzbyBhZmZlY3QgUExYIGJvYXJkcyBhbmQgb3RoZXIgQkUgJnwgUFBDIHBsYXRmb3JtczsKLSAgIGFzIG5ldyBvbmVzIGFyZSBkaXNjb3ZlcmVkLCBhZGQgdGhlbSBiZWxvdy4KLSovCi0KLSNpZiBkZWZpbmVkKFdMQU5fSE9TVElGKQotI2lmICgoV0xBTl9IT1NUSUYgPT0gV0xBTl9QQ0kpIHx8IChXTEFOX0hPU1RJRiA9PSBXTEFOX1BMWCkpCi0jaWYgKChXTEFOX1NZU0FSQ0ggPT0gV0xBTl9TS0lGRikgfHwgKFdMQU5fU1lTQVJDSCA9PSBXTEFOX1BNQUMpIHx8IChXTEFOX1NZU0FSQ0ggPT0gV0xBTl9TUEFSQykpCi0jZGVmaW5lIFJFVkVSU0VfRU5ESUFOCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKi0tLS0tLSBCaXQgc2V0dGluZ3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIApAQCAtMTkzLDMwICs4NSw2IEBACiAjZGVmaW5lIEJJVDMwCTB4NDAwMDAwMDAKICNkZWZpbmUgQklUMzEJMHg4MDAwMDAwMAogCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQotdHlwZWRlZiB1X2ludDhfdAlVSU5UODsKLXR5cGVkZWYgdV9pbnQxNl90CVVJTlQxNjsKLXR5cGVkZWYgdV9pbnQzMl90CVVJTlQzMjsKLQotdHlwZWRlZiBpbnQ4X3QJCUlOVDg7Ci10eXBlZGVmIGludDE2X3QJCUlOVDE2OwotdHlwZWRlZiBpbnQzMl90CQlJTlQzMjsKLQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgVUlOVDsKLXR5cGVkZWYgc2lnbmVkIGludCAgICAgIElOVDsKLQotdHlwZWRlZiB1X2ludDY0X3QJVUlOVDY0OwotdHlwZWRlZiBpbnQ2NF90CQlJTlQ2NDsKLQotI2RlZmluZSBVSU5UOF9NQVgJKDB4ZmZVTCkKLSNkZWZpbmUgVUlOVDE2X01BWAkoMHhmZmZmVUwpCi0jZGVmaW5lIFVJTlQzMl9NQVgJKDB4ZmZmZmZmZmZVTCkKLQotI2RlZmluZSBJTlQ4X01BWAkoMHg3ZkwpCi0jZGVmaW5lIElOVDE2X01BWAkoMHg3ZmZmTCkKLSNkZWZpbmUgSU5UMzJfTUFYCSgweDdmZmZmZmZmTCkKLQogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qLS0tLS0tIENvbXBpbGVyIFBvcnRhYmlsaXR5IE1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpAQCAtMjMwLDIwICs5OCw5IEBACiAjZGVmaW5lIFdMQU5fREJWQVIJd2xhbl9kZWJ1ZwogI2VuZGlmCiAKLSNpZm5kZWYgS0VSTkVMX1ZFUlNJT04KLSNkZWZpbmUgS0VSTkVMX1ZFUlNJT04oYSxiLGMpICgoKGEpIDw8IDE2KSArICgoYikgPDwgOCkgKyAoYykpCi0jZW5kaWYKKyNkZWZpbmUgV0xBTl9SRUxFQVNFCSIwLjMuMC1sa21sIgogCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkpCi0jICBpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDgpKQotIyAgICBpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+Ci0jICBlbHNlCi0jICAgIGluY2x1ZGUgPGFzbS9oYXJkaXJxLmg+Ci0jICBlbmRpZgotI2VsaWYgZGVmaW5lZChfX0tFUk5FTF9fKQotIyAgZGVmaW5lIFBSRUVNUFRfTUFTSyAgKDB4MDAwMDAwRkZVTCkKLSMgIGRlZmluZSBwcmVlbXB0X2NvdW50KCkgKDBVTCkKLSNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KIAogI2RlZmluZSBXTEFOX0xPR19FUlJPUih4LGFyZ3MuLi4pIHByaW50ayhLRVJOX0VSUiAiJXM6ICIgeCAsIF9fZnVuY19fICwgIyNhcmdzKTsKIApAQCAtMjU0LDIwICsxMTEsMTcgQEAKICNkZWZpbmUgV0xBTl9MT0dfSU5GTyhhcmdzLi4uICkgcHJpbnRrKEtFUk5fSU5GTyBhcmdzKQogCiAjaWYgZGVmaW5lZChXTEFOX0lOQ0xVREVfREVCVUcpCi0JI2RlZmluZSBXTEFOX0FTU0VSVChjKSBpZiAoKCEoYykpICYmIFdMQU5fREJWQVIgPj0gMSkgeyBcCi0JCVdMQU5fTE9HX0RFQlVHKDEsICJBc3NlcnRpb24gZmFpbHVyZSFcbiIpOyB9CiAJI2RlZmluZSBXTEFOX0hFWF9EVU1QKCBsLCB4LCBwLCBuKQlpZiggV0xBTl9EQlZBUiA+PSAobCkgKXsgXAogCQlpbnQgX19pX187IFwKIAkJcHJpbnRrKEtFUk5fREVCVUcgeCAiOiIpOyBcCiAJCWZvciggX19pX189MDsgX19pX18gPCAobik7IF9faV9fKyspIFwKLQkJCXByaW50ayggIiAlMDJ4IiwgKChVSU5UOCopKHApKVtfX2lfX10pOyBcCisJCQlwcmludGsoICIgJTAyeCIsICgodTgqKShwKSlbX19pX19dKTsgXAogCQlwcmludGsoIlxuIik7IH0KIAkjZGVmaW5lIERCRkVOVEVSIHsgaWYgKCBXTEFOX0RCVkFSID49IDUgKXsgV0xBTl9MT0dfREVCVUcoMywiLS0tLT5cbiIpOyB9IH0KIAkjZGVmaW5lIERCRkVYSVQgIHsgaWYgKCBXTEFOX0RCVkFSID49IDUgKXsgV0xBTl9MT0dfREVCVUcoMywiPC0tLS1cbiIpOyB9IH0KIAogCSNkZWZpbmUgV0xBTl9MT0dfREVCVUcobCx4LGFyZ3MuLi4pIGlmICggV0xBTl9EQlZBUiA+PSAobCkpIHByaW50ayhLRVJOX0RFQlVHICIlcyglbHUpOiAiIHggLCAgX19mdW5jX18sIChwcmVlbXB0X2NvdW50KCkgJiBQUkVFTVBUX01BU0spLCAjI2FyZ3MgKTsKICNlbHNlCi0JI2RlZmluZSBXTEFOX0FTU0VSVChjKQogCSNkZWZpbmUgV0xBTl9IRVhfRFVNUCggbCwgcywgcCwgbikKIAkjZGVmaW5lIERCRkVOVEVSCiAJI2RlZmluZSBEQkZFWElUCkBAIC0yNzUsNDEzICsxMjksMTEgQEAKIAkjZGVmaW5lIFdMQU5fTE9HX0RFQlVHKGwsIHMsIGFyZ3MuLi4pCiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19TTVAKLSNkZWZpbmUgX19TTVBfXwkJCTEKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX0tFUk5FTF9fKQotCi0jaWYgKChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpIHx8IChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDE5KSkpCi0jZGVmaW5lIFVSQl9PTkxZX0NBTExCQUNLCi0jZW5kaWYKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMTkpKQotI2RlZmluZSBQVF9SRUdTICAgICwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MKLSNlbHNlCi0jZGVmaW5lIFBUX1JFR1MKLSNlbmRpZgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiw3KSkKLSMgIGRlZmluZSBkZWxfc2luZ2xlc2hvdF90aW1lcl9zeW5jKGEpICBkZWxfdGltZXJfc3luYyhhKQotI2VuZGlmCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNCwxNykpCi0jZGVmaW5lIENPTkZJR19ORVRMSU5LCQkxCi0jZW5kaWYKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw0LDApKQotI2RlZmluZSBrZnJlZV9zKGEsIGIpCWtmcmVlKChhKSkKLSNlbmRpZgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsMiwxOCkpCi0jaWZuZGVmIGluaXRfd2FpdHF1ZXVlX2hlYWQKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwwLDE2KSkKLSNkZWZpbmUgaW5pdF93YWl0cXVldWVfaGVhZChwKSAgKCoocCkgPSBOVUxMKQotI2Vsc2UKLSNkZWZpbmUgaW5pdF93YWl0cXVldWVfaGVhZChwKSAgaW5pdF93YWl0cXVldWUocCkKLSNlbmRpZgotdHlwZWRlZiBzdHJ1Y3Qgd2FpdF9xdWV1ZSAqd2FpdF9xdWV1ZV9oZWFkX3Q7Ci10eXBlZGVmIHN0cnVjdCB3YWl0X3F1ZXVlIHdhaXRfcXVldWVfdDsKLSNkZWZpbmUgc2V0X2N1cnJlbnRfc3RhdGUoYikgIHsgY3VycmVudC0+c3RhdGUgPSAoYik7IG1iKCk7IH0KLSNkZWZpbmUgaW5pdF93YWl0cXVldWVfZW50cnkoYSwgYikgeyAoYSktPnRhc2sgPSBjdXJyZW50OyB9Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0Ci0vLyByZXR2YWwgPT0gMDsgc2lnbmFsIG1ldDsgd2UncmUgZ29vZC4KLS8vIHJldHZhbCA8IDA7IGludGVycnVwdGVkIGJ5IHNpZ25hbC4KLS8vIHJldHZhbCA+IDA7IHRpbWVkIG91dC4KLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw0LDApKSAgLy8gZml4bWU/Ci0KLSNkZWZpbmUgX193YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh3cSwgY29uZGl0aW9uLCByZXQpICAgICAgICAgICAgXAotZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgd2FpdF9xdWV1ZV90IF9fd2FpdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpbml0X3dhaXRxdWV1ZV9lbnRyeSgmX193YWl0LCBjdXJyZW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBhZGRfd2FpdF9xdWV1ZSgmd3EsICZfX3dhaXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGZvciAoOzspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICBzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOyAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgIGlmIChjb25kaXRpb24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICBpZiAoIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gc2NoZWR1bGVfdGltZW91dChyZXQpICAgIDsgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJldCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICByZXQgPSAtRVJFU1RBUlRTWVM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICByZW1vdmVfd2FpdF9xdWV1ZSgmd3EsICZfX3dhaXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfSB3aGlsZSAoMCkKLQotI2Vsc2UgLy8gMi4yCi0KLQotI2RlZmluZSBfX3dhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHdxLCBjb25kaXRpb24sIHJldCkgICAgICAgICAgXAotZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBzdHJ1Y3Qgd2FpdF9xdWV1ZSBfX3dhaXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBfX3dhaXQudGFzayA9IGN1cnJlbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBhZGRfd2FpdF9xdWV1ZSgmd3EsICZfX3dhaXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBmb3IgKDs7KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIGN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOyAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIGlmIChjb25kaXRpb24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIGlmICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gc2NoZWR1bGVfdGltZW91dChyZXQpOyAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIHJldCA9IC1FUkVTVEFSVFNZUzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBjdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICByZW1vdmVfd2FpdF9xdWV1ZSgmd3EsICZfX3dhaXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfSB3aGlsZSAoMCkKLQotI2VuZGlmICAvLyB2ZXJzaW9uID49IDIuNAotCi0jZGVmaW5lIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHdxLCBjb25kaXRpb24sIHRpbWVvdXQpCSAgXAotKHsJCQkJCQkJCQkgIFwKLQlsb25nIF9fcmV0ID0gdGltZW91dDsJCQkJCQkgIFwKLQlpZiAoIShjb25kaXRpb24pKQkJCQkJCSAgXAotCQlfX3dhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHdxLCBjb25kaXRpb24sIF9fcmV0KTsgXAotCV9fcmV0OwkJCQkJCQkJICBcCi19KQotCi0jZW5kaWYKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDQsMjApKQotI2lmZGVmIF9MSU5VWF9MSVNUX0gKLQotc3RhdGljIGlubGluZSB2b2lkIGxpc3RfbW92ZV90YWlsKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCi0gICAgICAgICAgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKLXsKLSAgICAgICAgX19saXN0X2RlbChsaXN0LT5wcmV2LCBsaXN0LT5uZXh0KTsKLSAgICAgICAgbGlzdF9hZGRfdGFpbChsaXN0LCBoZWFkKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9fbGlzdF9zcGxpY2Uoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwKLQkJCQkgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKLXsKLSAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmZpcnN0ID0gbGlzdC0+bmV4dDsKLSAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmxhc3QgPSBsaXN0LT5wcmV2OwotICAgICAgc3RydWN0IGxpc3RfaGVhZCAqYXQgPSBoZWFkLT5uZXh0OwotCi0gICAgICBmaXJzdC0+cHJldiA9IGhlYWQ7Ci0gICAgICBoZWFkLT5uZXh0ID0gZmlyc3Q7Ci0KLSAgICAgIGxhc3QtPm5leHQgPSBhdDsKLSAgICAgIGF0LT5wcmV2ID0gbGFzdDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGxpc3RfbW92ZShzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQotewotICAgICAgX19saXN0X2RlbChsaXN0LT5wcmV2LCBsaXN0LT5uZXh0KTsKLSAgICAgIGxpc3RfYWRkKGxpc3QsIGhlYWQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9zcGxpY2VfaW5pdChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LAotICAgICAgICAgICAgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKLXsKLQlpZiAoIWxpc3RfZW1wdHkobGlzdCkpIHsKLQkJX19saXN0X3NwbGljZShsaXN0LCBoZWFkKTsKLQkJSU5JVF9MSVNUX0hFQUQobGlzdCk7Ci0JfQotfQotCi0KLSNlbmRpZiAgLy8gTElTVF9ICi0jZW5kaWYKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDEsOTApKQotI2RlZmluZSBzcGluX2xvY2sobCkgICAgICAgICAgICBkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIHNwaW5fdW5sb2NrKGwpICAgICAgICAgIGRvIHsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgc3Bpbl9sb2NrX2lycXNhdmUobCxmKSAgZG8geyBzYXZlX2ZsYWdzKGYpOyBjbGkoKTsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShsLGYpIGRvIHsgcmVzdG9yZV9mbGFncyhmKTsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgc3Bpbl9sb2NrX2luaXQocykgICAgICAgZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSBzcGluX3RyeWxvY2sobCkgICAgICAgICAoMSkKLXR5cGVkZWYgaW50IHNwaW5sb2NrX3Q7Ci0jZW5kaWYKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDQsMCkpIC8vIFhYWCA/Pz8KLSNkZWZpbmUgc3Bpbl9sb2NrX2JoICAgICAgICAgc3Bpbl9sb2NrCi0jZW5kaWYKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDQsMCkpCi0jaWZkZWYgQ09ORklHX1NNUAotI2RlZmluZSBzcGluX2lzX2xvY2tlZCh4KSAgICAgICAoKih2b2xhdGlsZSBjaGFyICopKCYoeCktPmxvY2spIDw9IDApCi0jZWxzZQotI2RlZmluZSBzcGluX2lzX2xvY2tlZChsKSAgICAgICAoMCkKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw0LDI4KSkKLSNkZWZpbmUgX191c2VyCi0jZGVmaW5lIF9faW9tZW0KLSNlbmRpZgotCi0jaWZkZWYgX0xJTlVYX1BST0NfRlNfSAotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDMsMjUpKQotCi1leHRlcm4gaW5saW5lIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqCi1jcmVhdGVfcHJvY19yZWFkX2VudHJ5KGNvbnN0IGNoYXIgKm5hbWUsIG1vZGVfdCBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgIHJlYWRfcHJvY190ICpyZWFkX3Byb2MsIHZvaWQgKmRhdGEpCi17Ci0gICAgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpyZXMgPSBjcmVhdGVfcHJvY19lbnRyeShuYW1lLCBtb2RlLCBiYXNlKTsKLSAgICBpZiAocmVzKSB7Ci0gICAgICAgIHJlcy0+cmVhZF9wcm9jID0gcmVhZF9wcm9jOwotICAgICAgICByZXMtPmRhdGEgPSBkYXRhOwotICAgIH0KLSAgICByZXR1cm4gcmVzOwotfQotI2VuZGlmCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwzLDI5KSkKLSNpZm5kZWYgcHJvY19ta2RpcgotI2RlZmluZSBwcm9jX21rZGlyKG5hbWUsIHJvb3QpIGNyZWF0ZV9wcm9jX2VudHJ5KG5hbWUsIFNfSUZESVIsIHJvb3QpCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmIC8qIF9MSU5VWF9QUk9DX0ZTX0ggKi8KLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpCi0jaWZuZGVmIElOSVRfVFFVRVVFCi0jZGVmaW5lIFBSRVBBUkVfVFFVRVVFKF90cSwgX3JvdXRpbmUsIF9kYXRhKSAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAoX3RxKS0+cm91dGluZSA9IF9yb3V0aW5lOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgKF90cSktPmRhdGEgPSBfZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9IHdoaWxlICgwKQotI2RlZmluZSBJTklUX1RRVUVVRShfdHEsIF9yb3V0aW5lLCBfZGF0YSkgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgSU5JVF9MSVNUX0hFQUQoJihfdHEpLT5saXN0KTsgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIChfdHEpLT5zeW5jID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBQUkVQQVJFX1RRVUVVRSgoX3RxKSwgKF9yb3V0aW5lKSwgKF9kYXRhKSk7ICAgICBcCi0gICAgICAgIH0gd2hpbGUgKDApCi0jZW5kaWYKLQotI2lmbmRlZiBjb250YWluZXJfb2YKLSNkZWZpbmUgY29udGFpbmVyX29mKHB0ciwgdHlwZSwgbWVtYmVyKSAoewkJCVwKLSAgICAgICAgY29uc3QgdHlwZW9mKCAoKHR5cGUgKikwKS0+bWVtYmVyICkgKl9fbXB0ciA9IChwdHIpOwlcCi0gICAgICAgICh0eXBlICopKCAoY2hhciAqKV9fbXB0ciAtIG9mZnNldG9mKHR5cGUsbWVtYmVyKSApO30pCi0jZW5kaWYKLQotI2lmbmRlZiBJTklUX1dPUksKLSNkZWZpbmUgd29ya19zdHJ1Y3QgdHFfc3RydWN0Ci0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw0LDApKQotI2RlZmluZSBzY2hlZHVsZV93b3JrKGEpICAgcXVldWVfdGFzayhhLCAmdHFfc2NoZWR1bGVyKQotI2Vsc2UKLSNkZWZpbmUgc2NoZWR1bGVfd29yayhhKSAgc2NoZWR1bGVfdGFzayhhKQotI2VuZGlmCi0KLSNkZWZpbmUgZmx1c2hfc2NoZWR1bGVkX3dvcmsgIGZsdXNoX3NjaGVkdWxlZF90YXNrcwotI2RlZmluZSBJTklUX1dPUksyKF93cSwgX3JvdXRpbmUpICBJTklUX1RRVUVVRShfd3EsICh2b2lkICgqKSh2b2lkICopKV9yb3V0aW5lLCBfd3EpCi0jZW5kaWYKLQotI2Vsc2UgLy8gPj0gMi41IGtlcm5lbAotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQotI2RlZmluZSBJTklUX1dPUksyKF93cSwgX3JvdXRpbmUpCUlOSVRfV09SSyhfd3EsICh2b2lkICgqKSh2b2lkICopKV9yb3V0aW5lLCBfd3EpCi0jZWxzZQotI2RlZmluZSBJTklUX1dPUksyKF93cSwgX3JvdXRpbmUpCUlOSVRfV09SSyhfd3EsIF9yb3V0aW5lKQotI2VuZGlmCi0KLSNlbmRpZiAvLyA+PSAyLjUga2VybmVsCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwzLDM4KSkKLXR5cGVkZWYgc3RydWN0IGRldmljZSBuZXRkZXZpY2VfdDsKLSNlbGlmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDQsNCkpCi10eXBlZGVmIHN0cnVjdCBuZXRfZGV2aWNlIG5ldGRldmljZV90OwotI2Vsc2UKICN1bmRlZiBuZXRkZXZpY2VfdAogdHlwZWRlZiBzdHJ1Y3QgbmV0X2RldmljZSBuZXRkZXZpY2VfdDsKLSNlbmRpZgogCi0jaWZkZWYgV0lSRUxFU1NfRVhUCi0jaWYgKFdJUkVMRVNTX0VYVCA8IDEzKQotc3RydWN0IGl3X3JlcXVlc3RfaW5mbwotewotICAgICAgICBfX3UxNiAgICAgICAgICAgY21kOyAgICAgICAgICAgIC8qIFdpcmVsZXNzIEV4dGVuc2lvbiBjb21tYW5kICovCi0gICAgICAgIF9fdTE2ICAgICAgICAgICBmbGFnczsgICAgICAgICAgLyogTW9yZSB0byBjb21lIDstKSAqLwotfTsKLSNlbmRpZgotI2VuZGlmCi0KLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDEsMTgpKQotI2RlZmluZSBNT0RVTEVfUEFSTShhLGIpICAgICAgICBleHRlcm4gaW50IF9fYm9ndXNfZGVjbAotI2RlZmluZSBNT0RVTEVfQVVUSE9SKGEpICAgICAgICBleHRlcm4gaW50IF9fYm9ndXNfZGVjbAotI2RlZmluZSBNT0RVTEVfREVTQ1JJUFRJT04oYSkgICBleHRlcm4gaW50IF9fYm9ndXNfZGVjbAotI2RlZmluZSBNT0RVTEVfU1VQUE9SVEVEX0RFVklDRShhKSBleHRlcm4gaW50IF9fYm9ndXNfZGVjbAotI3VuZGVmICBHRVRfVVNFX0NPVU5UCi0jZGVmaW5lIEdFVF9VU0VfQ09VTlQobSkgICAgICAgIG1vZF91c2VfY291bnRfCi0jZW5kaWYKLQotI2lmbmRlZiBNT0RVTEVfT1dORVIKLSNkZWZpbmUgTU9EVUxFX09XTkVSKGEpICAgICAgICAgZXh0ZXJuIGludCBfX2JvZ3VzX2RlY2wKLSNkZWZpbmUgQU5DSUVOVF9NT0RVTEVfQ09ERQotI2VuZGlmCi0KLSNpZm5kZWYgTU9EVUxFX0xJQ0VOU0UKLSNkZWZpbmUgTU9EVUxFX0xJQ0VOU0UobSkgICAgICAgZXh0ZXJuIGludCBfX2JvZ3VzX2RlY2wKLSNlbmRpZgotCi0vKiBUT0RPOiAgRG8gd2UgY2FyZSBhYm91dCB0aGlzPyAqLwotI2lmbmRlZiBNT0RVTEVfREVWSUNFX1RBQkxFCi0jZGVmaW5lIE1PRFVMRV9ERVZJQ0VfVEFCTEUoZm9vLGJhcikKLSNlbmRpZgotCi0jZGVmaW5lIHdsYW5fbWludXRlczJ0aWNrcyhhKSAoKGEpKih3bGFuX3RpY2tzX3Blcl9zZWMgKiAgNjApKQotI2RlZmluZSB3bGFuX3NlY29uZHMydGlja3MoYSkgKChhKSood2xhbl90aWNrc19wZXJfc2VjKSkKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsNDcpKQotI2RlZmluZSBORVdfTU9EVUxFX0NPREUKLSNpZmRlZiBBTkNJRU5UX01PRFVMRV9DT0RFCi0jdW5kZWYgQU5DSUVOVF9NT0RVTEVfQ09ERQotI2VuZGlmCi0jZWxpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw0LDI1KSkKLSNkZWZpbmUgbW9kdWxlX3BhcmFtKG5hbWUsIHR5cGUsIHBlcm0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBzdGF0aWMgaW5saW5lIHZvaWQgKl9fY2hlY2tfZXhpc3RlbmNlXyMjbmFtZSh2b2lkKSB7IHJldHVybiAmbmFtZTsgfSBcCi0gICAgICAgIE1PRFVMRV9QQVJNKG5hbWUsIF9NT0RVTEVfUEFSTV9TVFJJTkdfICMjIHR5cGUpCi0KLSNkZWZpbmUgX01PRFVMRV9QQVJNX1NUUklOR19ieXRlICJiIgotI2RlZmluZSBfTU9EVUxFX1BBUk1fU1RSSU5HX3Nob3J0ICJoIgotI2RlZmluZSBfTU9EVUxFX1BBUk1fU1RSSU5HX3VzaG9ydCAiaCIKLSNkZWZpbmUgX01PRFVMRV9QQVJNX1NUUklOR19pbnQgImkiCi0jZGVmaW5lIF9NT0RVTEVfUEFSTV9TVFJJTkdfdWludCAiaSIKLSNkZWZpbmUgX01PRFVMRV9QQVJNX1NUUklOR19sb25nICJsIgotI2RlZmluZSBfTU9EVUxFX1BBUk1fU1RSSU5HX3Vsb25nICJsIgotI2RlZmluZSBfTU9EVUxFX1BBUk1fU1RSSU5HX2Jvb2wgImkiCi0jZW5kaWYKLQotLyogbGludXggPCAyLjUuNjkgKi8KLSNpZm5kZWYgSVJRX05PTkUKLXR5cGVkZWYgdm9pZCBpcnFyZXR1cm5fdDsKLSNkZWZpbmUgSVJRX05PTkUKLSNkZWZpbmUgSVJRX0hBTkRMRUQKLSNkZWZpbmUgSVJRX1JFVFZBTCh4KQotI2VuZGlmCi0KLSNpZm5kZWYgaW5fYXRvbWljCi0jZGVmaW5lIGluX2F0b21pYygpICAwCi0jZW5kaWYKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTMpKQogI2RlZmluZSBVUkJfQVNZTkNfVU5MSU5LIDAKLSNlbmRpZgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiw3KSkKLSNkZWZpbmUgVVJCX0FTWU5DX1VOTElOSyAgVVNCX0FTWU5DX1VOTElOSwotI2RlZmluZSB1c2JfZmlsbF9idWxrX3VyYiAgRklMTF9CVUxLX1VSQgotI2RlZmluZSB1c2Jfa2lsbF91cmIgIHVzYl91bmxpbmtfdXJiCi0jZWxzZQogI2RlZmluZSBVU0JfUVVFVUVfQlVMSyAwCi0jZW5kaWYKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMTEpKQotdHlwZWRlZiB1MzIgcG1fbWVzc2FnZV90OwotI2VuZGlmCi0KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDkpKQotI2RlZmluZSBob3RwbHVnX3BhdGggICIvZXRjL2hvdHBsdWcvd2xhbi5hZ2VudCIKLSNlbmRpZgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwwKSkKLSNkZWZpbmUgZnJlZV9uZXRkZXYoeCkgICAgICAga2ZyZWUoeCkKLSNlbmRpZgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiw5KSkKLSNkZWZpbmUgZXRoX2hkcih4KSAgICAgICAgICAgKHgpLT5tYWMuZXRoZXJuZXQKLSNlbmRpZgotCi0jaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNCwwKSkKLSNkZWZpbmUgZGVsX3RpbWVyX3N5bmMoYSkgICAgICAgZGVsX3RpbWVyKGEpCi0jZW5kaWYKLQotI2lmbmRlZiBtaWdodF9zbGVlcAotI2RlZmluZSBtaWdodF9zbGVlcChhKSAgIGRvIHsgfSB3aGlsZSAoMCkKLSNlbmRpZgotCi0vKiBBcHBhcmVudGx5IDIuNC4yIGV0aHRvb2wgaXMgcXVpdGUgZGlmZmVyZW50LCBtYXliZSBuZXdlciB0b28/ICovCi0jaWYgKGRlZmluZWQoU0lPRVRIVE9PTCkgJiYgIWRlZmluZWQoRVRIVE9PTF9HRFJWSU5GTykpCi0jdW5kZWYgU0lPRVRIVE9PTAotI2VuZGlmCi0KLS8vIHBjbWNpYS1jcyBzdHVmZgotI2lmICgoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDY4KSkgJiYgXAotICAgICAhZGVmaW5lZChwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIpKQotI2RlZmluZSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIoaGFuZGxlLCByZWcpIFwKLSAgICAgICAgQ2FyZFNlcnZpY2VzKEFjY2Vzc0NvbmZpZ3VyYXRpb25SZWdpc3RlciwgaGFuZGxlLCByZWcpCi0jZGVmaW5lIHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoaGFuZGxlLCByZWcpIFwKLSAgICAgICAgQ2FyZFNlcnZpY2VzKFJlZ2lzdGVyQ2xpZW50LCBoYW5kbGUsIHJlZykKLSNkZWZpbmUgcGNtY2lhX2RlcmVnaXN0ZXJfY2xpZW50KGhhbmRsZSkgXAotICAgICAgICBDYXJkU2VydmljZXMoRGVyZWdpc3RlckNsaWVudCwgaGFuZGxlKQotI2RlZmluZSBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgdHVwbGUpIFwKLSAgICAgICAgQ2FyZFNlcnZpY2VzKEdldEZpcnN0VHVwbGUsIGhhbmRsZSwgdHVwbGUpCi0jZGVmaW5lIHBjbWNpYV9nZXRfbmV4dF90dXBsZShoYW5kbGUsIHR1cGxlKSBcCi0gICAgICAgIENhcmRTZXJ2aWNlcyhHZXROZXh0VHVwbGUsIGhhbmRsZSwgdHVwbGUpCi0jZGVmaW5lIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsIHR1cGxlKSBcCi0gICAgICAgIENhcmRTZXJ2aWNlcyhHZXRUdXBsZURhdGEsIGhhbmRsZSwgdHVwbGUpCi0jZGVmaW5lIHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsIHR1cGxlLCBwYXJzZSkgXAotICAgICAgICBDYXJkU2VydmljZXMoUGFyc2VUdXBsZSwgaGFuZGxlLCB0dXBsZSwgcGFyc2UpCi0jZGVmaW5lIHBjbWNpYV9nZXRfY29uZmlndXJhdGlvbl9pbmZvKGhhbmRsZSwgY29uZmlnKSBcCi0gICAgICAgIENhcmRTZXJ2aWNlcyhHZXRDb25maWd1cmF0aW9uSW5mbywgaGFuZGxlLCBjb25maWcpCi0jZGVmaW5lIHBjbWNpYV9yZXF1ZXN0X2lvKGhhbmRsZSwgcmVxKSBcCi0gICAgICAgIENhcmRTZXJ2aWNlcyhSZXF1ZXN0SU8sIGhhbmRsZSwgcmVxKQotI2RlZmluZSBwY21jaWFfcmVxdWVzdF9pcnEoaGFuZGxlLCByZXEpIFwKLSAgICAgICAgQ2FyZFNlcnZpY2VzKFJlcXVlc3RJUlEsIGhhbmRsZSwgcmVxKQotI2RlZmluZSBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGhhbmRsZSwgcmVxKSBcCi0gICAgICAgIENhcmRTZXJ2aWNlcyhSZXF1ZXN0Q29uZmlndXJhdGlvbiwgaGFuZGxlLCByZXEpCi0jZGVmaW5lIHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24oaGFuZGxlKSBcCi0gICAgICAgIENhcmRTZXJ2aWNlcyhSZWxlYXNlQ29uZmlndXJhdGlvbiwgaGFuZGxlKQotI2RlZmluZSBwY21jaWFfcmVsZWFzZV9pbyhoYW5kbGUsIHJlcSkgXAotICAgICAgICBDYXJkU2VydmljZXMoUmVsZWFzZUlPLCBoYW5kbGUsIHJlcSkKLSNkZWZpbmUgcGNtY2lhX3JlbGVhc2VfaXJxKGhhbmRsZSwgcmVxKSBcCi0gICAgICAgIENhcmRTZXJ2aWNlcyhSZWxlYXNlSVJRLCBoYW5kbGUsIHJlcSkKLSNkZWZpbmUgcGNtY2lhX3JlbGVhc2Vfd2luZG93KHdpbikgXAotICAgICAgICBDYXJkU2VydmljZXMoUmVsZWFzZVdpbmRvdywgd2luKQotI2RlZmluZSBwY21jaWFfZ2V0X2NhcmRfc2VydmljZXNfaW5mbyhpbmZvKSBcCi0gICAgICAgIENhcmRTZXJ2aWNlcyhHZXRDYXJkU2VydmljZXNJbmZvLCBpbmZvKQotI2RlZmluZSBwY21jaWFfcmVwb3J0X2Vycm9yKGhhbmRsZSwgZXJyKSBcCi0gICAgICAgIENhcmRTZXJ2aWNlcyhSZXBvcnRFcnJvciwgaGFuZGxlLCBlcnIpCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qLS0tLS0tIEhhcmR3YXJlIFBvcnRhYmlsaXR5IE1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC02OTIsMjIgKzE0NCw2IEBACiAjZGVmaW5lIGhvc3QyaWVlZTE2KG4pCV9fY3B1X3RvX2xlMTYobikKICNkZWZpbmUgaG9zdDJpZWVlMzIobikJX19jcHVfdG9fbGUzMihuKQogCi0jaWYgKFdMQU5fQ1BVX0ZBTUlMWSAhPSBXTEFOX01JUFMpCi10eXBlZGVmIFVJTlQzMiBwaHlzX3Q7Ci0jZW5kaWYKLQotI2lmIChXTEFOX0NQVV9GQU1JTFkgPT0gV0xBTl9QUEMpCi0gICAgICAgI2RlZmluZSB3bGFuX2ludyhhKSAgICAgICAgICAgICAgICAgICAgIGluX2JlMTYoKHVuc2lnbmVkIHNob3J0ICopKChhKStfSU9fQkFTRSkpCi0gICAgICAgI2RlZmluZSB3bGFuX2lud19sZTE2X3RvX2NwdShhKSAgICAgICAgIGludygoYSkpCi0gICAgICAgI2RlZmluZSB3bGFuX291dHcodixhKSAgICAgICAgICAgICAgICAgIG91dF9iZTE2KCh1bnNpZ25lZCBzaG9ydCAqKSgoYSkrX0lPX0JBU0UpLCAodikpCi0gICAgICAgI2RlZmluZSB3bGFuX291dHdfY3B1X3RvX2xlMTYodixhKSAgICAgIG91dHcoKHYpLChhKSkKLSNlbHNlCi0gICAgICAgI2RlZmluZSB3bGFuX2ludyhhKSAgICAgICAgICAgICAgICAgICAgIGludygoYSkpCi0gICAgICAgI2RlZmluZSB3bGFuX2lud19sZTE2X3RvX2NwdShhKSAgICAgICAgIF9fY3B1X3RvX2xlMTYoaW53KChhKSkpCi0gICAgICAgI2RlZmluZSB3bGFuX291dHcodixhKSAgICAgICAgICAgICAgICAgIG91dHcoKHYpLChhKSkKLSAgICAgICAjZGVmaW5lIHdsYW5fb3V0d19jcHVfdG9fbGUxNih2LGEpICAgICAgb3V0dyhfX2NwdV90b19sZTE2KCh2KSksKGEpKQotI2VuZGlmCi0KIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKi0tLSBHZW5lcmFsIE1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGhlcm1hbC90aGVybWFsX3N5cy5jIGIvZHJpdmVycy90aGVybWFsL3RoZXJtYWxfc3lzLmMKaW5kZXggZmUwNzQ2Mi4uODE3MWNhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy90aGVybWFsL3RoZXJtYWxfc3lzLmMKKysrIGIvZHJpdmVycy90aGVybWFsL3RoZXJtYWxfc3lzLmMKQEAgLTU3OSw3ICs1NzksNyBAQAogCXN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICp0ejsKIAlzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqY2RldjsKIAotCWlmICghc3RybmNtcChkZXYtPmJ1c19pZCwgInRoZXJtYWxfem9uZSIsIHNpemVvZiAidGhlcm1hbF96b25lIiAtIDEpKSB7CisJaWYgKCFzdHJuY21wKGRldl9uYW1lKGRldiksICJ0aGVybWFsX3pvbmUiLCBzaXplb2YgInRoZXJtYWxfem9uZSIgLSAxKSkgewogCQl0eiA9IHRvX3RoZXJtYWxfem9uZShkZXYpOwogCQlrZnJlZSh0eik7CiAJfSBlbHNlIHsKQEAgLTYzMCw3ICs2MzAsNyBAQAogCWNkZXYtPm9wcyA9IG9wczsKIAljZGV2LT5kZXZpY2UuY2xhc3MgPSAmdGhlcm1hbF9jbGFzczsKIAljZGV2LT5kZXZkYXRhID0gZGV2ZGF0YTsKLQlzcHJpbnRmKGNkZXYtPmRldmljZS5idXNfaWQsICJjb29saW5nX2RldmljZSVkIiwgY2Rldi0+aWQpOworCWRldl9zZXRfbmFtZSgmY2Rldi0+ZGV2aWNlLCAiY29vbGluZ19kZXZpY2UlZCIsIGNkZXYtPmlkKTsKIAlyZXN1bHQgPSBkZXZpY2VfcmVnaXN0ZXIoJmNkZXYtPmRldmljZSk7CiAJaWYgKHJlc3VsdCkgewogCQlyZWxlYXNlX2lkcigmdGhlcm1hbF9jZGV2X2lkciwgJnRoZXJtYWxfaWRyX2xvY2ssIGNkZXYtPmlkKTsKQEAgLTc2OSw3ICs3NjksNyBAQAogCXR6LT5kZXZpY2UuY2xhc3MgPSAmdGhlcm1hbF9jbGFzczsKIAl0ei0+ZGV2ZGF0YSA9IGRldmRhdGE7CiAJdHotPnRyaXBzID0gdHJpcHM7Ci0Jc3ByaW50Zih0ei0+ZGV2aWNlLmJ1c19pZCwgInRoZXJtYWxfem9uZSVkIiwgdHotPmlkKTsKKwlkZXZfc2V0X25hbWUoJnR6LT5kZXZpY2UsICJ0aGVybWFsX3pvbmUlZCIsIHR6LT5pZCk7CiAJcmVzdWx0ID0gZGV2aWNlX3JlZ2lzdGVyKCZ0ei0+ZGV2aWNlKTsKIAlpZiAocmVzdWx0KSB7CiAJCXJlbGVhc2VfaWRyKCZ0aGVybWFsX3R6X2lkciwgJnRoZXJtYWxfaWRyX2xvY2ssIHR6LT5pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Vpby91aW8uYyBiL2RyaXZlcnMvdWlvL3Vpby5jCmluZGV4IDJkMjQ0MGMuLjRjYTg1YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdWlvL3Vpby5jCisrKyBiL2RyaXZlcnMvdWlvL3Vpby5jCkBAIC0zNSw2ICszNSw3IEBACiAJaW50CQkJdm1hX2NvdW50OwogCXN0cnVjdCB1aW9faW5mbwkJKmluZm87CiAJc3RydWN0IGtvYmplY3QJCSptYXBfZGlyOworCXN0cnVjdCBrb2JqZWN0CQkqcG9ydGlvX2RpcjsKIH07CiAKIHN0YXRpYyBpbnQgdWlvX21ham9yOwpAQCAtNzUsMTcgKzc2LDE3IEBACiAJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglbHhcbiIsIG1lbS0+YWRkciAmIH5QQUdFX01BU0spOwogfQogCi1zdHJ1Y3QgdWlvX3N5c2ZzX2VudHJ5IHsKK3N0cnVjdCBtYXBfc3lzZnNfZW50cnkgewogCXN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKIAlzc2l6ZV90ICgqc2hvdykoc3RydWN0IHVpb19tZW0gKiwgY2hhciAqKTsKIAlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCB1aW9fbWVtICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdWlvX3N5c2ZzX2VudHJ5IGFkZHJfYXR0cmlidXRlID0KK3N0YXRpYyBzdHJ1Y3QgbWFwX3N5c2ZzX2VudHJ5IGFkZHJfYXR0cmlidXRlID0KIAlfX0FUVFIoYWRkciwgU19JUlVHTywgbWFwX2FkZHJfc2hvdywgTlVMTCk7Ci1zdGF0aWMgc3RydWN0IHVpb19zeXNmc19lbnRyeSBzaXplX2F0dHJpYnV0ZSA9CitzdGF0aWMgc3RydWN0IG1hcF9zeXNmc19lbnRyeSBzaXplX2F0dHJpYnV0ZSA9CiAJX19BVFRSKHNpemUsIFNfSVJVR08sIG1hcF9zaXplX3Nob3csIE5VTEwpOwotc3RhdGljIHN0cnVjdCB1aW9fc3lzZnNfZW50cnkgb2Zmc2V0X2F0dHJpYnV0ZSA9CitzdGF0aWMgc3RydWN0IG1hcF9zeXNmc19lbnRyeSBvZmZzZXRfYXR0cmlidXRlID0KIAlfX0FUVFIob2Zmc2V0LCBTX0lSVUdPLCBtYXBfb2Zmc2V0X3Nob3csIE5VTEwpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYXR0cnNbXSA9IHsKQEAgLTEwNiw5ICsxMDcsOSBAQAogewogCXN0cnVjdCB1aW9fbWFwICptYXAgPSB0b19tYXAoa29iaik7CiAJc3RydWN0IHVpb19tZW0gKm1lbSA9IG1hcC0+bWVtOwotCXN0cnVjdCB1aW9fc3lzZnNfZW50cnkgKmVudHJ5OworCXN0cnVjdCBtYXBfc3lzZnNfZW50cnkgKmVudHJ5OwogCi0JZW50cnkgPSBjb250YWluZXJfb2YoYXR0ciwgc3RydWN0IHVpb19zeXNmc19lbnRyeSwgYXR0cik7CisJZW50cnkgPSBjb250YWluZXJfb2YoYXR0ciwgc3RydWN0IG1hcF9zeXNmc19lbnRyeSwgYXR0cik7CiAKIAlpZiAoIWVudHJ5LT5zaG93KQogCQlyZXR1cm4gLUVJTzsKQEAgLTExNiwxNiArMTE3LDkzIEBACiAJcmV0dXJuIGVudHJ5LT5zaG93KG1lbSwgYnVmKTsKIH0KIAotc3RhdGljIHN0cnVjdCBzeXNmc19vcHMgdWlvX3N5c2ZzX29wcyA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc3lzZnNfb3BzIG1hcF9zeXNmc19vcHMgPSB7CiAJLnNob3cgPSBtYXBfdHlwZV9zaG93LAogfTsKIAogc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgbWFwX2F0dHJfdHlwZSA9IHsKIAkucmVsZWFzZQk9IG1hcF9yZWxlYXNlLAotCS5zeXNmc19vcHMJPSAmdWlvX3N5c2ZzX29wcywKKwkuc3lzZnNfb3BzCT0gJm1hcF9zeXNmc19vcHMsCiAJLmRlZmF1bHRfYXR0cnMJPSBhdHRycywKIH07CiAKK3N0cnVjdCB1aW9fcG9ydGlvIHsKKwlzdHJ1Y3Qga29iamVjdCBrb2JqOworCXN0cnVjdCB1aW9fcG9ydCAqcG9ydDsKK307CisjZGVmaW5lIHRvX3BvcnRpbyhwb3J0aW8pIGNvbnRhaW5lcl9vZihwb3J0aW8sIHN0cnVjdCB1aW9fcG9ydGlvLCBrb2JqKQorCitzdGF0aWMgc3NpemVfdCBwb3J0aW9fc3RhcnRfc2hvdyhzdHJ1Y3QgdWlvX3BvcnQgKnBvcnQsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCVseFxuIiwgcG9ydC0+c3RhcnQpOworfQorCitzdGF0aWMgc3NpemVfdCBwb3J0aW9fc2l6ZV9zaG93KHN0cnVjdCB1aW9fcG9ydCAqcG9ydCwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JWx4XG4iLCBwb3J0LT5zaXplKTsKK30KKworc3RhdGljIHNzaXplX3QgcG9ydGlvX3BvcnR0eXBlX3Nob3coc3RydWN0IHVpb19wb3J0ICpwb3J0LCBjaGFyICpidWYpCit7CisJY29uc3QgY2hhciAqcG9ydHR5cGVzW10gPSB7Im5vbmUiLCAieDg2IiwgImdwaW8iLCAib3RoZXIifTsKKworCWlmICgocG9ydC0+cG9ydHR5cGUgPCAwKSB8fCAocG9ydC0+cG9ydHR5cGUgPiBVSU9fUE9SVF9PVEhFUikpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAicG9ydF8lc1xuIiwgcG9ydHR5cGVzW3BvcnQtPnBvcnR0eXBlXSk7Cit9CisKK3N0cnVjdCBwb3J0aW9fc3lzZnNfZW50cnkgeworCXN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKKwlzc2l6ZV90ICgqc2hvdykoc3RydWN0IHVpb19wb3J0ICosIGNoYXIgKik7CisJc3NpemVfdCAoKnN0b3JlKShzdHJ1Y3QgdWlvX3BvcnQgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOworfTsKKworc3RhdGljIHN0cnVjdCBwb3J0aW9fc3lzZnNfZW50cnkgcG9ydGlvX3N0YXJ0X2F0dHJpYnV0ZSA9CisJX19BVFRSKHN0YXJ0LCBTX0lSVUdPLCBwb3J0aW9fc3RhcnRfc2hvdywgTlVMTCk7CitzdGF0aWMgc3RydWN0IHBvcnRpb19zeXNmc19lbnRyeSBwb3J0aW9fc2l6ZV9hdHRyaWJ1dGUgPQorCV9fQVRUUihzaXplLCBTX0lSVUdPLCBwb3J0aW9fc2l6ZV9zaG93LCBOVUxMKTsKK3N0YXRpYyBzdHJ1Y3QgcG9ydGlvX3N5c2ZzX2VudHJ5IHBvcnRpb19wb3J0dHlwZV9hdHRyaWJ1dGUgPQorCV9fQVRUUihwb3J0dHlwZSwgU19JUlVHTywgcG9ydGlvX3BvcnR0eXBlX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqcG9ydGlvX2F0dHJzW10gPSB7CisJJnBvcnRpb19zdGFydF9hdHRyaWJ1dGUuYXR0ciwKKwkmcG9ydGlvX3NpemVfYXR0cmlidXRlLmF0dHIsCisJJnBvcnRpb19wb3J0dHlwZV9hdHRyaWJ1dGUuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHZvaWQgcG9ydGlvX3JlbGVhc2Uoc3RydWN0IGtvYmplY3QgKmtvYmopCit7CisJc3RydWN0IHVpb19wb3J0aW8gKnBvcnRpbyA9IHRvX3BvcnRpbyhrb2JqKTsKKwlrZnJlZShwb3J0aW8pOworfQorCitzdGF0aWMgc3NpemVfdCBwb3J0aW9fdHlwZV9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAorCQkJICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IHVpb19wb3J0aW8gKnBvcnRpbyA9IHRvX3BvcnRpbyhrb2JqKTsKKwlzdHJ1Y3QgdWlvX3BvcnQgKnBvcnQgPSBwb3J0aW8tPnBvcnQ7CisJc3RydWN0IHBvcnRpb19zeXNmc19lbnRyeSAqZW50cnk7CisKKwllbnRyeSA9IGNvbnRhaW5lcl9vZihhdHRyLCBzdHJ1Y3QgcG9ydGlvX3N5c2ZzX2VudHJ5LCBhdHRyKTsKKworCWlmICghZW50cnktPnNob3cpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIGVudHJ5LT5zaG93KHBvcnQsIGJ1Zik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZnNfb3BzIHBvcnRpb19zeXNmc19vcHMgPSB7CisJLnNob3cgPSBwb3J0aW9fdHlwZV9zaG93LAorfTsKKworc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgcG9ydGlvX2F0dHJfdHlwZSA9IHsKKwkucmVsZWFzZQk9IHBvcnRpb19yZWxlYXNlLAorCS5zeXNmc19vcHMJPSAmcG9ydGlvX3N5c2ZzX29wcywKKwkuZGVmYXVsdF9hdHRycwk9IHBvcnRpb19hdHRycywKK307CisKIHN0YXRpYyBzc2l6ZV90IHNob3dfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKQEAgLTE3NywxMCArMjU1LDEzIEBACiBzdGF0aWMgaW50IHVpb19kZXZfYWRkX2F0dHJpYnV0ZXMoc3RydWN0IHVpb19kZXZpY2UgKmlkZXYpCiB7CiAJaW50IHJldDsKLQlpbnQgbWk7CisJaW50IG1pLCBwaTsKIAlpbnQgbWFwX2ZvdW5kID0gMDsKKwlpbnQgcG9ydGlvX2ZvdW5kID0gMDsKIAlzdHJ1Y3QgdWlvX21lbSAqbWVtOwogCXN0cnVjdCB1aW9fbWFwICptYXA7CisJc3RydWN0IHVpb19wb3J0ICpwb3J0OworCXN0cnVjdCB1aW9fcG9ydGlvICpwb3J0aW87CiAKIAlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmlkZXYtPmRldi0+a29iaiwgJnVpb19hdHRyX2dycCk7CiAJaWYgKHJldCkKQEAgLTE5NSwyNSArMjc2LDU4IEBACiAJCQlpZGV2LT5tYXBfZGlyID0ga29iamVjdF9jcmVhdGVfYW5kX2FkZCgibWFwcyIsCiAJCQkJCQkJJmlkZXYtPmRldi0+a29iaik7CiAJCQlpZiAoIWlkZXYtPm1hcF9kaXIpCi0JCQkJZ290byBlcnI7CisJCQkJZ290byBlcnJfbWFwOwogCQl9CiAJCW1hcCA9IGt6YWxsb2Moc2l6ZW9mKCptYXApLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFtYXApCi0JCQlnb3RvIGVycjsKKwkJCWdvdG8gZXJyX21hcDsKIAkJa29iamVjdF9pbml0KCZtYXAtPmtvYmosICZtYXBfYXR0cl90eXBlKTsKIAkJbWFwLT5tZW0gPSBtZW07CiAJCW1lbS0+bWFwID0gbWFwOwogCQlyZXQgPSBrb2JqZWN0X2FkZCgmbWFwLT5rb2JqLCBpZGV2LT5tYXBfZGlyLCAibWFwJWQiLCBtaSk7CiAJCWlmIChyZXQpCi0JCQlnb3RvIGVycjsKKwkJCWdvdG8gZXJyX21hcDsKIAkJcmV0ID0ga29iamVjdF91ZXZlbnQoJm1hcC0+a29iaiwgS09CSl9BREQpOwogCQlpZiAocmV0KQotCQkJZ290byBlcnI7CisJCQlnb3RvIGVycl9tYXA7CisJfQorCisJZm9yIChwaSA9IDA7IHBpIDwgTUFYX1VJT19QT1JUX1JFR0lPTlM7IHBpKyspIHsKKwkJcG9ydCA9ICZpZGV2LT5pbmZvLT5wb3J0W3BpXTsKKwkJaWYgKHBvcnQtPnNpemUgPT0gMCkKKwkJCWJyZWFrOworCQlpZiAoIXBvcnRpb19mb3VuZCkgeworCQkJcG9ydGlvX2ZvdW5kID0gMTsKKwkJCWlkZXYtPnBvcnRpb19kaXIgPSBrb2JqZWN0X2NyZWF0ZV9hbmRfYWRkKCJwb3J0aW8iLAorCQkJCQkJCSZpZGV2LT5kZXYtPmtvYmopOworCQkJaWYgKCFpZGV2LT5wb3J0aW9fZGlyKQorCQkJCWdvdG8gZXJyX3BvcnRpbzsKKwkJfQorCQlwb3J0aW8gPSBremFsbG9jKHNpemVvZigqcG9ydGlvKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcG9ydGlvKQorCQkJZ290byBlcnJfcG9ydGlvOworCQlrb2JqZWN0X2luaXQoJnBvcnRpby0+a29iaiwgJnBvcnRpb19hdHRyX3R5cGUpOworCQlwb3J0aW8tPnBvcnQgPSBwb3J0OworCQlwb3J0LT5wb3J0aW8gPSBwb3J0aW87CisJCXJldCA9IGtvYmplY3RfYWRkKCZwb3J0aW8tPmtvYmosIGlkZXYtPnBvcnRpb19kaXIsCisJCQkJCQkJInBvcnQlZCIsIHBpKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX3BvcnRpbzsKKwkJcmV0ID0ga29iamVjdF91ZXZlbnQoJnBvcnRpby0+a29iaiwgS09CSl9BREQpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfcG9ydGlvOwogCX0KIAogCXJldHVybiAwOwogCi1lcnI6CitlcnJfcG9ydGlvOgorCWZvciAocGktLTsgcGkgPj0gMDsgcGktLSkgeworCQlwb3J0ID0gJmlkZXYtPmluZm8tPnBvcnRbcGldOworCQlwb3J0aW8gPSBwb3J0LT5wb3J0aW87CisJCWtvYmplY3RfcHV0KCZwb3J0aW8tPmtvYmopOworCX0KKwlrb2JqZWN0X3B1dChpZGV2LT5wb3J0aW9fZGlyKTsKK2Vycl9tYXA6CiAJZm9yIChtaS0tOyBtaT49MDsgbWktLSkgewogCQltZW0gPSAmaWRldi0+aW5mby0+bWVtW21pXTsKIAkJbWFwID0gbWVtLT5tYXA7CkBAIC0yMjgsMTUgKzM0MiwyNiBAQAogCiBzdGF0aWMgdm9pZCB1aW9fZGV2X2RlbF9hdHRyaWJ1dGVzKHN0cnVjdCB1aW9fZGV2aWNlICppZGV2KQogewotCWludCBtaTsKKwlpbnQgaTsKIAlzdHJ1Y3QgdWlvX21lbSAqbWVtOwotCWZvciAobWkgPSAwOyBtaSA8IE1BWF9VSU9fTUFQUzsgbWkrKykgewotCQltZW0gPSAmaWRldi0+aW5mby0+bWVtW21pXTsKKwlzdHJ1Y3QgdWlvX3BvcnQgKnBvcnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1VJT19NQVBTOyBpKyspIHsKKwkJbWVtID0gJmlkZXYtPmluZm8tPm1lbVtpXTsKIAkJaWYgKG1lbS0+c2l6ZSA9PSAwKQogCQkJYnJlYWs7CiAJCWtvYmplY3RfcHV0KCZtZW0tPm1hcC0+a29iaik7CiAJfQogCWtvYmplY3RfcHV0KGlkZXYtPm1hcF9kaXIpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9VSU9fUE9SVF9SRUdJT05TOyBpKyspIHsKKwkJcG9ydCA9ICZpZGV2LT5pbmZvLT5wb3J0W2ldOworCQlpZiAocG9ydC0+c2l6ZSA9PSAwKQorCQkJYnJlYWs7CisJCWtvYmplY3RfcHV0KCZwb3J0LT5wb3J0aW8tPmtvYmopOworCX0KKwlrb2JqZWN0X3B1dChpZGV2LT5wb3J0aW9fZGlyKTsKKwogCXN5c2ZzX3JlbW92ZV9ncm91cCgmaWRldi0+ZGV2LT5rb2JqLCAmdWlvX2F0dHJfZ3JwKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91aW8vdWlvX2NpZi5jIGIvZHJpdmVycy91aW8vdWlvX2NpZi5jCmluZGV4IDU3Mzc2MDYuLmM2MGI4ZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdWlvL3Vpb19jaWYuYworKysgYi9kcml2ZXJzL3Vpby91aW9fY2lmLmMKQEAgLTU3LDggKzU3LDcgQEAKIAlpbmZvLT5tZW1bMF0uYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApOwogCWlmICghaW5mby0+bWVtWzBdLmFkZHIpCiAJCWdvdG8gb3V0X3JlbGVhc2U7Ci0JaW5mby0+bWVtWzBdLmludGVybmFsX2FkZHIgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApLAotCQkJCQkgICAgIHBjaV9yZXNvdXJjZV9sZW4oZGV2LCAwKSk7CisJaW5mby0+bWVtWzBdLmludGVybmFsX2FkZHIgPSBwY2lfaW9yZW1hcF9iYXIoZGV2LCAwKTsKIAlpZiAoIWluZm8tPm1lbVswXS5pbnRlcm5hbF9hZGRyKQogCQlnb3RvIG91dF9yZWxlYXNlOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Vpby91aW9fcGRydl9nZW5pcnEuYyBiL2RyaXZlcnMvdWlvL3Vpb19wZHJ2X2dlbmlycS5jCmluZGV4IDFmODJjODMuLjNmMDY4MTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdWlvL3Vpb19wZHJ2X2dlbmlycS5jCisrKyBiL2RyaXZlcnMvdWlvL3Vpb19wZHJ2X2dlbmlycS5jCkBAIC04MSw3ICs4MSw4IEBACiAJCWdvdG8gYmFkMDsKIAl9CiAKLQlpZiAodWlvaW5mby0+aGFuZGxlciB8fCB1aW9pbmZvLT5pcnFjb250cm9sIHx8IHVpb2luZm8tPmlycV9mbGFncykgeworCWlmICh1aW9pbmZvLT5oYW5kbGVyIHx8IHVpb2luZm8tPmlycWNvbnRyb2wgfHwKKwkgICAgdWlvaW5mby0+aXJxX2ZsYWdzICYgSVJRRl9TSEFSRUQpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiaW50ZXJydXB0IGNvbmZpZ3VyYXRpb24gZXJyb3JcbiIpOwogCQlnb3RvIGJhZDA7CiAJfQpAQCAtMTMyLDcgKzEzMyw3IEBACiAJICogSW50ZXJydXB0IHNoYXJpbmcgaXMgbm90IHN1cHBvcnRlZC4KIAkgKi8KIAotCXVpb2luZm8tPmlycV9mbGFncyA9IElSUUZfRElTQUJMRUQ7CisJdWlvaW5mby0+aXJxX2ZsYWdzIHw9IElSUUZfRElTQUJMRUQ7CiAJdWlvaW5mby0+aGFuZGxlciA9IHVpb19wZHJ2X2dlbmlycV9oYW5kbGVyOwogCXVpb2luZm8tPmlycWNvbnRyb2wgPSB1aW9fcGRydl9nZW5pcnFfaXJxY29udHJvbDsKIAl1aW9pbmZvLT5wcml2ID0gcHJpdjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL0tjb25maWcgYi9kcml2ZXJzL3VzYi9LY29uZmlnCmluZGV4IDI4OWQ4MWEuLjgzYmFiYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvS2NvbmZpZwpAQCAtMTUwLDQgKzE1MCw2IEBACiAKIHNvdXJjZSAiZHJpdmVycy91c2IvZ2FkZ2V0L0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy91c2Ivb3RnL0tjb25maWciCisKIGVuZGlmICMgVVNCX1NVUFBPUlQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uYyBiL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uYwppbmRleCBkNTBhOTlmLi4wMGI0N2VhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmMKKysrIGIvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5jCkBAIC0xMjc1LDcgKzEyNzUsNyBAQAogCXN0cnVjdCBhY20gKmFjbSA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CiAJaW50IGNudDsKIAotCWlmIChhY20tPmRldi0+YXV0b19wbSkgeworCWlmIChtZXNzYWdlLmV2ZW50ICYgUE1fRVZFTlRfQVVUTykgewogCQlpbnQgYjsKIAogCQlzcGluX2xvY2tfaXJxKCZhY20tPnJlYWRfbG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtd2RtLmMgYi9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtd2RtLmMKaW5kZXggNWE4ZWNjMC4uMzc3MWQ2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY2xhc3MvY2RjLXdkbS5jCisrKyBiL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy13ZG0uYwpAQCAtNzY0LDcgKzc2NCw4IEBACiAKIAltdXRleF9sb2NrKCZkZXNjLT5wbG9jayk7CiAjaWZkZWYgQ09ORklHX1BNCi0JaWYgKGludGVyZmFjZV90b191c2JkZXYoZGVzYy0+aW50ZiktPmF1dG9fcG0gJiYgdGVzdF9iaXQoV0RNX0lOX1VTRSwgJmRlc2MtPmZsYWdzKSkgeworCWlmICgobWVzc2FnZS5ldmVudCAmIFBNX0VWRU5UX0FVVE8pICYmCisJCQl0ZXN0X2JpdChXRE1fSU5fVVNFLCAmZGVzYy0+ZmxhZ3MpKSB7CiAJCXJ2ID0gLUVCVVNZOwogCX0gZWxzZSB7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NsYXNzL3VzYnRtYy5jIGIvZHJpdmVycy91c2IvY2xhc3MvdXNidG1jLmMKaW5kZXggNDNhODYzYy4uMGY1YzA1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY2xhc3MvdXNidG1jLmMKKysrIGIvZHJpdmVycy91c2IvY2xhc3MvdXNidG1jLmMKQEAgLTIxLDYgKzIxLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CkBAIC00ODIsNyArNDgzLDYgQEAKIAlpbnQgcmV0dmFsOwogCWludCBhY3R1YWw7CiAJdW5zaWduZWQgbG9uZyBpbnQgbl9ieXRlczsKLQlpbnQgbjsKIAlpbnQgcmVtYWluaW5nOwogCWludCBkb25lOwogCWludCB0aGlzX3BhcnQ7CkBAIC01MjYsMTEgKzUyNiw4IEBACiAJCQlnb3RvIGV4aXQ7CiAJCX0KIAotCQluX2J5dGVzID0gMTIgKyB0aGlzX3BhcnQ7Ci0JCWlmICh0aGlzX3BhcnQgJSA0KQotCQkJbl9ieXRlcyArPSA0IC0gdGhpc19wYXJ0ICUgNDsKLQkJCWZvciAobiA9IDEyICsgdGhpc19wYXJ0OyBuIDwgbl9ieXRlczsgbisrKQotCQkJCWJ1ZmZlcltuXSA9IDA7CisJCW5fYnl0ZXMgPSByb3VuZHVwKDEyICsgdGhpc19wYXJ0LCA0KTsKKwkJbWVtc2V0KGJ1ZmZlciArIDEyICsgdGhpc19wYXJ0LCAwLCBuX2J5dGVzIC0gKDEyICsgdGhpc19wYXJ0KSk7CiAKIAkJcmV0dmFsID0gdXNiX2J1bGtfbXNnKGRhdGEtPnVzYl9kZXYsCiAJCQkJICAgICAgdXNiX3NuZGJ1bGtwaXBlKGRhdGEtPnVzYl9kZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2RldmlvLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2RldmlvLmMKaW5kZXggYWE3OTI4MC4uMjZmZWNlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9kZXZpby5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvZGV2aW8uYwpAQCAtOTgxLDkgKzk4MSw2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCWlmICghdXVyYi0+YnVmZmVyKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAodXVyYi0+c2lnbnIgIT0gMCAmJiAodXVyYi0+c2lnbnIgPCBTSUdSVE1JTiB8fAotCQkJCSB1dXJiLT5zaWduciA+IFNJR1JUTUFYKSkKLQkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKCEodXVyYi0+dHlwZSA9PSBVU0JERVZGU19VUkJfVFlQRV9DT05UUk9MICYmCiAJICAgICh1dXJiLT5lbmRwb2ludCAmIH5VU0JfRU5EUE9JTlRfRElSX01BU0spID09IDApKSB7CiAJCWlmbnVtID0gZmluZGludGZlcChwcy0+ZGV2LCB1dXJiLT5lbmRwb2ludCk7CkBAIC0xMzIwLDcgKzEzMTcsNyBAQAogCWlmIChfX2dldF91c2VyKHVwdHIsICZ1dXJiLT5idWZmZXIpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlrdXJiLT5idWZmZXIgPSBjb21wYXRfcHRyKHVwdHIpOwotCWlmIChfX2dldF91c2VyKHVwdHIsICZ1dXJiLT5idWZmZXIpKQorCWlmIChfX2dldF91c2VyKHVwdHIsICZ1dXJiLT51c2VyY29udGV4dCkpCiAJCXJldHVybiAtRUZBVUxUOwogCWt1cmItPnVzZXJjb250ZXh0ID0gY29tcGF0X3B0cih1cHRyKTsKIApAQCAtMTQwMSw4ICsxMzk4LDYgQEAKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmZHMsIGFyZywgc2l6ZW9mKGRzKSkpCiAJCXJldHVybiAtRUZBVUxUOwotCWlmIChkcy5zaWduciAhPSAwICYmIChkcy5zaWduciA8IFNJR1JUTUlOIHx8IGRzLnNpZ25yID4gU0lHUlRNQVgpKQotCQlyZXR1cm4gLUVJTlZBTDsKIAlwcy0+ZGlzY3NpZ25yID0gZHMuc2lnbnI7CiAJcHMtPmRpc2Njb250ZXh0ID0gZHMuY29udGV4dDsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvZHJpdmVyLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2RyaXZlci5jCmluZGV4IDhjMDgxMzAuLjk4NzYwNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvZHJpdmVyLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9kcml2ZXIuYwpAQCAtMTg0LDYgKzE4NCwyMCBAQAogCXJldHVybiAwOwogfQogCisvKgorICogQ2FuY2VsIGFueSBwZW5kaW5nIHNjaGVkdWxlZCByZXNldHMKKyAqCisgKiBbc2VlIHVzYl9xdWV1ZV9yZXNldF9kZXZpY2UoKV0KKyAqCisgKiBDYWxsZWQgYWZ0ZXIgdW5jb25maWd1cmluZyAvIHdoZW4gcmVsZWFzaW5nIGludGVyZmFjZXMuIFNlZQorICogY29tbWVudHMgaW4gX191c2JfcXVldWVfcmVzZXRfZGV2aWNlKCkgcmVnYXJkaW5nCisgKiB1ZGV2LT5yZXNldF9ydW5uaW5nLgorICovCitzdGF0aWMgdm9pZCB1c2JfY2FuY2VsX3F1ZXVlZF9yZXNldChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2UpCit7CisJaWYgKGlmYWNlLT5yZXNldF9ydW5uaW5nID09IDApCisJCWNhbmNlbF93b3JrX3N5bmMoJmlmYWNlLT5yZXNldF93cyk7Cit9CiAKIC8qIGNhbGxlZCBmcm9tIGRyaXZlciBjb3JlIHdpdGggZGV2IGxvY2tlZCAqLwogc3RhdGljIGludCB1c2JfcHJvYmVfaW50ZXJmYWNlKHN0cnVjdCBkZXZpY2UgKmRldikKQEAgLTI0Miw2ICsyNTYsNyBAQAogCQkJbWFya19xdWllc2NlZChpbnRmKTsKIAkJCWludGYtPm5lZWRzX3JlbW90ZV93YWtldXAgPSAwOwogCQkJaW50Zi0+Y29uZGl0aW9uID0gVVNCX0lOVEVSRkFDRV9VTkJPVU5EOworCQkJdXNiX2NhbmNlbF9xdWV1ZWRfcmVzZXQoaW50Zik7CiAJCX0gZWxzZQogCQkJaW50Zi0+Y29uZGl0aW9uID0gVVNCX0lOVEVSRkFDRV9CT1VORDsKIApAQCAtMjcyLDYgKzI4Nyw3IEBACiAJCXVzYl9kaXNhYmxlX2ludGVyZmFjZSh1ZGV2LCBpbnRmKTsKIAogCWRyaXZlci0+ZGlzY29ubmVjdChpbnRmKTsKKwl1c2JfY2FuY2VsX3F1ZXVlZF9yZXNldChpbnRmKTsKIAogCS8qIFJlc2V0IG90aGVyIGludGVyZmFjZSBzdGF0ZS4KIAkgKiBXZSBjYW5ub3QgZG8gYSBTZXQtSW50ZXJmYWNlIGlmIHRoZSBkZXZpY2UgaXMgc3VzcGVuZGVkIG9yCkBAIC0yNzksOSArMjk1LDEyIEBACiAJICogYWx0c2V0dGluZyBtZWFucyBjcmVhdGluZyBuZXcgZW5kcG9pbnQgZGV2aWNlIGVudHJpZXMpLgogCSAqIFdoZW4gZWl0aGVyIG9mIHRoZXNlIGhhcHBlbnMsIGRlZmVyIHRoZSBTZXQtSW50ZXJmYWNlLgogCSAqLwotCWlmIChpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iQWx0ZXJuYXRlU2V0dGluZyA9PSAwKQotCQk7CS8qIEFscmVhZHkgaW4gYWx0c2V0dGluZyAwIHNvIHNraXAgU2V0LUludGVyZmFjZSAqLwotCWVsc2UgaWYgKCFlcnJvciAmJiBpbnRmLT5kZXYucG93ZXIuc3RhdHVzID09IERQTV9PTikKKwlpZiAoaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkFsdGVybmF0ZVNldHRpbmcgPT0gMCkgeworCQkvKiBBbHJlYWR5IGluIGFsdHNldHRpbmcgMCBzbyBza2lwIFNldC1JbnRlcmZhY2UuCisJCSAqIEp1c3QgcmUtZW5hYmxlIGl0IHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBlbmRwb2ludCB0b2dnbGVzLgorCQkgKi8KKwkJdXNiX2VuYWJsZV9pbnRlcmZhY2UodWRldiwgaW50ZiwgZmFsc2UpOworCX0gZWxzZSBpZiAoIWVycm9yICYmIGludGYtPmRldi5wb3dlci5zdGF0dXMgPT0gRFBNX09OKQogCQl1c2Jfc2V0X2ludGVyZmFjZSh1ZGV2LCBpbnRmLT5hbHRzZXR0aW5nWzBdLgogCQkJCWRlc2MuYkludGVyZmFjZU51bWJlciwgMCk7CiAJZWxzZQpAQCAtMzgwLDggKzM5OSwxMCBAQAogCWlmIChkZXZpY2VfaXNfcmVnaXN0ZXJlZChkZXYpKSB7CiAJCWlmYWNlLT5jb25kaXRpb24gPSBVU0JfSU5URVJGQUNFX1VOQklORElORzsKIAkJZGV2aWNlX3JlbGVhc2VfZHJpdmVyKGRldik7CisJfSBlbHNlIHsKKwkJaWZhY2UtPmNvbmRpdGlvbiA9IFVTQl9JTlRFUkZBQ0VfVU5CT1VORDsKKwkJdXNiX2NhbmNlbF9xdWV1ZWRfcmVzZXQoaWZhY2UpOwogCX0KLQogCWRldi0+ZHJpdmVyID0gTlVMTDsKIAl1c2Jfc2V0X2ludGZkYXRhKGlmYWNlLCBOVUxMKTsKIApAQCAtOTA0LDcgKzkyNSw3IEBACiB9CiAKIC8qIENhbGxlciBoYXMgbG9ja2VkIHVkZXYncyBwbV9tdXRleCAqLwotc3RhdGljIGludCB1c2JfcmVzdW1lX2RldmljZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKK3N0YXRpYyBpbnQgdXNiX3Jlc3VtZV9kZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHBtX21lc3NhZ2VfdCBtc2cpCiB7CiAJc3RydWN0IHVzYl9kZXZpY2VfZHJpdmVyCSp1ZHJpdmVyOwogCWludAkJCQlzdGF0dXMgPSAwOwpAQCAtOTIyLDcgKzk0Myw3IEBACiAJCXVkZXYtPnJlc2V0X3Jlc3VtZSA9IDE7CiAKIAl1ZHJpdmVyID0gdG9fdXNiX2RldmljZV9kcml2ZXIodWRldi0+ZGV2LmRyaXZlcik7Ci0Jc3RhdHVzID0gdWRyaXZlci0+cmVzdW1lKHVkZXYpOworCXN0YXR1cyA9IHVkcml2ZXItPnJlc3VtZSh1ZGV2LCBtc2cpOwogCiAgZG9uZToKIAlkZXZfdmRiZygmdWRldi0+ZGV2LCAiJXM6IHN0YXR1cyAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CkBAIC05NDIsNyArOTYzLDggQEAKIAlpZiAodWRldi0+c3RhdGUgPT0gVVNCX1NUQVRFX05PVEFUVEFDSEVEIHx8ICFpc19hY3RpdmUoaW50ZikpCiAJCWdvdG8gZG9uZTsKIAotCWlmIChpbnRmLT5jb25kaXRpb24gPT0gVVNCX0lOVEVSRkFDRV9VTkJPVU5EKQkvKiBUaGlzIGNhbid0IGhhcHBlbiAqLworCS8qIFRoaXMgY2FuIGhhcHBlbjsgc2VlIHVzYl9kcml2ZXJfcmVsZWFzZV9pbnRlcmZhY2UoKSAqLworCWlmIChpbnRmLT5jb25kaXRpb24gPT0gVVNCX0lOVEVSRkFDRV9VTkJPVU5EKQogCQlnb3RvIGRvbmU7CiAJZHJpdmVyID0gdG9fdXNiX2RyaXZlcihpbnRmLT5kZXYuZHJpdmVyKTsKIApAQCAtOTUwLDcgKzk3Miw3IEBACiAJCXN0YXR1cyA9IGRyaXZlci0+c3VzcGVuZChpbnRmLCBtc2cpOwogCQlpZiAoc3RhdHVzID09IDApCiAJCQltYXJrX3F1aWVzY2VkKGludGYpOwotCQllbHNlIGlmICghdWRldi0+YXV0b19wbSkKKwkJZWxzZSBpZiAoIShtc2cuZXZlbnQgJiBQTV9FVkVOVF9BVVRPKSkKIAkJCWRldl9lcnIoJmludGYtPmRldiwgIiVzIGVycm9yICVkXG4iLAogCQkJCQkic3VzcGVuZCIsIHN0YXR1cyk7CiAJfSBlbHNlIHsKQEAgLTk2OCw3ICs5OTAsNyBAQAogCiAvKiBDYWxsZXIgaGFzIGxvY2tlZCBpbnRmJ3MgdXNiX2RldmljZSdzIHBtX211dGV4ICovCiBzdGF0aWMgaW50IHVzYl9yZXN1bWVfaW50ZXJmYWNlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LAotCQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgaW50IHJlc2V0X3Jlc3VtZSkKKwkJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIHBtX21lc3NhZ2VfdCBtc2csIGludCByZXNldF9yZXN1bWUpCiB7CiAJc3RydWN0IHVzYl9kcml2ZXIJKmRyaXZlcjsKIAlpbnQJCQlzdGF0dXMgPSAwOwpAQCAtMTA5Miw3ICsxMTE0LDcgQEAKIAlpZiAocmVzY2hlZHVsZSkgewogCQlpZiAoIXRpbWVyX3BlbmRpbmcoJnVkZXYtPmF1dG9zdXNwZW5kLnRpbWVyKSkgewogCQkJcXVldWVfZGVsYXllZF93b3JrKGtzdXNwZW5kX3VzYl93cSwgJnVkZXYtPmF1dG9zdXNwZW5kLAotCQkJCXJvdW5kX2ppZmZpZXNfcmVsYXRpdmUoc3VzcGVuZF90aW1lIC0gaikpOworCQkJCXJvdW5kX2ppZmZpZXNfdXBfcmVsYXRpdmUoc3VzcGVuZF90aW1lIC0gaikpOwogCQl9CiAJCXJldHVybiAtRUFHQUlOOwogCX0KQEAgLTExMTksMTAgKzExNDEsOSBAQAogICogYWxsIHRoZSBpbnRlcmZhY2VzIHdoaWNoIHdlcmUgc3VzcGVuZGVkIGFyZSByZXN1bWVkIHNvIHRoYXQgdGhleSByZW1haW4KICAqIGluIHRoZSBzYW1lIHN0YXRlIGFzIHRoZSBkZXZpY2UuCiAgKgotICogSWYgYW4gYXV0b3N1c3BlbmQgaXMgaW4gcHJvZ3Jlc3MgKEB1ZGV2LT5hdXRvX3BtIGlzIHNldCksIHRoZSByb3V0aW5lCi0gKiBjaGVja3MgZmlyc3QgdG8gbWFrZSBzdXJlIHRoYXQgbmVpdGhlciB0aGUgZGV2aWNlIGl0c2VsZiBvciBhbnkgb2YgaXRzCi0gKiBhY3RpdmUgaW50ZXJmYWNlcyBpcyBpbiB1c2UgKHBtX3VzYWdlX2NudCBpcyBncmVhdGVyIHRoYW4gMCkuICBJZiB0aGV5Ci0gKiBhcmUsIHRoZSBhdXRvc3VzcGVuZCBmYWlscy4KKyAqIElmIGFuIGF1dG9zdXNwZW5kIGlzIGluIHByb2dyZXNzIHRoZSByb3V0aW5lIGNoZWNrcyBmaXJzdCB0byBtYWtlIHN1cmUKKyAqIHRoYXQgbmVpdGhlciB0aGUgZGV2aWNlIGl0c2VsZiBvciBhbnkgb2YgaXRzIGFjdGl2ZSBpbnRlcmZhY2VzIGlzIGluIHVzZQorICogKHBtX3VzYWdlX2NudCBpcyBncmVhdGVyIHRoYW4gMCkuICBJZiB0aGV5IGFyZSwgdGhlIGF1dG9zdXNwZW5kIGZhaWxzLgogICoKICAqIElmIHRoZSBzdXNwZW5kIHN1Y2NlZWRzLCB0aGUgcm91dGluZSByZWN1cnNpdmVseSBxdWV1ZXMgYW4gYXV0b3N1c3BlbmQKICAqIHJlcXVlc3QgZm9yIEB1ZGV2J3MgcGFyZW50IGRldmljZSwgdGhlcmVieSBwcm9wYWdhdGluZyB0aGUgY2hhbmdlIHVwCkBAIC0xMTU3LDcgKzExNzgsNyBAQAogCiAJdWRldi0+ZG9fcmVtb3RlX3dha2V1cCA9IGRldmljZV9tYXlfd2FrZXVwKCZ1ZGV2LT5kZXYpOwogCi0JaWYgKHVkZXYtPmF1dG9fcG0pIHsKKwlpZiAobXNnLmV2ZW50ICYgUE1fRVZFTlRfQVVUTykgewogCQlzdGF0dXMgPSBhdXRvc3VzcGVuZF9jaGVjayh1ZGV2LCAwKTsKIAkJaWYgKHN0YXR1cyA8IDApCiAJCQlnb3RvIGRvbmU7CkBAIC0xMTc3LDEzICsxMTk4LDE2IEBACiAKIAkvKiBJZiB0aGUgc3VzcGVuZCBmYWlsZWQsIHJlc3VtZSBpbnRlcmZhY2VzIHRoYXQgZGlkIGdldCBzdXNwZW5kZWQgKi8KIAlpZiAoc3RhdHVzICE9IDApIHsKKwkJcG1fbWVzc2FnZV90IG1zZzI7CisKKwkJbXNnMi5ldmVudCA9IG1zZy5ldmVudCBeIChQTV9FVkVOVF9TVVNQRU5EIHwgUE1fRVZFTlRfUkVTVU1FKTsKIAkJd2hpbGUgKC0taSA+PSAwKSB7CiAJCQlpbnRmID0gdWRldi0+YWN0Y29uZmlnLT5pbnRlcmZhY2VbaV07Ci0JCQl1c2JfcmVzdW1lX2ludGVyZmFjZSh1ZGV2LCBpbnRmLCAwKTsKKwkJCXVzYl9yZXN1bWVfaW50ZXJmYWNlKHVkZXYsIGludGYsIG1zZzIsIDApOwogCQl9CiAKIAkJLyogVHJ5IGFub3RoZXIgYXV0b3N1c3BlbmQgd2hlbiB0aGUgaW50ZXJmYWNlcyBhcmVuJ3QgYnVzeSAqLwotCQlpZiAodWRldi0+YXV0b19wbSkKKwkJaWYgKG1zZy5ldmVudCAmIFBNX0VWRU5UX0FVVE8pCiAJCQlhdXRvc3VzcGVuZF9jaGVjayh1ZGV2LCBzdGF0dXMgPT0gLUVCVVNZKTsKIAogCS8qIElmIHRoZSBzdXNwZW5kIHN1Y2NlZWRlZCB0aGVuIHByZXZlbnQgYW55IG1vcmUgVVJCIHN1Ym1pc3Npb25zLApAQCAtMTIxMyw2ICsxMjM3LDcgQEAKIC8qKgogICogdXNiX3Jlc3VtZV9ib3RoIC0gcmVzdW1lIGEgVVNCIGRldmljZSBhbmQgaXRzIGludGVyZmFjZXMKICAqIEB1ZGV2OiB0aGUgdXNiX2RldmljZSB0byByZXN1bWUKKyAqIEBtc2c6IFBvd2VyIE1hbmFnZW1lbnQgbWVzc2FnZSBkZXNjcmliaW5nIHRoaXMgc3RhdGUgdHJhbnNpdGlvbgogICoKICAqIFRoaXMgaXMgdGhlIGNlbnRyYWwgcm91dGluZSBmb3IgcmVzdW1pbmcgVVNCIGRldmljZXMuICBJdCBjYWxscyB0aGUKICAqIHRoZSByZXN1bWUgbWV0aG9kIGZvciBAdWRldiBhbmQgdGhlbiBjYWxscyB0aGUgcmVzdW1lIG1ldGhvZHMgZm9yIGFsbApAQCAtMTIzOCw3ICsxMjYzLDcgQEAKICAqCiAgKiBUaGlzIHJvdXRpbmUgY2FuIHJ1biBvbmx5IGluIHByb2Nlc3MgY29udGV4dC4KICAqLwotc3RhdGljIGludCB1c2JfcmVzdW1lX2JvdGgoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCitzdGF0aWMgaW50IHVzYl9yZXN1bWVfYm90aChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgcG1fbWVzc2FnZV90IG1zZykKIHsKIAlpbnQJCQlzdGF0dXMgPSAwOwogCWludAkJCWk7CkBAIC0xMjU0LDE0ICsxMjc5LDE1IEBACiAKIAkvKiBQcm9wYWdhdGUgdGhlIHJlc3VtZSB1cCB0aGUgdHJlZSwgaWYgbmVjZXNzYXJ5ICovCiAJaWYgKHVkZXYtPnN0YXRlID09IFVTQl9TVEFURV9TVVNQRU5ERUQpIHsKLQkJaWYgKHVkZXYtPmF1dG9fcG0gJiYgdWRldi0+YXV0b3Jlc3VtZV9kaXNhYmxlZCkgeworCQlpZiAoKG1zZy5ldmVudCAmIFBNX0VWRU5UX0FVVE8pICYmCisJCQkJdWRldi0+YXV0b3Jlc3VtZV9kaXNhYmxlZCkgewogCQkJc3RhdHVzID0gLUVQRVJNOwogCQkJZ290byBkb25lOwogCQl9CiAJCWlmIChwYXJlbnQpIHsKIAkJCXN0YXR1cyA9IHVzYl9hdXRvcmVzdW1lX2RldmljZShwYXJlbnQpOwogCQkJaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCQkJc3RhdHVzID0gdXNiX3Jlc3VtZV9kZXZpY2UodWRldik7CisJCQkJc3RhdHVzID0gdXNiX3Jlc3VtZV9kZXZpY2UodWRldiwgbXNnKTsKIAkJCQlpZiAoc3RhdHVzIHx8IHVkZXYtPnN0YXRlID09CiAJCQkJCQlVU0JfU1RBVEVfTk9UQVRUQUNIRUQpIHsKIAkJCQkJdXNiX2F1dG9zdXNwZW5kX2RldmljZShwYXJlbnQpOwpAQCAtMTI4NCwxNSArMTMxMCwxNiBAQAogCQkJLyogV2UgY2FuJ3QgcHJvZ2FnYXRlIGJleW9uZCB0aGUgVVNCIHN1YnN5c3RlbSwKIAkJCSAqIHNvIGlmIGEgcm9vdCBodWIncyBjb250cm9sbGVyIGlzIHN1c3BlbmRlZAogCQkJICogdGhlbiB3ZSdyZSBzdHVjay4gKi8KLQkJCXN0YXR1cyA9IHVzYl9yZXN1bWVfZGV2aWNlKHVkZXYpOworCQkJc3RhdHVzID0gdXNiX3Jlc3VtZV9kZXZpY2UodWRldiwgbXNnKTsKIAkJfQogCX0gZWxzZSBpZiAodWRldi0+cmVzZXRfcmVzdW1lKQotCQlzdGF0dXMgPSB1c2JfcmVzdW1lX2RldmljZSh1ZGV2KTsKKwkJc3RhdHVzID0gdXNiX3Jlc3VtZV9kZXZpY2UodWRldiwgbXNnKTsKIAogCWlmIChzdGF0dXMgPT0gMCAmJiB1ZGV2LT5hY3Rjb25maWcpIHsKIAkJZm9yIChpID0gMDsgaSA8IHVkZXYtPmFjdGNvbmZpZy0+ZGVzYy5iTnVtSW50ZXJmYWNlczsgaSsrKSB7CiAJCQlpbnRmID0gdWRldi0+YWN0Y29uZmlnLT5pbnRlcmZhY2VbaV07Ci0JCQl1c2JfcmVzdW1lX2ludGVyZmFjZSh1ZGV2LCBpbnRmLCB1ZGV2LT5yZXNldF9yZXN1bWUpOworCQkJdXNiX3Jlc3VtZV9pbnRlcmZhY2UodWRldiwgaW50ZiwgbXNnLAorCQkJCQl1ZGV2LT5yZXNldF9yZXN1bWUpOwogCQl9CiAJfQogCkBAIC0xMzIwLDEzICsxMzQ3LDEzIEBACiAJCXVkZXYtPmxhc3RfYnVzeSA9IGppZmZpZXM7CiAJaWYgKGluY191c2FnZV9jbnQgPj0gMCAmJiB1ZGV2LT5wbV91c2FnZV9jbnQgPiAwKSB7CiAJCWlmICh1ZGV2LT5zdGF0ZSA9PSBVU0JfU1RBVEVfU1VTUEVOREVEKQotCQkJc3RhdHVzID0gdXNiX3Jlc3VtZV9ib3RoKHVkZXYpOworCQkJc3RhdHVzID0gdXNiX3Jlc3VtZV9ib3RoKHVkZXYsIFBNU0dfQVVUT19SRVNVTUUpOwogCQlpZiAoc3RhdHVzICE9IDApCiAJCQl1ZGV2LT5wbV91c2FnZV9jbnQgLT0gaW5jX3VzYWdlX2NudDsKIAkJZWxzZSBpZiAoaW5jX3VzYWdlX2NudCkKIAkJCXVkZXYtPmxhc3RfYnVzeSA9IGppZmZpZXM7CiAJfSBlbHNlIGlmIChpbmNfdXNhZ2VfY250IDw9IDAgJiYgdWRldi0+cG1fdXNhZ2VfY250IDw9IDApIHsKLQkJc3RhdHVzID0gdXNiX3N1c3BlbmRfYm90aCh1ZGV2LCBQTVNHX1NVU1BFTkQpOworCQlzdGF0dXMgPSB1c2Jfc3VzcGVuZF9ib3RoKHVkZXYsIFBNU0dfQVVUT19TVVNQRU5EKTsKIAl9CiAJdXNiX3BtX3VubG9jayh1ZGV2KTsKIAlyZXR1cm4gc3RhdHVzOwpAQCAtMTM0MSw2ICsxMzY4LDE5IEBACiAJdXNiX2F1dG9wbV9kb19kZXZpY2UodWRldiwgMCk7CiB9CiAKKy8qIHVzYl9hdXRvcmVzdW1lX3dvcmsgLSBjYWxsYmFjayByb3V0aW5lIHRvIGF1dG9yZXN1bWUgYSBVU0IgZGV2aWNlICovCit2b2lkIHVzYl9hdXRvcmVzdW1lX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB1c2JfZGV2aWNlLCBhdXRvcmVzdW1lKTsKKworCS8qIFdha2UgaXQgdXAsIGxldCB0aGUgZHJpdmVycyBkbyB0aGVpciB0aGluZywgYW5kIHRoZW4gcHV0IGl0CisJICogYmFjayB0byBzbGVlcC4KKwkgKi8KKwlpZiAodXNiX2F1dG9wbV9kb19kZXZpY2UodWRldiwgMSkgPT0gMCkKKwkJdXNiX2F1dG9wbV9kb19kZXZpY2UodWRldiwgLTEpOworfQorCiAvKioKICAqIHVzYl9hdXRvc3VzcGVuZF9kZXZpY2UgLSBkZWxheWVkIGF1dG9zdXNwZW5kIG9mIGEgVVNCIGRldmljZSBhbmQgaXRzIGludGVyZmFjZXMKICAqIEB1ZGV2OiB0aGUgdXNiX2RldmljZSB0byBhdXRvc3VzcGVuZApAQCAtMTQzNywxMyArMTQ3NywxNCBAQAogCQl1ZGV2LT5sYXN0X2J1c3kgPSBqaWZmaWVzOwogCQlpZiAoaW5jX3VzYWdlX2NudCA+PSAwICYmIGludGYtPnBtX3VzYWdlX2NudCA+IDApIHsKIAkJCWlmICh1ZGV2LT5zdGF0ZSA9PSBVU0JfU1RBVEVfU1VTUEVOREVEKQotCQkJCXN0YXR1cyA9IHVzYl9yZXN1bWVfYm90aCh1ZGV2KTsKKwkJCQlzdGF0dXMgPSB1c2JfcmVzdW1lX2JvdGgodWRldiwKKwkJCQkJCVBNU0dfQVVUT19SRVNVTUUpOwogCQkJaWYgKHN0YXR1cyAhPSAwKQogCQkJCWludGYtPnBtX3VzYWdlX2NudCAtPSBpbmNfdXNhZ2VfY250OwogCQkJZWxzZQogCQkJCXVkZXYtPmxhc3RfYnVzeSA9IGppZmZpZXM7CiAJCX0gZWxzZSBpZiAoaW5jX3VzYWdlX2NudCA8PSAwICYmIGludGYtPnBtX3VzYWdlX2NudCA8PSAwKSB7Ci0JCQlzdGF0dXMgPSB1c2Jfc3VzcGVuZF9ib3RoKHVkZXYsIFBNU0dfU1VTUEVORCk7CisJCQlzdGF0dXMgPSB1c2Jfc3VzcGVuZF9ib3RoKHVkZXYsIFBNU0dfQVVUT19TVVNQRU5EKTsKIAkJfQogCX0KIAl1c2JfcG1fdW5sb2NrKHVkZXYpOwpAQCAtMTQ5Miw2ICsxNTMzLDQ1IEBACiBFWFBPUlRfU1lNQk9MX0dQTCh1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UpOwogCiAvKioKKyAqIHVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZV9hc3luYyAtIGRlY3JlbWVudCBhIFVTQiBpbnRlcmZhY2UncyBQTS11c2FnZSBjb3VudGVyCisgKiBAaW50ZjogdGhlIHVzYl9pbnRlcmZhY2Ugd2hvc2UgY291bnRlciBzaG91bGQgYmUgZGVjcmVtZW50ZWQKKyAqCisgKiBUaGlzIHJvdXRpbmUgZG9lcyBlc3NlbnRpYWxseSB0aGUgc2FtZSB0aGluZyBhcworICogdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKCk6IGl0IGRlY3JlbWVudHMgQGludGYncyB1c2FnZSBjb3VudGVyIGFuZAorICogcXVldWVzIGEgZGVsYXllZCBhdXRvc3VzcGVuZCByZXF1ZXN0IGlmIHRoZSBjb3VudGVyIGlzIDw9IDAuICBUaGUKKyAqIGRpZmZlcmVuY2UgaXMgdGhhdCBpdCBkb2VzIG5vdCBhY3F1aXJlIHRoZSBkZXZpY2UncyBwbV9tdXRleDsKKyAqIGNhbGxlcnMgbXVzdCBoYW5kbGUgYWxsIHN5bmNocm9uaXphdGlvbiBpc3N1ZXMgdGhlbXNlbHZlcy4KKyAqCisgKiBUeXBpY2FsbHkgYSBkcml2ZXIgd291bGQgY2FsbCB0aGlzIHJvdXRpbmUgZHVyaW5nIGFuIFVSQidzIGNvbXBsZXRpb24KKyAqIGhhbmRsZXIsIGlmIG5vIG1vcmUgVVJCcyB3ZXJlIHBlbmRpbmcuCisgKgorICogVGhpcyByb3V0aW5lIGNhbiBydW4gaW4gYXRvbWljIGNvbnRleHQuCisgKi8KK3ZvaWQgdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlX2FzeW5jKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCB1c2JfZGV2aWNlCSp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlpbnQJCQlzdGF0dXMgPSAwOworCisJaWYgKGludGYtPmNvbmRpdGlvbiA9PSBVU0JfSU5URVJGQUNFX1VOQk9VTkQpIHsKKwkJc3RhdHVzID0gLUVOT0RFVjsKKwl9IGVsc2UgeworCQl1ZGV2LT5sYXN0X2J1c3kgPSBqaWZmaWVzOworCQktLWludGYtPnBtX3VzYWdlX2NudDsKKwkJaWYgKHVkZXYtPmF1dG9zdXNwZW5kX2Rpc2FibGVkIHx8IHVkZXYtPmF1dG9zdXNwZW5kX2RlbGF5IDwgMCkKKwkJCXN0YXR1cyA9IC1FUEVSTTsKKwkJZWxzZSBpZiAoaW50Zi0+cG1fdXNhZ2VfY250IDw9IDAgJiYKKwkJCQkhdGltZXJfcGVuZGluZygmdWRldi0+YXV0b3N1c3BlbmQudGltZXIpKSB7CisJCQlxdWV1ZV9kZWxheWVkX3dvcmsoa3N1c3BlbmRfdXNiX3dxLCAmdWRldi0+YXV0b3N1c3BlbmQsCisJCQkJCXJvdW5kX2ppZmZpZXNfdXBfcmVsYXRpdmUoCisJCQkJCQl1ZGV2LT5hdXRvc3VzcGVuZF9kZWxheSkpOworCQl9CisJfQorCWRldl92ZGJnKCZpbnRmLT5kZXYsICIlczogc3RhdHVzICVkIGNudCAlZFxuIiwKKwkJCV9fZnVuY19fLCBzdGF0dXMsIGludGYtPnBtX3VzYWdlX2NudCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2VfYXN5bmMpOworCisvKioKICAqIHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZSAtIGluY3JlbWVudCBhIFVTQiBpbnRlcmZhY2UncyBQTS11c2FnZSBjb3VudGVyCiAgKiBAaW50ZjogdGhlIHVzYl9pbnRlcmZhY2Ugd2hvc2UgY291bnRlciBzaG91bGQgYmUgaW5jcmVtZW50ZWQKICAqCkBAIC0xNTM3LDYgKzE2MTcsMzcgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZSk7CiAKIC8qKgorICogdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlX2FzeW5jIC0gaW5jcmVtZW50IGEgVVNCIGludGVyZmFjZSdzIFBNLXVzYWdlIGNvdW50ZXIKKyAqIEBpbnRmOiB0aGUgdXNiX2ludGVyZmFjZSB3aG9zZSBjb3VudGVyIHNob3VsZCBiZSBpbmNyZW1lbnRlZAorICoKKyAqIFRoaXMgcm91dGluZSBkb2VzIG11Y2ggdGhlIHNhbWUgdGhpbmcgYXMKKyAqIHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZSgpOiBpdCBpbmNyZW1lbnRzIEBpbnRmJ3MgdXNhZ2UgY291bnRlciBhbmQKKyAqIHF1ZXVlcyBhbiBhdXRvcmVzdW1lIHJlcXVlc3QgaWYgdGhlIHJlc3VsdCBpcyA+IDAuICBUaGUgZGlmZmVyZW5jZXMKKyAqIGFyZSB0aGF0IGl0IGRvZXMgbm90IGFjcXVpcmUgdGhlIGRldmljZSdzIHBtX211dGV4IChjYWxsZXJzIG11c3QKKyAqIGhhbmRsZSBhbGwgc3luY2hyb25pemF0aW9uIGlzc3VlcyB0aGVtc2VsdmVzKSwgYW5kIGl0IGRvZXMgbm90CisgKiBhdXRvcmVzdW1lIHRoZSBkZXZpY2UgZGlyZWN0bHkgKGl0IG9ubHkgcXVldWVzIGEgcmVxdWVzdCkuICBBZnRlciBhCisgKiBzdWNjZXNzZnVsIGNhbGwsIHRoZSBkZXZpY2Ugd2lsbCBnZW5lcmFsbHkgbm90IHlldCBiZSByZXN1bWVkLgorICoKKyAqIFRoaXMgcm91dGluZSBjYW4gcnVuIGluIGF0b21pYyBjb250ZXh0LgorICovCitpbnQgdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlX2FzeW5jKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCB1c2JfZGV2aWNlCSp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlpbnQJCQlzdGF0dXMgPSAwOworCisJaWYgKGludGYtPmNvbmRpdGlvbiA9PSBVU0JfSU5URVJGQUNFX1VOQk9VTkQpCisJCXN0YXR1cyA9IC1FTk9ERVY7CisJZWxzZSBpZiAodWRldi0+YXV0b3Jlc3VtZV9kaXNhYmxlZCkKKwkJc3RhdHVzID0gLUVQRVJNOworCWVsc2UgaWYgKCsraW50Zi0+cG1fdXNhZ2VfY250ID4gMCAmJiB1ZGV2LT5zdGF0ZSA9PSBVU0JfU1RBVEVfU1VTUEVOREVEKQorCQlxdWV1ZV93b3JrKGtzdXNwZW5kX3VzYl93cSwgJnVkZXYtPmF1dG9yZXN1bWUpOworCWRldl92ZGJnKCZpbnRmLT5kZXYsICIlczogc3RhdHVzICVkIGNudCAlZFxuIiwKKwkJCV9fZnVuY19fLCBzdGF0dXMsIGludGYtPnBtX3VzYWdlX2NudCk7CisJcmV0dXJuIHN0YXR1czsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZV9hc3luYyk7CisKKy8qKgogICogdXNiX2F1dG9wbV9zZXRfaW50ZXJmYWNlIC0gc2V0IGEgVVNCIGludGVyZmFjZSdzIGF1dG9zdXNwZW5kIHN0YXRlCiAgKiBAaW50ZjogdGhlIHVzYl9pbnRlcmZhY2Ugd2hvc2Ugc3RhdGUgc2hvdWxkIGJlIHNldAogICoKQEAgLTE1NjMsNiArMTY3NCw5IEBACiB2b2lkIHVzYl9hdXRvc3VzcGVuZF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHt9CiAKK3ZvaWQgdXNiX2F1dG9yZXN1bWVfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7fQorCiAjZW5kaWYgLyogQ09ORklHX1VTQl9TVVNQRU5EICovCiAKIC8qKgpAQCAtMTU5NSw2ICsxNzA5LDcgQEAKIC8qKgogICogdXNiX2V4dGVybmFsX3Jlc3VtZV9kZXZpY2UgLSBleHRlcm5hbCByZXN1bWUgb2YgYSBVU0IgZGV2aWNlIGFuZCBpdHMgaW50ZXJmYWNlcwogICogQHVkZXY6IHRoZSB1c2JfZGV2aWNlIHRvIHJlc3VtZQorICogQG1zZzogUG93ZXIgTWFuYWdlbWVudCBtZXNzYWdlIGRlc2NyaWJpbmcgdGhpcyBzdGF0ZSB0cmFuc2l0aW9uCiAgKgogICogVGhpcyByb3V0aW5lIGhhbmRsZXMgZXh0ZXJuYWwgcmVzdW1lIHJlcXVlc3RzOiBvbmVzIG5vdCBnZW5lcmF0ZWQKICAqIGludGVybmFsbHkgYnkgYSBVU0IgZHJpdmVyIChhdXRvcmVzdW1lKSBidXQgcmF0aGVyIGNvbWluZyBmcm9tIHRoZSB1c2VyCkBAIC0xNjAzLDEzICsxNzE4LDEzIEBACiAgKgogICogVGhlIGNhbGxlciBtdXN0IGhvbGQgQHVkZXYncyBkZXZpY2UgbG9jay4KICAqLwotaW50IHVzYl9leHRlcm5hbF9yZXN1bWVfZGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQoraW50IHVzYl9leHRlcm5hbF9yZXN1bWVfZGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBwbV9tZXNzYWdlX3QgbXNnKQogewogCWludAlzdGF0dXM7CiAKIAl1c2JfcG1fbG9jayh1ZGV2KTsKIAl1ZGV2LT5hdXRvX3BtID0gMDsKLQlzdGF0dXMgPSB1c2JfcmVzdW1lX2JvdGgodWRldik7CisJc3RhdHVzID0gdXNiX3Jlc3VtZV9ib3RoKHVkZXYsIG1zZyk7CiAJdWRldi0+bGFzdF9idXN5ID0gamlmZmllczsKIAl1c2JfcG1fdW5sb2NrKHVkZXYpOwogCWlmIChzdGF0dXMgPT0gMCkKQEAgLTE2MjIsNyArMTczNyw3IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotaW50IHVzYl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCitpbnQgdXNiX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3QgbXNnKQogewogCXN0cnVjdCB1c2JfZGV2aWNlCSp1ZGV2OwogCkBAIC0xNjQxLDEwICsxNzU2LDEwIEBACiAJfQogCiAJdWRldi0+c2tpcF9zeXNfcmVzdW1lID0gMDsKLQlyZXR1cm4gdXNiX2V4dGVybmFsX3N1c3BlbmRfZGV2aWNlKHVkZXYsIG1lc3NhZ2UpOworCXJldHVybiB1c2JfZXh0ZXJuYWxfc3VzcGVuZF9kZXZpY2UodWRldiwgbXNnKTsKIH0KIAotaW50IHVzYl9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoraW50IHVzYl9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3QgbXNnKQogewogCXN0cnVjdCB1c2JfZGV2aWNlCSp1ZGV2OwogCkBAIC0xNjU2LDcgKzE3NzEsNyBAQAogCSAqLwogCWlmICh1ZGV2LT5za2lwX3N5c19yZXN1bWUpCiAJCXJldHVybiAwOwotCXJldHVybiB1c2JfZXh0ZXJuYWxfcmVzdW1lX2RldmljZSh1ZGV2KTsKKwlyZXR1cm4gdXNiX2V4dGVybmFsX3Jlc3VtZV9kZXZpY2UodWRldiwgbXNnKTsKIH0KIAogI2VuZGlmIC8qIENPTkZJR19QTSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9lbmRwb2ludC5jIGIvZHJpdmVycy91c2IvY29yZS9lbmRwb2ludC5jCmluZGV4IDk0NmZhZTQuLmUxNzEwZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvZW5kcG9pbnQuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2VuZHBvaW50LmMKQEAgLTI3Niw3ICsyNzYsNyBAQAogCWtmcmVlKGVwX2Rldik7CiB9CiAKLWludCB1c2JfY3JlYXRlX2VwX2ZpbGVzKHN0cnVjdCBkZXZpY2UgKnBhcmVudCwKK2ludCB1c2JfY3JlYXRlX2VwX2RldnMoc3RydWN0IGRldmljZSAqcGFyZW50LAogCQkJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplbmRwb2ludCwKIAkJCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQogewpAQCAtMzQwLDcgKzM0MCw3IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotdm9pZCB1c2JfcmVtb3ZlX2VwX2ZpbGVzKHN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZW5kcG9pbnQpCit2b2lkIHVzYl9yZW1vdmVfZXBfZGV2cyhzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVuZHBvaW50KQogewogCXN0cnVjdCBlcF9kZXZpY2UgKmVwX2RldiA9IGVuZHBvaW50LT5lcF9kZXY7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvZ2VuZXJpYy5jIGIvZHJpdmVycy91c2IvY29yZS9nZW5lcmljLmMKaW5kZXggN2U5MTJmMi4uMzBlY2FjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9nZW5lcmljLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9nZW5lcmljLmMKQEAgLTIwMCwxOCArMjAwLDE4IEBACiAJICogaW50ZXJmYWNlcyBtYW51YWxseSBieSBkb2luZyBhIGJ1cyAob3IgImdsb2JhbCIpIHN1c3BlbmQuCiAJICovCiAJaWYgKCF1ZGV2LT5wYXJlbnQpCi0JCXJjID0gaGNkX2J1c19zdXNwZW5kKHVkZXYpOworCQlyYyA9IGhjZF9idXNfc3VzcGVuZCh1ZGV2LCBtc2cpOwogCiAJLyogTm9uLXJvb3QgZGV2aWNlcyBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGZvciBGUkVFWkUgb3IgUFJFVEhBVyAqLwogCWVsc2UgaWYgKG1zZy5ldmVudCA9PSBQTV9FVkVOVF9GUkVFWkUgfHwgbXNnLmV2ZW50ID09IFBNX0VWRU5UX1BSRVRIQVcpCiAJCXJjID0gMDsKIAllbHNlCi0JCXJjID0gdXNiX3BvcnRfc3VzcGVuZCh1ZGV2KTsKKwkJcmMgPSB1c2JfcG9ydF9zdXNwZW5kKHVkZXYsIG1zZyk7CiAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbnQgZ2VuZXJpY19yZXN1bWUoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCitzdGF0aWMgaW50IGdlbmVyaWNfcmVzdW1lKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBwbV9tZXNzYWdlX3QgbXNnKQogewogCWludCByYzsKIApAQCAtMjIxLDkgKzIyMSw5IEBACiAJICogaW50ZXJmYWNlcyBtYW51YWxseSBieSBkb2luZyBhIGJ1cyAob3IgImdsb2JhbCIpIHJlc3VtZS4KIAkgKi8KIAlpZiAoIXVkZXYtPnBhcmVudCkKLQkJcmMgPSBoY2RfYnVzX3Jlc3VtZSh1ZGV2KTsKKwkJcmMgPSBoY2RfYnVzX3Jlc3VtZSh1ZGV2LCBtc2cpOwogCWVsc2UKLQkJcmMgPSB1c2JfcG9ydF9yZXN1bWUodWRldik7CisJCXJjID0gdXNiX3BvcnRfcmVzdW1lKHVkZXYsIG1zZyk7CiAJcmV0dXJuIHJjOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2hjZC1wY2kuYyBiL2RyaXZlcnMvdXNiL2NvcmUvaGNkLXBjaS5jCmluZGV4IDViODdhZTcuLjUwNzc0MWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvaGNkLXBjaS5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaGNkLXBjaS5jCkBAIC0xMjgsNiArMTI4LDcgQEAKIAl9CiAKIAlwY2lfc2V0X21hc3RlcihkZXYpOworCWRldmljZV9zZXRfd2FrZXVwX2VuYWJsZSgmZGV2LT5kZXYsIDEpOwogCiAJcmV0dmFsID0gdXNiX2FkZF9oY2QoaGNkLCBkZXYtPmlycSwgSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVEKTsKIAlpZiAocmV0dmFsICE9IDApCkBAIC0xOTEsMTcgKzE5MiwxNSBAQAogLyoqCiAgKiB1c2JfaGNkX3BjaV9zdXNwZW5kIC0gcG93ZXIgbWFuYWdlbWVudCBzdXNwZW5kIG9mIGEgUENJLWJhc2VkIEhDRAogICogQGRldjogVVNCIEhvc3QgQ29udHJvbGxlciBiZWluZyBzdXNwZW5kZWQKLSAqIEBtZXNzYWdlOiBzZW1hbnRpY3MgaW4gZmx1eAorICogQG1lc3NhZ2U6IFBvd2VyIE1hbmFnZW1lbnQgbWVzc2FnZSBkZXNjcmliaW5nIHRoaXMgc3RhdGUgdHJhbnNpdGlvbgogICoKLSAqIFN0b3JlIHRoaXMgZnVuY3Rpb24gaW4gdGhlIEhDRCdzIHN0cnVjdCBwY2lfZHJpdmVyIGFzIHN1c3BlbmQoKS4KKyAqIFN0b3JlIHRoaXMgZnVuY3Rpb24gaW4gdGhlIEhDRCdzIHN0cnVjdCBwY2lfZHJpdmVyIGFzIC5zdXNwZW5kLgogICovCiBpbnQgdXNiX2hjZF9wY2lfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKIHsKLQlzdHJ1Y3QgdXNiX2hjZAkJKmhjZDsKKwlzdHJ1Y3QgdXNiX2hjZAkJKmhjZCA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOwogCWludAkJCXJldHZhbCA9IDA7Ci0JaW50CQkJaGFzX3BjaV9wbTsKLQotCWhjZCA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOworCWludAkJCXdha2UsIHc7CiAKIAkvKiBSb290IGh1YiBzdXNwZW5kIHNob3VsZCBoYXZlIHN0b3BwZWQgYWxsIGRvd25zdHJlYW0gdHJhZmZpYywKIAkgKiBhbmQgYWxsIGJ1cyBtYXN0ZXIgdHJhZmZpYy4gIEFuZCBkb25lIHNvIGZvciBib3RoIHRoZSBpbnRlcmZhY2UKQEAgLTIxMiw4ICsyMTEsMTUgQEAKIAkgKiBvdGhlcndpc2UgdGhlIHN3c3VzcCB3aWxsIHNhdmUgKGFuZCByZXN0b3JlKSBnYXJiYWdlIHN0YXRlLgogCSAqLwogCWlmICghKGhjZC0+c3RhdGUgPT0gSENfU1RBVEVfU1VTUEVOREVEIHx8Ci0JCQloY2QtPnN0YXRlID09IEhDX1NUQVRFX0hBTFQpKQotCQlyZXR1cm4gLUVCVVNZOworCQkJaGNkLT5zdGF0ZSA9PSBIQ19TVEFURV9IQUxUKSkgeworCQlkZXZfd2FybigmZGV2LT5kZXYsICJSb290IGh1YiBpcyBub3Qgc3VzcGVuZGVkXG4iKTsKKwkJcmV0dmFsID0gLUVCVVNZOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogV2UgbWlnaHQgYWxyZWFkeSBiZSBzdXNwZW5kZWQgKHJ1bnRpbWUgUE0gLS0gbm90IHlldCB3cml0dGVuKSAqLworCWlmIChkZXYtPmN1cnJlbnRfc3RhdGUgIT0gUENJX0QwKQorCQlnb3RvIGRvbmU7CiAKIAlpZiAoaGNkLT5kcml2ZXItPnBjaV9zdXNwZW5kKSB7CiAJCXJldHZhbCA9IGhjZC0+ZHJpdmVyLT5wY2lfc3VzcGVuZChoY2QsIG1lc3NhZ2UpOwpAQCAtMjIxLDQ5ICsyMjcsNjAgQEAKIAkJaWYgKHJldHZhbCkKIAkJCWdvdG8gZG9uZTsKIAl9CisKIAlzeW5jaHJvbml6ZV9pcnEoZGV2LT5pcnEpOwogCi0JLyogRklYTUUgdW50aWwgdGhlIGdlbmVyaWMgUE0gaW50ZXJmYWNlcyBjaGFuZ2UgYSBsb3QgbW9yZSwgdGhpcwotCSAqIGNhbid0IHVzZSBQQ0kgRDEgYW5kIEQyIHN0YXRlcy4gIEZvciBleGFtcGxlLCB0aGUgY29uZnVzaW9uCi0JICogYmV0d2VlbiBtZXNzYWdlcyBhbmQgc3RhdGVzIHdpbGwgbmVlZCB0byB2YW5pc2gsIGFuZCBtZXNzYWdlcwotCSAqIHdpbGwgbmVlZCB0byBwcm92aWRlIGEgdGFyZ2V0IHN5c3RlbSBzdGF0ZSBhZ2Fpbi4KLQkgKgotCSAqIEl0J2xsIGJlIGltcG9ydGFudCB0byBsZWFybiBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIHRhcmdldCBzdGF0ZSwKLQkgKiBlc3BlY2lhbGx5IG9uIGVtYmVkZGVkIGhhcmR3YXJlIHdoZXJlIHRoZSBIQ0Qgd2lsbCBvZnRlbiBiZSBpbgotCSAqIGNoYXJnZSBvZiBhbiBleHRlcm5hbCBWQlVTIHBvd2VyIHN1cHBseSBhbmQgb25lIG9yIG1vcmUgY2xvY2tzLgotCSAqIFNvbWUgdGFyZ2V0IHN5c3RlbSBzdGF0ZXMgd2lsbCBsZWF2ZSB0aGVtIGFjdGl2ZTsgb3RoZXJzIHdvbid0LgotCSAqIChXaXRoIFBDSSwgdGhhdCdzIG9mdGVuIGhhbmRsZWQgYnkgcGxhdGZvcm0gQklPUyBjb2RlLikKKwkvKiBEb24ndCBmYWlsIG9uIGVycm9yIHRvIGVuYWJsZSB3YWtldXAuICBXZSByZWx5IG9uIHBjaSBjb2RlCisJICogdG8gcmVqZWN0IHJlcXVlc3RzIHRoZSBoYXJkd2FyZSBjYW4ndCBpbXBsZW1lbnQsIHJhdGhlcgorCSAqIHRoYW4gY29kaW5nIHRoZSBzYW1lIHRoaW5nLgogCSAqLwotCi0JLyogZXZlbiB3aGVuIHRoZSBQQ0kgbGF5ZXIgcmVqZWN0cyBzb21lIG9mIHRoZSBQQ0kgY2FsbHMKLQkgKiBiZWxvdywgSENzIGNhbiB0cnkgZ2xvYmFsIHN1c3BlbmQgYW5kIHJlZHVjZSBETUEgdHJhZmZpYy4KLQkgKiBQTS1zZW5zaXRpdmUgSENEcyBtYXkgYWxyZWFkeSBoYXZlIGRvbmUgdGhpcy4KLQkgKi8KLQloYXNfcGNpX3BtID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfUE0pOworCXdha2UgPSAoaGNkLT5zdGF0ZSA9PSBIQ19TVEFURV9TVVNQRU5ERUQgJiYKKwkJCWRldmljZV9tYXlfd2FrZXVwKCZkZXYtPmRldikpOworCXcgPSBwY2lfd2FrZV9mcm9tX2QzKGRldiwgd2FrZSk7CisJaWYgKHcgPCAwKQorCQl3YWtlID0gdzsKKwlkZXZfZGJnKCZkZXYtPmRldiwgIndha2V1cDogJWRcbiIsIHdha2UpOwogCiAJLyogRG93bnN0cmVhbSBwb3J0cyBmcm9tIHRoaXMgcm9vdCBodWIgc2hvdWxkIGFscmVhZHkgYmUgcXVpZXNjZWQsIHNvCiAJICogdGhlcmUgd2lsbCBiZSBubyBETUEgYWN0aXZpdHkuICBOb3cgd2UgY2FuIHNodXQgZG93biB0aGUgdXBzdHJlYW0KIAkgKiBsaW5rIChleGNlcHQgbWF5YmUgZm9yIFBNRSMgcmVzdW1lIHNpZ25hbGluZykgYW5kIGVudGVyIHNvbWUgUENJCiAJICogbG93IHBvd2VyIHN0YXRlLCBpZiB0aGUgaGFyZHdhcmUgYWxsb3dzLgogCSAqLwotCWlmIChoY2QtPnN0YXRlID09IEhDX1NUQVRFX1NVU1BFTkRFRCkgeworCXBjaV9kaXNhYmxlX2RldmljZShkZXYpOworIGRvbmU6CisJcmV0dXJuIHJldHZhbDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVzYl9oY2RfcGNpX3N1c3BlbmQpOwogCi0JCS8qIG5vIERNQSBvciBJUlFzIGV4Y2VwdCB3aGVuIEhDIGlzIGFjdGl2ZSAqLwotCQlpZiAoZGV2LT5jdXJyZW50X3N0YXRlID09IFBDSV9EMCkgewotCQkJcGNpX3NhdmVfc3RhdGUoZGV2KTsKLQkJCXBjaV9kaXNhYmxlX2RldmljZShkZXYpOwotCQl9CisvKioKKyAqIHVzYl9oY2RfcGNpX3N1c3BlbmRfbGF0ZSAtIHN1c3BlbmQgYSBQQ0ktYmFzZWQgSENEIGFmdGVyIElSUXMgYXJlIGRpc2FibGVkCisgKiBAZGV2OiBVU0IgSG9zdCBDb250cm9sbGVyIGJlaW5nIHN1c3BlbmRlZAorICogQG1lc3NhZ2U6IFBvd2VyIE1hbmFnZW1lbnQgbWVzc2FnZSBkZXNjcmliaW5nIHRoaXMgc3RhdGUgdHJhbnNpdGlvbgorICoKKyAqIFN0b3JlIHRoaXMgZnVuY3Rpb24gaW4gdGhlIEhDRCdzIHN0cnVjdCBwY2lfZHJpdmVyIGFzIC5zdXNwZW5kX2xhdGUuCisgKi8KK2ludCB1c2JfaGNkX3BjaV9zdXNwZW5kX2xhdGUoc3RydWN0IHBjaV9kZXYgKmRldiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCit7CisJaW50CQkJcmV0dmFsID0gMDsKKwlpbnQJCQloYXNfcGNpX3BtOwogCi0JCWlmIChtZXNzYWdlLmV2ZW50ID09IFBNX0VWRU5UX0ZSRUVaRSB8fAotCQkJCW1lc3NhZ2UuZXZlbnQgPT0gUE1fRVZFTlRfUFJFVEhBVykgewotCQkJZGV2X2RiZyhoY2QtPnNlbGYuY29udHJvbGxlciwgIi0tPiBubyBzdGF0ZSBjaGFuZ2VcbiIpOwotCQkJZ290byBkb25lOwotCQl9CisJLyogV2UgbWlnaHQgYWxyZWFkeSBiZSBzdXNwZW5kZWQgKHJ1bnRpbWUgUE0gLS0gbm90IHlldCB3cml0dGVuKSAqLworCWlmIChkZXYtPmN1cnJlbnRfc3RhdGUgIT0gUENJX0QwKQorCQlnb3RvIGRvbmU7CiAKLQkJaWYgKCFoYXNfcGNpX3BtKSB7Ci0JCQlkZXZfZGJnKGhjZC0+c2VsZi5jb250cm9sbGVyLCAiLS0+IFBDSSBEMC9sZWdhY3lcbiIpOwotCQkJZ290byBkb25lOwotCQl9CisJcGNpX3NhdmVfc3RhdGUoZGV2KTsKKworCS8qIERvbid0IGNoYW5nZSBzdGF0ZSBpZiB3ZSBkb24ndCBuZWVkIHRvICovCisJaWYgKG1lc3NhZ2UuZXZlbnQgPT0gUE1fRVZFTlRfRlJFRVpFIHx8CisJCQltZXNzYWdlLmV2ZW50ID09IFBNX0VWRU5UX1BSRVRIQVcpIHsKKwkJZGV2X2RiZygmZGV2LT5kZXYsICItLT4gbm8gc3RhdGUgY2hhbmdlXG4iKTsKKwkJZ290byBkb25lOworCX0KKworCWhhc19wY2lfcG0gPSBwY2lfZmluZF9jYXBhYmlsaXR5KGRldiwgUENJX0NBUF9JRF9QTSk7CisJaWYgKCFoYXNfcGNpX3BtKSB7CisJCWRldl9kYmcoJmRldi0+ZGV2LCAiLS0+IFBDSSBEMCBsZWdhY3lcbiIpOworCX0gZWxzZSB7CiAKIAkJLyogTk9URTogIGRldi0+Y3VycmVudF9zdGF0ZSBiZWNvbWVzIG5vbnplcm8gb25seSBoZXJlLCBhbmQKIAkJICogb25seSBmb3IgZGV2aWNlcyB0aGF0IHN1cHBvcnQgUENJIFBNLiAgQWxzbywgZXhpdGluZwpAQCAtMjczLDM1ICsyOTAsMTYgQEAKIAkJcmV0dmFsID0gcGNpX3NldF9wb3dlcl9zdGF0ZShkZXYsIFBDSV9EM2hvdCk7CiAJCXN1c3BlbmRfcmVwb3J0X3Jlc3VsdChwY2lfc2V0X3Bvd2VyX3N0YXRlLCByZXR2YWwpOwogCQlpZiAocmV0dmFsID09IDApIHsKLQkJCWludCB3YWtlID0gZGV2aWNlX2Nhbl93YWtldXAoJmhjZC0+c2VsZi5yb290X2h1Yi0+ZGV2KTsKLQotCQkJd2FrZSA9IHdha2UgJiYgZGV2aWNlX21heV93YWtldXAoaGNkLT5zZWxmLmNvbnRyb2xsZXIpOwotCi0JCQlkZXZfZGJnKGhjZC0+c2VsZi5jb250cm9sbGVyLCAiLS0+IFBDSSBEMyVzXG4iLAotCQkJCQl3YWtlID8gIi93YWtldXAiIDogIiIpOwotCi0JCQkvKiBJZ25vcmUgdGhlc2UgcmV0dXJuIHZhbHVlcy4gIFdlIHJlbHkgb24gcGNpIGNvZGUgdG8KLQkJCSAqIHJlamVjdCByZXF1ZXN0cyB0aGUgaGFyZHdhcmUgY2FuJ3QgaW1wbGVtZW50LCByYXRoZXIKLQkJCSAqIHRoYW4gY29kaW5nIHRoZSBzYW1lIHRoaW5nLgotCQkJICovCi0JCQkodm9pZCkgcGNpX2VuYWJsZV93YWtlKGRldiwgUENJX0QzaG90LCB3YWtlKTsKLQkJCSh2b2lkKSBwY2lfZW5hYmxlX3dha2UoZGV2LCBQQ0lfRDNjb2xkLCB3YWtlKTsKKwkJCWRldl9kYmcoJmRldi0+ZGV2LCAiLS0+IFBDSSBEM1xuIik7CiAJCX0gZWxzZSB7CiAJCQlkZXZfZGJnKCZkZXYtPmRldiwgIlBDSSBEMyBzdXNwZW5kIGZhaWwsICVkXG4iLAogCQkJCQlyZXR2YWwpOwotCQkJKHZvaWQpIHVzYl9oY2RfcGNpX3Jlc3VtZShkZXYpOworCQkJcGNpX3Jlc3RvcmVfc3RhdGUoZGV2KTsKIAkJfQotCi0JfSBlbHNlIGlmIChoY2QtPnN0YXRlICE9IEhDX1NUQVRFX0hBTFQpIHsKLQkJZGV2X2RiZyhoY2QtPnNlbGYuY29udHJvbGxlciwgImhjZCBzdGF0ZSAlZDsgbm90IHN1c3BlbmRlZFxuIiwKLQkJCWhjZC0+c3RhdGUpOwotCQlXQVJOX09OKDEpOwotCQlyZXR2YWwgPSAtRUlOVkFMOwogCX0KIAotZG9uZToKLQlpZiAocmV0dmFsID09IDApIHsKICNpZmRlZiBDT05GSUdfUFBDX1BNQUMKKwlpZiAocmV0dmFsID09IDApIHsKIAkJLyogRGlzYWJsZSBBU0lDIGNsb2NrcyBmb3IgVVNCICovCiAJCWlmIChtYWNoaW5lX2lzKHBvd2VybWFjKSkgewogCQkJc3RydWN0IGRldmljZV9ub2RlCSpvZl9ub2RlOwpAQCAtMzExLDMwICszMDksMjQgQEAKIAkJCQlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9VU0JfRU5BQkxFLAogCQkJCQkJCW9mX25vZGUsIDAsIDApOwogCQl9Ci0jZW5kaWYKIAl9CisjZW5kaWYKIAorIGRvbmU6CiAJcmV0dXJuIHJldHZhbDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHVzYl9oY2RfcGNpX3N1c3BlbmQpOworRVhQT1JUX1NZTUJPTF9HUEwodXNiX2hjZF9wY2lfc3VzcGVuZF9sYXRlKTsKIAogLyoqCi0gKiB1c2JfaGNkX3BjaV9yZXN1bWUgLSBwb3dlciBtYW5hZ2VtZW50IHJlc3VtZSBvZiBhIFBDSS1iYXNlZCBIQ0QKKyAqIHVzYl9oY2RfcGNpX3Jlc3VtZV9lYXJseSAtIHJlc3VtZSBhIFBDSS1iYXNlZCBIQ0QgYmVmb3JlIElSUXMgYXJlIGVuYWJsZWQKICAqIEBkZXY6IFVTQiBIb3N0IENvbnRyb2xsZXIgYmVpbmcgcmVzdW1lZAogICoKLSAqIFN0b3JlIHRoaXMgZnVuY3Rpb24gaW4gdGhlIEhDRCdzIHN0cnVjdCBwY2lfZHJpdmVyIGFzIHJlc3VtZSgpLgorICogU3RvcmUgdGhpcyBmdW5jdGlvbiBpbiB0aGUgSENEJ3Mgc3RydWN0IHBjaV9kcml2ZXIgYXMgLnJlc3VtZV9lYXJseS4KICAqLwotaW50IHVzYl9oY2RfcGNpX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoraW50IHVzYl9oY2RfcGNpX3Jlc3VtZV9lYXJseShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCXN0cnVjdCB1c2JfaGNkCQkqaGNkOwotCWludAkJCXJldHZhbDsKLQotCWhjZCA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOwotCWlmIChoY2QtPnN0YXRlICE9IEhDX1NUQVRFX1NVU1BFTkRFRCkgewotCQlkZXZfZGJnKGhjZC0+c2VsZi5jb250cm9sbGVyLAotCQkJCSJjYW4ndCByZXN1bWUsIG5vdCBzdXNwZW5kZWQhXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQorCWludAkJcmV0dmFsID0gMDsKKwlwY2lfcG93ZXJfdAlzdGF0ZSA9IGRldi0+Y3VycmVudF9zdGF0ZTsKIAogI2lmZGVmIENPTkZJR19QUENfUE1BQwogCS8qIFJlZW5hYmxlIEFTSUMgY2xvY2tzIGZvciBVU0IgKi8KQEAgLTM1Miw3ICszNDQsNyBAQAogCSAqIGNhbGxzICJzdGFuZGJ5IiwgInN1c3BlbmQgdG8gUkFNIiwgYW5kIHNvIG9uKS4gIFRoZXJlIGFyZSBhbHNvCiAJICogZGlydHkgY2FzZXMgd2hlbiBzd3N1c3AgZmFrZXMgYSBzdXNwZW5kIGluICJzaHV0ZG93biIgbW9kZS4KIAkgKi8KLQlpZiAoZGV2LT5jdXJyZW50X3N0YXRlICE9IFBDSV9EMCkgeworCWlmIChzdGF0ZSAhPSBQQ0lfRDApIHsKICNpZmRlZglERUJVRwogCQlpbnQJcGNpX3BtOwogCQl1MTYJcG1jcjsKQEAgLTM2NCw4ICszNTYsNyBAQAogCQkJLyogQ2xlYW4gY2FzZTogIHBvd2VyIHRvIFVTQiBhbmQgdG8gSEMgcmVnaXN0ZXJzIHdhcwogCQkJICogbWFpbnRhaW5lZDsgcmVtb3RlIHdha2V1cCBpcyBlYXN5LgogCQkJICovCi0JCQlkZXZfZGJnKGhjZC0+c2VsZi5jb250cm9sbGVyLCAicmVzdW1lIGZyb20gUENJIEQlZFxuIiwKLQkJCQkJcG1jcik7CisJCQlkZXZfZGJnKCZkZXYtPmRldiwgInJlc3VtZSBmcm9tIFBDSSBEJWRcbiIsIHBtY3IpOwogCQl9IGVsc2UgewogCQkJLyogQ2xlYW46ICBIQyBsb3N0IFZjYyBwb3dlciwgRDAgdW5pbml0aWFsaXplZAogCQkJICogICArIFZhdXggbWF5IGhhdmUgcHJlc2VydmVkIHBvcnQgYW5kIHRyYW5zY2VpdmVyCkBAIC0zNzYsMzIgKzM2Nyw1NSBAQAogCQkJICogICArIGFmdGVyIEJJT1MgaW5pdAogCQkJICogICArIGFmdGVyIExpbnV4IGluaXQgKEhDRCBzdGF0aWNhbGx5IGxpbmtlZCkKIAkJCSAqLwotCQkJZGV2X2RiZyhoY2QtPnNlbGYuY29udHJvbGxlciwKLQkJCQkiUENJIEQwLCBmcm9tIHByZXZpb3VzIFBDSSBEJWRcbiIsCi0JCQkJZGV2LT5jdXJyZW50X3N0YXRlKTsKKwkJCWRldl9kYmcoJmRldi0+ZGV2LCAicmVzdW1lIGZyb20gcHJldmlvdXMgUENJIEQlZFxuIiwKKwkJCQkJc3RhdGUpOwogCQl9CiAjZW5kaWYKLQkJLyogeWVzLCBpZ25vcmUgdGhlc2UgcmVzdWx0cyB0b28uLi4gKi8KLQkJKHZvaWQpIHBjaV9lbmFibGVfd2FrZShkZXYsIGRldi0+Y3VycmVudF9zdGF0ZSwgMCk7Ci0JCSh2b2lkKSBwY2lfZW5hYmxlX3dha2UoZGV2LCBQQ0lfRDNjb2xkLCAwKTsKKworCQlyZXR2YWwgPSBwY2lfc2V0X3Bvd2VyX3N0YXRlKGRldiwgUENJX0QwKTsKIAl9IGVsc2UgewogCQkvKiBTYW1lIGJhc2ljIGNhc2VzOiBjbGVhbiAocG93ZXJlZC9ub3QpLCBkaXJ0eSAqLwotCQlkZXZfZGJnKGhjZC0+c2VsZi5jb250cm9sbGVyLCAiUENJIGxlZ2FjeSByZXN1bWVcbiIpOworCQlkZXZfZGJnKCZkZXYtPmRldiwgIlBDSSBsZWdhY3kgcmVzdW1lXG4iKTsKIAl9CiAKLQkvKiBOT1RFOiAgdGhlIFBDSSBBUEkgaXRzZWxmIGlzIGFzeW1tZXRyaWMgaGVyZS4gIFdlIGRvbid0IG5lZWQgdG8KLQkgKiBwY2lfc2V0X3Bvd2VyX3N0YXRlKFBDSV9EMCkgc2luY2UgdGhhdCdzIHBhcnQgb2YgcmUtZW5hYmxpbmc7Ci0JICogYnV0IHRoYXQgd29uJ3QgcmUtZW5hYmxlIGJ1cyBtYXN0ZXJpbmcuICBZZXQgcGNpX2Rpc2FibGVfZGV2aWNlKCkKLQkgKiBleHBsaWNpdGx5IGRpc2FibGVzIGJ1cyBtYXN0ZXJpbmcuLi4KLQkgKi8KKwlpZiAocmV0dmFsIDwgMCkKKwkJZGV2X2VycigmZGV2LT5kZXYsICJjYW4ndCByZXN1bWU6ICVkXG4iLCByZXR2YWwpOworCWVsc2UKKwkJcGNpX3Jlc3RvcmVfc3RhdGUoZGV2KTsKKworCXJldHVybiByZXR2YWw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1c2JfaGNkX3BjaV9yZXN1bWVfZWFybHkpOworCisvKioKKyAqIHVzYl9oY2RfcGNpX3Jlc3VtZSAtIHBvd2VyIG1hbmFnZW1lbnQgcmVzdW1lIG9mIGEgUENJLWJhc2VkIEhDRAorICogQGRldjogVVNCIEhvc3QgQ29udHJvbGxlciBiZWluZyByZXN1bWVkCisgKgorICogU3RvcmUgdGhpcyBmdW5jdGlvbiBpbiB0aGUgSENEJ3Mgc3RydWN0IHBjaV9kcml2ZXIgYXMgLnJlc3VtZS4KKyAqLworaW50IHVzYl9oY2RfcGNpX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCB1c2JfaGNkCQkqaGNkOworCWludAkJCXJldHZhbDsKKworCWhjZCA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOworCWlmIChoY2QtPnN0YXRlICE9IEhDX1NUQVRFX1NVU1BFTkRFRCkgeworCQlkZXZfZGJnKGhjZC0+c2VsZi5jb250cm9sbGVyLAorCQkJCSJjYW4ndCByZXN1bWUsIG5vdCBzdXNwZW5kZWQhXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCiAJcmV0dmFsID0gcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsKIAlpZiAocmV0dmFsIDwgMCkgewotCQlkZXZfZXJyKGhjZC0+c2VsZi5jb250cm9sbGVyLAotCQkJImNhbid0IHJlLWVuYWJsZSBhZnRlciByZXN1bWUsICVkIVxuIiwgcmV0dmFsKTsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJjYW4ndCByZS1lbmFibGUgYWZ0ZXIgcmVzdW1lLCAlZCFcbiIsCisJCQkJcmV0dmFsKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9CisKIAlwY2lfc2V0X21hc3RlcihkZXYpOwotCXBjaV9yZXN0b3JlX3N0YXRlKGRldik7CisKKwkvKiB5ZXMsIGlnbm9yZSB0aGlzIHJlc3VsdCB0b28uLi4gKi8KKwkodm9pZCkgcGNpX3dha2VfZnJvbV9kMyhkZXYsIDApOwogCiAJY2xlYXJfYml0KEhDRF9GTEFHX1NBV19JUlEsICZoY2QtPmZsYWdzKTsKIApAQCAtNDEzLDcgKzQyNyw2IEBACiAJCQl1c2JfaGNfZGllZChoY2QpOwogCQl9CiAJfQotCiAJcmV0dXJuIHJldHZhbDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVzYl9oY2RfcGNpX3Jlc3VtZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jIGIvZHJpdmVycy91c2IvY29yZS9oY2QuYwppbmRleCBlMWI0MjYyLi4zYzcxMWRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmMKQEAgLTEwMTAsNyArMTAxMCw3IEBACiAJc3Bpbl9sb2NrKCZoY2RfdXJiX2xpc3RfbG9jayk7CiAKIAkvKiBDaGVjayB0aGF0IHRoZSBVUkIgaXNuJ3QgYmVpbmcga2lsbGVkICovCi0JaWYgKHVubGlrZWx5KHVyYi0+cmVqZWN0KSkgeworCWlmICh1bmxpa2VseShhdG9taWNfcmVhZCgmdXJiLT5yZWplY3QpKSkgewogCQlyYyA9IC1FUEVSTTsKIAkJZ290byBkb25lOwogCX0KQEAgLTEzNDAsNyArMTM0MCw3IEBACiAJCUlOSVRfTElTVF9IRUFEKCZ1cmItPnVyYl9saXN0KTsKIAkJYXRvbWljX2RlYygmdXJiLT51c2VfY291bnQpOwogCQlhdG9taWNfZGVjKCZ1cmItPmRldi0+dXJibnVtKTsKLQkJaWYgKHVyYi0+cmVqZWN0KQorCQlpZiAoYXRvbWljX3JlYWQoJnVyYi0+cmVqZWN0KSkKIAkJCXdha2VfdXAoJnVzYl9raWxsX3VyYl9xdWV1ZSk7CiAJCXVzYl9wdXRfdXJiKHVyYik7CiAJfQpAQCAtMTQ0NCw3ICsxNDQ0LDcgQEAKIAl1cmItPnN0YXR1cyA9IHN0YXR1czsKIAl1cmItPmNvbXBsZXRlICh1cmIpOwogCWF0b21pY19kZWMgKCZ1cmItPnVzZV9jb3VudCk7Ci0JaWYgKHVubGlrZWx5ICh1cmItPnJlamVjdCkpCisJaWYgKHVubGlrZWx5KGF0b21pY19yZWFkKCZ1cmItPnJlamVjdCkpKQogCQl3YWtlX3VwICgmdXNiX2tpbGxfdXJiX3F1ZXVlKTsKIAl1c2JfcHV0X3VyYiAodXJiKTsKIH0KQEAgLTE1NzMsMTQgKzE1NzMsMTQgQEAKIAogI2lmZGVmCUNPTkZJR19QTQogCi1pbnQgaGNkX2J1c19zdXNwZW5kKHN0cnVjdCB1c2JfZGV2aWNlICpyaGRldikKK2ludCBoY2RfYnVzX3N1c3BlbmQoc3RydWN0IHVzYl9kZXZpY2UgKnJoZGV2LCBwbV9tZXNzYWdlX3QgbXNnKQogewogCXN0cnVjdCB1c2JfaGNkCSpoY2QgPSBjb250YWluZXJfb2YocmhkZXYtPmJ1cywgc3RydWN0IHVzYl9oY2QsIHNlbGYpOwogCWludAkJc3RhdHVzOwogCWludAkJb2xkX3N0YXRlID0gaGNkLT5zdGF0ZTsKIAogCWRldl9kYmcoJnJoZGV2LT5kZXYsICJidXMgJXMlc1xuIiwKLQkJCXJoZGV2LT5hdXRvX3BtID8gImF1dG8tIiA6ICIiLCAic3VzcGVuZCIpOworCQkJKG1zZy5ldmVudCAmIFBNX0VWRU5UX0FVVE8gPyAiYXV0by0iIDogIiIpLCAic3VzcGVuZCIpOwogCWlmICghaGNkLT5kcml2ZXItPmJ1c19zdXNwZW5kKSB7CiAJCXN0YXR1cyA9IC1FTk9FTlQ7CiAJfSBlbHNlIHsKQEAgLTE1OTgsMTQgKzE1OTgsMTQgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1pbnQgaGNkX2J1c19yZXN1bWUoc3RydWN0IHVzYl9kZXZpY2UgKnJoZGV2KQoraW50IGhjZF9idXNfcmVzdW1lKHN0cnVjdCB1c2JfZGV2aWNlICpyaGRldiwgcG1fbWVzc2FnZV90IG1zZykKIHsKIAlzdHJ1Y3QgdXNiX2hjZAkqaGNkID0gY29udGFpbmVyX29mKHJoZGV2LT5idXMsIHN0cnVjdCB1c2JfaGNkLCBzZWxmKTsKIAlpbnQJCXN0YXR1czsKIAlpbnQJCW9sZF9zdGF0ZSA9IGhjZC0+c3RhdGU7CiAKIAlkZXZfZGJnKCZyaGRldi0+ZGV2LCAidXNiICVzJXNcbiIsCi0JCQlyaGRldi0+YXV0b19wbSA/ICJhdXRvLSIgOiAiIiwgInJlc3VtZSIpOworCQkJKG1zZy5ldmVudCAmIFBNX0VWRU5UX0FVVE8gPyAiYXV0by0iIDogIiIpLCAicmVzdW1lIik7CiAJaWYgKCFoY2QtPmRyaXZlci0+YnVzX3Jlc3VtZSkKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJaWYgKGhjZC0+c3RhdGUgPT0gSENfU1RBVEVfUlVOTklORykKQEAgLTE2MzgsNyArMTYzOCw3IEBACiAKIAl1c2JfbG9ja19kZXZpY2UodWRldik7CiAJdXNiX21hcmtfbGFzdF9idXN5KHVkZXYpOwotCXVzYl9leHRlcm5hbF9yZXN1bWVfZGV2aWNlKHVkZXYpOworCXVzYl9leHRlcm5hbF9yZXN1bWVfZGV2aWNlKHVkZXYsIFBNU0dfUkVNT1RFX1JFU1VNRSk7CiAJdXNiX3VubG9ja19kZXZpY2UodWRldik7CiB9CiAKQEAgLTIwMjgsNyArMjAyOCw3IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19VU0JfTU9OKQorI2lmIGRlZmluZWQoQ09ORklHX1VTQl9NT04pIHx8IGRlZmluZWQoQ09ORklHX1VTQl9NT05fTU9EVUxFKQogCiBzdHJ1Y3QgdXNiX21vbl9vcGVyYXRpb25zICptb25fb3BzOwogCkBAIC0yMDY0LDQgKzIwNjQsNCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwgKHVzYl9tb25fZGVyZWdpc3Rlcik7CiAKLSNlbmRpZiAvKiBDT05GSUdfVVNCX01PTiAqLworI2VuZGlmIC8qIENPTkZJR19VU0JfTU9OIHx8IENPTkZJR19VU0JfTU9OX01PRFVMRSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9oY2QuaCBiL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmgKaW5kZXggOTQ2NWU3MC4uNTcyZDJjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9oY2QuaAorKysgYi9kcml2ZXJzL3VzYi9jb3JlL2hjZC5oCkBAIC0xNiw2ICsxNiw4IEBACiAgKiBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogCisjaWZuZGVmIF9fVVNCX0NPUkVfSENEX0gKKyNkZWZpbmUgX19VU0JfQ09SRV9IQ0RfSAogCiAjaWZkZWYgX19LRVJORUxfXwogCkBAIC0yNTQsNyArMjU2LDkgQEAKIGV4dGVybiB2b2lkIHVzYl9oY2RfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIAogI2lmZGVmIENPTkZJR19QTQotZXh0ZXJuIGludCB1c2JfaGNkX3BjaV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CitleHRlcm4gaW50IHVzYl9oY2RfcGNpX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKmRldiwgcG1fbWVzc2FnZV90IG1zZyk7CitleHRlcm4gaW50IHVzYl9oY2RfcGNpX3N1c3BlbmRfbGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwbV9tZXNzYWdlX3QgbXNnKTsKK2V4dGVybiBpbnQgdXNiX2hjZF9wY2lfcmVzdW1lX2Vhcmx5KHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogZXh0ZXJuIGludCB1c2JfaGNkX3BjaV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKmRldik7CiAjZW5kaWYgLyogQ09ORklHX1BNICovCiAKQEAgLTM4Niw4ICszOTAsOCBAQAogI2lmZGVmIENPTkZJR19QTQogZXh0ZXJuIHZvaWQgdXNiX2hjZF9yZXN1bWVfcm9vdF9odWIoc3RydWN0IHVzYl9oY2QgKmhjZCk7CiBleHRlcm4gdm9pZCB1c2Jfcm9vdF9odWJfbG9zdF9wb3dlcihzdHJ1Y3QgdXNiX2RldmljZSAqcmhkZXYpOwotZXh0ZXJuIGludCBoY2RfYnVzX3N1c3BlbmQoc3RydWN0IHVzYl9kZXZpY2UgKnJoZGV2KTsKLWV4dGVybiBpbnQgaGNkX2J1c19yZXN1bWUoc3RydWN0IHVzYl9kZXZpY2UgKnJoZGV2KTsKK2V4dGVybiBpbnQgaGNkX2J1c19zdXNwZW5kKHN0cnVjdCB1c2JfZGV2aWNlICpyaGRldiwgcG1fbWVzc2FnZV90IG1zZyk7CitleHRlcm4gaW50IGhjZF9idXNfcmVzdW1lKHN0cnVjdCB1c2JfZGV2aWNlICpyaGRldiwgcG1fbWVzc2FnZV90IG1zZyk7CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIHVzYl9oY2RfcmVzdW1lX3Jvb3RfaHViKHN0cnVjdCB1c2JfaGNkICpoY2QpCiB7CkBAIC00MTksNyArNDIzLDcgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotI2lmIGRlZmluZWQoQ09ORklHX1VTQl9NT04pCisjaWYgZGVmaW5lZChDT05GSUdfVVNCX01PTikgfHwgZGVmaW5lZChDT05GSUdfVVNCX01PTl9NT0RVTEUpCiAKIHN0cnVjdCB1c2JfbW9uX29wZXJhdGlvbnMgewogCXZvaWQgKCp1cmJfc3VibWl0KShzdHJ1Y3QgdXNiX2J1cyAqYnVzLCBzdHJ1Y3QgdXJiICp1cmIpOwpAQCAtNDYxLDcgKzQ2NSw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgdXNibW9uX3VyYl9jb21wbGV0ZShzdHJ1Y3QgdXNiX2J1cyAqYnVzLCBzdHJ1Y3QgdXJiICp1cmIsCiAJCWludCBzdGF0dXMpIHt9CiAKLSNlbmRpZiAvKiBDT05GSUdfVVNCX01PTiAqLworI2VuZGlmIC8qIENPTkZJR19VU0JfTU9OIHx8IENPTkZJR19VU0JfTU9OX01PRFVMRSAqLwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC00OTAsMyArNDk0LDUgQEAKIGV4dGVybiB1bnNpZ25lZCBsb25nIHVzYl9oY2RzX2xvYWRlZDsKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmIC8qIF9fVVNCX0NPUkVfSENEX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jCmluZGV4IGIxOWNiZmMuLmQ1ZDBlNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9odWIuYwpAQCAtMTA3LDcgKzEwNyw5IEBACiAvKiBkZWZpbmUgaW5pdGlhbCA2NC1ieXRlIGRlc2NyaXB0b3IgcmVxdWVzdCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAqLwogc3RhdGljIGludCBpbml0aWFsX2Rlc2NyaXB0b3JfdGltZW91dCA9IFVTQl9DVFJMX0dFVF9USU1FT1VUOwogbW9kdWxlX3BhcmFtKGluaXRpYWxfZGVzY3JpcHRvcl90aW1lb3V0LCBpbnQsIFNfSVJVR098U19JV1VTUik7Ci1NT0RVTEVfUEFSTV9ERVNDKGluaXRpYWxfZGVzY3JpcHRvcl90aW1lb3V0LCAiaW5pdGlhbCA2NC1ieXRlIGRlc2NyaXB0b3IgcmVxdWVzdCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAoZGVmYXVsdCA1MDAwIC0gNS4wIHNlY29uZHMpIik7CitNT0RVTEVfUEFSTV9ERVNDKGluaXRpYWxfZGVzY3JpcHRvcl90aW1lb3V0LAorCQkiaW5pdGlhbCA2NC1ieXRlIGRlc2NyaXB0b3IgcmVxdWVzdCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAiCisJCSIoZGVmYXVsdCA1MDAwIC0gNS4wIHNlY29uZHMpIik7CiAKIC8qCiAgKiBBcyBvZiAyLjYuMTAgd2UgaW50cm9kdWNlIGEgbmV3IFVTQiBkZXZpY2UgaW5pdGlhbGl6YXRpb24gc2NoZW1lIHdoaWNoCkBAIC0xMTM2LDggKzExMzgsOCBAQAogCWhkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOwogCiAJaWYgKGhkZXYtPmxldmVsID09IE1BWF9UT1BPX0xFVkVMKSB7Ci0JCWRldl9lcnIoJmludGYtPmRldiwgIlVuc3VwcG9ydGVkIGJ1cyB0b3BvbG9neTogIgotCQkJCSJodWIgbmVzdGVkIHRvbyBkZWVwXG4iKTsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LAorCQkJIlVuc3VwcG9ydGVkIGJ1cyB0b3BvbG9neTogaHViIG5lc3RlZCB0b28gZGVlcFxuIik7CiAJCXJldHVybiAtRTJCSUc7CiAJfQogCkBAIC0xMzc0LDggKzEzNzYsOSBAQAogCQl1c2JfYXV0b3N1c3BlbmRfZGV2aWNlKHVkZXYtPnBhcmVudCk7CiAJdXNiX3BtX3VubG9jayh1ZGV2KTsKIAotCS8qIFN0b3AgYW55IGF1dG9zdXNwZW5kIHJlcXVlc3RzIGFscmVhZHkgc3VibWl0dGVkICovCi0JY2FuY2VsX3JlYXJtaW5nX2RlbGF5ZWRfd29yaygmdWRldi0+YXV0b3N1c3BlbmQpOworCS8qIFN0b3AgYW55IGF1dG9zdXNwZW5kIG9yIGF1dG9yZXN1bWUgcmVxdWVzdHMgYWxyZWFkeSBzdWJtaXR0ZWQgKi8KKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnVkZXYtPmF1dG9zdXNwZW5kKTsKKwljYW5jZWxfd29ya19zeW5jKCZ1ZGV2LT5hdXRvcmVzdW1lKTsKIH0KIAogI2Vsc2UKQEAgLTE0MzQsMTcgKzE0MzcsMTIgQEAKIAl1c2JfZGlzYWJsZV9kZXZpY2UodWRldiwgMCk7CiAJdXNiX2hjZF9zeW5jaHJvbml6ZV91bmxpbmtzKHVkZXYpOwogCisJdXNiX3JlbW92ZV9lcF9kZXZzKCZ1ZGV2LT5lcDApOwogCXVzYl91bmxvY2tfZGV2aWNlKHVkZXYpOwogCi0JLyogUmVtb3ZlIHRoZSBkZXZpY2Utc3BlY2lmaWMgZmlsZXMgZnJvbSBzeXNmcy4gIFRoaXMgbXVzdCBiZQotCSAqIGRvbmUgd2l0aCB1ZGV2IHVubG9ja2VkLCBiZWNhdXNlIHNvbWUgb2YgdGhlIGF0dHJpYnV0ZQotCSAqIHJvdXRpbmVzIHRyeSB0byBhY3F1aXJlIHRoZSBkZXZpY2UgbG9jay4KLQkgKi8KLQl1c2JfcmVtb3ZlX3N5c2ZzX2Rldl9maWxlcyh1ZGV2KTsKLQogCS8qIFVucmVnaXN0ZXIgdGhlIGRldmljZS4gIFRoZSBkZXZpY2UgZHJpdmVyIGlzIHJlc3BvbnNpYmxlCi0JICogZm9yIHJlbW92aW5nIHRoZSBkZXZpY2UgZmlsZXMgZnJvbSB1c2JmcyBhbmQgc3lzZnMgYW5kIGZvcgotCSAqIGRlLWNvbmZpZ3VyaW5nIHRoZSBkZXZpY2UuCisJICogZm9yIGRlLWNvbmZpZ3VyaW5nIHRoZSBkZXZpY2UgYW5kIGludm9raW5nIHRoZSByZW1vdmUtZGV2aWNlCisJICogbm90aWZpZXIgY2hhaW4gKHVzZWQgYnkgdXNiZnMgYW5kIHBvc3NpYmx5IG90aGVycykuCiAJICovCiAJZGV2aWNlX2RlbCgmdWRldi0+ZGV2KTsKIApAQCAtMTQ3Niw4ICsxNDc0LDggQEAKIAlkZXZfaW5mbygmdWRldi0+ZGV2LCAiTmV3IFVTQiBkZXZpY2UgZm91bmQsIGlkVmVuZG9yPSUwNHgsIGlkUHJvZHVjdD0lMDR4XG4iLAogCQlsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSwKIAkJbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpKTsKLQlkZXZfaW5mbygmdWRldi0+ZGV2LCAiTmV3IFVTQiBkZXZpY2Ugc3RyaW5nczogTWZyPSVkLCBQcm9kdWN0PSVkLCAiCi0JCSJTZXJpYWxOdW1iZXI9JWRcbiIsCisJZGV2X2luZm8oJnVkZXYtPmRldiwKKwkJIk5ldyBVU0IgZGV2aWNlIHN0cmluZ3M6IE1mcj0lZCwgUHJvZHVjdD0lZCwgU2VyaWFsTnVtYmVyPSVkXG4iLAogCQl1ZGV2LT5kZXNjcmlwdG9yLmlNYW51ZmFjdHVyZXIsCiAJCXVkZXYtPmRlc2NyaXB0b3IuaVByb2R1Y3QsCiAJCXVkZXYtPmRlc2NyaXB0b3IuaVNlcmlhbE51bWJlcik7CkBAIC0xNTQyLDcgKzE1NDAsNyBAQAogCQkJCQkgKiBjdXN0b21pemUgdG8gbWF0Y2ggeW91ciBwcm9kdWN0LgogCQkJCQkgKi8KIAkJCQkJZGV2X2luZm8oJnVkZXYtPmRldiwKLQkJCQkJCSJjYW4ndCBzZXQgSE5QIG1vZGU7ICVkXG4iLAorCQkJCQkJImNhbid0IHNldCBITlAgbW9kZTogJWRcbiIsCiAJCQkJCQllcnIpOwogCQkJCQlidXMtPmJfaG5wX2VuYWJsZSA9IDA7CiAJCQkJfQpAQCAtMTYzNSw2ICsxNjMzLDEwIEBACiB7CiAJaW50IGVycjsKIAorCS8qIEluY3JlbWVudCB0aGUgcGFyZW50J3MgY291bnQgb2YgdW5zdXNwZW5kZWQgY2hpbGRyZW4gKi8KKwlpZiAodWRldi0+cGFyZW50KQorCQl1c2JfYXV0b3Jlc3VtZV9kZXZpY2UodWRldi0+cGFyZW50KTsKKwogCXVzYl9kZXRlY3RfcXVpcmtzKHVkZXYpOwkJLyogRGV0ZXJtaW5lIHF1aXJrcyAqLwogCWVyciA9IHVzYl9jb25maWd1cmVfZGV2aWNlKHVkZXYpOwkvKiBkZXRlY3QgJiBwcm9iZSBkZXYvaW50ZnMgKi8KIAlpZiAoZXJyIDwgMCkKQEAgLTE2NDMsMTMgKzE2NDUsMTIgQEAKIAl1ZGV2LT5kZXYuZGV2dCA9IE1LREVWKFVTQl9ERVZJQ0VfTUFKT1IsCiAJCQkoKCh1ZGV2LT5idXMtPmJ1c251bS0xKSAqIDEyOCkgKyAodWRldi0+ZGV2bnVtLTEpKSk7CiAKLQkvKiBJbmNyZW1lbnQgdGhlIHBhcmVudCdzIGNvdW50IG9mIHVuc3VzcGVuZGVkIGNoaWxkcmVuICovCi0JaWYgKHVkZXYtPnBhcmVudCkKLQkJdXNiX2F1dG9yZXN1bWVfZGV2aWNlKHVkZXYtPnBhcmVudCk7CisJLyogVGVsbCB0aGUgd29ybGQhICovCisJYW5ub3VuY2VfZGV2aWNlKHVkZXYpOwogCiAJLyogUmVnaXN0ZXIgdGhlIGRldmljZS4gIFRoZSBkZXZpY2UgZHJpdmVyIGlzIHJlc3BvbnNpYmxlCi0JICogZm9yIGFkZGluZyB0aGUgZGV2aWNlIGZpbGVzIHRvIHN5c2ZzIGFuZCBmb3IgY29uZmlndXJpbmcKLQkgKiB0aGUgZGV2aWNlLgorCSAqIGZvciBjb25maWd1cmluZyB0aGUgZGV2aWNlIGFuZCBpbnZva2luZyB0aGUgYWRkLWRldmljZQorCSAqIG5vdGlmaWVyIGNoYWluICh1c2VkIGJ5IHVzYmZzIGFuZCBwb3NzaWJseSBvdGhlcnMpLgogCSAqLwogCWVyciA9IGRldmljZV9hZGQoJnVkZXYtPmRldik7CiAJaWYgKGVycikgewpAQCAtMTY1NywxNSArMTY1OCwxMiBAQAogCQlnb3RvIGZhaWw7CiAJfQogCi0JLyogcHV0IGRldmljZS1zcGVjaWZpYyBmaWxlcyBpbnRvIHN5c2ZzICovCi0JdXNiX2NyZWF0ZV9zeXNmc19kZXZfZmlsZXModWRldik7Ci0KLQkvKiBUZWxsIHRoZSB3b3JsZCEgKi8KLQlhbm5vdW5jZV9kZXZpY2UodWRldik7CisJKHZvaWQpIHVzYl9jcmVhdGVfZXBfZGV2cygmdWRldi0+ZGV2LCAmdWRldi0+ZXAwLCB1ZGV2KTsKIAlyZXR1cm4gZXJyOwogCiBmYWlsOgogCXVzYl9zZXRfZGV2aWNlX3N0YXRlKHVkZXYsIFVTQl9TVEFURV9OT1RBVFRBQ0hFRCk7CisJdXNiX3N0b3BfcG0odWRldik7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTk4Miw3ICsxOTgwLDcgQEAKICAqCiAgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZWxzZSBuZWdhdGl2ZSBlcnJuby4KICAqLwotaW50IHVzYl9wb3J0X3N1c3BlbmQoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCitpbnQgdXNiX3BvcnRfc3VzcGVuZChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgcG1fbWVzc2FnZV90IG1zZykKIHsKIAlzdHJ1Y3QgdXNiX2h1YgkqaHViID0gaGRldl90b19odWIodWRldi0+cGFyZW50KTsKIAlpbnQJCXBvcnQxID0gdWRldi0+cG9ydG51bTsKQEAgLTIwMjEsNyArMjAxOSw3IEBACiAJfSBlbHNlIHsKIAkJLyogZGV2aWNlIGhhcyB1cCB0byAxMCBtc2VjIHRvIGZ1bGx5IHN1c3BlbmQgKi8KIAkJZGV2X2RiZygmdWRldi0+ZGV2LCAidXNiICVzc3VzcGVuZFxuIiwKLQkJCQl1ZGV2LT5hdXRvX3BtID8gImF1dG8tIiA6ICIiKTsKKwkJCQkobXNnLmV2ZW50ICYgUE1fRVZFTlRfQVVUTyA/ICJhdXRvLSIgOiAiIikpOwogCQl1c2Jfc2V0X2RldmljZV9zdGF0ZSh1ZGV2LCBVU0JfU1RBVEVfU1VTUEVOREVEKTsKIAkJbXNsZWVwKDEwKTsKIAl9CkBAIC0yMDQ1LDggKzIwNDMsOCBAQAogCXUxNglkZXZzdGF0dXM7CiAKIAkvKiBjYWxsZXIgb3ducyB0aGUgdWRldiBkZXZpY2UgbG9jayAqLwotCWRldl9kYmcoJnVkZXYtPmRldiwgImZpbmlzaCAlc3Jlc3VtZVxuIiwKLQkJCXVkZXYtPnJlc2V0X3Jlc3VtZSA/ICJyZXNldC0iIDogIiIpOworCWRldl9kYmcoJnVkZXYtPmRldiwgIiVzXG4iLAorCQl1ZGV2LT5yZXNldF9yZXN1bWUgPyAiZmluaXNoIHJlc2V0LXJlc3VtZSIgOiAiZmluaXNoIHJlc3VtZSIpOwogCiAJLyogdXNiIGNoOSBpZGVudGlmaWVzIGZvdXIgdmFyaWFudHMgb2YgU1VTUEVOREVELCBiYXNlZCBvbiB3aGF0CiAJICogc3RhdGUgdGhlIGRldmljZSByZXN1bWVzIHRvLiAgTGludXggY3VycmVudGx5IHdvbid0IHNlZSB0aGUKQEAgLTIwOTgsOCArMjA5Niw5IEBACiAJCQkJCU5VTEwsIDAsCiAJCQkJCVVTQl9DVFJMX1NFVF9USU1FT1VUKTsKIAkJCWlmIChzdGF0dXMpCi0JCQkJZGV2X2RiZygmdWRldi0+ZGV2LCAiZGlzYWJsZSByZW1vdGUgIgotCQkJCQkid2FrZXVwLCBzdGF0dXMgJWRcbiIsIHN0YXR1cyk7CisJCQkJZGV2X2RiZygmdWRldi0+ZGV2LAorCQkJCQkiZGlzYWJsZSByZW1vdGUgd2FrZXVwLCBzdGF0dXMgJWRcbiIsCisJCQkJCXN0YXR1cyk7CiAJCX0KIAkJc3RhdHVzID0gMDsKIAl9CkBAIC0yMTQwLDcgKzIxMzksNyBAQAogICoKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBlbHNlIG5lZ2F0aXZlIGVycm5vLgogICovCi1pbnQgdXNiX3BvcnRfcmVzdW1lKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQoraW50IHVzYl9wb3J0X3Jlc3VtZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgcG1fbWVzc2FnZV90IG1zZykKIHsKIAlzdHJ1Y3QgdXNiX2h1YgkqaHViID0gaGRldl90b19odWIodWRldi0+cGFyZW50KTsKIAlpbnQJCXBvcnQxID0gdWRldi0+cG9ydG51bTsKQEAgLTIxNjUsNyArMjE2NCw3IEBACiAJfSBlbHNlIHsKIAkJLyogZHJpdmUgcmVzdW1lIGZvciBhdCBsZWFzdCAyMCBtc2VjICovCiAJCWRldl9kYmcoJnVkZXYtPmRldiwgInVzYiAlc3Jlc3VtZVxuIiwKLQkJCQl1ZGV2LT5hdXRvX3BtID8gImF1dG8tIiA6ICIiKTsKKwkJCQkobXNnLmV2ZW50ICYgUE1fRVZFTlRfQVVUTyA/ICJhdXRvLSIgOiAiIikpOwogCQltc2xlZXAoMjUpOwogCiAJCS8qIFZpcnR1YWwgcm9vdCBodWJzIGNhbiB0cmlnZ2VyIG9uIEdFVF9QT1JUX1NUQVRVUyB0bwpAQCAtMjIwNiw3ICsyMjA1LDcgQEAKIAlpZiAodWRldi0+c3RhdGUgPT0gVVNCX1NUQVRFX1NVU1BFTkRFRCkgewogCQlkZXZfZGJnKCZ1ZGV2LT5kZXYsICJ1c2IgJXNyZXN1bWVcbiIsICJ3YWtldXAtIik7CiAJCXVzYl9tYXJrX2xhc3RfYnVzeSh1ZGV2KTsKLQkJc3RhdHVzID0gdXNiX2V4dGVybmFsX3Jlc3VtZV9kZXZpY2UodWRldik7CisJCXN0YXR1cyA9IHVzYl9leHRlcm5hbF9yZXN1bWVfZGV2aWNlKHVkZXYsIFBNU0dfUkVNT1RFX1JFU1VNRSk7CiAJfQogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0yMjE1LDE0ICsyMjE0LDE0IEBACiAKIC8qIFdoZW4gQ09ORklHX1VTQl9TVVNQRU5EIGlzbid0IHNldCwgd2UgbmV2ZXIgc3VzcGVuZCBvciByZXN1bWUgYW55IHBvcnRzLiAqLwogCi1pbnQgdXNiX3BvcnRfc3VzcGVuZChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKK2ludCB1c2JfcG9ydF9zdXNwZW5kKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBwbV9tZXNzYWdlX3QgbXNnKQogewogCXJldHVybiAwOwogfQogCiAvKiBIb3dldmVyIHdlIG1heSBuZWVkIHRvIGRvIGEgcmVzZXQtcmVzdW1lICovCiAKLWludCB1c2JfcG9ydF9yZXN1bWUoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCitpbnQgdXNiX3BvcnRfcmVzdW1lKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBwbV9tZXNzYWdlX3QgbXNnKQogewogCXN0cnVjdCB1c2JfaHViCSpodWIgPSBoZGV2X3RvX2h1Yih1ZGV2LT5wYXJlbnQpOwogCWludAkJcG9ydDEgPSB1ZGV2LT5wb3J0bnVtOwpAQCAtMjI2Miw3ICsyMjYxLDcgQEAKIAogCQl1ZGV2ID0gaGRldi0+Y2hpbGRyZW4gW3BvcnQxLTFdOwogCQlpZiAodWRldiAmJiB1ZGV2LT5jYW5fc3VibWl0KSB7Ci0JCQlpZiAoIWhkZXYtPmF1dG9fcG0pCisJCQlpZiAoIShtc2cuZXZlbnQgJiBQTV9FVkVOVF9BVVRPKSkKIAkJCQlkZXZfZGJnKCZpbnRmLT5kZXYsICJwb3J0ICVkIG55ZXQgc3VzcGVuZGVkXG4iLAogCQkJCQkJcG9ydDEpOwogCQkJcmV0dXJuIC1FQlVTWTsKQEAgLTIzODUsNyArMjM4NCw3IEBACiB7CiAJdXNiX2Rpc2FibGVfZW5kcG9pbnQodWRldiwgMCArIFVTQl9ESVJfSU4pOwogCXVzYl9kaXNhYmxlX2VuZHBvaW50KHVkZXYsIDAgKyBVU0JfRElSX09VVCk7Ci0JdXNiX2VuYWJsZV9lbmRwb2ludCh1ZGV2LCAmdWRldi0+ZXAwKTsKKwl1c2JfZW5hYmxlX2VuZHBvaW50KHVkZXYsICZ1ZGV2LT5lcDAsIHRydWUpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodXNiX2VwMF9yZWluaXQpOwogCkBAIC0yNTgyLDkgKzI1ODEsOSBAQAogCQkJCWdvdG8gZmFpbDsKIAkJCX0KIAkJCWlmIChyKSB7Ci0JCQkJZGV2X2VycigmdWRldi0+ZGV2LCAiZGV2aWNlIGRlc2NyaXB0b3IgIgotCQkJCQkJInJlYWQvJXMsIGVycm9yICVkXG4iLAotCQkJCQkJIjY0Iiwgcik7CisJCQkJZGV2X2VycigmdWRldi0+ZGV2LAorCQkJCQkiZGV2aWNlIGRlc2NyaXB0b3IgcmVhZC82NCwgZXJyb3IgJWRcbiIsCisJCQkJCXIpOwogCQkJCXJldHZhbCA9IC1FTVNHU0laRTsKIAkJCQljb250aW51ZTsKIAkJCX0KQEAgLTI2MjEsOSArMjYyMCw5IEBACiAKIAkJcmV0dmFsID0gdXNiX2dldF9kZXZpY2VfZGVzY3JpcHRvcih1ZGV2LCA4KTsKIAkJaWYgKHJldHZhbCA8IDgpIHsKLQkJCWRldl9lcnIoJnVkZXYtPmRldiwgImRldmljZSBkZXNjcmlwdG9yICIKLQkJCQkJInJlYWQvJXMsIGVycm9yICVkXG4iLAotCQkJCQkiOCIsIHJldHZhbCk7CisJCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsCisJCQkJCSJkZXZpY2UgZGVzY3JpcHRvciByZWFkLzgsIGVycm9yICVkXG4iLAorCQkJCQlyZXR2YWwpOwogCQkJaWYgKHJldHZhbCA+PSAwKQogCQkJCXJldHZhbCA9IC1FTVNHU0laRTsKIAkJfSBlbHNlIHsKQEAgLTI2NTAsOCArMjY0OSw4IEBACiAgIAogCXJldHZhbCA9IHVzYl9nZXRfZGV2aWNlX2Rlc2NyaXB0b3IodWRldiwgVVNCX0RUX0RFVklDRV9TSVpFKTsKIAlpZiAocmV0dmFsIDwgKHNpZ25lZClzaXplb2YodWRldi0+ZGVzY3JpcHRvcikpIHsKLQkJZGV2X2VycigmdWRldi0+ZGV2LCAiZGV2aWNlIGRlc2NyaXB0b3IgcmVhZC8lcywgZXJyb3IgJWRcbiIsCi0JCQkiYWxsIiwgcmV0dmFsKTsKKwkJZGV2X2VycigmdWRldi0+ZGV2LCAiZGV2aWNlIGRlc2NyaXB0b3IgcmVhZC9hbGwsIGVycm9yICVkXG4iLAorCQkJcmV0dmFsKTsKIAkJaWYgKHJldHZhbCA+PSAwKQogCQkJcmV0dmFsID0gLUVOT01TRzsKIAkJZ290byBmYWlsOwpAQCAtMjcxOSw5ICsyNzE4LDkgQEAKIAkJZWxzZQogCQkJZGVsdGEgPSA4OwogCQlpZiAoZGVsdGEgPiBodWItPm1BX3Blcl9wb3J0KQotCQkJZGV2X3dhcm4oJnVkZXYtPmRldiwgIiVkbUEgaXMgb3ZlciAldW1BIGJ1ZGdldCAiCi0JCQkJCSJmb3IgcG9ydCAlZCFcbiIsCi0JCQkJCWRlbHRhLCBodWItPm1BX3Blcl9wb3J0LCBwb3J0MSk7CisJCQlkZXZfd2FybigmdWRldi0+ZGV2LAorCQkJCSAiJWRtQSBpcyBvdmVyICV1bUEgYnVkZ2V0IGZvciBwb3J0ICVkIVxuIiwKKwkJCQkgZGVsdGEsIGh1Yi0+bUFfcGVyX3BvcnQsIHBvcnQxKTsKIAkJcmVtYWluaW5nIC09IGRlbHRhOwogCX0KIAlpZiAocmVtYWluaW5nIDwgMCkgewpAQCAtMzUxNywzICszNTE2LDQ2IEBACiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVzYl9yZXNldF9kZXZpY2UpOworCisKKy8qKgorICogdXNiX3F1ZXVlX3Jlc2V0X2RldmljZSAtIFJlc2V0IGEgVVNCIGRldmljZSBmcm9tIGFuIGF0b21pYyBjb250ZXh0CisgKiBAaWZhY2U6IFVTQiBpbnRlcmZhY2UgYmVsb25naW5nIHRvIHRoZSBkZXZpY2UgdG8gcmVzZXQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHJlc2V0IGEgVVNCIGRldmljZSBmcm9tIGFuIGF0b21pYworICogY29udGV4dCwgd2hlcmUgdXNiX3Jlc2V0X2RldmljZSgpIHdvbid0IHdvcmsgKGFzIGl0IGJsb2NrcykuCisgKgorICogRG9pbmcgYSByZXNldCB2aWEgdGhpcyBtZXRob2QgaXMgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gY2FsbGluZworICogdXNiX3Jlc2V0X2RldmljZSgpLCBleGNlcHQgZm9yIHRoZSBmYWN0IHRoYXQgaXQgaXMgZGVsYXllZCB0byBhCisgKiB3b3JrcXVldWUuIFRoaXMgbWVhbnMgdGhhdCBhbnkgZHJpdmVycyBib3VuZCB0byBvdGhlciBpbnRlcmZhY2VzCisgKiBtaWdodCBiZSB1bmJvdW5kLCBhcyB3ZWxsIGFzIHVzZXJzIGZyb20gdXNiZnMgaW4gdXNlciBzcGFjZS4KKyAqCisgKiBDb3JuZXIgY2FzZXM6CisgKgorICogLSBTY2hlZHVsaW5nIHR3byByZXNldHMgYXQgdGhlIHNhbWUgdGltZSBmcm9tIHR3byBkaWZmZXJlbnQgZHJpdmVycworICogICBhdHRhY2hlZCB0byB0d28gZGlmZmVyZW50IGludGVyZmFjZXMgb2YgdGhlIHNhbWUgZGV2aWNlIGlzCisgKiAgIHBvc3NpYmxlOyBkZXBlbmRpbmcgb24gaG93IHRoZSBkcml2ZXIgYXR0YWNoZWQgdG8gZWFjaCBpbnRlcmZhY2UKKyAqICAgaGFuZGxlcyAtPnByZV9yZXNldCgpLCB0aGUgc2Vjb25kIHJlc2V0IG1pZ2h0IGhhcHBlbiBvciBub3QuCisgKgorICogLSBJZiBhIGRyaXZlciBpcyB1bmJvdW5kIGFuZCBpdCBoYWQgYSBwZW5kaW5nIHJlc2V0LCB0aGUgcmVzZXQgd2lsbAorICogICBiZSBjYW5jZWxsZWQuCisgKgorICogLSBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgZHVyaW5nIC5wcm9iZSgpIG9yIC5kaXNjb25uZWN0KCkKKyAqICAgdGltZXMuIE9uIHJldHVybiBmcm9tIC5kaXNjb25uZWN0KCksIGFueSBwZW5kaW5nIHJlc2V0cyB3aWxsIGJlCisgKiAgIGNhbmNlbGxlZC4KKyAqCisgKiBUaGVyZSBpcyBubyBubyBuZWVkIHRvIGxvY2svdW5sb2NrIHRoZSBAcmVzZXRfd3MgYXMgc2NoZWR1bGVfd29yaygpCisgKiBkb2VzIGl0cyBvd24uCisgKgorICogTk9URTogV2UgZG9uJ3QgZG8gYW55IHJlZmVyZW5jZSBjb3VudCB0cmFja2luZyBiZWNhdXNlIGl0IGlzIG5vdAorICogICAgIG5lZWRlZC4gVGhlIGxpZmVjeWNsZSBvZiB0aGUgd29ya19zdHJ1Y3QgaXMgdGllZCB0byB0aGUKKyAqICAgICB1c2JfaW50ZXJmYWNlLiBCZWZvcmUgZGVzdHJveWluZyB0aGUgaW50ZXJmYWNlIHdlIGNhbmNlbCB0aGUKKyAqICAgICB3b3JrX3N0cnVjdCwgc28gdGhlIGZhY3QgdGhhdCB3b3JrX3N0cnVjdCBpcyBxdWV1ZWQgYW5kIG9yCisgKiAgICAgcnVubmluZyBtZWFucyB0aGUgaW50ZXJmYWNlIChhbmQgdGh1cywgdGhlIGRldmljZSkgZXhpc3QgYW5kCisgKiAgICAgYXJlIHJlZmVyZW5jZWQuCisgKi8KK3ZvaWQgdXNiX3F1ZXVlX3Jlc2V0X2RldmljZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2UpCit7CisJc2NoZWR1bGVfd29yaygmaWZhY2UtPnJlc2V0X3dzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVzYl9xdWV1ZV9yZXNldF9kZXZpY2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9pbm9kZS5jIGIvZHJpdmVycy91c2IvY29yZS9pbm9kZS5jCmluZGV4IDE4NWJlNzYuLjJhMTI5Y2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvaW5vZGUuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2lub2RlLmMKQEAgLTI3OSw3ICsyNzksNiBAQAogCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKIAkJaW5vZGUtPmlfdWlkID0gY3VycmVudF9mc3VpZCgpOwogCQlpbm9kZS0+aV9naWQgPSBjdXJyZW50X2ZzZ2lkKCk7Ci0JCWlub2RlLT5pX2Jsb2NrcyA9IDA7CiAJCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKIAkJc3dpdGNoIChtb2RlICYgU19JRk1UKSB7CiAJCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL21lc3NhZ2UuYyBiL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jCmluZGV4IDZkMTA0OGYuLmRlNTE2NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jCkBAIC0xOCw2ICsxOCw4IEBACiAjaW5jbHVkZSAiaGNkLmgiCS8qIGZvciB1c2Jjb3JlIGludGVybmFscyAqLwogI2luY2x1ZGUgInVzYi5oIgogCitzdGF0aWMgdm9pZCBjYW5jZWxfYXN5bmNfc2V0X2NvbmZpZyhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldik7CisKIHN0cnVjdCBhcGlfY29udGV4dCB7CiAJc3RydWN0IGNvbXBsZXRpb24JZG9uZTsKIAlpbnQJCQlzdGF0dXM7CkBAIC0xMzksOSArMTQxLDkgQEAKIAogCWRyLT5iUmVxdWVzdFR5cGUgPSByZXF1ZXN0dHlwZTsKIAlkci0+YlJlcXVlc3QgPSByZXF1ZXN0OwotCWRyLT53VmFsdWUgPSBjcHVfdG9fbGUxNnAoJnZhbHVlKTsKLQlkci0+d0luZGV4ID0gY3B1X3RvX2xlMTZwKCZpbmRleCk7Ci0JZHItPndMZW5ndGggPSBjcHVfdG9fbGUxNnAoJnNpemUpOworCWRyLT53VmFsdWUgPSBjcHVfdG9fbGUxNih2YWx1ZSk7CisJZHItPndJbmRleCA9IGNwdV90b19sZTE2KGluZGV4KTsKKwlkci0+d0xlbmd0aCA9IGNwdV90b19sZTE2KHNpemUpOwogCiAJLyogZGJnKCJ1c2JfY29udHJvbF9tc2ciKTsgKi8KIApAQCAtMTAwNCw2ICsxMDA2LDM0IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1c2JfY2xlYXJfaGFsdCk7CiAKK3N0YXRpYyBpbnQgY3JlYXRlX2ludGZfZXBfZGV2cyhzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqYWx0ID0gaW50Zi0+Y3VyX2FsdHNldHRpbmc7CisJaW50IGk7CisKKwlpZiAoaW50Zi0+ZXBfZGV2c19jcmVhdGVkIHx8IGludGYtPnVucmVnaXN0ZXJpbmcpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IGFsdC0+ZGVzYy5iTnVtRW5kcG9pbnRzOyArK2kpCisJCSh2b2lkKSB1c2JfY3JlYXRlX2VwX2RldnMoJmludGYtPmRldiwgJmFsdC0+ZW5kcG9pbnRbaV0sIHVkZXYpOworCWludGYtPmVwX2RldnNfY3JlYXRlZCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZV9pbnRmX2VwX2RldnMoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqYWx0ID0gaW50Zi0+Y3VyX2FsdHNldHRpbmc7CisJaW50IGk7CisKKwlpZiAoIWludGYtPmVwX2RldnNfY3JlYXRlZCkKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IGFsdC0+ZGVzYy5iTnVtRW5kcG9pbnRzOyArK2kpCisJCXVzYl9yZW1vdmVfZXBfZGV2cygmYWx0LT5lbmRwb2ludFtpXSk7CisJaW50Zi0+ZXBfZGV2c19jcmVhdGVkID0gMDsKK30KKwogLyoqCiAgKiB1c2JfZGlzYWJsZV9lbmRwb2ludCAtLSBEaXNhYmxlIGFuIGVuZHBvaW50IGJ5IGFkZHJlc3MKICAqIEBkZXY6IHRoZSBkZXZpY2Ugd2hvc2UgZW5kcG9pbnQgaXMgYmVpbmcgZGlzYWJsZWQKQEAgLTEwOTIsNyArMTEyMiw3IEBACiAJCQlkZXZfZGJnKCZkZXYtPmRldiwgInVucmVnaXN0ZXJpbmcgaW50ZXJmYWNlICVzXG4iLAogCQkJCWRldl9uYW1lKCZpbnRlcmZhY2UtPmRldikpOwogCQkJaW50ZXJmYWNlLT51bnJlZ2lzdGVyaW5nID0gMTsKLQkJCXVzYl9yZW1vdmVfc3lzZnNfaW50Zl9maWxlcyhpbnRlcmZhY2UpOworCQkJcmVtb3ZlX2ludGZfZXBfZGV2cyhpbnRlcmZhY2UpOwogCQkJZGV2aWNlX2RlbCgmaW50ZXJmYWNlLT5kZXYpOwogCQl9CiAKQEAgLTExMTMsMjIgKzExNDMsMjYgQEAKICAqIHVzYl9lbmFibGVfZW5kcG9pbnQgLSBFbmFibGUgYW4gZW5kcG9pbnQgZm9yIFVTQiBjb21tdW5pY2F0aW9ucwogICogQGRldjogdGhlIGRldmljZSB3aG9zZSBpbnRlcmZhY2UgaXMgYmVpbmcgZW5hYmxlZAogICogQGVwOiB0aGUgZW5kcG9pbnQKKyAqIEByZXNldF90b2dnbGU6IGZsYWcgdG8gc2V0IHRoZSBlbmRwb2ludCdzIHRvZ2dsZSBiYWNrIHRvIDAKICAqCi0gKiBSZXNldHMgdGhlIGVuZHBvaW50IHRvZ2dsZSwgYW5kIHNldHMgZGV2LT5lcF97aW4sb3V0fSBwb2ludGVycy4KKyAqIFJlc2V0cyB0aGUgZW5kcG9pbnQgdG9nZ2xlIGlmIGFza2VkLCBhbmQgc2V0cyBkZXYtPmVwX3tpbixvdXR9IHBvaW50ZXJzLgogICogRm9yIGNvbnRyb2wgZW5kcG9pbnRzLCBib3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHNpZGVzIGFyZSBoYW5kbGVkLgogICovCi12b2lkIHVzYl9lbmFibGVfZW5kcG9pbnQoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcCkKK3ZvaWQgdXNiX2VuYWJsZV9lbmRwb2ludChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwLAorCQlib29sIHJlc2V0X3RvZ2dsZSkKIHsKIAlpbnQgZXBudW0gPSB1c2JfZW5kcG9pbnRfbnVtKCZlcC0+ZGVzYyk7CiAJaW50IGlzX291dCA9IHVzYl9lbmRwb2ludF9kaXJfb3V0KCZlcC0+ZGVzYyk7CiAJaW50IGlzX2NvbnRyb2wgPSB1c2JfZW5kcG9pbnRfeGZlcl9jb250cm9sKCZlcC0+ZGVzYyk7CiAKIAlpZiAoaXNfb3V0IHx8IGlzX2NvbnRyb2wpIHsKLQkJdXNiX3NldHRvZ2dsZShkZXYsIGVwbnVtLCAxLCAwKTsKKwkJaWYgKHJlc2V0X3RvZ2dsZSkKKwkJCXVzYl9zZXR0b2dnbGUoZGV2LCBlcG51bSwgMSwgMCk7CiAJCWRldi0+ZXBfb3V0W2VwbnVtXSA9IGVwOwogCX0KIAlpZiAoIWlzX291dCB8fCBpc19jb250cm9sKSB7Ci0JCXVzYl9zZXR0b2dnbGUoZGV2LCBlcG51bSwgMCwgMCk7CisJCWlmIChyZXNldF90b2dnbGUpCisJCQl1c2Jfc2V0dG9nZ2xlKGRldiwgZXBudW0sIDAsIDApOwogCQlkZXYtPmVwX2luW2VwbnVtXSA9IGVwOwogCX0KIAllcC0+ZW5hYmxlZCA9IDE7CkBAIC0xMTM4LDE3ICsxMTcyLDE4IEBACiAgKiB1c2JfZW5hYmxlX2ludGVyZmFjZSAtIEVuYWJsZSBhbGwgdGhlIGVuZHBvaW50cyBmb3IgYW4gaW50ZXJmYWNlCiAgKiBAZGV2OiB0aGUgZGV2aWNlIHdob3NlIGludGVyZmFjZSBpcyBiZWluZyBlbmFibGVkCiAgKiBAaW50ZjogcG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIGRlc2NyaXB0b3IKKyAqIEByZXNldF90b2dnbGVzOiBmbGFnIHRvIHNldCB0aGUgZW5kcG9pbnRzJyB0b2dnbGVzIGJhY2sgdG8gMAogICoKICAqIEVuYWJsZXMgYWxsIHRoZSBlbmRwb2ludHMgZm9yIHRoZSBpbnRlcmZhY2UncyBjdXJyZW50IGFsdHNldHRpbmcuCiAgKi8KLXN0YXRpYyB2b2lkIHVzYl9lbmFibGVfaW50ZXJmYWNlKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsCi0JCQkJIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQordm9pZCB1c2JfZW5hYmxlX2ludGVyZmFjZShzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LAorCQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgYm9vbCByZXNldF90b2dnbGVzKQogewogCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmFsdCA9IGludGYtPmN1cl9hbHRzZXR0aW5nOwogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IGFsdC0+ZGVzYy5iTnVtRW5kcG9pbnRzOyArK2kpCi0JCXVzYl9lbmFibGVfZW5kcG9pbnQoZGV2LCAmYWx0LT5lbmRwb2ludFtpXSk7CisJCXVzYl9lbmFibGVfZW5kcG9pbnQoZGV2LCAmYWx0LT5lbmRwb2ludFtpXSwgcmVzZXRfdG9nZ2xlcyk7CiB9CiAKIC8qKgpAQCAtMTIzNSw4ICsxMjcwLDEwIEBACiAJICovCiAKIAkvKiBwcmV2ZW50IHN1Ym1pc3Npb25zIHVzaW5nIHByZXZpb3VzIGVuZHBvaW50IHNldHRpbmdzICovCi0JaWYgKGlmYWNlLT5jdXJfYWx0c2V0dGluZyAhPSBhbHQpCisJaWYgKGlmYWNlLT5jdXJfYWx0c2V0dGluZyAhPSBhbHQpIHsKKwkJcmVtb3ZlX2ludGZfZXBfZGV2cyhpZmFjZSk7CiAJCXVzYl9yZW1vdmVfc3lzZnNfaW50Zl9maWxlcyhpZmFjZSk7CisJfQogCXVzYl9kaXNhYmxlX2ludGVyZmFjZShkZXYsIGlmYWNlKTsKIAogCWlmYWNlLT5jdXJfYWx0c2V0dGluZyA9IGFsdDsKQEAgLTEyNzEsMTAgKzEzMDgsMTEgQEAKIAkgKiBkdXJpbmcgdGhlIFNFVFVQIHN0YWdlIC0gaGVuY2UgRVAwIHRvZ2dsZXMgYXJlICJkb24ndCBjYXJlIiBoZXJlLgogCSAqIChMaWtld2lzZSwgRVAwIG5ldmVyICJoYWx0cyIgb24gd2VsbCBkZXNpZ25lZCBkZXZpY2VzLikKIAkgKi8KLQl1c2JfZW5hYmxlX2ludGVyZmFjZShkZXYsIGlmYWNlKTsKLQlpZiAoZGV2aWNlX2lzX3JlZ2lzdGVyZWQoJmlmYWNlLT5kZXYpKQorCXVzYl9lbmFibGVfaW50ZXJmYWNlKGRldiwgaWZhY2UsIHRydWUpOworCWlmIChkZXZpY2VfaXNfcmVnaXN0ZXJlZCgmaWZhY2UtPmRldikpIHsKIAkJdXNiX2NyZWF0ZV9zeXNmc19pbnRmX2ZpbGVzKGlmYWNlKTsKLQorCQljcmVhdGVfaW50Zl9lcF9kZXZzKGlmYWNlKTsKKwl9CiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1c2Jfc2V0X2ludGVyZmFjZSk7CkBAIC0xMzM0LDcgKzEzNzIsNiBAQAogCQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IGNvbmZpZy0+aW50ZXJmYWNlW2ldOwogCQlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICphbHQ7CiAKLQkJdXNiX3JlbW92ZV9zeXNmc19pbnRmX2ZpbGVzKGludGYpOwogCQlhbHQgPSB1c2JfYWx0bnVtX3RvX2FsdHNldHRpbmcoaW50ZiwgMCk7CiAKIAkJLyogTm8gYWx0c2V0dGluZyAwPyAgV2UnbGwgYXNzdW1lIHRoZSBmaXJzdCBhbHRzZXR0aW5nLgpAQCAtMTM0NSwxMCArMTM4MiwxNiBAQAogCQlpZiAoIWFsdCkKIAkJCWFsdCA9ICZpbnRmLT5hbHRzZXR0aW5nWzBdOwogCisJCWlmIChhbHQgIT0gaW50Zi0+Y3VyX2FsdHNldHRpbmcpIHsKKwkJCXJlbW92ZV9pbnRmX2VwX2RldnMoaW50Zik7CisJCQl1c2JfcmVtb3ZlX3N5c2ZzX2ludGZfZmlsZXMoaW50Zik7CisJCX0KIAkJaW50Zi0+Y3VyX2FsdHNldHRpbmcgPSBhbHQ7Ci0JCXVzYl9lbmFibGVfaW50ZXJmYWNlKGRldiwgaW50Zik7Ci0JCWlmIChkZXZpY2VfaXNfcmVnaXN0ZXJlZCgmaW50Zi0+ZGV2KSkKKwkJdXNiX2VuYWJsZV9pbnRlcmZhY2UoZGV2LCBpbnRmLCB0cnVlKTsKKwkJaWYgKGRldmljZV9pc19yZWdpc3RlcmVkKCZpbnRmLT5kZXYpKSB7CiAJCQl1c2JfY3JlYXRlX3N5c2ZzX2ludGZfZmlsZXMoaW50Zik7CisJCQljcmVhdGVfaW50Zl9lcF9kZXZzKGludGYpOworCQl9CiAJfQogCXJldHVybiAwOwogfQpAQCAtMTQ0MSw2ICsxNDg0LDQ2IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAorCisvKgorICogSW50ZXJuYWwgZnVuY3Rpb24gdG8gcXVldWUgYSBkZXZpY2UgcmVzZXQKKyAqCisgKiBUaGlzIGlzIGluaXRpYWxpemVkIGludG8gdGhlIHdvcmtzdHJ1Y3QgaW4gJ3N0cnVjdAorICogdXNiX2RldmljZS0+cmVzZXRfd3MnIHRoYXQgaXMgbGF1bmNoZWQgYnkKKyAqIG1lc3NhZ2UuYzp1c2Jfc2V0X2NvbmZpZ3VyYXRpb24oKSB3aGVuIGluaXRpYWxpemluZyBlYWNoICdzdHJ1Y3QKKyAqIHVzYl9pbnRlcmZhY2UnLgorICoKKyAqIEl0IGlzIHNhZmUgdG8gZ2V0IHRoZSBVU0IgZGV2aWNlIHdpdGhvdXQgcmVmZXJlbmNlIGNvdW50cyBiZWNhdXNlCisgKiB0aGUgbGlmZSBjeWNsZSBvZiBAaWZhY2UgaXMgYm91bmQgdG8gdGhlIGxpZmUgY3ljbGUgb2YgQHVkZXYuIFRoZW4sCisgKiB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgcmFuIG9ubHkgaWYgQGlmYWNlIGlzIGFsaXZlIChhbmQgYmVmb3JlCisgKiBmcmVlaW5nIGl0IGFueSBzY2hlZHVsZWQgaW5zdGFuY2VzIG9mIGl0IHdpbGwgaGF2ZSBiZWVuIGNhbmNlbGxlZCkuCisgKgorICogV2UgbmVlZCB0byBzZXQgYSBmbGFnICh1c2JfZGV2LT5yZXNldF9ydW5uaW5nKSBiZWNhdXNlIHdoZW4gd2UgY2FsbAorICogdGhlIHJlc2V0LCB0aGUgaW50ZXJmYWNlcyBtaWdodCBiZSB1bmJvdW5kLiBUaGUgY3VycmVudCBpbnRlcmZhY2UKKyAqIGNhbm5vdCB0cnkgdG8gcmVtb3ZlIHRoZSBxdWV1ZWQgd29yayBhcyBpdCB3b3VsZCBjYXVzZSBhIGRlYWRsb2NrCisgKiAoeW91IGNhbm5vdCByZW1vdmUgeW91ciB3b3JrIGZyb20gd2l0aGluIHlvdXIgZXhlY3V0aW5nCisgKiB3b3JrcXVldWUpLiBUaGlzIGZsYWcgbGV0cyBpdCBrbm93LCBzbyB0aGF0CisgKiB1c2JfY2FuY2VsX3F1ZXVlZF9yZXNldCgpIGRvZXNuJ3QgdHJ5IHRvIGRvIGl0LgorICoKKyAqIFNlZSB1c2JfcXVldWVfcmVzZXRfZGV2aWNlKCkgZm9yIG1vcmUgZGV0YWlscworICovCit2b2lkIF9fdXNiX3F1ZXVlX3Jlc2V0X2RldmljZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndzKQoreworCWludCByYzsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2UgPQorCQljb250YWluZXJfb2Yod3MsIHN0cnVjdCB1c2JfaW50ZXJmYWNlLCByZXNldF93cyk7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGlmYWNlKTsKKworCXJjID0gdXNiX2xvY2tfZGV2aWNlX2Zvcl9yZXNldCh1ZGV2LCBpZmFjZSk7CisJaWYgKHJjID49IDApIHsKKwkJaWZhY2UtPnJlc2V0X3J1bm5pbmcgPSAxOworCQl1c2JfcmVzZXRfZGV2aWNlKHVkZXYpOworCQlpZmFjZS0+cmVzZXRfcnVubmluZyA9IDA7CisJCXVzYl91bmxvY2tfZGV2aWNlKHVkZXYpOworCX0KK30KKworCiAvKgogICogdXNiX3NldF9jb25maWd1cmF0aW9uIC0gTWFrZXMgYSBwYXJ0aWN1bGFyIGRldmljZSBzZXR0aW5nIGJlIGN1cnJlbnQKICAqIEBkZXY6IHRoZSBkZXZpY2Ugd2hvc2UgY29uZmlndXJhdGlvbiBpcyBiZWluZyB1cGRhdGVkCkBAIC0xNTYwLDYgKzE2NDMsOSBAQAogCWlmIChkZXYtPnN0YXRlICE9IFVTQl9TVEFURV9BRERSRVNTKQogCQl1c2JfZGlzYWJsZV9kZXZpY2UoZGV2LCAxKTsJLyogU2tpcCBlcDAgKi8KIAorCS8qIEdldCByaWQgb2YgcGVuZGluZyBhc3luYyBTZXQtQ29uZmlnIHJlcXVlc3RzIGZvciB0aGlzIGRldmljZSAqLworCWNhbmNlbF9hc3luY19zZXRfY29uZmlnKGRldik7CisKIAlyZXQgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKIAkJCSAgICAgIFVTQl9SRVFfU0VUX0NPTkZJR1VSQVRJT04sIDAsIGNvbmZpZ3VyYXRpb24sIDAsCiAJCQkgICAgICBOVUxMLCAwLCBVU0JfQ1RSTF9TRVRfVElNRU9VVCk7CkBAIC0xNjA0LDEzICsxNjkwLDE0IEBACiAJCQlhbHQgPSAmaW50Zi0+YWx0c2V0dGluZ1swXTsKIAogCQlpbnRmLT5jdXJfYWx0c2V0dGluZyA9IGFsdDsKLQkJdXNiX2VuYWJsZV9pbnRlcmZhY2UoZGV2LCBpbnRmKTsKKwkJdXNiX2VuYWJsZV9pbnRlcmZhY2UoZGV2LCBpbnRmLCB0cnVlKTsKIAkJaW50Zi0+ZGV2LnBhcmVudCA9ICZkZXYtPmRldjsKIAkJaW50Zi0+ZGV2LmRyaXZlciA9IE5VTEw7CiAJCWludGYtPmRldi5idXMgPSAmdXNiX2J1c190eXBlOwogCQlpbnRmLT5kZXYudHlwZSA9ICZ1c2JfaWZfZGV2aWNlX3R5cGU7CiAJCWludGYtPmRldi5ncm91cHMgPSB1c2JfaW50ZXJmYWNlX2dyb3VwczsKIAkJaW50Zi0+ZGV2LmRtYV9tYXNrID0gZGV2LT5kZXYuZG1hX21hc2s7CisJCUlOSVRfV09SSygmaW50Zi0+cmVzZXRfd3MsIF9fdXNiX3F1ZXVlX3Jlc2V0X2RldmljZSk7CiAJCWRldmljZV9pbml0aWFsaXplKCZpbnRmLT5kZXYpOwogCQltYXJrX3F1aWVzY2VkKGludGYpOwogCQlkZXZfc2V0X25hbWUoJmludGYtPmRldiwgIiVkLSVzOiVkLiVkIiwKQEAgLTE2NDEsMTcgKzE3MjgsMjEgQEAKIAkJCQlkZXZfbmFtZSgmaW50Zi0+ZGV2KSwgcmV0KTsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCXVzYl9jcmVhdGVfc3lzZnNfaW50Zl9maWxlcyhpbnRmKTsKKwkJY3JlYXRlX2ludGZfZXBfZGV2cyhpbnRmKTsKIAl9CiAKIAl1c2JfYXV0b3N1c3BlbmRfZGV2aWNlKGRldik7CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBMSVNUX0hFQUQoc2V0X2NvbmZpZ19saXN0KTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soc2V0X2NvbmZpZ19sb2NrKTsKKwogc3RydWN0IHNldF9jb25maWdfcmVxdWVzdCB7CiAJc3RydWN0IHVzYl9kZXZpY2UJKnVkZXY7CiAJaW50CQkJY29uZmlnOwogCXN0cnVjdCB3b3JrX3N0cnVjdAl3b3JrOworCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsKIH07CiAKIC8qIFdvcmtlciByb3V0aW5lIGZvciB1c2JfZHJpdmVyX3NldF9jb25maWd1cmF0aW9uKCkgKi8KQEAgLTE2NTksMTQgKzE3NTAsMzUgQEAKIHsKIAlzdHJ1Y3Qgc2V0X2NvbmZpZ19yZXF1ZXN0ICpyZXEgPQogCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHNldF9jb25maWdfcmVxdWVzdCwgd29yayk7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSByZXEtPnVkZXY7CiAKLQl1c2JfbG9ja19kZXZpY2UocmVxLT51ZGV2KTsKLQl1c2Jfc2V0X2NvbmZpZ3VyYXRpb24ocmVxLT51ZGV2LCByZXEtPmNvbmZpZyk7Ci0JdXNiX3VubG9ja19kZXZpY2UocmVxLT51ZGV2KTsKLQl1c2JfcHV0X2RldihyZXEtPnVkZXYpOworCXVzYl9sb2NrX2RldmljZSh1ZGV2KTsKKwlzcGluX2xvY2soJnNldF9jb25maWdfbG9jayk7CisJbGlzdF9kZWwoJnJlcS0+bm9kZSk7CisJc3Bpbl91bmxvY2soJnNldF9jb25maWdfbG9jayk7CisKKwlpZiAocmVxLT5jb25maWcgPj0gLTEpCQkvKiBJcyByZXEgc3RpbGwgdmFsaWQ/ICovCisJCXVzYl9zZXRfY29uZmlndXJhdGlvbih1ZGV2LCByZXEtPmNvbmZpZyk7CisJdXNiX3VubG9ja19kZXZpY2UodWRldik7CisJdXNiX3B1dF9kZXYodWRldik7CiAJa2ZyZWUocmVxKTsKIH0KIAorLyogQ2FuY2VsIHBlbmRpbmcgU2V0LUNvbmZpZyByZXF1ZXN0cyBmb3IgYSBkZXZpY2Ugd2hvc2UgY29uZmlndXJhdGlvbgorICogd2FzIGp1c3QgY2hhbmdlZAorICovCitzdGF0aWMgdm9pZCBjYW5jZWxfYXN5bmNfc2V0X2NvbmZpZyhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKK3sKKwlzdHJ1Y3Qgc2V0X2NvbmZpZ19yZXF1ZXN0ICpyZXE7CisKKwlzcGluX2xvY2soJnNldF9jb25maWdfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXEsICZzZXRfY29uZmlnX2xpc3QsIG5vZGUpIHsKKwkJaWYgKHJlcS0+dWRldiA9PSB1ZGV2KQorCQkJcmVxLT5jb25maWcgPSAtOTk5OwkvKiBNYXJrIGFzIGNhbmNlbGxlZCAqLworCX0KKwlzcGluX3VubG9jaygmc2V0X2NvbmZpZ19sb2NrKTsKK30KKwogLyoqCiAgKiB1c2JfZHJpdmVyX3NldF9jb25maWd1cmF0aW9uIC0gUHJvdmlkZSBhIHdheSBmb3IgZHJpdmVycyB0byBjaGFuZ2UgZGV2aWNlIGNvbmZpZ3VyYXRpb25zCiAgKiBAdWRldjogdGhlIGRldmljZSB3aG9zZSBjb25maWd1cmF0aW9uIGlzIGJlaW5nIHVwZGF0ZWQKQEAgLTE2OTgsNiArMTgxMCwxMCBAQAogCXJlcS0+Y29uZmlnID0gY29uZmlnOwogCUlOSVRfV09SSygmcmVxLT53b3JrLCBkcml2ZXJfc2V0X2NvbmZpZ193b3JrKTsKIAorCXNwaW5fbG9jaygmc2V0X2NvbmZpZ19sb2NrKTsKKwlsaXN0X2FkZCgmcmVxLT5ub2RlLCAmc2V0X2NvbmZpZ19saXN0KTsKKwlzcGluX3VubG9jaygmc2V0X2NvbmZpZ19sb2NrKTsKKwogCXVzYl9nZXRfZGV2KHVkZXYpOwogCXNjaGVkdWxlX3dvcmsoJnJlcS0+d29yayk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL3N5c2ZzLmMgYi9kcml2ZXJzL3VzYi9jb3JlL3N5c2ZzLmMKaW5kZXggNGZiNjVmZC4uNGNjMjQ1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9zeXNmcy5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvc3lzZnMuYwpAQCAtMzU5LDE5ICszNTksMTkgQEAKIAkJCXN0cm5jbXAoYnVmLCBvbl9zdHJpbmcsIGxlbikgPT0gMCkgewogCQl1ZGV2LT5hdXRvc3VzcGVuZF9kaXNhYmxlZCA9IDE7CiAJCXVkZXYtPmF1dG9yZXN1bWVfZGlzYWJsZWQgPSAwOwotCQlyYyA9IHVzYl9leHRlcm5hbF9yZXN1bWVfZGV2aWNlKHVkZXYpOworCQlyYyA9IHVzYl9leHRlcm5hbF9yZXN1bWVfZGV2aWNlKHVkZXYsIFBNU0dfVVNFUl9SRVNVTUUpOwogCiAJfSBlbHNlIGlmIChsZW4gPT0gc2l6ZW9mIGF1dG9fc3RyaW5nIC0gMSAmJgogCQkJc3RybmNtcChidWYsIGF1dG9fc3RyaW5nLCBsZW4pID09IDApIHsKIAkJdWRldi0+YXV0b3N1c3BlbmRfZGlzYWJsZWQgPSAwOwogCQl1ZGV2LT5hdXRvcmVzdW1lX2Rpc2FibGVkID0gMDsKLQkJcmMgPSB1c2JfZXh0ZXJuYWxfcmVzdW1lX2RldmljZSh1ZGV2KTsKKwkJcmMgPSB1c2JfZXh0ZXJuYWxfcmVzdW1lX2RldmljZSh1ZGV2LCBQTVNHX1VTRVJfUkVTVU1FKTsKIAogCX0gZWxzZSBpZiAobGVuID09IHNpemVvZiBzdXNwZW5kX3N0cmluZyAtIDEgJiYKIAkJCXN0cm5jbXAoYnVmLCBzdXNwZW5kX3N0cmluZywgbGVuKSA9PSAwKSB7CiAJCXVkZXYtPmF1dG9zdXNwZW5kX2Rpc2FibGVkID0gMDsKIAkJdWRldi0+YXV0b3Jlc3VtZV9kaXNhYmxlZCA9IDE7Ci0JCXJjID0gdXNiX2V4dGVybmFsX3N1c3BlbmRfZGV2aWNlKHVkZXYsIFBNU0dfU1VTUEVORCk7CisJCXJjID0gdXNiX2V4dGVybmFsX3N1c3BlbmRfZGV2aWNlKHVkZXYsIFBNU0dfVVNFUl9TVVNQRU5EKTsKIAogCX0gZWxzZQogCQlyYyA9IC1FSU5WQUw7CkBAIC02MjksOSArNjI5LDYgQEAKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmdWRldi0+ZGV2OwogCWludCByZXR2YWw7CiAKLQkvKiBVbmZvcnVuYXRlbHkgdGhlc2UgYXR0cmlidXRlcyBjYW5ub3QgYmUgY3JlYXRlZCBiZWZvcmUKLQkgKiB0aGUgdWV2ZW50IGlzIGJyb2FkY2FzdC4KLQkgKi8KIAlyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2Jpbl9maWxlKGRldiwgJmRldl9iaW5fYXR0cl9kZXNjcmlwdG9ycyk7CiAJaWYgKHJldHZhbCkKIAkJZ290byBlcnJvcjsKQEAgLTY0MywxMSArNjQwLDcgQEAKIAlyZXR2YWwgPSBhZGRfcG93ZXJfYXR0cmlidXRlcyhkZXYpOwogCWlmIChyZXR2YWwpCiAJCWdvdG8gZXJyb3I7Ci0KLQlyZXR2YWwgPSB1c2JfY3JlYXRlX2VwX2ZpbGVzKGRldiwgJnVkZXYtPmVwMCwgdWRldik7Ci0JaWYgKHJldHZhbCkKLQkJZ290byBlcnJvcjsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0dmFsOwogZXJyb3I6CiAJdXNiX3JlbW92ZV9zeXNmc19kZXZfZmlsZXModWRldik7CiAJcmV0dXJuIHJldHZhbDsKQEAgLTY1Nyw3ICs2NTAsNiBAQAogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZ1ZGV2LT5kZXY7CiAKLQl1c2JfcmVtb3ZlX2VwX2ZpbGVzKCZ1ZGV2LT5lcDApOwogCXJlbW92ZV9wb3dlcl9hdHRyaWJ1dGVzKGRldik7CiAJcmVtb3ZlX3BlcnNpc3RfYXR0cmlidXRlcyhkZXYpOwogCWRldmljZV9yZW1vdmVfYmluX2ZpbGUoZGV2LCAmZGV2X2Jpbl9hdHRyX2Rlc2NyaXB0b3JzKTsKQEAgLTgxMiwyOCArODA0LDYgQEAKIAlOVUxMCiB9OwogCi1zdGF0aWMgaW5saW5lIHZvaWQgdXNiX2NyZWF0ZV9pbnRmX2VwX2ZpbGVzKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAotCQlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKLXsKLQlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppZmFjZV9kZXNjOwotCWludCBpOwotCi0JaWZhY2VfZGVzYyA9IGludGYtPmN1cl9hbHRzZXR0aW5nOwotCWZvciAoaSA9IDA7IGkgPCBpZmFjZV9kZXNjLT5kZXNjLmJOdW1FbmRwb2ludHM7ICsraSkKLQkJdXNiX2NyZWF0ZV9lcF9maWxlcygmaW50Zi0+ZGV2LCAmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0sCi0JCQkJdWRldik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB1c2JfcmVtb3ZlX2ludGZfZXBfZmlsZXMoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCi17Ci0Jc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaWZhY2VfZGVzYzsKLQlpbnQgaTsKLQotCWlmYWNlX2Rlc2MgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsKLQlmb3IgKGkgPSAwOyBpIDwgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyArK2kpCi0JCXVzYl9yZW1vdmVfZXBfZmlsZXMoJmlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldKTsKLX0KLQogaW50IHVzYl9jcmVhdGVfc3lzZnNfaW50Zl9maWxlcyhzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CkBAIC04NDMsMjYgKzgxMywxOSBAQAogCWlmIChpbnRmLT5zeXNmc19maWxlc19jcmVhdGVkIHx8IGludGYtPnVucmVnaXN0ZXJpbmcpCiAJCXJldHVybiAwOwogCi0JLyogVGhlIGludGVyZmFjZSBzdHJpbmcgbWF5IGJlIHByZXNlbnQgaW4gc29tZSBhbHRzZXR0aW5ncwotCSAqIGFuZCBtaXNzaW5nIGluIG90aGVycy4gIEhlbmNlIGl0cyBhdHRyaWJ1dGUgY2Fubm90IGJlIGNyZWF0ZWQKLQkgKiBiZWZvcmUgdGhlIHVldmVudCBpcyBicm9hZGNhc3QuCi0JICovCiAJaWYgKGFsdC0+c3RyaW5nID09IE5VTEwpCiAJCWFsdC0+c3RyaW5nID0gdXNiX2NhY2hlX3N0cmluZyh1ZGV2LCBhbHQtPmRlc2MuaUludGVyZmFjZSk7CiAJaWYgKGFsdC0+c3RyaW5nKQogCQlyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX2ludGVyZmFjZSk7Ci0JdXNiX2NyZWF0ZV9pbnRmX2VwX2ZpbGVzKGludGYsIHVkZXYpOwogCWludGYtPnN5c2ZzX2ZpbGVzX2NyZWF0ZWQgPSAxOwogCXJldHVybiAwOwogfQogCiB2b2lkIHVzYl9yZW1vdmVfc3lzZnNfaW50Zl9maWxlcyhzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaW50Zi0+ZGV2OwotCiAJaWYgKCFpbnRmLT5zeXNmc19maWxlc19jcmVhdGVkKQogCQlyZXR1cm47Ci0JdXNiX3JlbW92ZV9pbnRmX2VwX2ZpbGVzKGludGYpOwotCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9pbnRlcmZhY2UpOworCisJZGV2aWNlX3JlbW92ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9pbnRlcmZhY2UpOwogCWludGYtPnN5c2ZzX2ZpbGVzX2NyZWF0ZWQgPSAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS91cmIuYyBiL2RyaXZlcnMvdXNiL2NvcmUvdXJiLmMKaW5kZXggMWY2OGFmOS4uNThiYzVlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS91cmIuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL3VyYi5jCkBAIC0xMCw3ICsxMCw2IEBACiAKICNkZWZpbmUgdG9fdXJiKGQpIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgdXJiLCBrcmVmKQogCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHVzYl9yZWplY3RfbG9jayk7CiAKIHN0YXRpYyB2b2lkIHVyYl9kZXN0cm95KHN0cnVjdCBrcmVmICprcmVmKQogewpAQCAtMTMxLDkgKzEzMCw3IEBACiAJdXJiLT5hbmNob3IgPSBhbmNob3I7CiAKIAlpZiAodW5saWtlbHkoYW5jaG9yLT5wb2lzb25lZCkpIHsKLQkJc3Bpbl9sb2NrKCZ1c2JfcmVqZWN0X2xvY2spOwotCQl1cmItPnJlamVjdCsrOwotCQlzcGluX3VubG9jaygmdXNiX3JlamVjdF9sb2NrKTsKKwkJYXRvbWljX2luYygmdXJiLT5yZWplY3QpOwogCX0KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFuY2hvci0+bG9jaywgZmxhZ3MpOwpAQCAtNTY1LDE2ICs1NjIsMTIgQEAKIAltaWdodF9zbGVlcCgpOwogCWlmICghKHVyYiAmJiB1cmItPmRldiAmJiB1cmItPmVwKSkKIAkJcmV0dXJuOwotCXNwaW5fbG9ja19pcnEoJnVzYl9yZWplY3RfbG9jayk7Ci0JKyt1cmItPnJlamVjdDsKLQlzcGluX3VubG9ja19pcnEoJnVzYl9yZWplY3RfbG9jayk7CisJYXRvbWljX2luYygmdXJiLT5yZWplY3QpOwogCiAJdXNiX2hjZF91bmxpbmtfdXJiKHVyYiwgLUVOT0VOVCk7CiAJd2FpdF9ldmVudCh1c2Jfa2lsbF91cmJfcXVldWUsIGF0b21pY19yZWFkKCZ1cmItPnVzZV9jb3VudCkgPT0gMCk7CiAKLQlzcGluX2xvY2tfaXJxKCZ1c2JfcmVqZWN0X2xvY2spOwotCS0tdXJiLT5yZWplY3Q7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZ1c2JfcmVqZWN0X2xvY2spOworCWF0b21pY19kZWMoJnVyYi0+cmVqZWN0KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVzYl9raWxsX3VyYik7CiAKQEAgLTYwNiw5ICs1OTksNyBAQAogCW1pZ2h0X3NsZWVwKCk7CiAJaWYgKCEodXJiICYmIHVyYi0+ZGV2ICYmIHVyYi0+ZXApKQogCQlyZXR1cm47Ci0Jc3Bpbl9sb2NrX2lycSgmdXNiX3JlamVjdF9sb2NrKTsKLQkrK3VyYi0+cmVqZWN0OwotCXNwaW5fdW5sb2NrX2lycSgmdXNiX3JlamVjdF9sb2NrKTsKKwlhdG9taWNfaW5jKCZ1cmItPnJlamVjdCk7CiAKIAl1c2JfaGNkX3VubGlua191cmIodXJiLCAtRU5PRU5UKTsKIAl3YWl0X2V2ZW50KHVzYl9raWxsX3VyYl9xdWV1ZSwgYXRvbWljX3JlYWQoJnVyYi0+dXNlX2NvdW50KSA9PSAwKTsKQEAgLTYxNywxNCArNjA4LDEwIEBACiAKIHZvaWQgdXNiX3VucG9pc29uX3VyYihzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQogCWlmICghdXJiKQogCQlyZXR1cm47CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdXNiX3JlamVjdF9sb2NrLCBmbGFncyk7Ci0JLS11cmItPnJlamVjdDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1c2JfcmVqZWN0X2xvY2ssIGZsYWdzKTsKKwlhdG9taWNfZGVjKCZ1cmItPnJlamVjdCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1c2JfdW5wb2lzb25fdXJiKTsKIApAQCAtNjkyLDYgKzY3OSwyNiBAQAogRVhQT1JUX1NZTUJPTF9HUEwodXNiX3BvaXNvbl9hbmNob3JlZF91cmJzKTsKIAogLyoqCisgKiB1c2JfdW5wb2lzb25fYW5jaG9yZWRfdXJicyAtIGxldCBhbiBhbmNob3IgYmUgdXNlZCBzdWNjZXNzZnVsbHkgYWdhaW4KKyAqIEBhbmNob3I6IGFuY2hvciB0aGUgcmVxdWVzdHMgYXJlIGJvdW5kIHRvCisgKgorICogUmV2ZXJzZXMgdGhlIGVmZmVjdCBvZiB1c2JfcG9pc29uX2FuY2hvcmVkX3VyYnMKKyAqIHRoZSBhbmNob3IgY2FuIGJlIHVzZWQgbm9ybWFsbHkgYWZ0ZXIgaXQgcmV0dXJucworICovCit2b2lkIHVzYl91bnBvaXNvbl9hbmNob3JlZF91cmJzKHN0cnVjdCB1c2JfYW5jaG9yICphbmNob3IpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgdXJiICpsYXphcnVzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFuY2hvci0+bG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnkobGF6YXJ1cywgJmFuY2hvci0+dXJiX2xpc3QsIGFuY2hvcl9saXN0KSB7CisJCXVzYl91bnBvaXNvbl91cmIobGF6YXJ1cyk7CisJfQorCWFuY2hvci0+cG9pc29uZWQgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFuY2hvci0+bG9jaywgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodXNiX3VucG9pc29uX2FuY2hvcmVkX3VyYnMpOworLyoqCiAgKiB1c2JfdW5saW5rX2FuY2hvcmVkX3VyYnMgLSBhc3luY2hyb25vdXNseSBjYW5jZWwgdHJhbnNmZXIgcmVxdWVzdHMgZW4gbWFzc2UKICAqIEBhbmNob3I6IGFuY2hvciB0aGUgcmVxdWVzdHMgYXJlIGJvdW5kIHRvCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS91c2IuYyBiL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmMKaW5kZXggYmUxZmEwNy4uZGNmYzA3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS91c2IuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL3VzYi5jCkBAIC0yNTMsNyArMjUzLDcgQEAKIHN0YXRpYyB2b2lkIHVzYl9kZXZfY29tcGxldGUoc3RydWN0IGRldmljZSAqZGV2KQogewogCS8qIEN1cnJlbnRseSB1c2VkIG9ubHkgZm9yIHJlYmluZGluZyBpbnRlcmZhY2VzICovCi0JdXNiX3Jlc3VtZShkZXYpOwkvKiBJbXBsZW1lbnQgZXZlbnR1YWxseT8gKi8KKwl1c2JfcmVzdW1lKGRldiwgUE1TR19SRVNVTUUpOwkvKiBNZXNzYWdlIGV2ZW50IGlzIG1lYW5pbmdsZXNzICovCiB9CiAKIHN0YXRpYyBpbnQgdXNiX2Rldl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKQEAgLTI2Myw3ICsyNjMsNyBAQAogCiBzdGF0aWMgaW50IHVzYl9kZXZfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gdXNiX3Jlc3VtZShkZXYpOworCXJldHVybiB1c2JfcmVzdW1lKGRldiwgUE1TR19SRVNVTUUpOwogfQogCiBzdGF0aWMgaW50IHVzYl9kZXZfZnJlZXplKHN0cnVjdCBkZXZpY2UgKmRldikKQEAgLTI3Myw3ICsyNzMsNyBAQAogCiBzdGF0aWMgaW50IHVzYl9kZXZfdGhhdyhzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JcmV0dXJuIHVzYl9yZXN1bWUoZGV2KTsKKwlyZXR1cm4gdXNiX3Jlc3VtZShkZXYsIFBNU0dfVEhBVyk7CiB9CiAKIHN0YXRpYyBpbnQgdXNiX2Rldl9wb3dlcm9mZihzdHJ1Y3QgZGV2aWNlICpkZXYpCkBAIC0yODMsMTAgKzI4MywxMCBAQAogCiBzdGF0aWMgaW50IHVzYl9kZXZfcmVzdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JcmV0dXJuIHVzYl9yZXN1bWUoZGV2KTsKKwlyZXR1cm4gdXNiX3Jlc3VtZShkZXYsIFBNU0dfUkVTVE9SRSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcG1fb3BzIHVzYl9kZXZpY2VfcG1fb3BzID0geworc3RhdGljIHN0cnVjdCBkZXZfcG1fb3BzIHVzYl9kZXZpY2VfcG1fb3BzID0gewogCS5wcmVwYXJlID0JdXNiX2Rldl9wcmVwYXJlLAogCS5jb21wbGV0ZSA9CXVzYl9kZXZfY29tcGxldGUsCiAJLnN1c3BlbmQgPQl1c2JfZGV2X3N1c3BlbmQsCkBAIC0zMDEsNyArMzAxLDcgQEAKIAogI2RlZmluZSBrc3VzcGVuZF91c2JfaW5pdCgpCTAKICNkZWZpbmUga3N1c3BlbmRfdXNiX2NsZWFudXAoKQlkbyB7fSB3aGlsZSAoMCkKLSNkZWZpbmUgdXNiX2RldmljZV9wbV9vcHMJKCooc3RydWN0IHBtX29wcyAqKTApCisjZGVmaW5lIHVzYl9kZXZpY2VfcG1fb3BzCSgqKHN0cnVjdCBkZXZfcG1fb3BzICopMCkKIAogI2VuZGlmCS8qIENPTkZJR19QTSAqLwogCkBAIC0zNjIsNyArMzYyLDcgQEAKIAlkZXYtPmVwMC5kZXNjLmJMZW5ndGggPSBVU0JfRFRfRU5EUE9JTlRfU0laRTsKIAlkZXYtPmVwMC5kZXNjLmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9FTkRQT0lOVDsKIAkvKiBlcDAgbWF4cGFja2V0IGNvbWVzIGxhdGVyLCBmcm9tIGRldmljZSBkZXNjcmlwdG9yICovCi0JdXNiX2VuYWJsZV9lbmRwb2ludChkZXYsICZkZXYtPmVwMCk7CisJdXNiX2VuYWJsZV9lbmRwb2ludChkZXYsICZkZXYtPmVwMCwgdHJ1ZSk7CiAJZGV2LT5jYW5fc3VibWl0ID0gMTsKIAogCS8qIFNhdmUgcmVhZGFibGUgYW5kIHN0YWJsZSB0b3BvbG9neSBpZCwgZGlzdGluZ3Vpc2hpbmcgZGV2aWNlcwpAQCAtNDAyLDYgKzQwMiw3IEBACiAjaWZkZWYJQ09ORklHX1BNCiAJbXV0ZXhfaW5pdCgmZGV2LT5wbV9tdXRleCk7CiAJSU5JVF9ERUxBWUVEX1dPUksoJmRldi0+YXV0b3N1c3BlbmQsIHVzYl9hdXRvc3VzcGVuZF93b3JrKTsKKwlJTklUX1dPUksoJmRldi0+YXV0b3Jlc3VtZSwgdXNiX2F1dG9yZXN1bWVfd29yayk7CiAJZGV2LT5hdXRvc3VzcGVuZF9kZWxheSA9IHVzYl9hdXRvc3VzcGVuZF9kZWxheSAqIEhaOwogCWRldi0+Y29ubmVjdF90aW1lID0gamlmZmllczsKIAlkZXYtPmFjdGl2ZV9kdXJhdGlvbiA9IC1qaWZmaWVzOwpAQCAtNTEzLDEwICs1MTQsNyBAQAogICogZGlzY29ubmVjdDsgaW4gc29tZSBkcml2ZXJzIChzdWNoIGFzIHVzYi1zdG9yYWdlKSB0aGUgZGlzY29ubmVjdCgpCiAgKiBvciBzdXNwZW5kKCkgbWV0aG9kIHdpbGwgYmxvY2sgd2FpdGluZyBmb3IgYSBkZXZpY2UgcmVzZXQgdG8gY29tcGxldGUuCiAgKgotICogUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgZm9yIGZhaWx1cmUsIG90aGVyd2lzZSAxIG9yIDAgdG8gaW5kaWNhdGUKLSAqIHRoYXQgdGhlIGRldmljZSB3aWxsIG9yIHdpbGwgbm90IGhhdmUgdG8gYmUgdW5sb2NrZWQuICAoMCBjYW4gYmUKLSAqIHJldHVybmVkIHdoZW4gYW4gaW50ZXJmYWNlIGlzIGdpdmVuIGFuZCBpcyBCSU5ESU5HLCBiZWNhdXNlIGluIHRoYXQKLSAqIGNhc2UgdGhlIGRyaXZlciBhbHJlYWR5IG93bnMgdGhlIGRldmljZSBsb2NrLikKKyAqIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGZvciBmYWlsdXJlLCBvdGhlcndpc2UgMC4KICAqLwogaW50IHVzYl9sb2NrX2RldmljZV9mb3JfcmVzZXQoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsCiAJCQkgICAgICBjb25zdCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2UpCkBAIC01MjcsMTYgKzUyNSw5IEBACiAJCXJldHVybiAtRU5PREVWOwogCWlmICh1ZGV2LT5zdGF0ZSA9PSBVU0JfU1RBVEVfU1VTUEVOREVEKQogCQlyZXR1cm4gLUVIT1NUVU5SRUFDSDsKLQlpZiAoaWZhY2UpIHsKLQkJc3dpdGNoIChpZmFjZS0+Y29uZGl0aW9uKSB7Ci0JCWNhc2UgVVNCX0lOVEVSRkFDRV9CSU5ESU5HOgotCQkJcmV0dXJuIDA7Ci0JCWNhc2UgVVNCX0lOVEVSRkFDRV9CT1VORDoKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5UUjsKLQkJfQotCX0KKwlpZiAoaWZhY2UgJiYgKGlmYWNlLT5jb25kaXRpb24gPT0gVVNCX0lOVEVSRkFDRV9VTkJJTkRJTkcgfHwKKwkJCWlmYWNlLT5jb25kaXRpb24gPT0gVVNCX0lOVEVSRkFDRV9VTkJPVU5EKSkKKwkJcmV0dXJuIC1FSU5UUjsKIAogCXdoaWxlICh1c2JfdHJ5bG9ja19kZXZpY2UodWRldikgIT0gMCkgewogCkBAIC01NTAsMTAgKzU0MSwxMSBAQAogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCWlmICh1ZGV2LT5zdGF0ZSA9PSBVU0JfU1RBVEVfU1VTUEVOREVEKQogCQkJcmV0dXJuIC1FSE9TVFVOUkVBQ0g7Ci0JCWlmIChpZmFjZSAmJiBpZmFjZS0+Y29uZGl0aW9uICE9IFVTQl9JTlRFUkZBQ0VfQk9VTkQpCisJCWlmIChpZmFjZSAmJiAoaWZhY2UtPmNvbmRpdGlvbiA9PSBVU0JfSU5URVJGQUNFX1VOQklORElORyB8fAorCQkJCWlmYWNlLT5jb25kaXRpb24gPT0gVVNCX0lOVEVSRkFDRV9VTkJPVU5EKSkKIAkJCXJldHVybiAtRUlOVFI7CiAJfQotCXJldHVybiAxOworCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodXNiX2xvY2tfZGV2aWNlX2Zvcl9yZXNldCk7CiAKQEAgLTk2Miw4ICs5NTQsMTIgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVzYl9idWZmZXJfdW5tYXBfc2cpOwogCi0vKiBmb3JtYXQgdG8gZGlzYWJsZSBVU0Igb24ga2VybmVsIGNvbW1hbmQgbGluZSBpczogbm91c2IgKi8KLV9fbW9kdWxlX3BhcmFtX2NhbGwoIiIsIG5vdXNiLCBwYXJhbV9zZXRfYm9vbCwgcGFyYW1fZ2V0X2Jvb2wsICZub3VzYiwgMDQ0NCk7CisvKiBUbyBkaXNhYmxlIFVTQiwga2VybmVsIGNvbW1hbmQgbGluZSBpcyAnbm91c2InIG5vdCAndXNiY29yZS5ub3VzYicgKi8KKyNpZmRlZiBNT0RVTEUKK21vZHVsZV9wYXJhbShub3VzYiwgYm9vbCwgMDQ0NCk7CisjZWxzZQorY29yZV9wYXJhbShub3VzYiwgbm91c2IsIGJvb2wsIDA0NDQpOworI2VuZGlmCiAKIC8qCiAgKiBmb3IgZXh0ZXJuYWwgcmVhZCBhY2Nlc3MgdG8gPG5vdXNiPgpAQCAtOTc1LDYgKzk3MSwzNyBAQAogRVhQT1JUX1NZTUJPTF9HUEwodXNiX2Rpc2FibGVkKTsKIAogLyoKKyAqIE5vdGlmaWNhdGlvbnMgb2YgZGV2aWNlIGFuZCBpbnRlcmZhY2UgcmVnaXN0cmF0aW9uCisgKi8KK3N0YXRpYyBpbnQgdXNiX2J1c19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyBhY3Rpb24sCisJCXZvaWQgKmRhdGEpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gZGF0YTsKKworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSBCVVNfTk9USUZZX0FERF9ERVZJQ0U6CisJCWlmIChkZXYtPnR5cGUgPT0gJnVzYl9kZXZpY2VfdHlwZSkKKwkJCSh2b2lkKSB1c2JfY3JlYXRlX3N5c2ZzX2Rldl9maWxlcyh0b191c2JfZGV2aWNlKGRldikpOworCQllbHNlIGlmIChkZXYtPnR5cGUgPT0gJnVzYl9pZl9kZXZpY2VfdHlwZSkKKwkJCSh2b2lkKSB1c2JfY3JlYXRlX3N5c2ZzX2ludGZfZmlsZXMoCisJCQkJCXRvX3VzYl9pbnRlcmZhY2UoZGV2KSk7CisJCWJyZWFrOworCisJY2FzZSBCVVNfTk9USUZZX0RFTF9ERVZJQ0U6CisJCWlmIChkZXYtPnR5cGUgPT0gJnVzYl9kZXZpY2VfdHlwZSkKKwkJCXVzYl9yZW1vdmVfc3lzZnNfZGV2X2ZpbGVzKHRvX3VzYl9kZXZpY2UoZGV2KSk7CisJCWVsc2UgaWYgKGRldi0+dHlwZSA9PSAmdXNiX2lmX2RldmljZV90eXBlKQorCQkJdXNiX3JlbW92ZV9zeXNmc19pbnRmX2ZpbGVzKHRvX3VzYl9pbnRlcmZhY2UoZGV2KSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayB1c2JfYnVzX25iID0geworCS5ub3RpZmllcl9jYWxsID0gdXNiX2J1c19ub3RpZnksCit9OworCisvKgogICogSW5pdAogICovCiBzdGF0aWMgaW50IF9faW5pdCB1c2JfaW5pdCh2b2lkKQpAQCAtOTkxLDYgKzEwMTgsOSBAQAogCXJldHZhbCA9IGJ1c19yZWdpc3RlcigmdXNiX2J1c190eXBlKTsKIAlpZiAocmV0dmFsKQogCQlnb3RvIGJ1c19yZWdpc3Rlcl9mYWlsZWQ7CisJcmV0dmFsID0gYnVzX3JlZ2lzdGVyX25vdGlmaWVyKCZ1c2JfYnVzX3R5cGUsICZ1c2JfYnVzX25iKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGJ1c19ub3RpZmllcl9mYWlsZWQ7CiAJcmV0dmFsID0gdXNiX2hvc3RfaW5pdCgpOwogCWlmIChyZXR2YWwpCiAJCWdvdG8gaG9zdF9pbml0X2ZhaWxlZDsKQEAgLTEwMjUsNiArMTA1NSw4IEBACiBtYWpvcl9pbml0X2ZhaWxlZDoKIAl1c2JfaG9zdF9jbGVhbnVwKCk7CiBob3N0X2luaXRfZmFpbGVkOgorCWJ1c191bnJlZ2lzdGVyX25vdGlmaWVyKCZ1c2JfYnVzX3R5cGUsICZ1c2JfYnVzX25iKTsKK2J1c19ub3RpZmllcl9mYWlsZWQ6CiAJYnVzX3VucmVnaXN0ZXIoJnVzYl9idXNfdHlwZSk7CiBidXNfcmVnaXN0ZXJfZmFpbGVkOgogCWtzdXNwZW5kX3VzYl9jbGVhbnVwKCk7CkBAIC0xMDQ4LDYgKzEwODAsNyBAQAogCXVzYl9kZXZpb19jbGVhbnVwKCk7CiAJdXNiX2h1Yl9jbGVhbnVwKCk7CiAJdXNiX2hvc3RfY2xlYW51cCgpOworCWJ1c191bnJlZ2lzdGVyX25vdGlmaWVyKCZ1c2JfYnVzX3R5cGUsICZ1c2JfYnVzX25iKTsKIAlidXNfdW5yZWdpc3RlcigmdXNiX2J1c190eXBlKTsKIAlrc3VzcGVuZF91c2JfY2xlYW51cCgpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS91c2IuaCBiL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmgKaW5kZXggOWExYTQ1YS4uMzg2MTc3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS91c2IuaAorKysgYi9kcml2ZXJzL3VzYi9jb3JlL3VzYi5oCkBAIC0xLDE2ICsxLDIwIEBACisjaW5jbHVkZSA8bGludXgvcG0uaD4KKwogLyogRnVuY3Rpb25zIGxvY2FsIHRvIGRyaXZlcnMvdXNiL2NvcmUvICovCiAKIGV4dGVybiBpbnQgdXNiX2NyZWF0ZV9zeXNmc19kZXZfZmlsZXMoc3RydWN0IHVzYl9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCB1c2JfcmVtb3ZlX3N5c2ZzX2Rldl9maWxlcyhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2KTsKIGV4dGVybiBpbnQgdXNiX2NyZWF0ZV9zeXNmc19pbnRmX2ZpbGVzKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKIGV4dGVybiB2b2lkIHVzYl9yZW1vdmVfc3lzZnNfaW50Zl9maWxlcyhzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7Ci1leHRlcm4gaW50IHVzYl9jcmVhdGVfZXBfZmlsZXMoc3RydWN0IGRldmljZSAqcGFyZW50LAorZXh0ZXJuIGludCB1c2JfY3JlYXRlX2VwX2RldnMoc3RydWN0IGRldmljZSAqcGFyZW50LAogCQkJCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZW5kcG9pbnQsCiAJCQkJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpOwotZXh0ZXJuIHZvaWQgdXNiX3JlbW92ZV9lcF9maWxlcyhzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVuZHBvaW50KTsKK2V4dGVybiB2b2lkIHVzYl9yZW1vdmVfZXBfZGV2cyhzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVuZHBvaW50KTsKIAogZXh0ZXJuIHZvaWQgdXNiX2VuYWJsZV9lbmRwb2ludChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LAotCQlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwKTsKKwkJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcCwgYm9vbCByZXNldF90b2dnbGUpOworZXh0ZXJuIHZvaWQgdXNiX2VuYWJsZV9pbnRlcmZhY2Uoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwKKwkJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGJvb2wgcmVzZXRfdG9nZ2xlcyk7CiBleHRlcm4gdm9pZCB1c2JfZGlzYWJsZV9lbmRwb2ludChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgZXBhZGRyKTsKIGV4dGVybiB2b2lkIHVzYl9kaXNhYmxlX2ludGVyZmFjZShzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LAogCQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CkBAIC00MiwxNCArNDYsMTYgQEAKICNpZmRlZglDT05GSUdfUE0KIAogZXh0ZXJuIGludCB1c2Jfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBtc2cpOwotZXh0ZXJuIGludCB1c2JfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldik7CitleHRlcm4gaW50IHVzYl9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3QgbXNnKTsKIAogZXh0ZXJuIHZvaWQgdXNiX2F1dG9zdXNwZW5kX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLWV4dGVybiBpbnQgdXNiX3BvcnRfc3VzcGVuZChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2KTsKLWV4dGVybiBpbnQgdXNiX3BvcnRfcmVzdW1lKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgdXNiX2F1dG9yZXN1bWVfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworZXh0ZXJuIGludCB1c2JfcG9ydF9zdXNwZW5kKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBtc2cpOworZXh0ZXJuIGludCB1c2JfcG9ydF9yZXN1bWUoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IG1zZyk7CiBleHRlcm4gaW50IHVzYl9leHRlcm5hbF9zdXNwZW5kX2RldmljZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwKIAkJcG1fbWVzc2FnZV90IG1zZyk7Ci1leHRlcm4gaW50IHVzYl9leHRlcm5hbF9yZXN1bWVfZGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KTsKK2V4dGVybiBpbnQgdXNiX2V4dGVybmFsX3Jlc3VtZV9kZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsCisJCXBtX21lc3NhZ2VfdCBtc2cpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgdXNiX3BtX2xvY2soc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCiB7CkBAIC02MywxMiArNjksMTIgQEAKIAogI2Vsc2UKIAotc3RhdGljIGlubGluZSBpbnQgdXNiX3BvcnRfc3VzcGVuZChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKK3N0YXRpYyBpbmxpbmUgaW50IHVzYl9wb3J0X3N1c3BlbmQoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHBtX21lc3NhZ2VfdCBtc2cpCiB7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHVzYl9wb3J0X3Jlc3VtZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKK3N0YXRpYyBpbmxpbmUgaW50IHVzYl9wb3J0X3Jlc3VtZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgcG1fbWVzc2FnZV90IG1zZykKIHsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9LY29uZmlnIGIvZHJpdmVycy91c2IvZ2FkZ2V0L0tjb25maWcKaW5kZXggZGQ0Y2Q1YS4uMzIxOWQxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L0tjb25maWcKQEAgLTI5NywxMyArMjk3LDM0IEBACiAKICMgbXVzYiBidWlsZHMgaW4gLi4vbXVzYiBhbG9uZyB3aXRoIGhvc3Qgc3VwcG9ydAogY29uZmlnIFVTQl9HQURHRVRfTVVTQl9IRFJDCi0JYm9vbGVhbiAiSW52ZW50cmEgSERSQyBVU0IgUGVyaXBoZXJhbCAoVEksIC4uLikiCisJYm9vbGVhbiAiSW52ZW50cmEgSERSQyBVU0IgUGVyaXBoZXJhbCAoVEksIEFESSwgLi4uKSIKIAlkZXBlbmRzIG9uIFVTQl9NVVNCX0hEUkMgJiYgKFVTQl9NVVNCX1BFUklQSEVSQUwgfHwgVVNCX01VU0JfT1RHKQogCXNlbGVjdCBVU0JfR0FER0VUX0RVQUxTUEVFRAogCXNlbGVjdCBVU0JfR0FER0VUX1NFTEVDVEVECiAJaGVscAogCSAgVGhpcyBPVEctY2FwYWJsZSBzaWxpY29uIElQIGlzIHVzZWQgaW4gZHVhbCBkZXNpZ25zIGluY2x1ZGluZwotCSAgdGhlIFRJIERhVmluY2ksIE9NQVAgMjQzeCwgT01BUCAzNDN4LCBhbmQgVFVTQiA2MDEwLgorCSAgdGhlIFRJIERhVmluY2ksIE9NQVAgMjQzeCwgT01BUCAzNDN4LCBUVVNCIDYwMTAsIGFuZCBBREkgQmxhY2tmaW4KKworY29uZmlnIFVTQl9HQURHRVRfSU1YCisJYm9vbGVhbiAiRnJlZXNjYWxlIElNWCBVU0IgUGVyaXBoZXJhbCBDb250cm9sbGVyIgorCWRlcGVuZHMgb24gQVJDSF9NWDEKKwloZWxwCisJICAgRnJlZXNjYWxlJ3MgSU1YIHNlcmllcyBpbmNsdWRlIGFuIGludGVncmF0ZWQgZnVsbCBzcGVlZAorCSAgIFVTQiAxLjEgZGV2aWNlIGNvbnRyb2xsZXIuICBUaGUgY29udHJvbGxlciBpbiB0aGUgSU1YIHNlcmllcworCSAgIGlzIHJlZ2lzdGVyLWNvbXBhdGlibGUuCisKKwkgICBJdCBoYXMgU2l4IGZpeGVkLWZ1bmN0aW9uIGVuZHBvaW50cywgYXMgd2VsbCBhcyBlbmRwb2ludAorCSAgIHplcm8gKGZvciBjb250cm9sIHRyYW5zZmVycykuCisKKwkgICBTYXkgInkiIHRvIGxpbmsgdGhlIGRyaXZlciBzdGF0aWNhbGx5LCBvciAibSIgdG8gYnVpbGQgYQorCSAgIGR5bmFtaWNhbGx5IGxpbmtlZCBtb2R1bGUgY2FsbGVkICJpbXhfdWRjIiBhbmQgZm9yY2UgYWxsCisJICAgZ2FkZ2V0IGRyaXZlcnMgdG8gYWxzbyBiZSBkeW5hbWljYWxseSBsaW5rZWQuCisKK2NvbmZpZyBVU0JfSU1YCisJdHJpc3RhdGUKKwlkZXBlbmRzIG9uIFVTQl9HQURHRVRfSU1YCisJZGVmYXVsdCBVU0JfR0FER0VUCisJc2VsZWN0IFVTQl9HQURHRVRfU0VMRUNURUQKIAogY29uZmlnIFVTQl9HQURHRVRfTTY2NTkyCiAJYm9vbGVhbiAiUmVuZXNhcyBNNjY1OTIgVVNCIFBlcmlwaGVyYWwgQ29udHJvbGxlciIKQEAgLTM3Nyw2ICszOTgsMjQgQEAKIAlkZWZhdWx0IFVTQl9HQURHRVQKIAlzZWxlY3QgVVNCX0dBREdFVF9TRUxFQ1RFRAogCitjb25maWcgVVNCX0dBREdFVF9DSTEzWFhYCisJYm9vbGVhbiAiTUlQUyBVU0IgQ0kxM3h4eCIKKwlkZXBlbmRzIG9uIFBDSQorCXNlbGVjdCBVU0JfR0FER0VUX0RVQUxTUEVFRAorCWhlbHAKKwkgIE1JUFMgVVNCIElQIGNvcmUgZmFtaWx5IGRldmljZSBjb250cm9sbGVyCisJICBDdXJyZW50bHkgaXQgb25seSBzdXBwb3J0cyBJUCBwYXJ0IG51bWJlciBDSTEzNDEyCisKKwkgIFNheSAieSIgdG8gbGluayB0aGUgZHJpdmVyIHN0YXRpY2FsbHksIG9yICJtIiB0byBidWlsZCBhCisJICBkeW5hbWljYWxseSBsaW5rZWQgbW9kdWxlIGNhbGxlZCAiY2kxM3h4eF91ZGMiIGFuZCBmb3JjZSBhbGwKKwkgIGdhZGdldCBkcml2ZXJzIHRvIGFsc28gYmUgZHluYW1pY2FsbHkgbGlua2VkLgorCitjb25maWcgVVNCX0NJMTNYWFgKKwl0cmlzdGF0ZQorCWRlcGVuZHMgb24gVVNCX0dBREdFVF9DSTEzWFhYCisJZGVmYXVsdCBVU0JfR0FER0VUCisJc2VsZWN0IFVTQl9HQURHRVRfU0VMRUNURUQKKwogY29uZmlnIFVTQl9HQURHRVRfTkVUMjI4MAogCWJvb2xlYW4gIk5ldENoaXAgMjI4eCIKIAlkZXBlbmRzIG9uIFBDSQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L01ha2VmaWxlIGIvZHJpdmVycy91c2IvZ2FkZ2V0L01ha2VmaWxlCmluZGV4IGJkNDA0MWIuLjM5YTUxZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvTWFrZWZpbGUKQEAgLTEwLDYgKzEwLDcgQEAKIG9iai0kKENPTkZJR19VU0JfQU1ENTUzNlVEQykJKz0gYW1kNTUzNnVkYy5vCiBvYmotJChDT05GSUdfVVNCX1BYQTI1WCkJKz0gcHhhMjV4X3VkYy5vCiBvYmotJChDT05GSUdfVVNCX1BYQTI3WCkJKz0gcHhhMjd4X3VkYy5vCitvYmotJChDT05GSUdfVVNCX0lNWCkJCSs9IGlteF91ZGMubwogb2JqLSQoQ09ORklHX1VTQl9HT0tVKQkJKz0gZ29rdV91ZGMubwogb2JqLSQoQ09ORklHX1VTQl9PTUFQKQkJKz0gb21hcF91ZGMubwogb2JqLSQoQ09ORklHX1VTQl9MSDdBNDBYKQkrPSBsaDdhNDB4X3VkYy5vCkBAIC0xOSw2ICsyMCw3IEBACiBvYmotJChDT05GSUdfVVNCX0ZTTF9VU0IyKQkrPSBmc2xfdXNiMl91ZGMubwogb2JqLSQoQ09ORklHX1VTQl9NNjY1OTIpCSs9IG02NjU5Mi11ZGMubwogb2JqLSQoQ09ORklHX1VTQl9GU0xfUUUpCSs9IGZzbF9xZV91ZGMubworb2JqLSQoQ09ORklHX1VTQl9DSTEzWFhYKQkrPSBjaTEzeHh4X3VkYy5vCiAKICMKICMgVVNCIGdhZGdldCBkcml2ZXJzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvYXQ5MV91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9hdDkxX3VkYy5jCmluZGV4IGE4YTFkZTQuLjBiMmJiOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9hdDkxX3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9hdDkxX3VkYy5jCkBAIC0xNDc0LDcgKzE0NzQsNyBAQAogCQkuZXAwCT0gJmNvbnRyb2xsZXIuZXBbMF0uZXAsCiAJCS5uYW1lCT0gZHJpdmVyX25hbWUsCiAJCS5kZXYJPSB7Ci0JCQkuYnVzX2lkID0gImdhZGdldCIsCisJCQkuaW5pdF9uYW1lID0gImdhZGdldCIsCiAJCQkucmVsZWFzZSA9IG5vcF9yZWxlYXNlLAogCQl9CiAJfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9hdG1lbF91c2JhX3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2F0bWVsX3VzYmFfdWRjLmMKaW5kZXggYWUzMGFiMS4uNjViMDNlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2F0bWVsX3VzYmFfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2F0bWVsX3VzYmFfdWRjLmMKQEAgLTEwMzQsNyArMTAzNCw3IEBACiAJCS5pc19kdWFsc3BlZWQJPSAxLAogCQkubmFtZQkJPSAiYXRtZWxfdXNiYV91ZGMiLAogCQkuZGV2CT0gewotCQkJLmJ1c19pZAkJPSAiZ2FkZ2V0IiwKKwkJCS5pbml0X25hbWUJPSAiZ2FkZ2V0IiwKIAkJCS5yZWxlYXNlCT0gbm9wX3JlbGVhc2UsCiAJCX0sCiAJfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9jaTEzeHh4X3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2NpMTN4eHhfdWRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmViZjkxMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9jaTEzeHh4X3VkYy5jCkBAIC0wLDAgKzEsMjgzMCBAQAorLyoKKyAqIGNpMTN4eHhfdWRjLmMgLSBNSVBTIFVTQiBJUCBjb3JlIGZhbWlseSBkZXZpY2UgY29udHJvbGxlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBDaGlwaWRlYSAtIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQXV0aG9yOiBEYXZpZCBMb3BvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisvKgorICogRGVzY3JpcHRpb246IE1JUFMgVVNCIElQIGNvcmUgZmFtaWx5IGRldmljZSBjb250cm9sbGVyCisgKiAgICAgICAgICAgICAgQ3VycmVudGx5IGl0IG9ubHkgc3VwcG9ydHMgSVAgcGFydCBudW1iZXIgQ0kxMzQxMgorICoKKyAqIFRoaXMgZHJpdmVyIGlzIGNvbXBvc2VkIG9mIHNldmVyYWwgYmxvY2tzOgorICogLSBIVzogICAgIGhhcmR3YXJlIGludGVyZmFjZQorICogLSBEQkc6ICAgIGRlYnVnIGZhY2lsaXRpZXMgKG9wdGlvbmFsKQorICogLSBVVElMOiAgIHV0aWxpdGllcworICogLSBJU1I6ICAgIGludGVycnVwdHMgaGFuZGxpbmcKKyAqIC0gRU5EUFQ6ICBlbmRwb2ludCBvcGVyYXRpb25zIChHYWRnZXQgQVBJKQorICogLSBHQURHRVQ6IGdhZGdldCBvcGVyYXRpb25zIChHYWRnZXQgQVBJKQorICogLSBCVVM6ICAgIGJ1cyBnbHVlIGNvZGUsIGJ1cyBhYnN0cmFjdGlvbiBsYXllcgorICogLSBQQ0k6ICAgIFBDSSBjb3JlIGludGVyZmFjZSBhbmQgUENJIHJlc291cmNlcyAoaW50ZXJydXB0cywgbWVtb3J5Li4uKQorICoKKyAqIENvbXBpbGUgT3B0aW9ucworICogLSBDT05GSUdfVVNCX0dBREdFVF9ERUJVR19GSUxFUzogZW5hYmxlIGRlYnVnIGZhY2lsaXRpZXMKKyAqIC0gU1RBTExfSU46ICBub24tZW1wdHkgYnVsay1pbiBwaXBlcyBjYW5ub3QgYmUgaGFsdGVkCisgKiAgICAgICAgICAgICAgaWYgZGVmaW5lZCBtYXNzIHN0b3JhZ2UgY29tcGxpYW5jZSBzdWNjZWVkcyBidXQgd2l0aCB3YXJuaW5ncworICogICAgICAgICAgICAgID0+IGNhc2UgNDogSGkgPiAgRG4KKyAqICAgICAgICAgICAgICA9PiBjYXNlIDU6IEhpID4gIERpCisgKiAgICAgICAgICAgICAgPT4gY2FzZSA4OiBIaSA8PiBEbworICogICAgICAgICAgICAgIGlmIHVuZGVmaW5lZCB1c2J0ZXN0IDEzIGZhaWxzCisgKiAtIFRSQUNFOiAgICAgZW5hYmxlIGZ1bmN0aW9uIHRyYWNpbmcgKGRlcGVuZHMgb24gREVCVUcpCisgKgorICogTWFpbiBGZWF0dXJlcworICogLSBDaGFwdGVyIDkgJiBNYXNzIFN0b3JhZ2UgQ29tcGxpYW5jZSB3aXRoIEdhZGdldCBGaWxlIFN0b3JhZ2UKKyAqIC0gQ2hhcHRlciA5IENvbXBsaWFuY2Ugd2l0aCBHYWRnZXQgWmVybyAoU1RBTExfSU4gdW5kZWZpbmVkKQorICogLSBOb3JtYWwgJiBMUE0gc3VwcG9ydAorICoKKyAqIFVTQlRFU1QgUmVwb3J0CisgKiAtIE9LOiAwLTEyLCAxMyAoU1RBTExfSU4gZGVmaW5lZCkgJiAxNAorICogLSBOb3QgU3VwcG9ydGVkOiAxNSAmIDE2IChJU08pCisgKgorICogVE9ETyBMaXN0CisgKiAtIE9URworICogLSBJc29jaHJvbm91cyAmIEludGVycnVwdCBUcmFmZmljCisgKiAtIEhhbmRsZSByZXF1ZXN0cyB3aGljaCBzcGF3bnMgaW50byBzZXZlcmFsIFREcworICogLSBHRVRfU1RBVFVTKGRldmljZSkgLSBhbHdheXMgcmVwb3J0cyAwCisgKiAtIEdhZGdldCBBUEkgKG1ham9yaXR5IG9mIG9wdGlvbmFsIGZlYXR1cmVzKQorICogLSBTdXNwZW5kICYgUmVtb3RlIFdha2V1cAorICovCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hcG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL2NoOS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9nYWRnZXQuaD4KKworI2luY2x1ZGUgImNpMTN4eHhfdWRjLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogREVGSU5FCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBjdHJsIHJlZ2lzdGVyIGJhbmsgYWNjZXNzICovCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHVkY19sb2NrKTsKKworLyogZHJpdmVyIG5hbWUgKi8KKyNkZWZpbmUgVURDX0RSSVZFUl9OQU1FICAgImNpMTN4eHhfdWRjIgorCisvKiBjb250cm9sIGVuZHBvaW50IGRlc2NyaXB0aW9uICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCitjdHJsX2VuZHB0X2Rlc2MgPSB7CisJLmJMZW5ndGggICAgICAgICA9IFVTQl9EVF9FTkRQT0lOVF9TSVpFLAorCS5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfRU5EUE9JTlQsCisKKwkuYm1BdHRyaWJ1dGVzICAgID0gVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTCwKKwkud01heFBhY2tldFNpemUgID0gY3B1X3RvX2xlMTYoQ1RSTF9QQVlMT0FEX01BWCksCit9OworCisvKiBVREMgZGVzY3JpcHRvciAqLworc3RhdGljIHN0cnVjdCBjaTEzeHh4ICpfdWRjOworCisvKiBJbnRlcnJ1cHQgc3RhdGlzdGljcyAqLworI2RlZmluZSBJU1JfTUFTSyAgIDB4MUYKK3N0YXRpYyBzdHJ1Y3QgeworCXUzMiB0ZXN0OworCXUzMiB1aTsKKwl1MzIgdWVpOworCXUzMiBwY2k7CisJdTMyIHVyaTsKKwl1MzIgc2xpOworCXUzMiBub25lOworCXN0cnVjdCB7CisJCXUzMiBjbnQ7CisJCXUzMiBidWZbSVNSX01BU0srMV07CisJCXUzMiBpZHg7CisJfSBobmRsOworfSBpc3Jfc3RhdGlzdGljczsKKworLyoqCisgKiBmZnNfbnI6IGZpbmQgZmlyc3QgKGxlYXN0IHNpZ25pZmljYW50KSBiaXQgc2V0CisgKiBAeDogdGhlIHdvcmQgdG8gc2VhcmNoCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGJpdCBudW1iZXIgKGluc3RlYWQgb2YgcG9zaXRpb24pCisgKi8KK3N0YXRpYyBpbnQgZmZzX25yKHUzMiB4KQoreworCWludCBuID0gZmZzKHgpOworCisJcmV0dXJuIG4gPyBuLTEgOiAzMjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSFcgYmxvY2sKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHJlZ2lzdGVyIGJhbmsgZGVzY3JpcHRvciAqLworc3RhdGljIHN0cnVjdCB7CisJdW5zaWduZWQgICAgICBscG07ICAgIC8qIGlzIExQTT8gKi8KKwl2b2lkIF9faW9tZW0gKmFiczsgICAgLyogYnVzIG1hcCBvZmZzZXQgKi8KKwl2b2lkIF9faW9tZW0gKmNhcDsgICAgLyogYnVzIG1hcCBvZmZzZXQgKyBDQVAgb2Zmc2V0ICsgQ0FQIGRhdGEgKi8KKwlzaXplX3QgICAgICAgIHNpemU7ICAgLyogYmFuayBzaXplICovCit9IGh3X2Jhbms7CisKKy8qIFVEQyByZWdpc3RlciBtYXAgKi8KKyNkZWZpbmUgQUJTX0NBUExFTkdUSCAgICAgICAoMHgxMDBVTCkKKyNkZWZpbmUgQUJTX0hDQ1BBUkFNUyAgICAgICAoMHgxMDhVTCkKKyNkZWZpbmUgQUJTX0RDQ1BBUkFNUyAgICAgICAoMHgxMjRVTCkKKyNkZWZpbmUgQUJTX1RFU1RNT0RFICAgICAgICAoaHdfYmFuay5scG0gPyAweDBGQ1VMIDogMHgxMzhVTCkKKy8qIG9mZnNldCB0byBDQVBMRU5UR0ggKGFkZHIgKyBkYXRhKSAqLworI2RlZmluZSBDQVBfVVNCQ01EICAgICAgICAgICgweDAwMFVMKQorI2RlZmluZSBDQVBfVVNCU1RTICAgICAgICAgICgweDAwNFVMKQorI2RlZmluZSBDQVBfVVNCSU5UUiAgICAgICAgICgweDAwOFVMKQorI2RlZmluZSBDQVBfREVWSUNFQUREUiAgICAgICgweDAxNFVMKQorI2RlZmluZSBDQVBfRU5EUFRMSVNUQUREUiAgICgweDAxOFVMKQorI2RlZmluZSBDQVBfUE9SVFNDICAgICAgICAgICgweDA0NFVMKQorI2RlZmluZSBDQVBfREVWTEMgICAgICAgICAgICgweDBCNFVMKQorI2RlZmluZSBDQVBfVVNCTU9ERSAgICAgICAgIChod19iYW5rLmxwbSA/IDB4MEM4VUwgOiAweDA2OFVMKQorI2RlZmluZSBDQVBfRU5EUFRTRVRVUFNUQVQgIChod19iYW5rLmxwbSA/IDB4MEQ4VUwgOiAweDA2Q1VMKQorI2RlZmluZSBDQVBfRU5EUFRQUklNRSAgICAgIChod19iYW5rLmxwbSA/IDB4MERDVUwgOiAweDA3MFVMKQorI2RlZmluZSBDQVBfRU5EUFRGTFVTSCAgICAgIChod19iYW5rLmxwbSA/IDB4MEUwVUwgOiAweDA3NFVMKQorI2RlZmluZSBDQVBfRU5EUFRTVEFUICAgICAgIChod19iYW5rLmxwbSA/IDB4MEU0VUwgOiAweDA3OFVMKQorI2RlZmluZSBDQVBfRU5EUFRDT01QTEVURSAgIChod19iYW5rLmxwbSA/IDB4MEU4VUwgOiAweDA3Q1VMKQorI2RlZmluZSBDQVBfRU5EUFRDVFJMICAgICAgIChod19iYW5rLmxwbSA/IDB4MEVDVUwgOiAweDA4MFVMKQorI2RlZmluZSBDQVBfTEFTVCAgICAgICAgICAgIChod19iYW5rLmxwbSA/IDB4MTJDVUwgOiAweDBDMFVMKQorCisvKiBtYXhpbXVtIG51bWJlciBvZiBlbnBvaW50czogdmFsaWQgb25seSBhZnRlciBod19kZXZpY2VfcmVzZXQoKSAqLworc3RhdGljIHVuc2lnbmVkIGh3X2VwX21heDsKKworLyoqCisgKiBod19lcF9iaXQ6IGNhbGN1bGF0ZXMgdGhlIGJpdCBudW1iZXIKKyAqIEBudW06IGVuZHBvaW50IG51bWJlcgorICogQGRpcjogZW5kcG9pbnQgZGlyZWN0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGJpdCBudW1iZXIKKyAqLworc3RhdGljIGlubGluZSBpbnQgaHdfZXBfYml0KGludCBudW0sIGludCBkaXIpCit7CisJcmV0dXJuIG51bSArIChkaXIgPyAxNiA6IDApOworfQorCisvKioKKyAqIGh3X2FyZWFkOiByZWFkcyBmcm9tIHJlZ2lzdGVyIGJpdGZpZWxkCisgKiBAYWRkcjogYWRkcmVzcyByZWxhdGl2ZSB0byBidXMgbWFwCisgKiBAbWFzazogYml0ZmllbGQgbWFzaworICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyByZWdpc3RlciBiaXRmaWVsZCBkYXRhCisgKi8KK3N0YXRpYyB1MzIgaHdfYXJlYWQodTMyIGFkZHIsIHUzMiBtYXNrKQoreworCXJldHVybiBpb3JlYWQzMihhZGRyICsgaHdfYmFuay5hYnMpICYgbWFzazsKK30KKworLyoqCisgKiBod19hd3JpdGU6IHdyaXRlcyB0byByZWdpc3RlciBiaXRmaWVsZAorICogQGFkZHI6IGFkZHJlc3MgcmVsYXRpdmUgdG8gYnVzIG1hcAorICogQG1hc2s6IGJpdGZpZWxkIG1hc2sKKyAqIEBkYXRhOiBuZXcgZGF0YQorICovCitzdGF0aWMgdm9pZCBod19hd3JpdGUodTMyIGFkZHIsIHUzMiBtYXNrLCB1MzIgZGF0YSkKK3sKKwlpb3dyaXRlMzIoaHdfYXJlYWQoYWRkciwgfm1hc2spIHwgKGRhdGEgJiBtYXNrKSwKKwkJICBhZGRyICsgaHdfYmFuay5hYnMpOworfQorCisvKioKKyAqIGh3X2NyZWFkOiByZWFkcyBmcm9tIHJlZ2lzdGVyIGJpdGZpZWxkCisgKiBAYWRkcjogYWRkcmVzcyByZWxhdGl2ZSB0byBDQVAgb2Zmc2V0IHBsdXMgY29udGVudAorICogQG1hc2s6IGJpdGZpZWxkIG1hc2sKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgcmVnaXN0ZXIgYml0ZmllbGQgZGF0YQorICovCitzdGF0aWMgdTMyIGh3X2NyZWFkKHUzMiBhZGRyLCB1MzIgbWFzaykKK3sKKwlyZXR1cm4gaW9yZWFkMzIoYWRkciArIGh3X2JhbmsuY2FwKSAmIG1hc2s7Cit9CisKKy8qKgorICogaHdfY3dyaXRlOiB3cml0ZXMgdG8gcmVnaXN0ZXIgYml0ZmllbGQKKyAqIEBhZGRyOiBhZGRyZXNzIHJlbGF0aXZlIHRvIENBUCBvZmZzZXQgcGx1cyBjb250ZW50CisgKiBAbWFzazogYml0ZmllbGQgbWFzaworICogQGRhdGE6IG5ldyBkYXRhCisgKi8KK3N0YXRpYyB2b2lkIGh3X2N3cml0ZSh1MzIgYWRkciwgdTMyIG1hc2ssIHUzMiBkYXRhKQoreworCWlvd3JpdGUzMihod19jcmVhZChhZGRyLCB+bWFzaykgfCAoZGF0YSAmIG1hc2spLAorCQkgIGFkZHIgKyBod19iYW5rLmNhcCk7Cit9CisKKy8qKgorICogaHdfY3Rlc3RfYW5kX2NsZWFyOiB0ZXN0cyAmIGNsZWFycyByZWdpc3RlciBiaXRmaWVsZAorICogQGFkZHI6IGFkZHJlc3MgcmVsYXRpdmUgdG8gQ0FQIG9mZnNldCBwbHVzIGNvbnRlbnQKKyAqIEBtYXNrOiBiaXRmaWVsZCBtYXNrCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHJlZ2lzdGVyIGJpdGZpZWxkIGRhdGEKKyAqLworc3RhdGljIHUzMiBod19jdGVzdF9hbmRfY2xlYXIodTMyIGFkZHIsIHUzMiBtYXNrKQoreworCXUzMiByZWcgPSBod19jcmVhZChhZGRyLCBtYXNrKTsKKworCWlvd3JpdGUzMihyZWcsIGFkZHIgKyBod19iYW5rLmNhcCk7CisJcmV0dXJuIHJlZzsKK30KKworLyoqCisgKiBod19jdGVzdF9hbmRfd3JpdGU6IHRlc3RzICYgd3JpdGVzIHJlZ2lzdGVyIGJpdGZpZWxkCisgKiBAYWRkcjogYWRkcmVzcyByZWxhdGl2ZSB0byBDQVAgb2Zmc2V0IHBsdXMgY29udGVudAorICogQG1hc2s6IGJpdGZpZWxkIG1hc2sKKyAqIEBkYXRhOiBuZXcgZGF0YQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyByZWdpc3RlciBiaXRmaWVsZCBkYXRhCisgKi8KK3N0YXRpYyB1MzIgaHdfY3Rlc3RfYW5kX3dyaXRlKHUzMiBhZGRyLCB1MzIgbWFzaywgdTMyIGRhdGEpCit7CisJdTMyIHJlZyA9IGh3X2NyZWFkKGFkZHIsIH4wKTsKKworCWlvd3JpdGUzMigocmVnICYgfm1hc2spIHwgKGRhdGEgJiBtYXNrKSwgYWRkciArIGh3X2JhbmsuY2FwKTsKKwlyZXR1cm4gKHJlZyAmIG1hc2spID4+IGZmc19ucihtYXNrKTsKK30KKworLyoqCisgKiBod19kZXZpY2VfcmVzZXQ6IHJlc2V0cyBjaGlwIChleGVjdXRlIHdpdGhvdXQgaW50ZXJydXB0aW9uKQorICogQGJhc2U6IHJlZ2lzdGVyIGJhc2UgYWRkcmVzcworICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaHdfZGV2aWNlX3Jlc2V0KHZvaWQgX19pb21lbSAqYmFzZSkKK3sKKwl1MzIgcmVnOworCisJLyogYmFuayBpcyBhIG1vZHVsZSB2YXJpYWJsZSAqLworCWh3X2JhbmsuYWJzID0gYmFzZTsKKworCWh3X2JhbmsuY2FwID0gaHdfYmFuay5hYnM7CisJaHdfYmFuay5jYXAgKz0gQUJTX0NBUExFTkdUSDsKKwlod19iYW5rLmNhcCArPSBpb3JlYWQ4KGh3X2JhbmsuY2FwKTsKKworCXJlZyA9IGh3X2FyZWFkKEFCU19IQ0NQQVJBTVMsIEhDQ1BBUkFNU19MRU4pID4+IGZmc19ucihIQ0NQQVJBTVNfTEVOKTsKKwlod19iYW5rLmxwbSAgPSByZWc7CisJaHdfYmFuay5zaXplID0gaHdfYmFuay5jYXAgLSBod19iYW5rLmFiczsKKwlod19iYW5rLnNpemUgKz0gQ0FQX0xBU1Q7CisJaHdfYmFuay5zaXplIC89IHNpemVvZih1MzIpOworCisJLyogc2hvdWxkIGZsdXNoICYgc3RvcCBiZWZvcmUgcmVzZXQgKi8KKwlod19jd3JpdGUoQ0FQX0VORFBURkxVU0gsIH4wLCB+MCk7CisJaHdfY3dyaXRlKENBUF9VU0JDTUQsIFVTQkNNRF9SUywgMCk7CisKKwlod19jd3JpdGUoQ0FQX1VTQkNNRCwgVVNCQ01EX1JTVCwgVVNCQ01EX1JTVCk7CisJd2hpbGUgKGh3X2NyZWFkKENBUF9VU0JDTUQsIFVTQkNNRF9SU1QpKQorCQl1ZGVsYXkoMTApOyAgICAgICAgICAgICAvKiBub3QgUlRPUyBmcmllbmRseSAqLworCisJLyogVVNCTU9ERSBzaG91bGQgYmUgY29uZmlndXJlZCBzdGVwIGJ5IHN0ZXAgKi8KKwlod19jd3JpdGUoQ0FQX1VTQk1PREUsIFVTQk1PREVfQ00sIFVTQk1PREVfQ01fSURMRSk7CisJaHdfY3dyaXRlKENBUF9VU0JNT0RFLCBVU0JNT0RFX0NNLCBVU0JNT0RFX0NNX0RFVklDRSk7CisJaHdfY3dyaXRlKENBUF9VU0JNT0RFLCBVU0JNT0RFX1NMT00sIFVTQk1PREVfU0xPTSk7ICAvKiBIVyA+PSAyLjMgKi8KKworCWlmIChod19jcmVhZChDQVBfVVNCTU9ERSwgVVNCTU9ERV9DTSkgIT0gVVNCTU9ERV9DTV9ERVZJQ0UpIHsKKwkJcHJfZXJyKCJjYW5ub3QgZW50ZXIgaW4gZGV2aWNlIG1vZGUiKTsKKwkJcHJfZXJyKCJscG0gPSAlaSIsIGh3X2JhbmsubHBtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmVnID0gaHdfYXJlYWQoQUJTX0RDQ1BBUkFNUywgRENDUEFSQU1TX0RFTikgPj4gZmZzX25yKERDQ1BBUkFNU19ERU4pOworCWlmIChyZWcgPT0gMCB8fCByZWcgPiBFTkRQVF9NQVgpCisJCXJldHVybiAtRU5PREVWOworCisJaHdfZXBfbWF4ID0gcmVnOyAgIC8qIGNhY2hlIGh3IEVORFBUX01BWCAqLworCisJLyogc2V0dXAgbG9jayBtb2RlID8gKi8KKworCS8qIEVORFBUU0VUVVBTVEFUIGlzICcwJyBieSBkZWZhdWx0ICovCisKKwkvKiBIQ1NQQVJBTVMuYmYucHBjIFNIT1VMRCBCRSB6ZXJvIGZvciBkZXZpY2UgKi8KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGh3X2RldmljZV9zdGF0ZTogZW5hYmxlcy9kaXNhYmxlcyBpbnRlcnJ1cHRzICYgc3RhcnRzL3N0b3BzIGRldmljZSAoZXhlY3V0ZQorICogICAgICAgICAgICAgICAgICB3aXRob3V0IGludGVycnVwdGlvbikKKyAqIEBkbWE6IDAgPT4gZGlzYWJsZSwgITAgPT4gZW5hYmxlIGFuZCBzZXQgZG1hIGVuZ2luZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaHdfZGV2aWNlX3N0YXRlKHUzMiBkbWEpCit7CisJaWYgKGRtYSkgeworCQlod19jd3JpdGUoQ0FQX0VORFBUTElTVEFERFIsIH4wLCBkbWEpOworCQkvKiBpbnRlcnJ1cHQsIGVycm9yLCBwb3J0IGNoYW5nZSwgcmVzZXQsIHNsZWVwL3N1c3BlbmQgKi8KKwkJaHdfY3dyaXRlKENBUF9VU0JJTlRSLCB+MCwKKwkJCSAgICAgVVNCaV9VSXxVU0JpX1VFSXxVU0JpX1BDSXxVU0JpX1VSSXxVU0JpX1NMSSk7CisJCWh3X2N3cml0ZShDQVBfVVNCQ01ELCBVU0JDTURfUlMsIFVTQkNNRF9SUyk7CisJfSBlbHNlIHsKKwkJaHdfY3dyaXRlKENBUF9VU0JDTUQsIFVTQkNNRF9SUywgMCk7CisJCWh3X2N3cml0ZShDQVBfVVNCSU5UUiwgfjAsIDApOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBod19lcF9mbHVzaDogZmx1c2ggZW5kcG9pbnQgZmlmbyAoZXhlY3V0ZSB3aXRob3V0IGludGVycnVwdGlvbikKKyAqIEBudW06IGVuZHBvaW50IG51bWJlcgorICogQGRpcjogZW5kcG9pbnQgZGlyZWN0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBod19lcF9mbHVzaChpbnQgbnVtLCBpbnQgZGlyKQoreworCWludCBuID0gaHdfZXBfYml0KG51bSwgZGlyKTsKKworCWRvIHsKKwkJLyogZmx1c2ggYW55IHBlbmRpbmcgdHJhbnNmZXIgKi8KKwkJaHdfY3dyaXRlKENBUF9FTkRQVEZMVVNILCBCSVQobiksIEJJVChuKSk7CisJCXdoaWxlIChod19jcmVhZChDQVBfRU5EUFRGTFVTSCwgQklUKG4pKSkKKwkJCWNwdV9yZWxheCgpOworCX0gd2hpbGUgKGh3X2NyZWFkKENBUF9FTkRQVFNUQVQsIEJJVChuKSkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaHdfZXBfZGlzYWJsZTogZGlzYWJsZXMgZW5kcG9pbnQgKGV4ZWN1dGUgd2l0aG91dCBpbnRlcnJ1cHRpb24pCisgKiBAbnVtOiBlbmRwb2ludCBudW1iZXIKKyAqIEBkaXI6IGVuZHBvaW50IGRpcmVjdGlvbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaHdfZXBfZGlzYWJsZShpbnQgbnVtLCBpbnQgZGlyKQoreworCWh3X2VwX2ZsdXNoKG51bSwgZGlyKTsKKwlod19jd3JpdGUoQ0FQX0VORFBUQ1RSTCArIG51bSAqIHNpemVvZih1MzIpLAorCQkgIGRpciA/IEVORFBUQ1RSTF9UWEUgOiBFTkRQVENUUkxfUlhFLCAwKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBod19lcF9lbmFibGU6IGVuYWJsZXMgZW5kcG9pbnQgKGV4ZWN1dGUgd2l0aG91dCBpbnRlcnJ1cHRpb24pCisgKiBAbnVtOiAgZW5kcG9pbnQgbnVtYmVyCisgKiBAZGlyOiAgZW5kcG9pbnQgZGlyZWN0aW9uCisgKiBAdHlwZTogZW5kcG9pbnQgdHlwZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaHdfZXBfZW5hYmxlKGludCBudW0sIGludCBkaXIsIGludCB0eXBlKQoreworCXUzMiBtYXNrLCBkYXRhOworCisJaWYgKGRpcikgeworCQltYXNrICA9IEVORFBUQ1RSTF9UWFQ7ICAvKiB0eXBlICAgICovCisJCWRhdGEgID0gdHlwZSA8PCBmZnNfbnIobWFzayk7CisKKwkJbWFzayB8PSBFTkRQVENUUkxfVFhTOyAgLyogdW5zdGFsbCAqLworCQltYXNrIHw9IEVORFBUQ1RSTF9UWFI7ICAvKiByZXNldCBkYXRhIHRvZ2dsZSAqLworCQlkYXRhIHw9IEVORFBUQ1RSTF9UWFI7CisJCW1hc2sgfD0gRU5EUFRDVFJMX1RYRTsgIC8qIGVuYWJsZSAgKi8KKwkJZGF0YSB8PSBFTkRQVENUUkxfVFhFOworCX0gZWxzZSB7CisJCW1hc2sgID0gRU5EUFRDVFJMX1JYVDsgIC8qIHR5cGUgICAgKi8KKwkJZGF0YSAgPSB0eXBlIDw8IGZmc19ucihtYXNrKTsKKworCQltYXNrIHw9IEVORFBUQ1RSTF9SWFM7ICAvKiB1bnN0YWxsICovCisJCW1hc2sgfD0gRU5EUFRDVFJMX1JYUjsgIC8qIHJlc2V0IGRhdGEgdG9nZ2xlICovCisJCWRhdGEgfD0gRU5EUFRDVFJMX1JYUjsKKwkJbWFzayB8PSBFTkRQVENUUkxfUlhFOyAgLyogZW5hYmxlICAqLworCQlkYXRhIHw9IEVORFBUQ1RSTF9SWEU7CisJfQorCWh3X2N3cml0ZShDQVBfRU5EUFRDVFJMICsgbnVtICogc2l6ZW9mKHUzMiksIG1hc2ssIGRhdGEpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGh3X2VwX2dldF9oYWx0OiByZXR1cm4gZW5kcG9pbnQgaGFsdCBzdGF0dXMKKyAqIEBudW06IGVuZHBvaW50IG51bWJlcgorICogQGRpcjogZW5kcG9pbnQgZGlyZWN0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIDEgaWYgZW5kcG9pbnQgaGFsdGVkCisgKi8KK3N0YXRpYyBpbnQgaHdfZXBfZ2V0X2hhbHQoaW50IG51bSwgaW50IGRpcikKK3sKKwl1MzIgbWFzayA9IGRpciA/IEVORFBUQ1RSTF9UWFMgOiBFTkRQVENUUkxfUlhTOworCisJcmV0dXJuIGh3X2NyZWFkKENBUF9FTkRQVENUUkwgKyBudW0gKiBzaXplb2YodTMyKSwgbWFzaykgPyAxIDogMDsKK30KKworLyoqCisgKiBod19lcF9pc19wcmltZWQ6IHRlc3QgaWYgZW5kcG9pbnQgaXMgcHJpbWVkIChleGVjdXRlIHdpdGhvdXQgaW50ZXJydXB0aW9uKQorICogQG51bTogICBlbmRwb2ludCBudW1iZXIKKyAqIEBkaXI6ICAgZW5kcG9pbnQgZGlyZWN0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgZW5kcG9pbnQgcHJpbWVkCisgKi8KK3N0YXRpYyBpbnQgaHdfZXBfaXNfcHJpbWVkKGludCBudW0sIGludCBkaXIpCit7CisJdTMyIHJlZyA9IGh3X2NyZWFkKENBUF9FTkRQVFBSSU1FLCB+MCkgfCBod19jcmVhZChDQVBfRU5EUFRTVEFULCB+MCk7CisKKwlyZXR1cm4gdGVzdF9iaXQoaHdfZXBfYml0KG51bSwgZGlyKSwgKHZvaWQgKikmcmVnKTsKK30KKworLyoqCisgKiBod190ZXN0X2FuZF9jbGVhcl9zZXR1cF9zdGF0dXM6IHRlc3QgJiBjbGVhciBzZXR1cCBzdGF0dXMgKGV4ZWN1dGUgd2l0aG91dAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRpb24pCisgKiBAbjogYml0IG51bWJlciAoZW5kcG9pbnQpCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHNldHVwIHN0YXR1cworICovCitzdGF0aWMgaW50IGh3X3Rlc3RfYW5kX2NsZWFyX3NldHVwX3N0YXR1cyhpbnQgbikKK3sKKwlyZXR1cm4gaHdfY3Rlc3RfYW5kX2NsZWFyKENBUF9FTkRQVFNFVFVQU1RBVCwgQklUKG4pKTsKK30KKworLyoqCisgKiBod19lcF9wcmltZTogcHJpbWVzIGVuZHBvaW50IChleGVjdXRlIHdpdGhvdXQgaW50ZXJydXB0aW9uKQorICogQG51bTogICAgIGVuZHBvaW50IG51bWJlcgorICogQGRpcjogICAgIGVuZHBvaW50IGRpcmVjdGlvbgorICogQGlzX2N0cmw6IHRydWUgaWYgY29udHJvbCBlbmRwb2ludAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaHdfZXBfcHJpbWUoaW50IG51bSwgaW50IGRpciwgaW50IGlzX2N0cmwpCit7CisJaW50IG4gPSBod19lcF9iaXQobnVtLCBkaXIpOworCisJLyogdGhlIGNhbGxlciBzaG91bGQgZmx1c2ggZmlyc3QgKi8KKwlpZiAoaHdfZXBfaXNfcHJpbWVkKG51bSwgZGlyKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChpc19jdHJsICYmIGRpciA9PSBSWCAmJiBod19jcmVhZChDQVBfRU5EUFRTRVRVUFNUQVQsIEJJVChudW0pKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlod19jd3JpdGUoQ0FQX0VORFBUUFJJTUUsIEJJVChuKSwgQklUKG4pKTsKKworCXdoaWxlIChod19jcmVhZChDQVBfRU5EUFRQUklNRSwgQklUKG4pKSkKKwkJY3B1X3JlbGF4KCk7CisJaWYgKGlzX2N0cmwgJiYgZGlyID09IFJYICAmJiBod19jcmVhZChDQVBfRU5EUFRTRVRVUFNUQVQsIEJJVChudW0pKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwkvKiBzdGF0dXMgc2hvdWx0IGJlIHRlc3RlZCBhY2NvcmRpbmcgd2l0aCBtYW51YWwgYnV0IGl0IGRvZXNuJ3Qgd29yayAqLworCXJldHVybiAwOworfQorCisvKioKKyAqIGh3X2VwX3NldF9oYWx0OiBjb25maWd1cmVzIGVwIGhhbHQgJiByZXNldHMgZGF0YSB0b2dnbGUgYWZ0ZXIgY2xlYXIgKGV4ZWN1dGUKKyAqICAgICAgICAgICAgICAgICB3aXRob3V0IGludGVycnVwdGlvbikKKyAqIEBudW06ICAgZW5kcG9pbnQgbnVtYmVyCisgKiBAZGlyOiAgIGVuZHBvaW50IGRpcmVjdGlvbgorICogQHZhbHVlOiB0cnVlID0+IHN0YWxsLCBmYWxzZSA9PiB1bnN0YWxsCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBod19lcF9zZXRfaGFsdChpbnQgbnVtLCBpbnQgZGlyLCBpbnQgdmFsdWUpCit7CisJaWYgKHZhbHVlICE9IDAgJiYgdmFsdWUgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkbyB7CisJCXUzMiBhZGRyID0gQ0FQX0VORFBUQ1RSTCArIG51bSAqIHNpemVvZih1MzIpOworCQl1MzIgbWFza194cyA9IGRpciA/IEVORFBUQ1RSTF9UWFMgOiBFTkRQVENUUkxfUlhTOworCQl1MzIgbWFza194ciA9IGRpciA/IEVORFBUQ1RSTF9UWFIgOiBFTkRQVENUUkxfUlhSOworCisJCS8qIGRhdGEgdG9nZ2xlIC0gcmVzZXJ2ZWQgZm9yIEVQMCBidXQgaXQncyBpbiBFU1MgKi8KKwkJaHdfY3dyaXRlKGFkZHIsIG1hc2tfeHN8bWFza194ciwgdmFsdWUgPyBtYXNrX3hzIDogbWFza194cik7CisKKwl9IHdoaWxlICh2YWx1ZSAhPSBod19lcF9nZXRfaGFsdChudW0sIGRpcikpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaHdfaW50cl9jbGVhcjogZGlzYWJsZXMgaW50ZXJydXB0ICYgY2xlYXJzIGludGVycnVwdCBzdGF0dXMgKGV4ZWN1dGUgd2l0aG91dAorICogICAgICAgICAgICAgICAgaW50ZXJydXB0aW9uKQorICogQG46IGludGVycnVwdCBiaXQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGh3X2ludHJfY2xlYXIoaW50IG4pCit7CisJaWYgKG4gPj0gUkVHX0JJVFMpCisJCXJldHVybiAtRUlOVkFMOworCisJaHdfY3dyaXRlKENBUF9VU0JJTlRSLCBCSVQobiksIDApOworCWh3X2N3cml0ZShDQVBfVVNCU1RTLCAgQklUKG4pLCBCSVQobikpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGh3X2ludHJfZm9yY2U6IGVuYWJsZXMgaW50ZXJydXB0ICYgZm9yY2VzIGludGVycnVwdCBzdGF0dXMgKGV4ZWN1dGUgd2l0aG91dAorICogICAgICAgICAgICAgICAgaW50ZXJydXB0aW9uKQorICogQG46IGludGVycnVwdCBiaXQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGh3X2ludHJfZm9yY2UoaW50IG4pCit7CisJaWYgKG4gPj0gUkVHX0JJVFMpCisJCXJldHVybiAtRUlOVkFMOworCisJaHdfYXdyaXRlKEFCU19URVNUTU9ERSwgVEVTVE1PREVfRk9SQ0UsIFRFU1RNT0RFX0ZPUkNFKTsKKwlod19jd3JpdGUoQ0FQX1VTQklOVFIsICBCSVQobiksIEJJVChuKSk7CisJaHdfY3dyaXRlKENBUF9VU0JTVFMsICAgQklUKG4pLCBCSVQobikpOworCWh3X2F3cml0ZShBQlNfVEVTVE1PREUsIFRFU1RNT0RFX0ZPUkNFLCAwKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBod19pc19wb3J0X2hpZ2hfc3BlZWQ6IHRlc3QgaWYgcG9ydCBpcyBoaWdoIHNwZWVkCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgaGlnaCBzcGVlZCBwb3J0CisgKi8KK3N0YXRpYyBpbnQgaHdfcG9ydF9pc19oaWdoX3NwZWVkKHZvaWQpCit7CisJcmV0dXJuIGh3X2JhbmsubHBtID8gaHdfY3JlYWQoQ0FQX0RFVkxDLCBERVZMQ19QU1BEKSA6CisJCWh3X2NyZWFkKENBUF9QT1JUU0MsIFBPUlRTQ19IU1ApOworfQorCisvKioKKyAqIGh3X3BvcnRfdGVzdF9nZXQ6IHJlYWRzIHBvcnQgdGVzdCBtb2RlIHZhbHVlCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHBvcnQgdGVzdCBtb2RlIHZhbHVlCisgKi8KK3N0YXRpYyB1OCBod19wb3J0X3Rlc3RfZ2V0KHZvaWQpCit7CisJcmV0dXJuIGh3X2NyZWFkKENBUF9QT1JUU0MsIFBPUlRTQ19QVEMpID4+IGZmc19ucihQT1JUU0NfUFRDKTsKK30KKworLyoqCisgKiBod19wb3J0X3Rlc3Rfc2V0OiB3cml0ZXMgcG9ydCB0ZXN0IG1vZGUgKGV4ZWN1dGUgd2l0aG91dCBpbnRlcnJ1cHRpb24pCisgKiBAbW9kZTogbmV3IHZhbHVlCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBod19wb3J0X3Rlc3Rfc2V0KHU4IG1vZGUpCit7CisJY29uc3QgdTggVEVTVF9NT0RFX01BWCA9IDc7CisKKwlpZiAobW9kZSA+IFRFU1RfTU9ERV9NQVgpCisJCXJldHVybiAtRUlOVkFMOworCisJaHdfY3dyaXRlKENBUF9QT1JUU0MsIFBPUlRTQ19QVEMsIG1vZGUgPDwgZmZzX25yKFBPUlRTQ19QVEMpKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBod19yZWFkX2ludHJfZW5hYmxlOiByZXR1cm5zIGludGVycnVwdCBlbmFibGUgcmVnaXN0ZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgcmVnaXN0ZXIgZGF0YQorICovCitzdGF0aWMgdTMyIGh3X3JlYWRfaW50cl9lbmFibGUodm9pZCkKK3sKKwlyZXR1cm4gaHdfY3JlYWQoQ0FQX1VTQklOVFIsIH4wKTsKK30KKworLyoqCisgKiBod19yZWFkX2ludHJfc3RhdHVzOiByZXR1cm5zIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgcmVnaXN0ZXIgZGF0YQorICovCitzdGF0aWMgdTMyIGh3X3JlYWRfaW50cl9zdGF0dXModm9pZCkKK3sKKwlyZXR1cm4gaHdfY3JlYWQoQ0FQX1VTQlNUUywgfjApOworfQorCisvKioKKyAqIGh3X3JlZ2lzdGVyX3JlYWQ6IHJlYWRzIGFsbCBkZXZpY2UgcmVnaXN0ZXJzIChleGVjdXRlIHdpdGhvdXQgaW50ZXJydXB0aW9uKQorICogQGJ1ZjogIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICogQHNpemU6IGJ1ZmZlciBzaXplCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIG51bWJlciBvZiByZWdpc3RlcnMgcmVhZAorICovCitzdGF0aWMgc2l6ZV90IGh3X3JlZ2lzdGVyX3JlYWQodTMyICpidWYsIHNpemVfdCBzaXplKQoreworCXVuc2lnbmVkIGk7CisKKwlpZiAoc2l6ZSA+IGh3X2Jhbmsuc2l6ZSkKKwkJc2l6ZSA9IGh3X2Jhbmsuc2l6ZTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCWJ1ZltpXSA9IGh3X2FyZWFkKGkgKiBzaXplb2YodTMyKSwgfjApOworCisJcmV0dXJuIHNpemU7Cit9CisKKy8qKgorICogaHdfcmVnaXN0ZXJfd3JpdGU6IHdyaXRlcyB0byByZWdpc3RlcgorICogQGFkZHI6IHJlZ2lzdGVyIGFkZHJlc3MKKyAqIEBkYXRhOiByZWdpc3RlciB2YWx1ZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaHdfcmVnaXN0ZXJfd3JpdGUodTE2IGFkZHIsIHUzMiBkYXRhKQoreworCS8qIGFsaWduICovCisJYWRkciAvPSBzaXplb2YodTMyKTsKKworCWlmIChhZGRyID49IGh3X2Jhbmsuc2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBhbGlnbiAqLworCWFkZHIgKj0gc2l6ZW9mKHUzMik7CisKKwlod19hd3JpdGUoYWRkciwgfjAsIGRhdGEpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGh3X3Rlc3RfYW5kX2NsZWFyX2NvbXBsZXRlOiB0ZXN0ICYgY2xlYXIgY29tcGxldGUgc3RhdHVzIChleGVjdXRlIHdpdGhvdXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRpb24pCisgKiBAbjogYml0IG51bWJlciAoZW5kcG9pbnQpCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGNvbXBsZXRlIHN0YXR1cworICovCitzdGF0aWMgaW50IGh3X3Rlc3RfYW5kX2NsZWFyX2NvbXBsZXRlKGludCBuKQoreworCXJldHVybiBod19jdGVzdF9hbmRfY2xlYXIoQ0FQX0VORFBUQ09NUExFVEUsIEJJVChuKSk7Cit9CisKKy8qKgorICogaHdfdGVzdF9hbmRfY2xlYXJfaW50cl9hY3RpdmU6IHRlc3QgJiBjbGVhciBhY3RpdmUgaW50ZXJydXB0cyAoZXhlY3V0ZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgaW50ZXJydXB0aW9uKQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhY3RpdmUgaW50ZXJydXRwcworICovCitzdGF0aWMgdTMyIGh3X3Rlc3RfYW5kX2NsZWFyX2ludHJfYWN0aXZlKHZvaWQpCit7CisJdTMyIHJlZyA9IGh3X3JlYWRfaW50cl9zdGF0dXMoKSAmIGh3X3JlYWRfaW50cl9lbmFibGUoKTsKKworCWh3X2N3cml0ZShDQVBfVVNCU1RTLCB+MCwgcmVnKTsKKwlyZXR1cm4gcmVnOworfQorCisvKioKKyAqIGh3X3Rlc3RfYW5kX2NsZWFyX3NldHVwX2d1YXJkOiB0ZXN0ICYgY2xlYXIgc2V0dXAgZ3VhcmQgKGV4ZWN1dGUgd2l0aG91dAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdGlvbikKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgZ3VhcmQgdmFsdWUKKyAqLworc3RhdGljIGludCBod190ZXN0X2FuZF9jbGVhcl9zZXR1cF9ndWFyZCh2b2lkKQoreworCXJldHVybiBod19jdGVzdF9hbmRfd3JpdGUoQ0FQX1VTQkNNRCwgVVNCQ01EX1NVVFcsIDApOworfQorCisvKioKKyAqIGh3X3Rlc3RfYW5kX3NldF9zZXR1cF9ndWFyZDogdGVzdCAmIHNldCBzZXR1cCBndWFyZCAoZXhlY3V0ZSB3aXRob3V0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdGlvbikKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgZ3VhcmQgdmFsdWUKKyAqLworc3RhdGljIGludCBod190ZXN0X2FuZF9zZXRfc2V0dXBfZ3VhcmQodm9pZCkKK3sKKwlyZXR1cm4gaHdfY3Rlc3RfYW5kX3dyaXRlKENBUF9VU0JDTUQsIFVTQkNNRF9TVVRXLCBVU0JDTURfU1VUVyk7Cit9CisKKy8qKgorICogaHdfdXNiX3NldF9hZGRyZXNzOiBjb25maWd1cmVzIFVTQiBhZGRyZXNzIChleGVjdXRlIHdpdGhvdXQgaW50ZXJydXB0aW9uKQorICogQHZhbHVlOiBuZXcgVVNCIGFkZHJlc3MKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGh3X3VzYl9zZXRfYWRkcmVzcyh1OCB2YWx1ZSkKK3sKKwkvKiBhZHZhbmNlICovCisJaHdfY3dyaXRlKENBUF9ERVZJQ0VBRERSLCBERVZJQ0VBRERSX1VTQkFEUiB8IERFVklDRUFERFJfVVNCQURSQSwKKwkJICB2YWx1ZSA8PCBmZnNfbnIoREVWSUNFQUREUl9VU0JBRFIpIHwgREVWSUNFQUREUl9VU0JBRFJBKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBod191c2JfcmVzZXQ6IHJlc3RhcnQgZGV2aWNlIGFmdGVyIGEgYnVzIHJlc2V0IChleGVjdXRlIHdpdGhvdXQKKyAqICAgICAgICAgICAgICAgaW50ZXJydXB0aW9uKQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaHdfdXNiX3Jlc2V0KHZvaWQpCit7CisJaHdfdXNiX3NldF9hZGRyZXNzKDApOworCisJLyogRVNTIGZsdXNoZXMgb25seSBhdCBlbmQ/IT8gKi8KKwlod19jd3JpdGUoQ0FQX0VORFBURkxVU0gsICAgIH4wLCB+MCk7ICAgLyogZmx1c2ggYWxsIEVQcyAqLworCisJLyogY2xlYXIgc2V0dXAgdG9rZW4gc2VtYXBob3JlcyAqLworCWh3X2N3cml0ZShDQVBfRU5EUFRTRVRVUFNUQVQsIDAsICAwKTsgICAvKiB3cml0ZXMgaXRzIGNvbnRlbnQgKi8KKworCS8qIGNsZWFyIGNvbXBsZXRlIHN0YXR1cyAqLworCWh3X2N3cml0ZShDQVBfRU5EUFRDT01QTEVURSwgIDAsICAwKTsgICAvKiB3cml0ZXMgaXRzIGNvbnRlbnQgKi8KKworCS8qIHdhaXQgdW50aWwgYWxsIGJpdHMgY2xlYXJlZCAqLworCXdoaWxlIChod19jcmVhZChDQVBfRU5EUFRQUklNRSwgfjApKQorCQl1ZGVsYXkoMTApOyAgICAgICAgICAgICAvKiBub3QgUlRPUyBmcmllbmRseSAqLworCisJLyogcmVzZXQgYWxsIGVuZHBvaW50cyA/ICovCisKKwkvKiByZXNldCBpbnRlcm5hbCBzdGF0dXMgYW5kIHdhaXQgZm9yIGZ1cnRoZXIgaW5zdHJ1Y3Rpb25zCisJICAgbm8gbmVlZCB0byB2ZXJpZnkgdGhlIHBvcnQgcmVzZXQgc3RhdHVzIChFU1MgZG9lcyBpdCkgKi8KKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEQkcgYmxvY2sKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogc2hvd19kZXZpY2U6IHByaW50cyBpbmZvcm1hdGlvbiBhYm91dCBkZXZpY2UgY2FwYWJpbGl0aWVzIGFuZCBzdGF0dXMKKyAqCisgKiBDaGVjayAiZGV2aWNlLmgiIGZvciBkZXRhaWxzCisgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICBjaGFyICpidWYpCit7CisJc3RydWN0IGNpMTN4eHggKnVkYyA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBjaTEzeHh4LCBnYWRnZXQuZGV2KTsKKwlzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0ID0gJnVkYy0+Z2FkZ2V0OworCWludCBuID0gMDsKKworCWRiZ190cmFjZSgiWyVzXSAlcFxuIiwgX19mdW5jX18sIGJ1Zik7CisJaWYgKGF0dHIgPT0gTlVMTCB8fCBidWYgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgIlslc10gRUlOVkFMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKworCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICJzcGVlZCAgICAgICAgICAgICA9ICVkXG4iLAorCQkgICAgICAgZ2FkZ2V0LT5zcGVlZCk7CisJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgImlzX2R1YWxzcGVlZCAgICAgID0gJWRcbiIsCisJCSAgICAgICBnYWRnZXQtPmlzX2R1YWxzcGVlZCk7CisJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgImlzX290ZyAgICAgICAgICAgID0gJWRcbiIsCisJCSAgICAgICBnYWRnZXQtPmlzX290Zyk7CisJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgImlzX2FfcGVyaXBoZXJhbCAgID0gJWRcbiIsCisJCSAgICAgICBnYWRnZXQtPmlzX2FfcGVyaXBoZXJhbCk7CisJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgImJfaG5wX2VuYWJsZSAgICAgID0gJWRcbiIsCisJCSAgICAgICBnYWRnZXQtPmJfaG5wX2VuYWJsZSk7CisJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgImFfaG5wX3N1cHBvcnQgICAgID0gJWRcbiIsCisJCSAgICAgICBnYWRnZXQtPmFfaG5wX3N1cHBvcnQpOworCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICJhX2FsdF9obnBfc3VwcG9ydCA9ICVkXG4iLAorCQkgICAgICAgZ2FkZ2V0LT5hX2FsdF9obnBfc3VwcG9ydCk7CisJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgIm5hbWUgICAgICAgICAgICAgID0gJXNcbiIsCisJCSAgICAgICAoZ2FkZ2V0LT5uYW1lID8gZ2FkZ2V0LT5uYW1lIDogIiIpKTsKKworCXJldHVybiBuOworfQorc3RhdGljIERFVklDRV9BVFRSKGRldmljZSwgU19JUlVTUiwgc2hvd19kZXZpY2UsIE5VTEwpOworCisvKioKKyAqIHNob3dfZHJpdmVyOiBwcmludHMgaW5mb3JtYXRpb24gYWJvdXQgYXR0YWNoZWQgZ2FkZ2V0IChpZiBhbnkpCisgKgorICogQ2hlY2sgImRldmljZS5oIiBmb3IgZGV0YWlscworICovCitzdGF0aWMgc3NpemVfdCBzaG93X2RyaXZlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBjaTEzeHh4ICp1ZGMgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgY2kxM3h4eCwgZ2FkZ2V0LmRldik7CisJc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIgPSB1ZGMtPmRyaXZlcjsKKwlpbnQgbiA9IDA7CisKKwlkYmdfdHJhY2UoIlslc10gJXBcbiIsIF9fZnVuY19fLCBidWYpOworCWlmIChhdHRyID09IE5VTEwgfHwgYnVmID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJbJXNdIEVJTlZBTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZHJpdmVyID09IE5VTEwpCisJCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsCisJCQkJICJUaGVyZSBpcyBubyBnYWRnZXQgYXR0YWNoZWQhXG4iKTsKKworCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICJmdW5jdGlvbiAgPSAlc1xuIiwKKwkJICAgICAgIChkcml2ZXItPmZ1bmN0aW9uID8gZHJpdmVyLT5mdW5jdGlvbiA6ICIiKSk7CisJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgIm1heCBzcGVlZCA9ICVkXG4iLAorCQkgICAgICAgZHJpdmVyLT5zcGVlZCk7CisKKwlyZXR1cm4gbjsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihkcml2ZXIsIFNfSVJVU1IsIHNob3dfZHJpdmVyLCBOVUxMKTsKKworLyogTWF4aW11bSBldmVudCBtZXNzYWdlIGxlbmd0aCAqLworI2RlZmluZSBEQkdfREFUQV9NU0cgICA2NFVMCisKKy8qIE1heGltdW0gZXZlbnQgbWVzc2FnZXMgKi8KKyNkZWZpbmUgREJHX0RBVEFfTUFYICAgMTI4VUwKKworLyogRXZlbnQgYnVmZmVyIGRlc2NyaXB0b3IgKi8KK3N0YXRpYyBzdHJ1Y3QgeworCWNoYXIgICAgIChidWZbREJHX0RBVEFfTUFYXSlbREJHX0RBVEFfTVNHXTsgICAvKiBidWZmZXIgKi8KKwl1bnNpZ25lZCBpZHg7ICAgLyogaW5kZXggKi8KKwl1bnNpZ25lZCB0dHk7ICAgLyogcHJpbnQgdG8gY29uc29sZT8gKi8KKwlyd2xvY2tfdCBsY2s7ICAgLyogbG9jayAqLworfSBkYmdfZGF0YSA9IHsKKwkuaWR4ID0gMCwKKwkudHR5ID0gMCwKKwkubGNrID0gX19SV19MT0NLX1VOTE9DS0VEKGxjaykKK307CisKKy8qKgorICogZGJnX2RlYzogZGVjcmVtZW50cyBkZWJ1ZyBldmVudCBpbmRleAorICogQGlkeDogYnVmZmVyIGluZGV4CisgKi8KK3N0YXRpYyB2b2lkIGRiZ19kZWModW5zaWduZWQgKmlkeCkKK3sKKwkqaWR4ID0gKCppZHggLSAxKSAmIChEQkdfREFUQV9NQVgtMSk7Cit9CisKKy8qKgorICogZGJnX2luYzogaW5jcmVtZW50cyBkZWJ1ZyBldmVudCBpbmRleAorICogQGlkeDogYnVmZmVyIGluZGV4CisgKi8KK3N0YXRpYyB2b2lkIGRiZ19pbmModW5zaWduZWQgKmlkeCkKK3sKKwkqaWR4ID0gKCppZHggKyAxKSAmIChEQkdfREFUQV9NQVgtMSk7Cit9CisKKy8qKgorICogZGJnX3ByaW50OiAgcHJpbnRzIHRoZSBjb21tb24gcGFydCBvZiB0aGUgZXZlbnQKKyAqIEBhZGRyOiAgIGVuZHBvaW50IGFkZHJlc3MKKyAqIEBuYW1lOiAgIGV2ZW50IG5hbWUKKyAqIEBzdGF0dXM6IHN0YXR1cworICogQGV4dHJhOiAgZXh0cmEgaW5mb3JtYXRpb24KKyAqLworc3RhdGljIHZvaWQgZGJnX3ByaW50KHU4IGFkZHIsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBzdGF0dXMsIGNvbnN0IGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCB0aW1ldmFsIHR2YWw7CisJdW5zaWduZWQgaW50IHN0YW1wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl3cml0ZV9sb2NrX2lycXNhdmUoJmRiZ19kYXRhLmxjaywgZmxhZ3MpOworCisJZG9fZ2V0dGltZW9mZGF5KCZ0dmFsKTsKKwlzdGFtcCA9IHR2YWwudHZfc2VjICYgMHhGRkZGOwkvKiAyXjMyID0gNDI5NDk2NzI5Ni4gTGltaXQgdG8gNDA5NnMgKi8KKwlzdGFtcCA9IHN0YW1wICogMTAwMDAwMCArIHR2YWwudHZfdXNlYzsKKworCXNjbnByaW50ZihkYmdfZGF0YS5idWZbZGJnX2RhdGEuaWR4XSwgREJHX0RBVEFfTVNHLAorCQkgICIlMDRYXHS7ICUwMlggJS03LjdzICU0aSCrXHQlc1xuIiwKKwkJICBzdGFtcCwgYWRkciwgbmFtZSwgc3RhdHVzLCBleHRyYSk7CisKKwlkYmdfaW5jKCZkYmdfZGF0YS5pZHgpOworCisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmRiZ19kYXRhLmxjaywgZmxhZ3MpOworCisJaWYgKGRiZ19kYXRhLnR0eSAhPSAwKQorCQlwcl9ub3RpY2UoIiUwNFhcdLsgJTAyWCAlLTcuN3MgJTRpIKtcdCVzXG4iLAorCQkJICBzdGFtcCwgYWRkciwgbmFtZSwgc3RhdHVzLCBleHRyYSk7Cit9CisKKy8qKgorICogZGJnX2RvbmU6IHByaW50cyBhIERPTkUgZXZlbnQKKyAqIEBhZGRyOiAgIGVuZHBvaW50IGFkZHJlc3MKKyAqIEB0ZDogICAgIHRyYW5zZmVyIGRlc2NyaXB0b3IKKyAqIEBzdGF0dXM6IHN0YXR1cworICovCitzdGF0aWMgdm9pZCBkYmdfZG9uZSh1OCBhZGRyLCBjb25zdCB1MzIgdG9rZW4sIGludCBzdGF0dXMpCit7CisJY2hhciBtc2dbREJHX0RBVEFfTVNHXTsKKworCXNjbnByaW50Zihtc2csIHNpemVvZihtc2cpLCAiJWQgJTAyWCIsCisJCSAgKGludCkodG9rZW4gJiBURF9UT1RBTF9CWVRFUykgPj4gZmZzX25yKFREX1RPVEFMX0JZVEVTKSwKKwkJICAoaW50KSh0b2tlbiAmIFREX1NUQVRVUykgICAgICA+PiBmZnNfbnIoVERfU1RBVFVTKSk7CisJZGJnX3ByaW50KGFkZHIsICJET05FIiwgc3RhdHVzLCBtc2cpOworfQorCisvKioKKyAqIGRiZ19ldmVudDogcHJpbnRzIGEgZ2VuZXJpYyBldmVudAorICogQGFkZHI6ICAgZW5kcG9pbnQgYWRkcmVzcworICogQG5hbWU6ICAgZXZlbnQgbmFtZQorICogQHN0YXR1czogc3RhdHVzCisgKi8KK3N0YXRpYyB2b2lkIGRiZ19ldmVudCh1OCBhZGRyLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgc3RhdHVzKQoreworCWlmIChuYW1lICE9IE5VTEwpCisJCWRiZ19wcmludChhZGRyLCBuYW1lLCBzdGF0dXMsICIiKTsKK30KKworLyoKKyAqIGRiZ19xdWV1ZTogcHJpbnRzIGEgUVVFVUUgZXZlbnQKKyAqIEBhZGRyOiAgIGVuZHBvaW50IGFkZHJlc3MKKyAqIEByZXE6ICAgIFVTQiByZXF1ZXN0CisgKiBAc3RhdHVzOiBzdGF0dXMKKyAqLworc3RhdGljIHZvaWQgZGJnX3F1ZXVlKHU4IGFkZHIsIGNvbnN0IHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxLCBpbnQgc3RhdHVzKQoreworCWNoYXIgbXNnW0RCR19EQVRBX01TR107CisKKwlpZiAocmVxICE9IE5VTEwpIHsKKwkJc2NucHJpbnRmKG1zZywgc2l6ZW9mKG1zZyksCisJCQkgICIlZCAlZCIsICFyZXEtPm5vX2ludGVycnVwdCwgcmVxLT5sZW5ndGgpOworCQlkYmdfcHJpbnQoYWRkciwgIlFVRVVFIiwgc3RhdHVzLCBtc2cpOworCX0KK30KKworLyoqCisgKiBkYmdfc2V0dXA6IHByaW50cyBhIFNFVFVQIGV2ZW50CisgKiBAYWRkcjogZW5kcG9pbnQgYWRkcmVzcworICogQHJlcTogIHNldHVwIHJlcXVlc3QKKyAqLworc3RhdGljIHZvaWQgZGJnX3NldHVwKHU4IGFkZHIsIGNvbnN0IHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKnJlcSkKK3sKKwljaGFyIG1zZ1tEQkdfREFUQV9NU0ddOworCisJaWYgKHJlcSAhPSBOVUxMKSB7CisJCXNjbnByaW50Zihtc2csIHNpemVvZihtc2cpLAorCQkJICAiJTAyWCAlMDJYICUwNFggJTA0WCAlZCIsIHJlcS0+YlJlcXVlc3RUeXBlLAorCQkJICByZXEtPmJSZXF1ZXN0LCBsZTE2X3RvX2NwdShyZXEtPndWYWx1ZSksCisJCQkgIGxlMTZfdG9fY3B1KHJlcS0+d0luZGV4KSwgbGUxNl90b19jcHUocmVxLT53TGVuZ3RoKSk7CisJCWRiZ19wcmludChhZGRyLCAiU0VUVVAiLCAwLCBtc2cpOworCX0KK30KKworLyoqCisgKiBzaG93X2V2ZW50czogZGlzcGxheXMgdGhlIGV2ZW50IGJ1ZmZlcgorICoKKyAqIENoZWNrICJkZXZpY2UuaCIgZm9yIGRldGFpbHMKKyAqLworc3RhdGljIHNzaXplX3Qgc2hvd19ldmVudHMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNoYXIgKmJ1ZikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGksIGosIG4gPSAwOworCisJZGJnX3RyYWNlKCJbJXNdICVwXG4iLCBfX2Z1bmNfXywgYnVmKTsKKwlpZiAoYXR0ciA9PSBOVUxMIHx8IGJ1ZiA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAiWyVzXSBFSU5WQUxcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmVhZF9sb2NrX2lycXNhdmUoJmRiZ19kYXRhLmxjaywgZmxhZ3MpOworCisJaSA9IGRiZ19kYXRhLmlkeDsKKwlmb3IgKGRiZ19kZWMoJmkpOyBpICE9IGRiZ19kYXRhLmlkeDsgZGJnX2RlYygmaSkpIHsKKwkJbiArPSBzdHJsZW4oZGJnX2RhdGEuYnVmW2ldKTsKKwkJaWYgKG4gPj0gUEFHRV9TSVpFKSB7CisJCQluIC09IHN0cmxlbihkYmdfZGF0YS5idWZbaV0pOworCQkJYnJlYWs7CisJCX0KKwl9CisJZm9yIChqID0gMCwgZGJnX2luYygmaSk7IGogPCBuOyBkYmdfaW5jKCZpKSkKKwkJaiArPSBzY25wcmludGYoYnVmICsgaiwgUEFHRV9TSVpFIC0gaiwKKwkJCSAgICAgICAiJXMiLCBkYmdfZGF0YS5idWZbaV0pOworCisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmZGJnX2RhdGEubGNrLCBmbGFncyk7CisKKwlyZXR1cm4gbjsKK30KKworLyoqCisgKiBzdG9yZV9ldmVudHM6IGNvbmZpZ3VyZSBpZiBldmVudHMgYXJlIGdvaW5nIHRvIGJlIGFsc28gcHJpbnRlZCB0byBjb25zb2xlCisgKgorICogQ2hlY2sgImRldmljZS5oIiBmb3IgZGV0YWlscworICovCitzdGF0aWMgc3NpemVfdCBzdG9yZV9ldmVudHMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwl1bnNpZ25lZCB0dHk7CisKKwlkYmdfdHJhY2UoIlslc10gJXAsICVkXG4iLCBfX2Z1bmNfXywgYnVmLCBjb3VudCk7CisJaWYgKGF0dHIgPT0gTlVMTCB8fCBidWYgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgIlslc10gRUlOVkFMXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoc3NjYW5mKGJ1ZiwgIiV1IiwgJnR0eSkgIT0gMSB8fCB0dHkgPiAxKSB7CisJCWRldl9lcnIoZGV2LCAiPDF8MD46IGVuYWJsZXxkaXNhYmxlIGNvbnNvbGUgbG9nXG4iKTsKKwkJZ290byBkb25lOworCX0KKworCWRiZ19kYXRhLnR0eSA9IHR0eTsKKwlkZXZfaW5mbyhkZXYsICJ0dHkgPSAldSIsIGRiZ19kYXRhLnR0eSk7CisKKyBkb25lOgorCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihldmVudHMsIFNfSVJVU1IgfCBTX0lXVVNSLCBzaG93X2V2ZW50cywgc3RvcmVfZXZlbnRzKTsKKworLyoqCisgKiBzaG93X2ludGVyczogaW50ZXJydXB0IHN0YXR1cywgZW5hYmxlIHN0YXR1cyBhbmQgaGlzdG9yaWMKKyAqCisgKiBDaGVjayAiZGV2aWNlLmgiIGZvciBkZXRhaWxzCisgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfaW50ZXJzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICBjaGFyICpidWYpCit7CisJc3RydWN0IGNpMTN4eHggKnVkYyA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBjaTEzeHh4LCBnYWRnZXQuZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBpbnRyOworCXVuc2lnbmVkIGksIGosIG4gPSAwOworCisJZGJnX3RyYWNlKCJbJXNdICVwXG4iLCBfX2Z1bmNfXywgYnVmKTsKKwlpZiAoYXR0ciA9PSBOVUxMIHx8IGJ1ZiA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAiWyVzXSBFSU5WQUxcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUodWRjLT5sb2NrLCBmbGFncyk7CisKKwluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLAorCQkgICAgICAgInN0YXR1cyA9ICUwOHhcbiIsIGh3X3JlYWRfaW50cl9zdGF0dXMoKSk7CisJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwKKwkJICAgICAgICJlbmFibGUgPSAlMDh4XG4iLCBod19yZWFkX2ludHJfZW5hYmxlKCkpOworCisJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgIip0ZXN0ID0gJWRcbiIsCisJCSAgICAgICBpc3Jfc3RhdGlzdGljcy50ZXN0KTsKKwluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAiuyB1aSAgPSAlZFxuIiwKKwkJICAgICAgIGlzcl9zdGF0aXN0aWNzLnVpKTsKKwluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAiuyB1ZWkgPSAlZFxuIiwKKwkJICAgICAgIGlzcl9zdGF0aXN0aWNzLnVlaSk7CisJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgIrsgcGNpID0gJWRcbiIsCisJCSAgICAgICBpc3Jfc3RhdGlzdGljcy5wY2kpOworCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICK7IHVyaSA9ICVkXG4iLAorCQkgICAgICAgaXNyX3N0YXRpc3RpY3MudXJpKTsKKwluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAiuyBzbGkgPSAlZFxuIiwKKwkJICAgICAgIGlzcl9zdGF0aXN0aWNzLnNsaSk7CisJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgIipub25lID0gJWRcbiIsCisJCSAgICAgICBpc3Jfc3RhdGlzdGljcy5ub25lKTsKKwluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAiKmhuZGwgPSAlZFxuIiwKKwkJICAgICAgIGlzcl9zdGF0aXN0aWNzLmhuZGwuY250KTsKKworCWZvciAoaSA9IGlzcl9zdGF0aXN0aWNzLmhuZGwuaWR4LCBqID0gMDsgaiA8PSBJU1JfTUFTSzsgaisrLCBpKyspIHsKKwkJaSAgICY9IElTUl9NQVNLOworCQlpbnRyID0gaXNyX3N0YXRpc3RpY3MuaG5kbC5idWZbaV07CisKKwkJaWYgKFVTQmlfVUkgICYgaW50cikKKwkJCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICJ1aSAgIik7CisJCWludHIgJj0gflVTQmlfVUk7CisJCWlmIChVU0JpX1VFSSAmIGludHIpCisJCQluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAidWVpICIpOworCQlpbnRyICY9IH5VU0JpX1VFSTsKKwkJaWYgKFVTQmlfUENJICYgaW50cikKKwkJCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICJwY2kgIik7CisJCWludHIgJj0gflVTQmlfUENJOworCQlpZiAoVVNCaV9VUkkgJiBpbnRyKQorCQkJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgInVyaSAiKTsKKwkJaW50ciAmPSB+VVNCaV9VUkk7CisJCWlmIChVU0JpX1NMSSAmIGludHIpCisJCQluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAic2xpICIpOworCQlpbnRyICY9IH5VU0JpX1NMSTsKKwkJaWYgKGludHIpCisJCQluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAiPz8/ICIpOworCQlpZiAoaXNyX3N0YXRpc3RpY3MuaG5kbC5idWZbaV0pCisJCQluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAiXG4iKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHVkYy0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIG47Cit9CisKKy8qKgorICogc3RvcmVfaW50ZXJzOiBlbmFibGUgJiBmb3JjZSBvciBkaXNhYmxlIGFuIGluZGl2aWR1YWwgaW50ZXJydXRwcworICogICAgICAgICAgICAgICAgICAgKHRvIGJlIHVzZWQgZm9yIHRlc3QgcHVycG9zZXMgb25seSkKKyAqCisgKiBDaGVjayAiZGV2aWNlLmgiIGZvciBkZXRhaWxzCisgKi8KK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2ludGVycyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBjaTEzeHh4ICp1ZGMgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgY2kxM3h4eCwgZ2FkZ2V0LmRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBlbiwgYml0OworCisJZGJnX3RyYWNlKCJbJXNdICVwLCAlZFxuIiwgX19mdW5jX18sIGJ1ZiwgY291bnQpOworCWlmIChhdHRyID09IE5VTEwgfHwgYnVmID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJbJXNdIEVJTlZBTFxuIiwgX19mdW5jX18pOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKHNzY2FuZihidWYsICIldSAldSIsICZlbiwgJmJpdCkgIT0gMiB8fCBlbiA+IDEpIHsKKwkJZGV2X2VycihkZXYsICI8MXwwPiA8Yml0PjogZW5hYmxlfGRpc2FibGUgaW50ZXJydXB0Iik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSh1ZGMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoZW4pIHsKKwkJaWYgKGh3X2ludHJfZm9yY2UoYml0KSkKKwkJCWRldl9lcnIoZGV2LCAiaW52YWxpZCBiaXQgbnVtYmVyXG4iKTsKKwkJZWxzZQorCQkJaXNyX3N0YXRpc3RpY3MudGVzdCsrOworCX0gZWxzZSB7CisJCWlmIChod19pbnRyX2NsZWFyKGJpdCkpCisJCQlkZXZfZXJyKGRldiwgImludmFsaWQgYml0IG51bWJlclxuIik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodWRjLT5sb2NrLCBmbGFncyk7CisKKyBkb25lOgorCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihpbnRlcnMsIFNfSVJVU1IgfCBTX0lXVVNSLCBzaG93X2ludGVycywgc3RvcmVfaW50ZXJzKTsKKworLyoqCisgKiBzaG93X3BvcnRfdGVzdDogcmVhZHMgcG9ydCB0ZXN0IG1vZGUKKyAqCisgKiBDaGVjayAiZGV2aWNlLmgiIGZvciBkZXRhaWxzCisgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfcG9ydF90ZXN0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGNpMTN4eHggKnVkYyA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBjaTEzeHh4LCBnYWRnZXQuZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIG1vZGU7CisKKwlkYmdfdHJhY2UoIlslc10gJXBcbiIsIF9fZnVuY19fLCBidWYpOworCWlmIChhdHRyID09IE5VTEwgfHwgYnVmID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJbJXNdIEVJTlZBTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSh1ZGMtPmxvY2ssIGZsYWdzKTsKKwltb2RlID0gaHdfcG9ydF90ZXN0X2dldCgpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodWRjLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAibW9kZSA9ICV1XG4iLCBtb2RlKTsKK30KKworLyoqCisgKiBzdG9yZV9wb3J0X3Rlc3Q6IHdyaXRlcyBwb3J0IHRlc3QgbW9kZQorICoKKyAqIENoZWNrICJkZXZpY2UuaCIgZm9yIGRldGFpbHMKKyAqLworc3RhdGljIHNzaXplX3Qgc3RvcmVfcG9ydF90ZXN0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgY2kxM3h4eCAqdWRjID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGNpMTN4eHgsIGdhZGdldC5kZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbW9kZTsKKworCWRiZ190cmFjZSgiWyVzXSAlcCwgJWRcbiIsIF9fZnVuY19fLCBidWYsIGNvdW50KTsKKwlpZiAoYXR0ciA9PSBOVUxMIHx8IGJ1ZiA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAiWyVzXSBFSU5WQUxcbiIsIF9fZnVuY19fKTsKKwkJZ290byBkb25lOworCX0KKworCWlmIChzc2NhbmYoYnVmLCAiJXUiLCAmbW9kZSkgIT0gMSkgeworCQlkZXZfZXJyKGRldiwgIjxtb2RlPjogc2V0IHBvcnQgdGVzdCBtb2RlIik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSh1ZGMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoaHdfcG9ydF90ZXN0X3NldChtb2RlKSkKKwkJZGV2X2VycihkZXYsICJpbnZhbGlkIG1vZGVcbiIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodWRjLT5sb2NrLCBmbGFncyk7CisKKyBkb25lOgorCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihwb3J0X3Rlc3QsIFNfSVJVU1IgfCBTX0lXVVNSLAorCQkgICBzaG93X3BvcnRfdGVzdCwgc3RvcmVfcG9ydF90ZXN0KTsKKworLyoqCisgKiBzaG93X3FoZWFkczogRE1BIGNvbnRlbnRzIG9mIGFsbCBxdWV1ZSBoZWFkcworICoKKyAqIENoZWNrICJkZXZpY2UuaCIgZm9yIGRldGFpbHMKKyAqLworc3RhdGljIHNzaXplX3Qgc2hvd19xaGVhZHMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgY2kxM3h4eCAqdWRjID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGNpMTN4eHgsIGdhZGdldC5kZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaSwgaiwgbiA9IDA7CisKKwlkYmdfdHJhY2UoIlslc10gJXBcbiIsIF9fZnVuY19fLCBidWYpOworCWlmIChhdHRyID09IE5VTEwgfHwgYnVmID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJbJXNdIEVJTlZBTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSh1ZGMtPmxvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgaHdfZXBfbWF4OyBpKyspIHsKKwkJc3RydWN0IGNpMTN4eHhfZXAgKm1FcCA9ICZ1ZGMtPmNpMTN4eHhfZXBbaV07CisJCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sCisJCQkgICAgICAgIkVQPSUwMmk6IFJYPSUwOFggVFg9JTA4WFxuIiwKKwkJCSAgICAgICBpLCAodTMyKW1FcC0+cWhbUlhdLmRtYSwgKHUzMiltRXAtPnFoW1RYXS5kbWEpOworCQlmb3IgKGogPSAwOyBqIDwgKHNpemVvZihzdHJ1Y3QgY2kxM3h4eF9xaCkvc2l6ZW9mKHUzMikpOyBqKyspIHsKKwkJCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sCisJCQkJICAgICAgICIgJTA0WDogICAgJTA4WCAgICAlMDhYXG4iLCBqLAorCQkJCSAgICAgICAqKCh1MzIgKiltRXAtPnFoW1JYXS5wdHIgKyBqKSwKKwkJCQkgICAgICAgKigodTMyICopbUVwLT5xaFtUWF0ucHRyICsgaikpOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodWRjLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gbjsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihxaGVhZHMsIFNfSVJVU1IsIHNob3dfcWhlYWRzLCBOVUxMKTsKKworLyoqCisgKiBzaG93X3JlZ2lzdGVyczogZHVtcHMgYWxsIHJlZ2lzdGVycworICoKKyAqIENoZWNrICJkZXZpY2UuaCIgZm9yIGRldGFpbHMKKyAqLworc3RhdGljIHNzaXplX3Qgc2hvd19yZWdpc3RlcnMoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgY2kxM3h4eCAqdWRjID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGNpMTN4eHgsIGdhZGdldC5kZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGR1bXBbNTEyXTsKKwl1bnNpZ25lZCBpLCBrLCBuID0gMDsKKworCWRiZ190cmFjZSgiWyVzXSAlcFxuIiwgX19mdW5jX18sIGJ1Zik7CisJaWYgKGF0dHIgPT0gTlVMTCB8fCBidWYgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgIlslc10gRUlOVkFMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKHVkYy0+bG9jaywgZmxhZ3MpOworCWsgPSBod19yZWdpc3Rlcl9yZWFkKGR1bXAsIHNpemVvZihkdW1wKS9zaXplb2YodTMyKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh1ZGMtPmxvY2ssIGZsYWdzKTsKKworCWZvciAoaSA9IDA7IGkgPCBrOyBpKyspIHsKKwkJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwKKwkJCSAgICAgICAicmVnWzB4JTA0WF0gPSAweCUwOFhcbiIsCisJCQkgICAgICAgaSAqICh1bnNpZ25lZClzaXplb2YodTMyKSwgZHVtcFtpXSk7CisJfQorCisJcmV0dXJuIG47Cit9CisKKy8qKgorICogc3RvcmVfcmVnaXN0ZXJzOiB3cml0ZXMgdmFsdWUgdG8gcmVnaXN0ZXIgYWRkcmVzcworICoKKyAqIENoZWNrICJkZXZpY2UuaCIgZm9yIGRldGFpbHMKKyAqLworc3RhdGljIHNzaXplX3Qgc3RvcmVfcmVnaXN0ZXJzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgY2kxM3h4eCAqdWRjID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGNpMTN4eHgsIGdhZGdldC5kZXYpOworCXVuc2lnbmVkIGxvbmcgYWRkciwgZGF0YSwgZmxhZ3M7CisKKwlkYmdfdHJhY2UoIlslc10gJXAsICVkXG4iLCBfX2Z1bmNfXywgYnVmLCBjb3VudCk7CisJaWYgKGF0dHIgPT0gTlVMTCB8fCBidWYgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgIlslc10gRUlOVkFMXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoc3NjYW5mKGJ1ZiwgIiVsaSAlbGkiLCAmYWRkciwgJmRhdGEpICE9IDIpIHsKKwkJZGV2X2VycihkZXYsICI8YWRkcj4gPGRhdGE+OiB3cml0ZSBkYXRhIHRvIHJlZ2lzdGVyIGFkZHJlc3MiKTsKKwkJZ290byBkb25lOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKHVkYy0+bG9jaywgZmxhZ3MpOworCWlmIChod19yZWdpc3Rlcl93cml0ZShhZGRyLCBkYXRhKSkKKwkJZGV2X2VycihkZXYsICJpbnZhbGlkIGFkZHJlc3MgcmFuZ2VcbiIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodWRjLT5sb2NrLCBmbGFncyk7CisKKyBkb25lOgorCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihyZWdpc3RlcnMsIFNfSVJVU1IgfCBTX0lXVVNSLAorCQkgICBzaG93X3JlZ2lzdGVycywgc3RvcmVfcmVnaXN0ZXJzKTsKKworLyoqCisgKiBzaG93X3JlcXVlc3RzOiBETUEgY29udGVudHMgb2YgYWxsIHJlcXVlc3RzIGN1cnJlbnRseSBxdWV1ZWQgKGFsbCBlbmRwdHMpCisgKgorICogQ2hlY2sgImRldmljZS5oIiBmb3IgZGV0YWlscworICovCitzdGF0aWMgc3NpemVfdCBzaG93X3JlcXVlc3RzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgY2kxM3h4eCAqdWRjID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGNpMTN4eHgsIGdhZGdldC5kZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGxpc3RfaGVhZCAgICpwdHIgPSBOVUxMOworCXN0cnVjdCBjaTEzeHh4X3JlcSAqcmVxID0gTlVMTDsKKwl1bnNpZ25lZCBpLCBqLCBrLCBuID0gMCwgcVNpemUgPSBzaXplb2Yoc3RydWN0IGNpMTN4eHhfdGQpL3NpemVvZih1MzIpOworCisJZGJnX3RyYWNlKCJbJXNdICVwXG4iLCBfX2Z1bmNfXywgYnVmKTsKKwlpZiAoYXR0ciA9PSBOVUxMIHx8IGJ1ZiA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAiWyVzXSBFSU5WQUxcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUodWRjLT5sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IGh3X2VwX21heDsgaSsrKQorCQlmb3IgKGsgPSBSWDsgayA8PSBUWDsgaysrKQorCQkJbGlzdF9mb3JfZWFjaChwdHIsICZ1ZGMtPmNpMTN4eHhfZXBbaV0ucWhba10ucXVldWUpCisJCQl7CisJCQkJcmVxID0gbGlzdF9lbnRyeShwdHIsCisJCQkJCQkgc3RydWN0IGNpMTN4eHhfcmVxLCBxdWV1ZSk7CisKKwkJCQluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLAorCQkJCQkgICAgICAgIkVQPSUwMmk6IFREPSUwOFggJXNcbiIsCisJCQkJCSAgICAgICBpLCAodTMyKXJlcS0+ZG1hLAorCQkJCQkgICAgICAgKChrID09IFJYKSA/ICJSWCIgOiAiVFgiKSk7CisKKwkJCQlmb3IgKGogPSAwOyBqIDwgcVNpemU7IGorKykKKwkJCQkJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwKKwkJCQkJCSAgICAgICAiICUwNFg6ICAgICUwOFhcbiIsIGosCisJCQkJCQkgICAgICAgKigodTMyICopcmVxLT5wdHIgKyBqKSk7CisJCQl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh1ZGMtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBuOworfQorc3RhdGljIERFVklDRV9BVFRSKHJlcXVlc3RzLCBTX0lSVVNSLCBzaG93X3JlcXVlc3RzLCBOVUxMKTsKKworLyoqCisgKiBkYmdfY3JlYXRlX2ZpbGVzOiBpbml0aWFsaXplcyB0aGUgYXR0cmlidXRlIGludGVyZmFjZQorICogQGRldjogZGV2aWNlCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUKKyAqLworX19tYXliZV91bnVzZWQgc3RhdGljIGludCBkYmdfY3JlYXRlX2ZpbGVzKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmIChkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2RldmljZSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBkb25lOworCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9kcml2ZXIpOworCWlmIChyZXR2YWwpCisJCWdvdG8gcm1fZGV2aWNlOworCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9ldmVudHMpOworCWlmIChyZXR2YWwpCisJCWdvdG8gcm1fZHJpdmVyOworCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9pbnRlcnMpOworCWlmIChyZXR2YWwpCisJCWdvdG8gcm1fZXZlbnRzOworCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9wb3J0X3Rlc3QpOworCWlmIChyZXR2YWwpCisJCWdvdG8gcm1faW50ZXJzOworCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9xaGVhZHMpOworCWlmIChyZXR2YWwpCisJCWdvdG8gcm1fcG9ydF90ZXN0OworCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9yZWdpc3RlcnMpOworCWlmIChyZXR2YWwpCisJCWdvdG8gcm1fcWhlYWRzOworCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9yZXF1ZXN0cyk7CisJaWYgKHJldHZhbCkKKwkJZ290byBybV9yZWdpc3RlcnM7CisJcmV0dXJuIDA7CisKKyBybV9yZWdpc3RlcnM6CisJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX3JlZ2lzdGVycyk7Cisgcm1fcWhlYWRzOgorCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9xaGVhZHMpOworIHJtX3BvcnRfdGVzdDoKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcG9ydF90ZXN0KTsKKyBybV9pbnRlcnM6CisJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX2ludGVycyk7Cisgcm1fZXZlbnRzOgorCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9ldmVudHMpOworIHJtX2RyaXZlcjoKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZHJpdmVyKTsKKyBybV9kZXZpY2U6CisJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX2RldmljZSk7CisgZG9uZToKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIGRiZ19yZW1vdmVfZmlsZXM6IGRlc3Ryb3lzIHRoZSBhdHRyaWJ1dGUgaW50ZXJmYWNlCisgKiBAZGV2OiBkZXZpY2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQorICovCitfX21heWJlX3VudXNlZCBzdGF0aWMgaW50IGRiZ19yZW1vdmVfZmlsZXMoc3RydWN0IGRldmljZSAqZGV2KQoreworCWlmIChkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX3JlcXVlc3RzKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcmVnaXN0ZXJzKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcWhlYWRzKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcG9ydF90ZXN0KTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfaW50ZXJzKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZXZlbnRzKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZHJpdmVyKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZGV2aWNlKTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVVRJTCBibG9jaworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBfdXNiX2FkZHI6IGNhbGN1bGF0ZXMgZW5kcG9pbnQgYWRkcmVzcyBmcm9tIGRpcmVjdGlvbiAmIG51bWJlcgorICogQGVwOiAgZW5kcG9pbnQKKyAqLworc3RhdGljIGlubGluZSB1OCBfdXNiX2FkZHIoc3RydWN0IGNpMTN4eHhfZXAgKmVwKQoreworCXJldHVybiAoKGVwLT5kaXIgPT0gVFgpID8gVVNCX0VORFBPSU5UX0RJUl9NQVNLIDogMCkgfCBlcC0+bnVtOworfQorCisvKioKKyAqIF9oYXJkd2FyZV9xdWV1ZTogY29uZmlndXJlcyBhIHJlcXVlc3QgYXQgaGFyZHdhcmUgbGV2ZWwKKyAqIEBnYWRnZXQ6IGdhZGdldAorICogQG1FcDogICAgZW5kcG9pbnQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IF9oYXJkd2FyZV9lbnF1ZXVlKHN0cnVjdCBjaTEzeHh4X2VwICptRXAsIHN0cnVjdCBjaTEzeHh4X3JlcSAqbVJlcSkKK3sKKwl1bnNpZ25lZCBpOworCisJdHJhY2UoIiVwLCAlcCIsIG1FcCwgbVJlcSk7CisKKwkvKiBkb24ndCBxdWV1ZSB0d2ljZSAqLworCWlmIChtUmVxLT5yZXEuc3RhdHVzID09IC1FQUxSRUFEWSkKKwkJcmV0dXJuIC1FQUxSRUFEWTsKKworCWlmIChod19lcF9pc19wcmltZWQobUVwLT5udW0sIG1FcC0+ZGlyKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCW1SZXEtPnJlcS5zdGF0dXMgPSAtRUFMUkVBRFk7CisKKwlpZiAobVJlcS0+cmVxLmxlbmd0aCAmJiAhbVJlcS0+cmVxLmRtYSkgeworCQltUmVxLT5yZXEuZG1hID0gXAorCQkJZG1hX21hcF9zaW5nbGUobUVwLT5kZXZpY2UsIG1SZXEtPnJlcS5idWYsCisJCQkJICAgICAgIG1SZXEtPnJlcS5sZW5ndGgsIG1FcC0+ZGlyID8KKwkJCQkgICAgICAgRE1BX1RPX0RFVklDRSA6IERNQV9GUk9NX0RFVklDRSk7CisJCWlmIChtUmVxLT5yZXEuZG1hID09IDApCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQltUmVxLT5tYXAgPSAxOworCX0KKworCS8qCisJICogVEQgY29uZmlndXJhdGlvbgorCSAqIFRPRE8gLSBoYW5kbGUgcmVxdWVzdHMgd2hpY2ggc3Bhd25zIGludG8gc2V2ZXJhbCBURHMKKwkgKi8KKwltZW1zZXQobVJlcS0+cHRyLCAwLCBzaXplb2YoKm1SZXEtPnB0cikpOworCW1SZXEtPnB0ci0+bmV4dCAgICB8PSBURF9URVJNSU5BVEU7CisJbVJlcS0+cHRyLT50b2tlbiAgICA9IG1SZXEtPnJlcS5sZW5ndGggPDwgZmZzX25yKFREX1RPVEFMX0JZVEVTKTsKKwltUmVxLT5wdHItPnRva2VuICAgJj0gVERfVE9UQUxfQllURVM7CisJbVJlcS0+cHRyLT50b2tlbiAgIHw9IFREX0lPQzsKKwltUmVxLT5wdHItPnRva2VuICAgfD0gVERfU1RBVFVTX0FDVElWRTsKKwltUmVxLT5wdHItPnBhZ2VbMF0gID0gbVJlcS0+cmVxLmRtYTsKKwlmb3IgKGkgPSAxOyBpIDwgNTsgaSsrKQorCQltUmVxLT5wdHItPnBhZ2VbaV0gPQorCQkJKG1SZXEtPnJlcS5kbWEgKyBpICogUEFHRV9TSVpFKSAmIH5URF9SRVNFUlZFRF9NQVNLOworCisJLyoKKwkgKiAgUUggY29uZmlndXJhdGlvbgorCSAqICBBdCB0aGlzIHBvaW50IGl0J3MgZ3VhcmFudGVlZCBleGNsdXNpdmUgYWNjZXNzIHRvIHFoZWFkCisJICogIChlbmRwdCBpcyBub3QgcHJpbWVkKSBzbyBpdCdzIG5vIG5lZWQgdG8gdXNlIHRyaXB3aXJlCisJICovCisJbUVwLT5xaFttRXAtPmRpcl0ucHRyLT50ZC5uZXh0ICAgPSBtUmVxLT5kbWE7ICAgIC8qIFRFUk1JTkFURSA9IDAgKi8KKwltRXAtPnFoW21FcC0+ZGlyXS5wdHItPnRkLnRva2VuICY9IH5URF9TVEFUVVM7ICAgLyogY2xlYXIgc3RhdHVzICovCisJaWYgKG1SZXEtPnJlcS56ZXJvID09IDApCisJCW1FcC0+cWhbbUVwLT5kaXJdLnB0ci0+Y2FwIHw9ICBRSF9aTFQ7CisJZWxzZQorCQltRXAtPnFoW21FcC0+ZGlyXS5wdHItPmNhcCAmPSB+UUhfWkxUOworCisJd21iKCk7ICAgLyogc3luY2hyb25pemUgYmVmb3JlIGVwIHByaW1lICovCisKKwlyZXR1cm4gaHdfZXBfcHJpbWUobUVwLT5udW0sIG1FcC0+ZGlyLAorCQkJICAgbUVwLT50eXBlID09IFVTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0wpOworfQorCisvKioKKyAqIF9oYXJkd2FyZV9kZXF1ZXVlOiBoYW5kbGVzIGEgcmVxdWVzdCBhdCBoYXJkd2FyZSBsZXZlbAorICogQGdhZGdldDogZ2FkZ2V0CisgKiBAbUVwOiAgICBlbmRwb2ludAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgX2hhcmR3YXJlX2RlcXVldWUoc3RydWN0IGNpMTN4eHhfZXAgKm1FcCwgc3RydWN0IGNpMTN4eHhfcmVxICptUmVxKQoreworCXRyYWNlKCIlcCwgJXAiLCBtRXAsIG1SZXEpOworCisJaWYgKG1SZXEtPnJlcS5zdGF0dXMgIT0gLUVBTFJFQURZKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChod19lcF9pc19wcmltZWQobUVwLT5udW0sIG1FcC0+ZGlyKSkKKwkJaHdfZXBfZmx1c2gobUVwLT5udW0sIG1FcC0+ZGlyKTsKKworCW1SZXEtPnJlcS5zdGF0dXMgPSAwOworCisJaWYgKG1SZXEtPm1hcCkgeworCQlkbWFfdW5tYXBfc2luZ2xlKG1FcC0+ZGV2aWNlLCBtUmVxLT5yZXEuZG1hLCBtUmVxLT5yZXEubGVuZ3RoLAorCQkJCSBtRXAtPmRpciA/IERNQV9UT19ERVZJQ0UgOiBETUFfRlJPTV9ERVZJQ0UpOworCQltUmVxLT5yZXEuZG1hID0gMDsKKwkJbVJlcS0+bWFwICAgICA9IDA7CisJfQorCisJbVJlcS0+cmVxLnN0YXR1cyA9IG1SZXEtPnB0ci0+dG9rZW4gJiBURF9TVEFUVVM7CisJaWYgICAgICAoKFREX1NUQVRVU19BQ1RJVkUgJiBtUmVxLT5yZXEuc3RhdHVzKSAhPSAwKQorCQltUmVxLT5yZXEuc3RhdHVzID0gLUVDT05OUkVTRVQ7CisJZWxzZSBpZiAoKFREX1NUQVRVU19IQUxURUQgJiBtUmVxLT5yZXEuc3RhdHVzKSAhPSAwKQorCQltUmVxLT5yZXEuc3RhdHVzID0gLTE7CisJZWxzZSBpZiAoKFREX1NUQVRVU19EVF9FUlIgJiBtUmVxLT5yZXEuc3RhdHVzKSAhPSAwKQorCQltUmVxLT5yZXEuc3RhdHVzID0gLTE7CisJZWxzZSBpZiAoKFREX1NUQVRVU19UUl9FUlIgJiBtUmVxLT5yZXEuc3RhdHVzKSAhPSAwKQorCQltUmVxLT5yZXEuc3RhdHVzID0gLTE7CisKKwltUmVxLT5yZXEuYWN0dWFsICAgPSBtUmVxLT5wdHItPnRva2VuICYgVERfVE9UQUxfQllURVM7CisJbVJlcS0+cmVxLmFjdHVhbCA+Pj0gZmZzX25yKFREX1RPVEFMX0JZVEVTKTsKKwltUmVxLT5yZXEuYWN0dWFsICAgPSBtUmVxLT5yZXEubGVuZ3RoIC0gbVJlcS0+cmVxLmFjdHVhbDsKKwltUmVxLT5yZXEuYWN0dWFsICAgPSBtUmVxLT5yZXEuc3RhdHVzID8gMCA6IG1SZXEtPnJlcS5hY3R1YWw7CisKKwlyZXR1cm4gbVJlcS0+cmVxLmFjdHVhbDsKK30KKworLyoqCisgKiBfZXBfbnVrZTogZGVxdWV1ZXMgYWxsIGVuZHBvaW50IHJlcXVlc3RzCisgKiBAbUVwOiBlbmRwb2ludAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCisgKiBDYWxsZXIgbXVzdCBob2xkIGxvY2sKKyAqLworc3RhdGljIGludCBfZXBfbnVrZShzdHJ1Y3QgY2kxM3h4eF9lcCAqbUVwKQorX19yZWxlYXNlcyhtRXAtPmxvY2spCitfX2FjcXVpcmVzKG1FcC0+bG9jaykKK3sKKwl0cmFjZSgiJXAiLCBtRXApOworCisJaWYgKG1FcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWh3X2VwX2ZsdXNoKG1FcC0+bnVtLCBtRXAtPmRpcik7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJm1FcC0+cWhbbUVwLT5kaXJdLnF1ZXVlKSkgeworCisJCS8qIHBvcCBvbGRlc3QgcmVxdWVzdCAqLworCQlzdHJ1Y3QgY2kxM3h4eF9yZXEgKm1SZXEgPSBcCisJCQlsaXN0X2VudHJ5KG1FcC0+cWhbbUVwLT5kaXJdLnF1ZXVlLm5leHQsCisJCQkJICAgc3RydWN0IGNpMTN4eHhfcmVxLCBxdWV1ZSk7CisJCWxpc3RfZGVsX2luaXQoJm1SZXEtPnF1ZXVlKTsKKwkJbVJlcS0+cmVxLnN0YXR1cyA9IC1FU0hVVERPV047CisKKwkJaWYgKCFtUmVxLT5yZXEubm9faW50ZXJydXB0ICYmIG1SZXEtPnJlcS5jb21wbGV0ZSAhPSBOVUxMKSB7CisJCQlzcGluX3VubG9jayhtRXAtPmxvY2spOworCQkJbVJlcS0+cmVxLmNvbXBsZXRlKCZtRXAtPmVwLCAmbVJlcS0+cmVxKTsKKwkJCXNwaW5fbG9jayhtRXAtPmxvY2spOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIF9nYWRnZXRfc3RvcF9hY3Rpdml0eTogc3RvcHMgYWxsIFVTQiBhY3Rpdml0eSwgZmx1c2hlcyAmIGRpc2FibGVzIGFsbCBlbmRwdHMKKyAqIEBnYWRnZXQ6IGdhZGdldAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCisgKiBDYWxsZXIgbXVzdCBob2xkIGxvY2sKKyAqLworc3RhdGljIGludCBfZ2FkZ2V0X3N0b3BfYWN0aXZpdHkoc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCkKK19fcmVsZWFzZXModWRjLT5sb2NrKQorX19hY3F1aXJlcyh1ZGMtPmxvY2spCit7CisJc3RydWN0IHVzYl9lcCAqZXA7CisJc3RydWN0IGNpMTN4eHggICAgKnVkYyA9IGNvbnRhaW5lcl9vZihnYWRnZXQsIHN0cnVjdCBjaTEzeHh4LCBnYWRnZXQpOworCXN0cnVjdCBjaTEzeHh4X2VwICptRXAgPSBjb250YWluZXJfb2YoZ2FkZ2V0LT5lcDAsCisJCQkJCSAgICAgIHN0cnVjdCBjaTEzeHh4X2VwLCBlcCk7CisKKwl0cmFjZSgiJXAiLCBnYWRnZXQpOworCisJaWYgKGdhZGdldCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fdW5sb2NrKHVkYy0+bG9jayk7CisKKwkvKiBmbHVzaCBhbGwgZW5kcG9pbnRzICovCisJZ2FkZ2V0X2Zvcl9lYWNoX2VwKGVwLCBnYWRnZXQpIHsKKwkJdXNiX2VwX2ZpZm9fZmx1c2goZXApOworCX0KKwl1c2JfZXBfZmlmb19mbHVzaChnYWRnZXQtPmVwMCk7CisKKwl1ZGMtPmRyaXZlci0+ZGlzY29ubmVjdChnYWRnZXQpOworCisJLyogbWFrZSBzdXJlIHRvIGRpc2FibGUgYWxsIGVuZHBvaW50cyAqLworCWdhZGdldF9mb3JfZWFjaF9lcChlcCwgZ2FkZ2V0KSB7CisJCXVzYl9lcF9kaXNhYmxlKGVwKTsKKwl9CisJdXNiX2VwX2Rpc2FibGUoZ2FkZ2V0LT5lcDApOworCisJaWYgKG1FcC0+c3RhdHVzICE9IE5VTEwpIHsKKwkJdXNiX2VwX2ZyZWVfcmVxdWVzdChnYWRnZXQtPmVwMCwgbUVwLT5zdGF0dXMpOworCQltRXAtPnN0YXR1cyA9IE5VTEw7CisJfQorCisJc3Bpbl9sb2NrKHVkYy0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSVNSIGJsb2NrCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIGlzcl9yZXNldF9oYW5kbGVyOiBVU0IgcmVzZXQgaW50ZXJydXB0IGhhbmRsZXIKKyAqIEB1ZGM6IFVEQyBkZXZpY2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlc2V0cyBVU0IgZW5naW5lIGFmdGVyIGEgYnVzIHJlc2V0IG9jY3VycmVkCisgKi8KK3N0YXRpYyB2b2lkIGlzcl9yZXNldF9oYW5kbGVyKHN0cnVjdCBjaTEzeHh4ICp1ZGMpCitfX3JlbGVhc2VzKHVkYy0+bG9jaykKK19fYWNxdWlyZXModWRjLT5sb2NrKQoreworCXN0cnVjdCBjaTEzeHh4X2VwICptRXAgPSAmdWRjLT5jaTEzeHh4X2VwWzBdOworCWludCByZXR2YWw7CisKKwl0cmFjZSgiJXAiLCB1ZGMpOworCisJaWYgKHVkYyA9PSBOVUxMKSB7CisJCWVycigiRUlOVkFMIik7CisJCXJldHVybjsKKwl9CisKKwlkYmdfZXZlbnQoMHhGRiwgIkJVUyBSU1QiLCAwKTsKKworCXJldHZhbCA9IF9nYWRnZXRfc3RvcF9hY3Rpdml0eSgmdWRjLT5nYWRnZXQpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZG9uZTsKKworCXJldHZhbCA9IGh3X3VzYl9yZXNldCgpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZG9uZTsKKworCXNwaW5fdW5sb2NrKHVkYy0+bG9jayk7CisJcmV0dmFsID0gdXNiX2VwX2VuYWJsZSgmbUVwLT5lcCwgJmN0cmxfZW5kcHRfZGVzYyk7CisJaWYgKCFyZXR2YWwpIHsKKwkJbUVwLT5zdGF0dXMgPSB1c2JfZXBfYWxsb2NfcmVxdWVzdCgmbUVwLT5lcCwgR0ZQX0tFUk5FTCk7CisJCWlmIChtRXAtPnN0YXR1cyA9PSBOVUxMKSB7CisJCQl1c2JfZXBfZGlzYWJsZSgmbUVwLT5lcCk7CisJCQlyZXR2YWwgPSAtRU5PTUVNOworCQl9CisJfQorCXNwaW5fbG9jayh1ZGMtPmxvY2spOworCisgZG9uZToKKwlpZiAocmV0dmFsKQorCQllcnIoImVycm9yOiAlaSIsIHJldHZhbCk7Cit9CisKKy8qKgorICogaXNyX2dldF9zdGF0dXNfY29tcGxldGU6IGdldF9zdGF0dXMgcmVxdWVzdCBjb21wbGV0ZSBmdW5jdGlvbgorICogQGVwOiAgZW5kcG9pbnQKKyAqIEByZXE6IHJlcXVlc3QgaGFuZGxlZAorICoKKyAqIENhbGxlciBtdXN0IHJlbGVhc2UgbG9jaworICovCitzdGF0aWMgdm9pZCBpc3JfZ2V0X3N0YXR1c19jb21wbGV0ZShzdHJ1Y3QgdXNiX2VwICplcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEpCit7CisJdHJhY2UoIiVwLCAlcCIsIGVwLCByZXEpOworCisJaWYgKGVwID09IE5VTEwgfHwgcmVxID09IE5VTEwpIHsKKwkJZXJyKCJFSU5WQUwiKTsKKwkJcmV0dXJuOworCX0KKworCWtmcmVlKHJlcS0+YnVmKTsKKwl1c2JfZXBfZnJlZV9yZXF1ZXN0KGVwLCByZXEpOworfQorCisvKioKKyAqIGlzcl9nZXRfc3RhdHVzX3Jlc3BvbnNlOiBnZXRfc3RhdHVzIHJlcXVlc3QgcmVzcG9uc2UKKyAqIEBlcDogICAgZW5kcG9pbnQKKyAqIEBzZXR1cDogc2V0dXAgcmVxdWVzdCBwYWNrZXQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGlzcl9nZXRfc3RhdHVzX3Jlc3BvbnNlKHN0cnVjdCBjaTEzeHh4X2VwICptRXAsCisJCQkJICAgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqc2V0dXApCitfX3JlbGVhc2VzKG1FcC0+bG9jaykKK19fYWNxdWlyZXMobUVwLT5sb2NrKQoreworCXN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxID0gTlVMTDsKKwlnZnBfdCBnZnBfZmxhZ3MgPSBHRlBfQVRPTUlDOworCWludCBkaXIsIG51bSwgcmV0dmFsOworCisJdHJhY2UoIiVwLCAlcCIsIG1FcCwgc2V0dXApOworCisJaWYgKG1FcCA9PSBOVUxMIHx8IHNldHVwID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl91bmxvY2sobUVwLT5sb2NrKTsKKwlyZXEgPSB1c2JfZXBfYWxsb2NfcmVxdWVzdCgmbUVwLT5lcCwgZ2ZwX2ZsYWdzKTsKKwlzcGluX2xvY2sobUVwLT5sb2NrKTsKKwlpZiAocmVxID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJcmVxLT5jb21wbGV0ZSA9IGlzcl9nZXRfc3RhdHVzX2NvbXBsZXRlOworCXJlcS0+bGVuZ3RoICAgPSAyOworCXJlcS0+YnVmICAgICAgPSBremFsbG9jKHJlcS0+bGVuZ3RoLCBnZnBfZmxhZ3MpOworCWlmIChyZXEtPmJ1ZiA9PSBOVUxMKSB7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2ZyZWVfcmVxOworCX0KKworCWlmICgoc2V0dXAtPmJSZXF1ZXN0VHlwZSAmIFVTQl9SRUNJUF9NQVNLKSA9PSBVU0JfUkVDSVBfREVWSUNFKSB7CisJCS8qIFRPRE86IEQxIC0gUmVtb3RlIFdha2V1cDsgRDAgLSBTZWxmIFBvd2VyZWQgKi8KKwkJcmV0dmFsID0gMDsKKwl9IGVsc2UgaWYgKChzZXR1cC0+YlJlcXVlc3RUeXBlICYgVVNCX1JFQ0lQX01BU0spIFwKKwkJICAgPT0gVVNCX1JFQ0lQX0VORFBPSU5UKSB7CisJCWRpciA9IChsZTE2X3RvX2NwdShzZXR1cC0+d0luZGV4KSAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykgPworCQkJVFggOiBSWDsKKwkJbnVtID0gIGxlMTZfdG9fY3B1KHNldHVwLT53SW5kZXgpICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLOworCQkqKCh1MTYgKilyZXEtPmJ1ZikgPSBod19lcF9nZXRfaGFsdChudW0sIGRpcik7CisJfQorCS8qIGVsc2UgZG8gbm90aGluZzsgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KKworCXNwaW5fdW5sb2NrKG1FcC0+bG9jayk7CisJcmV0dmFsID0gdXNiX2VwX3F1ZXVlKCZtRXAtPmVwLCByZXEsIGdmcF9mbGFncyk7CisJc3Bpbl9sb2NrKG1FcC0+bG9jayk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJfZnJlZV9idWY7CisKKwlyZXR1cm4gMDsKKworIGVycl9mcmVlX2J1ZjoKKwlrZnJlZShyZXEtPmJ1Zik7CisgZXJyX2ZyZWVfcmVxOgorCXNwaW5fdW5sb2NrKG1FcC0+bG9jayk7CisJdXNiX2VwX2ZyZWVfcmVxdWVzdCgmbUVwLT5lcCwgcmVxKTsKKwlzcGluX2xvY2sobUVwLT5sb2NrKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIGlzcl9zZXR1cF9zdGF0dXNfcGhhc2U6IHF1ZXVlcyB0aGUgc3RhdHVzIHBoYXNlIG9mIGEgc2V0dXAgdHJhbnNhdGlvbgorICogQG1FcDogZW5kcG9pbnQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGlzcl9zZXR1cF9zdGF0dXNfcGhhc2Uoc3RydWN0IGNpMTN4eHhfZXAgKm1FcCkKK19fcmVsZWFzZXMobUVwLT5sb2NrKQorX19hY3F1aXJlcyhtRXAtPmxvY2spCit7CisJaW50IHJldHZhbDsKKworCXRyYWNlKCIlcCIsIG1FcCk7CisKKwkvKiBtRXAgaXMgYWx3YXlzIHZhbGlkICYgY29uZmlndXJlZCAqLworCisJaWYgKG1FcC0+dHlwZSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MKQorCQltRXAtPmRpciA9IChtRXAtPmRpciA9PSBUWCkgPyBSWCA6IFRYOworCisJbUVwLT5zdGF0dXMtPm5vX2ludGVycnVwdCA9IDE7CisKKwlzcGluX3VubG9jayhtRXAtPmxvY2spOworCXJldHZhbCA9IHVzYl9lcF9xdWV1ZSgmbUVwLT5lcCwgbUVwLT5zdGF0dXMsIEdGUF9BVE9NSUMpOworCXNwaW5fbG9jayhtRXAtPmxvY2spOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBpc3JfdHJfY29tcGxldGVfbG93OiB0cmFuc2FjdGlvbiBjb21wbGV0ZSBsb3cgbGV2ZWwgaGFuZGxlcgorICogQG1FcDogZW5kcG9pbnQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQorICogQ2FsbGVyIG11c3QgaG9sZCBsb2NrCisgKi8KK3N0YXRpYyBpbnQgaXNyX3RyX2NvbXBsZXRlX2xvdyhzdHJ1Y3QgY2kxM3h4eF9lcCAqbUVwKQorX19yZWxlYXNlcyhtRXAtPmxvY2spCitfX2FjcXVpcmVzKG1FcC0+bG9jaykKK3sKKwlzdHJ1Y3QgY2kxM3h4eF9yZXEgKm1SZXE7CisJaW50IHJldHZhbDsKKworCXRyYWNlKCIlcCIsIG1FcCk7CisKKwlpZiAobGlzdF9lbXB0eSgmbUVwLT5xaFttRXAtPmRpcl0ucXVldWUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIHBvcCBvbGRlc3QgcmVxdWVzdCAqLworCW1SZXEgPSBsaXN0X2VudHJ5KG1FcC0+cWhbbUVwLT5kaXJdLnF1ZXVlLm5leHQsCisJCQkgIHN0cnVjdCBjaTEzeHh4X3JlcSwgcXVldWUpOworCWxpc3RfZGVsX2luaXQoJm1SZXEtPnF1ZXVlKTsKKworCXJldHZhbCA9IF9oYXJkd2FyZV9kZXF1ZXVlKG1FcCwgbVJlcSk7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJZGJnX2V2ZW50KF91c2JfYWRkcihtRXApLCAiRE9ORSIsIHJldHZhbCk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlkYmdfZG9uZShfdXNiX2FkZHIobUVwKSwgbVJlcS0+cHRyLT50b2tlbiwgcmV0dmFsKTsKKworCWlmICghbVJlcS0+cmVxLm5vX2ludGVycnVwdCAmJiBtUmVxLT5yZXEuY29tcGxldGUgIT0gTlVMTCkgeworCQlzcGluX3VubG9jayhtRXAtPmxvY2spOworCQltUmVxLT5yZXEuY29tcGxldGUoJm1FcC0+ZXAsICZtUmVxLT5yZXEpOworCQlzcGluX2xvY2sobUVwLT5sb2NrKTsKKwl9CisKKwlpZiAoIWxpc3RfZW1wdHkoJm1FcC0+cWhbbUVwLT5kaXJdLnF1ZXVlKSkgeworCQltUmVxID0gbGlzdF9lbnRyeShtRXAtPnFoW21FcC0+ZGlyXS5xdWV1ZS5uZXh0LAorCQkJCSAgc3RydWN0IGNpMTN4eHhfcmVxLCBxdWV1ZSk7CisJCV9oYXJkd2FyZV9lbnF1ZXVlKG1FcCwgbVJlcSk7CisJfQorCisgZG9uZToKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIGlzcl90cl9jb21wbGV0ZV9oYW5kbGVyOiB0cmFuc2FjdGlvbiBjb21wbGV0ZSBpbnRlcnJ1cHQgaGFuZGxlcgorICogQHVkYzogVURDIGRlc2NyaXB0b3IKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdHJhZmZpYyBldmVudHMKKyAqLworc3RhdGljIHZvaWQgaXNyX3RyX2NvbXBsZXRlX2hhbmRsZXIoc3RydWN0IGNpMTN4eHggKnVkYykKK19fcmVsZWFzZXModWRjLT5sb2NrKQorX19hY3F1aXJlcyh1ZGMtPmxvY2spCit7CisJdW5zaWduZWQgaTsKKworCXRyYWNlKCIlcCIsIHVkYyk7CisKKwlpZiAodWRjID09IE5VTEwpIHsKKwkJZXJyKCJFSU5WQUwiKTsKKwkJcmV0dXJuOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBod19lcF9tYXg7IGkrKykgeworCQlzdHJ1Y3QgY2kxM3h4eF9lcCAqbUVwICA9ICZ1ZGMtPmNpMTN4eHhfZXBbaV07CisJCWludCB0eXBlLCBudW0sIGVyciA9IC1FSU5WQUw7CisJCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgcmVxOworCisKKwkJaWYgKG1FcC0+ZGVzYyA9PSBOVUxMKQorCQkJY29udGludWU7ICAgLyogbm90IGNvbmZpZ3VyZWQgKi8KKworCQlpZiAoKG1FcC0+ZGlyID09IFJYICYmIGh3X3Rlc3RfYW5kX2NsZWFyX2NvbXBsZXRlKGkpKSB8fAorCQkgICAgKG1FcC0+ZGlyID09IFRYICYmIGh3X3Rlc3RfYW5kX2NsZWFyX2NvbXBsZXRlKGkgKyAxNikpKSB7CisJCQllcnIgPSBpc3JfdHJfY29tcGxldGVfbG93KG1FcCk7CisJCQlpZiAobUVwLT50eXBlID09IFVTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0wpIHsKKwkJCQlpZiAoZXJyID4gMCkgICAvKiBuZWVkcyBzdGF0dXMgcGhhc2UgKi8KKwkJCQkJZXJyID0gaXNyX3NldHVwX3N0YXR1c19waGFzZShtRXApOworCQkJCWlmIChlcnIgPCAwKSB7CisJCQkJCWRiZ19ldmVudChfdXNiX2FkZHIobUVwKSwKKwkJCQkJCSAgIkVSUk9SIiwgZXJyKTsKKwkJCQkJc3Bpbl91bmxvY2sodWRjLT5sb2NrKTsKKwkJCQkJaWYgKHVzYl9lcF9zZXRfaGFsdCgmbUVwLT5lcCkpCisJCQkJCQllcnIoImVycm9yOiBlcF9zZXRfaGFsdCIpOworCQkJCQlzcGluX2xvY2sodWRjLT5sb2NrKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAobUVwLT50eXBlICE9IFVTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0wgfHwKKwkJICAgICFod190ZXN0X2FuZF9jbGVhcl9zZXR1cF9zdGF0dXMoaSkpCisJCQljb250aW51ZTsKKworCQlpZiAoaSAhPSAwKSB7CisJCQl3YXJuKCJjdHJsIHRyYWZmaWMgcmVjZWl2ZWQgYXQgZW5kcG9pbnQiKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogcmVhZF9zZXR1cF9wYWNrZXQgKi8KKwkJZG8geworCQkJaHdfdGVzdF9hbmRfc2V0X3NldHVwX2d1YXJkKCk7CisJCQltZW1jcHkoJnJlcSwgJm1FcC0+cWhbUlhdLnB0ci0+c2V0dXAsIHNpemVvZihyZXEpKTsKKwkJfSB3aGlsZSAoIWh3X3Rlc3RfYW5kX2NsZWFyX3NldHVwX2d1YXJkKCkpOworCisJCXR5cGUgPSByZXEuYlJlcXVlc3RUeXBlOworCisJCW1FcC0+ZGlyID0gKHR5cGUgJiBVU0JfRElSX0lOKSA/IFRYIDogUlg7CisKKwkJZGJnX3NldHVwKF91c2JfYWRkcihtRXApLCAmcmVxKTsKKworCQlzd2l0Y2ggKHJlcS5iUmVxdWVzdCkgeworCQljYXNlIFVTQl9SRVFfQ0xFQVJfRkVBVFVSRToKKwkJCWlmICh0eXBlICE9IChVU0JfRElSX09VVHxVU0JfUkVDSVBfRU5EUE9JTlQpICYmCisJCQkgICAgbGUxNl90b19jcHUocmVxLndWYWx1ZSkgIT0gVVNCX0VORFBPSU5UX0hBTFQpCisJCQkJZ290byBkZWxlZ2F0ZTsKKwkJCWlmIChyZXEud0xlbmd0aCAhPSAwKQorCQkJCWJyZWFrOworCQkJbnVtICA9IGxlMTZfdG9fY3B1KHJlcS53SW5kZXgpOworCQkJbnVtICY9IFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSzsKKwkJCWlmICghdWRjLT5jaTEzeHh4X2VwW251bV0ud2VkZ2UpIHsKKwkJCQlzcGluX3VubG9jayh1ZGMtPmxvY2spOworCQkJCWVyciA9IHVzYl9lcF9jbGVhcl9oYWx0KAorCQkJCQkmdWRjLT5jaTEzeHh4X2VwW251bV0uZXApOworCQkJCXNwaW5fbG9jayh1ZGMtPmxvY2spOworCQkJCWlmIChlcnIpCisJCQkJCWJyZWFrOworCQkJfQorCQkJZXJyID0gaXNyX3NldHVwX3N0YXR1c19waGFzZShtRXApOworCQkJYnJlYWs7CisJCWNhc2UgVVNCX1JFUV9HRVRfU1RBVFVTOgorCQkJaWYgKHR5cGUgIT0gKFVTQl9ESVJfSU58VVNCX1JFQ0lQX0RFVklDRSkgICAmJgorCQkJICAgIHR5cGUgIT0gKFVTQl9ESVJfSU58VVNCX1JFQ0lQX0VORFBPSU5UKSAmJgorCQkJICAgIHR5cGUgIT0gKFVTQl9ESVJfSU58VVNCX1JFQ0lQX0lOVEVSRkFDRSkpCisJCQkJZ290byBkZWxlZ2F0ZTsKKwkJCWlmIChsZTE2X3RvX2NwdShyZXEud0xlbmd0aCkgIT0gMiB8fAorCQkJICAgIGxlMTZfdG9fY3B1KHJlcS53VmFsdWUpICAhPSAwKQorCQkJCWJyZWFrOworCQkJZXJyID0gaXNyX2dldF9zdGF0dXNfcmVzcG9uc2UobUVwLCAmcmVxKTsKKwkJCWJyZWFrOworCQljYXNlIFVTQl9SRVFfU0VUX0FERFJFU1M6CisJCQlpZiAodHlwZSAhPSAoVVNCX0RJUl9PVVR8VVNCX1JFQ0lQX0RFVklDRSkpCisJCQkJZ290byBkZWxlZ2F0ZTsKKwkJCWlmIChsZTE2X3RvX2NwdShyZXEud0xlbmd0aCkgIT0gMCB8fAorCQkJICAgIGxlMTZfdG9fY3B1KHJlcS53SW5kZXgpICAhPSAwKQorCQkJCWJyZWFrOworCQkJZXJyID0gaHdfdXNiX3NldF9hZGRyZXNzKCh1OClsZTE2X3RvX2NwdShyZXEud1ZhbHVlKSk7CisJCQlpZiAoZXJyKQorCQkJCWJyZWFrOworCQkJZXJyID0gaXNyX3NldHVwX3N0YXR1c19waGFzZShtRXApOworCQkJYnJlYWs7CisJCWNhc2UgVVNCX1JFUV9TRVRfRkVBVFVSRToKKwkJCWlmICh0eXBlICE9IChVU0JfRElSX09VVHxVU0JfUkVDSVBfRU5EUE9JTlQpICYmCisJCQkgICAgbGUxNl90b19jcHUocmVxLndWYWx1ZSkgIT0gVVNCX0VORFBPSU5UX0hBTFQpCisJCQkJZ290byBkZWxlZ2F0ZTsKKwkJCWlmIChyZXEud0xlbmd0aCAhPSAwKQorCQkJCWJyZWFrOworCQkJbnVtICA9IGxlMTZfdG9fY3B1KHJlcS53SW5kZXgpOworCQkJbnVtICY9IFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSzsKKworCQkJc3Bpbl91bmxvY2sodWRjLT5sb2NrKTsKKwkJCWVyciA9IHVzYl9lcF9zZXRfaGFsdCgmdWRjLT5jaTEzeHh4X2VwW251bV0uZXApOworCQkJc3Bpbl9sb2NrKHVkYy0+bG9jayk7CisJCQlpZiAoZXJyKQorCQkJCWJyZWFrOworCQkJZXJyID0gaXNyX3NldHVwX3N0YXR1c19waGFzZShtRXApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CitkZWxlZ2F0ZToKKwkJCWlmIChyZXEud0xlbmd0aCA9PSAwKSAgIC8qIG5vIGRhdGEgcGhhc2UgKi8KKwkJCQltRXAtPmRpciA9IFRYOworCisJCQlzcGluX3VubG9jayh1ZGMtPmxvY2spOworCQkJZXJyID0gdWRjLT5kcml2ZXItPnNldHVwKCZ1ZGMtPmdhZGdldCwgJnJlcSk7CisJCQlzcGluX2xvY2sodWRjLT5sb2NrKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGVyciA8IDApIHsKKwkJCWRiZ19ldmVudChfdXNiX2FkZHIobUVwKSwgIkVSUk9SIiwgZXJyKTsKKworCQkJc3Bpbl91bmxvY2sodWRjLT5sb2NrKTsKKwkJCWlmICh1c2JfZXBfc2V0X2hhbHQoJm1FcC0+ZXApKQorCQkJCWVycigiZXJyb3I6IGVwX3NldF9oYWx0Iik7CisJCQlzcGluX2xvY2sodWRjLT5sb2NrKTsKKwkJfQorCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRU5EUFQgYmxvY2sKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogZXBfZW5hYmxlOiBjb25maWd1cmUgZW5kcG9pbnQsIG1ha2luZyBpdCB1c2FibGUKKyAqCisgKiBDaGVjayB1c2JfZXBfZW5hYmxlKCkgYXQgInVzYl9nYWRnZXQuaCIgZm9yIGRldGFpbHMKKyAqLworc3RhdGljIGludCBlcF9lbmFibGUoc3RydWN0IHVzYl9lcCAqZXAsCisJCSAgICAgY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICpkZXNjKQoreworCXN0cnVjdCBjaTEzeHh4X2VwICptRXAgPSBjb250YWluZXJfb2YoZXAsIHN0cnVjdCBjaTEzeHh4X2VwLCBlcCk7CisJaW50IGRpcmVjdGlvbiwgcmV0dmFsID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJdHJhY2UoIiVwLCAlcCIsIGVwLCBkZXNjKTsKKworCWlmIChlcCA9PSBOVUxMIHx8IGRlc2MgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShtRXAtPmxvY2ssIGZsYWdzKTsKKworCS8qIG9ubHkgaW50ZXJuYWwgU1cgc2hvdWxkIGVuYWJsZSBjdHJsIGVuZHB0cyAqLworCisJbUVwLT5kZXNjID0gZGVzYzsKKworCWlmICghbGlzdF9lbXB0eSgmbUVwLT5xaFttRXAtPmRpcl0ucXVldWUpKQorCQl3YXJuKCJlbmFibGluZyBhIG5vbi1lbXB0eSBlbmRwb2ludCEiKTsKKworCW1FcC0+ZGlyICA9IChkZXNjLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSA/IFRYIDogUlg7CisJbUVwLT5udW0gID0gIGRlc2MtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfTlVNQkVSX01BU0s7CisJbUVwLT50eXBlID0gIGRlc2MtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLOworCisJbUVwLT5lcC5tYXhwYWNrZXQgPSBfX2NvbnN0YW50X2xlMTZfdG9fY3B1KGRlc2MtPndNYXhQYWNrZXRTaXplKTsKKworCWRpcmVjdGlvbiA9IG1FcC0+ZGlyOworCWRvIHsKKwkJZGJnX2V2ZW50KF91c2JfYWRkcihtRXApLCAiRU5BQkxFIiwgMCk7CisKKwkJaWYgKG1FcC0+dHlwZSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MKQorCQkJbUVwLT5xaFttRXAtPmRpcl0ucHRyLT5jYXAgfD0gIFFIX0lPUzsKKwkJZWxzZSBpZiAobUVwLT50eXBlID09IFVTQl9FTkRQT0lOVF9YRkVSX0lTT0MpCisJCQltRXAtPnFoW21FcC0+ZGlyXS5wdHItPmNhcCAmPSB+UUhfTVVMVDsKKwkJZWxzZQorCQkJbUVwLT5xaFttRXAtPmRpcl0ucHRyLT5jYXAgJj0gflFIX1pMVDsKKworCQltRXAtPnFoW21FcC0+ZGlyXS5wdHItPmNhcCB8PQorCQkJKG1FcC0+ZXAubWF4cGFja2V0IDw8IGZmc19ucihRSF9NQVhfUEtUKSkgJiBRSF9NQVhfUEtUOworCQltRXAtPnFoW21FcC0+ZGlyXS5wdHItPnRkLm5leHQgfD0gVERfVEVSTUlOQVRFOyAgIC8qIG5lZWRlZD8gKi8KKworCQlyZXR2YWwgfD0gaHdfZXBfZW5hYmxlKG1FcC0+bnVtLCBtRXAtPmRpciwgbUVwLT50eXBlKTsKKworCQlpZiAobUVwLT50eXBlID09IFVTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0wpCisJCQltRXAtPmRpciA9IChtRXAtPmRpciA9PSBUWCkgPyBSWCA6IFRYOworCisJfSB3aGlsZSAobUVwLT5kaXIgIT0gZGlyZWN0aW9uKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobUVwLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBlcF9kaXNhYmxlOiBlbmRwb2ludCBpcyBubyBsb25nZXIgdXNhYmxlCisgKgorICogQ2hlY2sgdXNiX2VwX2Rpc2FibGUoKSBhdCAidXNiX2dhZGdldC5oIiBmb3IgZGV0YWlscworICovCitzdGF0aWMgaW50IGVwX2Rpc2FibGUoc3RydWN0IHVzYl9lcCAqZXApCit7CisJc3RydWN0IGNpMTN4eHhfZXAgKm1FcCA9IGNvbnRhaW5lcl9vZihlcCwgc3RydWN0IGNpMTN4eHhfZXAsIGVwKTsKKwlpbnQgZGlyZWN0aW9uLCByZXR2YWwgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl0cmFjZSgiJXAiLCBlcCk7CisKKwlpZiAoZXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZWxzZSBpZiAobUVwLT5kZXNjID09IE5VTEwpCisJCXJldHVybiAtRUJVU1k7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShtRXAtPmxvY2ssIGZsYWdzKTsKKworCS8qIG9ubHkgaW50ZXJuYWwgU1cgc2hvdWxkIGRpc2FibGUgY3RybCBlbmRwdHMgKi8KKworCWRpcmVjdGlvbiA9IG1FcC0+ZGlyOworCWRvIHsKKwkJZGJnX2V2ZW50KF91c2JfYWRkcihtRXApLCAiRElTQUJMRSIsIDApOworCisJCXJldHZhbCB8PSBfZXBfbnVrZShtRXApOworCQlyZXR2YWwgfD0gaHdfZXBfZGlzYWJsZShtRXAtPm51bSwgbUVwLT5kaXIpOworCisJCWlmIChtRXAtPnR5cGUgPT0gVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTCkKKwkJCW1FcC0+ZGlyID0gKG1FcC0+ZGlyID09IFRYKSA/IFJYIDogVFg7CisKKwl9IHdoaWxlIChtRXAtPmRpciAhPSBkaXJlY3Rpb24pOworCisJbUVwLT5kZXNjID0gTlVMTDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobUVwLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBlcF9hbGxvY19yZXF1ZXN0OiBhbGxvY2F0ZSBhIHJlcXVlc3Qgb2JqZWN0IHRvIHVzZSB3aXRoIHRoaXMgZW5kcG9pbnQKKyAqCisgKiBDaGVjayB1c2JfZXBfYWxsb2NfcmVxdWVzdCgpIGF0ICJ1c2JfZ2FkZ2V0LmgiIGZvciBkZXRhaWxzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX3JlcXVlc3QgKmVwX2FsbG9jX3JlcXVlc3Qoc3RydWN0IHVzYl9lcCAqZXAsIGdmcF90IGdmcF9mbGFncykKK3sKKwlzdHJ1Y3QgY2kxM3h4eF9lcCAgKm1FcCAgPSBjb250YWluZXJfb2YoZXAsIHN0cnVjdCBjaTEzeHh4X2VwLCBlcCk7CisJc3RydWN0IGNpMTN4eHhfcmVxICptUmVxID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJdHJhY2UoIiVwLCAlaSIsIGVwLCBnZnBfZmxhZ3MpOworCisJaWYgKGVwID09IE5VTEwpIHsKKwkJZXJyKCJFSU5WQUwiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUobUVwLT5sb2NrLCBmbGFncyk7CisKKwltUmVxID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNpMTN4eHhfcmVxKSwgZ2ZwX2ZsYWdzKTsKKwlpZiAobVJlcSAhPSBOVUxMKSB7CisJCUlOSVRfTElTVF9IRUFEKCZtUmVxLT5xdWV1ZSk7CisKKwkJbVJlcS0+cHRyID0gZG1hX3Bvb2xfYWxsb2MobUVwLT50ZF9wb29sLCBnZnBfZmxhZ3MsCisJCQkJCSAgICZtUmVxLT5kbWEpOworCQlpZiAobVJlcS0+cHRyID09IE5VTEwpIHsKKwkJCWtmcmVlKG1SZXEpOworCQkJbVJlcSA9IE5VTEw7CisJCX0KKwl9CisKKwlkYmdfZXZlbnQoX3VzYl9hZGRyKG1FcCksICJBTExPQyIsIG1SZXEgPT0gTlVMTCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKG1FcC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIChtUmVxID09IE5VTEwpID8gTlVMTCA6ICZtUmVxLT5yZXE7Cit9CisKKy8qKgorICogZXBfZnJlZV9yZXF1ZXN0OiBmcmVlcyBhIHJlcXVlc3Qgb2JqZWN0CisgKgorICogQ2hlY2sgdXNiX2VwX2ZyZWVfcmVxdWVzdCgpIGF0ICJ1c2JfZ2FkZ2V0LmgiIGZvciBkZXRhaWxzCisgKi8KK3N0YXRpYyB2b2lkIGVwX2ZyZWVfcmVxdWVzdChzdHJ1Y3QgdXNiX2VwICplcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IGNpMTN4eHhfZXAgICptRXAgID0gY29udGFpbmVyX29mKGVwLCAgc3RydWN0IGNpMTN4eHhfZXAsIGVwKTsKKwlzdHJ1Y3QgY2kxM3h4eF9yZXEgKm1SZXEgPSBjb250YWluZXJfb2YocmVxLCBzdHJ1Y3QgY2kxM3h4eF9yZXEsIHJlcSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXRyYWNlKCIlcCwgJXAiLCBlcCwgcmVxKTsKKworCWlmIChlcCA9PSBOVUxMIHx8IHJlcSA9PSBOVUxMKSB7CisJCWVycigiRUlOVkFMIik7CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKCFsaXN0X2VtcHR5KCZtUmVxLT5xdWV1ZSkpIHsKKwkJZXJyKCJFQlVTWSIpOworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUobUVwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAobVJlcS0+cHRyKQorCQlkbWFfcG9vbF9mcmVlKG1FcC0+dGRfcG9vbCwgbVJlcS0+cHRyLCBtUmVxLT5kbWEpOworCWtmcmVlKG1SZXEpOworCisJZGJnX2V2ZW50KF91c2JfYWRkcihtRXApLCAiRlJFRSIsIDApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShtRXAtPmxvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKiBlcF9xdWV1ZTogcXVldWVzIChzdWJtaXRzKSBhbiBJL08gcmVxdWVzdCB0byBhbiBlbmRwb2ludAorICoKKyAqIENoZWNrIHVzYl9lcF9xdWV1ZSgpKiBhdCB1c2JfZ2FkZ2V0LmgiIGZvciBkZXRhaWxzCisgKi8KK3N0YXRpYyBpbnQgZXBfcXVldWUoc3RydWN0IHVzYl9lcCAqZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxLAorCQkgICAgZ2ZwX3QgX19tYXliZV91bnVzZWQgZ2ZwX2ZsYWdzKQoreworCXN0cnVjdCBjaTEzeHh4X2VwICAqbUVwICA9IGNvbnRhaW5lcl9vZihlcCwgIHN0cnVjdCBjaTEzeHh4X2VwLCBlcCk7CisJc3RydWN0IGNpMTN4eHhfcmVxICptUmVxID0gY29udGFpbmVyX29mKHJlcSwgc3RydWN0IGNpMTN4eHhfcmVxLCByZXEpOworCWludCByZXR2YWwgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl0cmFjZSgiJXAsICVwLCAlWCIsIGVwLCByZXEsIGdmcF9mbGFncyk7CisKKwlpZiAoZXAgPT0gTlVMTCB8fCByZXEgPT0gTlVMTCB8fCBtRXAtPmRlc2MgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShtRXAtPmxvY2ssIGZsYWdzKTsKKworCWlmIChtRXAtPnR5cGUgPT0gVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTCAmJgorCSAgICAhbGlzdF9lbXB0eSgmbUVwLT5xaFttRXAtPmRpcl0ucXVldWUpKSB7CisJCV9lcF9udWtlKG1FcCk7CisJCXJldHZhbCA9IC1FT1ZFUkZMT1c7CisJCXdhcm4oImVuZHBvaW50IGN0cmwgJVggbnVrZWQiLCBfdXNiX2FkZHIobUVwKSk7CisJfQorCisJLyogZmlyc3QgbnVrZSB0aGVuIHRlc3QgbGluaywgZS5nLiBwcmV2aW91cyBzdGF0dXMgaGFzIG5vdCBzZW50ICovCisJaWYgKCFsaXN0X2VtcHR5KCZtUmVxLT5xdWV1ZSkpIHsKKwkJcmV0dmFsID0gLUVCVVNZOworCQllcnIoInJlcXVlc3QgYWxyZWFkeSBpbiBxdWV1ZSIpOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKHJlcS0+bGVuZ3RoID4gKDQgKiBQQUdFX1NJWkUpKSB7CisJCXJlcS0+bGVuZ3RoID0gKDQgKiBQQUdFX1NJWkUpOworCQlyZXR2YWwgPSAtRU1TR1NJWkU7CisJCXdhcm4oInJlcXVlc3QgbGVuZ3RoIHRydW5jYXRlZCIpOworCX0KKworCWRiZ19xdWV1ZShfdXNiX2FkZHIobUVwKSwgcmVxLCByZXR2YWwpOworCisJLyogcHVzaCByZXF1ZXN0ICovCisJbVJlcS0+cmVxLnN0YXR1cyA9IC1FSU5QUk9HUkVTUzsKKwltUmVxLT5yZXEuYWN0dWFsID0gMDsKKwlsaXN0X2FkZF90YWlsKCZtUmVxLT5xdWV1ZSwgJm1FcC0+cWhbbUVwLT5kaXJdLnF1ZXVlKTsKKworCXJldHZhbCA9IF9oYXJkd2FyZV9lbnF1ZXVlKG1FcCwgbVJlcSk7CisJaWYgKHJldHZhbCA9PSAtRUFMUkVBRFkgfHwgcmV0dmFsID09IC1FQlVTWSkgeworCQlkYmdfZXZlbnQoX3VzYl9hZGRyKG1FcCksICJRVUVVRSIsIHJldHZhbCk7CisJCXJldHZhbCA9IDA7CisJfQorCisgZG9uZToKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKG1FcC0+bG9jaywgZmxhZ3MpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogZXBfZGVxdWV1ZTogZGVxdWV1ZXMgKGNhbmNlbHMsIHVubGlua3MpIGFuIEkvTyByZXF1ZXN0IGZyb20gYW4gZW5kcG9pbnQKKyAqCisgKiBDaGVjayB1c2JfZXBfZGVxdWV1ZSgpIGF0ICJ1c2JfZ2FkZ2V0LmgiIGZvciBkZXRhaWxzCisgKi8KK3N0YXRpYyBpbnQgZXBfZGVxdWV1ZShzdHJ1Y3QgdXNiX2VwICplcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IGNpMTN4eHhfZXAgICptRXAgID0gY29udGFpbmVyX29mKGVwLCAgc3RydWN0IGNpMTN4eHhfZXAsIGVwKTsKKwlzdHJ1Y3QgY2kxM3h4eF9yZXEgKm1SZXEgPSBjb250YWluZXJfb2YocmVxLCBzdHJ1Y3QgY2kxM3h4eF9yZXEsIHJlcSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXRyYWNlKCIlcCwgJXAiLCBlcCwgcmVxKTsKKworCWlmIChlcCA9PSBOVUxMIHx8IHJlcSA9PSBOVUxMIHx8IG1FcC0+ZGVzYyA9PSBOVUxMIHx8CisJICAgIGxpc3RfZW1wdHkoJm1SZXEtPnF1ZXVlKSAgfHwgbGlzdF9lbXB0eSgmbUVwLT5xaFttRXAtPmRpcl0ucXVldWUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKG1FcC0+bG9jaywgZmxhZ3MpOworCisJZGJnX2V2ZW50KF91c2JfYWRkcihtRXApLCAiREVRVUVVRSIsIDApOworCisJaWYgKG1SZXEtPnJlcS5zdGF0dXMgPT0gLUVBTFJFQURZKQorCQlfaGFyZHdhcmVfZGVxdWV1ZShtRXAsIG1SZXEpOworCisJLyogcG9wIHJlcXVlc3QgKi8KKwlsaXN0X2RlbF9pbml0KCZtUmVxLT5xdWV1ZSk7CisJcmVxLT5zdGF0dXMgPSAtRUNPTk5SRVNFVDsKKworCWlmICghbVJlcS0+cmVxLm5vX2ludGVycnVwdCAmJiBtUmVxLT5yZXEuY29tcGxldGUgIT0gTlVMTCkgeworCQlzcGluX3VubG9jayhtRXAtPmxvY2spOworCQltUmVxLT5yZXEuY29tcGxldGUoJm1FcC0+ZXAsICZtUmVxLT5yZXEpOworCQlzcGluX2xvY2sobUVwLT5sb2NrKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKG1FcC0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGVwX3NldF9oYWx0OiBzZXRzIHRoZSBlbmRwb2ludCBoYWx0IGZlYXR1cmUKKyAqCisgKiBDaGVjayB1c2JfZXBfc2V0X2hhbHQoKSBhdCAidXNiX2dhZGdldC5oIiBmb3IgZGV0YWlscworICovCitzdGF0aWMgaW50IGVwX3NldF9oYWx0KHN0cnVjdCB1c2JfZXAgKmVwLCBpbnQgdmFsdWUpCit7CisJc3RydWN0IGNpMTN4eHhfZXAgKm1FcCA9IGNvbnRhaW5lcl9vZihlcCwgc3RydWN0IGNpMTN4eHhfZXAsIGVwKTsKKwlpbnQgZGlyZWN0aW9uLCByZXR2YWwgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl0cmFjZSgiJXAsICVpIiwgZXAsIHZhbHVlKTsKKworCWlmIChlcCA9PSBOVUxMIHx8IG1FcC0+ZGVzYyA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKG1FcC0+bG9jaywgZmxhZ3MpOworCisjaWZuZGVmIFNUQUxMX0lOCisJLyogZ19maWxlX3N0b3JhZ2UgTVMgY29tcGxpYW50IGJ1dCBnX3plcm8gZmFpbHMgY2hhcHRlciA5IGNvbXBsaWFuY2UgKi8KKwlpZiAodmFsdWUgJiYgbUVwLT50eXBlID09IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEsgJiYgbUVwLT5kaXIgPT0gVFggJiYKKwkgICAgIWxpc3RfZW1wdHkoJm1FcC0+cWhbbUVwLT5kaXJdLnF1ZXVlKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKG1FcC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisjZW5kaWYKKworCWRpcmVjdGlvbiA9IG1FcC0+ZGlyOworCWRvIHsKKwkJZGJnX2V2ZW50KF91c2JfYWRkcihtRXApLCAiSEFMVCIsIHZhbHVlKTsKKwkJcmV0dmFsIHw9IGh3X2VwX3NldF9oYWx0KG1FcC0+bnVtLCBtRXAtPmRpciwgdmFsdWUpOworCisJCWlmICghdmFsdWUpCisJCQltRXAtPndlZGdlID0gMDsKKworCQlpZiAobUVwLT50eXBlID09IFVTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0wpCisJCQltRXAtPmRpciA9IChtRXAtPmRpciA9PSBUWCkgPyBSWCA6IFRYOworCisJfSB3aGlsZSAobUVwLT5kaXIgIT0gZGlyZWN0aW9uKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobUVwLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBlcF9zZXRfd2VkZ2U6IHNldHMgdGhlIGhhbHQgZmVhdHVyZSBhbmQgaWdub3JlcyBjbGVhciByZXF1ZXN0cworICoKKyAqIENoZWNrIHVzYl9lcF9zZXRfd2VkZ2UoKSBhdCAidXNiX2dhZGdldC5oIiBmb3IgZGV0YWlscworICovCitzdGF0aWMgaW50IGVwX3NldF93ZWRnZShzdHJ1Y3QgdXNiX2VwICplcCkKK3sKKwlzdHJ1Y3QgY2kxM3h4eF9lcCAqbUVwID0gY29udGFpbmVyX29mKGVwLCBzdHJ1Y3QgY2kxM3h4eF9lcCwgZXApOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl0cmFjZSgiJXAiLCBlcCk7CisKKwlpZiAoZXAgPT0gTlVMTCB8fCBtRXAtPmRlc2MgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShtRXAtPmxvY2ssIGZsYWdzKTsKKworCWRiZ19ldmVudChfdXNiX2FkZHIobUVwKSwgIldFREdFIiwgMCk7CisJbUVwLT53ZWRnZSA9IDE7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKG1FcC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHVzYl9lcF9zZXRfaGFsdChlcCk7Cit9CisKKy8qKgorICogZXBfZmlmb19mbHVzaDogZmx1c2hlcyBjb250ZW50cyBvZiBhIGZpZm8KKyAqCisgKiBDaGVjayB1c2JfZXBfZmlmb19mbHVzaCgpIGF0ICJ1c2JfZ2FkZ2V0LmgiIGZvciBkZXRhaWxzCisgKi8KK3N0YXRpYyB2b2lkIGVwX2ZpZm9fZmx1c2goc3RydWN0IHVzYl9lcCAqZXApCit7CisJc3RydWN0IGNpMTN4eHhfZXAgKm1FcCA9IGNvbnRhaW5lcl9vZihlcCwgc3RydWN0IGNpMTN4eHhfZXAsIGVwKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJdHJhY2UoIiVwIiwgZXApOworCisJaWYgKGVwID09IE5VTEwpIHsKKwkJZXJyKCIlMDJYOiAtRUlOVkFMIiwgX3VzYl9hZGRyKG1FcCkpOworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUobUVwLT5sb2NrLCBmbGFncyk7CisKKwlkYmdfZXZlbnQoX3VzYl9hZGRyKG1FcCksICJGRkxVU0giLCAwKTsKKwlod19lcF9mbHVzaChtRXAtPm51bSwgbUVwLT5kaXIpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShtRXAtPmxvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKiBFbmRwb2ludC1zcGVjaWZpYyBwYXJ0IG9mIHRoZSBBUEkgdG8gdGhlIFVTQiBjb250cm9sbGVyIGhhcmR3YXJlCisgKiBDaGVjayAidXNiX2dhZGdldC5oIiBmb3IgZGV0YWlscworICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9lcF9vcHMgdXNiX2VwX29wcyA9IHsKKwkuZW5hYmxlCSAgICAgICA9IGVwX2VuYWJsZSwKKwkuZGlzYWJsZSAgICAgICA9IGVwX2Rpc2FibGUsCisJLmFsbG9jX3JlcXVlc3QgPSBlcF9hbGxvY19yZXF1ZXN0LAorCS5mcmVlX3JlcXVlc3QgID0gZXBfZnJlZV9yZXF1ZXN0LAorCS5xdWV1ZQkgICAgICAgPSBlcF9xdWV1ZSwKKwkuZGVxdWV1ZSAgICAgICA9IGVwX2RlcXVldWUsCisJLnNldF9oYWx0ICAgICAgPSBlcF9zZXRfaGFsdCwKKwkuc2V0X3dlZGdlICAgICA9IGVwX3NldF93ZWRnZSwKKwkuZmlmb19mbHVzaCAgICA9IGVwX2ZpZm9fZmx1c2gsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBHQURHRVQgYmxvY2sKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogRGV2aWNlIG9wZXJhdGlvbnMgcGFydCBvZiB0aGUgQVBJIHRvIHRoZSBVU0IgY29udHJvbGxlciBoYXJkd2FyZSwKKyAqIHdoaWNoIGRvbid0IGludm9sdmUgZW5kcG9pbnRzIChvciBpL28pCisgKiBDaGVjayAgInVzYl9nYWRnZXQuaCIgZm9yIGRldGFpbHMKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZ2FkZ2V0X29wcyB1c2JfZ2FkZ2V0X29wczsKKworLyoqCisgKiB1c2JfZ2FkZ2V0X3JlZ2lzdGVyX2RyaXZlcjogcmVnaXN0ZXIgYSBnYWRnZXQgZHJpdmVyCisgKgorICogQ2hlY2sgdXNiX2dhZGdldF9yZWdpc3Rlcl9kcml2ZXIoKSBhdCAidXNiX2dhZGdldC5oIiBmb3IgZGV0YWlscworICogSW50ZXJydXB0cyBhcmUgZW5hYmxlZCBoZXJlCisgKi8KK2ludCB1c2JfZ2FkZ2V0X3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlcikKK3sKKwlzdHJ1Y3QgY2kxM3h4eCAqdWRjID0gX3VkYzsKKwl1bnNpZ25lZCBsb25nIGksIGssIGZsYWdzOworCWludCByZXR2YWwgPSAtRU5PTUVNOworCisJdHJhY2UoIiVwIiwgZHJpdmVyKTsKKworCWlmIChkcml2ZXIgICAgICAgICAgICAgPT0gTlVMTCB8fAorCSAgICBkcml2ZXItPmJpbmQgICAgICAgPT0gTlVMTCB8fAorCSAgICBkcml2ZXItPnVuYmluZCAgICAgPT0gTlVMTCB8fAorCSAgICBkcml2ZXItPnNldHVwICAgICAgPT0gTlVMTCB8fAorCSAgICBkcml2ZXItPmRpc2Nvbm5lY3QgPT0gTlVMTCB8fAorCSAgICBkcml2ZXItPnN1c3BlbmQgICAgPT0gTlVMTCB8fAorCSAgICBkcml2ZXItPnJlc3VtZSAgICAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZWxzZSBpZiAodWRjICAgICAgICAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJZWxzZSBpZiAodWRjLT5kcml2ZXIgIT0gTlVMTCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qIGFsbG9jIHJlc291cmNlcyAqLworCXVkYy0+cWhfcG9vbCA9IGRtYV9wb29sX2NyZWF0ZSgiY2kxM3h4eF9xaCIsICZ1ZGMtPmdhZGdldC5kZXYsCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgY2kxM3h4eF9xaCksCisJCQkJICAgICAgIDY0LCBQQUdFX1NJWkUpOworCWlmICh1ZGMtPnFoX3Bvb2wgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl1ZGMtPnRkX3Bvb2wgPSBkbWFfcG9vbF9jcmVhdGUoImNpMTN4eHhfdGQiLCAmdWRjLT5nYWRnZXQuZGV2LAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGNpMTN4eHhfdGQpLAorCQkJCSAgICAgICA2NCwgUEFHRV9TSVpFKTsKKwlpZiAodWRjLT50ZF9wb29sID09IE5VTEwpIHsKKwkJZG1hX3Bvb2xfZGVzdHJveSh1ZGMtPnFoX3Bvb2wpOworCQl1ZGMtPnFoX3Bvb2wgPSBOVUxMOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSh1ZGMtPmxvY2ssIGZsYWdzKTsKKworCWluZm8oImh3X2VwX21heCA9ICVkIiwgaHdfZXBfbWF4KTsKKworCXVkYy0+ZHJpdmVyID0gZHJpdmVyOworCXVkYy0+Z2FkZ2V0Lm9wcyAgICAgICAgPSBOVUxMOworCXVkYy0+Z2FkZ2V0LmRldi5kcml2ZXIgPSBOVUxMOworCisJcmV0dmFsID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgaHdfZXBfbWF4OyBpKyspIHsKKwkJc3RydWN0IGNpMTN4eHhfZXAgKm1FcCA9ICZ1ZGMtPmNpMTN4eHhfZXBbaV07CisKKwkJc2NucHJpbnRmKG1FcC0+bmFtZSwgc2l6ZW9mKG1FcC0+bmFtZSksICJlcCVpIiwgKGludClpKTsKKworCQltRXAtPmxvY2sgICAgICAgICA9IHVkYy0+bG9jazsKKwkJbUVwLT5kZXZpY2UgICAgICAgPSAmdWRjLT5nYWRnZXQuZGV2OworCQltRXAtPnRkX3Bvb2wgICAgICA9IHVkYy0+dGRfcG9vbDsKKworCQltRXAtPmVwLm5hbWUgICAgICA9IG1FcC0+bmFtZTsKKwkJbUVwLT5lcC5vcHMgICAgICAgPSAmdXNiX2VwX29wczsKKwkJbUVwLT5lcC5tYXhwYWNrZXQgPSBDVFJMX1BBWUxPQURfTUFYOworCisJCS8qIHRoaXMgYWxsb2NhdGlvbiBjYW5ub3QgYmUgcmFuZG9tICovCisJCWZvciAoayA9IFJYOyBrIDw9IFRYOyBrKyspIHsKKwkJCUlOSVRfTElTVF9IRUFEKCZtRXAtPnFoW2tdLnF1ZXVlKTsKKwkJCW1FcC0+cWhba10ucHRyID0gZG1hX3Bvb2xfYWxsb2ModWRjLT5xaF9wb29sLAorCQkJCQkJCUdGUF9LRVJORUwsCisJCQkJCQkJJm1FcC0+cWhba10uZG1hKTsKKwkJCWlmIChtRXAtPnFoW2tdLnB0ciA9PSBOVUxMKQorCQkJCXJldHZhbCA9IC1FTk9NRU07CisJCQllbHNlCisJCQkJbWVtc2V0KG1FcC0+cWhba10ucHRyLCAwLAorCQkJCSAgICAgICBzaXplb2YoKm1FcC0+cWhba10ucHRyKSk7CisJCX0KKwkJaWYgKGkgPT0gMCkKKwkJCXVkYy0+Z2FkZ2V0LmVwMCA9ICZtRXAtPmVwOworCQllbHNlCisJCQlsaXN0X2FkZF90YWlsKCZtRXAtPmVwLmVwX2xpc3QsICZ1ZGMtPmdhZGdldC5lcF9saXN0KTsKKwl9CisJaWYgKHJldHZhbCkKKwkJZ290byBkb25lOworCisJLyogYmluZCBnYWRnZXQgKi8KKwlkcml2ZXItPmRyaXZlci5idXMgICAgID0gTlVMTDsKKwl1ZGMtPmdhZGdldC5vcHMgICAgICAgID0gJnVzYl9nYWRnZXRfb3BzOworCXVkYy0+Z2FkZ2V0LmRldi5kcml2ZXIgPSAmZHJpdmVyLT5kcml2ZXI7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHVkYy0+bG9jaywgZmxhZ3MpOworCXJldHZhbCA9IGRyaXZlci0+YmluZCgmdWRjLT5nYWRnZXQpOyAgICAgICAgICAgICAgICAvKiBNQVkgU0xFRVAgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSh1ZGMtPmxvY2ssIGZsYWdzKTsKKworCWlmIChyZXR2YWwpIHsKKwkJdWRjLT5nYWRnZXQub3BzICAgICAgICA9IE5VTEw7CisJCXVkYy0+Z2FkZ2V0LmRldi5kcml2ZXIgPSBOVUxMOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0dmFsID0gaHdfZGV2aWNlX3N0YXRlKHVkYy0+Y2kxM3h4eF9lcFswXS5xaFtSWF0uZG1hKTsKKworIGRvbmU6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh1ZGMtPmxvY2ssIGZsYWdzKTsKKwlpZiAocmV0dmFsKQorCQl1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyKGRyaXZlcik7CisJcmV0dXJuIHJldHZhbDsKK30KK0VYUE9SVF9TWU1CT0wodXNiX2dhZGdldF9yZWdpc3Rlcl9kcml2ZXIpOworCisvKioKKyAqIHVzYl9nYWRnZXRfdW5yZWdpc3Rlcl9kcml2ZXI6IHVucmVnaXN0ZXIgYSBnYWRnZXQgZHJpdmVyCisgKgorICogQ2hlY2sgdXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlcigpIGF0ICJ1c2JfZ2FkZ2V0LmgiIGZvciBkZXRhaWxzCisgKi8KK2ludCB1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQoreworCXN0cnVjdCBjaTEzeHh4ICp1ZGMgPSBfdWRjOworCXVuc2lnbmVkIGxvbmcgaSwgaywgZmxhZ3M7CisKKwl0cmFjZSgiJXAiLCBkcml2ZXIpOworCisJaWYgKGRyaXZlciAgICAgICAgICAgICA9PSBOVUxMIHx8CisJICAgIGRyaXZlci0+YmluZCAgICAgICA9PSBOVUxMIHx8CisJICAgIGRyaXZlci0+dW5iaW5kICAgICA9PSBOVUxMIHx8CisJICAgIGRyaXZlci0+c2V0dXAgICAgICA9PSBOVUxMIHx8CisJICAgIGRyaXZlci0+ZGlzY29ubmVjdCA9PSBOVUxMIHx8CisJICAgIGRyaXZlci0+c3VzcGVuZCAgICA9PSBOVUxMIHx8CisJICAgIGRyaXZlci0+cmVzdW1lICAgICA9PSBOVUxMIHx8CisJICAgIGRyaXZlciAgICAgICAgICAgICAhPSB1ZGMtPmRyaXZlcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSh1ZGMtPmxvY2ssIGZsYWdzKTsKKworCWh3X2RldmljZV9zdGF0ZSgwKTsKKworCS8qIHVuYmluZCBnYWRnZXQgKi8KKwlpZiAodWRjLT5nYWRnZXQub3BzICE9IE5VTEwpIHsKKwkJX2dhZGdldF9zdG9wX2FjdGl2aXR5KCZ1ZGMtPmdhZGdldCk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh1ZGMtPmxvY2ssIGZsYWdzKTsKKwkJZHJpdmVyLT51bmJpbmQoJnVkYy0+Z2FkZ2V0KTsgICAgICAgICAgICAgICAvKiBNQVkgU0xFRVAgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUodWRjLT5sb2NrLCBmbGFncyk7CisKKwkJdWRjLT5nYWRnZXQub3BzICAgICAgICA9IE5VTEw7CisJCXVkYy0+Z2FkZ2V0LmRldi5kcml2ZXIgPSBOVUxMOworCX0KKworCS8qIGZyZWUgcmVzb3VyY2VzICovCisJZm9yIChpID0gMDsgaSA8IGh3X2VwX21heDsgaSsrKSB7CisJCXN0cnVjdCBjaTEzeHh4X2VwICptRXAgPSAmdWRjLT5jaTEzeHh4X2VwW2ldOworCisJCWlmIChpID09IDApCisJCQl1ZGMtPmdhZGdldC5lcDAgPSBOVUxMOworCQllbHNlIGlmICghbGlzdF9lbXB0eSgmbUVwLT5lcC5lcF9saXN0KSkKKwkJCWxpc3RfZGVsX2luaXQoJm1FcC0+ZXAuZXBfbGlzdCk7CisKKwkJZm9yIChrID0gUlg7IGsgPD0gVFg7IGsrKykKKwkJCWlmIChtRXAtPnFoW2tdLnB0ciAhPSBOVUxMKQorCQkJCWRtYV9wb29sX2ZyZWUodWRjLT5xaF9wb29sLAorCQkJCQkgICAgICBtRXAtPnFoW2tdLnB0ciwgbUVwLT5xaFtrXS5kbWEpOworCX0KKworCXVkYy0+ZHJpdmVyID0gTlVMTDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodWRjLT5sb2NrLCBmbGFncyk7CisKKwlpZiAodWRjLT50ZF9wb29sICE9IE5VTEwpIHsKKwkJZG1hX3Bvb2xfZGVzdHJveSh1ZGMtPnRkX3Bvb2wpOworCQl1ZGMtPnRkX3Bvb2wgPSBOVUxMOworCX0KKwlpZiAodWRjLT5xaF9wb29sICE9IE5VTEwpIHsKKwkJZG1hX3Bvb2xfZGVzdHJveSh1ZGMtPnFoX3Bvb2wpOworCQl1ZGMtPnFoX3Bvb2wgPSBOVUxMOworCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQlVTIGJsb2NrCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIHVkY19pcnE6IGdsb2JhbCBpbnRlcnJ1cHQgaGFuZGxlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBJUlFfSEFORExFRCBpZiB0aGUgSVJRIGhhcyBiZWVuIGhhbmRsZWQKKyAqIEl0IGxvY2tzIGFjY2VzcyB0byByZWdpc3RlcnMKKyAqLworc3RhdGljIGlycXJldHVybl90IHVkY19pcnEodm9pZCkKK3sKKwlzdHJ1Y3QgY2kxM3h4eCAqdWRjID0gX3VkYzsKKwlpcnFyZXR1cm5fdCByZXR2YWw7CisJdTMyIGludHI7CisKKwl0cmFjZSgpOworCisJaWYgKHVkYyA9PSBOVUxMKSB7CisJCWVycigiRU5PREVWIik7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlzcGluX2xvY2sodWRjLT5sb2NrKTsKKwlpbnRyID0gaHdfdGVzdF9hbmRfY2xlYXJfaW50cl9hY3RpdmUoKTsKKwlpZiAoaW50cikgeworCQlpc3Jfc3RhdGlzdGljcy5obmRsLmJ1Zltpc3Jfc3RhdGlzdGljcy5obmRsLmlkeCsrXSA9IGludHI7CisJCWlzcl9zdGF0aXN0aWNzLmhuZGwuaWR4ICY9IElTUl9NQVNLOworCQlpc3Jfc3RhdGlzdGljcy5obmRsLmNudCsrOworCisJCS8qIG9yZGVyIGRlZmluZXMgcHJpb3JpdHkgLSBkbyBOT1QgY2hhbmdlIGl0ICovCisJCWlmIChVU0JpX1VSSSAmIGludHIpIHsKKwkJCWlzcl9zdGF0aXN0aWNzLnVyaSsrOworCQkJaXNyX3Jlc2V0X2hhbmRsZXIodWRjKTsKKwkJfQorCQlpZiAoVVNCaV9QQ0kgJiBpbnRyKSB7CisJCQlpc3Jfc3RhdGlzdGljcy5wY2krKzsKKwkJCXVkYy0+Z2FkZ2V0LnNwZWVkID0gaHdfcG9ydF9pc19oaWdoX3NwZWVkKCkgPworCQkJCVVTQl9TUEVFRF9ISUdIIDogVVNCX1NQRUVEX0ZVTEw7CisJCX0KKwkJaWYgKFVTQmlfVUVJICYgaW50cikKKwkJCWlzcl9zdGF0aXN0aWNzLnVlaSsrOworCQlpZiAoVVNCaV9VSSAgJiBpbnRyKSB7CisJCQlpc3Jfc3RhdGlzdGljcy51aSsrOworCQkJaXNyX3RyX2NvbXBsZXRlX2hhbmRsZXIodWRjKTsKKwkJfQorCQlpZiAoVVNCaV9TTEkgJiBpbnRyKQorCQkJaXNyX3N0YXRpc3RpY3Muc2xpKys7CisJCXJldHZhbCA9IElSUV9IQU5ETEVEOworCX0gZWxzZSB7CisJCWlzcl9zdGF0aXN0aWNzLm5vbmUrKzsKKwkJcmV0dmFsID0gSVJRX05PTkU7CisJfQorCXNwaW5fdW5sb2NrKHVkYy0+bG9jayk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIHVkY19yZWxlYXNlOiBkcml2ZXIgcmVsZWFzZSBmdW5jdGlvbgorICogQGRldjogZGV2aWNlCisgKgorICogQ3VycmVudGx5IGRvZXMgbm90aGluZworICovCitzdGF0aWMgdm9pZCB1ZGNfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJdHJhY2UoIiVwIiwgZGV2KTsKKworCWlmIChkZXYgPT0gTlVMTCkKKwkJZXJyKCJFSU5WQUwiKTsKK30KKworLyoqCisgKiB1ZGNfcHJvYmU6IHBhcmVudCBwcm9iZSBtdXN0IGNhbGwgdGhpcyB0byBpbml0aWFsaXplIFVEQworICogQGRldjogIHBhcmVudCBkZXZpY2UKKyAqIEByZWdzOiByZWdpc3RlcnMgYmFzZSBhZGRyZXNzCisgKiBAbmFtZTogZHJpdmVyIG5hbWUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQorICogTm8gaW50ZXJydXB0cyBhY3RpdmUsIHRoZSBJUlEgaGFzIG5vdCBiZWVuIHJlcXVlc3RlZCB5ZXQKKyAqIEtlcm5lbCBhc3N1bWVzIDMyLWJpdCBETUEgb3BlcmF0aW9ucyBieSBkZWZhdWx0LCBubyBuZWVkIHRvIGRtYV9zZXRfbWFzaworICovCitzdGF0aWMgaW50IHVkY19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgX19pb21lbSAqcmVncywgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgY2kxM3h4eCAqdWRjOworCWludCByZXR2YWwgPSAwOworCisJdHJhY2UoIiVwLCAlcCwgJXAiLCBkZXYsIHJlZ3MsIG5hbWUpOworCisJaWYgKGRldiA9PSBOVUxMIHx8IHJlZ3MgPT0gTlVMTCB8fCBuYW1lID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJdWRjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNpMTN4eHgpLCBHRlBfS0VSTkVMKTsKKwlpZiAodWRjID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJdWRjLT5sb2NrID0gJnVkY19sb2NrOworCisJcmV0dmFsID0gaHdfZGV2aWNlX3Jlc2V0KHJlZ3MpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZG9uZTsKKworCXVkYy0+Z2FkZ2V0Lm9wcyAgICAgICAgICA9IE5VTEw7CisJdWRjLT5nYWRnZXQuc3BlZWQgICAgICAgID0gVVNCX1NQRUVEX1VOS05PV047CisJdWRjLT5nYWRnZXQuaXNfZHVhbHNwZWVkID0gMTsKKwl1ZGMtPmdhZGdldC5pc19vdGcgICAgICAgPSAwOworCXVkYy0+Z2FkZ2V0Lm5hbWUgICAgICAgICA9IG5hbWU7CisKKwlJTklUX0xJU1RfSEVBRCgmdWRjLT5nYWRnZXQuZXBfbGlzdCk7CisJdWRjLT5nYWRnZXQuZXAwID0gTlVMTDsKKworCXN0cmNweSh1ZGMtPmdhZGdldC5kZXYuYnVzX2lkLCAiZ2FkZ2V0Iik7CisJdWRjLT5nYWRnZXQuZGV2LmRtYV9tYXNrID0gZGV2LT5kbWFfbWFzazsKKwl1ZGMtPmdhZGdldC5kZXYucGFyZW50ICAgPSBkZXY7CisJdWRjLT5nYWRnZXQuZGV2LnJlbGVhc2UgID0gdWRjX3JlbGVhc2U7CisKKwlyZXR2YWwgPSBkZXZpY2VfcmVnaXN0ZXIoJnVkYy0+Z2FkZ2V0LmRldik7CisJaWYgKHJldHZhbCkKKwkJZ290byBkb25lOworCisjaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfREVCVUdfRklMRVMKKwlyZXR2YWwgPSBkYmdfY3JlYXRlX2ZpbGVzKCZ1ZGMtPmdhZGdldC5kZXYpOworI2VuZGlmCisJaWYgKHJldHZhbCkgeworCQlkZXZpY2VfdW5yZWdpc3RlcigmdWRjLT5nYWRnZXQuZGV2KTsKKwkJZ290byBkb25lOworCX0KKworCV91ZGMgPSB1ZGM7CisJcmV0dXJuIHJldHZhbDsKKworIGRvbmU6CisJZXJyKCJlcnJvciA9ICVpIiwgcmV0dmFsKTsKKwlrZnJlZSh1ZGMpOworCV91ZGMgPSBOVUxMOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogdWRjX3JlbW92ZTogcGFyZW50IHJlbW92ZSBtdXN0IGNhbGwgdGhpcyB0byByZW1vdmUgVURDCisgKgorICogTm8gaW50ZXJydXB0cyBhY3RpdmUsIHRoZSBJUlEgaGFzIGJlZW4gcmVsZWFzZWQKKyAqLworc3RhdGljIHZvaWQgdWRjX3JlbW92ZSh2b2lkKQoreworCXN0cnVjdCBjaTEzeHh4ICp1ZGMgPSBfdWRjOworCisJaWYgKHVkYyA9PSBOVUxMKSB7CisJCWVycigiRUlOVkFMIik7CisJCXJldHVybjsKKwl9CisKKyNpZmRlZiBDT05GSUdfVVNCX0dBREdFVF9ERUJVR19GSUxFUworCWRiZ19yZW1vdmVfZmlsZXMoJnVkYy0+Z2FkZ2V0LmRldik7CisjZW5kaWYKKwlkZXZpY2VfdW5yZWdpc3RlcigmdWRjLT5nYWRnZXQuZGV2KTsKKworCWtmcmVlKHVkYyk7CisJX3VkYyA9IE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBDSSBibG9jaworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBjaTEzeHh4X3BjaV9pcnE6IGludGVycnV0IGhhbmRsZXIKKyAqIEBpcnE6ICBpcnEgbnVtYmVyCisgKiBAcGRldjogVVNCIERldmljZSBDb250cm9sbGVyIGludGVycnVwdCBzb3VyY2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgSVJRX0hBTkRMRUQgaWYgdGhlIElSUSBoYXMgYmVlbiBoYW5kbGVkCisgKiBUaGlzIGlzIGFuIElTUiBkb24ndCB0cmFjZSwgdXNlIGF0dHJpYnV0ZSBpbnRlcmZhY2UgaW5zdGVhZAorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgY2kxM3h4eF9wY2lfaXJxKGludCBpcnEsIHZvaWQgKnBkZXYpCit7CisJaWYgKGlycSA9PSAwKSB7CisJCWRldl9lcnIoJigoc3RydWN0IHBjaV9kZXYgKilwZGV2KS0+ZGV2LCAiSW52YWxpZCBJUlEwIHVzYWdlISIpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCXJldHVybiB1ZGNfaXJxKCk7Cit9CisKKy8qKgorICogY2kxM3h4eF9wY2lfcHJvYmU6IFBDSSBwcm9iZQorICogQHBkZXY6IFVTQiBkZXZpY2UgY29udHJvbGxlciBiZWluZyBwcm9iZWQKKyAqIEBpZDogICBQQ0kgaG90cGx1ZyBJRCBjb25uZWN0aW5nIGNvbnRyb2xsZXIgdG8gVURDIGZyYW1ld29yaworICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCisgKiBBbGxvY2F0ZXMgYmFzaWMgUENJIHJlc291cmNlcyBmb3IgdGhpcyBVU0IgZGV2aWNlIGNvbnRyb2xsZXIsIGFuZCB0aGVuCisgKiBpbnZva2VzIHRoZSB1ZGNfcHJvYmUoKSBtZXRob2QgdG8gc3RhcnQgdGhlIFVEQyBhc3NvY2lhdGVkIHdpdGggaXQKKyAqLworc3RhdGljIGludCBfX2RldmluaXQgY2kxM3h4eF9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwl2b2lkIF9faW9tZW0gKnJlZ3MgPSBOVUxMOworCWludCByZXR2YWwgPSAwOworCisJaWYgKGlkID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dmFsID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJldHZhbCkKKwkJZ290byBkb25lOworCisJaWYgKCFwZGV2LT5pcnEpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gSVJRLCBjaGVjayBCSU9TL1BDSSBzZXR1cCEiKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBkaXNhYmxlX2RldmljZTsKKwl9CisKKwlyZXR2YWwgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIFVEQ19EUklWRVJfTkFNRSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBkaXNhYmxlX2RldmljZTsKKworCS8qIEJBUiAwIGhvbGRzIGFsbCB0aGUgcmVnaXN0ZXJzICovCisJcmVncyA9IHBjaV9pb21hcChwZGV2LCAwLCAwKTsKKwlpZiAoIXJlZ3MpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRXJyb3IgbWFwcGluZyBtZW1vcnkhIik7CisJCXJldHZhbCA9IC1FRkFVTFQ7CisJCWdvdG8gcmVsZWFzZV9yZWdpb25zOworCX0KKwlwY2lfc2V0X2RydmRhdGEocGRldiwgKF9fZm9yY2Ugdm9pZCAqKXJlZ3MpOworCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisJcGNpX3RyeV9zZXRfbXdpKHBkZXYpOworCisJcmV0dmFsID0gdWRjX3Byb2JlKCZwZGV2LT5kZXYsIHJlZ3MsIFVEQ19EUklWRVJfTkFNRSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBpb3VubWFwOworCisJLyogb3VyIGRldmljZSBkb2VzIG5vdCBoYXZlIE1TSSBjYXBhYmlsaXR5ICovCisKKwlyZXR2YWwgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsIGNpMTN4eHhfcGNpX2lycSwgSVJRRl9TSEFSRUQsCisJCQkgICAgIFVEQ19EUklWRVJfTkFNRSwgcGRldik7CisJaWYgKHJldHZhbCkKKwkJZ290byBnYWRnZXRfcmVtb3ZlOworCisJcmV0dXJuIDA7CisKKyBnYWRnZXRfcmVtb3ZlOgorCXVkY19yZW1vdmUoKTsKKyBpb3VubWFwOgorCXBjaV9pb3VubWFwKHBkZXYsIHJlZ3MpOworIHJlbGVhc2VfcmVnaW9uczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworIGRpc2FibGVfZGV2aWNlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKyBkb25lOgorCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogY2kxM3h4eF9wY2lfcmVtb3ZlOiBQQ0kgcmVtb3ZlCisgKiBAcGRldjogVVNCIERldmljZSBDb250cm9sbGVyIGJlaW5nIHJlbW92ZWQKKyAqCisgKiBSZXZlcnNlcyB0aGUgZWZmZWN0IG9mIGNpMTN4eHhfcGNpX3Byb2JlKCksCisgKiBmaXJzdCBpbnZva2luZyB0aGUgdWRjX3JlbW92ZSgpIGFuZCB0aGVuIHJlbGVhc2VzCisgKiBhbGwgUENJIHJlc291cmNlcyBhbGxvY2F0ZWQgZm9yIHRoaXMgVVNCIGRldmljZSBjb250cm9sbGVyCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBjaTEzeHh4X3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJZnJlZV9pcnEocGRldi0+aXJxLCBwZGV2KTsKKwl1ZGNfcmVtb3ZlKCk7CisJcGNpX2lvdW5tYXAocGRldiwgKF9fZm9yY2Ugdm9pZCBfX2lvbWVtICopcGNpX2dldF9kcnZkYXRhKHBkZXYpKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK30KKworLyoqCisgKiBQQ0kgZGV2aWNlIHRhYmxlCisgKiBQQ0kgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIENoZWNrICJwY2kuaCIgZm9yIGRldGFpbHMKKyAqLworc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGNpMTN4eHhfcGNpX2lkX3RhYmxlKSA9IHsKKwl7IFBDSV9ERVZJQ0UoMHgxNTNGLCAweDEwMDQpIH0sCisJeyBQQ0lfREVWSUNFKDB4MTUzRiwgMHgxMDA2KSB9LAorCXsgMCwgMCwgMCwgMCwgMCwgMCwgMCAvKiBlbmQ6IGFsbCB6ZXJvZXMgKi8gfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBjaTEzeHh4X3BjaV9pZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBjaTEzeHh4X3BjaV9kcml2ZXIgPSB7CisJLm5hbWUgICAgICAgICA9CVVEQ19EUklWRVJfTkFNRSwKKwkuaWRfdGFibGUgICAgID0JY2kxM3h4eF9wY2lfaWRfdGFibGUsCisJLnByb2JlICAgICAgICA9CWNpMTN4eHhfcGNpX3Byb2JlLAorCS5yZW1vdmUgICAgICAgPQlfX2RldmV4aXRfcChjaTEzeHh4X3BjaV9yZW1vdmUpLAorfTsKKworLyoqCisgKiBjaTEzeHh4X3BjaV9pbml0OiBtb2R1bGUgaW5pdAorICoKKyAqIERyaXZlciBsb2FkCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGNpMTN4eHhfcGNpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmY2kxM3h4eF9wY2lfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGNpMTN4eHhfcGNpX2luaXQpOworCisvKioKKyAqIGNpMTN4eHhfcGNpX2V4aXQ6IG1vZHVsZSBleGl0CisgKgorICogRHJpdmVyIHVubG9hZAorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgY2kxM3h4eF9wY2lfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmY2kxM3h4eF9wY2lfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGNpMTN4eHhfcGNpX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNSVBTIC0gRGF2aWQgTG9wbyA8ZGxvcG9AY2hpcGlkZWEubWlwcy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1JUFMgQ0kxM1hYWCBVU0IgUGVyaXBoZXJhbCBDb250cm9sbGVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTigiSnVuZSAyMDA4Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvY2kxM3h4eF91ZGMuaCBiL2RyaXZlcnMvdXNiL2dhZGdldC9jaTEzeHh4X3VkYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMjZlOWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvY2kxM3h4eF91ZGMuaApAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqIGNpMTN4eHhfdWRjLmggLSBzdHJ1Y3R1cmVzLCByZWdpc3RlcnMsIGFuZCBtYWNyb3MgTUlQUyBVU0IgSVAgY29yZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBDaGlwaWRlYSAtIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQXV0aG9yOiBEYXZpZCBMb3BvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBEZXNjcmlwdGlvbjogTUlQUyBVU0IgSVAgY29yZSBmYW1pbHkgZGV2aWNlIGNvbnRyb2xsZXIKKyAqICAgICAgICAgICAgICBTdHJ1Y3R1cmVzLCByZWdpc3RlcnMgYW5kIGxvZ2dpbmcgbWFjcm9zCisgKi8KKworI2lmbmRlZiBfQ0kxM1hYWF9oXworI2RlZmluZSBfQ0kxM1hYWF9oXworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBERUZJTkUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgRU5EUFRfTUFYICAgICAgICAgICgxNikKKyNkZWZpbmUgQ1RSTF9QQVlMT0FEX01BWCAgICg2NCkKKyNkZWZpbmUgUlggICAgICAgICgwKSAgLyogc2ltaWxhciB0byBVU0JfRElSX09VVCBidXQgY2FuIGJlIHVzZWQgYXMgYW4gaW5kZXggKi8KKyNkZWZpbmUgVFggICAgICAgICgxKSAgLyogc2ltaWxhciB0byBVU0JfRElSX0lOICBidXQgY2FuIGJlIHVzZWQgYXMgYW4gaW5kZXggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU1RSVUNUVVJFUworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRE1BIGxheW91dCBvZiB0cmFuc2ZlciBkZXNjcmlwdG9ycyAqLworc3RydWN0IGNpMTN4eHhfdGQgeworCS8qIDAgKi8KKwl1MzIgbmV4dDsKKyNkZWZpbmUgVERfVEVSTUlOQVRFICAgICAgICAgIEJJVCgwKQorCS8qIDEgKi8KKwl1MzIgdG9rZW47CisjZGVmaW5lIFREX1NUQVRVUyAgICAgICAgICAgICAoMHgwMEZGVUwgPDwgIDApCisjZGVmaW5lIFREX1NUQVRVU19UUl9FUlIgICAgICBCSVQoMykKKyNkZWZpbmUgVERfU1RBVFVTX0RUX0VSUiAgICAgIEJJVCg1KQorI2RlZmluZSBURF9TVEFUVVNfSEFMVEVEICAgICAgQklUKDYpCisjZGVmaW5lIFREX1NUQVRVU19BQ1RJVkUgICAgICBCSVQoNykKKyNkZWZpbmUgVERfTVVMVE8gICAgICAgICAgICAgICgweDAwMDNVTCA8PCAxMCkKKyNkZWZpbmUgVERfSU9DICAgICAgICAgICAgICAgIEJJVCgxNSkKKyNkZWZpbmUgVERfVE9UQUxfQllURVMgICAgICAgICgweDdGRkZVTCA8PCAxNikKKwkvKiAyICovCisJdTMyIHBhZ2VbNV07CisjZGVmaW5lIFREX0NVUlJfT0ZGU0VUICAgICAgICAoMHgwRkZGVUwgPDwgIDApCisjZGVmaW5lIFREX0ZSQU1FX05VTSAgICAgICAgICAoMHgwN0ZGVUwgPDwgIDApCisjZGVmaW5lIFREX1JFU0VSVkVEX01BU0sgICAgICAoMHgwRkZGVUwgPDwgIDApCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogRE1BIGxheW91dCBvZiBxdWV1ZSBoZWFkcyAqLworc3RydWN0IGNpMTN4eHhfcWggeworCS8qIDAgKi8KKwl1MzIgY2FwOworI2RlZmluZSBRSF9JT1MgICAgICAgICAgICAgICAgQklUKDE1KQorI2RlZmluZSBRSF9NQVhfUEtUICAgICAgICAgICAgKDB4MDdGRlVMIDw8IDE2KQorI2RlZmluZSBRSF9aTFQgICAgICAgICAgICAgICAgQklUKDI5KQorI2RlZmluZSBRSF9NVUxUICAgICAgICAgICAgICAgKDB4MDAwM1VMIDw8IDMwKQorCS8qIDEgKi8KKwl1MzIgY3VycjsKKwkvKiAyIC0gOCAqLworCXN0cnVjdCBjaTEzeHh4X3RkICAgICAgICB0ZDsKKwkvKiA5ICovCisJdTMyIFJFU0VSVkVEOworCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgICBzZXR1cDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBFeHRlbnNpb24gb2YgdXNiX3JlcXVlc3QgKi8KK3N0cnVjdCBjaTEzeHh4X3JlcSB7CisJc3RydWN0IHVzYl9yZXF1ZXN0ICAgcmVxOworCXVuc2lnbmVkICAgICAgICAgICAgIG1hcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICBxdWV1ZTsKKwlzdHJ1Y3QgY2kxM3h4eF90ZCAgICpwdHI7CisJZG1hX2FkZHJfdCAgICAgICAgICAgZG1hOworfTsKKworLyogRXh0ZW5zaW9uIG9mIHVzYl9lcCAqLworc3RydWN0IGNpMTN4eHhfZXAgeworCXN0cnVjdCB1c2JfZXAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwOworCWNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAgKmRlc2M7CisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyOworCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bTsKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOworCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVbMTZdOworCXN0cnVjdCB7CisJCXN0cnVjdCBsaXN0X2hlYWQgICBxdWV1ZTsKKwkJc3RydWN0IGNpMTN4eHhfcWggKnB0cjsKKwkJZG1hX2FkZHJfdCAgICAgICAgIGRtYTsKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxaFsyXTsKKwlzdHJ1Y3QgdXNiX3JlcXVlc3QgICAgICAgICAgICAgICAgICAgICpzdGF0dXM7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VkZ2U7CisKKwkvKiBnbG9iYWwgcmVzb3VyY2VzICovCisJc3BpbmxvY2tfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbG9jazsKKwlzdHJ1Y3QgZGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICpkZXZpY2U7CisJc3RydWN0IGRtYV9wb29sICAgICAgICAgICAgICAgICAgICAgICAqdGRfcG9vbDsKK307CisKKy8qIENJMTNYWFggVURDIGRlc2NyaXB0b3IgJiBnbG9iYWwgcmVzb3VyY2VzICovCitzdHJ1Y3QgY2kxM3h4eCB7CisJc3BpbmxvY2tfdAkJICAqbG9jazsgICAgICAvKiBjdHJsIHJlZ2lzdGVyIGJhbmsgYWNjZXNzICovCisKKwlzdHJ1Y3QgZG1hX3Bvb2wgICAgICAgICAgICpxaF9wb29sOyAgIC8qIERNQSBwb29sIGZvciBxdWV1ZSBoZWFkcyAqLworCXN0cnVjdCBkbWFfcG9vbCAgICAgICAgICAgKnRkX3Bvb2w7ICAgLyogRE1BIHBvb2wgZm9yIHRyYW5zZmVyIGRlc2NzICovCisKKwlzdHJ1Y3QgdXNiX2dhZGdldCAgICAgICAgICBnYWRnZXQ7ICAgICAvKiBVU0Igc2xhdmUgZGV2aWNlICovCisJc3RydWN0IGNpMTN4eHhfZXAgICAgICAgICAgY2kxM3h4eF9lcFtFTkRQVF9NQVhdOyAvKiBleHRlbmRlZCBlbmRwdHMgKi8KKworCXN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAgKmRyaXZlcjsgICAgIC8qIDNyZCBwYXJ0eSBnYWRnZXQgZHJpdmVyICovCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSRUdJU1RFUlMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHJlZ2lzdGVyIHNpemUgKi8KKyNkZWZpbmUgUkVHX0JJVFMgICAoMzIpCisKKy8qIEhDQ1BBUkFNUyAqLworI2RlZmluZSBIQ0NQQVJBTVNfTEVOICAgICAgICAgQklUKDE3KQorCisvKiBEQ0NQQVJBTVMgKi8KKyNkZWZpbmUgRENDUEFSQU1TX0RFTiAgICAgICAgICgweDFGIDw8IDApCisjZGVmaW5lIERDQ1BBUkFNU19EQyAgICAgICAgICBCSVQoNykKKworLyogVEVTVE1PREUgKi8KKyNkZWZpbmUgVEVTVE1PREVfRk9SQ0UgICAgICAgIEJJVCgwKQorCisvKiBVU0JDTUQgKi8KKyNkZWZpbmUgVVNCQ01EX1JTICAgICAgICAgICAgIEJJVCgwKQorI2RlZmluZSBVU0JDTURfUlNUICAgICAgICAgICAgQklUKDEpCisjZGVmaW5lIFVTQkNNRF9TVVRXICAgICAgICAgICBCSVQoMTMpCisKKy8qIFVTQlNUUyAmIFVTQklOVFIgKi8KKyNkZWZpbmUgVVNCaV9VSSAgICAgICAgICAgICAgIEJJVCgwKQorI2RlZmluZSBVU0JpX1VFSSAgICAgICAgICAgICAgQklUKDEpCisjZGVmaW5lIFVTQmlfUENJICAgICAgICAgICAgICBCSVQoMikKKyNkZWZpbmUgVVNCaV9VUkkgICAgICAgICAgICAgIEJJVCg2KQorI2RlZmluZSBVU0JpX1NMSSAgICAgICAgICAgICAgQklUKDgpCisKKy8qIERFVklDRUFERFIgKi8KKyNkZWZpbmUgREVWSUNFQUREUl9VU0JBRFJBICAgIEJJVCgyNCkKKyNkZWZpbmUgREVWSUNFQUREUl9VU0JBRFIgICAgICgweDdGVUwgPDwgMjUpCisKKy8qIFBPUlRTQyAqLworI2RlZmluZSBQT1JUU0NfU1VTUCAgICAgICAgICAgQklUKDcpCisjZGVmaW5lIFBPUlRTQ19IU1AgICAgICAgICAgICBCSVQoOSkKKyNkZWZpbmUgUE9SVFNDX1BUQyAgICAgICAgICAgICgweDBGVUwgPDwgMTYpCisKKy8qIERFVkxDICovCisjZGVmaW5lIERFVkxDX1BTUEQgICAgICAgICAgICAoMHgwM1VMIDw8IDI1KQorI2RlZmluZSAgICBERVZMQ19QU1BEX0hTICAgICAgKDB4MDJVTCA8PCAyNSkKKworLyogVVNCTU9ERSAqLworI2RlZmluZSBVU0JNT0RFX0NNICAgICAgICAgICAgKDB4MDNVTCA8PCAgMCkKKyNkZWZpbmUgICAgVVNCTU9ERV9DTV9JRExFICAgICgweDAwVUwgPDwgIDApCisjZGVmaW5lICAgIFVTQk1PREVfQ01fREVWSUNFICAoMHgwMlVMIDw8ICAwKQorI2RlZmluZSAgICBVU0JNT0RFX0NNX0hPU1QgICAgKDB4MDNVTCA8PCAgMCkKKyNkZWZpbmUgVVNCTU9ERV9TTE9NICAgICAgICAgIEJJVCgzKQorCisvKiBFTkRQVENUUkwgKi8KKyNkZWZpbmUgRU5EUFRDVFJMX1JYUyAgICAgICAgIEJJVCgwKQorI2RlZmluZSBFTkRQVENUUkxfUlhUICAgICAgICAgKDB4MDNVTCA8PCAgMikKKyNkZWZpbmUgRU5EUFRDVFJMX1JYUiAgICAgICAgIEJJVCg2KSAgICAgICAgIC8qIHJlc2VydmVkIGZvciBwb3J0IDAgKi8KKyNkZWZpbmUgRU5EUFRDVFJMX1JYRSAgICAgICAgIEJJVCg3KQorI2RlZmluZSBFTkRQVENUUkxfVFhTICAgICAgICAgQklUKDE2KQorI2RlZmluZSBFTkRQVENUUkxfVFhUICAgICAgICAgKDB4MDNVTCA8PCAxOCkKKyNkZWZpbmUgRU5EUFRDVFJMX1RYUiAgICAgICAgIEJJVCgyMikgICAgICAgIC8qIHJlc2VydmVkIGZvciBwb3J0IDAgKi8KKyNkZWZpbmUgRU5EUFRDVFJMX1RYRSAgICAgICAgIEJJVCgyMykKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTE9HR0lORworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBjaTEzeHh4X3ByaW50ayhsZXZlbCwgZm9ybWF0LCBhcmdzLi4uKSBcCitkbyB7IFwKKwlpZiAoX3VkYyA9PSBOVUxMKSBcCisJCXByaW50ayhsZXZlbCAiWyVzXSAiIGZvcm1hdCAiXG4iLCBfX2Z1bmNfXywgIyMgYXJncyk7IFwKKwllbHNlIFwKKwkJZGV2X3ByaW50ayhsZXZlbCwgX3VkYy0+Z2FkZ2V0LmRldi5wYXJlbnQsIFwKKwkJCSAgICJbJXNdICIgZm9ybWF0ICJcbiIsIF9fZnVuY19fLCAjIyBhcmdzKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBlcnIoZm9ybWF0LCBhcmdzLi4uKSAgICBjaTEzeHh4X3ByaW50ayhLRVJOX0VSUiwgZm9ybWF0LCAjIyBhcmdzKQorI2RlZmluZSB3YXJuKGZvcm1hdCwgYXJncy4uLikgICBjaTEzeHh4X3ByaW50ayhLRVJOX1dBUk5JTkcsIGZvcm1hdCwgIyMgYXJncykKKyNkZWZpbmUgaW5mbyhmb3JtYXQsIGFyZ3MuLi4pICAgY2kxM3h4eF9wcmludGsoS0VSTl9JTkZPLCBmb3JtYXQsICMjIGFyZ3MpCisKKyNpZmRlZiBUUkFDRQorI2RlZmluZSB0cmFjZShmb3JtYXQsIGFyZ3MuLi4pICAgICAgY2kxM3h4eF9wcmludGsoS0VSTl9ERUJVRywgZm9ybWF0LCAjIyBhcmdzKQorI2RlZmluZSBkYmdfdHJhY2UoZm9ybWF0LCBhcmdzLi4uKSAgZGV2X2RiZyhkZXYsIGZvcm1hdCwgIyNhcmdzKQorI2Vsc2UKKyNkZWZpbmUgdHJhY2UoZm9ybWF0LCBhcmdzLi4uKSAgICAgIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBkYmdfdHJhY2UoZm9ybWF0LCBhcmdzLi4uKSAgZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworI2VuZGlmCS8qIF9DSTEzWFhYX2hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZXBhdXRvY29uZi5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2VwYXV0b2NvbmYuYwppbmRleCA5NDYyZTMwLi5hMzZiMTE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZXBhdXRvY29uZi5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9lcGF1dG9jb25mLmMKQEAgLTE2MSw3ICsxNjEsNyBAQAogCS8qIHJlcG9ydCBhZGRyZXNzICovCiAJZGVzYy0+YkVuZHBvaW50QWRkcmVzcyAmPSBVU0JfRElSX0lOOwogCWlmIChpc2RpZ2l0IChlcC0+bmFtZSBbMl0pKSB7Ci0JCXU4CW51bSA9IHNpbXBsZV9zdHJ0b2wgKCZlcC0+bmFtZSBbMl0sIE5VTEwsIDEwKTsKKwkJdTgJbnVtID0gc2ltcGxlX3N0cnRvdWwgKCZlcC0+bmFtZSBbMl0sIE5VTEwsIDEwKTsKIAkJZGVzYy0+YkVuZHBvaW50QWRkcmVzcyB8PSBudW07CiAjaWZkZWYJTUFOWV9FTkRQT0lOVFMKIAl9IGVsc2UgaWYgKGRlc2MtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRElSX0lOKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZl9waG9uZXQuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX3Bob25ldC5jCmluZGV4IGQ4ZmM5YjMuLmMwOTE2YzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX3Bob25ldC5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX3Bob25ldC5jCkBAIC0yNzksNiArMjc5LDEzIEBACiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBwbl9uZXRkZXZfb3BzID0geworCS5uZG9fb3Blbgk9IHBuX25ldF9vcGVuLAorCS5uZG9fc3RvcAk9IHBuX25ldF9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJPSBwbl9uZXRfeG1pdCwKKwkubmRvX2NoYW5nZV9tdHUJPSBwbl9uZXRfbXR1LAorfTsKKwogc3RhdGljIHZvaWQgcG5fbmV0X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJZGV2LT5mZWF0dXJlcwkJPSAwOwpAQCAtMjkwLDEyICsyOTcsOSBAQAogCWRldi0+YWRkcl9sZW4JCT0gMTsKIAlkZXYtPnR4X3F1ZXVlX2xlbgk9IDE7CiAKKwlkZXYtPm5ldGRldl9vcHMJCT0gJnBuX25ldGRldl9vcHM7CiAJZGV2LT5kZXN0cnVjdG9yCQk9IGZyZWVfbmV0ZGV2OwogCWRldi0+aGVhZGVyX29wcwkJPSAmcGhvbmV0X2hlYWRlcl9vcHM7Ci0JZGV2LT5vcGVuCQk9IHBuX25ldF9vcGVuOwotCWRldi0+c3RvcAkJPSBwbl9uZXRfY2xvc2U7Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSBwbl9uZXRfeG1pdDsgLyogbWFuZGF0b3J5ICovCi0JZGV2LT5jaGFuZ2VfbXR1CQk9IHBuX25ldF9tdHU7CiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZmlsZV9zdG9yYWdlLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZmlsZV9zdG9yYWdlLmMKaW5kZXggYzRlNjJhNi4uYjEwZmEzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZpbGVfc3RvcmFnZS5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9maWxlX3N0b3JhZ2UuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBmaWxlX3N0b3JhZ2UuYyAtLSBGaWxlLWJhY2tlZCBVU0IgU3RvcmFnZSBHYWRnZXQsIGZvciBVU0IgZGV2ZWxvcG1lbnQKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNyBBbGFuIFN0ZXJuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBBbGFuIFN0ZXJuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMzgsMTYgKzM4LDE3IEBACiAKIC8qCiAgKiBUaGUgRmlsZS1iYWNrZWQgU3RvcmFnZSBHYWRnZXQgYWN0cyBhcyBhIFVTQiBNYXNzIFN0b3JhZ2UgZGV2aWNlLAotICogYXBwZWFyaW5nIHRvIHRoZSBob3N0IGFzIGEgZGlzayBkcml2ZS4gIEluIGFkZGl0aW9uIHRvIHByb3ZpZGluZyBhbgotICogZXhhbXBsZSBvZiBhIGdlbnVpbmVseSB1c2VmdWwgZ2FkZ2V0IGRyaXZlciBmb3IgYSBVU0IgZGV2aWNlLCBpdCBhbHNvCi0gKiBpbGx1c3RyYXRlcyBhIHRlY2huaXF1ZSBvZiBkb3VibGUtYnVmZmVyaW5nIGZvciBpbmNyZWFzZWQgdGhyb3VnaHB1dC4KLSAqIExhc3QgYnV0IG5vdCBsZWFzdCwgaXQgZ2l2ZXMgYW4gZWFzeSB3YXkgdG8gcHJvYmUgdGhlIGJlaGF2aW9yIG9mIHRoZQotICogTWFzcyBTdG9yYWdlIGRyaXZlcnMgaW4gYSBVU0IgaG9zdC4KKyAqIGFwcGVhcmluZyB0byB0aGUgaG9zdCBhcyBhIGRpc2sgZHJpdmUgb3IgYXMgYSBDRC1ST00gZHJpdmUuICBJbiBhZGRpdGlvbgorICogdG8gcHJvdmlkaW5nIGFuIGV4YW1wbGUgb2YgYSBnZW51aW5lbHkgdXNlZnVsIGdhZGdldCBkcml2ZXIgZm9yIGEgVVNCCisgKiBkZXZpY2UsIGl0IGFsc28gaWxsdXN0cmF0ZXMgYSB0ZWNobmlxdWUgb2YgZG91YmxlLWJ1ZmZlcmluZyBmb3IgaW5jcmVhc2VkCisgKiB0aHJvdWdocHV0LiAgTGFzdCBidXQgbm90IGxlYXN0LCBpdCBnaXZlcyBhbiBlYXN5IHdheSB0byBwcm9iZSB0aGUKKyAqIGJlaGF2aW9yIG9mIHRoZSBNYXNzIFN0b3JhZ2UgZHJpdmVycyBpbiBhIFVTQiBob3N0LgogICoKICAqIEJhY2tpbmcgc3RvcmFnZSBpcyBwcm92aWRlZCBieSBhIHJlZ3VsYXIgZmlsZSBvciBhIGJsb2NrIGRldmljZSwgc3BlY2lmaWVkCiAgKiBieSB0aGUgImZpbGUiIG1vZHVsZSBwYXJhbWV0ZXIuICBBY2Nlc3MgY2FuIGJlIGxpbWl0ZWQgdG8gcmVhZC1vbmx5IGJ5Ci0gKiBzZXR0aW5nIHRoZSBvcHRpb25hbCAicm8iIG1vZHVsZSBwYXJhbWV0ZXIuICBUaGUgZ2FkZ2V0IHdpbGwgaW5kaWNhdGUgdGhhdAotICogaXQgaGFzIHJlbW92YWJsZSBtZWRpYSBpZiB0aGUgb3B0aW9uYWwgInJlbW92YWJsZSIgbW9kdWxlIHBhcmFtZXRlciBpcyBzZXQuCisgKiBzZXR0aW5nIHRoZSBvcHRpb25hbCAicm8iIG1vZHVsZSBwYXJhbWV0ZXIuICAoRm9yIENELVJPTSBlbXVsYXRpb24sCisgKiBhY2Nlc3MgaXMgYWx3YXlzIHJlYWQtb25seS4pICBUaGUgZ2FkZ2V0IHdpbGwgaW5kaWNhdGUgdGhhdCBpdCBoYXMKKyAqIHJlbW92YWJsZSBtZWRpYSBpZiB0aGUgb3B0aW9uYWwgInJlbW92YWJsZSIgbW9kdWxlIHBhcmFtZXRlciBpcyBzZXQuCiAgKgogICogVGhlIGdhZGdldCBzdXBwb3J0cyB0aGUgQ29udHJvbC1CdWxrIChDQiksIENvbnRyb2wtQnVsay1JbnRlcnJ1cHQgKENCSSksCiAgKiBhbmQgQnVsay1Pbmx5IChhbHNvIGtub3duIGFzIEJ1bGstQnVsay1CdWxrIG9yIEJCQikgdHJhbnNwb3J0cywgc2VsZWN0ZWQKQEAgLTY0LDcgKzY1LDEyIEBACiAgKiBUaGUgZGVmYXVsdCBudW1iZXIgb2YgTFVOcyBpcyB0YWtlbiBmcm9tIHRoZSBudW1iZXIgb2YgImZpbGUiIGVsZW1lbnRzOwogICogaXQgaXMgMSBpZiAiZmlsZSIgaXMgbm90IGdpdmVuLiAgSWYgInJlbW92YWJsZSIgaXMgbm90IHNldCB0aGVuIGEgYmFja2luZwogICogZmlsZSBtdXN0IGJlIHNwZWNpZmllZCBmb3IgZWFjaCBMVU4uICBJZiBpdCBpcyBzZXQsIHRoZW4gYW4gdW5zcGVjaWZpZWQKLSAqIG9yIGVtcHR5IGJhY2tpbmcgZmlsZW5hbWUgbWVhbnMgdGhlIExVTidzIG1lZGl1bSBpcyBub3QgbG9hZGVkLgorICogb3IgZW1wdHkgYmFja2luZyBmaWxlbmFtZSBtZWFucyB0aGUgTFVOJ3MgbWVkaXVtIGlzIG5vdCBsb2FkZWQuICBJZGVhbGx5CisgKiBlYWNoIExVTiB3b3VsZCBiZSBzZXR0YWJsZSBpbmRlcGVuZGVudGx5IGFzIGEgZGlzayBkcml2ZSBvciBhIENELVJPTQorICogZHJpdmUsIGJ1dCBjdXJyZW50bHkgYWxsIExVTnMgaGF2ZSB0byBiZSB0aGUgc2FtZSB0eXBlLiAgVGhlIENELVJPTQorICogZW11bGF0aW9uIGluY2x1ZGVzIGEgc2luZ2xlIGRhdGEgdHJhY2sgYW5kIG5vIGF1ZGlvIHRyYWNrczsgaGVuY2UgdGhlcmUKKyAqIG5lZWQgYmUgb25seSBvbmUgYmFja2luZyBmaWxlIHBlciBMVU4uICBOb3RlIGFsc28gdGhhdCB0aGUgQ0QtUk9NIGJsb2NrCisgKiBsZW5ndGggaXMgc2V0IHRvIDUxMiByYXRoZXIgdGhhbiB0aGUgbW9yZSBjb21tb24gdmFsdWUgMjA0OC4KICAqCiAgKiBSZXF1aXJlbWVudHMgYXJlIG1vZGVzdDsgb25seSBhIGJ1bGstaW4gYW5kIGEgYnVsay1vdXQgZW5kcG9pbnQgYXJlCiAgKiBuZWVkZWQgKGFuIGludGVycnVwdC1vdXQgZW5kcG9pbnQgaXMgYWxzbyBuZWVkZWQgZm9yIENCSSkuICBUaGUgbWVtb3J5CkBAIC05MSw2ICs5Nyw4IEBACiAgKgkJCQkJVVNCIGRldmljZSBjb250cm9sbGVyICh1c3VhbGx5IHRydWUpLAogICoJCQkJCWJvb2xlYW4gdG8gcGVybWl0IHRoZSBkcml2ZXIgdG8gaGFsdAogICoJCQkJCWJ1bGsgZW5kcG9pbnRzCisgKgljZHJvbQkJCURlZmF1bHQgZmFsc2UsIGJvb2xlYW4gZm9yIHdoZXRoZXIgdG8gZW11bGF0ZQorICoJCQkJCWEgQ0QtUk9NIGRyaXZlCiAgKgl0cmFuc3BvcnQ9WFhYCQlEZWZhdWx0IEJCQiwgdHJhbnNwb3J0IG5hbWUgKENCLCBDQkksIG9yIEJCQikKICAqCXByb3RvY29sPVlZWQkJRGVmYXVsdCBTQ1NJLCBwcm90b2NvbCBuYW1lIChSQkMsIDgwMjAgb3IKICAqCQkJCQlBVEFQSSwgUUlDLCBVRkksIDgwNzAsIG9yIFNDU0k7CkBAIC0xMDMsMTUgKzExMSwxNiBAQAogICoJCQkJCVBBR0VfQ0FDSEVfU0laRSkKICAqCiAgKiBJZiBDT05GSUdfVVNCX0ZJTEVfU1RPUkFHRV9URVNUIGlzIG5vdCBzZXQsIG9ubHkgdGhlICJmaWxlIiwgInJvIiwKLSAqICJyZW1vdmFibGUiLCAibHVucyIsIGFuZCAic3RhbGwiIG9wdGlvbnMgYXJlIGF2YWlsYWJsZTsgZGVmYXVsdCB2YWx1ZXMKLSAqIGFyZSB1c2VkIGZvciBldmVyeXRoaW5nIGVsc2UuCisgKiAicmVtb3ZhYmxlIiwgImx1bnMiLCAic3RhbGwiLCBhbmQgImNkcm9tIiBvcHRpb25zIGFyZSBhdmFpbGFibGU7IGRlZmF1bHQKKyAqIHZhbHVlcyBhcmUgdXNlZCBmb3IgZXZlcnl0aGluZyBlbHNlLgogICoKICAqIFRoZSBwYXRobmFtZXMgb2YgdGhlIGJhY2tpbmcgZmlsZXMgYW5kIHRoZSBybyBzZXR0aW5ncyBhcmUgYXZhaWxhYmxlIGluCiAgKiB0aGUgYXR0cmlidXRlIGZpbGVzICJmaWxlIiBhbmQgInJvIiBpbiB0aGUgbHVuPG4+IHN1YmRpcmVjdG9yeSBvZiB0aGUKICAqIGdhZGdldCdzIHN5c2ZzIGRpcmVjdG9yeS4gIElmIHRoZSAicmVtb3ZhYmxlIiBvcHRpb24gaXMgc2V0LCB3cml0aW5nIHRvCiAgKiB0aGVzZSBmaWxlcyB3aWxsIHNpbXVsYXRlIGVqZWN0aW5nL2xvYWRpbmcgdGhlIG1lZGl1bSAod3JpdGluZyBhbiBlbXB0eQogICogbGluZSBtZWFucyBlamVjdCkgYW5kIGFkanVzdGluZyBhIHdyaXRlLWVuYWJsZSB0YWIuICBDaGFuZ2VzIHRvIHRoZSBybwotICogc2V0dGluZyBhcmUgbm90IGFsbG93ZWQgd2hlbiB0aGUgbWVkaXVtIGlzIGxvYWRlZC4KKyAqIHNldHRpbmcgYXJlIG5vdCBhbGxvd2VkIHdoZW4gdGhlIG1lZGl1bSBpcyBsb2FkZWQgb3IgaWYgQ0QtUk9NIGVtdWxhdGlvbgorICogaXMgYmVpbmcgdXNlZC4KICAqCiAgKiBUaGlzIGdhZGdldCBkcml2ZXIgaXMgaGVhdmlseSBiYXNlZCBvbiAiR2FkZ2V0IFplcm8iIGJ5IERhdmlkIEJyb3duZWxsLgogICogVGhlIGRyaXZlcidzIFNDU0kgY29tbWFuZCBpbnRlcmZhY2Ugd2FzIGJhc2VkIG9uIHRoZSAiSW5mb3JtYXRpb24KQEAgLTI2MSw3ICsyNzAsNyBAQAogCiAjZGVmaW5lIERSSVZFUl9ERVNDCQkiRmlsZS1iYWNrZWQgU3RvcmFnZSBHYWRnZXQiCiAjZGVmaW5lIERSSVZFUl9OQU1FCQkiZ19maWxlX3N0b3JhZ2UiCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OCQkiNyBBdWd1c3QgMjAwNyIKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JCSIyMCBOb3ZlbWJlciAyMDA4IgogCiBzdGF0aWMgY29uc3QgY2hhciBsb25nbmFtZVtdID0gRFJJVkVSX0RFU0M7CiBzdGF0aWMgY29uc3QgY2hhciBzaG9ydG5hbWVbXSA9IERSSVZFUl9OQU1FOwpAQCAtMzQxLDYgKzM1MCw3IEBACiAKIAlpbnQJCXJlbW92YWJsZTsKIAlpbnQJCWNhbl9zdGFsbDsKKwlpbnQJCWNkcm9tOwogCiAJY2hhcgkJKnRyYW5zcG9ydF9wYXJtOwogCWNoYXIJCSpwcm90b2NvbF9wYXJtOwpAQCAtMzU5LDYgKzM2OSw3IEBACiAJLnByb3RvY29sX3Bhcm0JCT0gIlNDU0kiLAogCS5yZW1vdmFibGUJCT0gMCwKIAkuY2FuX3N0YWxsCQk9IDEsCisJLmNkcm9tCQkJPSAwLAogCS52ZW5kb3IJCQk9IERSSVZFUl9WRU5ET1JfSUQsCiAJLnByb2R1Y3QJCT0gRFJJVkVSX1BST0RVQ1RfSUQsCiAJLnJlbGVhc2UJCT0gMHhmZmZmLAkvLyBVc2UgY29udHJvbGxlciBjaGlwIHR5cGUKQEAgLTM4Miw2ICszOTMsOSBAQAogbW9kdWxlX3BhcmFtX25hbWVkKHN0YWxsLCBtb2RfZGF0YS5jYW5fc3RhbGwsIGJvb2wsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhzdGFsbCwgImZhbHNlIHRvIHByZXZlbnQgYnVsayBzdGFsbHMiKTsKIAorbW9kdWxlX3BhcmFtX25hbWVkKGNkcm9tLCBtb2RfZGF0YS5jZHJvbSwgYm9vbCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGNkcm9tLCAidHJ1ZSB0byBlbXVsYXRlIGNkcm9tIGluc3RlYWQgb2YgZGlzayIpOworCiAKIC8qIEluIHRoZSBub24tVEVTVCB2ZXJzaW9uLCBvbmx5IHRoZSBtb2R1bGUgcGFyYW1ldGVycyBsaXN0ZWQgYWJvdmUKICAqIGFyZSBhdmFpbGFibGUuICovCkBAIC00MTEsNiArNDI1LDEwIEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKKy8qIFNDU0kgZGV2aWNlIHR5cGVzICovCisjZGVmaW5lIFRZUEVfRElTSwkweDAwCisjZGVmaW5lIFRZUEVfQ0RST00JMHgwNQorCiAvKiBVU0IgcHJvdG9jb2wgdmFsdWUgPSB0aGUgdHJhbnNwb3J0IG1ldGhvZCAqLwogI2RlZmluZSBVU0JfUFJfQ0JJCTB4MDAJCS8vIENvbnRyb2wvQnVsay9JbnRlcnJ1cHQKICNkZWZpbmUgVVNCX1BSX0NCCTB4MDEJCS8vIENvbnRyb2wvQnVsayB3L28gaW50ZXJydXB0CkBAIC00ODcsNiArNTA1LDggQEAKICNkZWZpbmUgU0NfUkVBRF8xMgkJCTB4YTgKICNkZWZpbmUgU0NfUkVBRF9DQVBBQ0lUWQkJMHgyNQogI2RlZmluZSBTQ19SRUFEX0ZPUk1BVF9DQVBBQ0lUSUVTCTB4MjMKKyNkZWZpbmUgU0NfUkVBRF9IRUFERVIJCQkweDQ0CisjZGVmaW5lIFNDX1JFQURfVE9DCQkJMHg0MwogI2RlZmluZSBTQ19SRUxFQVNFCQkJMHgxNwogI2RlZmluZSBTQ19SRVFVRVNUX1NFTlNFCQkweDAzCiAjZGVmaW5lIFNDX1JFU0VSVkUJCQkweDE2CkBAIC0xODYzLDI2ICsxODgzLDEwIEBACiBzdGF0aWMgaW50IGZzeW5jX3N1YihzdHJ1Y3QgbHVuICpjdXJsdW4pCiB7CiAJc3RydWN0IGZpbGUJKmZpbHAgPSBjdXJsdW4tPmZpbHA7Ci0Jc3RydWN0IGlub2RlCSppbm9kZTsKLQlpbnQJCXJjLCBlcnI7CiAKIAlpZiAoY3VybHVuLT5ybyB8fCAhZmlscCkKIAkJcmV0dXJuIDA7Ci0JaWYgKCFmaWxwLT5mX29wLT5mc3luYykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7Ci0JbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwotCXJjID0gZmlsZW1hcF9mZGF0YXdyaXRlKGlub2RlLT5pX21hcHBpbmcpOwotCWVyciA9IGZpbHAtPmZfb3AtPmZzeW5jKGZpbHAsIGZpbHAtPmZfcGF0aC5kZW50cnksIDEpOwotCWlmICghcmMpCi0JCXJjID0gZXJyOwotCWVyciA9IGZpbGVtYXBfZmRhdGF3YWl0KGlub2RlLT5pX21hcHBpbmcpOwotCWlmICghcmMpCi0JCXJjID0gZXJyOwotCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwotCVZMREJHKGN1cmx1biwgImZkYXRhc3luYyAtPiAlZFxuIiwgcmMpOwotCXJldHVybiByYzsKKwlyZXR1cm4gdmZzX2ZzeW5jKGZpbHAsIGZpbHAtPmZfcGF0aC5kZW50cnksIDEpOwogfQogCiBzdGF0aWMgdm9pZCBmc3luY19hbGwoc3RydWN0IGZzZ19kZXYgKmZzZykKQEAgLTIwMjIsMjMgKzIwMjYsMjggQEAKIAl1OAkqYnVmID0gKHU4ICopIGJoLT5idWY7CiAKIAlzdGF0aWMgY2hhciB2ZW5kb3JfaWRbXSA9ICJMaW51eCAgICI7Ci0Jc3RhdGljIGNoYXIgcHJvZHVjdF9pZFtdID0gIkZpbGUtU3RvciBHYWRnZXQiOworCXN0YXRpYyBjaGFyIHByb2R1Y3RfZGlza19pZFtdID0gIkZpbGUtU3RvciBHYWRnZXQiOworCXN0YXRpYyBjaGFyIHByb2R1Y3RfY2Ryb21faWRbXSA9ICJGaWxlLUNEIEdhZGdldCAgIjsKIAogCWlmICghZnNnLT5jdXJsdW4pIHsJCS8vIFVuc3VwcG9ydGVkIExVTnMgYXJlIG9rYXkKIAkJZnNnLT5iYWRfbHVuX29rYXkgPSAxOwogCQltZW1zZXQoYnVmLCAwLCAzNik7CiAJCWJ1ZlswXSA9IDB4N2Y7CQkvLyBVbnN1cHBvcnRlZCwgbm8gZGV2aWNlLXR5cGUKKwkJYnVmWzRdID0gMzE7CQkvLyBBZGRpdGlvbmFsIGxlbmd0aAogCQlyZXR1cm4gMzY7CiAJfQogCi0JbWVtc2V0KGJ1ZiwgMCwgOCk7CS8vIE5vbi1yZW1vdmFibGUsIGRpcmVjdC1hY2Nlc3MgZGV2aWNlCisJbWVtc2V0KGJ1ZiwgMCwgOCk7CisJYnVmWzBdID0gKG1vZF9kYXRhLmNkcm9tID8gVFlQRV9DRFJPTSA6IFRZUEVfRElTSyk7CiAJaWYgKG1vZF9kYXRhLnJlbW92YWJsZSkKIAkJYnVmWzFdID0gMHg4MDsKIAlidWZbMl0gPSAyOwkJLy8gQU5TSSBTQ1NJIGxldmVsIDIKIAlidWZbM10gPSAyOwkJLy8gU0NTSS0yIElOUVVJUlkgZGF0YSBmb3JtYXQKIAlidWZbNF0gPSAzMTsJCS8vIEFkZGl0aW9uYWwgbGVuZ3RoCiAJCQkJLy8gTm8gc3BlY2lhbCBvcHRpb25zCi0Jc3ByaW50ZihidWYgKyA4LCAiJS04cyUtMTZzJTA0eCIsIHZlbmRvcl9pZCwgcHJvZHVjdF9pZCwKKwlzcHJpbnRmKGJ1ZiArIDgsICIlLThzJS0xNnMlMDR4IiwgdmVuZG9yX2lkLAorCQkJKG1vZF9kYXRhLmNkcm9tID8gcHJvZHVjdF9jZHJvbV9pZCA6CisJCQkJcHJvZHVjdF9kaXNrX2lkKSwKIAkJCW1vZF9kYXRhLnJlbGVhc2UpOwogCXJldHVybiAzNjsKIH0KQEAgLTIxMTcsNiArMjEyNiw3NSBAQAogfQogCiAKK3N0YXRpYyB2b2lkIHN0b3JlX2Nkcm9tX2FkZHJlc3ModTggKmRlc3QsIGludCBtc2YsIHUzMiBhZGRyKQoreworCWlmIChtc2YpIHsKKwkJLyogQ29udmVydCB0byBNaW51dGVzLVNlY29uZHMtRnJhbWVzICovCisJCWFkZHIgPj49IDI7CQkvKiBDb252ZXJ0IHRvIDIwNDgtYnl0ZSBmcmFtZXMgKi8KKwkJYWRkciArPSAyKjc1OwkJLyogTGVhZC1pbiBvY2N1cGllcyAyIHNlY29uZHMgKi8KKwkJZGVzdFszXSA9IGFkZHIgJSA3NTsJLyogRnJhbWVzICovCisJCWFkZHIgLz0gNzU7CisJCWRlc3RbMl0gPSBhZGRyICUgNjA7CS8qIFNlY29uZHMgKi8KKwkJYWRkciAvPSA2MDsKKwkJZGVzdFsxXSA9IGFkZHI7CQkvKiBNaW51dGVzICovCisJCWRlc3RbMF0gPSAwOwkJLyogUmVzZXJ2ZWQgKi8KKwl9IGVsc2UgeworCQkvKiBBYnNvbHV0ZSBzZWN0b3IgKi8KKwkJcHV0X2JlMzIoZGVzdCwgYWRkcik7CisJfQorfQorCitzdGF0aWMgaW50IGRvX3JlYWRfaGVhZGVyKHN0cnVjdCBmc2dfZGV2ICpmc2csIHN0cnVjdCBmc2dfYnVmZmhkICpiaCkKK3sKKwlzdHJ1Y3QgbHVuCSpjdXJsdW4gPSBmc2ctPmN1cmx1bjsKKwlpbnQJCW1zZiA9IGZzZy0+Y21uZFsxXSAmIDB4MDI7CisJdTMyCQlsYmEgPSBnZXRfYmUzMigmZnNnLT5jbW5kWzJdKTsKKwl1OAkJKmJ1ZiA9ICh1OCAqKSBiaC0+YnVmOworCisJaWYgKChmc2ctPmNtbmRbMV0gJiB+MHgwMikgIT0gMCkgewkJLyogTWFzayBhd2F5IE1TRiAqLworCQljdXJsdW4tPnNlbnNlX2RhdGEgPSBTU19JTlZBTElEX0ZJRUxEX0lOX0NEQjsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChsYmEgPj0gY3VybHVuLT5udW1fc2VjdG9ycykgeworCQljdXJsdW4tPnNlbnNlX2RhdGEgPSBTU19MT0dJQ0FMX0JMT0NLX0FERFJFU1NfT1VUX09GX1JBTkdFOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltZW1zZXQoYnVmLCAwLCA4KTsKKwlidWZbMF0gPSAweDAxOwkJLyogMjA0OCBieXRlcyBvZiB1c2VyIGRhdGEsIHJlc3QgaXMgRUMgKi8KKwlzdG9yZV9jZHJvbV9hZGRyZXNzKCZidWZbNF0sIG1zZiwgbGJhKTsKKwlyZXR1cm4gODsKK30KKworCitzdGF0aWMgaW50IGRvX3JlYWRfdG9jKHN0cnVjdCBmc2dfZGV2ICpmc2csIHN0cnVjdCBmc2dfYnVmZmhkICpiaCkKK3sKKwlzdHJ1Y3QgbHVuCSpjdXJsdW4gPSBmc2ctPmN1cmx1bjsKKwlpbnQJCW1zZiA9IGZzZy0+Y21uZFsxXSAmIDB4MDI7CisJaW50CQlzdGFydF90cmFjayA9IGZzZy0+Y21uZFs2XTsKKwl1OAkJKmJ1ZiA9ICh1OCAqKSBiaC0+YnVmOworCisJaWYgKChmc2ctPmNtbmRbMV0gJiB+MHgwMikgIT0gMCB8fAkJLyogTWFzayBhd2F5IE1TRiAqLworCQkJc3RhcnRfdHJhY2sgPiAxKSB7CisJCWN1cmx1bi0+c2Vuc2VfZGF0YSA9IFNTX0lOVkFMSURfRklFTERfSU5fQ0RCOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltZW1zZXQoYnVmLCAwLCAyMCk7CisJYnVmWzFdID0gKDIwLTIpOwkJLyogVE9DIGRhdGEgbGVuZ3RoICovCisJYnVmWzJdID0gMTsJCQkvKiBGaXJzdCB0cmFjayBudW1iZXIgKi8KKwlidWZbM10gPSAxOwkJCS8qIExhc3QgdHJhY2sgbnVtYmVyICovCisJYnVmWzVdID0gMHgxNjsJCQkvKiBEYXRhIHRyYWNrLCBjb3B5aW5nIGFsbG93ZWQgKi8KKwlidWZbNl0gPSAweDAxOwkJCS8qIE9ubHkgdHJhY2sgaXMgbnVtYmVyIDEgKi8KKwlzdG9yZV9jZHJvbV9hZGRyZXNzKCZidWZbOF0sIG1zZiwgMCk7CisKKwlidWZbMTNdID0gMHgxNjsJCQkvKiBMZWFkLW91dCB0cmFjayBpcyBkYXRhICovCisJYnVmWzE0XSA9IDB4QUE7CQkJLyogTGVhZC1vdXQgdHJhY2sgbnVtYmVyICovCisJc3RvcmVfY2Ryb21fYWRkcmVzcygmYnVmWzE2XSwgbXNmLCBjdXJsdW4tPm51bV9zZWN0b3JzKTsKKwlyZXR1cm4gMjA7Cit9CisKKwogc3RhdGljIGludCBkb19tb2RlX3NlbnNlKHN0cnVjdCBmc2dfZGV2ICpmc2csIHN0cnVjdCBmc2dfYnVmZmhkICpiaCkKIHsKIAlzdHJ1Y3QgbHVuCSpjdXJsdW4gPSBmc2ctPmN1cmx1bjsKQEAgLTI4NjQsNiArMjk0MiwyNiBAQAogCQkJcmVwbHkgPSBkb19yZWFkX2NhcGFjaXR5KGZzZywgYmgpOwogCQlicmVhazsKIAorCWNhc2UgU0NfUkVBRF9IRUFERVI6CisJCWlmICghbW9kX2RhdGEuY2Ryb20pCisJCQlnb3RvIHVua25vd25fY21uZDsKKwkJZnNnLT5kYXRhX3NpemVfZnJvbV9jbW5kID0gZ2V0X2JlMTYoJmZzZy0+Y21uZFs3XSk7CisJCWlmICgocmVwbHkgPSBjaGVja19jb21tYW5kKGZzZywgMTAsIERBVEFfRElSX1RPX0hPU1QsCisJCQkJKDM8PDcpIHwgKDB4MWY8PDEpLCAxLAorCQkJCSJSRUFEIEhFQURFUiIpKSA9PSAwKQorCQkJcmVwbHkgPSBkb19yZWFkX2hlYWRlcihmc2csIGJoKTsKKwkJYnJlYWs7CisKKwljYXNlIFNDX1JFQURfVE9DOgorCQlpZiAoIW1vZF9kYXRhLmNkcm9tKQorCQkJZ290byB1bmtub3duX2NtbmQ7CisJCWZzZy0+ZGF0YV9zaXplX2Zyb21fY21uZCA9IGdldF9iZTE2KCZmc2ctPmNtbmRbN10pOworCQlpZiAoKHJlcGx5ID0gY2hlY2tfY29tbWFuZChmc2csIDEwLCBEQVRBX0RJUl9UT19IT1NULAorCQkJCSg3PDw2KSB8ICgxPDwxKSwgMSwKKwkJCQkiUkVBRCBUT0MiKSkgPT0gMCkKKwkJCXJlcGx5ID0gZG9fcmVhZF90b2MoZnNnLCBiaCk7CisJCWJyZWFrOworCiAJY2FzZSBTQ19SRUFEX0ZPUk1BVF9DQVBBQ0lUSUVTOgogCQlmc2ctPmRhdGFfc2l6ZV9mcm9tX2NtbmQgPSBnZXRfYmUxNigmZnNnLT5jbW5kWzddKTsKIAkJaWYgKChyZXBseSA9IGNoZWNrX2NvbW1hbmQoZnNnLCAxMCwgREFUQV9ESVJfVE9fSE9TVCwKQEAgLTI5NDksNiArMzA0Nyw3IEBACiAJCS8vIEZhbGwgdGhyb3VnaAogCiAJZGVmYXVsdDoKKyB1bmtub3duX2NtbmQ6CiAJCWZzZy0+ZGF0YV9zaXplX2Zyb21fY21uZCA9IDA7CiAJCXNwcmludGYodW5rbm93biwgIlVua25vd24geCUwMngiLCBmc2ctPmNtbmRbMF0pOwogCQlpZiAoKHJlcGx5ID0gY2hlY2tfY29tbWFuZChmc2csIGZzZy0+Y21uZF9zaXplLApAQCAtMzUxNCw2ICszNjEzLDcgQEAKIAlzdHJ1Y3QgaW5vZGUJCQkqaW5vZGUgPSBOVUxMOwogCWxvZmZfdAkJCQlzaXplOwogCWxvZmZfdAkJCQludW1fc2VjdG9yczsKKwlsb2ZmX3QJCQkJbWluX3NlY3RvcnM7CiAKIAkvKiBSL1cgaWYgd2UgY2FuLCBSL08gaWYgd2UgbXVzdCAqLwogCXJvID0gY3VybHVuLT5ybzsKQEAgLTM1NTcsOCArMzY1NywxOSBAQAogCQlyYyA9IChpbnQpIHNpemU7CiAJCWdvdG8gb3V0OwogCX0KLQludW1fc2VjdG9ycyA9IHNpemUgPj4gOTsJLy8gRmlsZSBzaXplIGluIDUxMi1ieXRlIHNlY3RvcnMKLQlpZiAobnVtX3NlY3RvcnMgPT0gMCkgeworCW51bV9zZWN0b3JzID0gc2l6ZSA+PiA5OwkvLyBGaWxlIHNpemUgaW4gNTEyLWJ5dGUgYmxvY2tzCisJbWluX3NlY3RvcnMgPSAxOworCWlmIChtb2RfZGF0YS5jZHJvbSkgeworCQludW1fc2VjdG9ycyAmPSB+MzsJLy8gUmVkdWNlIHRvIGEgbXVsdGlwbGUgb2YgMjA0OAorCQltaW5fc2VjdG9ycyA9IDMwMCo0OwkvLyBTbWFsbGVzdCB0cmFjayBpcyAzMDAgZnJhbWVzCisJCWlmIChudW1fc2VjdG9ycyA+PSAyNTYqNjAqNzUqNCkgeworCQkJbnVtX3NlY3RvcnMgPSAoMjU2KjYwKjc1IC0gMSkgKiA0OworCQkJTElORk8oY3VybHVuLCAiZmlsZSB0b28gYmlnOiAlc1xuIiwgZmlsZW5hbWUpOworCQkJTElORk8oY3VybHVuLCAidXNpbmcgb25seSBmaXJzdCAlZCBibG9ja3NcbiIsCisJCQkJCShpbnQpIG51bV9zZWN0b3JzKTsKKwkJfQorCX0KKwlpZiAobnVtX3NlY3RvcnMgPCBtaW5fc2VjdG9ycykgewogCQlMSU5GTyhjdXJsdW4sICJmaWxlIHRvbyBzbWFsbDogJXNcbiIsIGZpbGVuYW1lKTsKIAkJcmMgPSAtRVRPT1NNQUxMOwogCQlnb3RvIG91dDsKQEAgLTM4NjEsOSArMzk3MiwxMiBAQAogCQlnb3RvIG91dDsKIAogCWlmIChtb2RfZGF0YS5yZW1vdmFibGUpIHsJLy8gRW5hYmxlIHRoZSBzdG9yZV94eHggYXR0cmlidXRlcwotCQlkZXZfYXR0cl9yby5hdHRyLm1vZGUgPSBkZXZfYXR0cl9maWxlLmF0dHIubW9kZSA9IDA2NDQ7Ci0JCWRldl9hdHRyX3JvLnN0b3JlID0gc3RvcmVfcm87CisJCWRldl9hdHRyX2ZpbGUuYXR0ci5tb2RlID0gMDY0NDsKIAkJZGV2X2F0dHJfZmlsZS5zdG9yZSA9IHN0b3JlX2ZpbGU7CisJCWlmICghbW9kX2RhdGEuY2Ryb20pIHsKKwkJCWRldl9hdHRyX3JvLmF0dHIubW9kZSA9IDA2NDQ7CisJCQlkZXZfYXR0cl9yby5zdG9yZSA9IHN0b3JlX3JvOworCQl9CiAJfQogCiAJLyogRmluZCBvdXQgaG93IG1hbnkgTFVOcyB0aGVyZSBzaG91bGQgYmUgKi8KQEAgLTM4ODgsNiArNDAwMiw4IEBACiAJZm9yIChpID0gMDsgaSA8IGZzZy0+bmx1bnM7ICsraSkgewogCQljdXJsdW4gPSAmZnNnLT5sdW5zW2ldOwogCQljdXJsdW4tPnJvID0gbW9kX2RhdGEucm9baV07CisJCWlmIChtb2RfZGF0YS5jZHJvbSkKKwkJCWN1cmx1bi0+cm8gPSAxOwogCQljdXJsdW4tPmRldi5yZWxlYXNlID0gbHVuX3JlbGVhc2U7CiAJCWN1cmx1bi0+ZGV2LnBhcmVudCA9ICZnYWRnZXQtPmRldjsKIAkJY3VybHVuLT5kZXYuZHJpdmVyID0gJmZzZ19kcml2ZXIuZHJpdmVyOwpAQCAtNDA0Nyw5ICs0MTYzLDkgQEAKIAkJCW1vZF9kYXRhLnByb3RvY29sX25hbWUsIG1vZF9kYXRhLnByb3RvY29sX3R5cGUpOwogCURCRyhmc2csICJWZW5kb3JJRD14JTA0eCwgUHJvZHVjdElEPXglMDR4LCBSZWxlYXNlPXglMDR4XG4iLAogCQkJbW9kX2RhdGEudmVuZG9yLCBtb2RfZGF0YS5wcm9kdWN0LCBtb2RfZGF0YS5yZWxlYXNlKTsKLQlEQkcoZnNnLCAicmVtb3ZhYmxlPSVkLCBzdGFsbD0lZCwgYnVmbGVuPSV1XG4iLAorCURCRyhmc2csICJyZW1vdmFibGU9JWQsIHN0YWxsPSVkLCBjZHJvbT0lZCwgYnVmbGVuPSV1XG4iLAogCQkJbW9kX2RhdGEucmVtb3ZhYmxlLCBtb2RfZGF0YS5jYW5fc3RhbGwsCi0JCQltb2RfZGF0YS5idWZsZW4pOworCQkJbW9kX2RhdGEuY2Ryb20sIG1vZF9kYXRhLmJ1Zmxlbik7CiAJREJHKGZzZywgIkkvTyB0aHJlYWQgcGlkOiAlZFxuIiwgdGFza19waWRfbnIoZnNnLT50aHJlYWRfdGFzaykpOwogCiAJc2V0X2JpdChSRUdJU1RFUkVELCAmZnNnLT5hdG9taWNfYml0ZmxhZ3MpOwpAQCAtNDA2Niw2ICs0MTgyLDcgQEAKIAlmc2ctPnN0YXRlID0gRlNHX1NUQVRFX1RFUk1JTkFURUQ7CS8vIFRoZSB0aHJlYWQgaXMgZGVhZAogCWZzZ191bmJpbmQoZ2FkZ2V0KTsKIAljbG9zZV9hbGxfYmFja2luZ19maWxlcyhmc2cpOworCWNvbXBsZXRlKCZmc2ctPnRocmVhZF9ub3RpZmllcik7CiAJcmV0dXJuIHJjOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnNsX3FlX3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZzbF9xZV91ZGMuYwppbmRleCBiMzQwOGZmLi5kNmM1YmNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnNsX3FlX3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mc2xfcWVfdWRjLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KQEAgLTM3MCw2ICszNzEsOSBAQAogCS8qIGFsbG9jIG11bHRpLXJhbSBmb3IgQkQgcmluZ3MgYW5kIHNldCB0aGUgZXAgcGFyYW1ldGVycyAqLwogCXRtcF9hZGRyID0gY3BtX211cmFtX2FsbG9jKHNpemVvZihzdHJ1Y3QgcWVfYmQpICogKGJkcmluZ19sZW4gKwogCQkJCVVTQl9CRFJJTkdfTEVOX1RYKSwgUUVfQUxJR05NRU5UX09GX0JEKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHRtcF9hZGRyKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlvdXRfYmUxNigmZXBwYXJhbS0+cmJhc2UsICh1MTYpdG1wX2FkZHIpOwogCW91dF9iZTE2KCZlcHBhcmFtLT50YmFzZSwgKHUxNikodG1wX2FkZHIgKwogCQkJCShzaXplb2Yoc3RydWN0IHFlX2JkKSAqIGJkcmluZ19sZW4pKSk7CkBAIC02ODksNyArNjkzLDcgQEAKIGVuX2RvbmUxOgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVkYy0+bG9jaywgZmxhZ3MpOwogZW5fZG9uZToKLQlkZXZfZGJnKHVkYy0+ZGV2LCAiZmFpbGVkIHRvIGluaXRpYWxpemUgJXNcbiIsIGVwLT5lcC5uYW1lKTsKKwlkZXZfZXJyKHVkYy0+ZGV2LCAiZmFpbGVkIHRvIGluaXRpYWxpemUgJXNcbiIsIGVwLT5lcC5uYW1lKTsKIAlyZXR1cm4gLUVOT0RFVjsKIH0KIApAQCAtMjQwOCw2ICsyNDEyLDggQEAKIAl0bXBfYWRkciA9IGNwbV9tdXJhbV9hbGxvYygoVVNCX01BWF9FTkRQT0lOVFMgKgogCQkJCQlzaXplb2Yoc3RydWN0IHVzYl9lcF9wYXJhKSksCiAJCQkJCSAgIFVTQl9FUF9QQVJBX0FMSUdOTUVOVCk7CisJaWYgKElTX0VSUl9WQUxVRSh0bXBfYWRkcikpCisJCWdvdG8gY2xlYW51cDsKIAogCWZvciAoaSA9IDA7IGkgPCBVU0JfTUFYX0VORFBPSU5UUzsgaSsrKSB7CiAJCW91dF9iZTE2KCZ1c2JwcmFtLT5lcHB0cltpXSwgKHUxNil0bXBfYWRkcik7CkBAIC0yNTEzLDcgKzI1MTksNyBAQAogCS8qIEluaXRpYWxpemUgdGhlIHVkYyBzdHJ1Y3R1cmUgaW5jbHVkaW5nIFFIIG1lbWJlciBhbmQgb3RoZXIgbWVtYmVyICovCiAJdWRjX2NvbnRyb2xsZXIgPSBxZV91ZGNfY29uZmlnKG9mZGV2KTsKIAlpZiAoIXVkY19jb250cm9sbGVyKSB7Ci0JCWRldl9kYmcoJm9mZGV2LT5kZXYsICJ1ZGNfY29udHJvbGwgaXMgTlVMTFxuIik7CisJCWRldl9lcnIoJm9mZGV2LT5kZXYsICJmYWlsZWQgdG8gaW5pdGlhbGl6ZVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMjU0NSw3ICsyNTUxLDcgQEAKIAogCWRldmljZV9pbml0aWFsaXplKCZ1ZGNfY29udHJvbGxlci0+Z2FkZ2V0LmRldik7CiAKLQlzdHJjcHkodWRjX2NvbnRyb2xsZXItPmdhZGdldC5kZXYuYnVzX2lkLCAiZ2FkZ2V0Iik7CisJZGV2X3NldF9uYW1lKCZ1ZGNfY29udHJvbGxlci0+Z2FkZ2V0LmRldiwgImdhZGdldCIpOwogCiAJdWRjX2NvbnRyb2xsZXItPmdhZGdldC5kZXYucmVsZWFzZSA9IHFlX3VkY19yZWxlYXNlOwogCXVkY19jb250cm9sbGVyLT5nYWRnZXQuZGV2LnBhcmVudCA9ICZvZmRldi0+ZGV2OwpAQCAtMjU2OCw3ICsyNTc0LDcgQEAKIAkvKiBjcmVhdGUgYSBidWYgZm9yIFpMUCBzZW5kLCBuZWVkIHRvIHJlbWFpbiB6ZXJvZWQgKi8KIAl1ZGNfY29udHJvbGxlci0+bnVsbGJ1ZiA9IGt6YWxsb2MoMjU2LCBHRlBfS0VSTkVMKTsKIAlpZiAodWRjX2NvbnRyb2xsZXItPm51bGxidWYgPT0gTlVMTCkgewotCQlkZXZfZGJnKHVkY19jb250cm9sbGVyLT5kZXYsICJjYW5ub3QgYWxsb2MgbnVsbGJ1ZlxuIik7CisJCWRldl9lcnIodWRjX2NvbnRyb2xsZXItPmRldiwgImNhbm5vdCBhbGxvYyBudWxsYnVmXG4iKTsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnIzOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9nYWRnZXRfY2hpcHMuaCBiL2RyaXZlcnMvdXNiL2dhZGdldC9nYWRnZXRfY2hpcHMuaAppbmRleCA0ZTMxMDdkLi5lYzZkNDM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZ2FkZ2V0X2NoaXBzLmgKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2dhZGdldF9jaGlwcy5oCkBAIC0xMTAsNyArMTEwLDYgQEAKICNkZWZpbmUgZ2FkZ2V0X2lzX2F0OTEoZykJMAogI2VuZGlmCiAKLS8qIHN0YXR1cyB1bmNsZWFyICovCiAjaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfSU1YCiAjZGVmaW5lIGdhZGdldF9pc19pbXgoZykJIXN0cmNtcCgiaW14X3VkYyIsIChnKS0+bmFtZSkKICNlbHNlCkBAIC0xNTgsNiArMTU3LDExIEBACiAjZGVmaW5lIGdhZGdldF9pc19mc2xfcWUoZykJMAogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfVVNCX0dBREdFVF9DSTEzWFhYCisjZGVmaW5lIGdhZGdldF9pc19jaTEzeHh4KGcpCSghc3RyY21wKCJjaTEzeHh4X3VkYyIsIChnKS0+bmFtZSkpCisjZWxzZQorI2RlZmluZSBnYWRnZXRfaXNfY2kxM3h4eChnKQkwCisjZW5kaWYKIAogLy8gQ09ORklHX1VTQl9HQURHRVRfU1gyCiAvLyBDT05GSUdfVVNCX0dBREdFVF9BVTFYMDAKQEAgLTIyNSw2ICsyMjksOCBAQAogCQlyZXR1cm4gMHgyMTsKIAllbHNlIGlmIChnYWRnZXRfaXNfZnNsX3FlKGdhZGdldCkpCiAJCXJldHVybiAweDIyOworCWVsc2UgaWYgKGdhZGdldF9pc19jaTEzeHh4KGdhZGdldCkpCisJCXJldHVybiAweDIzOwogCXJldHVybiAtRU5PRU5UOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZ29rdV91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9nb2t1X3VkYy5jCmluZGV4IDYwYWEwNDguLjYzNDE5YzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9nb2t1X3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9nb2t1X3VkYy5jCkBAIC0xMzQ5LDcgKzEzNDksNyBAQAogCWludAkJCXJldHZhbDsKIAogCWlmICghZHJpdmVyCi0JCQl8fCBkcml2ZXItPnNwZWVkICE9IFVTQl9TUEVFRF9GVUxMCisJCQl8fCBkcml2ZXItPnNwZWVkIDwgVVNCX1NQRUVEX0ZVTEwKIAkJCXx8ICFkcml2ZXItPmJpbmQKIAkJCXx8ICFkcml2ZXItPmRpc2Nvbm5lY3QKIAkJCXx8ICFkcml2ZXItPnNldHVwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2lteF91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9pbXhfdWRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RlOGZkZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9pbXhfdWRjLmMKQEAgLTAsMCArMSwxNTE2IEBACisvKgorICoJZHJpdmVyL3VzYi9nYWRnZXQvaW14X3VkYy5jCisgKgorICoJQ29weXJpZ2h0IChDKSAyMDA1IE1pa2UgTGVlKGVlbWlrZUBnbWFpbC5jb20pCisgKglDb3B5cmlnaHQgKEMpIDIwMDggRGFyaXVzIEF1Z3VsaXMgPGF1Z3VsaXMuZGFyaXVzQGdtYWlsLmNvbT4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGxpbnV4L3VzYi9jaDkuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvZ2FkZ2V0Lmg+CisKKyNpbmNsdWRlIDxtYWNoL3VzYi5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKworI2luY2x1ZGUgImlteF91ZGMuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgZHJpdmVyX25hbWVbXSA9ICJpbXhfdWRjIjsKK3N0YXRpYyBjb25zdCBjaGFyIGVwMG5hbWVbXSA9ICJlcDAiOworCit2b2lkIGVwMF9jaGdfc3RhdChjb25zdCBjaGFyICpsYWJlbCwgc3RydWN0IGlteF91ZGNfc3RydWN0ICppbXhfdXNiLAorCQkJCQkJCWVudW0gZXAwX3N0YXRlIHN0YXQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSU1YIFVEQyBoYXJkd2FyZSByZWxhdGVkIGZ1bmN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCit2b2lkIGlteF91ZGNfZW5hYmxlKHN0cnVjdCBpbXhfdWRjX3N0cnVjdCAqaW14X3VzYikKK3sKKwlpbnQgdGVtcCA9IF9fcmF3X3JlYWRsKGlteF91c2ItPmJhc2UgKyBVU0JfQ1RSTCk7CisJX19yYXdfd3JpdGVsKHRlbXAgfCBDVFJMX0ZFX0VOQSB8IENUUkxfQUZFX0VOQSwgaW14X3VzYi0+YmFzZSArIFVTQl9DVFJMKTsKKwlpbXhfdXNiLT5nYWRnZXQuc3BlZWQgPSBVU0JfU1BFRURfRlVMTDsKK30KKwordm9pZCBpbXhfdWRjX2Rpc2FibGUoc3RydWN0IGlteF91ZGNfc3RydWN0ICppbXhfdXNiKQoreworCWludCB0ZW1wID0gX19yYXdfcmVhZGwoaW14X3VzYi0+YmFzZSArIFVTQl9DVFJMKTsKKworCV9fcmF3X3dyaXRlbCh0ZW1wICYgfihDVFJMX0ZFX0VOQSB8IENUUkxfQUZFX0VOQSksCisJCSBpbXhfdXNiLT5iYXNlICsgVVNCX0NUUkwpOworCisJZXAwX2NoZ19zdGF0KF9fZnVuY19fLCBpbXhfdXNiLCBFUDBfSURMRSk7CisJaW14X3VzYi0+Z2FkZ2V0LnNwZWVkID0gVVNCX1NQRUVEX1VOS05PV047Cit9CisKK3ZvaWQgaW14X3VkY19yZXNldChzdHJ1Y3QgaW14X3VkY19zdHJ1Y3QgKmlteF91c2IpCit7CisJaW50IHRlbXAgPSBfX3Jhd19yZWFkbChpbXhfdXNiLT5iYXNlICsgVVNCX0VOQUIpOworCisJLyogc2V0IFJTVCBiaXQgKi8KKwlfX3Jhd193cml0ZWwodGVtcCB8IEVOQUJfUlNULCBpbXhfdXNiLT5iYXNlICsgVVNCX0VOQUIpOworCisJLyogd2FpdCBSU1QgYml0IHRvIGNsZWFyICovCisJZG8ge30gd2hpbGUgKF9fcmF3X3JlYWRsKGlteF91c2ItPmJhc2UgKyBVU0JfRU5BQikgJiBFTkFCX1JTVCk7CisKKwkvKiB3YWl0IENGRyBiaXQgdG8gYXNzZXJ0ICovCisJZG8ge30gd2hpbGUgKCEoX19yYXdfcmVhZGwoaW14X3VzYi0+YmFzZSArIFVTQl9EQURSKSAmIERBRFJfQ0ZHKSk7CisKKwkvKiB1ZGMgbW9kdWxlIGlzIG5vdyByZWFkeSAqLworfQorCit2b2lkIGlteF91ZGNfY29uZmlnKHN0cnVjdCBpbXhfdWRjX3N0cnVjdCAqaW14X3VzYikKK3sKKwl1OCBlcF9jb25mWzVdOworCXU4IGksIGosIGNmZzsKKwlzdHJ1Y3QgaW14X2VwX3N0cnVjdCAqaW14X2VwOworCisJLyogd2FpdCBDRkcgYml0IHRvIGFzc2VydCAqLworCWRvIHt9IHdoaWxlICghKF9fcmF3X3JlYWRsKGlteF91c2ItPmJhc2UgKyBVU0JfREFEUikgJiBEQURSX0NGRykpOworCisJLyogRG93bmxvYWQgdGhlIGVuZHBvaW50IGJ1ZmZlciBmb3IgZW5kcG9pbnQgMC4gKi8KKwlmb3IgKGogPSAwOyBqIDwgNTsgaisrKSB7CisJCWkgPSAoaiA9PSAyID8gaW14X3VzYi0+aW14X2VwWzBdLmZpZm9zaXplIDogMHgwMCk7CisJCV9fcmF3X3dyaXRlYihpLCBpbXhfdXNiLT5iYXNlICsgVVNCX0REQVQpOworCQlkbyB7fSB3aGlsZSAoX19yYXdfcmVhZGwoaW14X3VzYi0+YmFzZSArIFVTQl9EQURSKSAmIERBRFJfQlNZKTsKKwl9CisKKwkvKiBEb3dubG9hZCB0aGUgZW5kcG9pbnQgYnVmZmVycyBmb3IgZW5kcG9pbnRzIDEtNS4KKwkgKiBXZSBzcGVjaWZ5IHR3byBjb25maWd1cmF0aW9ucywgb25lIGludGVyZmFjZQorCSAqLworCWZvciAoY2ZnID0gMTsgY2ZnIDwgMzsgY2ZnKyspIHsKKwkJZm9yIChpID0gMTsgaSA8IElNWF9VU0JfTkJfRVA7IGkrKykgeworCQkJaW14X2VwID0gJmlteF91c2ItPmlteF9lcFtpXTsKKwkJCS8qIEVQIG5vIHwgQ29uZmlnIG5vICovCisJCQllcF9jb25mWzBdID0gKGkgPDwgNCkgfCAoY2ZnIDw8IDIpOworCQkJLyogVHlwZSB8IERpcmVjdGlvbiAqLworCQkJZXBfY29uZlsxXSA9IChpbXhfZXAtPmJtQXR0cmlidXRlcyA8PCAzKSB8CisJCQkJCShFUF9ESVIoaW14X2VwKSA8PCAyKTsKKwkJCS8qIE1heCBwYWNrZXQgc2l6ZSAqLworCQkJZXBfY29uZlsyXSA9IGlteF9lcC0+Zmlmb3NpemU7CisJCQkvKiBUUlhUWVAgKi8KKwkJCWVwX2NvbmZbM10gPSAweEMwOworCQkJLyogRklGTyBubyAqLworCQkJZXBfY29uZls0XSA9IGk7CisKKwkJCURfSU5JKGlteF91c2ItPmRldiwKKwkJCQkiPCVzPiBlcCVkX2NvbmZbJWRdOiIKKwkJCQkiWyUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeF1cbiIsCisJCQkJX19mdW5jX18sIGksIGNmZywKKwkJCQllcF9jb25mWzBdLCBlcF9jb25mWzFdLCBlcF9jb25mWzJdLAorCQkJCWVwX2NvbmZbM10sIGVwX2NvbmZbNF0pOworCisJCQlmb3IgKGogPSAwOyBqIDwgNTsgaisrKSB7CisJCQkJX19yYXdfd3JpdGViKGVwX2NvbmZbal0sCisJCQkJCWlteF91c2ItPmJhc2UgKyBVU0JfRERBVCk7CisJCQkJZG8ge30gd2hpbGUgKF9fcmF3X3JlYWRsKGlteF91c2ItPmJhc2UgKyBVU0JfREFEUikKKwkJCQkJJiBEQURSX0JTWSk7CisJCQl9CisJCX0KKwl9CisKKwkvKiB3YWl0IENGRyBiaXQgdG8gY2xlYXIgKi8KKwlkbyB7fSB3aGlsZSAoX19yYXdfcmVhZGwoaW14X3VzYi0+YmFzZSArIFVTQl9EQURSKSAmIERBRFJfQ0ZHKTsKK30KKwordm9pZCBpbXhfdWRjX2luaXRfaXJxKHN0cnVjdCBpbXhfdWRjX3N0cnVjdCAqaW14X3VzYikKK3sKKwlpbnQgaTsKKworCS8qIE1hc2sgYW5kIGNsZWFyIGFsbCBpcnFzICovCisJX19yYXdfd3JpdGVsKDB4RkZGRkZGRkYsIGlteF91c2ItPmJhc2UgKyBVU0JfTUFTSyk7CisJX19yYXdfd3JpdGVsKDB4RkZGRkZGRkYsIGlteF91c2ItPmJhc2UgKyBVU0JfSU5UUik7CisJZm9yIChpID0gMDsgaSA8IElNWF9VU0JfTkJfRVA7IGkrKykgeworCQlfX3Jhd193cml0ZWwoMHgxRkYsIGlteF91c2ItPmJhc2UgKyBVU0JfRVBfTUFTSyhpKSk7CisJCV9fcmF3X3dyaXRlbCgweDFGRiwgaW14X3VzYi0+YmFzZSArIFVTQl9FUF9JTlRSKGkpKTsKKwl9CisKKwkvKiBFbmFibGUgVVNCIGlycXMgKi8KKwlfX3Jhd193cml0ZWwoSU5UUl9NU09GIHwgSU5UUl9GUkFNRV9NQVRDSCwgaW14X3VzYi0+YmFzZSArIFVTQl9NQVNLKTsKKworCS8qIEVuYWJsZSBFUDAgaXJxcyAqLworCV9fcmF3X3dyaXRlbCgweDFGRiAmIH4oRVBJTlRSX0RFVlJFUSB8IEVQSU5UUl9NREVWUkVRIHwgRVBJTlRSX0VPVAorCQl8IEVQSU5UUl9FT0YgfCBFUElOVFJfRklGT19FTVBUWSB8IEVQSU5UUl9GSUZPX0ZVTEwpLAorCQlpbXhfdXNiLT5iYXNlICsgVVNCX0VQX01BU0soMCkpOworfQorCit2b2lkIGlteF91ZGNfaW5pdF9lcChzdHJ1Y3QgaW14X3VkY19zdHJ1Y3QgKmlteF91c2IpCit7CisJaW50IGksIG1heCwgdGVtcDsKKwlzdHJ1Y3QgaW14X2VwX3N0cnVjdCAqaW14X2VwOworCWZvciAoaSA9IDA7IGkgPCBJTVhfVVNCX05CX0VQOyBpKyspIHsKKwkJaW14X2VwID0gJmlteF91c2ItPmlteF9lcFtpXTsKKwkJc3dpdGNoIChpbXhfZXAtPmZpZm9zaXplKSB7CisJCWNhc2UgODoKKwkJCW1heCA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAxNjoKKwkJCW1heCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAzMjoKKwkJCW1heCA9IDI7CisJCQlicmVhazsKKwkJY2FzZSA2NDoKKwkJCW1heCA9IDM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCW1heCA9IDE7CisJCQlicmVhazsKKwkJfQorCQl0ZW1wID0gKEVQX0RJUihpbXhfZXApIDw8IDcpIHwgKG1heCA8PCA1KQorCQkJfCAoaW14X2VwLT5ibUF0dHJpYnV0ZXMgPDwgMyk7CisJCV9fcmF3X3dyaXRlbCh0ZW1wLCBpbXhfdXNiLT5iYXNlICsgVVNCX0VQX1NUQVQoaSkpOworCQlfX3Jhd193cml0ZWwodGVtcCB8IEVQU1RBVF9GTFVTSCwgaW14X3VzYi0+YmFzZSArIFVTQl9FUF9TVEFUKGkpKTsKKwkJRF9JTkkoaW14X3VzYi0+ZGV2LCAiPCVzPiBlcCVkX3N0YXQgJTA4eFxuIiwgX19mdW5jX18sIGksCisJCQlfX3Jhd19yZWFkbChpbXhfdXNiLT5iYXNlICsgVVNCX0VQX1NUQVQoaSkpKTsKKwl9Cit9CisKK3ZvaWQgaW14X3VkY19pbml0X2ZpZm8oc3RydWN0IGlteF91ZGNfc3RydWN0ICppbXhfdXNiKQoreworCWludCBpLCB0ZW1wOworCXN0cnVjdCBpbXhfZXBfc3RydWN0ICppbXhfZXA7CisJZm9yIChpID0gMDsgaSA8IElNWF9VU0JfTkJfRVA7IGkrKykgeworCQlpbXhfZXAgPSAmaW14X3VzYi0+aW14X2VwW2ldOworCisJCS8qIEZpZm8gY29udHJvbCAqLworCQl0ZW1wID0gRVBfRElSKGlteF9lcCkgPyAweDBCMDAwMDAwIDogMHgwRjAwMDAwMDsKKwkJX19yYXdfd3JpdGVsKHRlbXAsIGlteF91c2ItPmJhc2UgKyBVU0JfRVBfRkNUUkwoaSkpOworCQlEX0lOSShpbXhfdXNiLT5kZXYsICI8JXM+IGVwJWRfZmN0cmwgJTA4eFxuIiwgX19mdW5jX18sIGksCisJCQlfX3Jhd19yZWFkbChpbXhfdXNiLT5iYXNlICsgVVNCX0VQX0ZDVFJMKGkpKSk7CisKKwkJLyogRmlmbyBhbGFybSAqLworCQl0ZW1wID0gKGkgPyBpbXhfZXAtPmZpZm9zaXplIC8gMiA6IDApOworCQlfX3Jhd193cml0ZWwodGVtcCwgaW14X3VzYi0+YmFzZSArIFVTQl9FUF9GQUxSTShpKSk7CisJCURfSU5JKGlteF91c2ItPmRldiwgIjwlcz4gZXAlZF9mYWxybSAlMDh4XG4iLCBfX2Z1bmNfXywgaSwKKwkJCV9fcmF3X3JlYWRsKGlteF91c2ItPmJhc2UgKyBVU0JfRVBfRkFMUk0oaSkpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGlteF91ZGNfaW5pdChzdHJ1Y3QgaW14X3VkY19zdHJ1Y3QgKmlteF91c2IpCit7CisJLyogUmVzZXQgVURDICovCisJaW14X3VkY19yZXNldChpbXhfdXNiKTsKKworCS8qIERvd25sb2FkIGNvbmZpZyB0byBlbnBvaW50IGJ1ZmZlciAqLworCWlteF91ZGNfY29uZmlnKGlteF91c2IpOworCisJLyogU2V0dXAgaW50ZXJydXBzICovCisJaW14X3VkY19pbml0X2lycShpbXhfdXNiKTsKKworCS8qIFNldHVwIGVuZHBvaW50cyAqLworCWlteF91ZGNfaW5pdF9lcChpbXhfdXNiKTsKKworCS8qIFNldHVwIGZpZm9zICovCisJaW14X3VkY19pbml0X2ZpZm8oaW14X3VzYik7Cit9CisKK3ZvaWQgaW14X2VwX2lycV9lbmFibGUoc3RydWN0IGlteF9lcF9zdHJ1Y3QgKmlteF9lcCkKK3sKKworCWludCBpID0gRVBfTk8oaW14X2VwKTsKKworCV9fcmF3X3dyaXRlbCgweDFGRiwgaW14X2VwLT5pbXhfdXNiLT5iYXNlICsgVVNCX0VQX01BU0soaSkpOworCV9fcmF3X3dyaXRlbCgweDFGRiwgaW14X2VwLT5pbXhfdXNiLT5iYXNlICsgVVNCX0VQX0lOVFIoaSkpOworCV9fcmF3X3dyaXRlbCgweDFGRiAmIH4oRVBJTlRSX0VPVCB8IEVQSU5UUl9FT0YpLAorCQlpbXhfZXAtPmlteF91c2ItPmJhc2UgKyBVU0JfRVBfTUFTSyhpKSk7Cit9CisKK3ZvaWQgaW14X2VwX2lycV9kaXNhYmxlKHN0cnVjdCBpbXhfZXBfc3RydWN0ICppbXhfZXApCit7CisKKwlpbnQgaSA9IEVQX05PKGlteF9lcCk7CisKKwlfX3Jhd193cml0ZWwoMHgxRkYsIGlteF9lcC0+aW14X3VzYi0+YmFzZSArIFVTQl9FUF9NQVNLKGkpKTsKKwlfX3Jhd193cml0ZWwoMHgxRkYsIGlteF9lcC0+aW14X3VzYi0+YmFzZSArIFVTQl9FUF9JTlRSKGkpKTsKK30KKworaW50IGlteF9lcF9lbXB0eShzdHJ1Y3QgaW14X2VwX3N0cnVjdCAqaW14X2VwKQoreworCXN0cnVjdCBpbXhfdWRjX3N0cnVjdCAqaW14X3VzYiA9IGlteF9lcC0+aW14X3VzYjsKKworCXJldHVybiBfX3Jhd19yZWFkbChpbXhfdXNiLT5iYXNlICsgVVNCX0VQX0ZTVEFUKEVQX05PKGlteF9lcCkpKQorCQkJJiBGU1RBVF9FTVBUWTsKK30KKwordW5zaWduZWQgaW14X2ZpZm9fYmNvdW50KHN0cnVjdCBpbXhfZXBfc3RydWN0ICppbXhfZXApCit7CisJc3RydWN0IGlteF91ZGNfc3RydWN0ICppbXhfdXNiID0gaW14X2VwLT5pbXhfdXNiOworCisJcmV0dXJuIChfX3Jhd19yZWFkbChpbXhfdXNiLT5iYXNlICsgVVNCX0VQX1NUQVQoRVBfTk8oaW14X2VwKSkpCisJCQkmIEVQU1RBVF9CQ09VTlQpID4+IDE2OworfQorCit2b2lkIGlteF9mbHVzaChzdHJ1Y3QgaW14X2VwX3N0cnVjdCAqaW14X2VwKQoreworCXN0cnVjdCBpbXhfdWRjX3N0cnVjdCAqaW14X3VzYiA9IGlteF9lcC0+aW14X3VzYjsKKworCWludCB0ZW1wID0gX19yYXdfcmVhZGwoaW14X3VzYi0+YmFzZSArIFVTQl9FUF9TVEFUKEVQX05PKGlteF9lcCkpKTsKKwlfX3Jhd193cml0ZWwodGVtcCB8IEVQU1RBVF9GTFVTSCwKKwkJaW14X3VzYi0+YmFzZSArIFVTQl9FUF9TVEFUKEVQX05PKGlteF9lcCkpKTsKK30KKwordm9pZCBpbXhfZXBfc3RhbGwoc3RydWN0IGlteF9lcF9zdHJ1Y3QgKmlteF9lcCkKK3sKKwlzdHJ1Y3QgaW14X3VkY19zdHJ1Y3QgKmlteF91c2IgPSBpbXhfZXAtPmlteF91c2I7CisJaW50IHRlbXAsIGk7CisKKwlEX0VSUihpbXhfdXNiLT5kZXYsICI8JXM+IEZvcmNlZCBzdGFsbCBvbiAlc1xuIiwgX19mdW5jX18sIGlteF9lcC0+ZXAubmFtZSk7CisKKwlpbXhfZmx1c2goaW14X2VwKTsKKworCS8qIFNwZWNpYWwgY2FyZSBmb3IgZXAwICovCisJaWYgKEVQX05PKGlteF9lcCkpIHsKKwkJdGVtcCA9IF9fcmF3X3JlYWRsKGlteF91c2ItPmJhc2UgKyBVU0JfQ1RSTCk7CisJCV9fcmF3X3dyaXRlbCh0ZW1wIHwgQ1RSTF9DTURPVkVSIHwgQ1RSTF9DTURFUlJPUiwgaW14X3VzYi0+YmFzZSArIFVTQl9DVFJMKTsKKwkJZG8geyB9IHdoaWxlIChfX3Jhd19yZWFkbChpbXhfdXNiLT5iYXNlICsgVVNCX0NUUkwpICYgQ1RSTF9DTURPVkVSKTsKKwkJdGVtcCA9IF9fcmF3X3JlYWRsKGlteF91c2ItPmJhc2UgKyBVU0JfQ1RSTCk7CisJCV9fcmF3X3dyaXRlbCh0ZW1wICYgfkNUUkxfQ01ERVJST1IsIGlteF91c2ItPmJhc2UgKyBVU0JfQ1RSTCk7CisJfQorCWVsc2UgeworCQl0ZW1wID0gX19yYXdfcmVhZGwoaW14X3VzYi0+YmFzZSArIFVTQl9FUF9TVEFUKEVQX05PKGlteF9lcCkpKTsKKwkJX19yYXdfd3JpdGVsKHRlbXAgfCBFUFNUQVRfU1RBTEwsCisJCQlpbXhfdXNiLT5iYXNlICsgVVNCX0VQX1NUQVQoRVBfTk8oaW14X2VwKSkpOworCisJCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkgKyspIHsKKwkJCXRlbXAgPSBfX3Jhd19yZWFkbChpbXhfdXNiLT5iYXNlICsgVVNCX0VQX1NUQVQoRVBfTk8oaW14X2VwKSkpOworCSAJCWlmICghdGVtcCAmIEVQU1RBVF9TVEFMTCkKKwkgCQkJYnJlYWs7CisJIAkJdWRlbGF5KDIwKTsKKwkgCX0KKwkJaWYgKGkgPT0gNTApCisJCQlEX0VSUihpbXhfdXNiLT5kZXYsICI8JXM+IE5vbiBmaW5pc2hlZCBzdGFsbCBvbiAlc1xuIiwKKwkJCQlfX2Z1bmNfXywgaW14X2VwLT5lcC5uYW1lKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaW14X3VkY19nZXRfZnJhbWUoc3RydWN0IHVzYl9nYWRnZXQgKl9nYWRnZXQpCit7CisJc3RydWN0IGlteF91ZGNfc3RydWN0ICppbXhfdXNiID0gY29udGFpbmVyX29mKF9nYWRnZXQsCisJCQlzdHJ1Y3QgaW14X3VkY19zdHJ1Y3QsIGdhZGdldCk7CisKKwlyZXR1cm4gX19yYXdfcmVhZGwoaW14X3VzYi0+YmFzZSArIFVTQl9GUkFNRSkgJiAweDdGRjsKK30KKworc3RhdGljIGludCBpbXhfdWRjX3dha2V1cChzdHJ1Y3QgdXNiX2dhZGdldCAqX2dhZGdldCkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFVTQiByZXF1ZXN0IGNvbnRyb2wgZnVuY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK3N0YXRpYyB2b2lkIGVwX2FkZF9yZXF1ZXN0KHN0cnVjdCBpbXhfZXBfc3RydWN0ICppbXhfZXAsIHN0cnVjdCBpbXhfcmVxdWVzdCAqcmVxKQoreworCWlmICh1bmxpa2VseSghcmVxKSkKKwkJcmV0dXJuOworCisJcmVxLT5pbl91c2UgPSAxOworCWxpc3RfYWRkX3RhaWwoJnJlcS0+cXVldWUsICZpbXhfZXAtPnF1ZXVlKTsKK30KKworc3RhdGljIHZvaWQgZXBfZGVsX3JlcXVlc3Qoc3RydWN0IGlteF9lcF9zdHJ1Y3QgKmlteF9lcCwgc3RydWN0IGlteF9yZXF1ZXN0ICpyZXEpCit7CisJaWYgKHVubGlrZWx5KCFyZXEpKQorCQlyZXR1cm47CisKKwlsaXN0X2RlbF9pbml0KCZyZXEtPnF1ZXVlKTsKKwlyZXEtPmluX3VzZSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGRvbmUoc3RydWN0IGlteF9lcF9zdHJ1Y3QgKmlteF9lcCwgc3RydWN0IGlteF9yZXF1ZXN0ICpyZXEsIGludCBzdGF0dXMpCit7CisJZXBfZGVsX3JlcXVlc3QoaW14X2VwLCByZXEpOworCisJaWYgKGxpa2VseShyZXEtPnJlcS5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKSkKKwkJcmVxLT5yZXEuc3RhdHVzID0gc3RhdHVzOworCWVsc2UKKwkJc3RhdHVzID0gcmVxLT5yZXEuc3RhdHVzOworCisJaWYgKHN0YXR1cyAmJiBzdGF0dXMgIT0gLUVTSFVURE9XTikKKwkJRF9FUlIoaW14X2VwLT5pbXhfdXNiLT5kZXYsCisJCQkiPCVzPiBjb21wbGV0ZSAlcyByZXEgJXAgc3RhdCAlZCBsZW4gJXUvJXVcbiIsIF9fZnVuY19fLAorCQkJaW14X2VwLT5lcC5uYW1lLCAmcmVxLT5yZXEsIHN0YXR1cywKKwkJCXJlcS0+cmVxLmFjdHVhbCwgcmVxLT5yZXEubGVuZ3RoKTsKKworCXJlcS0+cmVxLmNvbXBsZXRlKCZpbXhfZXAtPmVwLCAmcmVxLT5yZXEpOworfQorCitzdGF0aWMgdm9pZCBudWtlKHN0cnVjdCBpbXhfZXBfc3RydWN0ICppbXhfZXAsIGludCBzdGF0dXMpCit7CisJc3RydWN0IGlteF9yZXF1ZXN0ICpyZXE7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmlteF9lcC0+cXVldWUpKSB7CisJCXJlcSA9IGxpc3RfZW50cnkoaW14X2VwLT5xdWV1ZS5uZXh0LCBzdHJ1Y3QgaW14X3JlcXVlc3QsIHF1ZXVlKTsKKwkJZG9uZShpbXhfZXAsIHJlcSwgc3RhdHVzKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEYXRhIHRhbnNmZXIgb3ZlciBVU0IgZnVuY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitzdGF0aWMgaW50IHJlYWRfcGFja2V0KHN0cnVjdCBpbXhfZXBfc3RydWN0ICppbXhfZXAsIHN0cnVjdCBpbXhfcmVxdWVzdCAqcmVxKQoreworCXU4CSpidWY7CisJaW50CWJ5dGVzX2VwLCBidWZmZXJzcGFjZSwgY291bnQsIGk7CisKKwlieXRlc19lcCA9IGlteF9maWZvX2Jjb3VudChpbXhfZXApOworCWJ1ZmZlcnNwYWNlID0gcmVxLT5yZXEubGVuZ3RoIC0gcmVxLT5yZXEuYWN0dWFsOworCisJYnVmID0gcmVxLT5yZXEuYnVmICsgcmVxLT5yZXEuYWN0dWFsOworCXByZWZldGNodyhidWYpOworCisJaWYgKHVubGlrZWx5KGlteF9lcF9lbXB0eShpbXhfZXApKSkKKwkJY291bnQgPSAwOwkvKiB6bHAgKi8KKwllbHNlCisJCWNvdW50ID0gbWluKGJ5dGVzX2VwLCBidWZmZXJzcGFjZSk7CisKKwlmb3IgKGkgPSBjb3VudDsgaSA+IDA7IGktLSkKKwkJKmJ1ZisrID0gX19yYXdfcmVhZGIoaW14X2VwLT5pbXhfdXNiLT5iYXNlCisJCQkJCQkrIFVTQl9FUF9GREFUMChFUF9OTyhpbXhfZXApKSk7CisJcmVxLT5yZXEuYWN0dWFsICs9IGNvdW50OworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IHdyaXRlX3BhY2tldChzdHJ1Y3QgaW14X2VwX3N0cnVjdCAqaW14X2VwLCBzdHJ1Y3QgaW14X3JlcXVlc3QgKnJlcSkKK3sKKwl1OAkqYnVmOworCWludAlsZW5ndGgsIGNvdW50LCB0ZW1wOworCisJYnVmID0gcmVxLT5yZXEuYnVmICsgcmVxLT5yZXEuYWN0dWFsOworCXByZWZldGNoKGJ1Zik7CisKKwlsZW5ndGggPSBtaW4ocmVxLT5yZXEubGVuZ3RoIC0gcmVxLT5yZXEuYWN0dWFsLCAodTMyKWlteF9lcC0+Zmlmb3NpemUpOworCisJaWYgKGlteF9maWZvX2Jjb3VudChpbXhfZXApICsgbGVuZ3RoID4gaW14X2VwLT5maWZvc2l6ZSkgeworCQlEX1RSWChpbXhfZXAtPmlteF91c2ItPmRldiwgIjwlcz4gcGFja2V0IG92ZXJmaWxsICVzIGZpZm9cbiIsCisJCQlfX2Z1bmNfXywgaW14X2VwLT5lcC5uYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJlcS0+cmVxLmFjdHVhbCArPSBsZW5ndGg7CisJY291bnQgPSBsZW5ndGg7CisKKwlpZiAoIWNvdW50ICYmIHJlcS0+cmVxLnplcm8pIHsJLyogemxwICovCisJCXRlbXAgPSBfX3Jhd19yZWFkbChpbXhfZXAtPmlteF91c2ItPmJhc2UKKwkJCSsgVVNCX0VQX1NUQVQoRVBfTk8oaW14X2VwKSkpOworCQlfX3Jhd193cml0ZWwodGVtcCB8IEVQU1RBVF9aTFBTLCBpbXhfZXAtPmlteF91c2ItPmJhc2UKKwkJCSsgVVNCX0VQX1NUQVQoRVBfTk8oaW14X2VwKSkpOworCQlEX1RSWChpbXhfZXAtPmlteF91c2ItPmRldiwgIjwlcz4gemVybyBwYWNrZXRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCisJd2hpbGUgKGNvdW50LS0pIHsKKwkJaWYgKGNvdW50ID09IDApIHsJLyogbGFzdCBieXRlICovCisJCQl0ZW1wID0gX19yYXdfcmVhZGwoaW14X2VwLT5pbXhfdXNiLT5iYXNlCisJCQkJKyBVU0JfRVBfRkNUUkwoRVBfTk8oaW14X2VwKSkpOworCQkJX19yYXdfd3JpdGVsKHRlbXAgfCBGQ1RSTF9XRlIsIGlteF9lcC0+aW14X3VzYi0+YmFzZQorCQkJCSsgVVNCX0VQX0ZDVFJMKEVQX05PKGlteF9lcCkpKTsKKwkJfQorCQlfX3Jhd193cml0ZWIoKmJ1ZisrLAorCQkJaW14X2VwLT5pbXhfdXNiLT5iYXNlICsgVVNCX0VQX0ZEQVQwKEVQX05PKGlteF9lcCkpKTsKKwl9CisKKwlyZXR1cm4gbGVuZ3RoOworfQorCitzdGF0aWMgaW50IHJlYWRfZmlmbyhzdHJ1Y3QgaW14X2VwX3N0cnVjdCAqaW14X2VwLCBzdHJ1Y3QgaW14X3JlcXVlc3QgKnJlcSkKK3sKKwlpbnQgCWJ5dGVzID0gMCwKKwkJY291bnQsCisJCWNvbXBsZXRlZCA9IDA7CisKKwl3aGlsZSAoX19yYXdfcmVhZGwoaW14X2VwLT5pbXhfdXNiLT5iYXNlICsgVVNCX0VQX0ZTVEFUKEVQX05PKGlteF9lcCkpKQorCQkmIEZTVEFUX0ZSKSB7CisJCQljb3VudCA9IHJlYWRfcGFja2V0KGlteF9lcCwgcmVxKTsKKwkJCWJ5dGVzICs9IGNvdW50OworCisJCQljb21wbGV0ZWQgPSAoY291bnQgIT0gaW14X2VwLT5maWZvc2l6ZSk7CisJCQlpZiAoY29tcGxldGVkIHx8IHJlcS0+cmVxLmFjdHVhbCA9PSByZXEtPnJlcS5sZW5ndGgpIHsKKwkJCQljb21wbGV0ZWQgPSAxOworCQkJCWJyZWFrOworCQkJfQorCX0KKworCWlmIChjb21wbGV0ZWQgfHwgIXJlcS0+cmVxLmxlbmd0aCkgeworCQlkb25lKGlteF9lcCwgcmVxLCAwKTsKKwkJRF9SRVEoaW14X2VwLT5pbXhfdXNiLT5kZXYsICI8JXM+ICVzIHJlcTwlcD4gJXNcbiIsCisJCQlfX2Z1bmNfXywgaW14X2VwLT5lcC5uYW1lLCByZXEsCisJCQljb21wbGV0ZWQgPyAiY29tcGxldGVkIiA6ICJub3QgY29tcGxldGVkIik7CisJCWlmICghRVBfTk8oaW14X2VwKSkKKwkJCWVwMF9jaGdfc3RhdChfX2Z1bmNfXywgaW14X2VwLT5pbXhfdXNiLCBFUDBfSURMRSk7CisJfQorCisJRF9UUlgoaW14X2VwLT5pbXhfdXNiLT5kZXYsICI8JXM+IGJ5dGVzIHJlYWQ6ICVkXG4iLCBfX2Z1bmNfXywgYnl0ZXMpOworCisJcmV0dXJuIGNvbXBsZXRlZDsKK30KKworc3RhdGljIGludCB3cml0ZV9maWZvKHN0cnVjdCBpbXhfZXBfc3RydWN0ICppbXhfZXAsIHN0cnVjdCBpbXhfcmVxdWVzdCAqcmVxKQoreworCWludAlieXRlcyA9IDAsCisJCWNvdW50LAorCQljb21wbGV0ZWQgPSAwOworCisJd2hpbGUgKCFjb21wbGV0ZWQpIHsKKwkJY291bnQgPSB3cml0ZV9wYWNrZXQoaW14X2VwLCByZXEpOworCQlpZiAoY291bnQgPCAwKQorCQkJYnJlYWs7IC8qIGJ1c3kgKi8KKwkJYnl0ZXMgKz0gY291bnQ7CisKKwkJLyogbGFzdCBwYWNrZXQgIm11c3QgYmUiIHNob3J0IChvciBhIHpscCkgKi8KKwkJY29tcGxldGVkID0gKGNvdW50ICE9IGlteF9lcC0+Zmlmb3NpemUpOworCisJCWlmICh1bmxpa2VseShjb21wbGV0ZWQpKSB7CisJCQlkb25lKGlteF9lcCwgcmVxLCAwKTsKKwkJCURfUkVRKGlteF9lcC0+aW14X3VzYi0+ZGV2LCAiPCVzPiAlcyByZXE8JXA+ICVzXG4iLAorCQkJCV9fZnVuY19fLCBpbXhfZXAtPmVwLm5hbWUsIHJlcSwKKwkJCQljb21wbGV0ZWQgPyAiY29tcGxldGVkIiA6ICJub3QgY29tcGxldGVkIik7CisJCQlpZiAoIUVQX05PKGlteF9lcCkpCisJCQkJZXAwX2NoZ19zdGF0KF9fZnVuY19fLCBpbXhfZXAtPmlteF91c2IsIEVQMF9JRExFKTsKKwkJfQorCX0KKworCURfVFJYKGlteF9lcC0+aW14X3VzYi0+ZGV2LCAiPCVzPiBieXRlcyBzZW50OiAlZFxuIiwgX19mdW5jX18sIGJ5dGVzKTsKKworCXJldHVybiBjb21wbGV0ZWQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFbmRwb2ludCBoYW5kbGVycworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworc3RhdGljIGludCBoYW5kbGVfZXAoc3RydWN0IGlteF9lcF9zdHJ1Y3QgKmlteF9lcCkKK3sKKwlzdHJ1Y3QgaW14X3JlcXVlc3QgKnJlcTsKKwlpbnQgY29tcGxldGVkID0gMDsKKworCWRvIHsKKwkJaWYgKCFsaXN0X2VtcHR5KCZpbXhfZXAtPnF1ZXVlKSkKKwkJCXJlcSA9IGxpc3RfZW50cnkoaW14X2VwLT5xdWV1ZS5uZXh0LAorCQkJCXN0cnVjdCBpbXhfcmVxdWVzdCwgcXVldWUpOworCQllbHNlIHsKKwkJCURfUkVRKGlteF9lcC0+aW14X3VzYi0+ZGV2LCAiPCVzPiBubyByZXF1ZXN0IG9uICVzXG4iLAorCQkJCV9fZnVuY19fLCBpbXhfZXAtPmVwLm5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoRVBfRElSKGlteF9lcCkpCS8qIHRvIGhvc3QgKi8KKwkJCWNvbXBsZXRlZCA9IHdyaXRlX2ZpZm8oaW14X2VwLCByZXEpOworCQllbHNlCQkJLyogdG8gZGV2aWNlICovCisJCQljb21wbGV0ZWQgPSByZWFkX2ZpZm8oaW14X2VwLCByZXEpOworCisJCWR1bXBfZXBfc3RhdChfX2Z1bmNfXywgaW14X2VwKTsKKworCX0gd2hpbGUgKGNvbXBsZXRlZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYW5kbGVfZXAwKHN0cnVjdCBpbXhfZXBfc3RydWN0ICppbXhfZXApCit7CisJc3RydWN0IGlteF9yZXF1ZXN0ICpyZXEgPSBOVUxMOworCWludCByZXQgPSAwOworCisJaWYgKCFsaXN0X2VtcHR5KCZpbXhfZXAtPnF1ZXVlKSkKKwkJcmVxID0gbGlzdF9lbnRyeShpbXhfZXAtPnF1ZXVlLm5leHQsIHN0cnVjdCBpbXhfcmVxdWVzdCwgcXVldWUpOworCisJaWYgKHJlcSkgeworCQlzd2l0Y2ggKGlteF9lcC0+aW14X3VzYi0+ZXAwc3RhdGUpIHsKKworCQljYXNlIEVQMF9JTl9EQVRBX1BIQVNFOgkJCS8qIEdFVF9ERVNDUklQVE9SICovCisJCQl3cml0ZV9maWZvKGlteF9lcCwgcmVxKTsKKwkJCWJyZWFrOworCQljYXNlIEVQMF9PVVRfREFUQV9QSEFTRToJCS8qIFNFVF9ERVNDUklQVE9SICovCisJCQlyZWFkX2ZpZm8oaW14X2VwLCByZXEpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlEX0VQMChpbXhfZXAtPmlteF91c2ItPmRldiwKKwkJCQkiPCVzPiBlcDAgaS9vLCBvZGQgc3RhdGUgJWRcbiIsCisJCQkJX19mdW5jX18sIGlteF9lcC0+aW14X3VzYi0+ZXAwc3RhdGUpOworCQkJZXBfZGVsX3JlcXVlc3QoaW14X2VwLCByZXEpOworCQkJcmV0ID0gLUVMMkhMVDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2VwMF9kZXZyZXEoc3RydWN0IGlteF91ZGNfc3RydWN0ICppbXhfdXNiKQoreworCXN0cnVjdCBpbXhfZXBfc3RydWN0ICppbXhfZXAgPSAmaW14X3VzYi0+aW14X2VwWzBdOworCXVuaW9uIHsKKwkJc3RydWN0IHVzYl9jdHJscmVxdWVzdAlyOworCQl1OAkJCXJhd1s4XTsKKwkJdTMyCQkJd29yZFsyXTsKKwl9IHU7CisJaW50IHRlbXAsIGk7CisKKwludWtlKGlteF9lcCwgLUVQUk9UTyk7CisKKwkvKiByZWFkIFNFVFVQIHBhY2tldCAqLworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJaWYgKGlteF9lcF9lbXB0eShpbXhfZXApKSB7CisJCQlEX0VSUihpbXhfdXNiLT5kZXYsCisJCQkJIjwlcz4gbm8gc2V0dXAgcGFja2V0IHJlY2VpdmVkXG4iLCBfX2Z1bmNfXyk7CisJCQlnb3RvIHN0YWxsOworCQl9CisJCXUud29yZFtpXSA9IF9fcmF3X3JlYWRsKGlteF91c2ItPmJhc2UgKwlVU0JfRVBfRkRBVChFUF9OTyhpbXhfZXApKSk7CisJfQorCisJdGVtcCA9IGlteF9lcF9lbXB0eShpbXhfZXApOworCXdoaWxlICghaW14X2VwX2VtcHR5KGlteF9lcCkpIHsKKwkJaSA9IF9fcmF3X3JlYWRsKGlteF91c2ItPmJhc2UgKwlVU0JfRVBfRkRBVChFUF9OTyhpbXhfZXApKSk7CisJCURfRVJSKGlteF91c2ItPmRldiwKKwkJCSI8JXM+IHdyb25nIHRvIGhhdmUgZXh0cmEgYnl0ZXMgZm9yIHNldHVwIDogMHglMDh4XG4iLAorCQkJX19mdW5jX18sIGkpOworCX0KKwlpZiAoIXRlbXApCisJCWdvdG8gc3RhbGw7CisKKwlsZTE2X3RvX2NwdXMoJnUuci53VmFsdWUpOworCWxlMTZfdG9fY3B1cygmdS5yLndJbmRleCk7CisJbGUxNl90b19jcHVzKCZ1LnIud0xlbmd0aCk7CisKKwlEX1JFUShpbXhfdXNiLT5kZXYsICI8JXM+IFNFVFVQICUwMnguJTAyeCB2JTA0eCBpJTA0eCBsJTA0eFxuIiwKKwkJX19mdW5jX18sIHUuci5iUmVxdWVzdFR5cGUsIHUuci5iUmVxdWVzdCwKKwkJdS5yLndWYWx1ZSwgdS5yLndJbmRleCwgdS5yLndMZW5ndGgpOworCisJaWYgKGlteF91c2ItPnNldF9jb25maWcpIHsKKwkJLyogTkFDSyB0aGUgaG9zdCBieSB1c2luZyBDTURPVkVSICovCisJCXRlbXAgPSBfX3Jhd19yZWFkbChpbXhfdXNiLT5iYXNlICsgVVNCX0NUUkwpOworCQlfX3Jhd193cml0ZWwodGVtcCB8IENUUkxfQ01ET1ZFUiwgaW14X3VzYi0+YmFzZSArIFVTQl9DVFJMKTsKKworCQlEX0VSUihpbXhfdXNiLT5kZXYsCisJCQkiPCVzPiBzZXQgY29uZmlnIHJlcSBpcyBwZW5kaW5nLCBOQUNLIHRoZSBob3N0XG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJaWYgKHUuci5iUmVxdWVzdFR5cGUgJiBVU0JfRElSX0lOKQorCQllcDBfY2hnX3N0YXQoX19mdW5jX18sIGlteF91c2IsIEVQMF9JTl9EQVRBX1BIQVNFKTsKKwllbHNlCisJCWVwMF9jaGdfc3RhdChfX2Z1bmNfXywgaW14X3VzYiwgRVAwX09VVF9EQVRBX1BIQVNFKTsKKworCWkgPSBpbXhfdXNiLT5kcml2ZXItPnNldHVwKCZpbXhfdXNiLT5nYWRnZXQsICZ1LnIpOworCWlmIChpIDwgMCkgeworCQlEX0VSUihpbXhfdXNiLT5kZXYsICI8JXM+IGRldmljZSBzZXR1cCBlcnJvciAlZFxuIiwKKwkJCV9fZnVuY19fLCBpKTsKKwkJZ290byBzdGFsbDsKKwl9CisKKwlyZXR1cm47CitzdGFsbDoKKwlEX0VSUihpbXhfdXNiLT5kZXYsICI8JXM+IHByb3RvY29sIFNUQUxMXG4iLCBfX2Z1bmNfXyk7CisJaW14X2VwX3N0YWxsKGlteF9lcCk7CisJZXAwX2NoZ19zdGF0KF9fZnVuY19fLCBpbXhfdXNiLCBFUDBfU1RBTEwpOworCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFVTQiBnYWRnZXQgY2FsbGJhY2sgZnVuY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK3N0YXRpYyBpbnQgaW14X2VwX2VuYWJsZShzdHJ1Y3QgdXNiX2VwICp1c2JfZXAsCisJCQkJY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICpkZXNjKQoreworCXN0cnVjdCBpbXhfZXBfc3RydWN0ICppbXhfZXAgPSBjb250YWluZXJfb2YodXNiX2VwLAorCQkJCQkJc3RydWN0IGlteF9lcF9zdHJ1Y3QsIGVwKTsKKwlzdHJ1Y3QgaW14X3VkY19zdHJ1Y3QgKmlteF91c2IgPSBpbXhfZXAtPmlteF91c2I7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghdXNiX2VwCisJCXx8ICFkZXNjCisJCXx8ICFFUF9OTyhpbXhfZXApCisJCXx8IGRlc2MtPmJEZXNjcmlwdG9yVHlwZSAhPSBVU0JfRFRfRU5EUE9JTlQKKwkJfHwgaW14X2VwLT5iRW5kcG9pbnRBZGRyZXNzICE9IGRlc2MtPmJFbmRwb2ludEFkZHJlc3MpIHsKKwkJCURfRVJSKGlteF91c2ItPmRldiwKKwkJCQkiPCVzPiBiYWQgZXAgb3IgZGVzY3JpcHRvclxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGlteF9lcC0+Ym1BdHRyaWJ1dGVzICE9IGRlc2MtPmJtQXR0cmlidXRlcykgeworCQlEX0VSUihpbXhfdXNiLT5kZXYsCisJCQkiPCVzPiAlcyB0eXBlIG1pc21hdGNoXG4iLCBfX2Z1bmNfXywgdXNiX2VwLT5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGlteF9lcC0+Zmlmb3NpemUgPCBsZTE2X3RvX2NwdShkZXNjLT53TWF4UGFja2V0U2l6ZSkpIHsKKwkJRF9FUlIoaW14X3VzYi0+ZGV2LAorCQkJIjwlcz4gYmFkICVzIG1heHBhY2tldFxuIiwgX19mdW5jX18sIHVzYl9lcC0+bmFtZSk7CisJCXJldHVybiAtRVJBTkdFOworCX0KKworCWlmICghaW14X3VzYi0+ZHJpdmVyIHx8IGlteF91c2ItPmdhZGdldC5zcGVlZCA9PSBVU0JfU1BFRURfVU5LTk9XTikgeworCQlEX0VSUihpbXhfdXNiLT5kZXYsICI8JXM+IGJvZ3VzIGRldmljZSBzdGF0ZVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVTSFVURE9XTjsKKwl9CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlpbXhfZXAtPnN0b3BwZWQgPSAwOworCWlteF9mbHVzaChpbXhfZXApOworCWlteF9lcF9pcnFfZW5hYmxlKGlteF9lcCk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlEX0VQWChpbXhfdXNiLT5kZXYsICI8JXM+IEVOQUJMRUQgJXNcbiIsIF9fZnVuY19fLCB1c2JfZXAtPm5hbWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlteF9lcF9kaXNhYmxlKHN0cnVjdCB1c2JfZXAgKnVzYl9lcCkKK3sKKwlzdHJ1Y3QgaW14X2VwX3N0cnVjdCAqaW14X2VwID0gY29udGFpbmVyX29mKHVzYl9lcCwKKwkJCQkJCXN0cnVjdCBpbXhfZXBfc3RydWN0LCBlcCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghdXNiX2VwIHx8ICFFUF9OTyhpbXhfZXApIHx8ICFsaXN0X2VtcHR5KCZpbXhfZXAtPnF1ZXVlKSkgeworCQlEX0VSUihpbXhfZXAtPmlteF91c2ItPmRldiwgIjwlcz4gJXMgY2FuIG5vdCBiZSBkaXNhYmxlZFxuIiwKKwkJCV9fZnVuY19fLCB1c2JfZXAgPyBpbXhfZXAtPmVwLm5hbWUgOiBOVUxMKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJaW14X2VwLT5zdG9wcGVkID0gMTsKKwludWtlKGlteF9lcCwgLUVTSFVURE9XTik7CisJaW14X2ZsdXNoKGlteF9lcCk7CisJaW14X2VwX2lycV9kaXNhYmxlKGlteF9lcCk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlEX0VQWChpbXhfZXAtPmlteF91c2ItPmRldiwKKwkJIjwlcz4gRElTQUJMRUQgJXNcbiIsIF9fZnVuY19fLCB1c2JfZXAtPm5hbWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHVzYl9yZXF1ZXN0ICppbXhfZXBfYWxsb2NfcmVxdWVzdAorCQkJCQkoc3RydWN0IHVzYl9lcCAqdXNiX2VwLCBnZnBfdCBnZnBfZmxhZ3MpCit7CisJc3RydWN0IGlteF9yZXF1ZXN0ICpyZXE7CisKKwlyZXEgPSBremFsbG9jKHNpemVvZiAqcmVxLCBnZnBfZmxhZ3MpOworCWlmICghcmVxIHx8ICF1c2JfZXApCisJCXJldHVybiAwOworCisJSU5JVF9MSVNUX0hFQUQoJnJlcS0+cXVldWUpOworCXJlcS0+aW5fdXNlID0gMDsKKworCXJldHVybiAmcmVxLT5yZXE7Cit9CisKK3N0YXRpYyB2b2lkIGlteF9lcF9mcmVlX3JlcXVlc3QKKwkJCShzdHJ1Y3QgdXNiX2VwICp1c2JfZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqdXNiX3JlcSkKK3sKKwlzdHJ1Y3QgaW14X3JlcXVlc3QgKnJlcTsKKworCXJlcSA9IGNvbnRhaW5lcl9vZih1c2JfcmVxLCBzdHJ1Y3QgaW14X3JlcXVlc3QsIHJlcSk7CisJV0FSTl9PTighbGlzdF9lbXB0eSgmcmVxLT5xdWV1ZSkpOworCWtmcmVlKHJlcSk7Cit9CisKK3N0YXRpYyBpbnQgaW14X2VwX3F1ZXVlCisJKHN0cnVjdCB1c2JfZXAgKnVzYl9lcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICp1c2JfcmVxLCBnZnBfdCBnZnBfZmxhZ3MpCit7CisJc3RydWN0IGlteF9lcF9zdHJ1Y3QJKmlteF9lcDsKKwlzdHJ1Y3QgaW14X3VkY19zdHJ1Y3QJKmlteF91c2I7CisJc3RydWN0IGlteF9yZXF1ZXN0CSpyZXE7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisJaW50CQkJcmV0ID0gMDsKKworCWlteF9lcCA9IGNvbnRhaW5lcl9vZih1c2JfZXAsIHN0cnVjdCBpbXhfZXBfc3RydWN0LCBlcCk7CisJaW14X3VzYiA9IGlteF9lcC0+aW14X3VzYjsKKwlyZXEgPSBjb250YWluZXJfb2YodXNiX3JlcSwgc3RydWN0IGlteF9yZXF1ZXN0LCByZXEpOworCisJLyoKKwkgIFNwZWNpYWwgY2FyZSBvbiBJTVggdWRjLgorCSAgSWdub3JlIGVucXVldWUgd2hlbiBhZnRlciBzZXQgY29uZmlndXJhdGlvbiBmcm9tIHRoZQorCSAgaG9zdC4gVGhpcyBhc3N1bWUgYWxsIGdhZGdldCBkcml2ZXJzIHJlcGx5IHNldAorCSAgY29uZmlndXJhdGlvbiB3aXRoIHRoZSBuZXh0IGVwMCByZXEgZW5xdWV1ZS4KKwkqLworCWlmIChpbXhfdXNiLT5zZXRfY29uZmlnICYmICFFUF9OTyhpbXhfZXApKSB7CisJCWlteF91c2ItPnNldF9jb25maWcgPSAwOworCQlEX0VQWChpbXhfdXNiLT5kZXYsCisJCQkiPCVzPiBnYWRnZXQgcmVwbHkgc2V0IGNvbmZpZ1xuIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAodW5saWtlbHkoIXVzYl9yZXEgfHwgIXJlcSB8fCAhdXNiX3JlcS0+Y29tcGxldGUgfHwgIXVzYl9yZXEtPmJ1ZikpIHsKKwkJRF9FUlIoaW14X3VzYi0+ZGV2LCAiPCVzPiBiYWQgcGFyYW1zXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICh1bmxpa2VseSghdXNiX2VwIHx8ICFpbXhfZXApKSB7CisJCURfRVJSKGlteF91c2ItPmRldiwgIjwlcz4gYmFkIGVwXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghaW14X3VzYi0+ZHJpdmVyIHx8IGlteF91c2ItPmdhZGdldC5zcGVlZCA9PSBVU0JfU1BFRURfVU5LTk9XTikgeworCQlEX0VSUihpbXhfdXNiLT5kZXYsICI8JXM+IGJvZ3VzIGRldmljZSBzdGF0ZVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVTSFVURE9XTjsKKwl9CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwkvKiBEZWJ1ZyAqLworCURfUkVRKGlteF91c2ItPmRldiwgIjwlcz4gZXAlZCAlcyByZXF1ZXN0IGZvciBbJWRdIGJ5dGVzXG4iLAorCQlfX2Z1bmNfXywgRVBfTk8oaW14X2VwKSwKKwkJKCghRVBfTk8oaW14X2VwKSAmJiBpbXhfZXAtPmlteF91c2ItPmVwMHN0YXRlID09IEVQMF9JTl9EQVRBX1BIQVNFKQorCQl8fCAoRVBfTk8oaW14X2VwKSAmJiBFUF9ESVIoaW14X2VwKSkpID8gIklOIiA6ICJPVVQiLCB1c2JfcmVxLT5sZW5ndGgpOworCWR1bXBfcmVxKF9fZnVuY19fLCBpbXhfZXAsIHVzYl9yZXEpOworCisJaWYgKGlteF9lcC0+c3RvcHBlZCkgeworCQl1c2JfcmVxLT5zdGF0dXMgPSAtRVNIVVRET1dOOworCQlyZXQgPSAtRVNIVVRET1dOOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAocmVxLT5pbl91c2UpIHsKKwkJRF9FUlIoaW14X3VzYi0+ZGV2LAorCQkJIjwlcz4gcmVmdXNpbmcgdG8gcXVldWUgcmVxICVwIChhbHJlYWR5IHF1ZXVlZClcbiIsCisJCQlfX2Z1bmNfXywgcmVxKTsKKwkJZ290byBvdXQ7CisJfQorCisJdXNiX3JlcS0+c3RhdHVzID0gLUVJTlBST0dSRVNTOworCXVzYl9yZXEtPmFjdHVhbCA9IDA7CisKKwllcF9hZGRfcmVxdWVzdChpbXhfZXAsIHJlcSk7CisKKwlpZiAoIUVQX05PKGlteF9lcCkpCisJCXJldCA9IGhhbmRsZV9lcDAoaW14X2VwKTsKKwllbHNlCisJCXJldCA9IGhhbmRsZV9lcChpbXhfZXApOworb3V0OgorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGlteF9lcF9kZXF1ZXVlKHN0cnVjdCB1c2JfZXAgKnVzYl9lcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICp1c2JfcmVxKQoreworCisJc3RydWN0IGlteF9lcF9zdHJ1Y3QgKmlteF9lcCA9IGNvbnRhaW5lcl9vZgorCQkJCQkodXNiX2VwLCBzdHJ1Y3QgaW14X2VwX3N0cnVjdCwgZXApOworCXN0cnVjdCBpbXhfcmVxdWVzdCAqcmVxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAodW5saWtlbHkoIXVzYl9lcCB8fCAhRVBfTk8oaW14X2VwKSkpIHsKKwkJRF9FUlIoaW14X2VwLT5pbXhfdXNiLT5kZXYsICI8JXM+IGJhZCBlcFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwkvKiBtYWtlIHN1cmUgaXQncyBhY3R1YWxseSBxdWV1ZWQgb24gdGhpcyBlbmRwb2ludCAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkocmVxLCAmaW14X2VwLT5xdWV1ZSwgcXVldWUpIHsKKwkJaWYgKCZyZXEtPnJlcSA9PSB1c2JfcmVxKQorCQkJYnJlYWs7CisJfQorCWlmICgmcmVxLT5yZXEgIT0gdXNiX3JlcSkgeworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRvbmUoaW14X2VwLCByZXEsIC1FQ09OTlJFU0VUKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbXhfZXBfc2V0X2hhbHQoc3RydWN0IHVzYl9lcCAqdXNiX2VwLCBpbnQgdmFsdWUpCit7CisJc3RydWN0IGlteF9lcF9zdHJ1Y3QgKmlteF9lcCA9IGNvbnRhaW5lcl9vZgorCQkJCQkodXNiX2VwLCBzdHJ1Y3QgaW14X2VwX3N0cnVjdCwgZXApOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAodW5saWtlbHkoIXVzYl9lcCB8fCAhRVBfTk8oaW14X2VwKSkpIHsKKwkJRF9FUlIoaW14X2VwLT5pbXhfdXNiLT5kZXYsICI8JXM+IGJhZCBlcFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlpZiAoKGlteF9lcC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9ESVJfSU4pCisJCSYmICFsaXN0X2VtcHR5KCZpbXhfZXAtPnF1ZXVlKSkgeworCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJaW14X2VwX3N0YWxsKGlteF9lcCk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlEX0VQWChpbXhfZXAtPmlteF91c2ItPmRldiwgIjwlcz4gJXMgaGFsdFxuIiwgX19mdW5jX18sIHVzYl9lcC0+bmFtZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW14X2VwX2ZpZm9fc3RhdHVzKHN0cnVjdCB1c2JfZXAgKnVzYl9lcCkKK3sKKwlzdHJ1Y3QgaW14X2VwX3N0cnVjdCAqaW14X2VwID0gY29udGFpbmVyX29mCisJCQkJCSh1c2JfZXAsIHN0cnVjdCBpbXhfZXBfc3RydWN0LCBlcCk7CisKKwlpZiAoIXVzYl9lcCkgeworCQlEX0VSUihpbXhfZXAtPmlteF91c2ItPmRldiwgIjwlcz4gYmFkIGVwXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChpbXhfZXAtPmlteF91c2ItPmdhZGdldC5zcGVlZCA9PSBVU0JfU1BFRURfVU5LTk9XTikKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gaW14X2ZpZm9fYmNvdW50KGlteF9lcCk7Cit9CisKK3N0YXRpYyB2b2lkIGlteF9lcF9maWZvX2ZsdXNoKHN0cnVjdCB1c2JfZXAgKnVzYl9lcCkKK3sKKwlzdHJ1Y3QgaW14X2VwX3N0cnVjdCAqaW14X2VwID0gY29udGFpbmVyX29mCisJCQkJCSh1c2JfZXAsIHN0cnVjdCBpbXhfZXBfc3RydWN0LCBlcCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWlmICghdXNiX2VwIHx8ICFFUF9OTyhpbXhfZXApIHx8ICFsaXN0X2VtcHR5KCZpbXhfZXAtPnF1ZXVlKSkgeworCQlEX0VSUihpbXhfZXAtPmlteF91c2ItPmRldiwgIjwlcz4gYmFkIGVwXG4iLCBfX2Z1bmNfXyk7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIHRvZ2dsZSBhbmQgaGFsdCBiaXRzIHN0YXkgdW5jaGFuZ2VkICovCisJaW14X2ZsdXNoKGlteF9lcCk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2VwX29wcyBpbXhfZXBfb3BzID0geworCS5lbmFibGUJCT0gaW14X2VwX2VuYWJsZSwKKwkuZGlzYWJsZQk9IGlteF9lcF9kaXNhYmxlLAorCisJLmFsbG9jX3JlcXVlc3QJPSBpbXhfZXBfYWxsb2NfcmVxdWVzdCwKKwkuZnJlZV9yZXF1ZXN0CT0gaW14X2VwX2ZyZWVfcmVxdWVzdCwKKworCS5xdWV1ZQkJPSBpbXhfZXBfcXVldWUsCisJLmRlcXVldWUJPSBpbXhfZXBfZGVxdWV1ZSwKKworCS5zZXRfaGFsdAk9IGlteF9lcF9zZXRfaGFsdCwKKwkuZmlmb19zdGF0dXMJPSBpbXhfZXBfZmlmb19zdGF0dXMsCisJLmZpZm9fZmx1c2gJPSBpbXhfZXBfZmlmb19mbHVzaCwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBVU0IgZW5kcG9pbnQgY29udHJvbCBmdW5jdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKwordm9pZCBlcDBfY2hnX3N0YXQoY29uc3QgY2hhciAqbGFiZWwsCisJCQlzdHJ1Y3QgaW14X3VkY19zdHJ1Y3QgKmlteF91c2IsIGVudW0gZXAwX3N0YXRlIHN0YXQpCit7CisJRF9FUDAoaW14X3VzYi0+ZGV2LCAiPCVzPiBmcm9tICUxNXMgdG8gJTE1c1xuIiwKKwkJbGFiZWwsIHN0YXRlX25hbWVbaW14X3VzYi0+ZXAwc3RhdGVdLCBzdGF0ZV9uYW1lW3N0YXRdKTsKKworCWlmIChpbXhfdXNiLT5lcDBzdGF0ZSA9PSBzdGF0KQorCQlyZXR1cm47CisKKwlpbXhfdXNiLT5lcDBzdGF0ZSA9IHN0YXQ7Cit9CisKK3N0YXRpYyB2b2lkIHVzYl9pbml0X2RhdGEoc3RydWN0IGlteF91ZGNfc3RydWN0ICppbXhfdXNiKQoreworCXN0cnVjdCBpbXhfZXBfc3RydWN0ICppbXhfZXA7CisJdTggaTsKKworCS8qIGRldmljZS9lcDAgcmVjb3JkcyBpbml0ICovCisJSU5JVF9MSVNUX0hFQUQoJmlteF91c2ItPmdhZGdldC5lcF9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmaW14X3VzYi0+Z2FkZ2V0LmVwMC0+ZXBfbGlzdCk7CisJZXAwX2NoZ19zdGF0KF9fZnVuY19fLCBpbXhfdXNiLCBFUDBfSURMRSk7CisKKwkvKiBiYXNpYyBlbmRwb2ludCByZWNvcmRzIGluaXQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgSU1YX1VTQl9OQl9FUDsgaSsrKSB7CisJCWlteF9lcCA9ICZpbXhfdXNiLT5pbXhfZXBbaV07CisKKwkJaWYgKGkpIHsKKwkJCWxpc3RfYWRkX3RhaWwoJmlteF9lcC0+ZXAuZXBfbGlzdCwKKwkJCQkmaW14X3VzYi0+Z2FkZ2V0LmVwX2xpc3QpOworCQkJaW14X2VwLT5zdG9wcGVkID0gMTsKKwkJfSBlbHNlCisJCQlpbXhfZXAtPnN0b3BwZWQgPSAwOworCisJCUlOSVRfTElTVF9IRUFEKCZpbXhfZXAtPnF1ZXVlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHVkY19zdG9wX2FjdGl2aXR5KHN0cnVjdCBpbXhfdWRjX3N0cnVjdCAqaW14X3VzYiwKKwkJCQkJc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpCit7CisJc3RydWN0IGlteF9lcF9zdHJ1Y3QgKmlteF9lcDsKKwlpbnQgaTsKKworCWlmIChpbXhfdXNiLT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1VOS05PV04pCisJCWRyaXZlciA9IE5VTEw7CisKKwkvKiBwcmV2ZW50IG5ldyByZXF1ZXN0IHN1Ym1pc3Npb25zLCBraWxsIGFueSBvdXRzdGFuZGluZyByZXF1ZXN0cyAgKi8KKwlmb3IgKGkgPSAxOyBpIDwgSU1YX1VTQl9OQl9FUDsgaSsrKSB7CisJCWlteF9lcCA9ICZpbXhfdXNiLT5pbXhfZXBbaV07CisJCWlteF9mbHVzaChpbXhfZXApOworCQlpbXhfZXAtPnN0b3BwZWQgPSAxOworCQlpbXhfZXBfaXJxX2Rpc2FibGUoaW14X2VwKTsKKwkJbnVrZShpbXhfZXAsIC1FU0hVVERPV04pOworCX0KKworCWlteF91c2ItPmNmZyA9IDA7CisJaW14X3VzYi0+aW50ZiA9IDA7CisJaW14X3VzYi0+YWx0ID0gMDsKKworCWlmIChkcml2ZXIpCisJCWRyaXZlci0+ZGlzY29ubmVjdCgmaW14X3VzYi0+Z2FkZ2V0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEludGVycnVwdCBoYW5kbGVycworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgaW14X3VkY19pcnEoaW50IGlycSwgdm9pZCAqZGV2KQoreworCXN0cnVjdCBpbXhfdWRjX3N0cnVjdCAqaW14X3VzYiA9IGRldjsKKwlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0IHU7CisJaW50IHRlbXAsIGNmZywgaW50ZiwgYWx0OworCWludCBpbnRyID0gX19yYXdfcmVhZGwoaW14X3VzYi0+YmFzZSArIFVTQl9JTlRSKTsKKworCWlmIChpbnRyICYgKElOVFJfV0FLRVVQIHwgSU5UUl9TVVNQRU5EIHwgSU5UUl9SRVNVTUUgfCBJTlRSX1JFU0VUX1NUQVJUCisJCQl8IElOVFJfUkVTRVRfU1RPUCB8IElOVFJfQ0ZHX0NIRykpIHsKKwkJCQlkdW1wX2ludHIoX19mdW5jX18sIGludHIsIGlteF91c2ItPmRldik7CisJCQkJZHVtcF91c2Jfc3RhdChfX2Z1bmNfXywgaW14X3VzYik7CisJfQorCisJaWYgKCFpbXhfdXNiLT5kcml2ZXIpIHsKKwkJLyppbXhfdWRjX2Rpc2FibGUoaW14X3VzYik7Ki8KKwkJZ290byBlbmRfaXJxOworCX0KKworCWlmIChpbnRyICYgSU5UUl9XQUtFVVApIHsKKwkJaWYgKGlteF91c2ItPmdhZGdldC5zcGVlZCA9PSBVU0JfU1BFRURfVU5LTk9XTgorCQkJJiYgaW14X3VzYi0+ZHJpdmVyICYmIGlteF91c2ItPmRyaXZlci0+cmVzdW1lKQorCQkJCWlteF91c2ItPmRyaXZlci0+cmVzdW1lKCZpbXhfdXNiLT5nYWRnZXQpOworCQlpbXhfdXNiLT5zZXRfY29uZmlnID0gMDsKKwkJaW14X3VzYi0+Z2FkZ2V0LnNwZWVkID0gVVNCX1NQRUVEX0ZVTEw7CisJfQorCisJaWYgKGludHIgJiBJTlRSX1NVU1BFTkQpIHsKKwkJaWYgKGlteF91c2ItPmdhZGdldC5zcGVlZCAhPSBVU0JfU1BFRURfVU5LTk9XTgorCQkJJiYgaW14X3VzYi0+ZHJpdmVyICYmIGlteF91c2ItPmRyaXZlci0+c3VzcGVuZCkKKwkJCQlpbXhfdXNiLT5kcml2ZXItPnN1c3BlbmQoJmlteF91c2ItPmdhZGdldCk7CisJCWlteF91c2ItPnNldF9jb25maWcgPSAwOworCQlpbXhfdXNiLT5nYWRnZXQuc3BlZWQgPSBVU0JfU1BFRURfVU5LTk9XTjsKKwl9CisKKwlpZiAoaW50ciAmIElOVFJfUkVTRVRfU1RBUlQpIHsKKwkJX19yYXdfd3JpdGVsKGludHIsIGlteF91c2ItPmJhc2UgKyBVU0JfSU5UUik7CisJCXVkY19zdG9wX2FjdGl2aXR5KGlteF91c2IsIGlteF91c2ItPmRyaXZlcik7CisJCWlteF91c2ItPnNldF9jb25maWcgPSAwOworCQlpbXhfdXNiLT5nYWRnZXQuc3BlZWQgPSBVU0JfU1BFRURfVU5LTk9XTjsKKwl9CisKKwlpZiAoaW50ciAmIElOVFJfUkVTRVRfU1RPUCkKKwkJaW14X3VzYi0+Z2FkZ2V0LnNwZWVkID0gVVNCX1NQRUVEX0ZVTEw7CisKKwlpZiAoaW50ciAmIElOVFJfQ0ZHX0NIRykgeworCQlfX3Jhd193cml0ZWwoSU5UUl9DRkdfQ0hHLCBpbXhfdXNiLT5iYXNlICsgVVNCX0lOVFIpOworCQl0ZW1wID0gX19yYXdfcmVhZGwoaW14X3VzYi0+YmFzZSArIFVTQl9TVEFUKTsKKwkJY2ZnICA9ICh0ZW1wICYgU1RBVF9DRkcpID4+IDU7CisJCWludGYgPSAodGVtcCAmIFNUQVRfSU5URikgPj4gMzsKKwkJYWx0ICA9ICB0ZW1wICYgU1RBVF9BTFRTRVQ7CisKKwkJRF9SRVEoaW14X3VzYi0+ZGV2LAorCQkJIjwlcz4gb3JpZyBjb25maWcgQz0lZCwgST0lZCwgQT0lZCAvICIKKwkJCSJyZXEgY29uZmlnIEM9JWQsIEk9JWQsIEE9JWRcbiIsCisJCQlfX2Z1bmNfXywgaW14X3VzYi0+Y2ZnLCBpbXhfdXNiLT5pbnRmLCBpbXhfdXNiLT5hbHQsCisJCQljZmcsIGludGYsIGFsdCk7CisKKwkJaWYgKGNmZyAhPSAxICYmIGNmZyAhPSAyKQorCQkJZ290byBlbmRfaXJxOworCisJCWlteF91c2ItPnNldF9jb25maWcgPSAwOworCisJCS8qIENvbmZpZyBzZXR1cCAqLworCQlpZiAoaW14X3VzYi0+Y2ZnICE9IGNmZykgeworCQkJRF9SRVEoaW14X3VzYi0+ZGV2LCAiPCVzPiBDaGFuZ2UgY29uZmlnIHN0YXJ0XG4iLF9fZnVuY19fKTsKKwkJCXUuYlJlcXVlc3QgPSBVU0JfUkVRX1NFVF9DT05GSUdVUkFUSU9OOworCQkJdS5iUmVxdWVzdFR5cGUgPSBVU0JfRElSX09VVCB8CisJCQkJCVVTQl9UWVBFX1NUQU5EQVJEIHwKKwkJCQkJVVNCX1JFQ0lQX0RFVklDRTsKKwkJCXUud1ZhbHVlID0gY2ZnOworCQkJdS53SW5kZXggPSAwOworCQkJdS53TGVuZ3RoID0gMDsKKwkJCWlteF91c2ItPmNmZyA9IGNmZzsKKwkJCWlteF91c2ItPnNldF9jb25maWcgPSAxOworCQkJaW14X3VzYi0+ZHJpdmVyLT5zZXR1cCgmaW14X3VzYi0+Z2FkZ2V0LCAmdSk7CisJCQlpbXhfdXNiLT5zZXRfY29uZmlnID0gMDsKKwkJCURfUkVRKGlteF91c2ItPmRldiwgIjwlcz4gQ2hhbmdlIGNvbmZpZyBkb25lXG4iLF9fZnVuY19fKTsKKworCQl9CisJCWlmIChpbXhfdXNiLT5pbnRmICE9IGludGYgfHwgaW14X3VzYi0+YWx0ICE9IGFsdCkgeworCQkJRF9SRVEoaW14X3VzYi0+ZGV2LCAiPCVzPiBDaGFuZ2UgaW50ZXJmYWNlIHN0YXJ0XG4iLF9fZnVuY19fKTsKKwkJCXUuYlJlcXVlc3QgPSBVU0JfUkVRX1NFVF9JTlRFUkZBQ0U7CisJCQl1LmJSZXF1ZXN0VHlwZSA9IFVTQl9ESVJfT1VUIHwKKwkJCQkJICBVU0JfVFlQRV9TVEFOREFSRCB8CisJCQkJCSAgVVNCX1JFQ0lQX0lOVEVSRkFDRTsKKwkJCXUud1ZhbHVlID0gYWx0OworCQkJdS53SW5kZXggPSBpbnRmOworCQkJdS53TGVuZ3RoID0gMDsKKwkJCWlteF91c2ItPmludGYgPSBpbnRmOworCQkJaW14X3VzYi0+YWx0ID0gYWx0OworCQkJaW14X3VzYi0+c2V0X2NvbmZpZyA9IDE7CisJCQlpbXhfdXNiLT5kcml2ZXItPnNldHVwKCZpbXhfdXNiLT5nYWRnZXQsICZ1KTsKKwkJCWlteF91c2ItPnNldF9jb25maWcgPSAwOworCQkJRF9SRVEoaW14X3VzYi0+ZGV2LCAiPCVzPiBDaGFuZ2UgaW50ZXJmYWNlIGRvbmVcbiIsX19mdW5jX18pOworCQl9CisJfQorCisJaWYgKGludHIgJiBJTlRSX1NPRikgeworCQlpZiAoaW14X3VzYi0+ZXAwc3RhdGUgPT0gRVAwX0lETEUpIHsKKwkJCXRlbXAgPSBfX3Jhd19yZWFkbChpbXhfdXNiLT5iYXNlICsgVVNCX0NUUkwpOworCQkJX19yYXdfd3JpdGVsKHRlbXAgfCBDVFJMX0NNRE9WRVIsIGlteF91c2ItPmJhc2UgKyBVU0JfQ1RSTCk7CisJCX0KKwl9CisKK2VuZF9pcnE6CisJX19yYXdfd3JpdGVsKGludHIsIGlteF91c2ItPmJhc2UgKyBVU0JfSU5UUik7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgaW14X3VkY19jdHJsX2lycShpbnQgaXJxLCB2b2lkICpkZXYpCit7CisJc3RydWN0IGlteF91ZGNfc3RydWN0ICppbXhfdXNiID0gZGV2OworCWludCBpbnRyID0gX19yYXdfcmVhZGwoaW14X3VzYi0+YmFzZSArIFVTQl9FUF9JTlRSKDApKTsKKworCWR1bXBfZXBfaW50cihfX2Z1bmNfXywgMCwgaW50ciwgaW14X3VzYi0+ZGV2KTsKKworCWlmICghaW14X3VzYi0+ZHJpdmVyKSB7CisJCV9fcmF3X3dyaXRlbChpbnRyLCBpbXhfdXNiLT5iYXNlICsgVVNCX0VQX0lOVFIoMCkpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJLyogREVWUkVRIElSUSBoYXMgaGlnaGVzdCBwcmlvcml0eSAqLworCWlmIChpbnRyICYgKEVQSU5UUl9ERVZSRVEgfCBFUElOVFJfTURFVlJFUSkpCisJCWhhbmRsZV9lcDBfZGV2cmVxKGlteF91c2IpOworCS8qIFNlZW0gaS5NWCBpcyBtaXNzaW5nIEVPRiBpbnRlcnJ1cHQgc29tZXRpbWVzLgorCSAqIFRoZXJlZm9yZSB3ZSBtb25pdG9yIGJvdGggRU9GIGFuZCBGSUZPX0VNUFRZIGludGVycnVwcworCSAqIHdoZW4gdHJhbnNtaXRpbmcsIGFuZCBib3RoIEVPRiBhbmQgRklGT19GVUxMIHdoZW4KKwkgKiByZWNlaXZpbmcgZGF0YS4KKwkgKi8KKwllbHNlIGlmIChpbnRyICYgKEVQSU5UUl9FT0YgfCBFUElOVFJfRklGT19FTVBUWSB8IEVQSU5UUl9GSUZPX0ZVTEwpKQorCQloYW5kbGVfZXAwKCZpbXhfdXNiLT5pbXhfZXBbMF0pOworCisJX19yYXdfd3JpdGVsKGludHIsIGlteF91c2ItPmJhc2UgKyBVU0JfRVBfSU5UUigwKSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBpbXhfdWRjX2J1bGtfaXJxKGludCBpcnEsIHZvaWQgKmRldikKK3sKKwlzdHJ1Y3QgaW14X3VkY19zdHJ1Y3QgKmlteF91c2IgPSBkZXY7CisJc3RydWN0IGlteF9lcF9zdHJ1Y3QgKmlteF9lcCA9ICZpbXhfdXNiLT5pbXhfZXBbaXJxIC0gVVNCRF9JTlQwXTsKKwlpbnQgaW50ciA9IF9fcmF3X3JlYWRsKGlteF91c2ItPmJhc2UgKyBVU0JfRVBfSU5UUihFUF9OTyhpbXhfZXApKSk7CisKKwlkdW1wX2VwX2ludHIoX19mdW5jX18sIGlycSAtIFVTQkRfSU5UMCwgaW50ciwgaW14X3VzYi0+ZGV2KTsKKworCWlmICghaW14X3VzYi0+ZHJpdmVyKSB7CisJCV9fcmF3X3dyaXRlbChpbnRyLCBpbXhfdXNiLT5iYXNlICsgVVNCX0VQX0lOVFIoRVBfTk8oaW14X2VwKSkpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJaGFuZGxlX2VwKGlteF9lcCk7CisKKwlfX3Jhd193cml0ZWwoaW50ciwgaW14X3VzYi0+YmFzZSArIFVTQl9FUF9JTlRSKEVQX05PKGlteF9lcCkpKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworaXJxX2hhbmRsZXJfdCBpbnRyX2hhbmRsZXIoaW50IGkpCit7CisJc3dpdGNoIChpKSB7CisJY2FzZSAwOgorCQlyZXR1cm4gaW14X3VkY19jdHJsX2lycTsKKwljYXNlIDE6CisJY2FzZSAyOgorCWNhc2UgMzoKKwljYXNlIDQ6CisJY2FzZSA1OgorCQlyZXR1cm4gaW14X3VkY19idWxrX2lycTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gaW14X3VkY19pcnE7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU3RhdGljIGRlZmluZWQgSU1YIFVEQyBzdHJ1Y3R1cmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZ2FkZ2V0X29wcyBpbXhfdWRjX29wcyA9IHsKKwkuZ2V0X2ZyYW1lCSA9IGlteF91ZGNfZ2V0X2ZyYW1lLAorCS53YWtldXAJCSA9IGlteF91ZGNfd2FrZXVwLAorfTsKKworc3RhdGljIHN0cnVjdCBpbXhfdWRjX3N0cnVjdCBjb250cm9sbGVyID0geworCS5nYWRnZXQgPSB7CisJCS5vcHMJCT0gJmlteF91ZGNfb3BzLAorCQkuZXAwCQk9ICZjb250cm9sbGVyLmlteF9lcFswXS5lcCwKKwkJLm5hbWUJCT0gZHJpdmVyX25hbWUsCisJCS5kZXYgPSB7CisJCQkgLmJ1c19pZAk9ICJnYWRnZXQiLAorCQkgfSwKKwl9LAorCisJLmlteF9lcFswXSA9IHsKKwkJLmVwID0geworCQkJLm5hbWUJCT0gZXAwbmFtZSwKKwkJCS5vcHMJCT0gJmlteF9lcF9vcHMsCisJCQkubWF4cGFja2V0CT0gMzIsCisJCX0sCisJCS5pbXhfdXNiCQk9ICZjb250cm9sbGVyLAorCQkuZmlmb3NpemUJCT0gMzIsCisJCS5iRW5kcG9pbnRBZGRyZXNzCT0gMCwKKwkJLmJtQXR0cmlidXRlcwkJPSBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MLAorCSB9LAorCS5pbXhfZXBbMV0gPSB7CisJCS5lcCA9IHsKKwkJCS5uYW1lCQk9ICJlcDFpbi1idWxrIiwKKwkJCS5vcHMJCT0gJmlteF9lcF9vcHMsCisJCQkubWF4cGFja2V0CT0gNjQsCisJCX0sCisJCS5pbXhfdXNiCQk9ICZjb250cm9sbGVyLAorCQkuZmlmb3NpemUJCT0gNjQsCisJCS5iRW5kcG9pbnRBZGRyZXNzCT0gVVNCX0RJUl9JTiB8IDEsCisJCS5ibUF0dHJpYnV0ZXMJCT0gVVNCX0VORFBPSU5UX1hGRVJfQlVMSywKKwkgfSwKKwkuaW14X2VwWzJdID0geworCQkuZXAgPSB7CisJCQkubmFtZQkJPSAiZXAyb3V0LWJ1bGsiLAorCQkJLm9wcwkJPSAmaW14X2VwX29wcywKKwkJCS5tYXhwYWNrZXQJPSA2NCwKKwkJfSwKKwkJLmlteF91c2IJCT0gJmNvbnRyb2xsZXIsCisJCS5maWZvc2l6ZQkJPSA2NCwKKwkJLmJFbmRwb2ludEFkZHJlc3MJPSBVU0JfRElSX09VVCB8IDIsCisJCS5ibUF0dHJpYnV0ZXMJCT0gVVNCX0VORFBPSU5UX1hGRVJfQlVMSywKKwkgfSwKKwkuaW14X2VwWzNdID0geworCQkuZXAgPSB7CisJCQkubmFtZQkJPSAiZXAzb3V0LWJ1bGsiLAorCQkJLm9wcwkJPSAmaW14X2VwX29wcywKKwkJCS5tYXhwYWNrZXQJPSAzMiwKKwkJfSwKKwkJLmlteF91c2IJCT0gJmNvbnRyb2xsZXIsCisJCS5maWZvc2l6ZQkJPSAzMiwKKwkJLmJFbmRwb2ludEFkZHJlc3MgCT0gVVNCX0RJUl9PVVQgfCAzLAorCQkuYm1BdHRyaWJ1dGVzCQk9IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCisJIH0sCisJLmlteF9lcFs0XSA9IHsKKwkJLmVwID0geworCQkJLm5hbWUJCT0gImVwNGluLWludCIsCisJCQkub3BzCQk9ICZpbXhfZXBfb3BzLAorCQkJLm1heHBhY2tldAk9IDMyLAorCQkgfSwKKwkJLmlteF91c2IJCT0gJmNvbnRyb2xsZXIsCisJCS5maWZvc2l6ZQkJPSAzMiwKKwkJLmJFbmRwb2ludEFkZHJlc3MgCT0gVVNCX0RJUl9JTiB8IDQsCisJCS5ibUF0dHJpYnV0ZXMJCT0gVVNCX0VORFBPSU5UX1hGRVJfSU5ULAorCSB9LAorCS5pbXhfZXBbNV0gPSB7CisJCS5lcCA9IHsKKwkJCS5uYW1lCQk9ICJlcDVvdXQtaW50IiwKKwkJCS5vcHMJCT0gJmlteF9lcF9vcHMsCisJCQkubWF4cGFja2V0CT0gMzIsCisJCX0sCisJCS5pbXhfdXNiCQk9ICZjb250cm9sbGVyLAorCQkuZmlmb3NpemUJCT0gMzIsCisJCS5iRW5kcG9pbnRBZGRyZXNzIAk9IFVTQl9ESVJfT1VUIHwgNSwKKwkJLmJtQXR0cmlidXRlcwkJPSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQsCisJIH0sCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVVNCIGdhZGdlZCBkcml2ZXIgZnVuY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitpbnQgdXNiX2dhZGdldF9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpCit7CisJc3RydWN0IGlteF91ZGNfc3RydWN0ICppbXhfdXNiID0gJmNvbnRyb2xsZXI7CisJaW50IHJldHZhbDsKKworCWlmICghZHJpdmVyCisJCXx8IGRyaXZlci0+c3BlZWQgPCBVU0JfU1BFRURfRlVMTAorCQl8fCAhZHJpdmVyLT5iaW5kCisJCXx8ICFkcml2ZXItPmRpc2Nvbm5lY3QKKwkJfHwgIWRyaXZlci0+c2V0dXApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIWlteF91c2IpCisJCXJldHVybiAtRU5PREVWOworCWlmIChpbXhfdXNiLT5kcml2ZXIpCisJCXJldHVybiAtRUJVU1k7CisKKwkvKiBmaXJzdCBob29rIHVwIHRoZSBkcml2ZXIgLi4uICovCisJaW14X3VzYi0+ZHJpdmVyID0gZHJpdmVyOworCWlteF91c2ItPmdhZGdldC5kZXYuZHJpdmVyID0gJmRyaXZlci0+ZHJpdmVyOworCisJcmV0dmFsID0gZGV2aWNlX2FkZCgmaW14X3VzYi0+Z2FkZ2V0LmRldik7CisJaWYgKHJldHZhbCkKKwkJZ290byBmYWlsOworCXJldHZhbCA9IGRyaXZlci0+YmluZCgmaW14X3VzYi0+Z2FkZ2V0KTsKKwlpZiAocmV0dmFsKSB7CisJCURfRVJSKGlteF91c2ItPmRldiwgIjwlcz4gYmluZCB0byBkcml2ZXIgJXMgLS0+IGVycm9yICVkXG4iLAorCQkJX19mdW5jX18sIGRyaXZlci0+ZHJpdmVyLm5hbWUsIHJldHZhbCk7CisJCWRldmljZV9kZWwoJmlteF91c2ItPmdhZGdldC5kZXYpOworCisJCWdvdG8gZmFpbDsKKwl9CisKKwlEX0lOSShpbXhfdXNiLT5kZXYsICI8JXM+IHJlZ2lzdGVyZWQgZ2FkZ2V0IGRyaXZlciAnJXMnXG4iLAorCQlfX2Z1bmNfXywgZHJpdmVyLT5kcml2ZXIubmFtZSk7CisKKwlpbXhfdWRjX2VuYWJsZShpbXhfdXNiKTsKKworCXJldHVybiAwOworZmFpbDoKKwlpbXhfdXNiLT5kcml2ZXIgPSBOVUxMOworCWlteF91c2ItPmdhZGdldC5kZXYuZHJpdmVyID0gTlVMTDsKKwlyZXR1cm4gcmV0dmFsOworfQorRVhQT1JUX1NZTUJPTCh1c2JfZ2FkZ2V0X3JlZ2lzdGVyX2RyaXZlcik7CisKK2ludCB1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQoreworCXN0cnVjdCBpbXhfdWRjX3N0cnVjdCAqaW14X3VzYiA9ICZjb250cm9sbGVyOworCisJaWYgKCFpbXhfdXNiKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoIWRyaXZlciB8fCBkcml2ZXIgIT0gaW14X3VzYi0+ZHJpdmVyIHx8ICFkcml2ZXItPnVuYmluZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl1ZGNfc3RvcF9hY3Rpdml0eShpbXhfdXNiLCBkcml2ZXIpOworCWlteF91ZGNfZGlzYWJsZShpbXhfdXNiKTsKKworCWRyaXZlci0+dW5iaW5kKCZpbXhfdXNiLT5nYWRnZXQpOworCWlteF91c2ItPmdhZGdldC5kZXYuZHJpdmVyID0gTlVMTDsKKwlpbXhfdXNiLT5kcml2ZXIgPSBOVUxMOworCisJZGV2aWNlX2RlbCgmaW14X3VzYi0+Z2FkZ2V0LmRldik7CisKKwlEX0lOSShpbXhfdXNiLT5kZXYsICI8JXM+IHVucmVnaXN0ZXJlZCBnYWRnZXQgZHJpdmVyICclcydcbiIsCisJCV9fZnVuY19fLCBkcml2ZXItPmRyaXZlci5uYW1lKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1vZHVsZSBmdW5jdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworc3RhdGljIGludCBfX2luaXQgaW14X3VkY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBpbXhfdWRjX3N0cnVjdCAqaW14X3VzYiA9ICZjb250cm9sbGVyOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBpbXh1c2JfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IGNsayAqY2xrOworCXZvaWQgX19pb21lbSAqYmFzZTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaSwgcmVzX3NpemU7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IGdldCBkZXZpY2UgcmVzb3VyY2VzXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpZiAoIXBkYXRhKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImRyaXZlciBuZWVkcyBwbGF0Zm9ybSBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmVzX3NpemUgPSByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxOworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc19zaXplLCByZXMtPm5hbWUpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IGFsbG9jYXRlICVkIGJ5dGVzIGF0ICVkIGFkZHJlc3NcbiIsCisJCQlyZXNfc2l6ZSwgcmVzLT5zdGFydCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChwZGF0YS0+aW5pdCkgeworCQlyZXQgPSBwZGF0YS0+aW5pdCgmcGRldi0+ZGV2KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZmFpbDA7CisJfQorCisJYmFzZSA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzX3NpemUpOworCWlmICghYmFzZSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJpb3JlbWFwIGZhaWxlZFxuIik7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZmFpbDE7CisJfQorCisJY2xrID0gY2xrX2dldChOVUxMLCAidXNiZF9jbGsiKTsKKwlpZiAoSVNfRVJSKGNsaykpIHsKKwkJcmV0ID0gUFRSX0VSUihjbGspOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBnZXQgVVNCIGNsb2NrXG4iKTsKKwkJZ290byBmYWlsMjsKKwl9CisJY2xrX2VuYWJsZShjbGspOworCisJaWYgKGNsa19nZXRfcmF0ZShjbGspICE9IDQ4MDAwMDAwKSB7CisJCURfSU5JKCZwZGV2LT5kZXYsCisJCQkiQmFkIFVTQiBjbG9jayAoJWQgSHopLCBjaGFuZ2luZyB0byA0ODAwMDAwMCBIelxuIiwKKwkJCShpbnQpY2xrX2dldF9yYXRlKGNsaykpOworCQlpZiAoY2xrX3NldF9yYXRlKGNsaywgNDgwMDAwMDApKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJIlVuYWJsZSB0byBzZXQgY29ycmVjdCBVU0IgY2xvY2sgKDQ4TUh6KVxuIik7CisJCQlyZXQgPSAtRUlPOworCQkJZ290byBmYWlsMzsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBJTVhfVVNCX05CX0VQICsgMTsgaSsrKSB7CisJCWlteF91c2ItPnVzYmRfaW50W2ldID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCBpKTsKKwkJaWYgKGlteF91c2ItPnVzYmRfaW50W2ldIDwgMCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgZ2V0IGlycSBudW1iZXJcbiIpOworCQkJcmV0ID0gLUVOT0RFVjsKKwkJCWdvdG8gZmFpbDM7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgSU1YX1VTQl9OQl9FUCArIDE7IGkrKykgeworCQlyZXQgPSByZXF1ZXN0X2lycShpbXhfdXNiLT51c2JkX2ludFtpXSwgaW50cl9oYW5kbGVyKGkpLAorCQkJCSAgICAgSVJRRl9ESVNBQkxFRCwgZHJpdmVyX25hbWUsIGlteF91c2IpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBnZXQgaXJxICVpLCBlcnIgJWRcbiIsCisJCQkJaW14X3VzYi0+dXNiZF9pbnRbaV0sIHJldCk7CisJCQlmb3IgKC0taTsgaSA+PSAwOyBpLS0pCisJCQkJZnJlZV9pcnEoaW14X3VzYi0+dXNiZF9pbnRbaV0sIGlteF91c2IpOworCQkJZ290byBmYWlsMzsKKwkJfQorCX0KKworCWlteF91c2ItPnJlcyA9IHJlczsKKwlpbXhfdXNiLT5iYXNlID0gYmFzZTsKKwlpbXhfdXNiLT5jbGsgPSBjbGs7CisJaW14X3VzYi0+ZGV2ID0gJnBkZXYtPmRldjsKKworCWRldmljZV9pbml0aWFsaXplKCZpbXhfdXNiLT5nYWRnZXQuZGV2KTsKKworCWlteF91c2ItPmdhZGdldC5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKKwlpbXhfdXNiLT5nYWRnZXQuZGV2LmRtYV9tYXNrID0gcGRldi0+ZGV2LmRtYV9tYXNrOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaW14X3VzYik7CisKKwl1c2JfaW5pdF9kYXRhKGlteF91c2IpOworCWlteF91ZGNfaW5pdChpbXhfdXNiKTsKKworCXJldHVybiAwOworCitmYWlsMzoKKwljbGtfcHV0KGNsayk7CisJY2xrX2Rpc2FibGUoY2xrKTsKK2ZhaWwyOgorCWlvdW5tYXAoYmFzZSk7CitmYWlsMToKKwlpZiAocGRhdGEtPmV4aXQpCisJCXBkYXRhLT5leGl0KCZwZGV2LT5kZXYpOworZmFpbDA6CisJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc19zaXplKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZXhpdCBpbXhfdWRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBpbXhfdWRjX3N0cnVjdCAqaW14X3VzYiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBpbXh1c2JfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpbnQgaTsKKworCWlteF91ZGNfZGlzYWJsZShpbXhfdXNiKTsKKworCWZvciAoaSA9IDA7IGkgPCBJTVhfVVNCX05CX0VQICsgMTsgaSsrKQorCQlmcmVlX2lycShpbXhfdXNiLT51c2JkX2ludFtpXSwgaW14X3VzYik7CisKKwljbGtfcHV0KGlteF91c2ItPmNsayk7CisJY2xrX2Rpc2FibGUoaW14X3VzYi0+Y2xrKTsKKwlpb3VubWFwKGlteF91c2ItPmJhc2UpOworCisJcmVsZWFzZV9tZW1fcmVnaW9uKGlteF91c2ItPnJlcy0+c3RhcnQsCisJCWlteF91c2ItPnJlcy0+ZW5kIC0gaW14X3VzYi0+cmVzLT5zdGFydCArIDEpOworCisJaWYgKHBkYXRhLT5leGl0KQorCQlwZGF0YS0+ZXhpdCgmcGRldi0+ZGV2KTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZglDT05GSUdfUE0KKyNkZWZpbmUJaW14X3VkY19zdXNwZW5kCU5VTEwKKyNkZWZpbmUJaW14X3VkY19yZXN1bWUJTlVMTAorI2Vsc2UKKyNkZWZpbmUJaW14X3VkY19zdXNwZW5kCU5VTEwKKyNkZWZpbmUJaW14X3VkY19yZXN1bWUJTlVMTAorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHVkY19kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gZHJpdmVyX25hbWUsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnJlbW92ZQkJPSBfX2V4aXRfcChpbXhfdWRjX3JlbW92ZSksCisJLnN1c3BlbmQJPSBpbXhfdWRjX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBpbXhfdWRjX3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHVkY19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmdWRjX2RyaXZlciwgaW14X3VkY19wcm9iZSk7Cit9Cittb2R1bGVfaW5pdCh1ZGNfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1ZGNfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ1ZGNfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHVkY19leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJJTVggVVNCIERldmljZSBDb250cm9sbGVyIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiRGFyaXVzIEF1Z3VsaXMgPGF1Z3VsaXMuZGFyaXVzQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06aW14X3VkYyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2lteF91ZGMuaCBiL2RyaXZlcnMvdXNiL2dhZGdldC9pbXhfdWRjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUwMDc2OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9pbXhfdWRjLmgKQEAgLTAsMCArMSwzNDQgQEAKKy8qCisgKglDb3B5cmlnaHQgKEMpIDIwMDUgTWlrZSBMZWUoZWVtaWtlQGdtYWlsLmNvbSkKKyAqCisgKglUaGlzIHVkYyBkcml2ZXIgaXMgbm93IHVuZGVyIHRlc3RpbmcgYW5kIGNvZGUgaXMgYmFzZWQgb24gcHhhMnh4X3VkYy5oCisgKglQbGVhc2UgdXNlIGl0IHdpdGggeW91ciBvd24gcmlzayEKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX1VTQl9HQURHRVRfSU1YX0gKKyNkZWZpbmUgX19MSU5VWF9VU0JfR0FER0VUX0lNWF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBIZWxwZXIgbWFjcm9zICovCisjZGVmaW5lIEVQX05PKGVwKQkoKGVwLT5iRW5kcG9pbnRBZGRyZXNzKSAmIH5VU0JfRElSX0lOKSAvKiBJTjoxLCBPVVQ6MCAqLworI2RlZmluZSBFUF9ESVIoZXApCSgoZXAtPmJFbmRwb2ludEFkZHJlc3MpICYgVVNCX0RJUl9JTiA/IDEgOiAwKQorI2RlZmluZSBpcnFfdG9fZXAoaXJxKQkoKChpcnEpID49IFVTQkRfSU5UMCkgfHwgKChpcnEpIDw9IFVTQkRfSU5UNikgPyAoKGlycSkgLSBVU0JEX0lOVDApIDogKFVTQkRfSU5UNikpIC8qc2hvdWxkIG5vdCBoYXBwZW4qLworI2RlZmluZSBlcF90b19pcnEoZXApCShFUF9OTygoZXApKSArIFVTQkRfSU5UMCkKKyNkZWZpbmUgSU1YX1VTQl9OQl9FUAk2CisKKy8qIERyaXZlciBzdHJ1Y3R1cmVzICovCitzdHJ1Y3QgaW14X3JlcXVlc3QgeworCXN0cnVjdCB1c2JfcmVxdWVzdAkJCXJlcTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQkJcXVldWU7CisJdW5zaWduZWQgaW50CQkJCWluX3VzZTsKK307CisKK2VudW0gZXAwX3N0YXRlIHsKKwlFUDBfSURMRSwKKwlFUDBfSU5fREFUQV9QSEFTRSwKKwlFUDBfT1VUX0RBVEFfUEhBU0UsCisJRVAwX0NPTkZJRywKKwlFUDBfU1RBTEwsCit9OworCitzdHJ1Y3QgaW14X2VwX3N0cnVjdCB7CisJc3RydWN0IHVzYl9lcAkJCQllcDsKKwlzdHJ1Y3QgaW14X3VkY19zdHJ1Y3QJCQkqaW14X3VzYjsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQkJcXVldWU7CisJdW5zaWduZWQgY2hhcgkJCQlzdG9wcGVkOworCXVuc2lnbmVkIGNoYXIJCQkJZmlmb3NpemU7CisJdW5zaWduZWQgY2hhcgkJCQliRW5kcG9pbnRBZGRyZXNzOworCXVuc2lnbmVkIGNoYXIJCQkJYm1BdHRyaWJ1dGVzOworfTsKKworc3RydWN0IGlteF91ZGNfc3RydWN0IHsKKwlzdHJ1Y3QgdXNiX2dhZGdldAkJCWdhZGdldDsKKwlzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIJCSpkcml2ZXI7CisJc3RydWN0IGRldmljZQkJCQkqZGV2OworCXN0cnVjdCBpbXhfZXBfc3RydWN0CQkJaW14X2VwW0lNWF9VU0JfTkJfRVBdOworCXN0cnVjdCBjbGsJCQkJKmNsazsKKwllbnVtIGVwMF9zdGF0ZQkJCQllcDBzdGF0ZTsKKwlzdHJ1Y3QgcmVzb3VyY2UJCQkJKnJlczsKKwl2b2lkIF9faW9tZW0JCQkJKmJhc2U7CisJdW5zaWduZWQgY2hhcgkJCQlzZXRfY29uZmlnOworCWludAkJCQkJY2ZnLAorCQkJCQkJaW50ZiwKKwkJCQkJCWFsdCwKKwkJCQkJCXVzYmRfaW50WzddOworfTsKKworLyogVVNCIHJlZ2lzdGVycyAqLworI2RlZmluZSAgVVNCX0ZSQU1FCQkoMHgwMCkJLyogVVNCIGZyYW1lICovCisjZGVmaW5lICBVU0JfU1BFQwkJKDB4MDQpCS8qIFVTQiBTcGVjICovCisjZGVmaW5lICBVU0JfU1RBVAkJKDB4MDgpCS8qIFVTQiBTdGF0dXMgKi8KKyNkZWZpbmUgIFVTQl9DVFJMCQkoMHgwQykJLyogVVNCIENvbnRyb2wgKi8KKyNkZWZpbmUgIFVTQl9EQURSCQkoMHgxMCkJLyogVVNCIERlc2MgUkFNIGFkZHIgKi8KKyNkZWZpbmUgIFVTQl9EREFUCQkoMHgxNCkJLyogVVNCIERlc2MgUkFNL0VQIGJ1ZmZlciBkYXRhICovCisjZGVmaW5lICBVU0JfSU5UUgkJKDB4MTgpCS8qIFVTQiBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgIFVTQl9NQVNLCQkoMHgxQykJLyogVVNCIE1hc2sgKi8KKyNkZWZpbmUgIFVTQl9FTkFCCQkoMHgyNCkJLyogVVNCIEVuYWJsZSAqLworI2RlZmluZSAgVVNCX0VQX1NUQVQoeCkJCSgweDMwICsgKHgqMHgzMCkpIC8qIFVTQiBzdGF0dXMvY29udHJvbCAqLworI2RlZmluZSAgVVNCX0VQX0lOVFIoeCkJCSgweDM0ICsgKHgqMHgzMCkpIC8qIFVTQiBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgIFVTQl9FUF9NQVNLKHgpCQkoMHgzOCArICh4KjB4MzApKSAvKiBVU0IgbWFzayAqLworI2RlZmluZSAgVVNCX0VQX0ZEQVQoeCkJCSgweDNDICsgKHgqMHgzMCkpIC8qIFVTQiBGSUZPIGRhdGEgKi8KKyNkZWZpbmUgIFVTQl9FUF9GREFUMCh4KQkoMHgzQyArICh4KjB4MzApKSAvKiBVU0IgRklGTyBkYXRhICovCisjZGVmaW5lICBVU0JfRVBfRkRBVDEoeCkJKDB4M0QgKyAoeCoweDMwKSkgLyogVVNCIEZJRk8gZGF0YSAqLworI2RlZmluZSAgVVNCX0VQX0ZEQVQyKHgpCSgweDNFICsgKHgqMHgzMCkpIC8qIFVTQiBGSUZPIGRhdGEgKi8KKyNkZWZpbmUgIFVTQl9FUF9GREFUMyh4KQkoMHgzRiArICh4KjB4MzApKSAvKiBVU0IgRklGTyBkYXRhICovCisjZGVmaW5lICBVU0JfRVBfRlNUQVQoeCkJKDB4NDAgKyAoeCoweDMwKSkgLyogVVNCIEZJRk8gc3RhdHVzICovCisjZGVmaW5lICBVU0JfRVBfRkNUUkwoeCkJKDB4NDQgKyAoeCoweDMwKSkgLyogVVNCIEZJRk8gY29udHJvbCAqLworI2RlZmluZSAgVVNCX0VQX0xSRlAoeCkJCSgweDQ4ICsgKHgqMHgzMCkpIC8qIFVTQiBsYXN0IHJlYWQgZnJhbWUgcG9pbnRlciAqLworI2RlZmluZSAgVVNCX0VQX0xXRlAoeCkJCSgweDRDICsgKHgqMHgzMCkpIC8qIFVTQiBsYXN0IHdyaXRlIGZyYW1lIHBvaW50ZXIgKi8KKyNkZWZpbmUgIFVTQl9FUF9GQUxSTSh4KQkoMHg1MCArICh4KjB4MzApKSAvKiBVU0IgRklGTyBhbGFybSAqLworI2RlZmluZSAgVVNCX0VQX0ZSRFAoeCkJCSgweDU0ICsgKHgqMHgzMCkpIC8qIFVTQiBGSUZPIHJlYWQgcG9pbnRlciAqLworI2RlZmluZSAgVVNCX0VQX0ZXUlAoeCkJCSgweDU4ICsgKHgqMHgzMCkpIC8qIFVTQiBGSUZPIHdyaXRlIHBvaW50ZXIgKi8KKy8qIFVTQiBDb250cm9sIFJlZ2lzdGVyIEJpdCBGaWVsZHMuKi8KKyNkZWZpbmUgQ1RSTF9DTURPVkVSCQkoMTw8NikJLyogVURDIHN0YXR1cyAqLworI2RlZmluZSBDVFJMX0NNREVSUk9SCQkoMTw8NSkJLyogVURDIHN0YXR1cyAqLworI2RlZmluZSBDVFJMX0ZFX0VOQQkJKDE8PDMpCS8qIEVuYWJsZSBGb250IEVuZCBsb2dpYyAqLworI2RlZmluZSBDVFJMX1VEQ19SU1QJCSgxPDwyKQkvKiBVREMgcmVzZXQgKi8KKyNkZWZpbmUgQ1RSTF9BRkVfRU5BCQkoMTw8MSkJLyogQW5hbG9nIEZvbnQgZW5kIGVuYWJsZSAqLworI2RlZmluZSBDVFJMX1JFU1VNRQkJKDE8PDApCS8qIFVEQyByZXN1bWUgKi8KKy8qIFVTQiBTdGF0dXMgUmVnaXN0ZXIgQml0IEZpZWxkcy4qLworI2RlZmluZSBTVEFUX1JTVAkJKDE8PDgpCisjZGVmaW5lIFNUQVRfU1VTUAkJKDE8PDcpCisjZGVmaW5lIFNUQVRfQ0ZHCQkoMzw8NSkKKyNkZWZpbmUgU1RBVF9JTlRGCQkoMzw8MykKKyNkZWZpbmUgU1RBVF9BTFRTRVQJCSg3PDwwKQorLyogVVNCIEludGVycnVwdCBTdGF0dXMvTWFzayBSZWdpc3RlcnMgQml0IGZpZWxkcyAqLworI2RlZmluZSBJTlRSX1dBS0VVUAkJKDE8PDMxKQkvKiBXYWtlIHVwIEludGVycnVwdCAqLworI2RlZmluZSBJTlRSX01TT0YJCSgxPDw3KQkvKiBNaXNzZWQgU3RhcnQgb2YgRnJhbWUgKi8KKyNkZWZpbmUgSU5UUl9TT0YJCSgxPDw2KQkvKiBTdGFydCBvZiBGcmFtZSAqLworI2RlZmluZSBJTlRSX1JFU0VUX1NUT1AJCSgxPDw1KQkvKiBSZXNldCBTaWduYWxpbmcgc3RvcCAqLworI2RlZmluZSBJTlRSX1JFU0VUX1NUQVJUCSgxPDw0KQkvKiBSZXNldCBTaWduYWxpbmcgc3RhcnQgKi8KKyNkZWZpbmUgSU5UUl9SRVNVTUUJCSgxPDwzKQkvKiBTdXNwZW5kIHRvIHJlc3VtZSAqLworI2RlZmluZSBJTlRSX1NVU1BFTkQJCSgxPDwyKQkvKiBBY3RpdmUgdG8gc3VzcGVuZCAqLworI2RlZmluZSBJTlRSX0ZSQU1FX01BVENICSgxPDwxKQkvKiBGcmFtZSBtYXRjaGVkICovCisjZGVmaW5lIElOVFJfQ0ZHX0NIRwkJKDE8PDApCS8qIENvbmZpZ3VyYXRpb24gY2hhbmdlIG9jY3VycmVkICovCisvKiBVU0IgRW5hYmxlIFJlZ2lzdGVyIEJpdCBGaWVsZHMuKi8KKyNkZWZpbmUgRU5BQl9SU1QJCSgxPDwzMSkJLyogUmVzZXQgVVNCIG1vZHVsZXMgKi8KKyNkZWZpbmUgRU5BQl9FTkFCCQkoMTw8MzApCS8qIEVuYWJsZSBVU0IgbW9kdWxlcyovCisjZGVmaW5lIEVOQUJfU1VTUEVORAkJKDE8PDI5KQkvKiBTdXNwZW5kIFVTQiBtb2R1bGVzICovCisjZGVmaW5lIEVOQUJfRU5ESUFOCQkoMTw8MjgpCS8qIEVuZGlhbiBvZiBVU0IgbW9kdWxlcyAqLworI2RlZmluZSBFTkFCX1BXUk1ECQkoMTw8MCkJLyogUG93ZXIgbW9kZSBvZiBVU0IgbW9kdWxlcyAqLworLyogVVNCIERlc2NyaXB0b3IgUmFtIEFkZHJlc3MgUmVnaXN0ZXIgYml0IGZpZWxkcyAqLworI2RlZmluZSBEQURSX0NGRwkJKDE8PDMxKQkvKiBDb25maWd1cmF0aW9uICovCisjZGVmaW5lIERBRFJfQlNZCQkoMTw8MzApCS8qIEJ1c3kgc3RhdHVzICovCisjZGVmaW5lIERBRFJfREFEUgkJKDB4MUZGKQkvKiBEZXNjcmlwdG9yIFJhbSBBZGRyZXNzICovCisvKiBVU0IgRGVzY3JpcHRvciBSQU0vRW5kcG9pbnQgQnVmZmVyIERhdGEgUmVnaXN0ZXIgYml0IGZpZWxkcyAqLworI2RlZmluZSBEREFUX0REQVQJCSgweEZGKQkvKiBEZXNjcmlwdG9yIEVuZHBvaW50IEJ1ZmZlciAqLworLyogVVNCIEVuZHBvaW50IFN0YXR1cyBSZWdpc3RlciBiaXQgZmllbGRzICovCisjZGVmaW5lIEVQU1RBVF9CQ09VTlQJCSgweDdGPDwxNikJLyogRW5kcG9pbnQgRklGTyBieXRlIGNvdW50ICovCisjZGVmaW5lIEVQU1RBVF9TSVAJCSgxPDw4KQkvKiBFbmRwb2ludCBzZXR1cCBpbiBwcm9ncmVzcyAqLworI2RlZmluZSBFUFNUQVRfRElSCQkoMTw8NykJLyogRW5kcG9pbnQgdHJhbnNmZXIgZGlyZWN0aW9uICovCisjZGVmaW5lIEVQU1RBVF9NQVgJCSgzPDw1KQkvKiBFbmRwb2ludCBNYXggcGFja2V0IHNpemUgKi8KKyNkZWZpbmUgRVBTVEFUX1RZUAkJKDM8PDMpCS8qIEVuZHBvaW50IHR5cGUgKi8KKyNkZWZpbmUgRVBTVEFUX1pMUFMJCSgxPDwyKQkvKiBTZW5kIHplcm8gbGVuZ3RoIHBhY2tldCAqLworI2RlZmluZSBFUFNUQVRfRkxVU0gJCSgxPDwxKQkvKiBFbmRwb2ludCBGSUZPIEZsdXNoICovCisjZGVmaW5lIEVQU1RBVF9TVEFMTAkJKDE8PDApCS8qIEZvcmNlIHN0YWxsICovCisvKiBVU0IgRW5kcG9pbnQgRklGTyBTdGF0dXMgUmVnaXN0ZXIgYml0IGZpZWxkcyAqLworI2RlZmluZSBGU1RBVF9GUkFNRV9TVEFUCSgweEY8PDI0KQkvKiBGcmFtZSBzdGF0dXMgYml0IFswLTNdICovCisjZGVmaW5lIEZTVEFUX0VSUgkJKDE8PDIyKQkvKiBGSUZPIGVycm9yICovCisjZGVmaW5lIEZTVEFUX1VGCQkoMTw8MjEpCS8qIEZJRk8gdW5kZXJmbG93ICovCisjZGVmaW5lIEZTVEFUX09GCQkoMTw8MjApCS8qIEZJRk8gb3ZlcmZsb3cgKi8KKyNkZWZpbmUgRlNUQVRfRlIJCSgxPDwxOSkJLyogRklGTyBmcmFtZSByZWFkeSAqLworI2RlZmluZSBGU1RBVF9GVUxMCQkoMTw8MTgpCS8qIEZJRk8gZnVsbCAqLworI2RlZmluZSBGU1RBVF9BTFJNCQkoMTw8MTcpCS8qIEZJRk8gYWxhcm0gKi8KKyNkZWZpbmUgRlNUQVRfRU1QVFkJCSgxPDwxNikJLyogRklGTyBlbXB0eSAqLworLyogVVNCIEVuZHBvaW50IEZJRk8gQ29udHJvbCBSZWdpc3RlciBiaXQgZmllbGRzICovCisjZGVmaW5lIEZDVFJMX1dGUgkJKDE8PDI5KQkvKiBXcml0ZSBmcmFtZSBlbmQgKi8KKy8qIFVTQiBFbmRwb2ludCBJbnRlcnJ1cHQgU3RhdHVzIFJlZ3NpdGVyIGJpdCBmaWVsZHMgKi8KKyNkZWZpbmUgRVBJTlRSX0ZJRk9fRlVMTAkoMTw8OCkJLyogZmlmbyBmdWxsICovCisjZGVmaW5lIEVQSU5UUl9GSUZPX0VNUFRZCSgxPDw3KQkvKiBmaWZvIGVtcHR5ICovCisjZGVmaW5lIEVQSU5UUl9GSUZPX0VSUk9SCSgxPDw2KQkvKiBmaWZvIGVycm9yICovCisjZGVmaW5lIEVQSU5UUl9GSUZPX0hJR0gJKDE8PDUpCS8qIGZpZm8gaGlnaCAqLworI2RlZmluZSBFUElOVFJfRklGT19MT1cJCSgxPDw0KQkvKiBmaWZvIGxvdyAqLworI2RlZmluZSBFUElOVFJfTURFVlJFUQkJKDE8PDMpCS8qIG11bHRpIERldmljZSByZXF1ZXN0ICovCisjZGVmaW5lIEVQSU5UUl9FT1QJCSgxPDwyKQkvKiBmaWZvIGVuZCBvZiB0cmFuc2ZlciAqLworI2RlZmluZSBFUElOVFJfREVWUkVRCQkoMTw8MSkJLyogRGV2aWNlIHJlcXVlc3QgKi8KKyNkZWZpbmUgRVBJTlRSX0VPRgkJKDE8PDApCS8qIGZpZm8gZW5kIG9mIGZyYW1lICovCisKKy8qIERlYnVnIG1hY3JvcyAqLworI2lmZGVmIERFQlVHCisKKy8qICNkZWZpbmUgREVCVUdfUkVRICovCisvKiAjZGVmaW5lIERFQlVHX1RSWCAqLworLyogI2RlZmluZSBERUJVR19JTklUICovCisvKiAjZGVmaW5lIERFQlVHX0VQMCAqLworLyogI2RlZmluZSBERUJVR19FUFggKi8KKy8qICNkZWZpbmUgREVCVUdfSVJRICovCisvKiAjZGVmaW5lIERFQlVHX0VQSVJRICovCisvKiAjZGVmaW5lIERFQlVHX0RVTVAgKi8KKyNkZWZpbmUgREVCVUdfRVJSCisKKyNpZmRlZiBERUJVR19SRVEKKwkjZGVmaW5lIERfUkVRKGRldiwgYXJncy4uLikJZGV2X2RiZyhkZXYsICMjIGFyZ3MpCisjZWxzZQorCSNkZWZpbmUgRF9SRVEoZGV2LCBhcmdzLi4uKQlkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBERUJVR19SRVEgKi8KKworI2lmZGVmIERFQlVHX1RSWAorCSNkZWZpbmUgRF9UUlgoZGV2LCBhcmdzLi4uKQlkZXZfZGJnKGRldiwgIyMgYXJncykKKyNlbHNlCisJI2RlZmluZSBEX1RSWChkZXYsIGFyZ3MuLi4pCWRvIHt9IHdoaWxlICgwKQorI2VuZGlmIC8qIERFQlVHX1RSWCAqLworCisjaWZkZWYgREVCVUdfSU5JVAorCSNkZWZpbmUgRF9JTkkoZGV2LCBhcmdzLi4uKQlkZXZfZGJnKGRldiwgIyMgYXJncykKKyNlbHNlCisJI2RlZmluZSBEX0lOSShkZXYsIGFyZ3MuLi4pCWRvIHt9IHdoaWxlICgwKQorI2VuZGlmIC8qIERFQlVHX0lOSVQgKi8KKworI2lmZGVmIERFQlVHX0VQMAorCXN0YXRpYyBjb25zdCBjaGFyICpzdGF0ZV9uYW1lW10gPSB7CisJCSJFUDBfSURMRSIsCisJCSJFUDBfSU5fREFUQV9QSEFTRSIsCisJCSJFUDBfT1VUX0RBVEFfUEhBU0UiLAorCQkiRVAwX0NPTkZJRyIsCisJCSJFUDBfU1RBTEwiCisJfTsKKwkjZGVmaW5lIERfRVAwKGRldiwgYXJncy4uLikJZGV2X2RiZyhkZXYsICMjIGFyZ3MpCisjZWxzZQorCSNkZWZpbmUgRF9FUDAoZGV2LCBhcmdzLi4uKQlkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBERUJVR19FUDAgKi8KKworI2lmZGVmIERFQlVHX0VQWAorCSNkZWZpbmUgRF9FUFgoZGV2LCBhcmdzLi4uKQlkZXZfZGJnKGRldiwgIyMgYXJncykKKyNlbHNlCisJI2RlZmluZSBEX0VQWChkZXYsIGFyZ3MuLi4pCWRvIHt9IHdoaWxlICgwKQorI2VuZGlmIC8qIERFQlVHX0VQMCAqLworCisjaWZkZWYgREVCVUdfSVJRCisJc3RhdGljIHZvaWQgZHVtcF9pbnRyKGNvbnN0IGNoYXIgKmxhYmVsLCBpbnQgaXJxcmVnLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCisJeworCQlkZXZfZGJnKGRldiwgIjwlcz4gVVNCX0lOVFI9WyVzJXMlcyVzJXMlcyVzJXMlc11cbiIsIGxhYmVsLAorCQkJKGlycXJlZyAmIElOVFJfV0FLRVVQKSA/ICIgd2FrZSIgOiAiIiwKKwkJCShpcnFyZWcgJiBJTlRSX01TT0YpID8gIiBtc29mIiA6ICIiLAorCQkJKGlycXJlZyAmIElOVFJfU09GKSA/ICIgc29mIiA6ICIiLAorCQkJKGlycXJlZyAmIElOVFJfUkVTVU1FKSA/ICIgcmVzdW1lIiA6ICIiLAorCQkJKGlycXJlZyAmIElOVFJfU1VTUEVORCkgPyAiIHN1c3BlbmQiIDogIiIsCisJCQkoaXJxcmVnICYgSU5UUl9SRVNFVF9TVE9QKSA/ICIgbm9yZXNldCIgOiAiIiwKKwkJCShpcnFyZWcgJiBJTlRSX1JFU0VUX1NUQVJUKSA/ICIgcmVzZXQiIDogIiIsCisJCQkoaXJxcmVnICYgSU5UUl9GUkFNRV9NQVRDSCkgPyAiIGZtYXRjaCIgOiAiIiwKKwkJCShpcnFyZWcgJiBJTlRSX0NGR19DSEcpID8gIiBjb25maWciIDogIiIpOworCX0KKyNlbHNlCisJI2RlZmluZSBkdW1wX2ludHIoeCwgeSwgeikJCWRvIHt9IHdoaWxlICgwKQorI2VuZGlmIC8qIERFQlVHX0lSUSAqLworCisjaWZkZWYgREVCVUdfRVBJUlEKKwlzdGF0aWMgdm9pZCBkdW1wX2VwX2ludHIoY29uc3QgY2hhciAqbGFiZWwsIGludCBuciwgaW50IGlycXJlZywgc3RydWN0IGRldmljZSAqZGV2KQorCXsKKwkJZGV2X2RiZyhkZXYsICI8JXM+IEVQJWRfSU5UUj1bJXMlcyVzJXMlcyVzJXMlcyVzXVxuIiwgbGFiZWwsIG5yLAorCQkJKGlycXJlZyAmIEVQSU5UUl9GSUZPX0ZVTEwpID8gIiBmdWxsIiA6ICIiLAorCQkJKGlycXJlZyAmIEVQSU5UUl9GSUZPX0VNUFRZKSA/ICIgZmVtcHR5IiA6ICIiLAorCQkJKGlycXJlZyAmIEVQSU5UUl9GSUZPX0VSUk9SKSA/ICIgZmVyciIgOiAiIiwKKwkJCShpcnFyZWcgJiBFUElOVFJfRklGT19ISUdIKSA/ICIgZmhpZ2giIDogIiIsCisJCQkoaXJxcmVnICYgRVBJTlRSX0ZJRk9fTE9XKSA/ICIgZmxvdyIgOiAiIiwKKwkJCShpcnFyZWcgJiBFUElOVFJfTURFVlJFUSkgPyAiIG1yZXEiIDogIiIsCisJCQkoaXJxcmVnICYgRVBJTlRSX0VPRikgPyAiIGVvZiIgOiAiIiwKKwkJCShpcnFyZWcgJiBFUElOVFJfREVWUkVRKSA/ICIgZGV2cmVxIiA6ICIiLAorCQkJKGlycXJlZyAmIEVQSU5UUl9FT1QpID8gIiBlb3QiIDogIiIpOworCX0KKyNlbHNlCisJI2RlZmluZSBkdW1wX2VwX2ludHIoeCwgeSwgeiwgaSkJZG8ge30gd2hpbGUgKDApCisjZW5kaWYgLyogREVCVUdfSVJRICovCisKKyNpZmRlZiBERUJVR19EVU1QCisJc3RhdGljIHZvaWQgZHVtcF91c2Jfc3RhdChjb25zdCBjaGFyICpsYWJlbCwgc3RydWN0IGlteF91ZGNfc3RydWN0ICppbXhfdXNiKQorCXsKKwkJaW50IHRlbXAgPSBfX3Jhd19yZWFkbChpbXhfdXNiLT5iYXNlICsgVVNCX1NUQVQpOworCisJCWRldl9kYmcoaW14X3VzYi0+ZGV2LAorCQkJIjwlcz4gVVNCX1NUQVQ9WyVzJXMgQ0ZHPSVkLCBJTlRGPSVkLCBBTFRSPSVkXVxuIiwgbGFiZWwsCisJCQkodGVtcCAmIFNUQVRfUlNUKSA/ICIgcmVzZXQiIDogIiIsCisJCQkodGVtcCAmIFNUQVRfU1VTUCkgPyAiIHN1c3BlbmQiIDogIiIsCisJCQkodGVtcCAmIFNUQVRfQ0ZHKSA+PiA1LAorCQkJKHRlbXAgJiBTVEFUX0lOVEYpID4+IDMsCisJCQkodGVtcCAmIFNUQVRfQUxUU0VUKSk7CisJfQorCisJc3RhdGljIHZvaWQgZHVtcF9lcF9zdGF0KGNvbnN0IGNoYXIgKmxhYmVsLCBzdHJ1Y3QgaW14X2VwX3N0cnVjdCAqaW14X2VwKQorCXsKKwkJaW50IHRlbXAgPSBfX3Jhd19yZWFkbChpbXhfZXAtPmlteF91c2ItPmJhc2UgKyBVU0JfRVBfSU5UUihFUF9OTyhpbXhfZXApKSk7CisKKwkJZGV2X2RiZyhpbXhfZXAtPmlteF91c2ItPmRldiwKKwkJCSI8JXM+IEVQJWRfSU5UUj1bJXMlcyVzJXMlcyVzJXMlcyVzXVxuIiwgbGFiZWwsIEVQX05PKGlteF9lcCksCisJCQkodGVtcCAmIEVQSU5UUl9GSUZPX0ZVTEwpID8gIiBmdWxsIiA6ICIiLAorCQkJKHRlbXAgJiBFUElOVFJfRklGT19FTVBUWSkgPyAiIGZlbXB0eSIgOiAiIiwKKwkJCSh0ZW1wICYgRVBJTlRSX0ZJRk9fRVJST1IpID8gIiBmZXJyIiA6ICIiLAorCQkJKHRlbXAgJiBFUElOVFJfRklGT19ISUdIKSA/ICIgZmhpZ2giIDogIiIsCisJCQkodGVtcCAmIEVQSU5UUl9GSUZPX0xPVykgPyAiIGZsb3ciIDogIiIsCisJCQkodGVtcCAmIEVQSU5UUl9NREVWUkVRKSA/ICIgbXJlcSIgOiAiIiwKKwkJCSh0ZW1wICYgRVBJTlRSX0VPRikgPyAiIGVvZiIgOiAiIiwKKwkJCSh0ZW1wICYgRVBJTlRSX0RFVlJFUSkgPyAiIGRldnJlcSIgOiAiIiwKKwkJCSh0ZW1wICYgRVBJTlRSX0VPVCkgPyAiIGVvdCIgOiAiIik7CisKKwkJdGVtcCA9IF9fcmF3X3JlYWRsKGlteF9lcC0+aW14X3VzYi0+YmFzZSArIFVTQl9FUF9TVEFUKEVQX05PKGlteF9lcCkpKTsKKworCQlkZXZfZGJnKGlteF9lcC0+aW14X3VzYi0+ZGV2LAorCQkJIjwlcz4gRVAlZF9TVEFUPVslcyVzIGJjb3VudD0lZF1cbiIsIGxhYmVsLCBFUF9OTyhpbXhfZXApLAorCQkJKHRlbXAgJiBFUFNUQVRfU0lQKSA/ICIgc2lwIiA6ICIiLAorCQkJKHRlbXAgJiBFUFNUQVRfU1RBTEwpID8gIiBzdGFsbCIgOiAiIiwKKwkJCSh0ZW1wICYgRVBTVEFUX0JDT1VOVCkgPj4gMTYpOworCisJCXRlbXAgPSBfX3Jhd19yZWFkbChpbXhfZXAtPmlteF91c2ItPmJhc2UgKyBVU0JfRVBfRlNUQVQoRVBfTk8oaW14X2VwKSkpOworCisJCWRldl9kYmcoaW14X2VwLT5pbXhfdXNiLT5kZXYsCisJCQkiPCVzPiBFUCVkX0ZTVEFUPVslcyVzJXMlcyVzJXMlc11cbiIsIGxhYmVsLCBFUF9OTyhpbXhfZXApLAorCQkJKHRlbXAgJiBGU1RBVF9FUlIpID8gIiBmZXJyIiA6ICIiLAorCQkJKHRlbXAgJiBGU1RBVF9VRikgPyAiIGZ1bmRlciIgOiAiIiwKKwkJCSh0ZW1wICYgRlNUQVRfT0YpID8gIiBmb3ZlciIgOiAiIiwKKwkJCSh0ZW1wICYgRlNUQVRfRlIpID8gIiBmcmVhZHkiIDogIiIsCisJCQkodGVtcCAmIEZTVEFUX0ZVTEwpID8gIiBmZnVsbCIgOiAiIiwKKwkJCSh0ZW1wICYgRlNUQVRfQUxSTSkgPyAiIGZhbGFybSIgOiAiIiwKKwkJCSh0ZW1wICYgRlNUQVRfRU1QVFkpID8gIiBmZW1wdHkiIDogIiIpOworCX0KKworCXN0YXRpYyB2b2lkIGR1bXBfcmVxKGNvbnN0IGNoYXIgKmxhYmVsLCBzdHJ1Y3QgaW14X2VwX3N0cnVjdCAqaW14X2VwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSkKKwl7CisJCWludCBpOworCisJCWlmICghcmVxIHx8ICFyZXEtPmJ1ZikgeworCQkJZGV2X2RiZyhpbXhfZXAtPmlteF91c2ItPmRldiwgIjwlcz4gcmVxIG9yIHJlcSBidWYgaXMgZnJlZVxuIiwgbGFiZWwpOworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKCghRVBfTk8oaW14X2VwKSAmJiBpbXhfZXAtPmlteF91c2ItPmVwMHN0YXRlID09IEVQMF9JTl9EQVRBX1BIQVNFKQorCQkJfHwgKEVQX05PKGlteF9lcCkgJiYgRVBfRElSKGlteF9lcCkpKSB7CisKKwkJCWRldl9kYmcoaW14X2VwLT5pbXhfdXNiLT5kZXYsICI8JXM+IHJlcXVlc3QgZHVtcCA8IiwgbGFiZWwpOworCQkJZm9yIChpID0gMDsgaSA8IHJlcS0+bGVuZ3RoOyBpKyspCisJCQkJcHJpbnRrKCIlMDJ4LSIsICooKHU4ICopcmVxLT5idWYgKyBpKSk7CisJCQlwcmludGsoIj5cbiIpOworCQl9CisJfQorCisjZWxzZQorCSNkZWZpbmUgZHVtcF9lcF9zdGF0KHgsIHkpCQlkbyB7fSB3aGlsZSAoMCkKKwkjZGVmaW5lIGR1bXBfdXNiX3N0YXQoeCwgeSkJCWRvIHt9IHdoaWxlICgwKQorCSNkZWZpbmUgZHVtcF9yZXEoeCwgeSwgeikJCWRvIHt9IHdoaWxlICgwKQorI2VuZGlmIC8qIERFQlVHX0RVTVAgKi8KKworI2lmZGVmIERFQlVHX0VSUgorCSNkZWZpbmUgRF9FUlIoZGV2LCBhcmdzLi4uKQlkZXZfZGJnKGRldiwgIyMgYXJncykKKyNlbHNlCisJI2RlZmluZSBEX0VSUihkZXYsIGFyZ3MuLi4pCWRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisKKyNlbHNlCisJI2RlZmluZSBEX1JFUShkZXYsIGFyZ3MuLi4pCQlkbyB7fSB3aGlsZSAoMCkKKwkjZGVmaW5lIERfVFJYKGRldiwgYXJncy4uLikJCWRvIHt9IHdoaWxlICgwKQorCSNkZWZpbmUgRF9JTkkoZGV2LCBhcmdzLi4uKQkJZG8ge30gd2hpbGUgKDApCisJI2RlZmluZSBEX0VQMChkZXYsIGFyZ3MuLi4pCQlkbyB7fSB3aGlsZSAoMCkKKwkjZGVmaW5lIERfRVBYKGRldiwgYXJncy4uLikJCWRvIHt9IHdoaWxlICgwKQorCSNkZWZpbmUgZHVtcF9lcF9pbnRyKHgsIHksIHosIGkpCWRvIHt9IHdoaWxlICgwKQorCSNkZWZpbmUgZHVtcF9pbnRyKHgsIHksIHopCQlkbyB7fSB3aGlsZSAoMCkKKwkjZGVmaW5lIGR1bXBfZXBfc3RhdCh4LCB5KQkJZG8ge30gd2hpbGUgKDApCisJI2RlZmluZSBkdW1wX3VzYl9zdGF0KHgsIHkpCQlkbyB7fSB3aGlsZSAoMCkKKwkjZGVmaW5lIGR1bXBfcmVxKHgsIHksIHopCQlkbyB7fSB3aGlsZSAoMCkKKwkjZGVmaW5lIERfRVJSKGRldiwgYXJncy4uLikJCWRvIHt9IHdoaWxlICgwKQorI2VuZGlmIC8qIERFQlVHICovCisKKyNlbmRpZiAvKiBfX0xJTlVYX1VTQl9HQURHRVRfSU1YX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9pbm9kZS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2lub2RlLmMKaW5kZXggZWViMjZjMC4uMzE3YjQ4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2lub2RlLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2lub2RlLmMKQEAgLTIwMDEsNyArMjAwMSw2IEBACiAJCWlub2RlLT5pX21vZGUgPSBtb2RlOwogCQlpbm9kZS0+aV91aWQgPSBkZWZhdWx0X3VpZDsKIAkJaW5vZGUtPmlfZ2lkID0gZGVmYXVsdF9naWQ7Ci0JCWlub2RlLT5pX2Jsb2NrcyA9IDA7CiAJCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZQogCQkJCT0gQ1VSUkVOVF9USU1FOwogCQlpbm9kZS0+aV9wcml2YXRlID0gZGF0YTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9saDdhNDB4X3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2xoN2E0MHhfdWRjLmMKaW5kZXggYzZlN2RmMC4uZDU1NGIwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2xoN2E0MHhfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2xoN2E0MHhfdWRjLmMKQEAgLTE5ODEsNyArMTk4MSw3IEBACiAJCSAgIC5lcDAgPSAmbWVtb3J5LmVwWzBdLmVwLAogCQkgICAubmFtZSA9IGRyaXZlcl9uYW1lLAogCQkgICAuZGV2ID0gewotCQkJICAgLmJ1c19pZCA9ICJnYWRnZXQiLAorCQkJICAgLmluaXRfbmFtZSA9ICJnYWRnZXQiLAogCQkJICAgLnJlbGVhc2UgPSBub3BfcmVsZWFzZSwKIAkJCSAgIH0sCiAJCSAgIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvbTY2NTkyLXVkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L202NjU5Mi11ZGMuYwppbmRleCAzYTg4NzllLi40M2RjZjllIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvbTY2NTkyLXVkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9tNjY1OTItdWRjLmMKQEAgLTE1NDYsOCArMTU0Niw2IEBACiB7CiB9CiAKLSNkZWZpbmUgcmVzb3VyY2VfbGVuKHIpICgoKHIpLT5lbmQgLSAociktPnN0YXJ0KSArIDEpCi0KIHN0YXRpYyBpbnQgX19pbml0IG02NjU5Ml9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwpAQCAtMTU2MCwxMSArMTU1OCwxMCBAQAogCWludCByZXQgPSAwOwogCWludCBpOwogCi0JcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwKLQkJCShjaGFyICopdWRjX25hbWUpOworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJaWYgKCFyZXMpIHsKIAkJcmV0ID0gLUVOT0RFVjsKLQkJcHJfZXJyKCJwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lIGVycm9yLlxuIik7CisJCXByX2VycigicGxhdGZvcm1fZ2V0X3Jlc291cmNlIGVycm9yLlxuIik7CiAJCWdvdG8gY2xlYW5fdXA7CiAJfQogCkBAIC0xNTc1LDcgKzE1NzIsNyBAQAogCQlnb3RvIGNsZWFuX3VwOwogCX0KIAotCXJlZyA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzb3VyY2VfbGVuKHJlcykpOworCXJlZyA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKIAlpZiAocmVnID09IE5VTEwpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJcHJfZXJyKCJpb3JlbWFwIGVycm9yLlxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvbmV0MjI4MC5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L25ldDIyODAuYwppbmRleCA4YWU3MGRlLi4xMmM2ZDgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvbmV0MjI4MC5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9uZXQyMjgwLmMKQEAgLTY2OSw3ICs2NjksNyBAQAogCiAJLyogMjI4MCBtYXkgYmUgcG9sbGluZyBWQUxJRF9CSVQgdGhyb3VnaCBlcC0+ZG1hLT5kbWFkZXNjICovCiAJd21iICgpOwotCXRkLT5kbWFjb3VudCA9IGNwdV90b19sZTMycCAoJmRtYWNvdW50KTsKKwl0ZC0+ZG1hY291bnQgPSBjcHVfdG9fbGUzMihkbWFjb3VudCk7CiB9CiAKIHN0YXRpYyBjb25zdCB1MzIgZG1hY3RsX2RlZmF1bHQgPQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L29tYXBfdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvb21hcF91ZGMuYwppbmRleCAzNGU5ZTM5Li41N2Q5NjQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvb21hcF91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvb21hcF91ZGMuYwpAQCAtMzAwNiw3ICszMDA2LDcgQEAKIAogY2xlYW51cDA6CiAJaWYgKHhjZWl2KQotCQlwdXRfZGV2aWNlKHhjZWl2LT5kZXYpOworCQlvdGdfcHV0X3RyYW5zY2VpdmVyKHhjZWl2KTsKIAogCWlmIChjcHVfaXNfb21hcDE2eHgoKSB8fCBjcHVfaXNfb21hcDI0eHgoKSkgewogCQljbGtfZGlzYWJsZShoaGNfY2xrKTsKQEAgLTMwMzQsNyArMzAzNCw3IEBACiAKIAlwdWxsdXBfZGlzYWJsZSh1ZGMpOwogCWlmICh1ZGMtPnRyYW5zY2VpdmVyKSB7Ci0JCXB1dF9kZXZpY2UodWRjLT50cmFuc2NlaXZlci0+ZGV2KTsKKwkJb3RnX3B1dF90cmFuc2NlaXZlcih1ZGMtPnRyYW5zY2VpdmVyKTsKIAkJdWRjLT50cmFuc2NlaXZlciA9IE5VTEw7CiAJfQogCW9tYXBfd3JpdGV3KDAsIFVEQ19TWVNDT04xKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyNXhfdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMjV4X3VkYy5jCmluZGV4IDhjNTAyNmIuLjliMzYyMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyNXhfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTI1eF91ZGMuYwpAQCAtMTgzMyw3ICsxODMzLDcgQEAKIAkJLmVwMAkJPSAmbWVtb3J5LmVwWzBdLmVwLAogCQkubmFtZQkJPSBkcml2ZXJfbmFtZSwKIAkJLmRldiA9IHsKLQkJCS5idXNfaWQJCT0gImdhZGdldCIsCisJCQkuaW5pdF9uYW1lCT0gImdhZGdldCIsCiAJCQkucmVsZWFzZQk9IG5vcF9yZWxlYXNlLAogCQl9LAogCX0sCkBAIC0yMTk4LDcgKzIxOTgsNyBAQAogCXVkY19kaXNhYmxlKGRldik7CiAJdWRjX3JlaW5pdChkZXYpOwogCi0JZGV2LT52YnVzID0gaXNfdmJ1c19wcmVzZW50KCk7CisJZGV2LT52YnVzID0gISFpc192YnVzX3ByZXNlbnQoKTsKIAogCS8qIGlycSBzZXR1cCBhZnRlciBvbGQgaGFyZHdhcmUgc3RhdGUgaXMgY2xlYW5lZCB1cCAqLwogCXJldHZhbCA9IHJlcXVlc3RfaXJxKGlycSwgcHhhMjV4X3VkY19pcnEsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMjd4X3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTI3eF91ZGMuYwppbmRleCA5NDRlNGZmLi45OTBmNDBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMjd4X3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyN3hfdWRjLmMKQEAgLTQzMCw3ICs0MzAsNiBAQAogLyoqCiAgKiBwaW9faXJxX2Rpc2FibGUgLSBEaXNhYmxlcyBpcnEgZ2VuZXJhdGlvbiBmb3Igb25lIGVuZHBvaW50CiAgKiBAZXA6IHVkYyBlbmRwb2ludAotICogQGluZGV4OiBlbmRwb2ludCBudW1iZXIKICAqLwogc3RhdGljIHZvaWQgcGlvX2lycV9kaXNhYmxlKHN0cnVjdCBweGFfZXAgKmVwKQogewpAQCAtNTg2LDcgKzU4NSw2IEBACiAgKiBpbmNfZXBfc3RhdHNfYnl0ZXMgLSBVcGRhdGUgZXAgc3RhdHMgY291bnRzCiAgKiBAZXA6IHBoeXNpY2FsIGVuZHBvaW50CiAgKiBAY291bnQ6IGJ5dGVzIHRyYW5zZmVyZWQgb24gZW5kcG9pbnQKLSAqIEByZXE6IHVzYiByZXF1ZXN0CiAgKiBAaXNfaW46IGVwIGRpcmVjdGlvbiAoVVNCX0RJUl9JTiBvciAwKQogICovCiBzdGF0aWMgdm9pZCBpbmNfZXBfc3RhdHNfYnl0ZXMoc3RydWN0IHB4YV9lcCAqZXAsIGludCBjb3VudCwgaW50IGlzX2luKQpAQCAtMjE2Miw3ICsyMTYwLDcgQEAKIAkJLmVwMAkJPSAmbWVtb3J5LnVkY191c2JfZXBbMF0udXNiX2VwLAogCQkubmFtZQkJPSBkcml2ZXJfbmFtZSwKIAkJLmRldiA9IHsKLQkJCS5idXNfaWQJCT0gImdhZGdldCIsCisJCQkuaW5pdF9uYW1lCT0gImdhZGdldCIsCiAJCX0sCiAJfSwKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3MzYzI0MTBfdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvczNjMjQxMF91ZGMuYwppbmRleCA4ZDhkNjUxLi45YTJiODkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvczNjMjQxMF91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvczNjMjQxMF91ZGMuYwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KIAogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgpAQCAtNTEsNyArNTIsNiBAQAogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPG1hY2gvcmVncy1ncGlvLmg+CiAKICNpbmNsdWRlIDxwbGF0L3JlZ3MtdWRjLmg+CiAjaW5jbHVkZSA8cGxhdC91ZGMuaD4KQEAgLTE1MTAsMTEgKzE1MTAsNyBAQAogCiAJZHByaW50ayhERUJVR19OT1JNQUwsICIlcygpXG4iLCBfX2Z1bmNfXyk7CiAKLQkvKiBzb21lIGNwdXMgY2Fubm90IHJlYWQgZnJvbSBhbiBsaW5lIGNvbmZpZ3VyZWQgdG8gSVJRISAqLwotCXMzYzI0MTBfZ3Bpb19jZmdwaW4odWRjX2luZm8tPnZidXNfcGluLCBTM0MyNDEwX0dQSU9fSU5QVVQpOwotCXZhbHVlID0gczNjMjQxMF9ncGlvX2dldHBpbih1ZGNfaW5mby0+dmJ1c19waW4pOwotCXMzYzI0MTBfZ3Bpb19jZmdwaW4odWRjX2luZm8tPnZidXNfcGluLCBTM0MyNDEwX0dQSU9fU0ZOMik7Ci0KKwl2YWx1ZSA9IGdwaW9fZ2V0X3ZhbHVlKHVkY19pbmZvLT52YnVzX3BpbikgPyAxIDogMDsKIAlpZiAodWRjX2luZm8tPnZidXNfcGluX2ludmVydGVkKQogCQl2YWx1ZSA9ICF2YWx1ZTsKIApAQCAtMTcyNyw3ICsxNzIzLDcgQEAKIAkJLmVwMAkJPSAmbWVtb3J5LmVwWzBdLmVwLAogCQkubmFtZQkJPSBnYWRnZXRfbmFtZSwKIAkJLmRldiA9IHsKLQkJCS5idXNfaWQJCT0gImdhZGdldCIsCisJCQkuaW5pdF9uYW1lCT0gImdhZGdldCIsCiAJCX0sCiAJfSwKIApAQCAtMTgwMiw3ICsxNzk4LDcgQEAKIAlzdHJ1Y3QgczNjMjQxMF91ZGMgKnVkYyA9ICZtZW1vcnk7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKIAlpbnQgcmV0dmFsOwotCXVuc2lnbmVkIGludCBpcnE7CisJaW50IGlycTsKIAogCWRldl9kYmcoZGV2LCAiJXMoKVxuIiwgX19mdW5jX18pOwogCkBAIC0xODYxLDcgKzE4NTcsNyBAQAogCiAJLyogaXJxIHNldHVwIGFmdGVyIG9sZCBoYXJkd2FyZSBzdGF0ZSBpcyBjbGVhbmVkIHVwICovCiAJcmV0dmFsID0gcmVxdWVzdF9pcnEoSVJRX1VTQkQsIHMzYzI0MTBfdWRjX2lycSwKLQkJCUlSUUZfRElTQUJMRUQsIGdhZGdldF9uYW1lLCB1ZGMpOworCQkJICAgICBJUlFGX0RJU0FCTEVELCBnYWRnZXRfbmFtZSwgdWRjKTsKIAogCWlmIChyZXR2YWwgIT0gMCkgewogCQlkZXZfZXJyKGRldiwgImNhbm5vdCBnZXQgaXJxICVpLCBlcnIgJWRcbiIsIElSUV9VU0JELCByZXR2YWwpOwpAQCAtMTg3MiwxNyArMTg2OCwyOCBAQAogCWRldl9kYmcoZGV2LCAiZ290IGlycSAlaVxuIiwgSVJRX1VTQkQpOwogCiAJaWYgKHVkY19pbmZvICYmIHVkY19pbmZvLT52YnVzX3BpbiA+IDApIHsKLQkJaXJxID0gczNjMjQxMF9ncGlvX2dldGlycSh1ZGNfaW5mby0+dmJ1c19waW4pOworCQlyZXR2YWwgPSBncGlvX3JlcXVlc3QodWRjX2luZm8tPnZidXNfcGluLCAidWRjIHZidXMiKTsKKwkJaWYgKHJldHZhbCA8IDApIHsKKwkJCWRldl9lcnIoZGV2LCAiY2Fubm90IGNsYWltIHZidXMgcGluXG4iKTsKKwkJCWdvdG8gZXJyX2ludDsKKwkJfQorCisJCWlycSA9IGdwaW9fdG9faXJxKHVkY19pbmZvLT52YnVzX3Bpbik7CisJCWlmIChpcnEgPCAwKSB7CisJCQlkZXZfZXJyKGRldiwgIm5vIGlycSBmb3IgZ3BpbyB2YnVzIHBpblxuIik7CisJCQlnb3RvIGVycl9ncGlvX2NsYWltOworCQl9CisKIAkJcmV0dmFsID0gcmVxdWVzdF9pcnEoaXJxLCBzM2MyNDEwX3VkY192YnVzX2lycSwKIAkJCQkgICAgIElSUUZfRElTQUJMRUQgfCBJUlFGX1RSSUdHRVJfUklTSU5HCiAJCQkJICAgICB8IElSUUZfVFJJR0dFUl9GQUxMSU5HIHwgSVJRRl9TSEFSRUQsCiAJCQkJICAgICBnYWRnZXRfbmFtZSwgdWRjKTsKIAogCQlpZiAocmV0dmFsICE9IDApIHsKLQkJCWRldl9lcnIoZGV2LCAiY2FuJ3QgZ2V0IHZidXMgaXJxICVpLCBlcnIgJWRcbiIsCisJCQlkZXZfZXJyKGRldiwgImNhbid0IGdldCB2YnVzIGlycSAlZCwgZXJyICVkXG4iLAogCQkJCWlycSwgcmV0dmFsKTsKIAkJCXJldHZhbCA9IC1FQlVTWTsKLQkJCWdvdG8gZXJyX2ludDsKKwkJCWdvdG8gZXJyX2dwaW9fY2xhaW07CiAJCX0KIAogCQlkZXZfZGJnKGRldiwgImdvdCBpcnEgJWlcbiIsIGlycSk7CkBAIC0xOTAyLDYgKzE5MDksOSBAQAogCiAJcmV0dXJuIDA7CiAKK2Vycl9ncGlvX2NsYWltOgorCWlmICh1ZGNfaW5mbyAmJiB1ZGNfaW5mby0+dmJ1c19waW4gPiAwKQorCQlncGlvX2ZyZWUodWRjX2luZm8tPnZidXNfcGluKTsKIGVycl9pbnQ6CiAJZnJlZV9pcnEoSVJRX1VTQkQsIHVkYyk7CiBlcnJfbWFwOgpAQCAtMTkyNyw3ICsxOTM3LDcgQEAKIAlkZWJ1Z2ZzX3JlbW92ZSh1ZGMtPnJlZ3NfaW5mbyk7CiAKIAlpZiAodWRjX2luZm8gJiYgdWRjX2luZm8tPnZidXNfcGluID4gMCkgewotCQlpcnEgPSBzM2MyNDEwX2dwaW9fZ2V0aXJxKHVkY19pbmZvLT52YnVzX3Bpbik7CisJCWlycSA9IGdwaW9fdG9faXJxKHVkY19pbmZvLT52YnVzX3Bpbik7CiAJCWZyZWVfaXJxKGlycSwgdWRjKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC91X2V0aGVyLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdV9ldGhlci5jCmluZGV4IGQ5NzM5ZDUuLjk2ZDY1Y2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC91X2V0aGVyLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VfZXRoZXIuYwpAQCAtNzE2LDYgKzcxNiwxNCBAQAogCiBzdGF0aWMgc3RydWN0IGV0aF9kZXYgKnRoZV9kZXY7CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgZXRoX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCQk9IGV0aF9vcGVuLAorCS5uZG9fc3RvcAkJPSBldGhfc3RvcCwKKwkubmRvX3N0YXJ0X3htaXQJCT0gZXRoX3N0YXJ0X3htaXQsCisJLm5kb19jaGFuZ2VfbXR1CQk9IHVldGhfY2hhbmdlX210dSwKKwkubmRvX3NldF9tYWNfYWRkcmVzcyAJPSBldGhfbWFjX2FkZHIsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCit9OwogCiAvKioKICAqIGdldGhlcl9zZXR1cCAtIGluaXRpYWxpemUgb25lIGV0aGVybmV0LW92ZXItdXNiIGxpbmsKQEAgLTc2NCwxMiArNzcyLDggQEAKIAlpZiAoZXRoYWRkcikKIAkJbWVtY3B5KGV0aGFkZHIsIGRldi0+aG9zdF9tYWMsIEVUSF9BTEVOKTsKIAotCW5ldC0+Y2hhbmdlX210dSA9IHVldGhfY2hhbmdlX210dTsKLQluZXQtPmhhcmRfc3RhcnRfeG1pdCA9IGV0aF9zdGFydF94bWl0OwotCW5ldC0+b3BlbiA9IGV0aF9vcGVuOwotCW5ldC0+c3RvcCA9IGV0aF9zdG9wOwotCS8qIHdhdGNoZG9nX3RpbWVvLCB0eF90aW1lb3V0IC4uLiAqLwotCS8qIHNldF9tdWx0aWNhc3RfbGlzdCAqLworCW5ldC0+bmV0ZGV2X29wcyA9ICZldGhfbmV0ZGV2X29wczsKKwogCVNFVF9FVEhUT09MX09QUyhuZXQsICZvcHMpOwogCiAJLyogdHdvIGtpbmRzIG9mIGhvc3QtaW5pdGlhdGVkIHN0YXRlIGNoYW5nZXM6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L0tjb25maWcgYi9kcml2ZXJzL3VzYi9ob3N0L0tjb25maWcKaW5kZXggZjNhNzVhOS4uMmI0NzZiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvS2NvbmZpZwpAQCAtOTYsNiArOTYsMTkgQEAKIAkgIEVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIFVTQiBjb250cm9sbGVyIHByZXNlbnQgb24gdGhlIFBvd2VyUEMKIAkgIE9wZW5GaXJtd2FyZSBwbGF0Zm9ybSBidXMuCiAKK2NvbmZpZyBVU0JfT1hVMjEwSFBfSENECisJdHJpc3RhdGUgIk9YVTIxMEhQIEhDRCBzdXBwb3J0IgorCWRlcGVuZHMgb24gVVNCCisJLS0taGVscC0tLQorCSAgVGhlIE9YVTIxMEhQIGlzIGFuIFVTQiBob3N0L09URy9kZXZpY2UgY29udHJvbGxlci4gRW5hYmxlIHRoaXMKKwkgIG9wdGlvbiBpZiB5b3VyIGJvYXJkIGhhcyB0aGlzIGNoaXAuIElmIHVuc3VyZSwgc2F5IE4uCisKKwkgIFRoaXMgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgaXNvY2hyb25vdXMgdHJhbnNmZXJzIGFuZCBkb2Vzbid0CisJICBpbXBsZW1lbnQgT1RHIG5vciBVU0IgZGV2aWNlIGNvbnRyb2xsZXJzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBveHUyMTBocC1oY2QuCisKIGNvbmZpZyBVU0JfSVNQMTE2WF9IQ0QKIAl0cmlzdGF0ZSAiSVNQMTE2WCBIQ0Qgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFVTQgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL2hvc3QvTWFrZWZpbGUKaW5kZXggMjNiZTIyMi4uZTVmM2YyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9ob3N0L01ha2VmaWxlCkBAIC0xMyw2ICsxMyw3IEBACiBvYmotJChDT05GSUdfUENJKQkJKz0gcGNpLXF1aXJrcy5vCiAKIG9iai0kKENPTkZJR19VU0JfRUhDSV9IQ0QpCSs9IGVoY2ktaGNkLm8KK29iai0kKENPTkZJR19VU0JfT1hVMjEwSFBfSENEKQkrPSBveHUyMTBocC1oY2Qubwogb2JqLSQoQ09ORklHX1VTQl9JU1AxMTZYX0hDRCkJKz0gaXNwMTE2eC1oY2Qubwogb2JqLSQoQ09ORklHX1VTQl9PSENJX0hDRCkJKz0gb2hjaS1oY2Qubwogb2JqLSQoQ09ORklHX1VTQl9VSENJX0hDRCkJKz0gdWhjaS1oY2QubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWRiZy5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWRiZy5jCmluZGV4IDBjYjUzY2EuLjdmNGFjZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1kYmcuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktZGJnLmMKQEAgLTQ1NSw5ICs0NTUsNyBAQAogCQkJCShzY3JhdGNoID4+IDE2KSAmIDB4N2ZmZiwKIAkJCQlzY3JhdGNoLAogCQkJCXRkLT51cmIpOwotCQlpZiAodGVtcCA8IDApCi0JCQl0ZW1wID0gMDsKLQkJZWxzZSBpZiAoc2l6ZSA8IHRlbXApCisJCWlmIChzaXplIDwgdGVtcCkKIAkJCXRlbXAgPSBzaXplOwogCQlzaXplIC09IHRlbXA7CiAJCW5leHQgKz0gdGVtcDsKQEAgLTQ2Niw5ICs0NjQsNyBAQAogCX0KIAogCXRlbXAgPSBzbnByaW50ZiAobmV4dCwgc2l6ZSwgIlxuIik7Ci0JaWYgKHRlbXAgPCAwKQotCQl0ZW1wID0gMDsKLQllbHNlIGlmIChzaXplIDwgdGVtcCkKKwlpZiAoc2l6ZSA8IHRlbXApCiAJCXRlbXAgPSBzaXplOwogCXNpemUgLT0gdGVtcDsKIAluZXh0ICs9IHRlbXA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaHViLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaHViLmMKaW5kZXggMjE4Zjk2Ni4uOTdhNTNhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWh1Yi5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1odWIuYwpAQCAtMTk0LDYgKzE5NCw3IEBACiAJdTMyCQkJdGVtcDsKIAl1MzIJCQlwb3dlcl9va2F5OwogCWludAkJCWk7CisJdTgJCQlyZXN1bWVfbmVlZGVkID0gMDsKIAogCWlmICh0aW1lX2JlZm9yZSAoamlmZmllcywgZWhjaS0+bmV4dF9zdGF0ZWNoYW5nZSkpCiAJCW1zbGVlcCg1KTsKQEAgLTIyOCw3ICsyMjksOSBAQAogCiAJLyogU29tZSBjb250cm9sbGVyL2Zpcm13YXJlIGNvbWJpbmF0aW9ucyBuZWVkIGEgZGVsYXkgZHVyaW5nIHdoaWNoCiAJICogdGhleSBzZXQgdXAgdGhlIHBvcnQgc3RhdHVzZXMuICBTZWUgQnVnemlsbGEgIzgxOTAuICovCi0JbWRlbGF5KDgpOworCXNwaW5fdW5sb2NrX2lycSgmZWhjaS0+bG9jayk7CisJbXNsZWVwKDgpOworCXNwaW5fbG9ja19pcnEoJmVoY2ktPmxvY2spOwogCiAJLyogbWFudWFsbHkgcmVzdW1lIHRoZSBwb3J0cyB3ZSBzdXNwZW5kZWQgZHVyaW5nIGJ1c19zdXNwZW5kKCkgKi8KIAlpID0gSENTX05fUE9SVFMgKGVoY2ktPmhjc19wYXJhbXMpOwpAQCAtMjM2LDEyICsyMzksMjEgQEAKIAkJdGVtcCA9IGVoY2lfcmVhZGwoZWhjaSwgJmVoY2ktPnJlZ3MtPnBvcnRfc3RhdHVzIFtpXSk7CiAJCXRlbXAgJj0gfihQT1JUX1JXQ19CSVRTIHwgUE9SVF9XQUtFX0JJVFMpOwogCQlpZiAodGVzdF9iaXQoaSwgJmVoY2ktPmJ1c19zdXNwZW5kZWQpICYmCi0JCQkJKHRlbXAgJiBQT1JUX1NVU1BFTkQpKQorCQkJCSh0ZW1wICYgUE9SVF9TVVNQRU5EKSkgewogCQkJdGVtcCB8PSBQT1JUX1JFU1VNRTsKKwkJCXJlc3VtZV9uZWVkZWQgPSAxOworCQl9CiAJCWVoY2lfd3JpdGVsKGVoY2ksIHRlbXAsICZlaGNpLT5yZWdzLT5wb3J0X3N0YXR1cyBbaV0pOwogCX0KKworCS8qIG1zbGVlcCBmb3IgMjBtcyBvbmx5IGlmIGNvZGUgaXMgdHJ5aW5nIHRvIHJlc3VtZSBwb3J0ICovCisJaWYgKHJlc3VtZV9uZWVkZWQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZlaGNpLT5sb2NrKTsKKwkJbXNsZWVwKDIwKTsKKwkJc3Bpbl9sb2NrX2lycSgmZWhjaS0+bG9jayk7CisJfQorCiAJaSA9IEhDU19OX1BPUlRTIChlaGNpLT5oY3NfcGFyYW1zKTsKLQltZGVsYXkgKDIwKTsKIAl3aGlsZSAoaS0tKSB7CiAJCXRlbXAgPSBlaGNpX3JlYWRsKGVoY2ksICZlaGNpLT5yZWdzLT5wb3J0X3N0YXR1cyBbaV0pOwogCQlpZiAodGVzdF9iaXQoaSwgJmVoY2ktPmJ1c19zdXNwZW5kZWQpICYmCkBAIC00MjIsOCArNDM0LDE1IEBACiAJCXBvcnRfc3RhdHVzICY9IH5QT1JUX1JXQ19CSVRTOwogCQllaGNpX3dyaXRlbChlaGNpLCBwb3J0X3N0YXR1cywgc3RhdHVzX3JlZyk7CiAKLQl9IGVsc2UKKwkJLyogZW5zdXJlIDQ0MEVQWCBvaGNpIGNvbnRyb2xsZXIgc3RhdGUgaXMgb3BlcmF0aW9uYWwgKi8KKwkJaWYgKGVoY2ktPmhhc19hbWNjX3VzYjIzKQorCQkJc2V0X29oY2lfaGNmcyhlaGNpLCAxKTsKKwl9IGVsc2UgewogCQllaGNpX2RiZyAoZWhjaSwgInBvcnQgJWQgaGlnaCBzcGVlZFxuIiwgaW5kZXggKyAxKTsKKwkJLyogZW5zdXJlIDQ0MEVQeCBvaGNpIGNvbnRyb2xsZXIgc3RhdGUgaXMgc3VzcGVuZGVkICovCisJCWlmIChlaGNpLT5oYXNfYW1jY191c2IyMykKKwkJCXNldF9vaGNpX2hjZnMoZWhjaSwgMCk7CisJfQogCiAJcmV0dXJuIHBvcnRfc3RhdHVzOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXBjaS5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXBjaS5jCmluZGV4IDM2ODY0ZjkuLmJkYzZlODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1wY2kuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcGNpLmMKQEAgLTIxOSwxNSArMjE5LDE5IEBACiAJLyogU2VyaWFsIEJ1cyBSZWxlYXNlIE51bWJlciBpcyBhdCBQQ0kgMHg2MCBvZmZzZXQgKi8KIAlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDYwLCAmZWhjaS0+c2Jybik7CiAKLQkvKiBXb3JrYXJvdW5kIGN1cnJlbnQgUENJIGluaXQgZ2xpdGNoOiAgd2FrZXVwIGJpdHMgYXJlbid0Ci0JICogYmVpbmcgc2V0IGZyb20gUENJIFBNIGNhcGFiaWxpdHkuCisJLyogS2VlcCB0aGlzIGFyb3VuZCBmb3IgYSB3aGlsZSBqdXN0IGluIGNhc2Ugc29tZSBFSENJCisJICogaW1wbGVtZW50YXRpb24gdXNlcyBsZWdhY3kgUENJIFBNIHN1cHBvcnQuICBUaGlzIHRlc3QKKwkgKiBjYW4gYmUgcmVtb3ZlZCBvbiAxNyBEZWMgMjAwOSBpZiB0aGUgZGV2X3dhcm4oKSBoYXNuJ3QKKwkgKiBiZWVuIHRyaWdnZXJlZCBieSB0aGVuLgogCSAqLwogCWlmICghZGV2aWNlX2Nhbl93YWtldXAoJnBkZXYtPmRldikpIHsKIAkJdTE2CXBvcnRfd2FrZTsKIAogCQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCAweDYyLCAmcG9ydF93YWtlKTsKLQkJaWYgKHBvcnRfd2FrZSAmIDB4MDAwMSkKKwkJaWYgKHBvcnRfd2FrZSAmIDB4MDAwMSkgeworCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIkVuYWJsaW5nIGxlZ2FjeSBQQ0kgUE1cbiIpOwogCQkJZGV2aWNlX2luaXRfd2FrZXVwKCZwZGV2LT5kZXYsIDEpOworCQl9CiAJfQogCiAjaWZkZWYJQ09ORklHX1VTQl9TVVNQRU5ECkBAIC00MjgsNiArNDMyLDggQEAKIAogI2lmZGVmCUNPTkZJR19QTQogCS5zdXNwZW5kID0JdXNiX2hjZF9wY2lfc3VzcGVuZCwKKwkuc3VzcGVuZF9sYXRlID0JdXNiX2hjZF9wY2lfc3VzcGVuZF9sYXRlLAorCS5yZXN1bWVfZWFybHkgPQl1c2JfaGNkX3BjaV9yZXN1bWVfZWFybHksCiAJLnJlc3VtZSA9CXVzYl9oY2RfcGNpX3Jlc3VtZSwKICNlbmRpZgogCS5zaHV0ZG93biA9IAl1c2JfaGNkX3BjaV9zaHV0ZG93biwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1wcGMtb2YuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1wcGMtb2YuYwppbmRleCBiMDE4ZGVlLi5lZjczMmI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcHBjLW9mLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXBwYy1vZi5jCkBAIC0xMDcsMTEgKzEwNywxMyBAQAogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4gPSBvcC0+bm9kZTsKIAlzdHJ1Y3QgdXNiX2hjZCAqaGNkOwotCXN0cnVjdCBlaGNpX2hjZAkqZWhjaTsKKwlzdHJ1Y3QgZWhjaV9oY2QJKmVoY2kgPSBOVUxMOwogCXN0cnVjdCByZXNvdXJjZSByZXM7CiAJaW50IGlycTsKIAlpbnQgcnY7CiAKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCiAJaWYgKHVzYl9kaXNhYmxlZCgpKQogCQlyZXR1cm4gLUVOT0RFVjsKIApAQCAtMTQ5LDYgKzE1MSwyMCBAQAogCX0KIAogCWVoY2kgPSBoY2RfdG9fZWhjaShoY2QpOworCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImlibSx1c2Itb2hjaS00NDBlcHgiKTsKKwlpZiAobnAgIT0gTlVMTCkgeworCQkvKiBjbGFpbSB3ZSByZWFsbHkgYWZmZWN0ZWQgYnkgdXNiMjMgZXJyYXR1bSAqLworCQlpZiAoIW9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyZXMpKQorCQkJZWhjaS0+b2hjaV9oY2N0cmxfcmVnID0gaW9yZW1hcChyZXMuc3RhcnQgKworCQkJCQlPSENJX0hDQ1RSTF9PRkZTRVQsIE9IQ0lfSENDVFJMX0xFTik7CisJCWVsc2UKKwkJCXByX2RlYnVnKF9fRklMRV9fICI6IG5vIG9oY2kgb2Zmc2V0IGluIGZkdFxuIik7CisJCWlmICghZWhjaS0+b2hjaV9oY2N0cmxfcmVnKSB7CisJCQlwcl9kZWJ1ZyhfX0ZJTEVfXyAiOiBpb3JlbWFwIGZvciBvaGNpIGhjY3RybCBmYWlsZWRcbiIpOworCQl9IGVsc2UgeworCQkJZWhjaS0+aGFzX2FtY2NfdXNiMjMgPSAxOworCQl9CisJfQogCiAJaWYgKG9mX2dldF9wcm9wZXJ0eShkbiwgImJpZy1lbmRpYW4iLCBOVUxMKSkgewogCQllaGNpLT5iaWdfZW5kaWFuX21taW8gPSAxOwpAQCAtMTgxLDYgKzE5Nyw5IEBACiAJaXJxX2Rpc3Bvc2VfbWFwcGluZyhpcnEpOwogZXJyX2lycToKIAlyZWxlYXNlX21lbV9yZWdpb24oaGNkLT5yc3JjX3N0YXJ0LCBoY2QtPnJzcmNfbGVuKTsKKworCWlmIChlaGNpLT5oYXNfYW1jY191c2IyMykKKwkJaW91bm1hcChlaGNpLT5vaGNpX2hjY3RybF9yZWcpOwogZXJyX3JtcjoKIAl1c2JfcHV0X2hjZChoY2QpOwogCkBAIC0xOTEsNiArMjEwLDExIEBACiBzdGF0aWMgaW50IGVoY2lfaGNkX3BwY19vZl9yZW1vdmUoc3RydWN0IG9mX2RldmljZSAqb3ApCiB7CiAJc3RydWN0IHVzYl9oY2QgKmhjZCA9IGRldl9nZXRfZHJ2ZGF0YSgmb3AtPmRldik7CisJc3RydWN0IGVoY2lfaGNkICplaGNpID0gaGNkX3RvX2VoY2koaGNkKTsKKworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJc3RydWN0IHJlc291cmNlIHJlczsKKwogCWRldl9zZXRfZHJ2ZGF0YSgmb3AtPmRldiwgTlVMTCk7CiAKIAlkZXZfZGJnKCZvcC0+ZGV2LCAic3RvcHBpbmcgUFBDLU9GIFVTQiBDb250cm9sbGVyXG4iKTsKQEAgLTIwMSw2ICsyMjUsMjUgQEAKIAlpcnFfZGlzcG9zZV9tYXBwaW5nKGhjZC0+aXJxKTsKIAlyZWxlYXNlX21lbV9yZWdpb24oaGNkLT5yc3JjX3N0YXJ0LCBoY2QtPnJzcmNfbGVuKTsKIAorCS8qIHVzZSByZXF1ZXN0X21lbV9yZWdpb24gdG8gdGVzdCBpZiB0aGUgb2hjaSBkcml2ZXIgaXMgbG9hZGVkLiAgaWYgc28KKwkgKiBlbnN1cmUgdGhlIG9oY2kgY29yZSBpcyBvcGVyYXRpb25hbC4KKwkgKi8KKwlpZiAoZWhjaS0+aGFzX2FtY2NfdXNiMjMpIHsKKwkJbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiaWJtLHVzYi1vaGNpLTQ0MGVweCIpOworCQlpZiAobnAgIT0gTlVMTCkgeworCQkJaWYgKCFvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcmVzKSkKKwkJCQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyZXMuc3RhcnQsCisJCQkJCQkJICAgIDB4NCwgaGNkX25hbWUpKQorCQkJCQlzZXRfb2hjaV9oY2ZzKGVoY2ksIDEpOworCQkJCWVsc2UKKwkJCQkJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy5zdGFydCwgMHg0KTsKKwkJCWVsc2UKKwkJCQlwcl9kZWJ1ZyhfX0ZJTEVfXyAiOiBubyBvaGNpIG9mZnNldCBpbiBmZHRcbiIpOworCQkJb2Zfbm9kZV9wdXQobnApOworCQl9CisKKwkJaW91bm1hcChlaGNpLT5vaGNpX2hjY3RybF9yZWcpOworCX0KIAl1c2JfcHV0X2hjZChoY2QpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2kuaCBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS5oCmluZGV4IGM3ZDRiNWEuLmZiNzA1NGNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2kuaAorKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2kuaApAQCAtMTIwLDYgKzEyMCwxNiBAQAogCXVuc2lnbmVkCQloYXNfZnNsX3BvcnRfYnVnOjE7IC8qIEZyZWVTY2FsZSAqLwogCXVuc2lnbmVkCQliaWdfZW5kaWFuX21taW86MTsKIAl1bnNpZ25lZAkJYmlnX2VuZGlhbl9kZXNjOjE7CisJdW5zaWduZWQJCWhhc19hbWNjX3VzYjIzOjE7CisKKwkvKiByZXF1aXJlZCBmb3IgdXNiMzIgcXVpcmsgKi8KKwkjZGVmaW5lIE9IQ0lfQ1RSTF9IQ0ZTICAgICAgICAgICgzIDw8IDYpCisJI2RlZmluZSBPSENJX1VTQl9PUEVSICAgICAgICAgICAoMiA8PCA2KQorCSNkZWZpbmUgT0hDSV9VU0JfU1VTUEVORCAgICAgICAgKDMgPDwgNikKKworCSNkZWZpbmUgT0hDSV9IQ0NUUkxfT0ZGU0VUICAgICAgMHg0CisJI2RlZmluZSBPSENJX0hDQ1RSTF9MRU4gICAgICAgICAweDQKKwlfX2hjMzIJCQkqb2hjaV9oY2N0cmxfcmVnOwogCiAJdTgJCQlzYnJuOwkJLyogcGFja2VkIHJlbGVhc2UgbnVtYmVyICovCiAKQEAgLTYzNiw2ICs2NDYsMzAgQEAKICNlbmRpZgogfQogCisvKgorICogT24gY2VydGFpbiBwcGMtNDR4IFNvQyB0aGVyZSBpcyBhIEhXIGlzc3VlLCB0aGF0IGNvdWxkIG9ubHkgd29ya2VkIGFyb3VuZCB3aXRoCisgKiBleHBsaWNpdCBzdXNwZW5kL29wZXJhdGUgb2YgT0hDSS4gVGhpcyBmdW5jdGlvbiBoZXJlYnkgbWFrZXMgc2Vuc2Ugb25seSBvbiB0aGF0IGFyY2guCisgKiBPdGhlciBjb21tb24gYml0cyBhcmUgZGVwZW5kYW50IG9uIGhhc19hbWNjX3VzYjIzIHF1aXJrIGZsYWcuCisgKi8KKyNpZmRlZiBDT05GSUdfNDR4CitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X29oY2lfaGNmcyhzdHJ1Y3QgZWhjaV9oY2QgKmVoY2ksIGludCBvcGVyYXRpb25hbCkKK3sKKwl1MzIgaGNfY29udHJvbDsKKworCWhjX2NvbnRyb2wgPSAocmVhZGxfYmUoZWhjaS0+b2hjaV9oY2N0cmxfcmVnKSAmIH5PSENJX0NUUkxfSENGUyk7CisJaWYgKG9wZXJhdGlvbmFsKQorCQloY19jb250cm9sIHw9IE9IQ0lfVVNCX09QRVI7CisJZWxzZQorCQloY19jb250cm9sIHw9IE9IQ0lfVVNCX1NVU1BFTkQ7CisKKwl3cml0ZWxfYmUoaGNfY29udHJvbCwgZWhjaS0+b2hjaV9oY2N0cmxfcmVnKTsKKwkodm9pZCkgcmVhZGxfYmUoZWhjaS0+b2hjaV9oY2N0cmxfcmVnKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X29oY2lfaGNmcyhzdHJ1Y3QgZWhjaV9oY2QgKmVoY2ksIGludCBvcGVyYXRpb25hbCkKK3sgfQorI2VuZGlmCisKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2lzcDE3NjAtaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2lzcDE3NjAtaGNkLmMKaW5kZXggODAxN2YxYy4uYjg5OWYxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9pc3AxNzYwLWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTc2MC1oY2QuYwpAQCAtNDM1LDE0ICs0MzUsMTMgQEAKIAogCS8qCiAJICogUE9SVCAxIENvbnRyb2wgcmVnaXN0ZXIgb2YgdGhlIElTUDE3NjAgaXMgdGhlIE9URyBjb250cm9sCi0JICogcmVnaXN0ZXIgb24gSVNQMTc2MS4KKwkgKiByZWdpc3RlciBvbiBJU1AxNzYxLiBTaW5jZSB0aGVyZSBpcyBubyBPVEcgb3IgZGV2aWNlIGNvbnRyb2xsZXIKKwkgKiBzdXBwb3J0IGluIHRoaXMgZHJpdmVyLCB3ZSB1c2UgcG9ydCAxIGFzIGEgIm5vcm1hbCIgVVNCIGhvc3QgcG9ydCBvbgorCSAqIGJvdGggY2hpcHMuCiAJICovCi0JaWYgKCEocHJpdi0+ZGV2ZmxhZ3MgJiBJU1AxNzYwX0ZMQUdfSVNQMTc2MSkgJiYKLQkgICAgIShwcml2LT5kZXZmbGFncyAmIElTUDE3NjBfRkxBR19QT1JUMV9ESVMpKSB7Ci0JCWlzcDE3NjBfd3JpdGVsKFBPUlQxX1BPV0VSIHwgUE9SVDFfSU5JVDIsCi0JCQkgICAgICAgaGNkLT5yZWdzICsgSENfUE9SVDFfQ1RSTCk7Ci0JCW1kZWxheSgxMCk7Ci0JfQorCWlzcDE3NjBfd3JpdGVsKFBPUlQxX1BPV0VSIHwgUE9SVDFfSU5JVDIsCisJCSAgICAgICBoY2QtPnJlZ3MgKyBIQ19QT1JUMV9DVFJMKTsKKwltZGVsYXkoMTApOwogCiAJcHJpdi0+aGNzX3BhcmFtcyA9IGlzcDE3NjBfcmVhZGwoaGNkLT5yZWdzICsgSENfSENTUEFSQU1TKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9pc3AxNzYwLWhjZC5oIGIvZHJpdmVycy91c2IvaG9zdC9pc3AxNzYwLWhjZC5oCmluZGV4IDQzNzcyNzcuLmE5ZGFlYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTc2MC1oY2QuaAorKysgYi9kcml2ZXJzL3VzYi9ob3N0L2lzcDE3NjAtaGNkLmgKQEAgLTEzNSw3ICsxMzUsNiBAQAogICogaW5kaWNhdGUgdGhlIG1vc3QgImF0eXBpY2FsIiBjYXNlLCBzbyB0aGF0IGEgZGV2ZmxhZ3Mgb2YgMCBpcwogICogYSBzYW5lIGRlZmF1bHQgY29uZmlndXJhdGlvbi4KICAqLwotI2RlZmluZSBJU1AxNzYwX0ZMQUdfUE9SVDFfRElTCQkweDAwMDAwMDAxIC8qIFBvcnQgMSBkaXNhYmxlZCAqLwogI2RlZmluZSBJU1AxNzYwX0ZMQUdfQlVTX1dJRFRIXzE2CTB4MDAwMDAwMDIgLyogMTYtYml0IGRhdGEgYnVzIHdpZHRoICovCiAjZGVmaW5lIElTUDE3NjBfRkxBR19PVEdfRU4JCTB4MDAwMDAwMDQgLyogUG9ydCAxIHN1cHBvcnRzIE9URyAqLwogI2RlZmluZSBJU1AxNzYwX0ZMQUdfQU5BTE9HX09DCQkweDAwMDAwMDA4IC8qIEFuYWxvZyBvdmVyY3VycmVudCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9pc3AxNzYwLWlmLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2lzcDE3NjAtaWYuYwppbmRleCBiODdjYTdjLi40Y2Y3Y2E0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2lzcDE3NjAtaWYuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2lzcDE3NjAtaWYuYwpAQCAtNjAsOSArNjAsNiBAQAogCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShkcCwgIm54cCx1c2ItaXNwMTc2MSIpKQogCQlkZXZmbGFncyB8PSBJU1AxNzYwX0ZMQUdfSVNQMTc2MTsKIAotCWlmIChvZl9nZXRfcHJvcGVydHkoZHAsICJwb3J0MS1kaXNhYmxlIiwgTlVMTCkgIT0gTlVMTCkKLQkJZGV2ZmxhZ3MgfD0gSVNQMTc2MF9GTEFHX1BPUlQxX0RJUzsKLQogCS8qIFNvbWUgc3lzdGVtcyB3aXJlIHVwIG9ubHkgMTYgb2YgdGhlIDMyIGRhdGEgbGluZXMgKi8KIAlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAiYnVzLXdpZHRoIiwgTlVMTCk7CiAJaWYgKHByb3AgJiYgKnByb3AgPT0gMTYpCkBAIC0xMjksMjMgKzEyNiwyMyBAQAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfUENJCi1zdGF0aWMgdTMyIG54cF9wY2lfaW9fYmFzZTsKLXN0YXRpYyB1MzIgaW9sZW5ndGg7Ci1zdGF0aWMgdTMyIHBjaV9tZW1fcGh5MDsKLXN0YXRpYyB1MzIgbGVuZ3RoOwotc3RhdGljIHU4IF9faW9tZW0gKmNoaXBfYWRkcjsKLXN0YXRpYyB1OCBfX2lvbWVtICppb2Jhc2U7Ci0KIHN0YXRpYyBpbnQgX19kZXZpbml0IGlzcDE3NjFfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsCiAJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKIAl1OCBsYXRlbmN5LCBsaW1pdDsKIAlfX3UzMiByZWdfZGF0YTsKIAlpbnQgcmV0cnlfY291bnQ7Ci0JaW50IGxlbmd0aDsKLQlpbnQgc3RhdHVzID0gMTsKIAlzdHJ1Y3QgdXNiX2hjZCAqaGNkOwogCXVuc2lnbmVkIGludCBkZXZmbGFncyA9IDA7CisJaW50IHJldF9zdGF0dXMgPSAwOworCisJcmVzb3VyY2Vfc2l6ZV90IHBjaV9tZW1fcGh5MDsKKwlyZXNvdXJjZV9zaXplX3QgbWVtbGVuZ3RoOworCisJdTggX19pb21lbSAqY2hpcF9hZGRyOworCXU4IF9faW9tZW0gKmlvYmFzZTsKKwlyZXNvdXJjZV9zaXplX3QgbnhwX3BjaV9pb19iYXNlOworCXJlc291cmNlX3NpemVfdCBpb2xlbmd0aDsKIAogCWlmICh1c2JfZGlzYWJsZWQoKSkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0xNjgsMjYgKzE2NSwzMCBAQAogCWlvYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShueHBfcGNpX2lvX2Jhc2UsIGlvbGVuZ3RoKTsKIAlpZiAoIWlvYmFzZSkgewogCQlwcmludGsoS0VSTl9FUlIgImlvcmVtYXAgIzFcbiIpOwotCQlyZWxlYXNlX21lbV9yZWdpb24obnhwX3BjaV9pb19iYXNlLCBpb2xlbmd0aCk7Ci0JCXJldHVybiAtRU5PTUVNOworCQlyZXRfc3RhdHVzID0gLUVOT01FTTsKKwkJZ290byBjbGVhbnVwMTsKIAl9CiAJLyogR3JhYiB0aGUgUExYIFBDSSBzaGFyZWQgbWVtb3J5IG9mIHRoZSBJU1AgMTc2MSB3ZSBuZWVkICAqLwogCXBjaV9tZW1fcGh5MCA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDMpOwotCWxlbmd0aCA9IHBjaV9yZXNvdXJjZV9sZW4oZGV2LCAzKTsKLQotCWlmIChsZW5ndGggPCAweGZmZmYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJtZW1vcnkgbGVuZ3RoIGZvciB0aGlzIHJlc291cmNlIGlzIGxlc3MgdGhhbiAiCi0JCQkJInJlcXVpcmVkXG4iKTsKLQkJcmVsZWFzZV9tZW1fcmVnaW9uKG54cF9wY2lfaW9fYmFzZSwgaW9sZW5ndGgpOwotCQlpb3VubWFwKGlvYmFzZSk7Ci0JCXJldHVybiAgLUVOT01FTTsKKwltZW1sZW5ndGggPSBwY2lfcmVzb3VyY2VfbGVuKGRldiwgMyk7CisJaWYgKG1lbWxlbmd0aCA8IDB4ZmZmZikgeworCQlwcmludGsoS0VSTl9FUlIgIm1lbW9yeSBsZW5ndGggZm9yIHRoaXMgcmVzb3VyY2UgaXMgd3JvbmdcbiIpOworCQlyZXRfc3RhdHVzID0gLUVOT01FTTsKKwkJZ290byBjbGVhbnVwMjsKIAl9CiAKLQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihwY2lfbWVtX3BoeTAsIGxlbmd0aCwgIklTUC1QQ0kiKSkgeworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHBjaV9tZW1fcGh5MCwgbWVtbGVuZ3RoLCAiSVNQLVBDSSIpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiaG9zdCBjb250cm9sbGVyIGFscmVhZHkgaW4gdXNlXG4iKTsKLQkJcmVsZWFzZV9tZW1fcmVnaW9uKG54cF9wY2lfaW9fYmFzZSwgaW9sZW5ndGgpOwotCQlpb3VubWFwKGlvYmFzZSk7Ci0JCXJldHVybiAtRUJVU1k7CisJCXJldF9zdGF0dXMgPSAtRUJVU1k7CisJCWdvdG8gY2xlYW51cDI7CisJfQorCisJLyogbWFwIGF2YWlsYWJsZSBtZW1vcnkgKi8KKwljaGlwX2FkZHIgPSBpb3JlbWFwX25vY2FjaGUocGNpX21lbV9waHkwLG1lbWxlbmd0aCk7CisJaWYgKCFjaGlwX2FkZHIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciBpb3JlbWFwIGZhaWxlZFxuIik7CisJCXJldF9zdGF0dXMgPSAtRU5PTUVNOworCQlnb3RvIGNsZWFudXAzOwogCX0KIAogCS8qIGJhZCBwY2kgbGF0ZW5jaWVzIGNhbiBjb250cmlidXRlIHRvIG92ZXJydW5zICovCkBAIC0yMTAsMzkgKzIxMSw1NCBAQAogCQkgKiAqLwogCQl3cml0ZWwoMHhmYWNlLCBjaGlwX2FkZHIgKyBIQ19TQ1JBVENIX1JFRyk7CiAJCXVkZWxheSgxMDApOwotCQlyZWdfZGF0YSA9IHJlYWRsKGNoaXBfYWRkciArIEhDX1NDUkFUQ0hfUkVHKTsKKwkJcmVnX2RhdGEgPSByZWFkbChjaGlwX2FkZHIgKyBIQ19TQ1JBVENIX1JFRykgJiAweDAwMDBmZmZmOwogCQlyZXRyeV9jb3VudC0tOwogCX0KIAorCWlvdW5tYXAoY2hpcF9hZGRyKTsKKwogCS8qIEhvc3QgQ29udHJvbGxlciBwcmVzZW5jZSBpcyBkZXRlY3RlZCBieSB3cml0aW5nIHRvIHNjcmF0Y2ggcmVnaXN0ZXIKIAkgKiBhbmQgcmVhZGluZyBiYWNrIGFuZCBjaGVja2luZyB0aGUgY29udGVudHMgYXJlIHNhbWUgb3Igbm90CiAJICovCiAJaWYgKHJlZ19kYXRhICE9IDB4RkFDRSkgewogCQlkZXZfZXJyKCZkZXYtPmRldiwgInNjcmF0Y2ggcmVnaXN0ZXIgbWlzbWF0Y2ggJXhcbiIsIHJlZ19kYXRhKTsKLQkJZ290byBjbGVhbjsKKwkJcmV0X3N0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gY2xlYW51cDM7CiAJfQogCiAJcGNpX3NldF9tYXN0ZXIoZGV2KTsKIAotCXN0YXR1cyA9IHJlYWRsKGlvYmFzZSArIDB4NjgpOwotCXN0YXR1cyB8PSAweDkwMDsKLQl3cml0ZWwoc3RhdHVzLCBpb2Jhc2UgKyAweDY4KTsKKwkvKiBjb25maWd1cmUgUExYIFBDSSBjaGlwIHRvIHBhc3MgaW50ZXJydXB0cyAqLworI2RlZmluZSBQTFhfSU5UX0NTUl9SRUcgMHg2OAorCXJlZ19kYXRhID0gcmVhZGwoaW9iYXNlICsgUExYX0lOVF9DU1JfUkVHKTsKKwlyZWdfZGF0YSB8PSAweDkwMDsKKwl3cml0ZWwocmVnX2RhdGEsIGlvYmFzZSArIFBMWF9JTlRfQ1NSX1JFRyk7CiAKIAlkZXYtPmRldi5kbWFfbWFzayA9IE5VTEw7Ci0JaGNkID0gaXNwMTc2MF9yZWdpc3RlcihwY2lfbWVtX3BoeTAsIGxlbmd0aCwgZGV2LT5pcnEsCisJaGNkID0gaXNwMTc2MF9yZWdpc3RlcihwY2lfbWVtX3BoeTAsIG1lbWxlbmd0aCwgZGV2LT5pcnEsCiAJCUlSUUZfU0hBUkVEIHwgSVJRRl9ESVNBQkxFRCwgJmRldi0+ZGV2LCBkZXZfbmFtZSgmZGV2LT5kZXYpLAogCQlkZXZmbGFncyk7Ci0JaWYgKCFJU19FUlIoaGNkKSkgewotCQlwY2lfc2V0X2RydmRhdGEoZGV2LCBoY2QpOwotCQlyZXR1cm4gMDsKKwlpZiAoSVNfRVJSKGhjZCkpIHsKKwkJcmV0X3N0YXR1cyA9IC1FTk9ERVY7CisJCWdvdG8gY2xlYW51cDM7CiAJfQotY2xlYW46Ci0Jc3RhdHVzID0gLUVOT0RFVjsKKworCS8qIGRvbmUgd2l0aCBQTFggSU8gYWNjZXNzICovCiAJaW91bm1hcChpb2Jhc2UpOwotCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfbWVtX3BoeTAsIGxlbmd0aCk7CiAJcmVsZWFzZV9tZW1fcmVnaW9uKG54cF9wY2lfaW9fYmFzZSwgaW9sZW5ndGgpOwotCXJldHVybiBzdGF0dXM7CisKKwlwY2lfc2V0X2RydmRhdGEoZGV2LCBoY2QpOworCXJldHVybiAwOworCitjbGVhbnVwMzoKKwlyZWxlYXNlX21lbV9yZWdpb24ocGNpX21lbV9waHkwLCBtZW1sZW5ndGgpOworY2xlYW51cDI6CisJaW91bm1hcChpb2Jhc2UpOworY2xlYW51cDE6CisJcmVsZWFzZV9tZW1fcmVnaW9uKG54cF9wY2lfaW9fYmFzZSwgaW9sZW5ndGgpOworCXJldHVybiByZXRfc3RhdHVzOwogfQorCiBzdGF0aWMgdm9pZCBpc3AxNzYxX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgdXNiX2hjZCAqaGNkOwpAQCAtMjU1LDEyICsyNzEsNiBAQAogCXVzYl9wdXRfaGNkKGhjZCk7CiAKIAlwY2lfZGlzYWJsZV9kZXZpY2UoZGV2KTsKLQotCWlvdW5tYXAoaW9iYXNlKTsKLQlpb3VubWFwKGNoaXBfYWRkcik7Ci0KLQlyZWxlYXNlX21lbV9yZWdpb24obnhwX3BjaV9pb19iYXNlLCBpb2xlbmd0aCk7Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKHBjaV9tZW1fcGh5MCwgbGVuZ3RoKTsKIH0KIAogc3RhdGljIHZvaWQgaXNwMTc2MV9wY2lfc2h1dGRvd24oc3RydWN0IHBjaV9kZXYgKmRldikKQEAgLTI2OCwxMiArMjc4LDE2IEBACiAJcHJpbnRrKEtFUk5fRVJSICJpcHMxNzYxX3BjaV9zaHV0ZG93blxuIik7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBpc3AxNzYwX3BseCBbXSA9IHsgewotCS8qIGhhbmRsZSBhbnkgVVNCIDIuMCBFSENJIGNvbnRyb2xsZXIgKi8KLQlQQ0lfREVWSUNFX0NMQVNTKCgoUENJX0NMQVNTX0JSSURHRV9PVEhFUiA8PCA4KSB8ICgweDA2IDw8IDE2KSksIH4wKSwKLQkJLmRyaXZlcl9kYXRhID0gMCwKLX0sCi17IC8qIGVuZDogYWxsIHplcm9lcyAqLyB9CitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgaXNwMTc2MF9wbHggW10gPSB7CisJeworCQkuY2xhc3MgICAgICAgICAgPSBQQ0lfQ0xBU1NfQlJJREdFX09USEVSIDw8IDgsCisJCS5jbGFzc19tYXNrICAgICA9IH4wLAorCQkudmVuZG9yCQk9IFBDSV9WRU5ET1JfSURfUExYLAorCQkuZGV2aWNlCQk9IDB4NTQwNiwKKwkJLnN1YnZlbmRvcgk9IFBDSV9WRU5ET1JfSURfUExYLAorCQkuc3ViZGV2aWNlCT0gMHg5MDU0LAorCX0sCisJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGlzcDE3NjBfcGx4KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLWhjZC5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWhjZC5jCmluZGV4IDhhYTNmNDUuLjY1YTk2MDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1oY2QuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktaGNkLmMKQEAgLTU4OSwxMyArNTg5LDE1IEBACiAJCS8qIGFsc286IHBvd2VyL292ZXJjdXJyZW50IGZsYWdzIGluIHJvb3RodWIuYSAqLwogCX0KIAotCS8qIFJlc2V0IFVTQiBuZWFybHkgImJ5IHRoZSBib29rIi4gIFJlbW90ZVdha2V1cENvbm5lY3RlZCB3YXMKLQkgKiBzYXZlZCBpZiBib290IGZpcm13YXJlIChCSU9TL1NNTS8uLi4pIHRvbGQgdXMgaXQncyBjb25uZWN0ZWQsCi0JICogb3IgaWYgYnVzIGdsdWUgZGlkIHRoZSBzYW1lIChlLmcuIGZvciBQQ0kgYWRkLWluIGNhcmRzIHdpdGgKLQkgKiBQQ0kgUE0gc3VwcG9ydCkuCisJLyogUmVzZXQgVVNCIG5lYXJseSAiYnkgdGhlIGJvb2siLiAgUmVtb3RlV2FrZXVwQ29ubmVjdGVkIGhhcworCSAqIHRvIGJlIGNoZWNrZWQgaW4gY2FzZSBib290IGZpcm13YXJlIChCSU9TL1NNTS8uLi4pIGhhcyBzZXQgdXAKKwkgKiB3YWtldXAgaW4gYSB3YXkgdGhlIGJ1cyBpc24ndCBhd2FyZSBvZiAoZS5nLiwgbGVnYWN5IFBDSSBQTSkuCisJICogSWYgdGhlIGJ1cyBnbHVlIGRldGVjdGVkIHdha2V1cCBjYXBhYmlsaXR5IHRoZW4gaXQgc2hvdWxkCisJICogYWxyZWFkeSBiZSBlbmFibGVkLiAgRWl0aGVyIHdheSwgaWYgd2FrZXVwIHNob3VsZCBiZSBlbmFibGVkCisJICogYnV0IGlzbid0LCB3ZSdsbCBlbmFibGUgaXQgbm93LgogCSAqLwogCWlmICgob2hjaS0+aGNfY29udHJvbCAmIE9IQ0lfQ1RSTF9SV0MpICE9IDAKLQkJCSYmICFkZXZpY2VfbWF5X3dha2V1cChoY2QtPnNlbGYuY29udHJvbGxlcikpCisJCQkmJiAhZGV2aWNlX2Nhbl93YWtldXAoaGNkLT5zZWxmLmNvbnRyb2xsZXIpKQogCQlkZXZpY2VfaW5pdF93YWtldXAoaGNkLT5zZWxmLmNvbnRyb2xsZXIsIDEpOwogCiAJc3dpdGNoIChvaGNpLT5oY19jb250cm9sICYgT0hDSV9DVFJMX0hDRlMpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wY2kuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wY2kuYwppbmRleCBhOWMyYWUzLi44YjI4YWU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcGNpLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBjaS5jCkBAIC0zNTUsOSArMzU1LDkgQEAKIAogCQkvKiBSV0MgbWF5IG5vdCBiZSBzZXQgZm9yIGFkZC1pbiBQQ0kgY2FyZHMsIHNpbmNlIGJvb3QKIAkJICogZmlybXdhcmUgcHJvYmFibHkgaWdub3JlZCB0aGVtLiAgVGhpcyB0cmFuc2ZlcnMgUENJCi0JCSAqIFBNIHdha2V1cCBjYXBhYmlsaXRpZXMgKG9uY2UgdGhlIFBDSSBsYXllciBpcyBmaXhlZCkuCisJCSAqIFBNIHdha2V1cCBjYXBhYmlsaXRpZXMuCiAJCSAqLwotCQlpZiAoZGV2aWNlX21heV93YWtldXAoJnBkZXYtPmRldikpCisJCWlmIChkZXZpY2VfY2FuX3dha2V1cCgmcGRldi0+ZGV2KSkKIAkJCW9oY2ktPmhjX2NvbnRyb2wgfD0gT0hDSV9DVFJMX1JXQzsKIAl9CiAjZW5kaWYgLyogQ09ORklHX1BNICovCkBAIC00ODcsNiArNDg3LDggQEAKIAogI2lmZGVmCUNPTkZJR19QTQogCS5zdXNwZW5kID0JdXNiX2hjZF9wY2lfc3VzcGVuZCwKKwkuc3VzcGVuZF9sYXRlID0JdXNiX2hjZF9wY2lfc3VzcGVuZF9sYXRlLAorCS5yZXN1bWVfZWFybHkgPQl1c2JfaGNkX3BjaV9yZXN1bWVfZWFybHksCiAJLnJlc3VtZSA9CXVzYl9oY2RfcGNpX3Jlc3VtZSwKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcG54NDAwOC5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBueDQwMDguYwppbmRleCBlMzA2Y2E2Li4xMDBiZjNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcG54NDAwOC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wbng0MDA4LmMKQEAgLTEwNiw2NSArMTA2LDM0IEBACiAKIHN0YXRpYyBzdHJ1Y3QgY2xrICp1c2JfY2xrOwogCi1zdGF0aWMgaW50IGlzcDEzMDFfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKTsKLXN0YXRpYyBpbnQgaXNwMTMwMV9kZXRhY2goc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7Ci0KIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPQogICAgIHsgSVNQMTMwMV9JMkNfQUREUiwgSVNQMTMwMV9JMkNfQUREUiArIDEsIEkyQ19DTElFTlRfRU5EIH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgZHVtbXlfaTJjX2FkZHJsaXN0W10gPSB7IEkyQ19DTElFTlRfRU5EIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudF9hZGRyZXNzX2RhdGEgYWRkcl9kYXRhID0gewotCS5ub3JtYWxfaTJjID0gbm9ybWFsX2kyYywKLQkucHJvYmUgPSBkdW1teV9pMmNfYWRkcmxpc3QsCi0JLmlnbm9yZSA9IGR1bW15X2kyY19hZGRybGlzdCwKK3N0YXRpYyBpbnQgaXNwMTMwMV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpc3AxMzAxX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXJldHVybiAwOworfQorCitjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBpc3AxMzAxX2lkW10gPSB7CisJeyAiaXNwMTMwMV9wbngiLCAwIH0sCisJeyB9CiB9OwogCiBzdHJ1Y3QgaTJjX2RyaXZlciBpc3AxMzAxX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJpc3AxMzAxX3BueCIsCiAJfSwKLQkuYXR0YWNoX2FkYXB0ZXIgPSBpc3AxMzAxX3Byb2JlLAotCS5kZXRhY2hfY2xpZW50ID0gaXNwMTMwMV9kZXRhY2gsCisJLnByb2JlID0gaXNwMTMwMV9wcm9iZSwKKwkucmVtb3ZlID0gaXNwMTMwMV9yZW1vdmUsCisJLmlkX3RhYmxlID0gaXNwMTMwMV9pZCwKIH07CiAKLXN0YXRpYyBpbnQgaXNwMTMwMV9hdHRhY2goc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBpbnQgYWRkciwgaW50IGtpbmQpCi17Ci0Jc3RydWN0IGkyY19jbGllbnQgKmM7Ci0JaW50IGVycjsKLQotCWMgPSBremFsbG9jKHNpemVvZigqYyksIEdGUF9LRVJORUwpOwotCWlmICghYykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlzdHJsY3B5KGMtPm5hbWUsICJpc3AxMzAxX3BueCIsIEkyQ19OQU1FX1NJWkUpOwotCWMtPmZsYWdzID0gMDsKLQljLT5hZGRyID0gYWRkcjsKLQljLT5hZGFwdGVyID0gYWRhcDsKLQljLT5kcml2ZXIgPSAmaXNwMTMwMV9kcml2ZXI7Ci0KLQllcnIgPSBpMmNfYXR0YWNoX2NsaWVudChjKTsKLQlpZiAoZXJyKSB7Ci0JCWtmcmVlKGMpOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCWlzcDEzMDFfaTJjX2NsaWVudCA9IGM7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBpc3AxMzAxX3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKLXsKLQlyZXR1cm4gaTJjX3Byb2JlKGFkYXAsICZhZGRyX2RhdGEsIGlzcDEzMDFfYXR0YWNoKTsKLX0KLQotc3RhdGljIGludCBpc3AxMzAxX2RldGFjaChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCWkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7Ci0Ja2ZyZWUoaXNwMTMwMV9pMmNfY2xpZW50KTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHZvaWQgaTJjX3dyaXRlKHU4IGJ1ZiwgdTggc3ViYWRkcikKIHsKIAljaGFyIHRtcGJ1ZlsyXTsKQEAgLTMyOCw2ICsyOTcsOCBAQAogCXN0cnVjdCB1c2JfaGNkICpoY2QgPSAwOwogCXN0cnVjdCBvaGNpX2hjZCAqb2hjaTsKIAljb25zdCBzdHJ1Y3QgaGNfZHJpdmVyICpkcml2ZXIgPSAmb2hjaV9wbng0MDA4X2hjX2RyaXZlcjsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwOworCXN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpMmNfaW5mbzsKIAogCWludCByZXQgPSAwLCBpcnE7CiAKQEAgLTM1MSw5ICszMjIsMjAgQEAKIAogCXJldCA9IGkyY19hZGRfZHJpdmVyKCZpc3AxMzAxX2RyaXZlcik7CiAJaWYgKHJldCA8IDApIHsKLQkJZXJyKCJmYWlsZWQgdG8gY29ubmVjdCBJMkMgdG8gSVNQMTMwMSBVU0IgVHJhbnNjZWl2ZXIiKTsKKwkJZXJyKCJmYWlsZWQgdG8gYWRkIElTUDEzMDEgZHJpdmVyIik7CiAJCWdvdG8gb3V0OwogCX0KKwlpMmNfYWRhcCA9IGkyY19nZXRfYWRhcHRlcigyKTsKKwltZW1zZXQoJmkyY19pbmZvLCAwLCBzaXplb2Yoc3RydWN0IGkyY19ib2FyZF9pbmZvKSk7CisJc3RybGNweShpMmNfaW5mby5uYW1lLCAiaXNwMTMwMV9wbngiLCBJMkNfTkFNRV9TSVpFKTsKKwlpc3AxMzAxX2kyY19jbGllbnQgPSBpMmNfbmV3X3Byb2JlZF9kZXZpY2UoaTJjX2FkYXAsICZpMmNfaW5mbywKKwkJCQkJCSAgIG5vcm1hbF9pMmMpOworCWkyY19wdXRfYWRhcHRlcihpMmNfYWRhcCk7CisJaWYgKCFpc3AxMzAxX2kyY19jbGllbnQpIHsKKwkJZXJyKCJmYWlsZWQgdG8gY29ubmVjdCBJMkMgdG8gSVNQMTMwMSBVU0IgVHJhbnNjZWl2ZXIiKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXRfaTJjX2RyaXZlcjsKKwl9CiAKIAlpc3AxMzAxX2NvbmZpZ3VyZSgpOwogCkBAIC00MjksNiArNDExLDkgQEAKIG91dDI6CiAJY2xrX3B1dCh1c2JfY2xrKTsKIG91dDE6CisJaTJjX3VucmVnaXN0ZXJfY2xpZW50KGlzcDEzMDFfaTJjX2NsaWVudCk7CisJaXNwMTMwMV9pMmNfY2xpZW50ID0gTlVMTDsKK291dF9pMmNfZHJpdmVyOgogCWkyY19kZWxfZHJpdmVyKCZpc3AxMzAxX2RyaXZlcik7CiBvdXQ6CiAJcmV0dXJuIHJldDsKQEAgLTQ0NSw2ICs0MzAsOCBAQAogCXBueDQwMDhfdW5zZXRfdXNiX2JpdHMoKTsKIAljbGtfZGlzYWJsZSh1c2JfY2xrKTsKIAljbGtfcHV0KHVzYl9jbGspOworCWkyY191bnJlZ2lzdGVyX2NsaWVudChpc3AxMzAxX2kyY19jbGllbnQpOworCWlzcDEzMDFfaTJjX2NsaWVudCA9IE5VTEw7CiAJaTJjX2RlbF9kcml2ZXIoJmlzcDEzMDFfZHJpdmVyKTsKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBwYy1vZi5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBwYy1vZi5jCmluZGV4IDdhYzUzMjYuLjY4YTMwMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wcGMtb2YuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcHBjLW9mLmMKQEAgLTkxLDYgKzkxLDcgQEAKIAogCWludCBydjsKIAlpbnQgaXNfYmlnZW5kaWFuOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CiAKIAlpZiAodXNiX2Rpc2FibGVkKCkpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtMTQ3LDYgKzE0OCwzMCBAQAogCWlmIChydiA9PSAwKQogCQlyZXR1cm4gMDsKIAorCS8qIGJ5IG5vdywgNDQwZXB4IGlzIGtub3duIHRvIHNob3cgdXNiXzIzIGVycmF0dW0gKi8KKwlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJpYm0sdXNiLWVoY2ktNDQwZXB4Iik7CisKKwkvKiBXb3JrIGFyb3VuZCAtIEF0IHRoaXMgcG9pbnQgb2hjaV9ydW4gaGFzIGV4ZWN1dGVkLCB0aGUKKwkqIGNvbnRyb2xsZXIgaXMgcnVubmluZywgZXZlcnl0aGluZywgdGhlIHJvb3QgcG9ydHMsIGV0Yy4sIGlzCisJKiBzZXQgdXAuICBJZiB0aGUgZWhjaSBkcml2ZXIgaXMgbG9hZGVkLCBwdXQgdGhlIG9oY2kgY29yZSBpbgorCSogdGhlIHN1c3BlbmRlZCBzdGF0ZS4gIFRoZSBlaGNpIGRyaXZlciB3aWxsIGJyaW5nIGl0IG91dCBvZgorCSogc3VzcGVuZGVkIHN0YXRlIHdoZW4gLyBpZiBhIG5vbi1oaWdoIHNwZWVkIFVTQiBkZXZpY2UgaXMKKwkqIGF0dGFjaGVkIHRvIHRoZSBVU0IgSG9zdCBwb3J0LiAgSWYgdGhlIGVoY2kgZHJpdmVyIGlzIG5vdAorCSogbG9hZGVkLCBkbyBub3RoaW5nLiByZXF1ZXN0X21lbV9yZWdpb24gaXMgdXNlZCB0byB0ZXN0IGlmCisJKiB0aGUgZWhjaSBkcml2ZXIgaXMgbG9hZGVkLgorCSovCisJaWYgKG5wICE9ICBOVUxMKSB7CisJCWlmICghb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnJlcykpIHsKKwkJCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy5zdGFydCwgMHg0LCBoY2RfbmFtZSkpIHsKKwkJCQl3cml0ZWxfYmUoKHJlYWRsX2JlKCZvaGNpLT5yZWdzLT5jb250cm9sKSB8CisJCQkJCU9IQ0lfVVNCX1NVU1BFTkQpLCAmb2hjaS0+cmVncy0+Y29udHJvbCk7CisJCQkJCSh2b2lkKSByZWFkbF9iZSgmb2hjaS0+cmVncy0+Y29udHJvbCk7CisJCQl9IGVsc2UKKwkJCQlyZWxlYXNlX21lbV9yZWdpb24ocmVzLnN0YXJ0LCAweDQpOworCQl9IGVsc2UKKwkJICAgIHByX2RlYnVnKF9fRklMRV9fICI6IGNhbm5vdCBnZXQgZWhjaSBvZmZzZXQgZnJvbSBmZHRcbiIpOworCX0KKwogCWlvdW5tYXAoaGNkLT5yZWdzKTsKIGVycl9pb3JlbWFwOgogCWlycV9kaXNwb3NlX21hcHBpbmcoaXJxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS10bWlvLmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktdG1pby5jCmluZGV4IGY5ZjEzNGEuLjhkYWJlOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS10bWlvLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXRtaW8uYwpAQCAtMjAxLDcgKzIwMSw3IEBACiAJaWYgKCFjZWxsKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWhjZCA9IHVzYl9jcmVhdGVfaGNkKCZvaGNpX3RtaW9faGNfZHJpdmVyLCAmZGV2LT5kZXYsIGRldi0+ZGV2LmJ1c19pZCk7CisJaGNkID0gdXNiX2NyZWF0ZV9oY2QoJm9oY2lfdG1pb19oY19kcml2ZXIsICZkZXYtPmRldiwgZGV2X25hbWUoJmRldi0+ZGV2KSk7CiAJaWYgKCFoY2QpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJfdXNiX2NyZWF0ZV9oY2Q7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L294dTIxMGhwLWhjZC5jIGIvZHJpdmVycy91c2IvaG9zdC9veHUyMTBocC1oY2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTU0OGY3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvaG9zdC9veHUyMTBocC1oY2QuYwpAQCAtMCwwICsxLDM5ODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggUm9kb2xmbyBHaW9tZXR0aSA8Z2lvbWV0dGlAbGludXguaXQ+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDggRXVyb3RlY2ggUy5wLkEuIDxpbmZvQGV1cnRlY2guaXQ+CisgKgorICogVGhpcyBjb2RlIGlzICpzdHJvbmdseSogYmFzZWQgb24gRUhDSS1IQ0QgY29kZSBieSBEYXZpZCBCcm93bmVsbCBzaW5jZQorICogdGhlIGNoaXAgaXMgYSBxdWFzaS1FSENJIGNvbXBhdGlibGUuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorICogb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYXBvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSAiLi4vY29yZS9oY2QuaCIKKworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlICJveHUyMTBocC5oIgorCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICIwLjAuNTAiCisKKy8qCisgKiBNYWluIGRlZmluZXMKKyAqLworCisjZGVmaW5lIG94dV9kYmcob3h1LCBmbXQsIGFyZ3MuLi4pIFwKKwkJZGV2X2RiZyhveHVfdG9faGNkKG94dSktPnNlbGYuY29udHJvbGxlciAsIGZtdCAsICMjIGFyZ3MpCisjZGVmaW5lIG94dV9lcnIob3h1LCBmbXQsIGFyZ3MuLi4pIFwKKwkJZGV2X2VycihveHVfdG9faGNkKG94dSktPnNlbGYuY29udHJvbGxlciAsIGZtdCAsICMjIGFyZ3MpCisjZGVmaW5lIG94dV9pbmZvKG94dSwgZm10LCBhcmdzLi4uKSBcCisJCWRldl9pbmZvKG94dV90b19oY2Qob3h1KS0+c2VsZi5jb250cm9sbGVyICwgZm10ICwgIyMgYXJncykKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdXNiX2hjZCAqb3h1X3RvX2hjZChzdHJ1Y3Qgb3h1X2hjZCAqb3h1KQoreworCXJldHVybiBjb250YWluZXJfb2YoKHZvaWQgKikgb3h1LCBzdHJ1Y3QgdXNiX2hjZCwgaGNkX3ByaXYpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBveHVfaGNkICpoY2RfdG9fb3h1KHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisJcmV0dXJuIChzdHJ1Y3Qgb3h1X2hjZCAqKSAoaGNkLT5oY2RfcHJpdik7Cit9CisKKy8qCisgKiBEZWJ1ZyBzdHVmZgorICovCisKKyN1bmRlZiBPWFVfVVJCX1RSQUNFCisjdW5kZWYgT1hVX1ZFUkJPU0VfREVCVUcKKworI2lmZGVmIE9YVV9WRVJCT1NFX0RFQlVHCisjZGVmaW5lIG94dV92ZGJnCQkJb3h1X2RiZworI2Vsc2UKKyNkZWZpbmUgb3h1X3ZkYmcob3h1LCBmbXQsIGFyZ3MuLi4pCS8qIE5vcCAqLworI2VuZGlmCisKKyNpZmRlZiBERUJVRworCitzdGF0aWMgaW50IF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKQorZGJnX3N0YXR1c19idWYoY2hhciAqYnVmLCB1bnNpZ25lZCBsZW4sIGNvbnN0IGNoYXIgKmxhYmVsLCB1MzIgc3RhdHVzKQoreworCXJldHVybiBzY25wcmludGYoYnVmLCBsZW4sICIlcyVzc3RhdHVzICUwNHglcyVzJXMlcyVzJXMlcyVzJXMlcyIsCisJCWxhYmVsLCBsYWJlbFswXSA/ICIgIiA6ICIiLCBzdGF0dXMsCisJCShzdGF0dXMgJiBTVFNfQVNTKSA/ICIgQXN5bmMiIDogIiIsCisJCShzdGF0dXMgJiBTVFNfUFNTKSA/ICIgUGVyaW9kaWMiIDogIiIsCisJCShzdGF0dXMgJiBTVFNfUkVDTCkgPyAiIFJlY2wiIDogIiIsCisJCShzdGF0dXMgJiBTVFNfSEFMVCkgPyAiIEhhbHQiIDogIiIsCisJCShzdGF0dXMgJiBTVFNfSUFBKSA/ICIgSUFBIiA6ICIiLAorCQkoc3RhdHVzICYgU1RTX0ZBVEFMKSA/ICIgRkFUQUwiIDogIiIsCisJCShzdGF0dXMgJiBTVFNfRkxSKSA/ICIgRkxSIiA6ICIiLAorCQkoc3RhdHVzICYgU1RTX1BDRCkgPyAiIFBDRCIgOiAiIiwKKwkJKHN0YXR1cyAmIFNUU19FUlIpID8gIiBFUlIiIDogIiIsCisJCShzdGF0dXMgJiBTVFNfSU5UKSA/ICIgSU5UIiA6ICIiCisJCSk7Cit9CisKK3N0YXRpYyBpbnQgX19hdHRyaWJ1dGVfXygoX191bnVzZWRfXykpCitkYmdfaW50cl9idWYoY2hhciAqYnVmLCB1bnNpZ25lZCBsZW4sIGNvbnN0IGNoYXIgKmxhYmVsLCB1MzIgZW5hYmxlKQoreworCXJldHVybiBzY25wcmludGYoYnVmLCBsZW4sICIlcyVzaW50cmVuYWJsZSAlMDJ4JXMlcyVzJXMlcyVzIiwKKwkJbGFiZWwsIGxhYmVsWzBdID8gIiAiIDogIiIsIGVuYWJsZSwKKwkJKGVuYWJsZSAmIFNUU19JQUEpID8gIiBJQUEiIDogIiIsCisJCShlbmFibGUgJiBTVFNfRkFUQUwpID8gIiBGQVRBTCIgOiAiIiwKKwkJKGVuYWJsZSAmIFNUU19GTFIpID8gIiBGTFIiIDogIiIsCisJCShlbmFibGUgJiBTVFNfUENEKSA/ICIgUENEIiA6ICIiLAorCQkoZW5hYmxlICYgU1RTX0VSUikgPyAiIEVSUiIgOiAiIiwKKwkJKGVuYWJsZSAmIFNUU19JTlQpID8gIiBJTlQiIDogIiIKKwkJKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGZsc19zdHJpbmdzW10gPQorICAgIHsgIjEwMjQiLCAiNTEyIiwgIjI1NiIsICI/PyIgfTsKKworc3RhdGljIGludCBkYmdfY29tbWFuZF9idWYoY2hhciAqYnVmLCB1bnNpZ25lZCBsZW4sCisJCQkJY29uc3QgY2hhciAqbGFiZWwsIHUzMiBjb21tYW5kKQoreworCXJldHVybiBzY25wcmludGYoYnVmLCBsZW4sCisJCSIlcyVzY29tbWFuZCAlMDZ4ICVzPSVkIGl0aHJlc2g9JWQlcyVzJXMlcyBwZXJpb2Q9JXMlcyAlcyIsCisJCWxhYmVsLCBsYWJlbFswXSA/ICIgIiA6ICIiLCBjb21tYW5kLAorCQkoY29tbWFuZCAmIENNRF9QQVJLKSA/ICJwYXJrIiA6ICIocGFyaykiLAorCQlDTURfUEFSS19DTlQoY29tbWFuZCksCisJCShjb21tYW5kID4+IDE2KSAmIDB4M2YsCisJCShjb21tYW5kICYgQ01EX0xSRVNFVCkgPyAiIExSZXNldCIgOiAiIiwKKwkJKGNvbW1hbmQgJiBDTURfSUFBRCkgPyAiIElBQUQiIDogIiIsCisJCShjb21tYW5kICYgQ01EX0FTRSkgPyAiIEFzeW5jIiA6ICIiLAorCQkoY29tbWFuZCAmIENNRF9QU0UpID8gIiBQZXJpb2RpYyIgOiAiIiwKKwkJZmxzX3N0cmluZ3NbKGNvbW1hbmQgPj4gMikgJiAweDNdLAorCQkoY29tbWFuZCAmIENNRF9SRVNFVCkgPyAiIFJlc2V0IiA6ICIiLAorCQkoY29tbWFuZCAmIENNRF9SVU4pID8gIlJVTiIgOiAiSEFMVCIKKwkJKTsKK30KKworc3RhdGljIGludCBkYmdfcG9ydF9idWYoY2hhciAqYnVmLCB1bnNpZ25lZCBsZW4sIGNvbnN0IGNoYXIgKmxhYmVsLAorCQkJCWludCBwb3J0LCB1MzIgc3RhdHVzKQoreworCWNoYXIJKnNpZzsKKworCS8qIHNpZ25hbGluZyBzdGF0ZSAqLworCXN3aXRjaCAoc3RhdHVzICYgKDMgPDwgMTApKSB7CisJY2FzZSAwIDw8IDEwOgorCQlzaWcgPSAic2UwIjsKKwkJYnJlYWs7CisJY2FzZSAxIDw8IDEwOgorCQlzaWcgPSAiayI7CS8qIGxvdyBzcGVlZCAqLworCQlicmVhazsKKwljYXNlIDIgPDwgMTA6CisJCXNpZyA9ICJqIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc2lnID0gIj8iOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgbGVuLAorCQkiJXMlc3BvcnQgJWQgc3RhdHVzICUwNnglcyVzIHNpZz0lcyVzJXMlcyVzJXMlcyVzJXMlcyIsCisJCWxhYmVsLCBsYWJlbFswXSA/ICIgIiA6ICIiLCBwb3J0LCBzdGF0dXMsCisJCShzdGF0dXMgJiBQT1JUX1BPV0VSKSA/ICIgUE9XRVIiIDogIiIsCisJCShzdGF0dXMgJiBQT1JUX09XTkVSKSA/ICIgT1dORVIiIDogIiIsCisJCXNpZywKKwkJKHN0YXR1cyAmIFBPUlRfUkVTRVQpID8gIiBSRVNFVCIgOiAiIiwKKwkJKHN0YXR1cyAmIFBPUlRfU1VTUEVORCkgPyAiIFNVU1BFTkQiIDogIiIsCisJCShzdGF0dXMgJiBQT1JUX1JFU1VNRSkgPyAiIFJFU1VNRSIgOiAiIiwKKwkJKHN0YXR1cyAmIFBPUlRfT0NDKSA/ICIgT0NDIiA6ICIiLAorCQkoc3RhdHVzICYgUE9SVF9PQykgPyAiIE9DIiA6ICIiLAorCQkoc3RhdHVzICYgUE9SVF9QRUMpID8gIiBQRUMiIDogIiIsCisJCShzdGF0dXMgJiBQT1JUX1BFKSA/ICIgUEUiIDogIiIsCisJCShzdGF0dXMgJiBQT1JUX0NTQykgPyAiIENTQyIgOiAiIiwKKwkJKHN0YXR1cyAmIFBPUlRfQ09OTkVDVCkgPyAiIENPTk5FQ1QiIDogIiIKKwkgICAgKTsKK30KKworI2Vsc2UKKworc3RhdGljIGlubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX191bnVzZWRfXykpCitkYmdfc3RhdHVzX2J1ZihjaGFyICpidWYsIHVuc2lnbmVkIGxlbiwgY29uc3QgY2hhciAqbGFiZWwsIHUzMiBzdGF0dXMpCit7IHJldHVybiAwOyB9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKQorZGJnX2NvbW1hbmRfYnVmKGNoYXIgKmJ1ZiwgdW5zaWduZWQgbGVuLCBjb25zdCBjaGFyICpsYWJlbCwgdTMyIGNvbW1hbmQpCit7IHJldHVybiAwOyB9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKQorZGJnX2ludHJfYnVmKGNoYXIgKmJ1ZiwgdW5zaWduZWQgbGVuLCBjb25zdCBjaGFyICpsYWJlbCwgdTMyIGVuYWJsZSkKK3sgcmV0dXJuIDA7IH0KKworc3RhdGljIGlubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX191bnVzZWRfXykpCitkYmdfcG9ydF9idWYoY2hhciAqYnVmLCB1bnNpZ25lZCBsZW4sIGNvbnN0IGNoYXIgKmxhYmVsLCBpbnQgcG9ydCwgdTMyIHN0YXR1cykKK3sgcmV0dXJuIDA7IH0KKworI2VuZGlmIC8qIERFQlVHICovCisKKy8qIGZ1bmN0aW9ucyBoYXZlIHRoZSAid3JvbmciIGZpbGVuYW1lIHdoZW4gdGhleSdyZSBvdXRwdXQuLi4gKi8KKyNkZWZpbmUgZGJnX3N0YXR1cyhveHUsIGxhYmVsLCBzdGF0dXMpIHsgXAorCWNoYXIgX2J1Zls4MF07IFwKKwlkYmdfc3RhdHVzX2J1ZihfYnVmLCBzaXplb2YgX2J1ZiwgbGFiZWwsIHN0YXR1cyk7IFwKKwlveHVfZGJnKG94dSwgIiVzXG4iLCBfYnVmKTsgXAorfQorCisjZGVmaW5lIGRiZ19jbWQob3h1LCBsYWJlbCwgY29tbWFuZCkgeyBcCisJY2hhciBfYnVmWzgwXTsgXAorCWRiZ19jb21tYW5kX2J1ZihfYnVmLCBzaXplb2YgX2J1ZiwgbGFiZWwsIGNvbW1hbmQpOyBcCisJb3h1X2RiZyhveHUsICIlc1xuIiwgX2J1Zik7IFwKK30KKworI2RlZmluZSBkYmdfcG9ydChveHUsIGxhYmVsLCBwb3J0LCBzdGF0dXMpIHsgXAorCWNoYXIgX2J1Zls4MF07IFwKKwlkYmdfcG9ydF9idWYoX2J1Ziwgc2l6ZW9mIF9idWYsIGxhYmVsLCBwb3J0LCBzdGF0dXMpOyBcCisJb3h1X2RiZyhveHUsICIlc1xuIiwgX2J1Zik7IFwKK30KKworLyoKKyAqIE1vZHVsZSBwYXJhbWV0ZXJzCisgKi8KKworLyogSW5pdGlhbCBJUlEgbGF0ZW5jeTogZmFzdGVyIHRoYW4gaHcgZGVmYXVsdCAqLworc3RhdGljIGludCBsb2cyX2lycV90aHJlc2g7CQkJLyogMCB0byA2ICovCittb2R1bGVfcGFyYW0obG9nMl9pcnFfdGhyZXNoLCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhsb2cyX2lycV90aHJlc2gsICJsb2cyIElSUSBsYXRlbmN5LCAxLTY0IG1pY3JvZnJhbWVzIik7CisKKy8qIEluaXRpYWwgcGFyayBzZXR0aW5nOiBzbG93ZXIgdGhhbiBodyBkZWZhdWx0ICovCitzdGF0aWMgdW5zaWduZWQgcGFyazsKK21vZHVsZV9wYXJhbShwYXJrLCB1aW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MocGFyaywgInBhcmsgc2V0dGluZzsgMS0zIGJhY2stdG8tYmFjayBhc3luYyBwYWNrZXRzIik7CisKKy8qIEZvciBmbGFrZXkgaGFyZHdhcmUsIGlnbm9yZSBvdmVyY3VycmVudCBpbmRpY2F0b3JzICovCitzdGF0aWMgaW50IGlnbm9yZV9vYzsKK21vZHVsZV9wYXJhbShpZ25vcmVfb2MsIGJvb2wsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhpZ25vcmVfb2MsICJpZ25vcmUgYm9ndXMgaGFyZHdhcmUgb3ZlcmN1cnJlbnQgaW5kaWNhdGlvbnMiKTsKKworCitzdGF0aWMgdm9pZCBlaGNpX3dvcmsoc3RydWN0IG94dV9oY2QgKm94dSk7CitzdGF0aWMgaW50IG94dV9odWJfY29udHJvbChzdHJ1Y3QgdXNiX2hjZCAqaGNkLAorCQkJCXUxNiB0eXBlUmVxLCB1MTYgd1ZhbHVlLCB1MTYgd0luZGV4LAorCQkJCWNoYXIgKmJ1ZiwgdTE2IHdMZW5ndGgpOworCisvKgorICogTG9jYWwgZnVuY3Rpb25zCisgKi8KKworLyogTG93IGxldmVsIHJlYWQvd3JpdGUgcmVnaXN0ZXJzIGZ1bmN0aW9ucyAqLworc3RhdGljIGlubGluZSB1MzIgb3h1X3JlYWRsKHZvaWQgKmJhc2UsIHUzMiByZWcpCit7CisJcmV0dXJuIHJlYWRsKGJhc2UgKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgb3h1X3dyaXRlbCh2b2lkICpiYXNlLCB1MzIgcmVnLCB1MzIgdmFsKQoreworCXdyaXRlbCh2YWwsIGJhc2UgKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGltZXJfYWN0aW9uX2RvbmUoc3RydWN0IG94dV9oY2QgKm94dSwKKwkJCQkJZW51bSBlaGNpX3RpbWVyX2FjdGlvbiBhY3Rpb24pCit7CisJY2xlYXJfYml0KGFjdGlvbiwgJm94dS0+YWN0aW9ucyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0aW1lcl9hY3Rpb24oc3RydWN0IG94dV9oY2QgKm94dSwKKwkJCQkJZW51bSBlaGNpX3RpbWVyX2FjdGlvbiBhY3Rpb24pCit7CisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KGFjdGlvbiwgJm94dS0+YWN0aW9ucykpIHsKKwkJdW5zaWduZWQgbG9uZyB0OworCisJCXN3aXRjaCAoYWN0aW9uKSB7CisJCWNhc2UgVElNRVJfSUFBX1dBVENIRE9HOgorCQkJdCA9IEVIQ0lfSUFBX0pJRkZJRVM7CisJCQlicmVhazsKKwkJY2FzZSBUSU1FUl9JT19XQVRDSERPRzoKKwkJCXQgPSBFSENJX0lPX0pJRkZJRVM7CisJCQlicmVhazsKKwkJY2FzZSBUSU1FUl9BU1lOQ19PRkY6CisJCQl0ID0gRUhDSV9BU1lOQ19KSUZGSUVTOworCQkJYnJlYWs7CisJCWNhc2UgVElNRVJfQVNZTkNfU0hSSU5LOgorCQlkZWZhdWx0OgorCQkJdCA9IEVIQ0lfU0hSSU5LX0pJRkZJRVM7CisJCQlicmVhazsKKwkJfQorCQl0ICs9IGppZmZpZXM7CisJCS8qIGFsbCB0aW1pbmdzIGV4Y2VwdCBJQUEgd2F0Y2hkb2cgY2FuIGJlIG92ZXJyaWRkZW4uCisJCSAqIGFzeW5jIHF1ZXVlIFNIUklOSyBvZnRlbiBwcmVjZWRlcyBJQUEuICB3aGlsZSBpdCdzIHJlYWR5CisJCSAqIHRvIGdvIE9GRiBuZWl0aGVyIGNhbiBtYXR0ZXIsIGFuZCBhZnRlcndhcmRzIHRoZSBJTworCQkgKiB3YXRjaGRvZyBzdG9wcyB1bmxlc3MgdGhlcmUncyBzdGlsbCBwZXJpb2RpYyB0cmFmZmljLgorCQkgKi8KKwkJaWYgKGFjdGlvbiAhPSBUSU1FUl9JQUFfV0FUQ0hET0cKKwkJCQkmJiB0ID4gb3h1LT53YXRjaGRvZy5leHBpcmVzCisJCQkJJiYgdGltZXJfcGVuZGluZygmb3h1LT53YXRjaGRvZykpCisJCQlyZXR1cm47CisJCW1vZF90aW1lcigmb3h1LT53YXRjaGRvZywgdCk7CisJfQorfQorCisvKgorICogaGFuZHNoYWtlIC0gc3BpbiByZWFkaW5nIGhjIHVudGlsIGhhbmRzaGFrZSBjb21wbGV0ZXMgb3IgZmFpbHMKKyAqIEBwdHI6IGFkZHJlc3Mgb2YgaGMgcmVnaXN0ZXIgdG8gYmUgcmVhZAorICogQG1hc2s6IGJpdHMgdG8gbG9vayBhdCBpbiByZXN1bHQgb2YgcmVhZAorICogQGRvbmU6IHZhbHVlIG9mIHRob3NlIGJpdHMgd2hlbiBoYW5kc2hha2Ugc3VjY2VlZHMKKyAqIEB1c2VjOiB0aW1lb3V0IGluIG1pY3Jvc2Vjb25kcworICoKKyAqIFJldHVybnMgbmVnYXRpdmUgZXJybm8sIG9yIHplcm8gb24gc3VjY2VzcworICoKKyAqIFN1Y2Nlc3MgaGFwcGVucyB3aGVuIHRoZSAibWFzayIgYml0cyBoYXZlIHRoZSBzcGVjaWZpZWQgdmFsdWUgKGhhcmR3YXJlCisgKiBoYW5kc2hha2UgZG9uZSkuICBUaGVyZSBhcmUgdHdvIGZhaWx1cmUgbW9kZXM6ICAidXNlYyIgaGF2ZSBwYXNzZWQgKG1ham9yCisgKiBoYXJkd2FyZSBmbGFrZW91dCksIG9yIHRoZSByZWdpc3RlciByZWFkcyBhcyBhbGwtb25lcyAoaGFyZHdhcmUgcmVtb3ZlZCkuCisgKgorICogVGhhdCBsYXN0IGZhaWx1cmUgc2hvdWxkX29ubHkgaGFwcGVuIGluIGNhc2VzIGxpa2UgcGh5c2ljYWwgY2FyZGJ1cyBlamVjdAorICogYmVmb3JlIGRyaXZlciBzaHV0ZG93bi4gQnV0IGl0IGFsc28gc2VlbXMgdG8gYmUgY2F1c2VkIGJ5IGJ1Z3MgaW4gY2FyZGJ1cworICogYnJpZGdlIHNodXRkb3duOiAgc2h1dHRpbmcgZG93biB0aGUgYnJpZGdlIGJlZm9yZSB0aGUgZGV2aWNlcyB1c2luZyBpdC4KKyAqLworc3RhdGljIGludCBoYW5kc2hha2Uoc3RydWN0IG94dV9oY2QgKm94dSwgdm9pZCBfX2lvbWVtICpwdHIsCisJCQkJCXUzMiBtYXNrLCB1MzIgZG9uZSwgaW50IHVzZWMpCit7CisJdTMyIHJlc3VsdDsKKworCWRvIHsKKwkJcmVzdWx0ID0gcmVhZGwocHRyKTsKKwkJaWYgKHJlc3VsdCA9PSB+KHUzMikwKQkJLyogY2FyZCByZW1vdmVkICovCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJcmVzdWx0ICY9IG1hc2s7CisJCWlmIChyZXN1bHQgPT0gZG9uZSkKKwkJCXJldHVybiAwOworCQl1ZGVsYXkoMSk7CisJCXVzZWMtLTsKKwl9IHdoaWxlICh1c2VjID4gMCk7CisJcmV0dXJuIC1FVElNRURPVVQ7Cit9CisKKy8qIEZvcmNlIEhDIHRvIGhhbHQgc3RhdGUgZnJvbSB1bmtub3duIChFSENJIHNwZWMgc2VjdGlvbiAyLjMpICovCitzdGF0aWMgaW50IGVoY2lfaGFsdChzdHJ1Y3Qgb3h1X2hjZCAqb3h1KQoreworCXUzMgl0ZW1wID0gcmVhZGwoJm94dS0+cmVncy0+c3RhdHVzKTsKKworCS8qIGRpc2FibGUgYW55IGlycXMgbGVmdCBlbmFibGVkIGJ5IHByZXZpb3VzIGNvZGUgKi8KKwl3cml0ZWwoMCwgJm94dS0+cmVncy0+aW50cl9lbmFibGUpOworCisJaWYgKCh0ZW1wICYgU1RTX0hBTFQpICE9IDApCisJCXJldHVybiAwOworCisJdGVtcCA9IHJlYWRsKCZveHUtPnJlZ3MtPmNvbW1hbmQpOworCXRlbXAgJj0gfkNNRF9SVU47CisJd3JpdGVsKHRlbXAsICZveHUtPnJlZ3MtPmNvbW1hbmQpOworCXJldHVybiBoYW5kc2hha2Uob3h1LCAmb3h1LT5yZWdzLT5zdGF0dXMsCisJCQkgIFNUU19IQUxULCBTVFNfSEFMVCwgMTYgKiAxMjUpOworfQorCisvKiBQdXQgVERJL0FSQyBzaWxpY29uIGludG8gRUhDSSBtb2RlICovCitzdGF0aWMgdm9pZCB0ZGlfcmVzZXQoc3RydWN0IG94dV9oY2QgKm94dSkKK3sKKwl1MzIgX19pb21lbSAqcmVnX3B0cjsKKwl1MzIgdG1wOworCisJcmVnX3B0ciA9ICh1MzIgX19pb21lbSAqKSgoKHU4IF9faW9tZW0gKilveHUtPnJlZ3MpICsgMHg2OCk7CisJdG1wID0gcmVhZGwocmVnX3B0cik7CisJdG1wIHw9IDB4MzsKKwl3cml0ZWwodG1wLCByZWdfcHRyKTsKK30KKworLyogUmVzZXQgYSBub24tcnVubmluZyAoU1RTX0hBTFQgPT0gMSkgY29udHJvbGxlciAqLworc3RhdGljIGludCBlaGNpX3Jlc2V0KHN0cnVjdCBveHVfaGNkICpveHUpCit7CisJaW50CXJldHZhbDsKKwl1MzIJY29tbWFuZCA9IHJlYWRsKCZveHUtPnJlZ3MtPmNvbW1hbmQpOworCisJY29tbWFuZCB8PSBDTURfUkVTRVQ7CisJZGJnX2NtZChveHUsICJyZXNldCIsIGNvbW1hbmQpOworCXdyaXRlbChjb21tYW5kLCAmb3h1LT5yZWdzLT5jb21tYW5kKTsKKwlveHVfdG9faGNkKG94dSktPnN0YXRlID0gSENfU1RBVEVfSEFMVDsKKwlveHUtPm5leHRfc3RhdGVjaGFuZ2UgPSBqaWZmaWVzOworCXJldHZhbCA9IGhhbmRzaGFrZShveHUsICZveHUtPnJlZ3MtPmNvbW1hbmQsCisJCQkgICAgQ01EX1JFU0VULCAwLCAyNTAgKiAxMDAwKTsKKworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwl0ZGlfcmVzZXQob3h1KTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qIElkbGUgdGhlIGNvbnRyb2xsZXIgKGZyb20gcnVubmluZykgKi8KK3N0YXRpYyB2b2lkIGVoY2lfcXVpZXNjZShzdHJ1Y3Qgb3h1X2hjZCAqb3h1KQoreworCXUzMgl0ZW1wOworCisjaWZkZWYgREVCVUcKKwlpZiAoIUhDX0lTX1JVTk5JTkcob3h1X3RvX2hjZChveHUpLT5zdGF0ZSkpCisJCUJVRygpOworI2VuZGlmCisKKwkvKiB3YWl0IGZvciBhbnkgc2NoZWR1bGUgZW5hYmxlcy9kaXNhYmxlcyB0byB0YWtlIGVmZmVjdCAqLworCXRlbXAgPSByZWFkbCgmb3h1LT5yZWdzLT5jb21tYW5kKSA8PCAxMDsKKwl0ZW1wICY9IFNUU19BU1MgfCBTVFNfUFNTOworCWlmIChoYW5kc2hha2Uob3h1LCAmb3h1LT5yZWdzLT5zdGF0dXMsIFNUU19BU1MgfCBTVFNfUFNTLAorCQkJCXRlbXAsIDE2ICogMTI1KSAhPSAwKSB7CisJCW94dV90b19oY2Qob3h1KS0+c3RhdGUgPSBIQ19TVEFURV9IQUxUOworCQlyZXR1cm47CisJfQorCisJLyogdGhlbiBkaXNhYmxlIGFueXRoaW5nIHRoYXQncyBzdGlsbCBhY3RpdmUgKi8KKwl0ZW1wID0gcmVhZGwoJm94dS0+cmVncy0+Y29tbWFuZCk7CisJdGVtcCAmPSB+KENNRF9BU0UgfCBDTURfSUFBRCB8IENNRF9QU0UpOworCXdyaXRlbCh0ZW1wLCAmb3h1LT5yZWdzLT5jb21tYW5kKTsKKworCS8qIGhhcmR3YXJlIGNhbiB0YWtlIDE2IG1pY3JvZnJhbWVzIHRvIHR1cm4gb2ZmIC4uLiAqLworCWlmIChoYW5kc2hha2Uob3h1LCAmb3h1LT5yZWdzLT5zdGF0dXMsIFNUU19BU1MgfCBTVFNfUFNTLAorCQkJCTAsIDE2ICogMTI1KSAhPSAwKSB7CisJCW94dV90b19oY2Qob3h1KS0+c3RhdGUgPSBIQ19TVEFURV9IQUxUOworCQlyZXR1cm47CisJfQorfQorCitzdGF0aWMgaW50IGNoZWNrX3Jlc2V0X2NvbXBsZXRlKHN0cnVjdCBveHVfaGNkICpveHUsIGludCBpbmRleCwKKwkJCQl1MzIgX19pb21lbSAqc3RhdHVzX3JlZywgaW50IHBvcnRfc3RhdHVzKQoreworCWlmICghKHBvcnRfc3RhdHVzICYgUE9SVF9DT05ORUNUKSkgeworCQlveHUtPnJlc2V0X2RvbmVbaW5kZXhdID0gMDsKKwkJcmV0dXJuIHBvcnRfc3RhdHVzOworCX0KKworCS8qIGlmIHJlc2V0IGZpbmlzaGVkIGFuZCBpdCdzIHN0aWxsIG5vdCBlbmFibGVkIC0tIGhhbmRvZmYgKi8KKwlpZiAoIShwb3J0X3N0YXR1cyAmIFBPUlRfUEUpKSB7CisJCW94dV9kYmcob3h1LCAiRmFpbGVkIHRvIGVuYWJsZSBwb3J0ICVkIG9uIHJvb3QgaHViIFRUXG4iLAorCQkJCWluZGV4KzEpOworCQlyZXR1cm4gcG9ydF9zdGF0dXM7CisJfSBlbHNlCisJCW94dV9kYmcob3h1LCAicG9ydCAlZCBoaWdoIHNwZWVkXG4iLCBpbmRleCArIDEpOworCisJcmV0dXJuIHBvcnRfc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBlaGNpX2h1Yl9kZXNjcmlwdG9yKHN0cnVjdCBveHVfaGNkICpveHUsCisJCQkJc3RydWN0IHVzYl9odWJfZGVzY3JpcHRvciAqZGVzYykKK3sKKwlpbnQgcG9ydHMgPSBIQ1NfTl9QT1JUUyhveHUtPmhjc19wYXJhbXMpOworCXUxNiB0ZW1wOworCisJZGVzYy0+YkRlc2NyaXB0b3JUeXBlID0gMHgyOTsKKwlkZXNjLT5iUHdyT24yUHdyR29vZCA9IDEwOwkvKiBveHUgMS4wLCAyLjMuOSBzYXlzIDIwbXMgbWF4ICovCisJZGVzYy0+Ykh1YkNvbnRyQ3VycmVudCA9IDA7CisKKwlkZXNjLT5iTmJyUG9ydHMgPSBwb3J0czsKKwl0ZW1wID0gMSArIChwb3J0cyAvIDgpOworCWRlc2MtPmJEZXNjTGVuZ3RoID0gNyArIDIgKiB0ZW1wOworCisJLyogdHdvIGJpdG1hcHM6ICBwb3J0cyByZW1vdmFibGUsIGFuZCB1c2IgMS4wIGxlZ2FjeSBQb3J0UHdyQ3RybE1hc2sgKi8KKwltZW1zZXQoJmRlc2MtPmJpdG1hcFswXSwgMCwgdGVtcCk7CisJbWVtc2V0KCZkZXNjLT5iaXRtYXBbdGVtcF0sIDB4ZmYsIHRlbXApOworCisJdGVtcCA9IDB4MDAwODsJCQkvKiBwZXItcG9ydCBvdmVyY3VycmVudCByZXBvcnRpbmcgKi8KKwlpZiAoSENTX1BQQyhveHUtPmhjc19wYXJhbXMpKQorCQl0ZW1wIHw9IDB4MDAwMTsJCS8qIHBlci1wb3J0IHBvd2VyIGNvbnRyb2wgKi8KKwllbHNlCisJCXRlbXAgfD0gMHgwMDAyOwkJLyogbm8gcG93ZXIgc3dpdGNoaW5nICovCisJZGVzYy0+d0h1YkNoYXJhY3RlcmlzdGljcyA9IChfX2ZvcmNlIF9fdTE2KWNwdV90b19sZTE2KHRlbXApOworfQorCisKKy8qIEFsbG9jYXRlIGFuIE9YVTIxMEhQIG9uLWNoaXAgbWVtb3J5IGRhdGEgYnVmZmVyCisgKgorICogQW4gb24tY2hpcCBtZW1vcnkgZGF0YSBidWZmZXIgaXMgcmVxdWlyZWQgZm9yIGVhY2ggT1hVMjEwSFAgVVNCIHRyYW5zZmVyLgorICogRWFjaCB0cmFuc2ZlciBkZXNjcmlwdG9yIGhhcyBvbmUgb3IgbW9yZSBvbi1jaGlwIG1lbW9yeSBkYXRhIGJ1ZmZlcnMuCisgKgorICogRGF0YSBidWZmZXJzIGFyZSBhbGxvY2F0ZWQgZnJvbSBhIGZpeCBzaXplZCBwb29sIG9mIGRhdGEgYmxvY2tzLgorICogVG8gbWluaW1pc2UgZnJhZ21lbnRhdGlvbiBhbmQgZ2l2ZSByZWFzb25hYmxlIG1lbW9yeSB1dGxpc2F0aW9uLAorICogZGF0YSBidWZmZXJzIGFyZSBhbGxvY2F0ZWQgd2l0aCBzaXplcyB0aGUgcG93ZXIgb2YgMiBtdWx0aXBsZXMgb2YKKyAqIHRoZSBibG9jayBzaXplLCBzdGFydGluZyBvbiBhbiBhZGRyZXNzIGEgbXVsdGlwbGUgb2YgdGhlIGFsbG9jYXRlZCBzaXplLgorICoKKyAqIEZJWE1FOiBjYWxsZXJzIG9mIHRoaXMgZnVuY3Rpb24gcmVxdWlyZSBhIGJ1ZmZlciB0byBiZSBhbGxvY2F0ZWQgZm9yCisgKiBsZW49MC4gVGhpcyBpcyBhIHdhc3RlIG9mIG9uLWNoaXAgbWVtb3J5IGFuZCBzaG91bGQgYmUgZml4LiBUaGVuIHRoaXMKKyAqIGZ1bmN0aW9uIHNob3VsZCBiZSBjaGFuZ2VkIHRvIG5vdCBhbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgbGVuPTAuCisgKi8KK3N0YXRpYyBpbnQgb3h1X2J1Zl9hbGxvYyhzdHJ1Y3Qgb3h1X2hjZCAqb3h1LCBzdHJ1Y3QgZWhjaV9xdGQgKnF0ZCwgaW50IGxlbikKK3sKKwlpbnQgbl9ibG9ja3M7CS8qIG1pbml1bSBibG9ja3MgbmVlZGVkIHRvIGhvbGQgbGVuICovCisJaW50IGFfYmxvY2tzOwkvKiBibG9ja3MgYWxsb2NhdGVkICovCisJaW50IGksIGo7CisKKwkvKiBEb24ndCBhbGxvY3RlIGJpZ2dlciB0aGFuIHN1cHBvcnRlZCAqLworCWlmIChsZW4gPiBCVUZGRVJfU0laRSAqIEJVRkZFUl9OVU0pIHsKKwkJb3h1X2VycihveHUsICJidWZmZXIgdG9vIGJpZyAoJWQpXG4iLCBsZW4pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzcGluX2xvY2soJm94dS0+bWVtX2xvY2spOworCisJLyogTnVtYmVyIG9mIGJsb2NrcyBuZWVkZWQgdG8gaG9sZCBsZW4gKi8KKwluX2Jsb2NrcyA9IChsZW4gKyBCVUZGRVJfU0laRSAtIDEpIC8gQlVGRkVSX1NJWkU7CisKKwkvKiBSb3VuZCB0aGUgbnVtYmVyIG9mIGJsb2NrcyB1cCB0byB0aGUgcG93ZXIgb2YgMiAqLworCWZvciAoYV9ibG9ja3MgPSAxOyBhX2Jsb2NrcyA8IG5fYmxvY2tzOyBhX2Jsb2NrcyA8PD0gMSkKKwkJOworCisJLyogRmluZCBhIHN1aXRhYmxlIGF2YWlsYWJsZSBkYXRhIGJ1ZmZlciAqLworCWZvciAoaSA9IDA7IGkgPCBCVUZGRVJfTlVNOworCQkJaSArPSBtYXgoYV9ibG9ja3MsIChpbnQpb3h1LT5kYl91c2VkW2ldKSkgeworCisJCS8qIENoZWNrIGFsbCB0aGUgcmVxdWlyZWQgYmxvY2tzIGFyZSBhdmFpbGFibGUgKi8KKwkJZm9yIChqID0gMDsgaiA8IGFfYmxvY2tzOyBqKyspCisJCQlpZiAob3h1LT5kYl91c2VkW2kgKyBqXSkKKwkJCQlicmVhazsKKworCQlpZiAoaiAhPSBhX2Jsb2NrcykKKwkJCWNvbnRpbnVlOworCisJCS8qIEFsbG9jYXRlIGJsb2NrcyBmb3VuZCEgKi8KKwkJcXRkLT5idWZmZXIgPSAodm9pZCAqKSAmb3h1LT5tZW0tPmRiX3Bvb2xbaV07CisJCXF0ZC0+YnVmZmVyX2RtYSA9IHZpcnRfdG9fcGh5cyhxdGQtPmJ1ZmZlcik7CisKKwkJcXRkLT5xdGRfYnVmZmVyX2xlbiA9IEJVRkZFUl9TSVpFICogYV9ibG9ja3M7CisJCW94dS0+ZGJfdXNlZFtpXSA9IGFfYmxvY2tzOworCisJCXNwaW5fdW5sb2NrKCZveHUtPm1lbV9sb2NrKTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBGYWlsZWQgKi8KKworCXNwaW5fdW5sb2NrKCZveHUtPm1lbV9sb2NrKTsKKworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgdm9pZCBveHVfYnVmX2ZyZWUoc3RydWN0IG94dV9oY2QgKm94dSwgc3RydWN0IGVoY2lfcXRkICpxdGQpCit7CisJaW50IGluZGV4OworCisJc3Bpbl9sb2NrKCZveHUtPm1lbV9sb2NrKTsKKworCWluZGV4ID0gKHF0ZC0+YnVmZmVyIC0gKHZvaWQgKikgJm94dS0+bWVtLT5kYl9wb29sWzBdKQorCQkJCQkJCSAvIEJVRkZFUl9TSVpFOworCW94dS0+ZGJfdXNlZFtpbmRleF0gPSAwOworCXF0ZC0+cXRkX2J1ZmZlcl9sZW4gPSAwOworCXF0ZC0+YnVmZmVyX2RtYSA9IDA7CisJcXRkLT5idWZmZXIgPSBOVUxMOworCisJc3Bpbl91bmxvY2soJm94dS0+bWVtX2xvY2spOworCisJcmV0dXJuOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZWhjaV9xdGRfaW5pdChzdHJ1Y3QgZWhjaV9xdGQgKnF0ZCwgZG1hX2FkZHJfdCBkbWEpCit7CisJbWVtc2V0KHF0ZCwgMCwgc2l6ZW9mICpxdGQpOworCXF0ZC0+cXRkX2RtYSA9IGRtYTsKKwlxdGQtPmh3X3Rva2VuID0gY3B1X3RvX2xlMzIoUVREX1NUU19IQUxUKTsKKwlxdGQtPmh3X25leHQgPSBFSENJX0xJU1RfRU5EOworCXF0ZC0+aHdfYWx0X25leHQgPSBFSENJX0xJU1RfRU5EOworCUlOSVRfTElTVF9IRUFEKCZxdGQtPnF0ZF9saXN0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG94dV9xdGRfZnJlZShzdHJ1Y3Qgb3h1X2hjZCAqb3h1LCBzdHJ1Y3QgZWhjaV9xdGQgKnF0ZCkKK3sKKwlpbnQgaW5kZXg7CisKKwlpZiAocXRkLT5idWZmZXIpCisJCW94dV9idWZfZnJlZShveHUsIHF0ZCk7CisKKwlzcGluX2xvY2soJm94dS0+bWVtX2xvY2spOworCisJaW5kZXggPSBxdGQgLSAmb3h1LT5tZW0tPnF0ZF9wb29sWzBdOworCW94dS0+cXRkX3VzZWRbaW5kZXhdID0gMDsKKworCXNwaW5fdW5sb2NrKCZveHUtPm1lbV9sb2NrKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHN0cnVjdCBlaGNpX3F0ZCAqZWhjaV9xdGRfYWxsb2Moc3RydWN0IG94dV9oY2QgKm94dSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgZWhjaV9xdGQgKnF0ZCA9IE5VTEw7CisKKwlzcGluX2xvY2soJm94dS0+bWVtX2xvY2spOworCisJZm9yIChpID0gMDsgaSA8IFFURF9OVU07IGkrKykKKwkJaWYgKCFveHUtPnF0ZF91c2VkW2ldKQorCQkJYnJlYWs7CisKKwlpZiAoaSA8IFFURF9OVU0pIHsKKwkJcXRkID0gKHN0cnVjdCBlaGNpX3F0ZCAqKSAmb3h1LT5tZW0tPnF0ZF9wb29sW2ldOworCQltZW1zZXQocXRkLCAwLCBzaXplb2YgKnF0ZCk7CisKKwkJcXRkLT5od190b2tlbiA9IGNwdV90b19sZTMyKFFURF9TVFNfSEFMVCk7CisJCXF0ZC0+aHdfbmV4dCA9IEVIQ0lfTElTVF9FTkQ7CisJCXF0ZC0+aHdfYWx0X25leHQgPSBFSENJX0xJU1RfRU5EOworCQlJTklUX0xJU1RfSEVBRCgmcXRkLT5xdGRfbGlzdCk7CisKKwkJcXRkLT5xdGRfZG1hID0gdmlydF90b19waHlzKHF0ZCk7CisKKwkJb3h1LT5xdGRfdXNlZFtpXSA9IDE7CisJfQorCisJc3Bpbl91bmxvY2soJm94dS0+bWVtX2xvY2spOworCisJcmV0dXJuIHF0ZDsKK30KKworc3RhdGljIHZvaWQgb3h1X3FoX2ZyZWUoc3RydWN0IG94dV9oY2QgKm94dSwgc3RydWN0IGVoY2lfcWggKnFoKQoreworCWludCBpbmRleDsKKworCXNwaW5fbG9jaygmb3h1LT5tZW1fbG9jayk7CisKKwlpbmRleCA9IHFoIC0gJm94dS0+bWVtLT5xaF9wb29sWzBdOworCW94dS0+cWhfdXNlZFtpbmRleF0gPSAwOworCisJc3Bpbl91bmxvY2soJm94dS0+bWVtX2xvY2spOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBxaF9kZXN0cm95KHN0cnVjdCBrcmVmICprcmVmKQoreworCXN0cnVjdCBlaGNpX3FoICpxaCA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgZWhjaV9xaCwga3JlZik7CisJc3RydWN0IG94dV9oY2QgKm94dSA9IHFoLT5veHU7CisKKwkvKiBjbGVhbiBxdGRzIGZpcnN0LCBhbmQga25vdyB0aGlzIGlzIG5vdCBsaW5rZWQgKi8KKwlpZiAoIWxpc3RfZW1wdHkoJnFoLT5xdGRfbGlzdCkgfHwgcWgtPnFoX25leHQucHRyKSB7CisJCW94dV9kYmcob3h1LCAidW51c2VkIHFoIG5vdCBlbXB0eSFcbiIpOworCQlCVUcoKTsKKwl9CisJaWYgKHFoLT5kdW1teSkKKwkJb3h1X3F0ZF9mcmVlKG94dSwgcWgtPmR1bW15KTsKKwlveHVfcWhfZnJlZShveHUsIHFoKTsKK30KKworc3RhdGljIHN0cnVjdCBlaGNpX3FoICpveHVfcWhfYWxsb2Moc3RydWN0IG94dV9oY2QgKm94dSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgZWhjaV9xaCAqcWggPSBOVUxMOworCisJc3Bpbl9sb2NrKCZveHUtPm1lbV9sb2NrKTsKKworCWZvciAoaSA9IDA7IGkgPCBRSEVBRF9OVU07IGkrKykKKwkJaWYgKCFveHUtPnFoX3VzZWRbaV0pCisJCQlicmVhazsKKworCWlmIChpIDwgUUhFQURfTlVNKSB7CisJCXFoID0gKHN0cnVjdCBlaGNpX3FoICopICZveHUtPm1lbS0+cWhfcG9vbFtpXTsKKwkJbWVtc2V0KHFoLCAwLCBzaXplb2YgKnFoKTsKKworCQlrcmVmX2luaXQoJnFoLT5rcmVmKTsKKwkJcWgtPm94dSA9IG94dTsKKwkJcWgtPnFoX2RtYSA9IHZpcnRfdG9fcGh5cyhxaCk7CisJCUlOSVRfTElTVF9IRUFEKCZxaC0+cXRkX2xpc3QpOworCisJCS8qIGR1bW15IHRkIGVuYWJsZXMgc2FmZSB1cmIgcXVldWluZyAqLworCQlxaC0+ZHVtbXkgPSBlaGNpX3F0ZF9hbGxvYyhveHUpOworCQlpZiAocWgtPmR1bW15ID09IE5VTEwpIHsKKwkJCW94dV9kYmcob3h1LCAibm8gZHVtbXkgdGRcbiIpOworCQkJb3h1LT5xaF91c2VkW2ldID0gMDsKKworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlveHUtPnFoX3VzZWRbaV0gPSAxOworCX0KKworCXNwaW5fdW5sb2NrKCZveHUtPm1lbV9sb2NrKTsKKworCXJldHVybiBxaDsKK30KKworLyogdG8gc2hhcmUgYSBxaCAoY3B1IHRocmVhZHMsIG9yIGhjKSAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgZWhjaV9xaCAqcWhfZ2V0KHN0cnVjdCBlaGNpX3FoICpxaCkKK3sKKwlrcmVmX2dldCgmcWgtPmtyZWYpOworCXJldHVybiBxaDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHFoX3B1dChzdHJ1Y3QgZWhjaV9xaCAqcWgpCit7CisJa3JlZl9wdXQoJnFoLT5rcmVmLCBxaF9kZXN0cm95KTsKK30KKworc3RhdGljIHZvaWQgb3h1X211cmJfZnJlZShzdHJ1Y3Qgb3h1X2hjZCAqb3h1LCBzdHJ1Y3Qgb3h1X211cmIgKm11cmIpCit7CisJaW50IGluZGV4OworCisJc3Bpbl9sb2NrKCZveHUtPm1lbV9sb2NrKTsKKworCWluZGV4ID0gbXVyYiAtICZveHUtPm11cmJfcG9vbFswXTsKKwlveHUtPm11cmJfdXNlZFtpbmRleF0gPSAwOworCisJc3Bpbl91bmxvY2soJm94dS0+bWVtX2xvY2spOworCisJcmV0dXJuOworfQorCitzdGF0aWMgc3RydWN0IG94dV9tdXJiICpveHVfbXVyYl9hbGxvYyhzdHJ1Y3Qgb3h1X2hjZCAqb3h1KQorCit7CisJaW50IGk7CisJc3RydWN0IG94dV9tdXJiICptdXJiID0gTlVMTDsKKworCXNwaW5fbG9jaygmb3h1LT5tZW1fbG9jayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTVVSQl9OVU07IGkrKykKKwkJaWYgKCFveHUtPm11cmJfdXNlZFtpXSkKKwkJCWJyZWFrOworCisJaWYgKGkgPCBNVVJCX05VTSkgeworCQltdXJiID0gJihveHUtPm11cmJfcG9vbClbaV07CisKKwkJb3h1LT5tdXJiX3VzZWRbaV0gPSAxOworCX0KKworCXNwaW5fdW5sb2NrKCZveHUtPm1lbV9sb2NrKTsKKworCXJldHVybiBtdXJiOworfQorCisvKiBUaGUgcXVldWUgaGVhZHMgYW5kIHRyYW5zZmVyIGRlc2NyaXB0b3JzIGFyZSBtYW5hZ2VkIGZyb20gcG9vbHMgdGllZAorICogdG8gZWFjaCBvZiB0aGUgInBlciBkZXZpY2UiIHN0cnVjdHVyZXMuCisgKiBUaGlzIGlzIHRoZSBpbml0aWFsaXNhdGlvbiBhbmQgY2xlYW51cCBjb2RlLgorICovCitzdGF0aWMgdm9pZCBlaGNpX21lbV9jbGVhbnVwKHN0cnVjdCBveHVfaGNkICpveHUpCit7CisJa2ZyZWUob3h1LT5tdXJiX3Bvb2wpOworCW94dS0+bXVyYl9wb29sID0gTlVMTDsKKworCWlmIChveHUtPmFzeW5jKQorCQlxaF9wdXQob3h1LT5hc3luYyk7CisJb3h1LT5hc3luYyA9IE5VTEw7CisKKwlkZWxfdGltZXIoJm94dS0+dXJiX3RpbWVyKTsKKworCW94dS0+cGVyaW9kaWMgPSBOVUxMOworCisJLyogc2hhZG93IHBlcmlvZGljIHRhYmxlICovCisJa2ZyZWUob3h1LT5wc2hhZG93KTsKKwlveHUtPnBzaGFkb3cgPSBOVUxMOworfQorCisvKiBSZW1lbWJlciB0byBhZGQgY2xlYW51cCBjb2RlIChhYm92ZSkgaWYgeW91IGFkZCBhbnl0aGluZyBoZXJlLgorICovCitzdGF0aWMgaW50IGVoY2lfbWVtX2luaXQoc3RydWN0IG94dV9oY2QgKm94dSwgZ2ZwX3QgZmxhZ3MpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgb3h1LT5wZXJpb2RpY19zaXplOyBpKyspCisJCW94dS0+bWVtLT5mcmFtZV9saXN0W2ldID0gRUhDSV9MSVNUX0VORDsKKwlmb3IgKGkgPSAwOyBpIDwgUUhFQURfTlVNOyBpKyspCisJCW94dS0+cWhfdXNlZFtpXSA9IDA7CisJZm9yIChpID0gMDsgaSA8IFFURF9OVU07IGkrKykKKwkJb3h1LT5xdGRfdXNlZFtpXSA9IDA7CisKKwlveHUtPm11cmJfcG9vbCA9IGtjYWxsb2MoTVVSQl9OVU0sIHNpemVvZihzdHJ1Y3Qgb3h1X211cmIpLCBmbGFncyk7CisJaWYgKCFveHUtPm11cmJfcG9vbCkKKwkJZ290byBmYWlsOworCisJZm9yIChpID0gMDsgaSA8IE1VUkJfTlVNOyBpKyspCisJCW94dS0+bXVyYl91c2VkW2ldID0gMDsKKworCW94dS0+YXN5bmMgPSBveHVfcWhfYWxsb2Mob3h1KTsKKwlpZiAoIW94dS0+YXN5bmMpCisJCWdvdG8gZmFpbDsKKworCW94dS0+cGVyaW9kaWMgPSAoX19sZTMyICopICZveHUtPm1lbS0+ZnJhbWVfbGlzdDsKKwlveHUtPnBlcmlvZGljX2RtYSA9IHZpcnRfdG9fcGh5cyhveHUtPnBlcmlvZGljKTsKKworCWZvciAoaSA9IDA7IGkgPCBveHUtPnBlcmlvZGljX3NpemU7IGkrKykKKwkJb3h1LT5wZXJpb2RpY1tpXSA9IEVIQ0lfTElTVF9FTkQ7CisKKwkvKiBzb2Z0d2FyZSBzaGFkb3cgb2YgaGFyZHdhcmUgdGFibGUgKi8KKwlveHUtPnBzaGFkb3cgPSBrY2FsbG9jKG94dS0+cGVyaW9kaWNfc2l6ZSwgc2l6ZW9mKHZvaWQgKiksIGZsYWdzKTsKKwlpZiAob3h1LT5wc2hhZG93ICE9IE5VTEwpCisJCXJldHVybiAwOworCitmYWlsOgorCW94dV9kYmcob3h1LCAiY291bGRuJ3QgaW5pdCBtZW1vcnlcbiIpOworCWVoY2lfbWVtX2NsZWFudXAob3h1KTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworLyogRmlsbCBhIHF0ZCwgcmV0dXJuaW5nIGhvdyBtdWNoIG9mIHRoZSBidWZmZXIgd2Ugd2VyZSBhYmxlIHRvIHF1ZXVlIHVwLgorICovCitzdGF0aWMgaW50IHF0ZF9maWxsKHN0cnVjdCBlaGNpX3F0ZCAqcXRkLCBkbWFfYWRkcl90IGJ1Ziwgc2l6ZV90IGxlbiwKKwkJCQlpbnQgdG9rZW4sIGludCBtYXhwYWNrZXQpCit7CisJaW50IGksIGNvdW50OworCXU2NCBhZGRyID0gYnVmOworCisJLyogb25lIGJ1ZmZlciBlbnRyeSBwZXIgNEsgLi4uIGZpcnN0IG1pZ2h0IGJlIHNob3J0IG9yIHVuYWxpZ25lZCAqLworCXF0ZC0+aHdfYnVmWzBdID0gY3B1X3RvX2xlMzIoKHUzMilhZGRyKTsKKwlxdGQtPmh3X2J1Zl9oaVswXSA9IGNwdV90b19sZTMyKCh1MzIpKGFkZHIgPj4gMzIpKTsKKwljb3VudCA9IDB4MTAwMCAtIChidWYgJiAweDBmZmYpOwkvKiByZXN0IG9mIHRoYXQgcGFnZSAqLworCWlmIChsaWtlbHkobGVuIDwgY291bnQpKQkJLyogLi4uIGlmZiBuZWVkZWQgKi8KKwkJY291bnQgPSBsZW47CisJZWxzZSB7CisJCWJ1ZiArPSAgMHgxMDAwOworCQlidWYgJj0gfjB4MGZmZjsKKworCQkvKiBwZXItcXRkIGxpbWl0OiBmcm9tIDE2SyB0byAyMEsgKGJlc3QgYWxpZ25tZW50KSAqLworCQlmb3IgKGkgPSAxOyBjb3VudCA8IGxlbiAmJiBpIDwgNTsgaSsrKSB7CisJCQlhZGRyID0gYnVmOworCQkJcXRkLT5od19idWZbaV0gPSBjcHVfdG9fbGUzMigodTMyKWFkZHIpOworCQkJcXRkLT5od19idWZfaGlbaV0gPSBjcHVfdG9fbGUzMigodTMyKShhZGRyID4+IDMyKSk7CisJCQlidWYgKz0gMHgxMDAwOworCQkJaWYgKChjb3VudCArIDB4MTAwMCkgPCBsZW4pCisJCQkJY291bnQgKz0gMHgxMDAwOworCQkJZWxzZQorCQkJCWNvdW50ID0gbGVuOworCQl9CisKKwkJLyogc2hvcnQgcGFja2V0cyBtYXkgb25seSB0ZXJtaW5hdGUgdHJhbnNmZXJzICovCisJCWlmIChjb3VudCAhPSBsZW4pCisJCQljb3VudCAtPSAoY291bnQgJSBtYXhwYWNrZXQpOworCX0KKwlxdGQtPmh3X3Rva2VuID0gY3B1X3RvX2xlMzIoKGNvdW50IDw8IDE2KSB8IHRva2VuKTsKKwlxdGQtPmxlbmd0aCA9IGNvdW50OworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcWhfdXBkYXRlKHN0cnVjdCBveHVfaGNkICpveHUsCisJCQkJc3RydWN0IGVoY2lfcWggKnFoLCBzdHJ1Y3QgZWhjaV9xdGQgKnF0ZCkKK3sKKwkvKiB3cml0ZXMgdG8gYW4gYWN0aXZlIG92ZXJsYXkgYXJlIHVuc2FmZSAqLworCUJVR19PTihxaC0+cWhfc3RhdGUgIT0gUUhfU1RBVEVfSURMRSk7CisKKwlxaC0+aHdfcXRkX25leHQgPSBRVERfTkVYVChxdGQtPnF0ZF9kbWEpOworCXFoLT5od19hbHRfbmV4dCA9IEVIQ0lfTElTVF9FTkQ7CisKKwkvKiBFeGNlcHQgZm9yIGNvbnRyb2wgZW5kcG9pbnRzLCB3ZSBtYWtlIGhhcmR3YXJlIG1haW50YWluIGRhdGEKKwkgKiB0b2dnbGUgKGxpa2UgT0hDSSkgLi4uIGhlcmUgKHJlKWluaXRpYWxpemUgdGhlIHRvZ2dsZSBpbiB0aGUgUUgsCisJICogYW5kIHNldCB0aGUgcHNldWRvLXRvZ2dsZSBpbiB1ZGV2LiBPbmx5IHVzYl9jbGVhcl9oYWx0KCkgd2lsbAorCSAqIGV2ZXIgY2xlYXIgaXQuCisJICovCisJaWYgKCEocWgtPmh3X2luZm8xICYgY3B1X3RvX2xlMzIoMSA8PCAxNCkpKSB7CisJCXVuc2lnbmVkCWlzX291dCwgZXBudW07CisKKwkJaXNfb3V0ID0gIShxdGQtPmh3X3Rva2VuICYgY3B1X3RvX2xlMzIoMSA8PCA4KSk7CisJCWVwbnVtID0gKGxlMzJfdG9fY3B1cCgmcWgtPmh3X2luZm8xKSA+PiA4KSAmIDB4MGY7CisJCWlmICh1bmxpa2VseSghdXNiX2dldHRvZ2dsZShxaC0+ZGV2LCBlcG51bSwgaXNfb3V0KSkpIHsKKwkJCXFoLT5od190b2tlbiAmPSB+X19jb25zdGFudF9jcHVfdG9fbGUzMihRVERfVE9HR0xFKTsKKwkJCXVzYl9zZXR0b2dnbGUocWgtPmRldiwgZXBudW0sIGlzX291dCwgMSk7CisJCX0KKwl9CisKKwkvKiBIQyBtdXN0IHNlZSBsYXRlc3QgcXRkIGFuZCBxaCBkYXRhIGJlZm9yZSB3ZSBjbGVhciBBQ1RJVkUrSEFMVCAqLworCXdtYigpOworCXFoLT5od190b2tlbiAmPSBfX2NvbnN0YW50X2NwdV90b19sZTMyKFFURF9UT0dHTEUgfCBRVERfU1RTX1BJTkcpOworfQorCisvKiBJZiBpdCB3ZXJlbid0IGZvciBhIGNvbW1vbiBzaWxpY29uIHF1aXJrICh3cml0aW5nIHRoZSBkdW1teSBpbnRvIHRoZSBxaAorICogb3ZlcmxheSwgc28gcWgtPmh3X3Rva2VuIHdyb25nbHkgYmVjb21lcyBpbmFjdGl2ZS9oYWx0ZWQpLCBvbmx5IGZhdWx0CisgKiByZWNvdmVyeSAoaW5jbHVkaW5nIHVyYiBkZXF1ZXVlKSB3b3VsZCBuZWVkIHNvZnR3YXJlIGNoYW5nZXMgdG8gYSBRSC4uLgorICovCitzdGF0aWMgdm9pZCBxaF9yZWZyZXNoKHN0cnVjdCBveHVfaGNkICpveHUsIHN0cnVjdCBlaGNpX3FoICpxaCkKK3sKKwlzdHJ1Y3QgZWhjaV9xdGQgKnF0ZDsKKworCWlmIChsaXN0X2VtcHR5KCZxaC0+cXRkX2xpc3QpKQorCQlxdGQgPSBxaC0+ZHVtbXk7CisJZWxzZSB7CisJCXF0ZCA9IGxpc3RfZW50cnkocWgtPnF0ZF9saXN0Lm5leHQsCisJCQkJc3RydWN0IGVoY2lfcXRkLCBxdGRfbGlzdCk7CisJCS8qIGZpcnN0IHF0ZCBtYXkgYWxyZWFkeSBiZSBwYXJ0aWFsbHkgcHJvY2Vzc2VkICovCisJCWlmIChjcHVfdG9fbGUzMihxdGQtPnF0ZF9kbWEpID09IHFoLT5od19jdXJyZW50KQorCQkJcXRkID0gTlVMTDsKKwl9CisKKwlpZiAocXRkKQorCQlxaF91cGRhdGUob3h1LCBxaCwgcXRkKTsKK30KKworc3RhdGljIHZvaWQgcXRkX2NvcHlfc3RhdHVzKHN0cnVjdCBveHVfaGNkICpveHUsIHN0cnVjdCB1cmIgKnVyYiwKKwkJCQlzaXplX3QgbGVuZ3RoLCB1MzIgdG9rZW4pCit7CisJLyogY291bnQgSU4vT1VUIGJ5dGVzLCBub3QgU0VUVVAgKGV2ZW4gc2hvcnQgcGFja2V0cykgKi8KKwlpZiAobGlrZWx5KFFURF9QSUQodG9rZW4pICE9IDIpKQorCQl1cmItPmFjdHVhbF9sZW5ndGggKz0gbGVuZ3RoIC0gUVREX0xFTkdUSCh0b2tlbik7CisKKwkvKiBkb24ndCBtb2RpZnkgZXJyb3IgY29kZXMgKi8KKwlpZiAodW5saWtlbHkodXJiLT5zdGF0dXMgIT0gLUVJTlBST0dSRVNTKSkKKwkJcmV0dXJuOworCisJLyogZm9yY2UgY2xlYW51cCBhZnRlciBzaG9ydCByZWFkOyBub3QgYWx3YXlzIGFuIGVycm9yICovCisJaWYgKHVubGlrZWx5KElTX1NIT1JUX1JFQUQodG9rZW4pKSkKKwkJdXJiLT5zdGF0dXMgPSAtRVJFTU9URUlPOworCisJLyogc2VyaW91cyAiY2FuJ3QgcHJvY2VlZCIgZmF1bHRzIHJlcG9ydGVkIGJ5IHRoZSBoYXJkd2FyZSAqLworCWlmICh0b2tlbiAmIFFURF9TVFNfSEFMVCkgeworCQlpZiAodG9rZW4gJiBRVERfU1RTX0JBQkJMRSkgeworCQkJLyogRklYTUUgIm11c3QiIGRpc2FibGUgYmFiYmxpbmcgZGV2aWNlJ3MgcG9ydCB0b28gKi8KKwkJCXVyYi0+c3RhdHVzID0gLUVPVkVSRkxPVzsKKwkJfSBlbHNlIGlmICh0b2tlbiAmIFFURF9TVFNfTU1GKSB7CisJCQkvKiBmcy9scyBpbnRlcnJ1cHQgeGZlciBtaXNzZWQgdGhlIGNvbXBsZXRlLXNwbGl0ICovCisJCQl1cmItPnN0YXR1cyA9IC1FUFJPVE87CisJCX0gZWxzZSBpZiAodG9rZW4gJiBRVERfU1RTX0RCRSkgeworCQkJdXJiLT5zdGF0dXMgPSAoUVREX1BJRCh0b2tlbikgPT0gMSkgLyogSU4gPyAqLworCQkJCT8gLUVOT1NSICAvKiBoYyBjb3VsZG4ndCByZWFkIGRhdGEgKi8KKwkJCQk6IC1FQ09NTTsgLyogaGMgY291bGRuJ3Qgd3JpdGUgZGF0YSAqLworCQl9IGVsc2UgaWYgKHRva2VuICYgUVREX1NUU19YQUNUKSB7CisJCQkvKiB0aW1lb3V0LCBiYWQgY3JjLCB3cm9uZyBQSUQsIGV0YzsgcmV0cmllZCAqLworCQkJaWYgKFFURF9DRVJSKHRva2VuKSkKKwkJCQl1cmItPnN0YXR1cyA9IC1FUElQRTsKKwkJCWVsc2UgeworCQkJCW94dV9kYmcob3h1LCAiZGV2cGF0aCAlcyBlcCVkJXMgM3N0cmlrZXNcbiIsCisJCQkJCXVyYi0+ZGV2LT5kZXZwYXRoLAorCQkJCQl1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSksCisJCQkJCXVzYl9waXBlaW4odXJiLT5waXBlKSA/ICJpbiIgOiAib3V0Iik7CisJCQkJdXJiLT5zdGF0dXMgPSAtRVBST1RPOworCQkJfQorCQkvKiBDRVJSIG5vbnplcm8gKyBubyBlcnJvcnMgKyBoYWx0IC0tPiBzdGFsbCAqLworCQl9IGVsc2UgaWYgKFFURF9DRVJSKHRva2VuKSkKKwkJCXVyYi0+c3RhdHVzID0gLUVQSVBFOworCQllbHNlCS8qIHVua25vd24gKi8KKwkJCXVyYi0+c3RhdHVzID0gLUVQUk9UTzsKKworCQlveHVfdmRiZyhveHUsICJkZXYlZCBlcCVkJXMgcXRkIHRva2VuICUwOHggLS0+IHN0YXR1cyAlZFxuIiwKKwkJCXVzYl9waXBlZGV2aWNlKHVyYi0+cGlwZSksCisJCQl1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSksCisJCQl1c2JfcGlwZWluKHVyYi0+cGlwZSkgPyAiaW4iIDogIm91dCIsCisJCQl0b2tlbiwgdXJiLT5zdGF0dXMpOworCX0KK30KKworc3RhdGljIHZvaWQgZWhjaV91cmJfZG9uZShzdHJ1Y3Qgb3h1X2hjZCAqb3h1LCBzdHJ1Y3QgdXJiICp1cmIpCitfX3JlbGVhc2VzKG94dS0+bG9jaykKK19fYWNxdWlyZXMob3h1LT5sb2NrKQoreworCWlmIChsaWtlbHkodXJiLT5oY3ByaXYgIT0gTlVMTCkpIHsKKwkJc3RydWN0IGVoY2lfcWgJKnFoID0gKHN0cnVjdCBlaGNpX3FoICopIHVyYi0+aGNwcml2OworCisJCS8qIFMtbWFzayBpbiBhIFFIIG1lYW5zIGl0J3MgYW4gaW50ZXJydXB0IHVyYiAqLworCQlpZiAoKHFoLT5od19pbmZvMiAmIF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoUUhfU01BU0spKSAhPSAwKSB7CisKKwkJCS8qIC4uLiB1cGRhdGUgaGMtd2lkZSBwZXJpb2RpYyBzdGF0cyAoZm9yIHVzYmZzKSAqLworCQkJb3h1X3RvX2hjZChveHUpLT5zZWxmLmJhbmR3aWR0aF9pbnRfcmVxcy0tOworCQl9CisJCXFoX3B1dChxaCk7CisJfQorCisJdXJiLT5oY3ByaXYgPSBOVUxMOworCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKKwljYXNlIC1FSU5QUk9HUkVTUzoJCS8qIHN1Y2Nlc3MgKi8KKwkJdXJiLT5zdGF0dXMgPSAwOworCWRlZmF1bHQ6CQkJLyogZmF1bHQgKi8KKwkJYnJlYWs7CisJY2FzZSAtRVJFTU9URUlPOgkJLyogZmF1bHQgb3Igbm9ybWFsICovCisJCWlmICghKHVyYi0+dHJhbnNmZXJfZmxhZ3MgJiBVUkJfU0hPUlRfTk9UX09LKSkKKwkJCXVyYi0+c3RhdHVzID0gMDsKKwkJYnJlYWs7CisJY2FzZSAtRUNPTk5SRVNFVDoJCS8qIGNhbmNlbGVkICovCisJY2FzZSAtRU5PRU5UOgorCQlicmVhazsKKwl9CisKKyNpZmRlZiBPWFVfVVJCX1RSQUNFCisJb3h1X2RiZyhveHUsICIlcyAlcyB1cmIgJXAgZXAlZCVzIHN0YXR1cyAlZCBsZW4gJWQvJWRcbiIsCisJCV9fZnVuY19fLCB1cmItPmRldi0+ZGV2cGF0aCwgdXJiLAorCQl1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSksCisJCXVzYl9waXBlaW4odXJiLT5waXBlKSA/ICJpbiIgOiAib3V0IiwKKwkJdXJiLT5zdGF0dXMsCisJCXVyYi0+YWN0dWFsX2xlbmd0aCwgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoKTsKKyNlbmRpZgorCisJLyogY29tcGxldGUoKSBjYW4gcmVlbnRlciB0aGlzIEhDRCAqLworCXNwaW5fdW5sb2NrKCZveHUtPmxvY2spOworCXVzYl9oY2RfZ2l2ZWJhY2tfdXJiKG94dV90b19oY2Qob3h1KSwgdXJiLCB1cmItPnN0YXR1cyk7CisJc3Bpbl9sb2NrKCZveHUtPmxvY2spOworfQorCitzdGF0aWMgdm9pZCBzdGFydF91bmxpbmtfYXN5bmMoc3RydWN0IG94dV9oY2QgKm94dSwgc3RydWN0IGVoY2lfcWggKnFoKTsKK3N0YXRpYyB2b2lkIHVubGlua19hc3luYyhzdHJ1Y3Qgb3h1X2hjZCAqb3h1LCBzdHJ1Y3QgZWhjaV9xaCAqcWgpOworCitzdGF0aWMgdm9pZCBpbnRyX2Rlc2NoZWR1bGUoc3RydWN0IG94dV9oY2QgKm94dSwgc3RydWN0IGVoY2lfcWggKnFoKTsKK3N0YXRpYyBpbnQgcWhfc2NoZWR1bGUoc3RydWN0IG94dV9oY2QgKm94dSwgc3RydWN0IGVoY2lfcWggKnFoKTsKKworI2RlZmluZSBIQUxUX0JJVCBfX2NvbnN0YW50X2NwdV90b19sZTMyKFFURF9TVFNfSEFMVCkKKworLyogUHJvY2VzcyBhbmQgZnJlZSBjb21wbGV0ZWQgcXRkcyBmb3IgYSBxaCwgcmV0dXJuaW5nIFVSQnMgdG8gZHJpdmVycy4KKyAqIENoYXNlcyB1cCB0byBxaC0+aHdfY3VycmVudC4gIFJldHVybnMgbnVtYmVyIG9mIGNvbXBsZXRpb25zIGNhbGxlZCwKKyAqIGluZGljYXRpbmcgaG93IG11Y2ggInJlYWwiIHdvcmsgd2UgZGlkLgorICovCitzdGF0aWMgdW5zaWduZWQgcWhfY29tcGxldGlvbnMoc3RydWN0IG94dV9oY2QgKm94dSwgc3RydWN0IGVoY2lfcWggKnFoKQoreworCXN0cnVjdCBlaGNpX3F0ZCAqbGFzdCA9IE5VTEwsICplbmQgPSBxaC0+ZHVtbXk7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnksICp0bXA7CisJaW50IHN0b3BwZWQ7CisJdW5zaWduZWQgY291bnQgPSAwOworCWludCBkb19zdGF0dXMgPSAwOworCXU4IHN0YXRlOworCXN0cnVjdCBveHVfbXVyYiAqbXVyYiA9IE5VTEw7CisKKwlpZiAodW5saWtlbHkobGlzdF9lbXB0eSgmcWgtPnF0ZF9saXN0KSkpCisJCXJldHVybiBjb3VudDsKKworCS8qIGNvbXBsZXRpb25zIChvciB0YXNrcyBvbiBvdGhlciBjcHVzKSBtdXN0IG5ldmVyIGNsb2JiZXIgSEFMVAorCSAqIHRpbGwgd2UndmUgZ29uZSB0aHJvdWdoIGFuZCBjbGVhbmVkIGV2ZXJ5dGhpbmcgdXAsIGV2ZW4gd2hlbgorCSAqIHRoZXkgYWRkIHVyYnMgdG8gdGhpcyBxaCdzIHF1ZXVlIG9yIG1hcmsgdGhlbSBmb3IgdW5saW5raW5nLgorCSAqCisJICogTk9URTogIHVubGlua2luZyBleHBlY3RzIHRvIGJlIGRvbmUgaW4gcXVldWUgb3JkZXIuCisJICovCisJc3RhdGUgPSBxaC0+cWhfc3RhdGU7CisJcWgtPnFoX3N0YXRlID0gUUhfU1RBVEVfQ09NUExFVElORzsKKwlzdG9wcGVkID0gKHN0YXRlID09IFFIX1NUQVRFX0lETEUpOworCisJLyogcmVtb3ZlIGRlLWFjdGl2YXRlZCBRVERzIGZyb20gZnJvbnQgb2YgcXVldWUuCisJICogYWZ0ZXIgZmF1bHRzIChpbmNsdWRpbmcgc2hvcnQgcmVhZHMpLCBjbGVhbnVwIHRoaXMgdXJiCisJICogdGhlbiBsZXQgdGhlIHF1ZXVlIGFkdmFuY2UuCisJICogaWYgcXVldWUgaXMgc3RvcHBlZCwgaGFuZGxlcyB1bmxpbmtzLgorCSAqLworCWxpc3RfZm9yX2VhY2hfc2FmZShlbnRyeSwgdG1wLCAmcWgtPnF0ZF9saXN0KSB7CisJCXN0cnVjdCBlaGNpX3F0ZAkqcXRkOworCQlzdHJ1Y3QgdXJiICp1cmI7CisJCXUzMiB0b2tlbiA9IDA7CisKKwkJcXRkID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGVoY2lfcXRkLCBxdGRfbGlzdCk7CisJCXVyYiA9IHF0ZC0+dXJiOworCisJCS8qIENsZWFuIHVwIGFueSBzdGF0ZSBmcm9tIHByZXZpb3VzIFFURCAuLi4qLworCQlpZiAobGFzdCkgeworCQkJaWYgKGxpa2VseShsYXN0LT51cmIgIT0gdXJiKSkgeworCQkJCWlmIChsYXN0LT51cmItPmNvbXBsZXRlID09IE5VTEwpIHsKKwkJCQkJbXVyYiA9IChzdHJ1Y3Qgb3h1X211cmIgKikgbGFzdC0+dXJiOworCQkJCQlsYXN0LT51cmIgPSBtdXJiLT5tYWluOworCQkJCQlpZiAobXVyYi0+bGFzdCkgeworCQkJCQkJZWhjaV91cmJfZG9uZShveHUsIGxhc3QtPnVyYik7CisJCQkJCQljb3VudCsrOworCQkJCQl9CisJCQkJCW94dV9tdXJiX2ZyZWUob3h1LCBtdXJiKTsKKwkJCQl9IGVsc2UgeworCQkJCQllaGNpX3VyYl9kb25lKG94dSwgbGFzdC0+dXJiKTsKKwkJCQkJY291bnQrKzsKKwkJCQl9CisJCQl9CisJCQlveHVfcXRkX2ZyZWUob3h1LCBsYXN0KTsKKwkJCWxhc3QgPSBOVUxMOworCQl9CisKKwkJLyogaWdub3JlIHVyYnMgc3VibWl0dGVkIGR1cmluZyBjb21wbGV0aW9ucyB3ZSByZXBvcnRlZCAqLworCQlpZiAocXRkID09IGVuZCkKKwkJCWJyZWFrOworCisJCS8qIGhhcmR3YXJlIGNvcGllcyBxdGQgb3V0IG9mIHFoIG92ZXJsYXkgKi8KKwkJcm1iKCk7CisJCXRva2VuID0gbGUzMl90b19jcHUocXRkLT5od190b2tlbik7CisKKwkJLyogYWx3YXlzIGNsZWFuIHVwIHF0ZHMgdGhlIGhjIGRlLWFjdGl2YXRlZCAqLworCQlpZiAoKHRva2VuICYgUVREX1NUU19BQ1RJVkUpID09IDApIHsKKworCQkJaWYgKCh0b2tlbiAmIFFURF9TVFNfSEFMVCkgIT0gMCkgeworCQkJCXN0b3BwZWQgPSAxOworCisJCQkvKiBtYWdpYyBkdW1teSBmb3Igc29tZSBzaG9ydCByZWFkczsgcWggd29uJ3QgYWR2YW5jZS4KKwkJCSAqIHRoYXQgc2lsaWNvbiBxdWlyayBjYW4ga2ljayBpbiB3aXRoIHRoaXMgZHVtbXkgdG9vLgorCQkJICovCisJCQl9IGVsc2UgaWYgKElTX1NIT1JUX1JFQUQodG9rZW4pICYmCisJCQkJCSEocXRkLT5od19hbHRfbmV4dCAmIEVIQ0lfTElTVF9FTkQpKSB7CisJCQkJc3RvcHBlZCA9IDE7CisJCQkJZ290byBoYWx0OworCQkJfQorCisJCS8qIHN0b3Agc2Nhbm5pbmcgd2hlbiB3ZSByZWFjaCBxdGRzIHRoZSBoYyBpcyB1c2luZyAqLworCQl9IGVsc2UgaWYgKGxpa2VseSghc3RvcHBlZCAmJgorCQkJCUhDX0lTX1JVTk5JTkcob3h1X3RvX2hjZChveHUpLT5zdGF0ZSkpKSB7CisJCQlicmVhazsKKworCQl9IGVsc2UgeworCQkJc3RvcHBlZCA9IDE7CisKKwkJCWlmICh1bmxpa2VseSghSENfSVNfUlVOTklORyhveHVfdG9faGNkKG94dSktPnN0YXRlKSkpCisJCQkJdXJiLT5zdGF0dXMgPSAtRVNIVVRET1dOOworCisJCQkvKiBpZ25vcmUgYWN0aXZlIHVyYnMgdW5sZXNzIHNvbWUgcHJldmlvdXMgcXRkCisJCQkgKiBmb3IgdGhlIHVyYiBmYXVsdGVkIChpbmNsdWRpbmcgc2hvcnQgcmVhZCkgb3IKKwkJCSAqIGl0cyB1cmIgd2FzIGNhbmNlbGVkLiAgd2UgbWF5IHBhdGNoIHFoIG9yIHF0ZHMuCisJCQkgKi8KKwkJCWlmIChsaWtlbHkodXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKSkKKwkJCQljb250aW51ZTsKKworCQkJLyogaXNzdWUgc3RhdHVzIGFmdGVyIHNob3J0IGNvbnRyb2wgcmVhZHMgKi8KKwkJCWlmICh1bmxpa2VseShkb19zdGF0dXMgIT0gMCkKKwkJCQkJJiYgUVREX1BJRCh0b2tlbikgPT0gMCAvKiBPVVQgKi8pIHsKKwkJCQlkb19zdGF0dXMgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKiB0b2tlbiBpbiBvdmVybGF5IG1heSBiZSBtb3N0IGN1cnJlbnQgKi8KKwkJCWlmIChzdGF0ZSA9PSBRSF9TVEFURV9JRExFCisJCQkJCSYmIGNwdV90b19sZTMyKHF0ZC0+cXRkX2RtYSkKKwkJCQkJCT09IHFoLT5od19jdXJyZW50KQorCQkJCXRva2VuID0gbGUzMl90b19jcHUocWgtPmh3X3Rva2VuKTsKKworCQkJLyogZm9yY2UgaGFsdCBmb3IgdW5saW5rZWQgb3IgYmxvY2tlZCBxaCwgc28gd2UnbGwKKwkJCSAqIHBhdGNoIHRoZSBxaCBsYXRlciBhbmQgc28gdGhhdCBjb21wbGV0aW9ucyBjYW4ndAorCQkJICogYWN0aXZhdGUgaXQgd2hpbGUgd2UgImtub3ciIGl0J3Mgc3RvcHBlZC4KKwkJCSAqLworCQkJaWYgKChIQUxUX0JJVCAmIHFoLT5od190b2tlbikgPT0gMCkgeworaGFsdDoKKwkJCQlxaC0+aHdfdG9rZW4gfD0gSEFMVF9CSVQ7CisJCQkJd21iKCk7CisJCQl9CisJCX0KKworCQkvKiBSZW1vdmUgaXQgZnJvbSB0aGUgcXVldWUgKi8KKwkJcXRkX2NvcHlfc3RhdHVzKG94dSwgdXJiLT5jb21wbGV0ZSA/CisJCQkJCXVyYiA6ICgoc3RydWN0IG94dV9tdXJiICopIHVyYiktPm1haW4sCisJCQkJcXRkLT5sZW5ndGgsIHRva2VuKTsKKwkJaWYgKCh1c2JfcGlwZWluKHF0ZC0+dXJiLT5waXBlKSkgJiYKKwkJCQkoTlVMTCAhPSBxdGQtPnRyYW5zZmVyX2J1ZmZlcikpCisJCQltZW1jcHkocXRkLT50cmFuc2Zlcl9idWZmZXIsIHF0ZC0+YnVmZmVyLCBxdGQtPmxlbmd0aCk7CisJCWRvX3N0YXR1cyA9ICh1cmItPnN0YXR1cyA9PSAtRVJFTU9URUlPKQorCQkJCSYmIHVzYl9waXBlY29udHJvbCh1cmItPnBpcGUpOworCisJCWlmIChzdG9wcGVkICYmIHF0ZC0+cXRkX2xpc3QucHJldiAhPSAmcWgtPnF0ZF9saXN0KSB7CisJCQlsYXN0ID0gbGlzdF9lbnRyeShxdGQtPnF0ZF9saXN0LnByZXYsCisJCQkJCXN0cnVjdCBlaGNpX3F0ZCwgcXRkX2xpc3QpOworCQkJbGFzdC0+aHdfbmV4dCA9IHF0ZC0+aHdfbmV4dDsKKwkJfQorCQlsaXN0X2RlbCgmcXRkLT5xdGRfbGlzdCk7CisJCWxhc3QgPSBxdGQ7CisJfQorCisJLyogbGFzdCB1cmIncyBjb21wbGV0aW9uIG1pZ2h0IHN0aWxsIG5lZWQgY2FsbGluZyAqLworCWlmIChsaWtlbHkobGFzdCAhPSBOVUxMKSkgeworCQlpZiAobGFzdC0+dXJiLT5jb21wbGV0ZSA9PSBOVUxMKSB7CisJCQltdXJiID0gKHN0cnVjdCBveHVfbXVyYiAqKSBsYXN0LT51cmI7CisJCQlsYXN0LT51cmIgPSBtdXJiLT5tYWluOworCQkJaWYgKG11cmItPmxhc3QpIHsKKwkJCQllaGNpX3VyYl9kb25lKG94dSwgbGFzdC0+dXJiKTsKKwkJCQljb3VudCsrOworCQkJfQorCQkJb3h1X211cmJfZnJlZShveHUsIG11cmIpOworCQl9IGVsc2UgeworCQkJZWhjaV91cmJfZG9uZShveHUsIGxhc3QtPnVyYik7CisJCQljb3VudCsrOworCQl9CisJCW94dV9xdGRfZnJlZShveHUsIGxhc3QpOworCX0KKworCS8qIHJlc3RvcmUgb3JpZ2luYWwgc3RhdGU7IGNhbGxlciBtdXN0IHVubGluayBvciByZWxpbmsgKi8KKwlxaC0+cWhfc3RhdGUgPSBzdGF0ZTsKKworCS8qIGJlIHN1cmUgdGhlIGhhcmR3YXJlJ3MgZG9uZSB3aXRoIHRoZSBxaCBiZWZvcmUgcmVmcmVzaGluZworCSAqIGl0IGFmdGVyIGZhdWx0IGNsZWFudXAsIG9yIHJlY292ZXJpbmcgZnJvbSBzaWxpY29uIHdyb25nbHkKKwkgKiBvdmVybGF5aW5nIHRoZSBkdW1teSBxdGQgKHdoaWNoIHJlZHVjZXMgRE1BIGNoYXR0ZXIpLgorCSAqLworCWlmIChzdG9wcGVkICE9IDAgfHwgcWgtPmh3X3F0ZF9uZXh0ID09IEVIQ0lfTElTVF9FTkQpIHsKKwkJc3dpdGNoIChzdGF0ZSkgeworCQljYXNlIFFIX1NUQVRFX0lETEU6CisJCQlxaF9yZWZyZXNoKG94dSwgcWgpOworCQkJYnJlYWs7CisJCWNhc2UgUUhfU1RBVEVfTElOS0VEOgorCQkJLyogc2hvdWxkIGJlIHJhcmUgZm9yIHBlcmlvZGljIHRyYW5zZmVycywKKwkJCSAqIGV4Y2VwdCBtYXliZSBoaWdoIGJhbmR3aWR0aCAuLi4KKwkJCSAqLworCQkJaWYgKChfX2NvbnN0YW50X2NwdV90b19sZTMyKFFIX1NNQVNLKQorCQkJCQkmIHFoLT5od19pbmZvMikgIT0gMCkgeworCQkJCWludHJfZGVzY2hlZHVsZShveHUsIHFoKTsKKwkJCQkodm9pZCkgcWhfc2NoZWR1bGUob3h1LCBxaCk7CisJCQl9IGVsc2UKKwkJCQl1bmxpbmtfYXN5bmMob3h1LCBxaCk7CisJCQlicmVhazsKKwkJLyogb3RoZXJ3aXNlLCB1bmxpbmsgYWxyZWFkeSBzdGFydGVkICovCisJCX0KKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qIEhpZ2ggYmFuZHdpZHRoIG11bHRpcGxpZXIsIGFzIGVuY29kZWQgaW4gaGlnaHNwZWVkIGVuZHBvaW50IGRlc2NyaXB0b3JzICovCisjZGVmaW5lIGhiX211bHQod01heFBhY2tldFNpemUpCQkoMSArICgoKHdNYXhQYWNrZXRTaXplKSA+PiAxMSkgJiAweDAzKSkKKy8qIC4uLiBhbmQgcGFja2V0IHNpemUsIGZvciBhbnkga2luZCBvZiBlbmRwb2ludCBkZXNjcmlwdG9yICovCisjZGVmaW5lIG1heF9wYWNrZXQod01heFBhY2tldFNpemUpCSgod01heFBhY2tldFNpemUpICYgMHgwN2ZmKQorCisvKiBSZXZlcnNlIG9mIHFoX3VyYl90cmFuc2FjdGlvbjogZnJlZSBhIGxpc3Qgb2YgVERzLgorICogdXNlZCBmb3IgY2xlYW51cCBhZnRlciBlcnJvcnMsIGJlZm9yZSBIQyBzZWVzIGFuIFVSQidzIFREcy4KKyAqLworc3RhdGljIHZvaWQgcXRkX2xpc3RfZnJlZShzdHJ1Y3Qgb3h1X2hjZCAqb3h1LAorCQkJCXN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IGxpc3RfaGVhZCAqcXRkX2xpc3QpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnksICp0ZW1wOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKGVudHJ5LCB0ZW1wLCBxdGRfbGlzdCkgeworCQlzdHJ1Y3QgZWhjaV9xdGQJKnF0ZDsKKworCQlxdGQgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgZWhjaV9xdGQsIHF0ZF9saXN0KTsKKwkJbGlzdF9kZWwoJnF0ZC0+cXRkX2xpc3QpOworCQlveHVfcXRkX2ZyZWUob3h1LCBxdGQpOworCX0KK30KKworLyogQ3JlYXRlIGEgbGlzdCBvZiBmaWxsZWQgcXRkcyBmb3IgdGhpcyBVUkI7IHdvbid0IGxpbmsgaW50byBxaC4KKyAqLworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgKnFoX3VyYl90cmFuc2FjdGlvbihzdHJ1Y3Qgb3h1X2hjZCAqb3h1LAorCQkJCQkJc3RydWN0IHVyYiAqdXJiLAorCQkJCQkJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwKKwkJCQkJCWdmcF90IGZsYWdzKQoreworCXN0cnVjdCBlaGNpX3F0ZAkqcXRkLCAqcXRkX3ByZXY7CisJZG1hX2FkZHJfdCBidWY7CisJaW50IGxlbiwgbWF4cGFja2V0OworCWludCBpc19pbnB1dDsKKwl1MzIgdG9rZW47CisJdm9pZCAqdHJhbnNmZXJfYnVmID0gTlVMTDsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBVUkJzIG1hcCB0byBzZXF1ZW5jZXMgb2YgUVREczogb25lIGxvZ2ljYWwgdHJhbnNhY3Rpb24KKwkgKi8KKwlxdGQgPSBlaGNpX3F0ZF9hbGxvYyhveHUpOworCWlmICh1bmxpa2VseSghcXRkKSkKKwkJcmV0dXJuIE5VTEw7CisJbGlzdF9hZGRfdGFpbCgmcXRkLT5xdGRfbGlzdCwgaGVhZCk7CisJcXRkLT51cmIgPSB1cmI7CisKKwl0b2tlbiA9IFFURF9TVFNfQUNUSVZFOworCXRva2VuIHw9IChFSENJX1RVTkVfQ0VSUiA8PCAxMCk7CisJLyogZm9yIHNwbGl0IHRyYW5zYWN0aW9ucywgU3BsaXRYU3RhdGUgaW5pdGlhbGl6ZWQgdG8gemVybyAqLworCisJbGVuID0gdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoOworCWlzX2lucHV0ID0gdXNiX3BpcGVpbih1cmItPnBpcGUpOworCWlmICghdXJiLT50cmFuc2Zlcl9idWZmZXIgJiYgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoICYmIGlzX2lucHV0KQorCQl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IHBoeXNfdG9fdmlydCh1cmItPnRyYW5zZmVyX2RtYSk7CisKKwlpZiAodXNiX3BpcGVjb250cm9sKHVyYi0+cGlwZSkpIHsKKwkJLyogU0VUVVAgcGlkICovCisJCXJldCA9IG94dV9idWZfYWxsb2Mob3h1LCBxdGQsIHNpemVvZihzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0KSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGNsZWFudXA7CisKKwkJcXRkX2ZpbGwocXRkLCBxdGQtPmJ1ZmZlcl9kbWEsIHNpemVvZihzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0KSwKKwkJCQl0b2tlbiB8ICgyIC8qICJzZXR1cCIgKi8gPDwgOCksIDgpOworCQltZW1jcHkocXRkLT5idWZmZXIsIHF0ZC0+dXJiLT5zZXR1cF9wYWNrZXQsCisJCQkJc2l6ZW9mKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QpKTsKKworCQkvKiAuLi4gYW5kIGFsd2F5cyBhdCBsZWFzdCBvbmUgbW9yZSBwaWQgKi8KKwkJdG9rZW4gXj0gUVREX1RPR0dMRTsKKwkJcXRkX3ByZXYgPSBxdGQ7CisJCXF0ZCA9IGVoY2lfcXRkX2FsbG9jKG94dSk7CisJCWlmICh1bmxpa2VseSghcXRkKSkKKwkJCWdvdG8gY2xlYW51cDsKKwkJcXRkLT51cmIgPSB1cmI7CisJCXF0ZF9wcmV2LT5od19uZXh0ID0gUVREX05FWFQocXRkLT5xdGRfZG1hKTsKKwkJbGlzdF9hZGRfdGFpbCgmcXRkLT5xdGRfbGlzdCwgaGVhZCk7CisKKwkJLyogZm9yIHplcm8gbGVuZ3RoIERBVEEgc3RhZ2VzLCBTVEFUVVMgaXMgYWx3YXlzIElOICovCisJCWlmIChsZW4gPT0gMCkKKwkJCXRva2VuIHw9ICgxIC8qICJpbiIgKi8gPDwgOCk7CisJfQorCisJLyoKKwkgKiBEYXRhIHRyYW5zZmVyIHN0YWdlOiBidWZmZXIgc2V0dXAKKwkgKi8KKworCXJldCA9IG94dV9idWZfYWxsb2Mob3h1LCBxdGQsIGxlbik7CisJaWYgKHJldCkKKwkJZ290byBjbGVhbnVwOworCisJYnVmID0gcXRkLT5idWZmZXJfZG1hOworCXRyYW5zZmVyX2J1ZiA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOworCisJaWYgKCFpc19pbnB1dCkKKwkJbWVtY3B5KHF0ZC0+YnVmZmVyLCBxdGQtPnVyYi0+dHJhbnNmZXJfYnVmZmVyLCBsZW4pOworCisJaWYgKGlzX2lucHV0KQorCQl0b2tlbiB8PSAoMSAvKiAiaW4iICovIDw8IDgpOworCS8qIGVsc2UgaXQncyBhbHJlYWR5IGluaXR0ZWQgdG8gIm91dCIgcGlkICgwIDw8IDgpICovCisKKwltYXhwYWNrZXQgPSBtYXhfcGFja2V0KHVzYl9tYXhwYWNrZXQodXJiLT5kZXYsIHVyYi0+cGlwZSwgIWlzX2lucHV0KSk7CisKKwkvKgorCSAqIGJ1ZmZlciBnZXRzIHdyYXBwZWQgaW4gb25lIG9yIG1vcmUgcXRkczsKKwkgKiBsYXN0IG9uZSBtYXkgYmUgInNob3J0IiAoaW5jbHVkaW5nIHplcm8gbGVuKQorCSAqIGFuZCBtYXkgc2VydmUgYXMgYSBjb250cm9sIHN0YXR1cyBhY2sKKwkgKi8KKwlmb3IgKDs7KSB7CisJCWludCB0aGlzX3F0ZF9sZW47CisKKwkJdGhpc19xdGRfbGVuID0gcXRkX2ZpbGwocXRkLCBidWYsIGxlbiwgdG9rZW4sIG1heHBhY2tldCk7CisJCXF0ZC0+dHJhbnNmZXJfYnVmZmVyID0gdHJhbnNmZXJfYnVmOworCQlsZW4gLT0gdGhpc19xdGRfbGVuOworCQlidWYgKz0gdGhpc19xdGRfbGVuOworCQl0cmFuc2Zlcl9idWYgKz0gdGhpc19xdGRfbGVuOworCQlpZiAoaXNfaW5wdXQpCisJCQlxdGQtPmh3X2FsdF9uZXh0ID0gb3h1LT5hc3luYy0+aHdfYWx0X25leHQ7CisKKwkJLyogcWggbWFrZXMgY29udHJvbCBwYWNrZXRzIHVzZSBxdGQgdG9nZ2xlOyBtYXliZSBzd2l0Y2ggaXQgKi8KKwkJaWYgKChtYXhwYWNrZXQgJiAodGhpc19xdGRfbGVuICsgKG1heHBhY2tldCAtIDEpKSkgPT0gMCkKKwkJCXRva2VuIF49IFFURF9UT0dHTEU7CisKKwkJaWYgKGxpa2VseShsZW4gPD0gMCkpCisJCQlicmVhazsKKworCQlxdGRfcHJldiA9IHF0ZDsKKwkJcXRkID0gZWhjaV9xdGRfYWxsb2Mob3h1KTsKKwkJaWYgKHVubGlrZWx5KCFxdGQpKQorCQkJZ290byBjbGVhbnVwOworCQlpZiAobGlrZWx5KGxlbiA+IDApKSB7CisJCQlyZXQgPSBveHVfYnVmX2FsbG9jKG94dSwgcXRkLCBsZW4pOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGNsZWFudXA7CisJCX0KKwkJcXRkLT51cmIgPSB1cmI7CisJCXF0ZF9wcmV2LT5od19uZXh0ID0gUVREX05FWFQocXRkLT5xdGRfZG1hKTsKKwkJbGlzdF9hZGRfdGFpbCgmcXRkLT5xdGRfbGlzdCwgaGVhZCk7CisJfQorCisJLyogdW5sZXNzIHRoZSBidWxrL2ludGVycnVwdCBjYWxsZXIgd2FudHMgYSBjaGFuY2UgdG8gY2xlYW4KKwkgKiB1cCBhZnRlciBzaG9ydCByZWFkcywgaGMgc2hvdWxkIGFkdmFuY2UgcWggcGFzdCB0aGlzIHVyYgorCSAqLworCWlmIChsaWtlbHkoKHVyYi0+dHJhbnNmZXJfZmxhZ3MgJiBVUkJfU0hPUlRfTk9UX09LKSA9PSAwCisJCQkJfHwgdXNiX3BpcGVjb250cm9sKHVyYi0+cGlwZSkpKQorCQlxdGQtPmh3X2FsdF9uZXh0ID0gRUhDSV9MSVNUX0VORDsKKworCS8qCisJICogY29udHJvbCByZXF1ZXN0cyBtYXkgbmVlZCBhIHRlcm1pbmF0aW5nIGRhdGEgInN0YXR1cyIgYWNrOworCSAqIGJ1bGsgb25lcyBtYXkgbmVlZCBhIHRlcm1pbmF0aW5nIHNob3J0IHBhY2tldCAoemVybyBsZW5ndGgpLgorCSAqLworCWlmIChsaWtlbHkodXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoICE9IDApKSB7CisJCWludAlvbmVfbW9yZSA9IDA7CisKKwkJaWYgKHVzYl9waXBlY29udHJvbCh1cmItPnBpcGUpKSB7CisJCQlvbmVfbW9yZSA9IDE7CisJCQl0b2tlbiBePSAweDAxMDA7CS8qICJpbiIgPC0tPiAib3V0IiAgKi8KKwkJCXRva2VuIHw9IFFURF9UT0dHTEU7CS8qIGZvcmNlIERBVEExICovCisJCX0gZWxzZSBpZiAodXNiX3BpcGVidWxrKHVyYi0+cGlwZSkKKwkJCQkmJiAodXJiLT50cmFuc2Zlcl9mbGFncyAmIFVSQl9aRVJPX1BBQ0tFVCkKKwkJCQkmJiAhKHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCAlIG1heHBhY2tldCkpIHsKKwkJCW9uZV9tb3JlID0gMTsKKwkJfQorCQlpZiAob25lX21vcmUpIHsKKwkJCXF0ZF9wcmV2ID0gcXRkOworCQkJcXRkID0gZWhjaV9xdGRfYWxsb2Mob3h1KTsKKwkJCWlmICh1bmxpa2VseSghcXRkKSkKKwkJCQlnb3RvIGNsZWFudXA7CisJCQlxdGQtPnVyYiA9IHVyYjsKKwkJCXF0ZF9wcmV2LT5od19uZXh0ID0gUVREX05FWFQocXRkLT5xdGRfZG1hKTsKKwkJCWxpc3RfYWRkX3RhaWwoJnF0ZC0+cXRkX2xpc3QsIGhlYWQpOworCisJCQkvKiBuZXZlciBhbnkgZGF0YSBpbiBzdWNoIHBhY2tldHMgKi8KKwkJCXF0ZF9maWxsKHF0ZCwgMCwgMCwgdG9rZW4sIDApOworCQl9CisJfQorCisJLyogYnkgZGVmYXVsdCwgZW5hYmxlIGludGVycnVwdCBvbiB1cmIgY29tcGxldGlvbiAqLworCQlxdGQtPmh3X3Rva2VuIHw9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoUVREX0lPQyk7CisJcmV0dXJuIGhlYWQ7CisKK2NsZWFudXA6CisJcXRkX2xpc3RfZnJlZShveHUsIHVyYiwgaGVhZCk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIEVhY2ggUUggaG9sZHMgYSBxdGQgbGlzdDsgYSBRSCBpcyB1c2VkIGZvciBldmVyeXRoaW5nIGV4Y2VwdCBpc28uCisgKgorICogRm9yIGludGVycnVwdCB1cmJzLCB0aGUgc2NoZWR1bGVyIG11c3Qgc2V0IHRoZSBtaWNyb2ZyYW1lIHNjaGVkdWxpbmcKKyAqIG1hc2socykgZWFjaCB0aW1lIHRoZSBRSCBnZXRzIHNjaGVkdWxlZC4gIEZvciBoaWdoc3BlZWQsIHRoYXQncworICoganVzdCBvbmUgbWljcm9mcmFtZSBpbiB0aGUgcy1tYXNrLiAgRm9yIHNwbGl0IGludGVycnVwdCB0cmFuc2FjdGlvbnMKKyAqIHRoZXJlIGFyZSBhZGRpdGlvbmFsIGNvbXBsaWNhdGlvbnM6IGMtbWFzaywgbWF5YmUgRlNUTnMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZWhjaV9xaCAqcWhfbWFrZShzdHJ1Y3Qgb3h1X2hjZCAqb3h1LAorCQkJCXN0cnVjdCB1cmIgKnVyYiwgZ2ZwX3QgZmxhZ3MpCit7CisJc3RydWN0IGVoY2lfcWggKnFoID0gb3h1X3FoX2FsbG9jKG94dSk7CisJdTMyIGluZm8xID0gMCwgaW5mbzIgPSAwOworCWludCBpc19pbnB1dCwgdHlwZTsKKwlpbnQgbWF4cCA9IDA7CisKKwlpZiAoIXFoKQorCQlyZXR1cm4gcWg7CisKKwkvKgorCSAqIGluaXQgZW5kcG9pbnQvZGV2aWNlIGRhdGEgZm9yIHRoaXMgUUgKKwkgKi8KKwlpbmZvMSB8PSB1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSkgPDwgODsKKwlpbmZvMSB8PSB1c2JfcGlwZWRldmljZSh1cmItPnBpcGUpIDw8IDA7CisKKwlpc19pbnB1dCA9IHVzYl9waXBlaW4odXJiLT5waXBlKTsKKwl0eXBlID0gdXNiX3BpcGV0eXBlKHVyYi0+cGlwZSk7CisJbWF4cCA9IHVzYl9tYXhwYWNrZXQodXJiLT5kZXYsIHVyYi0+cGlwZSwgIWlzX2lucHV0KTsKKworCS8qIENvbXB1dGUgaW50ZXJydXB0IHNjaGVkdWxpbmcgcGFyYW1ldGVycyBqdXN0IG9uY2UsIGFuZCBzYXZlLgorCSAqIC0gYWxsb3dpbmcgZm9yIGhpZ2ggYmFuZHdpZHRoLCBob3cgbWFueSBuc2VjL3VmcmFtZSBhcmUgdXNlZD8KKwkgKiAtIHNwbGl0IHRyYW5zYWN0aW9ucyBuZWVkIGEgc2Vjb25kIENTUExJVCB1ZnJhbWU7IHNhbWUgcXVlc3Rpb24KKwkgKiAtIHNwbGl0cyBhbHNvIG5lZWQgYSBzY2hlZHVsZSBnYXAgKGZvciBmdWxsL2xvdyBzcGVlZCBJL08pCisJICogLSBxaCBoYXMgYSBwb2xsaW5nIGludGVydmFsCisJICoKKwkgKiBGb3IgY29udHJvbC9idWxrIHJlcXVlc3RzLCB0aGUgSEMgb3IgVFQgaGFuZGxlcyB0aGVzZS4KKwkgKi8KKwlpZiAodHlwZSA9PSBQSVBFX0lOVEVSUlVQVCkgeworCQlxaC0+dXNlY3MgPSBOU19UT19VUyh1c2JfY2FsY19idXNfdGltZShVU0JfU1BFRURfSElHSCwKKwkJCQkJCQkJaXNfaW5wdXQsIDAsCisJCQkJaGJfbXVsdChtYXhwKSAqIG1heF9wYWNrZXQobWF4cCkpKTsKKwkJcWgtPnN0YXJ0ID0gTk9fRlJBTUU7CisKKwkJaWYgKHVyYi0+ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCkgeworCQkJcWgtPmNfdXNlY3MgPSAwOworCQkJcWgtPmdhcF91ZiA9IDA7CisKKwkJCXFoLT5wZXJpb2QgPSB1cmItPmludGVydmFsID4+IDM7CisJCQlpZiAocWgtPnBlcmlvZCA9PSAwICYmIHVyYi0+aW50ZXJ2YWwgIT0gMSkgeworCQkJCS8qIE5PVEUgaW50ZXJ2YWwgMiBvciA0IHVmcmFtZXMgY291bGQgd29yay4KKwkJCQkgKiBCdXQgaW50ZXJ2YWwgMSBzY2hlZHVsaW5nIGlzIHNpbXBsZXIsIGFuZAorCQkJCSAqIGluY2x1ZGVzIGhpZ2ggYmFuZHdpZHRoLgorCQkJCSAqLworCQkJCWRiZygiaW50ciBwZXJpb2QgJWQgdWZyYW1lcywgTllFVCEiLAorCQkJCQkJdXJiLT5pbnRlcnZhbCk7CisJCQkJZ290byBkb25lOworCQkJfQorCQl9IGVsc2UgeworCQkJc3RydWN0IHVzYl90dAkqdHQgPSB1cmItPmRldi0+dHQ7CisJCQlpbnQJCXRoaW5rX3RpbWU7CisKKwkJCS8qIGdhcCBpcyBmKEZTL0xTIHRyYW5zZmVyIHRpbWVzKSAqLworCQkJcWgtPmdhcF91ZiA9IDEgKyB1c2JfY2FsY19idXNfdGltZSh1cmItPmRldi0+c3BlZWQsCisJCQkJCWlzX2lucHV0LCAwLCBtYXhwKSAvICgxMjUgKiAxMDAwKTsKKworCQkJLyogRklYTUUgdGhpcyBqdXN0IGFwcHJveGltYXRlcyBTUExJVC9DU1BMSVQgdGltZXMgKi8KKwkJCWlmIChpc19pbnB1dCkgewkJLyogU1BMSVQsIGdhcCwgQ1NQTElUK0RBVEEgKi8KKwkJCQlxaC0+Y191c2VjcyA9IHFoLT51c2VjcyArIEhTX1VTRUNTKDApOworCQkJCXFoLT51c2VjcyA9IEhTX1VTRUNTKDEpOworCQkJfSBlbHNlIHsJCS8qIFNQTElUK0RBVEEsIGdhcCwgQ1NQTElUICovCisJCQkJcWgtPnVzZWNzICs9IEhTX1VTRUNTKDEpOworCQkJCXFoLT5jX3VzZWNzID0gSFNfVVNFQ1MoMCk7CisJCQl9CisKKwkJCXRoaW5rX3RpbWUgPSB0dCA/IHR0LT50aGlua190aW1lIDogMDsKKwkJCXFoLT50dF91c2VjcyA9IE5TX1RPX1VTKHRoaW5rX3RpbWUgKworCQkJCQl1c2JfY2FsY19idXNfdGltZSh1cmItPmRldi0+c3BlZWQsCisJCQkJCWlzX2lucHV0LCAwLCBtYXhfcGFja2V0KG1heHApKSk7CisJCQlxaC0+cGVyaW9kID0gdXJiLT5pbnRlcnZhbDsKKwkJfQorCX0KKworCS8qIHN1cHBvcnQgZm9yIHR0IHNjaGVkdWxpbmcsIGFuZCBhY2Nlc3MgdG8gdG9nZ2xlcyAqLworCXFoLT5kZXYgPSB1cmItPmRldjsKKworCS8qIHVzaW5nIFRUPyAqLworCXN3aXRjaCAodXJiLT5kZXYtPnNwZWVkKSB7CisJY2FzZSBVU0JfU1BFRURfTE9XOgorCQlpbmZvMSB8PSAoMSA8PCAxMik7CS8qIEVQUyAibG93IiAqLworCQkvKiBGQUxMIFRIUk9VR0ggKi8KKworCWNhc2UgVVNCX1NQRUVEX0ZVTEw6CisJCS8qIEVQUyAwIG1lYW5zICJmdWxsIiAqLworCQlpZiAodHlwZSAhPSBQSVBFX0lOVEVSUlVQVCkKKwkJCWluZm8xIHw9IChFSENJX1RVTkVfUkxfVFQgPDwgMjgpOworCQlpZiAodHlwZSA9PSBQSVBFX0NPTlRST0wpIHsKKwkJCWluZm8xIHw9ICgxIDw8IDI3KTsJLyogZm9yIFRUICovCisJCQlpbmZvMSB8PSAxIDw8IDE0OwkvKiB0b2dnbGUgZnJvbSBxdGQgKi8KKwkJfQorCQlpbmZvMSB8PSBtYXhwIDw8IDE2OworCisJCWluZm8yIHw9IChFSENJX1RVTkVfTVVMVF9UVCA8PCAzMCk7CisJCWluZm8yIHw9IHVyYi0+ZGV2LT50dHBvcnQgPDwgMjM7CisKKwkJLyogTk9URTogIGlmIChQSVBFX0lOVEVSUlVQVCkgeyBzY2hlZHVsZXIgc2V0cyBjLW1hc2sgfSAqLworCisJCWJyZWFrOworCisJY2FzZSBVU0JfU1BFRURfSElHSDoJCS8qIG5vIFRUIGludm9sdmVkICovCisJCWluZm8xIHw9ICgyIDw8IDEyKTsJLyogRVBTICJoaWdoIiAqLworCQlpZiAodHlwZSA9PSBQSVBFX0NPTlRST0wpIHsKKwkJCWluZm8xIHw9IChFSENJX1RVTkVfUkxfSFMgPDwgMjgpOworCQkJaW5mbzEgfD0gNjQgPDwgMTY7CS8qIHVzYjIgZml4ZWQgbWF4cGFja2V0ICovCisJCQlpbmZvMSB8PSAxIDw8IDE0OwkvKiB0b2dnbGUgZnJvbSBxdGQgKi8KKwkJCWluZm8yIHw9IChFSENJX1RVTkVfTVVMVF9IUyA8PCAzMCk7CisJCX0gZWxzZSBpZiAodHlwZSA9PSBQSVBFX0JVTEspIHsKKwkJCWluZm8xIHw9IChFSENJX1RVTkVfUkxfSFMgPDwgMjgpOworCQkJaW5mbzEgfD0gNTEyIDw8IDE2OwkvKiB1c2IyIGZpeGVkIG1heHBhY2tldCAqLworCQkJaW5mbzIgfD0gKEVIQ0lfVFVORV9NVUxUX0hTIDw8IDMwKTsKKwkJfSBlbHNlIHsJCS8qIFBJUEVfSU5URVJSVVBUICovCisJCQlpbmZvMSB8PSBtYXhfcGFja2V0KG1heHApIDw8IDE2OworCQkJaW5mbzIgfD0gaGJfbXVsdChtYXhwKSA8PCAzMDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlkYmcoImJvZ3VzIGRldiAlcCBzcGVlZCAlZCIsIHVyYi0+ZGV2LCB1cmItPmRldi0+c3BlZWQpOworZG9uZToKKwkJcWhfcHV0KHFoKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogTk9URTogIGlmIChQSVBFX0lOVEVSUlVQVCkgeyBzY2hlZHVsZXIgc2V0cyBzLW1hc2sgfSAqLworCisJLyogaW5pdCBhcyBsaXZlLCB0b2dnbGUgY2xlYXIsIGFkdmFuY2UgdG8gZHVtbXkgKi8KKwlxaC0+cWhfc3RhdGUgPSBRSF9TVEFURV9JRExFOworCXFoLT5od19pbmZvMSA9IGNwdV90b19sZTMyKGluZm8xKTsKKwlxaC0+aHdfaW5mbzIgPSBjcHVfdG9fbGUzMihpbmZvMik7CisJdXNiX3NldHRvZ2dsZSh1cmItPmRldiwgdXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpLCAhaXNfaW5wdXQsIDEpOworCXFoX3JlZnJlc2gob3h1LCBxaCk7CisJcmV0dXJuIHFoOworfQorCisvKiBNb3ZlIHFoIChhbmQgaXRzIHF0ZHMpIG9udG8gYXN5bmMgcXVldWU7IG1heWJlIGVuYWJsZSBxdWV1ZS4KKyAqLworc3RhdGljIHZvaWQgcWhfbGlua19hc3luYyhzdHJ1Y3Qgb3h1X2hjZCAqb3h1LCBzdHJ1Y3QgZWhjaV9xaCAqcWgpCit7CisJX19sZTMyIGRtYSA9IFFIX05FWFQocWgtPnFoX2RtYSk7CisJc3RydWN0IGVoY2lfcWggKmhlYWQ7CisKKwkvKiAocmUpc3RhcnQgdGhlIGFzeW5jIHNjaGVkdWxlPyAqLworCWhlYWQgPSBveHUtPmFzeW5jOworCXRpbWVyX2FjdGlvbl9kb25lKG94dSwgVElNRVJfQVNZTkNfT0ZGKTsKKwlpZiAoIWhlYWQtPnFoX25leHQucWgpIHsKKwkJdTMyCWNtZCA9IHJlYWRsKCZveHUtPnJlZ3MtPmNvbW1hbmQpOworCisJCWlmICghKGNtZCAmIENNRF9BU0UpKSB7CisJCQkvKiBpbiBjYXNlIGEgY2xlYXIgb2YgQ01EX0FTRSBkaWRuJ3QgdGFrZSB5ZXQgKi8KKwkJCSh2b2lkKWhhbmRzaGFrZShveHUsICZveHUtPnJlZ3MtPnN0YXR1cywKKwkJCQkJU1RTX0FTUywgMCwgMTUwKTsKKwkJCWNtZCB8PSBDTURfQVNFIHwgQ01EX1JVTjsKKwkJCXdyaXRlbChjbWQsICZveHUtPnJlZ3MtPmNvbW1hbmQpOworCQkJb3h1X3RvX2hjZChveHUpLT5zdGF0ZSA9IEhDX1NUQVRFX1JVTk5JTkc7CisJCQkvKiBwb3N0ZWQgd3JpdGUgbmVlZCBub3QgYmUga25vd24gdG8gSEMgeWV0IC4uLiAqLworCQl9CisJfQorCisJLyogY2xlYXIgaGFsdCBhbmQvb3IgdG9nZ2xlOyBhbmQgbWF5YmUgcmVjb3ZlciBmcm9tIHNpbGljb24gcXVpcmsgKi8KKwlpZiAocWgtPnFoX3N0YXRlID09IFFIX1NUQVRFX0lETEUpCisJCXFoX3JlZnJlc2gob3h1LCBxaCk7CisKKwkvKiBzcGxpY2UgcmlnaHQgYWZ0ZXIgc3RhcnQgKi8KKwlxaC0+cWhfbmV4dCA9IGhlYWQtPnFoX25leHQ7CisJcWgtPmh3X25leHQgPSBoZWFkLT5od19uZXh0OworCXdtYigpOworCisJaGVhZC0+cWhfbmV4dC5xaCA9IHFoOworCWhlYWQtPmh3X25leHQgPSBkbWE7CisKKwlxaC0+cWhfc3RhdGUgPSBRSF9TVEFURV9MSU5LRUQ7CisJLyogcXRkIGNvbXBsZXRpb25zIHJlcG9ydGVkIGxhdGVyIGJ5IGludGVycnVwdCAqLworfQorCisjZGVmaW5lCVFIX0FERFJfTUFTSwlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4N2YpCisKKy8qCisgKiBGb3IgY29udHJvbC9idWxrL2ludGVycnVwdCwgcmV0dXJuIFFIIHdpdGggdGhlc2UgVERzIGFwcGVuZGVkLgorICogQWxsb2NhdGVzIGFuZCBpbml0aWFsaXplcyB0aGUgUUggaWYgbmVjZXNzYXJ5LgorICogUmV0dXJucyBudWxsIGlmIGl0IGNhbid0IGFsbG9jYXRlIGEgUUggaXQgbmVlZHMgdG8uCisgKiBJZiB0aGUgUUggaGFzIFREcyAodXJicykgYWxyZWFkeSwgdGhhdCdzIGdyZWF0LgorICovCitzdGF0aWMgc3RydWN0IGVoY2lfcWggKnFoX2FwcGVuZF90ZHMoc3RydWN0IG94dV9oY2QgKm94dSwKKwkJCQlzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBsaXN0X2hlYWQgKnF0ZF9saXN0LAorCQkJCWludCBlcG51bSwgdm9pZAkqKnB0cikKK3sKKwlzdHJ1Y3QgZWhjaV9xaCAqcWggPSBOVUxMOworCisJcWggPSAoc3RydWN0IGVoY2lfcWggKikgKnB0cjsKKwlpZiAodW5saWtlbHkocWggPT0gTlVMTCkpIHsKKwkJLyogY2FuJ3Qgc2xlZXAgaGVyZSwgd2UgaGF2ZSBveHUtPmxvY2suLi4gKi8KKwkJcWggPSBxaF9tYWtlKG94dSwgdXJiLCBHRlBfQVRPTUlDKTsKKwkJKnB0ciA9IHFoOworCX0KKwlpZiAobGlrZWx5KHFoICE9IE5VTEwpKSB7CisJCXN0cnVjdCBlaGNpX3F0ZAkqcXRkOworCisJCWlmICh1bmxpa2VseShsaXN0X2VtcHR5KHF0ZF9saXN0KSkpCisJCQlxdGQgPSBOVUxMOworCQllbHNlCisJCQlxdGQgPSBsaXN0X2VudHJ5KHF0ZF9saXN0LT5uZXh0LCBzdHJ1Y3QgZWhjaV9xdGQsCisJCQkJCXF0ZF9saXN0KTsKKworCQkvKiBjb250cm9sIHFoIG1heSBuZWVkIHBhdGNoaW5nIC4uLiAqLworCQlpZiAodW5saWtlbHkoZXBudW0gPT0gMCkpIHsKKworCQkJLyogdXNiX3Jlc2V0X2RldmljZSgpIGJyaWVmbHkgcmV2ZXJ0cyB0byBhZGRyZXNzIDAgKi8KKwkJCWlmICh1c2JfcGlwZWRldmljZSh1cmItPnBpcGUpID09IDApCisJCQkJcWgtPmh3X2luZm8xICY9IH5RSF9BRERSX01BU0s7CisJCX0KKworCQkvKiBqdXN0IG9uZSB3YXkgdG8gcXVldWUgcmVxdWVzdHM6IHN3YXAgd2l0aCB0aGUgZHVtbXkgcXRkLgorCQkgKiBvbmx5IGhjIG9yIHFoX3JlZnJlc2goKSBldmVyIG1vZGlmeSB0aGUgb3ZlcmxheS4KKwkJICovCisJCWlmIChsaWtlbHkocXRkICE9IE5VTEwpKSB7CisJCQlzdHJ1Y3QgZWhjaV9xdGQJKmR1bW15OworCQkJZG1hX2FkZHJfdCBkbWE7CisJCQlfX2xlMzIgdG9rZW47CisKKwkJCS8qIHRvIGF2b2lkIHJhY2luZyB0aGUgSEMsIHVzZSB0aGUgZHVtbXkgdGQgaW5zdGVhZCBvZgorCQkJICogdGhlIGZpcnN0IHRkIG9mIG91ciBsaXN0IChiZWNvbWVzIG5ldyBkdW1teSkuICBib3RoCisJCQkgKiB0ZHMgc3RheSBkZWFjdGl2YXRlZCB1bnRpbCB3ZSdyZSBkb25lLCB3aGVuIHRoZQorCQkJICogSEMgaXMgYWxsb3dlZCB0byBmZXRjaCB0aGUgb2xkIGR1bW15ICg0LjEwLjIpLgorCQkJICovCisJCQl0b2tlbiA9IHF0ZC0+aHdfdG9rZW47CisJCQlxdGQtPmh3X3Rva2VuID0gSEFMVF9CSVQ7CisJCQl3bWIoKTsKKwkJCWR1bW15ID0gcWgtPmR1bW15OworCisJCQlkbWEgPSBkdW1teS0+cXRkX2RtYTsKKwkJCSpkdW1teSA9ICpxdGQ7CisJCQlkdW1teS0+cXRkX2RtYSA9IGRtYTsKKworCQkJbGlzdF9kZWwoJnF0ZC0+cXRkX2xpc3QpOworCQkJbGlzdF9hZGQoJmR1bW15LT5xdGRfbGlzdCwgcXRkX2xpc3QpOworCQkJbGlzdF9zcGxpY2UocXRkX2xpc3QsIHFoLT5xdGRfbGlzdC5wcmV2KTsKKworCQkJZWhjaV9xdGRfaW5pdChxdGQsIHF0ZC0+cXRkX2RtYSk7CisJCQlxaC0+ZHVtbXkgPSBxdGQ7CisKKwkJCS8qIGhjIG11c3Qgc2VlIHRoZSBuZXcgZHVtbXkgYXQgbGlzdCBlbmQgKi8KKwkJCWRtYSA9IHF0ZC0+cXRkX2RtYTsKKwkJCXF0ZCA9IGxpc3RfZW50cnkocWgtPnF0ZF9saXN0LnByZXYsCisJCQkJCXN0cnVjdCBlaGNpX3F0ZCwgcXRkX2xpc3QpOworCQkJcXRkLT5od19uZXh0ID0gUVREX05FWFQoZG1hKTsKKworCQkJLyogbGV0IHRoZSBoYyBwcm9jZXNzIHRoZXNlIG5leHQgcXRkcyAqLworCQkJZHVtbXktPmh3X3Rva2VuID0gKHRva2VuICYgfigweDgwKSk7CisJCQl3bWIoKTsKKwkJCWR1bW15LT5od190b2tlbiA9IHRva2VuOworCisJCQl1cmItPmhjcHJpdiA9IHFoX2dldChxaCk7CisJCX0KKwl9CisJcmV0dXJuIHFoOworfQorCitzdGF0aWMgaW50IHN1Ym1pdF9hc3luYyhzdHJ1Y3Qgb3h1X2hjZAkqb3h1LCBzdHJ1Y3QgdXJiICp1cmIsCisJCQlzdHJ1Y3QgbGlzdF9oZWFkICpxdGRfbGlzdCwgZ2ZwX3QgbWVtX2ZsYWdzKQoreworCXN0cnVjdCBlaGNpX3F0ZAkqcXRkOworCWludCBlcG51bTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBlaGNpX3FoICpxaCA9IE5VTEw7CisJaW50IHJjID0gMDsKKworCXF0ZCA9IGxpc3RfZW50cnkocXRkX2xpc3QtPm5leHQsIHN0cnVjdCBlaGNpX3F0ZCwgcXRkX2xpc3QpOworCWVwbnVtID0gdXJiLT5lcC0+ZGVzYy5iRW5kcG9pbnRBZGRyZXNzOworCisjaWZkZWYgT1hVX1VSQl9UUkFDRQorCW94dV9kYmcob3h1LCAiJXMgJXMgdXJiICVwIGVwJWQlcyBsZW4gJWQsIHF0ZCAlcCBbcWggJXBdXG4iLAorCQlfX2Z1bmNfXywgdXJiLT5kZXYtPmRldnBhdGgsIHVyYiwKKwkJZXBudW0gJiAweDBmLCAoZXBudW0gJiBVU0JfRElSX0lOKSA/ICJpbiIgOiAib3V0IiwKKwkJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLAorCQlxdGQsIHVyYi0+ZXAtPmhjcHJpdik7CisjZW5kaWYKKworCXNwaW5fbG9ja19pcnFzYXZlKCZveHUtPmxvY2ssIGZsYWdzKTsKKwlpZiAodW5saWtlbHkoIXRlc3RfYml0KEhDRF9GTEFHX0hXX0FDQ0VTU0lCTEUsCisJCQkgICAgICAgJm94dV90b19oY2Qob3h1KS0+ZmxhZ3MpKSkgeworCQlyYyA9IC1FU0hVVERPV047CisJCWdvdG8gZG9uZTsKKwl9CisKKwlxaCA9IHFoX2FwcGVuZF90ZHMob3h1LCB1cmIsIHF0ZF9saXN0LCBlcG51bSwgJnVyYi0+ZXAtPmhjcHJpdik7CisJaWYgKHVubGlrZWx5KHFoID09IE5VTEwpKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBkb25lOworCX0KKworCS8qIENvbnRyb2wvYnVsayBvcGVyYXRpb25zIHRocm91Z2ggVFRzIGRvbid0IG5lZWQgc2NoZWR1bGluZywKKwkgKiB0aGUgSEMgYW5kIFRUIGhhbmRsZSBpdCB3aGVuIHRoZSBUVCBoYXMgYSBidWZmZXIgcmVhZHkuCisJICovCisJaWYgKGxpa2VseShxaC0+cWhfc3RhdGUgPT0gUUhfU1RBVEVfSURMRSkpCisJCXFoX2xpbmtfYXN5bmMob3h1LCBxaF9nZXQocWgpKTsKK2RvbmU6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3h1LT5sb2NrLCBmbGFncyk7CisJaWYgKHVubGlrZWx5KHFoID09IE5VTEwpKQorCQlxdGRfbGlzdF9mcmVlKG94dSwgdXJiLCBxdGRfbGlzdCk7CisJcmV0dXJuIHJjOworfQorCisvKiBUaGUgYXN5bmMgcWggZm9yIHRoZSBxdGRzIGJlaW5nIHJlY2xhaW1lZCBhcmUgbm93IHVubGlua2VkIGZyb20gdGhlIEhDICovCisKK3N0YXRpYyB2b2lkIGVuZF91bmxpbmtfYXN5bmMoc3RydWN0IG94dV9oY2QgKm94dSkKK3sKKwlzdHJ1Y3QgZWhjaV9xaCAqcWggPSBveHUtPnJlY2xhaW07CisJc3RydWN0IGVoY2lfcWggKm5leHQ7CisKKwl0aW1lcl9hY3Rpb25fZG9uZShveHUsIFRJTUVSX0lBQV9XQVRDSERPRyk7CisKKwlxaC0+cWhfc3RhdGUgPSBRSF9TVEFURV9JRExFOworCXFoLT5xaF9uZXh0LnFoID0gTlVMTDsKKwlxaF9wdXQocWgpOwkJCS8qIHJlZmNvdW50IGZyb20gcmVjbGFpbSAqLworCisJLyogb3RoZXIgdW5saW5rKHMpIG1heSBiZSBwZW5kaW5nIChpbiBRSF9TVEFURV9VTkxJTktfV0FJVCkgKi8KKwluZXh0ID0gcWgtPnJlY2xhaW07CisJb3h1LT5yZWNsYWltID0gbmV4dDsKKwlveHUtPnJlY2xhaW1fcmVhZHkgPSAwOworCXFoLT5yZWNsYWltID0gTlVMTDsKKworCXFoX2NvbXBsZXRpb25zKG94dSwgcWgpOworCisJaWYgKCFsaXN0X2VtcHR5KCZxaC0+cXRkX2xpc3QpCisJCQkmJiBIQ19JU19SVU5OSU5HKG94dV90b19oY2Qob3h1KS0+c3RhdGUpKQorCQlxaF9saW5rX2FzeW5jKG94dSwgcWgpOworCWVsc2UgeworCQlxaF9wdXQocWgpOwkJLyogcmVmY291bnQgZnJvbSBhc3luYyBsaXN0ICovCisKKwkJLyogaXQncyBub3QgZnJlZSB0byB0dXJuIHRoZSBhc3luYyBzY2hlZHVsZSBvbi9vZmY7IGxlYXZlIGl0CisJCSAqIGFjdGl2ZSBidXQgaWRsZSBmb3IgYSB3aGlsZSBvbmNlIGl0IGVtcHRpZXMuCisJCSAqLworCQlpZiAoSENfSVNfUlVOTklORyhveHVfdG9faGNkKG94dSktPnN0YXRlKQorCQkJCSYmIG94dS0+YXN5bmMtPnFoX25leHQucWggPT0gTlVMTCkKKwkJCXRpbWVyX2FjdGlvbihveHUsIFRJTUVSX0FTWU5DX09GRik7CisJfQorCisJaWYgKG5leHQpIHsKKwkJb3h1LT5yZWNsYWltID0gTlVMTDsKKwkJc3RhcnRfdW5saW5rX2FzeW5jKG94dSwgbmV4dCk7CisJfQorfQorCisvKiBtYWtlcyBzdXJlIHRoZSBhc3luYyBxaCB3aWxsIGJlY29tZSBpZGxlICovCisvKiBjYWxsZXIgbXVzdCBvd24gb3h1LT5sb2NrICovCisKK3N0YXRpYyB2b2lkIHN0YXJ0X3VubGlua19hc3luYyhzdHJ1Y3Qgb3h1X2hjZCAqb3h1LCBzdHJ1Y3QgZWhjaV9xaCAqcWgpCit7CisJaW50IGNtZCA9IHJlYWRsKCZveHUtPnJlZ3MtPmNvbW1hbmQpOworCXN0cnVjdCBlaGNpX3FoICpwcmV2OworCisjaWZkZWYgREVCVUcKKwlhc3NlcnRfc3Bpbl9sb2NrZWQoJm94dS0+bG9jayk7CisJaWYgKG94dS0+cmVjbGFpbSB8fCAocWgtPnFoX3N0YXRlICE9IFFIX1NUQVRFX0xJTktFRAorCQkJCSYmIHFoLT5xaF9zdGF0ZSAhPSBRSF9TVEFURV9VTkxJTktfV0FJVCkpCisJCUJVRygpOworI2VuZGlmCisKKwkvKiBzdG9wIGFzeW5jIHNjaGVkdWxlIHJpZ2h0IG5vdz8gKi8KKwlpZiAodW5saWtlbHkocWggPT0gb3h1LT5hc3luYykpIHsKKwkJLyogY2FuJ3QgZ2V0IGhlcmUgd2l0aG91dCBTVFNfQVNTIHNldCAqLworCQlpZiAob3h1X3RvX2hjZChveHUpLT5zdGF0ZSAhPSBIQ19TVEFURV9IQUxUCisJCQkJJiYgIW94dS0+cmVjbGFpbSkgeworCQkJLyogLi4uIGFuZCBDTURfSUFBRCBjbGVhciAqLworCQkJd3JpdGVsKGNtZCAmIH5DTURfQVNFLCAmb3h1LT5yZWdzLT5jb21tYW5kKTsKKwkJCXdtYigpOworCQkJLyogaGFuZHNoYWtlIGxhdGVyLCBpZiB3ZSBuZWVkIHRvICovCisJCQl0aW1lcl9hY3Rpb25fZG9uZShveHUsIFRJTUVSX0FTWU5DX09GRik7CisJCX0KKwkJcmV0dXJuOworCX0KKworCXFoLT5xaF9zdGF0ZSA9IFFIX1NUQVRFX1VOTElOSzsKKwlveHUtPnJlY2xhaW0gPSBxaCA9IHFoX2dldChxaCk7CisKKwlwcmV2ID0gb3h1LT5hc3luYzsKKwl3aGlsZSAocHJldi0+cWhfbmV4dC5xaCAhPSBxaCkKKwkJcHJldiA9IHByZXYtPnFoX25leHQucWg7CisKKwlwcmV2LT5od19uZXh0ID0gcWgtPmh3X25leHQ7CisJcHJldi0+cWhfbmV4dCA9IHFoLT5xaF9uZXh0OworCXdtYigpOworCisJaWYgKHVubGlrZWx5KG94dV90b19oY2Qob3h1KS0+c3RhdGUgPT0gSENfU1RBVEVfSEFMVCkpIHsKKwkJLyogaWYgKHVubGlrZWx5KHFoLT5yZWNsYWltICE9IDApKQorCQkgKgl0aGlzIHdpbGwgcmVjdXJzZSwgcHJvYmFibHkgbm90IG11Y2gKKwkJICovCisJCWVuZF91bmxpbmtfYXN5bmMob3h1KTsKKwkJcmV0dXJuOworCX0KKworCW94dS0+cmVjbGFpbV9yZWFkeSA9IDA7CisJY21kIHw9IENNRF9JQUFEOworCXdyaXRlbChjbWQsICZveHUtPnJlZ3MtPmNvbW1hbmQpOworCSh2b2lkKSByZWFkbCgmb3h1LT5yZWdzLT5jb21tYW5kKTsKKwl0aW1lcl9hY3Rpb24ob3h1LCBUSU1FUl9JQUFfV0FUQ0hET0cpOworfQorCitzdGF0aWMgdm9pZCBzY2FuX2FzeW5jKHN0cnVjdCBveHVfaGNkICpveHUpCit7CisJc3RydWN0IGVoY2lfcWggKnFoOworCWVudW0gZWhjaV90aW1lcl9hY3Rpb24gYWN0aW9uID0gVElNRVJfSU9fV0FUQ0hET0c7CisKKwlpZiAoISsrKG94dS0+c3RhbXApKQorCQlveHUtPnN0YW1wKys7CisJdGltZXJfYWN0aW9uX2RvbmUob3h1LCBUSU1FUl9BU1lOQ19TSFJJTkspOworcmVzY2FuOgorCXFoID0gb3h1LT5hc3luYy0+cWhfbmV4dC5xaDsKKwlpZiAobGlrZWx5KHFoICE9IE5VTEwpKSB7CisJCWRvIHsKKwkJCS8qIGNsZWFuIGFueSBmaW5pc2hlZCB3b3JrIGZvciB0aGlzIHFoICovCisJCQlpZiAoIWxpc3RfZW1wdHkoJnFoLT5xdGRfbGlzdCkKKwkJCQkJJiYgcWgtPnN0YW1wICE9IG94dS0+c3RhbXApIHsKKwkJCQlpbnQgdGVtcDsKKworCQkJCS8qIHVubGlua3MgY291bGQgaGFwcGVuIGhlcmU7IGNvbXBsZXRpb24KKwkJCQkgKiByZXBvcnRpbmcgZHJvcHMgdGhlIGxvY2suICByZXNjYW4gdXNpbmcKKwkJCQkgKiB0aGUgbGF0ZXN0IHNjaGVkdWxlLCBidXQgZG9uJ3QgcmVzY2FuCisJCQkJICogcWhzIHdlIGFscmVhZHkgZmluaXNoZWQgKG5vIGxvb3BpbmcpLgorCQkJCSAqLworCQkJCXFoID0gcWhfZ2V0KHFoKTsKKwkJCQlxaC0+c3RhbXAgPSBveHUtPnN0YW1wOworCQkJCXRlbXAgPSBxaF9jb21wbGV0aW9ucyhveHUsIHFoKTsKKwkJCQlxaF9wdXQocWgpOworCQkJCWlmICh0ZW1wICE9IDApCisJCQkJCWdvdG8gcmVzY2FuOworCQkJfQorCisJCQkvKiB1bmxpbmsgaWRsZSBlbnRyaWVzLCByZWR1Y2luZyBIQyBQQ0kgdXNhZ2UgYXMgd2VsbAorCQkJICogYXMgSENEIHNjaGVkdWxlLXNjYW5uaW5nIGNvc3RzLiAgZGVsYXkgZm9yIGFueSBxaAorCQkJICogd2UganVzdCBzY2FubmVkLCB0aGVyZSdzIGEgbm90LXVudXN1YWwgY2FzZSB0aGF0IGl0CisJCQkgKiBkb2Vzbid0IHN0YXkgaWRsZSBmb3IgbG9uZy4KKwkJCSAqIChwbHVzLCBhdm9pZHMgc29tZSBraW5kIG9mIHJlLWFjdGl2YXRpb24gcmFjZS4pCisJCQkgKi8KKwkJCWlmIChsaXN0X2VtcHR5KCZxaC0+cXRkX2xpc3QpKSB7CisJCQkJaWYgKHFoLT5zdGFtcCA9PSBveHUtPnN0YW1wKQorCQkJCQlhY3Rpb24gPSBUSU1FUl9BU1lOQ19TSFJJTks7CisJCQkJZWxzZSBpZiAoIW94dS0+cmVjbGFpbQorCQkJCQkgICAgJiYgcWgtPnFoX3N0YXRlID09IFFIX1NUQVRFX0xJTktFRCkKKwkJCQkJc3RhcnRfdW5saW5rX2FzeW5jKG94dSwgcWgpOworCQkJfQorCisJCQlxaCA9IHFoLT5xaF9uZXh0LnFoOworCQl9IHdoaWxlIChxaCk7CisJfQorCWlmIChhY3Rpb24gPT0gVElNRVJfQVNZTkNfU0hSSU5LKQorCQl0aW1lcl9hY3Rpb24ob3h1LCBUSU1FUl9BU1lOQ19TSFJJTkspOworfQorCisvKgorICogcGVyaW9kaWNfbmV4dF9zaGFkb3cgLSByZXR1cm4gIm5leHQiIHBvaW50ZXIgb24gc2hhZG93IGxpc3QKKyAqIEBwZXJpb2RpYzogaG9zdCBwb2ludGVyIHRvIHFoL2l0ZC9zaXRkCisgKiBAdGFnOiBoYXJkd2FyZSB0YWcgZm9yIHR5cGUgb2YgdGhpcyByZWNvcmQKKyAqLworc3RhdGljIHVuaW9uIGVoY2lfc2hhZG93ICpwZXJpb2RpY19uZXh0X3NoYWRvdyh1bmlvbiBlaGNpX3NoYWRvdyAqcGVyaW9kaWMsCisJCQkJCQlfX2xlMzIgdGFnKQoreworCXN3aXRjaCAodGFnKSB7CisJZGVmYXVsdDoKKwljYXNlIFFfVFlQRV9RSDoKKwkJcmV0dXJuICZwZXJpb2RpYy0+cWgtPnFoX25leHQ7CisJfQorfQorCisvKiBjYWxsZXIgbXVzdCBob2xkIG94dS0+bG9jayAqLworc3RhdGljIHZvaWQgcGVyaW9kaWNfdW5saW5rKHN0cnVjdCBveHVfaGNkICpveHUsIHVuc2lnbmVkIGZyYW1lLCB2b2lkICpwdHIpCit7CisJdW5pb24gZWhjaV9zaGFkb3cgKnByZXZfcCA9ICZveHUtPnBzaGFkb3dbZnJhbWVdOworCV9fbGUzMiAqaHdfcCA9ICZveHUtPnBlcmlvZGljW2ZyYW1lXTsKKwl1bmlvbiBlaGNpX3NoYWRvdyBoZXJlID0gKnByZXZfcDsKKworCS8qIGZpbmQgcHJlZGVjZXNzb3Igb2YgInB0ciI7IGh3IGFuZCBzaGFkb3cgbGlzdHMgYXJlIGluIHN5bmMgKi8KKwl3aGlsZSAoaGVyZS5wdHIgJiYgaGVyZS5wdHIgIT0gcHRyKSB7CisJCXByZXZfcCA9IHBlcmlvZGljX25leHRfc2hhZG93KHByZXZfcCwgUV9ORVhUX1RZUEUoKmh3X3ApKTsKKwkJaHdfcCA9IGhlcmUuaHdfbmV4dDsKKwkJaGVyZSA9ICpwcmV2X3A7CisJfQorCS8qIGFuIGludGVycnVwdCBlbnRyeSAoYXQgbGlzdCBlbmQpIGNvdWxkIGhhdmUgYmVlbiBzaGFyZWQgKi8KKwlpZiAoIWhlcmUucHRyKQorCQlyZXR1cm47CisKKwkvKiB1cGRhdGUgc2hhZG93IGFuZCBoYXJkd2FyZSBsaXN0cyAuLi4gdGhlIG9sZCAibmV4dCIgcG9pbnRlcnMKKwkgKiBmcm9tIHB0ciBtYXkgc3RpbGwgYmUgaW4gdXNlLCB0aGUgY2FsbGVyIHVwZGF0ZXMgdGhlbS4KKwkgKi8KKwkqcHJldl9wID0gKnBlcmlvZGljX25leHRfc2hhZG93KCZoZXJlLCBRX05FWFRfVFlQRSgqaHdfcCkpOworCSpod19wID0gKmhlcmUuaHdfbmV4dDsKK30KKworLyogaG93IG1hbnkgb2YgdGhlIHVmcmFtZSdzIDEyNSB1c2VjcyBhcmUgYWxsb2NhdGVkPyAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IHBlcmlvZGljX3VzZWNzKHN0cnVjdCBveHVfaGNkICpveHUsCisJCQkJCXVuc2lnbmVkIGZyYW1lLCB1bnNpZ25lZCB1ZnJhbWUpCit7CisJX19sZTMyICpod19wID0gJm94dS0+cGVyaW9kaWNbZnJhbWVdOworCXVuaW9uIGVoY2lfc2hhZG93ICpxID0gJm94dS0+cHNoYWRvd1tmcmFtZV07CisJdW5zaWduZWQgdXNlY3MgPSAwOworCisJd2hpbGUgKHEtPnB0cikgeworCQlzd2l0Y2ggKFFfTkVYVF9UWVBFKCpod19wKSkgeworCQljYXNlIFFfVFlQRV9RSDoKKwkJZGVmYXVsdDoKKwkJCS8qIGlzIGl0IGluIHRoZSBTLW1hc2s/ICovCisJCQlpZiAocS0+cWgtPmh3X2luZm8yICYgY3B1X3RvX2xlMzIoMSA8PCB1ZnJhbWUpKQorCQkJCXVzZWNzICs9IHEtPnFoLT51c2VjczsKKwkJCS8qIC4uLiBvciBDLW1hc2s/ICovCisJCQlpZiAocS0+cWgtPmh3X2luZm8yICYgY3B1X3RvX2xlMzIoMSA8PCAoOCArIHVmcmFtZSkpKQorCQkJCXVzZWNzICs9IHEtPnFoLT5jX3VzZWNzOworCQkJaHdfcCA9ICZxLT5xaC0+aHdfbmV4dDsKKwkJCXEgPSAmcS0+cWgtPnFoX25leHQ7CisJCQlicmVhazsKKwkJfQorCX0KKyNpZmRlZiBERUJVRworCWlmICh1c2VjcyA+IDEwMCkKKwkJb3h1X2VycihveHUsICJ1ZnJhbWUgJWQgc2NoZWQgb3ZlcnJ1bjogJWQgdXNlY3NcbiIsCisJCQkJCQlmcmFtZSAqIDggKyB1ZnJhbWUsIHVzZWNzKTsKKyNlbmRpZgorCXJldHVybiB1c2VjczsKK30KKworc3RhdGljIGludCBlbmFibGVfcGVyaW9kaWMoc3RydWN0IG94dV9oY2QgKm94dSkKK3sKKwl1MzIgY21kOworCWludCBzdGF0dXM7CisKKwkvKiBkaWQgY2xlYXJpbmcgUFNFIGRpZCB0YWtlIGVmZmVjdCB5ZXQ/CisJICogdGFrZXMgZWZmZWN0IG9ubHkgYXQgZnJhbWUgYm91bmRhcmllcy4uLgorCSAqLworCXN0YXR1cyA9IGhhbmRzaGFrZShveHUsICZveHUtPnJlZ3MtPnN0YXR1cywgU1RTX1BTUywgMCwgOSAqIDEyNSk7CisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCW94dV90b19oY2Qob3h1KS0+c3RhdGUgPSBIQ19TVEFURV9IQUxUOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCWNtZCA9IHJlYWRsKCZveHUtPnJlZ3MtPmNvbW1hbmQpIHwgQ01EX1BTRTsKKwl3cml0ZWwoY21kLCAmb3h1LT5yZWdzLT5jb21tYW5kKTsKKwkvKiBwb3N0ZWQgd3JpdGUgLi4uIFBTUyBoYXBwZW5zIGxhdGVyICovCisJb3h1X3RvX2hjZChveHUpLT5zdGF0ZSA9IEhDX1NUQVRFX1JVTk5JTkc7CisKKwkvKiBtYWtlIHN1cmUgZWhjaV93b3JrIHNjYW5zIHRoZXNlICovCisJb3h1LT5uZXh0X3VmcmFtZSA9IHJlYWRsKCZveHUtPnJlZ3MtPmZyYW1lX2luZGV4KQorCQklIChveHUtPnBlcmlvZGljX3NpemUgPDwgMyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGlzYWJsZV9wZXJpb2RpYyhzdHJ1Y3Qgb3h1X2hjZCAqb3h1KQoreworCXUzMiBjbWQ7CisJaW50IHN0YXR1czsKKworCS8qIGRpZCBzZXR0aW5nIFBTRSBub3QgdGFrZSBlZmZlY3QgeWV0PworCSAqIHRha2VzIGVmZmVjdCBvbmx5IGF0IGZyYW1lIGJvdW5kYXJpZXMuLi4KKwkgKi8KKwlzdGF0dXMgPSBoYW5kc2hha2Uob3h1LCAmb3h1LT5yZWdzLT5zdGF0dXMsIFNUU19QU1MsIFNUU19QU1MsIDkgKiAxMjUpOworCWlmIChzdGF0dXMgIT0gMCkgeworCQlveHVfdG9faGNkKG94dSktPnN0YXRlID0gSENfU1RBVEVfSEFMVDsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwljbWQgPSByZWFkbCgmb3h1LT5yZWdzLT5jb21tYW5kKSAmIH5DTURfUFNFOworCXdyaXRlbChjbWQsICZveHUtPnJlZ3MtPmNvbW1hbmQpOworCS8qIHBvc3RlZCB3cml0ZSAuLi4gKi8KKworCW94dS0+bmV4dF91ZnJhbWUgPSAtMTsKKwlyZXR1cm4gMDsKK30KKworLyogcGVyaW9kaWMgc2NoZWR1bGUgc2xvdHMgaGF2ZSBpc28gdGRzIChub3JtYWwgb3Igc3BsaXQpIGZpcnN0LCB0aGVuIGEKKyAqIHNwYXJzZSB0cmVlIGZvciBhY3RpdmUgaW50ZXJydXB0IHRyYW5zZmVycy4KKyAqCisgKiB0aGlzIGp1c3QgbGlua3MgaW4gYSBxaDsgY2FsbGVyIGd1YXJhbnRlZXMgdWZyYW1lIG1hc2tzIGFyZSBzZXQgcmlnaHQuCisgKiBubyBGU1ROIHN1cHBvcnQgKHlldDsgb3h1IDAuOTYrKQorICovCitzdGF0aWMgaW50IHFoX2xpbmtfcGVyaW9kaWMoc3RydWN0IG94dV9oY2QgKm94dSwgc3RydWN0IGVoY2lfcWggKnFoKQoreworCXVuc2lnbmVkIGk7CisJdW5zaWduZWQgcGVyaW9kID0gcWgtPnBlcmlvZDsKKworCWRldl9kYmcoJnFoLT5kZXYtPmRldiwKKwkJImxpbmsgcWglZC0lMDR4LyVwIHN0YXJ0ICVkIFslZC8lZCB1c11cbiIsCisJCXBlcmlvZCwgbGUzMl90b19jcHVwKCZxaC0+aHdfaW5mbzIpICYgKFFIX0NNQVNLIHwgUUhfU01BU0spLAorCQlxaCwgcWgtPnN0YXJ0LCBxaC0+dXNlY3MsIHFoLT5jX3VzZWNzKTsKKworCS8qIGhpZ2ggYmFuZHdpZHRoLCBvciBvdGhlcndpc2UgZXZlcnkgbWljcm9mcmFtZSAqLworCWlmIChwZXJpb2QgPT0gMCkKKwkJcGVyaW9kID0gMTsKKworCWZvciAoaSA9IHFoLT5zdGFydDsgaSA8IG94dS0+cGVyaW9kaWNfc2l6ZTsgaSArPSBwZXJpb2QpIHsKKwkJdW5pb24gZWhjaV9zaGFkb3cJKnByZXYgPSAmb3h1LT5wc2hhZG93W2ldOworCQlfX2xlMzIJCQkqaHdfcCA9ICZveHUtPnBlcmlvZGljW2ldOworCQl1bmlvbiBlaGNpX3NoYWRvdwloZXJlID0gKnByZXY7CisJCV9fbGUzMgkJCXR5cGUgPSAwOworCisJCS8qIHNraXAgdGhlIGlzbyBub2RlcyBhdCBsaXN0IGhlYWQgKi8KKwkJd2hpbGUgKGhlcmUucHRyKSB7CisJCQl0eXBlID0gUV9ORVhUX1RZUEUoKmh3X3ApOworCQkJaWYgKHR5cGUgPT0gUV9UWVBFX1FIKQorCQkJCWJyZWFrOworCQkJcHJldiA9IHBlcmlvZGljX25leHRfc2hhZG93KHByZXYsIHR5cGUpOworCQkJaHdfcCA9ICZoZXJlLnFoLT5od19uZXh0OworCQkJaGVyZSA9ICpwcmV2OworCQl9CisKKwkJLyogc29ydGluZyBlYWNoIGJyYW5jaCBieSBwZXJpb2QgKHNsb3ctLT5mYXN0KQorCQkgKiBlbmFibGVzIHNoYXJpbmcgaW50ZXJpb3IgdHJlZSBub2RlcworCQkgKi8KKwkJd2hpbGUgKGhlcmUucHRyICYmIHFoICE9IGhlcmUucWgpIHsKKwkJCWlmIChxaC0+cGVyaW9kID4gaGVyZS5xaC0+cGVyaW9kKQorCQkJCWJyZWFrOworCQkJcHJldiA9ICZoZXJlLnFoLT5xaF9uZXh0OworCQkJaHdfcCA9ICZoZXJlLnFoLT5od19uZXh0OworCQkJaGVyZSA9ICpwcmV2OworCQl9CisJCS8qIGxpbmsgaW4gdGhpcyBxaCwgdW5sZXNzIHNvbWUgZWFybGllciBwYXNzIGRpZCB0aGF0ICovCisJCWlmIChxaCAhPSBoZXJlLnFoKSB7CisJCQlxaC0+cWhfbmV4dCA9IGhlcmU7CisJCQlpZiAoaGVyZS5xaCkKKwkJCQlxaC0+aHdfbmV4dCA9ICpod19wOworCQkJd21iKCk7CisJCQlwcmV2LT5xaCA9IHFoOworCQkJKmh3X3AgPSBRSF9ORVhUKHFoLT5xaF9kbWEpOworCQl9CisJfQorCXFoLT5xaF9zdGF0ZSA9IFFIX1NUQVRFX0xJTktFRDsKKwlxaF9nZXQocWgpOworCisJLyogdXBkYXRlIHBlci1xaCBiYW5kd2lkdGggZm9yIHVzYmZzICovCisJb3h1X3RvX2hjZChveHUpLT5zZWxmLmJhbmR3aWR0aF9hbGxvY2F0ZWQgKz0gcWgtPnBlcmlvZAorCQk/ICgocWgtPnVzZWNzICsgcWgtPmNfdXNlY3MpIC8gcWgtPnBlcmlvZCkKKwkJOiAocWgtPnVzZWNzICogOCk7CisKKwkvKiBtYXliZSBlbmFibGUgcGVyaW9kaWMgc2NoZWR1bGUgcHJvY2Vzc2luZyAqLworCWlmICghb3h1LT5wZXJpb2RpY19zY2hlZCsrKQorCQlyZXR1cm4gZW5hYmxlX3BlcmlvZGljKG94dSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcWhfdW5saW5rX3BlcmlvZGljKHN0cnVjdCBveHVfaGNkICpveHUsIHN0cnVjdCBlaGNpX3FoICpxaCkKK3sKKwl1bnNpZ25lZCBpOworCXVuc2lnbmVkIHBlcmlvZDsKKworCS8qIEZJWE1FOgorCSAqICAgSUYgdGhpcyBpc24ndCBoaWdoIHNwZWVkCisJICogICBhbmQgdGhpcyBxaCBpcyBhY3RpdmUgaW4gdGhlIGN1cnJlbnQgdWZyYW1lCisJICogICAoYW5kIG92ZXJsYXkgdG9rZW4gU3BsaXRYc3RhdGUgaXMgZmFsc2U/KQorCSAqIFRIRU4KKwkgKiAgIHFoLT5od19pbmZvMSB8PSBfX2NvbnN0YW50X2NwdV90b19sZTMyKDEgPDwgNyAiaWdub3JlIik7CisJICovCisKKwkvKiBoaWdoIGJhbmR3aWR0aCwgb3Igb3RoZXJ3aXNlIHBhcnQgb2YgZXZlcnkgbWljcm9mcmFtZSAqLworCXBlcmlvZCA9IHFoLT5wZXJpb2Q7CisJaWYgKHBlcmlvZCA9PSAwKQorCQlwZXJpb2QgPSAxOworCisJZm9yIChpID0gcWgtPnN0YXJ0OyBpIDwgb3h1LT5wZXJpb2RpY19zaXplOyBpICs9IHBlcmlvZCkKKwkJcGVyaW9kaWNfdW5saW5rKG94dSwgaSwgcWgpOworCisJLyogdXBkYXRlIHBlci1xaCBiYW5kd2lkdGggZm9yIHVzYmZzICovCisJb3h1X3RvX2hjZChveHUpLT5zZWxmLmJhbmR3aWR0aF9hbGxvY2F0ZWQgLT0gcWgtPnBlcmlvZAorCQk/ICgocWgtPnVzZWNzICsgcWgtPmNfdXNlY3MpIC8gcWgtPnBlcmlvZCkKKwkJOiAocWgtPnVzZWNzICogOCk7CisKKwlkZXZfZGJnKCZxaC0+ZGV2LT5kZXYsCisJCSJ1bmxpbmsgcWglZC0lMDR4LyVwIHN0YXJ0ICVkIFslZC8lZCB1c11cbiIsCisJCXFoLT5wZXJpb2QsCisJCWxlMzJfdG9fY3B1cCgmcWgtPmh3X2luZm8yKSAmIChRSF9DTUFTSyB8IFFIX1NNQVNLKSwKKwkJcWgsIHFoLT5zdGFydCwgcWgtPnVzZWNzLCBxaC0+Y191c2Vjcyk7CisKKwkvKiBxaC0+cWhfbmV4dCBzdGlsbCAibGl2ZSIgdG8gSEMgKi8KKwlxaC0+cWhfc3RhdGUgPSBRSF9TVEFURV9VTkxJTks7CisJcWgtPnFoX25leHQucHRyID0gTlVMTDsKKwlxaF9wdXQocWgpOworCisJLyogbWF5YmUgdHVybiBvZmYgcGVyaW9kaWMgc2NoZWR1bGUgKi8KKwlveHUtPnBlcmlvZGljX3NjaGVkLS07CisJaWYgKCFveHUtPnBlcmlvZGljX3NjaGVkKQorCQkodm9pZCkgZGlzYWJsZV9wZXJpb2RpYyhveHUpOworfQorCitzdGF0aWMgdm9pZCBpbnRyX2Rlc2NoZWR1bGUoc3RydWN0IG94dV9oY2QgKm94dSwgc3RydWN0IGVoY2lfcWggKnFoKQoreworCXVuc2lnbmVkIHdhaXQ7CisKKwlxaF91bmxpbmtfcGVyaW9kaWMob3h1LCBxaCk7CisKKwkvKiBzaW1wbGUvcGFyYW5vaWQ6ICBhbHdheXMgZGVsYXksIGV4cGVjdGluZyB0aGUgSEMgbmVlZHMgdG8gcmVhZAorCSAqIHFoLT5od19uZXh0IG9yIGZpbmlzaCBhIHdyaXRlYmFjayBhZnRlciBTUExJVC9DU1BMSVQgLi4uIGFuZAorCSAqIGV4cGVjdCBraHViZCB0byBjbGVhbiB1cCBhZnRlciBhbnkgQ1NQTElUcyB3ZSB3b24ndCBpc3N1ZS4KKwkgKiBhY3RpdmUgaGlnaCBzcGVlZCBxdWV1ZXMgbWF5IG5lZWQgYmlnZ2VyIGRlbGF5cy4uLgorCSAqLworCWlmIChsaXN0X2VtcHR5KCZxaC0+cXRkX2xpc3QpCisJCXx8IChfX2NvbnN0YW50X2NwdV90b19sZTMyKFFIX0NNQVNLKSAmIHFoLT5od19pbmZvMikgIT0gMCkKKwkJd2FpdCA9IDI7CisJZWxzZQorCQl3YWl0ID0gNTU7CS8qIHdvcnN0IGNhc2U6IDMgKiAxMDI0ICovCisKKwl1ZGVsYXkod2FpdCk7CisJcWgtPnFoX3N0YXRlID0gUUhfU1RBVEVfSURMRTsKKwlxaC0+aHdfbmV4dCA9IEVIQ0lfTElTVF9FTkQ7CisJd21iKCk7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfcGVyaW9kKHN0cnVjdCBveHVfaGNkICpveHUsCisJCQl1bnNpZ25lZCBmcmFtZSwgdW5zaWduZWQgdWZyYW1lLAorCQkJdW5zaWduZWQgcGVyaW9kLCB1bnNpZ25lZCB1c2VjcykKK3sKKwlpbnQgY2xhaW1lZDsKKworCS8qIGNvbXBsZXRlIHNwbGl0IHJ1bm5pbmcgaW50byBuZXh0IGZyYW1lPworCSAqIGdpdmVuIEZTVE4gc3VwcG9ydCwgd2UgY291bGQgc29tZXRpbWVzIGNoZWNrLi4uCisJICovCisJaWYgKHVmcmFtZSA+PSA4KQorCQlyZXR1cm4gMDsKKworCS8qCisJICogODAlIHBlcmlvZGljID09IDEwMCB1c2VjL3VmcmFtZSBhdmFpbGFibGUKKwkgKiBjb252ZXJ0ICJ1c2VjcyB3ZSBuZWVkIiB0byAibWF4IGFscmVhZHkgY2xhaW1lZCIKKwkgKi8KKwl1c2VjcyA9IDEwMCAtIHVzZWNzOworCisJLyogd2UgImtub3ciIDIgYW5kIDQgdWZyYW1lIGludGVydmFscyB3ZXJlIHJlamVjdGVkOyBzbworCSAqIGZvciBwZXJpb2QgMCwgY2hlY2sgX2V2ZXJ5XyBtaWNyb2ZyYW1lIGluIHRoZSBzY2hlZHVsZS4KKwkgKi8KKwlpZiAodW5saWtlbHkocGVyaW9kID09IDApKSB7CisJCWRvIHsKKwkJCWZvciAodWZyYW1lID0gMDsgdWZyYW1lIDwgNzsgdWZyYW1lKyspIHsKKwkJCQljbGFpbWVkID0gcGVyaW9kaWNfdXNlY3Mob3h1LCBmcmFtZSwgdWZyYW1lKTsKKwkJCQlpZiAoY2xhaW1lZCA+IHVzZWNzKQorCQkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfSB3aGlsZSAoKGZyYW1lICs9IDEpIDwgb3h1LT5wZXJpb2RpY19zaXplKTsKKworCS8qIGp1c3QgY2hlY2sgdGhlIHNwZWNpZmllZCB1ZnJhbWUsIGF0IHRoYXQgcGVyaW9kICovCisJfSBlbHNlIHsKKwkJZG8geworCQkJY2xhaW1lZCA9IHBlcmlvZGljX3VzZWNzKG94dSwgZnJhbWUsIHVmcmFtZSk7CisJCQlpZiAoY2xhaW1lZCA+IHVzZWNzKQorCQkJCXJldHVybiAwOworCQl9IHdoaWxlICgoZnJhbWUgKz0gcGVyaW9kKSA8IG94dS0+cGVyaW9kaWNfc2l6ZSk7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfaW50cl9zY2hlZHVsZShzdHJ1Y3Qgb3h1X2hjZAkqb3h1LAorCQkJCXVuc2lnbmVkIGZyYW1lLCB1bnNpZ25lZCB1ZnJhbWUsCisJCQkJY29uc3Qgc3RydWN0IGVoY2lfcWggKnFoLCBfX2xlMzIgKmNfbWFza3ApCit7CisJaW50IHJldHZhbCA9IC1FTk9TUEM7CisKKwlpZiAocWgtPmNfdXNlY3MgJiYgdWZyYW1lID49IDYpCQkvKiBGU1ROIHRlcnJpdG9yeT8gKi8KKwkJZ290byBkb25lOworCisJaWYgKCFjaGVja19wZXJpb2Qob3h1LCBmcmFtZSwgdWZyYW1lLCBxaC0+cGVyaW9kLCBxaC0+dXNlY3MpKQorCQlnb3RvIGRvbmU7CisJaWYgKCFxaC0+Y191c2VjcykgeworCQlyZXR2YWwgPSAwOworCQkqY19tYXNrcCA9IDA7CisJCWdvdG8gZG9uZTsKKwl9CisKK2RvbmU6CisJcmV0dXJuIHJldHZhbDsKK30KKworLyogImZpcnN0IGZpdCIgc2NoZWR1bGluZyBwb2xpY3kgdXNlZCB0aGUgZmlyc3QgdGltZSB0aHJvdWdoLAorICogb3Igd2hlbiB0aGUgcHJldmlvdXMgc2NoZWR1bGUgc2xvdCBjYW4ndCBiZSByZS11c2VkLgorICovCitzdGF0aWMgaW50IHFoX3NjaGVkdWxlKHN0cnVjdCBveHVfaGNkICpveHUsIHN0cnVjdCBlaGNpX3FoICpxaCkKK3sKKwlpbnQJCXN0YXR1czsKKwl1bnNpZ25lZAl1ZnJhbWU7CisJX19sZTMyCQljX21hc2s7CisJdW5zaWduZWQJZnJhbWU7CQkvKiAwLi4ocWgtPnBlcmlvZCAtIDEpLCBvciBOT19GUkFNRSAqLworCisJcWhfcmVmcmVzaChveHUsIHFoKTsKKwlxaC0+aHdfbmV4dCA9IEVIQ0lfTElTVF9FTkQ7CisJZnJhbWUgPSBxaC0+c3RhcnQ7CisKKwkvKiByZXVzZSB0aGUgcHJldmlvdXMgc2NoZWR1bGUgc2xvdHMsIGlmIHdlIGNhbiAqLworCWlmIChmcmFtZSA8IHFoLT5wZXJpb2QpIHsKKwkJdWZyYW1lID0gZmZzKGxlMzJfdG9fY3B1cCgmcWgtPmh3X2luZm8yKSAmIFFIX1NNQVNLKTsKKwkJc3RhdHVzID0gY2hlY2tfaW50cl9zY2hlZHVsZShveHUsIGZyYW1lLCAtLXVmcmFtZSwKKwkJCQlxaCwgJmNfbWFzayk7CisJfSBlbHNlIHsKKwkJdWZyYW1lID0gMDsKKwkJY19tYXNrID0gMDsKKwkJc3RhdHVzID0gLUVOT1NQQzsKKwl9CisKKwkvKiBlbHNlIHNjYW4gdGhlIHNjaGVkdWxlIHRvIGZpbmQgYSBncm91cCBvZiBzbG90cyBzdWNoIHRoYXQgYWxsCisJICogdWZyYW1lcyBoYXZlIGVub3VnaCBwZXJpb2RpYyBiYW5kd2lkdGggYXZhaWxhYmxlLgorCSAqLworCWlmIChzdGF0dXMpIHsKKwkJLyogIm5vcm1hbCIgY2FzZSwgdWZyYW1pbmcgZmxleGlibGUgZXhjZXB0IHdpdGggc3BsaXRzICovCisJCWlmIChxaC0+cGVyaW9kKSB7CisJCQlmcmFtZSA9IHFoLT5wZXJpb2QgLSAxOworCQkJZG8geworCQkJCWZvciAodWZyYW1lID0gMDsgdWZyYW1lIDwgODsgdWZyYW1lKyspIHsKKwkJCQkJc3RhdHVzID0gY2hlY2tfaW50cl9zY2hlZHVsZShveHUsCisJCQkJCQkJZnJhbWUsIHVmcmFtZSwgcWgsCisJCQkJCQkJJmNfbWFzayk7CisJCQkJCWlmIChzdGF0dXMgPT0gMCkKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0gd2hpbGUgKHN0YXR1cyAmJiBmcmFtZS0tKTsKKworCQkvKiBxaC0+cGVyaW9kID09IDAgbWVhbnMgZXZlcnkgdWZyYW1lICovCisJCX0gZWxzZSB7CisJCQlmcmFtZSA9IDA7CisJCQlzdGF0dXMgPSBjaGVja19pbnRyX3NjaGVkdWxlKG94dSwgMCwgMCwgcWgsICZjX21hc2spOworCQl9CisJCWlmIChzdGF0dXMpCisJCQlnb3RvIGRvbmU7CisJCXFoLT5zdGFydCA9IGZyYW1lOworCisJCS8qIHJlc2V0IFMtZnJhbWUgYW5kIChtYXliZSkgQy1mcmFtZSBtYXNrcyAqLworCQlxaC0+aHdfaW5mbzIgJj0gX19jb25zdGFudF9jcHVfdG9fbGUzMih+KFFIX0NNQVNLIHwgUUhfU01BU0spKTsKKwkJcWgtPmh3X2luZm8yIHw9IHFoLT5wZXJpb2QKKwkJCT8gY3B1X3RvX2xlMzIoMSA8PCB1ZnJhbWUpCisJCQk6IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoUUhfU01BU0spOworCQlxaC0+aHdfaW5mbzIgfD0gY19tYXNrOworCX0gZWxzZQorCQlveHVfZGJnKG94dSwgInJldXNlZCBxaCAlcCBzY2hlZHVsZVxuIiwgcWgpOworCisJLyogc3R1ZmYgaW50byB0aGUgcGVyaW9kaWMgc2NoZWR1bGUgKi8KKwlzdGF0dXMgPSBxaF9saW5rX3BlcmlvZGljKG94dSwgcWgpOworZG9uZToKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGludHJfc3VibWl0KHN0cnVjdCBveHVfaGNkICpveHUsIHN0cnVjdCB1cmIgKnVyYiwKKwkJCXN0cnVjdCBsaXN0X2hlYWQgKnF0ZF9saXN0LCBnZnBfdCBtZW1fZmxhZ3MpCit7CisJdW5zaWduZWQgZXBudW07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZWhjaV9xaCAqcWg7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGxpc3RfaGVhZAllbXB0eTsKKworCS8qIGdldCBlbmRwb2ludCBhbmQgdHJhbnNmZXIvc2NoZWR1bGUgZGF0YSAqLworCWVwbnVtID0gdXJiLT5lcC0+ZGVzYy5iRW5kcG9pbnRBZGRyZXNzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm94dS0+bG9jaywgZmxhZ3MpOworCisJaWYgKHVubGlrZWx5KCF0ZXN0X2JpdChIQ0RfRkxBR19IV19BQ0NFU1NJQkxFLAorCQkJICAgICAgICZveHVfdG9faGNkKG94dSktPmZsYWdzKSkpIHsKKwkJc3RhdHVzID0gLUVTSFVURE9XTjsKKwkJZ290byBkb25lOworCX0KKworCS8qIGdldCBxaCBhbmQgZm9yY2UgYW55IHNjaGVkdWxpbmcgZXJyb3JzICovCisJSU5JVF9MSVNUX0hFQUQoJmVtcHR5KTsKKwlxaCA9IHFoX2FwcGVuZF90ZHMob3h1LCB1cmIsICZlbXB0eSwgZXBudW0sICZ1cmItPmVwLT5oY3ByaXYpOworCWlmIChxaCA9PSBOVUxMKSB7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gZG9uZTsKKwl9CisJaWYgKHFoLT5xaF9zdGF0ZSA9PSBRSF9TVEFURV9JRExFKSB7CisJCXN0YXR1cyA9IHFoX3NjaGVkdWxlKG94dSwgcWgpOworCQlpZiAoc3RhdHVzICE9IDApCisJCQlnb3RvIGRvbmU7CisJfQorCisJLyogdGhlbiBxdWV1ZSB0aGUgdXJiJ3MgdGRzIHRvIHRoZSBxaCAqLworCXFoID0gcWhfYXBwZW5kX3RkcyhveHUsIHVyYiwgcXRkX2xpc3QsIGVwbnVtLCAmdXJiLT5lcC0+aGNwcml2KTsKKwlCVUdfT04ocWggPT0gTlVMTCk7CisKKwkvKiAuLi4gdXBkYXRlIHVzYmZzIHBlcmlvZGljIHN0YXRzICovCisJb3h1X3RvX2hjZChveHUpLT5zZWxmLmJhbmR3aWR0aF9pbnRfcmVxcysrOworCitkb25lOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm94dS0+bG9jaywgZmxhZ3MpOworCWlmIChzdGF0dXMpCisJCXF0ZF9saXN0X2ZyZWUob3h1LCB1cmIsIHF0ZF9saXN0KTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGl0ZF9zdWJtaXQoc3RydWN0IG94dV9oY2QgKm94dSwgc3RydWN0IHVyYiAqdXJiLAorCQkJCQkJZ2ZwX3QgbWVtX2ZsYWdzKQoreworCW94dV9kYmcob3h1LCAiaXNvIHN1cHBvcnQgaXMgbWlzc2luZyFcbiIpOworCXJldHVybiAtRU5PU1lTOworfQorCitzdGF0aWMgaW5saW5lIGludCBzaXRkX3N1Ym1pdChzdHJ1Y3Qgb3h1X2hjZCAqb3h1LCBzdHJ1Y3QgdXJiICp1cmIsCisJCQkJCQlnZnBfdCBtZW1fZmxhZ3MpCit7CisJb3h1X2RiZyhveHUsICJzcGxpdCBpc28gc3VwcG9ydCBpcyBtaXNzaW5nIVxuIik7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisKK3N0YXRpYyB2b2lkIHNjYW5fcGVyaW9kaWMoc3RydWN0IG94dV9oY2QgKm94dSkKK3sKKwl1bnNpZ25lZCBmcmFtZSwgY2xvY2ssIG5vd191ZnJhbWUsIG1vZDsKKwl1bnNpZ25lZCBtb2RpZmllZDsKKworCW1vZCA9IG94dS0+cGVyaW9kaWNfc2l6ZSA8PCAzOworCisJLyoKKwkgKiBXaGVuIHJ1bm5pbmcsIHNjYW4gZnJvbSBsYXN0IHNjYW4gcG9pbnQgdXAgdG8gIm5vdyIKKwkgKiBlbHNlIGNsZWFuIHVwIGJ5IHNjYW5uaW5nIGV2ZXJ5dGhpbmcgdGhhdCdzIGxlZnQuCisJICogVG91Y2hlcyBhcyBmZXcgcGFnZXMgYXMgcG9zc2libGU6ICBjYWNoZS1mcmllbmRseS4KKwkgKi8KKwlub3dfdWZyYW1lID0gb3h1LT5uZXh0X3VmcmFtZTsKKwlpZiAoSENfSVNfUlVOTklORyhveHVfdG9faGNkKG94dSktPnN0YXRlKSkKKwkJY2xvY2sgPSByZWFkbCgmb3h1LT5yZWdzLT5mcmFtZV9pbmRleCk7CisJZWxzZQorCQljbG9jayA9IG5vd191ZnJhbWUgKyBtb2QgLSAxOworCWNsb2NrICU9IG1vZDsKKworCWZvciAoOzspIHsKKwkJdW5pb24gZWhjaV9zaGFkb3cJcSwgKnFfcDsKKwkJX19sZTMyCQkJdHlwZSwgKmh3X3A7CisJCXVuc2lnbmVkCQl1ZnJhbWVzOworCisJCS8qIGRvbid0IHNjYW4gcGFzdCB0aGUgbGl2ZSB1ZnJhbWUgKi8KKwkJZnJhbWUgPSBub3dfdWZyYW1lID4+IDM7CisJCWlmIChmcmFtZSA9PSAoY2xvY2sgPj4gMykpCisJCQl1ZnJhbWVzID0gbm93X3VmcmFtZSAmIDB4MDc7CisJCWVsc2UgeworCQkJLyogc2FmZSB0byBzY2FuIHRoZSB3aG9sZSBmcmFtZSBhdCBvbmNlICovCisJCQlub3dfdWZyYW1lIHw9IDB4MDc7CisJCQl1ZnJhbWVzID0gODsKKwkJfQorCityZXN0YXJ0OgorCQkvKiBzY2FuIGVhY2ggZWxlbWVudCBpbiBmcmFtZSdzIHF1ZXVlIGZvciBjb21wbGV0aW9ucyAqLworCQlxX3AgPSAmb3h1LT5wc2hhZG93W2ZyYW1lXTsKKwkJaHdfcCA9ICZveHUtPnBlcmlvZGljW2ZyYW1lXTsKKwkJcS5wdHIgPSBxX3AtPnB0cjsKKwkJdHlwZSA9IFFfTkVYVF9UWVBFKCpod19wKTsKKwkJbW9kaWZpZWQgPSAwOworCisJCXdoaWxlIChxLnB0ciAhPSBOVUxMKSB7CisJCQl1bmlvbiBlaGNpX3NoYWRvdyB0ZW1wOworCQkJaW50IGxpdmU7CisKKwkJCWxpdmUgPSBIQ19JU19SVU5OSU5HKG94dV90b19oY2Qob3h1KS0+c3RhdGUpOworCQkJc3dpdGNoICh0eXBlKSB7CisJCQljYXNlIFFfVFlQRV9RSDoKKwkJCQkvKiBoYW5kbGUgYW55IGNvbXBsZXRpb25zICovCisJCQkJdGVtcC5xaCA9IHFoX2dldChxLnFoKTsKKwkJCQl0eXBlID0gUV9ORVhUX1RZUEUocS5xaC0+aHdfbmV4dCk7CisJCQkJcSA9IHEucWgtPnFoX25leHQ7CisJCQkJbW9kaWZpZWQgPSBxaF9jb21wbGV0aW9ucyhveHUsIHRlbXAucWgpOworCQkJCWlmICh1bmxpa2VseShsaXN0X2VtcHR5KCZ0ZW1wLnFoLT5xdGRfbGlzdCkpKQorCQkJCQlpbnRyX2Rlc2NoZWR1bGUob3h1LCB0ZW1wLnFoKTsKKwkJCQlxaF9wdXQodGVtcC5xaCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWRiZygiY29ycnVwdCB0eXBlICVkIGZyYW1lICVkIHNoYWRvdyAlcCIsCisJCQkJCXR5cGUsIGZyYW1lLCBxLnB0cik7CisJCQkJcS5wdHIgPSBOVUxMOworCQkJfQorCisJCQkvKiBhc3N1bWUgY29tcGxldGlvbiBjYWxsYmFja3MgbW9kaWZ5IHRoZSBxdWV1ZSAqLworCQkJaWYgKHVubGlrZWx5KG1vZGlmaWVkKSkKKwkJCQlnb3RvIHJlc3RhcnQ7CisJCX0KKworCQkvKiBTdG9wIHdoZW4gd2UgY2F0Y2ggdXAgdG8gdGhlIEhDICovCisKKwkJLyogRklYTUU6ICB0aGlzIGFzc3VtZXMgd2Ugd29uJ3QgZ2V0IGxhcHBlZCB3aGVuCisJCSAqIGxhdGVuY2llcyBjbGltYjsgdGhhdCBzaG91bGQgYmUgcmFyZSwgYnV0Li4uCisJCSAqIGRldGVjdCBpdCwgYW5kIGp1c3QgZ28gYWxsIHRoZSB3YXkgYXJvdW5kLgorCQkgKiBGTFIgbWlnaHQgaGVscCBkZXRlY3QgdGhpcyBjYXNlLCBzbyBsb25nIGFzIGxhdGVuY2llcworCQkgKiBkb24ndCBleGNlZWQgcGVyaW9kaWNfc2l6ZSBtc2VjIChkZWZhdWx0IDEuMDI0IHNlYykuCisJCSAqLworCisJCS8qIEZJWE1FOiBsaWtld2lzZSBhc3N1bWVzIEhDIGRvZXNuJ3QgaGFsdCBtaWQtc2NhbiAqLworCisJCWlmIChub3dfdWZyYW1lID09IGNsb2NrKSB7CisJCQl1bnNpZ25lZAlub3c7CisKKwkJCWlmICghSENfSVNfUlVOTklORyhveHVfdG9faGNkKG94dSktPnN0YXRlKSkKKwkJCQlicmVhazsKKwkJCW94dS0+bmV4dF91ZnJhbWUgPSBub3dfdWZyYW1lOworCQkJbm93ID0gcmVhZGwoJm94dS0+cmVncy0+ZnJhbWVfaW5kZXgpICUgbW9kOworCQkJaWYgKG5vd191ZnJhbWUgPT0gbm93KQorCQkJCWJyZWFrOworCisJCQkvKiByZXNjYW4gdGhlIHJlc3Qgb2YgdGhpcyBmcmFtZSwgdGhlbiAuLi4gKi8KKwkJCWNsb2NrID0gbm93OworCQl9IGVsc2UgeworCQkJbm93X3VmcmFtZSsrOworCQkJbm93X3VmcmFtZSAlPSBtb2Q7CisJCX0KKwl9Cit9CisKKy8qIE9uIHNvbWUgc3lzdGVtcywgbGVhdmluZyByZW1vdGUgd2FrZXVwIGVuYWJsZWQgcHJldmVudHMgc3lzdGVtIHNodXRkb3duLgorICogVGhlIGZpcm13YXJlIHNlZW1zIHRvIHRoaW5rIHRoYXQgcG93ZXJpbmcgb2ZmIGlzIGEgd2FrZXVwIGV2ZW50IQorICogVGhpcyByb3V0aW5lIHR1cm5zIG9mZiByZW1vdGUgd2FrZXVwIGFuZCBldmVyeXRoaW5nIGVsc2UsIG9uIGFsbCBwb3J0cy4KKyAqLworc3RhdGljIHZvaWQgZWhjaV90dXJuX29mZl9hbGxfcG9ydHMoc3RydWN0IG94dV9oY2QgKm94dSkKK3sKKwlpbnQgcG9ydCA9IEhDU19OX1BPUlRTKG94dS0+aGNzX3BhcmFtcyk7CisKKwl3aGlsZSAocG9ydC0tKQorCQl3cml0ZWwoUE9SVF9SV0NfQklUUywgJm94dS0+cmVncy0+cG9ydF9zdGF0dXNbcG9ydF0pOworfQorCitzdGF0aWMgdm9pZCBlaGNpX3BvcnRfcG93ZXIoc3RydWN0IG94dV9oY2QgKm94dSwgaW50IGlzX29uKQoreworCXVuc2lnbmVkIHBvcnQ7CisKKwlpZiAoIUhDU19QUEMob3h1LT5oY3NfcGFyYW1zKSkKKwkJcmV0dXJuOworCisJb3h1X2RiZyhveHUsICIuLi5wb3dlciVzIHBvcnRzLi4uXG4iLCBpc19vbiA/ICJ1cCIgOiAiZG93biIpOworCWZvciAocG9ydCA9IEhDU19OX1BPUlRTKG94dS0+aGNzX3BhcmFtcyk7IHBvcnQgPiAwOyApCisJCSh2b2lkKSBveHVfaHViX2NvbnRyb2wob3h1X3RvX2hjZChveHUpLAorCQkJCWlzX29uID8gU2V0UG9ydEZlYXR1cmUgOiBDbGVhclBvcnRGZWF0dXJlLAorCQkJCVVTQl9QT1JUX0ZFQVRfUE9XRVIsCisJCQkJcG9ydC0tLCBOVUxMLCAwKTsKKwltc2xlZXAoMjApOworfQorCisvKiBDYWxsZWQgZnJvbSBzb21lIGludGVycnVwdHMsIHRpbWVycywgYW5kIHNvIG9uLgorICogSXQgY2FsbHMgZHJpdmVyIGNvbXBsZXRpb24gZnVuY3Rpb25zLCBhZnRlciBkcm9wcGluZyBveHUtPmxvY2suCisgKi8KK3N0YXRpYyB2b2lkIGVoY2lfd29yayhzdHJ1Y3Qgb3h1X2hjZCAqb3h1KQoreworCXRpbWVyX2FjdGlvbl9kb25lKG94dSwgVElNRVJfSU9fV0FUQ0hET0cpOworCWlmIChveHUtPnJlY2xhaW1fcmVhZHkpCisJCWVuZF91bmxpbmtfYXN5bmMob3h1KTsKKworCS8qIGFub3RoZXIgQ1BVIG1heSBkcm9wIG94dS0+bG9jayBkdXJpbmcgYSBzY2hlZHVsZSBzY2FuIHdoaWxlCisJICogaXQgcmVwb3J0cyB1cmIgY29tcGxldGlvbnMuICB0aGlzIGZsYWcgZ3VhcmRzIGFnYWluc3QgYm9ndXMKKwkgKiBhdHRlbXB0cyBhdCByZS1lbnRyYW50IHNjaGVkdWxlIHNjYW5uaW5nLgorCSAqLworCWlmIChveHUtPnNjYW5uaW5nKQorCQlyZXR1cm47CisJb3h1LT5zY2FubmluZyA9IDE7CisJc2Nhbl9hc3luYyhveHUpOworCWlmIChveHUtPm5leHRfdWZyYW1lICE9IC0xKQorCQlzY2FuX3BlcmlvZGljKG94dSk7CisJb3h1LT5zY2FubmluZyA9IDA7CisKKwkvKiB0aGUgSU8gd2F0Y2hkb2cgZ3VhcmRzIGFnYWluc3QgaGFyZHdhcmUgb3IgZHJpdmVyIGJ1Z3MgdGhhdAorCSAqIG1pc3BsYWNlIElSUXMsIGFuZCBzaG91bGQgbGV0IHVzIHJ1biBjb21wbGV0ZWx5IHdpdGhvdXQgSVJRcy4KKwkgKiBzdWNoIGxvc3NhZ2UgaGFzIGJlZW4gb2JzZXJ2ZWQgb24gYm90aCBWVDYyMDIgYW5kIFZUODIzNS4KKwkgKi8KKwlpZiAoSENfSVNfUlVOTklORyhveHVfdG9faGNkKG94dSktPnN0YXRlKSAmJgorCQkJKG94dS0+YXN5bmMtPnFoX25leHQucHRyICE9IE5VTEwgfHwKKwkJCSBveHUtPnBlcmlvZGljX3NjaGVkICE9IDApKQorCQl0aW1lcl9hY3Rpb24ob3h1LCBUSU1FUl9JT19XQVRDSERPRyk7Cit9CisKK3N0YXRpYyB2b2lkIHVubGlua19hc3luYyhzdHJ1Y3Qgb3h1X2hjZCAqb3h1LCBzdHJ1Y3QgZWhjaV9xaCAqcWgpCit7CisJLyogaWYgd2UgbmVlZCB0byB1c2UgSUFBIGFuZCBpdCdzIGJ1c3ksIGRlZmVyICovCisJaWYgKHFoLT5xaF9zdGF0ZSA9PSBRSF9TVEFURV9MSU5LRUQKKwkJCSYmIG94dS0+cmVjbGFpbQorCQkJJiYgSENfSVNfUlVOTklORyhveHVfdG9faGNkKG94dSktPnN0YXRlKSkgeworCQlzdHJ1Y3QgZWhjaV9xaAkJKmxhc3Q7CisKKwkJZm9yIChsYXN0ID0gb3h1LT5yZWNsYWltOworCQkJCWxhc3QtPnJlY2xhaW07CisJCQkJbGFzdCA9IGxhc3QtPnJlY2xhaW0pCisJCQljb250aW51ZTsKKwkJcWgtPnFoX3N0YXRlID0gUUhfU1RBVEVfVU5MSU5LX1dBSVQ7CisJCWxhc3QtPnJlY2xhaW0gPSBxaDsKKworCS8qIGJ5cGFzcyBJQUEgaWYgdGhlIGhjIGNhbid0IGNhcmUgKi8KKwl9IGVsc2UgaWYgKCFIQ19JU19SVU5OSU5HKG94dV90b19oY2Qob3h1KS0+c3RhdGUpICYmIG94dS0+cmVjbGFpbSkKKwkJZW5kX3VubGlua19hc3luYyhveHUpOworCisJLyogc29tZXRoaW5nIGVsc2UgbWlnaHQgaGF2ZSB1bmxpbmtlZCB0aGUgcWggYnkgbm93ICovCisJaWYgKHFoLT5xaF9zdGF0ZSA9PSBRSF9TVEFURV9MSU5LRUQpCisJCXN0YXJ0X3VubGlua19hc3luYyhveHUsIHFoKTsKK30KKworLyoKKyAqIFVTQiBob3N0IGNvbnRyb2xsZXIgbWV0aG9kcworICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBveHUyMTBfaGNkX2lycShzdHJ1Y3QgdXNiX2hjZCAqaGNkKQoreworCXN0cnVjdCBveHVfaGNkICpveHUgPSBoY2RfdG9fb3h1KGhjZCk7CisJdTMyIHN0YXR1cywgcGNkX3N0YXR1cyA9IDA7CisJaW50IGJoOworCisJc3Bpbl9sb2NrKCZveHUtPmxvY2spOworCisJc3RhdHVzID0gcmVhZGwoJm94dS0+cmVncy0+c3RhdHVzKTsKKworCS8qIGUuZy4gY2FyZGJ1cyBwaHlzaWNhbCBlamVjdCAqLworCWlmIChzdGF0dXMgPT0gfih1MzIpIDApIHsKKwkJb3h1X2RiZyhveHUsICJkZXZpY2UgcmVtb3ZlZFxuIik7CisJCWdvdG8gZGVhZDsKKwl9CisKKwlzdGF0dXMgJj0gSU5UUl9NQVNLOworCWlmICghc3RhdHVzKSB7CQkJLyogaXJxIHNoYXJpbmc/ICovCisJCXNwaW5fdW5sb2NrKCZveHUtPmxvY2spOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJLyogY2xlYXIgKGp1c3QpIGludGVycnVwdHMgKi8KKwl3cml0ZWwoc3RhdHVzLCAmb3h1LT5yZWdzLT5zdGF0dXMpOworCXJlYWRsKCZveHUtPnJlZ3MtPmNvbW1hbmQpOwkvKiB1bmJsb2NrIHBvc3RlZCB3cml0ZSAqLworCWJoID0gMDsKKworI2lmZGVmIE9YVV9WRVJCT1NFX0RFQlVHCisJLyogdW5yZXF1ZXN0ZWQvaWdub3JlZDogRnJhbWUgTGlzdCBSb2xsb3ZlciAqLworCWRiZ19zdGF0dXMob3h1LCAiaXJxIiwgc3RhdHVzKTsKKyNlbmRpZgorCisJLyogSU5ULCBFUlIsIGFuZCBJQUEgaW50ZXJydXB0IHJhdGVzIGNhbiBiZSB0aHJvdHRsZWQgKi8KKworCS8qIG5vcm1hbCBbNC4xNS4xLjJdIG9yIGVycm9yIFs0LjE1LjEuMV0gY29tcGxldGlvbiAqLworCWlmIChsaWtlbHkoKHN0YXR1cyAmIChTVFNfSU5UfFNUU19FUlIpKSAhPSAwKSkKKwkJYmggPSAxOworCisJLyogY29tcGxldGUgdGhlIHVubGlua2luZyBvZiBzb21lIHFoIFs0LjE1LjIuM10gKi8KKwlpZiAoc3RhdHVzICYgU1RTX0lBQSkgeworCQlveHUtPnJlY2xhaW1fcmVhZHkgPSAxOworCQliaCA9IDE7CisJfQorCisJLyogcmVtb3RlIHdha2V1cCBbNC4zLjFdICovCisJaWYgKHN0YXR1cyAmIFNUU19QQ0QpIHsKKwkJdW5zaWduZWQgaSA9IEhDU19OX1BPUlRTKG94dS0+aGNzX3BhcmFtcyk7CisJCXBjZF9zdGF0dXMgPSBzdGF0dXM7CisKKwkJLyogcmVzdW1lIHJvb3QgaHViPyAqLworCQlpZiAoIShyZWFkbCgmb3h1LT5yZWdzLT5jb21tYW5kKSAmIENNRF9SVU4pKQorCQkJdXNiX2hjZF9yZXN1bWVfcm9vdF9odWIoaGNkKTsKKworCQl3aGlsZSAoaS0tKSB7CisJCQlpbnQgcHN0YXR1cyA9IHJlYWRsKCZveHUtPnJlZ3MtPnBvcnRfc3RhdHVzW2ldKTsKKworCQkJaWYgKHBzdGF0dXMgJiBQT1JUX09XTkVSKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCEocHN0YXR1cyAmIFBPUlRfUkVTVU1FKQorCQkJCQl8fCBveHUtPnJlc2V0X2RvbmVbaV0gIT0gMCkKKwkJCQljb250aW51ZTsKKworCQkJLyogc3RhcnQgMjAgbXNlYyByZXN1bWUgc2lnbmFsaW5nIGZyb20gdGhpcyBwb3J0LAorCQkJICogYW5kIG1ha2Uga2h1YmQgY29sbGVjdCBQT1JUX1NUQVRfQ19TVVNQRU5EIHRvCisJCQkgKiBzdG9wIHRoYXQgc2lnbmFsaW5nLgorCQkJICovCisJCQlveHUtPnJlc2V0X2RvbmVbaV0gPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyMCk7CisJCQlveHVfZGJnKG94dSwgInBvcnQgJWQgcmVtb3RlIHdha2V1cFxuIiwgaSArIDEpOworCQkJbW9kX3RpbWVyKCZoY2QtPnJoX3RpbWVyLCBveHUtPnJlc2V0X2RvbmVbaV0pOworCQl9CisJfQorCisJLyogUENJIGVycm9ycyBbNC4xNS4yLjRdICovCisJaWYgKHVubGlrZWx5KChzdGF0dXMgJiBTVFNfRkFUQUwpICE9IDApKSB7CisJCS8qIGJvZ3VzICJmYXRhbCIgSVJRcyBhcHBlYXIgb24gc29tZSBjaGlwcy4uLiB3aHk/ICAqLworCQlzdGF0dXMgPSByZWFkbCgmb3h1LT5yZWdzLT5zdGF0dXMpOworCQlkYmdfY21kKG94dSwgImZhdGFsIiwgcmVhZGwoJm94dS0+cmVncy0+Y29tbWFuZCkpOworCQlkYmdfc3RhdHVzKG94dSwgImZhdGFsIiwgc3RhdHVzKTsKKwkJaWYgKHN0YXR1cyAmIFNUU19IQUxUKSB7CisJCQlveHVfZXJyKG94dSwgImZhdGFsIGVycm9yXG4iKTsKK2RlYWQ6CisJCQllaGNpX3Jlc2V0KG94dSk7CisJCQl3cml0ZWwoMCwgJm94dS0+cmVncy0+Y29uZmlndXJlZF9mbGFnKTsKKwkJCS8qIGdlbmVyaWMgbGF5ZXIga2lsbHMvdW5saW5rcyBhbGwgdXJicywgdGhlbgorCQkJICogdXNlcyBveHVfc3RvcCB0byBjbGVhbiB1cCB0aGUgcmVzdAorCQkJICovCisJCQliaCA9IDE7CisJCX0KKwl9CisKKwlpZiAoYmgpCisJCWVoY2lfd29yayhveHUpOworCXNwaW5fdW5sb2NrKCZveHUtPmxvY2spOworCWlmIChwY2Rfc3RhdHVzICYgU1RTX1BDRCkKKwkJdXNiX2hjZF9wb2xsX3JoX3N0YXR1cyhoY2QpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IG94dV9pcnEoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlzdHJ1Y3Qgb3h1X2hjZCAqb3h1ID0gaGNkX3RvX294dShoY2QpOworCWludCByZXQgPSBJUlFfSEFORExFRDsKKworCXUzMiBzdGF0dXMgPSBveHVfcmVhZGwoaGNkLT5yZWdzLCBPWFVfQ0hJUElSUVNUQVRVUyk7CisJdTMyIGVuYWJsZSA9IG94dV9yZWFkbChoY2QtPnJlZ3MsIE9YVV9DSElQSVJRRU5fU0VUKTsKKworCS8qIERpc2FibGUgYWxsIGludGVycnVwdCAqLworCW94dV93cml0ZWwoaGNkLT5yZWdzLCBPWFVfQ0hJUElSUUVOX0NMUiwgZW5hYmxlKTsKKworCWlmICgob3h1LT5pc19vdGcgJiYgKHN0YXR1cyAmIE9YVV9VU0JPVEdJKSkgfHwKKwkJKCFveHUtPmlzX290ZyAmJiAoc3RhdHVzICYgT1hVX1VTQlNQSEkpKSkKKwkJb3h1MjEwX2hjZF9pcnEoaGNkKTsKKwllbHNlCisJCXJldCA9IElSUV9OT05FOworCisJLyogRW5hYmxlIGFsbCBpbnRlcnJ1cHQgYmFjayAqLworCW94dV93cml0ZWwoaGNkLT5yZWdzLCBPWFVfQ0hJUElSUUVOX1NFVCwgZW5hYmxlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG94dV93YXRjaGRvZyh1bnNpZ25lZCBsb25nIHBhcmFtKQoreworCXN0cnVjdCBveHVfaGNkCSpveHUgPSAoc3RydWN0IG94dV9oY2QgKikgcGFyYW07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZveHUtPmxvY2ssIGZsYWdzKTsKKworCS8qIGxvc3QgSUFBIGlycXMgd2VkZ2UgdGhpbmdzIGJhZGx5OyBzZWVuIHdpdGggYSB2dDgyMzUgKi8KKwlpZiAob3h1LT5yZWNsYWltKSB7CisJCXUzMiBzdGF0dXMgPSByZWFkbCgmb3h1LT5yZWdzLT5zdGF0dXMpOworCQlpZiAoc3RhdHVzICYgU1RTX0lBQSkgeworCQkJb3h1X3ZkYmcob3h1LCAibG9zdCBJQUFcbiIpOworCQkJd3JpdGVsKFNUU19JQUEsICZveHUtPnJlZ3MtPnN0YXR1cyk7CisJCQlveHUtPnJlY2xhaW1fcmVhZHkgPSAxOworCQl9CisJfQorCisJLyogc3RvcCBhc3luYyBwcm9jZXNzaW5nIGFmdGVyIGl0J3MgaWRsZWQgYSBiaXQgKi8KKwlpZiAodGVzdF9iaXQoVElNRVJfQVNZTkNfT0ZGLCAmb3h1LT5hY3Rpb25zKSkKKwkJc3RhcnRfdW5saW5rX2FzeW5jKG94dSwgb3h1LT5hc3luYyk7CisKKwkvKiBveHUgY291bGQgcnVuIGJ5IHRpbWVyLCB3aXRob3V0IElSUXMgLi4uICovCisJZWhjaV93b3JrKG94dSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZveHUtPmxvY2ssIGZsYWdzKTsKK30KKworLyogT25lLXRpbWUgaW5pdCwgb25seSBmb3IgbWVtb3J5IHN0YXRlLgorICovCitzdGF0aWMgaW50IG94dV9oY2RfaW5pdChzdHJ1Y3QgdXNiX2hjZCAqaGNkKQoreworCXN0cnVjdCBveHVfaGNkICpveHUgPSBoY2RfdG9fb3h1KGhjZCk7CisJdTMyIHRlbXA7CisJaW50IHJldHZhbDsKKwl1MzIgaGNjX3BhcmFtczsKKworCXNwaW5fbG9ja19pbml0KCZveHUtPmxvY2spOworCisJaW5pdF90aW1lcigmb3h1LT53YXRjaGRvZyk7CisJb3h1LT53YXRjaGRvZy5mdW5jdGlvbiA9IG94dV93YXRjaGRvZzsKKwlveHUtPndhdGNoZG9nLmRhdGEgPSAodW5zaWduZWQgbG9uZykgb3h1OworCisJLyoKKwkgKiBodyBkZWZhdWx0OiAxSyBwZXJpb2RpYyBsaXN0IGhlYWRzLCBvbmUgcGVyIGZyYW1lLgorCSAqIHBlcmlvZGljX3NpemUgY2FuIHNocmluayBieSBVU0JDTUQgdXBkYXRlIGlmIGhjY19wYXJhbXMgYWxsb3dzLgorCSAqLworCW94dS0+cGVyaW9kaWNfc2l6ZSA9IERFRkFVTFRfSV9URFBTOworCXJldHZhbCA9IGVoY2lfbWVtX2luaXQob3h1LCBHRlBfS0VSTkVMKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCS8qIGNvbnRyb2xsZXJzIG1heSBjYWNoZSBzb21lIG9mIHRoZSBwZXJpb2RpYyBzY2hlZHVsZSAuLi4gKi8KKwloY2NfcGFyYW1zID0gcmVhZGwoJm94dS0+Y2Fwcy0+aGNjX3BhcmFtcyk7CisJaWYgKEhDQ19JU09DX0NBQ0hFKGhjY19wYXJhbXMpKQkJLyogZnVsbCBmcmFtZSBjYWNoZSAqLworCQlveHUtPmlfdGhyZXNoID0gODsKKwllbHNlCQkJCQkvKiBOIG1pY3JvZnJhbWVzIGNhY2hlZCAqLworCQlveHUtPmlfdGhyZXNoID0gMiArIEhDQ19JU09DX1RIUkVTKGhjY19wYXJhbXMpOworCisJb3h1LT5yZWNsYWltID0gTlVMTDsKKwlveHUtPnJlY2xhaW1fcmVhZHkgPSAwOworCW94dS0+bmV4dF91ZnJhbWUgPSAtMTsKKworCS8qCisJICogZGVkaWNhdGUgYSBxaCBmb3IgdGhlIGFzeW5jIHJpbmcgaGVhZCwgc2luY2Ugd2UgY291bGRuJ3QgdW5saW5rCisJICogYSAncmVhbCcgcWggd2l0aG91dCBzdG9wcGluZyB0aGUgYXN5bmMgc2NoZWR1bGUgWzQuOF0uICB1c2UgaXQKKwkgKiBhcyB0aGUgJ3JlY2xhbWF0aW9uIGxpc3QgaGVhZCcgdG9vLgorCSAqIGl0cyBkdW1teSBpcyB1c2VkIGluIGh3X2FsdF9uZXh0IG9mIG1hbnkgdGRzLCB0byBwcmV2ZW50IHRoZSBxaAorCSAqIGZyb20gYXV0b21hdGljYWxseSBhZHZhbmNpbmcgdG8gdGhlIG5leHQgdGQgYWZ0ZXIgc2hvcnQgcmVhZHMuCisJICovCisJb3h1LT5hc3luYy0+cWhfbmV4dC5xaCA9IE5VTEw7CisJb3h1LT5hc3luYy0+aHdfbmV4dCA9IFFIX05FWFQob3h1LT5hc3luYy0+cWhfZG1hKTsKKwlveHUtPmFzeW5jLT5od19pbmZvMSA9IGNwdV90b19sZTMyKFFIX0hFQUQpOworCW94dS0+YXN5bmMtPmh3X3Rva2VuID0gY3B1X3RvX2xlMzIoUVREX1NUU19IQUxUKTsKKwlveHUtPmFzeW5jLT5od19xdGRfbmV4dCA9IEVIQ0lfTElTVF9FTkQ7CisJb3h1LT5hc3luYy0+cWhfc3RhdGUgPSBRSF9TVEFURV9MSU5LRUQ7CisJb3h1LT5hc3luYy0+aHdfYWx0X25leHQgPSBRVERfTkVYVChveHUtPmFzeW5jLT5kdW1teS0+cXRkX2RtYSk7CisKKwkvKiBjbGVhciBpbnRlcnJ1cHQgZW5hYmxlcywgc2V0IGlycSBsYXRlbmN5ICovCisJaWYgKGxvZzJfaXJxX3RocmVzaCA8IDAgfHwgbG9nMl9pcnFfdGhyZXNoID4gNikKKwkJbG9nMl9pcnFfdGhyZXNoID0gMDsKKwl0ZW1wID0gMSA8PCAoMTYgKyBsb2cyX2lycV90aHJlc2gpOworCWlmIChIQ0NfQ0FOUEFSSyhoY2NfcGFyYW1zKSkgeworCQkvKiBIVyBkZWZhdWx0IHBhcmsgPT0gMywgb24gaGFyZHdhcmUgdGhhdCBzdXBwb3J0cyBpdCAobGlrZQorCQkgKiBOVmlkaWEgYW5kIEFMSSBzaWxpY29uKSwgbWF4aW1pemVzIHRocm91Z2hwdXQgb24gdGhlIGFzeW5jCisJCSAqIHNjaGVkdWxlIGJ5IGF2b2lkaW5nIFFIIGZldGNoZXMgYmV0d2VlbiB0cmFuc2ZlcnMuCisJCSAqCisJCSAqIFdpdGggZmFzdCB1c2Igc3RvcmFnZSBkZXZpY2VzIGFuZCBORm9yY2UyLCAicGFyayIgc2VlbXMgdG8KKwkJICogbWFrZSBwcm9ibGVtczogIHRocm91Z2hwdXQgcmVkdWN0aW9uICghKSwgZGF0YSBlcnJvcnMuLi4KKwkJICovCisJCWlmIChwYXJrKSB7CisJCQlwYXJrID0gbWluKHBhcmssICh1bnNpZ25lZCkgMyk7CisJCQl0ZW1wIHw9IENNRF9QQVJLOworCQkJdGVtcCB8PSBwYXJrIDw8IDg7CisJCX0KKwkJb3h1X2RiZyhveHUsICJwYXJrICVkXG4iLCBwYXJrKTsKKwl9CisJaWYgKEhDQ19QR01fRlJBTUVMSVNUTEVOKGhjY19wYXJhbXMpKSB7CisJCS8qIHBlcmlvZGljIHNjaGVkdWxlIHNpemUgY2FuIGJlIHNtYWxsZXIgdGhhbiBkZWZhdWx0ICovCisJCXRlbXAgJj0gfigzIDw8IDIpOworCQl0ZW1wIHw9IChFSENJX1RVTkVfRkxTIDw8IDIpOworCX0KKwlveHUtPmNvbW1hbmQgPSB0ZW1wOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGxlZCBkdXJpbmcgcHJvYmUoKSBhZnRlciBjaGlwIHJlc2V0IGNvbXBsZXRlcy4KKyAqLworc3RhdGljIGludCBveHVfcmVzZXQoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlzdHJ1Y3Qgb3h1X2hjZCAqb3h1ID0gaGNkX3RvX294dShoY2QpOworCWludCByZXQ7CisKKwlzcGluX2xvY2tfaW5pdCgmb3h1LT5tZW1fbG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJm94dS0+dXJiX2xpc3QpOworCW94dS0+dXJiX2xlbiA9IDA7CisKKwkvKiBGSU1YRSAqLworCWhjZC0+c2VsZi5jb250cm9sbGVyLT5kbWFfbWFzayA9IDBVTDsKKworCWlmIChveHUtPmlzX290ZykgeworCQlveHUtPmNhcHMgPSBoY2QtPnJlZ3MgKyBPWFVfT1RHX0NBUF9PRkZTRVQ7CisJCW94dS0+cmVncyA9IGhjZC0+cmVncyArIE9YVV9PVEdfQ0FQX09GRlNFVCArIFwKKwkJCUhDX0xFTkdUSChyZWFkbCgmb3h1LT5jYXBzLT5oY19jYXBiYXNlKSk7CisKKwkJb3h1LT5tZW0gPSBoY2QtPnJlZ3MgKyBPWFVfU1BIX01FTTsKKwl9IGVsc2UgeworCQlveHUtPmNhcHMgPSBoY2QtPnJlZ3MgKyBPWFVfU1BIX0NBUF9PRkZTRVQ7CisJCW94dS0+cmVncyA9IGhjZC0+cmVncyArIE9YVV9TUEhfQ0FQX09GRlNFVCArIFwKKwkJCUhDX0xFTkdUSChyZWFkbCgmb3h1LT5jYXBzLT5oY19jYXBiYXNlKSk7CisKKwkJb3h1LT5tZW0gPSBoY2QtPnJlZ3MgKyBPWFVfT1RHX01FTTsKKwl9CisKKwlveHUtPmhjc19wYXJhbXMgPSByZWFkbCgmb3h1LT5jYXBzLT5oY3NfcGFyYW1zKTsKKwlveHUtPnNicm4gPSAweDIwOworCisJcmV0ID0gb3h1X2hjZF9pbml0KGhjZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG94dV9ydW4oc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlzdHJ1Y3Qgb3h1X2hjZCAqb3h1ID0gaGNkX3RvX294dShoY2QpOworCWludCByZXR2YWw7CisJdTMyIHRlbXAsIGhjY19wYXJhbXM7CisKKwloY2QtPnVzZXNfbmV3X3BvbGxpbmcgPSAxOworCWhjZC0+cG9sbF9yaCA9IDA7CisKKwkvKiBFSENJIHNwZWMgc2VjdGlvbiA0LjEgKi8KKwlyZXR2YWwgPSBlaGNpX3Jlc2V0KG94dSk7CisJaWYgKHJldHZhbCAhPSAwKSB7CisJCWVoY2lfbWVtX2NsZWFudXAob3h1KTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJd3JpdGVsKG94dS0+cGVyaW9kaWNfZG1hLCAmb3h1LT5yZWdzLT5mcmFtZV9saXN0KTsKKwl3cml0ZWwoKHUzMikgb3h1LT5hc3luYy0+cWhfZG1hLCAmb3h1LT5yZWdzLT5hc3luY19uZXh0KTsKKworCS8qIGhjY19wYXJhbXMgY29udHJvbHMgd2hldGhlciBveHUtPnJlZ3MtPnNlZ21lbnQgbXVzdCAoISEhKQorCSAqIGJlIHVzZWQ7IGl0IGNvbnN0cmFpbnMgUUgvSVREL1NJVEQgYW5kIFFURCBsb2NhdGlvbnMuCisJICogcGNpX3Bvb2wgY29uc2lzdGVudCBtZW1vcnkgYWx3YXlzIHVzZXMgc2VnbWVudCB6ZXJvLgorCSAqIHN0cmVhbWluZyBtYXBwaW5ncyBmb3IgSS9PIGJ1ZmZlcnMsIGxpa2UgcGNpX21hcF9zaW5nbGUoKSwKKwkgKiBjYW4gcmV0dXJuIHNlZ21lbnRzIGFib3ZlIDRHQiwgaWYgdGhlIGRldmljZSBhbGxvd3MuCisJICoKKwkgKiBOT1RFOiAgdGhlIGRtYSBtYXNrIGlzIHZpc2libGUgdGhyb3VnaCBkbWFfc3VwcG9ydGVkKCksIHNvCisJICogZHJpdmVycyBjYW4gcGFzcyB0aGlzIGluZm8gYWxvbmcgLi4uIGxpa2UgTkVUSUZfRl9ISUdIRE1BLAorCSAqIFNjc2lfSG9zdC5oaWdobWVtX2lvLCBhbmQgc28gZm9ydGguICBJdCdzIHJlYWRvbmx5IHRvIGFsbAorCSAqIGhvc3Qgc2lkZSBkcml2ZXJzIHRob3VnaC4KKwkgKi8KKwloY2NfcGFyYW1zID0gcmVhZGwoJm94dS0+Y2Fwcy0+aGNjX3BhcmFtcyk7CisJaWYgKEhDQ182NEJJVF9BRERSKGhjY19wYXJhbXMpKQorCQl3cml0ZWwoMCwgJm94dS0+cmVncy0+c2VnbWVudCk7CisKKwlveHUtPmNvbW1hbmQgJj0gfihDTURfTFJFU0VUIHwgQ01EX0lBQUQgfCBDTURfUFNFIHwKKwkJCQlDTURfQVNFIHwgQ01EX1JFU0VUKTsKKwlveHUtPmNvbW1hbmQgfD0gQ01EX1JVTjsKKwl3cml0ZWwob3h1LT5jb21tYW5kLCAmb3h1LT5yZWdzLT5jb21tYW5kKTsKKwlkYmdfY21kKG94dSwgImluaXQiLCBveHUtPmNvbW1hbmQpOworCisJLyoKKwkgKiBTdGFydCwgZW5hYmxpbmcgZnVsbCBVU0IgMi4wIGZ1bmN0aW9uYWxpdHkgLi4uIHVzYiAxLjEgZGV2aWNlcworCSAqIGFyZSBleHBsaWNpdGx5IGhhbmRlZCB0byBjb21wYW5pb24gY29udHJvbGxlcihzKSwgc28gbm8gVFQgaXMKKwkgKiBpbnZvbHZlZCB3aXRoIHRoZSByb290IGh1Yi4gIChFeGNlcHQgd2hlcmUgb25lIGlzIGludGVncmF0ZWQsCisJICogYW5kIHRoZXJlJ3Mgbm8gY29tcGFuaW9uIGNvbnRyb2xsZXIgdW5sZXNzIG1heWJlIGZvciBVU0IgT1RHLikKKwkgKi8KKwloY2QtPnN0YXRlID0gSENfU1RBVEVfUlVOTklORzsKKwl3cml0ZWwoRkxBR19DRiwgJm94dS0+cmVncy0+Y29uZmlndXJlZF9mbGFnKTsKKwlyZWFkbCgmb3h1LT5yZWdzLT5jb21tYW5kKTsJLyogdW5ibG9jayBwb3N0ZWQgd3JpdGVzICovCisKKwl0ZW1wID0gSENfVkVSU0lPTihyZWFkbCgmb3h1LT5jYXBzLT5oY19jYXBiYXNlKSk7CisJb3h1X2luZm8ob3h1LCAiVVNCICV4LiV4IHN0YXJ0ZWQsIHF1YXNpLUVIQ0kgJXguJTAyeCwgZHJpdmVyICVzJXNcbiIsCisJCSgob3h1LT5zYnJuICYgMHhmMCk+PjQpLCAob3h1LT5zYnJuICYgMHgwZiksCisJCXRlbXAgPj4gOCwgdGVtcCAmIDB4ZmYsIERSSVZFUl9WRVJTSU9OLAorCQlpZ25vcmVfb2MgPyAiLCBvdmVyY3VycmVudCBpZ25vcmVkIiA6ICIiKTsKKworCXdyaXRlbChJTlRSX01BU0ssICZveHUtPnJlZ3MtPmludHJfZW5hYmxlKTsgLyogVHVybiBPbiBJbnRlcnJ1cHRzICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgb3h1X3N0b3Aoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlzdHJ1Y3Qgb3h1X2hjZCAqb3h1ID0gaGNkX3RvX294dShoY2QpOworCisJLyogVHVybiBvZmYgcG9ydCBwb3dlciBvbiBhbGwgcm9vdCBodWIgcG9ydHMuICovCisJZWhjaV9wb3J0X3Bvd2VyKG94dSwgMCk7CisKKwkvKiBubyBtb3JlIGludGVycnVwdHMgLi4uICovCisJZGVsX3RpbWVyX3N5bmMoJm94dS0+d2F0Y2hkb2cpOworCisJc3Bpbl9sb2NrX2lycSgmb3h1LT5sb2NrKTsKKwlpZiAoSENfSVNfUlVOTklORyhoY2QtPnN0YXRlKSkKKwkJZWhjaV9xdWllc2NlKG94dSk7CisKKwllaGNpX3Jlc2V0KG94dSk7CisJd3JpdGVsKDAsICZveHUtPnJlZ3MtPmludHJfZW5hYmxlKTsKKwlzcGluX3VubG9ja19pcnEoJm94dS0+bG9jayk7CisKKwkvKiBsZXQgY29tcGFuaW9uIGNvbnRyb2xsZXJzIHdvcmsgd2hlbiB3ZSBhcmVuJ3QgKi8KKwl3cml0ZWwoMCwgJm94dS0+cmVncy0+Y29uZmlndXJlZF9mbGFnKTsKKworCS8qIHJvb3QgaHViIGlzIHNodXQgZG93biBzZXBhcmF0ZWx5IChmaXJzdCwgd2hlbiBwb3NzaWJsZSkgKi8KKwlzcGluX2xvY2tfaXJxKCZveHUtPmxvY2spOworCWlmIChveHUtPmFzeW5jKQorCQllaGNpX3dvcmsob3h1KTsKKwlzcGluX3VubG9ja19pcnEoJm94dS0+bG9jayk7CisJZWhjaV9tZW1fY2xlYW51cChveHUpOworCisJZGJnX3N0YXR1cyhveHUsICJveHVfc3RvcCBjb21wbGV0ZWQiLCByZWFkbCgmb3h1LT5yZWdzLT5zdGF0dXMpKTsKK30KKworLyogS2ljayBpbiBmb3Igc2lsaWNvbiBvbiBhbnkgYnVzIChub3QganVzdCBwY2ksIGV0YykuCisgKiBUaGlzIGZvcmNpYmx5IGRpc2FibGVzIGRtYSBhbmQgSVJRcywgaGVscGluZyBrZXhlYyBhbmQgb3RoZXIgY2FzZXMKKyAqIHdoZXJlIHRoZSBuZXh0IHN5c3RlbSBzb2Z0d2FyZSBtYXkgZXhwZWN0IGNsZWFuIHN0YXRlLgorICovCitzdGF0aWMgdm9pZCBveHVfc2h1dGRvd24oc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlzdHJ1Y3Qgb3h1X2hjZCAqb3h1ID0gaGNkX3RvX294dShoY2QpOworCisJKHZvaWQpIGVoY2lfaGFsdChveHUpOworCWVoY2lfdHVybl9vZmZfYWxsX3BvcnRzKG94dSk7CisKKwkvKiBtYWtlIEJJT1MvZXRjIHVzZSBjb21wYW5pb24gY29udHJvbGxlciBkdXJpbmcgcmVib290ICovCisJd3JpdGVsKDAsICZveHUtPnJlZ3MtPmNvbmZpZ3VyZWRfZmxhZyk7CisKKwkvKiB1bmJsb2NrIHBvc3RlZCB3cml0ZXMgKi8KKwlyZWFkbCgmb3h1LT5yZWdzLT5jb25maWd1cmVkX2ZsYWcpOworfQorCisvKiBOb24tZXJyb3IgcmV0dXJucyBhcmUgYSBwcm9taXNlIHRvIGdpdmViYWNrKCkgdGhlIHVyYiBsYXRlcgorICogd2UgZHJvcCBvd25lcnNoaXAgc28gbmV4dCBvd25lciAob3IgdXJiIHVubGluaykgY2FuIGdldCBpdAorICoKKyAqIHVyYiArIGRldiBpcyBpbiBoY2Quc2VsZi5jb250cm9sbGVyLnVyYl9saXN0CisgKiB3ZSdyZSBxdWV1ZWluZyBURHMgb250byBzb2Z0d2FyZSBhbmQgaGFyZHdhcmUgbGlzdHMKKyAqCisgKiBoY2Qtc3BlY2lmaWMgaW5pdCBmb3IgaGNwcml2IGhhc24ndCBiZWVuIGRvbmUgeWV0CisgKgorICogTk9URTogIGNvbnRyb2wsIGJ1bGssIGFuZCBpbnRlcnJ1cHQgc2hhcmUgdGhlIHNhbWUgY29kZSB0byBhcHBlbmQgVERzCisgKiB0byBhIChwb3NzaWJseSBhY3RpdmUpIFFILCBhbmQgdGhlIHNhbWUgUUggc2Nhbm5pbmcgY29kZS4KKyAqLworc3RhdGljIGludCBfX294dV91cmJfZW5xdWV1ZShzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBzdHJ1Y3QgdXJiICp1cmIsCisJCQkJZ2ZwX3QgbWVtX2ZsYWdzKQoreworCXN0cnVjdCBveHVfaGNkICpveHUgPSBoY2RfdG9fb3h1KGhjZCk7CisJc3RydWN0IGxpc3RfaGVhZCBxdGRfbGlzdDsKKworCUlOSVRfTElTVF9IRUFEKCZxdGRfbGlzdCk7CisKKwlzd2l0Y2ggKHVzYl9waXBldHlwZSh1cmItPnBpcGUpKSB7CisJY2FzZSBQSVBFX0NPTlRST0w6CisJY2FzZSBQSVBFX0JVTEs6CisJZGVmYXVsdDoKKwkJaWYgKCFxaF91cmJfdHJhbnNhY3Rpb24ob3h1LCB1cmIsICZxdGRfbGlzdCwgbWVtX2ZsYWdzKSkKKwkJCXJldHVybiAtRU5PTUVNOworCQlyZXR1cm4gc3VibWl0X2FzeW5jKG94dSwgdXJiLCAmcXRkX2xpc3QsIG1lbV9mbGFncyk7CisKKwljYXNlIFBJUEVfSU5URVJSVVBUOgorCQlpZiAoIXFoX3VyYl90cmFuc2FjdGlvbihveHUsIHVyYiwgJnF0ZF9saXN0LCBtZW1fZmxhZ3MpKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXJldHVybiBpbnRyX3N1Ym1pdChveHUsIHVyYiwgJnF0ZF9saXN0LCBtZW1fZmxhZ3MpOworCisJY2FzZSBQSVBFX0lTT0NIUk9OT1VTOgorCQlpZiAodXJiLT5kZXYtPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKQorCQkJcmV0dXJuIGl0ZF9zdWJtaXQob3h1LCB1cmIsIG1lbV9mbGFncyk7CisJCWVsc2UKKwkJCXJldHVybiBzaXRkX3N1Ym1pdChveHUsIHVyYiwgbWVtX2ZsYWdzKTsKKwl9Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGJyZWFraW5nIFVSQnMgd2l0aCBiaWcgZGF0YSBzaXplCisgKiBpbnRvIHNtYWxsZXIgc2l6ZSBhbmQgcHJvY2Vzc2luZyBzbWFsbCB1cmJzIGluIHNlcXVlbmNlLgorICovCitzdGF0aWMgaW50IG94dV91cmJfZW5xdWV1ZShzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBzdHJ1Y3QgdXJiICp1cmIsCisJCQkJZ2ZwX3QgbWVtX2ZsYWdzKQoreworCXN0cnVjdCBveHVfaGNkICpveHUgPSBoY2RfdG9fb3h1KGhjZCk7CisJaW50IG51bSwgcmVtOworCWludCB0cmFuc2Zlcl9idWZmZXJfbGVuZ3RoOworCXZvaWQgKnRyYW5zZmVyX2J1ZmZlcjsKKwlzdHJ1Y3QgdXJiICptdXJiOworCWludCBpLCByZXQ7CisKKwkvKiBJZiBub3QgYnVsayBwaXBlIGp1c3QgZW5xdWV1ZSB0aGUgVVJCICovCisJaWYgKCF1c2JfcGlwZWJ1bGsodXJiLT5waXBlKSkKKwkJcmV0dXJuIF9fb3h1X3VyYl9lbnF1ZXVlKGhjZCwgdXJiLCBtZW1fZmxhZ3MpOworCisJLyogT3RoZXJ3aXNlIHdlIHNob3VsZCB2ZXJpZnkgdGhlIFVTQiB0cmFuc2ZlciBidWZmZXIgc2l6ZSEgKi8KKwl0cmFuc2Zlcl9idWZmZXIgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKKwl0cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoOworCisJbnVtID0gdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoIC8gNDA5NjsKKwlyZW0gPSB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggJSA0MDk2OworCWlmIChyZW0gIT0gMCkKKwkJbnVtKys7CisKKwkvKiBJZiBVUkIgaXMgc21hbGxlciB0aGFuIDQwOTYgYnl0ZXMganVzdCBlbnF1ZXVlIGl0ISAqLworCWlmIChudW0gPT0gMSkKKwkJcmV0dXJuIF9fb3h1X3VyYl9lbnF1ZXVlKGhjZCwgdXJiLCBtZW1fZmxhZ3MpOworCisJLyogT2ssIHdlIGhhdmUgbW9yZSBqb2IgdG8gZG8hIDopICovCisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtIC0gMTsgaSsrKSB7CisJCS8qIEdldCBmcmVlIG1pY3JvIFVSQiBwb2xsIHRpbGwgYSBmcmVlIHVyYiBpcyByZWNpZXZlZCAqLworCisJCWRvIHsKKwkJCW11cmIgPSAoc3RydWN0IHVyYiAqKSBveHVfbXVyYl9hbGxvYyhveHUpOworCQkJaWYgKCFtdXJiKQorCQkJCXNjaGVkdWxlKCk7CisJCX0gd2hpbGUgKCFtdXJiKTsKKworCQkvKiBDb3BpbmcgdGhlIHVyYiAqLworCQltZW1jcHkobXVyYiwgdXJiLCBzaXplb2Yoc3RydWN0IHVyYikpOworCisJCW11cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSA0MDk2OworCQltdXJiLT50cmFuc2Zlcl9idWZmZXIgPSB0cmFuc2Zlcl9idWZmZXIgKyBpICogNDA5NjsKKworCQkvKiBOdWxsIHBvaW50ZXIgZm9yIHRoZSBlbmNvZGVzIHRoYXQgdGhpcyBpcyBhIG1pY3JvIHVyYiAqLworCQltdXJiLT5jb21wbGV0ZSA9IE5VTEw7CisKKwkJKChzdHJ1Y3Qgb3h1X211cmIgKikgbXVyYiktPm1haW4gPSB1cmI7CisJCSgoc3RydWN0IG94dV9tdXJiICopIG11cmIpLT5sYXN0ID0gMDsKKworCQkvKiBUaGlzIGxvb3AgaXMgdG8gZ3VhcmFudGVlIHVyYiB0byBiZSBwcm9jZXNzZWQgd2hlbiB0aGVyZSdzCisJCSAqIG5vdCBlbm91Z2ggcmVzb3VyY2VzIGF0IGEgcGFydGljdWxhciB0aW1lIGJ5IHJldHJ5aW5nLgorCQkgKi8KKwkJZG8geworCQkJcmV0ICA9IF9fb3h1X3VyYl9lbnF1ZXVlKGhjZCwgbXVyYiwgbWVtX2ZsYWdzKTsKKwkJCWlmIChyZXQpCisJCQkJc2NoZWR1bGUoKTsKKwkJfSB3aGlsZSAocmV0KTsKKwl9CisKKwkvKiBMYXN0IHVyYiByZXF1aXJlcyBzcGVjaWFsIGhhbmRsaW5nICAqLworCisJLyogR2V0IGZyZWUgbWljcm8gVVJCIHBvbGwgdGlsbCBhIGZyZWUgdXJiIGlzIHJlY2lldmVkICovCisJZG8geworCQltdXJiID0gKHN0cnVjdCB1cmIgKikgb3h1X211cmJfYWxsb2Mob3h1KTsKKwkJaWYgKCFtdXJiKQorCQkJc2NoZWR1bGUoKTsKKwl9IHdoaWxlICghbXVyYik7CisKKwkvKiBDb3BpbmcgdGhlIHVyYiAqLworCW1lbWNweShtdXJiLCB1cmIsIHNpemVvZihzdHJ1Y3QgdXJiKSk7CisKKwltdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gcmVtID4gMCA/IHJlbSA6IDQwOTY7CisJbXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gdHJhbnNmZXJfYnVmZmVyICsgKG51bSAtIDEpICogNDA5NjsKKworCS8qIE51bGwgcG9pbnRlciBmb3IgdGhlIGVuY29kZXMgdGhhdCB0aGlzIGlzIGEgbWljcm8gdXJiICovCisJbXVyYi0+Y29tcGxldGUgPSBOVUxMOworCisJKChzdHJ1Y3Qgb3h1X211cmIgKikgbXVyYiktPm1haW4gPSB1cmI7CisJKChzdHJ1Y3Qgb3h1X211cmIgKikgbXVyYiktPmxhc3QgPSAxOworCisJZG8geworCQlyZXQgPSBfX294dV91cmJfZW5xdWV1ZShoY2QsIG11cmIsIG1lbV9mbGFncyk7CisJCWlmIChyZXQpCisJCQlzY2hlZHVsZSgpOworCX0gd2hpbGUgKHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBSZW1vdmUgZnJvbSBoYXJkd2FyZSBsaXN0cy4KKyAqIENvbXBsZXRpb25zIG5vcm1hbGx5IGhhcHBlbiBhc3luY2hyb25vdXNseQorICovCitzdGF0aWMgaW50IG94dV91cmJfZGVxdWV1ZShzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBzdHJ1Y3QgdXJiICp1cmIsIGludCBzdGF0dXMpCit7CisJc3RydWN0IG94dV9oY2QgKm94dSA9IGhjZF90b19veHUoaGNkKTsKKwlzdHJ1Y3QgZWhjaV9xaCAqcWg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZveHUtPmxvY2ssIGZsYWdzKTsKKwlzd2l0Y2ggKHVzYl9waXBldHlwZSh1cmItPnBpcGUpKSB7CisJY2FzZSBQSVBFX0NPTlRST0w6CisJY2FzZSBQSVBFX0JVTEs6CisJZGVmYXVsdDoKKwkJcWggPSAoc3RydWN0IGVoY2lfcWggKikgdXJiLT5oY3ByaXY7CisJCWlmICghcWgpCisJCQlicmVhazsKKwkJdW5saW5rX2FzeW5jKG94dSwgcWgpOworCQlicmVhazsKKworCWNhc2UgUElQRV9JTlRFUlJVUFQ6CisJCXFoID0gKHN0cnVjdCBlaGNpX3FoICopIHVyYi0+aGNwcml2OworCQlpZiAoIXFoKQorCQkJYnJlYWs7CisJCXN3aXRjaCAocWgtPnFoX3N0YXRlKSB7CisJCWNhc2UgUUhfU1RBVEVfTElOS0VEOgorCQkJaW50cl9kZXNjaGVkdWxlKG94dSwgcWgpOworCQkJLyogRkFMTCBUSFJPVUdIICovCisJCWNhc2UgUUhfU1RBVEVfSURMRToKKwkJCXFoX2NvbXBsZXRpb25zKG94dSwgcWgpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlveHVfZGJnKG94dSwgImJvZ3VzIHFoICVwIHN0YXRlICVkXG4iLAorCQkJCQlxaCwgcWgtPnFoX3N0YXRlKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCS8qIHJlc2NoZWR1bGUgUUggaWZmIGFub3RoZXIgcmVxdWVzdCBpcyBxdWV1ZWQgKi8KKwkJaWYgKCFsaXN0X2VtcHR5KCZxaC0+cXRkX2xpc3QpCisJCQkJJiYgSENfSVNfUlVOTklORyhoY2QtPnN0YXRlKSkgeworCQkJaW50IHN0YXR1czsKKworCQkJc3RhdHVzID0gcWhfc2NoZWR1bGUob3h1LCBxaCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZveHUtPmxvY2ssIGZsYWdzKTsKKworCQkJaWYgKHN0YXR1cyAhPSAwKSB7CisJCQkJLyogc2hvdWxkbid0IGhhcHBlbiBvZnRlbiwgYnV0IC4uLgorCQkJCSAqIEZJWE1FIGtpbGwgdGhvc2UgdGRzJyB1cmJzCisJCQkJICovCisJCQkJZXJyKCJjYW4ndCByZXNjaGVkdWxlIHFoICVwLCBlcnIgJWQiLAorCQkJCQlxaCwgc3RhdHVzKTsKKwkJCX0KKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKwkJYnJlYWs7CisJfQorZG9uZToKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZveHUtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyogQnVsayBxaCBob2xkcyB0aGUgZGF0YSB0b2dnbGUgKi8KK3N0YXRpYyB2b2lkIG94dV9lbmRwb2ludF9kaXNhYmxlKHN0cnVjdCB1c2JfaGNkICpoY2QsCisJCQkJCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZXApCit7CisJc3RydWN0IG94dV9oY2QgKm94dSA9IGhjZF90b19veHUoaGNkKTsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKwlzdHJ1Y3QgZWhjaV9xaAkJKnFoLCAqdG1wOworCisJLyogQVNTRVJUOiAgYW55IHJlcXVlc3RzL3VyYnMgYXJlIGJlaW5nIHVubGlua2VkICovCisJLyogQVNTRVJUOiAgbm9ib2R5IGNhbiBiZSBzdWJtaXR0aW5nIHVyYnMgZm9yIHRoaXMgYW55IG1vcmUgKi8KKworcmVzY2FuOgorCXNwaW5fbG9ja19pcnFzYXZlKCZveHUtPmxvY2ssIGZsYWdzKTsKKwlxaCA9IGVwLT5oY3ByaXY7CisJaWYgKCFxaCkKKwkJZ290byBkb25lOworCisJLyogZW5kcG9pbnRzIGNhbiBiZSBpc28gc3RyZWFtcy4gIGZvciBub3csIHdlIGRvbid0CisJICogYWNjZWxlcmF0ZSBpc28gY29tcGxldGlvbnMgLi4uIHNvIHNwaW4gYSB3aGlsZS4KKwkgKi8KKwlpZiAocWgtPmh3X2luZm8xID09IDApIHsKKwkJb3h1X3ZkYmcob3h1LCAiaXNvIGRlbGF5XG4iKTsKKwkJZ290byBpZGxlX3RpbWVvdXQ7CisJfQorCisJaWYgKCFIQ19JU19SVU5OSU5HKGhjZC0+c3RhdGUpKQorCQlxaC0+cWhfc3RhdGUgPSBRSF9TVEFURV9JRExFOworCXN3aXRjaCAocWgtPnFoX3N0YXRlKSB7CisJY2FzZSBRSF9TVEFURV9MSU5LRUQ6CisJCWZvciAodG1wID0gb3h1LT5hc3luYy0+cWhfbmV4dC5xaDsKKwkJCQl0bXAgJiYgdG1wICE9IHFoOworCQkJCXRtcCA9IHRtcC0+cWhfbmV4dC5xaCkKKwkJCWNvbnRpbnVlOworCQkvKiBwZXJpb2RpYyBxaCBzZWxmLXVubGlua3Mgb24gZW1wdHkgKi8KKwkJaWYgKCF0bXApCisJCQlnb3RvIG5vZ29vZDsKKwkJdW5saW5rX2FzeW5jKG94dSwgcWgpOworCQkvKiBGQUxMIFRIUk9VR0ggKi8KKwljYXNlIFFIX1NUQVRFX1VOTElOSzoJCS8qIHdhaXQgZm9yIGh3IHRvIGZpbmlzaD8gKi8KK2lkbGVfdGltZW91dDoKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3h1LT5sb2NrLCBmbGFncyk7CisJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOworCQlnb3RvIHJlc2NhbjsKKwljYXNlIFFIX1NUQVRFX0lETEU6CQkvKiBmdWxseSB1bmxpbmtlZCAqLworCQlpZiAobGlzdF9lbXB0eSgmcWgtPnF0ZF9saXN0KSkgeworCQkJcWhfcHV0KHFoKTsKKwkJCWJyZWFrOworCQl9CisJCS8qIGVsc2UgRkFMTCBUSFJPVUdIICovCisJZGVmYXVsdDoKK25vZ29vZDoKKwkJLyogY2FsbGVyIHdhcyBzdXBwb3NlZCB0byBoYXZlIHVubGlua2VkIGFueSByZXF1ZXN0czsKKwkJICogdGhhdCdzIG5vdCBvdXIgam9iLiAganVzdCBsZWFrIHRoaXMgbWVtb3J5LgorCQkgKi8KKwkJb3h1X2VycihveHUsICJxaCAlcCAoIyUwMngpIHN0YXRlICVkJXNcbiIsCisJCQlxaCwgZXAtPmRlc2MuYkVuZHBvaW50QWRkcmVzcywgcWgtPnFoX3N0YXRlLAorCQkJbGlzdF9lbXB0eSgmcWgtPnF0ZF9saXN0KSA/ICIiIDogIihoYXMgdGRzKSIpOworCQlicmVhazsKKwl9CisJZXAtPmhjcHJpdiA9IE5VTEw7Citkb25lOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm94dS0+bG9jaywgZmxhZ3MpOworCXJldHVybjsKK30KKworc3RhdGljIGludCBveHVfZ2V0X2ZyYW1lKHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisJc3RydWN0IG94dV9oY2QgKm94dSA9IGhjZF90b19veHUoaGNkKTsKKworCXJldHVybiAocmVhZGwoJm94dS0+cmVncy0+ZnJhbWVfaW5kZXgpID4+IDMpICUKKwkJb3h1LT5wZXJpb2RpY19zaXplOworfQorCisvKiBCdWlsZCAic3RhdHVzIGNoYW5nZSIgcGFja2V0IChvbmUgb3IgdHdvIGJ5dGVzKSBmcm9tIEhDIHJlZ2lzdGVycyAqLworc3RhdGljIGludCBveHVfaHViX3N0YXR1c19kYXRhKHN0cnVjdCB1c2JfaGNkICpoY2QsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgb3h1X2hjZCAqb3h1ID0gaGNkX3RvX294dShoY2QpOworCXUzMiB0ZW1wLCBtYXNrLCBzdGF0dXMgPSAwOworCWludCBwb3J0cywgaSwgcmV0dmFsID0gMTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogaWYgIVVTQl9TVVNQRU5ELCByb290IGh1YiB0aW1lcnMgd29uJ3QgZ2V0IHNodXQgZG93biAuLi4gKi8KKwlpZiAoIUhDX0lTX1JVTk5JTkcoaGNkLT5zdGF0ZSkpCisJCXJldHVybiAwOworCisJLyogaW5pdCBzdGF0dXMgdG8gbm8tY2hhbmdlcyAqLworCWJ1ZlswXSA9IDA7CisJcG9ydHMgPSBIQ1NfTl9QT1JUUyhveHUtPmhjc19wYXJhbXMpOworCWlmIChwb3J0cyA+IDcpIHsKKwkJYnVmWzFdID0gMDsKKwkJcmV0dmFsKys7CisJfQorCisJLyogU29tZSBib2FyZHMgKG1vc3RseSBWSUE/KSByZXBvcnQgYm9ndXMgb3ZlcmN1cnJlbnQgaW5kaWNhdGlvbnMsCisJICogY2F1c2luZyBtYXNzaXZlIGxvZyBzcGFtIHVubGVzcyB3ZSBjb21wbGV0ZWx5IGlnbm9yZSB0aGVtLiAgSXQKKwkgKiBtYXkgYmUgcmVsZXZhbnQgdGhhdCBWSUEgVlQ4MjM1IGNvbnRyb2xlcnMsIHdoZXJlIFBPUlRfUE9XRVIgaXMKKwkgKiBhbHdheXMgc2V0LCBzZWVtIHRvIGNsZWFyIFBPUlRfT0NDIGFuZCBQT1JUX0NTQyB3aGVuIHdyaXRpbmcgdG8KKwkgKiBQT1JUX1BPV0VSOyB0aGF0J3Mgc3VycHJpc2luZywgYnV0IG1heWJlIHdpdGhpbi1zcGVjLgorCSAqLworCWlmICghaWdub3JlX29jKQorCQltYXNrID0gUE9SVF9DU0MgfCBQT1JUX1BFQyB8IFBPUlRfT0NDOworCWVsc2UKKwkJbWFzayA9IFBPUlRfQ1NDIHwgUE9SVF9QRUM7CisKKwkvKiBubyBodWIgY2hhbmdlIHJlcG9ydHMgKGJpdCAwKSBmb3Igbm93IChwb3dlciwgLi4uKSAqLworCisJLyogcG9ydCBOIGNoYW5nZXMgKGJpdCBOKT8gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmb3h1LT5sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IHBvcnRzOyBpKyspIHsKKwkJdGVtcCA9IHJlYWRsKCZveHUtPnJlZ3MtPnBvcnRfc3RhdHVzW2ldKTsKKworCQkvKgorCQkgKiBSZXR1cm4gc3RhdHVzIGluZm9ybWF0aW9uIGV2ZW4gZm9yIHBvcnRzIHdpdGggT1dORVIgc2V0LgorCQkgKiBPdGhlcndpc2Uga2h1YmQgd291bGRuJ3Qgc2VlIHRoZSBkaXNjb25uZWN0IGV2ZW50IHdoZW4gYQorCQkgKiBoaWdoLXNwZWVkIGRldmljZSBpcyBzd2l0Y2hlZCBvdmVyIHRvIHRoZSBjb21wYW5pb24KKwkJICogY29udHJvbGxlciBieSB0aGUgdXNlci4KKwkJICovCisKKwkJaWYgKCEodGVtcCAmIFBPUlRfQ09OTkVDVCkpCisJCQlveHUtPnJlc2V0X2RvbmVbaV0gPSAwOworCQlpZiAoKHRlbXAgJiBtYXNrKSAhPSAwIHx8ICgodGVtcCAmIFBPUlRfUkVTVU1FKSAhPSAwICYmCisJCQkJdGltZV9hZnRlcl9lcShqaWZmaWVzLCBveHUtPnJlc2V0X2RvbmVbaV0pKSkgeworCQkJaWYgKGkgPCA3KQorCQkJCWJ1ZlswXSB8PSAxIDw8IChpICsgMSk7CisJCQllbHNlCisJCQkJYnVmWzFdIHw9IDEgPDwgKGkgLSA3KTsKKwkJCXN0YXR1cyA9IFNUU19QQ0Q7CisJCX0KKwl9CisJLyogRklYTUUgYXV0b3N1c3BlbmQgaWRsZSByb290IGh1YnMgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZveHUtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gc3RhdHVzID8gcmV0dmFsIDogMDsKK30KKworLyogUmV0dXJucyB0aGUgc3BlZWQgb2YgYSBkZXZpY2UgYXR0YWNoZWQgdG8gYSBwb3J0IG9uIHRoZSByb290IGh1Yi4gKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG94dV9wb3J0X3NwZWVkKHN0cnVjdCBveHVfaGNkICpveHUsCisJCQkJCQl1bnNpZ25lZCBpbnQgcG9ydHNjKQoreworCXN3aXRjaCAoKHBvcnRzYyA+PiAyNikgJiAzKSB7CisJY2FzZSAwOgorCQlyZXR1cm4gMDsKKwljYXNlIDE6CisJCXJldHVybiAxIDw8IFVTQl9QT1JUX0ZFQVRfTE9XU1BFRUQ7CisJY2FzZSAyOgorCWRlZmF1bHQ6CisJCXJldHVybiAxIDw8IFVTQl9QT1JUX0ZFQVRfSElHSFNQRUVEOworCX0KK30KKworI2RlZmluZQlQT1JUX1dBS0VfQklUUwkoUE9SVF9XS09DX0V8UE9SVF9XS0RJU0NfRXxQT1JUX1dLQ09OTl9FKQorc3RhdGljIGludCBveHVfaHViX2NvbnRyb2woc3RydWN0IHVzYl9oY2QgKmhjZCwgdTE2IHR5cGVSZXEsCisJCQkJdTE2IHdWYWx1ZSwgdTE2IHdJbmRleCwgY2hhciAqYnVmLCB1MTYgd0xlbmd0aCkKK3sKKwlzdHJ1Y3Qgb3h1X2hjZCAqb3h1ID0gaGNkX3RvX294dShoY2QpOworCWludCBwb3J0cyA9IEhDU19OX1BPUlRTKG94dS0+aGNzX3BhcmFtcyk7CisJdTMyIF9faW9tZW0gKnN0YXR1c19yZWcgPSAmb3h1LT5yZWdzLT5wb3J0X3N0YXR1c1t3SW5kZXggLSAxXTsKKwl1MzIgdGVtcCwgc3RhdHVzOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJaW50IHJldHZhbCA9IDA7CisJdW5zaWduZWQgc2VsZWN0b3I7CisKKwkvKgorCSAqIEZJWE1FOiAgc3VwcG9ydCBTZXRQb3J0RmVhdHVyZXMgVVNCX1BPUlRfRkVBVF9JTkRJQ0FUT1IuCisJICogSENTX0lORElDQVRPUiBtYXkgc2F5IHdlIGNhbiBjaGFuZ2UgTEVEcyB0byBvZmYvYW1iZXIvZ3JlZW4uCisJICogKHRyYWNrIGN1cnJlbnQgc3RhdGUgb3Vyc2VsdmVzKSAuLi4gYmxpbmsgZm9yIGRpYWdub3N0aWNzLAorCSAqIHBvd2VyLCAidGhpcyBpcyB0aGUgb25lIiwgZXRjLiAgRUhDSSBzcGVjIHN1cHBvcnRzIHRoaXMuCisJICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmb3h1LT5sb2NrLCBmbGFncyk7CisJc3dpdGNoICh0eXBlUmVxKSB7CisJY2FzZSBDbGVhckh1YkZlYXR1cmU6CisJCXN3aXRjaCAod1ZhbHVlKSB7CisJCWNhc2UgQ19IVUJfTE9DQUxfUE9XRVI6CisJCWNhc2UgQ19IVUJfT1ZFUl9DVVJSRU5UOgorCQkJLyogbm8gaHViLXdpZGUgZmVhdHVyZS9zdGF0dXMgZmxhZ3MgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBlcnJvcjsKKwkJfQorCQlicmVhazsKKwljYXNlIENsZWFyUG9ydEZlYXR1cmU6CisJCWlmICghd0luZGV4IHx8IHdJbmRleCA+IHBvcnRzKQorCQkJZ290byBlcnJvcjsKKwkJd0luZGV4LS07CisJCXRlbXAgPSByZWFkbChzdGF0dXNfcmVnKTsKKworCQkvKgorCQkgKiBFdmVuIGlmIE9XTkVSIGlzIHNldCwgc28gdGhlIHBvcnQgaXMgb3duZWQgYnkgdGhlCisJCSAqIGNvbXBhbmlvbiBjb250cm9sbGVyLCBraHViZCBuZWVkcyB0byBiZSBhYmxlIHRvIGNsZWFyCisJCSAqIHRoZSBwb3J0LWNoYW5nZSBzdGF0dXMgYml0cyAoZXNwZWNpYWxseQorCQkgKiBVU0JfUE9SVF9GRUFUX0NfQ09OTkVDVElPTikuCisJCSAqLworCisJCXN3aXRjaCAod1ZhbHVlKSB7CisJCWNhc2UgVVNCX1BPUlRfRkVBVF9FTkFCTEU6CisJCQl3cml0ZWwodGVtcCAmIH5QT1JUX1BFLCBzdGF0dXNfcmVnKTsKKwkJCWJyZWFrOworCQljYXNlIFVTQl9QT1JUX0ZFQVRfQ19FTkFCTEU6CisJCQl3cml0ZWwoKHRlbXAgJiB+UE9SVF9SV0NfQklUUykgfCBQT1JUX1BFQywgc3RhdHVzX3JlZyk7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfUE9SVF9GRUFUX1NVU1BFTkQ6CisJCQlpZiAodGVtcCAmIFBPUlRfUkVTRVQpCisJCQkJZ290byBlcnJvcjsKKwkJCWlmICh0ZW1wICYgUE9SVF9TVVNQRU5EKSB7CisJCQkJaWYgKCh0ZW1wICYgUE9SVF9QRSkgPT0gMCkKKwkJCQkJZ290byBlcnJvcjsKKwkJCQkvKiByZXN1bWUgc2lnbmFsaW5nIGZvciAyMCBtc2VjICovCisJCQkJdGVtcCAmPSB+KFBPUlRfUldDX0JJVFMgfCBQT1JUX1dBS0VfQklUUyk7CisJCQkJd3JpdGVsKHRlbXAgfCBQT1JUX1JFU1VNRSwgc3RhdHVzX3JlZyk7CisJCQkJb3h1LT5yZXNldF9kb25lW3dJbmRleF0gPSBqaWZmaWVzCisJCQkJCQkrIG1zZWNzX3RvX2ppZmZpZXMoMjApOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVVNCX1BPUlRfRkVBVF9DX1NVU1BFTkQ6CisJCQkvKiB3ZSBhdXRvLWNsZWFyIHRoaXMgZmVhdHVyZSAqLworCQkJYnJlYWs7CisJCWNhc2UgVVNCX1BPUlRfRkVBVF9QT1dFUjoKKwkJCWlmIChIQ1NfUFBDKG94dS0+aGNzX3BhcmFtcykpCisJCQkJd3JpdGVsKHRlbXAgJiB+KFBPUlRfUldDX0JJVFMgfCBQT1JUX1BPV0VSKSwKKwkJCQkJICBzdGF0dXNfcmVnKTsKKwkJCWJyZWFrOworCQljYXNlIFVTQl9QT1JUX0ZFQVRfQ19DT05ORUNUSU9OOgorCQkJd3JpdGVsKCh0ZW1wICYgflBPUlRfUldDX0JJVFMpIHwgUE9SVF9DU0MsIHN0YXR1c19yZWcpOworCQkJYnJlYWs7CisJCWNhc2UgVVNCX1BPUlRfRkVBVF9DX09WRVJfQ1VSUkVOVDoKKwkJCXdyaXRlbCgodGVtcCAmIH5QT1JUX1JXQ19CSVRTKSB8IFBPUlRfT0NDLCBzdGF0dXNfcmVnKTsKKwkJCWJyZWFrOworCQljYXNlIFVTQl9QT1JUX0ZFQVRfQ19SRVNFVDoKKwkJCS8qIEdldFBvcnRTdGF0dXMgY2xlYXJzIHJlc2V0ICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJcmVhZGwoJm94dS0+cmVncy0+Y29tbWFuZCk7CS8qIHVuYmxvY2sgcG9zdGVkIHdyaXRlICovCisJCWJyZWFrOworCWNhc2UgR2V0SHViRGVzY3JpcHRvcjoKKwkJZWhjaV9odWJfZGVzY3JpcHRvcihveHUsIChzdHJ1Y3QgdXNiX2h1Yl9kZXNjcmlwdG9yICopCisJCQlidWYpOworCQlicmVhazsKKwljYXNlIEdldEh1YlN0YXR1czoKKwkJLyogbm8gaHViLXdpZGUgZmVhdHVyZS9zdGF0dXMgZmxhZ3MgKi8KKwkJbWVtc2V0KGJ1ZiwgMCwgNCk7CisJCWJyZWFrOworCWNhc2UgR2V0UG9ydFN0YXR1czoKKwkJaWYgKCF3SW5kZXggfHwgd0luZGV4ID4gcG9ydHMpCisJCQlnb3RvIGVycm9yOworCQl3SW5kZXgtLTsKKwkJc3RhdHVzID0gMDsKKwkJdGVtcCA9IHJlYWRsKHN0YXR1c19yZWcpOworCisJCS8qIHdQb3J0Q2hhbmdlIGJpdHMgKi8KKwkJaWYgKHRlbXAgJiBQT1JUX0NTQykKKwkJCXN0YXR1cyB8PSAxIDw8IFVTQl9QT1JUX0ZFQVRfQ19DT05ORUNUSU9OOworCQlpZiAodGVtcCAmIFBPUlRfUEVDKQorCQkJc3RhdHVzIHw9IDEgPDwgVVNCX1BPUlRfRkVBVF9DX0VOQUJMRTsKKwkJaWYgKCh0ZW1wICYgUE9SVF9PQ0MpICYmICFpZ25vcmVfb2MpCisJCQlzdGF0dXMgfD0gMSA8PCBVU0JfUE9SVF9GRUFUX0NfT1ZFUl9DVVJSRU5UOworCisJCS8qIHdob2V2ZXIgcmVzdW1lcyBtdXN0IEdldFBvcnRTdGF0dXMgdG8gY29tcGxldGUgaXQhISAqLworCQlpZiAodGVtcCAmIFBPUlRfUkVTVU1FKSB7CisKKwkJCS8qIFJlbW90ZSBXYWtldXAgcmVjZWl2ZWQ/ICovCisJCQlpZiAoIW94dS0+cmVzZXRfZG9uZVt3SW5kZXhdKSB7CisJCQkJLyogcmVzdW1lIHNpZ25hbGluZyBmb3IgMjAgbXNlYyAqLworCQkJCW94dS0+cmVzZXRfZG9uZVt3SW5kZXhdID0gamlmZmllcworCQkJCQkJKyBtc2Vjc190b19qaWZmaWVzKDIwKTsKKwkJCQkvKiBjaGVjayB0aGUgcG9ydCBhZ2FpbiAqLworCQkJCW1vZF90aW1lcigmb3h1X3RvX2hjZChveHUpLT5yaF90aW1lciwKKwkJCQkJCW94dS0+cmVzZXRfZG9uZVt3SW5kZXhdKTsKKwkJCX0KKworCQkJLyogcmVzdW1lIGNvbXBsZXRlZD8gKi8KKwkJCWVsc2UgaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywKKwkJCQkJb3h1LT5yZXNldF9kb25lW3dJbmRleF0pKSB7CisJCQkJc3RhdHVzIHw9IDEgPDwgVVNCX1BPUlRfRkVBVF9DX1NVU1BFTkQ7CisJCQkJb3h1LT5yZXNldF9kb25lW3dJbmRleF0gPSAwOworCisJCQkJLyogc3RvcCByZXN1bWUgc2lnbmFsaW5nICovCisJCQkJdGVtcCA9IHJlYWRsKHN0YXR1c19yZWcpOworCQkJCXdyaXRlbCh0ZW1wICYgfihQT1JUX1JXQ19CSVRTIHwgUE9SVF9SRVNVTUUpLAorCQkJCQlzdGF0dXNfcmVnKTsKKwkJCQlyZXR2YWwgPSBoYW5kc2hha2Uob3h1LCBzdGF0dXNfcmVnLAorCQkJCQkgICBQT1JUX1JFU1VNRSwgMCwgMjAwMCAvKiAybXNlYyAqLyk7CisJCQkJaWYgKHJldHZhbCAhPSAwKSB7CisJCQkJCW94dV9lcnIob3h1LAorCQkJCQkJInBvcnQgJWQgcmVzdW1lIGVycm9yICVkXG4iLAorCQkJCQkJd0luZGV4ICsgMSwgcmV0dmFsKTsKKwkJCQkJZ290byBlcnJvcjsKKwkJCQl9CisJCQkJdGVtcCAmPSB+KFBPUlRfU1VTUEVORHxQT1JUX1JFU1VNRXwoMzw8MTApKTsKKwkJCX0KKwkJfQorCisJCS8qIHdob2V2ZXIgcmVzZXRzIG11c3QgR2V0UG9ydFN0YXR1cyB0byBjb21wbGV0ZSBpdCEhICovCisJCWlmICgodGVtcCAmIFBPUlRfUkVTRVQpCisJCQkJJiYgdGltZV9hZnRlcl9lcShqaWZmaWVzLAorCQkJCQlveHUtPnJlc2V0X2RvbmVbd0luZGV4XSkpIHsKKwkJCXN0YXR1cyB8PSAxIDw8IFVTQl9QT1JUX0ZFQVRfQ19SRVNFVDsKKwkJCW94dS0+cmVzZXRfZG9uZVt3SW5kZXhdID0gMDsKKworCQkJLyogZm9yY2UgcmVzZXQgdG8gY29tcGxldGUgKi8KKwkJCXdyaXRlbCh0ZW1wICYgfihQT1JUX1JXQ19CSVRTIHwgUE9SVF9SRVNFVCksCisJCQkJCXN0YXR1c19yZWcpOworCQkJLyogUkVWSVNJVDogIHNvbWUgaGFyZHdhcmUgbmVlZHMgNTUwKyB1c2VjIHRvIGNsZWFyCisJCQkgKiB0aGlzIGJpdDsgc2VlbXMgdG9vIGxvbmcgdG8gc3BpbiByb3V0aW5lbHkuLi4KKwkJCSAqLworCQkJcmV0dmFsID0gaGFuZHNoYWtlKG94dSwgc3RhdHVzX3JlZywKKwkJCQkJUE9SVF9SRVNFVCwgMCwgNzUwKTsKKwkJCWlmIChyZXR2YWwgIT0gMCkgeworCQkJCW94dV9lcnIob3h1LCAicG9ydCAlZCByZXNldCBlcnJvciAlZFxuIiwKKwkJCQkJd0luZGV4ICsgMSwgcmV0dmFsKTsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCisJCQkvKiBzZWUgd2hhdCB3ZSBmb3VuZCBvdXQgKi8KKwkJCXRlbXAgPSBjaGVja19yZXNldF9jb21wbGV0ZShveHUsIHdJbmRleCwgc3RhdHVzX3JlZywKKwkJCQkJcmVhZGwoc3RhdHVzX3JlZykpOworCQl9CisKKwkJLyogdHJhbnNmZXIgZGVkaWNhdGVkIHBvcnRzIHRvIHRoZSBjb21wYW5pb24gaGMgKi8KKwkJaWYgKCh0ZW1wICYgUE9SVF9DT05ORUNUKSAmJgorCQkJCXRlc3RfYml0KHdJbmRleCwgJm94dS0+Y29tcGFuaW9uX3BvcnRzKSkgeworCQkJdGVtcCAmPSB+UE9SVF9SV0NfQklUUzsKKwkJCXRlbXAgfD0gUE9SVF9PV05FUjsKKwkJCXdyaXRlbCh0ZW1wLCBzdGF0dXNfcmVnKTsKKwkJCW94dV9kYmcob3h1LCAicG9ydCAlZCAtLT4gY29tcGFuaW9uXG4iLCB3SW5kZXggKyAxKTsKKwkJCXRlbXAgPSByZWFkbChzdGF0dXNfcmVnKTsKKwkJfQorCisJCS8qCisJCSAqIEV2ZW4gaWYgT1dORVIgaXMgc2V0LCB0aGVyZSdzIG5vIGhhcm0gbGV0dGluZyBraHViZAorCQkgKiBzZWUgdGhlIHdQb3J0U3RhdHVzIHZhbHVlcyAodGhleSBzaG91bGQgYWxsIGJlIDAgZXhjZXB0CisJCSAqIGZvciBQT1JUX1BPV0VSIGFueXdheSkuCisJCSAqLworCisJCWlmICh0ZW1wICYgUE9SVF9DT05ORUNUKSB7CisJCQlzdGF0dXMgfD0gMSA8PCBVU0JfUE9SVF9GRUFUX0NPTk5FQ1RJT047CisJCQkvKiBzdGF0dXMgbWF5IGJlIGZyb20gaW50ZWdyYXRlZCBUVCAqLworCQkJc3RhdHVzIHw9IG94dV9wb3J0X3NwZWVkKG94dSwgdGVtcCk7CisJCX0KKwkJaWYgKHRlbXAgJiBQT1JUX1BFKQorCQkJc3RhdHVzIHw9IDEgPDwgVVNCX1BPUlRfRkVBVF9FTkFCTEU7CisJCWlmICh0ZW1wICYgKFBPUlRfU1VTUEVORHxQT1JUX1JFU1VNRSkpCisJCQlzdGF0dXMgfD0gMSA8PCBVU0JfUE9SVF9GRUFUX1NVU1BFTkQ7CisJCWlmICh0ZW1wICYgUE9SVF9PQykKKwkJCXN0YXR1cyB8PSAxIDw8IFVTQl9QT1JUX0ZFQVRfT1ZFUl9DVVJSRU5UOworCQlpZiAodGVtcCAmIFBPUlRfUkVTRVQpCisJCQlzdGF0dXMgfD0gMSA8PCBVU0JfUE9SVF9GRUFUX1JFU0VUOworCQlpZiAodGVtcCAmIFBPUlRfUE9XRVIpCisJCQlzdGF0dXMgfD0gMSA8PCBVU0JfUE9SVF9GRUFUX1BPV0VSOworCisjaWZuZGVmCU9YVV9WRVJCT1NFX0RFQlVHCisJaWYgKHN0YXR1cyAmIH4weGZmZmYpCS8qIG9ubHkgaWYgd1BvcnRDaGFuZ2UgaXMgaW50ZXJlc3RpbmcgKi8KKyNlbmRpZgorCQlkYmdfcG9ydChveHUsICJHZXRTdGF0dXMiLCB3SW5kZXggKyAxLCB0ZW1wKTsKKwkJcHV0X3VuYWxpZ25lZChjcHVfdG9fbGUzMihzdGF0dXMpLCAoX19sZTMyICopIGJ1Zik7CisJCWJyZWFrOworCWNhc2UgU2V0SHViRmVhdHVyZToKKwkJc3dpdGNoICh3VmFsdWUpIHsKKwkJY2FzZSBDX0hVQl9MT0NBTF9QT1dFUjoKKwkJY2FzZSBDX0hVQl9PVkVSX0NVUlJFTlQ6CisJCQkvKiBubyBodWItd2lkZSBmZWF0dXJlL3N0YXR1cyBmbGFncyAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvIGVycm9yOworCQl9CisJCWJyZWFrOworCWNhc2UgU2V0UG9ydEZlYXR1cmU6CisJCXNlbGVjdG9yID0gd0luZGV4ID4+IDg7CisJCXdJbmRleCAmPSAweGZmOworCQlpZiAoIXdJbmRleCB8fCB3SW5kZXggPiBwb3J0cykKKwkJCWdvdG8gZXJyb3I7CisJCXdJbmRleC0tOworCQl0ZW1wID0gcmVhZGwoc3RhdHVzX3JlZyk7CisJCWlmICh0ZW1wICYgUE9SVF9PV05FUikKKwkJCWJyZWFrOworCisJCXRlbXAgJj0gflBPUlRfUldDX0JJVFM7CisJCXN3aXRjaCAod1ZhbHVlKSB7CisJCWNhc2UgVVNCX1BPUlRfRkVBVF9TVVNQRU5EOgorCQkJaWYgKCh0ZW1wICYgUE9SVF9QRSkgPT0gMAorCQkJCQl8fCAodGVtcCAmIFBPUlRfUkVTRVQpICE9IDApCisJCQkJZ290byBlcnJvcjsKKwkJCWlmIChkZXZpY2VfbWF5X3dha2V1cCgmaGNkLT5zZWxmLnJvb3RfaHViLT5kZXYpKQorCQkJCXRlbXAgfD0gUE9SVF9XQUtFX0JJVFM7CisJCQl3cml0ZWwodGVtcCB8IFBPUlRfU1VTUEVORCwgc3RhdHVzX3JlZyk7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfUE9SVF9GRUFUX1BPV0VSOgorCQkJaWYgKEhDU19QUEMob3h1LT5oY3NfcGFyYW1zKSkKKwkJCQl3cml0ZWwodGVtcCB8IFBPUlRfUE9XRVIsIHN0YXR1c19yZWcpOworCQkJYnJlYWs7CisJCWNhc2UgVVNCX1BPUlRfRkVBVF9SRVNFVDoKKwkJCWlmICh0ZW1wICYgUE9SVF9SRVNVTUUpCisJCQkJZ290byBlcnJvcjsKKwkJCS8qIGxpbmUgc3RhdHVzIGJpdHMgbWF5IHJlcG9ydCB0aGlzIGFzIGxvdyBzcGVlZCwKKwkJCSAqIHdoaWNoIGNhbiBiZSBmaW5lIGlmIHRoaXMgcm9vdCBodWIgaGFzIGEKKwkJCSAqIHRyYW5zYWN0aW9uIHRyYW5zbGF0b3IgYnVpbHQgaW4uCisJCQkgKi8KKwkJCW94dV92ZGJnKG94dSwgInBvcnQgJWQgcmVzZXRcbiIsIHdJbmRleCArIDEpOworCQkJdGVtcCB8PSBQT1JUX1JFU0VUOworCQkJdGVtcCAmPSB+UE9SVF9QRTsKKworCQkJLyoKKwkJCSAqIGNhbGxlciBtdXN0IHdhaXQsIHRoZW4gY2FsbCBHZXRQb3J0U3RhdHVzCisJCQkgKiB1c2IgMi4wIHNwZWMgc2F5cyA1MCBtcyByZXNldHMgb24gcm9vdAorCQkJICovCisJCQlveHUtPnJlc2V0X2RvbmVbd0luZGV4XSA9IGppZmZpZXMKKwkJCQkJKyBtc2Vjc190b19qaWZmaWVzKDUwKTsKKwkJCXdyaXRlbCh0ZW1wLCBzdGF0dXNfcmVnKTsKKwkJCWJyZWFrOworCisJCS8qIEZvciBkb3duc3RyZWFtIGZhY2luZyBwb3J0cyAodGhlc2UpOiAgb25lIGh1YiBwb3J0IGlzIHB1dAorCQkgKiBpbnRvIHRlc3QgbW9kZSBhY2NvcmRpbmcgdG8gVVNCMiAxMS4yNC4yLjEzLCB0aGVuIHRoZSBodWIKKwkJICogbXVzdCBiZSByZXNldCAod2hpY2ggZm9yIHJvb3QgaHViIG5vdyBtZWFucyBybW1vZCttb2Rwcm9iZSwKKwkJICogb3IgZWxzZSBzeXN0ZW0gcmVib290KS4gIFNlZSBFSENJIDIuMy45IGFuZCA0LjE0IGZvciBpbmZvCisJCSAqIGFib3V0IHRoZSBFSENJLXNwZWNpZmljIHN0dWZmLgorCQkgKi8KKwkJY2FzZSBVU0JfUE9SVF9GRUFUX1RFU1Q6CisJCQlpZiAoIXNlbGVjdG9yIHx8IHNlbGVjdG9yID4gNSkKKwkJCQlnb3RvIGVycm9yOworCQkJZWhjaV9xdWllc2NlKG94dSk7CisJCQllaGNpX2hhbHQob3h1KTsKKwkJCXRlbXAgfD0gc2VsZWN0b3IgPDwgMTY7CisJCQl3cml0ZWwodGVtcCwgc3RhdHVzX3JlZyk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJZ290byBlcnJvcjsKKwkJfQorCQlyZWFkbCgmb3h1LT5yZWdzLT5jb21tYW5kKTsJLyogdW5ibG9jayBwb3N0ZWQgd3JpdGVzICovCisJCWJyZWFrOworCisJZGVmYXVsdDoKK2Vycm9yOgorCQkvKiAic3RhbGwiIG9uIGVycm9yICovCisJCXJldHZhbCA9IC1FUElQRTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3h1LT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldHZhbDsKK30KKworI2lmZGVmIENPTkZJR19QTQorCitzdGF0aWMgaW50IG94dV9idXNfc3VzcGVuZChzdHJ1Y3QgdXNiX2hjZCAqaGNkKQoreworCXN0cnVjdCBveHVfaGNkICpveHUgPSBoY2RfdG9fb3h1KGhjZCk7CisJaW50IHBvcnQ7CisJaW50IG1hc2s7CisKKwlveHVfZGJnKG94dSwgInN1c3BlbmQgcm9vdCBodWJcbiIpOworCisJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIG94dS0+bmV4dF9zdGF0ZWNoYW5nZSkpCisJCW1zbGVlcCg1KTsKKworCXBvcnQgPSBIQ1NfTl9QT1JUUyhveHUtPmhjc19wYXJhbXMpOworCXNwaW5fbG9ja19pcnEoJm94dS0+bG9jayk7CisKKwkvKiBzdG9wIHNjaGVkdWxlcywgY2xlYW4gYW55IGNvbXBsZXRlZCB3b3JrICovCisJaWYgKEhDX0lTX1JVTk5JTkcoaGNkLT5zdGF0ZSkpIHsKKwkJZWhjaV9xdWllc2NlKG94dSk7CisJCWhjZC0+c3RhdGUgPSBIQ19TVEFURV9RVUlFU0NJTkc7CisJfQorCW94dS0+Y29tbWFuZCA9IHJlYWRsKCZveHUtPnJlZ3MtPmNvbW1hbmQpOworCWlmIChveHUtPnJlY2xhaW0pCisJCW94dS0+cmVjbGFpbV9yZWFkeSA9IDE7CisJZWhjaV93b3JrKG94dSk7CisKKwkvKiBVbmxpa2Ugb3RoZXIgVVNCIGhvc3QgY29udHJvbGxlciB0eXBlcywgRUhDSSBkb2Vzbid0IGhhdmUKKwkgKiBhbnkgbm90aW9uIG9mICJnbG9iYWwiIG9yIGJ1cy13aWRlIHN1c3BlbmQuICBUaGUgZHJpdmVyIGhhcworCSAqIHRvIG1hbnVhbGx5IHN1c3BlbmQgYWxsIHRoZSBhY3RpdmUgdW5zdXNwZW5kZWQgcG9ydHMsIGFuZAorCSAqIHRoZW4gbWFudWFsbHkgcmVzdW1lIHRoZW0gaW4gdGhlIGJ1c19yZXN1bWUoKSByb3V0aW5lLgorCSAqLworCW94dS0+YnVzX3N1c3BlbmRlZCA9IDA7CisJd2hpbGUgKHBvcnQtLSkgeworCQl1MzIgX19pb21lbSAqcmVnID0gJm94dS0+cmVncy0+cG9ydF9zdGF0dXNbcG9ydF07CisJCXUzMiB0MSA9IHJlYWRsKHJlZykgJiB+UE9SVF9SV0NfQklUUzsKKwkJdTMyIHQyID0gdDE7CisKKwkJLyoga2VlcCB0cmFjayBvZiB3aGljaCBwb3J0cyB3ZSBzdXNwZW5kICovCisJCWlmICgodDEgJiBQT1JUX1BFKSAmJiAhKHQxICYgUE9SVF9PV05FUikgJiYKKwkJCQkhKHQxICYgUE9SVF9TVVNQRU5EKSkgeworCQkJdDIgfD0gUE9SVF9TVVNQRU5EOworCQkJc2V0X2JpdChwb3J0LCAmb3h1LT5idXNfc3VzcGVuZGVkKTsKKwkJfQorCisJCS8qIGVuYWJsZSByZW1vdGUgd2FrZXVwIG9uIGFsbCBwb3J0cyAqLworCQlpZiAoZGV2aWNlX21heV93YWtldXAoJmhjZC0+c2VsZi5yb290X2h1Yi0+ZGV2KSkKKwkJCXQyIHw9IFBPUlRfV0tPQ19FfFBPUlRfV0tESVNDX0V8UE9SVF9XS0NPTk5fRTsKKwkJZWxzZQorCQkJdDIgJj0gfihQT1JUX1dLT0NfRXxQT1JUX1dLRElTQ19FfFBPUlRfV0tDT05OX0UpOworCisJCWlmICh0MSAhPSB0MikgeworCQkJb3h1X3ZkYmcob3h1LCAicG9ydCAlZCwgJTA4eCAtPiAlMDh4XG4iLAorCQkJCXBvcnQgKyAxLCB0MSwgdDIpOworCQkJd3JpdGVsKHQyLCByZWcpOworCQl9CisJfQorCisJLyogdHVybiBvZmYgbm93LWlkbGUgSEMgKi8KKwlkZWxfdGltZXJfc3luYygmb3h1LT53YXRjaGRvZyk7CisJZWhjaV9oYWx0KG94dSk7CisJaGNkLT5zdGF0ZSA9IEhDX1NUQVRFX1NVU1BFTkRFRDsKKworCS8qIGFsbG93IHJlbW90ZSB3YWtldXAgKi8KKwltYXNrID0gSU5UUl9NQVNLOworCWlmICghZGV2aWNlX21heV93YWtldXAoJmhjZC0+c2VsZi5yb290X2h1Yi0+ZGV2KSkKKwkJbWFzayAmPSB+U1RTX1BDRDsKKwl3cml0ZWwobWFzaywgJm94dS0+cmVncy0+aW50cl9lbmFibGUpOworCXJlYWRsKCZveHUtPnJlZ3MtPmludHJfZW5hYmxlKTsKKworCW94dS0+bmV4dF9zdGF0ZWNoYW5nZSA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwKTsKKwlzcGluX3VubG9ja19pcnEoJm94dS0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGxlciBoYXMgbG9ja2VkIHRoZSByb290IGh1YiwgYW5kIHNob3VsZCByZXNldC9yZWluaXQgb24gZXJyb3IgKi8KK3N0YXRpYyBpbnQgb3h1X2J1c19yZXN1bWUoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlzdHJ1Y3Qgb3h1X2hjZCAqb3h1ID0gaGNkX3RvX294dShoY2QpOworCXUzMiB0ZW1wOworCWludCBpOworCisJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIG94dS0+bmV4dF9zdGF0ZWNoYW5nZSkpCisJCW1zbGVlcCg1KTsKKwlzcGluX2xvY2tfaXJxKCZveHUtPmxvY2spOworCisJLyogSWRlYWxseSBhbmQgd2UndmUgZ290IGEgcmVhbCByZXN1bWUgaGVyZSwgYW5kIG5vIHBvcnQncyBwb3dlcgorCSAqIHdhcyBsb3N0LiAgKEZvciBQQ0ksIHRoYXQgbWVhbnMgVmF1eCB3YXMgbWFpbnRhaW5lZC4pICBCdXQgd2UKKwkgKiBjb3VsZCBpbnN0ZWFkIGJlIHJlc3RvcmluZyBhIHN3c3VzcCBzbmFwc2hvdCAtLSBzbyB0aGF0IEJJT1Mgd2FzCisJICogdGhlIGxhc3QgdXNlciBvZiB0aGUgY29udHJvbGxlciwgbm90IHJlc2V0L3BtIGhhcmR3YXJlIGtlZXBpbmcKKwkgKiBzdGF0ZSB3ZSBnYXZlIHRvIGl0LgorCSAqLworCXRlbXAgPSByZWFkbCgmb3h1LT5yZWdzLT5pbnRyX2VuYWJsZSk7CisJb3h1X2RiZyhveHUsICJyZXN1bWUgcm9vdCBodWIlc1xuIiwgdGVtcCA/ICIiIDogIiBhZnRlciBwb3dlciBsb3NzIik7CisKKwkvKiBhdCBsZWFzdCBzb21lIEFQTSBpbXBsZW1lbnRhdGlvbnMgd2lsbCB0cnkgdG8gZGVsaXZlcgorCSAqIElSUXMgcmlnaHQgYXdheSwgc28gZGVsYXkgdGhlbSB1bnRpbCB3ZSdyZSByZWFkeS4KKwkgKi8KKwl3cml0ZWwoMCwgJm94dS0+cmVncy0+aW50cl9lbmFibGUpOworCisJLyogcmUtaW5pdCBvcGVyYXRpb25hbCByZWdpc3RlcnMgKi8KKwl3cml0ZWwoMCwgJm94dS0+cmVncy0+c2VnbWVudCk7CisJd3JpdGVsKG94dS0+cGVyaW9kaWNfZG1hLCAmb3h1LT5yZWdzLT5mcmFtZV9saXN0KTsKKwl3cml0ZWwoKHUzMikgb3h1LT5hc3luYy0+cWhfZG1hLCAmb3h1LT5yZWdzLT5hc3luY19uZXh0KTsKKworCS8qIHJlc3RvcmUgQ01EX1JVTiwgZnJhbWVsaXN0IHNpemUsIGFuZCBpcnEgdGhyZXNob2xkICovCisJd3JpdGVsKG94dS0+Y29tbWFuZCwgJm94dS0+cmVncy0+Y29tbWFuZCk7CisKKwkvKiBTb21lIGNvbnRyb2xsZXIvZmlybXdhcmUgY29tYmluYXRpb25zIG5lZWQgYSBkZWxheSBkdXJpbmcgd2hpY2gKKwkgKiB0aGV5IHNldCB1cCB0aGUgcG9ydCBzdGF0dXNlcy4gIFNlZSBCdWd6aWxsYSAjODE5MC4gKi8KKwltZGVsYXkoOCk7CisKKwkvKiBtYW51YWxseSByZXN1bWUgdGhlIHBvcnRzIHdlIHN1c3BlbmRlZCBkdXJpbmcgYnVzX3N1c3BlbmQoKSAqLworCWkgPSBIQ1NfTl9QT1JUUyhveHUtPmhjc19wYXJhbXMpOworCXdoaWxlIChpLS0pIHsKKwkJdGVtcCA9IHJlYWRsKCZveHUtPnJlZ3MtPnBvcnRfc3RhdHVzW2ldKTsKKwkJdGVtcCAmPSB+KFBPUlRfUldDX0JJVFMKKwkJCXwgUE9SVF9XS09DX0UgfCBQT1JUX1dLRElTQ19FIHwgUE9SVF9XS0NPTk5fRSk7CisJCWlmICh0ZXN0X2JpdChpLCAmb3h1LT5idXNfc3VzcGVuZGVkKSAmJiAodGVtcCAmIFBPUlRfU1VTUEVORCkpIHsKKwkJCW94dS0+cmVzZXRfZG9uZVtpXSA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDIwKTsKKwkJCXRlbXAgfD0gUE9SVF9SRVNVTUU7CisJCX0KKwkJd3JpdGVsKHRlbXAsICZveHUtPnJlZ3MtPnBvcnRfc3RhdHVzW2ldKTsKKwl9CisJaSA9IEhDU19OX1BPUlRTKG94dS0+aGNzX3BhcmFtcyk7CisJbWRlbGF5KDIwKTsKKwl3aGlsZSAoaS0tKSB7CisJCXRlbXAgPSByZWFkbCgmb3h1LT5yZWdzLT5wb3J0X3N0YXR1c1tpXSk7CisJCWlmICh0ZXN0X2JpdChpLCAmb3h1LT5idXNfc3VzcGVuZGVkKSAmJiAodGVtcCAmIFBPUlRfU1VTUEVORCkpIHsKKwkJCXRlbXAgJj0gfihQT1JUX1JXQ19CSVRTIHwgUE9SVF9SRVNVTUUpOworCQkJd3JpdGVsKHRlbXAsICZveHUtPnJlZ3MtPnBvcnRfc3RhdHVzW2ldKTsKKwkJCW94dV92ZGJnKG94dSwgInJlc3VtZWQgcG9ydCAlZFxuIiwgaSArIDEpOworCQl9CisJfQorCSh2b2lkKSByZWFkbCgmb3h1LT5yZWdzLT5jb21tYW5kKTsKKworCS8qIG1heWJlIHJlLWFjdGl2YXRlIHRoZSBzY2hlZHVsZShzKSAqLworCXRlbXAgPSAwOworCWlmIChveHUtPmFzeW5jLT5xaF9uZXh0LnFoKQorCQl0ZW1wIHw9IENNRF9BU0U7CisJaWYgKG94dS0+cGVyaW9kaWNfc2NoZWQpCisJCXRlbXAgfD0gQ01EX1BTRTsKKwlpZiAodGVtcCkgeworCQlveHUtPmNvbW1hbmQgfD0gdGVtcDsKKwkJd3JpdGVsKG94dS0+Y29tbWFuZCwgJm94dS0+cmVncy0+Y29tbWFuZCk7CisJfQorCisJb3h1LT5uZXh0X3N0YXRlY2hhbmdlID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoNSk7CisJaGNkLT5zdGF0ZSA9IEhDX1NUQVRFX1JVTk5JTkc7CisKKwkvKiBOb3cgd2UgY2FuIHNhZmVseSByZS1lbmFibGUgaXJxcyAqLworCXdyaXRlbChJTlRSX01BU0ssICZveHUtPnJlZ3MtPmludHJfZW5hYmxlKTsKKworCXNwaW5fdW5sb2NrX2lycSgmb3h1LT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworI2Vsc2UKKworc3RhdGljIGludCBveHVfYnVzX3N1c3BlbmQoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBveHVfYnVzX3Jlc3VtZShzdHJ1Y3QgdXNiX2hjZCAqaGNkKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYJLyogQ09ORklHX1BNICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGNfZHJpdmVyIG94dV9oY19kcml2ZXIgPSB7CisJLmRlc2NyaXB0aW9uID0JCSJveHUyMTBocF9oY2QiLAorCS5wcm9kdWN0X2Rlc2MgPQkJIm94dTIxMGhwIEhDRCIsCisJLmhjZF9wcml2X3NpemUgPQlzaXplb2Yoc3RydWN0IG94dV9oY2QpLAorCisJLyoKKwkgKiBHZW5lcmljIGhhcmR3YXJlIGxpbmthZ2UKKwkgKi8KKwkuaXJxID0JCQlveHVfaXJxLAorCS5mbGFncyA9CQlIQ0RfTUVNT1JZIHwgSENEX1VTQjIsCisKKwkvKgorCSAqIEJhc2ljIGxpZmVjeWNsZSBvcGVyYXRpb25zCisJICovCisJLnJlc2V0ID0JCW94dV9yZXNldCwKKwkuc3RhcnQgPQkJb3h1X3J1biwKKwkuc3RvcCA9CQkJb3h1X3N0b3AsCisJLnNodXRkb3duID0JCW94dV9zaHV0ZG93biwKKworCS8qCisJICogTWFuYWdpbmcgaS9vIHJlcXVlc3RzIGFuZCBhc3NvY2lhdGVkIGRldmljZSByZXNvdXJjZXMKKwkgKi8KKwkudXJiX2VucXVldWUgPQkJb3h1X3VyYl9lbnF1ZXVlLAorCS51cmJfZGVxdWV1ZSA9CQlveHVfdXJiX2RlcXVldWUsCisJLmVuZHBvaW50X2Rpc2FibGUgPQlveHVfZW5kcG9pbnRfZGlzYWJsZSwKKworCS8qCisJICogU2NoZWR1bGluZyBzdXBwb3J0CisJICovCisJLmdldF9mcmFtZV9udW1iZXIgPQlveHVfZ2V0X2ZyYW1lLAorCisJLyoKKwkgKiBSb290IGh1YiBzdXBwb3J0CisJICovCisJLmh1Yl9zdGF0dXNfZGF0YSA9CW94dV9odWJfc3RhdHVzX2RhdGEsCisJLmh1Yl9jb250cm9sID0JCW94dV9odWJfY29udHJvbCwKKwkuYnVzX3N1c3BlbmQgPQkJb3h1X2J1c19zdXNwZW5kLAorCS5idXNfcmVzdW1lID0JCW94dV9idXNfcmVzdW1lLAorfTsKKworLyoKKyAqIE1vZHVsZSBzdHVmZgorICovCisKK3N0YXRpYyB2b2lkIG94dV9jb25maWd1cmF0aW9uKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHZvaWQgKmJhc2UpCit7CisJdTMyIHRtcDsKKworCS8qIEluaXRpYWxpemUgdG9wIGxldmVsIHJlZ2lzdGVycy4KKwkgKiBGaXJzdCB3cml0ZSBldmVyCisJICovCisJb3h1X3dyaXRlbChiYXNlLCBPWFVfSE9TVElGQ09ORklHLCAweDAwMDAwMzdEKTsKKwlveHVfd3JpdGVsKGJhc2UsIE9YVV9TT0ZUUkVTRVQsIE9YVV9TUkVTRVQpOworCW94dV93cml0ZWwoYmFzZSwgT1hVX0hPU1RJRkNPTkZJRywgMHgwMDAwMDM3RCk7CisKKwl0bXAgPSBveHVfcmVhZGwoYmFzZSwgT1hVX1BJT0JVUlNUUkVBRENUUkwpOworCW94dV93cml0ZWwoYmFzZSwgT1hVX1BJT0JVUlNUUkVBRENUUkwsIHRtcCB8IDB4MDA0MCk7CisKKwlveHVfd3JpdGVsKGJhc2UsIE9YVV9BU08sIE9YVV9TUEhQT0VOIHwgT1hVX09WUkNDVVJQVVBERU4gfAorCQkJCQlPWFVfQ09NUEFSQVRPUiB8IE9YVV9BU09fT1ApOworCisJdG1wID0gb3h1X3JlYWRsKGJhc2UsIE9YVV9DTEtDVFJMX1NFVCk7CisJb3h1X3dyaXRlbChiYXNlLCBPWFVfQ0xLQ1RSTF9TRVQsIHRtcCB8IE9YVV9TWVNDTEtFTiB8IE9YVV9VU0JPVEdDTEtFTik7CisKKwkvKiBDbGVhciBhbGwgdG9wIGludGVycnVwdCBlbmFibGUgKi8KKwlveHVfd3JpdGVsKGJhc2UsIE9YVV9DSElQSVJRRU5fQ0xSLCAweGZmKTsKKworCS8qIENsZWFyIGFsbCB0b3AgaW50ZXJydXB0IHN0YXR1cyAqLworCW94dV93cml0ZWwoYmFzZSwgT1hVX0NISVBJUlFTVEFUVVMsIDB4ZmYpOworCisJLyogRW5hYmxlIGFsbCBuZWVkZWQgdG9wIGludGVycnVwdCBleGNlcHQgT1RHIFNQSCBjb3JlICovCisJb3h1X3dyaXRlbChiYXNlLCBPWFVfQ0hJUElSUUVOX1NFVCwgT1hVX1VTQlNQSExQV1VJIHwgT1hVX1VTQk9UR0xQV1VJKTsKK30KKworc3RhdGljIGludCBveHVfdmVyaWZ5X2lkKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHZvaWQgKmJhc2UpCit7CisJdTMyIGlkOworCWNoYXIgKmJvW10gPSB7CisJCSJyZXNlcnZlZCIsCisJCSIxMjgtcGluIExRRlAiLAorCQkiODQtcGluIFRGQkdBIiwKKwkJInJlc2VydmVkIiwKKwl9OworCisJLyogUmVhZCBjb250cm9sbGVyIHNpZ25hdHVyZSByZWdpc3RlciB0byBmaW5kIGEgbWF0Y2ggKi8KKwlpZCA9IG94dV9yZWFkbChiYXNlLCBPWFVfREVWSUNFSUQpOworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJkZXZpY2UgSUQgJXhcbiIsIGlkKTsKKwlpZiAoKGlkICYgT1hVX1JFVl9NQVNLKSAhPSAoT1hVX1JFVl8yMTAwIDw8IE9YVV9SRVZfU0hJRlQpKQorCQlyZXR1cm4gLTE7CisKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiZm91bmQgZGV2aWNlICV4ICVzICglMDR4OiUwNHgpXG4iLAorCQlpZCA+PiBPWFVfUkVWX1NISUZULAorCQlib1soaWQgJiBPWFVfQk9fTUFTSykgPj4gT1hVX0JPX1NISUZUXSwKKwkJKGlkICYgT1hVX01BSl9SRVZfTUFTSykgPj4gT1hVX01BSl9SRVZfU0hJRlQsCisJCShpZCAmIE9YVV9NSU5fUkVWX01BU0spID4+IE9YVV9NSU5fUkVWX1NISUZUKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGhjX2RyaXZlciBveHVfaGNfZHJpdmVyOworc3RhdGljIHN0cnVjdCB1c2JfaGNkICpveHVfY3JlYXRlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJdW5zaWduZWQgbG9uZyBtZW1zdGFydCwgdW5zaWduZWQgbG9uZyBtZW1sZW4sCisJCQkJdm9pZCAqYmFzZSwgaW50IGlycSwgaW50IG90ZykKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCisJc3RydWN0IHVzYl9oY2QgKmhjZDsKKwlzdHJ1Y3Qgb3h1X2hjZCAqb3h1OworCWludCByZXQ7CisKKwkvKiBTZXQgZW5kaWFuIG1vZGUgYW5kIGhvc3QgbW9kZSAqLworCW94dV93cml0ZWwoYmFzZSArIChvdGcgPyBPWFVfT1RHX0NPUkVfT0ZGU0VUIDogT1hVX1NQSF9DT1JFX09GRlNFVCksCisJCQkJT1hVX1VTQk1PREUsCisJCQkJT1hVX0NNX0hPU1RfT05MWSB8IE9YVV9FU19MSVRUTEUgfCBPWFVfVkJQUyk7CisKKwloY2QgPSB1c2JfY3JlYXRlX2hjZCgmb3h1X2hjX2RyaXZlciwgZGV2LAorCQkJCW90ZyA/ICJveHUyMTBocF9vdGciIDogIm94dTIxMGhwX3NwaCIpOworCWlmICghaGNkKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWhjZC0+cnNyY19zdGFydCA9IG1lbXN0YXJ0OworCWhjZC0+cnNyY19sZW4gPSBtZW1sZW47CisJaGNkLT5yZWdzID0gYmFzZTsKKwloY2QtPmlycSA9IGlycTsKKwloY2QtPnN0YXRlID0gSENfU1RBVEVfSEFMVDsKKworCW94dSA9IGhjZF90b19veHUoaGNkKTsKKwlveHUtPmlzX290ZyA9IG90ZzsKKworCXJldCA9IHVzYl9hZGRfaGNkKGhjZCwgaXJxLCBJUlFGX1NIQVJFRCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiBFUlJfUFRSKHJldCk7CisKKwlyZXR1cm4gaGNkOworfQorCitzdGF0aWMgaW50IG94dV9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJdW5zaWduZWQgbG9uZyBtZW1zdGFydCwgdW5zaWduZWQgbG9uZyBtZW1sZW4sCisJCQkJdm9pZCAqYmFzZSwgaW50IGlycSkKK3sKKwlzdHJ1Y3Qgb3h1X2luZm8gKmluZm8gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkOworCWludCByZXQ7CisKKwkvKiBGaXJzdCB0aW1lIGNvbmZpZ3VyYXRpb24gYXQgc3RhcnQgdXAgKi8KKwlveHVfY29uZmlndXJhdGlvbihwZGV2LCBiYXNlKTsKKworCXJldCA9IG94dV92ZXJpZnlfaWQocGRldiwgYmFzZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBkZXZpY2VzIGZvdW5kIVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIENyZWF0ZSB0aGUgT1RHIGNvbnRyb2xsZXIgKi8KKwloY2QgPSBveHVfY3JlYXRlKHBkZXYsIG1lbXN0YXJ0LCBtZW1sZW4sIGJhc2UsIGlycSwgMSk7CisJaWYgKElTX0VSUihoY2QpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBjcmVhdGUgT1RHIGNvbnRyb2xsZXIhXG4iKTsKKwkJcmV0ID0gUFRSX0VSUihoY2QpOworCQlnb3RvIGVycm9yX2NyZWF0ZV9vdGc7CisJfQorCWluZm8tPmhjZFswXSA9IGhjZDsKKworCS8qIENyZWF0ZSB0aGUgU1BIIGhvc3QgY29udHJvbGxlciAqLworCWhjZCA9IG94dV9jcmVhdGUocGRldiwgbWVtc3RhcnQsIG1lbWxlbiwgYmFzZSwgaXJxLCAwKTsKKwlpZiAoSVNfRVJSKGhjZCkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IGNyZWF0ZSBTUEggY29udHJvbGxlciFcbiIpOworCQlyZXQgPSBQVFJfRVJSKGhjZCk7CisJCWdvdG8gZXJyb3JfY3JlYXRlX3NwaDsKKwl9CisJaW5mby0+aGNkWzFdID0gaGNkOworCisJb3h1X3dyaXRlbChiYXNlLCBPWFVfQ0hJUElSUUVOX1NFVCwKKwkJb3h1X3JlYWRsKGJhc2UsIE9YVV9DSElQSVJRRU5fU0VUKSB8IDMpOworCisJcmV0dXJuIDA7CisKK2Vycm9yX2NyZWF0ZV9zcGg6CisJdXNiX3JlbW92ZV9oY2QoaW5mby0+aGNkWzBdKTsKKwl1c2JfcHV0X2hjZChpbmZvLT5oY2RbMF0pOworCitlcnJvcl9jcmVhdGVfb3RnOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb3h1X2Rydl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXZvaWQgKmJhc2U7CisJdW5zaWduZWQgbG9uZyBtZW1zdGFydCwgbWVtbGVuOworCWludCBpcnEsIHJldDsKKwlzdHJ1Y3Qgb3h1X2luZm8gKmluZm87CisKKwlpZiAodXNiX2Rpc2FibGVkKCkpCisJCXJldHVybiAtRU5PREVWOworCisJLyoKKwkgKiBHZXQgdGhlIHBsYXRmb3JtIHJlc291cmNlcworCSAqLworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lSUSwgMCk7CisJaWYgKCFyZXMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIm5vIElSUSEgQ2hlY2sgJXMgc2V0dXAhXG4iLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpcnEgPSByZXMtPnN0YXJ0OworCWRldl9kYmcoJnBkZXYtPmRldiwgIklSUSByZXNvdXJjZSAlZFxuIiwgaXJxKTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gcmVnaXN0ZXJzIGFkZHJlc3MhIENoZWNrICVzIHNldHVwIVxuIiwKKwkJCWRldl9uYW1lKCZwZGV2LT5kZXYpKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCW1lbXN0YXJ0ID0gcmVzLT5zdGFydDsKKwltZW1sZW4gPSByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxOworCWRldl9kYmcoJnBkZXYtPmRldiwgIk1FTSByZXNvdXJjZSAlbHgtJWx4XG4iLCBtZW1zdGFydCwgbWVtbGVuKTsKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihtZW1zdGFydCwgbWVtbGVuLAorCQkJCW94dV9oY19kcml2ZXIuZGVzY3JpcHRpb24pKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgIm1lbW9yeSBhcmVhIGFscmVhZHkgaW4gdXNlXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlyZXQgPSBzZXRfaXJxX3R5cGUoaXJxLCBJUlFGX1RSSUdHRVJfRkFMTElORyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJlcnJvciBzZXR0aW5nIGlycSB0eXBlXG4iKTsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBlcnJvcl9zZXRfaXJxX3R5cGU7CisJfQorCisJYmFzZSA9IGlvcmVtYXAobWVtc3RhcnQsIG1lbWxlbik7CisJaWYgKCFiYXNlKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgImVycm9yIG1hcHBpbmcgbWVtb3J5XG4iKTsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBlcnJvcl9pb3JlbWFwOworCX0KKworCS8qIEFsbG9jYXRlIGEgZHJpdmVyIGRhdGEgc3RydWN0IHRvIGhvbGQgdXNlZnVsIGluZm8gZm9yIGJvdGgKKwkgKiBTUEggJiBPVEcgZGV2aWNlcworCSAqLworCWluZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgb3h1X2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluZm8pIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiZXJyb3IgYWxsb2NhdGluZyBtZW1vcnlcbiIpOworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGVycm9yX2FsbG9jOworCX0KKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBpbmZvKTsKKworCXJldCA9IG94dV9pbml0KHBkZXYsIG1lbXN0YXJ0LCBtZW1sZW4sIGJhc2UsIGlycSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiY2Fubm90IGluaXQgVVNCIGRldmljZXNcbiIpOworCQlnb3RvIGVycm9yX2luaXQ7CisJfQorCisJZGV2X2luZm8oJnBkZXYtPmRldiwgImRldmljZXMgZW5hYmxlZCBhbmQgcnVubmluZ1xuIik7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaW5mbyk7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfaW5pdDoKKwlrZnJlZShpbmZvKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworZXJyb3JfYWxsb2M6CisJaW91bm1hcChiYXNlKTsKKworZXJyb3Jfc2V0X2lycV90eXBlOgorZXJyb3JfaW9yZW1hcDoKKwlyZWxlYXNlX21lbV9yZWdpb24obWVtc3RhcnQsIG1lbWxlbik7CisKKwlkZXZfZXJyKCZwZGV2LT5kZXYsICJpbml0ICVzIGZhaWwsICVkXG4iLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBveHVfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisJdXNiX3JlbW92ZV9oY2QoaGNkKTsKKwl1c2JfcHV0X2hjZChoY2QpOworfQorCitzdGF0aWMgaW50IG94dV9kcnZfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG94dV9pbmZvICppbmZvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgbG9uZyBtZW1zdGFydCA9IGluZm8tPmhjZFswXS0+cnNyY19zdGFydCwKKwkJCW1lbWxlbiA9IGluZm8tPmhjZFswXS0+cnNyY19sZW47CisJdm9pZCAqYmFzZSA9IGluZm8tPmhjZFswXS0+cmVnczsKKworCW94dV9yZW1vdmUocGRldiwgaW5mby0+aGNkWzBdKTsKKwlveHVfcmVtb3ZlKHBkZXYsIGluZm8tPmhjZFsxXSk7CisKKwlpb3VubWFwKGJhc2UpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihtZW1zdGFydCwgbWVtbGVuKTsKKworCWtmcmVlKGluZm8pOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG94dV9kcnZfc2h1dGRvd24oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlveHVfZHJ2X3JlbW92ZShwZGV2KTsKK30KKworI2lmIDAKKy8qIEZJWE1FOiBUT0RPICovCitzdGF0aWMgaW50IG94dV9kcnZfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCB1c2JfaGNkICpoY2QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG94dV9kcnZfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHVzYl9oY2QgKmhjZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSBveHVfZHJ2X3N1c3BlbmQJTlVMTAorI2RlZmluZSBveHVfZHJ2X3Jlc3VtZQlOVUxMCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgb3h1X2RyaXZlciA9IHsKKwkucHJvYmUJCT0gb3h1X2Rydl9wcm9iZSwKKwkucmVtb3ZlCQk9IG94dV9kcnZfcmVtb3ZlLAorCS5zaHV0ZG93bgk9IG94dV9kcnZfc2h1dGRvd24sCisJLnN1c3BlbmQJPSBveHVfZHJ2X3N1c3BlbmQsCisJLnJlc3VtZQkJPSBveHVfZHJ2X3Jlc3VtZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJveHUyMTBocC1oY2QiLAorCQkuYnVzID0gJnBsYXRmb3JtX2J1c190eXBlCisJfQorfTsKKworc3RhdGljIGludCBfX2luaXQgb3h1X21vZHVsZV9pbml0KHZvaWQpCit7CisJaW50IHJldHZhbCA9IDA7CisKKwlyZXR2YWwgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm94dV9kcml2ZXIpOworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG94dV9tb2R1bGVfY2xlYW51cCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZveHVfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQob3h1X21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KG94dV9tb2R1bGVfY2xlYW51cCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiT3hmb3JkIE9YVTIxMEhQIEhDRCBkcml2ZXIgLSB2ZXIuICIgRFJJVkVSX1ZFUlNJT04pOworTU9EVUxFX0FVVEhPUigiUm9kb2xmbyBHaW9tZXR0aSA8Z2lvbWV0dGlAbGludXguaXQ+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L294dTIxMGhwLmggYi9kcml2ZXJzL3VzYi9ob3N0L294dTIxMGhwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkxMGUyNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb3h1MjEwaHAuaApAQCAtMCwwICsxLDQ0NyBAQAorLyoKKyAqIEhvc3QgaW50ZXJmYWNlIHJlZ2lzdGVycworICovCisKKyNkZWZpbmUgT1hVX0RFVklDRUlECQkJMHgwMAorCSNkZWZpbmUgT1hVX1JFVl9NQVNLCQkweGZmZmYwMDAwCisJI2RlZmluZSBPWFVfUkVWX1NISUZUCQkxNgorCSNkZWZpbmUgT1hVX1JFVl8yMTAwCQkweDIxMDAKKwkjZGVmaW5lIE9YVV9CT19TSElGVAkJOAorCSNkZWZpbmUgT1hVX0JPX01BU0sJCSgweDMgPDwgT1hVX0JPX1NISUZUKQorCSNkZWZpbmUgT1hVX01BSl9SRVZfU0hJRlQJNAorCSNkZWZpbmUgT1hVX01BSl9SRVZfTUFTSwkoMHhmIDw8IE9YVV9NQUpfUkVWX1NISUZUKQorCSNkZWZpbmUgT1hVX01JTl9SRVZfU0hJRlQJMAorCSNkZWZpbmUgT1hVX01JTl9SRVZfTUFTSwkoMHhmIDw8IE9YVV9NSU5fUkVWX1NISUZUKQorI2RlZmluZSBPWFVfSE9TVElGQ09ORklHCQkweDA0CisjZGVmaW5lIE9YVV9TT0ZUUkVTRVQJCQkweDA4CisJI2RlZmluZSBPWFVfU1JFU0VUCQkoMSA8PCAwKQorCisjZGVmaW5lIE9YVV9QSU9CVVJTVFJFQURDVFJMCQkweDBDCisKKyNkZWZpbmUgT1hVX0NISVBJUlFTVEFUVVMJCTB4MTAKKyNkZWZpbmUgT1hVX0NISVBJUlFFTl9TRVQJCTB4MTQKKyNkZWZpbmUgT1hVX0NISVBJUlFFTl9DTFIJCTB4MTgKKwkjZGVmaW5lIE9YVV9VU0JTUEhMUFdVSQkJMHgwMDAwMDA4MAorCSNkZWZpbmUgT1hVX1VTQk9UR0xQV1VJCQkweDAwMDAwMDQwCisJI2RlZmluZSBPWFVfVVNCU1BISQkJMHgwMDAwMDAwMgorCSNkZWZpbmUgT1hVX1VTQk9UR0kJCTB4MDAwMDAwMDEKKworI2RlZmluZSBPWFVfQ0xLQ1RSTF9TRVQJCQkweDFDCisJI2RlZmluZSBPWFVfU1lTQ0xLRU4JCTB4MDAwMDAwMDgKKwkjZGVmaW5lIE9YVV9VU0JTUEhDTEtFTgkJMHgwMDAwMDAwMgorCSNkZWZpbmUgT1hVX1VTQk9UR0NMS0VOCQkweDAwMDAwMDAxCisKKyNkZWZpbmUgT1hVX0FTTwkJCQkweDY4CisJI2RlZmluZSBPWFVfU1BIUE9FTgkJMHgwMDAwMDEwMAorCSNkZWZpbmUgT1hVX09WUkNDVVJQVVBERU4JMHgwMDAwMDgwMAorCSNkZWZpbmUgT1hVX0FTT19PUAkJKDEgPDwgMTApCisJI2RlZmluZSBPWFVfQ09NUEFSQVRPUgkJMHgwMDAwMDQwMDAKKworI2RlZmluZSBPWFVfVVNCTU9ERQkJCTB4MUE4CisJI2RlZmluZSBPWFVfVkJQUwkJMHgwMDAwMDAyMAorCSNkZWZpbmUgT1hVX0VTX0xJVFRMRQkJMHgwMDAwMDAwMAorCSNkZWZpbmUgT1hVX0NNX0hPU1RfT05MWQkweDAwMDAwMDAzCisKKy8qCisgKiBQcm9wZXIgRUhDSSBzdHJ1Y3RzICYgZGVmaW5lcworICovCisKKy8qIE1hZ2ljIG51bWJlcnMgdGhhdCBjYW4gYWZmZWN0IHN5c3RlbSBwZXJmb3JtYW5jZSAqLworI2RlZmluZSBFSENJX1RVTkVfQ0VSUgkJMwkvKiAwLTMgcXRkIHJldHJpZXM7IDAgPT0gZG9uJ3Qgc3RvcCAqLworI2RlZmluZSBFSENJX1RVTkVfUkxfSFMJCTQJLyogbmFrIHRocm90dGxlOyBzZWUgNC45ICovCisjZGVmaW5lIEVIQ0lfVFVORV9STF9UVAkJMAorI2RlZmluZSBFSENJX1RVTkVfTVVMVF9IUwkxCS8qIDEtMyB0cmFuc2FjdGlvbnMvdWZyYW1lOyA0LjEwLjMgKi8KKyNkZWZpbmUgRUhDSV9UVU5FX01VTFRfVFQJMQorI2RlZmluZSBFSENJX1RVTkVfRkxTCQkyCS8qIChzbWFsbCkgMjU2IGZyYW1lIHNjaGVkdWxlICovCisKK3N0cnVjdCBveHVfaGNkOworCisvKiBFSENJIHJlZ2lzdGVyIGludGVyZmFjZSwgY29ycmVzcG9uZHMgdG8gRUhDSSBSZXZpc2lvbiAwLjk1IHNwZWNpZmljYXRpb24gKi8KKworLyogU2VjdGlvbiAyLjIgSG9zdCBDb250cm9sbGVyIENhcGFiaWxpdHkgUmVnaXN0ZXJzICovCitzdHJ1Y3QgZWhjaV9jYXBzIHsKKwkvKiB0aGVzZSBmaWVsZHMgYXJlIHNwZWNpZmllZCBhcyA4IGFuZCAxNiBiaXQgcmVnaXN0ZXJzLAorCSAqIGJ1dCBzb21lIGhvc3RzIGNhbid0IHBlcmZvcm0gOCBvciAxNiBiaXQgUENJIGFjY2Vzc2VzLgorCSAqLworCXUzMgkJaGNfY2FwYmFzZTsKKyNkZWZpbmUgSENfTEVOR1RIKHApCQkoKChwKT4+MDApJjB4MDBmZikJLyogYml0cyA3OjAgKi8KKyNkZWZpbmUgSENfVkVSU0lPTihwKQkJKCgocCk+PjE2KSYweGZmZmYpCS8qIGJpdHMgMzE6MTYgKi8KKwl1MzIJCWhjc19wYXJhbXM7ICAgICAvKiBIQ1NQQVJBTVMgLSBvZmZzZXQgMHg0ICovCisjZGVmaW5lIEhDU19ERUJVR19QT1JUKHApCSgoKHApPj4yMCkmMHhmKQkvKiBiaXRzIDIzOjIwLCBkZWJ1ZyBwb3J0PyAqLworI2RlZmluZSBIQ1NfSU5ESUNBVE9SKHApCSgocCkmKDEgPDwgMTYpKQkvKiB0cnVlOiBoYXMgcG9ydCBpbmRpY2F0b3JzICovCisjZGVmaW5lIEhDU19OX0NDKHApCQkoKChwKT4+MTIpJjB4ZikJLyogYml0cyAxNToxMiwgI2NvbXBhbmlvbiBIQ3MgKi8KKyNkZWZpbmUgSENTX05fUENDKHApCQkoKChwKT4+OCkmMHhmKQkvKiBiaXRzIDExOjgsIHBvcnRzIHBlciBDQyAqLworI2RlZmluZSBIQ1NfUE9SVFJPVVRFRChwKQkoKHApJigxIDw8IDcpKQkvKiB0cnVlOiBwb3J0IHJvdXRpbmcgKi8KKyNkZWZpbmUgSENTX1BQQyhwKQkJKChwKSYoMSA8PCA0KSkJLyogdHJ1ZTogcG9ydCBwb3dlciBjb250cm9sICovCisjZGVmaW5lIEhDU19OX1BPUlRTKHApCQkoKChwKT4+MCkmMHhmKQkvKiBiaXRzIDM6MCwgcG9ydHMgb24gSEMgKi8KKworCXUzMgkJaGNjX3BhcmFtczsgICAgICAvKiBIQ0NQQVJBTVMgLSBvZmZzZXQgMHg4ICovCisjZGVmaW5lIEhDQ19FWFRfQ0FQUyhwKQkJKCgocCk+PjgpJjB4ZmYpCS8qIGZvciBwY2kgZXh0ZW5kZWQgY2FwcyAqLworI2RlZmluZSBIQ0NfSVNPQ19DQUNIRShwKSAgICAgICAoKHApJigxIDw8IDcpKSAgLyogdHJ1ZTogY2FuIGNhY2hlIGlzb2MgZnJhbWUgKi8KKyNkZWZpbmUgSENDX0lTT0NfVEhSRVMocCkgICAgICAgKCgocCk+PjQpJjB4NykgIC8qIGJpdHMgNjo0LCB1ZnJhbWVzIGNhY2hlZCAqLworI2RlZmluZSBIQ0NfQ0FOUEFSSyhwKQkJKChwKSYoMSA8PCAyKSkgIC8qIHRydWU6IGNhbiBwYXJrIG9uIGFzeW5jIHFoICovCisjZGVmaW5lIEhDQ19QR01fRlJBTUVMSVNUTEVOKHApICgocCkmKDEgPDwgMSkpICAvKiB0cnVlOiBwZXJpb2RpY19zaXplIGNoYW5nZXMqLworI2RlZmluZSBIQ0NfNjRCSVRfQUREUihwKSAgICAgICAoKHApJigxKSkgICAgICAgLyogdHJ1ZTogY2FuIHVzZSA2NC1iaXQgYWRkciAqLworCXU4CQlwb3J0cm91dGVbOF07CSAvKiBuaWJibGVzIGZvciByb3V0aW5nIC0gb2Zmc2V0IDB4QyAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworLyogU2VjdGlvbiAyLjMgSG9zdCBDb250cm9sbGVyIE9wZXJhdGlvbmFsIFJlZ2lzdGVycyAqLworc3RydWN0IGVoY2lfcmVncyB7CisJLyogVVNCQ01EOiBvZmZzZXQgMHgwMCAqLworCXUzMgkJY29tbWFuZDsKKy8qIDIzOjE2IGlzIHIvdyBpbnRyIHJhdGUsIGluIG1pY3JvZnJhbWVzOyBkZWZhdWx0ICI4IiA9PSAxL21zZWMgKi8KKyNkZWZpbmUgQ01EX1BBUksJKDE8PDExKQkJLyogZW5hYmxlICJwYXJrIiBvbiBhc3luYyBxaCAqLworI2RlZmluZSBDTURfUEFSS19DTlQoYykJKCgoYyk+PjgpJjMpCS8qIGhvdyBtYW55IHRyYW5zZmVycyB0byBwYXJrIGZvciAqLworI2RlZmluZSBDTURfTFJFU0VUCSgxPDw3KQkJLyogcGFydGlhbCByZXNldCAobm8gcG9ydHMsIGV0YykgKi8KKyNkZWZpbmUgQ01EX0lBQUQJKDE8PDYpCQkvKiAiZG9vcmJlbGwiIGludGVycnVwdCBhc3luYyBhZHZhbmNlICovCisjZGVmaW5lIENNRF9BU0UJCSgxPDw1KQkJLyogYXN5bmMgc2NoZWR1bGUgZW5hYmxlICovCisjZGVmaW5lIENNRF9QU0UJCSgxPDw0KQkJLyogcGVyaW9kaWMgc2NoZWR1bGUgZW5hYmxlICovCisvKiAzOjIgaXMgcGVyaW9kaWMgZnJhbWUgbGlzdCBzaXplICovCisjZGVmaW5lIENNRF9SRVNFVAkoMTw8MSkJCS8qIHJlc2V0IEhDIG5vdCBidXMgKi8KKyNkZWZpbmUgQ01EX1JVTgkJKDE8PDApCQkvKiBzdGFydC9zdG9wIEhDICovCisKKwkvKiBVU0JTVFM6IG9mZnNldCAweDA0ICovCisJdTMyCQlzdGF0dXM7CisjZGVmaW5lIFNUU19BU1MJCSgxPDwxNSkJCS8qIEFzeW5jIFNjaGVkdWxlIFN0YXR1cyAqLworI2RlZmluZSBTVFNfUFNTCQkoMTw8MTQpCQkvKiBQZXJpb2RpYyBTY2hlZHVsZSBTdGF0dXMgKi8KKyNkZWZpbmUgU1RTX1JFQ0wJKDE8PDEzKQkJLyogUmVjbGFtYXRpb24gKi8KKyNkZWZpbmUgU1RTX0hBTFQJKDE8PDEyKQkJLyogTm90IHJ1bm5pbmcgKGFueSByZWFzb24pICovCisvKiBzb21lIGJpdHMgcmVzZXJ2ZWQgKi8KKwkvKiB0aGVzZSBTVFNfKiBmbGFncyBhcmUgYWxzbyBpbnRyX2VuYWJsZSBiaXRzIChVU0JJTlRSKSAqLworI2RlZmluZSBTVFNfSUFBCQkoMTw8NSkJCS8qIEludGVycnVwdGVkIG9uIGFzeW5jIGFkdmFuY2UgKi8KKyNkZWZpbmUgU1RTX0ZBVEFMCSgxPDw0KQkJLyogc3VjaCBhcyBzb21lIFBDSSBhY2Nlc3MgZXJyb3JzICovCisjZGVmaW5lIFNUU19GTFIJCSgxPDwzKQkJLyogZnJhbWUgbGlzdCByb2xsZWQgb3ZlciAqLworI2RlZmluZSBTVFNfUENECQkoMTw8MikJCS8qIHBvcnQgY2hhbmdlIGRldGVjdCAqLworI2RlZmluZSBTVFNfRVJSCQkoMTw8MSkJCS8qICJlcnJvciIgY29tcGxldGlvbiAob3ZlcmZsb3csIC4uLikgKi8KKyNkZWZpbmUgU1RTX0lOVAkJKDE8PDApCQkvKiAibm9ybWFsIiBjb21wbGV0aW9uIChzaG9ydCwgLi4uKSAqLworCisjZGVmaW5lIElOVFJfTUFTSyAoU1RTX0lBQSB8IFNUU19GQVRBTCB8IFNUU19QQ0QgfCBTVFNfRVJSIHwgU1RTX0lOVCkKKworCS8qIFVTQklOVFI6IG9mZnNldCAweDA4ICovCisJdTMyCQlpbnRyX2VuYWJsZTsKKworCS8qIEZSSU5ERVg6IG9mZnNldCAweDBDICovCisJdTMyCQlmcmFtZV9pbmRleDsJLyogY3VycmVudCBtaWNyb2ZyYW1lIG51bWJlciAqLworCS8qIENUUkxEU1NFR01FTlQ6IG9mZnNldCAweDEwICovCisJdTMyCQlzZWdtZW50OwkvKiBhZGRyZXNzIGJpdHMgNjM6MzIgaWYgbmVlZGVkICovCisJLyogUEVSSU9ESUNMSVNUQkFTRTogb2Zmc2V0IDB4MTQgKi8KKwl1MzIJCWZyYW1lX2xpc3Q7CS8qIHBvaW50cyB0byBwZXJpb2RpYyBsaXN0ICovCisJLyogQVNZTkNMSVNUQUREUjogb2Zmc2V0IDB4MTggKi8KKwl1MzIJCWFzeW5jX25leHQ7CS8qIGFkZHJlc3Mgb2YgbmV4dCBhc3luYyBxdWV1ZSBoZWFkICovCisKKwl1MzIJCXJlc2VydmVkWzldOworCisJLyogQ09ORklHRkxBRzogb2Zmc2V0IDB4NDAgKi8KKwl1MzIJCWNvbmZpZ3VyZWRfZmxhZzsKKyNkZWZpbmUgRkxBR19DRgkJKDE8PDApCQkvKiB0cnVlOiB3ZSdsbCBzdXBwb3J0ICJoaWdoIHNwZWVkIiAqLworCisJLyogUE9SVFNDOiBvZmZzZXQgMHg0NCAqLworCXUzMgkJcG9ydF9zdGF0dXNbMF07CS8qIHVwIHRvIE5fUE9SVFMgKi8KKy8qIDMxOjIzIHJlc2VydmVkICovCisjZGVmaW5lIFBPUlRfV0tPQ19FCSgxPDwyMikJCS8qIHdha2Ugb24gb3ZlcmN1cnJlbnQgKGVuYWJsZSkgKi8KKyNkZWZpbmUgUE9SVF9XS0RJU0NfRQkoMTw8MjEpCQkvKiB3YWtlIG9uIGRpc2Nvbm5lY3QgKGVuYWJsZSkgKi8KKyNkZWZpbmUgUE9SVF9XS0NPTk5fRQkoMTw8MjApCQkvKiB3YWtlIG9uIGNvbm5lY3QgKGVuYWJsZSkgKi8KKy8qIDE5OjE2IGZvciBwb3J0IHRlc3RpbmcgKi8KKyNkZWZpbmUgUE9SVF9MRURfT0ZGCSgwPDwxNCkKKyNkZWZpbmUgUE9SVF9MRURfQU1CRVIJKDE8PDE0KQorI2RlZmluZSBQT1JUX0xFRF9HUkVFTgkoMjw8MTQpCisjZGVmaW5lIFBPUlRfTEVEX01BU0sJKDM8PDE0KQorI2RlZmluZSBQT1JUX09XTkVSCSgxPDwxMykJCS8qIHRydWU6IGNvbXBhbmlvbiBoYyBvd25zIHRoaXMgcG9ydCAqLworI2RlZmluZSBQT1JUX1BPV0VSCSgxPDwxMikJCS8qIHRydWU6IGhhcyBwb3dlciAoc2VlIFBQQykgKi8KKyNkZWZpbmUgUE9SVF9VU0IxMSh4KSAoKCh4KSYoMzw8MTApKSA9PSAoMTw8MTApKQkvKiBVU0IgMS4xIGRldmljZSAqLworLyogMTE6MTAgZm9yIGRldGVjdGluZyBsb3dzcGVlZCBkZXZpY2VzIChyZXNldCB2cyByZWxlYXNlIG93bmVyc2hpcCkgKi8KKy8qIDkgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUE9SVF9SRVNFVAkoMTw8OCkJCS8qIHJlc2V0IHBvcnQgKi8KKyNkZWZpbmUgUE9SVF9TVVNQRU5ECSgxPDw3KQkJLyogc3VzcGVuZCBwb3J0ICovCisjZGVmaW5lIFBPUlRfUkVTVU1FCSgxPDw2KQkJLyogcmVzdW1lIGl0ICovCisjZGVmaW5lIFBPUlRfT0NDCSgxPDw1KQkJLyogb3ZlciBjdXJyZW50IGNoYW5nZSAqLworI2RlZmluZSBQT1JUX09DCQkoMTw8NCkJCS8qIG92ZXIgY3VycmVudCBhY3RpdmUgKi8KKyNkZWZpbmUgUE9SVF9QRUMJKDE8PDMpCQkvKiBwb3J0IGVuYWJsZSBjaGFuZ2UgKi8KKyNkZWZpbmUgUE9SVF9QRQkJKDE8PDIpCQkvKiBwb3J0IGVuYWJsZSAqLworI2RlZmluZSBQT1JUX0NTQwkoMTw8MSkJCS8qIGNvbm5lY3Qgc3RhdHVzIGNoYW5nZSAqLworI2RlZmluZSBQT1JUX0NPTk5FQ1QJKDE8PDApCQkvKiBkZXZpY2UgY29ubmVjdGVkICovCisjZGVmaW5lIFBPUlRfUldDX0JJVFMgICAoUE9SVF9DU0MgfCBQT1JUX1BFQyB8IFBPUlRfT0NDKQorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIEFwcGVuZGl4IEMsIERlYnVnIHBvcnQgLi4uIGludGVuZGVkIGZvciB1c2Ugd2l0aCBzcGVjaWFsICJkZWJ1ZyBkZXZpY2VzIgorICogdGhhdCBjYW4gaGVscCBpZiB0aGVyZSdzIG5vIHNlcmlhbCBjb25zb2xlLiAgKG5vbnN0YW5kYXJkIGVudW1lcmF0aW9uLikKKyAqLworc3RydWN0IGVoY2lfZGJnX3BvcnQgeworCXUzMgljb250cm9sOworI2RlZmluZSBEQkdQX09XTkVSCSgxPDwzMCkKKyNkZWZpbmUgREJHUF9FTkFCTEVECSgxPDwyOCkKKyNkZWZpbmUgREJHUF9ET05FCSgxPDwxNikKKyNkZWZpbmUgREJHUF9JTlVTRQkoMTw8MTApCisjZGVmaW5lIERCR1BfRVJSQ09ERSh4KQkoKCh4KT4+NykmMHgwNykKKyMJZGVmaW5lIERCR1BfRVJSX0JBRAkxCisjCWRlZmluZSBEQkdQX0VSUl9TSUdOQUwJMgorI2RlZmluZSBEQkdQX0VSUk9SCSgxPDw2KQorI2RlZmluZSBEQkdQX0dPCQkoMTw8NSkKKyNkZWZpbmUgREJHUF9PVVQJKDE8PDQpCisjZGVmaW5lIERCR1BfTEVOKHgpCSgoKHgpPj4wKSYweDBmKQorCXUzMglwaWRzOworI2RlZmluZSBEQkdQX1BJRF9HRVQoeCkJCSgoKHgpPj4xNikmMHhmZikKKyNkZWZpbmUgREJHUF9QSURfU0VUKGRhdGEsIHRvaykJKCgoZGF0YSk8PDgpfCh0b2spKQorCXUzMglkYXRhMDM7CisJdTMyCWRhdGE0NzsKKwl1MzIJYWRkcmVzczsKKyNkZWZpbmUgREJHUF9FUEFERFIoZGV2LCBlcCkJKCgoZGV2KTw8OCl8KGVwKSkKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisKKyNkZWZpbmUJUVREX05FWFQoZG1hKQljcHVfdG9fbGUzMigodTMyKWRtYSkKKworLyoKKyAqIEVIQ0kgU3BlY2lmaWNhdGlvbiAwLjk1IFNlY3Rpb24gMy41CisgKiBRVEQ6IGRlc2NyaWJlIGRhdGEgdHJhbnNmZXIgY29tcG9uZW50cyAoYnVmZmVyLCBkaXJlY3Rpb24sIC4uLikKKyAqIFNlZSBGaWcgMy02ICJRdWV1ZSBFbGVtZW50IFRyYW5zZmVyIERlc2NyaXB0b3IgQmxvY2sgRGlhZ3JhbSIuCisgKgorICogVGhlc2UgYXJlIGFzc29jaWF0ZWQgb25seSB3aXRoICJRSCIgKFF1ZXVlIEhlYWQpIHN0cnVjdHVyZXMsCisgKiB1c2VkIHdpdGggY29udHJvbCwgYnVsaywgYW5kIGludGVycnVwdCB0cmFuc2ZlcnMuCisgKi8KK3N0cnVjdCBlaGNpX3F0ZCB7CisJLyogZmlyc3QgcGFydCBkZWZpbmVkIGJ5IEVIQ0kgc3BlYyAqLworCV9fbGUzMgkJCWh3X25leHQ7CQkvKiBzZWUgRUhDSSAzLjUuMSAqLworCV9fbGUzMgkJCWh3X2FsdF9uZXh0OwkJLyogc2VlIEVIQ0kgMy41LjIgKi8KKwlfX2xlMzIJCQlod190b2tlbjsJCS8qIHNlZSBFSENJIDMuNS4zICovCisjZGVmaW5lCVFURF9UT0dHTEUJKDEgPDwgMzEpCS8qIGRhdGEgdG9nZ2xlICovCisjZGVmaW5lCVFURF9MRU5HVEgodG9rKQkoKCh0b2spPj4xNikgJiAweDdmZmYpCisjZGVmaW5lCVFURF9JT0MJCSgxIDw8IDE1KQkvKiBpbnRlcnJ1cHQgb24gY29tcGxldGUgKi8KKyNkZWZpbmUJUVREX0NFUlIodG9rKQkoKCh0b2spPj4xMCkgJiAweDMpCisjZGVmaW5lCVFURF9QSUQodG9rKQkoKCh0b2spPj44KSAmIDB4MykKKyNkZWZpbmUJUVREX1NUU19BQ1RJVkUJKDEgPDwgNykJLyogSEMgbWF5IGV4ZWN1dGUgdGhpcyAqLworI2RlZmluZQlRVERfU1RTX0hBTFQJKDEgPDwgNikJLyogaGFsdGVkIG9uIGVycm9yICovCisjZGVmaW5lCVFURF9TVFNfREJFCSgxIDw8IDUpCS8qIGRhdGEgYnVmZmVyIGVycm9yIChpbiBIQykgKi8KKyNkZWZpbmUJUVREX1NUU19CQUJCTEUJKDEgPDwgNCkJLyogZGV2aWNlIHdhcyBiYWJibGluZyAocXRkIGhhbHRlZCkgKi8KKyNkZWZpbmUJUVREX1NUU19YQUNUCSgxIDw8IDMpCS8qIGRldmljZSBnYXZlIGlsbGVnYWwgcmVzcG9uc2UgKi8KKyNkZWZpbmUJUVREX1NUU19NTUYJKDEgPDwgMikJLyogaW5jb21wbGV0ZSBzcGxpdCB0cmFuc2FjdGlvbiAqLworI2RlZmluZQlRVERfU1RTX1NUUwkoMSA8PCAxKQkvKiBzcGxpdCB0cmFuc2FjdGlvbiBzdGF0ZSAqLworI2RlZmluZQlRVERfU1RTX1BJTkcJKDEgPDwgMCkJLyogaXNzdWUgUElORz8gKi8KKwlfX2xlMzIJCQlod19idWZbNV07CQkvKiBzZWUgRUhDSSAzLjUuNCAqLworCV9fbGUzMgkJCWh3X2J1Zl9oaVs1XTsJCS8qIEFwcGVuZGl4IEIgKi8KKworCS8qIHRoZSByZXN0IGlzIEhDRC1wcml2YXRlICovCisJZG1hX2FkZHJfdAkJcXRkX2RtYTsJCS8qIHF0ZCBhZGRyZXNzICovCisJc3RydWN0IGxpc3RfaGVhZAlxdGRfbGlzdDsJCS8qIHN3IHF0ZCBsaXN0ICovCisJc3RydWN0IHVyYgkJKnVyYjsJCQkvKiBxdGQncyB1cmIgKi8KKwlzaXplX3QJCQlsZW5ndGg7CQkJLyogbGVuZ3RoIG9mIGJ1ZmZlciAqLworCisJdTMyCQkJcXRkX2J1ZmZlcl9sZW47CisJdm9pZAkJCSpidWZmZXI7CisJZG1hX2FkZHJfdAkJYnVmZmVyX2RtYTsKKwl2b2lkCQkJKnRyYW5zZmVyX2J1ZmZlcjsKKwl2b2lkCQkJKnRyYW5zZmVyX2RtYTsKK30gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMzIpKSk7CisKKy8qIG1hc2sgTmFrQ250K1QgaW4gcWgtPmh3X2FsdF9uZXh0ICovCisjZGVmaW5lIFFURF9NQVNLIF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKH4weDFmKQorCisjZGVmaW5lIElTX1NIT1JUX1JFQUQodG9rZW4pIChRVERfTEVOR1RIKHRva2VuKSAhPSAwICYmIFFURF9QSUQodG9rZW4pID09IDEpCisKKy8qIFR5cGUgdGFnIGZyb20ge3FoLCBpdGQsIHNpdGQsIGZzdG59LT5od19uZXh0ICovCisjZGVmaW5lIFFfTkVYVF9UWVBFKGRtYSkgKChkbWEpICYgX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMyA8PCAxKSkKKworLyogdmFsdWVzIGZvciB0aGF0IHR5cGUgdGFnICovCisjZGVmaW5lIFFfVFlQRV9RSAlfX2NvbnN0YW50X2NwdV90b19sZTMyICgxIDw8IDEpCisKKy8qIG5leHQgYXN5bmMgcXVldWUgZW50cnksIG9yIHBvaW50ZXIgdG8gaW50ZXJydXB0L3BlcmlvZGljIFFIICovCisjZGVmaW5lCVFIX05FWFQoZG1hKQkoY3B1X3RvX2xlMzIoKCh1MzIpZG1hKSZ+MHgwMWYpfFFfVFlQRV9RSCkKKworLyogZm9yIHBlcmlvZGljL2FzeW5jIHNjaGVkdWxlcyBhbmQgcXRkIGxpc3RzLCBtYXJrIGVuZCBvZiBsaXN0ICovCisjZGVmaW5lCUVIQ0lfTElTVF9FTkQJX19jb25zdGFudF9jcHVfdG9fbGUzMigxKSAvKiAibnVsbCBwb2ludGVyIiB0byBodyAqLworCisvKgorICogRW50cmllcyBpbiBwZXJpb2RpYyBzaGFkb3cgdGFibGUgYXJlIHBvaW50ZXJzIHRvIG9uZSBvZiBmb3VyIGtpbmRzCisgKiBvZiBkYXRhIHN0cnVjdHVyZS4gIFRoYXQncyBkaWN0YXRlZCBieSB0aGUgaGFyZHdhcmU7IGEgdHlwZSB0YWcgaXMKKyAqIGVuY29kZWQgaW4gdGhlIGxvdyBiaXRzIG9mIHRoZSBoYXJkd2FyZSdzIHBlcmlvZGljIHNjaGVkdWxlLiAgVXNlCisgKiBRX05FWFRfVFlQRSB0byBnZXQgdGhlIHRhZy4KKyAqCisgKiBGb3IgZW50cmllcyBpbiB0aGUgYXN5bmMgc2NoZWR1bGUsIHRoZSB0eXBlIHRhZyBhbHdheXMgc2F5cyAicWgiLgorICovCit1bmlvbiBlaGNpX3NoYWRvdyB7CisJc3RydWN0IGVoY2lfcWgJCSpxaDsJCS8qIFFfVFlQRV9RSCAqLworCV9fbGUzMgkJCSpod19uZXh0OwkvKiAoYWxsIHR5cGVzKSAqLworCXZvaWQJCQkqcHRyOworfTsKKworLyoKKyAqIEVIQ0kgU3BlY2lmaWNhdGlvbiAwLjk1IFNlY3Rpb24gMy42CisgKiBRSDogZGVzY3JpYmVzIGNvbnRyb2wvYnVsay9pbnRlcnJ1cHQgZW5kcG9pbnRzCisgKiBTZWUgRmlnIDMtNyAiUXVldWUgSGVhZCBTdHJ1Y3R1cmUgTGF5b3V0Ii4KKyAqCisgKiBUaGVzZSBhcHBlYXIgaW4gYm90aCB0aGUgYXN5bmMgYW5kIChmb3IgaW50ZXJydXB0KSBwZXJpb2RpYyBzY2hlZHVsZXMuCisgKi8KKworc3RydWN0IGVoY2lfcWggeworCS8qIGZpcnN0IHBhcnQgZGVmaW5lZCBieSBFSENJIHNwZWMgKi8KKwlfX2xlMzIJCQlod19uZXh0OwkgLyogc2VlIEVIQ0kgMy42LjEgKi8KKwlfX2xlMzIJCQlod19pbmZvMTsJLyogc2VlIEVIQ0kgMy42LjIgKi8KKyNkZWZpbmUJUUhfSEVBRAkJMHgwMDAwODAwMAorCV9fbGUzMgkJCWh3X2luZm8yOwkvKiBzZWUgRUhDSSAzLjYuMiAqLworI2RlZmluZQlRSF9TTUFTSwkweDAwMDAwMGZmCisjZGVmaW5lCVFIX0NNQVNLCTB4MDAwMGZmMDAKKyNkZWZpbmUJUUhfSFVCQUREUgkweDAwN2YwMDAwCisjZGVmaW5lCVFIX0hVQlBPUlQJMHgzZjgwMDAwMAorI2RlZmluZQlRSF9NVUxUCQkweGMwMDAwMDAwCisJX19sZTMyCQkJaHdfY3VycmVudDsJIC8qIHF0ZCBsaXN0IC0gc2VlIEVIQ0kgMy42LjQgKi8KKworCS8qIHF0ZCBvdmVybGF5IChoYXJkd2FyZSBwYXJ0cyBvZiBhIHN0cnVjdCBlaGNpX3F0ZCkgKi8KKwlfX2xlMzIJCQlod19xdGRfbmV4dDsKKwlfX2xlMzIJCQlod19hbHRfbmV4dDsKKwlfX2xlMzIJCQlod190b2tlbjsKKwlfX2xlMzIJCQlod19idWZbNV07CisJX19sZTMyCQkJaHdfYnVmX2hpWzVdOworCisJLyogdGhlIHJlc3QgaXMgSENELXByaXZhdGUgKi8KKwlkbWFfYWRkcl90CQlxaF9kbWE7CQkvKiBhZGRyZXNzIG9mIHFoICovCisJdW5pb24gZWhjaV9zaGFkb3cJcWhfbmV4dDsJLyogcHRyIHRvIHFoOyBvciBwZXJpb2RpYyAqLworCXN0cnVjdCBsaXN0X2hlYWQJcXRkX2xpc3Q7CS8qIHN3IHF0ZCBsaXN0ICovCisJc3RydWN0IGVoY2lfcXRkCQkqZHVtbXk7CisJc3RydWN0IGVoY2lfcWgJCSpyZWNsYWltOwkvKiBuZXh0IHRvIHJlY2xhaW0gKi8KKworCXN0cnVjdCBveHVfaGNkCQkqb3h1OworCXN0cnVjdCBrcmVmCQlrcmVmOworCXVuc2lnbmVkCQlzdGFtcDsKKworCXU4CQkJcWhfc3RhdGU7CisjZGVmaW5lCVFIX1NUQVRFX0xJTktFRAkJMQkJLyogSEMgc2VlcyB0aGlzICovCisjZGVmaW5lCVFIX1NUQVRFX1VOTElOSwkJMgkJLyogSEMgbWF5IHN0aWxsIHNlZSB0aGlzICovCisjZGVmaW5lCVFIX1NUQVRFX0lETEUJCTMJCS8qIEhDIGRvZXNuJ3Qgc2VlIHRoaXMgKi8KKyNkZWZpbmUJUUhfU1RBVEVfVU5MSU5LX1dBSVQJNAkJLyogTElOS0VEIGFuZCBvbiByZWNsYWltIHEgKi8KKyNkZWZpbmUJUUhfU1RBVEVfQ09NUExFVElORwk1CQkvKiBkb24ndCB0b3VjaCB0b2tlbi5IQUxUICovCisKKwkvKiBwZXJpb2RpYyBzY2hlZHVsZSBpbmZvICovCisJdTgJCQl1c2VjczsJCS8qIGludHIgYmFuZHdpZHRoICovCisJdTgJCQlnYXBfdWY7CQkvKiB1ZnJhbWVzIHNwbGl0L2NzcGxpdCBnYXAgKi8KKwl1OAkJCWNfdXNlY3M7CS8qIC4uLiBzcGxpdCBjb21wbGV0aW9uIGJ3ICovCisJdTE2CQkJdHRfdXNlY3M7CS8qIHR0IGRvd25zdHJlYW0gYmFuZHdpZHRoICovCisJdW5zaWduZWQgc2hvcnQJCXBlcmlvZDsJCS8qIHBvbGxpbmcgaW50ZXJ2YWwgKi8KKwl1bnNpZ25lZCBzaG9ydAkJc3RhcnQ7CQkvKiB3aGVyZSBwb2xsaW5nIHN0YXJ0cyAqLworI2RlZmluZSBOT19GUkFNRSAoKHVuc2lnbmVkIHNob3J0KX4wKQkJCS8qIHBpY2sgbmV3IHN0YXJ0ICovCisJc3RydWN0IHVzYl9kZXZpY2UJKmRldjsJCS8qIGFjY2VzcyB0byBUVCAqLworfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgzMikpKTsKKworLyoKKyAqIFByb3BlciBPWFUyMTBIUCBzdHJ1Y3RzCisgKi8KKworI2RlZmluZSBPWFVfT1RHX0NPUkVfT0ZGU0VUCTB4MDA0MDAKKyNkZWZpbmUgT1hVX09UR19DQVBfT0ZGU0VUCShPWFVfT1RHX0NPUkVfT0ZGU0VUICsgMHgxMDApCisjZGVmaW5lIE9YVV9TUEhfQ09SRV9PRkZTRVQJMHgwMDgwMAorI2RlZmluZSBPWFVfU1BIX0NBUF9PRkZTRVQJKE9YVV9TUEhfQ09SRV9PRkZTRVQgKyAweDEwMCkKKworI2RlZmluZSBPWFVfT1RHX01FTQkJMHhFMDAwCisjZGVmaW5lIE9YVV9TUEhfTUVNCQkweDE2MDAwCisKKy8qIE9ubHkgaG93IG1hbnkgZWxlbWVudHMgJiBlbGVtZW50IHN0cnVjdHVyZSBhcmUgc3BlY2lmaWVzIGhlcmUuICovCisvKiAyIGhvc3QgY29udHJvbGxlcnMgYXJlIGVuYWJsZWQgLSB0b3RhbCBzaXplIDw9IDI4IGtieXRlcyAqLworI2RlZmluZQlERUZBVUxUX0lfVERQUwkJMTAyNAorI2RlZmluZSBRSEVBRF9OVU0JCTE2CisjZGVmaW5lIFFURF9OVU0JCQkzMgorI2RlZmluZSBTSVREX05VTQkJOAorI2RlZmluZSBNVVJCX05VTQkJOAorCisjZGVmaW5lIEJVRkZFUl9OVU0JCTgKKyNkZWZpbmUgQlVGRkVSX1NJWkUJCTUxMgorCitzdHJ1Y3Qgb3h1X2luZm8geworCXN0cnVjdCB1c2JfaGNkICpoY2RbMl07Cit9OworCitzdHJ1Y3Qgb3h1X2J1ZiB7CisJdTgJCQlidWZmZXJbQlVGRkVSX1NJWkVdOworfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZChCVUZGRVJfU0laRSkpKTsKKworc3RydWN0IG94dV9vbmNoaXBfbWVtIHsKKwlzdHJ1Y3Qgb3h1X2J1ZgkJZGJfcG9vbFtCVUZGRVJfTlVNXTsKKworCXUzMgkJCWZyYW1lX2xpc3RbREVGQVVMVF9JX1REUFNdOworCXN0cnVjdCBlaGNpX3FoCQlxaF9wb29sW1FIRUFEX05VTV07CisJc3RydWN0IGVoY2lfcXRkCQlxdGRfcG9vbFtRVERfTlVNXTsKK30gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoNCA8PCAxMCkpKTsKKworI2RlZmluZQlFSENJX01BWF9ST09UX1BPUlRTCTE1CQkvKiBzZWUgSENTX05fUE9SVFMgKi8KKworc3RydWN0IG94dV9tdXJiIHsKKwlzdHJ1Y3QgdXJiCQl1cmI7CisJc3RydWN0IHVyYgkJKm1haW47CisJdTgJCQlsYXN0OworfTsKKworc3RydWN0IG94dV9oY2QgewkJCQkvKiBvbmUgcGVyIGNvbnRyb2xsZXIgKi8KKwl1bnNpZ25lZCBpbnQJCWlzX290ZzoxOworCisJdTgJCQlxaF91c2VkW1FIRUFEX05VTV07CisJdTgJCQlxdGRfdXNlZFtRVERfTlVNXTsKKwl1OAkJCWRiX3VzZWRbQlVGRkVSX05VTV07CisJdTgJCQltdXJiX3VzZWRbTVVSQl9OVU1dOworCisJc3RydWN0IG94dV9vbmNoaXBfbWVtCV9faW9tZW0gKm1lbTsKKwlzcGlubG9ja190CQltZW1fbG9jazsKKworCXN0cnVjdCB0aW1lcl9saXN0CXVyYl90aW1lcjsKKworCXN0cnVjdCBlaGNpX2NhcHMgX19pb21lbSAqY2FwczsKKwlzdHJ1Y3QgZWhjaV9yZWdzIF9faW9tZW0gKnJlZ3M7CisKKwlfX3UzMgkJCWhjc19wYXJhbXM7CS8qIGNhY2hlZCByZWdpc3RlciBjb3B5ICovCisJc3BpbmxvY2tfdAkJbG9jazsKKworCS8qIGFzeW5jIHNjaGVkdWxlIHN1cHBvcnQgKi8KKwlzdHJ1Y3QgZWhjaV9xaAkJKmFzeW5jOworCXN0cnVjdCBlaGNpX3FoCQkqcmVjbGFpbTsKKwl1bnNpZ25lZAkJcmVjbGFpbV9yZWFkeToxOworCXVuc2lnbmVkCQlzY2FubmluZzoxOworCisJLyogcGVyaW9kaWMgc2NoZWR1bGUgc3VwcG9ydCAqLworCXVuc2lnbmVkCQlwZXJpb2RpY19zaXplOworCV9fbGUzMgkJCSpwZXJpb2RpYzsJLyogaHcgcGVyaW9kaWMgdGFibGUgKi8KKwlkbWFfYWRkcl90CQlwZXJpb2RpY19kbWE7CisJdW5zaWduZWQJCWlfdGhyZXNoOwkvKiB1ZnJhbWVzIEhDIG1pZ2h0IGNhY2hlICovCisKKwl1bmlvbiBlaGNpX3NoYWRvdwkqcHNoYWRvdzsJLyogbWlycm9yIGh3IHBlcmlvZGljIHRhYmxlICovCisJaW50CQkJbmV4dF91ZnJhbWU7CS8qIHNjYW4gcGVyaW9kaWMsIHN0YXJ0IGhlcmUgKi8KKwl1bnNpZ25lZAkJcGVyaW9kaWNfc2NoZWQ7CS8qIHBlcmlvZGljIGFjdGl2aXR5IGNvdW50ICovCisKKwkvKiBwZXIgcm9vdCBodWIgcG9ydCAqLworCXVuc2lnbmVkIGxvbmcJCXJlc2V0X2RvbmVbRUhDSV9NQVhfUk9PVF9QT1JUU107CisJLyogYml0IHZlY3RvcnMgKG9uZSBiaXQgcGVyIHBvcnQpICovCisJdW5zaWduZWQgbG9uZwkJYnVzX3N1c3BlbmRlZDsJLyogd2hpY2ggcG9ydHMgd2VyZQorCQkJCQkJICogYWxyZWFkeSBzdXNwZW5kZWQgYXQgdGhlCisJCQkJCQkgKiBzdGFydCBvZiBhIGJ1cyBzdXNwZW5kCisJCQkJCQkgKi8KKwl1bnNpZ25lZCBsb25nCQljb21wYW5pb25fcG9ydHM7Lyogd2hpY2ggcG9ydHMgYXJlIGRlZGljYXRlZAorCQkJCQkJICogdG8gdGhlIGNvbXBhbmlvbiBjb250cm9sbGVyCisJCQkJCQkgKi8KKworCXN0cnVjdCB0aW1lcl9saXN0CXdhdGNoZG9nOworCXVuc2lnbmVkIGxvbmcJCWFjdGlvbnM7CisJdW5zaWduZWQJCXN0YW1wOworCXVuc2lnbmVkIGxvbmcJCW5leHRfc3RhdGVjaGFuZ2U7CisJdTMyCQkJY29tbWFuZDsKKworCS8qIFNJTElDT04gUVVJUktTICovCisJc3RydWN0IGxpc3RfaGVhZAl1cmJfbGlzdDsJLyogdGhpcyBpcyB0aGUgaGVhZCB0byB1cmIKKwkJCQkJCSAqIHF1ZXVlIHRoYXQgZGlkbid0IGdldCBlbm91Z2gKKwkJCQkJCSAqIHJlc291cmNlcworCQkJCQkJICovCisJc3RydWN0IG94dV9tdXJiCQkqbXVyYl9wb29sOwkvKiBtdXJiIHBlciBzcGxpdCBiaWcgdXJiICovCisJdW5zaWduZWQgdXJiX2xlbjsKKworCXU4CQkJc2JybjsJCS8qIHBhY2tlZCByZWxlYXNlIG51bWJlciAqLworfTsKKworI2RlZmluZSBFSENJX0lBQV9KSUZGSUVTCShIWi8xMDApCS8qIGFyYml0cmFyeTsgfjEwIG1zZWMgKi8KKyNkZWZpbmUgRUhDSV9JT19KSUZGSUVTCSAJKEhaLzEwKQkJLyogaW8gd2F0Y2hkb2cgPiBpcnFfdGhyZXNoICovCisjZGVmaW5lIEVIQ0lfQVNZTkNfSklGRklFUyAgICAgIChIWi8yMCkJCS8qIGFzeW5jIGlkbGUgdGltZW91dCAqLworI2RlZmluZSBFSENJX1NIUklOS19KSUZGSUVTICAgICAoSFovMjAwKQkvKiBhc3luYyBxaCB1bmxpbmsgZGVsYXkgKi8KKworZW51bSBlaGNpX3RpbWVyX2FjdGlvbiB7CisJVElNRVJfSU9fV0FUQ0hET0csCisJVElNRVJfSUFBX1dBVENIRE9HLAorCVRJTUVSX0FTWU5DX1NIUklOSywKKwlUSU1FUl9BU1lOQ19PRkYsCit9OworCisjaW5jbHVkZSA8bGludXgvb3h1MjEwaHAuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvcGNpLXF1aXJrcy5jIGIvZHJpdmVycy91c2IvaG9zdC9wY2ktcXVpcmtzLmMKaW5kZXggYWU2ZTcwZS4uNzViNjk4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9wY2ktcXVpcmtzLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9wY2ktcXVpcmtzLmMKQEAgLTE3Miw5ICsxNzIsOSBAQAogCWlmICghbW1pb19yZXNvdXJjZV9lbmFibGVkKHBkZXYsIDApKQogCQlyZXR1cm47CiAKLQliYXNlID0gaW9yZW1hcF9ub2NhY2hlKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSwKLQkJCQkgICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkpOwotCWlmIChiYXNlID09IE5VTEwpIHJldHVybjsKKwliYXNlID0gcGNpX2lvcmVtYXBfYmFyKHBkZXYsIDApOworCWlmIChiYXNlID09IE5VTEwpCisJCXJldHVybjsKIAogLyogT24gUEEtUklTQywgUERDIGNhbiBsZWF2ZSBJUiBzZXQgaW5jb3JyZWN0bHk7IGlnbm9yZSBpdCB0aGVyZS4gKi8KICNpZm5kZWYgX19ocHBhX18KQEAgLTIyMSw5ICsyMjEsOSBAQAogCWlmICghbW1pb19yZXNvdXJjZV9lbmFibGVkKHBkZXYsIDApKQogCQlyZXR1cm47CiAKLQliYXNlID0gaW9yZW1hcF9ub2NhY2hlKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSwKLQkJCQlwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApKTsKLQlpZiAoYmFzZSA9PSBOVUxMKSByZXR1cm47CisJYmFzZSA9IHBjaV9pb3JlbWFwX2JhcihwZGV2LCAwKTsKKwlpZiAoYmFzZSA9PSBOVUxMKQorCQlyZXR1cm47CiAKIAljYXBfbGVuZ3RoID0gcmVhZGIoYmFzZSk7CiAJb3BfcmVnX2Jhc2UgPSBiYXNlICsgY2FwX2xlbmd0aDsKQEAgLTI3MSw3ICsyNzEsNyBAQAogCQkJLyogaWYgYm9vdCBmaXJtd2FyZSBub3cgb3ducyBFSENJLCBzcGluIHRpbGwKIAkJCSAqIGl0IGhhbmRzIGl0IG92ZXIuCiAJCQkgKi8KLQkJCW1zZWMgPSA1MDAwOworCQkJbXNlYyA9IDEwMDA7CiAJCQl3aGlsZSAoKGNhcCAmIEVIQ0lfVVNCTEVHU1VQX0JJT1MpICYmIChtc2VjID4gMCkpIHsKIAkJCQl0cmllZF9oYW5kb2ZmID0gMTsKIAkJCQltc2xlZXAoMTApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9yOGE2NjU5Ny1oY2QuYyBiL2RyaXZlcnMvdXNiL2hvc3QvcjhhNjY1OTctaGNkLmMKaW5kZXggYzIxZjE0ZS4uMzE5MDQxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9yOGE2NjU5Ny1oY2QuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3I4YTY2NTk3LWhjZC5jCkBAIC0yMjc1LDcgKzIyNzUsNiBAQAogCXJldHVybiAwOwogfQogCi0jZGVmaW5lIHJlc291cmNlX2xlbihyKSAoKChyKS0+ZW5kIC0gKHIpLT5zdGFydCkgKyAxKQogc3RhdGljIGludCBfX2luaXQgcjhhNjY1OTdfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKICNpZiBkZWZpbmVkKENPTkZJR19TVVBFUkhfT05fQ0hJUF9SOEE2NjU5NykgJiYgZGVmaW5lZChDT05GSUdfSEFWRV9DTEspCkBAIC0yMjk2LDExICsyMjk1LDEwIEBACiAJCWdvdG8gY2xlYW5fdXA7CiAJfQogCi0JcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwKLQkJCQkJICAgKGNoYXIgKiloY2RfbmFtZSk7CisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlpZiAoIXJlcykgewogCQlyZXQgPSAtRU5PREVWOwotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lIGVycm9yLlxuIik7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInBsYXRmb3JtX2dldF9yZXNvdXJjZSBlcnJvci5cbiIpOwogCQlnb3RvIGNsZWFuX3VwOwogCX0KIApAQCAtMjMxNSw3ICsyMzEzLDcgQEAKIAlpcnEgPSBpcmVzLT5zdGFydDsKIAlpcnFfdHJpZ2dlciA9IGlyZXMtPmZsYWdzICYgSVJRRl9UUklHR0VSX01BU0s7CiAKLQlyZWcgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc291cmNlX2xlbihyZXMpKTsKKwlyZWcgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CiAJaWYgKHJlZyA9PSBOVUxMKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImlvcmVtYXAgZXJyb3IuXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1oY2QuYyBiL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1oY2QuYwppbmRleCBjZjVlNGNmLi40ZTIyMTA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktaGNkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC91aGNpLWhjZC5jCkBAIC05NDIsNiArOTQyLDggQEAKIAogI2lmZGVmCUNPTkZJR19QTQogCS5zdXNwZW5kID0JdXNiX2hjZF9wY2lfc3VzcGVuZCwKKwkuc3VzcGVuZF9sYXRlID0JdXNiX2hjZF9wY2lfc3VzcGVuZF9sYXRlLAorCS5yZXN1bWVfZWFybHkgPQl1c2JfaGNkX3BjaV9yZXN1bWVfZWFybHksCiAJLnJlc3VtZSA9CXVzYl9oY2RfcGNpX3Jlc3VtZSwKICNlbmRpZgkvKiBQTSAqLwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2ltYWdlL21pY3JvdGVrLmMgYi9kcml2ZXJzL3VzYi9pbWFnZS9taWNyb3Rlay5jCmluZGV4IDg4NTg2N2EuLjQ1NDFkZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2ltYWdlL21pY3JvdGVrLmMKKysrIGIvZHJpdmVycy91c2IvaW1hZ2UvbWljcm90ZWsuYwpAQCAtMzUwLDE3ICszNTAsMTYgQEAKIHN0YXRpYyBpbnQgbXRzX3Njc2lfaG9zdF9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIpCiB7CiAJc3RydWN0IG10c19kZXNjKiBkZXNjID0gKHN0cnVjdCBtdHNfZGVzYyopKHNyYi0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YVswXSk7Ci0JaW50IHJlc3VsdCwgcmM7CisJaW50IHJlc3VsdDsKIAogCU1UU19ERUJVR19HT1RfSEVSRSgpOwogCW10c19kZWJ1Z19kdW1wKGRlc2MpOwogCi0JcmMgPSB1c2JfbG9ja19kZXZpY2VfZm9yX3Jlc2V0KGRlc2MtPnVzYl9kZXYsIGRlc2MtPnVzYl9pbnRmKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gRkFJTEVEOwotCXJlc3VsdCA9IHVzYl9yZXNldF9kZXZpY2UoZGVzYy0+dXNiX2Rldik7Ci0JaWYgKHJjKQorCXJlc3VsdCA9IHVzYl9sb2NrX2RldmljZV9mb3JfcmVzZXQoZGVzYy0+dXNiX2RldiwgZGVzYy0+dXNiX2ludGYpOworCWlmIChyZXN1bHQgPT0gMCkgeworCQlyZXN1bHQgPSB1c2JfcmVzZXRfZGV2aWNlKGRlc2MtPnVzYl9kZXYpOwogCQl1c2JfdW5sb2NrX2RldmljZShkZXNjLT51c2JfZGV2KTsKKwl9CiAJcmV0dXJuIHJlc3VsdCA/IEZBSUxFRCA6IFNVQ0NFU1M7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvYmVycnlfY2hhcmdlLmMgYi9kcml2ZXJzL3VzYi9taXNjL2JlcnJ5X2NoYXJnZS5jCmluZGV4IDI0ZTJkYzMuLmMwNWE4NWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvYmVycnlfY2hhcmdlLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9iZXJyeV9jaGFyZ2UuYwpAQCAtMTIzLDYgKzEyMywxMSBAQAogewogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKIAorCWlmICh1ZGV2LT5idXNfbUEgPCA1MDApIHsKKwkJZGJnKCZ1ZGV2LT5kZXYsICJOb3QgZW5vdWdoIHBvd2VyIHRvIGNoYXJnZSBhdmFpbGFibGVcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKIAlkYmcoJnVkZXYtPmRldiwgIlBvd2VyIGlzIHNldCB0byAlZG1BXG4iLAogCSAgICB1ZGV2LT5hY3Rjb25maWctPmRlc2MuYk1heFBvd2VyICogMik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvZW1pMjYuYyBiL2RyaXZlcnMvdXNiL21pc2MvZW1pMjYuYwppbmRleCBlNzYyYmViLi44NzlhOTgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL2VtaTI2LmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9lbWkyNi5jCkBAIC0xNjAsNyArMTYwLDcgQEAKIAkJCWVycigiJXMgLSBlcnJvciBsb2FkaW5nIGZpcm13YXJlOiBlcnJvciA9ICVkIiwgX19mdW5jX18sIGVycik7CiAJCQlnb3RvIHdyYXBlcnI7CiAJCX0KLQl9IHdoaWxlIChpID4gMCk7CisJfSB3aGlsZSAocmVjKTsKIAogCS8qIEFzc2VydCByZXNldCAoc3RvcCB0aGUgQ1BVIGluIHRoZSBFTUkpICovCiAJZXJyID0gZW1pMjZfc2V0X3Jlc2V0KGRldiwxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvdXNidGVzdC5jIGIvZHJpdmVycy91c2IvbWlzYy91c2J0ZXN0LmMKaW5kZXggNDQ0YzY5Yy4uNWYxYTE5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy91c2J0ZXN0LmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy91c2J0ZXN0LmMKQEAgLTE5Miw4ICsxOTIsNiBAQAogewogCXN0cnVjdCB1cmIJCSp1cmI7CiAKLQlpZiAoYnl0ZXMgPCAwKQotCQlyZXR1cm4gTlVMTDsKIAl1cmIgPSB1c2JfYWxsb2NfdXJiICgwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXVyYikKIAkJcmV0dXJuIHVyYjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21vbi9LY29uZmlnIGIvZHJpdmVycy91c2IvbW9uL0tjb25maWcKaW5kZXggZGViOWRkZi4uZjI4ZjM1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbW9uL0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvbW9uL0tjb25maWcKQEAgLTMsMTQgKzMsMTMgQEAKICMKIAogY29uZmlnIFVTQl9NT04KLQlib29sICJVU0IgTW9uaXRvciIKLQlkZXBlbmRzIG9uIFVTQiE9bgotCWRlZmF1bHQgeQorCXRyaXN0YXRlICJVU0IgTW9uaXRvciIKKwlkZXBlbmRzIG9uIFVTQgorCWRlZmF1bHQgeSBpZiBVU0I9eQorCWRlZmF1bHQgbSBpZiBVU0I9bQogCWhlbHAKLQkgIElmIHlvdSBzYXkgWSBoZXJlLCBhIGNvbXBvbmVudCB3aGljaCBjYXB0dXJlcyB0aGUgVVNCIHRyYWZmaWMKKwkgIElmIHlvdSBzZWxlY3QgdGhpcyBvcHRpb24sIGEgY29tcG9uZW50IHdoaWNoIGNhcHR1cmVzIHRoZSBVU0IgdHJhZmZpYwogCSAgYmV0d2VlbiBwZXJpcGhlcmFsLXNwZWNpZmljIGRyaXZlcnMgYW5kIEhDIGRyaXZlcnMgd2lsbCBiZSBidWlsdC4KIAkgIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi91c2IvdXNibW9uLnR4dD4uCiAKLQkgIFRoaXMgaXMgc29tZXdoYXQgZXhwZXJpbWVudGFsIGF0IHRoaXMgdGltZSwgYnV0IGl0IHNob3VsZCBiZSBzYWZlLgotCi0JICBJZiB1bnN1cmUsIHNheSBZLgorCSAgSWYgdW5zdXJlLCBzYXkgWSAoaWYgYWxsb3dlZCksIG90aGVyd2lzZSBNLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbW9uL01ha2VmaWxlIGIvZHJpdmVycy91c2IvbW9uL01ha2VmaWxlCmluZGV4IDBmNzZlZDUuLmM2NTE2YjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21vbi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9tb24vTWFrZWZpbGUKQEAgLTQsNSArNCw0IEBACiAKIHVzYm1vbi1vYmpzCTo9IG1vbl9tYWluLm8gbW9uX3N0YXQubyBtb25fdGV4dC5vIG1vbl9iaW4ubyBtb25fZG1hLm8KIAotIyBUaGlzIGRvZXMgbm90IHVzZSBDT05GSUdfVVNCX01PTiBiZWNhdXNlIHdlIHdhbnQgdGhpcyB0byB1c2UgYSB0cmlzdGF0ZS4KLW9iai0kKENPTkZJR19VU0IpCSs9IHVzYm1vbi5vCitvYmotJChDT05GSUdfVVNCX01PTikJKz0gdXNibW9uLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL211c2IvS2NvbmZpZwppbmRleCA0Yjk1NDJiLi41YWY3Mzc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvbXVzYi9LY29uZmlnCkBAIC0xMSw3ICsxMSw3IEBACiAJZGVwZW5kcyBvbiAoVVNCIHx8IFVTQl9HQURHRVQpICYmIEhBVkVfQ0xLCiAJZGVwZW5kcyBvbiAhU1VQRVJICiAJc2VsZWN0IFRXTDQwMzBfVVNCIGlmIE1BQ0hfT01BUF8zNDMwU0RQCi0JdHJpc3RhdGUgJ0ludmVudHJhIEhpZ2hzcGVlZCBEdWFsIFJvbGUgQ29udHJvbGxlciAoVEksIC4uLiknCisJdHJpc3RhdGUgJ0ludmVudHJhIEhpZ2hzcGVlZCBEdWFsIFJvbGUgQ29udHJvbGxlciAoVEksIEFESSwgLi4uKScKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdXIgc3lzdGVtIGhhcyBhIGR1YWwgcm9sZSBoaWdoIHNwZWVkIFVTQgogCSAgY29udHJvbGxlciBiYXNlZCBvbiB0aGUgTWVudG9yIEdyYXBoaWNzIHNpbGljb24gSVAuICBUaGVuCkBAIC0yMiw2ICsyMiw5IEBACiAJICBUZXhhcyBJbnN0cnVtZW50cyBwYXJ0cyB1c2luZyB0aGlzIElQIGluY2x1ZGUgRGFWaW5jaSA2NDR4LAogCSAgT01BUCAyNDN4LCBPTUFQIDM0M3gsIGFuZCBUVVNCIDYwMTAuCiAKKwkgIEFuYWxvZyBEZXZpY2VzIHBhcnRzIHVzaW5nIHRoaXMgSVAgaW5jbHVkZSBCbGFja2ZpbiBCRjU0eCwKKwkgIEJGNTI1IGFuZCBCRjUyNy4KKwogCSAgSWYgeW91IGRvIG5vdCBrbm93IHdoYXQgdGhpcyBpcywgcGxlYXNlIHNheSBOLgogCiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOyB0aGUKQEAgLTMzLDYgKzM2LDggQEAKIAlkZWZhdWx0IHkgaWYgQVJDSF9EQVZJTkNJCiAJZGVmYXVsdCB5IGlmIEFSQ0hfT01BUDI0MzAKIAlkZWZhdWx0IHkgaWYgQVJDSF9PTUFQMzRYWAorCWRlZmF1bHQgeSBpZiAoQkY1NHggJiYgIUJGNTQ0KQorCWRlZmF1bHQgeSBpZiAoQkY1MnggJiYgIUJGNTIyICYmICFCRjUyMykKIAogY29tbWVudCAiRGFWaW5jaSA2NDR4IFVTQiBzdXBwb3J0IgogCWRlcGVuZHMgb24gVVNCX01VU0JfSERSQyAmJiBBUkNIX0RBVklOQ0kKQEAgLTQzLDYgKzQ4LDkgQEAKIGNvbW1lbnQgIk9NQVAgMzQzeCBoaWdoIHNwZWVkIFVTQiBzdXBwb3J0IgogCWRlcGVuZHMgb24gVVNCX01VU0JfSERSQyAmJiBBUkNIX09NQVAzNFhYCiAKK2NvbW1lbnQgIkJsYWNrZmluIGhpZ2ggc3BlZWQgVVNCIFN1cHBvcnQiCisJZGVwZW5kcyBvbiBVU0JfTVVTQl9IRFJDICYmIChCRjU0eCAmJiAhQkY1NDQpIHx8IChCRjUyeCAmJiAhQkY1MjIgJiYgIUJGNTIzKQorCiBjb25maWcgVVNCX1RVU0I2MDEwCiAJYm9vbGVhbiAiVFVTQiA2MDEwIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBVU0JfTVVTQl9IRFJDICYmICFVU0JfTVVTQl9TT0MKQEAgLTE0Miw3ICsxNTAsNyBAQAogY29uZmlnIFVTQl9JTlZFTlRSQV9ETUEKIAlib29sCiAJZGVwZW5kcyBvbiBVU0JfTVVTQl9IRFJDICYmICFNVVNCX1BJT19PTkxZCi0JZGVmYXVsdCBBUkNIX09NQVAyNDMwIHx8IEFSQ0hfT01BUDM0WFgKKwlkZWZhdWx0IEFSQ0hfT01BUDI0MzAgfHwgQVJDSF9PTUFQMzRYWCB8fCBCTEFDS0ZJTgogCWhlbHAKIAkgIEVuYWJsZSBETUEgdHJhbnNmZXJzIHVzaW5nIE1lbnRvcidzIGVuZ2luZS4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL211c2IvTWFrZWZpbGUKaW5kZXggYjZhZjBkNi4uODU3MTBjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9tdXNiL01ha2VmaWxlCkBAIC0yMiw2ICsyMiwxNCBAQAogCW11c2JfaGRyYy1vYmpzCSs9IG9tYXAyNDMwLm8KIGVuZGlmCiAKK2lmZXEgKCQoQ09ORklHX0JGNTR4KSx5KQorCW11c2JfaGRyYy1vYmpzCSs9IGJsYWNrZmluLm8KK2VuZGlmCisKK2lmZXEgKCQoQ09ORklHX0JGNTJ4KSx5KQorCW11c2JfaGRyYy1vYmpzCSs9IGJsYWNrZmluLm8KK2VuZGlmCisKIGlmZXEgKCQoQ09ORklHX1VTQl9HQURHRVRfTVVTQl9IRFJDKSx5KQogCW11c2JfaGRyYy1vYmpzCQkrPSBtdXNiX2dhZGdldF9lcDAubyBtdXNiX2dhZGdldC5vCiBlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9ibGFja2Zpbi5jIGIvZHJpdmVycy91c2IvbXVzYi9ibGFja2Zpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NjEzNDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9tdXNiL2JsYWNrZmluLmMKQEAgLTAsMCArMSwzMjAgQEAKKy8qCisgKiBNVVNCIE9URyBjb250cm9sbGVyIGRyaXZlciBmb3IgQmxhY2tmaW4gUHJvY2Vzc29ycworICoKKyAqIENvcHlyaWdodCAyMDA2LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisKKyNpbmNsdWRlICJtdXNiX2NvcmUuaCIKKyNpbmNsdWRlICJibGFja2Zpbi5oIgorCisvKgorICogTG9hZCBhbiBlbmRwb2ludCdzIEZJRk8KKyAqLwordm9pZCBtdXNiX3dyaXRlX2ZpZm8oc3RydWN0IG11c2JfaHdfZXAgKmh3X2VwLCB1MTYgbGVuLCBjb25zdCB1OCAqc3JjKQoreworCXZvaWQgX19pb21lbSAqZmlmbyA9IGh3X2VwLT5maWZvOworCXZvaWQgX19pb21lbSAqZXBpbyA9IGh3X2VwLT5yZWdzOworCisJcHJlZmV0Y2goKHU4ICopc3JjKTsKKworCW11c2Jfd3JpdGV3KGVwaW8sIE1VU0JfVFhDT1VOVCwgbGVuKTsKKworCURCRyg0LCAiVFggZXAlZCBmaWZvICVwIGNvdW50ICVkIGJ1ZiAlcCwgZXBpbyAlcFxuIiwKKwkJCWh3X2VwLT5lcG51bSwgZmlmbywgbGVuLCBzcmMsIGVwaW8pOworCisJZHVtcF9maWZvX2RhdGEoc3JjLCBsZW4pOworCisJaWYgKHVubGlrZWx5KCh1bnNpZ25lZCBsb25nKXNyYyAmIDB4MDEpKQorCQlvdXRzd184KCh1bnNpZ25lZCBsb25nKWZpZm8sIHNyYywKKwkJCWxlbiAmIDB4MDEgPyAobGVuID4+IDEpICsgMSA6IGxlbiA+PiAxKTsKKwllbHNlCisJCW91dHN3KCh1bnNpZ25lZCBsb25nKWZpZm8sIHNyYywKKwkJCWxlbiAmIDB4MDEgPyAobGVuID4+IDEpICsgMSA6IGxlbiA+PiAxKTsKK30KKworLyoKKyAqIFVubG9hZCBhbiBlbmRwb2ludCdzIEZJRk8KKyAqLwordm9pZCBtdXNiX3JlYWRfZmlmbyhzdHJ1Y3QgbXVzYl9od19lcCAqaHdfZXAsIHUxNiBsZW4sIHU4ICpkc3QpCit7CisJdm9pZCBfX2lvbWVtICpmaWZvID0gaHdfZXAtPmZpZm87CisJdTggZXBudW0gPSBod19lcC0+ZXBudW07CisJdTE2IGRtYV9yZWcgPSAwOworCisJREJHKDQsICIlY1ggZXAlZCBmaWZvICVwIGNvdW50ICVkIGJ1ZiAlcFxuIiwKKwkJCSdSJywgaHdfZXAtPmVwbnVtLCBmaWZvLCBsZW4sIGRzdCk7CisKKyNpZmRlZiBDT05GSUdfQkY1MngKKwlpbnZhbGlkYXRlX2RjYWNoZV9yYW5nZSgodW5zaWduZWQgaW50KWRzdCwKKwkJKHVuc2lnbmVkIGludCkoZHN0ICsgbGVuKSk7CisKKwkvKiBTZXR1cCBETUEgYWRkcmVzcyByZWdpc3RlciAqLworCWRtYV9yZWcgPSAodTE2KSAoKHUzMikgZHN0ICYgMHhGRkZGKTsKKwliZmluX3dyaXRlMTYoVVNCX0RNQV9SRUcoZXBudW0sIFVTQl9ETUF4X0FERFJfTE9XKSwgZG1hX3JlZyk7CisJU1NZTkMoKTsKKworCWRtYV9yZWcgPSAodTE2KSAoKCh1MzIpIGRzdCA+PiAxNikgJiAweEZGRkYpOworCWJmaW5fd3JpdGUxNihVU0JfRE1BX1JFRyhlcG51bSwgVVNCX0RNQXhfQUREUl9ISUdIKSwgZG1hX3JlZyk7CisJU1NZTkMoKTsKKworCS8qIFNldHVwIERNQSBjb3VudCByZWdpc3RlciAqLworCWJmaW5fd3JpdGUxNihVU0JfRE1BX1JFRyhlcG51bSwgVVNCX0RNQXhfQ09VTlRfTE9XKSwgbGVuKTsKKwliZmluX3dyaXRlMTYoVVNCX0RNQV9SRUcoZXBudW0sIFVTQl9ETUF4X0NPVU5UX0hJR0gpLCAwKTsKKwlTU1lOQygpOworCisJLyogRW5hYmxlIHRoZSBETUEgKi8KKwlkbWFfcmVnID0gKGVwbnVtIDw8IDQpIHwgRE1BX0VOQSB8IElOVF9FTkE7CisJYmZpbl93cml0ZTE2KFVTQl9ETUFfUkVHKGVwbnVtLCBVU0JfRE1BeF9DVFJMKSwgZG1hX3JlZyk7CisJU1NZTkMoKTsKKworCS8qIFdhaXQgZm9yIGNvbXBlbGV0ZSAqLworCXdoaWxlICghKGJmaW5fcmVhZF9VU0JfRE1BX0lOVEVSUlVQVCgpICYgKDEgPDwgZXBudW0pKSkKKwkJY3B1X3JlbGF4KCk7CisKKwkvKiBhY2tub3dsZWRnZSBkbWEgaW50ZXJydXB0ICovCisJYmZpbl93cml0ZV9VU0JfRE1BX0lOVEVSUlVQVCgxIDw8IGVwbnVtKTsKKwlTU1lOQygpOworCisJLyogUmVzZXQgRE1BICovCisJYmZpbl93cml0ZTE2KFVTQl9ETUFfUkVHKGVwbnVtLCBVU0JfRE1BeF9DVFJMKSwgMCk7CisJU1NZTkMoKTsKKyNlbHNlCisJaWYgKHVubGlrZWx5KCh1bnNpZ25lZCBsb25nKWRzdCAmIDB4MDEpKQorCQlpbnN3XzgoKHVuc2lnbmVkIGxvbmcpZmlmbywgZHN0LAorCQkJbGVuICYgMHgwMSA/IChsZW4gPj4gMSkgKyAxIDogbGVuID4+IDEpOworCWVsc2UKKwkJaW5zdygodW5zaWduZWQgbG9uZylmaWZvLCBkc3QsCisJCQlsZW4gJiAweDAxID8gKGxlbiA+PiAxKSArIDEgOiBsZW4gPj4gMSk7CisjZW5kaWYKKworCWR1bXBfZmlmb19kYXRhKGRzdCwgbGVuKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGJsYWNrZmluX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpfX2hjaSkKK3sKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCWlycXJldHVybl90CXJldHZhbCA9IElSUV9OT05FOworCXN0cnVjdCBtdXNiCSptdXNiID0gX19oY2k7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXVzYi0+bG9jaywgZmxhZ3MpOworCisJbXVzYi0+aW50X3VzYiA9IG11c2JfcmVhZGIobXVzYi0+bXJlZ3MsIE1VU0JfSU5UUlVTQik7CisJbXVzYi0+aW50X3R4ID0gbXVzYl9yZWFkdyhtdXNiLT5tcmVncywgTVVTQl9JTlRSVFgpOworCW11c2ItPmludF9yeCA9IG11c2JfcmVhZHcobXVzYi0+bXJlZ3MsIE1VU0JfSU5UUlJYKTsKKworCWlmIChtdXNiLT5pbnRfdXNiIHx8IG11c2ItPmludF90eCB8fCBtdXNiLT5pbnRfcngpIHsKKwkJbXVzYl93cml0ZWIobXVzYi0+bXJlZ3MsIE1VU0JfSU5UUlVTQiwgbXVzYi0+aW50X3VzYik7CisJCW11c2Jfd3JpdGV3KG11c2ItPm1yZWdzLCBNVVNCX0lOVFJUWCwgbXVzYi0+aW50X3R4KTsKKwkJbXVzYl93cml0ZXcobXVzYi0+bXJlZ3MsIE1VU0JfSU5UUlJYLCBtdXNiLT5pbnRfcngpOworCQlyZXR2YWwgPSBtdXNiX2ludGVycnVwdChtdXNiKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtdXNiLT5sb2NrLCBmbGFncyk7CisKKwkvKiBSRVZJU0lUIHdlIHNvbWV0aW1lcyBnZXQgc3B1cmlvdXMgSVJRcyBvbiBnX2VwMAorCSAqIG5vdCBjbGVhciB3aHkuLi4gZmFsbCBpbiBCRjU0eCB0b28uCisJICovCisJaWYgKHJldHZhbCAhPSBJUlFfSEFORExFRCkKKwkJREJHKDUsICJzcHVyaW91cz9cbiIpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBtdXNiX2Nvbm5fdGltZXJfaGFuZGxlcih1bnNpZ25lZCBsb25nIF9tdXNiKQoreworCXN0cnVjdCBtdXNiICptdXNiID0gKHZvaWQgKilfbXVzYjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUxNiB2YWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXVzYi0+bG9jaywgZmxhZ3MpOworCXN3aXRjaCAobXVzYi0+eGNlaXYuc3RhdGUpIHsKKwljYXNlIE9UR19TVEFURV9BX0lETEU6CisJY2FzZSBPVEdfU1RBVEVfQV9XQUlUX0JDT046CisJCS8qIFN0YXJ0IGEgbmV3IHNlc3Npb24gKi8KKwkJdmFsID0gbXVzYl9yZWFkdyhtdXNiLT5tcmVncywgTVVTQl9ERVZDVEwpOworCQl2YWwgfD0gTVVTQl9ERVZDVExfU0VTU0lPTjsKKwkJbXVzYl93cml0ZXcobXVzYi0+bXJlZ3MsIE1VU0JfREVWQ1RMLCB2YWwpOworCisJCXZhbCA9IG11c2JfcmVhZHcobXVzYi0+bXJlZ3MsIE1VU0JfREVWQ1RMKTsKKwkJaWYgKCEodmFsICYgTVVTQl9ERVZDVExfQkRFVklDRSkpIHsKKwkJCWdwaW9fc2V0X3ZhbHVlKG11c2ItPmNvbmZpZy0+Z3Bpb192cnNlbCwgMSk7CisJCQltdXNiLT54Y2Vpdi5zdGF0ZSA9IE9UR19TVEFURV9BX1dBSVRfQkNPTjsKKwkJfSBlbHNlIHsKKwkJCWdwaW9fc2V0X3ZhbHVlKG11c2ItPmNvbmZpZy0+Z3Bpb192cnNlbCwgMCk7CisKKwkJCS8qIElnbm9yZSBWQlVTRVJST1IgYW5kIFNVU1BFTkQgSVJRICovCisJCQl2YWwgPSBtdXNiX3JlYWRiKG11c2ItPm1yZWdzLCBNVVNCX0lOVFJVU0JFKTsKKwkJCXZhbCAmPSB+TVVTQl9JTlRSX1ZCVVNFUlJPUjsKKwkJCW11c2Jfd3JpdGViKG11c2ItPm1yZWdzLCBNVVNCX0lOVFJVU0JFLCB2YWwpOworCisJCQl2YWwgPSBNVVNCX0lOVFJfU1VTUEVORCB8IE1VU0JfSU5UUl9WQlVTRVJST1I7CisJCQltdXNiX3dyaXRlYihtdXNiLT5tcmVncywgTVVTQl9JTlRSVVNCLCB2YWwpOworCisJCQl2YWwgPSBNVVNCX1BPV0VSX0hTRU5BQjsKKwkJCW11c2Jfd3JpdGViKG11c2ItPm1yZWdzLCBNVVNCX1BPV0VSLCB2YWwpOworCQl9CisJCW1vZF90aW1lcigmbXVzYl9jb25uX3RpbWVyLCBqaWZmaWVzICsgVElNRVJfREVMQVkpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCURCRygxLCAiJXMgc3RhdGUgbm90IGhhbmRsZWRcbiIsIG90Z19zdGF0ZV9zdHJpbmcobXVzYikpOworCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXVzYi0+bG9jaywgZmxhZ3MpOworCisJREJHKDQsICJzdGF0ZSBpcyAlc1xuIiwgb3RnX3N0YXRlX3N0cmluZyhtdXNiKSk7Cit9CisKK3ZvaWQgbXVzYl9wbGF0Zm9ybV9lbmFibGUoc3RydWN0IG11c2IgKm11c2IpCit7CisJaWYgKGlzX2hvc3RfZW5hYmxlZChtdXNiKSkgeworCQltb2RfdGltZXIoJm11c2JfY29ubl90aW1lciwgamlmZmllcyArIFRJTUVSX0RFTEFZKTsKKwkJbXVzYi0+YV93YWl0X2Jjb24gPSBUSU1FUl9ERUxBWTsKKwl9Cit9CisKK3ZvaWQgbXVzYl9wbGF0Zm9ybV9kaXNhYmxlKHN0cnVjdCBtdXNiICptdXNiKQoreworfQorCitzdGF0aWMgdm9pZCBiZmluX3ZidXNfcG93ZXIoc3RydWN0IG11c2IgKm11c2IsIGludCBpc19vbiwgaW50IHNsZWVwaW5nKQoreworfQorCitzdGF0aWMgdm9pZCBiZmluX3NldF92YnVzKHN0cnVjdCBtdXNiICptdXNiLCBpbnQgaXNfb24pCit7CisJaWYgKGlzX29uKQorCQlncGlvX3NldF92YWx1ZShtdXNiLT5jb25maWctPmdwaW9fdnJzZWwsIDEpOworCWVsc2UKKwkJZ3Bpb19zZXRfdmFsdWUobXVzYi0+Y29uZmlnLT5ncGlvX3Zyc2VsLCAwKTsKKworCURCRygxLCAiVkJVUyAlcywgZGV2Y3RsICUwMnggIgorCQkvKiBvdGcgJTN4IGNvbmYgJTA4eCBwcmNtICUwOHggKi8gIlxuIiwKKwkJb3RnX3N0YXRlX3N0cmluZyhtdXNiKSwKKwkJbXVzYl9yZWFkYihtdXNiLT5tcmVncywgTVVTQl9ERVZDVEwpKTsKK30KKworc3RhdGljIGludCBiZmluX3NldF9wb3dlcihzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyICp4LCB1bnNpZ25lZCBtQSkKK3sKKwlyZXR1cm4gMDsKK30KKwordm9pZCBtdXNiX3BsYXRmb3JtX3RyeV9pZGxlKHN0cnVjdCBtdXNiICptdXNiLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCit7CisJaWYgKGlzX2hvc3RfZW5hYmxlZChtdXNiKSkKKwkJbW9kX3RpbWVyKCZtdXNiX2Nvbm5fdGltZXIsIGppZmZpZXMgKyBUSU1FUl9ERUxBWSk7Cit9CisKK2ludCBtdXNiX3BsYXRmb3JtX2dldF92YnVzX3N0YXR1cyhzdHJ1Y3QgbXVzYiAqbXVzYikKK3sKKwlyZXR1cm4gMDsKK30KKwordm9pZCBtdXNiX3BsYXRmb3JtX3NldF9tb2RlKHN0cnVjdCBtdXNiICptdXNiLCB1OCBtdXNiX21vZGUpCit7Cit9CisKK2ludCBfX2luaXQgbXVzYl9wbGF0Zm9ybV9pbml0KHN0cnVjdCBtdXNiICptdXNiKQoreworCisJLyoKKwkgKiBSZXYgMS4wIEJGNTQ5IEVaLUtJVHMgcmVxdWlyZSBQRTcgdG8gYmUgaGlnaCBmb3IgYm90aCBERVZJQ0UKKwkgKiBhbmQgT1RHIEhPU1QgbW9kZXMsIHdoaWxlIHJldiAxLjEgYW5kIGdyZWF0ZXIgcmVxdWlyZSBQRTcgdG8KKwkgKiBiZSBsb3cgZm9yIERFVklDRSBtb2RlIGFuZCBoaWdoIGZvciBIT1NUIG1vZGUuIFdlIHNldCBpdCBoaWdoCisJICogaGVyZSBiZWNhdXNlIHdlIGFyZSBpbiBob3N0IG1vZGUKKwkgKi8KKworCWlmIChncGlvX3JlcXVlc3QobXVzYi0+Y29uZmlnLT5ncGlvX3Zyc2VsLCAiVVNCX1ZSU0VMIikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgcm8gcmVxdWVzdCBVU0JfVlJTRUwgR1BJT18lZCBcbiIsCisJCQltdXNiLT5jb25maWctPmdwaW9fdnJzZWwpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KG11c2ItPmNvbmZpZy0+Z3Bpb192cnNlbCwgMCk7CisKKwlpZiAoQU5PTUFMWV8wNTAwMDM0NikgeworCQliZmluX3dyaXRlX1VTQl9BUEhZX0NBTElCKEFOT01BTFlfMDUwMDAzNDZfdmFsdWUpOworCQlTU1lOQygpOworCX0KKworCWlmIChBTk9NQUxZXzA1MDAwMzQ3KSB7CisJCWJmaW5fd3JpdGVfVVNCX0FQSFlfQ05UUkwoMHgwKTsKKwkJU1NZTkMoKTsKKwl9CisKKwkvKiBUT0RPCisJICogU2V0IFNJQy1JVkcgcmVnaXN0ZXIKKwkgKi8KKworCS8qIENvbmZpZ3VyZSBQTEwgb3NjaWxsYXRvciByZWdpc3RlciAqLworCWJmaW5fd3JpdGVfVVNCX1BMTE9TQ19DVFJMKDB4MzBhOCk7CisJU1NZTkMoKTsKKworCWJmaW5fd3JpdGVfVVNCX1NSUF9DTEtESVYoKGdldF9zY2xrKCkvMTAwMCkgLyAzMiAtIDEpOworCVNTWU5DKCk7CisKKwliZmluX3dyaXRlX1VTQl9FUF9OSTBfUlhNQVhQKDY0KTsKKwlTU1lOQygpOworCisJYmZpbl93cml0ZV9VU0JfRVBfTkkwX1RYTUFYUCg2NCk7CisJU1NZTkMoKTsKKworCS8qIFJvdXRlIElOVFJVU0IvSU5UUl9SWC9JTlRSX1RYIHRvIFVTQl9JTlQwKi8KKwliZmluX3dyaXRlX1VTQl9HTE9CSU5UUigweDcpOworCVNTWU5DKCk7CisKKwliZmluX3dyaXRlX1VTQl9HTE9CQUxfQ1RMKEdMT0JBTF9FTkEgfCBFUDFfVFhfRU5BIHwgRVAyX1RYX0VOQSB8CisJCQkJRVAzX1RYX0VOQSB8IEVQNF9UWF9FTkEgfCBFUDVfVFhfRU5BIHwKKwkJCQlFUDZfVFhfRU5BIHwgRVA3X1RYX0VOQSB8IEVQMV9SWF9FTkEgfAorCQkJCUVQMl9SWF9FTkEgfCBFUDNfUlhfRU5BIHwgRVA0X1JYX0VOQSB8CisJCQkJRVA1X1JYX0VOQSB8IEVQNl9SWF9FTkEgfCBFUDdfUlhfRU5BKTsKKwlTU1lOQygpOworCisJaWYgKGlzX2hvc3RfZW5hYmxlZChtdXNiKSkgeworCQltdXNiLT5ib2FyZF9zZXRfdmJ1cyA9IGJmaW5fc2V0X3ZidXM7CisJCXNldHVwX3RpbWVyKCZtdXNiX2Nvbm5fdGltZXIsCisJCQltdXNiX2Nvbm5fdGltZXJfaGFuZGxlciwgKHVuc2lnbmVkIGxvbmcpIG11c2IpOworCX0KKwlpZiAoaXNfcGVyaXBoZXJhbF9lbmFibGVkKG11c2IpKQorCQltdXNiLT54Y2Vpdi5zZXRfcG93ZXIgPSBiZmluX3NldF9wb3dlcjsKKworCW11c2ItPmlzciA9IGJsYWNrZmluX2ludGVycnVwdDsKKworCXJldHVybiAwOworfQorCitpbnQgbXVzYl9wbGF0Zm9ybV9zdXNwZW5kKHN0cnVjdCBtdXNiICptdXNiKQoreworCXJldHVybiAwOworfQorCitpbnQgbXVzYl9wbGF0Zm9ybV9yZXN1bWUoc3RydWN0IG11c2IgKm11c2IpCit7CisJcmV0dXJuIDA7Cit9CisKKworaW50IG11c2JfcGxhdGZvcm1fZXhpdChzdHJ1Y3QgbXVzYiAqbXVzYikKK3sKKworCWJmaW5fdmJ1c19wb3dlcihtdXNiLCAwIC8qb2ZmKi8sIDEpOworCWdwaW9fZnJlZShtdXNiLT5jb25maWctPmdwaW9fdnJzZWwpOworCW11c2JfcGxhdGZvcm1fc3VzcGVuZChtdXNiKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9ibGFja2Zpbi5oIGIvZHJpdmVycy91c2IvbXVzYi9ibGFja2Zpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNDBjMWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9tdXNiL2JsYWNrZmluLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBieSBBbmFsb2cgRGV2aWNlcywgSW5jLgorICoKKyAqIFRoZSBJbnZlbnRyYSBDb250cm9sbGVyIERyaXZlciBmb3IgTGludXggaXMgZnJlZSBzb2Z0d2FyZTsgeW91CisgKiBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fTVVTQl9CTEFDS0ZJTl9IX18KKyNkZWZpbmUgX19NVVNCX0JMQUNLRklOX0hfXworCisvKgorICogQmxhY2tmaW4gc3BlY2lmaWMgZGVmaW5pdGlvbnMKKyAqLworCisjdW5kZWYgRFVNUF9GSUZPX0RBVEEKKyNpZmRlZiBEVU1QX0ZJRk9fREFUQQorc3RhdGljIHZvaWQgZHVtcF9maWZvX2RhdGEodTggKmJ1ZiwgdTE2IGxlbikKK3sKKwl1OCAqdG1wID0gYnVmOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWlmICghKGkgJSAxNikgJiYgaSkKKwkJCXByX2RlYnVnKCJcbiIpOworCQlwcl9kZWJ1ZygiJTAyeCAiLCAqdG1wKyspOworCX0KKwlwcl9kZWJ1ZygiXG4iKTsKK30KKyNlbHNlCisjZGVmaW5lIGR1bXBfZmlmb19kYXRhKGJ1ZiwgbGVuKQlkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0JGNTJ4CisKKyNkZWZpbmUgVVNCX0RNQV9CQVNFCQlVU0JfRE1BX0lOVEVSUlVQVAorI2RlZmluZSBVU0JfRE1BeF9DVFJMCQkweDA0CisjZGVmaW5lIFVTQl9ETUF4X0FERFJfTE9XCTB4MDgKKyNkZWZpbmUgVVNCX0RNQXhfQUREUl9ISUdICTB4MEMKKyNkZWZpbmUgVVNCX0RNQXhfQ09VTlRfTE9XCTB4MTAKKyNkZWZpbmUgVVNCX0RNQXhfQ09VTlRfSElHSAkweDE0CisKKyNkZWZpbmUgVVNCX0RNQV9SRUcoZXAsIHJlZykJKFVTQl9ETUFfQkFTRSArIDB4MjAgKiBlcCArIHJlZykKKyNlbmRpZgorCisvKiBBbG1vc3QgMSBzZWNvbmQgKi8KKyNkZWZpbmUgVElNRVJfREVMQVkJKDEgKiBIWikKKworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IG11c2JfY29ubl90aW1lcjsKKworI2VuZGlmCS8qIF9fTVVTQl9CTEFDS0ZJTl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvZGF2aW5jaS5jIGIvZHJpdmVycy91c2IvbXVzYi9kYXZpbmNpLmMKaW5kZXggZGZiM2JjYi4uMGQ1NjZkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9kYXZpbmNpLmMKKysrIGIvZHJpdmVycy91c2IvbXVzYi9kYXZpbmNpLmMKQEAgLTMyLDkgKzMyLDkgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KIAotI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvbWVtb3J5Lmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgorI2luY2x1ZGUgPG1hY2gvYXJjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvYXJjaC9tZW1vcnkuaD4KKyNpbmNsdWRlIDxtYWNoL2FyY2gvZ3Bpby5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKICNpbmNsdWRlICJtdXNiX2NvcmUuaCIKQEAgLTM2NCw2ICszNjQsMTggQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKK2ludCBtdXNiX3BsYXRmb3JtX3NldF9tb2RlKHN0cnVjdCBtdXNiICptdXNiLCB1OCBtb2RlKQoreworCS8qIEVWTSBjYW4ndCBkbyB0aGlzIChyaWdodD8pICovCisJcmV0dXJuIC1FSU87Cit9CisKK2ludCBtdXNiX3BsYXRmb3JtX3NldF9tb2RlKHN0cnVjdCBtdXNiICptdXNiLCB1OCBtb2RlKQoreworICAgICAgIC8qIEVWTSBjYW4ndCBkbyB0aGlzIChyaWdodD8pICovCisgICAgICAgcmV0dXJuIC1FSU87Cit9CisKIGludCBfX2luaXQgbXVzYl9wbGF0Zm9ybV9pbml0KHN0cnVjdCBtdXNiICptdXNiKQogewogCXZvaWQgX19pb21lbQkqdGliYXNlID0gbXVzYi0+Y3RybF9iYXNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuYyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmMKaW5kZXggNTI4MGRiYS4uNmM3ZmFhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5jCkBAIC0xNDgsNyArMTQ4LDggQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotI2lmbmRlZiBDT05GSUdfVVNCX1RVU0I2MDEwCisjaWYgIWRlZmluZWQoQ09ORklHX1VTQl9UVVNCNjAxMCkgJiYgIWRlZmluZWQoQ09ORklHX0JMQUNLRklOKQorCiAvKgogICogTG9hZCBhbiBlbmRwb2ludCdzIEZJRk8KICAqLwpAQCAtMTEyNCwyNSArMTEyNSwyNSBAQAogI2VuZGlmCiAJc3dpdGNoIChjZmctPnN0eWxlKSB7CiAJY2FzZSBGSUZPX1RYOgotCQltdXNiX3dyaXRlYihtYmFzZSwgTVVTQl9UWEZJRk9TWiwgY19zaXplKTsKLQkJbXVzYl93cml0ZXcobWJhc2UsIE1VU0JfVFhGSUZPQURELCBjX29mZik7CisJCW11c2Jfd3JpdGVfdHhmaWZvc3oobWJhc2UsIGNfc2l6ZSk7CisJCW11c2Jfd3JpdGVfdHhmaWZvYWRkKG1iYXNlLCBjX29mZik7CiAJCWh3X2VwLT50eF9kb3VibGVfYnVmZmVyZWQgPSAhIShjX3NpemUgJiBNVVNCX0ZJRk9TWl9EUEIpOwogCQlod19lcC0+bWF4X3BhY2tldF9zel90eCA9IG1heHBhY2tldDsKIAkJYnJlYWs7CiAJY2FzZSBGSUZPX1JYOgotCQltdXNiX3dyaXRlYihtYmFzZSwgTVVTQl9SWEZJRk9TWiwgY19zaXplKTsKLQkJbXVzYl93cml0ZXcobWJhc2UsIE1VU0JfUlhGSUZPQURELCBjX29mZik7CisJCW11c2Jfd3JpdGVfcnhmaWZvc3oobWJhc2UsIGNfc2l6ZSk7CisJCW11c2Jfd3JpdGVfcnhmaWZvYWRkKG1iYXNlLCBjX29mZik7CiAJCWh3X2VwLT5yeF9kb3VibGVfYnVmZmVyZWQgPSAhIShjX3NpemUgJiBNVVNCX0ZJRk9TWl9EUEIpOwogCQlod19lcC0+bWF4X3BhY2tldF9zel9yeCA9IG1heHBhY2tldDsKIAkJYnJlYWs7CiAJY2FzZSBGSUZPX1JYVFg6Ci0JCW11c2Jfd3JpdGViKG1iYXNlLCBNVVNCX1RYRklGT1NaLCBjX3NpemUpOwotCQltdXNiX3dyaXRldyhtYmFzZSwgTVVTQl9UWEZJRk9BREQsIGNfb2ZmKTsKKwkJbXVzYl93cml0ZV90eGZpZm9zeihtYmFzZSwgY19zaXplKTsKKwkJbXVzYl93cml0ZV90eGZpZm9hZGQobWJhc2UsIGNfb2ZmKTsKIAkJaHdfZXAtPnJ4X2RvdWJsZV9idWZmZXJlZCA9ICEhKGNfc2l6ZSAmIE1VU0JfRklGT1NaX0RQQik7CiAJCWh3X2VwLT5tYXhfcGFja2V0X3N6X3J4ID0gbWF4cGFja2V0OwogCi0JCW11c2Jfd3JpdGViKG1iYXNlLCBNVVNCX1JYRklGT1NaLCBjX3NpemUpOwotCQltdXNiX3dyaXRldyhtYmFzZSwgTVVTQl9SWEZJRk9BREQsIGNfb2ZmKTsKKwkJbXVzYl93cml0ZV9yeGZpZm9zeihtYmFzZSwgY19zaXplKTsKKwkJbXVzYl93cml0ZV9yeGZpZm9hZGQobWJhc2UsIGNfb2ZmKTsKIAkJaHdfZXAtPnR4X2RvdWJsZV9idWZmZXJlZCA9IGh3X2VwLT5yeF9kb3VibGVfYnVmZmVyZWQ7CiAJCWh3X2VwLT5tYXhfcGFja2V0X3N6X3R4ID0gbWF4cGFja2V0OwogCkBAIC0xMjEyLDcgKzEyMTMsNyBAQAogCQlpZiAoZXBuID49IG11c2ItPmNvbmZpZy0+bnVtX2VwcykgewogCQkJcHJfZGVidWcoIiVzOiBpbnZhbGlkIGVwICVkXG4iLAogCQkJCQltdXNiX2RyaXZlcl9uYW1lLCBlcG4pOwotCQkJY29udGludWU7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlvZmZzZXQgPSBmaWZvX3NldHVwKG11c2IsIGh3X2VwICsgZXBuLCBjZmcrKywgb2Zmc2V0KTsKIAkJaWYgKG9mZnNldCA8IDApIHsKQEAgLTEyNDYsOSArMTI0NywxMCBAQAogICovCiBzdGF0aWMgaW50IF9faW5pdCBlcF9jb25maWdfZnJvbV9odyhzdHJ1Y3QgbXVzYiAqbXVzYikKIHsKLQl1OCBlcG51bSA9IDAsIHJlZzsKKwl1OCBlcG51bSA9IDA7CiAJc3RydWN0IG11c2JfaHdfZXAgKmh3X2VwOwogCXZvaWQgKm1iYXNlID0gbXVzYi0+bXJlZ3M7CisJaW50IHJldCA9IDA7CiAKIAlEQkcoMiwgIjw9PSBzdGF0aWMgc2lsaWNvbiBlcCBjb25maWdcbiIpOwogCkBAIC0xMjU4LDI2ICsxMjYwLDkgQEAKIAkJbXVzYl9lcF9zZWxlY3QobWJhc2UsIGVwbnVtKTsKIAkJaHdfZXAgPSBtdXNiLT5lbmRwb2ludHMgKyBlcG51bTsKIAotCQkvKiByZWFkIGZyb20gY29yZSB1c2luZyBpbmRleGVkIG1vZGVsICovCi0JCXJlZyA9IG11c2JfcmVhZGIoaHdfZXAtPnJlZ3MsIDB4MTAgKyBNVVNCX0ZJRk9TSVpFKTsKLQkJaWYgKCFyZWcpIHsKLQkJCS8qIDAncyByZXR1cm5lZCB3aGVuIG5vIG1vcmUgZW5kcG9pbnRzICovCisJCXJldCA9IG11c2JfcmVhZF9maWZvc2l6ZShtdXNiLCBod19lcCwgZXBudW0pOworCQlpZiAocmV0IDwgMCkKIAkJCWJyZWFrOwotCQl9Ci0JCW11c2ItPm5yX2VuZHBvaW50cysrOwotCQltdXNiLT5lcG1hc2sgfD0gKDEgPDwgZXBudW0pOwotCi0JCWh3X2VwLT5tYXhfcGFja2V0X3N6X3R4ID0gMSA8PCAocmVnICYgMHgwZik7Ci0KLQkJLyogc2hhcmVkIFRYL1JYIEZJRk8/ICovCi0JCWlmICgocmVnICYgMHhmMCkgPT0gMHhmMCkgewotCQkJaHdfZXAtPm1heF9wYWNrZXRfc3pfcnggPSBod19lcC0+bWF4X3BhY2tldF9zel90eDsKLQkJCWh3X2VwLT5pc19zaGFyZWRfZmlmbyA9IHRydWU7Ci0JCQljb250aW51ZTsKLQkJfSBlbHNlIHsKLQkJCWh3X2VwLT5tYXhfcGFja2V0X3N6X3J4ID0gMSA8PCAoKHJlZyAmIDB4ZjApID4+IDQpOwotCQkJaHdfZXAtPmlzX3NoYXJlZF9maWZvID0gZmFsc2U7Ci0JCX0KIAogCQkvKiBGSVhNRSBzZXQgdXAgaHdfZXAtPntyeCx0eH1fZG91YmxlX2J1ZmZlcmVkICovCiAKQEAgLTEzMjYsNyArMTMxMSw3IEBACiAKIAkvKiBsb2cgY29yZSBvcHRpb25zIChyZWFkIHVzaW5nIGluZGV4ZWQgbW9kZWwpICovCiAJbXVzYl9lcF9zZWxlY3QobWJhc2UsIDApOwotCXJlZyA9IG11c2JfcmVhZGIobWJhc2UsIDB4MTAgKyBNVVNCX0NPTkZJR0RBVEEpOworCXJlZyA9IG11c2JfcmVhZF9jb25maWdkYXRhKG1iYXNlKTsKIAogCXN0cmNweShhSW5mbywgKHJlZyAmIE1VU0JfQ09ORklHREFUQV9VVE1JRFcpID8gIlVUTUktMTYiIDogIlVUTUktOCIpOwogCWlmIChyZWcgJiBNVVNCX0NPTkZJR0RBVEFfRFlORklGTykKQEAgLTEzOTEsNyArMTM3Niw3IEBACiAJfQogCiAJLyogbG9nIHJlbGVhc2UgaW5mbyAqLwotCWh3dmVycyA9IG11c2JfcmVhZHcobWJhc2UsIE1VU0JfSFdWRVJTKTsKKwlod3ZlcnMgPSBtdXNiX3JlYWRfaHd2ZXJzKG1iYXNlKTsKIAlyZXZfbWFqb3IgPSAoaHd2ZXJzID4+IDEwKSAmIDB4MWY7CiAJcmV2X21pbm9yID0gaHd2ZXJzICYgMHgzZmY7CiAJc25wcmludGYoYVJldmlzaW9uLCAzMiwgIiVkLiVkJXMiLCByZXZfbWFqb3IsCkBAIC0xNDAwLDggKzEzODUsNyBAQAogCQkJbXVzYl9kcml2ZXJfbmFtZSwgdHlwZSwgYVJldmlzaW9uLCBhRGF0ZSk7CiAKIAkvKiBjb25maWd1cmUgZXAwICovCi0JbXVzYi0+ZW5kcG9pbnRzWzBdLm1heF9wYWNrZXRfc3pfdHggPSBNVVNCX0VQMF9GSUZPU0laRTsKLQltdXNiLT5lbmRwb2ludHNbMF0ubWF4X3BhY2tldF9zel9yeCA9IE1VU0JfRVAwX0ZJRk9TSVpFOworCW11c2JfY29uZmlndXJlX2VwMChtdXNiKTsKIAogCS8qIGRpc2NvdmVyIGVuZHBvaW50IGNvbmZpZ3VyYXRpb24gKi8KIAltdXNiLT5ucl9lbmRwb2ludHMgPSAxOwpAQCAtMTQ0NSw3ICsxNDI5LDcgQEAKIAogCQlod19lcC0+cmVncyA9IE1VU0JfRVBfT0ZGU0VUKGksIDApICsgbWJhc2U7CiAjaWZkZWYgQ09ORklHX1VTQl9NVVNCX0hEUkNfSENECi0JCWh3X2VwLT50YXJnZXRfcmVncyA9IE1VU0JfQlVTQ1RMX09GRlNFVChpLCAwKSArIG1iYXNlOworCQlod19lcC0+dGFyZ2V0X3JlZ3MgPSBtdXNiX3JlYWRfdGFyZ2V0X3JlZ19iYXNlKGksIG1iYXNlKTsKIAkJaHdfZXAtPnJ4X3JlaW5pdCA9IDE7CiAJCWh3X2VwLT50eF9yZWluaXQgPSAxOwogI2VuZGlmCkBAIC0xNjcxLDE3ICsxNjU1LDIwIEBACiB7CiAJc3RydWN0IG11c2IJKm11c2IgPSBkZXZfdG9fbXVzYihkZXYpOwogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJaW50CQlzdGF0dXM7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbXVzYi0+bG9jaywgZmxhZ3MpOwotCWlmICghc3RybmNtcChidWYsICJob3N0IiwgNCkpCi0JCW11c2JfcGxhdGZvcm1fc2V0X21vZGUobXVzYiwgTVVTQl9IT1NUKTsKLQlpZiAoIXN0cm5jbXAoYnVmLCAicGVyaXBoZXJhbCIsIDEwKSkKLQkJbXVzYl9wbGF0Zm9ybV9zZXRfbW9kZShtdXNiLCBNVVNCX1BFUklQSEVSQUwpOwotCWlmICghc3RybmNtcChidWYsICJvdGciLCAzKSkKLQkJbXVzYl9wbGF0Zm9ybV9zZXRfbW9kZShtdXNiLCBNVVNCX09URyk7CisJaWYgKHN5c2ZzX3N0cmVxKGJ1ZiwgImhvc3QiKSkKKwkJc3RhdHVzID0gbXVzYl9wbGF0Zm9ybV9zZXRfbW9kZShtdXNiLCBNVVNCX0hPU1QpOworCWVsc2UgaWYgKHN5c2ZzX3N0cmVxKGJ1ZiwgInBlcmlwaGVyYWwiKSkKKwkJc3RhdHVzID0gbXVzYl9wbGF0Zm9ybV9zZXRfbW9kZShtdXNiLCBNVVNCX1BFUklQSEVSQUwpOworCWVsc2UgaWYgKHN5c2ZzX3N0cmVxKGJ1ZiwgIm90ZyIpKQorCQlzdGF0dXMgPSBtdXNiX3BsYXRmb3JtX3NldF9tb2RlKG11c2IsIE1VU0JfT1RHKTsKKwllbHNlCisJCXN0YXR1cyA9IC1FSU5WQUw7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXVzYi0+bG9jaywgZmxhZ3MpOwogCi0JcmV0dXJuIG47CisJcmV0dXJuIChzdGF0dXMgPT0gMCkgPyBuIDogc3RhdHVzOwogfQogc3RhdGljIERFVklDRV9BVFRSKG1vZGUsIDA2NDQsIG11c2JfbW9kZV9zaG93LCBtdXNiX21vZGVfc3RvcmUpOwogCkBAIC0xNzgxLDcgKzE3NjgsNyBAQAogI2lmZGVmIENPTkZJR19VU0JfTVVTQl9IRFJDX0hDRAogCXN0cnVjdCB1c2JfaGNkCSpoY2Q7CiAKLQloY2QgPSB1c2JfY3JlYXRlX2hjZCgmbXVzYl9oY19kcml2ZXIsIGRldiwgZGV2LT5idXNfaWQpOworCWhjZCA9IHVzYl9jcmVhdGVfaGNkKCZtdXNiX2hjX2RyaXZlciwgZGV2LCBkZXZfbmFtZShkZXYpKTsKIAlpZiAoIWhjZCkKIAkJcmV0dXJuIE5VTEw7CiAJLyogdXNiY29yZSBzZXRzIGRldi0+ZHJpdmVyX2RhdGEgdG8gaGNkLCBhbmQgc29tZXRpbWVzIHVzZXMgdGhhdC4uLiAqLwpAQCAtMTgxMCw3ICsxNzk3LDYgQEAKIAlmb3IgKGVwbnVtID0gMCwgZXAgPSBtdXNiLT5lbmRwb2ludHM7CiAJCQllcG51bSA8IG11c2ItPmNvbmZpZy0+bnVtX2VwczsKIAkJCWVwbnVtKyssIGVwKyspIHsKLQogCQllcC0+bXVzYiA9IG11c2I7CiAJCWVwLT5lcG51bSA9IGVwbnVtOwogCX0KQEAgLTE4MzgsNyArMTgyNCw3IEBACiAJbXVzYl9nYWRnZXRfY2xlYW51cChtdXNiKTsKICNlbmRpZgogCi0JaWYgKG11c2ItPm5JcnEgPj0gMCkgeworCWlmIChtdXNiLT5uSXJxID49IDAgJiYgbXVzYi0+aXJxX3dha2UpIHsKIAkJZGlzYWJsZV9pcnFfd2FrZShtdXNiLT5uSXJxKTsKIAkJZnJlZV9pcnEobXVzYi0+bklycSwgbXVzYik7CiAJfQpAQCAtMTk4NCwxNSArMTk3MCwxOSBAQAogCUlOSVRfV09SSygmbXVzYi0+aXJxX3dvcmssIG11c2JfaXJxX3dvcmspOwogCiAJLyogYXR0YWNoIHRvIHRoZSBJUlEgKi8KLQlpZiAocmVxdWVzdF9pcnEobklycSwgbXVzYi0+aXNyLCAwLCBkZXYtPmJ1c19pZCwgbXVzYikpIHsKKwlpZiAocmVxdWVzdF9pcnEobklycSwgbXVzYi0+aXNyLCAwLCBkZXZfbmFtZShkZXYpLCBtdXNiKSkgewogCQlkZXZfZXJyKGRldiwgInJlcXVlc3RfaXJxICVkIGZhaWxlZCFcbiIsIG5JcnEpOwogCQlzdGF0dXMgPSAtRU5PREVWOwogCQlnb3RvIGZhaWwyOwogCX0KIAltdXNiLT5uSXJxID0gbklycTsKIC8qIEZJWE1FIHRoaXMgaGFuZGxlcyB3YWtldXAgaXJxcyB3cm9uZyAqLwotCWlmIChlbmFibGVfaXJxX3dha2UobklycSkgPT0gMCkKKwlpZiAoZW5hYmxlX2lycV93YWtlKG5JcnEpID09IDApIHsKKwkJbXVzYi0+aXJxX3dha2UgPSAxOwogCQlkZXZpY2VfaW5pdF93YWtldXAoZGV2LCAxKTsKKwl9IGVsc2UgeworCQltdXNiLT5pcnFfd2FrZSA9IDA7CisJfQogCiAJcHJfaW5mbygiJXM6IFVTQiAlcyBtb2RlIGNvbnRyb2xsZXIgYXQgJXAgdXNpbmcgJXMsIElSUSAlZFxuIiwKIAkJCW11c2JfZHJpdmVyX25hbWUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5oIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuaAppbmRleCA4MjIyNzI1Li42MzA5NDZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5oCisrKyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmgKQEAgLTE5MSw3ICsxOTEsNyBAQAogICovCiAKICNpZiBkZWZpbmVkKENPTkZJR19BUkNIX0RBVklOQ0kpIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDI0MzApIFwKLQkJfHwgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMzQzMCkKKwkJfHwgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMzQzMCkgfHwgZGVmaW5lZChDT05GSUdfQkxBQ0tGSU4pCiAvKiBSRVZJU0lUIGluZGV4ZWQgYWNjZXNzIHNlZW1lZCB0bwogICogbWlzYmVoYXZlIChvbiBEYVZpbmNpKSBmb3IgYXQgbGVhc3QgcGVyaXBoZXJhbCBJTiAuLi4KICAqLwpAQCAtMzU5LDYgKzM1OSw3IEBACiAJc3RydWN0IG90Z190cmFuc2NlaXZlcgl4Y2VpdjsKIAogCWludCBuSXJxOworCXVuc2lnbmVkCQlpcnFfd2FrZToxOwogCiAJc3RydWN0IG11c2JfaHdfZXAJIGVuZHBvaW50c1tNVVNCX0NfTlVNX0VQU107CiAjZGVmaW5lIGNvbnRyb2xfZXAJCWVuZHBvaW50cwpAQCAtNDQ3LDYgKzQ0OCw3MCBAQAogfQogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfQkxBQ0tGSU4KK3N0YXRpYyBpbmxpbmUgaW50IG11c2JfcmVhZF9maWZvc2l6ZShzdHJ1Y3QgbXVzYiAqbXVzYiwKKwkJc3RydWN0IG11c2JfaHdfZXAgKmh3X2VwLCB1OCBlcG51bSkKK3sKKwltdXNiLT5ucl9lbmRwb2ludHMrKzsKKwltdXNiLT5lcG1hc2sgfD0gKDEgPDwgZXBudW0pOworCisJaWYgKGVwbnVtIDwgNSkgeworCQlod19lcC0+bWF4X3BhY2tldF9zel90eCA9IDEyODsKKwkJaHdfZXAtPm1heF9wYWNrZXRfc3pfcnggPSAxMjg7CisJfSBlbHNlIHsKKwkJaHdfZXAtPm1heF9wYWNrZXRfc3pfdHggPSAxMDI0OworCQlod19lcC0+bWF4X3BhY2tldF9zel9yeCA9IDEwMjQ7CisJfQorCWh3X2VwLT5pc19zaGFyZWRfZmlmbyA9IGZhbHNlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtdXNiX2NvbmZpZ3VyZV9lcDAoc3RydWN0IG11c2IgKm11c2IpCit7CisJbXVzYi0+ZW5kcG9pbnRzWzBdLm1heF9wYWNrZXRfc3pfdHggPSBNVVNCX0VQMF9GSUZPU0laRTsKKwltdXNiLT5lbmRwb2ludHNbMF0ubWF4X3BhY2tldF9zel9yeCA9IE1VU0JfRVAwX0ZJRk9TSVpFOworCW11c2ItPmVuZHBvaW50c1swXS5pc19zaGFyZWRfZmlmbyA9IHRydWU7Cit9CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgaW50IG11c2JfcmVhZF9maWZvc2l6ZShzdHJ1Y3QgbXVzYiAqbXVzYiwKKwkJc3RydWN0IG11c2JfaHdfZXAgKmh3X2VwLCB1OCBlcG51bSkKK3sKKwl1OCByZWcgPSAwOworCisJLyogcmVhZCBmcm9tIGNvcmUgdXNpbmcgaW5kZXhlZCBtb2RlbCAqLworCXJlZyA9IG11c2JfcmVhZGIoaHdfZXAtPnJlZ3MsIDB4MTAgKyBNVVNCX0ZJRk9TSVpFKTsKKwkvKiAwJ3MgcmV0dXJuZWQgd2hlbiBubyBtb3JlIGVuZHBvaW50cyAqLworCWlmICghcmVnKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW11c2ItPm5yX2VuZHBvaW50cysrOworCW11c2ItPmVwbWFzayB8PSAoMSA8PCBlcG51bSk7CisKKwlod19lcC0+bWF4X3BhY2tldF9zel90eCA9IDEgPDwgKHJlZyAmIDB4MGYpOworCisJLyogc2hhcmVkIFRYL1JYIEZJRk8/ICovCisJaWYgKChyZWcgJiAweGYwKSA9PSAweGYwKSB7CisJCWh3X2VwLT5tYXhfcGFja2V0X3N6X3J4ID0gaHdfZXAtPm1heF9wYWNrZXRfc3pfdHg7CisJCWh3X2VwLT5pc19zaGFyZWRfZmlmbyA9IHRydWU7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCWh3X2VwLT5tYXhfcGFja2V0X3N6X3J4ID0gMSA8PCAoKHJlZyAmIDB4ZjApID4+IDQpOworCQlod19lcC0+aXNfc2hhcmVkX2ZpZm8gPSBmYWxzZTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG11c2JfY29uZmlndXJlX2VwMChzdHJ1Y3QgbXVzYiAqbXVzYikKK3sKKwltdXNiLT5lbmRwb2ludHNbMF0ubWF4X3BhY2tldF9zel90eCA9IE1VU0JfRVAwX0ZJRk9TSVpFOworCW11c2ItPmVuZHBvaW50c1swXS5tYXhfcGFja2V0X3N6X3J4ID0gTVVTQl9FUDBfRklGT1NJWkU7Cit9CisjZW5kaWYgLyogQ09ORklHX0JMQUNLRklOICovCisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEdsdWUgaXQgdG9nZXRoZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTQ2NywxNiArNTMyLDE2IEBACiAKIGV4dGVybiB2b2lkIG11c2JfaG5wX3N0b3Aoc3RydWN0IG11c2IgKm11c2IpOwogCi1leHRlcm4gdm9pZCBtdXNiX3BsYXRmb3JtX3NldF9tb2RlKHN0cnVjdCBtdXNiICptdXNiLCB1OCBtdXNiX21vZGUpOworZXh0ZXJuIGludCBtdXNiX3BsYXRmb3JtX3NldF9tb2RlKHN0cnVjdCBtdXNiICptdXNiLCB1OCBtdXNiX21vZGUpOwogCi0jaWYgZGVmaW5lZChDT05GSUdfVVNCX1RVU0I2MDEwKSB8fCBcCisjaWYgZGVmaW5lZChDT05GSUdfVVNCX1RVU0I2MDEwKSB8fCBkZWZpbmVkKENPTkZJR19CTEFDS0ZJTikgfHwgXAogCWRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDI0MzApIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDM0WFgpCiBleHRlcm4gdm9pZCBtdXNiX3BsYXRmb3JtX3RyeV9pZGxlKHN0cnVjdCBtdXNiICptdXNiLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpOwogI2Vsc2UKICNkZWZpbmUgbXVzYl9wbGF0Zm9ybV90cnlfaWRsZSh4LCB5KQkJZG8ge30gd2hpbGUgKDApCiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19VU0JfVFVTQjYwMTAKKyNpZiBkZWZpbmVkKENPTkZJR19VU0JfVFVTQjYwMTApIHx8IGRlZmluZWQoQ09ORklHX0JMQUNLRklOKQogZXh0ZXJuIGludCBtdXNiX3BsYXRmb3JtX2dldF92YnVzX3N0YXR1cyhzdHJ1Y3QgbXVzYiAqbXVzYik7CiAjZWxzZQogI2RlZmluZSBtdXNiX3BsYXRmb3JtX2dldF92YnVzX3N0YXR1cyh4KQkwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfZ2FkZ2V0LmMgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfZ2FkZ2V0LmMKaW5kZXggZDZhODAyYy4uNjE5N2RhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2dhZGdldC5jCisrKyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9nYWRnZXQuYwpAQCAtMTYzMyw3ICsxNjMzLDcgQEAKIAltdXNiLT5nLnNwZWVkID0gVVNCX1NQRUVEX1VOS05PV047CiAKIAkvKiB0aGlzICJnYWRnZXQiIGFic3RyYWN0cy92aXJ0dWFsaXplcyB0aGUgY29udHJvbGxlciAqLwotCXN0cmNweShtdXNiLT5nLmRldi5idXNfaWQsICJnYWRnZXQiKTsKKwlkZXZfc2V0X25hbWUoJm11c2ItPmcuZGV2LCAiZ2FkZ2V0Iik7CiAJbXVzYi0+Zy5kZXYucGFyZW50ID0gbXVzYi0+Y29udHJvbGxlcjsKIAltdXNiLT5nLmRldi5kbWFfbWFzayA9IG11c2ItPmNvbnRyb2xsZXItPmRtYV9tYXNrOwogCW11c2ItPmcuZGV2LnJlbGVhc2UgPSBtdXNiX2dhZGdldF9yZWxlYXNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2hvc3QuYyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9ob3N0LmMKaW5kZXggY2M2NDQ2Mi4uOTlmYTYxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2hvc3QuYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfaG9zdC5jCkBAIC0xMTIsMTggKzExMiwyMSBAQAogewogCXZvaWQgX19pb21lbQkqZXBpbyA9IGVwLT5yZWdzOwogCXUxNgkJY3NyOworCXUxNgkJbGFzdGNzciA9IDA7CiAJaW50CQlyZXRyaWVzID0gMTAwMDsKIAogCWNzciA9IG11c2JfcmVhZHcoZXBpbywgTVVTQl9UWENTUik7CiAJd2hpbGUgKGNzciAmIE1VU0JfVFhDU1JfRklGT05PVEVNUFRZKSB7Ci0JCURCRyg1LCAiSG9zdCBUWCBGSUZPTk9URU1QVFkgY3NyOiAlMDJ4XG4iLCBjc3IpOworCQlpZiAoY3NyICE9IGxhc3Rjc3IpCisJCQlEQkcoMywgIkhvc3QgVFggRklGT05PVEVNUFRZIGNzcjogJTAyeFxuIiwgY3NyKTsKKwkJbGFzdGNzciA9IGNzcjsKIAkJY3NyIHw9IE1VU0JfVFhDU1JfRkxVU0hGSUZPOwogCQltdXNiX3dyaXRldyhlcGlvLCBNVVNCX1RYQ1NSLCBjc3IpOwogCQljc3IgPSBtdXNiX3JlYWR3KGVwaW8sIE1VU0JfVFhDU1IpOwotCQlpZiAocmV0cmllcy0tIDwgMSkgewotCQkJRVJSKCJDb3VsZCBub3QgZmx1c2ggaG9zdCBUWCBmaWZvOiBjc3I6ICUwNHhcbiIsIGNzcik7CisJCWlmIChXQVJOKHJldHJpZXMtLSA8IDEsCisJCQkJIkNvdWxkIG5vdCBmbHVzaCBob3N0IFRYJWQgZmlmbzogY3NyOiAlMDR4XG4iLAorCQkJCWVwLT5lcG51bSwgY3NyKSkKIAkJCXJldHVybjsKLQkJfQogCQltZGVsYXkoMSk7CiAJfQogfQpAQCAtMjY4LDcgKzI3MSw3IEBACiBfX3JlbGVhc2VzKG11c2ItPmxvY2spCiBfX2FjcXVpcmVzKG11c2ItPmxvY2spCiB7Ci0JREJHKCh7IGludCBsZXZlbDsgc3dpdGNoICh1cmItPnN0YXR1cykgeworCURCRygoeyBpbnQgbGV2ZWw7IHN3aXRjaCAoc3RhdHVzKSB7CiAJCQkJY2FzZSAwOgogCQkJCQlsZXZlbCA9IDQ7CiAJCQkJCWJyZWFrOwpAQCAtMjgzLDggKzI4Niw4IEBACiAJCQkJCWxldmVsID0gMjsKIAkJCQkJYnJlYWs7CiAJCQkJfTsgbGV2ZWw7IH0pLAotCQkJImNvbXBsZXRlICVwICglZCksIGRldiVkIGVwJWQlcywgJWQvJWRcbiIsCi0JCQl1cmIsIHVyYi0+c3RhdHVzLAorCQkJImNvbXBsZXRlICVwICVwRiAoJWQpLCBkZXYlZCBlcCVkJXMsICVkLyVkXG4iLAorCQkJdXJiLCB1cmItPmNvbXBsZXRlLCBzdGF0dXMsCiAJCQl1c2JfcGlwZWRldmljZSh1cmItPnBpcGUpLAogCQkJdXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpLAogCQkJdXNiX3BpcGVpbih1cmItPnBpcGUpID8gImluIiA6ICJvdXQiLApAQCAtNTkzLDEyICs1OTYsMTAgQEAKIAogCS8qIHRhcmdldCBhZGRyIGFuZCAoZm9yIG11bHRpcG9pbnQpIGh1YiBhZGRyL3BvcnQgKi8KIAlpZiAobXVzYi0+aXNfbXVsdGlwb2ludCkgewotCQltdXNiX3dyaXRlYihlcC0+dGFyZ2V0X3JlZ3MsIE1VU0JfUlhGVU5DQUREUiwKLQkJCXFoLT5hZGRyX3JlZyk7Ci0JCW11c2Jfd3JpdGViKGVwLT50YXJnZXRfcmVncywgTVVTQl9SWEhVQkFERFIsCi0JCQlxaC0+aF9hZGRyX3JlZyk7Ci0JCW11c2Jfd3JpdGViKGVwLT50YXJnZXRfcmVncywgTVVTQl9SWEhVQlBPUlQsCi0JCQlxaC0+aF9wb3J0X3JlZyk7CisJCW11c2Jfd3JpdGVfcnhmdW5hZGRyKGVwLT50YXJnZXRfcmVncywgcWgtPmFkZHJfcmVnKTsKKwkJbXVzYl93cml0ZV9yeGh1YmFkZHIoZXAtPnRhcmdldF9yZWdzLCBxaC0+aF9hZGRyX3JlZyk7CisJCW11c2Jfd3JpdGVfcnhodWJwb3J0KGVwLT50YXJnZXRfcmVncywgcWgtPmhfcG9ydF9yZWcpOworCiAJfSBlbHNlCiAJCW11c2Jfd3JpdGViKG11c2ItPm1yZWdzLCBNVVNCX0ZBRERSLCBxaC0+YWRkcl9yZWcpOwogCkBAIC03MTIsMTUgKzcxMyw5IEBACiAKIAkJLyogdGFyZ2V0IGFkZHIgYW5kIChmb3IgbXVsdGlwb2ludCkgaHViIGFkZHIvcG9ydCAqLwogCQlpZiAobXVzYi0+aXNfbXVsdGlwb2ludCkgewotCQkJbXVzYl93cml0ZWIobWJhc2UsCi0JCQkJTVVTQl9CVVNDVExfT0ZGU0VUKGVwbnVtLCBNVVNCX1RYRlVOQ0FERFIpLAotCQkJCXFoLT5hZGRyX3JlZyk7Ci0JCQltdXNiX3dyaXRlYihtYmFzZSwKLQkJCQlNVVNCX0JVU0NUTF9PRkZTRVQoZXBudW0sIE1VU0JfVFhIVUJBRERSKSwKLQkJCQlxaC0+aF9hZGRyX3JlZyk7Ci0JCQltdXNiX3dyaXRlYihtYmFzZSwKLQkJCQlNVVNCX0JVU0NUTF9PRkZTRVQoZXBudW0sIE1VU0JfVFhIVUJQT1JUKSwKLQkJCQlxaC0+aF9wb3J0X3JlZyk7CisJCQltdXNiX3dyaXRlX3R4ZnVuYWRkcihtYmFzZSwgZXBudW0sIHFoLT5hZGRyX3JlZyk7CisJCQltdXNiX3dyaXRlX3R4aHViYWRkcihtYmFzZSwgZXBudW0sIHFoLT5oX2FkZHJfcmVnKTsKKwkJCW11c2Jfd3JpdGVfdHhodWJwb3J0KG1iYXNlLCBlcG51bSwgcWgtPmhfcG9ydF9yZWcpOwogLyogRklYTUUgaWYgIWVwbnVtLCBkbyB0aGUgc2FtZSBmb3IgUlggLi4uICovCiAJCX0gZWxzZQogCQkJbXVzYl93cml0ZWIobWJhc2UsIE1VU0JfRkFERFIsIHFoLT5hZGRyX3JlZyk7CkBAIC05ODgsOCArOTgzLDEwIEBACiAJCWlmIChmaWZvX2NvdW50KSB7CiAJCQlmaWZvX2Rlc3QgPSAodTggKikgKHVyYi0+dHJhbnNmZXJfYnVmZmVyCiAJCQkJCSsgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKLQkJCURCRygzLCAiU2VuZGluZyAlZCBieXRlcyB0byAlcFxuIiwKLQkJCQkJZmlmb19jb3VudCwgZmlmb19kZXN0KTsKKwkJCURCRygzLCAiU2VuZGluZyAlZCBieXRlJXMgdG8gZXAwIGZpZm8gJXBcbiIsCisJCQkJCWZpZm9fY291bnQsCisJCQkJCShmaWZvX2NvdW50ID09IDEpID8gIiIgOiAicyIsCisJCQkJCWZpZm9fZGVzdCk7CiAJCQltdXNiX3dyaXRlX2ZpZm8oaHdfZXAsIGZpZm9fY291bnQsIGZpZm9fZGVzdCk7CiAKIAkJCXVyYi0+YWN0dWFsX2xlbmd0aCArPSBmaWZvX2NvdW50OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2lvLmggYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfaW8uaAppbmRleCAyMjNmMGE1Li5iMDZlOWVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfaW8uaAorKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfaW8uaApAQCAtMzksNyArMzksNyBAQAogCiAjaWYgIWRlZmluZWQoQ09ORklHX0FSTSkgJiYgIWRlZmluZWQoQ09ORklHX1NVUEVSSCkgXAogCSYmICFkZWZpbmVkKENPTkZJR19BVlIzMikgJiYgIWRlZmluZWQoQ09ORklHX1BQQzMyKSBcCi0JJiYgIWRlZmluZWQoQ09ORklHX1BQQzY0KQorCSYmICFkZWZpbmVkKENPTkZJR19QUEM2NCkgJiYgIWRlZmluZWQoQ09ORklHX0JMQUNLRklOKQogc3RhdGljIGlubGluZSB2b2lkIHJlYWRzbChjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIsIHZvaWQgKmJ1ZiwgaW50IGxlbikKIAl7IGluc2woKHVuc2lnbmVkIGxvbmcpYWRkciwgYnVmLCBsZW4pOyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgcmVhZHN3KGNvbnN0IHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqYnVmLCBpbnQgbGVuKQpAQCAtNTYsNiArNTYsOCBAQAogCiAjZW5kaWYKIAorI2lmbmRlZiBDT05GSUdfQkxBQ0tGSU4KKwogLyogTk9URTogIHRoZXNlIG9mZnNldHMgYXJlIGFsbCBpbiBieXRlcyAqLwogCiBzdGF0aWMgaW5saW5lIHUxNiBtdXNiX3JlYWR3KGNvbnN0IHZvaWQgX19pb21lbSAqYWRkciwgdW5zaWduZWQgb2Zmc2V0KQpAQCAtMTE0LDQgKzExNiwyNiBAQAogCiAjZW5kaWYJLyogQ09ORklHX1VTQl9UVVNCNjAxMCAqLwogCisjZWxzZQorCitzdGF0aWMgaW5saW5lIHU4IG11c2JfcmVhZGIoY29uc3Qgdm9pZCBfX2lvbWVtICphZGRyLCB1bnNpZ25lZCBvZmZzZXQpCisJeyByZXR1cm4gKHU4KSAoYmZpbl9yZWFkMTYoYWRkciArIG9mZnNldCkpOyB9CisKK3N0YXRpYyBpbmxpbmUgdTE2IG11c2JfcmVhZHcoY29uc3Qgdm9pZCBfX2lvbWVtICphZGRyLCB1bnNpZ25lZCBvZmZzZXQpCisJeyByZXR1cm4gYmZpbl9yZWFkMTYoYWRkciArIG9mZnNldCk7IH0KKworc3RhdGljIGlubGluZSB1MzIgbXVzYl9yZWFkbChjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIsIHVuc2lnbmVkIG9mZnNldCkKKwl7IHJldHVybiAodTMyKSAoYmZpbl9yZWFkMTYoYWRkciArIG9mZnNldCkpOyB9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtdXNiX3dyaXRlYih2b2lkIF9faW9tZW0gKmFkZHIsIHVuc2lnbmVkIG9mZnNldCwgdTggZGF0YSkKKwl7IGJmaW5fd3JpdGUxNihhZGRyICsgb2Zmc2V0LCAodTE2KSBkYXRhKTsgfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXVzYl93cml0ZXcodm9pZCBfX2lvbWVtICphZGRyLCB1bnNpZ25lZCBvZmZzZXQsIHUxNiBkYXRhKQorCXsgYmZpbl93cml0ZTE2KGFkZHIgKyBvZmZzZXQsIGRhdGEpOyB9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtdXNiX3dyaXRlbCh2b2lkIF9faW9tZW0gKmFkZHIsIHVuc2lnbmVkIG9mZnNldCwgdTMyIGRhdGEpCisJeyBiZmluX3dyaXRlMTYoYWRkciArIG9mZnNldCwgKHUxNikgZGF0YSk7IH0KKworI2VuZGlmIC8qIENPTkZJR19CTEFDS0ZJTiAqLworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9yZWdzLmggYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfcmVncy5oCmluZGV4IDljMjI4NjYuLmRlM2IyZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9yZWdzLmgKKysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX3JlZ3MuaApAQCAtMzgsOTcgKzM4LDYgQEAKICNkZWZpbmUgTVVTQl9FUDBfRklGT1NJWkUJNjQJLyogVGhpcyBpcyBub24tY29uZmlndXJhYmxlICovCiAKIC8qCi0gKiBDb21tb24gVVNCIHJlZ2lzdGVycwotICovCi0KLSNkZWZpbmUgTVVTQl9GQUREUgkJMHgwMAkvKiA4LWJpdCAqLwotI2RlZmluZSBNVVNCX1BPV0VSCQkweDAxCS8qIDgtYml0ICovCi0KLSNkZWZpbmUgTVVTQl9JTlRSVFgJCTB4MDIJLyogMTYtYml0ICovCi0jZGVmaW5lIE1VU0JfSU5UUlJYCQkweDA0Ci0jZGVmaW5lIE1VU0JfSU5UUlRYRQkJMHgwNgotI2RlZmluZSBNVVNCX0lOVFJSWEUJCTB4MDgKLSNkZWZpbmUgTVVTQl9JTlRSVVNCCQkweDBBCS8qIDggYml0ICovCi0jZGVmaW5lIE1VU0JfSU5UUlVTQkUJCTB4MEIJLyogOCBiaXQgKi8KLSNkZWZpbmUgTVVTQl9GUkFNRQkJMHgwQwotI2RlZmluZSBNVVNCX0lOREVYCQkweDBFCS8qIDggYml0ICovCi0jZGVmaW5lIE1VU0JfVEVTVE1PREUJCTB4MEYJLyogOCBiaXQgKi8KLQotLyogR2V0IG9mZnNldCBmb3IgYSBnaXZlbiBGSUZPIGZyb20gbXVzYi0+bXJlZ3MgKi8KLSNpZmRlZglDT05GSUdfVVNCX1RVU0I2MDEwCi0jZGVmaW5lIE1VU0JfRklGT19PRkZTRVQoZXBudW0pCSgweDIwMCArICgoZXBudW0pICogMHgyMCkpCi0jZWxzZQotI2RlZmluZSBNVVNCX0ZJRk9fT0ZGU0VUKGVwbnVtKQkoMHgyMCArICgoZXBudW0pICogNCkpCi0jZW5kaWYKLQotLyoKLSAqIEFkZGl0aW9uYWwgQ29udHJvbCBSZWdpc3RlcnMKLSAqLwotCi0jZGVmaW5lIE1VU0JfREVWQ1RMCQkweDYwCS8qIDggYml0ICovCi0KLS8qIFRoZXNlIGFyZSBhbHdheXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBJTkRFWCByZWdpc3RlciAqLwotI2RlZmluZSBNVVNCX1RYRklGT1NaCQkweDYyCS8qIDgtYml0IChzZWUgbWFza3MpICovCi0jZGVmaW5lIE1VU0JfUlhGSUZPU1oJCTB4NjMJLyogOC1iaXQgKHNlZSBtYXNrcykgKi8KLSNkZWZpbmUgTVVTQl9UWEZJRk9BREQJCTB4NjQJLyogMTYtYml0IG9mZnNldCBzaGlmdGVkIHJpZ2h0IDMgKi8KLSNkZWZpbmUgTVVTQl9SWEZJRk9BREQJCTB4NjYJLyogMTYtYml0IG9mZnNldCBzaGlmdGVkIHJpZ2h0IDMgKi8KLQotLyogUkVWSVNJVDogdmN0cmwvdnN0YXR1czogb3B0aW9uYWwgdmVuZG9yIHV0bWkrcGh5IHJlZ2lzdGVyIGF0IDB4NjggKi8KLSNkZWZpbmUgTVVTQl9IV1ZFUlMJCTB4NkMJLyogOCBiaXQgKi8KLQotI2RlZmluZSBNVVNCX0VQSU5GTwkJMHg3OAkvKiA4IGJpdCAqLwotI2RlZmluZSBNVVNCX1JBTUlORk8JCTB4NzkJLyogOCBiaXQgKi8KLSNkZWZpbmUgTVVTQl9MSU5LSU5GTwkJMHg3YQkvKiA4IGJpdCAqLwotI2RlZmluZSBNVVNCX1ZQTEVOCQkweDdiCS8qIDggYml0ICovCi0jZGVmaW5lIE1VU0JfSFNfRU9GMQkJMHg3YwkvKiA4IGJpdCAqLwotI2RlZmluZSBNVVNCX0ZTX0VPRjEJCTB4N2QJLyogOCBiaXQgKi8KLSNkZWZpbmUgTVVTQl9MU19FT0YxCQkweDdlCS8qIDggYml0ICovCi0KLS8qIE9mZnNldHMgdG8gZW5kcG9pbnQgcmVnaXN0ZXJzICovCi0jZGVmaW5lIE1VU0JfVFhNQVhQCQkweDAwCi0jZGVmaW5lIE1VU0JfVFhDU1IJCTB4MDIKLSNkZWZpbmUgTVVTQl9DU1IwCQlNVVNCX1RYQ1NSCS8qIFJlLXVzZWQgZm9yIEVQMCAqLwotI2RlZmluZSBNVVNCX1JYTUFYUAkJMHgwNAotI2RlZmluZSBNVVNCX1JYQ1NSCQkweDA2Ci0jZGVmaW5lIE1VU0JfUlhDT1VOVAkJMHgwOAotI2RlZmluZSBNVVNCX0NPVU5UMAkJTVVTQl9SWENPVU5UCS8qIFJlLXVzZWQgZm9yIEVQMCAqLwotI2RlZmluZSBNVVNCX1RYVFlQRQkJMHgwQQotI2RlZmluZSBNVVNCX1RZUEUwCQlNVVNCX1RYVFlQRQkvKiBSZS11c2VkIGZvciBFUDAgKi8KLSNkZWZpbmUgTVVTQl9UWElOVEVSVkFMCQkweDBCCi0jZGVmaW5lIE1VU0JfTkFLTElNSVQwCQlNVVNCX1RYSU5URVJWQUwJLyogUmUtdXNlZCBmb3IgRVAwICovCi0jZGVmaW5lIE1VU0JfUlhUWVBFCQkweDBDCi0jZGVmaW5lIE1VU0JfUlhJTlRFUlZBTAkJMHgwRAotI2RlZmluZSBNVVNCX0ZJRk9TSVpFCQkweDBGCi0jZGVmaW5lIE1VU0JfQ09ORklHREFUQQkJTVVTQl9GSUZPU0laRQkvKiBSZS11c2VkIGZvciBFUDAgKi8KLQotLyogT2Zmc2V0cyB0byBlbmRwb2ludCByZWdpc3RlcnMgaW4gaW5kZXhlZCBtb2RlbCAodXNpbmcgSU5ERVggcmVnaXN0ZXIpICovCi0jZGVmaW5lIE1VU0JfSU5ERVhFRF9PRkZTRVQoX2VwbnVtLCBfb2Zmc2V0KQlcCi0JKDB4MTAgKyAoX29mZnNldCkpCi0KLS8qIE9mZnNldHMgdG8gZW5kcG9pbnQgcmVnaXN0ZXJzIGluIGZsYXQgbW9kZWxzICovCi0jZGVmaW5lIE1VU0JfRkxBVF9PRkZTRVQoX2VwbnVtLCBfb2Zmc2V0KQlcCi0JKDB4MTAwICsgKDB4MTAqKF9lcG51bSkpICsgKF9vZmZzZXQpKQotCi0jaWZkZWYgQ09ORklHX1VTQl9UVVNCNjAxMAotLyogVFVTQjYwMTAgRVAwIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgaXMgc3BlY2lhbCAqLwotI2RlZmluZSBNVVNCX1RVU0JfT0ZGU0VUKF9lcG51bSwgX29mZnNldCkJXAotCSgweDEwICsgX29mZnNldCkKLSNpbmNsdWRlICJ0dXNiNjAxMC5oIgkJLyogTmVlZGVkICJvbmx5IiBmb3IgVFVTQl9FUDBfQ09ORiAqLwotI2VuZGlmCi0KLS8qICJidXMgY29udHJvbCIvdGFyZ2V0IHJlZ2lzdGVycywgZm9yIGhvc3Qgc2lkZSBtdWx0aXBvaW50IChleHRlcm5hbCBodWJzKSAqLwotI2RlZmluZSBNVVNCX1RYRlVOQ0FERFIJCTB4MDAKLSNkZWZpbmUgTVVTQl9UWEhVQkFERFIJCTB4MDIKLSNkZWZpbmUgTVVTQl9UWEhVQlBPUlQJCTB4MDMKLQotI2RlZmluZSBNVVNCX1JYRlVOQ0FERFIJCTB4MDQKLSNkZWZpbmUgTVVTQl9SWEhVQkFERFIJCTB4MDYKLSNkZWZpbmUgTVVTQl9SWEhVQlBPUlQJCTB4MDcKLQotI2RlZmluZSBNVVNCX0JVU0NUTF9PRkZTRVQoX2VwbnVtLCBfb2Zmc2V0KSBcCi0JKDB4ODAgKyAoOCooX2VwbnVtKSkgKyAoX29mZnNldCkpCi0KLS8qCiAgKiBNVVNCIFJlZ2lzdGVyIGJpdHMKICAqLwogCkBAIC0yMjgsNyArMTM3LDYgQEAKIAogLyogVFhDU1IgaW4gUGVyaXBoZXJhbCBhbmQgSG9zdCBtb2RlICovCiAjZGVmaW5lIE1VU0JfVFhDU1JfQVVUT1NFVAkJMHg4MDAwCi0jZGVmaW5lIE1VU0JfVFhDU1JfTU9ERQkJCTB4MjAwMAogI2RlZmluZSBNVVNCX1RYQ1NSX0RNQUVOQUIJCTB4MTAwMAogI2RlZmluZSBNVVNCX1RYQ1NSX0ZSQ0RBVEFUT0cJCTB4MDgwMAogI2RlZmluZSBNVVNCX1RYQ1NSX0RNQU1PREUJCTB4MDQwMApAQCAtMjk3LDQgKzIwNSwzMDkgQEAKIC8qIEhVQkFERFIgKi8KICNkZWZpbmUgTVVTQl9IVUJBRERSX01VTFRJX1RUCQkweDgwCiAKKworI2lmbmRlZiBDT05GSUdfQkxBQ0tGSU4KKworLyoKKyAqIENvbW1vbiBVU0IgcmVnaXN0ZXJzCisgKi8KKworI2RlZmluZSBNVVNCX0ZBRERSCQkweDAwCS8qIDgtYml0ICovCisjZGVmaW5lIE1VU0JfUE9XRVIJCTB4MDEJLyogOC1iaXQgKi8KKworI2RlZmluZSBNVVNCX0lOVFJUWAkJMHgwMgkvKiAxNi1iaXQgKi8KKyNkZWZpbmUgTVVTQl9JTlRSUlgJCTB4MDQKKyNkZWZpbmUgTVVTQl9JTlRSVFhFCQkweDA2CisjZGVmaW5lIE1VU0JfSU5UUlJYRQkJMHgwOAorI2RlZmluZSBNVVNCX0lOVFJVU0IJCTB4MEEJLyogOCBiaXQgKi8KKyNkZWZpbmUgTVVTQl9JTlRSVVNCRQkJMHgwQgkvKiA4IGJpdCAqLworI2RlZmluZSBNVVNCX0ZSQU1FCQkweDBDCisjZGVmaW5lIE1VU0JfSU5ERVgJCTB4MEUJLyogOCBiaXQgKi8KKyNkZWZpbmUgTVVTQl9URVNUTU9ERQkJMHgwRgkvKiA4IGJpdCAqLworCisvKiBHZXQgb2Zmc2V0IGZvciBhIGdpdmVuIEZJRk8gZnJvbSBtdXNiLT5tcmVncyAqLworI2lmZGVmCUNPTkZJR19VU0JfVFVTQjYwMTAKKyNkZWZpbmUgTVVTQl9GSUZPX09GRlNFVChlcG51bSkJKDB4MjAwICsgKChlcG51bSkgKiAweDIwKSkKKyNlbHNlCisjZGVmaW5lIE1VU0JfRklGT19PRkZTRVQoZXBudW0pCSgweDIwICsgKChlcG51bSkgKiA0KSkKKyNlbmRpZgorCisvKgorICogQWRkaXRpb25hbCBDb250cm9sIFJlZ2lzdGVycworICovCisKKyNkZWZpbmUgTVVTQl9ERVZDVEwJCTB4NjAJLyogOCBiaXQgKi8KKworLyogVGhlc2UgYXJlIGFsd2F5cyBjb250cm9sbGVkIHRocm91Z2ggdGhlIElOREVYIHJlZ2lzdGVyICovCisjZGVmaW5lIE1VU0JfVFhGSUZPU1oJCTB4NjIJLyogOC1iaXQgKHNlZSBtYXNrcykgKi8KKyNkZWZpbmUgTVVTQl9SWEZJRk9TWgkJMHg2MwkvKiA4LWJpdCAoc2VlIG1hc2tzKSAqLworI2RlZmluZSBNVVNCX1RYRklGT0FERAkJMHg2NAkvKiAxNi1iaXQgb2Zmc2V0IHNoaWZ0ZWQgcmlnaHQgMyAqLworI2RlZmluZSBNVVNCX1JYRklGT0FERAkJMHg2NgkvKiAxNi1iaXQgb2Zmc2V0IHNoaWZ0ZWQgcmlnaHQgMyAqLworCisvKiBSRVZJU0lUOiB2Y3RybC92c3RhdHVzOiBvcHRpb25hbCB2ZW5kb3IgdXRtaStwaHkgcmVnaXN0ZXIgYXQgMHg2OCAqLworI2RlZmluZSBNVVNCX0hXVkVSUwkJMHg2QwkvKiA4IGJpdCAqLworCisjZGVmaW5lIE1VU0JfRVBJTkZPCQkweDc4CS8qIDggYml0ICovCisjZGVmaW5lIE1VU0JfUkFNSU5GTwkJMHg3OQkvKiA4IGJpdCAqLworI2RlZmluZSBNVVNCX0xJTktJTkZPCQkweDdhCS8qIDggYml0ICovCisjZGVmaW5lIE1VU0JfVlBMRU4JCTB4N2IJLyogOCBiaXQgKi8KKyNkZWZpbmUgTVVTQl9IU19FT0YxCQkweDdjCS8qIDggYml0ICovCisjZGVmaW5lIE1VU0JfRlNfRU9GMQkJMHg3ZAkvKiA4IGJpdCAqLworI2RlZmluZSBNVVNCX0xTX0VPRjEJCTB4N2UJLyogOCBiaXQgKi8KKworLyogT2Zmc2V0cyB0byBlbmRwb2ludCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTVVTQl9UWE1BWFAJCTB4MDAKKyNkZWZpbmUgTVVTQl9UWENTUgkJMHgwMgorI2RlZmluZSBNVVNCX0NTUjAJCU1VU0JfVFhDU1IJLyogUmUtdXNlZCBmb3IgRVAwICovCisjZGVmaW5lIE1VU0JfUlhNQVhQCQkweDA0CisjZGVmaW5lIE1VU0JfUlhDU1IJCTB4MDYKKyNkZWZpbmUgTVVTQl9SWENPVU5UCQkweDA4CisjZGVmaW5lIE1VU0JfQ09VTlQwCQlNVVNCX1JYQ09VTlQJLyogUmUtdXNlZCBmb3IgRVAwICovCisjZGVmaW5lIE1VU0JfVFhUWVBFCQkweDBBCisjZGVmaW5lIE1VU0JfVFlQRTAJCU1VU0JfVFhUWVBFCS8qIFJlLXVzZWQgZm9yIEVQMCAqLworI2RlZmluZSBNVVNCX1RYSU5URVJWQUwJCTB4MEIKKyNkZWZpbmUgTVVTQl9OQUtMSU1JVDAJCU1VU0JfVFhJTlRFUlZBTAkvKiBSZS11c2VkIGZvciBFUDAgKi8KKyNkZWZpbmUgTVVTQl9SWFRZUEUJCTB4MEMKKyNkZWZpbmUgTVVTQl9SWElOVEVSVkFMCQkweDBECisjZGVmaW5lIE1VU0JfRklGT1NJWkUJCTB4MEYKKyNkZWZpbmUgTVVTQl9DT05GSUdEQVRBCQlNVVNCX0ZJRk9TSVpFCS8qIFJlLXVzZWQgZm9yIEVQMCAqLworCisvKiBPZmZzZXRzIHRvIGVuZHBvaW50IHJlZ2lzdGVycyBpbiBpbmRleGVkIG1vZGVsICh1c2luZyBJTkRFWCByZWdpc3RlcikgKi8KKyNkZWZpbmUgTVVTQl9JTkRFWEVEX09GRlNFVChfZXBudW0sIF9vZmZzZXQpCVwKKwkoMHgxMCArIChfb2Zmc2V0KSkKKworLyogT2Zmc2V0cyB0byBlbmRwb2ludCByZWdpc3RlcnMgaW4gZmxhdCBtb2RlbHMgKi8KKyNkZWZpbmUgTVVTQl9GTEFUX09GRlNFVChfZXBudW0sIF9vZmZzZXQpCVwKKwkoMHgxMDAgKyAoMHgxMCooX2VwbnVtKSkgKyAoX29mZnNldCkpCisKKyNpZmRlZiBDT05GSUdfVVNCX1RVU0I2MDEwCisvKiBUVVNCNjAxMCBFUDAgY29uZmlndXJhdGlvbiByZWdpc3RlciBpcyBzcGVjaWFsICovCisjZGVmaW5lIE1VU0JfVFVTQl9PRkZTRVQoX2VwbnVtLCBfb2Zmc2V0KQlcCisJKDB4MTAgKyBfb2Zmc2V0KQorI2luY2x1ZGUgInR1c2I2MDEwLmgiCQkvKiBOZWVkZWQgIm9ubHkiIGZvciBUVVNCX0VQMF9DT05GICovCisjZW5kaWYKKworI2RlZmluZSBNVVNCX1RYQ1NSX01PREUJCQkweDIwMDAKKworLyogImJ1cyBjb250cm9sIi90YXJnZXQgcmVnaXN0ZXJzLCBmb3IgaG9zdCBzaWRlIG11bHRpcG9pbnQgKGV4dGVybmFsIGh1YnMpICovCisjZGVmaW5lIE1VU0JfVFhGVU5DQUREUgkJMHgwMAorI2RlZmluZSBNVVNCX1RYSFVCQUREUgkJMHgwMgorI2RlZmluZSBNVVNCX1RYSFVCUE9SVAkJMHgwMworCisjZGVmaW5lIE1VU0JfUlhGVU5DQUREUgkJMHgwNAorI2RlZmluZSBNVVNCX1JYSFVCQUREUgkJMHgwNgorI2RlZmluZSBNVVNCX1JYSFVCUE9SVAkJMHgwNworCisjZGVmaW5lIE1VU0JfQlVTQ1RMX09GRlNFVChfZXBudW0sIF9vZmZzZXQpIFwKKwkoMHg4MCArICg4KihfZXBudW0pKSArIChfb2Zmc2V0KSkKKworc3RhdGljIGlubGluZSB2b2lkIG11c2Jfd3JpdGVfdHhmaWZvc3oodm9pZCBfX2lvbWVtICptYmFzZSwgdTggY19zaXplKQoreworCW11c2Jfd3JpdGViKG1iYXNlLCBNVVNCX1RYRklGT1NaLCBjX3NpemUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXVzYl93cml0ZV90eGZpZm9hZGQodm9pZCBfX2lvbWVtICptYmFzZSwgdTE2IGNfb2ZmKQoreworCW11c2Jfd3JpdGV3KG1iYXNlLCBNVVNCX1RYRklGT0FERCwgY19vZmYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXVzYl93cml0ZV9yeGZpZm9zeih2b2lkIF9faW9tZW0gKm1iYXNlLCB1OCBjX3NpemUpCit7CisJbXVzYl93cml0ZWIobWJhc2UsIE1VU0JfUlhGSUZPU1osIGNfc2l6ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAgbXVzYl93cml0ZV9yeGZpZm9hZGQodm9pZCBfX2lvbWVtICptYmFzZSwgdTE2IGNfb2ZmKQoreworCW11c2Jfd3JpdGV3KG1iYXNlLCBNVVNCX1JYRklGT0FERCwgY19vZmYpOworfQorCitzdGF0aWMgaW5saW5lIHU4IG11c2JfcmVhZF9jb25maWdkYXRhKHZvaWQgX19pb21lbSAqbWJhc2UpCit7CisJcmV0dXJuIG11c2JfcmVhZGIobWJhc2UsIDB4MTAgKyBNVVNCX0NPTkZJR0RBVEEpOworfQorCitzdGF0aWMgaW5saW5lIHUxNiBtdXNiX3JlYWRfaHd2ZXJzKHZvaWQgX19pb21lbSAqbWJhc2UpCit7CisJcmV0dXJuIG11c2JfcmVhZHcobWJhc2UsIE1VU0JfSFdWRVJTKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9faW9tZW0gKm11c2JfcmVhZF90YXJnZXRfcmVnX2Jhc2UodTggaSwgdm9pZCBfX2lvbWVtICptYmFzZSkKK3sKKwlyZXR1cm4gKE1VU0JfQlVTQ1RMX09GRlNFVChpLCAwKSArIG1iYXNlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG11c2Jfd3JpdGVfcnhmdW5hZGRyKHZvaWQgX19pb21lbSAqZXBfdGFyZ2V0X3JlZ3MsCisJCXU4IHFoX2FkZHJfcmVnKQoreworCW11c2Jfd3JpdGViKGVwX3RhcmdldF9yZWdzLCBNVVNCX1JYRlVOQ0FERFIsIHFoX2FkZHJfcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG11c2Jfd3JpdGVfcnhodWJhZGRyKHZvaWQgX19pb21lbSAqZXBfdGFyZ2V0X3JlZ3MsCisJCXU4IHFoX2hfYWRkcl9yZWcpCit7CisJbXVzYl93cml0ZWIoZXBfdGFyZ2V0X3JlZ3MsIE1VU0JfUlhIVUJBRERSLCBxaF9oX2FkZHJfcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG11c2Jfd3JpdGVfcnhodWJwb3J0KHZvaWQgX19pb21lbSAqZXBfdGFyZ2V0X3JlZ3MsCisJCXU4IHFoX2hfcG9ydF9yZWcpCit7CisJbXVzYl93cml0ZWIoZXBfdGFyZ2V0X3JlZ3MsIE1VU0JfUlhIVUJQT1JULCBxaF9oX3BvcnRfcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICBtdXNiX3dyaXRlX3R4ZnVuYWRkcih2b2lkIF9faW9tZW0gKm1iYXNlLCB1OCBlcG51bSwKKwkJdTggcWhfYWRkcl9yZWcpCit7CisJbXVzYl93cml0ZWIobWJhc2UsIE1VU0JfQlVTQ1RMX09GRlNFVChlcG51bSwgTVVTQl9UWEZVTkNBRERSKSwKKwkJCXFoX2FkZHJfcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICBtdXNiX3dyaXRlX3R4aHViYWRkcih2b2lkIF9faW9tZW0gKm1iYXNlLCB1OCBlcG51bSwKKwkJdTggcWhfYWRkcl9yZWcpCit7CisJbXVzYl93cml0ZWIobWJhc2UsIE1VU0JfQlVTQ1RMX09GRlNFVChlcG51bSwgTVVTQl9UWEhVQkFERFIpLAorCQkJcWhfYWRkcl9yZWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgIG11c2Jfd3JpdGVfdHhodWJwb3J0KHZvaWQgX19pb21lbSAqbWJhc2UsIHU4IGVwbnVtLAorCQl1OCBxaF9oX3BvcnRfcmVnKQoreworCW11c2Jfd3JpdGViKG1iYXNlLCBNVVNCX0JVU0NUTF9PRkZTRVQoZXBudW0sIE1VU0JfVFhIVUJQT1JUKSwKKwkJCXFoX2hfcG9ydF9yZWcpOworfQorCisjZWxzZSAvKiBDT05GSUdfQkxBQ0tGSU4gKi8KKworI2RlZmluZSBVU0JfQkFTRQkJVVNCX0ZBRERSCisjZGVmaW5lIFVTQl9PRkZTRVQocmVnKQkJKHJlZyAtIFVTQl9CQVNFKQorCisvKgorICogQ29tbW9uIFVTQiByZWdpc3RlcnMKKyAqLworI2RlZmluZSBNVVNCX0ZBRERSCQlVU0JfT0ZGU0VUKFVTQl9GQUREUikJLyogOC1iaXQgKi8KKyNkZWZpbmUgTVVTQl9QT1dFUgkJVVNCX09GRlNFVChVU0JfUE9XRVIpCS8qIDgtYml0ICovCisjZGVmaW5lIE1VU0JfSU5UUlRYCQlVU0JfT0ZGU0VUKFVTQl9JTlRSVFgpCS8qIDE2LWJpdCAqLworI2RlZmluZSBNVVNCX0lOVFJSWAkJVVNCX09GRlNFVChVU0JfSU5UUlJYKQorI2RlZmluZSBNVVNCX0lOVFJUWEUJCVVTQl9PRkZTRVQoVVNCX0lOVFJUWEUpCisjZGVmaW5lIE1VU0JfSU5UUlJYRQkJVVNCX09GRlNFVChVU0JfSU5UUlJYRSkKKyNkZWZpbmUgTVVTQl9JTlRSVVNCCQlVU0JfT0ZGU0VUKFVTQl9JTlRSVVNCKQkvKiA4IGJpdCAqLworI2RlZmluZSBNVVNCX0lOVFJVU0JFCQlVU0JfT0ZGU0VUKFVTQl9JTlRSVVNCRSkvKiA4IGJpdCAqLworI2RlZmluZSBNVVNCX0ZSQU1FCQlVU0JfT0ZGU0VUKFVTQl9GUkFNRSkKKyNkZWZpbmUgTVVTQl9JTkRFWAkJVVNCX09GRlNFVChVU0JfSU5ERVgpCS8qIDggYml0ICovCisjZGVmaW5lIE1VU0JfVEVTVE1PREUJCVVTQl9PRkZTRVQoVVNCX1RFU1RNT0RFKS8qIDggYml0ICovCisKKy8qIEdldCBvZmZzZXQgZm9yIGEgZ2l2ZW4gRklGTyBmcm9tIG11c2ItPm1yZWdzICovCisjZGVmaW5lIE1VU0JfRklGT19PRkZTRVQoZXBudW0pCVwKKwkoVVNCX09GRlNFVChVU0JfRVAwX0ZJRk8pICsgKChlcG51bSkgKiA4KSkKKworLyoKKyAqIEFkZGl0aW9uYWwgQ29udHJvbCBSZWdpc3RlcnMKKyAqLworCisjZGVmaW5lIE1VU0JfREVWQ1RMCQlVU0JfT0ZGU0VUKFVTQl9PVEdfREVWX0NUTCkJLyogOCBiaXQgKi8KKworI2RlZmluZSBNVVNCX0xJTktJTkZPCQlVU0JfT0ZGU0VUKFVTQl9MSU5LSU5GTykvKiA4IGJpdCAqLworI2RlZmluZSBNVVNCX1ZQTEVOCQlVU0JfT0ZGU0VUKFVTQl9WUExFTikJLyogOCBiaXQgKi8KKyNkZWZpbmUgTVVTQl9IU19FT0YxCQlVU0JfT0ZGU0VUKFVTQl9IU19FT0YxKQkvKiA4IGJpdCAqLworI2RlZmluZSBNVVNCX0ZTX0VPRjEJCVVTQl9PRkZTRVQoVVNCX0ZTX0VPRjEpCS8qIDggYml0ICovCisjZGVmaW5lIE1VU0JfTFNfRU9GMQkJVVNCX09GRlNFVChVU0JfTFNfRU9GMSkJLyogOCBiaXQgKi8KKworLyogT2Zmc2V0cyB0byBlbmRwb2ludCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTVVTQl9UWE1BWFAJCTB4MDAKKyNkZWZpbmUgTVVTQl9UWENTUgkJMHgwNAorI2RlZmluZSBNVVNCX0NTUjAJCU1VU0JfVFhDU1IJLyogUmUtdXNlZCBmb3IgRVAwICovCisjZGVmaW5lIE1VU0JfUlhNQVhQCQkweDA4CisjZGVmaW5lIE1VU0JfUlhDU1IJCTB4MEMKKyNkZWZpbmUgTVVTQl9SWENPVU5UCQkweDEwCisjZGVmaW5lIE1VU0JfQ09VTlQwCQlNVVNCX1JYQ09VTlQJLyogUmUtdXNlZCBmb3IgRVAwICovCisjZGVmaW5lIE1VU0JfVFhUWVBFCQkweDE0CisjZGVmaW5lIE1VU0JfVFlQRTAJCU1VU0JfVFhUWVBFCS8qIFJlLXVzZWQgZm9yIEVQMCAqLworI2RlZmluZSBNVVNCX1RYSU5URVJWQUwJCTB4MTgKKyNkZWZpbmUgTVVTQl9OQUtMSU1JVDAJCU1VU0JfVFhJTlRFUlZBTAkvKiBSZS11c2VkIGZvciBFUDAgKi8KKyNkZWZpbmUgTVVTQl9SWFRZUEUJCTB4MUMKKyNkZWZpbmUgTVVTQl9SWElOVEVSVkFMCQkweDIwCisjZGVmaW5lIE1VU0JfVFhDT1VOVAkJMHgyOAorCisvKiBPZmZzZXRzIHRvIGVuZHBvaW50IHJlZ2lzdGVycyBpbiBpbmRleGVkIG1vZGVsICh1c2luZyBJTkRFWCByZWdpc3RlcikgKi8KKyNkZWZpbmUgTVVTQl9JTkRFWEVEX09GRlNFVChfZXBudW0sIF9vZmZzZXQpCVwKKwkoMHg0MCArIChfb2Zmc2V0KSkKKworLyogT2Zmc2V0cyB0byBlbmRwb2ludCByZWdpc3RlcnMgaW4gZmxhdCBtb2RlbHMgKi8KKyNkZWZpbmUgTVVTQl9GTEFUX09GRlNFVChfZXBudW0sIF9vZmZzZXQpCVwKKwkoVVNCX09GRlNFVChVU0JfRVBfTkkwX1RYTUFYUCkgKyAoMHg0MCAqIChfZXBudW0pKSArIChfb2Zmc2V0KSkKKworLyogTm90IGltcGxlbWVudGVkIC0gSFcgaGFzIHNlcGVyYXRlIFR4L1J4IEZJRk8gKi8KKyNkZWZpbmUgTVVTQl9UWENTUl9NT0RFCQkJMHgwMDAwCisKKy8qCisgKiBEdW1teSBzdHViIGZvciBjbGsgZnJhbWV3b3JrLCBpdCB3aWxsIGJlIHJlbW92ZWQKKyAqIHVudGlsIEJsYWNrZmluIHN1cHBvcnRzIGNsayBmcmFtZXdvcmsKKyAqLworI2RlZmluZSBjbGtfZ2V0KGRldiwgaWQpCU5VTEwKKyNkZWZpbmUgY2xrX3B1dChjbG9jaykJCWRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBjbGtfZW5hYmxlKGNsb2NrKQlkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgY2xrX2Rpc2FibGUoY2xvY2spCWRvIHt9IHdoaWxlICgwKQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXVzYl93cml0ZV90eGZpZm9zeih2b2lkIF9faW9tZW0gKm1iYXNlLCB1OCBjX3NpemUpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtdXNiX3dyaXRlX3R4Zmlmb2FkZCh2b2lkIF9faW9tZW0gKm1iYXNlLCB1MTYgY19vZmYpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtdXNiX3dyaXRlX3J4Zmlmb3N6KHZvaWQgX19pb21lbSAqbWJhc2UsIHU4IGNfc2l6ZSkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkICBtdXNiX3dyaXRlX3J4Zmlmb2FkZCh2b2lkIF9faW9tZW0gKm1iYXNlLCB1MTYgY19vZmYpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggbXVzYl9yZWFkX2NvbmZpZ2RhdGEodm9pZCBfX2lvbWVtICptYmFzZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB1MTYgbXVzYl9yZWFkX2h3dmVycyh2b2lkIF9faW9tZW0gKm1iYXNlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHUxNiBtdXNiX3JlYWRfdGFyZ2V0X3JlZ19iYXNlKHU4IGksIHZvaWQgX19pb21lbSAqbWJhc2UpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtdXNiX3dyaXRlX3J4ZnVuYWRkcih2b2lkIF9faW9tZW0gKmVwX3RhcmdldF9yZWdzLAorCQl1OCBxaF9hZGRyX3JlcSkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIG11c2Jfd3JpdGVfcnhodWJhZGRyKHZvaWQgX19pb21lbSAqZXBfdGFyZ2V0X3JlZ3MsCisJCXU4IHFoX2hfYWRkcl9yZWcpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtdXNiX3dyaXRlX3J4aHVicG9ydCh2b2lkIF9faW9tZW0gKmVwX3RhcmdldF9yZWdzLAorCQl1OCBxaF9oX3BvcnRfcmVnKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgIG11c2Jfd3JpdGVfdHhmdW5hZGRyKHZvaWQgX19pb21lbSAqbWJhc2UsIHU4IGVwbnVtLAorCQl1OCBxaF9hZGRyX3JlZykKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkICBtdXNiX3dyaXRlX3R4aHViYWRkcih2b2lkIF9faW9tZW0gKm1iYXNlLCB1OCBlcG51bSwKKwkJdTggcWhfYWRkcl9yZWcpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAgbXVzYl93cml0ZV90eGh1YnBvcnQodm9pZCBfX2lvbWVtICptYmFzZSwgdTggZXBudW0sCisJCXU4IHFoX2hfcG9ydF9yZWcpCit7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfQkxBQ0tGSU4gKi8KKwogI2VuZGlmCS8qIF9fTVVTQl9SRUdTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiaHNkbWEuYyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYmhzZG1hLmMKaW5kZXggOGM3MzRlZi4uODY2MmU5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiaHNkbWEuYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2Joc2RtYS5jCkBAIC0zNCw1OCArMzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgIm11c2JfY29yZS5oIgotCi0jaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMjQzMCkgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMzQzMCkKLSNpbmNsdWRlICJvbWFwMjQzMC5oIgotI2VuZGlmCi0KLSNkZWZpbmUgTVVTQl9IU0RNQV9CQVNFCQkweDIwMAotI2RlZmluZSBNVVNCX0hTRE1BX0lOVFIJCShNVVNCX0hTRE1BX0JBU0UgKyAwKQotI2RlZmluZSBNVVNCX0hTRE1BX0NPTlRST0wJCTB4NAotI2RlZmluZSBNVVNCX0hTRE1BX0FERFJFU1MJCTB4OAotI2RlZmluZSBNVVNCX0hTRE1BX0NPVU5UCQkweGMKLQotI2RlZmluZSBNVVNCX0hTRE1BX0NIQU5ORUxfT0ZGU0VUKF9iY2hhbm5lbCwgX29mZnNldCkJCVwKLQkJKE1VU0JfSFNETUFfQkFTRSArIChfYmNoYW5uZWwgPDwgNCkgKyBfb2Zmc2V0KQotCi0vKiBjb250cm9sIHJlZ2lzdGVyICgxNi1iaXQpOiAqLwotI2RlZmluZSBNVVNCX0hTRE1BX0VOQUJMRV9TSElGVAkJMAotI2RlZmluZSBNVVNCX0hTRE1BX1RSQU5TTUlUX1NISUZUCQkxCi0jZGVmaW5lIE1VU0JfSFNETUFfTU9ERTFfU0hJRlQJCTIKLSNkZWZpbmUgTVVTQl9IU0RNQV9JUlFFTkFCTEVfU0hJRlQJCTMKLSNkZWZpbmUgTVVTQl9IU0RNQV9FTkRQT0lOVF9TSElGVAkJNAotI2RlZmluZSBNVVNCX0hTRE1BX0JVU0VSUk9SX1NISUZUCQk4Ci0jZGVmaW5lIE1VU0JfSFNETUFfQlVSU1RNT0RFX1NISUZUCQk5Ci0jZGVmaW5lIE1VU0JfSFNETUFfQlVSU1RNT0RFCQkoMyA8PCBNVVNCX0hTRE1BX0JVUlNUTU9ERV9TSElGVCkKLSNkZWZpbmUgTVVTQl9IU0RNQV9CVVJTVE1PREVfVU5TUEVDCTAKLSNkZWZpbmUgTVVTQl9IU0RNQV9CVVJTVE1PREVfSU5DUjQJMQotI2RlZmluZSBNVVNCX0hTRE1BX0JVUlNUTU9ERV9JTkNSOAkyCi0jZGVmaW5lIE1VU0JfSFNETUFfQlVSU1RNT0RFX0lOQ1IxNgkzCi0KLSNkZWZpbmUgTVVTQl9IU0RNQV9DSEFOTkVMUwkJOAotCi1zdHJ1Y3QgbXVzYl9kbWFfY29udHJvbGxlcjsKLQotc3RydWN0IG11c2JfZG1hX2NoYW5uZWwgewotCXN0cnVjdCBkbWFfY2hhbm5lbAkJY2hhbm5lbDsKLQlzdHJ1Y3QgbXVzYl9kbWFfY29udHJvbGxlcgkqY29udHJvbGxlcjsKLQl1MzIJCQkJc3RhcnRfYWRkcjsKLQl1MzIJCQkJbGVuOwotCXUxNgkJCQltYXhfcGFja2V0X3N6OwotCXU4CQkJCWlkeDsKLQl1OAkJCQllcG51bTsKLQl1OAkJCQl0cmFuc21pdDsKLX07Ci0KLXN0cnVjdCBtdXNiX2RtYV9jb250cm9sbGVyIHsKLQlzdHJ1Y3QgZG1hX2NvbnRyb2xsZXIJCWNvbnRyb2xsZXI7Ci0Jc3RydWN0IG11c2JfZG1hX2NoYW5uZWwJCWNoYW5uZWxbTVVTQl9IU0RNQV9DSEFOTkVMU107Ci0Jdm9pZAkJCQkqcHJpdmF0ZV9kYXRhOwotCXZvaWQgX19pb21lbQkJCSpiYXNlOwotCXU4CQkJCWNoYW5uZWxfY291bnQ7Ci0JdTgJCQkJdXNlZF9jaGFubmVsczsKLQl1OAkJCQlpcnE7Ci19OworI2luY2x1ZGUgIm11c2Joc2RtYS5oIgogCiBzdGF0aWMgaW50IGRtYV9jb250cm9sbGVyX3N0YXJ0KHN0cnVjdCBkbWFfY29udHJvbGxlciAqYykKIHsKQEAgLTIwMywxMiArMTUyLDggQEAKIAkJCQk6IDApOwogCiAJLyogYWRkcmVzcy9jb3VudCAqLwotCW11c2Jfd3JpdGVsKG1iYXNlLAotCQlNVVNCX0hTRE1BX0NIQU5ORUxfT0ZGU0VUKGJjaGFubmVsLCBNVVNCX0hTRE1BX0FERFJFU1MpLAotCQlkbWFfYWRkcik7Ci0JbXVzYl93cml0ZWwobWJhc2UsCi0JCU1VU0JfSFNETUFfQ0hBTk5FTF9PRkZTRVQoYmNoYW5uZWwsIE1VU0JfSFNETUFfQ09VTlQpLAotCQlsZW4pOworCW11c2Jfd3JpdGVfaHNkbWFfYWRkcihtYmFzZSwgYmNoYW5uZWwsIGRtYV9hZGRyKTsKKwltdXNiX3dyaXRlX2hzZG1hX2NvdW50KG1iYXNlLCBiY2hhbm5lbCwgbGVuKTsKIAogCS8qIGNvbnRyb2wgKHRoaXMgc2hvdWxkIHN0YXJ0IHRoaW5ncykgKi8KIAltdXNiX3dyaXRldyhtYmFzZSwKQEAgLTI3OSwxMyArMjI0LDggQEAKIAkJbXVzYl93cml0ZXcobWJhc2UsCiAJCQlNVVNCX0hTRE1BX0NIQU5ORUxfT0ZGU0VUKGJjaGFubmVsLCBNVVNCX0hTRE1BX0NPTlRST0wpLAogCQkJMCk7Ci0JCW11c2Jfd3JpdGVsKG1iYXNlLAotCQkJTVVTQl9IU0RNQV9DSEFOTkVMX09GRlNFVChiY2hhbm5lbCwgTVVTQl9IU0RNQV9BRERSRVNTKSwKLQkJCTApOwotCQltdXNiX3dyaXRlbChtYmFzZSwKLQkJCU1VU0JfSFNETUFfQ0hBTk5FTF9PRkZTRVQoYmNoYW5uZWwsIE1VU0JfSFNETUFfQ09VTlQpLAotCQkJMCk7Ci0KKwkJbXVzYl93cml0ZV9oc2RtYV9hZGRyKG1iYXNlLCBiY2hhbm5lbCwgMCk7CisJCW11c2Jfd3JpdGVfaHNkbWFfY291bnQobWJhc2UsIGJjaGFubmVsLCAwKTsKIAkJY2hhbm5lbC0+c3RhdHVzID0gTVVTQl9ETUFfU1RBVFVTX0ZSRUU7CiAJfQogCkBAIC0zMzMsMTAgKzI3Myw4IEBACiAJCQl9IGVsc2UgewogCQkJCXU4IGRldmN0bDsKIAotCQkJCWFkZHIgPSBtdXNiX3JlYWRsKG1iYXNlLAotCQkJCQkJTVVTQl9IU0RNQV9DSEFOTkVMX09GRlNFVCgKLQkJCQkJCQliY2hhbm5lbCwKLQkJCQkJCQlNVVNCX0hTRE1BX0FERFJFU1MpKTsKKwkJCQlhZGRyID0gbXVzYl9yZWFkX2hzZG1hX2FkZHIobWJhc2UsCisJCQkJCQliY2hhbm5lbCk7CiAJCQkJY2hhbm5lbC0+YWN0dWFsX2xlbiA9IGFkZHIKIAkJCQkJLSBtdXNiX2NoYW5uZWwtPnN0YXJ0X2FkZHI7CiAKQEAgLTM3NSw2ICszMTMsMTIgQEAKIAkJCX0KIAkJfQogCX0KKworI2lmZGVmIENPTkZJR19CTEFDS0ZJTgorCS8qIENsZWFyIERNQSBpbnRlcnJ1cCBmbGFncyAqLworCW11c2Jfd3JpdGViKG1iYXNlLCBNVVNCX0hTRE1BX0lOVFIsIGludF9oc2RtYSk7CisjZW5kaWYKKwogCXJldHZhbCA9IElSUV9IQU5ETEVEOwogZG9uZToKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtdXNiLT5sb2NrLCBmbGFncyk7CkBAIC00MjQsNyArMzY4LDcgQEAKIAljb250cm9sbGVyLT5jb250cm9sbGVyLmNoYW5uZWxfYWJvcnQgPSBkbWFfY2hhbm5lbF9hYm9ydDsKIAogCWlmIChyZXF1ZXN0X2lycShpcnEsIGRtYV9jb250cm9sbGVyX2lycSwgSVJRRl9ESVNBQkxFRCwKLQkJCW11c2ItPmNvbnRyb2xsZXItPmJ1c19pZCwgJmNvbnRyb2xsZXItPmNvbnRyb2xsZXIpKSB7CisJCQlkZXZfbmFtZShtdXNiLT5jb250cm9sbGVyKSwgJmNvbnRyb2xsZXItPmNvbnRyb2xsZXIpKSB7CiAJCWRldl9lcnIoZGV2LCAicmVxdWVzdF9pcnEgJWQgZmFpbGVkIVxuIiwgaXJxKTsKIAkJZG1hX2NvbnRyb2xsZXJfZGVzdHJveSgmY29udHJvbGxlci0+Y29udHJvbGxlcik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvbXVzYmhzZG1hLmggYi9kcml2ZXJzL3VzYi9tdXNiL211c2Joc2RtYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyOTlkOTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2Joc2RtYS5oCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogTVVTQiBPVEcgZHJpdmVyIC0gc3VwcG9ydCBmb3IgTWVudG9yJ3MgRE1BIGNvbnRyb2xsZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAwNSBNZW50b3IgR3JhcGhpY3MgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA3IGJ5IFRleGFzIEluc3RydW1lbnRzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgorICogTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyNDMwKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAzNDMwKQorI2luY2x1ZGUgIm9tYXAyNDMwLmgiCisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfQkxBQ0tGSU4KKworI2RlZmluZSBNVVNCX0hTRE1BX0JBU0UJCTB4MjAwCisjZGVmaW5lIE1VU0JfSFNETUFfSU5UUgkJKE1VU0JfSFNETUFfQkFTRSArIDApCisjZGVmaW5lIE1VU0JfSFNETUFfQ09OVFJPTAkJMHg0CisjZGVmaW5lIE1VU0JfSFNETUFfQUREUkVTUwkJMHg4CisjZGVmaW5lIE1VU0JfSFNETUFfQ09VTlQJCTB4YworCisjZGVmaW5lIE1VU0JfSFNETUFfQ0hBTk5FTF9PRkZTRVQoX2JjaGFubmVsLCBfb2Zmc2V0KQkJXAorCQkoTVVTQl9IU0RNQV9CQVNFICsgKF9iY2hhbm5lbCA8PCA0KSArIF9vZmZzZXQpCisKKyNkZWZpbmUgbXVzYl9yZWFkX2hzZG1hX2FkZHIobWJhc2UsIGJjaGFubmVsKQlcCisJbXVzYl9yZWFkbChtYmFzZSwJXAorCQkgICBNVVNCX0hTRE1BX0NIQU5ORUxfT0ZGU0VUKGJjaGFubmVsLCBNVVNCX0hTRE1BX0FERFJFU1MpKQorCisjZGVmaW5lIG11c2Jfd3JpdGVfaHNkbWFfYWRkcihtYmFzZSwgYmNoYW5uZWwsIGFkZHIpIFwKKwltdXNiX3dyaXRlbChtYmFzZSwgXAorCQkgICAgTVVTQl9IU0RNQV9DSEFOTkVMX09GRlNFVChiY2hhbm5lbCwgTVVTQl9IU0RNQV9BRERSRVNTKSwgXAorCQkgICAgYWRkcikKKworI2RlZmluZSBtdXNiX3dyaXRlX2hzZG1hX2NvdW50KG1iYXNlLCBiY2hhbm5lbCwgbGVuKSBcCisJbXVzYl93cml0ZWwobWJhc2UsIFwKKwkJICAgIE1VU0JfSFNETUFfQ0hBTk5FTF9PRkZTRVQoYmNoYW5uZWwsIE1VU0JfSFNETUFfQ09VTlQpLCBcCisJCSAgICBsZW4pCisjZWxzZQorCisjZGVmaW5lIE1VU0JfSFNETUFfQkFTRQkJMHg0MDAKKyNkZWZpbmUgTVVTQl9IU0RNQV9JTlRSCQkoTVVTQl9IU0RNQV9CQVNFICsgMCkKKyNkZWZpbmUgTVVTQl9IU0RNQV9DT05UUk9MCQkweDA0CisjZGVmaW5lIE1VU0JfSFNETUFfQUREUl9MT1cJCTB4MDgKKyNkZWZpbmUgTVVTQl9IU0RNQV9BRERSX0hJR0gJCTB4MEMKKyNkZWZpbmUgTVVTQl9IU0RNQV9DT1VOVF9MT1cJCTB4MTAKKyNkZWZpbmUgTVVTQl9IU0RNQV9DT1VOVF9ISUdICQkweDE0CisKKyNkZWZpbmUgTVVTQl9IU0RNQV9DSEFOTkVMX09GRlNFVChfYmNoYW5uZWwsIF9vZmZzZXQpCQlcCisJCShNVVNCX0hTRE1BX0JBU0UgKyAoX2JjaGFubmVsICogMHgyMCkgKyBfb2Zmc2V0KQorCitzdGF0aWMgaW5saW5lIHUzMiBtdXNiX3JlYWRfaHNkbWFfYWRkcih2b2lkIF9faW9tZW0gKm1iYXNlLCB1OCBiY2hhbm5lbCkKK3sKKwl1MzIgYWRkciA9IG11c2JfcmVhZHcobWJhc2UsCisJCU1VU0JfSFNETUFfQ0hBTk5FTF9PRkZTRVQoYmNoYW5uZWwsIE1VU0JfSFNETUFfQUREUl9ISUdIKSk7CisKKwlhZGRyID0gYWRkciA8PCAxNjsKKworCWFkZHIgfD0gbXVzYl9yZWFkdyhtYmFzZSwKKwkJTVVTQl9IU0RNQV9DSEFOTkVMX09GRlNFVChiY2hhbm5lbCwgTVVTQl9IU0RNQV9BRERSX0xPVykpOworCisJcmV0dXJuIGFkZHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtdXNiX3dyaXRlX2hzZG1hX2FkZHIodm9pZCBfX2lvbWVtICptYmFzZSwKKwkJCQl1OCBiY2hhbm5lbCwgZG1hX2FkZHJfdCBkbWFfYWRkcikKK3sKKwltdXNiX3dyaXRldyhtYmFzZSwKKwkJTVVTQl9IU0RNQV9DSEFOTkVMX09GRlNFVChiY2hhbm5lbCwgTVVTQl9IU0RNQV9BRERSX0xPVyksCisJCSgodTE2KSgodTMyKSBkbWFfYWRkciAmIDB4RkZGRikpKTsKKwltdXNiX3dyaXRldyhtYmFzZSwKKwkJTVVTQl9IU0RNQV9DSEFOTkVMX09GRlNFVChiY2hhbm5lbCwgTVVTQl9IU0RNQV9BRERSX0hJR0gpLAorCQkoKHUxNikoKCh1MzIpIGRtYV9hZGRyID4+IDE2KSAmIDB4RkZGRikpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG11c2Jfd3JpdGVfaHNkbWFfY291bnQodm9pZCBfX2lvbWVtICptYmFzZSwKKwkJCQl1OCBiY2hhbm5lbCwgdTMyIGxlbikKK3sKKwltdXNiX3dyaXRldyhtYmFzZSwKKwkJTVVTQl9IU0RNQV9DSEFOTkVMX09GRlNFVChiY2hhbm5lbCwgTVVTQl9IU0RNQV9DT1VOVF9MT1cpLAorCQkoKHUxNikoKHUzMikgbGVuICYgMHhGRkZGKSkpOworCW11c2Jfd3JpdGV3KG1iYXNlLAorCQlNVVNCX0hTRE1BX0NIQU5ORUxfT0ZGU0VUKGJjaGFubmVsLCBNVVNCX0hTRE1BX0NPVU5UX0hJR0gpLAorCQkoKHUxNikoKCh1MzIpIGxlbiA+PiAxNikgJiAweEZGRkYpKSk7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfQkxBQ0tGSU4gKi8KKworLyogY29udHJvbCByZWdpc3RlciAoMTYtYml0KTogKi8KKyNkZWZpbmUgTVVTQl9IU0RNQV9FTkFCTEVfU0hJRlQJCTAKKyNkZWZpbmUgTVVTQl9IU0RNQV9UUkFOU01JVF9TSElGVAkxCisjZGVmaW5lIE1VU0JfSFNETUFfTU9ERTFfU0hJRlQJCTIKKyNkZWZpbmUgTVVTQl9IU0RNQV9JUlFFTkFCTEVfU0hJRlQJMworI2RlZmluZSBNVVNCX0hTRE1BX0VORFBPSU5UX1NISUZUCTQKKyNkZWZpbmUgTVVTQl9IU0RNQV9CVVNFUlJPUl9TSElGVAk4CisjZGVmaW5lIE1VU0JfSFNETUFfQlVSU1RNT0RFX1NISUZUCTkKKyNkZWZpbmUgTVVTQl9IU0RNQV9CVVJTVE1PREUJCSgzIDw8IE1VU0JfSFNETUFfQlVSU1RNT0RFX1NISUZUKQorI2RlZmluZSBNVVNCX0hTRE1BX0JVUlNUTU9ERV9VTlNQRUMJMAorI2RlZmluZSBNVVNCX0hTRE1BX0JVUlNUTU9ERV9JTkNSNAkxCisjZGVmaW5lIE1VU0JfSFNETUFfQlVSU1RNT0RFX0lOQ1I4CTIKKyNkZWZpbmUgTVVTQl9IU0RNQV9CVVJTVE1PREVfSU5DUjE2CTMKKworI2RlZmluZSBNVVNCX0hTRE1BX0NIQU5ORUxTCQk4CisKK3N0cnVjdCBtdXNiX2RtYV9jb250cm9sbGVyOworCitzdHJ1Y3QgbXVzYl9kbWFfY2hhbm5lbCB7CisJc3RydWN0IGRtYV9jaGFubmVsCQljaGFubmVsOworCXN0cnVjdCBtdXNiX2RtYV9jb250cm9sbGVyCSpjb250cm9sbGVyOworCXUzMgkJCQlzdGFydF9hZGRyOworCXUzMgkJCQlsZW47CisJdTE2CQkJCW1heF9wYWNrZXRfc3o7CisJdTgJCQkJaWR4OworCXU4CQkJCWVwbnVtOworCXU4CQkJCXRyYW5zbWl0OworfTsKKworc3RydWN0IG11c2JfZG1hX2NvbnRyb2xsZXIgeworCXN0cnVjdCBkbWFfY29udHJvbGxlcgkJY29udHJvbGxlcjsKKwlzdHJ1Y3QgbXVzYl9kbWFfY2hhbm5lbAkJY2hhbm5lbFtNVVNCX0hTRE1BX0NIQU5ORUxTXTsKKwl2b2lkCQkJCSpwcml2YXRlX2RhdGE7CisJdm9pZCBfX2lvbWVtCQkJKmJhc2U7CisJdTgJCQkJY2hhbm5lbF9jb3VudDsKKwl1OAkJCQl1c2VkX2NoYW5uZWxzOworCXU4CQkJCWlycTsKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL29tYXAyNDMwLmMgYi9kcml2ZXJzL3VzYi9tdXNiL29tYXAyNDMwLmMKaW5kZXggY2U2YzE2Mi4uOTAxZGZmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9vbWFwMjQzMC5jCisrKyBiL2RyaXZlcnMvdXNiL211c2Ivb21hcDI0MzAuYwpAQCAtNTgsMTAgKzU4LDEwIEBACiAjZW5kaWYKIAl1OAlkZXZjdGw7CiAKLQlkZXZjdGwgPSBtdXNiX3JlYWRiKG11c2ItPm1yZWdzLCBNVVNCX0RFVkNUTCk7Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmbXVzYi0+bG9jaywgZmxhZ3MpOwogCisJZGV2Y3RsID0gbXVzYl9yZWFkYihtdXNiLT5tcmVncywgTVVTQl9ERVZDVEwpOworCiAJc3dpdGNoIChtdXNiLT54Y2Vpdi5zdGF0ZSkgewogCWNhc2UgT1RHX1NUQVRFX0FfV0FJVF9CQ09OOgogCQlkZXZjdGwgJj0gfk1VU0JfREVWQ1RMX1NFU1NJT047CkBAIC0xOTYsNyArMTk2LDcgQEAKIAogc3RhdGljIGludCBtdXNiX3BsYXRmb3JtX3Jlc3VtZShzdHJ1Y3QgbXVzYiAqbXVzYik7CiAKLXZvaWQgbXVzYl9wbGF0Zm9ybV9zZXRfbW9kZShzdHJ1Y3QgbXVzYiAqbXVzYiwgdTggbXVzYl9tb2RlKQoraW50IG11c2JfcGxhdGZvcm1fc2V0X21vZGUoc3RydWN0IG11c2IgKm11c2IsIHU4IG11c2JfbW9kZSkKIHsKIAl1OAlkZXZjdGwgPSBtdXNiX3JlYWRiKG11c2ItPm1yZWdzLCBNVVNCX0RFVkNUTCk7CiAKQEAgLTIwNCwxNSArMjA0LDI0IEBACiAJbXVzYl93cml0ZWIobXVzYi0+bXJlZ3MsIE1VU0JfREVWQ1RMLCBkZXZjdGwpOwogCiAJc3dpdGNoIChtdXNiX21vZGUpIHsKKyNpZmRlZiBDT05GSUdfVVNCX01VU0JfSERSQ19IQ0QKIAljYXNlIE1VU0JfSE9TVDoKIAkJb3RnX3NldF9ob3N0KCZtdXNiLT54Y2VpdiwgbXVzYi0+eGNlaXYuaG9zdCk7CiAJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfTVVTQl9IRFJDCiAJY2FzZSBNVVNCX1BFUklQSEVSQUw6CiAJCW90Z19zZXRfcGVyaXBoZXJhbCgmbXVzYi0+eGNlaXYsIG11c2ItPnhjZWl2LmdhZGdldCk7CiAJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1VTQl9NVVNCX09URwogCWNhc2UgTVVTQl9PVEc6CiAJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQorCXJldHVybiAwOwogfQogCiBpbnQgX19pbml0IG11c2JfcGxhdGZvcm1faW5pdChzdHJ1Y3QgbXVzYiAqbXVzYikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvdHVzYjYwMTAuYyBiL2RyaXZlcnMvdXNiL211c2IvdHVzYjYwMTAuYwppbmRleCBlZThmY2E5Li45ZTIwZmQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL3R1c2I2MDEwLmMKKysrIGIvZHJpdmVycy91c2IvbXVzYi90dXNiNjAxMC5jCkBAIC01OTgsNyArNTk4LDcgQEAKICAqIGFuZCBwZXJpcGhlcmFsIG1vZGVzIGluIG5vbi1PVEcgY29uZmlndXJhdGlvbnMgYnkgcmVjb25maWd1cmluZyBoYXJkd2FyZQogICogYW5kIHRoZW4gc2V0dGluZyBtdXNiLT5ib2FyZF9tb2RlLiBGb3Igbm93LCBvbmx5IHN1cHBvcnQgT1RHIG1vZGUuCiAgKi8KLXZvaWQgbXVzYl9wbGF0Zm9ybV9zZXRfbW9kZShzdHJ1Y3QgbXVzYiAqbXVzYiwgdTggbXVzYl9tb2RlKQoraW50IG11c2JfcGxhdGZvcm1fc2V0X21vZGUoc3RydWN0IG11c2IgKm11c2IsIHU4IG11c2JfbW9kZSkKIHsKIAl2b2lkIF9faW9tZW0JKnRiYXNlID0gbXVzYi0+Y3RybF9iYXNlOwogCXUzMgkJb3RnX3N0YXQsIHBoeV9vdGdfY3RybCwgcGh5X290Z19lbmEsIGRldl9jb25mOwpAQCAtNjQxLDcgKzY0MSw4IEBACiAjZW5kaWYKIAogCWRlZmF1bHQ6Ci0JCURCRygyLCAiVHJ5aW5nIHRvIHNldCB1bmtub3duIG1vZGUgJWlcbiIsIG11c2JfbW9kZSk7CisJCURCRygyLCAiVHJ5aW5nIHRvIHNldCBtb2RlICVpXG4iLCBtdXNiX21vZGUpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAltdXNiX3dyaXRlbCh0YmFzZSwgVFVTQl9QSFlfT1RHX0NUUkwsCkBAIC02NTUsNiArNjU2LDggQEAKIAkJIShvdGdfc3RhdCAmIFRVU0JfREVWX09UR19TVEFUX0lEX1NUQVRVUykpCiAJCQlJTkZPKCJDYW5ub3QgYmUgcGVyaXBoZXJhbCB3aXRoIG1pbmktQSBjYWJsZSAiCiAJCQkib3RnX3N0YXQ6ICUwOHhcbiIsIG90Z19zdGF0KTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL290Zy9LY29uZmlnIGIvZHJpdmVycy91c2Ivb3RnL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU4ZGJkYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL290Zy9LY29uZmlnCkBAIC0wLDAgKzEsNTQgQEAKKyMKKyMgVVNCIE9URyBpbmZyYXN0cnVjdHVyZSBtYXkgYmUgbmVlZGVkIGZvciBwZXJpcGhlcmFsLW9ubHksIGhvc3Qtb25seSwKKyMgb3IgT1RHLWNhcGFibGUgY29uZmlndXJhdGlvbnMgd2hlbiBPVEcgdHJhbnNjZWl2ZXJzIG9yIGNvbnRyb2xsZXJzCisjIGFyZSB1c2VkLgorIworCitjb21tZW50ICJPVEcgYW5kIHJlbGF0ZWQgaW5mcmFzdHJ1Y3R1cmUiCisKK2lmIFVTQiB8fCBVU0JfR0FER0VUCisKK2NvbmZpZyBVU0JfT1RHX1VUSUxTCisJYm9vbAorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIHRvIG1ha2Ugc3VyZSB0aGUgYnVpbGQgaW5jbHVkZXMgb2JqZWN0cyBmcm9tCisJICB0aGUgT1RHIGluZnJhc3RydWN0dXJlIGRpcmVjdG9yeS4KKworIworIyBVU0IgVHJhbnNjZWl2ZXIgRHJpdmVycworIworY29uZmlnIFVTQl9HUElPX1ZCVVMKKwl0cmlzdGF0ZSAiR1BJTyBiYXNlZCBwZXJpcGhlcmFsLW9ubHkgVkJVUyBzZW5zaW5nICd0cmFuc2NlaXZlciciCisJZGVwZW5kcyBvbiBHRU5FUklDX0dQSU8KKwlzZWxlY3QgVVNCX09UR19VVElMUworCWhlbHAKKwkgIFByb3ZpZGVzIHNpbXBsZSBHUElPIFZCVVMgc2Vuc2luZyBmb3IgY29udHJvbGxlcnMgd2l0aCBhbgorCSAgaW50ZXJuYWwgdHJhbnNjZWl2ZXIgdmlhIHRoZSBvdGdfdHJhbnNjZWl2ZXIgaW50ZXJmYWNlLCBhbmQKKwkgIG9wdGlvbmFsbHkgY29udHJvbCBvZiBhIEQrIHB1bGx1cCBHUElPIGFzIHdlbGwgYXMgYSBWQlVTCisJICBjdXJyZW50IGxpbWl0IHJlZ3VsYXRvci4KKworY29uZmlnIElTUDEzMDFfT01BUAorCXRyaXN0YXRlICJQaGlsaXBzIElTUDEzMDEgd2l0aCBPTUFQIE9URyIKKwlkZXBlbmRzIG9uIEkyQyAmJiBBUkNIX09NQVBfT1RHCisJc2VsZWN0IFVTQl9PVEdfVVRJTFMKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIFBoaWxpcHMgSVNQMTMwMQorCSAgVVNCLU9uLVRoZS1HbyB0cmFuc2NlaXZlciB3b3JraW5nIHdpdGggdGhlIE9NQVAgT1RHIGNvbnRyb2xsZXIuCisJICBUaGUgSVNQMTMwMSBpcyBhIGZ1bGwgc3BlZWQgVVNCICB0cmFuc2NlaXZlciB3aGljaCBpcyB1c2VkIGluCisJICBwcm9kdWN0cyBpbmNsdWRpbmcgSDIsIEgzLCBhbmQgSDQgZGV2ZWxvcG1lbnQgYm9hcmRzIGZvciBUZXhhcworCSAgSW5zdHJ1bWVudHMgT01BUCBwcm9jZXNzb3JzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBpc3AxMzAxX29tYXAuCisKK2NvbmZpZyBUV0w0MDMwX1VTQgorCXRyaXN0YXRlICJUV0w0MDMwIFVTQiBUcmFuc2NlaXZlciBEcml2ZXIiCisJZGVwZW5kcyBvbiBUV0w0MDMwX0NPUkUKKwlzZWxlY3QgVVNCX09UR19VVElMUworCWhlbHAKKwkgIEVuYWJsZSB0aGlzIHRvIHN1cHBvcnQgdGhlIFVTQiBPVEcgdHJhbnNjZWl2ZXIgb24gVFdMNDAzMAorCSAgZmFtaWx5IGNoaXBzIChpbmNsdWRpbmcgdGhlIFRXTDUwMzAgYW5kIFRQUzY1OXgwIGRldmljZXMpLgorCSAgVGhpcyB0cmFuc2NlaXZlciBzdXBwb3J0cyBoaWdoIGFuZCBmdWxsIHNwZWVkIGRldmljZXMgcGx1cywKKwkgIGluIGhvc3QgbW9kZSwgbG93IHNwZWVkLgorCitlbmRpZiAjIFVTQiB8fCBPVEcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL290Zy9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL290Zy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzNjN2NmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2Ivb3RnL01ha2VmaWxlCkBAIC0wLDAgKzEsMTUgQEAKKyMKKyMgT1RHIGluZnJhc3RydWN0dXJlIGFuZCB0cmFuc2NlaXZlciBkcml2ZXJzCisjCisKKyMgaW5mcmFzdHJ1Y3R1cmUKK29iai0kKENPTkZJR19VU0JfT1RHX1VUSUxTKQkrPSBvdGcubworCisjIHRyYW5zY2VpdmVyIGRyaXZlcnMKK29iai0kKENPTkZJR19VU0JfR1BJT19WQlVTKQkrPSBncGlvX3ZidXMubworb2JqLSQoQ09ORklHX0lTUDEzMDFfT01BUCkJKz0gaXNwMTMwMV9vbWFwLm8KK29iai0kKENPTkZJR19UV0w0MDMwX1VTQikJKz0gdHdsNDAzMC11c2IubworCitjY2ZsYWdzLSQoQ09ORklHX1VTQl9ERUJVRykJKz0gLURERUJVRworY2NmbGFncy0kKENPTkZJR19VU0JfR0FER0VUX0RFQlVHKSArPSAtRERFQlVHCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL290Zy9ncGlvX3ZidXMuYyBiL2RyaXZlcnMvdXNiL290Zy9ncGlvX3ZidXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2E2MDM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2Ivb3RnL2dwaW9fdmJ1cy5jCkBAIC0wLDAgKzEsMzM1IEBACisvKgorICogZ3Bpby12YnVzLmMgLSBzaW1wbGUgR1BJTyBWQlVTIHNlbnNpbmcgZHJpdmVyIGZvciBCIHBlcmlwaGVyYWwgZGV2aWNlcworICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBQaGlsaXBwIFphYmVsIDxwaGlsaXBwLnphYmVsQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisKKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKworI2luY2x1ZGUgPGxpbnV4L3VzYi9nYWRnZXQuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvZ3Bpb192YnVzLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL290Zy5oPgorCisKKy8qCisgKiBBIHNpbXBsZSBHUElPIFZCVVMgc2Vuc2luZyBkcml2ZXIgZm9yIEIgcGVyaXBoZXJhbCBvbmx5IGRldmljZXMKKyAqIHdpdGggaW50ZXJuYWwgdHJhbnNjZWl2ZXJzLiBJdCBjYW4gY29udHJvbCBhIEQrIHB1bGx1cCBHUElPIGFuZAorICogYSByZWd1bGF0b3IgdG8gbGltaXQgdGhlIGN1cnJlbnQgZHJhd24gZnJvbSBWQlVTLgorICoKKyAqIE5lZWRzIHRvIGJlIGxvYWRlZCBiZWZvcmUgdGhlIFVEQyBkcml2ZXIgdGhhdCB3aWxsIHVzZSBpdC4KKyAqLworc3RydWN0IGdwaW9fdmJ1c19kYXRhIHsKKwlzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyIG90ZzsKKwlzdHJ1Y3QgZGV2aWNlICAgICAgICAgICpkZXY7CisJc3RydWN0IHJlZ3VsYXRvciAgICAgICAqdmJ1c19kcmF3OworCWludAkJCXZidXNfZHJhd19lbmFibGVkOworCXVuc2lnbmVkCQltQTsKK307CisKKworLyoKKyAqIFRoaXMgZHJpdmVyIHJlbGllcyBvbiAiYm90aCBlZGdlcyIgdHJpZ2dlcmluZy4gIFZCVVMgaGFzIDEwMCBtc2VjIHRvCisgKiBzdGFiaWxpemUsIHNvIHRoZSBwZXJpcGhlcmFsIGNvbnRyb2xsZXIgZHJpdmVyIG1heSBuZWVkIHRvIGNvcGUgd2l0aAorICogc29tZSBib3VuY2luZyBkdWUgdG8gY3VycmVudCBzdXJnZXMgKGUuZy4gY2hhcmdpbmcgbG9jYWwgY2FwYWNpdGFuY2UpCisgKiBhbmQgY29udGFjdCBjaGF0dGVyLgorICoKKyAqIFJFVklTSVQgaW4gZGVzcGVyYXRlIHN0cmFpdHMsIHRvZ2dsaW5nIGJldHdlZW4gcmlzaW5nIGFuZCBmYWxsaW5nCisgKiBlZGdlcyBtaWdodCBiZSB3b3JrYWJsZS4KKyAqLworI2RlZmluZSBWQlVTX0lSUV9GTEFHUyBcCisJKCBJUlFGX1NBTVBMRV9SQU5ET00gfCBJUlFGX1NIQVJFRCBcCisJfCBJUlFGX1RSSUdHRVJfUklTSU5HIHwgSVJRRl9UUklHR0VSX0ZBTExJTkcgKQorCisKKy8qIGludGVyZmFjZSB0byByZWd1bGF0b3IgZnJhbWV3b3JrICovCitzdGF0aWMgdm9pZCBzZXRfdmJ1c19kcmF3KHN0cnVjdCBncGlvX3ZidXNfZGF0YSAqZ3Bpb192YnVzLCB1bnNpZ25lZCBtQSkKK3sKKwlzdHJ1Y3QgcmVndWxhdG9yICp2YnVzX2RyYXcgPSBncGlvX3ZidXMtPnZidXNfZHJhdzsKKwlpbnQgZW5hYmxlZDsKKworCWlmICghdmJ1c19kcmF3KQorCQlyZXR1cm47CisKKwllbmFibGVkID0gZ3Bpb192YnVzLT52YnVzX2RyYXdfZW5hYmxlZDsKKwlpZiAobUEpIHsKKwkJcmVndWxhdG9yX3NldF9jdXJyZW50X2xpbWl0KHZidXNfZHJhdywgMCwgMTAwMCAqIG1BKTsKKwkJaWYgKCFlbmFibGVkKSB7CisJCQlyZWd1bGF0b3JfZW5hYmxlKHZidXNfZHJhdyk7CisJCQlncGlvX3ZidXMtPnZidXNfZHJhd19lbmFibGVkID0gMTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChlbmFibGVkKSB7CisJCQlyZWd1bGF0b3JfZGlzYWJsZSh2YnVzX2RyYXcpOworCQkJZ3Bpb192YnVzLT52YnVzX2RyYXdfZW5hYmxlZCA9IDA7CisJCX0KKwl9CisJZ3Bpb192YnVzLT5tQSA9IG1BOworfQorCisvKiBWQlVTIGNoYW5nZSBJUlEgaGFuZGxlciAqLworc3RhdGljIGlycXJldHVybl90IGdwaW9fdmJ1c19pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gZGF0YTsKKwlzdHJ1Y3QgZ3Bpb192YnVzX21hY2hfaW5mbyAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgZ3Bpb192YnVzX2RhdGEgKmdwaW9fdmJ1cyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWludCBncGlvLCB2YnVzOworCisJdmJ1cyA9IGdwaW9fZ2V0X3ZhbHVlKHBkYXRhLT5ncGlvX3ZidXMpOworCWlmIChwZGF0YS0+Z3Bpb192YnVzX2ludmVydGVkKQorCQl2YnVzID0gIXZidXM7CisKKwlkZXZfZGJnKCZwZGV2LT5kZXYsICJWQlVTICVzIChnYWRnZXQ6ICVzKVxuIiwKKwkJdmJ1cyA/ICJzdXBwbGllZCIgOiAiaW5hY3RpdmUiLAorCQlncGlvX3ZidXMtPm90Zy5nYWRnZXQgPyBncGlvX3ZidXMtPm90Zy5nYWRnZXQtPm5hbWUgOiAibm9uZSIpOworCisJaWYgKCFncGlvX3ZidXMtPm90Zy5nYWRnZXQpCisJCXJldHVybiBJUlFfSEFORExFRDsKKworCS8qIFBlcmlwaGVyYWwgY29udHJvbGxlcnMgd2hpY2ggbWFuYWdlIHRoZSBwdWxsdXAgdGhlbXNlbHZlcyB3b24ndCBoYXZlCisJICogZ3Bpb19wdWxsdXAgY29uZmlndXJlZCBoZXJlLiAgSWYgaXQncyBjb25maWd1cmVkIGhlcmUsIHdlJ2xsIGRvIHdoYXQKKwkgKiBpc3AxMzAxX29tYXA6OmJfcGVyaXBoZXJhbCgpIGRvZXMgYW5kIGVuYWJsZSB0aGUgcHVsbHVwIGhlcmUuLi4gYWx0aG91Z2gKKwkgKiB0aGF0IG1heSBjb21wbGljYXRlIHVzYl9nYWRnZXRfeyxkaXN9Y29ubmVjdCgpIHN1cHBvcnQuCisJICovCisJZ3BpbyA9IHBkYXRhLT5ncGlvX3B1bGx1cDsKKwlpZiAodmJ1cykgeworCQlncGlvX3ZidXMtPm90Zy5zdGF0ZSA9IE9UR19TVEFURV9CX1BFUklQSEVSQUw7CisJCXVzYl9nYWRnZXRfdmJ1c19jb25uZWN0KGdwaW9fdmJ1cy0+b3RnLmdhZGdldCk7CisKKwkJLyogZHJhd2luZyBhICJ1bml0IGxvYWQiIGlzICphbHdheXMqIE9LLCBleGNlcHQgZm9yIE9URyAqLworCQlzZXRfdmJ1c19kcmF3KGdwaW9fdmJ1cywgMTAwKTsKKworCQkvKiBvcHRpb25hbGx5IGVuYWJsZSBEKyBwdWxsdXAgKi8KKwkJaWYgKGdwaW9faXNfdmFsaWQoZ3BpbykpCisJCQlncGlvX3NldF92YWx1ZShncGlvLCAhcGRhdGEtPmdwaW9fcHVsbHVwX2ludmVydGVkKTsKKwl9IGVsc2UgeworCQkvKiBvcHRpb25hbGx5IGRpc2FibGUgRCsgcHVsbHVwICovCisJCWlmIChncGlvX2lzX3ZhbGlkKGdwaW8pKQorCQkJZ3Bpb19zZXRfdmFsdWUoZ3BpbywgcGRhdGEtPmdwaW9fcHVsbHVwX2ludmVydGVkKTsKKworCQlzZXRfdmJ1c19kcmF3KGdwaW9fdmJ1cywgMCk7CisKKwkJdXNiX2dhZGdldF92YnVzX2Rpc2Nvbm5lY3QoZ3Bpb192YnVzLT5vdGcuZ2FkZ2V0KTsKKwkJZ3Bpb192YnVzLT5vdGcuc3RhdGUgPSBPVEdfU1RBVEVfQl9JRExFOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogT1RHIHRyYW5zY2VpdmVyIGludGVyZmFjZSAqLworCisvKiBiaW5kL3VuYmluZCB0aGUgcGVyaXBoZXJhbCBjb250cm9sbGVyICovCitzdGF0aWMgaW50IGdwaW9fdmJ1c19zZXRfcGVyaXBoZXJhbChzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyICpvdGcsCisJCQkJc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCkKK3sKKwlzdHJ1Y3QgZ3Bpb192YnVzX2RhdGEgKmdwaW9fdmJ1czsKKwlzdHJ1Y3QgZ3Bpb192YnVzX21hY2hfaW5mbyAqcGRhdGE7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwlpbnQgZ3BpbywgaXJxOworCisJZ3Bpb192YnVzID0gY29udGFpbmVyX29mKG90Zywgc3RydWN0IGdwaW9fdmJ1c19kYXRhLCBvdGcpOworCXBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZ3Bpb192YnVzLT5kZXYpOworCXBkYXRhID0gZ3Bpb192YnVzLT5kZXYtPnBsYXRmb3JtX2RhdGE7CisJaXJxID0gZ3Bpb190b19pcnEocGRhdGEtPmdwaW9fdmJ1cyk7CisJZ3BpbyA9IHBkYXRhLT5ncGlvX3B1bGx1cDsKKworCWlmICghZ2FkZ2V0KSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgInVucmVnaXN0ZXJpbmcgZ2FkZ2V0ICclcydcbiIsCisJCQlvdGctPmdhZGdldC0+bmFtZSk7CisKKwkJLyogb3B0aW9uYWxseSBkaXNhYmxlIEQrIHB1bGx1cCAqLworCQlpZiAoZ3Bpb19pc192YWxpZChncGlvKSkKKwkJCWdwaW9fc2V0X3ZhbHVlKGdwaW8sIHBkYXRhLT5ncGlvX3B1bGx1cF9pbnZlcnRlZCk7CisKKwkJc2V0X3ZidXNfZHJhdyhncGlvX3ZidXMsIDApOworCisJCXVzYl9nYWRnZXRfdmJ1c19kaXNjb25uZWN0KG90Zy0+Z2FkZ2V0KTsKKwkJb3RnLT5zdGF0ZSA9IE9UR19TVEFURV9VTkRFRklORUQ7CisKKwkJb3RnLT5nYWRnZXQgPSBOVUxMOworCQlyZXR1cm4gMDsKKwl9CisKKwlvdGctPmdhZGdldCA9IGdhZGdldDsKKwlkZXZfZGJnKCZwZGV2LT5kZXYsICJyZWdpc3RlcmVkIGdhZGdldCAnJXMnXG4iLCBnYWRnZXQtPm5hbWUpOworCisJLyogaW5pdGlhbGl6ZSBjb25uZWN0aW9uIHN0YXRlICovCisJZ3Bpb192YnVzX2lycShpcnEsIHBkZXYpOworCXJldHVybiAwOworfQorCisvKiBlZmZlY3RpdmUgZm9yIEIgZGV2aWNlcywgaWdub3JlZCBmb3IgQS1wZXJpcGhlcmFsICovCitzdGF0aWMgaW50IGdwaW9fdmJ1c19zZXRfcG93ZXIoc3RydWN0IG90Z190cmFuc2NlaXZlciAqb3RnLCB1bnNpZ25lZCBtQSkKK3sKKwlzdHJ1Y3QgZ3Bpb192YnVzX2RhdGEgKmdwaW9fdmJ1czsKKworCWdwaW9fdmJ1cyA9IGNvbnRhaW5lcl9vZihvdGcsIHN0cnVjdCBncGlvX3ZidXNfZGF0YSwgb3RnKTsKKworCWlmIChvdGctPnN0YXRlID09IE9UR19TVEFURV9CX1BFUklQSEVSQUwpCisJCXNldF92YnVzX2RyYXcoZ3Bpb192YnVzLCBtQSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIGZvciBub24tT1RHIEIgZGV2aWNlczogc2V0L2NsZWFyIHRyYW5zY2VpdmVyIHN1c3BlbmQgbW9kZSAqLworc3RhdGljIGludCBncGlvX3ZidXNfc2V0X3N1c3BlbmQoc3RydWN0IG90Z190cmFuc2NlaXZlciAqb3RnLCBpbnQgc3VzcGVuZCkKK3sKKwlzdHJ1Y3QgZ3Bpb192YnVzX2RhdGEgKmdwaW9fdmJ1czsKKworCWdwaW9fdmJ1cyA9IGNvbnRhaW5lcl9vZihvdGcsIHN0cnVjdCBncGlvX3ZidXNfZGF0YSwgb3RnKTsKKworCS8qIGRyYXcgbWF4IDAgbUEgZnJvbSB2YnVzIGluIHN1c3BlbmQgbW9kZTsgb3IgdGhlIHByZXZpb3VzbHkKKwkgKiByZWNvcmRlZCBhbW91bnQgb2YgY3VycmVudCBpZiBub3Qgc3VzcGVuZGVkCisJICoKKwkgKiBOT1RFOiBoaWdoIHBvd2VyZWQgY29uZmlncyAobUEgPiAxMDApIG1heSBkcmF3IHVwIHRvIDIuNSBtQQorCSAqIGlmIHRoZXkncmUgd2FrZS1lbmFibGVkIC4uLiB3ZSBkb24ndCBoYW5kbGUgdGhhdCB5ZXQuCisJICovCisJcmV0dXJuIGdwaW9fdmJ1c19zZXRfcG93ZXIob3RnLCBzdXNwZW5kID8gMCA6IGdwaW9fdmJ1cy0+bUEpOworfQorCisvKiBwbGF0Zm9ybSBkcml2ZXIgaW50ZXJmYWNlICovCisKK3N0YXRpYyBpbnQgX19pbml0IGdwaW9fdmJ1c19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBncGlvX3ZidXNfbWFjaF9pbmZvICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBncGlvX3ZidXNfZGF0YSAqZ3Bpb192YnVzOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCBlcnIsIGdwaW8sIGlycTsKKworCWlmICghcGRhdGEgfHwgIWdwaW9faXNfdmFsaWQocGRhdGEtPmdwaW9fdmJ1cykpCisJCXJldHVybiAtRUlOVkFMOworCWdwaW8gPSBwZGF0YS0+Z3Bpb192YnVzOworCisJZ3Bpb192YnVzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGdwaW9fdmJ1c19kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFncGlvX3ZidXMpCisJCXJldHVybiAtRU5PTUVNOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZ3Bpb192YnVzKTsKKwlncGlvX3ZidXMtPmRldiA9ICZwZGV2LT5kZXY7CisJZ3Bpb192YnVzLT5vdGcubGFiZWwgPSAiZ3Bpby12YnVzIjsKKwlncGlvX3ZidXMtPm90Zy5zdGF0ZSA9IE9UR19TVEFURV9VTkRFRklORUQ7CisJZ3Bpb192YnVzLT5vdGcuc2V0X3BlcmlwaGVyYWwgPSBncGlvX3ZidXNfc2V0X3BlcmlwaGVyYWw7CisJZ3Bpb192YnVzLT5vdGcuc2V0X3Bvd2VyID0gZ3Bpb192YnVzX3NldF9wb3dlcjsKKwlncGlvX3ZidXMtPm90Zy5zZXRfc3VzcGVuZCA9IGdwaW9fdmJ1c19zZXRfc3VzcGVuZDsKKworCWVyciA9IGdwaW9fcmVxdWVzdChncGlvLCAidmJ1c19kZXRlY3QiKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IHJlcXVlc3QgdmJ1cyBncGlvICVkLCBlcnI6ICVkXG4iLAorCQkJZ3BpbywgZXJyKTsKKwkJZ290byBlcnJfZ3BpbzsKKwl9CisJZ3Bpb19kaXJlY3Rpb25faW5wdXQoZ3Bpbyk7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JUlEsIDApOworCWlmIChyZXMpIHsKKwkJaXJxID0gcmVzLT5zdGFydDsKKwkJcmVzLT5mbGFncyAmPSBJUlFGX1RSSUdHRVJfTUFTSzsKKwkJcmVzLT5mbGFncyB8PSBJUlFGX1NBTVBMRV9SQU5ET00gfCBJUlFGX1NIQVJFRDsKKwl9IGVsc2UKKwkJaXJxID0gZ3Bpb190b19pcnEoZ3Bpbyk7CisKKwkvKiBpZiBkYXRhIGxpbmUgcHVsbHVwIGlzIGluIHVzZSwgaW5pdGlhbGl6ZSBpdCB0byAibm90IHB1bGxpbmcgdXAiICovCisJZ3BpbyA9IHBkYXRhLT5ncGlvX3B1bGx1cDsKKwlpZiAoZ3Bpb19pc192YWxpZChncGlvKSkgeworCQllcnIgPSBncGlvX3JlcXVlc3QoZ3BpbywgInVkY19wdWxsdXAiKTsKKwkJaWYgKGVycikgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJjYW4ndCByZXF1ZXN0IHB1bGx1cCBncGlvICVkLCBlcnI6ICVkXG4iLAorCQkJCWdwaW8sIGVycik7CisJCQlncGlvX2ZyZWUocGRhdGEtPmdwaW9fdmJ1cyk7CisJCQlnb3RvIGVycl9ncGlvOworCQl9CisJCWdwaW9fZGlyZWN0aW9uX291dHB1dChncGlvLCBwZGF0YS0+Z3Bpb19wdWxsdXBfaW52ZXJ0ZWQpOworCX0KKworCWVyciA9IHJlcXVlc3RfaXJxKGlycSwgZ3Bpb192YnVzX2lycSwgVkJVU19JUlFfRkxBR1MsCisJCSJ2YnVzX2RldGVjdCIsIHBkZXYpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgcmVxdWVzdCBpcnEgJWksIGVycjogJWRcbiIsCisJCQlpcnEsIGVycik7CisJCWdvdG8gZXJyX2lycTsKKwl9CisKKwkvKiBvbmx5IGFjdGl2ZSB3aGVuIGEgZ2FkZ2V0IGlzIHJlZ2lzdGVyZWQgKi8KKwllcnIgPSBvdGdfc2V0X3RyYW5zY2VpdmVyKCZncGlvX3ZidXMtPm90Zyk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCByZWdpc3RlciB0cmFuc2NlaXZlciwgZXJyOiAlZFxuIiwKKwkJCWVycik7CisJCWdvdG8gZXJyX290ZzsKKwl9CisKKwlncGlvX3ZidXMtPnZidXNfZHJhdyA9IHJlZ3VsYXRvcl9nZXQoJnBkZXYtPmRldiwgInZidXNfZHJhdyIpOworCWlmIChJU19FUlIoZ3Bpb192YnVzLT52YnVzX2RyYXcpKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgImNhbid0IGdldCB2YnVzX2RyYXcgcmVndWxhdG9yLCBlcnI6ICVsZFxuIiwKKwkJCVBUUl9FUlIoZ3Bpb192YnVzLT52YnVzX2RyYXcpKTsKKwkJZ3Bpb192YnVzLT52YnVzX2RyYXcgPSBOVUxMOworCX0KKworCXJldHVybiAwOworZXJyX290ZzoKKwlmcmVlX2lycShpcnEsICZwZGV2LT5kZXYpOworZXJyX2lycToKKwlpZiAoZ3Bpb19pc192YWxpZChwZGF0YS0+Z3Bpb19wdWxsdXApKQorCQlncGlvX2ZyZWUocGRhdGEtPmdwaW9fcHVsbHVwKTsKKwlncGlvX2ZyZWUocGRhdGEtPmdwaW9fdmJ1cyk7CitlcnJfZ3BpbzoKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlrZnJlZShncGlvX3ZidXMpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19leGl0IGdwaW9fdmJ1c19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZ3Bpb192YnVzX2RhdGEgKmdwaW9fdmJ1cyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBncGlvX3ZidXNfbWFjaF9pbmZvICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWludCBncGlvID0gcGRhdGEtPmdwaW9fdmJ1czsKKworCXJlZ3VsYXRvcl9wdXQoZ3Bpb192YnVzLT52YnVzX2RyYXcpOworCisJb3RnX3NldF90cmFuc2NlaXZlcihOVUxMKTsKKworCWZyZWVfaXJxKGdwaW9fdG9faXJxKGdwaW8pLCAmcGRldi0+ZGV2KTsKKwlpZiAoZ3Bpb19pc192YWxpZChwZGF0YS0+Z3Bpb19wdWxsdXApKQorCQlncGlvX2ZyZWUocGRhdGEtPmdwaW9fcHVsbHVwKTsKKwlncGlvX2ZyZWUoZ3Bpbyk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJa2ZyZWUoZ3Bpb192YnVzKTsKKworCXJldHVybiAwOworfQorCisvKiBOT1RFOiAgdGhlIGdwaW8tdmJ1cyBkZXZpY2UgbWF5ICpOT1QqIGJlIGhvdHBsdWdnZWQgKi8KKworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpncGlvLXZidXMiKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZ3Bpb192YnVzX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSAgPSAiZ3Bpby12YnVzIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucmVtb3ZlICA9IF9fZXhpdF9wKGdwaW9fdmJ1c19yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZ3Bpb192YnVzX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZncGlvX3ZidXNfZHJpdmVyLCBncGlvX3ZidXNfcHJvYmUpOworfQorbW9kdWxlX2luaXQoZ3Bpb192YnVzX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgZ3Bpb192YnVzX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZ3Bpb192YnVzX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChncGlvX3ZidXNfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigic2ltcGxlIEdQSU8gY29udHJvbGxlZCBPVEcgdHJhbnNjZWl2ZXIgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJQaGlsaXBwIFphYmVsIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9pc3AxMzAxX29tYXAuYyBiL2RyaXZlcnMvdXNiL290Zy9pc3AxMzAxX29tYXAuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvaXNwMTMwMV9vbWFwLmMKcmVuYW1lIHRvIGRyaXZlcnMvdXNiL290Zy9pc3AxMzAxX29tYXAuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivb3RnL290Zy5jIGIvZHJpdmVycy91c2Ivb3RnL290Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMzE4ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9vdGcvb3RnLmMKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIG90Zy5jIC0tIFVTQiBPVEcgdXRpbGl0eSBjb2RlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IFRleGFzIEluc3RydW1lbnRzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxsaW51eC91c2Ivb3RnLmg+CisKK3N0YXRpYyBzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyICp4Y2VpdjsKKworLyoqCisgKiBvdGdfZ2V0X3RyYW5zY2VpdmVyIC0gZmluZCB0aGUgKHNpbmdsZSkgT1RHIHRyYW5zY2VpdmVyCisgKgorICogUmV0dXJucyB0aGUgdHJhbnNjZWl2ZXIgZHJpdmVyLCBhZnRlciBnZXR0aW5nIGEgcmVmY291bnQgdG8gaXQ7IG9yCisgKiBudWxsIGlmIHRoZXJlIGlzIG5vIHN1Y2ggdHJhbnNjZWl2ZXIuICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvcgorICogY2FsbGluZyBvdGdfcHV0X3RyYW5zY2VpdmVyKCkgdG8gcmVsZWFzZSB0aGF0IGNvdW50LgorICoKKyAqIEZvciB1c2UgYnkgVVNCIGhvc3QgYW5kIHBlcmlwaGVyYWwgZHJpdmVycy4KKyAqLworc3RydWN0IG90Z190cmFuc2NlaXZlciAqb3RnX2dldF90cmFuc2NlaXZlcih2b2lkKQoreworCWlmICh4Y2VpdikKKwkJZ2V0X2RldmljZSh4Y2Vpdi0+ZGV2KTsKKwlyZXR1cm4geGNlaXY7Cit9CitFWFBPUlRfU1lNQk9MKG90Z19nZXRfdHJhbnNjZWl2ZXIpOworCisvKioKKyAqIG90Z19wdXRfdHJhbnNjZWl2ZXIgLSByZWxlYXNlIHRoZSAoc2luZ2xlKSBPVEcgdHJhbnNjZWl2ZXIKKyAqIEB4OiB0aGUgdHJhbnNjZWl2ZXIgcmV0dXJuZWQgYnkgb3RnX2dldF90cmFuc2NlaXZlcigpCisgKgorICogUmVsZWFzZXMgYSByZWZjb3VudCB0aGUgY2FsbGVyIHJlY2VpdmVkIGZyb20gb3RnX2dldF90cmFuc2NlaXZlcigpLgorICoKKyAqIEZvciB1c2UgYnkgVVNCIGhvc3QgYW5kIHBlcmlwaGVyYWwgZHJpdmVycy4KKyAqLwordm9pZCBvdGdfcHV0X3RyYW5zY2VpdmVyKHN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKngpCit7CisJcHV0X2RldmljZSh4LT5kZXYpOworfQorRVhQT1JUX1NZTUJPTChvdGdfcHV0X3RyYW5zY2VpdmVyKTsKKworLyoqCisgKiBvdGdfc2V0X3RyYW5zY2VpdmVyIC0gZGVjbGFyZSB0aGUgKHNpbmdsZSkgT1RHIHRyYW5zY2VpdmVyCisgKiBAeDogdGhlIFVTQiBPVEcgdHJhbnNjZWl2ZXIgdG8gYmUgdXNlZDsgb3IgTlVMTAorICoKKyAqIFRoaXMgY2FsbCBpcyBleGNsdXNpdmVseSBmb3IgdXNlIGJ5IHRyYW5zY2VpdmVyIGRyaXZlcnMsIHdoaWNoCisgKiBjb29yZGluYXRlIHRoZSBhY3Rpdml0aWVzIG9mIGRyaXZlcnMgZm9yIGhvc3QgYW5kIHBlcmlwaGVyYWwKKyAqIGNvbnRyb2xsZXJzLCBhbmQgaW4gc29tZSBjYXNlcyBmb3IgVkJVUyBjdXJyZW50IHJlZ3VsYXRpb24uCisgKi8KK2ludCBvdGdfc2V0X3RyYW5zY2VpdmVyKHN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKngpCit7CisJaWYgKHhjZWl2ICYmIHgpCisJCXJldHVybiAtRUJVU1k7CisJeGNlaXYgPSB4OworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChvdGdfc2V0X3RyYW5zY2VpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL290Zy90d2w0MDMwLXVzYi5jIGIvZHJpdmVycy91c2Ivb3RnL3R3bDQwMzAtdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE2ZTQ0MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL290Zy90d2w0MDMwLXVzYi5jCkBAIC0wLDAgKzEsNzIxIEBACisvKgorICogdHdsNDAzMF91c2IgLSBUV0w0MDMwIFVTQiB0cmFuc2NlaXZlciwgdGFsa2luZyB0byBPTUFQIE9URyBjb250cm9sbGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgVGV4YXMgSW5zdHJ1bWVudHMKKyAqIENvcHlyaWdodCAoQykgMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbgorICogQ29udGFjdDogRmVsaXBlIEJhbGJpIDxmZWxpcGUuYmFsYmlAbm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqIEN1cnJlbnQgc3RhdHVzOgorICoJLSBIUyBVU0IgVUxQSSBtb2RlIHdvcmtzLgorICoJLSAzLXBpbiBtb2RlIHN1cHBvcnQgbWF5IGJlIGFkZGVkIGluIGZ1dHVyZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9vdGcuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMvdHdsNDAzMC5oPgorCisKKy8qIFJlZ2lzdGVyIGRlZmluZXMgKi8KKworI2RlZmluZSBWRU5ET1JfSURfTE8JCQkweDAwCisjZGVmaW5lIFZFTkRPUl9JRF9ISQkJCTB4MDEKKyNkZWZpbmUgUFJPRFVDVF9JRF9MTwkJCTB4MDIKKyNkZWZpbmUgUFJPRFVDVF9JRF9ISQkJCTB4MDMKKworI2RlZmluZSBGVU5DX0NUUkwJCQkweDA0CisjZGVmaW5lIEZVTkNfQ1RSTF9TRVQJCQkweDA1CisjZGVmaW5lIEZVTkNfQ1RSTF9DTFIJCQkweDA2CisjZGVmaW5lIEZVTkNfQ1RSTF9TVVNQRU5ETQkJKDEgPDwgNikKKyNkZWZpbmUgRlVOQ19DVFJMX1JFU0VUCQkJKDEgPDwgNSkKKyNkZWZpbmUgRlVOQ19DVFJMX09QTU9ERV9NQVNLCQkoMyA8PCAzKSAvKiBiaXRzIDMgYW5kIDQgKi8KKyNkZWZpbmUgRlVOQ19DVFJMX09QTU9ERV9OT1JNQUwJCSgwIDw8IDMpCisjZGVmaW5lIEZVTkNfQ1RSTF9PUE1PREVfTk9ORFJJVklORwkoMSA8PCAzKQorI2RlZmluZSBGVU5DX0NUUkxfT1BNT0RFX0RJU0FCTEVfQklUX05SWkkJKDIgPDwgMykKKyNkZWZpbmUgRlVOQ19DVFJMX1RFUk1TRUxFQ1QJCSgxIDw8IDIpCisjZGVmaW5lIEZVTkNfQ1RSTF9YQ1ZSU0VMRUNUX01BU0sJKDMgPDwgMCkgLyogYml0cyAwIGFuZCAxICovCisjZGVmaW5lIEZVTkNfQ1RSTF9YQ1ZSU0VMRUNUX0hTCQkoMCA8PCAwKQorI2RlZmluZSBGVU5DX0NUUkxfWENWUlNFTEVDVF9GUwkJKDEgPDwgMCkKKyNkZWZpbmUgRlVOQ19DVFJMX1hDVlJTRUxFQ1RfTFMJCSgyIDw8IDApCisjZGVmaW5lIEZVTkNfQ1RSTF9YQ1ZSU0VMRUNUX0ZTNExTCSgzIDw8IDApCisKKyNkZWZpbmUgSUZDX0NUUkwJCQkweDA3CisjZGVmaW5lIElGQ19DVFJMX1NFVAkJCTB4MDgKKyNkZWZpbmUgSUZDX0NUUkxfQ0xSCQkJMHgwOQorI2RlZmluZSBJRkNfQ1RSTF9JTlRFUkZBQ0VfUFJPVEVDVF9ESVNBQkxFCSgxIDw8IDcpCisjZGVmaW5lIElGQ19DVFJMX0FVVE9SRVNVTUUJCSgxIDw8IDQpCisjZGVmaW5lIElGQ19DVFJMX0NMT0NLU1VTUEVORE0JCSgxIDw8IDMpCisjZGVmaW5lIElGQ19DVFJMX0NBUktJVE1PREUJCSgxIDw8IDIpCisjZGVmaW5lIElGQ19DVFJMX0ZTTFNTRVJJQUxNT0RFXzNQSU4JKDEgPDwgMSkKKworI2RlZmluZSBUV0w0MDMwX09UR19DVFJMCQkweDBBCisjZGVmaW5lIFRXTDQwMzBfT1RHX0NUUkxfU0VUCQkweDBCCisjZGVmaW5lIFRXTDQwMzBfT1RHX0NUUkxfQ0xSCQkweDBDCisjZGVmaW5lIFRXTDQwMzBfT1RHX0NUUkxfRFJWVkJVUwkoMSA8PCA1KQorI2RlZmluZSBUV0w0MDMwX09UR19DVFJMX0NIUkdWQlVTCSgxIDw8IDQpCisjZGVmaW5lIFRXTDQwMzBfT1RHX0NUUkxfRElTQ0hSR1ZCVVMJKDEgPDwgMykKKyNkZWZpbmUgVFdMNDAzMF9PVEdfQ1RSTF9ETVBVTExET1dOCSgxIDw8IDIpCisjZGVmaW5lIFRXTDQwMzBfT1RHX0NUUkxfRFBQVUxMRE9XTgkoMSA8PCAxKQorI2RlZmluZSBUV0w0MDMwX09UR19DVFJMX0lEUFVMTFVQCSgxIDw8IDApCisKKyNkZWZpbmUgVVNCX0lOVF9FTl9SSVNFCQkJMHgwRAorI2RlZmluZSBVU0JfSU5UX0VOX1JJU0VfU0VUCQkweDBFCisjZGVmaW5lIFVTQl9JTlRfRU5fUklTRV9DTFIJCTB4MEYKKyNkZWZpbmUgVVNCX0lOVF9FTl9GQUxMCQkJMHgxMAorI2RlZmluZSBVU0JfSU5UX0VOX0ZBTExfU0VUCQkweDExCisjZGVmaW5lIFVTQl9JTlRfRU5fRkFMTF9DTFIJCTB4MTIKKyNkZWZpbmUgVVNCX0lOVF9TVFMJCQkweDEzCisjZGVmaW5lIFVTQl9JTlRfTEFUQ0gJCQkweDE0CisjZGVmaW5lIFVTQl9JTlRfSURHTkQJCQkoMSA8PCA0KQorI2RlZmluZSBVU0JfSU5UX1NFU1NFTkQJCQkoMSA8PCAzKQorI2RlZmluZSBVU0JfSU5UX1NFU1NWQUxJRAkJKDEgPDwgMikKKyNkZWZpbmUgVVNCX0lOVF9WQlVTVkFMSUQJCSgxIDw8IDEpCisjZGVmaW5lIFVTQl9JTlRfSE9TVERJU0NPTk5FQ1QJCSgxIDw8IDApCisKKyNkZWZpbmUgQ0FSS0lUX0NUUkwJCQkweDE5CisjZGVmaW5lIENBUktJVF9DVFJMX1NFVAkJCTB4MUEKKyNkZWZpbmUgQ0FSS0lUX0NUUkxfQ0xSCQkJMHgxQgorI2RlZmluZSBDQVJLSVRfQ1RSTF9NSUNFTgkJKDEgPDwgNikKKyNkZWZpbmUgQ0FSS0lUX0NUUkxfU1BLUklHSFRFTgkJKDEgPDwgNSkKKyNkZWZpbmUgQ0FSS0lUX0NUUkxfU1BLTEVGVEVOCQkoMSA8PCA0KQorI2RlZmluZSBDQVJLSVRfQ1RSTF9SWERFTgkJKDEgPDwgMykKKyNkZWZpbmUgQ0FSS0lUX0NUUkxfVFhERU4JCSgxIDw8IDIpCisjZGVmaW5lIENBUktJVF9DVFJMX0lER05ERFJWCQkoMSA8PCAxKQorI2RlZmluZSBDQVJLSVRfQ1RSTF9DQVJLSVRQV1IJCSgxIDw8IDApCisjZGVmaW5lIENBUktJVF9QTFNfQ1RSTAkJCTB4MjIKKyNkZWZpbmUgQ0FSS0lUX1BMU19DVFJMX1NFVAkJMHgyMworI2RlZmluZSBDQVJLSVRfUExTX0NUUkxfQ0xSCQkweDI0CisjZGVmaW5lIENBUktJVF9QTFNfQ1RSTF9TUEtSUklHSFRfQklBU0VOCSgxIDw8IDMpCisjZGVmaW5lIENBUktJVF9QTFNfQ1RSTF9TUEtSTEVGVF9CSUFTRU4JKDEgPDwgMikKKyNkZWZpbmUgQ0FSS0lUX1BMU19DVFJMX1JYUExTRU4JCSgxIDw8IDEpCisjZGVmaW5lIENBUktJVF9QTFNfQ1RSTF9UWFBMU0VOCQkoMSA8PCAwKQorCisjZGVmaW5lIE1DUENfQ1RSTAkJCTB4MzAKKyNkZWZpbmUgTUNQQ19DVFJMX1NFVAkJCTB4MzEKKyNkZWZpbmUgTUNQQ19DVFJMX0NMUgkJCTB4MzIKKyNkZWZpbmUgTUNQQ19DVFJMX1JUU09MCQkJKDEgPDwgNykKKyNkZWZpbmUgTUNQQ19DVFJMX0VYVFNXUgkJKDEgPDwgNikKKyNkZWZpbmUgTUNQQ19DVFJMX0VYVFNXQwkJKDEgPDwgNSkKKyNkZWZpbmUgTUNQQ19DVFJMX1ZPSUNFU1cJCSgxIDw8IDQpCisjZGVmaW5lIE1DUENfQ1RSTF9PVVQ2NEsJCSgxIDw8IDMpCisjZGVmaW5lIE1DUENfQ1RSTF9SVFNDVFNTVwkJKDEgPDwgMikKKyNkZWZpbmUgTUNQQ19DVFJMX0hTX1VBUlQJCSgxIDw8IDApCisKKyNkZWZpbmUgTUNQQ19JT19DVFJMCQkJMHgzMworI2RlZmluZSBNQ1BDX0lPX0NUUkxfU0VUCQkweDM0CisjZGVmaW5lIE1DUENfSU9fQ1RSTF9DTFIJCTB4MzUKKyNkZWZpbmUgTUNQQ19JT19DVFJMX01JQ0JJQVNFTgkJKDEgPDwgNSkKKyNkZWZpbmUgTUNQQ19JT19DVFJMX0NUU19OUFUJCSgxIDw8IDQpCisjZGVmaW5lIE1DUENfSU9fQ1RSTF9SWERfUFUJCSgxIDw8IDMpCisjZGVmaW5lIE1DUENfSU9fQ1RSTF9UWERUWVAJCSgxIDw8IDIpCisjZGVmaW5lIE1DUENfSU9fQ1RSTF9DVFNUWVAJCSgxIDw8IDEpCisjZGVmaW5lIE1DUENfSU9fQ1RSTF9SVFNUWVAJCSgxIDw8IDApCisKKyNkZWZpbmUgTUNQQ19DVFJMMgkJCTB4MzYKKyNkZWZpbmUgTUNQQ19DVFJMMl9TRVQJCQkweDM3CisjZGVmaW5lIE1DUENfQ1RSTDJfQ0xSCQkJMHgzOAorI2RlZmluZSBNQ1BDX0NUUkwyX01DUENfQ0tfRU4JCSgxIDw8IDApCisKKyNkZWZpbmUgT1RIRVJfRlVOQ19DVFJMCQkJMHg4MAorI2RlZmluZSBPVEhFUl9GVU5DX0NUUkxfU0VUCQkweDgxCisjZGVmaW5lIE9USEVSX0ZVTkNfQ1RSTF9DTFIJCTB4ODIKKyNkZWZpbmUgT1RIRVJfRlVOQ19DVFJMX0JESVNfQUNPTl9FTgkoMSA8PCA0KQorI2RlZmluZSBPVEhFUl9GVU5DX0NUUkxfRklWRVdJUkVfTU9ERQkoMSA8PCAyKQorCisjZGVmaW5lIE9USEVSX0lGQ19DVFJMCQkJMHg4MworI2RlZmluZSBPVEhFUl9JRkNfQ1RSTF9TRVQJCTB4ODQKKyNkZWZpbmUgT1RIRVJfSUZDX0NUUkxfQ0xSCQkweDg1CisjZGVmaW5lIE9USEVSX0lGQ19DVFJMX09FX0lOVF9FTgkoMSA8PCA2KQorI2RlZmluZSBPVEhFUl9JRkNfQ1RSTF9DRUEyMDExX01PREUJKDEgPDwgNSkKKyNkZWZpbmUgT1RIRVJfSUZDX0NUUkxfRlNMU1NFUklBTE1PREVfNFBJTgkoMSA8PCA0KQorI2RlZmluZSBPVEhFUl9JRkNfQ1RSTF9ISVpfVUxQSV82ME1IWl9PVVQJKDEgPDwgMykKKyNkZWZpbmUgT1RIRVJfSUZDX0NUUkxfSElaX1VMUEkJCSgxIDw8IDIpCisjZGVmaW5lIE9USEVSX0lGQ19DVFJMX0FMVF9JTlRfUkVST1VURQkoMSA8PCAwKQorCisjZGVmaW5lIE9USEVSX0lOVF9FTl9SSVNFCQkweDg2CisjZGVmaW5lIE9USEVSX0lOVF9FTl9SSVNFX1NFVAkJMHg4NworI2RlZmluZSBPVEhFUl9JTlRfRU5fUklTRV9DTFIJCTB4ODgKKyNkZWZpbmUgT1RIRVJfSU5UX0VOX0ZBTEwJCTB4ODkKKyNkZWZpbmUgT1RIRVJfSU5UX0VOX0ZBTExfU0VUCQkweDhBCisjZGVmaW5lIE9USEVSX0lOVF9FTl9GQUxMX0NMUgkJMHg4QgorI2RlZmluZSBPVEhFUl9JTlRfU1RTCQkJMHg4QworI2RlZmluZSBPVEhFUl9JTlRfTEFUQ0gJCQkweDhECisjZGVmaW5lIE9USEVSX0lOVF9WQl9TRVNTX1ZMRAkJKDEgPDwgNykKKyNkZWZpbmUgT1RIRVJfSU5UX0RNX0hJCQkJKDEgPDwgNikgLyogbm90IHZhbGlkIGZvciAibGF0Y2giIHJlZyAqLworI2RlZmluZSBPVEhFUl9JTlRfRFBfSEkJCQkoMSA8PCA1KSAvKiBub3QgdmFsaWQgZm9yICJsYXRjaCIgcmVnICovCisjZGVmaW5lIE9USEVSX0lOVF9CRElTX0FDT04JCSgxIDw8IDMpIC8qIG5vdCB2YWxpZCBmb3IgImZhbGwiIHJlZ3MgKi8KKyNkZWZpbmUgT1RIRVJfSU5UX01BTlUJCQkoMSA8PCAxKQorI2RlZmluZSBPVEhFUl9JTlRfQUJOT1JNQUxfU1RSRVNTCSgxIDw8IDApCisKKyNkZWZpbmUgSURfU1RBVFVTCQkJMHg5NgorI2RlZmluZSBJRF9SRVNfRkxPQVQJCQkoMSA8PCA0KQorI2RlZmluZSBJRF9SRVNfNDQwSwkJCSgxIDw8IDMpCisjZGVmaW5lIElEX1JFU18yMDBLCQkJKDEgPDwgMikKKyNkZWZpbmUgSURfUkVTXzEwMksJCQkoMSA8PCAxKQorI2RlZmluZSBJRF9SRVNfR05ECQkJKDEgPDwgMCkKKworI2RlZmluZSBQT1dFUl9DVFJMCQkJMHhBQworI2RlZmluZSBQT1dFUl9DVFJMX1NFVAkJCTB4QUQKKyNkZWZpbmUgUE9XRVJfQ1RSTF9DTFIJCQkweEFFCisjZGVmaW5lIFBPV0VSX0NUUkxfT1RHX0VOQUIJCSgxIDw8IDUpCisKKyNkZWZpbmUgT1RIRVJfSUZDX0NUUkwyCQkJMHhBRgorI2RlZmluZSBPVEhFUl9JRkNfQ1RSTDJfU0VUCQkweEIwCisjZGVmaW5lIE9USEVSX0lGQ19DVFJMMl9DTFIJCTB4QjEKKyNkZWZpbmUgT1RIRVJfSUZDX0NUUkwyX1VMUElfU1RQX0xPVwkoMSA8PCA0KQorI2RlZmluZSBPVEhFUl9JRkNfQ1RSTDJfVUxQSV9UWEVOX1BPTAkoMSA8PCAzKQorI2RlZmluZSBPVEhFUl9JRkNfQ1RSTDJfVUxQSV80UElOXzI0MzAJKDEgPDwgMikKKyNkZWZpbmUgT1RIRVJfSUZDX0NUUkwyX1VTQl9JTlRfT1VUU0VMX01BU0sJKDMgPDwgMCkgLyogYml0cyAwIGFuZCAxICovCisjZGVmaW5lIE9USEVSX0lGQ19DVFJMMl9VU0JfSU5UX09VVFNFTF9JTlQxTgkoMCA8PCAwKQorI2RlZmluZSBPVEhFUl9JRkNfQ1RSTDJfVVNCX0lOVF9PVVRTRUxfSU5UMk4JKDEgPDwgMCkKKworI2RlZmluZSBSRUdfQ1RSTF9FTgkJCTB4QjIKKyNkZWZpbmUgUkVHX0NUUkxfRU5fU0VUCQkJMHhCMworI2RlZmluZSBSRUdfQ1RSTF9FTl9DTFIJCQkweEI0CisjZGVmaW5lIFJFR19DVFJMX0VSUk9SCQkJMHhCNQorI2RlZmluZSBVTFBJX0kyQ19DT05GTElDVF9JTlRFTgkJKDEgPDwgMCkKKworI2RlZmluZSBPVEhFUl9GVU5DX0NUUkwyCQkweEI4CisjZGVmaW5lIE9USEVSX0ZVTkNfQ1RSTDJfU0VUCQkweEI5CisjZGVmaW5lIE9USEVSX0ZVTkNfQ1RSTDJfQ0xSCQkweEJBCisjZGVmaW5lIE9USEVSX0ZVTkNfQ1RSTDJfVkJBVF9USU1FUl9FTgkoMSA8PCAwKQorCisvKiBmb2xsb3dpbmcgcmVnaXN0ZXJzIGRvIG5vdCBoYXZlIHNlcGFyYXRlIF9jbHIgYW5kIF9zZXQgcmVnaXN0ZXJzICovCisjZGVmaW5lIFZCVVNfREVCT1VOQ0UJCQkweEMwCisjZGVmaW5lIElEX0RFQk9VTkNFCQkJMHhDMQorI2RlZmluZSBWQkFUX1RJTUVSCQkJMHhEMworI2RlZmluZSBQSFlfUFdSX0NUUkwJCQkweEZECisjZGVmaW5lIFBIWV9QV1JfUEhZUFdECQkJKDEgPDwgMCkKKyNkZWZpbmUgUEhZX0NMS19DVFJMCQkJMHhGRQorI2RlZmluZSBQSFlfQ0xLX0NUUkxfQ0xPQ0tHQVRJTkdfRU4JKDEgPDwgMikKKyNkZWZpbmUgUEhZX0NMS19DVFJMX0NMSzMyS19FTgkJKDEgPDwgMSkKKyNkZWZpbmUgUkVRX1BIWV9EUExMX0NMSwkJKDEgPDwgMCkKKyNkZWZpbmUgUEhZX0NMS19DVFJMX1NUUwkJMHhGRgorI2RlZmluZSBQSFlfRFBMTF9DTEsJCQkoMSA8PCAwKQorCisvKiBJbiBtb2R1bGUgVFdMNDAzMF9NT0RVTEVfUE1fTUFTVEVSICovCisjZGVmaW5lIFBST1RFQ1RfS0VZCQkJMHgwRQorCisvKiBJbiBtb2R1bGUgVFdMNDAzMF9NT0RVTEVfUE1fUkVDRUlWRVIgKi8KKyNkZWZpbmUgVlVTQl9ERURJQ0FURUQxCQkJMHg3RAorI2RlZmluZSBWVVNCX0RFRElDQVRFRDIJCQkweDdFCisjZGVmaW5lIFZVU0IxVjVfREVWX0dSUAkJCTB4NzEKKyNkZWZpbmUgVlVTQjFWNV9UWVBFCQkJMHg3MgorI2RlZmluZSBWVVNCMVY1X1JFTUFQCQkJMHg3MworI2RlZmluZSBWVVNCMVY4X0RFVl9HUlAJCQkweDc0CisjZGVmaW5lIFZVU0IxVjhfVFlQRQkJCTB4NzUKKyNkZWZpbmUgVlVTQjFWOF9SRU1BUAkJCTB4NzYKKyNkZWZpbmUgVlVTQjNWMV9ERVZfR1JQCQkJMHg3NworI2RlZmluZSBWVVNCM1YxX1RZUEUJCQkweDc4CisjZGVmaW5lIFZVU0IzVjFfUkVNQVAJCQkweDc5CisKKy8qIEluIG1vZHVsZSBUV0w0MDMwX01PRFVMRV9JTlRCUiAqLworI2RlZmluZSBQTUJSMQkJCQkweDBECisjZGVmaW5lIEdQSU9fVVNCXzRQSU5fVUxQSV8yNDMwQwkoMyA8PCAwKQorCisKKworZW51bSBsaW5rc3RhdCB7CisJVVNCX0xJTktfVU5LTk9XTiA9IDAsCisJVVNCX0xJTktfTk9ORSwKKwlVU0JfTElOS19WQlVTLAorCVVTQl9MSU5LX0lELAorfTsKKworc3RydWN0IHR3bDQwMzBfdXNiIHsKKwlzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyCW90ZzsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2OworCisJLyogZm9yIHZidXMgcmVwb3J0aW5nIHdpdGggaXJxcyBkaXNhYmxlZCAqLworCXNwaW5sb2NrX3QJCWxvY2s7CisKKwkvKiBwaW4gY29uZmlndXJhdGlvbiAqLworCWVudW0gdHdsNDAzMF91c2JfbW9kZQl1c2JfbW9kZTsKKworCWludAkJCWlycTsKKwl1OAkJCWxpbmtzdGF0OworCXU4CQkJYXNsZWVwOworCWJvb2wJCQlpcnFfZW5hYmxlZDsKK307CisKKy8qIGludGVybmFsIGRlZmluZSBvbiB0b3Agb2YgY29udGFpbmVyX29mICovCisjZGVmaW5lIHhjZWl2X3RvX3R3bCh4KQkJY29udGFpbmVyX29mKCh4KSwgc3RydWN0IHR3bDQwMzBfdXNiLCBvdGcpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IHR3bDQwMzBfaTJjX3dyaXRlX3U4X3ZlcmlmeShzdHJ1Y3QgdHdsNDAzMF91c2IgKnR3bCwKKwkJdTggbW9kdWxlLCB1OCBkYXRhLCB1OCBhZGRyZXNzKQoreworCXU4IGNoZWNrOworCisJaWYgKCh0d2w0MDMwX2kyY193cml0ZV91OChtb2R1bGUsIGRhdGEsIGFkZHJlc3MpID49IDApICYmCisJICAgICh0d2w0MDMwX2kyY19yZWFkX3U4KG1vZHVsZSwgJmNoZWNrLCBhZGRyZXNzKSA+PSAwKSAmJgorCQkJCQkJKGNoZWNrID09IGRhdGEpKQorCQlyZXR1cm4gMDsKKwlkZXZfZGJnKHR3bC0+ZGV2LCAiV3JpdGUlZFslZCwweCV4XSB3cm90ZSAlMDJ4IGJ1dCByZWFkICUwMnhcbiIsCisJCQkxLCBtb2R1bGUsIGFkZHJlc3MsIGNoZWNrLCBkYXRhKTsKKworCS8qIEZhaWxlZCBvbmNlOiBUcnkgYWdhaW4gKi8KKwlpZiAoKHR3bDQwMzBfaTJjX3dyaXRlX3U4KG1vZHVsZSwgZGF0YSwgYWRkcmVzcykgPj0gMCkgJiYKKwkgICAgKHR3bDQwMzBfaTJjX3JlYWRfdTgobW9kdWxlLCAmY2hlY2ssIGFkZHJlc3MpID49IDApICYmCisJCQkJCQkoY2hlY2sgPT0gZGF0YSkpCisJCXJldHVybiAwOworCWRldl9kYmcodHdsLT5kZXYsICJXcml0ZSVkWyVkLDB4JXhdIHdyb3RlICUwMnggYnV0IHJlYWQgJTAyeFxuIiwKKwkJCTIsIG1vZHVsZSwgYWRkcmVzcywgY2hlY2ssIGRhdGEpOworCisJLyogRmFpbGVkIGFnYWluOiBSZXR1cm4gZXJyb3IgKi8KKwlyZXR1cm4gLUVCVVNZOworfQorCisjZGVmaW5lIHR3bDQwMzBfdXNiX3dyaXRlX3ZlcmlmeSh0d2wsIGFkZHJlc3MsIGRhdGEpCVwKKwl0d2w0MDMwX2kyY193cml0ZV91OF92ZXJpZnkodHdsLCBUV0w0MDMwX01PRFVMRV9VU0IsIChkYXRhKSwgKGFkZHJlc3MpKQorCitzdGF0aWMgaW5saW5lIGludCB0d2w0MDMwX3VzYl93cml0ZShzdHJ1Y3QgdHdsNDAzMF91c2IgKnR3bCwKKwkJdTggYWRkcmVzcywgdTggZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IHR3bDQwMzBfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1VTQiwgZGF0YSwgYWRkcmVzcyk7CisJaWYgKHJldCA8IDApCisJCWRldl9kYmcodHdsLT5kZXYsCisJCQkiVFdMNDAzMDpVU0I6V3JpdGVbMHgleF0gRXJyb3IgJWRcbiIsIGFkZHJlc3MsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgdHdsNDAzMF9yZWFkYihzdHJ1Y3QgdHdsNDAzMF91c2IgKnR3bCwgdTggbW9kdWxlLCB1OCBhZGRyZXNzKQoreworCXU4IGRhdGE7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSB0d2w0MDMwX2kyY19yZWFkX3U4KG1vZHVsZSwgJmRhdGEsIGFkZHJlc3MpOworCWlmIChyZXQgPj0gMCkKKwkJcmV0ID0gZGF0YTsKKwllbHNlCisJCWRldl9kYmcodHdsLT5kZXYsCisJCQkiVFdMNDAzMDpyZWFkYlsweCV4LDB4JXhdIEVycm9yICVkXG4iLAorCQkJCQltb2R1bGUsIGFkZHJlc3MsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGludCB0d2w0MDMwX3VzYl9yZWFkKHN0cnVjdCB0d2w0MDMwX3VzYiAqdHdsLCB1OCBhZGRyZXNzKQoreworCXJldHVybiB0d2w0MDMwX3JlYWRiKHR3bCwgVFdMNDAzMF9NT0RVTEVfVVNCLCBhZGRyZXNzKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBpbnQKK3R3bDQwMzBfdXNiX3NldF9iaXRzKHN0cnVjdCB0d2w0MDMwX3VzYiAqdHdsLCB1OCByZWcsIHU4IGJpdHMpCit7CisJcmV0dXJuIHR3bDQwMzBfdXNiX3dyaXRlKHR3bCwgcmVnICsgMSwgYml0cyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Cit0d2w0MDMwX3VzYl9jbGVhcl9iaXRzKHN0cnVjdCB0d2w0MDMwX3VzYiAqdHdsLCB1OCByZWcsIHU4IGJpdHMpCit7CisJcmV0dXJuIHR3bDQwMzBfdXNiX3dyaXRlKHR3bCwgcmVnICsgMiwgYml0cyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBlbnVtIGxpbmtzdGF0IHR3bDQwMzBfdXNiX2xpbmtzdGF0KHN0cnVjdCB0d2w0MDMwX3VzYiAqdHdsKQoreworCWludAlzdGF0dXM7CisJaW50CWxpbmtzdGF0ID0gVVNCX0xJTktfVU5LTk9XTjsKKworCS8qIFNUU19IV19DT05ESVRJT05TICovCisJc3RhdHVzID0gdHdsNDAzMF9yZWFkYih0d2wsIFRXTDQwMzBfTU9EVUxFX1BNX01BU1RFUiwgMHgwZik7CisJaWYgKHN0YXR1cyA8IDApCisJCWRldl9lcnIodHdsLT5kZXYsICJVU0IgbGluayBzdGF0dXMgZXJyICVkXG4iLCBzdGF0dXMpOworCWVsc2UgaWYgKHN0YXR1cyAmIEJJVCg3KSkKKwkJbGlua3N0YXQgPSBVU0JfTElOS19WQlVTOworCWVsc2UgaWYgKHN0YXR1cyAmIEJJVCgyKSkKKwkJbGlua3N0YXQgPSBVU0JfTElOS19JRDsKKwllbHNlCisJCWxpbmtzdGF0ID0gVVNCX0xJTktfTk9ORTsKKworCWRldl9kYmcodHdsLT5kZXYsICJIV19DT05ESVRJT05TIDB4JTAyeC8lZDsgbGluayAlZFxuIiwKKwkJCXN0YXR1cywgc3RhdHVzLCBsaW5rc3RhdCk7CisKKwkvKiBSRVZJU0lUIHRoaXMgYXNzdW1lcyBob3N0IGFuZCBwZXJpcGhlcmFsIGNvbnRyb2xsZXJzCisJICogYXJlIHJlZ2lzdGVyZWQsIGFuZCB0aGF0IGJvdGggYXJlIGFjdGl2ZS4uLgorCSAqLworCisJc3Bpbl9sb2NrX2lycSgmdHdsLT5sb2NrKTsKKwl0d2wtPmxpbmtzdGF0ID0gbGlua3N0YXQ7CisJaWYgKGxpbmtzdGF0ID09IFVTQl9MSU5LX0lEKSB7CisJCXR3bC0+b3RnLmRlZmF1bHRfYSA9IHRydWU7CisJCXR3bC0+b3RnLnN0YXRlID0gT1RHX1NUQVRFX0FfSURMRTsKKwl9IGVsc2UgeworCQl0d2wtPm90Zy5kZWZhdWx0X2EgPSBmYWxzZTsKKwkJdHdsLT5vdGcuc3RhdGUgPSBPVEdfU1RBVEVfQl9JRExFOworCX0KKwlzcGluX3VubG9ja19pcnEoJnR3bC0+bG9jayk7CisKKwlyZXR1cm4gbGlua3N0YXQ7Cit9CisKK3N0YXRpYyB2b2lkIHR3bDQwMzBfdXNiX3NldF9tb2RlKHN0cnVjdCB0d2w0MDMwX3VzYiAqdHdsLCBpbnQgbW9kZSkKK3sKKwl0d2wtPnVzYl9tb2RlID0gbW9kZTsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgVDJfVVNCX01PREVfVUxQSToKKwkJdHdsNDAzMF91c2JfY2xlYXJfYml0cyh0d2wsIElGQ19DVFJMLCBJRkNfQ1RSTF9DQVJLSVRNT0RFKTsKKwkJdHdsNDAzMF91c2Jfc2V0X2JpdHModHdsLCBQT1dFUl9DVFJMLCBQT1dFUl9DVFJMX09UR19FTkFCKTsKKwkJdHdsNDAzMF91c2JfY2xlYXJfYml0cyh0d2wsIEZVTkNfQ1RSTCwKKwkJCQkJRlVOQ19DVFJMX1hDVlJTRUxFQ1RfTUFTSyB8CisJCQkJCUZVTkNfQ1RSTF9PUE1PREVfTUFTSyk7CisJCWJyZWFrOworCWNhc2UgLTE6CisJCS8qIEZJWE1FOiBwb3dlciBvbiBkZWZhdWx0cyAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKHR3bC0+ZGV2LCAidW5zdXBwb3J0ZWQgVDIgdHJhbnNjZWl2ZXIgbW9kZSAlZFxuIiwKKwkJCQltb2RlKTsKKwkJYnJlYWs7CisJfTsKK30KKworc3RhdGljIHZvaWQgdHdsNDAzMF9pMmNfYWNjZXNzKHN0cnVjdCB0d2w0MDMwX3VzYiAqdHdsLCBpbnQgb24pCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWludCB2YWwgPSB0d2w0MDMwX3VzYl9yZWFkKHR3bCwgUEhZX0NMS19DVFJMKTsKKworCWlmICh2YWwgPj0gMCkgeworCQlpZiAob24pIHsKKwkJCS8qIGVuYWJsZSBEUExMIHRvIGFjY2VzcyBQSFkgcmVnaXN0ZXJzIG92ZXIgSTJDICovCisJCQl2YWwgfD0gUkVRX1BIWV9EUExMX0NMSzsKKwkJCVdBUk5fT04odHdsNDAzMF91c2Jfd3JpdGVfdmVyaWZ5KHR3bCwgUEhZX0NMS19DVFJMLAorCQkJCQkJKHU4KXZhbCkgPCAwKTsKKworCQkJdGltZW91dCA9IGppZmZpZXMgKyBIWjsKKwkJCXdoaWxlICghKHR3bDQwMzBfdXNiX3JlYWQodHdsLCBQSFlfQ0xLX0NUUkxfU1RTKSAmCisJCQkJCQkJUEhZX0RQTExfQ0xLKQorCQkJCSYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJCQl1ZGVsYXkoMTApOworCQkJaWYgKCEodHdsNDAzMF91c2JfcmVhZCh0d2wsIFBIWV9DTEtfQ1RSTF9TVFMpICYKKwkJCQkJCQlQSFlfRFBMTF9DTEspKQorCQkJCWRldl9lcnIodHdsLT5kZXYsICJUaW1lb3V0IHNldHRpbmcgVDIgSFNVU0IgIgorCQkJCQkJIlBIWSBEUExMIGNsb2NrXG4iKTsKKwkJfSBlbHNlIHsKKwkJCS8qIGxldCBVTFBJIGNvbnRyb2wgdGhlIERQTEwgY2xvY2sgKi8KKwkJCXZhbCAmPSB+UkVRX1BIWV9EUExMX0NMSzsKKwkJCVdBUk5fT04odHdsNDAzMF91c2Jfd3JpdGVfdmVyaWZ5KHR3bCwgUEhZX0NMS19DVFJMLAorCQkJCQkJKHU4KXZhbCkgPCAwKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgdHdsNDAzMF9waHlfcG93ZXIoc3RydWN0IHR3bDQwMzBfdXNiICp0d2wsIGludCBvbikKK3sKKwl1OCBwd3I7CisKKwlwd3IgPSB0d2w0MDMwX3VzYl9yZWFkKHR3bCwgUEhZX1BXUl9DVFJMKTsKKwlpZiAob24pIHsKKwkJcHdyICY9IH5QSFlfUFdSX1BIWVBXRDsKKwkJV0FSTl9PTih0d2w0MDMwX3VzYl93cml0ZV92ZXJpZnkodHdsLCBQSFlfUFdSX0NUUkwsIHB3cikgPCAwKTsKKwkJdHdsNDAzMF91c2Jfd3JpdGUodHdsLCBQSFlfQ0xLX0NUUkwsCisJCQkJICB0d2w0MDMwX3VzYl9yZWFkKHR3bCwgUEhZX0NMS19DVFJMKSB8CisJCQkJCShQSFlfQ0xLX0NUUkxfQ0xPQ0tHQVRJTkdfRU4gfAorCQkJCQkJUEhZX0NMS19DVFJMX0NMSzMyS19FTikpOworCX0gZWxzZSAgeworCQlwd3IgfD0gUEhZX1BXUl9QSFlQV0Q7CisJCVdBUk5fT04odHdsNDAzMF91c2Jfd3JpdGVfdmVyaWZ5KHR3bCwgUEhZX1BXUl9DVFJMLCBwd3IpIDwgMCk7CisJfQorfQorCitzdGF0aWMgdm9pZCB0d2w0MDMwX3BoeV9zdXNwZW5kKHN0cnVjdCB0d2w0MDMwX3VzYiAqdHdsLCBpbnQgY29udHJvbGxlcl9vZmYpCit7CisJaWYgKHR3bC0+YXNsZWVwKQorCQlyZXR1cm47CisKKwl0d2w0MDMwX3BoeV9wb3dlcih0d2wsIDApOworCXR3bC0+YXNsZWVwID0gMTsKK30KKworc3RhdGljIHZvaWQgdHdsNDAzMF9waHlfcmVzdW1lKHN0cnVjdCB0d2w0MDMwX3VzYiAqdHdsKQoreworCWlmICghdHdsLT5hc2xlZXApCisJCXJldHVybjsKKworCXR3bDQwMzBfcGh5X3Bvd2VyKHR3bCwgMSk7CisJdHdsNDAzMF9pMmNfYWNjZXNzKHR3bCwgMSk7CisJdHdsNDAzMF91c2Jfc2V0X21vZGUodHdsLCB0d2wtPnVzYl9tb2RlKTsKKwlpZiAodHdsLT51c2JfbW9kZSA9PSBUMl9VU0JfTU9ERV9VTFBJKQorCQl0d2w0MDMwX2kyY19hY2Nlc3ModHdsLCAwKTsKKwl0d2wtPmFzbGVlcCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHR3bDQwMzBfdXNiX2xkb19pbml0KHN0cnVjdCB0d2w0MDMwX3VzYiAqdHdsKQoreworCS8qIEVuYWJsZSB3cml0aW5nIHRvIHBvd2VyIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzICovCisJdHdsNDAzMF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfUE1fTUFTVEVSLCAweEMwLCBQUk9URUNUX0tFWSk7CisJdHdsNDAzMF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfUE1fTUFTVEVSLCAweDBDLCBQUk9URUNUX0tFWSk7CisKKwkvKiBwdXQgVlVTQjNWMSBMRE8gaW4gYWN0aXZlIHN0YXRlICovCisJdHdsNDAzMF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfUE1fUkVDRUlWRVIsIDAsIFZVU0JfREVESUNBVEVEMik7CisKKwkvKiBpbnB1dCB0byBWVVNCM1YxIExETyBpcyBmcm9tIFZCQVQsIG5vdCBWQlVTICovCisJdHdsNDAzMF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfUE1fUkVDRUlWRVIsIDB4MTQsIFZVU0JfREVESUNBVEVEMSk7CisKKwkvKiB0dXJuIG9uIDMuMVYgcmVndWxhdG9yICovCisJdHdsNDAzMF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfUE1fUkVDRUlWRVIsIDB4MjAsIFZVU0IzVjFfREVWX0dSUCk7CisJdHdsNDAzMF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfUE1fUkVDRUlWRVIsIDAsIFZVU0IzVjFfVFlQRSk7CisKKwkvKiB0dXJuIG9uIDEuNVYgcmVndWxhdG9yICovCisJdHdsNDAzMF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfUE1fUkVDRUlWRVIsIDB4MjAsIFZVU0IxVjVfREVWX0dSUCk7CisJdHdsNDAzMF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfUE1fUkVDRUlWRVIsIDAsIFZVU0IxVjVfVFlQRSk7CisKKwkvKiB0dXJuIG9uIDEuOFYgcmVndWxhdG9yICovCisJdHdsNDAzMF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfUE1fUkVDRUlWRVIsIDB4MjAsIFZVU0IxVjhfREVWX0dSUCk7CisJdHdsNDAzMF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfUE1fUkVDRUlWRVIsIDAsIFZVU0IxVjhfVFlQRSk7CisKKwkvKiBkaXNhYmxlIGFjY2VzcyB0byBwb3dlciBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLworCXR3bDQwMzBfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX01BU1RFUiwgMCwgUFJPVEVDVF9LRVkpOworfQorCitzdGF0aWMgc3NpemVfdCB0d2w0MDMwX3VzYl92YnVzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCB0d2w0MDMwX3VzYiAqdHdsID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0d2wtPmxvY2ssIGZsYWdzKTsKKwlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVzXG4iLAorCQkJKHR3bC0+bGlua3N0YXQgPT0gVVNCX0xJTktfVkJVUykgPyAib24iIDogIm9mZiIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR3bC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUih2YnVzLCAwNDQ0LCB0d2w0MDMwX3VzYl92YnVzX3Nob3csIE5VTEwpOworCitzdGF0aWMgaXJxcmV0dXJuX3QgdHdsNDAzMF91c2JfaXJxKGludCBpcnEsIHZvaWQgKl90d2wpCit7CisJc3RydWN0IHR3bDQwMzBfdXNiICp0d2wgPSBfdHdsOworCWludCBzdGF0dXM7CisKKyNpZmRlZiBDT05GSUdfTE9DS0RFUAorCS8qIFdPUktBUk9VTkQgZm9yIGxvY2tkZXAgZm9yY2luZyBJUlFGX0RJU0FCTEVEIG9uIHVzLCB3aGljaAorCSAqIHdlIGRvbid0IHdhbnQgYW5kIGNhbid0IHRvbGVyYXRlLiAgQWx0aG91Z2ggaXQgbWlnaHQgYmUKKwkgKiBmcmllbmRsaWVyIG5vdCB0byBib3Jyb3cgdGhpcyB0aHJlYWQgY29udGV4dC4uLgorCSAqLworCWxvY2FsX2lycV9lbmFibGUoKTsKKyNlbmRpZgorCisJc3RhdHVzID0gdHdsNDAzMF91c2JfbGlua3N0YXQodHdsKTsKKwlpZiAoc3RhdHVzICE9IFVTQl9MSU5LX1VOS05PV04pIHsKKworCQkvKiBGSVhNRSBhZGQgYSBzZXRfcG93ZXIoKSBtZXRob2Qgc28gdGhhdCBCLWRldmljZXMgY2FuCisJCSAqIGNvbmZpZ3VyZSB0aGUgY2hhcmdlciBhcHByb3ByaWF0ZWx5LiAgSXQncyBub3QgYWx3YXlzCisJCSAqIGNvcnJlY3QgdG8gY29uc3VtZSBWQlVTIHBvd2VyLCBhbmQgaG93IG11Y2ggY3VycmVudCB0bworCQkgKiBjb25zdW1lIGlzIGEgZnVuY3Rpb24gb2YgdGhlIFVTQiBjb25maWd1cmF0aW9uIGNob3NlbgorCQkgKiBieSB0aGUgaG9zdC4KKwkJICoKKwkJICogUkVWSVNJVCB1c2JfZ2FkZ2V0X3ZidXNfY29ubmVjdCguLi4pIGFzIG5lZWRlZCwgZGl0dG8KKwkJICogaXRzIGRpc2Nvbm5lY3QoKSBzaWJsaW5nLCB3aGVuIGNoYW5naW5nIHRvL2Zyb20gdGhlCisJCSAqIFVTQl9MSU5LX1ZCVVMgc3RhdGUuICBtdXNiX2hkcmMgd29uJ3QgY2FyZSB1bnRpbCBpdAorCQkgKiBzdGFydHMgdG8gaGFuZGxlIHNvZnRjb25uZWN0IHJpZ2h0LgorCQkgKi8KKwkJdHdsNDAzMGNoYXJnZXJfdXNiX2VuKHN0YXR1cyA9PSBVU0JfTElOS19WQlVTKTsKKworCQlpZiAoc3RhdHVzID09IFVTQl9MSU5LX05PTkUpCisJCQl0d2w0MDMwX3BoeV9zdXNwZW5kKHR3bCwgMCk7CisJCWVsc2UKKwkJCXR3bDQwMzBfcGh5X3Jlc3VtZSh0d2wpOworCX0KKwlzeXNmc19ub3RpZnkoJnR3bC0+ZGV2LT5rb2JqLCBOVUxMLCAidmJ1cyIpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IHR3bDQwMzBfc2V0X3N1c3BlbmQoc3RydWN0IG90Z190cmFuc2NlaXZlciAqeCwgaW50IHN1c3BlbmQpCit7CisJc3RydWN0IHR3bDQwMzBfdXNiICp0d2wgPSB4Y2Vpdl90b190d2woeCk7CisKKwlpZiAoc3VzcGVuZCkKKwkJdHdsNDAzMF9waHlfc3VzcGVuZCh0d2wsIDEpOworCWVsc2UKKwkJdHdsNDAzMF9waHlfcmVzdW1lKHR3bCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0d2w0MDMwX3NldF9wZXJpcGhlcmFsKHN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKngsCisJCXN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQpCit7CisJc3RydWN0IHR3bDQwMzBfdXNiICp0d2w7CisKKwlpZiAoIXgpCisJCXJldHVybiAtRU5PREVWOworCisJdHdsID0geGNlaXZfdG9fdHdsKHgpOworCXR3bC0+b3RnLmdhZGdldCA9IGdhZGdldDsKKwlpZiAoIWdhZGdldCkKKwkJdHdsLT5vdGcuc3RhdGUgPSBPVEdfU1RBVEVfVU5ERUZJTkVEOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHdsNDAzMF9zZXRfaG9zdChzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyICp4LCBzdHJ1Y3QgdXNiX2J1cyAqaG9zdCkKK3sKKwlzdHJ1Y3QgdHdsNDAzMF91c2IgKnR3bDsKKworCWlmICgheCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl0d2wgPSB4Y2Vpdl90b190d2woeCk7CisJdHdsLT5vdGcuaG9zdCA9IGhvc3Q7CisJaWYgKCFob3N0KQorCQl0d2wtPm90Zy5zdGF0ZSA9IE9UR19TVEFURV9VTkRFRklORUQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgdHdsNDAzMF91c2JfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdHdsNDAzMF91c2JfZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgdHdsNDAzMF91c2IJKnR3bDsKKwlpbnQJCQlzdGF0dXM7CisKKwlpZiAoIXBkYXRhKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgInBsYXRmb3JtX2RhdGEgbm90IGF2YWlsYWJsZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXR3bCA9IGt6YWxsb2Moc2l6ZW9mICp0d2wsIEdGUF9LRVJORUwpOworCWlmICghdHdsKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXR3bC0+ZGV2CQk9ICZwZGV2LT5kZXY7CisJdHdsLT5pcnEJCT0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwl0d2wtPm90Zy5kZXYJCT0gdHdsLT5kZXY7CisJdHdsLT5vdGcubGFiZWwJCT0gInR3bDQwMzAiOworCXR3bC0+b3RnLnNldF9ob3N0CT0gdHdsNDAzMF9zZXRfaG9zdDsKKwl0d2wtPm90Zy5zZXRfcGVyaXBoZXJhbAk9IHR3bDQwMzBfc2V0X3BlcmlwaGVyYWw7CisJdHdsLT5vdGcuc2V0X3N1c3BlbmQJPSB0d2w0MDMwX3NldF9zdXNwZW5kOworCXR3bC0+dXNiX21vZGUJCT0gcGRhdGEtPnVzYl9tb2RlOworCXR3bC0+YXNsZWVwCQk9IDE7CisKKwkvKiBpbml0IHNwaW5sb2NrIGZvciB3b3JrcXVldWUgKi8KKwlzcGluX2xvY2tfaW5pdCgmdHdsLT5sb2NrKTsKKworCXR3bDQwMzBfdXNiX2xkb19pbml0KHR3bCk7CisJb3RnX3NldF90cmFuc2NlaXZlcigmdHdsLT5vdGcpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgdHdsKTsKKwlpZiAoZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl92YnVzKSkKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImNvdWxkIG5vdCBjcmVhdGUgc3lzZnMgZmlsZVxuIik7CisKKwkvKiBPdXIgam9iIGlzIHRvIHVzZSBpcnFzIGFuZCBzdGF0dXMgZnJvbSB0aGUgcG93ZXIgbW9kdWxlCisJICogdG8ga2VlcCB0aGUgdHJhbnNjZWl2ZXIgZGlzYWJsZWQgd2hlbiBub3RoaW5nJ3MgY29ubmVjdGVkLgorCSAqCisJICogRklYTUUgd2UgYWN0dWFsbHkgc2hvdWxkbid0IHN0YXJ0IGVuYWJsaW5nIGl0IHVudGlsIHRoZQorCSAqIFVTQiBjb250cm9sbGVyIGRyaXZlcnMgaGF2ZSBzYWlkIHRoZXkncmUgcmVhZHksIGJ5IGNhbGxpbmcKKwkgKiBzZXRfaG9zdCgpIGFuZC9vciBzZXRfcGVyaXBoZXJhbCgpIC4uLiBPVEdfY2FwYWJsZSBib2FyZHMKKwkgKiBuZWVkIGJvdGggaGFuZGxlcywgb3RoZXJ3aXNlIGp1c3Qgb25lIHN1ZmZpY2VzLgorCSAqLworCXR3bC0+aXJxX2VuYWJsZWQgPSB0cnVlOworCXN0YXR1cyA9IHJlcXVlc3RfaXJxKHR3bC0+aXJxLCB0d2w0MDMwX3VzYl9pcnEsCisJCQlJUlFGX1RSSUdHRVJfRkFMTElORyB8IElSUUZfVFJJR0dFUl9SSVNJTkcsCisJCQkidHdsNDAzMF91c2IiLCB0d2wpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgImNhbid0IGdldCBJUlEgJWQsIGVyciAlZFxuIiwKKwkJCXR3bC0+aXJxLCBzdGF0dXMpOworCQlrZnJlZSh0d2wpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCS8qIFRoZSBJUlEgaGFuZGxlciBqdXN0IGhhbmRsZXMgY2hhbmdlcyBmcm9tIHRoZSBwcmV2aW91cyBzdGF0ZXMKKwkgKiBvZiB0aGUgSUQgYW5kIFZCVVMgcGlucyAuLi4gaW4gcHJvYmUoKSB3ZSBtdXN0IGluaXRpYWxpemUgdGhhdAorCSAqIHByZXZpb3VzIHN0YXRlLiAgVGhlIGVhc3kgd2F5OiAgZmFrZSBhbiBJUlEuCisJICoKKwkgKiBSRVZJU0lUOiAgYSByZWFsIElSUSBtaWdodCBoYXZlIGhhcHBlbmVkIGFscmVhZHksIGlmIFBSRUVNUFQgaXMKKwkgKiBlbmFibGVkLiAgRWxzZSB0aGUgSVJRIG1heSBub3QgeWV0IGJlIGNvbmZpZ3VyZWQgb3IgZW5hYmxlZCwKKwkgKiBiZWNhdXNlIG9mIHNjaGVkdWxpbmcgZGVsYXlzLgorCSAqLworCXR3bDQwMzBfdXNiX2lycSh0d2wtPmlycSwgdHdsKTsKKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJJbml0aWFsaXplZCBUV0w0MDMwIFVTQiBtb2R1bGVcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZXhpdCB0d2w0MDMwX3VzYl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdHdsNDAzMF91c2IgKnR3bCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWludCB2YWw7CisKKwlmcmVlX2lycSh0d2wtPmlycSwgdHdsKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUodHdsLT5kZXYsICZkZXZfYXR0cl92YnVzKTsKKworCS8qIHNldCB0cmFuc2NlaXZlciBtb2RlIHRvIHBvd2VyIG9uIGRlZmF1bHRzICovCisJdHdsNDAzMF91c2Jfc2V0X21vZGUodHdsLCAtMSk7CisKKwkvKiBhdXRvZ2F0ZSA2ME1IeiBVTFBJIGNsb2NrLAorCSAqIGNsZWFyIGRwbGwgY2xvY2sgcmVxdWVzdCBmb3IgaTJjIGFjY2VzcywKKwkgKiBkaXNhYmxlIDMyS0h6CisJICovCisJdmFsID0gdHdsNDAzMF91c2JfcmVhZCh0d2wsIFBIWV9DTEtfQ1RSTCk7CisJaWYgKHZhbCA+PSAwKSB7CisJCXZhbCB8PSBQSFlfQ0xLX0NUUkxfQ0xPQ0tHQVRJTkdfRU47CisJCXZhbCAmPSB+KFBIWV9DTEtfQ1RSTF9DTEszMktfRU4gfCBSRVFfUEhZX0RQTExfQ0xLKTsKKwkJdHdsNDAzMF91c2Jfd3JpdGUodHdsLCBQSFlfQ0xLX0NUUkwsICh1OCl2YWwpOworCX0KKworCS8qIGRpc2FibGUgY29tcGxldGUgT1RHIGJsb2NrICovCisJdHdsNDAzMF91c2JfY2xlYXJfYml0cyh0d2wsIFBPV0VSX0NUUkwsIFBPV0VSX0NUUkxfT1RHX0VOQUIpOworCisJdHdsNDAzMF9waHlfcG93ZXIodHdsLCAwKTsKKworCWtmcmVlKHR3bCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdHdsNDAzMF91c2JfZHJpdmVyID0geworCS5wcm9iZQkJPSB0d2w0MDMwX3VzYl9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZXhpdF9wKHR3bDQwMzBfdXNiX3JlbW92ZSksCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInR3bDQwMzBfdXNiIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHR3bDQwMzBfdXNiX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ0d2w0MDMwX3VzYl9kcml2ZXIpOworfQorc3Vic3lzX2luaXRjYWxsKHR3bDQwMzBfdXNiX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgdHdsNDAzMF91c2JfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ0d2w0MDMwX3VzYl9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQodHdsNDAzMF91c2JfZXhpdCk7CisKK01PRFVMRV9BTElBUygicGxhdGZvcm06dHdsNDAzMF91c2IiKTsKK01PRFVMRV9BVVRIT1IoIlRleGFzIEluc3RydW1lbnRzLCBJbmMsIE5va2lhIENvcnBvcmF0aW9uIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRXTDQwMzAgVVNCIHRyYW5zY2VpdmVyIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL0tjb25maWcgYi9kcml2ZXJzL3VzYi9zZXJpYWwvS2NvbmZpZwppbmRleCA3MDMzOGY0Li5iMzYxZjA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvS2NvbmZpZwpAQCAtNDk2LDYgKzQ5NiwxNCBAQAogCWJvb2wgIlVTQiBTZWN1cmUgRW5jYXBzdWxhdGVkIERyaXZlciAtIFBhZGRlZCIKIAlkZXBlbmRzIG9uIFVTQl9TRVJJQUxfU0FGRQogCitjb25maWcgVVNCX1NFUklBTF9TSUVNRU5TX01QSQorCXRyaXN0YXRlICJVU0IgU2llbWVucyBNUEkgZHJpdmVyIgorCWhlbHAKKwkgIFNheSBNIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGEgU2llbWVucyBVU0IvTVBJIGFkYXB0ZXIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNpZW1lbnNfbXBpLgorCiBjb25maWcgVVNCX1NFUklBTF9TSUVSUkFXSVJFTEVTUwogCXRyaXN0YXRlICJVU0IgU2llcnJhIFdpcmVsZXNzIERyaXZlciIKIAloZWxwCkBAIC01NjUsNiArNTczLDE1IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBvbW5pbmV0LgogCitjb25maWcgVVNCX1NFUklBTF9PUFRJQ09OCisJdHJpc3RhdGUgIlVTQiBPcHRpY29uIEJhcmNvZGUgZHJpdmVyIChzZXJpYWwgbW9kZSkiCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgYSBPcHRpY29uIFVTQiBCYXJjb2RlIGRldmljZQorCSAgaW4gc2VyaWFsIGVtdWxhdGlvbiBtb2RlLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBvcHRpY29uLgorCiBjb25maWcgVVNCX1NFUklBTF9ERUJVRwogCXRyaXN0YXRlICJVU0IgRGVidWdnaW5nIERldmljZSIKIAloZWxwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9zZXJpYWwvTWFrZWZpbGUKaW5kZXggNjA0N2Y4MS4uYjc1YmU5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9NYWtlZmlsZQpAQCAtNDEsMTAgKzQxLDEyIEBACiBvYmotJChDT05GSUdfVVNCX1NFUklBTF9NT1RPUk9MQSkJCSs9IG1vdG9fbW9kZW0ubwogb2JqLSQoQ09ORklHX1VTQl9TRVJJQUxfTkFWTUFOKQkJCSs9IG5hdm1hbi5vCiBvYmotJChDT05GSUdfVVNCX1NFUklBTF9PTU5JTkVUKQkJKz0gb21uaW5ldC5vCitvYmotJChDT05GSUdfVVNCX1NFUklBTF9PUFRJQ09OKQkJKz0gb3B0aWNvbi5vCiBvYmotJChDT05GSUdfVVNCX1NFUklBTF9PUFRJT04pCQkJKz0gb3B0aW9uLm8KIG9iai0kKENPTkZJR19VU0JfU0VSSUFMX09USTY4NTgpCQkrPSBvdGk2ODU4Lm8KIG9iai0kKENPTkZJR19VU0JfU0VSSUFMX1BMMjMwMykJCQkrPSBwbDIzMDMubwogb2JqLSQoQ09ORklHX1VTQl9TRVJJQUxfU0FGRSkJCQkrPSBzYWZlX3NlcmlhbC5vCitvYmotJChDT05GSUdfVVNCX1NFUklBTF9TSUVNRU5TX01QSSkJCSs9IHNpZW1lbnNfbXBpLm8KIG9iai0kKENPTkZJR19VU0JfU0VSSUFMX1NJRVJSQVdJUkVMRVNTKQkJKz0gc2llcnJhLm8KIG9iai0kKENPTkZJR19VU0JfU0VSSUFMX1NQQ1A4WDUpCQkrPSBzcGNwOHg1Lm8KIG9iai0kKENPTkZJR19VU0JfU0VSSUFMX1RJKQkJCSs9IHRpX3VzYl8zNDEwXzUwNTIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2RpZ2lfYWNjZWxlcG9ydC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2RpZ2lfYWNjZWxlcG9ydC5jCmluZGV4IDY5Zjg0ZjAuLjM4YmE0ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9kaWdpX2FjY2VsZXBvcnQuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZGlnaV9hY2NlbGVwb3J0LmMKQEAgLTYzNSw4ICs2MzUsNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm9vYl9wcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzKTsKIAl3aGlsZSAoY291bnQgPiAwKSB7Ci0JCXdoaWxlIChvb2JfcG9ydC0+d3JpdGVfdXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTCi0JCQl8fCBvb2JfcHJpdi0+ZHBfd3JpdGVfdXJiX2luX3VzZSkgeworCQl3aGlsZSAob29iX3ByaXYtPmRwX3dyaXRlX3VyYl9pbl91c2UpIHsKIAkJCWNvbmRfd2FpdF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXRfaXJxcmVzdG9yZSgKIAkJCQkmb29iX3BvcnQtPndyaXRlX3dhaXQsIERJR0lfUkVUUllfVElNRU9VVCwKIAkJCQkmb29iX3ByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MpOwpAQCAtNjk5LDkgKzY5OCw4IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+ZHBfcG9ydF9sb2NrLCBmbGFncyk7CiAJd2hpbGUgKGNvdW50ID4gMCAmJiByZXQgPT0gMCkgewotCQl3aGlsZSAoKHBvcnQtPndyaXRlX3VyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUwotCQkJCXx8IHByaXYtPmRwX3dyaXRlX3VyYl9pbl91c2UpCi0JCQkJCSYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCXdoaWxlIChwcml2LT5kcF93cml0ZV91cmJfaW5fdXNlICYmCisJCSAgICAgICB0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgewogCQkJY29uZF93YWl0X2ludGVycnVwdGlibGVfdGltZW91dF9pcnFyZXN0b3JlKAogCQkJCSZwb3J0LT53cml0ZV93YWl0LCBESUdJX1JFVFJZX1RJTUVPVVQsCiAJCQkJJnByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MpOwpAQCAtNzc5LDggKzc3Nyw3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJm9vYl9wcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzKTsKIAlzcGluX2xvY2soJnBvcnRfcHJpdi0+ZHBfcG9ydF9sb2NrKTsKIAotCXdoaWxlIChvb2JfcG9ydC0+d3JpdGVfdXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTIHx8Ci0JCQkJCW9vYl9wcml2LT5kcF93cml0ZV91cmJfaW5fdXNlKSB7CisJd2hpbGUgKG9vYl9wcml2LT5kcF93cml0ZV91cmJfaW5fdXNlKSB7CiAJCXNwaW5fdW5sb2NrKCZwb3J0X3ByaXYtPmRwX3BvcnRfbG9jayk7CiAJCWNvbmRfd2FpdF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXRfaXJxcmVzdG9yZSgKIAkJCSZvb2JfcG9ydC0+d3JpdGVfd2FpdCwgRElHSV9SRVRSWV9USU1FT1VULApAQCAtMTE2OCwxMiArMTE2NSwxMCBAQAogCiAJLyogYmUgc3VyZSBvbmx5IG9uZSB3cml0ZSBwcm9jZWVkcyBhdCBhIHRpbWUgKi8KIAkvKiB0aGVyZSBhcmUgcmFjZXMgb24gdGhlIHBvcnQgcHJpdmF0ZSBidWZmZXIgKi8KLQkvKiBhbmQgcmFjZXMgdG8gY2hlY2sgd3JpdGVfdXJiLT5zdGF0dXMgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+ZHBfcG9ydF9sb2NrLCBmbGFncyk7CiAKIAkvKiB3YWl0IGZvciB1cmIgc3RhdHVzIGNsZWFyIHRvIHN1Ym1pdCBhbm90aGVyIHVyYiAqLwotCWlmIChwb3J0LT53cml0ZV91cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MgfHwKLQkJCQkJcHJpdi0+ZHBfd3JpdGVfdXJiX2luX3VzZSkgeworCWlmIChwcml2LT5kcF93cml0ZV91cmJfaW5fdXNlKSB7CiAJCS8qIGJ1ZmZlciBkYXRhIGlmIGNvdW50IGlzIDEgKHByb2JhYmx5IHB1dF9jaGFyKSBpZiBwb3NzaWJsZSAqLwogCQlpZiAoY291bnQgPT0gMSAmJiBwcml2LT5kcF9vdXRfYnVmX2xlbiA8IERJR0lfT1VUX0JVRl9TSVpFKSB7CiAJCQlwcml2LT5kcF9vdXRfYnVmW3ByaXYtPmRwX291dF9idWZfbGVuKytdID0gKmJ1ZjsKQEAgLTEyMzYsNyArMTIzMSw3IEBACiAJaW50IHJldCA9IDA7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JZGJnKCJkaWdpX3dyaXRlX2J1bGtfY2FsbGJhY2s6IFRPUCwgdXJiLT5zdGF0dXM9JWQiLCBzdGF0dXMpOworCWRiZygiZGlnaV93cml0ZV9idWxrX2NhbGxiYWNrOiBUT1AsIHN0YXR1cz0lZCIsIHN0YXR1cyk7CiAKIAkvKiBwb3J0IGFuZCBzZXJpYWwgc2FuaXR5IGNoZWNrICovCiAJaWYgKHBvcnQgPT0gTlVMTCB8fCAocHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KSkgPT0gTlVMTCkgewpAQCAtMTI2Niw4ICsxMjYxLDcgQEAKIAkvKiB0cnkgdG8gc2VuZCBhbnkgYnVmZmVyZWQgZGF0YSBvbiB0aGlzIHBvcnQsIGlmIGl0IGlzIG9wZW4gKi8KIAlzcGluX2xvY2soJnByaXYtPmRwX3BvcnRfbG9jayk7CiAJcHJpdi0+ZHBfd3JpdGVfdXJiX2luX3VzZSA9IDA7Ci0JaWYgKHBvcnQtPnBvcnQuY291bnQgJiYgcG9ydC0+d3JpdGVfdXJiLT5zdGF0dXMgIT0gLUVJTlBST0dSRVNTCi0JICAgICYmIHByaXYtPmRwX291dF9idWZfbGVuID4gMCkgeworCWlmIChwb3J0LT5wb3J0LmNvdW50ICYmIHByaXYtPmRwX291dF9idWZfbGVuID4gMCkgewogCQkqKCh1bnNpZ25lZCBjaGFyICopKHBvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyKSkKIAkJCT0gKHVuc2lnbmVkIGNoYXIpRElHSV9DTURfU0VORF9EQVRBOwogCQkqKCh1bnNpZ25lZCBjaGFyICopKHBvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyKSArIDEpCkBAIC0xMzA1LDggKzEyOTksNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MpOwogCi0JaWYgKHBvcnQtPndyaXRlX3VyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUyB8fAotCQkJCQlwcml2LT5kcF93cml0ZV91cmJfaW5fdXNlKQorCWlmIChwcml2LT5kcF93cml0ZV91cmJfaW5fdXNlKQogCQlyb29tID0gMDsKIAllbHNlCiAJCXJvb20gPSBwb3J0LT5idWxrX291dF9zaXplIC0gMiAtIHByaXYtPmRwX291dF9idWZfbGVuOwpAQCAtMTMyMiw4ICsxMzE1LDcgQEAKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKIAlzdHJ1Y3QgZGlnaV9wb3J0ICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCi0JaWYgKHBvcnQtPndyaXRlX3VyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUwotCSAgICB8fCBwcml2LT5kcF93cml0ZV91cmJfaW5fdXNlKSB7CisJaWYgKHByaXYtPmRwX3dyaXRlX3VyYl9pbl91c2UpIHsKIAkJZGJnKCJkaWdpX2NoYXJzX2luX2J1ZmZlcjogcG9ydD0lZCwgY2hhcnM9JWQiLAogCQkJcHJpdi0+ZHBfcG9ydF9udW0sIHBvcnQtPmJ1bGtfb3V0X3NpemUgLSAyKTsKIAkJLyogcmV0dXJuKHBvcnQtPmJ1bGtfb3V0X3NpemUgLSAyKTsgKi8KQEAgLTE3MDIsNyArMTY5NCw3IEBACiAJLyogc2hvcnQvbXVsdGlwbGUgcGFja2V0IGNoZWNrICovCiAJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCAhPSBsZW4gKyAyKSB7CiAJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzOiBJTkNPTVBMRVRFIE9SIE1VTFRJUExFIFBBQ0tFVCwgIgotCQkJInVyYi0+c3RhdHVzPSVkLCBwb3J0PSVkLCBvcGNvZGU9JWQsIGxlbj0lZCwgIgorCQkJInN0YXR1cz0lZCwgcG9ydD0lZCwgb3Bjb2RlPSVkLCBsZW49JWQsICIKIAkJCSJhY3R1YWxfbGVuZ3RoPSVkLCBzdGF0dXM9JWRcbiIsIF9fZnVuY19fLCBzdGF0dXMsCiAJCQlwcml2LT5kcF9wb3J0X251bSwgb3Bjb2RlLCBsZW4sIHVyYi0+YWN0dWFsX2xlbmd0aCwKIAkJCXBvcnRfc3RhdHVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9nYXJtaW5fZ3BzLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZ2FybWluX2dwcy5jCmluZGV4IDhlNmE2NmUuLmEyNmEwZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9nYXJtaW5fZ3BzLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2dhcm1pbl9ncHMuYwpAQCAtMTA1Niw3ICsxMDU2LDcgQEAKIAogCQlpZiAoc3RhdHVzKSB7CiAJCQlkYmcoIiVzIC0gbm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkJICAgIF9fZnVuY19fLCB1cmItPnN0YXR1cyk7CisJCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ2FybWluX2RhdGFfcC0+bG9jaywgZmxhZ3MpOwogCQkJZ2FybWluX2RhdGFfcC0+ZmxhZ3MgfD0gQ0xFQVJfSEFMVF9SRVFVSVJFRDsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdhcm1pbl9kYXRhX3AtPmxvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9pcHcuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9pcHcuYwppbmRleCAzYWM1OWE4Li5mNTMwMDMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvaXB3LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2lwdy5jCkBAIC00NzMsNyArNDczLDcgQEAKIAogCiAKLXN0YXRpYyBpbnQgdXNiX2lwd19pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCB1c2JfaXB3X2luaXQodm9pZCkKIHsKIAlpbnQgcmV0dmFsOwogCkBAIC00OTAsNyArNDkwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgdXNiX2lwd19leGl0KHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgdXNiX2lwd19leGl0KHZvaWQpCiB7CiAJdXNiX2RlcmVnaXN0ZXIoJnVzYl9pcHdfZHJpdmVyKTsKIAl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJmlwd19kZXZpY2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2l1dV9waG9lbml4LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvaXV1X3Bob2VuaXguYwppbmRleCBlMzIwOTcyLi4yMzE0YzZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvaXV1X3Bob2VuaXguYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvaXV1X3Bob2VuaXguYwpAQCAtMTkwLDEwICsxOTAsMTIgQEAKIHsKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdXJiLT5jb250ZXh0OwogCWludCByZXN1bHQ7CisJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOworCiAJZGJnKCIlcyAtIGVudGVyIiwgX19mdW5jX18pOwogCi0JaWYgKHVyYi0+c3RhdHVzKSB7Ci0JCWRiZygiJXMgLSB1cmItPnN0YXR1cyA9ICVkIiwgX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKKwlpZiAoc3RhdHVzKSB7CisJCWRiZygiJXMgLSBzdGF0dXMgPSAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQkvKiBlcnJvciBzdG9wIGFsbCAqLwogCQlyZXR1cm47CiAJfQpAQCAtMjQ1LDEwICsyNDcsMTIgQEAKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdXJiLT5jb250ZXh0OwogCXN0cnVjdCBpdXVfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAl1OCAqc3Q7CisJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOworCiAJZGJnKCIlcyAtIGVudGVyIiwgX19mdW5jX18pOwogCi0JaWYgKHVyYi0+c3RhdHVzKSB7Ci0JCWRiZygiJXMgLSB1cmItPnN0YXR1cyA9ICVkIiwgX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKKwlpZiAoc3RhdHVzKSB7CisJCWRiZygiJXMgLSBzdGF0dXMgPSAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQkvKiBlcnJvciBzdG9wIGFsbCAqLwogCQlyZXR1cm47CiAJfQpAQCAtMjc0LDkgKzI3OCw5IEBACiB7CiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlpbnQgcmVzdWx0OwotCWRiZygiJXMgLSBlbnRlciIsIF9fZnVuY19fKTsKKwlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKLQlkYmcoIiVzIC0gdXJiLT5zdGF0dXMgPSAlZCIsIF9fZnVuY19fLCB1cmItPnN0YXR1cyk7CisJZGJnKCIlcyAtIHN0YXR1cyA9ICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiAJdXNiX2ZpbGxfYnVsa191cmIocG9ydC0+cmVhZF91cmIsIHBvcnQtPnNlcmlhbC0+ZGV2LAogCQkJICB1c2JfcmN2YnVsa3BpcGUocG9ydC0+c2VyaWFsLT5kZXYsCiAJCQkJCSAgcG9ydC0+YnVsa19pbl9lbmRwb2ludEFkZHJlc3MpLApAQCAtNjE4LDExICs2MjIsMTIgQEAKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdXJiLT5jb250ZXh0OwogCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwotCWRiZygiJXMgLSB1cmItPnN0YXR1cyA9ICVkIiwgX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKKwlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKLQlpZiAodXJiLT5zdGF0dXMpIHsKLQkJZGJnKCIlcyAtIHVyYi0+c3RhdHVzID0gJWQiLCBfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOwotCQlpZiAodXJiLT5zdGF0dXMgPT0gLUVQUk9UTykgeworCWRiZygiJXMgLSBzdGF0dXMgPSAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOworCisJaWYgKHN0YXR1cykgeworCQlpZiAoc3RhdHVzID09IC1FUFJPVE8pIHsKIAkJCS8qIHJlc2NoZWR1bGUgbmVlZGVkICovCiAJCX0KIAkJcmV0dXJuOwpAQCAtNjk1LDcgKzcwMCw3IEBACiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3QgaXV1X3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgc3RhdHVzOworCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAlpbnQgZXJyb3IgPSAwOwogCWludCBsZW4gPSAwOwogCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKQEAgLTcwMyw4ICs3MDgsOCBAQAogCiAJZGJnKCIlcyAtIGVudGVyIiwgX19mdW5jX18pOwogCi0JaWYgKHVyYi0+c3RhdHVzKSB7Ci0JCWRiZygiJXMgLSB1cmItPnN0YXR1cyA9ICVkIiwgX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKKwlpZiAoc3RhdHVzKSB7CisJCWRiZygiJXMgLSBzdGF0dXMgPSAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogCQkvKiBlcnJvciBzdG9wIGFsbCAqLwogCQlyZXR1cm47CiAJfQpAQCAtNzgyLDEyICs3ODcsMTEgQEAKIHsKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdXJiLT5jb250ZXh0OwogCWludCByZXN1bHQ7Ci0JZGJnKCIlcyAtIGVudGVyIiwgX19mdW5jX18pOworCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRiZygiJXMgLSB1cmItPnN0YXR1cyA9ICVkIiwgX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKKwlkYmcoIiVzIC0gc3RhdHVzID0gJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAotCWlmICh1cmItPnN0YXR1cykgewotCQlkYmcoIiVzIC0gdXJiLT5zdGF0dXMgPSAlZCIsIF9fZnVuY19fLCB1cmItPnN0YXR1cyk7CisJaWYgKHN0YXR1cykgewogCQkvKiBlcnJvciBzdG9wIGFsbCAqLwogCQlyZXR1cm47CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL21vczc4NDAuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3ODQwLmMKaW5kZXggOTZhOGM3Ny4uMmMyMGU4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL21vczc4NDAuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzg0MC5jCkBAIC0yMTQsNiArMjE0LDcgQEAKIAlzcGlubG9ja190IHBvb2xfbG9jazsKIAlzdHJ1Y3QgdXJiICp3cml0ZV91cmJfcG9vbFtOVU1fVVJCU107CiAJY2hhciBidXN5W05VTV9VUkJTXTsKKwlib29sIHJlYWRfdXJiX2J1c3k7CiB9OwogCiAKQEAgLTY3OSwyNiArNjgwLDMwIEBACiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKLQlpZiAoc3RhdHVzKSB7Ci0JCWRiZygibm9uemVybyByZWFkIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIHN0YXR1cyk7Ci0JCXJldHVybjsKLQl9Ci0KIAltb3M3ODQwX3BvcnQgPSB1cmItPmNvbnRleHQ7CiAJaWYgKCFtb3M3ODQwX3BvcnQpIHsKIAkJZGJnKCIlcyIsICJOVUxMIG1vczc4NDBfcG9ydCBwb2ludGVyIFxuIik7CisJCW1vczc4NDBfcG9ydC0+cmVhZF91cmJfYnVzeSA9IGZhbHNlOworCQlyZXR1cm47CisJfQorCisJaWYgKHN0YXR1cykgeworCQlkYmcoIm5vbnplcm8gcmVhZCBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLCBzdGF0dXMpOworCQltb3M3ODQwX3BvcnQtPnJlYWRfdXJiX2J1c3kgPSBmYWxzZTsKIAkJcmV0dXJuOwogCX0KIAogCXBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKW1vczc4NDBfcG9ydC0+cG9ydDsKIAlpZiAobW9zNzg0MF9wb3J0X3BhcmFub2lhX2NoZWNrKHBvcnQsIF9fZnVuY19fKSkgewogCQlkYmcoIiVzIiwgIlBvcnQgUGFyYW5vaWEgZmFpbGVkIFxuIik7CisJCW1vczc4NDBfcG9ydC0+cmVhZF91cmJfYnVzeSA9IGZhbHNlOwogCQlyZXR1cm47CiAJfQogCiAJc2VyaWFsID0gbW9zNzg0MF9nZXRfdXNiX3NlcmlhbChwb3J0LCBfX2Z1bmNfXyk7CiAJaWYgKCFzZXJpYWwpIHsKIAkJZGJnKCIlc1xuIiwgIkJhZCBzZXJpYWwgcG9pbnRlciAiKTsKKwkJbW9zNzg0MF9wb3J0LT5yZWFkX3VyYl9idXN5ID0gZmFsc2U7CiAJCXJldHVybjsKIAl9CiAKQEAgLTcyNSwxNyArNzMwLDE5IEBACiAKIAlpZiAoIW1vczc4NDBfcG9ydC0+cmVhZF91cmIpIHsKIAkJZGJnKCIlcyIsICJVUkIgS0lMTEVEICEhIVxuIik7CisJCW1vczc4NDBfcG9ydC0+cmVhZF91cmJfYnVzeSA9IGZhbHNlOwogCQlyZXR1cm47CiAJfQogCiAKIAltb3M3ODQwX3BvcnQtPnJlYWRfdXJiLT5kZXYgPSBzZXJpYWwtPmRldjsKIAorCW1vczc4NDBfcG9ydC0+cmVhZF91cmJfYnVzeSA9IHRydWU7CiAJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIobW9zNzg0MF9wb3J0LT5yZWFkX3VyYiwgR0ZQX0FUT01JQyk7CiAKIAlpZiAocmV0dmFsKSB7Ci0JCWRiZygiIHVzYl9zdWJtaXRfdXJiKHJlYWQgYnVsaykgZmFpbGVkLCByZXR2YWwgPSAlZCIsCi0JCSByZXR2YWwpOworCQlkYmcoInVzYl9zdWJtaXRfdXJiKHJlYWQgYnVsaykgZmFpbGVkLCByZXR2YWwgPSAlZCIsIHJldHZhbCk7CisJCW1vczc4NDBfcG9ydC0+cmVhZF91cmJfYnVzeSA9IGZhbHNlOwogCX0KIH0KIApAQCAtMTA1NSwxMCArMTA2MiwxMiBAQAogCiAJZGJnKCJtb3M3ODQwX29wZW46IGJ1bGtpbiBlbmRwb2ludCBpcyAlZFxuIiwKIAkgICAgcG9ydC0+YnVsa19pbl9lbmRwb2ludEFkZHJlc3MpOworCW1vczc4NDBfcG9ydC0+cmVhZF91cmJfYnVzeSA9IHRydWU7CiAJcmVzcG9uc2UgPSB1c2Jfc3VibWl0X3VyYihtb3M3ODQwX3BvcnQtPnJlYWRfdXJiLCBHRlBfS0VSTkVMKTsKIAlpZiAocmVzcG9uc2UpIHsKIAkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBFcnJvciAlZCBzdWJtaXR0aW5nIGNvbnRyb2wgdXJiXG4iLAogCQkJX19mdW5jX18sIHJlc3BvbnNlKTsKKwkJbW9zNzg0MF9wb3J0LT5yZWFkX3VyYl9idXN5ID0gZmFsc2U7CiAJfQogCiAJLyogaW5pdGlhbGl6ZSBvdXIgd2FpdCBxdWV1ZXMgKi8KQEAgLTEyMjcsNiArMTIzNiw3IEBACiAJCWlmIChtb3M3ODQwX3BvcnQtPnJlYWRfdXJiKSB7CiAJCQlkYmcoIiVzIiwgIlNodXRkb3duIGJ1bGsgcmVhZFxuIik7CiAJCQl1c2Jfa2lsbF91cmIobW9zNzg0MF9wb3J0LT5yZWFkX3VyYik7CisJCQltb3M3ODQwX3BvcnQtPnJlYWRfdXJiX2J1c3kgPSBmYWxzZTsKIAkJfQogCQlpZiAoKCZtb3M3ODQwX3BvcnQtPmNvbnRyb2xfdXJiKSkgewogCQkJZGJnKCIlcyIsICJTaHV0ZG93biBjb250cm9sIHJlYWRcbiIpOwpAQCAtMjA0MywxNCArMjA1MywxNCBAQAogCURhdGEgPSAweDBjOwogCW1vczc4NDBfc2V0X3VhcnRfcmVnKHBvcnQsIElOVEVSUlVQVF9FTkFCTEVfUkVHSVNURVIsIERhdGEpOwogCi0JaWYgKG1vczc4NDBfcG9ydC0+cmVhZF91cmItPnN0YXR1cyAhPSAtRUlOUFJPR1JFU1MpIHsKKwlpZiAobW9zNzg0MF9wb3J0LT5yZWFkX3VyYl9idXN5ID09IGZhbHNlKSB7CiAJCW1vczc4NDBfcG9ydC0+cmVhZF91cmItPmRldiA9IHNlcmlhbC0+ZGV2OwotCisJCW1vczc4NDBfcG9ydC0+cmVhZF91cmJfYnVzeSA9IHRydWU7CiAJCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiKG1vczc4NDBfcG9ydC0+cmVhZF91cmIsIEdGUF9BVE9NSUMpOwotCiAJCWlmIChzdGF0dXMpIHsKLQkJCWRiZygiIHVzYl9zdWJtaXRfdXJiKHJlYWQgYnVsaykgZmFpbGVkLCBzdGF0dXMgPSAlZCIsCisJCQlkYmcoInVzYl9zdWJtaXRfdXJiKHJlYWQgYnVsaykgZmFpbGVkLCBzdGF0dXMgPSAlZCIsCiAJCQkgICAgc3RhdHVzKTsKKwkJCW1vczc4NDBfcG9ydC0+cmVhZF91cmJfYnVzeSA9IGZhbHNlOwogCQl9CiAJfQogCXdha2VfdXAoJm1vczc4NDBfcG9ydC0+ZGVsdGFfbXNyX3dhaXQpOwpAQCAtMjExNywxMiArMjEyNywxNCBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKG1vczc4NDBfcG9ydC0+cmVhZF91cmItPnN0YXR1cyAhPSAtRUlOUFJPR1JFU1MpIHsKKwlpZiAobW9zNzg0MF9wb3J0LT5yZWFkX3VyYl9idXN5ID09IGZhbHNlKSB7CiAJCW1vczc4NDBfcG9ydC0+cmVhZF91cmItPmRldiA9IHNlcmlhbC0+ZGV2OworCQltb3M3ODQwX3BvcnQtPnJlYWRfdXJiX2J1c3kgPSB0cnVlOwogCQlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYihtb3M3ODQwX3BvcnQtPnJlYWRfdXJiLCBHRlBfQVRPTUlDKTsKIAkJaWYgKHN0YXR1cykgewotCQkJZGJnKCIgdXNiX3N1Ym1pdF91cmIocmVhZCBidWxrKSBmYWlsZWQsIHN0YXR1cyA9ICVkIiwKKwkJCWRiZygidXNiX3N1Ym1pdF91cmIocmVhZCBidWxrKSBmYWlsZWQsIHN0YXR1cyA9ICVkIiwKIAkJCSAgICBzdGF0dXMpOworCQkJbW9zNzg0MF9wb3J0LT5yZWFkX3VyYl9idXN5ID0gZmFsc2U7CiAJCX0KIAl9CiAJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL29wdGljb24uYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpY29uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VhMzI2ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpY29uLmMKQEAgLTAsMCArMSwzNTggQEAKKy8qCisgKiBPcHRpY29uIFVTQiBiYXJjb2RlIHRvIHNlcmlhbCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hAc3VzZS5kZT4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBOb3ZlbGwgSW5jLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqCTIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC91c2Ivc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorCitzdGF0aWMgaW50IGRlYnVnOworCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgaWRfdGFibGVbXSA9IHsKKwl7IFVTQl9ERVZJQ0UoMHgwNjVhLCAweDAwMDkpIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBpZF90YWJsZSk7CisKKy8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIGFsbCBvZiB0aGUgaW5kaXZpZHVhbCBkZXZpY2UgaW5mb3JtYXRpb24gKi8KK3N0cnVjdCBvcHRpY29uX3ByaXZhdGUgeworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OworCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWw7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydDsKKwl1bnNpZ25lZCBjaGFyICpidWxrX2luX2J1ZmZlcjsKKwlzdHJ1Y3QgdXJiICpidWxrX3JlYWRfdXJiOworCWludCBidWZmZXJfc2l6ZTsKKwl1OCBidWxrX2FkZHJlc3M7CisJc3BpbmxvY2tfdCBsb2NrOwkvKiBwcm90ZWN0cyB0aGUgZm9sbG93aW5nIGZsYWdzICovCisJYm9vbCB0aHJvdHRsZWQ7CisJYm9vbCBhY3R1YWxseV90aHJvdHRsZWQ7CisJYm9vbCBydHM7Cit9OworCitzdGF0aWMgdm9pZCBvcHRpY29uX2J1bGtfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCBvcHRpY29uX3ByaXZhdGUgKnByaXYgPSB1cmItPmNvbnRleHQ7CisJdW5zaWduZWQgY2hhciAqZGF0YSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSBwcml2LT5wb3J0OworCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCWludCByZXN1bHQ7CisJaW50IGF2YWlsYWJsZV9yb29tID0gMDsKKwlpbnQgZGF0YV9sZW5ndGg7CisKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOworCisJc3dpdGNoIChzdGF0dXMpIHsKKwljYXNlIDA6CisJCS8qIHN1Y2Nlc3MgKi8KKwkJYnJlYWs7CisJY2FzZSAtRUNPTk5SRVNFVDoKKwljYXNlIC1FTk9FTlQ6CisJY2FzZSAtRVNIVVRET1dOOgorCQkvKiB0aGlzIHVyYiBpcyB0ZXJtaW5hdGVkLCBjbGVhbiB1cCAqLworCQlkYmcoIiVzIC0gdXJiIHNodXR0aW5nIGRvd24gd2l0aCBzdGF0dXM6ICVkIiwKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOworCQlyZXR1cm47CisJZGVmYXVsdDoKKwkJZGJnKCIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogJWQiLAorCQkgICAgX19mdW5jX18sIHN0YXR1cyk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fZnVuY19fLCB1cmItPmFjdHVhbF9sZW5ndGgsCisJCQkgICAgICBkYXRhKTsKKworCWlmICh1cmItPmFjdHVhbF9sZW5ndGggPiAyKSB7CisJCWRhdGFfbGVuZ3RoID0gdXJiLT5hY3R1YWxfbGVuZ3RoIC0gMjsKKworCQkvKgorCQkgKiBEYXRhIGZyb20gdGhlIGRldmljZSBjb21lcyB3aXRoIGEgMiBieXRlIGhlYWRlcjoKKwkJICoKKwkJICogPDB4MDA+PDB4MDA+ZGF0YS4uLgorCQkgKiAJVGhpcyBpcyByZWFsIGRhdGEgdG8gYmUgc2VudCB0byB0aGUgdHR5IGxheWVyCisJCSAqIDwweDAwPjwweDAxKWxldmVsCisJCSAqIAlUaGlzIGlzIGEgUlRTIGxldmVsIGNoYW5nZSwgdGhlIHRoaXJkIGJ5dGUgaXMgdGhlIFJUUworCQkgKiAJdmFsdWUgKDAgZm9yIGxvdywgMSBmb3IgaGlnaCkuCisJCSAqLworCQlpZiAoKGRhdGFbMF0gPT0gMHgwMCkgJiYgKGRhdGFbMV0gPT0gMHgwMCkpIHsKKwkJCS8qIHJlYWwgZGF0YSwgc2VuZCBpdCB0byB0aGUgdHR5IGxheWVyICovCisJCQl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZwb3J0LT5wb3J0KTsKKwkJCWlmICh0dHkpIHsKKwkJCQlhdmFpbGFibGVfcm9vbSA9IHR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwKKwkJCQkJCQkJZGF0YV9sZW5ndGgpOworCQkJCWlmIChhdmFpbGFibGVfcm9vbSkgeworCQkJCQl0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKHR0eSwgZGF0YSwKKwkJCQkJCQkgICAgICAgYXZhaWxhYmxlX3Jvb20pOworCQkJCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOworCQkJCX0KKwkJCQl0dHlfa3JlZl9wdXQodHR5KTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICgoZGF0YVswXSA9PSAweDAwKSAmJiAoZGF0YVsxXSA9PSAweDAxKSkgeworCQkJCWlmIChkYXRhWzJdID09IDB4MDApCisJCQkJCXByaXYtPnJ0cyA9IGZhbHNlOworCQkJCWVsc2UKKwkJCQkJcHJpdi0+cnRzID0gdHJ1ZTsKKwkJCQkvKiBGSVhNRSBjaGFuZ2UgdGhlIFJUUyBsZXZlbCAqLworCQkJfSBlbHNlIHsKKwkJCWRldl9kYmcoJnByaXYtPnVkZXYtPmRldiwKKwkJCQkiVW5rbm93biBkYXRhIHBhY2tldCByZWNlaXZlZCBmcm9tIHRoZSBkZXZpY2U6IgorCQkJCSIgJTJ4ICUyeFxuIiwKKwkJCQlkYXRhWzBdLCBkYXRhWzFdKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWRldl9kYmcoJnByaXYtPnVkZXYtPmRldiwKKwkJCSJJbXByb3BlciBhbW1vdW50IG9mIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgZGV2aWNlLCAiCisJCQkiJWQgYnl0ZXMiLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCX0KKworZXhpdDoKKwlzcGluX2xvY2soJnByaXYtPmxvY2spOworCisJLyogQ29udGludWUgdHJ5aW5nIHRvIGFsd2F5cyByZWFkIGlmIHdlIHNob3VsZCAqLworCWlmICghcHJpdi0+dGhyb3R0bGVkKSB7CisJCXVzYl9maWxsX2J1bGtfdXJiKHByaXYtPmJ1bGtfcmVhZF91cmIsIHByaXYtPnVkZXYsCisJCQkJICB1c2JfcmN2YnVsa3BpcGUocHJpdi0+dWRldiwKKwkJCQkJCSAgcHJpdi0+YnVsa19hZGRyZXNzKSwKKwkJCQkgIHByaXYtPmJ1bGtfaW5fYnVmZmVyLCBwcml2LT5idWZmZXJfc2l6ZSwKKwkJCQkgIG9wdGljb25fYnVsa19jYWxsYmFjaywgcHJpdik7CisJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPnJlYWRfdXJiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHJlc3VsdCkKKwkJCWRldl9lcnIoJnBvcnQtPmRldiwKKwkJCSAgICAiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZFxuIiwKKwkJCQkJCQlfX2Z1bmNfXywgcmVzdWx0KTsKKwl9IGVsc2UKKwkJcHJpdi0+YWN0dWFsbHlfdGhyb3R0bGVkID0gdHJ1ZTsKKwlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7Cit9CisKK3N0YXRpYyBpbnQgb3B0aWNvbl9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCisJCQlzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3Qgb3B0aWNvbl9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfZGF0YShwb3J0LT5zZXJpYWwpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJlc3VsdCA9IDA7CisKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlwcml2LT50aHJvdHRsZWQgPSBmYWxzZTsKKwlwcml2LT5hY3R1YWxseV90aHJvdHRsZWQgPSBmYWxzZTsKKwlwcml2LT5wb3J0ID0gcG9ydDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIEZvcmNlIGxvd19sYXRlbmN5IG9uIHNvIHRoYXQgb3VyIHR0eV9wdXNoIGFjdHVhbGx5IGZvcmNlcyB0aGUgZGF0YQorCSAqIHRocm91Z2gsIG90aGVyd2lzZSBpdCBpcyBzY2hlZHVsZWQsIGFuZCB3aXRoIGhpZ2ggZGF0YSByYXRlcyAobGlrZQorCSAqIHdpdGggT0hDSSkgZGF0YSBjYW4gZ2V0IGxvc3QuCisJICovCisJaWYgKHR0eSkKKwkJdHR5LT5sb3dfbGF0ZW5jeSA9IDE7CisKKwkvKiBTdGFydCByZWFkaW5nIGZyb20gdGhlIGRldmljZSAqLworCXVzYl9maWxsX2J1bGtfdXJiKHByaXYtPmJ1bGtfcmVhZF91cmIsIHByaXYtPnVkZXYsCisJCQkgIHVzYl9yY3ZidWxrcGlwZShwcml2LT51ZGV2LAorCQkJCQkgIHByaXYtPmJ1bGtfYWRkcmVzcyksCisJCQkgIHByaXYtPmJ1bGtfaW5fYnVmZmVyLCBwcml2LT5idWZmZXJfc2l6ZSwKKwkJCSAgb3B0aWNvbl9idWxrX2NhbGxiYWNrLCBwcml2KTsKKwlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwcml2LT5idWxrX3JlYWRfdXJiLCBHRlBfS0VSTkVMKTsKKwlpZiAocmVzdWx0KQorCQlkZXZfZXJyKCZwb3J0LT5kZXYsCisJCQkiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZFxuIiwKKwkJCV9fZnVuY19fLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIG9wdGljb25fY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKKwkJCSAgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IG9wdGljb25fcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX2RhdGEocG9ydC0+c2VyaWFsKTsKKworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CisKKwkvKiBzaHV0ZG93biBvdXIgdXJicyAqLworCXVzYl9raWxsX3VyYihwcml2LT5idWxrX3JlYWRfdXJiKTsKK30KKworc3RhdGljIHZvaWQgb3B0aWNvbl90aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBvcHRpY29uX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9kYXRhKHBvcnQtPnNlcmlhbCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlwcml2LT50aHJvdHRsZWQgPSB0cnVlOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKK30KKworCitzdGF0aWMgdm9pZCBvcHRpY29uX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3Qgb3B0aWNvbl9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfZGF0YShwb3J0LT5zZXJpYWwpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJlc3VsdDsKKworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCXByaXYtPnRocm90dGxlZCA9IGZhbHNlOworCXByaXYtPmFjdHVhbGx5X3Rocm90dGxlZCA9IGZhbHNlOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCXByaXYtPmJ1bGtfcmVhZF91cmItPmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OworCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHByaXYtPmJ1bGtfcmVhZF91cmIsIEdGUF9BVE9NSUMpOworCWlmIChyZXN1bHQpCisJCWRldl9lcnIoJnBvcnQtPmRldiwKKwkJCSIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZFxuIiwKKwkJCQkJCQlfX2Z1bmNfXywgcmVzdWx0KTsKK30KKworc3RhdGljIGludCBvcHRpY29uX3N0YXJ0dXAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKK3sKKwlzdHJ1Y3Qgb3B0aWNvbl9wcml2YXRlICpwcml2OworCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmludGY7CisJaW50IGk7CisJaW50IHJldHZhbCA9IC1FTk9NRU07CisJYm9vbCBidWxrX2luX2ZvdW5kID0gZmFsc2U7CisKKwkvKiBjcmVhdGUgb3VyIHByaXZhdGUgc2VyaWFsIHN0cnVjdHVyZSAqLworCXByaXYgPSBremFsbG9jKHNpemVvZigqcHJpdiksIEdGUF9LRVJORUwpOworCWlmIChwcml2ID09IE5VTEwpIHsKKwkJZGV2X2Vycigmc2VyaWFsLT5kZXYtPmRldiwgIiVzIC0gT3V0IG9mIG1lbW9yeVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmxvY2spOworCXByaXYtPnNlcmlhbCA9IHNlcmlhbDsKKwlwcml2LT5wb3J0ID0gc2VyaWFsLT5wb3J0WzBdOworCXByaXYtPnVkZXYgPSBzZXJpYWwtPmRldjsKKworCS8qIGZpbmQgb3VyIGJ1bGsgZW5kcG9pbnQgKi8KKwlpbnRmID0gc2VyaWFsLT5pbnRlcmZhY2UtPmFsdHNldHRpbmc7CisJZm9yIChpID0gMDsgaSA8IGludGYtPmRlc2MuYk51bUVuZHBvaW50czsgKytpKSB7CisJCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CisKKwkJZW5kcG9pbnQgPSAmaW50Zi0+ZW5kcG9pbnRbaV0uZGVzYzsKKwkJaWYgKCF1c2JfZW5kcG9pbnRfaXNfYnVsa19pbihlbmRwb2ludCkpCisJCQljb250aW51ZTsKKworCQlwcml2LT5idWxrX3JlYWRfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwcml2LT5idWxrX3JlYWRfdXJiKSB7CisJCQlkZXZfZXJyKCZwcml2LT51ZGV2LT5kZXYsICJvdXQgb2YgbWVtb3J5XG4iKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQlwcml2LT5idWZmZXJfc2l6ZSA9IGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSkgKiAyOworCQlwcml2LT5idWxrX2luX2J1ZmZlciA9IGttYWxsb2MocHJpdi0+YnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIXByaXYtPmJ1bGtfaW5fYnVmZmVyKSB7CisJCQlkZXZfZXJyKCZwcml2LT51ZGV2LT5kZXYsICJvdXQgb2YgbWVtb3J5XG4iKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQlwcml2LT5idWxrX2FkZHJlc3MgPSBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKKworCQkvKiBzZXQgdXAgb3VyIGJ1bGsgdXJiICovCisJCXVzYl9maWxsX2J1bGtfdXJiKHByaXYtPmJ1bGtfcmVhZF91cmIsIHByaXYtPnVkZXYsCisJCQkJICB1c2JfcmN2YnVsa3BpcGUocHJpdi0+dWRldiwKKwkJCQkJCSAgZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpLAorCQkJCSAgcHJpdi0+YnVsa19pbl9idWZmZXIsIHByaXYtPmJ1ZmZlcl9zaXplLAorCQkJCSAgb3B0aWNvbl9idWxrX2NhbGxiYWNrLCBwcml2KTsKKworCQlidWxrX2luX2ZvdW5kID0gdHJ1ZTsKKwkJYnJlYWs7CisJCX0KKworCWlmICghYnVsa19pbl9mb3VuZCkgeworCQlkZXZfZXJyKCZwcml2LT51ZGV2LT5kZXYsCisJCQkiRXJyb3IgLSB0aGUgcHJvcGVyIGVuZHBvaW50cyB3ZXJlIG5vdCBmb3VuZCFcbiIpOworCQlnb3RvIGVycm9yOworCX0KKworCXVzYl9zZXRfc2VyaWFsX2RhdGEoc2VyaWFsLCBwcml2KTsKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJdXNiX2ZyZWVfdXJiKHByaXYtPmJ1bGtfcmVhZF91cmIpOworCWtmcmVlKHByaXYtPmJ1bGtfaW5fYnVmZmVyKTsKKwlrZnJlZShwcml2KTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBvcHRpY29uX3NodXRkb3duKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCit7CisJc3RydWN0IG9wdGljb25fcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX2RhdGEoc2VyaWFsKTsKKworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CisKKwl1c2Jfa2lsbF91cmIocHJpdi0+YnVsa19yZWFkX3VyYik7CisJdXNiX2ZyZWVfdXJiKHByaXYtPmJ1bGtfcmVhZF91cmIpOworCWtmcmVlKHByaXYtPmJ1bGtfaW5fYnVmZmVyKTsKKwlrZnJlZShwcml2KTsKKwl1c2Jfc2V0X3NlcmlhbF9kYXRhKHNlcmlhbCwgTlVMTCk7Cit9CisKKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIG9wdGljb25fZHJpdmVyID0geworCS5uYW1lID0JCSJvcHRpY29uIiwKKwkucHJvYmUgPQl1c2Jfc2VyaWFsX3Byb2JlLAorCS5kaXNjb25uZWN0ID0JdXNiX3NlcmlhbF9kaXNjb25uZWN0LAorCS5pZF90YWJsZSA9CWlkX3RhYmxlLAorCS5ub19keW5hbWljX2lkID0gCTEsCit9OworCitzdGF0aWMgc3RydWN0IHVzYl9zZXJpYWxfZHJpdmVyIG9wdGljb25fZGV2aWNlID0geworCS5kcml2ZXIgPSB7CisJCS5vd25lciA9CVRISVNfTU9EVUxFLAorCQkubmFtZSA9CQkib3B0aWNvbiIsCisJfSwKKwkuaWRfdGFibGUgPQkJaWRfdGFibGUsCisJLnVzYl9kcml2ZXIgPSAJCSZvcHRpY29uX2RyaXZlciwKKwkubnVtX3BvcnRzID0JCTEsCisJLmF0dGFjaCA9CQlvcHRpY29uX3N0YXJ0dXAsCisJLm9wZW4gPQkJCW9wdGljb25fb3BlbiwKKwkuY2xvc2UgPQkJb3B0aWNvbl9jbG9zZSwKKwkuc2h1dGRvd24gPQkJb3B0aWNvbl9zaHV0ZG93biwKKwkudGhyb3R0bGUgPSAJCW9wdGljb25fdGhyb3R0bGUsCisJLnVudGhyb3R0bGUgPQkJb3B0aWNvbl91bnRocm90dGxlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgb3B0aWNvbl9pbml0KHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IHVzYl9zZXJpYWxfcmVnaXN0ZXIoJm9wdGljb25fZGV2aWNlKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCXJldHZhbCA9IHVzYl9yZWdpc3Rlcigmb3B0aWNvbl9kcml2ZXIpOworCWlmIChyZXR2YWwpCisJCXVzYl9zZXJpYWxfZGVyZWdpc3Rlcigmb3B0aWNvbl9kZXZpY2UpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBvcHRpY29uX2V4aXQodm9pZCkKK3sKKwl1c2JfZGVyZWdpc3Rlcigmb3B0aWNvbl9kcml2ZXIpOworCXVzYl9zZXJpYWxfZGVyZWdpc3Rlcigmb3B0aWNvbl9kZXZpY2UpOworfQorCittb2R1bGVfaW5pdChvcHRpY29uX2luaXQpOworbW9kdWxlX2V4aXQob3B0aWNvbl9leGl0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtKGRlYnVnLCBib29sLCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgZW5hYmxlZCBvciBub3QiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYwppbmRleCA4MDk2OTdiLi41ZWQxODM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jCkBAIC01MjIsOSArNTIyLDkgQEAKIC8qIHBlciBwb3J0IHByaXZhdGUgZGF0YSAqLwogCiAjZGVmaW5lIE5fSU5fVVJCIDQKLSNkZWZpbmUgTl9PVVRfVVJCIDEKKyNkZWZpbmUgTl9PVVRfVVJCIDQKICNkZWZpbmUgSU5fQlVGTEVOIDQwOTYKLSNkZWZpbmUgT1VUX0JVRkxFTiAxMjgKKyNkZWZpbmUgT1VUX0JVRkxFTiA0MDk2CiAKIHN0cnVjdCBvcHRpb25fcG9ydF9wcml2YXRlIHsKIAkvKiBJbnB1dCBlbmRwb2ludHMgYW5kIGJ1ZmZlciBmb3IgdGhpcyBwb3J0ICovCkBAIC02NTQsMTAgKzY1NCw2IEBACiAJCQl1c2JfdW5saW5rX3VyYih0aGlzX3VyYik7CiAJCQljb250aW51ZTsKIAkJfQotCQlpZiAodGhpc191cmItPnN0YXR1cyAhPSAwKQotCQkJZGJnKCJ1c2Jfd3JpdGUgJXAgZmFpbGVkIChlcnI9JWQpIiwKLQkJCQl0aGlzX3VyYiwgdGhpc191cmItPnN0YXR1cyk7Ci0KIAkJZGJnKCIlczogZW5kcG9pbnQgJWQgYnVmICVkIiwgX19mdW5jX18sCiAJCQl1c2JfcGlwZWVuZHBvaW50KHRoaXNfdXJiLT5waXBlKSwgaSk7CiAKQEAgLTY2OSw4ICs2NjUsNyBAQAogCQllcnIgPSB1c2Jfc3VibWl0X3VyYih0aGlzX3VyYiwgR0ZQX0FUT01JQyk7CiAJCWlmIChlcnIpIHsKIAkJCWRiZygidXNiX3N1Ym1pdF91cmIgJXAgKHdyaXRlIGJ1bGspIGZhaWxlZCAiCi0JCQkJIiglZCwgaGFzICVkKSIsIHRoaXNfdXJiLAotCQkJCWVyciwgdGhpc191cmItPnN0YXR1cyk7CisJCQkJIiglZCkiLCB0aGlzX3VyYiwgZXJyKTsKIAkJCWNsZWFyX2JpdChpLCAmcG9ydGRhdGEtPm91dF9idXN5KTsKIAkJCWNvbnRpbnVlOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvc2llbWVuc19tcGkuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9zaWVtZW5zX21waS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MWVhMGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvc2llbWVuc19tcGkuYwpAQCAtMCwwICsxLDc3IEBACisvKgorICogU2llbWVucyBVU0ItTVBJIFNlcmlhbCBVU0IgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFRob21hcyBIZXJnZW5oYWhuIDx0aG9tYXMuaGVyZ2VuaGFobkBzdXNlLmRlPgorICogQ29weXJpZ2h0IChDKSAyMDA1LDIwMDggR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hAc3VzZS5kZT4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKgkyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL3NlcmlhbC5oPgorCisvKiBWZXJzaW9uIEluZm9ybWF0aW9uICovCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICJWZXJzaW9uIDAuMSAwOS8yNi8yMDA1IgorI2RlZmluZSBEUklWRVJfQVVUSE9SICJUaG9tYXMgSGVyZ2VuaGFobkB3ZWIuZGUgaHR0cDovL2xpYm5vZGF2ZS5zZi5uZXQiCisjZGVmaW5lIERSSVZFUl9ERVNDICJEcml2ZXIgZm9yIFNpZW1lbnMgVVNCL01QSSBhZGFwdGVyIgorCisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBpZF90YWJsZVtdID0geworCS8qIFZlbmRvciBhbmQgcHJvZHVjdCBpZCBmb3IgNkVTNy05NzItMENCMjAtMFhBMCAqLworCXsgVVNCX0RFVklDRSgweDkwOCwgMHgwMDA0KSB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgc2llbWVuc191c2JfbXBpX2RyaXZlciA9IHsKKwkubmFtZSA9CQkic2llbWVuc19tcGkiLAorCS5wcm9iZSA9CXVzYl9zZXJpYWxfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPQl1c2Jfc2VyaWFsX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlID0JaWRfdGFibGUsCit9OworCitzdGF0aWMgc3RydWN0IHVzYl9zZXJpYWxfZHJpdmVyIHNpZW1lbnNfdXNiX21waV9kZXZpY2UgPSB7CisJLmRyaXZlciA9IHsKKwkJLm93bmVyID0JVEhJU19NT0RVTEUsCisJCS5uYW1lID0JCSJzaWVtZW5zX21waSIsCisJfSwKKwkuaWRfdGFibGUgPQkJaWRfdGFibGUsCisJLm51bV9wb3J0cyA9CQkxLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2llbWVuc191c2JfbXBpX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gdXNiX3NlcmlhbF9yZWdpc3Rlcigmc2llbWVuc191c2JfbXBpX2RldmljZSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBmYWlsZWRfdXNiX3NlcmlhbF9yZWdpc3RlcjsKKwlyZXR2YWwgPSB1c2JfcmVnaXN0ZXIoJnNpZW1lbnNfdXNiX21waV9kcml2ZXIpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZmFpbGVkX3VzYl9yZWdpc3RlcjsKKwlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9ERVNDICJcbiIpOworCXByaW50ayhLRVJOX0lORk8gRFJJVkVSX1ZFUlNJT04gIiAiIERSSVZFUl9BVVRIT1IgIlxuIik7CisJcmV0dXJuIHJldHZhbDsKK2ZhaWxlZF91c2JfcmVnaXN0ZXI6CisJdXNiX3NlcmlhbF9kZXJlZ2lzdGVyKCZzaWVtZW5zX3VzYl9tcGlfZGV2aWNlKTsKK2ZhaWxlZF91c2Jfc2VyaWFsX3JlZ2lzdGVyOgorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzaWVtZW5zX3VzYl9tcGlfZXhpdCh2b2lkKQoreworCXVzYl9kZXJlZ2lzdGVyKCZzaWVtZW5zX3VzYl9tcGlfZHJpdmVyKTsKKwl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJnNpZW1lbnNfdXNiX21waV9kZXZpY2UpOworfQorCittb2R1bGVfaW5pdChzaWVtZW5zX3VzYl9tcGlfaW5pdCk7Cittb2R1bGVfZXhpdChzaWVtZW5zX3VzYl9tcGlfZXhpdCk7CitNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9zcGNwOHg1LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvc3BjcDh4NS5jCmluZGV4IGE2NWJjMmIuLjVlNzUyOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9zcGNwOHg1LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3NwY3A4eDUuYwpAQCAtNzA5LDIxICs3MDksMjAgQEAKIAl1bnNpZ25lZCBjaGFyICpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgaTsKLQlpbnQgcmVzdWx0OwotCXU4IHN0YXR1cyA9IDA7CisJaW50IHJlc3VsdCA9IHVyYi0+c3RhdHVzOworCXU4IHN0YXR1czsKIAljaGFyIHR0eV9mbGFnOwogCi0JZGV2X2RiZygmcG9ydC0+ZGV2LCAic3RhcnQsIHVyYi0+c3RhdHVzID0gJWQsICIKLQkJInVyYi0+YWN0dWFsX2xlbmd0aCA9ICVkXG4sIiwgdXJiLT5zdGF0dXMsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJZGV2X2RiZygmcG9ydC0+ZGV2LCAic3RhcnQsIHJlc3VsdCA9ICVkLCB1cmItPmFjdHVhbF9sZW5ndGggPSAlZFxuLCIsCisJCXJlc3VsdCwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAogCS8qIGNoZWNrIHRoZSB1cmIgc3RhdHVzICovCi0JaWYgKHVyYi0+c3RhdHVzKSB7CisJaWYgKHJlc3VsdCkgewogCQlpZiAoIXBvcnQtPnBvcnQuY291bnQpCiAJCQlyZXR1cm47Ci0JCWlmICh1cmItPnN0YXR1cyA9PSAtRVBST1RPKSB7CisJCWlmIChyZXN1bHQgPT0gLUVQUk9UTykgewogCQkJLyogc3BjcDh4NSBteXN0ZXJpb3VzbHkgZmFpbHMgd2l0aCAtRVBST1RPICovCiAJCQkvKiByZXNjaGVkdWxlIHRoZSByZWFkICovCi0JCQl1cmItPnN0YXR1cyA9IDA7CiAJCQl1cmItPmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OwogCQkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIodXJiICwgR0ZQX0FUT01JQyk7CiAJCQlpZiAocmVzdWx0KQpAQCAtODMzLDggKzgzMiw5IEBACiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3Qgc3BjcDh4NV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCWludCByZXN1bHQ7CisJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0Jc3dpdGNoICh1cmItPnN0YXR1cykgeworCXN3aXRjaCAoc3RhdHVzKSB7CiAJY2FzZSAwOgogCQkvKiBzdWNjZXNzICovCiAJCWJyZWFrOwpAQCAtODQzLDE0ICs4NDMsMTQgQEAKIAljYXNlIC1FU0hVVERPV046CiAJCS8qIHRoaXMgdXJiIGlzIHRlcm1pbmF0ZWQsIGNsZWFuIHVwICovCiAJCWRldl9kYmcoJnBvcnQtPmRldiwgInVyYiBzaHV0dGluZyBkb3duIHdpdGggc3RhdHVzOiAlZFxuIiwKLQkJCXVyYi0+c3RhdHVzKTsKKwkJCXN0YXR1cyk7CiAJCXByaXYtPndyaXRlX3VyYl9pbl91c2UgPSAwOwogCQlyZXR1cm47CiAJZGVmYXVsdDoKIAkJLyogZXJyb3IgaW4gdGhlIHVyYiwgc28gd2UgaGF2ZSB0byByZXN1Ym1pdCBpdCAqLwogCQlkYmcoIiVzIC0gT3ZlcmZsb3cgaW4gd3JpdGUiLCBfX2Z1bmNfXyk7CiAJCWRiZygiJXMgLSBub256ZXJvIHdyaXRlIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsCi0JCQlfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOworCQkJX19mdW5jX18sIHN0YXR1cyk7CiAJCXBvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IDE7CiAJCXBvcnQtPndyaXRlX3VyYi0+ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CiAJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPndyaXRlX3VyYiwgR0ZQX0FUT01JQyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiX2RlYnVnLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiX2RlYnVnLmMKaW5kZXggZmM1ZDk5NS4uNmM5Y2JiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3VzYl9kZWJ1Zy5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC91c2JfZGVidWcuYwpAQCAtMzEsNyArMzEsNyBAQAogCS5ub19keW5hbWljX2lkID0gCTEsCiB9OwogCi1pbnQgdXNiX2RlYnVnX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKK3N0YXRpYyBpbnQgdXNiX2RlYnVnX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKIAkJCQkJCQlzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlwb3J0LT5idWxrX291dF9zaXplID0gVVNCX0RFQlVHX01BWF9QQUNLRVRfU0laRTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvS2NvbmZpZwppbmRleCBjNjhiNzM4Li45ZGY2ODg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL0tjb25maWcKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9LY29uZmlnCkBAIC02MSwxMyArNjEsNiBAQAogCSAgLSBDeVEndmUgQ1E4MDYwQSBDRFJXIGRyaXZlCiAJICAtIFBsYW5leCBlWHRyZW1lIERyaXZlIFJYLTI1SFUgVVNCLUlERSBjYWJsZSAobm90IG1vZGVsIFJYLTI1VSkKIAotY29uZmlnIFVTQl9TVE9SQUdFX0RQQ00KLQlib29sICJNaWNyb3RlY2gvWmlPISBDb21wYWN0Rmxhc2gvU21hcnRNZWRpYSBzdXBwb3J0IgotCWRlcGVuZHMgb24gVVNCX1NUT1JBR0UKLQloZWxwCi0JICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlIE1pY3JvdGVjaC9aaU8hIENvbXBhY3RGbGFzaCByZWFkZXIuCi0JICBUaGVyZSBpcyBhIHdlYiBwYWdlIGF0IDxodHRwOi8vd3d3Lnppb2NvcnAuY29tL3Byb2R1Y3RzLz4uCi0KIGNvbmZpZyBVU0JfU1RPUkFHRV9VU0JBVAogCWJvb2wgIlVTQkFUL1VTQkFUMDItYmFzZWQgc3RvcmFnZSBzdXBwb3J0IgogCWRlcGVuZHMgb24gVVNCX1NUT1JBR0UKQEAgLTkwLDEyICs4MywxMiBAQAogCSAgLSBTYW5kaXNrIEltYWdlTWF0ZSBTRERSLTA1YgogCiBjb25maWcgVVNCX1NUT1JBR0VfU0REUjA5Ci0JYm9vbCAiU2FuRGlzayBTRERSLTA5IChhbmQgb3RoZXIgU21hcnRNZWRpYSkgc3VwcG9ydCIKKwlib29sICJTYW5EaXNrIFNERFItMDkgKGFuZCBvdGhlciBTbWFydE1lZGlhLCBpbmNsdWRpbmcgRFBDTSkgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFVTQl9TVE9SQUdFCiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIGFkZGl0aW9uYWwgY29kZSB0byBzdXBwb3J0IHRoZSBTYW5kaXNrIFNERFItMDkKIAkgIFNtYXJ0TWVkaWEgcmVhZGVyIGluIHRoZSBVU0IgTWFzcyBTdG9yYWdlIGRyaXZlci4KLQkgIEFsc28gd29ya3MgZm9yIHRoZSBNaWNyb3RlY2ggWmlvISBTbWFydE1lZGlhIHJlYWRlci4KKwkgIEFsc28gd29ya3MgZm9yIHRoZSBNaWNyb3RlY2ggWmlvISBDb21wYWN0Rmxhc2gvU21hcnRNZWRpYSByZWFkZXIuCiAKIGNvbmZpZyBVU0JfU1RPUkFHRV9TRERSNTUKIAlib29sICJTYW5EaXNrIFNERFItNTUgU21hcnRNZWRpYSBzdXBwb3J0IgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvTWFrZWZpbGUKaW5kZXggN2Y4YmViNS4uYjMyMDY5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL01ha2VmaWxlCkBAIC0xNCw3ICsxNCw2IEBACiB1c2Itc3RvcmFnZS1vYmotJChDT05GSUdfVVNCX1NUT1JBR0VfU0REUjA5KQkrPSBzZGRyMDkubwogdXNiLXN0b3JhZ2Utb2JqLSQoQ09ORklHX1VTQl9TVE9SQUdFX1NERFI1NSkJKz0gc2RkcjU1Lm8KIHVzYi1zdG9yYWdlLW9iai0kKENPTkZJR19VU0JfU1RPUkFHRV9GUkVFQ09NKQkrPSBmcmVlY29tLm8KLXVzYi1zdG9yYWdlLW9iai0kKENPTkZJR19VU0JfU1RPUkFHRV9EUENNKQkrPSBkcGNtLm8KIHVzYi1zdG9yYWdlLW9iai0kKENPTkZJR19VU0JfU1RPUkFHRV9JU0QyMDApCSs9IGlzZDIwMC5vCiB1c2Itc3RvcmFnZS1vYmotJChDT05GSUdfVVNCX1NUT1JBR0VfREFUQUZBQikJKz0gZGF0YWZhYi5vCiB1c2Itc3RvcmFnZS1vYmotJChDT05GSUdfVVNCX1NUT1JBR0VfSlVNUFNIT1QpCSs9IGp1bXBzaG90Lm8KQEAgLTI0LDcgKzIzLDcgQEAKIHVzYi1zdG9yYWdlLW9iai0kKENPTkZJR19VU0JfU1RPUkFHRV9DWVBSRVNTX0FUQUNCKSArPSBjeXByZXNzX2F0YWNiLm8KIAogdXNiLXN0b3JhZ2Utb2JqcyA6PQlzY3NpZ2x1ZS5vIHByb3RvY29sLm8gdHJhbnNwb3J0Lm8gdXNiLm8gXAotCQkJaW5pdGlhbGl6ZXJzLm8gc2llcnJhX21zLm8gJCh1c2Itc3RvcmFnZS1vYmoteSkKKwkJCWluaXRpYWxpemVycy5vIHNpZXJyYV9tcy5vIG9wdGlvbl9tcy5vICQodXNiLXN0b3JhZ2Utb2JqLXkpCiAKIGlmbmVxICgkKENPTkZJR19VU0JfTElCVVNVQUwpLCkKIAlvYmotJChDT05GSUdfVVNCKQkrPSBsaWJ1c3VhbC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL2RwY20uYyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvZHBjbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Mzk5MjM0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvZHBjbS5jCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyogRHJpdmVyIGZvciBNaWNyb3RlY2ggRFBDTS1VU0IgQ29tcGFjdEZsYXNoL1NtYXJ0TWVkaWEgcmVhZGVyCi0gKgotICogRFBDTSBkcml2ZXIgdjAuMToKLSAqCi0gKiBGaXJzdCByZWxlYXNlCi0gKgotICogQ3VycmVudCBkZXZlbG9wbWVudCBhbmQgbWFpbnRlbmFuY2UgYnk6Ci0gKiAgIChjKSAyMDAwIEJyaWFuIFdlYmIgKHdlYmJiQGVhcnRobGluay5uZXQpCi0gKgotICogVGhpcyBkZXZpY2UgY29udGFpbnMgYm90aCBhIENvbXBhY3RGbGFzaCBjYXJkIHJlYWRlciwgd2hpY2gKLSAqIHVzZXMgdGhlIENvbnRyb2wvQnVsayB3L28gSW50ZXJydXB0IHByb3RvY29sIGFuZAotICogYSBTbWFydE1lZGlhIGNhcmQgcmVhZGVyIHRoYXQgdXNlcyB0aGUgc2FtZSBwcm90b2NvbAotICogYXMgdGhlIFNERFIwOS4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55Ci0gKiBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotCi0jaW5jbHVkZSA8c2NzaS9zY3NpLmg+Ci0jaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KLSNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+Ci0KLSNpbmNsdWRlICJ1c2IuaCIKLSNpbmNsdWRlICJ0cmFuc3BvcnQuaCIKLSNpbmNsdWRlICJwcm90b2NvbC5oIgotI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAiZHBjbS5oIgotI2luY2x1ZGUgInNkZHIwOS5oIgotCi0vKgotICogVHJhbnNwb3J0IGZvciB0aGUgTWljcm90ZWNoIERQQ00tVVNCCi0gKgotICovCi1pbnQgZHBjbV90cmFuc3BvcnQoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgdXNfZGF0YSAqdXMpCi17Ci0JaW50IHJldDsKLQotCWlmIChzcmIgPT0gTlVMTCkKLQkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKLQotCVVTX0RFQlVHUCgiZHBjbV90cmFuc3BvcnQ6IExVTj0lZFxuIiwgc3JiLT5kZXZpY2UtPmx1bik7Ci0KLQlzd2l0Y2ggKHNyYi0+ZGV2aWNlLT5sdW4pIHsKLQkJY2FzZSAwOgotCi0JCQkvKgotCQkJICogTFVOIDAgY29ycmVzcG9uZHMgdG8gdGhlIENvbXBhY3RGbGFzaCBjYXJkIHJlYWRlci4KLQkJCSAqLwotCQkJcmV0ID0gdXNiX3N0b3JfQ0JfdHJhbnNwb3J0KHNyYiwgdXMpOwotCQkJYnJlYWs7Ci0KLSNpZmRlZiBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjA5Ci0JCWNhc2UgMToKLQotCQkJLyoKLQkJCSAqIExVTiAxIGNvcnJlc3BvbmRzIHRvIHRoZSBTbWFydE1lZGlhIGNhcmQgcmVhZGVyLgotCQkJICovCi0KLQkJCS8qCi0JCQkgKiBTZXQgdGhlIExVTiB0byAwIChqdXN0IGluIGNhc2UpLgotCQkJICovCi0JCQlzcmItPmRldmljZS0+bHVuID0gMDsgdXMtPnNyYi0+ZGV2aWNlLT5sdW4gPSAwOwotCQkJcmV0ID0gc2RkcjA5X3RyYW5zcG9ydChzcmIsIHVzKTsKLQkJCXNyYi0+ZGV2aWNlLT5sdW4gPSAxOyB1cy0+c3JiLT5kZXZpY2UtPmx1biA9IDE7Ci0JCQlicmVhazsKLQotI2VuZGlmCi0KLQkJZGVmYXVsdDoKLQkJCVVTX0RFQlVHUCgiZHBjbV90cmFuc3BvcnQ6IEludmFsaWQgTFVOICVkXG4iLCBzcmItPmRldmljZS0+bHVuKTsKLQkJCXJldCA9IFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS9kcGNtLmggYi9kcml2ZXJzL3VzYi9zdG9yYWdlL2RwY20uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdiN2IwZi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL2RwY20uaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qIERyaXZlciBmb3IgTWljcm90ZWNoIERQQ00tVVNCIENvbXBhY3RGbGFzaC9TbWFydE1lZGlhIHJlYWRlcgotICoKLSAqIERQQ00gZHJpdmVyIHYwLjE6Ci0gKgotICogRmlyc3QgcmVsZWFzZQotICoKLSAqIEN1cnJlbnQgZGV2ZWxvcG1lbnQgYW5kIG1haW50ZW5hbmNlIGJ5OgotICogICAoYykgMjAwMCBCcmlhbiBXZWJiICh3ZWJiYkBlYXJ0aGxpbmsubmV0KQotICoKLSAqIFNlZSBkcGNtLmMgZm9yIG1vcmUgZXhwbGFuYXRpb24KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55Ci0gKiBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotCi0jaWZuZGVmIF9NSUNST1RFQ0hfRFBDTV9VU0JfSAotI2RlZmluZSBfTUlDUk9URUNIX0RQQ01fVVNCX0gKLQotZXh0ZXJuIGludCBkcGNtX3RyYW5zcG9ydChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCB1c19kYXRhICp1cyk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS9saWJ1c3VhbC5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9saWJ1c3VhbC5jCmluZGV4IGQ2MTdlOGEuLmY5NzBiMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvbGlidXN1YWwuYworKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL2xpYnVzdWFsLmMKQEAgLTQ2LDYgKzQ2LDEyIEBACiB7IFVTQl9ERVZJQ0VfVkVSKGlkX3ZlbmRvciwgaWRfcHJvZHVjdCwgYmNkRGV2aWNlTWluLGJjZERldmljZU1heCksIFwKICAgLmRyaXZlcl9pbmZvID0gKGZsYWdzKXwoVVNCX1VTX1RZUEVfU1RPUjw8MjQpIH0KIAorI2RlZmluZSBDT01QTElBTlRfREVWKGlkX3ZlbmRvciwgaWRfcHJvZHVjdCwgYmNkRGV2aWNlTWluLCBiY2REZXZpY2VNYXgsIFwKKwkJICAgIHZlbmRvck5hbWUsIHByb2R1Y3ROYW1lLCB1c2VQcm90b2NvbCwgdXNlVHJhbnNwb3J0LCBcCisJCSAgICBpbml0RnVuY3Rpb24sIGZsYWdzKSBcCit7IFVTQl9ERVZJQ0VfVkVSKGlkX3ZlbmRvciwgaWRfcHJvZHVjdCwgYmNkRGV2aWNlTWluLCBiY2REZXZpY2VNYXgpLCBcCisgIC5kcml2ZXJfaW5mbyA9IChmbGFncykgfQorCiAjZGVmaW5lIFVTVUFMX0RFVih1c2VQcm90bywgdXNlVHJhbnMsIHVzZVR5cGUpIFwKIHsgVVNCX0lOVEVSRkFDRV9JTkZPKFVTQl9DTEFTU19NQVNTX1NUT1JBR0UsIHVzZVByb3RvLCB1c2VUcmFucyksIFwKICAgLmRyaXZlcl9pbmZvID0gKCh1c2VUeXBlKTw8MjQpIH0KQEAgLTU3LDYgKzYzLDcgQEAKIAogI3VuZGVmIFVTVUFMX0RFVgogI3VuZGVmIFVOVVNVQUxfREVWCisjdW5kZWYgQ09NUExJQU5UX0RFVgogCiBNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgc3RvcmFnZV91c2JfaWRzKTsKIEVYUE9SVF9TWU1CT0xfR1BMKHN0b3JhZ2VfdXNiX2lkcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL29wdGlvbl9tcy5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9vcHRpb25fbXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTNmOTIyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9vcHRpb25fbXMuYwpAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIERyaXZlciBmb3IgT3B0aW9uIEhpZ2ggU3BlZWQgTW9iaWxlIERldmljZXMuCisgKgorICogICAoYykgMjAwOCBEYW4gV2lsbGlhbXMgPGRjYndAcmVkaGF0LmNvbT4KKyAqCisgKiBJbnNwaXJhdGlvbiB0YWtlbiBmcm9tIHNpZXJyYV9tcy5jIGJ5IEtldmluIExsb3lkIDxrbGxveWRAc2llcnJhd2lyZWxlc3MuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKworI2luY2x1ZGUgInVzYi5oIgorI2luY2x1ZGUgInRyYW5zcG9ydC5oIgorI2luY2x1ZGUgIm9wdGlvbl9tcy5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisKKyNkZWZpbmUgWkNEX0ZPUkNFX01PREVNCQkJMHgwMQorI2RlZmluZSBaQ0RfQUxMT1dfTVMgCQkJMHgwMgorCitzdGF0aWMgdW5zaWduZWQgaW50IG9wdGlvbl96ZXJvX2NkID0gWkNEX0ZPUkNFX01PREVNOworbW9kdWxlX3BhcmFtKG9wdGlvbl96ZXJvX2NkLCB1aW50LCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKG9wdGlvbl96ZXJvX2NkLCAiWmVyb0NEIG1vZGUgKDE9Rm9yY2UgTW9kZW0gKGRlZmF1bHQpLCIKKwkJICIgMj1BbGxvdyBDRC1Sb20iKTsKKworI2RlZmluZSBSRVNQT05TRV9MRU4gMTAyNAorCitzdGF0aWMgaW50IG9wdGlvbl9yZXplcm8oc3RydWN0IHVzX2RhdGEgKnVzLCBpbnQgZXBfaW4sIGludCBlcF9vdXQpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciByZXplcm9fbXNnW10gPSB7CisJICAweDU1LCAweDUzLCAweDQyLCAweDQzLCAweDc4LCAweDU2LCAweDM0LCAweDEyLAorCSAgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwNiwgMHgwMSwKKwkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCisJfTsKKwljaGFyICpidWZmZXI7CisJaW50IHJlc3VsdDsKKworCVVTX0RFQlVHUCgiT3B0aW9uIE1TOiAlcyIsICJERVZJQ0UgTU9ERSBTV0lUQ0hcbiIpOworCisJYnVmZmVyID0ga3phbGxvYyhSRVNQT05TRV9MRU4sIEdGUF9LRVJORUwpOworCWlmIChidWZmZXIgPT0gTlVMTCkKKwkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKKworCW1lbWNweShidWZmZXIsIHJlemVyb19tc2csIHNpemVvZiAocmV6ZXJvX21zZykpOworCXJlc3VsdCA9IHVzYl9zdG9yX2J1bGtfdHJhbnNmZXJfYnVmKHVzLAorCQkJdXNiX3NuZGJ1bGtwaXBlKHVzLT5wdXNiX2RldiwgZXBfb3V0KSwKKwkJCWJ1ZmZlciwgc2l6ZW9mIChyZXplcm9fbXNnKSwgTlVMTCk7CisJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpIHsKKwkJcmVzdWx0ID0gVVNCX1NUT1JfWEZFUl9FUlJPUjsKKwkJZ290byBvdXQ7CisJfQorCisJLyogU29tZSBvZiB0aGUgZGV2aWNlcyBuZWVkIHRvIGJlIGFza2VkIGZvciBhIHJlc3BvbnNlLCBidXQgd2UgZG9uJ3QKKwkgKiBjYXJlIHdoYXQgdGhhdCByZXNwb25zZSBpcy4KKwkgKi8KKwlyZXN1bHQgPSB1c2Jfc3Rvcl9idWxrX3RyYW5zZmVyX2J1Zih1cywKKwkJCXVzYl9zbmRidWxrcGlwZSh1cy0+cHVzYl9kZXYsIGVwX291dCksCisJCQlidWZmZXIsIFJFU1BPTlNFX0xFTiwgTlVMTCk7CisJcmVzdWx0ID0gVVNCX1NUT1JfWEZFUl9HT09EOworCitvdXQ6CisJa2ZyZWUoYnVmZmVyKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgb3B0aW9uX21zX2luaXQoc3RydWN0IHVzX2RhdGEgKnVzKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmOworCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmlmYWNlX2Rlc2M7CisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludCA9IE5VTEw7CisJdTggZXBfaW4gPSAwLCBlcF9vdXQgPSAwOworCWludCBlcF9pbl9zaXplID0gMCwgZXBfb3V0X3NpemUgPSAwOworCWludCBpLCByZXN1bHQ7CisKKwl1ZGV2ID0gdXMtPnB1c2JfZGV2OworCWludGYgPSB1cy0+cHVzYl9pbnRmOworCisJLyogRW5zdXJlIGl0J3MgcmVhbGx5IGEgWmVyb0NEIGRldmljZTsgZGV2aWNlcyB0aGF0IGFyZSBhbHJlYWR5CisJICogaW4gbW9kZW0gbW9kZSByZXR1cm4gMHhGRiBmb3IgY2xhc3MsIHN1YmNsYXNzLCBhbmQgcHJvdG9jb2wuCisJICovCisJaWYgKHVkZXYtPmRlc2NyaXB0b3IuYkRldmljZUNsYXNzICE9IDAgfHwKKwkgICAgdWRldi0+ZGVzY3JpcHRvci5iRGV2aWNlU3ViQ2xhc3MgIT0gMCB8fAorCSAgICB1ZGV2LT5kZXNjcmlwdG9yLmJEZXZpY2VQcm90b2NvbCAhPSAwKQorCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7CisKKwlVU19ERUJVR1AoIk9wdGlvbiBNUzogb3B0aW9uX21zX2luaXQgY2FsbGVkXG4iKTsKKworCS8qIEZpbmQgdGhlIHJpZ2h0IG1hc3Mgc3RvcmFnZSBpbnRlcmZhY2UgKi8KKwlpZmFjZV9kZXNjID0gaW50Zi0+Y3VyX2FsdHNldHRpbmc7CisJaWYgKGlmYWNlX2Rlc2MtPmRlc2MuYkludGVyZmFjZUNsYXNzICE9IDB4OCB8fAorCSAgICBpZmFjZV9kZXNjLT5kZXNjLmJJbnRlcmZhY2VTdWJDbGFzcyAhPSAweDYgfHwKKwkgICAgaWZhY2VfZGVzYy0+ZGVzYy5iSW50ZXJmYWNlUHJvdG9jb2wgIT0gMHg1MCkgeworCQlVU19ERUJVR1AoIk9wdGlvbiBNUzogbWFzcyBzdG9yYWdlIGludGVyZmFjZSBub3QgZm91bmQsIG5vIGFjdGlvbiAiCisJCSAgICAgICAgICAicmVxdWlyZWRcbiIpOworCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7CisJfQorCisJLyogRmluZCB0aGUgbWFzcyBzdG9yYWdlIGJ1bGsgZW5kcG9pbnRzICovCisJZm9yIChpID0gMDsgaSA8IGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50cyAmJiAoIWVwX2luX3NpemUgfHwgIWVwX291dF9zaXplKTsgKytpKSB7CisJCWVuZHBvaW50ID0gJmlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2M7CisKKwkJaWYgKHVzYl9lbmRwb2ludF9pc19idWxrX2luKGVuZHBvaW50KSkgeworCQkJZXBfaW4gPSB1c2JfZW5kcG9pbnRfbnVtKGVuZHBvaW50KTsKKwkJCWVwX2luX3NpemUgPSBsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpOworCQl9IGVsc2UgaWYgKHVzYl9lbmRwb2ludF9pc19idWxrX291dChlbmRwb2ludCkpIHsKKwkJCWVwX291dCA9IHVzYl9lbmRwb2ludF9udW0oZW5kcG9pbnQpOworCQkJZXBfb3V0X3NpemUgPSBsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpOworCQl9CisJfQorCisJLyogQ2FuJ3QgZmluZCB0aGUgbWFzcyBzdG9yYWdlIGVuZHBvaW50cyAqLworCWlmICghZXBfaW5fc2l6ZSB8fCAhZXBfb3V0X3NpemUpIHsKKwkJVVNfREVCVUdQKCJPcHRpb24gTVM6IG1hc3Mgc3RvcmFnZSBlbmRwb2ludHMgbm90IGZvdW5kLCBubyBhY3Rpb24gIgorCQkgICAgICAgICAgInJlcXVpcmVkXG4iKTsKKwkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EOworCX0KKworCS8qIEZvcmNlIE1vZGVtIG1vZGUgKi8KKwlpZiAob3B0aW9uX3plcm9fY2QgPT0gWkNEX0ZPUkNFX01PREVNKSB7CisJCVVTX0RFQlVHUCgiT3B0aW9uIE1TOiAlcyIsICJGb3JjaW5nIE1vZGVtIE1vZGVcbiIpOworCQlyZXN1bHQgPSBvcHRpb25fcmV6ZXJvKHVzLCBlcF9pbiwgZXBfb3V0KTsKKwkJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCisJCQlVU19ERUJVR1AoIk9wdGlvbiBNUzogRmFpbGVkIHRvIHN3aXRjaCB0byBtb2RlbSBtb2RlLlxuIik7CisJCXJldHVybiAtRUlPOworCX0gZWxzZSBpZiAob3B0aW9uX3plcm9fY2QgPT0gWkNEX0FMTE9XX01TKSB7CisJCS8qIEFsbG93IE1hc3MgU3RvcmFnZSBtb2RlIChrZWVwIENELVJvbSkgKi8KKwkJVVNfREVCVUdQKCJPcHRpb24gTVM6ICVzIiwgIkFsbG93aW5nIE1hc3MgU3RvcmFnZSBNb2RlIGlmIGRldmljZSIKKwkJICAgICAgICAgICIgcmVxdWVzdHMgaXRcbiIpOworCX0KKworCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS9vcHRpb25fbXMuaCBiL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvb3B0aW9uX21zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZlNDQ4YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvb3B0aW9uX21zLmgKQEAgLTAsMCArMSw0IEBACisjaWZuZGVmIF9PUFRJT05fTVNfSF8KKyNkZWZpbmUgX09QVElPTl9NU19IXworZXh0ZXJuIGludCBvcHRpb25fbXNfaW5pdChzdHJ1Y3QgdXNfZGF0YSAqdXMpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3Byb3RvY29sLmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3Byb3RvY29sLmMKaW5kZXggM2IzMzU3ZS4uYmU0NDFkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS9wcm90b2NvbC5jCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvcHJvdG9jb2wuYwpAQCAtNTYsOSArNTYsOSBAQAogICogUHJvdG9jb2wgcm91dGluZXMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCB1c2Jfc3Rvcl9xaWMxNTdfY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCB1c19kYXRhICp1cykKK3ZvaWQgdXNiX3N0b3JfcGFkMTJfY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCB1c19kYXRhICp1cykKIHsKLQkvKiBQYWQgdGhlIEFUQVBJIGNvbW1hbmQgd2l0aCB6ZXJvcyAKKwkvKiBQYWQgdGhlIFNDU0kgY29tbWFuZCB3aXRoIHplcm9zIG91dCB0byAxMiBieXRlcwogCSAqCiAJICogTk9URTogVGhpcyBvbmx5IHdvcmtzIGJlY2F1c2UgYSBzY3NpX2NtbmQgc3RydWN0IGZpZWxkIGNvbnRhaW5zCiAJICogYSB1bnNpZ25lZCBjaGFyIGNtbmRbMTZdLCBzbyB3ZSBrbm93IHdlIGhhdmUgc3RvcmFnZSBhdmFpbGFibGUKQEAgLTczLDI2ICs3Myw2IEBACiAJdXNiX3N0b3JfaW52b2tlX3RyYW5zcG9ydChzcmIsIHVzKTsKIH0KIAotdm9pZCB1c2Jfc3Rvcl9BVEFQSV9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHVzX2RhdGEgKnVzKQotewotCS8qIFBhZCB0aGUgQVRBUEkgY29tbWFuZCB3aXRoIHplcm9zIAotCSAqCi0JICogTk9URTogVGhpcyBvbmx5IHdvcmtzIGJlY2F1c2UgYSBzY3NpX2NtbmQgc3RydWN0IGZpZWxkIGNvbnRhaW5zCi0JICogYSB1bnNpZ25lZCBjaGFyIGNtbmRbMTZdLCBzbyB3ZSBrbm93IHdlIGhhdmUgc3RvcmFnZSBhdmFpbGFibGUKLQkgKi8KLQotCS8qIFBhZCB0aGUgQVRBUEkgY29tbWFuZCB3aXRoIHplcm9zICovCi0JZm9yICg7IHNyYi0+Y21kX2xlbjwxMjsgc3JiLT5jbWRfbGVuKyspCi0JCXNyYi0+Y21uZFtzcmItPmNtZF9sZW5dID0gMDsKLQotCS8qIHNldCBjb21tYW5kIGxlbmd0aCB0byAxMiBieXRlcyAqLwotCXNyYi0+Y21kX2xlbiA9IDEyOwotCi0JLyogc2VuZCB0aGUgY29tbWFuZCB0byB0aGUgdHJhbnNwb3J0IGxheWVyICovCi0JdXNiX3N0b3JfaW52b2tlX3RyYW5zcG9ydChzcmIsIHVzKTsKLX0KLQotCiB2b2lkIHVzYl9zdG9yX3VmaV9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHVzX2RhdGEgKnVzKQogewogCS8qIGZpeCBzb21lIGNvbW1hbmRzIC0tIHRoaXMgaXMgYSBmb3JtIG9mIG1vZGUgdHJhbnNsYXRpb24KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvcHJvdG9jb2wuaCBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvcHJvdG9jb2wuaAppbmRleCA0ODcwNTZmLi5mZmMzZTJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3Byb3RvY29sLmgKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9wcm90b2NvbC5oCkBAIC00MCw4ICs0MCw3IEBACiAjZGVmaW5lIF9QUk9UT0NPTF9IXwogCiAvKiBQcm90b2NvbCBoYW5kbGluZyByb3V0aW5lcyAqLwotZXh0ZXJuIHZvaWQgdXNiX3N0b3JfQVRBUElfY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kKiwgc3RydWN0IHVzX2RhdGEqKTsKLWV4dGVybiB2b2lkIHVzYl9zdG9yX3FpYzE1N19jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQqLCBzdHJ1Y3QgdXNfZGF0YSopOworZXh0ZXJuIHZvaWQgdXNiX3N0b3JfcGFkMTJfY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kKiwgc3RydWN0IHVzX2RhdGEqKTsKIGV4dGVybiB2b2lkIHVzYl9zdG9yX3VmaV9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQqLCBzdHJ1Y3QgdXNfZGF0YSopOwogZXh0ZXJuIHZvaWQgdXNiX3N0b3JfdHJhbnNwYXJlbnRfc2NzaV9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQqLAogCQlzdHJ1Y3QgdXNfZGF0YSopOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS9zY3NpZ2x1ZS5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9zY3NpZ2x1ZS5jCmluZGV4IDA5Nzc5ZjYuLjJhNDJiODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2NzaWdsdWUuYworKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3Njc2lnbHVlLmMKQEAgLTU5LDYgKzU5LDEzIEBACiAjaW5jbHVkZSAidHJhbnNwb3J0LmgiCiAjaW5jbHVkZSAicHJvdG9jb2wuaCIKIAorLyogVmVuZG9yIElEcyBmb3IgY29tcGFuaWVzIHRoYXQgc2VlbSB0byBpbmNsdWRlIHRoZSBSRUFEIENBUEFDSVRZIGJ1ZworICogaW4gYWxsIHRoZWlyIGRldmljZXMKKyAqLworI2RlZmluZSBWRU5ET1JfSURfTk9LSUEJCTB4MDQyMQorI2RlZmluZSBWRU5ET1JfSURfTklLT04JCTB4MDRiMAorI2RlZmluZSBWRU5ET1JfSURfTU9UT1JPTEEJMHgyMmI4CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSG9zdCBmdW5jdGlvbnMgCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMjksMTEgKzEzNiwzNSBAQAogCQkJCQkgICAgICBtYXhfc2VjdG9ycyk7CiAJfQogCisJLyogU29tZSBVU0IgaG9zdCBjb250cm9sbGVycyBjYW4ndCBkbyBETUE7IHRoZXkgaGF2ZSB0byB1c2UgUElPLgorCSAqIFRoZXkgaW5kaWNhdGUgdGhpcyBieSBzZXR0aW5nIHRoZWlyIGRtYV9tYXNrIHRvIE5VTEwuICBGb3IKKwkgKiBzdWNoIGNvbnRyb2xsZXJzIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBibG9jayBsYXllciBzZXRzCisJICogdXAgYm91bmNlIGJ1ZmZlcnMgaW4gYWRkcmVzc2FibGUgbWVtb3J5LgorCSAqLworCWlmICghdXMtPnB1c2JfZGV2LT5idXMtPmNvbnRyb2xsZXItPmRtYV9tYXNrKQorCQlibGtfcXVldWVfYm91bmNlX2xpbWl0KHNkZXYtPnJlcXVlc3RfcXVldWUsIEJMS19CT1VOQ0VfSElHSCk7CisKIAkvKiBXZSBjYW4ndCBwdXQgdGhlc2Ugc2V0dGluZ3MgaW4gc2xhdmVfYWxsb2MoKSBiZWNhdXNlIHRoYXQgZ2V0cwogCSAqIGNhbGxlZCBiZWZvcmUgdGhlIGRldmljZSB0eXBlIGlzIGtub3duLiAgQ29uc2VxdWVudGx5IHRoZXNlCiAJICogc2V0dGluZ3MgY2FuJ3QgYmUgb3ZlcnJpZGRlbiB2aWEgdGhlIHNjc2kgZGV2aW5mbyBtZWNoYW5pc20uICovCiAJaWYgKHNkZXYtPnR5cGUgPT0gVFlQRV9ESVNLKSB7CiAKKwkJLyogU29tZSB2ZW5kb3JzIHNlZW0gdG8gcHV0IHRoZSBSRUFEIENBUEFDSVRZIGJ1ZyBpbnRvCisJCSAqIGFsbCB0aGVpciBkZXZpY2VzIC0tIHByaW1hcmlseSBtYWtlcnMgb2YgY2VsbCBwaG9uZXMKKwkJICogYW5kIGRpZ2l0YWwgY2FtZXJhcy4gIFNpbmNlIHRoZXNlIGRldmljZXMgYWx3YXlzIHVzZQorCQkgKiBmbGFzaCBtZWRpYSBhbmQgY2FuIGJlIGV4cGVjdGVkIHRvIGhhdmUgYW4gZXZlbiBudW1iZXIKKwkJICogb2Ygc2VjdG9ycywgd2Ugd2lsbCBhbHdheXMgZW5hYmxlIHRoZSBDQVBBQ0lUWV9IRVVSSVNUSUNTCisJCSAqIGZsYWcgdW5sZXNzIHRvbGQgb3RoZXJ3aXNlLiAqLworCQlzd2l0Y2ggKGxlMTZfdG9fY3B1KHVzLT5wdXNiX2Rldi0+ZGVzY3JpcHRvci5pZFZlbmRvcikpIHsKKwkJY2FzZSBWRU5ET1JfSURfTk9LSUE6CisJCWNhc2UgVkVORE9SX0lEX05JS09OOgorCQljYXNlIFZFTkRPUl9JRF9NT1RPUk9MQToKKwkJCWlmICghKHVzLT5mZmxhZ3MgJiAoVVNfRkxfRklYX0NBUEFDSVRZIHwKKwkJCQkJVVNfRkxfQ0FQQUNJVFlfT0spKSkKKwkJCQl1cy0+ZmZsYWdzIHw9IFVTX0ZMX0NBUEFDSVRZX0hFVVJJU1RJQ1M7CisJCQlicmVhazsKKwkJfQorCiAJCS8qIERpc2stdHlwZSBkZXZpY2VzIHVzZSBNT0RFIFNFTlNFKDYpIGlmIHRoZSBwcm90b2NvbAogCQkgKiAoU3ViQ2xhc3MpIGlzIFRyYW5zcGFyZW50IFNDU0ksIG90aGVyd2lzZSB0aGV5IHVzZQogCQkgKiBNT0RFIFNFTlNFKDEwKS4gKi8KQEAgLTE3MCw2ICsyMDEsMTAgQEAKIAkJaWYgKHVzLT5mZmxhZ3MgJiBVU19GTF9DQVBBQ0lUWV9IRVVSSVNUSUNTKQogCQkJc2Rldi0+Z3Vlc3NfY2FwYWNpdHkgPSAxOwogCisJCS8qIGFzc3VtZSBTUEMzIG9yIGxhdHRlciBkZXZpY2VzIHN1cHBvcnQgc2Vuc2Ugc2l6ZSA+IDE4ICovCisJCWlmIChzZGV2LT5zY3NpX2xldmVsID4gU0NTSV9TUENfMikKKwkJCXVzLT5mZmxhZ3MgfD0gVVNfRkxfU0FORV9TRU5TRTsKKwogCQkvKiBTb21lIGRldmljZXMgcmVwb3J0IGEgU0NTSSByZXZpc2lvbiBsZXZlbCBhYm92ZSAyIGJ1dCBhcmUKIAkJICogdW5hYmxlIHRvIGhhbmRsZSB0aGUgUkVQT1JUIExVTlMgY29tbWFuZCAoZm9yIHdoaWNoCiAJCSAqIHN1cHBvcnQgaXMgbWFuZGF0b3J5IGF0IGxldmVsIDMpLiAgU2luY2Ugd2UgYWxyZWFkeSBoYXZlCkBAIC0xOTYsNiArMjMxLDE0IEBACiAJCSAqIHNlY3RvciBpbiBhIGxhcmdlciB0aGVuIDEgc2VjdG9yIHJlYWQsIHNpbmNlIHRoZSBwZXJmb3JtYW5jZQogCQkgKiBpbXBhY3QgaXMgbmVnaWJsZSB3ZSBzZXQgdGhpcyBmbGFnIGZvciBhbGwgVVNCIGRpc2tzICovCiAJCXNkZXYtPmxhc3Rfc2VjdG9yX2J1ZyA9IDE7CisKKwkJLyogRW5hYmxlIGxhc3Qtc2VjdG9yIGhhY2tzIGZvciBzaW5nbGUtdGFyZ2V0IGRldmljZXMgdXNpbmcKKwkJICogdGhlIEJ1bGstb25seSB0cmFuc3BvcnQsIHVubGVzcyB3ZSBhbHJlYWR5IGtub3cgdGhlCisJCSAqIGNhcGFjaXR5IHdpbGwgYmUgZGVjcmVtZW50ZWQgb3IgaXMgY29ycmVjdC4gKi8KKwkJaWYgKCEodXMtPmZmbGFncyAmIChVU19GTF9GSVhfQ0FQQUNJVFkgfCBVU19GTF9DQVBBQ0lUWV9PSyB8CisJCQkJCVVTX0ZMX1NDTV9NVUxUX1RBUkcpKSAmJgorCQkJCXVzLT5wcm90b2NvbCA9PSBVU19QUl9CVUxLKQorCQkJdXMtPnVzZV9sYXN0X3NlY3Rvcl9oYWNrcyA9IDE7CiAJfSBlbHNlIHsKIAogCQkvKiBOb24tZGlzay10eXBlIGRldmljZXMgZG9uJ3QgbmVlZCB0byBibGFja2xpc3QgYW55IHBhZ2VzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3NkZHIwOS5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9zZGRyMDkuYwppbmRleCBjNWE1NGI4Li41MzFhZTVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3NkZHIwOS5jCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2RkcjA5LmMKQEAgLTQ1LDYgKzQ1LDcgQEAKIAogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgogCiAjaW5jbHVkZSAidXNiLmgiCiAjaW5jbHVkZSAidHJhbnNwb3J0LmgiCkBAIC0xNDQ2LDYgKzE0NDcsNDggQEAKIH0KIAogLyoKKyAqIFRyYW5zcG9ydCBmb3IgdGhlIE1pY3JvdGVjaCBEUENNLVVTQgorICovCitpbnQgZHBjbV90cmFuc3BvcnQoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgdXNfZGF0YSAqdXMpCit7CisJaW50IHJldDsKKworCVVTX0RFQlVHUCgiZHBjbV90cmFuc3BvcnQ6IExVTj0lZFxuIiwgc3JiLT5kZXZpY2UtPmx1bik7CisKKwlzd2l0Y2ggKHNyYi0+ZGV2aWNlLT5sdW4pIHsKKwljYXNlIDA6CisKKwkJLyoKKwkJICogTFVOIDAgY29ycmVzcG9uZHMgdG8gdGhlIENvbXBhY3RGbGFzaCBjYXJkIHJlYWRlci4KKwkJICovCisJCXJldCA9IHVzYl9zdG9yX0NCX3RyYW5zcG9ydChzcmIsIHVzKTsKKwkJYnJlYWs7CisKKwljYXNlIDE6CisKKwkJLyoKKwkJICogTFVOIDEgY29ycmVzcG9uZHMgdG8gdGhlIFNtYXJ0TWVkaWEgY2FyZCByZWFkZXIuCisJCSAqLworCisJCS8qCisJCSAqIFNldCB0aGUgTFVOIHRvIDAgKGp1c3QgaW4gY2FzZSkuCisJCSAqLworCQlzcmItPmRldmljZS0+bHVuID0gMDsKKwkJcmV0ID0gc2RkcjA5X3RyYW5zcG9ydChzcmIsIHVzKTsKKwkJc3JiLT5kZXZpY2UtPmx1biA9IDE7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJVVNfREVCVUdQKCJkcGNtX3RyYW5zcG9ydDogSW52YWxpZCBMVU4gJWRcbiIsCisJCQkJc3JiLT5kZXZpY2UtPmx1bik7CisJCXJldCA9IFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKKworLyoKICAqIFRyYW5zcG9ydCBmb3IgdGhlIFNhbmRpc2sgU0REUi0wOQogICovCiBpbnQgc2RkcjA5X3RyYW5zcG9ydChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCB1c19kYXRhICp1cykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2RkcjA5LmggYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3NkZHIwOS5oCmluZGV4IGU1MDAzM2EuLmI3MDExNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2RkcjA5LmgKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9zZGRyMDkuaApAQCAtMjgsOCArMjgsMTEgQEAKIC8qIFNhbmRpc2sgU0REUi0wOSBzdHVmZiAqLwogCiBleHRlcm4gaW50IHNkZHIwOV90cmFuc3BvcnQoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgdXNfZGF0YSAqdXMpOwotCi1leHRlcm4gaW50IHVzYl9zdG9yX3NkZHIwOV9kcGNtX2luaXQoc3RydWN0IHVzX2RhdGEgKnVzKTsKIGV4dGVybiBpbnQgdXNiX3N0b3Jfc2RkcjA5X2luaXQoc3RydWN0IHVzX2RhdGEgKnVzKTsKIAorLyogTWljcm90ZWNoIERQQ00tVVNCIHN0dWZmICovCisKK2V4dGVybiBpbnQgZHBjbV90cmFuc3BvcnQoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgdXNfZGF0YSAqdXMpOworZXh0ZXJuIGludCB1c2Jfc3Rvcl9zZGRyMDlfZHBjbV9pbml0KHN0cnVjdCB1c19kYXRhICp1cyk7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS90cmFuc3BvcnQuYyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmMKaW5kZXggNzkxMDhkNS4uMWQ1NDM4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS90cmFuc3BvcnQuYworKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3RyYW5zcG9ydC5jCkBAIC01Nyw2ICs1Nyw5IEBACiAjaW5jbHVkZSAic2NzaWdsdWUuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSAiLi4vLi4vc2NzaS9zZC5oIgorCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRGF0YSB0cmFuc2ZlciByb3V0aW5lcwpAQCAtNTExLDYgKzUxNCwxMTAgQEAKICAqIFRyYW5zcG9ydCByb3V0aW5lcwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisvKiBUaGVyZSBhcmUgc28gbWFueSBkZXZpY2VzIHRoYXQgcmVwb3J0IHRoZSBjYXBhY2l0eSBpbmNvcnJlY3RseSwKKyAqIHRoaXMgcm91dGluZSB3YXMgd3JpdHRlbiB0byBjb3VudGVyYWN0IHNvbWUgb2YgdGhlIHJlc3VsdGluZworICogcHJvYmxlbXMuCisgKi8KK3N0YXRpYyB2b2lkIGxhc3Rfc2VjdG9yX2hhY2tzKHN0cnVjdCB1c19kYXRhICp1cywgc3RydWN0IHNjc2lfY21uZCAqc3JiKQoreworCXN0cnVjdCBnZW5kaXNrICpkaXNrOworCXN0cnVjdCBzY3NpX2Rpc2sgKnNka3A7CisJdTMyIHNlY3RvcjsKKworCS8qIFRvIFJlcG9ydCAiTWVkaXVtIEVycm9yOiBSZWNvcmQgTm90IEZvdW5kICovCisJc3RhdGljIHVuc2lnbmVkIGNoYXIgcmVjb3JkX25vdF9mb3VuZFsxOF0gPSB7CisJCVswXQk9IDB4NzAsCQkJLyogY3VycmVudCBlcnJvciAqLworCQlbMl0JPSBNRURJVU1fRVJST1IsCQkvKiA9IDB4MDMgKi8KKwkJWzddCT0gMHgwYSwJCQkvKiBhZGRpdGlvbmFsIGxlbmd0aCAqLworCQlbMTJdCT0gMHgxNAkJCS8qIFJlY29yZCBOb3QgRm91bmQgKi8KKwl9OworCisJLyogSWYgbGFzdC1zZWN0b3IgcHJvYmxlbXMgY2FuJ3Qgb2NjdXIsIHdoZXRoZXIgYmVjYXVzZSB0aGUKKwkgKiBjYXBhY2l0eSB3YXMgYWxyZWFkeSBkZWNyZW1lbnRlZCBvciBiZWNhdXNlIHRoZSBkZXZpY2UgaXMKKwkgKiBrbm93biB0byByZXBvcnQgdGhlIGNvcnJlY3QgY2FwYWNpdHksIHRoZW4gd2UgZG9uJ3QgbmVlZAorCSAqIHRvIGRvIGFueXRoaW5nLgorCSAqLworCWlmICghdXMtPnVzZV9sYXN0X3NlY3Rvcl9oYWNrcykKKwkJcmV0dXJuOworCisJLyogV2FzIHRoaXMgY29tbWFuZCBhIFJFQUQoMTApIG9yIGEgV1JJVEUoMTApPyAqLworCWlmIChzcmItPmNtbmRbMF0gIT0gUkVBRF8xMCAmJiBzcmItPmNtbmRbMF0gIT0gV1JJVEVfMTApCisJCWdvdG8gZG9uZTsKKworCS8qIERpZCB0aGlzIGNvbW1hbmQgYWNjZXNzIHRoZSBsYXN0IHNlY3Rvcj8gKi8KKwlzZWN0b3IgPSAoc3JiLT5jbW5kWzJdIDw8IDI0KSB8IChzcmItPmNtbmRbM10gPDwgMTYpIHwKKwkJCShzcmItPmNtbmRbNF0gPDwgOCkgfCAoc3JiLT5jbW5kWzVdKTsKKwlkaXNrID0gc3JiLT5yZXF1ZXN0LT5ycV9kaXNrOworCWlmICghZGlzaykKKwkJZ290byBkb25lOworCXNka3AgPSBzY3NpX2Rpc2soZGlzayk7CisJaWYgKCFzZGtwKQorCQlnb3RvIGRvbmU7CisJaWYgKHNlY3RvciArIDEgIT0gc2RrcC0+Y2FwYWNpdHkpCisJCWdvdG8gZG9uZTsKKworCWlmIChzcmItPnJlc3VsdCA9PSBTQU1fU1RBVF9HT09EICYmIHNjc2lfZ2V0X3Jlc2lkKHNyYikgPT0gMCkgeworCisJCS8qIFRoZSBjb21tYW5kIHN1Y2NlZWRlZC4gIElmIHRoZSBjYXBhY2l0eSBpcyBvZGQKKwkJICogKGkuZS4sIGlmIHRoZSBzZWN0b3IgbnVtYmVyIGlzIGV2ZW4pIHRoZW4gdGhlCisJCSAqICJhbHdheXMtZXZlbiIgaGV1cmlzdGljIHdvdWxkIGJlIHdyb25nIGZvciB0aGlzCisJCSAqIGRldmljZS4gIElzc3VlIGEgV0FSTigpIHNvIHRoYXQgdGhlIGtlcm5lbG9vcHMub3JnCisJCSAqIHByb2plY3Qgd2lsbCBiZSBub3RpZmllZCBhbmQgd2Ugd2lsbCB0aGVuIGtub3cgdG8KKwkJICogbWFyayB0aGUgZGV2aWNlIHdpdGggYSBDQVBBQ0lUWV9PSyBmbGFnLiAgSG9wZWZ1bGx5CisJCSAqIHRoaXMgd2lsbCBvY2N1ciBmb3Igb25seSBhIGZldyBkZXZpY2VzLgorCQkgKgorCQkgKiBVc2UgdGhlIHNpZ24gb2YgdXMtPmxhc3Rfc2VjdG9yX2hhY2tzIHRvIHRlbGwgd2hldGhlcgorCQkgKiB0aGUgd2FybmluZyBoYXMgYWxyZWFkeSBiZWVuIGlzc3VlZDsgd2UgZG9uJ3QgbmVlZAorCQkgKiBtb3JlIHRoYW4gb25lIHdhcm5pbmcgcGVyIGRldmljZS4KKwkJICovCisJCWlmICghKHNlY3RvciAmIDEpICYmIHVzLT51c2VfbGFzdF9zZWN0b3JfaGFja3MgPiAwKSB7CisJCQl1bnNpZ25lZCB2aWQgPSBsZTE2X3RvX2NwdSgKKwkJCQkJdXMtPnB1c2JfZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKTsKKwkJCXVuc2lnbmVkIHBpZCA9IGxlMTZfdG9fY3B1KAorCQkJCQl1cy0+cHVzYl9kZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KTsKKwkJCXVuc2lnbmVkIHJldiA9IGxlMTZfdG9fY3B1KAorCQkJCQl1cy0+cHVzYl9kZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKTsKKworCQkJV0FSTigxLCAiJXM6IFN1Y2Nlc3NmdWwgbGFzdCBzZWN0b3Igc3VjY2VzcyBhdCAldSwgIgorCQkJCQkiZGV2aWNlICUwNHg6JTA0eDolMDR4XG4iLAorCQkJCQlzZGtwLT5kaXNrLT5kaXNrX25hbWUsIHNlY3RvciwKKwkJCQkJdmlkLCBwaWQsIHJldik7CisJCQl1cy0+dXNlX2xhc3Rfc2VjdG9yX2hhY2tzID0gLTE7CisJCX0KKworCX0gZWxzZSB7CisJCS8qIFRoZSBjb21tYW5kIGZhaWxlZC4gIEFsbG93IHVwIHRvIDMgcmV0cmllcyBpbiBjYXNlIHRoaXMKKwkJICogaXMgc29tZSBub3JtYWwgc29ydCBvZiBmYWlsdXJlLiAgQWZ0ZXIgdGhhdCwgYXNzdW1lIHRoZQorCQkgKiBjYXBhY2l0eSBpcyB3cm9uZyBhbmQgd2UncmUgdHJ5aW5nIHRvIGFjY2VzcyB0aGUgc2VjdG9yCisJCSAqIGJleW9uZCB0aGUgZW5kLiAgUmVwbGFjZSB0aGUgcmVzdWx0IGNvZGUgYW5kIHNlbnNlIGRhdGEKKwkJICogd2l0aCB2YWx1ZXMgdGhhdCB3aWxsIGNhdXNlIHRoZSBTQ1NJIGNvcmUgdG8gZmFpbCB0aGUKKwkJICogY29tbWFuZCBpbW1lZGlhdGVseSwgaW5zdGVhZCBvZiBnb2luZyBpbnRvIGFuIGluZmluaXRlCisJCSAqIChvciBldmVuIGp1c3QgYSB2ZXJ5IGxvbmcpIHJldHJ5IGxvb3AuCisJCSAqLworCQlpZiAoKyt1cy0+bGFzdF9zZWN0b3JfcmV0cmllcyA8IDMpCisJCQlyZXR1cm47CisJCXNyYi0+cmVzdWx0ID0gU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOworCQltZW1jcHkoc3JiLT5zZW5zZV9idWZmZXIsIHJlY29yZF9ub3RfZm91bmQsCisJCQkJc2l6ZW9mKHJlY29yZF9ub3RfZm91bmQpKTsKKworCQkvKiBJbiB0aGVvcnkgd2UgbWlnaHQgd2FudCB0byBpc3N1ZSBhIFdBUk4oKSBoZXJlIGlmIHRoZQorCQkgKiBjYXBhY2l0eSBpcyBldmVuLCBzaW5jZSBpdCBjb3VsZCBpbmRpY2F0ZSB0aGUgZGV2aWNlCisJCSAqIGhhcyB0aGUgUkVBRCBDQVBBQ0lUWSBidWcgX2FuZF8gdGhlIHJlYWwgY2FwYWNpdHkgaXMKKwkJICogb2RkLiAgQnV0IGl0IGNvdWxkIGFsc28gaW5kaWNhdGUgdGhhdCB0aGUgZGV2aWNlCisJCSAqIHNpbXBseSBjYW4ndCBhY2Nlc3MgaXRzIGxhc3Qgc2VjdG9yLCBhIGZhaWx1cmUgbW9kZQorCQkgKiB3aGljaCBpcyBzdXJwcmlzaW5nbHkgY29tbW9uLiAgU28gbm8gd2FybmluZy4KKwkJICovCisJfQorCisgZG9uZToKKwkvKiBEb24ndCByZXNldCB0aGUgcmV0cnkgY291bnRlciBmb3IgVEVTVCBVTklUIFJFQURZIGNvbW1hbmRzLAorCSAqIGJlY2F1c2UgdGhleSBnZXQgaXNzdWVkIGFmdGVyIGRldmljZSByZXNldHMgd2hpY2ggbWlnaHQgYmUKKwkgKiBjYXVzZWQgYnkgYSBmYWlsZWQgbGFzdC1zZWN0b3IgYWNjZXNzLgorCSAqLworCWlmIChzcmItPmNtbmRbMF0gIT0gVEVTVF9VTklUX1JFQURZKQorCQl1cy0+bGFzdF9zZWN0b3JfcmV0cmllcyA9IDA7Cit9CisKIC8qIEludm9rZSB0aGUgdHJhbnNwb3J0IGFuZCBiYXNpYyBlcnJvci1oYW5kbGluZy9yZWNvdmVyeSBtZXRob2RzCiAgKgogICogVGhpcyBpcyB1c2VkIGJ5IHRoZSBwcm90b2NvbCBsYXllcnMgdG8gYWN0dWFsbHkgc2VuZCB0aGUgbWVzc2FnZSB0bwpAQCAtNTQ0LDYgKzY1MSw3IEBACiAJLyogaWYgdGhlIHRyYW5zcG9ydCBwcm92aWRlZCBpdHMgb3duIHNlbnNlIGRhdGEsIGRvbid0IGF1dG8tc2Vuc2UgKi8KIAlpZiAocmVzdWx0ID09IFVTQl9TVE9SX1RSQU5TUE9SVF9OT19TRU5TRSkgewogCQlzcmItPnJlc3VsdCA9IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTjsKKwkJbGFzdF9zZWN0b3JfaGFja3ModXMsIHNyYik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTU3OSw2ICs2ODcsMjAgQEAKIAl9CiAKIAkvKgorCSAqIERldGVybWluZSBpZiB0aGlzIGRldmljZSBpcyBTQVQgYnkgc2VlaW5nIGlmIHRoZQorCSAqIGNvbW1hbmQgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5LiAgT3RoZXJ3aXNlIHdlJ2xsIGhhdmUKKwkgKiB0byB3YWl0IGZvciBhdCBsZWFzdCBvbmUgQ0hFQ0tfQ09ORElUSU9OIHRvIGRldGVybWluZQorCSAqIFNBTkVfU0VOU0Ugc3VwcG9ydAorCSAqLworCWlmICgoc3JiLT5jbW5kWzBdID09IEFUQV8xNiB8fCBzcmItPmNtbmRbMF0gPT0gQVRBXzEyKSAmJgorCSAgICByZXN1bHQgPT0gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0QgJiYKKwkgICAgISh1cy0+ZmZsYWdzICYgVVNfRkxfU0FORV9TRU5TRSkgJiYKKwkgICAgIShzcmItPmNtbmRbMl0gJiAweDIwKSkgeworCQlVU19ERUJVR1AoIi0tIFNBVCBzdXBwb3J0ZWQsIGluY3JlYXNpbmcgYXV0by1zZW5zZVxuIik7CisJCXVzLT5mZmxhZ3MgfD0gVVNfRkxfU0FORV9TRU5TRTsKKwl9CisKKwkvKgogCSAqIEEgc2hvcnQgdHJhbnNmZXIgb24gYSBjb21tYW5kIHdoZXJlIHdlIGRvbid0IGV4cGVjdCBpdAogCSAqIGlzIHVudXN1YWwsIGJ1dCBpdCBkb2Vzbid0IG1lYW4gd2UgbmVlZCB0byBhdXRvLXNlbnNlLgogCSAqLwpAQCAtNTk1LDEwICs3MTcsMTUgQEAKIAlpZiAobmVlZF9hdXRvX3NlbnNlKSB7CiAJCWludCB0ZW1wX3Jlc3VsdDsKIAkJc3RydWN0IHNjc2lfZWhfc2F2ZSBzZXM7CisJCWludCBzZW5zZV9zaXplID0gVVNfU0VOU0VfU0laRTsKKworCQkvKiBkZXZpY2Ugc3VwcG9ydHMgYW5kIG5lZWRzIGJpZ2dlciBzZW5zZSBidWZmZXIgKi8KKwkJaWYgKHVzLT5mZmxhZ3MgJiBVU19GTF9TQU5FX1NFTlNFKQorCQkJc2Vuc2Vfc2l6ZSA9IH4wOwogCiAJCVVTX0RFQlVHUCgiSXNzdWluZyBhdXRvLVJFUVVFU1RfU0VOU0VcbiIpOwogCi0JCXNjc2lfZWhfcHJlcF9jbW5kKHNyYiwgJnNlcywgTlVMTCwgMCwgVVNfU0VOU0VfU0laRSk7CisJCXNjc2lfZWhfcHJlcF9jbW5kKHNyYiwgJnNlcywgTlVMTCwgMCwgc2Vuc2Vfc2l6ZSk7CiAKIAkJLyogRklYTUU6IHdlIG11c3QgZG8gdGhlIHByb3RvY29sIHRyYW5zbGF0aW9uIGhlcmUgKi8KIAkJaWYgKHVzLT5zdWJjbGFzcyA9PSBVU19TQ19SQkMgfHwgdXMtPnN1YmNsYXNzID09IFVTX1NDX1NDU0kgfHwKQEAgLTYzMiw2ICs3NTksMjUgQEAKIAkJCXJldHVybjsKIAkJfQogCisJCS8qIElmIHRoZSBzZW5zZSBkYXRhIHJldHVybmVkIGlzIGxhcmdlciB0aGFuIDE4LWJ5dGVzIHRoZW4gd2UKKwkJICogYXNzdW1lIHRoaXMgZGV2aWNlIHN1cHBvcnRzIHJlcXVlc3RpbmcgbW9yZSBpbiB0aGUgZnV0dXJlLgorCQkgKiBUaGUgcmVzcG9uc2UgY29kZSBtdXN0IGJlIDcwaCB0aHJvdWdoIDczaCBpbmNsdXNpdmUuCisJCSAqLworCQlpZiAoc3JiLT5zZW5zZV9idWZmZXJbN10gPiAoVVNfU0VOU0VfU0laRSAtIDgpICYmCisJCSAgICAhKHVzLT5mZmxhZ3MgJiBVU19GTF9TQU5FX1NFTlNFKSAmJgorCQkgICAgKHNyYi0+c2Vuc2VfYnVmZmVyWzBdICYgMHg3QykgPT0gMHg3MCkgeworCQkJVVNfREVCVUdQKCItLSBTQU5FX1NFTlNFIHN1cHBvcnQgZW5hYmxlZFxuIik7CisJCQl1cy0+ZmZsYWdzIHw9IFVTX0ZMX1NBTkVfU0VOU0U7CisKKwkJCS8qIEluZGljYXRlIHRvIHRoZSB1c2VyIHRoYXQgd2UgdHJ1bmNhdGVkIHRoZWlyIHNlbnNlCisJCQkgKiBiZWNhdXNlIHdlIGRpZG4ndCBrbm93IGl0IHN1cHBvcnRlZCBsYXJnZXIgc2Vuc2UuCisJCQkgKi8KKwkJCVVTX0RFQlVHUCgiLS0gU2Vuc2UgZGF0YSB0cnVuY2F0ZWQgdG8gJWkgZnJvbSAlaVxuIiwKKwkJCSAgICAgICAgICBVU19TRU5TRV9TSVpFLAorCQkJICAgICAgICAgIHNyYi0+c2Vuc2VfYnVmZmVyWzddICsgOCk7CisJCQlzcmItPnNlbnNlX2J1ZmZlcls3XSA9IChVU19TRU5TRV9TSVpFIC0gOCk7CisJCX0KKwogCQlVU19ERUJVR1AoIi0tIFJlc3VsdCBmcm9tIGF1dG8tc2Vuc2UgaXMgJWRcbiIsIHRlbXBfcmVzdWx0KTsKIAkJVVNfREVCVUdQKCItLSBjb2RlOiAweCV4LCBrZXk6IDB4JXgsIEFTQzogMHgleCwgQVNDUTogMHgleFxuIiwKIAkJCSAgc3JiLT5zZW5zZV9idWZmZXJbMF0sCkBAIC02NjcsNiArODEzLDcgQEAKIAkJCXNjc2lfYnVmZmxlbihzcmIpIC0gc2NzaV9nZXRfcmVzaWQoc3JiKSA8IHNyYi0+dW5kZXJmbG93KQogCQlzcmItPnJlc3VsdCA9IChESURfRVJST1IgPDwgMTYpIHwgKFNVR0dFU1RfUkVUUlkgPDwgMjQpOwogCisJbGFzdF9zZWN0b3JfaGFja3ModXMsIHNyYik7CiAJcmV0dXJuOwogCiAJLyogRXJyb3IgYW5kIGFib3J0IHByb2Nlc3Npbmc6IHRyeSB0byByZXN5bmNocm9uaXplIHdpdGggdGhlIGRldmljZQpAQCAtNjk0LDYgKzg0MSw3IEBACiAJCXVzLT50cmFuc3BvcnRfcmVzZXQodXMpOwogCX0KIAljbGVhcl9iaXQoVVNfRkxJRFhfUkVTRVRUSU5HLCAmdXMtPmRmbGFncyk7CisJbGFzdF9zZWN0b3JfaGFja3ModXMsIHNyYik7CiB9CiAKIC8qIFN0b3AgdGhlIGN1cnJlbnQgVVJCIHRyYW5zZmVyICovCkBAIC03MTgsMTAgKzg2NiwxMCBAQAogfQogCiAvKgotICogQ29udHJvbC9CdWxrL0ludGVycnVwdCB0cmFuc3BvcnQKKyAqIENvbnRyb2wvQnVsayBhbmQgQ29udHJvbC9CdWxrL0ludGVycnVwdCB0cmFuc3BvcnQKICAqLwogCi1pbnQgdXNiX3N0b3JfQ0JJX3RyYW5zcG9ydChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCB1c19kYXRhICp1cykKK2ludCB1c2Jfc3Rvcl9DQl90cmFuc3BvcnQoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgdXNfZGF0YSAqdXMpCiB7CiAJdW5zaWduZWQgaW50IHRyYW5zZmVyX2xlbmd0aCA9IHNjc2lfYnVmZmxlbihzcmIpOwogCXVuc2lnbmVkIGludCBwaXBlID0gMDsKQEAgLTc2Myw2ICs5MTEsMTMgQEAKIAl9CiAKIAkvKiBTVEFUVVMgU1RBR0UgKi8KKworCS8qIE5PVEU6IENCIGRvZXMgbm90IGhhdmUgYSBzdGF0dXMgc3RhZ2UuICBTaWxseSwgSSBrbm93LiAgU28KKwkgKiB3ZSBoYXZlIHRvIGNhdGNoIHRoaXMgYXQgYSBoaWdoZXIgbGV2ZWwuCisJICovCisJaWYgKHVzLT5wcm90b2NvbCAhPSBVU19QUl9DQkkpCisJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRDsKKwogCXJlc3VsdCA9IHVzYl9zdG9yX2ludHJfdHJhbnNmZXIodXMsIHVzLT5pb2J1ZiwgMik7CiAJVVNfREVCVUdQKCJHb3QgaW50ZXJydXB0IGRhdGEgKDB4JXgsIDB4JXgpXG4iLCAKIAkJCXVzLT5pb2J1ZlswXSwgdXMtPmlvYnVmWzFdKTsKQEAgLTgxNyw1NiArOTcyLDYgQEAKIH0KIAogLyoKLSAqIENvbnRyb2wvQnVsayB0cmFuc3BvcnQKLSAqLwotaW50IHVzYl9zdG9yX0NCX3RyYW5zcG9ydChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCB1c19kYXRhICp1cykKLXsKLQl1bnNpZ25lZCBpbnQgdHJhbnNmZXJfbGVuZ3RoID0gc2NzaV9idWZmbGVuKHNyYik7Ci0JaW50IHJlc3VsdDsKLQotCS8qIENPTU1BTkQgU1RBR0UgKi8KLQkvKiBsZXQncyBzZW5kIHRoZSBjb21tYW5kIHZpYSB0aGUgY29udHJvbCBwaXBlICovCi0JcmVzdWx0ID0gdXNiX3N0b3JfY3RybF90cmFuc2Zlcih1cywgdXMtPnNlbmRfY3RybF9waXBlLAotCQkJCSAgICAgIFVTX0NCSV9BRFNDLCAKLQkJCQkgICAgICBVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UsIDAsIAotCQkJCSAgICAgIHVzLT5pZm51bSwgc3JiLT5jbW5kLCBzcmItPmNtZF9sZW4pOwotCi0JLyogY2hlY2sgdGhlIHJldHVybiBjb2RlIGZvciB0aGUgY29tbWFuZCAqLwotCVVTX0RFQlVHUCgiQ2FsbCB0byB1c2Jfc3Rvcl9jdHJsX3RyYW5zZmVyKCkgcmV0dXJuZWQgJWRcbiIsIHJlc3VsdCk7Ci0KLQkvKiBpZiB3ZSBzdGFsbGVkIHRoZSBjb21tYW5kLCBpdCBtZWFucyBjb21tYW5kIGZhaWxlZCAqLwotCWlmIChyZXN1bHQgPT0gVVNCX1NUT1JfWEZFUl9TVEFMTEVEKSB7Ci0JCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRkFJTEVEOwotCX0KLQotCS8qIFVoIG9oLi4uIHNlcmlvdXMgcHJvYmxlbSBoZXJlICovCi0JaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpIHsKLQkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKLQl9Ci0KLQkvKiBEQVRBIFNUQUdFICovCi0JLyogdHJhbnNmZXIgdGhlIGRhdGEgcGF5bG9hZCBmb3IgdGhpcyBjb21tYW5kLCBpZiBvbmUgZXhpc3RzKi8KLQlpZiAodHJhbnNmZXJfbGVuZ3RoKSB7Ci0JCXVuc2lnbmVkIGludCBwaXBlID0gc3JiLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UgPyAKLQkJCQl1cy0+cmVjdl9idWxrX3BpcGUgOiB1cy0+c2VuZF9idWxrX3BpcGU7Ci0JCXJlc3VsdCA9IHVzYl9zdG9yX2J1bGtfc3JiKHVzLCBwaXBlLCBzcmIpOwotCQlVU19ERUJVR1AoIkNCIGRhdGEgc3RhZ2UgcmVzdWx0IGlzIDB4JXhcbiIsIHJlc3VsdCk7Ci0KLQkJLyogaWYgd2Ugc3RhbGxlZCB0aGUgZGF0YSB0cmFuc2ZlciBpdCBtZWFucyBjb21tYW5kIGZhaWxlZCAqLwotCQlpZiAocmVzdWx0ID09IFVTQl9TVE9SX1hGRVJfU1RBTExFRCkKLQkJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRkFJTEVEOwotCQlpZiAocmVzdWx0ID4gVVNCX1NUT1JfWEZFUl9TVEFMTEVEKQotCQkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKLQl9Ci0KLQkvKiBTVEFUVVMgU1RBR0UgKi8KLQkvKiBOT1RFOiBDQiBkb2VzIG5vdCBoYXZlIGEgc3RhdHVzIHN0YWdlLiAgU2lsbHksIEkga25vdy4gIFNvCi0JICogd2UgaGF2ZSB0byBjYXRjaCB0aGlzIGF0IGEgaGlnaGVyIGxldmVsLgotCSAqLwotCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRDsKLX0KLQotLyoKICAqIEJ1bGsgb25seSB0cmFuc3BvcnQKICAqLwogCkBAIC0xMTczLDEwICsxMjc4LDkgQEAKICAqLwogaW50IHVzYl9zdG9yX3BvcnRfcmVzZXQoc3RydWN0IHVzX2RhdGEgKnVzKQogewotCWludCByZXN1bHQsIHJjX2xvY2s7CisJaW50IHJlc3VsdDsKIAotCXJlc3VsdCA9IHJjX2xvY2sgPQotCQl1c2JfbG9ja19kZXZpY2VfZm9yX3Jlc2V0KHVzLT5wdXNiX2RldiwgdXMtPnB1c2JfaW50Zik7CisJcmVzdWx0ID0gdXNiX2xvY2tfZGV2aWNlX2Zvcl9yZXNldCh1cy0+cHVzYl9kZXYsIHVzLT5wdXNiX2ludGYpOwogCWlmIChyZXN1bHQgPCAwKQogCQlVU19ERUJVR1AoInVuYWJsZSB0byBsb2NrIGRldmljZSBmb3IgcmVzZXQ6ICVkXG4iLCByZXN1bHQpOwogCWVsc2UgewpAQCAtMTE4OSw4ICsxMjkzLDcgQEAKIAkJCVVTX0RFQlVHUCgidXNiX3Jlc2V0X2RldmljZSByZXR1cm5zICVkXG4iLAogCQkJCQlyZXN1bHQpOwogCQl9Ci0JCWlmIChyY19sb2NrKQotCQkJdXNiX3VubG9ja19kZXZpY2UodXMtPnB1c2JfZGV2KTsKKwkJdXNiX3VubG9ja19kZXZpY2UodXMtPnB1c2JfZGV2KTsKIAl9CiAJcmV0dXJuIHJlc3VsdDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmggYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3RyYW5zcG9ydC5oCmluZGV4IGU3MGI4ODEuLjI0MmZmNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmgKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS90cmFuc3BvcnQuaApAQCAtMTEzLDggKzExMyw2IEBACiAKICNkZWZpbmUgVVNfQ0JJX0FEU0MJCTAKIAotZXh0ZXJuIGludCB1c2Jfc3Rvcl9DQklfdHJhbnNwb3J0KHN0cnVjdCBzY3NpX2NtbmQgKiwgc3RydWN0IHVzX2RhdGEqKTsKLQogZXh0ZXJuIGludCB1c2Jfc3Rvcl9DQl90cmFuc3BvcnQoc3RydWN0IHNjc2lfY21uZCAqLCBzdHJ1Y3QgdXNfZGF0YSopOwogZXh0ZXJuIGludCB1c2Jfc3Rvcl9DQl9yZXNldChzdHJ1Y3QgdXNfZGF0YSopOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfZGV2cy5oIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaAppbmRleCBiZmNjMWZlLi5hN2Y5NTEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfZGV2cy5oCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmgKQEAgLTI3LDcgKzI3LDggQEAKIAogLyogSU1QT1JUQU5UIE5PVEU6IFRoaXMgZmlsZSBtdXN0IGJlIGluY2x1ZGVkIGluIGFub3RoZXIgZmlsZSB3aGljaCBkb2VzCiAgKiB0aGUgZm9sbG93aW5nIHRoaW5nIGZvciBpdCB0byB3b3JrOgotICogVGhlIG1hY3JvIFVOVVNVQUxfREVWKCkgbXVzdCBiZSBkZWZpbmVkIGJlZm9yZSB0aGlzIGZpbGUgaXMgaW5jbHVkZWQKKyAqIFRoZSBVTlVTVUFMX0RFViwgQ09NUExJQU5UX0RFViwgYW5kIFVTVUFMX0RFViBtYWNyb3MgbXVzdCBiZSBkZWZpbmVkCisgKiBiZWZvcmUgdGhpcyBmaWxlIGlzIGluY2x1ZGVkLgogICovCiAKIC8qIElmIHlvdSBlZGl0IHRoaXMgZmlsZSwgcGxlYXNlIHRyeSB0byBrZWVwIGl0IHNvcnRlZCBmaXJzdCBieSBWZW5kb3JJRCwKQEAgLTQ2LDYgKzQ3LDEyIEBACiAgKiA8dXNiLXN0b3JhZ2VAbGlzdHMub25lLWV5ZWQtYWxpZW4ubmV0PgogICovCiAKKy8qIE5vdGU6IElmIHlvdSBhZGQgYW4gZW50cnkgb25seSBpbiBvcmRlciB0byBzZXQgdGhlIENBUEFDSVRZX09LIGZsYWcsCisgKiB1c2UgdGhlIENPTVBMSUFOVF9ERVYgbWFjcm8gaW5zdGVhZCBvZiBVTlVTVUFMX0RFVi4gIFRoaXMgaXMKKyAqIGJlY2F1c2Ugc3VjaCBlbnRyaWVzIG1hcmsgZGV2aWNlcyB3aGljaCBhY3R1YWxseSB3b3JrIGNvcnJlY3RseSwKKyAqIGFzIG9wcG9zZWQgdG8gZGV2aWNlcyB0aGF0IGRvIHNvbWV0aGluZyBzdHJhbmdlbHkgb3Igd3JvbmdseS4KKyAqLworCiAvKiBwYXRjaCBzdWJtaXR0ZWQgYnkgVml2aWFuIEJyZWdpZXIgPFZpdmlhbi5CcmVnaWVyQGltYWcuZnI+CiAgKi8KIFVOVVNVQUxfREVWKCAgMHgwM2ViLCAweDIwMDIsIDB4MDEwMCwgMHgwMTAwLApAQCAtODUsNiArOTIsMTMgQEAKIAkJVVNfU0NfODA3MCwgVVNfUFJfVVNCQVQsIGluaXRfdXNiYXRfY2QsIDApLAogI2VuZGlmCiAKKy8qIFJlcG9ydGVkIGJ5IEJlbiBFZnJvcyA8YmVuQHBjLWRvY3Rvci5jb20+ICovCitVTlVTVUFMX0RFViggIDB4MDNmMCwgMHgwNzBjLCAweDAwMDAsIDB4MDAwMCwKKwkJIkhQIiwKKwkJIlBlcnNvbmFsIE1lZGlhIERyaXZlIiwKKwkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCisJCVVTX0ZMX1NBTkVfU0VOU0UgKSwKKwogLyogUmVwb3J0ZWQgYnkgR3JhbnQgR3J1bmRsZXIgPGdydW5kbGVyQHBhcmlzYy1saW51eC5vcmc+CiAgKiBIUCByNzA3IGNhbWVyYSBpbiAiRGlzayIgbW9kZSB3aXRoIDIuMDAuMjMgb3IgMi4wMC4yNCBmaXJtd2FyZS4KICAqLwpAQCAtMTYwLDM0ICsxNzQsNiBAQAogCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKIAkJVVNfRkxfTUFYX1NFQ1RPUlNfNjQgKSwKIAotLyogUmVwb3J0ZWQgYnkgRmlsaXAgSm9lbHNzb24gPGZpbGlwQGJsdWV0dXJ0bGUubnU+ICovCi1VTlVTVUFMX0RFViggIDB4MDQyMSwgMHgwMDVkLCAweDAwMDEsIDB4MDYwMCwKLQkJIk5va2lhIiwKLQkJIk5va2lhIDMxMTBjIiwKLQkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCi0JCVVTX0ZMX0ZJWF9DQVBBQ0lUWSApLAotCi0vKiBSZXBvcnRlZCBieSBPemFuIFNlbmVyIDx0aGVtZ3p6eUBnbWFpbC5jb20+ICovCi1VTlVTVUFMX0RFViggIDB4MDQyMSwgMHgwMDYwLCAweDA1NTEsIDB4MDU1MSwKLQkJIk5va2lhIiwKLQkJIjM1MDBjIiwKLQkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCi0JCVVTX0ZMX0ZJWF9DQVBBQ0lUWSApLAotCi0vKiBSZXBvcnRlZCBieSBDU0VDU1kgTGFzemxvIDxib29iYWFAZnJ1Z2Fsd2FyZS5vcmc+ICovCi1VTlVTVUFMX0RFViggIDB4MDQyMSwgMHgwMDYzLCAweDAwMDEsIDB4MDYwMSwKLQkJIk5va2lhIiwKLQkJIk5va2lhIDMxMDljIiwKLQkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCi0JCVVTX0ZMX0ZJWF9DQVBBQ0lUWSApLAotCi0vKiBQYXRjaCBmb3IgTm9raWEgNTMxMCBjYXBhY2l0eSAqLwotVU5VU1VBTF9ERVYoICAweDA0MjEsIDB4MDA2YSwgMHgwMDAwLCAweDA3MDEsCi0JCSJOb2tpYSIsCi0JCSI1MzEwIiwKLQkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCi0JCVVTX0ZMX0ZJWF9DQVBBQ0lUWSApLAotCiAvKiBSZXBvcnRlZCBieSBNYXJpbyBSZXR0aWcgPG1hcmlvcmV0dGlnQHdlYi5kZT4gKi8KIFVOVVNVQUxfREVWKCAgMHgwNDIxLCAweDA0MmUsIDB4MDEwMCwgMHgwMTAwLAogCQkiTm9raWEiLApAQCAtMjUzLDM1ICsyMzksNiBAQAogCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKIAkJVVNfRkxfTUFYX1NFQ1RPUlNfNjQgKSwKIAotLyogUmVwb3J0ZWQgYnkgQ2VkcmljIEdvZGluIDxjZWRyaWNAYmVsYm9uZS5iZT4gKi8KLVVOVVNVQUxfREVWKCAgMHgwNDIxLCAweDA0YjksIDB4MDUwMCwgMHgwNTUxLAotCQkiTm9raWEiLAotCQkiNTMwMCIsCi0JCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAotCQlVU19GTF9GSVhfQ0FQQUNJVFkgKSwKLQotLyogUmVwb3J0ZWQgYnkgUmljaGFyZCBOYXViZXIgPFJpY2hhcmROYXViZXJAd2ViLmRlPiAqLwotVU5VU1VBTF9ERVYoICAweDA0MjEsIDB4MDRmYSwgMHgwNTUwLCAweDA2NjAsCi0JCSJOb2tpYSIsCi0JCSI2MzAwIiwKLQkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCi0JCVVTX0ZMX0ZJWF9DQVBBQ0lUWSApLAotCi0vKiBQYXRjaCBmb3IgTm9raWEgNTMxMCBjYXBhY2l0eSAqLwotVU5VU1VBTF9ERVYoICAweDA0MjEsIDB4MDA2YSwgMHgwMDAwLCAweDA1OTEsCi0JIk5va2lhIiwKLQkiNTMxMCIsCi0JVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCi0JVVNfRkxfRklYX0NBUEFDSVRZICksCi0KLS8qIFN1Ym1pdHRlZCBieSBSaWNreSBXb25nIFl1bmcgRmVpIDxldmlsYmxhZGV3YXJyaW9yQGdtYWlsLmNvbT4gKi8KLS8qIE5va2lhIDc2MTAgU3VwZXJub3ZhIC0gVG9vIG1hbnkgc2VjdG9ycyByZXBvcnRlZCBpbiB1c2Igc3RvcmFnZSBtb2RlICovCi1VTlVTVUFMX0RFViggIDB4MDQyMSwgMHgwMGY1LCAweDAwMDAsIDB4MDQ3MCwKLQkiTm9raWEiLAotCSI3NjEwIFN1cGVybm92YSIsCi0JVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCi0JVVNfRkxfRklYX0NBUEFDSVRZICksCi0KIC8qIFJlcG9ydGVkIGJ5IE9sYWYgSGVyaW5nIDxvbGhAc3VzZS5kZT4gZnJvbSBub3ZlbGwgYnVnICMxMDU4NzggKi8KIFVOVVNVQUxfREVWKCAgMHgwNDI0LCAweDBmZGMsIDB4MDIxMCwgMHgwMjEwLAogCQkiU01TQyIsCkBAIC0yODksMTEgKzI0NiwxNyBAQAogCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKIAkJVVNfRkxfU0lOR0xFX0xVTiApLAogCi0jaWZkZWYgQ09ORklHX1VTQl9TVE9SQUdFX0RQQ00KKyNpZmRlZiBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjA5CiBVTlVTVUFMX0RFViggIDB4MDQzNiwgMHgwMDA1LCAweDAxMDAsIDB4MDEwMCwKIAkJIk1pY3JvdGVjaCIsCiAJCSJDYW1lcmFNYXRlIChEUENNX1VTQikiLAogIAkJVVNfU0NfU0NTSSwgVVNfUFJfRFBDTV9VU0IsIE5VTEwsIDAgKSwKKyNlbHNlCitVTlVTVUFMX0RFViggIDB4MDQzNiwgMHgwMDA1LCAweDAxMDAsIDB4MDEwMCwKKwkJIk1pY3JvdGVjaCIsCisJCSJDYW1lcmFNYXRlIiwKKwkJVVNfU0NfU0NTSSwgVVNfUFJfQ0IsIE5VTEwsCisJCVVTX0ZMX1NJTkdMRV9MVU4gKSwKICNlbmRpZgogCiAvKiBQYXRjaCBzdWJtaXR0ZWQgYnkgRGFuaWVsIERyYWtlIDxkc2RAZ2VudG9vLm9yZz4KQEAgLTM4OCw5OCArMzUxLDYgQEAKIAkJIkRWRC1DQU0gRFotTVYxMDBBIENhbWNvcmRlciIsCiAJCVVTX1NDX1NDU0ksIFVTX1BSX0NCLCBOVUxMLCBVU19GTF9TSU5HTEVfTFVOKSwKIAotLyogUGF0Y2ggZm9yIE5pa29uIGNvb2xwaXggMjAwMAotICogU3VibWl0dGVkIGJ5IEZhYmllbiBDb3NzZSA8ZmFiaWVuLmNvc3NlQHdhbmFkb28uZnI+Ki8KLVVOVVNVQUxfREVWKCAgMHgwNGIwLCAweDAzMDEsIDB4MDAxMCwgMHgwMDEwLAotCQkiTklLT04iLAotCQkiTklLT04gRFNDIEUyMDAwIiwKLQkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsTlVMTCwKLQkJVVNfRkxfTk9UX0xPQ0tBQkxFICksCi0KLS8qIFJlcG9ydGVkIGJ5IFN0ZWZhbiBkZSBLb25pbmsgPHNraW5raWVAeHM0YWxsLm5sPiAqLwotVU5VU1VBTF9ERVYoICAweDA0YjAsIDB4MDQwMSwgMHgwMjAwLCAweDAyMDAsCi0JCSJOSUtPTiIsCi0JCSJOSUtPTiBEU0MgRDEwMCIsCi0JCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAotCQlVU19GTF9GSVhfQ0FQQUNJVFkpLAotCi0vKiBSZXBvcnRlZCBieSBUb2JpYXMgS3VuemUgQnJpc2VubyA8dC1saW51eEBmaWN0aXZlLmNvbT4gKi8KLVVOVVNVQUxfREVWKCAgMHgwNGIwLCAweDA0MDMsIDB4MDIwMCwgMHgwMjAwLAotCQkiTklLT04iLAotCQkiTklLT04gRFNDIEQySCIsCi0JCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAotCQlVU19GTF9GSVhfQ0FQQUNJVFkpLAotCi0vKiBSZXBvcnRlZCBieSBNaWxpbmV2c2t5IERtaXRyeSA8bmlhbS5uaWFtQGdtYWlsLmNvbT4gKi8KLVVOVVNVQUxfREVWKCAgMHgwNGIwLCAweDA0MDksIDB4MDEwMCwgMHgwMTAwLAotCQkiTklLT04iLAotCQkiTklLT04gRFNDIEQ1MCIsCi0JCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAotCQlVU19GTF9GSVhfQ0FQQUNJVFkpLAotCi0vKiBSZXBvcnRlZCBieSBBbmRyZWFzIEJvY2tob2xkIDxhbmRyZWFzQGJvY2tpb25saW5lLmRlPiAqLwotVU5VU1VBTF9ERVYoICAweDA0YjAsIDB4MDQwNSwgMHgwMTAwLCAweDAxMDAsCi0JCSJOSUtPTiIsCi0JCSJOSUtPTiBEU0MgRDcwIiwKLQkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCi0JCVVTX0ZMX0ZJWF9DQVBBQ0lUWSksCi0KLS8qIFJlcG9ydGVkIGJ5IEphbWllIEtpdHNvbiA8amFtaWVAc3RhYmVyaW5kZS5mc25ldC5jby51az4gKi8KLVVOVVNVQUxfREVWKCAgMHgwNGIwLCAweDA0MGQsIDB4MDEwMCwgMHgwMTAwLAotCQkiTklLT04iLAotCQkiTklLT04gRFNDIEQ3MHMiLAotCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKLQkJVVNfRkxfRklYX0NBUEFDSVRZKSwKLQotLyogUmVwb3J0ZWQgYnkgR3JhYmVyIGFuZCBNaWtlIFBhZ2FubyA8bXBhZ2Fuby1rZXJuZWxAbXBhZ2Fuby5jb20+ICovCi1VTlVTVUFMX0RFViggIDB4MDRiMCwgMHgwNDBmLCAweDAxMDAsIDB4MDIwMCwKLQkJIk5JS09OIiwKLQkJIk5JS09OIERTQyBEMjAwIiwKLQkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCi0JCVVTX0ZMX0ZJWF9DQVBBQ0lUWSksCi0KLS8qIFJlcG9ydGVkIGJ5IEVtaWwgTGFyc3NvbiA8ZW1pbEBzd2lwLm5ldD4gKi8KLVVOVVNVQUxfREVWKCAgMHgwNGIwLCAweDA0MTEsIDB4MDEwMCwgMHgwMTExLAotCQkiTklLT04iLAotCQkiTklLT04gRFNDIEQ4MCIsCi0JCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAotCQlVU19GTF9GSVhfQ0FQQUNJVFkpLAotCi0vKiBSZXBvcnRlZCBieSBPcnR3aW4gR2x1ZWNrIDxvZGlAb2RpLmNoPiAqLwotVU5VU1VBTF9ERVYoICAweDA0YjAsIDB4MDQxMywgMHgwMTEwLCAweDAxMTEsCi0JCSJOSUtPTiIsCi0JCSJOSUtPTiBEU0MgRDQwIiwKLQkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCi0JCVVTX0ZMX0ZJWF9DQVBBQ0lUWSksCi0KLS8qIFJlcG9ydGVkIGJ5IFBhdWwgQ2hlY2sgPHBhdWxAb3BlbnN0cmVldC5jb20+ICovCi1VTlVTVUFMX0RFViggIDB4MDRiMCwgMHgwNDE1LCAweDAxMDAsIDB4MDEwMCwKLQkJIk5JS09OIiwKLQkJIk5JS09OIERTQyBEMlhzIiwKLQkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCi0JCVVTX0ZMX0ZJWF9DQVBBQ0lUWSksCi0KLS8qIFJlcG9ydGVkIGJ5IFNoYW4gRGVzdHJvbXAgKHNoYW5zYW5AZ21haWwuY29tKSAqLwotVU5VU1VBTF9ERVYoICAweDA0YjAsIDB4MDQxNywgMHgwMTAwLCAweDAxMDAsCi0JCSJOSUtPTiIsCi0JCSJOSUtPTiBEU0MgRDQwWCIsCi0JCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAotCQlVU19GTF9GSVhfQ0FQQUNJVFkpLAotCi0vKiBSZXBvcnRlZCBieSBwYXVsIHJlYWR5IDxseHR3aW5AaG9tZWNhbGwuY28udWs+ICovCi1VTlVTVUFMX0RFViggIDB4MDRiMCwgMHgwNDE5LCAweDAxMDAsIDB4MDIwMCwKLQkJIk5JS09OIiwKLQkJIk5JS09OIERTQyBEMzAwIiwKLQkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCi0JCVVTX0ZMX0ZJWF9DQVBBQ0lUWSksCi0KLS8qIFJlcG9ydGVkIGJ5IERvdWcgTWF4ZXkgKGR3bUBhdXN0aW4uaWJtLmNvbSkgKi8KLVVOVVNVQUxfREVWKCAgMHgwNGIzLCAweDQwMDEsIDB4MDExMCwgMHgwMTEwLAotCQkiSUJNIiwKLQkJIklCTSBSU0EyIiwKLQkJVVNfU0NfREVWSUNFLCBVU19QUl9DQiwgTlVMTCwKLQkJVVNfRkxfTUFYX1NFQ1RPUlNfTUlOKSwKLQogLyogQkVOUSBEQzUzMzAKICAqIFJlcG9ydGVkIGJ5IE1hbnVlbCBGb21idWVuYSA8bWZvbWJ1ZW5hQHlhLmNvbT4gYW5kCiAgKiBGcmFuayBDb3BlbGFuZCA8ZmpjQHRoaW5neS5hcGFuYS5vcmcuYXU+ICovCkBAIC00ODksNiArMzYwLDIxIEBACiAJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAogCQlVU19GTF9JR05PUkVfUkVTSURVRSApLAogCisvKiBQYXRjaCBmb3IgTmlrb24gY29vbHBpeCAyMDAwCisgKiBTdWJtaXR0ZWQgYnkgRmFiaWVuIENvc3NlIDxmYWJpZW4uY29zc2VAd2FuYWRvby5mcj4qLworVU5VU1VBTF9ERVYoICAweDA0YjAsIDB4MDMwMSwgMHgwMDEwLCAweDAwMTAsCisJCSJOSUtPTiIsCisJCSJOSUtPTiBEU0MgRTIwMDAiLAorCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSxOVUxMLAorCQlVU19GTF9OT1RfTE9DS0FCTEUgKSwKKworLyogUmVwb3J0ZWQgYnkgRG91ZyBNYXhleSAoZHdtQGF1c3Rpbi5pYm0uY29tKSAqLworVU5VU1VBTF9ERVYoICAweDA0YjMsIDB4NDAwMSwgMHgwMTEwLCAweDAxMTAsCisJCSJJQk0iLAorCQkiSUJNIFJTQTIiLAorCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0NCLCBOVUxMLAorCQlVU19GTF9NQVhfU0VDVE9SU19NSU4pLAorCiAjaWZkZWYgQ09ORklHX1VTQl9TVE9SQUdFX0NZUFJFU1NfQVRBQ0IKIC8qIENZN0M2ODMwMCA6IHN1cHBvcnQgYXRhY2IgKi8KIFVOVVNVQUxfREVWKCAgMHgwNGI0LCAweDY4MzAsIDB4MDAwMCwgMHg5OTk5LApAQCAtNTk0LDYgKzQ4MCwxMiBAQAogCQkiZVVTQiBTbWFydE1lZGlhIC8gQ29tcGFjdEZsYXNoIEFkYXB0ZXIiLAogCQlVU19TQ19TQ1NJLCBVU19QUl9EUENNX1VTQiwgdXNiX3N0b3Jfc2RkcjA5X2RwY21faW5pdCwKIAkJMCksCisjZWxzZQorVU5VU1VBTF9ERVYoICAweDA0ZTYsIDB4MDAwNSwgMHgwMTAwLCAweDAyMDgsCisJCSJTQ00gTWljcm9zeXN0ZW1zIiwKKwkJImVVU0IgQ29tcGFjdEZsYXNoIEFkYXB0ZXIiLAorCQlVU19TQ19TQ1NJLCBVU19QUl9DQiwgTlVMTCwKKwkJVVNfRkxfU0lOR0xFX0xVTiksCiAjZW5kaWYKIAogLyogUmVwb3J0ZWQgYnkgTWFya3VzIERlbWxlaXRuZXIgPG1zZGVtbGVpQGNsLnVuaS1oZWlkZWxiZXJnLmRlPiAqLwpAQCAtNjg1LDYgKzU3NywxMyBAQAogCQlVU19TQ184MDcwLCBVU19QUl9ERVZJQ0UsIE5VTEwsCiAJCVVTX0ZMX0ZJWF9JTlFVSVJZICksCiAKKy8qIEFkZGVkIGJ5IEFsYW4gU3Rlcm4gPHN0ZXJuQHJvd2xhbmQuaGFydmFyZC5lZHU+ICovCitDT01QTElBTlRfREVWKDB4MDUyNSwgMHhhNGE1LCAweDAwMDAsIDB4OTk5OSwKKwkJIkxpbnV4IiwKKwkJIkZpbGUtYmFja2VkIFN0b3JhZ2UgR2FkZ2V0IiwKKwkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCisJCVVTX0ZMX0NBUEFDSVRZX09LICksCisKIC8qIFlha3VtbyBNZWdhIEltYWdlIDM3CiAgKiBTdWJtaXR0ZWQgYnkgU3RlcGhhbiBGdWhybWFubiA8YXRvbWVuZXJnaWVAdC1vbmxpbmUuZGU+ICovCiBVTlVTVUFMX0RFViggIDB4MDUyYiwgMHgxODAxLCAweDAxMDAsIDB4MDEwMCwKQEAgLTgwNywxNSArNzA2LDE1IEBACiAJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAogCQlVU19GTF9GSVhfSU5RVUlSWSApLAogCi0vKiBTdWJtaXR0ZWQgYnkgTWlrZSBBbGJvcm4gPG1hbGJvcm5AZGVhbmRyYS5ob21laXAubmV0PiAqLwotVU5VU1VBTF9ERVYoICAweDA1NGMsIDB4MDE2YSwgMHgwMDAwLCAweDk5OTksCisvKiBTdWJtaXR0ZWQgYnkgRnJhbmsgRW5nZWwgPGZyYW5raWVAY3NlLnVuc3cuZWR1LmF1PiAqLworVU5VU1VBTF9ERVYoICAweDA1NGMsIDB4MDA5OSwgMHgwMDAwLCAweDk5OTksCiAJCSJTb255IiwKIAkJIlBFRyBNYXNzIFN0b3JhZ2UiLAogCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKIAkJVVNfRkxfRklYX0lOUVVJUlkgKSwKLQkJCi0vKiBTdWJtaXR0ZWQgYnkgRnJhbmsgRW5nZWwgPGZyYW5raWVAY3NlLnVuc3cuZWR1LmF1PiAqLwotVU5VU1VBTF9ERVYoICAweDA1NGMsIDB4MDA5OSwgMHgwMDAwLCAweDk5OTksCisKKy8qIFN1Ym1pdHRlZCBieSBNaWtlIEFsYm9ybiA8bWFsYm9ybkBkZWFuZHJhLmhvbWVpcC5uZXQ+ICovCitVTlVTVUFMX0RFViggIDB4MDU0YywgMHgwMTZhLCAweDAwMDAsIDB4OTk5OSwKIAkJIlNvbnkiLAogCQkiUEVHIE1hc3MgU3RvcmFnZSIsCiAJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLApAQCAtOTY2LDYgKzg2NSwxOCBAQAogCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKIAkJVVNfRkxfRklYX0NBUEFDSVRZICksCiAKKy8qIFJlcG9ydGVkIGJ5IERhbiBXaWxsaWFtcyA8ZGNid0ByZWRoYXQuY29tPgorICogT3B0aW9uIE4uVi4gbW9iaWxlIGJyb2FkYmFuZCBtb2RlbXMKKyAqIElnbm9yZSBkcml2ZXIgQ0QgbW9kZSBhbmQgZm9yY2UgaW50byBtb2RlbSBtb2RlIGJ5IGRlZmF1bHQuCisgKi8KKworLyogR2xvYmV0cm90dGVyIEhTRFBBOyBtYXNzIHN0b3JhZ2Ugc2hvd3MgdXAgYXMgUXVhbGNvbW0gZm9yIHZlbmRvciAqLworVU5VU1VBTF9ERVYoICAweDA1YzYsIDB4MTAwMCwgMHgwMDAwLCAweDk5OTksCisJCSJPcHRpb24gTi5WLiIsCisJCSJNYXNzIFN0b3JhZ2UiLAorCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgb3B0aW9uX21zX2luaXQsCisJCTApLAorCiAjaWZkZWYgQ09ORklHX1VTQl9TVE9SQUdFX0pVTVBTSE9UCiBVTlVTVUFMX0RFViggIDB4MDVkYywgMHgwMDAxLCAweDAwMDAsIDB4MDAwMSwKIAkJIkxleGFyIiwKQEAgLTEwMDQsNiArOTE1LDEzIEBACiAJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAogCQlVU19GTF9HT19TTE9XIHwgVVNfRkxfTUFYX1NFQ1RPUlNfNjQgKSwKIAorLyogUmVwb3J0ZWQgYnkgQmVuIEVmcm9zIDxiZW5AcGMtZG9jdG9yLmNvbT4gKi8KK1VOVVNVQUxfREVWKCAgMHgwNWUzLCAweDA3MjMsIDB4OTQ1MSwgMHg5NDUxLAorCQkiR2VuZXN5cyBMb2dpYyIsCisJCSJVU0IgdG8gU0FUQSIsCisJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAorCQlVU19GTF9TQU5FX1NFTlNFICksCisKIC8qIFJlcG9ydGVkIGJ5IEhhbm5vIEJvZWNrIDxoYW5ub0BnbXguZGU+CiAgKiBUYWtlbiBmcm9tIHRoZSBMeWNvcmlzIEtlcm5lbCAqLwogVU5VU1VBTF9ERVYoICAweDA2MzYsIDB4MDAwMywgMHgwMDAwLCAweDk5OTksCkBAIC0xMDQwLDcgKzk1OCw3IEBACiAJCVVTX0ZMX0ZJWF9DQVBBQ0lUWSB8IFVTX0ZMX0dPX1NMT1cgKSwKIAogLyogUmVwb3J0ZWQgYnkgQWxleCBCdXRjaGVyIDxhbGV4LmJ1dGNoZXJAYXNzdXJzeXMuY28udWs+ICovCi1VTlVTVUFMX0RFViggMHgwNjdiLCAweDM1MDcsIDB4MDAwMSwgMHgwMDAxLAorVU5VU1VBTF9ERVYoIDB4MDY3YiwgMHgzNTA3LCAweDAwMDEsIDB4MDEwMSwKIAkJIlByb2xpZmljIFRlY2hub2xvZ3kgSW5jLiIsCiAJCSJBVEFQSS02IEJyaWRnZSBDb250cm9sbGVyIiwKIAkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCkBAIC0xMTYxLDExICsxMDc5LDE3IEBACiAJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCB1c2Jfc3Rvcl9ldXNjc2lfaW5pdCwKIAkJVVNfRkxfU0NNX01VTFRfVEFSRyApLAogCi0jaWZkZWYgQ09ORklHX1VTQl9TVE9SQUdFX0RQQ00KKyNpZmRlZiBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjA5CiBVTlVTVUFMX0RFViggIDB4MDdhZiwgMHgwMDA2LCAweDAxMDAsIDB4MDEwMCwKIAkJIk1pY3JvdGVjaCIsCiAJCSJDYW1lcmFNYXRlIChEUENNX1VTQikiLAogIAkJVVNfU0NfU0NTSSwgVVNfUFJfRFBDTV9VU0IsIE5VTEwsIDAgKSwKKyNlbHNlCitVTlVTVUFMX0RFViggIDB4MDdhZiwgMHgwMDA2LCAweDAxMDAsIDB4MDEwMCwKKwkJIk1pY3JvdGVjaCIsCisJCSJDYW1lcmFNYXRlIiwKKwkJVVNfU0NfU0NTSSwgVVNfUFJfQ0IsIE5VTEwsCisJCVVTX0ZMX1NJTkdMRV9MVU4gKSwKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1VTQl9TVE9SQUdFX0FMQVVEQQpAQCAtMTMyMCw2ICsxMjQ0LDEzIEBACiAJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAogCQlVU19GTF9GSVhfQ0FQQUNJVFkpLAogCisvKiBSZXBvcnRlZCBhbmQgcGF0Y2hlZCBieSBOZ3V5ZW4gQW5oIFF1eW5oIDxhcXV5bmhAZ21haWwuY29tPiAqLworVU5VU1VBTF9ERVYoIDB4MDg0MCwgMHgwMDg0LCAweDAwMDEsIDB4MDAwMSwKKwkJIkFyZ29zeSIsCisJCSJTdG9yYWdlIiwKKwkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCisJCVVTX0ZMX0ZJWF9DQVBBQ0lUWSksCisKIC8qIEVudHJ5IGFuZCBzdXBwb3J0aW5nIHBhdGNoIGJ5IFRoZW9kb3JlIEtpbGdvcmUgPGtpbGdvdGFAYXVidXJuLmVkdT4uCiAgKiBGbGFnIHdpbGwgc3VwcG9ydCBCdWxrIGRldmljZXMgd2hpY2ggdXNlIGEgc3RhbmRhcmRzLXZpb2xhdGluZyAzMi1ieXRlCiAgKiBDb21tYW5kIEJsb2NrIFdyYXBwZXIuIEhlcmUsIHRoZSAiREMyTUVHQSIgY2FtZXJhcyAoc2V2ZXJhbCBicmFuZHMpIHdpdGgKQEAgLTEzNDMsMTcgKzEyNzQsNiBAQAogCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKIAkJVVNfRkxfTk9UX0xPQ0tBQkxFKSwKIAotLyogQW5kcmV3IEx1bm4gPGFuZHJld0BsdW5uLmNoPgotICogUGFuRGlnaXRhbCBEaWdpdGFsIFBpY3R1cmUgRnJhbWUuIERvZXMgbm90IGxpa2UgQUxMT1dfTUVESVVNX1JFTU9WQUwKLSAqIG9uIExVTiA0LgotICogTm90ZTogVmVuZDpQcm9kIGNsYXNoIHdpdGggIkx0ZCBNYXhlbGwgV1MzMCBTbGltIERpZ2l0YWwgQ2FtZXJhIgotKi8KLVVOVVNVQUxfREVWKCAgMHgwODUxLCAweDE1NDMsIDB4MDIwMCwgMHgwMjAwLAotCQkiUGFuRGlnaXRhbCIsCi0JCSJQaG90byBGcmFtZSIsCi0JCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAotCQlVU19GTF9OT1RfTE9DS0FCTEUpLAotCiAvKiBTdWJtaXR0ZWQgYnkgSmFuIERlIEx1eWNrIDxsa21sQGtjb3JlLm9yZz4gKi8KIFVOVVNVQUxfREVWKCAgMHgwOGJkLCAweDExMDAsIDB4MDAwMCwgMHgwMDAwLAogCQkiQ0lUSVpFTiIsCkBAIC0xNDI1LDYgKzEzNDUsMTMgQEAKIAkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCiAJCVVTX0ZMX0ZJWF9JTlFVSVJZICksCiAKKy8qIFJlcG9ydGVkIGJ5IEphYWsgUmlzdGlvamEgPFJpc3Rpb2phQGdtYWlsLmNvbT4gKi8KK1VOVVNVQUxfREVWKCAweDBhMTcsIDB4MDA2ZSwgMHgwMTAwLCAweDAxMDAsCisJCSJQZW50YXgiLAorCQkiSzEwRCIsCisJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAorCQlVU19GTF9GSVhfQ0FQQUNJVFkgKSwKKwogLyogVGhlc2UgYXJlIHZpcnR1YWwgd2luZG93cyBkcml2ZXIgQ0RzLCB3aGljaCB0aGUgemQxMjExcncgZHJpdmVyCiAgKiBhdXRvbWF0aWNhbGx5IGNvbnZlcnRzIGludG8gV0xBTiBkZXZpY2VzLiAqLwogVU5VU1VBTF9ERVYoIDB4MGFjZSwgMHgyMDExLCAweDAxMDEsIDB4MDEwMSwKQEAgLTE0MzksNiArMTM2NiwxOCBAQAogCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKIAkJVVNfRkxfSUdOT1JFX0RFVklDRSApLAogCisvKiBSZXBvcnRlZCBieSBEYW4gV2lsbGlhbXMgPGRjYndAcmVkaGF0LmNvbT4KKyAqIE9wdGlvbiBOLlYuIG1vYmlsZSBicm9hZGJhbmQgbW9kZW1zCisgKiBJZ25vcmUgZHJpdmVyIENEIG1vZGUgYW5kIGZvcmNlIGludG8gbW9kZW0gbW9kZSBieSBkZWZhdWx0LgorICovCisKKy8qIGlDT04gMjI1ICovCitVTlVTVUFMX0RFViggIDB4MGFmMCwgMHg2OTcxLCAweDAwMDAsIDB4OTk5OSwKKwkJIk9wdGlvbiBOLlYuIiwKKwkJIk1hc3MgU3RvcmFnZSIsCisJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBvcHRpb25fbXNfaW5pdCwKKwkJMCksCisKIC8qIFJlcG9ydGVkIGJ5IEYuIEFiZW4gPGYuYWJlbkBvcHRpb24uY29tPgogICogVGhpcyBkZXZpY2UgKHdyb25nbHkpIGhhcyBhIHZlbmRvci1zcGVjaWZpYyBkZXZpY2UgZGVzY3JpcHRvci4KICAqIFRoZSBlbnRyeSBpcyBuZWVkZWQgc28gdXNiLXN0b3JhZ2UgY2FuIGJpbmQgdG8gaXQncyBtYXNzLXN0b3JhZ2UKQEAgLTE0NDksNiArMTM4OCwxMyBAQAogCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKIAkJMCApLAogCisvKiBSZXBvcnRlZCBieSBCZW4gRWZyb3MgPGJlbkBwYy1kb2N0b3IuY29tPiAqLworVU5VU1VBTF9ERVYoIDB4MGJjMiwgMHgzMDEwLCAweDAwMDAsIDB4MDAwMCwKKwkJIlNlYWdhdGUiLAorCQkiRnJlZUFnZW50IFBybyIsCisJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAorCQlVU19GTF9TQU5FX1NFTlNFICksCisKICNpZmRlZiBDT05GSUdfVVNCX1NUT1JBR0VfSVNEMjAwCiBVTlVTVUFMX0RFViggIDB4MGJmNiwgMHhhMDAxLCAweDAxMDAsIDB4MDExMCwKIAkJIkFUSSIsCkBAIC0xNDcyLDYgKzE0MTgsMjIgQEAKIAkJVVNfRkxfU0lOR0xFX0xVTiApLAogI2VuZGlmCiAKK1VOVVNVQUxfREVWKCAgMHgwZDQ5LCAweDczMTAsIDB4MDAwMCwgMHg5OTk5LAorCQkiTWF4dG9yIiwKKwkJIlVTQiB0byBTQVRBIiwKKwkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCisJCVVTX0ZMX1NBTkVfU0VOU0UpLAorCisvKgorICogUGV0ZSBaYWl0Y2V2IDx6YWl0Y2V2QHlhaG9vLmNvbT4sIGJ6IzE2NDY4OC4KKyAqIFRoZSBkZXZpY2UgYmxhdGFudGx5IGlnbm9yZXMgTFVOIGFuZCByZXR1cm5zIDEgaW4gR2V0TWF4TFVOLgorICovCitVTlVTVUFMX0RFViggMHgwYzQ1LCAweDEwNjAsIDB4MDEwMCwgMHgwMTAwLAorCQkiVW5rbm93biIsCisJCSJVbmtub3duIiwKKwkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCisJCVVTX0ZMX1NJTkdMRV9MVU4gKSwKKwogLyogU3VibWl0dGVkIGJ5OiBOaWNrIFNpbGxpayA8bi5zaWxsaWtAdGVtcGxlLmVkdT4KICAqIE5lZWRlZCBmb3IgT25lVG91Y2ggZXh0ZW5zaW9uIHRvIHVzYi1zdG9yYWdlCiAgKgpAQCAtMTQ4OSwxNiArMTQ1MSw2IEBACiAJCQkwKSwKICNlbmRpZgogCi0vKgotICogUGV0ZSBaYWl0Y2V2IDx6YWl0Y2V2QHlhaG9vLmNvbT4sIGJ6IzE2NDY4OC4KLSAqIFRoZSBkZXZpY2UgYmxhdGFudGx5IGlnbm9yZXMgTFVOIGFuZCByZXR1cm5zIDEgaW4gR2V0TWF4TFVOLgotICovCi1VTlVTVUFMX0RFViggMHgwYzQ1LCAweDEwNjAsIDB4MDEwMCwgMHgwMTAwLAotCQkiVW5rbm93biIsCi0JCSJVbmtub3duIiwKLQkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCi0JCVVTX0ZMX1NJTkdMRV9MVU4gKSwKLQogLyogU3VibWl0dGVkIGJ5IEpvcmlzIFN0cnV5dmUgPGpvcmlzQHN0cnV5dmUuYmU+ICovCiBVTlVTVUFMX0RFViggMHgwZDk2LCAweDQxMGEsIDB4MDAwMSwgMHhmZmZmLAogCQkiTWVkaW9uIiwKQEAgLTE1MTYsNiArMTQ2OCwxMyBAQAogCQkiSkQgNTIwMCB6MyIsCiAJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLCBVU19GTF9GSVhfSU5RVUlSWSksCiAKKy8qIFJlcG9ydGVkIGJ5ICBKYXNvbiBKb2huc3RvbiA8a2lsbGVhbkBzaGF3LmNhPiAqLworVU5VU1VBTF9ERVYoICAweDBkYzQsIDB4MDA3MywgMHgwMDAwLCAweDAwMDAsCisJCSJNYWNwb3dlciBUZWNobm9sb2d5IENvLkxURC4iLAorCQkiVVNCIDIuMCAzLjVcIiBERVZJQ0UiLAorCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKKwkJVVNfRkxfRklYX0NBUEFDSVRZKSwKKwogLyogUmVwb3J0ZWQgYnkgTHVib21pciBCbGFoYSA8dHJpdG9sQHRyaWxvZ2ljLmN6PgogICogSSBfUkVBTExZXyBkb24ndCBrbm93IHdoYXQgM3JkLCA0dGggbnVtYmVyIGFuZCBhbGwgZGVmaW5lcyBtZWFuLCBidXQgdGhpcwogICogd29ya3MgZm9yIG1lLiBDYW4gYW55Ym9keSBjb3JyZWN0IHRoZXNlIHZhbHVlcz8gKEkgYWJsZSB0byB0ZXN0IGNvcnJlY3RlZApAQCAtMTYzOCwxMyArMTU5Nyw2IEBACiAJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAogCQlVU19GTF9GSVhfQ0FQQUNJVFkgfCBVU19GTF9JR05PUkVfUkVTSURVRSApLAogCi0vKiBSZXBvcnRlZCBieSBSaWNhcmRvIEJhcmJlcmlzIDxyaWNhcmRvQGRhdHRhdGVjLmNvbT4gKi8KLVVOVVNVQUxfREVWKCAgMHgwZmNlLCAweGUwOTIsIDB4MDAwMCwgMHgwMDAwLAotCQkiU29ueSBFcmljc3NvbiIsCi0JCSJQMWkiLAotCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKLQkJVVNfRkxfSUdOT1JFX1JFU0lEVUUgKSwKLQogLyogUmVwb3J0ZWQgYnkgRW1tYW51ZWwgVmFzaWxha2lzIDxldmFzQGZvcnRobmV0LmdyPiAqLwogVU5VU1VBTF9ERVYoICAweDBmY2UsIDB4ZTAzMSwgMHgwMDAwLCAweDAwMDAsCiAJCSJTb255IEVyaWNzc29uIiwKQEAgLTE2NTIsNiArMTYwNCwxMyBAQAogCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKIAkJVVNfRkxfSUdOT1JFX1JFU0lEVUUgfCBVU19GTF9GSVhfQ0FQQUNJVFkgKSwKIAorLyogUmVwb3J0ZWQgYnkgUmljYXJkbyBCYXJiZXJpcyA8cmljYXJkb0BkYXR0YXRlYy5jb20+ICovCitVTlVTVUFMX0RFViggIDB4MGZjZSwgMHhlMDkyLCAweDAwMDAsIDB4MDAwMCwKKwkJIlNvbnkgRXJpY3Nzb24iLAorCQkiUDFpIiwKKwkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCisJCVVTX0ZMX0lHTk9SRV9SRVNJRFVFICksCisKIC8qIFJlcG9ydGVkIGJ5IEtldmluIENlcm5la2VlIDxrcGMtdXNiZGV2QGdlbGF0by51aXVjLmVkdT4KICAqIFRlc3RlZCBvbiBoYXJkd2FyZSB2ZXJzaW9uIDEuMTAuCiAgKiBFbnRyeSBpcyBuZWVkZWQgb25seSBmb3IgdGhlIGluaXRpYWxpemVyIGZ1bmN0aW9uIG92ZXJyaWRlLgpAQCAtMTY2NCw2ICsxNjIzLDEyIEBACiAJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCB1c2Jfc3Rvcl91Y3I2MXMyYl9pbml0LAogCQkwICksCiAKK1VOVVNVQUxfREVWKCAgMHgxMDU4LCAweDA3MDQsIDB4MDAwMCwgMHg5OTk5LAorCQkiV2VzdGVybiBEaWdpdGFsIiwKKwkJIkV4dGVybmFsIEhERCIsCisJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAorCQlVU19GTF9TQU5FX1NFTlNFKSwKKwogLyogUmVwb3J0ZWQgYnkgRmFiaW8gVmVudHVyaSA8Zi52ZW50dXJpQHRkbmV0Lml0PgogICogVGhlIGRldmljZSByZXBvcnRzIGEgdmVuZG9yLXNwZWNpZmljIGJEZXZpY2VDbGFzcy4KICAqLwpAQCAtMjA1MywxMCArMjAxOCwxMCBAQAogICogSk1pY3JvbiByZXNwb25kcyB0byBVU04gYW5kIHNldmVyYWwgb3RoZXIgU0NTSSBpb2N0bHMgd2l0aCBhCiAgKiByZXNpZHVlIHRoYXQgY2F1c2VzIHN1YnNlcXVlbnQgSS9PIHJlcXVlc3RzIHRvIGZhaWwuICAqLwogVU5VU1VBTF9ERVYoICAweDE1MmQsIDB4MjMyOSwgMHgwMTAwLCAweDAxMDAsCi0JICAgICAgICAiSk1pY3JvbiIsCi0JICAgICAgICAiVVNCIHRvIEFUQS9BVEFQSSBCcmlkZ2UiLAotCSAgICAgICAgVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCi0JICAgICAgICBVU19GTF9JR05PUkVfUkVTSURVRSApLAorCQkiSk1pY3JvbiIsCisJCSJVU0IgdG8gQVRBL0FUQVBJIEJyaWRnZSIsCisJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAorCQlVU19GTF9JR05PUkVfUkVTSURVRSB8IFVTX0ZMX1NBTkVfU0VOU0UgKSwKIAogLyogUmVwb3J0ZWQgYnkgUm9iZXJ0IFNjaGVkZWwgPHIuc2NoZWRlbEB5YWhvby5kZT4KICAqIE5vdGU6IHRoaXMgaXMgYSAnc3VwZXIgdG9wJyBkZXZpY2UgbGlrZSB0aGUgYWJvdmUgMTRjZC82NjAwIGRldmljZSAqLwpAQCAtMjA4NiwyNyArMjA1MSw2IEBACiAJCVVTX0ZMX0ZJWF9DQVBBQ0lUWSB8IFVTX0ZMX0lHTk9SRV9SRVNJRFVFICksCiAKIC8qCi0gKiBQYXRjaCBieSBQZXRlIFphaXRjZXYgPHphaXRjZXZAcmVkaGF0LmNvbT4KLSAqIFJlcG9ydCBieSBNYXJrIFBhdHRvbi4gUmVkIEhhdCBieiMyMDg5MjguCi0gKiBBZGRlZCBzdXBwb3J0IGZvciByZXYgMHgwMDAyIChNb3Rvcm9sYSBST0tSIFc1KQotICogYnkgSmF2aWVyIFNtYWxkb25lIDxqYXZpZXJAc21hbGRvbmUuY29tLmFyPgotICovCi1VTlVTVUFMX0RFViggIDB4MjJiOCwgMHg0ODEwLCAweDAwMDEsIDB4MDAwMiwKLQkJIk1vdG9yb2xhIiwKLQkJIlJBWlIgVjNpL1JPS1IgVzUiLAotCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKLQkJVVNfRkxfRklYX0NBUEFDSVRZKSwKLQotLyoKLSAqIFBhdGNoIGJ5IEpvc3QgRGllZGVyaWNocyA8am9zdEBxZHVzYS5jb20+Ci0gKi8KLVVOVVNVQUxfREVWKDB4MjJiOCwgMHg2NDEwLCAweDAwMDEsIDB4OTk5OSwKLQkJIk1vdG9yb2xhIEluYy4iLAotCQkiTW90b3JvbGEgUGhvbmUgKFJBWlJWM3h4KSIsCi0JCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAotCQlVU19GTF9GSVhfQ0FQQUNJVFkpLAotCi0vKgogICogUGF0Y2ggYnkgQ29uc3RhbnRpbiBCYXJhbm92IDxjb25zdEB0bHRzdS5ydT4KICAqIFJlcG9ydCBieSBBbmRyZWFzIEtvZW5lY2tlLgogICogTW90b3JvbGEgUk9LUiBaNi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jCmluZGV4IDI3MDE2ZmQuLjRiZWNmNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmMKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuYwpAQCAtNzUsOSArNzUsNiBAQAogI2lmZGVmIENPTkZJR19VU0JfU1RPUkFHRV9TRERSNTUKICNpbmNsdWRlICJzZGRyNTUuaCIKICNlbmRpZgotI2lmZGVmIENPTkZJR19VU0JfU1RPUkFHRV9EUENNCi0jaW5jbHVkZSAiZHBjbS5oIgotI2VuZGlmCiAjaWZkZWYgQ09ORklHX1VTQl9TVE9SQUdFX0ZSRUVDT00KICNpbmNsdWRlICJmcmVlY29tLmgiCiAjZW5kaWYKQEAgLTEwMyw2ICsxMDAsNyBAQAogI2luY2x1ZGUgImN5cHJlc3NfYXRhY2IuaCIKICNlbmRpZgogI2luY2x1ZGUgInNpZXJyYV9tcy5oIgorI2luY2x1ZGUgIm9wdGlvbl9tcy5oIgogCiAvKiBTb21lIGluZm9ybWF0aW9uYWwgZGF0YSAqLwogTU9EVUxFX0FVVEhPUigiTWF0dGhldyBEaGFybSA8bWRoYXJtLXVzYkBvbmUtZXllZC1hbGllbi5uZXQ+Iik7CkBAIC0xMTMsNiArMTExLDEwIEBACiBtb2R1bGVfcGFyYW0oZGVsYXlfdXNlLCB1aW50LCBTX0lSVUdPIHwgU19JV1VTUik7CiBNT0RVTEVfUEFSTV9ERVNDKGRlbGF5X3VzZSwgInNlY29uZHMgdG8gZGVsYXkgYmVmb3JlIHVzaW5nIGEgbmV3IGRldmljZSIpOwogCitzdGF0aWMgY2hhciBxdWlya3NbMTI4XTsKK21vZHVsZV9wYXJhbV9zdHJpbmcocXVpcmtzLCBxdWlya3MsIHNpemVvZihxdWlya3MpLCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKHF1aXJrcywgInN1cHBsZW1lbnRhbCBsaXN0IG9mIGRldmljZSBJRHMgYW5kIHRoZWlyIHF1aXJrcyIpOworCiAKIC8qCiAgKiBUaGUgZW50cmllcyBpbiB0aGlzIHRhYmxlIGNvcnJlc3BvbmQsIGxpbmUgZm9yIGxpbmUsCkBAIC0xMjYsNiArMTI4LDggQEAKIHsgVVNCX0RFVklDRV9WRVIoaWRfdmVuZG9yLCBpZF9wcm9kdWN0LCBiY2REZXZpY2VNaW4sYmNkRGV2aWNlTWF4KSwgXAogICAuZHJpdmVyX2luZm8gPSAoZmxhZ3MpfChVU0JfVVNfVFlQRV9TVE9SPDwyNCkgfQogCisjZGVmaW5lIENPTVBMSUFOVF9ERVYJVU5VU1VBTF9ERVYKKwogI2RlZmluZSBVU1VBTF9ERVYodXNlUHJvdG8sIHVzZVRyYW5zLCB1c2VUeXBlKSBcCiB7IFVTQl9JTlRFUkZBQ0VfSU5GTyhVU0JfQ0xBU1NfTUFTU19TVE9SQUdFLCB1c2VQcm90bywgdXNlVHJhbnMpLCBcCiAgIC5kcml2ZXJfaW5mbyA9IChVU0JfVVNfVFlQRV9TVE9SPDwyNCkgfQpAQCAtMTM0LDYgKzEzOCw3IEBACiAKICMJaW5jbHVkZSAidW51c3VhbF9kZXZzLmgiCiAjdW5kZWYgVU5VU1VBTF9ERVYKKyN1bmRlZiBDT01QTElBTlRfREVWCiAjdW5kZWYgVVNVQUxfREVWCiAJLyogVGVybWluYXRpbmcgZW50cnkgKi8KIAl7IH0KQEAgLTE2NCw2ICsxNjksOCBAQAogCS5pbml0RnVuY3Rpb24gPSBpbml0X2Z1bmN0aW9uLAlcCiB9CiAKKyNkZWZpbmUgQ09NUExJQU5UX0RFVglVTlVTVUFMX0RFVgorCiAjZGVmaW5lIFVTVUFMX0RFVih1c2VfcHJvdG9jb2wsIHVzZV90cmFuc3BvcnQsIHVzZV90eXBlKSBcCiB7IFwKIAkudXNlUHJvdG9jb2wgPSB1c2VfcHJvdG9jb2wsCVwKQEAgLTE3Myw2ICsxODAsNyBAQAogc3RhdGljIHN0cnVjdCB1c191bnVzdWFsX2RldiB1c191bnVzdWFsX2Rldl9saXN0W10gPSB7CiAjCWluY2x1ZGUgInVudXN1YWxfZGV2cy5oIiAKICMJdW5kZWYgVU5VU1VBTF9ERVYKKyMJdW5kZWYgQ09NUExJQU5UX0RFVgogIwl1bmRlZiBVU1VBTF9ERVYKIAogCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCkBAIC00NjQsMTUgKzQ3Miw4NSBAQAogCQlVU19ERUJVR1AoIkkvTyBidWZmZXIgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0KLQl1cy0+c2Vuc2VidWYgPSBrbWFsbG9jKFVTX1NFTlNFX1NJWkUsIEdGUF9LRVJORUwpOwotCWlmICghdXMtPnNlbnNlYnVmKSB7Ci0JCVVTX0RFQlVHUCgiU2Vuc2UgYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCXJldHVybiAwOwogfQogCisvKiBXb3JrcyBvbmx5IGZvciBkaWdpdHMgYW5kIGxldHRlcnMsIGJ1dCBzbWFsbCBhbmQgZmFzdCAqLworI2RlZmluZSBUT0xPV0VSKHgpICgoeCkgfCAweDIwKQorCisvKiBBZGp1c3QgZGV2aWNlIGZsYWdzIGJhc2VkIG9uIHRoZSAicXVpcmtzPSIgbW9kdWxlIHBhcmFtZXRlciAqLworc3RhdGljIHZvaWQgYWRqdXN0X3F1aXJrcyhzdHJ1Y3QgdXNfZGF0YSAqdXMpCit7CisJY2hhciAqcDsKKwl1MTYgdmlkID0gbGUxNl90b19jcHUodXMtPnB1c2JfZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKTsKKwl1MTYgcGlkID0gbGUxNl90b19jcHUodXMtPnB1c2JfZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7CisJdW5zaWduZWQgZiA9IDA7CisJdW5zaWduZWQgaW50IG1hc2sgPSAoVVNfRkxfU0FORV9TRU5TRSB8IFVTX0ZMX0ZJWF9DQVBBQ0lUWSB8CisJCQlVU19GTF9DQVBBQ0lUWV9IRVVSSVNUSUNTIHwgVVNfRkxfSUdOT1JFX0RFVklDRSB8CisJCQlVU19GTF9OT1RfTE9DS0FCTEUgfCBVU19GTF9NQVhfU0VDVE9SU182NCB8CisJCQlVU19GTF9DQVBBQ0lUWV9PSyB8IFVTX0ZMX0lHTk9SRV9SRVNJRFVFIHwKKwkJCVVTX0ZMX1NJTkdMRV9MVU4gfCBVU19GTF9OT19XUF9ERVRFQ1QpOworCisJcCA9IHF1aXJrczsKKwl3aGlsZSAoKnApIHsKKwkJLyogRWFjaCBlbnRyeSBjb25zaXN0cyBvZiBWSUQ6UElEOmZsYWdzICovCisJCWlmICh2aWQgPT0gc2ltcGxlX3N0cnRvdWwocCwgJnAsIDE2KSAmJgorCQkJCSpwID09ICc6JyAmJgorCQkJCXBpZCA9PSBzaW1wbGVfc3RydG91bChwKzEsICZwLCAxNikgJiYKKwkJCQkqcCA9PSAnOicpCisJCQlicmVhazsKKworCQkvKiBNb3ZlIGZvcndhcmQgdG8gdGhlIG5leHQgZW50cnkgKi8KKwkJd2hpbGUgKCpwKSB7CisJCQlpZiAoKnArKyA9PSAnLCcpCisJCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKCEqcCkJLyogTm8gbWF0Y2ggKi8KKwkJcmV0dXJuOworCisJLyogQ29sbGVjdCB0aGUgZmxhZ3MgKi8KKwl3aGlsZSAoKisrcCAmJiAqcCAhPSAnLCcpIHsKKwkJc3dpdGNoIChUT0xPV0VSKCpwKSkgeworCQljYXNlICdhJzoKKwkJCWYgfD0gVVNfRkxfU0FORV9TRU5TRTsKKwkJCWJyZWFrOworCQljYXNlICdjJzoKKwkJCWYgfD0gVVNfRkxfRklYX0NBUEFDSVRZOworCQkJYnJlYWs7CisJCWNhc2UgJ2gnOgorCQkJZiB8PSBVU19GTF9DQVBBQ0lUWV9IRVVSSVNUSUNTOworCQkJYnJlYWs7CisJCWNhc2UgJ2knOgorCQkJZiB8PSBVU19GTF9JR05PUkVfREVWSUNFOworCQkJYnJlYWs7CisJCWNhc2UgJ2wnOgorCQkJZiB8PSBVU19GTF9OT1RfTE9DS0FCTEU7CisJCQlicmVhazsKKwkJY2FzZSAnbSc6CisJCQlmIHw9IFVTX0ZMX01BWF9TRUNUT1JTXzY0OworCQkJYnJlYWs7CisJCWNhc2UgJ28nOgorCQkJZiB8PSBVU19GTF9DQVBBQ0lUWV9PSzsKKwkJCWJyZWFrOworCQljYXNlICdyJzoKKwkJCWYgfD0gVVNfRkxfSUdOT1JFX1JFU0lEVUU7CisJCQlicmVhazsKKwkJY2FzZSAncyc6CisJCQlmIHw9IFVTX0ZMX1NJTkdMRV9MVU47CisJCQlicmVhazsKKwkJY2FzZSAndyc6CisJCQlmIHw9IFVTX0ZMX05PX1dQX0RFVEVDVDsKKwkJCWJyZWFrOworCQkvKiBJZ25vcmUgdW5yZWNvZ25pemVkIGZsYWcgY2hhcmFjdGVycyAqLworCQl9CisJfQorCXVzLT5mZmxhZ3MgPSAodXMtPmZmbGFncyAmIH5tYXNrKSB8IGY7CisJZGV2X2luZm8oJnVzLT5wdXNiX2ludGYtPmRldiwgIlF1aXJrcyBtYXRjaCBmb3IgIgorCQkJInZpZCAlMDR4IHBpZCAlMDR4OiAleFxuIiwKKwkJCXZpZCwgcGlkLCBmKTsKK30KKwogLyogRmluZCBhbiB1bnVzdWFsX2RldiBkZXNjcmlwdG9yIChhbHdheXMgc3VjY2VlZHMgaW4gdGhlIGN1cnJlbnQgY29kZSkgKi8KIHN0YXRpYyBzdHJ1Y3QgdXNfdW51c3VhbF9kZXYgKmZpbmRfdW51c3VhbChjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCiB7CkBAIC00OTcsNiArNTc1LDcgQEAKIAkJCWlkZXNjLT5iSW50ZXJmYWNlUHJvdG9jb2wgOgogCQkJdW51c3VhbF9kZXYtPnVzZVRyYW5zcG9ydDsKIAl1cy0+ZmZsYWdzID0gVVNCX1VTX09SSUdfRkxBR1MoaWQtPmRyaXZlcl9pbmZvKTsKKwlhZGp1c3RfcXVpcmtzKHVzKTsKIAogCWlmICh1cy0+ZmZsYWdzICYgVVNfRkxfSUdOT1JFX0RFVklDRSkgewogCQlwcmludGsoS0VSTl9JTkZPIFVTQl9TVE9SQUdFICJkZXZpY2UgaWdub3JlZFxuIik7CkBAIC01NjIsNyArNjQxLDcgQEAKIAogCWNhc2UgVVNfUFJfQ0JJOgogCQl1cy0+dHJhbnNwb3J0X25hbWUgPSAiQ29udHJvbC9CdWxrL0ludGVycnVwdCI7Ci0JCXVzLT50cmFuc3BvcnQgPSB1c2Jfc3Rvcl9DQklfdHJhbnNwb3J0OworCQl1cy0+dHJhbnNwb3J0ID0gdXNiX3N0b3JfQ0JfdHJhbnNwb3J0OwogCQl1cy0+dHJhbnNwb3J0X3Jlc2V0ID0gdXNiX3N0b3JfQ0JfcmVzZXQ7CiAJCXVzLT5tYXhfbHVuID0gNzsKIAkJYnJlYWs7CkBAIC02NzUsMTkgKzc1NCwxOSBAQAogCiAJY2FzZSBVU19TQ184MDIwOgogCQl1cy0+cHJvdG9jb2xfbmFtZSA9ICI4MDIwaSI7Ci0JCXVzLT5wcm90b19oYW5kbGVyID0gdXNiX3N0b3JfQVRBUElfY29tbWFuZDsKKwkJdXMtPnByb3RvX2hhbmRsZXIgPSB1c2Jfc3Rvcl9wYWQxMl9jb21tYW5kOwogCQl1cy0+bWF4X2x1biA9IDA7CiAJCWJyZWFrOwogCiAJY2FzZSBVU19TQ19RSUM6CiAJCXVzLT5wcm90b2NvbF9uYW1lID0gIlFJQy0xNTciOwotCQl1cy0+cHJvdG9faGFuZGxlciA9IHVzYl9zdG9yX3FpYzE1N19jb21tYW5kOworCQl1cy0+cHJvdG9faGFuZGxlciA9IHVzYl9zdG9yX3BhZDEyX2NvbW1hbmQ7CiAJCXVzLT5tYXhfbHVuID0gMDsKIAkJYnJlYWs7CiAKIAljYXNlIFVTX1NDXzgwNzA6CiAJCXVzLT5wcm90b2NvbF9uYW1lID0gIjgwNzBpIjsKLQkJdXMtPnByb3RvX2hhbmRsZXIgPSB1c2Jfc3Rvcl9BVEFQSV9jb21tYW5kOworCQl1cy0+cHJvdG9faGFuZGxlciA9IHVzYl9zdG9yX3BhZDEyX2NvbW1hbmQ7CiAJCXVzLT5tYXhfbHVuID0gMDsKIAkJYnJlYWs7CiAKQEAgLTg0MCw4ICs5MTksNiBAQAogewogCVVTX0RFQlVHUCgiLS0gJXNcbiIsIF9fZnVuY19fKTsKIAotCWtmcmVlKHVzLT5zZW5zZWJ1Zik7Ci0KIAkvKiBGcmVlIHRoZSBkZXZpY2UtcmVsYXRlZCBETUEtbWFwcGVkIGJ1ZmZlcnMgKi8KIAlpZiAodXMtPmNyKQogCQl1c2JfYnVmZmVyX2ZyZWUodXMtPnB1c2JfZGV2LCBzaXplb2YoKnVzLT5jciksIHVzLT5jciwKQEAgLTEwNjQsNiArMTE0MSw3IEBACiBzdGF0aWMgaW50IF9faW5pdCB1c2Jfc3Rvcl9pbml0KHZvaWQpCiB7CiAJaW50IHJldHZhbDsKKwogCXByaW50ayhLRVJOX0lORk8gIkluaXRpYWxpemluZyBVU0IgTWFzcyBTdG9yYWdlIGRyaXZlci4uLlxuIik7CiAKIAkvKiByZWdpc3RlciB0aGUgZHJpdmVyLCByZXR1cm4gdXNiX3JlZ2lzdGVyIHJldHVybiBjb2RlIGlmIGVycm9yICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5oIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuaAppbmRleCBhNGFkNzNiLi42NWU2NzRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5oCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmgKQEAgLTEzOCw3ICsxMzgsNiBAQAogCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QJKmNyOwkJIC8qIGNvbnRyb2wgcmVxdWVzdHMJICovCiAJc3RydWN0IHVzYl9zZ19yZXF1ZXN0CWN1cnJlbnRfc2c7CSAvKiBzY2F0dGVyLWdhdGhlciByZXEuICAqLwogCXVuc2lnbmVkIGNoYXIJCSppb2J1ZjsJCSAvKiBJL08gYnVmZmVyCQkgKi8KLQl1bnNpZ25lZCBjaGFyCQkqc2Vuc2VidWY7CSAvKiBzZW5zZSBkYXRhIGJ1ZmZlcgkgKi8KIAlkbWFfYWRkcl90CQljcl9kbWE7CQkgLyogYnVmZmVyIERNQSBhZGRyZXNzZXMgKi8KIAlkbWFfYWRkcl90CQlpb2J1Zl9kbWE7CiAJc3RydWN0IHRhc2tfc3RydWN0CSpjdGxfdGhyZWFkOwkgLyogdGhlIGNvbnRyb2wgdGhyZWFkICAgKi8KQEAgLTE1NSw2ICsxNTQsMTAgQEAKICNpZmRlZiBDT05GSUdfUE0KIAlwbV9ob29rCQkJc3VzcGVuZF9yZXN1bWVfaG9vazsKICNlbmRpZgorCisJLyogaGFja3MgZm9yIFJFQUQgQ0FQQUNJVFkgYnVnIGhhbmRsaW5nICovCisJaW50CQkJdXNlX2xhc3Rfc2VjdG9yX2hhY2tzOworCWludAkJCWxhc3Rfc2VjdG9yX3JldHJpZXM7CiB9OwogCiAvKiBDb252ZXJ0IGJldHdlZW4gdXNfZGF0YSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgU2NzaV9Ib3N0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi93dXNiY29yZS9yaC5jIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvcmguYwppbmRleCA5NWM2ZmEzLi4zOTM3YmY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi93dXNiY29yZS9yaC5jCisrKyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3JoLmMKQEAgLTMyNiw3ICszMjYsNyBAQAogc3RhdGljIGludCB3dXNiaGNfcmhfZ2V0X3BvcnRfc3RhdHVzKHN0cnVjdCB3dXNiaGMgKnd1c2JoYywgdTE2IHBvcnRfaWR4LAogCQkJCSAgICAgdTMyICpfYnVmLCB1MTYgd0xlbmd0aCkKIHsKLQl1MTYgKmJ1ZiA9ICh1MTYgKikgX2J1ZjsKKwlfX2xlMTYgKmJ1ZiA9IChfX2xlMTYgKilfYnVmOwogCiAJaWYgKHBvcnRfaWR4ID4gd3VzYmhjLT5wb3J0c19tYXgpCiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91d2IvaTE0ODAvZGZ1L3VzYi5jIGIvZHJpdmVycy91d2IvaTE0ODAvZGZ1L3VzYi5jCmluZGV4IDY4Njc5NWUuLmM3MDgwZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXdiL2kxNDgwL2RmdS91c2IuYworKysgYi9kcml2ZXJzL3V3Yi9pMTQ4MC9kZnUvdXNiLmMKQEAgLTM4Nyw3ICszODcsNyBAQAogCQlnb3RvIGVycm9yX2NyZWF0ZTsKIAl9CiAKLQkvKiBzZXR1cCB0aGUgZm9wcyBhbmQgdXBsb2FkIHRoZSBmaXJtYXJlICovCisJLyogc2V0dXAgdGhlIGZvcHMgYW5kIHVwbG9hZCB0aGUgZmlybXdhcmUgKi8KIAlpMTQ4MC0+cHJlX2Z3X25hbWUgPSAiaTE0ODAtcHJlLXBoeS0wLjAuYmluIjsKIAlpMTQ4MC0+bWFjX2Z3X25hbWUgPSAiaTE0ODAtdXNiLTAuMC5iaW4iOwogCWkxNDgwLT5tYWNfZndfbmFtZV9kZXByZWNhdGUgPSAicHRjLTAuMC5iaW4iOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91d2IvaTE0ODAvaTE0ODB1LXdscC9pMTQ4MHUtd2xwLmggYi9kcml2ZXJzL3V3Yi9pMTQ4MC9pMTQ4MHUtd2xwL2kxNDgwdS13bHAuaAppbmRleCA1ZjFiMjk1Li4zNDIxZDMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3V3Yi9pMTQ4MC9pMTQ4MHUtd2xwL2kxNDgwdS13bHAuaAorKysgYi9kcml2ZXJzL3V3Yi9pMTQ4MC9pMTQ4MHUtd2xwL2kxNDgwdS13bHAuaApAQCAtMjIxLDcgKzIyMSw2IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXY7CiAKIAlzcGlubG9ja190IGxvY2s7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CiAKIAkvKiBSWCBjb250ZXh0IGhhbmRsaW5nICovCiAJc3RydWN0IHNrX2J1ZmYgKnJ4X3NrYjsKQEAgLTI3MSw3ICsyNzAsNiBAQAogZXh0ZXJuIGludCBpMTQ4MHVfaGFyZF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICosIHN0cnVjdCBuZXRfZGV2aWNlICopOwogZXh0ZXJuIHZvaWQgaTE0ODB1X3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKik7CiBleHRlcm4gaW50IGkxNDgwdV9zZXRfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBpZm1hcCAqKTsKLWV4dGVybiBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaTE0ODB1X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsKIGV4dGVybiBpbnQgaTE0ODB1X2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50KTsKIGV4dGVybiB2b2lkIGkxNDgwdV91d2Jfbm90aWZzX2NiKHZvaWQgKiwgc3RydWN0IHV3Yl9kZXYgKiwgZW51bSB1d2Jfbm90aWZzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91d2IvaTE0ODAvaTE0ODB1LXdscC9sYy5jIGIvZHJpdmVycy91d2IvaTE0ODAvaTE0ODB1LXdscC9sYy5jCmluZGV4IDA0OWMwNWQuLmYyNzJkZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXdiL2kxNDgwL2kxNDgwdS13bHAvbGMuYworKysgYi9kcml2ZXJzL3V3Yi9pMTQ4MC9pMTQ4MHUtd2xwL2xjLmMKQEAgLTE4MSw2ICsxODEsMTUgQEAKIH0KICNlbmRpZgogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGkxNDgwdV9uZXRkZXZfb3BzID0geworCS5uZG9fb3Blbgk9IGkxNDgwdV9vcGVuLAorCS5uZG9fc3RvcCAJPSBpMTQ4MHVfc3RvcCwKKwkubmRvX3N0YXJ0X3htaXQgPSBpMTQ4MHVfaGFyZF9zdGFydF94bWl0LAorCS5uZG9fdHhfdGltZW91dCA9IGkxNDgwdV90eF90aW1lb3V0LAorCS5uZG9fc2V0X2NvbmZpZyA9IGkxNDgwdV9zZXRfY29uZmlnLAorCS5uZG9fY2hhbmdlX210dSA9IGkxNDgwdV9jaGFuZ2VfbXR1LAorfTsKKwogc3RhdGljCiBpbnQgaTE0ODB1X2FkZChzdHJ1Y3QgaTE0ODB1ICppMTQ4MHUsIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppZmFjZSkKIHsKQEAgLTIzNSwxMyArMjQ0LDcgQEAKIAluZXRfZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7CiAJbmV0X2Rldi0+d2F0Y2hkb2dfdGltZW8gPSA1KkhaOwkJLyogRklYTUU6IGEgYmV0dGVyIGRlZmF1bHQ/ICovCiAKLQluZXRfZGV2LT5vcGVuID0gaTE0ODB1X29wZW47Ci0JbmV0X2Rldi0+c3RvcCA9IGkxNDgwdV9zdG9wOwotCW5ldF9kZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGkxNDgwdV9oYXJkX3N0YXJ0X3htaXQ7Ci0JbmV0X2Rldi0+dHhfdGltZW91dCA9IGkxNDgwdV90eF90aW1lb3V0OwotCW5ldF9kZXYtPmdldF9zdGF0cyA9IGkxNDgwdV9nZXRfc3RhdHM7Ci0JbmV0X2Rldi0+c2V0X2NvbmZpZyA9IGkxNDgwdV9zZXRfY29uZmlnOwotCW5ldF9kZXYtPmNoYW5nZV9tdHUgPSBpMTQ4MHVfY2hhbmdlX210dTsKKwluZXRfZGV2LT5uZXRkZXZfb3BzID0gJmkxNDgwdV9uZXRkZXZfb3BzOwogCiAjaWZkZWYgaTE0ODB1X0ZMT1dfQ09OVFJPTAogCS8qIE5vdGlmaWNhdGlvbiBlbmRwb2ludCBzZXR1cCAoc3VibWl0dGVkIHdoZW4gd2Ugb3BlbiB0aGUgZGV2aWNlKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91d2IvaTE0ODAvaTE0ODB1LXdscC9uZXRkZXYuYyBiL2RyaXZlcnMvdXdiL2kxNDgwL2kxNDgwdS13bHAvbmV0ZGV2LmMKaW5kZXggZTM4NzNmZi4uNzMwNTU1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy91d2IvaTE0ODAvaTE0ODB1LXdscC9uZXRkZXYuYworKysgYi9kcml2ZXJzL3V3Yi9pMTQ4MC9pMTQ4MHUtd2xwL25ldGRldi5jCkBAIC0yNjIsMTUgKzI2Miw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLQotLyoqIFJlcG9ydCBzdGF0aXN0aWNzICovCi1zdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaTE0ODB1X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKLXsKLQlzdHJ1Y3QgaTE0ODB1ICppMTQ4MHUgPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKLQlyZXR1cm4gJmkxNDgwdS0+c3RhdHM7Ci19Ci0KLQogLyoqCiAgKgogICogQ2hhbmdlIHRoZSBpbnRlcmZhY2UgY29uZmlnLS13ZSBwcm9iYWJseSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91d2IvaTE0ODAvaTE0ODB1LXdscC9yeC5jIGIvZHJpdmVycy91d2IvaTE0ODAvaTE0ODB1LXdscC9yeC5jCmluZGV4IDM0ZjRjZjkuLjI1YTI3NTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXdiL2kxNDgwL2kxNDgwdS13bHAvcnguYworKysgYi9kcml2ZXJzL3V3Yi9pMTQ4MC9pMTQ4MHUtd2xwL3J4LmMKQEAgLTE2Nyw3ICsxNjcsNyBAQAogZG8gewkJCQkJCQlcCiAJaWYgKHByaW50a19yYXRlbGltaXQoKSkJCQkJXAogCQlkZXZfZXJyKCZpMTQ4MHUtPnVzYl9pZmFjZS0+ZGV2LCBtc2cpOwlcCi0JaTE0ODB1LT5zdGF0cy5yeF9kcm9wcGVkKys7CQkJXAorCWkxNDgwdS0+bmV0X2Rldi0+c3RhdHMucnhfZHJvcHBlZCsrOwkJCVwKIH0gd2hpbGUgKDApCiAKIApAQCAtMTkzLDEwICsxOTMsOCBAQAogCWlmICghc2hvdWxkX3BhcnNlKQogCQlnb3RvIG91dDsKIAlpMTQ4MHUtPnJ4X3NrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhpMTQ4MHUtPnJ4X3NrYiwgbmV0X2Rldik7Ci0JaTE0ODB1LT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0JaTE0ODB1LT5zdGF0cy5yeF9ieXRlcyArPSBpMTQ4MHUtPnJ4X3VudGRfcGt0X3NpemU7Ci0JbmV0X2Rldi0+bGFzdF9yeCA9IGppZmZpZXM7Ci0JLyogRklYTUU6IGZsb3cgY29udHJvbDogY2hlY2sgbmV0aWZfcngoKSByZXR2YWwgKi8KKwluZXRfZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJbmV0X2Rldi0+c3RhdHMucnhfYnl0ZXMgKz0gaTE0ODB1LT5yeF91bnRkX3BrdF9zaXplOwogCiAJbmV0aWZfcngoaTE0ODB1LT5yeF9za2IpOwkJLyogZGVsaXZlciAqLwogb3V0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91d2IvaTE0ODAvaTE0ODB1LXdscC90eC5jIGIvZHJpdmVycy91d2IvaTE0ODAvaTE0ODB1LXdscC90eC5jCmluZGV4IDM5MDMyY2MuLjI2YmFjYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXdiL2kxNDgwL2kxNDgwdS13bHAvdHguYworKysgYi9kcml2ZXJzL3V3Yi9pMTQ4MC9pMTQ4MHUtd2xwL3R4LmMKQEAgLTExNyw4ICsxMTcsOCBAQAogCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKIAljYXNlIDA6CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZpMTQ4MHUtPmxvY2ssIGZsYWdzKTsKLQkJaTE0ODB1LT5zdGF0cy50eF9wYWNrZXRzKys7Ci0JCWkxNDgwdS0+c3RhdHMudHhfYnl0ZXMgKz0gdXJiLT5hY3R1YWxfbGVuZ3RoOworCQluZXRfZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJCW5ldF9kZXYtPnN0YXRzLnR4X2J5dGVzICs9IHVyYi0+YWN0dWFsX2xlbmd0aDsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTE0ODB1LT5sb2NrLCBmbGFncyk7CiAJCWJyZWFrOwogCWNhc2UgLUVDT05OUkVTRVQ6CS8qIE5vdCBhbiBlcnJvciwgYnV0IGEgY29udHJvbGxlZCBzaXR1YXRpb247ICovCkBAIC01MzAsNyArNTMwLDcgQEAKIAlyZXR1cm4gTkVUREVWX1RYX09LOwogZXJyb3I6CiAJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLQlpMTQ4MHUtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwluZXRfZGV2LT5zdGF0cy50eF9kcm9wcGVkKys7CiBvdXQ6CiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYW1iYS1jbGNkLmMgYi9kcml2ZXJzL3ZpZGVvL2FtYmEtY2xjZC5jCmluZGV4IDJhYzUyZmQuLjRlMDQ2ZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYW1iYS1jbGNkLmMKKysrIGIvZHJpdmVycy92aWRlby9hbWJhLWNsY2QuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CiAjaW5jbHVkZSA8bGludXgvYW1iYS9jbGNkLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgogCiAjaW5jbHVkZSA8YXNtL3NpemVzLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXR5L2F0eTEyOGZiLmMgYi9kcml2ZXJzL3ZpZGVvL2F0eS9hdHkxMjhmYi5jCmluZGV4IDI0M2VhNGEuLmRiMTYxMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXR5L2F0eTEyOGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9hdHkvYXR5MTI4ZmIuYwpAQCAtMjA1MSw3ICsyMDUxLDcgQEAKIAogCS8qIFZpcnR1YWxpemUgbW1pbyByZWdpb24gKi8KIAlpbmZvLT5maXgubW1pb19zdGFydCA9IHJlZ19hZGRyOwotCXBhci0+cmVnYmFzZSA9IGlvcmVtYXAocmVnX2FkZHIsIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMikpOworCXBhci0+cmVnYmFzZSA9IHBjaV9pb3JlbWFwX2JhcihwZGV2LCAyKTsKIAlpZiAoIXBhci0+cmVnYmFzZSkKIAkJZ290byBlcnJfZnJlZV9pbmZvOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9iYWNrbGlnaHQuYyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2JhY2tsaWdodC5jCmluZGV4IGZhYjBiYzguLjA2NjRmYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2JhY2tsaWdodC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2JhY2tsaWdodC5jCkBAIC0yMTcsNyArMjE3LDcgQEAKIAluZXdfYmQtPmRldi5jbGFzcyA9IGJhY2tsaWdodF9jbGFzczsKIAluZXdfYmQtPmRldi5wYXJlbnQgPSBwYXJlbnQ7CiAJbmV3X2JkLT5kZXYucmVsZWFzZSA9IGJsX2RldmljZV9yZWxlYXNlOwotCXN0cmxjcHkobmV3X2JkLT5kZXYuYnVzX2lkLCBuYW1lLCBCVVNfSURfU0laRSk7CisJZGV2X3NldF9uYW1lKCZuZXdfYmQtPmRldiwgbmFtZSk7CiAJZGV2X3NldF9kcnZkYXRhKCZuZXdfYmQtPmRldiwgZGV2ZGF0YSk7CiAKIAlyYyA9IGRldmljZV9yZWdpc3RlcigmbmV3X2JkLT5kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbGNkLmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9sY2QuYwppbmRleCA2ODBlNTdiLi5iNjQ0OTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9sY2QuYworKysgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9sY2QuYwpAQCAtMjA4LDcgKzIwOCw3IEBACiAJbmV3X2xkLT5kZXYuY2xhc3MgPSBsY2RfY2xhc3M7CiAJbmV3X2xkLT5kZXYucGFyZW50ID0gcGFyZW50OwogCW5ld19sZC0+ZGV2LnJlbGVhc2UgPSBsY2RfZGV2aWNlX3JlbGVhc2U7Ci0Jc3RybGNweShuZXdfbGQtPmRldi5idXNfaWQsIG5hbWUsIEJVU19JRF9TSVpFKTsKKwlkZXZfc2V0X25hbWUoJm5ld19sZC0+ZGV2LCBuYW1lKTsKIAlkZXZfc2V0X2RydmRhdGEoJm5ld19sZC0+ZGV2LCBkZXZkYXRhKTsKIAogCXJjID0gZGV2aWNlX3JlZ2lzdGVyKCZuZXdfbGQtPmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JmaW4tdDM1MG1jcWItZmIuYyBiL2RyaXZlcnMvdmlkZW8vYmZpbi10MzUwbWNxYi1mYi5jCmluZGV4IDdkMWI4MTkuLmE5YjNhZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYmZpbi10MzUwbWNxYi1mYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYmZpbi10MzUwbWNxYi1mYi5jCkBAIC0yNTUsNyArMjU1LDcgQEAKIHsKIAogCWlmICh2YXItPmJpdHNfcGVyX3BpeGVsICE9IExDRF9CUFApIHsKLQkJcHJfZGVidWcoIiVzOiBkZXB0aCBub3Qgc3VwcG9ydGVkOiAldSBCUFBcbiIsIF9fRlVOQ1RJT05fXywKKwkJcHJfZGVidWcoIiVzOiBkZXB0aCBub3Qgc3VwcG9ydGVkOiAldSBCUFBcbiIsIF9fZnVuY19fLAogCQkJIHZhci0+Yml0c19wZXJfcGl4ZWwpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0yNjQsNyArMjY0LDcgQEAKIAkgICAgaW5mby0+dmFyLnhyZXNfdmlydHVhbCAhPSB2YXItPnhyZXNfdmlydHVhbCB8fAogCSAgICBpbmZvLT52YXIueXJlc192aXJ0dWFsICE9IHZhci0+eXJlc192aXJ0dWFsKSB7CiAJCXByX2RlYnVnKCIlczogUmVzb2x1dGlvbiBub3Qgc3VwcG9ydGVkOiBYJXUgeCBZJXUgXG4iLAotCQkJIF9fRlVOQ1RJT05fXywgdmFyLT54cmVzLCB2YXItPnlyZXMpOworCQkJIF9fZnVuY19fLCB2YXItPnhyZXMsIHZhci0+eXJlcyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjc0LDcgKzI3NCw3IEBACiAKIAlpZiAoKGluZm8tPmZpeC5saW5lX2xlbmd0aCAqIHZhci0+eXJlc192aXJ0dWFsKSA+IGluZm8tPmZpeC5zbWVtX2xlbikgewogCQlwcl9kZWJ1ZygiJXM6IE1lbW9yeSBMaW1pdCByZXF1ZXN0ZWQgeXJlc192aXJ0dWFsID0gJXVcbiIsCi0JCQkgX19GVU5DVElPTl9fLCB2YXItPnlyZXNfdmlydHVhbCk7CisJCQkgX19mdW5jX18sIHZhci0+eXJlc192aXJ0dWFsKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2Nhcm1pbmVmYi5jIGIvZHJpdmVycy92aWRlby9jYXJtaW5lZmIuYwppbmRleCBjOWIxOTEzLi5jN2ZmM2MxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2Nhcm1pbmVmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY2FybWluZWZiLmMKQEAgLTE2OCw3ICsxNjgsNyBAQAogCWJsdWUgPj49IDg7CiAJdHJhbnNwID4+PSA4OwogCi0JKCh1MzIgKilpbmZvLT5wc2V1ZG9fcGFsZXR0ZSlbcmVnbm9dID0gYmUzMl90b19jcHUodHJhbnNwIDw8IDI0IHwKKwkoKF9fYmUzMiAqKWluZm8tPnBzZXVkb19wYWxldHRlKVtyZWdub10gPSBjcHVfdG9fYmUzMih0cmFuc3AgPDwgMjQgfAogCQlyZWQgPDwgMCB8IGdyZWVuIDw8IDggfCBibHVlIDw8IDE2KTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS92Z2Fjb24uYyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS92Z2Fjb24uYwppbmRleCBlNjIxMDcyLi5kMDEyZWRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvdmdhY29uLmMKKysrIGIvZHJpdmVycy92aWRlby9jb25zb2xlL3ZnYWNvbi5jCkBAIC0xMzMyLDcgKzEzMzIsNyBAQAogCQljLT52Y195ID0gc2NyZWVuX2luZm8ub3JpZ195OwogCX0KIAotCS8qIFdlIGNhbid0IGNvcHkgaW4gbW9yZSB0aGVuIHRoZSBzaXplIG9mIHRoZSB2aWRlbyBidWZmZXIsCisJLyogV2UgY2FuJ3QgY29weSBpbiBtb3JlIHRoYW4gdGhlIHNpemUgb2YgdGhlIHZpZGVvIGJ1ZmZlciwKIAkgKiBvciB3ZSdsbCBiZSBjb3B5aW5nIGluIFZHQSBCSU9TICovCiAKIAlpZiAoIXZnYV9pc19nZngpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2N5YmVyMjAwMGZiLmMgYi9kcml2ZXJzL3ZpZGVvL2N5YmVyMjAwMGZiLmMKaW5kZXggMzlkNWQ2NC4uN2E5ZTQyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jeWJlcjIwMDBmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY3liZXIyMDAwZmIuYwpAQCAtMTU4Myw4ICsxNTgzLDcgQEAKIAkJZ290byBmYWlsZWRfcmVsZWFzZTsKIAogCWNmYi0+ZGV2ID0gZGV2OwotCWNmYi0+cmVnaW9uID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKSwKLQkJCSAgICAgIHBjaV9yZXNvdXJjZV9sZW4oZGV2LCAwKSk7CisJY2ZiLT5yZWdpb24gPSBwY2lfaW9yZW1hcF9iYXIoZGV2LCAwKTsKIAlpZiAoIWNmYi0+cmVnaW9uKQogCQlnb3RvIGZhaWxlZF9pb3JlbWFwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2ZibWVtLmMgYi9kcml2ZXJzL3ZpZGVvL2ZibWVtLmMKaW5kZXggM2M2NWIwZC4uNzU2ZWZlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9mYm1lbS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vZmJtZW0uYwpAQCAtNTEwLDYgKzUxMCwxMCBAQAogCQlmYl9sb2dvX2V4X251bSA9IDA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZmJfbG9nb19leF9udW07IGkrKykgeworCQlpZiAoZmJfbG9nb19leFtpXS5sb2dvLT50eXBlICE9IGZiX2xvZ28ubG9nby0+dHlwZSkgeworCQkJZmJfbG9nb19leFtpXS5sb2dvID0gTlVMTDsKKwkJCWNvbnRpbnVlOworCQl9CiAJCWhlaWdodCArPSBmYl9sb2dvX2V4W2ldLmxvZ28tPmhlaWdodDsKIAkJaWYgKGhlaWdodCA+IHlyZXMpIHsKIAkJCWhlaWdodCAtPSBmYl9sb2dvX2V4W2ldLmxvZ28tPmhlaWdodDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZ2JlZmIuYyBiL2RyaXZlcnMvdmlkZW8vZ2JlZmIuYwppbmRleCBmODljM2NjLi5mZTViNTE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2diZWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9nYmVmYi5jCkBAIC05MTIsNiArOTEyLDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgbGluZV9sZW5ndGg7CiAJc3RydWN0IGdiZV90aW1pbmdfaW5mbyB0aW1pbmc7CisJaW50IHJldDsKIAogCS8qIExpbWl0IGJwcCB0byA4LCAxNiwgYW5kIDMyICovCiAJaWYgKHZhci0+Yml0c19wZXJfcGl4ZWwgPD0gOCkKQEAgLTkzMCw4ICs5MzEsMTAgQEAKIAogCXZhci0+Z3JheXNjYWxlID0gMDsJLyogTm8gZ3JheXNjYWxlIGZvciBub3cgKi8KIAotCWlmICgodmFyLT5waXhjbG9jayA9IGNvbXB1dGVfZ2JlX3RpbWluZyh2YXIsICZ0aW1pbmcpKSA8IDApCi0JCXJldHVybigtRUlOVkFMKTsKKwlyZXQgPSBjb21wdXRlX2diZV90aW1pbmcodmFyLCAmdGltaW5nKTsKKwl2YXItPnBpeGNsb2NrID0gcmV0OworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIEFkanVzdCB2aXJ0dWFsIHJlc29sdXRpb24sIGlmIG5lY2Vzc2FyeSAqLwogCWlmICh2YXItPnhyZXMgPiB2YXItPnhyZXNfdmlydHVhbCB8fCAoIXl3cmFwICYmICF5cGFuKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZ2VvZGUvZ3gxZmJfY29yZS5jIGIvZHJpdmVycy92aWRlby9nZW9kZS9neDFmYl9jb3JlLmMKaW5kZXggYmIyMGEyMi4uNzUxZTQ5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9nZW9kZS9neDFmYl9jb3JlLmMKKysrIGIvZHJpdmVycy92aWRlby9nZW9kZS9neDFmYl9jb3JlLmMKQEAgLTIxNyw4ICsyMTcsNyBAQAogCXJldCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbihkZXYsIDAsICJneDFmYiAodmlkZW8pIik7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7Ci0JcGFyLT52aWRfcmVncyA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMCksCi0JCQkJcGNpX3Jlc291cmNlX2xlbihkZXYsIDApKTsKKwlwYXItPnZpZF9yZWdzID0gcGNpX2lvcmVtYXBfYmFyKGRldiwgMCk7CiAJaWYgKCFwYXItPnZpZF9yZWdzKQogCQlyZXR1cm4gLUVOT01FTTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9nZW9kZS9neGZiX2NvcmUuYyBiL2RyaXZlcnMvdmlkZW8vZ2VvZGUvZ3hmYl9jb3JlLmMKaW5kZXggZGUyYjhmOS4uNDg0MTE4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9nZW9kZS9neGZiX2NvcmUuYworKysgYi9kcml2ZXJzL3ZpZGVvL2dlb2RlL2d4ZmJfY29yZS5jCkBAIC0yNDIsMjMgKzI0MiwyMSBAQAogCXJldCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbihkZXYsIDMsICJneGZiICh2aWRlbyBwcm9jZXNzb3IpIik7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7Ci0JcGFyLT52aWRfcmVncyA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMyksCi0JCQkJcGNpX3Jlc291cmNlX2xlbihkZXYsIDMpKTsKKwlwYXItPnZpZF9yZWdzID0gcGNpX2lvcmVtYXBfYmFyKGRldiwgMyk7CiAJaWYgKCFwYXItPnZpZF9yZWdzKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCXJldCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbihkZXYsIDIsICJneGZiIChkaXNwbGF5IGNvbnRyb2xsZXIpIik7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7Ci0JcGFyLT5kY19yZWdzID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAyKSwgcGNpX3Jlc291cmNlX2xlbihkZXYsIDIpKTsKKwlwYXItPmRjX3JlZ3MgPSBwY2lfaW9yZW1hcF9iYXIoZGV2LCAyKTsKIAlpZiAoIXBhci0+ZGNfcmVncykKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlyZXQgPSBwY2lfcmVxdWVzdF9yZWdpb24oZGV2LCAxLCAiZ3hmYiAoZ3JhcGhpY3MgcHJvY2Vzc29yKSIpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwotCXBhci0+Z3BfcmVncyA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMSksCi0JcGNpX3Jlc291cmNlX2xlbihkZXYsIDEpKTsKKwlwYXItPmdwX3JlZ3MgPSBwY2lfaW9yZW1hcF9iYXIoZGV2LCAxKTsKIAogCWlmICghcGFyLT5ncF9yZWdzKQogCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZ2VvZGUvbHhmYl9jb3JlLmMgYi9kcml2ZXJzL3ZpZGVvL2dlb2RlL2x4ZmJfY29yZS5jCmluZGV4IDJjZDliNzQuLmI5NjVlY2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZ2VvZGUvbHhmYl9jb3JlLmMKKysrIGIvZHJpdmVycy92aWRlby9nZW9kZS9seGZiX2NvcmUuYwpAQCAtMzc5LDIwICszNzksMTcgQEAKIAlpZiAoaW5mby0+c2NyZWVuX2Jhc2UgPT0gTlVMTCkKIAkJcmV0dXJuIHJldDsKIAotCXBhci0+Z3BfcmVncyA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMSksCi0JCQkJcGNpX3Jlc291cmNlX2xlbihkZXYsIDEpKTsKKwlwYXItPmdwX3JlZ3MgPSBwY2lfaW9yZW1hcF9iYXIoZGV2LCAxKTsKIAogCWlmIChwYXItPmdwX3JlZ3MgPT0gTlVMTCkKIAkJcmV0dXJuIHJldDsKIAotCXBhci0+ZGNfcmVncyA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMiksCi0JCQkgICAgICAgcGNpX3Jlc291cmNlX2xlbihkZXYsIDIpKTsKKwlwYXItPmRjX3JlZ3MgPSBwY2lfaW9yZW1hcF9iYXIoZGV2LCAyKTsKIAogCWlmIChwYXItPmRjX3JlZ3MgPT0gTlVMTCkKIAkJcmV0dXJuIHJldDsKIAotCXBhci0+dnBfcmVncyA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMyksCi0JCQkgICAgICAgcGNpX3Jlc291cmNlX2xlbihkZXYsIDMpKTsKKwlwYXItPnZwX3JlZ3MgPSBwY2lfaW9yZW1hcF9iYXIoZGV2LCAzKTsKIAogCWlmIChwYXItPnZwX3JlZ3MgPT0gTlVMTCkKIAkJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZ3h0NDUwMC5jIGIvZHJpdmVycy92aWRlby9neHQ0NTAwLmMKaW5kZXggNTY0NTU3Ny4uODk2ZTUzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9neHQ0NTAwLmMKKysrIGIvZHJpdmVycy92aWRlby9neHQ0NTAwLmMKQEAgLTY0OCw3ICs2NDgsNyBAQAogCWluZm8tPnBzZXVkb19wYWxldHRlID0gcGFyLT5wc2V1ZG9fcGFsZXR0ZTsKIAogCWluZm8tPmZpeC5tbWlvX3N0YXJ0ID0gcmVnX3BoeXM7Ci0JcGFyLT5yZWdzID0gaW9yZW1hcChyZWdfcGh5cywgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSk7CisJcGFyLT5yZWdzID0gcGNpX2lvcmVtYXBfYmFyKHBkZXYsIDApOwogCWlmICghcGFyLT5yZWdzKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImd4dDQ1MDA6IGNhbm5vdCBtYXAgcmVnaXN0ZXJzXG4iKTsKIAkJZ290byBlcnJfZnJlZV9hbGw7CkBAIC02NTYsNyArNjU2LDcgQEAKIAogCWluZm8tPmZpeC5zbWVtX3N0YXJ0ID0gZmJfcGh5czsKIAlpbmZvLT5maXguc21lbV9sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDEpOwotCWluZm8tPnNjcmVlbl9iYXNlID0gaW9yZW1hcChmYl9waHlzLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDEpKTsKKwlpbmZvLT5zY3JlZW5fYmFzZSA9IHBjaV9pb3JlbWFwX2JhcihwZGV2LCAxKTsKIAlpZiAoIWluZm8tPnNjcmVlbl9iYXNlKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImd4dDQ1MDA6IGNhbm5vdCBtYXAgZnJhbWVidWZmZXJcbiIpOwogCQlnb3RvIGVycl91bm1hcF9yZWdzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9pODEwL2k4MTBfYWNjZWwuYyBiL2RyaXZlcnMvdmlkZW8vaTgxMC9pODEwX2FjY2VsLmMKaW5kZXggNzY3NjRlYS4uZjViZWRlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9pODEwL2k4MTBfYWNjZWwuYworKysgYi9kcml2ZXJzL3ZpZGVvL2k4MTAvaTgxMF9hY2NlbC5jCkBAIC0zMDEsOCArMzAxLDEwIEBACiAJdTMyIGR4LCBkeSwgd2lkdGgsIGhlaWdodCwgZGVzdCwgcm9wID0gMCwgY29sb3IgPSAwOwogCiAJaWYgKCFpbmZvLT52YXIuYWNjZWxfZmxhZ3MgfHwgcGFyLT5kZXZfZmxhZ3MgJiBMT0NLVVAgfHwKLQkgICAgcGFyLT5kZXB0aCA9PSA0KSAKLQkJcmV0dXJuIGNmYl9maWxscmVjdChpbmZvLCByZWN0KTsKKwkgICAgcGFyLT5kZXB0aCA9PSA0KSB7CisJCWNmYl9maWxscmVjdChpbmZvLCByZWN0KTsKKwkJcmV0dXJuOworCX0KIAogCWlmIChwYXItPmRlcHRoID09IDEpIAogCQljb2xvciA9IHJlY3QtPmNvbG9yOwpAQCAtMzI3LDggKzMyOSwxMCBAQAogCXUzMiBzeCwgc3ksIGR4LCBkeSwgcGl0Y2gsIHdpZHRoLCBoZWlnaHQsIHNyYywgZGVzdCwgeGRpcjsKIAogCWlmICghaW5mby0+dmFyLmFjY2VsX2ZsYWdzIHx8IHBhci0+ZGV2X2ZsYWdzICYgTE9DS1VQIHx8Ci0JICAgIHBhci0+ZGVwdGggPT0gNCkKLQkJcmV0dXJuIGNmYl9jb3B5YXJlYShpbmZvLCByZWdpb24pOworCSAgICBwYXItPmRlcHRoID09IDQpIHsKKwkJY2ZiX2NvcHlhcmVhKGluZm8sIHJlZ2lvbik7CisJCXJldHVybjsKKwl9CiAKIAlkeCA9IHJlZ2lvbi0+ZHggKiBwYXItPmRlcHRoOwogCXN4ID0gcmVnaW9uLT5zeCAqIHBhci0+ZGVwdGg7CkBAIC0zNjYsOCArMzcwLDEwIEBACiAJdTMyIGZnID0gMCwgYmcgPSAwLCBzaXplLCBkc3Q7CiAJCiAJaWYgKCFpbmZvLT52YXIuYWNjZWxfZmxhZ3MgfHwgcGFyLT5kZXZfZmxhZ3MgJiBMT0NLVVAgfHwKLQkgICAgcGFyLT5kZXB0aCA9PSA0IHx8IGltYWdlLT5kZXB0aCAhPSAxKSAKLQkJcmV0dXJuIGNmYl9pbWFnZWJsaXQoaW5mbywgaW1hZ2UpOworCSAgICBwYXItPmRlcHRoID09IDQgfHwgaW1hZ2UtPmRlcHRoICE9IDEpIHsKKwkJY2ZiX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7CisJCXJldHVybjsKKwl9CiAKIAlzd2l0Y2ggKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCkgewogCWNhc2UgODoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vaW50ZWxmYi9pbnRlbGZiZHJ2LmMgYi9kcml2ZXJzL3ZpZGVvL2ludGVsZmIvaW50ZWxmYmRydi5jCmluZGV4IGEwOWUyMzYuLjZkOGU1NDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vaW50ZWxmYi9pbnRlbGZiZHJ2LmMKKysrIGIvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmJkcnYuYwpAQCAtMTQ5Myw4ICsxNDkzLDEwIEBACiAJREJHX01TRygiaW50ZWxmYl9maWxscmVjdFxuIik7CiAjZW5kaWYKIAotCWlmICghQUNDRUwoZGluZm8sIGluZm8pIHx8IGRpbmZvLT5kZXB0aCA9PSA0KQotCQlyZXR1cm4gY2ZiX2ZpbGxyZWN0KGluZm8sIHJlY3QpOworCWlmICghQUNDRUwoZGluZm8sIGluZm8pIHx8IGRpbmZvLT5kZXB0aCA9PSA0KSB7CisJCWNmYl9maWxscmVjdChpbmZvLCByZWN0KTsKKwkJcmV0dXJuOworCX0KIAogCWlmIChyZWN0LT5yb3AgPT0gUk9QX0NPUFkpCiAJCXJvcCA9IFBBVF9ST1BfR1hDT1BZOwpAQCAtMTUyMSw4ICsxNTIzLDEwIEBACiAJREJHX01TRygiaW50ZWxmYl9jb3B5YXJlYVxuIik7CiAjZW5kaWYKIAotCWlmICghQUNDRUwoZGluZm8sIGluZm8pIHx8IGRpbmZvLT5kZXB0aCA9PSA0KQotCQlyZXR1cm4gY2ZiX2NvcHlhcmVhKGluZm8sIHJlZ2lvbik7CisJaWYgKCFBQ0NFTChkaW5mbywgaW5mbykgfHwgZGluZm8tPmRlcHRoID09IDQpIHsKKwkJY2ZiX2NvcHlhcmVhKGluZm8sIHJlZ2lvbik7CisJCXJldHVybjsKKwl9CiAKIAlpbnRlbGZiaHdfZG9fYml0Ymx0KGRpbmZvLCByZWdpb24tPnN4LCByZWdpb24tPnN5LCByZWdpb24tPmR4LAogCQkJICAgIHJlZ2lvbi0+ZHksIHJlZ2lvbi0+d2lkdGgsIHJlZ2lvbi0+aGVpZ2h0LApAQCAtMTU0MCw4ICsxNTQ0LDEwIEBACiAjZW5kaWYKIAogCWlmICghQUNDRUwoZGluZm8sIGluZm8pIHx8IGRpbmZvLT5kZXB0aCA9PSA0Ci0JICAgIHx8IGltYWdlLT5kZXB0aCAhPSAxKQotCQlyZXR1cm4gY2ZiX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7CisJICAgIHx8IGltYWdlLT5kZXB0aCAhPSAxKSB7CisJCWNmYl9pbWFnZWJsaXQoaW5mbywgaW1hZ2UpOworCQlyZXR1cm47CisJfQogCiAJaWYgKGRpbmZvLT5kZXB0aCAhPSA4KSB7CiAJCWZnY29sb3IgPSBkaW5mby0+cHNldWRvX3BhbGV0dGVbaW1hZ2UtPmZnX2NvbG9yXTsKQEAgLTE1NTQsOCArMTU2MCwxMCBAQAogCWlmICghaW50ZWxmYmh3X2RvX2RyYXdnbHlwaChkaW5mbywgZmdjb2xvciwgYmdjb2xvciwgaW1hZ2UtPndpZHRoLAogCQkJCSAgICBpbWFnZS0+aGVpZ2h0LCBpbWFnZS0+ZGF0YSwKIAkJCQkgICAgaW1hZ2UtPmR4LCBpbWFnZS0+ZHksCi0JCQkJICAgIGRpbmZvLT5waXRjaCwgaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSkKLQkJcmV0dXJuIGNmYl9pbWFnZWJsaXQoaW5mbywgaW1hZ2UpOworCQkJCSAgICBkaW5mby0+cGl0Y2gsIGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCkpIHsKKwkJY2ZiX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7CisJCXJldHVybjsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgaW50ZWxmYl9jdXJzb3Ioc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBmYl9jdXJzb3IgKmN1cnNvcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbW9kZWRiLmMgYi9kcml2ZXJzL3ZpZGVvL21vZGVkYi5jCmluZGV4IGQzYzNhZjUuLjE2MTg2MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbW9kZWRiLmMKKysrIGIvZHJpdmVycy92aWRlby9tb2RlZGIuYwpAQCAtMzI5LDcgKzMyOSw3IEBACiAJICBGQl9TWU5DX0hPUl9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKIAkgIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQsIEZCX01PREVfSVNfVkVTQSB9LAogCS8qIDE3IDExNTJ4ODY0LTc1IFZFU0EgKi8KLQl7IE5VTEwsIDc1LCAxMTUzLCA4NjQsIDkyNTksIDI1NiwgNjQsIDMyLCAxLCAxMjgsIDMsCisJeyBOVUxMLCA3NSwgMTE1MiwgODY0LCA5MjU5LCAyNTYsIDY0LCAzMiwgMSwgMTI4LCAzLAogCSAgRkJfU1lOQ19IT1JfSElHSF9BQ1QgfCBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCiAJICBGQl9WTU9ERV9OT05JTlRFUkxBQ0VELCBGQl9NT0RFX0lTX1ZFU0EgfSwKIAkvKiAxOCAxMjgweDk2MC02MCBWRVNBICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL25lb2ZiLmMgYi9kcml2ZXJzL3ZpZGVvL25lb2ZiLmMKaW5kZXggYmZiODAyZC4uNTg4NTI3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9uZW9mYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbmVvZmIuYwpAQCAtMTQ1Myw3ICsxNDUzLDggQEAKIAkJCSAqIGlzIGxlc3MgdGhhbiAxNiBiaXRzIHdpZGUuIFRoaXMgaXMgZHVlIHRvIGluc3VmZmljaWVudAogCQkJICogcGFkZGluZyB3aGVuIHdyaXRpbmcgdGhlIGltYWdlLiBXZSBuZWVkIHRvIGFkanVzdAogCQkJICogc3RydWN0IGZiX3BpeG1hcC4gTm90IHlldCBkb25lLiAqLwotCQkJcmV0dXJuIGNmYl9pbWFnZWJsaXQoaW5mbywgaW1hZ2UpOworCQkJY2ZiX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7CisJCQlyZXR1cm47CiAJCX0KIAkJYmx0Q250bF9mbGFncyA9IE5FT19CQzBfU1JDX01PTk87CiAJfSBlbHNlIGlmIChpbWFnZS0+ZGVwdGggPT0gaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSB7CkBAIC0xNDYxLDcgKzE0NjIsOCBAQAogCX0gZWxzZSB7CiAJCS8qIFdlIGRvbid0IGN1cnJlbnRseSBzdXBwb3J0IGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpZiBpbWFnZQogCQkgKiBkZXB0aCBpcyBkaWZmZXJlbnQgZnJvbSBkaXNwbGF5ICovCi0JCXJldHVybiBjZmJfaW1hZ2VibGl0KGluZm8sIGltYWdlKTsKKwkJY2ZiX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7CisJCXJldHVybjsKIAl9CiAKIAlzd2l0Y2ggKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZfYWNjZWwuYyBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X2FjY2VsLmMKaW5kZXggZmE0ODIxYy4uYWQ2NDcyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZfYWNjZWwuYworKysgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9hY2NlbC5jCkBAIC0zMDAsOCArMzAwLDEwIEBACiAJaWYgKGluZm8tPnN0YXRlICE9IEZCSU5GT19TVEFURV9SVU5OSU5HKQogCQlyZXR1cm47CiAKLQlpZiAocGFyLT5sb2NrdXApCi0JCXJldHVybiBjZmJfY29weWFyZWEoaW5mbywgcmVnaW9uKTsKKwlpZiAocGFyLT5sb2NrdXApIHsKKwkJY2ZiX2NvcHlhcmVhKGluZm8sIHJlZ2lvbik7CisJCXJldHVybjsKKwl9CiAKIAlOVkRtYVN0YXJ0KGluZm8sIHBhciwgQkxJVF9QT0lOVF9TUkMsIDMpOwogCU5WRG1hTmV4dChwYXIsIChyZWdpb24tPnN5IDw8IDE2KSB8IHJlZ2lvbi0+c3gpOwpAQCAtMzE5LDggKzMyMSwxMCBAQAogCWlmIChpbmZvLT5zdGF0ZSAhPSBGQklORk9fU1RBVEVfUlVOTklORykKIAkJcmV0dXJuOwogCi0JaWYgKHBhci0+bG9ja3VwKQotCQlyZXR1cm4gY2ZiX2ZpbGxyZWN0KGluZm8sIHJlY3QpOworCWlmIChwYXItPmxvY2t1cCkgeworCQljZmJfZmlsbHJlY3QoaW5mbywgcmVjdCk7CisJCXJldHVybjsKKwl9CiAKIAlpZiAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsID09IDgpCiAJCWNvbG9yID0gcmVjdC0+Y29sb3I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL291dHB1dC5jIGIvZHJpdmVycy92aWRlby9vdXRwdXQuYwppbmRleCBmMmRmNTUxLi41ZTY0MzlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL291dHB1dC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb3V0cHV0LmMKQEAgLTk2LDcgKzk2LDcgQEAKIAluZXdfZGV2LT5wcm9wcyA9IG9wOwogCW5ld19kZXYtPmRldi5jbGFzcyA9ICZ2aWRlb19vdXRwdXRfY2xhc3M7CiAJbmV3X2Rldi0+ZGV2LnBhcmVudCA9IGRldjsKLQlzdHJsY3B5KG5ld19kZXYtPmRldi5idXNfaWQsbmFtZSwgQlVTX0lEX1NJWkUpOworCWRldl9zZXRfbmFtZSgmbmV3X2Rldi0+ZGV2LCBuYW1lKTsKIAlkZXZfc2V0X2RydmRhdGEoJm5ld19kZXYtPmRldiwgZGV2ZGF0YSk7CiAJcmV0X2NvZGUgPSBkZXZpY2VfcmVnaXN0ZXIoJm5ld19kZXYtPmRldik7CiAJaWYgKHJldF9jb2RlKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3BtM2ZiLmMgYi9kcml2ZXJzL3ZpZGVvL3BtM2ZiLmMKaW5kZXggNjgwODlkMS4uNjY2NmY0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9wbTNmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vcG0zZmIuYwpAQCAtNTM5LDggKzUzOSwxMCBAQAogCQliZ3ggPSBwYXItPnBhbGV0dGVbaW1hZ2UtPmJnX2NvbG9yXTsKIAkJYnJlYWs7CiAJfQotCWlmIChpbWFnZS0+ZGVwdGggIT0gMSkKLQkJcmV0dXJuIGNmYl9pbWFnZWJsaXQoaW5mbywgaW1hZ2UpOworCWlmIChpbWFnZS0+ZGVwdGggIT0gMSkgeworCQljZmJfaW1hZ2VibGl0KGluZm8sIGltYWdlKTsKKwkJcmV0dXJuOworCX0KIAogCWlmIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgPT0gOCkgewogCQlmZ3ggfD0gZmd4IDw8IDg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3NtNTAxZmIuYyBiL2RyaXZlcnMvdmlkZW8vc201MDFmYi5jCmluZGV4IGY5NGFlODQuLmRjZDk4NzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc201MDFmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vc201MDFmYi5jCkBAIC0xNTksNiArMTU5LDkgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFNNNTAxX01FTUZfUEFORUw6CisJCWlmIChzaXplID4gaW5mLT5mYm1lbV9sZW4pCisJCQlyZXR1cm4gLUVOT01FTTsKKwogCQlwdHIgPSBpbmYtPmZibWVtX2xlbiAtIHNpemU7CiAJCWZiaSA9IGluZi0+ZmJbSEVBRF9DUlRdOwogCkBAIC0xNzIsOSArMTc1LDYgQEAKIAkJaWYgKGZiaSAmJiBwdHIgPCBmYmktPmZpeC5zbWVtX2xlbikKIAkJCXJldHVybiAtRU5PTUVNOwogCi0JCWlmIChwdHIgPCAwKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KIAkJYnJlYWs7CiAKIAljYXNlIFNNNTAxX01FTUZfQ1JUOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92aWEvdmlhZmJkZXYuYyBiL2RyaXZlcnMvdmlkZW8vdmlhL3ZpYWZiZGV2LmMKaW5kZXggZTIxZmU1Yi4uMzdiNDMzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby92aWEvdmlhZmJkZXYuYworKysgYi9kcml2ZXJzL3ZpZGVvL3ZpYS92aWFmYmRldi5jCkBAIC04NzAsOCArODcwLDEwIEBACiAJdTMyIGNvbCA9IDAsIHJvcCA9IDA7CiAJaW50IHBpdGNoOwogCi0JaWYgKCF2aWFmYl9hY2NlbCkKLQkJcmV0dXJuIGNmYl9maWxscmVjdChpbmZvLCByZWN0KTsKKwlpZiAoIXZpYWZiX2FjY2VsKSB7CisJCWNmYl9maWxscmVjdChpbmZvLCByZWN0KTsKKwkJcmV0dXJuOworCX0KIAogCWlmICghcmVjdC0+d2lkdGggfHwgIXJlY3QtPmhlaWdodCkKIAkJcmV0dXJuOwpAQCAtOTM3LDggKzkzOSwxMCBAQAogCiAJREVCVUdfTVNHKEtFUk5fSU5GTyAidmlhZmJfY29weWFyZWEhIVxuIik7CiAKLQlpZiAoIXZpYWZiX2FjY2VsKQotCQlyZXR1cm4gY2ZiX2NvcHlhcmVhKGluZm8sIGFyZWEpOworCWlmICghdmlhZmJfYWNjZWwpIHsKKwkJY2ZiX2NvcHlhcmVhKGluZm8sIGFyZWEpOworCQlyZXR1cm47CisJfQogCiAJaWYgKCFhcmVhLT53aWR0aCB8fCAhYXJlYS0+aGVpZ2h0KQogCQlyZXR1cm47CkBAIC05OTQsOCArOTk4LDEwIEBACiAJaW50IGk7CiAJaW50IHBpdGNoOwogCi0JaWYgKCF2aWFmYl9hY2NlbCkKLQkJcmV0dXJuIGNmYl9pbWFnZWJsaXQoaW5mbywgaW1hZ2UpOworCWlmICghdmlhZmJfYWNjZWwpIHsKKwkJY2ZiX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7CisJCXJldHVybjsKKwl9CiAKIAl1ZGF0YSA9ICh1MzIgKikgaW1hZ2UtPmRhdGE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19wY2kuYyBiL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19wY2kuYwppbmRleCAyNjVmZGYyLi5iZWY2YjQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpcnRpby92aXJ0aW9fcGNpLmMKKysrIGIvZHJpdmVycy92aXJ0aW8vdmlydGlvX3BjaS5jCkBAIC03MywxMCArNzMsNyBAQAogLyogQSBQQ0kgZGV2aWNlIGhhcyBpdCdzIG93biBzdHJ1Y3QgZGV2aWNlIGFuZCBzbyBkb2VzIGEgdmlydGlvIGRldmljZSBzbwogICogd2UgY3JlYXRlIGEgcGxhY2UgZm9yIHRoZSB2aXJ0aW8gZGV2aWNlcyB0byBzaG93IHVwIGluIHN5c2ZzLiAgSSB0aGluayBpdAogICogd291bGQgbWFrZSBtb3JlIHNlbnNlIGZvciB2aXJ0aW8gdG8gbm90IGluc2lzdCBvbiBoYXZpbmcgaXQncyBvd24gZGV2aWNlLiAqLwotc3RhdGljIHN0cnVjdCBkZXZpY2UgdmlydGlvX3BjaV9yb290ID0gewotCS5wYXJlbnQJCT0gTlVMTCwKLQkuaW5pdF9uYW1lCT0gInZpcnRpby1wY2kiLAotfTsKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlICp2aXJ0aW9fcGNpX3Jvb3Q7CiAKIC8qIENvbnZlcnQgYSBnZW5lcmljIHZpcnRpbyBkZXZpY2UgdG8gb3VyIHN0cnVjdHVyZSAqLwogc3RhdGljIHN0cnVjdCB2aXJ0aW9fcGNpX2RldmljZSAqdG9fdnBfZGV2aWNlKHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2ZGV2KQpAQCAtMzQzLDcgKzM0MCw3IEBACiAJaWYgKHZwX2RldiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXZwX2Rldi0+dmRldi5kZXYucGFyZW50ID0gJnZpcnRpb19wY2lfcm9vdDsKKwl2cF9kZXYtPnZkZXYuZGV2LnBhcmVudCA9IHZpcnRpb19wY2lfcm9vdDsKIAl2cF9kZXYtPnZkZXYuZGV2LnJlbGVhc2UgPSB2aXJ0aW9fcGNpX3JlbGVhc2VfZGV2OwogCXZwX2Rldi0+dmRldi5jb25maWcgPSAmdmlydGlvX3BjaV9jb25maWdfb3BzOwogCXZwX2Rldi0+cGNpX2RldiA9IHBjaV9kZXY7CkBAIC00MzcsMTMgKzQzNCwxMyBAQAogewogCWludCBlcnI7CiAKLQllcnIgPSBkZXZpY2VfcmVnaXN0ZXIoJnZpcnRpb19wY2lfcm9vdCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKKwl2aXJ0aW9fcGNpX3Jvb3QgPSByb290X2RldmljZV9yZWdpc3RlcigidmlydGlvLXBjaSIpOworCWlmIChJU19FUlIodmlydGlvX3BjaV9yb290KSkKKwkJcmV0dXJuIFBUUl9FUlIodmlydGlvX3BjaV9yb290KTsKIAogCWVyciA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnZpcnRpb19wY2lfZHJpdmVyKTsKIAlpZiAoZXJyKQotCQlkZXZpY2VfdW5yZWdpc3RlcigmdmlydGlvX3BjaV9yb290KTsKKwkJZGV2aWNlX3VucmVnaXN0ZXIodmlydGlvX3BjaV9yb290KTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC00NTIsOCArNDQ5LDggQEAKIAogc3RhdGljIHZvaWQgX19leGl0IHZpcnRpb19wY2lfZXhpdCh2b2lkKQogewotCWRldmljZV91bnJlZ2lzdGVyKCZ2aXJ0aW9fcGNpX3Jvb3QpOwogCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmdmlydGlvX3BjaV9kcml2ZXIpOworCXJvb3RfZGV2aWNlX3VucmVnaXN0ZXIodmlydGlvX3BjaV9yb290KTsKIH0KIAogbW9kdWxlX2V4aXQodmlydGlvX3BjaV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvbWFzdGVycy9LY29uZmlnIGIvZHJpdmVycy93MS9tYXN0ZXJzL0tjb25maWcKaW5kZXggOTA2MTY4Mi4uOTZkMmY4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS9tYXN0ZXJzL0tjb25maWcKKysrIGIvZHJpdmVycy93MS9tYXN0ZXJzL0tjb25maWcKQEAgLTM0LDYgKzM0LDEyIEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBkczI0ODIuCiAKK2NvbmZpZyBXMV9NQVNURVJfTVhDCisJdHJpc3RhdGUgIkZyZWVzY2FsZSBNWEMgMS13aXJlIGJ1c21hc3RlciIKKwlkZXBlbmRzIG9uIFcxICYmIEFSQ0hfTVhDCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgTVhDIDEtd2lyZSBob3N0CisKIGNvbmZpZyBXMV9NQVNURVJfRFMxV00KIAl0cmlzdGF0ZSAiTWF4aW0gRFMxV00gMS13aXJlIGJ1c21hc3RlciIKIAlkZXBlbmRzIG9uIFcxICYmIEFSTSAmJiBIQVZFX0NMSwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS9tYXN0ZXJzL01ha2VmaWxlIGIvZHJpdmVycy93MS9tYXN0ZXJzL01ha2VmaWxlCmluZGV4IGJjNDcxNGEuLmM1YTNlOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvbWFzdGVycy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3cxL21hc3RlcnMvTWFrZWZpbGUKQEAgLTUsNiArNSw4IEBACiBvYmotJChDT05GSUdfVzFfTUFTVEVSX01BVFJPWCkJCSs9IG1hdHJveF93MS5vCiBvYmotJChDT05GSUdfVzFfTUFTVEVSX0RTMjQ5MCkJCSs9IGRzMjQ5MC5vCiBvYmotJChDT05GSUdfVzFfTUFTVEVSX0RTMjQ4MikJCSs9IGRzMjQ4Mi5vCitvYmotJChDT05GSUdfVzFfTUFTVEVSX01YQykJCSs9IG14Y193MS5vCisKIG9iai0kKENPTkZJR19XMV9NQVNURVJfRFMxV00pCQkrPSBkczF3bS5vCiBvYmotJChDT05GSUdfVzFfTUFTVEVSX0dQSU8pCQkrPSB3MS1ncGlvLm8KIG9iai0kKENPTkZJR19IRFFfTUFTVEVSX09NQVApCQkrPSBvbWFwX2hkcS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL21hc3RlcnMvbXhjX3cxLmMgYi9kcml2ZXJzL3cxL21hc3RlcnMvbXhjX3cxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlkNzRkMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdzEvbWFzdGVycy9teGNfdzEuYwpAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMDggRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDA4IEx1b3RhbyBGdSwga2VybmVsQHBlbmd1dHJvbml4LmRlCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlICIuLi93MS5oIgorI2luY2x1ZGUgIi4uL3cxX2ludC5oIgorI2luY2x1ZGUgIi4uL3cxX2xvZy5oIgorCisvKiBBY2NvcmRpbmcgdG8gdGhlIG14MjcgRGF0YXNoZWV0IHRoZSByZXNldCBwcm9jZWR1cmUgc2hvdWxkIHRha2UgdXAgdG8gYWJvdXQKKyAqIDEzNTB1cy4gV2Ugc2V0IHRoZSB0aW1lb3V0IHRvIDUwMCoxMDB1cyA9IDUwbXMgZm9yIHN1cmUgKi8KKyNkZWZpbmUgTVhDX1cxX1JFU0VUX1RJTUVPVVQgNTAwCisKKy8qCisgKiBNWEMgVzEgUmVnaXN0ZXIgb2Zmc2V0cworICovCisjZGVmaW5lIE1YQ19XMV9DT05UUk9MICAgICAgICAgIDB4MDAKKyNkZWZpbmUgTVhDX1cxX1RJTUVfRElWSURFUiAgICAgMHgwMgorI2RlZmluZSBNWENfVzFfUkVTRVQgICAgICAgICAgICAweDA0CisjZGVmaW5lIE1YQ19XMV9DT01NQU5EICAgICAgICAgIDB4MDYKKyNkZWZpbmUgTVhDX1cxX1RYUlggICAgICAgICAgICAgMHgwOAorI2RlZmluZSBNWENfVzFfSU5URVJSVVBUICAgICAgICAweDBBCisjZGVmaW5lIE1YQ19XMV9JTlRFUlJVUFRfRU4gICAgIDB4MEMKKworc3RydWN0IG14Y193MV9kZXZpY2UgeworCXZvaWQgX19pb21lbSAqcmVnczsKKwl1bnNpZ25lZCBpbnQgY2xrZGl2OworCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgdzFfYnVzX21hc3RlciBidXNfbWFzdGVyOworfTsKKworLyoKKyAqIHRoaXMgaXMgdGhlIGxvdyBsZXZlbCByb3V0aW5lIHRvCisgKiByZXNldCB0aGUgZGV2aWNlIG9uIHRoZSBPbmUgV2lyZSBpbnRlcmZhY2UKKyAqIG9uIHRoZSBoYXJkd2FyZQorICovCitzdGF0aWMgdTggbXhjX3cxX2RzMl9yZXNldF9idXModm9pZCAqZGF0YSkKK3sKKwl1OCByZWdfdmFsOworCXVuc2lnbmVkIGludCB0aW1lb3V0X2NudCA9IDA7CisJc3RydWN0IG14Y193MV9kZXZpY2UgKmRldiA9IGRhdGE7CisKKwlfX3Jhd193cml0ZWIoMHg4MCwgKGRldi0+cmVncyArIE1YQ19XMV9DT05UUk9MKSk7CisKKwl3aGlsZSAoMSkgeworCQlyZWdfdmFsID0gX19yYXdfcmVhZGIoZGV2LT5yZWdzICsgTVhDX1cxX0NPTlRST0wpOworCisJCWlmICgoKHJlZ192YWwgPj4gNykgJiAweDEpID09IDAgfHwKKwkJICAgIHRpbWVvdXRfY250ID4gTVhDX1cxX1JFU0VUX1RJTUVPVVQpCisJCQlicmVhazsKKwkJZWxzZQorCQkJdGltZW91dF9jbnQrKzsKKworCQl1ZGVsYXkoMTAwKTsKKwl9CisJcmV0dXJuIChyZWdfdmFsID4+IDcpICYgMHgxOworfQorCisvKgorICogdGhpcyBpcyB0aGUgbG93IGxldmVsIHJvdXRpbmUgdG8gcmVhZC93cml0ZSBhIGJpdCBvbiB0aGUgT25lIFdpcmUKKyAqIGludGVyZmFjZSBvbiB0aGUgaGFyZHdhcmUuIEl0IGRvZXMgd3JpdGUgMCBpZiBwYXJhbWV0ZXIgYml0IGlzIHNldAorICogdG8gMCwgb3RoZXJ3aXNlIGEgd3JpdGUgMS9yZWFkLgorICovCitzdGF0aWMgdTggbXhjX3cxX2RzMl90b3VjaF9iaXQodm9pZCAqZGF0YSwgdTggYml0KQoreworCXN0cnVjdCBteGNfdzFfZGV2aWNlICptZGV2ID0gZGF0YTsKKwl2b2lkIF9faW9tZW0gKmN0cmxfYWRkciA9IG1kZXYtPnJlZ3MgKyBNWENfVzFfQ09OVFJPTDsKKwl1bnNpZ25lZCBpbnQgdGltZW91dF9jbnQgPSA0MDA7IC8qIFRha2VzIG1heC4gMTIwdXMgYWNjb3JkaW5nIHRvCisJCQkJCSAqIGRhdGFzaGVldC4KKwkJCQkJICovCisKKwlfX3Jhd193cml0ZWIoKDEgPDwgKDUgLSBiaXQpKSwgY3RybF9hZGRyKTsKKworCXdoaWxlICh0aW1lb3V0X2NudC0tKSB7CisJCWlmICghKChfX3Jhd19yZWFkYihjdHJsX2FkZHIpID4+ICg1IC0gYml0KSkgJiAweDEpKQorCQkJYnJlYWs7CisKKwkJdWRlbGF5KDEpOworCX0KKworCXJldHVybiAoKF9fcmF3X3JlYWRiKGN0cmxfYWRkcikpID4+IDMpICYgMHgxOworfQorCitzdGF0aWMgaW50IF9faW5pdCBteGNfdzFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbXhjX3cxX2RldmljZSAqbWRldjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgZXJyID0gMDsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpCisJCXJldHVybiAtRU5PREVWOworCisJbWRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBteGNfdzFfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1kZXYtPmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgIm93aXJlX2NsayIpOworCWlmICghbWRldi0+Y2xrKSB7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZmFpbGVkX2NsazsKKwl9CisKKwltZGV2LT5jbGtkaXYgPSAoY2xrX2dldF9yYXRlKG1kZXYtPmNsaykgLyAxMDAwMDAwKSAtIDE7CisKKwlyZXMgPSByZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpLAorCQkJCSJteGNfdzEiKTsKKwlpZiAoIXJlcykgeworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gZmFpbGVkX3JlcTsKKwl9CisKKwltZGV2LT5yZWdzID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCWlmICghbWRldi0+cmVncykgeworCQlwcmludGsoS0VSTl9FUlIgIkNhbm5vdCBtYXAgZnJhbWUgYnVmZmVyIHJlZ2lzdGVyc1xuIik7CisJCWdvdG8gZmFpbGVkX2lvcmVtYXA7CisJfQorCisJY2xrX2VuYWJsZShtZGV2LT5jbGspOworCV9fcmF3X3dyaXRlYihtZGV2LT5jbGtkaXYsIG1kZXYtPnJlZ3MgKyBNWENfVzFfVElNRV9ESVZJREVSKTsKKworCW1kZXYtPmJ1c19tYXN0ZXIuZGF0YSA9IG1kZXY7CisJbWRldi0+YnVzX21hc3Rlci5yZXNldF9idXMgPSBteGNfdzFfZHMyX3Jlc2V0X2J1czsKKwltZGV2LT5idXNfbWFzdGVyLnRvdWNoX2JpdCA9IG14Y193MV9kczJfdG91Y2hfYml0OworCisJZXJyID0gdzFfYWRkX21hc3Rlcl9kZXZpY2UoJm1kZXYtPmJ1c19tYXN0ZXIpOworCisJaWYgKGVycikKKwkJZ290byBmYWlsZWRfYWRkOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbWRldik7CisJcmV0dXJuIDA7CisKK2ZhaWxlZF9hZGQ6CisJaW91bm1hcChtZGV2LT5yZWdzKTsKK2ZhaWxlZF9pb3JlbWFwOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworZmFpbGVkX3JlcToKKwljbGtfcHV0KG1kZXYtPmNsayk7CitmYWlsZWRfY2xrOgorCWtmcmVlKG1kZXYpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBkaXNhc3NvY2lhdGUgdGhlIHcxIGRldmljZSBmcm9tIHRoZSBkcml2ZXIKKyAqLworc3RhdGljIGludCBteGNfdzFfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG14Y193MV9kZXZpY2UgKm1kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisKKwl3MV9yZW1vdmVfbWFzdGVyX2RldmljZSgmbWRldi0+YnVzX21hc3Rlcik7CisKKwlpb3VubWFwKG1kZXYtPnJlZ3MpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCWNsa19kaXNhYmxlKG1kZXYtPmNsayk7CisJY2xrX3B1dChtZGV2LT5jbGspOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXhjX3cxX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkgICAubmFtZSA9ICJteGNfdzEiLAorCX0sCisJLnByb2JlID0gbXhjX3cxX3Byb2JlLAorCS5yZW1vdmUgPSBteGNfdzFfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbXhjX3cxX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZteGNfdzFfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgbXhjX3cxX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXhjX3cxX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG14Y193MV9pbml0KTsKK21vZHVsZV9leGl0KG14Y193MV9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiRnJlZXNjYWxlIFNlbWljb25kdWN0b3JzIEluYyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIE9uZS1XaXJlIG9uIE1YQyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS93MS5jIGIvZHJpdmVycy93MS93MS5jCmluZGV4IDNiNjE1ZDQuLmFjYzdlM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvdzEuYworKysgYi9kcml2ZXJzL3cxL3cxLmMKQEAgLTE5Nyw3ICsxOTcsNyBAQAogc3RydWN0IGRldmljZSB3MV9tYXN0ZXJfZGV2aWNlID0gewogCS5wYXJlbnQgPSBOVUxMLAogCS5idXMgPSAmdzFfYnVzX3R5cGUsCi0JLmJ1c19pZCA9ICJ3MSBidXMgbWFzdGVyIiwKKwkuaW5pdF9uYW1lID0gIncxIGJ1cyBtYXN0ZXIiLAogCS5kcml2ZXIgPSAmdzFfbWFzdGVyX2RyaXZlciwKIAkucmVsZWFzZSA9ICZ3MV9tYXN0ZXJfcmVsZWFzZQogfTsKQEAgLTIxMSw3ICsyMTEsNyBAQAogc3RydWN0IGRldmljZSB3MV9zbGF2ZV9kZXZpY2UgPSB7CiAJLnBhcmVudCA9IE5VTEwsCiAJLmJ1cyA9ICZ3MV9idXNfdHlwZSwKLQkuYnVzX2lkID0gIncxIGJ1cyBzbGF2ZSIsCisJLmluaXRfbmFtZSA9ICJ3MSBidXMgc2xhdmUiLAogCS5kcml2ZXIgPSAmdzFfc2xhdmVfZHJpdmVyLAogCS5yZWxlYXNlID0gJncxX3NsYXZlX3JlbGVhc2UKIH07CkBAIC01NzMsNyArNTczLDcgQEAKIAl9CiAKIAlkZXZfZGJnKGRldiwgIkhvdHBsdWcgZXZlbnQgZm9yICVzICVzLCBidXNfaWQ9JXMuXG4iLAotCQkJZXZlbnRfb3duZXIsIG5hbWUsIGRldi0+YnVzX2lkKTsKKwkJCWV2ZW50X293bmVyLCBuYW1lLCBkZXZfbmFtZShkZXYpKTsKIAogCWlmIChkZXYtPmRyaXZlciAhPSAmdzFfc2xhdmVfZHJpdmVyIHx8ICFzbCkKIAkJcmV0dXJuIDA7CkBAIC02MDUsOCArNjA1LDcgQEAKIAlzbC0+ZGV2LmJ1cyA9ICZ3MV9idXNfdHlwZTsKIAlzbC0+ZGV2LnJlbGVhc2UgPSAmdzFfc2xhdmVfcmVsZWFzZTsKIAotCXNucHJpbnRmKCZzbC0+ZGV2LmJ1c19pZFswXSwgc2l6ZW9mKHNsLT5kZXYuYnVzX2lkKSwKLQkJICIlMDJ4LSUwMTJsbHgiLAorCWRldl9zZXRfbmFtZSgmc2wtPmRldiwgIiUwMngtJTAxMmxseCIsCiAJCSAodW5zaWduZWQgaW50KSBzbC0+cmVnX251bS5mYW1pbHksCiAJCSAodW5zaWduZWQgbG9uZyBsb25nKSBzbC0+cmVnX251bS5pZCk7CiAJc25wcmludGYoJnNsLT5uYW1lWzBdLCBzaXplb2Yoc2wtPm5hbWUpLApAQCAtNjE1LDEzICs2MTQsMTMgQEAKIAkJICh1bnNpZ25lZCBsb25nIGxvbmcpIHNsLT5yZWdfbnVtLmlkKTsKIAogCWRldl9kYmcoJnNsLT5kZXYsICIlczogcmVnaXN0ZXJpbmcgJXMgYXMgJXAuXG4iLCBfX2Z1bmNfXywKLQkJJnNsLT5kZXYuYnVzX2lkWzBdLCBzbCk7CisJCWRldl9uYW1lKCZzbC0+ZGV2KSwgc2wpOwogCiAJZXJyID0gZGV2aWNlX3JlZ2lzdGVyKCZzbC0+ZGV2KTsKIAlpZiAoZXJyIDwgMCkgewogCQlkZXZfZXJyKCZzbC0+ZGV2LAogCQkJIkRldmljZSByZWdpc3RyYXRpb24gWyVzXSBmYWlsZWQuIGVycj0lZFxuIiwKLQkJCXNsLT5kZXYuYnVzX2lkLCBlcnIpOworCQkJZGV2X25hbWUoJnNsLT5kZXYpLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtNjMwLDcgKzYyOSw3IEBACiAJaWYgKGVyciA8IDApIHsKIAkJZGV2X2Vycigmc2wtPmRldiwKIAkJCSJzeXNmcyBmaWxlIGNyZWF0aW9uIGZvciBbJXNdIGZhaWxlZC4gZXJyPSVkXG4iLAotCQkJc2wtPmRldi5idXNfaWQsIGVycik7CisJCQlkZXZfbmFtZSgmc2wtPmRldiksIGVycik7CiAJCWdvdG8gb3V0X3VucmVnOwogCX0KIApAQCAtNjM5LDcgKzYzOCw3IEBACiAJaWYgKGVyciA8IDApIHsKIAkJZGV2X2Vycigmc2wtPmRldiwKIAkJCSJzeXNmcyBmaWxlIGNyZWF0aW9uIGZvciBbJXNdIGZhaWxlZC4gZXJyPSVkXG4iLAotCQkJc2wtPmRldi5idXNfaWQsIGVycik7CisJCQlkZXZfbmFtZSgmc2wtPmRldiksIGVycik7CiAJCWdvdG8gb3V0X3JlbTE7CiAJfQogCkBAIC02NDgsNyArNjQ3LDcgQEAKIAkgICAgKChlcnIgPSBzbC0+ZmFtaWx5LT5mb3BzLT5hZGRfc2xhdmUoc2wpKSA8IDApKSB7CiAJCWRldl9lcnIoJnNsLT5kZXYsCiAJCQkic3lzZnMgZmlsZSBjcmVhdGlvbiBmb3IgWyVzXSBmYWlsZWQuIGVycj0lZFxuIiwKLQkJCXNsLT5kZXYuYnVzX2lkLCBlcnIpOworCQkJZGV2X25hbWUoJnNsLT5kZXYpLCBlcnIpOwogCQlnb3RvIG91dF9yZW0yOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS93MS5oIGIvZHJpdmVycy93MS93MS5oCmluZGV4IDk3MzA0YmQuLmQ4YTk3MDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvdzEuaAorKysgYi9kcml2ZXJzL3cxL3cxLmgKQEAgLTIxMCw2ICsyMTAsNyBAQAogaW50IHcxX3Jlc2V0X2J1cyhzdHJ1Y3QgdzFfbWFzdGVyICopOwogdTggdzFfY2FsY19jcmM4KHU4ICosIGludCk7CiB2b2lkIHcxX3dyaXRlX2Jsb2NrKHN0cnVjdCB3MV9tYXN0ZXIgKiwgY29uc3QgdTggKiwgaW50KTsKK3ZvaWQgdzFfdG91Y2hfYmxvY2soc3RydWN0IHcxX21hc3RlciAqLCB1OCAqLCBpbnQpOwogdTggdzFfcmVhZF9ibG9jayhzdHJ1Y3QgdzFfbWFzdGVyICosIHU4ICosIGludCk7CiBpbnQgdzFfcmVzZXRfc2VsZWN0X3NsYXZlKHN0cnVjdCB3MV9zbGF2ZSAqc2wpOwogdm9pZCB3MV9uZXh0X3B1bGx1cChzdHJ1Y3QgdzFfbWFzdGVyICosIGludCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxX2ludC5jIGIvZHJpdmVycy93MS93MV9pbnQuYwppbmRleCBhM2E1NDU2Li40YTQ2ZWQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxX2ludC5jCisrKyBiL2RyaXZlcnMvdzEvdzFfaW50LmMKQEAgLTc1LDggKzc1LDcgQEAKIAltdXRleF9pbml0KCZkZXYtPm11dGV4KTsKIAogCW1lbWNweSgmZGV2LT5kZXYsIGRldmljZSwgc2l6ZW9mKHN0cnVjdCBkZXZpY2UpKTsKLQlzbnByaW50ZihkZXYtPmRldi5idXNfaWQsIHNpemVvZihkZXYtPmRldi5idXNfaWQpLAotCQkgICJ3MV9idXNfbWFzdGVyJXUiLCBkZXYtPmlkKTsKKwlkZXZfc2V0X25hbWUoJmRldi0+ZGV2LCAidzFfYnVzX21hc3RlciV1IiwgZGV2LT5pZCk7CiAJc25wcmludGYoZGV2LT5uYW1lLCBzaXplb2YoZGV2LT5uYW1lKSwgIncxX2J1c19tYXN0ZXIldSIsIGRldi0+aWQpOwogCiAJZGV2LT5kcml2ZXIgPSBkcml2ZXI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxX2lvLmMgYi9kcml2ZXJzL3cxL3cxX2lvLmMKaW5kZXggNTEzOWMyNS4uNDQyYmQ4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS93MV9pby5jCisrKyBiL2RyaXZlcnMvdzEvdzFfaW8uYwpAQCAtMjM4LDcgKzIzOCw2IEBACiAgKiBAcGFyYW0gZGV2ICAgICB0aGUgbWFzdGVyIGRldmljZQogICogQHBhcmFtIGJ1ZiAgICAgcG9pbnRlciB0byB0aGUgZGF0YSB0byB3cml0ZQogICogQHBhcmFtIGxlbiAgICAgdGhlIG51bWJlciBvZiBieXRlcyB0byB3cml0ZQotICogQHJldHVybiAgICAgICAgdGhlIGJ5dGUgcmVhZAogICovCiB2b2lkIHcxX3dyaXRlX2Jsb2NrKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgY29uc3QgdTggKmJ1ZiwgaW50IGxlbikKIHsKQEAgLTI1Niw2ICsyNTUsMzEgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHcxX3dyaXRlX2Jsb2NrKTsKIAogLyoqCisgKiBUb3VjaGVzIGEgc2VyaWVzIG9mIGJ5dGVzLgorICoKKyAqIEBwYXJhbSBkZXYgICAgIHRoZSBtYXN0ZXIgZGV2aWNlCisgKiBAcGFyYW0gYnVmICAgICBwb2ludGVyIHRvIHRoZSBkYXRhIHRvIHdyaXRlCisgKiBAcGFyYW0gbGVuICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlCisgKi8KK3ZvaWQgdzFfdG91Y2hfYmxvY2soc3RydWN0IHcxX21hc3RlciAqZGV2LCB1OCAqYnVmLCBpbnQgbGVuKQoreworCWludCBpLCBqOworCXU4IHRtcDsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgeworCQl0bXAgPSAwOworCQlmb3IgKGogPSAwOyBqIDwgODsgKytqKSB7CisJCQlpZiAoaiA9PSA3KQorCQkJCXcxX3ByZV93cml0ZShkZXYpOworCQkJdG1wIHw9IHcxX3RvdWNoX2JpdChkZXYsIChidWZbaV0gPj4gaikgJiAweDEpIDw8IGo7CisJCX0KKworCQlidWZbaV0gPSB0bXA7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwodzFfdG91Y2hfYmxvY2spOworCisvKioKICAqIFJlYWRzIGEgc2VyaWVzIG9mIGJ5dGVzLgogICoKICAqIEBwYXJhbSBkZXYgICAgIHRoZSBtYXN0ZXIgZGV2aWNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxX25ldGxpbmsuYyBiL2RyaXZlcnMvdzEvdzFfbmV0bGluay5jCmluZGV4IDY1YzVlYmQuLmZkZjcyODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvdzFfbmV0bGluay5jCisrKyBiL2RyaXZlcnMvdzEvdzFfbmV0bGluay5jCkBAIC00NywyMSArNDcsNTYgQEAKIAljbl9uZXRsaW5rX3NlbmQobSwgMCwgR0ZQX0tFUk5FTCk7CiB9CiAKLXN0YXRpYyBpbnQgdzFfcHJvY2Vzc19jb21tYW5kX21hc3RlcihzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIHN0cnVjdCBjbl9tc2cgKm1zZywKLQkJc3RydWN0IHcxX25ldGxpbmtfbXNnICpoZHIsIHN0cnVjdCB3MV9uZXRsaW5rX2NtZCAqY21kKQorc3RhdGljIHZvaWQgdzFfc2VuZF9zbGF2ZShzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIHU2NCBybikKIHsKLQlkZXZfZGJnKCZkZXYtPmRldiwgIiVzOiAlczogY21kPSUwMngsIGxlbj0ldS5cbiIsCi0JCV9fZnVuY19fLCBkZXYtPm5hbWUsIGNtZC0+Y21kLCBjbWQtPmxlbik7CisJc3RydWN0IGNuX21zZyAqbXNnID0gZGV2LT5wcml2OworCXN0cnVjdCB3MV9uZXRsaW5rX21zZyAqaGRyID0gKHN0cnVjdCB3MV9uZXRsaW5rX21zZyAqKShtc2cgKyAxKTsKKwlzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKmNtZCA9IChzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKikoaGRyICsgMSk7CisJaW50IGF2YWlsOwogCi0JaWYgKGNtZC0+Y21kICE9IFcxX0NNRF9TRUFSQ0ggJiYgY21kLT5jbWQgIT0gVzFfQ01EX0FMQVJNX1NFQVJDSCkKLQkJcmV0dXJuIC1FSU5WQUw7CisJYXZhaWwgPSBkZXYtPnByaXZfc2l6ZSAtIGNtZC0+bGVuOwogCi0JdzFfc2VhcmNoX3Byb2Nlc3MoZGV2LCAoY21kLT5jbWQgPT0gVzFfQ01EX0FMQVJNX1NFQVJDSCk/VzFfQUxBUk1fU0VBUkNIOlcxX1NFQVJDSCk7CisJaWYgKGF2YWlsID4gOCkgeworCQl1NjQgKmRhdGEgPSAodm9pZCAqKShjbWQgKyAxKSArIGNtZC0+bGVuOworCisJCSpkYXRhID0gcm47CisJCWNtZC0+bGVuICs9IDg7CisJCWhkci0+bGVuICs9IDg7CisJCW1zZy0+bGVuICs9IDg7CisJCXJldHVybjsKKwl9CisKKwltc2ctPmFjaysrOworCWNuX25ldGxpbmtfc2VuZChtc2csIDAsIEdGUF9LRVJORUwpOworCisJbXNnLT5sZW4gPSBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfbXNnKSArIHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19jbWQpOworCWhkci0+bGVuID0gc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCk7CisJY21kLT5sZW4gPSAwOworfQorCitzdGF0aWMgaW50IHcxX3Byb2Nlc3Nfc2VhcmNoX2NvbW1hbmQoc3RydWN0IHcxX21hc3RlciAqZGV2LCBzdHJ1Y3QgY25fbXNnICptc2csCisJCXVuc2lnbmVkIGludCBhdmFpbCkKK3sKKwlzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKmhkciA9IChzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKikobXNnICsgMSk7CisJc3RydWN0IHcxX25ldGxpbmtfY21kICpjbWQgPSAoc3RydWN0IHcxX25ldGxpbmtfY21kICopKGhkciArIDEpOworCWludCBzZWFyY2hfdHlwZSA9IChjbWQtPmNtZCA9PSBXMV9DTURfQUxBUk1fU0VBUkNIKT9XMV9BTEFSTV9TRUFSQ0g6VzFfU0VBUkNIOworCisJZGV2LT5wcml2ID0gbXNnOworCWRldi0+cHJpdl9zaXplID0gYXZhaWw7CisKKwl3MV9zZWFyY2hfZGV2aWNlcyhkZXYsIHNlYXJjaF90eXBlLCB3MV9zZW5kX3NsYXZlKTsKKworCW1zZy0+YWNrID0gMDsKKwljbl9uZXRsaW5rX3NlbmQobXNnLCAwLCBHRlBfS0VSTkVMKTsKKworCWRldi0+cHJpdiA9IE5VTEw7CisJZGV2LT5wcml2X3NpemUgPSAwOworCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdzFfc2VuZF9yZWFkX3JlcGx5KHN0cnVjdCB3MV9zbGF2ZSAqc2wsIHN0cnVjdCBjbl9tc2cgKm1zZywKLQkJc3RydWN0IHcxX25ldGxpbmtfbXNnICpoZHIsIHN0cnVjdCB3MV9uZXRsaW5rX2NtZCAqY21kKQorc3RhdGljIGludCB3MV9zZW5kX3JlYWRfcmVwbHkoc3RydWN0IGNuX21zZyAqbXNnLCBzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKmhkciwKKwkJc3RydWN0IHcxX25ldGxpbmtfY21kICpjbWQpCiB7CiAJdm9pZCAqZGF0YTsKIAlzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKmg7CkBAIC04NSw3ICsxMjAsOCBAQAogCW1lbWNweShjLCBjbWQsIHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19jbWQpKTsKIAogCWNtLT5hY2sgPSBtc2ctPnNlcSsxOwotCWNtLT5sZW4gPSBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfbXNnKSArIHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19jbWQpICsgY21kLT5sZW47CisJY20tPmxlbiA9IHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19tc2cpICsKKwkJc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCkgKyBjbWQtPmxlbjsKIAogCWgtPmxlbiA9IHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19jbWQpICsgY21kLT5sZW47CiAKQEAgLTk4LDM2ICsxMzQsMTc4IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCB3MV9wcm9jZXNzX2NvbW1hbmRfc2xhdmUoc3RydWN0IHcxX3NsYXZlICpzbCwgc3RydWN0IGNuX21zZyAqbXNnLAorc3RhdGljIGludCB3MV9wcm9jZXNzX2NvbW1hbmRfaW8oc3RydWN0IHcxX21hc3RlciAqZGV2LCBzdHJ1Y3QgY25fbXNnICptc2csCiAJCXN0cnVjdCB3MV9uZXRsaW5rX21zZyAqaGRyLCBzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKmNtZCkKIHsKIAlpbnQgZXJyID0gMDsKIAotCWRldl9kYmcoJnNsLT5tYXN0ZXItPmRldiwgIiVzOiAlMDJ4LiUwMTJsbHguJTAyeDogY21kPSUwMngsIGxlbj0ldS5cbiIsCi0JCV9fZnVuY19fLCBzbC0+cmVnX251bS5mYW1pbHksICh1bnNpZ25lZCBsb25nIGxvbmcpc2wtPnJlZ19udW0uaWQsIHNsLT5yZWdfbnVtLmNyYywKLQkJY21kLT5jbWQsIGNtZC0+bGVuKTsKLQogCXN3aXRjaCAoY21kLT5jbWQpIHsKLQkJY2FzZSBXMV9DTURfUkVBRDoKLQkJCXcxX3JlYWRfYmxvY2soc2wtPm1hc3RlciwgY21kLT5kYXRhLCBjbWQtPmxlbik7Ci0JCQl3MV9zZW5kX3JlYWRfcmVwbHkoc2wsIG1zZywgaGRyLCBjbWQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVzFfQ01EX1dSSVRFOgotCQkJdzFfd3JpdGVfYmxvY2soc2wtPm1hc3RlciwgY21kLT5kYXRhLCBjbWQtPmxlbik7Ci0JCQlicmVhazsKLQkJY2FzZSBXMV9DTURfU0VBUkNIOgotCQljYXNlIFcxX0NNRF9BTEFSTV9TRUFSQ0g6Ci0JCQl3MV9zZWFyY2hfcHJvY2VzcyhzbC0+bWFzdGVyLAotCQkJCQkoY21kLT5jbWQgPT0gVzFfQ01EX0FMQVJNX1NFQVJDSCk/VzFfQUxBUk1fU0VBUkNIOlcxX1NFQVJDSCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWVyciA9IC0xOwotCQkJYnJlYWs7CisJY2FzZSBXMV9DTURfVE9VQ0g6CisJCXcxX3RvdWNoX2Jsb2NrKGRldiwgY21kLT5kYXRhLCBjbWQtPmxlbik7CisJCXcxX3NlbmRfcmVhZF9yZXBseShtc2csIGhkciwgY21kKTsKKwkJYnJlYWs7CisJY2FzZSBXMV9DTURfUkVBRDoKKwkJdzFfcmVhZF9ibG9jayhkZXYsIGNtZC0+ZGF0YSwgY21kLT5sZW4pOworCQl3MV9zZW5kX3JlYWRfcmVwbHkobXNnLCBoZHIsIGNtZCk7CisJCWJyZWFrOworCWNhc2UgVzFfQ01EX1dSSVRFOgorCQl3MV93cml0ZV9ibG9jayhkZXYsIGNtZC0+ZGF0YSwgY21kLT5sZW4pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIgPSAtRUlOVkFMOworCQlicmVhazsKIAl9CiAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgaW50IHcxX3Byb2Nlc3NfY29tbWFuZF9tYXN0ZXIoc3RydWN0IHcxX21hc3RlciAqZGV2LCBzdHJ1Y3QgY25fbXNnICpyZXFfbXNnLAorCQlzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKnJlcV9oZHIsIHN0cnVjdCB3MV9uZXRsaW5rX2NtZCAqcmVxX2NtZCkKK3sKKwlpbnQgZXJyID0gLUVJTlZBTDsKKwlzdHJ1Y3QgY25fbXNnICptc2c7CisJc3RydWN0IHcxX25ldGxpbmtfbXNnICpoZHI7CisJc3RydWN0IHcxX25ldGxpbmtfY21kICpjbWQ7CisKKwltc2cgPSBremFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtc2cpCisJCXJldHVybiAtRU5PTUVNOworCisJbXNnLT5pZCA9IHJlcV9tc2ctPmlkOworCW1zZy0+c2VxID0gcmVxX21zZy0+c2VxOworCW1zZy0+YWNrID0gMDsKKwltc2ctPmxlbiA9IHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19tc2cpICsgc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCk7CisKKwloZHIgPSAoc3RydWN0IHcxX25ldGxpbmtfbXNnICopKG1zZyArIDEpOworCWNtZCA9IChzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKikoaGRyICsgMSk7CisKKwloZHItPnR5cGUgPSBXMV9NQVNURVJfQ01EOworCWhkci0+aWQgPSByZXFfaGRyLT5pZDsKKwloZHItPmxlbiA9IHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19jbWQpOworCisJY21kLT5jbWQgPSByZXFfY21kLT5jbWQ7CisJY21kLT5sZW4gPSAwOworCisJc3dpdGNoIChjbWQtPmNtZCkgeworCWNhc2UgVzFfQ01EX1NFQVJDSDoKKwljYXNlIFcxX0NNRF9BTEFSTV9TRUFSQ0g6CisJCWVyciA9IHcxX3Byb2Nlc3Nfc2VhcmNoX2NvbW1hbmQoZGV2LCBtc2csCisJCQkJUEFHRV9TSVpFIC0gbXNnLT5sZW4gLSBzaXplb2Yoc3RydWN0IGNuX21zZykpOworCQlicmVhazsKKwljYXNlIFcxX0NNRF9SRUFEOgorCWNhc2UgVzFfQ01EX1dSSVRFOgorCWNhc2UgVzFfQ01EX1RPVUNIOgorCQllcnIgPSB3MV9wcm9jZXNzX2NvbW1hbmRfaW8oZGV2LCByZXFfbXNnLCByZXFfaGRyLCByZXFfY21kKTsKKwkJYnJlYWs7CisJY2FzZSBXMV9DTURfUkVTRVQ6CisJCWVyciA9IHcxX3Jlc2V0X2J1cyhkZXYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlrZnJlZShtc2cpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdzFfcHJvY2Vzc19jb21tYW5kX3NsYXZlKHN0cnVjdCB3MV9zbGF2ZSAqc2wsIHN0cnVjdCBjbl9tc2cgKm1zZywKKwkJc3RydWN0IHcxX25ldGxpbmtfbXNnICpoZHIsIHN0cnVjdCB3MV9uZXRsaW5rX2NtZCAqY21kKQoreworCWRldl9kYmcoJnNsLT5tYXN0ZXItPmRldiwgIiVzOiAlMDJ4LiUwMTJsbHguJTAyeDogY21kPSUwMngsIGxlbj0ldS5cbiIsCisJCV9fZnVuY19fLCBzbC0+cmVnX251bS5mYW1pbHksICh1bnNpZ25lZCBsb25nIGxvbmcpc2wtPnJlZ19udW0uaWQsCisJCXNsLT5yZWdfbnVtLmNyYywgY21kLT5jbWQsIGNtZC0+bGVuKTsKKworCXJldHVybiB3MV9wcm9jZXNzX2NvbW1hbmRfaW8oc2wtPm1hc3RlciwgbXNnLCBoZHIsIGNtZCk7Cit9CisKK3N0YXRpYyBpbnQgdzFfcHJvY2Vzc19jb21tYW5kX3Jvb3Qoc3RydWN0IGNuX21zZyAqbXNnLCBzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKm1jbWQpCit7CisJc3RydWN0IHcxX21hc3RlciAqbTsKKwlzdHJ1Y3QgY25fbXNnICpjbjsKKwlzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKnc7CisJdTMyICppZDsKKworCWlmIChtY21kLT50eXBlICE9IFcxX0xJU1RfTUFTVEVSUykgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBtc2c6ICV4LiV4LCB3cm9uZyB0eXBlOiAldSwgbGVuOiAldS5cbiIsCisJCQlfX2Z1bmNfXywgbXNnLT5pZC5pZHgsIG1zZy0+aWQudmFsLCBtY21kLT50eXBlLCBtY21kLT5sZW4pOworCQlyZXR1cm4gLUVQUk9UTzsKKwl9CisKKwljbiA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNuKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNuLT5pZC5pZHggPSBDTl9XMV9JRFg7CisJY24tPmlkLnZhbCA9IENOX1cxX1ZBTDsKKworCWNuLT5zZXEgPSBtc2ctPnNlcTsKKwljbi0+YWNrID0gMTsKKwljbi0+bGVuID0gc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX21zZyk7CisJdyA9IChzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKikoY24gKyAxKTsKKworCXctPnR5cGUgPSBXMV9MSVNUX01BU1RFUlM7CisJdy0+c3RhdHVzID0gMDsKKwl3LT5sZW4gPSAwOworCWlkID0gKHUzMiAqKSh3ICsgMSk7CisKKwltdXRleF9sb2NrKCZ3MV9tbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShtLCAmdzFfbWFzdGVycywgdzFfbWFzdGVyX2VudHJ5KSB7CisJCWlmIChjbi0+bGVuICsgc2l6ZW9mKCppZCkgPiBQQUdFX1NJWkUgLSBzaXplb2Yoc3RydWN0IGNuX21zZykpIHsKKwkJCWNuX25ldGxpbmtfc2VuZChjbiwgMCwgR0ZQX0tFUk5FTCk7CisJCQljbi0+YWNrKys7CisJCQljbi0+bGVuID0gc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX21zZyk7CisJCQl3LT5sZW4gPSAwOworCQkJaWQgPSAodTMyICopKHcgKyAxKTsKKwkJfQorCisJCSppZCA9IG0tPmlkOworCQl3LT5sZW4gKz0gc2l6ZW9mKCppZCk7CisJCWNuLT5sZW4gKz0gc2l6ZW9mKCppZCk7CisJCWlkKys7CisJfQorCWNuLT5hY2sgPSAwOworCWNuX25ldGxpbmtfc2VuZChjbiwgMCwgR0ZQX0tFUk5FTCk7CisJbXV0ZXhfdW5sb2NrKCZ3MV9tbG9jayk7CisKKwlrZnJlZShjbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdzFfbmV0bGlua19zZW5kX2Vycm9yKHN0cnVjdCBjbl9tc2cgKnJjbXNnLCBzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKnJtc2csCisJCXN0cnVjdCB3MV9uZXRsaW5rX2NtZCAqcmNtZCwgaW50IGVycm9yKQoreworCXN0cnVjdCBjbl9tc2cgKmNtc2c7CisJc3RydWN0IHcxX25ldGxpbmtfbXNnICptc2c7CisJc3RydWN0IHcxX25ldGxpbmtfY21kICpjbWQ7CisKKwljbXNnID0ga3phbGxvYyhzaXplb2YoKm1zZykgKyBzaXplb2YoKmNtZCkgKyBzaXplb2YoKmNtc2cpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNtc2cpCisJCXJldHVybiAtRU5PTUVNOworCisJbXNnID0gKHN0cnVjdCB3MV9uZXRsaW5rX21zZyAqKShjbXNnICsgMSk7CisJY21kID0gKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCAqKShtc2cgKyAxKTsKKworCW1lbWNweShjbXNnLCByY21zZywgc2l6ZW9mKCpjbXNnKSk7CisJY21zZy0+bGVuID0gc2l6ZW9mKCptc2cpOworCisJbWVtY3B5KG1zZywgcm1zZywgc2l6ZW9mKCptc2cpKTsKKwltc2ctPmxlbiA9IDA7CisJbXNnLT5zdGF0dXMgPSAoc2hvcnQpLWVycm9yOworCisJaWYgKHJjbWQpIHsKKwkJbWVtY3B5KGNtZCwgcmNtZCwgc2l6ZW9mKCpjbWQpKTsKKwkJY21kLT5sZW4gPSAwOworCQltc2ctPmxlbiArPSBzaXplb2YoKmNtZCk7CisJCWNtc2ctPmxlbiArPSBzaXplb2YoKmNtZCk7CisJfQorCisJZXJyb3IgPSBjbl9uZXRsaW5rX3NlbmQoY21zZywgMCwgR0ZQX0tFUk5FTCk7CisJa2ZyZWUoY21zZyk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKIHN0YXRpYyB2b2lkIHcxX2NuX2NhbGxiYWNrKHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGNuX21zZyAqbXNnID0gZGF0YTsKQEAgLTE0NCw2ICszMjIsNyBAQAogCiAJCWRldiA9IE5VTEw7CiAJCXNsID0gTlVMTDsKKwkJY21kID0gTlVMTDsKIAogCQltZW1jcHkoJmlkLCBtLT5pZC5pZCwgc2l6ZW9mKGlkKSk7CiAjaWYgMApAQCAtMTU1LDE1ICszMzQsMTUgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKCFtbGVuKQotCQkJZ290byBvdXRfY29udDsKLQogCQlpZiAobS0+dHlwZSA9PSBXMV9NQVNURVJfQ01EKSB7CiAJCQlkZXYgPSB3MV9zZWFyY2hfbWFzdGVyX2lkKG0tPmlkLm1zdC5pZCk7CiAJCX0gZWxzZSBpZiAobS0+dHlwZSA9PSBXMV9TTEFWRV9DTUQpIHsKIAkJCXNsID0gdzFfc2VhcmNoX3NsYXZlKCZpZCk7CiAJCQlpZiAoc2wpCiAJCQkJZGV2ID0gc2wtPm1hc3RlcjsKKwkJfSBlbHNlIHsKKwkJCWVyciA9IHcxX3Byb2Nlc3NfY29tbWFuZF9yb290KG1zZywgbSk7CisJCQlnb3RvIG91dF9jb250OwogCQl9CiAKIAkJaWYgKCFkZXYpIHsKQEAgLTE3MSw2ICszNTAsMTAgQEAKIAkJCWdvdG8gb3V0X2NvbnQ7CiAJCX0KIAorCQllcnIgPSAwOworCQlpZiAoIW1sZW4pCisJCQlnb3RvIG91dF9jb250OworCiAJCW11dGV4X2xvY2soJmRldi0+bXV0ZXgpOwogCiAJCWlmIChzbCAmJiB3MV9yZXNldF9zZWxlY3Rfc2xhdmUoc2wpKSB7CkBAIC0xODcsOSArMzcwLDEyIEBACiAJCQl9CiAKIAkJCWlmIChzbCkKLQkJCQl3MV9wcm9jZXNzX2NvbW1hbmRfc2xhdmUoc2wsIG1zZywgbSwgY21kKTsKKwkJCQllcnIgPSB3MV9wcm9jZXNzX2NvbW1hbmRfc2xhdmUoc2wsIG1zZywgbSwgY21kKTsKIAkJCWVsc2UKLQkJCQl3MV9wcm9jZXNzX2NvbW1hbmRfbWFzdGVyKGRldiwgbXNnLCBtLCBjbWQpOworCQkJCWVyciA9IHcxX3Byb2Nlc3NfY29tbWFuZF9tYXN0ZXIoZGV2LCBtc2csIG0sIGNtZCk7CisKKwkJCXcxX25ldGxpbmtfc2VuZF9lcnJvcihtc2csIG0sIGNtZCwgZXJyKTsKKwkJCWVyciA9IDA7CiAKIAkJCWNtZF9kYXRhICs9IGNtZC0+bGVuICsgc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCk7CiAJCQltbGVuIC09IGNtZC0+bGVuICsgc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCk7CkBAIC0yMDAsNiArMzg2LDggQEAKIAkJCWF0b21pY19kZWMoJnNsLT5yZWZjbnQpOwogCQltdXRleF91bmxvY2soJmRldi0+bXV0ZXgpOwogb3V0X2NvbnQ6CisJCWlmICghY21kIHx8IGVycikKKwkJCXcxX25ldGxpbmtfc2VuZF9lcnJvcihtc2csIG0sIGNtZCwgZXJyKTsKIAkJbXNnLT5sZW4gLT0gc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX21zZykgKyBtLT5sZW47CiAJCW0gPSAoc3RydWN0IHcxX25ldGxpbmtfbXNnICopKCgodTggKiltKSArIHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19tc2cpICsgbS0+bGVuKTsKIApAQCAtMjA5LDExICszOTcsNiBAQAogCQlpZiAoZXJyID09IC1FTk9ERVYpCiAJCQllcnIgPSAwOwogCX0KLSNpZiAwCi0JaWYgKGVycikgewotCQlwcmludGsoIiVzOiBtYWxmb3JtZWQgbWVzc2FnZS4gRHJvcHBpbmcuXG4iLCBfX2Z1bmNfXyk7Ci0JfQotI2VuZGlmCiB9CiAKIGludCB3MV9pbml0X25ldGxpbmsodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvdzFfbmV0bGluay5oIGIvZHJpdmVycy93MS93MV9uZXRsaW5rLmgKaW5kZXggNTYxMjJiOS4uMjdlOTUwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS93MV9uZXRsaW5rLmgKKysrIGIvZHJpdmVycy93MS93MV9uZXRsaW5rLmgKQEAgLTM0LDEyICszNCwxMyBAQAogCVcxX01BU1RFUl9SRU1PVkUsCiAJVzFfTUFTVEVSX0NNRCwKIAlXMV9TTEFWRV9DTUQsCisJVzFfTElTVF9NQVNURVJTLAogfTsKIAogc3RydWN0IHcxX25ldGxpbmtfbXNnCiB7CiAJX191OAkJCQl0eXBlOwotCV9fdTgJCQkJcmVzZXJ2ZWQ7CisJX191OAkJCQlzdGF0dXM7CiAJX191MTYJCQkJbGVuOwogCXVuaW9uIHsKIAkJX191OAkJCWlkWzhdOwpAQCAtNTEsMTAgKzUyLDE1IEBACiAJX191OAkJCQlkYXRhWzBdOwogfTsKIAotI2RlZmluZSBXMV9DTURfUkVBRAkJMHgwCi0jZGVmaW5lIFcxX0NNRF9XUklURQkJMHgxCi0jZGVmaW5lIFcxX0NNRF9TRUFSQ0gJCTB4MgotI2RlZmluZSBXMV9DTURfQUxBUk1fU0VBUkNICTB4MworZW51bSB3MV9jb21tYW5kcyB7CisJVzFfQ01EX1JFQUQgPSAwLAorCVcxX0NNRF9XUklURSwKKwlXMV9DTURfU0VBUkNILAorCVcxX0NNRF9BTEFSTV9TRUFSQ0gsCisJVzFfQ01EX1RPVUNILAorCVcxX0NNRF9SRVNFVCwKKwlXMV9DTURfTUFYLAorfTsKIAogc3RydWN0IHcxX25ldGxpbmtfY21kCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi9LY29uZmlnIGIvZHJpdmVycy94ZW4vS2NvbmZpZwppbmRleCA0Yjc1YTE2Li41MjYxODdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9LY29uZmlnCisrKyBiL2RyaXZlcnMveGVuL0tjb25maWcKQEAgLTE3LDMgKzE3LDI3IEBACiAJICBpcyBub3QgYWNjaWRlbnRhbGx5IHZpc2libGUgdG8gb3RoZXIgZG9tYWlucy4gIElzIGl0IG1vcmUKIAkgIHNlY3VyZSwgYnV0IHNsaWdodGx5IGxlc3MgZWZmaWNpZW50LgogCSAgSWYgaW4gZG91YnQsIHNheSB5ZXMuCisKK2NvbmZpZyBYRU5GUworCXRyaXN0YXRlICJYZW4gZmlsZXN5c3RlbSIKKwlkZXBlbmRzIG9uIFhFTgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoZSB4ZW4gZmlsZXN5c3RlbSBwcm92aWRlcyBhIHdheSBmb3IgZG9tYWlucyB0byBzaGFyZQorCSAgaW5mb3JtYXRpb24gd2l0aCBlYWNoIG90aGVyIGFuZCB3aXRoIHRoZSBoeXBlcnZpc29yLgorCSAgRm9yIGV4YW1wbGUsIGJ5IHJlYWRpbmcgYW5kIHdyaXRpbmcgdGhlICJ4ZW5idXMiIGZpbGUsIGd1ZXN0cworCSAgbWF5IHBhc3MgYXJiaXRyYXJ5IGluZm9ybWF0aW9uIHRvIHRoZSBpbml0aWFsIGRvbWFpbi4KKwkgIElmIGluIGRvdWJ0LCBzYXkgeWVzLgorCitjb25maWcgWEVOX0NPTVBBVF9YRU5GUworICAgICAgIGJvb2wgIkNyZWF0ZSBjb21wYXRpYmlsaXR5IG1vdW50IHBvaW50IC9wcm9jL3hlbiIKKyAgICAgICBkZXBlbmRzIG9uIFhFTkZTCisgICAgICAgZGVmYXVsdCB5CisgICAgICAgaGVscAorICAgICAgICAgVGhlIG9sZCB4ZW5zdG9yZSB1c2Vyc3BhY2UgdG9vbHMgZXhwZWN0IHRvIGZpbmQgInhlbmJ1cyIKKyAgICAgICAgIHVuZGVyIC9wcm9jL3hlbiwgYnV0ICJ4ZW5idXMiIGlzIG5vdyBmb3VuZCBhdCB0aGUgcm9vdCBvZiB0aGUKKyAgICAgICAgIHhlbmZzIGZpbGVzeXN0ZW0uICBTZWxlY3RpbmcgdGhpcyBjYXVzZXMgdGhlIGtlcm5lbCB0byBjcmVhdGUKKyAgICAgICAgIHRoZSBjb21wYXRpYmlsdHkgbW91bnQgcG9pbnQgL3Byb2MveGVuIGlmIGl0IGlzIHJ1bm5pbmcgb24KKyAgICAgICAgIGEgeGVuIHBsYXRmb3JtLgorICAgICAgICAgSWYgaW4gZG91YnQsIHNheSB5ZXMuCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL01ha2VmaWxlIGIvZHJpdmVycy94ZW4vTWFrZWZpbGUKaW5kZXggZDJhOGZkZi4uZmY4YWNjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4vTWFrZWZpbGUKKysrIGIvZHJpdmVycy94ZW4vTWFrZWZpbGUKQEAgLTEsNSArMSw3IEBACiBvYmoteQkrPSBncmFudC10YWJsZS5vIGZlYXR1cmVzLm8gZXZlbnRzLm8gbWFuYWdlLm8KIG9iai15CSs9IHhlbmJ1cy8KKwogb2JqLSQoQ09ORklHX0hPVFBMVUdfQ1BVKQkrPSBjcHVfaG90cGx1Zy5vCiBvYmotJChDT05GSUdfWEVOX1hFTkNPTU0pCSs9IHhlbmNvbW0ubwogb2JqLSQoQ09ORklHX1hFTl9CQUxMT09OKQkrPSBiYWxsb29uLm8KK29iai0kKENPTkZJR19YRU5GUykJCSs9IHhlbmZzLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfY2xpZW50LmMgYi9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX2NsaWVudC5jCmluZGV4IDk2NzhiM2UuLjkyYTFlZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfY2xpZW50LmMKKysrIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19jbGllbnQuYwpAQCAtMTM2LDcgKzEzNiw2IEBACiAvKioKICAqIHhlbmJ1c19zd2l0Y2hfc3RhdGUKICAqIEBkZXY6IHhlbmJ1cyBkZXZpY2UKLSAqIEB4YnQ6IHRyYW5zYWN0aW9uIGhhbmRsZQogICogQHN0YXRlOiBuZXcgc3RhdGUKICAqCiAgKiBBZHZlcnRpc2UgaW4gdGhlIHN0b3JlIGEgY2hhbmdlIG9mIHRoZSBnaXZlbiBkcml2ZXIgdG8gdGhlIGdpdmVuIG5ld19zdGF0ZS4KQEAgLTI2Nyw3ICsyNjYsNyBAQAogICogQGZtdDogZXJyb3IgbWVzc2FnZSBmb3JtYXQKICAqCiAgKiBFcXVpdmFsZW50IHRvIHhlbmJ1c19kZXZfZXJyb3IoZGV2LCBlcnIsIGZtdCwgYXJncyksIGZvbGxvd2VkIGJ5Ci0gKiB4ZW5idXNfc3dpdGNoX3N0YXRlKGRldiwgTlVMTCwgWGVuYnVzU3RhdGVDbG9zaW5nKSB0byBzY2hlZHVsZSBhbiBvcmRlcmx5CisgKiB4ZW5idXNfc3dpdGNoX3N0YXRlKGRldiwgWGVuYnVzU3RhdGVDbG9zaW5nKSB0byBzY2hlZHVsZSBhbiBvcmRlcmx5CiAgKiBjbG9zZWRvd24gb2YgdGhpcyBkcml2ZXIgYW5kIGl0cyBwZWVyLgogICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmUuYyBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmUuYwppbmRleCA3ZjI0YTk4Li43NzNkMWNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlLmMKKysrIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZS5jCkBAIC00MCw2ICs0MCw3IEBACiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KICNpbmNsdWRlIDxsaW51eC9mY250bC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CkBAIC01NSw3ICs1NiwxMCBAQAogI2luY2x1ZGUgInhlbmJ1c19jb21tcy5oIgogI2luY2x1ZGUgInhlbmJ1c19wcm9iZS5oIgogCisKIGludCB4ZW5fc3RvcmVfZXZ0Y2huOworRVhQT1JUX1NZTUJPTCh4ZW5fc3RvcmVfZXZ0Y2huKTsKKwogc3RydWN0IHhlbnN0b3JlX2RvbWFpbl9pbnRlcmZhY2UgKnhlbl9zdG9yZV9pbnRlcmZhY2U7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyB4ZW5fc3RvcmVfbWZuOwogCkBAIC05OSwxNSArMTAzLDE1IEBACiB9CiAKIC8qIGRldmljZS88dHlwZT4vPGlkPiA9PiA8dHlwZT4tPGlkPiAqLwotc3RhdGljIGludCBmcm9udGVuZF9idXNfaWQoY2hhciBidXNfaWRbQlVTX0lEX1NJWkVdLCBjb25zdCBjaGFyICpub2RlbmFtZSkKK3N0YXRpYyBpbnQgZnJvbnRlbmRfYnVzX2lkKGNoYXIgYnVzX2lkW1hFTl9CVVNfSURfU0laRV0sIGNvbnN0IGNoYXIgKm5vZGVuYW1lKQogewogCW5vZGVuYW1lID0gc3RyY2hyKG5vZGVuYW1lLCAnLycpOwotCWlmICghbm9kZW5hbWUgfHwgc3RybGVuKG5vZGVuYW1lICsgMSkgPj0gQlVTX0lEX1NJWkUpIHsKKwlpZiAoIW5vZGVuYW1lIHx8IHN0cmxlbihub2RlbmFtZSArIDEpID49IFhFTl9CVVNfSURfU0laRSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJYRU5CVVM6IGJhZCBmcm9udGVuZCAlc1xuIiwgbm9kZW5hbWUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlzdHJsY3B5KGJ1c19pZCwgbm9kZW5hbWUgKyAxLCBCVVNfSURfU0laRSk7CisJc3RybGNweShidXNfaWQsIG5vZGVuYW1lICsgMSwgWEVOX0JVU19JRF9TSVpFKTsKIAlpZiAoIXN0cmNocihidXNfaWQsICcvJykpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiWEVOQlVTOiBidXNfaWQgJXMgbm8gc2xhc2hcbiIsIGJ1c19pZCk7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTY2LDYgKzE3MCw5IEBACiAJcmV0dXJuIHJlYWRfb3RoZXJlbmRfZGV0YWlscyh4ZW5kZXYsICJiYWNrZW5kLWlkIiwgImJhY2tlbmQiKTsKIH0KIAorc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHhlbmJ1c19kZXZfYXR0cnNbXSA9IHsKKwlfX0FUVFJfTlVMTAorfTsKIAogLyogQnVzIHR5cGUgZm9yIGZyb250ZW5kIGRyaXZlcnMuICovCiBzdGF0aWMgc3RydWN0IHhlbl9idXNfdHlwZSB4ZW5idXNfZnJvbnRlbmQgPSB7CkBAIC0xNzQsMTIgKzE4MSwxMyBAQAogCS5nZXRfYnVzX2lkID0gZnJvbnRlbmRfYnVzX2lkLAogCS5wcm9iZSA9IHhlbmJ1c19wcm9iZV9mcm9udGVuZCwKIAkuYnVzID0gewotCQkubmFtZSAgICAgPSAieGVuIiwKLQkJLm1hdGNoICAgID0geGVuYnVzX21hdGNoLAotCQkudWV2ZW50ICAgPSB4ZW5idXNfdWV2ZW50LAotCQkucHJvYmUgICAgPSB4ZW5idXNfZGV2X3Byb2JlLAotCQkucmVtb3ZlICAgPSB4ZW5idXNfZGV2X3JlbW92ZSwKLQkJLnNodXRkb3duID0geGVuYnVzX2Rldl9zaHV0ZG93biwKKwkJLm5hbWUgICAgICA9ICJ4ZW4iLAorCQkubWF0Y2ggICAgID0geGVuYnVzX21hdGNoLAorCQkudWV2ZW50ICAgID0geGVuYnVzX3VldmVudCwKKwkJLnByb2JlICAgICA9IHhlbmJ1c19kZXZfcHJvYmUsCisJCS5yZW1vdmUgICAgPSB4ZW5idXNfZGV2X3JlbW92ZSwKKwkJLnNodXRkb3duICA9IHhlbmJ1c19kZXZfc2h1dGRvd24sCisJCS5kZXZfYXR0cnMgPSB4ZW5idXNfZGV2X2F0dHJzLAogCX0sCiB9OwogCkBAIC00NjAsNiArNDY4LDcgQEAKIAkJICAgICAgY29uc3QgY2hhciAqdHlwZSwKIAkJICAgICAgY29uc3QgY2hhciAqbm9kZW5hbWUpCiB7CisJY2hhciBkZXZuYW1lW1hFTl9CVVNfSURfU0laRV07CiAJaW50IGVycjsKIAlzdHJ1Y3QgeGVuYnVzX2RldmljZSAqeGVuZGV2OwogCXNpemVfdCBzdHJpbmdsZW47CkBAIC00OTQsMTAgKzUwMywxMiBAQAogCXhlbmRldi0+ZGV2LmJ1cyA9ICZidXMtPmJ1czsKIAl4ZW5kZXYtPmRldi5yZWxlYXNlID0geGVuYnVzX2Rldl9yZWxlYXNlOwogCi0JZXJyID0gYnVzLT5nZXRfYnVzX2lkKHhlbmRldi0+ZGV2LmJ1c19pZCwgeGVuZGV2LT5ub2RlbmFtZSk7CisJZXJyID0gYnVzLT5nZXRfYnVzX2lkKGRldm5hbWUsIHhlbmRldi0+bm9kZW5hbWUpOwogCWlmIChlcnIpCiAJCWdvdG8gZmFpbDsKIAorCWRldl9zZXRfbmFtZSgmeGVuZGV2LT5kZXYsIGRldm5hbWUpOworCiAJLyogUmVnaXN0ZXIgd2l0aCBnZW5lcmljIGRldmljZSBmcmFtZXdvcmsuICovCiAJZXJyID0gZGV2aWNlX3JlZ2lzdGVyKCZ4ZW5kZXYtPmRldik7CiAJaWYgKGVycikKQEAgLTYxMSw3ICs2MjIsNyBAQAogewogCWludCBleGlzdHMsIHJvb3RsZW47CiAJc3RydWN0IHhlbmJ1c19kZXZpY2UgKmRldjsKLQljaGFyIHR5cGVbQlVTX0lEX1NJWkVdOworCWNoYXIgdHlwZVtYRU5fQlVTX0lEX1NJWkVdOwogCWNvbnN0IGNoYXIgKnAsICpyb290OwogCiAJaWYgKGNoYXJfY291bnQobm9kZSwgJy8nKSA8IDIpCkBAIC02MjUsOCArNjM2LDggQEAKIAogCS8qIGJhY2tlbmQvPHR5cGU+Ly4uLiBvciBkZXZpY2UvPHR5cGU+Ly4uLiAqLwogCXAgPSBzdHJjaHIobm9kZSwgJy8nKSArIDE7Ci0Jc25wcmludGYodHlwZSwgQlVTX0lEX1NJWkUsICIlLipzIiwgKGludClzdHJjc3BuKHAsICIvIiksIHApOwotCXR5cGVbQlVTX0lEX1NJWkUtMV0gPSAnXDAnOworCXNucHJpbnRmKHR5cGUsIFhFTl9CVVNfSURfU0laRSwgIiUuKnMiLCAoaW50KXN0cmNzcG4ocCwgIi8iKSwgcCk7CisJdHlwZVtYRU5fQlVTX0lEX1NJWkUtMV0gPSAnXDAnOwogCiAJcm9vdGxlbiA9IHN0cnNlcF9sZW4obm9kZSwgJy8nLCBidXMtPmxldmVscyk7CiAJaWYgKHJvb3RsZW4gPCAwKQpAQCAtNjc0LDcgKzY4NSw3IEBACiAJCWVyciA9IGRydi0+c3VzcGVuZCh4ZGV2KTsKIAlpZiAoZXJyKQogCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAgICAieGVuYnVzOiBzdXNwZW5kICVzIGZhaWxlZDogJWlcbiIsIGRldi0+YnVzX2lkLCBlcnIpOworCQkgICAgICAgInhlbmJ1czogc3VzcGVuZCAlcyBmYWlsZWQ6ICVpXG4iLCBkZXZfbmFtZShkZXYpLCBlcnIpOwogCXJldHVybiAwOwogfQogCkBAIC02OTUsNyArNzA2LDcgQEAKIAlpZiAoZXJyKQogCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCSAgICAgICAieGVuYnVzOiBzdXNwZW5kX2NhbmNlbCAlcyBmYWlsZWQ6ICVpXG4iLAotCQkgICAgICAgZGV2LT5idXNfaWQsIGVycik7CisJCSAgICAgICBkZXZfbmFtZShkZXYpLCBlcnIpOwogCXJldHVybiAwOwogfQogCkBAIC03MTcsNyArNzI4LDcgQEAKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJICAgICAgICJ4ZW5idXM6IHJlc3VtZSAodGFsa190b19vdGhlcmVuZCkgJXMgZmFpbGVkOiAlaVxuIiwKLQkJICAgICAgIGRldi0+YnVzX2lkLCBlcnIpOworCQkgICAgICAgZGV2X25hbWUoZGV2KSwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTcyOCw3ICs3MzksNyBAQAogCQlpZiAoZXJyKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCQkgICAgICAgInhlbmJ1czogcmVzdW1lICVzIGZhaWxlZDogJWlcbiIsCi0JCQkgICAgICAgZGV2LT5idXNfaWQsIGVycik7CisJCQkgICAgICAgZGV2X25hbWUoZGV2KSwgZXJyKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAl9CkBAIC03MzcsNyArNzQ4LDcgQEAKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJICAgICAgICJ4ZW5idXNfcHJvYmU6IHJlc3VtZSAod2F0Y2hfb3RoZXJlbmQpICVzIGZhaWxlZDogIgotCQkgICAgICAgIiVkLlxuIiwgZGV2LT5idXNfaWQsIGVycik7CisJCSAgICAgICAiJWQuXG4iLCBkZXZfbmFtZShkZXYpLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtODQ5LDYgKzg2MCwxNCBAQAogCWlmICgheGVuX2luaXRpYWxfZG9tYWluKCkpCiAJCXhlbmJ1c19wcm9iZShOVUxMKTsKIAorI2lmZGVmIENPTkZJR19YRU5fQ09NUEFUX1hFTkZTCisJLyoKKwkgKiBDcmVhdGUgeGVuZnMgbW91bnRwb2ludCBpbiAvcHJvYyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoCisJICogdXRpbGl0aWVzIHRoYXQgZXhwZWN0IHRvIGZpbmQgInhlbmJ1cyIgdW5kZXIgIi9wcm9jL3hlbiIuCisJICovCisJcHJvY19ta2RpcigieGVuIiwgTlVMTCk7CisjZW5kaWYKKwogCXJldHVybiAwOwogCiAgIG91dF91bnJlZ19iYWNrOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZS5oIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZS5oCmluZGV4IGUwOWIxOTQuLjZjNWUzMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmUuaAorKysgYi9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlLmgKQEAgLTM0LDYgKzM0LDggQEAKICNpZm5kZWYgX1hFTkJVU19QUk9CRV9ICiAjZGVmaW5lIF9YRU5CVVNfUFJPQkVfSAogCisjZGVmaW5lIFhFTl9CVVNfSURfU0laRQkJCTIwCisKICNpZmRlZiBDT05GSUdfWEVOX0JBQ0tFTkQKIGV4dGVybiB2b2lkIHhlbmJ1c19iYWNrZW5kX3N1c3BlbmQoaW50ICgqZm4pKHN0cnVjdCBkZXZpY2UgKiwgdm9pZCAqKSk7CiBleHRlcm4gdm9pZCB4ZW5idXNfYmFja2VuZF9yZXN1bWUoaW50ICgqZm4pKHN0cnVjdCBkZXZpY2UgKiwgdm9pZCAqKSk7CkBAIC01Miw3ICs1NCw3IEBACiB7CiAJY2hhciAqcm9vdDsKIAl1bnNpZ25lZCBpbnQgbGV2ZWxzOwotCWludCAoKmdldF9idXNfaWQpKGNoYXIgYnVzX2lkW0JVU19JRF9TSVpFXSwgY29uc3QgY2hhciAqbm9kZW5hbWUpOworCWludCAoKmdldF9idXNfaWQpKGNoYXIgYnVzX2lkW1hFTl9CVVNfSURfU0laRV0sIGNvbnN0IGNoYXIgKm5vZGVuYW1lKTsKIAlpbnQgKCpwcm9iZSkoY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqZGlyKTsKIAlzdHJ1Y3QgYnVzX3R5cGUgYnVzOwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfeHMuYyBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfeHMuYwppbmRleCA3ZjJmOTFjLi5lMzI1ZWFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3hzLmMKKysrIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c194cy5jCkBAIC0xODQsNiArMTg0LDcgQEAKIAogCXJldHVybiByZXQ7CiB9CitFWFBPUlRfU1lNQk9MKHhlbmJ1c19kZXZfcmVxdWVzdF9hbmRfcmVwbHkpOwogCiAvKiBTZW5kIG1lc3NhZ2UgdG8geHMsIGdldCBrbWFsbG9jJ2VkIHJlcGx5LiAgRVJSX1BUUigpIG9uIGVycm9yLiAqLwogc3RhdGljIHZvaWQgKnhzX3RhbGt2KHN0cnVjdCB4ZW5idXNfdHJhbnNhY3Rpb24gdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3hlbmZzL01ha2VmaWxlIGIvZHJpdmVycy94ZW4veGVuZnMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUyNzVjMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMveGVuL3hlbmZzL01ha2VmaWxlCkBAIC0wLDAgKzEsMyBAQAorb2JqLSQoQ09ORklHX1hFTkZTKSArPSB4ZW5mcy5vCisKK3hlbmZzLW9ianMgPSBzdXBlci5vIHhlbmJ1cy5vClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4veGVuZnMvc3VwZXIuYyBiL2RyaXZlcnMveGVuL3hlbmZzL3N1cGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE1NzQxYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMveGVuL3hlbmZzL3N1cGVyLmMKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqICB4ZW5mcy5jIC0gYSBmaWxlc3lzdGVtIGZvciBwYXNzaW5nIGluZm8gYmV0d2VlbiB0aGUgYSBkb21haW4gYW5kCisgKiAgdGhlIGh5cGVydmlzb3IuCisgKgorICogMjAwOC0xMC0wNyAgQWxleCBaZWZmZXJ0dCAgICBSZXBsYWNlZCAvcHJvYy94ZW4veGVuYnVzIHdpdGggeGVuZnMgZmlsZXN5c3RlbQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgL3Byb2MveGVuIGNvbXBhdGliaWxpdHkgbW91bnQgcG9pbnQuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR1cm5lZCB4ZW5mcyBpbnRvIGEgbG9hZGFibGUgbW9kdWxlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbWFnaWMuaD4KKworI2luY2x1ZGUgInhlbmZzLmgiCisKKyNpbmNsdWRlIDxhc20veGVuL2h5cGVydmlzb3IuaD4KKworTU9EVUxFX0RFU0NSSVBUSU9OKCJYZW4gZmlsZXN5c3RlbSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IHhlbmZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdGF0aWMgc3RydWN0IHRyZWVfZGVzY3IgeGVuZnNfZmlsZXNbXSA9IHsKKwkJWzJdID0geyJ4ZW5idXMiLCAmeGVuYnVzX2ZpbGVfb3BzLCBTX0lSVVNSfFNfSVdVU1J9LAorCQl7IiJ9LAorCX07CisKKwlyZXR1cm4gc2ltcGxlX2ZpbGxfc3VwZXIoc2IsIFhFTkZTX1NVUEVSX01BR0lDLCB4ZW5mc19maWxlcyk7Cit9CisKK3N0YXRpYyBpbnQgeGVuZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCQkJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwKKwkJCXZvaWQgKmRhdGEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQoreworCXJldHVybiBnZXRfc2Jfc2luZ2xlKGZzX3R5cGUsIGZsYWdzLCBkYXRhLCB4ZW5mc19maWxsX3N1cGVyLCBtbnQpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgeGVuZnNfdHlwZSA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkubmFtZSA9CQkieGVuZnMiLAorCS5nZXRfc2IgPQl4ZW5mc19nZXRfc2IsCisJLmtpbGxfc2IgPQlraWxsX2xpdHRlcl9zdXBlciwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHhlbmZzX2luaXQodm9pZCkKK3sKKwlpZiAoeGVuX3B2X2RvbWFpbigpKQorCQlyZXR1cm4gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmeGVuZnNfdHlwZSk7CisKKwlwcmludGsoS0VSTl9JTkZPICJYRU5GUzogbm90IHJlZ2lzdGVyaW5nIGZpbGVzeXN0ZW0gb24gbm9uLXhlbiBwbGF0Zm9ybVxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB4ZW5mc19leGl0KHZvaWQpCit7CisJaWYgKHhlbl9wdl9kb21haW4oKSkKKwkJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZ4ZW5mc190eXBlKTsKK30KKworbW9kdWxlX2luaXQoeGVuZnNfaW5pdCk7Cittb2R1bGVfZXhpdCh4ZW5mc19leGl0KTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4veGVuZnMveGVuYnVzLmMgYi9kcml2ZXJzL3hlbi94ZW5mcy94ZW5idXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzVhNGM1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy94ZW4veGVuZnMveGVuYnVzLmMKQEAgLTAsMCArMSw1OTMgQEAKKy8qCisgKiBEcml2ZXIgZ2l2aW5nIHVzZXItc3BhY2UgYWNjZXNzIHRvIHRoZSBrZXJuZWwncyB4ZW5idXMgY29ubmVjdGlvbgorICogdG8geGVuc3RvcmUuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBDaHJpc3RpYW4gTGltcGFjaAorICogQ29weXJpZ2h0IChjKSAyMDA1LCBSdXN0eSBSdXNzZWxsLCBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBvciwgd2hlbiBkaXN0cmlidXRlZAorICogc2VwYXJhdGVseSBmcm9tIHRoZSBMaW51eCBrZXJuZWwgb3IgaW5jb3Jwb3JhdGVkIGludG8gb3RoZXIKKyAqIHNvZnR3YXJlIHBhY2thZ2VzLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgbGljZW5zZToKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvdXJjZSBmaWxlICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksCisgKiBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwKKyAqIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIENoYW5nZXM6CisgKiAyMDA4LTEwLTA3ICBBbGV4IFplZmZlcnR0ICAgIFJlcGxhY2VkIC9wcm9jL3hlbi94ZW5idXMgd2l0aCB4ZW5mcyBmaWxlc3lzdGVtCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCAvcHJvYy94ZW4gY29tcGF0aWJpbGl0eSBtb3VudCBwb2ludC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHVybmVkIHhlbmZzIGludG8gYSBsb2FkYWJsZSBtb2R1bGUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdWlvLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKworI2luY2x1ZGUgInhlbmZzLmgiCisjaW5jbHVkZSAiLi4veGVuYnVzL3hlbmJ1c19jb21tcy5oIgorCisjaW5jbHVkZSA8eGVuL3hlbmJ1cy5oPgorI2luY2x1ZGUgPGFzbS94ZW4vaHlwZXJ2aXNvci5oPgorCisvKgorICogQW4gZWxlbWVudCBvZiBhIGxpc3Qgb2Ygb3V0c3RhbmRpbmcgdHJhbnNhY3Rpb25zLCBmb3Igd2hpY2ggd2UncmUKKyAqIHN0aWxsIHdhaXRpbmcgYSByZXBseS4KKyAqLworc3RydWN0IHhlbmJ1c190cmFuc2FjdGlvbl9ob2xkZXIgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgeGVuYnVzX3RyYW5zYWN0aW9uIGhhbmRsZTsKK307CisKKy8qCisgKiBBIGJ1ZmZlciBvZiBkYXRhIG9uIHRoZSBxdWV1ZS4KKyAqLworc3RydWN0IHJlYWRfYnVmZmVyIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJdW5zaWduZWQgaW50IGNvbnM7CisJdW5zaWduZWQgaW50IGxlbjsKKwljaGFyIG1zZ1tdOworfTsKKworc3RydWN0IHhlbmJ1c19maWxlX3ByaXYgeworCS8qCisJICogbXNnYnVmZmVyX211dGV4IGlzIGhlbGQgd2hpbGUgcGFydGlhbCByZXF1ZXN0cyBhcmUgYnVpbHQgdXAKKwkgKiBhbmQgY29tcGxldGUgcmVxdWVzdHMgYXJlIGFjdGVkIG9uLiAgSXQgdGhlcmVmb3JlIHByb3RlY3RzCisJICogdGhlICJ0cmFuc2FjdGlvbnMiIGFuZCAid2F0Y2hlcyIgbGlzdHMsIGFuZCB0aGUgcGFydGlhbAorCSAqIHJlcXVlc3QgbGVuZ3RoIGFuZCBidWZmZXIuCisJICoKKwkgKiByZXBseV9tdXRleCBwcm90ZWN0cyB0aGUgcmVwbHkgYmVpbmcgYnVpbHQgdXAgdG8gcmV0dXJuIHRvCisJICogdXNlcm1vZGUuICBJdCBuZXN0cyBpbnNpZGUgbXNnYnVmZmVyX211dGV4IGJ1dCBtYXkgYmUgaGVsZAorCSAqIGFsb25lIGR1cmluZyBhIHdhdGNoIGNhbGxiYWNrLgorCSAqLworCXN0cnVjdCBtdXRleCBtc2didWZmZXJfbXV0ZXg7CisKKwkvKiBJbi1wcm9ncmVzcyB0cmFuc2FjdGlvbnMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHRyYW5zYWN0aW9uczsKKworCS8qIEFjdGl2ZSB3YXRjaGVzLiAqLworCXN0cnVjdCBsaXN0X2hlYWQgd2F0Y2hlczsKKworCS8qIFBhcnRpYWwgcmVxdWVzdC4gKi8KKwl1bnNpZ25lZCBpbnQgbGVuOworCXVuaW9uIHsKKwkJc3RydWN0IHhzZF9zb2NrbXNnIG1zZzsKKwkJY2hhciBidWZmZXJbUEFHRV9TSVpFXTsKKwl9IHU7CisKKwkvKiBSZXNwb25zZSBxdWV1ZS4gKi8KKwlzdHJ1Y3QgbXV0ZXggcmVwbHlfbXV0ZXg7CisJc3RydWN0IGxpc3RfaGVhZCByZWFkX2J1ZmZlcnM7CisJd2FpdF9xdWV1ZV9oZWFkX3QgcmVhZF93YWl0cTsKKworfTsKKworLyogUmVhZCBvdXQgYW55IHJhdyB4ZW5idXMgbWVzc2FnZXMgcXVldWVkIHVwLiAqLworc3RhdGljIHNzaXplX3QgeGVuYnVzX2ZpbGVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCSAgICAgICBjaGFyIF9fdXNlciAqdWJ1ZiwKKwkJCSAgICAgICBzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHhlbmJ1c19maWxlX3ByaXYgKnUgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHJlYWRfYnVmZmVyICpyYjsKKwl1bnNpZ25lZCBpOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZ1LT5yZXBseV9tdXRleCk7CisJd2hpbGUgKGxpc3RfZW1wdHkoJnUtPnJlYWRfYnVmZmVycykpIHsKKwkJbXV0ZXhfdW5sb2NrKCZ1LT5yZXBseV9tdXRleCk7CisJCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSh1LT5yZWFkX3dhaXRxLAorCQkJCQkgICAgICAgIWxpc3RfZW1wdHkoJnUtPnJlYWRfYnVmZmVycykpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJbXV0ZXhfbG9jaygmdS0+cmVwbHlfbXV0ZXgpOworCX0KKworCXJiID0gbGlzdF9lbnRyeSh1LT5yZWFkX2J1ZmZlcnMubmV4dCwgc3RydWN0IHJlYWRfYnVmZmVyLCBsaXN0KTsKKwlpID0gMDsKKwl3aGlsZSAoaSA8IGxlbikgeworCQl1bnNpZ25lZCBzeiA9IG1pbigodW5zaWduZWQpbGVuIC0gaSwgcmItPmxlbiAtIHJiLT5jb25zKTsKKworCQlyZXQgPSBjb3B5X3RvX3VzZXIodWJ1ZiArIGksICZyYi0+bXNnW3JiLT5jb25zXSwgc3opOworCisJCWkgKz0gc3ogLSByZXQ7CisJCXJiLT5jb25zICs9IHN6IC0gcmV0OworCisJCWlmIChyZXQgIT0gc3opIHsKKwkJCWlmIChpID09IDApCisJCQkJaSA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qIENsZWFyIG91dCBidWZmZXIgaWYgaXQgaGFzIGJlZW4gY29uc3VtZWQgKi8KKwkJaWYgKHJiLT5jb25zID09IHJiLT5sZW4pIHsKKwkJCWxpc3RfZGVsKCZyYi0+bGlzdCk7CisJCQlrZnJlZShyYik7CisJCQlpZiAobGlzdF9lbXB0eSgmdS0+cmVhZF9idWZmZXJzKSkKKwkJCQlicmVhazsKKwkJCXJiID0gbGlzdF9lbnRyeSh1LT5yZWFkX2J1ZmZlcnMubmV4dCwKKwkJCQkJc3RydWN0IHJlYWRfYnVmZmVyLCBsaXN0KTsKKwkJfQorCX0KKworb3V0OgorCW11dGV4X3VubG9jaygmdS0+cmVwbHlfbXV0ZXgpOworCXJldHVybiBpOworfQorCisvKgorICogQWRkIGEgYnVmZmVyIHRvIHRoZSBxdWV1ZS4gIENhbGxlciBtdXN0IGhvbGQgdGhlIGFwcHJvcHJpYXRlIGxvY2sKKyAqIGlmIHRoZSBxdWV1ZSBpcyBub3QgbG9jYWwuICAoQ29tbW9ubHkgdGhlIGNhbGxlciB3aWxsIGJ1aWxkIHVwCisgKiBtdWx0aXBsZSBxdWV1ZWQgYnVmZmVycyBvbiBhIHRlbXBvcmFyeSBsb2NhbCBsaXN0LCBhbmQgdGhlbiBhZGQgaXQKKyAqIHRvIHRoZSBhcHByb3ByaWF0ZSBsaXN0IHVuZGVyIGxvY2sgb25jZSBhbGwgdGhlIGJ1ZmZlcnMgaGF2ZSBlZW4KKyAqIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQuKQorICovCitzdGF0aWMgaW50IHF1ZXVlX3JlcGx5KHN0cnVjdCBsaXN0X2hlYWQgKnF1ZXVlLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCByZWFkX2J1ZmZlciAqcmI7CisKKwlpZiAobGVuID09IDApCisJCXJldHVybiAwOworCisJcmIgPSBrbWFsbG9jKHNpemVvZigqcmIpICsgbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAocmIgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyYi0+Y29ucyA9IDA7CisJcmItPmxlbiA9IGxlbjsKKworCW1lbWNweShyYi0+bXNnLCBkYXRhLCBsZW4pOworCisJbGlzdF9hZGRfdGFpbCgmcmItPmxpc3QsIHF1ZXVlKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZyZWUgYWxsIHRoZSByZWFkX2J1ZmZlciBzIG9uIGEgbGlzdC4KKyAqIENhbGxlciBtdXN0IGhhdmUgc29sZSByZWZlcmVuY2UgdG8gbGlzdC4KKyAqLworc3RhdGljIHZvaWQgcXVldWVfY2xlYW51cChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQoreworCXN0cnVjdCByZWFkX2J1ZmZlciAqcmI7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkobGlzdCkpIHsKKwkJcmIgPSBsaXN0X2VudHJ5KGxpc3QtPm5leHQsIHN0cnVjdCByZWFkX2J1ZmZlciwgbGlzdCk7CisJCWxpc3RfZGVsKGxpc3QtPm5leHQpOworCQlrZnJlZShyYik7CisJfQorfQorCitzdHJ1Y3Qgd2F0Y2hfYWRhcHRlciB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCB4ZW5idXNfd2F0Y2ggd2F0Y2g7CisJc3RydWN0IHhlbmJ1c19maWxlX3ByaXYgKmRldl9kYXRhOworCWNoYXIgKnRva2VuOworfTsKKworc3RhdGljIHZvaWQgZnJlZV93YXRjaF9hZGFwdGVyKHN0cnVjdCB3YXRjaF9hZGFwdGVyICp3YXRjaCkKK3sKKwlrZnJlZSh3YXRjaC0+d2F0Y2gubm9kZSk7CisJa2ZyZWUod2F0Y2gtPnRva2VuKTsKKwlrZnJlZSh3YXRjaCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgd2F0Y2hfYWRhcHRlciAqYWxsb2Nfd2F0Y2hfYWRhcHRlcihjb25zdCBjaGFyICpwYXRoLAorCQkJCQkJIGNvbnN0IGNoYXIgKnRva2VuKQoreworCXN0cnVjdCB3YXRjaF9hZGFwdGVyICp3YXRjaDsKKworCXdhdGNoID0ga3phbGxvYyhzaXplb2YoKndhdGNoKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHdhdGNoID09IE5VTEwpCisJCWdvdG8gb3V0X2ZhaWw7CisKKwl3YXRjaC0+d2F0Y2gubm9kZSA9IGtzdHJkdXAocGF0aCwgR0ZQX0tFUk5FTCk7CisJaWYgKHdhdGNoLT53YXRjaC5ub2RlID09IE5VTEwpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwl3YXRjaC0+dG9rZW4gPSBrc3RyZHVwKHRva2VuLCBHRlBfS0VSTkVMKTsKKwlpZiAod2F0Y2gtPnRva2VuID09IE5VTEwpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlyZXR1cm4gd2F0Y2g7CisKK291dF9mcmVlOgorCWZyZWVfd2F0Y2hfYWRhcHRlcih3YXRjaCk7CisKK291dF9mYWlsOgorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCB3YXRjaF9maXJlZChzdHJ1Y3QgeGVuYnVzX3dhdGNoICp3YXRjaCwKKwkJCWNvbnN0IGNoYXIgKip2ZWMsCisJCQl1bnNpZ25lZCBpbnQgbGVuKQoreworCXN0cnVjdCB3YXRjaF9hZGFwdGVyICphZGFwOworCXN0cnVjdCB4c2Rfc29ja21zZyBoZHI7CisJY29uc3QgY2hhciAqcGF0aCwgKnRva2VuOworCWludCBwYXRoX2xlbiwgdG9rX2xlbiwgYm9keV9sZW4sIGRhdGFfbGVuID0gMDsKKwlpbnQgcmV0OworCUxJU1RfSEVBRChzdGFnaW5nX3EpOworCisJYWRhcCA9IGNvbnRhaW5lcl9vZih3YXRjaCwgc3RydWN0IHdhdGNoX2FkYXB0ZXIsIHdhdGNoKTsKKworCXBhdGggPSB2ZWNbWFNfV0FUQ0hfUEFUSF07CisJdG9rZW4gPSBhZGFwLT50b2tlbjsKKworCXBhdGhfbGVuID0gc3RybGVuKHBhdGgpICsgMTsKKwl0b2tfbGVuID0gc3RybGVuKHRva2VuKSArIDE7CisJaWYgKGxlbiA+IDIpCisJCWRhdGFfbGVuID0gdmVjW2xlbl0gLSB2ZWNbMl0gKyAxOworCWJvZHlfbGVuID0gcGF0aF9sZW4gKyB0b2tfbGVuICsgZGF0YV9sZW47CisKKwloZHIudHlwZSA9IFhTX1dBVENIX0VWRU5UOworCWhkci5sZW4gPSBib2R5X2xlbjsKKworCW11dGV4X2xvY2soJmFkYXAtPmRldl9kYXRhLT5yZXBseV9tdXRleCk7CisKKwlyZXQgPSBxdWV1ZV9yZXBseSgmc3RhZ2luZ19xLCAmaGRyLCBzaXplb2YoaGRyKSk7CisJaWYgKCFyZXQpCisJCXJldCA9IHF1ZXVlX3JlcGx5KCZzdGFnaW5nX3EsIHBhdGgsIHBhdGhfbGVuKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gcXVldWVfcmVwbHkoJnN0YWdpbmdfcSwgdG9rZW4sIHRva19sZW4pOworCWlmICghcmV0ICYmIGxlbiA+IDIpCisJCXJldCA9IHF1ZXVlX3JlcGx5KCZzdGFnaW5nX3EsIHZlY1syXSwgZGF0YV9sZW4pOworCisJaWYgKCFyZXQpIHsKKwkJLyogc3VjY2VzczogcGFzcyByZXBseSBsaXN0IG9udG8gd2F0Y2hlciAqLworCQlsaXN0X3NwbGljZV90YWlsKCZzdGFnaW5nX3EsICZhZGFwLT5kZXZfZGF0YS0+cmVhZF9idWZmZXJzKTsKKwkJd2FrZV91cCgmYWRhcC0+ZGV2X2RhdGEtPnJlYWRfd2FpdHEpOworCX0gZWxzZQorCQlxdWV1ZV9jbGVhbnVwKCZzdGFnaW5nX3EpOworCisJbXV0ZXhfdW5sb2NrKCZhZGFwLT5kZXZfZGF0YS0+cmVwbHlfbXV0ZXgpOworfQorCitzdGF0aWMgaW50IHhlbmJ1c193cml0ZV90cmFuc2FjdGlvbih1bnNpZ25lZCBtc2dfdHlwZSwKKwkJCQkgICAgc3RydWN0IHhlbmJ1c19maWxlX3ByaXYgKnUpCit7CisJaW50IHJjLCByZXQ7CisJdm9pZCAqcmVwbHk7CisJc3RydWN0IHhlbmJ1c190cmFuc2FjdGlvbl9ob2xkZXIgKnRyYW5zID0gTlVMTDsKKwlMSVNUX0hFQUQoc3RhZ2luZ19xKTsKKworCWlmIChtc2dfdHlwZSA9PSBYU19UUkFOU0FDVElPTl9TVEFSVCkgeworCQl0cmFucyA9IGttYWxsb2Moc2l6ZW9mKCp0cmFucyksIEdGUF9LRVJORUwpOworCQlpZiAoIXRyYW5zKSB7CisJCQlyYyA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCXJlcGx5ID0geGVuYnVzX2Rldl9yZXF1ZXN0X2FuZF9yZXBseSgmdS0+dS5tc2cpOworCWlmIChJU19FUlIocmVwbHkpKSB7CisJCWtmcmVlKHRyYW5zKTsKKwkJcmMgPSBQVFJfRVJSKHJlcGx5KTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKG1zZ190eXBlID09IFhTX1RSQU5TQUNUSU9OX1NUQVJUKSB7CisJCXRyYW5zLT5oYW5kbGUuaWQgPSBzaW1wbGVfc3RydG91bChyZXBseSwgTlVMTCwgMCk7CisKKwkJbGlzdF9hZGQoJnRyYW5zLT5saXN0LCAmdS0+dHJhbnNhY3Rpb25zKTsKKwl9IGVsc2UgaWYgKG1zZ190eXBlID09IFhTX1RSQU5TQUNUSU9OX0VORCkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyYW5zLCAmdS0+dHJhbnNhY3Rpb25zLCBsaXN0KQorCQkJaWYgKHRyYW5zLT5oYW5kbGUuaWQgPT0gdS0+dS5tc2cudHhfaWQpCisJCQkJYnJlYWs7CisJCUJVR19PTigmdHJhbnMtPmxpc3QgPT0gJnUtPnRyYW5zYWN0aW9ucyk7CisJCWxpc3RfZGVsKCZ0cmFucy0+bGlzdCk7CisKKwkJa2ZyZWUodHJhbnMpOworCX0KKworCW11dGV4X2xvY2soJnUtPnJlcGx5X211dGV4KTsKKwlyZXQgPSBxdWV1ZV9yZXBseSgmc3RhZ2luZ19xLCAmdS0+dS5tc2csIHNpemVvZih1LT51Lm1zZykpOworCWlmICghcmV0KQorCQlyZXQgPSBxdWV1ZV9yZXBseSgmc3RhZ2luZ19xLCByZXBseSwgdS0+dS5tc2cubGVuKTsKKwlpZiAoIXJldCkgeworCQlsaXN0X3NwbGljZV90YWlsKCZzdGFnaW5nX3EsICZ1LT5yZWFkX2J1ZmZlcnMpOworCQl3YWtlX3VwKCZ1LT5yZWFkX3dhaXRxKTsKKwl9IGVsc2UgeworCQlxdWV1ZV9jbGVhbnVwKCZzdGFnaW5nX3EpOworCQlyYyA9IHJldDsKKwl9CisJbXV0ZXhfdW5sb2NrKCZ1LT5yZXBseV9tdXRleCk7CisKKwlrZnJlZShyZXBseSk7CisKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgeGVuYnVzX3dyaXRlX3dhdGNoKHVuc2lnbmVkIG1zZ190eXBlLCBzdHJ1Y3QgeGVuYnVzX2ZpbGVfcHJpdiAqdSkKK3sKKwlzdHJ1Y3Qgd2F0Y2hfYWRhcHRlciAqd2F0Y2gsICp0bXBfd2F0Y2g7CisJY2hhciAqcGF0aCwgKnRva2VuOworCWludCBlcnIsIHJjOworCUxJU1RfSEVBRChzdGFnaW5nX3EpOworCisJcGF0aCA9IHUtPnUuYnVmZmVyICsgc2l6ZW9mKHUtPnUubXNnKTsKKwl0b2tlbiA9IG1lbWNocihwYXRoLCAwLCB1LT51Lm1zZy5sZW4pOworCWlmICh0b2tlbiA9PSBOVUxMKSB7CisJCXJjID0gLUVJTFNFUTsKKwkJZ290byBvdXQ7CisJfQorCXRva2VuKys7CisKKwlpZiAobXNnX3R5cGUgPT0gWFNfV0FUQ0gpIHsKKwkJd2F0Y2ggPSBhbGxvY193YXRjaF9hZGFwdGVyKHBhdGgsIHRva2VuKTsKKwkJaWYgKHdhdGNoID09IE5VTEwpIHsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJd2F0Y2gtPndhdGNoLmNhbGxiYWNrID0gd2F0Y2hfZmlyZWQ7CisJCXdhdGNoLT5kZXZfZGF0YSA9IHU7CisKKwkJZXJyID0gcmVnaXN0ZXJfeGVuYnVzX3dhdGNoKCZ3YXRjaC0+d2F0Y2gpOworCQlpZiAoZXJyKSB7CisJCQlmcmVlX3dhdGNoX2FkYXB0ZXIod2F0Y2gpOworCQkJcmMgPSBlcnI7CisJCQlnb3RvIG91dDsKKwkJfQorCQlsaXN0X2FkZCgmd2F0Y2gtPmxpc3QsICZ1LT53YXRjaGVzKTsKKwl9IGVsc2UgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUod2F0Y2gsIHRtcF93YXRjaCwgJnUtPndhdGNoZXMsIGxpc3QpIHsKKwkJCWlmICghc3RyY21wKHdhdGNoLT50b2tlbiwgdG9rZW4pICYmCisJCQkgICAgIXN0cmNtcCh3YXRjaC0+d2F0Y2gubm9kZSwgcGF0aCkpIHsKKwkJCQl1bnJlZ2lzdGVyX3hlbmJ1c193YXRjaCgmd2F0Y2gtPndhdGNoKTsKKwkJCQlsaXN0X2RlbCgmd2F0Y2gtPmxpc3QpOworCQkJCWZyZWVfd2F0Y2hfYWRhcHRlcih3YXRjaCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvKiBTdWNjZXNzLiAgU3ludGhlc2l6ZSBhIHJlcGx5IHRvIHNheSBhbGwgaXMgT0suICovCisJeworCQlzdHJ1Y3QgeworCQkJc3RydWN0IHhzZF9zb2NrbXNnIGhkcjsKKwkJCWNoYXIgYm9keVszXTsKKwkJfSBfX3BhY2tlZCByZXBseSA9IHsKKwkJCXsKKwkJCQkudHlwZSA9IG1zZ190eXBlLAorCQkJCS5sZW4gPSBzaXplb2YocmVwbHkuYm9keSkKKwkJCX0sCisJCQkiT0siCisJCX07CisKKwkJbXV0ZXhfbG9jaygmdS0+cmVwbHlfbXV0ZXgpOworCQlyYyA9IHF1ZXVlX3JlcGx5KCZ1LT5yZWFkX2J1ZmZlcnMsICZyZXBseSwgc2l6ZW9mKHJlcGx5KSk7CisJCW11dGV4X3VubG9jaygmdS0+cmVwbHlfbXV0ZXgpOworCX0KKworb3V0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIHNzaXplX3QgeGVuYnVzX2ZpbGVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJY29uc3QgY2hhciBfX3VzZXIgKnVidWYsCisJCQkJc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCB4ZW5idXNfZmlsZV9wcml2ICp1ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXVpbnQzMl90IG1zZ190eXBlOworCWludCByYyA9IGxlbjsKKwlpbnQgcmV0OworCUxJU1RfSEVBRChzdGFnaW5nX3EpOworCisJLyoKKwkgKiBXZSdyZSBleHBlY3RpbmcgdXNlcm1vZGUgdG8gYmUgd3JpdGluZyBwcm9wZXJseSBmb3JtZWQKKwkgKiB4ZW5idXMgbWVzc2FnZXMuICBJZiB0aGV5IHdyaXRlIGFuIGluY29tcGxldGUgbWVzc2FnZSB3ZQorCSAqIGJ1ZmZlciBpdCB1cC4gIE9uY2UgaXQgaXMgY29tcGxldGUsIHdlIGFjdCBvbiBpdC4KKwkgKi8KKworCS8qCisJICogTWFrZSBzdXJlIGNvbmN1cnJlbnQgd3JpdGVycyBjYW4ndCBzdG9tcCBhbGwgb3ZlciBlYWNoCisJICogb3RoZXIncyBtZXNzYWdlcyBhbmQgbWFrZSBhIG1lc3Mgb2Ygb3VyIHBhcnRpYWwgbWVzc2FnZQorCSAqIGJ1ZmZlci4gIFdlIGRvbid0IG1ha2UgYW55IGF0dGVtcHB0IHRvIHN0b3AgbXVsdGlwbGUKKwkgKiB3cml0ZXJzIGZyb20gbWFraW5nIGEgbWVzcyBvZiBlYWNoIG90aGVyJ3MgaW5jb21wbGV0ZQorCSAqIG1lc3NhZ2VzOyB3ZSdyZSBqdXN0IHRyeWluZyB0byBndWFyYW50ZWUgb3VyIG93biBpbnRlcm5hbAorCSAqIGNvbnNpc3RlbmN5IGFuZCBtYWtlIHN1cmUgdGhhdCBzaW5nbGUgd3JpdGVzIGFyZSBoYW5kbGVkCisJICogYXRvbWljYWxseS4KKwkgKi8KKwltdXRleF9sb2NrKCZ1LT5tc2didWZmZXJfbXV0ZXgpOworCisJLyogR2V0IHRoaXMgb3V0IG9mIHRoZSB3YXkgZWFybHkgdG8gYXZvaWQgY29uZnVzaW9uICovCisJaWYgKGxlbiA9PSAwKQorCQlnb3RvIG91dDsKKworCS8qIENhbid0IHdyaXRlIGEgeGVuYnVzIG1lc3NhZ2UgbGFyZ2VyIHdlIGNhbiBidWZmZXIgKi8KKwlpZiAoKGxlbiArIHUtPmxlbikgPiBzaXplb2YodS0+dS5idWZmZXIpKSB7CisJCS8qIE9uIGVycm9yLCBkdW1wIGV4aXN0aW5nIGJ1ZmZlciAqLworCQl1LT5sZW4gPSAwOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IGNvcHlfZnJvbV91c2VyKHUtPnUuYnVmZmVyICsgdS0+bGVuLCB1YnVmLCBsZW4pOworCisJaWYgKHJldCA9PSBsZW4pIHsKKwkJcmMgPSAtRUZBVUxUOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBEZWFsIHdpdGggYSBwYXJ0aWFsIGNvcHkuICovCisJbGVuIC09IHJldDsKKwlyYyA9IGxlbjsKKworCXUtPmxlbiArPSBsZW47CisKKwkvKiBSZXR1cm4gaWYgd2UgaGF2ZW4ndCBnb3QgYSBmdWxsIG1lc3NhZ2UgeWV0ICovCisJaWYgKHUtPmxlbiA8IHNpemVvZih1LT51Lm1zZykpCisJCWdvdG8gb3V0OwkvKiBub3QgZXZlbiB0aGUgaGVhZGVyIHlldCAqLworCisJLyogSWYgd2UncmUgZXhwZWN0aW5nIGEgbWVzc2FnZSB0aGF0J3MgbGFyZ2VyIHRoYW4gd2UgY2FuCisJICAgcG9zc2libHkgc2VuZCwgZHVtcCB3aGF0IHdlIGhhdmUgYW5kIHJldHVybiBhbiBlcnJvci4gKi8KKwlpZiAoKHNpemVvZih1LT51Lm1zZykgKyB1LT51Lm1zZy5sZW4pID4gc2l6ZW9mKHUtPnUuYnVmZmVyKSkgeworCQlyYyA9IC1FMkJJRzsKKwkJdS0+bGVuID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHUtPmxlbiA8IChzaXplb2YodS0+dS5tc2cpICsgdS0+dS5tc2cubGVuKSkKKwkJZ290byBvdXQ7CS8qIGluY29tcGxldGUgZGF0YSBwb3J0aW9uICovCisKKwkvKgorCSAqIE9LLCBub3cgd2UgaGF2ZSBhIGNvbXBsZXRlIG1lc3NhZ2UuICBEbyBzb21ldGhpbmcgd2l0aCBpdC4KKwkgKi8KKworCW1zZ190eXBlID0gdS0+dS5tc2cudHlwZTsKKworCXN3aXRjaCAobXNnX3R5cGUpIHsKKwljYXNlIFhTX1RSQU5TQUNUSU9OX1NUQVJUOgorCWNhc2UgWFNfVFJBTlNBQ1RJT05fRU5EOgorCWNhc2UgWFNfRElSRUNUT1JZOgorCWNhc2UgWFNfUkVBRDoKKwljYXNlIFhTX0dFVF9QRVJNUzoKKwljYXNlIFhTX1JFTEVBU0U6CisJY2FzZSBYU19HRVRfRE9NQUlOX1BBVEg6CisJY2FzZSBYU19XUklURToKKwljYXNlIFhTX01LRElSOgorCWNhc2UgWFNfUk06CisJY2FzZSBYU19TRVRfUEVSTVM6CisJCS8qIFNlbmQgb3V0IGEgdHJhbnNhY3Rpb24gKi8KKwkJcmV0ID0geGVuYnVzX3dyaXRlX3RyYW5zYWN0aW9uKG1zZ190eXBlLCB1KTsKKwkJYnJlYWs7CisKKwljYXNlIFhTX1dBVENIOgorCWNhc2UgWFNfVU5XQVRDSDoKKwkJLyogKFVuKUFzayBmb3Igc29tZSBwYXRoIHRvIGJlIHdhdGNoZWQgZm9yIGNoYW5nZXMgKi8KKwkJcmV0ID0geGVuYnVzX3dyaXRlX3dhdGNoKG1zZ190eXBlLCB1KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJaWYgKHJldCAhPSAwKQorCQlyYyA9IHJldDsKKworCS8qIEJ1ZmZlcmVkIG1lc3NhZ2UgY29uc3VtZWQgKi8KKwl1LT5sZW4gPSAwOworCisgb3V0OgorCW11dGV4X3VubG9jaygmdS0+bXNnYnVmZmVyX211dGV4KTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgeGVuYnVzX2ZpbGVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgeGVuYnVzX2ZpbGVfcHJpdiAqdTsKKworCWlmICh4ZW5fc3RvcmVfZXZ0Y2huID09IDApCisJCXJldHVybiAtRU5PRU5UOworCisJbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlscCk7CisKKwl1ID0ga3phbGxvYyhzaXplb2YoKnUpLCBHRlBfS0VSTkVMKTsKKwlpZiAodSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCUlOSVRfTElTVF9IRUFEKCZ1LT50cmFuc2FjdGlvbnMpOworCUlOSVRfTElTVF9IRUFEKCZ1LT53YXRjaGVzKTsKKwlJTklUX0xJU1RfSEVBRCgmdS0+cmVhZF9idWZmZXJzKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ1LT5yZWFkX3dhaXRxKTsKKworCW11dGV4X2luaXQoJnUtPnJlcGx5X211dGV4KTsKKwltdXRleF9pbml0KCZ1LT5tc2didWZmZXJfbXV0ZXgpOworCisJZmlscC0+cHJpdmF0ZV9kYXRhID0gdTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhlbmJ1c19maWxlX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IHhlbmJ1c19maWxlX3ByaXYgKnUgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHhlbmJ1c190cmFuc2FjdGlvbl9ob2xkZXIgKnRyYW5zLCAqdG1wOworCXN0cnVjdCB3YXRjaF9hZGFwdGVyICp3YXRjaCwgKnRtcF93YXRjaDsKKworCS8qCisJICogTm8gbmVlZCBmb3IgbG9ja2luZyBoZXJlIGJlY2F1c2UgdGhlcmUgYXJlIG5vIG90aGVyIHVzZXJzLAorCSAqIGJ5IGRlZmluaXRpb24uCisJICovCisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodHJhbnMsIHRtcCwgJnUtPnRyYW5zYWN0aW9ucywgbGlzdCkgeworCQl4ZW5idXNfdHJhbnNhY3Rpb25fZW5kKHRyYW5zLT5oYW5kbGUsIDEpOworCQlsaXN0X2RlbCgmdHJhbnMtPmxpc3QpOworCQlrZnJlZSh0cmFucyk7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHdhdGNoLCB0bXBfd2F0Y2gsICZ1LT53YXRjaGVzLCBsaXN0KSB7CisJCXVucmVnaXN0ZXJfeGVuYnVzX3dhdGNoKCZ3YXRjaC0+d2F0Y2gpOworCQlsaXN0X2RlbCgmd2F0Y2gtPmxpc3QpOworCQlmcmVlX3dhdGNoX2FkYXB0ZXIod2F0Y2gpOworCX0KKworCWtmcmVlKHUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgeGVuYnVzX2ZpbGVfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlzdHJ1Y3QgeGVuYnVzX2ZpbGVfcHJpdiAqdSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCXBvbGxfd2FpdChmaWxlLCAmdS0+cmVhZF93YWl0cSwgd2FpdCk7CisJaWYgKCFsaXN0X2VtcHR5KCZ1LT5yZWFkX2J1ZmZlcnMpKQorCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKKwlyZXR1cm4gMDsKK30KKworY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB4ZW5idXNfZmlsZV9vcHMgPSB7CisJLnJlYWQgPSB4ZW5idXNfZmlsZV9yZWFkLAorCS53cml0ZSA9IHhlbmJ1c19maWxlX3dyaXRlLAorCS5vcGVuID0geGVuYnVzX2ZpbGVfb3BlbiwKKwkucmVsZWFzZSA9IHhlbmJ1c19maWxlX3JlbGVhc2UsCisJLnBvbGwgPSB4ZW5idXNfZmlsZV9wb2xsLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3hlbmZzL3hlbmZzLmggYi9kcml2ZXJzL3hlbi94ZW5mcy94ZW5mcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZjA4YjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3hlbi94ZW5mcy94ZW5mcy5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBfWEVORlNfWEVOQlVTX0gKKyNkZWZpbmUgX1hFTkZTX1hFTkJVU19ICisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHhlbmJ1c19maWxlX29wczsKKworI2VuZGlmCS8qIF9YRU5GU19YRU5CVVNfSCAqLwpkaWZmIC0tZ2l0IGEvZmlybXdhcmUvLmdpdGlnbm9yZSBiL2Zpcm13YXJlLy5naXRpZ25vcmUKaW5kZXggZDljNjkwMS4uZjg5YTIxZiAxMDA2NDQKLS0tIGEvZmlybXdhcmUvLmdpdGlnbm9yZQorKysgYi9maXJtd2FyZS8uZ2l0aWdub3JlCkBAIC0zLDQgKzMsMyBAQAogKi5iaW4KICouY3NwCiAqLmRzcAotaWhleDJmdwpkaWZmIC0tZ2l0IGEvZmlybXdhcmUvTWFrZWZpbGUgYi9maXJtd2FyZS9NYWtlZmlsZQppbmRleCA2OTY4Mzg4OC4uZWExZDI4ZiAxMDA2NDQKLS0tIGEvZmlybXdhcmUvTWFrZWZpbGUKKysrIGIvZmlybXdhcmUvTWFrZWZpbGUKQEAgLTIwLDYgKzIwLDE1IEBACiAjIGFjY3VyYXRlLiBJbiB0aGUgbGF0dGVyIGNhc2UgaXQgZG9lc24ndCBtYXR0ZXIgLS0gaXQnbGwgdXNlICQoZnctc2hpcHBlZC1hbGwpLgogIyBCdXQgYmUgYXdhcmUgdGhhdCB0aGUgY29uZmlnIGZpbGUgbWlnaHQgbm90IGJlIGluY2x1ZGVkIGF0IGFsbC4KIAoraWZkZWYgQ09ORklHX0FDRU5JQ19PTUlUX1RJR09OX0kKK2FjZW5pYy1vYmpzIDo9IGFjZW5pYy90ZzIuYmluCitmdy1zaGlwcGVkLSArPSBhY2VuaWMvdGcxLmJpbgorZWxzZQorYWNlbmljLW9ianMgOj0gYWNlbmljL3RnMS5iaW4gYWNlbmljL3RnMi5iaW4KK2VuZGlmCitmdy1zaGlwcGVkLSQoQ09ORklHX0FDRU5JQykgKz0gJChhY2VuaWMtb2JqcykKK2Z3LXNoaXBwZWQtJChDT05GSUdfQURBUFRFQ19TVEFSRklSRSkgKz0gYWRhcHRlYy9zdGFyZmlyZV9yeC5iaW4gXAorCQkJCQkgYWRhcHRlYy9zdGFyZmlyZV90eC5iaW4KIGZ3LXNoaXBwZWQtJChDT05GSUdfQVRBUklfRFNQNTZLKSArPSBkc3A1NmsvYm9vdHN0cmFwLmJpbgogZnctc2hpcHBlZC0kKENPTkZJR19BVE1fQU1CQVNTQURPUikgKz0gYXRtc2FyMTEuZncKIGZ3LXNoaXBwZWQtJChDT05GSUdfQ0FTU0lOSSkgKz0gc3VuL2Nhc3NpbmkuYmluCkBAIC0yOCw2ICszNyw4IEBACiAJCQkJICAgY3hnYjMvdDNjX3BzcmFtLTEuMS4wLmJpbiBcCiAJCQkJICAgY3hnYjMvdDNmdy03LjAuMC5iaW4KIGZ3LXNoaXBwZWQtJChDT05GSUdfRFZCX1RUVVNCX0JVREdFVCkgKz0gdHR1c2ItYnVkZ2V0L2RzcGJvb3Rjb2RlLmJpbgorZnctc2hpcHBlZC0kKENPTkZJR19FMTAwKSArPSBlMTAwL2QxMDFtX3Vjb2RlLmJpbiBlMTAwL2QxMDFzX3Vjb2RlLmJpbiBcCisJCQkgICAgIGUxMDAvZDEwMmVfdWNvZGUuYmluCiBmdy1zaGlwcGVkLSQoQ09ORklHX1NNQ1RSKSArPSB0cl9zbWN0ci5iaW4KIGZ3LXNoaXBwZWQtJChDT05GSUdfU05EX0tPUkcxMjEyKSArPSBrb3JnL2sxMjEyLmRzcAogZnctc2hpcHBlZC0kKENPTkZJR19TTkRfTUFFU1RSTzMpICs9IGVzcy9tYWVzdHJvM19hc3NwX2tlcm5lbC5mdyBcCkBAIC0zOCw2ICs0OSw4IEBACiAJCQkJICAgICBzYjE2L2ltYV9hZHBjbV9jYXB0dXJlLmNzcAogZnctc2hpcHBlZC0kKENPTkZJR19TTkRfWU1GUENJKSArPSB5YW1haGEvZHMxX2N0cmwuZncgeWFtYWhhL2RzMV9kc3AuZncgXAogCQkJCSAgIHlhbWFoYS9kczFlX2N0cmwuZncKK2Z3LXNoaXBwZWQtJChDT05GSUdfVElHT04zKSArPSB0aWdvbi90ZzMuYmluIHRpZ29uL3RnM190c28uYmluIFwKKwkJCSAgICAgICB0aWdvbi90ZzNfdHNvNS5iaW4KIGZ3LXNoaXBwZWQtJChDT05GSUdfVVNCX0RBQlVTQikgKz0gZGFidXNiL2Zpcm13YXJlLmZ3IGRhYnVzYi9iaXRzdHJlYW0uYmluCiBmdy1zaGlwcGVkLSQoQ09ORklHX1VTQl9FTUkyNikgKz0gZW1pMjYvbG9hZGVyLmZ3IGVtaTI2L2Zpcm13YXJlLmZ3IFwKIAkJCQkgIGVtaTI2L2JpdHN0cmVhbS5mdwpAQCAtODgsMTAgKzEwMSwxMCBAQAogICAgICAgY21kX2loZXggID0gJChPQkpDT1BZKSAtSWloZXggLU9iaW5hcnkgJDwgJEAKIAogcXVpZXRfY21kX2loZXgyZncgID0gSUhFWDJGVyAkQAotICAgICAgY21kX2loZXgyZncgID0gJChvYmp0cmVlKS8kKG9iaikvaWhleDJmdyAkPCAkQAorICAgICAgY21kX2loZXgyZncgID0gJChvYmp0cmVlKS9zY3JpcHRzL2loZXgyZncgJDwgJEAKIAogcXVpZXRfY21kX2gxNnRvZncgID0gSDE2VE9GVyAkQAotICAgICAgY21kX2gxNnRvZncgID0gJChvYmp0cmVlKS8kKG9iaikvaWhleDJmdyAtdyAkPCAkQAorICAgICAgY21kX2gxNnRvZncgID0gJChvYmp0cmVlKS9zY3JpcHRzL2loZXgyZncgLXcgJDwgJEAKIAogcXVpZXRfY21kX2Z3YmluID0gTUtfRlcgICAkQAogICAgICAgY21kX2Z3YmluID0gRldOQU1FPSIkKHBhdHN1YnN0IGZpcm13YXJlLyUuZ2VuLlMsJSwkQCkiOwkJICAgICBcCkBAIC0xNTQsMTEgKzE2NywxMSBAQAogIyBpcyBhY3R1YWxseSBtZWFuaW5nZnVsLCBiZWNhdXNlIHRoZSBmaXJtd2FyZSBoYXMgdG8gYmUgbG9hZGVkIGluIGEgY2VydGFpbgogIyBvcmRlciByYXRoZXIgdGhhbiBhcyBhIHNpbmdsZSBiaW5hcnkgYmxvYi4gVGh1cywgd2UgY29udmVydCB0aGVtIGludG8gb3VyCiAjIG1vcmUgY29tcGFjdCBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2YgaWhleCByZWNvcmRzICg8bGludXgvaWhleC5oPikKLSQob2JqKS8lLmZ3OiAkKG9iaikvJS5IRVggJChvYmopL2loZXgyZncgfCAkKG9ianRyZWUpLyQob2JqKS8kJChkaXIgJSkKKyQob2JqKS8lLmZ3OiAkKG9iaikvJS5IRVggIHwgJChvYmp0cmVlKS8kKG9iaikvJCQoZGlyICUpCiAJJChjYWxsIGNtZCxpaGV4MmZ3KQogCiAjIC5IMTYgaXMgb3VyIG93biBtb2RpZmllZCBmb3JtIG9mIEludGVsIEhFWCwgd2l0aCAxNi1iaXQgbGVuZ3RoIGZvciByZWNvcmRzLgotJChvYmopLyUuZnc6ICQob2JqKS8lLkgxNiAkKG9iaikvaWhleDJmdyB8ICQob2JqdHJlZSkvJChvYmopLyQkKGRpciAlKQorJChvYmopLyUuZnc6ICQob2JqKS8lLkgxNiB8ICQob2JqdHJlZSkvJChvYmopLyQkKGRpciAlKQogCSQoY2FsbCBjbWQsaDE2dG9mdykKIAogJChmaXJtd2FyZS1kaXJzKToKQEAgLTE3NSw1ICsxODgsMyBAQAogIyBXaXRob3V0IHRoaXMsIGJ1aWx0LWluLm8gd29uJ3QgYmUgY3JlYXRlZCB3aGVuIGl0J3MgZW1wdHksIGFuZCB0aGUKICMgZmluYWwgdm1saW51eCBsaW5rIHdpbGwgZmFpbC4KIG9iai1uIDo9IGR1bW15Ci0KLWhvc3Rwcm9ncy15IDo9IGloZXgyZncKZGlmZiAtLWdpdCBhL2Zpcm13YXJlL1dIRU5DRSBiL2Zpcm13YXJlL1dIRU5DRQppbmRleCA4ZjA2NjM5Li44YjU2NTEzIDEwMDY0NAotLS0gYS9maXJtd2FyZS9XSEVOQ0UKKysrIGIvZmlybXdhcmUvV0hFTkNFCkBAIC0zNjAsMyArMzYwLDY0IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKK0RyaXZlcjogZTEwMCAtLSBJbnRlbCBQUk8vMTAwIEV0aGVybmV0IE5JQworCitGaWxlOiBlMTAwL2QxMDFtX3Vjb2RlLmJpbgorRmlsZTogZTEwMC9kMTAxc191Y29kZS5iaW4KK0ZpbGU6IGUxMDAvZDEwMmVfdWNvZGUuYmluCisKK0xpY2VuY2U6IFVua25vd24KKworRm91bmQgaW4gaGV4IGZvcm0gaW4ga2VybmVsIHNvdXJjZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRHJpdmVyOiBhY2VuaWMgLS0gQWx0ZW9uIEFjZU5JQyBHaWdhYml0IEV0aGVybmV0IGNhcmQKKworRmlsZTogYWNlbmljL3RnMS5iaW4KK0ZpbGU6IGFjZW5pYy90ZzIuYmluCisKK0xpY2VuY2U6IFVua25vd24KKworRm91bmQgaW4gaGV4IGZvcm0gaW4ga2VybmVsIHNvdXJjZSwgYnV0IHNvdXJjZSBhbGxlZ2VkbHkgYXZhaWxhYmxlIGF0CitodHRwOi8vYWx0ZW9uLnNoYXJlYWJsZS5vcmcvCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0RyaXZlcjogdGlnb24zIC0tIEJyb2FkY29tIFRpZ29uMyBiYXNlZCBnaWdhYml0IEV0aGVybmV0IGNhcmRzCisKK0ZpbGU6IHRpZ29uL3RnMy5iaW4KK0ZpbGU6IHRpZ29uL3RnM190c28uYmluCitGaWxlOiB0aWdvbi90ZzNfdHNvNS5iaW4KKworTGljZW5jZToKKyAqIEZpcm13YXJlIGlzOgorICoJRGVyaXZlZCBmcm9tIHByb3ByaWV0YXJ5IHVucHVibGlzaGVkIHNvdXJjZSBjb2RlLAorICoJQ29weXJpZ2h0IChDKSAyMDAwLTIwMDMgQnJvYWRjb20gQ29ycG9yYXRpb24uCisgKgorICoJUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCBmb3IgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpcm13YXJlCisgKglkYXRhIGluIGhleGFkZWNpbWFsIG9yIGVxdWl2YWxlbnQgZm9ybWF0LCBwcm92aWRlZCB0aGlzIGNvcHlyaWdodAorICoJbm90aWNlIGlzIGFjY29tcGFueWluZyBpdC4KKworRm91bmQgaW4gaGV4IGZvcm0gaW4ga2VybmVsIHNvdXJjZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRHJpdmVyOiBBREFQVEVDX1NUQVJGSVJFIC0gQWRhcHRlYyBTdGFyZmlyZS9EdXJhTEFOIHN1cHBvcnQKKworRmlsZTogYWRhcHRlYy9zdGFyZmlyZV9yeC5iaW4KK0ZpbGU6IGFkYXB0ZWMvc3RhcmZpcmVfdHguYmluCisKK0xpY2VuY2U6IEFsbGVnZWRseSBHUEx2MiwgYnV0IG5vIHNvdXJjZSB2aXNpYmxlLgorCitGb3VuZCBpbiBoZXggZm9ybSBpbiBrZXJuZWwgc291cmNlLCB3aXRoIHRoZSBmb2xsb3dpbmcgbm90aWNlOgorCisgQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSBJVCBJUyBMSUNFTlNFRCAiQVMgSVMiIEFORAorIFRIRVJFIElTIE5PIFdBUlJBTlRZIEZPUiBUSEUgUFJPR1JBTSwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUKKyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXKS4gVVNFIE9GIFRIRSBQUk9HUkFNIElTIEFUIFlPVVIKKyBPV04gUklTSy4gSU4gTk8gRVZFTlQgV0lMTCBBREFQVEVDIE9SIElUUyBMSUNFTlNPUlMgQkUgTElBQkxFIFRPIFlPVSBGT1IKKyBEQU1BR0VTLCBJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvZmlybXdhcmUvYWNlbmljL3RnMS5iaW4uaWhleCBiL2Zpcm13YXJlL2FjZW5pYy90ZzEuYmluLmloZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVmMjY1OQotLS0gL2Rldi9udWxsCisrKyBiL2Zpcm13YXJlL2FjZW5pYy90ZzEuYmluLmloZXgKQEAgLTAsMCArMSw0NTczIEBACis6MTAwMDAwMDAwQzA0MEIwMDAwMDA0MDAwMDAwMDQwMDAxMDAwMDAwMzQyCis6MTAwMDEwMDAwMDAwMDAwMDAwMDAwMDBEMDAwMDAwMEQzQzFEMDAwMTZDCis6MTAwMDIwMDA4RkJENUM1NDAzQTBGMDIxM0MxMDAwMDAyNjEwNDAwMDVFCis6MTAwMDMwMDAwQzAwMTAwQzAwMDAwMDAwMDAwMDAwMEQyN0JERkZEOEQwCis6MTAwMDQwMDAzQzFDQzAwMDNDMUIwMDEzMzc3QkQ4MDAwMDAwRDAyMUIzCis6MTAwMDUwMDAzQzE3MDAxMzM2Rjc1NDE4MDJFMDIwMjEzNDA1ODNFOERBCis6MTAwMDYwMDBBRkJGMDAyNDBDMDAyNDg4QUZCMDAwMjAwQzAwMjNFOEIwCis6MTAwMDcwMDAwMDAwMDAwMDNDMDQwMDAxMjQ4NDUxQTQyNDA1MDAwMTc4Cis6MTAwMDgwMDAwMkUwMzAyMTAwMDAzODIxM0MxMDAwMDEyNjEwN0U1MDkzCis6MTAwMDkwMDBBRkIwMDAxMDBDMDAyNDAzQUZCQjAwMTQzQzAyMDAwRkYzCis6MTAwMEEwMDAzNDQyRkZGRjAyMDIxMDI0MDM2MjEwMkIxMDQwMDAwOUFCCis6MTAwMEIwMDAyNDA1MDAwMzNDMDQwMDAxMjQ4NDUxQjAwMjAwMzAyMUQ3Cis6MTAwMEMwMDAwMzYwMzgyMTNDMDIwMDEwQUZBMjAwMTAwQzAwMjQwMzkyCis6MTAwMEQwMDBBRkEwMDAxNDAwMDAyMDIxMzQwNUMwMDAzQzAxMDAwMTQ1Cis6MTAwMEUwMDAwMDM3MDgyMUEwMjA4M0IwM0MwMTAwMDEwMDM3MDgyMTFGCis6MTAwMEYwMDBBMDIwODNCMjNDMDEwMDAxMDAzNzA4MjFBMDIwODNCMzc3Cis6MTAwMTAwMDAzQzAxMDAwMTAwMzcwODIxQUMyMDgzQjRBMkUwMDREOEYwCis6MTAwMTEwMDAwMDA0MThDMDI0ODQwMDAxMDA3NzEwMjFBQzQwNzI3Q0Q4Cis6MTAwMTIwMDAwMDc3MTAyMUFDNDA3MjgwMDJFMzEwMjFBNDQ1NzI3QzVDCis6MTAwMTMwMDAyQzgyMDAyMDE0NDBGRkY3MDAwNDE4QzAwMDAwMjAyMThBCis6MTAwMTQwMDAzNDA1QzAwMDAwMDQxOEMwMjQ4NDAwMDEwMDc3MTAyMTg5Cis6MTAwMTUwMDBBQzQwNzM3QzAwNzcxMDIxQUM0MDczODAwMkUzMTAyMTI3Cis6MTAwMTYwMDBBNDQ1NzM3QzJDODIwMDgwNTQ0MEZGRjcwMDA0MThDMDIzCis6MTAwMTcwMDBBRjgwMDA1NEFGODAwMTFDOEY4MjAwNDQzNDQyMDA0MEE1Cis6MTAwMTgwMDBBRjgyMDA0NDhGODIwMDQ0MzQ0MjAwMjBBRjgyMDA0NDlBCis6MTAwMTkwMDA4RjQyMDIxODMwNDIwMDAyMTA0MDAwMDkwMDAwMDAwMEE3Cis6MTAwMUEwMDA4RjQyMDIyMDNDMDMwMDAyMzQ2MzAwMDQwMDQzMTAyNTA4Cis6MTAwMUIwMDBBRUUyMDRDNDhGNDIwMjFDMDgwMDEwNzQzNDQyMDAwNEYyCis6MTAwMUMwMDA4RjQyMDIyMDNDMDMwMDAyMzQ2MzAwMDYwMDQzMTAyNUU2Cis6MTAwMUQwMDBBRUUyMDRDNDhGNDIwMjFDMzQ0MjAwMDZBRUUyMDRDQ0ZDCis6MTAwMUUwMDA4RjQyMDIxODMwNDIwMDEwMTA0MDAwMEEwMDAwMDAwMDQ4Cis6MTAwMUYwMDA4RjQyMDIxQzM0NDIwMDA0QUVFMjA0Qzg4RjQyMDIyMDQ3Cis6MTAwMjAwMDAzQzAzMDAwQTM0NjMwMDA0MDA0MzEwMjUwODAwMTA4QUYwCis6MTAwMjEwMDBBRUUyMDRDMDhGNDIwMjIwM0MwMzAwMEEzNDYzMDAwNkIxCis6MTAwMjIwMDAwMDQzMTAyNUFFRTIwNEMwOEY0MjAyMUMzNDQyMDAwNjk3Cis6MTAwMjMwMDBBRUUyMDRDODhGNDIwMjE4MzA0MjAyMDAxMDQwMDAwM0IwCis6MTAwMjQwMDAyNDAyMDAwMTA4MDAxMDkxQTJFMjcyNDhBMkUwNzI0ODY0Cis6MTAwMjUwMDAyNDAyMDAwMUFGODIwMEEwQUY4MjAwQjA4RjgzMDA1NDVGCis6MTAwMjYwMDA4RjgyMDA1NDA4MDAxMDk5MjQ2MzAwNjQ4RjgyMDA1NDI4Cis6MTAwMjcwMDAwMDYyMTAyMzJDNDIwMDY1MTQ0MEZGRkMwMDAwMDAwMEM3Cis6MTAwMjgwMDBBRjgwMDA0NDhGNDIwMjA4OEY0MzAyMENBRUUyMDAxMEEwCis6MTAwMjkwMDBBRUUzMDAxNDhFRTQwMDEwOEVFNTAwMTQyNkUyMDAzMDc4Cis6MTAwMkEwMDBBRUUyMDAyODI0MDIwNDkwQUVFMjAwMThBRjg0MDA5MDcxCis6MTAwMkIwMDBBRjg1MDA5NDhFRTIwMDI4QUY4MjAwQjQ5NkUyMDAxQTY3Cis6MTAwMkMwMDBBRjgyMDA5QzhGODIwMEIwOEVFMzA0Q0MwMDQzMTAyNUU3Cis6MTAwMkQwMDBBRjgyMDBCMDhGODIwMEIwMzA0MjAwMDQxNDQwRkZGREI2Cis6MTAwMkUwMDAwMDAwMDAwMDhFRTIwNDUwOEVFMzA0NTRBRUUzMDRGQ0YwCis6MTAwMkYwMDA4RUUyMDRGQzI0NDJFMDAwMkM0MjIwMDExNDQwMDAwRDU4Cis6MTAwMzAwMDAyNkU0MDAzMDhFRTIwNDUwOEVFMzA0NTQzQzA0MDAwMUU1Cis6MTAwMzEwMDAyNDg0NTFCQzNDMDUwMDAxQUZBMDAwMTBBRkEwMDAxNDI0Cis6MTAwMzIwMDA4RUU3MDRGQzM0QTVGMDAwMEMwMDI0MDMwMDYwMzAyMUFCCis6MTAwMzMwMDAyNkU0MDAzMDBDMDAyNDg4MjQwNTA0MDAyNzQ0MDA4MEIzCis6MTAwMzQwMDAwQzAwMjQ4ODI0MDUwMDgwMjZFNDc3N0MwQzAwMjQ4ODk3Cis6MTAwMzUwMDAyNDA1MDQwMDhGNDIwMjVDMjZFNDAwOTRBRUUyMDA2MEIzCis6MTAwMzYwMDA4RjQyMDI2MDI3NDUwMjAwMjQwNjAwMDhBRUUyMDA2OEMyCis6MTAwMzcwMDAyNDAyMDAwNjBDMDAyNDlBQUVFMjAwNjQzQzAyM0I5QTgwCis6MTAwMzgwMDAzNDQyQ0EwMDAwMDAyMDIxMjQwMzAwMDJBRUUzMDA3NEJFCis6MTAwMzkwMDBBRUUzMDA3MEFFRTIwMDZDMjQwMjAzRThBRUUyMDEwNEJBCis6MTAwM0EwMDAyNDAyMDAwMUFFRTMwMTAwQUVFMjAxMEMzQzAzMDAwMUI3Cis6MTAwM0IwMDAwMDY0MTgyMTkwNjM1QzIwMDJFNDEwMjEyNDg0MDAwMTcxCis6MTAwM0MwMDBBMDQzMDA5QzJDODIwMDBGMTQ0MEZGRjgwMDAwMDAwMEE2Cis6MTAwM0QwMDA4RjgyMDA0MDAyRTQxODIxMjQ4NDAwMDEwMDAyMTcwMkU5Cis6MTAwM0UwMDAyNDQyMDAzMEEwNjIwMDlDMDJFNDEwMjFBMDQwMDA5QzQ2Cis6MTAwM0YwMDA5NkUyMDQ2QTMwNDIwMDAzMTQ0MDAwMDkwMDAwMDAwMDQ1Cis6MTAwNDAwMDA5NkUyMDQ3QTMwNDIwMDAzNTA0MDAxMzEzQzAzMDgwMDc4Cis6MTAwNDEwMDA5NkUyMDQ2QTMwNDIwMDAzMTA0MDAwMkEzQzAyMDcwMEMyCis6MTAwNDIwMDA5NkUyMDQ3QTMwNDIwMDAzMTA0MDAwMjYzQzAyMDcwMEE2Cis6MTAwNDMwMDA5NkUzMDQ3QTk2RTIwNDZBMTQ2MjAwMjIzQzAyMDcwMDAyCis6MTAwNDQwMDA4RUUyMDRDMDI0MDMwMDAxQTJFMzRFMjAzNDQyMEUwMEQ5Cis6MTAwNDUwMDBBRUUyMDRDMDhGNDIwMjE4MzA0MjAxMDAxMDQwMDAwNTk1Cis6MTAwNDYwMDAwMDAwMDAwMDNDMDIwMDAxMjQ0MkUxNjgwODAwMTExRDY4Cis6MTAwNDcwMDAwMDAyMTEwMDNDMDIwMDAxMjQ0MkQzNUMwMDAyMTEwMDgyCis6MTAwNDgwMDAwMDAyMTE4MjNDMDMwODAwMDA0MzEwMjUzQzAxMDAwMURBCis6MTAwNDkwMDBBQzIyMTIzODNDMDIwMDAxMjQ0MkY2ODAwMDAyMTEwMDE2Cis6MTAwNEEwMDAwMDAyMTE4MjNDMDMwODAwMDA0MzEwMjUzQzAxMDAwMUJBCis6MTAwNEIwMDBBQzIyMTI3ODhFRTIwMDAwMzQ0MjQwMDAwODAwMTIzODZDCis6MTAwNEMwMDBBRUUyMDAwMDM0NDIzMDAwQUZBMjAwMTg4RUUyMDYwODBGCis6MTAwNEQwMDA4RjQzMDIyODI0NDIwMDAxMzA0OTAwRkY1MTIzMDBFMkVCCis6MTAwNEUwMDBBRkEwMDAxMDhFRTIwNjA4MDAwMjEwQzAwMDU3MTAyMUQ1Cis6MTAwNEYwMDA4RkEzMDAxODhGQTQwMDFDQUM0MzA2MENBQzQ0MDYxMDVDCis6MTAwNTAwMDA4Rjg3MDEyMDI3NjIzODAwMjRFODAwMjAwMTAyMTAyQjg5Cis6MTAwNTEwMDA1MDQwMDAwMTI3NjgzMDAwOEY4MjAxMjgxMTAyMDAwNDNBCis6MTAwNTIwMDAwMDAwMDAwMDhGODIwMTI0MTUwMjAwMDcwMDAwMTAyMTQ2Cis6MTAwNTMwMDA4RUUyMDFBNDAwMDAzMDIxMjQ0MjAwMDFBRUUyMDFBNEI5Cis6MTAwNTQwMDAwODAwMTFBMDhFRTIwMUE0OEVFNDA2MDgwMDA0MjBDMDc5Cis6MTAwNTUwMDAwMDgwMTgyMThFRTQwNDMwOEVFNTA0MzQwMEEzMjgyMUE1Cis6MTAwNTYwMDAwMEEzMzAyQjAwODIyMDIxMDA4NjIwMjFBQ0U0MDAwMDczCis6MTAwNTcwMDBBQ0U1MDAwNDhFRTMwNjA4MjQwMjAwMDhBNEUyMDAwRUE1Cis6MTAwNTgwMDAyNDAyMDAwREFDRTIwMDE4QUNFOTAwMUMwMDAzMThDMDA2Cis6MTAwNTkwMDAyNDYzMDYwQzAyRTMxMDIxQUNFMjAwMDg4RUUyMDRDNERFCis6MTAwNUEwMDBBQ0UyMDAxMEFGODgwMTIwOTJFMjRFMjAxNDQwMDAzN0U4Cis6MTAwNUIwMDAyNDA2MDAwMThFRTI0RTMwMDAwMjEwQzAyNDQyNTAzODYyCis6MTAwNUMwMDAwMkUyMjAyMThDODMwMDAwMjQwMjAwMDcxNDYyMDAxRjM1Cis6MTAwNUQwMDAwMDAwMDAwMDhFRTM0RTMwOEVFMjRFMzQxMDYyMDAxQkFECis6MTAwNUUwMDAyNDAzMDA0MDhDODIwMDA0MjQ0MjAwMDFBQzgyMDAwNEY5Cis6MTAwNUYwMDA4RUUyNEUzNDhFRTU0RTMwMjQ0MjAwMDExMDQzMDAwNzU3Cis6MTAwNjAwMDAwMDAwMDAwMDhFRTI0RTM0MjQ0MjAwMDExMEEyMDAwNURBCis6MTAwNjEwMDAwMDAwMDAwMDA4MDAxMThBMDAwMDAwMDAxNEEwMDAwNTdFCis6MTAwNjIwMDAwMDAwMDAwMDhGODIwMTI4MjQ0MjAwMjBBRjgyMDEyOEIwCis6MTAwNjMwMDA4RjgyMDEyODhDODIwMDA0MkM0MjAwMTE1MDQwMDAxMzRDCis6MTAwNjQwMDBBQzgwMDAwMDA4MDAxMUEwMDAwMDAwMDA4RUUyNEUzMEQ3Cis6MTAwNjUwMDAyNDAzMDA0MDI0NDIwMDAxNTA0MzAwMDMwMDAwMTAyMTA1Cis6MTAwNjYwMDA4RUUyNEUzMDI0NDIwMDAxQUVFMjRFMzA4RUUyNEUzMDM5Cis6MTAwNjcwMDAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjEyNDAyMDAwNzY4Cis6MTAwNjgwMDBBQzgyMDAwMDI0MDIwMDAxQUM4MjAwMDQ1NEMwMDAwQ0MzCis6MTAwNjkwMDBBRUU5MDYwODNDMDQwMDAxMjQ4NDUxQzhBRkEwMDAxMDU0Cis6MTAwNkEwMDBBRkEwMDAxNDhFRTYwNjA4OEY0NzAyMjgzQzA1MDAwOTFCCis6MTAwNkIwMDAwQzAwMjQwMzM0QTVGMDAwMDgwMDEyMjMwMDAwMDAwMDAxCis6MTAwNkMwMDA4RjgzMDEyMDI3NjIzODAwMjQ2NjAwMjAwMEMyMTAyQjhGCis6MTAwNkQwMDA1MDQwMDAwMTI3NjYzMDAwOEY4MjAxMjgxMEMyMDAwNEJDCis6MTAwNkUwMDAwMDAwMDAwMDhGODIwMTI0MTRDMjAwMDcwMDAwMDAwMEY3Cis6MTAwNkYwMDA4RUUyMDFBNDAwMDAzMDIxMjQ0MjAwMDFBRUUyMDFBNEY4Cis6MTAwNzAwMDAwODAwMTIwNzhFRTIwMUE0OEVFMjA2MDhBQzYyMDAxQzBCCis6MTAwNzEwMDA4RUU0MDRBMDhFRTUwNEE0MjQ2MjAwMUNBQzYyMDAwOEYwCis6MTAwNzIwMDAyNDAyMDAwOEE0NjIwMDBFMjQwMjAwMTFBQzYyMDAxODJBCis6MTAwNzMwMDBBQzY0MDAwMEFDNjUwMDA0OEVFMjA0QzRBQzYyMDAxMDNFCis6MTAwNzQwMDBBRjg2MDEyMDkyRTI0RTIwMTQ0MDAwMzcyNDA2MDAwMUJCCis6MTAwNzUwMDA4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzgwMkUyMjAyMUM2Cis6MTAwNzYwMDA4QzgzMDAwMDI0MDIwMDEyMTQ2MjAwMUYwMDAwMDAwMEFECis6MTAwNzcwMDA4RUUzNEUzMDhFRTI0RTM0MTA2MjAwMUIyNDAzMDA0MEE0Cis6MTAwNzgwMDA4QzgyMDAwNDI0NDIwMDAxQUM4MjAwMDQ4RUUyNEUzNENDCis6MTAwNzkwMDA4RUU1NEUzMDI0NDIwMDAxMTA0MzAwMDcwMDAwMDAwMEE3Cis6MTAwN0EwMDA4RUUyNEUzNDI0NDIwMDAxMTBBMjAwMDUwMDAwMDAwMDM5Cis6MTAwN0IwMDAwODAwMTFGMTAwMDAwMDAwMTRBMDAwMDUwMDAwMDAwMDc2Cis6MTAwN0MwMDA4RjgyMDEyODI0NDIwMDIwQUY4MjAxMjg4RjgyMDEyOEQ1Cis6MTAwN0QwMDA4QzgyMDAwNDJDNDIwMDExNTA0MDAwMTNBQzgwMDAwMEI5Cis6MTAwN0UwMDAwODAwMTIwNzAwMDAwMDAwOEVFMjRFMzAyNDAzMDA0MDkzCis6MTAwN0YwMDAyNDQyMDAwMTUwNDMwMDAzMDAwMDEwMjE4RUUyNEUzMERECis6MTAwODAwMDAyNDQyMDAwMUFFRTI0RTMwOEVFMjRFMzAwMDAyMTBDMEIzCis6MTAwODEwMDAyNDQyNTAzODAyRTIyMDIxMjQwMjAwMTJBQzgyMDAwMDVGCis6MTAwODIwMDAyNDAyMDAwMUFDODIwMDA0MTRDMDAwMUIwMDAwMDAwMDgwCis6MTAwODMwMDAzQzA0MDAwMTI0ODQ1MUQwQUZBMDAwMTBBRkEwMDAxNEVDCis6MTAwODQwMDA4RUU2MDYwODhGNDcwMjI4M0MwNTAwMDkwQzAwMjQwM0E5Cis6MTAwODUwMDAzNEE1RjAwMThFRTIwMUIwMjQ0MjAwMDFBRUUyMDFCMDA1Cis6MTAwODYwMDAwODAwMTIyMzhFRTIwMUIwM0MwNDAwMDEyNDg0NTFEQzE0Cis6MTAwODcwMDBBRkEwMDAxNDhFRTYwNjA4OEY0NzAyMjgzQzA1MDAwOTQ5Cis6MTAwODgwMDAwQzAwMjQwMzM0QTVGMDA1OEVFMjAxQUMyNDQyMDAwMUUzCis6MTAwODkwMDBBRUUyMDFBQzhFRTIwMUFDOEVFMjAxNjAzQzA0MDAwMUVDCis6MTAwOEEwMDAyNDg0NTFFODM0MDVGMDAxMjQ0MjAwMDFBRUUyMDE2MEU1Cis6MTAwOEIwMDA4RUUyMDE2MDAwMDAzMDIxMDAwMDM4MjFBRkEwMDAxMDVFCis6MTAwOEMwMDAwQzAwMjQwM0FGQTAwMDE0MDgwMDEyMzgwMDAwMDAwMDQwCis6MTAwOEQwMDAzQzAyMDAwMTI0NDJGNUE4MDAwMjExMDAwMDAyMTE4MjJFCis6MTAwOEUwMDAwMDQzMTAyNTNDMDEwMDAxQUMyMjEyNzg5NkUyMDQ1QTI0Cis6MTAwOEYwMDAzMDQyMDAwMzEwNDAwMDI1M0MwNTBGRkY4RUUyMDRDODgzCis6MTAwOTAwMDAzNEE1RkZGRjM0NDIwQTAwQUVFMjA0Qzg4RUUzMDRDOEY3Cis6MTAwOTEwMDAzQzA0MDAwMTI0ODQ1MUY0MjQwMjAwMDFBMkUyMDRFQzBFCis6MTAwOTIwMDBBMkUyMDRFRDNDMDIwMDAyMDA2MjE4MjUzQzAyMDAwMTM0Cis6MTAwOTMwMDAyNDQyQTM5MDAwNDUxMDI0MDAwMjEwODJBRUUzMDRDOEI0Cis6MTAwOTQwMDAzQzAzMDgwMDAwNDMxMDI1M0MwMTAwMDFBQzIyMTIyMEFBCis6MTAwOTUwMDAzQzAyMDAwMTI0NDJBREQ0MDA0NTEwMjQwMDAyMTA4MjY0Cis6MTAwOTYwMDAwMDQzMTAyNTNDMDEwMDAxQUMyMjEyODA5NkU2MDQ1QTk3Cis6MTAwOTcwMDAwMDAwMzgyMTI0MDUwMDExQUZBMDAwMTAwQzAwMjQwMzUyCis6MTAwOTgwMDBBRkEwMDAxNDA4MDAxMjY4MDAwMDAwMDAzQzAyMDAwMTQzCis6MTAwOTkwMDAyNDQyQTlENDAwMDIxMTAwMDAwMjExODIzQzAzMDgwMDg1Cis6MTAwOUEwMDAwMDQzMTAyNTNDMDEwMDAxQUMyMjEyODA5NkUyMDQ2QTRCCis6MTAwOUIwMDAzMDQyMDAxMDE0NDAwMDA5MDAwMDAwMDA5NkUyMDQ3QTYyCis6MTAwOUMwMDAzMDQyMDAxMDEwNDAwMTEyMDAwMDAwMDA5NkUyMDQ2QTVDCis6MTAwOUQwMDAzMDQyMDAxMDEwNDAwMDA1M0MwMjA3MDA5NkUyMDQ3QTA1Cis6MTAwOUUwMDAzMDQyMDAxMDE0NDAwMTAyM0MwMjA3MDAzNDQyMzAwMDQzCis6MTAwOUYwMDBBRkEyMDAxODhFRTIwNjA4OEY0MzAyMjgyNDQyMDAwMUFECis6MTAwQTAwMDAzMDQ5MDBGRjUxMjMwMEUyQUZBMDAwMTA4RUUyMDYwODNCCis6MTAwQTEwMDAwMDAyMTBDMDAwNTcxMDIxOEZBMzAwMTg4RkE0MDAxQ0UzCis6MTAwQTIwMDBBQzQzMDYwQ0FDNDQwNjEwOEY4NzAxMjAyNzYyMzgwMEM3Cis6MTAwQTMwMDAyNEU4MDAyMDAxMDIxMDJCNTA0MDAwMDEyNzY4MzAwMEZDCis6MTAwQTQwMDA4RjgyMDEyODExMDIwMDA0MDAwMDAwMDA4RjgyMDEyNDFGCis6MTAwQTUwMDAxNTAyMDAwNzAwMDAxMDIxOEVFMjAxQTQwMDAwMzAyMUUxCis6MTAwQTYwMDAyNDQyMDAwMUFFRTIwMUE0MDgwMDEyRUE4RUUyMDFBNEQxCis6MTAwQTcwMDA4RUU0MDYwODAwMDQyMEMwMDA4MDE4MjE4RUU0MDQzMEIzCis6MTAwQTgwMDA4RUU1MDQzNDAwQTMyODIxMDBBMzMwMkIwMDgyMjAyMTBFCis6MTAwQTkwMDAwMDg2MjAyMUFDRTQwMDAwQUNFNTAwMDQ4RUUzMDYwOEVCCis6MTAwQUEwMDAyNDAyMDAwOEE0RTIwMDBFMjQwMjAwMERBQ0UyMDAxOEFCCis6MTAwQUIwMDBBQ0U5MDAxQzAwMDMxOEMwMjQ2MzA2MEMwMkUzMTAyMUZCCis6MTAwQUMwMDBBQ0UyMDAwODhFRTIwNEM0QUNFMjAwMTBBRjg4MDEyMDYyCis6MTAwQUQwMDA5MkUyNEUyMDE0NDAwMDM3MjQwNjAwMDE4RUUyNEUzMDkwCis6MTAwQUUwMDAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjE4QzgzMDAwMDEyCis6MTAwQUYwMDAyNDAyMDAwNzE0NjIwMDFGMDAwMDAwMDA4RUUzNEUzMDQ1Cis6MTAwQjAwMDA4RUUyNEUzNDEwNjIwMDFCMjQwMzAwNDA4QzgyMDAwNEVECis6MTAwQjEwMDAyNDQyMDAwMUFDODIwMDA0OEVFMjRFMzQ4RUU1NEUzMDU5Cis6MTAwQjIwMDAyNDQyMDAwMTEwNDMwMDA3MDAwMDAwMDA4RUUyNEUzNDEyCis6MTAwQjMwMDAyNDQyMDAwMTEwQTIwMDA1MDAwMDAwMDAwODAwMTJENEE5Cis6MTAwQjQwMDAwMDAwMDAwMDE0QTAwMDA1MDAwMDAwMDA4RjgyMDEyOEIyCis6MTAwQjUwMDAyNDQyMDAyMEFGODIwMTI4OEY4MjAxMjg4QzgyMDAwNDY5Cis6MTAwQjYwMDAyQzQyMDAxMTUwNDAwMDEzQUM4MDAwMDAwODAwMTJFQTMzCis6MTAwQjcwMDAwMDAwMDAwMDhFRTI0RTMwMjQwMzAwNDAyNDQyMDAwMUI5Cis6MTAwQjgwMDA1MDQzMDAwMzAwMDAxMDIxOEVFMjRFMzAyNDQyMDAwMTQ5Cis6MTAwQjkwMDBBRUUyNEUzMDhFRTI0RTMwMDAwMjEwQzAyNDQyNTAzODk5Cis6MTAwQkEwMDAwMkUyMjAyMTI0MDIwMDA3QUM4MjAwMDAyNDAyMDAwMTlFCis6MTAwQkIwMDBBQzgyMDAwNDU0QzAwMDBDQUVFOTA2MDgzQzA0MDAwMUZECis6MTAwQkMwMDAyNDg0NTFDOEFGQTAwMDEwQUZBMDAwMTQ4RUU2MDYwODIwCis6MTAwQkQwMDA4RjQ3MDIyODNDMDUwMDA5MEMwMDI0MDMzNEE1RjAwMENGCis6MTAwQkUwMDAwODAwMTM2RDAwMDAwMDAwOEY4MzAxMjAyNzYyMzgwMDg5Cis6MTAwQkYwMDAyNDY2MDAyMDAwQzIxMDJCNTA0MDAwMDEyNzY2MzAwMDAwCis6MTAwQzAwMDA4RjgyMDEyODEwQzIwMDA0MDAwMDAwMDA4RjgyMDEyNDlFCis6MTAwQzEwMDAxNEMyMDAwNzAwMDAwMDAwOEVFMjAxQTQwMDAwMzAyMTkxCis6MTAwQzIwMDAyNDQyMDAwMUFFRTIwMUE0MDgwMDEzNTE4RUUyMDFBNEE3Cis6MTAwQzMwMDA4RUUyMDYwOEFDNjIwMDFDOEVFNDA0QTA4RUU1MDRBNERCCis6MTAwQzQwMDAyNDYyMDAxQ0FDNjIwMDA4MjQwMjAwMDhBNDYyMDAwRUFBCis6MTAwQzUwMDAyNDAyMDAxMUFDNjIwMDE4QUM2NDAwMDBBQzY1MDAwNDEyCis6MTAwQzYwMDA4RUUyMDRDNEFDNjIwMDEwQUY4NjAxMjA5MkUyNEUyMEY2Cis6MTAwQzcwMDAxNDQwMDAzNzI0MDYwMDAxOEVFMjRFMzAwMDAyMTBDMEZFCis6MTAwQzgwMDAyNDQyNTAzODAyRTIyMDIxOEM4MzAwMDAyNDAyMDAxMjBBCis6MTAwQzkwMDAxNDYyMDAxRjAwMDAwMDAwOEVFMzRFMzA4RUUyNEUzNERFCis6MTAwQ0EwMDAxMDYyMDAxQjI0MDMwMDQwOEM4MjAwMDQyNDQyMDAwMUQ3Cis6MTAwQ0IwMDBBQzgyMDAwNDhFRTI0RTM0OEVFNTRFMzAyNDQyMDAwMUI4Cis6MTAwQ0MwMDAxMDQzMDAwNzAwMDAwMDAwOEVFMjRFMzQyNDQyMDAwMTcxCis6MTAwQ0QwMDAxMEEyMDAwNTAwMDAwMDAwMDgwMDEzM0IwMDAwMDAwMDA3Cis6MTAwQ0UwMDAxNEEwMDAwNTAwMDAwMDAwOEY4MjAxMjgyNDQyMDAyMDhCCis6MTAwQ0YwMDBBRjgyMDEyODhGODIwMTI4OEM4MjAwMDQyQzQyMDAxMUNGCis6MTAwRDAwMDA1MDQwMDAxM0FDODAwMDAwMDgwMDEzNTEwMDAwMDAwMEE4Cis6MTAwRDEwMDA4RUUyNEUzMDI0MDMwMDQwMjQ0MjAwMDE1MDQzMDAwMzgxCis6MTAwRDIwMDAwMDAwMTAyMThFRTI0RTMwMjQ0MjAwMDFBRUUyNEUzMDJGCis6MTAwRDMwMDA4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzgwMkUyMjAyMUUwCis6MTAwRDQwMDAyNDAyMDAxMkFDODIwMDAwMjQwMjAwMDFBQzgyMDAwNEU0Cis6MTAwRDUwMDAxNEMwMDAxQjAwMDAwMDAwM0MwNDAwMDEyNDg0NTFEMDlBCis6MTAwRDYwMDBBRkEwMDAxMEFGQTAwMDE0OEVFNjA2MDg4RjQ3MDIyODNGCis6MTAwRDcwMDAzQzA1MDAwOTBDMDAyNDAzMzRBNUYwMDE4RUUyMDFCMDBCCis6MTAwRDgwMDAyNDQyMDAwMUFFRTIwMUIwMDgwMDEzNkQ4RUUyMDFCMDEyCis6MTAwRDkwMDAzQzA0MDAwMTI0ODQ1MURDQUZBMDAwMTQ4RUU2MDYwODU4Cis6MTAwREEwMDA4RjQ3MDIyODNDMDUwMDA5MEMwMDI0MDMzNEE1RjAwNUY4Cis6MTAwREIwMDA4RUUyMDFBQzI0NDIwMDAxQUVFMjAxQUM4RUUyMDFBQzU1Cis6MTAwREMwMDA4RUUyMDE2MDNDMDQwMDAxMjQ4NDUxRTgzNDA1RjAwMjA1Cis6MTAwREQwMDAyNDQyMDAwMUFFRTIwMTYwOEVFMjAxNjAwMDAwMzAyMTk5Cis6MTAwREUwMDAwMDAwMzgyMUFGQTAwMDEwMEMwMDI0MDNBRkEwMDAxNEI1Cis6MTAwREYwMDA5NkU2MDQ3QTk2RTcwNDZBM0MwNDAwMDEyNDg0NTIwMEQzCis6MTAwRTAwMDAyNDA1MDAxMkFGQTAwMDEwMEMwMDI0MDNBRkEwMDAxNEIyCis6MTAwRTEwMDAwQzAwNDUwMDAwMDAwMDAwMEMwMDIzMTgwMDAwMDAwMDNBCis6MTAwRTIwMDAzQzA2MDAwMTM0QzYzODAwQUVFMDA2MDhBRjQwMDIyODk4Cis6MTAwRTMwMDBBRjQwMDIyQzk2RTMwNDU4OEVFNDAwMDAzQzA1MTJEODIzCis6MTAwRTQwMDAzNEE1QzM1ODI3NjIzODAwQUVFMjcyNTgyNzYyMzgwMEQyCis6MTAwRTUwMDBBRUUyNzI2MDI3NjIzODAwQUVFMjcyNjQwMzY2MTAyMTZGCis6MTAwRTYwMDBBRUUyNzI3MDI0MDJGRkZGQUVFMDA0RDRBRUUwMDRFMDE0Cis6MTAwRTcwMDBBRUUwMDRFNEFFRTAwNEYwQTJFMDA0RjRBRUUwMEUwQzU4Cis6MTAwRTgwMDBBRUUwMEUxOEFFRTAwRTEwQUVFMDBFMTRBRUUwMEUxQzlBCis6MTAwRTkwMDBBRUUwNzI0Q0FFRTA1MjQ0QUVFMDUyNDBBRUUwNTIzQ0E2Cis6MTAwRUEwMDBBRUUwNzI1MEFFRTA3MjU0QUVFMDcyNUNBRUUwNzI2OERBCis6MTAwRUIwMDBBRUUwMDREMDI0NjNGRkZGMDA4NTIwMjVBRUUzMDRGOEY0Cis6MTAwRUMwMDBBRUU0MDAwMEFGODAwMDYwQUY4MjAwNjQzQzAyMDEwMDJECis6MTAwRUQwMDBBRkEyMDAxODhFRTIwNjA4OEY0MzAyMjgyNDQyMDAwMUM4Cis6MTAwRUUwMDAzMDQ5MDBGRjUxMjMwMEUyQUZBMDAwMTA4RUUyMDYwODU3Cis6MTAwRUYwMDAwMDAyMTBDMDAwNTcxMDIxOEZBMzAwMTg4RkE0MDAxQ0ZGCis6MTAwRjAwMDBBQzQzMDYwQ0FDNDQwNjEwOEY4NzAxMjAyNzYyMzgwMEUyCis6MTAwRjEwMDAyNEU4MDAyMDAxMDIxMDJCNTA0MDAwMDEyNzY4MzAwMDE3Cis6MTAwRjIwMDA4RjgyMDEyODExMDIwMDA0MDAwMDAwMDA4RjgyMDEyNDNBCis6MTAwRjMwMDAxNTAyMDAwNzAwMDAxMDIxOEVFMjAxQTQwMDAwMzAyMUZDCis6MTAwRjQwMDAyNDQyMDAwMUFFRTIwMUE0MDgwMDE0MjI4RUUyMDFBNEIyCis6MTAwRjUwMDA4RUU0MDYwODAwMDQyMEMwMDA4MDE4MjE4RUU0MDQzMENFCis6MTAwRjYwMDA4RUU1MDQzNDAwQTMyODIxMDBBMzMwMkIwMDgyMjAyMTI5Cis6MTAwRjcwMDAwMDg2MjAyMUFDRTQwMDAwQUNFNTAwMDQ4RUUzMDYwODA2Cis6MTAwRjgwMDAyNDAyMDAwOEE0RTIwMDBFMjQwMjAwMERBQ0UyMDAxOEM2Cis6MTAwRjkwMDBBQ0U5MDAxQzAwMDMxOEMwMjQ2MzA2MEMwMkUzMTAyMTE2Cis6MTAwRkEwMDBBQ0UyMDAwODhFRTIwNEM0QUNFMjAwMTBBRjg4MDEyMDdECis6MTAwRkIwMDA5MkUyNEUyMDE0NDAwMDM3MjQwNjAwMDE4RUUyNEUzMEFCCis6MTAwRkMwMDAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjE4QzgzMDAwMDJECis6MTAwRkQwMDAyNDAyMDAwNzE0NjIwMDFGMDAwMDAwMDA4RUUzNEUzMDYwCis6MTAwRkUwMDA4RUUyNEUzNDEwNjIwMDFCMjQwMzAwNDA4QzgyMDAwNDA5Cis6MTAwRkYwMDAyNDQyMDAwMUFDODIwMDA0OEVFMjRFMzQ4RUU1NEUzMDc1Cis6MTAxMDAwMDAyNDQyMDAwMTEwNDMwMDA3MDAwMDAwMDA4RUUyNEUzNDJECis6MTAxMDEwMDAyNDQyMDAwMTEwQTIwMDA1MDAwMDAwMDAwODAwMTQwQzhBCis6MTAxMDIwMDAwMDAwMDAwMDE0QTAwMDA1MDAwMDAwMDA4RjgyMDEyOENECis6MTAxMDMwMDAyNDQyMDAyMEFGODIwMTI4OEY4MjAxMjg4QzgyMDAwNDg0Cis6MTAxMDQwMDAyQzQyMDAxMTUwNDAwMDEzQUM4MDAwMDAwODAwMTQyMjE0Cis6MTAxMDUwMDAwMDAwMDAwMDhFRTI0RTMwMjQwMzAwNDAyNDQyMDAwMUQ0Cis6MTAxMDYwMDA1MDQzMDAwMzAwMDAxMDIxOEVFMjRFMzAyNDQyMDAwMTY0Cis6MTAxMDcwMDBBRUUyNEUzMDhFRTI0RTMwMDAwMjEwQzAyNDQyNTAzOEI0Cis6MTAxMDgwMDAwMkUyMjAyMTI0MDIwMDA3QUM4MjAwMDAyNDAyMDAwMUI5Cis6MTAxMDkwMDBBQzgyMDAwNDU0QzAwMDBDQUVFOTA2MDgzQzA0MDAwMTE4Cis6MTAxMEEwMDAyNDg0NTFDOEFGQTAwMDEwQUZBMDAwMTQ4RUU2MDYwODNCCis6MTAxMEIwMDA4RjQ3MDIyODNDMDUwMDA5MEMwMDI0MDMzNEE1RjAwMEVBCis6MTAxMEMwMDAwODAwMTRBNTAwMDAwMDAwOEY4MzAxMjAyNzYyMzgwMDZCCis6MTAxMEQwMDAyNDY2MDAyMDAwQzIxMDJCNTA0MDAwMDEyNzY2MzAwMDFCCis6MTAxMEUwMDA4RjgyMDEyODEwQzIwMDA0MDAwMDAwMDA4RjgyMDEyNEJBCis6MTAxMEYwMDAxNEMyMDAwNzAwMDAwMDAwOEVFMjAxQTQwMDAwMzAyMUFECis6MTAxMTAwMDAyNDQyMDAwMUFFRTIwMUE0MDgwMDE0ODk4RUUyMDFBNDg5Cis6MTAxMTEwMDA4RUUyMDYwOEFDNjIwMDFDOEVFNDA0QTA4RUU1MDRBNEY2Cis6MTAxMTIwMDAyNDYyMDAxQ0FDNjIwMDA4MjQwMjAwMDhBNDYyMDAwRUM1Cis6MTAxMTMwMDAyNDAyMDAxMUFDNjIwMDE4QUM2NDAwMDBBQzY1MDAwNDJECis6MTAxMTQwMDA4RUUyMDRDNEFDNjIwMDEwQUY4NjAxMjA5MkUyNEUyMDExCis6MTAxMTUwMDAxNDQwMDAzNzI0MDYwMDAxOEVFMjRFMzAwMDAyMTBDMDE5Cis6MTAxMTYwMDAyNDQyNTAzODAyRTIyMDIxOEM4MzAwMDAyNDAyMDAxMjI1Cis6MTAxMTcwMDAxNDYyMDAxRjAwMDAwMDAwOEVFMzRFMzA4RUUyNEUzNEY5Cis6MTAxMTgwMDAxMDYyMDAxQjI0MDMwMDQwOEM4MjAwMDQyNDQyMDAwMUYyCis6MTAxMTkwMDBBQzgyMDAwNDhFRTI0RTM0OEVFNTRFMzAyNDQyMDAwMUQzCis6MTAxMUEwMDAxMDQzMDAwNzAwMDAwMDAwOEVFMjRFMzQyNDQyMDAwMThDCis6MTAxMUIwMDAxMEEyMDAwNTAwMDAwMDAwMDgwMDE0NzMwMDAwMDAwMEU5Cis6MTAxMUMwMDAxNEEwMDAwNTAwMDAwMDAwOEY4MjAxMjgyNDQyMDAyMEE2Cis6MTAxMUQwMDBBRjgyMDEyODhGODIwMTI4OEM4MjAwMDQyQzQyMDAxMUVBCis6MTAxMUUwMDA1MDQwMDAxM0FDODAwMDAwMDgwMDE0ODkwMDAwMDAwMDhCCis6MTAxMUYwMDA4RUUyNEUzMDI0MDMwMDQwMjQ0MjAwMDE1MDQzMDAwMzlECis6MTAxMjAwMDAwMDAwMTAyMThFRTI0RTMwMjQ0MjAwMDFBRUUyNEUzMDRBCis6MTAxMjEwMDA4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzgwMkUyMjAyMUZCCis6MTAxMjIwMDAyNDAyMDAxMkFDODIwMDAwMjQwMjAwMDFBQzgyMDAwNEZGCis6MTAxMjMwMDAxNEMwMDAxQjAwMDAwMDAwM0MwNDAwMDEyNDg0NTFEMEI1Cis6MTAxMjQwMDBBRkEwMDAxMEFGQTAwMDE0OEVFNjA2MDg4RjQ3MDIyODVBCis6MTAxMjUwMDAzQzA1MDAwOTBDMDAyNDAzMzRBNUYwMDE4RUUyMDFCMDI2Cis6MTAxMjYwMDAyNDQyMDAwMUFFRTIwMUIwMDgwMDE0QTU4RUUyMDFCMEY0Cis6MTAxMjcwMDAzQzA0MDAwMTI0ODQ1MURDQUZBMDAwMTQ4RUU2MDYwODczCis6MTAxMjgwMDA4RjQ3MDIyODNDMDUwMDA5MEMwMDI0MDMzNEE1RjAwNTEzCis6MTAxMjkwMDA4RUUyMDFBQzI0NDIwMDAxQUVFMjAxQUM4RUUyMDFBQzcwCis6MTAxMkEwMDA4RUUyMDE1NDI0NDIwMDAxQUVFMjAxNTQwQzAwMTREQzMxCis6MTAxMkIwMDA4RUUyMDE1NDhGODIwMEEwMzA0MjAwMDQxNDQwRkZGREYyCis6MTAxMkMwMDAwMDAwMDAwMDhGODIwMDQwMzA0MjAwMDExNDQwMDAwOEZFCis6MTAxMkQwMDAwMDAwMDAwMDhGNDMwMTA0MjQwMjAwMDExMDYyMDAwNDlBCis6MTAxMkUwMDAwMDAwMDAwMDhGNDIwMjY0MTA0MDAwMDYwMDAwMDAwMDcxCis6MTAxMkYwMDA4RUUyMDE3QzI0NDIwMDAxQUVFMjAxN0MwODAwMTRDNUFDCis6MTAxMzAwMDA4RUUyMDE3QzhGODIwMDQ0MzQ0MjAwMDRBRjgyMDA0NEFDCis6MTAxMzEwMDA4RUUyMDE3ODI0NDIwMDAxQUVFMjAxNzg4RUUyMDE3ODhCCis6MTAxMzIwMDA4RjgyMDBEODhGODMwMEQ0MDA0MzEwMjNBRUUyNzI2QzBBCis6MTAxMzMwMDA4RUUyNzI2QzFDNDAwMDAzM0MwMzAwMDEwMDQzMTAyMTRDCis6MTAxMzQwMDBBRUUyNzI2QzBDMDA0MDY0MDAwMDAwMDAwQzAwNDQ0MEVGCis6MTAxMzUwMDBBRjgwMDIyODhGQkYwMDI0OEZCMDAwMjAwM0UwMDAwODc4Cis6MTAxMzYwMDAyN0JEMDAyODAzRTAwMDA4MDAwMDAwMDAwM0UwMDAwODlCCis6MTAxMzcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyNDAyMDAyQzFCCis6MTAxMzgwMDBBRjgyMDA1MEFFRTA3Mjc0OEY0MjAyMzhBRUUyNzI3OEUzCis6MTAxMzkwMDA4RjgyMDA1NDI0NDIwMDY3QUY4MjAwNThBRUUwN0I4ODAxCis6MTAxM0EwMDBBRUUwN0I4Q0FFRTA3Qjg0M0MwMTAwMDEwMDM3MDgyMTdECis6MTAxM0IwMDBBQzIwODNCQzNDMDEwMDAxMDAzNzA4MjEwM0UwMDAwODk5Cis6MTAxM0MwMDBBMDIwODNCOTI3QkRGRkQ4QUZCRjAwMjRBRkIwMDAyMDU1Cis6MTAxM0QwMDA4RjgyMDA1NDNDMDMwMDAxOEM2MzVDRDgyNDQyMDA2Nzc4Cis6MTAxM0UwMDAxMDYwMDAwREFGODIwMDU4M0MwMjAwMDEwMDU3MTAyMTMwCis6MTAxM0YwMDA5MDQyODNCODEwNDAwMDA1M0MwMzAyMDAzQzAxMDAwMTBDCis6MTAxNDAwMDAwMDM3MDgyMTA4MDAxNTAzQTAyMDgzQjg4RUUyMDAwMEYxCis6MTAxNDEwMDAwMDQzMTAyNUFFRTIwMDAwOEY0MjAyMTgzMDQyMDEwMDY2Cis6MTAxNDIwMDAxMDQwMDBDNjAwMDAwMDAwOEY4MjAwQjAzMDQyMDAwNDZGCis6MTAxNDMwMDAxMDQwMDBDMjAwMDAwMDAwM0MwMzAwMDEwMDc3MTgyMUFBCis6MTAxNDQwMDA4QzYzODNEMDhGODIwMTA0MTQ2MjAwQjQwMDAwMDAwMDFBCis6MTAxNDUwMDAzQzAzMDAwMTAwNzcxODIxOEM2MzgzRDQ4RjgyMDBCNDkxCis6MTAxNDYwMDAxNDYyMDBBRTAwMDAwMDAwOEY4MjAwQjAzQzAzMDA4MEQ4Cis6MTAxNDcwMDAwMDQzMTAyNDEwNDAwMDBEMDAwMDAwMDA4RjgyMDExQzZBCis6MTAxNDgwMDAzNDQyMDAwMkFGODIwMTFDOEY4MjAwQjAyNDAzRkZGQkI0Cis6MTAxNDkwMDAwMDQzMTAyNEFGODIwMEIwOEY4MjAxMUMyNDAzRkZGREEzCis6MTAxNEEwMDAwMDQzMTAyNDA4MDAxNUNDQUY4MjAxMUMzQzAzMDAwMTRFCis6MTAxNEIwMDAwMDc3MTgyMThDNjM4M0QwOEY4MjAxMDQxNDYyMDA4MjJDCis6MTAxNEMwMDAwMDAwMDAwMDNDMDMwMDAxMDA3NzE4MjE4QzYzODNENEU2Cis6MTAxNEQwMDA4RjgyMDBCNDE0NjIwMDdDMDAwMDAwMDAzQzA3MDAwMTExCis6MTAxNEUwMDAwMEY3MzgyMThDRTc4M0QwOEY4MjAwQjAzQzA0MDAwMUU0Cis6MTAxNEYwMDAyNDg0NTI3MEFGQTAwMDE0QUZBMjAwMTA4Rjg2MDBCMEY5Cis6MTAxNTAwMDAzQzA1MDAwNTBDMDAyNDAzMzRBNTA5MDA4RjgyMDExQzUyCis6MTAxNTEwMDAzNDQyMDAwMkFGODIwMTFDOEY4MzAxMDQ4RjgyMDBCMDJECis6MTAxNTIwMDAzNDQyMDAwMUFGODIwMEIwQUY4MzAxMDQ4RjgzMDEyMEY5Cis6MTAxNTMwMDAyNzYyMzgwMDI0NjYwMDIwMDBDMjEwMkI1MDQwMDAwMUIyCis6MTAxNTQwMDAyNzY2MzAwMDhGODIwMTI4MTBDMjAwMDQwMDAwMDAwMENFCis6MTAxNTUwMDA4RjgyMDEyNDE0QzIwMDA2MDAwMDAwMDA4RUUyMDFBNDY0Cis6MTAxNTYwMDAyNDQyMDAwMUFFRTIwMUE0MDgwMDE1QTA4RUUyMDFBNDBECis6MTAxNTcwMDA4RjQ0MDIwODhGNDUwMjBDMjZFMjAwMzBBQzYyMDAwODVFCis6MTAxNTgwMDAyNDAyMDQwMEE0NjIwMDBFMjQwMjAwMEZBQzYyMDAxOEMyCis6MTAxNTkwMDBBQzYwMDAxQ0FDNjQwMDAwQUM2NTAwMDQ4RUUyMDRDNEM2Cis6MTAxNUEwMDBBQzYyMDAxMEFGODYwMTIwOTJFMjRFMjAxNDQwMDAzNzVBCis6MTAxNUIwMDAwMDAwMDAwMDhFRTI0RTMwMDAwMjEwQzAyNDQyNTAzODdECis6MTAxNUMwMDAwMkUyMjAyMThDODMwMDAwMjQwMjAwMDcxNDYyMDAxRjI1Cis6MTAxNUQwMDAwMDAwMDAwMDhFRTM0RTMwOEVFMjRFMzQxMDYyMDAxQjlECis6MTAxNUUwMDAyNDAzMDA0MDhDODIwMDA0MjQ0MjAwMDFBQzgyMDAwNEU5Cis6MTAxNUYwMDA4RUUyNEUzNDhFRTU0RTMwMjQ0MjAwMDExMDQzMDAwNzQ3Cis6MTAxNjAwMDAwMDAwMDAwMDhFRTI0RTM0MjQ0MjAwMDExMEEyMDAwNUNBCis6MTAxNjEwMDAwMDAwMDAwMDA4MDAxNThBMDAwMDAwMDAxNEEwMDAwNTZBCis6MTAxNjIwMDAwMDAwMDAwMDhGODIwMTI4MjQ0MjAwMjBBRjgyMDEyOEEwCis6MTAxNjMwMDA4RjgyMDEyODhDODIwMDA0MkM0MjAwMTE1MDQwMDAxMzNDCis6MTAxNjQwMDBBQzgwMDAwMDA4MDAxNUEwMDAwMDAwMDA4RUUyNEUzMEMzCis6MTAxNjUwMDAyNDAzMDA0MDI0NDIwMDAxNTA0MzAwMDMwMDAwMTAyMUY1Cis6MTAxNjYwMDA4RUUyNEUzMDI0NDIwMDAxQUVFMjRFMzA4RUUyNEUzMDI5Cis6MTAxNjcwMDAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjEyNDAyMDAwNzU4Cis6MTAxNjgwMDBBQzgyMDAwMDI0MDIwMDAxQUM4MjAwMDQ4RjgyMDExQ0E1Cis6MTAxNjkwMDAyNDAzRkZGRDAwNDMxMDI0QUY4MjAxMUM4RUUyMDFFNDBECis6MTAxNkEwMDAzQzA3MDAwMTAwRjczODIxOENFNzgzRDAyNDQyMDAwMTc5Cis6MTAxNkIwMDBBRUUyMDFFNDhFRTIwMUU0M0MwNDAwMDEyNDg0NTI3Q0E5Cis6MTAxNkMwMDAwODAwMTVCREFGQTAwMDEwOEY4MjAxMDQzQzAxMDAwMThECis6MTAxNkQwMDAwMDM3MDgyMUFDMjI4M0QwOEY4MjAwQjQzQzA3MDAwMTgwCis6MTAxNkUwMDAwMEY3MzgyMThDRTc4M0QwM0MwNDAwMDEyNDg0NTI4NDI1Cis6MTAxNkYwMDAzQzAxMDAwMTAwMzcwODIxQUMyMjgzRDRBRkEwMDAxMEM4Cis6MTAxNzAwMDBBRkEwMDAxNDhGODYwMEIwM0MwNTAwMDUwQzAwMjQwMzM4Cis6MTAxNzEwMDAzNEE1MDkwMDA4MDAxNUNDMDAwMDAwMDA4RjgyMDEwNEU4Cis6MTAxNzIwMDAzQzAxMDAwMTAwMzcwODIxQUMyMjgzRDA4RjgyMDBCNDM1Cis6MTAxNzMwMDAzQzAxMDAwMTAwMzcwODIxQUMyMjgzRDQ4RUUyNzI3NDkwCis6MTAxNzQwMDA5MkUzMDRGNDI0NDIwMDY3MTQ2MDAwMDZBRUUyNzI3NDZGCis6MTAxNzUwMDA4RUUyNzI3NDhGNDMwMjM0MDA0MzEwMkIxNDQwMDA3QkRFCis6MTAxNzYwMDAwMDAwMDAwMDhFRTMwNEU0OEVFMjA0RjgxNDYyMDAwNDNBCis6MTAxNzcwMDAwMDAwMDAwMDkyRTIwNEY0NTA0MDAwNzRBMkUwMDRGNDdGCis6MTAxNzgwMDA4RjgzMDEyMDI3NjIzODAwMjQ2NjAwMjAwMEMyMTAyQkJFCis6MTAxNzkwMDA1MDQwMDAwMTI3NjYzMDAwOEY4MjAxMjgxMEMyMDAwNEVCCis6MTAxN0EwMDAwMDAwMDAwMDhGODIwMTI0MTRDMjAwMDcwMDAwMDAwMDI2Cis6MTAxN0IwMDA4RUUyMDFBNDAwMDA4MDIxMjQ0MjAwMDFBRUUyMDFBNEQ3Cis6MTAxN0MwMDAwODAwMTYzNzhFRTIwMUE0OEVFMjA0RTRBQzYyMDAxQzJECis6MTAxN0QwMDA4RUU0MDRCMDhFRTUwNEI0MjQ2MjAwMUNBQzYyMDAwODAwCis6MTAxN0UwMDAyNDAyMDAwOEE0NjIwMDBFMjQwMjAwMTFBQzYyMDAxODVBCis6MTAxN0YwMDBBQzY0MDAwMEFDNjUwMDA0OEVFMjA0QzRBQzYyMDAxMDZFCis6MTAxODAwMDBBRjg2MDEyMDkyRTI0RTIwMTQ0MDAwMzcyNDEwMDAwMUUwCis6MTAxODEwMDA4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzgwMkUyMjAyMUY1Cis6MTAxODIwMDA4QzgzMDAwMDI0MDIwMDEyMTQ2MjAwMUYwMDAwMDAwMERDCis6MTAxODMwMDA4RUUzNEUzMDhFRTI0RTM0MTA2MjAwMUIyNDAzMDA0MEQzCis6MTAxODQwMDA4QzgyMDAwNDI0NDIwMDAxQUM4MjAwMDQ4RUUyNEUzNEZCCis6MTAxODUwMDA4RUU1NEUzMDI0NDIwMDAxMTA0MzAwMDcwMDAwMDAwMEQ2Cis6MTAxODYwMDA4RUUyNEUzNDI0NDIwMDAxMTBBMjAwMDUwMDAwMDAwMDY4Cis6MTAxODcwMDAwODAwMTYyMTAwMDAwMDAwMTRBMDAwMDUwMDAwMDAwMDcwCis6MTAxODgwMDA4RjgyMDEyODI0NDIwMDIwQUY4MjAxMjg4RjgyMDEyODA0Cis6MTAxODkwMDA4QzgyMDAwNDJDNDIwMDExNTA0MDAwMTNBQzgwMDAwMEU4Cis6MTAxOEEwMDAwODAwMTYzNzAwMDAwMDAwOEVFMjRFMzAyNDAzMDA0MDhFCis6MTAxOEIwMDAyNDQyMDAwMTUwNDMwMDAzMDAwMDEwMjE4RUUyNEUzMDBDCis6MTAxOEMwMDAyNDQyMDAwMUFFRTI0RTMwOEVFMjRFMzAwMDAyMTBDMEUzCis6MTAxOEQwMDAyNDQyNTAzODAyRTIyMDIxMjQwMjAwMTJBQzgyMDAwMDhGCis6MTAxOEUwMDAyNDAyMDAwMUFDODIwMDA0NTYwMDAwMEIyNDEwMDAwMTA5Cis6MTAxOEYwMDA4RUUyMDRFNDNDMDQwMDAxMjQ4NDUyOENBRkEwMDAxNDY2Cis6MTAxOTAwMDBBRkEyMDAxMDhFRTYwNjA4OEY0NzAyMjgzQzA1MDAwOUFBCis6MTAxOTEwMDAwQzAwMjQwMzM0QTVGMDA2MTYwMDAwMDMyNDAyMDAwMTg1Cis6MTAxOTIwMDAwODAwMTY1MEEyRTIwNEY0OEVFMjAxNzAyNDQyMDAwMTg1Cis6MTAxOTMwMDBBRUUyMDE3MDhFRTIwMTcwOEVFMjA0RTRBMkUwMDRGNEYzCis6MTAxOTQwMDBBRUUwMDRGMEFFRTA3Mjc0QUVFMjA0Rjg4RUUyMEUxQzdCCis6MTAxOTUwMDAxMDQwMDA2RDAwMDAwMDAwOEY4MzAxMjAyNzYyMzgwMEQ2Cis6MTAxOTYwMDAyNDY2MDAyMDAwQzIxMDJCNTA0MDAwMDEyNzY2MzAwMDgyCis6MTAxOTcwMDA4RjgyMDEyODEwQzIwMDA0MDAwMDAwMDA4RjgyMDEyNDIxCis6MTAxOTgwMDAxNEMyMDAwNzAwMDAwMDAwOEVFMjAxQTQwMDAwODAyMUM0Cis6MTAxOTkwMDAyNDQyMDAwMUFFRTIwMUE0MDgwMDE2QUQ4RUUyMDFBNENCCis6MTAxOUEwMDA4RUUyNzI0Q0FDNjIwMDFDOEVFNDA0QTg4RUU1MDRBQzlFCis6MTAxOUIwMDAyNDYyMDAxQ0FDNjIwMDA4MjQwMjAwMDhBNDYyMDAwRTJECis6MTAxOUMwMDAyNDAyMDAxMUFDNjIwMDE4QUM2NDAwMDBBQzY1MDAwNDk1Cis6MTAxOUQwMDA4RUUyMDRDNEFDNjIwMDEwQUY4NjAxMjA5MkUyNEUyMDc5Cis6MTAxOUUwMDAxNDQwMDAzNzI0MTAwMDAxOEVFMjRFMzAwMDAyMTBDMDc3Cis6MTAxOUYwMDAyNDQyNTAzODAyRTIyMDIxOEM4MzAwMDAyNDAyMDAxMjhECis6MTAxQTAwMDAxNDYyMDAxRjAwMDAwMDAwOEVFMzRFMzA4RUUyNEUzNDYwCis6MTAxQTEwMDAxMDYyMDAxQjI0MDMwMDQwOEM4MjAwMDQyNDQyMDAwMTU5Cis6MTAxQTIwMDBBQzgyMDAwNDhFRTI0RTM0OEVFNTRFMzAyNDQyMDAwMTNBCis6MTAxQTMwMDAxMDQzMDAwNzAwMDAwMDAwOEVFMjRFMzQyNDQyMDAwMUYzCis6MTAxQTQwMDAxMEEyMDAwNTAwMDAwMDAwMDgwMDE2OTcwMDAwMDAwMDJBCis6MTAxQTUwMDAxNEEwMDAwNTAwMDAwMDAwOEY4MjAxMjgyNDQyMDAyMDBECis6MTAxQTYwMDBBRjgyMDEyODhGODIwMTI4OEM4MjAwMDQyQzQyMDAxMTUxCis6MTAxQTcwMDA1MDQwMDAxM0FDODAwMDAwMDgwMDE2QUQwMDAwMDAwMENDCis6MTAxQTgwMDA4RUUyNEUzMDI0MDMwMDQwMjQ0MjAwMDE1MDQzMDAwMzA0Cis6MTAxQTkwMDAwMDAwMTAyMThFRTI0RTMwMjQ0MjAwMDFBRUUyNEUzMEIyCis6MTAxQUEwMDA4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzgwMkUyMjAyMTYzCis6MTAxQUIwMDAyNDAyMDAxMkFDODIwMDAwMjQwMjAwMDFBQzgyMDAwNDY3Cis6MTAxQUMwMDA1NjAwMDAwQjI0MTAwMDAxOEVFMjcyNEMzQzA0MDAwMTExCis6MTAxQUQwMDAyNDg0NTI5OEFGQTAwMDE0QUZBMjAwMTA4RUU2NzI0QzdFCis6MTAxQUUwMDA4RjQ3MDI4MDNDMDUwMDA5MEMwMDI0MDMzNEE1RjAwODUwCis6MTAxQUYwMDA1NjAwMDAwMUFFRTAwRTFDOEVFMjAxNzQyNDQyMDAwMThCCis6MTAxQjAwMDBBRUUyMDE3NDhFRTIwMTc0OEVFMjRFMjQxMDQwMDAxOUEwCis6MTAxQjEwMDAwMDAwMDAwMEFFRTA0RTI0OEY4MjAwNDAzMDQyMDAwMTAxCis6MTAxQjIwMDAxNDQwMDAwODAwMDAwMDAwOEY0MzAxMDQyNDAyMDAwMTVCCis6MTAxQjMwMDAxMDYyMDAwNDAwMDAwMDAwOEY0MjAyNjQxMDQwMDAwNkEyCis6MTAxQjQwMDAwMDAwMDAwMDhFRTIwMTdDMjQ0MjAwMDFBRUUyMDE3QzM0Cis6MTAxQjUwMDAwODAwMTZEQThFRTIwMTdDOEY4MjAwNDQzNDQyMDAwNEQxCis6MTAxQjYwMDBBRjgyMDA0NDhFRTIwMTc4MjQ0MjAwMDFBRUUyMDE3OEE3Cis6MTAxQjcwMDA4RUUyMDE3ODhFRTI3Mjc4MjQ0MkZGOTlBRUUyNzI3OEFBCis6MTAxQjgwMDA4RUUyNzI3ODFDNDAwMkFEMDAwMDAwMDA4RjQyMDIzOEU1Cis6MTAxQjkwMDAxMDQwMDJBQTAwMDAwMDAwM0MwMjAwMDEwMDU3MTAyMTgyCis6MTAxQkEwMDA5MDQyODNFMDE0NDAwMkE1MDAwMDAwMDA4RjQyMDA4MEI0Cis6MTAxQkIwMDBBRUUyMDA0QzhGNDIwMEMwQUVFMjAwNDg4RjQyMDA4NDhCCis6MTAxQkMwMDBBRUUyMDAzODhGNDIwMDg0QUVFMjAyNDQ4RjQyMDA4OEM5Cis6MTAxQkQwMDBBRUUyMDI0ODhGNDIwMDhDQUVFMjAyNEM4RjQyMDA5MDhGCis6MTAxQkUwMDBBRUUyMDI1MDhGNDIwMDk0QUVFMjAyNTQ4RjQyMDA5ODVGCis6MTAxQkYwMDBBRUUyMDI1ODhGNDIwMDlDQUVFMjAyNUM4RjQyMDBBMDJGCis6MTAxQzAwMDBBRUUyMDI2MDhGNDIwMEE0QUVFMjAyNjQ4RjQyMDBBOEZFCis6MTAxQzEwMDBBRUUyMDI2ODhGNDIwMEFDQUVFMjAyNkM4RjQyMDBCMENFCis6MTAxQzIwMDBBRUUyMDI3MDhGNDIwMEI0QUVFMjAyNzQ4RjQyMDBCODlFCis6MTAxQzMwMDBBRUUyMDI3ODhGNDIwMEJDMjQwNDAwMDFBRUUyMDI3Q0Q2Cis6MTAxQzQwMDBBRUUwMDAzQzAwMDQxMDgwMDA1NzEwMjE4RUUzMDAzQzAxCis6MTAxQzUwMDA4QzQyMDI0NDI0ODQwMDAxMDA2MjE4MjEyQzgyMDAwRjZGCis6MTAxQzYwMDBBRUUzMDAzQzE0NDBGRkY4MDAwNDEwODA4RjQyMDBDQzJCCis6MTAxQzcwMDBBRUUyMDA1MDhGNDIwMEQwQUVFMjAwNTQ4RjgzMDEyMENDCis6MTAxQzgwMDAyNzYyMzgwMDI0NjYwMDIwMDBDMjEwMkI1MDQwMDAwMTVCCis6MTAxQzkwMDAyNzY2MzAwMDhGODIwMTI4MTBDMjAwMDQwMDAwMDAwMDc3Cis6MTAxQ0EwMDA4RjgyMDEyNDE0QzIwMDA3MDAwMDAwMDA4RUUyMDFBNDBDCis6MTAxQ0IwMDAwMDAwODAyMTI0NDIwMDAxQUVFMjAxQTQwODAwMTc3NTUzCis6MTAxQ0MwMDA4RUUyMDFBNDhGNDQwMjA4OEY0NTAyMEMyNkUyMDAzMDA4Cis6MTAxQ0QwMDBBQzYyMDAwODI0MDIwNDAwQTQ2MjAwMEUyNDAyMDAwRjdCCis6MTAxQ0UwMDBBQzYyMDAxOEFDNjAwMDFDQUM2NDAwMDBBQzY1MDAwNDgxCis6MTAxQ0YwMDA4RUUyMDRDNEFDNjIwMDEwQUY4NjAxMjA5MkUyNEUyMDU2Cis6MTAxRDAwMDAxNDQwMDAzNzI0MTAwMDAxOEVFMjRFMzAwMDAyMTBDMDUzCis6MTAxRDEwMDAyNDQyNTAzODAyRTIyMDIxOEM4MzAwMDAyNDAyMDAwNzc0Cis6MTAxRDIwMDAxNDYyMDAxRjAwMDAwMDAwOEVFMzRFMzA4RUUyNEUzNDNECis6MTAxRDMwMDAxMDYyMDAxQjI0MDMwMDQwOEM4MjAwMDQyNDQyMDAwMTM2Cis6MTAxRDQwMDBBQzgyMDAwNDhFRTI0RTM0OEVFNTRFMzAyNDQyMDAwMTE3Cis6MTAxRDUwMDAxMDQzMDAwNzAwMDAwMDAwOEVFMjRFMzQyNDQyMDAwMUQwCis6MTAxRDYwMDAxMEEyMDAwNTAwMDAwMDAwMDgwMDE3NUYwMDAwMDAwMDNFCis6MTAxRDcwMDAxNEEwMDAwNTAwMDAwMDAwOEY4MjAxMjgyNDQyMDAyMEVBCis6MTAxRDgwMDBBRjgyMDEyODhGODIwMTI4OEM4MjAwMDQyQzQyMDAxMTJFCis6MTAxRDkwMDA1MDQwMDAxM0FDODAwMDAwMDgwMDE3NzUwMDAwMDAwMEUwCis6MTAxREEwMDA4RUUyNEUzMDI0MDMwMDQwMjQ0MjAwMDE1MDQzMDAwM0UxCis6MTAxREIwMDAwMDAwMTAyMThFRTI0RTMwMjQ0MjAwMDFBRUUyNEUzMDhGCis6MTAxREMwMDA4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzgwMkUyMjAyMTQwCis6MTAxREQwMDAyNDAyMDAwN0FDODIwMDAwMjQwMjAwMDFBQzgyMDAwNDRGCis6MTAxREUwMDAxMjAwMDIxMjNDMDIwNDAwQUZBMjAwMTgzQzAyMDAwMUUzCis6MTAxREYwMDAwMDU3MTAyMTkwNDI4M0IwMTA0MDAxMEIwMDAwMDAwMEZBCis6MTAxRTAwMDA4RUUyMDYwODhGNDMwMjI4MjQ0MjAwMDEzMDRBMDBGRjc4Cis6MTAxRTEwMDA1MTQzMDBGREFGQTAwMDEwOEVFMjA2MDgwMDAyMTBDMDgyCis6MTAxRTIwMDAwMDU3MTAyMThGQTMwMDE4OEZBNDAwMUNBQzQzMDYwQzkwCis6MTAxRTMwMDBBQzQ0MDYxMDhGODMwMDU0OEY4MjAwNTQyNDY5MDAzMjEyCis6MTAxRTQwMDAwMTIyMTAyMzJDNDIwMDMzMTA0MDAwNkEwMDAwNTgyMTY4Cis6MTAxRTUwMDAyNDE4MDAwODI0MEYwMDBEMjQwRDAwMDcyNDBDMDA0MDU2Cis6MTAxRTYwMDAyNDBFMDAwMThGODcwMTIwMjc2MjM4MDAyNEU4MDAyMDFCCis6MTAxRTcwMDAwMTAyMTAyQjUwNDAwMDAxMjc2ODMwMDA4RjgyMDEyODlBCis6MTAxRTgwMDAxMTAyMDAwNDAwMDAwMDAwOEY4MjAxMjQxNTAyMDAwN0U3Cis6MTAxRTkwMDAwMDAwMTAyMThFRTIwMUE0MDAwMDgwMjEyNDQyMDAwMUY0Cis6MTAxRUEwMDBBRUUyMDFBNDA4MDAxN0YzOEVFMjAxQTQ4RUU0MDYwODU2Cis6MTAxRUIwMDAwMDA0MjBDMDAwODAxODIxOEVFNDA0MzA4RUU1MDQzNDM0Cis6MTAxRUMwMDAwMEEzMjgyMTAwQTMzMDJCMDA4MjIwMjEwMDg2MjAyMTlFCis6MTAxRUQwMDBBQ0U0MDAwMEFDRTUwMDA0OEVFMjA2MDhBNEY4MDAwRUI1Cis6MTAxRUUwMDBBQ0VGMDAxOEFDRUEwMDFDMDAwMjEwQzAyNDQyMDYwQzQzCis6MTAxRUYwMDAwMkUyMTAyMUFDRTIwMDA4OEVFMjA0QzRBQ0UyMDAxMDYxCis6MTAxRjAwMDBBRjg4MDEyMDkyRTI0RTIwMTQ0MDAwMzMyNDEwMDAwMURCCis6MTAxRjEwMDA4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzgwMkUyMjAyMUVFCis6MTAxRjIwMDA4QzgyMDAwMDE0NEQwMDFGMDAwMDAwMDA4RUUzNEUzMDM0Cis6MTAxRjMwMDA4RUUyNEUzNDEwNjIwMDFCMDAwMDAwMDA4QzgyMDAwNDEwCis6MTAxRjQwMDAyNDQyMDAwMUFDODIwMDA0OEVFMjRFMzQ4RUUzNEUzMDE3Cis6MTAxRjUwMDAyNDQyMDAwMTEwNEMwMDA3MDAwMDAwMDA4RUUyNEUzNEM1Cis6MTAxRjYwMDAyNDQyMDAwMTEwNjIwMDA1MDAwMDAwMDAwODAwMTdFMDk0Cis6MTAxRjcwMDAwMDAwMDAwMDE0NjAwMDA1MDAwMDAwMDA4RjgyMDEyOEFFCis6MTAxRjgwMDAyNDQyMDAyMEFGODIwMTI4OEY4MjAxMjg4QzgyMDAwNDI1Cis6MTAxRjkwMDAyQzQyMDAxMTUwNDAwMDEwQUM4MDAwMDAwODAwMTdGM0U0Cis6MTAxRkEwMDAwMDAwMDAwMDhFRTI0RTMwMjQ0MjAwMDE1MDRDMDAwMzNECis6MTAxRkIwMDAwMDAwMTAyMThFRTI0RTMwMjQ0MjAwMDFBRUUyNEUzMDhECis6MTAxRkMwMDA4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzgwMkUyMjAyMTNFCis6MTAxRkQwMDBBQzhEMDAwMEFDOEUwMDA0NTYwMDAwMDYyNDBCMDAwMUZFCis6MTAxRkUwMDA4RjgyMDA1NDAxMjIxMDIzMkM0MjAwMzMxNDQwRkY5REE1Cis6MTAxRkYwMDAwMDAwMDAwMDMxNjMwMEZGMjQwMjAwMDExNDYyMDA3NzNBCis6MTAyMDAwMDAzQzA1MDAwOUFFRUEwNjA4OEY4MzAwNTQ4RjgyMDA1NDE1Cis6MTAyMDEwMDAyNDY5MDAzMjAxMjIxMDIzMkM0MjAwMzMxMDQwMDA2MTU5Cis6MTAyMDIwMDAwMDAwNTgyMTI0MEQwMDA4MjQwQzAwMTEyNDA4MDAxMjdGCis6MTAyMDMwMDAyNDA3MDA0MDI0MEEwMDAxOEY4MzAxMjAyNzYyMzgwMDEyCis6MTAyMDQwMDAyNDY2MDAyMDAwQzIxMDJCNTA0MDAwMDEyNzY2MzAwMDlCCis6MTAyMDUwMDA4RjgyMDEyODEwQzIwMDA0MDAwMDAwMDA4RjgyMDEyNDNBCis6MTAyMDYwMDAxNEMyMDAwNzAwMDAwMDAwOEVFMjAxQTQwMDAwODAyMURECis6MTAyMDcwMDAyNDQyMDAwMUFFRTIwMUE0MDgwMDE4NUY4RUUyMDFBNDMwCis6MTAyMDgwMDA4RUUyMDYwOEFDNjIwMDFDOEVFNDA0QTA4RUU1MDRBNDc3Cis6MTAyMDkwMDAyNDYyMDAxQ0FDNjIwMDA4QTQ2RDAwMEVBQzZDMDAxODM5Cis6MTAyMEEwMDBBQzY0MDAwMEFDNjUwMDA0OEVFMjA0QzRBQzYyMDAxMEI1Cis6MTAyMEIwMDBBRjg2MDEyMDkyRTI0RTIwMTQ0MDAwMzMyNDEwMDAwMTJDCis6MTAyMEMwMDA4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzgwMkUyMjAyMTNECis6MTAyMEQwMDA4QzgyMDAwMDE0NDgwMDFGMDAwMDAwMDA4RUUzNEUzMDg4Cis6MTAyMEUwMDA4RUUyNEUzNDEwNjIwMDFCMDAwMDAwMDA4QzgyMDAwNDVGCis6MTAyMEYwMDAyNDQyMDAwMUFDODIwMDA0OEVFMjRFMzQ4RUUzNEUzMDY2Cis6MTAyMTAwMDAyNDQyMDAwMTEwNDcwMDA3MDAwMDAwMDA4RUUyNEUzNDE4Cis6MTAyMTEwMDAyNDQyMDAwMTEwNjIwMDA1MDAwMDAwMDAwODAwMTg0Qzc1Cis6MTAyMTIwMDAwMDAwMDAwMDE0NjAwMDA1MDAwMDAwMDA4RjgyMDEyOEZDCis6MTAyMTMwMDAyNDQyMDAyMEFGODIwMTI4OEY4MjAxMjg4QzgyMDAwNDczCis6MTAyMTQwMDAyQzQyMDAxMTUwNDAwMDEwQUM4MDAwMDAwODAwMTg1RkM1Cis6MTAyMTUwMDAwMDAwMDAwMDhFRTI0RTMwMjQ0MjAwMDE1MDQ3MDAwMzkwCis6MTAyMTYwMDAwMDAwMTAyMThFRTI0RTMwMjQ0MjAwMDFBRUUyNEUzMERCCis6MTAyMTcwMDA4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzgwMkUyMjAyMThDCis6MTAyMTgwMDBBQzg4MDAwMEFDOEEwMDA0NTYwMDAwMDYyNDBCMDAwMTU1Cis6MTAyMTkwMDA4RjgyMDA1NDAxMjIxMDIzMkM0MjAwMzMxNDQwRkZBNkVBCis6MTAyMUEwMDAwMDAwMDAwMDMxNjMwMEZGMjQwMjAwMDExNDYyMDAwM0ZDCis6MTAyMUIwMDAzQzA1MDAwOTA4MDAxOTdDMjQxMDAwMDEzQzA0MDAwMUMyCis6MTAyMUMwMDAyNDg0NTJBNEFGQTAwMDEwQUZBMDAwMTQ4Rjg2MDEyMDc5Cis6MTAyMUQwMDA4Rjg3MDEyNDA4MDAxODdCMzRBNUYwMTEzQzA0MDAwMTBFCis6MTAyMUUwMDAyNDg0NTJCMEFGQTAwMDEwQUZBMDAwMTQ4Rjg2MDEyMDRECis6MTAyMUYwMDA4Rjg3MDEyNDM0QTVGMDEwMEMwMDI0MDMwMDAwODAyMUY3Cis6MTAyMjAwMDAwODAwMTk3QzAwMDAwMDAwM0MwNDAwMDEyNDg0NTJCQzNBCis6MTAyMjEwMDBBRkEwMDAxNDhFRTYwNjA4OEY0NzAyMjgzQzA1MDAwOThGCis6MTAyMjIwMDAwODAwMTk3NTM0QTVGMDBGOEVFMjA2MDg4RjQzMDIyOEM2Cis6MTAyMjMwMDAyNDQyMDAwMTMwNDkwMEZGNTEyMzAwRTJBRkEwMDAxMDBBCis6MTAyMjQwMDA4RUUyMDYwODAwMDIxMEMwMDA1NzEwMjE4RkEzMDAxODZDCis6MTAyMjUwMDA4RkE0MDAxQ0FDNDMwNjBDQUM0NDA2MTA4Rjg3MDEyMEYxCis6MTAyMjYwMDAyNzYyMzgwMDI0RTgwMDIwMDEwMjEwMkI1MDQwMDAwMUIyCis6MTAyMjcwMDAyNzY4MzAwMDhGODIwMTI4MTEwMjAwMDQwMDAwMDAwMDRFCis6MTAyMjgwMDA4RjgyMDEyNDE1MDIwMDA3MDAwMDEwMjE4RUUyMDFBNEI0Cis6MTAyMjkwMDAwMDAwODAyMTI0NDIwMDAxQUVFMjAxQTQwODAwMThGN0VBCis6MTAyMkEwMDA4RUUyMDFBNDhFRTQwNjA4MDAwNDIwQzAwMDgwMTgyMUZDCis6MTAyMkIwMDA4RUU0MDQzMDhFRTUwNDM0MDBBMzI4MjEwMEEzMzAyQkUzCis6MTAyMkMwMDAwMDgyMjAyMTAwODYyMDIxQUNFNDAwMDBBQ0U1MDAwNDVGCis6MTAyMkQwMDA4RUUzMDYwODI0MDIwMDA4QTRFMjAwMEUyNDAyMDAwRDhBCis6MTAyMkUwMDBBQ0UyMDAxOEFDRTkwMDFDMDAwMzE4QzAyNDYzMDYwQzIzCis6MTAyMkYwMDAwMkUzMTAyMUFDRTIwMDA4OEVFMjA0QzRBQ0UyMDAxMDVDCis6MTAyMzAwMDBBRjg4MDEyMDkyRTI0RTIwMTQ0MDAwMzcyNDEwMDAwMUQzCis6MTAyMzEwMDA4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzgwMkUyMjAyMUVBCis6MTAyMzIwMDA4QzgzMDAwMDI0MDIwMDA3MTQ2MjAwMUYwMDAwMDAwMERDCis6MTAyMzMwMDA4RUUzNEUzMDhFRTI0RTM0MTA2MjAwMUIyNDAzMDA0MEM4Cis6MTAyMzQwMDA4QzgyMDAwNDI0NDIwMDAxQUM4MjAwMDQ4RUUyNEUzNEYwCis6MTAyMzUwMDA4RUU1NEUzMDI0NDIwMDAxMTA0MzAwMDcwMDAwMDAwMENCCis6MTAyMzYwMDA4RUUyNEUzNDI0NDIwMDAxMTBBMjAwMDUwMDAwMDAwMDVECis6MTAyMzcwMDAwODAwMThFMTAwMDAwMDAwMTRBMDAwMDUwMDAwMDAwMEEzCis6MTAyMzgwMDA4RjgyMDEyODI0NDIwMDIwQUY4MjAxMjg4RjgyMDEyOEY5Cis6MTAyMzkwMDA4QzgyMDAwNDJDNDIwMDExNTA0MDAwMTNBQzgwMDAwMERECis6MTAyM0EwMDAwODAwMThGNzAwMDAwMDAwOEVFMjRFMzAyNDAzMDA0MEMxCis6MTAyM0IwMDAyNDQyMDAwMTUwNDMwMDAzMDAwMDEwMjE4RUUyNEUzMDAxCis6MTAyM0MwMDAyNDQyMDAwMUFFRTI0RTMwOEVFMjRFMzAwMDAyMTBDMEQ4Cis6MTAyM0QwMDAyNDQyNTAzODAyRTIyMDIxMjQwMjAwMDdBQzgyMDAwMDhGCis6MTAyM0UwMDAyNDAyMDAwMUFDODIwMDA0NTYwMDAwMENBRUU5MDYwODhECis6MTAyM0YwMDAzQzA0MDAwMTI0ODQ1MkM4QUZBMDAwMTBBRkEwMDAxNDE4Cis6MTAyNDAwMDA4RUU2MDYwODhGNDcwMjI4M0MwNTAwMDkwQzAwMjQwM0NECis6MTAyNDEwMDAzNEE1RjAwMDA4MDAxOTdDMDAwMDAwMDA4RjgzMDEyMDIzCis6MTAyNDIwMDAyNzYyMzgwMDI0NjYwMDIwMDBDMjEwMkI1MDQwMDAwMUIzCis6MTAyNDMwMDAyNzY2MzAwMDhGODIwMTI4MTBDMjAwMDQwMDAwMDAwMENGCis6MTAyNDQwMDA4RjgyMDEyNDE0QzIwMDA3MDAwMDAwMDA4RUUyMDFBNDY0Cis6MTAyNDUwMDAwMDAwODAyMTI0NDIwMDAxQUVFMjAxQTQwODAwMTk1RUMwCis6MTAyNDYwMDA4RUUyMDFBNDhFRTIwNjA4QUM2MjAwMUM4RUU0MDRBMDk5Cis6MTAyNDcwMDA4RUU1MDRBNDI0NjIwMDFDQUM2MjAwMDgyNDAyMDAwODVCCis6MTAyNDgwMDBBNDYyMDAwRTI0MDIwMDExQUM2MjAwMThBQzY0MDAwMENCCis6MTAyNDkwMDBBQzY1MDAwNDhFRTIwNEM0QUM2MjAwMTBBRjg2MDEyMDdCCis6MTAyNEEwMDA5MkUyNEUyMDE0NDAwMDM3MjQxMDAwMDE4RUUyNEUzMDlDCis6MTAyNEIwMDAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjE4QzgzMDAwMDI4Cis6MTAyNEMwMDAyNDAyMDAxMjE0NjIwMDFGMDAwMDAwMDA4RUUzNEUzMDUwCis6MTAyNEQwMDA4RUUyNEUzNDEwNjIwMDFCMjQwMzAwNDA4QzgyMDAwNDA0Cis6MTAyNEUwMDAyNDQyMDAwMUFDODIwMDA0OEVFMjRFMzQ4RUU1NEUzMDcwCis6MTAyNEYwMDAyNDQyMDAwMTEwNDMwMDA3MDAwMDAwMDA4RUUyNEUzNDI5Cis6MTAyNTAwMDAyNDQyMDAwMTEwQTIwMDA1MDAwMDAwMDAwODAwMTk0ODQ0Cis6MTAyNTEwMDAwMDAwMDAwMDE0QTAwMDA1MDAwMDAwMDA4RjgyMDEyOEM4Cis6MTAyNTIwMDAyNDQyMDAyMEFGODIwMTI4OEY4MjAxMjg4QzgyMDAwNDdGCis6MTAyNTMwMDAyQzQyMDAxMTUwNDAwMDEzQUM4MDAwMDAwODAwMTk1RUNFCis6MTAyNTQwMDAwMDAwMDAwMDhFRTI0RTMwMjQwMzAwNDAyNDQyMDAwMUNGCis6MTAyNTUwMDA1MDQzMDAwMzAwMDAxMDIxOEVFMjRFMzAyNDQyMDAwMTVGCis6MTAyNTYwMDBBRUUyNEUzMDhFRTI0RTMwMDAwMjEwQzAyNDQyNTAzOEFGCis6MTAyNTcwMDAwMkUyMjAyMTI0MDIwMDEyQUM4MjAwMDAyNDAyMDAwMUE5Cis6MTAyNTgwMDBBQzgyMDAwNDU2MDAwMDFEMjQxMDAwMDEzQzA0MDAwMTMwCis6MTAyNTkwMDAyNDg0NTJEMEFGQTAwMDEwQUZBMDAwMTQ4RUU2MDYwODJECis6MTAyNUEwMDA4RjQ3MDIyODNDMDUwMDA5MEMwMDI0MDMzNEE1RjAwMUU0Cis6MTAyNUIwMDA4RUUyMDFCMDI0NDIwMDAxQUVFMjAxQjAwODAwMTk3Q0I1Cis6MTAyNUMwMDA4RUUyMDFCMDNDMDQwMDAxMjQ4NDUyRENBRkEwMDAxNDcwCis6MTAyNUQwMDA4RUU2MDYwODhGNDcwMjI4M0MwNTAwMDkzNEE1RjAwNTYxCis6MTAyNUUwMDAwQzAwMjQwMzAwMDAwMDAwOEVFMjAxQUMwMDAwODAyMUZBCis6MTAyNUYwMDAyNDQyMDAwMUFFRTIwMUFDOEVFMjAxQUMxMjAwMDAwQ0ZDCis6MTAyNjAwMDAyNDAyMDAwMTNDMDEwMDAxMDAzNzA4MjFBMDIwODNCMDEyCis6MTAyNjEwMDA4RjQyMDIzODhFRTMwMTU4MjQ2MzAwMDFBRUUzMDE1ODczCis6MTAyNjIwMDA4RUUzMDE1ODA4MDAxOThDQUVFMjcyNzgyNDAyMDAwMTkyCis6MTAyNjMwMDAzQzAxMDAwMTAwMzcwODIxQTAyMjgzQjAzQzAyMDAwMUM4Cis6MTAyNjQwMDA4QzQyNUNEODEwNDAwMTg3MDAwMDAwMDA4RUUyN0I4NDQxCis6MTAyNjUwMDAyNDQzMDAwMTI4NDIwMEM5MTQ0MDAxQTRBRUUzN0I4NDU2Cis6MTAyNjYwMDA4RUUyMDRENDMwNDIwMDAyMTQ0MDAxMTlBRUUwN0I4NEIzCis6MTAyNjcwMDA4RUUyMDRENDNDMDMwNjAwMzQ2MzEwMDAzNDQyMDAwMkFFCis6MTAyNjgwMDBBRUUyMDRENEFGQTMwMDE4OEVFMjA2MDg4RjQzMDIyOEZFCis6MTAyNjkwMDAyNDQyMDAwMTMwNEEwMEZGNTE0MzAwRkRBRkEwMDAxMDZBCis6MTAyNkEwMDA4RUUyMDYwODAwMDIxMEMwMDA1NzEwMjE4RkEzMDAxODA4Cis6MTAyNkIwMDA4RkE0MDAxQ0FDNDMwNjBDQUM0NDA2MTA4RjgzMDA1NDVFCis6MTAyNkMwMDA4RjgyMDA1NDI0NjkwMDMyMDEyMjEwMjMyQzQyMDAzM0VGCis6MTAyNkQwMDAxMDQwMDA2QTAwMDA1ODIxMjQxODAwMDgyNDBGMDAwRDQzCis6MTAyNkUwMDAyNDBEMDAwNzI0MEMwMDQwMjQwRTAwMDE4Rjg3MDEyMEQ4Cis6MTAyNkYwMDAyNzYyMzgwMDI0RTgwMDIwMDEwMjEwMkI1MDQwMDAwMTFFCis6MTAyNzAwMDAyNzY4MzAwMDhGODIwMTI4MTEwMjAwMDQwMDAwMDAwMEI5Cis6MTAyNzEwMDA4RjgyMDEyNDE1MDIwMDA3MDAwMDEwMjE4RUUyMDFBNDFGCis6MTAyNzIwMDAwMDAwODAyMTI0NDIwMDAxQUVFMjAxQTQwODAwMUExNTM1Cis6MTAyNzMwMDA4RUUyMDFBNDhFRTQwNjA4MDAwNDIwQzAwMDgwMTgyMTY3Cis6MTAyNzQwMDA4RUU0MDQzMDhFRTUwNDM0MDBBMzI4MjEwMEEzMzAyQjRFCis6MTAyNzUwMDAwMDgyMjAyMTAwODYyMDIxQUNFNDAwMDBBQ0U1MDAwNENBCis6MTAyNzYwMDA4RUUyMDYwOEE0RjgwMDBFQUNFRjAwMThBQ0VBMDAxQ0RDCis6MTAyNzcwMDAwMDAyMTBDMDI0NDIwNjBDMDJFMjEwMjFBQ0UyMDAwODY0Cis6MTAyNzgwMDA4RUUyMDRDNEFDRTIwMDEwQUY4ODAxMjA5MkUyNEUyMDM5Cis6MTAyNzkwMDAxNDQwMDAzMzI0MTAwMDAxOEVFMjRFMzAwMDAyMTBDMEJECis6MTAyN0EwMDAyNDQyNTAzODAyRTIyMDIxOEM4MjAwMDAxNDREMDAxRjg4Cis6MTAyN0IwMDAwMDAwMDAwMDhFRTM0RTMwOEVFMjRFMzQxMDYyMDAxQkFCCis6MTAyN0MwMDAwMDAwMDAwMDhDODIwMDA0MjQ0MjAwMDFBQzgyMDAwNDVFCis6MTAyN0QwMDA4RUUyNEUzNDhFRTM0RTMwMjQ0MjAwMDExMDRDMDAwNzRFCis6MTAyN0UwMDAwMDAwMDAwMDhFRTI0RTM0MjQ0MjAwMDExMDYyMDAwNTE5Cis6MTAyN0YwMDAwMDAwMDAwMDA4MDAxQTAyMDAwMDAwMDAxNDYwMDAwNTNDCis6MTAyODAwMDAwMDAwMDAwMDhGODIwMTI4MjQ0MjAwMjBBRjgyMDEyOEFFCis6MTAyODEwMDA4RjgyMDEyODhDODIwMDA0MkM0MjAwMTE1MDQwMDAxMDRECis6MTAyODIwMDBBQzgwMDAwMDA4MDAxQTE1MDAwMDAwMDA4RUUyNEUzMDU3Cis6MTAyODMwMDAyNDQyMDAwMTUwNEMwMDAzMDAwMDEwMjE4RUUyNEUzMDczCis6MTAyODQwMDAyNDQyMDAwMUFFRTI0RTMwOEVFMjRFMzAwMDAyMTBDMDUzCis6MTAyODUwMDAyNDQyNTAzODAyRTIyMDIxQUM4RDAwMDBBQzhFMDAwNEVFCis6MTAyODYwMDA1NjAwMDAwNjI0MEIwMDAxOEY4MjAwNTQwMTIyMTAyMzIxCis6MTAyODcwMDAyQzQyMDAzMzE0NDBGRjlEMDAwMDAwMDAzMTYzMDBGRjM0Cis6MTAyODgwMDAyNDAyMDAwMTU0NjIwMDc4QUZBMDAwMTBBRUVBMDYwOEVFCis6MTAyODkwMDA4RjgzMDA1NDhGODIwMDU0MjQ2OTAwMzIwMTIyMTAyMzU4Cis6MTAyOEEwMDAyQzQyMDAzMzEwNDAwMDYxMDAwMDU4MjEyNDBEMDAwODI0Cis6MTAyOEIwMDAyNDBDMDAxMTI0MDgwMDEyMjQwNzAwNDAyNDBBMDAwMUZGCis6MTAyOEMwMDA4RjgzMDEyMDI3NjIzODAwMjQ2NjAwMjAwMEMyMTAyQjZECis6MTAyOEQwMDA1MDQwMDAwMTI3NjYzMDAwOEY4MjAxMjgxMEMyMDAwNDlBCis6MTAyOEUwMDAwMDAwMDAwMDhGODIwMTI0MTRDMjAwMDcwMDAwMDAwMEQ1Cis6MTAyOEYwMDA4RUUyMDFBNDAwMDA4MDIxMjQ0MjAwMDFBRUUyMDFBNDg2Cis6MTAyOTAwMDAwODAwMUE4MThFRTIwMUE0OEVFMjA2MDhBQzYyMDAxQzY3Cis6MTAyOTEwMDA4RUU0MDRBMDhFRTUwNEE0MjQ2MjAwMUNBQzYyMDAwOENFCis6MTAyOTIwMDBBNDZEMDAwRUFDNkMwMDE4QUM2NDAwMDBBQzY1MDAwNDMzCis6MTAyOTMwMDA4RUUyMDRDNEFDNjIwMDEwQUY4NjAxMjA5MkUyNEUyMDA5Cis6MTAyOTQwMDAxNDQwMDAzMzI0MTAwMDAxOEVFMjRFMzAwMDAyMTBDMDBCCis6MTAyOTUwMDAyNDQyNTAzODAyRTIyMDIxOEM4MjAwMDAxNDQ4MDAxRkRCCis6MTAyOTYwMDAwMDAwMDAwMDhFRTM0RTMwOEVFMjRFMzQxMDYyMDAxQkY5Cis6MTAyOTcwMDAwMDAwMDAwMDhDODIwMDA0MjQ0MjAwMDFBQzgyMDAwNEFDCis6MTAyOTgwMDA4RUUyNEUzNDhFRTM0RTMwMjQ0MjAwMDExMDQ3MDAwN0ExCis6MTAyOTkwMDAwMDAwMDAwMDhFRTI0RTM0MjQ0MjAwMDExMDYyMDAwNTY3Cis6MTAyOUEwMDAwMDAwMDAwMDA4MDAxQTZFMDAwMDAwMDAxNDYwMDAwNTFFCis6MTAyOUIwMDAwMDAwMDAwMDhGODIwMTI4MjQ0MjAwMjBBRjgyMDEyOEZECis6MTAyOUMwMDA4RjgyMDEyODhDODIwMDA0MkM0MjAwMTE1MDQwMDAxMDlDCis6MTAyOUQwMDBBQzgwMDAwMDA4MDAxQTgxMDAwMDAwMDA4RUUyNEUzMDNBCis6MTAyOUUwMDAyNDQyMDAwMTUwNDcwMDAzMDAwMDEwMjE4RUUyNEUzMEM3Cis6MTAyOUYwMDAyNDQyMDAwMUFFRTI0RTMwOEVFMjRFMzAwMDAyMTBDMEEyCis6MTAyQTAwMDAyNDQyNTAzODAyRTIyMDIxQUM4ODAwMDBBQzhBMDAwNDQ1Cis6MTAyQTEwMDA1NjAwMDAwNjI0MEIwMDAxOEY4MjAwNTQwMTIyMTAyMzZGCis6MTAyQTIwMDAyQzQyMDAzMzE0NDBGRkE2MDAwMDAwMDAzMTYzMDBGRjc5Cis6MTAyQTMwMDAyNDAyMDAwMTEwNjIwMDIyMDAwMDAwMDAzQzA0MDAwMTlBCis6MTAyQTQwMDAyNDg0NTJBNEFGQTAwMDEwQUZBMDAwMTQ4Rjg2MDEyMEYwCis6MTAyQTUwMDA4Rjg3MDEyNDNDMDUwMDA5MEMwMDI0MDMzNEE1RjAxMUU0Cis6MTAyQTYwMDAwODAwMUFBRDAwMDAwMDAwM0MwNDAwMDEyNDg0NTJCMEFDCis6MTAyQTcwMDBBRkEwMDAxNDhGODYwMTIwOEY4NzAxMjQzQzA1MDAwOTM4Cis6MTAyQTgwMDAwQzAwMjQwMzM0QTVGMDEwMDgwMDFBQUQwMDAwMDAwMDZCCis6MTAyQTkwMDAzQzA0MDAwMTI0ODQ1MkJDQUZBMDAwMTQ4RUU2MDYwODVBCis6MTAyQUEwMDA4RjQ3MDIyODNDMDUwMDA5MEMwMDI0MDMzNEE1RjAwRkQxCis6MTAyQUIwMDA4RUUyMDFBQzI0NDIwMDAxQUVFMjAxQUM4RUUyMDFBQzM4Cis6MTAyQUMwMDA4RUUyMDE1QzI0NDIwMDAxQUVFMjAxNUM4RUUyMDE1QzE4Cis6MTAyQUQwMDA4RUUyMDRENDMwNDIwMDAxMTA0MDAwNTUwMDAwMDAwMDk2Cis6MTAyQUUwMDA4RjQyMDIxODMwNDIwMDgwMTA0MDAwMjkwMDAwMDAwMDkwCis6MTAyQUYwMDA4RjgyMDA0NDM0NDIwMDQwQUY4MjAwNDQ4RUUyN0I3Q0VGCis6MTAyQjAwMDAwMDQwMjgyMThFRTIwMEMwOEVFMzAwQzQyNDA2MDAwMEFECis6MTAyQjEwMDAyNDA3RkZGRjAwMDAyMDIxMDA0NjEwMjQxNDQ0MDAwRDZDCis6MTAyQjIwMDAwMDY3MTgyNDE0NjUwMDBCMDAwMDAwMDA4RUUyN0I4MDEzCis6MTAyQjMwMDAwMDQwMjgyMThFRTIwMEUwOEVFMzAwRTQwMDAwMjAyMTI2Cis6MTAyQjQwMDAwMDQ2MTAyNDE0NDQwMDAzMDA2NzE4MjQxMDY1MDAwQjhECis6MTAyQjUwMDAwMDAwMDAwMDhFRTIwMEMwOEVFMzAwQzQ4RUU0MDBFMEJFCis6MTAyQjYwMDA4RUU1MDBFNEFFRTM3QjdDQUVFNTdCODA4RjgyMDA0NEEzCis6MTAyQjcwMDAzODQyMDAyMDA4MDAxQjM4QUY4MjAwNDQ4RjgyMDA0NDk2Cis6MTAyQjgwMDAyNDAzRkZERjAwNDMxMDI0MDgwMDFCMzhBRjgyMDA0NEY5Cis6MTAyQjkwMDA4RjgyMDA0NDI0MDNGRkRGMDA0MzEwMjRBRjgyMDA0NEVGCis6MTAyQkEwMDA4RUUyN0I3QzAwNDAyODIxOEVFMjAwQzA4RUUzMDBDNEQwCis6MTAyQkIwMDAyNDA2MDAwMDI0MDdGRkZGMDAwMDIwMjEwMDQ2MTAyNDA3Cis6MTAyQkMwMDAxNDQ0MDAwRDAwNjcxODI0MTQ2NTAwMEIwMDAwMDAwMDc5Cis6MTAyQkQwMDA4RUUyN0I4MDAwNDAyODIxOEVFMjAwRTA4RUUzMDBFNDVDCis6MTAyQkUwMDAwMDAwMjAyMTAwNDYxMDI0MTQ0NDAwMDMwMDY3MTgyNDJDCis6MTAyQkYwMDAxMDY1MDAwQjAwMDAwMDAwOEVFMjAwQzA4RUUzMDBDNEYwCis6MTAyQzAwMDA4RUU0MDBFMDhFRTUwMEU0QUVFMzdCN0NBRUU1N0I4MDA1Cis6MTAyQzEwMDA4RjgyMDA0NDM4NDIwMDQwMDgwMDFCMzhBRjgyMDA0NEQ1Cis6MTAyQzIwMDA4RjgyMDA0NDM0NDIwMDQwMDgwMDFCMzhBRjgyMDA0NEM5Cis6MTAyQzMwMDA4RjgyMDA0NDM0NDIwMDQwQUY4MjAwNDQ4RUUyN0I4QzlECis6MTAyQzQwMDAyNDQzMDAwMTI4NDIwMDE1MTQ0MDAwMjhBRUUzN0I4Qzg5Cis6MTAyQzUwMDA4RjgyMDA0NDM4NDIwMDIwQUY4MjAwNDQwODAwMUIzOEI1Cis6MTAyQzYwMDBBRUUwN0I4QzhFRTIwNEQ0MzA0MjAwMDExMDQwMDAxMUIzCis6MTAyQzcwMDAwMDAwMDAwMDhGNDIwMjE4MzA0MjAwODAxMDQwMDAwOTFFCis6MTAyQzgwMDAwMDAwMDAwMDhGODIwMDQ0MzQ0MjAwMjBBRjgyMDA0NEU0Cis6MTAyQzkwMDA4RjgyMDA0NDI0MDNGRkJGMDA0MzEwMjQwODAwMUIzNjJBCis6MTAyQ0EwMDBBRjgyMDA0NDhGODIwMDQ0MzQ0MjAwNjAwODAwMUIzNjJCCis6MTAyQ0IwMDBBRjgyMDA0NDhGODIwMDQ0MzQ0MjAwNDBBRjgyMDA0NDFGCis6MTAyQ0MwMDA4RUUyN0I4ODI0NDMwMDAxMjg0MjEzODkxNDQwMDAwNUNBCis6MTAyQ0QwMDBBRUUzN0I4ODhGODIwMDQ0Mzg0MjAwMjBBRjgyMDA0NEZDCis6MTAyQ0UwMDBBRUUwN0I4ODBDMDA0NjAzMDAwMDAwMDA4RkJGMDAyNDhDCis6MTAyQ0YwMDA4RkIwMDAyMDAzRTAwMDA4MjdCRDAwMjgyN0JERkZCOEUzCis6MTAyRDAwMDBBRkJGMDA0NEFGQjYwMDQwQUZCNTAwM0NBRkI0MDAzODMxCis6MTAyRDEwMDBBRkIzMDAzNEFGQjIwMDMwQUZCMTAwMkNBRkIwMDAyODc5Cis6MTAyRDIwMDA4Rjk2MDA2NDMyQzIwMDA0MTA0MDAwMEMyNDAyMDAwNDlDCis6MTAyRDMwMDBBRjgyMDA2NDhGNDIwMTE0QUVFMjA0RTA4RjgyMDA2MDMzCis6MTAyRDQwMDAzNDQyMDAwOEFGODIwMDYwOEVFMjAxNkMyNDQyMDAwMTMwCis6MTAyRDUwMDBBRUUyMDE2QzA4MDAyMkY0OEVFMjAxNkMzMkMyMDAwMTg2Cis6MTAyRDYwMDAxMDQwMDAwNDI0MDIwMDAxQUY4MjAwNjQwODAwMjJGNDM1Cis6MTAyRDcwMDAwMDAwMDAwMDMyQzIwMDAyMTQ0MDAwMEMzQzA1MDAwM0I5Cis6MTAyRDgwMDAzQzA0MDAwMTI0ODQ1MzU0MzRBNTAwMDEwMkMwMzAyMUM2Cis6MTAyRDkwMDAwMDAwMzgyMUFGQTAwMDEwMEMwMDI0MDNBRkEwMDAxNEU1Cis6MTAyREEwMDAyNDAyRkZGODA4MDAyMkY0QUY4MjAwNjQ4RjQzMDIyQzUzCis6MTAyREIwMDA4RjQyMDEwQzUwNjIwMDBDQUZBMDAwMTA4RjQyMDIyQzE5Cis6MTAyREMwMDAwMDAyMTA4MDAwNUExMDIxOEM0MjAzMDBBRkEyMDAyMEE0Cis6MTAyREQwMDA4RjQyMDIyQzI0MDcwMDAxMjQ0MjAwMDEzMDQyMDAzRkIwCis6MTAyREUwMDAwODAwMUI4MEFGNDIwMjJDM0MwNDAwMDEyNDg0NTM2MDg1Cis6MTAyREYwMDBBRkEwMDAxNDhGNDYwMjJDOEY0NzAxMEMzQzA1MDAwMzQ2Cis6MTAyRTAwMDAwQzAwMjQwMzM0QTVGMDFGMDAwMDM4MjExNEUwMDAwMzU3Cis6MTAyRTEwMDAwMDAwMDAwMDA4MDAyMkVEQUY5NjAwNjQ5M0EyMDAyMDlECis6MTAyRTIwMDAyNDQzRkZGRjJDNjIwMDExMTA0MDA2NTgwMDAzMTA4MDVECis6MTAyRTMwMDAzQzAxMDAwMTAwMjIwODIxOEMyMjU0MTgwMDQwMDAwOEE3Cis6MTAyRTQwMDAwMDAwMDAwMDhGQTIwMDIwMzA0MjBGRkZBRUUyMEUwQzA3Cis6MTAyRTUwMDA4RjgyMDA2MDM0NDIwMjAwQUY4MjAwNjA4RUUyMDExODZGCis6MTAyRTYwMDAyNDQyMDAwMUFFRTIwMTE4MDgwMDIyRTg4RUUyMDExOEI3Cis6MTAyRTcwMDA4RkEyMDAyMDI0MDMwMDAxM0MwMTAwMDEwMDM3MDgyMTNCCis6MTAyRTgwMDBBMDIzODNCMTMwNDIwRkZGQUVFMjUyMzg4RjgyMDA2MDQwCis6MTAyRTkwMDAzNDQyMDEwMEFGODIwMDYwOEVFMjAxNDQyNDQyMDAwMTBFCis6MTAyRUEwMDBBRUUyMDE0NDA4MDAyMkU4OEVFMjAxNDQ4RkEyMDAyMDM1Cis6MTAyRUIwMDAwMDAyMTIwMDAwMDIyNTAyMjQwMjAwMDExMDgyMDAwNTE3Cis6MTAyRUMwMDAyNDAyMDAwMjEwODIwMDA5MjQwMkZGRkUwODAwMUJDOTMwCis6MTAyRUQwMDBBRkEwMDAxMDhFRTIwNEQ0QUVFNDAwNzBBRUU0MDA3NDQzCis6MTAyRUUwMDAzNDQyMDAwMTA4MDAxQkJEQUVFMjA0RDQ4RUUzMDRENERBCis6MTAyRUYwMDBBRUU0MDA3MEFFRTQwMDc0MDA2MjE4MjRBRUUzMDRENEMzCis6MTAyRjAwMDA4Rjg0MDA1NDAwMDQxNDQyMDAwNDFDODIwMDQzMTAyMUVBCis6MTAyRjEwMDAwMDA0MUNDMjAwNDMxMDIzMDAwNDFEMDIwMDQzMTAyMUMyCis6MTAyRjIwMDAwMDA0MUQ0MjAwNDMxMDIzMDgwMDFCRDBBRUUyMDA3OENECis6MTAyRjMwMDAzQzA0MDAwMTI0ODQ1MzZDQUZBMDAwMTQ4RkE2MDAyMDMxCis6MTAyRjQwMDAzQzA1MDAwMzBDMDAyNDAzMzRBNTAwMDQ4RUUyMDExMEFDCis6MTAyRjUwMDAyNDQyMDAwMUFFRTIwMTEwMDgwMDIyRTg4RUUyMDExMEQ2Cis6MTAyRjYwMDAyNzQ0MDIxMjBDMDAyMkZFMjQwNTAwMDYzMDQ5MDAxRkVGCis6MTAyRjcwMDAwMDA5MjBDMDAyRTQxMDIxOTQ0MjcyN0MzMDQyNDAwMERCCis6MTAyRjgwMDAxMDQwMDAwQTAwOTcxMDIxOTc0MzAyMTJBNDQzNzI3RTVBCis6MTAyRjkwMDA4RjQzMDIxNDAwOTcxMDIxQUM0MzcyODAwMkU0MTgyMTgxCis6MTAyRkEwMDAzNDAyODAwMDA4MDAxQzc5QTQ2MjcyN0M5NDQzNzI3RTEzCis6MTAyRkIwMDA5NzQyMDIxMjE0NjIwMDA2MDJFNDEwMjEwMDk3MTAyMUM5Cis6MTAyRkMwMDA4QzQzNzI4MDhGNDIwMjE0MTA2MjAwOUYwMkU0MTAyMTMxCis6MTAyRkQwMDA5NDQyNzI3QzMwNDI4MDAwMTA0MDAwMkEyNDA2RkZGRjk5Cis6MTAyRkUwMDAwMDAwMjAyMTAwMDQxMEMwMDJFMjEwMjE5NDQyNzM3Q0YyCis6MTAyRkYwMDAzMDQyNDAwMDU0NDAwMDA1MDA4MDMwMjEyNDg0MDAwMTBDCis6MTAzMDAwMDAyQzgyMDA4MDE0NDBGRkY4MDAwNDEwQzAwNEMxMDAxMDlFCis6MTAzMDEwMDAwMDA2MThDMDAwMDYxMEMwMDA1NzE4MjE4QzYzNzM3QzhFCis6MTAzMDIwMDAwMDU3MTAyMUFGQTMwMDEwOEM0MjczODAzQzA0MDAwMUI0Cis6MTAzMDMwMDAyNDg0NTM3OEFGQTIwMDE0OEY0NzAyMTQzQzA1MDAwMzg4Cis6MTAzMDQwMDAwQzAwMjQwMzM0QTUwMDEzMDgwMDFDOTAzQzAyMDgwMDY3Cis6MTAzMDUwMDA5NzQ0MDIxMjAwNzcxMDIxQTQ0NDczN0U4RjQ0MDIxNDE3Cis6MTAzMDYwMDAwMDc3MTAyMTAyRTMxODIxQUM0NDczODAzNDAyODAwMDAxCis6MTAzMDcwMDBBNDYyNzM3QzAwMDkxMEMwMDJFMjEwMjEwODAwMUM3OUQwCis6MTAzMDgwMDBBNDQ2NzI3QzAyRTQxMDIxOTQ0NTcyN0MwODAwMUMyRTM4Cis6MTAzMDkwMDAwMDA1MTBDMDk0NDM3MzdFOTc0MjAyMTIxNDYyMDAwNjJBCis6MTAzMEEwMDAwMDA1MTBDMDAwOTcxMDIxOEM0MzczODA4RjQyMDIxNERBCis6MTAzMEIwMDAxMDYyMDA2NTAwMDUxMEMwMDJFMjEwMjE5NDQ1NzM3Qzg3Cis6MTAzMEMwMDAwMDA1MTBDMDAyRTIxMDIxOTQ0MjczN0MzMDQyODAwMDVGCis6MTAzMEQwMDAxMDQwRkZGMDAwOTcxMDIxMDAwNTIwQzAwMDk3MTAyMTNDCis6MTAzMEUwMDA5NDQzNzM3RTk3NDIwMjEyMTQ2MjAwMDYyNDA2RkZGRjg3Cis6MTAzMEYwMDAwMDk3MTAyMThDNDM3MzgwOEY0MjAyMTQxMDYyMDA1MzlBCis6MTAzMTAwMDAzQzAyMDgwMDAwMDAyMDIxMDAwNDEwQzAwMkUyMTAyMTRGCis6MTAzMTEwMDA5NDQyNzM3QzMwNDI0MDAwNTQ0MDAwMDUwMDgwMzAyMUNFCis6MTAzMTIwMDAyNDg0MDAwMTJDODIwMDgwMTQ0MEZGRjgwMDA0MTBDMEE5Cis6MTAzMTMwMDAwNEMxMDAyMzAwMDYxOEMwMDAwOTEwQzAwMDU3MTgyMTYwCis6MTAzMTQwMDA4QzYzNzI3QzAwNTcxMDIxQUZBMzAwMTA4QzQyNzI4MEY4Cis6MTAzMTUwMDAzQzA0MDAwMTI0ODQ1Mzg0QUZBMjAwMTQ4RjQ3MDIxNDVFCis6MTAzMTYwMDAzQzA1MDAwMzBDMDAyNDAzMzRBNUYwMTcwODAwMUM5MDU0Cis6MTAzMTcwMDAzQzAyMDgwMDhGNDMwMjEwMDBCNzEwMjFBQzQzNzc3QzVCCis6MTAzMTgwMDA4RjQzMDIxNDAwQjcxMDIxQUM0Mzc3ODAzQzAyMDAwMTRBCis6MTAzMTkwMDAwMDU3MTAyMThDNDI4M0I0MjQ0MjAwMDEzQzAxMDAwMUZECis6MTAzMUEwMDAwMDM3MDgyMUFDMjI4M0I0M0MwMzAwMDEwMDc3MTgyMUNBCis6MTAzMUIwMDA4QzYzODNCNDAyRTUxMDIxMDgwMDFDODJBNDQzNzc3QzUxCis6MTAzMUMwMDA5NzQ0MDIxMjAwNzcxMDIxQTQ0NDczN0U4RjQ0MDIxNEE2Cis6MTAzMUQwMDAwMDc3MTAyMTAyRTMxODIxQUM0NDczODAzNDAyODAwMDkwCis6MTAzMUUwMDBBNDYyNzM3QzAwMDUxMEMwMDJFMjEwMjFBNDQ2NzM3QzI3Cis6MTAzMUYwMDAwMDAwMjAyMTAwMDQyOEMwMDJFNTEwMjE5NDQyNzc3Q0MxCis6MTAzMjAwMDAxMDQwRkZEQzI0ODQwMDAxMkM4MjAwODA1NDQwRkZGQTJGCis6MTAzMjEwMDAwMDA0MjhDMDkyRTIwNEQ4MTA0MDAwMDYyNDAyMDAwMUY1Cis6MTAzMjIwMDA4RUUzMDREQzAxMjIxMDA0MDA2MjE4MjUwODAwMUM4RkM0Cis6MTAzMjMwMDBBRUUzMDREQzhGODMwMjI4MjQwMjAwMDEwMTIyMTAwNDgzCis6MTAzMjQwMDAwMDYyMTgyNUFGODMwMjI4M0MwMjA4MDAzNDQyMTAwMEI3Cis6MTAzMjUwMDBBRkEyMDAxODhFRTIwNjA4OEY0MzAyMjgyNDQyMDAwMTI0Cis6MTAzMjYwMDAzMDRBMDBGRjUxNDMwMEZEQUZBMDAwMTA4RUUyMDYwODc3Cis6MTAzMjcwMDAwMDAyMTBDMDAwNTcxMDIxOEZBMzAwMTg4RkE0MDAxQzVCCis6MTAzMjgwMDBBQzQzMDYwQ0FDNDQwNjEwOEY4MzAwNTQ4RjgyMDA1NDZDCis6MTAzMjkwMDAyNDY5MDAzMjAxMjIxMDIzMkM0MjAwMzMxMDQwMDA2QUJFCis6MTAzMkEwMDAwMDAwNTgyMTI0MTAwMDA4MjQwRjAwMEQyNDBEMDAwN0YxCis6MTAzMkIwMDAyNDBDMDA0MDI0MEUwMDAxOEY4NzAxMjAyNzYyMzgwMDczCis6MTAzMkMwMDAyNEU4MDAyMDAxMDIxMDJCNTA0MDAwMDEyNzY4MzAwMDQ0Cis6MTAzMkQwMDA4RjgyMDEyODExMDIwMDA0MDAwMDAwMDA4RjgyMDEyNDY3Cis6MTAzMkUwMDAxNTAyMDAwNzAwMDAxMDIxOEVFMjAxQTQwMDAwMzgyMTIxCis6MTAzMkYwMDAyNDQyMDAwMUFFRTIwMUE0MDgwMDFEMDg4RUUyMDFBNEYwCis6MTAzMzAwMDA4RUU0MDYwODAwMDQyMEMwMDA4MDE4MjE4RUU0MDQzMEZBCis6MTAzMzEwMDA4RUU1MDQzNDAwQTMyODIxMDBBMzMwMkIwMDgyMjAyMTU1Cis6MTAzMzIwMDAwMDg2MjAyMUFDRTQwMDAwQUNFNTAwMDQ4RUUyMDYwODMzCis6MTAzMzMwMDBBNEYwMDAwRUFDRUYwMDE4QUNFQTAwMUMwMDAyMTBDMEI0Cis6MTAzMzQwMDAyNDQyMDYwQzAyRTIxMDIxQUNFMjAwMDg4RUUyMDRDNDIyCis6MTAzMzUwMDBBQ0UyMDAxMEFGODgwMTIwOTJFMjRFMjAxNDQwMDAzMzBFCis6MTAzMzYwMDAyNDA3MDAwMThFRTI0RTMwMDAwMjEwQzAyNDQyNTAzODgzCis6MTAzMzcwMDAwMkUyMjAyMThDODIwMDAwMTQ0RDAwMUYwMDAwMDAwMDlBCis6MTAzMzgwMDA4RUUzNEUzMDhFRTI0RTM0MTA2MjAwMUIwMDAwMDAwMENGCis6MTAzMzkwMDA4QzgyMDAwNDI0NDIwMDAxQUM4MjAwMDQ4RUUyNEUzNDkwCis6MTAzM0EwMDA4RUUzNEUzMDI0NDIwMDAxMTA0QzAwMDcwMDAwMDAwMDY0Cis6MTAzM0IwMDA4RUUyNEUzNDI0NDIwMDAxMTA2MjAwMDUwMDAwMDAwMDNECis6MTAzM0MwMDAwODAwMUNGNTAwMDAwMDAwMTQ2MDAwMDUwMDAwMDAwMDZCCis6MTAzM0QwMDA4RjgyMDEyODI0NDIwMDIwQUY4MjAxMjg4RjgyMDEyODk5Cis6MTAzM0UwMDA4QzgyMDAwNDJDNDIwMDExNTA0MDAwMTBBQzgwMDAwMDgwCis6MTAzM0YwMDAwODAwMUQwODAwMDAwMDAwOEVFMjRFMzAyNDQyMDAwMTRCCis6MTAzNDAwMDA1MDRDMDAwMzAwMDAxMDIxOEVFMjRFMzAyNDQyMDAwMTk3Cis6MTAzNDEwMDBBRUUyNEUzMDhFRTI0RTMwMDAwMjEwQzAyNDQyNTAzOEYwCis6MTAzNDIwMDAwMkUyMjAyMUFDOEQwMDAwQUM4RTAwMDQ1NEUwMDAwNkM2Cis6MTAzNDMwMDAyNDBCMDAwMThGODIwMDU0MDEyMjEwMjMyQzQyMDAzMzAwCis6MTAzNDQwMDAxNDQwRkY5RDAwMDAwMDAwMzE2MzAwRkYyNDAyMDAwMUQyCis6MTAzNDUwMDA1NDYyMDA3OEFGQTAwMDEwQUVFQTA2MDg4RjgzMDA1NEQzCis6MTAzNDYwMDA4RjgyMDA1NDI0NjkwMDMyMDEyMjEwMjMyQzQyMDAzMzQxCis6MTAzNDcwMDAxMDQwMDA2MTAwMDA1ODIxMjQwRTAwMDgyNDBEMDAxMUE2Cis6MTAzNDgwMDAyNDBBMDAxMjI0MDgwMDQwMjQwQzAwMDE4RjgzMDEyMDJDCis6MTAzNDkwMDAyNzYyMzgwMDI0NjYwMDIwMDBDMjEwMkI1MDQwMDAwMTMzCis6MTAzNEEwMDAyNzY2MzAwMDhGODIwMTI4MTBDMjAwMDQwMDAwMDAwMDRGCis6MTAzNEIwMDA4RjgyMDEyNDE0QzIwMDA3MDAwMDAwMDA4RUUyMDFBNEU0Cis6MTAzNEMwMDAwMDAwMzgyMTI0NDIwMDAxQUVFMjAxQTQwODAwMUQ3NDZFCis6MTAzNEQwMDA4RUUyMDFBNDhFRTIwNjA4QUM2MjAwMUM4RUU0MDRBMDE5Cis6MTAzNEUwMDA4RUU1MDRBNDI0NjIwMDFDQUM2MjAwMDhBNDZFMDAwRUU5Cis6MTAzNEYwMDBBQzZEMDAxOEFDNjQwMDAwQUM2NTAwMDQ4RUUyMDRDNDNFCis6MTAzNTAwMDBBQzYyMDAxMEFGODYwMTIwOTJFMjRFMjAxNDQwMDAzM0RFCis6MTAzNTEwMDAyNDA3MDAwMThFRTI0RTMwMDAwMjEwQzAyNDQyNTAzOEQxCis6MTAzNTIwMDAwMkUyMjAyMThDODIwMDAwMTQ0QTAwMUYwMDAwMDAwMEVCCis6MTAzNTMwMDA4RUUzNEUzMDhFRTI0RTM0MTA2MjAwMUIwMDAwMDAwMDFECis6MTAzNTQwMDA4QzgyMDAwNDI0NDIwMDAxQUM4MjAwMDQ4RUUyNEUzNERFCis6MTAzNTUwMDA4RUUzNEUzMDI0NDIwMDAxMTA0ODAwMDcwMDAwMDAwMEI2Cis6MTAzNTYwMDA4RUUyNEUzNDI0NDIwMDAxMTA2MjAwMDUwMDAwMDAwMDhCCis6MTAzNTcwMDAwODAwMUQ2MTAwMDAwMDAwMTQ2MDAwMDUwMDAwMDAwMDRDCis6MTAzNTgwMDA4RjgyMDEyODI0NDIwMDIwQUY4MjAxMjg4RjgyMDEyOEU3Cis6MTAzNTkwMDA4QzgyMDAwNDJDNDIwMDExNTA0MDAwMTBBQzgwMDAwMENFCis6MTAzNUEwMDAwODAwMUQ3NDAwMDAwMDAwOEVFMjRFMzAyNDQyMDAwMTJECis6MTAzNUIwMDA1MDQ4MDAwMzAwMDAxMDIxOEVFMjRFMzAyNDQyMDAwMUVBCis6MTAzNUMwMDBBRUUyNEUzMDhFRTI0RTMwMDAwMjEwQzAyNDQyNTAzODNGCis6MTAzNUQwMDAwMkUyMjAyMUFDOEEwMDAwQUM4QzAwMDQ1NEUwMDAwNjFBCis6MTAzNUUwMDAyNDBCMDAwMThGODIwMDU0MDEyMjEwMjMyQzQyMDAzMzRGCis6MTAzNUYwMDAxNDQwRkZBNjAwMDAwMDAwMzE2MzAwRkYyNDAyMDAwMTE4Cis6MTAzNjAwMDAxMDYyMDAyMjAwMDAwMDAwM0MwNDAwMDEyNDg0NTM5MDVBCis6MTAzNjEwMDBBRkEwMDAxMEFGQTAwMDE0OEY4NjAxMjA4Rjg3MDEyNDc3Cis6MTAzNjIwMDAzQzA1MDAwOTBDMDAyNDAzMzRBNUYwMTEwODAwMURBMDdFCis6MTAzNjMwMDAwMDAwMDAwMDNDMDQwMDAxMjQ4NDUzOUNBRkEwMDAxNDRGCis6MTAzNjQwMDA4Rjg2MDEyMDhGODcwMTI0M0MwNTAwMDkwQzAwMjQwMzhDCis6MTAzNjUwMDAzNEE1RjAxMDA4MDAxREEwMDAwMDAwMDAzQzA0MDAwMThCCis6MTAzNjYwMDAyNDg0NTNBOEFGQTAwMDE0OEVFNjA2MDg4RjQ3MDIyOEQyCis6MTAzNjcwMDAzQzA1MDAwOTBDMDAyNDAzMzRBNUYwMEY4RUUyMDFBQ0Q4Cis6MTAzNjgwMDAyNDQyMDAwMUFFRTIwMUFDOEVFMjAxQUM4RUUyMDEyNEU0Cis6MTAzNjkwMDAyNDQyMDAwMUFFRTIwMTI0MDgwMDFGOTc4RUUyMDEyNEJCCis6MTAzNkEwMDAyNzQ0MDIxMjBDMDAyMkZFMjQwNTAwMDYzMDQ5MDAxRkE4Cis6MTAzNkIwMDAwMDA5MjhDMDAyRTUxMDIxOTQ0MjcyN0MzMDQyODAwMDRCCis6MTAzNkMwMDAxMDQwMDAyRjAyRTUxMDIxOTQ0MjcyN0MzMDQyNDAwMEVECis6MTAzNkQwMDAxNDQwMDAxQzAwQjcxMDIxOTQ0MzcyN0U5NzQyMDIxMkRFCis6MTAzNkUwMDAxNDYyMDAxODAwQjcxMDIxOEM0MzcyODA4RjQyMDIxNEJDCis6MTAzNkYwMDA1NDYyMDAxNkFGQTIwMDEwOTJFMjA0RDgxMDQwMDAwN0Y2Cis6MTAzNzAwMDAyNDAyMDAwMThFRTMwNERDMDEyMjEwMDQwMDAyMTAyN0QxCis6MTAzNzEwMDAwMDYyMTgyNDA4MDAxREM5QUVFMzA0REM4RjgzMDIyODcwCis6MTAzNzIwMDAwMTIyMTAwNDAwMDIxMDI3MDA2MjE4MjRBRjgzMDIyODJGCis6MTAzNzMwMDAwMDA5MTBDMDAyRTIxODIxMzQwMkMwMDAwODAwMUU0RTI5Cis6MTAzNzQwMDBBNDYyNzI3QzhGNDIwMjE0QUZBMjAwMTAwMDA5MTBDMDY0Cis6MTAzNzUwMDAwMDU3MTAyMThDNDI3MjdDM0MwNDAwMDEyNDg0NTNCNDM1Cis6MTAzNzYwMDAzQzA1MDAwM0FGQTIwMDE0OEY0NzAyMTAzNEE1RjAxQ0UzCis6MTAzNzcwMDAwQzAwMjQwMzAxMjAzMDIxMDgwMDFFODMzQzAyMDgwMEI1Cis6MTAzNzgwMDAwMEI3MTAyMTk0NDM3MjdFOTc0MjAyMTIxNDYyMDAxOTBFCis6MTAzNzkwMDAwMDA5MThDMDAwQjcxMDIxOEM0MzcyODA4RjQyMDIxNEI4Cis6MTAzN0EwMDAxNDYyMDAxNDAwMDkxOEMwMDJFNTEwMjE5NDQ3NzI3Q0NECis6MTAzN0IwMDAwMDA3MjBDMDAwOTcxMDIxOTQ0MzczN0UwMEI3MTAyMUFBCis6MTAzN0MwMDBBNDQzNzI3RTAwOTcxMDIxOEM0MzczODAwMEI3MTAyMUIwCis6MTAzN0QwMDBBQzQzNzI4MDAyRTQxMDIxOTQ0MzczN0MwMkU1MTAyMTEzCis6MTAzN0UwMDBBNDQzNzI3QzAyRTQxODIxMzQwMkMwMDAwODAwMUU0RTdCCis6MTAzN0YwMDBBNDYyNzM3QzAyRTMxMDIxOTQ0NzcyN0MwMDAwMzAyMUE0Cis6MTAzODAwMDAwMDA3MjBDMDAyRTQxMDIxOTQ0MjczN0MwMDAwNDAyMTk0Cis6MTAzODEwMDAzMDQyODAwMDE0NDAwMDI1MDBFMDI4MjEwMDYwNTAyMTQzCis6MTAzODIwMDAzNDBCQzAwMDAwOTcxMDIxOTQ0MzczN0U5NzQyMDIxMjFDCis6MTAzODMwMDA1NDYyMDAxNTAwRTAyODIxMDA5NzEwMjE4QzQzNzM4MDBBCis6MTAzODQwMDA4RjQyMDIxNDU0NjIwMDEwMDBFMDI4MjExMTAwMDAwNjhCCis6MTAzODUwMDAwMkU0MTAyMTk0NDM3MzdDMDAwNTEwQzAwMkUyMTAyMUExCis6MTAzODYwMDAwODAwMUUxQUE0NDM3MzdDOTQ0MzczN0MwMkVBMTAyMTVGCis6MTAzODcwMDBBNDQzNzI3QzAwMDcxMEMwMDJFMjEwMjFBNDRCNzM3Q0E5Cis6MTAzODgwMDAwODAwMUUyODI0MDYwMDAxMDAwNTEwQzAwMkUyMTAyMUQ1Cis6MTAzODkwMDA5NDQ3NzM3QzAwMDcyMEMwMDJFNDEwMjE5NDQyNzM3QzlCCis6MTAzOEEwMDAzMDQyODAwMDEwNDBGRkRGMjUwODAwMDEzMEMyMDBGRkQ5Cis6MTAzOEIwMDAxNDQwMDAyNTAwMDAyMDIxMDAwNzIwQzAwMDk3MTAyMTlGCis6MTAzOEMwMDA5NDQzNzM3RTk3NDIwMjEyMTQ2MjAwMEYwMDA5MTBDMEU1Cis6MTAzOEQwMDAwMDk3MTAyMThDNDM3MzgwOEY0MjAyMTQxNDYyMDAwQUY3Cis6MTAzOEUwMDAwMDA5MTBDMDAyRTQxODIxMzQwMkMwMDAxNTAwMDAxNUMwCis6MTAzOEYwMDBBNDYyNzM3QzAwMDkxMEMwMDJFMjE4MjEzNDAyODAwMDI3Cis6MTAzOTAwMDAwODAwMUU0RUE0NjI3MjdDMDA1NzEwMjE4QzQyNzI3QzBCCis6MTAzOTEwMDAzQzA0MDAwMTI0ODQ1M0MwM0MwNTAwMDNBRkEyMDAxMDA2Cis6MTAzOTIwMDAwMDA3MTBDMDAwNTcxMDIxOEM0MjczN0MzNEE1MDAxRTg0Cis6MTAzOTMwMDAwMTIwMzAyMTBDMDAyNDAzQUZBMjAwMTQwODAwMUU4M0Q0Cis6MTAzOTQwMDAzQzAyMDgwMDAwMDAyMDIxMDAwNDI4QzAwMEI3MTAyMTFDCis6MTAzOTUwMDA5NDQzNzc3RTk3NDIwMjEyNTQ2MjAwMkIyNDg0MDAwMTI0Cis6MTAzOTYwMDAwMEI3MTAyMThDNDM3NzgwOEY0MjAyMTQ1NDYyMDAyNkU2Cis6MTAzOTcwMDAyNDg0MDAwMTNDMDIwMDAxMDA1NzEwMjE4QzQyODNCNEQyCis6MTAzOTgwMDAyNDQyRkZGRjNDMDEwMDAxMDAzNzA4MjFBQzIyODNCNDMwCis6MTAzOTkwMDAzQzAyMDAwMTAwNTcxMDIxOEM0MjgzQjQwMDgwOTAyMTJBCis6MTAzOUEwMDAwMjQyMTAyQjEwNDAwMDBFMjRCMTc3N0MyNEIwNzc4NEEzCis6MTAzOUIwMDAwMkYwMjAyMTAyRjEyODIxMEMwMDI0OTAyNDA2MDAwOEE2Cis6MTAzOUMwMDAyNjMxMDAwODNDMDIwMDAxMDA1NzEwMjE4QzQyODNCNENDCis6MTAzOUQwMDAyNjUyMDAwMTAyNDIxMDJCMTQ0MEZGRjUyNjEwMDAwODY5Cis6MTAzOUUwMDAzQzA0MDAwMTAwOTcyMDIxOEM4NDgzQjQyNDA1MDAwODQ2Cis6MTAzOUYwMDAwMDA0MjBDMDI0ODQ3NzdDMEMwMDI0ODgwMkU0MjAyMTY5Cis6MTAzQTAwMDAwODAwMUU4MzNDMDIwODAwMkM4MjAwODAxNDQwRkZDRjc3Cis6MTAzQTEwMDAwMDA0MjhDMDNDMDIwODAwMzQ0MjIwMDBBRkEyMDAxODc1Cis6MTAzQTIwMDA4RUUyMDYwODhGNDMwMjI4MjQ0MjAwMDEzMDRBMDBGRjNDCis6MTAzQTMwMDA1MTQzMDBGREFGQTAwMDEwOEVFMjA2MDgwMDAyMTBDMDQ2Cis6MTAzQTQwMDAwMDU3MTAyMThGQTMwMDE4OEZBNDAwMUNBQzQzMDYwQzU0Cis6MTAzQTUwMDBBQzQ0MDYxMDhGODMwMDU0OEY4MjAwNTQyNDY5MDAzMkQ2Cis6MTAzQTYwMDAwMTIyMTAyMzJDNDIwMDMzMTA0MDAwNkEwMDAwNTgyMTJDCis6MTAzQTcwMDAyNDEwMDAwODI0MEYwMDBEMjQwRDAwMDcyNDBDMDA0MDIyCis6MTAzQTgwMDAyNDBFMDAwMThGODcwMTIwMjc2MjM4MDAyNEU4MDAyMERGCis6MTAzQTkwMDAwMTAyMTAyQjUwNDAwMDAxMjc2ODMwMDA4RjgyMDEyODVFCis6MTAzQUEwMDAxMTAyMDAwNDAwMDAwMDAwOEY4MjAxMjQxNTAyMDAwN0FCCis6MTAzQUIwMDAwMDAwMTAyMThFRTIwMUE0MDAwMDM4MjEyNDQyMDAwMTAwCis6MTAzQUMwMDBBRUUyMDFBNDA4MDAxRUZCOEVFMjAxQTQ4RUU0MDYwODBCCis6MTAzQUQwMDAwMDA0MjBDMDAwODAxODIxOEVFNDA0MzA4RUU1MDQzNEY4Cis6MTAzQUUwMDAwMEEzMjgyMTAwQTMzMDJCMDA4MjIwMjEwMDg2MjAyMTYyCis6MTAzQUYwMDBBQ0U0MDAwMEFDRTUwMDA0OEVFMjA2MDhBNEYwMDAwRTgxCis6MTAzQjAwMDBBQ0VGMDAxOEFDRUEwMDFDMDAwMjEwQzAyNDQyMDYwQzA2Cis6MTAzQjEwMDAwMkUyMTAyMUFDRTIwMDA4OEVFMjA0QzRBQ0UyMDAxMDI0Cis6MTAzQjIwMDBBRjg4MDEyMDkyRTI0RTIwMTQ0MDAwMzMyNDA3MDAwMUE4Cis6MTAzQjMwMDA4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzgwMkUyMjAyMUIyCis6MTAzQjQwMDA4QzgyMDAwMDE0NEQwMDFGMDAwMDAwMDA4RUUzNEUzMEY4Cis6MTAzQjUwMDA4RUUyNEUzNDEwNjIwMDFCMDAwMDAwMDA4QzgyMDAwNEQ0Cis6MTAzQjYwMDAyNDQyMDAwMUFDODIwMDA0OEVFMjRFMzQ4RUUzNEUzMERCCis6MTAzQjcwMDAyNDQyMDAwMTEwNEMwMDA3MDAwMDAwMDA4RUUyNEUzNDg5Cis6MTAzQjgwMDAyNDQyMDAwMTEwNjIwMDA1MDAwMDAwMDAwODAwMUVFODQ5Cis6MTAzQjkwMDAwMDAwMDAwMDE0NjAwMDA1MDAwMDAwMDA4RjgyMDEyODcyCis6MTAzQkEwMDAyNDQyMDAyMEFGODIwMTI4OEY4MjAxMjg4QzgyMDAwNEU5Cis6MTAzQkIwMDAyQzQyMDAxMTUwNDAwMDEwQUM4MDAwMDAwODAwMUVGQjk5Cis6MTAzQkMwMDAwMDAwMDAwMDhFRTI0RTMwMjQ0MjAwMDE1MDRDMDAwMzAxCis6MTAzQkQwMDAwMDAwMTAyMThFRTI0RTMwMjQ0MjAwMDFBRUUyNEUzMDUxCis6MTAzQkUwMDA4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzgwMkUyMjAyMTAyCis6MTAzQkYwMDBBQzhEMDAwMEFDOEUwMDA0NTRFMDAwMDYyNDBCMDAwMUU0Cis6MTAzQzAwMDA4RjgyMDA1NDAxMjIxMDIzMkM0MjAwMzMxNDQwRkY5RDY4Cis6MTAzQzEwMDAwMDAwMDAwMDMxNjMwMEZGMjQwMjAwMDE1NDYyMDA3OEJDCis6MTAzQzIwMDBBRkEwMDAxMEFFRUEwNjA4OEY4MzAwNTQ4RjgyMDA1NEM0Cis6MTAzQzMwMDAyNDY5MDAzMjAxMjIxMDIzMkM0MjAwMzMxMDQwMDA2MTFECis6MTAzQzQwMDAwMDAwNTgyMTI0MEUwMDA4MjQwRDAwMTEyNDBBMDAxMjNGCis6MTAzQzUwMDAyNDA4MDA0MDI0MEMwMDAxOEY4MzAxMjAyNzYyMzgwMEQzCis6MTAzQzYwMDAyNDY2MDAyMDAwQzIxMDJCNTA0MDAwMDEyNzY2MzAwMDVGCis6MTAzQzcwMDA4RjgyMDEyODEwQzIwMDA0MDAwMDAwMDA4RjgyMDEyNEZFCis6MTAzQzgwMDAxNEMyMDAwNzAwMDAwMDAwOEVFMjAxQTQwMDAwMzgyMUU5Cis6MTAzQzkwMDAyNDQyMDAwMUFFRTIwMUE0MDgwMDFGNjc4RUUyMDFBNEU1Cis6MTAzQ0EwMDA4RUUyMDYwOEFDNjIwMDFDOEVFNDA0QTA4RUU1MDRBNDNCCis6MTAzQ0IwMDAyNDYyMDAxQ0FDNjIwMDA4QTQ2RTAwMEVBQzZEMDAxOEZCCis6MTAzQ0MwMDBBQzY0MDAwMEFDNjUwMDA0OEVFMjA0QzRBQzYyMDAxMDc5Cis6MTAzQ0QwMDBBRjg2MDEyMDkyRTI0RTIwMTQ0MDAwMzMyNDA3MDAwMUY5Cis6MTAzQ0UwMDA4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzgwMkUyMjAyMTAxCis6MTAzQ0YwMDA4QzgyMDAwMDE0NEEwMDFGMDAwMDAwMDA4RUUzNEUzMDRBCis6MTAzRDAwMDA4RUUyNEUzNDEwNjIwMDFCMDAwMDAwMDA4QzgyMDAwNDIyCis6MTAzRDEwMDAyNDQyMDAwMUFDODIwMDA0OEVFMjRFMzQ4RUUzNEUzMDI5Cis6MTAzRDIwMDAyNDQyMDAwMTEwNDgwMDA3MDAwMDAwMDA4RUUyNEUzNERCCis6MTAzRDMwMDAyNDQyMDAwMTEwNjIwMDA1MDAwMDAwMDAwODAwMUY1NDJBCis6MTAzRDQwMDAwMDAwMDAwMDE0NjAwMDA1MDAwMDAwMDA4RjgyMDEyOEMwCis6MTAzRDUwMDAyNDQyMDAyMEFGODIwMTI4OEY4MjAxMjg4QzgyMDAwNDM3Cis6MTAzRDYwMDAyQzQyMDAxMTUwNDAwMDEwQUM4MDAwMDAwODAwMUY2NzdBCis6MTAzRDcwMDAwMDAwMDAwMDhFRTI0RTMwMjQ0MjAwMDE1MDQ4MDAwMzUzCis6MTAzRDgwMDAwMDAwMTAyMThFRTI0RTMwMjQ0MjAwMDFBRUUyNEUzMDlGCis6MTAzRDkwMDA4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzgwMkUyMjAyMTUwCis6MTAzREEwMDBBQzhBMDAwMEFDOEMwMDA0NTRFMDAwMDYyNDBCMDAwMTM3Cis6MTAzREIwMDA4RjgyMDA1NDAxMjIxMDIzMkM0MjAwMzMxNDQwRkZBNkFFCis6MTAzREMwMDAwMDAwMDAwMDMxNjMwMEZGMjQwMjAwMDExMDYyMDAyMkE1Cis6MTAzREQwMDAwMDAwMDAwMDNDMDQwMDAxMjQ4NDUzOTBBRkEwMDAxMEI4Cis6MTAzREUwMDBBRkEwMDAxNDhGODYwMTIwOEY4NzAxMjQzQzA1MDAwOUI1Cis6MTAzREYwMDAwQzAwMjQwMzM0QTVGMDExMDgwMDFGOTMwMDAwMDAwMEZDCis6MTAzRTAwMDAzQzA0MDAwMTI0ODQ1MzlDQUZBMDAwMTQ4Rjg2MDEyMDQxCis6MTAzRTEwMDA4Rjg3MDEyNDNDMDUwMDA5MEMwMDI0MDMzNEE1RjAxMDExCis6MTAzRTIwMDAwODAwMUY5MzAwMDAwMDAwM0MwNDAwMDEyNDg0NTNBOEY0Cis6MTAzRTMwMDBBRkEwMDAxNDhFRTYwNjA4OEY0NzAyMjgzQzA1MDAwOTUzCis6MTAzRTQwMDAwQzAwMjQwMzM0QTVGMDBGOEVFMjAxQUMyNDQyMDAwMUUzCis6MTAzRTUwMDBBRUUyMDFBQzhFRTIwMUFDOEVFMjAxMjgyNDQyMDAwMTA4Cis6MTAzRTYwMDBBRUUyMDEyODhFRTIwMTI4OEVFMjAxNjQyNDQyMDAwMUM0Cis6MTAzRTcwMDBBRUUyMDE2NDA4MDAyMkU4OEVFMjAxNjQ4RkEyMDAyMDE1Cis6MTAzRTgwMDAwMDAyMTIwMDAwMDIxRDAyMjQwMjAwMDExMDYyMDAwNTVGCis6MTAzRTkwMDAyNDAyMDAwMjEwNjIwMDBEMDAwMDAwMDAwODAwMUZCNzlECis6MTAzRUEwMDBBRkEwMDAxMDkyRTIwNEQ4MTQ0MDAwMDYyNDAyMDAwMUUyCis6MTAzRUIwMDA4RjgyMDIyOEFFRTIwNERDMjQwMkZGRkZBRjgyMDIyOEQ4Cis6MTAzRUMwMDAyNDAyMDAwMTA4MDAxRkJFQTJFMjA0RDg5MkUyMDREODM2Cis6MTAzRUQwMDA1MDQwMDAwQ0EyRTAwNEQ4OEVFMjA0RENBRjgyMDIyODNECis6MTAzRUUwMDAwODAwMUZCRUEyRTAwNEQ4M0MwNDAwMDEyNDg0NTNDODhCCis6MTAzRUYwMDBBRkEwMDAxNDhGQTYwMDIwM0MwNTAwMDMwQzAwMjQwMzkzCis6MTAzRjAwMDAzNEE1RjAwOThFRTIwMTNDMjQ0MjAwMDFBRUUyMDEzQ0ZFCis6MTAzRjEwMDAwODAwMjJFODhFRTIwMTNDOEZBMjAwMjAwMDAyMTIwMDdECis6MTAzRjIwMDAwMDAyMjUwMjI0MDIwMDAxMTA4MjAwMDUyNDAyMDAwMjgyCis6MTAzRjMwMDAxMDgyMDAwRjAwMDAwMDAwMDgwMDFGRTNBRkEwMDAxMDc3Cis6MTAzRjQwMDA4RjgyMDIyMDNDMDMwOEZGMzQ2M0ZGRkYwMDQzMTAyNEVDCis6MTAzRjUwMDAzNDQyMDAwOEFGODIwMjIwMjQwMjAwMDEzQzAxMDAwMTJCCis6MTAzRjYwMDAwMDM3MDgyMUEwMjI4M0IyMDgwMDFGRUFBRUU0MDEwODRFCis6MTAzRjcwMDA4RjgyMDIyMDNDMDMwOEZGMzQ2M0ZGRjcwMDQzMTAyNEM0Cis6MTAzRjgwMDBBRjgyMDIyMDNDMDEwMDAxMDAzNzA4MjFBMDIwODNCMjRCCis6MTAzRjkwMDAwODAwMUZFQUFFRTQwMTA4M0MwNDAwMDEyNDg0NTNENDY1Cis6MTAzRkEwMDBBRkEwMDAxNDhGQTYwMDIwM0MwNTAwMDMwQzAwMjQwM0UyCis6MTAzRkIwMDAzNEE1RjAwQThFRTIwMTJDMjQ0MjAwMDFBRUUyMDEyQzZECis6MTAzRkMwMDAwODAwMjJFODhFRTIwMTJDOEZBMjAwMjAwMDAyMTIwMERECis6MTAzRkQwMDAwMDAyMUQwMjI0MDIwMDAxMTA2MjAwMDUyNDAyMDAwMkZBCis6MTAzRkUwMDAxMDYyMDAwRTAwMDAwMDAwMDgwMDIwMTFBRkEwMDAxMEI5Cis6MTAzRkYwMDA4RjgyMDIyMDNDMDMwOEZGMzQ2M0ZGRkYwMDQzMTAyNDNDCis6MTA0MDAwMDAzNDQyMDAwOEFGODIwMjIwMjQwMjAwMDEzQzAxMDAwMTdBCis6MTA0MDEwMDAwMDM3MDgyMTA4MDAyMDE4QTAyMjgzQjMzQzAyMDAwMUM5Cis6MTA0MDIwMDAwMDU3MTAyMTkwNDI4M0IyM0MwMTAwMDEwMDM3MDgyMTYzCis6MTA0MDMwMDAxNDQwMDAwRUEwMjA4M0IzOEY4MjAyMjAzQzAzMDhGRkFGCis6MTA0MDQwMDAzNDYzRkZGNzAwNDMxMDI0MDgwMDIwMThBRjgyMDIyMEQ5Cis6MTA0MDUwMDAzQzA0MDAwMTI0ODQ1M0UwQUZBMDAwMTQ4RkE2MDAyMDhDCis6MTA0MDYwMDAzQzA1MDAwMzBDMDAyNDAzMzRBNUYwMEI4RUUyMDExNDgwCis6MTA0MDcwMDAyNDQyMDAwMUFFRTIwMTE0MDgwMDIyRTg4RUUyMDExNDlECis6MTA0MDgwMDAyNzg0MDIwODI3NDUwMjAwMEMwMDI0OUEyNDA2MDAwODExCis6MTA0MDkwMDAyNkU0MDA5NDI3NDUwMjAwMEMwMDI0OUEyNDA2MDAwODE4Cis6MTA0MEEwMDA4RUUyMDEzNDI0NDIwMDAxQUVFMjAxMzQwODAwMjJFODJECis6MTA0MEIwMDA4RUUyMDEzNDhGNDYwMjQ4MDAwMDIwMjEwQzAwNTEwODk2Cis6MTA0MEMwMDAyNDA1MDAwNDhFRTIwMTMwMjQ0MjAwMDFBRUUyMDEzMEZBCis6MTA0MEQwMDAwODAwMjJFODhFRTIwMTMwOEVGMzAxQ0M4RUY0MDFEMDhDCis6MTA0MEUwMDA4RUY1MDFEODhFRTIwMTQwMjZFNDAwMzAyNDQyMDAwMTIyCis6MTA0MEYwMDBBRUUyMDE0MDhFRjAwMTQwOEVGMTAwNzQ4RUYyMDA3MDRECis6MTA0MTAwMDAwQzAwMjQ4ODI0MDUwNDAwQUVGMzAxQ0NBRUY0MDFEMEU5Cis6MTA0MTEwMDBBRUY1MDFEOEFFRjAwMTQwQUVGMTAwNzRBRUYyMDA3MDIxCis6MTA0MTIwMDA4RjQyMDI1QzI2RTQwMDk0QUVFMjAwNjA4RjQyMDI2MDlGCis6MTA0MTMwMDAyNzQ1MDIwMDI0MDYwMDA4QUVFMjAwNjgyNDAyMDAwNkJCCis6MTA0MTQwMDAwQzAwMjQ5QUFFRTIwMDY0M0MwMjNCOUEzNDQyQ0EwMDVFCis6MTA0MTUwMDBBRUUyMDA2QzI0MDIwM0U4MjQwNDAwMDIyNDAzMDAwMTAwCis6MTA0MTYwMDBBRUUyMDEwNEFFRTQwMTAwQUVFMzAxMEM4RjgyMDIyMDU2Cis6MTA0MTcwMDAzMDQyMDAwODEwNDAwMDA0MDAwMDAwMDBBRUUzMDEwOEQ3Cis6MTA0MTgwMDAwODAwMjA2MTAwMDAyMDIxQUVFNDAxMDgwMDAwMjAyMTg5Cis6MTA0MTkwMDAzQzAzMDAwMTAwNjQxODIxOTA2MzVDMzAwMkU0MTAyMUFDCis6MTA0MUEwMDAyNDg0MDAwMUEwNDMwMDlDMkM4MjAwMEYxNDQwRkZGOERGCis6MTA0MUIwMDAwMDAwMDAwMDhGODIwMDQwMDJFNDE4MjEyNDg0MDAwMUU2Cis6MTA0MUMwMDAwMDAyMTcwMjI0NDIwMDMwQTA2MjAwOUMwMkU0MTAyMTg5Cis6MTA0MUQwMDAwODAwMjJFOEEwNDAwMDlDMjQwMjAwMDEzQzAxMDAwMUVDCis6MTA0MUUwMDAwMDM3MDgyMUEwMjI4M0UwMjQwQjA0MDAyNDA4MDAxNEQ3Cis6MTA0MUYwMDAyNDBBMDA0MDI0MDkwMDAxOEY4MzAxMDAyNzYyMzAwMDU3Cis6MTA0MjAwMDAyNDY2MDAyMDAwQzIxMDJCNTA0MDAwMDEyNzY2MjgwMEMxCis6MTA0MjEwMDA4RjgyMDEwODEwQzIwMDA0MDAwMDAwMDA4RjgyMDEwNDk4Cis6MTA0MjIwMDAxNEMyMDAwNzI2RTIwMDMwOEVFMjAxQTgwMDAwMzgyMTA3Cis6MTA0MjMwMDAyNDQyMDAwMUFFRTIwMUE4MDgwMDIwQTg4RUUyMDFBOEY1Cis6MTA0MjQwMDA4RUU0MDRCODhFRTUwNEJDQUM2MjAwMDhBNDZCMDAwRURBCis6MTA0MjUwMDBBQzY4MDAxOEFDNjAwMDFDQUM2NDAwMDBBQzY1MDAwNEU1Cis6MTA0MjYwMDA4RUUyMDRDQ0FDNjIwMDEwQUY4NjAxMDA5MkUyMDRFQzU2Cis6MTA0MjcwMDAxNDQwMDAwRTI0MDcwMDAxOEVFMjRFMjgyNDQyMDAwMTYzCis6MTA0MjgwMDA1MDRBMDAwMzAwMDAxMDIxOEVFMjRFMjgyNDQyMDAwMTEzCis6MTA0MjkwMDBBRUUyNEUyODhFRTI0RTI4MDAwMjEwQzAyNDQyNEUzODc0Cis6MTA0MkEwMDAwMkUyMTAyMUFDNDgwMDAwQUM0OTAwMDQxMEUwRkZEMjRCCis6MTA0MkIwMDAwMDAwMDAwMDA4MDAyMkU4MDAwMDAwMDAzQzAyMDkwMEE1Cis6MTA0MkMwMDBBRUUwNTIzOEFFRTA1MjNDQUVFMDUyNDBBRUUwNTI0NDc2Cis6MTA0MkQwMDBBRUUwMDFEMDNDMDEwMDAxMDAzNzA4MjFBMDIwODNCMUVECis6MTA0MkUwMDBBRkEyMDAxODhFRTIwNjA4OEY0MzAyMjgyNDQyMDAwMTg0Cis6MTA0MkYwMDAzMDRBMDBGRjUxNDMwMEZEQUZBMDAwMTA4RUUyMDYwOEQ3Cis6MTA0MzAwMDAwMDAyMTBDMDAwNTcxMDIxOEZBMzAwMTg4RkE0MDAxQ0JBCis6MTA0MzEwMDBBQzQzMDYwQ0FDNDQwNjEwOEY4MzAwNTQ4RjgyMDA1NENCCis6MTA0MzIwMDAyNDY5MDAzMjAxMjIxMDIzMkM0MjAwMzMxMDQwMDA2QTFECis6MTA0MzMwMDAwMDAwNTgyMTI0MTAwMDA4MjQwRjAwMEQyNDBEMDAwNzUwCis6MTA0MzQwMDAyNDBDMDA0MDI0MEUwMDAxOEY4NzAxMjAyNzYyMzgwMEQyCis6MTA0MzUwMDAyNEU4MDAyMDAxMDIxMDJCNTA0MDAwMDEyNzY4MzAwMEEzCis6MTA0MzYwMDA4RjgyMDEyODExMDIwMDA0MDAwMDAwMDA4RjgyMDEyNEM2Cis6MTA0MzcwMDAxNTAyMDAwNzAwMDAxMDIxOEVFMjAxQTQwMDAwMzgyMTgwCis6MTA0MzgwMDAyNDQyMDAwMUFFRTIwMUE0MDgwMDIxMkM4RUUyMDFBNDI3Cis6MTA0MzkwMDA4RUU0MDYwODAwMDQyMEMwMDA4MDE4MjE4RUU0MDQzMDVBCis6MTA0M0EwMDA4RUU1MDQzNDAwQTMyODIxMDBBMzMwMkIwMDgyMjAyMUI1Cis6MTA0M0IwMDAwMDg2MjAyMUFDRTQwMDAwQUNFNTAwMDQ4RUUyMDYwODkzCis6MTA0M0MwMDBBNEYwMDAwRUFDRUYwMDE4QUNFQTAwMUMwMDAyMTBDMDE0Cis6MTA0M0QwMDAyNDQyMDYwQzAyRTIxMDIxQUNFMjAwMDg4RUUyMDRDNDgyCis6MTA0M0UwMDBBQ0UyMDAxMEFGODgwMTIwOTJFMjRFMjAxNDQwMDAzMzZFCis6MTA0M0YwMDAyNDA3MDAwMThFRTI0RTMwMDAwMjEwQzAyNDQyNTAzOEUzCis6MTA0NDAwMDAwMkUyMjAyMThDODIwMDAwMTQ0RDAwMUYwMDAwMDAwMEY5Cis6MTA0NDEwMDA4RUUzNEUzMDhFRTI0RTM0MTA2MjAwMUIwMDAwMDAwMDJFCis6MTA0NDIwMDA4QzgyMDAwNDI0NDIwMDAxQUM4MjAwMDQ4RUUyNEUzNEVGCis6MTA0NDMwMDA4RUUzNEUzMDI0NDIwMDAxMTA0QzAwMDcwMDAwMDAwMEMzCis6MTA0NDQwMDA4RUUyNEUzNDI0NDIwMDAxMTA2MjAwMDUwMDAwMDAwMDlDCis6MTA0NDUwMDAwODAwMjExOTAwMDAwMDAwMTQ2MDAwMDUwMDAwMDAwMEExCis6MTA0NDYwMDA4RjgyMDEyODI0NDIwMDIwQUY4MjAxMjg4RjgyMDEyOEY4Cis6MTA0NDcwMDA4QzgyMDAwNDJDNDIwMDExNTA0MDAwMTBBQzgwMDAwMERGCis6MTA0NDgwMDAwODAwMjEyQzAwMDAwMDAwOEVFMjRFMzAyNDQyMDAwMTgyCis6MTA0NDkwMDA1MDRDMDAwMzAwMDAxMDIxOEVFMjRFMzAyNDQyMDAwMUY3Cis6MTA0NEEwMDBBRUUyNEUzMDhFRTI0RTMwMDAwMjEwQzAyNDQyNTAzODUwCis6MTA0NEIwMDAwMkUyMjAyMUFDOEQwMDAwQUM4RTAwMDQ1NEUwMDAwNjI2Cis6MTA0NEMwMDAyNDBCMDAwMThGODIwMDU0MDEyMjEwMjMyQzQyMDAzMzYwCis6MTA0NEQwMDAxNDQwRkY5RDAwMDAwMDAwMzE2MzAwRkYyNDAyMDAwMTMyCis6MTA0NEUwMDA1NDYyMDA3OEFGQTAwMDEwQUVFQTA2MDg4RjgzMDA1NDMzCis6MTA0NEYwMDA4RjgyMDA1NDI0NjkwMDMyMDEyMjEwMjMyQzQyMDAzM0ExCis6MTA0NTAwMDAxMDQwMDA2MTAwMDA1ODIxMjQwRTAwMDgyNDBEMDAxMTA1Cis6MTA0NTEwMDAyNDBBMDAxMjI0MDgwMDQwMjQwQzAwMDE4RjgzMDEyMDhCCis6MTA0NTIwMDAyNzYyMzgwMDI0NjYwMDIwMDBDMjEwMkI1MDQwMDAwMTkyCis6MTA0NTMwMDAyNzY2MzAwMDhGODIwMTI4MTBDMjAwMDQwMDAwMDAwMEFFCis6MTA0NTQwMDA4RjgyMDEyNDE0QzIwMDA3MDAwMDAwMDA4RUUyMDFBNDQzCis6MTA0NTUwMDAwMDAwMzgyMTI0NDIwMDAxQUVFMjAxQTQwODAwMjE5OEE1Cis6MTA0NTYwMDA4RUUyMDFBNDhFRTIwNjA4QUM2MjAwMUM4RUU0MDRBMDc4Cis6MTA0NTcwMDA4RUU1MDRBNDI0NjIwMDFDQUM2MjAwMDhBNDZFMDAwRTQ4Cis6MTA0NTgwMDBBQzZEMDAxOEFDNjQwMDAwQUM2NTAwMDQ4RUUyMDRDNDlECis6MTA0NTkwMDBBQzYyMDAxMEFGODYwMTIwOTJFMjRFMjAxNDQwMDAzMzNFCis6MTA0NUEwMDAyNDA3MDAwMThFRTI0RTMwMDAwMjEwQzAyNDQyNTAzODMxCis6MTA0NUIwMDAwMkUyMjAyMThDODIwMDAwMTQ0QTAwMUYwMDAwMDAwMDRCCis6MTA0NUMwMDA4RUUzNEUzMDhFRTI0RTM0MTA2MjAwMUIwMDAwMDAwMDdECis6MTA0NUQwMDA4QzgyMDAwNDI0NDIwMDAxQUM4MjAwMDQ4RUUyNEUzNDNFCis6MTA0NUUwMDA4RUUzNEUzMDI0NDIwMDAxMTA0ODAwMDcwMDAwMDAwMDE2Cis6MTA0NUYwMDA4RUUyNEUzNDI0NDIwMDAxMTA2MjAwMDUwMDAwMDAwMEVCCis6MTA0NjAwMDAwODAwMjE4NTAwMDAwMDAwMTQ2MDAwMDUwMDAwMDAwMDgzCis6MTA0NjEwMDA4RjgyMDEyODI0NDIwMDIwQUY4MjAxMjg4RjgyMDEyODQ2Cis6MTA0NjIwMDA4QzgyMDAwNDJDNDIwMDExNTA0MDAwMTBBQzgwMDAwMDJECis6MTA0NjMwMDAwODAwMjE5ODAwMDAwMDAwOEVFMjRFMzAyNDQyMDAwMTY0Cis6MTA0NjQwMDA1MDQ4MDAwMzAwMDAxMDIxOEVFMjRFMzAyNDQyMDAwMTQ5Cis6MTA0NjUwMDBBRUUyNEUzMDhFRTI0RTMwMDAwMjEwQzAyNDQyNTAzODlFCis6MTA0NjYwMDAwMkUyMjAyMUFDOEEwMDAwQUM4QzAwMDQ1NEUwMDAwNjc5Cis6MTA0NjcwMDAyNDBCMDAwMThGODIwMDU0MDEyMjEwMjMyQzQyMDAzM0FFCis6MTA0NjgwMDAxNDQwRkZBNjAwMDAwMDAwMzE2MzAwRkYyNDAyMDAwMTc3Cis6MTA0NjkwMDAxMDYyMDAyMjAwMDAwMDAwM0MwNDAwMDEyNDg0NTM5MEJBCis6MTA0NkEwMDBBRkEwMDAxMEFGQTAwMDE0OEY4NjAxMjA4Rjg3MDEyNEQ3Cis6MTA0NkIwMDAzQzA1MDAwOTBDMDAyNDAzMzRBNUYwMTEwODAwMjFDNEI2Cis6MTA0NkMwMDAwMDAwMDAwMDNDMDQwMDAxMjQ4NDUzOUNBRkEwMDAxNEFGCis6MTA0NkQwMDA4Rjg2MDEyMDhGODcwMTI0M0MwNTAwMDkwQzAwMjQwM0VDCis6MTA0NkUwMDAzNEE1RjAxMDA4MDAyMUM0MDAwMDAwMDAzQzA0MDAwMUMzCis6MTA0NkYwMDAyNDg0NTNBOEFGQTAwMDE0OEVFNjA2MDg4RjQ3MDIyODMyCis6MTA0NzAwMDAzQzA1MDAwOTBDMDAyNDAzMzRBNUYwMEY4RUUyMDFBQzM3Cis6MTA0NzEwMDAyNDQyMDAwMUFFRTIwMUFDOEVFMjAxQUM4RUUyMDEyMDQ3Cis6MTA0NzIwMDAyNDQyMDAwMUFFRTIwMTIwOEVFMjAxMjA4RUUyMDE2ODA3Cis6MTA0NzMwMDAyNDQyMDAwMUFFRTIwMTY4MDgwMDIyRTg4RUUyMDE2ODJFCis6MTA0NzQwMDA4RjQyMDI1QzI2RTQwMDk0QUVFMjAwNjA4RjQyMDI2MDc5Cis6MTA0NzUwMDAyNzQ1MDIwMDI0MDYwMDA4MEMwMDI0OUFBRUUyMDA2OEY3Cis6MTA0NzYwMDA4RjgyMDIyMDMwNDIwMDA4MTQ0MDAwMDIyNDAyMDAwMTFGCis6MTA0NzcwMDAyNDAyMDAwMkFFRTIwMTA4OEVFMjAxMUMyNDQyMDAwMTg0Cis6MTA0NzgwMDBBRUUyMDExQzA4MDAyMkU4OEVFMjAxMUMzQzA0MDAwMTlDCis6MTA0NzkwMDAyNDg0NTNFQ0FGQTAwMDEwQUZBMDAwMTQ4RkE2MDAyMDFCCis6MTA0N0EwMDAzQzA1MDAwMzBDMDAyNDAzMzRBNUYwMEY5M0EyMDAyMDY1Cis6MTA0N0IwMDAzQzAzMDcwMDM0NjMxMDAwMDA0MzEwMjVBRkEyMDAxODJCCis6MTA0N0MwMDA4RUUyMDYwODhGNDMwMjI4MjQ0MjAwMDEzMDQ5MDBGRjkwCis6MTA0N0QwMDA1MTIzMDBFMkFGQTAwMDEwOEVFMjA2MDgwMDAyMTBDMEQ0Cis6MTA0N0UwMDAwMDU3MTAyMThGQTMwMDE4OEZBNDAwMUNBQzQzMDYwQ0E3Cis6MTA0N0YwMDBBQzQ0MDYxMDhGODcwMTIwMjc2MjM4MDAyNEU4MDAyMDhGCis6MTA0ODAwMDAwMTAyMTAyQjUwNDAwMDAxMjc2ODMwMDA4RjgyMDEyOEUwCis6MTA0ODEwMDAxMTAyMDAwNDAwMDAwMDAwOEY4MjAxMjQxNTAyMDAwNzJECis6MTA0ODIwMDAwMDAwMTAyMThFRTIwMUE0MDAwMDM4MjEyNDQyMDAwMTgyCis6MTA0ODMwMDBBRUUyMDFBNDA4MDAyMjVEOEVFMjAxQTQ4RUU0MDYwODI3Cis6MTA0ODQwMDAwMDA0MjBDMDAwODAxODIxOEVFNDA0MzA4RUU1MDQzNDdBCis6MTA0ODUwMDAwMEEzMjgyMTAwQTMzMDJCMDA4MjIwMjEwMDg2MjAyMUU0Cis6MTA0ODYwMDBBQ0U0MDAwMEFDRTUwMDA0OEVFMzA2MDgyNDAyMDAwODc2Cis6MTA0ODcwMDBBNEUyMDAwRTI0MDIwMDBEQUNFMjAwMThBQ0U5MDAxQzFBCis6MTA0ODgwMDAwMDAzMThDMDI0NjMwNjBDMDJFMzEwMjFBQ0UyMDAwODA4Cis6MTA0ODkwMDA4RUUyMDRDNEFDRTIwMDEwQUY4ODAxMjA5MkUyNEUyMDA4Cis6MTA0OEEwMDAxNDQwMDAzNzI0MDcwMDAxOEVFMjRFMzAwMDAyMTBDMDkxCis6MTA0OEIwMDAyNDQyNTAzODAyRTIyMDIxOEM4MzAwMDAyNDAyMDAwN0E5Cis6MTA0OEMwMDAxNDYyMDAxRjAwMDAwMDAwOEVFMzRFMzA4RUUyNEUzNDcyCis6MTA0OEQwMDAxMDYyMDAxQjI0MDMwMDQwOEM4MjAwMDQyNDQyMDAwMTZCCis6MTA0OEUwMDBBQzgyMDAwNDhFRTI0RTM0OEVFNTRFMzAyNDQyMDAwMTRDCis6MTA0OEYwMDAxMDQzMDAwNzAwMDAwMDAwOEVFMjRFMzQyNDQyMDAwMTA1Cis6MTA0OTAwMDAxMEEyMDAwNTAwMDAwMDAwMDgwMDIyNDcwMDAwMDAwMDdGCis6MTA0OTEwMDAxNEEwMDAwNTAwMDAwMDAwOEY4MjAxMjgyNDQyMDAyMDFFCis6MTA0OTIwMDBBRjgyMDEyODhGODIwMTI4OEM4MjAwMDQyQzQyMDAxMTYyCis6MTA0OTMwMDA1MDQwMDAxM0FDODAwMDAwMDgwMDIyNUQwMDAwMDAwMDIxCis6MTA0OTQwMDA4RUUyNEUzMDI0MDMwMDQwMjQ0MjAwMDE1MDQzMDAwMzE1Cis6MTA0OTUwMDAwMDAwMTAyMThFRTI0RTMwMjQ0MjAwMDFBRUUyNEUzMEMzCis6MTA0OTYwMDA4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzgwMkUyMjAyMTc0Cis6MTA0OTcwMDAyNDAyMDAwN0FDODIwMDAwMjQwMjAwMDFBQzgyMDAwNDgzCis6MTA0OTgwMDA1NEUwMDAwQ0FFRTkwNjA4M0MwNDAwMDEyNDg0NTNGNDEyCis6MTA0OTkwMDBBRkEwMDAxMEFGQTAwMDE0OEVFNjA2MDg4RjQ3MDIyOEQzCis6MTA0OUEwMDAzQzA1MDAwOTBDMDAyNDAzMzRBNUYwMDAwODAwMjJFMEI3Cis6MTA0OUIwMDAwMDAwMDAwMDhGODMwMTIwMjc2MjM4MDAyNDY2MDAyMDU5Cis6MTA0OUMwMDAwMEMyMTAyQjUwNDAwMDAxMjc2NjMwMDA4RjgyMDEyODYyCis6MTA0OUQwMDAxMEMyMDAwNDAwMDAwMDAwOEY4MjAxMjQxNEMyMDAwN0VFCis6MTA0OUUwMDAwMDAwMDAwMDhFRTIwMUE0MDAwMDM4MjEyNDQyMDAwMUYyCis6MTA0OUYwMDBBRUUyMDFBNDA4MDAyMkM0OEVFMjAxQTQ4RUUyMDYwODAxCis6MTA0QTAwMDBBQzYyMDAxQzhFRTQwNEEwOEVFNTA0QTQyNDYyMDAxQ0E5Cis6MTA0QTEwMDBBQzYyMDAwODI0MDIwMDA4QTQ2MjAwMEUyNDAyMDAxMTA3Cis6MTA0QTIwMDBBQzYyMDAxOEFDNjQwMDAwQUM2NTAwMDQ4RUUyMDRDNDAzCis6MTA0QTMwMDBBQzYyMDAxMEFGODYwMTIwOTJFMjRFMjAxNDQwMDAzNzk1Cis6MTA0QTQwMDAyNDA3MDAwMThFRTI0RTMwMDAwMjEwQzAyNDQyNTAzODhDCis6MTA0QTUwMDAwMkUyMjAyMThDODMwMDAwMjQwMjAwMTIxNDYyMDAxRjU1Cis6MTA0QTYwMDAwMDAwMDAwMDhFRTM0RTMwOEVFMjRFMzQxMDYyMDAxQkQ4Cis6MTA0QTcwMDAyNDAzMDA0MDhDODIwMDA0MjQ0MjAwMDFBQzgyMDAwNDI0Cis6MTA0QTgwMDA4RUUyNEUzNDhFRTU0RTMwMjQ0MjAwMDExMDQzMDAwNzgyCis6MTA0QTkwMDAwMDAwMDAwMDhFRTI0RTM0MjQ0MjAwMDExMEEyMDAwNTA2Cis6MTA0QUEwMDAwMDAwMDAwMDA4MDAyMkFFMDAwMDAwMDAxNEEwMDAwNTc1Cis6MTA0QUIwMDAwMDAwMDAwMDhGODIwMTI4MjQ0MjAwMjBBRjgyMDEyOERDCis6MTA0QUMwMDA4RjgyMDEyODhDODIwMDA0MkM0MjAwMTE1MDQwMDAxMzc4Cis6MTA0QUQwMDBBQzgwMDAwMDA4MDAyMkM0MDAwMDAwMDA4RUUyNEUzMENFCis6MTA0QUUwMDAyNDAzMDA0MDI0NDIwMDAxNTA0MzAwMDMwMDAwMTAyMTMxCis6MTA0QUYwMDA4RUUyNEUzMDI0NDIwMDAxQUVFMjRFMzA4RUUyNEUzMDY1Cis6MTA0QjAwMDAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjEyNDAyMDAxMjg4Cis6MTA0QjEwMDBBQzgyMDAwMDI0MDIwMDAxQUM4MjAwMDQxNEUwMDAxQkZGCis6MTA0QjIwMDAwMDAwMDAwMDNDMDQwMDAxMjQ4NDUzRkNBRkEwMDAxMEVFCis6MTA0QjMwMDBBRkEwMDAxNDhFRTYwNjA4OEY0NzAyMjgzQzA1MDAwOTQ2Cis6MTA0QjQwMDAwQzAwMjQwMzM0QTVGMDAxOEVFMjAxQjAyNDQyMDAwMUUwCis6MTA0QjUwMDBBRUUyMDFCMDA4MDAyMkUwOEVFMjAxQjAzQzA0MDAwMUE4Cis6MTA0QjYwMDAyNDg0NTQwOEFGQTAwMDE0OEVFNjA2MDg4RjQ3MDIyODVDCis6MTA0QjcwMDAzQzA1MDAwOTBDMDAyNDAzMzRBNUYwMDU4RUUyMDFBQ0NECis6MTA0QjgwMDAyNDQyMDAwMUFFRTIwMUFDOEVFMjAxQUM4RUUyMDE1MEEzCis6MTA0QjkwMDAyNDQyMDAwMUFFRTIwMTUwOEVFMjAxNTA4RUUyMDE2MDNCCis6MTA0QkEwMDAyNDQyMDAwMUFFRTIwMTYwOEVFMjAxNjA4RjQzMDIyQ0RDCis6MTA0QkIwMDA4RjQyMDEwQzE0NjIwMDA5MjQwMjAwMDJBRjgyMDA2NERCCis6MTA0QkMwMDA4RjgyMDA2NDE0NDAwMDA1MDAwMDAwMDA4RjQzMDIyQzE3Cis6MTA0QkQwMDA4RjQyMDEwQzE0NjJGODc1MDAwMDAwMDA4RkJGMDA0NDgyCis6MTA0QkUwMDA4RkI2MDA0MDhGQjUwMDNDOEZCNDAwMzg4RkIzMDAzNENGCis6MTA0QkYwMDA4RkIyMDAzMDhGQjEwMDJDOEZCMDAwMjgwM0UwMDAwODg2Cis6MTA0QzAwMDAyN0JEMDA0ODI3QkRGRkY4MjQwOEZGRkYxMEEwMDAxNEFGCis6MTA0QzEwMDAwMDAwNDgyMTNDMEFFREI4MzU0QTgzMjA5MDg3MDAwMDA3Cis6MTA0QzIwMDAyNDg0MDAwMTAwMDAzMDIxMDEwNzEwMjYzMDQyMDAwMUQ5Cis6MTA0QzMwMDAxMDQwMDAwMjAwMDgxODQyMDA2QTE4MjYwMDYwNDAyMTU3Cis6MTA0QzQwMDAyNEM2MDAwMTJDQzIwMDA4MTQ0MEZGRjcwMDA3Mzg0MkI4Cis6MTA0QzUwMDAyNTI5MDAwMTAxMjUxMDJCMTQ0MEZGRjAwMDAwMDAwMDYxCis6MTA0QzYwMDAwMTAwMTAyMTAzRTAwMDA4MjdCRDAwMDgyN0JERkZFODcwCis6MTA0QzcwMDAyNzY0MjgwMEFGQkYwMDEwMEMwMDI0ODgyNDA1MTAwMDEyCis6MTA0QzgwMDAyNDAyMDAyMUFGODAwMTAwQUY4MDAxMDRBRjgwMDEwODQxCis6MTA0QzkwMDBBRjgwMDExMEFGODAwMTE0QUY4MDAxMThBRjgwMDEyMEY4Cis6MTA0Q0EwMDBBRjgwMDEyNEFGODAwMTI4QUY4MDAxMzBBRjgwMDEzNDk0Cis6MTA0Q0IwMDBBRjgwMDEzOEFFRTA0RTI4QUVFMDRFMkNBRUUwNEUzMDc0Cis6MTA0Q0MwMDBBRUUwNEUzNEFGODIwMTFDOEY0MjAyMTgzMDQyMDA0MEU5Cis6MTA0Q0QwMDAxMDQwMDAwNDAwMDAwMDAwOEY4MjAxMUMzNDQyMDAwNEQ4Cis6MTA0Q0UwMDBBRjgyMDExQzhGQkYwMDEwMDNFMDAwMDgyN0JEMDAxODMxCis6MTA0Q0YwMDAyN0JERkZFMEFGQkYwMDE4OEY4MjAxMDRBRkEyMDAxMEY0Cis6MTA0RDAwMDA4RjgyMDEwMDNDMDUwMDAyQUZBMjAwMTQ4Rjg2MDBCMDI0Cis6MTA0RDEwMDA4Rjg3MDExQzNDMDQwMDAxMjQ4NDU0QzAwQzAwMjQwMzMwCis6MTA0RDIwMDAzNEE1RjAwMDhGODMwMEIwM0MwMjdGMDAwMDYyMTgyNDlECis6MTA0RDMwMDAzQzAyMDQwMDEwNjIwMDI5MDA0MzEwMkIxNDQwMDAwOEJDCis6MTA0RDQwMDAzQzAyMjAwMDNDMDIwMTAwMTA2MjAwMjQzQzAyMDIwMEYwCis6MTA0RDUwMDAxMDYyMDAxMTAwMDAwMDAwMDgwMDIzNzQwMDAwMDAwMDMxCis6MTA0RDYwMDAxMDYyMDAwODNDMDI0MDAwMTQ2MjAwMUMwMDAwMDAwMEI5Cis6MTA0RDcwMDA4RUUyMDE5MDI0NDIwMDAxQUVFMjAxOTAwODAwMjM3NDBCCis6MTA0RDgwMDA4RUUyMDE5MDhFRTIwMThDMjQ0MjAwMDFBRUUyMDE4Q0ExCis6MTA0RDkwMDAwODAwMjM3NDhFRTIwMThDOEY4MjAxMUMzNDQyMDAwMkQxCis6MTA0REEwMDBBRjgyMDExQzhGODMwMTA0OEY4MjAwQjAzNDQyMDAwMTY2Cis6MTA0REIwMDBBRjgyMDBCMEFGODMwMTA0OEY4MjAxMUMyNDAzRkZGRDhBCis6MTA0REMwMDAwMDQzMTAyNEFGODIwMTFDOEVFMjAxQTAyNDQyMDAwMUE2Cis6MTA0REQwMDBBRUUyMDFBMDA4MDAyMzc3OEVFMjAxQTA4RjgyMDBCMDJFCis6MTA0REUwMDAzNDQyMDAwMUFGODIwMEIwOEZCRjAwMTgwM0UwMDAwODFBCis6MTA0REYwMDAyN0JEMDAyMDI3QkRGRkUwQUZCRjAwMUNBRkIwMDAxOEVCCis6MTA0RTAwMDA4RjgyMDEyMEFGQTIwMDEwOEY4MjAxMjQzQzA1MDAwMTk3Cis6MTA0RTEwMDBBRkEyMDAxNDhGODYwMEEwOEY4NzAxMUMzQzA0MDAwMTA0Cis6MTA0RTIwMDAyNDg0NTRDQzBDMDAyNDAzMzRBNUYwMDA4RjgzMDBBMDBDCis6MTA0RTMwMDAzQzAyN0YwMDAwNjIxODI0M0MwMjA0MDAxMDYyMDA1MzEwCis6MTA0RTQwMDAwMDAwODAyMTAwNDMxMDJCMTQ0MDAwMDgzQzA0MjAwMDg3Cis6MTA0RTUwMDAzQzAyMDEwMDEwNjIwMDREM0MwMjAyMDAxMDYyMDAzQTY4Cis6MTA0RTYwMDAwMDAwMDAwMDA4MDAyM0UwMDAwMDAwMDAxMDY0MDAwM0MwCis6MTA0RTcwMDAzQzAyNDAwMDE0NjIwMDQ1MDAwMDAwMDA4RjgyMDBBMDQ4Cis6MTA0RTgwMDAwMDQ0MTAyNDEwNDAwMDA2MDAwMDAwMDA4RUUyMDE5NDRGCis6MTA0RTkwMDAyNDQyMDAwMUFFRTIwMTk0MDgwMDIzQTk4RUUyMDE5NEFECis6MTA0RUEwMDA4RUUyMDE5ODI0NDIwMDAxQUVFMjAxOTg4RUUyMDE5ODYwCis6MTA0RUIwMDA4RjgyMDExQzM0NDIwMDAyQUY4MjAxMUM4RjgyMDExQ0QwCis6MTA0RUMwMDAzMDQyMDIwMDEwNDAwMDFCMDAwMDAwMDA4RjgzMDBBMDUxCis6MTA0RUQwMDA4Rjg0MDEyNDhGODIwMEFDMTQ0MDAwMDcyNDAyMDAwMTVCCis6MTA0RUUwMDAzQzAyMDAwMTM0NDJGMDAwMDA2MjEwMjQ1MDQwMDAwMUY2Cis6MTA0RUYwMDAyNDEwMDAwMTI0MDIwMDAxMTIwMDAwMERBRjgyMDBBMDY2Cis6MTA0RjAwMDA4RjgyMDEyNDI0NDJGRkUwQUY4MjAxMjQ4RjgyMDEyNDlBCis6MTA0RjEwMDA4RjgyMDEyNDI3NjMzMDAwMDA0MzEwMkIxMDQwMDAwNUNFCis6MTA0RjIwMDAyNzYyMzdFMEFGODIwMTI0MDgwMDIzQ0EwMDAwMDAwMDk2Cis6MTA0RjMwMDBBRjg0MDEyNDhGODIwMTFDMjQwM0ZGRkQwMDQzMTAyNDUxCis6MTA0RjQwMDAwODAwMjNFM0FGODIwMTFDOEY4MjAxMUMzNDQyMDAwMjVGCis6MTA0RjUwMDBBRjgyMDExQzhGODMwMTI0OEY4MjAwQTAzNDQyMDAwMUE0Cis6MTA0RjYwMDBBRjgyMDBBMEFGODMwMTI0OEY4MjAxMUMyNDAzRkZGREM4Cis6MTA0RjcwMDAwMDQzMTAyNEFGODIwMTFDOEVFMjAxOUMyNDQyMDAwMUY4Cis6MTA0RjgwMDBBRUUyMDE5QzA4MDAyM0UzOEVFMjAxOUM4RjgyMDBBMDI4Cis6MTA0RjkwMDAzNDQyMDAwMUFGODIwMEEwOEZCRjAwMUM4RkIwMDAxODA4Cis6MTA0RkEwMDAwM0UwMDAwODI3QkQwMDIwMDAwMDAwMDAzQzAyMDAwMUQzCis6MTA0RkIwMDA4QzQyNUM1ODI3QkRGRkU4QUZCRjAwMTQxNDQwMDAxMkJDCis6MTA0RkMwMDBBRkIwMDAxMDNDMTAwMDAxMjYxMDVERDAwMjAwMjAyMTdGCis6MTA0RkQwMDAwQzAwMjQ4ODI0MDUyMDAwMjYwMjFGRTAzQzAxMDAwMTZCCis6MTA0RkUwMDBBQzIyNUQ5NDNDMDEwMDAxQUMyMjVEOTBBRjQyMDI1MEM2Cis6MTA0RkYwMDAyNDAyMjAwMEFGNTAwMjU0QUY0MjAyNTgyNDAyMDAwMUE0Cis6MTA1MDAwMDAzQzAxMDAwMUFDMjI1QzU4OEZCRjAwMTQ4RkIwMDAxMDJGCis6MTA1MDEwMDAwM0UwMDAwODI3QkQwMDE4M0MwMzAwMDE4QzYzNUQ5NDg5Cis6MTA1MDIwMDA4QzgyMDAwMDhGQTgwMDEwOEZBOTAwMTRBQzYyMDAwMEQxCis6MTA1MDMwMDAzQzAyMDAwMThDNDI1RDk0OEM4MzAwMDRBQzQzMDAwNDZDCis6MTA1MDQwMDBBQzQ1MDAwODhGODQwMDU0MjQ0M0ZGRTBBQzQ2MDAxMEI4Cis6MTA1MDUwMDBBQzQ3MDAxNEFDNDgwMDE4QUM0OTAwMUMzQzAxMDAwMUVFCis6MTA1MDYwMDBBQzIzNUQ5NEFDNDQwMDBDM0MwMjAwMDEyNDQyNUREMEIyCis6MTA1MDcwMDAwMDYyMTgyQjEwNjAwMDA1MDAwMDAwMDAzQzAyMDAwMUQ3Cis6MTA1MDgwMDA4QzQyNUQ5MDNDMDEwMDAxQUMyMjVEOTQzQzAzMDAwMTI4Cis6MTA1MDkwMDA4QzYzNUQ5NDNDMDIwMDAxOEM0MjVDNDBBQzYyMDAwMDc5Cis6MTA1MEEwMDAzQzAzMDAwMThDNjM1RDk0M0MwMjAwMDE4QzQyNUM0MDM3Cis6MTA1MEIwMDBBQzYyMDAwNDAzRTAwMDA4QUY0MzAyNTAzQzAzMDAwMTZGCis6MTA1MEMwMDA4QzYzNUQ5NDNDMDIwMDAxOEM0MjVDNDAyN0JERkZEMEE0Cis6MTA1MEQwMDBBRkI0MDAyMDhGQjQwMDQwQUZCMDAwMTAwMDgwODAyMTNBCis6MTA1MEUwMDBBRkI1MDAyNDhGQjUwMDQ0OEZBNDAwNDhBRkIxMDAxNEMxCis6MTA1MEYwMDAwMEEwODgyMUFGQkYwMDI4QUZCMzAwMUNBRkIyMDAxOERBCis6MTA1MTAwMDBBQzYyMDAwMDNDMDUwMDAxOENBNTVEOTQzQzAyMDAwMUVFCis6MTA1MTEwMDA4QzQyNUM0MDAwQzA5MDIxMDBFMDk4MjExMDgwMDAwNjg1Cis6MTA1MTIwMDBBQ0EyMDAwNDI0QTUwMDA4MEMwMDI0OTAyNDA2MDAxODVBCis6MTA1MTMwMDAwODAwMjQ0RTAwMDAwMDAwMjRBNDAwMDgwQzAwMjQ4ODZECis6MTA1MTQwMDAyNDA1MDAxODNDMDIwMDAxOEM0MjVEOTQzQzA1MDAwMURFCis6MTA1MTUwMDAyNEE1NUREMDI0NDJGRkUwM0MwMTAwMDFBQzIyNUQ5NDE3Cis6MTA1MTYwMDAwMDQ1MTAyQjEwNDAwMDA1MDAwMDAwMDAzQzAyMDAwMTJCCis6MTA1MTcwMDA4QzQyNUQ5MDNDMDEwMDAxQUMyMjVEOTQzQzAzMDAwMTM3Cis6MTA1MTgwMDA4QzYzNUQ5NDhFMDIwMDAwQUM2MjAwMDAzQzAzMDAwMTYxCis6MTA1MTkwMDA4QzYzNUQ5NDhFMDIwMDA0QUM2MjAwMDRBQzcxMDAwODY0Cis6MTA1MUEwMDA4Rjg0MDA1NDI0NjJGRkUwM0MwMTAwMDFBQzIyNUQ5NDM2Cis6MTA1MUIwMDAwMDQ1MTAyQkFDNzIwMDEwQUM3MzAwMTRBQzc0MDAxOEQ2Cis6MTA1MUMwMDBBQzc1MDAxQzEwNDAwMDA1QUM2NDAwMEMzQzAyMDAwMUYyCis6MTA1MUQwMDA4QzQyNUQ5MDNDMDEwMDAxQUMyMjVEOTQzQzAzMDAwMUQ3Cis6MTA1MUUwMDA4QzYzNUQ5NDNDMDIwMDAxOEM0MjVDNDBBQzYyMDAwMDI4Cis6MTA1MUYwMDAzQzAzMDAwMThDNjM1RDk0M0MwMjAwMDE4QzQyNUM0MEU2Cis6MTA1MjAwMDBBQzYyMDAwNEFGNDMwMjUwOEZCRjAwMjg4RkI1MDAyNDZBCis6MTA1MjEwMDA4RkI0MDAyMDhGQjMwMDFDOEZCMjAwMTg4RkIxMDAxNDIwCis6MTA1MjIwMDA4RkIwMDAxMDAzRTAwMDA4MjdCRDAwMzAxMEEwMDAwNTdCCis6MTA1MjMwMDAwMDAwMDAwMEFDODAwMDAwMjRBNUZGRkMxNEEwRkZGRENFCis6MTA1MjQwMDAyNDg0MDAwNDAzRTAwMDA4MDAwMDAwMDAxMEMwMDAwN0YwCis6MTA1MjUwMDAwMDAwMDAwMDhDODIwMDAwMjQ4NDAwMDQyNEM2RkZGQ0FGCis6MTA1MjYwMDBBQ0EyMDAwMDE0QzBGRkZCMjRBNTAwMDQwM0UwMDAwODZBCis6MTA1MjcwMDAwMDAwMDAwMDEwQzAwMDA3MDAwMDAwMDA4Q0EyMDAwMDI5Cis6MTA1MjgwMDAyNEE1MDAwNDI0QzZGRkZDQUM4MjAwMDAxNEMwRkZGQjcwCis6MTA1MjkwMDAyNDg0MDAwNDAzRTAwMDA4MDAwMDAwMDAwM0UwMDAwODhDCis6MTA1MkEwMDAwMDAwMDAwMDI3QkRGRkQ4QUZCRjAwMjA4RUUzMDRFNDVDCis6MTA1MkIwMDA4RUUyMDRFMDEwNjIwNDM2MDAwMDAwMDA4RUUyMDRFNDk2Cis6MTA1MkMwMDA4RUUzMDRGQzAwMDIxMTAwMDA2MjYwMjE5NTg3MDAwODUzCis6MTA1MkQwMDA4RDhBMDAwMDhEOEIwMDA0OTU4RDAwMEE4RUUyNzI1QzMxCis6MTA1MkUwMDA4RUUzNzI2QzMwRTRGRkZGMDA0NDEwMjEwMDYyMTgyQjQzCis6MTA1MkYwMDAxMDYwMDAxNTMxQTIwMDA0OEY4MjAwRDg4RUUzNzI1ODJFCis6MTA1MzAwMDAwMDQzMTAyM0FFRTI3MjZDOEVFMjcyNkMxQzQwMDAwMzBDCis6MTA1MzEwMDAzQzAzMDAwMTAwNDMxMDIxQUVFMjcyNkM4RUUyNzI1QzJECis6MTA1MzIwMDA4RUUzNzI2QzAwNDQxMDIxMDA2MjE4MkIxMDYwMDAwNjlFCis6MTA1MzMwMDAzMUEyMDAwNDhFRTIwMUI4MjQ0MjAwMDFBRUUyMDFCOEJECis6MTA1MzQwMDAwODAwMjhFMThFRTIwMUI4MTA0MDAyNDAzMUEyMDIwMEJDCis6MTA1MzUwMDAxMDQwMDE0RDAwMDA0ODIxOTZFMjA0NUEzMDQyMDAxMEVFCis6MTA1MzYwMDAxMDQwMDE0OTAwMDAwMDAwOEY4NDAxMDAyNzYyMzAwMEQ2Cis6MTA1MzcwMDAyNDg1MDAyMDAwQTIxMDJCNTA0MDAwMDEyNzY1MjgwMDQyCis6MTA1MzgwMDA4RjgyMDEwODEwQTIwMDA0MDAwMDAwMDA4RjgyMDEwNDM3Cis6MTA1MzkwMDAxNEEyMDAwNjI0MDIwMDBDOEVFMjAxQTgyNDQyMDAwMTlGCis6MTA1M0EwMDBBRUUyMDFBODA4MDAyNTJDOEVFMjAxQThBQzhBMDAwMDFDCis6MTA1M0IwMDBBQzhCMDAwNDhFRTM3MjY0MjQwNjAwMDVBNDgyMDAwRTA4Cis6MTA1M0MwMDBBQzg2MDAxOEFDODMwMDA4OEVFMjA0RTRBQzgyMDAxQ0JBCis6MTA1M0QwMDA4RUUyMDRDOEFDODIwMDEwQUY4NTAxMDA5MkUyMDRFQ0JBCis6MTA1M0UwMDAxNDQwMDAzNjI0MDkwMDAxOEVFMjRFMjgwMDAyMTBDMDRECis6MTA1M0YwMDAyNDQyNEUzODAyRTIyMDIxOEM4MjAwMDAxNDQ2MDAxRjE1Cis6MTA1NDAwMDAwMDAwMDAwMDhFRTM0RTI4OEVFMjRFMkMxMDYyMDAxQjNFCis6MTA1NDEwMDAyNDAzMDA0MDhDODIwMDA0MjQ0MjAwMDFBQzgyMDAwNDdBCis6MTA1NDIwMDA4RUUyNEUyQzhFRTU0RTI4MjQ0MjAwMDExMDQzMDAwN0U4Cis6MTA1NDMwMDAwMDAwMDAwMDhFRTI0RTJDMjQ0MjAwMDExMEEyMDAwNTY0Cis6MTA1NDQwMDAwMDAwMDAwMDA4MDAyNTE2MDAwMDAwMDAxNEEwMDAwNTYwCis6MTA1NDUwMDAwMDAwMDAwMDhGODIwMTA4MjQ0MjAwMjBBRjgyMDEwODcyCis6MTA1NDYwMDA4RjgyMDEwODhDODIwMDA0MkM0MjAwMTE1MDQwMDAxM0VFCis6MTA1NDcwMDBBQzgwMDAwMDA4MDAyNTJDMDAwMDAwMDA4RUUyNEUyOEMxCis6MTA1NDgwMDAyNDAzMDA0MDI0NDIwMDAxNTA0MzAwMDMwMDAwMTAyMTg3Cis6MTA1NDkwMDA4RUUyNEUyODI0NDIwMDAxQUVFMjRFMjg4RUUyNEUyOEQzCis6MTA1NEEwMDAwMDAyMTBDMDI0NDI0RTM4MDJFMjIwMjEyNDAyMDAwNUVFCis6MTA1NEIwMDBBQzgyMDAwMDI0MDIwMDAxQUM4MjAwMDQxNTIwMDAwQTI2Cis6MTA1NEMwMDAzQzA0MDAwMUFGQUIwMDEwOEVFMjcyNjQzQzA0MDAwMUFBCis6MTA1NEQwMDAyNDg0NTczMDNDMDUwMDA0QUZBMjAwMTQ4RUU2MDRFNDk3Cis6MTA1NEUwMDAwODAwMjhCRTM0QTVGMTE0OEVFMjcyNjQzNDg0MzgwMEJBCis6MTA1NEYwMDAwMzY0MTgyMTI0NDIwMDEwMDA0MzEwMkIxNDQwMDA3MzUxCis6MTA1NTAwMDAwMDAwMDAwMDhFRTI3MjY0MjQ0ODAwMTAwMzY0MTAyMTQxCis6MTA1NTEwMDAwMTAyMTAyQjE0NDAwMDAyM0MwMkZGRkYwMTAyNDAyMTU3Cis6MTA1NTIwMDA4Rjg1MDEwMDI3NjIzMDAwMjRBNjAwMjAwMEMyMTAyQkM2Cis6MTA1NTMwMDA1MDQwMDAwMTI3NjYyODAwOEY4MjAxMDgxMEMyMDAwNDM1Cis6MTA1NTQwMDAwMDAwMDAwMDhGODIwMTA0MTRDMjAwMDcyNTYzMDAwQ0Q0Cis6MTA1NTUwMDA4RUUyMDFBODAwMDA0ODIxMjQ0MjAwMDFBRUUyMDFBODI5Cis6MTA1NTYwMDAwODAwMjVBMDhFRTIwMUE4MkM2NDAwMEMwMTQ0MTAyMTQzCis6MTA1NTcwMDBBQ0EyMDAwMEFDQTMwMDA0MjRFMkZGRjRBNEEyMDAwRTNECis6MTA1NTgwMDAyNDAyMDAwNkFDQTgwMDA4QUNBMjAwMTg4RUUyMDRFNEQ1Cis6MTA1NTkwMDBBQ0EyMDAxQzhFRTIwNEM4M0MwMzAwMDIwMDQzMTAyNUFDCis6MTA1NUEwMDBBQ0EyMDAxMEFGODYwMTAwOTJFMjA0RUMxNDQwMDAzNzc4Cis6MTA1NUIwMDAyNDA5MDAwMThFRTI0RTI4MDAwMjEwQzAyNDQyNEUzODE5Cis6MTA1NUMwMDAwMkUyMjAyMThDODMwMDAwMjQwMjAwMDUxNDYyMDAxRkU3Cis6MTA1NUQwMDAwMDAwMDAwMDhFRTM0RTI4OEVFMjRFMkMxMDYyMDAxQjZECis6MTA1NUUwMDAyNDAzMDA0MDhDODIwMDA0MjQ0MjAwMDFBQzgyMDAwNEE5Cis6MTA1NUYwMDA4RUUyNEUyQzhFRTU0RTI4MjQ0MjAwMDExMDQzMDAwNzE3Cis6MTA1NjAwMDAwMDAwMDAwMDhFRTI0RTJDMjQ0MjAwMDExMEEyMDAwNTkyCis6MTA1NjEwMDAwMDAwMDAwMDA4MDAyNThBMDAwMDAwMDAxNEEwMDAwNTFBCis6MTA1NjIwMDAwMDAwMDAwMDhGODIwMTA4MjQ0MjAwMjBBRjgyMDEwOEEwCis6MTA1NjMwMDA4RjgyMDEwODhDODIwMDA0MkM0MjAwMTE1MDQwMDAxMzFDCis6MTA1NjQwMDBBQzgwMDAwMDA4MDAyNUEwMDAwMDAwMDA4RUUyNEUyODdCCis6MTA1NjUwMDAyNDAzMDA0MDI0NDIwMDAxNTA0MzAwMDMwMDAwMTAyMUI1Cis6MTA1NjYwMDA4RUUyNEUyODI0NDIwMDAxQUVFMjRFMjg4RUUyNEUyODAxCis6MTA1NjcwMDAwMDAyMTBDMDI0NDI0RTM4MDJFMjIwMjEyNDAyMDAwNTFDCis6MTA1NjgwMDBBQzgyMDAwMDI0MDIwMDAxQUM4MjAwMDQxNTIwMDAwQTU0Cis6MTA1NjkwMDAyNTA4RkZGQ0FGQUIwMDEwOEVFMjcyNjQzQzA0MDAwMUYxCis6MTA1NkEwMDAyNDg0NTczMDNDMDUwMDA0QUZBMjAwMTQ4RUU2MDRFNEM1Cis6MTA1NkIwMDAwODAwMjhCRTM0QTVGMTI1MzQwMjgxMDBBNTAyMDAwMEFGCis6MTA1NkMwMDA5NTgyMDAwRTA4MDAyNjFEQTUwMjAwMDI4Rjg1MDEwMEFDCis6MTA1NkQwMDAyNzYyMzAwMDI0QTYwMDIwMDBDMjEwMkI1MDQwMDAwMTk5Cis6MTA1NkUwMDAyNzY2MjgwMDhGODIwMTA4MTBDMjAwMDQwMDAwMDAwMDE1Cis6MTA1NkYwMDA4RjgyMDEwNDE0QzIwMDA3MjU2MzAwMEM4RUUyMDFBODBBCis6MTA1NzAwMDAwMDAwNDgyMTI0NDIwMDAxQUVFMjAxQTgwODAwMjYwRDU1Cis6MTA1NzEwMDA4RUUyMDFBODJDNjQwMDBDMDE0NDEwMjFBQ0EyMDAwMDEwCis6MTA1NzIwMDBBQ0EzMDAwNDhFRTM3MjY0MjRFMkZGRjRBNEEyMDAwRTkyCis6MTA1NzMwMDAyNDAyMDAwNkFDQTIwMDE4MjQ2MzAwMTBBQ0EzMDAwOEU5Cis6MTA1NzQwMDA4RUUyMDRFNEFDQTIwMDFDOEVFMjA0QzgzQzAzMDAwMjFBCis6MTA1NzUwMDAwMDQzMTAyNUFDQTIwMDEwQUY4NjAxMDA5MkUyMDRFQ0Q5Cis6MTA1NzYwMDAxNDQwMDAzNzI0MDkwMDAxOEVFMjRFMjgwMDAyMTBDMEM4Cis6MTA1NzcwMDAyNDQyNEUzODAyRTIyMDIxOEM4MzAwMDAyNDAyMDAwNURFCis6MTA1NzgwMDAxNDYyMDAxRjAwMDAwMDAwOEVFMzRFMjg4RUUyNEUyQ0IzCis6MTA1NzkwMDAxMDYyMDAxQjI0MDMwMDQwOEM4MjAwMDQyNDQyMDAwMTlDCis6MTA1N0EwMDBBQzgyMDAwNDhFRTI0RTJDOEVFNTRFMjgyNDQyMDAwMThECis6MTA1N0IwMDAxMDQzMDAwNzAwMDAwMDAwOEVFMjRFMkMyNDQyMDAwMTNFCis6MTA1N0MwMDAxMEEyMDAwNTAwMDAwMDAwMDgwMDI1RjcwMDAwMDAwMEZFCis6MTA1N0QwMDAxNEEwMDAwNTAwMDAwMDAwOEY4MjAxMDgyNDQyMDAyMDcwCis6MTA1N0UwMDBBRjgyMDEwODhGODIwMTA4OEM4MjAwMDQyQzQyMDAxMUQ0Cis6MTA1N0YwMDA1MDQwMDAxM0FDODAwMDAwMDgwMDI2MEQwMDAwMDAwMDlGCis6MTA1ODAwMDA4RUUyNEUyODI0MDMwMDQwMjQ0MjAwMDE1MDQzMDAwMzRFCis6MTA1ODEwMDAwMDAwMTAyMThFRTI0RTI4MjQ0MjAwMDFBRUUyNEUyODA0Cis6MTA1ODIwMDA4RUUyNEUyODAwMDIxMEMwMjQ0MjRFMzgwMkUyMjAyMUFGCis6MTA1ODMwMDAyNDAyMDAwNUFDODIwMDAwMjQwMjAwMDFBQzgyMDAwNEI2Cis6MTA1ODQwMDAxNTIwMDAwQTM0MDI4MTAwQUZBQjAwMTA4RUUyNzI2NEIyCis6MTA1ODUwMDAzQzA0MDAwMTI0ODQ1NzMwM0MwNTAwMDRBRkEyMDAxNDJFCis6MTA1ODYwMDA4RUU2MDRFNDA4MDAyOEJFMzRBNUYwMTU4RUUzNzI2NEM5Cis6MTA1ODcwMDBBNDYyMDAwQzhFRTM3MjY0OTU4MjAwMEVBNDYyMDAwRTk2Cis6MTA1ODgwMDAwODAwMjY4MTI0RTcwMDA0OEY4NDAxMDAyNzYyMzAwMDhECis6MTA1ODkwMDAyNDg1MDAyMDAwQTIxMDJCNTA0MDAwMDEyNzY1MjgwMDFECis6MTA1OEEwMDA4RjgyMDEwODEwQTIwMDA0MDAwMDAwMDA4RjgyMDEwNDEyCis6MTA1OEIwMDAxNEEyMDAwNzI0MDIwMDA2OEVFMjAxQTgwMDAwNDgyMTdECis6MTA1OEMwMDAyNDQyMDAwMUFFRTIwMUE4MDgwMDI2Nzc4RUUyMDFBODdBCis6MTA1OEQwMDBBQzhBMDAwMEFDOEIwMDA0OEVFMzcyNjRBNDg3MDAwRUQ3Cis6MTA1OEUwMDBBQzgyMDAxOEFDODMwMDA4OEVFMjA0RTRBQzgyMDAxQzk5Cis6MTA1OEYwMDA4RUUyMDRDODNDMDMwMDAyMDA0MzEwMjVBQzgyMDAxMDc1Cis6MTA1OTAwMDBBRjg1MDEwMDkyRTIwNEVDMTQ0MDAwMzcyNDA5MDAwMTQ1Cis6MTA1OTEwMDA4RUUyNEUyODAwMDIxMEMwMjQ0MjRFMzgwMkUyMjAyMUJFCis6MTA1OTIwMDA4QzgzMDAwMDI0MDIwMDA1MTQ2MjAwMUYwMDAwMDAwMEE4Cis6MTA1OTMwMDA4RUUzNEUyODhFRTI0RTJDMTA2MjAwMUIyNDAzMDA0MEEyCis6MTA1OTQwMDA4QzgyMDAwNDI0NDIwMDAxQUM4MjAwMDQ4RUUyNEUyQ0MyCis6MTA1OTUwMDA4RUU1NEUyODI0NDIwMDAxMTA0MzAwMDcwMDAwMDAwMDlECis6MTA1OTYwMDA4RUUyNEUyQzI0NDIwMDAxMTBBMjAwMDUwMDAwMDAwMDJGCis6MTA1OTcwMDAwODAwMjY2MTAwMDAwMDAwMTRBMDAwMDUwMDAwMDAwMERGCis6MTA1OTgwMDA4RjgyMDEwODI0NDIwMDIwQUY4MjAxMDg4RjgyMDEwODIzCis6MTA1OTkwMDA4QzgyMDAwNDJDNDIwMDExNTA0MDAwMTNBQzgwMDAwMEE3Cis6MTA1OUEwMDAwODAwMjY3NzAwMDAwMDAwOEVFMjRFMjgyNDAzMDA0MDA1Cis6MTA1OUIwMDAyNDQyMDAwMTUwNDMwMDAzMDAwMDEwMjE4RUUyNEUyOEQzCis6MTA1OUMwMDAyNDQyMDAwMUFFRTI0RTI4OEVFMjRFMjgwMDAyMTBDMEIyCis6MTA1OUQwMDAyNDQyNEUzODAyRTIyMDIxMjQwMjAwMDVBQzgyMDAwMDVECis6MTA1OUUwMDAyNDAyMDAwMUFDODIwMDA0MTUyMDAwMDkzQzA1MDAwNERCCis6MTA1OUYwMDBBRkFCMDAxMDhFRTI3MjY0M0MwNDAwMDEyNDg0NTczMDg3Cis6MTA1QTAwMDBBRkEyMDAxNDhFRTYwNEU0MDgwMDI4QkUzNEE1RjAwNDFBCis6MTA1QTEwMDA4RUUyNzI1QzMwRTdGRkZGMDA0NzEwMjFBRUUyNzI1QzVECis6MTA1QTIwMDA4RUUyMDRFNDhFRTMwNEZDOEVFNDcyNTgwMDAyMTEwMDVFCis6MTA1QTMwMDAwMDQzMTAyMUFDNDQwMDBDOEVFMjcyNThBRkEyMDAxODUzCis6MTA1QTQwMDA4RUUzNzI1Q0FGQTMwMDFDOEVFMjcyNUMyQzQyMDAzQ0MxCis6MTA1QTUwMDAxMDQwMDAwNDI0NjIwMDAxMjQwM0ZGRkUwMDQzMTAyNEQwCis6MTA1QTYwMDBBRkEyMDAxQzhFRTI3MjY0M0MwNjAwMDEzNEM2MzgwMDBFCis6MTA1QTcwMDA4RUUzNzI1QzI0MDVGRkY4MDA0NzEwMjEyNDQyMDAwN0UyCis6MTA1QTgwMDAwMDQ1MTAyNDI0NjMwMDA3QUVFMjcyNTg4RUUyNzI2QzY3Cis6MTA1QTkwMDA4RUU0NzI1ODAwNjUxODI0MDA0MzEwMjNBRUUyNzI2QzQ1Cis6MTA1QUEwMDAwMzY2MTAyMTAwODIyMDJCMTQ4MDAwMDQzQzAzRkZGRkJBCis6MTA1QUIwMDA4RUUyNzI1ODAwNDMxMDIxQUVFMjcyNTg4RUUyNzI1OEE0Cis6MTA1QUMwMDBBRUUyNzI2NDhGODIwMEYwMjQ0NzAwMDgyNzYyMTgwMDVCCis6MTA1QUQwMDAwMEUyMTAyQjUwNDAwMDAxMjc2NzEwMDA4RjgyMDBGNDc1Cis6MTA1QUUwMDAxNEUyMDAwNzAwMDAwMDAwOEVFMjAxQjQwMDAwNDgyMTJCCis6MTA1QUYwMDAyNDQyMDAwMUFFRTIwMUI0MDgwMDI2QzQ4RUUyMDFCNEUzCis6MTA1QjAwMDA4RjgyMDBGMDI0MDkwMDAxOEZBMzAwMTg4RkE0MDAxQ0NECis6MTA1QjEwMDBBQzQzMDAwMEFDNDQwMDA0QUY4NzAwRjAxNTIwMDAxMjM1Cis6MTA1QjIwMDAwMDBEMTE0MjhGODIwMEYwQUZBMjAwMTA4RjgyMDBGNEFFCis6MTA1QjMwMDAzQzA0MDAwMTI0ODQ1NzNDQUZBMjAwMTQ4RkE2MDAxODM3Cis6MTA1QjQwMDA4RkE3MDAxQzNDMDUwMDA0MEMwMDI0MDMzNEE1RjAwNUJECis6MTA1QjUwMDA4RUUyMDA4ODI0NDIwMDAxQUVFMjAwODg4RUUyMDA4OEQ2Cis6MTA1QjYwMDAwODAwMjhEM0FFRTA3MjVDMzA0MzAwMDMyNDAyMDAwMjM4Cis6MTA1QjcwMDAxMDYyMDAxNjI4NjIwMDAzMTA0MDAwMDUyNDAyMDAwMTk0Cis6MTA1QjgwMDAxMDYyMDAwODAwMDAwMDAwMDgwMDI3MDMwMDAwMDAwMDY5Cis6MTA1QjkwMDAyNDAyMDAwMzEwNjIwMDE3MDAwMDAwMDAwODAwMjcwMzIxCis6MTA1QkEwMDAwMDAwMDAwMDhFRTIwMEU4OEVFMzAwRUMyNDYzMDAwMUI4Cis6MTA1QkIwMDAyQzY0MDAwMTAwNDQxMDIxQUVFMjAwRThBRUUzMDBFQ0VBCis6MTA1QkMwMDA4RUUyMDBFODA4MDAyNzAzOEVFMzAwRUM4RUUyMDBGMDhFCis6MTA1QkQwMDA4RUUzMDBGNDI0NjMwMDAxMkM2NDAwMDEwMDQ0MTAyMUQyCis6MTA1QkUwMDBBRUUyMDBGMEFFRTMwMEY0OEVFMjAwRjAwODAwMjcwMzFFCis6MTA1QkYwMDA4RUUzMDBGNDhFRTIwMEY4OEVFMzAwRkMyNDYzMDAwMUUzCis6MTA1QzAwMDAyQzY0MDAwMTAwNDQxMDIxQUVFMjAwRjhBRUUzMDBGQzc5Cis6MTA1QzEwMDA4RUUyMDBGODhFRTMwMEZDOEVFMjcyNUM4RUU0MDBFMDFGCis6MTA1QzIwMDA4RUU1MDBFNDAwNDAxODIxMDAwMDEwMjEwMEEzMjgyMTg3Cis6MTA1QzMwMDAwMEEzMzAyQjAwODIyMDIxMDA4NjIwMjFBRUU0MDBFMDZBCis6MTA1QzQwMDBBRUU1MDBFNDA4MDAyOEQzQUVFMDcyNUMzMEUyRkZGRjZFCis6MTA1QzUwMDAxMDQwMDFDMTMxQTIwMjAwMTA0MDAxNEQwMDAwNDgyMTU2Cis6MTA1QzYwMDA5NkUyMDQ1QTMwNDIwMDEwMTA0MDAxNDkwMDAwMDAwMDQyCis6MTA1QzcwMDA4Rjg0MDEwMDI3NjIzMDAwMjQ4NTAwMjAwMEEyMTAyQkIxCis6MTA1QzgwMDA1MDQwMDAwMTI3NjUyODAwOEY4MjAxMDgxMEEyMDAwNEZGCis6MTA1QzkwMDAwMDAwMDAwMDhGODIwMTA0MTRBMjAwMDYyNDAyMDAwQzAwCis6MTA1Q0EwMDA4RUUyMDFBODI0NDIwMDAxQUVFMjAxQTgwODAwMjc2RTlFCis6MTA1Q0IwMDA4RUUyMDFBOEFDOEEwMDAwQUM4QjAwMDQ4RUUzNzI2NDEzCis6MTA1Q0MwMDAyNDA2MDAwNUE0ODIwMDBFQUM4NjAwMThBQzgzMDAwOEYwCis6MTA1Q0QwMDA4RUUyMDRFNEFDODIwMDFDOEVFMjA0QzhBQzgyMDAxMEE4Cis6MTA1Q0UwMDBBRjg1MDEwMDkyRTIwNEVDMTQ0MDAwMzYyNDA5MDAwMTYzCis6MTA1Q0YwMDA4RUUyNEUyODAwMDIxMEMwMjQ0MjRFMzgwMkUyMjAyMURCCis6MTA1RDAwMDA4QzgyMDAwMDE0NDYwMDFGMDAwMDAwMDA4RUUzNEUyODI1Cis6MTA1RDEwMDA4RUUyNEUyQzEwNjIwMDFCMjQwMzAwNDA4QzgyMDAwNDkzCis6MTA1RDIwMDAyNDQyMDAwMUFDODIwMDA0OEVFMjRFMkM4RUU1NEUyODA3Cis6MTA1RDMwMDAyNDQyMDAwMTEwNDMwMDA3MDAwMDAwMDA4RUUyNEUyQ0I4Cis6MTA1RDQwMDAyNDQyMDAwMTEwQTIwMDA1MDAwMDAwMDAwODAwMjc1OEFFCis6MTA1RDUwMDAwMDAwMDAwMDE0QTAwMDA1MDAwMDAwMDA4RjgyMDEwODcwCis6MTA1RDYwMDAyNDQyMDAyMEFGODIwMTA4OEY4MjAxMDg4QzgyMDAwNDQ3Cis6MTA1RDcwMDAyQzQyMDAxMTUwNDAwMDEzQUM4MDAwMDAwODAwMjc2RTM4Cis6MTA1RDgwMDAwMDAwMDAwMDhFRTI0RTI4MjQwMzAwNDAyNDQyMDAwMTVGCis6MTA1RDkwMDA1MDQzMDAwMzAwMDAxMDIxOEVFMjRFMjgyNDQyMDAwMUVGCis6MTA1REEwMDBBRUUyNEUyODhFRTI0RTI4MDAwMjEwQzAyNDQyNEUzODQ5Cis6MTA1REIwMDAwMkUyMjAyMTI0MDIwMDA1QUM4MjAwMDAyNDAyMDAwMTNFCis6MTA1REMwMDBBQzgyMDAwNDE1MjAwMDBBM0MwNDAwMDFBRkFCMDAxMEI3Cis6MTA1REQwMDA4RUUyNzI2NDNDMDQwMDAxMjQ4NDU3MzAzQzA1MDAwNEM4Cis6MTA1REUwMDBBRkEyMDAxNDhFRTYwNEU0MDgwMDI4QkUzNEE1RjAxNDI3Cis6MTA1REYwMDA4RUUyNzI2NDM0ODQzODAwMDM2NDE4MjEyNDQyMDAxMDU3Cis6MTA1RTAwMDAwMDQzMTAyQjE0NDAwMDczMDAwMDAwMDA4RUUyNzI2NDA3Cis6MTA1RTEwMDAyNDQ4MDAxMDAzNjQxMDIxMDEwMjEwMkIxNDQwMDAwMkRBCis6MTA1RTIwMDAzQzAyRkZGRjAxMDI0MDIxOEY4NTAxMDAyNzYyMzAwMDA0Cis6MTA1RTMwMDAyNEE2MDAyMDAwQzIxMDJCNTA0MDAwMDEyNzY2MjgwMDM1Cis6MTA1RTQwMDA4RjgyMDEwODEwQzIwMDA0MDAwMDAwMDA4RjgyMDEwNDRDCis6MTA1RTUwMDAxNEMyMDAwNzI1NjMwMDBDOEVFMjAxQTgwMDAwNDgyMTRGCis6MTA1RTYwMDAyNDQyMDAwMUFFRTIwMUE4MDgwMDI3RTI4RUUyMDFBODY4Cis6MTA1RTcwMDAyQzY0MDAwQzAxNDQxMDIxQUNBMjAwMDBBQ0EzMDAwNDZGCis6MTA1RTgwMDAyNEUyRkZGNEE0QTIwMDBFMjQwMjAwMDZBQ0E4MDAwODNECis6MTA1RTkwMDBBQ0EyMDAxODhFRTIwNEU0QUNBMjAwMUM4RUUyMDRDODlFCis6MTA1RUEwMDAzQzAzMDAwMjAwNDMxMDI1QUNBMjAwMTBBRjg2MDEwMEE1Cis6MTA1RUIwMDA5MkUyMDRFQzE0NDAwMDM3MjQwOTAwMDE4RUUyNEUyOERGCis6MTA1RUMwMDAwMDAyMTBDMDI0NDI0RTM4MDJFMjIwMjE4QzgzMDAwMEUwCis6MTA1RUQwMDAyNDAyMDAwNTE0NjIwMDFGMDAwMDAwMDA4RUUzNEUyODFCCis6MTA1RUUwMDA4RUUyNEUyQzEwNjIwMDFCMjQwMzAwNDA4QzgyMDAwNEMyCis6MTA1RUYwMDAyNDQyMDAwMUFDODIwMDA0OEVFMjRFMkM4RUU1NEUyODM2Cis6MTA1RjAwMDAyNDQyMDAwMTEwNDMwMDA3MDAwMDAwMDA4RUUyNEUyQ0U2Cis6MTA1RjEwMDAyNDQyMDAwMTEwQTIwMDA1MDAwMDAwMDAwODAwMjdDQzY4Cis6MTA1RjIwMDAwMDAwMDAwMDE0QTAwMDA1MDAwMDAwMDA4RjgyMDEwODlFCis6MTA1RjMwMDAyNDQyMDAyMEFGODIwMTA4OEY4MjAxMDg4QzgyMDAwNDc1Cis6MTA1RjQwMDAyQzQyMDAxMTUwNDAwMDEzQUM4MDAwMDAwODAwMjdFMkYyCis6MTA1RjUwMDAwMDAwMDAwMDhFRTI0RTI4MjQwMzAwNDAyNDQyMDAwMThECis6MTA1RjYwMDA1MDQzMDAwMzAwMDAxMDIxOEVFMjRFMjgyNDQyMDAwMTFECis6MTA1RjcwMDBBRUUyNEUyODhFRTI0RTI4MDAwMjEwQzAyNDQyNEUzODc3Cis6MTA1RjgwMDAwMkUyMjAyMTI0MDIwMDA1QUM4MjAwMDAyNDAyMDAwMTZDCis6MTA1RjkwMDBBQzgyMDAwNDE1MjAwMDBBMjUwOEZGRkNBRkFCMDAxMEZFCis6MTA1RkEwMDA4RUUyNzI2NDNDMDQwMDAxMjQ4NDU3MzAzQzA1MDAwNEY2Cis6MTA1RkIwMDBBRkEyMDAxNDhFRTYwNEU0MDgwMDI4QkUzNEE1RjAxNTU0Cis6MTA1RkMwMDAzNDAyODEwMEE1MDIwMDAwOTU4MjAwMEUwODAwMjg1RkJGCis6MTA1RkQwMDBBNTAyMDAwMjhGODUwMTAwMjc2MjMwMDAyNEE2MDAyMDYwCis6MTA1RkUwMDAwMEMyMTAyQjUwNDAwMDAxMjc2NjI4MDA4RjgyMDEwODU0Cis6MTA1RkYwMDAxMEMyMDAwNDAwMDAwMDAwOEY4MjAxMDQxNEMyMDAwN0Q4Cis6MTA2MDAwMDAyNTYzMDAwQzhFRTIwMUE4MDAwMDQ4MjEyNDQyMDAwMTEzCis6MTA2MDEwMDBBRUUyMDFBODA4MDAyODRGOEVFMjAxQTgyQzY0MDAwQzEzCis6MTA2MDIwMDAwMTQ0MTAyMUFDQTIwMDAwQUNBMzAwMDQ4RUUzNzI2NDEyCis6MTA2MDMwMDAyNEUyRkZGNEE0QTIwMDBFMjQwMjAwMDZBQ0EyMDAxODgxCis6MTA2MDQwMDAyNDYzMDAxMEFDQTMwMDA4OEVFMjA0RTRBQ0EyMDAxQ0EwCis6MTA2MDUwMDA4RUUyMDRDODNDMDMwMDAyMDA0MzEwMjVBQ0EyMDAxMEVECis6MTA2MDYwMDBBRjg2MDEwMDkyRTIwNEVDMTQ0MDAwMzcyNDA5MDAwMURECis6MTA2MDcwMDA4RUUyNEUyODAwMDIxMEMwMjQ0MjRFMzgwMkUyMjAyMTU3Cis6MTA2MDgwMDA4QzgzMDAwMDI0MDIwMDA1MTQ2MjAwMUYwMDAwMDAwMDQxCis6MTA2MDkwMDA4RUUzNEUyODhFRTI0RTJDMTA2MjAwMUIyNDAzMDA0MDNCCis6MTA2MEEwMDA4QzgyMDAwNDI0NDIwMDAxQUM4MjAwMDQ4RUUyNEUyQzVCCis6MTA2MEIwMDA4RUU1NEUyODI0NDIwMDAxMTA0MzAwMDcwMDAwMDAwMDM2Cis6MTA2MEMwMDA4RUUyNEUyQzI0NDIwMDAxMTBBMjAwMDUwMDAwMDAwMEM4Cis6MTA2MEQwMDAwODAwMjgzOTAwMDAwMDAwMTRBMDAwMDUwMDAwMDAwMDlFCis6MTA2MEUwMDA4RjgyMDEwODI0NDIwMDIwQUY4MjAxMDg4RjgyMDEwOEJDCis6MTA2MEYwMDA4QzgyMDAwNDJDNDIwMDExNTA0MDAwMTNBQzgwMDAwMDQwCis6MTA2MTAwMDAwODAwMjg0RjAwMDAwMDAwOEVFMjRFMjgyNDAzMDA0MEMzCis6MTA2MTEwMDAyNDQyMDAwMTUwNDMwMDAzMDAwMDEwMjE4RUUyNEUyODZCCis6MTA2MTIwMDAyNDQyMDAwMUFFRTI0RTI4OEVFMjRFMjgwMDAyMTBDMDRBCis6MTA2MTMwMDAyNDQyNEUzODAyRTIyMDIxMjQwMjAwMDVBQzgyMDAwMEY1Cis6MTA2MTQwMDAyNDAyMDAwMUFDODIwMDA0MTUyMDAwMEEzNDAyODEwMDAwCis6MTA2MTUwMDBBRkFCMDAxMDhFRTI3MjY0M0MwNDAwMDEyNDg0NTczMDFGCis6MTA2MTYwMDAzQzA1MDAwNEFGQTIwMDE0OEVFNjA0RTQwODAwMjhCRTNCCis6MTA2MTcwMDAzNEE1RjAxNjhFRTM3MjY0QTQ2MjAwMEM4RUUzNzI2NEEwCis6MTA2MTgwMDA5NTgyMDAwRUE0NjIwMDBFMDgwMDI4QzIyNEU3MDAwNEQ1Cis6MTA2MTkwMDA4RjgzMDEwMDI3NjIzMDAwMjQ2NDAwMjAwMDgyMTAyQkNFCis6MTA2MUEwMDA1MDQwMDAwMTI3NjQyODAwOEY4MjAxMDgxMDgyMDAwNEZCCis6MTA2MUIwMDAwMDAwMDAwMDhGODIwMTA0MTQ4MjAwMDcyNDA1MDAwNUZFCis6MTA2MUMwMDA4RUUyMDFBODAwMDA0ODIxMjQ0MjAwMDFBRUUyMDFBOEFECis6MTA2MUQwMDAwODAwMjhCNjhFRTIwMUE4QUM2QTAwMDBBQzZCMDAwNDhGCis6MTA2MUUwMDA4RUUyNzI2NEE0NjcwMDBFQUM2NTAwMThBQzYyMDAwODExCis6MTA2MUYwMDA4RUUyMDRFNEFDNjIwMDFDOEVFMjA0QzhBQzYyMDAxMEMzCis6MTA2MjAwMDBBRjg0MDEwMDkyRTIwNEVDMTQ0MDAwMzYyNDA5MDAwMTNFCis6MTA2MjEwMDA4RUUyNEUyODAwMDIxMEMwMjQ0MjRFMzgwMkUyMjAyMUI1Cis6MTA2MjIwMDA4QzgyMDAwMDE0NDUwMDFGMDAwMDAwMDA4RUUzNEUyODAxCis6MTA2MjMwMDA4RUUyNEUyQzEwNjIwMDFCMjQwMzAwNDA4QzgyMDAwNDZFCis6MTA2MjQwMDAyNDQyMDAwMUFDODIwMDA0OEVFMjRFMkM4RUU1NEUyOEUyCis6MTA2MjUwMDAyNDQyMDAwMTEwNDMwMDA3MDAwMDAwMDA4RUUyNEUyQzkzCis6MTA2MjYwMDAyNDQyMDAwMTEwQTIwMDA1MDAwMDAwMDAwODAwMjhBMDQwCis6MTA2MjcwMDAwMDAwMDAwMDE0QTAwMDA1MDAwMDAwMDA4RjgyMDEwODRCCis6MTA2MjgwMDAyNDQyMDAyMEFGODIwMTA4OEY4MjAxMDg4QzgyMDAwNDIyCis6MTA2MjkwMDAyQzQyMDAxMTUwNDAwMDEzQUM4MDAwMDAwODAwMjhCNkNBCis6MTA2MkEwMDAwMDAwMDAwMDhFRTI0RTI4MjQwMzAwNDAyNDQyMDAwMTNBCis6MTA2MkIwMDA1MDQzMDAwMzAwMDAxMDIxOEVFMjRFMjgyNDQyMDAwMUNBCis6MTA2MkMwMDBBRUUyNEUyODhFRTI0RTI4MDAwMjEwQzAyNDQyNEUzODI0Cis6MTA2MkQwMDAwMkUyMjAyMTI0MDIwMDA1QUM4MjAwMDAyNDAyMDAwMTE5Cis6MTA2MkUwMDBBQzgyMDAwNDE1MjAwMDBCM0MwNTAwMDQzQzA0MDAwMUI2Cis6MTA2MkYwMDAyNDg0NTc0OEFGQUIwMDEwQUZBMDAwMTQ4RUU2MDRFNDJFCis6MTA2MzAwMDAzNEE1RjAxNzBDMDAyNDAzMzBFN0ZGRkYwODAwMjhFMTU0Cis6MTA2MzEwMDAwMDAwMDAwMDhFRTI3MjY0M0MwNTAwMDEzMEU0RkZGRkUzCis6MTA2MzIwMDAwMDQ0MTAyMUFFRTI3MjY0OEVFMjcyNUM4RUUzNzI2NDBECis6MTA2MzMwMDAzNEE1MzgwMDAwNDQxMDIxQUVFMjcyNUMwMzY1MTAyMUUwCis6MTA2MzQwMDAwMDYyMTgyQjE0NjAwMDA0M0MwM0ZGRkY4RUUyNzI2NEFECis6MTA2MzUwMDAwMDQzMTAyMUFFRTI3MjY0OEVFMzA0RTQ5NkUyMDQ1ODM2Cis6MTA2MzYwMDAyNDYzMDAwMTI0NDJGRkZGMDA2MjE4MjRBRUUzMDRFNDJBCis6MTA2MzcwMDA4RUUzMDRFNDhFRTIwNEUwMTQ2MjAwMDUwMDAwMDAwMEY1Cis6MTA2MzgwMDA4RjgyMDA2MDI0MDNGRkY3MDA0MzEwMjRBRjgyMDA2MDc3Cis6MTA2MzkwMDA4RkJGMDAyMDAzRTAwMDA4MjdCRDAwMjgyN0JERkZFMEQ1Cis6MTA2M0EwMDBBRkJGMDAxODhFRTMwNEU4OEVFMjA0RTAxMDYyMDE4OUJBCis6MTA2M0IwMDAwMDAwMDAwMDhFRTIwNEU4OEVFMzA0RkMwMDAyMTEwMEZECis6MTA2M0MwMDAwMDYyMTgyMTk0NjcwMDA4OTJFMjA0RUQ4QzY4MDAwMEQ2Cis6MTA2M0QwMDA4QzY5MDAwNDEwNDAwMDIzOTQ2QTAwMEE4RUUyMDRDODBECis6MTA2M0UwMDAzNDQ2MDQwMDMxNDIwMjAwMTA0MDAwMUYwMDAwMDAwMDRCCis6MTA2M0YwMDA5NkUyMDQ1QTMwNDIwMDEwMTA0MDAwMUIzQzAyODAwMDFDCis6MTA2NDAwMDAzQzAxMDAwMTAwMzcwODIxQUMyMjgzRDg4RUUyNzI2NDdGCis6MTA2NDEwMDA5NDY0MDAwRTNDMDUwMDAxMzRBNTM4MDAyNDQyMDAwNEI5Cis6MTA2NDIwMDBBRUUyNzI2NDhFRTM3MjY0MDAwNDI0MDAwMzY1MTAyMUZFCis6MTA2NDMwMDAzQzAxMDAwMTAwMzcwODIxQUMyNDgzREMwMDYyMTgyQkVBCis6MTA2NDQwMDAxNDYwMDAwNTI0RTcwMDA0OEVFMjcyNjQzQzAzRkZGRjQxCis6MTA2NDUwMDAwMDQzMTAyMUFFRTI3MjY0OEVFMjcyNjQwODAwMjkxN0Q0Cis6MTA2NDYwMDBBRUUyNzI1ODhFRTYwNEM4OEVFMjcyNkMzMEU0RkZGRjMyCis6MTA2NDcwMDAwMDQ0MTAyQTEwNDAwMDE1MDAwMDAwMDA4RjgyMDBEODUwCis6MTA2NDgwMDA4RUUzNzI1ODAwNDMxMDIzQUVFMjcyNkM4RUUyNzI2QzlGCis6MTA2NDkwMDAxQzQwMDAwNzAwNDQxMDJBOEVFMjcyNkMzQzAzMDAwMThECis6MTA2NEEwMDAwMDQzMTAyMUFFRTI3MjZDOEVFMjcyNkMwMDQ0MTAyQTNFCis6MTA2NEIwMDAxMDQwMDAwNjAwMDAwMDAwOEVFMjAxQjgyNDQyMDAwMUY2Cis6MTA2NEMwMDBBRUUyMDFCODA4MDAyQTcyOEVFMjAxQjgzQzAyMDAwMTc3Cis6MTA2NEQwMDAwMDU3MTAyMThDNDI4M0Q4NTQ0MDAwMDEyNEU3RkZGQzcwCis6MTA2NEUwMDAzMTQyMDAwNDEwNDAwMEI5MzBFMkZGRkYzQzAyMDAwMURECis6MTA2NEYwMDAwMDU3MTAyMThDNDI4M0Q4MTA0MDAwMkYwMDAwNTAyMUZCCis6MTA2NTAwMDA4Rjg0MDEwMDI3NjIzMDAwMjQ4NTAwMjAwMEEyMTAyQjE4Cis6MTA2NTEwMDA1MDQwMDAwMTI3NjUyODAwOEY4MjAxMDgxMEEyMDAzMjM4Cis6MTA2NTIwMDAwMDAwMDAwMDhGODIwMTA0MTBBMjAwMkYyNDAyMDAxNTM5Cis6MTA2NTMwMDBBQzg4MDAwMEFDODkwMDA0OEVFMzcyNjRBNDg3MDAwRTZFCis6MTA2NTQwMDBBQzgyMDAxOEFDODMwMDA4OEVFMjA0RTgzQzAzMDAwMTMyCis6MTA2NTUwMDAwMDc3MTgyMThDNjM4M0RDQUM4NjAwMTAwMDQzMTAyNTgzCis6MTA2NTYwMDBBQzgyMDAxQ0FGODUwMTAwOTJFMjA0RUMxNDQwMDA2NjhFCis6MTA2NTcwMDAyNDBBMDAwMThFRTI0RTI4MjQwMzAwNDAyNDQyMDAwMTM4Cis6MTA2NTgwMDA1MDQzMDAwMzAwMDAxMDIxOEVFMjRFMjgyNDQyMDAwMUY3Cis6MTA2NTkwMDBBRUUyNEUyODhFRTI0RTI4MDAwMjEwQzAyNDQyNEUzODUxCis6MTA2NUEwMDAwMkUyMTgyMTI0MDIwMDE1QUM2MjAwMDAyNDAyMDAwMTVFCis6MTA2NUIwMDAwODAwMjlCRkFDNjIwMDA0OEY4NDAxMDAyNzYyMzAwMDBDCis6MTA2NUMwMDAyNDg1MDAyMDAwQTIxMDJCNTA0MDAwMDEyNzY1MjgwMEUwCis6MTA2NUQwMDA4RjgyMDEwODEwQTIwMDA0MDAwMDAwMDA4RjgyMDEwNEQ1Cis6MTA2NUUwMDAxNEEyMDAwNjI0MDIwMDA2OEVFMjAxQTgyNDQyMDAwMTQzCis6MTA2NUYwMDBBRUUyMDFBODA4MDAyOUJGOEVFMjAxQThBQzg4MDAwMDI1Cis6MTA2NjAwMDBBQzg5MDAwNDhFRTM3MjY0QTQ4NzAwMEVBQzgyMDAxODhCCis6MTA2NjEwMDBBQzgzMDAwODhFRTIwNEU4QUM4NjAwMTBBQzgyMDAxQzVCCis6MTA2NjIwMDBBRjg1MDEwMDkyRTIwNEVDMTQ0MDAwMzcyNDBBMDAwMTE3Cis6MTA2NjMwMDA4RUUyNEUyODAwMDIxMEMwMjQ0MjRFMzgwMkUyMjAyMTkxCis6MTA2NjQwMDA4QzgzMDAwMDI0MDIwMDA1MTQ2MjAwMUYwMDAwMDAwMDdCCis6MTA2NjUwMDA4RUUzNEUyODhFRTI0RTJDMTA2MjAwMUIyNDAzMDA0MDc1Cis6MTA2NjYwMDA4QzgyMDAwNDI0NDIwMDAxQUM4MjAwMDQ4RUUyNEUyQzk1Cis6MTA2NjcwMDA4RUU1NEUyODI0NDIwMDAxMTA0MzAwMDcwMDAwMDAwMDcwCis6MTA2NjgwMDA4RUUyNEUyQzI0NDIwMDAxMTBBMjAwMDUwMDAwMDAwMDAyCis6MTA2NjkwMDAwODAwMjlBOTAwMDAwMDAwMTRBMDAwMDUwMDAwMDAwMDY3Cis6MTA2NkEwMDA4RjgyMDEwODI0NDIwMDIwQUY4MjAxMDg4RjgyMDEwOEY2Cis6MTA2NkIwMDA4QzgyMDAwNDJDNDIwMDExNTA0MDAwMTNBQzgwMDAwMDdBCis6MTA2NkMwMDAwODAwMjlCRjAwMDAwMDAwOEVFMjRFMjgyNDAzMDA0MDhECis6MTA2NkQwMDAyNDQyMDAwMTUwNDMwMDAzMDAwMDEwMjE4RUUyNEUyOEE2Cis6MTA2NkUwMDAyNDQyMDAwMUFFRTI0RTI4OEVFMjRFMjgwMDAyMTBDMDg1Cis6MTA2NkYwMDAyNDQyNEUzODAyRTIyMDIxMjQwMjAwMDVBQzgyMDAwMDMwCis6MTA2NzAwMDAyNDAyMDAwMUFDODIwMDA0MTU0MDAwMEEyNDAyMDAwMUFBCis6MTA2NzEwMDBBRkE5MDAxMDhFRTI3MjY0M0MwNDAwMDEyNDg0NTczMDVCCis6MTA2NzIwMDAzQzA1MDAwNEFGQTIwMDE0OEVFNjA0RTQwODAwMkE0RkUyCis6MTA2NzMwMDAzNEE1RjIwNEEyRTIwNEVEOEVFMjA0RTg4RUUzMDRGQzQ4Cis6MTA2NzQwMDA4RUU0NzI1ODNDMDYwMDAxMzRDNjM4MDAzQzAxMDAwMTVBCis6MTA2NzUwMDAwMDM3MDgyMUFDMjA4M0Q4M0MwMTAwMDEwMDM3MDgyMTE0Cis6MTA2NzYwMDBBQzIwODNEQzAwMDIxMTAwMDA0MzEwMjFBQzQ0MDAwQzdCCis6MTA2NzcwMDA4RUUyNzI2NDI0MDVGRkY4MzBFM0ZGRkYwMDQzMTAyMTJFCis6MTA2NzgwMDAyNDQyMDAwNzAwNDUxMDI0MjQ2MzAwMDdBRUUyNzI1ODNCCis6MTA2NzkwMDA4RUUyNzI2QzhFRTQ3MjU4MDA2NTE4MjQwMDQzMTAyMzU4Cis6MTA2N0EwMDBBRUUyNzI2QzAzNjYxMDIxMDA4MjIwMkIxNDgwMDAwNDdDCis6MTA2N0IwMDAzQzAzRkZGRjhFRTI3MjU4MDA0MzEwMjFBRUUyNzI1ODk0Cis6MTA2N0MwMDA4RUUyNzI1ODA4MDAyQTY0QUVFMjcyNjQxMDQwMDA3M0QwCis6MTA2N0QwMDAwMDAwMDAwMDhGODMwMTAwMjc2MjMwMDAyNDY0MDAyMDQ1Cis6MTA2N0UwMDAwMDgyMTAyQjE0NDAwMDAyMDAwMDUwMjEyNzY0MjgwMDcyCis6MTA2N0YwMDA4RjgyMDEwODEwODIwMDA0MDAwMDAwMDA4RjgyMDEwNEQzCis6MTA2ODAwMDAxNDgyMDAwNjI0MDUwMDA1OEVFMjAxQTgyNDQyMDAwMTNFCis6MTA2ODEwMDBBRUUyMDFBODA4MDAyQTQ2OEVFMjAxQThBQzY4MDAwMDlBCis6MTA2ODIwMDBBQzY5MDAwNDhFRTI3MjY0QTQ2NzAwMEVBQzY1MDAxOEM3Cis6MTA2ODMwMDBBQzYyMDAwODhFRTIwNEU4QUM2NjAwMTBBQzYyMDAxQzlBCis6MTA2ODQwMDBBRjg0MDEwMDkyRTIwNEVDMTQ0MDAwMzYyNDBBMDAwMUY3Cis6MTA2ODUwMDA4RUUyNEUyODAwMDIxMEMwMjQ0MjRFMzgwMkUyMjAyMTZGCis6MTA2ODYwMDA4QzgyMDAwMDE0NDUwMDFGMDAwMDAwMDA4RUUzNEUyOEJCCis6MTA2ODcwMDA4RUUyNEUyQzEwNjIwMDFCMjQwMzAwNDA4QzgyMDAwNDI4Cis6MTA2ODgwMDAyNDQyMDAwMUFDODIwMDA0OEVFMjRFMkM4RUU1NEUyODlDCis6MTA2ODkwMDAyNDQyMDAwMTEwNDMwMDA3MDAwMDAwMDA4RUUyNEUyQzRECis6MTA2OEEwMDAyNDQyMDAwMTEwQTIwMDA1MDAwMDAwMDAwODAwMkEzMDY4Cis6MTA2OEIwMDAwMDAwMDAwMDE0QTAwMDA1MDAwMDAwMDA4RjgyMDEwODA1Cis6MTA2OEMwMDAyNDQyMDAyMEFGODIwMTA4OEY4MjAxMDg4QzgyMDAwNERDCis6MTA2OEQwMDAyQzQyMDAxMTUwNDAwMDEzQUM4MDAwMDAwODAwMkE0NkYyCis6MTA2OEUwMDAwMDAwMDAwMDhFRTI0RTI4MjQwMzAwNDAyNDQyMDAwMUY0Cis6MTA2OEYwMDA1MDQzMDAwMzAwMDAxMDIxOEVFMjRFMjgyNDQyMDAwMTg0Cis6MTA2OTAwMDBBRUUyNEUyODhFRTI0RTI4MDAwMjEwQzAyNDQyNEUzOERECis6MTA2OTEwMDAwMkUyMjAyMTI0MDIwMDA1QUM4MjAwMDAyNDAyMDAwMUQyCis6MTA2OTIwMDBBQzgyMDAwNDE1NDAwMDBDMzBFNUZGRkYzQzA0MDAwMTgwCis6MTA2OTMwMDAyNDg0NTc0ODNDMDUwMDA0QUZBOTAwMTBBRkEwMDAxNDAwCis6MTA2OTQwMDA4RUU2MDRFNDM0QTVGMjM3MEMwMDI0MDMzMEU3RkZGRkExCis6MTA2OTUwMDAwODAwMkE3MjAwMDAwMDAwOEVFMjcyNjQwMDQ1MTAyMUQ3Cis6MTA2OTYwMDBBRUUyNzI2NDhFRTI3MjZDOEVFMzcyNjQzQzA0MDAwMUVCCis6MTA2OTcwMDAzNDg0MzgwMEEyRTAwNEVEMDA0NTEwMjNBRUUyNzI2Q0NFCis6MTA2OTgwMDAwMzY0MTAyMTAwNjIxODJCMTQ2MDAwMDQzQzAzRkZGRjE1Cis6MTA2OTkwMDA4RUUyNzI2NDAwNDMxMDIxQUVFMjcyNjQ4RUUzMDRFODdBCis6MTA2OUEwMDA5NkUyMDQ1ODI0NjMwMDAxMjQ0MkZGRkYwMDYyMTgyNDg5Cis6MTA2OUIwMDBBRUUzMDRFODhFRTMwNEU4OEVFMjA0RTAxNDYyMDAwNTJFCis6MTA2OUMwMDAwMDAwMDAwMDhGODIwMDYwMjQwM0ZGRjcwMDQzMTAyNEMyCis6MTA2OUQwMDBBRjgyMDA2MDhGQkYwMDE4MDNFMDAwMDgyN0JEMDAyMEQxCis6MTA2OUUwMDAyN0JERkZFMEFGQkYwMDFDQUZCMDAwMTg4RjgyMDEwMEQxCis6MTA2OUYwMDA4RUUzNEUyQzhGODIwMTA0OEY4NTAxMDgyNDAyMDA0MDEzCis6MTA2QTAwMDAyNDYzMDAwMTUwNjIwMDAzMDAwMDEwMjE4RUUyNEUyQzJFCis6MTA2QTEwMDAyNDQyMDAwMUFFRTI0RTJDOEVFMjRFMkM4RUUzNEUyQzMwCis6MTA2QTIwMDAwMDAyMTBDMDI0NDI0RTM4MDJFMjIwMjE4RUUyNEUyODlECis6MTA2QTMwMDA4Qzg3MDAwNDE0NjIwMDA3MDBBMDMwMjE4RjgyMDEwOEI3Cis6MTA2QTQwMDAyNDQyMDAyMEFGODIwMTA4OEY4MjAxMDgwODAwMkFBMjk4Cis6MTA2QTUwMDBBQzgwMDAwMDhFRTI0RTJDMjQwMzAwNDAyNDQyMDAwMTUyCis6MTA2QTYwMDA1MDQzMDAwMzAwMDAxMDIxOEVFMjRFMkMyNDQyMDAwMTBFCis6MTA2QTcwMDAwMDAyMTBDMDI0NDI0RTM4MDJFMjIwMjE4QzgyMDAwNDIxCis6MTA2QTgwMDA4RjgzMDEwODAwMDIxMTQwMDA2MjE4MjFBRjgzMDEwOEMyCis6MTA2QTkwMDBBQzgwMDAwMDhDQzIwMDE4MjQ0M0ZGRkUyQzYyMDAxMzVGCis6MTA2QUEwMDAxMDQwMDBDMTAwMDMxMDgwM0MwMTAwMDEwMDIyMDgyMUI5Cis6MTA2QUIwMDA4QzIyNTc3MDAwNDAwMDA4MDAwMDAwMDA4RUUyMDRGMEI1Cis6MTA2QUMwMDAwMDQ3MTAyMUFFRTIwNEYwOEVFMjA0RjA4RjQzMDIzQzU2Cis6MTA2QUQwMDAwMDQzMTAyQjE0NDAwMEJFMDAwMDAwMDA4RUUzMDRFNENECis6MTA2QUUwMDA4RUUyMDRGODUwNjIwMEJBQTJFMDA0RjQ4RjgzMDEyMDIxCis6MTA2QUYwMDAyNzYyMzgwMDI0NjYwMDIwMDBDMjEwMkI1MDQwMDAwMTlECis6MTA2QjAwMDAyNzY2MzAwMDhGODIwMTI4MTBDMjAwMDQwMDAwMDAwMEI4Cis6MTA2QjEwMDA4RjgyMDEyNDE0QzIwMDA3MDAwMDAwMDA4RUUyMDFBNDRECis6MTA2QjIwMDAwMDAwODAyMTI0NDIwMDAxQUVFMjAxQTQwODAwMkIxMkUzCis6MTA2QjMwMDA4RUUyMDFBNDhFRTIwNEU0QUM2MjAwMUM4RUU0MDRCMDk4Cis6MTA2QjQwMDA4RUU1MDRCNDI0NjIwMDFDQUM2MjAwMDgyNDAyMDAwODM0Cis6MTA2QjUwMDBBNDYyMDAwRTI0MDIwMDExQUM2MjAwMThBQzY0MDAwMEI0Cis6MTA2QjYwMDBBQzY1MDAwNDhFRTIwNEM0QUM2MjAwMTBBRjg2MDEyMDY0Cis6MTA2QjcwMDA5MkUyNEUyMDE0NDAwMDM3MjQxMDAwMDE4RUUyNEUzMDg1Cis6MTA2QjgwMDAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjE4QzgzMDAwMDExCis6MTA2QjkwMDAyNDAyMDAxMjE0NjIwMDFGMDAwMDAwMDA4RUUzNEUzMDM5Cis6MTA2QkEwMDA4RUUyNEUzNDEwNjIwMDFCMjQwMzAwNDA4QzgyMDAwNEVECis6MTA2QkIwMDAyNDQyMDAwMUFDODIwMDA0OEVFMjRFMzQ4RUU1NEUzMDU5Cis6MTA2QkMwMDAyNDQyMDAwMTEwNDMwMDA3MDAwMDAwMDA4RUUyNEUzNDEyCis6MTA2QkQwMDAyNDQyMDAwMTEwQTIwMDA1MDAwMDAwMDAwODAwMkFGQzY5Cis6MTA2QkUwMDAwMDAwMDAwMDE0QTAwMDA1MDAwMDAwMDA4RjgyMDEyOEIyCis6MTA2QkYwMDAyNDQyMDAyMEFGODIwMTI4OEY4MjAxMjg4QzgyMDAwNDY5Cis6MTA2QzAwMDAyQzQyMDAxMTUwNDAwMDEzQUM4MDAwMDAwODAwMkIxMkYxCis6MTA2QzEwMDAwMDAwMDAwMDhFRTI0RTMwMjQwMzAwNDAyNDQyMDAwMUI4Cis6MTA2QzIwMDA1MDQzMDAwMzAwMDAxMDIxOEVFMjRFMzAyNDQyMDAwMTQ4Cis6MTA2QzMwMDBBRUUyNEUzMDhFRTI0RTMwMDAwMjEwQzAyNDQyNTAzODk4Cis6MTA2QzQwMDAwMkUyMjAyMTI0MDIwMDEyQUM4MjAwMDAyNDAyMDAwMTkyCis6MTA2QzUwMDBBQzgyMDAwNDU2MDAwMDBCMjQxMDAwMDE4RUUyMDRFNDE0Cis6MTA2QzYwMDAzQzA0MDAwMTI0ODQ1NzU0QUZBMDAwMTRBRkEyMDAxMENDCis6MTA2QzcwMDA4RUU2MDYwODhGNDcwMjI4M0MwNTAwMDkwQzAwMjQwMzE1Cis6MTA2QzgwMDAzNEE1RjAwNjE2MDAwMDAzMjQwMjAwMDEwODAwMkI3MTUxCis6MTA2QzkwMDBBMkUyMDRGNDhFRTIwMTcwMjQ0MjAwMDFBRUUyMDE3MDJGCis6MTA2Q0EwMDA4RUUyMDE3MDhFRTIwNEU0QTJFMDA0RjRBRUUwMDRGMEFGCis6MTA2Q0IwMDBBRUUyMDRGODhGNDIwMjNDNTA0MDAwNDVBRUUwNzI3NEYwCis6MTA2Q0MwMDA4RUUyMDE4NDI0NDIwMDAxQUVFMjAxODQ4RUUyMDE4NDVFCis6MTA2Q0QwMDAwODAwMkI3MUFFRTA3Mjc0OEVFMjA1MDQyNDAzMDA0MEJDCis6MTA2Q0UwMDAyNDQyMDAwMTUwNDMwMDAzMDAwMDEwMjE4RUUyMDUwNEZECis6MTA2Q0YwMDAyNDQyMDAwMUFFRTIwNTA0OEVFMjA1MDQ4Q0MzMDAxOEI0Cis6MTA2RDAwMDAwMDAyMTA4MDAwNTcxMDIxOEM0NDA1MDgyNDAyMDAwMzYzCis6MTA2RDEwMDAxNDYyMDAwRjAwMDAwMDAwM0MwMjAwMDEwMDU3MTAyMTI3Cis6MTA2RDIwMDA5MDQyODNCMTEwNDAwMDE0MDAwMDAwMDA4RUUyMDFEMEI4Cis6MTA2RDMwMDA4RUUzNTI0MDAwNDQxMDIxQUVFMjAxRDA4RUUyMDFEODMxCis6MTA2RDQwMDAwMDY0MTgyMTMwNjMwMEZGMDgwMDJCNTlBRUUzNTI0MDY1Cis6MTA2RDUwMDA4RUUyMDFDQzhFRTMwRTEwMDA0NDEwMjFBRUUyMDFDQzk1Cis6MTA2RDYwMDA4RUUyMDFEODAwNjQxODIxMzA2MzAxRkZBRUUzMEUxMEZCCis6MTA2RDcwMDAwMDQ0MTAyMUFFRTIwMUQ4OEVFMjAwMDAzNDQyMDA0MDBGCis6MTA2RDgwMDAwODAwMkI3MUFFRTIwMDAwOEVFMjAxNEMzQzAxMDAwMUQ0Cis6MTA2RDkwMDAwMDM3MDgyMUEwMjA4M0UwMjQ0MjAwMDFBRUUyMDE0QzJDCis6MTA2REEwMDAwODAwMkI3MThFRTIwMTRDOTRDNzAwMEU4Q0MyMDAxQ0FGCis6MTA2REIwMDAzQzA0MDAwMTI0ODQ1NzYwQUZBNjAwMTRBRkEyMDAxMDY5Cis6MTA2REMwMDA4Q0M2MDAxODNDMDUwMDA4MEMwMDI0MDMzNEE1MDkxMEVCCis6MTA2REQwMDA4RkJGMDAxQzhGQjAwMDE4MDNFMDAwMDgyN0JEMDAyMDAzCis6MTA2REUwMDAyN0JERkY5OEFGQkYwMDYwQUZCRTAwNUNBRkI2MDA1OEQ0Cis6MTA2REYwMDBBRkI1MDA1NEFGQjQwMDUwQUZCMzAwNENBRkIyMDA0OEQxCis6MTA2RTAwMDBBRkIxMDA0NEFGQjAwMDQwOEY4MzAxMDg4RjgyMDEwNDBFCis6MTA2RTEwMDBBRkEwMDAyNDEwNjIwM0U3QUZBMDAwMkMzQzFFMDAwMUNECis6MTA2RTIwMDAzN0RFMzgwMDNDMEJGRkZGOEY5MzAxMDg4RTYyMDAxODlECis6MTA2RTMwMDA4RjgzMDEwNDI0NDNGRkZFMkM2MjAwMTQxMDQwMDNDRjEzCis6MTA2RTQwMDAwMDAzMTA4MDNDMDEwMDAxMDAyMjA4MjE4QzIyNTdDMDYxCis6MTA2RTUwMDAwMDQwMDAwODAwMDAwMDAwOTY2MzAwMEU4RUUyNzI1Q0E1Cis6MTA2RTYwMDA4RUU0MDRGMDAwNDMxMDIxQUVFMjcyNUM4RTYzMDAxQ0RECis6MTA2RTcwMDA5NkUyMDQ1ODI0ODQwMDAxQUVFNDA0RjAyNDYzMDAwMTg3Cis6MTA2RTgwMDAyNDQyRkZGRjAwNjIxODI0QUVFMzA0RTQ4RjQyMDIzQzc4Cis6MTA2RTkwMDAwMDgyMjAyQjE0ODAwM0I5MDAwMDAwMDA4RjgzMDEyMEEyCis6MTA2RUEwMDAyNzYyMzgwMDI0NjYwMDIwMDBDMjEwMkI1MDQwMDAwMUU5Cis6MTA2RUIwMDAyNzY2MzAwMDhGODIwMTI4MTBDMjAwMDQwMDAwMDAwMDA1Cis6MTA2RUMwMDA4RjgyMDEyNDE0QzIwMDA3MDAwMDAwMDA4RUUyMDFBNDlBCis6MTA2RUQwMDAwMDAwODAyMTI0NDIwMDAxQUVFMjAxQTQwODAwMkJGRTQ0Cis6MTA2RUUwMDA4RUUyMDFBNDhFRTIwNEU0QUM2MjAwMUM4RUU0MDRCMEU1Cis6MTA2RUYwMDA4RUU1MDRCNDI0NjIwMDFDQUM2MjAwMDgyNDAyMDAwODgxCis6MTA2RjAwMDBBNDYyMDAwRTI0MDIwMDExQUM2MjAwMThBQzY0MDAwMDAwCis6MTA2RjEwMDBBQzY1MDAwNDhFRTIwNEM0QUM2MjAwMTBBRjg2MDEyMEIwCis6MTA2RjIwMDA5MkUyNEUyMDE0NDAwMDM3MjQxMDAwMDE4RUUyNEUzMEQxCis6MTA2RjMwMDAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjE4QzgzMDAwMDVECis6MTA2RjQwMDAyNDAyMDAxMjE0NjIwMDFGMDAwMDAwMDA4RUUzNEUzMDg1Cis6MTA2RjUwMDA4RUUyNEUzNDEwNjIwMDFCMjQwQzAwNDA4QzgyMDAwNDMwCis6MTA2RjYwMDAyNDQyMDAwMUFDODIwMDA0OEVFMjRFMzQ4RUUzNEUzMEE3Cis6MTA2RjcwMDAyNDQyMDAwMTEwNEMwMDA3MDAwMDAwMDA4RUUyNEUzNDU1Cis6MTA2RjgwMDAyNDQyMDAwMTEwNjIwMDA1MDAwMDAwMDAwODAwMkJFODA4Cis6MTA2RjkwMDAwMDAwMDAwMDE0NjAwMDA1MDAwMDAwMDA4RjgyMDEyODNFCis6MTA2RkEwMDAyNDQyMDAyMEFGODIwMTI4OEY4MjAxMjg4QzgyMDAwNEI1Cis6MTA2RkIwMDAyQzQyMDAxMTUwNDAwMDEzQUM4MDAwMDAwODAwMkJGRTUyCis6MTA2RkMwMDAwMDAwMDAwMDhFRTI0RTMwMjQwQzAwNDAyNDQyMDAwMUZDCis6MTA2RkQwMDA1MDRDMDAwMzAwMDAxMDIxOEVFMjRFMzAyNDQyMDAwMThDCis6MTA2RkUwMDBBRUUyNEUzMDhFRTI0RTMwMDAwMjEwQzAyNDQyNTAzOEU1Cis6MTA2RkYwMDAwMkUyMjAyMTI0MDIwMDEyMjQwQzAwMDFBQzgyMDAwMEQ1Cis6MTA3MDAwMDBBQzhDMDAwNDU2MDAwMDBEMjQxMDAwMDE4RUUyMDRFNDU0Cis6MTA3MDEwMDAzQzA0MDAwMTI0ODQ1NzU0QUZBMDAwMTRBRkEyMDAxMDE4Cis6MTA3MDIwMDA4RUU2MDYwODhGNDcwMjI4M0MwNTAwMDkzNEE1RjAwNkM1Cis6MTA3MDMwMDAwQzAwMjQwM0FGQUIwMDM4OEZBQjAwMzgxMjAwMDMwQUZBCis6MTA3MDQwMDAyNDBDMDAwMTA4MDAyRjE5MDAwMDAwMDA5NjZDMDAxQ0ExCis6MTA3MDUwMDBBRkFDMDAyQzk2NjIwMDFFM0MwQzgwMDBBRkFDMDAyNDRDCis6MTA3MDYwMDBBRTYyMDAxQzhFNzUwMDFDOEVFMjA0RkM4RUU0MDRGQ0YzCis6MTA3MDcwMDAwMDE1MTkwMDAwNjIxMDIxOEM1MjAwMEM5MkUyN0I5OERFCis6MTA3MDgwMDAwMDY0MTgyMTk0NzYwMDBBMTQ0MDAwMDMzMkMyMDAwMjAyCis6MTA3MDkwMDBBRUYyN0JBNEFFRjU3QjlDMTA0MDAwNEIwMDAwODAyMTNCCis6MTA3MEEwMDA5NkUyMDQ1QTMwNDIwMDAyMTA0MDAwNDcwMDAwMDAwMEZGCis6MTA3MEIwMDA4RTYzMDAxQzhFRTIwNEZDMDAwMzIxMDAwMDgyMTAyMTdDCis6MTA3MEMwMDA4QzQyMDAwQzAzN0UxODIxMjQ0MjAwMjIwMDQzMTAyQjI2Cis6MTA3MEQwMDAxNDQwMDAwQTI0MDUwMDE0OEVFMjA0RkMwMDgyMTAyMUYyCis6MTA3MEUwMDA4QzQ0MDAwQ0FGQUIwMDM4MEMwMDJGNzUyNDg0MDAwRUNDCis6MTA3MEYwMDA4RkFCMDAzODA4MDAyQzUyMzA1MEZGRkY4RUUyMDRGQ0FBCis6MTA3MTAwMDAwMDgyMTAyMThDNDIwMDBDOTQ1MDAwMEU5NDQzMDAxMDE5Cis6MTA3MTEwMDA5NDQ0MDAxMjk0NDUwMDE0MDIwMzgwMjEwMjA0ODAyMTRCCis6MTA3MTIwMDAwMjA1ODAyMTk0NDMwMDE2OTQ0NDAwMTg5NDQ1MDAxQUU3Cis6MTA3MTMwMDAwMjAzODAyMTAyMDQ4MDIxMDIwNTgwMjE5NDQzMDAxQzY3Cis6MTA3MTQwMDA5NDQ0MDAxRTk0NDIwMDIwMDIwMzgwMjEwMjA0ODAyMTA2Cis6MTA3MTUwMDAwMjAyODAyMTAwMTAxQzAyMzIwMkZGRkYwMDYyODAyMTI3Cis6MTA3MTYwMDA4RTYzMDAxQzhFRTIwNEZDMDAxMDI0MDIwMDAzMjkwMDQwCis6MTA3MTcwMDAwMEEyMTAyMThDNDMwMDBDMzIwMkZGRkYwMDgyODAyMTBDCis6MTA3MTgwMDAwMzdFMTAyMTI0NjMwMDE4MDA2MjE4MkIxNDYwMDAwOThDCis6MTA3MTkwMDAwMDAwMDAwMDhFRTIwNEZDMDBBMjEwMjE4QzQzMDAwQ0QxCis6MTA3MUEwMDAwMDEwMTAyNzNDMDFGRkZGMDAyMzA4MjEwODAwMkM2RjZFCis6MTA3MUIwMDBBNDIyMDAxODhFRTIwNEZDMDBBMjEwMjE4QzQzMDAwQ0QzCis6MTA3MUMwMDAwMDEwMTAyN0E0NjIwMDE4OTZFMjA0NUEwMDAwODgyMURCCis6MTA3MUQwMDAzMDQyMDAwODE0NDAwMDYzMDAwMEEwMjE4RTYzMDAxQ0IwCis6MTA3MUUwMDA4RUUyMDRGQzAwMDMzMTAwMDBDMjEwMjE4QzQyMDAwQzJFCis6MTA3MUYwMDAwMzdFMTgyMTI0NDIwMDIyMDA0MzEwMkIxNDQwMDAzNTQ2Cis6MTA3MjAwMDAwMDAwMDAwMDhFRTIwNEZDMDBDMjEwMjE4QzQyMDAwQzQxCis6MTA3MjEwMDAyNDQ3MDAxMDAzN0UxMDIxMDBFMjEwMkI1MDQwMDAwMTkzCis6MTA3MjIwMDAwMEVCMzgyMThFRTIwNEZDOTRGMTAwMDAwMEMyMTAyMTMyCis6MTA3MjMwMDA4QzQyMDAwQzI0NDcwMDE2MDM3RTEwMjEwMEUyMTAyQjI0Cis6MTA3MjQwMDAxNDQwMDAwMjI2MzRGRkVDMDBFQjM4MjE4RUUyMDRGQ0VGCis6MTA3MjUwMDA5MEUzMDAwMTAwQzIxMDIxOEM0MjAwMEMyNDQ3MDAxQTY4Cis6MTA3MjYwMDAwMzdFMTAyMTAwRTIxMDJCMTQ0MDAwMDIwMjgzODgyMUNCCis6MTA3MjcwMDAwMEVCMzgyMTk0RTIwMDAwMjRFNzAwMDIwMjIyODgyMTdBCis6MTA3MjgwMDAwMzdFMTAyMTAwRTIxMDJCNTA0MDAwMDEwMEVCMzgyMTVBCis6MTA3MjkwMDA5NEUyMDAwMDI0RTcwMDAyMDIyMjg4MjEwMzdFMTAyMUVDCis6MTA3MkEwMDAwMEUyMTAyQjUwNDAwMDAxMDBFQjM4MjE5NEUyMDAwMDc2Cis6MTA3MkIwMDAyNEU3MDAwMjAyMjI4ODIxMDM3RTEwMjEwMEUyMTAyQjI1Cis6MTA3MkMwMDA1MDQwMDAwMTAwRUIzODIxOTRFMjAwMDAwODAwMkNEMDZGCis6MTA3MkQwMDAwMjIyODgyMThFRTIwNEZDMDBDMjEwMjE4QzQzMDAwQ0EzCis6MTA3MkUwMDA4RUUyMDRGQzk0NzEwMDEwOEVFMzA0RkMwMEMyMTAyMUI1Cis6MTA3MkYwMDA4QzQ0MDAwQzAwQzMxODIxOEM2MjAwMEMyNjM0RkZFQzc3Cis6MTA3MzAwMDA5MDg0MDAxNzhFRTMwNEZDOTQ0MjAwMUEwMjg0ODgyMUMyCis6MTA3MzEwMDAwMEMzMTgyMThDNjUwMDBDOEVFMzA0RkMwMjIyODgyMTM2Cis6MTA3MzIwMDA4RUUyMDRGQzAwQzMxODIxMDBDMjEwMjE4QzQ0MDAwQzIyCis6MTA3MzMwMDA4QzYyMDAwQzk0QTMwMDFDOTQ4NDAwMUU5NDQyMDAyMEQ0Cis6MTA3MzQwMDAwMjIzODgyMTAyMjQ4ODIxMDIyMjg4MjEwMDExMUMwMkE0Cis6MTA3MzUwMDAzMjIyRkZGRjAwNjI4ODIxMDAxMTFDMDIzMjIyRkZGRjRGCis6MTA3MzYwMDAwMDYyODgyMTMyQzIwMDAxMTA0MDAwQjIwMDAwMDAwMDFCCis6MTA3MzcwMDA5NkUyMDQ1QTMwNDIwMDAxMTA0MDAwQUUzMkMyMDA4MDUyCis6MTA3MzgwMDAxMDQwMDAwODAwMDAwMDAwOTJFMjdCOTgxNDQwMDAwNUM1Cis6MTA3MzkwMDAwMDAwMDAwMDI0MEMwMDAxQTJFQzdCOThBRUY1N0I5QzYxCis6MTA3M0EwMDBBRUYyN0JBNDhFRTMwNEZDMDAxNTExMDAwMDQzMTAyMTEzCis6MTA3M0IwMDA4QzQ3MDAwQzAzN0UxODIxMjRFMjAwMEUwMDQzMTAyQkEyCis6MTA3M0MwMDAxNDQwMDAwODAwRTAyMDIxMjQwNTAwMEUwQzAwMkY3NTU5Cis6MTA3M0QwMDBBRkFCMDAzODMwNDJGRkZGOEZBQjAwMzgwODAwMkQwOUZCCis6MTA3M0UwMDAwMjAyODAyMTk0RTYwMDAwMjRFNzAwMDI5NEU1MDAwMEY4Cis6MTA3M0YwMDAyNEU3MDAwMjk0RTMwMDAwMjRFNzAwMDI5NEUyMDAwMDg2Cis6MTA3NDAwMDAyNEU3MDAwMjk0RTQwMDAwMjRFNzAwMDIwMjA2ODAyMTQxCis6MTA3NDEwMDAwMjA1ODAyMTAyMDM4MDIxMDIwMjgwMjE5NEUyMDAwMDAzCis6MTA3NDIwMDA5NEUzMDAwMjAyMDQ4MDIxMDIwMjgwMjEwMjAzODAyMUYxCis6MTA3NDMwMDAwMDEwMUMwMjMyMDJGRkZGMDA2MjgwMjEwMDEwMUMwMkJCCis6MTA3NDQwMDAzMjAyRkZGRjhFRTQ3QjlDMDA2MjgwMjExNDk1MDAwNEQxCis6MTA3NDUwMDAzMjA1RkZGRjk2NjIwMDE2MDgwMDJEMTcwMDUxMjAyMTBCCis6MTA3NDYwMDA5NjYyMDAxNjAwNTQyMDIxMDAwNDE0MDIzMDgzRkZGRkFFCis6MTA3NDcwMDAwMDQzMjAyMTAwODUyMDIzMDAwNDE0MDIwMDgyMjAyMUUzCis6MTA3NDgwMDAzMDg0RkZGRjUwODAwMDAxMzQwNEZGRkY4RUUyN0JBNEI0Cis6MTA3NDkwMDAyNDQzMDAxNzAzN0UxMDIxMDA2MjEwMkI1MDQwMDAwMThFCis6MTA3NEEwMDAwMDZCMTgyMTkwNjMwMDAwMjQwMjAwMTExNDYyMDAzMTY3Cis6MTA3NEIwMDAyNDAyMDAwNjhFRTI3QkE0MDM3RTE4MjEyNDQyMDAyOEM5Cis6MTA3NEMwMDAwMDQzMTAyQjE0NDAwMDE4MDAwMDAwMDA4RUUyN0I5QzRCCis6MTA3NEQwMDAxMkEyMDAwQTMyQzIwMTAwOEVFMjdCQTQzQzAxRkZGRjJGCis6MTA3NEUwMDAwMDIyMDgyMTk0MjIwMDI4MDA4MjIwMjEwMDA0MUMwMjhFCis6MTA3NEYwMDAzMDgyRkZGRjAwNjIyMDIxMzJDMjAxMDAxNDQwMDAwNEVDCis6MTA3NTAwMDAwMDA0MTAyNzkyRTI3Qjk4MTQ0MDAwMDIwMDA0MTAyNzI4Cis6MTA3NTEwMDAzMDQ0RkZGRjhFRTI3QkE0M0MwMUZGRkYwMDIyMDgyMUU0Cis6MTA3NTIwMDAwODAwMkQ4QUE0MjQwMDI4OEVFMjdCOUMxMkEyMDAwODY5Cis6MTA3NTMwMDAzMkMyMDEwMDhFRTI3QkE0OTQ0MjAwMjgwMDgyMjAyMTA2Cis6MTA3NTQwMDAwMDA0MUMwMjMwODJGRkZGMDA2MjIwMjEzMkMyMDEwMEQxCis6MTA3NTUwMDAxNDQwMDAwNDAwMDQxMDI3OTJFMjdCOTgxNDQwMDAwMkJCCis6MTA3NTYwMDAwMDA0MTAyNzMwNDRGRkZGOEVFMjdCQTQwODAwMkQ4QTIwCis6MTA3NTcwMDBBNDQ0MDAyODE0NjIwMDJGMDM3RTE4MjE4RUUyN0JBNDBECis6MTA3NTgwMDAyNDQyMDAzMjAwNDMxMDJCMTQ0MDAwMTgwMDAwMDAwMDc5Cis6MTA3NTkwMDA4RUUyN0I5QzEyQTIwMDBBMzJDMjAxMDA4RUUyN0JBNDIyCis6MTA3NUEwMDAzQzAxRkZGRjAwMjIwODIxOTQyMjAwMzIwMDgyMjAyMUFBCis6MTA3NUIwMDAwMDA0MUMwMjMwODJGRkZGMDA2MjIwMjEzMkMyMDEwMDYxCis6MTA3NUMwMDAxNDQwMDAwNDAwMDQxMDI3OTJFMjdCOTgxNDQwMDAwMjRCCis6MTA3NUQwMDAwMDA0MTAyNzMwNDRGRkZGOEVFMjdCQTQzQzAxRkZGRjM0Cis6MTA3NUUwMDAwMDIyMDgyMTA4MDAyRDhBQTQyNDAwMzI4RUUyN0I5QzEwCis6MTA3NUYwMDAxMkEyMDAwODMyQzIwMTAwOEVFMjdCQTQ5NDQyMDAzMjQzCis6MTA3NjAwMDAwMDgyMjAyMTAwMDQxQzAyMzA4MkZGRkYwMDYyMjAyMTQyCis6MTA3NjEwMDAzMkMyMDEwMDE0NDAwMDA0MDAwNDEwMjc5MkUyN0I5ODVCCis6MTA3NjIwMDAxNDQwMDAwMjAwMDQxMDI3MzA0NEZGRkY4RUUyN0JBNEM4Cis6MTA3NjMwMDBBNDQ0MDAzMjhGQUMwMDI0MTE4MDAwMkMwMzdFMTgyMTVBCis6MTA3NjQwMDA4RTQyMDAwMEFFNDJGRkZDMjY0MjAwMEEwMDQzMTAyQjhGCis6MTA3NjUwMDAxNDQwMDAxQjM0MDM4MTAwMjY0MzAwMDQwMzdFMTAyMUU0Cis6MTA3NjYwMDAwMDYyMTAyQjE0NDAwMDAzMDA2MDIwMjEwMDZCMTgyMUUxCis6MTA3NjcwMDAwMDYwMjAyMThDNjIwMDAwMjQ2MzAwMDRBRTQyMDAwMDAwCis6MTA3NjgwMDAwMzdFMTAyMTAwNjIxMDJCNTA0MDAwMDEwMDZCMTgyMTc2Cis6MTA3NjkwMDA4QzYyMDAwMEFDODIwMDAwMzQwMjgxMDBBNDYyMDAwMDExCis6MTA3NkEwMDAyNDYzMDAwMjAzN0UxMDIxMDA2MjEwMkI1MDQwMDAwMTcxCis6MTA3NkIwMDAwMDZCMTgyMTk3QUMwMDJFMDgwMDJEQjRBNDZDMDAwMEJDCis6MTA3NkMwMDA4RTQyMDAwNDhFNDQwMDA4QTY0MzAwMDg5N0FDMDAyRUFBCis6MTA3NkQwMDBBNjRDMDAwQUFFNDIwMDAwQUU0NDAwMDQ5NjYyMDAwRUMyCis6MTA3NkUwMDAyNjUyRkZGQzI0NDIwMDA0QTY2MjAwMEU5NjYyMDAwRUExCis6MTA3NkYwMDA4RUUzNzI1QzAwNjIxODIxQUVFMzcyNUNBRkIyMDAxOEQ4Cis6MTA3NzAwMDA4RUUzNzI1Q0FGQTMwMDFDOEVFMjcyNUMyQzQyMDAzQ0U0Cis6MTA3NzEwMDAxMDQwMDAwNDI0NjIwMDAxMjQwM0ZGRkUwMDQzMTAyNEYzCis6MTA3NzIwMDBBRkEyMDAxQzMyQzIwMDgwMTA0MDAwMEMzMkMyMDEwMDI3Cis6MTA3NzMwMDA4RUUyN0JBODI0NDMwMDAxMDAwMjEwQzAwMDU3MTAyMUY0Cis6MTA3NzQwMDBBRUUzN0JBODhGQTMwMDE4OEZBNDAwMUNBQzQzN0JBQ0Q2Cis6MTA3NzUwMDBBQzQ0N0JCMDA4MDAyRUEwQUVFMDcyNUMxMDQwMDA3MjFBCis6MTA3NzYwMDAwMDAwMDAwMDhFRTI3QkE4MjQ0MzAwMDEwMDAyMTBDMDRDCis6MTA3NzcwMDAwMDU3MTAyMUFFRTM3QkE4OEZBMzAwMTg4RkE0MDAxQzM0Cis6MTA3NzgwMDBBQzQzN0JBQ0FDNDQ3QkIwOEVFMjdCQTgxMDQwMDA2MzgyCis6MTA3NzkwMDAwMDAwNDgyMTAwMDA1MDIxOEY4MjAwRjAyNDQ4MDAwODlBCis6MTA3N0EwMDAyNzYyMTgwMDAxMDIxMDJCNTA0MDAwMDEyNzY4MTAwMENBCis6MTA3N0IwMDA4RjgyMDBGNDE1MDIwMDA3MDAwMDAwMDA4RUUyMDFCNDgxCis6MTA3N0MwMDAwMDAwODAyMTI0NDIwMDAxQUVFMjAxQjQwODAwMkRGQTNECis6MTA3N0QwMDA4RUUyMDFCNDhGODMwMEYwMjQxMDAwMDEwMTU3MTAyMUM0Cis6MTA3N0UwMDA4QzQ0N0JBQzhDNDU3QkIwQUM2NDAwMDBBQzY1MDAwNDgxCis6MTA3N0YwMDBBRjg4MDBGMDE2MDAwMDA2MDJFQTEwMjE4RUUyMDA4ODMxCis6MTA3ODAwMDAyNDQyMDAwMUFFRTIwMDg4MDgwMDJFM0Y4RUUyMDA4ODhDCis6MTA3ODEwMDA4QzQyN0JCMDhFRTQwMEUwOEVFNTAwRTQ4RUU2N0I5QzNCCis6MTA3ODIwMDAwMDQwMTgyMTAwMDAxMDIxMDBBMzI4MjEwMEEzMzgyQkJDCis6MTA3ODMwMDAwMDgyMjAyMTAwODcyMDIxOEVFMjA0RkMwMEM5MzAyMTMzCis6MTA3ODQwMDAwMDA2MzEwMEFFRTQwMEUwQUVFNTAwRTQwMEMyMzAyMTA1Cis6MTA3ODUwMDA5NEMyMDAwQTI0MEMwMDAyMDAwMjExNDIzMDQzMDAwM0NCCis6MTA3ODYwMDAxMDZDMDAxNjI4NjIwMDAzMTA0MDAwMDUyNDBDMDAwMTczCis6MTA3ODcwMDAxMDZDMDAwODAwMDAwMDAwMDgwMDJFM0YwMDAwMDAwMDBGCis6MTA3ODgwMDAyNDBDMDAwMzEwNkMwMDE3MDAwMDAwMDAwODAwMkUzRkJECis6MTA3ODkwMDAwMDAwMDAwMDhFRTIwMEU4OEVFMzAwRUMyNDYzMDAwMUFCCis6MTA3OEEwMDAyQzY0MDAwMTAwNDQxMDIxQUVFMjAwRThBRUUzMDBFQ0RECis6MTA3OEIwMDA4RUUyMDBFODA4MDAyRTNGOEVFMzAwRUM4RUUyMDBGMDNFCis6MTA3OEMwMDA4RUUzMDBGNDI0NjMwMDAxMkM2NDAwMDEwMDQ0MTAyMUM1Cis6MTA3OEQwMDBBRUUyMDBGMEFFRTMwMEY0OEVFMjAwRjAwODAwMkUzRkNFCis6MTA3OEUwMDA4RUUzMDBGNDhFRTIwMEY4OEVFMzAwRkMyNDYzMDAwMUQ2Cis6MTA3OEYwMDAyQzY0MDAwMTAwNDQxMDIxQUVFMjAwRjhBRUUzMDBGQzZECis6MTA3OTAwMDA4RUUyMDBGODhFRTMwMEZDOEVFMjdCQTgyNTI5MDAwMUMwCis6MTA3OTEwMDAwMTIyMTAyQjE0NDBGRkEwMjU0QTAwMDhBMkUwN0I5ODBBCis6MTA3OTIwMDAwODAwMkU5RkFFRTA3QkE4OEY4MjAwRjAyNDQ3MDAwODVECis6MTA3OTMwMDAyNzYyMTgwMDAwRTIxMDJCNTA0MDAwMDEyNzY3MTAwMDVBCis6MTA3OTQwMDA4RjgyMDBGNDE0RTIwMDA3MDAwMDAwMDA4RUUyMDFCNDEwCis6MTA3OTUwMDAwMDAwODAyMTI0NDIwMDAxQUVFMjAxQjQwODAwMkU1RDQ3Cis6MTA3OTYwMDA4RUUyMDFCNDhGODIwMEYwMjQxMDAwMDE4RkEzMDAxODcyCis6MTA3OTcwMDA4RkE0MDAxQ0FDNDMwMDAwQUM0NDAwMDRBRjg3MDBGMEFGCis6MTA3OTgwMDAxNjAwMDAwNzAwMDAwMDAwOEVFMjAwODgyNDQyMDAwMTdCCis6MTA3OTkwMDBBRUUyMDA4ODhFRTIwMDg4MDgwMDJFQTBBRUUwNzI1Q0E1Cis6MTA3OUEwMDA4RUUyNzI1QzhFRTQwMEUwOEVFNTAwRTQyNDBDMDAwMkJFCis6MTA3OUIwMDAwMDQwMTgyMTAwMDAxMDIxMDBBMzI4MjEwMEEzMzAyQjMzCis6MTA3OUMwMDAwMDgyMjAyMTAwODYyMDIxMDAxNjExNDIzMDQzMDAwMzRFCis6MTA3OUQwMDBBRUU0MDBFMEFFRTUwMEU0MTA2QzAwMTcyQzYyMDAwMzlBCis6MTA3OUUwMDAxMDQwMDAwNTI0MEMwMDAxMTA2QzAwMDgwMDAwMDAwMDhECis6MTA3OUYwMDAwODAwMkVBMEFFRTA3MjVDMjQwQzAwMDMxMDZDMDAxOThECis6MTA3QTAwMDAwMDAwMDAwMDA4MDAyRUEwQUVFMDcyNUM4RUUyMDBFOEVDCis6MTA3QTEwMDA4RUUzMDBFQzI0NjMwMDAxMkM2NDAwMDEwMDQ0MTAyMTdCCis6MTA3QTIwMDBBRUUyMDBFOEFFRTMwMEVDOEVFMjAwRTg4RUUzMDBFQ0FDCis6MTA3QTMwMDAwODAwMkVBMEFFRTA3MjVDOEVFMjAwRjA4RUUzMDBGNDRGCis6MTA3QTQwMDAyNDYzMDAwMTJDNjQwMDAxMDA0NDEwMjFBRUUyMDBGMDI4Cis6MTA3QTUwMDBBRUUzMDBGNDhFRTIwMEYwOEVFMzAwRjQwODAwMkVBMDA2Cis6MTA3QTYwMDBBRUUwNzI1QzhFRTIwMEY4OEVFMzAwRkMyNDYzMDAwMTVECis6MTA3QTcwMDAyQzY0MDAwMTAwNDQxMDIxQUVFMjAwRjhBRUUzMDBGQ0VCCis6MTA3QTgwMDA4RUUyMDBGODhFRTMwMEZDQUVFMDcyNUM4RTYyMDAxQ0I5Cis6MTA3QTkwMDA5NkUzMDQ1ODhFRTQwNEYwMjQ0MjAwMDEyNDYzRkZGRkJGCis6MTA3QUEwMDAwMDQzMTAyNDI0ODQwMDAxQUVFMjA0RTRBRUU0MDRGMEI4Cis6MTA3QUIwMDA4RjQyMDIzQzAwODIyMDJCMTQ4MDAwQjAwMDAwMDAwMEE2Cis6MTA3QUMwMDA4RjgzMDEyMDI3NjIzODAwMjQ2NjAwMjAwMEMyMTAyQjFCCis6MTA3QUQwMDA1MDQwMDAwMTI3NjYzMDAwOEY4MjAxMjgxMEMyMDAwNDQ4Cis6MTA3QUUwMDAwMDAwMDAwMDhGODIwMTI0MTRDMjAwMDcwMDAwMDAwMDgzCis6MTA3QUYwMDA4RUUyMDFBNDAwMDA4MDIxMjQ0MjAwMDFBRUUyMDFBNDM0Cis6MTA3QjAwMDAwODAwMkYwNzhFRTIwMUE0OEVFMjA0RTRBQzYyMDAxQ0EwCis6MTA3QjEwMDA4RUU0MDRCMDhFRTUwNEI0MjQ2MjAwMUNBQzYyMDAwODVDCis6MTA3QjIwMDAyNDAyMDAwOEE0NjIwMDBFMjQwMjAwMTFBQzYyMDAxOEI2Cis6MTA3QjMwMDBBQzY0MDAwMEFDNjUwMDA0OEVFMjA0QzRBQzYyMDAxMENBCis6MTA3QjQwMDBBRjg2MDEyMDkyRTI0RTIwMTQ0MDAwMzcyNDEwMDAwMTNECis6MTA3QjUwMDA4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzgwMkUyMjAyMTUyCis6MTA3QjYwMDA4QzgzMDAwMDI0MDIwMDEyMTQ2MjAwMUYwMDAwMDAwMDM5Cis6MTA3QjcwMDA4RUUzNEUzMDhFRTI0RTM0MTA2MjAwMUIyNDBDMDA0MDI3Cis6MTA3QjgwMDA4QzgyMDAwNDI0NDIwMDAxQUM4MjAwMDQ4RUUyNEUzNDU4Cis6MTA3QjkwMDA4RUUzNEUzMDI0NDIwMDAxMTA0QzAwMDcwMDAwMDAwMDJDCis6MTA3QkEwMDA4RUUyNEUzNDI0NDIwMDAxMTA2MjAwMDUwMDAwMDAwMDA1Cis6MTA3QkIwMDAwODAwMkVGMTAwMDAwMDAwMTQ2MDAwMDUwMDAwMDAwMDI1Cis6MTA3QkMwMDA4RjgyMDEyODI0NDIwMDIwQUY4MjAxMjg4RjgyMDEyODYxCis6MTA3QkQwMDA4QzgyMDAwNDJDNDIwMDExNTA0MDAwMTNBQzgwMDAwMDQ1Cis6MTA3QkUwMDAwODAwMkYwNzAwMDAwMDAwOEVFMjRFMzAyNDBDMDA0MEY5Cis6MTA3QkYwMDAyNDQyMDAwMTUwNEMwMDAzMDAwMDEwMjE4RUUyNEUzMDYwCis6MTA3QzAwMDAyNDQyMDAwMUFFRTI0RTMwOEVFMjRFMzAwMDAyMTBDMDNGCis6MTA3QzEwMDAyNDQyNTAzODAyRTIyMDIxMjQwMjAwMTIyNDBDMDAwMUU4Cis6MTA3QzIwMDBBQzgyMDAwMEFDOEMwMDA0NTYwMDAwMEQyNDEwMDAwMTUyCis6MTA3QzMwMDA4RUUyMDRFNDNDMDQwMDAxMjQ4NDU3NTRBRkEwMDAxNEY1Cis6MTA3QzQwMDBBRkEyMDAxMDhFRTYwNjA4OEY0NzAyMjgzQzA1MDAwOTA3Cis6MTA3QzUwMDAzNEE1RjAwNjBDMDAyNDAzQUZBQjAwMzg4RkFCMDAzODFFCis6MTA3QzYwMDAxNjAwMDAwMzI0MEMwMDAxMDgwMDJGNUNBMkVDMDRGNEIxCis6MTA3QzcwMDA4RUUyMDE3MDI0NDIwMDAxQUVFMjAxNzA4RUUyMDE3MERBCis6MTA3QzgwMDA4RUUyMDRFNEEyRTAwNEY0QUVFMDA0RjBBRUUwNzI3NDJDCis6MTA3QzkwMDBBRUUyMDRGODhGNDIwMjNDMTA0MDAwMzgwMDAwMDAwMEMxCis6MTA3Q0EwMDA4RUUyMDE4NDI0NDIwMDAxQUVFMjAxODQwODAwMkY1Q0QwCis6MTA3Q0IwMDA4RUUyMDE4NDhFRTIwNTA0MjQwQzAwNDAyNDQyMDAwMTdGCis6MTA3Q0MwMDA1MDRDMDAwMzAwMDAxMDIxOEVFMjA1MDQyNDQyMDAwMTA0Cis6MTA3Q0QwMDBBRUUyMDUwNDhFRTIwNTA0OEU2MzAwMTgyNDBDMDAwMzU2Cis6MTA3Q0UwMDAwMDAyMTA4MDAwNTcxMDIxMTQ2QzAwMEY4QzQ0MDUwODBFCis6MTA3Q0YwMDAzQzAyMDAwMTAwNTcxMDIxOTA0MjgzQjExMDQwMDAxNDUzCis6MTA3RDAwMDAwMDAwMDAwMDhFRTIwMUQwOEVFMzUyNDAwMDQ0MTAyMUJBCis6MTA3RDEwMDBBRUUyMDFEMDhFRTIwMUQ4MDA2NDE4MjEzMDYzMDBGRjhBCis6MTA3RDIwMDAwODAwMkY0RkFFRTM1MjQwOEVFMjAxQ0M4RUUzMEUxMERFCis6MTA3RDMwMDAwMDQ0MTAyMUFFRTIwMUNDOEVFMjAxRDgwMDY0MTgyMThCCis6MTA3RDQwMDAzMDYzMDFGRkFFRTMwRTEwMDA0NDEwMjFBRUUyMDFEODEzCis6MTA3RDUwMDA4RUUyMDAwMDM0NDIwMDQwMDgwMDJGNUNBRUUyMDAwMERBCis6MTA3RDYwMDA4RUUyMDE0QzNDMDEwMDAxMDAzNzA4MjFBMDIwODNFMDk1Cis6MTA3RDcwMDAyNDQyMDAwMUFFRTIwMTRDOEVFMjAxNEM4RjgyMDEwOEU4Cis6MTA3RDgwMDAyNDQyMDAyMEFGODIwMTA4OEY4MjAxMDg4RjgyMDEwOEZGCis6MTA3RDkwMDAyNzYzMzAwMDAwNDMxMDJCMTQ0MDAwMDIyNzYyMjgwMEE0Cis6MTA3REEwMDBBRjgyMDEwODhGODMwMTA4OEY4MjAxMDQxNDYyRkMxRUQ4Cis6MTA3REIwMDAwMDAwMDAwMDhGQkYwMDYwOEZCRTAwNUM4RkI2MDA1OENGCis6MTA3REMwMDA4RkI1MDA1NDhGQjQwMDUwOEZCMzAwNEM4RkIyMDA0ODcxCis6MTA3REQwMDA4RkIxMDA0NDhGQjAwMDQwMDNFMDAwMDgyN0JEMDA2ODY5Cis6MTA3REUwMDAwMDA1Mjg0MzEwQTAwMDBEMDAwMDMwMjEzQzAzMDAwMUQ1Cis6MTA3REYwMDAzNDYzMzgwMDNDMDdGRkZGMDM2MzEwMjEwMDgyMTAyQjFGCis6MTA3RTAwMDA1MDQwMDAwMTAwODcyMDIxOTQ4MjAwMDAyNDg0MDAwMjU5Cis6MTA3RTEwMDAyNEE1RkZGRjE0QTBGRkY4MDBDMjMwMjEwMDA2MUMwMkI5Cis6MTA3RTIwMDAzMEMyRkZGRjAwNjIzMDIxMDAwNjFDMDIzMEMyRkZGRjlCCis6MTA3RTMwMDAwMDYyMzAyMTAzRTAwMDA4MzBDMkZGRkYyN0JERkY4ODQ5Cis6MTA3RTQwMDAyNDBGMDAwMUFGQkYwMDcwQUZCRTAwNkNBRkI2MDA2ODdBCis6MTA3RTUwMDBBRkI1MDA2NEFGQjQwMDYwQUZCMzAwNUNBRkIyMDA1ODIwCis6MTA3RTYwMDBBRkIxMDA1NEFGQjAwMDUwQTNBMDAwMjdBRkFGMDAyQ0JCCis6MTA3RTcwMDA4RUUyMDRENDAwMDA4MDIxMzA0MjAwMDExNDQwMDAyQTI4Cis6MTA3RTgwMDBBM0EwMDAzNzhGODcwMEUwOEY4ODAwQzQ4RjgyMDBFOEFFCis6MTA3RTkwMDAwMEUyMjAyMzJDODIxMDAwNTA0MDAwMDEyNDg0MTAwMEI2Cis6MTA3RUEwMDAwMDA0MjBDMjAwODAxODIxOEVFNDAwQzg4RUU1MDBDQ0JBCis6MTA3RUIwMDAwMDAwMTAyMTAwQTMyODIxMDBBMzMwMkIwMDgyMjAyMUU0Cis6MTA3RUMwMDAwMDg2MjAyMUFFRTQwMEM4QUVFNTAwQ0M4RjgzMDBDODU4Cis6MTA3RUQwMDAzQzAyMDAwQTM0NDJFRkZGMDEwMzIwMjMwMDQ0MTAyQjMwCis6MTA3RUUwMDAxMDQwMDAwMzNDMDIwMDBBMzQ0MkYwMDAwMDgyMjAyMUNFCis6MTA3RUYwMDAwMDgwMTgyMThFRTQwMEMwOEVFNTAwQzQwMDAwMTAyMTJGCis6MTA3RjAwMDAwMEEzMjgyMTAwQTMzMDJCMDA4MjIwMjEwMDg2MjAyMUZECis6MTA3RjEwMDBBRUU0MDBDMEFFRTUwMEM0QUY4ODAwQzhBRjg3MDBFNDlGCis6MTA3RjIwMDAwODAwMzRDQ0FGODcwMEU4M0MwMjAwMDEwMDU3MTAyMTY0Cis6MTA3RjMwMDA5MDQyODNDMDEwNDAwMDBCMDAwMDAwMDAzQzE0MDAwMTgwCis6MTA3RjQwMDAwMjk3QTAyMThFOTQ4M0M0M0MxMzAwMDEwMjc3OTgyMUVDCis6MTA3RjUwMDA4RTczODNDODNDMTIwMDAxMDI1NzkwMjEwODAwMzE5M0IwCis6MTA3RjYwMDA4RTUyODNDQzhGODMwMEUwOEY4MjAwRTQxMDQzMDAwN0ExCis6MTA3RjcwMDAwMDAwODgyMThGODIwMEU0MjQxMTAwMDE4QzQzMDAwMDVFCis6MTA3RjgwMDA4QzQ0MDAwNEFGQTMwMDE4QUZBNDAwMUMxNjIwMDAwRTAwCis6MTA3RjkwMDAzQzAyRkZGRjhGODIwMEM0QUZBMjAwMTA4RjgyMDBDODk2Cis6MTA3RkEwMDAzQzA0MDAwMTI0ODQ1ODcwQUZBMjAwMTQ4Rjg2MDBFMEM2Cis6MTA3RkIwMDA4Rjg3MDBFNDNDMDUwMDA2MEMwMDI0MDMzNEE1RjAwMDg0Cis6MTA3RkMwMDAwODAwMzRDQzAwMDAwMDAwOEZBMzAwMUM4RkIyMDAxODAyCis6MTA3RkQwMDAzMDc0RkZGRjI2OTRGRkZDMDA2MjEwMjQxMDQwMDA1ODBDCis6MTA3RkUwMDAwMjQwOTgyMTNDMDIwMDgwMDA2MjEwMjQxMDQwMDAwQUU4Cis6MTA3RkYwMDAzQzA0MDA0MDhFRTIwMDdDMjQ0MjAwMDFBRUUyMDA3Q0EyCis6MTA4MDAwMDA4RUUyMDA3QzhFRTIwMUZDMjQ0MjAwMDFBRUUyMDFGQzIzCis6MTA4MDEwMDAwODAwMzRDNjhFRTIwMUZDM0MwNjAwMDQzQzBCMDAwMTYzCis6MTA4MDIwMDAzQzBBMDAwMjNDMDUwMDEwM0MwOTAwMDg4RUUyMDA4MDdBCis6MTA4MDMwMDAzQzA4MDAyMDM0MDc4MDAwMjQ0MjAwMDFBRUUyMDA4MEFBCis6MTA4MDQwMDA4RUUyMDA4MDhGQTIwMDFDMDA0NDE4MjQxMDY2MDAyMURDCis6MTA4MDUwMDAwMEMzMTAyQjE0NDAwMDA3MDAwMDAwMDAxMDZCMDAxMTNCCis6MTA4MDYwMDAwMDAwMDAwMDEwNkEwMDE1MDAwMDAwMDAwODAwMzA0OTAwCis6MTA4MDcwMDAwMDA0MjA0MjEwNjUwMDIzMDBBMzEwMkIxNDQwMDAwNUNCCis6MTA4MDgwMDAwMDAwMDAwMDEwNjkwMDE5MDAwMDAwMDAwODAwMzA0OURECis6MTA4MDkwMDAwMDA0MjA0MjEwNjgwMDIxMDAwMDAwMDAwODAwMzA0OTYwCis6MTA4MEEwMDAwMDA0MjA0MjhFRTIwMDM0MjQ0MjAwMDFBRUUyMDAzNDlCCis6MTA4MEIwMDA4RUUyMDAzNDA4MDAzMDQ5MDAwNDIwNDI4RUUyMDFFQ0Q4Cis6MTA4MEMwMDAyNDQyMDAwMUFFRTIwMUVDOEVFMjAxRUMwODAwMzA0OUVFCis6MTA4MEQwMDAwMDA0MjA0MjhFRTIwMUYwMjQ0MjAwMDFBRUUyMDFGMEYxCis6MTA4MEUwMDA4RUUyMDFGMDA4MDAzMDQ5MDAwNDIwNDI4RUUyMDFGNEUzCis6MTA4MEYwMDAyNDQyMDAwMUFFRTIwMUY0OEVFMjAxRjQwODAwMzA0OUFFCis6MTA4MTAwMDAwMDA0MjA0MjhFRTIwMDMwMjQ0MjAwMDFBRUUyMDAzMDQyCis6MTA4MTEwMDA4RUUyMDAzMDA4MDAzMDQ5MDAwNDIwNDI4RUUyMDFGODZGCis6MTA4MTIwMDAyNDQyMDAwMUFFRTIwMUY4OEVFMjAxRjgwMDA0MjA0MjkwCis6MTA4MTMwMDAxMDg3MDQ3QzAwMDAwMDAwMDgwMDMwMEUwMDAwMDAwMEUyCis6MTA4MTQwMDAzQzAyMDAwMTAwNTcxMDIxOTA0MjgzQjIxNDQwMDA4NDg5Cis6MTA4MTUwMDAyNDAyMDAwMTNDMDMwMDAxMDA3NzE4MjE5MDYzODNCM0RGCis6MTA4MTYwMDAxNDYyMDA3RjNDMDIwMTAwOEU0MzAwMDAwMDYyMTAyNDc0Cis6MTA4MTcwMDAxMDQwMDA2RjI0MDJGRkZGMTQ2MjAwMDUyNDEwMDAwMTZDCis6MTA4MTgwMDA5NjQzMDAwNDM0MDJGRkZGMTA2MjAwNzUwMDAwMDAwMEY3Cis6MTA4MTkwMDA5MkUyMDREODE0NDAwMDcyMDAwMDAwMDAzQzAyMDAwMThBCis6MTA4MUEwMDAwMDU3MTAyMThDNDI4M0I0Mjg0MjAwMDUxMDQwMDAyMDYzCis6MTA4MUIwMDAwMDAwMzgyMTNDMDIwMDAxMDA1NzEwMjE4QzQyODNCNDlBCis6MTA4MUMwMDAxODQwMDAxNjAwMDAyODIxOTY2NjAwMDAwMDA1MjBDMDE3Cis6MTA4MUQwMDAwMDk3MTAyMTk0NDI3NzdFMTQ0NjAwMDkwMDk3MTAyMUUxCis6MTA4MUUwMDA5NDQzNzc4MDk2NjIwMDAyMTQ2MjAwMDUwMDk3MTAyMTg0Cis6MTA4MUYwMDA5NDQzNzc4Mjk2NjIwMDA0NTA2MjAwMDgyNDA3MDAwMUNECis6MTA4MjAwMDAzQzAyMDAwMTAwNTcxMDIxOEM0MjgzQjQyNEE1MDAwMUQ4Cis6MTA4MjEwMDAwMEEyMTAyQTU0NDBGRkVFMDAwNTIwQzAzMEUyMDBGRjBCCis6MTA4MjIwMDAxMDQwMDQ0MDAwMDAwMDAwMDgwMDMwRDUwMDAwMDAwMEFECis6MTA4MjMwMDAwMjQwMjAyMTBDMDAyMkZFMjQwNTAwMDYzMDQ0MDAxRkNECis6MTA4MjQwMDAwMDA0MjhDMDAyRTUxMDIxOTQ0MjcyN0MzMDQyNDAwMEI0Cis6MTA4MjUwMDAxNDQwMDQzNDAwQjcxMDIxOTQ0MzcyN0U5NjYyMDAwMEVCCis6MTA4MjYwMDAxNDYyMDAwQjAwMDQxOEMwMDBCNzEwMjE5NDQzNzI4MDAwCis6MTA4MjcwMDA5NjYyMDAwMjE0NjIwMDA2MDAwNDE4QzAwMEI3MTAyMUM0Cis6MTA4MjgwMDA5NDQzNzI4Mjk2NjIwMDA0MTA2MjAwMzUwMDA0MThDMEE0Cis6MTA4MjkwMDAwMkUzMTAyMTk0NDI3MjdDMzA0MjgwMDAxNDQwMDQyMTk5Cis6MTA4MkEwMDAwMkUzMTAyMTk0NEI3MjdDOTY2NzAwMDAwMDBCMjhDMEZCCis6MTA4MkIwMDAwMEI3MTAyMTk0NDI3MzdFMDgwMDMwQjcwMDAwMzAyMUNGCis6MTA4MkMwMDAwMDA0MjBDMDAyRTQxMDIxOTQ0MzczN0MwMkU0MTAyMUQ2Cis6MTA4MkQwMDA5NDRCNzM3QzMwNjM4MDAwMTQ2MDAwMTAwMDBCMjhDMDQ2Cis6MTA4MkUwMDAwMEI3MTAyMTk0NDI3MzdFMTQ0N0ZGRjUwMTYwMjAyMUVFCis6MTA4MkYwMDAwMEI3MTAyMTk0NDM3MzgwOTY2MjAwMDI1NDYyRkZGMTJDCis6MTA4MzAwMDAwMDA0MjBDMDAwQjcxMDIxOTQ0MzczODI5NjYyMDAwNEQ5Cis6MTA4MzEwMDA1NDYyRkZFQzAwMDQyMEMwMjQwNjAwMDEzMEMyMDBGRkJDCis6MTA4MzIwMDAxMDQwMDQwMDAwMDAwMDAwMDgwMDMwRDUwMDAwMDAwMEVDCis6MTA4MzMwMDA5NzQzMDIwMjk2NDIwMDAwMTQ2MjAzRkEwMDAwMDAwMDE0Cis6MTA4MzQwMDA5NzQzMDIwNDk2NDIwMDAyMTQ2MjAzRjYwMDAwMDAwMDA0Cis6MTA4MzUwMDA5NzQzMDIwNjk2NDIwMDA0MTQ2MjAzRjIwMDAwMDAwMEY0Cis6MTA4MzYwMDA5MjQyMDAwMDNBMDMwMDAxMzA0MjAwMDEwMDQzMTAyNDExCis6MTA4MzcwMDAxMDQwMDA3NDI0MDJGRkZGOEU2MzAwMDAxNDYyMDAwNEFBCis6MTA4MzgwMDAzNDAyRkZGRjk2NjMwMDA0MTA2MjAwNkYyNDBGMDAwMkE2Cis6MTA4MzkwMDAzQzAyMDAwMTAwNTcxMDIxOTA0MjgzQjIxNDQwMDA2QTUxCis6MTA4M0EwMDAyNDBGMDAwMzkyRTIwNEQ4NTQ0MDAwNjhBRkFGMDAyQ0MxCis6MTA4M0IwMDAzQzAyMDAwMTAwNTcxMDIxOEM0MjgzQjQyODQyMDAwNTgyCis6MTA4M0MwMDAxMDQwMDAyMDAwMDAzODIxM0MwMjAwMDEwMDU3MTAyMTFECis6MTA4M0QwMDA4QzQyODNCNDE4NDAwMDE2MDAwMDI4MjE5NjY2MDAwMEU1Cis6MTA4M0UwMDAwMDA1MjBDMDAwOTcxMDIxOTQ0Mjc3N0UxNDQ2MDAwOUIyCis6MTA4M0YwMDAwMDk3MTAyMTk0NDM3NzgwOTY2MjAwMDIxNDYyMDAwNTcyCis6MTA4NDAwMDAwMDk3MTAyMTk0NDM3NzgyOTY2MjAwMDQ1MDYyMDAwODFFCis6MTA4NDEwMDAyNDA3MDAwMTNDMDIwMDAxMDA1NzEwMjE4QzQyODNCNDY0Cis6MTA4NDIwMDAyNEE1MDAwMTAwQTIxMDJBNTQ0MEZGRUUwMDA1MjBDMDQwCis6MTA4NDMwMDAzMEUyMDBGRjE0NDAwMDQ0MjQwRjAwMDMwODAwMzRDNjVCCis6MTA4NDQwMDAwMDAwMDAwMDAyNDAyMDIxMEMwMDIyRkUyNDA1MDAwNjRFCis6MTA4NDUwMDAzMDQ0MDAxRjAwMDQyOEMwMDJFNTEwMjE5NDQyNzI3Q0MxCis6MTA4NDYwMDAzMDQyNDAwMDE0NDAwM0FGMDBCNzEwMjE5NDQzNzI3RUE1Cis6MTA4NDcwMDA5NjYyMDAwMDE0NjIwMDBCMDAwNDE4QzAwMEI3MTAyMUJGCis6MTA4NDgwMDA5NDQzNzI4MDk2NjIwMDAyMTQ2MjAwMDYwMDA0MThDMEQxCis6MTA4NDkwMDAwMEI3MTAyMTk0NDM3MjgyOTY2MjAwMDQxMDYyMDAyNzk0Cis6MTA4NEEwMDAwMDA0MThDMDAyRTMxMDIxOTQ0MjcyN0MzMDQyODAwMDI0Cis6MTA4NEIwMDAxNDQwMDM5QzAyRTMxMDIxOTQ0QjcyN0M5NjY3MDAwMEU5Cis6MTA4NEMwMDAwMDBCMjhDMDAwQjcxMDIxOTQ0MjczN0UwODAwMzEzQzk1Cis6MTA4NEQwMDAwMDAwMzAyMTAwMDQyMEMwMDJFNDEwMjE5NDQzNzM3QzhBCis6MTA4NEUwMDAwMkU0MTAyMTk0NEI3MzdDMzA2MzgwMDAxNDYwMDAxMDEwCis6MTA4NEYwMDAwMDBCMjhDMDAwQjcxMDIxOTQ0MjczN0UxNDQ3RkZGNThCCis6MTA4NTAwMDAwMTYwMjAyMTAwQjcxMDIxOTQ0MzczODA5NjYyMDAwMjFECis6MTA4NTEwMDA1NDYyRkZGMTAwMDQyMEMwMDBCNzEwMjE5NDQzNzM4MjFECis6MTA4NTIwMDA5NjYyMDAwNDU0NjJGRkVDMDAwNDIwQzAyNDA2MDAwMTlGCis6MTA4NTMwMDAzMEMyMDBGRjEwNDAwMzdCMDAwMDAwMDAwODAwMzE0RkY0Cis6MTA4NTQwMDAyNDBGMDAwMzI0MEYwMDAxQUZBRjAwMkM4RjQyMDI2MDA0Cis6MTA4NTUwMDAwMDU0MTAyQjEwNDAwMDNBMDAwMDAwMDA4RjgzMDBFNDBDCis6MTA4NTYwMDA4RjgyMDBFMDEwNjIwMDAzMjQ2MzAwMDhBRjgzMDBFNDAwCis6MTA4NTcwMDBBRjgzMDBFODhFRTQwMEMwOEVFNTAwQzQwMjgwMTgyMUJECis6MTA4NTgwMDAwMDAwMTAyMTAwQTMyODIxMDBBMzMwMkIwMDgyMjAyMTBECis6MTA4NTkwMDAwMDg2MjAyMUFFRTQwMEMwQUVFNTAwQzQ4RUUyMDA1OEEzCis6MTA4NUEwMDAyNDQyMDAwMUFFRTIwMDU4OEVFMjAwNTg4RUUyMDA3Q0M4Cis6MTA4NUIwMDAyNDQyMDAwMUFFRTIwMDdDOEVFMjAwN0M4RjgyMDBFMDZCCis6MTA4NUMwMDBBRkEyMDAxMDhGODIwMEU0M0MwNDAwMDEyNDg0NTg3ODlDCis6MTA4NUQwMDBBRkEyMDAxNDhGQTYwMDE4OEZBNzAwMUMzQzA1MDAwNjUwCis6MTA4NUUwMDAwQzAwMjQwMzM0QTVGMDAzMDgwMDM0Q0MwMDAwMDAwMDg0Cis6MTA4NUYwMDA4RUUyNTI0MEFGQTIwMDEwOEVFMjUyNDQzQzA0MDAwMUQxCis6MTA4NjAwMDAyNDg0NTg4NEFGQTIwMDE0OEVFNjBFMTA4RUU3MEUxODU0Cis6MTA4NjEwMDAzQzA1MDAwNjBDMDAyNDAzMzRBNUYwMDI4RUUyMDFDMEU0Cis6MTA4NjIwMDAyNDQyMDAwMUFFRTIwMUMwOEVFMjAwMDA4RUUzMDFDMEYwCis6MTA4NjMwMDAyNDAzRkZCRjAwNDMxMDI0MDgwMDM0NzBBRUUyMDAwMEEyCis6MTA4NjQwMDA5NkUyMDQ2ODAwNTQxMDJCMTA0MDAwMDMwMDAwMDAwMDY0Cis6MTA4NjUwMDAyNDBGMDAwMUEzQUYwMDI3MTI4MDAzMDEyNDE2MDAwNzk2Cis6MTA4NjYwMDAyNDE1MDA0MDI0MUUwMDAxMjQwRTAwMTI4RUUyNzI0Q0RDCis6MTA4NjcwMDA4RjQzMDI4MDI0NDIwMDAxMzA0MjA3RkYxMDYyMDJEMzgwCis6MTA4NjgwMDAwMDAwMDAwMDkzQTIwMDI3MTA0MDAwMTQwMDAwMDAwMDJBCis6MTA4NjkwMDA4RUUzNTI0MDhFRTI1MjQ0MTA2MjAwMDkyNkVENTI0NEFECis6MTA4NkEwMDA4RUU2NTI0NDhFRTM1MjQ0MDAwMjExNDAyNDQyNTI0ODY2Cis6MTA4NkIwMDAwMkUyODAyMTI0NjMwMDAxMDgwMDMxQkYzMDZCMDBGRjFCCis6MTA4NkMwMDA5MkUyNzI0ODE0NDBGRkNBMDAwMDAwMDA4RUUyMDFFMDBFCis6MTA4NkQwMDAyNDQyMDAwMUFFRTIwMUUwOEVFMjAxRTA4RUUzMEUxMEUyCis6MTA4NkUwMDA4RUUyMEUxODEwNjJGRkMyMjZFRDBFMTg4RUU2MEUxOEVFCis6MTA4NkYwMDA4RUUzMEUxODAwMDIxMTQwMjQ0MjBFMjAwMkUyODAyMTc3Cis6MTA4NzAwMDAyNDYzMDAwMTMwNkIwMUZGOTZFMjA0NkEzMDQyMDAxMERFCis6MTA4NzEwMDAxMDQwMDAxOTAwMDAwMDAwOTY0MjAwMEMzNDBGODEwMDQ4Cis6MTA4NzIwMDAxNDRGMDAxNTAwMDAwMDAwM0MwMjAwMDEwMDU3MTAyMTBBCis6MTA4NzMwMDA5MDQyODNDMDE0NDAwMDEwMDAwMDAwMDA5NjQyMDAwRURBCis6MTA4NzQwMDBBNjAyMDAxNjhFNDIwMDA4OEU0MzAwMDQ4RTQ0MDAwMEVDCis6MTA4NzUwMDAyNjk0RkZGQ0FFNDIwMDBDQUU0MzAwMDhBRTQ0MDAwNDc5Cis6MTA4NzYwMDA5NjAyMDAwRTI2NzMwMDA0MjQwRjAwMDFBM0FGMDAzNzA5Cis6MTA4NzcwMDAzNDQyMDIwMEE2MDIwMDBFOEUwMjAwMDA4RTAzMDAwNEE2Cis6MTA4NzgwMDAzQzA0MDAwMTM0ODQzODAwMzA2QTAwMDcwMjZBOTgyM0YwCis6MTA4NzkwMDAwMzY0MTAyMTAyNjIxMDJCMTA0MDAwMDUwMjhBQTAyMTAwCis6MTA4N0EwMDAwMjY0MTAyMzAzNjIxODIzM0MwMjAwMjAwMDQzOTgyMzM0Cis6MTA4N0IwMDAyNjgyMDAwNzI0MDRGRkY4OTYwMzAwMEEwMDQ0NjAyNDgwCis6MTA4N0MwMDAwMDZBMTgyMTAwNkMxMDJCMTA0MDAwMDIwMTgwMzgyMTMzCis6MTA4N0QwMDAwMDYwMzgyMUFFMTMwMDE4OEY4ODAxMjAyNEUyMDAwN0MyCis6MTA4N0UwMDAwMDQ0MzgyNDI3NjIzODAwMjUwOTAwMjAwMTIyMTAyQjdDCis6MTA4N0YwMDA1MDQwMDAwMTI3NjkzMDAwOEY4MjAxMjgxMTIyMDAwNEI3Cis6MTA4ODAwMDAwMDAwMDAwMDhGODIwMTI0MTUyMjAwMDcwMTQwMTgyMTdBCis6MTA4ODEwMDA4RUUyMDFBNDAwMDA4ODIxMjQ0MjAwMDFBRUUyMDFBNEZFCis6MTA4ODIwMDAwODAwMzI0QzhFRTIwMUE0OEUwNDAwMDA4RTA1MDAwNDg0Cis6MTA4ODMwMDAwMDAwMTAyMUFEMTMwMDA4QTUwNzAwMEVBRDE2MDAxOEFBCis6MTA4ODQwMDBBRDA2MDAxQzAwQTMzMDJCMDBBMzI4MjMwMDgyMjAyM0E4Cis6MTA4ODUwMDAwMDg2MjAyM0FEMDQwMDAwQUQwNTAwMDQ4RUUyMDRDMEI0Cis6MTA4ODYwMDBBRDAyMDAxMEFGODkwMTIwOTJFMjRFMjAxNDQwMDAzMzg3Cis6MTA4ODcwMDAyNDExMDAwMThFRTI0RTMwMDAwMjEwQzAyNDQyNTAzODE0Cis6MTA4ODgwMDAwMkUyMjAyMThDODIwMDAwMTQ1NjAwMUYwMDAwMDAwMDJDCis6MTA4ODkwMDA4RUUzNEUzMDhFRTI0RTM0MTA2MjAwMUIwMDAwMDAwMDZBCis6MTA4OEEwMDA4QzgyMDAwNDI0NDIwMDAxQUM4MjAwMDQ4RUUyNEUzNDJCCis6MTA4OEIwMDA4RUUzNEUzMDI0NDIwMDAxMTA1NTAwMDcwMDAwMDAwMEY2Cis6MTA4OEMwMDA4RUUyNEUzNDI0NDIwMDAxMTA2MjAwMDUwMDAwMDAwMEQ4Cis6MTA4OEQwMDAwODAwMzIzOTAwMDAwMDAwMTQ2MDAwMDUwMDAwMDAwMEFDCis6MTA4OEUwMDA4RjgyMDEyODI0NDIwMDIwQUY4MjAxMjg4RjgyMDEyODM0Cis6MTA4OEYwMDA4QzgyMDAwNDJDNDIwMDExNTA0MDAwMTBBQzgwMDAwMDFCCis6MTA4OTAwMDAwODAwMzI0QzAwMDAwMDAwOEVFMjRFMzAyNDQyMDAwMThDCis6MTA4OTEwMDA1MDU1MDAwMzAwMDAxMDIxOEVFMjRFMzAyNDQyMDAwMTI5Cis6MTA4OTIwMDBBRUUyNEUzMDhFRTI0RTMwMDAwMjEwQzAyNDQyNTAzODhCCis6MTA4OTMwMDAwMkUyMjAyMUFDOTYwMDAwQUM5RTAwMDQxNjIwMDAxODM0Cis6MTA4OTQwMDAzQzA1MDAwNjhFMDIwMDE4M0MwNDAwMDEyNDg0NTg5MDY3Cis6MTA4OTUwMDBBRkEyMDAxMDhFMDIwMDAwOEUwMzAwMDQzNEE1RjAwOUJGCis6MTA4OTYwMDAwMjAwMzAyMTBDMDAyNDAzQUZBMzAwMTQ5M0EyMDAzN0FGCis6MTA4OTcwMDAxMDQwMDIxNjM0MEY4MTAwOEU0MjAwMDQ4RTQzMDAwODFFCis6MTA4OTgwMDA4RTQ0MDAwQ0E2NEYwMDBDQUU0MjAwMDBBRTQzMDAwNDIzCis6MTA4OTkwMDBBRTQ0MDAwODk2MDIwMDE2MDgwMDM0NzBBNjQyMDAwRThECis6MTA4OUEwMDAxNEVDMDE2ODAyOEExODIzOTYwQzAwMEE5NjAzMDAwRTQ0Cis6MTA4OUIwMDAwMjhBMTAyM0E2MDIwMDBBMzQ2MjAwMDRBNjAyMDAwRUY2Cis6MTA4OUMwMDA4Rjg4MDEyMDI3NjIzODAwMjUwOTAwMjAwMTIyMTAyQjAyCis6MTA4OUQwMDAxNDQwMDAwMjMwNkFGRkZGMjc2OTMwMDA4RjgyMDEyOEFGCis6MTA4OUUwMDAxMTIyMDAwNDAwMDAwMDAwOEY4MjAxMjQxNTIyMDAwN0RDCis6MTA4OUYwMDAyNDA0MDAyMDhFRTIwMUE0MDAwMDg4MjEyNDQyMDAwMTBBCis6MTA4QTAwMDBBRUUyMDFBNDA4MDAzMkNBOEVFMjAxQTQ4RUU1NzI0Q0U3Cis6MTA4QTEwMDA4RUU2MDQ5MDhFRTcwNDk0QTUwNDAwMEUyNDA0MDAwNDVFCis6MTA4QTIwMDBBRDEwMDAwOEFEMDQwMDE4MDAwNTI5NDAwMEEwMTgyMTcxCis6MTA4QTMwMDAwMDAwMTAyMTAwRTMzODIxMDBFMzIwMkIwMEMyMzAyMTg4Cis6MTA4QTQwMDAwMEM0MzAyMUFEMDYwMDAwQUQwNzAwMDQ4RUUyNzI0Qzc4Cis6MTA4QTUwMDBBRDAyMDAxQzhFRTIwNEM0QUQwMjAwMTBBRjg5MDEyMEZCCis6MTA4QTYwMDA5MkUyNEUyMDE0NDAwMDMzMjQxMTAwMDE4RUUyNEUzMDc5Cis6MTA4QTcwMDAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjE4QzgyMDAwMDAzCis6MTA4QTgwMDAxNDU2MDAxRjAwMDAwMDAwOEVFMzRFMzA4RUUyNEUzNDdDCis6MTA4QTkwMDAxMDYyMDAxQjAwMDAwMDAwOEM4MjAwMDQyNDQyMDAwMUQwCis6MTA4QUEwMDBBQzgyMDAwNDhFRTI0RTM0OEVFMzRFMzAyNDQyMDAwMTRDCis6MTA4QUIwMDAxMDU1MDAwNzAwMDAwMDAwOEVFMjRFMzQyNDQyMDAwMUYxCis6MTA4QUMwMDAxMDYyMDAwNTAwMDAwMDAwMDgwMDMyQjcwMDAwMDAwMDNFCis6MTA4QUQwMDAxNDYwMDAwNTAwMDAwMDAwOEY4MjAxMjgyNDQyMDAyMDVECis6MTA4QUUwMDBBRjgyMDEyODhGODIwMTI4OEM4MjAwMDQyQzQyMDAxMTYxCis6MTA4QUYwMDA1MDQwMDAxMEFDODAwMDAwMDgwMDMyQ0EwMDAwMDAwMEE2Cis6MTA4QjAwMDA4RUUyNEUzMDI0NDIwMDAxNTA1NTAwMDMwMDAwMTAyMTM3Cis6MTA4QjEwMDA4RUUyNEUzMDI0NDIwMDAxQUVFMjRFMzA4RUUyNEUzMDA0Cis6MTA4QjIwMDAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjFBQzk2MDAwMDFFCis6MTA4QjMwMDBBQzlFMDAwNDE2MjAwMDBEMDAwMDAwMDBBNjBDMDAwQUU4Cis6MTA4QjQwMDBBNjBBMDAwRThGODIwMTAwQUZBMjAwMTA4RjgyMDEwNERFCis6MTA4QjUwMDAzQzA0MDAwMTI0ODQ1ODlDM0MwNTAwMDZBRkEyMDAxNDhDCis6MTA4QjYwMDA4RUU2NzI0QzA4MDAzNDNCMzRBNUYwMEIzQzAxMDAwMTRBCis6MTA4QjcwMDAwMDM3MDgyMUEwMjA4M0MwQURBQjAwMDA4RUUyMDFEOEYxCis6MTA4QjgwMDA4RUUzNzI0QzI0NDJGRkZGQUVFMjAxRDg4RUUyMDFEOEEwCis6MTA4QjkwMDAyNDYzMDAwMTMwNjMwN0ZGMjZFMjUyNDQxNUEyMDAwNjU5Cis6MTA4QkEwMDBBRUUzNzI0QzhFRTIwMUQwMjQ0MkZGRkZBRUUyMDFEMDcwCis6MTA4QkIwMDAwODAwMzJFRjhFRTIwMUQwOEVFMjAxQ0MyNDQyRkZGRkFBCis6MTA4QkMwMDBBRUUyMDFDQzhFRTIwMUNDOEY0MjAyNDAxMDQwMDA3MzM1Cis6MTA4QkQwMDAwMDAwMDAwMDhFRTIwRTFDMjQ0MjAwMDFBRUUyMEUxQ0RBCis6MTA4QkUwMDA4RjQzMDI0MDAwNDMxMDJCMTQ0MDAxNzYwMDAwQTAyMTY3Cis6MTA4QkYwMDA4RjgzMDEyMDI3NjIzODAwMjQ2NjAwMjAwMEMyMTAyQkRBCis6MTA4QzAwMDA1MDQwMDAwMTI3NjYzMDAwOEY4MjAxMjgxMEMyMDAwNDA2Cis6MTA4QzEwMDAwMDAwMDAwMDhGODIwMTI0MTRDMjAwMDcwMDAwMDAwMDQxCis6MTA4QzIwMDA4RUUyMDFBNDAwMDA4ODIxMjQ0MjAwMDFBRUUyMDFBNEVBCis6MTA4QzMwMDAwODAwMzM0RjhFRTIwMUE0OEVFMjcyNENBQzYyMDAxQzNECis6MTA4QzQwMDA4RUU0MDRBODhFRTUwNEFDMjQ2MjAwMUNBQzYyMDAwODJCCis6MTA4QzUwMDAyNDAyMDAwOEE0NjIwMDBFMjQwMjAwMTFBQzYyMDAxODc1Cis6MTA4QzYwMDBBQzY0MDAwMEFDNjUwMDA0OEVFMjA0QzRBQzYyMDAxMDg5Cis6MTA4QzcwMDBBRjg2MDEyMDkyRTI0RTIwMTQ0MDAwMzMyNDExMDAwMUZGCis6MTA4QzgwMDA4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzgwMkUyMjAyMTExCis6MTA4QzkwMDA4QzgyMDAwMDE0NEUwMDFGMDAwMDAwMDA4RUUzNEUzMDU2Cis6MTA4Q0EwMDA4RUUyNEUzNDEwNjIwMDFCMDAwMDAwMDA4QzgyMDAwNDMzCis6MTA4Q0IwMDAyNDQyMDAwMUFDODIwMDA0OEVFMjRFMzQ4RUUzNEUzMDNBCis6MTA4Q0MwMDAyNDQyMDAwMTEwNTUwMDA3MDAwMDAwMDA4RUUyNEUzNERGCis6MTA4Q0QwMDAyNDQyMDAwMTEwNjIwMDA1MDAwMDAwMDAwODAwMzMzQzNGCis6MTA4Q0UwMDAwMDAwMDAwMDE0NjAwMDA1MDAwMDAwMDA4RjgyMDEyOEQxCis6MTA4Q0YwMDAyNDQyMDAyMEFGODIwMTI4OEY4MjAxMjg4QzgyMDAwNDQ4Cis6MTA4RDAwMDAyQzQyMDAxMTUwNDAwMDEwQUM4MDAwMDAwODAwMzM0RjhFCis6MTA4RDEwMDAwMDAwMDAwMDhFRTI0RTMwMjQ0MjAwMDE1MDU1MDAwMzU2Cis6MTA4RDIwMDAwMDAwMTAyMThFRTI0RTMwMjQ0MjAwMDFBRUUyNEUzMEFGCis6MTA4RDMwMDA4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzgwMkUyMjAyMTYwCis6MTA4RDQwMDBBQzhFMDAwMEFDOUUwMDA0NTYyMDAwMEQyNDExMDAwMUUyCis6MTA4RDUwMDA4RUUyNzI0QzNDMDQwMDAxMjQ4NDU4QThBRkEwMDAxNDk5Cis6MTA4RDYwMDBBRkEyMDAxMDhFRTY3MjRDOEY0NzAyODAzQzA1MDAwOUNFCis6MTA4RDcwMDAzNEE1RjAwODBDMDAyNDAzQUZBRTAwNDg4RkFFMDA0OEM1Cis6MTA4RDgwMDA1NjIwMDAwMUFFRTAwRTFDOEVFMjAxODgyNDQyMDAwMTU0Cis6MTA4RDkwMDBBRUUyMDE4ODA4MDAzM0M4OEVFMjAxODg4RjgzMDEyMDhCCis6MTA4REEwMDAyNzYyMzgwMDI0NjYwMDIwMDBDMjEwMkI1MDQwMDAwMUNBCis6MTA4REIwMDAyNzY2MzAwMDhGODIwMTI4MTBDMjAwMDQwMDAwMDAwMEU2Cis6MTA4REMwMDA4RjgyMDEyNDE0QzIwMDA3MDAwMDAwMDA4RUUyMDFBNDdCCis6MTA4REQwMDAwMDAwODgyMTI0NDIwMDAxQUVFMjAxQTQwODAwMzNCQTU5Cis6MTA4REUwMDA4RUUyMDFBNDhFRTI3MjRDQUM2MjAwMUM4RUU0MDRBOEY4Cis6MTA4REYwMDA4RUU1MDRBQzI0NjIwMDFDQUM2MjAwMDgyNDAyMDAwODZBCis6MTA4RTAwMDBBNDYyMDAwRTI0MDIwMDExQUM2MjAwMThBQzY0MDAwMEUxCis6MTA4RTEwMDBBQzY1MDAwNDhFRTIwNEM0QUM2MjAwMTBBRjg2MDEyMDkxCis6MTA4RTIwMDA5MkUyNEUyMDE0NDAwMDMzMjQxMTAwMDE4RUUyNEUzMEI1Cis6MTA4RTMwMDAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjE4QzgyMDAwMDNGCis6MTA4RTQwMDAxNDRFMDAxRjAwMDAwMDAwOEVFMzRFMzA4RUUyNEUzNEMwCis6MTA4RTUwMDAxMDYyMDAxQjAwMDAwMDAwOEM4MjAwMDQyNDQyMDAwMTBDCis6MTA4RTYwMDBBQzgyMDAwNDhFRTI0RTM0OEVFMzRFMzAyNDQyMDAwMTg4Cis6MTA4RTcwMDAxMDU1MDAwNzAwMDAwMDAwOEVFMjRFMzQyNDQyMDAwMTJECis6MTA4RTgwMDAxMDYyMDAwNTAwMDAwMDAwMDgwMDMzQTcwMDAwMDAwMDg5Cis6MTA4RTkwMDAxNDYwMDAwNTAwMDAwMDAwOEY4MjAxMjgyNDQyMDAyMDk5Cis6MTA4RUEwMDBBRjgyMDEyODhGODIwMTI4OEM4MjAwMDQyQzQyMDAxMTlECis6MTA4RUIwMDA1MDQwMDAxMEFDODAwMDAwMDgwMDMzQkEwMDAwMDAwMEYxCis6MTA4RUMwMDA4RUUyNEUzMDI0NDIwMDAxNTA1NTAwMDMwMDAwMTAyMTc0Cis6MTA4RUQwMDA4RUUyNEUzMDI0NDIwMDAxQUVFMjRFMzA4RUUyNEUzMDQxCis6MTA4RUUwMDAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjFBQzhFMDAwMDYzCis6MTA4RUYwMDBBQzlFMDAwNDE2MjAwMDBEMDAwMDAwMDA4RUUyNzI0Q0IzCis6MTA4RjAwMDAzQzA0MDAwMTI0ODQ1OEE4QUZBMDAwMTRBRkEyMDAxMEI0Cis6MTA4RjEwMDA4RUU2NzI0QzhGNDcwMjgwM0MwNTAwMDkzNEE1RjAwOEFDCis6MTA4RjIwMDAwQzAwMjQwM0FGQUUwMDQ4OEZBRTAwNDg4RUUyMDE3NEZGCis6MTA4RjMwMDAyNDQyMDAwMUFFRTIwMTc0OEVFMjAxNzQwODAwMzQ2RTM2Cis6MTA4RjQwMDAwMDAwQTAyMTk2MEMwMDBBMDE4MzEwMkI1NDQwMDAwMTYwCis6MTA4RjUwMDAwMTgwMTgyMUE2MDMwMDBBOEY4ODAxMjAyNzYyMzgwMEFCCis6MTA4RjYwMDAyNTA5MDAyMDAxMjIxMDJCNTA0MDAwMDEyNzY5MzAwMDA0Cis6MTA4RjcwMDA4RjgyMDEyODExMjIwMDA0MDAwMDAwMDA4RjgyMDEyNDRBCis6MTA4RjgwMDAxNTIyMDAwNzI0MDQwMDIwOEVFMjAxQTQwMDAwODgyMTlECis6MTA4RjkwMDAyNDQyMDAwMUFFRTIwMUE0MDgwMDM0MkY4RUUyMDFBNEI1Cis6MTA4RkEwMDA4RUU1NzI0QzhFRTYwNDkwOEVFNzA0OTRBNTA0MDAwRUM0Cis6MTA4RkIwMDAyNDA0MDAwNEFEMTAwMDA4QUQwNDAwMTgwMDA1Mjk0MDg5Cis6MTA4RkMwMDAwMEEwMTgyMTAwMDAxMDIxMDBFMzM4MjEwMEUzMjAyQjJECis6MTA4RkQwMDAwMEMyMzAyMTAwQzQzMDIxQUQwNjAwMDBBRDA3MDAwNEZFCis6MTA4RkUwMDA4RUUyNzI0Q0FEMDIwMDFDOEVFMjA0QzRBRDAyMDAxMDkxCis6MTA4RkYwMDBBRjg5MDEyMDkyRTI0RTIwMTQ0MDAwMzMyNDExMDAwMTc5Cis6MTA5MDAwMDA4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzgwMkUyMjAyMThECis6MTA5MDEwMDA4QzgyMDAwMDE0NTYwMDFGMDAwMDAwMDA4RUUzNEUzMENBCis6MTA5MDIwMDA4RUUyNEUzNDEwNjIwMDFCMDAwMDAwMDA4QzgyMDAwNEFGCis6MTA5MDMwMDAyNDQyMDAwMUFDODIwMDA0OEVFMjRFMzQ4RUUzNEUzMEI2Cis6MTA5MDQwMDAyNDQyMDAwMTEwNTUwMDA3MDAwMDAwMDA4RUUyNEUzNDVCCis6MTA5MDUwMDAyNDQyMDAwMTEwNjIwMDA1MDAwMDAwMDAwODAwMzQxQ0RBCis6MTA5MDYwMDAwMDAwMDAwMDE0NjAwMDA1MDAwMDAwMDA4RjgyMDEyODRECis6MTA5MDcwMDAyNDQyMDAyMEFGODIwMTI4OEY4MjAxMjg4QzgyMDAwNEM0Cis6MTA5MDgwMDAyQzQyMDAxMTUwNDAwMDEwQUM4MDAwMDAwODAwMzQyRjJBCis6MTA5MDkwMDAwMDAwMDAwMDhFRTI0RTMwMjQ0MjAwMDE1MDU1MDAwM0QzCis6MTA5MEEwMDAwMDAwMTAyMThFRTI0RTMwMjQ0MjAwMDFBRUUyNEUzMDJDCis6MTA5MEIwMDA4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzgwMkUyMjAyMURECis6MTA5MEMwMDBBQzk2MDAwMEFDOUUwMDA0MTYyMDAwMUQwMDAwMDAwMEJECis6MTA5MEQwMDBBNjBDMDAwQThGODIwMTAwQUZBMjAwMTA4RjgyMDEwNDRCCis6MTA5MEUwMDAzQzA0MDAwMTI0ODQ1ODlDM0MwNTAwMDZBRkEyMDAxNEY3Cis6MTA5MEYwMDA4RUU2NzI0QzM0QTVGMDBEMEMwMDI0MDMwMjAwMzgyMURBCis6MTA5MTAwMDA5M0EyMDAzNzEwNDAwMDMxMzQwRjgxMDA4RTQyMDAwNERBCis6MTA5MTEwMDA4RTQzMDAwODhFNDQwMDBDQTY0RjAwMENBRTQyMDAwMEE3Cis6MTA5MTIwMDBBRTQzMDAwNEFFNDQwMDA4OTYwMjAwMTZBNjQyMDAwRUFDCis6MTA5MTMwMDA5NjAyMDAwRTMwNDJGREZGMDgwMDM0NzBBNjAyMDAwRUI5Cis6MTA5MTQwMDA4RUUyMDFEODI0NDJGRkZGQUVFMjAxRDg4RUUyMDFEOEMwCis6MTA5MTUwMDA4RUUyMDFDQzNDMDQwMDFGM0MwMTAwMDEwMDM3MDgyMUQ1Cis6MTA5MTYwMDBBMDNFODNDMDI0NDJGRkZGQUVFMjAxQ0M5NjAzMDAwQTdBCis6MTA5MTcwMDAzNDg0RkZGRjhFRTIwMUNDMDA2QTE4MjEwMjYzOTgyMTNCCis6MTA5MTgwMDAwMDkzMjAyQjEwODAwMDAzM0MwMkZGRjUzNDQyMTAwMEI2Cis6MTA5MTkwMDAwMjYyOTgyMUFEQUIwMDAwOEVFMjcyNEMyNDQyMDAwMUM1Cis6MTA5MUEwMDAzMDQyMDdGRkFFRTI3MjRDOEY0MjAyNDAxMDQwMDAwNDkyCis6MTA5MUIwMDAwMjgzQTAyMzhFRTIwRTFDMjQ0MjAwMDFBRUUyMEUxQ0FDCis6MTA5MUMwMDBBM0EwMDAyNzE2ODBGRDI5MDAwMDAwMDAxMjgwMDAyNEMzCis6MTA5MUQwMDAwMDAwMDAwMDNDMDEwMDAxMDAzNzA4MjFBQzM0ODNDNENBCis6MTA5MUUwMDAzQzAxMDAwMTAwMzcwODIxQUMzMzgzQzgzQzAxMDAwMTc5Cis6MTA5MUYwMDAwMDM3MDgyMUFDMzI4M0NDOTNBMjAwMzcxMDQwMDAwODFFCis6MTA5MjAwMDAwMDAwMDAwMDNDMDIwMDAxMDA1NzEwMjE4QzQyODNDQzdBCis6MTA5MjEwMDAyNDQyMDAwNDNDMDEwMDAxMDAzNzA4MjFBQzIyODNDQzI5Cis6MTA5MjIwMDA4RUUyNzI0QzhGNDMwMjgwMjQ0MjAwMDEzMDQyMDdGRkRECis6MTA5MjMwMDAxNDYyMDAwNjAwMDAwMDAwOEVFMjAxQzQyNDQyMDAwMTE2Cis6MTA5MjQwMDBBRUUyMDFDNDA4MDAzNENDOEVFMjAxQzQ4RUUyMDFCQzVGCis6MTA5MjUwMDAyNDQyMDAwMUFFRTIwMUJDMDgwMDM0Q0M4RUUyMDFCQzI1Cis6MTA5MjYwMDA5N0E0MDAxRTI0ODRGRkZDMDA4MDE4MjE4RUU0MDBDMDE3Cis6MTA5MjcwMDA4RUU1MDBDNDAwMDAxMDIxMDBBMzI4MjEwMEEzMzAyQjlDCis6MTA5MjgwMDAwMDgyMjAyMTAwODYyMDIxQUVFNDAwQzBBRUU1MDBDNEFCCis6MTA5MjkwMDA4RkFGMDAyQzI0MDIwMDAyMTFFMjAwMEYyOUUyMDAwMzJDCis6MTA5MkEwMDAxNDQwMDAxNzI0MDIwMDAzMTVFMjAwMTUwMDAwMDAwMDFFCis6MTA5MkIwMDA4RUUyMDBEMDhFRTMwMEQ0MjQ2MzAwMDEyQzY0MDAwMTEwCis6MTA5MkMwMDAwMDQ0MTAyMUFFRTIwMEQwQUVFMzAwRDQ4RUUyMDBEMDI0Cis6MTA5MkQwMDAwODAwMzRDNjhFRTMwMEQ0OEVFMjAwRDg4RUUzMDBEQ0IyCis6MTA5MkUwMDAyNDYzMDAwMTJDNjQwMDAxMDA0NDEwMjFBRUUyMDBEODg4Cis6MTA5MkYwMDBBRUUzMDBEQzhFRTIwMEQ4MDgwMDM0QzY4RUUzMDBEQzZBCis6MTA5MzAwMDA4RUUyMDBDODhFRTMwMENDMjQ2MzAwMDEyQzY0MDAwMUNGCis6MTA5MzEwMDAwMDQ0MTAyMUFFRTIwMEM4QUVFMzAwQ0M4RUUyMDBDOEVCCis6MTA5MzIwMDA4RUUzMDBDQzhGODMwMEU0OEY4MjAwRTAxMDYyMDAwM0E0Cis6MTA5MzMwMDAyNDYzMDAwOEFGODMwMEU0QUY4MzAwRTg4RkJGMDA3MEIwCis6MTA5MzQwMDA4RkJFMDA2QzhGQjYwMDY4OEZCNTAwNjQ4RkI0MDA2MDZDCis6MTA5MzUwMDA4RkIzMDA1QzhGQjIwMDU4OEZCMTAwNTQ4RkIwMDA1MEIzCis6MTA5MzYwMDAwM0UwMDAwODI3QkQwMDc4MjdCREZGQjBBRkI1MDA0NDdCCis6MTA5MzcwMDAwMDAwQTgyMUFGQjAwMDMwMDAwMDgwMjFBRkJGMDA0QzNBCis6MTA5MzgwMDBBRkI2MDA0OEFGQjQwMDQwQUZCMzAwM0NBRkIyMDAzODU2Cis6MTA5MzkwMDBBRkIxMDAzNDhFRTIwNEQ0MjQxNDAwMDEzMDQyMDAwMTQ1Cis6MTA5M0EwMDAxNDQwMDAyQTAwMDBCMDIxOEY4NzAwRTA4Rjg4MDBDNDlECis6MTA5M0IwMDA4RjgyMDBFODAwRTIyMDIzMkM4MjEwMDA1MDQwMDAwMTQwCis6MTA5M0MwMDAyNDg0MTAwMDAwMDQyMEMyMDA4MDE4MjE4RUU0MDBDODBDCis6MTA5M0QwMDA4RUU1MDBDQzAwMDAxMDIxMDBBMzI4MjEwMEEzMzAyQjMzCis6MTA5M0UwMDAwMDgyMjAyMTAwODYyMDIxQUVFNDAwQzhBRUU1MDBDQzNBCis6MTA5M0YwMDA4RjgzMDBDODNDMDIwMDBBMzQ0MkVGRkYwMTAzMjAyM0EwCis6MTA5NDAwMDAwMDQ0MTAyQjEwNDAwMDAzM0MwMjAwMEEzNDQyRjAwMERDCis6MTA5NDEwMDAwMDgyMjAyMTAwODAxODIxOEVFNDAwQzA4RUU1MDBDNDY3Cis6MTA5NDIwMDAwMDAwMTAyMTAwQTMyODIxMDBBMzMwMkIwMDgyMjAyMTVFCis6MTA5NDMwMDAwMDg2MjAyMUFFRTQwMEMwQUVFNTAwQzRBRjg4MDBDOEJECis6MTA5NDQwMDBBRjg3MDBFNDA4MDAzODUwQUY4NzAwRTgzQzAyMDAwMTE1Cis6MTA5NDUwMDAwMDU3MTAyMTkwNDI4M0MwMTA0MDAwMEIwMDAwMDAwMDE0Cis6MTA5NDYwMDAzQzEzMDAwMTAyNzc5ODIxOEU3MzgzQzQzQzExMDAwMUU0Cis6MTA5NDcwMDAwMjM3ODgyMThFMzE4M0M4M0MxMjAwMDEwMjU3OTAyMUE3Cis6MTA5NDgwMDAwODAwMzZFODhFNTI4M0NDOEY4MzAwRTA4RjgyMDBFNEEwCis6MTA5NDkwMDAxMDQzMDAwNzAwMDA0ODIxOEY4MjAwRTQyNDA5MDAwMUU2Cis6MTA5NEEwMDA4QzQzMDAwMDhDNDQwMDA0QUZBMzAwMThBRkE0MDAxQzQwCis6MTA5NEIwMDAxNTIwMDAwRTNDMDJGRkZGOEY4MjAwQzRBRkEyMDAxMEY3Cis6MTA5NEMwMDA4RjgyMDBDODNDMDQwMDAxMjQ4NDU4NzBBRkEyMDAxNEFECis6MTA5NEQwMDA4Rjg2MDBFMDhGODcwMEU0M0MwNTAwMDYwQzAwMjQwMzIzCis6MTA5NEUwMDAzNEE1RjAwMDA4MDAzODUwMDAwMDAwMDA4RkEzMDAxQ0Q1Cis6MTA5NEYwMDA4RkIyMDAxODMwNzNGRkZGMjY3M0ZGRkMwMDYyMTAyNDQ4Cis6MTA5NTAwMDAxMDQwMDA1ODAyNDA4ODIxM0MwMjAwODAwMDYyMTAyNDc0Cis6MTA5NTEwMDAxMDQwMDAwQTNDMDQwMDQwOEVFMjAwN0MyNDQyMDAwMTFFCis6MTA5NTIwMDBBRUUyMDA3QzhFRTIwMDdDOEVFMjAxRkMyNDQyMDAwMTZGCis6MTA5NTMwMDBBRUUyMDFGQzA4MDAzODRBOEVFMjAxRkMzQzA2MDAwNDYxCis6MTA5NTQwMDAzQzBCMDAwMTNDMEEwMDAyM0MwNTAwMTAzQzA5MDAwOEVECis6MTA5NTUwMDA4RUUyMDA4MDNDMDgwMDIwMzQwNzgwMDAyNDQyMDAwMTk1Cis6MTA5NTYwMDBBRUUyMDA4MDhFRTIwMDgwOEZBMjAwMUMwMDQ0MTgyNDJFCis6MTA5NTcwMDAxMDY2MDAyMTAwQzMxMDJCMTQ0MDAwMDcwMDAwMDAwMEZCCis6MTA5NTgwMDAxMDZCMDAxMTAwMDAwMDAwMTA2QTAwMTUwMDAwMDAwMEMwCis6MTA5NTkwMDAwODAwMzU5MjAwMDQyMDQyMTA2NTAwMjMwMEEzMTAyQjIwCis6MTA5NUEwMDAxNDQwMDAwNTAwMDAwMDAwMTA2OTAwMTkwMDAwMDAwMEQwCis6MTA5NUIwMDAwODAwMzU5MjAwMDQyMDQyMTA2ODAwMjEwMDAwMDAwMERECis6MTA5NUMwMDAwODAwMzU5MjAwMDQyMDQyOEVFMjAwMzQyNDQyMDAwMTVCCis6MTA5NUQwMDBBRUUyMDAzNDhFRTIwMDM0MDgwMDM1OTIwMDA0MjA0MkVFCis6MTA5NUUwMDA4RUUyMDFFQzI0NDIwMDAxQUVFMjAxRUM4RUUyMDFFQ0RECis6MTA5NUYwMDAwODAwMzU5MjAwMDQyMDQyOEVFMjAxRjAyNDQyMDAwMTZFCis6MTA5NjAwMDBBRUUyMDFGMDhFRTIwMUYwMDgwMDM1OTIwMDA0MjA0MjQzCis6MTA5NjEwMDA4RUUyMDFGNDI0NDIwMDAxQUVFMjAxRjQ4RUUyMDFGNDk0Cis6MTA5NjIwMDAwODAwMzU5MjAwMDQyMDQyOEVFMjAwMzAyNDQyMDAwMUZFCis6MTA5NjMwMDBBRUUyMDAzMDhFRTIwMDMwMDgwMDM1OTIwMDA0MjA0Mjk1Cis6MTA5NjQwMDA4RUUyMDFGODI0NDIwMDAxQUVFMjAxRjg4RUUyMDFGODU4Cis6MTA5NjUwMDAwMDA0MjA0MjEwODcwMkI3MDAwMDAwMDAwODAwMzU1N0MwCis6MTA5NjYwMDAwMDAwMDAwMDNDMDIwMDAxMDA1NzEwMjE5MDQyODNCMjJDCis6MTA5NjcwMDAxNDQwMDA4NDI0MDIwMDAxM0MwMzAwMDEwMDc3MTgyMUZCCis6MTA5NjgwMDA5MDYzODNCMzE0NjIwMDdGM0MwMjAxMDA4RTQzMDAwMEFDCis6MTA5NjkwMDAwMDYyMTAyNDEwNDAwMDZGMjQwMkZGRkYxNDYyMDAwNUQ2Cis6MTA5NkEwMDAyNDEwMDAwMTk2NDMwMDA0MzQwMkZGRkYxMDYyMDA3NThECis6MTA5NkIwMDAwMDAwMDAwMDkyRTIwNEQ4MTQ0MDAwNzIwMDAwMDAwMDk0Cis6MTA5NkMwMDAzQzAyMDAwMTAwNTcxMDIxOEM0MjgzQjQyODQyMDAwNTVGCis6MTA5NkQwMDAxMDQwMDAyMDAwMDAzODIxM0MwMjAwMDEwMDU3MTAyMUZBCis6MTA5NkUwMDA4QzQyODNCNDE4NDAwMDE2MDAwMDI4MjE5NjI2MDAwMDAyCis6MTA5NkYwMDAwMDA1MjBDMDAwOTcxMDIxOTQ0Mjc3N0UxNDQ2MDAwOThGCis6MTA5NzAwMDAwMDk3MTAyMTk0NDM3NzgwOTYyMjAwMDIxNDYyMDAwNThFCis6MTA5NzEwMDAwMDk3MTAyMTk0NDM3NzgyOTYyMjAwMDQ1MDYyMDAwODNCCis6MTA5NzIwMDAyNDA3MDAwMTNDMDIwMDAxMDA1NzEwMjE4QzQyODNCNDQxCis6MTA5NzMwMDAyNEE1MDAwMTAwQTIxMDJBNTQ0MEZGRUUwMDA1MjBDMDFECis6MTA5NzQwMDAzMEUyMDBGRjEwNDAwMjdCMDAwMDAwMDAwODAwMzYxRURGCis6MTA5NzUwMDAwMDAwMDAwMDAyNDAyMDIxMEMwMDIyRkUyNDA1MDAwNjJCCis6MTA5NzYwMDAzMDQ0MDAxRjAwMDQyOEMwMDJFNTEwMjE5NDQyNzI3QzlFCis6MTA5NzcwMDAzMDQyNDAwMDE0NDAwMjZGMDBCNzEwMjE5NDQzNzI3RUMzCis6MTA5NzgwMDA5NjIyMDAwMDE0NjIwMDBCMDAwNDE4QzAwMEI3MTAyMURDCis6MTA5NzkwMDA5NDQzNzI4MDk2MjIwMDAyMTQ2MjAwMDYwMDA0MThDMEVFCis6MTA5N0EwMDAwMEI3MTAyMTk0NDM3MjgyOTYyMjAwMDQxMDYyMDAzNUEzCis6MTA5N0IwMDAwMDA0MThDMDAyRTMxMDIxOTQ0MjcyN0MzMDQyODAwMDAxCis6MTA5N0MwMDAxNDQwMDI1QzAyRTMxMDIxOTQ0ODcyN0M5NjI3MDAwMDRBCis6MTA5N0QwMDAwMDA4MjhDMDAwQjcxMDIxOTQ0MjczN0UwODAwMzYwMEFDCis6MTA5N0UwMDAwMDAwMzAyMTAwMDQyMEMwMDJFNDEwMjE5NDQzNzM3QzY3Cis6MTA5N0YwMDAwMkU0MTAyMTk0NDg3MzdDMzA2MzgwMDAxNDYwMDAxMEYwCis6MTA5ODAwMDAwMDA4MjhDMDAwQjcxMDIxOTQ0MjczN0UxNDQ3RkZGNTZBCis6MTA5ODEwMDAwMTAwMjAyMTAwQjcxMDIxOTQ0MzczODA5NjIyMDAwMjlBCis6MTA5ODIwMDA1NDYyRkZGMTAwMDQyMEMwMDBCNzEwMjE5NDQzNzM4MkZBCis6MTA5ODMwMDA5NjIyMDAwNDU0NjJGRkVDMDAwNDIwQzAyNDA2MDAwMUJDCis6MTA5ODQwMDAzMEMyMDBGRjEwNDAwMjNCMDAwMDAwMDAwODAwMzYxRTNFCis6MTA5ODUwMDAwMDAwMDAwMDk3NDMwMjAyOTY0MjAwMDAxNDYyMDIzNUE1Cis6MTA5ODYwMDAwMDAwMDAwMDk3NDMwMjA0OTY0MjAwMDIxNDYyMDIzMTk1Cis6MTA5ODcwMDAwMDAwMDAwMDk3NDMwMjA2OTY0MjAwMDQxNDYyMDIyRDg1Cis6MTA5ODgwMDAwMDAwMDAwMDkyNDIwMDAwM0EwMzAwMDEzMDQyMDAwMTUzCis6MTA5ODkwMDAwMDQzMTAyNDEwNDAwMDc0MjQwMkZGRkY4RTIzMDAwMEI4Cis6MTA5OEEwMDAxNDYyMDAwNDM0MDJGRkZGOTYyMzAwMDQxMDYyMDA2RjZDCis6MTA5OEIwMDAyNDE0MDAwMjNDMDIwMDAxMDA1NzEwMjE5MDQyODNCMkEwCis6MTA5OEMwMDAxNDQwMDA2QTI0MTQwMDAzOTJFMjA0RDgxNDQwMDA2Nzk0Cis6MTA5OEQwMDAwMDAwMDAwMDNDMDIwMDAxMDA1NzEwMjE4QzQyODNCNEJDCis6MTA5OEUwMDAyODQyMDAwNTEwNDAwMDIwMDAwMDM4MjEzQzAyMDAwMTAxCis6MTA5OEYwMDAwMDU3MTAyMThDNDI4M0I0MTg0MDAwMTYwMDAwMjgyMTI0Cis6MTA5OTAwMDA5NjI2MDAwMDAwMDUyMEMwMDA5NzEwMjE5NDQyNzc3RTIzCis6MTA5OTEwMDAxNDQ2MDAwOTAwOTcxMDIxOTQ0Mzc3ODA5NjIyMDAwMjk0Cis6MTA5OTIwMDAxNDYyMDAwNTAwOTcxMDIxOTQ0Mzc3ODI5NjIyMDAwNDY4Cis6MTA5OTMwMDA1MDYyMDAwODI0MDcwMDAxM0MwMjAwMDEwMDU3MTAyMTdBCis6MTA5OTQwMDA4QzQyODNCNDI0QTUwMDAxMDBBMjEwMkE1NDQwRkZFRUVCCis6MTA5OTUwMDAwMDA1MjBDMDMwRTIwMEZGMTQ0MDAwNDQyNDE0MDAwMzNFCis6MTA5OTYwMDAwODAwMzg0QTAwMDAwMDAwMDI0MDIwMjEwQzAwMjJGRUJFCis6MTA5OTcwMDAyNDA1MDAwNjMwNDQwMDFGMDAwNDI4QzAwMkU1MTAyMTIxCis6MTA5OTgwMDA5NDQyNzI3QzMwNDI0MDAwMTQ0MDAxRUEwMEI3MTAyMTNBCis6MTA5OTkwMDA5NDQzNzI3RTk2MjIwMDAwMTQ2MjAwMEIwMDA0MThDMEVCCis6MTA5OUEwMDAwMEI3MTAyMTk0NDM3MjgwOTYyMjAwMDIxNDYyMDAwNkQwCis6MTA5OUIwMDAwMDA0MThDMDAwQjcxMDIxOTQ0MzcyODI5NjIyMDAwNDVDCis6MTA5OUMwMDAxMDYyMDAyNzAwMDQxOEMwMDJFMzEwMjE5NDQyNzI3QzQ4Cis6MTA5OUQwMDAzMDQyODAwMDE0NDAwMUQ3MDJFMzEwMjE5NDQ4NzI3Qzg5Cis6MTA5OUUwMDA5NjI3MDAwMDAwMDgyOEMwMDBCNzEwMjE5NDQyNzM3RTFCCis6MTA5OUYwMDAwODAwMzY4NTAwMDAzMDIxMDAwNDIwQzAwMkU0MTAyMTU4Cis6MTA5QTAwMDA5NDQzNzM3QzAyRTQxMDIxOTQ0ODczN0MzMDYzODAwMDlCCis6MTA5QTEwMDAxNDYwMDAxMDAwMDgyOEMwMDBCNzEwMjE5NDQyNzM3RTIzCis6MTA5QTIwMDAxNDQ3RkZGNTAxMDAyMDIxMDBCNzEwMjE5NDQzNzM4MEYzCis6MTA5QTMwMDA5NjIyMDAwMjU0NjJGRkYxMDAwNDIwQzAwMEI3MTAyMUZBCis6MTA5QTQwMDA5NDQzNzM4Mjk2MjIwMDA0NTQ2MkZGRUMwMDA0MjBDMDA5Cis6MTA5QTUwMDAyNDA2MDAwMTMwQzIwMEZGMTA0MDAxQjYwMDAwMDAwMEUzCis6MTA5QTYwMDAwODAwMzY5ODI0MTQwMDAzMjQxNDAwMDE4RjQyMDI2MDc5Cis6MTA5QTcwMDAwMDUzMTAyQjEwNDAwMDQ5MDAwMDAwMDA4RjgzMDBFNEM5Cis6MTA5QTgwMDA4RjgyMDBFMDEwNjIwMDAzMjQ2MzAwMDhBRjgzMDBFNENCCis6MTA5QTkwMDBBRjgzMDBFODhFRTQwMEMwOEVFNTAwQzQwMjYwMTgyMUE4Cis6MTA5QUEwMDAwMDAwMTAyMTAwQTMyODIxMDBBMzMwMkIwMDgyMjAyMUQ4Cis6MTA5QUIwMDAwMDg2MjAyMUFFRTQwMEMwQUVFNTAwQzQ4RUUyMDA1ODZFCis6MTA5QUMwMDAyNDQyMDAwMUFFRTIwMDU4OEVFMjAwNTg4RUUyMDA3QzkzCis6MTA5QUQwMDAyNDQyMDAwMUFFRTIwMDdDOEVFMjAwN0M4RjgyMDBFMDM2Cis6MTA5QUUwMDBBRkEyMDAxMDhGODIwMEU0M0MwNDAwMDEyNDg0NTg3ODY3Cis6MTA5QUYwMDBBRkEyMDAxNDhGQTYwMDE4OEZBNzAwMUMzQzA1MDAwNjFCCis6MTA5QjAwMDAwQzAwMjQwMzM0QTVGMDAzMDgwMDM4NTAwMDAwMDAwMEM2Cis6MTA5QjEwMDA4RUUyNTI0MEFGQTIwMDEwOEVFMjUyNDQzQzA0MDAwMTlCCis6MTA5QjIwMDAyNDg0NTg4NEFGQTIwMDE0OEVFNjBFMTA4RUU3MEUxODFGCis6MTA5QjMwMDAwQzAwMjQwMzM0QTVGMDAyOEVFMjAxQzAyNDQyMDAwMThGCis6MTA5QjQwMDBBRUUyMDFDMDhFRTIwMDAwOEVFMzAxQzAyNDAzRkZCRjNECis6MTA5QjUwMDAwMDQzMTAyNDA4MDAzN0Y4QUVFMjAwMDA4RUUyNTI0MEM1Cis6MTA5QjYwMDBBRkEyMDAxMDhFRTI1MjQ0M0MwNDAwMDEyNDg0NTg4NEM5Cis6MTA5QjcwMDBBRkEyMDAxNDhFRTYwRTEwOEVFNzBFMTgzQzA1MDAwNjBDCis6MTA5QjgwMDAwQzAwMjQwMzM0QTVGMDAyOEVFMjAxQzAyNDQyMDAwMTNGCis6MTA5QjkwMDBBRUUyMDFDMDA4MDAzN0Y4OEVFMjAxQzA5NkUyMDQ2ODI4Cis6MTA5QkEwMDAwMDUzMTAyQjU0NDAwMDAxM0MxNTgwMDAxMjYwMDEzMTFECis6MTA5QkIwMDAzQzBDMDAxRjM1OENGRkZGOEVFMjcyNEM4RjQzMDI4MEZECis6MTA5QkMwMDAyNDQyMDAwMTMwNDIwN0ZGMTA2MjAxMDgwMDAwMDAwMDNCCis6MTA5QkQwMDAxMkEwMDAxNDAwMDAwMDAwOEVFMzUyNDA4RUUyNTI0NEI2Cis6MTA5QkUwMDAxMDYyMDAwOTI2RUU1MjQ0OEVFQjUyNDQ4RUUzNTI0NDNBCis6MTA5QkYwMDAwMDAyMTE0MDI0NDI1MjQ4MDJFMjgwMjEyNDYzMDAwMTA1Cis6MTA5QzAwMDAwODAwMzcxMjMwNjgwMEZGOTJFMjcyNDgxNDQwRkZDMDJCCis6MTA5QzEwMDAzQzA1MDAwNjhFRTIwMUUwMjQ0MjAwMDFBRUUyMDFFMEQ0Cis6MTA5QzIwMDA4RUUyMDFFMDhFRTMwRTEwOEVFMjBFMTgxMDYyRkZDQjgyCis6MTA5QzMwMDAyNkVFMEUxODhFRUIwRTE4MDAwMEE4MjE4RUUzMEUxOEVCCis6MTA5QzQwMDAwMDAyMTE0MDI0NDIwRTIwMDJFMjgwMjEyNDYzMDAwMTIwCis6MTA5QzUwMDAzMDY4MDFGRjk2RTIwNDZBMzA0MjAwMTAxMDQwMDAxNzlECis6MTA5QzYwMDAzNDAyODEwMDk2NDMwMDBDMTQ2MjAwMTQwMDAwMDAwMENFCis6MTA5QzcwMDAzQzAyMDAwMTAwNTcxMDIxOTA0MjgzQzAxNDQwMDAwRkE1Cis6MTA5QzgwMDAwMDAwMDAwMDk2NDIwMDBFQTYwMjAwMTY4RTQyMDAwODU4Cis6MTA5QzkwMDA4RTQzMDAwNDhFNDQwMDAwMjY3M0ZGRkNBRTQyMDAwQzhECis6MTA5Q0EwMDBBRTQzMDAwOEFFNDQwMDA0OTYwMjAwMEUyNjMxMDAwNEM0Cis6MTA5Q0IwMDAyNDE2MDAwMTM0NDIwMjAwQTYwMjAwMEU5NjAzMDAwQTk4Cis6MTA5Q0MwMDAwMjYwNTAyMTAwNzMxMDJCMTA0MDAwMDIwMjYwNjgyMUQ2Cis6MTA5Q0QwMDAwMDYwNTAyMTJENDIwMDNEMTA0MDAwMkEwMDAwMzgyMTM0Cis6MTA5Q0UwMDA5NjIzMDAwQzI0MDIwODAwNTQ2MjAwMjdBRTExMDAxOENECis6MTA5Q0YwMDAzQzAyMDAwMTAwNTcxMDIxOTA0MjgzQzA1NDQwMDAyMkQyCis6MTA5RDAwMDBBRTExMDAxODI2MjIwMDE3MDE4MjEwMkIxMDQwMDAxM0ZDCis6MTA5RDEwMDAwMDAwMDAwMDNDMDJGRkY1MDA1MTEwMjE5MDQyMTAxNzk2Cis6MTA5RDIwMDAzODQzMDAwNjJDNjMwMDAxMzg0MjAwMTEyQzQyMDAwMTI4Cis6MTA5RDMwMDAwMDYyMTgyNTEwNjAwMDEzMjYyMjAwMTAwMTgyMTAyQkVCCis6MTA5RDQwMDAxMDQwMDAwRTAwMDAwMDAwM0MwN0ZGRjUwMEYxMzgyMTM0Cis6MTA5RDUwMDA5NEU3MTAxMDA4MDAzNzVFMjRFNzAwMEU5MjIyMDAxN0U3Cis6MTA5RDYwMDAzODQzMDAwNjJDNjMwMDAxMzg0MjAwMTEyQzQyMDAwMUU4Cis6MTA5RDcwMDAwMDYyMTgyNTUwNjAwMDA0QUUxMTAwMTg5NjI3MDAxMEVDCis6MTA5RDgwMDAyNEU3MDAwRUFFMTEwMDE4M0MwMjAwMDEwMDU3MTAyMTFDCis6MTA5RDkwMDA5MDQyODNDMDAwMDIxMDJCMTRFMDAwMDIwMDAyNEVDMDZCCis6MTA5REEwMDAwMTQwMzgyMThGODMwMTIwMjc2MjM4MDAyNDY2MDAyMDdCCis6MTA5REIwMDAwMEMyMTAyQjUwNDAwMDAxMjc2NjMwMDA4RjgyMDEyODFFCis6MTA5REMwMDAxMEMyMDAwNDAwMDAwMDAwOEY4MjAxMjQxNEMyMDAwN0FBCis6MTA5REQwMDAyNDAyMDAwQjhFRTIwMUE0MDAwMDQ4MjEyNDQyMDAwMTZECis6MTA5REUwMDBBRUUyMDFBNDA4MDAzN0JGOEVFMjAxQTQ4RTA0MDAwMDk5Cis6MTA5REYwMDA4RTA1MDAwNEFDNjIwMDE4MDE3NTEwMjUwMDQ5MTAyNTdECis6MTA5RTAwMDBBQzcxMDAwOEE0NjcwMDBFQUM2MjAwMUNBQzY0MDAwMERBCis6MTA5RTEwMDBBQzY1MDAwNDhFRTIwNEMwQUM2MjAwMTBBRjg2MDEyMDg1Cis6MTA5RTIwMDA5MkUyNEUyMDE0NDAwMDM4MjQwOTAwMDE4RUUyNEUzMEE4Cis6MTA5RTMwMDAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjE4QzgzMDAwMDJFCis6MTA5RTQwMDAyNDAyMDAwNzE0NjIwMDIwMDAwMDAwMDA4RUUzNEUzMDYwCis6MTA5RTUwMDA4RUUyNEUzNDEwNjIwMDFDMDAwMDAwMDA4QzgyMDAwNDcwCis6MTA5RTYwMDAyNDQyMDAwMUFDODIwMDA0OEVFMzRFMzQ4RUU1NEUzMDc1Cis6MTA5RTcwMDAyNDAyMDA0MDI0NjMwMDAxMTA2MjAwMDcwMDAwMDAwMDdCCis6MTA5RTgwMDA4RUUyNEUzNDI0NDIwMDAxMTBBMjAwMDUwMDAwMDAwMEMyCis6MTA5RTkwMDAwODAwMzdBOTAwMDAwMDAwMTRBMDAwMDUwMDAwMDAwMDIxCis6MTA5RUEwMDA4RjgyMDEyODI0NDIwMDIwQUY4MjAxMjg4RjgyMDEyODVFCis6MTA5RUIwMDA4QzgyMDAwNDJDNDIwMDExNTA0MDAwMTNBQzgwMDAwMDQyCis6MTA5RUMwMDAwODAwMzdCRjAwMDAwMDAwOEVFMjRFMzAyNDAzMDA0MDNGCis6MTA5RUQwMDAyNDQyMDAwMTUwNDMwMDAzMDAwMDEwMjE4RUUyNEUzMDY2Cis6MTA5RUUwMDAyNDQyMDAwMUFFRTI0RTMwOEVFMjRFMzAwMDAyMTBDMDNECis6MTA5RUYwMDAyNDQyNTAzODAyRTIyMDIxMjQwMjAwMDdBQzgyMDAwMEY0Cis6MTA5RjAwMDAyNDAyMDAwMUFDODIwMDA0MTUyMDAwMTgzQzA1MDAwNjY0Cis6MTA5RjEwMDA4RTAyMDAxODNDMDQwMDAxMjQ4NDU4OTBBRkEyMDAxMDY3Cis6MTA5RjIwMDA4RTAyMDAwMDhFMDMwMDA0MzRBNUYwMDkwMjAwMzAyMUU3Cis6MTA5RjMwMDAwQzAwMjQwM0FGQTMwMDE0MzJDMjAwRkYxMDQwMDAyQjFBCis6MTA5RjQwMDAzNDAyODEwMDhFNDMwMDA0OEU0NDAwMDg4RTQ1MDAwQ0NDCis6MTA5RjUwMDBBNjQyMDAwQ0FFNDMwMDAwQUU0NDAwMDRBRTQ1MDAwODJCCis6MTA5RjYwMDA5NjAyMDAxNjA4MDAzN0Y4QTY0MjAwMEUxNTREMDAwQUFBCis6MTA5RjcwMDAwMDAwMDAwMDk2MDIwMDBFQTYxMzAwMEEzNDQyMDAwNEZFCis6MTA5RjgwMDBBNjAyMDAwRTNDMDEwMDAxMDAzNzA4MjFBMDIwODNDMDdBCis6MTA5RjkwMDAwODAwMzdGNjAwMDA5ODIxOTYwNDAwMEEwMDkzMTAyQjYxCis6MTA5RkEwMDAxMDQwMDAwMjAyNjAxODIxMDA4MDE4MjEyNDAyMDAwMUU0Cis6MTA5RkIwMDBBNjAzMDAwQTNDMDEwMDAxMDAzNzA4MjFBMDIyODNDMDRCCis6MTA5RkMwMDA5NjA0MDAwQTAyMjQ4ODIxMDE5MTEwMkIxMDQwMDAwM0ZFCis6MTA5RkQwMDAzQzAyRkZGNTM0NDIxMDAwMDIyMjg4MjEwMjY0OTgyM0RCCis6MTA5RkUwMDAwMDAwQTgyMTE2NjBGRUY0QURDODAwMDAxMjYwMDAyMTM4Cis6MTA5RkYwMDAzMkMyMDBGRjNDMDEwMDAxMDAzNzA4MjFBQzMzODNDNEFBCis6MTBBMDAwMDAzQzAxMDAwMTAwMzcwODIxQUMzMTgzQzgzQzAxMDAwMTRDCis6MTBBMDEwMDAwMDM3MDgyMTEwNDAwMDA4QUMzMjgzQ0MzQzAyMDAwMTFDCis6MTBBMDIwMDAwMDU3MTAyMThDNDI4M0NDMjQ0MjAwMDQzQzAxMDAwMUUzCis6MTBBMDMwMDAwMDM3MDgyMUFDMjI4M0NDOEVFMjcyNEM4RjQzMDI4MDIxCis6MTBBMDQwMDAyNDQyMDAwMTE0NjIwMDA2MDAwMDAwMDA4RUUyMDFDNEY4Cis6MTBBMDUwMDAyNDQyMDAwMUFFRTIwMUM0MDgwMDM4NTA4RUUyMDFDNDdGCis6MTBBMDYwMDA4RUUyMDFCQzI0NDIwMDAxQUVFMjAxQkMwODAwMzg1MDdGCis6MTBBMDcwMDA4RUUyMDFCQzk3QTQwMDFFMjQ4NEZGRkMwMDgwMTgyMUZFCis6MTBBMDgwMDA4RUU0MDBDMDhFRTUwMEM0MDAwMDEwMjEwMEEzMjgyMTRBCis6MTBBMDkwMDAwMEEzMzAyQjAwODIyMDIxMDA4NjIwMjEyNDAyMDAwMjEwCis6MTBBMEEwMDBBRUU0MDBDMEFFRTUwMEM0MTI4MjAwMEYyQTgyMDAwM0I1Cis6MTBBMEIwMDAxNDQwMDAxNzI0MDIwMDAzMTY4MjAwMTUwMDAwMDAwMDVGCis6MTBBMEMwMDA4RUUyMDBEMDhFRTMwMEQ0MjQ2MzAwMDEyQzY0MDAwMUYyCis6MTBBMEQwMDAwMDQ0MTAyMUFFRTIwMEQwQUVFMzAwRDQ4RUUyMDBEMDA2Cis6MTBBMEUwMDAwODAwMzg0QThFRTMwMEQ0OEVFMjAwRDg4RUUzMDBEQzBDCis6MTBBMEYwMDAyNDYzMDAwMTJDNjQwMDAxMDA0NDEwMjFBRUUyMDBEODZBCis6MTBBMTAwMDBBRUUzMDBEQzhFRTIwMEQ4MDgwMDM4NEE4RUUzMDBEQ0MzCis6MTBBMTEwMDA4RUUyMDBDODhFRTMwMENDMjQ2MzAwMDEyQzY0MDAwMUIxCis6MTBBMTIwMDAwMDQ0MTAyMUFFRTIwMEM4QUVFMzAwQ0M4RUUyMDBDOENECis6MTBBMTMwMDA4RUUzMDBDQzhGODMwMEU0OEY4MjAwRTAxMDYyMDAwMzg2Cis6MTBBMTQwMDAyNDYzMDAwOEFGODMwMEU0QUY4MzAwRTg4RkJGMDA0Q0I2Cis6MTBBMTUwMDA4RkI2MDA0ODhGQjUwMDQ0OEZCNDAwNDA4RkIzMDAzQ0U5Cis6MTBBMTYwMDA4RkIyMDAzODhGQjEwMDM0OEZCMDAwMzAwM0UwMDAwOEE4Cis6MTBBMTcwMDAyN0JEMDA1MDI3QkRGRjkwQUZCNjAwNjAwMDAwQjAyMUEyCis6MTBBMTgwMDBBRkJGMDA2OEFGQkUwMDY0QUZCNTAwNUNBRkI0MDA1OEFECis6MTBBMTkwMDBBRkIzMDA1NEFGQjIwMDUwQUZCMTAwNENBRkIwMDA0ODA1Cis6MTBBMUEwMDA4RUUyMDRENDAwMDA4ODIxMjQxNTAwMDEzMDQyMDAwMTExCis6MTBBMUIwMDAxNDQwMDAyQUEzQTAwMDJGOEY4NzAwRTA4Rjg4MDBDNERFCis6MTBBMUMwMDA4RjgyMDBFODAwRTIyMDIzMkM4MjEwMDA1MDQwMDAwMTIyCis6MTBBMUQwMDAyNDg0MTAwMDAwMDQyMEMyMDA4MDE4MjE4RUU0MDBDOEVFCis6MTBBMUUwMDA4RUU1MDBDQzAwMDAxMDIxMDBBMzI4MjEwMEEzMzAyQjE1Cis6MTBBMUYwMDAwMDgyMjAyMTAwODYyMDIxQUVFNDAwQzhBRUU1MDBDQzFDCis6MTBBMjAwMDA4RjgzMDBDODNDMDIwMDBBMzQ0MkVGRkYwMTAzMjAyMzgxCis6MTBBMjEwMDAwMDQ0MTAyQjEwNDAwMDAzM0MwMjAwMEEzNDQyRjAwMEJFCis6MTBBMjIwMDAwMDgyMjAyMTAwODAxODIxOEVFNDAwQzA4RUU1MDBDNDQ5Cis6MTBBMjMwMDAwMDAwMTAyMTAwQTMyODIxMDBBMzMwMkIwMDgyMjAyMTQwCis6MTBBMjQwMDAwMDg2MjAyMUFFRTQwMEMwQUVFNTAwQzRBRjg4MDBDODlGCis6MTBBMjUwMDBBRjg3MDBFNDA4MDAzQzVCQUY4NzAwRTgzQzAyMDAwMUU4Cis6MTBBMjYwMDAwMDU3MTAyMTkwNDI4M0MwMTA0MDAwMEIwMDAwMDAwMEY2Cis6MTBBMjcwMDAzQzEzMDAwMTAyNzc5ODIxOEU3MzgzQzQzQzEwMDAwMUM3Cis6MTBBMjgwMDAwMjE3ODAyMThFMTA4M0M4M0MxMjAwMDEwMjU3OTAyMUQyCis6MTBBMjkwMDAwODAwM0E1OThFNTI4M0NDOEY4MzAwRTA4RjgyMDBFNDBECis6MTBBMkEwMDAxMDQzMDAwNzAwMDAzODIxOEY4MjAwRTQyNDA3MDAwMURBCis6MTBBMkIwMDA4QzQzMDAwMDhDNDQwMDA0QUZBMzAwMThBRkE0MDAxQzIyCis6MTBBMkMwMDAxNEUwMDAwRTNDMDJGRkZGOEY4MjAwQzRBRkEyMDAxMDFBCis6MTBBMkQwMDA4RjgyMDBDODNDMDQwMDAxMjQ4NDU4QjRBRkEyMDAxNDRCCis6MTBBMkUwMDA4Rjg2MDBFMDhGODcwMEU0M0MwNTAwMDYwQzAwMjQwMzA1Cis6MTBBMkYwMDAzNEE1RjIwMDA4MDAzQzVCMDAwMDAwMDA4RkEzMDAxQ0E2Cis6MTBBMzAwMDA4RkIyMDAxODMwNzNGRkZGMjY3M0ZGRkMwMDYyMTAyNDI5Cis6MTBBMzEwMDAxMDQwMDA1ODAyNDA4MDIxM0MwMjAwODAwMDYyMTAyNDVFCis6MTBBMzIwMDAxMDQwMDAwQTNDMDQwMDQwOEVFMjAwN0MyNDQyMDAwMTAwCis6MTBBMzMwMDBBRUUyMDA3QzhFRTIwMDdDOEVFMjAxRkMyNDQyMDAwMTUxCis6MTBBMzQwMDBBRUUyMDFGQzA4MDAzQzU1OEVFMjAxRkMzQzA2MDAwNDM0Cis6MTBBMzUwMDAzQzBCMDAwMTNDMEEwMDAyM0MwNTAwMTAzQzA5MDAwOENGCis6MTBBMzYwMDA4RUUyMDA4MDNDMDgwMDIwMzQwNzgwMDAyNDQyMDAwMTc3Cis6MTBBMzcwMDBBRUUyMDA4MDhFRTIwMDgwOEZBMjAwMUMwMDQ0MTgyNDEwCis6MTBBMzgwMDAxMDY2MDAyMTAwQzMxMDJCMTQ0MDAwMDcwMDAwMDAwMERECis6MTBBMzkwMDAxMDZCMDAxMTAwMDAwMDAwMTA2QTAwMTUwMDAwMDAwMEEyCis6MTBBM0EwMDAwODAwMzkxNjAwMDQyMDQyMTA2NTAwMjMwMEEzMTAyQjdBCis6MTBBM0IwMDAxNDQwMDAwNTAwMDAwMDAwMTA2OTAwMTkwMDAwMDAwMEIyCis6MTBBM0MwMDAwODAwMzkxNjAwMDQyMDQyMTA2ODAwMjEwMDAwMDAwMDM3Cis6MTBBM0QwMDAwODAwMzkxNjAwMDQyMDQyOEVFMjAwMzQyNDQyMDAwMUI1Cis6MTBBM0UwMDBBRUUyMDAzNDhFRTIwMDM0MDgwMDM5MTYwMDA0MjA0MjQ4Cis6MTBBM0YwMDA4RUUyMDFFQzI0NDIwMDAxQUVFMjAxRUM4RUUyMDFFQ0JGCis6MTBBNDAwMDAwODAwMzkxNjAwMDQyMDQyOEVFMjAxRjAyNDQyMDAwMUM3Cis6MTBBNDEwMDBBRUUyMDFGMDhFRTIwMUYwMDgwMDM5MTYwMDA0MjA0MjlECis6MTBBNDIwMDA4RUUyMDFGNDI0NDIwMDAxQUVFMjAxRjQ4RUUyMDFGNDc2Cis6MTBBNDMwMDAwODAwMzkxNjAwMDQyMDQyOEVFMjAwMzAyNDQyMDAwMTU4Cis6MTBBNDQwMDBBRUUyMDAzMDhFRTIwMDMwMDgwMDM5MTYwMDA0MjA0MkVGCis6MTBBNDUwMDA4RUUyMDFGODI0NDIwMDAxQUVFMjAxRjg4RUUyMDFGODNBCis6MTBBNDYwMDAwMDA0MjA0MjEwODcwMzNFMDAwMDAwMDAwODAwMzhEQjkzCis6MTBBNDcwMDAwMDAwMDAwMDNDMDIwMDAxMDA1NzEwMjE5MDQyODNCMjBFCis6MTBBNDgwMDAxNDQwMDA4NDI0MDIwMDAxM0MwMzAwMDEwMDc3MTgyMURECis6MTBBNDkwMDA5MDYzODNCMzE0NjIwMDdGM0MwMjAxMDA4RTQzMDAwMDhFCis6MTBBNEEwMDAwMDYyMTAyNDEwNDAwMDZGMjQwMkZGRkYxNDYyMDAwNUI4Cis6MTBBNEIwMDAyNDExMDAwMTk2NDMwMDA0MzQwMkZGRkYxMDYyMDA3NTZFCis6MTBBNEMwMDAwMDAwMDAwMDkyRTIwNEQ4MTQ0MDAwNzIwMDAwMDAwMDc2Cis6MTBBNEQwMDAzQzAyMDAwMTAwNTcxMDIxOEM0MjgzQjQyODQyMDAwNTQxCis6MTBBNEUwMDAxMDQwMDAyMDAwMDAzODIxM0MwMjAwMDEwMDU3MTAyMURDCis6MTBBNEYwMDA4QzQyODNCNDE4NDAwMDE2MDAwMDI4MjE5NjA2MDAwMDA0Cis6MTBBNTAwMDAwMDA1MjBDMDAwOTcxMDIxOTQ0Mjc3N0UxNDQ2MDAwOTcwCis6MTBBNTEwMDAwMDk3MTAyMTk0NDM3NzgwOTYwMjAwMDIxNDYyMDAwNTkwCis6MTBBNTIwMDAwMDk3MTAyMTk0NDM3NzgyOTYwMjAwMDQ1MDYyMDAwODNECis6MTBBNTMwMDAyNDA3MDAwMTNDMDIwMDAxMDA1NzEwMjE4QzQyODNCNDIzCis6MTBBNTQwMDAyNEE1MDAwMTAwQTIxMDJBNTQ0MEZGRUUwMDA1MjBDMEZGCis6MTBBNTUwMDAzMEUyMDBGRjEwNDAwMzAyMDAwMDAwMDAwODAwMzlBMkIyCis6MTBBNTYwMDAwMDAwMDAwMDAyNDAyMDIxMEMwMDIyRkUyNDA1MDAwNjBECis6MTBBNTcwMDAzMDQ0MDAxRjAwMDQyOEMwMDJFNTEwMjE5NDQyNzI3QzgwCis6MTBBNTgwMDAzMDQyNDAwMDE0NDAwMkY2MDBCNzEwMjE5NDQzNzI3RTFFCis6MTBBNTkwMDA5NjAyMDAwMDE0NjIwMDBCMDAwNDE4QzAwMEI3MTAyMURFCis6MTBBNUEwMDA5NDQzNzI4MDk2MDIwMDAyMTQ2MjAwMDYwMDA0MThDMEYwCis6MTBBNUIwMDAwMEI3MTAyMTk0NDM3MjgyOTYwMjAwMDQxMDYyMDAzNUE1Cis6MTBBNUMwMDAwMDA0MThDMDAyRTMxMDIxOTQ0MjcyN0MzMDQyODAwMEUzCis6MTBBNUQwMDAxNDQwMDJFMzAyRTMxMDIxOTQ0RDcyN0M5NjA3MDAwMEMwCis6MTBBNUUwMDAwMDBEMjhDMDAwQjcxMDIxOTQ0MjczN0UwODAwMzk4NDAyCis6MTBBNUYwMDAwMDAwMzAyMTAwMDQyMEMwMDJFNDEwMjE5NDQzNzM3QzQ5Cis6MTBBNjAwMDAwMkU0MTAyMTk0NEQ3MzdDMzA2MzgwMDAxNDYwMDAxMENDCis6MTBBNjEwMDAwMDBEMjhDMDAwQjcxMDIxOTQ0MjczN0UxNDQ3RkZGNTQ3Cis6MTBBNjIwMDAwMUEwMjAyMTAwQjcxMDIxOTQ0MzczODA5NjAyMDAwMkZDCis6MTBBNjMwMDA1NDYyRkZGMTAwMDQyMEMwMDBCNzEwMjE5NDQzNzM4MkRDCis6MTBBNjQwMDA5NjAyMDAwNDU0NjJGRkVDMDAwNDIwQzAyNDA2MDAwMUJFCis6MTBBNjUwMDAzMEMyMDBGRjEwNDAwMkMyMDAwMDAwMDAwODAwMzlBMjEyCis6MTBBNjYwMDAwMDAwMDAwMDk3NDMwMjAyOTY0MjAwMDAxNDYyMDJCQzAwCis6MTBBNjcwMDAwMDAwMDAwMDk3NDMwMjA0OTY0MjAwMDIxNDYyMDJCOEYwCis6MTBBNjgwMDAwMDAwMDAwMDk3NDMwMjA2OTY0MjAwMDQxNDYyMDJCNEUwCis6MTBBNjkwMDAwMDAwMDAwMDkyNDIwMDAwM0EyMzAwMDEzMDQyMDAwMTE1Cis6MTBBNkEwMDAwMDQzMTAyNDEwNDAwMDc0MjQwMkZGRkY4RTAzMDAwMEJBCis6MTBBNkIwMDAxNDYyMDAwNDM0MDJGRkZGOTYwMzAwMDQxMDYyMDA2RjZFCis6MTBBNkMwMDAyNDE1MDAwMjNDMDIwMDAxMDA1NzEwMjE5MDQyODNCMjgxCis6MTBBNkQwMDAxNDQwMDA2QTI0MTUwMDAzOTJFMjA0RDgxNDQwMDA2Nzc1Cis6MTBBNkUwMDAwMDAwMDAwMDNDMDIwMDAxMDA1NzEwMjE4QzQyODNCNDlFCis6MTBBNkYwMDAyODQyMDAwNTEwNDAwMDIwMDAwMDM4MjEzQzAyMDAwMUUzCis6MTBBNzAwMDAwMDU3MTAyMThDNDI4M0I0MTg0MDAwMTYwMDAwMjgyMTA1Cis6MTBBNzEwMDA5NjA2MDAwMDAwMDUyMEMwMDA5NzEwMjE5NDQyNzc3RTI1Cis6MTBBNzIwMDAxNDQ2MDAwOTAwOTcxMDIxOTQ0Mzc3ODA5NjAyMDAwMjk2Cis6MTBBNzMwMDAxNDYyMDAwNTAwOTcxMDIxOTQ0Mzc3ODI5NjAyMDAwNDZBCis6MTBBNzQwMDA1MDYyMDAwODI0MDcwMDAxM0MwMjAwMDEwMDU3MTAyMTVDCis6MTBBNzUwMDA4QzQyODNCNDI0QTUwMDAxMDBBMjEwMkE1NDQwRkZFRUNECis6MTBBNzYwMDAwMDA1MjBDMDMwRTIwMEZGMTQ0MDAwNDQyNDE1MDAwMzFGCis6MTBBNzcwMDAwODAwM0M1NTAwMDAwMDAwMDI0MDIwMjEwQzAwMjJGRTkxCis6MTBBNzgwMDAyNDA1MDAwNjMwNDQwMDFGMDAwNDI4QzAwMkU1MTAyMTAzCis6MTBBNzkwMDA5NDQyNzI3QzMwNDI0MDAwMTQ0MDAyNzEwMEI3MTAyMTk0Cis6MTBBN0EwMDA5NDQzNzI3RTk2MDIwMDAwMTQ2MjAwMEIwMDA0MThDMEVECis6MTBBN0IwMDAwMEI3MTAyMTk0NDM3MjgwOTYwMjAwMDIxNDYyMDAwNkQyCis6MTBBN0MwMDAwMDA0MThDMDAwQjcxMDIxOTQ0MzcyODI5NjAyMDAwNDVFCis6MTBBN0QwMDAxMDYyMDAyNzAwMDQxOEMwMDJFMzEwMjE5NDQyNzI3QzJBCis6MTBBN0UwMDAzMDQyODAwMDE0NDAwMjVFMDJFMzEwMjE5NDRENzI3Q0RFCis6MTBBN0YwMDA5NjA3MDAwMDAwMEQyOEMwMDBCNzEwMjE5NDQyNzM3RTE4Cis6MTBBODAwMDAwODAwM0EwOTAwMDAzMDIxMDAwNDIwQzAwMkU0MTAyMUIxCis6MTBBODEwMDA5NDQzNzM3QzAyRTQxMDIxOTQ0RDczN0MzMDYzODAwMDc4Cis6MTBBODIwMDAxNDYwMDAxMDAwMEQyOEMwMDBCNzEwMjE5NDQyNzM3RTAwCis6MTBBODMwMDAxNDQ3RkZGNTAxQTAyMDIxMDBCNzEwMjE5NDQzNzM4MDM1Cis6MTBBODQwMDA5NjAyMDAwMjU0NjJGRkYxMDAwNDIwQzAwMEI3MTAyMUZDCis6MTBBODUwMDA5NDQzNzM4Mjk2MDIwMDA0NTQ2MkZGRUMwMDA0MjBDMDBCCis6MTBBODYwMDAyNDA2MDAwMTMwQzIwMEZGMTA0MDAyM0QwMDAwMDAwMDNECis6MTBBODcwMDAwODAwM0ExQzI0MTUwMDAzMjQxNTAwMDE4RjQyMDI2MEQxCis6MTBBODgwMDAwMDUzMTAyQjEwNDAwMDM2MDAwMDAwMDA4RjgzMDBFNEJFCis6MTBBODkwMDA4RjgyMDBFMDEwNjIwMDAzMjQ2MzAwMDhBRjgzMDBFNEFECis6MTBBOEEwMDBBRjgzMDBFODhFRTQwMEMwOEVFNTAwQzQwMjYwMTgyMThBCis6MTBBOEIwMDAwMDAwMTAyMTAwQTMyODIxMDBBMzMwMkIwMDgyMjAyMUJBCis6MTBBOEMwMDAwMDg2MjAyMUFFRTQwMEMwQUVFNTAwQzQ4RUUyMDA1ODUwCis6MTBBOEQwMDAyNDQyMDAwMUFFRTIwMDU4OEVFMjAwNTg4RUUyMDA3Qzc1Cis6MTBBOEUwMDAyNDQyMDAwMUFFRTIwMDdDOEVFMjAwN0M4RjgyMDBFMDE4Cis6MTBBOEYwMDBBRkEyMDAxMDhGODIwMEU0M0MwNDAwMDEyNDg0NThDMDAxCis6MTBBOTAwMDBBRkEyMDAxNDhGQTYwMDE4OEZBNzAwMUMzQzA1MDAwNkZDCis6MTBBOTEwMDAwQzAwMjQwMzM0QTVGMjAzMDgwMDNDNUIwMDAwMDAwMDk3Cis6MTBBOTIwMDA4RUUyNTI0MEFGQTIwMDEwOEVFMjUyNDQzQzA0MDAwMTdECis6MTBBOTMwMDAyNDg0NThDQ0FGQTIwMDE0OEVFNjBFMTA4RUU3MEUxOEI5Cis6MTBBOTQwMDAzQzA1MDAwNjBDMDAyNDAzMzRBNUYyMDI4RUUyMDFDMDhGCis6MTBBOTUwMDAyNDQyMDAwMUFFRTIwMUMwMDgwMDNDMDI4RUUyMDFDMEM4Cis6MTBBOTYwMDA5NkUyMDQ2ODAwNTMxMDJCNTQ0MDAwMDEzQzE2ODAwMDBFCis6MTBBOTcwMDAxMjYwMDFDQjNDMEUwMDFGMzVDRUZGRkYzQzBGRkZGNUYwCis6MTBBOTgwMDAzNUVGMTAwMDI0MUUwMDQwOEVFMjcyNEM4RjQzMDI4MDhGCis6MTBBOTkwMDAyNDQyMDAwMTMwNDIwN0ZGMTA2MjAxOUUwMDAwMDAwMEM3Cis6MTBBOUEwMDAxMkMwMDAxMjAwMDAwMDAwOEVFMzUyNDA4RUUyNTI0NEJBCis6MTBBOUIwMDAxMDYyMDAwQTI2Rjg1MjQ0OEVGNDUyNDRBRkI4MDAyNEM0Cis6MTBBOUMwMDA4RUUzNTI0NDAwMDIxMTQwMjQ0MjUyNDgwMkUyODgyMUEwCis6MTBBOUQwMDAyNDYzMDAwMTA4MDAzQTg1MzA2RDAwRkY4RUUyMDFFMDNCCis6MTBBOUUwMDAyNDQyMDAwMUFFRTIwMUUwOEVFMjAxRTA4RUUzMEUxMEFGCis6MTBBOUYwMDA4RUUyMEUxODEwNjJGRkNBMjZGODBFMTg4RUY0MEUxODlBCis6MTBBQTAwMDAwMDAwQjAyMUFGQjgwMDI0OEVFMzBFMTgwMDAyMTE0MDAwCis6MTBBQTEwMDAyNDQyMEUyMDAyRTI4ODIxMjQ2MzAwMDEzMDZEMDFGRkYwCis6MTBBQTIwMDA5NkUyMDQ2QTMwNDIwMDEwMTA0MDAwMTgzNDAyODEwMDlGCis6MTBBQTMwMDA5NjQzMDAwQzE0NjIwMDE1MDAwMDAwMDAzQzAyMDAwMTY3Cis6MTBBQTQwMDAwMDU3MTAyMTkwNDI4M0MwMTQ0MDAwMTAwMDAwMDAwMDA1Cis6MTBBQTUwMDA5NjQyMDAwRUE2MjIwMDE2OEU0MjAwMDg4RTQzMDAwNDg1Cis6MTBBQTYwMDA4RTQ0MDAwMDI2NzNGRkZDQUU0MjAwMENBRTQzMDAwODhCCis6MTBBQTcwMDBBRTQ0MDAwNDk2MjIwMDBFMjYxMDAwMDQyNDE4MDAwMUEzCis6MTBBQTgwMDBBM0I4MDAyRjM0NDIwMjAwQTYyMjAwMEU4RTIyMDAwMDNFCis6MTBBQTkwMDA4RTIzMDAwNDNDMDQwMDAxMzQ4NDM4MDAwMjAwMzAyMTdECis6MTBBQUEwMDAzMDZBMDAwNzAyMEE4MDIzMDM2NDEwMjEwMjAyMTAyQjdGCis6MTBBQUIwMDAxMDQwMDAwNTAyNkE5ODIxMDIwNDEwMjMwMzYyMTgyMzQzCis6MTBBQUMwMDAzQzAyMDAyMDAwNDM4MDIzMjY2MjAwMDc5NjIzMDAwQUYwCis6MTBBQUQwMDAyNDE4RkZGODAwNThDODI0MDA2QTE4MjEwMDc5MTAyQkE4Cis6MTBBQUUwMDAxMDQwMDAwMjAzMjA2MDIxMDA2MDYwMjEwMTgwMTgyMUQ1Cis6MTBBQUYwMDAyNDYyMDAwNzI0MThGRkY4MDA1ODYwMjQwMjZDMTAyQjExCis6MTBBQjAwMDAxNDQwMDAwNDAxOTMyODIzMDE4MzI4MjMwODAwM0FDMzNBCis6MTBBQjEwMDAwMEMzMTAyMTAwRDMxMDIxMDA0QTIwMjMwMUM0MTAyQkIwCis6MTBBQjIwMDA1NDQwMDAwMTAwOEYyMDIxMjU0MjAwNDAwMDRDMTAyQjkyCis6MTBBQjMwMDAxNDQwMDAzNTAwMDA1ODIxOTRDMzAwMEMyNDAyMDgwMDgyCis6MTBBQjQwMDA1NDYyMDAzMkFFMjYwMDE4M0MwMjAwMDEwMDU3MTAyMTZBCis6MTBBQjUwMDA5MDQyODNDMDU0NDAwMDJEQUUyNjAwMTgyNEMyMDAxNzM2Cis6MTBBQjYwMDAwMUMyMTAyQjEwNDAwMDEzMDAwMDAwMDAzQzAyRkZGNTUyCis6MTBBQjcwMDAwMDQ2MTAyMTkwNDIxMDE3Mzg0MzAwMDYyQzYzMDAwMTU0Cis6MTBBQjgwMDAzODQyMDAxMTJDNDIwMDAxMDA2MjE4MjUxMDYwMDAxNEE4Cis6MTBBQjkwMDAyNEMyMDAxMDAxQzIxMDJCMTA0MDAwMEUwMDAwMDAwMDYzCis6MTBBQkEwMDAzQzBCRkZGNTAxNjY1ODIxOTU2QjEwMTAwODAwM0FGNDM0Cis6MTBBQkIwMDAyNTYyMDAwRTkwQzIwMDE3Mzg0MzAwMDYyQzYzMDAwMTg2Cis6MTBBQkMwMDAzODQyMDAxMTJDNDIwMDAxMDA2MjE4MjUxMDYwMDAwNTc3Cis6MTBBQkQwMDAwMTYwMTgyMTk0Q0IwMDEwMjU2MjAwMEUwMDRBNTgyMTE0Cis6MTBBQkUwMDAwMTYwMTgyMTI0NjIwMDA3MjQxOEZGRjgwMDU4NTgyNDM3Cis6MTBBQkYwMDAwMEMzMTAyMTAwNEEyMDIzMDFDNDEwMkIxMDQwMDAwMjgyCis6MTBBQzAwMDAwMTYzMjgyMzAwOEYyMDIxQUUyNjAwMTgzQzAyMDAwMTlBCis6MTBBQzEwMDAwMDU3MTAyMTkwNDI4M0MwMDAwMjEwMkIwMDAyMTZDMDgyCis6MTBBQzIwMDAxNTYwMDAwMkFGQTIwMDQ0MDE4MDU4MjEzMDgyMDAwMTZCCis6MTBBQzMwMDAxMDQwMDAwNzAwMDA0MDIxOTA4ODAwMDAyNDg0MDAwMTlCCis6MTBBQzQwMDAwMUM0MTAyQjEwNDAwMDAyMjRBNUZGRkYwMDhGMjAyMTFCCis6MTBBQzUwMDA1MEEwMDAxMjAwMDgxQzAyMkNBMjAwMDI1NDQwMDAwOTVGCis6MTBBQzYwMDAyNEE1RkZGRjk0ODIwMDAwMjQ4NDAwMDIwMTAyNDAyMUY5Cis6MTBBQzcwMDAwMUM0MTAyQjEwNDAwMDA2MjRBNUZGRkUwODAwM0IyMTU0Cis6MTBBQzgwMDAwMDhGMjAyMTkwODIwMDAwMDAwMjEyMDAwMTAyNDAyMTZBCis6MTBBQzkwMDAxNEEwRkZGMjJDQTIwMDAyMDAwODFDMDIzMTAyRkZGRkU4Cis6MTBBQ0EwMDAwMDYyNDAyMTMxMDhGRkZGMDE0MDI4MjExMTQwMDAxMUJFCis6MTBBQ0IwMDAwMjAwMjAyMTJDQTIwMDAyNTQ0MDAwMDkyNEE1RkZGRjFECis6MTBBQ0MwMDA5NDgyMDAwMDI0ODQwMDAyMDEwMjQwMjEwMUM0MTAyQjYwCis6MTBBQ0QwMDAxMDQwMDAwNjI0QTVGRkZFMDgwMDNCMzgwMDhGMjAyMTBECis6MTBBQ0UwMDA5MDgyMDAwMDAwMDIxMjAwMDEwMjQwMjExNEEwRkZGMjM1Cis6MTBBQ0YwMDAyQ0EyMDAwMjAwMDgxQzAyMzEwMkZGRkYwMDYyNDAyMTZBCis6MTBBRDAwMDAwMDA4MUMwMjMxMDJGRkZGOEY4OTAxMjAwMDYyNDAyMUYwCis6MTBBRDEwMDAyNzYyMzgwMDI1MjMwMDIwMDA2MjEwMkIxNDQwMDAwMjE3Cis6MTBBRDIwMDAzMTA4RkZGRjI3NjMzMDAwOEY4MjAxMjgxMDYyMDAwNDgyCis6MTBBRDMwMDAwMDAwMDAwMDhGODIwMTI0MTQ2MjAwMDcwMTQwMjgyMUQ2Cis6MTBBRDQwMDA4RUUyMDFBNDAwMDAzODIxMjQ0MjAwMDFBRUUyMDFBNEY5Cis6MTBBRDUwMDAwODAwM0JDOThFRTIwMUE0OEUyNjAwMDA4RTI3MDAwNDY1Cis6MTBBRDYwMDAwMDA4MTQwMDM0NDgwMDBCQUQzMDAwMDhBNTJCMDAwRTdECis6MTBBRDcwMDBBRDI4MDAxODhGQjgwMDQ0MDAwMDIwMjEwMjk2MTAyNTRECis6MTBBRDgwMDAwMDU4MTAyNUFEMjIwMDFDMDBFNTEwMkIwMEU1MzgyM0VCCis6MTBBRDkwMDAwMEM0MzAyMzAwQzIzMDIzQUQyNjAwMDBBRDI3MDAwNERDCis6MTBBREEwMDA4RUUyMDRDMEFEMjIwMDEwQUY4MzAxMjA5MkUyNEUyMDVCCis6MTBBREIwMDAxNDQwMDA1RjI0MDcwMDAxMjUwMkZGRUUyQzQyMDAwMjMwCis6MTBBREMwMDAxNDQwMDAwMzI0MDIwMDExMTUwMjAwMjQwMDAwMDAwMEJBCis6MTBBREQwMDA4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzgwMkUyMjAyMUEwCis6MTBBREUwMDA4QzgzMDAwMDI0MDIwMDEyMTQ2MjAwMEYwMDAwMDAwMDk3Cis6MTBBREYwMDA4RUUzNEUzMDhFRTI0RTM0MTA2MjAwMEIwMDAwMDAwMEY1Cis6MTBBRTAwMDA4QzgyMDAwNDI0NDIwMDAxQUM4MjAwMDQ4RUUyNEUzNEE1Cis6MTBBRTEwMDA4RUUzNEUzMDI0NDIwMDAxMTA1RTAwMkEwMDAwMDAwMDQ0Cis6MTBBRTIwMDAwODAwM0JBODAwMDAwMDAwOEVFMjRFMzAyNDQyMDAwMUUyCis6MTBBRTMwMDA1MDVFMDAwMzAwMDAxMDIxOEVFMjRFMzAyNDQyMDAwMURCCis6MTBBRTQwMDBBRUUyNEUzMDhFRTI0RTMwMDAwMjEwQzAyNDQyNTAzODQ2Cis6MTBBRTUwMDAwMkUyMjAyMTA4MDAzQkM2MjQwMjAwMTI4RUUyNEUzMDlFCis6MTBBRTYwMDAwMDAyMTBDMDI0NDI1MDM4MDJFMjIwMjE4QzgzMDAwMEVFCis6MTBBRTcwMDAyNDAyMDAwNzE0NjIwMDFGMDAwMDAwMDA4RUUzNEUzMDIxCis6MTBBRTgwMDA4RUUyNEUzNDEwNjIwMDFCMDAwMDAwMDA4QzgyMDAwNDMxCis6MTBBRTkwMDAyNDQyMDAwMUFDODIwMDA0OEVFMjRFMzQ4RUUzNEUzMDM4Cis6MTBBRUEwMDAyNDQyMDAwMTEwNUUwMDA3MDAwMDAwMDA4RUUyNEUzNEQ0Cis6MTBBRUIwMDAyNDQyMDAwMTEwNjIwMDA1MDAwMDAwMDAwODAwM0JCNEJECis6MTBBRUMwMDAwMDAwMDAwMDE0NjAwMDA1MDAwMDAwMDA4RjgyMDEyOENGCis6MTBBRUQwMDAyNDQyMDAyMEFGODIwMTI4OEY4MjAxMjg4QzgyMDAwNDQ2Cis6MTBBRUUwMDAyQzQyMDAxMTUwNDAwMDEyQUM4MDAwMDAwODAwM0JDOTA5Cis6MTBBRUYwMDAwMDAwMDAwMDhFRTI0RTMwMjQ0MjAwMDE1MDVFMDAwMzRDCis6MTBBRjAwMDAwMDAwMTAyMThFRTI0RTMwMjQ0MjAwMDFBRUUyNEUzMEFECis6MTBBRjEwMDA4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzgwMkUyMjAyMTVFCis6MTBBRjIwMDAyNDAyMDAwN0FDODIwMDAwMjQwMjAwMDFBQzgyMDAwNDZECis6MTBBRjMwMDAxNEUwMDAxOTNDMDUwMDA2M0MwNDAwMDEyNDg0NTg5MEVDCis6MTBBRjQwMDA4RTIyMDAxODM0QTVGMjA5QUZBMjAwMTA4RTIyMDAwMDU0Cis6MTBBRjUwMDA4RTIzMDAwNDAyMjAzMDIxMDE2MDM4MjEwQzAwMjQwM0RDCis6MTBBRjYwMDBBRkEzMDAxNDkzQTIwMDJGMTA0MDAwMkEzNDAyODEwMEU2Cis6MTBBRjcwMDA4RTQzMDAwNDhFNDQwMDA4OEU0NTAwMENBNjQyMDAwQzRGCis6MTBBRjgwMDBBRTQzMDAwMEFFNDQwMDA0QUU0NTAwMDg5NjIyMDAxNjExCis6MTBBRjkwMDAwODAwM0MwMkE2NDIwMDBFMTU5OTAwMEEwMjZBMTgyMzE2Cis6MTBBRkEwMDA5NjIyMDAwRUE2MjMwMDBBMzQ0MjAwMDRBNjIyMDAwRUI4Cis6MTBBRkIwMDAzQzAxMDAwMTAwMzcwODIxQTAyMDgzQzAwODAwM0JGRkFFCis6MTBBRkMwMDAwMDAwOTgyMTk2MjQwMDBBMDA4MzEwMkI1NDQwMDAwMUIxCis6MTBBRkQwMDAwMDgwMTgyMTI0MDIwMDAxQTYyMzAwMEEzQzAxMDAwMTgwCis6MTBBRkUwMDAwMDM3MDgyMUEwMjI4M0MwOTYyMjAwMEEwMDRBMTgyMUI3Cis6MTBBRkYwMDAwMjAzODAyMTAxRDAxMDJCNTQ0MDAwMDEwMjBGODAyMTU4Cis6MTBCMDAwMDAwMjYzOTgyMzAwMDBCMDIxOEZCODAwMjQxNjYwRkU1RTEyCis6MTBCMDEwMDBBRjBEMDAwMDEyNjAwMDIyMDAwMDAwMDAzQzAxMDAwMUEyCis6MTBCMDIwMDAwMDM3MDgyMUFDMzM4M0M0M0MwMTAwMDEwMDM3MDgyMUZDCis6MTBCMDMwMDBBQzMwODNDODNDMDEwMDAxMDAzNzA4MjFBQzMyODNDQzFFCis6MTBCMDQwMDA5M0EyMDAyRjEwNDAwMDA4MDAwMDAwMDAzQzAyMDAwMTA1Cis6MTBCMDUwMDAwMDU3MTAyMThDNDI4M0NDMjQ0MjAwMDQzQzAxMDAwMUEzCis6MTBCMDYwMDAwMDM3MDgyMUFDMjI4M0NDOEY0MzAyODA4RUUyNzI0Q0UxCis6MTBCMDcwMDAxNDYyMDAwNjAwMDAwMDAwOEVFMjAxQzQyNDQyMDAwMUI4Cis6MTBCMDgwMDBBRUUyMDFDNDA4MDAzQzVCOEVFMjAxQzQ4RUUyMDFCQzZBCis6MTBCMDkwMDAyNDQyMDAwMUFFRTIwMUJDMDgwMDNDNUI4RUUyMDFCQzMwCis6MTBCMEEwMDA5N0E0MDAxRTI0ODRGRkZDMDA4MDE4MjE4RUU0MDBDMEI5Cis6MTBCMEIwMDA4RUU1MDBDNDAwMDAxMDIxMDBBMzI4MjEwMEEzMzAyQjNFCis6MTBCMEMwMDAwMDgyMjAyMTAwODYyMDIxMjQwMjAwMDJBRUU0MDBDMDdDCis6MTBCMEQwMDBBRUU1MDBDNDEyQTIwMDBGMkFBMjAwMDMxNDQwMDAxNzFDCis6MTBCMEUwMDAyNDAyMDAwMzE2QTIwMDE1MDAwMDAwMDA4RUUyMDBEMDJBCis6MTBCMEYwMDA4RUUzMDBENDI0NjMwMDAxMkM2NDAwMDEwMDQ0MTAyMTdECis6MTBCMTAwMDBBRUUyMDBEMEFFRTMwMEQ0OEVFMjAwRDAwODAwM0M1NUExCis6MTBCMTEwMDA4RUUzMDBENDhFRTIwMEQ4OEVFMzAwREMyNDYzMDAwMUNECis6MTBCMTIwMDAyQzY0MDAwMTAwNDQxMDIxQUVFMjAwRDhBRUUzMDBEQzQ0Cis6MTBCMTMwMDA4RUUyMDBEODA4MDAzQzU1OEVFMzAwREM4RUUyMDBDOEE5Cis6MTBCMTQwMDA4RUUzMDBDQzI0NjMwMDAxMkM2NDAwMDEwMDQ0MTAyMTM0Cis6MTBCMTUwMDBBRUUyMDBDOEFFRTMwMENDOEVFMjAwQzg4RUUzMDBDQ0M1Cis6MTBCMTYwMDA4RjgzMDBFNDhGODIwMEUwMTA2MjAwMDMyNDYzMDAwOEY0Cis6MTBCMTcwMDBBRjgzMDBFNEFGODMwMEU4OEZCRjAwNjg4RkJFMDA2NDM4Cis6MTBCMTgwMDA4RkI2MDA2MDhGQjUwMDVDOEZCNDAwNTg4RkIzMDA1NDQ5Cis6MTBCMTkwMDA4RkIyMDA1MDhGQjEwMDRDOEZCMDAwNDgwM0UwMDAwODIwCis6MTBCMUEwMDAyN0JEMDA3MDI3QkRGRkUwQUZCRjAwMTg4RUUzMEUxNDZGCis6MTBCMUIwMDA4RUUyMEUwQzEwNjIwMDc0MDAwMDAwMDA4RUUzMEUwQzk0Cis6MTBCMUMwMDA4RUUyMEUxNDAwNjIyMDIzMDQ4MjAwMDEyNDg0MDIwMDE3Cis6MTBCMUQwMDA4RUUzMEUxODhFRTIwRTE0MDA0MzEwMkIxNDQwMDAwNDcwCis6MTBCMUUwMDAyNDAyMDIwMDhFRTMwRTE0MDgwMDNDN0QwMDQzMTgyMzY1Cis6MTBCMUYwMDA4RUUyMEUxODhFRTMwRTE0MDA0MzEwMjMyNDQzRkZGRjRCCis6MTBCMjAwMDAwMDgwNDgyMTAwNjkxMDJBNTQ0MDAwMDEwMDYwNDgyMTU0Cis6MTBCMjEwMDA4Rjg3MDEwMDI3NjIzMDAwMjRFODAwMjAwMTAyMTAyQkY0Cis6MTBCMjIwMDA1MDQwMDAwMTI3NjgyODAwOEY4MjAxMDgxMTAyMDAwNEE1Cis6MTBCMjMwMDAwMDAwMDAwMDhGODIwMTA0MTUwMjAwMDcwMDAwMTAyMUE5Cis6MTBCMjQwMDA4RUUyMDFBODAwMDAyMDIxMjQ0MjAwMDFBRUUyMDFBODA0Cis6MTBCMjUwMDAwODAwM0NCRjhFRTIwMUE4OEVFNDBFMTQwMDA0MjE0MEQ5Cis6MTBCMjYwMDAwMDgwMTgyMThFRTQwNDYwOEVFNTA0NjQwMEEzMjgyMTg4Cis6MTBCMjcwMDAwMEEzMzAyQjAwODIyMDIxMDA4NjIwMjFBQ0U0MDAwMEI2Cis6MTBCMjgwMDBBQ0U1MDAwNDhFRTMwRTE0MDAwOTExNDBBNEUyMDAwRUE4Cis6MTBCMjkwMDAyNDAyMDAwMkFDRTIwMDE4MDAwMzE5NDAyNDYzMEUyMENGCis6MTBCMkEwMDAwMkUzMTAyMUFDRTIwMDA4OEVFMjBFMTRBQ0UyMDAxQ0I2Cis6MTBCMkIwMDA4RUUyMDRDQ0FDRTIwMDEwQUY4ODAxMDA5MkUyMDRFQzE0Cis6MTBCMkMwMDAxNDQwMDAxMTI0MDQwMDAxOEVFMjRFMjgyNDAzMDA0MEEzCis6MTBCMkQwMDAyNDQyMDAwMTUwNDMwMDAzMDAwMDEwMjE4RUUyNEUyODVBCis6MTBCMkUwMDAyNDQyMDAwMUFFRTI0RTI4OEVFMjRFMjgwMDAyMTBDMDM5Cis6MTBCMkYwMDAyNDQyNEUzODAyRTIxODIxMjQwMjAwMDJBQzYyMDAwMDBGCis6MTBCMzAwMDAyNDAyMDAwMUFDNjIwMDA0MTQ4MDAwMEUyNDAzMDA0MEZCCis6MTBCMzEwMDA4RUUyMEUxNEFGQTIwMDEwOEVFMjBFMTgzQzA1MDAwNzVDCis6MTBCMzIwMDBBRkEyMDAxNDhFRTYwRTBDOEVFNzBFMTAzQzA0MDAwMTU2Cis6MTBCMzMwMDAyNDg0NThENDBDMDAyNDAzMzRBNUYwMDEwODAwM0NERDFCCis6MTBCMzQwMDAwMDAwMDAwMDhFRTIwNTAwMjQ0MjAwMDE1MDQzMDAwMzhCCis6MTBCMzUwMDAwMDAwMTAyMThFRTIwNTAwMjQ0MjAwMDFBRUUyMDUwMDRCCis6MTBCMzYwMDA4RUUyMDUwMDAwMDIxMDgwMDA1NzEwMjFBQzQ5MDUwODRDCis6MTBCMzcwMDA4RUUyMEUxNDAwNDkxMDIxMzA0MjAxRkZBRUUyMEUxNDlECis6MTBCMzgwMDA4RUUzMEUxNDhFRTIwRTBDMTQ2MjAwMDUwMDAwMDAwMDI1Cis6MTBCMzkwMDA4RjgyMDA2MDI0MDNGREZGMDA0MzEwMjRBRjgyMDA2MDExCis6MTBCM0EwMDA4RkJGMDAxODAzRTAwMDA4MjdCRDAwMjAyN0JERkZFMDg1Cis6MTBCM0IwMDBBRkJGMDAxODhFRTM1MjNDOEVFMjUyMzgxMDYyMDA3NDI4Cis6MTBCM0MwMDAwMDAwMDAwMDhFRTM1MjM4OEVFMjUyM0MwMDYyMjAyM0RGCis6MTBCM0QwMDAwNDgyMDAwMTI0ODQwMTAwOEVFMzUyNDQ4RUUyNTIzQzM4Cis6MTBCM0UwMDAwMDQzMTAyQjE0NDAwMDA0MjQwMjAxMDA4RUUzNTIzQzYxCis6MTBCM0YwMDAwODAwM0NGRjAwNDMxODIzOEVFMjUyNDQ4RUUzNTIzQzg3Cis6MTBCNDAwMDAwMDQzMTAyMzI0NDNGRkZGMDA4MDQ4MjEwMDY5MTAyQUQ1Cis6MTBCNDEwMDA1NDQwMDAwMTAwNjA0ODIxOEY4NzAxMDAyNzYyMzAwMEZFCis6MTBCNDIwMDAyNEU4MDAyMDAxMDIxMDJCNTA0MDAwMDEyNzY4MjgwMDZBCis6MTBCNDMwMDA4RjgyMDEwODExMDIwMDA0MDAwMDAwMDA4RjgyMDEwNEM1Cis6MTBCNDQwMDAxNTAyMDAwNzAwMDAxMDIxOEVFMjAxQTgwMDAwMjAyMTUzCis6MTBCNDUwMDAyNDQyMDAwMUFFRTIwMUE4MDgwMDNENDE4RUUyMDFBOEFECis6MTBCNDYwMDA4RUU0NTIzQzAwMDQyMTQwMDA4MDE4MjE4RUU0MDQ3MEQ4Cis6MTBCNDcwMDA4RUU1MDQ3NDAwQTMyODIxMDBBMzMwMkIwMDgyMjAyMTM0Cis6MTBCNDgwMDAwMDg2MjAyMUFDRTQwMDAwQUNFNTAwMDQ4RUUzNTIzQ0QxCis6MTBCNDkwMDAwMDA5MTE0MEE0RTIwMDBFMjQwMjAwMDNBQ0UyMDAxOEVGCis6MTBCNEEwMDAwMDAzMTk0MDI0NjM1MjQ4MDJFMzEwMjFBQ0UyMDAwODczCis6MTBCNEIwMDA4RUUyNTIzQ0FDRTIwMDFDOEVFMjA0Q0NBQ0UyMDAxMDA2Cis6MTBCNEMwMDBBRjg4MDEwMDkyRTIwNEVDMTQ0MDAwMTEyNDA0MDAwMTUyCis6MTBCNEQwMDA4RUUyNEUyODI0MDMwMDQwMjQ0MjAwMDE1MDQzMDAwMzIyCis6MTBCNEUwMDAwMDAwMTAyMThFRTI0RTI4MjQ0MjAwMDFBRUUyNEUyOEQ4Cis6MTBCNEYwMDA4RUUyNEUyODAwMDIxMEMwMjQ0MjRFMzgwMkUyMTgyMThCCis6MTBCNTAwMDAyNDAyMDAwM0FDNjIwMDAwMjQwMjAwMDFBQzYyMDAwNENCCis6MTBCNTEwMDAxNDgwMDAwRTI0MDMwMDQwOEVFMjUyM0NBRkEyMDAxMEMzCis6MTBCNTIwMDA4RUUyNTI0NDNDMDUwMDA3QUZBMjAwMTQ4RUU2NTIzODZBCis6MTBCNTMwMDA4RUU3NTI0MDNDMDQwMDAxMjQ4NDU4RTAwQzAwMjQwM0IwCis6MTBCNTQwMDAzNEE1RjAxMDA4MDAzRDVGMDAwMDAwMDA4RUUyMDUwMDA5Cis6MTBCNTUwMDAyNDQyMDAwMTUwNDMwMDAzMDAwMDEwMjE4RUUyMDUwMDQ4Cis6MTBCNTYwMDAyNDQyMDAwMUFFRTIwNTAwOEVFMjA1MDAwMDAyMTA4MEQ4Cis6MTBCNTcwMDAwMDU3MTAyMUFDNDkwNTA4OEVFMjUyM0MwMDQ5MTAyMUM5Cis6MTBCNTgwMDAzMDQyMDBGRkFFRTI1MjNDOEVFMzUyM0M4RUUyNTIzODMzCis6MTBCNTkwMDAxNDYyMDAwNTAwMDAwMDAwOEY4MjAwNjAyNDAzRkVGRjlCCis6MTBCNUEwMDAwMDQzMTAyNEFGODIwMDYwOEZCRjAwMTgwM0UwMDAwODQyCis6MTBCNUIwMDAyN0JEMDAyMDhGODIwMTIwOEVFMzRFMzQ4RjgyMDEyNDJDCis6MTBCNUMwMDA4Rjg2MDEyODI0MDIwMDQwMjQ2MzAwMDE1MDYyMDAwMzlBCis6MTBCNUQwMDAwMDAwMTAyMThFRTI0RTM0MjQ0MjAwMDFBRUUyNEUzNENGCis6MTBCNUUwMDA4RUUyNEUzNDhFRTQ0RTM0OEVFMzRFMzAwMDAyMTBDMEI0Cis6MTBCNUYwMDAyNDQyNTAzODE0ODMwMDA3MDJFMjI4MjE4RjgyMDEyODU4Cis6MTBCNjAwMDAyNDQyMDAyMEFGODIwMTI4OEY4MjAxMjgwODAwM0Q5MjQ5Cis6MTBCNjEwMDBBQ0EwMDAwMDhFRTI0RTM0MjQwMzAwNDAyNDQyMDAwMTFFCis6MTBCNjIwMDA1MDQzMDAwMzAwMDAxMDIxOEVFMjRFMzQyNDQyMDAwMUZBCis6MTBCNjMwMDAwMDAyMTBDMDI0NDI1MDM4MDJFMjI4MjE4Q0EyMDAwNEVCCis6MTBCNjQwMDA4RjgzMDEyODAwMDIxMTQwMDA2MjE4MjFBRjgzMDEyODc2Cis6MTBCNjUwMDBBQ0EwMDAwMDhDQzIwMDE4MjQ0M0ZGRkUyQzYyMDAxMjM0Cis6MTBCNjYwMDAxMDQwMDAwODAwMDMxMDgwM0MwMTAwMDEwMDIyMDgyMTY2Cis6MTBCNjcwMDA4QzIyNThGMDAwNDAwMDA4MDAwMDAwMDAyNDAyMDAwMTY1Cis6MTBCNjgwMDBBRUUyNEUyNDAzRTAwMDA4MDAwMDAwMDAyN0JERkZDODIyCis6MTBCNjkwMDBBRkJGMDAzMEFGQjUwMDJDQUZCNDAwMjhBRkIzMDAyNDZCCis6MTBCNkEwMDBBRkIyMDAyMEFGQjEwMDFDQUZCMDAwMTg4RjgzMDEyOEVCCis6MTBCNkIwMDA4RjgyMDEyNDEwNjIwMkIwMDAwMDk4MjEzQzExMDAxRjBCCis6MTBCNkMwMDAzNjMxRkZGRjNDMTJGRkY1MzY1MjEwMDAyNDE1MDAxMkYwCis6MTBCNkQwMDAyNDE0MDA0MDhGOEMwMTI4OEY4MjAxMjgyNDQyMDAyMEVFCis6MTBCNkUwMDBBRjgyMDEyODkxODIwMDFCOEY4MzAxMjgyNDQzRkZGRTMzCis6MTBCNkYwMDAyQzYyMDAxMjEwNDAwMjlDMDAwMzEwODAzQzAxMDAwMUVCCis6MTBCNzAwMDAwMDIyMDgyMThDMjI1OTQ4MDA0MDAwMDgwMDAwMDAwMDU3Cis6MTBCNzEwMDA4RjQyMDIxODMwNDIwMTAwMTA0MDAwMDcwMDAwMDAwMDc0Cis6MTBCNzIwMDA5NTgzMDAxNjk1ODIwMDE4MDA2MjE4MjMwMDAzMTQwMjA2Cis6MTBCNzMwMDAwMDQzMTAyMUE1ODIwMDE2OEQ4MjAwMUMzQzAzODAwMDZFCis6MTBCNzQwMDAzMDQ0RkZGRjAwNDM2ODI0M0MwMzA4MDAwMDQzMTgyNEYyCis6MTBCNzUwMDAxMUEwMDAwNEFEODQwMDFDMDAwNDExNDAwODAwM0REODc1Cis6MTBCNzYwMDAyNDQyNTI0ODAwMDQxMTQwMjQ0MjBFMjAwMkUyNTgyMTkzCis6MTBCNzcwMDA5NTYyMDAwRTMwNDJGRkZDMTA2MDAwMDRBNTYyMDAwRUNFCis6MTBCNzgwMDA5NTg0MDAxNjA4MDAzRUMwMDAwMDAwMDA4RDY5MDAxODc2Cis6MTBCNzkwMDAwMDAwNDAyMTk1MkEwMDAwMjUyOTAwMDI5NTI3MDAwMDdECis6MTBCN0EwMDAyNTI5MDAwMjk1MjYwMDAwMjUyOTAwMDI5NTI1MDAwMDg0Cis6MTBCN0IwMDAyNTI5MDAwMjk1MjQwMDAwMjUyOTAwMDI5NTIzMDAwMDc4Cis6MTBCN0MwMDAyNTI5MDAwMjk1MjIwMDAwMjUyOTAwMDIwMTQ3NTAyMTY5Cis6MTBCN0QwMDAwMTQ2NTAyMTAxNDU1MDIxMDE0NDUwMjEwMTQzNTAyMThGCis6MTBCN0UwMDAwMTQyNTAyMTAwMEExQzAyMzE0MkZGRkYwMDYyNTAyMTM5Cis6MTBCN0YwMDAwMDBBMUMwMjMxNDJGRkZGMDA2MjUwMjE5NkUyMDQ2QUY3Cis6MTBCODAwMDAzMTRFRkZGRjMwNDIwMDAyMTA0MDAwNDQwMDAwNTAyMTQyCis6MTBCODEwMDAyNTIyMDAxNDAyMjIxMDJCMTA0MDAwMTQwMTIwMTgyMUIwCis6MTBCODIwMDAyNDA1MDAwQTAwMDAyMDIxMDIyMzEwMkI1NDQwMDAwMUFGCis6MTBCODMwMDAwMDcyMTgyMTk0NjIwMDAwMjQ2MzAwMDIyNEE1RkZGRjE3Cis6MTBCODQwMDAxNEEwRkZGOTAwODIyMDIxMDAwNDFDMDIzMDgyRkZGRkI3Cis6MTBCODUwMDAwMDYyMjAyMTAwMDQxNDAyMzA4M0ZGRkYwMDQzMTAyMTA2Cis6MTBCODYwMDAzMDQyRkZGRjA4MDAzRTMzMDE0MjUwMjE5NTJBMDAwMDdDCis6MTBCODcwMDAyNTI5MDAwMjk1MjgwMDAwMjUyOTAwMDI5NTI3MDAwMEFGCis6MTBCODgwMDAyNTI5MDAwMjk1MjYwMDAwMjUyOTAwMDI5NTI1MDAwMEEzCis6MTBCODkwMDAyNTI5MDAwMjk1MjMwMDAwMjUyOTAwMDI5NTIyMDAwMDk5Cis6MTBCOEEwMDAyNTI5MDAwMjk1MjQwMDAwMjUyOTAwMDIwMTQ4NTAyMTg1Cis6MTBCOEIwMDAwMTQ3NTAyMTAxNDY1MDIxMDE0NTUwMjEwMTQzNTAyMUFCCis6MTBCOEMwMDAwMTQyNTAyMTk1MjIwMDAwOTUyMzAwMDIwMTQ0NTAyMTlECis6MTBCOEQwMDAwMTQyNTAyMTAxNDM1MDIxMDAwQTFDMDIzMTQyRkZGRjY2Cis6MTBCOEUwMDAwMDYyNTAyMTAwMEExQzAyMzE0MkZGRkYwMDYyNTAyMTE5Cis6MTBCOEYwMDAzMTQ4RkZGRjUxMDAwMDAxMzQwOEZGRkY4RDYyMDAxODNFCis6MTBCOTAwMDA5NDQzMDAwQzI0MDIwODAwNTQ2MjAwMDVBNTY4MDAxMDRFCis6MTBCOTEwMDA5NTYyMDAwRTM0NDIwMDAyQTU2MjAwMEVBNTY4MDAxMDc4Cis6MTBCOTIwMDA5NkUyMDQ2QTAwMDAyODIxMzA0MjAwMDgxNDQwMDA1NkM0Cis6MTBCOTMwMDAwMDAwMzAyMThENjMwMDE4MjQ2MjAwMjQwMjIyMTAyQkE1Cis6MTBCOTQwMDAxMDQwMDAzNDI0NjkwMDEwMDIyOTEwMkI1NDQwMDAwMURCCis6MTBCOTUwMDAwMTMyNDgyMTk1MjUwMDAwMjQ2OTAwMTQwMjI5MTAyQjhBCis6MTBCOTYwMDAxMDQwMDAwMjI0QTVGRkVDMDEzMjQ4MjE5NTIyMDAwMDdFCis6MTBCOTcwMDAzMDQyMEZGRjE0NDAwMDAzMjUyOTAwMDIwODAwM0U2MEZBCis6MTBCOTgwMDAyNDEzMDAwMTAwMDA5ODIxMDBBMDMwMjEwMjI5MTAyQjZGCis6MTBCOTkwMDA1NDQwMDAwMTAxMzI0ODIxOTEyMjAwMDEyNTI5MDAwMjcyCis6MTBCOUEwMDAwMEEyMjgyMTAyMjkxMDJCNTQ0MDAwMDEwMTMyNDgyMTE1Cis6MTBCOUIwMDAyNTI5MDAwMjAyMjkxMDJCNTQ0MDAwMDEwMTMyNDgyMUEwCis6MTBCOUMwMDA5NTIyMDAwMDI1MjkwMDAyMDBBMjI4MjEwMjI5MTAyQjFGCis6MTBCOUQwMDA1NDQwMDAwMTAxMzI0ODIxOTUyMjAwMDAyNTI5MDAwMjJGCis6MTBCOUUwMDAwMEEyMjgyMTAyMjkxMDJCNTQ0MDAwMDEwMTMyNDgyMUQ1Cis6MTBCOUYwMDA5NTIyMDAwMDI1MjkwMDAyMDBBMjI4MjEwMjI5MTAyQkVGCis6MTBCQTAwMDA1NDQwMDAwMTAxMzI0ODIxOTUyMjAwMDAwODAwM0U5OTZGCis6MTBCQTEwMDAwMEEyMjgyMTk0NjUwMDEwOTQ2MjAwMTQyNDY5MDAxNjg1Cis6MTBCQTIwMDAzMDQyMEZGRjE0NDAwMDAzMjRBNUZGRUMwODAwM0U4Q0I5Cis6MTBCQTMwMDAyNDEzMDAwMTAwMDA5ODIxMDBBMDMwMjE5MTIzMDAwMTZGCis6MTBCQTQwMDAyNTI5MDAwNDk1MjIwMDAwMjUyOTAwMDI5NTI0MDAwMEU0Cis6MTBCQTUwMDAyNTI5MDAwMjAwQTMyODIxMDBBMjI4MjE5NTIyMDAwMDA4Cis6MTBCQTYwMDA5NTIzMDAwMjAwQTQyODIxMDBBMjI4MjEwMEEzMjgyMTU4Cis6MTBCQTcwMDAwMDA1MUMwMjMwQTJGRkZGMDA2MjI4MjEwMDA1MUMwMjA1Cis6MTBCQTgwMDAzMEEyRkZGRjAwNjIyODIxOTZFMjA0NkEzMDQyMDAwMUUyCis6MTBCQTkwMDAxMDQwMDAxRTAwMDAyMDIxOTU4MjAwMTYwMDRFMjAyMzM5Cis6MTBCQUEwMDAwMDA0MTQwMjAwODIyMDIxMzI2MjAwRkY1MDQwMDAwMjk0Cis6MTBCQUIwMDAwMDg2MjAyMTAwODUyMDIxMDAwNDE0MDIwMDgyMjAyMTFDCis6MTBCQUMwMDAzMDg0RkZGRjUwODAwMDAxMzQwNEZGRkY4RDYyMDAxOEI2Cis6MTBCQUQwMDAyNDQzMDAxNzAyMjMxMDJCNTQ0MDAwMDEwMDcyMTgyMTQ4Cis6MTBCQUUwMDA5MDYyMDAwMDM4NDMwMDExMkM2MzAwMDEzODQyMDAwNkM4Cis6MTBCQUYwMDAyQzQyMDAwMTAwNjIxODI1MTA2MDAwMDQwMDAwMDAwMEM0Cis6MTBCQjAwMDA5NTYyMDAwRTM0NDIwMDAxQTU2MjAwMEU5NTYyMDAwRTlGCis6MTBCQjEwMDAyNDBBMDAwMjMwNDIwMDA0MTA0MDAwMDJBNTY0MDAxMjEyCis6MTBCQjIwMDAyNDBBMDAwNDhGODgwMTIwMjc2MjM4MDAyNTA5MDAyMDlDCis6MTBCQjMwMDAwMTIyMTAyQjUwNDAwMDAxMjc2OTMwMDA4RjgyMDEyODFDCis6MTBCQjQwMDAxMTIyMDAwNDAwMDAwMDAwOEY4MjAxMjQxNTIyMDAwNzRBCis6MTBCQjUwMDAyNDA0MDAyMDhFRTIwMUE0MDAwMDgwMjEyNDQyMDAwMTgwCis6MTBCQjYwMDBBRUUyMDFBNDA4MDAzRjRGOEVFMjAxQTQ4RUU1NzI0Q0M0Cis6MTBCQjcwMDA4RUU2MDQ5MDhFRTcwNDk0QUQwQjAwMDhBNTA0MDAwRTM5Cis6MTBCQjgwMDBBRDBBMDAxODAwMDUyOTQwMDBBMDE4MjEwMDAwMTAyMTZFCis6MTBCQjkwMDAwMEUzMzgyMTAwRTMyMDJCMDBDMjMwMjEwMEM0MzAyMTEzCis6MTBCQkEwMDBBRDA2MDAwMEFEMDcwMDA0OEVFMjcyNEMwMDREMTAyNTdBCis6MTBCQkIwMDBBRDAyMDAxQzhFRTIwNEM0QUQwMjAwMTBBRjg5MDEyMDZBCis6MTBCQkMwMDA5MkUyNEUyMDE0NDAwMDYwMjQxMDAwMDEyNTQzRkZFRTU1Cis6MTBCQkQwMDAyQzYzMDAwMjM5NDIwMDExMkM0MjAwMDEwMDYyMTgyNTNBCis6MTBCQkUwMDAxMDYwMDAyNDAwMDAwMDAwOEVFMjRFMzAwMDAyMTBDMDAxCis6MTBCQkYwMDAyNDQyNTAzODAyRTIyMDIxOEM4MjAwMDAxNDU1MDAwRkFDCis6MTBCQzAwMDAwMDAwMDAwMDhFRTM0RTMwOEVFMjRFMzQxMDYyMDAwQkQ2Cis6MTBCQzEwMDAwMDAwMDAwMDhDODIwMDA0MjQ0MjAwMDFBQzgyMDAwNDc5Cis6MTBCQzIwMDA4RUUyNEUzNDhFRTM0RTMwMjQ0MjAwMDExMDU0MDAyQjNECis6MTBCQzMwMDAwMDAwMDAwMDA4MDAzRjJFMDAwMDAwMDA4RUUyNEUzMEExCis6MTBCQzQwMDAyNDQyMDAwMTUwNTQwMDAzMDAwMDEwMjE4RUUyNEUzMEM3Cis6MTBCQzUwMDAyNDQyMDAwMUFFRTI0RTMwOEVFMjRFMzAwMDAyMTBDMEFGCis6MTBCQzYwMDAyNDQyNTAzODAyRTIyMDIxMjQwMjAwMDEwODAwM0Y0RTA1Cis6MTBCQzcwMDBBQzk1MDAwMDhFRTI0RTMwMDAwMjEwQzAyNDQyNTAzOEQ1Cis6MTBCQzgwMDAwMkUyMjAyMThDODMwMDAwMjQwMjAwMDcxNDYyMDAxRkJFCis6MTBCQzkwMDAwMDAwMDAwMDhFRTM0RTMwOEVFMjRFMzQxMDYyMDAxQjM2Cis6MTBCQ0EwMDAwMDAwMDAwMDhDODIwMDA0MjQ0MjAwMDFBQzgyMDAwNEU5Cis6MTBCQ0IwMDA4RUUyNEUzNDhFRTM0RTMwMjQ0MjAwMDExMDU0MDAwN0QxCis6MTBCQ0MwMDAwMDAwMDAwMDhFRTI0RTM0MjQ0MjAwMDExMDYyMDAwNUE0Cis6MTBCQ0QwMDAwMDAwMDAwMDA4MDAzRjNBMDAwMDAwMDAxNDYwMDAwNTZBCis6MTBCQ0UwMDAwMDAwMDAwMDhGODIwMTI4MjQ0MjAwMjBBRjgyMDEyODNBCis6MTBCQ0YwMDA4RjgyMDEyODhDODIwMDA0MkM0MjAwMTE1MDQwMDAxMkQ3Cis6MTBCRDAwMDBBQzgwMDAwMDA4MDAzRjRGMDAwMDAwMDA4RUUyNEUzMDgzCis6MTBCRDEwMDAyNDQyMDAwMTUwNTQwMDAzMDAwMDEwMjE4RUUyNEUzMEY2Cis6MTBCRDIwMDAyNDQyMDAwMUFFRTI0RTMwOEVFMjRFMzAwMDAyMTBDMERFCis6MTBCRDMwMDAyNDQyNTAzODAyRTIyMDIxMjQwMjAwMDdBQzgyMDAwMDk1Cis6MTBCRDQwMDAyNDAyMDAwMUFDODIwMDA0MTYwMDAwMEQwMDAwMDAwMDc3Cis6MTBCRDUwMDA4RjgyMDEyMDNDMDQwMDAxMjQ4NDU5MzhBRkEwMDAxNEQ0Cis6MTBCRDYwMDBBRkEyMDAxMDhEODYwMDFDOEY4NzAxMjQzQzA1MDAwOEJGCis6MTBCRDcwMDAwQzAwMjQwMzM0QTUwMDAxMDgwMDQwNTcwMDAwMDAwMDE3Cis6MTBCRDgwMDA4RUUyNzI0QzI0NDIwMDAxMzA0MjA3RkYxMUEwMDAwNkVGCis6MTBCRDkwMDBBRUUyNzI0QzhFRTIwMUQwMjQ0MkZGRkZBRUUyMDFEMDRGCis6MTBCREEwMDAwODAwM0Y2QjhFRTIwMUQwOEVFMjAxQ0MyNDQyRkZGRkZGCis6MTBCREIwMDBBRUUyMDFDQzhFRTIwMUNDOEVFMjAxRDgyNDQyRkZGRjNDCis6MTBCREMwMDBBRUUyMDFEODA4MDA0MDU3OEVFMjAxRDg4RjQyMDI0MDBGCis6MTBCREQwMDAxMDQwMDBFNTAwMDAwMDAwOEVFMjBFMUMyNDQyMDAwMTJECis6MTBCREUwMDAwODAwNDA1N0FFRTIwRTFDOTU4MjAwMUVBRDgyMDAxQzdBCis6MTBCREYwMDA4RjQyMDI0MDEwNDAwMDcyMDAwMDAwMDA4RUUyMEUxQ0Q0Cis6MTBCRTAwMDAyNDQyMDAwMUFFRTIwRTFDOEY0MzAyNDAwMDQzMTAyQjdGCis6MTBCRTEwMDAxNDQwMDBENTAwMDAwMDAwOEY4MzAxMjAyNzYyMzgwMDA1Cis6MTBCRTIwMDAyNDY2MDAyMDAwQzIxMDJCNTA0MDAwMDEyNzY2MzAwMDFECis6MTBCRTMwMDA4RjgyMDEyODEwQzIwMDA0MDAwMDAwMDA4RjgyMDEyNEJDCis6MTBCRTQwMDAxNEMyMDAwNzAwMDAwMDAwOEVFMjAxQTQwMDAwODAyMTVGCis6MTBCRTUwMDAyNDQyMDAwMUFFRTIwMUE0MDgwMDNGREE4RUUyMDFBNDEwCis6MTBCRTYwMDA4RUUyNzI0Q0FDNjIwMDFDOEVFNDA0QTg4RUU1MDRBQzM5Cis6MTBCRTcwMDAyNDYyMDAxQ0FDNjIwMDA4MjQwMjAwMDhBNDYyMDAwRUM4Cis6MTBCRTgwMDAyNDAyMDAxMUFDNjIwMDE4QUM2NDAwMDBBQzY1MDAwNDMwCis6MTBCRTkwMDA4RUUyMDRDNEFDNjIwMDEwQUY4NjAxMjA5MkUyNEUyMDE0Cis6MTBCRUEwMDAxNDQwMDAzNDI0MTAwMDAxOEVFMjRFMzAwMDAyMTBDMDE1Cis6MTBCRUIwMDAyNDQyNTAzODAyRTIyMDIxOEM4MjAwMDAxNDU1MDAxRkQ5Cis6MTBCRUMwMDAwMDAwMDAwMDhFRTM0RTMwOEVFMjRFMzQxMDYyMDAxQjA0Cis6MTBCRUQwMDAwMDAwMDAwMDhDODIwMDA0MjQ0MjAwMDFBQzgyMDAwNEI3Cis6MTBCRUUwMDA4RUUyNEUzNDhFRTM0RTMwMjQ0MjAwMDExMDU0MDAwNzlGCis6MTBCRUYwMDAwMDAwMDAwMDhFRTI0RTM0MjQ0MjAwMDExMDYyMDAwNTcyCis6MTBCRjAwMDAwMDAwMDAwMDA4MDAzRkM2MDAwMDAwMDAxNDYwMDAwNUFCCis6MTBCRjEwMDAwMDAwMDAwMDhGODIwMTI4MjQ0MjAwMjBBRjgyMDEyODA3Cis6MTBCRjIwMDA4RjgyMDEyODhDODIwMDA0MkM0MjAwMTE1MDQwMDAxMUE1Cis6MTBCRjMwMDBBQzgwMDAwMDA4MDAzRkRBMDAwMDAwMDA4RUUyNEUzMEM2Cis6MTBCRjQwMDAyNDQyMDAwMTUwNTQwMDAzMDAwMDEwMjE4RUUyNEUzMEM0Cis6MTBCRjUwMDAyNDQyMDAwMUFFRTI0RTMwOEVFMjRFMzAwMDAyMTBDMEFDCis6MTBCRjYwMDAyNDQyNTAzODAyRTIyMDIxMjQwMjAwMDFBQzk1MDAwMDU2Cis6MTBCRjcwMDBBQzgyMDAwNDU2MDAwMDBCMjQxMDAwMDE4RUUyNzI0Q0NCCis6MTBCRjgwMDAzQzA0MDAwMTI0ODQ1OEE4QUZBMDAwMTRBRkEyMDAxMDA0Cis6MTBCRjkwMDA4RUU2NzI0QzhGNDcwMjgwM0MwNTAwMDkwQzAwMjQwMzlBCis6MTBCRkEwMDAzNEE1RjAwODU2MDAwMDAxQUVFMDBFMUM4RUUyMDE4OEI4Cis6MTBCRkIwMDAyNDQyMDAwMUFFRTIwMTg4MDgwMDQwNTA4RUUyMDE4ODcwCis6MTBCRkMwMDA4RjgzMDEyMDI3NjIzODAwMjQ2NjAwMjAwMEMyMTAyQkQ2Cis6MTBCRkQwMDA1MDQwMDAwMTI3NjYzMDAwOEY4MjAxMjgxMEMyMDAwNDAzCis6MTBCRkUwMDAwMDAwMDAwMDhGODIwMTI0MTRDMjAwMDcwMDAwMDAwMDNFCis6MTBCRkYwMDA4RUUyMDFBNDAwMDA4MDIxMjQ0MjAwMDFBRUUyMDFBNEVGCis6MTBDMDAwMDAwODAwNDA0NDhFRTIwMUE0OEVFMjcyNENBQzYyMDAxQzM3Cis6MTBDMDEwMDA4RUU0MDRBODhFRTUwNEFDMjQ2MjAwMUNBQzYyMDAwODI3Cis6MTBDMDIwMDAyNDAyMDAwOEE0NjIwMDBFMjQwMjAwMTFBQzYyMDAxODcxCis6MTBDMDMwMDBBQzY0MDAwMEFDNjUwMDA0OEVFMjA0QzRBQzYyMDAxMDg1Cis6MTBDMDQwMDBBRjg2MDEyMDkyRTI0RTIwMTQ0MDAwMzQyNDEwMDAwMUZCCis6MTBDMDUwMDA4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzgwMkUyMjAyMTBECis6MTBDMDYwMDA4QzgyMDAwMDE0NTUwMDFGMDAwMDAwMDA4RUUzNEUzMDRCCis6MTBDMDcwMDA4RUUyNEUzNDEwNjIwMDFCMDAwMDAwMDA4QzgyMDAwNDJGCis6MTBDMDgwMDAyNDQyMDAwMUFDODIwMDA0OEVFMjRFMzQ4RUUzNEUzMDM2Cis6MTBDMDkwMDAyNDQyMDAwMTEwNTQwMDA3MDAwMDAwMDA4RUUyNEUzNERDCis6MTBDMEEwMDAyNDQyMDAwMTEwNjIwMDA1MDAwMDAwMDAwODAwNDAzMDNBCis6MTBDMEIwMDAwMDAwMDAwMDE0NjAwMDA1MDAwMDAwMDA4RjgyMDEyOENECis6MTBDMEMwMDAyNDQyMDAyMEFGODIwMTI4OEY4MjAxMjg4QzgyMDAwNDQ0Cis6MTBDMEQwMDAyQzQyMDAxMTUwNDAwMDExQUM4MDAwMDAwODAwNDA0NDg4Cis6MTBDMEUwMDAwMDAwMDAwMDhFRTI0RTMwMjQ0MjAwMDE1MDU0MDAwMzU0Cis6MTBDMEYwMDAwMDAwMTAyMThFRTI0RTMwMjQ0MjAwMDFBRUUyNEUzMEFDCis6MTBDMTAwMDA4RUUyNEUzMDAwMDIxMEMwMjQ0MjUwMzgwMkUyMjAyMTVDCis6MTBDMTEwMDAyNDAyMDAwMUFDOTUwMDAwQUM4MjAwMDQxNjAwMDAwQjY0Cis6MTBDMTIwMDAwMDAwMDAwMDhFRTI3MjRDM0MwNDAwMDEyNDg0NThBOEY4Cis6MTBDMTMwMDBBRkEwMDAxNEFGQTIwMDEwOEVFNjcyNEM4RjQ3MDI4MEIxCis6MTBDMTQwMDAzQzA1MDAwOTBDMDAyNDAzMzRBNUYwMDg4RUUyMDE3NEJDCis6MTBDMTUwMDAyNDQyMDAwMUFFRTIwMTc0MDgwMDQwNTc4RUUyMDE3NEVGCis6MTBDMTYwMDAyNDAyMDAwMUFFRTI0RTI0OEY4MzAxMjg4RjgyMDEyNDM1Cis6MTBDMTcwMDAxNDYyRkQ1ODAwMDAwMDAwOEZCRjAwMzA4RkI1MDAyQzA2Cis6MTBDMTgwMDA4RkI0MDAyODhGQjMwMDI0OEZCMjAwMjA4RkIxMDAxQzIxCis6MTBDMTkwMDA4RkIwMDAxODAzRTAwMDA4MjdCRDAwMzgyN0JERkZFODc2Cis6MTBDMUEwMDAyNzg0MDIwODI3NDUwMjAwMjQwNjAwMDhBRkJGMDAxNEI4Cis6MTBDMUIwMDAwQzAwMjQ5QUFGQjAwMDEwMDAwMDIwMjEyNDEwMDAwMUQwCis6MTBDMUMwMDAyNDAyMjQxRkFGOTAwMjEwQUY5MDAyMDBBRjgwMDIwNDNGCis6MTBDMUQwMDBBRjgyMDIxNDhGNDYwMjQ4MjQwMzAwMDQzQzAyMDA0MDUwCis6MTBDMUUwMDAzQzAxMDAwMUFDMjM1Q0M0M0MwMTAwMDFBQzIzNUNDOEYxCis6MTBDMUYwMDAzQzAxMDAwMUFDMjA1RDlDM0MwMTAwMDFBQzIyNUNDMDE0Cis6MTBDMjAwMDAzQzAxMDAwMUFDMjM1Q0M4MEMwMDUxMDgyNDA1MDAwNDZCCis6MTBDMjEwMDAwQzAwNDgyMjAwMDAwMDAwOEVFMjAwMDAzQzAzRkVGRkZDCis6MTBDMjIwMDAzNDYzRkZGRDAwNDMxMDI0QUVFMjAwMDAzQzAyM0MwMEZBCis6MTBDMjMwMDBBRjgyMDIxQzNDMDEwMDAxMDAzNzA4MjFBQzMwODNBQzA2Cis6MTBDMjQwMDA4RkJGMDAxNDhGQjAwMDEwMDNFMDAwMDgyN0JEMDAxODU2Cis6MTBDMjUwMDAyN0JERkZFMDNDMDUwMDA4MzRBNTA0MDBBRkJGMDAxODZGCis6MTBDMjYwMDBBRkEwMDAxMEFGQTAwMDE0OEY4NjAyMDAzQzA0MDAwMUI0Cis6MTBDMjcwMDAyNDg0NTlGMDBDMDAyNDAzMDAwMDM4MjE4RUUyMDI4MDRGCis6MTBDMjgwMDAyNDQyMDAwMUFFRTIwMjgwOEVFMjAyODA4RjgzMDIwMDJGCis6MTBDMjkwMDAzQzAyM0YwMDAwNjIxODI0OEZCRjAwMTgzQzAyMDQwMERCCis6MTBDMkEwMDAwM0UwMDAwODI3QkQwMDIwMjdCREZGRDhBRkJGMDAyMDU2Cis6MTBDMkIwMDBBRkIxMDAxQ0FGQjAwMDE4OEY5MDAyMjA4RUUyMDIxNEM0Cis6MTBDMkMwMDAwMDAwMzgyMTI0NDIwMDAxQUVFMjAyMTQ4RUUyMDIxNDgyCis6MTBDMkQwMDAzQzAyMDMwMDAyMDIxMDI0MTA0MDAwMjczQzExMDQwMDFECis6MTBDMkUwMDAwQzAwNDI5QjAwMDAwMDAwM0MwMjAxMDAwMjAyMTAyNEVFCis6MTBDMkYwMDAxMDQwMDAwNzAwMDAwMDAwOEVFMjAyMTgyNDQyMDAwMUY2Cis6MTBDMzAwMDBBRUUyMDIxODhFRTIwMjE4MDgwMDQwQzYzQzAzRkRGRkIwCis6MTBDMzEwMDA4RUUyMDIxQzI0NDIwMDAxQUVFMjAyMUM4RUUyMDIxQ0VDCis6MTBDMzIwMDAzQzAzRkRGRjM0NjNGRkZGM0MwODA4RkYzNTA4RkZGRkI3Cis6MTBDMzMwMDA4RUUyMDAwMDNDMDQwMDAxMjQ4NDU5RkMzQzA1MDAwODA2Cis6MTBDMzQwMDAwMjAwMzAyMTAwNDMxMDI0QUVFMjAwMDA4RjgyMDIyMDYwCis6MTBDMzUwMDAwMDAwMzgyMTNDMDMwMzAwMDA0ODEwMjQwMDQzMTAyNTRFCis6MTBDMzYwMDBBRjgyMDIyMEFGQTAwMDEwMEMwMDI0MDNBRkEwMDAxNDg1Cis6MTBDMzcwMDAwODAwNDI5NjAwMDAwMDAwMDIxMTEwMjQxMDQwMDAxRjI3Cis6MTBDMzgwMDAzQzAyNDAwMDhGODMwMjI0MjQwMjE0MDIxNDYyMDAwQjNBCis6MTBDMzkwMDAzQzAzRkRGRjNDMDQwMDAxMjQ4NDVBMDgzQzA1MDAwOENFCis6MTBDM0EwMDBBRkEwMDAxMEFGQTAwMDE0OEY4NjAyMjQzNEE1RkZGRkI5Cis6MTBDM0IwMDAwQzAwMjQwMzAwMDAzODIxM0MwM0ZERkY4RUUyMDAwMDQ2Cis6MTBDM0MwMDAzNDYzRkZGRjAyMDAyMDIxMDA0MzEwMjQwQzAwNEU1NDcwCis6MTBDM0QwMDBBRUUyMDAwMDhFRTIwMjIwMjQ0MjAwMDFBRUUyMDIyMDIyCis6MTBDM0UwMDA4RUUyMDIyMDhGODIwMjIwM0MwMzA4RkYzNDYzRkZGRkFECis6MTBDM0YwMDAwMDQzMTAyNDA4MDA0Mjk1MDA1MTEwMjUwMjAyMTAyNDI5Cis6MTBDNDAwMDAxMDQwMDE0MjAwMDAwMDAwOEVFMjAyMkMyNDQyMDAwMTk0Cis6MTBDNDEwMDBBRUUyMDIyQzhFRTIwMjJDOEY4MjAyMjAzQzAzMDhGRjQ3Cis6MTBDNDIwMDAzNDYzRkZGRjAwNDMxMDI0MzQ0MjAwMDRBRjgyMDIyMDMzCis6MTBDNDMwMDA4RjgzMDA1NDhGODIwMDU0MDgwMDQxMEUyNDYzMDAwMjUxCis6MTBDNDQwMDA4RjgyMDA1NDAwNjIxMDIzMkM0MjAwMDMxNDQwRkZGQzMyCis6MTBDNDUwMDAwMDAwMDAwMDhGODYwMEUwOEY4NDAwRTQzMEMyMDAwN0Y3Cis6MTBDNDYwMDAxMDQwMDAxMjAwMDAwMDAwOEY4MzAwRTQyNDAyRkZGODU3Cis6MTBDNDcwMDAwMEMyMTAyNDEwNDMwMDBEMDAwMDAwMDA4RjgyMDA1NDAxCis6MTBDNDgwMDA4RjgzMDBFMDE0QzMwMDA5MjQ0NDAwNTA4RjgyMDA1NEJECis6MTBDNDkwMDAwMDgyMTAyMzJDNDIwMDUxMTA0MDAwMDQwMDAwMDAwMEQ0Cis6MTBDNEEwMDA4RjgyMDBFMDEwQzJGRkY5MDAwMDAwMDA4RjgyMDIyMDlFCis6MTBDNEIwMDAzQzAzMDhGRjM0NjNGRkZEMDA0MzEwMjRBRjgyMDIyMEQ5Cis6MTBDNEMwMDA4Rjg2MDBFMDMwQzIwMDA3MTA0MDAwMDMyNDAyRkZGODBFCis6MTBDNEQwMDAwMEMyMzAyNEFGODYwMEUwOEY4MzAwQzQzQzAyMDAxRkZFCis6MTBDNEUwMDAzNDQyRkZGRjI0NjgwMDA4MDA0ODEwMkIxMDQwMDAwMzZFCis6MTBDNEYwMDAzQzAyRkZGNTM0NDIxMDAwMDEwMjQwMjE4RjhCMDBDODNFCis6MTBDNTAwMDA4Rjg1MDEyMDhGODQwMTI0MDgwMDQxNDUwMDAwNjAyMUFGCis6MTBDNTEwMDAyNzYyMzgwMDAwODIxMDJCNTA0MDAwMDEyNzY0MzAwMDUxCis6MTBDNTIwMDAxMEE0MDAxMDMxODIwMEZGOEM4MjAwMTgzODQzMDAwN0VECis6MTBDNTMwMDAyQzYzMDAwMTM4NDIwMDBCMkM0MjAwMDEwMDYyMTgyNUQ4Cis6MTBDNTQwMDA1MDYwRkZGMzI0ODQwMDIwOEVFMjAyNDAyNDBDMDAwMTlFCis6MTBDNTUwMDAyNDQyMDAwMUFFRTIwMjQwOEVFMjAyNDA4QzhCMDAwOEQxCis6MTBDNTYwMDAzMTgyMDBGRjE0NDAwMDY1MDAwMDAwMDAzQzAyMDAwMTIxCis6MTBDNTcwMDAwMDU3MTAyMTkwNDI4M0MwMTQ0MDAwNjAwMDAwMDAwMDZBCis6MTBDNTgwMDA4Rjg0MDBFNDAwQzQxMDIzMDAwMjE4QzMwNDYyMDAwMTc5Cis6MTBDNTkwMDAyNDYzMDIwMDhGODkwMEM0MTA2MDAwMDUyNDAyMDAwMTlBCis6MTBDNUEwMDAxMDYyMDAwOTAwMDAwMDAwMDgwMDQxODcwMDAwMDAwMDQwCis6MTBDNUIwMDA4RUUyMDIzMDAxMjA1ODIxMjQ0MjAwMDFBRUUyMDIzMDE2Cis6MTBDNUMwMDAwODAwNDFCQzhFRTIwMjMwOEVFMjAyMzQzQzA1MDAwQUQzCis6MTBDNUQwMDAyNDQyMDAwMUFFRTIwMjM0OEM4QjAwMDAzNEE1RjAwMDRFCis6MTBDNUUwMDA4RUUyMDIzNDAxMkIxODIzMDBBMzEwMkI1NDQwMDAwMUNCCis6MTBDNUYwMDAwMDY1MTgyMTJDNjIyMzNGMTQ0MDAwNDAwMDAwMDAwMDE5Cis6MTBDNjAwMDA4RjgyMDBFODI0NDIwMDA4QUY4MjAwRTg4RjgyMDBFOEIxCis6MTBDNjEwMDA4RjgyMDBFNDAxMjA1ODIxMjQ0MjAwMDhBRjgyMDBFNDA4Cis6MTBDNjIwMDAwODAwNDFCQzhGODIwMEU0OEVFMjAyMzgzQzAzMDAwQTFECis6MTBDNjMwMDAyNDQyMDAwMUFFRTIwMjM4OEM4NDAwMDAzNDYzRjAwMDMyCis6MTBDNjQwMDA4RUUyMDIzODAwODgzODIzMDA2NzEwMkI1NDQwMDAwMTI2Cis6MTBDNjUwMDAwMEUzMzgyMTNDMDIwMDAzMzQ0MjBENDAwMDQ3MTAyQjE4Cis6MTBDNjYwMDAxMDQwMDAwMzAwMDAwMDAwMDgwMDQxQkMwMDgwNTgyMTc5Cis6MTBDNjcwMDA4RjgyMDBFNDI0NDQwMDA4QUY4NDAwRTQ4Rjg0MDBFNDQ3Cis6MTBDNjgwMDAxMDg2MDAxODNDMDUwMDBBMzRBNUYwMDAzQzBBMDAwMzlGCis6MTBDNjkwMDAzNTRBMEQ0MDhFRTIwMDdDMjQ0MjAwMDFBRUUyMDA3QzZGCis6MTBDNkEwMDA4QzgzMDAwMDhFRTIwMDdDMDA2ODM4MjMwMEE3MTAyQkVBCis6MTBDNkIwMDA1NDQwMDAwMTAwRTUzODIxMDE0NzEwMkI1NDQwMDAwNzg5Cis6MTBDNkMwMDAwMDYwNTgyMThGODIwMEU0MjQ0NDAwMDhBRjg0MDBFNDE1Cis6MTBDNkQwMDA4Rjg0MDBFNDE0ODZGRkVGMDAwMDAwMDAxNDg2MDAwNTNDCis6MTBDNkUwMDAwMDAwMDAwMDAxMjA1ODIxQUY4NjAwRTQwODAwNDFCQzkyCis6MTBDNkYwMDBBRjg2MDBFOEFGODQwMEU0QUY4NDAwRTg4RjgyMDBDODEyCis6MTBDNzAwMDAzQzAzMDAwQTM0NjNGMDAwMDA0ODM4MjMwMDY3MTAyQjE0Cis6MTBDNzEwMDA1NDQwMDAwMTAwRTMzODIxM0MwMjAwMDMzNDQyMEQzRjQ1Cis6MTBDNzIwMDAwMDQ3MTAyQjU0NDAwMDA3MDAwMDYwMjEwMTY4MzgyM0E3Cis6MTBDNzMwMDAwMDY3MTAyQjU0NDAwMDAzMDBFMzM4MjEwODAwNDFDRjZDCis6MTBDNzQwMDAzQzAyMDAwMzNDMDIwMDAzMzQ0MjBEM0YwMDQ3MTAyQjIzCis6MTBDNzUwMDAxNDQwMDAxNjMxODIwMEZGMTQ0MDAwMDYwMDAwMDAwMDYzCis6MTBDNzYwMDAzQzAyMDAwMTAwNTcxMDIxOTA0MjgzQzAxMDQwMDAwRjhFCis6MTBDNzcwMDAwMDAwMDAwMDhFRTIwMjNDM0MwNEZERkY4RUUzMDAwMDVFCis6MTBDNzgwMDAzNDg0RkZGRjI0NDIwMDAxQUVFMjAyM0M4RUUyMDIzQzEwCis6MTBDNzkwMDAyNDAyMDAwMTAwNjQxODI0M0MwMTAwMDEwMDM3MDgyMTM0Cis6MTBDN0EwMDBBMDIyODNCODA4MDA0MjJDQUVFMzAwMDBBRjhCMDBDODgzCis6MTBDN0IwMDA4RjgzMDBDODhGODIwMEM0M0MwNDAwMEEzNDg0RjAwMEQ4Cis6MTBDN0MwMDAwMDYyMzgyMzAwODcxMDJCNTQ0MDAwMDEwMEU0MzgyMTE4Cis6MTBDN0QwMDAzQzAyMDAwMzM0NDIwRDQwMDA0NzEwMkIyQ0UzMDAwMUMzCis6MTBDN0UwMDAwMDQzMTAyNTEwNDAwMDA4MDAwMDAwMDA4RjgyMDIyMDQ2Cis6MTBDN0YwMDAzQzAzMDhGRjM0NjNGRkZGMDA0MzEwMjQzQzAzNDAwMDY4Cis6MTBDODAwMDAwMDQzMTAyNUFGODIwMjIwOEY4NjAwRTA4Rjg0MDBFNDcxCis6MTBDODEwMDAxMEM0MDAyQTAwMDAwMDAwOEVFMjAwN0MyNDQyMDAwMUM3Cis6MTBDODIwMDBBRUUyMDA3QzhFRTIwMDdDMjRDMkZGRjhBRjgyMDBFMDIyCis6MTBDODMwMDAzQzAyMDAwMThDNDI3RTMwM0MwMzAwMDg4Rjg2MDBFMDAxCis6MTBDODQwMDAwMDQzMTAyNDEwNDAwMDFEMDAwMDAwMDAxMEM0MDAxQjE1Cis6MTBDODUwMDAyNDBERkZGODNDMEEwMDBBMzU0QUYwMDAzQzBDMDA4MDI5Cis6MTBDODYwMDAyNDg1MDAwODI3NjIyODAwNTBBMjAwMDEyNzY1MTgwMENGCis6MTBDODcwMDA4Qzg4MDAwNDhDODIwMDAwOENBOTAwMDAzMTAzRkZGRjJCCis6MTBDODgwMDAwMDQzMTAyMTAwNEQxMDI0MjQ0MzAwMTAwMDZCMTAyQjk2Cis6MTBDODkwMDA1NDQwMDAwMTAwNkExODIxMDEyQjEwMkI1NDQwMDAwMTY0Cis6MTBDOEEwMDAwMTJBNDgyMTEwNjkwMDAyMDEwQzEwMjVBQzgyMDAwNDA1Cis6MTBDOEIwMDAwMEEwMjAyMTE0QzRGRkVCMjQ4NTAwMDg4RjgyMDIyMEYxCis6MTBDOEMwMDAzQzAzMDhGRjM0NjNGRkZGMDA0MzEwMjQzNDQyMDAwMjlFCis6MTBDOEQwMDBBRjgyMDIyMDhGODMwMDU0OEY4MjAwNTQwODAwNDIzN0I5Cis6MTBDOEUwMDAyNDYzMDAwMThGODIwMDU0MDA2MjEwMjMyQzQyMDAwMjU2Cis6MTBDOEYwMDAxNDQwRkZGQzAwMDAwMDAwOEY4MjAyMjAzQzAzMDhGRjcwCis6MTBDOTAwMDAzNDYzRkZGQjAwNDMxMDI0QUY4MjAyMjAwNjAxMDA1NTcwCis6MTBDOTEwMDAwMDAwMDAwMDhFRTIwMjI4MjQ0MjAwMDFBRUUyMDIyODVDCis6MTBDOTIwMDA4RUUyMDIyODhGODIwMjIwM0MwMzA4RkYzNDYzRkZGRjVGCis6MTBDOTMwMDAwMDQzMTAyNDM0NDIwMDA0QUY4MjAyMjA4RjgzMDA1NDRECis6MTBDOTQwMDA4RjgyMDA1NDA4MDA0MjUxMjQ2MzAwMDI4RjgyMDA1NEY5Cis6MTBDOTUwMDAwMDYyMTAyMzJDNDIwMDAzMTQ0MEZGRkMwMDAwMDAwMDgyCis6MTBDOTYwMDA4Rjg2MDBFMDMwQzIwMDA3MTA0MDAwMTIwMDAwMDAwMDc3Cis6MTBDOTcwMDA4RjgzMDBFNDI0MDJGRkY4MDBDMjEwMjQxMDQzMDAwRDRFCis6MTBDOTgwMDAwMDAwMDAwMDhGODIwMDU0OEY4MzAwRTAxNEMzMDAwOTcwCis6MTBDOTkwMDAyNDQ0MDAzMjhGODIwMDU0MDA4MjEwMjMyQzQyMDAzMzQyCis6MTBDOUEwMDAxMDQwMDAwNDAwMDAwMDAwOEY4MjAwRTAxMEMyRkZGOTc4Cis6MTBDOUIwMDAwMDAwMDAwMDhGODIwMjIwM0MwMzA4RkYzNDYzRkZGRDZCCis6MTBDOUMwMDAwMDQzMTAyNEFGODIwMjIwOEY4NjAwRTAzMEMyMDAwN0FGCis6MTBDOUQwMDAxMDQwMDAwMzI0MDJGRkY4MDBDMjMwMjRBRjg2MDBFMEJDCis6MTBDOUUwMDAyNDAzMDFGNThGODIwMEU4MDA2NzM4MjMwMDA3MThDMDkwCis6MTBDOUYwMDAwMDQzMTAyMUFGODIwMEU4OEY4MjAwRThBRjgyMDBFNDlDCis6MTBDQTAwMDA4RUUyMDA3QzNDMDQwOEZGMzQ4NEZGRkYwMDQ3MTAyMUM1Cis6MTBDQTEwMDBBRUUyMDA3QzhGODIwMjIwM0MwMzgwMDAzNDYzMDAwMjdGCis6MTBDQTIwMDAwMDQ0MTAyNDAwNDMxMDI1QUY4MjAyMjA4RjgzMDA1NDVECis6MTBDQTMwMDA4RjgyMDA1NDA4MDA0MjhEMjQ2MzAwMDE4RjgyMDA1NENECis6MTBDQTQwMDAwMDYyMTAyMzJDNDIwMDAyMTQ0MEZGRkMwMDAwMDAwMDkyCis6MTBDQTUwMDA4RjgyMDIyMDNDMDMwOEZGMzQ2M0ZGRkIwMDQzMTAyNDU1Cis6MTBDQTYwMDBBRjgyMDIyMDhGQkYwMDIwOEZCMTAwMUM4RkIwMDAxODUyCis6MTBDQTcwMDAwM0UwMDAwODI3QkQwMDI4M0MwMjAwMDE4QzQyNUNEODdFCis6MTBDQTgwMDAyN0JERkZEODEwNDAwMDEyQUZCRjAwMjAzQzA0MDAwMUJBCis6MTBDQTkwMDAyNDg0NUExNDNDMDUwMDA4MjQwMjAwMDEzQzAxMDAwMUQyCis6MTBDQUEwMDAwMDM3MDgyMUFDMjI4M0FDQUZBMDAwMTBBRkEwMDAxNDY3Cis6MTBDQUIwMDA4Rjg2MDIyMDM0QTUwNDk4M0MwMTAwMDFBQzIwNUNEODhDCis6MTBDQUMwMDAzQzAxMDAwMUFDMjI1Q0NDMEMwMDI0MDMwMDAwMzgyMUE2Cis6MTBDQUQwMDA4RjQyMDI2ODNDMDM3RkZGMzQ2M0ZGRkYwMDQzMTAyNDUyCis6MTBDQUUwMDBBRjQyMDI2ODhFRTIwNEQwOEVFNDA0RDQyNDAzRkZGRTM5Cis6MTBDQUYwMDAwMDQzMTAyNDMwODQwMDAyMTA4MDAxMUVBRUUyMDREMEY2Cis6MTBDQjAwMDA4RUUyMDRENDI0MDNGRkZEMDA0MzEwMjRBRUUyMDRENERCCis6MTBDQjEwMDA4RjgyMDA0NDNDMDMwNjAwMzQ2MzIwMDAzNDQyMDAyMDJFCis6MTBDQjIwMDBBRjgyMDA0NEFGQTMwMDE4OEVFMjA2MDg4RjQzMDIyOEFDCis6MTBDQjMwMDAyNDQyMDAwMTMwNEEwMEZGNTE0MzAwRkVBRkEwMDAxMDI0Cis6MTBDQjQwMDA4RUUyMDYwODAwMDIxMEMwMDA1NzEwMjE4RkEzMDAxOEMzCis6MTBDQjUwMDA4RkE0MDAxQ0FDNDMwNjBDQUM0NDA2MTA4RjgzMDA1NDE5Cis6MTBDQjYwMDA4RjgyMDA1NDI0NjkwMDMyMDEyMjEwMjMyQzQyMDAzM0FBCis6MTBDQjcwMDAxMDQwMDA2QTAwMDA1ODIxMjQxODAwMDgyNDBGMDAwREZFCis6MTBDQjgwMDAyNDBEMDAwNzI0MEMwMDQwMjQwRTAwMDE4Rjg3MDEyMDkzCis6MTBDQjkwMDAyNzYyMzgwMDI0RTgwMDIwMDEwMjEwMkI1MDQwMDAwMUQ5Cis6MTBDQkEwMDAyNzY4MzAwMDhGODIwMTI4MTEwMjAwMDQwMDAwMDAwMDc1Cis6MTBDQkIwMDA4RjgyMDEyNDE1MDIwMDA3MDAwMDEwMjE4RUUyMDFBNERCCis6MTBDQkMwMDAwMDAwMjgyMTI0NDIwMDAxQUVFMjAxQTQwODAwNDMzREY4Cis6MTBDQkQwMDA4RUUyMDFBNDhFRTQwNjA4MDAwNDIwQzAwMDgwMTgyMTIzCis6MTBDQkUwMDA4RUU0MDQzMDhFRTUwNDM0MDBBMzI4MjEwMEEzMzAyQjBBCis6MTBDQkYwMDAwMDgyMjAyMTAwODYyMDIxQUNFNDAwMDBBQ0U1MDAwNDg2Cis6MTBDQzAwMDA4RUUyMDYwOEE0RjgwMDBFQUNFRjAwMThBQ0VBMDAxQzk3Cis6MTBDQzEwMDAwMDAyMTBDMDI0NDIwNjBDMDJFMjEwMjFBQ0UyMDAwODFGCis6MTBDQzIwMDA4RUUyMDRDNEFDRTIwMDEwQUY4ODAxMjA5MkUyNEUyMEY0Cis6MTBDQzMwMDAxNDQwMDAzMzI0MDUwMDAxOEVFMjRFMzAwMDAyMTBDMDgzCis6MTBDQzQwMDAyNDQyNTAzODAyRTIyMDIxOEM4MjAwMDAxNDREMDAxRjQzCis6MTBDQzUwMDAwMDAwMDAwMDhFRTM0RTMwOEVFMjRFMzQxMDYyMDAxQjY2Cis6MTBDQzYwMDAwMDAwMDAwMDhDODIwMDA0MjQ0MjAwMDFBQzgyMDAwNDE5Cis6MTBDQzcwMDA4RUUyNEUzNDhFRTM0RTMwMjQ0MjAwMDExMDRDMDAwNzA5Cis6MTBDQzgwMDAwMDAwMDAwMDhFRTI0RTM0MjQ0MjAwMDExMDYyMDAwNUQ0Cis6MTBDQzkwMDAwMDAwMDAwMDA4MDA0MzJBMDAwMDAwMDAxNDYwMDAwNUE2Cis6MTBDQ0EwMDAwMDAwMDAwMDhGODIwMTI4MjQ0MjAwMjBBRjgyMDEyODZBCis6MTBDQ0IwMDA4RjgyMDEyODhDODIwMDA0MkM0MjAwMTE1MDQwMDAxMDA5Cis6MTBDQ0MwMDBBQzgwMDAwMDA4MDA0MzNEMDAwMDAwMDA4RUUyNEUzMEMyCis6MTBDQ0QwMDAyNDQyMDAwMTUwNEMwMDAzMDAwMDEwMjE4RUUyNEUzMDJGCis6MTBDQ0UwMDAyNDQyMDAwMUFFRTI0RTMwOEVFMjRFMzAwMDAyMTBDMDBGCis6MTBDQ0YwMDAyNDQyNTAzODAyRTIyMDIxQUM4RDAwMDBBQzhFMDAwNEFBCis6MTBDRDAwMDA1NEEwMDAwNjI0MEIwMDAxOEY4MjAwNTQwMTIyMTAyMzNFCis6MTBDRDEwMDAyQzQyMDAzMzE0NDBGRjlEMDAwMDAwMDAzMTYzMDBGRkVGCis6MTBDRDIwMDAyNDAyMDAwMTU0NjIwMDc5QUZBMDAwMTBBRUVBMDYwOEE4Cis6MTBDRDMwMDA4RjgzMDA1NDhGODIwMDU0MjQ2OTAwMzIwMTIyMTAyMzEzCis6MTBDRDQwMDAyQzQyMDAzMzEwNDAwMDYxMDAwMDU4MjEyNDBEMDAwOERGCis6MTBDRDUwMDAyNDBDMDAxMTI0MDgwMDEyMjQwNzAwNDAyNDBBMDAwMUJBCis6MTBDRDYwMDA4RjgzMDEyMDI3NjIzODAwMjQ2NjAwMjAwMEMyMTAyQjI4Cis6MTBDRDcwMDA1MDQwMDAwMTI3NjYzMDAwOEY4MjAxMjgxMEMyMDAwNDU1Cis6MTBDRDgwMDAwMDAwMDAwMDhGODIwMTI0MTRDMjAwMDcwMDAwMDAwMDkwCis6MTBDRDkwMDA4RUUyMDFBNDAwMDAyODIxMjQ0MjAwMDFBRUUyMDFBNDk5Cis6MTBDREEwMDAwODAwNDNBOThFRTIwMUE0OEVFMjA2MDhBQzYyMDAxQ0QyCis6MTBDREIwMDA4RUU0MDRBMDhFRTUwNEE0MjQ2MjAwMUNBQzYyMDAwODhBCis6MTBDREMwMDBBNDZEMDAwRUFDNkMwMDE4QUM2NDAwMDBBQzY1MDAwNEVGCis6MTBDREQwMDA4RUUyMDRDNEFDNjIwMDEwQUY4NjAxMjA5MkUyNEUyMEM1Cis6MTBDREUwMDAxNDQwMDAzMzI0MDUwMDAxOEVFMjRFMzAwMDAyMTBDMEQyCis6MTBDREYwMDAyNDQyNTAzODAyRTIyMDIxOEM4MjAwMDAxNDQ4MDAxRjk3Cis6MTBDRTAwMDAwMDAwMDAwMDhFRTM0RTMwOEVFMjRFMzQxMDYyMDAxQkI0Cis6MTBDRTEwMDAwMDAwMDAwMDhDODIwMDA0MjQ0MjAwMDFBQzgyMDAwNDY3Cis6MTBDRTIwMDA4RUUyNEUzNDhFRTM0RTMwMjQ0MjAwMDExMDQ3MDAwNzVDCis6MTBDRTMwMDAwMDAwMDAwMDhFRTI0RTM0MjQ0MjAwMDExMDYyMDAwNTIyCis6MTBDRTQwMDAwMDAwMDAwMDA4MDA0Mzk2MDAwMDAwMDAxNDYwMDAwNTg4Cis6MTBDRTUwMDAwMDAwMDAwMDhGODIwMTI4MjQ0MjAwMjBBRjgyMDEyOEI4Cis6MTBDRTYwMDA4RjgyMDEyODhDODIwMDA0MkM0MjAwMTE1MDQwMDAxMDU3Cis6MTBDRTcwMDBBQzgwMDAwMDA4MDA0M0E5MDAwMDAwMDA4RUUyNEUzMEE0Cis6MTBDRTgwMDAyNDQyMDAwMTUwNDcwMDAzMDAwMDEwMjE4RUUyNEUzMDgyCis6MTBDRTkwMDAyNDQyMDAwMUFFRTI0RTMwOEVFMjRFMzAwMDAyMTBDMDVECis6MTBDRUEwMDAyNDQyNTAzODAyRTIyMDIxQUM4ODAwMDBBQzhBMDAwNDAxCis6MTBDRUIwMDA1NEEwMDAwNjI0MEIwMDAxOEY4MjAwNTQwMTIyMTAyMzhECis6MTBDRUMwMDAyQzQyMDAzMzE0NDBGRkE2MDAwMDAwMDAzMTYzMDBGRjM1Cis6MTBDRUQwMDAyNDAyMDAwMTU0NjIwMDAzQUZBMDAwMTAwODAwNDNENkYyCis6MTBDRUUwMDAwMDAwMDAwMDNDMDQwMDAxMjQ4NDVBMjBBRkEwMDAxNDdDCis6MTBDRUYwMDA4Rjg2MDEyMDhGODcwMTI0M0MwNTAwMDkwQzAwMjQwMzQ0Cis6MTBDRjAwMDAzNEE1RjAxMTA4MDA0M0Q2MDAwMDAwMDAzQzA0MDAwMUU1Cis6MTBDRjEwMDAyNDg0NUEyQ0FGQTAwMDE0OEY4NjAxMjA4Rjg3MDEyNDBGCis6MTBDRjIwMDAzQzA1MDAwOTBDMDAyNDAzMzRBNUYwMTAwODAwNDNENjhBCis6MTBDRjMwMDAwMDAwMDAwMDNDMDQwMDAxMjQ4NDVBMzhBRkEwMDAxNDEzCis6MTBDRjQwMDA4RUU2MDYwODhGNDcwMjI4M0MwNTAwMDkwQzAwMjQwM0UyCis6MTBDRjUwMDAzNEE1RjAwRjhFRTIwMUFDMjQ0MjAwMDFBRUUyMDFBQzM4Cis6MTBDRjYwMDA4RUUyMDFBQzhFRTIwMTVDMjQ0MjAwMDFBRUUyMDE1QzgzCis6MTBDRjcwMDA4RUUyMDE1QzhGQkYwMDIwMDNFMDAwMDgyN0JEMDAyODdGCis6MTBDRjgwMDAzQzAyMDAwMThDNDI1Q0Q4MjdCREZGRTAxNDQwMDAwRDNDCis6MTBDRjkwMDBBRkJGMDAxODNDMDQwMDAxMjQ4NDVBNDQzQzA1MDAwODNCCis6MTBDRkEwMDBBRkEwMDAxMEFGQTAwMDE0OEY4NjAyMjAzNEE1MDQ5OTEyCis6MTBDRkIwMDAyNDAyMDAwMTNDMDEwMDAxQUMyMjVDRDgwQzAwMjQwM0Q3Cis6MTBDRkMwMDAwMDAwMzgyMThFRTIwNEQwM0MwMzAwMDEwMDc3MTgyMUQ0Cis6MTBDRkQwMDA5NDYzODNCMjM0NDIwMDAxMTA2MDAwMDdBRUUyMDREMEQzCis6MTBDRkUwMDA4RjgyMDIyMDNDMDMwOEZGMzQ2M0ZGRkYwMDQzMTAyNEJDCis6MTBDRkYwMDAzNDQyMDAwOEFGODIwMjIwMDAwMDIwMjEwQzAwNTJBMjFGCis6MTBEMDAwMDAyNDA1MDAwNEFGNDIwMjY4OEZCRjAwMTgwM0UwMDAwODQ3Cis6MTBEMDEwMDAyN0JEMDAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBDCis6MTBEMDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCis6MTBEMDMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEYwCis6MTBEMDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUwCis6MTBEMDUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEQwCis6MTBEMDYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEMwCis6MTBEMDcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEIwCis6MTBEMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEEwCis6MTBEMDkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDkwCis6MTBEMEEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDgwCis6MTBEMEIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDcwCis6MTBEMEMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDYwCis6MTBEMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDUwCis6MTBEMEUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQwCis6MTBEMEYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDMwCis6MTBEMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzQzEyMDAwMUQwCis6MTBEMTEwMDAyNjUyMTIwMDNDMTQwMDAxOEU5NDVDNTAzQzEwMDAwMTE5Cis6MTBEMTIwMDAyNjEwMTEyMDNDMTVDMDAwMzZCNTAwNjA4RThBMDAwMDI0Cis6MTBEMTMwMDA4RUIzMDAwMDAyNkE0MDBCMDI0ODAwMEEwMjAwRjgyMTg4Cis6MTBEMTQwMDAwMDAwMDAwMDAwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMEQyCis6MTBEMTUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMENGCis6MTBEMTYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEJGCis6MTBEMTcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEFGCis6MTBEMTgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDlGCis6MTBEMTkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDhGCis6MTBEMUEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDdGCis6MTBEMUIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDZGCis6MTBEMUMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDVGCis6MTBEMUQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDRGCis6MTBEMUUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDNGCis6MTBEMUYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDJGCis6MTBEMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODAwMTRENjJDCis6MTBEMjEwMDAwMDAwMDAwMDA4MDAxNEQ4M0MwQTAwMDEwODAwMTREOERGCis6MTBEMjIwMDAzQzBBMDAwMjA4MDAxNEQ4MDAwMDAwMDAwODAwMjRBNkYwCis6MTBEMjMwMDAwMDAwMDAwMDA4MDAxNEQ4M0MwQTAwMDMwODAwMTREOEJECis6MTBEMjQwMDAzQzBBMDAwNDA4MDAyRjhDMDAwMDAwMDAwODAwMTREOERECis6MTBEMjUwMDAzQzBBMDAwNTA4MDAzQ0U4MDAwMDAwMDAwODAwM0M2NkFECis6MTBEMjYwMDAwMDAwMDAwMDA4MDAxNEQ4M0MwQTAwMDYwODAwMTREODhBCis6MTBEMjcwMDAzQzBBMDAwNzA4MDAxNEQ4MDAwMDAwMDAwODAwMTREODc5Cis6MTBEMjgwMDAwMDAwMDAwMDA4MDAxNEQ4MDAwMDAwMDAwODAwMkE3NTAzCis6MTBEMjkwMDAwMDAwMDAwMDA4MDAxNEQ4M0MwQTAwMEIwODAwMTREODU1Cis6MTBEMkEwMDAzQzBBMDAwQzA4MDAxNEQ4M0MwQTAwMEQwODAwMjM3QTQwCis6MTBEMkIwMDAwMDAwMDAwMDA4MDAyMzM5MDAwMDAwMDAwODAwMTREODE2Cis6MTBEMkMwMDAzQzBBMDAwRTA4MDAxQjNDMDAwMDAwMDAwODAwMjRBNERCCis6MTBEMkQwMDAwMDAwMDAwMDA4MDAxNEQ4M0MwQTAwMEYwODAwNDBBNzE2Cis6MTBEMkUwMDAwMDAwMDAwMDA4MDA0MDkxMDAwMDAwMDAwODAwMTREODcxCis6MTBEMkYwMDAzQzBBMDAxMDA4MDAxNEVFMDAwMDAwMDAwODAwMTREOERBCis6MTBEMzAwMDAzQzBBMDAxMTA4MDAxNEQ4M0MwQTAwMTIwODAwMTREODg2Cis6MTBEMzEwMDAzQzBBMDAxMzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEI0Cis6MTBEMzIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEZECis6MTBEMzMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEVECis6MTBEMzQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMERECis6MTBEMzUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMENECis6MTBEMzYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEJECis6MTBEMzcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEFECis6MTBEMzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDlECis6MTBEMzkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDhECis6MTBEM0EwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDdECis6MTBEM0IwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDZECis6MTBEM0MwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDVECis6MTBEM0QwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDRECis6MTBEM0UwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDNECis6MTBEM0YwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDJECis6MTBENDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzQzAzMDAwMURDCis6MTBENDEwMDAzNDYzMzgwMDI0MDUwMDgwMjQwNDAwMUYyNDA2RkZGRjI1Cis6MTBENDIwMDAyNDAyMDAwMUFGODAwMjFDQUY4MjAyMDBBRjgyMDIyMDAyCis6MTBENDMwMDAwMzYzMTAyMUFGODIwMEMwMDM2MzEwMjFBRjgyMDBDNEQ4Cis6MTBENDQwMDAwMzYzMTAyMUFGODIwMEM4Mjc2MjM4MDBBRjgyMDBEMDhBCis6MTBENDUwMDAyNzYyMzgwMEFGODIwMEQ0Mjc2MjM4MDBBRjgyMDBEODNDCis6MTBENDYwMDAyNzYyMTgwMEFGODIwMEUwMjc2MjE4MDBBRjgyMDBFNDU0Cis6MTBENDcwMDAyNzYyMTgwMEFGODIwMEU4Mjc2MjEwMDBBRjgyMDBGMDM4Cis6MTBENDgwMDAyNzYyMTAwMEFGODIwMEY0Mjc2MjEwMDBBRjgyMDBGODFDCis6MTBENDkwMDBBQ0EwMDAwMDI0ODRGRkZGMTQ4NkZGRkQyNEE1MDAwNDM3Cis6MTBENEEwMDA4RjgzMDA0MDNDMDJGMDAwMDA2MjE4MjQzQzAyNTAwMEQwCis6MTBENEIwMDAxMDYyMDAwQzAwNDMxMDJCMTQ0MDAwMDYzQzAyNjAwMDc4Cis6MTBENEMwMDAzQzAyNDAwMDEwNjIwMDA4MjQwMjA4MDAwODAwNDUzOUIwCis6MTBENEQwMDAwMDAwMDAwMDEwNjIwMDA0MjQwMjA4MDAwODAwNDUzOTIyCis6MTBENEUwMDAwMDAwMDAwMDI0MDIwNzAwM0MwMTAwMDFBQzIyNUNEQ0NCCis6MTBENEYwMDAwM0UwMDAwODAwMDAwMDAwMjdCREZGRDhBRkJGMDAyNEY0Cis6MTBENTAwMDBBRkIwMDAyMDhGODMwMDU0OEY4MjAwNTQzQzAxMDAwMTkzCis6MTBENTEwMDBBQzIwNUNDNDA4MDA0NTQ1MjQ2MzAwNjQ4RjgyMDA1NDNECis6MTBENTIwMDAwMDYyMTAyMzJDNDIwMDY1MTQ0MEZGRkMwMDAwMDAwMDQ0Cis6MTBENTMwMDAwQzAwNEQ3MTAwMDAwMDAwMjQwNDAwMDEwMDAwMjgyMUFGCis6MTBENTQwMDAyN0E2MDAxODM0MDI4MDAwMEMwMDQ5OEVBN0EyMDAxOEZDCis6MTBENTUwMDA4RjgzMDA1NDhGODIwMDU0MDgwMDQ1NTYyNDYzMDA2NDcyCis6MTBENTYwMDA4RjgyMDA1NDAwNjIxMDIzMkM0MjAwNjUxNDQwRkZGQzlGCis6MTBENTcwMDAyNDA0MDAwMTI0MDUwMDAxMEMwMDQ5NEMyN0E2MDAxOEQyCis6MTBENTgwMDA4RjgzMDA1NDhGODIwMDU0MDgwMDQ1NjIyNDYzMDA2NDM2Cis6MTBENTkwMDA4RjgyMDA1NDAwNjIxMDIzMkM0MjAwNjUxNDQwRkZGQzZGCis6MTBENUEwMDAyNDA0MDAwMTI0MDUwMDAxMEMwMDQ5NEMyN0E2MDAxOEEyCis6MTBENUIwMDA4RjgzMDA1NDhGODIwMDU0MDgwMDQ1NkUyNDYzMDA2NEZBCis6MTBENUMwMDA4RjgyMDA1NDAwNjIxMDIzMkM0MjAwNjUxNDQwRkZGQzNGCis6MTBENUQwMDAyNDA0MDAwMTNDMDYwMDAxMjRDNjVEQTAwQzAwNDk0QzU3Cis6MTBENUUwMDAyNDA1MDAwMjhGODMwMDU0OEY4MjAwNTQwODAwNDU3QjdECis6MTBENUYwMDAyNDYzMDA2NDhGODIwMDU0MDA2MjEwMjMyQzQyMDA2NTczCis6MTBENjAwMDAxNDQwRkZGQzI0MDQwMDAxMjQwNTAwMDMzQzEwMDAwMTI5Cis6MTBENjEwMDAyNjEwNURBMjBDMDA0OTRDMDIwMDMwMjE5N0E2MDAxODhDCis6MTBENjIwMDAzQzA3MDAwMTk0RTc1REEwM0MwNDAwMDEyNDg0NUFCMDRCCis6MTBENjMwMDBBRkEwMDAxNDk2MDIwMDAwM0MwNTAwMEQzNEE1MDEwMEM3Cis6MTBENjQwMDAwQzAwMjQwM0FGQTIwMDEwOTdBMjAwMTgxMDQwMDA0QzU5Cis6MTBENjUwMDAyNDAzNjA0MDk2MDIwMDAwMzA0MkZGRjAxNDQzMDAwQUE5Cis6MTBENjYwMDAyNDAyMDAyMDNDMDMwMDAxOTQ2MzVEQTA1NDYyMDAwOTgxCis6MTBENjcwMDAyNDAyNzgzMDI0MDIwMDAzM0MwMTAwMDFBQzIyNUNDNDg3Cis6MTBENjgwMDAwODAwNDVBQzI0MDIwMDA1M0MwMzAwMDE5NDYzNURBMDQyCis6MTBENjkwMDAyNDAyNzgzMDE0NjIwMDBGMjQwMzAwMTAzQzAyMDAwMUMxCis6MTBENkEwMDA5NDQyNURBMjMwNDJGRkYwMTQ0MzAwMEEyNDAyMDAwM0JBCis6MTBENkIwMDAzQzAxMDAwMUFDMjI1Q0M0MjQwMjAwMDYzQzAxMDAwMUQ0Cis6MTBENkMwMDBBQzIyNURCMDNDMDEwMDAxQUMyMjVEQkMwODAwNDVFNjI3Cis6MTBENkQwMDAzQzA5RkZGMDNDMDIwMDAxOEM0MjVDQzQzQzAzMDAwMUE5Cis6MTBENkUwMDA5NDYzNURBMDM0NDIwMDAxM0MwMTAwMDFBQzIyNUNDNEEzCis6MTBENkYwMDAyNDAyMDAxNTE0NjIwMDBGMDAwMDAwMDAzQzAyMDAwMTJCCis6MTBENzAwMDA5NDQyNURBMjMwNDJGRkYwMzg0M0Y0MjAyQzYzMDAwMUM0Cis6MTBENzEwMDAzODQyRjQzMDJDNDIwMDAxMDA2MjE4MjUxMDYwMDAwNUU4Cis6MTBENzIwMDAyNDAyMDAwMzNDMDEwMDAxQUMyMjVEQkMwODAwNDVFNjc4Cis6MTBENzMwMDAzQzA5RkZGMDNDMDMwMDAxOTQ2MzVEQTAyNDAyNzgxMEQzCis6MTBENzQwMDAxNDYyMDAwQjI0MDIwMDAyM0MwMjAwMDE5NDQyNURBMjFDCis6MTBENzUwMDAzMDQyRkZGMDE0NDAwMDA2MjQwMjAwMDIyNDAyMDAwNEJDCis6MTBENzYwMDAzQzAxMDAwMUFDMjI1REJDMDgwMDQ1RTYzQzA5RkZGMDJECis6MTBENzcwMDAzQzAxMDAwMUFDMjI1REJDMDgwMDQ1RTYzQzA5RkZGMDFECis6MTBENzgwMDAzQzAyMDAwMThDNDI1Q0M0MjQwMzAwMDEzQzAxMDAwMTA2Cis6MTBENzkwMDBBQzIzNURCQzM0NDIwMDA0M0MwMTAwMDFBQzIyNUNDNEZCCis6MTBEN0EwMDAzQzA5RkZGMDM1MjlCREMwM0MwNjAwMDE4Q0M2NUNDNEI1Cis6MTBEN0IwMDAzQzA0MDAwMTI0ODQ1QUIwMjQwMjAwMDEzQzAxMDAwMTExCis6MTBEN0MwMDBBQzIyNUNDQzhGODIwMDU0M0MwNzAwMDE4Q0U3NURCQzJFCis6MTBEN0QwMDAzQzAzMDAwMTk0NjM1REEwM0MwODAwMDE5NTA4NURBMjM0Cis6MTBEN0UwMDAzQzA1MDAwRDM0QTUwMTAwM0MwMTAwMDFBQzIwNUNDOEUzCis6MTBEN0YwMDAwMDQ5MTAyMTNDMDEwMDAxQUMyMjVEQUNBRkEzMDAxMDM4Cis6MTBEODAwMDAwQzAwMjQwM0FGQTgwMDE0OEZCRjAwMjQ4RkIwMDAyMEE5Cis6MTBEODEwMDAwM0UwMDAwODI3QkQwMDI4MjdCREZGRTgzQzA1MDAwMTA0Cis6MTBEODIwMDA4Q0E1NUNDODI0MDYwMDA0MjQwMjAwMDExNEEyMDAxNDg0Cis6MTBEODMwMDBBRkJGMDAxMDNDMDIwMDAxOEM0MjdFM0MzMDQyODAwMEIxCis6MTBEODQwMDAxMDQwMDAwNTNDMDQwMDBGM0MwMzAwMDE4QzYzNURCQ0VDCis6MTBEODUwMDAwODAwNDYxNzM0ODQ0MjQwM0MwNDAwMDQzQzAzMDAwMUE1Cis6MTBEODYwMDA4QzYzNURCQzM0ODQ5M0UwMjQwMjAwMDUxNDYyMDAxNkNFCis6MTBEODcwMDAwMDAwMDAwMDNDMDQwMDNEMDgwMDQ2MkYzNDg0MDkwMEVECis6MTBEODgwMDAzQzAyMDAwMThDNDI3RTM4MzA0MjgwMDAxMDQwMDAwNThFCis6MTBEODkwMDAzQzA0MDAxRTNDMDMwMDAxOEM2MzVEQkMwODAwNDYyQTZBCis6MTBEOEEwMDAzNDg0ODQ4MDNDMDQwMDBGM0MwMzAwMDE4QzYzNURCQzI1Cis6MTBEOEIwMDAzNDg0NDI0MDI0MDIwMDA1MTQ2MjAwMDMwMDAwMDAwMDhBCis6MTBEOEMwMDAzQzA0MDA3QTM0ODQxMjAwM0MwMjAwMDE4QzQyNURBQ0JFCis6MTBEOEQwMDA4RjgzMDA1NDAwNDQxMDIxMDA0MzEwMjMwMDQ0MTAyQjc4Cis6MTBEOEUwMDAxNDQwMDAzNzAwMDAwMDAwM0MwMjAwMDE4QzQyNUNEMDc0Cis6MTBEOEYwMDAxNDQwMDAzMzAwMDAwMDAwM0MwMTAwMDExMEMwMDAyNTZFCis6MTBEOTAwMDBBQzIwNUNFMDNDMDkwMDAxOEQyOTVDQzQyNDA3MDAwMUM3Cis6MTBEOTEwMDAzQzA0NDAwMDNDMDgwMDAxMjUwODdFM0MyNTBBRkZGQzMxCis6MTBEOTIwMDAwMDA1Mjg0MjE0QTAwMDAyMjRDNkZGRkYyNDA1MDAwOEI5Cis6MTBEOTMwMDAwMEE5MTAyNDEwNDAwMDEwMDAwMDAwMDAxNEE3MDAwOEU3Cis6MTBEOTQwMDAwMDAwMDAwMDhEMDIwMDAwMDA0NDEwMjQxMDQwMDAwQTc2Cis6MTBEOTUwMDAwMDAwMDAwMDNDMDEwMDAxMDgwMDQ2NUJBQzI1NUNFMEQzCis6MTBEOTYwMDA4RDQyMDAwMDAwNDQxMDI0MTA0MDAwMDMwMDAwMDAwMDFECis6MTBEOTcwMDAzQzAxMDAwMUFDMjc1Q0UwM0MwMjAwMDE4QzQyNUNFMDExCis6MTBEOTgwMDAwMDA2MTgyQjJDNDIwMDAxMDA0MzEwMjQ1NDQwRkZFNUYwCis6MTBEOTkwMDAwMDA1Mjg0MjhGODIwMDU0M0MwMzAwMDE4QzYzNUNFMDQ4Cis6MTBEOUEwMDAzQzAxMDAwMUFDMjI1REFDMTA2MDAwMkEyNDAyMDAwMUExCis6MTBEOUIwMDAzQzAxMDAwMUFDMjU1Q0M4M0MwMTAwMDFBQzIyNUNDQzAwCis6MTBEOUMwMDAzQzAyMDAwMThDNDI1Q0UwMTA0MDAwMjIwMDAwMDAwMDlDCis6MTBEOUQwMDAzQzAyMDAwMThDNDI1Q0NDMTA0MDAwMEEyNDAyMDAwMTkxCis6MTBEOUUwMDAzQzAxMDAwMUFDMjA1Q0NDM0MwMTAwMDEwMDM3MDgyMTY3Cis6MTBEOUYwMDBBQzIyODNBQzNDMDEwMDAxQUMyMDVENEMzQzAxMDAwMTM5Cis6MTBEQTAwMDBBQzIyNUQwNDNDMDMwMDAxMDA3NzE4MjE4QzYzODNBQ0Q5Cis6MTBEQTEwMDAyNDAyMDAwODEwNjIwMDA1MjQwMjAwMDEwQzAwNDY5NTUzCis6MTBEQTIwMDAwMDAwMDAwMDA4MDA0NjkyMDAwMDAwMDAzQzAzMDAwMUQ2Cis6MTBEQTMwMDA4QzYzNUNDODEwNjIwMDA3MjQwMjAwMEUzQzAzMDAwMUU2Cis6MTBEQTQwMDA4QzYzN0REMDEwNjIwMDAzMDAwMDAwMDAwQzAwNEU1NDc3Cis6MTBEQTUwMDA4Rjg0MDIyMDhGQkYwMDEwMDNFMDAwMDgyN0JEMDAxODRDCis6MTBEQTYwMDAyN0JERkZFMDNDMDJGREZGQUZCRjAwMTg4RUUzMDAwMEMyCis6MTBEQTcwMDAzQzA1MDAwMThDQTU1Q0M4M0MwNDAwMDE4Qzg0NUNGMDcyCis6MTBEQTgwMDAzNDQyRkZGRjAwNjIxODI0MTRBNDAwMDhBRUUzMDAwMDMzCis6MTBEQTkwMDAzQzAzMDAwMTAwNzcxODIxOEM2MzgzQUMzQzAyMDAwMTM5Cis6MTBEQUEwMDA4QzQyNUNGNDEwNjIwMDA4MDAwMDAwMDAzQzAyMDAwMTlGCis6MTBEQUIwMDAwMDU3MTAyMThDNDI4M0FDM0MwMTAwMDFBQzI1NUNGMDg2Cis6MTBEQUMwMDAzQzAxMDAwMUFDMjI1Q0Y0M0MwMzAwMDE4QzYzNUNDOEE3Cis6MTBEQUQwMDAyNDAyMDAwMjEwNjIwMTY5MkM2MjAwMDMxMDQwMDAwNTVDCis6MTBEQUUwMDAyNDAyMDAwMTEwNjIwMDA4MDAwMDAwMDAwODAwNDgxQzI5Cis6MTBEQUYwMDAwMDAwMDAwMDI0MDIwMDA0MTA2MjAwQjEyNDAyMDAwMUIyCis6MTBEQjAwMDAwODAwNDgxRDAwMDAwMDAwM0MwMjAwMDEwMDU3MTAyMUUxCis6MTBEQjEwMDA4QzQyODNBQzI0NDNGRkZGMkM2MjAwMDgxMDQwMDE1QTYyCis6MTBEQjIwMDAwMDAzMTA4MDNDMDEwMDAxMDAyMjA4MjE4QzIyNUFDODA5Cis6MTBEQjMwMDAwMDQwMDAwODAwMDAwMDAwM0MwMzAwMDE4QzYzNURCQzU1Cis6MTBEQjQwMDAyNDAyMDAwNTE0NjIwMDE0MDAwMDAwMDAzQzAyMDAwMUUxCis6MTBEQjUwMDA4QzQyNUNENDEwNDAwMDBBMjQwMjAwMDMwQzAwNDgyMkNFCis6MTBEQjYwMDAwMDAwMDAwMDI0MDIwMDAyM0MwMTAwMDEwMDM3MDgyMUVGCis6MTBEQjcwMDBBQzIyODNBQzNDMDEwMDAxMDgwMDQ2RTBBQzIwNUNENDQwCis6MTBEQjgwMDAzQzAxMDAwMTAwMzcwODIxQUMyMjgzQUMzQzAxMDAwMUJDCis6MTBEQjkwMDAwODAwNDgxRkFDMjA1QzYwMEMwMDQ4MjIwMDAwMDAwMDE4Cis6MTBEQkEwMDAzQzAyMDAwMThDNDI1Q0Q0M0MwMTAwMDFBQzIwNUM2MDcyCis6MTBEQkIwMDAxMDQwMDBERDI0MDIwMDAyM0MwMTAwMDEwMDM3MDgyMTcyCis6MTBEQkMwMDBBQzIyODNBQzNDMDEwMDAxMDgwMDQ4MUZBQzIwNUNENEFGCis6MTBEQkQwMDAzQzAzMDAwMThDNjM1REJDMjQwMjAwMDUxNDYyMDAwMzU5Cis6MTBEQkUwMDAyNDAyMDAwMTNDMDEwMDAxQUMyMjVEMDAwQzAwNDlDRjgxCis6MTBEQkYwMDAwMDAwMDAwMDNDMDMwMDAxOEM2MzVEMDAwODAwNDc4RUJDCis6MTBEQzAwMDAyNDAyMDAxMTNDMDUwMDAxOENBNTVDQzgzQzA2MDAwMTAzCis6MTBEQzEwMDA4Q0M2N0UzQzBDMDA1MTA4MDAwMDIwMjEyNDAyMDAwNTI3Cis6MTBEQzIwMDAzQzAxMDAwMUFDMjA1Q0Q0M0MwMTAwMDEwMDM3MDgyMTFDCis6MTBEQzMwMDAwODAwNDgxRkFDMjI4M0FDM0MwNDAwMDEyNDg0NUFCQzc5Cis6MTBEQzQwMDAzQzA1MDAwRjM0QTUwMTAwMDAwMDMwMjEwMDAwMzgyMTAwCis6MTBEQzUwMDBBRkEwMDAxMDBDMDAyNDAzQUZBMDAwMTQwODAwNDgxRjYwCis6MTBEQzYwMDAwMDAwMDAwMDhGODIwMjIwM0MwM0Y3MDAwMDQzMTAyNUQzCis6MTBEQzcwMDAwODAwNDdCN0FGODIwMjIwOEY4MjAyMjAzQzAzMDAwNEQ1Cis6MTBEQzgwMDAwMDQzMTAyNDE0NDAwMEE5MjQwMjAwMDc4RjgzMDA1NDhECis6MTBEQzkwMDAzQzAyMDAwMThDNDI1REE0MjQ2M0Q4RjAwMDQzMTAyM0IxCis6MTBEQ0EwMDAyQzQyMjcxMDE0NDAwMEY4MjQwMjAwMDEwODAwNDgxREVGCis6MTBEQ0IwMDAwMDAwMDAwMDNDMDUwMDAxOENBNTVDQzgwQzAwNTJBMkNECis6MTBEQ0MwMDAwMDAwMjAyMTBDMDA1Mzg2MDAwMDIwMjEzQzAzMDAwMUFECis6MTBEQ0QwMDA4QzYzN0UzNDA0NjEwMEVBMjQwMjAwMDEzQzAyMDAwOEU3Cis6MTBEQ0UwMDAwMDYyMTAyNDEwNDAwMDA2MDAwMDAwMDA4RjgyMDIxNDIxCis6MTBEQ0YwMDAzQzAzRkZGRjAwNDMxMDI0MDgwMDQ3NDEzNDQyMjUxRjI2Cis6MTBERDAwMDA4RjgyMDIxNDNDMDNGRkZGMDA0MzEwMjQzNDQyMjQxRjdGCis6MTBERDEwMDBBRjgyMDIxNDhFRTIwMDAwM0MwMzAyMDAwMDQzMTAyNTkzCis6MTBERDIwMDBBRUUyMDAwMDhGODIwMjIwMjQwM0ZGRkIwMDQzMTAyNDk4Cis6MTBERDMwMDBBRjgyMDIyMDhGODIwMjIwMzQ0MjAwMDJBRjgyMDIyMDkyCis6MTBERDQwMDAyNDAyMDAwODNDMDEwMDAxMDAzNzA4MjFBQzIyODNBQzBBCis6MTBERDUwMDA4RjgyMDIyMDNDMDMwMDA0MDA0MzEwMjQxNDQwMDAwNTdECis6MTBERDYwMDAwMDAwMDAwMDhGODIwMjIwM0MwM0Y3MDAwMDQzMTAyNUQyCis6MTBERDcwMDBBRjgyMDIyMDNDMDMwMDAxOEM2MzVEQkMyNDAyMDAwNURECis6MTBERDgwMDAxNDYyMDAwQTAwMDAwMDAwM0MwMjAwMDE5NDQyNURBMkZGCis6MTBERDkwMDAyNDQyOUZCQzJDNDIwMDA0MTA0MDAwMDQyNDA0MDAxOEJDCis6MTBEREEwMDAyNDA1MDAwMjBDMDA0RDkzMjQwNjAwMjAwQzAwNDNEREU2Cis6MTBEREIwMDAwMDAwMDAwMDNDMDEwMDAxMDgwMDQ4MUZBQzIwNUQ1MDNECis6MTBEREMwMDAzQzAyMDAwMTAwNTcxMDIxOEM0MjgzQUMyNDQzRkZGRjJBCis6MTBEREQwMDAyQzYyMDAwODEwNDAwMEFDMDAwMzEwODAzQzAxMDAwMUUwCis6MTBEREUwMDAwMDIyMDgyMThDMjI1QUU4MDA0MDAwMDgwMDAwMDAwMEIwCis6MTBEREYwMDAwQzAwNDI5QjAwMDAwMDAwM0MwMTAwMDFBQzIwNUNDQzA4Cis6MTBERTAwMDBBRjgwMDIwNDNDMDEwMDAxMEMwMDQ4MjJBQzIwN0UyMEJGCis6MTBERTEwMDAyNDAyMDAwMTNDMDEwMDAxQUMyMjVDRTQyNDAyMDAwMjY3Cis6MTBERTIwMDAzQzAxMDAwMTAwMzcwODIxMDgwMDQ4MUZBQzIyODNBQ0U4Cis6MTBERTMwMDAwQzAwNDg5RjAwMDAwMDAwM0MwMzAwMDE4QzYzNUNFNDgwCis6MTBERTQwMDAyNDAyMDAwOTE0NjIwMDkwMjQwMjAwMDMzQzAxMDAwMTM2Cis6MTBERTUwMDAwMDM3MDgyMTA4MDA0ODFGQUMyMjgzQUMzQzAyMDAwMUI3Cis6MTBERTYwMDA4QzQyN0UzODMwNDI0MDAwMTA0MDAwMDUwMDAwMDAwMDI3Cis6MTBERTcwMDA4RjgyMDA0NDNDMDNGRkZGMDgwMDQ3OUYzNDYzN0ZGRjBECis6MTBERTgwMDA4RjgyMDA0NDI0MDNGRjdGMDA0MzEwMjRBRjgyMDA0NEFDCis6MTBERTkwMDA4RjgzMDA1NDA4MDA0N0I5MjQwMjAwMDQ4RjgzMDA1NDg0Cis6MTBERUEwMDAzQzAyMDAwMThDNDI1REE0MjQ2M0Q4RjAwMDQzMTAyMzlGCis6MTBERUIwMDAyQzQyMjcxMDE0NDAwMDc0MjQwMjAwMDUzQzAxMDAwMThDCis6MTBERUMwMDAwMDM3MDgyMTA4MDA0ODFGQUMyMjgzQUM4RjgyMDIyMDUzCis6MTBERUQwMDAzQzAzRjcwMDAwNDMxMDI1QUY4MjAyMjBBRjgwMDIwNDBDCis6MTBERUUwMDAzQzAxMDAwMUFDMjA3RTIwOEY4MzAwNTQyNDAyMDAwNkY4Cis6MTBERUYwMDAzQzAxMDAwMTAwMzcwODIxQUMyMjgzQUMzQzAxMDAwMTQ5Cis6MTBERjAwMDAwODAwNDgxRkFDMjM1REE0OEY4MzAwNTQzQzAyMDAwMTJECis6MTBERjEwMDA4QzQyNURBNDI0NjNGRkY2MDA0MzEwMjMyQzQyMDAwQUM4Cis6MTBERjIwMDAxNDQwMDA1OTAwMDAwMDAwMjQwMjAwMDczQzAxMDAwMUQ5Cis6MTBERjMwMDAwMDM3MDgyMTA4MDA0ODFGQUMyMjgzQUM4RjgyMDIyMEUyCis6MTBERjQwMDAzQzA0RjcwMDAwNDQxMDI1QUY4MjAyMjA4RjgyMDIyMDlCCis6MTBERjUwMDAzQzAzMDMwMDAwNDMxMDI0MTQ0MDAwMDUwMDAwMTgyMTc2Cis6MTBERjYwMDA4RjgyMDIyMDI0MDMwMDAxMDA0NDEwMjVBRjgyMDIyMDhBCis6MTBERjcwMDAxMDYwMDA0MzI0MDIwMDAxOEY4MjAyMTQzQzAzRkZGRjYzCis6MTBERjgwMDAzQzA0MDAwMThDODQ1RDk4MDA0MzEwMjQzNDQyMjUxRjFBCis6MTBERjkwMDBBRjgyMDIxNDI0MDIwMDA4M0MwMTAwMDEwMDM3MDgyMTZFCis6MTBERkEwMDAxMDgwMDAwQkFDMjI4M0FDM0MwMjAwMDE4QzQyNUQ3NEZCCis6MTBERkIwMDAxNDQwMDAwNzI0MDIwMDAxM0MwMTAwMDFBQzIyN0REMDg2Cis6MTBERkMwMDAwQzAwNEU1NDhGODQwMjIwMDgwMDQ4MEMwMDAwMDAwMDEyCis6MTBERkQwMDA4RjgyMDIyMDNDMDMwMDA4MDA0MzEwMjQxNDQwMDAxN0U1Cis6MTBERkUwMDAyNDAyMDAwRTNDMDEwMDAxQUMyMjdERDA4RUUyMDAwMDM0Cis6MTBERkYwMDAwMDAwMjAyMTNDMDMwMjAwMDA0MzEwMjUwQzAwNTM4NjQyCis6MTBFMDAwMDBBRUUyMDAwMDhGODIwMjIwMjQwM0ZGRkIwMDQzMTAyNEI1Cis6MTBFMDEwMDBBRjgyMDIyMDhGODIwMjIwMzQ0MjAwMDIwQzAwNDNEREQ2Cis6MTBFMDIwMDBBRjgyMDIyMDNDMDUwMDAxOENBNTVDQzgwQzAwNTJBMjA2Cis6MTBFMDMwMDAwMDAwMjAyMTA4MDA0ODFGMDAwMDAwMDAzQzAyMDAwMUYxCis6MTBFMDQwMDA4QzQyNUQ3NDEwNDAwMDEwMDAwMDAwMDAzQzAyMDAwMTkyCis6MTBFMDUwMDA4QzQyNUQ3MDI0NDJGRkZGM0MwMTAwMDFBQzIyNUQ3MEU4Cis6MTBFMDYwMDAxNDQwMDAwOTI0MDIwMDAyM0MwMTAwMDFBQzIwNUQ3NDUwCis6MTBFMDcwMDAzQzAxMDAwMTA4MDA0ODFGQUMyMjVENzAyNDAyMDAwMTMxCis6MTBFMDgwMDAzQzAxMDAwMUFDMjI1Q0NDOEZCRjAwMTgwM0UwMDAwODBCCis6MTBFMDkwMDAyN0JEMDAyMDhGODIwMjAwOEY4MjAyMjA4RjgyMDIyMDAzCis6MTBFMEEwMDAzNDQyMDAwNEFGODIwMjIwOEY4MjAyMDAzQzA2MDAwMTRECis6MTBFMEIwMDA4Q0M2NUNDODM0NDIwMDA0QUY4MjAyMDAyNDAyMDAwMjE1Cis6MTBFMEMwMDAxMEMyMDAzQTJDQzIwMDAzMTA0MDAwMDUyNDAyMDAwMUQ3Cis6MTBFMEQwMDAxMEMyMDAwODAwMDAwMDAwMDgwMDQ4NjgwMDAwMDAwMEFFCis6MTBFMEUwMDAyNDAyMDAwNDEwQzIwMDEzMjQwMjAwMDEwODAwNDg2ODQyCis6MTBFMEYwMDAwMDAwMDAwMDNDMDMwMDAxOEM2MzVDQjgzQzAyMDAwMTlFCis6MTBFMTAwMDA4QzQyNUNDMDNDMDQwMDAxOEM4NDVDREMzQzA1MDAwMTVBCis6MTBFMTEwMDA4Q0E1NUNCQ0FGODYwMjAwQUY4NjAyMjAzNDYzMDAyMjZGCis6MTBFMTIwMDAwMDQ0MTAyNTAwNDUxMDI1MzQ0MjAwMDIwODAwNDg2N0NECis6MTBFMTMwMDBBRjgzMDIwMDNDMDMwMDAxOEM2MzVEOThBRjgyMDIwMDU0Cis6MTBFMTQwMDAxMDYwMDAwOUFGODIwMjIwM0MwMjAwMDE4QzQyNUQ3NDI1Cis6MTBFMTUwMDAxNDQwMDAwNTNDMDMzRjAwM0MwMjAwMDE4QzQyNUNCMENGCis6MTBFMTYwMDAwODAwNDg1QjM0NjMwMEUwM0MwMjAwMDE4QzQyNUNCMDc0Cis6MTBFMTcwMDAzQzAzM0YwMDM0NjMwMEUyMDA0MzEwMjVBRjgyMDIwMEZECis6MTBFMTgwMDAzQzAzMDAwMThDNjM1Q0I0M0MwNEY3MDAzQzAyMDAwMURBCis6MTBFMTkwMDA4QzQyNUNDMDNDMDUwMDAxOENBNTVDREMwMDY0MTgyNTQ5Cis6MTBFMUEwMDAwMDQzMTAyNTAwNDUxMDI1QUY4MjAyMjAwM0UwMDAwODNGCis6MTBFMUIwMDAwMDAwMDAwMDhGODIwMjIwM0MwMzAwMDE4QzYzNUNDOEQ5Cis6MTBFMUMwMDAzNDQyMDAwNEFGODIwMjIwMjQwMjAwMDExMDYyMDAwRkRBCis6MTBFMUQwMDAwMDAwMDAwMDhGODMwMDU0OEY4MjAwNTQyNDYzMDAwMkVCCis6MTBFMUUwMDAwMDYyMTAyMzJDNDIwMDAzMTA0MDAwMTEwMDAwMDAwMEM4Cis6MTBFMUYwMDA4RjgyMDA1NDAwNjIxMDIzMkM0MjAwMDMxMDQwMDAwQzU4Cis6MTBFMjAwMDAwMDAwMDAwMDA4MDA0ODc5MDAwMDAwMDA4RjgzMDA1NERGCis6MTBFMjEwMDA4RjgyMDA1NDA4MDA0ODg1MjQ2MzAwMDc4RjgyMDA1NEQxCis6MTBFMjIwMDAwMDYyMTAyMzJDNDIwMDA4MTQ0MEZGRkMwMDAwMDAwMDk0Cis6MTBFMjMwMDA4Rjg0MDBFMDMwODIwMDA3MTA0MDAwMEQwMDAwMDAwMEQ1Cis6MTBFMjQwMDA4RjgyMDA1NDhGODMwMEUwMTQ4MzAwMDkyNDQ1MDAzMjNDCis6MTBFMjUwMDA4RjgyMDA1NDAwQTIxMDIzMkM0MjAwMzMxMDQwMDAwNDhGCis6MTBFMjYwMDAwMDAwMDAwMDhGODIwMEUwMTA4MkZGRjkwMDAwMDAwMDMzCis6MTBFMjcwMDA4RjgyMDIyMDI0MDNGRkZEMDA0MzEwMjRBRjgyMDIyMDdFCis6MTBFMjgwMDAwM0UwMDAwODAwMDAwMDAwM0MwMzAwMDE4QzYzNUNFNDM0Cis6MTBFMjkwMDAzQzAyMDAwMThDNDI1Q0U4NTA2MjAwMDQyNDYzRkZGRkYyCis6MTBFMkEwMDAzQzAxMDAwMUFDMjM1Q0U4MjQ2M0ZGRkYyQzYyMDAwOTAxCis6MTBFMkIwMDAxMDQwMDA5RDAwMDMxMDgwM0MwMTAwMDEwMDIyMDgyMTU1Cis6MTBFMkMwMDA4QzIyNUIwODAwNDAwMDA4MDAwMDAwMDA4RjgyMDA0NEEwCis6MTBFMkQwMDAzNDQyODA4MEFGODIwMDQ0OEY4MzAwNTQwODAwNDkzODY0Cis6MTBFMkUwMDAyNDAyMDAwMjhGODMwMDU0M0MwMjAwMDE4QzQyNURBODhFCis6MTBFMkYwMDAyNDYzRDhGMDAwNDMxMDIzMkM0MjI3MTAxNDQwMDA4QUQ2Cis6MTBFMzAwMDAyNDAyMDAwMzA4MDA0OTQ1MDAwMDAwMDA4RjgyMDA0NEY5Cis6MTBFMzEwMDAzQzAzRkZGRjM0NjM3RkZGMDA0MzEwMjRBRjgyMDA0NEJGCis6MTBFMzIwMDA4RjgzMDA1NDA4MDA0OTM4MjQwMjAwMDQ4RjgzMDA1NDZFCis6MTBFMzMwMDAzQzAyMDAwMThDNDI1REE4MjQ2M0ZGRjYwMDQzMTAyM0Q5Cis6MTBFMzQwMDAyQzQyMDAwQTE0NDAwMDc4MjQwMjAwMDUwODAwNDk0NUM4Cis6MTBFMzUwMDAwMDAwMDAwMDhGODIwMjIwM0MwM0Y3MDAwMDQzMTAyNURDCis6MTBFMzYwMDBBRjgyMDIyMDhGODIwMjIwMjQwM0ZGRkIwMDQzMTAyNDhGCis6MTBFMzcwMDBBRjgyMDIyMDhGODIwMjIwMzQ0MjAwMDJBRjgyMDIyMDRDCis6MTBFMzgwMDAzQzAyM0YwMDM0NDIwMEUwQUY4MjAyMDA4RjgyMDIwMDc0Cis6MTBFMzkwMDAyNDAzRkZGRDAwNDMxMDI0QUY4MjAyMDAyNDA0MDAwMTg3Cis6MTBFM0EwMDAzNDA1RkZGRkFGODQwMjA0OEY4MzAwNTQ4RjgyMDA1NDMyCis6MTBFM0IwMDAwODAwNDhFQzI0NjMwMDAxOEY4MjAwNTQwMDYyMTAyMzlGCis6MTBFM0MwMDAyQzQyMDAwMjE0NDBGRkZDMDAwMDAwMDA4RjgyMDIyNDU3Cis6MTBFM0QwMDAwMDA0MjA0MDAwQTQxMDJCMTA0MEZGRjIwMDAwMDAwMEI5Cis6MTBFM0UwMDA4RjgyMDIyMDNDMDNGNzAwMDA0MzEwMjVBRjgyMDIyMEY5Cis6MTBFM0YwMDA4RjgyMDIxNDNDMDNGRkZGMDA0MzEwMjQzNDQyMjUxRjg4Cis6MTBFNDAwMDBBRjgyMDIxNDhGODIwMjIwMjQwM0ZGRkIwMDQzMTAyNEZBCis6MTBFNDEwMDBBRjgyMDIyMDhGODIwMjIwM0MwNEY3MDAzNDg0MDAwODdGCis6MTBFNDIwMDAzNDQyMDAwMkFGODIwMjIwOEY4MjAyMjAzQzAzM0YwMDcwCis6MTBFNDMwMDAzNDYzMDBFMjAwNDQxMDI1QUY4MjAyMjBBRjgzMDIwMDYzCis6MTBFNDQwMDA4Rjg0MDBGMDI3NjIxN0Y4MTQ4MjAwMDIyNDg1MDAwOEU4Cis6MTBFNDUwMDAyNzY1MTAwMDhGODIwMEY0MTBBMjAwMDczQzAzODAwMEEzCis6MTBFNDYwMDAzNDYzMDA0MDNDMDIwMDAxMjQ0MjVDNzBBQzgyMDAwMDM2Cis6MTBFNDcwMDBBQzgzMDAwNEFGODUwMEYwOEY4MzAwNTQwODAwNDkzODU2Cis6MTBFNDgwMDAyNDAyMDAwNjhGODMwMDU0M0MwMjAwMDE4QzQyNURBOEU4Cis6MTBFNDkwMDAyNDYzRkZGNjAwNDMxMDIzMkM0MjAwMEExNDQwMDAyMjlDCis6MTBFNEEwMDAyNDAyMDAwNzA4MDA0OTQ1MDAwMDAwMDA4RjgyMDBFMEI4Cis6MTBFNEIwMDBBRjgyMDBFNDhGODIwMEUwQUY4MjAwRTg4RjgyMDIyMDBBCis6MTBFNEMwMDAzNDQyMDAwNEFGODIwMjIwOEY4MjAyMjAyNDAzRkZGNzJGCis6MTBFNEQwMDAwMDQzMTAyNEFGODIwMjIwOEY4MjAwNDQzNDQyODA4MEE3Cis6MTBFNEUwMDBBRjgyMDA0NDhGODMwMDU0MjQwMjAwMDgzQzAxMDAwMUU1Cis6MTBFNEYwMDBBQzIyNUNFNDNDMDEwMDAxMDgwMDQ5NDdBQzIzNURBODY0Cis6MTBFNTAwMDA4RjgzMDA1NDNDMDIwMDAxOEM0MjVEQTgyNDYzRDhGMDQ0Cis6MTBFNTEwMDAwMDQzMTAyMzJDNDIyNzEwMTQ0MDAwMDMyNDAyMDAwOTVBCis6MTBFNTIwMDAzQzAxMDAwMUFDMjI1Q0U0MDNFMDAwMDgwMDAwMDAwMEI0Cis6MTBFNTMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyN0JERkZEODIwCis6MTBFNTQwMDBBRkIyMDAxODAwODA5MDIxQUZCMzAwMUMwMEEwOTgyMTRBCis6MTBFNTUwMDBBRkIxMDAxNDAwQzA4ODIxQUZCMDAwMTAwMDAwODAyMUNFCis6MTBFNTYwMDBBRkJGMDAyMEE2MjAwMDAwMEMwMDRENEIyNDA0MDAwMThBCis6MTBFNTcwMDAyNjEwMDAwMTJFMDIwMDIwMTQ0MEZGRkIwMDAwMDAwMEM2Cis6MTBFNTgwMDAwQzAwNEQ0QjAwMDAyMDIxMEMwMDRENEIyNDA0MDAwMUQ5Cis6MTBFNTkwMDAwQzAwNEQ0QjI0MDQwMDAxMEMwMDRENEIwMDAwMjAyMUM5Cis6MTBFNUEwMDAyNDEwMDAxMDAyNTAxMDI0MTA0MDAwMDIwMDAwMjAyMTBFCis6MTBFNUIwMDAyNDA0MDAwMTBDMDA0RDRCMDAxMDgwNDIxNjAwRkZGQUFECis6MTBFNUMwMDAwMjUwMTAyNDI0MTAwMDEwMDI3MDEwMjQxMDQwMDAwMjg5Cis6MTBFNUQwMDAwMDAwMjAyMTI0MDQwMDAxMEMwMDRENEIwMDEwODA0MjVCCis6MTBFNUUwMDAxNjAwRkZGQTAyNzAxMDI0MEMwMDRENzEzNDEwODAwMEU4Cis6MTBFNUYwMDAwQzAwNEQ3MTAwMDAwMDAwMEMwMDREMkIwMDAwMDAwMENECis6MTBFNjAwMDA1MDQwMDAwNTAwMTA4MDQyOTYyMjAwMDAwMDUwMTAyNTY2Cis6MTBFNjEwMDBBNjIyMDAwMDAwMTA4MDQyMTYwMEZGRjcwMDAwMDAwMDU0Cis6MTBFNjIwMDAwQzAwNEQ3MTAwMDAwMDAwOEZCRjAwMjA4RkIzMDAxQzU0Cis6MTBFNjMwMDA4RkIyMDAxODhGQjEwMDE0OEZCMDAwMTAwM0UwMDAwOEYzCis6MTBFNjQwMDAyN0JEMDAyODI3QkRGRkQ4QUZCMTAwMTQwMDgwODgyMTY2Cis6MTBFNjUwMDBBRkIyMDAxODAwQTA5MDIxQUZCMzAwMUMwMEMwOTgyMUY5Cis6MTBFNjYwMDBBRkIwMDAxMDAwMDA4MDIxQUZCRjAwMjAwQzAwNEQ0QjY4Cis6MTBFNjcwMDAyNDA0MDAwMTI2MTAwMDAxMkUwMjAwMjAxNDQwRkZGQjlDCis6MTBFNjgwMDAwMDAwMDAwMDBDMDA0RDRCMDAwMDIwMjEwQzAwNEQ0QjAxCis6MTBFNjkwMDAyNDA0MDAwMTBDMDA0RDRCMDAwMDIwMjEwQzAwNEQ0QkM4Cis6MTBFNkEwMDAyNDA0MDAwMTI0MTAwMDEwMDIzMDEwMjQxMDQwMDAwMjQ1Cis6MTBFNkIwMDAwMDAwMjAyMTI0MDQwMDAxMEMwMDRENEIwMDEwODA0MjdBCis6MTBFNkMwMDAxNjAwRkZGQTAyMzAxMDI0MjQxMDAwMTAwMjUwMTAyNDBCCis6MTBFNkQwMDAxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ0QkRBCis6MTBFNkUwMDAwMDEwODA0MjE2MDBGRkZBMDI1MDEwMjQwQzAwNEQ0QjFGCis6MTBFNkYwMDAyNDA0MDAwMTBDMDA0RDRCMDAwMDIwMjEzNDEwODAwMDQ4Cis6MTBFNzAwMDA5NjYyMDAwMDAwNTAxMDI0MTA0MDAwMDIwMDAwMjAyMUZBCis6MTBFNzEwMDAyNDA0MDAwMTBDMDA0RDRCMDAxMDgwNDIxNjAwRkZGODRECis6MTBFNzIwMDAwMDAwMDAwMDBDMDA0RDcxMDAwMDAwMDA4RkJGMDAyMEIxCis6MTBFNzMwMDA4RkIzMDAxQzhGQjIwMDE4OEZCMTAwMTQ4RkIwMDAxMDdGCis6MTBFNzQwMDAwM0UwMDAwODI3QkQwMDI4M0MwMzAwMDE4QzYzNUQwMDQ2Cis6MTBFNzUwMDAzQzAyMDAwMThDNDI1RDQ4MjdCREZGRDhBRkJGMDAyMEJFCis6MTBFNzYwMDBBRkIxMDAxQzEwNjIwMDAzQUZCMDAwMTgzQzAxMDAwMTAzCis6MTBFNzcwMDBBQzIzNUQ0ODI0NjNGRkZGMkM2MjAwMTMxMDQwMDM0OTYzCis6MTBFNzgwMDAwMDAzMTA4MDNDMDEwMDAxMDAyMjA4MjE4QzIyNUIzMDM0Cis6MTBFNzkwMDAwMDQwMDAwODAwMDAwMDAwMEMwMDRENzEwMDAwODAyMUM2Cis6MTBFN0EwMDAzNDAyODAwMEE3QTIwMDEwMjdCMTAwMTAwQzAwNEQ0QkNFCis6MTBFN0IwMDAyNDA0MDAwMTI2MTAwMDAxMkUwMjAwMjAxNDQwRkZGQjVCCis6MTBFN0MwMDAwMDAwMDAwMDBDMDA0RDRCMDAwMDIwMjEwQzAwNEQ0QkMwCis6MTBFN0QwMDAyNDA0MDAwMTBDMDA0RDRCMDAwMDIwMjEwQzAwNEQ0Qjg3Cis6MTBFN0UwMDAyNDA0MDAwMTI0MTAwMDEwMzIwMjAwMDExMDQwMDAwMjM1Cis6MTBFN0YwMDAwMDAwMjAyMTI0MDQwMDAxMEMwMDRENEIwMDEwODA0MjM5Cis6MTBFODAwMDAxNjAwRkZGQTMyMDIwMDAxMjQxMDAwMTAwQzAwNEQ0QkRDCis6MTBFODEwMDAwMDAwMjAyMTAwMTA4MDQyMTYwMEZGRkMwMDAwMDAwMEQ0Cis6MTBFODIwMDAwQzAwNEQ0QjI0MDQwMDAxMEMwMDRENEIwMDAwMjAyMTM2Cis6MTBFODMwMDAzNDEwODAwMDk2MjIwMDAwMDA1MDEwMjQxMDQwMDAwMjg2Cis6MTBFODQwMDAwMDAwMjAyMTI0MDQwMDAxMEMwMDRENEIwMDEwODA0MkU4Cis6MTBFODUwMDAxNjAwRkZGODAwMDAwMDAwMEMwMDRENzEwMDAwMDAwMEUxCis6MTBFODYwMDAwODAwNEQyNDI0MDIwMDAyMjdCMTAwMTBBN0EwMDAxMEM4Cis6MTBFODcwMDAwMDAwODAyMTBDMDA0RDRCMjQwNDAwMDEyNjEwMDAwMUYzCis6MTBFODgwMDAyRTAyMDAyMDE0NDBGRkZCMDAwMDAwMDAwQzAwNEQ0QjQ2Cis6MTBFODkwMDAwMDAwMjAyMTBDMDA0RDRCMjQwNDAwMDEwQzAwNEQ0QkM2Cis6MTBFOEEwMDAyNDA0MDAwMTBDMDA0RDRCMDAwMDIwMjEyNDEwMDAxMDE2Cis6MTBFOEIwMDAzMjAyMDAwMTEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMTY3Cis6MTBFOEMwMDAwQzAwNEQ0QjAwMTA4MDQyMTYwMEZGRkEzMjAyMDAwMThFCis6MTBFOEQwMDAyNDEwMDAxMDBDMDA0RDRCMDAwMDIwMjEwMDEwODA0MjNECis6MTBFOEUwMDAxNjAwRkZGQzAwMDAwMDAwMEMwMDRENzEzNDEwODAwMDg5Cis6MTBFOEYwMDAwQzAwNEQ3MTAwMDAwMDAwMEMwMDREMkIwMDAwMDAwMENBCis6MTBFOTAwMDA1MDQwMDAwNTAwMTA4MDQyOTYyMjAwMDAwMDUwMTAyNTYzCis6MTBFOTEwMDBBNjIyMDAwMDAwMTA4MDQyMTYwMEZGRjcwMDAwMDAwMDUxCis6MTBFOTIwMDAwQzAwNEQ3MTAwMDAwMDAwOTdBMjAwMTAzMDQyODAwMEUyCis6MTBFOTMwMDAxNDQwMDJEQzI0MDIwMDAzMDgwMDREMjQwMDAwMDAwMDAzCis6MTBFOTQwMDAyNDAyMTIwMEE3QTIwMDEwMjdCMTAwMTAwMDAwODAyMUFECis6MTBFOTUwMDAwQzAwNEQ0QjI0MDQwMDAxMjYxMDAwMDEyRTAyMDAyMDYzCis6MTBFOTYwMDAxNDQwRkZGQjAwMDAwMDAwMEMwMDRENEIwMDAwMjAyMTc0Cis6MTBFOTcwMDAwQzAwNEQ0QjI0MDQwMDAxMEMwMDRENEIwMDAwMjAyMUU1Cis6MTBFOTgwMDAwQzAwNEQ0QjI0MDQwMDAxMjQxMDAwMTAzMjAyMDAwMTQxCis6MTBFOTkwMDAxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ0QjE3Cis6MTBFOUEwMDAwMDEwODA0MjE2MDBGRkZBMzIwMjAwMDEyNDEwMDAxMDBECis6MTBFOUIwMDAwQzAwNEQ0QjAwMDAyMDIxMDAxMDgwNDIxNjAwRkZGQzhGCis6MTBFOUMwMDAwMDAwMDAwMDBDMDA0RDRCMjQwNDAwMDEwQzAwNEQ0QkQ2Cis6MTBFOUQwMDAwMDAwMjAyMTM0MTA4MDAwOTYyMjAwMDAwMDUwMTAyNEY2Cis6MTBFOUUwMDAxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ0QkM3Cis6MTBFOUYwMDAwMDEwODA0MjE2MDBGRkY4MDAwMDAwMDAwQzAwNEQ3MTZFCis6MTBFQTAwMDAwMDAwMDAwMDhGODMwMDU0MDgwMDREMTYyNDAyMDAwNDBCCis6MTBFQTEwMDA4RjgzMDA1NDNDMDIwMDAxOEM0MjVEQjgyNDYzRkY5QzRDCis6MTBFQTIwMDAwMDQzMTAyMzJDNDIwMDY0MTQ0MDAyOUUyNDAyMDAwMjgyCis6MTBFQTMwMDAzQzAzMDAwMThDNjM1REJDMTA2MjAyOTcyQzYyMDAwM0YyCis6MTBFQTQwMDAxNDQwMDI5NjI0MDIwMDExMjQwMjAwMDMxMDYyMDAwNTAzCis6MTBFQTUwMDAyNDAyMDAwNDEwNjIwMjkxMjQwMjAwMEYwODAwNEQyNEQ5Cis6MTBFQTYwMDAyNDAyMDAxMTA4MDA0RDI0MjQwMjAwMDUyNDAyMDAxNDkxCis6MTBFQTcwMDBBN0EyMDAxMDI3QjEwMDEwMDAwMDgwMjEwQzAwNEQ0QjEwCis6MTBFQTgwMDAyNDA0MDAwMTI2MTAwMDAxMkUwMjAwMjAxNDQwRkZGQjg4Cis6MTBFQTkwMDAwMDAwMDAwMDBDMDA0RDRCMDAwMDIwMjEwQzAwNEQ0QkVECis6MTBFQUEwMDAyNDA0MDAwMTBDMDA0RDRCMDAwMDIwMjEwQzAwNEQ0QkI0Cis6MTBFQUIwMDAyNDA0MDAwMTI0MTAwMDEwMzIwMjAwMDExMDQwMDAwMjYyCis6MTBFQUMwMDAwMDAwMjAyMTI0MDQwMDAxMEMwMDRENEIwMDEwODA0MjY2Cis6MTBFQUQwMDAxNjAwRkZGQTMyMDIwMDAxMjQxMDAwMTAzMjAyMDAxMjY4Cis6MTBFQUUwMDAxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ0QkM2Cis6MTBFQUYwMDAwMDEwODA0MjE2MDBGRkZBMzIwMjAwMTIwQzAwNEQ0QjRCCis6MTBFQjAwMDAyNDA0MDAwMTBDMDA0RDRCMDAwMDIwMjEzNDEwODAwMDMzCis6MTBFQjEwMDA5NjIyMDAwMDAwNTAxMDI0MTA0MDAwMDIwMDAwMjAyMTI2Cis6MTBFQjIwMDAyNDA0MDAwMTBDMDA0RDRCMDAxMDgwNDIxNjAwRkZGODM5Cis6MTBFQjMwMDAwMDAwMDAwMDBDMDA0RDcxMDAwMDAwMDA4RjgzMDA1NEE1Cis6MTBFQjQwMDAwODAwNEQxNjI0MDIwMDA2OEY4MzAwNTQzQzAyMDAwMTg5Cis6MTBFQjUwMDA4QzQyNURCODI0NjNGRjlDMDA0MzEwMjMyQzQyMDA2NDY4Cis6MTBFQjYwMDAxNDQwMDI1MDI0MDIwMDA3MDgwMDREMjQwMDAwMDAwMDU5Cis6MTBFQjcwMDAyNDAyMDAwNkE3QTIwMDEwMjdCMTAwMTAwMDAwODAyMTg3Cis6MTBFQjgwMDAwQzAwNEQ0QjI0MDQwMDAxMjYxMDAwMDEyRTAyMDAyMDMxCis6MTBFQjkwMDAxNDQwRkZGQjAwMDAwMDAwMEMwMDRENEIwMDAwMjAyMTQyCis6MTBFQkEwMDAwQzAwNEQ0QjI0MDQwMDAxMEMwMDRENEIwMDAwMjAyMUIzCis6MTBFQkIwMDAwQzAwNEQ0QjI0MDQwMDAxMjQxMDAwMTAzMjAyMDAwMTBGCis6MTBFQkMwMDAxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ0QkU1Cis6MTBFQkQwMDAwMDEwODA0MjE2MDBGRkZBMzIwMjAwMDEyNDEwMDAxMERCCis6MTBFQkUwMDAzMjAyMDAxMzEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMTIyCis6MTBFQkYwMDAwQzAwNEQ0QjAwMTA4MDQyMTYwMEZGRkEzMjAyMDAxMzQ5Cis6MTBFQzAwMDAwQzAwNEQ0QjI0MDQwMDAxMEMwMDRENEIwMDAwMjAyMTUyCis6MTBFQzEwMDAzNDEwODAwMDk2MjIwMDAwMDA1MDEwMjQxMDQwMDAwMkEyCis6MTBFQzIwMDAwMDAwMjAyMTI0MDQwMDAxMEMwMDRENEIwMDEwODA0MjA0Cis6MTBFQzMwMDAxNjAwRkZGODAwMDAwMDAwMEMwMDRENzEwMDAwMDAwMEZECis6MTBFQzQwMDA4RjgzMDA1NDA4MDA0RDE2MjQwMjAwMDg4RjgzMDA1NDVGCis6MTBFQzUwMDAzQzAyMDAwMThDNDI1REI4MjQ2M0ZGOUMwMDQzMTAyM0ZBCis6MTBFQzYwMDAyQzQyMDA2NDE0NDAwMjBGMjQwMjAwMDkwODAwNEQyNEM1Cis6MTBFQzcwMDAwMDAwMDAwMDI3QjEwMDEwQTdBMDAwMTAwMDAwODAyMUI0Cis6MTBFQzgwMDAwQzAwNEQ0QjI0MDQwMDAxMjYxMDAwMDEyRTAyMDAyMDMwCis6MTBFQzkwMDAxNDQwRkZGQjAwMDAwMDAwMEMwMDRENEIwMDAwMjAyMTQxCis6MTBFQ0EwMDAwQzAwNEQ0QjI0MDQwMDAxMEMwMDRENEIyNDA0MDAwMUNBCis6MTBFQ0IwMDAwQzAwNEQ0QjAwMDAyMDIxMjQxMDAwMTAzMjAyMDAwMUY2Cis6MTBFQ0MwMDAxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ0QkU0Cis6MTBFQ0QwMDAwMDEwODA0MjE2MDBGRkZBMzIwMjAwMDEyNDEwMDAxMERBCis6MTBFQ0UwMDAzMjAyMDAxODEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMTFDCis6MTBFQ0YwMDAwQzAwNEQ0QjAwMTA4MDQyMTYwMEZGRkEzMjAyMDAxODQzCis6MTBFRDAwMDAwQzAwNEQ3MTM0MTA4MDAwMEMwMDRENzEwMDAwMDAwMEFCCis6MTBFRDEwMDAwQzAwNEQyQjAwMDAwMDAwNTA0MDAwMDUwMDEwODA0MjA4Cis6MTBFRDIwMDA5NjIyMDAwMDAwNTAxMDI1QTYyMjAwMDAwMDEwODA0MjBDCis6MTBFRDMwMDAxNjAwRkZGNzAwMDAwMDAwMEMwMDRENzEwMDAwODAyMTVDCis6MTBFRDQwMDA5N0EyMDAxMDI3QjEwMDEwMzQ0MjAwMDFBN0EyMDAxMEMyCis6MTBFRDUwMDAwQzAwNEQ0QjI0MDQwMDAxMjYxMDAwMDEyRTAyMDAyMDVGCis6MTBFRDYwMDAxNDQwRkZGQjAwMDAwMDAwMEMwMDRENEIwMDAwMjAyMTcwCis6MTBFRDcwMDAwQzAwNEQ0QjI0MDQwMDAxMEMwMDRENEIwMDAwMjAyMUUxCis6MTBFRDgwMDAwQzAwNEQ0QjI0MDQwMDAxMjQxMDAwMTAzMjAyMDAwMTNECis6MTBFRDkwMDAxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ0QjEzCis6MTBFREEwMDAwMDEwODA0MjE2MDBGRkZBMzIwMjAwMDEyNDEwMDAxMDA5Cis6MTBFREIwMDAzMjAyMDAxODEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMTRCCis6MTBFREMwMDAwQzAwNEQ0QjAwMTA4MDQyMTYwMEZGRkEzMjAyMDAxODcyCis6MTBFREQwMDAwQzAwNEQ0QjI0MDQwMDAxMEMwMDRENEIwMDAwMjAyMTgxCis6MTBFREUwMDAzNDEwODAwMDk2MjIwMDAwMDA1MDEwMjQxMDQwMDAwMkQxCis6MTBFREYwMDAwMDAwMjAyMTI0MDQwMDAxMEMwMDRENEIwMDEwODA0MjMzCis6MTBFRTAwMDAxNjAwRkZGODAwMDAwMDAwMEMwMDRENzEwMDAwMDAwMDJCCis6MTBFRTEwMDA4RjgzMDA1NDA4MDA0RDE2MjQwMjAwMEE4RjgzMDA1NDhCCis6MTBFRTIwMDAzQzAyMDAwMThDNDI1REI4MjQ2M0ZGOUMwMDQzMTAyMzI4Cis6MTBFRTMwMDAyQzQyMDA2NDE0NDAwMTlCMjQwMjAwMEIwODAwNEQyNDY2Cis6MTBFRTQwMDAwMDAwMDAwMDI3QjEwMDEwQTdBMDAwMTAwMDAwODAyMUUyCis6MTBFRTUwMDAwQzAwNEQ0QjI0MDQwMDAxMjYxMDAwMDEyRTAyMDAyMDVFCis6MTBFRTYwMDAxNDQwRkZGQjAwMDAwMDAwMEMwMDRENEIwMDAwMjAyMTZGCis6MTBFRTcwMDAwQzAwNEQ0QjI0MDQwMDAxMEMwMDRENEIyNDA0MDAwMUY4Cis6MTBFRTgwMDAwQzAwNEQ0QjAwMDAyMDIxMjQxMDAwMTAzMjAyMDAwMTI0Cis6MTBFRTkwMDAxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ0QjEyCis6MTBFRUEwMDAwMDEwODA0MjE2MDBGRkZBMzIwMjAwMDEyNDEwMDAxMDA4Cis6MTBFRUIwMDAzMjAyMDAxNzEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMTRCCis6MTBFRUMwMDAwQzAwNEQ0QjAwMTA4MDQyMTYwMEZGRkEzMjAyMDAxNzcyCis6MTBFRUQwMDAwQzAwNEQ3MTM0MTA4MDAwMEMwMDRENzEwMDAwMDAwMERBCis6MTBFRUUwMDAwQzAwNEQyQjAwMDAwMDAwNTA0MDAwMDUwMDEwODA0MjM3Cis6MTBFRUYwMDA5NjIyMDAwMDAwNTAxMDI1QTYyMjAwMDAwMDEwODA0MjNCCis6MTBFRjAwMDAxNjAwRkZGNzAwMDAwMDAwMEMwMDRENzEwMDAwODAyMThBCis6MTBFRjEwMDA5N0EyMDAxMDI3QjEwMDEwMzQ0MjA3MDBBN0EyMDAxMEVBCis6MTBFRjIwMDAwQzAwNEQ0QjI0MDQwMDAxMjYxMDAwMDEyRTAyMDAyMDhECis6MTBFRjMwMDAxNDQwRkZGQjAwMDAwMDAwMEMwMDRENEIwMDAwMjAyMTlFCis6MTBFRjQwMDAwQzAwNEQ0QjI0MDQwMDAxMEMwMDRENEIwMDAwMjAyMTBGCis6MTBFRjUwMDAwQzAwNEQ0QjI0MDQwMDAxMjQxMDAwMTAzMjAyMDAwMTZCCis6MTBFRjYwMDAxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ0QjQxCis6MTBFRjcwMDAwMDEwODA0MjE2MDBGRkZBMzIwMjAwMDEyNDEwMDAxMDM3Cis6MTBFRjgwMDAzMjAyMDAxNzEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMTdBCis6MTBFRjkwMDAwQzAwNEQ0QjAwMTA4MDQyMTYwMEZGRkEzMjAyMDAxN0ExCis6MTBFRkEwMDAwQzAwNEQ0QjI0MDQwMDAxMEMwMDRENEIwMDAwMjAyMUFGCis6MTBFRkIwMDAzNDEwODAwMDk2MjIwMDAwMDA1MDEwMjQxMDQwMDAwMkZGCis6MTBFRkMwMDAwMDAwMjAyMTI0MDQwMDAxMEMwMDRENEIwMDEwODA0MjYxCis6MTBFRkQwMDAxNjAwRkZGODAwMDAwMDAwMEMwMDRENzEwMDAwMDAwMDVBCis6MTBFRkUwMDA4RjgzMDA1NDA4MDA0RDE2MjQwMjAwMEM4RjgzMDA1NEI4Cis6MTBFRkYwMDAzQzAyMDAwMThDNDI1REI4MjQ2M0ZGOUMwMDQzMTAyMzU3Cis6MTBGMDAwMDAyQzQyMDA2NDE0NDAwMTI3MjQwMjAwMTIwODAwNEQyNDAxCis6MTBGMDEwMDAwMDAwMDAwMDI3QjEwMDEwQTdBMDAwMTAwMDAwODAyMTEwCis6MTBGMDIwMDAwQzAwNEQ0QjI0MDQwMDAxMjYxMDAwMDEyRTAyMDAyMDhDCis6MTBGMDMwMDAxNDQwRkZGQjAwMDAwMDAwMEMwMDRENEIwMDAwMjAyMTlECis6MTBGMDQwMDAwQzAwNEQ0QjI0MDQwMDAxMEMwMDRENEIyNDA0MDAwMTI2Cis6MTBGMDUwMDAwQzAwNEQ0QjAwMDAyMDIxMjQxMDAwMTAzMjAyMDAwMTUyCis6MTBGMDYwMDAxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ0QjQwCis6MTBGMDcwMDAwMDEwODA0MjE2MDBGRkZBMzIwMjAwMDEyNDEwMDAxMDM2Cis6MTBGMDgwMDAzMjAyMDAxNDEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMTdDCis6MTBGMDkwMDAwQzAwNEQ0QjAwMTA4MDQyMTYwMEZGRkEzMjAyMDAxNEEzCis6MTBGMEEwMDAwQzAwNEQ3MTM0MTA4MDAwMEMwMDRENzEwMDAwMDAwMDA4Cis6MTBGMEIwMDAwQzAwNEQyQjAwMDAwMDAwNTA0MDAwMDUwMDEwODA0MjY1Cis6MTBGMEMwMDA5NjIyMDAwMDAwNTAxMDI1QTYyMjAwMDAwMDEwODA0MjY5Cis6MTBGMEQwMDAxNjAwRkZGNzAwMDAwMDAwMEMwMDRENzEwMDAwODAyMUI5Cis6MTBGMEUwMDA5N0EyMDAxMDI3QjEwMDEwMzQ0MjAwMTBBN0EyMDAxMDEwCis6MTBGMEYwMDAwQzAwNEQ0QjI0MDQwMDAxMjYxMDAwMDEyRTAyMDAyMEJDCis6MTBGMTAwMDAxNDQwRkZGQjAwMDAwMDAwMEMwMDRENEIwMDAwMjAyMUNDCis6MTBGMTEwMDAwQzAwNEQ0QjI0MDQwMDAxMEMwMDRENEIwMDAwMjAyMTNECis6MTBGMTIwMDAwQzAwNEQ0QjI0MDQwMDAxMjQxMDAwMTAzMjAyMDAwMTk5Cis6MTBGMTMwMDAxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ0QjZGCis6MTBGMTQwMDAwMDEwODA0MjE2MDBGRkZBMzIwMjAwMDEyNDEwMDAxMDY1Cis6MTBGMTUwMDAzMjAyMDAxNDEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMUFCCis6MTBGMTYwMDAwQzAwNEQ0QjAwMTA4MDQyMTYwMEZGRkEzMjAyMDAxNEQyCis6MTBGMTcwMDAwQzAwNEQ0QjI0MDQwMDAxMEMwMDRENEIwMDAwMjAyMURECis6MTBGMTgwMDAzNDEwODAwMDk2MjIwMDAwMDA1MDEwMjQxMDQwMDAwMjJECis6MTBGMTkwMDAwMDAwMjAyMTI0MDQwMDAxMEMwMDRENEIwMDEwODA0MjhGCis6MTBGMUEwMDAxNjAwRkZGODAwMDAwMDAwMEMwMDRENzEwMDAwMDAwMDg4Cis6MTBGMUIwMDA4RjgzMDA1NDA4MDA0RDE2MjQwMjAwMTM4RjgzMDA1NERGCis6MTBGMUMwMDAzQzAyMDAwMThDNDI1REI4MjQ2M0ZGOUMwMDQzMTAyMzg1Cis6MTBGMUQwMDAyQzQyMDA2NDE0NDAwMEIzMjQwMjAwMEQwODAwNEQyNEFBCis6MTBGMUUwMDAwMDAwMDAwMDI3QjEwMDEwQTdBMDAwMTAwMDAwODAyMTNGCis6MTBGMUYwMDAwQzAwNEQ0QjI0MDQwMDAxMjYxMDAwMDEyRTAyMDAyMEJCCis6MTBGMjAwMDAxNDQwRkZGQjAwMDAwMDAwMEMwMDRENEIwMDAwMjAyMUNCCis6MTBGMjEwMDAwQzAwNEQ0QjI0MDQwMDAxMEMwMDRENEIyNDA0MDAwMTU0Cis6MTBGMjIwMDAwQzAwNEQ0QjAwMDAyMDIxMjQxMDAwMTAzMjAyMDAwMTgwCis6MTBGMjMwMDAxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ0QjZFCis6MTBGMjQwMDAwMDEwODA0MjE2MDBGRkZBMzIwMjAwMDEyNDEwMDAxMDY0Cis6MTBGMjUwMDAzMjAyMDAxODEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMUE2Cis6MTBGMjYwMDAwQzAwNEQ0QjAwMTA4MDQyMTYwMEZGRkEzMjAyMDAxOENECis6MTBGMjcwMDAwQzAwNEQ3MTM0MTA4MDAwMEMwMDRENzEwMDAwMDAwMDM2Cis6MTBGMjgwMDAwQzAwNEQyQjAwMDAwMDAwNTA0MDAwMDUwMDEwODA0MjkzCis6MTBGMjkwMDA5NjIyMDAwMDAwNTAxMDI1QTYyMjAwMDAwMDEwODA0Mjk3Cis6MTBGMkEwMDAxNjAwRkZGNzAwMDAwMDAwMEMwMDRENzEwMDAwODAyMUU3Cis6MTBGMkIwMDA5N0EyMDAxMDI3QjEwMDEwMzA0MkZGRkVBN0EyMDAxMDU1Cis6MTBGMkMwMDAwQzAwNEQ0QjI0MDQwMDAxMjYxMDAwMDEyRTAyMDAyMEVBCis6MTBGMkQwMDAxNDQwRkZGQjAwMDAwMDAwMEMwMDRENEIwMDAwMjAyMUZCCis6MTBGMkUwMDAwQzAwNEQ0QjI0MDQwMDAxMEMwMDRENEIwMDAwMjAyMTZDCis6MTBGMkYwMDAwQzAwNEQ0QjI0MDQwMDAxMjQxMDAwMTAzMjAyMDAwMUM4Cis6MTBGMzAwMDAxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ0QjlECis6MTBGMzEwMDAwMDEwODA0MjE2MDBGRkZBMzIwMjAwMDEyNDEwMDAxMDkzCis6MTBGMzIwMDAzMjAyMDAxODEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMUQ1Cis6MTBGMzMwMDAwQzAwNEQ0QjAwMTA4MDQyMTYwMEZGRkEzMjAyMDAxOEZDCis6MTBGMzQwMDAwQzAwNEQ0QjI0MDQwMDAxMEMwMDRENEIwMDAwMjAyMTBCCis6MTBGMzUwMDAzNDEwODAwMDk2MjIwMDAwMDA1MDEwMjQxMDQwMDAwMjVCCis6MTBGMzYwMDAwMDAwMjAyMTI0MDQwMDAxMEMwMDRENEIwMDEwODA0MkJECis6MTBGMzcwMDAxNjAwRkZGODAwMDAwMDAwMEMwMDRENzEwMDAwMDAwMEI2Cis6MTBGMzgwMDA4RjgzMDA1NDA4MDA0RDE2MjQwMjAwMEUyNDAyMDg0MDBBCis6MTBGMzkwMDBBN0EyMDAxMDI3QjEwMDEwMDAwMDgwMjEwQzAwNEQ0QkU3Cis6MTBGM0EwMDAyNDA0MDAwMTI2MTAwMDAxMkUwMjAwMjAxNDQwRkZGQjVGCis6MTBGM0IwMDAwMDAwMDAwMDBDMDA0RDRCMDAwMDIwMjEwQzAwNEQ0QkM0Cis6MTBGM0MwMDAyNDA0MDAwMTBDMDA0RDRCMDAwMDIwMjEwQzAwNEQ0QjhCCis6MTBGM0QwMDAyNDA0MDAwMTI0MTAwMDEwMzIwMjAwMDExMDQwMDAwMjM5Cis6MTBGM0UwMDAwMDAwMjAyMTI0MDQwMDAxMEMwMDRENEIwMDEwODA0MjNECis6MTBGM0YwMDAxNjAwRkZGQTMyMDIwMDAxMjQxMDAwMTAzMjAyMDAxMzNFCis6MTBGNDAwMDAxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ0QjlDCis6MTBGNDEwMDAwMDEwODA0MjE2MDBGRkZBMzIwMjAwMTMwQzAwNEQ0QjIwCis6MTBGNDIwMDAyNDA0MDAwMTBDMDA0RDRCMDAwMDIwMjEzNDEwODAwMDBBCis6MTBGNDMwMDA5NjIyMDAwMDAwNTAxMDI0MTA0MDAwMDIwMDAwMjAyMUZECis6MTBGNDQwMDAyNDA0MDAwMTBDMDA0RDRCMDAxMDgwNDIxNjAwRkZGODEwCis6MTBGNDUwMDAwMDAwMDAwMDBDMDA0RDcxMDAwMDAwMDA4RjgzMDA1NDdDCis6MTBGNDYwMDAyNDAyMDAxMDNDMDEwMDAxQUMyMjVEMDAzQzAxMDAwMUJGCis6MTBGNDcwMDAwODAwNEQyNkFDMjM1REI4OEY4MzAwNTQzQzAyMDAwMTg4Cis6MTBGNDgwMDA4QzQyNURCODI0NjNGRjlDMDA0MzEwMjMyQzQyMDA2NDJGCis6MTBGNDkwMDAxNDQwMDAwNDAwMDAwMDAwMjQwMjAwMTEzQzAxMDAwMTlGCis6MTBGNEEwMDBBQzIyNUQwMDhGQkYwMDIwOEZCMTAwMUM4RkIwMDAxODEwCis6MTBGNEIwMDAwM0UwMDAwODI3QkQwMDI4OEY4NTAwNDQ4RjgyMDA0NEE4Cis6MTBGNEMwMDAzQzAzMDAwMTAwNDMxMDI1M0MwMzAwMDhBRjgyMDA0NEM4Cis6MTBGNEQwMDA4Rjg0MDA1NDhGODIwMDU0MDBBMzI4MjQwODAwNEQzN0U1Cis6MTBGNEUwMDAyNDg0MDAwMThGODIwMDU0MDA4MjEwMjMyQzQyMDAwMkU5Cis6MTBGNEYwMDAxNDQwRkZGQzAwMDAwMDAwOEY4MjAwNDQzQzAzRkZGRTJDCis6MTBGNTAwMDAzNDYzRkZGRjAwNDMxMDI0QUY4MjAwNDQ4RjgzMDA1NDE0Cis6MTBGNTEwMDA4RjgyMDA1NDA4MDA0RDQ1MjQ2MzAwMDE4RjgyMDA1NEZGCis6MTBGNTIwMDAwMDYyMTAyMzJDNDIwMDAyMTQ0MEZGRkMwMDAwMDAwMDg3Cis6MTBGNTMwMDAwM0UwMDAwODAwQTAxMDIxOEY4MzAwNDQzQzAyRkZGMDhDCis6MTBGNTQwMDAzNDQyRkZGRjAwMDQyNDgwMDA2MjE4MjQzQzAyMDAwMkMxCis6MTBGNTUwMDAwMDgyMjAyNTAwNjQxODI1QUY4MzAwNDQ4RjgyMDA0NDc4Cis6MTBGNTYwMDAzQzAzRkZGRTM0NjNGRkZGMDA0MzEwMjRBRjgyMDA0NERFCis6MTBGNTcwMDA4RjgzMDA1NDhGODIwMDU0MDgwMDRENUUyNDYzMDAwMTg1Cis6MTBGNTgwMDA4RjgyMDA1NDAwNjIxMDIzMkM0MjAwMDIxNDQwRkZGQ0MyCis6MTBGNTkwMDAwMDAwMDAwMDhGODIwMDQ0M0MwMzAwMDEwMDQzMTAyNTVFCis6MTBGNUEwMDBBRjgyMDA0NDhGODMwMDU0OEY4MjAwNTQwODAwNEQ2QjVCCis6MTBGNUIwMDAyNDYzMDAwMThGODIwMDU0MDA2MjEwMjMyQzQyMDAwMjU5Cis6MTBGNUMwMDAxNDQwRkZGQzAwMDAwMDAwMDNFMDAwMDgwMDAwMDAwMDAxCis6MTBGNUQwMDA4RjgyMDA0NDNDMDNGRkYwMzQ2M0ZGRkYwMDQzMTAyNDlDCis6MTBGNUUwMDBBRjgyMDA0NDhGODIwMDQ0M0MwMzAwMDEwMDQzMTAyNTk5Cis6MTBGNUYwMDBBRjgyMDA0NDhGODMwMDU0OEY4MjAwNTQwODAwNEQ3RkY3Cis6MTBGNjAwMDAyNDYzMDAwMThGODIwMDU0MDA2MjEwMjMyQzQyMDAwMjA4Cis6MTBGNjEwMDAxNDQwRkZGQzAwMDAwMDAwOEY4MjAwNDQzQzAzRkZGRTBBCis6MTBGNjIwMDAzNDYzRkZGRjAwNDMxMDI0QUY4MjAwNDQ4RjgzMDA1NEYzCis6MTBGNjMwMDA4RjgyMDA1NDA4MDA0RDhEMjQ2MzAwMDE4RjgyMDA1NDk2Cis6MTBGNjQwMDAwMDYyMTAyMzJDNDIwMDAyMTQ0MEZGRkMwMDAwMDAwMDY2Cis6MTBGNjUwMDAwM0UwMDAwODAwMDAwMDAwMjdCREZGQzhBRkIzMDAyNDhFCis6MTBGNjYwMDAwMDgwOTgyMUFGQjUwMDJDMDBBMEE4MjFBRkIyMDAyMEU3Cis6MTBGNjcwMDAwMEMwOTAyMTMyQTJGRkZGQUZCRjAwMzBBRkI0MDAyODFFCis6MTBGNjgwMDBBRkIxMDAxQ0FGQjAwMDE4MTQ0MDAwMzRBN0IyMDAxMDk2Cis6MTBGNjkwMDAzMjcxRkZGRjI3QjIwMDEwMDAwMDgwMjEwQzAwNEQ0QjlCCis6MTBGNkEwMDAyNDA0MDAwMTI2MTAwMDAxMkUwMjAwMjAxNDQwRkZGQjVDCis6MTBGNkIwMDAwMDAwMDAwMDBDMDA0RDRCMDAwMDIwMjEwQzAwNEQ0QkMxCis6MTBGNkMwMDAyNDA0MDAwMTBDMDA0RDRCMDAwMDIwMjEwQzAwNEQ0Qjg4Cis6MTBGNkQwMDAyNDA0MDAwMTI0MTAwMDEwMzIwMjAwMDExMDQwMDAwMjM2Cis6MTBGNkUwMDAwMDAwMjAyMTI0MDQwMDAxMEMwMDRENEIwMDEwODA0MjNBCis6MTBGNkYwMDAxNjAwRkZGQTMyMDIwMDAxMjQxMDAwMTAwMjMwMTAyNDFDCis6MTBGNzAwMDAxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ0Qjk5Cis6MTBGNzEwMDAwMDEwODA0MjE2MDBGRkZBMDIzMDEwMjQwQzAwNEQ0QkZFCis6MTBGNzIwMDAyNDA0MDAwMTBDMDA0RDRCMDAwMDIwMjEzNDEwODAwMDA3Cis6MTBGNzMwMDA5NjQyMDAwMDAwNTAxMDI0MTA0MDAwMDIwMDAwMjAyMURBCis6MTBGNzQwMDAyNDA0MDAwMTBDMDA0RDRCMDAxMDgwNDIxMjAwMDA3NTkzCis6MTBGNzUwMDAwMDAwMDAwMDA4MDA0REM5MDAwMDAwMDAzMjc0RkZGRkU3Cis6MTBGNzYwMDAyN0IxMDAxMEE3QTAwMDEwMDAwMDgwMjEwQzAwNEQ0QjE1Cis6MTBGNzcwMDAyNDA0MDAwMTI2MTAwMDAxMkUwMjAwMjAxNDQwRkZGQjhCCis6MTBGNzgwMDAwMDAwMDAwMDBDMDA0RDRCMDAwMDIwMjEwQzAwNEQ0QkYwCis6MTBGNzkwMDAyNDA0MDAwMTBDMDA0RDRCMjQwNDAwMDEwQzAwNEQ0QkNGCis6MTBGN0EwMDAwMDAwMjAyMTI0MTAwMDEwMzIwMjAwMDExMDQwMDAwMjRECis6MTBGN0IwMDAwMDAwMjAyMTI0MDQwMDAxMEMwMDRENEIwMDEwODA0MjY5Cis6MTBGN0MwMDAxNjAwRkZGQTMyMDIwMDAxMjQxMDAwMTAwMjkwMTAyNEVCCis6MTBGN0QwMDAxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ0QkM5Cis6MTBGN0UwMDAwMDEwODA0MjE2MDBGRkZBMDI5MDEwMjQwQzAwNEQ3MUE4Cis6MTBGN0YwMDAzNDEwODAwMDBDMDA0RDcxMDAwMDAwMDAwQzAwNEQyQkY3Cis6MTBGODAwMDAwMDAwMDAwMDUwNDAwMDA1MDAxMDgwNDI5NjIyMDAwMEQ5Cis6MTBGODEwMDAwMDUwMTAyNUE2MjIwMDAwMDAxMDgwNDIxNjAwRkZGN0JECis6MTBGODIwMDAwMDAwMDAwMDBDMDA0RDcxMDAwMDAwMDAzMkE1RkZGRjM5Cis6MTBGODMwMDAyNDAyMDAwMTU0QTIwMDA0MjQwMjAwMDI5N0EyMDAxMDM2Cis6MTBGODQwMDAwODAwNEUxNDAwNTIxMDI1MTRBMjAwMDYzMjcxRkZGRjZBCis6MTBGODUwMDA5N0EyMDAxMDAwMTIxODI3MDA0MzEwMjRBN0EyMDAxMDNFCis6MTBGODYwMDAzMjcxRkZGRjI3QjIwMDEwMDAwMDgwMjEwQzAwNEQ0QkM5Cis6MTBGODcwMDAyNDA0MDAwMTI2MTAwMDAxMkUwMjAwMjAxNDQwRkZGQjhBCis6MTBGODgwMDAwMDAwMDAwMDBDMDA0RDRCMDAwMDIwMjEwQzAwNEQ0QkVGCis6MTBGODkwMDAyNDA0MDAwMTBDMDA0RDRCMDAwMDIwMjEwQzAwNEQ0QkI2Cis6MTBGOEEwMDAyNDA0MDAwMTI0MTAwMDEwMzIwMjAwMDExMDQwMDAwMjY0Cis6MTBGOEIwMDAwMDAwMjAyMTI0MDQwMDAxMEMwMDRENEIwMDEwODA0MjY4Cis6MTBGOEMwMDAxNjAwRkZGQTMyMDIwMDAxMjQxMDAwMTAwMjMwMTAyNDRBCis6MTBGOEQwMDAxMDQwMDAwMjAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ0QkM4Cis6MTBGOEUwMDAwMDEwODA0MjE2MDBGRkZBMDIzMDEwMjQwQzAwNEQ0QjJECis6MTBGOEYwMDAyNDA0MDAwMTBDMDA0RDRCMDAwMDIwMjEzNDEwODAwMDM2Cis6MTBGOTAwMDA5NjQyMDAwMDAwNTAxMDI0MTA0MDAwMDIwMDAwMjAyMTA4Cis6MTBGOTEwMDAyNDA0MDAwMTBDMDA0RDRCMDAxMDgwNDIxNjAwRkZGODNCCis6MTBGOTIwMDAwMDAwMDAwMDBDMDA0RDcxMDAwMDAwMDA4RkJGMDAzMDhGCis6MTBGOTMwMDA4RkI1MDAyQzhGQjQwMDI4OEZCMzAwMjQ4RkIyMDAyMDI1Cis6MTBGOTQwMDA4RkIxMDAxQzhGQjAwMDE4MDNFMDAwMDgyN0JEMDAzOEZECis6MTBGOTUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyN0JERkZFOERDCis6MTBGOTYwMDBBRkJGMDAxMDNDMDMwMDAxMDA3NzE4MjE4QzYzODNBQzBCCis6MTBGOTcwMDAyNDAyMDAwODE0NjIwMjJDMDA4MDMwMjEzQzAyMDAwMUE1Cis6MTBGOTgwMDA4QzQyNUQ5ODE0NDAwMDMzMDAwMDAwMDA4Rjg1MDIyNEYzCis6MTBGOTkwMDAzOEEzMDAyMDJDNjMwMDAxMzhBMjAwMTAyQzQyMDAwMTgzCis6MTBGOUEwMDAwMDYyMTgyNTE0NjAwMDBEMzhBMzAwMzAyQzYzMDAwMTlDCis6MTBGOUIwMDAzOEEyMDQwMDJDNDIwMDAxMDA2MjE4MjUxNDYwMDAwN0UwCis6MTBGOUMwMDAzOEEzMDQwMjJDNjMwMDAxMzhBMjA0MDQyQzQyMDAwMTc1Cis6MTBGOUQwMDAwMDYyMTgyNTEwNjAwMDA1MDAwMDAwMDAwQzAwNDI5QjJBCis6MTBGOUUwMDAwMDAwMDAwMDA4MDA0RThEMjQwMjAwMEUwQzAwNDNEREQ0Cis6MTBGOUYwMDAwMDAwMDAwMDNDMDUwMDAxOENBNTVDQzgwQzAwNTJBMjcwCis6MTBGQTAwMDAwMDAwMjAyMTNDMDMwMDAxOEM2MzVDQzgyNDAyMDAwNDM4Cis6MTBGQTEwMDAxNDYyMDAwNTI0MDNGRkZCM0MwMjAwMDE4QzQyNUNDNDFECis6MTBGQTIwMDAwODAwNEU4OTI0MDNGRkY3M0MwMjAwMDE4QzQyNUNDNEFECis6MTBGQTMwMDAwMDQzMTAyNDNDMDEwMDAxQUMyMjVDQzQyNDAyMDAwRUVGCis6MTBGQTQwMDAzQzAxMDAwMTBDMDA0MjlCQUMyMjdERDAwODAwNTA4Nzk1Cis6MTBGQTUwMDAwMDAwMDAwMDhGODIwMjIwM0MwMzA0MDAwMDQzMTAyNEI5Cis6MTBGQTYwMDAxMDQwMDAyNzI0MDNGRkJGOEY4NTAyMjQzQzAyMDAwMUMxCis6MTBGQTcwMDA4QzQyN0REQzAwQTMyMDI0MDA0MzEwMjQxNDgyMDAwQzVGCis6MTBGQTgwMDAwMDAwMDAwMDNDMDIwMDAxOEM0MjdERTAyNDQyMDAwMUE1Cis6MTBGQTkwMDAzQzAxMDAwMUFDMjI3REUwMkM0MjAwMDIxNDQwMDAwODMxCis6MTBGQUEwMDAyNDAyMDAwMTNDMDEwMDAxMDgwMDRFQURBQzIyN0UwMEEyCis6MTBGQUIwMDAzQzAxMDAwMUFDMjA3REUwM0MwMTAwMDFBQzIwN0UwMDU3Cis6MTBGQUMwMDAzQzAyMDAwMThDNDI3RTAwMTA0MDAwMDYzMEEyMDA0MDQzCis6MTBGQUQwMDAxMDQwMDAwNDI0MDIwMDAxM0MwMTAwMDEwODAwNEVCODVGCis6MTBGQUUwMDBBQzIyN0UwNDNDMDEwMDAxQUMyMDdFMDQzQzAxMDAwMUZDCis6MTBGQUYwMDBBQzI1N0REQzNDMDEwMDAxMDgwMDRFQzhBQzIwN0UxMDI2Cis6MTBGQjAwMDAyNDAyMDAwMTNDMDEwMDAxQUMyMjdFMTAzQzAxMDAwMUY2Cis6MTBGQjEwMDBBQzIwN0UwMDNDMDEwMDAxQUMyMDdERTAzQzAxMDAwMUY2Cis6MTBGQjIwMDBBQzIwN0UwNDNDMDEwMDAxQUMyMDdEREMzQzAzMDAwMUU0Cis6MTBGQjMwMDA4QzYzN0REMDNDMDIwMDAxOEM0MjdERDQxMDYyMDAwM0I2Cis6MTBGQjQwMDAzQzAyMDIwMDNDMDEwMDAxQUMyMzdERDQwMEMyMTAyNDIxCis6MTBGQjUwMDAxMDQwMDAwNzI0NjNGRkZGOEY4MjAyMjAyNDAzMDAwMTZFCis6MTBGQjYwMDAzQzAxMDAwMUFDMjM1Q0NDMDgwMDUwODUzQzAzRjcwMDRECis6MTBGQjcwMDAyQzYyMDAwRTEwNDAwMUE4MDAwMzEwODAzQzAxMDAwMTFGCis6MTBGQjgwMDAwMDIyMDgyMThDMjI1QjgwMDA0MDAwMDgwMDAwMDAwMDU5Cis6MTBGQjkwMDAzQzAxMDAwMUFDMjA3RTAwM0MwMTAwMDFBQzIwN0RFMDc2Cis6MTBGQkEwMDAzQzAxMDAwMUFDMjA3RERDM0MwMTAwMDFBQzIwN0UwNDY2Cis6MTBGQkIwMDAzQzAxMDAwMUFDMjA3REY4M0MwMTAwMDFBQzIwN0RGMDRGCis6MTBGQkMwMDAwQzAwNDg2QUFGODAwMjI0MjQwMjAwMDIzQzAxMDAwMUJDCis6MTBGQkQwMDBBQzIyN0REMDNDMDIwMDAxOEM0MjdFMTAxNDQwMDA1NkM1Cis6MTBGQkUwMDAzQzAzRkRGRjhFRTIwMDAwMzQ2M0ZGRkYwMDQzMTAyNDVFCis6MTBGQkYwMDAwQzAwNDI5QkFFRTIwMDAwQUY4MDAyMDQ4RjgyMDIwMDQ0Cis6MTBGQzAwMDAyNDAzRkZGRDAwNDMxMDI0QUY4MjAyMDAzQzAxMDAwMUU5Cis6MTBGQzEwMDBBQzIwN0UyMDhGODMwMDU0M0MwMjAwMDE4QzQyN0RGODkyCis6MTBGQzIwMDAyNDA0MDAwMTNDMDEwMDAxQUMyNDdFMEMyNDQyMDAwMUFDCis6MTBGQzMwMDAzQzAxMDAwMUFDMjI3REY4MkM0MjAwMDQzQzAxMDAwMTkzCis6MTBGQzQwMDBBQzIzN0RGNDE0NDAwMDA2MjQwMjAwMDMzQzAxMDAwMUIzCis6MTBGQzUwMDBBQzI0NUNDQzNDMDEwMDAxMDgwMDUwODNBQzIwN0RGODUyCis6MTBGQzYwMDAzQzAxMDAwMTA4MDA1MDgzQUMyMjdERDA4RjgzMDA1NEZBCis6MTBGQzcwMDAzQzAyMDAwMThDNDI3REY0MjQ2M0Q4RjAwMDQzMTAyMzQxCis6MTBGQzgwMDAyQzQyMjcxMDE0NDAwMDAzMjQwMjAwMDQzQzAxMDAwMTEwCis6MTBGQzkwMDBBQzIyN0REMDNDMDIwMDAxOEM0MjdFMTAxNDQwMDAyNjM0Cis6MTBGQ0EwMDAzQzAzRkRGRjhFRTIwMDAwMzQ2M0ZGRkYwMDQzMTAyNDlECis6MTBGQ0IwMDAwODAwNTA4M0FFRTIwMDAwM0MwNDAwMDE4Qzg0NUQ5QzhGCis6MTBGQ0MwMDAzQzAxMDAwMTBDMDA1MDhBQUMyMDdERTgzQzAyMDAwMUEwCis6MTBGQ0QwMDA4QzQyN0UxQ0FGODIwMjA0M0MwMjAwMDE4QzQyN0UxMEVBCis6MTBGQ0UwMDAxNDQwMDAxNTNDMDNGREZGOEVFMjAwMDAzNDYzRkZGRjZCCis6MTBGQ0YwMDAwMDQzMTAyNEFFRTIwMDAwOEY4MjAyMDQzMDQyMDAzMDQ0Cis6MTBGRDAwMDAxNDQwMDEzQzI0MDIwMDAyM0MwMzAwMDE4QzYzN0UxQzcxCis6MTBGRDEwMDAyNDAyMDAwNTNDMDEwMDAxQUMyMjdERDAzQzAxMDAwMTIxCis6MTBGRDIwMDAwODAwNTA4M0FDMjM3RTIwM0MwMjAwMDE4QzQyN0UxMEYwCis6MTBGRDMwMDAxMDQwMDAxMDNDMDNGREZGM0MwMjAwMDE4QzQyNUQ2QzUyCis6MTBGRDQwMDAyNDQyMDAwMTNDMDEwMDAxQUMyMjVENkMyQzQyMDAwMjA3Cis6MTBGRDUwMDAxNDQwMDEzMTI0MDIwMDAxM0MwMTAwMDFBQzIyNUQ3NDE5Cis6MTBGRDYwMDAzQzAxMDAwMUFDMjA1RDZDM0MwMTAwMDEwODAwNTA4M0E3Cis6MTBGRDcwMDBBQzIyNUNDQzhFRTIwMDAwMzQ2M0ZGRkYwMDQzMTAyNDExCis6MTBGRDgwMDBBRUUyMDAwMDNDMDIwMDAxOEM0MjdFMDAxMDQwMDEyMkU1Cis6MTBGRDkwMDAwMDAwMDAwMDNDMDIwMDAxOEM0MjdEREMxMDQwMDExRThFCis6MTBGREEwMDAwMDAwMDAwMDNDMDEwMDAxQUMyMjdFMDgyNDAyMDAwMzk4Cis6MTBGREIwMDAzQzAxMDAwMUFDMjI3REUwMDgwMDUwMjQyNDAyMDAwNjMyCis6MTBGREMwMDAzQzAxMDAwMUFDMjA3REU4OEY4MjAyMDQzNDQyMDA0MEY3Cis6MTBGREQwMDBBRjgyMDIwNDNDMDIwMDAxOEM0MjdFMjAyNDAzMDAwNzEzCis6MTBGREUwMDAzQzAxMDAwMUFDMjM3REQwMzQ0MjAwNDAzQzAxMDAwMUM1Cis6MTBGREYwMDBBQzIyN0UyMDNDMDIwMDAxOEM0MjdFMDAxMDQwMDAwNUI3Cis6MTBGRTAwMDAwMDAwMDAwMDNDMDIwMDAxOEM0MjdEREMxMDQwMDBGOTQzCis6MTBGRTEwMDAyNDAyMDAwMjNDMDUwMDAxMjRBNTdERTA4Q0EyMDAwMDI0Cis6MTBGRTIwMDAyQzQyNEUyMTEwNDAwMEYzMjQwMjAwMDIzQzAyMDAwMTRCCis6MTBGRTMwMDA4QzQyN0UwNDEwNDAwMEY4MjQwNEZGQkYzQzAyMDAwMTA1Cis6MTBGRTQwMDA4QzQyN0REQzNDMDMwMDAxOEM2MzdFMDgwMDQ0MTAyNDVFCis6MTBGRTUwMDAwMDY0MTgyNDEwNDMwMDA0MjQwMjAwMDEzQzAxMDAwMTQ2Cis6MTBGRTYwMDAwODAwNTA4M0FDMjI3REQwMjQwMjAwMDNBQ0EyMDAwMDI1Cis6MTBGRTcwMDAyNDAyMDAwODNDMDEwMDAxQUMyMjdERDAzQzAyMDAwMUJDCis6MTBGRTgwMDA4QzQyN0UwQzEwNDAwMDBDMjQwMjAwMDEzQzA0MDAwMTU2Cis6MTBGRTkwMDAwQzAwNTA5NzhDODQ3RERDM0MwMjAwMDE4QzQyN0UyODUzCis6MTBGRUEwMDAxNDQwMDAwNTI0MDIwMDAxM0MwMjAwMDE4QzQyN0UyNDIzCis6MTBGRUIwMDAxMDQwMDAwNjI0MDIwMDAxM0MwMTAwMDFBQzIyNUNDQzkxCis6MTBGRUMwMDAzQzAxMDAwMTA4MDA1MDgzQUMyMDdERjgzQzAyMDAwMTk5Cis6MTBGRUQwMDA4QzQyN0RGMDNDMDMwMDAxOEM2MzdEREMyQzQyMDAwMUYwCis6MTBGRUUwMDAwMDAyMTBDMDMwNjMwMDA4M0MwMTAwMDFBQzIyN0RGMDJDCis6MTBGRUYwMDAzQzAxMDAwMUFDMjM3REVDOEY4MzAwNTQyNDAyMDAwOUY3Cis6MTBGRjAwMDAzQzAxMDAwMUFDMjI3REQwM0MwMTAwMDEwODAwNTA4MzdGCis6MTBGRjEwMDBBQzIzN0RGNDhGODMwMDU0M0MwMjAwMDE4QzQyN0RGNEJECis6MTBGRjIwMDAyNDYzRDhGMDAwNDMxMDIzMkM0MjI3MTAxNDQwMDBBODZCCis6MTBGRjMwMDAwMDAwMDAwMDNDMDIwMDAxOEM0MjdFMDAxMDQwMDAwNUUxCis6MTBGRjQwMDAwMDAwMDAwMDNDMDIwMDAxOEM0MjdEREMxMDQwMDBBOTUyCis6MTBGRjUwMDAyNDAyMDAwMjNDMDMwMDAxMjQ2MzdERTA4QzYyMDAwMDY3Cis6MTBGRjYwMDAyQzQyNEUyMTEwNDAwMEEzMjQwMjAwMDIzQzAyMDAwMTVBCis6MTBGRjcwMDA4QzQyN0UwQzEwNDAwMDBFMDAwMDAwMDAzQzAyMDAwMThDCis6MTBGRjgwMDA4QzQyN0REQzNDMDEwMDAxQUMyMDdFMEMzMDQyMDA4MEM0Cis6MTBGRjkwMDAxMDQwMDAyRjI0MDIwMDBDOEY4MjAyMDQzMDQyMDA4MEE3Cis6MTBGRkEwMDAxNDQwMDAwQzI0MDIwMDAzMDgwMDUwMTEyNDAyMDAwQzJECis6MTBGRkIwMDAzQzAyMDAwMThDNDI3RERDMzA0MjAwODAxNDQwMDAwNTkwCis6MTBGRkMwMDAyNDAyMDAwMzhGODIwMjA0MzA0MjAwODAxMDQwMDAxRjkwCis6MTBGRkQwMDAyNDAyMDAwM0FDNjIwMDAwMjQwMjAwMEEzQzAxMDAwMTdDCis6MTBGRkUwMDBBQzIyN0REMDNDMDQwMDAxMjQ4NDdFMTg4QzgyMDAwMDY5Cis6MTBGRkYwMDAzQzAzMDAwMThDNjM3REYwMDA0MzEwMjVBRjgyMDIwNEI2Cis6MDIwMDAwMDIxMDAwRUMKKzoxMDAwMDAwMDhDODMwMDAwM0MwNDAwMDE4Qzg0N0RGMDI0MDIwMDBCRjIKKzoxMDAwMTAwMDNDMDEwMDAxQUMyMjdERDAwMDY0MTgyNTNDMDEwMDAxQTgKKzoxMDAwMjAwMEFDMjM3RTIwM0MwNTAwMDEyNEE1N0RFMDhDQTIwMDAwQ0QKKzoxMDAwMzAwMDJDNDI0RTIxMTA0MDAwNkYyNDAyMDAwMjNDMDIwMDAxQkQKKzoxMDAwNDAwMDhDNDI3RTEwMTA0MDAwMDUwMDAwMDAwMDI0MDIwMDBDQ0QKKzoxMDAwNTAwMDNDMDEwMDAxMDgwMDUwODNBQzIyN0REMDNDMDIwMDAxMkQKKzoxMDAwNjAwMDhDNDI3RTAwMTA0MDAwNkMwMDAwMDAwMDNDMDQwMDAxNDcKKzoxMDAwNzAwMDhDODQ3RERDMTA4MDAwNUUzMDgyMDAwODNDMDMwMDAxMkYKKzoxMDAwODAwMDhDNjM3REVDMTA2MjAwNjQyNDAyMDAwMzNDMDEwMDAxREIKKzoxMDAwOTAwMEFDMjQ3RTA4QUNBMjAwMDAyNDAyMDAwNjNDMDEwMDAxNTIKKzoxMDAwQTAwMDA4MDA1MDgzQUMyMjdERDA4RjgyMDIwMDM0NDIwMDAyQ0YKKzoxMDAwQjAwMEFGODIwMjAwOEY4MzAwNTQyNDAyMDAwRDNDMDEwMDAxMzYKKzoxMDAwQzAwMEFDMjI3REQwM0MwMTAwMDFBQzIzN0RGNDhGODMwMDU0MzEKKzoxMDAwRDAwMDNDMDIwMDAxOEM0MjdERjQyNDYzRDhGMDAwNDMxMDIzREQKKzoxMDAwRTAwMDJDNDIyNzEwMTQ0MDAwM0EwMDAwMDAwMDNDMDIwMDAxOUUKKzoxMDAwRjAwMDhDNDI3RTEwMTA0MDAwMjkyNDAyMDAwRTNDMDMwMDAxQjcKKzoxMDAxMDAwMDhDNjM3RTI0M0MwMTAwMDExNDYwMDAxNUFDMjI3REQwN0MKKzoxMDAxMTAwMDBDMDA0M0REMDAwMDAwMDAzQzA1MDAwMThDQTU1Q0M4MUMKKzoxMDAxMjAwMDBDMDA1MkEyMDAwMDIwMjEzQzAzMDAwMThDNjM1Q0M4M0IKKzoxMDAxMzAwMDI0MDIwMDA0MTQ2MjAwMDUyNDAzRkZGQjNDMDIwMDAxQkEKKzoxMDAxNDAwMDhDNDI1Q0M0MDgwMDUwNTIyNDAzRkZGNzNDMDIwMDAxQkIKKzoxMDAxNTAwMDhDNDI1Q0M0MDA0MzEwMjQzQzAxMDAwMUFDMjI1Q0M0MEUKKzoxMDAxNjAwMDhFRTIwMDAwM0MwMzAyMDAwMDQzMTAyNUFFRTIwMDAwRDYKKzoxMDAxNzAwMDhGODIwMjI0M0MwMTAwMDFBQzIyN0UyQzhGODIwMjIwNUYKKzoxMDAxODAwMDI0MDNGRkZCMDA0MzEwMjRBRjgyMDIyMDhGODIwMjIwNTEKKzoxMDAxOTAwMDM0NDIwMDAyMDgwMDUwODNBRjgyMDIyMDNDMDIwMDAxN0EKKzoxMDAxQTAwMDhDNDI3RTAwMTA0MDAwMDUwMDAwMDAwMDNDMDIwMDAxNkYKKzoxMDAxQjAwMDhDNDI3RERDMTA0MDAwMEYyNDAyMDAwMjNDMDIwMDAxNTIKKzoxMDAxQzAwMDhDNDI3REUwMkM0MjRFMjExMDQwMDAwQTI0MDIwMDAyQTUKKzoxMDAxRDAwMDNDMDIwMDAxOEM0MjdFMDAxMDQwMDAwRjAwMDAwMDAwMzUKKzoxMDAxRTAwMDNDMDIwMDAxOEM0MjdEREMxNDQwMDAwQjAwMDAwMDAwNEEKKzoxMDAxRjAwMDI0MDIwMDAyM0MwMTAwMDEwODAwNTA4M0FDMjI3REQwQTMKKzoxMDAyMDAwMDNDMDIwMDAxOEM0MjdFMDAxMDQwMDAwMzAwMDAwMDAwMTAKKzoxMDAyMTAwMDBDMDA0MjlCMDAwMDAwMDA4RjgyMDIyMDNDMDNGNzAwOEMKKzoxMDAyMjAwMDAwNDMxMDI1QUY4MjAyMjA4RkJGMDAxMDAzRTAwMDA4QkEKKzoxMDAyMzAwMDI3QkQwMDE4M0MwMzAwMDEyNDYzN0UyODhDNjIwMDAwNjcKKzoxMDAyNDAwMDEwNDAwMDA1MzQ0MjIwMDAzQzAxMDAwMUFDMjI3RTFDMUQKKzoxMDAyNTAwMDA4MDA1MDk1QUM2MDAwMDAzQzAxMDAwMUFDMjQ3RTFDRkQKKzoxMDAyNjAwMDAzRTAwMDA4MDAwMDAwMDAyN0JERkZFMDMwODIwMDMwRkUKKzoxMDAyNzAwMEFGQkYwMDE4M0MwMTAwMDFBQzIyN0UyNDE0NDAwMDY3OEYKKzoxMDAyODAwMDNDMDJGRkZGMzQ0MjFGMEUwMDgyMTAyNDE0NDAwMDYxMjQKKzoxMDAyOTAwMDI0MDIwMDMwMzA4MjIwMDAxMDQwMDA1RDMwODM4MDAwNTYKKzoxMDAyQTAwMDAwMDMxQTAyMzA4MjAwMDEwMDAyMTIwMDNDMDQwMDAxMjcKKzoxMDAyQjAwMDhDODQ1RDlDMDA2MjE4MjUwMDAzMzFDMjNDMDMwMDAxNjAKKzoxMDAyQzAwMDI0NjM1RDc4MzA4MjgwMDAwMDAyMTIwMjMwODQwMDAxRDUKKzoxMDAyRDAwMDAwMDQyMjAwMDA0NDEwMjUwMDAyMzlDMjAwMDYxMDgwRUMKKzoxMDAyRTAwMDAwNDMxMDIxMDA0NzEwMjE5MDQzMDAwMDI0MDIwMDAxMjgKKzoxMDAyRjAwMDEwNjIwMDI1MDAwMDAwMDAxMDYwMDAwNzI0MDIwMDAyQzgKKzoxMDAzMDAwMDEwNjIwMDEzMjQwMjAwMDMxMDYyMDAyQzNDMDUwMDBGNTEKKzoxMDAzMTAwMDA4MDA1MEY5MDAwMDAwMDA4RjgyMDIwMDI0MDNGRUZGNTUKKzoxMDAzMjAwMDAwNDMxMDI0QUY4MjAyMDA4RjgyMDIyMDNDMDNGRkZFQjQKKzoxMDAzMzAwMDM0NjNGRkZGMDA0MzEwMjRBRjgyMDIyMDNDMDEwMDAxMjAKKzoxMDAzNDAwMEFDMjA3RTQ0M0MwMTAwMDEwODAwNTEwNEFDMjA3RTRDRUUKKzoxMDAzNTAwMDhGODIwMjAwMzQ0MjAxMDBBRjgyMDIwMDhGODIwMjIwQUQKKzoxMDAzNjAwMDNDMDNGRkZFMzQ2M0ZGRkYwMDQzMTAyNEFGODIwMjIwRjIKKzoxMDAzNzAwMDI0MDIwMTAwM0MwMTAwMDFBQzIyN0U0NDNDMDEwMDAxNEEKKzoxMDAzODAwMDA4MDA1MTA0QUMyMDdFNEM4RjgyMDIwMDI0MDNGRUZGNDMKKzoxMDAzOTAwMDAwNDMxMDI0QUY4MjAyMDA4RjgyMDIyMDNDMDMwMDAxNDAKKzoxMDAzQTAwMDAwNDMxMDI1QUY4MjAyMjAzQzAxMDAwMUFDMjA3RTQ0QjYKKzoxMDAzQjAwMDNDMDEwMDAxMDgwMDUxMDRBQzIzN0U0QzhGODIwMjAwRjYKKzoxMDAzQzAwMDM0NDIwMTAwQUY4MjAyMDA4RjgyMDIyMDNDMDMwMDAxMTAKKzoxMDAzRDAwMDAwNDMxMDI1QUY4MjAyMjAyNDAyMDEwMDNDMDEwMDAxRUQKKzoxMDAzRTAwMEFDMjI3RTQ0M0MwMTAwMDEwODAwNTEwNEFDMjM3RTRDNDkKKzoxMDAzRjAwMDM0QTVGRkZGM0MwNDAwMDEyNDg0NUJCOEFGQTMwMDEwQzgKKzoxMDA0MDAwMDBDMDAyNDAzQUZBMDAwMTQwODAwNTEwNDAwMDAwMDAwRjkKKzoxMDA0MTAwMDI0MDIwMDMwM0MwMTAwMDFBQzIyN0UyODhGQkYwMDE4NkUKKzoxMDA0MjAwMDAzRTAwMDA4MjdCRDAwMjAwMDAwMDAwMDI3QkRGRkM4MzIKKzoxMDA0MzAwMEFGQjIwMDI4MDA4MDkwMjFBRkIzMDAyQzAwQTA5ODIxMUIKKzoxMDA0NDAwMEFGQjAwMDIwMDBDMDgwMjEzQzA0MDAwMTI0ODQ1QkQwQjgKKzoxMDA0NTAwMDNDMDUwMDA5M0MwMjAwMDE4QzQyNUNDODM0QTU5MDAxQjcKKzoxMDA0NjAwMDAyNDAzMDIxMDI2MDM4MjFBRkJGMDAzMEFGQjEwMDI0MUMKKzoxMDA0NzAwMEE3QTAwMDFBQUZCMDAwMTQwQzAwMjQwM0FGQTIwMDEwMTQKKzoxMDA0ODAwMDI0MDIwMDAyMTI2MjAwODMyRTYyMDAwMzEwNDAwMDA1NjUKKzoxMDA0OTAwMDI0MDIwMDAxMTI2MjAwMEEwMDAwMDAwMDA4MDA1MjlCQzIKKzoxMDA0QTAwMDAwMDAwMDAwMjQwMjAwMDQxMjYyMDBGQTI0MDIwMDA4ODYKKzoxMDA0QjAwMDEyNjIwMEY5M0MwMkZGRUMwODAwNTI5QjAwMDAwMDAwQjEKKzoxMDA0QzAwMDNDMDIwMDAxOEM0MjVDQzQzMDQyMDAwMjE0NDAwMDA0MzMKKzoxMDA0RDAwMDAwMTI4OTQwM0MwMkZGRkIzNDQyRkZGRjAyMDI4MDI0RUQKKzoxMDA0RTAwMDNDMDEwMDAxMDAzMTA4MjFBQzMwN0UzQzNDMDI0MDAwNjAKKzoxMDA0RjAwMDAyMDIxMDI0MTA0MDAwNEUwMDEwMjNDMjMwODQwMDMwNEQKKzoxMDA1MDAwMDAwMTAxMzgyMzA0MjAwMUMzQzAzMDAwMTI0NjM1RDA4OEMKKzoxMDA1MTAwMDAwNDMxMDIxMDA4MjM4MjEzQzAyMDAyMDAyMDIxMDI0RjYKKzoxMDA1MjAwMDEwNDAwMDA2MjQwMjAxMDAzQzAxMDAwMTAwMzEwODIxQjYKKzoxMDA1MzAwMEFDMjI3RTQwMDgwMDUxNTAzQzAyMDA4MDNDMDEwMDAxOEEKKzoxMDA1NDAwMDAwMzEwODIxQUMyMDdFNDAzQzAyMDA4MDAyMDIxMDI0RDEKKzoxMDA1NTAwMDEwNDAwMDA2MDAxMjE5NDAzQzAyMDAwMTNDMDEwMDAxNUQKKzoxMDA1NjAwMDAwMjMwODIxMDgwMDUxNUNBQzIyN0U0ODAwMTIxMTQwOTMKKzoxMDA1NzAwMDNDMDEwMDAxMDAyMjA4MjFBQzIwN0U0ODk0RTQwMDAwRTgKKzoxMDA1ODAwMDNDMDMwMDAxOEM2MzVEQkMyNDAyMDAwNTEwNjIwMDEwNzYKKzoxMDA1OTAwMEE3QTQwMDE4MzIwMjQwMDAxMDQwMDAwMjM0ODI0MDAwM0MKKzoxMDA1QTAwMEE3QTIwMDE4MjQwNDAwMDE5NEUyMDAwMjI0MDUwMDA0MUMKKzoxMDA1QjAwMDI0RTYwMDAyMzQ0MjAwMDEwQzAwNDk4RUE0RTIwMDAyNEQKKzoxMDA1QzAwMDI0MDQwMDAxMDAwMDI4MjEwQzAwNDk4RTI3QTYwMDE4RjEKKzoxMDA1RDAwMDNDMDIwMDAxOEM0MjVDQzgyNDExMDAwMTNDMDEwMDAxNzYKKzoxMDA1RTAwMEFDMzE1Q0Q0MTQ1MzAwMDQzMjAyODAwMDBDMDA0MjlCRjYKKzoxMDA1RjAwMDAwMDAwMDAwMzIwMjgwMDAxMDQwMDExRjAwMDAwMDAwRDcKKzoxMDA2MDAwMDBDMDA0MjlCMDAwMDAwMDAzQzAzMDAwMThDNjM1REJDQjkKKzoxMDA2MTAwMDI0MDIwMDA1MTA2MjAxMTgyNDAyMDAwMjNDMDEwMDAxQkUKKzoxMDA2MjAwMEFDMzE1Q0NDM0MwMTAwMDEwODAwNTI5QkFDMjI1Q0M4QTAKKzoxMDA2MzAwMDI0MDQwMDAxMjQwNTAwMDQyN0IwMDAxQTBDMDA0OThFOTAKKzoxMDA2NDAwMDAyMDAzMDIxMjQwNDAwMDEwMDAwMjgyMTBDMDA0OThFMDIKKzoxMDA2NTAwMDAyMDAzMDIxM0MwMjAwMDEwMDUxMTAyMThDNDI3RTM0MDYKKzoxMDA2NjAwMDNDMDQwMDAxOEM4NDVDQzgzQzAzQkZGRjM0NjNGRkZGODMKKzoxMDA2NzAwMDNDMDEwMDAxQUMzMzVDRDQwMDQzMTAyNDNDMDEwMDAxNzgKKzoxMDA2ODAwMDAwMzEwODIxMTA5MzAwRkFBQzIyN0UzNDA4MDA1MjlCRkUKKzoxMDA2OTAwMDAwMDAwMDAwM0MwMjIwMDAwMjAyMTAyNDEwNDAwMDA1NkYKKzoxMDA2QTAwMDI0MDIwMDAxM0MwMTAwMDFBQzIyNUQ5ODA4MDA1MUFEMUMKKzoxMDA2QjAwMDAwMTI4OTQwM0MwMTAwMDFBQzIwNUQ5ODAwMTI4OTQwODUKKzoxMDA2QzAwMDNDMDEwMDAxMDAzMTA4MjFBQzMwN0UzODNDMDI0MDAwODIKKzoxMDA2RDAwMDAyMDIxMDI0MTQ0MDAwMTYwMDAwMDAwMDNDMDIwMDAxMzkKKzoxMDA2RTAwMDhDNDI1RDk4MTA0MDAwMDgyNDA0MDAwNDI0MDUwMDAxOTkKKzoxMDA2RjAwMDBDMDA0RDkzMjQwNjIwMDAyNDAyMDAwMTNDMDEwMDAxNUYKKzoxMDA3MDAwMDAwMzcwODIxQUMyMjgzQUMzQzAyMDAwMTAwNTExMDIxQ0IKKzoxMDA3MTAwMDhDNDI3RTMwM0MwM0JGRkYzNDYzRkZGRjAwNDMxMDI0NTQKKzoxMDA3MjAwMDNDMDEwMDAxMDAzMTA4MjEwODAwNTI5OUFDMjI3RTMwQzIKKzoxMDA3MzAwMDNDMDIwMDAxOEM0MjVEOTgxMDQwMDAyODNDMDMwMEEwNjAKKzoxMDA3NDAwMDAyMDMxMDI0NTQ0MzAwMEQzQzAyMDAyMDNDMDIwMDAxMkYKKzoxMDA3NTAwMDhDNDI1RDlDMjQwMzAxMDAzQzAxMDAwMTAwMzEwODIxMTIKKzoxMDA3NjAwMEFDMjM3RTQ0M0MwMzAwMDEzQzAxMDAwMTAwMzEwODIxMjAKKzoxMDA3NzAwMEFDMjM3RTRDMDgwMDUxRjAzNDQyMDQwMDAyMDIxMDI0RTUKKzoxMDA3ODAwMDEwNDAwMDA4MjQwMzAxMDAzQzAyMDAwMThDNDI1RDlDRTMKKzoxMDA3OTAwMDNDMDEwMDAxMDAzMTA4MjFBQzIzN0U0NDA4MDA1MUYwRTcKKzoxMDA3QTAwMDM0NDIwODAwM0MwMjAwODAwMjAyMTAyNDEwNDAwMDJFNTcKKzoxMDA3QjAwMDNDMDMwMDAxM0MwMjAwMDE4QzQyNUQ5QzNDMDEwMDAxQjUKKzoxMDA3QzAwMDAwMzEwODIxQUMyMzdFNEMzNDQyMEMwMDNDMDEwMDAxNzYKKzoxMDA3RDAwMEFDMjI1RDlDMDgwMDUyMTgyNDA0MDAwMTNDMDIwMDIwNTkKKzoxMDA3RTAwMDAyMDIxMDI0MTA0MDAwMDYyNDAyMDEwMDNDMDEwMDAxMTYKKzoxMDA3RjAwMDAwMzEwODIxQUMyMjdFNDQwODAwNTIwMTNDMDIwMDgwRjYKKzoxMDA4MDAwMDNDMDEwMDAxMDAzMTA4MjFBQzIwN0U0NDNDMDIwMDgwMDQKKzoxMDA4MTAwMDAyMDIxMDI0MTA0MDAwMDcwMDEyMTk0MDNDMDIwMDAxOUYKKzoxMDA4MjAwMDNDMDEwMDAxMDAyMzA4MjFBQzIyN0U0QzA4MDA1MjBGM0QKKzoxMDA4MzAwMDI0MDQwMDAxMDAxMjExNDAzQzAxMDAwMTAwMjIwODIxQTMKKzoxMDA4NDAwMEFDMjA3RTRDMjQwNDAwMDEwMDAwMjgyMTI3QjAwMDFFQUIKKzoxMDA4NTAwMDBDMDA0OTRDMDIwMDMwMjEyNDA0MDAwMTAwMDAyODIxMzIKKzoxMDA4NjAwMDBDMDA0OTRDMDIwMDMwMjEyNDA0MDAwMTI0MDUwMDAxNDEKKzoxMDA4NzAwMDI3QjAwMDFDMEMwMDQ5NEMwMjAwMzAyMTI0MDQwMDAxNjgKKzoxMDA4ODAwMDI0MDUwMDAxMEMwMDQ5NEMwMjAwMzAyMTA4MDA1Mjk5NTcKKzoxMDA4OTAwMDAwMDAwMDAwM0MwMkZGRUMzNDQyRkZGRjAyMDI4MDI0MTMKKzoxMDA4QTAwMDNDMDIwMDA4MDIwMjgwMjUwMDEyMTE0MDNDMDEwMDAxQjgKKzoxMDA4QjAwMDAwMjIwODIxQUMzMDdFMzgzQzAyMjAwMDAyMDIxMDI0QzUKKzoxMDA4QzAwMDEwNDAwMDA5MDAwMDAwMDAzQzAyMDAwMThDNDI1RDc0RjEKKzoxMDA4RDAwMDE0NDAwMDA1MjQwMjAwMDEzQzAxMDAwMUFDMjI1RDk4OTcKKzoxMDA4RTAwMDA4MDA1MjNBM0MwMjQwMDAzQzAxMDAwMUFDMjA1RDk4RjcKKzoxMDA4RjAwMDNDMDI0MDAwMDIwMjEwMjQxNDQwMDAxRTAwMDAwMDAwRDAKKzoxMDA5MDAwMDNDMDIwMDAxOEM0MjVEOTgzQzAxMDAwMUFDMjA1Q0UwOUYKKzoxMDA5MTAwMDEwNDAwMDA3MjQwMjIwMjAzQzAxMDAwMUFDMjI1RDlDMTUKKzoxMDA5MjAwMDI0MDIwMDAxM0MwMTAwMDEwMDM3MDgyMUFDMjI4M0FDMDUKKzoxMDA5MzAwMDNDMDRCRkZGMDAxMjE5NDAzQzAyMDAwMTAwNDMxMDIxOUIKKzoxMDA5NDAwMDhDNDI3RTMwM0MwNTAwMDE4Q0E1NUNDODM0ODRGRkZGREUKKzoxMDA5NTAwMDAwNDQxMDI0M0MwMTAwMDEwMDIzMDgyMUFDMjI3RTMwMTkKKzoxMDA5NjAwMDI0MDIwMDAxMTBBMjAwNDQwMDAwMDAwMDA4MDA1Mjk5NzcKKzoxMDA5NzAwMDAwMDAwMDAwM0MwMjAwMDE4QzQyNUQ5ODEwNDAwMDFDMDkKKzoxMDA5ODAwMDI0MDIyMDAwM0MwMTAwMDFBQzIyNUQ5QzNDMDMwMEEwM0QKKzoxMDA5OTAwMDAyMDMxMDI0MTQ0MzAwMDUwMDEyMTE0MDM0MDJBMDAwODkKKzoxMDA5QTAwMDNDMDEwMDAxMDgwMDUyOTRBQzIyNUQ5QzNDMDMwMDAxMTQKKzoxMDA5QjAwMDAwNjIxODIxOEM2MzdFMzgzQzAyMDAyMDAwNjIxMDI0MDMKKzoxMDA5QzAwMDEwNDAwMDA0MjQwMjIwMDEzQzAxMDAwMTA4MDA1Mjk0NjAKKzoxMDA5RDAwMEFDMjI1RDlDM0MwMjAwODAwMDYyMTAyNDEwNDAwMDFGOEQKKzoxMDA5RTAwMDM0MDJBMDAxM0MwMTAwMDEwODAwNTI5NEFDMjI1RDlDM0QKKzoxMDA5RjAwMDNDMDIwMDIwMDIwMjEwMjQxMDQwMDAwNzAwMTIxOTQwOUYKKzoxMDBBMDAwMDI0MDIwMTAwM0MwMTAwMDEwMDIzMDgyMUFDMjI3RTQ0QTUKKzoxMDBBMTAwMDA4MDA1Mjg4M0MwMjAwODAwMDEyMTE0MDNDMDEwMDAxOTUKKzoxMDBBMjAwMDAwMjIwODIxQUMyMDdFNDQzQzAyMDA4MDAyMDIxMDI0RjcKKzoxMDBBMzAwMDEwNDAwMDA2MDAxMjE5NDAzQzAyMDAwMTNDMDEwMDAxNzgKKzoxMDBBNDAwMDAwMjMwODIxMDgwMDUyOTRBQzIyN0U0QzAwMTIxMTQwNzEKKzoxMDBBNTAwMDNDMDEwMDAxMDAyMjA4MjFBQzIwN0U0QzNDMDMwMDAxMzcKKzoxMDBBNjAwMDhDNjM1Q0M4MjQwMjAwMDExMDYyMDAwMzAwMDAwMDAwRDcKKzoxMDBBNzAwMDBDMDA0MjlCMDAwMDAwMDA4RkJGMDAzMDhGQjMwMDJDQTEKKzoxMDBBODAwMDhGQjIwMDI4OEZCMTAwMjQ4RkIwMDAyMDAzRTAwMDA4NEYKKzoxMDBBOTAwMDI3QkQwMDM4MjdCREZGRDhBRkIyMDAyMDAwODA5MDIxQ0QKKzoxMDBBQTAwMEFGQjEwMDFDMDAwMDg4MjEyNDAyMDAwMkFGQkYwMDI0NjcKKzoxMDBBQjAwMEFGQjAwMDE4QTdBMDAwMTIxMEEyMDBEM0E3QTAwMDEwOEEKKzoxMDBBQzAwMDJDQTIwMDAzMTA0MDAwMDUyNDAyMDAwMTEwQTIwMDBBMUQKKzoxMDBBRDAwMDAwMTI4MTQwMDgwMDUzODAwMjIwMTAyMTI0MDIwMDA0RUIKKzoxMDBBRTAwMDEwQTIwMDdEMjQwMjAwMDgxMEEyMDA3QzAwMTIyOTQwMDAKKzoxMDBBRjAwMDA4MDA1MzgwMDIyMDEwMjEzQzAzMDAwMTAwNzAxODIxREYKKzoxMDBCMDAwMDhDNjM3RTNDM0MwMjQwMDAwMDYyMTAyNDE0NDAwMDA5Q0IKKzoxMDBCMTAwMDI0MDQwMDAxM0MwMjdGRkYzNDQyRkZGRjAwNjI4ODI0NkUKKzoxMDBCMjAwMDNDMDEwMDAxMDAzMDA4MjFBQzMxN0UzNDA4MDA1MzgwQzQKKzoxMDBCMzAwMDAyMjAxMDIxMjQwNTAwMDEwQzAwNDk0QzI3QTYwMDEwQkEKKzoxMDBCNDAwMDI0MDQwMDAxMjQwNTAwMDEwQzAwNDk0QzI3QTYwMDEwRDQKKzoxMDBCNTAwMDk3QTIwMDEwMzA0MjAwMDQxMDQwMDAzNDNDMTE0MDAwQzUKKzoxMDBCNjAwMDNDMDIwMDAxOEM0MjVEQkMyNDQzRkZGRjJDNjIwMDA2NjYKKzoxMDBCNzAwMDEwNDAwMDM0MDAwMzEwODAzQzAxMDAwMTAwMjIwODIxRDUKKzoxMDBCODAwMDhDMjI1QkUwMDA0MDAwMDgwMDAwMDAwMDI0MDQwMDAxMEIKKzoxMDBCOTAwMDI0MDUwMDExMjdCMDAwMTIwQzAwNDk0QzAyMDAzMDIxM0UKKzoxMDBCQTAwMDI0MDQwMDAxMjQwNTAwMTEwQzAwNDk0QzAyMDAzMDIxRUUKKzoxMDBCQjAwMDk3QTUwMDEyMzBBMjQwMDAxMDQwMDAwMjNDMDQwMDEwMzMKKzoxMDBCQzAwMDNDMDQwMDA4M0MwMzAwMDEwODAwNTMwMTMwQTI4MDAwRUYKKzoxMDBCRDAwMDI0MDQwMDAxMjQwNTAwMTQyN0IwMDAxMjBDMDA0OTRDMjUKKzoxMDBCRTAwMDAyMDAzMDIxMjQwNDAwMDEyNDA1MDAxNDBDMDA0OTRDQUIKKzoxMDBCRjAwMDAyMDAzMDIxOTdBNTAwMTIzMEEyMTAwMDEwNDAwMDAyMjAKKzoxMDBDMDAwMDNDMDQwMDEwM0MwNDAwMDgzQzAzMDAwMTMwQTIwODAwMzIKKzoxMDBDMTAwMDU0NDAwMDAxM0MwMzAwMDIzQzAyODAwMDAyMjIxMDI1RTcKKzoxMDBDMjAwMDAwNjQxODI1MDgwMDUzMEUwMDQzODgyNTNDMTEwMDAxN0MKKzoxMDBDMzAwMDAyMzA4ODIxOEUzMTdFM0MzQzAyN0ZGRjM0NDJGRkZGMzAKKzoxMDBDNDAwMDAyMjI4ODI0M0MwMjAwMDE4QzQyNUNEODEwNDAwMDFEMjYKKzoxMDBDNTAwMDAwMTIxMTQwM0MwMjAwMDE4QzQyNUQ5ODEwNDAwMDAyREQKKzoxMDBDNjAwMDNDMDIyMDAwMDIyMjg4MjUwMDEyMTE0MDNDMDEwMDAxQjQKKzoxMDBDNzAwMDAwMjIwODIxOEMyMjdFNDAxMDQwMDAwMzNDMDIwMDIwMEMKKzoxMDBDODAwMDA4MDA1MzIyMDIyMjg4MjUzQzAyRkZERjM0NDJGRkZGODYKKzoxMDBDOTAwMDAyMjI4ODI0MDAxMjExNDAzQzAxMDAwMTAwMjIwODIxOTgKKzoxMDBDQTAwMDhDMjI3RTQ4MTA0MDAwMDMzQzAyMDA4MDA4MDA1MzJEMzcKKzoxMDBDQjAwMDAyMjI4ODI1M0MwMkZGN0YzNDQyRkZGRjAyMjI4ODI0NjMKKzoxMDBDQzAwMDAwMTIxMTQwM0MwMTAwMDEwMDIyMDgyMUFDMzE3RTM0QTkKKzoxMDBDRDAwMDA4MDA1MzgwMDIyMDEwMjEwMDEyMjk0MDNDMDMwMDAxMkIKKzoxMDBDRTAwMDAwNjUxODIxOEM2MzdFMzgzQzAyNDAwMDAwNjIxMDI0QUQKKzoxMDBDRjAwMDE0NDAwMDA4M0MwMjdGRkYzNDQyRkZGRjAwNjI4ODI0NUEKKzoxMDBEMDAwMDNDMDEwMDAxMDAyNTA4MjFBQzMxN0UzMDA4MDA1MzgwRjEKKzoxMDBEMTAwMDAyMjAxMDIxM0MwMjAwMDE4QzQyNUNEODEwNDAwMDMzQkMKKzoxMDBEMjAwMDNDMTFDMDBDM0MwMjAwMDE4QzQyNUQ3NDNDMDRDMDBDQzAKKzoxMDBEMzAwMDM0ODQyMDAwM0MwMzAwMDE4QzYzNUQ5ODAwMDIxMDJCN0EKKzoxMDBENDAwMDAwMDIxMDIzMDA0NDEwMjQxMDYwMDAwMzAwNTE4ODI1ODUKKzoxMDBENTAwMDNDMDIyMDAwMDIyMjg4MjUzQzAyMDAwMTAwNDUxMDIxQUYKKzoxMDBENjAwMDhDNDI3RTQ0MTA0MDAwMDMzQzAyMDAyMDA4MDA1MzVEOEEKKzoxMDBENzAwMDAyMjI4ODI1M0MwMkZGREYzNDQyRkZGRjAyMjI4ODI0NDIKKzoxMDBEODAwMDAwMTIxMTQwM0MwMTAwMDEwMDIyMDgyMThDMjI3RTRDRkYKKzoxMDBEOTAwMDEwNDAwMDAzM0MwMjAwODAwODAwNTM2ODAyMjI4ODI1QUUKKzoxMDBEQTAwMDNDMDJGRjdGMzQ0MkZGRkYwMjIyODgyNDNDMDIwMDAxMDQKKzoxMDBEQjAwMDhDNDI1RDYwMTA0MDAwMDIzQzAyMDgwMDAyMjI4ODI1M0YKKzoxMDBEQzAwMDNDMDIwMDAxOEM0MjVENjQxMDQwMDAwMjNDMDIwNDAwQzEKKzoxMDBERDAwMDAyMjI4ODI1M0MwMjAwMDE4QzQyNUQ2ODEwNDAwMDA2MUEKKzoxMDBERTAwMDNDMDIwMTAwMDgwMDUzN0IwMjIyODgyNTNDMDI3RkZGNjEKKzoxMDBERjAwMDM0NDJGRkZGMDA2Mjg4MjQwMDEyMTE0MDNDMDEwMDAxRDAKKzoxMDBFMDAwMDAwMjIwODIxQUMzMTdFMzAwMjIwMTAyMThGQkYwMDI0NDcKKzoxMDBFMTAwMDhGQjIwMDIwOEZCMTAwMUM4RkIwMDAxODAzRTAwMDA4RDMKKzoxMDBFMjAwMDI3QkQwMDI4MjdCREZGRDhBRkI0MDAyMDAwODBBMDIxMzcKKzoxMDBFMzAwMEFGQkYwMDI0QUZCMzAwMUNBRkIyMDAxOEFGQjEwMDE0QjUKKzoxMDBFNDAwMEFGQjAwMDEwOEY5MDAyMDAzQzAzMDAwMThDNjM1Q0M4QkYKKzoxMDBFNTAwMDhGOTMwMjIwMjQwMjAwMDIxMDYyMDA2MzJDNjIwMDAzQzAKKzoxMDBFNjAwMDEwNDAwMDA1MjQwMjAwMDExMDYyMDAwQTAwMTQxOTQwMUQKKzoxMDBFNzAwMDA4MDA1NDQ4MDAwMDAwMDAyNDAyMDAwNDEwNjIwMDVBRDgKKzoxMDBFODAwMDI0MDIwMDA4MTA2MjAwNTkwMDE0OTE0MDA4MDA1NDQ4RTAKKzoxMDBFOTAwMDAwMDAwMDAwM0MwNDAwMDEwMDgzMjAyMThDODQ3RTNDODMKKzoxMDBFQTAwMDNDMTEwMDAxMDIyMzg4MjE4RTMxN0UzNDNDMDI0MDAwMzcKKzoxMDBFQjAwMDAwODIxMDI0MTA0MDAwM0UzQzAyMDAwODAyMjIxMDI0NTAKKzoxMDBFQzAwMDEwNDAwMDIwMzYxMDAwMDIzQzAyMDAwMTAwNDMxMDIxQjcKKzoxMDBFRDAwMDhDNDI3RTQwMTA0MDAwMDUzNjEwMDAyMDM2MTAwMTAwODQKKzoxMDBFRTAwMDNDMDIwMDIwMDgwMDUzQkQwMjIyODgyNTI0MDJGRUZGOTgKKzoxMDBFRjAwMDAyMDI4MDI0M0MwMkZGREYzNDQyRkZGRjAyMjI4ODI0RUEKKzoxMDBGMDAwMDAwMTQxMTQwM0MwMTAwMDEwMDIyMDgyMThDMjI3RTQ4N0YKKzoxMDBGMTAwMDEwNDAwMDA1M0MwMjAwMDEwMjYyOTgyNTNDMDIwMDgwNUUKKzoxMDBGMjAwMDA4MDA1M0RDMDIyMjg4MjUzQzAyRkZGRTM0NDJGRkZGMEEKKzoxMDBGMzAwMDAyNjI5ODI0M0MwMkZGN0YzNDQyRkZGRjA4MDA1M0RDMkEKKzoxMDBGNDAwMDAyMjI4ODI0MjQwMkZFREYwMjAyODAyNDNDMDJGRkZFRUIKKzoxMDBGNTAwMDM0NDJGRkZGMDI2Mjk4MjQzQzAyRkY1RjM0NDJGRkZGRUQKKzoxMDBGNjAwMDAyMjI4ODI0M0MwMTAwMDEwMDIzMDgyMUFDMjA3RTQwOUQKKzoxMDBGNzAwMDNDMDEwMDAxMDAyMzA4MjFBQzIwN0U0ODBDMDA0ODZBOTcKKzoxMDBGODAwMDAwMDAwMDAwQUY5MDAyMDBBRjkzMDIyMDhGODIwMjIwODkKKzoxMDBGOTAwMDI0MDNGRkZCMDA0MzEwMjRBRjgyMDIyMDhGODIwMjIwMzMKKzoxMDBGQTAwMDM0NDIwMDAyQUY4MjAyMjAwODAwNTNGMzAwMTQxMTQwQzMKKzoxMDBGQjAwMDhGODIwMjAwMjQwM0ZGRkQwMDQzMTAyNDBDMDA0ODZBQzYKKzoxMDBGQzAwMEFGODIwMjAwM0MwMkJGRkYzNDQyRkZGRjBDMDA0MjlCOTUKKzoxMDBGRDAwMDAyMjI4ODI0MDAxNDExNDAzQzAxMDAwMTAwMjIwODIxNTMKKzoxMDBGRTAwMDA4MDA1NDQ4QUMzMTdFMzQwMDE0OTE0MDNDMDQwMDAxQTgKKzoxMDBGRjAwMDAwOTIyMDIxOEM4NDdFMzgzQzExMDAwMTAyMzI4ODIxMkQKKzoxMDEwMDAwMDhFMzE3RTMwM0MwMjQwMDAwMDgyMTAyNDE0NDAwMDExREEKKzoxMDEwMTAwMDAwMDAwMDAwM0MwMjAwMDE4QzQyNUQ5ODE0NDAwMDA2NzQKKzoxMDEwMjAwMDNDMDJCRkZGOEY4MjAyMDAzNDQyMDAwMjBDMDA0ODZBN0IKKzoxMDEwMzAwMEFGODIwMjAwM0MwMkJGRkYzNDQyRkZGRjBDMDA0MjlCMjQKKzoxMDEwNDAwMDAyMjI4ODI0M0MwMTAwMDEwMDMyMDgyMTA4MDA1NDQ4OTMKKzoxMDEwNTAwMEFDMzE3RTMwM0MwMjAwMDE4QzQyNUQ5ODEwNDAwMDA1QUUKKzoxMDEwNjAwMDNDMDIwMDIwM0MwMjAwMDE4QzQyNUQ3NDEwNDAwMDJCQzkKKzoxMDEwNzAwMDNDMDIwMDIwMDA4MjEwMjQxMDQwMDAwNzM2MTAwMDIwOUYKKzoxMDEwODAwMDI0MDIwMTAwM0MwMTAwMDEwMDMyMDgyMUFDMjI3RTQ0MTAKKzoxMDEwOTAwMDA4MDA1NDI4MzYxMDAxMDAzQzAxMDAwMTAwMzIwODIxRUMKKzoxMDEwQTAwMEFDMjA3RTQ0MjQwMkZFRkYwMjAyODAyNDNDMDIwMDgwMjkKKzoxMDEwQjAwMDAwODIxMDI0MTA0MDAwMDcwMDE0MTk0MDNDMDIwMDAxNzcKKzoxMDEwQzAwMDNDMDEwMDAxMDAyMzA4MjFBQzIyN0U0QzA4MDA1NDM5NjkKKzoxMDEwRDAwMDAyNjI5ODI1MDAxNDExNDAzQzAxMDAwMTAwMjIwODIxMDEKKzoxMDEwRTAwMEFDMjA3RTRDM0MwMkZGRkUzNDQyRkZGRjAyNjI5ODI0OUIKKzoxMDEwRjAwMDBDMDA0ODZBMDAwMDAwMDBBRjkwMDIwMEFGOTMwMjIwOEQKKzoxMDExMDAwMDhGODIwMjIwMjQwM0ZGRkIwMDQzMTAyNEFGODIwMjIwQzEKKzoxMDExMTAwMDhGODIwMjIwMzQ0MjAwMDJBRjgyMDIyMDAwMTQxMTQwNkMKKzoxMDExMjAwMDNDMDEwMDAxMDAyMjA4MjFBQzMxN0UzMDhGQkYwMDI0MzkKKzoxMDExMzAwMDhGQjQwMDIwOEZCMzAwMUM4RkIyMDAxODhGQjEwMDE0NDEKKzoxMDExNDAwMDhGQjAwMDEwMDNFMDAwMDgyN0JEMDAyODI0NDg2NTYxMjcKKzoxMDExNTAwMDY0NjU3MjNBMjAyRjcwNzI2RjZBNjU2Mzc0NzMyRjcyQzAKKzoxMDExNjAwMDYzNzMyRjczNzcyRjY3NjUyRjJFMkY2RTY5NjMyRjY2M0EKKzoxMDExNzAwMDc3MkY2MzZGNkQ2RDZGNkUyRjY2Nzc2RDYxNjk2RTJFNjEKKzoxMDExODAwMDYzMkM3NjIwMzEyRTMxMkUzMjJFMzEzMTIwMzEzOTM5RjcKKzoxMDExOTAwMDM4MkYzMDM0MkYzMjM3MjAzMjMyM0EzMTMzM0EzNDMyMkEKKzoxMDExQTAwMDIwNzM2ODc1NjE2RTY3MjA0NTc4NzAyMDI0MDAwMDAwMDgKKzoxMDExQjAwMDc0Njg2NTVGNDQ0MTU3NEUwMDAwMDAwMDUzNTQ0MTQzM0EKKzoxMDExQzAwMDRCNUYzMTIwMDAwMDAwMDA0MjYxNjQ1MzZFNjQ1MjZFMzgKKzoxMDExRDAwMDY3MDAwMDAwM0Y0NTZFNzE0NTc2NzQwMDNGNkU2RjUxQTkKKzoxMDExRTAwMDY0NDU3NjUwMDAwMDAwMDA2NTc2NTI2RTY3NDY3NTZDNjcKKzoxMDExRjAwMDZDMDAwMDAwNDk2QzZDNDM2RjZFNjY1Mjc4MDAwMDAwMTIKKzoxMDEyMDAwMDUzNjU2RTY0NDM2QjUzNzU2RDAwMDAwMDUyNjU2Mzc2RTEKKzoxMDEyMTAwMDU2NkM2MTZFMDAwMDAwMDAwMDAwMDAwMDI0NDg2NTYxMEIKKzoxMDEyMjAwMDY0NjU3MjNBMjAyRjcwNzI2RjZBNjU2Mzc0NzMyRjcyRUYKKzoxMDEyMzAwMDYzNzMyRjczNzcyRjY3NjUyRjJFMkY2RTY5NjMyRjY2NjkKKzoxMDEyNDAwMDc3MkY2MzZGNkQ2RDZGNkUyRjc0Njk2RDY1NzIyRTYzOEUKKzoxMDEyNTAwMDJDNzYyMDMxMkUzMTJFMzIyRTM4MjAzMTM5MzkzODJGNEMKKzoxMDEyNjAwMDMwMzcyRjMzMzEyMDMxMzczQTM1MzgzQTM0MzUyMDczMUYKKzoxMDEyNzAwMDY4NzU2MTZFNjcyMDQ1Nzg3MDIwMjQwMDU0MkQ0NDZEOTgKKzoxMDEyODAwMDYxNTI2NDMxMDAwMDAwMDA1NDJENDQ2RDYxNDI0MjAwRkYKKzoxMDEyOTAwMDU0MkQ0NDZENjEzMjAwMDAzRjZFNkY1MTY0NTQ3ODQ1QTcKKzoxMDEyQTAwMDAwMDAwMDAwM0Y2RTZGNTE2NDUyNzg0NTAwMDAwMDAwNUUKKzoxMDEyQjAwMDY1NkU3MTRENDU3NjUwNDY2MTY5NkMwMDY1NkU3MTREODUKKzoxMDEyQzAwMDQ1NzY0NjYxNjk2QzAwMDA2NjYxNjk2QzQ1NkU0NTREMDYKKzoxMDEyRDAwMDAwMDAwMDAwM0Y0NTZFNzE0NTc2NzQwMDNGNkU2RjUxMEYKKzoxMDEyRTAwMDY0NDU3NjUwMDAwMDAwMDA2NTc2NTI2RTY3NDY3NTZDNjYKKzoxMDEyRjAwMDZDMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDI0NDg2NTYxNTAKKzoxMDEzMDAwMDY0NjU3MjNBMjAyRjcwNzI2RjZBNjU2Mzc0NzMyRjcyMEUKKzoxMDEzMTAwMDYzNzMyRjczNzcyRjY3NjUyRjJFMkY2RTY5NjMyRjY2ODgKKzoxMDEzMjAwMDc3MkY2MzZGNkQ2RDZGNkUyRjYzNkY2RDZENjE2RTY0ODAKKzoxMDEzMzAwMDJFNjMyQzc2MjAzMTJFMzEyRTMyMkUzMTMwMjAzMTM5NTEKKzoxMDEzNDAwMDM5MzgyRjMxMzEyRjMxMzgyMDMxMzczQTMxMzEzQTMxNzQKKzoxMDEzNTAwMDM4MjA3MzY4NzU2MTZFNjcyMDQ1Nzg3MDIwMjQwMDAwMUUKKzoxMDEzNjAwMDNGNEQ2MjZGNzg0NTc2NzQwMDAwMDAwMDRFNEY2MzZGMEEKKzoxMDEzNzAwMDZENjE2RTY0MDAwMDAwMDA2ODczNzQ2NTVGNDU1MjUyRDEKKzoxMDEzODAwMDAwMDAwMDAwNDEyRDQ1NzI3MjQyNzU2MzAwMDAwMDAwQUMKKzoxMDEzOTAwMDQ1NTI1MjRGNTIyRDQxNjQ2NDAwMDAwMDY1NkU3MTRERkMKKzoxMDEzQTAwMDQ1NzY1MDQ2NjE2OTZDMDA2NTZFNzE0RDQ1NzY0NjYxQzMKKzoxMDEzQjAwMDY5NkMwMDAwNjY2MTY5NkM0NTZFNDU0RDAwMDAwMDAwNzcKKzoxMDEzQzAwMDQ0MkQ0NTcyNzI0QzYxNzM3NDAwMDAwMDQ0MkQ0NTcyQzcKKzoxMDEzRDAwMDcyMzIwMDAwNkQ0MzczNzQ0RDY0NDU1MjUyMDAwMDAwMzgKKzoxMDEzRTAwMDcwNzI2RjZENEQ2NDQ1NTI1MjAwMDAwMDQ2Njk2Qzc0MTYKKzoxMDEzRjAwMDRENjQ0NTUyNTIwMDAwMDA2MzZENjQ1RjQ1NTI1MjAwRDcKKzoxMDE0MDAwMDNGNDU2RTcxNDU3Njc0MDAzRjZFNkY1MTY0NDU3NjUwNkUKKzoxMDE0MTAwMDAwMDAwMDAwNjU3NjUyNkU2NzQ2NzU2QzZDMDAwMDAwMzcKKzoxMDE0MjAwMDAwMDAwMDAwMDAwMDZFQTAwMDAwN0ZCQzAwMDA2RTM4Q0QKKzoxMDE0MzAwMDAwMDA4NzM0MDAwMDgyQjAwMDAwODc4MDAwMDA4NzgwQjEKKzoxMDE0NDAwMDAwMDA2RjU0MDAwMDc2OTQwMDAwN0YwQzAwMDA4MEE4MUMKKzoxMDE0NTAwMDAwMDA4MDc0MDAwMDg3ODAwMDAwN0U3MDAwMDA4MENDNTcKKzoxMDE0NjAwMDAwMDA2RTY0MDAwMDgxQ0MwMDAwMDAwMDI0NDg2NTYxMkIKKzoxMDE0NzAwMDY0NjU3MjNBMjAyRjcwNzI2RjZBNjU2Mzc0NzMyRjcyOUQKKzoxMDE0ODAwMDYzNzMyRjczNzcyRjY3NjUyRjJFMkY2RTY5NjMyRjY2MTcKKzoxMDE0OTAwMDc3MkY2MzZGNkQ2RDZGNkUyRjY0NkQ2MTJFNjMyQzc2ODkKKzoxMDE0QTAwMDIwMzEyRTMxMkUzMjJFMzMyMDMxMzkzOTM4MkYzMDM0M0QKKzoxMDE0QjAwMDJGMzIzNzIwMzIzMjNBMzEzMzNBMzQzMTIwNzM2ODc1NjMKKzoxMDE0QzAwMDYxNkU2NzIwNDU3ODcwMjAyNDAwMDAwMDY0NkQ2MTcyQjEKKzoxMDE0RDAwMDY0NDE1NDRFMDAwMDAwMDA2NDZENjE3NzcyNDE1NDRFQzcKKzoxMDE0RTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDI0NDg2NTYxQ0EKKzoxMDE0RjAwMDY0NjU3MjNBMjAyRjcwNzI2RjZBNjU2Mzc0NzMyRjcyMUQKKzoxMDE1MDAwMDYzNzMyRjczNzcyRjY3NjUyRjJFMkY2RTY5NjMyRjY2OTYKKzoxMDE1MTAwMDc3MkY2MzZGNkQ2RDZGNkUyRjc0NzI2MTYzNjUyRTYzQ0QKKzoxMDE1MjAwMDJDNzYyMDMxMkUzMTJFMzIyRTMyMjAzMTM5MzkzODJGN0YKKzoxMDE1MzAwMDMwMzQyRjMyMzcyMDMyMzIzQTMxMzMzQTM1MzAyMDczNUIKKzoxMDE1NDAwMDY4NzU2MTZFNjcyMDQ1Nzg3MDIwMjQwMDI0NDg2NTYxQzUKKzoxMDE1NTAwMDY0NjU3MjNBMjAyRjcwNzI2RjZBNjU2Mzc0NzMyRjcyQkMKKzoxMDE1NjAwMDYzNzMyRjczNzcyRjY3NjUyRjJFMkY2RTY5NjMyRjY2MzYKKzoxMDE1NzAwMDc3MkY2MzZGNkQ2RDZGNkUyRjY0NjE3NDYxMkU2MzJDQjYKKzoxMDE1ODAwMDc2MjAzMTJFMzEyRTMyMkUzMjIwMzEzOTM5MzgyRjMwMUIKKzoxMDE1OTAwMDM0MkYzMjM3MjAzMjMyM0EzMTMzM0EzNDMwMjA3MzY4QzQKKzoxMDE1QTAwMDc1NjE2RTY3MjA0NTc4NzAyMDI0MDAwMDQ2NTc1RjU2QUQKKzoxMDE1QjAwMDQ1NTI1MzQ5NEY0RTNBMjAyMzMxMjA0NjcyNjkyMDQxMEIKKzoxMDE1QzAwMDcwNzIyMDM3MjAzMTM3M0EzNTM1M0EzNDM4MjA1MDQ0NUMKKzoxMDE1RDAwMDU0MjAzMjMwMzAzMDAwMDA0NjU3NUY0MzRGNEQ1MDQ5NjEKKzoxMDE1RTAwMDRDNDU1RjU0NDk0RDQ1M0EyMDMxMzczQTM1MzUzQTM0MDgKKzoxMDE1RjAwMDM4MDAwMDAwNDY1NzVGNDM0RjRENTA0OTRDNDU1RjQyMEQKKzoxMDE2MDAwMDU5M0EyMDY0NjU3NjcyNjM3MzAwMDAwMDQ2NTc1RjQzNjEKKzoxMDE2MTAwMDRGNEQ1MDQ5NEM0NTVGNDg0RjUzNTQzQTIwNjM2RjZEQ0UKKzoxMDE2MjAwMDcwNzU3NDY1MDAwMDAwMDA0NjU3NUY0MzRGNEQ1MDQ5ODgKKzoxMDE2MzAwMDRDNDU1RjQ0NEY0RDQxNDk0RTNBMjA2NTZFNjcyRTYxREYKKzoxMDE2NDAwMDYzNzQ2NTZGNkUyRTYzNkY2RDAwMDAwMDQ2NTc1RjQzRDUKKzoxMDE2NTAwMDRGNEQ1MDQ5NEM0NTUyM0EyMDY3NjM2MzIwNzY2NTcyN0UKKzoxMDE2NjAwMDczNjk2RjZFMjAzMjJFMzcyRTMyMDAwMDAwMDAwMDAwQUEKKzoxMDE2NzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDI0NDg2NTYxMzgKKzoxMDE2ODAwMDY0NjU3MjNBMjAyRjcwNzI2RjZBNjU2Mzc0NzMyRjcyOEIKKzoxMDE2OTAwMDYzNzMyRjczNzcyRjY3NjUyRjJFMkY2RTY5NjMyRjY2MDUKKzoxMDE2QTAwMDc3MkY2MzZGNkQ2RDZGNkUyRjZENjU2RDJFNjMyQzc2NkEKKzoxMDE2QjAwMDIwMzEyRTMxMkUzMjJFMzIyMDMxMzkzOTM4MkYzMDM0MkMKKzoxMDE2QzAwMDJGMzIzNzIwMzIzMjNBMzEzMzNBMzQzNDIwNzM2ODc1NEUKKzoxMDE2RDAwMDYxNkU2NzIwNDU3ODcwMjAyNDAwMDAwMDI0NDg2NTYxMTEKKzoxMDE2RTAwMDY0NjU3MjNBMjAyRjcwNzI2RjZBNjU2Mzc0NzMyRjcyMkIKKzoxMDE2RjAwMDYzNzMyRjczNzcyRjY3NjUyRjJFMkY2RTY5NjMyRjY2QTUKKzoxMDE3MDAwMDc3MkY2MzZGNkQ2RDZGNkUyRjczNjU2RTY0MkU2MzJDMTQKKzoxMDE3MTAwMDc2MjAzMTJFMzEyRTMyMkUzMTMxMjAzMTM5MzkzODJGODkKKzoxMDE3MjAwMDMxMzIyRjMyMzIyMDMxMzczQTMxMzczQTM1MzUyMDczNjIKKzoxMDE3MzAwMDY4NzU2MTZFNjcyMDQ1Nzg3MDIwMjQwMDczNkU2NDY0NUMKKzoxMDE3NDAwMDY1NEU2RjUxMjAwMDAwMDA2RTZGNDU0RTUxNUY1NDU4M0EKKzoxMDE3NTAwMDAwMDAwMDAwNzM2RTY0NjQ3NDRFNkY1MTIwMDAwMDAwM0UKKzoxMDE3NjAwMDNGNkU2RjUxNjQ1NDc4NDUwMDAwMDAwMDc1NkU2QjcyRDcKKzoxMDE3NzAwMDY0NzQ3OTcwNjUwMDAwMDAwMDAwMDAwMDAwMDBBQ0NDQ0IKKzoxMDE3ODAwMDAwMDBBQ0NDMDAwMEFEOUMwMDAwQUFCMDAwMDBBQUIwRTQKKzoxMDE3OTAwMDAwMDBBRDlDMDAwMEFEOUMwMDAwQUQ5QzAwMDBBRDlDMjUKKzoxMDE3QTAwMDAwMDBBRDlDMDAwMEFEOUMwMDAwQUQ5QzAwMDBBRDlDMTUKKzoxMDE3QjAwMDAwMDBBRDlDMDAwMEFEOUMwMDAwQUQ5QzAwMDBBRDlDMDUKKzoxMDE3QzAwMDAwMDBBRDlDMDAwMEFEN0MwMDAwMDAwMDAwMDBCQ0E4NDMKKzoxMDE3RDAwMDAwMDBCQ0E4MDAwMEJENzAwMDAwQUU0QzAwMDBCMDU4NzYKKzoxMDE3RTAwMDAwMDBCRDcwMDAwMEJENzAwMDAwQkQ3MDAwMDBCRDcwNDUKKzoxMDE3RjAwMDAwMDBCRDcwMDAwMEJENzAwMDAwQkQ3MDAwMDBCRDcwMzUKKzoxMDE4MDAwMDAwMDBCRDcwMDAwMEJENzAwMDAwQkQ3MDAwMDBCRDcwMjQKKzoxMDE4MTAwMDAwMDBCRDcwMDAwMEJENTQwMDAwQjA0MDI0NDg2NTYxNjgKKzoxMDE4MjAwMDY0NjU3MjNBMjAyRjcwNzI2RjZBNjU2Mzc0NzMyRjcyRTkKKzoxMDE4MzAwMDYzNzMyRjczNzcyRjY3NjUyRjJFMkY2RTY5NjMyRjY2NjMKKzoxMDE4NDAwMDc3MkY2MzZGNkQ2RDZGNkUyRjcyNjU2Mzc2MkU2MzJDQ0QKKzoxMDE4NTAwMDc2MjAzMTJFMzEyRTMyMkUzMTM5MjAzMTM5MzkzODJGNDAKKzoxMDE4NjAwMDMwMzcyRjMyMzQyMDMyMzEzQTMzMzAzQTMwMzUyMDczMkEKKzoxMDE4NzAwMDY4NzU2MTZFNjcyMDQ1Nzg3MDIwMjQwMDcwNkI1Mjc4MUYKKzoxMDE4ODAwMDQ1NTI1MjAwNjY3MjZEMzI0QzYxNzI2NzY1MDAwMDAwMEQKKzoxMDE4OTAwMDcyNzg0RTZGNTI3ODQyNjQwMDAwMDAwMDcyNzg1MTQ0QjIKKzoxMDE4QTAwMDZENjE0NDQ2MDAwMDAwMDA3Mjc4NTE0NDZENjE0MjQ2MEIKKzoxMDE4QjAwMDAwMDAwMDAwM0Y2RTZGNTE2NDUyNzg0NTAwMDAwMDAwNDgKKzoxMDE4QzAwMDcwNkI1Mjc4NDU1MjUyNzMwMDAwMDAwMDY2NzI2RDMyQTAKKzoxMDE4RDAwMDRDNzI2NzUzMDAwMDAwMDA3Mjc4NEU2RjQyNjQ1MzAwRjAKKzoxMDE4RTAwMDNGNzI0MjY0NDQ2RDYxNDYwMDAwMDAwMDNGNzI0QTQyMEMKKzoxMDE4RjAwMDY0NDQ2RDQ2MDAwMDAwMDAwMDAwMDAwMDAwMDBGNjc4MUYKKzoxMDE5MDAwMDAwMDBGNjc4MDAwMEY2NzgwMDAwRjY3ODAwMDBGNjc4MUYKKzoxMDE5MTAwMDAwMDBGNjc4MDAwMEY2NzgwMDAwRjY3ODAwMDBGNjc4MEYKKzoxMDE5MjAwMDAwMDBGNjc4MDAwMEY2NzgwMDAwRjY3ODAwMDBGNjc4RkYKKzoxMDE5MzAwMDAwMDBGNjc4MDAwMEY2NzgwMDAwRjY3MDAwMDBGNjcwRkYKKzoxMDE5NDAwMDAwMDBGNjcwNTcyRDQ0NEQ0MTQ1NkU0NjAwMDAwMDAwRTIKKzoxMDE5NTAwMDAwMDAwMDAwMDAwMEZEQzAwMDAxMDE1QzAwMDBGRERDOTMKKzoxMDE5NjAwMDAwMDEwMTVDMDAwMTAxNUMwMDAxMDE1QzAwMDEwMTVDRkYKKzoxMDE5NzAwMDAwMDEwMTVDMDAwMTAxNUMwMDAwRjcwNDAwMDEwMTVDNTIKKzoxMDE5ODAwMDAwMDEwMTVDMDAwMTAxNUMwMDAxMDE1QzAwMDEwMTVDREYKKzoxMDE5OTAwMDAwMDEwMTU0MDAwMTAxNTQwMDAxMDE1NDI0NDg2NTYxMTMKKzoxMDE5QTAwMDY0NjU3MjNBMjAyRjcwNzI2RjZBNjU2Mzc0NzMyRjcyNjgKKzoxMDE5QjAwMDYzNzMyRjczNzcyRjY3NjUyRjJFMkY2RTY5NjMyRjY2RTIKKzoxMDE5QzAwMDc3MkY2MzZGNkQ2RDZGNkUyRjZENjE2MzJFNjMyQzc2NTUKKzoxMDE5RDAwMDIwMzEyRTMxMkUzMjJFMzEzMjIwMzEzOTM5MzgyRjMwMEMKKzoxMDE5RTAwMDM0MkYzMjM3MjAzMjMyM0EzMTMzM0EzNDMyMjA3MzY4NkUKKzoxMDE5RjAwMDc1NjE2RTY3MjA0NTc4NzAyMDI0MDAwMDZENjE2Mzc0MDYKKzoxMDFBMDAwMDc4NDE1NDRFMDAwMDAwMDA0RTc0NTM3OTZFMjY0QzZCQTIKKzoxMDFBMTAwMDAwMDAwMDAwNzI2NTZENjE3MzczNzI3NDAwMDAwMDAwNTUKKzoxMDFBMjAwMDZDNjk2RTZCNDQ0RjU3NEUwMDAwMDAwMDY1NkU3MTREM0YKKzoxMDFBMzAwMDQ1NzY1MDQ2NjE2OTZDMDA2NTZFNzE0RDQ1NzY0NjYxMkMKKzoxMDFBNDAwMDY5NkMwMDAwNjY2MTY5NkM0NTZFNDU0RDAwMDAwMDAwRTAKKzoxMDFBNTAwMDZDNjk2RTZCNTU1MDAwMDAwMDAwMDAwMDI0NDg2NTYxMDEKKzoxMDFBNjAwMDY0NjU3MjNBMjAyRjcwNzI2RjZBNjU2Mzc0NzMyRjcyQTcKKzoxMDFBNzAwMDYzNzMyRjczNzcyRjY3NjUyRjJFMkY2RTY5NjMyRjY2MjEKKzoxMDFBODAwMDc3MkY2MzZGNkQ2RDZGNkUyRjYzNkI3Mzc1NkQyRTYzNDQKKzoxMDFBOTAwMDJDNzYyMDMxMkUzMTJFMzIyRTMyMjAzMTM5MzkzODJGMEEKKzoxMDFBQTAwMDMwMzQyRjMyMzcyMDMyMzIzQTMxMzMzQTMzMzkyMDczREYKKzoxMDFBQjAwMDY4NzU2MTZFNjcyMDQ1Nzg3MDIwMjQwMDUwNzI2RjYyRUYKKzoxMDFBQzAwMDY1NTA2ODc5MDAwMDAwMDA2QzZFNkI0MTUzNTM1MjU0QUUKKzoxMDFBRDAwMDAwMDAwMDAwMDAwMTFCMkMwMDAxMUJDNDAwMDExQkY4Q0EKKzoxMDFBRTAwMDAwMDExQzJDMDAwMTFDNTgwMDAxMUM2QzAwMDExQ0E4RUEKKzoxMDFBRjAwMDAwMDEyMDdDMDAwMTFERTQwMDAxMUUyNDAwMDExRTUwOTUKKzoxMDFCMDAwMDAwMDExRTkwMDAwMTFFQzAwMDAxMUVGQzAwMDExRjMwREMKKzoxMDFCMTAwMDAwMDEyMDdDMDAwMTIyQzAwMDAxMjJEODAwMDEyMzAwMjYKKzoxMDFCMjAwMDAwMDEyMzIwMDAwMTIzNDgwMDAxMjQ3ODAwMDEyNEEwQTMKKzoxMDFCMzAwMDAwMDEyNEY0MDAwMTI1MUMwMDAwMDAwMDAwMDEyNzhDOTYKKzoxMDFCNDAwMDAwMDEyODVDMDAwMTI5MzQwMDAxMkEwNDAwMDEyQTYwRjgKKzoxMDFCNTAwMDAwMDEyQjNDMDAwMTJCNjQwMDAxMkM0MDAwMDEyQzY4OEIKKzoxMDFCNjAwMDAwMDEyRTEwMDAwMTJFMzgwMDAxMkZFMDAwMDEzMUQ4QjUKKzoxMDFCNzAwMDAwMDEzNDZDMDAwMTMzODAwMDAxMzQ2QzAwMDEzNDk4QTIKKzoxMDFCODAwMDAwMDEzMDA4MDAwMTMxQjAwMDAwMDAwMDAwMDEzQjg0N0EKKzoxMDFCOTAwMDAwMDEzQkM4MDAwMTNDNjAwMDAxM0NBQzAwMDEzRDFDNjEKKzoxMDFCQTAwMDAwMDEzREI0MDAwMTNERTgwMDAxM0U3MDAwMDEzRjA4MjYKKzoxMDFCQjAwMDAwMDEzRkQ4MDAwMTQwMTgwMDAxNDA5QzAwMDE0MEMwRDYKKzoxMDFCQzAwMDAwMDE0MUY0NjQ2RjQyNjE3MzY1NTA2NzAwMDAwMDAwREEKKzoxMDFCRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDczNzQ2RDYxNTAKKzoxMDFCRTAwMDYzNEM0RTRCMDAwMDAwMDAwMDAwMDAwMDAwMDE0QzM4MjgKKzoxMDFCRjAwMDAwMDE0QzM4MDAwMTRCODAwMDAxNEJDNDAwMDE0QzM4RkYKKzoxMDFDMDAwMDAwMDE0QzM4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNEYKKzoxMDFDMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwQzQKKzoxMDFDMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQxNkM3NDY1MkUKKzoxMDFDMzAwMDZGNkUyMDQxNjM2NTRFNDk0MzIwNTYwMDQxNkM3NDY1QzgKKzoxMDFDNDAwMDZGNkUyMDQxNjM2NTRFNDk0MzIwNTYwMDQyNDI0MjQyMzYKKzoxMDFDNTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTM1NDE4MDUKKzoxMDFDNjAwMDAwMTNFN0ZDMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwN0UKKzoxMDFDNzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNjBDRjAwMzUKKzoxMDFDODAwMDAwMDAwMDYwQ0YwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjUKKzoxMDFDOTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNDQKKzoxMDFDQTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMzQKKzoxMDFDQjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjQKKzoxMDFDQzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTQKKzoxMDFDRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMzAwMDAwMDAwMDEKKzoxMDFDRTAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRjMKKzoxMDFDRjAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwRTIKKzoxMDFEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxRDIKKzoxMDFEMTAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwQzIKKzoxMDFEMjAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDIxMDAwMDAwOTEKKzoxMDFEMzAwMDEyMDAwMTQwMDAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMzAKKzoxMDFENDAwMDEyMDAwMEEwMDAwMDAwMDAxMjAwMDA2MDEyMDAwMTgwREMKKzoxMDFENTAwMDEyMDAwMUUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOTAKKzoxMDFENjAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNzIKKzoxMDFENzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyNjEKKzoxMDFEODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzMDAwMTAwMDAwMDAxNEUKKzowQzFEOTAwMDAwMDMwMjAxMDAwMDAwMDAwMDAwMDAwMDQxCis6MDAwMDAwMDFGRgorLyogdGcxIGZpcm13YXJlIHYxMi40LjExICovCmRpZmYgLS1naXQgYS9maXJtd2FyZS9hY2VuaWMvdGcyLmJpbi5paGV4IGIvZmlybXdhcmUvYWNlbmljL3RnMi5iaW4uaWhleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWZmNGY0Ci0tLSAvZGV2L251bGwKKysrIGIvZmlybXdhcmUvYWNlbmljL3RnMi5iaW4uaWhleApAQCAtMCwwICsxLDQ4NDQgQEAKKzoxMDAwMDAwMDBDMDQwQjAwMDAwMDQwMDAwMDAwNDAwMDAwMDAwMDAwNTUKKzoxMDAwMTAwMDEwMDAwMDAzMDAwMDAwMDAwMDAwMDAwRDAwMDAwMDBEQjMKKzoxMDAwMjAwMDNDMUQwMDAxOEZCRDZEMjAwM0EwRjAyMTNDMTAwMDAwOUQKKzoxMDAwMzAwMDI2MTA0MDAwMEMwMDEwQzAwMDAwMDAwMDAwMDAwMDBENjEKKzoxMDAwNDAwMDNDMUQwMDAxOEZCRDZEMjQwM0EwRjAyMTNDMTAwMDAwNzkKKzoxMDAwNTAwMDI2MTA0MDAwMEMwMDE3RTAwMDAwMDAwMDAwMDAwMDBEMUEKKzoxMDAwNjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOTAKKzoxMDAwNzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODAKKzoxMDAwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNzAKKzoxMDAwOTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNjAKKzoxMDAwQTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNTAKKzoxMDAwQjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNDAKKzoxMDAwQzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMzAKKzoxMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjAKKzoxMDAwRTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAKKzoxMDAwRjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzoxMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyMDAwMDA4RTUKKzoxMDAxMTAwMDAwMDAwMDAwMDgwMDE3MkYzQzBBMDAwMTA4MDAxNzJGRkMKKzoxMDAxMjAwMDNDMEEwMDAyMDgwMDE3MkYwMDAwMDAwMDA4MDAyQ0FDNTkKKzoxMDAxMzAwMDAwMDAwMDAwMDgwMDJDNEYwMDAwMDAwMDA4MDAxNzJGRUUKKzoxMDAxNDAwMDNDMEEwMDA0MDgwMDMyOEEwMDAwMDAwMDA4MDAxQTUyMkQKKzoxMDAxNTAwMDAwMDAwMDAwMDgwMDM5NEQwMDAwMDAwMDA4MDAzOEY0REQKKzoxMDAxNjAwMDAwMDAwMDAwMDgwMDE3MkYzQzBBMDAwNjA4MDAzOUJCRjkKKzoxMDAxNzAwMDNDMEEwMDA3MDgwMDE3MkYzQzBBMDAwODA4MDAxNzJGNDgKKzoxMDAxODAwMDNDMEEwMDA5MDgwMDNBMTMwMDAwMDAwMDA4MDAyRUE2RUYKKzoxMDAxOTAwMDAwMDAwMDAwMDgwMDE3MkYzQzBBMDAwQjA4MDAxNzJGNzIKKzoxMDAxQTAwMDNDMEEwMDBDMDgwMDE3MkYzQzBBMDAwRDA4MDAyOEZCMzEKKzoxMDAxQjAwMDAwMDAwMDAwMDgwMDI4OTAwMDAwMDAwMDA4MDAxNzJGMzEKKzoxMDAxQzAwMDNDMEEwMDBFMDgwMDIwOEMwMDAwMDAwMDA4MDAxOTY0QTIKKzoxMDAxRDAwMDAwMDAwMDAwMDgwMDFBMDQwMDAwMDAwMDA4MDAzQ0E2MEYKKzoxMDAxRTAwMDAwMDAwMDAwMDgwMDNDOTQwMDAwMDAwMDA4MDAxNzJGRTkKKzoxMDAxRjAwMDAwMDAwMDAwMDgwMDE5MUEwMDAwMDAwMDA4MDAxNzJGNzYKKzoxMDAyMDAwMDAwMDAwMDAwMDgwMDE3MkYzQzBBMDAxMzA4MDAxNzJGRjkKKzoxMDAyMTAwMDNDMEEwMDE0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODQKKzoxMDAyMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwQ0UKKzoxMDAyMzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwQkUKKzoxMDAyNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwQUUKKzoxMDAyNTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOUUKKzoxMDAyNjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOEUKKzoxMDAyNzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwN0UKKzoxMDAyODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNkUKKzoxMDAyOTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNUUKKzoxMDAyQTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNEUKKzoxMDAyQjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM0UKKzoxMDAyQzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMkUKKzoxMDAyRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMUUKKzoxMDAyRTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUKKzoxMDAyRjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRkUKKzoxMDAzMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDI3QkRGRkUwMkEKKzoxMDAzMTAwMDNDMUNDMDAwQUZCRjAwMUNBRkIwMDAxODhGODIwMTQwNzIKKzoxMDAzMjAwMDI0MDMwMDAzQUY4MzAwRUMzNDQyMDAwNDBDMDAyQjIwQjQKKzoxMDAzMzAwMEFGODIwMTQwM0MwMTAwQzAwQzAwMTc2M0FDMjAzRkZDQzEKKzoxMDAzNDAwMDAwNDAxODIxM0MwMjAwMTAzQzAxMDAwMUFDMjM2RTlDQ0YKKzoxMDAzNTAwMDEwNjIwMDExMDA0MzEwMkIxNDQwMDAwMjNDMDIwMDIwRTgKKzoxMDAzNjAwMDNDMDIwMDA4MTA2MjAwMEMyNDA1MDEwMDNDMDYwMDAxNUMKKzoxMDAzNzAwMDhDQzY2RTlDM0MwNDAwMDEyNDg0NUM3NDAwMDAzODIxMEYKKzoxMDAzODAwMEFGQTAwMDEwMEMwMDJCM0JBRkEwMDAxNDNDMDIwMDIwREIKKzoxMDAzOTAwMDNDMDEwMDAxQUMyMjZFOUMyNDAyMDAwODNDMDEwMDAxREIKKzoxMDAzQTAwMEFDMjI2RUI0MjQwMjAwMUYzQzAxMDAwMUFDMjI2RUM0REEKKzoxMDAzQjAwMDI0MDIwMDE2M0MwMTAwMDFBQzIyNkU5ODNDMDVGRkZFQjEKKzoxMDAzQzAwMDM0QTU2RjA4M0MwMjAwMDE4QzQyNkU5QzNDMDMwMDAyODUKKzoxMDAzRDAwMDI0NjM5MDEwM0MwNDAwMDE4Qzg0NkNDNDAwNDMxMDIzRkYKKzoxMDAzRTAwMDE0ODAwMDAyMDA0NTgwMjEyNjEwRkEzODI0MDJGMDAwMTMKKzoxMDAzRjAwMDAyMDI4MDI0MEMwMDE3ODUwMjAwMjAyMTAyMDIyODIzMUIKKzoxMDA0MDAwMDNDMDQwMDIwMDA4MjE4MjMwMDY1MTgyMzI0N0JCMDAwRTAKKzoxMDA0MTAwMDNDMDNGRkZFMzQ2M0JGMDgwMzYzQjgyMTNDMDYwMEJGMDIKKzoxMDA0MjAwMDM0QzZGMDAwM0MwNzAwMDE4Q0U3NkNDMDNDMDMwMEJGMDEKKzoxMDA0MzAwMDM0NjNFMDAwMDA4NTIwMjMzQzAxMDAwMUFDMjQ2RUE4NTkKKzoxMDA0NDAwMDAwODIyMDIzM0MwMTAwMDFBQzI1NkU5MDAwMDUyODQyNkIKKzoxMDA0NTAwMDNDMDEwMDAxQUMyMjZFODQyNzYyMEZGQzNDMDEwMDAxQ0MKKzoxMDA0NjAwMEFDMjI2RDIwMjc2MjFGRkMwMERCMzAyMzAwN0IxODIzQTkKKzoxMDA0NzAwMDNDMDEwMDAxQUMyNDZFODgzQzAxMDAwMUFDMjU2RUFDNEYKKzoxMDA0ODAwMDNDMDEwMDAxQUMyMjZEMjRBRjg2MDE1MDEwRTAwMDExNDgKKzoxMDA0OTAwMEFGODMwMjUwM0MxRDAwMDE4RkJENkNDQzAzQTBGMDIxNDYKKzoxMDA0QTAwMDBDMDAxNzQ5MDAwMDAwMDAzQzAyMDAwMThDNDI2Q0QwOTcKKzoxMDA0QjAwMDNDMDMwMDAxOEM2MzZDRDQyNDQyRkUwMDI0NjMwMjAwRTAKKzoxMDA0QzAwMDNDMDEwMDAxQUMyMjZDRDAzQzAxMDAwMTEwMDAwMDA0OTIKKzoxMDA0RDAwMEFDMjM2Q0Q0M0MxRDAwMDE4RkJENkQyMDAzQTBGMDIxMjYKKzoxMDA0RTAwMDNDMDIwMDAxOEM0MjZDQzQxMDQwMDAwRDI2RkFGQTM4MjAKKzoxMDA0RjAwMDNDMDIwMDAxOEM0MjZDRDAzQzAzMDAwMThDNjM2Q0Q0NDQKKzoxMDA1MDAwMDNDMUEwMDAxOEY1QTZDRDQyNDQyRkEzODI0NjMwNUM4N0YKKzoxMDA1MTAwMDNDMDEwMDAxQUMyMjZDRDAzQzAxMDAwMUFDMjM2Q0Q0NDYKKzoxMDA1MjAwMDNDMDIwMDAxOEM0MjZDQzgxNDQwMDAwMzAwMDAwMDAwMzMKKzoxMDA1MzAwMDNDMDEwMDAxQUMyMDZDRDAwQzAwMTE1MTAwMDAwMDAwMDcKKzoxMDA1NDAwMDhGQkYwMDFDOEZCMDAwMTgwM0UwMDAwODI3QkQwMDIwRkIKKzoxMDA1NTAwMDNDMDIwMDAxOEM0MjZDRDAzQzAzMDAwMThDNjM2Q0Q0RTMKKzoxMDA1NjAwMDI3QkRGRjk4QUZCMDAwNDgzQzEwMDAwMThFMTA2NkI4NjAKKzoxMDA1NzAwMEFGQjIwMDUwM0MxMjAwMDAyNjUyNDEwMEFGQkYwMDYwRjUKKzoxMDA1ODAwMEFGQkUwMDVDQUZCNTAwNThBRkIzMDA1NEFGQjEwMDRDODQKKzoxMDA1OTAwMEFGQTIwMDM0QUZBMzAwMzBBRkEwMDAxMEFGQTAwMDE0OTIKKzoxMDA1QTAwMDhGODYwMDQwM0MwNDAwMDEyNDg0NUM4MDI0MDUwMjAwMDYKKzoxMDA1QjAwMDNDMDEwMDAxQUMzMjZFODAwQzAwMkIzQjAyMDAzODIxNjQKKzoxMDA1QzAwMDhGODMwMDQwM0MwMkYwMDAwMDYyMTgyNDNDMDI2MDAwNkYKKzoxMDA1RDAwMDEwNjIwMDBCQTNBMDAwM0YyNDBFMDAwMTNDMDQwMDAxQTgKKzoxMDA1RTAwMDI0ODQ1Qzg4QTNBRTAwM0ZBRkEwMDAxMEFGQTAwMDE0MkQKKzoxMDA1RjAwMDhGODYwMDQwMjQwNTAzMDAwQzAwMkIzQjAyMDAzODIxQUQKKzoxMDA2MDAwMDhGODIwMjQwM0MwMzAwMDEwMDQzMTAyNUFGODIwMjQwNkMKKzoxMDA2MTAwMEFGODAwMDQ4OEY4MjAwNDgxNDQwMDAwNTAwMDAwMDAwQjEKKzoxMDA2MjAwMEFGODAwMDQ4OEY4MjAwNDgxMDQwMDAwNDAwMDAwMDAwQTYKKzoxMDA2MzAwMEFGODAwMDQ4MTAwMDAwMDMwMkUwMjAyMUFGODAwMDRDOTIKKzoxMDA2NDAwMDAyRTAyMDIxM0MwNTAwMDEwQzAwMkJBODM0QTU0MEY4NTUKKzoxMDA2NTAwMDAzNDAyMDIxMEMwMDJCQTgyNDA1MDVDODNDMDIwMDAxMDIKKzoxMDA2NjAwMDhDNDI2RUE4M0MwRDAwMDE4REFENkU4ODNDMDMwMDAxRUMKKzoxMDA2NzAwMDhDNjM2RTg0M0MwODAwMDE4RDA4NkU5MDNDMDkwMDAxN0IKKzoxMDA2ODAwMDhEMjk2RUFDM0MwQTAwMDE4RDRBNkVCNDNDMEIwMDAxMTIKKzoxMDA2OTAwMDhENkI2RUM0M0MwQzAwMDE4RDhDNkU5ODNDMDQwMDAxODcKKzoxMDA2QTAwMDI0ODQ1Qzk0MjQwNTA0MDBBRjQyMDEzQzhGNDIwMTNDNDkKKzoxMDA2QjAwMDI0MDYwMDAxMjQwNzAwMDFBRjQwMDAwMEFGNEQwMTM4QkYKKzoxMDA2QzAwMEFGNDMwMTQ0QUY0ODAxNDhBRjQ5MDE0Q0FGNEEwMTUwMjQKKzoxMDA2RDAwMEFGNEIwMTU0QUY0QzAxNTgyNDQyRkY4MEFGNDIwMTQwNjAKKzoxMDA2RTAwMDI0MDIwMDAxQUZBMjAwMTAwQzAwMkIzQkFGQTAwMDE0QUQKKzoxMDA2RjAwMDhGNDIwMTM4QUZBMjAwMTA4RjQyMDEzQ0FGQTIwMDE0MUMKKzoxMDA3MDAwMDhGNDYwMTQ0OEY0NzAxNDgzQzA0MDAwMTI0ODQ1Q0EwQ0IKKzoxMDA3MTAwMDBDMDAyQjNCMjQwNTA1MDBBRkI3MDAxMEFGQkEwMDE0NDYKKzoxMDA3MjAwMDhGNDYwMTRDOEY0NzAxNTAzQzA0MDAwMTI0ODQ1Q0FDOEYKKzoxMDA3MzAwMDBDMDAyQjNCMjQwNTA2MDAzQzAyMDAwMThDNDI2RTlDMDEKKzoxMDA3NDAwMDAzNjAzODIxM0MwNjAwMDIyNEM2OTAxMDI0NDhGRkZGQjUKKzoxMDA3NTAwMDAxMDYxODI0MDBFODEwMjQwMDQzMTAyQjEwNDAwMDA2NjYKKzoxMDA3NjAwMDI0MDUwOTAwM0MwNDAwMDEyNDg0NUNCOEFGQTgwMDEwRjMKKzoxMDA3NzAwMDBDMDAyQjNCQUZBMDAwMTQ4RjgyMDAwQ0FGQTIwMDEwMjYKKzoxMDA3ODAwMDhGODIwMDNDQUZBMjAwMTQ4Rjg2MDAwMDhGODcwMDA0ODgKKzoxMDA3OTAwMDNDMDQwMDAxMjQ4NDVDQzQwQzAwMkIzQjI0MDUxMDAwQTUKKzoxMDA3QTAwMDhDMDIwMjIwOEMwMzAyMjQ4QzA2MDIxODhDMDcwMjFDODcKKzoxMDA3QjAwMDNDMDQwMDAxMjQ4NDVDQ0MyNDA1MTEwMEFGQTIwMDEwOEQKKzoxMDA3QzAwMDBDMDAyQjNCQUZBMzAwMTRBRjgwMDA1NEFGODAwMTFDODIKKzoxMDA3RDAwMDhDMDIwMjE4MzA0MjAwMDIxMDQwMDAwOTAwMDAwMDAwQTQKKzoxMDA3RTAwMDhDMDIwMjIwM0MwMzAwMDIzNDYzMDAwNDAwNDMxMDI1MDUKKzoxMDA3RjAwMEFGNDIwMDBDOEMwMjAyMUMxMDAwMDAwODM0NDIwMDA0QkUKKzoxMDA4MDAwMDhDMDIwMjIwM0MwMzAwMDIzNDYzMDAwNjAwNDMxMDI1RTIKKzoxMDA4MTAwMEFGNDIwMDBDOEMwMjAyMUMzNDQyMDAwNkFGNDIwMDE0QUUKKzoxMDA4MjAwMDhDMDIwMjE4MzA0MjAwMTAxMDQwMDAwQTAwMDAwMDAwNDQKKzoxMDA4MzAwMDhDMDIwMjFDMzQ0MjAwMDRBRjQyMDAxMDhDMDIwMjIwRTEKKzoxMDA4NDAwMDNDMDMwMDBBMzQ2MzAwMDQwMDQzMTAyNTEwMDAwMDA5MzMKKzoxMDA4NTAwMEFGNDIwMDA4OEMwMjAyMjAzQzAzMDAwQTM0NjMwMDA2MDkKKzoxMDA4NjAwMDAwNDMxMDI1QUY0MjAwMDg4QzAyMDIxQzM0NDIwMDA2RUYKKzoxMDA4NzAwMEFGNDIwMDEwMjQwMjAwMDFBRjgyMDBBMEFGODIwMEIwOUUKKzoxMDA4ODAwMDhGODMwMDU0OEY4MjAwNTRBRjgwMDBEMEFGODAwMEMwQUYKKzoxMDA4OTAwMDEwMDAwMDAyMjQ2MzAwNjQ4RjgyMDA1NDAwNjIxMDIzNjEKKzoxMDA4QTAwMDJDNDIwMDY1MTQ0MEZGRkMwMDAwMDAwMDhDMDQwMjA4OEMKKzoxMDA4QjAwMDhDMDUwMjBDMjZFMjAwMjhBRUUyMDAyMDI0MDIwNDkwRkYKKzoxMDA4QzAwMEFFRTIwMDEwQUVFNDAwMDhBRUU1MDAwQzI2RTQwMDA4M0QKKzoxMDA4RDAwMDhDODIwMDAwOEM4MzAwMDRBRjgyMDA5MEFGODMwMDk0NzAKKzoxMDA4RTAwMDhDODIwMDE4QUY4MjAwQjQ5NDgyMDAwQUFGODIwMDlDMTAKKzoxMDA4RjAwMDhGNDIwMDE0QUY4MjAwQjA4RjgyMDBCMDMwNDIwMDA0RkIKKzoxMDA5MDAwMDE0NDBGRkZEMDAwMDAwMDA4RjgyMDBCMDNDMDNFRjAwQTgKKzoxMDA5MTAwMDAwNDMxMDI0MTA0MDAwMjEwMDAwMDAwMDhGODIwMEI0MkEKKzoxMDA5MjAwMEFGQTIwMDEwOEY4MjAwOTA4RjgzMDA5NDNDMDQwMDAxREUKKzoxMDA5MzAwMDI0ODQ1Q0Q0QUZBMzAwMTQ4Rjg2MDBCMDhGODcwMDlDMDIKKzoxMDA5NDAwMDNDMDUwMDAxMEMwMDJCM0IzNEE1MjAwRDNDMDQwMDAxQUMKKzoxMDA5NTAwMDI0ODQ1Q0UwMjQwMjAzQzBBRkEyMDAxMEFGQTAwMDE0MDYKKzoxMDA5NjAwMDhGODYwMTQ0M0MwNzAwMDEyNEU3NUNFODBDMDAyQjNCMjgKKzoxMDA5NzAwMDM0MDVERUFEOEY4MjAxMUMzNDQyMDAwMkFGODIwMTFDQkYKKzoxMDA5ODAwMDhGODIwMjIwMzQ0MjAwMDRBRjgyMDIyMDhGODIwMTQwMTUKKzoxMDA5OTAwMDNDMDMwMDAxMDA0MzEwMjVBRjgyMDE0MDk2RTIwNDcyM0YKKzoxMDA5QTAwMDk2RTYwNDUyOTZFNzA0NjJBRkEyMDAxMDk2RTIwNDgyMzMKKzoxMDA5QjAwMDNDMDQwMDAxMjQ4NDVEMTQyNDA1MTIwMDBDMDAyQjNCMzAKKzoxMDA5QzAwMEFGQTIwMDE0OTZGMDA0NTIzMjAyMDAwMTEwNDAwMDAyNUYKKzoxMDA5RDAwMDAwMDBCMDIxMjQxNjAwMDEzMjAyMDAwMjU0NDAwMDAxNDAKKzoxMDA5RTAwMDM2RDYwMDAyMzIwMjAwMDg1NDQwMDAwMTM2RDYwMDA0MTgKKzoxMDA5RjAwMDMyMDIwMDEwNTQ0MDAwMDEzNkQ2MDAwODMyMDIwMDIwQjYKKzoxMDBBMDAwMDU0NDAwMDAxMzZENjAwMTAzMjAyMDA0MDU0NDAwMDAxMkMKKzoxMDBBMTAwMDM2RDYwMDIwMzIwMjAwODA1NDQwMDAwMTM2RDYwMDQwMTUKKzoxMDBBMjAwMDk2RTYwNDgyMzBDMjAyMDA1NDQwMDAwMTM2RDY0MDAwRUYKKzoxMDBBMzAwMDk2RTMwNDcyMzA2MjAyMDAxMDQwMDAwMzMwNjIwMTAwNEQKKzoxMDBBNDAwMDEwMDAwMDAzMzZENjIwMDA1NDQwMDAwMTM2RDYxMDAwQjYKKzoxMDBBNTAwMDk2RjAwNDYyMzJDMjQwMDAxNDQwMDAwNDMyMDcwMDlCNEEKKzoxMDBBNjAwMDMwQzIwMDlCMTRFMjAwMDcyNDBFMDAwMTMyQzIyMDAwQjUKKzoxMDBBNzAwMDE0NDAwMDBEMzIwMjAwMDEzMDYyMDA5QjEwRTIwMDA5QjgKKzoxMDBBODAwMDI0MEUwMDAxM0MwNDAwMDEyNDg0NUQyMDI0MDUxMzAwOTEKKzoxMDBBOTAwMDAyMDAzODIxQTNBRTAwM0ZBRkEzMDAxMDBDMDAyQjNCOTcKKzoxMDBBQTAwMEFGQTAwMDE0MzIwMjAwMDE1NDQwMDAwMTM2RDYwMDgwOEQKKzoxMDBBQjAwMDMyMDIwMDAyNTQ0MDAwMDEzNkQ2MDEwMDMyMDIwMDA4MjIKKzoxMDBBQzAwMDU0NDAwMDAxMzZENjAyMDAzMjAyMDAxMDU0NDAwMDAxQUEKKzoxMDBBRDAwMDM2RDYwNDAwMzIwMjAwODA1NDQwMDAwMTM2RDYwODAwQTkKKzoxMDBBRTAwMDhDMDIwMjE4MzA0MjAyMDAxMDQwMDAwMjNDMDIwMDA4NTIKKzoxMDBBRjAwMDAyQzJCMDI1OEMwMjAyMTgzMDQyMDgwMDEwNDAwMDAyRTkKKzoxMDBCMDAwMDNDMDIwMDgwMDJDMkIwMjU4QzAyMDIxODMwNDIwNDAwNzAKKzoxMDBCMTAwMDEwNDAwMDAyM0MwMjAxMDAwMkMyQjAyNThDMDIwMjE4MDMKKzoxMDBCMjAwMDMwNDIwMTAwMTA0MDAwMDIzQzAyMDIwMDAyQzJCMDI1MjcKKzoxMDBCMzAwMDhDMDIwMjE4MzA0MjAwODAxMDQwMDAwMjNDMDIwNDAwODcKKzoxMDBCNDAwMDAyQzJCMDI1OEMwMjAyMTgzMDQyMjAwMDEwNDAwMDAyODAKKzoxMDBCNTAwMDNDMDIwMDEwMDJDMkIwMjU4QzAyMDIxODMwNDI0MDAwNTQKKzoxMDBCNjAwMDEwNDAwMDAyM0MwMjAwMjAwMkMyQjAyNThDMDIwMjE4OTQKKzoxMDBCNzAwMDMwNDIxMDAwMTA0MDAwMDIzQzAyMDA0MDAyQzJCMDI1OEEKKzoxMDBCODAwMDhFRTIwNDk4OEVFMzA0OUNBRjQyMDE2MEFGNDMwMTY0OUYKKzoxMDBCOTAwMDhFRTIwNEEwOEVFMzA0QTRBRjQyMDE2OEFGNDMwMTZDNkYKKzoxMDBCQTAwMDhFRTIwNEE4OEVFMzA0QUNBRjQyMDE3MEFGNDMwMTc0M0YKKzoxMDBCQjAwMDhFRTIwNDI4OEVFMzA0MkNBRjQyMDE3OEFGNDMwMTdDMUYKKzoxMDBCQzAwMDhFRTIwNDQ4OEVFMzA0NENBRjQyMDE4MEFGNDMwMTg0QkYKKzoxMDBCRDAwMDhFRTIwNDU4OEVFMzA0NUNBRjQyMDE4OEFGNDMwMThDN0YKKzoxMDBCRTAwMDhFRTIwNDY4OEVFMzA0NkNBRjQyMDE5MEFGNDMwMTk0M0YKKzoxMDBCRjAwMDhFRTIwNDc4OEVFMzA0N0NBRjQyMDE5OEFGNDMwMTlDRkYKKzoxMDBDMDAwMDhFRTIwNDg4OEVFMzA0OENBRjQyMDFBMEFGNDMwMUE0QkUKKzoxMDBDMTAwMDhFRTIwNEIwOEVFMzA0QjQyNDA0MDA4MEFGNDIwMUE4NDUKKzoxMDBDMjAwMEFGNDMwMUFDMEMwMDJCQTgyNDA1MDA4MDhDMDIwMjVDQjEKKzoxMDBDMzAwMDI3NDQwMjI0QUY0MjAxRjA4QzAyMDI2MDI0MDUwMjAwMjYKKzoxMDBDNDAwMDI0MDYwMDA4MEMwMDJCQkZBRjQyMDFGODNDMDQzQjlBN0QKKzoxMDBDNTAwMDM0ODRDQTAwMDAwMDM4MjEyNDAyMDAwNjI0MDMwMDAyNjQKKzoxMDBDNjAwMEFGNDIwMUY0MjQwMjAzRThBRjQzMDIwNEFGNDMwMjAwQTEKKzoxMDBDNzAwMEFGNDQwMUZDQUY0MjAyOTQyNDAyMDAwMUFGNDMwMjkwNTIKKzoxMDBDODAwMEFGNDIwMjlDM0MwMzAwMDEwMDY3MTgyMTkwNjM2Q0Q4QkUKKzoxMDBDOTAwMDAzNDcxMDIxMjRFNzAwMDFBMDQzMDIyQzJDRTIwMDBGOUYKKzoxMDBDQTAwMDE0NDBGRkY4MDM0NzE4MjEyNEU3MDAwMTNDMDgwMDAxMjUKKzoxMDBDQjAwMDM1MDg0MEY4OEY4MjAwNDAzQzA0MDAwMTI0ODQ1RDJDRkMKKzoxMDBDQzAwMDI0MDUxNDAwMDAwMjE3MDIyNDQyMDAzMEEwNjIwMjJDMDYKKzoxMDBDRDAwMDAzNDcxMDIxQTA0MDAyMkM4QzA3MDIxODAyQzAzMDIxQ0IKKzoxMDBDRTAwMDI0MDIwNUM4QUZBMjAwMTAwQzAwMkIzQkFGQTgwMDE0RDMKKzoxMDBDRjAwMDNDMDQwMDAxMjQ4NDVEMzgzQzA1MDAwMDI0QTU1QzgwOTAKKzoxMDBEMDAwMDI0MDYwMDEwMjdCMTAwMzAwMjIwMzgyMTI3QjMwMDM0MTgKKzoxMDBEMTAwMDBDMDAxN0EzQUZCMzAwMTAzQzAzMDAwMThDNjM2Q0M4MzgKKzoxMDBEMjAwMDEwNjAwMDBBMDA0MDgwMjE4RkEzMDAzMDI0MDVGRjAwREUKKzoxMDBEMzAwMDhGQTIwMDM0MjQ2NDAwRkYwMDg1MjAyNDAwODMxODIzNDAKKzoxMDBENDAwMDAwNDMxMDIzQUZBMjAwMzRBRkE0MDAzMDNDMDQwMDAxRTQKKzoxMDBENTAwMDI0ODQ1RDQ0M0MwNTAwMDAyNEE1NDEwMDI0MDYwMTA4Q0MKKzoxMDBENjAwMDAyMjAzODIxMEMwMDE3QTNBRkIzMDAxMDAwNDA5MDIxREYKKzoxMDBENzAwMDMyQzIwMDAzM0MwMTAwMDFBQzMyNkU4MDEwNDAwMDQ1REQKKzoxMDBEODAwMDAyMjAzODIxOEY4MjAwNTAzQzAzMDAxMDAwNDMxMDI0QzEKKzoxMDBEOTAwMDEwNDAwMDE2MDAwMDAwMDA4QzAyMDIxODMwNDIwMDQwOTMKKzoxMDBEQTAwMDEwNDAwMDBGMjQwMjAwMDE4RjgyMDA1MDhDMDMwMjE4QjMKKzoxMDBEQjAwMDI0MEUwMDAxM0MwNDAwMDEyNDg0NUQ1MEEzQUUwMDNGREEKKzoxMDBEQzAwMEFGQTIwMDEwQUZBMzAwMTQ4Rjg3MDA0MDI0MDUxNTAwQzgKKzoxMDBERDAwMDBDMDAyQjNCMDJDMDMwMjExMDAwMDAwNDAwMDAwMDAwN0EKKzoxMDBERTAwMDNDMDEwMDAxMDAzNzA4MjFBMDIyNDBGNDNDMDQwMDAxMkUKKzoxMDBERjAwMDI0ODQ1RDVDM0MwNTAwMDEyNEE1NUI0MDNDMDYwMDAxQTkKKzoxMDBFMDAwMDI0QzY1QkFDMDBDNTMwMjM4RjQyMDAxMDI3QjMwMDMwRUUKKzoxMDBFMTAwMDAyNjAzODIxMjdCMTAwMzQzNDQyMEEwMEFGNDIwMDEwOEEKKzoxMDBFMjAwMDBDMDAxN0EzQUZCMTAwMTAzQzA0MDAwMTI0ODQ1RDcwRDYKKzoxMDBFMzAwMDNDMDUwMDAxMjRBNUI3MTQzQzA2MDAwMTI0QzZCQTkwNjUKKzoxMDBFNDAwMDAwQzUzMDIzMDI2MDM4MjFBRjQyMDEwODBDMDAxN0EzMEYKKzoxMDBFNTAwMEFGQjEwMDEwM0MwNDAwMDEyNDg0NUQ4QzNDMDUwMDAxMEUKKzoxMDBFNjAwMDI0QTVCRTU4M0MwNjAwMDEyNEM2QzkwMDAwQzUzMDIzOTUKKzoxMDBFNzAwMDAyNjAzODIxM0MwMTAwMDFBQzIyNkVGNDBDMDAxN0EzODMKKzoxMDBFODAwMEFGQjEwMDEwM0MwNDAwMDEyNDg0NURBNDEwMDAwMDI0RDQKKzoxMDBFOTAwMDI0MDUxNjAwM0MwNDAwMDEyNDg0NURBQzNDMDUwMDAxREYKKzoxMDBFQTAwMDI0QTVBMTBDM0MwNjAwMDEyNEM2QTIzODAwQzUzMDIzQUQKKzoxMDBFQjAwMDBDMDAxN0EzQUZCMzAwMTAzQzA0MDAwMTI0ODQ1REJDRjgKKzoxMDBFQzAwMDNDMDUwMDAxMjRBNUIyQjAzQzA2MDAwMTI0QzZCNzBDQzUKKzoxMDBFRDAwMDAwQzUzMDIzMDIyMDM4MjFBRjQyMDEwODBDMDAxN0EzQkYKKzoxMDBFRTAwMEFGQjMwMDEwM0MwNDAwMDEyNDg0NUREMDNDMDUwMDAxMzgKKzoxMDBFRjAwMDI0QTVCQTk4M0MwNjAwMDEyNEM2QkU1MDAwQzUzMDIzODQKKzoxMDBGMDAwMDAyMjAzODIxM0MwMTAwMDFBQzIyNkVGNDBDMDAxN0EzMzIKKzoxMDBGMTAwMEFGQjMwMDEwM0MwNDAwMDEyNDg0NURFNDI0MDUxNjUwQTYKKzoxMDBGMjAwMDAyQzAzMDIxMDAwMDM4MjEzQzAxMDAwMUFDMjI2RUY4RTMKKzoxMDBGMzAwMEFGQTAwMDEwMEMwMDJCM0JBRkEwMDAxNDMyQzIwMDIwNjkKKzoxMDBGNDAwMDEwNDAwMDIxMjdBNzAwMzAzQzA0MDAwMTI0ODQ1REYwRkMKKzoxMDBGNTAwMDNDMDUwMDAxMjRBNUIxM0MzQzA2MDAwMTI0QzZCMkE4MTIKKzoxMDBGNjAwMDAwQzUzMDIzMjQwMjIwMDBBRjQyMDAxQzI3QTIwMDM0MTkKKzoxMDBGNzAwMDBDMDAxN0EzQUZBMjAwMTAwMDAyMTkwMDAwMDMxOTgyOTEKKzoxMDBGODAwMDNDMDQwODAwMDA2NDE4MjVBRTQzMDAyODI0MDMwMDEwMjgKKzoxMDBGOTAwMEFGNDMwMDNDOTZFMzA0NTBBRjQzMDA0MDhGNDMwMDQwMTIKKzoxMDBGQTAwMDNDMDQwMDAxMjQ4NDVFMDRBRkEwMDAxNEFGQTMwMDEwMzEKKzoxMDBGQjAwMDhGNDcwMDFDMjQwNTE2NjAzQzAxMDAwMUFDMjI2RUYwMzYKKzoxMDBGQzAwMDEwMDAwMDI1MzJDNjAwMjA4RUUyMDQ0ODhFRTMwNDRDNTcKKzoxMDBGRDAwMEFGNDMwMDFDOEY0MjAwMUMyNDQyRTAwMDJDNDIyMDAxNDEKKzoxMDBGRTAwMDE0NDAwMDBBMjQwRTAwMDEzQzA0MDAwMTI0ODQ1RTEwMTkKKzoxMDBGRjAwMEEzQUUwMDNGQUZBMDAwMTBBRkEwMDAxNDhGNDYwMDFDQUUKKzoxMDEwMDAwMDI0MDUxNzAwMEMwMDJCM0IwMDAwMzgyMTNDMDIwMDAwOTcKKzoxMDEwMTAwMDI0NDI1Q0JDMDAwMjExMDAwMDAyMTE4MjNDMDMwODAwNjMKKzoxMDEwMjAwMDAwNDMxMDI1QUU0MjAwMjgyNDAyMDAwOEFGNDIwMDNDRDUKKzoxMDEwMzAwMDk2RTIwNDUwQUY0MjAwNDA4RjQyMDA0MDNDMDQwMDAxNjEKKzoxMDEwNDAwMDI0ODQ1RTFDQUZBMDAwMTRBRkEyMDAxMDhGNDcwMDFDQzgKKzoxMDEwNTAwMDI0MDUxODAwMzJDNjAwMjAwQzAwMkIzQjAwMDAwMDAwQzUKKzoxMDEwNjAwMDNDMDUwRkZGM0MwMzAwMDE4QzYzNkVGNDM0QTVGRkZGQzkKKzoxMDEwNzAwMDAyNDAzMDIxM0MwMjAwMDE4QzQyNkVGODNDMDQwODAwMjIKKzoxMDEwODAwMDAwNjUxODI0MDAwMzE4ODIwMDY0MTgyNTAwNDUxMDI0MDgKKzoxMDEwOTAwMDAwMDIxMDgyMDA0NDEwMjVBQ0MyMDA4MDMyQzIwMTgwRTAKKzoxMDEwQTAwMDEwNDAwMDU2QUNDMzAwMjA4RjgyMDA1QzNDMDMwMDgwREYKKzoxMDEwQjAwMDAwNDMxMDI0MTA0MDAwMEQwMDAwMDAwMDhGODIwMDUwRkIKKzoxMDEwQzAwMEFGQTIwMDEwOEY4MjAwNUMyNDBFMDAwMTNDMDQwMDAxREUKKzoxMDEwRDAwMDI0ODQ1RTI4QTNBRTAwM0ZBRkEyMDAxNDhGODcwMDQwOTcKKzoxMDEwRTAwMDI0MDUxOTAwMEMwMDJCM0IwMkMwMzAyMThGODIwMDUwRDgKKzoxMDEwRjAwMDNDMDMwMDEwMDA0MzEwMjQxMDQwMDAxNjAwMDAwMDAwQzQKKzoxMDExMDAwMDhDMDIwMjE4MzA0MjAwNDAxMDQwMDAwRjI0MDIwMDAxRkYKKzoxMDExMTAwMDhGODIwMDUwOEMwMzAyMTgyNDBFMDAwMTNDMDQwMDAxNTEKKzoxMDExMjAwMDI0ODQ1RDUwQTNBRTAwM0ZBRkEyMDAxMEFGQTMwMDE0MTMKKzoxMDExMzAwMDhGODcwMDQwMjQwNTIwMDAwQzAwMkIzQjAyQzAzMDIxOEIKKzoxMDExNDAwMDEwMDAwMDA0MDAwMDAwMDAzQzAxMDAwMTAwMzcwODIxRUQKKzoxMDExNTAwMEEwMjI0MEY0M0MwNDAwMDEyNDg0NUUzNDNDMDUwMDAxREMKKzoxMDExNjAwMDI0QTU1QUMwM0MwNjAwMDEyNEM2NUIzODAwQzUzMDIzQzQKKzoxMDExNzAwMDhGNDIwMDA4MjdCMzAwMzAwMjYwMzgyMTI3QjEwMDM0QzUKKzoxMDExODAwMDM0NDIwRTAwQUY0MjAwMDgwQzAwMTdBM0FGQjEwMDEwQUMKKzoxMDExOTAwMDNDMDQwMDAxMjQ4NDVFNEMzQzA1MDAwMTI0QTVEOEI0MjUKKzoxMDExQTAwMDNDMDYwMDAxMjRDNkUzQzgwMEM1MzAyMzAyNjAzODIxOTQKKzoxMDExQjAwMEFGNDIwMTBDMEMwMDE3QTNBRkIxMDAxMDNDMDQwMDAxQkEKKzoxMDExQzAwMDI0ODQ1RTY0M0MwNTAwMDEyNEE1RTlBQzNDMDYwMDAxRDIKKzoxMDExRDAwMDI0QzZGMEYwMDBDNTMwMjMwMjYwMzgyMTNDMDEwMDAxMzQKKzoxMDExRTAwMEFDMjI2RjA0MEMwMDE3QTNBRkIxMDAxMDNDMDQwMDAxNDcKKzoxMDExRjAwMDI0ODQ1RTdDMTAwMDAwMjcyNDA1MjEwMDNDMDQwMDAxQUIKKzoxMDEyMDAwMDI0ODQ1RTg0M0MwNTAwMDEyNEE1OUZDODNDMDYwMDAxOUYKKzoxMDEyMTAwMDI0QzZBMTA0MDBDNTMwMjMyN0IxMDAzMDAyMjAzODIxQTQKKzoxMDEyMjAwMDI3QjMwMDM0MEMwMDE3QTNBRkIzMDAxMDNDMDQwMDAxMzcKKzoxMDEyMzAwMDI0ODQ1RTk0M0MwNTAwMDEyNEE1Q0FENDNDMDYwMDAxMjgKKzoxMDEyNDAwMDI0QzZEOEFDMDBDNTMwMjMwMjIwMzgyMUFGNDIwMTBDOUYKKzoxMDEyNTAwMDBDMDAxN0EzQUZCMzAwMTAzQzA0MDAwMTI0ODQ1RUE0NkIKKzoxMDEyNjAwMDNDMDUwMDAxMjRBNUU4NEMzQzA2MDAwMTI0QzZFOUE0ODUKKzoxMDEyNzAwMDAwQzUzMDIzMDIyMDM4MjEzQzAxMDAwMUFDMjI2RjA0NUMKKzoxMDEyODAwMDBDMDAxN0EzQUZCMzAwMTAzQzA0MDAwMTI0ODQ1RUI4MjcKKzoxMDEyOTAwMDI0MDUyMTUwMDJDMDMwMjEwMDAwMzgyMTNDMDEwMDAxMEEKKzoxMDEyQTAwMEFDMjI2RjEwQUZBMDAwMTAwQzAwMkIzQkFGQTAwMDE0QkQKKzoxMDEyQjAwMDNDMTEwRkZGM0MwMzAwMDE4QzYzNkYwNDM2MzFGRkZGQ0MKKzoxMDEyQzAwMDAyNDA5ODIxM0MwMjAwMDE4QzQyNkYxMDNDMEUwODAwNDUKKzoxMDEyRDAwMDAwNzExODI0MDAwMzE4ODIwMDZFMTgyNTAwNTExMDI0OTQKKzoxMDEyRTAwMDAwMDIxMDgyMDA0RTEwMjVBRTYzMDAzOEFFNjIwMDc4MTYKKzoxMDEyRjAwMDhDMDIwMjE4MzA0MjAwNDAxNDQwMDAwNDI0MDIwMDAxMTUKKzoxMDEzMDAwMDNDMDEwMDAxMDAzNzA4MjFBMDIyNDBGNDNDMDQwMDAxMDgKKzoxMDEzMTAwMDI0ODQ1RUM0M0MwNTAwMDEyNEE1RTNEMDNDMDYwMDAxMDIKKzoxMDEzMjAwMDI0QzZFNTJDMDBDNTMwMjMyN0JFMDAzMDAzQzAzODIxNzkKKzoxMDEzMzAwMDI3QjUwMDM0MEMwMDE3QTNBRkI1MDAxMDNDMDEwMDAxMjUKKzoxMDEzNDAwMEFDMjI2RUZDMDA1MTEwMjQwMDAyMTA4MjNDMEUwODAwRkEKKzoxMDEzNTAwMDAwNEUxMDI1QUU2MjAwNTAzMkMyMjAwMDEwNDAwMDA2NDAKKzoxMDEzNjAwMDAzQzAzODIxM0MwMjAwMDAyNDQyNUNCQzAyMjIxMDI0NEQKKzoxMDEzNzAwMDEwMDAwMDBGMDAwMjEwODIzQzA0MDAwMTI0ODQ1RUQ4OUIKKzoxMDEzODAwMDNDMDUwMDAxMjRBNUU1MzQzQzA2MDAwMTI0QzZFNkU0NDIKKzoxMDEzOTAwMDAwQzUzMDIzMEMwMDE3QTNBRkI1MDAxMDNDMDEwMDAxQkQKKzoxMDEzQTAwMEFDMjI2RjE0MDA1MTEwMjQwMDAyMTA4MjNDMEUwODAwODEKKzoxMDEzQjAwMDAwNEUxMDI1QUU2MjAwNDgzMkMyNDAwMDEwNDAwMDA1QzkKKzoxMDEzQzAwMDI3QTcwMDMwM0MwMjAwMDAyNDQyNUNCQzEwMDAwMDBFNDUKKzoxMDEzRDAwMDAwMDIxMTAwM0MwNDAwMDEyNDg0NUVGMDNDMDUwMDAxODEKKzoxMDEzRTAwMDI0QTVFNkVDM0MwNjAwMDEyNEM2RTg0NDAwQzUzMDIzRjEKKzoxMDEzRjAwMDI3QTIwMDM0MEMwMDE3QTNBRkEyMDAxMDNDMDEwMDAxOEIKKzoxMDE0MDAwMEFDMjI2RjA4MDAwMjExMDAwMDAyMTE4MjNDMDMwODAwQTgKKzoxMDE0MTAwMDAwNDMxMDI1QUU0MjAwNjAzQzA0MDAwMTI0ODQ1RjA4QjQKKzoxMDE0MjAwMDNDMDUwMDAxMjRBNTgyMzAzQzA2MDAwMTI0QzY4NjUwRkMKKzoxMDE0MzAwMDAwQzUzMDIzMjdCMTAwMzAwMjIwMzgyMTI3QjMwMDM0MDMKKzoxMDE0NDAwMDBDMDAxN0EzQUZCMzAwMTAzQzBFMEZGRjM1Q0VGRkZGMEIKKzoxMDE0NTAwMDNDMDQwMDAxMjQ4NDVGMTQzQzA1MDAwMDI0QTU2NDY4NUEKKzoxMDE0NjAwMDNDMDYwMDAwMjRDNjY1ODgwMEM1MzAyMzAyMjAzODIxRDAKKzoxMDE0NzAwMDAyNDBGMDIxM0MwMTAwMDFBQzIyNkVEQzAwNEUxMDI0NDEKKzoxMDE0ODAwMDAwMDIxMDgyM0MxNTA4MDAwMDU1MTAyNUFGQUUwMDQ0NDQKKzoxMDE0OTAwMEFGQzIwMEI4MEMwMDE3QTNBRkIzMDAxMDNDMDQwMDAxQUEKKzoxMDE0QTAwMDI0ODQ1RjIwM0MwNTAwMDAyNEE1NjU5MDNDMDYwMDAwRDQKKzoxMDE0QjAwMDI0QzY2ODA4OEZBRTAwNDQwMEM1MzAyMzAyMjAzODIxQkUKKzoxMDE0QzAwMDNDMDEwMDAxQUMyMjZFRDAwMDRFMTAyNDAwMDIxMDgyQkMKKzoxMDE0RDAwMDAwNTUxMDI1QUZDMjAwRTgwQzAwMTdBM0FGQjMwMDEwRjEKKzoxMDE0RTAwMDNDMDQwMDAxMjQ4NDVGMzgzQzA1MDAwMDI0QTU2ODEwRkEKKzoxMDE0RjAwMDNDMDYwMDAwMjRDNjY5NDA4RkFFMDA0NDAwQzUzMDIzN0UKKzoxMDE1MDAwMDAyMjAzODIxM0MwMTAwMDFBQzIyNkVDODAwNEUxMDI0OUMKKzoxMDE1MTAwMDAwMDIxMDgyMDA1NTEwMjVBRkMyMDBDMDBDMDAxN0EzQjYKKzoxMDE1MjAwMEFGQjMwMDEwM0MwNDAwMDEyNDg0NUY1MDNDMDUwMDAxNkYKKzoxMDE1MzAwMDI0QTVGQUQwM0MwNjAwMDEyNEM2RkJBODhGQUUwMDQ0QzcKKzoxMDE1NDAwMDAwQzUzMDIzMDIyMDM4MjEzQzAxMDAwMUFDMjI2RUQ0QkEKKzoxMDE1NTAwMDAwNEUxMDI0MDAwMjEwODIwMDU1MTAyNUFGQzIwMEM4QjIKKzoxMDE1NjAwMDBDMDAxN0EzQUZCMzAwMTAzQzA0MDAwMTI0ODQ1RjVDOUYKKzoxMDE1NzAwMDNDMDUwMDAxMjRBNUM5M0MzQzA2MDAwMTI0QzZDQTIwNDQKKzoxMDE1ODAwMDAwQzUzMDIzMDIyMDM4MjFBRjQyMDExMDBDMDAxN0EzMDAKKzoxMDE1OTAwMEFGQjMwMDEwM0MwNDAwMDEyNDg0NUY2QzNDMDUwMDAxRTMKKzoxMDE1QTAwMDI0QTVDOTEwM0MwNjAwMDEyNEM2QzkzNDAwQzUzMDIzNTcKKzoxMDE1QjAwMDAyMjAzODIxQUY0MjAxMjQwQzAwMTdBM0FGQjMwMDEwNjIKKzoxMDE1QzAwMDNDMDQwMDAxMjQ4NDVGN0MzQzA1MDAwMTI0QTU1QTgwNzIKKzoxMDE1RDAwMDNDMDYwMDAxMjRDNjVBQUMwMEM1MzAyMzAyMjAzODIxNDUKKzoxMDE1RTAwMEFGNDIwMTIwQUY0MjAxMTQwQzAwMTdBM0FGQjMwMDEwQUIKKzoxMDE1RjAwMDNDMDQwMDAxMjQ4NDVGODgzQzA1MDAwMTI0QTVGMjk4ODYKKzoxMDE2MDAwMDNDMDYwMDAxMjRDNkY2QjQwMEM1MzAyMzAyMjAzODIxNzAKKzoxMDE2MTAwMEFGNDIwMTE4MEMwMDE3QTNBRkIzMDAxMDhGQUUwMDQ0MDcKKzoxMDE2MjAwMDNDMDEwMDAxQUMyMjZGMTgwMDRFMTAyNDAwMDIxMDgyMTEKKzoxMDE2MzAwMDAwNTUxMDI1MEMwMDNGQzNBRkMyMDBEMDBDMDAzQzQwNDkKKzoxMDE2NDAwMDAwMDAwMDAwMEMwMDI3QTgwMDAwMDAwMEFDMDAwMjI4RTkKKzoxMDE2NTAwMEFDMDAwMjJDOTZFMjA0NTAyNDQyRkZGRkFGNDIwMDM4NTcKKzoxMDE2NjAwMDk2RTIwNDYwQUY0MjAwODAzMkMyNDAwMDE0NDAwMDAzQTIKKzoxMDE2NzAwMDAwMDAwMDAwOTZFMjA0ODBBRjQyMDA4NDk2RTcwNDkwRTgKKzoxMDE2ODAwMDUwRTAwMDAxMjQwNzA4MDAyNEUyRkZGRkFGNDIwMDg4NzkKKzoxMDE2OTAwMEFGNDIwMDdDMjQwMjA4MDAxMEUyMDAwRjMyQzI0MDAwN0EKKzoxMDE2QTAwMDEwNDAwMDAzMjQwMjA0MDAxMEUyMDAwQjAwMDAwMDAwQzAKKzoxMDE2QjAwMDI0MEUwMDAxM0MwNDAwMDEyNDg0NUY5OEEzQUUwMDNGODcKKzoxMDE2QzAwMDk2RTYwNDkwMjQwNTIxNzAwMkMwMzgyMUFGQTAwMDEwRDYKKzoxMDE2RDAwMDBDMDAyQjNCQUZBMDAwMTQ4RjQzMDEzODhGNDQwMTM4MUUKKzoxMDE2RTAwMDI0MDIwMDAxQTM0MjA1QzJBRjQzMDA5NEFGNDQwMDk4MTYKKzoxMDE2RjAwMEFGQTAwMDEwQUZBMDAwMTQ4RjQ2MDA4MDhGNDcwMDg0NzkKKzoxMDE3MDAwMDNDMDQwMDAxMjQ4NDVGQTQwQzAwMkIzQjI0MDUyMjAwMzAKKzoxMDE3MTAwMDBDMDAyNEE0M0MxMTA4MDAzQzE0MzNEODM2OTRDQjU4NTgKKzoxMDE3MjAwMDNDMDIwODAwMzQ0MjAwODAzQzA0MDAwMTI0ODQ1RkIwODUKKzoxMDE3MzAwMDNDMDUwMDAwMjRBNTVEMDAzQzA2MDAwMDI0QzY1RDFDOUQKKzoxMDE3NDAwMDAwQzUzMDIzMjdBNzAwMzBBRjgyMDA2MDI0MDJGRkZGQ0UKKzoxMDE3NTAwMEFGODIwMDY0MjdBMjAwMzQwQzAwMTdBM0FGQTIwMDEwRDAKKzoxMDE3NjAwMDNDMDEwMDAxQUMyMjZFQjgwMDAyMTEwMDAwMDIxMTgyOUYKKzoxMDE3NzAwMDAwNTExMDI1MEMwMDE4RkNBRTQyMDAwMDhGODIwMjQwODAKKzoxMDE3ODAwMDNDMDMwMDAxMDA0MzEwMjVBRjgyMDI0MDNDMDIwMDAwRjAKKzoxMDE3OTAwMDI0NDI0MDM0QUY4MjAyNDRBRjgwMDI0MDhGODIwMDYwMTYKKzoxMDE3QTAwMDAwNTExMDI0MTQ0MDAwMDUzQzAzMDgwMDhGODIwMDYwQTMKKzoxMDE3QjAwMDAwNDMxMDI0MTA0MEZGRkQwMDAwMDAwMDBDMDAzQzRERDEKKzoxMDE3QzAwMDAwMDA4ODIxM0MwMjAxMDBBRkEyMDAyMDhGNTMwMDE4QzYKKzoxMDE3RDAwMDI0MDIwMEZGNTY2MjAwMDEyNjcxMDAwMThDMDIwMjI4REIKKzoxMDE3RTAwMDE2MjIwMDBFMDAxMzMwQzA4RjQyMDMzQzI0NDIwMDAxMzkKKzoxMDE3RjAwMEFGNDIwMzNDOEY0MjAzM0M4QzAyMDIyODNDMDQwMDAxQjAKKzoxMDE4MDAwMDI0ODQ1QzI0M0MwNTAwMDlBRkEwMDAxNEFGQTIwMDEwQTIKKzoxMDE4MTAwMDhGQTYwMDIwMTAwMDAwM0YzNEE1MDEwMDAwRDcxMDIxNDIKKzoxMDE4MjAwMDhGQTMwMDIwOEZBNDAwMjRBQzQzMDRDMEFDNDQwNEM0QTQKKzoxMDE4MzAwMDAwQzAxODIxOEY0NDAxNzg4RjQ1MDE3QzAwMDAxMDIxRTEKKzoxMDE4NDAwMDI0MDcwMDA0QUZBNzAwMTBBRkIxMDAxNDhGNDgwMDBDQUMKKzoxMDE4NTAwMDI0QzYwNEMwMDJFNjMwMjFBRkE4MDAxODhGNDgwMTBDNEUKKzoxMDE4NjAwMDI0MDcwMDA4MDBBMzI4MjEwMEEzNDgyQjAwODIyMDIxODAKKzoxMDE4NzAwMDAxMDBGODA5MDA4OTIwMjExNDQwMDAwQjI0MDcwMDA4MEEKKzoxMDE4ODAwMDhGODIwMTIwQUZBMjAwMTA4RjgyMDEyNDNDMDQwMDAxNEUKKzoxMDE4OTAwMDI0ODQ1QzJDM0MwNTAwMDlBRkEyMDAxNDhGQTYwMDIwMTQKKzoxMDE4QTAwMDEwMDAwMDFDMzRBNTAyMDA4RjQ0MDE2MDhGNDUwMTY0QzQKKzoxMDE4QjAwMDhGNDMwMDBDQUY1MTAwMTg4Rjg2MDEyMDI0MDIwMDEwQzYKKzoxMDE4QzAwMEFGQTIwMDEwQUZCMTAwMTRBRkEzMDAxODhGNDIwMTBDRkIKKzoxMDE4RDAwMDAwNDBGODA5MjRDNjAwMUMxNDQwMDAxMDAwMDAwMDAwNUQKKzoxMDE4RTAwMDhGNDIwMzQwMjQ0MjAwMDFBRjQyMDM0MDhGNDIwMzQwMzUKKzoxMDE4RjAwMDhGODIwMTIwQUZBMjAwMTA4RjgyMDEyNDNDMDQwMDAxREUKKzoxMDE5MDAwMDI0ODQ1QzM0M0MwNTAwMDlBRkEyMDAxNDhGQTYwMDIwOUIKKzoxMDE5MTAwMDM0QTUwMzAwMEMwMDJCM0IwMjYwMzgyMThGNDIwMkU0MDcKKzoxMDE5MjAwMDI0NDIwMDAxQUY0MjAyRTQ4RjQyMDJFNDkzQTIwMDNGNEUKKzoxMDE5MzAwMDEwNDAwMDY5M0MwMjA3MDAzNDQyMzAwMEFGQTIwMDI4OEEKKzoxMDE5NDAwMDhGNTMwMDE4MjQwMjAwRkYxMjYyMDAwMjAwMDA4ODIxNTkKKzoxMDE5NTAwMDI2NzEwMDAxOEMwMjAyMjgxNjIyMDAwRTAwMTMzMEMwRUUKKzoxMDE5NjAwMDhGNDIwMzNDMjQ0MjAwMDFBRjQyMDMzQzhGNDIwMzNDQzAKKzoxMDE5NzAwMDhDMDIwMjI4M0MwNDAwMDEyNDg0NUMyNDNDMDUwMDA5RkMKKzoxMDE5ODAwMEFGQTAwMDE0QUZBMjAwMTA4RkE2MDAyODEwMDAwMDNGRTcKKzoxMDE5OTAwMDM0QTUwMTAwMDBENzEwMjE4RkEzMDAyODhGQTQwMDJDQUMKKzoxMDE5QTAwMEFDNDMwNEMwQUM0NDA0QzQwMEMwMTgyMThGNDQwMTc4ODcKKzoxMDE5QjAwMDhGNDUwMTdDMDAwMDEwMjEyNDA3MDAwNEFGQTcwMDEwMTAKKzoxMDE5QzAwMEFGQjEwMDE0OEY0ODAwMEMyNEM2MDRDMDAyRTYzMDIxRDkKKzoxMDE5RDAwMEFGQTgwMDE4OEY0ODAxMEMyNDA3MDAwODAwQTMyODIxOTUKKzoxMDE5RTAwMDAwQTM0ODJCMDA4MjIwMjEwMTAwRjgwOTAwODkyMDIxNTIKKzoxMDE5RjAwMDE0NDAwMDBCMjQwNzAwMDg4RjgyMDEyMEFGQTIwMDEwQzIKKzoxMDFBMDAwMDhGODIwMTI0M0MwNDAwMDEyNDg0NUMyQzNDMDUwMDA5RTUKKzoxMDFBMTAwMEFGQTIwMDE0OEZBNjAwMjgxMDAwMDAxQzM0QTUwMjAwRkQKKzoxMDFBMjAwMDhGNDQwMTYwOEY0NTAxNjQ4RjQzMDAwQ0FGNTEwMDE4NTMKKzoxMDFBMzAwMDhGODYwMTIwMjQwMjAwMTBBRkEyMDAxMEFGQjEwMDE0NjUKKzoxMDFBNDAwMEFGQTMwMDE4OEY0MjAxMEMwMDQwRjgwOTI0QzYwMDFDMDcKKzoxMDFBNTAwMDE0NDAwMDEwMDAwMDAwMDA4RjQyMDM0MDI0NDIwMDAxQTcKKzoxMDFBNjAwMEFGNDIwMzQwOEY0MjAzNDA4RjgyMDEyMEFGQTIwMDEwOUIKKzoxMDFBNzAwMDhGODIwMTI0M0MwNDAwMDEyNDg0NUMzNDNDMDUwMDA5NkQKKzoxMDFBODAwMEFGQTIwMDE0OEZBNjAwMjgzNEE1MDMwMDBDMDAyQjNCNDYKKzoxMDFBOTAwMDAyNjAzODIxOEY0MjAyRjAyNDQyMDAwMUFGNDIwMkYwN0UKKzoxMDFBQTAwMDhGNDIwMkYwM0MwNDAwMDEyNDg0NUZDMEFGQTAwMDEwMEMKKzoxMDFBQjAwMEFGQTAwMDE0OEZBNjAwMjgyNDA1MjMwMDBDMDAyQjNCQTgKKzoxMDFBQzAwMDAwMDAzODIxMTAwMDAwMDQwMDAwMDAwMDhDMDIwMjY0QjUKKzoxMDFBRDAwMDEwNDAwMDA1MDAwMDAwMDA4RjgyMDBBMDMwNDIwMDA0OEEKKzoxMDFBRTAwMDE0NDBGRkZBMDAwMDAwMDA4RjgyMDA0NDM0NDIwMDA0REEKKzoxMDFBRjAwMEFGODIwMDQ0OEY0MjAzMDgyNDQyMDAwMUFGNDIwMzA4MzIKKzoxMDFCMDAwMDhGNDIwMzA4OEY4MjAwRDg4RjgzMDBENDAwNDMxMDIzQjQKKzoxMDFCMTAwMDI0NDJGRjgwQUY0MjAwOTA4RjQyMDA5MDI4NDJGRjgxMTQKKzoxMDFCMjAwMDEwNDAwMDA2MjQwMjAwMDE4RjQyMDA5MDhGNDMwMTQ0QzAKKzoxMDFCMzAwMDAwNDMxMDIxQUY0MjAwOTAyNDAyMDAwMUFGNDIwMDhDMEMKKzoxMDFCNDAwMDMyQzIwMDA4MTA0MDAwMDYwMDAwMDAwMDhGODIwMjE0MUMKKzoxMDFCNTAwMDNDMDM4MTAwMzA0MkZGRkYwMDQzMTAyNUFGODIwMjE0OTYKKzoxMDFCNjAwMDNDMDMwMDAxOEM2MzZEOTQzMDYyMDAwMjEwNDAwMDA5NTgKKzoxMDFCNzAwMDMwNjIwMDAxM0MwNDAwMDEyNDg0NUZDQzNDMDUwMDAwN0QKKzoxMDFCODAwMDI0QTU2RDUwM0MwNjAwMDAyNEM2NzFDODEwMDAwMDEyNDgKKzoxMDFCOTAwMDAwQzUzMDIzMTA0MDAwMDkwMDAwMDAwMDNDMDQwMDAxOTMKKzoxMDFCQTAwMDI0ODQ1RkRDM0MwNTAwMDAyNEE1NzFEMDNDMDYwMDAwQzUKKzoxMDFCQjAwMDI0QzY3Njc4MTAwMDAwMDgwMEM1MzAyMzNDMDQwMDAxREMKKzoxMDFCQzAwMDI0ODQ1RkVDM0MwNTAwMDAyNEE1Njk0ODNDMDYwMDAwMjUKKzoxMDFCRDAwMDI0QzY2RDQ4MDBDNTMwMjMyN0E3MDAzMDI3QTIwMDM0NTMKKzoxMDFCRTAwMDBDMDAxN0EzQUZBMjAwMTAzQzAxMDAwMUFDMjI2RUNDODgKKzoxMDFCRjAwMDNDMDIwMDAxOEM0MjZFQ0MzQzAzMDgwMDAwMDIxMTAwNDQKKzoxMDFDMDAwMDAwMDIxMTgyMDA0MzEwMjVBRTQyMDA0MDhGODIwMEEwRTYKKzoxMDFDMTAwMEFGQTIwMDEwOEY4MjAwQjBBRkEyMDAxNDhGODYwMDVDQ0MKKzoxMDFDMjAwMDhGODcwMTFDM0MwNDAwMDEyNDg0NUZGQzNDMDEwMDAxRkYKKzoxMDFDMzAwMEFDMzY2RUE0M0MwMTAwMDFBQzIwNkU5NDNDMDEwMDAxNjYKKzoxMDFDNDAwMEFDM0M2RThDM0MwMTAwMDFBQzNCNkVCQzNDMDEwMDAxMjUKKzoxMDFDNTAwMEFDMzc2RUMwM0MwMTAwMDFBQzNBNkVBMDBDMDAyQjNCQ0YKKzoxMDFDNjAwMDI0MDUyNDAwOEY4MjAyMDBBRkEyMDAxMDhGODIwMjIwODAKKzoxMDFDNzAwMEFGQTIwMDE0OEY4NjAwNDQ4Rjg3MDA1MDNDMDQwMDAxRkYKKzoxMDFDODAwMDI0ODQ2MDA4MEMwMDJCM0IyNDA1MjUwMDhGODMwMDYwMTIKKzoxMDFDOTAwMDAwNzQxMDBCMDI0MjAwMEEwMjAwRjgyMTAwMDAwMDAwNEMKKzoxMDFDQTAwMDAwMDAwMDBEOEZCRjAwNjA4RkJFMDA1QzhGQjUwMDU4MzQKKzoxMDFDQjAwMDhGQjMwMDU0OEZCMjAwNTA4RkIxMDA0QzhGQjAwMDQ4RUEKKzoxMDFDQzAwMDAzRTAwMDA4MjdCRDAwNjgyN0JERkZFMDNDMDQwMDAxRDkKKzoxMDFDRDAwMDI0ODQ2MDE0MjQwNTI2MDAwMDAwMzAyMTAwMDAzODIxRUYKKzoxMDFDRTAwMEFGQkYwMDE4QUZBMDAwMTAwQzAwMkIzQkFGQTAwMDE0M0EKKzoxMDFDRjAwMDhGQkYwMDE4MDNFMDAwMDgyN0JEMDAyMDAzRTAwMDA4QTQKKzoxMDFEMDAwMDAwMDAwMDAwMDNFMDAwMDgwMDAwMDAwMDAwMDAwMDAwRTgKKzoxMDFEMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwQzMKKzoxMDFEMjAwMDAzRTAwMDA4MDAwMDAwMDAwM0UwMDAwODAwMDAwMDAwREQKKzoxMDFEMzAwMDI3QkRGREUwMjdBNTAwMTgzQzA0REVBRDM0ODRCRUVGQ0UKKzoxMDFENDAwMEFGQkYwMjE4OEY4MjAxNTAzQzAzMDAxRjM0NjNGRkZGQjYKKzoxMDFENTAwMEFGQTQwMDE4MDBBMjI4MjMwMEEzMjgyNDhDQTIwMDAwMEUKKzoxMDFENjAwMDEwNDQwMDBBMDAwMDAwMDBBRkE1MDAxMDhDQTIwMDAwODMKKzoxMDFENzAwMEFGQTIwMDE0OEY4NjAxNTA4Rjg3MDI1MDNDMDQwMDAxRUYKKzoxMDFEODAwMDI0ODQ2MDFDMEMwMDJCM0IyNDA1MjcwMDhGQkYwMjE4MDUKKzoxMDFEOTAwMDAzRTAwMDA4MjdCRDAyMjAyN0JERkZFMDNDMDZBQkJBRTgKKzoxMDFEQTAwMDM0QzZCQUJFQUZCMDAwMTgzQzEwMDAwNDNDMDcwMDdGMzgKKzoxMDFEQjAwMDM0RTdGRkZGQUZCRjAwMUMwMDEwMjg0MDhFMDQwMDAwNzYKKzoxMDFEQzAwMDhDQTMwMDAwQUNBMDAwMDBBRTA2MDAwMDhDQTIwMDAwQjYKKzoxMDFERDAwMEFDQTMwMDAwMTA0NjAwMDVBRTA0MDAwMDAwQTA4MDIxNjYKKzoxMDFERTAwMDAwRjAxMDJCMTA0MEZGRjUwMDEwMjg0MDNDMDQwMDAxQ0IKKzoxMDFERjAwMDI0ODQ2MDI4MjQwNTI4MDAwMjAwMzAyMTAwMDAzODIxQjYKKzoxMDFFMDAwMEFGQTAwMDEwMEMwMDJCM0JBRkEwMDAxNDAyMDAxMDIxNkIKKzoxMDFFMTAwMDhGQkYwMDFDOEZCMDAwMTgwM0UwMDAwODI3QkQwMDIwMTIKKzoxMDFFMjAwMDhDMDIwMjI0MzA0NzAwM0YxMEUwMDAxMDAwODAzMDIxNzcKKzoxMDFFMzAwMDAwMDAyODIxMjQwMzAwMjAwMEUzMTAyNDEwNDAwMDAyQTkKKzoxMDFFNDAwMDAwMDYzMDQyMDBBNjI4MjEwMDAzMTg0MjE0NjBGRkZCNjAKKzoxMDFFNTAwMDAwRTMxMDI0MjQwMkYwMDAwMEEyMjgyNDM0MDJGRkZGMzMKKzoxMDFFNjAwMDAwNDUxMDJCMTQ0MDAwMDMzQzAyMDAwMTEwMDAwMDA4NDQKKzoxMDFFNzAwMDNDMDIwMDAxMzQ0MkZGRkYwMDg1MTgyMzAwNDMxMDJCNzEKKzoxMDFFODAwMDE0NDAwMDAzMDBBMDEwMjEzQzAyRkZGRTAwODIxMDIxM0MKKzoxMDFFOTAwMDAzRTAwMDA4MDAwMDAwMDAyN0JERkZEMEFGQjUwMDI4MTgKKzoxMDFFQTAwMDhGQjUwMDQwQUZCMjAwMjAwMEEwOTAyMUFGQjEwMDFDNjAKKzoxMDFFQjAwMDI0QzYwMDAzQUZCRjAwMkNBRkIzMDAyNEFGQjAwMDE4OUUKKzoxMDFFQzAwMDhFQTIwMDAwMjQwM0ZGRkMwMEMzODAyNDAwNTAxMDJCQ0UKKzoxMDFFRDAwMDE0NDAwMDFCMDBFMDg4MjE4RTMzMDAwMEFGQjAwMDEwREEKKzoxMDFFRTAwMDhFQTIwMDAwQUZBMjAwMTQ4RTI3MDAwMDI0MDUzMDAwNEYKKzoxMDFFRjAwMDBDMDAyQjNCMDI0MDMwMjE4RTIzMDAwMDAwNzAyMDIxN0IKKzoxMDFGMDAwMDAwNjQxMDJCMTA0MDAwMDcwMjQwMjgyMThDQTIwMDAwMjIKKzoxMDFGMTAwMEFDNjIwMDAwMjQ2MzAwMDQwMDY0MTAyQjE0NDBGRkZCM0IKKzoxMDFGMjAwMDI0QTUwMDA0OEVBMjAwMDAwMDUwMTAyM0FFQTIwMDAwRTEKKzoxMDFGMzAwMDhFMjIwMDAwMDA1MDEwMjExMDAwMDAwQkFFMjIwMDAwODUKKzoxMDFGNDAwMDI0MDIwMDJEQTA4MjAwMDBBRkIwMDAxMDhFQTIwMDAwN0QKKzoxMDFGNTAwMDAyNDA5ODIxQUZBMjAwMTQ4RTI3MDAwMDI0MDUzMTAwMTIKKzoxMDFGNjAwMDBDMDAyQjNCMDI2MDMwMjEwMjYwMTAyMThGQkYwMDJDM0YKKzoxMDFGNzAwMDhGQjUwMDI4OEZCMzAwMjQ4RkIyMDAyMDhGQjEwMDFDRDIKKzoxMDFGODAwMDhGQjAwMDE4MDNFMDAwMDgyN0JEMDAzMDI3QkRGRkU4MzAKKzoxMDFGOTAwMDNDMUNDMDAwM0MwNUZGRkUzQzAzMDAwMThDNjM2RTg0Q0EKKzoxMDFGQTAwMDNDMDQwMDAxOEM4NDZFOTAzNEE1QkYwODI0MDIxRkZDMDEKKzoxMDFGQjAwMDNDMDEwMDAxQUMyMjZDRDAzQzAyMDBDMDNDMDEwMDAxOUQKKzoxMDFGQzAwMEFDMjI2Q0Q0M0MwMjAwMjBBRkJGMDAxMDNDMDEwMEMwMkEKKzoxMDFGRDAwMEFDMjAxRkZDMDA0MzEwMjMwMDQ0MTAyMzI0NUJCMDAwRkUKKzoxMDFGRTAwMDAzNjVCODIxM0MxRDAwMDE4RkJENkNDQzAzQTBGMDIxMUUKKzoxMDFGRjAwMDNDMDQwMEMwMzQ4NDAyMDAzQzFBMDBDMDNDMDMwMEMwMTIKKzoxMDIwMDAwMDM0NjMwN0M4MjQwMjFERkMzQzAxMDAwMUFDMjI2Q0QwRTMKKzoxMDIwMTAwMDI0MDIxODM0M0MwMTAwMDFBQzI0NkNENDNDMDEwMDAxQzIKKzoxMDIwMjAwMEFDMjI2Q0QwM0MwMTAwMDFBQzIzNkNENDBDMDAxODBEMjgKKzoxMDIwMzAwMDM3NUEwMjAwOEZCRjAwMTAwM0UwMDAwODI3QkQwMDE4QzgKKzoxMDIwNDAwMDI3QkRGRkM4M0MwNDAwMDEyNDg0NjAzNDI0MDUzMjAwMEQKKzoxMDIwNTAwMDNDMDIwMDAxOEM0MjZDRDAzQzAzMDAwMThDNjM2Q0Q0QzgKKzoxMDIwNjAwMDAwMDAzMDIxMDM2MDM4MjFBRkJGMDAzMEFGQjMwMDJDMzcKKzoxMDIwNzAwMEFGQjIwMDI4QUZCMTAwMjRBRkIwMDAyMEFGQTIwMDFDNjcKKzoxMDIwODAwMEFGQTMwMDE4QUZCNzAwMTAwQzAwMkIzQkFGQkEwMDE0ODEKKzoxMDIwOTAwMDBDMDAxOTE2MDAwMDAwMDA4RjgyMDI0MDM0NDIwMDA0MzgKKzoxMDIwQTAwMEFGODIwMjQwMjQwMjAwMDFBRjQyMDAwMDNDMDIwMDAxNjYKKzoxMDIwQjAwMDAwNTcxMDIxOTA0MjQwRjQxMDQwMDA5MjI0MDNGRkZDOEUKKzoxMDIwQzAwMDNDMTAwMDAxMjYxMEFDNzMzQzEyMDAwMTI2NTJBODRDQjMKKzoxMDIwRDAwMDAyMTIxMDIzMDA0MzgwMjQ4RkEzMDAxQzNDMDQwMDAxNDMKKzoxMDIwRTAwMDI0ODQ2MDQwMDA3MDEwMkIxNDQwMDAxQTI3QjMwMDE4OUQKKzoxMDIwRjAwMDhGQjEwMDE4MjQwNTMwMDAwMjQwMzAyMUFGQjAwMDEwMkQKKzoxMDIxMDAwMEFGQTMwMDE0MEMwMDJCM0IwMjIwMzgyMThGQTMwMDE4MzIKKzoxMDIxMTAwMDAwNzAyMDIxMDA2NDEwMkIxMDQwMDAwNzAyNDAzMDIxODUKKzoxMDIxMjAwMDhDQzIwMDAwQUM2MjAwMDAyNDYzMDAwNDAwNjQxMDJCMjkKKzoxMDIxMzAwMDE0NDBGRkZCMjRDNjAwMDQ4RkEyMDAxQzAwNTAxMDIzOTMKKzoxMDIxNDAwMEFGQTIwMDFDOEU2MjAwMDAwMDUwMTAyMTEwMDAwMDBBOTcKKzoxMDIxNTAwMEFFNjIwMDAwMDI0MDg4MjEyNDA1MzEwMEFGQjAwMDEwQkIKKzoxMDIxNjAwMEFGQTMwMDE0OEZBNzAwMTgwMjIwMzAyMTI0MDIwMDJERjUKKzoxMDIxNzAwMDBDMDAyQjNCQTA4MjAwMDAyNDA3MDAyMDhGQTMwMDFDMzIKKzoxMDIxODAwMDNDMDQwMDAxMjQ4NDYwNUMyNDEyMDAyMDNDMDEwMDAxMTYKKzoxMDIxOTAwMEFDMzE2RUIwMkM2MjAwMjAxNDQwMDAxRDI3QjEwMDE4MzUKKzoxMDIxQTAwMDhGQjAwMDE4MjQwNTMwMDAzQzA2MDAwMTI0QzY2RjUwOTMKKzoxMDIxQjAwMEFGQTcwMDEwQUZBMzAwMTQwQzAwMkIzQjAyMDAzODIxODYKKzoxMDIxQzAwMDhGQTMwMDE4M0MwNDAwMDEyNDg0NkY1MDI0NjUwMDIwNzQKKzoxMDIxRDAwMDAwNjUxMDJCMTA0MDAwMDcwMDAwMDAwMDhDODIwMDAwRkEKKzoxMDIxRTAwMEFDNjIwMDAwMjQ2MzAwMDQwMDY1MTAyQjE0NDBGRkZCNjgKKzoxMDIxRjAwMDI0ODQwMDA0OEZBMjAwMUMwMDUyMTAyM0FGQTIwMDFDRjQKKzoxMDIyMDAwMDhFMjIwMDAwMDA1MjEwMjExMDAwMDAwQkFFMjIwMDAwQjAKKzoxMDIyMTAwMDNDMTAwMDAxMjYxMDZGNTAyNDA1MzEwMEFGQTcwMDEwQkMKKzoxMDIyMjAwMEFGQTMwMDE0OEZBNzAwMTgwMjAwMzAyMTI0MDIwMDJENTQKKzoxMDIyMzAwMDBDMDAyQjNCQTA4MjAwMDAyNDA3MDAyMDNDMDQwMDAxN0UKKzoxMDIyNDAwMDI0ODQ2MDcwOEZBMzAwMUMyNDEyMDAyMDNDMDEwMDAxMzQKKzoxMDIyNTAwMEFDMzA2RUU0MkM2MjAwMjAxNDQwMDAxRDI3QjEwMDE4NDEKKzoxMDIyNjAwMDhGQjAwMDE4MjQwNTMwMDAzQzA2MDAwMTI0QzY2RjcwQjIKKzoxMDIyNzAwMEFGQTcwMDEwQUZBMzAwMTQwQzAwMkIzQjAyMDAzODIxQzUKKzoxMDIyODAwMDhGQTMwMDE4M0MwNDAwMDEyNDg0NkY3MDI0NjUwMDIwOTMKKzoxMDIyOTAwMDAwNjUxMDJCMTA0MDAwMDcwMDAwMDAwMDhDODIwMDAwMzkKKzoxMDIyQTAwMEFDNjIwMDAwMjQ2MzAwMDQwMDY1MTAyQjE0NDBGRkZCQTcKKzoxMDIyQjAwMDI0ODQwMDA0OEZBMjAwMUMwMDUyMTAyM0FGQTIwMDFDMzMKKzoxMDIyQzAwMDhFMjIwMDAwMDA1MjEwMjExMDAwMDAwQkFFMjIwMDAwRjAKKzoxMDIyRDAwMDNDMTAwMDAxMjYxMDZGNzAyNDA1MzEwMEFGQTcwMDEwREMKKzoxMDIyRTAwMEFGQTMwMDE0OEZBNzAwMTgwMjAwMzAyMTI0MDIwMDJEOTQKKzoxMDIyRjAwMDBDMDAyQjNCQTA4MjAwMDAzQzAxMDAwMTEwMDAwMDMxQ0IKKzoxMDIzMDAwMEFDMzA2RUUwM0MxMDAwMDEyNjEwODIxRjNDMTIwMDAxMzAKKzoxMDIzMTAwMDI2NTI4MDlDMDIxMjEwMjMwMDQzODAyNDhGQTMwMDFDQUQKKzoxMDIzMjAwMDNDMDQwMDAxMjQ4NDYwODQwMDcwMTAyQjE0NDAwMDFBQzcKKzoxMDIzMzAwMDI3QjMwMDE4OEZCMTAwMTgyNDA1MzAwMDAyNDAzMDIxNjcKKzoxMDIzNDAwMEFGQjAwMDEwQUZBMzAwMTQwQzAwMkIzQjAyMjAzODIxQ0IKKzoxMDIzNTAwMDhGQTMwMDE4MDA3MDIwMjEwMDY0MTAyQjEwNDAwMDA3OEMKKzoxMDIzNjAwMDAyNDAzMDIxOENDMjAwMDBBQzYyMDAwMDI0NjMwMDA0RjMKKzoxMDIzNzAwMDAwNjQxMDJCMTQ0MEZGRkIyNEM2MDAwNDhGQTIwMDFDMzUKKzoxMDIzODAwMDAwNTAxMDIzQUZBMjAwMUM4RTYyMDAwMDAwNTAxMDIxRUMKKzoxMDIzOTAwMDEwMDAwMDBBQUU2MjAwMDAwMjQwODgyMTI0MDUzMTAwQ0UKKzoxMDIzQTAwMEFGQjAwMDEwQUZBMzAwMTQ4RkE3MDAxODAyMjAzMDIxOTcKKzoxMDIzQjAwMDI0MDIwMDJEMEMwMDJCM0JBMDgyMDAwMDNDMDEwMDAxRjgKKzoxMDIzQzAwMEFDMzE2RUIwM0MwMzAwMDE4QzYzNkVCMDI0MDIwNDAwOUIKKzoxMDIzRDAwMDAwNjBGODA5QUY4MjAwNzA4RkJGMDAzMDhGQjMwMDJDMEYKKzoxMDIzRTAwMDhGQjIwMDI4OEZCMTAwMjQ4RkIwMDAyMDAzRTAwMDA4RDYKKzoxMDIzRjAwMDI3QkQwMDM4MDAwMDAwMDAwMDAwMDAwMDhGODIwMDQwNzAKKzoxMDI0MDAwMDNDMDNGMDAwMDA0MzEwMjQzQzAzNjAwMDE0NDMwMDA2MkEKKzoxMDI0MTAwMDAwMDAwMDAwOEY4MjAwNTAyNDAzRkY4MDAwNDMxMDI0M0UKKzoxMDI0MjAwMDM0NDIwMDU1QUY4MjAwNTA4RjgyMDA1NDI0NDIwM0U4QUEKKzoxMDI0MzAwMEFGODIwMDU4MjQwMjAxRjRBRjQyMDBFMDI0MDIwMDA0RkQKKzoxMDI0NDAwMEFGNDIwMEU4MjQwMjAwMDJBRjQwMDFCMEFGNDAwMEU0MTgKKzoxMDI0NTAwMEFGNDIwMERDQUY0MDAwRDhBRjQwMDBENDAzRTAwMDA4M0EKKzoxMDI0NjAwMEFGNDAwMEQwOEY4MjAwNTQyNDQyMDAwNTAzRTAwMDA4RjIKKzoxMDI0NzAwMEFGODIwMDc4MjdCREZGRThBRkJGMDAxMDhGODIwMDU0MDUKKzoxMDI0ODAwMDI0NDIwM0U4QUY4MjAwNTgzQzAyMDgwMDAyQzIxMDI0MzQKKzoxMDI0OTAwMDEwNDAwMDA0M0MwMkY3RkYzNDQyRkZGRjAyQzJCMDI0QTgKKzoxMDI0QTAwMDM2OTQwMDQwM0MwMjAwMDE4QzQyNkRBODEwNDAwMDE3OTkKKzoxMDI0QjAwMDNDMDIwMjAwM0MwMzAwMDE4QzYzNkYxQzEwNjAwMDE2OUMKKzoxMDI0QzAwMDAyODJBMDI1M0MwMjAwMDE4QzQyNkU0NDE0NDAwMDEyOUUKKzoxMDI0RDAwMDNDMDIwMjAwM0MwMjAwMDE4QzQyNkQ5NDMwNDIwMDAzMzkKKzoxMDI0RTAwMDE0NDAwMDBEM0MwMjAyMDA4RjgzMDIyNDNDMDIwMDAyRDMKKzoxMDI0RjAwMDhDNDI4RkVDMTA2MjAwMDgzQzAyMDIwMDBDMDAzREFGRTEKKzoxMDI1MDAwMDAwMDAwMDAwMTAwMDAwMDQzQzAyMDIwMDBDMDA0MTk2OTQKKzoxMDI1MTAwMDAwMDAwMDAwM0MwMjAyMDAwMkMyMTAyNDEwNDAwMDAzMzAKKzoxMDI1MjAwMDAwMDAwMDAwMEMwMDFGNEIwMDAwMDAwMDhGNDIwMEQ4OEMKKzoxMDI1MzAwMDhGNDMwMERDMjQ0MjAwMDFBRjQyMDBEODAwNDMxMDJCM0YKKzoxMDI1NDAwMDE0NDAwMDAzMDAwMDAwMDBBRjQwMDBEODM2OTQwMDgwMjMKKzoxMDI1NTAwMDhDMDMwMjM4MTA2MDAwMEMwMDAwMDAwMDhGNDIwMUIwQjQKKzoxMDI1NjAwMDI0NDIwM0U4QUY0MjAxQjAwMDQzMTAyQjE0NDAwMDA2QTAKKzoxMDI1NzAwMDAwMDAwMDAwOTM0MjA1QzUxNDQwMDAwMzAwMDAwMDAwNjUKKzoxMDI1ODAwMDBDMDAxREEwMDAwMDAwMDA4RkJGMDAxMDAzRTAwMDA4MzkKKzoxMDI1OTAwMDI3QkQwMDE4MDNFMDAwMDgwMDAwMDAwMDI3QkRGRkQ4OTkKKzoxMDI1QTAwMEFGQkYwMDIwOEY0MzAwMkM4RjQyMDAzODEwNjIwMDU5Q0IKKzoxMDI1QjAwMDAwMDAwMDAwM0MwMjAwMDEwMDU3MTAyMTkwNDI0MEYwNTIKKzoxMDI1QzAwMDEwNDAwMDI2MjQwNzAwMDg4RjQ0MDE3MDhGNDUwMTc0RDUKKzoxMDI1RDAwMDhGNDgwMDBDOEY4NjAxMjAyNDAyMDAyMEFGQTIwMDEwM0IKKzoxMDI1RTAwMEFGQTMwMDE0QUZBODAwMTg4RjQyMDEwQzAwNDBGODA5RjcKKzoxMDI1RjAwMDI0QzYwMDFDMTQ0MDAwMTEyNDAyMDAwMTNDMDEwMDAxMEIKKzoxMDI2MDAwMDAwMzcwODIxQTAyMjQwRjA4RjgyMDEyNEFGQTIwMDEwRTEKKzoxMDI2MTAwMDhGODIwMTI4M0MwNDAwMDEyNDg0NjEyOEFGQTIwMDE0QTkKKzoxMDI2MjAwMDhGNDYwMDJDOEY4NzAxMjAzQzA1MDAwOTBDMDAyQjNCQjYKKzoxMDI2MzAwMDM0QTUwOTAwMTAwMDAwNUMwMDAwMDAwMDhGNDIwMzAwNzgKKzoxMDI2NDAwMDI0NDIwMDAxQUY0MjAzMDA4RjQyMDMwMDhGNDIwMDJDNUUKKzoxMDI2NTAwMEEzNDAwNUMxMTAwMDAwMjdBRjQyMDAzODhGNDQwMTcwMkQKKzoxMDI2NjAwMDhGNDUwMTc0OEY0MzAwMkM4RjQ4MDAwQzhGODYwMTIwMEEKKzoxMDI2NzAwMDI0MDIwMDgwQUZBMjAwMTBBRkEzMDAxNEFGQTgwMDE4N0UKKzoxMDI2ODAwMDhGNDIwMTBDMDA0MEY4MDkyNEM2MDAxQzE0NDAwMDExQzAKKzoxMDI2OTAwMDI0MDIwMDAxM0MwMTAwMDEwMDM3MDgyMUEwMjI0MEYxODIKKzoxMDI2QTAwMDhGODIwMTI0QUZBMjAwMTA4RjgyMDEyODNDMDQwMDAxMTgKKzoxMDI2QjAwMDI0ODQ2MTM0QUZBMjAwMTQ4RjQ2MDAyQzhGODcwMTIwNDAKKzoxMDI2QzAwMDNDMDUwMDA5MEMwMDJCM0IzNEE1MTEwMDEwMDAwMDM2MUUKKzoxMDI2RDAwMDAwMDAwMDAwOEY0MjAzMDA4RjQzMDAyQzI0NDIwMDAxQzEKKzoxMDI2RTAwMEFGNDIwMzAwOEY0MjAzMDAyNDAyMDAwMUEzNDIwNUMxNTAKKzoxMDI2RjAwMEFGNDMwMDM4M0MwMTAwMDEwMDM3MDgyMUEwMjA0MEYxMjEKKzoxMDI3MDAwMDNDMDEwMDAxMDAzNzA4MjFBMDIwNDBGMDEwMDAwMDI2MDUKKzoxMDI3MTAwMEFGNDAwMDM0OTM0MjA1QzExMDQwMDAxRDAwMDAwMDAwOEUKKzoxMDI3MjAwMEEzNDAwNUMxOEY4MjAwNDAzMDQyMDAwMTE0NDAwMDA4RTAKKzoxMDI3MzAwMDAwMDAyMDIxOEMwMzAxMDQyNDAyMDAwMTUwNjIwMDA1RTYKKzoxMDI3NDAwMDI0MDQwMDAxOEMwMjAyNjQxMDQwMDAwMzAwODAxMDIxNjgKKzoxMDI3NTAwMDI0MDQwMDAxMDA4MDEwMjExMDQwMDAwNjAwMDAwMDAwNDkKKzoxMDI3NjAwMDhGNDIwMzBDMjQ0MjAwMDFBRjQyMDMwQzEwMDAwMDA4MEEKKzoxMDI3NzAwMDhGNDIwMzBDOEY4MjAwNDQzNDQyMDAwNEFGODIwMDQ0MzUKKzoxMDI3ODAwMDhGNDIwMzA4MjQ0MjAwMDFBRjQyMDMwODhGNDIwMzA4MkUKKzoxMDI3OTAwMDNDMDEwMDAxMDAzNzA4MjFBMDIwNDBGMDNDMDEwMDAxNkQKKzoxMDI3QTAwMDAwMzcwODIxQTAyMDQwRjE4RjQyMDAwMDEwNDAwMDA3QjAKKzoxMDI3QjAwMDAwMDAwMDAwQUY4MDAwNEM4RjgyMDA0QzEwNDBGRkZERjUKKzoxMDI3QzAwMDAwMDAwMDAwMTAwMDAwMDUwMDAwMDAwMEFGODAwMDQ4N0QKKzoxMDI3RDAwMDhGODIwMDQ4MTA0MEZGRkQwMDAwMDAwMDhGODIwMDYwRTMKKzoxMDI3RTAwMDNDMDNGRjdGMzQ2M0ZGRkYwMDQzMTAyNEFGODIwMDYwOEYKKzoxMDI3RjAwMDhGNDIwMDAwMTA0MDAwMDMwMDAwMDAwMDEwMDAwMDAyQTMKKzoxMDI4MDAwMEFGODAwMDRDQUY4MDAwNDg4RkJGMDAyMDAzRTAwMDA4N0QKKzoxMDI4MTAwMDI3QkQwMDI4MDNFMDAwMDgwMDAwMDAwMDI3QkRGRkQ4MDYKKzoxMDI4MjAwMEFGQkYwMDIwOEY0MzAwNDQ4RjQyMDA3QzEwNjIwMDI5MUMKKzoxMDI4MzAwMDI0MDcwMDA4OEY0NDAxNjg4RjQ1MDE2QzhGNDgwMDBDMDUKKzoxMDI4NDAwMDhGODYwMTIwMjQwMjAwNDBBRkEyMDAxMEFGQTMwMDE0MjUKKzoxMDI4NTAwMEFGQTgwMDE4OEY0MjAxMEMwMDQwRjgwOTI0QzYwMDFDRTQKKzoxMDI4NjAwMDE0NDAwMDExMjQwMjAwMDEzQzAxMDAwMTAwMzcwODIxM0UKKzoxMDI4NzAwMEEwMjI0MEYyOEY4MjAxMjRBRkEyMDAxMDhGODIwMTI4OTMKKzoxMDI4ODAwMDNDMDQwMDAxMjQ4NDYxM0NBRkEyMDAxNDhGNDYwMDQ0NDQKKzoxMDI4OTAwMDhGODcwMTIwM0MwNTAwMDkwQzAwMkIzQjM0QTUxMzAwNTkKKzoxMDI4QTAwMDEwMDAwMDBGMDAwMDAwMDA4RjQyMDMwNDI0NDIwMDAxQ0EKKzoxMDI4QjAwMEFGNDIwMzA0OEY0MjAzMDQ4RjQyMDA0NEFGNDIwMDdDQzYKKzoxMDI4QzAwMDNDMDEwMDAxMDAzNzA4MjFBMDIwNDBGMjEwMDAwMDA0NjQKKzoxMDI4RDAwMEFGNDAwMDc4M0MwMTAwMDEwMDM3MDgyMUEwMjA0MEYyMDEKKzoxMDI4RTAwMDhGNDIwMDAwMTA0MDAwMDcwMDAwMDAwMEFGODAwMDRDNDUKKzoxMDI4RjAwMDhGODIwMDRDMTA0MEZGRkQwMDAwMDAwMDEwMDAwMDA1MUEKKzoxMDI5MDAwMDAwMDAwMDAwQUY4MDAwNDg4RjgyMDA0ODEwNDBGRkZEQUIKKzoxMDI5MTAwMDAwMDAwMDAwOEY4MjAwNjAzQzAzRkVGRjM0NjNGRkZGNzUKKzoxMDI5MjAwMDAwNDMxMDI0QUY4MjAwNjA4RjQyMDAwMDEwNDAwMDAzN0IKKzoxMDI5MzAwMDAwMDAwMDAwMTAwMDAwMDJBRjgwMDA0Q0FGODAwMDQ4OTMKKzoxMDI5NDAwMDhGQkYwMDIwMDNFMDAwMDgyN0JEMDAyODAzRTAwMDA4MzcKKzoxMDI5NTAwMDAwMDAwMDAwM0MwMjAwMDE4QzQyNkRBODI3QkRGRkE4Q0EKKzoxMDI5NjAwMEFGQkYwMDUwQUZCRTAwNENBRkI1MDA0OEFGQjMwMDQ0OUUKKzoxMDI5NzAwMEFGQjIwMDQwQUZCMTAwM0NBRkIwMDAzODEwNDAwMEQ1NUUKKzoxMDI5ODAwMDhGOTAwMDQ0OEY0MjAwRDAyNDQzMDAwMTI4NDIwMDBCNjYKKzoxMDI5OTAwMDE0NDAwMEU0QUY0MzAwRDA4RjQyMDAwNDMwNDIwMDAyRjQKKzoxMDI5QTAwMDE0NDAwMDlDQUY0MDAwRDA4RjQyMDAwNDNDMDMwMDAxNjMKKzoxMDI5QjAwMDhDNjM2RDk4MzQ0MjAwMDJBRjQyMDAwNDI0MDIwMDAxOEYKKzoxMDI5QzAwMDE0NjIwMDAzM0MwMjA2MDAxMDAwMDAwMjM0NDIzMDAwOTIKKzoxMDI5RDAwMDM0NDIxMDAwQUZBMjAwMjA4RjRBMDAxOEFGQUEwMDM0ODIKKzoxMDI5RTAwMDI3QUEwMDIwQUZBQTAwMkM4RkFBMDAzNDI0MDIwMEZGREYKKzoxMDI5RjAwMDExNDIwMDAyMDAwMDE4MjEyNTQzMDAwMThDMDIwMjI4MjgKKzoxMDJBMDAwMDAwNjA5ODIxMTY2MjAwMEUzQzA1MDAwOThGNDIwMzNDQ0QKKzoxMDJBMTAwMDI0NDIwMDAxQUY0MjAzM0M4RjQyMDMzQzhDMDIwMjI4NTcKKzoxMDJBMjAwMDhGQTcwMDM0M0MwNDAwMDEyNDg0NjEwQ0FGQTAwMDE0ODMKKzoxMDJBMzAwMEFGQTIwMDEwOEZBNjAwMjAxMDAwMDA3MDM0QTUwNTAwODIKKzoxMDJBNDAwMDhGQUEwMDM0MDAwQTM4QzAwMEY3MTAyMThGQTMwMDIwOUQKKzoxMDJBNTAwMDhGQTQwMDI0QUM0MzA0QzBBQzQ0MDRDNDhGODMwMDU0NEUKKzoxMDJBNjAwMDhGODIwMDU0MjQ3MTAzRTgwMjIyMTAyMzJDNDIwM0U5RDAKKzoxMDJBNzAwMDEwNDAwMDFCMDAwMEE4MjEwMEUwOTAyMTI2NUUwNEMwNDkKKzoxMDJBODAwMDhGNDQwMTc4OEY0NTAxN0MwMjQwMTgyMTI0MEEwMDA0RkMKKzoxMDJBOTAwMEFGQUEwMDEwQUZCMzAwMTQ4RjQ4MDAwQzAwMDAxMDIxNDMKKzoxMDJBQTAwMDAyRkUzMDIxQUZBODAwMTg4RjQ4MDEwQzI0MDcwMDA4NEYKKzoxMDJBQjAwMDAwQTMyODIxMDBBMzQ4MkIwMDgyMjAyMTAxMDBGODA5NEYKKzoxMDJBQzAwMDAwODkyMDIxNTQ0MDAwMDYyNDE1MDAwMThGODIwMDU0MDMKKzoxMDJBRDAwMDAyMjIxMDIzMkM0MjAzRTkxNDQwRkZFOTAwMDAwMDAwMDkKKzoxMDJBRTAwMDMyQTIwMEZGNTQ0MDAwMThBRjUzMDAxODhGNDIwMzc4MDEKKzoxMDJBRjAwMDI0NDIwMDAxQUY0MjAzNzg4RjQyMDM3ODhGODIwMTIwODUKKzoxMDJCMDAwMDhGQUEwMDJDOEZBNzAwMzRBRkEyMDAxMDhGODIwMTI0NUYKKzoxMDJCMTAwMDNDMDQwMDAxMjQ4NDYxMThBRkEyMDAxNDhENDYwMDAwMUIKKzoxMDJCMjAwMDNDMDUwMDA5MTAwMDAwMzUzNEE1MDYwMDhGNDIwMzA4NUIKKzoxMDJCMzAwMDI0MTUwMDAxMjQ0MjAwMDFBRjQyMDMwODhGNDIwMzA4MUMKKzoxMDJCNDAwMDEwMDAwMDFFMzJBMjAwRkY4RjgzMDA1NDhGODIwMDU0QjkKKzoxMDJCNTAwMDI0NzEwM0U4MDIyMjEwMjMyQzQyMDNFOTEwNDAwMDE2REUKKzoxMDJCNjAwMDAwMDBBODIxM0MxRTAwMjAyNDEyMDAxMDhGNDIwMDBDRkYKKzoxMDJCNzAwMDhGNDQwMTYwOEY0NTAxNjQ4Rjg2MDEyMEFGQjIwMDEwNDEKKzoxMDJCODAwMEFGQjMwMDE0MDA1RTEwMjVBRkEyMDAxODhGNDIwMTBDRjUKKzoxMDJCOTAwMDI0MDcwMDA4MDA0MEY4MDkyNEM2MDAxQzE0NDBGRkUzODUKKzoxMDJCQTAwMDAwMDAwMDAwOEY4MjAwNTQwMjIyMTAyMzJDNDIwM0U5MEYKKzoxMDJCQjAwMDE0NDBGRkVFMDAwMDAwMDAzMkEyMDBGRjE0NDAwMDExOUMKKzoxMDJCQzAwMDNDMDUwMDA5OEY0MjAzNzgyNDQyMDAwMUFGNDIwMzc4OUMKKzoxMDJCRDAwMDhGNDIwMzc4OEY4MjAxMjA4RkFBMDAyQzhGQTcwMDM0QTgKKzoxMDJCRTAwMEFGQTIwMDEwOEY4MjAxMjQzQzA0MDAwMTI0ODQ2MTIwRTQKKzoxMDJCRjAwMEFGQTIwMDE0OEQ0NjAwMDAzNEE1MDcwMDBDMDAyQjNCNEIKKzoxMDJDMDAwMDAwMDAwMDAwOEY0MjAyRUMyNDQyMDAwMUFGNDIwMkVDQkYKKzoxMDJDMTAwMDhGNDIwMkVDOEY0MjAwMDQzMDQyMDAwMTUwNDAwMDI5RjQKKzoxMDJDMjAwMDM2MTAwMDQwM0MwMjA0MDAwMkMyMTAyNDEwNDAwMDEzODEKKzoxMDJDMzAwMDI0MDRGRkRGOEY0MjAyNTA4RjQzMDI1NDhGNDQwMUI0QkIKKzoxMDJDNDAwMDE0NjQwMDA2MzYxMDAwNDA4RjQyMDI3MDhGNDMwMjc0RjUKKzoxMDJDNTAwMDhGNDQwMUI4MTA2NDAwMDcyNDAyRkZERjhGNDIwMjUwNDYKKzoxMDJDNjAwMDhGNDMwMjU0OEY0NDAyNzA4RjQ1MDI3NDEwMDAwMDEyOEIKKzoxMDJDNzAwMDNBMTAwMDIwMTAwMDAwMkIwMjAyODAyNDhGNDIwMjUwRTQKKzoxMDJDODAwMDhGNDMwMjU0OEY0NTAxQjQxNDY1MDAwNjAyMDQ4MDI0NkEKKzoxMDJDOTAwMDhGNDIwMjcwOEY0MzAyNzQ4RjQ0MDFCODUwNjQwMDIxNDgKKzoxMDJDQTAwMDM2MTAwMDQwOEY0MjAyNTA4RjQzMDI1NDhGNDQwMjcwMEUKKzoxMDJDQjAwMDhGNDUwMjc0M0ExMDAwNDBBRjQzMDFCNDEwMDAwMDE5NzAKKzoxMDJDQzAwMEFGNDUwMUI4OEY0MjAwRDQyNDQzMDAwMTEwMDAwMDExMjkKKzoxMDJDRDAwMDI4NDIwMDMzOEY0MjAwMDQzMDQyMDAwMTEwNDAwMDA5QjYKKzoxMDJDRTAwMDNDMDIwNDAwMDJDMjEwMjQxMDQwMDAwNDI0MDJGRkRGNTIKKzoxMDJDRjAwMDAyMDI4MDI0MTAwMDAwMEIzNjEwMDA0MDEwMDAwMDA5NzIKKzoxMDJEMDAwMDM2MTAwMDYwOEY0MjAwRDQzNjEwMDA0MDI0NDMwMDAxOEEKKzoxMDJEMTAwMDI4NDIwMUY1MTQ0MDAwMDNBRjQzMDBENEFGNDAwMEQ0NzMKKzoxMDJEMjAwMDNBMTAwMDIwQUY5MDAwNDQyNDAyRkY3RjAyODJBMDI0Q0EKKzoxMDJEMzAwMDhGQkYwMDUwOEZCRTAwNEM4RkI1MDA0ODhGQjMwMDQ0NEEKKzoxMDJENDAwMDhGQjIwMDQwOEZCMTAwM0M4RkIwMDAzODAzRTAwMDA4MjQKKzoxMDJENTAwMDI3QkQwMDU4MDNFMDAwMDgwMDAwMDAwMDNDMDIwMDAxMEQKKzoxMDJENjAwMDhDNDI2REE4MjdCREZGQjBBRkJGMDA0OEFGQkUwMDQ0ODYKKzoxMDJENzAwMEFGQjUwMDQwQUZCMzAwM0NBRkIyMDAzOEFGQjEwMDM0RTQKKzoxMDJEODAwMDEwNDAwMEM3QUZCMDAwMzA4RjQyMDBEMDI0NDMwMDAxOTQKKzoxMDJEOTAwMDI4NDIwMDBCMTQ0MDAwREFBRjQzMDBEMDhGNDIwMDA0RjkKKzoxMDJEQTAwMDMwNDIwMDAyMTQ0MDAwOTdBRjQwMDBEMDhGNDIwMDA0MzAKKzoxMDJEQjAwMDNDMDMwMDAxOEM2MzZEOTgzNDQyMDAwMkFGNDIwMDA0NzIKKzoxMDJEQzAwMDI0MDIwMDAxMTQ2MjAwMDMzQzAyMDYwMDEwMDAwMDAyMEQKKzoxMDJERDAwMDM0NDIzMDAwMzQ0MjEwMDBBRkEyMDAyMDAwMDAxODIxMUQKKzoxMDJERTAwMDhGNUUwMDE4MjdBQTAwMjAyNDAyMDBGRjEzQzIwMDAyRjEKKzoxMDJERjAwMEFGQUEwMDJDMjdDMzAwMDE4QzAyMDIyODAwNjA5MDIxOUEKKzoxMDJFMDAwMDE2NDIwMDBFMDAxRTM4QzA4RjQyMDMzQzI0NDIwMDAxQ0YKKzoxMDJFMTAwMEFGNDIwMzNDOEY0MjAzM0M4QzAyMDIyODNDMDQwMDAxNzkKKzoxMDJFMjAwMDI0ODQ2MTBDM0MwNTAwMDlBRkEwMDAxNEFGQTIwMDEwN0YKKzoxMDJFMzAwMDhGQTYwMDIwMTAwMDAwNkQzNEE1MDUwMDAwRjcxMDIxQkEKKzoxMDJFNDAwMDhGQTMwMDIwOEZBNDAwMjRBQzQzMDRDMEFDNDQwNEM0NkUKKzoxMDJFNTAwMDhGODMwMDU0OEY4MjAwNTQyNDcwMDNFODAyMDIxMDIzRjEKKzoxMDJFNjAwMDJDNDIwM0U5MTA0MDAwMUIwMDAwOTgyMTAwRTA4ODIxNUIKKzoxMDJFNzAwMDI2MzUwNEMwOEY0NDAxNzg4RjQ1MDE3QzAyMjAxODIxM0IKKzoxMDJFODAwMDI0MEEwMDA0QUZBQTAwMTBBRkIyMDAxNDhGNDgwMDBDNEYKKzoxMDJFOTAwMDAwMDAxMDIxMDJGNTMwMjFBRkE4MDAxODhGNDgwMTBDNjYKKzoxMDJFQTAwMDI0MDcwMDA4MDBBMzI4MjEwMEEzNDgyQjAwODIyMDIxMkEKKzoxMDJFQjAwMDAxMDBGODA5MDA4OTIwMjE1NDQwMDAwNjI0MTMwMDAxNzQKKzoxMDJFQzAwMDhGODIwMDU0MDIwMjEwMjMyQzQyMDNFOTE0NDBGRkU5RDAKKzoxMDJFRDAwMDAwMDAwMDAwMzI2MjAwRkY1NDQwMDAxN0FGNTIwMDE4OUIKKzoxMDJFRTAwMDhGNDIwMzc4MjQ0MjAwMDFBRjQyMDM3ODhGNDIwMzc4NzcKKzoxMDJFRjAwMDhGODIwMTIwOEZBQTAwMkNBRkEyMDAxMDhGODIwMTI0QTQKKzoxMDJGMDAwMDNDMDQwMDAxMjQ4NDYxMTgzQzA1MDAwOUFGQTIwMDE0QjAKKzoxMDJGMTAwMDhENDYwMDAwMTAwMDAwMzUzNEE1MDYwMDhGNDIwMzA4REUKKzoxMDJGMjAwMDI0MTMwMDAxMjQ0MjAwMDFBRjQyMDMwODhGNDIwMzA4MkEKKzoxMDJGMzAwMDEwMDAwMDFFMzI2MjAwRkY4RjgzMDA1NDhGODIwMDU0MDUKKzoxMDJGNDAwMDI0NzAwM0U4MDIwMjEwMjMyQzQyMDNFOTEwNDAwMDE2MEIKKzoxMDJGNTAwMDAwMDA5ODIxM0MxNTAwMjAyNDExMDAxMDhGNDIwMDBDMjUKKzoxMDJGNjAwMDhGNDQwMTYwOEY0NTAxNjQ4Rjg2MDEyMEFGQjEwMDEwNEUKKzoxMDJGNzAwMEFGQjIwMDE0MDA1NTEwMjVBRkEyMDAxODhGNDIwMTBDMEIKKzoxMDJGODAwMDI0MDcwMDA4MDA0MEY4MDkyNEM2MDAxQzE0NDBGRkUzOTEKKzoxMDJGOTAwMDAwMDAwMDAwOEY4MjAwNTQwMjAyMTAyMzJDNDIwM0U5M0IKKzoxMDJGQTAwMDE0NDBGRkVFMDAwMDAwMDAzMjYyMDBGRjE0NDAwMDExRTgKKzoxMDJGQjAwMDAwMDAwMDAwOEY0MjAzNzgyNDQyMDAwMUFGNDIwMzc4RjIKKzoxMDJGQzAwMDhGNDIwMzc4OEY4MjAxMjA4RkFBMDAyQ0FGQTIwMDEwQkQKKzoxMDJGRDAwMDhGODIwMTI0M0MwNDAwMDEyNDg0NjEyMDNDMDUwMDA5MDcKKzoxMDJGRTAwMEFGQTIwMDE0OEQ0NjAwMDAzNEE1MDcwMDBDMDAyQjNCNTcKKzoxMDJGRjAwMDAzQzAzODIxOEY0MjAyRUMyNDQyMDAwMUFGNDIwMkVDQjAKKzoxMDMwMDAwMDhGNDIwMkVDOEY0MjAwMDQzMDQyMDAwMTEwNDAwMDE4NTEKKzoxMDMwMTAwMDI0MDQwMDAxOEY0MjAyNTA4RjQzMDI1NDhGNDUwMUI0QjMKKzoxMDMwMjAwMDNDMDEwMDAxMTQ2NTAwMDZBMDI0NkNGMThGNDIwMjcwN0YKKzoxMDMwMzAwMDhGNDMwMjc0OEY0NDAxQjgxMDY0MDAyMTAwMDAwMDAwMjcKKzoxMDMwNDAwMDhGNDIwMjUwOEY0MzAyNTQzQzA0MDAwMTkwODQ2Q0YwODQKKzoxMDMwNTAwMDhGNDYwMjcwOEY0NzAyNzQzODg0MDAwMUFGNDMwMUI0NzkKKzoxMDMwNjAwMEFGNDcwMUI4M0MwMTAwMDExMDAwMDAyNUEwMjQ2Q0YwMUUKKzoxMDMwNzAwMDhGNDIwMEQ0M0MwMTAwMDFBMDIwNkNGMDI0NDMwMDAxRTkKKzoxMDMwODAwMDI4NDIwMDMzMTQ0MDAwMUVBRjQzMDBENDNDMDIwMDAxMkMKKzoxMDMwOTAwMDkwNDI2Q0YxQUY0MDAwRDQxMDAwMDAxNzM4NDIwMDAxOUMKKzoxMDMwQTAwMDhGNDIwMDA0MzA0MjAwMDExMDQwMDAwODAwMDAwMDAwODAKKzoxMDMwQjAwMDBDMDA1NjVBMDAwMDIwMjEzQzAxMDAwMUEwMjA2Q0YxQjgKKzoxMDMwQzAwMDNDMDEwMDAxMTAwMDAwMEVBMDIwNkNGMDhGNDIwMEQ0RTMKKzoxMDMwRDAwMDNDMDEwMDAxQTAyMDZDRjAyNDQzMDAwMTI4NDIwMUY1Q0UKKzoxMDMwRTAwMDE0NDAwMDA3QUY0MzAwRDQzQzAyMDAwMTkwNDI2Q0YxNTEKKzoxMDMwRjAwMEFGNDAwMEQ0MDA0MjEwMjYzQzAxMDAwMUEwMjI2Q0YxMzgKKzoxMDMxMDAwMDNDMDMwMDAxOEM2MzZEOTgyNDAyMDAwMjE0NjIwMDBDRTEKKzoxMDMxMTAwMDNDMDMwMDAyM0MwMzAwMDE5MDYzNkNGMTI0MDIwMDAxQjcKKzoxMDMxMjAwMDU0NjIwMDFGMDAwMDIwMjEzQzAyMDAwMTkwNDI2Q0YwMUMKKzoxMDMxMzAwMDE0NDMwMDFCMjQwNDAwMDUxMDAwMDAxOTI0MDQwMDA2OTkKKzoxMDMxNDAwMDNDMDIwMDAyOEM0MjhGRjQwMDQzMTAyNDEwNDAwMDBCMUMKKzoxMDMxNTAwMDI0MDIwMDAxM0MwMzAwMDE5MDYzNkNGMTU0NjIwMDEwRjIKKzoxMDMxNjAwMDAwMDAyMDIxM0MwMjAwMDE5MDQyNkNGMDE0NDMwMDBDNEUKKzoxMDMxNzAwMDI0MDQwMDAzMTAwMDAwMEEyNDA0MDAwNDNDMDMwMDAxOUUKKzoxMDMxODAwMDkwNjM2Q0YxMTQ2MjAwMDYwMDAwMjAyMTNDMDIwMDAxRjMKKzoxMDMxOTAwMDkwNDI2Q0YwMjQwNDAwMDE1MDQ0MDAwMTI0MDQwMDAyMTkKKzoxMDMxQTAwMDBDMDA1NjVBMDAwMDAwMDAyNDAyRkY3RjAyODJBMDI0NzcKKzoxMDMxQjAwMDhGQkYwMDQ4OEZCRTAwNDQ4RkI1MDA0MDhGQjMwMDNDRTYKKzoxMDMxQzAwMDhGQjIwMDM4OEZCMTAwMzQ4RkIwMDAzMDAzRTAwMDA4QjgKKzoxMDMxRDAwMDI3QkQwMDUwMDNFMDAwMDgwMDAwMDAwMDNDMDIwMDAxOTEKKzoxMDMxRTAwMDhDNDI2REE4MjdCREZGQjBBRkJGMDA0OEFGQkUwMDQ0MDIKKzoxMDMxRjAwMEFGQjUwMDQwQUZCMzAwM0NBRkIyMDAzOEFGQjEwMDM0NjAKKzoxMDMyMDAwMDEwNDAwMERFQUZCMDAwMzA4RjQyMDBEMDNDMDQwMDAxMUYKKzoxMDMyMTAwMDhDODQ2RDk4MjQ0MzAwMDEyODQyMDAwQkFGNDQwMEU4RTEKKzoxMDMyMjAwMDE0NDAwMEZFQUY0MzAwRDA4RjQyMDAwNDMwNDIwMDAyNDEKKzoxMDMyMzAwMDE0NDAwMDk1QUY0MDAwRDA4RjQyMDAwNDM0NDIwMDAyOTkKKzoxMDMyNDAwMEFGNDIwMDA0MjQwMjAwMDExNDgyMDAwMzNDMDIwNjAwODUKKzoxMDMyNTAwMDEwMDAwMDAyMzQ0MjMwMDAzNDQyMTAwMEFGQTIwMDIwQkYKKzoxMDMyNjAwMDAwMDAxODIxOEY1RTAwMTgyN0FBMDAyMDI0MDIwMEZGMEEKKzoxMDMyNzAwMDEzQzIwMDAyQUZBQTAwMkMyN0MzMDAwMThDMDIwMjI4NEYKKzoxMDMyODAwMDAwNjA5MDIxMTY0MjAwMEUwMDFFMzhDMDhGNDIwMzNDQTEKKzoxMDMyOTAwMDI0NDIwMDAxQUY0MjAzM0M4RjQyMDMzQzhDMDIwMjI4Q0YKKzoxMDMyQTAwMDNDMDQwMDAxMjQ4NDYxMEMzQzA1MDAwOUFGQTAwMDE0MUIKKzoxMDMyQjAwMEFGQTIwMDEwOEZBNjAwMjAxMDAwMDA2RDM0QTUwNTAwRkQKKzoxMDMyQzAwMDAwRjcxMDIxOEZBMzAwMjA4RkE0MDAyNEFDNDMwNEMwN0EKKzoxMDMyRDAwMEFDNDQwNEM0OEY4MzAwNTQ4RjgyMDA1NDI0NzAwM0U4RUMKKzoxMDMyRTAwMDAyMDIxMDIzMkM0MjAzRTkxMDQwMDAxQjAwMDA5ODIxMjkKKzoxMDMyRjAwMDAwRTA4ODIxMjYzNTA0QzA4RjQ0MDE3ODhGNDUwMTdDODkKKzoxMDMzMDAwMDAyMjAxODIxMjQwQTAwMDRBRkFBMDAxMEFGQjIwMDE0NTIKKzoxMDMzMTAwMDhGNDgwMDBDMDAwMDEwMjEwMkY1MzAyMUFGQTgwMDE4RTIKKzoxMDMzMjAwMDhGNDgwMTBDMjQwNzAwMDgwMEEzMjgyMTAwQTM0ODJCODQKKzoxMDMzMzAwMDAwODIyMDIxMDEwMEY4MDkwMDg5MjAyMTU0NDAwMDA2NjQKKzoxMDMzNDAwMDI0MTMwMDAxOEY4MjAwNTQwMjAyMTAyMzJDNDIwM0U5NEYKKzoxMDMzNTAwMDE0NDBGRkU5MDAwMDAwMDAzMjYyMDBGRjU0NDAwMDE3RjMKKzoxMDMzNjAwMEFGNTIwMDE4OEY0MjAzNzgyNDQyMDAwMUFGNDIwMzc4MjUKKzoxMDMzNzAwMDhGNDIwMzc4OEY4MjAxMjA4RkFBMDAyQ0FGQTIwMDEwMDkKKzoxMDMzODAwMDhGODIwMTI0M0MwNDAwMDEyNDg0NjExODNDMDUwMDA5NUIKKzoxMDMzOTAwMEFGQTIwMDE0OEQ0NjAwMDAxMDAwMDAzNTM0QTUwNjAwRDEKKzoxMDMzQTAwMDhGNDIwMzA4MjQxMzAwMDEyNDQyMDAwMUFGNDIwMzA4QTYKKzoxMDMzQjAwMDhGNDIwMzA4MTAwMDAwMUUzMjYyMDBGRjhGODMwMDU0MEEKKzoxMDMzQzAwMDhGODIwMDU0MjQ3MDAzRTgwMjAyMTAyMzJDNDIwM0U5ODgKKzoxMDMzRDAwMDEwNDAwMDE2MDAwMDk4MjEzQzE1MDAyMDI0MTEwMDEwMTgKKzoxMDMzRTAwMDhGNDIwMDBDOEY0NDAxNjA4RjQ1MDE2NDhGODYwMTIwNUQKKzoxMDMzRjAwMEFGQjEwMDEwQUZCMjAwMTQwMDU1MTAyNUFGQTIwMDE4RjUKKzoxMDM0MDAwMDhGNDIwMTBDMjQwNzAwMDgwMDQwRjgwOTI0QzYwMDFDNjQKKzoxMDM0MTAwMDE0NDBGRkUzMDAwMDAwMDA4RjgyMDA1NDAyMDIxMDIzREEKKzoxMDM0MjAwMDJDNDIwM0U5MTQ0MEZGRUUwMDAwMDAwMDMyNjIwMEZGNkUKKzoxMDM0MzAwMDE0NDAwMDExMDAwMDAwMDA4RjQyMDM3ODI0NDIwMDAxNzQKKzoxMDM0NDAwMEFGNDIwMzc4OEY0MjAzNzg4RjgyMDEyMDhGQUEwMDJDMkQKKzoxMDM0NTAwMEFGQTIwMDEwOEY4MjAxMjQzQzA0MDAwMTI0ODQ2MTIwNkIKKzoxMDM0NjAwMDNDMDUwMDA5QUZBMjAwMTQ4RDQ2MDAwMDM0QTUwNzAwRkEKKzoxMDM0NzAwMDBDMDAyQjNCMDNDMDM4MjE4RjQyMDJFQzI0NDIwMDAxOTgKKzoxMDM0ODAwMEFGNDIwMkVDOEY0MjAyRUM4RjQyMDAwNDMwNDIwMDAxNTYKKzoxMDM0OTAwMDEwNDAwMDMzM0MwMjA0MDAwMkMyMTAyNDEwNDAwMDE3MDgKKzoxMDM0QTAwMDAwMDAwMDAwOTM0MjA1QzA4RjQ0MDI1MDhGNDUwMjU0MzMKKzoxMDM0QjAwMDhGNDMwMUI0MzQ0MjAwMjAxNEEzMDAwNkEzNDIwNUMwODgKKzoxMDM0QzAwMDhGNDIwMjcwOEY0MzAyNzQ4RjQ0MDFCODEwNjQwMDA4NjkKKzoxMDM0RDAwMDAwMDAwMDAwOEY0MjAyNTA4RjQzMDI1NDkzNDQwNUMwMDUKKzoxMDM0RTAwMDhGNDYwMjcwOEY0NzAyNzQxMDAwMDAxNjM4ODQwMDQwMjcKKzoxMDM0RjAwMDkzNDIwNUMwMTAwMDAwNDgzMDQyMDBCRjkzNDIwNUMwMEYKKzoxMDM1MDAwMDhGNDQwMjUwOEY0NTAyNTQ4RjQzMDFCNDMwNDIwMEJGQjQKKzoxMDM1MTAwMDE0QTMwMDA2QTM0MjA1QzA4RjQyMDI3MDhGNDMwMjc0QjkKKzoxMDM1MjAwMDhGNDQwMUI4MTA2NDAwMEIwMDAwMDAwMDhGNDIwMjUwNkQKKzoxMDM1MzAwMDhGNDMwMjU0OTM0NDA1QzA4RjQ2MDI3MDhGNDcwMjc0MzQKKzoxMDM1NDAwMDM4ODQwMDIwQUY0MzAxQjRBRjQ3MDFCODEwMDAwMDMzMDYKKzoxMDM1NTAwMEEzNDQwNUMwOTM0MjA1QzAxMDAwMDAyRjM0NDIwMDIwNTAKKzoxMDM1NjAwMDkzNDIwNUMwOEY0MzAwRDQzNDQyMDAyMEEzNDIwNUMwREIKKzoxMDM1NzAwMDI0NjIwMDAxMTAwMDAwMjMyODYzMDAzMzhGNDIwMEU0MUUKKzoxMDM1ODAwMDhGNDMwMEUwMjQ0MjAwMDFBRjQyMDBFNDAwNDMxMDJBRDAKKzoxMDM1OTAwMDE0NDAwMDA2MjQwMzAwMDE4RjQyMDBFODE0NDMwMDAyOTcKKzoxMDM1QTAwMEFGNDAwMEU0MjQwMzAwMDRBRjQzMDBFODhGNDIwMDA0NkUKKzoxMDM1QjAwMDMwNDIwMDAxMTA0MDAwMEQzQzAyMDQwMDAyQzIxMDI0MDEKKzoxMDM1QzAwMDEwNDAwMDA3MDAwMDAwMDA5MzQyMDVDMDM0NDIwMDQwNTQKKzoxMDM1RDAwMEEzNDIwNUMwOTM0MjA1QzAxMDAwMDAwRjMwNDIwMERGMzcKKzoxMDM1RTAwMDkzNDIwNUMwMTAwMDAwMEMzNDQyMDA2MDkzNDIwNUMwQjUKKzoxMDM1RjAwMDhGNDMwMEQ0MzQ0MjAwMjBBMzQyMDVDMDI0NjIwMDAxNUUKKzoxMDM2MDAwMDI4NjMwMEZCMTQ2MDAwMDVBRjQyMDBENDkzNDIwNUMwNUMKKzoxMDM2MTAwMEFGNDAwMEQ0Mzg0MjAwNDBBMzQyMDVDMDkzNDIwNUMwRTkKKzoxMDM2MjAwMDhGNDMwMEU4MzA0MjAwN0ZBMzQyMDVDMDI0MDIwMDAxMUUKKzoxMDM2MzAwMDE0NjIwMDA1MDAwMDAwMDA5MzQ0MDVDMDAwMDQyMTAyNEMKKzoxMDM2NDAwMDEwMDAwMDAzMzQ4NDAwRjA5MzQ0MDVDMDM0ODQwMDBGNUMKKzoxMDM2NTAwMDBDMDA1NjQwMDAwMDAwMDAyNDAyRkY3RjAyODJBMDI0REMKKzoxMDM2NjAwMDhGQkYwMDQ4OEZCRTAwNDQ4RkI1MDA0MDhGQjMwMDNDMzEKKzoxMDM2NzAwMDhGQjIwMDM4OEZCMTAwMzQ4RkIwMDAzMDAzRTAwMDA4MDMKKzoxMDM2ODAwMDI3QkQwMDUwMDNFMDAwMDgwMDAwMDAwMDI3QkRGRkIwODgKKzoxMDM2OTAwMDI3NDQwMUMwMjZFMzAwMjgyNDY1MDQwMDAwNjUxMDJCQTAKKzoxMDM2QTAwMEFGQkYwMDQ4QUZCRTAwNDRBRkI1MDA0MEFGQjMwMDNDNzEKKzoxMDM2QjAwMEFGQjIwMDM4QUZCMTAwMzQxMDQwMDAwN0FGQjAwMDMwRjcKKzoxMDM2QzAwMDhDODIwMDAwQUM2MjAwMDAyNDYzMDAwNDAwNjUxMDJCQjMKKzoxMDM2RDAwMDE0NDBGRkZCMjQ4NDAwMDQ4QzAyMDA4MEFFRTIwMDQ0MEUKKzoxMDM2RTAwMDhDMDIwMEMwQUVFMjAwNDA4QzAyMDA4NEFFRTIwMDMwRUEKKzoxMDM2RjAwMDhDMDIwMDg0QUVFMjAyM0M4QzAyMDA4OEFFRTIwMjQwMDIKKzoxMDM3MDAwMDhDMDIwMDhDQUVFMjAyNDQ4QzAyMDA5MEFFRTIwMjQ4RDEKKzoxMDM3MTAwMDhDMDIwMDk0QUVFMjAyNEM4QzAyMDA5OEFFRTIwMjUwQTEKKzoxMDM3MjAwMDhDMDIwMDlDQUVFMjAyNTQ4QzAyMDBBMEFFRTIwMjU4NzEKKzoxMDM3MzAwMDhDMDIwMEE0QUVFMjAyNUM4QzAyMDBBOEFFRTIwMjYwNDEKKzoxMDM3NDAwMDhDMDIwMEFDQUVFMjAyNjQ4QzAyMDBCMEFFRTIwMjY4MTEKKzoxMDM3NTAwMDhDMDIwMEI0QUVFMjAyNkM4QzAyMDBCOEFFRTIwMjcwRTEKKzoxMDM3NjAwMDhDMDIwMEJDMjQwNDAwMDFBRUUyMDI3NEFFRTAwMDM0MUUKKzoxMDM3NzAwMDAwMDQxMDgwMDA1NzEwMjE4RUUzMDAzNDhDNDIwMjNDN0MKKzoxMDM3ODAwMDI0ODQwMDAxMDA2MjE4MjEyQzgyMDAwRkFFRTMwMDM0NzMKKzoxMDM3OTAwMDE0NDBGRkY4MDAwNDEwODA4QzAyMDBDQ0FFRTIwMDQ4MTgKKzoxMDM3QTAwMDhDMDIwMEQwQUVFMjAwNEM4QzAyMDBFMEFFRTIwMUY4RTgKKzoxMDM3QjAwMDhDMDIwMEU0QUVFMjAxRkM4QzAyMDBFOEFFRTIwMjAwMDIKKzoxMDM3QzAwMDhDMDIwMEVDQUVFMjAyMDQ4QzAyMDBGMEFFRTIwMjA4RDEKKzoxMDM3RDAwMDhFRTQwMEMwOEVFNTAwQzQ4QzAyMDBGQzAwNDUxMDJCNzYKKzoxMDM3RTAwMDEwNDAwMDBCMDAwMDAwMDA4RUUyMDBDMDhFRTMwMEM0MTkKKzoxMDM3RjAwMDI0MDQwMDAxMjQwNTAwMDAwMDY1MTgyMTAwNjUzMDJCMTkKKzoxMDM4MDAwMDAwNDQxMDIxMDA0NjEwMjFBRUUyMDBDMEFFRTMwMEM0MjcKKzoxMDM4MTAwMDhDMDIwMEZDOEVFNDAwQzA4RUU1MDBDNDI0MDhGRkZGOEIKKzoxMDM4MjAwMDI0MDkwMDAwMDA0MDE4MjEwMDAwMTAyMTAwODgyMDI0RjUKKzoxMDM4MzAwMDAwQTkyODI0MDA4MjIwMjUwMEEzMjgyNUFFRTQwMEMwOEEKKzoxMDM4NDAwMEFFRTUwMEM0OEVFNDAwRDA4RUU1MDBENDhDMDIwMEY0MTYKKzoxMDM4NTAwMDAwNDUxMDJCMTA0MDAwMEIwMDAwMDAwMDhFRTIwMEQwNEQKKzoxMDM4NjAwMDhFRTMwMEQ0MjQwNDAwMDEyNDA1MDAwMDAwNjUxODIxMjMKKzoxMDM4NzAwMDAwNjUzMDJCMDA0NDEwMjEwMDQ2MTAyMUFFRTIwMEQwM0MKKzoxMDM4ODAwMEFFRTMwMEQ0OEMwMjAwRjQ4RUU0MDBEMDhFRTUwMEQ0QzgKKzoxMDM4OTAwMDAwNDAxODIxMDAwMDEwMjEwMDg4MjAyNDAwQTkyODI0QkQKKzoxMDM4QTAwMDAwODIyMDI1MDBBMzI4MjVBRUU0MDBEMEFFRTUwMEQ0OTgKKzoxMDM4QjAwMDhFRTQwMEM4OEVFNTAwQ0M4QzAyMDBGODAwNDUxMDJCODkKKzoxMDM4QzAwMDEwNDAwMDBCMDAwMDAwMDA4RUUyMDBDODhFRTMwMENDMjgKKzoxMDM4RDAwMDI0MDQwMDAxMjQwNTAwMDAwMDY1MTgyMTAwNjUzMDJCMzgKKzoxMDM4RTAwMDAwNDQxMDIxMDA0NjEwMjFBRUUyMDBDOEFFRTMwMENDMzcKKzoxMDM4RjAwMDhDMDIwMEY4OEVFNDAwQzg4RUU1MDBDQzAwNDAxODIxNTAKKzoxMDM5MDAwMDAwMDAxMDIxMDA4ODIwMjQwMEE5MjgyNDAwODIyMDI1RkUKKzoxMDM5MTAwMDAwQTMyODI1MjQwMjAwMDhBRUU0MDBDOEFFRTUwMENDRDAKKzoxMDM5MjAwMEFGQTIwMDEwQUZBMDAwMTQ4RjQyMDAwQzhDMDQwMjA4NUMKKzoxMDM5MzAwMDhDMDUwMjBDQUZBMjAwMTg4RjQyMDEwQzI2RTYwMDI4NkQKKzoxMDM5NDAwMDAwNDBGODA5MjQwNzA0MDAxMDQwMDBGMDNDMDIwNDAwODUKKzoxMDM5NTAwMEFGQTIwMDIwOTM0MjA1QzYxMDQwMDA4OTAwMDAxODIxNDQKKzoxMDM5NjAwMDhGNUUwMDE4MjdBQTAwMjAyNDAyMDBGRjEzQzIwMDAyNjUKKzoxMDM5NzAwMEFGQUEwMDJDMjdDMzAwMDE4QzAyMDIyODAwNjA5MDIxMEUKKzoxMDM5ODAwMDE2NDIwMDBFMDAxRTM4QzA4RjQyMDMzQzI0NDIwMDAxNDQKKzoxMDM5OTAwMEFGNDIwMzNDOEY0MjAzM0M4QzAyMDIyODNDMDQwMDAxRUUKKzoxMDM5QTAwMDI0ODQ2MTBDM0MwNTAwMDlBRkEwMDAxNEFGQTIwMDEwRjQKKzoxMDM5QjAwMDhGQTYwMDIwMTAwMDAwNkIzNEE1MDUwMDAwRjcxMDIxMzEKKzoxMDM5QzAwMDhGQTMwMDIwOEZBNDAwMjRBQzQzMDRDMEFDNDQwNEM0RTMKKzoxMDM5RDAwMDhGODMwMDU0OEY4MjAwNTQyNDcwMDNFODAyMDIxMDIzNjYKKzoxMDM5RTAwMDJDNDIwM0U5MTA0MDAwMUIwMDAwOTgyMTAwRTA4ODIxRDAKKzoxMDM5RjAwMDI2MzUwNEMwOEY0NDAxNzg4RjQ1MDE3QzAyMjAxODIxQjAKKzoxMDNBMDAwMDI0MEEwMDA0QUZBQTAwMTBBRkIyMDAxNDhGNDgwMDBDQzMKKzoxMDNBMTAwMDAwMDAxMDIxMDJGNTMwMjFBRkE4MDAxODhGNDgwMTBDREEKKzoxMDNBMjAwMDI0MDcwMDA4MDBBMzI4MjEwMEEzNDgyQjAwODIyMDIxOUUKKzoxMDNBMzAwMDAxMDBGODA5MDA4OTIwMjE1NDQwMDAwNjI0MTMwMDAxRTgKKzoxMDNBNDAwMDhGODIwMDU0MDIwMjEwMjMyQzQyMDNFOTE0NDBGRkU5NDQKKzoxMDNBNTAwMDAwMDAwMDAwMzI2MjAwRkY1NDQwMDAxN0FGNTIwMDE4MEYKKzoxMDNBNjAwMDhGNDIwMzc4MjQ0MjAwMDFBRjQyMDM3ODhGNDIwMzc4RUIKKzoxMDNBNzAwMDhGODIwMTIwOEZBQTAwMkNBRkEyMDAxMDhGODIwMTI0MTgKKzoxMDNBODAwMDNDMDQwMDAxMjQ4NDYxMTgzQzA1MDAwOUFGQTIwMDE0MjUKKzoxMDNBOTAwMDhENDYwMDAwMTAwMDAwMzMzNEE1MDYwMDhGNDIwMzA4NTUKKzoxMDNBQTAwMDI0MTMwMDAxMjQ0MjAwMDFBRjQyMDMwODhGNDIwMzA4OUYKKzoxMDNBQjAwMDEwMDAwMDFDMzI2MjAwRkY4RjgzMDA1NDhGODIwMDU0N0MKKzoxMDNBQzAwMDI0NzAwM0U4MDIwMjEwMjMyQzQyMDNFOTEwNDAwMDE0ODIKKzoxMDNBRDAwMDAwMDA5ODIxMjQxMTAwMTA4RjQyMDAwQzhGNDQwMTYwRDcKKzoxMDNBRTAwMDhGNDUwMTY0OEY4NjAxMjBBRkIxMDAxMEFGQjIwMDE0ODIKKzoxMDNBRjAwMEFGQTIwMDE4OEY0MjAxMEMyNDA3MDAwODAwNDBGODA5MEIKKzoxMDNCMDAwMDI0QzYwMDFDMTQ0MEZGRTUwMDAwMDAwMDhGODIwMDU0MTIKKzoxMDNCMTAwMDAyMDIxMDIzMkM0MjAzRTkxNDQwRkZFRjAwMDAwMDAwRDIKKzoxMDNCMjAwMDMyNjIwMEZGNTQ0MDAwMTIyNDAyMDAwMThGNDIwMzc4RTkKKzoxMDNCMzAwMDI0NDIwMDAxQUY0MjAzNzg4RjQyMDM3ODhGODIwMTIwMzQKKzoxMDNCNDAwMDhGQUEwMDJDQUZBMjAwMTA4RjgyMDEyNDNDMDQwMDAxMzgKKzoxMDNCNTAwMDI0ODQ2MTIwM0MwNTAwMDlBRkEyMDAxNDhENDYwMDAwQkEKKzoxMDNCNjAwMDM0QTUwNzAwMEMwMDJCM0IwM0MwMzgyMTAwMDAxMDIxQjYKKzoxMDNCNzAwMDE0NDAwMDVCMjQwMjAwMDExMDAwMDA2NTAwMDAwMDAwRkEKKzoxMDNCODAwMDhGNTEwMDE4MjQwMjAwRkYxMjIyMDAwMjAwMDA4MDIxNDEKKzoxMDNCOTAwMDI2MzAwMDAxOEMwMjAyMjgxNjAyMDAwRTAwMTEzMEMwRUYKKzoxMDNCQTAwMDhGNDIwMzNDMjQ0MjAwMDFBRjQyMDMzQzhGNDIwMzNDNUUKKzoxMDNCQjAwMDhDMDIwMjI4M0MwNDAwMDEyNDg0NjBGNDNDMDUwMDA5QzYKKzoxMDNCQzAwMEFGQTAwMDE0QUZBMjAwMTA4RkE2MDAyMDEwMDAwMDNGOEQKKzoxMDNCRDAwMDM0QTUwMTAwMDBENzEwMjE4RkEzMDAyMDhGQTQwMDI0NUEKKzoxMDNCRTAwMEFDNDMwNEMwQUM0NDA0QzQwMEMwMTgyMThGNDQwMTc4MjUKKzoxMDNCRjAwMDhGNDUwMTdDMDAwMDEwMjEyNDA3MDAwNEFGQTcwMDEwQUUKKzoxMDNDMDAwMEFGQjAwMDE0OEY0ODAwMEMyNEM2MDRDMDAyRTYzMDIxNzcKKzoxMDNDMTAwMEFGQTgwMDE4OEY0ODAxMEMyNDA3MDAwODAwQTMyODIxMzIKKzoxMDNDMjAwMDAwQTM0ODJCMDA4MjIwMjEwMTAwRjgwOTAwODkyMDIxRUYKKzoxMDNDMzAwMDE0NDAwMDBCMjQwNzAwMDg4RjgyMDEyMEFGQTIwMDEwNUYKKzoxMDNDNDAwMDhGODIwMTI0M0MwNDAwMDEyNDg0NjBGQzNDMDUwMDA5QUYKKzoxMDNDNTAwMEFGQTIwMDE0OEZBNjAwMjAxMDAwMDAxQzM0QTUwMjAwQTMKKzoxMDNDNjAwMDhGNDQwMTYwOEY0NTAxNjQ4RjQzMDAwQ0FGNTAwMDE4RjIKKzoxMDNDNzAwMDhGODYwMTIwMjQwMjAwMTBBRkEyMDAxMEFGQjAwMDE0MDQKKzoxMDNDODAwMEFGQTMwMDE4OEY0MjAxMEMwMDQwRjgwOTI0QzYwMDFDQTUKKzoxMDNDOTAwMDU0NDAwMDExMjQwMjAwMDE4RjQyMDM0MDI0NDIwMDAxREQKKzoxMDNDQTAwMEFGNDIwMzQwOEY0MjAzNDA4RjgyMDEyMEFGQTIwMDEwMzkKKzoxMDNDQjAwMDhGODIwMTI0M0MwNDAwMDEyNDg0NjEwNDNDMDUwMDA5MzYKKzoxMDNDQzAwMEFGQTIwMDE0OEZBNjAwMjAzNEE1MDMwMDBDMDAyQjNCRUMKKzoxMDNDRDAwMDAyMjAzODIxMDAwMDEwMjExMDQwMDAwRDI0MDIwMDAxQjQKKzoxMDNDRTAwMDhGNDIwMkU4QTM0MDA1QzZBRjQwMDFCMDI0NDIwMDAxNjQKKzoxMDNDRjAwMEFGNDIwMkU4OEY0MjAyRTg4RUUyMDE1MDI0NDIwMDAxMDYKKzoxMDNEMDAwMEFFRTIwMTUwMTAwMDAwMDM4RUUyMDE1MDI0MDIwMDAxRDcKKzoxMDNEMTAwMEEzNDIwNUM2OEZCRjAwNDg4RkJFMDA0NDhGQjUwMDQwNDgKKzoxMDNEMjAwMDhGQjMwMDNDOEZCMjAwMzg4RkIxMDAzNDhGQjAwMDMwQjkKKzoxMDNEMzAwMDAzRTAwMDA4MjdCRDAwNTAyN0JERkZEOEFGQkYwMDIwMUIKKzoxMDNENDAwMDhGODIwMEIwMzA0MjAwMDQxMDQwMDA2ODAwMDAwMDAwODQKKzoxMDNENTAwMDhGNDMwMTI4OEY4MjAxMDQxNDYyMDAwNTAwMDAwMDAwRDcKKzoxMDNENjAwMDhGNDMwMTMwOEY4MjAwQjQxMDYyMDAwNjAwMDAwMDAwMTMKKzoxMDNENzAwMDhGODIwMTA0QUY0MjAxMjg4RjgyMDBCNDEwMDAwMDVCRTMKKzoxMDNEODAwMEFGNDIwMTMwOEY4MjAwQjAzQzAzMDA4MDAwNDMxMDI0MUEKKzoxMDNEOTAwMDEwNDAwMDBEMDAwMDAwMDA4RjgyMDExQzM0NDIwMDAyMjAKKzoxMDNEQTAwMEFGODIwMTFDOEY4MjAwQjAyNDAzRkZGQjAwNDMxMDI0NkMKKzoxMDNEQjAwMEFGODIwMEIwOEY4MjAxMUMyNDAzRkZGRDAwNDMxMDI0NUEKKzoxMDNEQzAwMDEwMDAwMDRBQUY4MjAxMUM4RjQzMDEyODhGODIwMTA0M0EKKzoxMDNERDAwMDE0NjIwMDA1MDAwMDAwMDA4RjQzMDEzMDhGODIwMEI0QTAKKzoxMDNERTAwMDEwNjIwMDEwMDAwMDAwMDA4RjgyMDEwNEFGNDIwMTI4MjEKKzoxMDNERjAwMDhGODIwMEI0OEY0MzAxMjhBRjQyMDEzMEFGQTMwMDEwN0YKKzoxMDNFMDAwMDhGNDIwMTMwM0MwNDAwMDEyNDg0NjE0NEFGQTIwMDE0QkQKKzoxMDNFMTAwMDhGODYwMTFDOEY4NzAwQjAzQzA1MDAwNTEwMDAwMDMxMjMKKzoxMDNFMjAwMDM0QTUwOTAwOEY0MjAxMjhBRkEyMDAxMDhGNDIwMTMwNTMKKzoxMDNFMzAwMDNDMDQwMDAxMjQ4NDYxNTBBRkEyMDAxNDhGODYwMTFDNTEKKzoxMDNFNDAwMDhGODcwMEIwM0MwNTAwMDUwQzAwMkIzQjM0QTUxMDAwMEIKKzoxMDNFNTAwMDhGODIwMTFDMzQ0MjAwMDJBRjgyMDExQzhGODMwMTA0NTcKKzoxMDNFNjAwMDhGODIwMEIwMzQ0MjAwMDFBRjgyMDBCMDI0MDIwMDA4MEIKKzoxMDNFNzAwMEFGODMwMTA0QUZBMjAwMTBBRkEwMDAxNDhGNDIwMDBDNkEKKzoxMDNFODAwMDhDMDQwMjA4OEMwNTAyMENBRkEyMDAxODhGNDIwMTBDQjIKKzoxMDNFOTAwMDI2RTYwMDI4MDA0MEY4MDkyNDA3MDQwMDhGODIwMTFDNTAKKzoxMDNFQTAwMDI0MDNGRkZEMDA0MzEwMjRBRjgyMDExQzhFRTIwMURDREQKKzoxMDNFQjAwMDI0NDIwMDAxQUVFMjAxREM4RUUyMDFEQzhGNDIwMTI4RTcKKzoxMDNFQzAwMEFGQTIwMDEwOEY0MjAxMzAzQzA0MDAwMTI0ODQ2MTVDRTkKKzoxMDNFRDAwMEFGQTIwMDE0OEY4NjAxMUM4Rjg3MDBCMDNDMDUwMDA1M0YKKzoxMDNFRTAwMDM0QTUxMTAwMEMwMDJCM0IwMDAwMDAwMDhGODIwMEEwQzUKKzoxMDNFRjAwMDMwNDIwMDA0MTA0MDAwNjkwMDAwMDAwMDhGNDMwMTJDOTQKKzoxMDNGMDAwMDhGODIwMTI0MTQ2MjAwMDUwMDAwMDAwMDhGNDMwMTM0RjkKKzoxMDNGMTAwMDhGODIwMEE0MTA2MjAwMDYwMDAwMDAwMDhGODIwMTI0M0UKKzoxMDNGMjAwMEFGNDIwMTJDOEY4MjAwQTQxMDAwMDA1Q0FGNDIwMTM0MkMKKzoxMDNGMzAwMDhGODIwMEEwM0MwMzAwODAwMDQzMTAyNDEwNDAwMDBEM0QKKzoxMDNGNDAwMDAwMDAwMDAwOEY4MjAxMUMzNDQyMDAwMkFGODIwMTFDN0QKKzoxMDNGNTAwMDhGODIwMEEwMjQwM0ZGRkIwMDQzMTAyNEFGODIwMEEwNDcKKzoxMDNGNjAwMDhGODIwMTFDMjQwM0ZGRkQwMDQzMTAyNDEwMDAwMDRCMkUKKzoxMDNGNzAwMEFGODIwMTFDOEY0MzAxMkM4RjgyMDEyNDE0NjIwMDA1NDMKKzoxMDNGODAwMDAwMDAwMDAwOEY0MzAxMzQ4RjgyMDBBNDEwNjIwMDEwRjMKKzoxMDNGOTAwMDAwMDAwMDAwOEY4MjAxMjRBRjQyMDEyQzhGODIwMEE0MTgKKzoxMDNGQTAwMDhGNDMwMTJDQUY0MjAxMzRBRkEzMDAxMDhGNDIwMTM0ODQKKzoxMDNGQjAwMDNDMDQwMDAxMjQ4NDYxNjhBRkEyMDAxNDhGODYwMTFDQjgKKzoxMDNGQzAwMDhGODcwMEEwM0MwNTAwMDUxMDAwMDAzMjM0QTUxMjAwQzgKKzoxMDNGRDAwMDhGNDIwMTJDQUZBMjAwMTA4RjQyMDEzNDNDMDQwMDAxM0IKKzoxMDNGRTAwMDI0ODQ2MTc0QUZBMjAwMTQ4Rjg2MDExQzhGODcwMEEwMDcKKzoxMDNGRjAwMDNDMDUwMDA1MEMwMDJCM0IzNEE1MTMwMDhGODIwMTFDRUYKKzoxMDQwMDAwMDM0NDIwMDAyQUY4MjAxMUM4RjgzMDEyNDhGODIwMEEwMDIKKzoxMDQwMTAwMDM0NDIwMDAxQUY4MjAwQTAyNDAyMDA4MEFGODMwMTI0NUIKKzoxMDQwMjAwMEFGQTIwMDEwQUZBMDAwMTQ4RjQyMDAxNDhDMDQwMjA4NEQKKzoxMDQwMzAwMDhDMDUwMjBDQUZBMjAwMTg4RjQyMDEwODNDMDYwMDAxNUIKKzoxMDQwNDAwMDI0QzY2RUQ4MDA0MEY4MDkyNDA3MDAwNDhGODIwMTFDQTIKKzoxMDQwNTAwMDI0MDNGRkZEMDA0MzEwMjRBRjgyMDExQzhFRTIwMURDMkIKKzoxMDQwNjAwMDI0NDIwMDAxQUVFMjAxREM4RUUyMDFEQzhGNDIwMTJDMzEKKzoxMDQwNzAwMEFGQTIwMDEwOEY0MjAxMzQzQzA0MDAwMTI0ODQ2MTgwMEYKKzoxMDQwODAwMEFGQTIwMDE0OEY4NjAxMUM4Rjg3MDBBMDNDMDUwMDA1OUQKKzoxMDQwOTAwMDM0QTUxNDAwMEMwMDJCM0IwMDAwMDAwMDhGQkYwMDIwNTMKKzoxMDQwQTAwMDAzRTAwMDA4MjdCRDAwMjgzQzA4MTAwMDI0MDcwMDAxOTkKKzoxMDQwQjAwMDNDMDYwMDgwM0MwNTAxMDA4RjgyMDA3MDAwNDgxMDI0RkYKKzoxMDQwQzAwMDEwNDBGRkZEMDAwMDAwMDA4RjgyMDA1NDI0NDIwMDA1RDQKKzoxMDQwRDAwMEFGODIwMDc4OEMwNDAyMzQxMDgwMDAxNjAwMDAxODIxOTIKKzoxMDQwRTAwMDNDMDIwMDAxMDA1NzEwMjE4QzQyNDBFODI0NDIwMDA1QTgKKzoxMDQwRjAwMDNDMDEwMDAxMDAzNzA4MjFBQzIyNDBFODNDMDIwMDAxRUQKKzoxMDQxMDAwMDAwNTcxMDIxOEM0MjQwRTgwMDQ0MTAyQjE0NDAwMDA5NTUKKzoxMDQxMTAwMDAwMDAwMDAwM0MwMzAwODAzQzAxMDAwMTAwMzcwODIxNDIKKzoxMDQxMjAwMEFDMjA0MEU4M0MwMTAwMDEwMDM3MDgyMTEwMDAwMDBCRTIKKzoxMDQxMzAwMEEwMjc0MEYwM0MwMjAwMDEwMDU3MTAyMTkwNDI0MEYwQkYKKzoxMDQxNDAwMDU0NDAwMDA2MDA2NjE4MjUzQzAyMDAwMTAwNTcxMDIxNkIKKzoxMDQxNTAwMDkwNDI0MEYxNTQ0MDAwMDEwMDY2MTgyNThDMDQwMjMwNjIKKzoxMDQxNjAwMDEwODAwMDEzMDAwMDAwMDAzQzAyMDAwMTAwNTcxMDIxRTUKKzoxMDQxNzAwMDhDNDI0MEVDMjQ0MjAwMDUzQzAxMDAwMTAwMzcwODIxM0MKKzoxMDQxODAwMEFDMjI0MEVDM0MwMjAwMDEwMDU3MTAyMThDNDI0MEVDNzQKKzoxMDQxOTAwMDAwNDQxMDJCMTQ0MDAwMDYwMDAwMDAwMDNDMDEwMDAxMDgKKzoxMDQxQTAwMDAwMzcwODIxQUMyMDQwRUMxMDAwMDAwNjAwNjUxODI1RkYKKzoxMDQxQjAwMDNDMDIwMDAxMDA1NzEwMjE5MDQyNDBGMjU0NDAwMDAxOUYKKzoxMDQxQzAwMDAwNjUxODI1MTA2MEZGQkMwMDAwMDAwMDhGNDIwMDAwNTEKKzoxMDQxRDAwMDEwNDAwMDA3MDAwMDAwMDBBRjgwMDA0QzhGODIwMDRDQjAKKzoxMDQxRTAwMDEwNDBGRkZEMDAwMDAwMDAxMDAwMDAwNTAwMDAwMDAwNkUKKzoxMDQxRjAwMEFGODAwMDQ4OEY4MjAwNDgxMDQwRkZGRDAwMDAwMDAwQTMKKzoxMDQyMDAwMDhGODIwMDYwMDA0MzEwMjVBRjgyMDA2MDhGNDIwMDAwNjMKKzoxMDQyMTAwMDEwNDAwMDAzMDAwMDAwMDAxMDAwRkZBN0FGODAwMDRDMUEKKzoxMDQyMjAwMDEwMDBGRkE1QUY4MDAwNDgwM0UwMDAwODAwMDAwMDAwNzgKKzoxMDQyMzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDI3QkRGRkUwQkIKKzoxMDQyNDAwMEFGQkYwMDE4OEY4NjAwNjQzMEMyMDAwNDEwNDAwMDI1MDQKKzoxMDQyNTAwMDI0MDQwMDA0OEMwMjAxMTRBRjQyMDAyMEFGODQwMDY0RTcKKzoxMDQyNjAwMDhGNDIwMkZDMjQ0MjAwMDFBRjQyMDJGQzhGNDIwMkZDNUEKKzoxMDQyNzAwMDhGODIwMDY0MzA0MjAwMDQxNDQwMDAwNTAwMDAwMDAwRkEKKzoxMDQyODAwMDhDMDMwMTE0OEY0MjAwMjAxNDYyRkZGMjAwMDAwMDAwMzIKKzoxMDQyOTAwMDhGNDIwMDAwMTA0MDAwMDc4RjQzMDAzQ0FGODAwMDRDNkQKKzoxMDQyQTAwMDhGODIwMDRDMTA0MEZGRkQwMDAwMDAwMDEwMDAwMDA1NTAKKzoxMDQyQjAwMDAwMDAwMDAwQUY4MDAwNDg4RjgyMDA0ODEwNDBGRkZERTIKKzoxMDQyQzAwMDAwMDAwMDAwOEY4MjAwNjAwMDQzMTAyNUFGODIwMDYwNzQKKzoxMDQyRDAwMDhGNDIwMDAwMTA0MDAwNzMwMDAwMDAwMDEwMDAwMDZGQ0IKKzoxMDQyRTAwMDAwMDAwMDAwMzBDMjAwMDgxMDQwMDAyMDI0MDQwMDA4MzQKKzoxMDQyRjAwMDhDMDIwMTFDQUY0MjAwNDhBRjg0MDA2NDhGNDIwMkE4QzgKKzoxMDQzMDAwMDI0NDIwMDAxQUY0MjAyQTg4RjQyMDJBODhGODIwMDY0QkIKKzoxMDQzMTAwMDMwNDIwMDA4MTQ0MDAwMDUwMDAwMDAwMDhDMDMwMTFDMUUKKzoxMDQzMjAwMDhGNDIwMDQ4MTQ2MkZGRjIwMDAwMDAwMDhGNDIwMDAwM0MKKzoxMDQzMzAwMDEwNDAwMDA3MDAwMDAwMDBBRjgwMDA0QzhGODIwMDRDNEUKKzoxMDQzNDAwMDEwNDBGRkZEMDAwMDAwMDAxMDAwMDAwNTAwMDAwMDAwMEMKKzoxMDQzNTAwMEFGODAwMDQ4OEY4MjAwNDgxMDQwRkZGRDAwMDAwMDAwNDEKKzoxMDQzNjAwMDhGODIwMDYwMTAwMEZGRDkzNDQyMDIwMDMwQzIwMDIwNkEKKzoxMDQzNzAwMDEwNDAwMDIzMjQwNDAwMjA4QzAyMDEyQ0FGNDIwMDY4NkUKKzoxMDQzODAwMEFGODQwMDY0OEY0MjAyRDgyNDQyMDAwMUFGNDIwMkQ4QjkKKzoxMDQzOTAwMDhGNDIwMkQ4OEY4MjAwNjQzMDQyMDAyMDE0NDAwMDA1MTIKKzoxMDQzQTAwMDMyQzI0MDAwOEMwMzAxMkM4RjQyMDA2ODE0NjJGRkYyN0QKKzoxMDQzQjAwMDMyQzI0MDAwMTQ0MDAwMDIzQzAyMDAwMTAyQzJCMDI1OUIKKzoxMDQzQzAwMDhGNDIwMDAwMTA0MDAwMDcwMDAwMDAwMEFGODAwMDRDNEEKKzoxMDQzRDAwMDhGODIwMDRDMTA0MEZGRkQwMDAwMDAwMDEwMDAwMDA1MUYKKzoxMDQzRTAwMDAwMDAwMDAwQUY4MDAwNDg4RjgyMDA0ODEwNDBGRkZEQjEKKzoxMDQzRjAwMDAwMDAwMDAwOEY4MjAwNjAxMDAwRkZCNDM0NDIwODAwMEIKKzoxMDQ0MDAwMDMwQzIwMDEwMTA0MDAwMjkyNDA0MDAxMDhDMDIwMTI0NDYKKzoxMDQ0MTAwMEFGNDIwMDU4QUY4NDAwNjQ4RjQyMDJENDI0NDIwMDAxQUUKKzoxMDQ0MjAwMEFGNDIwMkQ0OEY0MjAyRDQ4RjgyMDA2NDMwNDIwMDEwMjcKKzoxMDQ0MzAwMDE0NDAwMDA1MzJDMjIwMDA4QzAzMDEyNDhGNDIwMDU4MzIKKzoxMDQ0NDAwMDE0NjJGRkYyMzJDMjIwMDA1MDQwMDAwMTM2RDY4MDAwRDQKKzoxMDQ0NTAwMDhGNDIwMDAwMTA0MDAwMDcwMDAwMDAwMEFGODAwMDRDQjkKKzoxMDQ0NjAwMDhGODIwMDRDMTA0MEZGRkQwMDAwMDAwMDEwMDAwMDA1OEUKKzoxMDQ0NzAwMDAwMDAwMDAwQUY4MDAwNDg4RjgyMDA0ODEwNDBGRkZEMjAKKzoxMDQ0ODAwMDAwMDAwMDAwOEY4MjAwNjAzNDQyMDEwMEFGODIwMDYwQjMKKzoxMDQ0OTAwMDhGNDIwMDAwMTA0MDAwMDMwMDAwMDAwMDEwMDAwMDZDN0MKKzoxMDQ0QTAwMEFGODAwMDRDMTAwMDAwNkFBRjgwMDA0ODMwQzIwMDAxQUQKKzoxMDQ0QjAwMDEwNDAwMDA0MjQwMjAwMDFBRjgyMDA2NDEwMDAwMDY0NzgKKzoxMDQ0QzAwMDAwMDAwMDAwMzBDMjAwMDIxNDQwMDAwQjNDMDUwMDAzNTUKKzoxMDQ0RDAwMDNDMDQwMDAxMjQ4NDYyNDQzNEE1MDUwMDAwMDAzODIxMTYKKzoxMDQ0RTAwMEFGQTAwMDEwMEMwMDJCM0JBRkEwMDAxNDI0MDJGRkMwQjMKKzoxMDQ0RjAwMDEwMDAwMDU3QUY4MjAwNjQ4QzA1MDIyQzhDMDIwMTBDNjYKKzoxMDQ1MDAwMDEwQTIwMDQ4MDAwNTEwODA4QzQ2MDMwMDI0QTIwMDAxODAKKzoxMDQ1MTAwMDMwNDUwMDNGMjQwMjAwMDNBQzA1MDIyQzAwMDYxRTAyQjkKKzoxMDQ1MjAwMDEwNjIwMDA1MjQwMjAwMTAxMDYyMDAxRDMwQzIwRkZGNEYKKzoxMDQ1MzAwMDEwMDAwMDM5MDAwMDAwMDA4RjQzMDJBODhGNDQwMDAwRTMKKzoxMDQ1NDAwMDMwQzIwRkZGQUY0MjAwNDgyNDYzMDAwMUFGNDMwMkE4MEUKKzoxMDQ1NTAwMDEwODAwMDA3OEY0MjAyQThBRjgwMDA0QzhGODIwMDRDNzEKKzoxMDQ1NjAwMDEwNDBGRkZEMDAwMDAwMDAxMDAwMDAwNTAwMDAwMDAwRUEKKzoxMDQ1NzAwMEFGODAwMDQ4OEY4MjAwNDgxMDQwRkZGRDAwMDAwMDAwMUYKKzoxMDQ1ODAwMDhGODIwMDYwMzQ0MjAyMDBBRjgyMDA2MDhGNDIwMDAwRTAKKzoxMDQ1OTAwMDEwNDAwMDFGMDAwMDAwMDAxMDAwMDAxQjAwMDAwMDAwODEKKzoxMDQ1QTAwMEFGNDIwMDU4MzJDMjIwMDA1MDQwMDAwMTM2RDY4MDAwOTEKKzoxMDQ1QjAwMDhGNDIwMkQ0OEY0MzAwMDAyNDQyMDAwMUFGNDIwMkQ0NTQKKzoxMDQ1QzAwMDEwNjAwMDA3OEY0MjAyRDRBRjgwMDA0QzhGODIwMDRDRjUKKzoxMDQ1RDAwMDEwNDBGRkZEMDAwMDAwMDAxMDAwMDAwNTAwMDAwMDAwN0EKKzoxMDQ1RTAwMEFGODAwMDQ4OEY4MjAwNDgxMDQwRkZGRDAwMDAwMDAwQUYKKzoxMDQ1RjAwMDhGODIwMDYwMzQ0MjAxMDBBRjgyMDA2MDhGNDIwMDAwNzEKKzoxMDQ2MDAwMDEwNDAwMDAzMDAwMDAwMDAxMDAwMDAwNkFGODAwMDRDQzYKKzoxMDQ2MTAwMDEwMDAwMDA0QUY4MDAwNDgwQzAwMjE5NjAwQzAyMDIxNEIKKzoxMDQ2MjAwMDAwNDAyODIxOEMwMjAxMEMxNEEyMDAwMjI0MDIwMDAyODYKKzoxMDQ2MzAwMEFGODIwMDY0OEY4MjAwNjQzMDQyMDAwMjE0NDAwMDA0QTQKKzoxMDQ2NDAwMDAwMDAwMDAwOEMwMjAxMEMxNEEyRkZBQzAwMDAwMDAwNkUKKzoxMDQ2NTAwMDhGQkYwMDE4MDNFMDAwMDgyN0JEMDAyMDAzRTAwMDA4MUEKKzoxMDQ2NjAwMDAwMDAwMDAwMjdCREZGQTBBRkIwMDA0MDAwODA4MDIxMDcKKzoxMDQ2NzAwMDAwMTAxNjAyMjQ0MkZGRkYzMDQzMDBGRjJDNjIwMDEzOUIKKzoxMDQ2ODAwMEFGQkYwMDU4QUZCRTAwNTRBRkI1MDA1MEFGQjMwMDRDNDEKKzoxMDQ2OTAwMEFGQjIwMDQ4QUZCMTAwNDQxMDQwMDFGM0FGQTUwMDM0MDEKKzoxMDQ2QTAwMDAwMDMxMDgwM0MwMTAwMDEwMDIyMDgyMThDMjI2Mjg4NTYKKzoxMDQ2QjAwMDAwNDAwMDA4MDAwMDAwMDAwMDEwMTMwMjMwNDQwRkZGMEIKKzoxMDQ2QzAwMDI0MDIwMDAxMTA4MjAwMDUyNDAyMDAwMjEwODIwMDBDNjYKKzoxMDQ2RDAwMDI0MDJGRkZFMTAwMDAwMjQzQzA1MDAwMzhGNDMwMDA0NjkKKzoxMDQ2RTAwMDNDMDIwMDAxOEM0MjZGMDRBRjQ0MDIwMEFGNDQwMjA0NUMKKzoxMDQ2RjAwMDNDMDQwMDAxOEM4NDZFODAxMDAwMDAwOTM0NjMwMDAxQ0EKKzoxMDQ3MDAwMDhGNDMwMDA0QUY0NDAyMDBBRjQ0MDIwNDNDMDQwMDAxQTQKKzoxMDQ3MTAwMDhDODQ2RTgwMDA2MjE4MjQzQzAyMDAwMTI0NDJDQTI4NjYKKzoxMDQ3MjAwMDAwMDIxMTAwMDAwMjExODJBRjQzMDAwNDNDMDMwODAwQTQKKzoxMDQ3MzAwMDAwNDMxMDI1QUM4MjAwMzg4Rjg0MDA1NDAwMDQxNDQyREEKKzoxMDQ3NDAwMDAwMDQxQzgyMDA0MzEwMjEwMDA0MUNDMjAwNDMxMDIzRkIKKzoxMDQ3NTAwMDAwMDQxRDAyMDA0MzEwMjEwMDA0MUQ0MjAwNDMxMDIzRTkKKzoxMDQ3NjAwMDEwMDAwMDA5QUY0MjAyMDgzQzA0MDAwMTI0ODQ2MjUwOUEKKzoxMDQ3NzAwMDM0QTUxMDAwMDIwMDMwMjEwMDAwMzgyMUFGQTAwMDEwNDUKKzoxMDQ3ODAwMDBDMDAyQjNCQUZBMDAwMTQ4RjQyMDJBMDI0NDIwMDAxN0EKKzoxMDQ3OTAwMEFGNDIwMkEwMTAwMDAyMUY4RjQyMDJBMDI3QjAwMDI4RTMKKzoxMDQ3QTAwMDAyMDAyMDIxMjQwNTAyMTAwQzAwMkJCRjI0MDYwMDA4NjMKKzoxMDQ3QjAwMDBDMDAyNTE4MDIwMDIwMjExMDAwMDIxNjAwMDAwMDAwNDUKKzoxMDQ3QzAwMDhGQUEwMDM0MjdBNDAwMjgwMDBBMTg4MDI1NDIwMDAxN0YKKzoxMDQ3RDAwMDMwNDIwMDNGQUZBMjAwMzQ4QzY1MDMwMDhGQUEwMDM0NDIKKzoxMDQ3RTAwMDAwMDIxMDgwOEM0MzAzMDAyNTQyMDAwMTMwNDIwMDNGNEMKKzoxMDQ3RjAwMEFGQTIwMDM0QUMwMjAyMkNBRkE1MDAyODBDMDAyNTE4OTMKKzoxMDQ4MDAwMEFGQTMwMDJDMTAwMDAyMDMwMDAwMDAwMDI3QjAwMDI4MTYKKzoxMDQ4MTAwMDAyMDAyMDIxMjQwNTAyMTAwQzAwMkJCRjI0MDYwMDA4RjIKKzoxMDQ4MjAwMDBDMDAyNjU3MDIwMDIwMjExMDAwMDFGQTAwMDAwMDAwQjEKKzoxMDQ4MzAwMDhGQUEwMDM0MjdBNDAwMjgwMDBBMTg4MDI1NDIwMDAxMEUKKzoxMDQ4NDAwMDMwNDIwMDNGQUZBMjAwMzQ4QzY1MDMwMDhGQUEwMDM0RDEKKzoxMDQ4NTAwMDAwMDIxMDgwOEM0MzAzMDAyNTQyMDAwMTMwNDIwMDNGREIKKzoxMDQ4NjAwMEFGQTIwMDM0QUMwMjAyMkNBRkE1MDAyODBDMDAyNjU3RTIKKzoxMDQ4NzAwMEFGQTMwMDJDMTAwMDAxRTcwMDAwMDAwMDAwMTAxMzAyOUQKKzoxMDQ4ODAwMDMwNDMwRkZGMjQwMjAwMDExMDYyMDAwNTI0MDIwMDAyRTEKKzoxMDQ4OTAwMDEwNjIwMDFFM0MwMjAwMDIxMDAwMDAzMzNDMDUwMDAzQzEKKzoxMDQ4QTAwMDNDMDMwMDAyMDJDMzEwMjQ1NDQwMDAzNzAyQzNCMDI1NjkKKzoxMDQ4QjAwMDhGODIwMjI4M0MwMTAwMDEwMDM3MDgyMUFDMjIzOEQ4NDEKKzoxMDQ4QzAwMDhGODIwMjJDM0MwMTAwMDEwMDM3MDgyMUFDMjIzOERDMjkKKzoxMDQ4RDAwMDhGODIwMjMwM0MwMTAwMDEwMDM3MDgyMUFDMjIzOEUwMTEKKzoxMDQ4RTAwMDhGODIwMjM0M0MwMTAwMDEwMDM3MDgyMUFDMjIzOEU0RjkKKzoxMDQ4RjAwMDI0MDJGRkZGQUY4MjAyMjhBRjgyMDIyQ0FGODIwMjMwNzcKKzoxMDQ5MDAwMEFGODIwMjM0MTAwMDAwMjAwMkMzQjAyNTAyQzIxMDI0N0UKKzoxMDQ5MTAwMDEwNDAwMDEyM0MwMkZGRkQzQzAyMDAwMTAwNTcxMDIxMzQKKzoxMDQ5MjAwMDhDNDIzOEQ4QUY4MjAyMjgzQzAyMDAwMTAwNTcxMDIxODcKKzoxMDQ5MzAwMDhDNDIzOERDQUY4MjAyMkMzQzAyMDAwMTAwNTcxMDIxNkYKKzoxMDQ5NDAwMDhDNDIzOEUwQUY4MjAyMzAzQzAyMDAwMTAwNTcxMDIxNTcKKzoxMDQ5NTAwMDhDNDIzOEU0QUY4MjAyMzQzQzAyRkZGRDM0NDJGRkZGNTgKKzoxMDQ5NjAwMDEwMDAwMDA5MDJDMkIwMjQzQzA0MDAwMTI0ODQ2MjVDRUYKKzoxMDQ5NzAwMDM0QTUxMTAwMDIwMDMwMjEwMDAwMzgyMUFGQTAwMDEwNDIKKzoxMDQ5ODAwMDBDMDAyQjNCQUZBMDAwMTQ4RjQyMDJDQzI0NDIwMDAxNEMKKzoxMDQ5OTAwMEFGNDIwMkNDMTAwMDAxOUY4RjQyMDJDQzAwMTAxMzAyRTQKKzoxMDQ5QTAwMDMwNDUwRkZGMjQwMjAwMDExMEEyMDAwNTI0MDIwMDAyN0UKKzoxMDQ5QjAwMDEwQTIwMDBEM0MwNDA4RkYxMDAwMDAxNDNDMDUwMDAzODkKKzoxMDQ5QzAwMDNDMDIwOEZGMzQ0MkZGRkY4RjgzMDIyMDNDMDQwMDA0QjYKKzoxMDQ5RDAwMDAyQzRCMDI1MDA2MjE4MjQzNDYzMDAwOEFGODMwMjIwQUIKKzoxMDQ5RTAwMDEwMDAwMDEyQUY0NTAyOTgzNDg0RkZGNzNDMDNGRkZCMzAKKzoxMDQ5RjAwMDhGODIwMjIwMzQ2M0ZGRkYwMkMzQjAyNDAwNDQxMDI0REUKKzoxMDRBMDAwMEFGODIwMjIwMTAwMDAwMDlBRjQ1MDI5ODNDMDQwMDAxNkIKKzoxMDRBMTAwMDI0ODQ2MjY4MzRBNTEyMDAwMjAwMzAyMTAwMDAzODIxOEQKKzoxMDRBMjAwMEFGQTAwMDEwMEMwMDJCM0JBRkEwMDAxNDhGNDIwMkJDQzMKKzoxMDRBMzAwMDI0NDIwMDAxQUY0MjAyQkMxMDAwMDE3NjhGNDIwMkJDNEEKKzoxMDRBNDAwMDI3ODQwMjA4MjQwNTAyMDAwQzAwMkJCRjI0MDYwMDA4NUUKKzoxMDRBNTAwMDI3NDQwMjI0MjQwNTAyMDAwQzAwMkJCRjI0MDYwMDA4NzIKKzoxMDRBNjAwMDhGNDIwMkM0MjQ0MjAwMDFBRjQyMDJDNDEwMDAwMTY5MTcKKzoxMDRBNzAwMDhGNDIwMkM0MDAxMDEzMDIzMDQzMEZGRjI0MDIwMDAxRDIKKzoxMDRBODAwMDEwNjIwMDExMjg2MjAwMDI1MDQwMDAwNTI0MDIwMDAyNUEKKzoxMDRBOTAwMDEwNjAwMDA3MDAwMDAwMDAxMDAwMDAxNzAwMDAwMDAwNzgKKzoxMDRBQTAwMDEwNjIwMDBGMDAwMDAwMDAxMDAwMDAxMzAwMDAwMDAwNjIKKzoxMDRBQjAwMDhDMDYwMjQ4MDAwMDIwMjEwQzAwNTEwNDI0MDUwMDA0NEIKKzoxMDRBQzAwMDEwMDAwMDA3MDAwMDAwMDA4QzA2MDI0ODAwMDAyMDIxQjIKKzoxMDRBRDAwMDBDMDA1MTA0MjQwNTAwMDQxMDAwMDAxMDAwMDAwMDAwMjgKKzoxMDRBRTAwMDhDMDYwMjRDMDAwMDIwMjEwQzAwNTEwNDI0MDUwMDAxMUEKKzoxMDRBRjAwMDEwMDAwMDBBMDAwMDAwMDAzQzA0MDAwMTI0ODQ2Mjc0REQKKzoxMDRCMDAwMDNDMDUwMDAzMzRBNTEzMDAwMjAwMzAyMTAwMDAzODIxQzkKKzoxMDRCMTAwMEFGQTAwMDEwMEMwMDJCM0JBRkEwMDAxNDhGNDIwMkMwQ0UKKzoxMDRCMjAwMDI0NDIwMDAxQUY0MjAyQzAxMDAwMDEzQThGNDIwMkMwOEQKKzoxMDRCMzAwMDBDMDAyNDI2MDAwMDAwMDAxMDAwMDEzNjAwMDAwMDAwRDgKKzoxMDRCNDAwMDI0MDIwMDAxQTM0MjA1QzUyNDEwMDEwMDhGNDQwMUE4REUKKzoxMDRCNTAwMDhGNDUwMUFDQUZCMDAwMTBBRkEwMDAxNDhGNDIwMDE0MUQKKzoxMDRCNjAwMEFGQTIwMDE4OEY0MjAxMDgyNkU2MDAyODAwNDBGODA5OEQKKzoxMDRCNzAwMDI0MDcwNDAwMTA0MEZGRjUwMDAwMDAwMDEwMDAwMTI1OEMKKzoxMDRCODAwMDAwMDAwMDAwM0MwM0ZGRkYzNDYzN0ZGRjhGNDIwMzY4OTcKKzoxMDRCOTAwMDhGNDQwMzYwMDJDM0IwMjQwMDAwMTgyMUFGNDAwMDU4QzYKKzoxMDRCQTAwMEFGNDAwMDVDQUY0MDAwNjBBRjQwMDA2NDAwNDQxMDIzQTEKKzoxMDRCQjAwMEFGNDIwMzY4M0MwMjA5MDBBRjQwMDM2MEFGQTIwMDIwOEYKKzoxMDRCQzAwMDhGNUUwMDE4MjdBQTAwMjAyNDAyMDBGRjEzQzIwMDAyRjMKKzoxMDRCRDAwMEFGQUEwMDNDMjdDMzAwMDE4QzAyMDIyODAwNjA5MDIxOEMKKzoxMDRCRTAwMDE2NDIwMDBFMDAxRTM4QzA4RjQyMDMzQzI0NDIwMDAxRDIKKzoxMDRCRjAwMEFGNDIwMzNDOEY0MjAzM0M4QzAyMDIyODNDMDQwMDAxN0MKKzoxMDRDMDAwMDI0ODQ2MjBDM0MwNTAwMDlBRkEwMDAxNEFGQTIwMDEwODAKKzoxMDRDMTAwMDhGQTYwMDIwMTAwMDAwNkIzNEE1MDUwMDAwRjcxMDIxQkUKKzoxMDRDMjAwMDhGQTMwMDIwOEZBNDAwMjRBQzQzMDRDMEFDNDQwNEM0NzAKKzoxMDRDMzAwMDhGODMwMDU0OEY4MjAwNTQyNDcwMDNFODAyMDIxMDIzRjMKKzoxMDRDNDAwMDJDNDIwM0U5MTA0MDAwMUIwMDAwOTgyMTAwRTA4ODIxNUQKKzoxMDRDNTAwMDI2MzUwNEMwOEY0NDAxNzg4RjQ1MDE3QzAyMjAxODIxM0QKKzoxMDRDNjAwMDI0MEEwMDA0QUZBQTAwMTBBRkIyMDAxNDhGNDgwMDBDNTEKKzoxMDRDNzAwMDAwMDAxMDIxMDJGNTMwMjFBRkE4MDAxODhGNDgwMTBDNjgKKzoxMDRDODAwMDI0MDcwMDA4MDBBMzI4MjEwMEEzNDgyQjAwODIyMDIxMkMKKzoxMDRDOTAwMDAxMDBGODA5MDA4OTIwMjE1NDQwMDAwNjI0MTMwMDAxNzYKKzoxMDRDQTAwMDhGODIwMDU0MDIwMjEwMjMyQzQyMDNFOTE0NDBGRkU5RDIKKzoxMDRDQjAwMDAwMDAwMDAwMzI2MjAwRkY1NDQwMDAxN0FGNTIwMDE4OUQKKzoxMDRDQzAwMDhGNDIwMzc4MjQ0MjAwMDFBRjQyMDM3ODhGNDIwMzc4NzkKKzoxMDRDRDAwMDhGODIwMTIwOEZBQTAwM0NBRkEyMDAxMDhGODIwMTI0OTYKKzoxMDRDRTAwMDNDMDQwMDAxMjQ4NDYyMTgzQzA1MDAwOUFGQTIwMDE0QjIKKzoxMDRDRjAwMDhENDYwMDAwMTAwMDAwMzMzNEE1MDYwMDhGNDIwMzA4RTMKKzoxMDREMDAwMDI0MTMwMDAxMjQ0MjAwMDFBRjQyMDMwODhGNDIwMzA4MkMKKzoxMDREMTAwMDEwMDAwMDFDMzI2MjAwRkY4RjgzMDA1NDhGODIwMDU0MDkKKzoxMDREMjAwMDI0NzAwM0U4MDIwMjEwMjMyQzQyMDNFOTEwNDAwMDE0MEYKKzoxMDREMzAwMDAwMDA5ODIxMjQxMTAwMTA4RjQyMDAwQzhGNDQwMTYwNjQKKzoxMDRENDAwMDhGNDUwMTY0OEY4NjAxMjBBRkIxMDAxMEFGQjIwMDE0MEYKKzoxMDRENTAwMEFGQTIwMDE4OEY0MjAxMEMyNDA3MDAwODAwNDBGODA5OTgKKzoxMDRENjAwMDI0QzYwMDFDMTQ0MEZGRTUwMDAwMDAwMDhGODIwMDU0QTAKKzoxMDRENzAwMDAyMDIxMDIzMkM0MjAzRTkxNDQwRkZFRjAwMDAwMDAwNjAKKzoxMDREODAwMDMyNjIwMEZGMTQ0MDAwMTEwMDAwMDAwMDhGNDIwMzc4REYKKzoxMDREOTAwMDI0NDIwMDAxQUY0MjAzNzg4RjQyMDM3ODhGODIwMTIwQzIKKzoxMDREQTAwMDhGQUEwMDNDQUZBMjAwMTA4RjgyMDEyNDNDMDQwMDAxQjYKKzoxMDREQjAwMDI0ODQ2MjIwM0MwNTAwMDlBRkEyMDAxNDhENDYwMDAwNDcKKzoxMDREQzAwMDM0QTUwNzAwMEMwMDJCM0IwM0MwMzgyMThGNDIwMkIwRjIKKzoxMDRERDAwMDI0NDIwMDAxQUY0MjAyQjA4RjQyMDJCMDhGNDIwMkY4N0IKKzoxMDRERTAwMDI0NDIwMDAxQUY0MjAyRjgxMDAwMDA4QThGNDIwMkY4MEMKKzoxMDRERjAwMDhDMDIwMjVDMjc0NDAyMjRBRjQyMDFGMDhDMDIwMjYwNjQKKzoxMDRFMDAwMDI0MDUwMjAwMjQwNjAwMDgwQzAwMkJCRkFGNDIwMUY4NjUKKzoxMDRFMTAwMDhGODIwMjIwMzA0MjAwMDgxNDQwMDAwMjI0MDIwMDAxNjgKKzoxMDRFMjAwMDI0MDIwMDAyQUY0MjAyOTg4RjQyMDJBQzI0NDIwMDAxRTkKKzoxMDRFMzAwMEFGNDIwMkFDMTAwMDAwNzc4RjQyMDJBQzNDMDIwMEZGOTAKKzoxMDRFNDAwMDM0NDJGRkZGMDIwMjE4MjQzMkMyMDE4MDE0NDAwMDA2REYKKzoxMDRFNTAwMDM0MDJGRkZCMDA0MzEwMkIxNDQwMDAwMzAwMDAwMDAwNEQKKzoxMDRFNjAwMDEwMDAwMDZDQUY0MzAwQkMzQzA0MDAwMTI0ODQ2MjgwNEQKKzoxMDRFNzAwMDNDMDUwMDAzMzRBNTE1MDAwMjAwMzAyMTAwMDAzODIxNTQKKzoxMDRFODAwMEFGQTAwMDEwMEMwMDJCM0JBRkEwMDAxNDNDMDIwNzAwQTkKKzoxMDRFOTAwMDM0NDIxMDAwMDAxMDFFMDIwMDYyMTgyNUFGQTMwMDIwNEIKKzoxMDRFQTAwMDhGNTEwMDE4MjQwMjAwRkYxMjIyMDAwMjAwMDA4MDIxMEUKKzoxMDRFQjAwMDI2MzAwMDAxOEMwMjAyMjgxNjAyMDAwRTAwMTEzMEMwQkMKKzoxMDRFQzAwMDhGNDIwMzNDMjQ0MjAwMDFBRjQyMDMzQzhGNDIwMzNDMkIKKzoxMDRFRDAwMDhDMDIwMjI4M0MwNDAwMDEyNDg0NjFGNDNDMDUwMDA5OTIKKzoxMDRFRTAwMEFGQTAwMDE0QUZBMjAwMTA4RkE2MDAyMDEwMDAwMDNGNUEKKzoxMDRFRjAwMDM0QTUwMTAwMDBENzEwMjE4RkEzMDAyMDhGQTQwMDI0MjcKKzoxMDRGMDAwMEFDNDMwNEMwQUM0NDA0QzQwMEMwMTgyMThGNDQwMTc4RjEKKzoxMDRGMTAwMDhGNDUwMTdDMDAwMDEwMjEyNDA3MDAwNEFGQTcwMDEwN0EKKzoxMDRGMjAwMEFGQjAwMDE0OEY0ODAwMEMyNEM2MDRDMDAyRTYzMDIxNDQKKzoxMDRGMzAwMEFGQTgwMDE4OEY0ODAxMEMyNDA3MDAwODAwQTMyODIxRkYKKzoxMDRGNDAwMDAwQTM0ODJCMDA4MjIwMjEwMTAwRjgwOTAwODkyMDIxQkMKKzoxMDRGNTAwMDE0NDAwMDBCMjQwNzAwMDg4RjgyMDEyMEFGQTIwMDEwMkMKKzoxMDRGNjAwMDhGODIwMTI0M0MwNDAwMDEyNDg0NjFGQzNDMDUwMDA5N0IKKzoxMDRGNzAwMEFGQTIwMDE0OEZBNjAwMjAxMDAwMDAxQzM0QTUwMjAwNzAKKzoxMDRGODAwMDhGNDQwMTYwOEY0NTAxNjQ4RjQzMDAwQ0FGNTAwMDE4QkYKKzoxMDRGOTAwMDhGODYwMTIwMjQwMjAwMTBBRkEyMDAxMEFGQjAwMDE0RDEKKzoxMDRGQTAwMEFGQTMwMDE4OEY0MjAxMEMwMDQwRjgwOTI0QzYwMDFDNzIKKzoxMDRGQjAwMDE0NDAwMDEwMDAwMDAwMDA4RjQyMDM0MDI0NDIwMDAxMTIKKzoxMDRGQzAwMEFGNDIwMzQwOEY0MjAzNDA4RjgyMDEyMEFGQTIwMDEwMDYKKzoxMDRGRDAwMDhGODIwMTI0M0MwNDAwMDEyNDg0NjIwNDNDMDUwMDA5MDIKKzoxMDRGRTAwMEFGQTIwMDE0OEZBNjAwMjAzNEE1MDMwMDBDMDAyQjNCQjkKKzoxMDRGRjAwMDAyMjAzODIxOEY0MjAyRTAyNDQyMDAwMUFGNDIwMkUwNDkKKzoxMDUwMDAwMDhGNDIwMkUwOEY0MjAyRjAyNDQyMDAwMUFGNDIwMkYwRTAKKzoxMDUwMTAwMDhGNDIwMkYwOEZBMjAwMzQ4RkJGMDA1ODhGQkUwMDU0MjEKKzoxMDUwMjAwMDhGQjUwMDUwOEZCMzAwNEM4RkIyMDA0ODhGQjEwMDQ0NTEKKzoxMDUwMzAwMDhGQjAwMDQwMDNFMDAwMDgyN0JEMDA2MDI3QkRGRkY4RTcKKzoxMDUwNDAwMDI0MDhGRkZGMTBBMDAwMTQwMDAwNDgyMTNDMEFFREI4MUUKKzoxMDUwNTAwMDM1NEE4MzIwOTA4NzAwMDAyNDg0MDAwMTAwMDAzMDIxMUQKKzoxMDUwNjAwMDAxMDcxMDI2MzA0MjAwMDExMDQwMDAwMjAwMDgxODQyREIKKzoxMDUwNzAwMDAwNkExODI2MDA2MDQwMjEyNEM2MDAwMTJDQzIwMDA4RTYKKzoxMDUwODAwMDE0NDBGRkY3MDAwNzM4NDIyNTI5MDAwMTAxMjUxMDJCQTUKKzoxMDUwOTAwMDE0NDBGRkYwMDAwMDAwMDAwMTAwMTAyMTAzRTAwMDA4QjAKKzoxMDUwQTAwMDI3QkQwMDA4MjdCREZGQjBBRkJGMDA0OEFGQkUwMDQ0MUEKKzoxMDUwQjAwMEFGQjUwMDQwQUZCMzAwM0NBRkIyMDAzOEFGQjEwMDM0ODEKKzoxMDUwQzAwMEFGQjAwMDMwOEY4NzAyMjBBRkE3MDAyNDhGODcwMjAwODcKKzoxMDUwRDAwMEFGQTcwMDJDOEY4MjAyMjAzQzAzMDhGRjM0NjNGRkZGNDAKKzoxMDUwRTAwMDAwNDMxMDI0MzQ0MjAwMDRBRjgyMDIyMDhGODIwMjAwNjkKKzoxMDUwRjAwMDNDMDNDMEZGMzQ2M0ZGRkYwMDQzMTAyNDM0NDIwMDA0MkMKKzoxMDUxMDAwMEFGODIwMjAwOEY1MzAzNTg4RjU1MDM1QzhGNUUwMzYwOUMKKzoxMDUxMTAwMDhGNDcwMzY0QUZBNzAwMTQ4RjQ3MDM2OEFGQTcwMDFDMzUKKzoxMDUxMjAwMDhGNDIwMkQwMjc0NDAxQzAyNDQyMDAwMUFGNDIwMkQwODYKKzoxMDUxMzAwMDhGNTAwMkQwOEY1MTAyMDQ4RjUyMDIwMDBDMDAyQkE4MTYKKzoxMDUxNDAwMDI0MDUwNDAwQUY1MzAzNThBRjU1MDM1Q0FGNUUwMzYwMDIKKzoxMDUxNTAwMDhGQTcwMDE0QUY0NzAzNjQ4RkE3MDAxQ0FGNDcwMzY4RjUKKzoxMDUxNjAwMEFGNTAwMkQwQUY1MTAyMDRBRjUyMDIwMDhDMDIwMjVDNzkKKzoxMDUxNzAwMDI3NDQwMjI0QUY0MjAxRjA4QzAyMDI2MDI0MDUwMjAwQTEKKzoxMDUxODAwMDI0MDYwMDA4QUY0MjAxRjgyNDAyMDAwNjBDMDAyQkJGRTEKKzoxMDUxOTAwMEFGNDIwMUY0M0MwMjNCOUEzNDQyQ0EwMEFGNDIwMUZDRTgKKzoxMDUxQTAwMDI0MDIwM0U4MjQwNDAwMDIyNDAzMDAwMUFGNDIwMjk0MTUKKzoxMDUxQjAwMEFGNDQwMjkwQUY0MzAyOUM4RjgyMDIyMDMwNDIwMDA4MkQKKzoxMDUxQzAwMDEwNDAwMDA0MDAwMDAwMDBBRjQzMDI5ODEwMDAwMDAzRUMKKzoxMDUxRDAwMDAwMDAzMDIxQUY0NDAyOTgwMDAwMzAyMTNDMDMwMDAxNjAKKzoxMDUxRTAwMDAwNjYxODIxOTA2MzZEMDAwMzQ2MTAyMTI0QzYwMDAxNUIKKzoxMDUxRjAwMEEwNDMwMjJDMkNDMjAwMEYxNDQwRkZGODAzNDYxODIxRDQKKzoxMDUyMDAwMDI0QzYwMDAxOEY4MjAwNDAyNDA0MDA4MDI0MDUwMDgwMTEKKzoxMDUyMTAwMDAwMDIxNzAyMjQ0MjAwMzBBMDYyMDIyQzAzNDYxMDIxMzMKKzoxMDUyMjAwMDBDMDAyQkE4QTA0MDAyMkM4RkE3MDAyNDMwRTIwMDA0MjEKKzoxMDUyMzAwMDE0NDAwMDA2MDAwMDAwMDA4RjgyMDIyMDNDMDMwOEZGOUIKKzoxMDUyNDAwMDM0NjNGRkZCMDA0MzEwMjRBRjgyMDIyMDhGQTcwMDJDQTEKKzoxMDUyNTAwMDMwRTIwMDA0MTQ0MDAwMDYwMDAwMDAwMDhGODIwMjAwQ0IKKzoxMDUyNjAwMDNDMDNDMEZGMzQ2M0ZGRkIwMDQzMTAyNEFGODIwMjAwMDUKKzoxMDUyNzAwMDhGQkYwMDQ4OEZCRTAwNDQ4RkI1MDA0MDhGQjMwMDNDMDUKKzoxMDUyODAwMDhGQjIwMDM4OEZCMTAwMzQ4RkIwMDAzMDAzRTAwMDA4RDcKKzoxMDUyOTAwMDI3QkQwMDUwMDAwMDAwMDAwMDAwMDAwMEFGNDAwMTA0RTYKKzoxMDUyQTAwMDI0MDQwMDAxMDAwNDEwQzAwMkUyMTgyMTI0ODIwMDAxM0QKKzoxMDUyQjAwMDNDMDEwMDAxMDAyMzA4MjFBNDIyMzREMDAwNDAyMDIxMTkKKzoxMDUyQzAwMDJDODIwMDgwMTQ0MEZGRjgwMDA0MTBDMDI0MDIwMDAxNkEKKzoxMDUyRDAwMDNDMDEwMDAxMDAzNzA4MjFBNDIwMzhEMEFGNDIwMTAwNzIKKzoxMDUyRTAwMEFGODAwMjI4QUY4MDAyMkNBRjgwMDIzMEFGODAwMjM0NDIKKzoxMDUyRjAwMDAzRTAwMDA4MDAwMDAwMDAyN0JERkZFOEFGQkYwMDE0NzYKKzoxMDUzMDAwMEFGQjAwMDEwOEY0MjAxMDQyODQyMDAwNTEwNDAwMDI2NzMKKzoxMDUzMTAwMDAwODA4MDIxM0MwMjAwMDE4RjQzMDEwNDM0NDIzMEQwRTAKKzoxMDUzMjAwMDAyRTIyMDIxMDAwMzE4QzAwMDYyMTgyMTAyRTMxODIxQzQKKzoxMDUzMzAwMDAwODMxMDJCMTA0MDAwMTUwMDAwMTAyMTk2MDcwMDAwN0MKKzoxMDUzNDAwMDI0ODQwMDA2MjQ2NjAwMDY5NDgyRkZGQzE0NDcwMDA5QUEKKzoxMDUzNTAwMDAwMDAyODIxOTQ4M0ZGRkU5NjAyMDAwMjE0NjIwMDA2REEKKzoxMDUzNjAwMDAwQTAxMDIxOTQ4MjAwMDA5NjAzMDAwNDAwNDMxMDI2NDAKKzoxMDUzNzAwMDJDNDUwMDAxMDBBMDEwMjExNDQwMDAwOTI0ODQwMDA4REQKKzoxMDUzODAwMDAwODYxMDJCMTQ0MEZGRjAwMDAwMTAyMTMwNDIwMEZGNzcKKzoxMDUzOTAwMDE0NDAwMDMwMjQwMjAwMDExMDAwMDAyRTAwMDAxMDIxRjMKKzoxMDUzQTAwMDEwMDBGRkZBMjQwMjAwMDEwMjAwMjAyMTBDMDAyNDBDNEUKKzoxMDUzQjAwMDI0MDUwMDA2MzA0MjAwN0YwMDAyMThDMDAyRTMxMDIxREQKKzoxMDUzQzAwMDNDMDEwMDAxMDAyMjA4MjE5NDIyMzBEMDEwNDBGRkYyNUQKKzoxMDUzRDAwMDAyRTMxMDIxM0MwNjAwMDEwMEMyMzAyMTk0QzYzMEQwMDcKKzoxMDUzRTAwMDEwQzBGRkVEM0MwODAwMDEzNTA4MzREMjk2MDcwMDAwREMKKzoxMDUzRjAwMDAwMDYxMEMwMDA1NzIwMjEwMDg4MjAyMTk0ODIwMDAwNjAKKzoxMDU0MDAwMDE0NDcwMDA5MDAwMDI4MjE5NDgzMDAwMjk2MDIwMDAyM0MKKzoxMDU0MTAwMDE0NjIwMDA2MDBBMDEwMjE5NDgyMDAwNDk2MDMwMDA0ODgKKzoxMDU0MjAwMDAwNDMxMDI2MkM0NTAwMDEwMEEwMTAyMTE0NDAwMDA3NjUKKzoxMDU0MzAwMDAwMDYxMEMwMDJFMjEwMjEzQzA2MDAwMTAwQzIzMDIxMkIKKzoxMDU0NDAwMDk0QzYzNEQwMTRDMEZGRUIwMDA2MTBDMDEwQzBGRkQyQzkKKzoxMDU0NTAwMDI0MDIwMDAxOEZCRjAwMTQ4RkIwMDAxMDAzRTAwMDA4ODkKKzoxMDU0NjAwMDI3QkQwMDE4MDNFMDAwMDgwMDAwMDAwMDI3QkRGRkIwQzIKKzoxMDU0NzAwMDAwODAxMDIxQUZCMDAwMzAyNDUwMDAwMjAyMDAyMDIxMzMKKzoxMDU0ODAwMDI0MDUwMDA2QUZCMTAwMzQwMDQwODgyMUFGQkYwMDQ4QkEKKzoxMDU0OTAwMEFGQkUwMDQ0QUZCNTAwNDBBRkIzMDAzQzBDMDAyNDBDREQKKzoxMDU0QTAwMEFGQjIwMDM4MzA0NzAwN0YwMDA3MTBDMDAyRTIxMDIxODEKKzoxMDU0QjAwMDNDMDUwMDAxMDBBMjI4MjE5NEE1MzBEMDUwQTAwMDFDN0EKKzoxMDU0QzAwMDAwQTAzMDIxM0MwOTAwMDEzNTI5MzREMjk2MjgwMDAyODEKKzoxMDU0RDAwMDAwMDUxMEMwMDA1NzIwMjEwMDg5MjAyMTk0ODIwMDAwN0YKKzoxMDU0RTAwMDE0NDgwMDA5MDAwMDMwMjE5NDgzMDAwMjk2MDIwMDAyNTMKKzoxMDU0RjAwMDE0NjIwMDA2MDBDMDEwMjE5NDgyMDAwNDk2MDMwMDA0ODgKKzoxMDU1MDAwMDAwNDMxMDI2MkM0NjAwMDEwMEMwMTAyMTE0NDAwMDA3NjMKKzoxMDU1MTAwMDAwMDUxMEMwMDJFMjEwMjEzQzA1MDAwMTAwQTIyODIxNzQKKzoxMDU1MjAwMDk0QTUzNEQwMTRBMEZGRUIwMDA1MTBDMDAwQTAzMDIxREEKKzoxMDU1MzAwMDEwQzAwMDE0MDAwNjEwQzAwMDU3MTgyMTNDMDEwMDAxRTMKKzoxMDU1NDAwMDAwMjMwODIxOEMyMzM0RDAwMDU3MTAyMUFGQTMwMDEwNzIKKzoxMDU1NTAwMDNDMDEwMDAxMDAyMjA4MjE4QzIyMzRENDNDMDQwMDAxQ0IKKzoxMDU1NjAwMDI0ODQ2Mzk0QUZBMjAwMTQ4RTI2MDAwMDhFMjcwMDA0Q0EKKzoxMDU1NzAwMDNDMDUwMDA0MEMwMDJCM0IzNEE1MDQwMDEwMDAwMDYzMjQKKzoxMDU1ODAwMDNDMDIwODAwOEY0NTAxMDAxMEEwMDAwNjAwMDUxMEMwNzUKKzoxMDU1OTAwMDAyRTIxMDIxM0MwMTAwMDEwMDIyMDgyMTk0MjIzNEQwQjMKKzoxMDU1QTAwMEFGNDIwMTAwMDBBMDMwMjExNEMwMDAxMTAwMDYyOEMwNDUKKzoxMDU1QjAwMDAwMDcxMEMwMDJFMjEwMjFBRkE3MDAxMDNDMDEwMDAxNUIKKzoxMDU1QzAwMDAwMjIwODIxOTQyMjMwRDAzQzA0MDAwMTI0ODQ2M0EwRUUKKzoxMDU1RDAwMEFGQTIwMDE0OEUyNjAwMDA4RTI3MDAwNDNDMDUwMDA0QjQKKzoxMDU1RTAwMDBDMDAyQjNCMzRBNTA1MDAxMDAwMDA0ODNDMDIwODAwQ0QKKzoxMDU1RjAwMDAwQjcxODIxM0MwMjAwMDE5NjA0MDAwMDM0NDIzNEQyNjYKKzoxMDU2MDAwMDAwNjIxODIxQTQ2NDAwMDA4RTAyMDAwMjAwMDcyMEMwN0UKKzoxMDU2MTAwMEFDNjIwMDAyMDJFNDEwMjEzQzAzMDAwMTAwNjIxODIxODgKKzoxMDU2MjAwMDk0NjMzMEQwMDJFNTEwMjEzQzAxMDAwMTAwMjIwODIxRTIKKzoxMDU2MzAwMEE0MjMzNEQwMDJFNDEwMjEzQzAxMDAwMTAwMjIwODIxRkYKKzoxMDU2NDAwMEE0MjYzMEQwOEY0MjAxMDQyNDQyMDAwMTI4NDIwMDgwNjkKKzoxMDU2NTAwMDEwNDAwMDBGM0MwMjAwMDI4RjQyMDEwNDNDMDQwMDAxOTQKKzoxMDU2NjAwMDM0ODQzMEQyOTYwMzAwMDAwMDAyMTBDMDAwNTcxMDIxOEQKKzoxMDU2NzAwMDAwNDQxMDIxQTQ0MzAwMDA4RTAzMDAwMkFDNDMwMDAyNEEKKzoxMDU2ODAwMDhGNDIwMTA0MjQ0MjAwMDFBRjQyMDEwNDNDMDIwMDAyQTcKKzoxMDU2OTAwMDAyQzIxMDI0MTA0MDAwMTEwMDA3MjE0MjNDMDMwMDAxMDcKKzoxMDU2QTAwMDM0NjMzOEQ4MjQwMjAwMDMwMDQ0MTAyMzAwMDIxMDgwMjEKKzoxMDU2QjAwMDAwNTcyMDIxMDA4MzIwMjEwMDU3MTAyMTAwNDMxMDIxOTIKKzoxMDU2QzAwMDMwRTUwMDFGOEM0MzAwMDAyNDAyMDAwMTAwQTIxMDA0RkEKKzoxMDU2RDAwMDAwNjIxODI1MTAwMDAwMENBQzgzMDAwMDI0MDIwMDAzQjcKKzoxMDU2RTAwMDAwNDQxMDIzMDAwMjEwODAwMDVDMjgyMTAwNUMxMDIxN0YKKzoxMDU2RjAwMDMwRTQwMDFGOEM0MzAyMjgyNDAyMDAwMTAwODIxMDA0QzEKKzoxMDU3MDAwMDAwNjIxODI1QUNBMzAyMjgzQzAyMDgwMDM0NDIxMDAwQjUKKzoxMDU3MTAwMDAwMDAxODIxQUZBMjAwMjA4RjVFMDAxODI3QUEwMDIwRTkKKzoxMDU3MjAwMDI0MDIwMEZGMTNDMjAwMDJBRkFBMDAyQzI3QzMwMDAxMEQKKzoxMDU3MzAwMDhDMDIwMjI4MDA2MDkwMjExNjQyMDAwRTAwMUUzOEMwMjQKKzoxMDU3NDAwMDhGNDIwMzNDMjQ0MjAwMDFBRjQyMDMzQzhGNDIwMzNDQTIKKzoxMDU3NTAwMDhDMDIwMjI4M0MwNDAwMDEyNDg0NjM1QzNDMDUwMDA5OUYKKzoxMDU3NjAwMEFGQTAwMDE0QUZBMjAwMTA4RkE2MDAyMDEwMDAwMDZCQTUKKzoxMDU3NzAwMDM0QTUwNTAwMDBGNzEwMjE4RkEzMDAyMDhGQTQwMDI0N0EKKzoxMDU3ODAwMEFDNDMwNEMwQUM0NDA0QzQ4RjgzMDA1NDhGODIwMDU0RTMKKzoxMDU3OTAwMDI0NzAwM0U4MDIwMjEwMjMyQzQyMDNFOTEwNDAwMDFCOEUKKzoxMDU3QTAwMDAwMDA5ODIxMDBFMDg4MjEyNjM1MDRDMDhGNDQwMTc4NEMKKzoxMDU3QjAwMDhGNDUwMTdDMDIyMDE4MjEyNDBBMDAwNEFGQUEwMDEwQTIKKzoxMDU3QzAwMEFGQjIwMDE0OEY0ODAwMEMwMDAwMTAyMTAyRjUzMDIxMDgKKzoxMDU3RDAwMEFGQTgwMDE4OEY0ODAxMEMyNDA3MDAwODAwQTMyODIxNTcKKzoxMDU3RTAwMDAwQTM0ODJCMDA4MjIwMjEwMTAwRjgwOTAwODkyMDIxMTQKKzoxMDU3RjAwMDU0NDAwMDA2MjQxMzAwMDE4RjgyMDA1NDAyMDIxMDIzM0IKKzoxMDU4MDAwMDJDNDIwM0U5MTQ0MEZGRTkwMDAwMDAwMDMyNjIwMEZGNkYKKzoxMDU4MTAwMDU0NDAwMDE3QUY1MjAwMTg4RjQyMDM3ODI0NDIwMDAxMTEKKzoxMDU4MjAwMEFGNDIwMzc4OEY0MjAzNzg4RjgyMDEyMDhGQUEwMDJDMjkKKzoxMDU4MzAwMEFGQTIwMDEwOEY4MjAxMjQzQzA0MDAwMTI0ODQ2MzY4MUQKKzoxMDU4NDAwMDNDMDUwMDA5QUZBMjAwMTQ4RDQ2MDAwMDEwMDAwMDMzOTMKKzoxMDU4NTAwMDM0QTUwNjAwOEY0MjAzMDgyNDEzMDAwMTI0NDIwMDAxRUUKKzoxMDU4NjAwMEFGNDIwMzA4OEY0MjAzMDgxMDAwMDAxQzMyNjIwMEZGQTEKKzoxMDU4NzAwMDhGODMwMDU0OEY4MjAwNTQyNDcwMDNFODAyMDIxMDIzQTcKKzoxMDU4ODAwMDJDNDIwM0U5MTA0MDAwMTQwMDAwOTgyMTI0MTEwMDEwNUMKKzoxMDU4OTAwMDhGNDIwMDBDOEY0NDAxNjA4RjQ1MDE2NDhGODYwMTIwODgKKzoxMDU4QTAwMEFGQjEwMDEwQUZCMjAwMTRBRkEyMDAxODhGNDIwMTBDQ0MKKzoxMDU4QjAwMDI0MDcwMDA4MDA0MEY4MDkyNEM2MDAxQzE0NDBGRkU1MzYKKzoxMDU4QzAwMDAwMDAwMDAwOEY4MjAwNTQwMjAyMTAyMzJDNDIwM0U5RTIKKzoxMDU4RDAwMDE0NDBGRkVGMDAwMDAwMDAzMjYyMDBGRjE0NDAwMDExOEUKKzoxMDU4RTAwMDAwMDAwMDAwOEY0MjAzNzgyNDQyMDAwMUFGNDIwMzc4OTkKKzoxMDU4RjAwMDhGNDIwMzc4OEY4MjAxMjA4RkFBMDAyQ0FGQTIwMDEwNjQKKzoxMDU5MDAwMDhGODIwMTI0M0MwNDAwMDEyNDg0NjM3MDNDMDUwMDA5NUIKKzoxMDU5MTAwMEFGQTIwMDE0OEQ0NjAwMDAzNEE1MDcwMDBDMDAyQjNCRkQKKzoxMDU5MjAwMDAzQzAzODIxOEY0MjAyQjQyNDQyMDAwMUFGNDIwMkI0QzYKKzoxMDU5MzAwMDhGNDIwMkI0OEY0MjAyRjQyNDQyMDAwMUFGNDIwMkY0Q0IKKzoxMDU5NDAwMDhGNDIwMkY0OEZCRjAwNDg4RkJFMDA0NDhGQjUwMDQwRTUKKzoxMDU5NTAwMDhGQjMwMDNDOEZCMjAwMzg4RkIxMDAzNDhGQjAwMDMwNkQKKzoxMDU5NjAwMDAzRTAwMDA4MjdCRDAwNTAyN0JERkZBMDAwODAxMDIxRTQKKzoxMDU5NzAwMEFGQjAwMDQwMjQ1MDAwMDIwMjAwMjAyMTI0MDUwMDA2QTAKKzoxMDU5ODAwMEFGQjEwMDQ0MDA0MDg4MjFBRkJGMDA1OEFGQkUwMDU0MDMKKzoxMDU5OTAwMEFGQjUwMDUwQUZCMzAwNEMwQzAwMjQwQ0FGQjIwMDQ4QzAKKzoxMDU5QTAwMDMwNDgwMDdGMDAwODEwQzAwMkUyMTAyMTNDMDYwMDAxRDAKKzoxMDU5QjAwMDAwQzIzMDIxOTRDNjMwRDAxMEMwMDAxQzAwMDAzODIxMzUKKzoxMDU5QzAwMDNDMEEwMDAxMzU0QTM0RDI5NjI5MDAwMjAwMDYxMEMwNzQKKzoxMDU5RDAwMDAwNTcyMDIxMDA4QTIwMjE5NDgyMDAwMDE0NDkwMDA5RTgKKzoxMDU5RTAwMDAwMDAyODIxOTQ4MzAwMDI5NjAyMDAwMjE0NjIwMDA2M0YKKzoxMDU5RjAwMDAwQTAxMDIxOTQ4MjAwMDQ5NjAzMDAwNDAwNDMxMDI2QTYKKzoxMDVBMDAwMDJDNDUwMDAxMDBBMDEwMjExNDQwMDAwODAwMDYxMEMwMjEKKzoxMDVBMTAwMDAwQzAzODIxMDJFMjEwMjEzQzA2MDAwMTAwQzIzMDIxMDIKKzoxMDVBMjAwMDk0QzYzNEQwMTRDMEZGRUEwMDA2MTBDMDE0QzAwMDExQTAKKzoxMDVBMzAwMEFGQTcwMDI4MDAwODEwQzAwMkUyMTAyMUFGQTgwMDEwOTQKKzoxMDVBNDAwMDNDMDEwMDAxMDAyMjA4MjE5NDIyMzBEMDNDMDQwMDAxRDYKKzoxMDVBNTAwMDI0ODQ2M0FDQUZBMjAwMTQ4RTI2MDAwMDhFMjcwMDA0QkQKKzoxMDVBNjAwMDNDMDUwMDA0MEMwMDJCM0IzNEE1MDkwMDEwMDAwMDc1MTgKKzoxMDVBNzAwMDNDMDIwODAwMTBFMDAwMEMwMDA2MTBDMDAyRTIxMDIxRjkKKzoxMDVBODAwMDNDMDMwMDAxMDA2MjE4MjE5NDYzMzREMDAwMDcxMEMwNjkKKzoxMDVBOTAwMDAyRTIxMDIxM0MwMTAwMDEwMDIyMDgyMUE0MjMzNEQwOUQKKzoxMDVBQTAwMDEwMDAwMDBCM0MwNDAwMDEwMkUyMTAyMTNDMDMwMDAxNDUKKzoxMDVBQjAwMDAwNjIxODIxOTQ2MzM0RDAwMDA4MTBDMDAyRTIxMDIxNjMKKzoxMDVBQzAwMDNDMDEwMDAxMDAyMjA4MjFBNDIzMzBEMDNDMDQwMDAxNDUKKzoxMDVBRDAwMDM0ODQzMEQwOEY0MzAxMDAwMDA2MTBDMDAyRTIxMDIxNTAKKzoxMDVBRTAwMDNDMDEwMDAxMDAyMjA4MjFBNDIzMzREMDhGNDIwMTA0OEMKKzoxMDVBRjAwMDAyRTQzODIxMDAwMDI4MjExODQwMDAyOUFGNDYwMTAwQTcKKzoxMDVCMDAwMDI0RTYwMDA2OTRDM0ZGRkM5NjAyMDAwMDE0NjIwMDA5MUMKKzoxMDVCMTAwMDAwMDAyMDIxOTRDM0ZGRkU5NjAyMDAwMjE0NjIwMDA2REEKKzoxMDVCMjAwMDAwODAxMDIxOTRDMjAwMDA5NjAzMDAwNDAwNDMxMDI2NTgKKzoxMDVCMzAwMDJDNDQwMDAxMDA4MDEwMjE1MDQwMDAxNDI0QTUwMDAxRDUKKzoxMDVCNDAwMDhGNDIwMTA0MjQ0MkZGRkYwMEEyMTAyQTEwNDAwMDBCRTQKKzoxMDVCNTAwMDI0RTQwMDA0OTQ4MjAwMDY4QzgzMDAwOEE0ODJGRkZFRTMKKzoxMDVCNjAwMEFDODMwMDAwOEY0MjAxMDQyNEE1MDAwMTI0NDJGRkZGMDIKKzoxMDVCNzAwMDAwQTIxMDJBMTQ0MEZGRjcyNDg0MDAwODhGNDIwMTA0NzkKKzoxMDVCODAwMDI0NDJGRkZGMTAwMDAwMDZBRjQyMDEwNDhGNDIwMTA0Q0YKKzoxMDVCOTAwMDI0QzYwMDA4MDBBMjEwMkExNDQwRkZEQTI0RTcwMDA4RjcKKzoxMDVCQTAwMDAwMDgxMEMwMDJFMjEwMjEzQzAxMDAwMTAwMjIwODIxN0YKKzoxMDVCQjAwMDk0MjIzMEQwMTQ0MDAwMjMzQzAyMDgwMDNDMDIwMDAyMzIKKzoxMDVCQzAwMDAyQzIxMDI0MTA0MDAwMTIwMDA4MjE0MjNDMDMwMDAxRDAKKzoxMDVCRDAwMDM0NjMzOEQ4MjQwMjAwMDMwMDQ0MTAyMzAwMDIxMDgwRUMKKzoxMDVCRTAwMDAwNTcyMDIxMDA4MzIwMjEwMDU3MTAyMTAwNDMxMDIxNUQKKzoxMDVCRjAwMDMxMDUwMDFGMjQwMzAwMDE4QzQyMDAwMDAwQTMxODA0OUIKKzoxMDVDMDAwMDAwMDMxODI3MDA0MzEwMjQxMDAwMDAwREFDODIwMDAwOTAKKzoxMDVDMTAwMDI0MDIwMDAzMDA0NDEwMjMwMDAyMTA4MDAwNUMyODIxQUQKKzoxMDVDMjAwMDAwNUMxMDIxMzEwNDAwMUYyNDAzMDAwMThDNDIwMjI4NzMKKzoxMDVDMzAwMDAwODMxODA0MDAwMzE4MjcwMDQzMTAyNEFDQTIwMjI4OTQKKzoxMDVDNDAwMDNDMDIwODAwMzQ0MjIwMDAwMDAwMTgyMUFGQTIwMDIwQ0UKKzoxMDVDNTAwMDhGNUUwMDE4MjdBQjAwMjAyNDAyMDBGRjEzQzIwMDAyNTEKKzoxMDVDNjAwMEFGQUIwMDM0MjdDMzAwMDE4QzAyMDIyODAwNjA5MDIxRjIKKzoxMDVDNzAwMDE2NDIwMDBFMDAxRTM4QzA4RjQyMDMzQzI0NDIwMDAxMzEKKzoxMDVDODAwMEFGNDIwMzNDOEY0MjAzM0M4QzAyMDIyODNDMDQwMDAxREIKKzoxMDVDOTAwMDI0ODQ2MzVDM0MwNTAwMDlBRkEwMDAxNEFGQTIwMDEwOEYKKzoxMDVDQTAwMDhGQTYwMDIwMTAwMDAwNkIzNEE1MDUwMDAwRjcxMDIxMUUKKzoxMDVDQjAwMDhGQTMwMDIwOEZBNDAwMjRBQzQzMDRDMEFDNDQwNEM0RDAKKzoxMDVDQzAwMDhGODMwMDU0OEY4MjAwNTQyNDcwMDNFODAyMDIxMDIzNTMKKzoxMDVDRDAwMDJDNDIwM0U5MTA0MDAwMUIwMDAwOTgyMTAwRTA4ODIxQkQKKzoxMDVDRTAwMDI2MzUwNEMwOEY0NDAxNzg4RjQ1MDE3QzAyMjAxODIxOUQKKzoxMDVDRjAwMDI0MEIwMDA0QUZBQjAwMTBBRkIyMDAxNDhGNDgwMDBDQUYKKzoxMDVEMDAwMDAwMDAxMDIxMDJGNTMwMjFBRkE4MDAxODhGNDgwMTBDQzcKKzoxMDVEMTAwMDI0MDcwMDA4MDBBMzI4MjEwMEEzNDgyQjAwODIyMDIxOEIKKzoxMDVEMjAwMDAxMDBGODA5MDA4OTIwMjE1NDQwMDAwNjI0MTMwMDAxRDUKKzoxMDVEMzAwMDhGODIwMDU0MDIwMjEwMjMyQzQyMDNFOTE0NDBGRkU5MzEKKzoxMDVENDAwMDAwMDAwMDAwMzI2MjAwRkY1NDQwMDAxN0FGNTIwMDE4RkMKKzoxMDVENTAwMDhGNDIwMzc4MjQ0MjAwMDFBRjQyMDM3ODhGNDIwMzc4RDgKKzoxMDVENjAwMDhGODIwMTIwOEZBQjAwMzRBRkEyMDAxMDhGODIwMTI0RkMKKzoxMDVENzAwMDNDMDQwMDAxMjQ4NDYzNjgzQzA1MDAwOUFGQTIwMDE0QzAKKzoxMDVEODAwMDhENjYwMDAwMTAwMDAwMzMzNEE1MDYwMDhGNDIwMzA4MjIKKzoxMDVEOTAwMDI0MTMwMDAxMjQ0MjAwMDFBRjQyMDMwODhGNDIwMzA4OEMKKzoxMDVEQTAwMDEwMDAwMDFDMzI2MjAwRkY4RjgzMDA1NDhGODIwMDU0NjkKKzoxMDVEQjAwMDI0NzAwM0U4MDIwMjEwMjMyQzQyMDNFOTEwNDAwMDE0NkYKKzoxMDVEQzAwMDAwMDA5ODIxMjQxMTAwMTA4RjQyMDAwQzhGNDQwMTYwQzQKKzoxMDVERDAwMDhGNDUwMTY0OEY4NjAxMjBBRkIxMDAxMEFGQjIwMDE0NkYKKzoxMDVERTAwMEFGQTIwMDE4OEY0MjAxMEMyNDA3MDAwODAwNDBGODA5RjgKKzoxMDVERjAwMDI0QzYwMDFDMTQ0MEZGRTUwMDAwMDAwMDhGODIwMDU0MDAKKzoxMDVFMDAwMDAyMDIxMDIzMkM0MjAzRTkxNDQwRkZFRjAwMDAwMDAwQkYKKzoxMDVFMTAwMDMyNjIwMEZGMTQ0MDAwMTEwMDAwMDAwMDhGNDIwMzc4M0UKKzoxMDVFMjAwMDI0NDIwMDAxQUY0MjAzNzg4RjQyMDM3ODhGODIwMTIwMjEKKzoxMDVFMzAwMDhGQUIwMDM0QUZBMjAwMTA4RjgyMDEyNDNDMDQwMDAxMUMKKzoxMDVFNDAwMDI0ODQ2MzcwM0MwNTAwMDlBRkEyMDAxNDhENjYwMDAwMzUKKzoxMDVFNTAwMDM0QTUwNzAwMEMwMDJCM0IwM0MwMzgyMThGNDIwMkI4NDkKKzoxMDVFNjAwMDI0NDIwMDAxQUY0MjAyQjg4RjQyMDJCODhGNDIwMkY0Q0UKKzoxMDVFNzAwMDI0NDIwMDAxQUY0MjAyRjQ4RjQyMDJGNDhGQkYwMDU4NjcKKzoxMDVFODAwMDhGQkUwMDU0OEZCNTAwNTA4RkIzMDA0QzhGQjIwMDQ4QzYKKzoxMDVFOTAwMDhGQjEwMDQ0OEZCMDAwNDAwM0UwMDAwODI3QkQwMDYwRDAKKzoxMDVFQTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDI3QkRGRkUwMkYKKzoxMDVFQjAwMDI3NjQ0MDAwQUZCRjAwMTgwQzAwMkJBODI0MDUxMDAwNzkKKzoxMDVFQzAwMDNDMDMwMDAxMzQ2MzJDQzAzQzA0MDAwMTM0ODQyRUM4MjAKKzoxMDVFRDAwMDI0MDIwMDIwQUY4MjAxMUMwMkUzMTAyMUFGODAwMTAwRTgKKzoxMDVFRTAwMEFGODAwMTA0QUY4MDAxMDhBRjgwMDExMEFGODAwMTE0QzIKKzoxMDVFRjAwMEFGODAwMTE4QUY4MDAxMjBBRjgwMDEyNEFGODAwMTI4NUUKKzoxMDVGMDAwMEFGODAwMTMwQUY4MDAxMzRBRjgwMDEzOEFGNDIwMEVDODgKKzoxMDVGMTAwMDAyRTMxMDIxQUY0MjAwRjAwMkU0MTAyMUFGNDIwMEY0OEUKKzoxMDVGMjAwMDAyRTQxMDIxQUY0MjAwRjgzQzAyMDAwMTAwNTcxMDIxQUEKKzoxMDVGMzAwMDkwNDI0MEY0MTQ0MDAwMUMzQzA1MDAwMThGODIwMTFDN0IKKzoxMDVGNDAwMDNDMDQwMDAxMjQ4NDY0NzAzQzA1MDAwMTM0NDIwMDAxREIKKzoxMDVGNTAwMEFGODIwMTFDQUZBMDAwMTBBRkEwMDAxNDhGODYwMTFDRkYKKzoxMDVGNjAwMDM0QTUwMTAwMEMwMDJCM0IwMDAwMzgyMThDMDIwMjE4RTQKKzoxMDVGNzAwMDMwNDIwMDQwMTA0MDAwMTQwMDAwMDAwMDhGODIwMTFDREQKKzoxMDVGODAwMDNDMDQwMDAxMjQ4NDY0N0MzQzA1MDAwMTM0NDIwMDA0OEMKKzoxMDVGOTAwMEFGODIwMTFDQUZBMDAwMTBBRkEwMDAxNDhGODYwMTFDQkYKKzoxMDVGQTAwMDEwMDAwMDA3MzRBNTAyMDAzQzA0MDAwMTI0ODQ2NDg0MkUKKzoxMDVGQjAwMEFGQTAwMDEwQUZBMDAwMTQ4Rjg2MDExQzM0QTUwMzAwMTEKKzoxMDVGQzAwMDBDMDAyQjNCMDAwMDM4MjE4RkJGMDAxODAzRTAwMDA4QjUKKzoxMDVGRDAwMDI3QkQwMDIwOEZBOTAwMTA4RjgzMDEyQzhGQUEwMDE0RTkKKzoxMDVGRTAwMDhGQUIwMDE4MTA2MDAwMEEyNzYyNEZFMDE0NjIwMDAyQjUKKzoxMDVGRjAwMDI0NjgwMDIwMjc2ODQ4MDA4RjgyMDEyODExMDIwMDA0Q0QKKzoxMDYwMDAwMDAwMDAwMDAwOEY4MjAxMjQxNTAyMDAwNzAwMDAwMDAwM0MKKzoxMDYwMTAwMDhGNDMwMzM0MDAwMDEwMjEyNDYzMDAwMUFGNDMwMzM0OTUKKzoxMDYwMjAwMDEwMDAwMDM5OEY0MzAzMzRBQzY0MDAwMEFDNjUwMDA0RjkKKzoxMDYwMzAwMEFDNjYwMDA4QTQ2NzAwMEVBQzY5MDAxOEFDNkEwMDFDQ0UKKzoxMDYwNDAwMEFDNkIwMDEwQUM2MjAwMTRBRjg4MDEyMDhGNDIwMEZDRTIKKzoxMDYwNTAwMDhGNDQwMEY0MjQ0MkZGRkZBRjQyMDBGQzhDODIwMDAwMUEKKzoxMDYwNjAwMDEwNDkwMDA1MzA0MkZGOEYxMDQwMDAxOTMxMjJGRjhGODgKKzoxMDYwNzAwMDEwNDAwMDE4M0MwMjAwMDE4QzgzMDAwNDJDNjIwMDEwQzgKKzoxMDYwODAwMDEwNDAwMDEzM0MwMjAwMDEyNDYzMDAwMUFDODMwMDA0QjMKKzoxMDYwOTAwMDhGNDMwMEY4MzQ0MjMwQzgwMkUyMTAyMTU0NjIwMDA0RjkKKzoxMDYwQTAwMDI0NjIwMDA4M0MwMjAwMDEzNDQyMkVDODAyRTIxMDIxQTIKKzoxMDYwQjAwMDE0NDQwMDE1MjQwMjAwMDE4RjgyMDEyODI0NDIwMDIwOEMKKzoxMDYwQzAwMEFGODIwMTI4OEY4MjAxMjgxMDAwMDAwRjI0MDIwMDAxRjYKKzoxMDYwRDAwMDNDMDIwMDAxMzQ0MjMwQzgwMkUyMTAyMTU0ODIwMDA0MjQKKzoxMDYwRTAwMDI0ODIwMDA4M0MwMjAwMDEzNDQyMkVDODAyRTIxMDIxNDIKKzoxMDYwRjAwMDAwNDAyMDIxMjQwMjAwMDFBRjQ0MDBGNEFDODkwMDAwREMKKzoxMDYxMDAwMEFDODIwMDA0MjQwMjAwMDEwM0UwMDAwODAwMDAwMDAwNEIKKzoxMDYxMTAwMDAzRTAwMDA4MDAwMDAwMDA4RkE5MDAxMDhGODMwMTBDMkQKKzoxMDYxMjAwMDhGQUEwMDE0OEZBQjAwMTgxMDYwMDAwQTI3NjI0N0UwQTYKKzoxMDYxMzAwMDE0NjIwMDAyMjQ2ODAwMjAyNzY4NDAwMDhGODIwMTA4NTIKKzoxMDYxNDAwMDExMDIwMDA0MDAwMDAwMDA4RjgyMDEwNDE1MDIwMDA3MDQKKzoxMDYxNTAwMDAwMDAwMDAwOEY0MzAzMzgwMDAwMTAyMTI0NjMwMDAxNzkKKzoxMDYxNjAwMEFGNDMwMzM4MTAwMDAwMzU4RjQzMDMzOEFDNjQwMDAwQTAKKzoxMDYxNzAwMEFDNjUwMDA0QUM2NjAwMDhBNDY3MDAwRUFDNjkwMDE4QUEKKzoxMDYxODAwMEFDNkEwMDFDQUM2QjAwMTBBQzYyMDAxNEFGODgwMTAwNUMKKzoxMDYxOTAwMDhGNDQwMEVDOEM4MjAwMDAzMDQyMDAwNjEwNDAwMDE5NTEKKzoxMDYxQTAwMDMxMjIwMDA2MTA0MDAwMTgzQzAyMDAwMThDODMwMDA0REMKKzoxMDYxQjAwMDJDNjIwMDEwMTA0MDAwMTMzQzAyMDAwMTI0NjMwMDAxMTcKKzoxMDYxQzAwMEFDODMwMDA0OEY0MzAwRjAzNDQyMkVDMDAyRTIxMDIxNjEKKzoxMDYxRDAwMDU0NjIwMDA0MjQ2MjAwMDgzQzAyMDAwMTM0NDIyQ0MwRDYKKzoxMDYxRTAwMDAyRTIxMDIxMTQ0NDAwMTUyNDAyMDAwMThGODIwMTA4RUMKKzoxMDYxRjAwMDI0NDIwMDIwQUY4MjAxMDg4RjgyMDEwODEwMDAwMDBGQTYKKzoxMDYyMDAwMDI0MDIwMDAxM0MwMjAwMDEzNDQyMkVDMDAyRTIxMDIxQUYKKzoxMDYyMTAwMDU0ODIwMDA0MjQ4MjAwMDgzQzAyMDAwMTM0NDIyQ0MwNTUKKzoxMDYyMjAwMDAyRTIxMDIxMDA0MDIwMjEyNDAyMDAwMUFGNDQwMEVDRDIKKzoxMDYyMzAwMEFDODkwMDAwQUM4MjAwMDQyNDAyMDAwMTAzRTAwMDA4RTUKKzoxMDYyNDAwMDAwMDAwMDAwMDNFMDAwMDgwMDAwMDAwMDI3QkRGRkQ4QTgKKzoxMDYyNTAwMDNDMDQwMDAxMjQ4NDY0OEMzQzA1MDAwMUFGQkYwMDI0OTEKKzoxMDYyNjAwMEFGQjIwMDIwQUZCMTAwMUNBRkIwMDAxODhGOTAwMTA0OTYKKzoxMDYyNzAwMDhGOTEwMEIwOEY5MjAxMUMzNEE1MjUwMDhGODIwMTAwMDAKKzoxMDYyODAwMDAyNDAzMDIxMDIyMDM4MjFBRkEyMDAxMDBDMDAyQjNCMkQKKzoxMDYyOTAwMEFGQjAwMDE0OEUwMjAwMDhBRkEyMDAxMDhFMDIwMDBDRjYKKzoxMDYyQTAwMDNDMDQwMDAxMjQ4NDY0OThBRkEyMDAxNDhFMDYwMDAwMTAKKzoxMDYyQjAwMDhFMDcwMDA0M0MwNTAwMDEwQzAwMkIzQjM0QTUyNTEwODMKKzoxMDYyQzAwMDhFMDIwMDE4QUZBMjAwMTA4RTAyMDAxQzNDMDQwMDAxRDgKKzoxMDYyRDAwMDI0ODQ2NEE0QUZBMjAwMTQ4RTA2MDAxMDhFMDcwMDE0NUMKKzoxMDYyRTAwMDNDMDUwMDAxMEMwMDJCM0IzNEE1MjUyMDNDMDI3RjAwMUYKKzoxMDYyRjAwMDAyMjIxMDI0M0MwMzA4MDA1NDQzMDAxNjNDMDMwMjAwMTEKKzoxMDYzMDAwMDhGODIwMDlDMzA0MkZGRkYxNDQwMDAxMjNDMDMwMjAwQzkKKzoxMDYzMTAwMDNDMDQwMDAxMjQ4NDY0QjAzQzA1MDAwMjM0QTVGMDMwNDQKKzoxMDYzMjAwMDAwMDAzMDIxMDAwMDM4MjEzNjQyMDAwMkFGODIwMTFDRkIKKzoxMDYzMzAwMDM2MjIwMDAxQUY4MjAwQjBBRjkwMDEwNEFGOTIwMTFDODEKKzoxMDYzNDAwMEFGQTAwMDEwMEMwMDJCM0JBRkEwMDAxNDEwMDAwMDI0RTUKKzoxMDYzNTAwMDAwMDAwMDAwMDJDMzEwMjQxMDQwMDAwRDAyMjMxMDI0OEUKKzoxMDYzNjAwMDEwNDAwMDBCMzY0MjAwMDJBRjgyMDExQzM2MjIwMDAxQjEKKzoxMDYzNzAwMEFGODIwMEIwQUY5MDAxMDRBRjkyMDExQzhGNDIwMzMwOTYKKzoxMDYzODAwMDI0NDIwMDAxQUY0MjAzMzAxMDAwMDAxNThGNDIwMzMwNTkKKzoxMDYzOTAwMDNDMDQwMDAxMjQ4NDY0QjgyNDAyMDJBOUFGQTIwMDEwQzYKKzoxMDYzQTAwMEFGQTAwMDE0OEY4NjAxNDQzQzA3MDAwMTI0RTc2NEMwQkQKKzoxMDYzQjAwMDBDMDAyQjNCMzQwNURFQUQ4RjgyMDExQzM0NDIwMDAyMDEKKzoxMDYzQzAwMEFGODIwMTFDOEY4MjAyMjAzNDQyMDAwNEFGODIwMjIwN0YKKzoxMDYzRDAwMDhGODIwMTQwM0MwMzAwMDEwMDQzMTAyNUFGODIwMTQwNDEKKzoxMDYzRTAwMDhGQkYwMDI0OEZCMjAwMjA4RkIxMDAxQzhGQjAwMDE4MjcKKzoxMDYzRjAwMDAzRTAwMDA4MjdCRDAwMjgyN0JERkZEODNDMDQwMDAxQUEKKzoxMDY0MDAwMDI0ODQ2NEU4M0MwNTAwMDFBRkJGMDAyNEFGQjIwMDIwNDMKKzoxMDY0MTAwMEFGQjEwMDFDQUZCMDAwMTg4RjkwMDEyNDhGOTEwMEEwODUKKzoxMDY0MjAwMDhGOTIwMTFDMzRBNTI2MDA4RjgyMDEyMDAyNDAzMDIxNkEKKzoxMDY0MzAwMDAyMjAzODIxQUZBMjAwMTAwQzAwMkIzQkFGQjAwMDE0OUIKKzoxMDY0NDAwMDhFMDIwMDA4QUZBMjAwMTA4RTAyMDAwQzNDMDQwMDAxNzYKKzoxMDY0NTAwMDI0ODQ2NEY0QUZBMjAwMTQ4RTA2MDAwMDhFMDcwMDA0QUEKKzoxMDY0NjAwMDNDMDUwMDAxMEMwMDJCM0IzNEE1MjYxMDhFMDIwMDE4QzEKKzoxMDY0NzAwMEFGQTIwMDEwOEUwMjAwMUMzQzA0MDAwMTI0ODQ2NTAwQzEKKzoxMDY0ODAwMEFGQTIwMDE0OEUwNjAwMTA4RTA3MDAxNDNDMDUwMDAxMTgKKzoxMDY0OTAwMDBDMDAyQjNCMzRBNTI2MjAzQzAyN0YwMDAyMjIxMDI0NTYKKzoxMDY0QTAwMDNDMDMwODAwNTQ0MzAwMTYzQzAzMDIwMDhGODIwMEFDRkEKKzoxMDY0QjAwMDMwNDJGRkZGMTQ0MDAwMTIzQzAzMDIwMDNDMDQwMDAxODQKKzoxMDY0QzAwMDI0ODQ2NTBDM0MwNTAwMDEzNEE1RjAzMDAwMDAzMDIxMjcKKzoxMDY0RDAwMDAwMDAzODIxMzY0MjAwMDJBRjgyMDExQzM2MjIwMDAxNDIKKzoxMDY0RTAwMEFGODIwMEEwQUY5MDAxMjRBRjkyMDExQ0FGQTAwMDEwQkEKKzoxMDY0RjAwMDBDMDAyQjNCQUZBMDAwMTQxMDAwMDAyNDAwMDAwMDAwOTMKKzoxMDY1MDAwMDAyQzMxMDI0MTA0MDAwMEQwMjIzMTAyNDEwNDAwMDBCODEKKzoxMDY1MTAwMDM2NDIwMDAyQUY4MjAxMUMzNjIyMDAwMUFGODIwMEEwODkKKzoxMDY1MjAwMEFGOTAwMTI0QUY5MjAxMUM4RjQyMDMyQzI0NDIwMDAxNDIKKzoxMDY1MzAwMEFGNDIwMzJDMTAwMDAwMTU4RjQyMDMyQzNDMDQwMDAxRDUKKzoxMDY1NDAwMDI0ODQ2NEI4MjQwMjAyRTJBRkEyMDAxMEFGQTAwMDE0QjkKKzoxMDY1NTAwMDhGODYwMTQ0M0MwNzAwMDEyNEU3NjRDMDBDMDAyQjNCRkMKKzoxMDY1NjAwMDM0MDVERUFEOEY4MjAxMUMzNDQyMDAwMkFGODIwMTFDNzMKKzoxMDY1NzAwMDhGODIwMjIwMzQ0MjAwMDRBRjgyMDIyMDhGODIwMTQwQzkKKzoxMDY1ODAwMDNDMDMwMDAxMDA0MzEwMjVBRjgyMDE0MDhGQkYwMDI0NkYKKzoxMDY1OTAwMDhGQjIwMDIwOEZCMTAwMUM4RkIwMDAxODAzRTAwMDA4RkMKKzoxMDY1QTAwMDI3QkQwMDI4MDAwMDYwMjEwMDAwNTAyMTAwMDAzMDIxOUMKKzoxMDY1QjAwMDAwMDAyODIxMDAwMDY4MjEwMDAwNDgyMTAwMDA3ODIxMDcKKzoxMDY1QzAwMDAwMDA3MDIxOEY4ODAxMjQ4Rjg3MDEwNDE1ODAwMDJFMjAKKzoxMDY1RDAwMDhGOEIwMTFDMTFBMDAwMTQzMTYyMDgwMDhGODIwMTIwRjIKKzoxMDY1RTAwMDEwNDYwMDI5MDAwMDAwMDAzQzA0MDAwMThDODQ2RUU0ODkKKzoxMDY1RjAwMDhDQzIwMDAwOENDMzAwMDRBQzgyMDAwMEFDODMwMDA0OTkKKzoxMDY2MDAwMDhDQzIwMDA4QUM4MjAwMDg5NEMyMDAwRUE0ODIwMDBFNjYKKzoxMDY2MTAwMDhDQzIwMDEwMjQwQzAwMDFBQzgyMDAxMDhDQzIwMDE0NEIKKzoxMDY2MjAwMDEwMDAwMDEyMjRDNjAwMjAxMDQwMDAxNzAwMDAwMDAwRDcKKzoxMDY2MzAwMDNDMDQwMDAxOEM4NDZFRTQ4RDAyMDAwMDhEMDMwMDA0OTQKKzoxMDY2NDAwMEFDODIwMDAwQUM4MzAwMDQ4RDAyMDAwOEFDODIwMDA4MUMKKzoxMDY2NTAwMDk1MDIwMDBFQTQ4MjAwMEU4RDAyMDAxMDI1MDYwMDIwNzcKKzoxMDY2NjAwMEFDODIwMDEwOEQwMjAwMTQyNDBDMDAwMTAwQzAxODIxMUYKKzoxMDY2NzAwMEFDODIwMDE0Mjc2MjRGRTAwMDQzMTAyQjU0NDAwMDAxMEQKKzoxMDY2ODAwMDI3NjM0ODAwMDA2MDMwMjExNTQwMDAyRjMxNjIwMTAwNkYKKzoxMDY2OTAwMDExMjAwMDE0MzE2MjgwMDA4RjgyMDEwMDEwNDUwMDJBMTEKKzoxMDY2QTAwMDMxNjIwMTAwM0MwNDAwMDE4Qzg0NkVFMDhDQTIwMDAwODkKKzoxMDY2QjAwMDhDQTMwMDA0QUM4MjAwMDBBQzgzMDAwNDhDQTIwMDA4MTAKKzoxMDY2QzAwMEFDODIwMDA4OTRBMjAwMEVBNDgyMDAwRThDQTIwMDEwREUKKzoxMDY2RDAwMDI0MEEwMDAxQUM4MjAwMTA4Q0EyMDAxNDEwMDAwMDEyRTkKKzoxMDY2RTAwMDI0QTUwMDIwMTA0MDAwMTgzMTYyMDEwMDNDMDQwMDAxODQKKzoxMDY2RjAwMDhDODQ2RUUwOENFMjAwMDA4Q0UzMDAwNEFDODIwMDAwMkQKKzoxMDY3MDAwMEFDODMwMDA0OENFMjAwMDhBQzgyMDAwODk0RTIwMDBFMjYKKzoxMDY3MTAwMEE0ODIwMDBFOENFMjAwMTAyNEU1MDAyMEFDODIwMDEwNjAKKzoxMDY3MjAwMDhDRTIwMDE0MjQwQTAwMDEwMEEwMTgyMUFDODIwMDE0OUQKKzoxMDY3MzAwMDI3NjI0N0UwMDA0MzEwMkI1NDQwMDAwMTI3NjM0MDAwQ0MKKzoxMDY3NDAwMDAwNjAyODIxMzE2MjAxMDA1NDQwMDAxRDMxNjIxMDAwQjgKKzoxMDY3NTAwMDExQTAwMDA5MzFBMjA4MDAxMDQwMDAwNDI1MDIwMDIwMDkKKzoxMDY3NjAwMDhGODIwMEE4QTVFMjAwMDAyNTAyMDAyMEFGODIwMTI0NEMKKzoxMDY3NzAwMDhGODgwMTI0MDAwMDY4MjExMTgwMDAxMTMxNjIxMDAwMEYKKzoxMDY3ODAwMDNDMDQwMDAxOEM4NDZFRTQ4QzgyMDAwMDhDODMwMDA0NDUKKzoxMDY3OTAwMEFGODIwMDgwQUY4MzAwODQ4QzgyMDAwOEFGODIwMEE0QTcKKzoxMDY3QTAwMDk0ODIwMDBFQUY4MjAwQUM4QzgyMDAxMDAwMDA2MDIxNDkKKzoxMDY3QjAwMEFGODIwMEEwOEM4RDAwMTA4QzhGMDAxNDMxNjIxMDAwMEQKKzoxMDY3QzAwMDE0NDBGRjgyMDAwMDAwMDAxMTIwMDAwRjMxMjIwODAwNTkKKzoxMDY3RDAwMDEwNDAwMDA0M0MwMjAwMDI4RjgyMDBCOEE1QzIwMDAwRjUKKzoxMDY3RTAwMDNDMDIwMDAyMDEyMjEwMjQxMDQwMDAwNDI0RTIwMDIwOTgKKzoxMDY3RjAwMDhGODIwMEI0QUY4MjAwRDQyNEUyMDAyMEFGODIwMTA0NzMKKzoxMDY4MDAwMDhGODcwMTA0MDAwMDQ4MjExMTQwRkY3MDAwMDAwMDAwNDQKKzoxMDY4MTAwMDNDMDQwMDAxOEM4NDZFRTA4QzgyMDAwMDhDODMwMDA0QjgKKzoxMDY4MjAwMEFGODIwMDkwQUY4MzAwOTQ4QzgyMDAwOEFGODIwMEI0RTYKKzoxMDY4MzAwMDk0ODIwMDBFQUY4MjAwOUM4QzgyMDAxMDAwMDA1MDIxRDgKKzoxMDY4NDAwMEFGODIwMEIwOEM4OTAwMTAxMDAwRkY2MDhDOEUwMDE0QTUKKzoxMDY4NTAwMDAzRTAwMDA4MDAwMDAwMDAwMDAwNjAyMTAwMDA1ODIxNTMKKzoxMDY4NjAwMDAwMDAzMDIxMDAwMDI4MjEwMDAwNjgyMTAwMDA1MDIxOTQKKzoxMDY4NzAwMDAwMDA3ODIxMDAwMDcwMjE4Rjg4MDEyNDhGODcwMTA0OTcKKzoxMDY4ODAwMDNDMTgwMTAwMTU4MDAwMkU4Rjg5MDExQzExQTAwMDE0RjYKKzoxMDY4OTAwMDMxMjIwODAwOEY4MjAxMjAxMDQ2MDAyOTAwMDAwMDAwRUMKKzoxMDY4QTAwMDNDMDQwMDAxOEM4NDZFRTQ4Q0MyMDAwMDhDQzMwMDA0QTQKKzoxMDY4QjAwMEFDODIwMDAwQUM4MzAwMDQ4Q0MyMDAwOEFDODIwMDA4RUIKKzoxMDY4QzAwMDk0QzIwMDBFQTQ4MjAwMEU4Q0MyMDAxMDI0MEMwMDAxQTEKKzoxMDY4RDAwMEFDODIwMDEwOENDMjAwMTQxMDAwMDAxMjI0QzYwMDIwRUMKKzoxMDY4RTAwMDEwNDAwMDE3MDAwMDAwMDAzQzA0MDAwMThDODQ2RUU0OUUKKzoxMDY4RjAwMDhEMDIwMDAwOEQwMzAwMDRBQzgyMDAwMEFDODMwMDA0MTQKKzoxMDY5MDAwMDhEMDIwMDA4QUM4MjAwMDg5NTAyMDAwRUE0ODIwMDBFRTEKKzoxMDY5MTAwMDhEMDIwMDEwMjUwNjAwMjBBQzgyMDAxMDhEMDIwMDE0QUMKKzoxMDY5MjAwMDI0MEMwMDAxMDBDMDE4MjFBQzgyMDAxNDI3NjI0RkUwNDMKKzoxMDY5MzAwMDAwNDMxMDJCNTQ0MDAwMDEyNzYzNDgwMDAwNjAzMDIxQzEKKzoxMDY5NDAwMDE1NjAwMDJGMzEyMjAxMDAxMTQwMDAxNDMxMjI4MDAwMTcKKzoxMDY5NTAwMDhGODIwMTAwMTA0NTAwMkEzMTIyMDEwMDNDMDQwMDAxMTEKKzoxMDY5NjAwMDhDODQ2RUUwOENBMjAwMDA4Q0EzMDAwNEFDODIwMDAwM0EKKzoxMDY5NzAwMEFDODMwMDA0OENBMjAwMDhBQzgyMDAwODk0QTIwMDBFMzQKKzoxMDY5ODAwMEE0ODIwMDBFOENBMjAwMTAyNDBCMDAwMUFDODIwMDEwMjcKKzoxMDY5OTAwMDhDQTIwMDE0MTAwMDAwMTIyNEE1MDAyMDEwNDAwMDE4NDIKKzoxMDY5QTAwMDMxMjIwMTAwM0MwNDAwMDE4Qzg0NkVFMDhDRTIwMDAwODYKKzoxMDY5QjAwMDhDRTMwMDA0QUM4MjAwMDBBQzgzMDAwNDhDRTIwMDA4OEQKKzoxMDY5QzAwMEFDODIwMDA4OTRFMjAwMEVBNDgyMDAwRThDRTIwMDEwNUIKKzoxMDY5RDAwMDI0RTUwMDIwQUM4MjAwMTA4Q0UyMDAxNDI0MEIwMDAxOUUKKzoxMDY5RTAwMDAwQTAxODIxQUM4MjAwMTQyNzYyNDdFMDAwNDMxMDJCNUUKKzoxMDY5RjAwMDU0NDAwMDAxMjc2MzQwMDAwMDYwMjgyMTMxMjIwMTAwM0IKKzoxMDZBMDAwMDU0NDAwMDFEMzEyMjEwMDAxMUEwMDAwOTMxQTIwODAwREQKKzoxMDZBMTAwMDEwNDAwMDA0MjUwMjAwMjA4RjgyMDBBOEE1RTIwMDAwOUIKKzoxMDZBMjAwMDI1MDIwMDIwQUY4MjAxMjQ4Rjg4MDEyNDAwMDA2ODIxMDQKKzoxMDZBMzAwMDExODAwMDExMzEyMjEwMDAzQzA0MDAwMThDODQ2RUU0QUUKKzoxMDZBNDAwMDhDODIwMDAwOEM4MzAwMDRBRjgyMDA4MEFGODMwMDg0QkUKKzoxMDZBNTAwMDhDODIwMDA4QUY4MjAwQTQ5NDgyMDAwRUFGODIwMEFDNEEKKzoxMDZBNjAwMDhDODIwMDEwMDAwMDYwMjFBRjgyMDBBMDhDOEQwMDEwOEQKKzoxMDZBNzAwMDhDOEYwMDE0MzEyMjEwMDAxNDQwMDAyMjAwMDAwMDAwMEUKKzoxMDZBODAwMDExNDAwMDBGMzE0MjA4MDAxMDQwMDAwNDNDMDIwMDAyOTcKKzoxMDZBOTAwMDhGODIwMEI4QTVDMjAwMDAzQzAyMDAwMjAxNDIxMDI0MEYKKzoxMDZBQTAwMDEwNDAwMDA0MjRFMjAwMjA4RjgyMDBCNEFGODIwMEQ0QTIKKzoxMDZBQjAwMDI0RTIwMDIwQUY4MjAxMDQ4Rjg3MDEwNDAwMDA1MDIxRUUKKzoxMDZBQzAwMDExNjAwMDEwMDAwMDAwMDAzQzA0MDAwMThDODQ2RUUwQTYKKzoxMDZBRDAwMDhDODIwMDAwOEM4MzAwMDRBRjgyMDA5MEFGODMwMDk0MEUKKzoxMDZBRTAwMDhDODIwMDA4QUY4MjAwQjQ5NDgyMDAwRUFGODIwMDlDQkEKKzoxMDZBRjAwMDhDODIwMDEwMDAwMDU4MjFBRjgyMDBCMDhDOEEwMDEwRjgKKzoxMDZCMDAwMDhDOEUwMDE0OEY4MjAwNzAzQzAzMTAwMDAwNDMxMDI0MTAKKzoxMDZCMTAwMDEwNDBGRjVDMDAwMDAwMDA4RjgyMDA1NDI0NDIwMDA1RkEKKzoxMDZCMjAwMEFGODIwMDc4OEMwNDAyMzQxMDgwMDAxNjAwMDAxODIxMTcKKzoxMDZCMzAwMDNDMDIwMDAxMDA1NzEwMjE4QzQyNDBFODI0NDIwMDA1MkQKKzoxMDZCNDAwMDNDMDEwMDAxMDAzNzA4MjFBQzIyNDBFODNDMDIwMDAxNzIKKzoxMDZCNTAwMDAwNTcxMDIxOEM0MjQwRTgwMDQ0MTAyQjE0NDAwMDA5REIKKzoxMDZCNjAwMDI0MDIwMDAxM0MwMzAwODAzQzAxMDAwMTAwMzcwODIxQTEKKzoxMDZCNzAwMEFDMjA0MEU4M0MwMTAwMDEwMDM3MDgyMTEwMDAwMDBDNjcKKzoxMDZCODAwMEEwMjI0MEYwM0MwMjAwMDEwMDU3MTAyMTkwNDI0MEYwNEEKKzoxMDZCOTAwMDE0NDAwMDA2M0MwMjAwODAzQzAyMDAwMTAwNTcxMDIxMTYKKzoxMDZCQTAwMDkwNDI0MEYxMTA0MDAwMDIzQzAyMDA4MDAwNjIxODI1MzMKKzoxMDZCQjAwMDhDMDQwMjMwMTA4MDAwMTMwMDAwMDAwMDNDMDIwMDAxMzEKKzoxMDZCQzAwMDAwNTcxMDIxOEM0MjQwRUMyNDQyMDAwNTNDMDEwMDAxOUEKKzoxMDZCRDAwMDAwMzcwODIxQUMyMjQwRUMzQzAyMDAwMTAwNTcxMDIxOTQKKzoxMDZCRTAwMDhDNDI0MEVDMDA0NDEwMkIxNDQwMDAwNjAwMDAwMDAwRDIKKzoxMDZCRjAwMDNDMDEwMDAxMDAzNzA4MjFBQzIwNDBFQzEwMDAwMDA2RTkKKzoxMDZDMDAwMDAwNzgxODI1M0MwMjAwMDEwMDU3MTAyMTkwNDI0MEYyMDQKKzoxMDZDMTAwMDU0NDAwMDAxMDA3ODE4MjUxMDYwRkYxQTAwMDAwMDAwQTEKKzoxMDZDMjAwMDhGNDIwMDAwMTA0MDAwMDcwMDAwMDAwMEFGODAwMDRDQzEKKzoxMDZDMzAwMDhGODIwMDRDMTA0MEZGRkQwMDAwMDAwMDEwMDAwMDA1OTYKKzoxMDZDNDAwMDAwMDAwMDAwQUY4MDAwNDg4RjgyMDA0ODEwNDBGRkZEMjgKKzoxMDZDNTAwMDAwMDAwMDAwOEY4MjAwNjAwMDQzMTAyNUFGODIwMDYwQkEKKzoxMDZDNjAwMDhGNDIwMDAwMTA0MDAwMDMwMDAwMDAwMDEwMDBGRjA1RUMKKzoxMDZDNzAwMEFGODAwMDRDMTAwMEZGMDNBRjgwMDA0ODAzRTAwMDA4MjUKKzoxMDZDODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDNDMDIwMDAxQzUKKzoxMDZDOTAwMDhDNDI2RDI4MjdCREZGRThBRkJGMDAxNDE0NDAwMDEyREUKKzoxMDZDQTAwMEFGQjAwMDEwM0MxMDAwMDEyNjEwNkY5MDAyMDAyMDIxQjAKKzoxMDZDQjAwMDBDMDAyQkE4MjQwNTIwMDAyNjAyMUZFMDNDMDEwMDAxNDcKKzoxMDZDQzAwMEFDMjI2RUVDM0MwMTAwMDFBQzIyNkVFOEFDMDIwMjUwM0EKKzoxMDZDRDAwMDI0MDIyMDAwQUMxMDAyNTRBQzAyMDI1ODI0MDIwMDAxMkQKKzoxMDZDRTAwMDNDMDEwMDAxQUMyMjZEMjg4RkJGMDAxNDhGQjAwMDEwNTIKKzoxMDZDRjAwMDAzRTAwMDA4MjdCRDAwMTgzQzA5MDAwMThEMjk2RUVDNTcKKzoxMDZEMDAwMDhDODIwMDAwOEZBMzAwMTA4RkE4MDAxNEFEMjIwMDAwMTkKKzoxMDZEMTAwMDhDODIwMDA0QUQyNTAwMDhBRDIyMDAwNDhGODIwMDU0NEYKKzoxMDZEMjAwMEFEMjYwMDEwQUQyNzAwMTRBRDIzMDAxOEFEMjgwMDFDQkYKKzoxMDZEMzAwMEFEMjIwMDBDMjUyOUZGRTAzQzAyMDAwMTI0NDI2RjkwQTcKKzoxMDZENDAwMDAxMjIxMDJCMTA0MDAwMDMwMDAwMDAwMDNDMDkwMDAxNEMKKzoxMDZENTAwMDhEMjk2RUU4M0MwMjAwMDE4QzQyNkQxMEFEMjIwMDAwQ0UKKzoxMDZENjAwMDNDMDIwMDAxOEM0MjZEMTAzQzAxMDAwMUFDMjk2RUVDMkMKKzoxMDZENzAwMEFEMjIwMDA0QUMwOTAyNTAwM0UwMDAwODAwMDAwMDAwNEUKKzoxMDZEODAwMDI3QkRGRkQwQUZCMDAwMTAzQzEwMDAwMThFMTA2RUVDOUMKKzoxMDZEOTAwMDNDMDIwMDAxOEM0MjZEMTBBRkIxMDAxNDAwODA4ODIxQ0MKKzoxMDZEQTAwMEFGQkUwMDI0OEZCRTAwNDA4RkE0MDA0OEFGQjIwMDE4RDEKKzoxMDZEQjAwMDAwQTA5MDIxQUZCRjAwMjhBRkI1MDAyMEFGQjMwMDFDRUEKKzoxMDZEQzAwMEFFMDIwMDAwM0MwMjAwMDE4QzQyNkQxMDAwQzA5ODIxMTAKKzoxMDZERDAwMDAwRTBBODIxMTA4MDAwMDZBRTAyMDAwNDI2MDUwMDA4OEQKKzoxMDZERTAwMDBDMDAyQkIzMjQwNjAwMTgxMDAwMDAwNTI2MTBGRkUwNEQKKzoxMDZERjAwMDI2MDQwMDA4MEMwMDJCQTgyNDA1MDAxODI2MTBGRkUwMkMKKzoxMDZFMDAwMDNDMDMwMDAxMjQ2MzZGOTAwMjAzMTAyQjEwNDAwMDAzMjkKKzoxMDZFMTAwMDAwMDAwMDAwM0MxMDAwMDE4RTEwNkVFODhFMjIwMDAwODEKKzoxMDZFMjAwMEFFMDIwMDAwOEUyMjAwMDRBRTEyMDAwOEFFMDIwMDA0ODIKKzoxMDZFMzAwMDhGODIwMDU0QUUxMzAwMTBBRTE1MDAxNEFFMUUwMDE4NjEKKzoxMDZFNDAwMDhGQTgwMDQ0QUUwODAwMUNBRTAyMDAwQzI2MTBGRkUwMjQKKzoxMDZFNTAwMDAyMDMxMDJCMTA0MDAwMDMwMDAwMDAwMDNDMTAwMDAxNTIKKzoxMDZFNjAwMDhFMTA2RUU4M0MwMjAwMDE4QzQyNkQxMEFFMDIwMDAwRjQKKzoxMDZFNzAwMDNDMDIwMDAxOEM0MjZEMTAzQzAxMDAwMUFDMzA2RUVDMTQKKzoxMDZFODAwMEFFMDIwMDA0QUMxMDAyNTA4RkJGMDAyODhGQkUwMDI0NTkKKzoxMDZFOTAwMDhGQjUwMDIwOEZCMzAwMUM4RkIyMDAxODhGQjEwMDE0ODMKKzoxMDZFQTAwMDhGQjAwMDEwMDNFMDAwMDgyN0JEMDAzMDAwODUxODIxRDYKKzoxMDZFQjAwMDAwODMxMDJCMTA0MDAwMDYwMDAwMDAwMEFDODAwMDAwOTIKKzoxMDZFQzAwMDI0ODQwMDA0MDA4MzEwMkI1NDQwRkZGREFDODAwMDAwOUMKKzoxMDZFRDAwMDAzRTAwMDA4MDAwMDAwMDAwMEE2MTgyMTAwQTMxMDJCMEEKKzoxMDZFRTAwMDEwNDAwMDA3MDAwMDAwMDA4QzgyMDAwMEFDQTIwMDAwRUYKKzoxMDZFRjAwMDI0QTUwMDA0MDBBMzEwMkIxNDQwRkZGQjI0ODQwMDA0RUQKKzoxMDZGMDAwMDAzRTAwMDA4MDAwMDAwMDAwMDg2MTgyMTAwODMxMDJCMTkKKzoxMDZGMTAwMDEwNDAwMDA3MDAwMDAwMDA4Q0EyMDAwMEFDODIwMDAwQkUKKzoxMDZGMjAwMDI0ODQwMDA0MDA4MzEwMkIxNDQwRkZGQjI0QTUwMDA0REMKKzoxMDZGMzAwMDAzRTAwMDA4MDAwMDAwMDAwMDA2MzA4MDAwODYxODIxRjEKKzoxMDZGNDAwMDAwODMxMDJCMTA0MDAwMDYwMDAwMDAwMEFDODUwMDAwRkMKKzoxMDZGNTAwMDI0ODQwMDA0MDA4MzEwMkI1NDQwRkZGREFDODUwMDAwMDYKKzoxMDZGNjAwMDAzRTAwMDA4MDAwMDAwMDAwMDAwMDAwMDI2RTUwMDI4MDMKKzoxMDZGNzAwMDAwQTAzMDIxMjc0MzAxQzA4RjREMDM1ODhGNDcwMzVDODkKKzoxMDZGODAwMDhGNDgwMzYwOEY0OTAzNjQ4RjRBMDM2ODhGNEIwMjA0NjQKKzoxMDZGOTAwMDhGNEMwMjAwMjQ2NDA0MDAwMDY0MTAyQjEwNDAwMDA4OTEKKzoxMDZGQTAwMDNDMDIwOEZGOENDMjAwMDBBQzYyMDAwMDI0NjMwMDA0QjUKKzoxMDZGQjAwMDAwNjQxMDJCMTQ0MEZGRkIyNEM2MDAwNDNDMDIwOEZGQjEKKzoxMDZGQzAwMDM0NDJGRkZGM0MwM0MwRkZBRjREMDM1OEFGNDcwMzVDQTMKKzoxMDZGRDAwMEFGNDgwMzYwQUY0OTAzNjRBRjRBMDM2OEFGNEIwMjA0OTQKKzoxMDZGRTAwMEFGNEMwMjAwOEY4NDAyMjAzNDYzRkZGRjhGODYwMjAwQzMKKzoxMDZGRjAwMDAwODIxMDI0MzQ0MjAwMDQwMEMzMTgyNDM0NjMwMDA0QzcKKzoxMDcwMDAwMEFGODIwMjIwQUY4MzAyMDA4Q0EyMDIxNEFDMDIwMDg0ODMKKzoxMDcwMTAwMDhDQTIwMjE4QUMwMjAwODg4Q0EyMDIxQ0FDMDIwMDhDNkMKKzoxMDcwMjAwMDhDQTIwMjIwQUMwMjAwOTA4Q0EyMDIyNEFDMDIwMDk0M0MKKzoxMDcwMzAwMDhDQTIwMjI4QUMwMjAwOTg4Q0EyMDIyQ0FDMDIwMDlDMEMKKzoxMDcwNDAwMDhDQTIwMjMwQUMwMjAwQTA4Q0EyMDIzNEFDMDIwMEE0REMKKzoxMDcwNTAwMDhDQTIwMjM4QUMwMjAwQTg4Q0EyMDIzQ0FDMDIwMEFDQUMKKzoxMDcwNjAwMDhDQTIwMjQwQUMwMjAwQjA4Q0EyMDI0NEFDMDIwMEI0N0MKKzoxMDcwNzAwMDhDQTIwMjQ4QUMwMjAwQjg4Q0EyMDI0Q0FDMDIwMEJDNEMKKzoxMDcwODAwMDhDQTIwMDFDQUMwMjAwODA4Q0EyMDAxOEFDMDIwMEMwRDQKKzoxMDcwOTAwMDhDQTIwMDIwQUMwMjAwQ0M4Q0EyMDAyNEFDMDIwMEQwNTgKKzoxMDcwQTAwMDhDQTIwMUQwQUMwMjAwRTA4Q0EyMDFENEFDMDIwMEU0QkUKKzoxMDcwQjAwMDhDQTIwMUQ4QUMwMjAwRTg4Q0EyMDFEQ0FDMDIwMEVDOEUKKzoxMDcwQzAwMDhDQTIwMUUwQUMwMjAwRjA4Q0EyMDA5ODhDQTMwMDlDODIKKzoxMDcwRDAwMEFDMDMwMEZDOENBMjAwQTg4Q0EzMDBBQ0FDMDMwMEY0QjEKKzoxMDcwRTAwMDhDQTIwMEEwOENBMzAwQTQzMDg0MDAwNEFDMDMwMEY4QTAKKzoxMDcwRjAwMDE0ODAwMDA3MzBDMjAwMDQ4RjgyMDIyMDNDMDMwOEZGODYKKzoxMDcxMDAwMDM0NjNGRkZCMDA0MzEwMjRBRjgyMDIyMDMwQzIwMDA0MkUKKzoxMDcxMTAwMDE0NDAwMDA2MDAwMDAwMDA4RjgyMDIwMDNDMDNDMEZGMDQKKzoxMDcxMjAwMDM0NjNGRkZCMDA0MzEwMjRBRjgyMDIwMDhGNDIwMkRDNzUKKzoxMDcxMzAwMEEzNDAwNUM1MjQ0MjAwMDFBRjQyMDJEQzhGNDIwMkRDQkQKKzoxMDcxNDAwMDAzRTAwMDA4MDAwMDAwMDAyN0JERkZEOEFGQkYwMDI0MDcKKzoxMDcxNTAwMEFGQjAwMDIwOEY0MzAwMjQ4RjQyMDAyMDEwNjIwMDM4MUYKKzoxMDcxNjAwMDAwMDAwMDAwOEY0MzAwMjA4RjQyMDAyNDAwNjIyMDIzOTMKKzoxMDcxNzAwMDA0ODEwMDAzMDAwMDAwMDA4RjQyMDA0MDAwODIyMDIxQjMKKzoxMDcxODAwMDhGNDMwMDMwOEY0MjAwMjQwMDQzMTAyQjE0NDAwMDA1MzEKKzoxMDcxOTAwMDAwMDAwMDAwOEY0MzAwNDA4RjQyMDAyNDEwMDAwMDA1RDMKKzoxMDcxQTAwMDAwNjIxMDIzOEY0MjAwMzA4RjQzMDAyNDAwNDMxMDIzREQKKzoxMDcxQjAwMDI0NDJGRkZGMDA0MDYwMjEwMDhDMTAyQTU0NDAwMDAxNEYKKzoxMDcxQzAwMDAwODA2MDIxOEY0QTAwMjQ4RjQ5MDA0MDhGNDgwMDI0QUUKKzoxMDcxRDAwMDhGNDQwMTgwOEY0NTAxODQ4RjQ2MDAyNDhGNEIwMDFDMTMKKzoxMDcxRTAwMDI0MDcwMDAxQUZBNzAwMTAwMDA4NDEwMDAxMDAxODIxOEEKKzoxMDcxRjAwMDAxNEM1MDIxMjUyOUZGRkYwMTQ5ODAyNEFGQjAwMDE0MjQKKzoxMDcyMDAwMDhGNDcwMDE0MDAwMDEwMjEwMDA2MzEwMEFGQTcwMDE4QkUKKzoxMDcyMTAwMDAwQTMyODIxMDBBMzM4MkIwMDgyMjAyMTAwODcyMDIxRjEKKzoxMDcyMjAwMDhGNDIwMTA4MDE2NjMwMjEwMDQwRjgwOTAwMEMzOTAwNDYKKzoxMDcyMzAwMDU0NDAwMDAxQUY1MDAwMjQ4RjQzMDAyNDhGNDIwMDIwQUYKKzoxMDcyNDAwMDE0NjIwMDE4MDAwMDAwMDA4RjQyMDAwMDEwNDAwMDA3ODgKKzoxMDcyNTAwMDAwMDAwMDAwQUY4MDAwNEM4RjgyMDA0QzEwNDBGRkZEMEEKKzoxMDcyNjAwMDAwMDAwMDAwMTAwMDAwMDUwMDAwMDAwMEFGODAwMDQ4OTIKKzoxMDcyNzAwMDhGODIwMDQ4MTA0MEZGRkQwMDAwMDAwMDhGODIwMDYwRjgKKzoxMDcyODAwMDI0MDNGRkVGMDA0MzEwMjRBRjgyMDA2MDhGNDIwMDAwMTAKKzoxMDcyOTAwMDEwNDAwMDAzMDAwMDAwMDAxMDAwMDAwMkFGODAwMDRDMEUKKzoxMDcyQTAwMEFGODAwMDQ4OEZCRjAwMjQ4RkIwMDAyMDAzRTAwMDA4QUIKKzoxMDcyQjAwMDI3QkQwMDI4MDNFMDAwMDgwMDAwMDAwMDI3QkRGRkMwMzQKKzoxMDcyQzAwMDMyQzIwMDIwQUZCRjAwMzhBRkIzMDAzNEFGQjIwMDMwREQKKzoxMDcyRDAwMEFGQjEwMDJDMTA0MDAwMDRBRkIwMDAyODhGNTMwMDI4M0QKKzoxMDcyRTAwMDEwMDAwMDAyMDAwMDAwMDA4RjUzMDAyMDhGNDIwMDMwODkKKzoxMDcyRjAwMDEwNTMwMEVCMDAwMjExMDA4RjQzMDAxQzAwNjI4MDIxM0MKKzoxMDczMDAwMDhFMDQwMDAwOEUwNTAwMDQ5NjEyMDAwODhGNDIwMDkwNDMKKzoxMDczMTAwMDk2MTEwMDBBMzI0NkZGRkYwMDQ2MTAyQTEwNDAwMDE3NUYKKzoxMDczMjAwMDAwMDAwMDAwOEY4MjAwRDg4RjQzMDA5ODAwNDMxMDIzOTQKKzoxMDczMzAwMDI0NDJEQ0JFQUY0MjAwOTA4RjQyMDA5MDI4NDJEQ0JGNjYKKzoxMDczNDAwMDEwNDAwMDA1MDAwMDAwMDA4RjQyMDA5MDhGNDMwMTQ0NzAKKzoxMDczNTAwMDAwNDMxMDIxQUY0MjAwOTA4RjQyMDA5MDAwNDYxMDJBNTcKKzoxMDczNjAwMDEwNDAwMDA2MDAwMDAwMDA4RjQyMDM0ODI0NDIwMDAxNDQKKzoxMDczNzAwMEFGNDIwMzQ4MTAwMDAwRTE4RjQyMDM0ODhGODIwMEZDQjcKKzoxMDczODAwMDE0NDAwMDA2MDAwMDAwMDA4RjQyMDM0NDI0NDIwMDAxMjQKKzoxMDczOTAwMEFGNDIwMzQ0MTAwMDAwRDk4RjQyMDM0NDkzNDIwNUMyMTgKKzoxMDczQTAwMDEwNDAwMDBCMzJDMjAwMDgxMDQwMDAwODMyMjIwMjAwRDgKKzoxMDczQjAwMDEwNDAwMDA2M0MwMzQwMDA5NjAyMDAwRUFGNDMwMEFDQjQKKzoxMDczQzAwMDAwMDIxNDAwMTAwMDAwMDJBRjQyMDBCMEFGNDAwMEFDNTkKKzoxMDczRDAwMDMyMjIwMDA0MTA0MDAwN0YzMjIyMDgwMDEwNDAwMDAzRDcKKzoxMDczRTAwMDMyNDdGRkZGMTAwMDAwMDIyNDAyMDAyMDI0MDIwMDA0QTQKKzoxMDczRjAwMEFGQTIwMDEwOEY0MjAwMzBBRkEyMDAxNDhGNDIwMDEwRTUKKzoxMDc0MDAwMDNDMDMwMDAyMDA0MzEwMjVBRkEyMDAxODhGNDYwMDk4RUQKKzoxMDc0MTAwMDhGNDIwMTA4MDA0MEY4MDkwMDAwMDAwMDEwNDAwMEI3NEEKKzoxMDc0MjAwMDAwMDAwMDAwOEY0MjAwOUM4RjQzMDA5NDAyNDIxMDIxMTQKKzoxMDc0MzAwMEFGNDIwMDlDQUUwMzAwMEM4RjQyMDBBQzEwNDAwMDA4MkQKKzoxMDc0NDAwMDNDMDM0MDAwOEY0MjAwOTQwMDQzMTAyNUFGQTIwMDIwNkYKKzoxMDc0NTAwMDhGNDIwMDlDOEY0MzAwQjAxMDAwMDAwNDAwNDMxMDI1QjEKKzoxMDc0NjAwMDhGNDIwMDk0QUZBMjAwMjA4RjQyMDA5Q0FGQTIwMDI0NjQKKzoxMDc0NzAwMDhGODIwMEZDOEZBMzAwMjA4RkE0MDAyNEFDNDMwMDAwNjcKKzoxMDc0ODAwMEFDNDQwMDA0MjQ0MjAwMDhBRjgyMDBGMDhGNDIwMDlDMEMKKzoxMDc0OTAwMDhGNDQwMjcwOEY0NTAyNzQwMDQwMTgyMTAwMDAxMDIxQjMKKzoxMDc0QTAwMDAwQTMyODIxMDBBMzMwMkIwMDgyMjAyMTAwODYyMDIxNjgKKzoxMDc0QjAwMDMyMjMwMDYwMjQwMjAwNDBBRjQ0MDI3MEFGNDUwMjc0RTIKKzoxMDc0QzAwMDEwNjIwMDE3MkM2MjAwNDExMDQwMDAwNTI0MDIwMDIwQzkKKzoxMDc0RDAwMDEwNjIwMDA4MjQwMjAwMDExMDAwMDAyNjAwMDAwMDAwRDUKKzoxMDc0RTAwMDI0MDIwMDYwMTA2MjAwMTkyNDAyMDAwMTEwMDAwMDIxMzMKKzoxMDc0RjAwMDAwMDAwMDAwOEY0MjAyNzg4RjQzMDI3QzI0NjMwMDAxNjkKKzoxMDc1MDAwMDJDNjQwMDAxMDA0NDEwMjFBRjQyMDI3OEFGNDMwMjdDOUEKKzoxMDc1MTAwMDhGNDIwMjc4OEY0MzAyN0MxMDAwMDAxNjI0MDIwMDAxODMKKzoxMDc1MjAwMDhGNDIwMjgwOEY0MzAyODQyNDYzMDAwMTJDNjQwMDAxOTcKKzoxMDc1MzAwMDAwNDQxMDIxQUY0MjAyODBBRjQzMDI4NDhGNDIwMjgwOTgKKzoxMDc1NDAwMDhGNDMwMjg0MTAwMDAwMEIyNDAyMDAwMThGNDIwMjg4NDYKKzoxMDc1NTAwMDhGNDMwMjhDMjQ2MzAwMDEyQzY0MDAwMTAwNDQxMDIxM0QKKzoxMDc1NjAwMEFGNDIwMjg4QUY0MzAyOEM4RjQyMDI4ODhGNDMwMjhDNjUKKzoxMDc1NzAwMDI0MDIwMDAxQTM0MjA1QzI4RjQyMDA5ODMyNDRGRkZGNUIKKzoxMDc1ODAwMDI0MDZGRkY4OEY0NTAxM0MwMDQ0MTAyMTI0NDIwMDA3RTcKKzoxMDc1OTAwMDAwNDYxMDI0MjQ4NDAwMDdBRjQyMDA5NDhGNDIwMDkwREMKKzoxMDc1QTAwMDhGNDMwMDk0MDA4NjIwMjQwMDQ0MTAyMzAwNjUxODJCOEMKKzoxMDc1QjAwMDE0NjAwMDA1QUY0MjAwOTA4RjQyMDA5NDhGNDMwMTQ0NTUKKzoxMDc1QzAwMDAwNDMxMDIzQUY0MjAwOTQ4RjQyMDA5NDEwMDAwMDIzMjgKKzoxMDc1RDAwMEFGNDAwMDlDMzI0N0ZGRkY1MEUwMDAyMjMyQzIwMDIwNDMKKzoxMDc1RTAwMDE0NDAwMDAyMjQwMjAwMTAyNDAyMDAwMkFGQTIwMDEwODYKKzoxMDc1RjAwMDhGNDIwMDMwQUZBMjAwMTQ4RjQyMDAxMEFGQTIwMDE4REIKKzoxMDc2MDAwMDhGNDYwMDk4OEY0MjAxMDgwMDQwRjgwOTAwMDAwMDAwRjIKKzoxMDc2MTAwMDEwNDAwMDNBMzI0NUZGRkY4RjQyMDA5ODhGNDMwMDkwQTAKKzoxMDc2MjAwMDhGNDYwMTNDMDA0NTEwMjFBRjQyMDA5ODhGNDIwMDlDREMKKzoxMDc2MzAwMDhGNDQwMDk4QTM0MDA1QzIwMDY1MTgyM0FGNDMwMDkwMTMKKzoxMDc2NDAwMDAwNDUxMDIxMDA4NjIwMkIxNDgwMDAwNUFGNDIwMDlDQ0QKKzoxMDc2NTAwMDhGNDIwMDk4OEY0MzAxNDQwMDQzMTAyM0FGNDIwMDk4QUIKKzoxMDc2NjAwMDMyQzIwMDIwMTA0MDAwMDUwMDAwMDAwMDhGNDIwMzU4ODUKKzoxMDc2NzAwMDI0NDJGRkZGQUY0MjAzNTg4RjQyMDM1ODhGNDIwMDMwMkQKKzoxMDc2ODAwMDhGNDMwMDQwMjQ0MjAwMDEyNDYzRkZGRjAwNDMxMDI0ODUKKzoxMDc2OTAwMEFGNDIwMDMwOEY0MjAwMzAxNDUzMDAxODAwMDAwMDAwNDkKKzoxMDc2QTAwMDhGNDIwMDAwMTA0MDAwMDcwMDAwMDAwMEFGODAwMDRDMzcKKzoxMDc2QjAwMDhGODIwMDRDMTA0MEZGRkQwMDAwMDAwMDEwMDAwMDA1MEMKKzoxMDc2QzAwMDAwMDAwMDAwQUY4MDAwNDg4RjgyMDA0ODEwNDBGRkZEOUUKKzoxMDc2RDAwMDAwMDAwMDAwOEY4MjAwNjAyNDAzRkZGNzAwNDMxMDI0QTUKKzoxMDc2RTAwMEFGODIwMDYwOEY0MjAwMDAxMDQwMDAwMzAwMDAwMDAwRTUKKzoxMDc2RjAwMDEwMDAwMDAyQUY4MDAwNENBRjgwMDA0ODhGQkYwMDM4MDAKKzoxMDc3MDAwMDhGQjMwMDM0OEZCMjAwMzA4RkIxMDAyQzhGQjAwMDI4QkYKKzoxMDc3MTAwMDAzRTAwMDA4MjdCRDAwNDAwM0UwMDAwODAwMDAwMDAwNkYKKzoxMDc3MjAwMDI3QkRGRkQwMzJDMjAwMjBBRkJGMDAyQ0FGQjIwMDI4NkYKKzoxMDc3MzAwMEFGQjEwMDI0MTA0MDAwMDRBRkIwMDAyMDhGNTIwMDI4RTkKKzoxMDc3NDAwMDEwMDAwMDAyMDAwMDAwMDA4RjUyMDAyMDhGNDIwMDMwMjUKKzoxMDc3NTAwMDEwNTIwMEI1MDAwMjExMDA4RjQzMDAxQzAwNjI4MDIxMEUKKzoxMDc3NjAwMDhFMDQwMDAwOEUwNTAwMDQ5NjExMDAwODhGNDIwMDkwRTAKKzoxMDc3NzAwMDk2MDcwMDBBMzIyNkZGRkYwMDQ2MTAyQTEwNDAwMDE3MjUKKzoxMDc3ODAwMDAwMDAwMDAwOEY4MjAwRDg4RjQzMDA5ODAwNDMxMDIzMzAKKzoxMDc3OTAwMDI0NDJEQzQ2QUY0MjAwOTA4RjQyMDA5MDI4NDJEQzQ3RjIKKzoxMDc3QTAwMDEwNDAwMDA1MDAwMDAwMDA4RjQyMDA5MDhGNDMwMTQ0MEMKKzoxMDc3QjAwMDAwNDMxMDIxQUY0MjAwOTA4RjQyMDA5MDAwNDYxMDJBRjMKKzoxMDc3QzAwMDEwNDAwMDA2MDAwMDAwMDA4RjQyMDM0ODI0NDIwMDAxRTAKKzoxMDc3RDAwMEFGNDIwMzQ4MTAwMDAwQUI4RjQyMDM0ODhGODYwMEZDODUKKzoxMDc3RTAwMDEwQzAwMDBDMDAwMDAwMDA4RjgyMDBGNDI0MDNGRkY4OUEKKzoxMDc3RjAwMDAwNDMxMDI0MDA0NjEwMjMwMDAyMThDMzU4NjAwMDAxMDMKKzoxMDc4MDAwMDI0NjMwMTAwOEY0MjAwOEMwMDQzMTAyQjE0NDAwMDA2QkIKKzoxMDc4MTAwMDAwMDcxMkMyOEY0MjAzNDQyNDQyMDAwMUFGNDIwMzQ0RDYKKzoxMDc4MjAwMDEwMDAwMDk4OEY0MjAzNDQ5MzQzMDVDMjEwNjAwMDBGN0MKKzoxMDc4MzAwMDMwNDYwMDAxOEY0MjAwMTAzNDQ4MDQwMDMyQzIwMDA4NzQKKzoxMDc4NDAwMDEwNDAwMDA4MzBFMjAyMDAxMDQwMDAwNjNDMDM0MDAwRjcKKzoxMDc4NTAwMDk2MDIwMDBFQUY0MzAwQUMwMDAyMTQwMDEwMDAwMDA0QkEKKzoxMDc4NjAwMEFGNDIwMEIwMTAwMDAwMDJBRjQwMDBBQzhGNDgwMDEwRTMKKzoxMDc4NzAwMDMwRTIwMDA0MTA0MDAwNDUzMjI3RkZGRjhGNDkwMEFDODIKKzoxMDc4ODAwMDExMjAwMDA1MzBDMjAwRkYxNDQwMDAwNjI0MDIwMDQwMTEKKzoxMDc4OTAwMDEwMDAwMDA0MjQwMjAwMDgxNDQwMDAwMjI0MDIwMDIwMEEKKzoxMDc4QTAwMDI0MDIwMDA0QUZBMjAwMTA4RjQzMDAzMDExMjAwMDA0MTYKKzoxMDc4QjAwMEFGQTMwMDE0OEY0MjAwQjAwMDYyMTAyNUFGQTIwMDE0RTUKKzoxMDc4QzAwMDNDMDIwMDAyMDEwMjEwMjVBRkEyMDAxODhGNDYwMDk4NkEKKzoxMDc4RDAwMDhGNDIwMTA4MDA0MEY4MDkwMDAwMDAwMDEwNDAwMDY5RDQKKzoxMDc4RTAwMDMyMjRGRkZGOEY0MjAwOEM4RjQzMDA5NDI0NDIwMDAxMUEKKzoxMDc4RjAwMEFGNDIwMDhDMjQwMjAwMDFBRTAzMDAwQ0EzNDIwNUMyN0IKKzoxMDc5MDAwMDhGNDIwMDk4MjQwNkZGRjg4RjQ1MDEzQzAwNDQxMDIxNjcKKzoxMDc5MTAwMDI0NDIwMDA3MDA0NjEwMjQyNDg0MDAwN0FGNDIwMDk0NEMKKzoxMDc5MjAwMDhGNDIwMDkwOEY0MzAwOTQwMDg2MjAyNDAwNDQxMDIzNEYKKzoxMDc5MzAwMDAwNjUxODJCMTQ2MDAwMDVBRjQyMDA5MDhGNDIwMDk0NDAKKzoxMDc5NDAwMDhGNDMwMTQ0MDA0MzEwMjNBRjQyMDA5NDhGNDMwMDk0QkYKKzoxMDc5NTAwMDhGNDIwMTQwMDA0MzEwMkIxMDQwMDAwOTAwMDAwMDAwM0UKKzoxMDc5NjAwMDhGNDMwMTNDOEY0NDAwOTQ4RjQyMDA5MDhGNDUwMTM4MzMKKzoxMDc5NzAwMDAwNjQxODIzMDA0MzEwMjNBRjQyMDA5MEFGNDUwMDk0RTkKKzoxMDc5ODAwMDhGNDIwMDk0MTAwMDAwMUZBRjQyMDA5ODEwRTAwMDFEQ0QKKzoxMDc5OTAwMDMwQzIwMEZGMTQ0MDAwMDIyNDAyMDAxMDI0MDIwMDAyNDIKKzoxMDc5QTAwMEFGQTIwMDEwOEY0MjAwMzBBRkE4MDAxOEFGQTIwMDE0QTEKKzoxMDc5QjAwMDhGNDYwMDk4OEY0MjAxMDgwMDQwRjgwOTAwMDAwMDAwM0YKKzoxMDc5QzAwMDEwNDAwMDMwMzIyNUZGRkY4RjQyMDA5ODhGNDQwMTNDNjkKKzoxMDc5RDAwMDAwNDUxMDIxQUY0MjAwOTg4RjQyMDA5MDhGNDMwMDk4REQKKzoxMDc5RTAwMEEzNDAwNUMyMDA0NTEwMjMwMDY0MTgyQjE0NjAwMDA1NTUKKzoxMDc5RjAwMEFGNDIwMDkwOEY0MjAwOTg4RjQzMDE0NDAwNDMxMDIzMTAKKzoxMDdBMDAwMEFGNDIwMDk4OEY0MjAwMzA4RjQzMDA0MDI0NDIwMDAxNzMKKzoxMDdBMTAwMDI0NjNGRkZGMDA0MzEwMjRBRjQyMDAzMDhGNDIwMDMwNDgKKzoxMDdBMjAwMDE0NTIwMDE4MDAwMDAwMDA4RjQyMDAwMDEwNDAwMDA3QjAKKzoxMDdBMzAwMDAwMDAwMDAwQUY4MDAwNEM4RjgyMDA0QzEwNDBGRkZEMjIKKzoxMDdBNDAwMDAwMDAwMDAwMTAwMDAwMDUwMDAwMDAwMEFGODAwMDQ4QUEKKzoxMDdBNTAwMDhGODIwMDQ4MTA0MEZGRkQwMDAwMDAwMDhGODIwMDYwMTAKKzoxMDdBNjAwMDI0MDNGRkY3MDA0MzEwMjRBRjgyMDA2MDhGNDIwMDAwMjAKKzoxMDdBNzAwMDEwNDAwMDAzMDAwMDAwMDAxMDAwMDAwMkFGODAwMDRDMjYKKzoxMDdBODAwMEFGODAwMDQ4OEZCRjAwMkM4RkIyMDAyODhGQjEwMDI0MzgKKzoxMDdBOTAwMDhGQjAwMDIwMDNFMDAwMDgyN0JEMDAzMDAzRTAwMDA4OUQKKzoxMDdBQTAwMDAwMDAwMDAwMjdCREZGRDgzQzAyMDAwMTM0NDIyRUMwNzgKKzoxMDdBQjAwMEFGQkYwMDIwOEY0MzAwRjA4Rjg0MDEwODAyRTIxMDIxNDUKKzoxMDdBQzAwMDU0NjIwMDA0MjQ2MjAwMDgzQzAyMDAwMTM0NDIyQ0MwQ0QKKzoxMDdBRDAwMDAyRTIxMDIxMDA0MDE4MjFBRjQzMDBGMEFDNjAwMDAwMkEKKzoxMDdBRTAwMDhGNDIwMEVDOEM2NjAwMDQxNDYyMDAwNDNDMDIwMDAxMkEKKzoxMDdBRjAwMDI0ODIwMDIwMTAwMDAwMEZBRjgyMDEwODhGNDMwMEYwQTUKKzoxMDdCMDAwMDM0NDIyRUMwMDJFMjEwMjE1NDYyMDAwNDI0NjIwMDA4QjQKKzoxMDdCMTAwMDNDMDIwMDAxMzQ0MjJDQzAwMkUyMTAyMTAwNDAxODIxMzYKKzoxMDdCMjAwMDhDNjIwMDA0MDAwMjExNDAwMDgyMTAyMUFGODIwMTA4MjMKKzoxMDdCMzAwMEFDNjAwMDAwOEM4NTAwMTgzMEEyMDAzNjEwNDAwMDZDNEMKKzoxMDdCNDAwMDMwQTIwMDAxOEM4MjAwMUM4RjQzMDA0MDhGNDQwMDM0MUYKKzoxMDdCNTAwMDI0NDIwMDAxMjQ2M0ZGRkYwMDQzMTAyNDAwODYyMDIxRkIKKzoxMDdCNjAwMEFGNDIwMDJDMzBBMjAwMzAxNDQwMDAwNkFGNDQwMDM0NzUKKzoxMDdCNzAwMDhGNDIwMDM0OEMwMzAyM0MwMDQzMTAyQjE0NDAwMEI0QUQKKzoxMDdCODAwMDAwMDAwMDAwMzJDMjAwMTAxMDQwMDAyODI0MDcwMDA4NDYKKzoxMDdCOTAwMDhGNDQwMTcwOEY0NTAxNzQ4RjQzMDAyQzhGNDgwMDBDNzcKKzoxMDdCQTAwMDhGODYwMTIwMjQwMjAwODBBRkEyMDAxMEFGQTMwMDE0MzIKKzoxMDdCQjAwMEFGQTgwMDE4OEY0MjAxMEMwMDQwRjgwOTI0QzYwMDFDMzEKKzoxMDdCQzAwMDE0NDAwMDExMjQwMjAwMDEzQzAxMDAwMTAwMzcwODIxOEIKKzoxMDdCRDAwMEEwMjI0MEYxOEY4MjAxMjRBRkEyMDAxMDhGODIwMTI4RTEKKzoxMDdCRTAwMDNDMDQwMDAxMjQ4NDY3QzRBRkEyMDAxNDhGNDYwMDJDMUIKKzoxMDdCRjAwMDhGODcwMTIwM0MwNTAwMDkwQzAwMkIzQjM0QTUxMTAwQTgKKzoxMDdDMDAwMDEwMDAwMDM2MDAwMDAwMDA4RjQyMDMwMDhGNDMwMDJDNUMKKzoxMDdDMTAwMDI0NDIwMDAxQUY0MjAzMDA4RjQyMDMwMDI0MDIwMDAxMEUKKzoxMDdDMjAwMEEzNDIwNUMxMTAwMDAwMjZBRjQzMDAzODhGNDQwMTcwMDUKKzoxMDdDMzAwMDhGNDUwMTc0OEY0MzAwMkM4RjQ4MDAwQzhGODYwMTIwRTQKKzoxMDdDNDAwMDI0MDIwMDIwQUZBMjAwMTBBRkEzMDAxNEFGQTgwMDE4QjgKKzoxMDdDNTAwMDhGNDIwMTBDMDA0MEY4MDkyNEM2MDAxQzE0NDAwMDExOUEKKzoxMDdDNjAwMDI0MDIwMDAxM0MwMTAwMDEwMDM3MDgyMUEwMjI0MEYwNUQKKzoxMDdDNzAwMDhGODIwMTI0QUZBMjAwMTA4RjgyMDEyODNDMDQwMDAxRjIKKzoxMDdDODAwMDI0ODQ2N0I4QUZBMjAwMTQ4RjQ2MDAyQzhGODcwMTIwOTAKKzoxMDdDOTAwMDNDMDUwMDA5MEMwMDJCM0IzNEE1MDkwMDEwMDAwMDBGMjcKKzoxMDdDQTAwMDAwMDAwMDAwOEY0MjAzMDAyNDQyMDAwMUFGNDIwMzAwQTUKKzoxMDdDQjAwMDhGNDIwMzAwOEY0MjAwMkNBMzQwMDVDMUFGNDIwMDM4MjEKKzoxMDdDQzAwMDNDMDEwMDAxMDAzNzA4MjFBMDIwNDBGMTNDMDEwMDAxRTcKKzoxMDdDRDAwMDAwMzcwODIxQTAyMDQwRjBBRjQwMDAzNDhGNDIwMzE0NDkKKzoxMDdDRTAwMDI0NDIwMDAxQUY0MjAzMTQxMDAwMDA1OThGNDIwMzE0RDQKKzoxMDdDRjAwMDEwNDAwMDIyMzBBMjcwMDA4Qzg1MDAxQzhGNDIwMDI4QUEKKzoxMDdEMDAwMDAwQTIyMDIzMDQ4MTAwMDMwMDAwMDAwMDhGNDIwMDQwRjUKKzoxMDdEMTAwMDAwODIyMDIxOEY0MjAzNTg4RjQzMDAwMEFGNDUwMDI4ODYKKzoxMDdEMjAwMDAwNDQxMDIxMTA2MDAwMDdBRjQyMDM1OEFGODAwMDRDQTAKKzoxMDdEMzAwMDhGODIwMDRDMTA0MEZGRkQwMDAwMDAwMDEwMDAwMDA1ODUKKzoxMDdENDAwMDAwMDAwMDAwQUY4MDAwNDg4RjgyMDA0ODEwNDBGRkZEMTcKKzoxMDdENTAwMDAwMDAwMDAwOEY4MjAwNjAzNDQyMDAwOEFGODIwMDYwQTMKKzoxMDdENjAwMDhGNDIwMDAwMTA0MDAwMDMwMDAwMDAwMDEwMDAwMDM4QTcKKzoxMDdENzAwMEFGODAwMDRDMTAwMDAwMzZBRjgwMDA0ODEwNDAwMDJGNEMKKzoxMDdEODAwMDMwQTIxMDAwMTA0MDAwMEMzMEEyNDAwMDhDODMwMDFDNzgKKzoxMDdEOTAwMDhGNDIwMDUwMDA2MjIwMjMwNDgyMDAwMTI0ODQwMjAwRUMKKzoxMDdEQTAwMDhGNDIwMzVDMDA0NDEwMjFBRjQyMDM1QzhGNDIwMzY4QTIKKzoxMDdEQjAwMDEwMDAwMDFBQUY0MzAwNTAxMDQwMDAwQzMyQzI4MDAwODcKKzoxMDdEQzAwMDhDODMwMDFDOEY0MjAwNzAwMDYyMjAyMzA0ODIwMDAxMUIKKzoxMDdERDAwMDI0ODQwNDAwOEY0MjAzNjQwMDQ0MTAyMUFGNDIwMzY0RjIKKzoxMDdERTAwMDhGNDIwMzY4MTAwMDAwMERBRjQzMDA3MDEwNDAwMDBFN0EKKzoxMDdERjAwMDNDMDIwODAwOEM4MzAwMUM4RjQyMDA2MDAwNjIyMDIzM0MKKzoxMDdFMDAwMDA0ODIwMDAxMjQ4NDAxMDA4RjQyMDM2MDAwNDQxMDIxOTkKKzoxMDdFMTAwMEFGNDIwMzYwOEY0MjAzNjhBRjQzMDA2MDAwNDQxMDIxMEIKKzoxMDdFMjAwMEFGNDIwMzY4M0MwMjA4MDAwMkMyMTAyNDUwNDAwMDA4MjAKKzoxMDdFMzAwMDM2OTQwMDQwMTAwMDAwMDYwMDAwMDAwMDMwQTIwMTAwNEYKKzoxMDdFNDAwMDEwNDAwMDAzMDAwMDAwMDAwQzAwMkJEODAwMDAwMDAwRDAKKzoxMDdFNTAwMDhGQkYwMDIwMDNFMDAwMDgyN0JEMDAyODAzRTAwMDA4RDIKKzoxMDdFNjAwMDAwMDAwMDAwMjdCREZGQThBRkJGMDA1MEFGQkUwMDRDMTAKKzoxMDdFNzAwMEFGQjUwMDQ4QUZCMzAwNDRBRkIyMDA0MEFGQjEwMDNDNzMKKzoxMDdFODAwMEFGQjAwMDM4OEY5MTAxMDgyNjIyMDAyMEFGODIwMTA4OTAKKzoxMDdFOTAwMDhFMzIwMDE4MDAwMEE4MjEzMjQyMDAyNDEwNDAwMUJBOUUKKzoxMDdFQTAwMDAwMDBGMDIxOEUyNjAwMUM4RjQzMDAxQzAwMDYxMTAwRUMKKzoxMDdFQjAwMDAwNjIxODIxOEM3MDAwMEM5NjA0MDAwQzk2MkQwMDE2QTAKKzoxMDdFQzAwMDk0NzMwMDBBMkM4MzA1REQzODgyODg3MDJDNDIwMDAxRUYKKzoxMDdFRDAwMDAwNjIxODI1MTA2MDAwMTUwMDAwMjgyMTMyQzIwMDQwMDEKKzoxMDdFRTAwMDEwNDAwMDE1MjQwMjA4MDA5NjAzMDAxNDE0NjIwMDEyQ0EKKzoxMDdFRjAwMDM0MDJBQUFBOTYwMzAwMEUxNDYyMDAwNzAwMDAyMDIxOTMKKzoxMDdGMDAwMDk2MDMwMDEwMjQwMjAzMDAxNDYyMDAwNDAwODAxMDIxNzQKKzoxMDdGMTAwMDk2MDIwMDEyMkM0NDAwMDEwMDgwMTAyMTU0NDAwMDA2RkIKKzoxMDdGMjAwMDI0MDUwMDE2MTAwMDAwMDQwMDAwMDAwMDI0MDIwODAwRDAKKzoxMDdGMzAwMDUwODIwMDAxMjQwNTAwMEU5MzQyMDVDMzE0NDAwMDA4M0UKKzoxMDdGNDAwMDAwMDA1ODIxMjQwQjAwMDEzMjYyMDE4MEFGNDUwMEE4RDcKKzoxMDdGNTAwMEFGNTAwMEEwMTA0MDAwMDJBRjQ2MDBBNEEzNEIwNUMzRTEKKzoxMDdGNjAwMDEwQTAwMDg1MDIwNTQwMjE5MTAyMDAwMDAwMDAzODIxODgKKzoxMDdGNzAwMDMwNDIwMDBGMDAwMjUwODAzMkMyMDAwMjEwNDAwMDEyNTYKKzoxMDdGODAwMDAxMEExODIxMzI2MjAwMDIxMDQwMDAxMDMyQzIwMDAxQzIKKzoxMDdGOTAwMDAxMDAyMDIxOTQ4MjAwMDAyNDg0MDAwMjAwRTIzODIxQTQKKzoxMDdGQTAwMDAwODMxMDJCMTQ0MEZGRkIzMEUyRkZGRjAwMDcxQzAyOTAKKzoxMDdGQjAwMDAwNjIzODIxMDAwNzFDMDIzMEUyRkZGRjAwNjIzODIxMTYKKzoxMDdGQzAwMDAwMDcxMDI3QTUwMjAwMEEzMkMyMDAwMTEwNDAwMDZBMTMKKzoxMDdGRDAwMDMyNjIwMDAxMTA0MDAwNjgwMDAwMDAwMDhGNDIwMEE4REIKKzoxMDdGRTAwMDEwNDAwMDY1MDAwMDAwMDA4RjQyMDBBMDhGNDMwMEE4RjEKKzoxMDdGRjAwMDAwNDMxMDIxOTA0QzAwMDkzMTg5MDBGRjM5MjMwMDA2MEQKKzoxMDgwMDAwMDAwMDMxODJCMzkyMjAwMTEwMDAyMTAyQjAwNjIxODI0RTMKKzoxMDgwMTAwMDEwNjAwMDBDM0MwNTAwMDY4RjQyMDBBNDNDMDQwMDAxRTcKKzoxMDgwMjAwMDI0ODQ2N0Q0QUZBMjAwMTA4RjQyMDBBMDM0QTU0NjAwN0MKKzoxMDgwMzAwMDAxMjAzODIxMEMwMDJCM0JBRkEyMDAxNDEwMDAwMDRFOTEKKzoxMDgwNDAwMDAwMDAwMDAwMzJDMjAwMDQxNDQwMDAxMzAwMDAyODIxODgKKzoxMDgwNTAwMDMxNjIwMEZGMTQ0MDAwMDQwMDAwMDAwMDk1MDIwMDAyOUQKKzoxMDgwNjAwMDEwMDAwMDBEMDA0QTI4MjM5NTA1MDAwQzk1MDIwMDBFMTMKKzoxMDgwNzAwMDk1MDMwMDEwMDBBMjI4MjEwMEEzMjgyMTk1MDMwMDEyRDcKKzoxMDgwODAwMDkxMDQwMDA5OTUwMjAwMDIwMEEzMjgyMTAwQTQyODIxRTAKKzoxMDgwOTAwMDAwNEExMDIzMDBBMjI4MjEwMjAwMjAyMTk0ODIwMDAwMUYKKzoxMDgwQTAwMDI0ODQwMDAyMDBFMjM4MjEwMDg4MTAyQjE0NDBGRkZCREEKKzoxMDgwQjAwMDAwMDcxQzAyMzBFMkZGRkYwMDYyMzgyMTAwMDcxQzAyQUIKKzoxMDgwQzAwMDMwRTJGRkZGMDA2MjM4MjEwMUE1MjgyMTAwMDUxQzAyRDMKKzoxMDgwRDAwMDMwQTJGRkZGMDA2MjI4MjEwMDA1MUMwMjMwQTJGRkZGMzIKKzoxMDgwRTAwMDAwNjIyODIxMDBBNzI4MjMwMDA1MTQwMjAwQTIyODIxRUQKKzoxMDgwRjAwMDMwQTVGRkZGNTBBMDAwMDEzNDA1RkZGRjMxNjIwMEZGRjMKKzoxMDgxMDAwMDE0NDAwMDA4MzE4MzAwRkY4RjQzMDBBMDhGNDIwMEE4NzUKKzoxMDgxMTAwMDAwNjI0MDIxOTEwMjAwMDAzMDQyMDAwRjAwMDI1MDgwQjYKKzoxMDgxMjAwMDMxODMwMEZGMjQwMjAwMDYxNDYyMDAwMzAxMEExMDIxQkIKKzoxMDgxMzAwMDEwMDAwMDAyMjQ0NDAwMTAyNDQ0MDAwNjMxNjIwMEZGQjUKKzoxMDgxNDAwMDE0NDAwMDA2MDAwMDAwMDA5NDgyMDAwMDAwQTIyODIxRDQKKzoxMDgxNTAwMDAwMDUxQzAyMzBBMkZGRkYwMDYyMjgyMTkzNDIwNUMzRTQKKzoxMDgxNjAwMDEwNDAwMDAzMzI2MjAxMDA1MDQwMDAwM0E0ODUwMDAwNkIKKzoxMDgxNzAwMDAwMDUyODI3QTQ4NTAwMDA5NjIyMDAwRThGNDMwMDlDNEUKKzoxMDgxODAwMDAwNjIxODIxMzJBMjAwRkYxMDQwMDAwN0FGNDMwMDlDOUMKKzoxMDgxOTAwMDNDMDI0MDAwMDIwMjEwMjVBRkEyMDAyMDhGNDIwMDlDNEEKKzoxMDgxQTAwMDEwMDAwMDAzMDA1RTEwMjVBRkIwMDAyMDhGNDIwMDlDM0QKKzoxMDgxQjAwMEFGQTIwMDI0MzI2MjAwODAxMDQwMDAxMDMyNjIwMTAwNDEKKzoxMDgxQzAwMDhGNDIwMEI0MjQ0MzAwMDEwMDAyMTBDMDAwNTcxMDIxNjgKKzoxMDgxRDAwMEFGNDMwMEI0OEZBMzAwMjA4RkE0MDAyNDNDMDEwMDAxMTIKKzoxMDgxRTAwMDAwMjIwODIxQUMyMzM4RTgzQzAxMDAwMTAwMjIwODIxQ0MKKzoxMDgxRjAwMEFDMjQzOEVDMTAwMDAwQTUzMkMyMDAyMDEwNDAwMDY0MEUKKzoxMDgyMDAwMDAwMDAwMDAwOEY0MjAwQjQyNDQzMDAwMTAwMDIxMEMwQUYKKzoxMDgyMTAwMDAwNTcxMDIxQUY0MzAwQjQ4RkEzMDAyMDhGQTQwMDI0ODcKKzoxMDgyMjAwMDNDMDEwMDAxMDAyMjA4MjFBQzIzMzhFODNDMDEwMDAxOTgKKzoxMDgyMzAwMDAwMjIwODIxQUMyNDM4RUM4RjQyMDBCNDEwNDAwMDUxRDkKKzoxMDgyNDAwMDAwMDAzODIxM0MwOTAwMDEzNTI5MzhFODNDMDgwMDFGQUUKKzoxMDgyNTAwMDM1MDhGRkZGMjQwQkZGRkYzNDBBRkZGRjAwMDcxMEMwQTMKKzoxMDgyNjAwMDAwNTcxMDIxMDA0OTEwMjE4QzQzMDAwMDhDNDQwMDA0NjkKKzoxMDgyNzAwMEFGQTMwMDI4QUZBNDAwMkM4RjgyMDBGQzhGQTMwMDI4OUUKKzoxMDgyODAwMDhGQTQwMDJDQUM0MzAwMDBBQzQ0MDAwNDI0NDIwMDA4M0UKKzoxMDgyOTAwMEFGODIwMEYwOEY0MjAwOEMyNDQyRkZGRkFGNDIwMDhDN0YKKzoxMDgyQTAwMDk3QTIwMDJFOEY0NDAyNzA4RjQ1MDI3NDAwNDAxODIxNUYKKzoxMDgyQjAwMDAwMDAxMDIxMDBBMzI4MjEwMEEzMzAyQjAwODIyMDIxRTAKKzoxMDgyQzAwMDAwODYyMDIxQUY0NDAyNzBBRjQ1MDI3NDhGQTIwMDI4QkYKKzoxMDgyRDAwMDAwNDgxMDI0OTA0MzAwMDAzMDYzMDAwMTE0NjAwMDBCM0MKKzoxMDgyRTAwMDAwNDAyMDIxOEY0MjAyNzg4RjQzMDI3QzI0NjMwMDAxRUEKKzoxMDgyRjAwMDJDNjQwMDAxMDA0NDEwMjFBRjQyMDI3OEFGNDMwMjdDOUQKKzoxMDgzMDAwMDhGNDIwMjc4MTAwMDAwMUE4RjQzMDI3QzhDODIwMDAwOUEKKzoxMDgzMTAwMDE0NEIwMDBFMDAwMDAwMDA5NDgyMDAwNDE0NEEwMDBCNkQKKzoxMDgzMjAwMDAwMDAwMDAwOEY0MjAyODg4RjQzMDI4QzI0NjMwMDAxMEEKKzoxMDgzMzAwMDJDNjQwMDAxMDA0NDEwMjFBRjQyMDI4OEFGNDMwMjhDM0MKKzoxMDgzNDAwMDhGNDIwMjg4MTAwMDAwMEE4RjQzMDI4QzhGNDIwMjgwMDUKKzoxMDgzNTAwMDhGNDMwMjg0MjQ2MzAwMDEyQzY0MDAwMTAwNDQxMDIxMzcKKzoxMDgzNjAwMEFGNDIwMjgwQUY0MzAyODQ4RjQyMDI4MDhGNDMwMjg0NzcKKzoxMDgzNzAwMDhGNDIwMEI0MjRFNzAwMDEwMEUyMTAyQjE0NDBGRkI4NDQKKzoxMDgzODAwMDAwMDcxMEMwQTM0MDA1QzMxMDAwMDAzRkFGNDAwMEI0NzkKKzoxMDgzOTAwMDhGODIwMEZDOEZBMzAwMjA4RkE0MDAyNEFDNDMwMDAwMzgKKzoxMDgzQTAwMEFDNDQwMDA0MjQ0MjAwMDhBRjgyMDBGMDhGNDIwMDlDREQKKzoxMDgzQjAwMDhGNDYwMDhDOEY0NDAyNzA4RjQ1MDI3NDAwNDAxODIxNTQKKzoxMDgzQzAwMDAwMDAxMDIxMjRDNkZGRkZBRjQ2MDA4QzAwQTMyODIxMjcKKzoxMDgzRDAwMDAwQTMzMDJCMDA4MjIwMjEwMDg2MjAyMUFGNDQwMjcwQjAKKzoxMDgzRTAwMEFGNDUwMjc0OTIwMjAwMDAzMDQyMDAwMTE0NDAwMDBDQkMKKzoxMDgzRjAwMDI0MDJGRkZGOEY0MjAyNzg4RjQzMDI3QzI0NjMwMDAxMzYKKzoxMDg0MDAwMDJDNjQwMDAxMDA0NDEwMjFBRjQyMDI3OEFGNDMwMjdDOEIKKzoxMDg0MTAwMDhGNDIwMjc4OEY0MzAyN0MxMDAwMDAxQzMyQzIwMDIwODEKKzoxMDg0MjAwMDhFMDMwMDAwMTQ2MjAwMEYzNDAyRkZGRjk2MDMwMDA0NjUKKzoxMDg0MzAwMDE0NjIwMDBDMDAwMDAwMDA4RjQyMDI4ODhGNDMwMjhDRkYKKzoxMDg0NDAwMDI0NjMwMDAxMkM2NDAwMDEwMDQ0MTAyMUFGNDIwMjg4MjMKKzoxMDg0NTAwMEFGNDMwMjhDOEY0MjAyODg4RjQzMDI4QzEwMDAwMDBCQzYKKzoxMDg0NjAwMDMyQzIwMDIwOEY0MjAyODA4RjQzMDI4NDI0NjMwMDAxQzUKKzoxMDg0NzAwMDJDNjQwMDAxMDA0NDEwMjFBRjQyMDI4MEFGNDMwMjg0MEIKKzoxMDg0ODAwMDhGNDIwMjgwOEY0MzAyODQzMkMyMDAyMDEwNDAwMDA1RDgKKzoxMDg0OTAwMEFGNDAwMDlDOEY0MjAzNTgyNDQyRkZGRkFGNDIwMzU4NzUKKzoxMDg0QTAwMDhGNDIwMzU4OEUyMjAwMUM4RjQzMDA0MDI0NDIwMDAxNUIKKzoxMDg0QjAwMDI0NjNGRkZGMDA0MzEwMjRBRjQyMDAyQzMyNDIwMDYwQ0YKKzoxMDg0QzAwMDE0NDAwMDA4MzJDMjAwMTA4RjQyMDAzNDI0NDIwMDAxRTAKKzoxMDg0RDAwMEFGNDIwMDM0OEMwMzAyM0MwMDQzMTAyQjE0NDAwMTAyRDUKKzoxMDg0RTAwMDMyQzIwMDEwMTA0MDAwMTgyNDA3MDAwODhGNDQwMTcwQTkKKzoxMDg0RjAwMDhGNDUwMTc0OEY0MzAwMkM4RjQ4MDAwQzhGODYwMTIwMUMKKzoxMDg1MDAwMDI0MDIwMDgwQUZBMjAwMTBBRkEzMDAxNEFGQTgwMDE4OEYKKzoxMDg1MTAwMDhGNDIwMTBDMDA0MEY4MDkyNEM2MDAxQzEwNDAwMDQ3OUYKKzoxMDg1MjAwMDI0MDIwMDAxOEY0MjAzMDA4RjQzMDAyQzI0NDIwMDAxRUIKKzoxMDg1MzAwMEFGNDIwMzAwOEY0MjAzMDAyNDAyMDAwMUEzNDIwNUMxQTEKKzoxMDg1NDAwMDEwMDAwMDdDQUY0MzAwMzg4RjQ0MDE3MDhGNDUwMTc0RTgKKzoxMDg1NTAwMDhGNDMwMDJDOEY0ODAwMEM4Rjg2MDEyMDI0MDIwMDIwQkUKKzoxMDg1NjAwMEFGQTIwMDEwQUZBMzAwMTRBRkE4MDAxODhGNDIwMTBDRjcKKzoxMDg1NzAwMDAwNDBGODA5MjRDNjAwMUMxMDQwMDA1NzI0MDIwMDAxRTYKKzoxMDg1ODAwMDEwMDAwMDY1MDAwMDAwMDAzMjQyMDAxMjEwNDAwMDc1MkIKKzoxMDg1OTAwMDMyNDIwMDAxOTYyMjAwMEU4RjQzMDA5QzAwNjIxODIxOTcKKzoxMDg1QTAwMDMyQzIwMDIwMTA0MDAwMDVBRjQzMDA5QzhGNDIwMzU4QTgKKzoxMDg1QjAwMDI0NDJGRkZGQUY0MjAzNTg4RjQyMDM1ODhFMjIwMDFDMTMKKzoxMDg1QzAwMDhGNDMwMDQwMjQ0MjAwMDEyNDYzRkZGRjAwNDMxMDI0MzYKKzoxMDg1RDAwMEFGNDIwMDJDMzI0MjAwMTAxNDQwMDAwODMyQzIwMDEwOUEKKzoxMDg1RTAwMDhGNDIwMDM0MjQ0MjAwMDFBRjQyMDAzNDhDMDMwMjNDMkQKKzoxMDg1RjAwMDAwNDMxMDJCMTQ0MDAwQkMzMkMyMDAxMDEwNDAwMDI4NzEKKzoxMDg2MDAwMDI0MDcwMDA4OEY0NDAxNzA4RjQ1MDE3NDhGNDMwMDJDQUMKKzoxMDg2MTAwMDhGNDgwMDBDOEY4NjAxMjAyNDAyMDA4MEFGQTIwMDEwM0EKKzoxMDg2MjAwMEFGQTMwMDE0QUZBODAwMTg4RjQyMDEwQzAwNDBGODA5NTYKKzoxMDg2MzAwMDI0QzYwMDFDMTQ0MDAwMTEyNDAyMDAwMTNDMDEwMDAxNkEKKzoxMDg2NDAwMDAwMzcwODIxQTAyMjQwRjE4RjgyMDEyNEFGQTIwMDEwNDAKKzoxMDg2NTAwMDhGODIwMTI4M0MwNDAwMDEyNDg0NjdDNEFGQTIwMDE0NjcKKzoxMDg2NjAwMDhGNDYwMDJDOEY4NzAxMjAzQzA1MDAwOTBDMDAyQjNCMTYKKzoxMDg2NzAwMDM0QTUxMTAwMTAwMDAwMzYwMDAwMDAwMDhGNDIwMzAwRjYKKzoxMDg2ODAwMDhGNDMwMDJDMjQ0MjAwMDFBRjQyMDMwMDhGNDIwMzAwQkQKKzoxMDg2OTAwMDI0MDIwMDAxQTM0MjA1QzExMDAwMDAyNkFGNDMwMDM4QTgKKzoxMDg2QTAwMDhGNDQwMTcwOEY0NTAxNzQ4RjQzMDAyQzhGNDgwMDBDNUMKKzoxMDg2QjAwMDhGODYwMTIwMjQwMjAwMjBBRkEyMDAxMEFGQTMwMDE0NzcKKzoxMDg2QzAwMEFGQTgwMDE4OEY0MjAxMEMwMDQwRjgwOTI0QzYwMDFDMTYKKzoxMDg2RDAwMDE0NDAwMDExMjQwMjAwMDEzQzAxMDAwMTAwMzcwODIxNzAKKzoxMDg2RTAwMEEwMjI0MEYwOEY4MjAxMjRBRkEyMDAxMDhGODIwMTI4QzcKKzoxMDg2RjAwMDNDMDQwMDAxMjQ4NDY3QjhBRkEyMDAxNDhGNDYwMDJDMEMKKzoxMDg3MDAwMDhGODcwMTIwM0MwNTAwMDkwQzAwMkIzQjM0QTUwOTAwOTQKKzoxMDg3MTAwMDEwMDAwMDBGMDAwMDAwMDA4RjQyMDMwMDI0NDIwMDAxRkYKKzoxMDg3MjAwMEFGNDIwMzAwOEY0MjAzMDA4RjQyMDAyQ0EzNDAwNUMxREIKKzoxMDg3MzAwMEFGNDIwMDM4M0MwMTAwMDEwMDM3MDgyMUEwMjA0MEYxODEKKzoxMDg3NDAwMDNDMDEwMDAxMDAzNzA4MjFBMDIwNDBGMEFGNDAwMDM0NzgKKzoxMDg3NTAwMDhGNDIwMzE0MjQ0MjAwMDFBRjQyMDMxNDEwMDAwMDYyNTAKKzoxMDg3NjAwMDhGNDIwMzE0MTA0MDAwMjIzMjQyNzAwMDhFMjUwMDFDRkMKKzoxMDg3NzAwMDhGNDIwMDI4MDBBMjIwMjMwNDgxMDAwMzAwMDAwMDAwOTMKKzoxMDg3ODAwMDhGNDIwMDQwMDA4MjIwMjE4RjQyMDM1ODhGNDMwMDAwMTcKKzoxMDg3OTAwMEFGNDUwMDI4MDA0NDEwMjExMDYwMDAwN0FGNDIwMzU4ODUKKzoxMDg3QTAwMEFGODAwMDRDOEY4MjAwNEMxMDQwRkZGRDAwMDAwMDAwQTUKKzoxMDg3QjAwMDEwMDAwMDA1MDAwMDAwMDBBRjgwMDA0ODhGODIwMDQ4RDQKKzoxMDg3QzAwMDEwNDBGRkZEMDAwMDAwMDA4RjgyMDA2MDM0NDIwMDA4NkUKKzoxMDg3RDAwMEFGODIwMDYwOEY0MjAwMDAxMDQwMDAwMzAwMDAwMDAwRTQKKzoxMDg3RTAwMDEwMDAwMDQxQUY4MDAwNEMxMDAwMDAzRkFGODAwMDQ4RjcKKzoxMDg3RjAwMDEwNDAwMDJGMzI0MjEwMDAxMDQwMDAwQzMyNDI0MDAwNjYKKzoxMDg4MDAwMDhFMjMwMDFDOEY0MjAwNTAwMDYyMjAyMzA0ODIwMDAxNEUKKzoxMDg4MTAwMDI0ODQwMjAwOEY0MjAzNUMwMDQ0MTAyMUFGNDIwMzVDQjkKKzoxMDg4MjAwMDhGNDIwMzY4MTAwMDAwMUFBRjQzMDA1MDEwNDAwMDBDNDQKKzoxMDg4MzAwMDMyQzI4MDAwOEUyMzAwMUM4RjQyMDA3MDAwNjIyMDIzMTEKKzoxMDg4NDAwMDA0ODIwMDAxMjQ4NDA0MDA4RjQyMDM2NDAwNDQxMDIxNDgKKzoxMDg4NTAwMEFGNDIwMzY0OEY0MjAzNjgxMDAwMDAwREFGNDMwMDcwMDUKKzoxMDg4NjAwMDEwNDAwMDBFM0MwMjA4MDA4RTIzMDAxQzhGNDIwMDYwNjYKKzoxMDg4NzAwMDAwNjIyMDIzMDQ4MjAwMDEyNDg0MDEwMDhGNDIwMzYwRUYKKzoxMDg4ODAwMDAwNDQxMDIxQUY0MjAzNjA4RjQyMDM2OEFGNDMwMDYwOTEKKzoxMDg4OTAwMDAwNDQxMDIxQUY0MjAzNjgzQzAyMDgwMDAyQzIxMDI0QzkKKzoxMDg4QTAwMDUwNDAwMDExMzY5NDAwNDAxMDAwMDAwRjAwMDAwMDAwRkUKKzoxMDg4QjAwMDMyNDIwMDQ4MTA0MDAwMDcyNDE1MDAwMThFMjIwMDFDOUYKKzoxMDg4QzAwMDNDMDNGRkZGMDA0M0YwMjQzMDQyRkZGRjEwMDBGRDc1MjIKKzoxMDg4RDAwMEFFMjIwMDFDMzI0MjAxMDAxMDQwMDAwMzAwMDAwMDAwRTQKKzoxMDg4RTAwMDBDMDAyQkQ4MDAwMDAwMDA4RkJGMDA1MDhGQkUwMDRDNDIKKzoxMDg4RjAwMDhGQjUwMDQ4OEZCMzAwNDQ4RkIyMDA0MDhGQjEwMDNDNjkKKzoxMDg5MDAwMDhGQjAwMDM4MDNFMDAwMDgyN0JEMDA1ODAzRTAwMDA4REUKKzoxMDg5MTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDhGODMwMEU0NjEKKzoxMDg5MjAwMDhGODIwMEUwMjQwNEZGRjgwMDQ0MTAyNDAwNjIxMDI2MjcKKzoxMDg5MzAwMDAwMDIxMDJCMDAwMjEwMjMwM0UwMDAwODAwNjIxMDI0NDQKKzoxMDg5NDAwMDAzRTAwMDA4MDAwMDAwMDAyN0JERkZFMEFGQkYwMDFDRUYKKzoxMDg5NTAwMEFGQjAwMDE4OEY4NjAwQzQ4Rjg0MDBFMDhGODUwMEU0REMKKzoxMDg5NjAwMDI0MDJGRkY4MDA4MjE4MjQxMEEzMDAwOTI3NjIzRkY4QjAKKzoxMDg5NzAwMDE0QTIwMDAyMjRBMjAwMDgyNzYyMzAwMDAwNDA4MDIxRDcKKzoxMDg5ODAwMDE2MDMwMDA1MzA4MjAwMDQxMDQwMDAwNDAwQzAyMDIxQkUKKzoxMDg5OTAwMDEwMDAwMDIyMDAwMDEwMjE4RTA0MDAwMDhGNDIwMTFDRjQKKzoxMDg5QTAwMDE0QTIwMDAzMDAwMDAwMDA4RjQyMDEyMEFGNDIwMTE0MTYKKzoxMDg5QjAwMDhDQTMwMDAwOEY0MjAxNDgwMDgzMTgyMzAwNDMxMDJCMzIKKzoxMDg5QzAwMDEwNDAwMDAzMDAwMDAwMDA4RjQyMDE0ODAwNjIxODIxOUYKKzoxMDg5RDAwMDk0QTIwMDA2MjQ0MjAwNTAwMDYyMTAyQjE0NDAwMDBGQTUKKzoxMDg5RTAwMDAwQTAxMDIxQUZBNDAwMTBBRkEzMDAxNDhDQTYwMDAwQkIKKzoxMDg5RjAwMDhDQTcwMDA0M0MwNDAwMDEwQzAwMkIzQjI0ODQ2ODk0RTkKKzoxMDhBMDAwMDhGNDIwMjBDMjQ0MjAwMDFBRjQyMDIwQzhGNDIwMjBDNDIKKzoxMDhBMTAwMDAwMDAxMDIxQUY5MDAwRThBRjkwMDBFNDhGQkYwMDFDNzEKKzoxMDhBMjAwMDhGQjAwMDE4MDNFMDAwMDgyN0JEMDAyMDAzRTAwMDA4MTUKKzoxMDhBMzAwMDAwMDAwMDAwOEY4NDAwRTA4Rjg4MDBDNDhGODMwMEU4NkUKKzoxMDhBNDAwMDI0MDJGRkY4MDA4MjM4MjQwMEUzMjAyMzJDODIxMDAwNDcKKzoxMDhBNTAwMDUwNDAwMDAxMjQ4NDEwMDAwMDA0MjBDMjAwODAxODIxMkUKKzoxMDhBNjAwMDhGNDQwMjU4OEY0NTAyNUMwMDAwMTAyMTAwQTMyODIxOEEKKzoxMDhBNzAwMDAwQTMzMDJCMDA4MjIwMjEwMDg2MjAyMUFGNDQwMjU4MjEKKzoxMDhBODAwMEFGNDUwMjVDOEY4MzAwQzg4RjQyMDE0ODAxMDMyMDIzNTkKKzoxMDhBOTAwMDAwODIxMDJCMTQ0MDAwMDQwMDgwMTgyMThGNDIwMTQ4RUUKKzoxMDhBQTAwMDAwODIyMDIxMDA4MDE4MjE4RjQ0MDI1MDhGNDUwMjU0RkIKKzoxMDhBQjAwMDAwMDAxMDIxMDBBMzI4MjEwMEEzMzAyQjAwODIyMDIxRDgKKzoxMDhBQzAwMDAwODYyMDIxQUY0NDAyNTBBRjQ1MDI1NEFGODgwMEM4NTEKKzoxMDhBRDAwMEFGODcwMEU0QUY4NzAwRTgwM0UwMDAwODAwMDAwMDAwNzMKKzoxMDhBRTAwMDI3QkRGRjMwMjQwQTAwMDFBRkJGMDBDOEFGQkUwMEM0REQKKzoxMDhBRjAwMEFGQjUwMEMwQUZCMzAwQkNBRkIyMDBCOEFGQjEwMEI0MDcKKzoxMDhCMDAwMEFGQjAwMEIwQTNBMDAwOTdBRkEwMDA0NEFGQUEwMDVDMzQKKzoxMDhCMTAwMDkzNDIwNUM0QTdBMDAwOEUxMDQwMDAwQUE3QTAwMDg2QkIKKzoxMDhCMjAwMDhGNEIwMEM0QUZBQjAwNjQ4RjRBMDBDMEFGQUEwMDZDOEIKKzoxMDhCMzAwMDhGNEIwMENDQUZBQjAwNzQ4RjRBMDBDODEwMDAwMTI5RTYKKzoxMDhCNDAwMEFGQUEwMDdDOEY0MjAxMTQwMDQwRjgwOTAwMDAwMDAwMjkKKzoxMDhCNTAwMDAwNDAzMDIxMTBDMDAzNEYwMDAwMDAwMDhDQzIwMDAwMTQKKzoxMDhCNjAwMDhDQzMwMDA0QUZBMjAwMjBBRkEzMDAyNDhGQUIwMDI0NkQKKzoxMDhCNzAwMDhGQUEwMDIwMzE2MkZGRkYyNDQyRkZGQ0FGQTIwMDZDRUQKKzoxMDhCODAwMDNDMDIwMDA2MDJDMjEwMjRBRkFCMDA3QzE0NDAwMDE1NkEKKzoxMDhCOTAwMEFGQUEwMDY0OTE0MjAwMDAzMDQyMDAwMTEwNDAwMDExNzEKKzoxMDhCQTAwMDI0MDJGRkZGOEQ0MzAwMDAxNDYyMDAwNDM0MDJGRkZGMjMKKzoxMDhCQjAwMDk1NDMwMDA0MTA2MjAwMEIwMDAwMDAwMDBDMDAyNEJCNzEKKzoxMDhCQzAwMDhGQTQwMDY0MzA0MjAwRkYxNDQwMDAwNjAwMDAwMDAwNDMKKzoxMDhCRDAwMDhGNDIwMTE4MDA0MEY4MDkwMDAwMDAwMDEwMDAwMzJEMkEKKzoxMDhCRTAwMDAwMDAwMDAwOEZBMjAwMjQzQzAzRkZCRjM0NjNGRkZGOUUKKzoxMDhCRjAwMDAwNDMxMDI0M0MwM0ZGRkYwMDQzMTgyNDE0NjAwMDAzQ0IKKzoxMDhDMDAwMEFGQTIwMDI0MTAwMDAwNDAwMDAwMTgyMTNDMDIwMDgwQTgKKzoxMDhDMTAwMDAwNjIxMDI0MTA0MDAwMDcwMDAwMDAwMDhGNDIwMzhDMDcKKzoxMDhDMjAwMDI0NDIwMDAxQUY0MjAzOEM4RjQyMDM4QzEwMDAwMDM2QjcKKzoxMDhDMzAwMDI0MDMwMDAxOEY0MjAyMTAyNDQyMDAwMUFGNDIwMjEwQkYKKzoxMDhDNDAwMDhGNDIwMjEwM0MwMjAwMDEwMDYyMTAyNDEwNDAwMDA2MTYKKzoxMDhDNTAwMDNDMDIwMDAyOEY0MjAxQzQyNDQyMDAwMUFGNDIwMUM0MjEKKzoxMDhDNjAwMDhGNDIwMUM0M0MwMjAwMDIwMDYyMTAyNDEwNDAwMDA2NDIKKzoxMDhDNzAwMDNDMDIwMDA0OEY0MjAzN0MyNDQyMDAwMUFGNDIwMzdDOEIKKzoxMDhDODAwMDhGNDIwMzdDM0MwMjAwMDQwMDYyMTAyNDEwNDAwMDA2NjYKKzoxMDhDOTAwMDNDMDIwMDA4OEY0MjAzODAyNDQyMDAwMUFGNDIwMzgwNUYKKzoxMDhDQTAwMDhGNDIwMzgwM0MwMjAwMDgwMDYyMTAyNDEwNDAwMDA2M0UKKzoxMDhDQjAwMDNDMDIwMDEwOEY0MjAzODQyNDQyMDAwMUFGNDIwMzg0MkYKKzoxMDhDQzAwMDhGNDIwMzg0M0MwMjAwMTAwMDYyMTAyNDEwNDAwMDA2MTIKKzoxMDhDRDAwMDNDMDIwMDIwOEY0MjAxQzAyNDQyMDAwMUFGNDIwMUMwOEIKKzoxMDhDRTAwMDhGNDIwMUMwM0MwMjAwMjAwMDYyMTAyNDEwNDAwMDA2QTgKKzoxMDhDRjAwMDI0MDMwMDAxOEY0MjAzODgyNDQyMDAwMUFGNDIwMzg4MEQKKzoxMDhEMDAwMDhGNDIwMzg4MjQwMzAwMDE4QzAyMDI2MDhGQUIwMDZDNDkKKzoxMDhEMTAwMDAwNEIxMDJCMTA0MDAwMTQzMDcwMDBGRjhGNDIwMUU4MTAKKzoxMDhEMjAwMDI0NDIwMDAxQUY0MjAxRTg4RjQyMDFFODhGQUEwMDdDOTMKKzoxMDhEMzAwMDhGODIwMEUwMzU0QTAxMDBBRkFBMDA3Q0FGQTIwMDEwOEMKKzoxMDhENDAwMDhGODIwMEU0MjQxMDAwMDEzQzA0MDAwMTI0ODQ2OEEwMDgKKzoxMDhENTAwMEFGQTIwMDE0OEZBNjAwMjA4RkE3MDAyNDNDMDUwMDA3QjcKKzoxMDhENjAwMDBDMDAyQjNCMzRBNTA4MDAxMjAwMDAxMDNDMDIwMDgwRDAKKzoxMDhENzAwMDAyQzIxMDI0MTQ0MDAwMEUzMkMyMDQwMDhGQUIwMDdDRUIKKzoxMDhEODAwMDNDMDIwMDgwMzQ0MjAxMDAwMTYyMTAyNDEwNDAwMDA1QzIKKzoxMDhEOTAwMDAwMDAwMDAwOEY0MjAyMEMyNDQyMDAwMUFGNDIwMjBDOEUKKzoxMDhEQTAwMDhGNDIwMjBDMTAwMDAyQjA4RkEzMDA2QzMyQzIwNDAwOEMKKzoxMDhEQjAwMDEwNDAwMDE1MzQwMjgxMDA4RkFBMDA2NDk1NDMwMDBDMTYKKzoxMDhEQzAwMDE0NjIwMDEyM0MwMjAxMDAyNDBCMDIwMEE3QUIwMDhFQ0IKKzoxMDhERDAwMDk1NDIwMDBFOEQ0MzAwMDg4RDQ0MDAwNDhENDUwMDAwMkYKKzoxMDhERTAwMDhGQUEwMDZDOEZBQjAwNjQyNTRBRkZGQ0FGQUEwMDZDMTEKKzoxMDhERjAwMEE3QTIwMDg2QUQ2MzAwMENBRDY0MDAwOEFENjUwMDA0NTkKKzoxMDhFMDAwMDI1NkIwMDA0QUZBQjAwNjQzQzAyMDEwMDAyQzIxMDI0RDkKKzoxMDhFMTAwMDEwNDAwMDA0MDAwMDAwMDA4RkFBMDA2QzI1NEEwMDA0RTYKKzoxMDhFMjAwMEFGQUEwMDZDOEY0MjAwQkM1MDQwMDAwQUFGQTAwMDc0OTMKKzoxMDhFMzAwMDhGQUIwMDZDMDA0QjEwMkI1MDQwMDAwNkFGQTAwMDc0QUQKKzoxMDhFNDAwMDhGNDIwMEJDMDE2MjEwMjNBRkEyMDA3NDhGNEEwMEJDQTUKKzoxMDhFNTAwMEFGQUEwMDZDOEY0MjAwODA4RkFCMDA2QzAwNEIxMDJCRDAKKzoxMDhFNjAwMDEwNDAwMDU2MzJDMjgwMDAxMDQwMDA1RTI0MEEwMDAzMDkKKzoxMDhFNzAwMDMyQzIxMDAwMTA0MDAwNUJBRkFBMDA1QzEwMDAwMDU4MjYKKzoxMDhFODAwMDI0MEIwMDA0OEY0MjAzNTAyNDAzRkZCRjAyODNBMDI0NUQKKzoxMDhFOTAwMDI0NDIwMDAxQUY0MjAzNTAxMDAwMDI0RjhGNDIwMzUwQTIKKzoxMDhFQTAwMDAyQzJCMDI1MjQwMkZGQkYwMjgyQTAyNDhGODMwMTI4QzIKKzoxMDhFQjAwMDNDMDQwMDAxMjQ4NDY4RDAyNjYyMDAwMUFGQTIwMDE0QTMKKzoxMDhFQzAwMEFGQTMwMDEwOEY4NjAxMjA4Rjg3MDEyNDNDMDUwMDA3ODcKKzoxMDhFRDAwMDBDMDAyQjNCMzRBNTIyNTAxMDAwMDIzRjAwMDAwMDAwODQKKzoxMDhFRTAwMDAyQzJCMDI1MjQwMkZGQkYwMjgyQTAyNDhGODMwMTI4ODIKKzoxMDhFRjAwMDNDMDQwMDAxMjQ4NDY4RDAyNDAyMDAwMkFGQTIwMDE0QzQKKzoxMDhGMDAwMEFGQTMwMDEwOEY4NjAxMjA4Rjg3MDEyNDNDMDUwMDA3NDYKKzoxMDhGMTAwMDBDMDAyQjNCMzRBNTI0NTAxMDAwMDIyRjAwMDAwMDAwNTEKKzoxMDhGMjAwMDhFQTIwMDAwOEVBMzAwMDQzQzA0MDAwMTI0ODQ2OEU4QTMKKzoxMDhGMzAwMEFGQjAwMDEwQUZCRTAwMTQ4RUE3MDAxODM0QTUyODAwRjMKKzoxMDhGNDAwMDBDMDAyQjNCMDA2MDMwMjExMDAwMDIyMzAwMDAwMDAwQzkKKzoxMDhGNTAwMEE2QjEwMDBBOEY4MjAxMjQzQzA0MDAwMTI0ODQ2OEYwMzkKKzoxMDhGNjAwMEFGQkUwMDE0QUZBMjAwMTA4RjQ2MDA0NDhGODcwMTIwQ0YKKzoxMDhGNzAwMDNDMDUwMDA3MEMwMDJCM0IzNEE1MzAwMDEwMDAwMjE2MDYKKzoxMDhGODAwMDAwMDAwMDAwQTZCMTAwMEFBNkIyMDAwRThGODIwMTI0RTQKKzoxMDhGOTAwMDNDMDQwMDAxMjQ4NDY4RkNBRkJFMDAxNEFGQTIwMDEwQTIKKzoxMDhGQTAwMDhGNDYwMDQ0OEY4NzAxMjAzQzA1MDAwNzBDMDAyQjNCQjcKKzoxMDhGQjAwMDM0QTUzMjAwMTAwMDAyMDgwMDAwMDAwMDhGNDIwMDg0MzcKKzoxMDhGQzAwMDhGQUEwMDZDMDA0QTEwMkIxNDQwMDAwNzNDMDIwMDAxREQKKzoxMDhGRDAwMDAyQzIxMDI0MTA0MDAwMDQwMDAwMDAwMDI0MEIwMDAyMTQKKzoxMDhGRTAwMEFGQUIwMDVDOEZBQTAwNkMxMTQwMDIxQjI3QUIwMDIwQzYKKzoxMDhGRjAwMEFGQUIwMEE0M0MwQTAwMUYzNTRBRkZGRkFGQUEwMDlDOUMKKzoxMDkwMDAwMDhGQUIwMDVDMjQwQTAwMDE1NTZBMDAyMTI0MEEwMDAyOEIKKzoxMDkwMTAwMDhGNDMwMDU0OEY0MjAwNTAxMDYyMDAwQjI3NEIwMDU0QzYKKzoxMDkwMjAwMDhGNUUwMDU0MzQwM0VDQzBBRkFCMDA0QzI3QzIwMDAxOEMKKzoxMDkwMzAwMDMwNDIwMUZGQUZBMjAwNTQwMDFFMTE0MDAwNDMxMDIxMzYKKzoxMDkwNDAwMDEwMDAwMDZCMDJFMkE4MjE4RjQyMDA0NDhGQUEwMDZDM0UKKzoxMDkwNTAwMDNDMDQwMDAxMjQ4NDY4QUNBRkFBMDAxNEFGQTIwMDEwNDUKKzoxMDkwNjAwMDhGNDYwMDU0OEY0NzAwNTAzQzA1MDAwNzBDMDAyQjNCRjcKKzoxMDkwNzAwMDM0QTUxMzAwOEY0MzAzNTAyNDAyRkZCRjAyODJBMDI0QjMKKzoxMDkwODAwMDI0NjMwMDAxQUY0MzAzNTAxMDAwMDFEMzhGNDIwMzUwMEIKKzoxMDkwOTAwMDE1NkEwMDFEMDAwMDAwMDA4RjQzMDA3NDhGNDIwMDcwQUQKKzoxMDkwQTAwMDEwNjIwMDBBMjc0QjAwNzQ4RjVFMDA3NEFGQUIwMDRDNTcKKzoxMDkwQjAwMDI3QzIwMDAxMzA0MjAzRkZBRkEyMDA1NDAwMUUxMTQwM0UKKzoxMDkwQzAwMDI0NDI2Q0MwMTAwMDAwNEEwMkUyQTgyMThGNDIwMDQ0RjIKKzoxMDkwRDAwMDhGQUEwMDZDM0MwNDAwMDEyNDg0NjhCODNDMDUwMDA3OUEKKzoxMDkwRTAwMEFGQUEwMDE0QUZBMjAwMTA4RjQ2MDA3NDhGNDcwMDcwMjMKKzoxMDkwRjAwMDM0QTUxNTAwMjQwQjAwMDEwQzAwMkIzQkFGQUIwMDVDMkEKKzoxMDkxMDAwMDEwMDBGRkMzMDAwMDAwMDA4RjQzMDA2NDhGNDIwMDYwMjYKKzoxMDkxMTAwMDEwNjIwMDFBMjc0QTAwNjQ4RjVFMDA2NDhGQUIwMDVDMDcKKzoxMDkxMjAwMEFGQUEwMDRDMjdDMjAwMDEzMDQyMDBGRkFGQTIwMDU0OUEKKzoxMDkxMzAwMDI0MDIwMDA0MTU2MjAwMEUwMDFFMTE0MDAwMUUxMTgwNjIKKzoxMDkxNDAwMDI0NDIwQ0MwMDJFMjEwMjFBRkEyMDA0NDk0NDIwMDJBNDMKKzoxMDkxNTAwMDhGQUEwMDQ0OEZBQjAwNkMwMDRCMTAyQjEwNDAwMDI0RjIKKzoxMDkxNjAwMDI1NTUwMDIwMjQwQTAwMDExMDAwMDAyMUEzQUEwMDk3MjEKKzoxMDkxNzAwMDI0NDI0Q0MwMTAwMDAwMUUwMkUyQTgyMThGNDIwMDQ0OEQKKzoxMDkxODAwMDhGQUIwMDZDM0MwNDAwMDEyNDg0NjhDNEFGQUIwMDE0QjYKKzoxMDkxOTAwMEFGQTIwMDEwOEY0NjAwNjQ4RjQ3MDA2MDNDMDUwMDA3QjcKKzoxMDkxQTAwMDBDMDAyQjNCMzRBNTE4MDAzQzAyMDAwODAyQzIxMDI0MUUKKzoxMDkxQjAwMDE0NDBGRjM0MDAwMDAwMDA4RjQyMDM3MDI0MEEwMDAxQjUKKzoxMDkxQzAwMEFGQUEwMDVDMjQ0MjAwMDFBRjQyMDM3MDEwMDBGRjkwODAKKzoxMDkxRDAwMDhGNDIwMzcwMjdBMzAwMzYwMDEzMTA0MDAwNjIxODIxNEQKKzoxMDkxRTAwMDk0NjIwMDAwMDA0NDEwMjExMDAwMDAyMEE0NjIwMDAwREUKKzoxMDkxRjAwMDhGQUIwMDY0QUVBQjAwMTg5M0EyMDA5NzEwNDAwMDcyRDIKKzoxMDkyMDAwMDAwMDA5ODIxOEZBQTAwNDQ4RkE0MDA2QzhGQTMwMEE0QjMKKzoxMDkyMTAwMDI1NDIwMDIwQUZBMjAwMjgyNTQyMDAwOEFGQTIwMDMwNUUKKzoxMDkyMjAwMDI1NDIwMDEwQUZBQTAwMkNBRkEyMDAzNDk1NDIwMDJBQkMKKzoxMDkyMzAwMEE3QTIwMDM4OTU0MjAwMThBN0EyMDAzQTk1NDIwMDFBNEEKKzoxMDkyNDAwMEE3QTIwMDNDOTU0MjAwMUNBN0EyMDAzRTk0NjIwMDE4MTEKKzoxMDkyNTAwMDI0NjMwMDAyMDA4MjIwMjMxODgwRkZERTI2NzMwMDAxQjEKKzoxMDkyNjAwMDJFNjIwMDA0MTQ0MEZGRjkwMDAwMDAwMDhGNDIwMEZDNTEKKzoxMDkyNzAwMDI2NjUwMDAxMDBBMjEwMkExNDQwMDAyQjI0MDMwMDAxREYKKzoxMDkyODAwMDhGODMwMTJDMTA2MDAwMjMwMDAwMDAwMDhGODIwMTI0RDYKKzoxMDkyOTAwMDAwNDMxMDIzMDAwMjIxNDM1ODgwMDAwMTI0ODQwMDQwMzEKKzoxMDkyQTAwMDhGODIwMTI4MDA0MzEwMjMwMDAyMTk0MzU4NjAwMDAxRjcKKzoxMDkyQjAwMDI0NjMwMDQwMDA2NDEwMkE1NDQwMDAwMTAwNjAyMDIxMTMKKzoxMDkyQzAwMEFGNDQwMEZDOEY0MjAwRkMwMEEyMTAyQTEwNDAwMDExQTUKKzoxMDkyRDAwMDI0MDMwMDAxMTAwMDAwMTUzMDYyMDBGRjhGQUIwMDY0MTIKKzoxMDkyRTAwMDk2MDcwMDE4QUZBQjAwMTA4RTIyMDAwODNDMDQwMDAxNjYKKzoxMDkyRjAwMDI0ODQ2OERDOEM0MzAwMDQ4QzQyMDAwMDM0QTUyNDAwRTQKKzoxMDkzMDAwMDAyNDAzMDIxMEMwMDJCM0JBRkEzMDAxNDEwMDAwMDJCQjcKKzoxMDkzMTAwMDAwMDAwMDAwOEY0MjAzMzQwMDAwMTgyMTI0NDIwMDAxQTUKKzoxMDkzMjAwMEFGNDIwMzM0OEY0MjAzMzQzMDYyMDBGRjUwNDBGRURDMTIKKzoxMDkzMzAwMDNDMDIwODAwMTI2MDAwMjEwMDAwOTAyMThGQjEwMEE0QkYKKzoxMDkzNDAwMDAyMjA4MDIxOEUyMjAwMDg5NjA3MDAxODhGQTYwMDY0NTQKKzoxMDkzNTAwMDhDNDQwMDAwOEM0NTAwMDQyNDBBMDAwMUFGQUEwMDEwRDAKKzoxMDkzNjAwMEFGQkUwMDE0OEY0MjAwMDhBRkEyMDAxODhGNDIwMTBDNUMKKzoxMDkzNzAwMDAwNDBGODA5MDAwMDAwMDAxMDQwRkZEODNDMDUwMDA3M0QKKzoxMDkzODAwMDk2MDIwMDE4OEZBQjAwNjQ4RkFBMDA5QzAxNjI1ODIxREUKKzoxMDkzOTAwMDAxNEIxMDJCMTA0MDAwMDRBRkFCMDA2NDhGNDIwMTQ4MUEKKzoxMDkzQTAwMDAxNjI1ODIzQUZBQjAwNjQyNjEwMDAwMjI2NTIwMDAxNzAKKzoxMDkzQjAwMDAyNTMxMDJCMTQ0MEZGRTMyNjMxMDAwNDhGQjAwMDZDRTEKKzoxMDkzQzAwMDEwMDAwMDM2OTdCMTAwMzg4RjQyMDBGQzI0MDUwMDAyREYKKzoxMDkzRDAwMDAwQTIxMDJBMTQ0MDAwMUIyNDAzMDAwMThGODMwMTJDREIKKzoxMDkzRTAwMDEwNjAwMDEzMDAwMDAwMDA4RjgyMDEyNDAwNDMxMDIzNEUKKzoxMDkzRjAwMDAwMDIyMTQzNTg4MDAwMDEyNDg0MDA0MDhGODIwMTI4MEMKKzoxMDk0MDAwMDAwNDMxMDIzMDAwMjE5NDM1ODYwMDAwMTI0NjMwMDQwMDgKKzoxMDk0MTAwMDAwNjQxMDJBNTQ0MDAwMDEwMDYwMjAyMUFGNDQwMEZDODkKKzoxMDk0MjAwMDhGNDIwMEZDMDBBMjEwMkExNDQwMDAwNjI0MDMwMDAxMTEKKzoxMDk0MzAwMDhGNDIwMzM0MDAwMDE4MjEyNDQyMDAwMUFGNDIwMzM0NUMKKzoxMDk0NDAwMDhGNDIwMzM0MzA2MjAwRkYxMDQwRkVBNTNDMDIwODAwNEEKKzoxMDk0NTAwMDk2QjEwMDBBOEZCMDAwNkMzMjIzRkZGRjAwNzAxMDJCMTIKKzoxMDk0NjAwMDU0NDAwMDAxMDA2MDgwMjE4RUE0MDAwMDhFQTUwMDA0RkQKKzoxMDk0NzAwMDI0MEIwMDAxQUZBQjAwMTBBRkJFMDAxNDhGNDIwMDA4RjgKKzoxMDk0ODAwMDhGQTYwMDY0QUZBMjAwMTg4RjQyMDEwQzAwNDBGODA5QkIKKzoxMDk0OTAwMDAyMDAzODIxMTA0MEZFQTIzQzA1MDAwNzk2QTMwMDBFRjIKKzoxMDk0QTAwMDk3QUEwMDhFMTE0MDAwMDcwMDYwOTAyMTkzNDIwNUM0RTYKKzoxMDk0QjAwMDE0NDAwMDA0MDAwMDAwMDA5N0FCMDA4NjAwNkExODI1RTUKKzoxMDk0QzAwMEE2QUIwMDE2OEZBQTAwN0MzQzAyRkZGRjAxNDIxMDI0Q0QKKzoxMDk0RDAwMDEwNDAwMDAzMDAwQTE0MDIzNDYzMDQwMEE2QTIwMDE0MjIKKzoxMDk0RTAwMDhGQUIwMDZDNTYwQjAwNzJBNkEzMDAwRTM0NjIwMDA0MTIKKzoxMDk0RjAwMEE2QTIwMDBFOEZBQTAwNzQwMTZBMTAyMUE2QTIwMDBBN0IKKzoxMDk1MDAwMDhGNDMwMDQ0OEY0NDAxQTA4RjQ1MDFBNDM0MDI4MDAwQTIKKzoxMDk1MTAwMEFGQTIwMDEwOEY0MjAwNDQwMkEwMzAyMTI0MDcwMDIwOTcKKzoxMDk1MjAwMEFGQTIwMDE0OEY0MjAwMEMwMDAzMTk0MDAwNjA0ODIxRDQKKzoxMDk1MzAwMEFGQTIwMDE4OEY0MjAxMEMwMDAwNDAyMTAwQTkyODIxOTEKKzoxMDk1NDAwMDAwQTkxODJCMDA4ODIwMjEwMDQwRjgwOTAwODMyMDIxNjEKKzoxMDk1NTAwMDUwNDBGRTdGQTZCMjAwMEU4RjQyMDM2OEFGQTAwMDZDQTEKKzoxMDk1NjAwMEEzNDAwNUM0MjQ0MkZGRkZBRjQyMDM2ODhGQUIwMDVDRjkKKzoxMDk1NzAwMDI0MEEwMDAxOEY0MjAzNjgxNTZBMDAwNjI0MEEwMDAyQ0IKKzoxMDk1ODAwMDhGNDIwMzVDMjQ0MkZGRkZBRjQyMDM1QzEwMDAwMDBDREIKKzoxMDk1OTAwMDhGNDIwMzVDMTU2QTAwMDYwMDAwMDAwMDhGNDIwMzY0REUKKzoxMDk1QTAwMDI0NDJGRkZGQUY0MjAzNjQxMDAwMDAwNThGNDIwMzY0QjIKKzoxMDk1QjAwMDhGNDIwMzYwMjQ0MkZGRkZBRjQyMDM2MDhGNDIwMzYwOEIKKzoxMDk1QzAwMDhGQUEwMDU0OEZBQjAwNENBRDZBMDAwMDhGNDIwMDQ0NUMKKzoxMDk1RDAwMDhGNDQwMDg4OEY0MzAwNzgyNDQyMDAwMTAwNDQxMDI0MDcKKzoxMDk1RTAwMDI0NjMwMDAxQUY0MjAwNDRBRjQzMDA3ODhDMDIwMjQwODQKKzoxMDk1RjAwMDAwNjIxODJCMTQ2MDAwNzUyNDA3MDAwODhGNDQwMTY4NkUKKzoxMDk2MDAwMDhGNDUwMTZDOEY0MzAwNDQ4RjQ4MDAwQzhGODYwMTIwRUEKKzoxMDk2MTAwMDI0MDIwMDQwQUZBMjAwMTBBRkEzMDAxNEFGQTgwMDE4QUUKKzoxMDk2MjAwMDhGNDIwMTBDMDA0MEY4MDkyNEM2MDAxQzE0NDAwMDExQjAKKzoxMDk2MzAwMDI0MEIwMDAxM0MwMTAwMDEwMDM3MDgyMUEwMkI0MEYyNUYKKzoxMDk2NDAwMDhGODIwMTI0QUZBMjAwMTA4RjgyMDEyODNDMDQwMDAxMDgKKzoxMDk2NTAwMDI0ODQ2ODhDQUZBMjAwMTQ4RjQ2MDA0NDhGODcwMTIwQjkKKzoxMDk2NjAwMDNDMDUwMDA5MEMwMDJCM0IzNEE1MTMwMDEwMDAwMDBCMzcKKzoxMDk2NzAwMDAwMDAwMDAwOEY0MjAzMDQyNDQyMDAwMUFGNDIwMzA0QjMKKzoxMDk2ODAwMDhGNDIwMzA0OEY0MjAwNDRBRjQyMDA3QzNDMDEwMDAxNDIKKzoxMDk2OTAwMDAwMzcwODIxQTAyMDQwRjJBRjQwMDA3ODhGNDIwMzE4MjUKKzoxMDk2QTAwMDI0NDIwMDAxQUY0MjAzMTgxMDAwMDA0ODhGNDIwMzE4MDMKKzoxMDk2QjAwMEE2QjAwMDBBOEY0MzAwNDQ4RjQ0MDFBMDhGNDUwMUE0NDcKKzoxMDk2QzAwMDM0MDI4MDAwQUZBMjAwMTA4RjQyMDA0NDAyQTAzMDIxN0IKKzoxMDk2RDAwMDI0MDcwMDIwQUZBMjAwMTQ4RjQyMDAwQzAwMDMxOTQwQTEKKzoxMDk2RTAwMDAwNjA0ODIxQUZBMjAwMTg4RjQyMDEwQzAwMDA0MDIxMDkKKzoxMDk2RjAwMDAwQTkyODIxMDBBOTE4MkIwMDg4MjAyMTAwNDBGODA5ODIKKzoxMDk3MDAwMDAwODMyMDIxMTA0MEZFMUYyNDBBMDAwMUEzNEEwNUM0NDMKKzoxMDk3MTAwMDhGQUIwMDZDOEZBQTAwNjQwMTcwNTgyM0FGQUIwMDZDNTQKKzoxMDk3MjAwMDhGQUIwMDlDMDE1MDUwMjEwMTZBMTAyQjEwNDAwMDA0QTcKKzoxMDk3MzAwMEFGQUEwMDY0OEY0MjAxNDgwMTQyNTAyM0FGQUEwMDY0REYKKzoxMDk3NDAwMDhGNDIwMzY4MjQ0MkZGRkZBRjQyMDM2ODhGQUEwMDVDODgKKzoxMDk3NTAwMDI0MEIwMDAxOEY0MjAzNjgxNTRCMDAwNjI0MEIwMDAyMDYKKzoxMDk3NjAwMDhGNDIwMzVDMjQ0MkZGRkZBRjQyMDM1QzEwMDAwMDBDRjkKKzoxMDk3NzAwMDhGNDIwMzVDMTE0QjAwMDYwMDAwMDAwMDhGNDIwMzYwMjMKKzoxMDk3ODAwMDI0NDJGRkZGQUY0MjAzNjAxMDAwMDAwNThGNDIwMzYwRDgKKzoxMDk3OTAwMDhGNDIwMzY0MjQ0MkZGRkZBRjQyMDM2NDhGNDIwMzY0OUQKKzoxMDk3QTAwMDhGQUIwMDU0OEZBQTAwNENBRDRCMDAwMDhGNDIwMDQ0OTkKKzoxMDk3QjAwMDhGNDQwMDg4OEY0MzAwNzgyNDQyMDAwMTAwNDQxMDI0MjUKKzoxMDk3QzAwMDI0NjMwMDAxQUY0MjAwNDRBRjQzMDA3ODhGQUEwMDZDQ0QKKzoxMDk3RDAwMDE1NDBGRTBCMDAwMDAwMDA4RkFCMDA2QzExNjAwMDFFRjYKKzoxMDk3RTAwMDAwMDAwMDAwOTM0MjA1QzQxMDQwMDAwOTAwMDAwMDAwODIKKzoxMDk3RjAwMDhGQUEwMDY0QUY0QTAwQzRBRjRCMDBDMDhGQUIwMDdDOUYKKzoxMDk4MDAwMEFGNEIwMEM4OEZBQTAwNzQxMDAwMDAwRUFGNEEwMENDMDYKKzoxMDk4MTAwMDk3QUIwMDhFMTE2MDAwMEIzNDAzODEwMDhGQTIwMDIwRjMKKzoxMDk4MjAwMDhDNDYwMDBDQTQ0MzAwMEM5N0FBMDA4NjhDNDQwMDA0Q0MKKzoxMDk4MzAwMDhDNDUwMDA4QTQ0QTAwMEVBQzQ0MDAwMEFDNDUwMDA0NkUKKzoxMDk4NDAwMEFDNDYwMDA4OEY0MjAzNEMyNDQyMDAwMUFGNDIwMzRDNTcKKzoxMDk4NTAwMDEwMDAwMDEwOEY0MjAzNEM4RkFCMDA3QzMxNjRGRkZGN0YKKzoxMDk4NjAwMDI0ODRGRkZDMDA4MDE4MjE4RjQ0MDI1MDhGNDUwMjU0NEQKKzoxMDk4NzAwMDhGNDYwMTE4MDAwMDEwMjEwMEEzMjgyMTAwQTMzODJCRDcKKzoxMDk4ODAwMDAwODIyMDIxMDA4NzIwMjFBRjQ0MDI1MDAwQzBGODA5NDcKKzoxMDk4OTAwMEFGNDUwMjU0OEZCRjAwQzg4RkJFMDBDNDhGQjUwMEMwNTMKKzoxMDk4QTAwMDhGQjMwMEJDOEZCMjAwQjg4RkIxMDBCNDhGQjAwMEIwREUKKzoxMDk4QjAwMDAzRTAwMDA4MjdCRDAwRDAwM0UwMDAwODAwMDAwMDAwMUUKKzoxMDk4QzAwMDI3QkRGRjM4MjQwQjAwMDFBRkJGMDBDMEFGQkUwMEJDRjYKKzoxMDk4RDAwMEFGQjUwMEI4QUZCMzAwQjRBRkIyMDBCMEFGQjEwMEFDMzkKKzoxMDk4RTAwMEFGQjAwMEE4QTNBMDAwODdBRkEwMDA0NEFGQUIwMDVDNUUKKzoxMDk4RjAwMDkzNDIwNUM0QTdBMDAwNzYxMDQwMDAwN0E3QTAwMDdFRjEKKzoxMDk5MDAwMDhGNEMwMEMwQUZBQzAwNjQ4RjRCMDBDODhGNUUwMEM0QUEKKzoxMDk5MTAwMDEwMDAwMTMwQUZBQjAwNkM4RjQyMDExNDAwNDBGODA5MTkKKzoxMDk5MjAwMDAwMDAwMDAwMDA0MDMwMjExMEMwMDJBMTAwMDAwMDAwMzMKKzoxMDk5MzAwMDhDQzIwMDAwOENDMzAwMDRBRkEyMDAyMEFGQTMwMDI0OUYKKzoxMDk5NDAwMDhGQUMwMDI0OEZCRTAwMjAzMTgyRkZGRjI0NDJGRkZDMzkKKzoxMDk5NTAwMEFGQTIwMDY0M0MwMjAwMDYwMkMyMTAyNDE0NDAwMDE1QUQKKzoxMDk5NjAwMEFGQUMwMDZDOTNDMjAwMDAzMDQyMDAwMTEwNDAwMDExMDcKKzoxMDk5NzAwMDI0MDJGRkZGOEZDMzAwMDAxNDYyMDAwNDM0MDJGRkZGQzMKKzoxMDk5ODAwMDk3QzMwMDA0MTA2MjAwMEIwMDAwMDAwMDBDMDAyNEJCMTEKKzoxMDk5OTAwMDAzQzAyMDIxMzA0MjAwRkYxNDQwMDAwNjAwMDAwMDAwRjgKKzoxMDk5QTAwMDhGNDIwMTE4MDA0MEY4MDkwMDAwMDAwMDEwMDAwMjgwRkEKKzoxMDk5QjAwMDAwMDAwMDAwOEZBMjAwMjQzQzAzRkZCRjM0NjNGRkZGQzAKKzoxMDk5QzAwMDAwNDMxMDI0M0MwM0ZGRkYwMDQzMTgyNDE0NjAwMDAzRUQKKzoxMDk5RDAwMEFGQTIwMDI0MTAwMDAwNDAwMDAwODAyMTNDMDIwMDgwNjMKKzoxMDk5RTAwMDAwNjIxMDI0MTA0MDAwMDcwMDAwMDAwMDhGNDIwMzhDMkEKKzoxMDk5RjAwMDI0NDIwMDAxQUY0MjAzOEM4RjQyMDM4QzEwMDAwMDM2REEKKzoxMDlBMDAwMDI0MTAwMDAxOEY0MjAyMTAyNDQyMDAwMUFGNDIwMjEwRDQKKzoxMDlBMTAwMDhGNDIwMjEwM0MwMjAwMDEwMDYyMTAyNDEwNDAwMDA2MzgKKzoxMDlBMjAwMDNDMDIwMDAyOEY0MjAxQzQyNDQyMDAwMUFGNDIwMUM0NDMKKzoxMDlBMzAwMDhGNDIwMUM0M0MwMjAwMDIwMDYyMTAyNDEwNDAwMDA2NjQKKzoxMDlBNDAwMDNDMDIwMDA0OEY0MjAzN0MyNDQyMDAwMUFGNDIwMzdDQUQKKzoxMDlBNTAwMDhGNDIwMzdDM0MwMjAwMDQwMDYyMTAyNDEwNDAwMDA2ODgKKzoxMDlBNjAwMDNDMDIwMDA4OEY0MjAzODAyNDQyMDAwMUFGNDIwMzgwODEKKzoxMDlBNzAwMDhGNDIwMzgwM0MwMjAwMDgwMDYyMTAyNDEwNDAwMDA2NjAKKzoxMDlBODAwMDNDMDIwMDEwOEY0MjAzODQyNDQyMDAwMUFGNDIwMzg0NTEKKzoxMDlBOTAwMDhGNDIwMzg0M0MwMjAwMTAwMDYyMTAyNDEwNDAwMDA2MzQKKzoxMDlBQTAwMDNDMDIwMDIwOEY0MjAxQzAyNDQyMDAwMUFGNDIwMUMwQUQKKzoxMDlBQjAwMDhGNDIwMUMwM0MwMjAwMjAwMDYyMTAyNDEwNDAwMDA2Q0EKKzoxMDlBQzAwMDI0MTAwMDAxOEY0MjAzODgyNDQyMDAwMUFGNDIwMzg4MjIKKzoxMDlBRDAwMDhGNDIwMzg4MjQxMDAwMDE4QzAyMDI2MDhGQUIwMDY0NjcKKzoxMDlBRTAwMDAwNEIxMDJCMTA0MDAwMTUzMjAyMDBGRjhGNDIwMUU4OUUKKzoxMDlBRjAwMDI0NDIwMDAxQUY0MjAxRTg4RjQyMDFFODhGQUMwMDZDQzQKKzoxMDlCMDAwMDhGODIwMEUwMzU4QzAxMDBBRkFDMDA2Q0FGQTIwMDEwN0EKKzoxMDlCMTAwMDhGODIwMEU0MjQxMDAwMDEzQzA0MDAwMTI0ODQ2OEEwMkEKKzoxMDlCMjAwMEFGQTIwMDE0OEZBNjAwMjA4RkE3MDAyNDNDMDUwMDA3RDkKKzoxMDlCMzAwMDBDMDAyQjNCMzRBNTM2MDAzMjAyMDBGRjEwNDAwMDEwMTEKKzoxMDlCNDAwMDNDMDIwMDgwMDJDMjEwMjQxNDQwMDAwRTMyQzIwNDAwMDUKKzoxMDlCNTAwMDhGQUIwMDZDM0MwMjAwODAzNDQyMDEwMDAxNjIxMDI0OTMKKzoxMDlCNjAwMDEwNDAwMDA1MDAwMDAwMDA4RjQyMDIwQzI0NDIwMDAxNUEKKzoxMDlCNzAwMEFGNDIwMjBDOEY0MjAyMEMxMDAwMDIwMjhGQTMwMDY0NUQKKzoxMDlCODAwMDMyQzIwNDAwMTA0MDAwMTIzNDAyODEwMDk3QzMwMDBDNUUKKzoxMDlCOTAwMDE0NjIwMDBGMDAwMDAwMDAyNDBDMDIwMEE3QUMwMDc2NDUKKzoxMDlCQTAwMDk3QzIwMDBFOEZDMzAwMDg4RkM0MDAwNDhGQUIwMDY0RkYKKzoxMDlCQjAwMDhGQzUwMDAwMjU2QkZGRkNBRkFCMDA2NEE3QTIwMDdFNDEKKzoxMDlCQzAwMEFGQzMwMDBDQUZDNDAwMDhBRkM1MDAwNDI3REUwMDA0MUIKKzoxMDlCRDAwMDhGQTcwMDY0MzIwMjAwRkYxNDQwMDAzNDNDMDIwMTAwRjEKKzoxMDlCRTAwMDk3QzQwMDBDMkM4MzA1REQzODgyODg3MDJDNDIwMDAxNUMKKzoxMDlCRjAwMDAwNjIxODI1MTA2MDAwMTUwMDAwMjgyMTMyQzIwODAwRkMKKzoxMDlDMDAwMDEwNDAwMDE1MjQwMjA4MDA5N0MzMDAxNDE0NjIwMDEyQ0IKKzoxMDlDMTAwMDM0MDJBQUFBOTdDMzAwMEUxNDYyMDAwNzAwMDAyMDIxOTQKKzoxMDlDMjAwMDk3QzMwMDEwMjQwMjAzMDAxNDYyMDAwNDAwODAxMDIxNzYKKzoxMDlDMzAwMDk3QzIwMDEyMkM0NDAwMDEwMDgwMTAyMTU0NDAwMDA2RkQKKzoxMDlDNDAwMDI0MDUwMDE2MTAwMDAwMDQwMDAwMDAwMDI0MDIwODAwOTMKKzoxMDlDNTAwMDUwODIwMDAxMjQwNTAwMEUxMEEwMDAxMzAzQzUyMDIxMkUKKzoxMDlDNjAwMDI0ODMwMDA5M0MwMjAwMUYzNDQyRkZGRjAwNDMxMDJCRjUKKzoxMDlDNzAwMDEwNDAwMDAzMDAwMDAwMDA4RjQyMDE0ODAwNjIxODIzREEKKzoxMDlDODAwMDkwNjIwMDAwMzg0MzAwMDYyQzYzMDAwMTM4NDIwMDExNDYKKzoxMDlDOTAwMDJDNDIwMDAxMDA2MjE4MjUxMDYwMDAwNDNDMDIwMTAwMDMKKzoxMDlDQTAwMDk0ODIwMDAyMDA0NTM4MjEzQzAyMDEwMDAyQzIxMDI0QzcKKzoxMDlDQjAwMDUwNDAwMDBFQUZBNzAwNjQ4RkFDMDA2NDEwRUMwMDA4QTkKKzoxMDlDQzAwMDNDMDUwMDA3M0MwNDAwMDEyNDg0NjkwODhGQTYwMDY0NTkKKzoxMDlDRDAwMDM0QTU0MDAwQUZBMDAwMTAwQzAwMkIzQkFGQTAwMDE0MzcKKzoxMDlDRTAwMDhGQUIwMDY0MjU2QjAwMDRBRkFCMDA2NDhGNDIwMDgwMzMKKzoxMDlDRjAwMDhGQUMwMDY0MDA0QzEwMkIxMDQwMDAyQzMyQzI4MDAwNEUKKzoxMDlEMDAwMDEwNDAwMDM0MjQwQjAwMDMzMkMyMTAwMDEwNDAwMDMxMTgKKzoxMDlEMTAwMEFGQUIwMDVDMTAwMDAwMkUyNDBDMDAwNDhGNDIwMzUwRjcKKzoxMDlEMjAwMDI0MDNGRkJGMDI4M0EwMjQyNDQyMDAwMUFGNDIwMzUwNUEKKzoxMDlEMzAwMDEwMDAwMTczOEY0MjAzNTAzQzAyMDgwMDAyQzJCMDI1OUMKKzoxMDlENDAwMDI0MDJGRkJGMDI4MkEwMjQ4RjgzMDEyODNDMDQwMDAxNkIKKzoxMDlENTAwMDI0ODQ2OEQwMjY2MjAwMDFBRkEyMDAxNEFGQTMwMDEwRDMKKzoxMDlENjAwMDhGODYwMTIwOEY4NzAxMjQzQzA1MDAwNzBDMDAyQjNCQzgKKzoxMDlENzAwMDM0QTU1MzAwMTAwMDAxNjIwMDAwMDAwMDhFQTIwMDAwMTQKKzoxMDlEODAwMDhFQTMwMDA0M0MwNDAwMDEyNDg0NjhFOEFGQjAwMDEwRjYKKzoxMDlEOTAwMEFGQjEwMDE0OEVBNzAwMTgzNEE1NTkwMDBDMDAyQjNCNUUKKzoxMDlEQTAwMDAwNjAzMDIxMTAwMDAxNTYwMDAwMDAwMDhGNDIwMDg0NDYKKzoxMDlEQjAwMDhGQUIwMDY0MDA0QjEwMkIxNDQwMDAwNzNDMDIwMDAxRTUKKzoxMDlEQzAwMDAyQzIxMDI0MTA0MDAwMDQwMDAwMDAwMDI0MEMwMDAyMTUKKzoxMDlERDAwMEFGQUMwMDVDOEZBQjAwNjQxMTYwMDE2NjI3QUMwMDIwNjMKKzoxMDlERTAwMEFGQUMwMDhDOEZBQjAwNUMyNDBDMDAwMTU1NkMwMDIxRTMKKzoxMDlERjAwMDI0MEMwMDAyOEY0MzAwNTQ4RjQyMDA1MDEwNjIwMDBCNkQKKzoxMDlFMDAwMDI3NEIwMDU0OEY1MTAwNTQzNDAzRUNDMEFGQUIwMDRDQ0YKKzoxMDlFMTAwMDI2MjIwMDAxMzA0MjAxRkZBRkEyMDA1NDAwMTExMTQwODAKKzoxMDlFMjAwMDAwNDMxMDIxMTAwMDAwNkIwMkUyQTgyMThGNDIwMDQ0ODEKKzoxMDlFMzAwMDhGQUMwMDY0M0MwNDAwMDEyNDg0NjhBQ0FGQUMwMDE0MTcKKzoxMDlFNDAwMEFGQTIwMDEwOEY0NjAwNTQ4RjQ3MDA1MDNDMDUwMDA3MUEKKzoxMDlFNTAwMDBDMDAyQjNCMzRBNTQzMDA4RjQzMDM1MDI0MDJGRkJGNkIKKzoxMDlFNjAwMDAyODJBMDI0MjQ2MzAwMDFBRjQzMDM1MDEwMDAwMTI0QTgKKzoxMDlFNzAwMDhGNDIwMzUwMTU2QzAwMUQwMDAwMDAwMDhGNDMwMDc0REEKKzoxMDlFODAwMDhGNDIwMDcwMTA2MjAwMEEyNzRCMDA3NDhGNTEwMDc0REIKKzoxMDlFOTAwMEFGQUIwMDRDMjYyMjAwMDEzMDQyMDNGRkFGQTIwMDU0QkEKKzoxMDlFQTAwMDAwMTExMTQwMjQ0MjZDQzAxMDAwMDA0QTAyRTJBODIxQjcKKzoxMDlFQjAwMDhGNDIwMDQ0OEZBQzAwNjQzQzA0MDAwMTI0ODQ2OEI4RTUKKzoxMDlFQzAwMDNDMDUwMDA3QUZBQzAwMTRBRkEyMDAxMDhGNDYwMDc0MzEKKzoxMDlFRDAwMDhGNDcwMDcwMzRBNTQ1MDAyNDBCMDAwMTBDMDAyQjNCN0MKKzoxMDlFRTAwMEFGQUIwMDVDMTAwMEZGQzMwMDAwMDAwMDhGNDMwMDY0QjQKKzoxMDlFRjAwMDhGNDIwMDYwMTA2MjAwMUEyNzRDMDA2NDhGNTEwMDY0OEEKKzoxMDlGMDAwMDhGQUIwMDVDQUZBQzAwNEMyNjIyMDAwMTMwNDIwMEZGNUEKKzoxMDlGMTAwMEFGQTIwMDU0MjQwMjAwMDQxNTYyMDAwRTAwMTExMTQwOEIKKzoxMDlGMjAwMDAwMTExMTgwMjQ0MjBDQzAwMkUyMTAyMUFGQTIwMDQ0QjMKKzoxMDlGMzAwMDk0NDIwMDJBOEZBQzAwNDQ4RkFCMDA2NDAwNEIxMDJCN0UKKzoxMDlGNDAwMDEwNDAwMDI0MjU5NTAwMjAyNDBDMDAwMTEwMDAwMDIxNjEKKzoxMDlGNTAwMEEzQUMwMDg3MjQ0MjRDQzAxMDAwMDAxRTAyRTJBODIxREUKKzoxMDlGNjAwMDhGNDIwMDQ0OEZBQjAwNjQzQzA0MDAwMTI0ODQ2OEM0MjkKKzoxMDlGNzAwMEFGQUIwMDE0QUZBMjAwMTA4RjQ2MDA2NDhGNDcwMDYwQTMKKzoxMDlGODAwMDNDMDUwMDA3MEMwMDJCM0IzNEE1NDgwMDNDMDIwMDA4QjAKKzoxMDlGOTAwMDAyQzIxMDI0MTQ0MEZGNjEwMDAwMDAwMDhGNDIwMzcwRDEKKzoxMDlGQTAwMDI0MEMwMDAxQUZBQzAwNUMyNDQyMDAwMUFGNDIwMzcwRkUKKzoxMDlGQjAwMDEwMDBGRjkwOEY0MjAzNzAyN0EzMDAzNjAwMTMxMDQwNUIKKzoxMDlGQzAwMDAwNjIxODIxOTQ2MjAwMDAwMDQ0MTAyMTEwMDAwMDFGNUMKKzoxMDlGRDAwMEE0NjIwMDAwQUVCRTAwMTg5M0EyMDA4NzEwNDAwMDg0NjcKKzoxMDlGRTAwMDAwMDA5ODIxOEZBQjAwNDQ4RkE0MDA2NDhGQTMwMDhDRTUKKzoxMDlGRjAwMDI1NjIwMDIwQUZBMjAwMjgyNTYyMDAwOEFGQTIwMDMwMzEKKzoxMEEwMDAwMDI1NjIwMDEwQUZBQjAwMkNBRkEyMDAzNDk1NjIwMDJBOEQKKzoxMEEwMTAwMEE3QTIwMDM4OTU2MjAwMThBN0EyMDAzQTk1NjIwMDFBMUMKKzoxMEEwMjAwMEE3QTIwMDNDOTU2MjAwMUNBN0EyMDAzRTk0NjIwMDE4MDMKKzoxMEEwMzAwMDI0NjMwMDAyMDA4MjIwMjMxODgwRkZERjI2NzMwMDAxQzIKKzoxMEEwNDAwMDJFNjIwMDA0MTQ0MEZGRjkwMDAwMDAwMDhGNDIwMEZDNjMKKzoxMEEwNTAwMDAyNjIxMDJBMTQ0MDAwMzAyNDAzMDAwMThGODMwMTJDNzcKKzoxMEEwNjAwMDEwNjAwMDI4MDAwMDAwMDA4RjgyMDEyNDAwNDMxMDIzQUMKKzoxMEEwNzAwMDAwMDIyMTQzNTg4MDAwMDEyNDg0MDA0MDhGODIwMTI4N0YKKzoxMEEwODAwMDAwNDMxMDIzMDAwMjE5NDM1ODYwMDAwMTI0NjMwMDQwN0MKKzoxMEEwOTAwMDAwNjQxMDJBNTQ0MDAwMDEwMDYwMjAyMUFGNDQwMEZDRkQKKzoxMEEwQTAwMDhGNDIwMEZDMDI2MjEwMkExMDQwMDAxNjI0MDMwMDAxQjcKKzoxMEEwQjAwMDEwMDAwMDFBMzA2MjAwRkY4RkFDMDA4QzAwMTAxMDQwQkUKKzoxMEEwQzAwMDAwNEMxMDIxOTQ0NzAwMTgwMDEwMTA4MDAwNEMxMDIxMDMKKzoxMEEwRDAwMEFGQkUwMDEwOEM0MjAwMDgzQzA0MDAwMTI0ODQ2OERDMDAKKzoxMEEwRTAwMDNDMDUwMDA3OEM0MzAwMDQ4QzQyMDAwMDM0QTU1NTAwNTkKKzoxMEEwRjAwMDAyMDAzMDIxMEMwMDJCM0JBRkEzMDAxNDEwMDAwMDM5RUMKKzoxMEExMDAwMDAwMDAwMDAwOEY0MjAzMzQwMDAwMTgyMTI0NDIwMDAxQTcKKzoxMEExMTAwMEFGNDIwMzM0OEY0MjAzMzQzMDYyMDBGRjEwNDBGRjA2MjkKKzoxMEExMjAwMDAwMDA4MDIxOEY0MzAwMDgyNDAyRkJGRjEyNjAwMDJERjUKKzoxMEExMzAwMDAwNjI1MDI0M0MwQjQwMDAwMjJCNDAyNThGQjEwMDhDNjQKKzoxMEExNDAwMDI2NjlGRkZGMDIyMDkwMjE4RTQyMDAwODk2MjcwMDE4MDIKKzoxMEExNTAwMDhDNDQwMDAwOEM0NTAwMDQ1NjA5MDAwNDI0MEIwMDAxQzcKKzoxMEExNjAwMDI0MEMwMDAyMTAwMDAwMDJBRkFDMDAxMEFGQUIwMDEwRDYKKzoxMEExNzAwMDE2MDAwMDA0QUZBODAwMTQ4RjQyMDAwODEwMDAwMDAyNkYKKzoxMEExODAwMEFGQTIwMDE4QUZBQTAwMTg4RjQyMDEwQzAzQzAzMDIxMDMKKzoxMEExOTAwMEFGQTgwMDk4QUZBOTAwOUMwMDQwRjgwOUFGQUEwMEEwQTIKKzoxMEExQTAwMDhGQTgwMDk4OEZBOTAwOUM4RkFBMDBBMDEwNDBGRkMyMjIKKzoxMEExQjAwMDNDMDIwMDFGOTYyMzAwMTgzNDQyRkZGRjAzQzNGMDIxMjYKKzoxMEExQzAwMDAwNUUxMDJCMTA0MDAwMDMyNjMxMDAwMjhGNDIwMTQ4MzAKKzoxMEExRDAwMDAzQzJGMDIzMjYxMDAwMDEwMjEzMTAyQjE0NDBGRkRBRjMKKzoxMEExRTAwMDI2NTIwMDA0OEZCMDAwNjQxMDAwMDAxQTAwMDAwMDAwMjYKKzoxMEExRjAwMDk2QTMwMDBBOEZCMDAwNjQwMDcwMTAyQjU0NDAwMDAxMzkKKzoxMEEyMDAwMDAwNjA4MDIxOEVBNDAwMDA4RUE1MDAwNDhGQUIwMDVDNEUKKzoxMEEyMTAwMDI0MEMwMDAyQUZBQzAwMTA5MzQzMDVDNDAwMEIxNzAwRTAKKzoxMEEyMjAwMDEwNjAwMDAzMDIyMjMwMjUzQzAyMDgwMDAwQzIzMDI1RTUKKzoxMEEyMzAwMEFGQTYwMDE0OEY0MjAwMDhBRkEyMDAxODhGNDIwMTBDOTUKKzoxMEEyNDAwMDAzQzAzMDIxMDA0MEY4MDkwMjAwMzgyMTEwNDBGRUNCNDUKKzoxMEEyNTAwMDNDMDUwMDA3OTdBQzAwNzYxMTgwMDAwNzk2QTMwMDBFMUUKKzoxMEEyNjAwMDkzNDIwNUM0MTQ0MDAwMDQwMDAwMDAwMDk3QUIwMDdFMzgKKzoxMEEyNzAwMDAwNkMxODI1QTZBQjAwMTY4RkFDMDA2QzNDMDJGRkZGRUIKKzoxMEEyODAwMDAxODIxMDI0MTA0MDAwMDMwMDBDMTQwMjM0NjMwNDAwMDcKKzoxMEEyOTAwMEE2QTIwMDE0QTZCMDAwMEE4RkFCMDA2NDU2MEIwMDA2RkQKKzoxMEEyQTAwMDAzRDBGMDIxMzQ2MjAwMDRBRkEwMDA2NEE2QTIwMDBFMjcKKzoxMEEyQjAwMDEwMDAwMDBEQTM0MDA1QzQ4RkFDMDA2NDNDMDIwMDFGRDkKKzoxMEEyQzAwMDM0NDJGRkZGMDA1RTEwMkIwMTkwNjAyM0FGQUMwMDY0QUUKKzoxMEEyRDAwMEE2QTMwMDBFMjQwQjAwMDExMDQwMDAwM0EzNEIwNUM0RUQKKzoxMEEyRTAwMDhGNDIwMTQ4MDNDMkYwMjM4RkFCMDA1NDhGQUMwMDRDNjcKKzoxMEEyRjAwMEFEOEIwMDAwOEZBQzAwNjQxNTgwRkVCQTAwMDAwMDAwM0EKKzoxMEEzMDAwMDhGQUIwMDY0MTE2MDAwMUIwMDAwMDAwMDkzNDIwNUM0ODUKKzoxMEEzMTAwMDEwNDAwMDA2MDAwMDAwMDBBRjVFMDBDNEFGNEIwMEMwNUMKKzoxMEEzMjAwMDhGQUMwMDZDMTAwMDAwMEVBRjRDMDBDODk3QUIwMDc2RUQKKzoxMEEzMzAwMDExNjAwMDBCMzQwMzgxMDA4RkEyMDAyMDhDNDYwMDBDQkEKKzoxMEEzNDAwMEE0NDMwMDBDOTdBQzAwN0U4QzQ0MDAwNDhDNDUwMDA4QUMKKzoxMEEzNTAwMEE0NEMwMDBFQUM0NDAwMDBBQzQ1MDAwNEFDNDYwMDA4MjAKKzoxMEEzNjAwMDhGNDIwMzRDMjQ0MjAwMDFBRjQyMDM0QzEwMDAwMDEwMDYKKzoxMEEzNzAwMDhGNDIwMzRDOEZBQjAwNkMzMTY0RkZGRjI0ODRGRkZDRTEKKzoxMEEzODAwMDAwODAxODIxOEY0NDAyNTA4RjQ1MDI1NDhGNDYwMTE4RDcKKzoxMEEzOTAwMDAwMDAxMDIxMDBBMzI4MjEwMEEzMzgyQjAwODIyMDIxRDcKKzoxMEEzQTAwMDAwODcyMDIxQUY0NDAyNTAwMEMwRjgwOUFGNDUwMjU0OTUKKzoxMEEzQjAwMDhGQkYwMEMwOEZCRTAwQkM4RkI1MDBCODhGQjMwMEI0OTQKKzoxMEEzQzAwMDhGQjIwMEIwOEZCMTAwQUM4RkIwMDBBODAzRTAwMDA4REUKKzoxMEEzRDAwMDI3QkQwMEM4MDNFMDAwMDgwMDAwMDAwMDI3QkRGRkQ4MkIKKzoxMEEzRTAwMEFGQkYwMDI0QUZCMDAwMjA4RjQzMDA0QzhGNDIwMDQ4MjUKKzoxMEEzRjAwMDEwNjIwMDM0MDAwMDAwMDA4RjQzMDA0ODhGNDIwMDRDODAKKzoxMEE0MDAwMDAwNjIyMDIzMDQ4MjAwMDEyNDg0MDIwMDhGNDMwMDU0NTAKKzoxMEE0MTAwMDhGNDIwMDRDMDA0MzEwMkIxNDQwMDAwNDI0MDIwMjAwMjEKKzoxMEE0MjAwMDhGNDMwMDRDMTAwMDAwMDUwMDQzMTAyMzhGNDIwMDU0NUUKKzoxMEE0MzAwMDhGNDMwMDRDMDA0MzEwMjMyNDQyRkZGRjAwNDA1MDIxNzMKKzoxMEE0NDAwMDAwOEExMDJBNTQ0MDAwMDEwMDgwNTAyMThGNDkwMDRDOUUKKzoxMEE0NTAwMDhGNDgwMDRDOEY0NDAxODg4RjQ1MDE4QzhGNDYwMDRDRkIKKzoxMEE0NjAwMDI0MDcxMDAwQUZBNzAwMTAwMDA4NDE0MDAxMDAxODIxODgKKzoxMEE0NzAwMDAxMkE0ODIxMzEzMDAxRkZBRkIwMDAxNDhGNDcwMDE0OEEKKzoxMEE0ODAwMDAwMDAxMDIxMDAwNjMxNDBBRkE3MDAxODAwQTMyODIxQ0EKKzoxMEE0OTAwMDAwQTMzODJCMDA4MjIwMjEwMDg3MjAyMTM0MDJFQ0MwNDkKKzoxMEE0QTAwMDAwQzIzMDIxOEY0MjAxMDgwMkU2MzAyMTAwNDBGODA5NDUKKzoxMEE0QjAwMDAwMEEzOTQwNTQ0MDAwMDFBRjUwMDA0QzhGNDMwMDRDMUIKKzoxMEE0QzAwMDhGNDIwMDQ4MTQ2MjAwMTgwMDAwMDAwMDhGNDIwMDAwMTQKKzoxMEE0RDAwMDEwNDAwMDA3MDAwMDAwMDBBRjgwMDA0QzhGODIwMDRDNEQKKzoxMEE0RTAwMDEwNDBGRkZEMDAwMDAwMDAxMDAwMDAwNTAwMDAwMDAwMEIKKzoxMEE0RjAwMEFGODAwMDQ4OEY4MjAwNDgxMDQwRkZGRDAwMDAwMDAwNDAKKzoxMEE1MDAwMDhGODIwMDYwMjQwM0ZERkYwMDQzMTAyNEFGODIwMDYwQUYKKzoxMEE1MTAwMDhGNDIwMDAwMTA0MDAwMDMwMDAwMDAwMDEwMDAwMDAyMDUKKzoxMEE1MjAwMEFGODAwMDRDQUY4MDAwNDg4RkJGMDAyNDhGQjAwMDIwNjgKKzoxMEE1MzAwMDAzRTAwMDA4MjdCRDAwMjgwM0UwMDAwODAwMDAwMDAwMzkKKzoxMEE1NDAwMDI3QkRGRkQ4QUZCRjAwMjRBRkIwMDAyMDhGNDMwMDVDMTEKKzoxMEE1NTAwMDhGNDIwMDU4MTA2MjAwNDkwMDAwMDAwMDhGNDMwMDU4RUQKKzoxMEE1NjAwMDhGNDIwMDVDMDA2MjIwMjMwNDgyMDAwMTI0ODQwMTAwRTkKKzoxMEE1NzAwMDhGNDMwMDY0OEY0MjAwNUMwMDQzMTAyQjE0NDAwMDA0QTIKKzoxMEE1ODAwMDI0MDIwMTAwOEY0MzAwNUMxMDAwMDAwNTAwNDMxMDIzRUIKKzoxMEE1OTAwMDhGNDIwMDY0OEY0MzAwNUMwMDQzMTAyMzI0NDJGRkZGN0UKKzoxMEE1QTAwMDAwNDAzODIxMDA4NzEwMkE1NDQwMDAwMTAwODAzODIxRTMKKzoxMEE1QjAwMDhGNDIwMDVDMDA0NzEwMjEzMDUwMDBGRjMyQzIxMDAwNzMKKzoxMEE1QzAwMDEwNDAwMDE1MjQwODIwMDA4RjQ5MDA1QzhGNDQwMTkwNDIKKzoxMEE1RDAwMDhGNDUwMTk0OEY0NjAwNUMwMDA3Mzk4MEFGQTgwMDEwQkEKKzoxMEE1RTAwMEFGQjAwMDE0OEY0ODAwMTQwMDA5NDk4MDAxMjAxODIxRTEKKzoxMEE1RjAwMDAwMDAxMDIxMDBBMzI4MjEwMEEzNDgyQjAwODIyMDIxNjUKKzoxMEE2MDAwMDAwODkyMDIxMDAwNjMxODBBRkE4MDAxODhGNDIwMTA4ODAKKzoxMEE2MTAwMDEwMDAwMDE0MjRDNjBDQzA4RjQ5MDA1QzhGNDQwMTkwQzgKKzoxMEE2MjAwMDhGNDUwMTk0OEY0NjAwNUMwMDA3Mzk0MEFGQTgwMDEwQTkKKzoxMEE2MzAwMEFGQjAwMDE0OEY0ODAwMTQwMDA5NDk0MDAxMjAxODIxRDAKKzoxMEE2NDAwMDAwMDAxMDIxMDBBMzI4MjEwMEEzNDgyQjAwODIyMDIxMTQKKzoxMEE2NTAwMDAwODkyMDIxMDAwNjMxNDBBRkE4MDAxODhGNDIwMTA4NzAKKzoxMEE2NjAwMDI0QzY0Q0MwMDA0MEY4MDkwMkU2MzAyMTU0NDAwMDAxRTUKKzoxMEE2NzAwMEFGNTAwMDVDOEY0MzAwNUM4RjQyMDA1ODE0NjIwMDE4OUEKKzoxMEE2ODAwMDAwMDAwMDAwOEY0MjAwMDAxMDQwMDAwNzAwMDAwMDAwQTIKKzoxMEE2OTAwMEFGODAwMDRDOEY4MjAwNEMxMDQwRkZGRDAwMDAwMDAwOTYKKzoxMEE2QTAwMDEwMDAwMDA1MDAwMDAwMDBBRjgwMDA0ODhGODIwMDQ4QzUKKzoxMEE2QjAwMDEwNDBGRkZEMDAwMDAwMDA4RjgyMDA2MDI0MDNGRUZGQjkKKzoxMEE2QzAwMDAwNDMxMDI0QUY4MjAwNjA4RjQyMDAwMDEwNDAwMDAzNUUKKzoxMEE2RDAwMDAwMDAwMDAwMTAwMDAwMDJBRjgwMDA0Q0FGODAwMDQ4NzYKKzoxMEE2RTAwMDhGQkYwMDI0OEZCMDAwMjAwM0UwMDAwODI3QkQwMDI4QTIKKzoxMEE2RjAwMDAzRTAwMDA4MDAwMDAwMDAyN0JERkZEOEFGQkYwMDI0MjIKKzoxMEE3MDAwMEFGQjAwMDIwOEY0MzAwNkM4RjQyMDA2ODEwNjIwMDMzQUUKKzoxMEE3MTAwMDAwMDAwMDAwOEY0MzAwNjg4RjQyMDA2QzAwNjIyMDIzMUQKKzoxMEE3MjAwMDA0ODIwMDAxMjQ4NDA0MDA4RjQzMDA3NDhGNDIwMDZDNzMKKzoxMEE3MzAwMDAwNDMxMDJCMTQ0MDAwMDQyNDAyMDQwMDhGNDMwMDZDREIKKzoxMEE3NDAwMDEwMDAwMDA1MDA0MzEwMjM4RjQyMDA3NDhGNDMwMDZDRkIKKzoxMEE3NTAwMDAwNDMxMDIzMjQ0MkZGRkYwMDQwNTAyMTAwOEExMDJBQUEKKzoxMEE3NjAwMDU0NDAwMDAxMDA4MDUwMjE4RjQ5MDA2QzhGNDgwMDZDREMKKzoxMEE3NzAwMDhGNDQwMTk4OEY0NTAxOUM4RjQ2MDA2QzI0MDc0MDAwNTAKKzoxMEE3ODAwMEFGQTcwMDEwMDAwODQxNDAwMTAwMTgyMTAxMkE0ODIxMEMKKzoxMEE3OTAwMDMxMzAwM0ZGQUZCMDAwMTQ4RjQ3MDAxNDAwMDAxMDIxQzgKKzoxMEE3QTAwMDAwMDYzMTQwMjRDNjZDQzBBRkE3MDAxODAwQTMyODIxQzIKKzoxMEE3QjAwMDAwQTMzODJCMDA4MjIwMjEwMDg3MjAyMThGNDIwMTA4MkUKKzoxMEE3QzAwMDAyRTYzMDIxMDA0MEY4MDkwMDBBMzk0MDU0NDAwMDAxRjcKKzoxMEE3RDAwMEFGNTAwMDZDOEY0MzAwNkM4RjQyMDA2ODE0NjIwMDE4MDkKKzoxMEE3RTAwMDAwMDAwMDAwOEY0MjAwMDAxMDQwMDAwNzAwMDAwMDAwNDEKKzoxMEE3RjAwMEFGODAwMDRDOEY4MjAwNEMxMDQwRkZGRDAwMDAwMDAwMzUKKzoxMEE4MDAwMDEwMDAwMDA1MDAwMDAwMDBBRjgwMDA0ODhGODIwMDQ4NjMKKzoxMEE4MTAwMDEwNDBGRkZEMDAwMDAwMDA4RjgyMDA2MDI0MDNGN0ZGNUUKKzoxMEE4MjAwMDAwNDMxMDI0QUY4MjAwNjA4RjQyMDAwMDEwNDAwMDAzRkMKKzoxMEE4MzAwMDAwMDAwMDAwMTAwMDAwMDJBRjgwMDA0Q0FGODAwMDQ4MTQKKzoxMEE4NDAwMDhGQkYwMDI0OEZCMDAwMjAwM0UwMDAwODI3QkQwMDI4NDAKKzoxMEE4NTAwMDAzRTAwMDA4MDAwMDAwMDA4RjQyMDBGQzNDMDMwMDAxMDAKKzoxMEE4NjAwMDhGNDQwMEY4MzQ2MzMwQzgyNDQyMDAwMUFGNDIwMEZDM0EKKzoxMEE4NzAwMDhGODUwMTI4MDJFMzEwMjE1NDgyMDAwNDI0ODIwMDA4RkQKKzoxMEE4ODAwMDNDMDIwMDAxMzQ0MjJFQzgwMkUyMTAyMTAwNDAxODIxOEYKKzoxMEE4OTAwMEFGNDMwMEY4QUM2MDAwMDA4RjQyMDBGNDE0NjIwMDA0ODMKKzoxMEE4QTAwMDNDMDIwMDAxMjRBMjAwMjAxMDAwMDAwRkFGODIwMTI4MEEKKzoxMEE4QjAwMDhGNDMwMEY4MzQ0MjMwQzgwMkUyMTAyMTU0NjIwMDA0OTEKKzoxMEE4QzAwMDI0NjIwMDA4M0MwMjAwMDEzNDQyMkVDODAyRTIxMDIxM0EKKzoxMEE4RDAwMDAwNDAxODIxOEM2MjAwMDQwMDAyMTE0MDAwQTIxMDIxRTcKKzoxMEE4RTAwMEFGODIwMTI4QUM2MDAwMDA4Q0EzMDAxODMwNjIwMDcwQjkKKzoxMEE4RjAwMDEwNDAwMDJEMzA2MjAwMjAxMDQwMDAwNDNDMDIwMDEwODcKKzoxMEE5MDAwMDAyQzIxMDI0MTA0MDAwMEQwMDAwMDAwMDMwNjIwMDQwMjAKKzoxMEE5MTAwMDEwNDAwMDA0M0MwMjAwMjAwMkMyMTAyNDEwNDAwMDA3MzYKKzoxMEE5MjAwMDAwMDAwMDAwMzA2MjAwMTAxMDQwMDAxRjNDMDIwMDQwOTgKKzoxMEE5MzAwMDAyQzIxMDI0MTQ0MDAwMUMwMDAwMDAwMDhGODIwMDQwNUUKKzoxMEE5NDAwMDMwNDIwMDAxMTQ0MDAwMDgwMDAwMjAyMThDMDMwMTA0NjMKKzoxMEE5NTAwMDI0MDIwMDAxNTA2MjAwMDUyNDA0MDAwMThDMDIwMjY0RkMKKzoxMEE5NjAwMDEwNDAwMDAzMDA4MDEwMjEyNDA0MDAwMTAwODAxMDIxMDkKKzoxMEE5NzAwMDEwNDAwMDA2MDAwMDAwMDA4RjQyMDMwQzI0NDIwMDAxM0EKKzoxMEE5ODAwMEFGNDIwMzBDMTAwMDAwMDg4RjQyMDMwQzhGODIwMDQ0N0EKKzoxMEE5OTAwMDM0NDIwMDA0QUY4MjAwNDQ4RjQyMDMwODI0NDIwMDAxODUKKzoxMEE5QTAwMEFGNDIwMzA4OEY0MjAzMDgwM0UwMDAwODAwMDAwMDAwRTQKKzoxMEE5QjAwMDAzRTAwMDA4MDAwMDAwMDAyN0JERkY5OEFGQkYwMDYwNjMKKzoxMEE5QzAwMEFGQkUwMDVDQUZCNTAwNThBRkIzMDA1NEFGQjIwMDUwOUIKKzoxMEE5RDAwMEFGQjEwMDRDQUZCMDAwNDg4RjQyMDBGQzI0NDIwMDAxRjAKKzoxMEE5RTAwMEFGNDIwMEZDOEY4ODAxMjgyNTAyMDAyMEFGODIwMTI4OTkKKzoxMEE5RjAwMDhEMDMwMDE4MzA2MjAwNzAxMDQwMDAyRTMwNjIwMDIwN0QKKzoxMEFBMDAwMDEwNDAwMDA0M0MwMjAwMTAwMkMyMTAyNDEwNDAwMDBENEYKKzoxMEFBMTAwMDAwMDAwMDAwMzA2MjAwNDAxMDQwMDAwNDNDMDIwMDIwQjIKKzoxMEFBMjAwMDAyQzIxMDI0MTA0MDAwMDcwMDAwMDAwMDMwNjIwMDEwMzUKKzoxMEFBMzAwMDEwNDAwMUE5M0MwMjAwNDAwMkMyMTAyNDE0NDAwMUE2QUIKKzoxMEFBNDAwMDAwMDAwMDAwOEY4MjAwNDAzMDQyMDAwMTE0NDAwMDA4RTYKKzoxMEFBNTAwMDAwMDAyMDIxOEMwMzAxMDQyNDAyMDAwMTUwNjIwMDA1NDMKKzoxMEFBNjAwMDI0MDQwMDAxOEMwMjAyNjQxMDQwMDAwMzAwODAxMDIxQzUKKzoxMEFBNzAwMDI0MDQwMDAxMDA4MDEwMjExMDQwMDAwNjAwMDAwMDAwQTYKKzoxMEFBODAwMDhGNDIwMzBDMjQ0MjAwMDFBRjQyMDMwQzEwMDAwMTkyREMKKzoxMEFBOTAwMDhGNDIwMzBDOEY4MjAwNDQzNDQyMDAwNEFGODIwMDQ0OTIKKzoxMEFBQTAwMDhGNDIwMzA4MjQ0MjAwMDFBRjQyMDMwODEwMDAwMThBQ0MKKzoxMEFBQjAwMDhGNDIwMzA4MzA2MjAwMDIxMDQwMDE0QjNDMDIwODAwNDQKKzoxMEFBQzAwMDhEMUUwMDFDMDAxRTU3MDJBRkFBMDAzNDk1MEEwMDE2MDYKKzoxMEFBRDAwMDAzQzIyMDI0QUZBQTAwMjQ4RkFBMDAzNDI0MDIwMDAxNUMKKzoxMEFBRTAwMDE1NDIwMDA2MzNERUZGRkYwMDFFMTE0MDM0MDNFQ0MwQTgKKzoxMEFBRjAwMDAwNDMxMDIxMTAwMDAwMTAwMkUyQTgyMTI0MDIwMDAyRUQKKzoxMEFCMDAwMDE1NDIwMDA1MjQwMjAwMDMwMDFFMTE0MDI0NDI2Q0MwQkYKKzoxMEFCMTAwMDEwMDAwMDA5MDJFMkE4MjExNTQyMDAwNTAwMUUxMTgwNjQKKzoxMEFCMjAwMDAwMUUxMTQwMjQ0MjRDQzAxMDAwMDAwMzAyRTJBODIxODQKKzoxMEFCMzAwMDAwNTcxMDIxMjQ1NTBDRTA5NkEyMDAwRTMwNEFGRkZDNkQKKzoxMEFCNDAwMDMwNDIwNDAwMTA0MDAwMDNBRkFBMDAyQzEwMDAwMEUxQzYKKzoxMEFCNTAwMDAwMDA4ODIxMTA4MDAwMDQwMDAwODgyMTk3QjEwMDI2QTEKKzoxMEFCNjAwMDEwMDAwMEREQTZCMTAwMTI4RUIzMDAxODk2NkEwMDBDMkEKKzoxMEFCNzAwMEE3QUEwMDNFOTdBNTAwM0UyQ0EzMDVERDM4QTI4ODcwNDkKKzoxMEFCODAwMDJDNDIwMDAxMDA2MjE4MjUxMDYwMDAxNTAwMDAyMDIxRjEKKzoxMEFCOTAwMDMyQzIwODAwMTA0MDAwMTUyNDAyMDgwMDk2NjMwMDE0MTkKKzoxMEFCQTAwMDE0NjIwMDEyMzQwMkFBQUE5NjYzMDAwRTE0NjIwMDA3MEYKKzoxMEFCQjAwMDAwMDAyODIxOTY2MzAwMTAyNDAyMDMwMDE0NjIwMDA0QTAKKzoxMEFCQzAwMDAwQTAxMDIxOTY2MjAwMTIyQzQ1MDAwMTAwQTAxMDIxNjcKKzoxMEFCRDAwMDU0NDAwMDA2MjQwNDAwMTYxMDAwMDAwNDAwMDAwMDAwODkKKzoxMEFCRTAwMDI0MDIwODAwNTBBMjAwMDEyNDA0MDAwRTEwODAwMEI5QzUKKzoxMEFCRjAwMDAyNjQ5MDIxOTI0MjAwMDAzMDQyMDAwRjAwMDI4MDgwRTcKKzoxMEFDMDAwMDMyQzIwMTAwMTA0MDAwMjAwMjUwMTgyMTNDMDIwMDIwRjYKKzoxMEFDMTAwMDAwNDMxMDJCMTQ0MDAwMEUwMjQwMjAyMTAwMDAyODIxODgKKzoxMEFDMjAwMDk0ODIwMDAwMjQ4NDAwMDIwMEEyMjgyMTAwODMxMDJCQkIKKzoxMEFDMzAwMDE0NDBGRkZCMzBBMkZGRkYwMDA1MUMwMjAwNjIyODIxMjgKKzoxMEFDNDAwMDAwMDUxQzAyMzBBMkZGRkYxMDAwMDAwOTAwNjIyODIxNEQKKzoxMEFDNTAwMDhGNDcwMTQ4OEY0MjAxMTAwMDEwMjg0MjNDMDYwMDIwMTcKKzoxMEFDNjAwMDAwNDBGODA5QUZBODAwNDAzMDQ1RkZGRjhGQTgwMDQwMjIKKzoxMEFDNzAwMDUwQTAwMDAxMzQwNUZGRkY4RkFBMDAyQzM1NEEwMDAyQzYKKzoxMEFDODAwMDEwMDAwMDAyQUZBQTAwMkMwMDAwMjgyMTMyQzIwMDgwNzAKKzoxMEFDOTAwMDEwNDAwMDkwQTZBNTAwMTAyNjQzMDAwOTNDMDIwMDFGQUEKKzoxMEFDQTAwMDM0NDJGRkZGMDA0MzEwMkIxMDQwMDAwMzAwMDAwMDAwNUYKKzoxMEFDQjAwMDhGNDIwMTQ4MDA2MjE4MjM5MDY2MDAwMDMwQzIwMEZGRjYKKzoxMEFDQzAwMDM4NDMwMDA2MkM2MzAwMDEzODQyMDAxMTJDNDIwMDAxNzkKKzoxMEFDRDAwMDAwNjIxODI1MTA2MDAwN0YyNDAyMDgwMDAwMDA4ODIxMEYKKzoxMEFDRTAwMDk3QTMwMDNFMTQ2MjAwMEYwMjYwMjAyMTk2NzEwMDAwQkQKKzoxMEFDRjAwMDk2NjIwMDAyOTY2MzAwMDQ5NjY0MDAwNjAyMjI4ODIxOTAKKzoxMEFEMDAwMDAyMjM4ODIxMDIyNDg4MjE5NjYyMDAwODk2NjMwMDBBQTMKKzoxMEFEMTAwMDk2NjQwMDBDMDIyMjg4MjEwMjIzODgyMTEwMDAwMDA3N0IKKzoxMEFEMjAwMDAyMjQ4ODIxOTQ4MjAwMDAyNDg0MDAwMjAyMjI4ODIxQzcKKzoxMEFEMzAwMDAwOTIxMDJCMTQ0MEZGRkIwMDAwMDAwMDAwMTExQzAyQzkKKzoxMEFENDAwMDMyMjJGRkZGMDA2Mjg4MjEwMDExMUMwMjMyMjJGRkZGMjUKKzoxMEFENTAwMDAwNjI4ODIxMzJDMjAyMDAxMDQwMDAwMzI2NDQwMDA2MkYKKzoxMEFENjAwMDEwMDAwMDNFMDAwMDgwMjEzQzA1MDAxRjM0QTVGRkZGQkQKKzoxMEFENzAwMDAwQTQxMDJCMTA0MDAwMDMwMDAwMDAwMDhGNDIwMTQ4ODcKKzoxMEFEODAwMDAwODIyMDIzOTQ4MjAwMDAzMDQyMUZGRjEwNDAwMDA0MDQKKzoxMEFEOTAwMDI2NDQwMDBDOTY0MjAwMDIxMDAwMDAzMDAwNTA4MDIzMzAKKzoxMEFEQTAwMDk2NDIwMDAyMjY0MzAwMTQwMDUwODAyMzNDMDIwMDIwRkIKKzoxMEFEQjAwMDAwNDMxMDJCMTQ0MDAwMEEwMEQwODAyMTk2NDIwMDBDNjIKKzoxMEFEQzAwMDAyMDI4MDIxOTY0MjAwMEU5NjQzMDAxMDk2NDQwMDEyMjMKKzoxMEFERDAwMDAyMDI4MDIxMDIwMzgwMjExMDAwMDAyMDAyMDQ4MDIxNTEKKzoxMEFERTAwMDAwQTQxMDJCMTA0MDAwMDMwMDAwMDAwMDhGNDIwMTQ4MTcKKzoxMEFERjAwMDAwODIyMDIzOTQ4MjAwMDAyNDg0MDAwMjAyMDI4MDIxMjkKKzoxMEFFMDAwMDAwQTQxMDJCMTA0MDAwMDMwMDAwMDAwMDhGNDIwMTQ4RjYKKzoxMEFFMTAwMDAwODIyMDIzOTQ4MjAwMDAyNDg0MDAwMjAyMDI4MDIxMDgKKzoxMEFFMjAwMDAwQTQxMDJCMTA0MDAwMDMwMDAwMDAwMDhGNDIwMTQ4RDYKKzoxMEFFMzAwMDAwODIyMDIzOTQ4MjAwMDAyNDg0MDAwMjAyMDI4MDIxRTgKKzoxMEFFNDAwMDAwQTQxMDJCMTA0MDAwMDMwMDAwMDAwMDhGNDIwMTQ4QjYKKzoxMEFFNTAwMDAwODIyMDIzOTQ4MjAwMDAwMjAyODAyMTNDMDIwMTAwMzMKKzoxMEFFNjAwMDAyQzIxMDI0MTA0MDAwMEUwMDAwMDAwMDhGQUEwMDJDMjcKKzoxMEFFNzAwMDMxNDIwMDA0MTA0MDAwMEEwMDAwMDAwMDk1MDQwMDBFNUEKKzoxMEFFODAwMDAyNjQyMDIxMEMwMDNFRUMyNDg0RkZGQzMwNDJGRkZGRDIKKzoxMEFFOTAwMDAyMjI4ODIxMDAxMTFDMDIzMjIyRkZGRjAwNjI4ODIxNTkKKzoxMEFFQTAwMDhGQUEwMDI0MDE1MTg4MjMwMDExMTQwMjAyMjI4ODIxNTQKKzoxMEFFQjAwMDAyMzA4ODIxMDAxMTE0MDIwMjIyODgyMTMyMzFGRkZGNjIKKzoxMEFFQzAwMDUyMjAwMDAxMzQxMUZGRkY4RkFBMDAyQzM1NEEwMDAxRTcKKzoxMEFFRDAwMEFGQUEwMDJDQTZCMTAwMTI5N0FBMDAyRUE2QUEwMDBFQjcKKzoxMEFFRTAwMDhGQUEwMDJDMzE0MjAwMDQxMDQwMDAwMjI0MDkxMDAwRjcKKzoxMEFFRjAwMDM0MDk4MDAwOEY0ODAwNDQ4RjQ0MDFBMDhGNDUwMUE0OEQKKzoxMEFGMDAwMEFGQTkwMDEwOEY0OTAwNDQwMDA4NDE0MDAxMDAxODIxRkEKKzoxMEFGMTAwMEFGQTkwMDE0OEY0ODAwMEMwMkEwMzAyMTI0MDcwMDIwQTQKKzoxMEFGMjAwMEFGQTgwMDE4OEY0ODAxMEMwMDAwMTAyMTAwQTMyODIxQjEKKzoxMEFGMzAwMDAwQTM0ODJCMDA4MjIwMjEwMTAwRjgwOTAwODkyMDIxNkMKKzoxMEFGNDAwMDE0NDAwMDBCMDAwMDAwMDA4RjgyMDEyODNDMDQwMDAxMjcKKzoxMEFGNTAwMDI0ODQ2OTE0QUZCRTAwMTRBRkEyMDAxMDhGODYwMTI0QjAKKzoxMEFGNjAwMDhGODcwMTIwM0MwNTAwMDcwQzAwMkIzQjM0QTU5OTIwNUUKKzoxMEFGNzAwMDhGNDIwMzY4MjQ0MkZGRkZBRjQyMDM2ODhGNDIwMDQ0QzAKKzoxMEFGODAwMDhGNDMwMDg4MjQ0MjAwMDEwMDQzMTAyNEFGNDIwMDQ0NTQKKzoxMEFGOTAwMDhGQUEwMDM0OEY0NDAzNjgyNDAyMDAwMTE1NDIwMDA2ODIKKzoxMEFGQTAwMDI0MDIwMDAyOEY0MjAzNUMyNDQyRkZGRkFGNDIwMzVDOTUKKzoxMEFGQjAwMDEwMDAwMDQ5OEY0MjAzNUMxNTQyMDAwNjAwMDAwMDAwQUIKKzoxMEFGQzAwMDhGNDIwMzY0MjQ0MkZGRkZBRjQyMDM2NDEwMDAwMDQyM0IKKzoxMEFGRDAwMDhGNDIwMzY0OEY0MjAzNjAyNDQyRkZGRkFGNDIwMzYwNEQKKzoxMEFGRTAwMDEwMDAwMDNEOEY0MjAzNjAzMDYyMTAwMDEwNDAwMDA1RTkKKzoxMEFGRjAwMDMwNjI4MDAwOEY0MjAwNzgyNDQyMDAwMTEwMDAwMDM2NDkKKzoxMEIwMDAwMEFGNDIwMDc4MTA0MDAwMzQwMDAwMDAwMDhGNDIwMDc4MEEKKzoxMEIwMTAwMDI0NDIwMDAxQUY0MjAwNzg4QzAzMDI0MDAwNDMxMDJCMTEKKzoxMEIwMjAwMDE0NDAwMDJEMjQwNzAwMDg4RjQ0MDE2ODhGNDUwMTZDRUYKKzoxMEIwMzAwMDhGNDMwMDQ0OEY0ODAwMEM4Rjg2MDEyMDI0MDIwMDQwN0IKKzoxMEIwNDAwMEFGQTIwMDEwQUZBMzAwMTRBRkE4MDAxODhGNDIwMTBDRUMKKzoxMEIwNTAwMDAwNDBGODA5MjRDNjAwMUMxNDQwMDAxMTI0MDIwMDAxMUQKKzoxMEIwNjAwMDNDMDEwMDAxMDAzNzA4MjFBMDIyNDBGMjhGODIwMTI0MTgKKzoxMEIwNzAwMEFGQTIwMDEwOEY4MjAxMjgzQzA0MDAwMTI0ODQ2ODhDNTgKKzoxMEIwODAwMEFGQTIwMDE0OEY0NjAwNDQ4Rjg3MDEyMDNDMDUwMDA5QzEKKzoxMEIwOTAwMDBDMDAyQjNCMzRBNTEzMDAxMDAwMDAwQjAwMDAwMDAwMzcKKzoxMEIwQTAwMDhGNDIwMzA0MjQ0MjAwMDFBRjQyMDMwNDhGNDIwMzA0OTEKKzoxMEIwQjAwMDhGNDIwMDQ0QUY0MjAwN0MzQzAxMDAwMTAwMzcwODIxNzAKKzoxMEIwQzAwMEEwMjA0MEYyQUY0MDAwNzg4RjQyMDMxODI0NDIwMDAxRDQKKzoxMEIwRDAwMEFGNDIwMzE4OEY0MjAzMTg4RkJGMDA2MDhGQkUwMDVDMjEKKzoxMEIwRTAwMDhGQjUwMDU4OEZCMzAwNTQ4RkIyMDA1MDhGQjEwMDRDMTEKKzoxMEIwRjAwMDhGQjAwMDQ4MDNFMDAwMDgyN0JEMDA2ODAzRTAwMDA4QTcKKzoxMEIxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDhGNDIwMTNDMzEKKzoxMEIxMTAwMEFGODIwMEMwOEY0MjAxM0NBRjgyMDBDNDhGNDIwMTNDMkQKKzoxMEIxMjAwMEFGODIwMEM4OEY0MjAxMzhBRjgyMDBEMDhGNDIwMTM4MTEKKzoxMEIxMzAwMEFGODIwMEQ0OEY0MjAxMzgwM0UwMDAwOEFGODIwMEQ4MEMKKzoxMEIxNDAwMDI3QkRGRkUwMjc4NDAyMDgyNDA1MDIwMEFGQkYwMDE4RDYKKzoxMEIxNTAwMDBDMDAyQkJGMjQwNjAwMDg4QzAyMDIwNDBDMDA0MDEyRDUKKzoxMEIxNjAwMEFGODIwMjEwM0MwMjAwMDE4QzQyNkQ5NDMwNDIwMDAyMUEKKzoxMEIxNzAwMDEwNDAwMDBFMDAwMDIwMjE4QzA2MDI0ODI0MDIwMDAyMkMKKzoxMEIxODAwMDNDMDEwMDAxQUMyMjZEOTgwQzAwNTEwNDI0MDUwMDAyMjIKKzoxMEIxOTAwMDAwMDAyMDIxOEMwNjAyNDgyNDAyMDAwMTNDMDEwMDAxMkQKKzoxMEIxQTAwMEFDMjI2RDk4MTAwMDAwMTEyNDA1MDAwMThDMDYwMjQ4QTUKKzoxMEIxQjAwMDI0MDIwMDA0M0MwMTAwMDFBQzIyNkQ5ODBDMDA1MTA0RjMKKzoxMEIxQzAwMDI0MDUwMDA0M0MwMjAwMDE4QzQyNkQ5NDMwNDIwMDAxRDEKKzoxMEIxRDAwMDEwNDAwMDA4MjQwMjAwMDEzQzAxMDAwMUFDMjI2RDk4REYKKzoxMEIxRTAwMDAwMDAyMDIxMjQwNTAwMDEzQzA2NjAxQjBDMDA1MTA0RDYKKzoxMEIxRjAwMDAwMDAwMDAwM0MwNDAwMDEyNDg0NjlEMDhGNDIwMTUwMEIKKzoxMEIyMDAwMDhGNDMwMTU0M0MwNTAwMDg4RjQ2MDE1ODAwMDIxNjQwNDgKKzoxMEIyMTAwMDAwMDMxOTQwMzQ2MzA0MDMwMDQzMTAyNTAwMDYzM0MwQzMKKzoxMEIyMjAwMDAwNDYxMDI1QUY4MjAyMUNBRkEwMDAxMEFGQTAwMDE0OTIKKzoxMEIyMzAwMDhGODYwMjFDMzRBNTAyMDAwQzAwMkIzQjAwMDAzODIxMzUKKzoxMEIyNDAwMDNDMDEwMDAxQUMyMDZEOTAzQzAxMDAwMUFDMjA2REE4RDgKKzoxMEIyNTAwMDhGQkYwMDE4MDNFMDAwMDgyN0JEMDAyMDI3QkRGRkUwRDYKKzoxMEIyNjAwMDNDMDUwMDA4MzRBNTAzMDBBRkJGMDAxOEFGQTAwMDEwRDQKKzoxMEIyNzAwMEFGQTAwMDE0OEY4NjAyMDAzQzA0MDAwMTI0ODQ2OURDMjYKKzoxMEIyODAwMDBDMDAyQjNCMDAwMDM4MjE4RjQyMDQxMDI0NDIwMDAxQTcKKzoxMEIyOTAwMEFGNDIwNDEwOEY0MjA0MTA4RkJGMDAxODAzRTAwMDA4NzMKKzoxMEIyQTAwMDI3QkQwMDIwMjdCREZGRDhBRkJGMDAyMEFGQjEwMDFDRDUKKzoxMEIyQjAwMEFGQjAwMDE4OEY0MjAzQTQyNDQyMDAwMUFGNDIwM0E0QTAKKzoxMEIyQzAwMDhGNDIwM0E0OEY5MDAyMjA4RjgyMDBFMEFGQTIwMDEwNzMKKzoxMEIyRDAwMDhGODIwMEU0QUZBMjAwMTQ4Rjg2MDBDNDhGODcwMEM4NUQKKzoxMEIyRTAwMDNDMDQwMDAxMjQ4NDY5RTgwQzAwMkIzQjAyMDAyODIxNjcKKzoxMEIyRjAwMDNDMDQ0MDAwMDIwNDEwMjQ1MDQwMDBCNDNDMDQwMTAwMEYKKzoxMEIzMDAwMDhGNDIwM0JDMjQ0MjAwMDFBRjQyMDNCQzhGNDIwM0JDMDYKKzoxMEIzMTAwMDhGODcwMEM0OEY4MzAwQzg4RjQyMDE0ODAwNjcxODIzQkQKKzoxMEIzMjAwMDAwNDMxMDJCMTA0MDAwMDMwMDAwMDAwMDhGNDIwMTQ4MzIKKzoxMEIzMzAwMDAwNjIxODIxMTA2MDAwMDUwMDAwMDAwMDhGNDIwMTRDREYKKzoxMEIzNDAwMDAwNDMxMDJCMTA0MDAwMEIwMDAwMDAwMDhGODIwMEUwMzMKKzoxMEIzNTAwMDhGNDMwMTI0QUY0MjAxMUNBRjQzMDExNDhGODIwMjIwQUUKKzoxMEIzNjAwMDNDMDMwOEZGMzQ2M0ZGRkIwMDQzMTAyNDEwMDAwMENFQjEKKzoxMEIzNzAwMDAwNDQxMDI1OEY4MjAyMjAzQzAzMDhGRjM0NjNGRkZGNDYKKzoxMEIzODAwMDAwNDMxMDI0MzQ0MjAwMDRBRjgyMDIyMDhGODIwMEUwODgKKzoxMEIzOTAwMDhGNDMwMTI0QUY0MjAxMUNBRjQzMDExNDhGODYwMEM4QzQKKzoxMEIzQTAwMDhGODQwMTIwOEY4MzAxMjQxMDAwMDAwNTAwMDAyODIxRDQKKzoxMEIzQjAwMDE0NjIwMDAyMjQ2MjAwMjAyNzYyNDgwMDAwNDAxODIxMjUKKzoxMEIzQzAwMDEwNjQwMDBDMzBBMjAwRkY4QzYyMDAxODMwNDIwMDAzQjEKKzoxMEIzRDAwMDEwNDBGRkY3Mjc2MjRGRTA4RjQyMDNEMDI0MDUwMDAxQTEKKzoxMEIzRTAwMDI0NDIwMDAxQUY0MjAzRDA4RjQyMDNEMDhDNjYwMDA4OTQKKzoxMEIzRjAwMDMwQTIwMEZGMTQ0MDAwNTgwMDAwMDAwMDkzNDIwNUM0MzIKKzoxMEI0MDAwMDE0NDAwMDU1MDAwMDAwMDA4Rjg3MDBDNDhGODgwMEUwQzIKKzoxMEI0MTAwMDhGODQwMEU0MjQwMkZGRjgwMTAyNDAyNDAxMDQxMDIzNzkKKzoxMEI0MjAwMDAwMDIxOEMzMDQ2MjAwMDEyNDYzMDIwMDEwNjAwMDA1REEKKzoxMEI0MzAwMDI0MDIwMDAxMTA2MjAwMDkwMDAwMDAwMDEwMDAwMDFGM0IKKzoxMEI0NDAwMDAwMDAwMDAwOEY0MjAzQzAwMEUwMzAyMTI0NDIwMDAxRDAKKzoxMEI0NTAwMEFGNDIwM0MwMTAwMDAwNDA4RjQyMDNDMDhGNDIwM0M0QkMKKzoxMEI0NjAwMDI0NDIwMDAxQUY0MjAzQzQ4Qzg2MDAwMDhGNDIwMTQ4OTEKKzoxMEI0NzAwMDhGNDMwM0M0MDBFNjE4MjMwMDQzMTAyQjEwNDAwMDA0NDAKKzoxMEI0ODAwMDJDNjIyMzNGOEY0MjAxNDgwMDYyMTgyMTJDNjIyMzNGMjcKKzoxMEI0OTAwMDE0NDAwMDMxMDAwMDAwMDA4RjQyMDIwQzI0NDIwMDAxRTEKKzoxMEI0QTAwMEFGNDIwMjBDOEY0MjAyMEMwMEUwMzAyMTI0ODIwMDA4REYKKzoxMEI0QjAwMEFGODIwMEU0MTAwMDAwMjhBRjgyMDBFODhGNDIwM0M4OEEKKzoxMEI0QzAwMDI0NDIwMDAxQUY0MjAzQzg4RjQyMDNDODhDODUwMDAwQUMKKzoxMEI0RDAwMDhGNDIwMTQ4MDBBNzE4MjMwMDQzMTAyQjEwNDAwMDAzOUYKKzoxMEI0RTAwMDAwMDAwMDAwOEY0MjAxNDgwMDYyMTgyMThGNDIwMTRDODkKKzoxMEI0RjAwMDAwNDMxMDJCNTQ0MDAwMEEwMEEwMzAyMThGNDIwMjBDNjAKKzoxMEI1MDAwMDI0NDIwMDAxQUY0MjAyMEM4RjQyMDIwQzI0ODIwMDA4NDgKKzoxMEI1MTAwMEFGODIwMEU0OEY4NDAwRTQxNDg4RkZFQ0FGODQwMEU4N0QKKzoxMEI1MjAwMDE0ODgwMDBEMjc2MjMwMDAxNDgyMDAwMjI0ODJGRkY4ODQKKzoxMEI1MzAwMDI3NjIzRkY4OTQ0MzAwMDYzQzAyMDAxRjM0NDJGRkZGOUQKKzoxMEI1NDAwMDAwQzMzMDIxMDA0NjEwMkIxMDQwMDAwMzAwMDAwMDAwMTMKKzoxMEI1NTAwMDhGNDIwMTQ4MDBDMjMwMjNBRjg2MDBDODhGODMwMEM0RTkKKzoxMEI1NjAwMDhGNDIwMTQ4MDBDMzE4MjMwMDQzMTAyQjEwNDAwMDAzRjIKKzoxMEI1NzAwMDAwMDAwMDAwOEY0MjAxNDgwMDYyMTgyMTEwNjAwMDA1QTEKKzoxMEI1ODAwMDAwMDAwMDAwOEY0MjAxNEMwMDQzMTAyQjUwNDAwMDA4ODcKKzoxMEI1OTAwMDNDMDJGREZGOEY4MjAyMjAzQzAzMDhGRjM0NjNGRkZCNjcKKzoxMEI1QTAwMDAwNDMxMDI0M0MwMzQwMDAxMDAwMDAzRjAwNDMxMDI1REUKKzoxMEI1QjAwMDhGNDMwM0NDMzQ0MkZGRkYwMjgyQTAyNDI0NjMwMDAxQTYKKzoxMEI1QzAwMEFGNDMwM0NDMTAwMDAwMzk4RjQyMDNDQzAyMDQxMDI0OTcKKzoxMEI1RDAwMDEwNDAwMDBFM0MxMTAyMDA4RjQyMDNBODI0NDIwMDAxREIKKzoxMEI1RTAwMEFGNDIwM0E4OEY0MjAzQTg4RjgyMDIyMDNDMDMwOEZGQ0EKKzoxMEI1RjAwMDM0NjNGRkZGMDA0MzEwMjQwMDQ0MTAyNTBDMDAzREFGQ0UKKzoxMEI2MDAwMEFGODIwMjIwMTAwMDAwMjkwMDAwMDAwMDAyMTExMDI0NjcKKzoxMEI2MTAwMDUwNDAwMDA4M0MxMTA0MDA4RjQyMDNBQzI0NDIwMDAxNUEKKzoxMEI2MjAwMEFGNDIwM0FDMEMwMDNEQUY4RjQyMDNBQzEwMDAwMDE5RDkKKzoxMEI2MzAwMDAwMDAwMDAwMDIxMTEwMjQxMDQwMDAxQzAwMDAwMDAwNTcKKzoxMEI2NDAwMDhGODMwMjI0MjQwMjE0MDIxNDYyMDAwOTNDMDUwMDA4QkUKKzoxMEI2NTAwMDNDMDQwMDAxMjQ4NDY5RjRBRkEwMDAxMEFGQTAwMDE0RTIKKzoxMEI2NjAwMDhGODYwMjI0MzRBNTA1MDAwQzAwMkIzQjAwMDAzODIxRjYKKzoxMEI2NzAwMDhGNDIwM0IwMjQ0MjAwMDFBRjQyMDNCMDhGNDIwM0IwQjcKKzoxMEI2ODAwMDhGODIwMjIwMDIwMDIwMjEzNDQyMDAwMjBDMDA0RTlDRDYKKzoxMEI2OTAwMEFGODIwMjIwOEY4MjAyMjAzQzAzMDhGRjM0NjNGRkZGNDkKKzoxMEI2QTAwMDAwNDMxMDI0MDA1MTEwMjVBRjgyMDIyMDhGQkYwMDIwREMKKzoxMEI2QjAwMDhGQjEwMDFDOEZCMDAwMTgwM0UwMDAwODI3QkQwMDI4RTAKKzoxMEI2QzAwMDAzRTAwMDA4MDAwMDAwMDAzQzAyMDAwMThDNDI2REE4NkQKKzoxMEI2RDAwMDI3QkRGRkIwQUZCRjAwNDhBRkJFMDA0NEFGQjUwMDQwQ0MKKzoxMEI2RTAwMEFGQjMwMDNDQUZCMjAwMzhBRkIxMDAzNDEwNDAwMDBGMzAKKzoxMEI2RjAwMEFGQjAwMDMwM0MwNDAwMDEyNDg0NkEwMDNDMDUwMDA4MUYKKzoxMEI3MDAwMEFGQTAwMDEwQUZBMDAwMTQ4Rjg2MDIyMDM0QTUwNjAwNjEKKzoxMEI3MTAwMDI0MDIwMDAxM0MwMTAwMDFBQzIwNkRBODNDMDEwMDAxQTUKKzoxMEI3MjAwMEFDMjI2RDlDMEMwMDJCM0IwMDAwMzgyMTNDMDM3RkZGQkEKKzoxMEI3MzAwMDhDMDIwMjY4MzQ2M0ZGRkYzQzA0RkRGRjAwNDMxMDI0QzkKKzoxMEI3NDAwMEFDMDIwMjY4OEY0MjAwMDQzNDg0RkZGRjMwNDIwMDAyRTIKKzoxMEI3NTAwMDEwNDAwMDkyMDI4NEEwMjQzQzA0MDYwMDM0ODQyMDAwOUYKKzoxMEI3NjAwMDhGNDIwMDA0MDAwMDI4MjEyNDAzRkZGRDAwNDMxMDI0MjEKKzoxMEI3NzAwMEFGNDIwMDA0QUZBNDAwMjA4RjVFMDAxODI3QUEwMDIwNkIKKzoxMEI3ODAwMDI0MDIwMEZGMTNDMjAwMDJBRkFBMDAyQzI3QzUwMDAxNEIKKzoxMEI3OTAwMDhDMDIwMjI4MDBBMDkwMjExNjQyMDAwRTAwMUUzOEMwMjQKKzoxMEI3QTAwMDhGNDIwMzNDMjQ0MjAwMDFBRjQyMDMzQzhGNDIwMzNDRTIKKzoxMEI3QjAwMDhDMDIwMjI4M0MwNDAwMDEyNDg0Njk5ODNDMDUwMDA5OUQKKzoxMEI3QzAwMEFGQTAwMDE0QUZBMjAwMTA4RkE2MDAyMDEwMDAwMDZERTMKKzoxMEI3RDAwMDM0QTUwNTAwMDBGNzEwMjE4RkEzMDAyMDhGQTQwMDI0QkEKKzoxMEI3RTAwMEFDNDMwNEMwQUM0NDA0QzQ4RjgzMDA1NDhGODIwMDU0MjMKKzoxMEI3RjAwMDI0NzAwM0U4MDIwMjEwMjMyQzQyMDNFOTEwNDAwMDFCQ0UKKzoxMEI4MDAwMDAwMDA5ODIxMDBFMDg4MjEyNjM1MDRDMDhGNDQwMTc4OEIKKzoxMEI4MTAwMDhGNDUwMTdDMDIyMDE4MjEyNDBBMDAwNEFGQUEwMDEwRTEKKzoxMEI4MjAwMEFGQjIwMDE0OEY0ODAwMEMwMDAwMTAyMTAyRjUzMDIxNDcKKzoxMEI4MzAwMEFGQTgwMDE4OEY0ODAxMEMyNDA3MDAwODAwQTMyODIxOTYKKzoxMEI4NDAwMDAwQTM0ODJCMDA4MjIwMjEwMTAwRjgwOTAwODkyMDIxNTMKKzoxMEI4NTAwMDU0NDAwMDA2MjQxMzAwMDE4RjgyMDA1NDAyMDIxMDIzN0EKKzoxMEI4NjAwMDJDNDIwM0U5MTQ0MEZGRTkwMDAwMDAwMDMyNjIwMEZGQUYKKzoxMEI4NzAwMDU0NDAwMDE3QUY1MjAwMTg4RjQyMDM3ODI0NDIwMDAxNTEKKzoxMEI4ODAwMEFGNDIwMzc4OEY0MjAzNzg4RjgyMDEyMDhGQUEwMDJDNjkKKzoxMEI4OTAwMEFGQTIwMDEwOEY4MjAxMjQzQzA0MDAwMTI0ODQ2OUE0MUIKKzoxMEI4QTAwMDNDMDUwMDA5QUZBMjAwMTQ4RDQ2MDAwMDEwMDAwMDM1RDEKKzoxMEI4QjAwMDM0QTUwNjAwOEY0MjAzMDgyNDEzMDAwMTI0NDIwMDAxMkUKKzoxMEI4QzAwMEFGNDIwMzA4OEY0MjAzMDgxMDAwMDAxRTMyNjIwMEZGREYKKzoxMEI4RDAwMDhGODMwMDU0OEY4MjAwNTQyNDcwMDNFODAyMDIxMDIzRTcKKzoxMEI4RTAwMDJDNDIwM0U5MTA0MDAwMTYwMDAwOTgyMTNDMTUwMDIwNkUKKzoxMEI4RjAwMDI0MTEwMDEwOEY0MjAwMEM4RjQ0MDE2MDhGNDUwMTY0QjkKKzoxMEI5MDAwMDhGODYwMTIwQUZCMTAwMTBBRkIyMDAxNDAwNTUxMDI1OTIKKzoxMEI5MTAwMEFGQTIwMDE4OEY0MjAxMEMyNDA3MDAwODAwNDBGODA5NkMKKzoxMEI5MjAwMDI0QzYwMDFDMTQ0MEZGRTMwMDAwMDAwMDhGODIwMDU0NzYKKzoxMEI5MzAwMDAyMDIxMDIzMkM0MjAzRTkxNDQwRkZFRTAwMDAwMDAwMzUKKzoxMEI5NDAwMDMyNjIwMEZGMTQ0MDAwMTEwMDAwMDAwMDhGNDIwMzc4QjMKKzoxMEI5NTAwMDI0NDIwMDAxQUY0MjAzNzg4RjQyMDM3ODhGODIwMTIwOTYKKzoxMEI5NjAwMDhGQUEwMDJDQUZBMjAwMTA4RjgyMDEyNDNDMDQwMDAxOUEKKzoxMEI5NzAwMDI0ODQ2OUFDM0MwNTAwMDlBRkEyMDAxNDhENDYwMDAwODgKKzoxMEI5ODAwMDM0QTUwNzAwMEMwMDJCM0IwM0MwMzgyMThGNDIwMkVDOEEKKzoxMEI5OTAwMDI0NDIwMDAxQUY0MjAyRUM4RjQyMDJFQzhGQkYwMDQ4MEMKKzoxMEI5QTAwMDhGQkUwMDQ0OEZCNTAwNDA4RkIzMDAzQzhGQjIwMDM4OEIKKzoxMEI5QjAwMDhGQjEwMDM0OEZCMDAwMzAwM0UwMDAwODI3QkQwMDUwODUKKzoxMEI5QzAwMDNDMDIwMDAxOEM0MjZEQTgyN0JERkZFMDE0NDAwMDBEMzEKKzoxMEI5RDAwMEFGQkYwMDE4M0MwNDAwMDEyNDg0NkEwQzNDMDUwMDA4MzkKKzoxMEI5RTAwMEFGQTAwMDEwQUZBMDAwMTQ4Rjg2MDIyMDM0QTUwNzAwN0UKKzoxMEI5RjAwMDI0MDIwMDAxM0MwMTAwMDFBQzIyNkRBODBDMDAyQjNCOEQKKzoxMEJBMDAwMDAwMDAzODIxM0MwMjAwMDQwMkMyMTAyNDEwNDAwMDA3NEMKKzoxMEJBMTAwMDAwMDAwMDAwOEY4MjAyMjAzQzAzMDhGRjM0NjNGRkZGMTgKKzoxMEJBMjAwMDAwNDMxMDI0MzQ0MjAwMDhBRjgyMDIyMDNDMDUwMDAxOEMKKzoxMEJBMzAwMDhDQTU2RDk4MjQwMjAwMDExNEEyMDAwNzAwMDAyMDIxQUIKKzoxMEJBNDAwMDBDMDA1MjlCMjQwNTAwMDFBQzAyMDI2QzhDMDMwMjZDQkEKKzoxMEJBNTAwMDEwMDAwMDA2M0MwMjAwMDcwQzAwNTI5QjAwMDAyMDIxNTEKKzoxMEJBNjAwMEFDMDIwMjY4OEMwMzAyNjgzQzAyMDAwNzAwNjIxODI0RTIKKzoxMEJBNzAwMDNDMDIwMDAyNTA2MjAwMEQzQzAyMDVGNTAwNDMxMDJCMTEKKzoxMEJBODAwMDE0NDAwMDA2M0MwMjAwMDQzQzAyMDAwMTEwNjIwMDA5NjAKKzoxMEJBOTAwMDNDMDIwMDk4MTAwMDAwMEIwMDAwMDAwMDE0NjIwMDA5MzYKKzoxMEJBQTAwMDNDMDIzQjlBMTAwMDAwMDQzNDQyQ0EwMDEwMDAwMDAyMUQKKzoxMEJBQjAwMDM0NDJFMTAwMzQ0Mjk2ODBBRjQyMDFGQzhGNDIwMUZDRTcKKzoxMEJBQzAwMEFFRTIwMDY0OEZCRjAwMTgwM0UwMDAwODI3QkQwMDIwMkQKKzoxMEJBRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODYxMDJCQTUKKzoxMEJBRTAwMDUwNDAwMDAxMDA4NzIwMjMwMEM0MTAyMzAwMDI0ODQzNzcKKzoxMEJBRjAwMDAxMjUxMDJCMTA0MDAwMUIwMDA5MTA0MDAwODI0MDIxM0UKKzoxMEJCMDAwMDAwODgxMDJCMTA0MDAwMDcwMDAwMTgyMTk0ODIwMDAwQ0MKKzoxMEJCMTAwMDI0ODQwMDAyMDA2MjE4MjEwMDg4MTAyQjE0NDBGRkZCQ0YKKzoxMEJCMjAwMDAwMDAwMDAwMDA2MDIwMjEwMEM3MzAyMzAwQTkxMDIzN0UKKzoxMEJCMzAwMDAwMDIxMDQwMDBDMjI4MjEwMEM1MTAyQjEwNDAwMDA3NTEKKzoxMEJCNDAwMDAwMDAxODIxOTRDMjAwMDAyNEM2MDAwMjAwNjIxODIxREYKKzoxMEJCNTAwMDAwQzUxMDJCMTQ0MEZGRkIwMDAwMDAwMDEwMDAwMDBEN0EKKzoxMEJCNjAwMDAwODMyMDIxMDAwNTEwNDAwMDgyMjgyMTAwODUxMDJCMzEKKzoxMEJCNzAwMDEwNDAwMDA3MDAwMDE4MjE5NDgyMDAwMDI0ODQwMDAyNzUKKzoxMEJCODAwMDAwNjIxODIxMDA4NTEwMkIxNDQwRkZGQjAwMDAwMDAwMEMKKzoxMEJCOTAwMDAwNjAyMDIxMDAwNDFDMDIzMDgyRkZGRjAwNjIyMDIxOEYKKzoxMEJCQTAwMDAwMDQxQzAyMzA4MkZGRkYwMDYyMjAyMTAzRTAwMDA4MzUKKzoxMEJCQjAwMDMwODJGRkZGMDNFMDAwMDgwMDAwMDAwMDAwODAyODIxMjEKKzoxMEJCQzAwMDMwQTIwMDAxMTA0MDAwMkIzQzAzMDAxRjM0NjNGRkZGMzQKKzoxMEJCRDAwMDI0QTIwMDA0MDA2MjEwMkI1NDQwMDAwNzAwNjUxMDJCQzMKKzoxMEJCRTAwMDkwQTIwMDAxOTBBNDAwMDM5MEEzMDAwMDkwQTUwMDAyODEKKzoxMEJCRjAwMDEwMDAwMDJBMDA0NDEwMjExMDQwMDAwMzAwMDAwMDAwNDMKKzoxMEJDMDAwMDhGNDIwMTQ4MDBBMjI4MjM5MEE0MDAwMDI0QTUwMDAxMkYKKzoxMEJDMTAwMDAwNjUxMDJCMTA0MDAwMDMwMDAwMDAwMDhGNDIwMTQ4MTcKKzoxMEJDMjAwMDAwQTIyODIzOTBBMjAwMDAyNEE1MDAwMTAwMDIxMjAwMTcKKzoxMEJDMzAwMDAwODIyMDIxMDA2NTEwMkIxMDQwMDAwMzAwMDAwMDAwNEUKKzoxMEJDNDAwMDhGNDIwMTQ4MDBBMjI4MjM5MEEyMDAwMDI0QTUwMDAxRjEKKzoxMEJDNTAwMDAwODIyMDIxMDA2NTEwMkIxMDQwMDAwMzAwMDAwMDAwMkUKKzoxMEJDNjAwMDhGNDIwMTQ4MDBBMjI4MjM5MEEyMDAwMDEwMDAwMDJENUUKKzoxMEJDNzAwMDAwMDIxMjAwMzQ2M0ZGRkYyNEEyMDAwNDAwNjIxMDJCQjQKKzoxMEJDODAwMDU0NDAwMDBBMDA2NTEwMkI5MEEyMDAwMDkwQTQwMDAyMEUKKzoxMEJDOTAwMDkwQTMwMDAxOTBBNTAwMDMwMDQ0MTAyMTAwMDIxMjAwQUYKKzoxMEJDQTAwMDAwNjUxODIxMTAwMDAwMjAwMDQzMjAyMTEwNDAwMDAzRUYKKzoxMEJDQjAwMDAwMDAwMDAwOEY0MjAxNDgwMEEyMjgyMzkwQTIwMDAwNEIKKzoxMEJDQzAwMDI0QTUwMDAxMDAwMjIyMDAwMDY1MTAyQjEwNDAwMDAzOTMKKzoxMEJDRDAwMDAwMDAwMDAwOEY0MjAxNDgwMEEyMjgyMzkwQTIwMDAwMkIKKzoxMEJDRTAwMDI0QTUwMDAxMDA4MjIwMjEwMDY1MTAyQjEwNDAwMDAzRDQKKzoxMEJDRjAwMDAwMDAwMDAwOEY0MjAxNDgwMEEyMjgyMzkwQTIwMDAwMEIKKzoxMEJEMDAwMDI0QTUwMDAxMDAwMjEyMDAwMDgyMjAyMTAwNjUxMDJCRjIKKzoxMEJEMTAwMDEwNDAwMDAzMDAwMDAwMDA4RjQyMDE0ODAwQTIyODIzQzkKKzoxMEJEMjAwMDkwQTIwMDAwMDA4MjIwMjEwMDA0MUMwMjMwODJGRkZGNEMKKzoxMEJEMzAwMDAwNjIyMDIxMDAwNDFDMDIzMDgyRkZGRjAwNjIyMDIxRUIKKzoxMEJENDAwMDAzRTAwMDA4MzA4MkZGRkYwMDAwMDAwMDhGODIwMjIwMjUKKzoxMEJENTAwMDM0NDIwMDAyQUY4MjAyMjAzQzAyMDAwMjhDNDI4RkY4ODMKKzoxMEJENjAwMDMwNDI0MDAwMTA0MDAwNTQyNDA0MDAwMThGODIwMjAwNDEKKzoxMEJENzAwMDI0MDY3RkZGOEY4MzAyMDAzMDQ1MDAwMjI0MDJGRkZENkUKKzoxMEJEODAwMDAwNjIxODI0QUY4MzAyMDBBRjg0MDIwNDhGODMwMDU0NDIKKzoxMEJEOTAwMDhGODIwMDU0MTAwMDAwMDIyNDYzMDAwMThGODIwMDU0M0YKKzoxMEJEQTAwMDAwNjIxMDIzMkM0MjAwMDIxNDQwRkZGQzAwMDAwMDAwM0YKKzoxMEJEQjAwMDhGODIwMjI0MTQ0NDAwNEQwMDA0MjA0MDAwQzQxMDJCNDQKKzoxMEJEQzAwMDEwNDBGRkYxMDAwMDAwMDA4RjgyMDIwMDAwNDUxMDI1QTYKKzoxMEJERDAwMEFGODIwMjAwOEY4MjAyMjAzNDQyODAwMEFGODIwMjIwQjQKKzoxMEJERTAwMDhGODMwMDU0OEY4MjAwNTQxMDAwMDAwMjI0NjMwMDAxRUUKKzoxMEJERjAwMDhGODIwMDU0MDA2MjEwMjMyQzQyMDAwMjE0NDBGRkZDOEEKKzoxMEJFMDAwMDAwMDAwMDAwOEY4MjAyMjAzQzAzMDAwNDAwNDMxMDI0NDUKKzoxMEJFMTAwMDE0NDAwMDBGMDAwMDAwMDA4RjgyMDIyMDNDMDNGRkZGNEYKKzoxMEJFMjAwMDM0NjM3RkZGMDA0MzEwMjRBRjgyMDIyMDhGODMwMDU0Q0QKKzoxMEJFMzAwMDhGODIwMDU0MTAwMDAwMDIyNDYzMDAwMThGODIwMDU0OUUKKzoxMEJFNDAwMDAwNjIxMDIzMkM0MjAwMDIxNDQwRkZGQzAwMDAwMDAwOUUKKzoxMEJFNTAwMDhGODIwMjIwM0MwMzAwMDQwMDQzMTAyNDE0NDAwMDBEOTQKKzoxMEJFNjAwMDAwMDAwMDAwOEY4MjAyMjAzNDQyODAwMEFGODIwMjIwNTYKKzoxMEJFNzAwMDhGODMwMDU0OEY4MjAwNTQxMDAwMDAwMjI0NjMwMDAxNUQKKzoxMEJFODAwMDhGODIwMDU0MDA2MjEwMjMyQzQyMDAwMjE0NDBGRkZDRjkKKzoxMEJFOTAwMDAwMDAwMDAwOEY4MjAyMjAzQzAzMDAwNDAwNDMxMDI0QjUKKzoxMEJFQTAwMDEwNDAwMDFCMDAwMDEwMjE4RjgzMDIyMDI0MDIwMDAxOUIKKzoxMEJFQjAwMDEwMDAwMDE1M0MwNEY3MDA4RjgyMDIyMDNDMDRGNzAwQkMKKzoxMEJFQzAwMDAwNDQxMDI1QUY4MjAyMjA4RjgyMDIyMDI0MDNGRkZENTAKKzoxMEJFRDAwMDAwNDMxMDI0QUY4MjAyMjA4RjgyMDIyMDNDMDMwMzAwMjMKKzoxMEJFRTAwMDAwNDMxMDI0MTQ0MDAwMDMwMDAwMDAwMDEwMDAwMDA4NkMKKzoxMEJFRjAwMDAwMDAxMDIxOEY4MjAyMjAzNDQyMDAwMkFGODIwMjIwMTMKKzoxMEJGMDAwMDhGODMwMjIwMjQwMjAwMDEwMDY0MTgyNUFGODMwMjIwRTEKKzoxMEJGMTAwMDAzRTAwMDA4MDAwMDAwMDAwMDAwMjAyMTNDMDUwMTAwQjMKKzoxMEJGMjAwMDI0MDIwMDAxQUY4MDAyMUNBRjgyMDIwMEFGODIwMjIwMTcKKzoxMEJGMzAwMDI3NjI1MDAwQUY4MjAwQzAyNzYyNTAwMEFGODIwMEM0NjkKKzoxMEJGNDAwMDI3NjI1MDAwQUY4MjAwQzgyNzYyNTAwMEFGODIwMEQwNDUKKzoxMEJGNTAwMDI3NjI1MDAwQUY4MjAwRDQyNzYyNTAwMEFGODIwMEQ4MjEKKzoxMEJGNjAwMDI3NjIzMDAwQUY4MjAwRTAyNzYyMzAwMEFGODIwMEU0MzkKKzoxMEJGNzAwMDI3NjIzMDAwQUY4MjAwRTgyNzYyMjgwMEFGODIwMEYwMUQKKzoxMEJGODAwMDI3NjIyODAwQUY4MjAwRjQyNzYyMjgwMEFGODIwMEY4MDEKKzoxMEJGOTAwMDAwMDQxOEMwMjQ4NDAwMDEwMzYzMTAyMUFDNDUzMDA0NjAKKzoxMEJGQTAwMDAzNjMxMDIxQUM0MDMwMDAyODgyMDIwMDE0NDBGRkY5RTYKKzoxMEJGQjAwMDAwMDQxOEMwMDAwMDIwMjEwMDA0MThDMDI0ODQwMDAxREYKKzoxMEJGQzAwMDAzNjMxMDIxQUM0MDI4MDQwMzYzMTAyMUFDNDAyODAwMTcKKzoxMEJGRDAwMDI4ODIwMTAwMTQ0MEZGRjkwMDA0MThDMEFGODAwMjNDMjEKKzoxMEJGRTAwMDI0MDMwMDgwMjQwNDAxMDBBQzYwMDAwMDI0NjMwMDA0RUEKKzoxMEJGRjAwMDAwNjQxMDJCNTQ0MEZGRkRBQzYwMDAwMDhGODMwMDQwQjQKKzoxMEMwMDAwMDNDMDJGMDAwMDA2MjE4MjQzQzAyNTAwMDEwNjIwMDBDNTgKKzoxMEMwMTAwMDAwNDMxMDJCMTQ0MDAwMDYzQzAyNjAwMDNDMDI0MDAwMkMKKzoxMEMwMjAwMDEwNjIwMDA4MjQwMjA4MDAxMDAwMDAwODAwMDAwMDAwNTAKKzoxMEMwMzAwMDEwNjIwMDA0MjQwMjA4MDAxMDAwMDAwNDAwMDAwMDAwNDgKKzoxMEMwNDAwMDI0MDIwNzAwM0MwMTAwMDFBQzIyNkRBQzAzRTAwMDA4QjMKKzoxMEMwNTAwMDAwMDAwMDAwM0MwMjAwMDE4QzQyNkRCQzI3QkRGRkQwRjcKKzoxMEMwNjAwMEFGQkYwMDJDQUZCMjAwMjhBRkIxMDAyNEFGQjAwMDIwQUEKKzoxMEMwNzAwMDNDMDEwMDAxMTA0MDAwMDVBQzIwNkQ5NDBDMDA0RDlFNjkKKzoxMEMwODAwMDAwMDAwMDAwM0MwMTAwMDFBQzIwNkRCQzhGODMwMDU0MTcKKzoxMEMwOTAwMDhGODIwMDU0MTAwMDAwMDIyNDYzMDA2NDhGODIwMDU0RDkKKzoxMEMwQTAwMDAwNjIxMDIzMkM0MjAwNjUxNDQwRkZGQzAwMDAwMDAwRDkKKzoxMEMwQjAwMDBDMDA0REI5MDAwMDAwMDAyNDA0MDAwMTAwMDAyODIxRkMKKzoxMEMwQzAwMDI3QTYwMDE4MzQwMjgwMDAwQzAwNDVCRUE3QTIwMDE4NjUKKzoxMEMwRDAwMDhGODMwMDU0OEY4MjAwNTQxMDAwMDAwMjI0NjMwMDY0OTgKKzoxMEMwRTAwMDhGODIwMDU0MDA2MjEwMjMyQzQyMDA2NTE0NDBGRkZDMzQKKzoxMEMwRjAwMDI0MDQwMDAxMjQwNTAwMDEwQzAwNDU3QzI3QTYwMDE4M0IKKzoxMEMxMDAwMDhGODMwMDU0OEY4MjAwNTQxMDAwMDAwMjI0NjMwMDY0NjcKKzoxMEMxMTAwMDhGODIwMDU0MDA2MjEwMjMyQzQyMDA2NTE0NDBGRkZDMDMKKzoxMEMxMjAwMDI0MDQwMDAxMjQwNTAwMDEwQzAwNDU3QzI3QTYwMDE4MEEKKzoxMEMxMzAwMDhGODMwMDU0OEY4MjAwNTQxMDAwMDAwMjI0NjMwMDY0MzcKKzoxMEMxNDAwMDhGODIwMDU0MDA2MjEwMjMyQzQyMDA2NTE0NDBGRkZDRDMKKzoxMEMxNTAwMDI0MDQwMDAxM0MwNjAwMDEyNEM2NkYyNDBDMDA0NTdDMjkKKzoxMEMxNjAwMDI0MDUwMDAyOEY4MzAwNTQ4RjgyMDA1NDEwMDAwMDAyQzcKKzoxMEMxNzAwMDI0NjMwMDY0OEY4MjAwNTQwMDYyMTAyMzJDNDIwMDY1MDcKKzoxMEMxODAwMDE0NDBGRkZDMjQwNDAwMDEyNDA1MDAwMzNDMTAwMDAxQkUKKzoxMEMxOTAwMDI2MTA2RjI2MEMwMDQ1N0MwMjAwMzAyMTk3QTYwMDE4NUYKKzoxMEMxQTAwMDNDMDcwMDAxOTRFNzZGMjQzQzA0MDAwMTI0ODQ2QUUwMEEKKzoxMEMxQjAwMEFGQTAwMDE0OTYwMjAwMDAzQzA1MDAwRDM0QTUwMTAwNUMKKzoxMEMxQzAwMDBDMDAyQjNCQUZBMjAwMTA5N0EyMDAxODEwNDAwMDREQUUKKzoxMEMxRDAwMDI0MDM2MDQwOTYwMjAwMDAzMDQyRkZGMDE0NDMwMDBDM0MKKzoxMEMxRTAwMDI0MDIwMDIwM0MwMzAwMDE5NDYzNkYyNDE0NjIwMDBCQkUKKzoxMEMxRjAwMDI0MDI3ODMwMjQwMjAwMDMzQzAxMDAwMUFDMjI2RDk0M0IKKzoxMEMyMDAwMDI0MDIwMDA1M0MwMTAwMDExMDAwMDAzRkFDMjI2RjM0MDUKKzoxMEMyMTAwMDNDMDMwMDAxOTQ2MzZGMjQyNDAyNzgzMDE0NjIwMDBDMDQKKzoxMEMyMjAwMDI0MDMwMDEwM0MwMjAwMDE5NDQyNkYyNjMwNDJGRkYwQ0MKKzoxMEMyMzAwMDE0NDMwMDA3MjQwMjAwMDMzQzAxMDAwMUFDMjI2RDk0NkEKKzoxMEMyNDAwMDI0MDIwMDA2M0MwMTAwMDExMDAwMDAyRkFDMjI2RjM0RDQKKzoxMEMyNTAwMDNDMDIwMDAxOEM0MjZEOTQzQzAzMDAwMTk0NjM2RjI0MDYKKzoxMEMyNjAwMDM0NDIwMDAxM0MwMTAwMDFBQzIyNkQ5NDI0MDIwMDE1MEYKKzoxMEMyNzAwMDE0NjIwMDBCMDAwMDAwMDAzQzAyMDAwMTk0NDI2RjI2OTMKKzoxMEMyODAwMDMwNDJGRkYwMzg0M0Y0MjAyQzYzMDAwMTM4NDJGNDMwOTAKKzoxMEMyOTAwMDJDNDIwMDAxMDA2MjE4MjUxNDYwMDAxQjI0MDIwMDAzRDgKKzoxMEMyQTAwMDNDMDMwMDAxOTQ2MzZGMjQyNDAyNzgxMDE0NjIwMDE2OEEKKzoxMEMyQjAwMDI0MDIwMDAyM0MwMjAwMDE5NDQyNkYyNjMwNDJGRkYwNEIKKzoxMEMyQzAwMDE0NDAwMDExMjQwMjAwMDIxMDAwMDAwRjI0MDIwMDA0OTgKKzoxMEMyRDAwMDNDMDIwMDAxOEM0MjZEOTQzNDQyMDAwODNDMDEwMDAxOTQKKzoxMEMyRTAwMEFDMjI2RDk0MTAwMDAwNUUyNDAyMDAwNDNDMDIwMDAxQTgKKzoxMEMyRjAwMDhDNDI2RDk0MzQ0MjAwMDQzQzAxMDAwMTEwMDAwMEFGRjgKKzoxMEMzMDAwMEFDMjI2RDk0MjQwMjAwMDEzQzAxMDAwMUFDMjI2RjQwN0MKKzoxMEMzMTAwMDNDMDIwMDAxOEM0MjZEOTQzMDQyMDAwMjE0NDAwMEIyOTUKKzoxMEMzMjAwMDNDMDlGRkYwMjQwMjBFMDBBRjgyMDIzODhGODQwMDU0RDMKKzoxMEMzMzAwMDhGODIwMDU0MjQwMzAwMDgzQzAxMDAwMUFDMjM2RDk4NTcKKzoxMEMzNDAwMDEwMDAwMDAyMjQ4NDAxRjQ4RjgyMDA1NDAwODIxMDIzMjQKKzoxMEMzNTAwMDJDNDIwMUY1MTQ0MEZGRkMzQzAyMDBDODM0NDIwMUZCQjIKKzoxMEMzNjAwMEFGODIwMjM4OEY4MzAwNTQ4RjgyMDA1NDEwMDAwMDAyODUKKzoxMEMzNzAwMDI0NjMwMUY0OEY4MjAwNTQwMDYyMTAyMzJDNDIwMUY1RTMKKzoxMEMzODAwMDE0NDBGRkZDMDAwMDgwMjEyNDEyMDAwMTI0MTEwMDA5NDgKKzoxMEMzOTAwMDBDMDA0NDgyMDAwMDAwMDAzQzAxMDAwMUFDMzI2REI0OEUKKzoxMEMzQTAwMDBDMDA0NTQ3MDAwMDAwMDAzQzAyMDAwMThDNDI2REI0QzcKKzoxMEMzQjAwMDE0NTFGRkZCM0MwMjAwQzgzNDQyMDFGNkFGODIwMjM4NDAKKzoxMEMzQzAwMDhGODMwMDU0OEY4MjAwNTQxMDAwMDAwMjI0NjMwMDBBRkYKKzoxMEMzRDAwMDhGODIwMDU0MDA2MjEwMjMyQzQyMDAwQjE0NDBGRkZDOUIKKzoxMEMzRTAwMDAwMDAwMDAwOEY4MjAyMjAyNDA0MDAwMTM0NDIwMDAyNzkKKzoxMEMzRjAwMEFGODIwMjIwOEY4MzAyMDAyNDA1N0ZGRjI0MDJGRkZEMEQKKzoxMEM0MDAwMDAwNjIxODI0QUY4MzAyMDBBRjg0MDIwNDhGODMwMDU0QkIKKzoxMEM0MTAwMDhGODIwMDU0MTAwMDAwMDIyNDYzMDAwMThGODIwMDU0QjgKKzoxMEM0MjAwMDAwNjIxMDIzMkM0MjAwMDIxNDQwRkZGQzAwMDAwMDAwQjgKKzoxMEM0MzAwMDhGODIwMjI0MTQ0NDAwMDUzNDAyODAwMDAwMDQyMDQwNEUKKzoxMEM0NDAwMDAwQTQxMDJCMTA0MEZGRjAzNDAyODAwMDEwODJGRkEwRTcKKzoxMEM0NTAwMDI2MTAwMDAxMkUwMjAwMTQxNDQwRkZDRDI0MDIwMDA0MTcKKzoxMEM0NjAwMDNDMDEwMDAxQUMyMjZEOTgwMDAwODAyMTI0MTIwMDA5REIKKzoxMEM0NzAwMDNDMTFGRkZGMzYzMTNGN0YwQzAwNDQ4MjAwMDAwMDAwN0EKKzoxMEM0ODAwMDI0MDIwMDAxM0MwMTAwMDFBQzIyNkRCNDBDMDA0NTQ3QzAKKzoxMEM0OTAwMDAwMDAwMDAwM0MwMjAwMDE4QzQyNkRCNDE0NTJGRkZCMEUKKzoxMEM0QTAwMDAwMDAwMDAwOEY4MjAwNDQwMDUxMTAyNDM0NDI1MDgwNkMKKzoxMEM0QjAwMEFGODIwMDQ0OEY4MzAwNTQ4RjgyMDA1NDEwMDAwMDAyMkEKKzoxMEM0QzAwMDI0NjMwMDBBOEY4MjAwNTQwMDYyMTAyMzJDNDIwMDBCNjgKKzoxMEM0RDAwMDE0NDBGRkZDMDAwMDAwMDA4RjgyMDA0NDAwNTExMDI0MzMKKzoxMEM0RTAwMDM0NDJGMDgwQUY4MjAwNDQ4RjgzMDA1NDhGODIwMDU0MjYKKzoxMEM0RjAwMDEwMDAwMDAyMjQ2MzAwMEE4RjgyMDA1NDAwNjIxMDIzOUYKKzoxMEM1MDAwMDJDNDIwMDBCMTQ0MEZGRkMwMDAwMDAwMDhGODIwMjIwMzAKKzoxMEM1MTAwMDNDMDNGNzAwMDA0MzEwMjVBRjgyMDIyMDhGODMwMDU0QjQKKzoxMEM1MjAwMDhGODIwMDU0MTAwMDAwMDIyNDYzMDA2NDhGODIwMDU0NDQKKzoxMEM1MzAwMDAwNjIxMDIzMkM0MjAwNjUxNDQwRkZGQzAwMDAwMDAwNDQKKzoxMEM1NDAwMDhGODIwMjIwMjQwNDAwMDEzNDQyMDAwMkFGODIwMjIwQzQKKzoxMEM1NTAwMDhGODMwMjAwMjQwNTdGRkYyNDAyRkZGRDAwNjIxODI0NjAKKzoxMEM1NjAwMEFGODMwMjAwQUY4NDAyMDQ4RjgzMDA1NDhGODIwMDU0OTMKKzoxMEM1NzAwMDEwMDAwMDAyMjQ2MzAwMDE4RjgyMDA1NDAwNjIxMDIzMjcKKzoxMEM1ODAwMDJDNDIwMDAyMTQ0MEZGRkMwMDAwMDAwMDhGODIwMjI0QjUKKzoxMEM1OTAwMDE0NDQwMDA1MzQwMjgwMDAwMDA0MjA0MDAwQTQxMDJCNDUKKzoxMEM1QTAwMDEwNDBGRkYwMzQwMjgwMDAxMDgyRkY1MDI2MTAwMDAxN0UKKzoxMEM1QjAwMDJFMDIwMDY0MTQ0MEZGQjAwMDAwMDAwMDNDMDIwMDAxQTUKKzoxMEM1QzAwMDhDNDI2RDk0MzA0MjAwMDQxNDQwMDAwNzNDMDlGRkYwOTcKKzoxMEM1RDAwMDhGODIwMDQ0M0MwM0ZGRkYzNDYzM0Y3RjAwNDMxMDI0RkQKKzoxMEM1RTAwMEFGODIwMDQ0M0MwOUZGRjAzNTI5QkRDMDNDMDYwMDAxODQKKzoxMEM1RjAwMDhDQzY2RDk0M0MwNDAwMDEyNDg0NkFFMDI0MDIwMDAxOEUKKzoxMEM2MDAwMDNDMDEwMDAxQUMyMjZEOUM4RjgyMDA1NDNDMDcwMDAxNkMKKzoxMEM2MTAwMDhDRTc2RjQwM0MwMzAwMDE5NDYzNkYyNDNDMDgwMDAxRTkKKzoxMEM2MjAwMDk1MDg2RjI2M0MwNTAwMEQzNEE1MDEwMDNDMDEwMDAxNzIKKzoxMEM2MzAwMEFDMjA2RDk4MDA0OTEwMjEzQzAxMDAwMUFDMjI2RjMwMDQKKzoxMEM2NDAwMEFGQTMwMDEwMEMwMDJCM0JBRkE4MDAxNDhGQkYwMDJDMzEKKzoxMEM2NTAwMDhGQjIwMDI4OEZCMTAwMjQ4RkIwMDAyMDAzRTAwMDA4QzMKKzoxMEM2NjAwMDI3QkQwMDMwMjdCREZGRTgzQzA1MDAwMThDQTU2RDk4NzMKKzoxMEM2NzAwMDI0MDYwMDA0MjQwMjAwMDExNEEyMDAxNEFGQkYwMDEwMUQKKzoxMEM2ODAwMDNDMDIwMDAyOEM0MjhGRkMzMDQyODAwMDEwNDAwMDA1Q0EKKzoxMEM2OTAwMDNDMDQwMDBGM0MwMzAwMDE4QzYzNkY0MDEwMDAwMDA1NTgKKzoxMEM2QTAwMDM0ODQ0MjQwM0MwNDAwMDQzQzAzMDAwMThDNjM2RjQwMkUKKzoxMEM2QjAwMDM0ODQ5M0UwMjQwMjAwMDUxNDYyMDAxNjAwMDAwMDAwOTgKKzoxMEM2QzAwMDNDMDQwMDNEMTAwMDAwMTMzNDg0MDkwMDNDMDIwMDAyQzkKKzoxMEM2RDAwMDhDNDI4RkY4MzA0MjgwMDAxMDQwMDAwNTNDMDQwMDFFNjAKKzoxMEM2RTAwMDNDMDMwMDAxOEM2MzZGNDAxMDAwMDAwNTM0ODQ4NDgwOUIKKzoxMEM2RjAwMDNDMDQwMDBGM0MwMzAwMDE4QzYzNkY0MDM0ODQ0MjQwRDMKKzoxMEM3MDAwMDI0MDIwMDA1MTQ2MjAwMDMwMDAwMDAwMDNDMDQwMDdBQ0IKKzoxMEM3MTAwMDM0ODQxMjAwM0MwMjAwMDE4QzQyNkYzMDhGODMwMDU0M0QKKzoxMEM3MjAwMDAwNDQxMDIxMDA0MzEwMjMwMDQ0MTAyQjE0NDAwMDRDRkYKKzoxMEM3MzAwMDAwMDAwMDAwM0MwMjAwMDE4QzQyNkRBMDE0NDAwMDQ4NDMKKzoxMEM3NDAwMDAwMDAwMDAwM0MwMTAwMDExMEMwMDAyNUFDMjA2REIwQ0QKKzoxMEM3NTAwMDNDMDkwMDAxOEQyOTZEOTQyNDA3MDAwMTNDMDQ0MDAwMzAKKzoxMEM3NjAwMDNDMDgwMDAyMjUwODhGRkMyNTBBRkZGQzAwMDUyODQyMzIKKzoxMEM3NzAwMDE0QTAwMDAyMjRDNkZGRkYyNDA1MDAwODAwQTkxMDI0MEQKKzoxMEM3ODAwMDEwNDAwMDEwMDAwMDAwMDAxNEE3MDAwODAwMDAwMDAwODYKKzoxMEM3OTAwMDhEMDIwMDAwMDA0NDEwMjQxMDQwMDAwQTAwMDAwMDAwMzgKKzoxMEM3QTAwMDNDMDEwMDAxMTAwMDAwMDdBQzI1NkRCMDhENDIwMDAwNzcKKzoxMEM3QjAwMDAwNDQxMDI0MTA0MDAwMDMwMDAwMDAwMDNDMDEwMDAxNzAKKzoxMEM3QzAwMEFDMjc2REIwM0MwMjAwMDE4QzQyNkRCMDAwMDYxODJCMDYKKzoxMEM3RDAwMDJDNDIwMDAxMDA0MzEwMjQ1NDQwRkZFNTAwMDUyODQyOEMKKzoxMEM3RTAwMDhGODIwMDU0M0MwMzAwMDE4QzYzNkRCMDNDMDEwMDAxNUEKKzoxMEM3RjAwMEFDMjI2RjMwMTA2MDAwM0IyNDAyMDAwNTNDMDMwMDAxQjYKKzoxMEM4MDAwMDhDNjM2RjQwM0MwMTAwMDFBQzI1NkQ5ODE0NjIwMDEyRUUKKzoxMEM4MTAwMDI0MDIwMDAxM0MwMjAwMDI4QzQyOEZGODNDMDMyMDAwRkQKKzoxMEM4MjAwMDM0NjM1MDAwMDA0MzEwMjQxNDQwMDAwNjI0MDIwMDAxMjkKKzoxMEM4MzAwMDNDMDEwMDAxQUMyMDZGMUMzQzAxMDAwMUFDMjI2RDk4NTIKKzoxMEM4NDAwMDI0MDIwMDAxM0MwMTAwMDFBQzIyNkUyNDNDMDEwMDAxRTUKKzoxMEM4NTAwMEFDMjI2REE0MjQwMjAwMDEzQzAxMDAwMUFDMjI2RDlDQkQKKzoxMEM4NjAwMDNDMDIwMDAxOEM0MjZEQjAxMDQwMDAxRTAwMDAwMDAwMzAKKzoxMEM4NzAwMDNDMDIwMDAxOEM0MjZEOUMxMDQwMDAwODI0MDIwMDAxMjMKKzoxMEM4ODAwMDNDMDEwMDAxQUMyMDZEOUNBRUUyMDRCODNDMDEwMDAxMEIKKzoxMEM4OTAwMEFDMjA2RTFDM0MwMTAwMDFBQzIyNkRENDhFRTMwNEI4QzgKKzoxMEM4QTAwMDI0MDIwMDA4MTA2MjAwMDUyNDAyMDAwMTBDMDA0MjM5MzUKKzoxMEM4QjAwMDAwMDAwMDAwMTAwMDAwMEIwMDAwMDAwMDNDMDMwMDAxMUQKKzoxMEM4QzAwMDhDNjM2RDk4MTA2MjAwMDcyNDAyMDAwRTNDMDMwMDAyODYKKzoxMEM4RDAwMDhDNjM4RjkwMTA2MjAwMDMwMDAwMDAwMDBDMDA0RTlDREYKKzoxMEM4RTAwMDhGODQwMjIwOEZCRjAwMTAwM0UwMDAwODI3QkQwMDE4Q0UKKzoxMEM4RjAwMDI3QkRGRkUwM0MwM0ZERkYzQzA0MDAwMThDODQ2RDk4RTQKKzoxMEM5MDAwMDNDMDIwMDAxOEM0MjZEQzAzNDYzRkZGRjAyODNBMDI0MEYKKzoxMEM5MTAwMDE0ODIwMDA2QUZCRjAwMTg4RUUzMDRCODNDMDIwMDAxODkKKzoxMEM5MjAwMDhDNDI2REM0MTA2MjAwMDYwMDAwMDAwMDhFRTIwNEI4NjQKKzoxMEM5MzAwMDNDMDEwMDAxQUMyNDZEQzAzQzAxMDAwMUFDMjI2REM0N0YKKzoxMEM5NDAwMDNDMDMwMDAxOEM2MzZEOTgyNDAyMDAwMjEwNjIwMTlDN0MKKzoxMEM5NTAwMDJDNjIwMDAzMTA0MDAwMDUyNDAyMDAwMTEwNjIwMDBBNEUKKzoxMEM5NjAwMDAwMDAwMDAwMTAwMDAyMjYwMDAwMDAwMDI0MDIwMDA0NjUKKzoxMEM5NzAwMDEwNjIwMEI2MjQwMjAwMDgxMDYyMDEwQTI0MDIwMDAxQkQKKzoxMEM5ODAwMDEwMDAwMjFGMDAwMDAwMDA4RUUyMDRCODI0NDNGRkZGRTUKKzoxMEM5OTAwMDJDNjIwMDA4MTA0MDAyMUMwMDAzMTA4MDNDMDEwMDAxQzIKKzoxMEM5QTAwMDAwMjIwODIxOEMyMjZBRjgwMDQwMDAwODAwMDAwMDAwRTQKKzoxMEM5QjAwMDNDMDMwMDAxOEM2MzZGNDAyNDAyMDAwNTE0NjIwMDEwRTgKKzoxMEM5QzAwMDAwMDAwMDAwM0MwMjAwMDE4QzQyNkRBNDEwNDAwMDA4RjEKKzoxMEM5RDAwMDI0MDIwMDAzMEMwMDQ0ODIwMDAwMDAwMDI0MDIwMDAyMzQKKzoxMEM5RTAwMEFFRTIwNEI4M0MwMTAwMDExMDAwMDAwMkFDMjA2REE0Q0UKKzoxMEM5RjAwMEFFRTIwNEI4M0MwMTAwMDExMDAwMDIwM0FDMjA2RDMwMkYKKzoxMENBMDAwMDBDMDA0NDgyMDAwMDAwMDAzQzAyMDAwMThDNDI2REE0MzYKKzoxMENBMTAwMDNDMDEwMDAxQUMyMDZEMzAxNDQwMDE3QTI0MDIwMDAyNzgKKzoxMENBMjAwMDEwMDAwMTlEMjQwMjAwMDczQzAzMDAwMThDNjM2RjQwNEQKKzoxMENBMzAwMDI0MDIwMDA1MTQ2MjAwMDMyNDAyMDAwMTNDMDEwMDAxRUQKKzoxMENBNDAwMEFDMjI2REQwMEMwMDQ1RkYwMDAwMDAwMDNDMDMwMDAxNEIKKzoxMENBNTAwMDhDNjM2REQwMTAwMDAxNzQyNDAyMDAxMTNDMDUwMDAxQUMKKzoxMENBNjAwMDhDQTU2RDk4M0MwNjAwMDI4Q0M2OEZGQzBDMDA1MTA0MEUKKzoxMENBNzAwMDAwMDAyMDIxMjQwMjAwMDUzQzAxMDAwMUFDMjA2REE0MkYKKzoxMENBODAwMDEwMDAwMUUxQUVFMjA0QjgzQzA0MDAwMTI0ODQ2QUVDMjkKKzoxMENBOTAwMDNDMDUwMDBGMzRBNTAxMDAwMDAwMzAyMTAwMDAzODIxQzIKKzoxMENBQTAwMEFGQTAwMDEwMEMwMDJCM0JBRkEwMDAxNDEwMDAwMUQ2NkIKKzoxMENBQjAwMDAwMDAwMDAwOEY4MjAyMjAzQzAzMDAwNDAwNDMxMDI0ODkKKzoxMENBQzAwMDE0NDAwMTc1MjQwMjAwMDc4RjgzMDA1NDNDMDIwMDAxQ0EKKzoxMENBRDAwMDhDNDI2RjI4MjQ2M0Q4RjAwMDQzMTAyMzJDNDIyNzEwODcKKzoxMENBRTAwMDE0NDAwMDAzMjQwMjAwMDEzQzAxMDAwMUFDMjI2RDlDQjMKKzoxMENBRjAwMDNDMDIwMDAyOEM0MjhGRkMzMDQyNTAwMDEwNDAwMUMyQzgKKzoxMENCMDAwMDAwMDAwMDAwOEY4MjAyMjAzMDQyODAwMDEwNDAwMTdEMzIKKzoxMENCMTAwMDAwMDAwMDAwMTAwMDAxNzUwMDAwMDAwMDNDMDUwMDAxNEQKKzoxMENCMjAwMDhDQTU2RDk4MEMwMDUyOUIwMDAwMjAyMTBDMDA1NTFCMTkKKzoxMENCMzAwMDAwMDAyMDIxM0MwMzAwMDI4QzYzOEZGNDA0NjEwMUIwRUIKKzoxMENCNDAwMDI0MDIwMDAxM0MwMjAwMDgwMDYyMTAyNDEwNDAwMDA2OEMKKzoxMENCNTAwMDAwMDAwMDAwOEY4MjAyMTQzQzAzRkZGRjAwNDMxMDI0RkEKKzoxMENCNjAwMDEwMDAwMDA1MzQ0MjI1MUY4RjgyMDIxNDNDMDNGRkZGOTIKKzoxMENCNzAwMDAwNDMxMDI0MzQ0MjI0MUZBRjgyMDIxNDhGODIwMjIwMEIKKzoxMENCODAwMDNDMDMwMjAwMzQ0MjAwMDJBRjgyMDIyMDI0MDIwMDA4NkIKKzoxMENCOTAwMEFFRTIwNEI4OEY4MjAyMjAwMjgzQTAyNTNDMDMwMDA0ODkKKzoxMENCQTAwMDAwNDMxMDI0MTQ0MDAwMTYwMDAwMDAwMDNDMDIwMDAyNjQKKzoxMENCQjAwMDhDNDI4RkZDMzA0MjUwMDAxMDQwMDAwRDAwMDAwMDAwRkQKKzoxMENCQzAwMDhGODIwMjIwMzA0MjgwMDAxMDQwMDAwNjAwMDAwMDAwRUEKKzoxMENCRDAwMDhGODIwMjIwM0MwM0ZGRkYzNDYzN0ZGRjEwMDAwMDAzQkQKKzoxMENCRTAwMDAwNDMxMDI0OEY4MjAyMjAzNDQyODAwMEFGODIwMjIwNTIKKzoxMENCRjAwMDhGODIwMjIwM0MwM0Y3MDAwMDQzMTAyNUFGODIwMjIwMDEKKzoxMENDMDAwMDNDMDMwMDAxOEM2MzZGNDAyNDAyMDAwNTE0NjIwMDBBOUIKKzoxMENDMTAwMDAwMDAwMDAwM0MwMjAwMDE5NDQyNkYyNjI0NDI5RkJDQTkKKzoxMENDMjAwMDJDNDIwMDA0MTA0MDAwMDQyNDA0MDAxODI0MDUwMDAyRDMKKzoxMENDMzAwMDBDMDA0RERCMjQwNjAwMjAwQzAwM0U2RDAwMDAwMDAwQkYKKzoxMENDNDAwMDNDMDEwMDAxMTAwMDAxNzBBQzIwNkUyMDhFRTIwNEI4OUYKKzoxMENDNTAwMDI0NDNGRkZGMkM2MjAwMDgxMDQwMDE2QjAwMDMxMDgwOEEKKzoxMENDNjAwMDNDMDEwMDAxMDAyMjA4MjE4QzIyNkIxODAwNDAwMDA4QzIKKzoxMENDNzAwMDAwMDAwMDAwMEMwMDQ1NDcwMDAwMDAwMDNDMDMwMDAxREMKKzoxMENDODAwMDhDNjM2REI0MTAwMDAwRTgyNDAyMDAwOTNDMDIwMDAyMkQKKzoxMENDOTAwMDhDNDI4RkY4MzA0MjQwMDAxMDQwMDAwNDAwMDAwMDAwMzkKKzoxMENDQTAwMDhGODIwMDQ0MTAwMDAwMDYzNDQyRjA4MDhGODIwMDQ0REUKKzoxMENDQjAwMDNDMDNGRkZGMzQ2MzNGN0YwMDQzMTAyNDM0NDJBMDgwRDUKKzoxMENDQzAwMEFGODIwMDQ0OEY4MzAwNTQxMDAwMDBFQTI0MDIwMDA0NjUKKzoxMENDRDAwMDhGODMwMDU0M0MwMjAwMDE4QzQyNkYyODI0NjNEOEYwRkIKKzoxMENDRTAwMDAwNDMxMDIzMkM0MjI3MTAxNDQwMDE0NzI0MDIwMDA1NjIKKzoxMENDRjAwMDEwMDAwMEQ4MDAwMDAwMDA4RjgyMDIyMDNDMDNGNzAwRTMKKzoxMENEMDAwMDAwNDMxMDI1QUY4MjAyMjBBRjgwMDIwNDNDMDEwMDAyRTQKKzoxMENEMTAwMDEwMDAwMEQ2QUMyMDhGRTA4RjgzMDA1NDNDMDIwMDAxNEQKKzoxMENEMjAwMDhDNDI2RjI4MjQ2M0ZGRjYwMDQzMTAyMzJDNDIwMDBBMzQKKzoxMENEMzAwMDE0NDAwMTM1MjQwMjAwMDcxMDAwMDBENzAwMDAwMDAwNTUKKzoxMENENDAwMDBDMDAzRjUwMDAwMDAwMDAxMDQwMDEyRDI0MDIwMDAxQTMKKzoxMENENTAwMDhGODIwMjE0M0MwM0ZGRkYzQzA0MDAwMThDODQ2RjFDOTMKKzoxMENENjAwMDAwNDMxMDI0MzQ0MjI1MUZBRjgyMDIxNDI0MDIwMDA4MUQKKzoxMENENzAwMDEwODAwMDA1QUVFMjA0QjgzQzAyMDAwMThDNDI2RTQ0MTMKKzoxMENEODAwMDEwNDAwMDY0MjQwMjAwMDE4RjgyMDIyMDNDMDMwMDA4NEUKKzoxMENEOTAwMDAwNDMxMDI0MTA0MDAwNkEzQzAyMDIwMDEwMDAwMDc4OUEKKzoxMENEQTAwMDAwMDAwMDAwOEVFMjA0QjgyNDQzRkZGRjJDNjIwMDA3NUQKKzoxMENEQjAwMDEwNDAwMTE1MDAwMzEwODAzQzAxMDAwMTAwMjIwODIxRjEKKzoxMENEQzAwMDhDMjI2QjM4MDA0MDAwMDgwMDAwMDAwMDBDMDAzREFGRDIKKzoxMENERDAwMDAwMDAwMDAwM0MwMTAwMDFBQzIwNkQ5Q0FGODAwMjA0MEIKKzoxMENERTAwMDNDMDEwMDAyMEMwMDQ0ODJBQzIwOEZFMDI0MDIwMDAxRDAKKzoxMENERjAwMDNDMDEwMDAxQUMyMjZEQjQyNDAyMDAwMjEwMDAwMTAyQ0IKKzoxMENFMDAwMEFFRTIwNEI4MEMwMDQ1NDcwMDAwMDAwMDNDMDMwMDAxRkUKKzoxMENFMTAwMDhDNjM2REI0MTAwMDAwODQyNDAyMDAwOTNDMDIwMDAyRkYKKzoxMENFMjAwMDhDNDI4RkY4MzA0MjQwMDAxMDQwMDAwMzNDMDIwMEM4QTIKKzoxMENFMzAwMDEwMDAwMDAyMzQ0MjAxRjYzNDQyMDFGRUFGODIwMjM4OTMKKzoxMENFNDAwMDhGODMwMDU0MTAwMDAwOEIyNDAyMDAwNDhGODMwMDU0NTEKKzoxMENFNTAwMDNDMDIwMDAxOEM0MjZGMjgyNDYzRDhGMDAwNDMxMDIzNjkKKzoxMENFNjAwMDJDNDIyNzEwMTQ0MDAwRTgyNDAyMDAwNTEwMDAwMDc5MkQKKzoxMENFNzAwMDAwMDAwMDAwOEY4MjAyMjAzQzAzRjcwMDAwNDMxMDI1RDEKKzoxMENFODAwMEFGODIwMjIwQUY4MDAyMDQzQzAxMDAwMjEwMDAwMDc3NTQKKzoxMENFOTAwMEFDMjA4RkUwOEY4MzAwNTQzQzAyMDAwMThDNDI2RjI4NEQKKzoxMENFQTAwMDI0NjNGRkY2MDA0MzEwMjMyQzQyMDAwQTE0NDAwMEQ2RUUKKzoxMENFQjAwMDI0MDIwMDA3MTAwMDAwNzgwMDAwMDAwMDBDMDAzRjUwMjIKKzoxMENFQzAwMDAwMDAwMDAwMTA0MDAwQ0UyNDAyMDAwMThGODIwMjE0RjYKKzoxMENFRDAwMDNDMDNGRkZGM0MwNDAwMDE4Qzg0NkYxQzAwNDMxMDI0QzIKKzoxMENFRTAwMDM0NDIyNTFGQUY4MjAyMTQyNDAyMDAwODEwODAwMDBGNzQKKzoxMENFRjAwMEFFRTIwNEI4M0MwMjAwMDE4QzQyNkU0NDE0NDAwMDBCQzgKKzoxMENGMDAwMDAwMDAwMDAwOEY4MjAyMjAzNDQyMDAwMkFGODIwMjIwMjMKKzoxMENGMTAwMDI0MDIwMDAxM0MwMTAwMDJBQzIyOEY5MDBDMDA0RTlDQzgKKzoxMENGMjAwMDhGODQwMjIwMTAwMDAwMTYwMDAwMDAwMDhGODIwMjIwNzMKKzoxMENGMzAwMDNDMDMwMDA4MDA0MzEwMjQxNDQwMDAxMTNDMDIwMjAwOEUKKzoxMENGNDAwMDAyODJBMDI1MjQwMjAwMEUzQzAxMDAwMkFDMjI4RjkwMzgKKzoxMENGNTAwMDBDMDA1NTFCMDAwMDIwMjE4RjgyMDIyMDM0NDIwMDAyNjkKKzoxMENGNjAwMDBDMDAzRTZEQUY4MjAyMjAzQzA1MDAwMThDQTU2RDk4M0YKKzoxMENGNzAwMDBDMDA1MjlCMDAwMDIwMjExMDAwMDBBMzAwMDAwMDAwQzQKKzoxMENGODAwMDNDMDIwMDAxOEM0MjZFNDQxMDQwMDA5RjAwMDAwMDAwRjMKKzoxMENGOTAwMDNDMDIwMDAxOEM0MjZFNDAyNDQyRkZGRjNDMDEwMDAxMzQKKzoxMENGQTAwMEFDMjI2RTQwMTQ0MDAwOTgyNDAyMDAwMjNDMDEwMDAxQjMKKzoxMENGQjAwMEFDMjA2RTQ0M0MwMTAwMDExMDAwMDA5M0FDMjI2RTQwOTYKKzoxMENGQzAwMDhFRTIwNEI4MjQ0M0ZGRkYyQzYyMDAwNzEwNDAwMDhFNUQKKzoxMENGRDAwMDAwMDMxMDgwM0MwMTAwMDEwMDIyMDgyMThDMjI2QjU4QzQKKzoxMENGRTAwMDAwNDAwMDA4MDAwMDAwMDAzQzAyMDAwMThDNDI2REE0REIKKzoxMENGRjAwMDEwNDAwMDE4MjQwMjAwMDUwQzAwNDQ4MjAwMDAwMDAwQ0MKKzoxMEQwMDAwMDI0MDIwMDAyQUVFMjA0QjgzQzAxMDAwMTEwMDAwMDdFRTAKKzoxMEQwMTAwMEFDMjA2REE0MEMwMDQ5NjMwMDAwMDAwMDNDMDMwMDAxM0IKKzoxMEQwMjAwMDhDNjM2REQ0MjQwMjAwMDYxNDYyMDA3NzI0MDIwMDAzOEUKKzoxMEQwMzAwMDEwMDAwMDc1QUVFMjA0QjgzQzA1MDAwMThDQTU2RDk4QTcKKzoxMEQwNDAwMDNDMDYwMDAyOENDNjhGRjgwQzAwNTEwNDAwMDAyMDIxMjEKKzoxMEQwNTAwMDI0MDIwMDA1MTAwMDAwNkNBRUUyMDRCODhGODIwMjIwQUEKKzoxMEQwNjAwMDNDMDNGNzAwMDA0MzEwMjVBRjgyMDIyMDhGODMwMDU0NTkKKzoxMEQwNzAwMDI0MDIwMDA2QUVFMjA0QjgzQzAxMDAwMTEwMDAwMDYyODgKKzoxMEQwODAwMEFDMjM2RjI4OEY4MjAyMjAzQzAzMDAwNDAwNDMxMDI0NEQKKzoxMEQwOTAwMDEwNDAwMDAzMjQwMjAwMDcxMDAwMDA1QkFFRTIwNEI4NTkKKzoxMEQwQTAwMDhGODMwMDU0M0MwMjAwMDE4QzQyNkYyODI0NjNEOEYwMjcKKzoxMEQwQjAwMDAwNDMxMDIzMkM0MjI3MTAxNDQwMDAwMzI0MDIwMDAxRDcKKzoxMEQwQzAwMDNDMDEwMDAxQUMyMjZEOUMzQzAyMDAwMjhDNDI4RkY4QjYKKzoxMEQwRDAwMDMwNDI1MDAwMTA0MDAwNEMwMDAwMDAwMDhGODIwMjIwQkYKKzoxMEQwRTAwMDMwNDI4MDAwMTA0MDAwMDcwMDAwMDAwMDhGODIwMjIwQzQKKzoxMEQwRjAwMDNDMDNGRkZGMzQ2MzdGRkYwMDQzMTAyNDEwMDAwMDQyMTUKKzoxMEQxMDAwMEFGODIwMjIwOEY4MjAyMjAzNDQyODAwMDEwMDAwMDNFNTUKKzoxMEQxMTAwMEFGODIwMjIwM0MwNTAwMDE4Q0E1NkQ5ODBDMDA1MjlCNEIKKzoxMEQxMjAwMDAwMDAyMDIxMEMwMDU1MUIwMDAwMjAyMTNDMDIwMDAyQzEKKzoxMEQxMzAwMDhDNDI4RkYwMDQ0MTAwMzIyNDAyMDAwMThGODIwMjE0REQKKzoxMEQxNDAwMDNDMDNGRkZGMDA0MzEwMjQzNDQyMjUxRkFGODIwMjE0MkEKKzoxMEQxNTAwMDI0MDIwMDA4QUVFMjA0Qjg4RjgyMDIyMDM0NDIwMDAyQUEKKzoxMEQxNjAwMEFGODIwMjIwOEY4MjAyMjAzQzAzMDAwNDAwNDMxMDI0N0YKKzoxMEQxNzAwMDE0NDAwMDE2MDAwMDAwMDAzQzAyMDAwMjhDNDI4RkY4QjAKKzoxMEQxODAwMDMwNDI1MDAwMTA0MDAwMEQwMDAwMDAwMDhGODIwMjIwNEQKKzoxMEQxOTAwMDMwNDI4MDAwMTA0MDAwMDYwMDAwMDAwMDhGODIwMjIwMTQKKzoxMEQxQTAwMDNDMDNGRkZGMzQ2MzdGRkYxMDAwMDAwMzAwNDMxMDI0QTMKKzoxMEQxQjAwMDhGODIwMjIwMzQ0MjgwMDBBRjgyMDIyMDhGODIwMjIwQzAKKzoxMEQxQzAwMDNDMDNGNzAwMDA0MzEwMjVBRjgyMDIyMDNDMDIwMDAxMUYKKzoxMEQxRDAwMDk0NDI2RjI2MjQ0MjlGQkMyQzQyMDAwNDEwNDAwMDA0NUQKKzoxMEQxRTAwMDI0MDQwMDE4MjQwNTAwMDIwQzAwNEREQjI0MDYwMDIwNTYKKzoxMEQxRjAwMDBDMDAzRTZEMDAwMDAwMDAxMDAwMDAwMzAwMDAwMDAwNjUKKzoxMEQyMDAwMDNDMDEwMDAxQUMyMjZEOUM4RkJGMDAxODAzRTAwMDA4QjgKKzoxMEQyMTAwMDI3QkQwMDIwOEY4MjAyMDA4RjgyMDIyMDhGODIwMjIwOTEKKzoxMEQyMjAwMDM0NDIwMDA0QUY4MjAyMjA4RjgyMDIwMDNDMDUwMDAxREMKKzoxMEQyMzAwMDhDQTU2RDk4MzQ0MjAwMDRBRjgyMDIwMDI0MDIwMDAyRTMKKzoxMEQyNDAwMDEwQTIwMDRCMkNBMjAwMDMxMDQwMDAwNTI0MDIwMDAxOTQKKzoxMEQyNTAwMDEwQTIwMDBBMDAwMDAwMDAxMDAwMDBCMTAwMDAwMDAwNTEKKzoxMEQyNjAwMDI0MDIwMDA0MTBBMjAwNzIyNDAyMDAwODEwQTIwMDg1MEIKKzoxMEQyNzAwMDNDMDJGMEZGMTAwMDAwQUEwMDAwMDAwMDhGODMwMDUwNjUKKzoxMEQyODAwMDNDMDJGMEZGMzQ0MkZGRkYzQzA0MDAwMThDODQ2RjQwRkQKKzoxMEQyOTAwMDAwNjIxODI0M0MwMjA3MDAwMDYyMTgyNTI0MDIwRTAwRDgKKzoxMEQyQTAwMDI0ODRGRkZCMkM4NDAwMDJBRjgzMDA1MEFGODUwMjAwNzIKKzoxMEQyQjAwMEFGODUwMjIwMTQ4MDAwMDZBRjgyMDIzODhGODIwMDQ0QkUKKzoxMEQyQzAwMDNDMDNGRkZGMzQ2MzNGN0YwMDQzMTAyNEFGODIwMDQ0RTAKKzoxMEQyRDAwMDNDMDMwMDAxOEM2MzZGNDAyNDAyMDAwNTE0NjIwMDA0Q0IKKzoxMEQyRTAwMDAwMDAwMDAwOEY4MjAwNDQzNDQyNTAwMEFGODIwMDQ0QUUKKzoxMEQyRjAwMDNDMDIwMDAxOEM0MjZEODgzQzAzMDAwMThDNjM2RjQwNEUKKzoxMEQzMDAwMDM0NDIwMDIyMjQ2M0ZGRkMyQzYzMDAwMjE0NjAwMDBDRjIKKzoxMEQzMTAwMEFGODIwMjAwM0MwMjAwMDE4QzQyNkRBQzNDMDMwMDAxNzQKKzoxMEQzMjAwMDhDNjM2RDkwM0MwNDAwMDE4Qzg0NkQ4QzM0NDI4MDAwRDEKKzoxMEQzMzAwMDAwNjIxODI1MDA2NDE4MjUxMDAwMDAwQTM0NjIwMDAyRkIKKzoxMEQzNDAwMDNDMDIwMDAxOEM0MjZEOTAzQzAzMDAwMThDNjM2REFDOEIKKzoxMEQzNTAwMDNDMDQwMDAxOEM4NDZEOEMwMDQzMTAyNTAwNDQxMDI1OTIKKzoxMEQzNjAwMDM0NDIwMDAyQUY4MjAyMjAxMDAwMDAyRjI0MDIwMDAxOEMKKzoxMEQzNzAwMDI0MDIwRTAxQUY4MjAyMzg4RjgzMDA1MDNDMDJGMEZGN0UKKzoxMEQzODAwMDM0NDJGRkZGM0MwNDAwMDE4Qzg0NkYxQzAwNjIxODI0QUYKKzoxMEQzOTAwMDNDMDIwRDAwMDA2MjE4MjUyNDAyMDAwMUFGODMwMDUwRkEKKzoxMEQzQTAwMEFGODIwMjAwQUY4MjAyMjAxMDgwMDAwNTNDMDMzRjAwRTQKKzoxMEQzQjAwMDNDMDIwMDAxOEM0MjZEODAxMDAwMDAwNDM0NjMwMDcwNTgKKzoxMEQzQzAwMDNDMDIwMDAxOEM0MjZEODAzNDYzMDA3MjAwNDMxMDI1RTIKKzoxMEQzRDAwMEFGODIwMjAwM0MwMzAwMDE4QzYzNkQ4NDNDMDJGNzAwQzUKKzoxMEQzRTAwMDAwNjIxODI1M0MwMjAwMDE4QzQyNkQ5MDNDMDQwMDAxNTMKKzoxMEQzRjAwMDhDODQ2REFDM0MwNTAwMDE4Q0E1NkY0MDAwNDMxMDI1NkEKKzoxMEQ0MDAwMDAwNDQxMDI1QUY4MjAyMjAyNDAyMDAwNTE0QTIwMDA2NjkKKzoxMEQ0MTAwMDI0MDIwMDAxOEY4MjAwNDQyNDAzQUZGRjAwNDMxMDI0NDQKKzoxMEQ0MjAwMEFGODIwMDQ0MjQwMjAwMDExMDAwMDAzREFGODIwMjM4QTgKKzoxMEQ0MzAwMDhGODMwMDUwM0MwMkYwRkYzNDQyRkZGRjNDMDQwMDAxQTgKKzoxMEQ0NDAwMDhDODQ2RjFDMDA2MjE4MjQzQzAyMEEwMDAwNjIxODI1QkMKKzoxMEQ0NTAwMDI0MDIwMDAxQUY4MzAwNTBBRjgyMDIwMDEwODAwMDFFNDIKKzoxMEQ0NjAwMEFGODIwMjIwM0MwMjAwMDE4QzQyNkU0NDE0NDAwMDFBM0MKKzoxMEQ0NzAwMDNDMDMzRjAwM0MwMjAwMDE4QzQyNkQ4MDEwMDAwMDFBMEEKKzoxMEQ0ODAwMDM0NjMwMEUwOEY4MzAwNTAzQzA0MDAwMThDODQ2RjFDRTcKKzoxMEQ0OTAwMDM0NDJGRkZGMDA2MjE4MjQxMDgwMDAwRkFGODMwMDUwNTkKKzoxMEQ0QTAwMDNDMDIwMDAxOEM0MjZFNDQxNDQwMDAwQjNDMDQzRjAwREYKKzoxMEQ0QjAwMDNDMDMwMDAxOEM2MzZEODAzNDg0MDBFMDI0MDIwMDAxOTEKKzoxMEQ0QzAwMEFGODIwMjAwQUY4MjAyMjAwMDY0MTgyNUFGODMwMjAwMDEKKzoxMEQ0RDAwMDEwMDAwMDA4M0MwNUY3MDAzQzAyMDAwMThDNDI2RDgwMDIKKzoxMEQ0RTAwMDNDMDMzRjAwMzQ2MzAwRTIwMDQzMTAyNUFGODIwMjAwOUEKKzoxMEQ0RjAwMDNDMDVGNzAwMzRBNTgwMDAzQzAzMDAwMThDNjM2RDg0N0IKKzoxMEQ1MDAwMDNDMDIwMDAxOEM0MjZEOTAzQzA0MDAwMThDODQ2REFDQTcKKzoxMEQ1MTAwMDAwNjUxODI1MDA0MzEwMjUwMDQ0MTAyNUFGODIwMjIwMjUKKzoxMEQ1MjAwMDAzRTAwMDA4MDAwMDAwMDAzQzAzMDAwMThDNjM2REI0QzAKKzoxMEQ1MzAwMDNDMDIwMDAxOEM0MjZEQjgxMDYyMDAwMzI0MDIwMDAyMUMKKzoxMEQ1NDAwMDNDMDEwMDAxQUMyMzZEQjgxMDYyMDAxRDJDNjIwMDAzODkKKzoxMEQ1NTAwMDEwNDAwMDI1MjQwMjAwMDExNDYyMDAyMzI0MDIwMDA0NkMKKzoxMEQ1NjAwMDNDMDMwMDAxOEM2MzZEOTgxMDYyMDAwNjI0MDIwMDA4RTEKKzoxMEQ1NzAwMDE0NjIwMDBDM0MwMjAwQzgzNDQyMDFGQjEwMDAwMDA5OTgKKzoxMEQ1ODAwMEFGODIwMjM4MjQwMjBFMDFBRjgyMDIzODhGODIwMDQ0M0IKKzoxMEQ1OTAwMDNDMDNGRkZGMzQ2MzNGN0YwMDQzMTAyNDM0NDIwMDgwOEMKKzoxMEQ1QTAwMEFGODIwMDQ0OEY4MzAwNTQyNDAyMDAwMjNDMDEwMDAxM0EKKzoxMEQ1QjAwMEFDMjI2REI0M0MwMTAwMDExMDAwMDAwQkFDMjM2RjJDQjkKKzoxMEQ1QzAwMDhGODMwMDU0M0MwMjAwMDE4QzQyNkYyQzI0NjNEOEYwRkUKKzoxMEQ1RDAwMDAwNDMxMDIzMkM0MjI3MTAxNDQwMDAwMzI0MDIwMDA5QUEKKzoxMEQ1RTAwMDNDMDEwMDAxQUMyMjZEQjQwM0UwMDAwODAwMDAwMDAwMjMKKzoxMEQ1RjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDI3QkRGRkQ4NzAKKzoxMEQ2MDAwMEFGQjIwMDE4MDA4MDkwMjFBRkIzMDAxQzAwQTA5ODIxOTkKKzoxMEQ2MTAwMEFGQjEwMDE0MDBDMDg4MjFBRkIwMDAxMDAwMDA4MDIxMUQKKzoxMEQ2MjAwMEFGQkYwMDIwQTYyMDAwMDAwQzAwNEQ3ODI0MDQwMDAxQUMKKzoxMEQ2MzAwMDI2MTAwMDAxMkUwMjAwMjAxNDQwRkZGQjAwMDAwMDAwMTUKKzoxMEQ2NDAwMDBDMDA0RDc4MDAwMDIwMjEwQzAwNEQ3ODI0MDQwMDAxQ0UKKzoxMEQ2NTAwMDBDMDA0RDc4MjQwNDAwMDEwQzAwNEQ3ODAwMDAyMDIxQkUKKzoxMEQ2NjAwMDI0MTAwMDEwMDI1MDEwMjQxMDQwMDAwMjAwMDAyMDIxNUQKKzoxMEQ2NzAwMDI0MDQwMDAxMEMwMDRENzgwMDEwODA0MjE2MDBGRkZBQ0YKKzoxMEQ2ODAwMDAyNTAxMDI0MjQxMDAwMTAwMjcwMTAyNDEwNDAwMDAyRDgKKzoxMEQ2OTAwMDAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3ODAwMTA4MDQyN0QKKzoxMEQ2QTAwMDE2MDBGRkZBMDI3MDEwMjQwQzAwNERCOTM0MTA4MDAwRUYKKzoxMEQ2QjAwMDBDMDA0REI5MDAwMDAwMDAwQzAwNEQ1ODAwMDAwMDAwQTcKKzoxMEQ2QzAwMDUwNDAwMDA1MDAxMDgwNDI5NjIyMDAwMDAwNTAxMDI1QjYKKzoxMEQ2RDAwMEE2MjIwMDAwMDAxMDgwNDIxNjAwRkZGNzAwMDAwMDAwQTQKKzoxMEQ2RTAwMDBDMDA0REI5MDAwMDAwMDA4RkJGMDAyMDhGQjMwMDFDNUMKKzoxMEQ2RjAwMDhGQjIwMDE4OEZCMTAwMTQ4RkIwMDAxMDAzRTAwMDA4NDMKKzoxMEQ3MDAwMDI3QkQwMDI4MjdCREZGRDhBRkIxMDAxNDAwODA4ODIxQjUKKzoxMEQ3MTAwMEFGQjIwMDE4MDBBMDkwMjFBRkIzMDAxQzAwQzA5ODIxNDgKKzoxMEQ3MjAwMEFGQjAwMDEwMDAwMDgwMjFBRkJGMDAyMDBDMDA0RDc4OEEKKzoxMEQ3MzAwMDI0MDQwMDAxMjYxMDAwMDEyRTAyMDAyMDE0NDBGRkZCRUIKKzoxMEQ3NDAwMDAwMDAwMDAwMEMwMDRENzgwMDAwMjAyMTBDMDA0RDc4RjYKKzoxMEQ3NTAwMDI0MDQwMDAxMEMwMDRENzgwMDAwMjAyMTBDMDA0RDc4QkQKKzoxMEQ3NjAwMDI0MDQwMDAxMjQxMDAwMTAwMjMwMTAyNDEwNDAwMDAyOTQKKzoxMEQ3NzAwMDAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3ODAwMTA4MDQyOUMKKzoxMEQ3ODAwMDE2MDBGRkZBMDIzMDEwMjQyNDEwMDAxMDAyNTAxMDI0NUEKKzoxMEQ3OTAwMDEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMTBDMDA0RDc4RkMKKzoxMEQ3QTAwMDAwMTA4MDQyMTYwMEZGRkEwMjUwMTAyNDBDMDA0RDc4NDEKKzoxMEQ3QjAwMDI0MDQwMDAxMEMwMDRENzgwMDAwMjAyMTM0MTA4MDAwNkEKKzoxMEQ3QzAwMDk2NjIwMDAwMDA1MDEwMjQxMDQwMDAwMjAwMDAyMDIxNEEKKzoxMEQ3RDAwMDI0MDQwMDAxMEMwMDRENzgwMDEwODA0MjE2MDBGRkY4NzAKKzoxMEQ3RTAwMDAwMDAwMDAwMEMwMDREQjkwMDAwMDAwMDhGQkYwMDIwQjkKKzoxMEQ3RjAwMDhGQjMwMDFDOEZCMjAwMTg4RkIxMDAxNDhGQjAwMDEwQ0YKKzoxMEQ4MDAwMDAzRTAwMDA4MjdCRDAwMjgzQzA0MDAwMThDODQ2REQwOTMKKzoxMEQ4MTAwMDNDMDIwMDAxOEM0MjZFMTgyN0JERkZEOEFGQkYwMDIwMkMKKzoxMEQ4MjAwMEFGQjEwMDFDMTA4MjAwMDNBRkIwMDAxODNDMDEwMDAxMzIKKzoxMEQ4MzAwMEFDMjQ2RTE4M0MwMzAwMDE4QzYzNkY0MDI0MDIwMDA1ODkKKzoxMEQ4NDAwMDE0NjIwMDA1MjQ4M0ZGRkYwQzAwNDk2MzAwMDAwMDAwMDAKKzoxMEQ4NTAwMDEwMDAwMzRDMDAwMDAwMDAyQzYyMDAxMzEwNDAwMzQ5MkMKKzoxMEQ4NjAwMDAwMDMxMDgwM0MwMTAwMDEwMDIyMDgyMThDMjI2QjgwMDMKKzoxMEQ4NzAwMDAwNDAwMDA4MDAwMDAwMDAwQzAwNERCOTAwMDA4MDIxQUQKKzoxMEQ4ODAwMDM0MDI4MDAwQTdBMjAwMTAyN0IxMDAxMDBDMDA0RDc4RDAKKzoxMEQ4OTAwMDI0MDQwMDAxMjYxMDAwMDEyRTAyMDAyMDE0NDBGRkZCOEEKKzoxMEQ4QTAwMDAwMDAwMDAwMEMwMDRENzgwMDAwMjAyMTBDMDA0RDc4OTUKKzoxMEQ4QjAwMDI0MDQwMDAxMEMwMDRENzgwMDAwMjAyMTBDMDA0RDc4NUMKKzoxMEQ4QzAwMDI0MDQwMDAxMjQxMDAwMTAzMjAyMDAwMTEwNDAwMDAyNjQKKzoxMEQ4RDAwMDAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3ODAwMTA4MDQyM0IKKzoxMEQ4RTAwMDE2MDBGRkZBMzIwMjAwMDEyNDEwMDAxMDBDMDA0RDc4REYKKzoxMEQ4RjAwMDAwMDAyMDIxMDAxMDgwNDIxNjAwRkZGQzAwMDAwMDAwMDQKKzoxMEQ5MDAwMDBDMDA0RDc4MjQwNDAwMDEwQzAwNEQ3ODAwMDAyMDIxMEIKKzoxMEQ5MTAwMDM0MTA4MDAwOTYyMjAwMDAwMDUwMTAyNDEwNDAwMDAyQjUKKzoxMEQ5MjAwMDAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3ODAwMTA4MDQyRUEKKzoxMEQ5MzAwMDE2MDBGRkY4MDAwMDAwMDAwQzAwNERCOTAwMDAwMDAwQzgKKzoxMEQ5NDAwMDEwMDAwMzBFMjQwMjAwMDIyN0IxMDAxMEE3QTAwMDEwNEYKKzoxMEQ5NTAwMDAwMDA4MDIxMEMwMDRENzgyNDA0MDAwMTI2MTAwMDAxRjUKKzoxMEQ5NjAwMDJFMDIwMDIwMTQ0MEZGRkIwMDAwMDAwMDBDMDA0RDc4NDgKKzoxMEQ5NzAwMDAwMDAyMDIxMEMwMDRENzgyNDA0MDAwMTBDMDA0RDc4OUIKKzoxMEQ5ODAwMDI0MDQwMDAxMEMwMDRENzgwMDAwMjAyMTI0MTAwMDEwMTgKKzoxMEQ5OTAwMDMyMDIwMDAxMTA0MDAwMDIwMDAwMjAyMTI0MDQwMDAxOTYKKzoxMEQ5QTAwMDBDMDA0RDc4MDAxMDgwNDIxNjAwRkZGQTMyMDIwMDAxOTAKKzoxMEQ5QjAwMDI0MTAwMDEwMEMwMDRENzgwMDAwMjAyMTAwMTA4MDQyM0YKKzoxMEQ5QzAwMDE2MDBGRkZDMDAwMDAwMDAwQzAwNERCOTM0MTA4MDAwNzAKKzoxMEQ5RDAwMDBDMDA0REI5MDAwMDAwMDAwQzAwNEQ1ODAwMDAwMDAwODQKKzoxMEQ5RTAwMDUwNDAwMDA1MDAxMDgwNDI5NjIyMDAwMDAwNTAxMDI1OTMKKzoxMEQ5RjAwMEE2MjIwMDAwMDAxMDgwNDIxNjAwRkZGNzAwMDAwMDAwODEKKzoxMERBMDAwMDBDMDA0REI5MDAwMDAwMDA5N0EyMDAxMDMwNDI4MDAwQzkKKzoxMERBMTAwMDE0NDAwMkRDMjQwMjAwMDMxMDAwMDJEODAwMDAwMDAwQzEKKzoxMERBMjAwMDI0MDIxMjAwQTdBMjAwMTAyN0IxMDAxMDAwMDA4MDIxREMKKzoxMERBMzAwMDBDMDA0RDc4MjQwNDAwMDEyNjEwMDAwMTJFMDIwMDIwNjUKKzoxMERBNDAwMDE0NDBGRkZCMDAwMDAwMDAwQzAwNEQ3ODAwMDAyMDIxNzYKKzoxMERBNTAwMDBDMDA0RDc4MjQwNDAwMDEwQzAwNEQ3ODAwMDAyMDIxQkEKKzoxMERBNjAwMDBDMDA0RDc4MjQwNDAwMDEyNDEwMDAxMDMyMDIwMDAxNDMKKzoxMERBNzAwMDEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMTBDMDA0RDc4MTkKKzoxMERBODAwMDAwMTA4MDQyMTYwMEZGRkEzMjAyMDAwMTI0MTAwMDEwM0MKKzoxMERBOTAwMDBDMDA0RDc4MDAwMDIwMjEwMDEwODA0MjE2MDBGRkZDOTEKKzoxMERBQTAwMDAwMDAwMDAwMEMwMDRENzgyNDA0MDAwMTBDMDA0RDc4QUIKKzoxMERBQjAwMDAwMDAyMDIxMzQxMDgwMDA5NjIyMDAwMDAwNTAxMDI0MjUKKzoxMERBQzAwMDEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMTBDMDA0RDc4QzkKKzoxMERBRDAwMDAwMTA4MDQyMTYwMEZGRjgwMDAwMDAwMDBDMDA0REI5NTUKKzoxMERBRTAwMDAwMDAwMDAwOEY4MzAwNTQxMDAwMDI5NjI0MDIwMDA0RkUKKzoxMERBRjAwMDhGODMwMDU0M0MwMjAwMDE4QzQyNkYzQzI0NjNGRjlDRTYKKzoxMERCMDAwMDAwNDMxMDIzMkM0MjAwNjQxNDQwMDI5RTI0MDIwMDAyQjEKKzoxMERCMTAwMDNDMDMwMDAxOEM2MzZGNDAxMDYyMDI5NzJDNjIwMDAzOEIKKzoxMERCMjAwMDE0NDAwMjk2MjQwMjAwMTEyNDAyMDAwMzEwNjIwMDA1MzIKKzoxMERCMzAwMDI0MDIwMDA0MTA2MjAyOTEyNDAyMDAwRjEwMDAwMjhGRTAKKzoxMERCNDAwMDI0MDIwMDExMTAwMDAyOEQyNDAyMDAwNTI0MDIwMDE0OUEKKzoxMERCNTAwMEE3QTIwMDEwMjdCMTAwMTAwMDAwODAyMTBDMDA0RDc4MTIKKzoxMERCNjAwMDI0MDQwMDAxMjYxMDAwMDEyRTAyMDAyMDE0NDBGRkZCQjcKKzoxMERCNzAwMDAwMDAwMDAwMEMwMDRENzgwMDAwMjAyMTBDMDA0RDc4QzIKKzoxMERCODAwMDI0MDQwMDAxMEMwMDRENzgwMDAwMjAyMTBDMDA0RDc4ODkKKzoxMERCOTAwMDI0MDQwMDAxMjQxMDAwMTAzMjAyMDAwMTEwNDAwMDAyOTEKKzoxMERCQTAwMDAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3ODAwMTA4MDQyNjgKKzoxMERCQjAwMDE2MDBGRkZBMzIwMjAwMDEyNDEwMDAxMDMyMDIwMDEyOTcKKzoxMERCQzAwMDEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMTBDMDA0RDc4QzgKKzoxMERCRDAwMDAwMTA4MDQyMTYwMEZGRkEzMjAyMDAxMjBDMDA0RDc4NEQKKzoxMERCRTAwMDI0MDQwMDAxMEMwMDRENzgwMDAwMjAyMTM0MTA4MDAwMzYKKzoxMERCRjAwMDk2MjIwMDAwMDA1MDEwMjQxMDQwMDAwMjAwMDAyMDIxNTYKKzoxMERDMDAwMDI0MDQwMDAxMEMwMDRENzgwMDEwODA0MjE2MDBGRkY4M0IKKzoxMERDMTAwMDAwMDAwMDAwMEMwMDREQjkwMDAwMDAwMDhGODMwMDU0OEMKKzoxMERDMjAwMDEwMDAwMjQ4MjQwMjAwMDY4RjgzMDA1NDNDMDIwMDAxQzkKKzoxMERDMzAwMDhDNDI2RjNDMjQ2M0ZGOUMwMDQzMTAyMzJDNDIwMDY0MDEKKzoxMERDNDAwMDE0NDAwMjUwMjQwMjAwMDcxMDAwMDI0QzAwMDAwMDAwQTMKKzoxMERDNTAwMDI0MDIwMDA2QTdBMjAwMTAyN0IxMDAxMDAwMDA4MDIxQjYKKzoxMERDNjAwMDBDMDA0RDc4MjQwNDAwMDEyNjEwMDAwMTJFMDIwMDIwMzMKKzoxMERDNzAwMDE0NDBGRkZCMDAwMDAwMDAwQzAwNEQ3ODAwMDAyMDIxNDQKKzoxMERDODAwMDBDMDA0RDc4MjQwNDAwMDEwQzAwNEQ3ODAwMDAyMDIxODgKKzoxMERDOTAwMDBDMDA0RDc4MjQwNDAwMDEyNDEwMDAxMDMyMDIwMDAxMTEKKzoxMERDQTAwMDEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMTBDMDA0RDc4RTcKKzoxMERDQjAwMDAwMTA4MDQyMTYwMEZGRkEzMjAyMDAwMTI0MTAwMDEwMEEKKzoxMERDQzAwMDMyMDIwMDEzMTA0MDAwMDIwMDAwMjAyMTI0MDQwMDAxNTEKKzoxMERDRDAwMDBDMDA0RDc4MDAxMDgwNDIxNjAwRkZGQTMyMDIwMDEzNEIKKzoxMERDRTAwMDBDMDA0RDc4MjQwNDAwMDEwQzAwNEQ3ODAwMDAyMDIxMjgKKzoxMERDRjAwMDM0MTA4MDAwOTYyMjAwMDAwMDUwMTAyNDEwNDAwMDAyRDIKKzoxMEREMDAwMDAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3ODAwMTA4MDQyMDYKKzoxMEREMTAwMDE2MDBGRkY4MDAwMDAwMDAwQzAwNERCOTAwMDAwMDAwRTQKKzoxMEREMjAwMDhGODMwMDU0MTAwMDAyMDcyNDAyMDAwODhGODMwMDU0RTAKKzoxMEREMzAwMDNDMDIwMDAxOEM0MjZGM0MyNDYzRkY5QzAwNDMxMDIzOTMKKzoxMERENDAwMDJDNDIwMDY0MTQ0MDAyMEYyNDAyMDAwOTEwMDAwMjBCNTAKKzoxMERENTAwMDAwMDAwMDAwMjdCMTAwMTBBN0EwMDAxMDAwMDA4MDIxRTMKKzoxMERENjAwMDBDMDA0RDc4MjQwNDAwMDEyNjEwMDAwMTJFMDIwMDIwMzIKKzoxMERENzAwMDE0NDBGRkZCMDAwMDAwMDAwQzAwNEQ3ODAwMDAyMDIxNDMKKzoxMEREODAwMDBDMDA0RDc4MjQwNDAwMDEwQzAwNEQ3ODI0MDQwMDAxOUYKKzoxMEREOTAwMDBDMDA0RDc4MDAwMDIwMjEyNDEwMDAxMDMyMDIwMDAxRjgKKzoxMEREQTAwMDEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMTBDMDA0RDc4RTYKKzoxMEREQjAwMDAwMTA4MDQyMTYwMEZGRkEzMjAyMDAwMTI0MTAwMDEwMDkKKzoxMEREQzAwMDMyMDIwMDE4MTA0MDAwMDIwMDAwMjAyMTI0MDQwMDAxNEIKKzoxMERERDAwMDBDMDA0RDc4MDAxMDgwNDIxNjAwRkZGQTMyMDIwMDE4NDUKKzoxMERERTAwMDBDMDA0REI5MzQxMDgwMDAwQzAwNERCOTAwMDAwMDAwNEIKKzoxMERERjAwMDBDMDA0RDU4MDAwMDAwMDA1MDQwMDAwNTAwMTA4MDQyMEIKKzoxMERFMDAwMDk2MjIwMDAwMDA1MDEwMjVBNjIyMDAwMDAwMTA4MDQyM0IKKzoxMERFMTAwMDE2MDBGRkY3MDAwMDAwMDAwQzAwNERCOTAwMDA4MDIxNDMKKzoxMERFMjAwMDk3QTIwMDEwMjdCMTAwMTAzNDQyMDAwMUE3QTIwMDEwRjEKKzoxMERFMzAwMDBDMDA0RDc4MjQwNDAwMDEyNjEwMDAwMTJFMDIwMDIwNjEKKzoxMERFNDAwMDE0NDBGRkZCMDAwMDAwMDAwQzAwNEQ3ODAwMDAyMDIxNzIKKzoxMERFNTAwMDBDMDA0RDc4MjQwNDAwMDEwQzAwNEQ3ODAwMDAyMDIxQjYKKzoxMERFNjAwMDBDMDA0RDc4MjQwNDAwMDEyNDEwMDAxMDMyMDIwMDAxM0YKKzoxMERFNzAwMDEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMTBDMDA0RDc4MTUKKzoxMERFODAwMDAwMTA4MDQyMTYwMEZGRkEzMjAyMDAwMTI0MTAwMDEwMzgKKzoxMERFOTAwMDMyMDIwMDE4MTA0MDAwMDIwMDAwMjAyMTI0MDQwMDAxN0EKKzoxMERFQTAwMDBDMDA0RDc4MDAxMDgwNDIxNjAwRkZGQTMyMDIwMDE4NzQKKzoxMERFQjAwMDBDMDA0RDc4MjQwNDAwMDEwQzAwNEQ3ODAwMDAyMDIxNTYKKzoxMERFQzAwMDM0MTA4MDAwOTYyMjAwMDAwMDUwMTAyNDEwNDAwMDAyMDAKKzoxMERFRDAwMDAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3ODAwMTA4MDQyMzUKKzoxMERFRTAwMDE2MDBGRkY4MDAwMDAwMDAwQzAwNERCOTAwMDAwMDAwMTMKKzoxMERFRjAwMDhGODMwMDU0MTAwMDAxOTMyNDAyMDAwQThGODMwMDU0ODIKKzoxMERGMDAwMDNDMDIwMDAxOEM0MjZGM0MyNDYzRkY5QzAwNDMxMDIzQzEKKzoxMERGMTAwMDJDNDIwMDY0MTQ0MDAxOUIyNDAyMDAwQjEwMDAwMTk3NjYKKzoxMERGMjAwMDAwMDAwMDAwMjdCMTAwMTBBN0EwMDAxMDAwMDA4MDIxMTEKKzoxMERGMzAwMDBDMDA0RDc4MjQwNDAwMDEyNjEwMDAwMTJFMDIwMDIwNjAKKzoxMERGNDAwMDE0NDBGRkZCMDAwMDAwMDAwQzAwNEQ3ODAwMDAyMDIxNzEKKzoxMERGNTAwMDBDMDA0RDc4MjQwNDAwMDEwQzAwNEQ3ODI0MDQwMDAxQ0QKKzoxMERGNjAwMDBDMDA0RDc4MDAwMDIwMjEyNDEwMDAxMDMyMDIwMDAxMjYKKzoxMERGNzAwMDEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMTBDMDA0RDc4MTQKKzoxMERGODAwMDAwMTA4MDQyMTYwMEZGRkEzMjAyMDAwMTI0MTAwMDEwMzcKKzoxMERGOTAwMDMyMDIwMDE3MTA0MDAwMDIwMDAwMjAyMTI0MDQwMDAxN0EKKzoxMERGQTAwMDBDMDA0RDc4MDAxMDgwNDIxNjAwRkZGQTMyMDIwMDE3NzQKKzoxMERGQjAwMDBDMDA0REI5MzQxMDgwMDAwQzAwNERCOTAwMDAwMDAwNzkKKzoxMERGQzAwMDBDMDA0RDU4MDAwMDAwMDA1MDQwMDAwNTAwMTA4MDQyMzkKKzoxMERGRDAwMDk2MjIwMDAwMDA1MDEwMjVBNjIyMDAwMDAwMTA4MDQyNkEKKzoxMERGRTAwMDE2MDBGRkY3MDAwMDAwMDAwQzAwNERCOTAwMDA4MDIxNzIKKzoxMERGRjAwMDk3QTIwMDEwMjdCMTAwMTAzNDQyMDcwMEE3QTIwMDEwMUEKKzoxMEUwMDAwMDBDMDA0RDc4MjQwNDAwMDEyNjEwMDAwMTJFMDIwMDIwOEYKKzoxMEUwMTAwMDE0NDBGRkZCMDAwMDAwMDAwQzAwNEQ3ODAwMDAyMDIxQTAKKzoxMEUwMjAwMDBDMDA0RDc4MjQwNDAwMDEwQzAwNEQ3ODAwMDAyMDIxRTQKKzoxMEUwMzAwMDBDMDA0RDc4MjQwNDAwMDEyNDEwMDAxMDMyMDIwMDAxNkQKKzoxMEUwNDAwMDEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMTBDMDA0RDc4NDMKKzoxMEUwNTAwMDAwMTA4MDQyMTYwMEZGRkEzMjAyMDAwMTI0MTAwMDEwNjYKKzoxMEUwNjAwMDMyMDIwMDE3MTA0MDAwMDIwMDAwMjAyMTI0MDQwMDAxQTkKKzoxMEUwNzAwMDBDMDA0RDc4MDAxMDgwNDIxNjAwRkZGQTMyMDIwMDE3QTMKKzoxMEUwODAwMDBDMDA0RDc4MjQwNDAwMDEwQzAwNEQ3ODAwMDAyMDIxODQKKzoxMEUwOTAwMDM0MTA4MDAwOTYyMjAwMDAwMDUwMTAyNDEwNDAwMDAyMkUKKzoxMEUwQTAwMDAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3ODAwMTA4MDQyNjMKKzoxMEUwQjAwMDE2MDBGRkY4MDAwMDAwMDAwQzAwNERCOTAwMDAwMDAwNDEKKzoxMEUwQzAwMDhGODMwMDU0MTAwMDAxMUYyNDAyMDAwQzhGODMwMDU0MjIKKzoxMEUwRDAwMDNDMDIwMDAxOEM0MjZGM0MyNDYzRkY5QzAwNDMxMDIzRjAKKzoxMEUwRTAwMDJDNDIwMDY0MTQ0MDAxMjcyNDAyMDAxMjEwMDAwMTIzNzYKKzoxMEUwRjAwMDAwMDAwMDAwMjdCMTAwMTBBN0EwMDAxMDAwMDA4MDIxNDAKKzoxMEUxMDAwMDBDMDA0RDc4MjQwNDAwMDEyNjEwMDAwMTJFMDIwMDIwOEUKKzoxMEUxMTAwMDE0NDBGRkZCMDAwMDAwMDAwQzAwNEQ3ODAwMDAyMDIxOUYKKzoxMEUxMjAwMDBDMDA0RDc4MjQwNDAwMDEwQzAwNEQ3ODI0MDQwMDAxRkIKKzoxMEUxMzAwMDBDMDA0RDc4MDAwMDIwMjEyNDEwMDAxMDMyMDIwMDAxNTQKKzoxMEUxNDAwMDEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMTBDMDA0RDc4NDIKKzoxMEUxNTAwMDAwMTA4MDQyMTYwMEZGRkEzMjAyMDAwMTI0MTAwMDEwNjUKKzoxMEUxNjAwMDMyMDIwMDE0MTA0MDAwMDIwMDAwMjAyMTI0MDQwMDAxQUIKKzoxMEUxNzAwMDBDMDA0RDc4MDAxMDgwNDIxNjAwRkZGQTMyMDIwMDE0QTUKKzoxMEUxODAwMDBDMDA0REI5MzQxMDgwMDAwQzAwNERCOTAwMDAwMDAwQTcKKzoxMEUxOTAwMDBDMDA0RDU4MDAwMDAwMDA1MDQwMDAwNTAwMTA4MDQyNjcKKzoxMEUxQTAwMDk2MjIwMDAwMDA1MDEwMjVBNjIyMDAwMDAwMTA4MDQyOTgKKzoxMEUxQjAwMDE2MDBGRkY3MDAwMDAwMDAwQzAwNERCOTAwMDA4MDIxQTAKKzoxMEUxQzAwMDk3QTIwMDEwMjdCMTAwMTAzNDQyMDAxMEE3QTIwMDEwM0YKKzoxMEUxRDAwMDBDMDA0RDc4MjQwNDAwMDEyNjEwMDAwMTJFMDIwMDIwQkUKKzoxMEUxRTAwMDE0NDBGRkZCMDAwMDAwMDAwQzAwNEQ3ODAwMDAyMDIxQ0YKKzoxMEUxRjAwMDBDMDA0RDc4MjQwNDAwMDEwQzAwNEQ3ODAwMDAyMDIxMTMKKzoxMEUyMDAwMDBDMDA0RDc4MjQwNDAwMDEyNDEwMDAxMDMyMDIwMDAxOUIKKzoxMEUyMTAwMDEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMTBDMDA0RDc4NzEKKzoxMEUyMjAwMDAwMTA4MDQyMTYwMEZGRkEzMjAyMDAwMTI0MTAwMDEwOTQKKzoxMEUyMzAwMDMyMDIwMDE0MTA0MDAwMDIwMDAwMjAyMTI0MDQwMDAxREEKKzoxMEUyNDAwMDBDMDA0RDc4MDAxMDgwNDIxNjAwRkZGQTMyMDIwMDE0RDQKKzoxMEUyNTAwMDBDMDA0RDc4MjQwNDAwMDEwQzAwNEQ3ODAwMDAyMDIxQjIKKzoxMEUyNjAwMDM0MTA4MDAwOTYyMjAwMDAwMDUwMTAyNDEwNDAwMDAyNUMKKzoxMEUyNzAwMDAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3ODAwMTA4MDQyOTEKKzoxMEUyODAwMDE2MDBGRkY4MDAwMDAwMDAwQzAwNERCOTAwMDAwMDAwNkYKKzoxMEUyOTAwMDhGODMwMDU0MTAwMDAwQUIyNDAyMDAxMzhGODMwMDU0QkUKKzoxMEUyQTAwMDNDMDIwMDAxOEM0MjZGM0MyNDYzRkY5QzAwNDMxMDIzMUUKKzoxMEUyQjAwMDJDNDIwMDY0MTQ0MDAwQjMyNDAyMDAwRDEwMDAwMEFGOTMKKzoxMEUyQzAwMDAwMDAwMDAwMjdCMTAwMTBBN0EwMDAxMDAwMDA4MDIxNkUKKzoxMEUyRDAwMDBDMDA0RDc4MjQwNDAwMDEyNjEwMDAwMTJFMDIwMDIwQkQKKzoxMEUyRTAwMDE0NDBGRkZCMDAwMDAwMDAwQzAwNEQ3ODAwMDAyMDIxQ0UKKzoxMEUyRjAwMDBDMDA0RDc4MjQwNDAwMDEwQzAwNEQ3ODI0MDQwMDAxMkEKKzoxMEUzMDAwMDBDMDA0RDc4MDAwMDIwMjEyNDEwMDAxMDMyMDIwMDAxODIKKzoxMEUzMTAwMDEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMTBDMDA0RDc4NzAKKzoxMEUzMjAwMDAwMTA4MDQyMTYwMEZGRkEzMjAyMDAwMTI0MTAwMDEwOTMKKzoxMEUzMzAwMDMyMDIwMDE4MTA0MDAwMDIwMDAwMjAyMTI0MDQwMDAxRDUKKzoxMEUzNDAwMDBDMDA0RDc4MDAxMDgwNDIxNjAwRkZGQTMyMDIwMDE4Q0YKKzoxMEUzNTAwMDBDMDA0REI5MzQxMDgwMDAwQzAwNERCOTAwMDAwMDAwRDUKKzoxMEUzNjAwMDBDMDA0RDU4MDAwMDAwMDA1MDQwMDAwNTAwMTA4MDQyOTUKKzoxMEUzNzAwMDk2MjIwMDAwMDA1MDEwMjVBNjIyMDAwMDAwMTA4MDQyQzYKKzoxMEUzODAwMDE2MDBGRkY3MDAwMDAwMDAwQzAwNERCOTAwMDA4MDIxQ0UKKzoxMEUzOTAwMDk3QTIwMDEwMjdCMTAwMTAzMDQyRkZGRUE3QTIwMDEwODQKKzoxMEUzQTAwMDBDMDA0RDc4MjQwNDAwMDEyNjEwMDAwMTJFMDIwMDIwRUMKKzoxMEUzQjAwMDE0NDBGRkZCMDAwMDAwMDAwQzAwNEQ3ODAwMDAyMDIxRkQKKzoxMEUzQzAwMDBDMDA0RDc4MjQwNDAwMDEwQzAwNEQ3ODAwMDAyMDIxNDEKKzoxMEUzRDAwMDBDMDA0RDc4MjQwNDAwMDEyNDEwMDAxMDMyMDIwMDAxQ0EKKzoxMEUzRTAwMDEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMTBDMDA0RDc4QTAKKzoxMEUzRjAwMDAwMTA4MDQyMTYwMEZGRkEzMjAyMDAwMTI0MTAwMDEwQzMKKzoxMEU0MDAwMDMyMDIwMDE4MTA0MDAwMDIwMDAwMjAyMTI0MDQwMDAxMDQKKzoxMEU0MTAwMDBDMDA0RDc4MDAxMDgwNDIxNjAwRkZGQTMyMDIwMDE4RkUKKzoxMEU0MjAwMDBDMDA0RDc4MjQwNDAwMDEwQzAwNEQ3ODAwMDAyMDIxRTAKKzoxMEU0MzAwMDM0MTA4MDAwOTYyMjAwMDAwMDUwMTAyNDEwNDAwMDAyOEEKKzoxMEU0NDAwMDAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3ODAwMTA4MDQyQkYKKzoxMEU0NTAwMDE2MDBGRkY4MDAwMDAwMDAwQzAwNERCOTAwMDAwMDAwOUQKKzoxMEU0NjAwMDhGODMwMDU0MTAwMDAwMzcyNDAyMDAwRTI0MDIwODQwNUQKKzoxMEU0NzAwMEE3QTIwMDEwMjdCMTAwMTAwMDAwODAyMTBDMDA0RDc4RTkKKzoxMEU0ODAwMDI0MDQwMDAxMjYxMDAwMDEyRTAyMDAyMDE0NDBGRkZCOEUKKzoxMEU0OTAwMDAwMDAwMDAwMEMwMDRENzgwMDAwMjAyMTBDMDA0RDc4OTkKKzoxMEU0QTAwMDI0MDQwMDAxMEMwMDRENzgwMDAwMjAyMTBDMDA0RDc4NjAKKzoxMEU0QjAwMDI0MDQwMDAxMjQxMDAwMTAzMjAyMDAwMTEwNDAwMDAyNjgKKzoxMEU0QzAwMDAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3ODAwMTA4MDQyM0YKKzoxMEU0RDAwMDE2MDBGRkZBMzIwMjAwMDEyNDEwMDAxMDMyMDIwMDEzNkQKKzoxMEU0RTAwMDEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMTBDMDA0RDc4OUYKKzoxMEU0RjAwMDAwMTA4MDQyMTYwMEZGRkEzMjAyMDAxMzBDMDA0RDc4MjMKKzoxMEU1MDAwMDI0MDQwMDAxMEMwMDRENzgwMDAwMjAyMTM0MTA4MDAwMEMKKzoxMEU1MTAwMDk2MjIwMDAwMDA1MDEwMjQxMDQwMDAwMjAwMDAyMDIxMkMKKzoxMEU1MjAwMDI0MDQwMDAxMEMwMDRENzgwMDEwODA0MjE2MDBGRkY4MTIKKzoxMEU1MzAwMDAwMDAwMDAwMEMwMDREQjkwMDAwMDAwMDhGODMwMDU0NjMKKzoxMEU1NDAwMDI0MDIwMDEwM0MwMTAwMDFBQzIyNkREMDNDMDEwMDAxMEUKKzoxMEU1NTAwMDEwMDAwMDBDQUMyMzZGM0M4RjgzMDA1NDNDMDIwMDAxODAKKzoxMEU1NjAwMDhDNDI2RjNDMjQ2M0ZGOUMwMDQzMTAyMzJDNDIwMDY0QzgKKzoxMEU1NzAwMDE0NDAwMDA0MDAwMDAwMDAyNDAyMDAxMTNDMDEwMDAxQ0UKKzoxMEU1ODAwMEFDMjI2REQwOEZCRjAwMjA4RkIxMDAxQzhGQjAwMDE4NUYKKzoxMEU1OTAwMDAzRTAwMDA4MjdCRDAwMjgzQzAzMDAwMThDNjM2RDk4NTAKKzoxMEU1QTAwMDI3QkRGRkM4MjQwMjAwMDJBRkJGMDAzNEFGQjIwMDMwNjUKKzoxMEU1QjAwMEFGQjEwMDJDMTQ2MjAwMDRBRkIwMDAyODNDMTIwMDAyN0UKKzoxMEU1QzAwMDEwMDAwMDAzOEU1MjhGRjgzQzEyMDAwMjhFNTI4RkZDMTYKKzoxMEU1RDAwMDNDMDMwMDAxOEM2MzZERDQzQzAyMDAwMThDNDI2RTFDMzQKKzoxMEU1RTAwMDUwNjIwMDA0MjQ2M0ZGRkYzQzAxMDAwMUFDMjM2RTFDNTkKKzoxMEU1RjAwMDI0NjNGRkZGMkM2MjAwMDYxMDQwMDM3NzAwMDMxMDgwQTUKKzoxMEU2MDAwMDNDMDEwMDAxMDAyMjA4MjE4QzIyNkJEODAwNDAwMDA4NDgKKzoxMEU2MTAwMDAwMDAwMDAwMDAwMDIwMjEwMDAwMjgyMTBDMDA0RERCM0MKKzoxMEU2MjAwMDM0MDY4MDAwMjQwNDAwMTAyNDA1MDAwMjI0MDYwMDAyQTEKKzoxMEU2MzAwMDI0MDIwMDAyMEMwMDREREJBN0EyMDAxODI0MDIwMDAyRjUKKzoxMEU2NDAwMDNDMDEwMDAxMTAwMDAzNjRBQzIyNkRENDI3QjEwMDE4MTYKKzoxMEU2NTAwMEE3QTAwMDE4MDAwMDgwMjEwQzAwNEQ3ODI0MDQwMDAxQzAKKzoxMEU2NjAwMDI2MTAwMDAxMkUwMjAwMjAxNDQwRkZGQjAwMDAwMDAwRDUKKzoxMEU2NzAwMDBDMDA0RDc4MDAwMDIwMjEwQzAwNEQ3ODI0MDQwMDAxOEUKKzoxMEU2ODAwMDBDMDA0RDc4MjQwNDAwMDEwQzAwNEQ3ODAwMDAyMDIxN0UKKzoxMEU2OTAwMDI0MTAwMDEwMzIwMjAwMDExMDQwMDAwMjAwMDAyMDIxNkUKKzoxMEU2QTAwMDI0MDQwMDAxMEMwMDRENzgwMDEwODA0MjE2MDBGRkZBOEYKKzoxMEU2QjAwMDMyMDIwMDAxMjQxMDAwMTAwQzAwNEQ3ODAwMDAyMDIxQ0YKKzoxMEU2QzAwMDAwMTA4MDQyMTYwMEZGRkMwMDAwMDAwMDBDMDA0REI5NTUKKzoxMEU2RDAwMDM0MTA4MDAwMEMwMDREQjkwMDAwMDAwMDBDMDA0RDU4QjMKKzoxMEU2RTAwMDAwMDAwMDAwNTA0MDAwMDUwMDEwODA0Mjk2MjIwMDAwMEIKKzoxMEU2RjAwMDAwNTAxMDI1QTYyMjAwMDAwMDEwODA0MjE2MDBGRkY3RUYKKzoxMEU3MDAwMDAwMDAwMDAwMEMwMDREQjkwMDAwMDAwMDk3QTIwMDE4QTYKKzoxMEU3MTAwMDMwNDI4MDAwMTQ0MDAwMDQyNDAyMDAwMzNDMDEwMDAxNDgKKzoxMEU3MjAwMEFDMjI2REQ0MjQwMjAwMDMzQzAxMDAwMTEwMDAwMzJBMzYKKzoxMEU3MzAwMEFDMjI2REQ0MjQwNDAwMTAyNDA1MDAwMjI0MDYwMDAyM0IKKzoxMEU3NDAwMDI0MDIwMDAyMEMwMDREREJBN0EyMDAxODNDMDMwMDAxQ0MKKzoxMEU3NTAwMDhDNjM2RTIwMjQwMjAwMDExNDYyMDFFMTAwMDA4MDIxMUMKKzoxMEU3NjAwMDI3QjEwMDE4QTdBMDAwMTgwQzAwNEQ3ODI0MDQwMDAxNjAKKzoxMEU3NzAwMDI2MTAwMDAxMkUwMjAwMjAxNDQwRkZGQjAwMDAwMDAwQzQKKzoxMEU3ODAwMDBDMDA0RDc4MDAwMDIwMjEwQzAwNEQ3ODI0MDQwMDAxN0QKKzoxMEU3OTAwMDBDMDA0RDc4MjQwNDAwMDEwQzAwNEQ3ODAwMDAyMDIxNkQKKzoxMEU3QTAwMDI0MTAwMDEwMzIwMjAwMDExMDQwMDAwMjAwMDAyMDIxNUQKKzoxMEU3QjAwMDI0MDQwMDAxMEMwMDRENzgwMDEwODA0MjE2MDBGRkZBN0UKKzoxMEU3QzAwMDMyMDIwMDAxMjQxMDAwMTAzMjAyMDAxODEwNDAwMDAyMzIKKzoxMEU3RDAwMDAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3ODAwMTA4MDQyMkMKKzoxMEU3RTAwMDE2MDBGRkZBMzIwMjAwMTgwQzAwNERCOTM0MTA4MDAwRjgKKzoxMEU3RjAwMDBDMDA0REI5MDAwMDAwMDAwQzAwNEQ1ODAwMDAwMDAwNTYKKzoxMEU4MDAwMDUwNDAwMDA1MDAxMDgwNDI5NjIyMDAwMDAwNTAxMDI1NjQKKzoxMEU4MTAwMEE2MjIwMDAwMDAxMDgwNDIxNjAwRkZGNzAwMDAwMDAwNTIKKzoxMEU4MjAwMDBDMDA0REI5MDAwMDgwMjEyN0IxMDAxOEE3QTAwMDE4RTYKKzoxMEU4MzAwMDBDMDA0RDc4MjQwNDAwMDEyNjEwMDAwMTJFMDIwMDIwNTcKKzoxMEU4NDAwMDE0NDBGRkZCMDAwMDAwMDAwQzAwNEQ3ODAwMDAyMDIxNjgKKzoxMEU4NTAwMDBDMDA0RDc4MjQwNDAwMDEwQzAwNEQ3ODI0MDQwMDAxQzQKKzoxMEU4NjAwMDBDMDA0RDc4MDAwMDIwMjEyNDEwMDAxMDMyMDIwMDAxMUQKKzoxMEU4NzAwMDEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMTBDMDA0RDc4MEIKKzoxMEU4ODAwMDAwMTA4MDQyMTYwMEZGRkEzMjAyMDAwMTI0MTAwMDEwMkUKKzoxMEU4OTAwMDMyMDIwMDE4MTA0MDAwMDIwMDAwMjAyMTI0MDQwMDAxNzAKKzoxMEU4QTAwMDBDMDA0RDc4MDAxMDgwNDIxNjAwRkZGQTMyMDIwMDE4NkEKKzoxMEU4QjAwMDBDMDA0REI5MzQxMDgwMDAwQzAwNERCOTAwMDAwMDAwNzAKKzoxMEU4QzAwMDBDMDA0RDU4MDAwMDAwMDA1MDQwMDAwNTAwMTA4MDQyMzAKKzoxMEU4RDAwMDk2MjIwMDAwMDA1MDEwMjVBNjIyMDAwMDAwMTA4MDQyNjEKKzoxMEU4RTAwMDE2MDBGRkY3MDAwMDAwMDAwQzAwNERCOTAwMDA4MDIxNjkKKzoxMEU4RjAwMDI0MDQwMDE4MDAwMDI4MjEwQzAwNEREQjI0MDYwNDA0MjkKKzoxMEU5MDAwMEE3QTAwMDFBMEMwMDRENzgyNDA0MDAwMTI2MTAwMDAxNzUKKzoxMEU5MTAwMDJFMDIwMDIwMTQ0MEZGRkIwMDAwMDAwMDBDMDA0RDc4ODgKKzoxMEU5MjAwMDAwMDAyMDIxMEMwMDRENzgyNDA0MDAwMTBDMDA0RDc4REIKKzoxMEU5MzAwMDI0MDQwMDAxMEMwMDRENzgwMDAwMjAyMTI0MTAwMDEwNTgKKzoxMEU5NDAwMDMyMDIwMDAxMTA0MDAwMDIwMDAwMjAyMTI0MDQwMDAxRDYKKzoxMEU5NTAwMDBDMDA0RDc4MDAxMDgwNDIxNjAwRkZGQTMyMDIwMDAxRDAKKzoxMEU5NjAwMDI0MTAwMDEwMzIwMjAwMTgxMDQwMDAwMjAwMDAyMDIxODQKKzoxMEU5NzAwMDI0MDQwMDAxMEMwMDRENzgwMDEwODA0MjE2MDBGRkZBQkMKKzoxMEU5ODAwMDMyMDIwMDE4MEMwMDREQjkzNDEwODAwMDBDMDA0REI5NTMKKzoxMEU5OTAwMDAwMDAwMDAwMEMwMDRENTgwMDAwMDAwMDUwNDAwMDA1MzEKKzoxMEU5QTAwMDAwMTA4MDQyOTdBMjAwMUEwMDUwMTAyNUE3QTIwMDFBNUEKKzoxMEU5QjAwMDAwMTA4MDQyMTYwMEZGRjcwMDAwMDAwMDBDMDA0REI5NjcKKzoxMEU5QzAwMDAwMDA4MDIxQTdBMDAwMUEwQzAwNEQ3ODI0MDQwMDAxNEIKKzoxMEU5RDAwMDI2MTAwMDAxMkUwMjAwMjAxNDQwRkZGQjAwMDAwMDAwNjIKKzoxMEU5RTAwMDBDMDA0RDc4MDAwMDIwMjEwQzAwNEQ3ODI0MDQwMDAxMUIKKzoxMEU5RjAwMDBDMDA0RDc4MjQwNDAwMDEwQzAwNEQ3ODAwMDAyMDIxMEIKKzoxMEVBMDAwMDI0MTAwMDEwMzIwMjAwMDExMDQwMDAwMjAwMDAyMDIxRkEKKzoxMEVBMTAwMDI0MDQwMDAxMEMwMDRENzgwMDEwODA0MjE2MDBGRkZBMUIKKzoxMEVBMjAwMDMyMDIwMDAxMjQxMDAwMTAzMjAyMDAxODEwNDAwMDAyQ0YKKzoxMEVBMzAwMDAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3ODAwMTA4MDQyQzkKKzoxMEVBNDAwMDE2MDBGRkZBMzIwMjAwMTgwQzAwNERCOTM0MTA4MDAwOTUKKzoxMEVBNTAwMDBDMDA0REI5MDAwMDAwMDAwQzAwNEQ1ODAwMDAwMDAwRjMKKzoxMEVBNjAwMDUwNDAwMDA1MDAxMDgwNDI5N0EyMDAxQTAwNTAxMDI1NjcKKzoxMEVBNzAwMEE3QTIwMDFBMDAxMDgwNDIxNjAwRkZGNzAwMDAwMDAwNTUKKzoxMEVBODAwMDBDMDA0REI5MDAwMDgwMjFBN0EwMDAxQzBDMDA0RDc4OUYKKzoxMEVBOTAwMDI0MDQwMDAxMjYxMDAwMDEyRTAyMDAyMDE0NDBGRkZCNzgKKzoxMEVBQTAwMDAwMDAwMDAwMEMwMDRENzgwMDAwMjAyMTBDMDA0RDc4ODMKKzoxMEVBQjAwMDI0MDQwMDAxMEMwMDRENzgyNDA0MDAwMTBDMDA0RDc4NjIKKzoxMEVBQzAwMDAwMDAyMDIxMjQxMDAwMTAwQzAwNEQ3ODAwMDAyMDIxQUYKKzoxMEVBRDAwMDAwMTA4MDQyMTYwMEZGRkMwMDAwMDAwMDI0MTAwMDEwMEYKKzoxMEVBRTAwMDMyMDIwMDFFMTA0MDAwMDIwMDAwMjAyMTI0MDQwMDAxMTgKKzoxMEVBRjAwMDBDMDA0RDc4MDAxMDgwNDIxNjAwRkZGQTMyMDIwMDFFMTIKKzoxMEVCMDAwMDBDMDA0REI5MzQxMDgwMDAwQzAwNERCOTAwMDAwMDAwMUQKKzoxMEVCMTAwMDBDMDA0RDU4MDAwMDAwMDA1MDQwMDAwNTAwMTA4MDQyREQKKzoxMEVCMjAwMDk3QTIwMDFDMDA1MDEwMjVBN0EyMDAxQzAwMTA4MDQyRDQKKzoxMEVCMzAwMDE2MDBGRkY3MDAwMDAwMDAwQzAwNERCOTAwMDA4MDIxMTYKKzoxMEVCNDAwMEE3QTAwMDFDMEMwMDRENzgyNDA0MDAwMTI2MTAwMDAxMzEKKzoxMEVCNTAwMDJFMDIwMDIwMTQ0MEZGRkIwMDAwMDAwMDBDMDA0RDc4NDYKKzoxMEVCNjAwMDAwMDAyMDIxMEMwMDRENzgyNDA0MDAwMTBDMDA0RDc4OTkKKzoxMEVCNzAwMDI0MDQwMDAxMEMwMDRENzgwMDAwMjAyMTI0MTAwMDEwMTYKKzoxMEVCODAwMDBDMDA0RDc4MDAwMDIwMjEwMDEwODA0MjE2MDBGRkZDOTAKKzoxMEVCOTAwMDAwMDAwMDAwMjQxMDAwMTAzMjAyMDAxRTEwNDAwMDAyOEQKKzoxMEVCQTAwMDAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3ODAwMTA4MDQyNTgKKzoxMEVCQjAwMDE2MDBGRkZBMzIwMjAwMUUwQzAwNERCOTM0MTA4MDAwMUUKKzoxMEVCQzAwMDBDMDA0REI5MDAwMDAwMDAwQzAwNEQ1ODAwMDAwMDAwODIKKzoxMEVCRDAwMDUwNDAwMDA1MDAxMDgwNDI5N0EyMDAxQzAwNTAxMDI1RjQKKzoxMEVCRTAwMEE3QTIwMDFDMDAxMDgwNDIxNjAwRkZGNzAwMDAwMDAwRTIKKzoxMEVCRjAwMDBDMDA0REI5MDAwMDgwMjEyNDAyMDAwMkE3QTIwMDFFRDMKKzoxMEVDMDAwMDBDMDA0RDc4MjQwNDAwMDEyNjEwMDAwMTJFMDIwMDIwODMKKzoxMEVDMTAwMDE0NDBGRkZCMDAwMDAwMDAwQzAwNEQ3ODAwMDAyMDIxOTQKKzoxMEVDMjAwMDBDMDA0RDc4MjQwNDAwMDEwQzAwNEQ3ODAwMDAyMDIxRDgKKzoxMEVDMzAwMDBDMDA0RDc4MjQwNDAwMDEyNDEwMDAxMDBDMDA0RDc4QzUKKzoxMEVDNDAwMDAwMDAyMDIxMDAxMDgwNDIxNjAwRkZGQzAwMDAwMDAwQTAKKzoxMEVDNTAwMDI0MTAwMDEwMzIwMjAwMUUxMDQwMDAwMjAwMDAyMDIxOEIKKzoxMEVDNjAwMDI0MDQwMDAxMEMwMDRENzgwMDEwODA0MjE2MDBGRkZBQzkKKzoxMEVDNzAwMDMyMDIwMDFFMEMwMDRENzgyNDA0MDAwMTBDMDA0RDc4NzcKKzoxMEVDODAwMDAwMDAyMDIxMzQxMDgwMDA5N0EyMDAxRTAwNTAxMDI0QTQKKzoxMEVDOTAwMDEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMTBDMDA0RDc4RTcKKzoxMEVDQTAwMDAwMTA4MDQyMTYwMEZGRjgwMDAwMDAwMDBDMDA0REI5NzMKKzoxMEVDQjAwMDAwMDA4MDIxQTdBMDAwMjAwQzAwNEQ3ODI0MDQwMDAxNTIKKzoxMEVDQzAwMDI2MTAwMDAxMkUwMjAwMjAxNDQwRkZGQjAwMDAwMDAwNkYKKzoxMEVDRDAwMDBDMDA0RDc4MDAwMDIwMjEwQzAwNEQ3ODI0MDQwMDAxMjgKKzoxMEVDRTAwMDBDMDA0RDc4MjQwNDAwMDEwQzAwNEQ3ODAwMDAyMDIxMTgKKzoxMEVDRjAwMDI0MTAwMDEwMEMwMDRENzgwMDAwMjAyMTAwMTA4MDQyRUMKKzoxMEVEMDAwMDE2MDBGRkZDMDAwMDAwMDAyNDEwMDAxMDMyMDIwMDFFNUMKKzoxMEVEMTAwMDEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMTBDMDA0RDc4NjYKKzoxMEVEMjAwMDAwMTA4MDQyMTYwMEZGRkEzMjAyMDAxRTBDMDA0REI5OUUKKzoxMEVEMzAwMDM0MTA4MDAwMEMwMDREQjkwMDAwMDAwMDBDMDA0RDU4NEMKKzoxMEVENDAwMDAwMDAwMDAwNTA0MDAwMDUwMDEwODA0Mjk3QTIwMDIwMDMKKzoxMEVENTAwMDAwNTAxMDI1QTdBMjAwMjAwMDEwODA0MjE2MDBGRkY3RTcKKzoxMEVENjAwMDAwMDAwMDAwMEMwMDREQjkwMDAwODAyMUE3QTAwMDIwODkKKzoxMEVENzAwMDBDMDA0RDc4MjQwNDAwMDEyNjEwMDAwMTJFMDIwMDIwMTIKKzoxMEVEODAwMDE0NDBGRkZCMDAwMDAwMDAwQzAwNEQ3ODAwMDAyMDIxMjMKKzoxMEVEOTAwMDBDMDA0RDc4MjQwNDAwMDEwQzAwNEQ3ODI0MDQwMDAxN0YKKzoxMEVEQTAwMDBDMDA0RDc4MDAwMDIwMjEyNDEwMDAxMDBDMDA0RDc4M0MKKzoxMEVEQjAwMDAwMDAyMDIxMDAxMDgwNDIxNjAwRkZGQzAwMDAwMDAwMkYKKzoxMEVEQzAwMDI0MTAwMDEwMzIwMjAwMUUxMDQwMDAwMjAwMDAyMDIxMUEKKzoxMEVERDAwMDI0MDQwMDAxMEMwMDRENzgwMDEwODA0MjE2MDBGRkZBNTgKKzoxMEVERTAwMDMyMDIwMDFFMEMwMDREQjkzNDEwODAwMDBDMDA0REI5RTkKKzoxMEVERjAwMDAwMDAwMDAwMEMwMDRENTgwMDAwMDAwMDUwNDAwMDA1Q0QKKzoxMEVFMDAwMDAwMTA4MDQyOTdBMjAwMjAwMDUwMTAyNUE3QTIwMDIwRTkKKzoxMEVFMTAwMDAwMTA4MDQyMTYwMEZGRjcwMDAwMDAwMDBDMDA0REI5MDIKKzoxMEVFMjAwMDAwMDA4MDIxQTdBMDAwMjIwQzAwNEQ3ODI0MDQwMDAxREUKKzoxMEVFMzAwMDI2MTAwMDAxMkUwMjAwMjAxNDQwRkZGQjAwMDAwMDAwRkQKKzoxMEVFNDAwMDBDMDA0RDc4MDAwMDIwMjEwQzAwNEQ3ODI0MDQwMDAxQjYKKzoxMEVFNTAwMDBDMDA0RDc4MDAwMDIwMjEwQzAwNEQ3ODI0MDQwMDAxQTYKKzoxMEVFNjAwMDI0MTAwMDEwMEMwMDRENzgwMDAwMjAyMTAwMTA4MDQyN0EKKzoxMEVFNzAwMDE2MDBGRkZDMDAwMDAwMDAyNDEwMDAxMDBDMDA0RDc4NkMKKzoxMEVFODAwMDAwMDAyMDIxMDAxMDgwNDIxNjAwRkZGQzAwMDAwMDAwNUUKKzoxMEVFOTAwMDBDMDA0RDc4MjQwNDAwMDEwQzAwNEQ3ODAwMDAyMDIxNjYKKzoxMEVFQTAwMDM0MTA4MDAwOTdBMjAwMjIwMDUwMTAyNDEwNDAwMDAyNkQKKzoxMEVFQjAwMDAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3ODAwMTA4MDQyNDUKKzoxMEVFQzAwMDE2MDBGRkY4MDAwMDAwMDAwQzAwNERCOTAwMDAwMDAwMjMKKzoxMEVFRDAwMDI0MDQwMDE4MjQwNTAwMDIwQzAwNEREQjI0MDYwMDA0NjUKKzoxMEVFRTAwMDNDMTAwMDAxOEUxMDZFMjQyNDAyMDAwMTE2MDIwMTFENDgKKzoxMEVFRjAwMDAwMDAwMDAwM0MwMjAwMDE5NDQyNkYyNjNDMDEwMDAxMkEKKzoxMEVGMDAwMEFDMjA2RTI0MjQ0MjlGQkMyQzQyMDAwNDEwNDAwMDBDMTQKKzoxMEVGMTAwMDI0MDQwMDA5MjQwNTAwMDEwQzAwNEREQjI0MDYwNDAwMzQKKzoxMEVGMjAwMDI0MDQwMDE4MjQwNTAwMDEwQzAwNEREQjI0MDYwMDIwRjkKKzoxMEVGMzAwMDI0MDQwMDE4MjQwNTAwMDEwQzAwNEREQjI0MDYyMDAwRTkKKzoxMEVGNDAwMDNDMDI0MDAwMDI0MjEwMjQxMDQwMDEyMzNDMDIyMDAwRjkKKzoxMEVGNTAwMDAyNDIxMDI0MTA0MDAwMDQwMDAwMDAwMDNDMDEwMDAxQTcKKzoxMEVGNjAwMDEwMDAwMDAzQUMzMDZGMUMzQzAxMDAwMUFDMjA2RjFDOTIKKzoxMEVGNzAwMDNDMDMwMDAxOEM2MzZGMzQyNDAyMDAwNTE0NjIwMEY5MjUKKzoxMEVGODAwMDAwMDAwMDAwM0MwMjAwMDE4QzQyNkYxQzEwNDAwMDY3MzIKKzoxMEVGOTAwMDNDMDIwMDA0MDI0MjEwMjQxMDQwMDAxMUE3QTAwMDE4RjcKKzoxMEVGQTAwMDNDMDIwMDA4MDI0MjEwMjQxMDQwMDAwMjI0MDIwMjAwMjkKKzoxMEVGQjAwMEE3QTIwMDE4M0MwMjAwMTAwMjQyMTAyNDEwNDAwMDA0RDYKKzoxMEVGQzAwMDAwMDAwMDAwOTdBMjAwMTgzNDQyMDEwMEE3QTIwMDE4MTgKKzoxMEVGRDAwMDk3QTYwMDE4MjQwNDAwMDkxMDAwMDAwNDAwMDAyODIxNEUKKzoxMEVGRTAwMDI0MDQwMDA5MDAwMDI4MjEwMDAwMzAyMTBDMDA0RERCMjIKKzoxMEVGRjAwMDAwMDAwMDAwMjQwMjAwMDFBN0EyMDAxQTNDMDIwMDA4NDEKKzoxMEYwMDAwMDAyNDIxMDI0MTA0MDAwMEMzQzAyMDAwMjAyNDIxMDI0NzQKKzoxMEYwMTAwMDEwNDAwMDAyMjQwMjAxMDFBN0EyMDAxQTNDMDIwMDAxRDQKKzoxMEYwMjAwMDAyNDIxMDI0MTA0MDAwMDUzQzAyMDAxMDk3QTIwMDFBNzIKKzoxMEYwMzAwMDM0NDIwMDQwQTdBMjAwMUEzQzAyMDAxMDAyNDIxMDI0RjEKKzoxMEYwNDAwMDEwNDAwMDBFM0MwMjAwMDIwMjQyMTAyNDEwNDAwMDA1NTUKKzoxMEYwNTAwMDNDMDIwMDAxOTdBMjAwMUEzNDQyMDA4MEE3QTIwMDFBQzUKKzoxMEYwNjAwMDNDMDIwMDAxMDI0MjEwMjQxMDQwMDAwNTNDMDMwMEEwQjUKKzoxMEYwNzAwMDk3QTIwMDFBMzQ0MjAwMjBBN0EyMDAxQTNDMDMwMEEwNjUKKzoxMEYwODAwMDAyNDMxMDI0NTQ0MzAwMDQzQzAyMDAyMDk3QTIwMDFBQkIKKzoxMEYwOTAwMDEwMDAwMDBDMzQ0MjA0MDAwMjQyMTAyNDUwNDAwMDA0Q0UKKzoxMEYwQTAwMDNDMDIwMDgwOTdBMjAwMUExMDAwMDAwNjM0NDIwODAwQkIKKzoxMEYwQjAwMDAyNDIxMDI0MTA0MDAwMDQwMDAwMDAwMDk3QTIwMDFBMzEKKzoxMEYwQzAwMDM0NDIwQzAwQTdBMjAwMUE5N0E2MDAxQTI0MDQwMDA0RDgKKzoxMEYwRDAwMDBDMDA0RERCMDAwMDI4MjEzQzAyMDAwNDAyNDIxMDI0RjkKKzoxMEYwRTAwMDEwNDAwMDA0QTdBMDAwMUMzMjQyNTAwMDE0NDAwMDA0NEQKKzoxMEYwRjAwMDAwMDAwMDAwMzI0MjQwMDAxMDQwMDAwNTAwMDAyMDIxQzYKKzoxMEYxMDAwMDBDMDA0Q0Y5MDI0MDIwMjExMDAwMDA5NjAwMDAwMDAwODUKKzoxMEYxMTAwMDk3QTYwMDFDMDAwMDI4MjEzNEM2MTIwMDBDMDA0RERCMEQKKzoxMEYxMjAwMEE3QTYwMDFDMTAwMDAwOEYwMDAwMDAwMDAyNDIxMDI0NUYKKzoxMEYxMzAwMDEwNDAwMDA0QTdBMDAwMTgzMjQyNTAwMDE0NDAwMDA0MDAKKzoxMEYxNDAwMDAwMDAwMDAwMzI0MjQwMDAxMDQwMDAwNTNDMDIwMDEwNjgKKzoxMEYxNTAwMDBDMDA0Q0Y5MDI0MDIwMjExMDAwMDAxOUE3QTAwMDFBNTEKKzoxMEYxNjAwMDAyNDIxMDI0MTA0MDAwMDQwMDAwMDAwMDk3QTIwMDE4ODIKKzoxMEYxNzAwMDEwMDAwMDA0QTdBMjAwMTg5N0EyMDAxODM0NDIwMTAwNTIKKzoxMEYxODAwMEE3QTIwMDE4M0MwMjAwMDEwMjQyMTAyNDEwNDAwMDA0MTMKKzoxMEYxOTAwMDAwMDAwMDAwOTdBMjAwMTgxMDAwMDAwNEE3QTIwMDE4QTkKKzoxMEYxQTAwMDk3QTIwMDE4MzQ0MjIwMDBBN0EyMDAxODk3QTYwMDE4QzIKKzoxMEYxQjAwMDAwMDAyMDIxMEMwMDREREIwMDAwMjgyMUE3QTAwMDFBMzAKKzoxMEYxQzAwMDAwMDA4MDIxMEMwMDRENzgyNDA0MDAwMTI2MTAwMDAxNkQKKzoxMEYxRDAwMDJFMDIwMDIwMTQ0MEZGRkIwMDAwMDAwMDBDMDA0RDc4QzAKKzoxMEYxRTAwMDAwMDAyMDIxMEMwMDRENzgyNDA0MDAwMTBDMDA0RDc4MTMKKzoxMEYxRjAwMDI0MDQwMDAxMEMwMDRENzgwMDAwMjAyMTI0MTAwMDEwOTAKKzoxMEYyMDAwMDMyMDIwMDAxMTA0MDAwMDIwMDAwMjAyMTI0MDQwMDAxMEQKKzoxMEYyMTAwMDBDMDA0RDc4MDAxMDgwNDIxNjAwRkZGQTMyMDIwMDAxMDcKKzoxMEYyMjAwMDI0MTAwMDEwMEMwMDRENzgwMDAwMjAyMTAwMTA4MDQyQjYKKzoxMEYyMzAwMDE2MDBGRkZDMDAwMDAwMDAwQzAwNERCOTM0MTA4MDAwRTcKKzoxMEYyNDAwMDBDMDA0REI5MDAwMDAwMDAwQzAwNEQ1ODAwMDAwMDAwRkIKKzoxMEYyNTAwMDUwNDAwMDA1MDAxMDgwNDI5N0EyMDAxQTAwNTAxMDI1NkYKKzoxMEYyNjAwMEE3QTIwMDFBMDAxMDgwNDIxNjAwRkZGNzAwMDAwMDAwNUQKKzoxMEYyNzAwMDBDMDA0REI5MDAwMDgwMjFBN0EwMDAxQTBDMDA0RDc4QTkKKzoxMEYyODAwMDI0MDQwMDAxMjYxMDAwMDEyRTAyMDAyMDE0NDBGRkZCODAKKzoxMEYyOTAwMDAwMDAwMDAwMEMwMDRENzgwMDAwMjAyMTBDMDA0RDc4OEIKKzoxMEYyQTAwMDI0MDQwMDAxMEMwMDRENzgyNDA0MDAwMTBDMDA0RDc4NkEKKzoxMEYyQjAwMDAwMDAyMDIxMjQxMDAwMTAzMjAyMDAwMTEwNDAwMDAyNDIKKzoxMEYyQzAwMDAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3ODAwMTA4MDQyMzEKKzoxMEYyRDAwMDE2MDBGRkZBMzIwMjAwMDEyNDEwMDAxMDBDMDA0RDc4RDUKKzoxMEYyRTAwMDAwMDAyMDIxMDAxMDgwNDIxNjAwRkZGQzAwMDAwMDAwRkEKKzoxMEYyRjAwMDBDMDA0REI5MzQxMDgwMDAwQzAwNERCOTAwMDAwMDAwMjYKKzoxMEYzMDAwMDBDMDA0RDU4MDAwMDAwMDA1MDQwMDAwNTAwMTA4MDQyRTUKKzoxMEYzMTAwMDk3QTIwMDFBMDA1MDEwMjVBN0EyMDAxQTAwMTA4MDQyRTAKKzoxMEYzMjAwMDE2MDBGRkY3MDAwMDAwMDAwQzAwNERCOTAwMDAwMDAwQkYKKzoxMEYzMzAwMDNDMDQwMDAxMjQ4NDZCQ0M5N0E2MDAxODk3QTcwMDFBMDAKKzoxMEYzNDAwMDNDMDIwMDAxOEM0MjZEOTgzQzAzMDAwMThDNjM2RjFDRjEKKzoxMEYzNTAwMDNDMDUwMDBEMzRBNTAyMDVBRkEyMDAxMDBDMDAyQjNCQUMKKzoxMEYzNjAwMEFGQTMwMDE0OEY4MzAwNTQyNDAyMDAwNDNDMDEwMDAxNjkKKzoxMEYzNzAwMEFDMjI2REQ0M0MwMTAwMDExMDAwMDAxN0FDMjM2RjM4QTMKKzoxMEYzODAwMDhGODMwMDU0M0MwMjAwMDE4QzQyNkYzODI0NjNGRjlDNDEKKzoxMEYzOTAwMDAwNDMxMDIzMkM0MjAwNjQxNDQwMDAwRjAwMDAwMDAwQzIKKzoxMEYzQTAwMDhGODIwMjIwMjQwMzAwMDUzQzAxMDAwMUFDMjM2REQ0QjAKKzoxMEYzQjAwMDNDMDNGNzAwMDA0MzEwMjUxMDAwMDAwN0FGODIwMjIwMzUKKzoxMEYzQzAwMDI0MDIwMDA2M0MwMTAwMDFBQzIyNkRENDI0MDIwMDExOEQKKzoxMEYzRDAwMDNDMDEwMDAxQUMyMjZERDA4RkJGMDAzNDhGQjIwMDMwRjEKKzoxMEYzRTAwMDhGQjEwMDJDOEZCMDAwMjgwM0UwMDAwODI3QkQwMDM4NDMKKzoxMEYzRjAwMDI3QkRGRkQ4QUZCMDAwMTgwMDgwODAyMUFGQjEwMDFDM0UKKzoxMEY0MDAwMDAwMDA4ODIxMzIwMjQwMDAxMDQwMDAxM0FGQkYwMDIwRUUKKzoxMEY0MTAwMDNDMDIwMDEwMDIwMjEwMjQyQzQyMDAwMTAwMDIxMDIzQzIKKzoxMEY0MjAwMDMwNDM0MTAwM0MwMjAwMDEwMjAyMTAyNDE0NDAwMDA2NTcKKzoxMEY0MzAwMDM0NzE0MDAwM0MwMjAwMDIwMjAyMTAyNDE0NDAwMDAyMTkKKzoxMEY0NDAwMDM0NzE2MDAwMzQ3MTQwNDAwMDAwMjAyMTAwMDAyODIxMDgKKzoxMEY0NTAwMDEwMDAwMDM2MDIyMDMwMjEzMjAyMTAwMDEwNDAwMDM1MkEKKzoxMEY0NjAwMDAwMDAyMDIxMDAwMDI4MjEwQzAwNEREQjI0MDYwMDQwNzQKKzoxMEY0NzAwMDI0MDQwMDE4MDAwMDI4MjEwQzAwNEREQjI0MDYwQzAwOTkKKzoxMEY0ODAwMDI0MDQwMDE3MDAwMDI4MjEwQzAwNEREQjI0MDYwNDAwOTIKKzoxMEY0OTAwMDI0MDQwMDE2MDAwMDI4MjEwQzAwNEREQjI0MDYwMDA2ODEKKzoxMEY0QTAwMDI0MDQwMDE3MDAwMDI4MjEwQzAwNEREQjI0MDYyNTAwNTEKKzoxMEY0QjAwMDI0MDQwMDE2MDAwMDI4MjEwQzAwNEREQjI0MDYwMDA2NjEKKzoxMEY0QzAwMDI0MDQwMDE3MDAwMDI4MjEwQzAwNEREQjI0MDY0NjAwMTAKKzoxMEY0RDAwMDI0MDQwMDE2MDAwMDI4MjEwQzAwNEREQjI0MDYwMDA2NDEKKzoxMEY0RTAwMDI0MDQwMDE3MDAwMDI4MjEwQzAwNEREQjI0MDY2NzAwQ0YKKzoxMEY0RjAwMDI0MDQwMDE2MDAwMDI4MjEwQzAwNEREQjI0MDYwMDA2MjEKKzoxMEY1MDAwMDI0MDQwMDFGMDAwMDI4MjEwQzAwNEREQjI0MDYwMDEwRkQKKzoxMEY1MTAwMDI0MDQwMDA5MDAwMDI4MjEwQzAwNEREQjI0MDYxNTAwRkUKKzoxMEY1MjAwMDI0MDQwMDA5MDAwMDI4MjEyNDA2MUQwMDBDMDA0RERCRTYKKzoxMEY1MzAwMDAwMDAwMDAwM0MwNDAwMDEyNDg0NkJGMDNDMDUwMDBFMzgKKzoxMEY1NDAwMDM0QTUwMTAwMDIwMDMwMjEwMjIwMzgyMUFGQTAwMDEwQjQKKzoxMEY1NTAwMDBDMDAyQjNCQUZBMDAwMTQ4RkJGMDAyMDhGQjEwMDFDMEMKKzoxMEY1NjAwMDhGQjAwMDE4MDNFMDAwMDgyN0JEMDAyODhGODUwMDQ0RjUKKzoxMEY1NzAwMDhGODIwMDQ0M0MwMzAwMDEwMDQzMTAyNTNDMDMwMDA4MzcKKzoxMEY1ODAwMEFGODIwMDQ0OEY4NDAwNTQ4RjgyMDA1NDAwQTMyODI0NEIKKzoxMEY1OTAwMDEwMDAwMDAyMjQ4NDAwMDE4RjgyMDA1NDAwODIxMDIzOTYKKzoxMEY1QTAwMDJDNDIwMDAyMTQ0MEZGRkMwMDAwMDAwMDhGODIwMDQ0NDcKKzoxMEY1QjAwMDNDMDNGRkZFMzQ2M0ZGRkYwMDQzMTAyNEFGODIwMDQ0OEUKKzoxMEY1QzAwMDhGODMwMDU0OEY4MjAwNTQxMDAwMDAwMjI0NjMwMDAxRDYKKzoxMEY1RDAwMDhGODIwMDU0MDA2MjEwMjMyQzQyMDAwMjE0NDBGRkZDNzIKKzoxMEY1RTAwMDAwMDAwMDAwMDNFMDAwMDgwMEEwMTAyMThGODMwMDQ0MDkKKzoxMEY1RjAwMDNDMDJGRkYwMzQ0MkZGRkYwMDA0MjQ4MDAwNjIxODI0MjQKKzoxMEY2MDAwMDNDMDIwMDAyMDA4MjIwMjUwMDY0MTgyNUFGODMwMDQ0REMKKzoxMEY2MTAwMDhGODIwMDQ0M0MwM0ZGRkUzNDYzRkZGRjAwNDMxMDI0NEQKKzoxMEY2MjAwMEFGODIwMDQ0OEY4MzAwNTQ4RjgyMDA1NDEwMDAwMDAyODgKKzoxMEY2MzAwMDI0NjMwMDAxOEY4MjAwNTQwMDYyMTAyMzJDNDIwMDAyRDgKKzoxMEY2NDAwMDE0NDBGRkZDMDAwMDAwMDA4RjgyMDA0NDNDMDMwMDAxRDYKKzoxMEY2NTAwMDAwNDMxMDI1QUY4MjAwNDQ4RjgzMDA1NDhGODIwMDU0RjIKKzoxMEY2NjAwMDEwMDAwMDAyMjQ2MzAwMDE4RjgyMDA1NDAwNjIxMDIzMDYKKzoxMEY2NzAwMDJDNDIwMDAyMTQ0MEZGRkMwMDAwMDAwMDAzRTAwMDA4RTAKKzoxMEY2ODAwMDAwMDAwMDAwOEY4MjAwNDQyNDAzRkY3RjAwNDMxMDI0MDkKKzoxMEY2OTAwMEFGODIwMDQ0OEY4MzAwNTQ4RjgyMDA1NDEwMDAwMDAyMTgKKzoxMEY2QTAwMDI0NjMwMDAxOEY4MjAwNTQwMDYyMTAyMzJDNDIwMDAyNjgKKzoxMEY2QjAwMDE0NDBGRkZDMDAwMDAwMDA4RjgyMDA0NDM0NDIwMDgwQjAKKzoxMEY2QzAwMEFGODIwMDQ0OEY4MzAwNTQ4RjgyMDA1NDEwMDAwMDAyRTgKKzoxMEY2RDAwMDI0NjMwMDAxOEY4MjAwNTQwMDYyMTAyMzJDNDIwMDAyMzgKKzoxMEY2RTAwMDE0NDBGRkZDMDAwMDAwMDAwM0UwMDAwODAwMDAwMDAwRTAKKzoxMEY2RjAwMDhGODIwMDQ0M0MwM0ZGRjAzNDYzRkZGRjAwNDMxMDI0N0IKKzoxMEY3MDAwMEFGODIwMDQ0OEY4MjAwNDQzQzAzMDAwMTAwNDMxMDI1NzcKKzoxMEY3MTAwMEFGODIwMDQ0OEY4MzAwNTQ4RjgyMDA1NDEwMDAwMDAyOTcKKzoxMEY3MjAwMDI0NjMwMDAxOEY4MjAwNTQwMDYyMTAyMzJDNDIwMDAyRTcKKzoxMEY3MzAwMDE0NDBGRkZDMDAwMDAwMDA4RjgyMDA0NDNDMDNGRkZFRTkKKzoxMEY3NDAwMDM0NjNGRkZGMDA0MzEwMjRBRjgyMDA0NDhGODMwMDU0RDIKKzoxMEY3NTAwMDhGODIwMDU0MTAwMDAwMDIyNDYzMDAwMThGODIwMDU0NDUKKzoxMEY3NjAwMDAwNjIxMDIzMkM0MjAwMDIxNDQwRkZGQzAwMDAwMDAwNDUKKzoxMEY3NzAwMDAzRTAwMDA4MDAwMDAwMDAyN0JERkZDOEFGQjMwMDI0NkQKKzoxMEY3ODAwMDAwODA5ODIxQUZCRTAwMkMwMEEwRjAyMUFGQjIwMDIwNzUKKzoxMEY3OTAwMDAwQzA5MDIxMzNDMkZGRkZBRkJGMDAzMEFGQjUwMDI4REIKKzoxMEY3QTAwMEFGQjEwMDFDQUZCMDAwMTgxNDQwMDAzNEE3QjIwMDEwNzUKKzoxMEY3QjAwMDMyNzFGRkZGMjdCMjAwMTAwMDAwODAyMTBDMDA0RDc4NEQKKzoxMEY3QzAwMDI0MDQwMDAxMjYxMDAwMDEyRTAyMDAyMDE0NDBGRkZCM0IKKzoxMEY3RDAwMDAwMDAwMDAwMEMwMDRENzgwMDAwMjAyMTBDMDA0RDc4NDYKKzoxMEY3RTAwMDI0MDQwMDAxMEMwMDRENzgwMDAwMjAyMTBDMDA0RDc4MEQKKzoxMEY3RjAwMDI0MDQwMDAxMjQxMDAwMTAzMjAyMDAwMTEwNDAwMDAyMTUKKzoxMEY4MDAwMDAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3ODAwMTA4MDQyRUIKKzoxMEY4MTAwMDE2MDBGRkZBMzIwMjAwMDEyNDEwMDAxMDAyMzAxMDI0RkEKKzoxMEY4MjAwMDEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMTBDMDA0RDc4NEIKKzoxMEY4MzAwMDAwMTA4MDQyMTYwMEZGRkEwMjMwMTAyNDBDMDA0RDc4QjAKKzoxMEY4NDAwMDI0MDQwMDAxMEMwMDRENzgwMDAwMjAyMTM0MTA4MDAwQjkKKzoxMEY4NTAwMDk2NDIwMDAwMDA1MDEwMjQxMDQwMDAwMjAwMDAyMDIxQjkKKzoxMEY4NjAwMDI0MDQwMDAxMEMwMDRENzgwMDEwODA0MjEyMDAwMDc1NDUKKzoxMEY4NzAwMDAwMDAwMDAwMTAwMEZGRjYwMDAwMDAwMDMyNzVGRkZGREUKKzoxMEY4ODAwMDI3QjEwMDEwQTdBMDAwMTAwMDAwODAyMTBDMDA0RDc4QzcKKzoxMEY4OTAwMDI0MDQwMDAxMjYxMDAwMDEyRTAyMDAyMDE0NDBGRkZCNkEKKzoxMEY4QTAwMDAwMDAwMDAwMEMwMDRENzgwMDAwMjAyMTBDMDA0RDc4NzUKKzoxMEY4QjAwMDI0MDQwMDAxMEMwMDRENzgyNDA0MDAwMTBDMDA0RDc4NTQKKzoxMEY4QzAwMDAwMDAyMDIxMjQxMDAwMTAzMjAyMDAwMTEwNDAwMDAyMkMKKzoxMEY4RDAwMDAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3ODAwMTA4MDQyMUIKKzoxMEY4RTAwMDE2MDBGRkZBMzIwMjAwMDEyNDEwMDAxMDAyQjAxMDI0QUEKKzoxMEY4RjAwMDEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMTBDMDA0RDc4N0IKKzoxMEY5MDAwMDAwMTA4MDQyMTYwMEZGRkEwMkIwMTAyNDBDMDA0REI5MUUKKzoxMEY5MTAwMDM0MTA4MDAwMEMwMDREQjkwMDAwMDAwMDBDMDA0RDU4NjAKKzoxMEY5MjAwMDAwMDAwMDAwNTA0MDAwMDUwMDEwODA0Mjk2MjIwMDAwQjgKKzoxMEY5MzAwMDAwNTAxMDI1QTYyMjAwMDAwMDEwODA0MjE2MDBGRkY3OUMKKzoxMEY5NDAwMDAwMDAwMDAwMEMwMDREQjkwMDAwMDAwMDMzQzVGRkZGQUYKKzoxMEY5NTAwMDI0MDIwMDAxNTRBMjAwMDQyNDAyMDAwMjk3QTIwMDEwMTUKKzoxMEY5NjAwMDEwMDAwMDA2MDA1MjEwMjUxNEEyMDAwNjMyNzFGRkZGOUQKKzoxMEY5NzAwMDk3QTIwMDEwMDAxMjE4MjcwMDQzMTAyNEE3QTIwMDEwMUQKKzoxMEY5ODAwMDMyNzFGRkZGMjdCMjAwMTAwMDAwODAyMTBDMDA0RDc4N0IKKzoxMEY5OTAwMDI0MDQwMDAxMjYxMDAwMDEyRTAyMDAyMDE0NDBGRkZCNjkKKzoxMEY5QTAwMDAwMDAwMDAwMEMwMDRENzgwMDAwMjAyMTBDMDA0RDc4NzQKKzoxMEY5QjAwMDI0MDQwMDAxMEMwMDRENzgwMDAwMjAyMTBDMDA0RDc4M0IKKzoxMEY5QzAwMDI0MDQwMDAxMjQxMDAwMTAzMjAyMDAwMTEwNDAwMDAyNDMKKzoxMEY5RDAwMDAwMDAyMDIxMjQwNDAwMDEwQzAwNEQ3ODAwMTA4MDQyMUEKKzoxMEY5RTAwMDE2MDBGRkZBMzIwMjAwMDEyNDEwMDAxMDAyMzAxMDI0MjkKKzoxMEY5RjAwMDEwNDAwMDAyMDAwMDIwMjEyNDA0MDAwMTBDMDA0RDc4N0EKKzoxMEZBMDAwMDAwMTA4MDQyMTYwMEZGRkEwMjMwMTAyNDBDMDA0RDc4REUKKzoxMEZBMTAwMDI0MDQwMDAxMEMwMDRENzgwMDAwMjAyMTM0MTA4MDAwRTcKKzoxMEZBMjAwMDk2NDIwMDAwMDA1MDEwMjQxMDQwMDAwMjAwMDAyMDIxRTcKKzoxMEZBMzAwMDI0MDQwMDAxMEMwMDRENzgwMDEwODA0MjE2MDBGRkY4RUQKKzoxMEZBNDAwMDAwMDAwMDAwMEMwMDREQjkwMDAwMDAwMDhGQkYwMDMwMjYKKzoxMEZBNTAwMDhGQkUwMDJDOEZCNTAwMjg4RkIzMDAyNDhGQjIwMDIwRkEKKzoxMEZBNjAwMDhGQjEwMDFDOEZCMDAwMTgwM0UwMDAwODI3QkQwMDM4REMKKzoxMEZBNzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDI3QkRGRkU4QkIKKzoxMEZBODAwMEFGQkYwMDEwOEVFMzA0QjgyNDAyMDAwODE0NjIwMUUwNDYKKzoxMEZBOTAwMDAwMDAwMDAwM0MwMjAwMDE4QzQyNkYxQzE0NDAwMDA1NzUKKzoxMEZBQTAwMDAwMDAwMDAwMEMwMDNEQUY4Rjg0MDIyNDEwMDAwMUQ4M0MKKzoxMEZBQjAwMDAwMDAwMDAwOEY4MjAyMjAzQzAzMDAwODAwNDMxMDI0NTUKKzoxMEZBQzAwMDEwNDAwMDI2MjQwMjAwMDE4Rjg0MDIyNDhGODIwMjIwMkQKKzoxMEZBRDAwMDNDMDMwNDAwMDA0MzEwMjQxMDQwMDAwNjAwMDAwMDAwMTYKKzoxMEZBRTAwMDNDMDEwMDAyQUMyMDhGQTAzQzAxMDAwMjEwMDAwMDBCODIKKzoxMEZBRjAwMEFDMjA4RkMwM0MwMzAwMDIyNDYzOEZBMDhDNjIwMDAwMDYKKzoxMEZCMDAwMDI0NDIwMDAxQUM2MjAwMDAyQzQyMDAwMjE0NDAwMDAzQjkKKzoxMEZCMTAwMDI0MDIwMDAxM0MwMTAwMDJBQzIyOEZDMDNDMDIwMDAyMjIKKzoxMEZCMjAwMDhDNDI4RkMwMTA0MDAwMDYzMDgyMDA0MDEwNDAwMDA0MUMKKzoxMEZCMzAwMDI0MDIwMDAxM0MwMTAwMDIxMDAwMDAwM0FDMjI4RkM0MkIKKzoxMEZCNDAwMDNDMDEwMDAyQUMyMDhGQzQzQzAxMDAwMkFDMjQ4RjlDMUQKKzoxMEZCNTAwMDNDMDEwMDAyMTAwMDAwMEJBQzIwOEZEMDNDMDEwMDAyRTEKKzoxMEZCNjAwMEFDMjI4RkQwM0MwMTAwMDJBQzIwOEZDMDNDMDEwMDAyQ0YKKzoxMEZCNzAwMEFDMjA4RkEwM0MwMTAwMDJBQzIwOEZDNDNDMDEwMDAyRUQKKzoxMEZCODAwMEFDMjA4RjlDM0MwMzAwMDI4QzYzOEY5MDNDMDIwMDAyRUYKKzoxMEZCOTAwMDhDNDI4Rjk0NTA2MjAwMDQyNDYzRkZGRjNDMDEwMDAyRkEKKzoxMEZCQTAwMEFDMjM4Rjk0MjQ2M0ZGRkYyQzYyMDAwRTEwNDAwMTk0NUQKKzoxMEZCQjAwMDAwMDMxMDgwM0MwMTAwMDEwMDIyMDgyMThDMjI2QzAwMEYKKzoxMEZCQzAwMDAwNDAwMDA4MDAwMDAwMDAyNDAyMDAwMjNDMDEwMDAyODYKKzoxMEZCRDAwMEFDMjA4RkMwM0MwMTAwMDJBQzIwOEZBMDNDMDEwMDAyOTEKKzoxMEZCRTAwMEFDMjA4RjlDM0MwMTAwMDJBQzIwOEZDNDNDMDEwMDAyODEKKzoxMEZCRjAwMEFDMjA4RkI4M0MwMTAwMDJBQzIwOEZCMEFGODAwMjI0NTMKKzoxMEZDMDAwMDNDMDEwMDAyQUMyMjhGOTAzQzAyMDAwMjhDNDI4RkQwNUIKKzoxMEZDMTAwMDE0NDAwMDRGM0MwMkZERkYzNDQyRkZGRjBDMDAzREFGOUIKKzoxMEZDMjAwMDAyODJBMDI0QUY4MDAyMDQ4RjgyMDIwMDI0MDNGRkZEMjEKKzoxMEZDMzAwMDAwNDMxMDI0QUY4MjAyMDAzQzAxMDAwMkFDMjA4RkUwQTAKKzoxMEZDNDAwMDhGODMwMDU0M0MwMjAwMDI4QzQyOEZCODI0MDQwMDAxRDAKKzoxMEZDNTAwMDNDMDEwMDAyQUMyNDhGQ0MyNDQyMDAwMTNDMDEwMDAyOTQKKzoxMEZDNjAwMEFDMjI4RkI4MkM0MjAwMDQzQzAxMDAwMkFDMjM4RkI0QkMKKzoxMEZDNzAwMDE0NDAwMDA2MjQwMjAwMDMzQzAxMDAwMUFDMjQ2RDlDRUEKKzoxMEZDODAwMDNDMDEwMDAyMTAwMDAxNUVBQzIwOEZCODNDMDEwMDAyNzQKKzoxMEZDOTAwMDEwMDAwMTVCQUMyMjhGOTA4RjgzMDA1NDNDMDIwMDAyNjUKKzoxMEZDQTAwMDhDNDI4RkI0MjQ2M0Q4RjAwMDQzMTAyMzJDNDIyNzEwRDkKKzoxMEZDQjAwMDE0NDAwMDAzMjQwMjAwMDQzQzAxMDAwMkFDMjI4RjkwOTcKKzoxMEZDQzAwMDNDMDIwMDAyOEM0MjhGRDAxNDQwMDAyMTNDMDJGREZGMTgKKzoxMEZDRDAwMDM0NDJGRkZGMTAwMDAxNEEwMjgyQTAyNDNDMDQwMDAxQ0MKKzoxMEZDRTAwMDhDODQ2RjIwM0MwMTAwMDIwQzAwNTA4NEFDMjA4RkE4NTMKKzoxMEZDRjAwMDNDMDIwMDAyOEM0MjhGRENBRjgyMDIwNDNDMDIwMDAyMTQKKzoxMEZEMDAwMDhDNDI4RkQwMTQ0MDAwMTIzQzAzRkRGRjhGODIwMjA0MEUKKzoxMEZEMTAwMDM0NjNGRkZGMzA0MjAwMzAxNDQwMDEyRjAyODNBMDI0REYKKzoxMEZEMjAwMDNDMDMwMDAyOEM2MzhGREMyNDAyMDAwNTNDMDEwMDAyQ0UKKzoxMEZEMzAwMEFDMjI4RjkwM0MwMTAwMDIxMDAwMDEzMUFDMjM4RkUwMTcKKzoxMEZENDAwMDNDMDIwMDAyOEM0MjhGRDAxMDQwMDAxMDNDMDJGREZGQUMKKzoxMEZENTAwMDNDMDIwMDAxOEM0MjZFM0MyNDQyMDAwMTNDMDEwMDAxNDcKKzoxMEZENjAwMEFDMjI2RTNDMkM0MjAwMDIxNDQwMDEyNTI0MDIwMDAxMEEKKzoxMEZENzAwMDNDMDEwMDAxQUMyMjZFNDQzQzAxMDAwMUFDMjA2RTNDMTEKKzoxMEZEODAwMDNDMDEwMDAxMTAwMDAxMUVBQzIyNkQ5QzNDMDMwMDAyRUUKKzoxMEZEOTAwMDhDNjM4RkMwMzQ0MkZGRkYxMDYwMDExOTAyODJBMDI0REYKKzoxMEZEQTAwMDNDMDIwMDAyOEM0MjhGOUMxMDQwMDExNTAwMDAwMDAwQjQKKzoxMEZEQjAwMDNDMDEwMDAyQUMyMjhGQzgyNDAyMDAwMzNDMDEwMDAyNzcKKzoxMEZEQzAwMEFDMjI4RkEwMTAwMDAwQjgyNDAyMDAwNjNDMDEwMDAyMDMKKzoxMEZERDAwMEFDMjA4RkE4OEY4MjAyMDQzNDQyMDA0MEFGODIwMjA0MUMKKzoxMEZERTAwMDNDMDIwMDAyOEM0MjhGRTAyNDAzMDAwNzNDMDEwMDAyMjkKKzoxMEZERjAwMEFDMjM4RjkwMzQ0MjAwNDAzQzAxMDAwMkFDMjI4RkUwRTMKKzoxMEZFMDAwMDNDMDIwMDAyOEM0MjhGQzAxMDQwMDAwNTAwMDAwMDAwNDAKKzoxMEZFMTAwMDNDMDIwMDAyOEM0MjhGOUMxMDQwMDBGMDI0MDIwMDAyNDEKKzoxMEZFMjAwMDNDMDUwMDAyMjRBNThGQTA4Q0EyMDAwMDJDNDI0RTIxOEMKKzoxMEZFMzAwMDEwNDAwMEVBMjQwMjAwMDIzQzAyMDAwMjhDNDI4RkM0RkYKKzoxMEZFNDAwMDEwNDAwMEVGMjQwNEZGQkYzQzAyMDAwMjhDNDI4RjlDNTQKKzoxMEZFNTAwMDNDMDMwMDAyOEM2MzhGQzgwMDQ0MTAyNDAwNjQxODI0MDMKKzoxMEZFNjAwMDEwNDMwMDA0MjQwMjAwMDEzQzAxMDAwMjEwMDAwMEU0RTEKKzoxMEZFNzAwMEFDMjI4RjkwMjQwMjAwMDNBQ0EyMDAwMDI0MDIwMDA4RjAKKzoxMEZFODAwMDNDMDEwMDAyQUMyMjhGOTAzQzAyMDAwMjhDNDI4RkNDREQKKzoxMEZFOTAwMDEwNDAwMDBDMjQwMjAwMDEzQzA0MDAwMjBDMDA1MDkxQjAKKzoxMEZFQTAwMDhDODQ4RjlDM0MwMjAwMDI4QzQyOEZFODE0NDAwMDA1MzkKKzoxMEZFQjAwMDI0MDIwMDAxM0MwMjAwMDI4QzQyOEZFNDEwNDAwMDA2NDQKKzoxMEZFQzAwMDI0MDIwMDAxM0MwMTAwMDFBQzIyNkQ5QzNDMDEwMDAyQjcKKzoxMEZFRDAwMDEwMDAwMENCQUMyMDhGQjgzQzAyMDAwMjhDNDI4RkIwRTcKKzoxMEZFRTAwMDNDMDMwMDAyOEM2MzhGOUMyQzQyMDAwMTAwMDIxMEMwNzYKKzoxMEZFRjAwMDMwNjMwMDA4M0MwMTAwMDJBQzIyOEZCMDNDMDEwMDAyREMKKzoxMEZGMDAwMEFDMjM4RkFDOEY4MzAwNTQyNDAyMDAwOTNDMDEwMDAyMTMKKzoxMEZGMTAwMEFDMjI4RjkwM0MwMTAwMDIxMDAwMDBCOUFDMjM4RkI0REEKKzoxMEZGMjAwMDhGODMwMDU0M0MwMjAwMDI4QzQyOEZCNDI0NjNEOEYwQ0IKKzoxMEZGMzAwMDAwNDMxMDIzMkM0MjI3MTAxNDQwMDA5RjAwMDAwMDAwQjMKKzoxMEZGNDAwMDNDMDIwMDAyOEM0MjhGQzAxMDQwMDAwNTAwMDAwMDAwRkYKKzoxMEZGNTAwMDNDMDIwMDAyOEM0MjhGOUMxMDQwMDBBMDI0MDIwMDAyNTAKKzoxMEZGNjAwMDNDMDMwMDAyMjQ2MzhGQTA4QzYyMDAwMDJDNDI0RTIxQ0YKKzoxMEZGNzAwMDEwNDAwMDlBMjQwMjAwMDIzQzAyMDAwMjhDNDI4RkNDMDYKKzoxMEZGODAwMDEwNDAwMDBFMDAwMDAwMDAzQzAyMDAwMjhDNDI4RjlDREEKKzoxMEZGOTAwMDNDMDEwMDAyQUMyMDhGQ0MzMDQyMDA4MDEwNDAwMDJGOEEKKzoxMEZGQTAwMDI0MDIwMDBDOEY4MjAyMDQzMDQyMDA4MDE0NDAwMDBDQjYKKzoxMEZGQjAwMDI0MDIwMDAzMTAwMDAwMjkyNDAyMDAwQzNDMDIwMDAyNkQKKzoxMEZGQzAwMDhDNDI4RjlDMzA0MjAwODAxNDQwMDAwNTI0MDIwMDAzQzQKKzoxMEZGRDAwMDhGODIwMjA0MzA0MjAwODAxMDQwMDAxRjI0MDIwMDAzODAKKzoxMEZGRTAwMEFDNjIwMDAwMjQwMjAwMEEzQzAxMDAwMkFDMjI4RjkwQTcKKzoxMEZGRjAwMDNDMDQwMDAyMjQ4NDhGRDg4QzgyMDAwMDNDMDMwMDAyNjEKKzowMjAwMDAwMjEwMDBFQworOjEwMDAwMDAwOEM2MzhGQjAwMDQzMTAyNUFGODIwMjA0OEM4MzAwMDAwNAorOjEwMDAxMDAwM0MwNDAwMDI4Qzg0OEZCMDI0MDIwMDBCM0MwMTAwMDJERgorOjEwMDAyMDAwQUMyMjhGOTAwMDY0MTgyNTNDMDEwMDAyQUMyMzhGRTBDNQorOjEwMDAzMDAwM0MwNTAwMDIyNEE1OEZBMDhDQTIwMDAwMkM0MjRFMjE3QQorOjEwMDA0MDAwMTA0MDAwNjYyNDAyMDAwMjNDMDIwMDAyOEM0MjhGRDA2NQorOjEwMDA1MDAwMTA0MDAwMDUwMDAwMDAwMDI0MDIwMDBDM0MwMTAwMDJEQQorOjEwMDA2MDAwMTAwMDAwNjdBQzIyOEY5MDNDMDIwMDAyOEM0MjhGQzBDRgorOjEwMDA3MDAwMTA0MDAwNjMwMDAwMDAwMDNDMDQwMDAyOEM4NDhGOUM1MAorOjEwMDA4MDAwMTA4MDAwNTUzMDgyMDAwODNDMDMwMDAyOEM2MzhGQUM2NgorOjEwMDA5MDAwMTA2MjAwNUIyNDAyMDAwMzNDMDEwMDAyQUMyNDhGQzgwNAorOjEwMDBBMDAwQUNBMjAwMDAyNDAyMDAwNjNDMDEwMDAyMTAwMDAwNTQzMworOjEwMDBCMDAwQUMyMjhGOTA4RjgyMDIwMDM0NDIwMDAyQUY4MjAyMDA5NQorOjEwMDBDMDAwOEY4MzAwNTQyNDAyMDAwRDNDMDEwMDAyQUMyMjhGOTA2QgorOjEwMDBEMDAwM0MwMTAwMDJBQzIzOEZCNDhGODMwMDU0M0MwMjAwMDIyOQorOjEwMDBFMDAwOEM0MjhGQjQyNDYzRDhGMDAwNDMxMDIzMkM0MjI3MTA5NQorOjEwMDBGMDAwMTQ0MDAwMzEwMDAwMDAwMDNDMDIwMDAyOEM0MjhGRDAwRQorOjEwMDEwMDAwMTA0MDAwMjAyNDAyMDAwRTNDMDMwMDAyOEM2MzhGRTRBOAorOjEwMDExMDAwM0MwMTAwMDIxNDYwMDAxNUFDMjI4RjkwMEMwMDNFNkQ3MworOjEwMDEyMDAwMDAwMDAwMDAzQzA1MDAwMThDQTU2RDk4MEMwMDUyOUI1RQorOjEwMDEzMDAwMDAwMDIwMjEzQzAzMDAwMThDNjM2RDk4MjQwMjAwMDQyMAorOjEwMDE0MDAwMTQ2MjAwMDUyNDAzRkZGQjNDMDIwMDAxOEM0MjZEOTQwNQorOjEwMDE1MDAwMTAwMDAwMDMyNDAzRkZGNzNDMDIwMDAxOEM0MjZEOTQ2MQorOjEwMDE2MDAwMDA0MzEwMjQzQzAxMDAwMUFDMjI2RDk0OEY4MzAyMjREMworOjEwMDE3MDAwM0MwMjAyMDAzQzAxMDAwMkFDMjM4RkVDMTAwMDAwMjA4NgorOjEwMDE4MDAwMDI4MkEwMjUzQzAyMDAwMjhDNDI4RkMwMTA0MDAwMDU3NAorOjEwMDE5MDAwMDAwMDAwMDAzQzAyMDAwMjhDNDI4RjlDMTA0MDAwMEZDNworOjEwMDFBMDAwMjQwMjAwMDIzQzAyMDAwMjhDNDI4RkEwMkM0MjRFMjEwRAorOjEwMDFCMDAwMTA0MDAwMEEyNDAyMDAwMjNDMDIwMDAyOEM0MjhGQzA2MAorOjEwMDFDMDAwMTA0MDAwMEYwMDAwMDAwMDNDMDIwMDAyOEM0MjhGOUM5NworOjEwMDFEMDAwMTQ0MDAwMEIwMDAwMDAwMDI0MDIwMDAyM0MwMTAwMDI1OQorOjEwMDFFMDAwMTAwMDAwMDdBQzIyOEY5MDNDMDIwMDAyOEM0MjhGQzBBRQorOjEwMDFGMDAwMTA0MDAwMDMwMDAwMDAwMDBDMDAzREFGMDAwMDAwMDBCNAorOjEwMDIwMDAwOEY4MjAyMjAzQzAzRjcwMDAwNDMxMDI1QUY4MjAyMjBCQQorOjEwMDIxMDAwOEZCRjAwMTAwM0UwMDAwODI3QkQwMDE4M0MwMzAwMDI1OAorOjEwMDIyMDAwMjQ2MzhGRTg4QzYyMDAwMDEwNDAwMDA1MzQ0MjIwMDBGNworOjEwMDIzMDAwM0MwMTAwMDJBQzIyOEZEQzEwMDAwMDAzQUM2MDAwMDAyNworOjEwMDI0MDAwM0MwMTAwMDJBQzI0OEZEQzAzRTAwMDA4MDAwMDAwMDA0OQorOjEwMDI1MDAwMjdCREZGRTAzMDgyMDAzMEFGQkYwMDE4M0MwMTAwMDIzNAorOjEwMDI2MDAwQUMyMjhGRTQxNDQwMDA2NzNDMDJGRkZGMzQ0MjFGMEVCMworOjEwMDI3MDAwMDA4MjEwMjQxNDQwMDA2MTI0MDIwMDMwMzA4MjIwMDBFQgorOjEwMDI4MDAwMTA0MDAwNUQzMDgzODAwMDAwMDMxQTAyMzA4MjAwMDFCQworOjEwMDI5MDAwMDAwMjEyMDAzQzA0MDAwMThDODQ2RjIwMDA2MjE4MjVDQgorOjEwMDJBMDAwMDAwMzMxQzIzQzAzMDAwMTI0NjM2RTQ4MzA4MjgwMDBBOQorOjEwMDJCMDAwMDAwMjEyMDIzMDg0MDAwMTAwMDQyMjAwMDA0NDEwMjVENAorOjEwMDJDMDAwMDAwMjM5QzIwMDA2MTA4MDAwNDMxMDIxMDA0NzEwMjFBRgorOjEwMDJEMDAwOTA0MzAwMDAyNDAyMDAwMTEwNjIwMDI1MDAwMDAwMDA4RAorOjEwMDJFMDAwMTA2MDAwMDcyNDAyMDAwMjEwNjIwMDEzMjQwMjAwMDNDMQorOjEwMDJGMDAwMTA2MjAwMkMzQzA1MDAwRjEwMDAwMDM3MDAwMDAwMDBDOQorOjEwMDMwMDAwOEY4MjAyMDAyNDAzRkVGRjAwNDMxMDI0QUY4MjAyMDAwQworOjEwMDMxMDAwOEY4MjAyMjAzQzAzRkZGRTM0NjNGRkZGMDA0MzEwMjQ2MgorOjEwMDMyMDAwQUY4MjAyMjAzQzAxMDAwMkFDMjA5MDA0M0MwMTAwMDI5QworOjEwMDMzMDAwMTAwMDAwMzRBQzIwOTAwQzhGODIwMjAwMzQ0MjAxMDA4NworOjEwMDM0MDAwQUY4MjAyMDA4RjgyMDIyMDNDMDNGRkZFMzQ2M0ZGRkY3NgorOjEwMDM1MDAwMDA0MzEwMjRBRjgyMDIyMDI0MDIwMTAwM0MwMTAwMDI2RAorOjEwMDM2MDAwQUMyMjkwMDQzQzAxMDAwMjEwMDAwMDI2QUMyMDkwMEM0RQorOjEwMDM3MDAwOEY4MjAyMDAyNDAzRkVGRjAwNDMxMDI0QUY4MjAyMDA5QworOjEwMDM4MDAwOEY4MjAyMjAzQzAzMDAwMTAwNDMxMDI1QUY4MjAyMjAyRgorOjEwMDM5MDAwM0MwMTAwMDJBQzIwOTAwNDNDMDEwMDAyMTAwMDAwMTk1NgorOjEwMDNBMDAwQUMyMzkwMEM4RjgyMDIwMDM0NDIwMTAwQUY4MjAyMDAyNQorOjEwMDNCMDAwOEY4MjAyMjAzQzAzMDAwMTAwNDMxMDI1QUY4MjAyMjBGRgorOjEwMDNDMDAwMjQwMjAxMDAzQzAxMDAwMkFDMjI5MDA0M0MwMTAwMDIyNgorOjEwMDNEMDAwMTAwMDAwMENBQzIzOTAwQzM0QTVGRkZGM0MwNDAwMDE3RQorOjEwMDNFMDAwMjQ4NDZDMzhBRkEzMDAxMDBDMDAyQjNCQUZBMDAwMTQ4QQorOjEwMDNGMDAwMTAwMDAwMDQwMDAwMDAwMDI0MDIwMDMwM0MwMTAwMDI1NAorOjEwMDQwMDAwQUMyMjhGRTg4RkJGMDAxODAzRTAwMDA4MjdCRDAwMjA1MgorOjEwMDQxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjdCREZGQzgzMQorOjEwMDQyMDAwQUZCMjAwMjgwMDgwOTAyMUFGQjMwMDJDMDBBMDk4MjEyQgorOjEwMDQzMDAwQUZCMDAwMjAwMEMwODAyMTNDMDQwMDAxMjQ4NDZDNTAzNworOjEwMDQ0MDAwM0MwNTAwMDkzQzAyMDAwMThDNDI2RDk4MzRBNTkwMDFFNgorOjEwMDQ1MDAwMDI0MDMwMjEwMjYwMzgyMUFGQkYwMDMwQUZCMTAwMjQyQworOjEwMDQ2MDAwQTdBMDAwMUFBRkIwMDAxNDBDMDAyQjNCQUZBMjAwMTBFNQorOjEwMDQ3MDAwMjQwMjAwMDIxMjYyMDA4MzJFNjIwMDAzMTA0MDAwMDU3NQorOjEwMDQ4MDAwMjQwMjAwMDExMjYyMDAwQTAwMDAwMDAwMTAwMDAxNzM0MworOjEwMDQ5MDAwMDAwMDAwMDAyNDAyMDAwNDEyNjIwMEY4MjQwMjAwMDg5OAorOjEwMDRBMDAwMTI2MjAwRjczQzAyRkZFQzEwMDAwMTZDMDAwMDAwMDAzQgorOjEwMDRCMDAwM0MwMjAwMDE4QzQyNkQ5NDMwNDIwMDAyMTQ0MDAwMDQ2MgorOjEwMDRDMDAwMDAxMjg5NDAzQzAyRkZGQjM0NDJGRkZGMDIwMjgwMjRGRAorOjEwMDREMDAwM0MwMTAwMDIwMDMxMDgyMUFDMzA4RkZDM0MwMjQwMDA5RQorOjEwMDRFMDAwMDIwMjEwMjQxMDQwMDA0RTAwMTAyM0MyMzA4NDAwMzA1RAorOjEwMDRGMDAwMDAxMDEzODIzMDQyMDAxQzNDMDMwMDAxMjQ2MzZERDhCRAorOjEwMDUwMDAwMDA0MzEwMjEwMDgyMzgyMTNDMDIwMDIwMDIwMjEwMjQwNgorOjEwMDUxMDAwMTA0MDAwMDYyNDAyMDEwMDNDMDEwMDAyMDAzMTA4MjFDNQorOjEwMDUyMDAwQUMyMjkwMDAxMDAwMDAwNTNDMDIwMDgwM0MwMTAwMDI1QgorOjEwMDUzMDAwMDAzMTA4MjFBQzIwOTAwMDNDMDIwMDgwMDIwMjEwMjQwRgorOjEwMDU0MDAwMTA0MDAwMDYwMDEyMTk0MDNDMDIwMDAxM0MwMTAwMDI2QworOjEwMDU1MDAwMDAyMzA4MjExMDAwMDAwNUFDMjI5MDA4MDAxMjExNDA3MQorOjEwMDU2MDAwM0MwMTAwMDIwMDIyMDgyMUFDMjA5MDA4OTRFNDAwMDAyNQorOjEwMDU3MDAwM0MwMzAwMDE4QzYzNkY0MDI0MDIwMDA1MTA2MjAwMTBGMAorOjEwMDU4MDAwQTdBNDAwMTgzMjAyNDAwMDEwNDAwMDAyMzQ4MjQwMDA0QworOjEwMDU5MDAwQTdBMjAwMTgyNDA0MDAwMTk0RTIwMDAyMjQwNTAwMDQyQworOjEwMDVBMDAwMjRFNjAwMDIzNDQyMDAwMTBDMDA0NUJFQTRFMjAwMDIzMQorOjEwMDVCMDAwMjQwNDAwMDEwMDAwMjgyMTBDMDA0NUJFMjdBNjAwMThENQorOjEwMDVDMDAwM0MwMjAwMDE4QzQyNkQ5ODI0MTEwMDAxM0MwMTAwMDFBNQorOjEwMDVEMDAwQUMzMTZEQTQxNDUzMDAwNDMyMDI4MDAwMEMwMDNEQUYxNgorOjEwMDVFMDAwMDAwMDAwMDAzMjAyODAwMDEwNDAwMTFDMDAwMDAwMDBFQQorOjEwMDVGMDAwMEMwMDNEQUYwMDAwMDAwMDNDMDMwMDAxOEM2MzZGNDAyNQorOjEwMDYwMDAwMjQwMjAwMDUxMDYyMDExNTI0MDIwMDAyM0MwMTAwMDFEMQorOjEwMDYxMDAwQUMzMTZEOUMzQzAxMDAwMTEwMDAwMTEwQUMyMjZEOThDMgorOjEwMDYyMDAwMjQwNDAwMDEyNDA1MDAwNDI3QjAwMDFBMEMwMDQ1QkU3NAorOjEwMDYzMDAwMDIwMDMwMjEyNDA0MDAwMTAwMDAyODIxMEMwMDQ1QkVFNgorOjEwMDY0MDAwMDIwMDMwMjEzQzAyMDAwMjAwNTExMDIxOEM0MjhGRjQ0NAorOjEwMDY1MDAwM0MwNDAwMDE4Qzg0NkQ5ODNDMDNCRkZGMzQ2M0ZGRkZCMgorOjEwMDY2MDAwM0MwMTAwMDFBQzMzNkRBNDAwNDMxMDI0M0MwMTAwMDJBNgorOjEwMDY3MDAwMDAzMTA4MjExMDkzMDBGN0FDMjI4RkY0MTAwMDAwRjcyRQorOjEwMDY4MDAwMDAwMDAwMDAzQzAyMjAwMDAyMDIxMDI0MTA0MDAwMDU3RgorOjEwMDY5MDAwMjQwMjAwMDEzQzAxMDAwMUFDMjI2RjFDMTAwMDAwMDQ4OAorOjEwMDZBMDAwMDAxMjg5NDAzQzAxMDAwMUFDMjA2RjFDMDAxMjg5NDBGRgorOjEwMDZCMDAwM0MwMTAwMDIwMDMxMDgyMUFDMzA4RkY4M0MwMjQwMDBDMAorOjEwMDZDMDAwMDIwMjEwMjQxNDQwMDAxNDAwMDAwMDAwM0MwMjAwMDE0QgorOjEwMDZEMDAwOEM0MjZGMUMxMDQwMDAwNjI0MDQwMDA0MjQwNTAwMDExNQorOjEwMDZFMDAwMEMwMDREREIyNDA2MjAwMDI0MDIwMDAxQUVFMjA0QjgxOQorOjEwMDZGMDAwM0MwMjAwMDIwMDUxMTAyMThDNDI4RkYwM0MwM0JGRkZFRQorOjEwMDcwMDAwMzQ2M0ZGRkYwMDQzMTAyNDNDMDEwMDAyMDAzMTA4MjE0NAorOjEwMDcxMDAwMTAwMDAwRDBBQzIyOEZGMDNDMDIwMDAxOEM0MjZGMUMxNAorOjEwMDcyMDAwMTA0MDAwMjgzQzAzMDBBMDAyMDMxMDI0NTQ0MzAwMEQ5NQorOjEwMDczMDAwM0MwMjAwMjAzQzAyMDAwMThDNDI2RjIwMjQwMzAxMDA5NworOjEwMDc0MDAwM0MwMTAwMDIwMDMxMDgyMUFDMjM5MDA0M0MwMzAwMDE2RAorOjEwMDc1MDAwM0MwMTAwMDIwMDMxMDgyMUFDMjM5MDBDMTAwMDAwMTU3MAorOjEwMDc2MDAwMzQ0MjA0MDAwMjAyMTAyNDEwNDAwMDA4MjQwMzAxMDA1NworOjEwMDc3MDAwM0MwMjAwMDE4QzQyNkYyMDNDMDEwMDAyMDAzMTA4MjE0NAorOjEwMDc4MDAwQUMyMzkwMDQxMDAwMDAwQjM0NDIwODAwM0MwMjAwODBBRgorOjEwMDc5MDAwMDIwMjEwMjQxMDQwMDAyRTNDMDMwMDAxM0MwMjAwMDEyNAorOjEwMDdBMDAwOEM0MjZGMjAzQzAxMDAwMjAwMzEwODIxQUMyMzkwMENFOAorOjEwMDdCMDAwMzQ0MjBDMDAzQzAxMDAwMUFDMjI2RjIwMTAwMDAwMjVFNworOjEwMDdDMDAwMjQwNDAwMDEzQzAyMDAyMDAyMDIxMDI0MTA0MDAwMDYxNAorOjEwMDdEMDAwMjQwMjAxMDAzQzAxMDAwMjAwMzEwODIxQUMyMjkwMDRGNworOjEwMDdFMDAwMTAwMDAwMDUzQzAyMDA4MDNDMDEwMDAyMDAzMTA4MjE5RAorOjEwMDdGMDAwQUMyMDkwMDQzQzAyMDA4MDAyMDIxMDI0MTA0MDAwMDc0QworOjEwMDgwMDAwMDAxMjE5NDAzQzAyMDAwMTNDMDEwMDAyMDAyMzA4MjFCMworOjEwMDgxMDAwQUMyMjkwMEMxMDAwMDAwNjI0MDQwMDAxMDAxMjExNDBDQworOjEwMDgyMDAwM0MwMTAwMDIwMDIyMDgyMUFDMjA5MDBDMjQwNDAwMDFBRAorOjEwMDgzMDAwMDAwMDI4MjEyN0IwMDAxRTBDMDA0NTdDMDIwMDMwMjE1QQorOjEwMDg0MDAwMjQwNDAwMDEwMDAwMjgyMTBDMDA0NTdDMDIwMDMwMjExNgorOjEwMDg1MDAwMjQwNDAwMDEyNDA1MDAwMTI3QjAwMDFDMEMwMDQ1N0M4NQorOjEwMDg2MDAwMDIwMDMwMjEyNDA0MDAwMTI0MDUwMDAxMEMwMDQ1N0MxNQorOjEwMDg3MDAwMDIwMDMwMjExMDAwMDA3NzAwMDAwMDAwM0MwMkZGRUM3NQorOjEwMDg4MDAwMzQ0MkZGRkYwMjAyODAyNDNDMDIwMDA4MDIwMjgwMjU1RAorOjEwMDg5MDAwMDAxMjExNDAzQzAxMDAwMjAwMjIwODIxQUMzMDhGRjgwOAorOjEwMDhBMDAwM0MwMjIwMDAwMjAyMTAyNDEwNDAwMDA5MDAwMDAwMDA1OQorOjEwMDhCMDAwM0MwMjAwMDE4QzQyNkU0NDE0NDAwMDA1MjQwMjAwMDFGOQorOjEwMDhDMDAwM0MwMTAwMDFBQzIyNkYxQzEwMDAwMDA0M0MwMjQwMDBGRgorOjEwMDhEMDAwM0MwMTAwMDFBQzIwNkYxQzNDMDI0MDAwMDIwMjEwMjRDRAorOjEwMDhFMDAwMTQ0MDAwMUQyNDAyMEUwMTNDMDMwMDAxOEM2MzZGMUNBOAorOjEwMDhGMDAwQUY4MjAyMzgzQzAxMDAwMUFDMjA2REIwMTA2MDAwMDVGMQorOjEwMDkwMDAwMjQwMjIwMjAzQzAxMDAwMUFDMjI2RjIwMjQwMjAwMDFCRgorOjEwMDkxMDAwQUVFMjA0QjgzQzA0QkZGRjAwMTIxOTQwM0MwMjAwMDJFMgorOjEwMDkyMDAwMDA0MzEwMjE4QzQyOEZGMDNDMDUwMDAxOENBNTZEOTg4RQorOjEwMDkzMDAwMzQ4NEZGRkYwMDQ0MTAyNDNDMDEwMDAyMDAyMzA4MjFGRQorOjEwMDk0MDAwQUMyMjhGRjAyNDAyMDAwMTEwQTIwMDQ0MDAwMDAwMDAzRAorOjEwMDk1MDAwMTAwMDAwNDAwMDAwMDAwMDNDMDIwMDAxOEM0MjZGMUNBRgorOjEwMDk2MDAwMTA0MDAwMUMyNDAyMjAwMDNDMDEwMDAxQUMyMjZGMjAzQQorOjEwMDk3MDAwM0MwMzAwQTAwMjAzMTAyNDE0NDMwMDA1MDAxMjExNDBBMAorOjEwMDk4MDAwMzQwMkEwMDAzQzAxMDAwMTEwMDAwMDJEQUMyMjZGMjBCOQorOjEwMDk5MDAwM0MwMzAwMDIwMDYyMTgyMThDNjM4RkY4M0MwMjAwMjBBNworOjEwMDlBMDAwMDA2MjEwMjQxMDQwMDAwNDI0MDIyMDAxM0MwMTAwMDFEOAorOjEwMDlCMDAwMTAwMDAwMjNBQzIyNkYyMDNDMDIwMDgwMDA2MjEwMjQ1MworOjEwMDlDMDAwMTA0MDAwMUYzNDAyQTAwMTNDMDEwMDAxMTAwMDAwMUM3NworOjEwMDlEMDAwQUMyMjZGMjAzQzAyMDAyMDAyMDIxMDI0MTA0MDAwMDdDRAorOjEwMDlFMDAwMDAxMjE5NDAyNDAyMDEwMDNDMDEwMDAyMDAyMzA4MjFFQQorOjEwMDlGMDAwQUMyMjkwMDQxMDAwMDAwNjNDMDIwMDgwMDAxMjExNDA1RQorOjEwMEEwMDAwM0MwMTAwMDIwMDIyMDgyMUFDMjA5MDA0M0MwMjAwODAzRQorOjEwMEExMDAwMDIwMjEwMjQxMDQwMDAwNjAwMTIxOTQwM0MwMjAwMDE5RQorOjEwMEEyMDAwM0MwMTAwMDIwMDIzMDgyMTEwMDAwMDA1QUMyMjkwMENCQworOjEwMEEzMDAwMDAxMjExNDAzQzAxMDAwMjAwMjIwODIxQUMyMDkwMEM2MQorOjEwMEE0MDAwM0MwMzAwMDE4QzYzNkQ5ODI0MDIwMDAxMTA2MjAwMDNENgorOjEwMEE1MDAwMDAwMDAwMDAwQzAwM0RBRjAwMDAwMDAwOEZCRjAwMzAyMAorOjEwMEE2MDAwOEZCMzAwMkM4RkIyMDAyODhGQjEwMDI0OEZCMDAwMjBFQworOjEwMEE3MDAwMDNFMDAwMDgyN0JEMDAzODI3QkRGRkIwQUZCMzAwM0MzRQorOjEwMEE4MDAwMDAwMDk4MjFBRkI1MDA0MDAwMDBBODIxQUZCMTAwMzRBQworOjEwMEE5MDAwMDAwMDg4MjEyNDAyMDAwMkFGQkYwMDQ4QUZCRTAwNDQxRQorOjEwMEFBMDAwQUZCMjAwMzhBRkIwMDAzMEFGQTQwMDJDQTdBMDAwMUEzRQorOjEwMEFCMDAwQTdBMDAwMThBN0EwMDAyMEE3QTAwMDFFQTdBMDAwMjJBMgorOjEwMEFDMDAwMTBBMjAxMzBBN0EwMDAxQzJDQTIwMDAzMTA0MDAwMDVCQQorOjEwMEFEMDAwMjQwMjAwMDExMEEyMDAwQTNDMDI0MDAwMTAwMDAyNUQ0NgorOjEwMEFFMDAwMDIyMDEwMjEyNDAyMDAwNDEwQTIwMjBBMjQwMjAwMDg5RAorOjEwMEFGMDAwMTBBMjAyMDgwMjIwMTAyMTEwMDAwMjU2MDAwMDAwMDA3RgorOjEwMEIwMDAwOEZBODAwMkMwMDA4ODE0MDNDMDMwMDAyMDA3MDE4MjFDRgorOjEwMEIxMDAwOEM2MzhGRkMwMDYyMTAyNDE0NDAwMDA5MjQwNDAwMDEzRgorOjEwMEIyMDAwM0MwMjdGRkYzNDQyRkZGRjAwNjI4ODI0M0MwMTAwMDI0OAorOjEwMEIzMDAwMDAzMDA4MjFBQzMxOEZGNDEwMDAwMjQ2MDIyMDEwMjE1MQorOjEwMEI0MDAwMjQwNTAwMDEwQzAwNDU3QzI3QTYwMDE4MjQwNDAwMDFBMAorOjEwMEI1MDAwMjQwNTAwMDEwQzAwNDU3QzI3QTYwMDE4OTdBMjAwMTg2OAorOjEwMEI2MDAwMzA0MjAwMDQxMDQwMDBEOTNDMTE0MDAwM0MwMjAwMDExQQorOjEwMEI3MDAwOEM0MjZGNDAyNDQzRkZGRjJDNjIwMDA2MTA0MDAwRDlENgorOjEwMEI4MDAwMDAwMzEwODAzQzAxMDAwMTAwMjIwODIxOEMyMjZDNjhDNworOjEwMEI5MDAwMDA0MDAwMDgwMDAwMDAwMDI0MDQwMDAxMjQwNTAwMTFBQQorOjEwMEJBMDAwMjdCMDAwMUEwQzAwNDU3QzAyMDAzMDIxMjQwNDAwMDEwQgorOjEwMEJCMDAwMjQwNTAwMTEwQzAwNDU3QzAyMDAzMDIxOTdBMzAwMUE4NworOjEwMEJDMDAwMzA2MjQwMDAxMDQwMDAwMjNDMTUwMDEwM0MxNTAwMDg0NworOjEwMEJEMDAwMzA2MjgwMDAxMDQwMDBBQTNDMTMwMDAxMTAwMDAwQTgwMQorOjEwMEJFMDAwM0MxMzAwMDIyNDA0MDAwMTI0MDUwMDE0MjdCMDAwMUE1RAorOjEwMEJGMDAwMEMwMDQ1N0MwMjAwMzAyMTI0MDQwMDAxMjQwNTAwMTQ2RgorOjEwMEMwMDAwMEMwMDQ1N0MwMjAwMzAyMTk3QTMwMDFBMzA2MjEwMDBDRQorOjEwMEMxMDAwMTA0MDAwMDIzQzE1MDAxMDNDMTUwMDA4MzA2MjA4MDAyRQorOjEwMEMyMDAwMTA0MDAwOTczQzEzMDAwMTEwMDAwMDk1M0MxMzAwMDI5NworOjEwMEMzMDAwMjQwNDAwMDEyNDA1MDAxOTI3QjAwMDFDMEMwMDQ1N0M4OQorOjEwMEM0MDAwMDIwMDMwMjEyNDA0MDAwMTI0MDUwMDE5MEMwMDQ1N0MxOQorOjEwMEM1MDAwMDIwMDMwMjE5N0EyMDAxQzMwNDMwNzAwMjQwMjA0MDA0OAorOjEwMEM2MDAwMTA2MjAwMjcyODYyMDQwMTEwNDAwMDBFMjQwMjAyMDBENgorOjEwMEM3MDAwMTA2MjAwMUYyODYyMDIwMTEwNDAwMDA1MjQwMjAxMDBEQQorOjEwMEM4MDAwNTA2MjAwMUUzQzEzMDAwMTEwMDAwMDFFMjQwNDAwMDFFRAorOjEwMEM5MDAwMjQwMjAzMDA1MDYyMDAxOTNDMTMwMDAyMTAwMDAwMTlFNgorOjEwMENBMDAwMjQwNDAwMDEyNDAyMDYwMDEwNjIwMDBEMjg2MjA2MDFERgorOjEwMENCMDAwMTA0MDAwMDUyNDAyMDUwMDUwNjIwMDBCM0MxMzAwMDJBNgorOjEwMENDMDAwMTAwMDAwMTAyNDA0MDAwMTI0MDIwNzAwMTQ2MjAwMEQyQgorOjEwMENEMDAwMjQwNDAwMDEzQzEzMDAwNDEwMDAwMDBBM0MxNTAwMDgyNQorOjEwMENFMDAwMTAwMDAwMDYzQzEzMDAwNDEwMDAwMDA1M0MxNTAwMDgyRAorOjEwMENGMDAwM0MxMzAwMDExMDAwMDAwMjNDMTUwMDA4M0MxNTAwMTBEOAorOjEwMEQwMDAwMjQwNDAwMDEyNDA1MDAxODI3QjAwMDFFMEMwMDQ1N0NCNworOjEwMEQxMDAwMDIwMDMwMjEyNDA0MDAwMTI0MDUwMDE4MEMwMDQ1N0M0OQorOjEwMEQyMDAwMDIwMDMwMjE4RkE4MDAyQzk3QTcwMDFFMDAwODExNDA1OAorOjEwMEQzMDAwM0MwNjAwMDIwMEMyMzAyMThDQzY4RkY0OTdBMjAwMjIyQworOjEwMEQ0MDAwM0MxMDAwMDEyNjEwNkM1QzAyMDAyMDIxQUZBMjAwMTBCNAorOjEwMEQ1MDAwOTdBMjAwMUMzQzA1MDAwQzM0QTUwMzAzMEMwMDJCM0JBMAorOjEwMEQ2MDAwQUZBMjAwMTQzQzAyMDAwNDE2NjIwMDEwM0MwMjAwMDExNQorOjEwMEQ3MDAwOEY4NDAwNTQyNDAzMDAwMTI0MDIwMDAyM0MwMTAwMDE3RQorOjEwMEQ4MDAwQUMyMzZEOUMzQzAxMDAwMUFDMjI2RDk4M0MwMTAwMDEzQworOjEwMEQ5MDAwQUMyMzZEQTQzQzAxMDAwMUFDMjM2RTI0M0MwMTAwMDE5NgorOjEwMERBMDAwQUMyNDZGMzAxMDAwMDA0RjAyQjM4ODI1MTY2MjAwMzk2MgorOjEwMERCMDAwM0MwMjgwMDAzQzAyMDAwMThDNDI2RTIwMTQ0MDAwMUU2OAorOjEwMERDMDAwMjQwNDAwMTgwMDAwMjAyMTAwMDAyODIxMEMwMDREREIyNQorOjEwMEREMDAwMzQwNjgwMDA4RjgzMDA1NDhGODIwMDU0MDJCMzg4MjUyQworOjEwMERFMDAwMTAwMDAwMDIyNDYzMDAzMjhGODIwMDU0MDA2MjEwMjMzRQorOjEwMERGMDAwMkM0MjAwMzMxNDQwRkZGQzAwMDAwMDAwOEY4MzAwNTQ5RAorOjEwMEUwMDAwMjQwMjAwMDEzQzAxMDAwMUFDMjI2RTIwM0MwMTAwMDFFMworOjEwMEUxMDAwQUMyMjZEOUMzQzAxMDAwMUFDMjI2RDk4M0MwMTAwMDFBQworOjEwMEUyMDAwQUMyMjZEQTQzQzAxMDAwMUFDMjI2RTI0M0MwMTAwMDEwNworOjEwMEUzMDAwMTAwMDAwMkNBQzIzNkYzMDAwMDAyODIxMEMwMDREREI4QgorOjEwMEU0MDAwMjQwNjA0MDQwMDAwMjAyMTI0MDUwMDFFMjdBNjAwMTgwMworOjEwMEU1MDAwMjQwMjAwMDIwQzAwNDVCRUE3QTIwMDE4MDAwMDIwMjFCOQorOjEwMEU2MDAwMDAwMDI4MjEyN0E2MDAxODBDMDA0NUJFQTdBMDAwMThFNgorOjEwMEU3MDAwMjQwNDAwMTgyNDA1MDAwMjBDMDA0RERCMjQwNjAwMDRBNQorOjEwMEU4MDAwM0MwMjgwMDAwMjIyMTAyNTAyQjMxODI1MTAwMDAwMTUzNAorOjEwMEU5MDAwMDA0Mzg4MjUwMjIyMTAyNTAyNzUxODI1MDA0Mzg4MjU2NQorOjEwMEVBMDAwMDIwMDIwMjE5N0E2MDAxQzNDMDcwMDAxOENFNzZEOThFQQorOjEwMEVCMDAwM0MwNTAwMEMzNEE1MDMyNkFGQjMwMDEwMEMwMDJCM0JGRgorOjEwMEVDMDAwQUZCMTAwMTQxMDAwMDAwNzAwMDAwMDAwM0MxMTAwMDI0OAorOjEwMEVEMDAwMDIzMDg4MjE4RTMxOEZGQzNDMDI3RkZGMzQ0MkZGRkZCRAorOjEwMEVFMDAwMDIyMjg4MjQzQzAyMDAwMThDNDI2REE4MTA0MDAwMUVBMgorOjEwMEVGMDAwMDAwMDAwMDAzQzAyMDAwMThDNDI2RjFDMTA0MDAwMDIwOAorOjEwMEYwMDAwM0MwMjIwMDAwMjIyODgyNThGQTgwMDJDMDAwODExNDBGNgorOjEwMEYxMDAwM0MwMTAwMDIwMDIyMDgyMThDMjI5MDAwMTA0MDAwMDNCNgorOjEwMEYyMDAwM0MwMjAwMjAxMDAwMDAwNTAyMjI4ODI1M0MwMkZGREY2MQorOjEwMEYzMDAwMzQ0MkZGRkYwMjIyODgyNDhGQTgwMDJDMDAwODExNDBCMQorOjEwMEY0MDAwM0MwMTAwMDIwMDIyMDgyMThDMjI5MDA4MTA0MDAwMDM3RQorOjEwMEY1MDAwM0MwMjAwODAxMDAwMDAwNDAyMjI4ODI1M0MwMkZGN0YzMgorOjEwMEY2MDAwMzQ0MkZGRkYwMjIyODgyNDhGQTgwMDJDMDAwODExNDA4MQorOjEwMEY3MDAwM0MwMTAwMDIwMDIyMDgyMUFDMzE4RkY0MTAwMDAxMzU0MQorOjEwMEY4MDAwMDIyMDEwMjE4RkE4MDAyQzAwMDhGMTQwM0MwMzAwMDIzMQorOjEwMEY5MDAwMDA3RTE4MjE4QzYzOEZGODNDMDI0MDAwMDA2MjEwMjQxMAorOjEwMEZBMDAwMTQ0MDAwMDkyNDA0MDAwMTNDMDI3RkZGMzQ0MkZGRkY4QgorOjEwMEZCMDAwMDA2Mjg4MjQzQzAxMDAwMjAwM0UwODIxQUMzMThGRjAyMQorOjEwMEZDMDAwMTAwMDAxMjQwMjIwMTAyMTAwMDAyODIxMEMwMDQ1N0M4MworOjEwMEZEMDAwMjdBNjAwMTgyNDA0MDAwMTAwMDAyODIxMEMwMDQ1N0NFRAorOjEwMEZFMDAwMjdBNjAwMTgyNDA0MDAwMTI0MDUwMDAxMjdCMjAwMjBEMAorOjEwMEZGMDAwMEMwMDQ1N0MwMjQwMzAyMTI0MDQwMDAxMjQwNTAwMDEzRQorOjEwMTAwMDAwMEMwMDQ1N0MwMjQwMzAyMTI0MDQwMDAxMjQwNTAwMDQyQQorOjEwMTAxMDAwMjdCMTAwMUUwQzAwNDU3QzAyMjAzMDIxMjQwNDAwMDE3MQorOjEwMTAyMDAwMjQwNTAwMDQwQzAwNDU3QzAyMjAzMDIxMjQwNDAwMDEyQQorOjEwMTAzMDAwMjQwNTAwMDUyN0IwMDAyMjBDMDA0NTdDMDIwMDMwMjE2OQorOjEwMTA0MDAwMjQwNDAwMDEyNDA1MDAwNTBDMDA0NTdDMDIwMDMwMjEyOQorOjEwMTA1MDAwMjQwNDAwMDEyNDA1MDAxMDBDMDA0NTdDMjdBNjAwMTg3QworOjEwMTA2MDAwMjQwNDAwMDEyNDA1MDAxMDBDMDA0NTdDMjdBNjAwMTg2QworOjEwMTA3MDAwMjQwNDAwMDEyNDA1MDAwQTBDMDA0NTdDMDI0MDMwMjFCNAorOjEwMTA4MDAwMjQwNDAwMDEyNDA1MDAwQTBDMDA0NTdDMDI0MDMwMjFBNAorOjEwMTA5MDAwMjQwNDAwMDEyNDA1MDAxODBDMDA0NTdDMDIyMDMwMjFBNgorOjEwMTBBMDAwMjQwNDAwMDEyNDA1MDAxODBDMDA0NTdDMDIyMDMwMjE5NgorOjEwMTBCMDAwMjQwNDAwMDEyNDA1MDAwMTBDMDA0NTdDMjdBNjAwMTgyQgorOjEwMTBDMDAwMjQwNDAwMDEyNDA1MDAwMTBDMDA0NTdDMjdBNjAwMTgxQgorOjEwMTBEMDAwOTdBMjAwMTgzMDQyMDAwNDEwNDAwMDY2M0MxMTQwMDAwNgorOjEwMTBFMDAwM0MwMzAwMDE4QzYzNkYzNDI0MDIwMDA1MTQ2MjAwNjcyNgorOjEwMTBGMDAwMjQwNDAwMDEyNDA1MDAxOTI3QjAwMDFDMEMwMDQ1N0NDNQorOjEwMTEwMDAwMDIwMDMwMjEyNDA0MDAwMTI0MDUwMDE5MEMwMDQ1N0M1NAorOjEwMTExMDAwMDIwMDMwMjE5N0EyMDAxQzMwNDMwNzAwMjQwMjA0MDA4MworOjEwMTEyMDAwMTA2MjAwMjcyODYyMDQwMTEwNDAwMDBFMjQwMjAyMDAxMQorOjEwMTEzMDAwMTA2MjAwMUYyODYyMDIwMTEwNDAwMDA1MjQwMjAxMDAxNQorOjEwMTE0MDAwNTA2MjAwMUUzQzEzMDAwMTEwMDAwMDFFM0MwMjAwMDQwRgorOjEwMTE1MDAwMjQwMjAzMDA1MDYyMDAxOTNDMTMwMDAyMTAwMDAwMTkyMQorOjEwMTE2MDAwM0MwMjAwMDQyNDAyMDYwMDEwNjIwMDBEMjg2MjA2MDEwMQorOjEwMTE3MDAwMTA0MDAwMDUyNDAyMDUwMDUwNjIwMDBCM0MxMzAwMDJFMQorOjEwMTE4MDAwMTAwMDAwMTAzQzAyMDAwNDI0MDIwNzAwMTQ2MjAwMEQ0RAorOjEwMTE5MDAwM0MwMjAwMDQzQzEzMDAwNDEwMDAwMDBBM0MxNTAwMDg0NworOjEwMTFBMDAwMTAwMDAwMDYzQzEzMDAwNDEwMDAwMDA1M0MxNTAwMDg2OAorOjEwMTFCMDAwM0MxMzAwMDExMDAwMDAwMjNDMTUwMDA4M0MxNTAwMTAxMworOjEwMTFDMDAwM0MwMjAwMDQxMjYyMDAxNzNDMDI4MDAwOEY4MjAwNTQyRgorOjEwMTFEMDAwMjQxMDAwMDEzQzAxMDAwMUFDMzA2RDlDM0MwMTAwMDE3OQorOjEwMTFFMDAwQUMzMDZEOTgzQzAxMDAwMUFDMzA2REE0M0MwMTAwMDFCNQorOjEwMTFGMDAwQUMzMDZFMjQzQzAxMDAwMUFDMjI2RjMwM0MwMjAwMDE5NworOjEwMTIwMDAwMTY2MjAwMjIwMjc1ODgyNTAwMDAyMDIxMDAwMDI4MjE5NgorOjEwMTIxMDAwMEMwMDREREIzNDA2ODAwMDNDMDEwMDAxMTAwMDAwMUI3NworOjEwMTIyMDAwQUMzMDZFMjAwMjIyMTAyNTAyQjMxODI1MDA0Mzg4MjUxOQorOjEwMTIzMDAwOTdBNjAwMUMzQzAyMDAwMThDNDI2RjFDM0MwNzAwMDE3OQorOjEwMTI0MDAwOENFNzZEOTgzQzA0MDAwMTI0ODQ2QzVDQUZBMjAwMTAxNAorOjEwMTI1MDAwOTdBMjAwMUUzQzA1MDAwQzM0QTUwMzIzM0MwMTAwMDFBRAorOjEwMTI2MDAwQUMyMDZFMjAwQzAwMkIzQkFGQTIwMDE0MTAwMDAwMDczNgorOjEwMTI3MDAwMDAwMDAwMDAzQzExMDAwMjAyM0U4ODIxOEUzMThGRjBGOAorOjEwMTI4MDAwM0MwMjdGRkYzNDQyRkZGRjAyMjI4ODI0M0MwMjAwMDExRgorOjEwMTI5MDAwOEM0MjZEQTgxMDQwMDA2OTAwMDAwMDAwM0MwMjAwMDE3MworOjEwMTJBMDAwOEM0MjZGMUMxMDQwMDAwMjNDMDIyMDAwMDIyMjg4MjU2NAorOjEwMTJCMDAwOEZBODAwMkMwMDA4MTE0MDNDMDEwMDAyMDAyMjA4MjFFOAorOjEwMTJDMDAwOEMyMjkwMDQxMDQwMDAwMzNDMDIwMDIwMTAwMDAwMDUxNgorOjEwMTJEMDAwMDIyMjg4MjUzQzAyRkZERjM0NDJGRkZGMDIyMjg4MjRERAorOjEwMTJFMDAwOEZBODAwMkMwMDA4MTE0MDNDMDEwMDAyMDAyMjA4MjFCOAorOjEwMTJGMDAwOEMyMjkwMEMxMDQwMDAwMzNDMDIwMDgwMTAwMDAwNEYzNAorOjEwMTMwMDAwMDIyMjg4MjUzQzAyRkY3RjM0NDJGRkZGMTAwMDAwNEI4MQorOjEwMTMxMDAwMDIyMjg4MjQ4RkE4MDAyQzAwMDgyOTQwM0MwMzAwMDJFOAorOjEwMTMyMDAwMDA2NTE4MjE4QzYzOEZGODNDMDI0MDAwMDA2MjEwMjQ5NQorOjEwMTMzMDAwMTQ0MDAwMDgzQzAyN0ZGRjM0NDJGRkZGMDA2Mjg4MjQxMworOjEwMTM0MDAwM0MwMTAwMDIwMDI1MDgyMUFDMzE4RkYwMTAwMDAwNDE2MworOjEwMTM1MDAwMDIyMDEwMjEzQzAyMDAwMThDNDI2REE4MTA0MDAwMzQ5NAorOjEwMTM2MDAwM0MxMUMwMEMzQzAyMDAwMThDNDI2RTQ0M0MwNEMwMEM5OQorOjEwMTM3MDAwMzQ4NDIwMDAzQzAzMDAwMThDNjM2RjFDMDAwMjEwMkI5RQorOjEwMTM4MDAwMDAwMjEwMjMwMDQ0MTAyNDEwNjAwMDAzMDA1MTg4MjUzRgorOjEwMTM5MDAwM0MwMjIwMDAwMjIyODgyNTNDMDIwMDAyMDA0NTEwMjE2OAorOjEwMTNBMDAwOEM0MjkwMDQxMDQwMDAwMzNDMDIwMDIwMTAwMDAwMDQxNgorOjEwMTNCMDAwMDIyMjg4MjUzQzAyRkZERjM0NDJGRkZGMDIyMjg4MjRGQworOjEwMTNDMDAwOEZBODAwMkMwMDA4MTE0MDNDMDEwMDAyMDAyMjA4MjFENworOjEwMTNEMDAwOEMyMjkwMEMxMDQwMDAwMzNDMDIwMDgwMTAwMDAwMDQ5RQorOjEwMTNFMDAwMDIyMjg4MjUzQzAyRkY3RjM0NDJGRkZGMDIyMjg4MjQyQworOjEwMTNGMDAwM0MwMjAwMDE4QzQyNkUzMDEwNDAwMDAyM0MwMjA4MDBBQQorOjEwMTQwMDAwMDIyMjg4MjUzQzAyMDAwMThDNDI2RTM0MTA0MDAwMDIwQQorOjEwMTQxMDAwM0MwMjA0MDAwMjIyODgyNTNDMDIwMDAxOEM0MjZFMzgwNgorOjEwMTQyMDAwMTA0MDAwMDYzQzAyMDEwMDEwMDAwMDA0MDIyMjg4MjU0MgorOjEwMTQzMDAwM0MwMjdGRkYzNDQyRkZGRjAwNjI4ODI0OEZBODAwMkMwQgorOjEwMTQ0MDAwMDAwODExNDAzQzAxMDAwMjAwMjIwODIxQUMzMThGRjA1RAorOjEwMTQ1MDAwMDIyMDEwMjE4RkJGMDA0ODhGQkUwMDQ0OEZCNTAwNDA4RQorOjEwMTQ2MDAwOEZCMzAwM0M4RkIyMDAzODhGQjEwMDM0OEZCMDAwMzBBMgorOjEwMTQ3MDAwMDNFMDAwMDgyN0JEMDA1MDI3QkRGRkQwQUZCMjAwMjgxMQorOjEwMTQ4MDAwMDA4MDkwMjFBRkJGMDAyQ0FGQjEwMDI0QUZCMDAwMjA4RQorOjEwMTQ5MDAwOEY4NDAyMDAzQzEwMDAwMThFMTA2RDk4OEY4NjAyMjAxMAorOjEwMTRBMDAwMjQwMjAwMDIxMjAyMDA1QzJFMDIwMDAzMTA0MDAwMDUxQworOjEwMTRCMDAwMjQwMjAwMDExMjAyMDAwQTAwMTIxOTQwMTAwMDAxMEM1RgorOjEwMTRDMDAwMDAwMDAwMDAyNDAyMDAwNDEyMDIwMEJGMjQwMjAwMDhGMQorOjEwMTREMDAwMTIwMjAwQkUwMDEyODk0MDEwMDAwMTA1MDAwMDAwMDA0OQorOjEwMTRFMDAwM0MwNTAwMDIwMEEzMjgyMThDQTU4RkZDM0MxMDAwMDJDMworOjEwMTRGMDAwMDIwMzgwMjE4RTEwOEZGNDNDMDI0MDAwMDBBMjEwMjREMQorOjEwMTUwMDAwMTA0MDAwMzgzQzAyMDAwODAyMDIxMDI0MTA0MDAwMjA2NQorOjEwMTUxMDAwMzQ4NDAwMDIzQzAyMDAwMjAwNDMxMDIxOEM0MjkwMDBGRgorOjEwMTUyMDAwMTA0MDAwMDUzNDg0MDAyMDM0ODQwMTAwM0MwMjAwMjA3NworOjEwMTUzMDAwMTAwMDAwMDYwMjAyODAyNTI0MDJGRUZGMDA4MjIwMjQwMworOjEwMTU0MDAwM0MwMkZGREYzNDQyRkZGRjAyMDI4MDI0MDAxMjExNDAwMAorOjEwMTU1MDAwM0MwMTAwMDIwMDIyMDgyMThDMjI5MDA4MTA0MDAwMDU2NgorOjEwMTU2MDAwM0MwMjAwMDEwMEMyMzAyNTNDMDIwMDgwMTAwMDAwMTY0MQorOjEwMTU3MDAwMDIwMjgwMjUzQzAyRkZGRTM0NDJGRkZGMDBDMjMwMjRGRAorOjEwMTU4MDAwM0MwMkZGN0YzNDQyRkZGRjEwMDAwMDBGMDIwMjgwMjQ2NAorOjEwMTU5MDAwMjQwMkZFREYwMDgyMjAyNDNDMDJGRkZFMzQ0MkZGRkZEMworOjEwMTVBMDAwMDBDMjMwMjQzQzAyRkY1RjM0NDJGRkZGMDIwMjgwMjQ2RAorOjEwMTVCMDAwM0MwMTAwMDIwMDIzMDgyMUFDMjA5MDAwM0MwMTAwMDIwNQorOjEwMTVDMDAwMDAyMzA4MjFBQzIwOTAwOEFGODQwMjAwQUY4NjAyMjBERgorOjEwMTVEMDAwOEY4MjAyMjAzNDQyMDAwMkFGODIwMjIwMTAwMDAwMEFGMworOjEwMTVFMDAwMDAxMjExNDAzQzAyQkZGRjM0NDJGRkZGOEY4MzAyMDAxNAorOjEwMTVGMDAwMDIwMjgwMjQyNDAyRkZGRDAwNjIxODI0MEMwMDNEQUY4QgorOjEwMTYwMDAwQUY4MzAyMDAwMDEyMTE0MDNDMDEwMDAyMDAyMjA4MjFCOQorOjEwMTYxMDAwMTAwMDAwQjdBQzMwOEZGNDNDMDIwMDAxOEM0MjZGMUMwQworOjEwMTYyMDAwMTA0MDAwNjkyNDA1MDAwNDI0MDQwMDAxMEMwMDQ1N0NERQorOjEwMTYzMDAwMjdBNjAwMTgyNDA0MDAwMTI0MDUwMDA1MEMwMDQ1N0NBMQorOjEwMTY0MDAwMjdBNjAwMUE5N0EzMDAxODk3QTIwMDFBM0MwNDAwMDFDRAorOjEwMTY1MDAwMjQ4NDZFNDgzMDYzMEMwMDAwMDMxQTgyMzA0MjBDMDA3MAorOjEwMTY2MDAwMDAwMjEyODJBN0EyMDAxQTAwMDIxMDgwMDA0NDEwMjE3QQorOjEwMTY3MDAwMDA0MzEwMjFBN0EzMDAxODkwNDgwMDAwMjQwMjAwMDE5NQorOjEwMTY4MDAwMzEwM0ZGRkYxMDYyMDAyOTI4NjIwMDAyMTA0MDAwMDVBQworOjEwMTY5MDAwMDAwMDAwMDAxMDYwMDAwOTAwMDAwMDAwMTAwMDAwM0Q4NAorOjEwMTZBMDAwMDAwMDAwMDAxMDcwMDAxMzI0MDIwMDAzMTA2MjAwMkNFMAorOjEwMTZCMDAwMDAwMDAwMDAxMDAwMDAzNzAwMDAwMDAwOEY4MjAyMDBEMAorOjEwMTZDMDAwMjQwM0ZFRkYwMDQzMTAyNEFGODIwMjAwOEY4MjAyMjAxOQorOjEwMTZEMDAwM0MwM0ZGRkUzNDYzRkZGRjAwNDMxMDI0QUY4MjAyMjA2RgorOjEwMTZFMDAwM0MwMTAwMDJBQzIwOTAwNDNDMDEwMDAyMTAwMDAwMzJEQQorOjEwMTZGMDAwQUMyMDkwMEM4RjgyMDIwMDM0NDIwMTAwQUY4MjAyMDBDNQorOjEwMTcwMDAwOEY4MjAyMjAzQzAzRkZGRTM0NjNGRkZGMDA0MzEwMjQ1RQorOjEwMTcxMDAwQUY4MjAyMjAyNDAyMDEwMDNDMDEwMDAyQUMyMjkwMDRBRQorOjEwMTcyMDAwM0MwMTAwMDIxMDAwMDAyNEFDMjA5MDBDOEY4MjAyMDBDQgorOjEwMTczMDAwMjQwM0ZFRkYwMDQzMTAyNEFGODIwMjAwOEY4MjAyMjBBOAorOjEwMTc0MDAwM0MwMzAwMDEwMDQzMTAyNUFGODIwMjIwM0MwMTAwMDI0RgorOjEwMTc1MDAwQUMyMDkwMDQzQzAxMDAwMjEwMDAwMDE3QUMyMzkwMEM1OAorOjEwMTc2MDAwOEY4MjAyMDAzNDQyMDEwMEFGODIwMjAwOEY4MjAyMjA4OQorOjEwMTc3MDAwM0MwMzAwMDEwMDQzMTAyNUFGODIwMjIwMjQwMjAxMDAzNworOjEwMTc4MDAwM0MwMTAwMDJBQzIyOTAwNDNDMDEwMDAyMTAwMDAwMEE1RgorOjEwMTc5MDAwQUMyMzkwMEMzQzA0MDAwMTI0ODQ2QzgwOTdBNjAwMUFCMgorOjEwMTdBMDAwOTdBNzAwMTgzQzA1MDAwMTM0QTVGRkZGQUZBODAwMTA2MworOjEwMTdCMDAwMEMwMDJCM0JBRkEwMDAxNDhGODIwMjAwMzQ0MjAwMDJDOQorOjEwMTdDMDAwMTAwMDAwNEJBRjgyMDIwMDAwMTI4OTQwM0MwNTAwMDI2RAorOjEwMTdEMDAwMDBCMTI4MjE4Q0E1OEZGODNDMTAwMDAyMDIxMTgwMjE1NQorOjEwMTdFMDAwOEUxMDhGRjAzQzAyNDAwMDAwQTIxMDI0MTQ0MDAwMTAyNAorOjEwMTdGMDAwMDAwMDAwMDAzQzAyMDAwMThDNDI2RjFDMTQ0MDAwMDVGOAorOjEwMTgwMDAwM0MwMkJGRkY4RjgyMDIwMDM0NDIwMDAyQUY4MjAyMDAxRQorOjEwMTgxMDAwM0MwMkJGRkYzNDQyRkZGRjBDMDAzREFGMDIwMjgwMjRCOAorOjEwMTgyMDAwM0MwMTAwMDIwMDMxMDgyMTEwMDAwMDMxQUMzMDhGRjA4MworOjEwMTgzMDAwM0MwMjAwMDE4QzQyNkYxQzEwNDAwMDA1M0MwMjAwMjA1RAorOjEwMTg0MDAwM0MwMjAwMDE4QzQyNkU0NDEwNDAwMDI1M0MwMjAwMjAwNgorOjEwMTg1MDAwMDBBMjEwMjQxMDQwMDAwNzM0ODQwMDIwMjQwMjAxMDA1QworOjEwMTg2MDAwM0MwMTAwMDIwMDMxMDgyMUFDMjI5MDA0MTAwMDAwMDY2NworOjEwMTg3MDAwMzQ4NDAxMDAzQzAxMDAwMjAwMzEwODIxQUMyMDkwMDRCNgorOjEwMTg4MDAwMjQwMkZFRkYwMDgyMjAyNDNDMDIwMDgwMDBBMjEwMjREQgorOjEwMTg5MDAwMTA0MDAwMDcwMDEyMTk0MDNDMDIwMDAxM0MwMTAwMDIwOAorOjEwMThBMDAwMDAyMzA4MjFBQzIyOTAwQzEwMDAwMDA4MDBDMjMwMjU1MworOjEwMThCMDAwMDAxMjExNDAzQzAxMDAwMjAwMjIwODIxQUMyMDkwMENEMworOjEwMThDMDAwM0MwMkZGRkUzNDQyRkZGRjAwQzIzMDI0QUY4NDAyMDAxRQorOjEwMThEMDAwQUY4NjAyMjA4RjgyMDIyMDM0NDIwMDAyQUY4MjAyMjBCMworOjEwMThFMDAwMDAxMjExNDAzQzAxMDAwMjAwMjIwODIxQUMzMDhGRjBCMAorOjEwMThGMDAwOEZCRjAwMkM4RkIyMDAyODhGQjEwMDI0OEZCMDAwMjA0MgorOjEwMTkwMDAwMDNFMDAwMDgyN0JEMDAzMDAwMDAwMDAwMDAwMDE4MjE5RgorOjEwMTkxMDAwMzA4NDAwRkYyNDA1RkZERjI0MDZGRkJGMDA2NDEwMDdBQQorOjEwMTkyMDAwMzA0MjAwMDExMDQwMDAwNDAwMDAwMDAwOEY4MjAwNDQ5QgorOjEwMTkzMDAwMTAwMDAwMDMzNDQyMDA0MDhGODIwMDQ0MDA0NjEwMjQwRgorOjEwMTk0MDAwQUY4MjAwNDQ4RjgyMDA0NDM0NDIwMDIwQUY4MjAwNDRDMgorOjEwMTk1MDAwOEY4MjAwNDQwMDQ1MTAyNEFGODIwMDQ0MjQ2MzAwMDFCQworOjEwMTk2MDAwMjg2MjAwMDg1NDQwRkZFRTAwNjQxMDA3MDNFMDAwMDhGRQorOjEwMTk3MDAwMDAwMDAwMDAyQzgyMDAwODEwNDAwMDFCMDAwMDAwMDA0NgorOjEwMTk4MDAwMjQwNUZGREYyNDA2RkZCRjAwMDQxODgwM0MwMjAwMDE4RAorOjEwMTk5MDAwMjQ0MjZFNjAwMDYyMTgyMTI0NjQwMDA0OTA2MjAwMDBGQQorOjEwMTlBMDAwMTA0MDAwMDQwMDAwMDAwMDhGODIwMDQ0MTAwMDAwMDM3QgorOjEwMTlCMDAwMzQ0MjAwNDA4RjgyMDA0NDAwNDYxMDI0QUY4MjAwNDQyRAorOjEwMTlDMDAwOEY4MjAwNDQzNDQyMDAyMEFGODIwMDQ0OEY4MjAwNDQ2MgorOjEwMTlEMDAwMDA0NTEwMjRBRjgyMDA0NDI0NjMwMDAxMDA2NDEwMkJGMgorOjEwMTlFMDAwMTQ0MEZGRUUwMDAwMDAwMDAzRTAwMDA4MDAwMDAwMDBDQgorOjEwMTlGMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOEY4NDAwQzQxMAorOjEwMUEwMDAwOEY4NjAwRTA4Rjg3MDBFNDI0MDJGRkY4MDBDMjI4MjRCQworOjEwMUExMDAwMTBFNTAwMUEyNzYyM0ZGODE0RTIwMDAyMjRFODAwMDhFQgorOjEwMUEyMDAwMjc2ODMwMDA1NTA1MDAwNDhEMEEwMDAwMzBDMjAwMDQwQworOjEwMUEzMDAwMTQ0MDAwMTIwMDgwNTAyMThDRTkwMDAwOEY0MjAxM0NDQworOjEwMUE0MDAwMDE0OTQ4MjMwMDQ5MTgyQjk0RUIwMDA2MTA2MDAwMDI1RQorOjEwMUE1MDAwMjU2MzAwNTAwMDQ5NDgyMTAxMjMxODJCNTA0MDAwMDMwMgorOjEwMUE2MDAwOEY0MjAxRkMwM0UwMDAwODAwRTAxMDIxQUY4ODAwRTg4RAorOjEwMUE3MDAwMjQ0MjAwMDFBRjQyMDFGQ0FGODgwMEU0MDNFMDAwMDgwQgorOjEwMUE4MDAwMDAwMDEwMjEwM0UwMDAwODAwMDAwMDAwOEY4MzAwRTQ0NAorOjEwMUE5MDAwMjc2MjNGRjgxMDYyMDAwNDI0NjIwMDA4QUY4MjAwRTg2OQorOjEwMUFBMDAwMDNFMDAwMDhBRjgyMDBFNDI3NjIzMDAwQUY4MjAwRTg2NAorOjEwMUFCMDAwMDNFMDAwMDhBRjgyMDBFNDAzRTAwMDA4MDAwMDAwMDAzQgorOjEwMUFDMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOEY4ODAxMjBERQorOjEwMUFEMDAwMjc2MjRGRTA4RjgzMDEyODE1MDIwMDAyMjUwOTAwMjBBQworOjEwMUFFMDAwMjc2OTQ4MDAxMTIzMDAxMjhGQTIwMDEwQUQwNDAwMDBFNgorOjEwMUFGMDAwQUQwNTAwMDRBRDA2MDAwOEE1MDcwMDBFOEZBMzAwMTQ3NQorOjEwMUIwMDAwQUQwMjAwMTg4RkEyMDAxOEFEMDMwMDFDMjUwMzAwMTZCQgorOjEwMUIxMDAwQUQwMjAwMTBBRDAzMDAxNEFGODkwMTIwOEY0MzAwRkMxQgorOjEwMUIyMDAwMjQwMjAwMDEyNDYzRkZGRjAzRTAwMDA4QUY0MzAwRkMzMAorOjEwMUIzMDAwOEY0MzAzMjQwMDAwMTAyMTI0NjMwMDAxMDNFMDAwMDgwOAorOjEwMUI0MDAwQUY0MzAzMjQwM0UwMDAwODAwMDAwMDAwOEY4ODAxMDA3OQorOjEwMUI1MDAwMjc2MjQ3RTA4RjgzMDEwODE1MDIwMDAyMjUwOTAwMjA1MworOjEwMUI2MDAwMjc2OTQwMDAxMTIzMDAwRjhGQTIwMDEwQUQwNDAwMDA3MAorOjEwMUI3MDAwQUQwNTAwMDRBRDA2MDAwOEE1MDcwMDBFOEZBMzAwMTRGNAorOjEwMUI4MDAwQUQwMjAwMTg4RkEyMDAxOEFEMDMwMDFDMjUwMzAwMTYzQgorOjEwMUI5MDAwQUQwMjAwMTBBRDAzMDAxNEFGODkwMTAwMDNFMDAwMDg5RQorOjEwMUJBMDAwMjQwMjAwMDE4RjQzMDMyODAwMDAxMDIxMjQ2MzAwMDE1OAorOjEwMUJCMDAwMDNFMDAwMDhBRjQzMDMyODAzRTAwMDA4MDAwMDAwMDAzMgorOjEwMUJDMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjQ0ODY1NjFFMworOjEwMUJEMDAwNjQ2NTcyM0EyMDJGNzA3MjZGNkE2NTYzNzQ3MzJGNzIzNgorOjEwMUJFMDAwNjM3MzJGNzM3NzJGNjc2NTJGMkUyRjZFNjk2MzJGNjZCMAorOjEwMUJGMDAwNzczMjJGNjM2RjZENkQ2RjZFMkY2Njc3NkQ2MTY5NkVEMworOjEwMUMwMDAwMkU2MzJDNzYyMDMxMkUzMTJFMzIyRTM0MzUyMDMxMzk3MAorOjEwMUMxMDAwMzkzOTJGMzAzMTJGMzIzNDIwMzAzMDNBMzEzMDNBMzVBMworOjEwMUMyMDAwMzUyMDczNjg3NTYxNkU2NzIwNDU3ODcwMjAyNDAwMDA0OAorOjEwMUMzMDAwNjU3Njc0NTI2RTY3NDYwMDUxNjU3Njc0NDYwMDAwMDAwMgorOjEwMUM0MDAwNTE2NTc2NzQ1MDVGNDYwMDRENjU3Njc0NTI2RTY3NDZGNgorOjEwMUM1MDAwMDAwMDAwMDA0RDUxNjU3Njc0NDYwMDAwNEQ1MTY1NzZEOAorOjEwMUM2MDAwNTA1RjQ2MDA1MTczNDM2RjZFNDk1RjQ2MDAwMDAwMDBBRAorOjEwMUM3MDAwNTE3MzQzNkY2RTczNDYwMDUxNzI1MDcyNkY2NDQ2MDAyOQorOjEwMUM4MDAwNjI2MTY0NEQ2NTZENTM3QTAwMDAwMDAwNjg3NzU2NjVBNworOjEwMUM5MDAwNzIwMDAwMDA2MjYxNjQ0ODc3NTY2NTcyMDAwMDAwMDBCRgorOjEwMUNBMDAwMkEyQTQ0NDE1NzRFNUY0MTAwMDAwMDAwNzQ3ODUyNzg2MAorOjEwMUNCMDAwNDI2NjUzN0EwMDAwMDAwMDYyNjY0MTc0NkU0RDcyNkI5QQorOjEwMUNDMDAwMDAwMDAwMDA3MjY1NjQ1QTZGNkU2NTMxMDAwMDAwMDAwQworOjEwMUNEMDAwNzA2MzY5NDM2RjZFNjYwMDY3NjU2RTQzNkY2RTY2MDA4MgorOjEwMUNFMDAwMkE2NDZENjE1MjQ0NjY2QzAwMDAwMDAwMkE1MDQxNEUyNworOjEwMUNGMDAwNDk0MzJBMDAyRTJFMkYyRTJFMkYyRTJFMkYyRTJFMkYwMgorOjEwMUQwMDAwMkUyRTJGNzM3MjYzMkY2RTY5NjMyRjY2NzczMjJGNjNDNworOjEwMUQxMDAwNkY2RDZENkY2RTJGNjY3NzZENjE2OTZFMkU2MzAwMDA1QgorOjEwMUQyMDAwNzI2MzYyNDY2QzYxNjc3MzAwMDAwMDAwNjI2MTY0NTIxNgorOjEwMUQzMDAwNzg1MjYzNjIwMDAwMDAwMDY3NkM2RjYyNDY2QzY3NzNFNAorOjEwMUQ0MDAwMDAwMDAwMDAyQjVGNjQ2OTczNzA1RjZDNkY2RjcwMDA0MAorOjEwMUQ1MDAwMkI2NTc2NUY2ODYxNkU2NDZDNjU3MjAwNjM2MTZFNzQ5QQorOjEwMUQ2MDAwMzE0NDZENjEwMDAwMDAwMDJCNzE1RjY0NkQ2MTVGNzQzMAorOjEwMUQ3MDAwNkY1RjZFNjk2MzVGNjM2QjczNzU2RDAwMkI2ODVGNzM3NAorOjEwMUQ4MDAwNjU2RTY0NUY2NDYxNzQ2MTVGNzI2NTYxNjQ3OTVGNjNFRAorOjEwMUQ5MDAwNkI3Mzc1NkQwMDAwMDAwMDJCNjg1RjY0NkQ2MTVGNzI4RQorOjEwMURBMDAwNjQ1RjYxNzM3MzY5NzM3NDVGNjM2QjczNzU2RDAwMDA1NworOjEwMURCMDAwNzQ0MzZCNzM2RDRGNkUwMDJCNzE1RjY0NkQ2MTVGNzQ2NAorOjEwMURDMDAwNkY1RjZFNjk2MzAwMDAwMDJCNjg1RjczNjU2RTY0NUYxMAorOjEwMUREMDAwNjQ2MTc0NjE1RjcyNjU2MTY0NzkwMDAwMkI2ODVGNjQ5RgorOjEwMURFMDAwNkQ2MTVGNzI2NDVGNjE3MzczNjk3Mzc0MDAwMDAwMDBGQQorOjEwMURGMDAwNzQ0MzZCNzM2RDRGNjY2NjAwMDAwMDAwMkI2ODVGNzM2MQorOjEwMUUwMDAwNjU2RTY0NUY2MjY0NUY3MjY1NjE2NDc5MDAwMDAwMDAwMgorOjEwMUUxMDAwNjg3Mzc0NTM1MjY5NkU2NzAwMDAwMDAwNjI2MTY0NTMxNgorOjEwMUUyMDAwNTI2OTZFNjcwMDAwMDAwMDZFNjk2MzUzNTI2OTZFNjcwNQorOjEwMUUzMDAwMDAwMDAwMDA3NzQ0NkQ2MTQxNkM2QzQxMDAwMDAwMDBCRgorOjEwMUU0MDAwMkI3MTVGNjQ2RDYxNUY3NDZGNUY2ODZGNzM3NDVGNjM0NAorOjEwMUU1MDAwNkI3Mzc1NkQwMDAwMDAwMDJCNjg1RjZENjE2MzVGNzJDRQorOjEwMUU2MDAwNzg1RjYzNkY2RDcwNUY2MzZCNzM3NTZEMDAwMDAwMDA2QQorOjEwMUU3MDAwMkI2ODVGNjQ2RDYxNUY3NzcyNUY2MTczNzM2OTczNzQwMAorOjEwMUU4MDAwNUY2MzZCNzM3NTZEMDAwMDcyNDM2QjczNkQ0RjZFMDAxMworOjEwMUU5MDAwMkI3MTVGNjQ2RDYxNUY3NDZGNUY2ODZGNzM3NDAwMDBCNgorOjEwMUVBMDAwMkI2ODVGNkQ2MTYzNUY3Mjc4NUY2MzZGNkQ3MDAwMDBCOAorOjEwMUVCMDAwMkI2ODVGNjQ2RDYxNUY3NzcyNUY2MTczNzM2OTczNzRDMAorOjEwMUVDMDAwMDAwMDAwMDA3MjQzNkI3MzZENEY2NjY2MDAwMDAwMDBGNworOjEwMUVEMDAwMkI2ODVGNzI2NTYzNzY1RjYyNjQ1RjcyNjU2MTY0NzlDNworOjEwMUVFMDAwMDAwMDAwMDAyQjY4NUY3MjY1NjM3NjVGNkE3NTZENjI0MworOjEwMUVGMDAwNkY1RjYyNjQ1RjcyNjU2MTY0NzkwMDAwMkI2ODVGNzI3NgorOjEwMUYwMDAwNjU2Mzc2NUY2RDY5NkU2OTVGNjI2NDVGNzI2NTYxNjQ2NworOjEwMUYxMDAwNzkwMDAwMDAyQjZENjg1RjYzNkY2RDZENjE2RTY0MDAwQQorOjEwMUYyMDAwMkI2ODVGNzQ2OTZENjU3MjAwMDAwMDAwMkI2ODVGNjQ0OAorOjEwMUYzMDAwNkY1Rjc1NzA2NDYxNzQ2NTVGNzQ3ODVGNjM2RjZFNzNGMworOjEwMUY0MDAwMDAwMDAwMDAyQjY4NUY2NDZGNUY3NTcwNjQ2MTc0NjVFQQorOjEwMUY1MDAwNUY3Mjc4NUY3MDcyNkY2NDAwMDAwMDAwMkI2MzZCNzNCOAorOjEwMUY2MDAwNzU2RDMxMzYwMDAwMDAwMDJCNzA2NTY1NkI1RjZENjEyQgorOjEwMUY3MDAwNjM1RjcyNzg1Rjc3NjEwMDJCNzA2NTY1NkI1RjZENjE4MQorOjEwMUY4MDAwNjM1RjcyNzgwMDAwMDAwMDJCNjQ2NTcxNUY2RDYxNjNCMAorOjEwMUY5MDAwNUY3Mjc4MDAyQjY4NUY2RDYxNjM1RjcyNzg1RjYxNzQ1OAorOjEwMUZBMDAwNzQ2RTAwMDA2MjYxNjQ1MjY1NzQ1MzdBMDAwMDAwMDAzMAorOjEwMUZCMDAwNzI3ODQyNjQ0MjY2NTM3QTAwMDAwMDAwMkI2RTc1NkNBMgorOjEwMUZDMDAwNkM1RjY4NjE2RTY0NkM2NTcyMDAwMDAwNjY3NzRGNzBDQworOjEwMUZEMDAwNDY2MTY5NkMwMDAwMDAwMDJCNjg1Rjc1NzA2NDYxNzQ3NQorOjEwMUZFMDAwNjU1RjZDNjU2NDM0MDAwMDJCNjg1Rjc1NzA2NDYxNzRCNAorOjEwMUZGMDAwNjU1RjZDNjU2NDM2MDAwMDJCNjg1Rjc1NzA2NDYxNzRBMgorOjEwMjAwMDAwNjU1RjZDNjU2NDMyMDAwMDY5NkU3NDUzNzQ2MTc0NjU1OQorOjEwMjAxMDAwMDAwMDAwMDAyQTJBNjk2RTY5NzQ0MzcwMDAwMDAwMDAwNQorOjEwMjAyMDAwMjM3MzYzNzI2NTYxNkQwMDY5NTM3NDYxNjM2QjQ1NzJGQworOjEwMjAzMDAwMDAwMDAwMDA3MDcyNkY2MjY1NEQ2NTZEMDAwMDAwMDA2OQorOjEwMjA0MDAwMkEyQTQ0NDE1NzRFNUY0MjAwMDAwMDAwMkI3Mzc3NUZGRAorOjEwMjA1MDAwNjQ2RDYxNUY2MTczNzM2OTczNzQ1RjcwNkM3NTczNUZENgorOjEwMjA2MDAwNzQ2OTZENjU3MjAwMDAwMDJCMjY3MDcyNjU2QzZGNjE3QgorOjEwMjA3MDAwNjQ1Rjc3NzI1RjY0NjU3MzYzNzIwMDAwMkIyNjcwNzIxMQorOjEwMjA4MDAwNjU2QzZGNjE2NDVGNzI2NDVGNjQ2NTczNjM3MjAwMDBBNgorOjEwMjA5MDAwMkI2ODVGNjg2NjVGNzQ2OTZENjU3MjAwMjQ0ODY1NjFDRQorOjEwMjBBMDAwNjQ2NTcyM0EyMDJGNzA3MjZGNkE2NTYzNzQ3MzJGNzI2MQorOjEwMjBCMDAwNjM3MzJGNzM3NzJGNjc2NTJGMkUyRjZFNjk2MzJGNjZEQgorOjEwMjBDMDAwNzczMjJGNjM2RjZENkQ2RjZFMkY3NDY5NkQ2NTcyMkUzMQorOjEwMjBEMDAwNjMyQzc2MjAzMTJFMzEyRTMyMkUzMzM1MjAzMTM5Mzk5MgorOjEwMjBFMDAwMzkyRjMwMzEyRjMyMzcyMDMxMzkzQTMwMzkzQTM1MzBDMworOjEwMjBGMDAwMjA2ODYxNzk2NTczMjA0NTc4NzAyMDI0MDAwMDAwMDAxNQorOjEwMjEwMDAwNjU3Njc0NTI2RTY3NDYwMDUxNjU3Njc0NDYwMDAwMDAyRAorOjEwMjExMDAwNTE2NTc2NzQ1MDVGNDYwMDRENjU3Njc0NTI2RTY3NDYyMQorOjEwMjEyMDAwMDAwMDAwMDA0RDUxNjU3Njc0NDYwMDAwNEQ1MTY1NzYwMworOjEwMjEzMDAwNTA1RjQ2MDA1MTczNDM2RjZFNDk1RjQ2MDAwMDAwMDBEOAorOjEwMjE0MDAwNTE3MzQzNkY2RTczNDYwMDUxNzI1MDcyNkY2NDQ2MDA1NAorOjEwMjE1MDAwNTQyRDQ0NkQ2MTUyNjQzMjAwMDAwMDAwNTQyRDQ0NkREMgorOjEwMjE2MDAwNjE1MjY0MzEwMDAwMDAwMDU0MkQ0NDZENjE1MjY0NDI5QworOjEwMjE3MDAwMDAwMDAwMDA1NDJENDQ2RDYxNTc3MjMyMDAwMDAwMDBEMQorOjEwMjE4MDAwNTQyRDQ0NkQ2MTU3NzIzMTAwMDAwMDAwNTQyRDQ0NkQ5MAorOjEwMjE5MDAwNjE1NzcyNDIwMDAwMDAwMDAwMDAwMDAwMjQ0ODY1NjFBMQorOjEwMjFBMDAwNjQ2NTcyM0EyMDJGNzA3MjZGNkE2NTYzNzQ3MzJGNzI2MAorOjEwMjFCMDAwNjM3MzJGNzM3NzJGNjc2NTJGMkUyRjZFNjk2MzJGNjZEQQorOjEwMjFDMDAwNzczMjJGNjM2RjZENkQ2RjZFMkY2MzZGNkQ2RDYxNkUwNAorOjEwMjFEMDAwNjQyRTYzMkM3NjIwMzEyRTMxMkUzMjJFMzIzODIwMzE2RgorOjEwMjFFMDAwMzkzOTM5MkYzMDMxMkYzMjMwMjAzMTM5M0EzNDM5M0FCOAorOjEwMjFGMDAwMzQzOTIwNzM2ODc1NjE2RTY3MjA0NTc4NzAyMDI0MDAzQgorOjEwMjIwMDAwNjU3Njc0NTI2RTY3NDYwMDUxNjU3Njc0NDYwMDAwMDAyQworOjEwMjIxMDAwNTE2NTc2NzQ1MDVGNDYwMDRENjU3Njc0NTI2RTY3NDYyMAorOjEwMjIyMDAwMDAwMDAwMDA0RDUxNjU3Njc0NDYwMDAwNEQ1MTY1NzYwMgorOjEwMjIzMDAwNTA1RjQ2MDA1MTczNDM2RjZFNDk1RjQ2MDAwMDAwMDBENworOjEwMjI0MDAwNTE3MzQzNkY2RTczNDYwMDUxNzI1MDcyNkY2NDQ2MDA1MworOjEwMjI1MDAwM0Y0ODYzNkQ2NDRENjI3ODAwMDAwMDAwM0Y2MzZENjQyOQorOjEwMjI2MDAwNDg3Mzc0NTMwMDAwMDAwMDNGNjM2RDY0NEQ2MzRENjQxOAorOjEwMjI3MDAwMDAwMDAwMDAzRjYzNkQ2NDUwNzI2RjZEMDAwMDAwMDA0RAorOjEwMjI4MDAwM0Y2MzZENjQ0QzY5NkU2QjAwMDAwMDAwM0Y2MzZENjREQQorOjEwMjI5MDAwNDU3MjcyMDAwMDAwODZBQzAwMDA4RTVDMDAwMDhFNUMwRgorOjEwMjJBMDAwMDAwMDhERTQwMDAwOEI3ODAwMDA4RTMwMDAwMDhFNUMxMgorOjEwMjJCMDAwMDAwMDg3OTAwMDAwODgwMDAwMDA4OTkwMDAwMDhBNjg3NAorOjEwMjJDMDAwMDAwMDhBMzQwMDAwOEU1QzAwMDA4ODcwMDAwMDhCMjRCRgorOjEwMjJEMDAwMDAwMDhFNUMwMDAwOEIzNDAwMDA4N0I0MDAwMDg4MjQ2RQorOjEwMjJFMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjQ0ODY1NjFCQworOjEwMjJGMDAwNjQ2NTcyM0EyMDJGNzA3MjZGNkE2NTYzNzQ3MzJGNzIwRgorOjEwMjMwMDAwNjM3MzJGNzM3NzJGNjc2NTJGMkUyRjZFNjk2MzJGNjY4OAorOjEwMjMxMDAwNzczMjJGNjM2RjZENkQ2RjZFMkY2RDYzNjE3Mzc0MkVFNworOjEwMjMyMDAwNjMyQzc2MjAzMTJFMzEyRTMyMkUzODIwMzEzOTM5MzgzNworOjEwMjMzMDAwMkYzMTMyMkYzMDM4MjAzMDMyM0EzMzM2M0EzMzM2MjA4QworOjEwMjM0MDAwNzM2ODc1NjE2RTY3MjA0NTc4NzAyMDI0MDAwMDAwMDA3NgorOjEwMjM1MDAwNjU3Njc0NTI2RTY3NDYwMDUxNjU3Njc0NDYwMDAwMDBEQgorOjEwMjM2MDAwNTE2NTc2NzQ1MDVGNDYwMDRENjU3Njc0NTI2RTY3NDZDRgorOjEwMjM3MDAwMDAwMDAwMDA0RDUxNjU3Njc0NDYwMDAwNEQ1MTY1NzZCMQorOjEwMjM4MDAwNTA1RjQ2MDA1MTczNDM2RjZFNDk1RjQ2MDAwMDAwMDA4NgorOjEwMjM5MDAwNTE3MzQzNkY2RTczNDYwMDUxNzI1MDcyNkY2NDQ2MDAwMgorOjEwMjNBMDAwNjE2NDY0NEQ2MzQ0NzU3MDAwMDAwMDAwNjE2NDY0NERCNQorOjEwMjNCMDAwNjM0Njc1NkMwMDAwMDAwMDY0NjU2QzRENjM0RTZGNDVBQworOjEwMjNDMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjQ0ODY1NjFEQgorOjEwMjNEMDAwNjQ2NTcyM0EyMDJGNzA3MjZGNkE2NTYzNzQ3MzJGNzIyRQorOjEwMjNFMDAwNjM3MzJGNzM3NzJGNjc2NTJGMkUyRjZFNjk2MzJGNjZBOAorOjEwMjNGMDAwNzczMjJGNjM2RjZENkQ2RjZFMkY2NDZENjEyRTYzMkM1RQorOjEwMjQwMDAwNzYyMDMxMkUzMTJFMzIyRTMyMzQyMDMxMzkzOTM4MkY4OAorOjEwMjQxMDAwMzEzMjJGMzIzMTIwMzAzMDNBMzMzMzNBMzAzOTIwNzM3MQorOjEwMjQyMDAwNjg3NTYxNkU2NzIwNDU3ODcwMjAyNDAwNjU3Njc0NTI2NworOjEwMjQzMDAwNkU2NzQ2MDA1MTY1NzY3NDQ2MDAwMDAwNTE2NTc2NzRGQgorOjEwMjQ0MDAwNTA1RjQ2MDA0RDY1NzY3NDUyNkU2NzQ2MDAwMDAwMDA4RQorOjEwMjQ1MDAwNEQ1MTY1NzY3NDQ2MDAwMDRENTE2NTc2NTA1RjQ2MDBEQgorOjEwMjQ2MDAwNTE3MzQzNkY2RTQ5NUY0NjAwMDAwMDAwNTE3MzQzNkYyNAorOjEwMjQ3MDAwNkU3MzQ2MDA1MTcyNTA3MjZGNjQ0NjAwNzM3NzQ0NkRGQworOjEwMjQ4MDAwNjE0RjY2NjYwMDAwMDAwMDMxNDQ2RDYxNEY2RTAwMDBEMAorOjEwMjQ5MDAwNzM3NzQ0NkQ2MTRGNkUwMDIzNzI0NDZENjE0MTU0NEVGOQorOjEwMjRBMDAwMDAwMDAwMDA3MjQ0NkQ2MTQxNTQ0RTMwMDAwMDAwMDA5NQorOjEwMjRCMDAwNzI0NDZENjE0MTU0NEUzMTAwMDAwMDAwNzI0NDZENjEwMAorOjEwMjRDMDAwMzQ0NzYyMDAyQTUwNDE0RTQ5NDMyQTAwMkUyRTJGMkVCNworOjEwMjREMDAwMkUyRjJFMkUyRjJFMkUyRjJFMkUyRjczNzI2MzJGNkUxOQorOjEwMjRFMDAwNjk2MzJGNjY3NzMyMkY2MzZGNkQ2RDZGNkUyRjY0NkQyQQorOjEwMjRGMDAwNjEyRTYzMDAyMzc3NDQ2RDYxNDE1NDRFMDAwMDAwMDA1QgorOjEwMjUwMDAwNzc0NDZENjE0MTU0NEUzMDAwMDAwMDAwNzc0NDZENjFBNgorOjEwMjUxMDAwNDE1NDRFMzEwMDAwMDAwMDc3NDQ2RDYxMzQ0NzYyMDA0MQorOjEwMjUyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjQ0ODY1NjE3OQorOjEwMjUzMDAwNjQ2NTcyM0EyMDJGNzA3MjZGNkE2NTYzNzQ3MzJGNzJDQworOjEwMjU0MDAwNjM3MzJGNzM3NzJGNjc2NTJGMkUyRjZFNjk2MzJGNjY0NgorOjEwMjU1MDAwNzczMjJGNjM2RjZENkQ2RjZFMkY3NDcyNjE2MzY1MkVBRQorOjEwMjU2MDAwNjMyQzc2MjAzMTJFMzEyRTMyMkUzNTIwMzEzOTM5MzhGOAorOjEwMjU3MDAwMkYzMDM5MkYzMzMwMjAzMTM4M0EzNTMwM0EzMjM4MjA0NQorOjEwMjU4MDAwNzM2ODc1NjE2RTY3MjA0NTc4NzAyMDI0MDAwMDAwMDAzNAorOjEwMjU5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjQ0ODY1NjEwOQorOjEwMjVBMDAwNjQ2NTcyM0EyMDJGNzA3MjZGNkE2NTYzNzQ3MzJGNzI1QworOjEwMjVCMDAwNjM3MzJGNzM3NzJGNjc2NTJGMkUyRjZFNjk2MzJGNjZENgorOjEwMjVDMDAwNzczMjJGNjM2RjZENkQ2RjZFMkY2NDYxNzQ2MTJFNjM1MAorOjEwMjVEMDAwMkM3NjIwMzEyRTMxMkUzMjJFMzEzMjIwMzEzOTM5MzlCQworOjEwMjVFMDAwMkYzMDMxMkYzMjMwMjAzMTM5M0EzNDM5M0EzNTMxMjBEOQorOjEwMjVGMDAwNzM2ODc1NjE2RTY3MjA0NTc4NzAyMDI0MDAwMDAwMDBDNAorOjEwMjYwMDAwNDY1NzVGNTY0NTUyNTM0OTRGNEUzQTIwMjMzMTIwNDY5NAorOjEwMjYxMDAwNzI2OTIwNDE3MDcyMjAzNzIwMzEzNzNBMzUzNzNBMzVBOAorOjEwMjYyMDAwMzIyMDUwNDQ1NDIwMzIzMDMwMzAwMDAwNDY1NzVGNDM0RgorOjEwMjYzMDAwNEY0RDUwNDk0QzQ1NUY1NDQ5NEQ0NTNBMjAzMTM3M0E0QQorOjEwMjY0MDAwMzUzNzNBMzUzMjAwMDAwMDQ2NTc1RjQzNEY0RDUwNDkwOQorOjEwMjY1MDAwNEM0NTVGNDI1OTNBMjA2NDY1NzY3MjYzNzMwMDAwMDAwRQorOjEwMjY2MDAwNDY1NzVGNDM0RjRENTA0OTRDNDU1RjQ4NEY1MzU0M0E4RQorOjEwMjY3MDAwMjA2MzZGNkQ3MDc1NzQ2NTAwMDAwMDAwNDY1NzVGNDNGRQorOjEwMjY4MDAwNEY0RDUwNDk0QzQ1NUY0NDRGNEQ0MTQ5NEUzQTIwNjVBRQorOjEwMjY5MDAwNkU2NzJFNjE2Mzc0NjU2RjZFMkU2MzZGNkQwMDAwMDA1MAorOjEwMjZBMDAwNDY1NzVGNDM0RjRENTA0OTRDNDU1MjNBMjA2NzYzNjM0QworOjEwMjZCMDAwMjA3NjY1NzI3MzY5NkY2RTIwMzIyRTM3MkUzMjAwMDBERAorOjEwMjZDMDAwMDAwMDAwMDAxMjA0MTEwMDAwMDAwMDAwMjQ0ODY1NjFCMQorOjEwMjZEMDAwNjQ2NTcyM0EyMDJGNzA3MjZGNkE2NTYzNzQ3MzJGNzIyQgorOjEwMjZFMDAwNjM3MzJGNzM3NzJGNjc2NTJGMkUyRjZFNjk2MzJGNjZBNQorOjEwMjZGMDAwNzczMjJGNjM2RjZENkQ2RjZFMkY2RDY1NkQyRTYzMkM0RQorOjEwMjcwMDAwNzYyMDMxMkUzMTJFMzIyRTM1MjAzMTM5MzkzODJGMzA4NgorOjEwMjcxMDAwMzkyRjMzMzAyMDMxMzgzQTM1MzAzQTMwMzgyMDczNjgyOQorOjEwMjcyMDAwNzU2MTZFNjcyMDQ1Nzg3MDIwMjQwMDAwMjQ0ODY1NjEzQgorOjEwMjczMDAwNjQ2NTcyM0EyMDJGNzA3MjZGNkE2NTYzNzQ3MzJGNzJDQQorOjEwMjc0MDAwNjM3MzJGNzM3NzJGNjc2NTJGMkUyRjZFNjk2MzJGNjY0NAorOjEwMjc1MDAwNzczMjJGNjM2RjZENkQ2RjZFMkY3MzY1NkU2NDJFNjNBRQorOjEwMjc2MDAwMkM3NjIwMzEyRTMxMkUzMjJFMzQzNDIwMzEzOTM5MzgyNgorOjEwMjc3MDAwMkYzMTMyMkYzMjMxMjAzMDMwM0EzMzMzM0EzMTM4MjA1MgorOjEwMjc4MDAwNzM2ODc1NjE2RTY3MjA0NTc4NzAyMDI0MDAwMDAwMDAzMgorOjEwMjc5MDAwNjU3Njc0NTI2RTY3NDYwMDUxNjU3Njc0NDYwMDAwMDA5NworOjEwMjdBMDAwNTE2NTc2NzQ1MDVGNDYwMDRENjU3Njc0NTI2RTY3NDY4QgorOjEwMjdCMDAwMDAwMDAwMDA0RDUxNjU3Njc0NDYwMDAwNEQ1MTY1NzY2RAorOjEwMjdDMDAwNTA1RjQ2MDA1MTczNDM2RjZFNDk1RjQ2MDAwMDAwMDA0MgorOjEwMjdEMDAwNTE3MzQzNkY2RTczNDYwMDUxNzI1MDcyNkY2NDQ2MDBCRQorOjEwMjdFMDAwNjk3MzZFNzQ1NDYzNzA1NTAwMDAwMDAwMjQ0ODY1NjE3RAorOjEwMjdGMDAwNjQ2NTcyM0EyMDJGNzA3MjZGNkE2NTYzNzQ3MzJGNzIwQQorOjEwMjgwMDAwNjM3MzJGNzM3NzJGNjc2NTJGMkUyRjZFNjk2MzJGNjY4MworOjEwMjgxMDAwNzczMjJGNjM2RjZENkQ2RjZFMkY3MjY1NjM3NjJFNjNFNworOjEwMjgyMDAwMkM3NjIwMzEyRTMxMkUzMjJFMzUzMzIwMzEzOTM5Mzk2NAorOjEwMjgzMDAwMkYzMDMxMkYzMTM2MjAzMDMyM0EzNTM1M0EzNDMzMjA4QgorOjEwMjg0MDAwNzM2ODc1NjE2RTY3MjA0NTc4NzAyMDI0MDAwMDAwMDA3MQorOjEwMjg1MDAwNjU3Njc0NTI2RTY3NDYwMDUxNjU3Njc0NDYwMDAwMDBENgorOjEwMjg2MDAwNTE2NTc2NzQ1MDVGNDYwMDRENjU3Njc0NTI2RTY3NDZDQQorOjEwMjg3MDAwMDAwMDAwMDA0RDUxNjU3Njc0NDYwMDAwNEQ1MTY1NzZBQworOjEwMjg4MDAwNTA1RjQ2MDA1MTczNDM2RjZFNDk1RjQ2MDAwMDAwMDA4MQorOjEwMjg5MDAwNTE3MzQzNkY2RTczNDYwMDUxNzI1MDcyNkY2NDQ2MDBGRAorOjEwMjhBMDAwNzI0RDYxNjM0MzY4NkIzMDAwMDAwMDAwNzI3ODQ2NzJCRAorOjEwMjhCMDAwNkQzMjRDNjcwMDAwMDAwMDcyNzg0RTZGNTM3NDQyNjRCMgorOjEwMjhDMDAwMDAwMDAwMDA3Mjc4NEU2RjRENjk0MjY0MDAwMDAwMDAwNQorOjEwMjhEMDAwNzI3ODRFNkY0QTZENDI2NDAwMDAwMDAwNzI3ODQzNkI1QworOjEwMjhFMDAwNDQ2RDYxNDYwMDAwMDAwMDcyNzg1MTQ0NkQ0NTc4NDZBMQorOjEwMjhGMDAwMDAwMDAwMDA3Mjc4NTE0NDZENjE0NjAwNzI3ODUxNDRDNgorOjEwMjkwMDAwNEM0MjY0NDYwMDAwMDAwMDcyNzg1MTQ0NkQ0MjY0NDZCNworOjEwMjkxMDAwMDAwMDAwMDA3Mjc4NDM3MjYzNTA2MTY0MDAwMDAwMDBBMAorOjEwMjkyMDAwNzI1MzZENTE0NDZENjE0NjAwMDAwMDAwMjQ0ODY1NjE5QQorOjEwMjkzMDAwNjQ2NTcyM0EyMDJGNzA3MjZGNkE2NTYzNzQ3MzJGNzJDOAorOjEwMjk0MDAwNjM3MzJGNzM3NzJGNjc2NTJGMkUyRjZFNjk2MzJGNjY0MgorOjEwMjk1MDAwNzczMjJGNjM2RjZENkQ2RjZFMkY2RDYxNjMyRTYzMkNGOQorOjEwMjk2MDAwNzYyMDMxMkUzMTJFMzIyRTMyMzIyMDMxMzkzOTM4MkYyNQorOjEwMjk3MDAwMzEzMjJGMzAzODIwMzAzMjNBMzMzNjNBMzMzMDIwNzMwOAorOjEwMjk4MDAwNjg3NTYxNkU2NzIwNDU3ODcwMjAyNDAwNjU3Njc0NTIwMgorOjEwMjk5MDAwNkU2NzQ2MDA1MTY1NzY3NDQ2MDAwMDAwNTE2NTc2NzQ5NgorOjEwMjlBMDAwNTA1RjQ2MDA0RDY1NzY3NDUyNkU2NzQ2MDAwMDAwMDAyOQorOjEwMjlCMDAwNEQ1MTY1NzY3NDQ2MDAwMDRENTE2NTc2NTA1RjQ2MDA3NgorOjEwMjlDMDAwNTE3MzQzNkY2RTQ5NUY0NjAwMDAwMDAwNTE3MzQzNkZCRgorOjEwMjlEMDAwNkU3MzQ2MDA1MTcyNTA3MjZGNjQ0NjAwNkQ2MTYzNTRBRAorOjEwMjlFMDAwNjg3MjY1NzMwMDAwMDAwMDIzNzQ0RDYxNjM0MTU0NEVBQQorOjEwMjlGMDAwMDAwMDAwMDAyMzcyNEQ2MTYzNDE1NDRFMDAwMDAwMDA0RQorOjEwMkEwMDAwNzI2NTZENDE3MzczNzI3NDAwMDAwMDAwNkM2OTZFNkJDNworOjEwMkExMDAwNDQ0RjU3NEUwMDAwMDAwMDZDNjk2RTZCNTU1MDAwMDAyQgorOjEwMkEyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjQ0ODY1NjE3NAorOjEwMkEzMDAwNjQ2NTcyM0EyMDJGNzA3MjZGNkE2NTYzNzQ3MzJGNzJDNworOjEwMkE0MDAwNjM3MzJGNzM3NzJGNjc2NTJGMkUyRjZFNjk2MzJGNjY0MQorOjEwMkE1MDAwNzczMjJGNjM2RjZENkQ2RjZFMkY2MzZCNzM3NTZEMkU5NQorOjEwMkE2MDAwNjMyQzc2MjAzMTJFMzEyRTMyMkUzOTIwMzEzOTM5MzlFRQorOjEwMkE3MDAwMkYzMDMxMkYzMTM0MjAzMDMwM0EzMDMzM0EzNDM4MjA0RgorOjEwMkE4MDAwNzM2ODc1NjE2RTY3MjA0NTc4NzAyMDI0MDAwMDAwMDAyRgorOjEwMkE5MDAwNjU3Njc0NTI2RTY3NDYwMDUxNjU3Njc0NDYwMDAwMDA5NAorOjEwMkFBMDAwNTE2NTc2NzQ1MDVGNDYwMDRENjU3Njc0NTI2RTY3NDY4OAorOjEwMkFCMDAwMDAwMDAwMDA0RDUxNjU3Njc0NDYwMDAwNEQ1MTY1NzY2QQorOjEwMkFDMDAwNTA1RjQ2MDA1MTczNDM2RjZFNDk1RjQ2MDAwMDAwMDAzRgorOjEwMkFEMDAwNTE3MzQzNkY2RTczNDYwMDUxNzI1MDcyNkY2NDQ2MDBCQgorOjEwMkFFMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNTA3MjZGNjI1MworOjEwMkFGMDAwNjU1MDY4NzkwMDAwMDAwMDZDNkU2QjQxNTM1MzUyNTQ2RQorOjEwMkIwMDAwMDAwMDAwMDAwMDAxMDlBNDAwMDEwQTFDMDAwMTBBNTA5NQorOjEwMkIxMDAwMDAwMTBBN0MwMDAxMTA1MDAwMDEwQUE4MDAwMTBCMTBGRQorOjEwMkIyMDAwMDAwMTExRkMwMDAxMERDMDAwMDEwQzY4MDAwMTBDODBDNworOjEwMkIzMDAwMDAwMTBDQzQwMDAxMENFQzAwMDEwRDBDMDAwMTBEMzQ2RgorOjEwMkI0MDAwMDAwMTExRkMwMDAxMERDMDAwMDEwREY4MDAwMTBFMTA4NAorOjEwMkI1MDAwMDAwMTBFNDAwMDAxMEU2ODAwMDEwRTg4MDAwMTBFQjA1OQorOjEwMkI2MDAwMDAwMDAwMDAwMDAxMEZEQzAwMDExMDA4MDAwMTEwMkMyMworOjEwMkI3MDAwMDAwMTExRkMwMDAxMTA1MDAwMDExMDc4MDAwMTExMDg0MworOjEwMkI4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTE4NkNDMAorOjEwMkI5MDAwMDAwMTE5M0MwMDAxMUExNDAwMDExQUU0MDAwMTFCNDA1NQorOjEwMkJBMDAwMDAwMTFDMUMwMDAxMUM0NDAwMDExRDIwMDAwMTFENDhFNworOjEwMkJCMDAwMDAwMTFFRjAwMDAxMUYxODAwMDEyMEMwMDAwMTIyQjgxMgorOjEwMkJDMDAwMDAwMTI1NEMwMDAxMjQ2MDAwMDEyNTRDMDAwMTI1NzhGRQorOjEwMkJEMDAwMDAwMTIwRTgwMDAxMjI5MDcyNzM3NDVGNjc2RDY5NjlEQgorOjEwMkJFMDAwMDAwMDAwMDAwMDAxMjYwODAwMDEyNjQwMDAwMTI3MjhGRgorOjEwMkJGMDAwMDAwMTMzNzQwMDAxMzNCNDAwMDEzM0NDNzM2NTc0NkM4RAorOjEwMkMwMDAwNkY2RjcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTNCQkM3RQorOjEwMkMxMDAwMDAwMTNCRkMwMDAxM0M4QzAwMDEzQ0QwMDAwMTNEMzQzNAorOjEwMkMyMDAwMDAwMTNEQzAwMDAxM0RGNDAwMDEzRTdDMDAwMTNGMTQ2NQorOjEwMkMzMDAwMDAwMTNGRTQwMDAxNDAyNDAwMDE0MEE4MDAwMTQwQ0MxNQorOjEwMkM0MDAwMDAwMTQxREM2NDZGNDI2MTczNjU1MDY3MDAwMDAwMDA2MQorOjEwMkM1MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNzM3NDZENjFCRgorOjEwMkM2MDAwNjM0QzRFNEIwMDAwMDAwMDY3NjU3NDZENjM2QzZFNkJDNworOjEwMkM3MDAwMDAwMDAwMDAwMDAxNEVEODAwMDE0RUQ4MDAwMTRCOEMyRQorOjEwMkM4MDAwMDAwMTRCRDgwMDAxNEMyNDAwMDE0RUQ4NzM2NTc0NkRDRgorOjEwMkM5MDAwNjE2MzYxNjM3NDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzOAorOjEwMkNBMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyNAorOjEwMkNCMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxNAorOjEwMkNDMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMworOjEwMkNEMDAwMDAwMDAwMDEwMDAwMDAwMTAwQzAwMUZDMDAwMDNGRkNGQQorOjEwMkNFMDAwMDBDMDAwMDA0MTZDNzQ2NTZGNkUyMDQxNjM2NTRFNDkwMQorOjEwMkNGMDAwNDMyMDU2MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxQgorOjEwMkQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNDE2Qzc0NjUzRAorOjEwMkQxMDAwNkY2RTIwNDE2MzY1NEU0OTQzMjA1NjAwNDI0MjQyNDI1NQorOjEwMkQyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxRkZGRkM4OQorOjEwMkQzMDAwMDAxRkZGN0MwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBGOQorOjEwMkQ0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2MENGMDA1NAorOjEwMkQ1MDAwMDAwMDAwNjBDRjAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0NAorOjEwMkQ2MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2MworOjEwMkQ3MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1MworOjEwMkQ4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0MworOjEwMkQ5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzMworOjEwMkRBMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzMDAwMDAwMDAyMAorOjEwMkRCMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMgorOjEwMkRDMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMQorOjEwMkREMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFGMgorOjEwMkRFMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFMgorOjEwMkRGMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMjEwMDAwMDBCMQorOjEwMkUwMDAwMTIwMDAxNDAwMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDA0RgorOjEwMkUxMDAwMTIwMDAwQTAwMDAwMDAwMDEyMDAwMDYwMTIwMDAxODBGQgorOjEwMkUyMDAwMTIwMDAxRTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBBRgorOjEwMkUzMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA5MQorOjEwMkU0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDI4MAorOjEwMkU1MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDMwMDAxMDAwMDAwMDE2RAorOjEwMkU2MDAwMDAwMzAyMDEwMDAwMDAwMDAwMDAwMDAwMDEwMTAxMDE1OAorOjEwMkU3MDAwMDEwMTAxMDAwMDAxMDEwMDAxMDEwMDAxMDAwMTAwMDE0OAorOjBDMkU4MDAwMDEwMDAxMDEwMDAwMDEwMTAwMDAwMDAwNDEKKzowMDAwMDAwMUZGCisvKiB0ZzIgZmlybXdhcmUgdjEyLjQuMTEgKi8KZGlmZiAtLWdpdCBhL2Zpcm13YXJlL2FkYXB0ZWMvc3RhcmZpcmVfcnguYmluLmloZXggYi9maXJtd2FyZS9hZGFwdGVjL3N0YXJmaXJlX3J4LmJpbi5paGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMWZhZTAKLS0tIC9kZXYvbnVsbAorKysgYi9maXJtd2FyZS9hZGFwdGVjL3N0YXJmaXJlX3J4LmJpbi5paGV4CkBAIC0wLDAgKzEsNTMgQEAKKzoxMDAwMDAwMDAxMDAwM0RDMDAwMDAwMDAwNDAwMDQyMTAwMDAwMDg2NjEKKzoxMDAwMTAwMDgwMDAwMDE1MDAwMDE4MEU4MTAwMDAxNTAwMDA2NjY0QzUKKzoxMDAwMjAwMDFBMDA0MEFCMDAwMDBCMDYxNDIwMDAxMTAwMDAwMDAwNzUKKzoxMDAwMzAwMDE0MjA0MDIyMDAwMEFBQUExNDIwNDAyMjAwMDAwMzAwM0QKKzoxMDAwNDAwMDE0MjA0MDIyMDAwMDAwMDAxQTAwNDBBQjAwMDAwQjE0RjYKKzoxMDAwNTAwMDE0MjAwMDExMDAwMDAwMDA4MzAwMDAxNTAwMDAwMDAyQzEKKzoxMDAwNjAwMDA0MDAwMDIxMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwNUIKKzoxMDAwNzAwMDA0MDAwNDIxMDAwMDAwODcwMDAwMDAxMDAwMDAwMDAwQzAKKzoxMDAwODAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwODAxNTAwMDAwMDAwQ0IKKzoxMDAwOTAwMDAwMDAwMDNFMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMTIKKzoxMDAwQTAwMDgyMDAwMDE1MDAwMDQwMDAwMDlFODA1MDAwMDAwMDAwMEIKKzoxMDAwQjAwMDAzMDA4MDE1MDAwMDAwMDA4NjAwODAxNTAwMDAwMDAwOEQKKzoxMDAwQzAwMDgyMDAwMDE1MDAwMDgwMDAwMTAwMDAxQzAwMDAwMDAwRkMKKzoxMDAwRDAwMDAwMDA1MEEwMDAwMDAxMEM0RTIwRDAxMTAwMDA2MDA4NkMKKzoxMDAwRTAwMDE0MjBEMDEyMDAwMDQwMDgwMDAwRjA5MDAwMDA3MDAwQzIKKzoxMDAwRjAwMDAwMDBDOEIwMDAwMDMwMDAwMDAwNDA0MDAwMDAwMDAwRDgKKzoxMDAxMDAwMDAwMTA4MDE1MDAwMDAwMDAwMEEyQzE1MDAwMDA0MDAwNTcKKzoxMDAxMTAwMDAwQTQwMEIwMDAwMDAwMTQwMDAwMDAyMDAwMDAwMDAwNTcKKzoxMDAxMjAwMDI1MDA0MDBEMDAwMDI1MjUwMDA0NzIyMDAwMDAzMTAwNEMKKzoxMDAxMzAwMDAwOTM0MDcwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwNUMKKzoxMDAxNDAwMDAwOTI0NDYwMDAwMDAxODQyQjIwQzAxMTAwMDAwMDAwRDgKKzoxMDAxNTAwMDAwMDBDNDIwMDAwMDA1NDAzNjAxNDAxODAwMDA0MjJENzgKKzoxMDAxNjAwMDE0MjAwMDExMDAwMDAwMDAwMDkyNDQ2MDAwMDAwMTgzOTAKKzoxMDAxNzAwMDMyMDAwMDFGMDAwMDAwMzQwMkFDMDAxNTAwMDAwMDAyMzUKKzoxMDAxODAwMDAwQTYwMTEwMDAwMDAwMDg0MjIwMDAxMTAwMDAwMDAwM0QKKzoxMDAxOTAwMDAwOTI0MDYwMDAwMDAxMDMwMDAwMDAxRTAwMDAwMDAwMEIKKzoxMDAxQTAwMDAwMDAwMDIwMDAwMDAxMDAwMDAwMDAxRTAwMDAwMDAwMTAKKzoxMDAxQjAwMDAwOTI0NDYwMDAwMDAwODYwMDAwNDA4MDAwMDAwMDAwQzMKKzoxMDAxQzAwMDAwOTJDMDcwMDAwMDAwMDAwMDkyNDA2MDAwMDAwMTAwM0EKKzoxMDAxRDAwMDAwMDBDODkwMDAwMDUwMDAwMEE2QzExMDAwMDAwMDAwMDAKKzoxMDAxRTAwMDAwQjBDMDkwMDAwMDAwMTIwMjFDMDAxNTAwMDAwMDAwQ0EKKzoxMDAxRjAwMDMyMDAwMDFGMDAwMDAwMzQwMDkyNDQ2MDAwMDAwNTEwMkYKKzoxMDAyMDAwMDQ0MjEwMDExMDAwMDAwMDA0MjAwMDAxMTAwMDAwMDAwMjUKKzoxMDAyMTAwMDgzMDAwMDE1MDAwMDAwNDAwMDkyNDQ2MDAwMDAwNTA4QzMKKzoxMDAyMjAwMDQ1MDE0MDE4MDAwMDQ1NDUwMDgwODA1MDAwMDAwMDAwNTYKKzoxMDAyMzAwMDYyMjA4MDEyMDAwMDAwMDA4MjAwMDAxNTAwMDAwODAwMEIKKzoxMDAyNDAwMDE1MjAwMDExMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwNTgKKzoxMDAyNTAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwN0UKKzoxMDAyNjAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwNkUKKzoxMDAyNzAwMDgwMDAwMDE1MDAwMEVFQTQ4MTAwMDAxNTAwMDAwMDVGNjIKKzoxMDAyODAwMDAwMDAwMDYwMDAwMDAwMDAwMDAwNDEyMDAwMDAwMDAwQUQKKzoxMDAyOTAwMDAwMDA0QTAwMDAwMDQwMDAwMDkyNDQ2MDAwMDAwMTkwMEQKKzoxMDAyQTAwMDU2MDE0MDFBMDAwMDU5NTYxNDAwMDAxMTAwMDAwMDAwQzkKKzoxMDAyQjAwMDAwOTM0MDUwMDAwMDAwMTgwMDkzMDA1MDAwMDAwMDE4MDgKKzoxMDAyQzAwMDM2MDE0MDNBMDAwMDAwMkQwMDA2NDNBOTAwMDAwMDAwNUUKKzoxMDAyRDAwMDAwMDBDNDIwMDAwMDAxNDA1NjAxNDAxQTAwMDA1OTU2OTkKKzoxMDAyRTAwMDE0MDAwMDExMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwRDkKKzoxMDAyRjAwMDAwMDAwMDEwMDAwMDAwMDAwMDA2NDJBOTAwMDAwMDAwRkQKKzoxMDAzMDAwMDAwMDI0NDIwMDAwMDAxODM1NjAxNDAxQTAwMDA1OTU2QTMKKzoxMDAzMTAwMDgyMDAwMDE1MDAwMDIwMDAxNTIwMDAxMTAwMDAwMDAwRTAKKzoxMDAzMjAwMDgyMDAwMDE1MDAwMDAwMTAxNTIwMDAxMTAwMDAwMDAwRTAKKzoxMDAzMzAwMDgyMDAwMDE1MDAwMDAwMTAxNTIwMDAxMTAwMDAwMDAwRDAKKzowMDAwMDAwMUZGCmRpZmYgLS1naXQgYS9maXJtd2FyZS9hZGFwdGVjL3N0YXJmaXJlX3R4LmJpbi5paGV4IGIvZmlybXdhcmUvYWRhcHRlYy9zdGFyZmlyZV90eC5iaW4uaWhleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjFmYWUwCi0tLSAvZGV2L251bGwKKysrIGIvZmlybXdhcmUvYWRhcHRlYy9zdGFyZmlyZV90eC5iaW4uaWhleApAQCAtMCwwICsxLDUzIEBACis6MTAwMDAwMDAwMTAwMDNEQzAwMDAwMDAwMDQwMDA0MjEwMDAwMDA4NjYxCis6MTAwMDEwMDA4MDAwMDAxNTAwMDAxODBFODEwMDAwMTUwMDAwNjY2NEM1Cis6MTAwMDIwMDAxQTAwNDBBQjAwMDAwQjA2MTQyMDAwMTEwMDAwMDAwMDc1Cis6MTAwMDMwMDAxNDIwNDAyMjAwMDBBQUFBMTQyMDQwMjIwMDAwMDMwMDNECis6MTAwMDQwMDAxNDIwNDAyMjAwMDAwMDAwMUEwMDQwQUIwMDAwMEIxNEY2Cis6MTAwMDUwMDAxNDIwMDAxMTAwMDAwMDAwODMwMDAwMTUwMDAwMDAwMkMxCis6MTAwMDYwMDAwNDAwMDAyMTAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDVCCis6MTAwMDcwMDAwNDAwMDQyMTAwMDAwMDg3MDAwMDAwMTAwMDAwMDAwMEMwCis6MTAwMDgwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDgwMTUwMDAwMDAwMENCCis6MTAwMDkwMDAwMDAwMDAzRTAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDEyCis6MTAwMEEwMDA4MjAwMDAxNTAwMDA0MDAwMDA5RTgwNTAwMDAwMDAwMDBCCis6MTAwMEIwMDAwMzAwODAxNTAwMDAwMDAwODYwMDgwMTUwMDAwMDAwMDhECis6MTAwMEMwMDA4MjAwMDAxNTAwMDA4MDAwMDEwMDAwMUMwMDAwMDAwMEZDCis6MTAwMEQwMDAwMDAwNTBBMDAwMDAwMTBDNEUyMEQwMTEwMDAwNjAwODZDCis6MTAwMEUwMDAxNDIwRDAxMjAwMDA0MDA4MDAwMEYwOTAwMDAwNzAwMEMyCis6MTAwMEYwMDAwMDAwQzhCMDAwMDAzMDAwMDAwMDQwNDAwMDAwMDAwMEQ4Cis6MTAwMTAwMDAwMDEwODAxNTAwMDAwMDAwMDBBMkMxNTAwMDAwNDAwMDU3Cis6MTAwMTEwMDAwMEE0MDBCMDAwMDAwMDE0MDAwMDAwMjAwMDAwMDAwMDU3Cis6MTAwMTIwMDAyNTAwNDAwRDAwMDAyNTI1MDAwNDcyMjAwMDAwMzEwMDRDCis6MTAwMTMwMDAwMDkzNDA3MDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDVDCis6MTAwMTQwMDAwMDkyNDQ2MDAwMDAwMTg0MkIyMEMwMTEwMDAwMDAwMEQ4Cis6MTAwMTUwMDAwMDAwQzQyMDAwMDAwNTQwMzYwMTQwMTgwMDAwNDIyRDc4Cis6MTAwMTYwMDAxNDIwMDAxMTAwMDAwMDAwMDA5MjQ0NjAwMDAwMDE4MzkwCis6MTAwMTcwMDAzMjAwMDAxRjAwMDAwMDM0MDJBQzAwMTUwMDAwMDAwMjM1Cis6MTAwMTgwMDAwMEE2MDExMDAwMDAwMDA4NDIyMDAwMTEwMDAwMDAwMDNECis6MTAwMTkwMDAwMDkyNDA2MDAwMDAwMTAzMDAwMDAwMUUwMDAwMDAwMDBCCis6MTAwMUEwMDAwMDAwMDAyMDAwMDAwMTAwMDAwMDAwMUUwMDAwMDAwMDEwCis6MTAwMUIwMDAwMDkyNDQ2MDAwMDAwMDg2MDAwMDQwODAwMDAwMDAwMEMzCis6MTAwMUMwMDAwMDkyQzA3MDAwMDAwMDAwMDA5MjQwNjAwMDAwMDEwMDNBCis6MTAwMUQwMDAwMDAwQzg5MDAwMDA1MDAwMDBBNkMxMTAwMDAwMDAwMDAwCis6MTAwMUUwMDAwMEIwQzA5MDAwMDAwMDEyMDIxQzAwMTUwMDAwMDAwMENBCis6MTAwMUYwMDAzMjAwMDAxRjAwMDAwMDM0MDA5MjQ0NjAwMDAwMDUxMDJGCis6MTAwMjAwMDA0NDIxMDAxMTAwMDAwMDAwNDIwMDAwMTEwMDAwMDAwMDI1Cis6MTAwMjEwMDA4MzAwMDAxNTAwMDAwMDQwMDA5MjQ0NjAwMDAwMDUwOEMzCis6MTAwMjIwMDA0NTAxNDAxODAwMDA0NTQ1MDA4MDgwNTAwMDAwMDAwMDU2Cis6MTAwMjMwMDA2MjIwODAxMjAwMDAwMDAwODIwMDAwMTUwMDAwMDgwMDBCCis6MTAwMjQwMDAxNTIwMDAxMTAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDU4Cis6MTAwMjUwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDdFCis6MTAwMjYwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDZFCis6MTAwMjcwMDA4MDAwMDAxNTAwMDBFRUE0ODEwMDAwMTUwMDAwMDA1RjYyCis6MTAwMjgwMDAwMDAwMDA2MDAwMDAwMDAwMDAwMDQxMjAwMDAwMDAwMEFECis6MTAwMjkwMDAwMDAwNEEwMDAwMDA0MDAwMDA5MjQ0NjAwMDAwMDE5MDBECis6MTAwMkEwMDA1NjAxNDAxQTAwMDA1OTU2MTQwMDAwMTEwMDAwMDAwMEM5Cis6MTAwMkIwMDAwMDkzNDA1MDAwMDAwMDE4MDA5MzAwNTAwMDAwMDAxODA4Cis6MTAwMkMwMDAzNjAxNDAzQTAwMDAwMDJEMDAwNjQzQTkwMDAwMDAwMDVFCis6MTAwMkQwMDAwMDAwQzQyMDAwMDAwMTQwNTYwMTQwMUEwMDAwNTk1Njk5Cis6MTAwMkUwMDAxNDAwMDAxMTAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMEQ5Cis6MTAwMkYwMDAwMDAwMDAxMDAwMDAwMDAwMDAwNjQyQTkwMDAwMDAwMEZECis6MTAwMzAwMDAwMDAyNDQyMDAwMDAwMTgzNTYwMTQwMUEwMDAwNTk1NkEzCis6MTAwMzEwMDA4MjAwMDAxNTAwMDAyMDAwMTUyMDAwMTEwMDAwMDAwMEUwCis6MTAwMzIwMDA4MjAwMDAxNTAwMDAwMDEwMTUyMDAwMTEwMDAwMDAwMEUwCis6MTAwMzMwMDA4MjAwMDAxNTAwMDAwMDEwMTUyMDAwMTEwMDAwMDAwMEQwCis6MDAwMDAwMDFGRgpkaWZmIC0tZ2l0IGEvZmlybXdhcmUvZHNwNTZrL2Jvb3RzdHJhcC5hc20gYi9maXJtd2FyZS9kc3A1NmsvYm9vdHN0cmFwLmFzbQppbmRleCAxMGQ4OTE5Li5hNDExMDQ3IDEwMDY0NAotLS0gYS9maXJtd2FyZS9kc3A1NmsvYm9vdHN0cmFwLmFzbQorKysgYi9maXJtd2FyZS9kc3A1NmsvYm9vdHN0cmFwLmFzbQpAQCAtNTEsMTkgKzUxLDE5IEBACiAgICAgICAgIDsgQ29weSBEU1AgcHJvZ3JhbSBjb250cm9sCiAgICAgICAgIG1vdmUgICAgI3JlYWwscjAKICAgICAgICAgbW92ZSAgICAjdXBsb2FkLHIxCi0gICAgICAgIGRvICAgICAgI3VwbG9hZF9lbmQtdXBsb2FkLDxfY29weQotICAgICAgICBtb3ZlICAgIFA6KHIwKSsseDAKLSAgICAgICAgbW92ZSAgICB4MCxQOihyMSkrCi1fY29weSAgIG1vdmVwICAgIz40LFg6PDxNX0hDUgotICAgICAgICBtb3ZlcCAgICM+JGMwMCxYOjw8TV9JUFIKKyAgICAgICAgZG8gICAgICAjdXBsb2FkX2VuZC11cGxvYWQsX2NvcHkKKyAgICAgICAgbW92ZW0gICAgUDoocjApKyx4MAorICAgICAgICBtb3ZlbSAgICB4MCxQOihyMSkrCitfY29weSAgIG1vdmVwICAgIzQsWDo8PE1fSENSCisgICAgICAgIG1vdmVwICAgIyRjMDAsWDo8PE1fSVBSCiAgICAgICAgIGFuZCAgICAgIzwkZmUsbXIKICAgICAgICAgam1wICAgICB1cGxvYWQKIAogcmVhbAogICAgICAgICBvcmcgICAgIFA6JDdlYTkKIHVwbG9hZAotICAgICAgICBtb3ZlcCAgICM+MSxYOjw8TV9QQkMKLSAgICAgICAgbW92ZXAgICAjPjAsWDo8PE1fQkNSCisgICAgICAgIG1vdmVwICAgIzEsWDo8PE1fUEJDCisgICAgICAgIG1vdmVwICAgIzAsWDo8PE1fQkNSCiAKIG5leHQgICAgamNsciAgICAjMCxYOjw8TV9IU1IsKgogICAgICAgICBtb3ZlcCAgIFg6PDxNX0hSWCxBCkBAIC04MSwxOCArODEsMTggQEAKICAgICAgICAgY21wICAgICB4MCxBCiAgICAgICAgIGplcSAgICAgbG9hZF9ZCiAKLWxvYWRfUCAgZG8gICAgICB5MCxfbG9hZAorbG9hZF9QICBkbyAgICAgIHkwLF9sb2FkX1AKICAgICAgICAgamNsciAgICAjMCxYOjw8TV9IU1IsKgogICAgICAgICBtb3ZlcCAgIFg6PDxNX0hSWCxQOihyMCkrCi1fbG9hZCAgIGptcCAgICAgbmV4dAotbG9hZF9YICBkbyAgICAgIHkwLF9sb2FkCitfbG9hZF9QIGptcCAgICAgbmV4dAorbG9hZF9YICBkbyAgICAgIHkwLF9sb2FkX1gKICAgICAgICAgamNsciAgICAjMCxYOjw8TV9IU1IsKgogICAgICAgICBtb3ZlcCAgIFg6PDxNX0hSWCxYOihyMCkrCi1fbG9hZCAgIGptcCAgICAgbmV4dAotbG9hZF9ZICBkbyAgICAgIHkwLF9sb2FkCitfbG9hZF9YIGptcCAgICAgbmV4dAorbG9hZF9ZICBkbyAgICAgIHkwLF9sb2FkX1kKICAgICAgICAgamNsciAgICAjMCxYOjw8TV9IU1IsKgogICAgICAgICBtb3ZlcCAgIFg6PDxNX0hSWCxZOihyMCkrCi1fbG9hZCAgIGptcCAgICAgbmV4dAorX2xvYWRfWSBqbXAgICAgIG5leHQKIAogdXBsb2FkX2VuZAogICAgICAgICBlbmQKZGlmZiAtLWdpdCBhL2Zpcm13YXJlL2UxMDAvZDEwMW1fdWNvZGUuYmluLmloZXggYi9maXJtd2FyZS9lMTAwL2QxMDFtX3Vjb2RlLmJpbi5paGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyOTcxZWQKLS0tIC9kZXYvbnVsbAorKysgYi9maXJtd2FyZS9lMTAwL2QxMDFtX3Vjb2RlLmJpbi5paGV4CkBAIC0wLDAgKzEsMzggQEAKKzoxMDAwMDAwMDE1MDI1NTAwMzcwNEZGRkZGRkZGRkZGRjg5MDdBNzA2MTIKKzoxMDAwMTAwMEZGRkZGRkZGRkZGRjU4MDUwMTAwMEMwMDEyMTMxMDAwNDcKKzoxMDAwMjAwMDA4MDAwQzAwMTYwMjM4MDA5QzAwMTAwMDU2NDAyMDAwMEEKKzoxMDAwMzAwMENDODAyMzAwNTYwMDM4MDA5QzAwMTAwMDBCNEMyNDAwOUMKKzoxMDAwNDAwMDAwMDgwMDAwMTg0ODEyMDAzODA0MzgwMDAwMDAwMDAwQzIKKzoxMDAwNTAwMDAwMDAxNDAwNTUwNTM4MDAwMDgwMzAwMDYyMDYxMDAwRDIKKzoxMDAwNjAwMDYxMDUxMDAwMDgwNDBFMDA2MTQ4MTMwMDAyMDAwQzAwMzYKKzoxMDAwNzAwMDkzMzAxMDAwMDA4MDMwMDAyNDA2MTAwMDYxMDUxMDAwNEQKKzoxMDAwODAwMDA4MDQwRTAwNjEwODEwMDA3RTAwMEMwMDIxMkMyMjAwRTQKKzoxMDAwOTAwMDAyMDAwQzAwOTMzMDEwMDA3QTBDMzgwMDAwMDAwODAwQjkKKzoxMDAwQTAwMDkwMzAxMDAwN0EwQzM4MDAwMDAwMDAwMDAwMDAwMDAwQzIKKzoxMDAwQjAwMDAwMDAwMDAwMDAwMDAwMDA5QzAwMTAwMDJENEMyNDAwRjcKKzoxMDAwQzAwMDA0MDAwMTAwMDAxMDA0MDAzNzA0M0EwMDEwNDAwNDAwNEUKKzoxMDAwRDAwMDhBMDczODAwMDAwMDAwMDA5OTAwMTAwMDdBNkMyMDAwQTgKKzoxMDAwRTAwMDlDMDAxMDAwNDg0QzI0MDAyNDA4MTMwMDAxMDAwQzAwNjAKKzoxMDAwRjAwMDEzMTIxMDAwNzUwQzI2MDAwMDEwMDQwMDA0MDAwMTAwMEIKKzoxMDAxMDAwMDI2MDgxMzAwMDYwMDBDMDBBODA2MjIwMDI2QzkxMzAwQ0EKKzoxMDAxMTAwMDEzMTMxMDAwQTgwNjM4MDAwMDAwMDAwMDAwMDAwMDAwQzMKKzoxMDAxMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwQ0YKKzoxMDAxMzAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2MDgwMDEwMUIxMDAwNzYKKzoxMDAxNDAwMDA0MDAwNTAwMjYwODEwMDAxMDEyMTAwMDM0MEMzODAwQkUKKzoxMDAxNTAwMDAwMDAwMDAwMDAwMDAwMDA1QjE1MjEwMDk5MDAxMDAwNjUKKzoxMDAxNjAwMDU5NjUyMDAwOUMwMDEwMDA1OTQ1MjQwMDM2MDgxMzAwRjIKKzoxMDAxNzAwMDAwMDAwQzAwNjIwQzIyMDAwMTAwMEMwMDEzMUIxMDAwOTgKKzoxMDAxODAwMDBFOUMyMjAwMEUwQzIxMDAwRTZDMjIwMDBFNkMyMTAwMzEKKzoxMDAxOTAwMDBFRkMyMjAwMEU1QzIxMDAwRTRDMjEwMDU1MDUzODAwOUIKKzoxMDAxQTAwMDA0MDAwMTAwMDAxMDA0MDA2NzhDMjcwMDAwMDgwNDAwMTAKKzoxMDAxQjAwMDAwODEwMTAwMzcwNDNBMDAyNjA4MTMwMDAxMDAwQzAwRkEKKzoxMDAxQzAwMDU5MDUyMjAwMTMxMzEwMDA1OTA1MzgwMDAwMDAwMDAwRTMKKzoxMDAxRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMUYKKzoxMDAxRTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDMxMDgxMzAwQzMKKzoxMDAxRjAwMDBCMDkxMDAwMTM0ODEyMDA4MEZGMEMwMEFCMDYyNjAwMEMKKzoxMDAyMDAwMDAwMTAwNDAwMDQwMDAxMDBBODA2MzgwMDAwMDAwMDAwRUYKKzowQjAyMTAwMDAwMDAwMDAwMDAwMDAwMDA0RTQxN0VENgorOjAwMDAwMDAxRkYKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBNaWNybyBjb2RlIGZvciA4MDg2OjEyMjkgUmV2IDggICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2Zpcm13YXJlL2UxMDAvZDEwMXNfdWNvZGUuYmluLmloZXggYi9maXJtd2FyZS9lMTAwL2QxMDFzX3Vjb2RlLmJpbi5paGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMmM3ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9maXJtd2FyZS9lMTAwL2QxMDFzX3Vjb2RlLmJpbi5paGV4CkBAIC0wLDAgKzEsMzggQEAKKzoxMDAwMDAwMDQyMDI1NTAwN0UwNEZGRkZGRkZGRkZGRjE4MDhGRjA2QjYKKzoxMDAwMTAwMEZGRkZGRkZGRkZGRkE2MDUwMTAwMEMwMDEyMTMxMDAwRjkKKzoxMDAwMjAwMDA4MDAwQzAwNDMwMjM4MDA5QzAwMTAwMDU2NDAyMDAwREQKKzoxMDAwMzAwMEQwODAyMzAwNTYwMDM4MDA5QzAwMTAwMDhCNEYyNDAwMTUKKzoxMDAwNDAwMDAwMDgwMDAwMTg0ODEyMDA3RjA0MzgwMDAwMDAwMDAwN0IKKzoxMDAwNTAwMDAwMDAxNDAwQTMwNTM4MDAwMDgwMzAwMDEwMDYxMDAwRDYKKzoxMDAwNjAwMDYxMDUxMDAwMDgwNDBFMDA2MTQ4MTMwMDAyMDAwQzAwMzYKKzoxMDAwNzAwMDkzMzAxMDAwMDA4MDMwMDAyNDA2MTAwMDYxMDUxMDAwNEQKKzoxMDAwODAwMDA4MDQwRTAwNjEwODEwMDA3RTAwMEMwMEExMkYyMjAwNjEKKzoxMDAwOTAwMDAyMDAwQzAwOTMzMDEwMDA5MDBGMzgwMDAwMDAwODAwQTAKKzoxMDAwQTAwMDkwMzAxMDAwOTAwRjM4MDAwMDAwMDAwMDAwMDAwMDAwQTkKKzoxMDAwQjAwMDAwMDAwMDAwMDAwMDAwMDA5QzAwMTAwMEFENEYyNDAwNzQKKzoxMDAwQzAwMDA0MDAwMTAwMDAxMDA0MDA3RTA0M0EwMDEwNDAwNDAwMDcKKzoxMDAwRDAwMDE5MDgzODAwMDAwMDAwMDA5OTAwMTAwMEZENkYyMDAwOTIKKzoxMDAwRTAwMDlBMDAxMDAwRkRBRjIwMDA5QzAwMTAwMEM4NEYyNDAwQjMKKzoxMDAwRjAwMDI0MDgxMzAwMDEwMDBDMDAxMzEyMTAwMEY3MEYyNjAwNTMKKzoxMDAxMDAwMDAwMTAwNDAwMDQwMDAxMDAyNjA4MTMwMDA2MDAwQzAwODMKKzoxMDAxMTAwMDAwMDcyMjAwMjZDOTEzMDAxMzEzMTAwMDAwMDczODAwM0YKKzoxMDAxMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwQ0YKKzoxMDAxMzAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2MDgwMDEwMUIxMDAwNzYKKzoxMDAxNDAwMDA0MDAwNTAwMjYwODEwMDAxMDEyMTAwMEI2MEYzODAwMzkKKzoxMDAxNTAwMDAwMDAwMDAwMDAwMDAwMDBBOTE1MjEwMDk5MDAxMDAwMTcKKzoxMDAxNjAwMEE3NjUyMDAwOUEwMDEwMDBBN0E1MjAwMDlDMDAxMDAwQTEKKzoxMDAxNzAwMEE3NDUyNDAwMzYwODEzMDAwMDAwMEMwMEU0MEYyMjAwRkQKKzoxMDAxODAwMDAxMDAwQzAwMTMxQjEwMDA4RTlGMjIwMDhFMEYyMTAwMTcKKzoxMDAxOTAwMDhFNkYyMjAwOEU2RjIxMDA4RUZGMjIwMDhFNUYyMTAwNjUKKzoxMDAxQTAwMDhFNEYyMTAwQTMwNTM4MDAwNDAwMDEwMDAwMTAwNDAwNTgKKzoxMDAxQjAwMEU5OEYyNzAwMDAwODA0MDAwMDgxMDEwMDdFMDQzQTAwNTYKKzoxMDAxQzAwMDI2MDgxMzAwMDEwMDBDMDBBNzA1MjIwMDEzMTMxMDAwREQKKzoxMDAxRDAwMEE3MDUzODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM0IKKzoxMDAxRTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEYKKzoxMDAxRjAwMDAwMDAwMDAwMzEwODEzMDAwQjA5MTAwMDEzNDgxMjAwMjIKKzoxMDAyMDAwMDgwRkYwQzAwMDMwNzI2MDAwMDEwMDQwMDA0MDAwMTAwMUEKKzowQjAyMTAwMDAwMDczODAwMDAwMDAwMDA0RTQzODA5MworOjAwMDAwMDAxRkYKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBNaWNybyBjb2RlIGZvciA4MDg2OjEyMjkgUmV2IDkgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2Zpcm13YXJlL2UxMDAvZDEwMmVfdWNvZGUuYmluLmloZXggYi9maXJtd2FyZS9lMTAwL2QxMDJlX3Vjb2RlLmJpbi5paGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllODA2ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9maXJtd2FyZS9lMTAwL2QxMDJlX3Vjb2RlLmJpbi5paGV4CkBAIC0wLDAgKzEsMzggQEAKKzoxMDAwMDAwMDhGMDI3RDAwRjkwNDQyMEU4NTBDRUQxNEU5MTRGQTE0RjgKKzoxMDAwMTAwMDM2MEVGNzBFRkYxRkZGMUZCOTE0RTAwMDAwMDAwMDAwQUUKKzoxMDAwMjAwMDAwMDAwMDAwMDAwMDAwMDBCRDE0RTAwMDAwMDAwMDAwMUYKKzoxMDAwMzAwMDAwMDAwMDAwMDAwMDAwMDBENTE0RTAwMDAwMDAwMDAwRjcKKzoxMDAwNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwQjAKKzoxMDAwNTAwMDAwMDAwMDAwMDAwMDAwMDBDMTE0RTAwMDAwMDAwMDAwRUIKKzoxMDAwNjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOTAKKzoxMDAwNzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODAKKzoxMDAwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNzAKKzoxMDAwOTAwMDAwMDAwMDAwMDAwMDAwMDBDODE0RTAwMDAwMDAwMDAwQTQKKzoxMDAwQTAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2MjAwMEVFMTRFMDAwNDgKKzoxMDAwQjAwMDAwMDAwMDAwMDAwMDAwMDA4MEZGMzAwMDQ2MEU5NDAwQTkKKzoxMDAwQzAwMDAwODIwMzAwMDAyMDEwMDA0MzBFRTAwMDAwMDAwMDAwNEEKKzoxMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwNjAwMzAwMEZCMTRFMDAwRkIKKzoxMDAwRTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAKKzoxMDAwRjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzoxMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRUYKKzoxMDAxMTAwMDAwMDAwMDAwMDAwMDAwMDA0MTZFOTAwMDNDMEU4MDAwRDYKKzoxMDAxMjAwMDM5MEVFMDAwMDAwMDAwMDBGRDZFOTAwMEZEMEU5MDAwMTIKKzoxMDAxMzAwMEY4MEVFMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRDkKKzoxMDAxNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwQUYKKzoxMDAxNTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOUYKKzoxMDAxNjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOEYKKzoxMDAxNzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwN0YKKzoxMDAxODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNkYKKzoxMDAxOTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNUYKKzoxMDAxQTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNEYKKzoxMDAxQjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM0YKKzoxMDAxQzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMkYKKzoxMDAxRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMUYKKzoxMDAxRTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEYKKzoxMDAxRjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRkYKKzoxMDAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRUUKKzowQjAyMTAwMDAwMDAwMDAwMDAwMDAwMDAyQTM2MkU1NQorOjAwMDAwMDAxRkYKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBNaWNybyBjb2RlIGZvciB0aGUgODA4NjoxMjI5IFJldiBGLzEwICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2Zpcm13YXJlL3RpZ29uL3RnMy5iaW4uaWhleCBiL2Zpcm13YXJlL3RpZ29uL3RnMy5iaW4uaWhleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODQyZDdjCi0tLSAvZGV2L251bGwKKysrIGIvZmlybXdhcmUvdGlnb24vdGczLmJpbi5paGV4CkBAIC0wLDAgKzEsMTc1IEBACis6MTAwMDAwMDAwMDAwMDAwMDA4MDAwMDAwMDAwMDBBODAwMDAwMDAwMDVFCis6MTAwMDEwMDAxMDAwMDAwMzAwMDAwMDAwMDAwMDAwMEQwMDAwMDAwREIzCis6MTAwMDIwMDAzQzFEMDgwMDM3QkQzRkZDMDNBMEYwMjEzQzEwMDgwMDM4Cis6MTAwMDMwMDAyNjEwMDAwMDBFMDAwMDE4MDAwMDAwMDAwMDAwMDAwRDU3Cis6MTAwMDQwMDAzQzFEMDgwMDM3QkQzRkZDMDNBMEYwMjEzQzEwMDgwMDE4Cis6MTAwMDUwMDAyNjEwMDAzNDBFMDAwMjFDMDAwMDAwMDAwMDAwMDAwREZECis6MTAwMDYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyN0JERkZFMENECis6MTAwMDcwMDAzQzFDQzAwMEFGQkYwMDE4QUY4MDY4MEMwRTAwMDA0Q0U1Cis6MTAwMDgwMDAyNDFCMjEwNTk3ODUwMDAwOTc4NzAwMDI5NzgyMDAyQzhBCis6MTAwMDkwMDA5NzgzMDAyRTNDMDQwODAwMjQ4NDA5QzBBRkEwMDAxNEZDCis6MTAwMEEwMDAwMDAyMTQwMDAwNjIxODI1MDAwNTJDMDBBRkEzMDAxMDA4Cis6MTAwMEIwMDA4Rjg2MDAxMDAwRTUyODI1MEUwMDAwNjAyNDA3MDEwMjRECis6MTAwMEMwMDAzQzAyQUMwMDM0NDIwMTAwM0MwM0FDMDEzNDYzMDEwMDRCCis6MTAwMEQwMDBBRjgyMDQ5MDNDMDJGRkZGQUY4MjA0OTRBRjgzMDQ5ODg4Cis6MTAwMEUwMDBBRjgyMDQ5QzI0MDIwMDAxQUY4MjVDRTAwRTAwMDAzRjVFCis6MTAwMEYwMDBBRjgyNUQwMDBFMDAwMTQwMDAwMDAwMDA4RkJGMDAxOEJECis6MTAwMTAwMDAwM0UwMDAwODI3QkQwMDIwMjQwMkZGRkZBRjgyNTQwNDUzCis6MTAwMTEwMDA4RjgzNTQwMDM0NjMwNDAwQUY4MzU0MDBBRjgyNTQwNENGCis6MTAwMTIwMDAzQzAyMDgwMDI0NDIwMDM0QUY4MjU0MUMwM0UwMDAwODYzCis6MTAwMTMwMDBBRjgwNTQwMDAwMDAwMDAwMDAwMDAwMDAzQzAyMDgwMEY2Cis6MTAwMTQwMDAzNDQyMzAwMDNDMDMwODAwMzQ2MzMwMDAzQzA0MDgwMEIzCis6MTAwMTUwMDAzNDg0MzdGRjNDMDEwODAwQUMyMjBBNjQyNDAyMDA0MENBCis6MTAwMTYwMDAzQzAxMDgwMEFDMjIwQTY4M0MwMTA4MDBBQzIwMEE2MDhGCis6MTAwMTcwMDBBQzYwMDAwMDI0NjMwMDA0MDA4MzEwMkI1MDQwRkZGRDlFCis6MTAwMTgwMDBBQzYwMDAwMDAzRTAwMDA4MDAwMDAwMDAwMDgwNDgyMThGCis6MTAwMTkwMDA4RkFBMDAxMDNDMDIwODAwOEM0MjBBNjAzQzA0MDgwMDUwCis6MTAwMUEwMDA4Qzg0MEE2ODhGQUIwMDE0MjQ0MzAwMDEwMDQ0MTAyQjk4Cis6MTAwMUIwMDAzQzAxMDgwMEFDMjMwQTYwMTQ0MDAwMDMwMDAwNDAyMTA5Cis6MTAwMUMwMDAzQzAxMDgwMEFDMjAwQTYwM0MwMjA4MDA4QzQyMEE2MDM2Cis6MTAwMUQwMDAzQzAzMDgwMDhDNjMwQTY0OTEyNDAwMDAwMDAyMTE0MDczCis6MTAwMUUwMDAwMDQzMTAyMTAwNDgxMDIxMjUwODAwMDFBMDQ0MDAwMDEwCis6MTAwMUYwMDAyOTAyMDAwODE0NDBGRkY0MjUyOTAwMDEzQzAyMDgwMEYwCis6MTAwMjAwMDA4QzQyMEE2MDNDMDMwODAwOEM2MzBBNjQ4Rjg0NjgwQzhCCis6MTAwMjEwMDAwMDAyMTE0MDAwNDMxMDIxQUM0NDAwMDhBQzQ1MDAwQzIyCis6MTAwMjIwMDBBQzQ2MDAxMEFDNDcwMDE0QUM0QTAwMTgwM0UwMDAwOENDCis6MTAwMjMwMDBBQzRCMDAxQzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEFCCis6MTAwMjQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEFFCis6MTAwMjUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDlFCis6MTAwMjYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDhFCis6MTAwMjcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDdFCis6MTAwMjgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDZFCis6MTAwMjkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDVFCis6MTAwMkEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDRFCis6MTAwMkIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDNFCis6MTAwMkMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDJFCis6MTAwMkQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFFCis6MTAwMkUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFCis6MTAwMkYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEZFCis6MTAwMzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjAwMDAwOEUzCis6MTAwMzEwMDAwMDAwMDAwMDBBMDAwMUUzM0MwQTAwMDEwQTAwMDFFM0JBCis6MTAwMzIwMDAzQzBBMDAwMjBBMDAwMUUzMDAwMDAwMDAwQTAwMDFFM0E5Cis6MTAwMzMwMDAwMDAwMDAwMDBBMDAwMUUzMDAwMDAwMDAwQTAwMDFFM0UxCis6MTAwMzQwMDAwMDAwMDAwMDBBMDAwMUUzMDAwMDAwMDAwQTAwMDFFM0QxCis6MTAwMzUwMDAwMDAwMDAwMDBBMDAwMUUzMDAwMDAwMDAwQTAwMDFFM0MxCis6MTAwMzYwMDAwMDAwMDAwMDBBMDAwMUUzMDAwMDAwMDAwQTAwMDFFM0IxCis6MTAwMzcwMDAzQzBBMDAwNzBBMDAwMUUzM0MwQTAwMDgwQTAwMDFFMzA2Cis6MTAwMzgwMDAzQzBBMDAwOTBBMDAwMUUzMDAwMDAwMDAwQTAwMDFFMzQyCis6MTAwMzkwMDAwMDAwMDAwMDBBMDAwMUUzM0MwQTAwMEIwQTAwMDFFMzMwCis6MTAwM0EwMDAzQzBBMDAwQzBBMDAwMUUzM0MwQTAwMEQwQTAwMDFFM0NDCis6MTAwM0IwMDAwMDAwMDAwMDBBMDAwMUUzMDAwMDAwMDAwQTAwMDFFMzYxCis6MTAwM0MwMDAzQzBBMDAwRTBBMDAwMUUzMDAwMDAwMDAwQTAwMDFFM0ZECis6MTAwM0QwMDAwMDAwMDAwMDBBMDAwMUUzMDAwMDAwMDAwQTAwMDFFMzQxCis6MTAwM0UwMDAwMDAwMDAwMDBBMDAwMUUzMDAwMDAwMDAwQTAwMDFFMzMxCis6MTAwM0YwMDAwMDAwMDAwMDBBMDAwMUUzMDAwMDAwMDAwQTAwMDFFMzIxCis6MTAwNDAwMDAwMDAwMDAwMDBBMDAwMUUzM0MwQTAwMTMwQTAwMDFFM0I3Cis6MTAwNDEwMDAzQzBBMDAxNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDgyCis6MTAwNDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMENDCis6MTAwNDMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEJDCis6MTAwNDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEFDCis6MTAwNDUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDlDCis6MTAwNDYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDhDCis6MTAwNDcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDdDCis6MTAwNDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDZDCis6MTAwNDkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDVDCis6MTAwNEEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDRDCis6MTAwNEIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDNDCis6MTAwNEMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDJDCis6MTAwNEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFDCis6MTAwNEUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBDCis6MTAwNEYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEZDCis6MTAwNTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyN0JERkZFMDI4Cis6MTAwNTEwMDAwMDAwMTgyMTAwMDAxMDIxQUZCRjAwMThBRkIxMDAxNDc3Cis6MTAwNTIwMDBBRkIwMDAxMDNDMDEwODAwMDAyMjA4MjFBQzIwMEE3MDg2Cis6MTAwNTMwMDAzQzAxMDgwMDAwMjIwODIxQUMyMDBBNzQzQzAxMDgwMDlDCis6MTAwNTQwMDAwMDIyMDgyMUFDMjAwQTc4MjQ2MzAwMDExODYwRkZGNTFFCis6MTAwNTUwMDAyNDQyMDAwQzI0MTEwMDAxOEY5MDY4MTAzMjAyMDAwNDI0Cis6MTAwNTYwMDAxNDQwMDAwNTI0MDQwMDAxM0MwMjA4MDA4QzQyMEE3ODczCis6MTAwNTcwMDAxODQwMDAwMzAwMDAyMDIxMEUwMDAxODIwMDAwMDAwMDRFCis6MTAwNTgwMDAzMjAyMDAwMTEwNDAwMDAzMDAwMDAwMDAwRTAwMDE2OTZCCis6MTAwNTkwMDAwMDAwMDAwMDBBMDAwMTUzQUY5MTUwMjg4RkJGMDAxOERGCis6MTAwNUEwMDA4RkIxMDAxNDhGQjAwMDEwMDNFMDAwMDgyN0JEMDAyMEI5Cis6MTAwNUIwMDAzQzA1MDgwMDhDQTUwQTcwM0MwNjA4MDA4Q0M2MEE4MDIxCis6MTAwNUMwMDAzQzA3MDgwMDhDRTcwQTc4MjdCREZGRTAzQzA0MDgwMEUwCis6MTAwNUQwMDAyNDg0MDlEMEFGQkYwMDE4QUZBMDAwMTAwRTAwMDA2MDQ3Cis6MTAwNUUwMDBBRkEwMDAxNDBFMDAwMTdCMDAwMDIwMjE4RkJGMDAxODc3Cis6MTAwNUYwMDAwM0UwMDAwODI3QkQwMDIwMjQwMjAwMDE4RjgzNjgxMDVCCis6MTAwNjAwMDAwMDgyMTAwNDAwMDIxMDI3MDA2MjE4MjQwM0UwMDAwODkyCis6MTAwNjEwMDBBRjgzNjgxMDI3QkRGRkQ4QUZCRjAwMjQxMDgwMDAyRTI1Cis6MTAwNjIwMDBBRkIwMDAyMDhGODI1Q0VDQUZBMjAwMTg4RjgyNUNFQzMwCis6MTAwNjMwMDAzQzEwMDgwMDI2MTAwQTc4QUZBMjAwMUMzNDAyODAwMDhCCis6MTAwNjQwMDBBRjgyNUNFQzhFMDIwMDAwMTg0MDAwMTYwMDAwMDAwMDMzCis6MTAwNjUwMDAzQzAyMDgwMDk0NDIwQTc0OEZBMzAwMUMwMDAyMjFDMENGCis6MTAwNjYwMDBBQzgzMDAwNDhGQTIwMDFDM0MwMTA4MDAwRTAwMDIwMUI0Cis6MTAwNjcwMDBBQzIyMEE3NDEwNDAwMDA1MDAwMDAwMDA4RTAyMDAwMDQ5Cis6MTAwNjgwMDAyNDQyMDAwMTBBMDAwMURGQUUwMjAwMDAzQzAyMDgwMDIzCis6MTAwNjkwMDA4QzQyMEE3MDAwMDIxQzAyMDAwMzIxQzAwQTAwMDFDNTNFCis6MTAwNkEwMDBBRkEyMDAxQzBFMDAwMjAxMDAwMDAwMDAxMDQwMDAxRjVECis6MTAwNkIwMDAwMDAwMDAwMDhFMDIwMDAwOEZBMzAwMUMyNDQyMDAwMUY1Cis6MTAwNkMwMDAzQzAxMDgwMEFDMjMwQTcwM0MwMTA4MDBBQzIzMEE3NDBBCis6MTAwNkQwMDAwQTAwMDFERkFFMDIwMDAwM0MxMDA4MDAyNjEwMEE3ODc0Cis6MTAwNkUwMDA4RTAyMDAwMDE4NDAwMDI4MDAwMDAwMDAwRTAwMDIwMUU5Cis6MTAwNkYwMDAwMDAwMDAwMDE0NDAwMDI0MDAwMDAwMDA4RTAyMDAwMEYyCis6MTAwNzAwMDAzQzAzMDgwMDhDNjMwQTcwMjQ0MkZGRkZBRkEzMDAxQzY3Cis6MTAwNzEwMDAxODQwMDAwNkFFMDIwMDAwMDAwMzE0MDIwMDAyMjFDMENGCis6MTAwNzIwMDA4QzgyMDAwNDNDMDEwODAwQUMyMjBBNzA5N0EyMDAxRUQzCis6MTAwNzMwMDAyNDQyRkYwMDJDNDIwMzAwMTQ0MDAwMEIyNDAyNDAwMDFFCis6MTAwNzQwMDAzQzA0MDgwMDI0ODQwOURDQUZBMDAwMTBBRkEwMDAxNDEyCis6MTAwNzUwMDA4RkE2MDAxQzI0MDUwMDA4MEUwMDAwNjAwMDAwMzgyMTUwCis6MTAwNzYwMDAwQTAwMDFERjAwMDAwMDAwQUY4MjVDRjgzQzAyMDgwMEQ0Cis6MTAwNzcwMDA4QzQyMEE0MDhGQTMwMDFDMjQ0MjAwMDFBRjgzNUNGODI2Cis6MTAwNzgwMDAzQzAxMDgwMEFDMjIwQTQwOEZCRjAwMjQ4RkIwMDAyMDNCCis6MTAwNzkwMDAwM0UwMDAwODI3QkQwMDI4MjdCREZGRTAzQzA0MDgwMDU3Cis6MTAwN0EwMDAyNDg0MDlFODAwMDAyODIxMDAwMDMwMjEwMDAwMzgyMUJECis6MTAwN0IwMDBBRkJGMDAxOEFGQTAwMDEwMEUwMDAwNjBBRkEwMDAxNDgzCis6MTAwN0MwMDA4RkJGMDAxODAzRTAwMDA4MjdCRDAwMjA4RjgyNjgwQzRGCis6MTAwN0QwMDA4Rjg1NjgwQzAwMDIxODI3MDAwMzE4MkIwMDAzMTgyM0NDCis6MTAwN0UwMDAwMDQzMTAyNDAwNDQxMDIxMDBBMjI4MkIxMEEwMDAwNjcyCis6MTAwN0YwMDAwMDAwMDAwMDAwNDAxODIxOEY4MjY4MEMwMDQzMTAyQjdECis6MTAwODAwMDAxNDQwRkZGRDAwMDAwMDAwMDNFMDAwMDgwMDAwMDAwMEFECis6MTAwODEwMDAzQzA0MDgwMDhDODQwMDAwM0MwMzA4MDA4QzYzMEE0MDAwCis6MTAwODIwMDAwMDY0MTAyQjU0NDAwMDAyMDA4MzEwMjMwMDY0MTAyMzQ2Cis6MTAwODMwMDAyQzQyMDAwODAzRTAwMDA4Mzg0MjAwMDEyN0JERkZFMDE5Cis6MTAwODQwMDAwMDgwMjgyMTNDMDQwODAwMjQ4NDBBMDAwMDAwMzAyMTk0Cis6MTAwODUwMDAwMDAwMzgyMUFGQkYwMDE4QUZBMDAwMTAwRTAwMDA2MEVDCis6MTAwODYwMDBBRkEwMDAxNDBBMDAwMjE2MDAwMDAwMDA4RkJGMDAxODlECis6MTAwODcwMDAwM0UwMDAwODI3QkQwMDIwMDAwMDAwMDAyN0JERkZFMEM2Cis6MTAwODgwMDAzQzFDQzAwMEFGQkYwMDE4MEUwMDAwNENBRjgwNjgwQ0NECis6MTAwODkwMDAzQzA0MDgwMDI0ODQwQTEwMDM4MDI4MjEwMDAwMzAyMTMxCis6MTAwOEEwMDAwMDAwMzgyMUFGQTAwMDEwMEUwMDAwNjBBRkEwMDAxNEJGCis6MTAwOEIwMDAyNDAyRkZGRkFGODI1NDA0M0MwMjAwQUEwRTAwMDIzNDVGCis6MTAwOEMwMDBBRjgyNTQzNDhGQkYwMDE4MDNFMDAwMDgyN0JEMDAyMDFBCis6MTAwOEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyN0JERkZFODRECis6MTAwOEUwMDBBRkIwMDAxMDI0MTAwMDAxQUZCRjAwMTQzQzAxQzAwM0UyCis6MTAwOEYwMDBBQzIwMDAwMDhGODI2ODEwMzA0MjIwMDAxMDQwMDAwM0JFCis6MTAwOTAwMDAwMDAwMDAwMDBFMDAwMjQ2MDAwMDAwMDAwQTAwMDIzQTRCCis6MTAwOTEwMDBBRjkwNTQyODhGQkYwMDE0OEZCMDAwMTAwM0UwMDAwODgwCis6MTAwOTIwMDAyN0JEMDAxODI3QkRGRkY4OEY4NDVEMEMzQzAyMDBGRjM3Cis6MTAwOTMwMDAzQzAzMDgwMDhDNjMwQTUwMzQ0MkZGRjgwMDgyMTAyNDA0Cis6MTAwOTQwMDAxMDQzMDAxRTNDMDUwMEZGMzRBNUZGRjgzQzA2QzAwMzIxCis6MTAwOTUwMDAzQzA3NDAwMDAwODUxODI0OEM2MjAwMTAzQzAxMDgwMDEwCis6MTAwOTYwMDBBQzIzMEE1MDMwNDIwMDA4MTA0MDAwMDUwMDg3MTAyNUQzCis6MTAwOTcwMDA4Q0MyMDAwMDI0NDIwMDAxQUNDMjAwMDAwMDg3MTAyNTk4Cis6MTAwOTgwMDBBRjgyNUQwQzhGQTIwMDAwMjQ0MjAwMDFBRkEyMDAwMEU0Cis6MTAwOTkwMDA4RkEyMDAwMDhGQTIwMDAwMjQ0MjAwMDFBRkEyMDAwMDNECis6MTAwOUEwMDA4RkEyMDAwMDhGODQ1RDBDM0MwMzA4MDA4QzYzMEE1MDBBCis6MTAwOUIwMDAwMDg1MTAyNDE0NDNGRkU4MDA4NTE4MjQyN0JEMDAwODkzCis6MTAwOUMwMDAwM0UwMDAwODAwMDAwMDAwMDAwMDAwMDAzNTM3MzAzMTZGCis6MTAwOUQwMDA3MjZDNzM0MTAwMDAwMDAwMDAwMDAwMDA1Mzc3NDU3NjAwCis6MTAwOUUwMDA2NTZFNzQzMDAwMDAwMDAwNzI2QzcwNDU3NjY1NkU3NDQwCis6MTAwOUYwMDAzMTAwMDAwMDU1NkU2QjZFNDU3NjZFNzQwMDAwMDAwMDhECis6MTAwQTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2NjYxNzQ2MTRBCis6MTAwQTEwMDA2QzQ1NzI3MjAwMDAwMDAwMDAwMDAwMDA0RDYxNjk2RUJDCis6MTAwQTIwMDA0MzcwNzU0MjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDVDCis6MTAwQTMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEI2Cis6MTAwQTQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEE2Cis6MTAwQTUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDk2Cis6MEMwQTYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4QQorOjAwMDAwMDAxRkYKKyAqIEZpcm13YXJlIGlzOgorICoJRGVyaXZlZCBmcm9tIHByb3ByaWV0YXJ5IHVucHVibGlzaGVkIHNvdXJjZSBjb2RlLAorICoJQ29weXJpZ2h0IChDKSAyMDAwLTIwMDMgQnJvYWRjb20gQ29ycG9yYXRpb24uCisgKgorICoJUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCBmb3IgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpcm13YXJlCisgKglkYXRhIGluIGhleGFkZWNpbWFsIG9yIGVxdWl2YWxlbnQgZm9ybWF0LCBwcm92aWRlZCB0aGlzIGNvcHlyaWdodAorICoJbm90aWNlIGlzIGFjY29tcGFueWluZyBpdC4KZGlmZiAtLWdpdCBhL2Zpcm13YXJlL3RpZ29uL3RnM190c28uYmluLmloZXggYi9maXJtd2FyZS90aWdvbi90ZzNfdHNvLmJpbi5paGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMGM0ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9maXJtd2FyZS90aWdvbi90ZzNfdHNvLmJpbi5paGV4CkBAIC0wLDAgKzEsNDQ2IEBACis6MTAwMDAwMDAwMTA2MDAwMDA4MDAwMDAwMDAwMDI0MTQwRTAwMDAwMzk4Cis6MTAwMDEwMDAwMDAwMDAwMDA4MDAxQjI0MDAwMDAwMDAxMDAwMDAwMzg2Cis6MTAwMDIwMDAwMDAwMDAwMDAwMDAwMDBEMDAwMDAwMEQzQzFEMDgwMDU1Cis6MTAwMDMwMDAzN0JENDAwMDAzQTBGMDIxM0MxMDA4MDAyNjEwMDAwMDRFCis6MTAwMDQwMDAwRTAwMDAxMDAwMDAwMDAwMDAwMDAwMEQyN0JERkZFMEMyCis6MTAwMDUwMDAzQzA0RkVGRUFGQkYwMDE4MEUwMDA1RDgzNDg0MDAwMjM5Cis6MTAwMDYwMDAwRTAwMDY2ODAwMDAwMDAwM0MwMzA4MDA5MDYzMUI2ODU3Cis6MTAwMDcwMDAyNDAyMDAwMjNDMDQwODAwMjQ4NDFBQUMxNDYyMDAwMzI5Cis6MTAwMDgwMDAyNDA1MDAwMTNDMDQwODAwMjQ4NDFBQTAyNDA2MDAwNjZDCis6MTAwMDkwMDAwMDAwMzgyMUFGQTAwMDEwMEUwMDA2N0NBRkEwMDAxNEI1Cis6MTAwMEEwMDA4RjYyNUM1MDM0NDIwMDAxQUY2MjVDNTA4RjYyNUM5MEEyCis6MTAwMEIwMDAzNDQyMDAwMUFGNjI1QzkwMjQwMkZGRkYwRTAwMDAzNDY2Cis6MTAwMEMwMDBBRjYyNTQwNDhGQkYwMDE4MDNFMDAwMDgyN0JEMDAyMDcyCis6MTAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyN0JERkZFMDVECis6MTAwMEUwMDBBRkJGMDAxQ0FGQjIwMDE4QUZCMTAwMTQwRTAwMDA1QjMwCis6MTAwMEYwMDBBRkIwMDAxMDI0MTIwMDAyMjQxMTAwMDE4RjcwNjgyMDlDCis6MTAwMTAwMDAzMjAyMDEwMDEwNDAwMDAzMDAwMDAwMDAwRTAwMDBCQjlFCis6MTAwMTEwMDAwMDAwMDAwMDhGNzA2ODIwMzIwMjIwMDAxMDQwMDAwNEIwCis6MTAwMTIwMDAzMjAyMDAwMTBFMDAwMUYwMjQwNDAwMDEzMjAyMDAwMTNECis6MTAwMTMwMDAxMDQwMDAwMzAwMDAwMDAwMEUwMDAwQTMwMDAwMDAwMEJCCis6MTAwMTQwMDAzQzAyMDgwMDkwNDIxQjk4MTQ1MjAwMDMwMDAwMDAwMDdCCis6MTAwMTUwMDAwRTAwMDRDMDAwMDAwMDAwMEEwMDAwM0NBRjcxNTAyOEVGCis6MTAwMTYwMDA4RkJGMDAxQzhGQjIwMDE4OEZCMTAwMTQ4RkIwMDAxMDI5Cis6MTAwMTcwMDAwM0UwMDAwODI3QkQwMDIwMjdCREZGRTAzQzA0MDgwMDg1Cis6MTAwMTgwMDAyNDg0MUFDMDAwMDAyODIxMDAwMDMwMjEwMDAwMzgyMUZBCis6MTAwMTkwMDBBRkJGMDAxOEFGQTAwMDEwMEUwMDA2N0NBRkEwMDAxNDg3Cis6MTAwMUEwMDAzQzA0MDgwMDI0ODQyM0Q4QTQ4MDAwMDAzQzAxMDgwMEZCCis6MTAwMUIwMDBBMDIwMUI5ODNDMDEwODAwQUMyMDFCOUMzQzAxMDgwMEJGCis6MTAwMUMwMDBBQzIwMUJBMDNDMDEwODAwQUMyMDFCQTQzQzAxMDgwMDkzCis6MTAwMUQwMDBBQzIwMUJBQzNDMDEwODAwQUMyMDFCQjgzQzAxMDgwMDYzCis6MTAwMUUwMDBBQzIwMUJCQzhGNjI0NDM0M0MwMTA4MDBBQzIyMUI4ODRECis6MTAwMUYwMDA4RjYyNDQzODNDMDEwODAwQUMyMjFCOEM4RjYyNDQxMDkzCis6MTAwMjAwMDBBQzgwRjdBODNDMDEwODAwQUMyMDFCODQzQzAxMDgwMDJFCis6MTAwMjEwMDBBQzIwMjNFMDNDMDEwODAwQUMyMDIzQzgzQzAxMDgwMENFCis6MTAwMjIwMDBBQzIwMjNDQzNDMDEwODAwQUMyMDI0MDAzQzAxMDgwMDk5Cis6MTAwMjMwMDBBQzIyMUI5MDhGNjIwMDY4MjQwMzAwMDcwMDAyMTcwMkEzCis6MTAwMjQwMDAxMDQzMDAwNTAwMDAwMDAwOEY2MjAwNjgwMDAyMTcwMkUyCis6MTAwMjUwMDAxNDQwMDAwNDI0MDIwMDAxM0MwMTA4MDAwQTAwMDA5NzM5Cis6MTAwMjYwMDBBQzIwMjQwQ0FDODIwMDM0M0MwNDA4MDAyNDg0MUFDQzVBCis6MTAwMjcwMDAzQzA1MDgwMDhDQTUyNDBDMDAwMDMwMjEwMDAwMzgyMTJBCis6MTAwMjgwMDBBRkEwMDAxMDBFMDAwNjdDQUZBMDAwMTQ4RkJGMDAxOEI2Cis6MTAwMjkwMDAwM0UwMDAwODI3QkQwMDIwMjdCREZGRTAzQzA0MDgwMDY0Cis6MTAwMkEwMDAyNDg0MUFEODAwMDAyODIxMDAwMDMwMjEwMDAwMzgyMUMxCis6MTAwMkIwMDBBRkJGMDAxOEFGQTAwMDEwMEUwMDA2N0NBRkEwMDAxNDY2Cis6MTAwMkMwMDAwRTAwMDA1QjAwMDAwMDAwMEUwMDAwQjQwMDAwMjAyMUMyCis6MTAwMkQwMDA4RkJGMDAxODAzRTAwMDA4MjdCRDAwMjAyNDAyMDAwMUEyCis6MTAwMkUwMDA4RjYzNjgyMDAwODIxMDA0MDAwMjEwMjcwMDYyMTgyNDI3Cis6MTAwMkYwMDAwM0UwMDAwOEFGNjM2ODIwMjdCREZGRDBBRkJGMDAyQzJDCis6MTAwMzAwMDBBRkI2MDAyOEFGQjUwMDI0QUZCNDAwMjBBRkIzMDAxQ0Q3Cis6MTAwMzEwMDBBRkIyMDAxOEFGQjEwMDE0QUZCMDAwMTA4RjY3NUM1Q0QzCis6MTAwMzIwMDAzQzAzMDgwMDI0NjMxQkJDOEM2MjAwMDAxNDQ3MDAwNURBCis6MTAwMzMwMDAzQzAyMDBGRjNDMDIwODAwOTA0MjFCOTgxNDQwMDExOTQ3Cis6MTAwMzQwMDAzQzAyMDBGRjM0NDJGRkY4MDBFMjg4MjRBQzY3MDAwMDYyCis6MTAwMzUwMDAwMDExMTkwMjMwNjMwMEZGMzBFMjAwMDMwMDAyMTFDMEY3Cis6MTAwMzYwMDAwMDYyMjgyNTAwQTA0MDIxMDAwNzE2MDIzQzAzMDgwMDc3Cis6MTAwMzcwMDA5MDYzMUI5ODMwNDQwMDBGMTQ2MDAwMzYwMDgwNDgyMUMxCis6MTAwMzgwMDAyNDAyMDAwMTNDMDEwODAwQTAyMjFCOTgwMDA1MTEwMDc2Cis6MTAwMzkwMDAwMDgyMTAyNTNDMDEwODAwQUMyMDFCOUMzQzAxMDgwMDk5Cis6MTAwM0EwMDBBQzIwMUJBMDNDMDEwODAwQUMyMDFCQTQzQzAxMDgwMEIxCis6MTAwM0IwMDBBQzIwMUJBQzNDMDEwODAwQUMyMDFCQjgzQzAxMDgwMDgxCis6MTAwM0MwMDBBQzIwMUJCMDNDMDEwODAwQUMyMDFCQjQzQzAxMDgwMDcxCis6MTAwM0QwMDBBNDIyMjNEODk2MjIwMDBDMzA0MzdGRkYzQzAxMDgwMDYyCis6MTAwM0UwMDBBNDIyMjQxMDMwNDI4MDAwM0MwMTA4MDBBNDIzMUJDNjM0Cis6MTAwM0YwMDAxMDQwMDAwNTI0MDIwMDAxM0MwMTA4MDBBQzIyMjNGNDU3Cis6MTAwNDAwMDAwQTAwMDEwMjI0MDYwMDNFMjQwNjAwMzYzQzAxMDgwMEQyCis6MTAwNDEwMDBBQzIwMjNGNDk2MjIwMDBBM0MwMzA4MDA5NDYzMUJDNjE4Cis6MTAwNDIwMDAzQzAxMDgwMEFDMjAyM0YwM0MwMTA4MDBBQzIwMjNGODdDCis6MTAwNDMwMDAwMDAyMTMwMjAwMDIxMDgwMDBDMjEwMjEwMDYyMTgyMTg1Cis6MTAwNDQwMDAzQzAxMDgwMEE0MjIyM0QwM0MwMTA4MDAwQTAwMDExNTQ5Cis6MTAwNDUwMDBBNDIzMUI5Njk2MjIwMDBDM0MwMTA4MDBBNDIyMjNFQzQ2Cis6MTAwNDYwMDAzQzA0MDgwMDI0ODQxQjlDOEM4MjAwMDAwMDAyMTEwMEM0Cis6MTAwNDcwMDAzQzAxMDgwMDAwMjIwODIxQUMzMTFCQzg4QzgyMDAwMDFFCis6MTAwNDgwMDAwMDAyMTEwMDNDMDEwODAwMDAyMjA4MjFBQzI3MUJDQzBGCis6MTAwNDkwMDA4QzgyMDAwMDI1MDMwMDAxMzA2NjAxRkYwMDAyMTEwMDdDCis6MTAwNEEwMDAzQzAxMDgwMDAwMjIwODIxQUMyNjFCRDA4QzgyMDAwMEYxCis6MTAwNEIwMDAwMDAyMTEwMDNDMDEwODAwMDAyMjA4MjFBQzI5MUJENEQ1Cis6MTAwNEMwMDA5NjIzMDAwODNDMDIwODAwOEM0MjFCQUMwMDQzMjgyMTA0Cis6MTAwNEQwMDAzQzAxMDgwMEFDMjUxQkFDOTYyMjAwMEEzMDQyMDAwNDA3Cis6MTAwNEUwMDAxNDQwMDAxODAwMDYxMTAwOEY2MzBDMTQzMDYzMDAwRkQ1Cis6MTAwNEYwMDAyQzYyMDAwMjE0NDAwMDBCM0MwMkMwMDA4RjYzMEMxNEZECis6MTAwNTAwMDAzQzAyMDgwMDhDNDIxQjQwMzA2MzAwMEYyNDQyMDAwMTczCis6MTAwNTEwMDAzQzAxMDgwMEFDMjIxQjQwMkM2MjAwMDIxMDQwRkZGNzk3Cis6MTAwNTIwMDAzQzAyQzAwMDAwRTIxODI1QUY2MzVDNUM4RjYyNUM1MDQ3Cis6MTAwNTMwMDAzMDQyMDAwMjEwNDAwMDE0MDAwMDAwMDAwQTAwMDE0NzkxCis6MTAwNTQwMDAwMDAwMDAwMDNDMDMwODAwOEM2MzFCODAzQzA0MDgwMDkyCis6MTAwNTUwMDA5NDg0MUI5NDAxMjIxMDI1M0MwMTA4MDBBNDIyMjNEQTc0Cis6MTAwNTYwMDAyNDAyMDAwMTNDMDEwODAwQUMyMjFCQjgyNDYzMDAwMUY2Cis6MTAwNTcwMDAwMDg1MjAyQTNDMDEwODAwMTA4MDAwMDNBQzIzMUI4MDZBCis6MTAwNTgwMDAzQzAxMDgwMEE0MjUxQjk0M0MwNjA4MDAyNEM2MUI5Q0MzCis6MTAwNTkwMDA4Q0MyMDAwMDI0NDIwMDAxQUNDMjAwMDAyODQyMDA4MDRFCis6MTAwNUEwMDAxNDQwMDAwNTAwMDAwMDAwMEUwMDA2NTYyNDA0MDAwMjVFCis6MTAwNUIwMDAwQTAwMDFFNjAwMDAwMDAwM0MwMjA4MDA4QzQyMUJCODYzCis6MTAwNUMwMDAxMDQwMDA3ODI0MDIwMDAxM0MwNTA4MDA5MEE1MUI5ODBCCis6MTAwNUQwMDAxNEEyMDA3MjAwMDAwMDAwM0MxNTA4MDA5NkI1MUI5NjlFCis6MTAwNUUwMDAzQzA0MDgwMDhDODQxQkFDMzJBM0ZGRkYwMDgzMTAyQTVDCis6MTAwNUYwMDAxNDQwMDA2QzAwMDAwMDAwMTQ4MzAwMDMwMDAwMDAwMEExCis6MTAwNjAwMDAzQzAxMDgwMEFDMjUyM0YwMTA2MDAwNUMwMDAwOTAyMTQ0Cis6MTAwNjEwMDAyNEQ2MDAwNDAwNjBBMDIxMjREMzAwMTQ4RUMyMDAwMDYwCis6MTAwNjIwMDAwMDAyODEwMDNDMTEwODAwMDIzMDg4MjEwRTAwMDYyNURFCis6MTAwNjMwMDA4RTMxMUJDODAwNDAyODIxMTBBMDAwNTQwMDAwMDAwMDhCCis6MTAwNjQwMDA5NjI4MDAwQTMxMDIwMDQwMTA0MDAwMDUyNDA3MTgwQ0NCCis6MTAwNjUwMDA4RTIyMDAwQzI0MDcxODhDMDAwMjE0MDBBQ0EyMDAxODkzCis6MTAwNjYwMDAzQzAzMDgwMDAwNzAxODIxOEM2MzFCRDAzQzAyMDgwMDdBCis6MTAwNjcwMDAwMDUwMTAyMThDNDIxQkQ0MDAwMzFEMDAwMDAyMTQwMDA2Cis6MTAwNjgwMDAwMDYyMTgyNUFDQTMwMDE0OEVDMzAwMDQ5NjIyMDAwODUzCis6MTAwNjkwMDAwMDQzMjAyMzMyNDJGRkZGMzA4M0ZGRkYwMDQzMTAyMTNECis6MTAwNkEwMDAwMjgyMTAyQTE0NDAwMDAyMDJCMjMwMjMwMDgwMzAyMTVFCis6MTAwNkIwMDA4RTYyMDAwMDMwQzRGRkZGMDA0NDEwMjFBRTYyMDAwMEQzCis6MTAwNkMwMDA4RTIyMDAwMEFDQTIwMDAwOEUyMjAwMDQ4RTYzRkZGNDk0Cis6MTAwNkQwMDAwMDQzMTAyMUFDQTIwMDA0QTRBNjAwMEU4RTYyRkZGNDE5Cis6MTAwNkUwMDAwMDQ0MTAyMUFFNjJGRkY0OTYyMzAwMDgwMDQzMTAyQTU0Cis6MTAwNkYwMDAxNDQwMDAwNTAyNDY5MDIxOEU2MkZGRjBBRTYwRkZGNEM4Cis6MTAwNzAwMDAyNDQyMDAwMUFFNjJGRkYwQUNBMDAwMDgzMjQyRkZGRkJECis6MTAwNzEwMDAxNDU0MDAwODI0MDIwMzA1MzEwMjAwODA1NDQwMDAwMUYzCis6MTAwNzIwMDAzNEU3MDAxMDI0MDIwOTA1QTRBMjAwMEMwQTAwMDFDQjQyCis6MTAwNzMwMDAzNEU3MDAyMEE0QTIwMDBDM0MwMjA4MDA4QzQyMjNGMDA1Cis6MTAwNzQwMDAxMDQwMDAwMzNDMDI0QjY1MEEwMDAxRDMzNDQyNzY1NDRBCis6MTAwNzUwMDAzQzAyQjQ5QTM0NDI4OUFCQUNBMjAwMUMzMEUyRkZGRkU5Cis6MTAwNzYwMDBBQ0EyMDAxMDBFMDAwNUEyMDBBMDIwMjEzMjQyRkZGRjIzCis6MTAwNzcwMDAwMDU0MTAyQjE0NDBGRkE5MDAwMDAwMDAyNDAyMDAwMkM2Cis6MTAwNzgwMDAzQzAxMDgwMDBBMDAwMUU2QTAyMjFCOTg4RUMyMDgzQzJBCis6MTAwNzkwMDAyNDQyMDAwMTBBMDAwMUU2QUVDMjA4M0MwRTAwMDRDMDdCCis6MTAwN0EwMDAwMDAwMDAwMDhGQkYwMDJDOEZCNjAwMjg4RkI1MDAyNEZBCis6MTAwN0IwMDA4RkI0MDAyMDhGQjMwMDFDOEZCMjAwMTg4RkIxMDAxNENCCis6MTAwN0MwMDA4RkIwMDAxMDAzRTAwMDA4MjdCRDAwMzAyN0JERkZEMDI4Cis6MTAwN0QwMDBBRkJGMDAyOEFGQjMwMDI0QUZCMjAwMjBBRkIxMDAxQzAwCis6MTAwN0UwMDBBRkIwMDAxODhGNzI1QzlDM0MwMjAwRkYzNDQyRkZGOEVGCis6MTAwN0YwMDAzQzA3MDgwMDI0RTcxQkI0MDI0Mjg4MjQ5NjIzMDAwRTFECis6MTAwODAwMDA4Q0UyMDAwMDAwNDMxMDIxQUNFMjAwMDA4RTIyMDAxMEI4Cis6MTAwODEwMDAzMDQyMDAyMDE0NDAwMDExMDA4MDk4MjEwRTAwMDYzQjU5Cis6MTAwODIwMDAwMjIwMjAyMTNDMDJDMDAwMDI0MjE4MjVBRjYzNUM5Q0RDCis6MTAwODMwMDA4RjYyNUM5MDMwNDIwMDAyMTA0MDAxMUUwMDAwMDAwMEY4Cis6MTAwODQwMDBBRjYzNUM5QzhGNjI1QzkwMzA0MjAwMDIxMDQwMDExOUUzCis6MTAwODUwMDAwMDAwMDAwMDBBMDAwMjBEMDAwMDAwMDA4RTI0MDAwOEM1Cis6MTAwODYwMDA4RTIzMDAxNDAwMDQxNDAyMDAwMjMxQzAwMDAzMTUwMjlDCis6MTAwODcwMDAzMDQyMDFGRjI0NDJGRkZGMzA0MjAwN0YwMDAzMTk0MjUzCis6MTAwODgwMDAzMDYzNzgwMDAwMDIxMTAwMjQ0MjQwMDAwMDYyNDgyMUQ5Cis6MTAwODkwMDA5NTIyMDAwQTMwODRGRkZGMzA0MjAwMDgxMDQwMDBCMDZCCis6MTAwOEEwMDAwMDA0MjlDMDNDMDIwODAwOEM0MjI0MDAxNDQwMDAyNEFCCis6MTAwOEIwMDAyNEM1MDAwODk0QzIwMDE0M0MwMTA4MDBBNDIyMjNEMERGCis6MTAwOEMwMDA4Q0M0MDAxMDAwMDQxNDAyM0MwMTA4MDBBNDIyMjNEMkFFCis6MTAwOEQwMDAzQzAxMDgwMEE0MjQyM0Q0OTRDMjAwMEUzMDgzRkZGRkZGCis6MTAwOEUwMDAwMDQzMTAyMzNDMDEwODAwQUMyMjI0MDg5NEMyMDAxQUUzCis6MTAwOEYwMDAzQzAxMDgwMEFDMjYyNDAwM0MwMTA4MDBBQzMyMjQwNDcyCis6MTAwOTAwMDAzQzAxMDgwMEFDMjIyM0ZDM0MwMkMwMDAwMjQyMTgyNTM2Cis6MTAwOTEwMDBBRjYzNUM5QzhGNjI1QzkwMzA0MjAwMDIxMDQwMDBFNTQ3Cis6MTAwOTIwMDAwMDAwMDAwMEFGNjM1QzlDOEY2MjVDOTAzMDQyMDAwMjZDCis6MTAwOTMwMDAxMDQwMDBFMDAwMDAwMDAwMEEwMDAyNDYwMDAwMDAwMDM1Cis6MTAwOTQwMDA5NEMyMDAwRTNDMDMwODAwOTQ2MzIzRDQwMDQzNDAyMzY4Cis6MTAwOTUwMDAzMTAzRkZGRjJDNjIwMDA4MTA0MDAwMUMwMDAwMDAwMDYzCis6MTAwOTYwMDA5NEMyMDAxNDI0NDIwMDI4MDBBMjI4MjEwMDAzMTA0MjRGCis6MTAwOTcwMDAxODQwMDAwQjAwMDAyMDIxMjRFNjA4NDgwMDQwMzgyMUUwCis6MTAwOTgwMDA5NEEzMDAwMDhDQzIwMDAwMjQ4NDAwMDEwMDQzMTAyMUM1Cis6MTAwOTkwMDBBQ0MyMDAwMDAwODcxMDJBMTQ0MEZGRjkyNEE1MDAwMjExCis6MTAwOUEwMDAzMTAyMDAwMTEwNDAwMDFGM0MwMjQwMDAzQzA0MDgwMERFCis6MTAwOUIwMDAyNDg0MjNGQ0EwQTAwMDAxOTRBMzAwMDA4QzgyMDAwMEVBCis6MTAwOUMwMDAwMDQzMTAyMTBBMDAwMjg1QUM4MjAwMDA4RjYyNjgwMDlCCis6MTAwOUQwMDAzQzAzMDAxMDAwNDMxMDI0MTA0MDAwMDkwMDAwMDAwMEY4Cis6MTAwOUUwMDA5NEMyMDAxQTNDMDMwODAwOEM2MzIzRkMwMDQzMTAyMUNFCis6MTAwOUYwMDAzQzAxMDgwMEFDMjIyM0ZDMEEwMDAyODYzQzAyNDAwMEI1Cis6MTAwQTAwMDA5NEMyMDAxQTk0QzQwMDFDM0MwMzA4MDA4QzYzMjNGQ0FECis6MTAwQTEwMDAwMDQ0MTAyMzAwNjIxODIxM0MwMTA4MDBBQzIzMjNGQzkxCis6MTAwQTIwMDAzQzAyNDAwMDAyNDIxODI1QUY2MzVDOUM4RjYyNUM5MEUwCis6MTAwQTMwMDAzMDQyMDAwMjE0NDBGRkZDMDAwMDAwMDA5NTIyMDAwQTMyCis6MTAwQTQwMDAzMDQyMDAxMDEwNDAwMDlCMDAwMDAwMDAzQzAzMDgwMEYyCis6MTAwQTUwMDA5NDYzMjNENDNDMDcwODAwMjRFNzI0MDA4Q0U0MDAwMEJFCis6MTAwQTYwMDA4RjYyNjgwMDI0NjMwMDMwMDA4MzI4MjEzQzAzMDAxMDVCCis6MTAwQTcwMDAwMDQzMTAyNDE0NDAwMDBBMDAwMDAwMDA5NEEyMDAwNDY3Cis6MTAwQTgwMDAzQzA0MDgwMDhDODQyNDA4M0MwMzA4MDA4QzYzMjNGQzhECis6MTAwQTkwMDAwMDQ0MTAyMzAwNjIxODIxM0MwMTA4MDBBQzIzMjNGQzExCis6MTAwQUEwMDAzQzA0MDgwMDhDODQyM0ZDMDAwNDFDMDIzMDgyRkZGRkZECis6MTAwQUIwMDAwMDYyMjAyMTAwMDQxNDAyMDA4MjIwMjEwMDA0MTAyNzdCCis6MTAwQUMwMDBBNEEyMDAwNjNDMDMwODAwOEM2MzI0MDQzQzAyMDBGRjNGCis6MTAwQUQwMDAzNDQyRkZGODAwNjI4ODI0OTYyMjAwMDgyNDA1MDAwMUIxCis6MTAwQUUwMDAyNDAzNDAwMDAwMDIzMUMwMDA4MDEwMjFBNEMyMDAxQTdCCis6MTAwQUYwMDBBNEMwMDAxQ0FDRTAwMDAwM0MwMTA4MDBBQzI1MUI2MDU5Cis6MTAwQjAwMDBBRjYzNUNCODhGNjI1Q0IwMzA0MjAwMDIxMDQwMDAwM0ZCCis6MTAwQjEwMDAwMDAwMDAwMDNDMDEwODAwQUMyMDFCNjA4RTIyMDAwODkxCis6MTAwQjIwMDBBRjYyNUNCODhGNjI1Q0IwMzA0MjAwMDIxMDQwMDAwM0RDCis6MTAwQjMwMDAwMDAwMDAwMDNDMDEwODAwQUMyMDFCNjAzQzAyMDgwMEUzCis6MTAwQjQwMDA4QzQyMUI2MDEwNDBGRkVDMDAwMDAwMDAzQzA0MDgwMEQ5Cis6MTAwQjUwMDAwRTAwMDYzQjhDODQyNDA0MEEwMDAzMkEwMDAwMDAwMEQ3Cis6MTAwQjYwMDAzQzAzMDgwMDkwNjMxQjk4MjQwMjAwMDIxNDYyMDAwM0Y3Cis6MTAwQjcwMDAzQzAzNEI2NTBBMDAwMkUxMDAwMDgwMjE4RTIyMDAxQzJDCis6MTAwQjgwMDAzNDYzNzY1NDEwNDMwMDAyMjQxMDAwMDIyNDEwMDAwMTQ0Cis6MTAwQjkwMDAwMEMwMjAyMTBFMDAwMzUwMDIwMDMwMjEyNDAyMDAwMzc3Cis6MTAwQkEwMDAzQzAxMDgwMEEwMjIxQjk4MjQwMjAwMDIxMjAyMDAwQTQ1Cis6MTAwQkIwMDAyNDAyMDAwMTNDMDMwODAwOEM2MzIzRjAxMDYyMDAwNjRECis6MTAwQkMwMDAwMDAwMDAwMDNDMDIwODAwOTQ0MjIzRDgwMDAyMTQwMEY4Cis6MTAwQkQwMDAwQTAwMDMxRkFFMjIwMDE0M0MwNDA4MDAyNDg0MjNEQTE4Cis6MTAwQkUwMDA5NDgyMDAwMDAwMDIxNDAwQUUyMjAwMTQzQzAyMDgwMEFGCis6MTAwQkYwMDA4QzQyMUJCQzNDMDNDMDAwM0MwMTA4MDBBMDIwMUI5ODk5Cis6MTAwQzAwMDAwMDQzMTAyNUFGNjI1QzVDOEY2MjVDNTAzMDQyMDAwMjkyCis6MTAwQzEwMDAxMDQwMDAwOTAwMDAwMDAwMjQ4NEY3RTI4QzgyMDAwMEVDCis6MTAwQzIwMDAwMDQzMTAyNUFGNjI1QzVDOEY2MjVDNTAzMDQyMDAwMjcyCis6MTAwQzMwMDAxNDQwRkZGQTAwMDAwMDAwM0MwMjA4MDAyNDQyMUI4NDFDCis6MTAwQzQwMDA4QzQzMDAwMDI0NjMwMDAxQUM0MzAwMDA4RjYzMEMxNDRDCis6MTAwQzUwMDAzMDYzMDAwRjJDNjIwMDAyMTQ0MDAwMEMzQzAyNDAwMDg0Cis6MTAwQzYwMDA4RjYzMEMxNDNDMDIwODAwOEM0MjFCNDAzMDYzMDAwRjYxCis6MTAwQzcwMDAyNDQyMDAwMTNDMDEwODAwQUMyMjFCNDAyQzYyMDAwMjBGCis6MTAwQzgwMDAxMDQwRkZGNzAwMDAwMDAwM0MwMjQwMDAwMjQyMTgyNTFGCis6MTAwQzkwMDBBRjYzNUM5QzhGNjI1QzkwMzA0MjAwMDIxNDQwRkZGQ0FBCis6MTAwQ0EwMDAwMDAwMDAwMDEyNjAwMDAzMDAwMDAwMDAwRTAwMDRDMEZECis6MTAwQ0IwMDAwMDAwMDAwMDhGQkYwMDI4OEZCMzAwMjQ4RkIyMDAyMEY3Cis6MTAwQ0MwMDA4RkIxMDAxQzhGQjAwMDE4MDNFMDAwMDgyN0JEMDAzMDcyCis6MTAwQ0QwMDA4RjYzNDQ1MDNDMDQwODAwMjQ4NDFCODg4QzgyMDAwMEVECis6MTAwQ0UwMDAwMDAzMUMwMjAwNDMxMDJCMTQ0MDAwMDczQzAzODAwMDRCCis6MTAwQ0YwMDA4Qzg0MDAwNDhGNjI0NDUwMDAwMjFDMDIwMDgzMTAyQjdECis6MTAwRDAwMDAxMDQwRkZGQzNDMDM4MDAwQUY2MzQ0NDQ4RjYyNDQ0NEM2Cis6MTAwRDEwMDAwMDQzMTAyNDE0NDBGRkZEMDAwMDAwMDA4RjYyNDQ0ODhGCis6MTAwRDIwMDAwM0UwMDAwODMwNDJGRkZGM0MwMjQwMDAwMDgyMjAyNTIzCis6MTAwRDMwMDBBRjY0NUMzODhGNjI1QzMwMzA0MjAwMDIxNDQwRkZGQ0NDCis6MTAwRDQwMDAwMDAwMDAwMDAzRTAwMDA4MDAwMDAwMDAyN0JERkZFMEY1Cis6MTAwRDUwMDAwMDgwNTgyMTE0QzAwMDExMjU2RTAwMDgzQzAyMDgwMEQ0Cis6MTAwRDYwMDA4QzQyMjNGNDEwNDAwMDA3MjQwMjAwMTYzQzAxMDgwMEM2Cis6MTAwRDcwMDBBNDIyMjNEMjI0MDIwMDJBM0MwMTA4MDAwQTAwMDM2NEIyCis6MTAwRDgwMDBBNDIyMjNENDhENjcwMDEwMDAwNzE0MDIzQzAxMDgwMDQwCis6MTAwRDkwMDBBNDIyMjNEMjNDMDEwODAwQTQyNzIzRDQzQzA0MDgwMDQ5Cis6MTAwREEwMDA5NDg0MjNENDNDMDMwODAwOTQ2MzIzRDI5NUNGMDAwNjk3Cis6MTAwREIwMDAzQzAyMDgwMDk0NDIyM0QwMDA4MzIwMjMwMUUyQzAyMzk4Cis6MTAwREMwMDAzMDY1RkZGRjI0QTIwMDI4MDFDMjQ4MjEzMDgyRkZGRkM2Cis6MTAwREQwMDAxNEMwMDAxQTAxMjI2MDIxOTU4MjAwMEMzMDQyMDAzRkFECis6MTAwREUwMDAzQzAxMDgwMEE0MjIyM0Q2OTU4MjAwMDQ5NTgzMDAwNkM2Cis6MTAwREYwMDAzQzAxMDgwMEFDMjAyM0U0M0MwMTA4MDBBQzIwMjNFOEJGCis6MTAwRTAwMDAwMDAyMTQwMDAwNDMxMDI1M0MwMTA4MDBBQzIyMUJDMDY2Cis6MTAwRTEwMDA5NTIyMDAwNDNDMDEwODAwQTQyMjFCQzQ5NTIzMDAwMjczCis6MTAwRTIwMDAwMUU1MTAyMzAwNDMxMDJBMTA0MDAwMTAyNDAyMDAwMUE1Cis6MTAwRTMwMDAzQzAxMDgwMDBBMDAwMzk4QUMyMjIzRjgzQzAzMDgwMDk4Cis6MTAwRTQwMDA4QzYzMjNFODNDMDIwODAwOTQ0MjFCQzQwMDQzMTAyMTM5Cis6MTAwRTUwMDBBNTIyMDAwNDNDMDIwODAwOTQ0MjFCQzBBNTgyMDAwNEE1Cis6MTAwRTYwMDAzQzAyMDgwMDhDNDIxQkMwQTU4MjAwMDYzQzAyMDgwMDIwCis6MTAwRTcwMDA4QzQyMjNGMDNDMEQwODAwOERBRDIzRTQzQzBBMDgwMEIxCis6MTAwRTgwMDAxNDQwMDBFNThENEEyM0U4M0MwMjA4MDA5NDQyMUJDNDRDCis6MTAwRTkwMDAwMDRBMTgyMTMwNjNGRkZGMDA2MjE4MkIyNDAyMDAwMjcxCis6MTAwRUEwMDAxMEMyMDAwRDAxNDM1MDIzM0MwMjA4MDA5NDQyMjNENjk3Cis6MTAwRUIwMDAzMDQyMDAwOTEwNDAwMDA4MDAwMDAwMDA5NTgyMDAwQzNDCis6MTAwRUMwMDAzMDQyRkZGNkE1ODIwMDBDM0MwMjA4MDA5NDQyMjNENjczCis6MTAwRUQwMDAzMDQyMDAwOTAxQTI2ODIzM0MwMjA4MDA4QzQyMjNGODNBCis6MTAwRUUwMDAxMDQwMDA0QTAxMjAzODIxM0MwMjA4MDA5NDQyMjNEMkRECis6MTAwRUYwMDAwMDAwNDAyMUE1MjAwMDBBMDFFMjEwMjNBNTIyMDAwMkUzCis6MTAwRjAwMDAzMDgyRkZGRjAwMDIxMDQyMTg0MDAwMDgwMDAwMzAyMTJDCis6MTAwRjEwMDAwMDQwMTgyMTk0RTIwMDAwMjUwODAwMDEwMEMyMzAyMUExCis6MTAwRjIwMDAwMTAzMTAyQTE0NDBGRkZCMjRFNzAwMDIwMDA2MUMwMjA0Cis6MTAwRjMwMDAzMEMyRkZGRjAwNjIzMDIxMDAwNjE0MDIwMEMyMzAyMURGCis6MTAwRjQwMDAwMEMwMjgyMTAwMDYxMDI3QTUyMjAwMEEwMDAwMzAyMTM5Cis6MTAwRjUwMDAyNTI3MDAwQzAwMDA0MDIxOTRFMjAwMDAyNTA4MDAwMTM0Cis6MTAwRjYwMDAwMEMyMzAyMTJEMDIwMDA0MTQ0MEZGRkIyNEU3MDAwMkUwCis6MTAwRjcwMDA5NTIyMDAwMjAwMDA0MDIxOTEyMzAwMDkwMDQ0MjAyMzEzCis6MTAwRjgwMDAwMTgwMzgyMTMwODJGRkZGQTRFMDAwMTAwMDYyMTgyMUE4Cis6MTAwRjkwMDAwMDAyMTA0MjE4NDAwMDEwMDBDMzMwMjEwMDQwNDgyMUQ4Cis6MTAwRkEwMDA5NEUyMDAwMDI0RTcwMDAyMDBDMjMwMjEzMEUyMDA3RjFBCis6MTAwRkIwMDAxNDQwMDAwNjI1MDgwMDAxOEQ2MzAwMDAzQzAyMDA3RkZDCis6MTAwRkMwMDAzNDQyRkY4MDAwNjI1ODI0MjU2NzAwMDgwMTA5MTAyQTc2Cis6MTAwRkQwMDAxNDQwRkZGMzAwMDAwMDAwMzA4MjAwMDExMDQwMDAwNUMzCis6MTAwRkUwMDAwMDA2MUMwMkEwRTAwMDAxOTRFMjAwMDAwMEMyMzAyMUQzCis6MTAwRkYwMDAwMDA2MUMwMjMwQzJGRkZGMDA2MjMwMjEwMDA2MTQwMjBFCis6MTAxMDAwMDAwMEMyMzAyMTBBMDAwNDdEMzBDNkZGRkYyNDAyMDAwMjI2Cis6MTAxMDEwMDAxNEMyMDA4MTAwMDAwMDAwM0MwMjA4MDA4QzQyMjQwQzM1Cis6MTAxMDIwMDAxNDQwMDAwNzAwMDAwMDAwM0MwMjA4MDA5NDQyMjNEMjU0Cis6MTAxMDMwMDA5NTIzMDAwMjAxRTIxMDIzMTA2MjAwNzcwMDAwMDAwMEY3Cis6MTAxMDQwMDAzQzAyMDgwMDk0NDIyM0QyMDFFMjEwMjNBNTIyMDAwMkIwCis6MTAxMDUwMDAzQzAyMDgwMDhDNDIyNDBDMTA0MDAwMUEzMUUzRkZGRkQwCis6MTAxMDYwMDA4REM3MDAxMDNDMDIwODAwOTQ0MjFCOTYwMEUwNDAyMTBFCis6MTAxMDcwMDAwMDA3MkMwMjAwQUEyMDIxMDA0MzEwMjMwMDgyMzgyM0ZECis6MTAxMDgwMDAwMDA3MjQwMjMwRTJGRkZGMDA4MjM4MjEwMDA3MTAyNzBBCis6MTAxMDkwMDBBNTIyMDAwQTMxMDJGRkZGM0MwNDA4MDA5NDg0MjNENEY3Cis6MTAxMEEwMDAwMDQ1MzAyMzAwRTAyODIxMDA2NDE4MjMwMDZEMTgyMTNBCis6MTAxMEIwMDAwMEMzMzAyMTAwMDYxQzAyMzBDMkZGRkYwQTAwMDQ3RDdECis6MTAxMEMwMDAwMDYyMzAyMTAxMjAzODIxMDAwMDQwMjEzMDgyRkZGRkUyCis6MTAxMEQwMDAwMDAyMTA0MjE4NDAwMDA4MDAwMDMwMjEwMDQwMTgyMTkyCis6MTAxMEUwMDA5NEUyMDAwMDI1MDgwMDAxMDBDMjMwMjEwMTAzMTAyQTBCCis6MTAxMEYwMDAxNDQwRkZGQjI0RTcwMDAyMDAwNjFDMDIzMEMyRkZGRjgxCis6MTAxMTAwMDAwMDYyMzAyMTAwMDYxNDAyMDBDMjMwMjEwMEMwMjgyMUY0Cis6MTAxMTEwMDAwMDA2MTAyN0E1MjIwMDBBMDAwMDMwMjEyNTI3MDAwQzE4Cis6MTAxMTIwMDAwMDAwNDAyMTk0RTIwMDAwMjUwODAwMDEwMEMyMzAyMUE3Cis6MTAxMTMwMDAyRDAyMDAwNDE0NDBGRkZCMjRFNzAwMDI5NTIyMDAwMjY4Cis6MTAxMTQwMDAwMDAwNDAyMTkxMjMwMDA5MDA0NDIwMjMwMTgwMzgyMTIwCis6MTAxMTUwMDAzMDgyRkZGRkE0RTAwMDEwM0MwNDA4MDA5NDg0MjNENEY0Cis6MTAxMTYwMDAwMDYyMTgyMTAwQzMzMDIxMDAwNjFDMDIzMEMyRkZGRkJDCis6MTAxMTcwMDAwMDYyMzAyMTAwMDYxQzAyM0MwMjA4MDA5NDQyMjNEMDg5Cis6MTAxMTgwMDAwMEMzNDgyMTAwNDQxMDIzMDAwMjFGQzIwMDQzMTAyMTY1Cis6MTAxMTkwMDAwMDAyMTA0MzE4NDAwMDEwMDAwMDMwMjEwMDQwMjAyMUMwCis6MTAxMUEwMDA5NEUyMDAwMDI0RTcwMDAyMDBDMjMwMjEzMEUyMDA3RjE4Cis6MTAxMUIwMDAxNDQwMDAwNjI1MDgwMDAxOEQ2MzAwMDAzQzAyMDA3RkZBCis6MTAxMUMwMDAzNDQyRkY4MDAwNjI1ODI0MjU2NzAwMDgwMTA0MTAyQTc5Cis6MTAxMUQwMDAxNDQwRkZGMzAwMDAwMDAwM0MwMjA4MDA5NDQyMjNFQzlFCis6MTAxMUUwMDAwMEMyMzAyMTMxMjJGRkZGMDBDMjMwMjEwMDA2MUMwMjY0Cis6MTAxMUYwMDAzMEMyRkZGRjAwNjIzMDIxMDAwNjE0MDIwMEMyMzAyMTFECis6MTAxMjAwMDAwMEMwNDAyMTAwMDYxMDI3QTU4MjAwMTBBREMwMDAxNEM4Cis6MTAxMjEwMDAwQTAwMDQ5REFEQzAwMDAwOERDNzAwMTAwMEUwNDAyMTExCis6MTAxMjIwMDAxMTQwMDAwNzAwMDcyQzAyMDBBQTMwMjEwMDA2MTQwMjFBCis6MTAxMjMwMDAzMEMzRkZGRjAwNDMzMDIxMDAwNjE0MDIwMEMyMjgyMTAyCis6MTAxMjQwMDAwMDA1MTAyN0E1MjIwMDBBM0MwMzA4MDA5NDYzMjNENDVDCis6MTAxMjUwMDAzMTAyRkZGRjAxRTIxMDIxMDA0MzMwMjMwMENEMzAyMTk1Cis6MTAxMjYwMDAwMDA2MUMwMjMwQzJGRkZGMDA2MjMwMjEwMDA2MTQwMjlCCis6MTAxMjcwMDAwMEMyMzAyMTAwQzA0MDIxMDAwNjEwMjdBNTgyMDAxMEM2Cis6MTAxMjgwMDAzMTAyRkZGRjAwMDUxQzAwMDA0MzEwMjVBREMyMDAxMDE1Cis6MTAxMjkwMDAzQzAyMDgwMDhDNDIyM0Y0MTA0MDAwMDUyREUyMDVFQkNGCis6MTAxMkEwMDAxNDQwMDAwMjI1RTJGRkYyMzQwMjg4NzBBNUMyMDAzNDI3Cis6MTAxMkIwMDAzQzAzMDgwMDI0NjMyM0U4OEM2MjAwMDAyNDQyMDAwMTAwCis6MTAxMkMwMDBBQzYyMDAwMDNDMDQwODAwOEM4NDIzRTQzQzAyMDgwMDZCCis6MTAxMkQwMDA4QzQyMUJDMDMzMDNGRkZGMDA4MzIwMjEwMDQzMTgyMUYxCis6MTAxMkUwMDAwMDYyMTAyQjNDMDEwODAwQUMyNDIzRTQxMDQwMDAwM0YyCis6MTAxMkYwMDAyNDgyRkZGRjNDMDEwODAwQUMyMjIzRTQzQzAxMDgwMEVCCis6MTAxMzAwMDBBQzIzMUJDMDAzRTAwMDA4MjdCRDAwMjAyN0JERkZCOEE5Cis6MTAxMzEwMDAzQzA1MDgwMDI0QTUxQjk2QUZCRjAwNDRBRkJFMDA0MEFCCis6MTAxMzIwMDBBRkI3MDAzQ0FGQjYwMDM4QUZCNTAwMzRBRkI0MDAzMDUzCis6MTAxMzMwMDBBRkIzMDAyQ0FGQjIwMDI4QUZCMTAwMjRBRkIwMDAyMDkzCis6MTAxMzQwMDA5NEE5MDAwMDNDMDIwODAwOTQ0MjIzRDAzQzAzMDgwMDBBCis6MTAxMzUwMDA4QzYzMUJCMDNDMDQwODAwOEM4NDFCQUMwMTIyMTAyMzVFCis6MTAxMzYwMDAwMDY0MTgyQUE3QTkwMDFFMTA2MDAwQkVBN0EyMDAxNkRDCis6MTAxMzcwMDAyNEJFMDAyMjk3QjYwMDFFMjRCMzAwMUEyNEI3MDAxNjFDCis6MTAxMzgwMDA4RkMyMDAwMDE0NDAwMDA4MDAwMDAwMDA4RkMyRkZGODY4Cis6MTAxMzkwMDA5N0EzMDAxNjhGQzRGRkY0MDA0MzEwMjEwMDgyMjAyQTc3Cis6MTAxM0EwMDAxNDgwMDBCMDAwMDAwMDAwOTdENTA4MTgzMkEyRkZGRjlCCis6MTAxM0IwMDAxMDQwMDBBMzAwMDA5MDIxMDA0MEEwMjEwMDAwODgyMURGCis6MTAxM0MwMDAwRTAwMDYyNTAwMDAwMDAwMDA0MDMwMjExNEMwMDAwNzc4Cis6MTAxM0QwMDAwMDAwMDAwMDNDMDIwODAwOEM0MjIzREMyNDQyMDAwMTkzCis6MTAxM0UwMDAzQzAxMDgwMDBBMDAwNTk2QUMyMjIzREMzQzEwMDgwMEYyCis6MTAxM0YwMDAwMjExODAyMThFMTAxQkM4OTYwODAwMEEzMTAyMDA0MDlECis6MTAxNDAwMDAxMDQwMDAwNTI0MDcxODBDOEUwMjAwMEMyNDA3MTg4Q0NECis6MTAxNDEwMDAwMDAyMTQwMEFDQzIwMDE4MzEwMjAwODA1NDQwMDAwMUU4Cis6MTAxNDIwMDAzNEU3MDAxMDNDMDIwODAwMDA1MTEwMjE4QzQyMUJEMDEwCis6MTAxNDMwMDAzQzAzMDgwMDAwNzExODIxOEM2MzFCRDQwMDAyMTUwMEM2Cis6MTAxNDQwMDAwMDAzMUMwMDAwNDMxMDI1QUNDMjAwMTQ5NjA0MDAwOEUxCis6MTAxNDUwMDAzMjQyRkZGRjAwODIxMDIxMDI4MjEwMkExNDQwMDAwMjUzCis6MTAxNDYwMDAwMkIyMjgyMzAwODAyODIxOEUwMjAwMDAwMjQ1OTAyMTJDCis6MTAxNDcwMDBBQ0MyMDAwMDhFMDIwMDA0MDBDMDIwMjEyNjMxMDAxMDAyCis6MTAxNDgwMDBBQzgyMDAwNDMwRTJGRkZGQUM4MDAwMDhBNDg1MDAwRUFGCis6MTAxNDkwMDBBQzgyMDAxMDI0MDIwMzA1MEUwMDA1QTJBNDgyMDAwQ0Y5Cis6MTAxNEEwMDAzMjQyRkZGRjAwNTQxMDJCMTQ0MEZGQzUzMjQyRkZGRkIxCis6MTAxNEIwMDAwQTAwMDU4RTAwMDAwMDAwOEU2MjAwMDA4RTYzRkZGQ0IzCis6MTAxNEMwMDAwMDQzMTAyQTEwNDAwMDY3MDAwMDAwMDA4RTYyRkZGMDA5Cis6MTAxNEQwMDAwMDAyODkwMDNDMTAwODAwMDIxMTgwMjEwRTAwMDYyNTQwCis6MTAxNEUwMDA4RTEwMUJDODAwNDAzMDIxMTRDMDAwMDUwMDAwMDAwMDExCis6MTAxNEYwMDA4RTYyMDgyQzI0NDIwMDAxMEEwMDA1OTZBRTYyMDgyQzc4Cis6MTAxNTAwMDA5NjA4MDAwQTMxMDIwMDQwMTA0MDAwMDUyNDA3MTgwQzFDCis6MTAxNTEwMDA4RTAyMDAwQzI0MDcxODhDMDAwMjE0MDBBQ0MyMDAxOEM0Cis6MTAxNTIwMDAzQzAyMDgwMDAwNTExMDIxOEM0MjFCRDAzQzAzMDgwMEYzCis6MTAxNTMwMDAwMDcxMTgyMThDNjMxQkQ0MDAwMjE1MDAwMDAzMUMwMEVECis6MTAxNTQwMDAwMDQzMTAyNUFDQzIwMDE0OEU2M0ZGRjQ5NjAyMDAwODFECis6MTAxNTUwMDAwMDQzMjAyMzMyNDJGRkZGMzA4M0ZGRkYwMDQzMTAyMTZFCis6MTAxNTYwMDAwMkMyMTAyQTEwNDAwMDAzMDA4MDI4MjE5N0E5MDAxRTAzCis6MTAxNTcwMDAwMTMyMjgyMzhFNjIwMDAwMzBBNEZGRkYwMDQ0MTAyMUI2Cis6MTAxNTgwMDBBRTYyMDAwMEE0QzUwMDBFOEUwMjAwMDBBQ0MyMDAwMEQ2Cis6MTAxNTkwMDA4RTAyMDAwNDhFNjNGRkY0MDA0MzEwMjFBQ0MyMDAwNEVECis6MTAxNUEwMDA4RTYzRkZGNDk2MDIwMDA4MDA2NDE4MjEwMDYyMTAyQTdFCis6MTAxNUIwMDAxNDQwMDAwNjAyNDU5MDIxOEU2MkZGRjBBRTYwRkZGNEY5Cis6MTAxNUMwMDAyNDQyMDAwMTBBMDAwNTcxQUU2MkZGRjBBRTYzRkZGNDMxCis6MTAxNUQwMDBBQ0MwMDAwODMyNDJGRkZGMTA1NjAwMDMzMTAyMDAwNDg1Cis6MTAxNUUwMDAxMDQwMDAwNjI0MDIwMzA1MzEwMjAwODA1NDQwMDAwMTJGCis6MTAxNUYwMDAzNEU3MDAxMDM0RTcwMDIwMjQwMjA5MDVBNEMyMDAwQ0RGCis6MTAxNjAwMDA4RUUzMDAwMDhFRTIwMDA0MTQ2MjAwMDczQzAyQjQ5QUVDCis6MTAxNjEwMDA4RUUyMDg2MDU0NDAwMDAxMzRFNzA0MDAzQzAyNEI2NTUwCis6MTAxNjIwMDAwQTAwMDU4ODM0NDI3NjU0MzQ0Mjg5QUJBQ0MyMDAxQ0FGCis6MTAxNjMwMDAzMEUyRkZGRkFDQzIwMDEwMEUwMDA1QTIwMEMwMjAyMTY2Cis6MTAxNjQwMDAzMjQyRkZGRjAwNTYxMDJCMTQ0MEZGOUIwMDAwMDAwMEE5Cis6MTAxNjUwMDA4RTYyMDAwMDhFNjNGRkZDMDA0MzEwMkExNDQwRkY0ODk2Cis6MTAxNjYwMDAwMDAwMDAwMDhGQkYwMDQ0OEZCRTAwNDA4RkI3MDAzQ0Q5Cis6MTAxNjcwMDA4RkI2MDAzODhGQjUwMDM0OEZCNDAwMzA4RkIzMDAyQzk0Cis6MTAxNjgwMDA4RkIyMDAyODhGQjEwMDI0OEZCMDAwMjAwM0UwMDAwODQzCis6MTAxNjkwMDAyN0JEMDA0ODI3QkRGRkU4QUZCRjAwMTRBRkIwMDAxMDYyCis6MTAxNkEwMDA4RjYyNDQ1MDhGNjM0NDEwMEEwMDA1QjEwMDgwODAyMThFCis6MTAxNkIwMDA4RjYyNjgyMDMwNDIyMDAwMTA0MDAwMDMwMDAwMDAwMENDCis6MTAxNkMwMDAwRTAwMDFGMDAwMDAyMDIxOEY2MjQ0NTA4RjYzNDQxMDBGCis6MTAxNkQwMDAzMDQyRkZGRjAwNDMxMDJCMTQ0MEZGRjUwMDAwMDAwMEQ0Cis6MTAxNkUwMDA4RjYzMEMxNDMwNjMwMDBGMkM2MjAwMDIxNDQwMDAwQjU3Cis6MTAxNkYwMDAwMDAwMDAwMDhGNjMwQzE0M0MwMjA4MDA4QzQyMUI0MDY5Cis6MTAxNzAwMDAzMDYzMDAwRjI0NDIwMDAxM0MwMTA4MDBBQzIyMUI0MDYyCis6MTAxNzEwMDAyQzYyMDAwMjEwNDBGRkY3MDAwMDAwMDBBRjcwNUMxODYwCis6MTAxNzIwMDA4RjYyNUMxMDMwNDIwMDAyMTA0MDAwMDkwMDAwMDAwMDhGCis6MTAxNzMwMDA4RjYyNjgyMDMwNDIyMDAwMTA0MEZGRjgwMDAwMDAwMDU3Cis6MTAxNzQwMDAwRTAwMDFGMDAwMDAyMDIxMEEwMDA1QzQwMDAwMDAwMDg2Cis6MTAxNzUwMDA4RkJGMDAxNDhGQjAwMDEwMDNFMDAwMDgyN0JEMDAxOEYxCis6MTAxNzYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyN0JERkZFOEFFCis6MTAxNzcwMDAzQzFCQzAwMEFGQkYwMDE0QUZCMDAwMTBBRjYwNjgwQ0RFCis6MTAxNzgwMDA4RjYyNjgwNDM0NDIwMDgyQUY2MjY4MDQ4RjYzNDAwMDU1Cis6MTAxNzkwMDAyNDAyMEI1MDNDMDEwODAwQUMyMjFCNTQyNDAyMEI3ODlECis6MTAxN0EwMDAzQzAxMDgwMEFDMjIxQjY0MzQ2MzAwMDJBRjYzNDAwMEJDCis6MTAxN0IwMDAwRTAwMDYwNTAwODA4MDIxM0MwMTA4MDBBMDIyMUI2ODY1Cis6MTAxN0MwMDAzMDQyMDBGRjI0MDMwMDAyMTQ0MzAwMDUwMDAwMDAwMDIzCis6MTAxN0QwMDAzQzAyMDgwMDhDNDIxQjU0MEEwMDA1RjhBQzUwMDBDMEMzCis6MTAxN0UwMDAzQzAyMDgwMDhDNDIxQjU0QUM1MDAwQkM4RjYyNDQzNDU1Cis6MTAxN0YwMDA4RjYzNDQzODhGNjQ0NDEwM0MwMTA4MDBBQzIyMUI1Q0FBCis6MTAxODAwMDAzQzAxMDgwMEFDMjMxQjZDM0MwMTA4MDBBQzI0MUI1OEI1Cis6MTAxODEwMDA4RkJGMDAxNDhGQjAwMDEwMDNFMDAwMDgyN0JEMDAxODMwCis6MTAxODIwMDAzQzA0MDgwMDhDODcwMDAwM0MwM0FBNTUzNDYzQUE1NTg5Cis6MTAxODMwMDAzQzA2QzAwM0FDODMwMDAwOENDMjAwMDAxNDQzMDAwN0M4Cis6MTAxODQwMDAyNDA1MDAwMjNDMDM1NUFBMzQ2MzU1QUFBQzgzMDAwMDZBCis6MTAxODUwMDA4Q0MyMDAwMDUwNDMwMDAxMjQwNTAwMDEzQzAyMDgwMDM2Cis6MTAxODYwMDBBQzQ3MDAwMDAzRTAwMDA4MDBBMDEwMjEyN0JERkZGOEVFCis6MTAxODcwMDAxODgwMDAwOTAwMDAyODIxOEY2MzY4MEM4RjYyNjgwQ0IzCis6MTAxODgwMDAxMDQzRkZGRTAwMDAwMDAwMjRBNTAwMDEwMEE0MTAyQTYwCis6MTAxODkwMDAxNDQwRkZGOTAwMDAwMDAwMDNFMDAwMDgyN0JEMDAwODI1Cis6MTAxOEEwMDA4RjYzNDQ1MDNDMDIwODAwOEM0MjFCNUMwMDAzMUMwMjA2Cis6MTAxOEIwMDAwMDQzMTAyQjE0NDAwMDA4M0MwMzgwMDAzQzA0MDgwMDQ3Cis6MTAxOEMwMDA4Qzg0MUI2QzhGNjI0NDUwMDAwMjFDMDIwMDgzMTAyQjFFCis6MTAxOEQwMDAxMDQwRkZGQzNDMDM4MDAwQUY2MzQ0NDQ4RjYyNDQ0NEVCCis6MTAxOEUwMDAwMDQzMTAyNDE0NDBGRkZEMDAwMDAwMDA4RjYyNDQ0OEI0Cis6MTAxOEYwMDAwM0UwMDAwODMwNDJGRkZGMzA4MkZGRkYyNDQyRTAwMDk3Cis6MTAxOTAwMDAyQzQyMjAwMTE0NDAwMDAzM0MwMjQwMDAwQTAwMDY0ODFCCis6MTAxOTEwMDAyNDAyRkZGRjAwODIyMDI1QUY2NDVDMzg4RjYyNUMzMEI4Cis6MTAxOTIwMDAzMDQyMDAwMjE0NDBGRkZDMDAwMDEwMjEwM0UwMDAwOEQ4Cis6MTAxOTMwMDAwMDAwMDAwMDhGNjI0NDUwM0MwMzA4MDA4QzYzMUI1ODc5Cis6MTAxOTQwMDAwQTAwMDY1MTMwNDJGRkZGOEY2MjQ0NTAzMDQyRkZGRkQxCis6MTAxOTUwMDAwMDQzMTAyQjE0NDBGRkZDMDAwMDAwMDAwM0UwMDAwOENGCis6MTAxOTYwMDAwMDAwMDAwMDI3QkRGRkUwMDA4MDI4MjEzQzA0MDgwMEEzCis6MTAxOTcwMDAyNDg0MUFGMDAwMDAzMDIxMDAwMDM4MjFBRkJGMDAxODg1Cis6MTAxOTgwMDBBRkEwMDAxMDBFMDAwNjdDQUZBMDAwMTQwQTAwMDY2MDk1Cis6MTAxOTkwMDAwMDAwMDAwMDhGQkYwMDE4MDNFMDAwMDgyN0JEMDAyMEYyCis6MTAxOUEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzQzAyMDgwMEYxCis6MTAxOUIwMDAzNDQyMzAwMDNDMDMwODAwMzQ2MzMwMDAzQzA0MDgwMDJCCis6MTAxOUMwMDAzNDg0MzdGRjNDMDEwODAwQUMyMjFCNzQyNDAyMDA0MDIxCis6MTAxOUQwMDAzQzAxMDgwMEFDMjIxQjc4M0MwMTA4MDBBQzIwMUI3MEM1Cis6MTAxOUUwMDBBQzYwMDAwMDI0NjMwMDA0MDA4MzEwMkI1MDQwRkZGRDE2Cis6MTAxOUYwMDBBQzYwMDAwMDAzRTAwMDA4MDAwMDAwMDAwMDgwNDgyMTA3Cis6MTAxQTAwMDA4RkFBMDAxMDNDMDIwODAwOEM0MjFCNzAzQzA0MDgwMEE2Cis6MTAxQTEwMDA4Qzg0MUI3ODhGQUIwMDE0MjQ0MzAwMDEwMDQ0MTAyQkVFCis6MTAxQTIwMDAzQzAxMDgwMEFDMjMxQjcwMTQ0MDAwMDMwMDAwNDAyMTVGCis6MTAxQTMwMDAzQzAxMDgwMEFDMjAxQjcwM0MwMjA4MDA4QzQyMUI3MDZCCis6MTAxQTQwMDAzQzAzMDgwMDhDNjMxQjc0OTEyNDAwMDAwMDAyMTE0MEM5Cis6MTAxQTUwMDAwMDQzMTAyMTAwNDgxMDIxMjUwODAwMDFBMDQ0MDAwMDg3Cis6MTAxQTYwMDAyOTAyMDAwODE0NDBGRkY0MjUyOTAwMDEzQzAyMDgwMDY3Cis6MTAxQTcwMDA4QzQyMUI3MDNDMDMwODAwOEM2MzFCNzQ4RjY0NjgwQ0UxCis6MTAxQTgwMDAwMDAyMTE0MDAwNDMxMDIxQUM0NDAwMDhBQzQ1MDAwQzlBCis6MTAxQTkwMDBBQzQ2MDAxMEFDNDcwMDE0QUM0QTAwMTgwM0UwMDAwODQ0Cis6MTAxQUEwMDBBQzRCMDAxQzAwMDAwMDAwMDAwMDAwMDA0RDYxNjk2RTlFCis6MTAxQUIwMDA0MzcwNzU0MjAwMDAwMDAwNEQ2MTY5NkU0MzcwNzU0MUNFCis6MTAxQUMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3Mzc0NkI2RjU1Cis6MTAxQUQwMDA2NjY2NkM2NDQ5NkUwMDAwNzM3NDZCNkY2NjY2MkEyQUQyCis6MTAxQUUwMDAwMDAwMDAwMDUzNzc0NTc2NjU2RTc0MzAwMDAwMDAwMEZBCis6MTAxQUYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2NjYxNzQ2MTRBCis6MTAxQjAwMDA2QzQ1NzI3MjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQwCis6MTAxQjEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEM1Cis6MTAxQjIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEI1Cis6MTAxQjMwMDA3Mzc0NkI2RjY2NjY2QzY0NUY3NjMxMkUzNjJFMzAwMDgwCis6MTAxQjQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDk1Cis6MEMxQjUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4OQorOjAwMDAwMDAxRkYKKyAqIEZpcm13YXJlIGlzOgorICoJRGVyaXZlZCBmcm9tIHByb3ByaWV0YXJ5IHVucHVibGlzaGVkIHNvdXJjZSBjb2RlLAorICoJQ29weXJpZ2h0IChDKSAyMDAwLTIwMDMgQnJvYWRjb20gQ29ycG9yYXRpb24uCisgKgorICoJUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCBmb3IgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpcm13YXJlCisgKglkYXRhIGluIGhleGFkZWNpbWFsIG9yIGVxdWl2YWxlbnQgZm9ybWF0LCBwcm92aWRlZCB0aGlzIGNvcHlyaWdodAorICoJbm90aWNlIGlzIGFjY29tcGFueWluZyBpdC4KZGlmZiAtLWdpdCBhL2Zpcm13YXJlL3RpZ29uL3RnM190c281LmJpbi5paGV4IGIvZmlybXdhcmUvdGlnb24vdGczX3RzbzUuYmluLmloZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM2NzI1MQotLS0gL2Rldi9udWxsCisrKyBiL2Zpcm13YXJlL3RpZ29uL3RnM190c281LmJpbi5paGV4CkBAIC0wLDAgKzEsMjUyIEBACis6MTAwMDAwMDAwMTAyMDAwMDAwMDEwMDAwMDAwMDBGRDgwQzAwNDAwM0I2Cis6MTAwMDEwMDAwMDAwMDAwMDAwMDEwRjA0MDAwMDAwMDAxMDAwMDAwM0I5Cis6MTAwMDIwMDAwMDAwMDAwMDAwMDAwMDBEMDAwMDAwMEQzQzFEMDAwMTVDCis6MTAwMDMwMDAzN0JERTAwMDAzQTBGMDIxM0MxMDAwMDEyNjEwMDAwMEI1Cis6MTAwMDQwMDAwQzAwNDAxMDAwMDAwMDAwMDAwMDAwMEQyN0JERkZFMDg0Cis6MTAwMDUwMDAzQzA0RkVGRUFGQkYwMDE4MEMwMDQyRTgzNDg0MDAwMkVFCis6MTAwMDYwMDAwQzAwNDM2NDAwMDAwMDAwM0MwMzAwMDE5MDYzMEYzNDY3Cis6MTAwMDcwMDAyNDAyMDAwMjNDMDQwMDAxMjQ4NDBFOUMxNDYyMDAwMzRDCis6MTAwMDgwMDAyNDA1MDAwMTNDMDQwMDAxMjQ4NDBFOTAyNDA2MDAwMjkzCis6MTAwMDkwMDAwMDAwMzgyMUFGQTAwMDEwMEMwMDQzNzhBRkEwMDAxNDdFCis6MTAwMEEwMDAwQzAwNDAyQzAwMDAwMDAwOEZCRjAwMTgwM0UwMDAwODg3Cis6MTAwMEIwMDAyN0JEMDAyMDAwMDAwMDAwMDAwMDAwMDAyN0JERkZFMDc5Cis6MTAwMEMwMDBBRkJGMDAxQ0FGQjIwMDE4QUZCMTAwMTQwQzAwNDJENDk3Cis6MTAwMEQwMDBBRkIwMDAxMDNDMTI4MDAwMjQxMTAwMDE4RjcwNjgxMDM2Cis6MTAwMEUwMDAzMjAyMDQwMDEwNDAwMDA3MDAwMDAwMDA4RjY0MTAwODc2Cis6MTAwMEYwMDAwMDkyMTAyNDE0NDAwMDAzMDAwMDAwMDAwQzAwNDA2NDMzCis6MTAwMTAwMDAwMDAwMDAwMDNDMDIwMDAxOTA0MjBGNTYxMDUxMDAwMzE1Cis6MTAwMTEwMDAzMjAyMDIwMDEwNDBGRkYxMDAwMDAwMDAwQzAwNDFCNDY4Cis6MTAwMTIwMDAwMDAwMDAwMDA4MDA0MDM0MDAwMDAwMDA4RkJGMDAxQ0U5Cis6MTAwMTMwMDA4RkIyMDAxODhGQjEwMDE0OEZCMDAwMTAwM0UwMDAwOEQ4Cis6MTAwMTQwMDAyN0JEMDAyMDI3QkRGRkUwM0MwNDAwMDEyNDg0MEVCMDQxCis6MTAwMTUwMDAwMDAwMjgyMTAwMDAzMDIxMDAwMDM4MjFBRkJGMDAxODI2Cis6MTAwMTYwMDBBRkEwMDAxMDBDMDA0Mzc4QUZBMDAwMTQwMDAwRDAyMTE1Cis6MTAwMTcwMDAyNDAyMDEzMEFGNjI1MDAwM0MwMTAwMDFBNDIwMEY1MDY2Cis6MTAwMTgwMDAzQzAxMDAwMUEwMjAwRjU3OEZCRjAwMTgwM0UwMDAwOEJBCis6MTAwMTkwMDAyN0JEMDAyMDAwMDAwMDAwMDAwMDAwMDAzQzAzMDAwMTFCCis6MTAwMUEwMDAyNDYzMEY2MDkwNjIwMDAwMjdCREZGRjAxNDQwMDAwMzNECis6MTAwMUIwMDAwMDgwQzAyMTA4MDA0MDczMDAwMDQ4MjEzQzAyMjAwMDVDCis6MTAwMUMwMDAwMzAyMTAyNDEwNDAwMDAzMjQwOTAwMDIwODAwNDA3M0I5Cis6MTAwMUQwMDBBMDYwMDAwMDI0MDkwMDAxMDAxODEwNDAzMDQzMUY4MDc3Cis6MTAwMUUwMDAzNDZGODAwODE1MjAwMDRCMjVFQjAwMjgzQzA0MDAwMUVCCis6MTAwMUYwMDAwMDgzMjAyMThDODQ4MDEwM0MwNTAwMDEyNEE1MEY3QTA3Cis6MTAwMjAwMDAwMDA0MTQwMkEwQTIwMDAwM0MwMTAwMDFBMDI0MEY3QjA2Cis6MTAwMjEwMDAzQzAyMDAwMTAwNDMxMDIxOTQ0MjgwMTQzQzAxMDAwMTgzCis6MTAwMjIwMDBBMDIyMEY3QzNDMEMwMDAxMDE4MzYwMjE4RDhDODAxODgyCis6MTAwMjMwMDAzMDQyMDBGRjI0NDIwMDA4MDAwMjIwQzMyNDAyMDAwMUQzCis6MTAwMjQwMDAzQzAxMDAwMUEwMjIwRjYwMDEyNDEwMkIxMDQwMDAwQzgzCis6MTAwMjUwMDAwMDAwMzgyMTI0QTYwMDBFMDE2MDI4MjE4Q0EyMDAwMDk1Cis6MTAwMjYwMDA4Q0EzMDAwNDI0QTUwMDA4MjRFNzAwMDFBQ0MyMDAwMDEwCis6MTAwMjcwMDBBQ0MzMDAwNDAwRTQxMDJCMTQ0MEZGRjgyNEM2MDAwOEFGCis6MTAwMjgwMDAwMDAwMzgyMTNDMDgwMDAxMjUwODBGN0I5MTA2MDAwMDgyCis6MTAwMjkwMDAzQzAyMDAwMTkwNDIwRjdDMjUwMzAwMEQwMEMzMjgyMTgxCis6MTAwMkEwMDAwMDQ2MTAyMzAwMDIxRkMyMDA0MzEwMjEwMDAyMTA0MzI5Cis6MTAwMkIwMDAxODQwMDAwQzAwMDAyMDIxOTEwMjAwMDEwMDQ2MTAyMzhDCis6MTAwMkMwMDAwMDAyMUZDMjAwNDMxMDIxMDAwMjE4NDM5NEEyMDAwMDQ0Cis6MTAwMkQwMDAyNEU3MDAwMTAwODIyMDIxMDBFMzEwMkExNDQwRkZGQkU0Cis6MTAwMkUwMDAyNEE1MDAwMjAwMDQxQzAyMzA4MkZGRkYwMDYyMjAyMUNFCis6MTAwMkYwMDAwMDA0MTQwMjAwODIyMDIxM0MwMkZGRkYwMTgyMTAyNDJFCis6MTAwMzAwMDAzMDgzRkZGRjAwNDMxMDI1M0MwMTAwMDEwODAwNDBGQTQ0Cis6MTAwMzEwMDBBQzIyMEY4MDNDMDUwMDAxMjRBNTBGN0M5MEEyMDAwMEI4Cis6MTAwMzIwMDAzQzBDMDAwMTAxODM2MDIxOEQ4QzgwMTgwMDAyMjBDMkVBCis6MTAwMzMwMDAxMDgwMDAwRTAwMDAzODIxMDE2MDMwMjEyNEE1MDAwQzNGCis6MTAwMzQwMDA4Q0EyMDAwMDhDQTMwMDA0MjRBNTAwMDgyNEU3MDAwMTZGCis6MTAwMzUwMDBBQ0MyMDAwMEFDQzMwMDA0MDBFNDEwMkIxNDQwRkZGODUyCis6MTAwMzYwMDAyNEM2MDAwODNDMDUwMDAxMjRBNTBGN0M5MEEyMDAwMEQzCis6MTAwMzcwMDAzMDQzMDAwNzI0MDIwMDA0MTA2MjAwMTEyODYyMDAwNUM3Cis6MTAwMzgwMDAxMDQwMDAwNTI0MDIwMDAyMTA2MjAwMDgwMDA3MTBDMDlGCis6MTAwMzkwMDAwODAwNDBGQTAwMDAwMDAwMjQwMjAwMDYxMDYyMDAwRTZGCis6MTAwM0EwMDAwMDA3MTBDMDA4MDA0MEZBMDAwMDAwMDAwMEEyMTgyMTU5Cis6MTAwM0IwMDA5NDYzMDAwQzAwNEIxMDIxMDgwMDQwRkFBNDQzMDAwMDk1Cis6MTAwM0MwMDAwMDA3MTBDMDAwQTIxODIxOEM2MzAwMEMwMDRCMTAyMTA0Cis6MTAwM0QwMDAwODAwNDBGQUFDNDMwMDAwMDBBMjE4MjE4QzYzMDAwQzE2Cis6MTAwM0UwMDAwMDRCMjAyMTAwQTIxMDIxQUM4MzAwMDA5NDQyMDAxMDk5Cis6MTAwM0YwMDBBNDgyMDAwNDk1RTcwMDA2M0MwMjAwMDE5MDQyMEY3Q0I1Cis6MTAwNDAwMDAzQzAzMDAwMTkwNjMwRjdBMDBFMkM4MjMzQzAyMDAwMTI0Cis6MTAwNDEwMDA5MDQyMEY3QjI0NjMwMDI4MDFFMzQwMjEyNDQyMDAyOEZFCis6MTAwNDIwMDAxNTIwMDAxMjAxRTIzMDIxOTRDMjAwMEMzQzAxMDAwMUIxCis6MTAwNDMwMDBBNDIyMEY3ODk0QzIwMDA0OTRDMzAwMDYzQzAxMDAwMTdBCis6MTAwNDQwMDBBNDIwMEY3NjNDMDEwMDAxQTQyMDBGNzIwMDAyMTQwMENBCis6MTAwNDUwMDAwMDQzMTAyNTNDMDEwMDAxQUMyMjBGNkM5NTAyMDAwNDAyCis6MTAwNDYwMDAzQzAxMDAwMTA4MDA0MTI0QTQyMjBGNzAzQzAyMDAwMTVECis6MTAwNDcwMDA5NDQyMEY3MDNDMDMwMDAxOTQ2MzBGNzIwMDQzMTAyMUZCCis6MTAwNDgwMDBBNTAyMDAwNDNDMDIwMDAxOTQ0MjBGNkNBNEMyMDAwNEM3Cis6MTAwNDkwMDAzQzAyMDAwMThDNDIwRjZDQTRDMjAwMDYzQzA0MDAwMTI3Cis6MTAwNEEwMDA5NDg0MEY3MjNDMDIwMDAxOTQ0MjBGNzAzQzBBMDAwMUQ4Cis6MTAwNEIwMDA5NTRBMEY3NjAwNDQxODIxMzA2M0ZGRkYwMDYyMTgyQTI2Cis6MTAwNEMwMDAyNDAyMDAwMjExMjIwMDBCMDA4MzIwMjMzQzAzMDAwMUMwCis6MTAwNEQwMDA5NDYzMEY3ODMwNjIwMDA5MTA0MDAwMDYzMDYyRkZGNjI2Cis6MTAwNEUwMDBBNEMyMDAwQzNDMDIwMDAxOTQ0MjBGNzgzMDQyMDAwOTgzCis6MTAwNEYwMDAwMTQyNTAyMzI0MDIwMDAxMTEyMjAwMUIyOTIyMDAwMjg0Cis6MTAwNTAwMDA1MDQwMDAwNTI0MDIwMDAyMTEyMDAwMDczMUEyRkZGRjI1Cis6MTAwNTEwMDAwODAwNDE5NzAwMDAwMDAwMTEyMjAwMUQyNDAyMDAxNjZGCis6MTAwNTIwMDAwODAwNDE5NzMxQTJGRkZGM0MwRTAwMDE5NUNFMEY4MERECis6MTAwNTMwMDAxMDgwMDAwNTAxODA2ODIxMDFDNDIwMjEwMDA0MUMwMkY0Cis6MTAwNTQwMDAzMDgyRkZGRjAwNjI3MDIxMDAwRTEwMjdBNTAyMDAwQTEyCis6MTAwNTUwMDAzQzAzMDAwMTkwNjMwRjdCMzFBMkZGRkYwMEUyMTAyMUZBCis6MTAwNTYwMDAwODAwNDE4RDAwNDMyMDIzM0MwMjAwMDE5NDQyMEY4MDhCCis6MTAwNTcwMDAwMDQ0MjAyMTAwMDQxQzAyMzA4MkZGRkYwMDYyMjAyMTgxCis6MTAwNTgwMDAwMDgwNzAyMTAwMDQxMDI3MDgwMDQxODVBNTAyMDAwQUEwCis6MTAwNTkwMDAzQzA1MDAwMTI0QTUwRjdBOTBBMzAwMDAxNDYyMDAwMjFDCis6MTAwNUEwMDAyNEUyRkZGMkE1RTIwMDM0OTBBMjAwMDAwMEUyMTAyMzUyCis6MTAwNUIwMDBBNTAyMDAwMjNDMDMwMDAxOTQ2MzBGODAzQzAyMDAwMThECis6MTAwNUMwMDA5NDQyMEY1QTMwRTVGRkZGMDA2NDE4MjEwMDQ1MTAyM0M0Cis6MTAwNUQwMDAwMDYyMjAyMzAwMDQxQzAyMzA4MkZGRkYwMDYyMjAyMTAxCis6MTAwNUUwMDAwMDA0MTAyN0E1MDIwMDBBM0MwMzAwMDE5MDYzMEY3QzYxCis6MTAwNUYwMDAyNDYyMDAwMTE0QTIwMDA1MDA4MDcwMjEwMTYzMTAyMTEzCis6MTAwNjAwMDA5MDQyMDAwMDA4MDA0MTg1MDAwMjYyMDAyNDYyMDAwMjVFCis6MTAwNjEwMDAxNEEyMDAwMzMwNjIwMEZFMDA0QjEwMjE5NDRDMDAwMDM1Cis6MTAwNjIwMDAzQzAyMDAwMTk0NDIwRjgyMzE4M0ZGRkYzQzA0MDAwMTMxCis6MTAwNjMwMDA5MDg0MEY3QjAwNDMxMDIxMDBFMjEwMjEwMDQ0MjAyMzBFCis6MTAwNjQwMDAwMDhBMjAyMTAwMDQxQzAyMzA4MkZGRkYwMDYyMjAyMTZBCis6MTAwNjUwMDAwMDA0MTQwMjAwODIyMDIxMDA4MDY4MjEwMDA0MTAyNzc5Cis6MTAwNjYwMDBBNEMyMDAxMDMxQTJGRkZGMDAwRTFDMDAwMDQzMTAyNUExCis6MTAwNjcwMDAzQzA0MDAwMTI0ODQwRjcyQURFMjAwMTA5NDgyMDAwMDVCCis6MTAwNjgwMDAzQzA1MDAwMTk0QTUwRjc2M0MwMzAwMDE4QzYzMEY2Q0MwCis6MTAwNjkwMDAyNDQyMDAwMTAwQjkyODIxQTQ4MjAwMDAzMzIyRkZGRjc4Cis6MTAwNkEwMDAwMDYyMjAyMTAwODMxODJCM0MwMTAwMDFBNDI1MEY3NjU1Cis6MTAwNkIwMDAxMDYwMDAwMzI0QTJGRkZGM0MwMTAwMDFBNDIyMEY3NjdBCis6MTAwNkMwMDAzQzAyNDAwMDAzMDIxMDI1M0MwMTAwMDFBQzI0MEY2Q0U5Cis6MTAwNkQwMDBBRjYyMTAwODAzRTAwMDA4MjdCRDAwMTAzQzAzMDAwMUQyCis6MTAwNkUwMDA5MDYzMEY1NjI3QkRGRkU4MjQwMjAwMDFBRkJGMDAxNDNFCis6MTAwNkYwMDAxMDYyMDAyNkFGQjAwMDEwOEY2MjBDRjQyNDQyRkZGRjlFCis6MTAwNzAwMDAzMDQyMDA3RjAwMDIxMTAwOEM0MzQwMDAzQzAxMDAwMTk4Cis6MTAwNzEwMDBBQzIzMEY2NDhDNDM0MDA4MjQ0NDQwMDA4QzVDNDAwNEFDCis6MTAwNzIwMDAzMDYyMDA0MDE0NDAwMDAyMjQwMjAwODgyNDAyMDAwOEM1Cis6MTAwNzMwMDAzQzAxMDAwMUE0MjIwRjY4MzA2MjAwMDQxMDQwMDAwNTUzCis6MTAwNzQwMDAyNDAyMDAwMTNDMDEwMDAxQTAyMjBGNTcwODAwNDFENUZFCis6MTAwNzUwMDAwMDAzMTQwMjNDMDEwMDAxQTAyMDBGNTcwMDAzMTQwMjAzCis6MTAwNzYwMDAzQzAxMDAwMUE0MjIwRjU0OTQ4MzAwMEMyNDAyMDAwMUQ4Cis6MTAwNzcwMDAzQzAxMDAwMUE0MjAwRjUwM0MwMTAwMDFBMDIyMEY1NkIzCis6MTAwNzgwMDAzQzAxMDAwMUE0MjMwRjYyMjQwMjAwMDExMzQyMDAxRTU5Cis6MTAwNzkwMDAwMDAwMDAwMDEzNDAwMDA1MjQwMjAwMDMxMzQyMDA2NzFDCis6MTAwN0EwMDAwMDAwMDAwMDA4MDA0MkNGMDAwMDAwMDAzQzAyMDAwMUYxCis6MTAwN0IwMDA5NDQyMEY2MjI0MUEwMDAxM0MwMTAwMDFBNDIwMEY1RTQ0Cis6MTAwN0MwMDAzQzAxMDAwMUE0MjAwRjUyMzA0NDA3RkYwMDAyMUJDMjZECis6MTAwN0QwMDAwMDAzMTgyMzMwNjMwMDNFMzQ2MzAwMzYwMDAyMTI0MkU3Cis6MTAwN0UwMDAzMDQyMDAzQzAwNjIxODIxM0MwMTAwMDFBNDI0MEY1ODUzCis6MTAwN0YwMDAwMDgzMjAyMTI0NjMwMDMwM0MwMTAwMDFBNDI0MEY1QTBGCis6MTAwODAwMDAzQzAxMDAwMUE0MjMwRjVDM0MwNjAwMDEyNEM2MEY1MkVBCis6MTAwODEwMDA5NEM1MDAwMDk0QzMwMDAyM0MwNDAwMDE5NDg0MEY1QTY0Cis6MTAwODIwMDAwMDY1MTAyMTAwNDQxMDJBMTA0MDAwMTMzQzEwODAwMDg1Cis6MTAwODMwMDAwMEEzMTAyMUE0QzIwMDAwM0MwMkEwMDBBRjYyMENGNDhGCis6MTAwODQwMDAzQzAxMDAwMUEwMjAwRjU2OEY2NDEwMDgwMDkwMTAyNDc2Cis6MTAwODUwMDAxNDQwMDAwMzAwMDAwMDAwMEMwMDQwNjQwMDAwMDAwMDkxCis6MTAwODYwMDA4RjYyMENGNDAwNTAxMDI0MTA0MDAwQjcwMDAwMDAwMDBDCis6MTAwODcwMDAwODAwNDIwRjAwMDAwMDAwM0MwMzAwMDE5NDYzMEY1MDg5Cis6MTAwODgwMDAwMDg1MTAyM0E0QzQwMDAwMDA2MjE4MjEzMDQyRkZGRjNECis6MTAwODkwMDAzQzAxMDAwMUE0MjMwRjUwQUY2MjBDRTgzQzAyMDAwMUIwCis6MTAwOEEwMDA5NDQyMEY2ODM0NDIwMDI0QUY2MjBDRUM5NEMzMDAwMkZGCis6MTAwOEIwMDAzQzAyMDAwMTk0NDIwRjUwMTQ2MjAwMTIzQzAyODAwMDdFCis6MTAwOEMwMDAzQzEwODAwMDNDMDJBMDAwQUY2MjBDRjQzQzAxMDAwMTJGCis6MTAwOEQwMDBBMDIwMEY1NjhGNjQxMDA4MDA5MDEwMjQxNDQwMDAwM0NECis6MTAwOEUwMDAwMDAwMDAwMDBDMDA0MDY0MDAwMDAwMDA4RjYyMENGNDY3Cis6MTAwOEYwMDAwMDUwMTAyNDE0NDBGRkY3MDAwMDAwMDAwODAwNDJDRjExCis6MTAwOTAwMDAyNDFBMDAwM0FGNjIwQ0Y0M0MxMDgwMDA4RjY0MTAwOEJFCis6MTAwOTEwMDAwMDkwMTAyNDE0NDAwMDAzMDAwMDAwMDAwQzAwNDA2NDBDCis6MTAwOTIwMDAwMDAwMDAwMDhGNjIwQ0Y0MDA1MDEwMjQxNDQwRkZGNzA4Cis6MTAwOTMwMDAwMDAwMDAwMDA4MDA0MkNGMjQxQTAwMDMzQzA3MDAwMTE5Cis6MTAwOTQwMDAyNEU3MEY1MDk0RTIwMDAwMDM4MjEwMjFBRjYyMENFMDE0Cis6MTAwOTUwMDAzQzAyMDAwMThDNDIwRjY0QUY2MjBDRTQzQzA1MDAwMUQ0Cis6MTAwOTYwMDA5NEE1MEY1NDk0RTMwMDAwM0MwNDAwMDE5NDg0MEY1OEI0Cis6MTAwOTcwMDAzQzAyMDAwMTk0NDIwRjVFMDBBMzI4MjMwMDgyMjAyMzQyCis6MTAwOTgwMDAzMEE2RkZGRjMwODNGRkZGMDBDMzEwMkIxNDQwMDA0MzRECis6MTAwOTkwMDAwMDAwMDAwMDNDMDIwMDAxOTQ0MjBGNUMwMDAyMTQwMEMxCis6MTAwOUEwMDAwMDYyMTAyNUFGNjIwQ0U4OTRFMjAwMDAzQzAzMDAwMUY1Cis6MTAwOUIwMDA5NDYzMEY1NDAwNDQxMDIxQTRFMjAwMDAzMDQyRkZGRjcyCis6MTAwOUMwMDAxNDQzMDAyMTNDMDIwMDA4M0MwMjAwMDE5MDQyMEY1N0YyCis6MTAwOUQwMDAxMDQwMDAwNjNDMDMwMDBDM0MwMjAwMDE5NDQyMEY2OEVBCis6MTAwOUUwMDAzNDYzMDYyNDA4MDA0MjdDMDAwMEQwMjEzQzAyMDAwMTUwCis6MTAwOUYwMDA5NDQyMEY2ODNDMDMwMDA4MzQ2MzA2MjQwMDQzMTAyNTJBCis6MTAwQTAwMDBBRjYyMENFQzNDMTA4MDAwM0MwMkEwMDBBRjYyMENGNDIyCis6MTAwQTEwMDAzQzAxMDAwMUEwMjAwRjU2OEY2NDEwMDgwMDkwMTAyNEE0Cis6MTAwQTIwMDAxNDQwMDAwMzAwMDAwMDAwMEMwMDQwNjQwMDAwMDAwMEJGCis6MTAwQTMwMDA4RjYyMENGNDAwNTAxMDI0MTA0MDAwMTUwMDAwMDAwMERDCis6MTAwQTQwMDAwODAwNDI4MzAwMDAwMDAwM0MwMzAwMDE5NDYzMEY2ODJCCis6MTAwQTUwMDAzNDQyMDYyNDNDMTA4MDAwMDA2MjE4MjUzQzAyODAwMENECis6MTAwQTYwMDBBRjYzMENFQ0FGNjIwQ0Y0OEY2NDEwMDgwMDkwMTAyNDlDCis6MTAwQTcwMDAxNDQwMDAwMzAwMDAwMDAwMEMwMDQwNjQwMDAwMDAwMDZGCis6MTAwQTgwMDA4RjYyMENGNDAwNTAxMDI0MTQ0MEZGRjcwMDAwMDAwMEE3Cis6MTAwQTkwMDAzQzAxMDAwMTA4MDA0MkNGQTQyMDBGNUUzQzAyMDAwMThGCis6MTAwQUEwMDA5NDQyMEY1QzAwMDIxNDAwMDBDMjEwMjVBRjYyMENFOEYzCis6MTAwQUIwMDAzQzAyMDAwMTkwNDIwRjU3MTA0MDAwMDkzQzAzMDAwQzFCCis6MTAwQUMwMDAzQzAyMDAwMTk0NDIwRjY4MzQ2MzA2MjQwMDAwRDAyMUU4Cis6MTAwQUQwMDAwMDQzMTAyNUFGNjIwQ0VDMDgwMDQyQzEzQzEwODAwMEJFCis6MTAwQUUwMDAzQzAyMDAwMTk0NDIwRjY4M0MwMzAwMDgzNDYzMDYwNDkyCis6MTAwQUYwMDAwMDQzMTAyNUFGNjIwQ0VDM0MwMjAwMDE5NDQyMEY1RUYzCis6MTAwQjAwMDAwMDQ1MTAyMTNDMDEwMDAxQTQyMjBGNUUzQzEwODAwMDMyCis6MTAwQjEwMDAzQzAyQTAwMEFGNjIwQ0Y0M0MwMTAwMDFBMDIwMEY1NjgzCis6MTAwQjIwMDA4RjY0MTAwODAwOTAxMDI0MTQ0MDAwMDMwMDAwMDAwMDlGCis6MTAwQjMwMDAwQzAwNDA2NDAwMDAwMDAwOEY2MjBDRjQwMDUwMTAyNDkwCis6MTAwQjQwMDAxNDQwRkZGNzAwMDAwMDAwOEZCRjAwMTQ4RkIwMDAxMEFBCis6MTAwQjUwMDAwM0UwMDAwODI3QkQwMDE4MDAwMDAwMDAyN0JERkZFMEVCCis6MTAwQjYwMDAzQzA0MDAwMTI0ODQwRUMwMDAwMDI4MjEwMDAwMzAyMTM0Cis6MTAwQjcwMDAwMDAwMzgyMUFGQkYwMDE4QUZBMDAwMTAwQzAwNDM3ODcwCis6MTAwQjgwMDBBRkEwMDAxNDAwMDBEMDIxMjQwMjAxMzBBRjYyNTAwMDU5Cis6MTAwQjkwMDAzQzAxMDAwMUE0MjAwRjUwM0MwMTAwMDFBMDIwMEY1NzkwCis6MTAwQkEwMDA4RkJGMDAxODAzRTAwMDA4MjdCRDAwMjAyN0JERkZFODI1Cis6MTAwQkIwMDAzQzFCQzAwMEFGQkYwMDE0QUZCMDAwMTBBRjYwNjgwQ0FBCis6MTAwQkMwMDA4RjYyNjgwNDM0NDIwMDgyQUY2MjY4MDQ4RjYzNDAwMDIxCis6MTAwQkQwMDAyNDAyMEI1MDNDMDEwMDAxQUMyMjBGMjAyNDAyMEI3OEIwCis6MTAwQkUwMDAzQzAxMDAwMUFDMjIwRjMwMzQ2MzAwMDJBRjYzNDAwMENGCis6MTAwQkYwMDAwQzAwNDMxNTAwODA4MDIxM0MwMTAwMDFBMDIyMEYzNDJECis6MTAwQzAwMDAzMDQyMDBGRjI0MDMwMDAyMTQ0MzAwMDUwMDAwMDAwMEVFCis6MTAwQzEwMDAzQzAyMDAwMThDNDIwRjIwMDgwMDQzMDhBQzUwMDBDMDg5Cis6MTAwQzIwMDAzQzAyMDAwMThDNDIwRjIwQUM1MDAwQkM4RjYyNDQzNDY3Cis6MTAwQzMwMDA4RjYzNDQzODhGNjQ0NDEwM0MwMTAwMDFBQzIyMEYyOEJDCis6MTAwQzQwMDAzQzAxMDAwMUFDMjMwRjM4M0MwMTAwMDFBQzI0MEYyNDBGCis6MTAwQzUwMDA4RkJGMDAxNDhGQjAwMDEwMDNFMDAwMDgyN0JEMDAxOEZDCis6MTAwQzYwMDAwM0UwMDAwODI0MDIwMDAxMjdCREZGRjgxODgwMDAwOUY2Cis6MTAwQzcwMDAwMDAwMjgyMThGNjM2ODBDOEY2MjY4MEMxMDQzRkZGRTEwCis6MTAwQzgwMDAwMDAwMDAwMDI0QTUwMDAxMDBBNDEwMkExNDQwRkZGOTcwCis6MTAwQzkwMDAwMDAwMDAwMDAzRTAwMDA4MjdCRDAwMDg4RjYzNDQ1MEY3Cis6MTAwQ0EwMDAzQzAyMDAwMThDNDIwRjI4MDAwMzFDMDIwMDQzMTAyQjYxCis6MTAwQ0IwMDAxNDQwMDAwODNDMDM4MDAwM0MwNDAwMDE4Qzg0MEYzODgxCis6MTAwQ0MwMDA4RjYyNDQ1MDAwMDIxQzAyMDA4MzEwMkIxMDQwRkZGQzc2Cis6MTAwQ0QwMDAzQzAzODAwMEFGNjM0NDQ0OEY2MjQ0NDQwMDQzMTAyNENCCis6MTAwQ0UwMDAxNDQwRkZGRDAwMDAwMDAwOEY2MjQ0NDgwM0UwMDAwODRDCis6MTAwQ0YwMDAzMDQyRkZGRjMwODJGRkZGMjQ0MkUwMDAyQzQyMjAwMUZGCis6MTAwRDAwMDAxNDQwMDAwMzNDMDI0MDAwMDgwMDQzNDcyNDAyRkZGRjU4Cis6MTAwRDEwMDAwMDgyMjAyNUFGNjQ1QzM4OEY2MjVDMzAzMDQyMDAwMjc0Cis6MTAwRDIwMDAxNDQwRkZGQzAwMDAxMDIxMDNFMDAwMDgwMDAwMDAwMDU4Cis6MTAwRDMwMDA4RjYyNDQ1MDNDMDMwMDAxOEM2MzBGMjQwODAwNDM1MDMxCis6MTAwRDQwMDAzMDQyRkZGRjhGNjI0NDUwMzA0MkZGRkYwMDQzMTAyQkMwCis6MTAwRDUwMDAxNDQwRkZGQzAwMDAwMDAwMDNFMDAwMDgwMDAwMDAwMDU5Cis6MTAwRDYwMDAyN0JERkZFMDAwODAyODIxM0MwNDAwMDEyNDg0MEVEMDMwCis6MTAwRDcwMDAwMDAwMzAyMTAwMDAzODIxQUZCRjAwMThBRkEwMDAxMEU0Cis6MTAwRDgwMDAwQzAwNDM3OEFGQTAwMDE0MDgwMDQzNUYwMDAwMDAwMDhGCis6MTAwRDkwMDA4RkJGMDAxODAzRTAwMDA4MjdCRDAwMjAzQzAyMDAwMUJGCis6MTAwREEwMDAzNDQyRDYwMDNDMDMwMDAxMzQ2M0Q2MDAzQzA0MDAwMTA5Cis6MTAwREIwMDAzNDg0RERGRjNDMDEwMDAxQUMyMjBGNDAyNDAyMDA0MERFCis6MTAwREMwMDAzQzAxMDAwMUFDMjIwRjQ0M0MwMTAwMDFBQzIwMEYzQzZGCis6MTAwREQwMDBBQzYwMDAwMDI0NjMwMDA0MDA4MzEwMkI1MDQwRkZGRDMyCis6MTAwREUwMDBBQzYwMDAwMDAzRTAwMDA4MDAwMDAwMDAwMDgwNDgyMTIzCis6MTAwREYwMDA4RkFBMDAxMDNDMDIwMDAxOEM0MjBGM0MzQzA0MDAwMTExCis6MTAwRTAwMDA4Qzg0MEY0NDhGQUIwMDE0MjQ0MzAwMDEwMDQ0MTAyQjRBCis6MTAwRTEwMDAzQzAxMDAwMUFDMjMwRjNDMTQ0MDAwMDMwMDAwNDAyMUMyCis6MTAwRTIwMDAzQzAxMDAwMUFDMjAwRjNDM0MwMjAwMDE4QzQyMEYzQzE1Cis6MTAwRTMwMDAzQzAzMDAwMThDNjMwRjQwOTEyNDAwMDAwMDAyMTE0MDJDCis6MTAwRTQwMDAwMDQzMTAyMTAwNDgxMDIxMjUwODAwMDFBMDQ0MDAwMEEzCis6MTAwRTUwMDAyOTAyMDAwODE0NDBGRkY0MjUyOTAwMDEzQzAyMDAwMThBCis6MTAwRTYwMDA4QzQyMEYzQzNDMDMwMDAxOEM2MzBGNDA4RjY0NjgwQzg0Cis6MTAwRTcwMDAwMDAyMTE0MDAwNDMxMDIxQUM0NDAwMDhBQzQ1MDAwQ0I2Cis6MTAwRTgwMDBBQzQ2MDAxMEFDNDcwMDE0QUM0QTAwMTgwM0UwMDAwODYwCis6MTAwRTkwMDBBQzRCMDAxQzAwMDAwMDAwMDAwMDAwMDA0RDYxNjk2RUJBCis6MTAwRUEwMDA0MzcwNzU0MjAwMDAwMDAwNEQ2MTY5NkU0MzcwNzU0MUVBCis6MTAwRUIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3Mzc0NkI2RjcxCis6MTAwRUMwMDA2NjY2NkM2NDAwMDAwMDAwMDAwMDAwMDA3Mzc0NkI2RkM1Cis6MTAwRUQwMDA2NjY2NkM2NDAwMDAwMDAwMDAwMDAwMDA2NjYxNzQ2MURBCis6MTAwRUUwMDA2QzQ1NzI3MjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDZECis6MTAwRUYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEYyCis6MTAwRjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUxCis6MTAwRjEwMDA3Mzc0NkI2RjY2NjY2QzY0NUY3NjMxMkUzMjJFMzAwMEIwCis6MEMwRjIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBDNQorOjAwMDAwMDAxRkYKKyAqIEZpcm13YXJlIGlzOgorICoJRGVyaXZlZCBmcm9tIHByb3ByaWV0YXJ5IHVucHVibGlzaGVkIHNvdXJjZSBjb2RlLAorICoJQ29weXJpZ2h0IChDKSAyMDAwLTIwMDMgQnJvYWRjb20gQ29ycG9yYXRpb24uCisgKgorICoJUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCBmb3IgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpcm13YXJlCisgKglkYXRhIGluIGhleGFkZWNpbWFsIG9yIGVxdWl2YWxlbnQgZm9ybWF0LCBwcm92aWRlZCB0aGlzIGNvcHlyaWdodAorICoJbm90aWNlIGlzIGFjY29tcGFueWluZyBpdC4KKy8qIDU3MDUgbmVlZHMgYSBzcGVjaWFsIHZlcnNpb24gb2YgdGhlIFRTTyBmaXJtd2FyZS4gICovCmRpZmYgLS1naXQgYS9mcy9LY29uZmlnIGIvZnMvS2NvbmZpZwppbmRleCBmZjBlODE5Li4zMjg4MzU4IDEwMDY0NAotLS0gYS9mcy9LY29uZmlnCisrKyBiL2ZzL0tjb25maWcKQEAgLTE4OSw2ICsxODksOCBAQAogCXNlbGVjdCBDT05GSUdGU19GUwogCXNlbGVjdCBKQkQyCiAJc2VsZWN0IENSQzMyCisJc2VsZWN0IFFVT1RBCisJc2VsZWN0IFFVT1RBX1RSRUUKIAloZWxwCiAJICBPQ0ZTMiBpcyBhIGdlbmVyYWwgcHVycG9zZSBleHRlbnQgYmFzZWQgc2hhcmVkIGRpc2sgY2x1c3RlciBmaWxlCiAJICBzeXN0ZW0gd2l0aCBtYW55IHNpbWlsYXJpdGllcyB0byBleHQzLiBJdCBzdXBwb3J0cyA2NCBiaXQgaW5vZGUKQEAgLTI1OCwxNSArMjYwLDE0IEBACiAJICB0aGlzIG9wdGlvbiBmb3IgZGVidWdnaW5nIG9ubHkgYXMgaXQgaXMgbGlrZWx5IHRvIGRlY3JlYXNlCiAJICBwZXJmb3JtYW5jZSBvZiB0aGUgZmlsZXN5c3RlbS4KIAotY29uZmlnIE9DRlMyX0NPTVBBVF9KQkQKLQlib29sICJVc2UgSkJEIGZvciBjb21wYXRpYmlsaXR5IgorY29uZmlnIE9DRlMyX0ZTX1BPU0lYX0FDTAorCWJvb2wgIk9DRlMyIFBPU0lYIEFjY2VzcyBDb250cm9sIExpc3RzIgogCWRlcGVuZHMgb24gT0NGUzJfRlMKKwlzZWxlY3QgRlNfUE9TSVhfQUNMCiAJZGVmYXVsdCBuCi0Jc2VsZWN0IEpCRAogCWhlbHAKLQkgIFRoZSBvY2ZzMiBmaWxlc3lzdGVtIG5vdyB1c2VzIEpCRDIgZm9yIGl0cyBqb3VybmFsbGluZy4gIEpCRDIKLQkgIGlzIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGggSkJELiAgSXQgaXMgc2FmZSB0byBzYXkgTiBoZXJlLgotCSAgSG93ZXZlciwgaWYgeW91IHJlYWxseSB3YW50IHRvIHVzZSB0aGUgb3JpZ2luYWwgSkJELCBzYXkgWSBoZXJlLgorCSAgUG9zaXggQWNjZXNzIENvbnRyb2wgTGlzdHMgKEFDTHMpIHN1cHBvcnQgcGVybWlzc2lvbnMgZm9yIHVzZXJzIGFuZAorCSAgZ3JvdXBzIGJleW9uZCB0aGUgb3duZXIvZ3JvdXAvd29ybGQgc2NoZW1lLgogCiBlbmRpZiAjIEJMT0NLCiAKQEAgLTMwMyw2ICszMDQsMTAgQEAKIAkgIE5vdGUgdGhhdCB0aGlzIGJlaGF2aW9yIGlzIGN1cnJlbnRseSBkZXByZWNhdGVkIGFuZCBtYXkgZ28gYXdheSBpbgogCSAgZnV0dXJlLiBQbGVhc2UgdXNlIG5vdGlmaWNhdGlvbiB2aWEgbmV0bGluayBzb2NrZXQgaW5zdGVhZC4KIAorIyBHZW5lcmljIHN1cHBvcnQgZm9yIHRyZWUgc3RydWN0dXJlZCBxdW90YSBmaWxlcy4gU2VsZXRlZCB3aGVuIG5lZWRlZC4KK2NvbmZpZyBRVU9UQV9UUkVFCisJIHRyaXN0YXRlCisKIGNvbmZpZyBRRk1UX1YxCiAJdHJpc3RhdGUgIk9sZCBxdW90YSBmb3JtYXQgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFFVT1RBCkBAIC0zMTQsNiArMzE5LDcgQEAKIGNvbmZpZyBRRk1UX1YyCiAJdHJpc3RhdGUgIlF1b3RhIGZvcm1hdCB2MiBzdXBwb3J0IgogCWRlcGVuZHMgb24gUVVPVEEKKwlzZWxlY3QgUVVPVEFfVFJFRQogCWhlbHAKIAkgIFRoaXMgcXVvdGEgZm9ybWF0IGFsbG93cyB1c2luZyBxdW90YXMgd2l0aCAzMi1iaXQgVUlEcy9HSURzLiBJZiB5b3UKIAkgIG5lZWQgdGhpcyBmdW5jdGlvbmFsaXR5IHNheSBZIGhlcmUuCkBAIC03MTUsNyArNzIxLDIwIEBACiAKIGVuZG1lbnUKIAotbWVudSAiTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcyIKK21lbnVjb25maWcgTUlTQ19GSUxFU1lTVEVNUworCWJvb2wgIk1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMiCisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSB0byBnZXQgdG8gc2VlIG9wdGlvbnMgZm9yIHZhcmlvdXMgbWlzY2VsbGFuZW91cworCSAgZmlsZXN5c3RlbXMsIHN1Y2ggYXMgZmlsZXN5c3RlbXMgdGhhdCBjYW1lIGZyb20gb3RoZXIKKwkgIG9wZXJhdGluZyBzeXN0ZW1zLgorCisJICBUaGlzIG9wdGlvbiBhbG9uZSBkb2VzIG5vdCBhZGQgYW55IGtlcm5lbCBjb2RlLgorCisJICBJZiB5b3Ugc2F5IE4sIGFsbCBvcHRpb25zIGluIHRoaXMgc3VibWVudSB3aWxsIGJlIHNraXBwZWQgYW5kCisJICBkaXNhYmxlZDsgaWYgdW5zdXJlLCBzYXkgWSBoZXJlLgorCitpZiBNSVNDX0ZJTEVTWVNURU1TCiAKIGNvbmZpZyBBREZTX0ZTCiAJdHJpc3RhdGUgIkFERlMgZmlsZSBzeXN0ZW0gc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKQEAgLTEwODUsNyArMTEwNCw3IEBACiAJICBZIGhlcmUuICBUaGlzIHdpbGwgcmVzdWx0IGluIF9tYW55XyBhZGRpdGlvbmFsIGRlYnVnZ2luZyBtZXNzYWdlcyB0byBiZQogCSAgd3JpdHRlbiB0byB0aGUgc3lzdGVtIGxvZy4KIAotZW5kbWVudQorZW5kaWYgIyBNSVNDX0ZJTEVTWVNURU1TCiAKIG1lbnVjb25maWcgTkVUV09SS19GSUxFU1lTVEVNUwogCWJvb2wgIk5ldHdvcmsgRmlsZSBTeXN0ZW1zIgpkaWZmIC0tZ2l0IGEvZnMvTWFrZWZpbGUgYi9mcy9NYWtlZmlsZQppbmRleCBlNmY0MjNkLi5jODMwNjExIDEwMDY0NAotLS0gYS9mcy9NYWtlZmlsZQorKysgYi9mcy9NYWtlZmlsZQpAQCAtNTQsNiArNTQsNyBAQAogb2JqLSQoQ09ORklHX1FVT1RBKQkJKz0gZHF1b3Qubwogb2JqLSQoQ09ORklHX1FGTVRfVjEpCQkrPSBxdW90YV92MS5vCiBvYmotJChDT05GSUdfUUZNVF9WMikJCSs9IHF1b3RhX3YyLm8KK29iai0kKENPTkZJR19RVU9UQV9UUkVFKQkrPSBxdW90YV90cmVlLm8KIG9iai0kKENPTkZJR19RVU9UQUNUTCkJCSs9IHF1b3RhLm8KIAogb2JqLSQoQ09ORklHX1BST0NfRlMpCQkrPSBwcm9jLwpkaWZmIC0tZ2l0IGEvZnMvYWZmcy9pbm9kZS5jIGIvZnMvYWZmcy9pbm9kZS5jCmluZGV4IDQxNWQ5YzYuLjNjNGVjN2QgMTAwNjQ0Ci0tLSBhL2ZzL2FmZnMvaW5vZGUuYworKysgYi9mcy9hZmZzL2lub2RlLmMKQEAgLTExOSw4ICsxMTksNyBAQAogCQlnb3RvIGJhZF9pbm9kZTsKICNlbHNlCiAJCWlub2RlLT5pX21vZGUgfD0gU19JRkRJUjsKLQkJaW5vZGUtPmlfb3AgPSBOVUxMOwotCQlpbm9kZS0+aV9mb3AgPSBOVUxMOworCQkvKiAuLi4gYW5kIGxlYXZlIC0+aV9vcCBhbmQgLT5pX2ZvcCBwb2ludGluZyB0byBlbXB0eSAqLwogCQlicmVhazsKICNlbmRpZgogCWNhc2UgU1RfTElOS0ZJTEU6CmRpZmYgLS1naXQgYS9mcy9hdXRvZnMvaW5vZGUuYyBiL2ZzL2F1dG9mcy9pbm9kZS5jCmluZGV4IGM3NzM2ODAuLmUxNzM0ZjIgMTAwNjQ0Ci0tLSBhL2ZzL2F1dG9mcy9pbm9kZS5jCisrKyBiL2ZzL2F1dG9mcy9pbm9kZS5jCkBAIC0yNTEsMTMgKzI1MSwxMSBAQAogCWlub2RlLT5pX21vZGUgPSBTX0lGRElSIHwgU19JUlVHTyB8IFNfSVhVR087CiAJaW5vZGUtPmlfbmxpbmsgPSAyOwogCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKLQlpbm9kZS0+aV9ibG9ja3MgPSAwOwogCiAJaWYgKGlubyA9PSBBVVRPRlNfUk9PVF9JTk8pIHsKIAkJaW5vZGUtPmlfbW9kZSA9IFNfSUZESVIgfCBTX0lSVUdPIHwgU19JWFVHTyB8IFNfSVdVU1I7CiAJCWlub2RlLT5pX29wID0gJmF1dG9mc19yb290X2lub2RlX29wZXJhdGlvbnM7CiAJCWlub2RlLT5pX2ZvcCA9ICZhdXRvZnNfcm9vdF9vcGVyYXRpb25zOwotCQlpbm9kZS0+aV91aWQgPSBpbm9kZS0+aV9naWQgPSAwOyAvKiBDaGFuZ2VkIGluIHJlYWRfc3VwZXIgKi8KIAkJZ290byBkb25lOwogCX0gCiAJCmRpZmYgLS1naXQgYS9mcy9hdXRvZnM0L2F1dG9mc19pLmggYi9mcy9hdXRvZnM0L2F1dG9mc19pLmgKaW5kZXggZTBmMTZkYS4uYTc2ODAzMSAxMDA2NDQKLS0tIGEvZnMvYXV0b2ZzNC9hdXRvZnNfaS5oCisrKyBiL2ZzL2F1dG9mczQvYXV0b2ZzX2kuaApAQCAtMjUsOCArMjUsNiBAQAogI2RlZmluZSBBVVRPRlNfREVWX0lPQ1RMX0lPQ19GSVJTVAkoQVVUT0ZTX0RFVl9JT0NUTF9WRVJTSU9OKQogI2RlZmluZSBBVVRPRlNfREVWX0lPQ1RMX0lPQ19DT1VOVAkoQVVUT0ZTX0lPQ19DT1VOVCAtIDExKQogCi0jZGVmaW5lIEFVVE9GU19UWVBFX1RSSUdHRVIJKEFVVE9GU19UWVBFX0RJUkVDVHxBVVRPRlNfVFlQRV9PRkZTRVQpCi0KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgpkaWZmIC0tZ2l0IGEvZnMvYXV0b2ZzNC9kZXYtaW9jdGwuYyBiL2ZzL2F1dG9mczQvZGV2LWlvY3RsLmMKaW5kZXggNjNiN2M3YS4uMDI1ZTEwNSAxMDA2NDQKLS0tIGEvZnMvYXV0b2ZzNC9kZXYtaW9jdGwuYworKysgYi9mcy9hdXRvZnM0L2Rldi1pb2N0bC5jCkBAIC0xMjQsNyArMTI0LDcgQEAKIAogLyoKICAqIENoZWNrIHNhbml0eSBvZiBwYXJhbWV0ZXIgY29udHJvbCBmaWVsZHMgYW5kIGlmIGEgcGF0aCBpcyBwcmVzZW50Ci0gKiBjaGVjayB0aGF0IGl0IGhhcyBhICIvIiBhbmQgaXMgdGVybWluYXRlZC4KKyAqIGNoZWNrIHRoYXQgaXQgaXMgdGVybWluYXRlZCBhbmQgY29udGFpbnMgYXQgbGVhc3Qgb25lICIvIi4KICAqLwogc3RhdGljIGludCB2YWxpZGF0ZV9kZXZfaW9jdGwoaW50IGNtZCwgc3RydWN0IGF1dG9mc19kZXZfaW9jdGwgKnBhcmFtKQogewpAQCAtMTM4LDE1ICsxMzgsMTYgQEAKIAl9CiAKIAlpZiAocGFyYW0tPnNpemUgPiBzaXplb2YoKnBhcmFtKSkgewotCQllcnIgPSBjaGVja19uYW1lKHBhcmFtLT5wYXRoKTsKKwkJZXJyID0gaW52YWxpZF9zdHIocGFyYW0tPnBhdGgsCisJCQkJICh2b2lkICopICgoc2l6ZV90KSBwYXJhbSArIHBhcmFtLT5zaXplKSk7CiAJCWlmIChlcnIpIHsKLQkJCUFVVE9GU19XQVJOKCJpbnZhbGlkIHBhdGggc3VwcGxpZWQgZm9yIGNtZCgweCUwOHgpIiwKLQkJCQkgICAgY21kKTsKKwkJCUFVVE9GU19XQVJOKAorCQkJICAicGF0aCBzdHJpbmcgdGVybWluYXRvciBtaXNzaW5nIGZvciBjbWQoMHglMDh4KSIsCisJCQkgIGNtZCk7CiAJCQlnb3RvIG91dDsKIAkJfQogCi0JCWVyciA9IGludmFsaWRfc3RyKHBhcmFtLT5wYXRoLAotCQkJCSAodm9pZCAqKSAoKHNpemVfdCkgcGFyYW0gKyBwYXJhbS0+c2l6ZSkpOworCQllcnIgPSBjaGVja19uYW1lKHBhcmFtLT5wYXRoKTsKIAkJaWYgKGVycikgewogCQkJQVVUT0ZTX1dBUk4oImludmFsaWQgcGF0aCBzdXBwbGllZCBmb3IgY21kKDB4JTA4eCkiLAogCQkJCSAgICBjbWQpOwpAQCAtMTgwLDcgKzE4MSw3IEBACiAJCQkJICAgICBzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSwKIAkJCQkgICAgIHN0cnVjdCBhdXRvZnNfZGV2X2lvY3RsICpwYXJhbSkKIHsKLQlwYXJhbS0+YXJnMSA9IHNiaS0+dmVyc2lvbjsKKwlwYXJhbS0+cHJvdG92ZXIudmVyc2lvbiA9IHNiaS0+dmVyc2lvbjsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTg5LDcgKzE5MCw3IEBACiAJCQkJCXN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpLAogCQkJCQlzdHJ1Y3QgYXV0b2ZzX2Rldl9pb2N0bCAqcGFyYW0pCiB7Ci0JcGFyYW0tPmFyZzEgPSBzYmktPnN1Yl92ZXJzaW9uOworCXBhcmFtLT5wcm90b3N1YnZlci5zdWJfdmVyc2lvbiA9IHNiaS0+c3ViX3ZlcnNpb247CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMzNSwxMyArMzM2LDEzIEBACiAJaW50IGVyciwgZmQ7CiAKIAkvKiBwYXJhbS0+cGF0aCBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQgKi8KLQlpZiAoIXBhcmFtLT5hcmcxKQorCWlmICghcGFyYW0tPm9wZW5tb3VudC5kZXZpZCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlwYXJhbS0+aW9jdGxmZCA9IC0xOwogCiAJcGF0aCA9IHBhcmFtLT5wYXRoOwotCWRldmlkID0gcGFyYW0tPmFyZzE7CisJZGV2aWQgPSBwYXJhbS0+b3Blbm1vdW50LmRldmlkOwogCiAJZXJyID0gMDsKIAlmZCA9IGF1dG9mc19kZXZfaW9jdGxfb3Blbl9tb3VudHBvaW50KHBhdGgsIGRldmlkKTsKQEAgLTM3Myw3ICszNzQsNyBAQAogewogCWF1dG9mc193cXRfdCB0b2tlbjsKIAotCXRva2VuID0gKGF1dG9mc193cXRfdCkgcGFyYW0tPmFyZzE7CisJdG9rZW4gPSAoYXV0b2ZzX3dxdF90KSBwYXJhbS0+cmVhZHkudG9rZW47CiAJcmV0dXJuIGF1dG9mczRfd2FpdF9yZWxlYXNlKHNiaSwgdG9rZW4sIDApOwogfQogCkBAIC0zODgsOCArMzg5LDggQEAKIAlhdXRvZnNfd3F0X3QgdG9rZW47CiAJaW50IHN0YXR1czsKIAotCXRva2VuID0gKGF1dG9mc193cXRfdCkgcGFyYW0tPmFyZzE7Ci0Jc3RhdHVzID0gcGFyYW0tPmFyZzIgPyBwYXJhbS0+YXJnMiA6IC1FTk9FTlQ7CisJdG9rZW4gPSAoYXV0b2ZzX3dxdF90KSBwYXJhbS0+ZmFpbC50b2tlbjsKKwlzdGF0dXMgPSBwYXJhbS0+ZmFpbC5zdGF0dXMgPyBwYXJhbS0+ZmFpbC5zdGF0dXMgOiAtRU5PRU5UOwogCXJldHVybiBhdXRvZnM0X3dhaXRfcmVsZWFzZShzYmksIHRva2VuLCBzdGF0dXMpOwogfQogCkBAIC00MTIsMTAgKzQxMywxMCBAQAogCWludCBwaXBlZmQ7CiAJaW50IGVyciA9IDA7CiAKLQlpZiAocGFyYW0tPmFyZzEgPT0gLTEpCisJaWYgKHBhcmFtLT5zZXRwaXBlZmQucGlwZWZkID09IC0xKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXBpcGVmZCA9IHBhcmFtLT5hcmcxOworCXBpcGVmZCA9IHBhcmFtLT5zZXRwaXBlZmQucGlwZWZkOwogCiAJbXV0ZXhfbG9jaygmc2JpLT53cV9tdXRleCk7CiAJaWYgKCFzYmktPmNhdGF0b25pYykgewpAQCAtNDU3LDggKzQ1OCw4IEBACiB7CiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwogCi0JdGltZW91dCA9IHBhcmFtLT5hcmcxOwotCXBhcmFtLT5hcmcxID0gc2JpLT5leHBfdGltZW91dCAvIEhaOworCXRpbWVvdXQgPSBwYXJhbS0+dGltZW91dC50aW1lb3V0OworCXBhcmFtLT50aW1lb3V0LnRpbWVvdXQgPSBzYmktPmV4cF90aW1lb3V0IC8gSFo7CiAJc2JpLT5leHBfdGltZW91dCA9IHRpbWVvdXQgKiBIWjsKIAlyZXR1cm4gMDsKIH0KQEAgLTQ4OSw3ICs0OTAsNyBAQAogCXBhdGggPSBwYXJhbS0+cGF0aDsKIAlkZXZpZCA9IHNiaS0+c2ItPnNfZGV2OwogCi0JcGFyYW0tPmFyZzEgPSBwYXJhbS0+YXJnMiA9IC0xOworCXBhcmFtLT5yZXF1ZXN0ZXIudWlkID0gcGFyYW0tPnJlcXVlc3Rlci5naWQgPSAtMTsKIAogCS8qIEdldCBuYW1laWRhdGEgb2YgdGhlIHBhcmVudCBkaXJlY3RvcnkgKi8KIAllcnIgPSBwYXRoX2xvb2t1cChwYXRoLCBMT09LVVBfUEFSRU5ULCAmbmQpOwpAQCAtNTA1LDggKzUwNiw4IEBACiAJCWVyciA9IDA7CiAJCWF1dG9mczRfZXhwaXJlX3dhaXQobmQucGF0aC5kZW50cnkpOwogCQlzcGluX2xvY2soJnNiaS0+ZnNfbG9jayk7Ci0JCXBhcmFtLT5hcmcxID0gaW5vLT51aWQ7Ci0JCXBhcmFtLT5hcmcyID0gaW5vLT5naWQ7CisJCXBhcmFtLT5yZXF1ZXN0ZXIudWlkID0gaW5vLT51aWQ7CisJCXBhcmFtLT5yZXF1ZXN0ZXIuZ2lkID0gaW5vLT5naWQ7CiAJCXNwaW5fdW5sb2NrKCZzYmktPmZzX2xvY2spOwogCX0KIApAQCAtNTI5LDEwICs1MzAsMTAgQEAKIAlpbnQgZXJyID0gLUVBR0FJTjsKIAlpbnQgaG93OwogCi0JaG93ID0gcGFyYW0tPmFyZzE7CisJaG93ID0gcGFyYW0tPmV4cGlyZS5ob3c7CiAJbW50ID0gZnAtPmZfcGF0aC5tbnQ7CiAKLQlpZiAoc2JpLT50eXBlICYgQVVUT0ZTX1RZUEVfVFJJR0dFUikKKwlpZiAoYXV0b2ZzX3R5cGVfdHJpZ2dlcihzYmktPnR5cGUpKQogCQlkZW50cnkgPSBhdXRvZnM0X2V4cGlyZV9kaXJlY3Qoc2JpLT5zYiwgbW50LCBzYmksIGhvdyk7CiAJZWxzZQogCQlkZW50cnkgPSBhdXRvZnM0X2V4cGlyZV9pbmRpcmVjdChzYmktPnNiLCBtbnQsIHNiaSwgaG93KTsKQEAgLTU2NSw5ICs1NjYsOSBAQAogCQkJCSAgICAgIHN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpLAogCQkJCSAgICAgIHN0cnVjdCBhdXRvZnNfZGV2X2lvY3RsICpwYXJhbSkKIHsKLQlwYXJhbS0+YXJnMSA9IDA7CisJcGFyYW0tPmFza3Vtb3VudC5tYXlfdW1vdW50ID0gMDsKIAlpZiAobWF5X3Vtb3VudChmcC0+Zl9wYXRoLm1udCkpCi0JCXBhcmFtLT5hcmcxID0gMTsKKwkJcGFyYW0tPmFza3Vtb3VudC5tYXlfdW1vdW50ID0gMTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjAwLDYgKzYwMSw3IEBACiAJc3RydWN0IG5hbWVpZGF0YSBuZDsKIAljb25zdCBjaGFyICpwYXRoOwogCXVuc2lnbmVkIGludCB0eXBlOworCXVuc2lnbmVkIGludCBkZXZpZCwgbWFnaWM7CiAJaW50IGVyciA9IC1FTk9FTlQ7CiAKIAlpZiAocGFyYW0tPnNpemUgPD0gc2l6ZW9mKCpwYXJhbSkpIHsKQEAgLTYwOCwxMyArNjEwLDEzIEBACiAJfQogCiAJcGF0aCA9IHBhcmFtLT5wYXRoOwotCXR5cGUgPSBwYXJhbS0+YXJnMTsKKwl0eXBlID0gcGFyYW0tPmlzbW91bnRwb2ludC5pbi50eXBlOwogCi0JcGFyYW0tPmFyZzEgPSAwOwotCXBhcmFtLT5hcmcyID0gMDsKKwlwYXJhbS0+aXNtb3VudHBvaW50Lm91dC5kZXZpZCA9IGRldmlkID0gMDsKKwlwYXJhbS0+aXNtb3VudHBvaW50Lm91dC5tYWdpYyA9IG1hZ2ljID0gMDsKIAogCWlmICghZnAgfHwgcGFyYW0tPmlvY3RsZmQgPT0gLTEpIHsKLQkJaWYgKHR5cGUgPT0gQVVUT0ZTX1RZUEVfQU5ZKSB7CisJCWlmIChhdXRvZnNfdHlwZV9hbnkodHlwZSkpIHsKIAkJCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CiAKIAkJCWVyciA9IHBhdGhfbG9va3VwKHBhdGgsIExPT0tVUF9GT0xMT1csICZuZCk7CkBAIC02MjIsNyArNjI0LDcgQEAKIAkJCQlnb3RvIG91dDsKIAogCQkJc2IgPSBuZC5wYXRoLmRlbnRyeS0+ZF9zYjsKLQkJCXBhcmFtLT5hcmcxID0gbmV3X2VuY29kZV9kZXYoc2ItPnNfZGV2KTsKKwkJCWRldmlkID0gbmV3X2VuY29kZV9kZXYoc2ItPnNfZGV2KTsKIAkJfSBlbHNlIHsKIAkJCXN0cnVjdCBhdXRvZnNfaW5mbyAqaW5vOwogCkBAIC02MzUsMzggKzYzNyw0MSBAQAogCQkJCWdvdG8gb3V0X3JlbGVhc2U7CiAKIAkJCWlubyA9IGF1dG9mczRfZGVudHJ5X2lubyhuZC5wYXRoLmRlbnRyeSk7Ci0JCQlwYXJhbS0+YXJnMSA9IGF1dG9mczRfZ2V0X2Rldihpbm8tPnNiaSk7CisJCQlkZXZpZCA9IGF1dG9mczRfZ2V0X2Rldihpbm8tPnNiaSk7CiAJCX0KIAogCQllcnIgPSAwOwogCQlpZiAobmQucGF0aC5kZW50cnktPmRfaW5vZGUgJiYKIAkJICAgIG5kLnBhdGgubW50LT5tbnRfcm9vdCA9PSBuZC5wYXRoLmRlbnRyeSkgewogCQkJZXJyID0gMTsKLQkJCXBhcmFtLT5hcmcyID0gbmQucGF0aC5kZW50cnktPmRfaW5vZGUtPmlfc2ItPnNfbWFnaWM7CisJCQltYWdpYyA9IG5kLnBhdGguZGVudHJ5LT5kX2lub2RlLT5pX3NiLT5zX21hZ2ljOwogCQl9CiAJfSBlbHNlIHsKLQkJZGV2X3QgZGV2aWQgPSBuZXdfZW5jb2RlX2RldihzYmktPnNiLT5zX2Rldik7CisJCWRldl90IGRldiA9IGF1dG9mczRfZ2V0X2RldihzYmkpOwogCiAJCWVyciA9IHBhdGhfbG9va3VwKHBhdGgsIExPT0tVUF9QQVJFTlQsICZuZCk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dDsKIAotCQllcnIgPSBhdXRvZnNfZGV2X2lvY3RsX2ZpbmRfc3VwZXIoJm5kLCBkZXZpZCk7CisJCWVyciA9IGF1dG9mc19kZXZfaW9jdGxfZmluZF9zdXBlcigmbmQsIGRldik7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dF9yZWxlYXNlOwogCi0JCXBhcmFtLT5hcmcxID0gYXV0b2ZzNF9nZXRfZGV2KHNiaSk7CisJCWRldmlkID0gZGV2OwogCiAJCWVyciA9IGhhdmVfc3VibW91bnRzKG5kLnBhdGguZGVudHJ5KTsKIAogCQlpZiAobmQucGF0aC5tbnQtPm1udF9tb3VudHBvaW50ICE9IG5kLnBhdGgubW50LT5tbnRfcm9vdCkgewogCQkJaWYgKGZvbGxvd19kb3duKCZuZC5wYXRoLm1udCwgJm5kLnBhdGguZGVudHJ5KSkgewogCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBuZC5wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKLQkJCQlwYXJhbS0+YXJnMiA9IGlub2RlLT5pX3NiLT5zX21hZ2ljOworCQkJCW1hZ2ljID0gaW5vZGUtPmlfc2ItPnNfbWFnaWM7CiAJCQl9CiAJCX0KIAl9CiAKKwlwYXJhbS0+aXNtb3VudHBvaW50Lm91dC5kZXZpZCA9IGRldmlkOworCXBhcmFtLT5pc21vdW50cG9pbnQub3V0Lm1hZ2ljID0gbWFnaWM7CisKIG91dF9yZWxlYXNlOgogCXBhdGhfcHV0KCZuZC5wYXRoKTsKIG91dDoKZGlmZiAtLWdpdCBhL2ZzL2F1dG9mczQvZXhwaXJlLmMgYi9mcy9hdXRvZnM0L2V4cGlyZS5jCmluZGV4IDRiNmZiM2YuLmUzYmQ1MDcgMTAwNjQ0Ci0tLSBhL2ZzL2F1dG9mczQvZXhwaXJlLmMKKysrIGIvZnMvYXV0b2ZzNC9leHBpcmUuYwpAQCAtNjMsNyArNjMsNyBAQAogCQlzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSA9IGF1dG9mczRfc2JpKGRlbnRyeS0+ZF9zYik7CiAKIAkJLyogVGhpcyBpcyBhbiBhdXRvZnMgc3VibW91bnQsIHdlIGNhbid0IGV4cGlyZSBpdCAqLwotCQlpZiAoc2JpLT50eXBlID09IEFVVE9GU19UWVBFX0lORElSRUNUKQorCQlpZiAoYXV0b2ZzX3R5cGVfaW5kaXJlY3Qoc2JpLT50eXBlKSkKIAkJCWdvdG8gZG9uZTsKIAogCQkvKgpAQCAtNDkwLDcgKzQ5MCw3IEBACiAJaWYgKGFyZyAmJiBnZXRfdXNlcihkb19ub3csIGFyZykpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JaWYgKHNiaS0+dHlwZSAmIEFVVE9GU19UWVBFX1RSSUdHRVIpCisJaWYgKGF1dG9mc190eXBlX3RyaWdnZXIoc2JpLT50eXBlKSkKIAkJZGVudHJ5ID0gYXV0b2ZzNF9leHBpcmVfZGlyZWN0KHNiLCBtbnQsIHNiaSwgZG9fbm93KTsKIAllbHNlCiAJCWRlbnRyeSA9IGF1dG9mczRfZXhwaXJlX2luZGlyZWN0KHNiLCBtbnQsIHNiaSwgZG9fbm93KTsKZGlmZiAtLWdpdCBhL2ZzL2F1dG9mczQvaW5vZGUuYyBiL2ZzL2F1dG9mczQvaW5vZGUuYwppbmRleCA3YjE5ODAyLi43MTZlMTJiIDEwMDY0NAotLS0gYS9mcy9hdXRvZnM0L2lub2RlLmMKKysrIGIvZnMvYXV0b2ZzNC9pbm9kZS5jCkBAIC0xOTcsOSArMTk3LDkgQEAKIAlzZXFfcHJpbnRmKG0sICIsbWlucHJvdG89JWQiLCBzYmktPm1pbl9wcm90byk7CiAJc2VxX3ByaW50ZihtLCAiLG1heHByb3RvPSVkIiwgc2JpLT5tYXhfcHJvdG8pOwogCi0JaWYgKHNiaS0+dHlwZSAmIEFVVE9GU19UWVBFX09GRlNFVCkKKwlpZiAoYXV0b2ZzX3R5cGVfb2Zmc2V0KHNiaS0+dHlwZSkpCiAJCXNlcV9wcmludGYobSwgIixvZmZzZXQiKTsKLQllbHNlIGlmIChzYmktPnR5cGUgJiBBVVRPRlNfVFlQRV9ESVJFQ1QpCisJZWxzZSBpZiAoYXV0b2ZzX3R5cGVfZGlyZWN0KHNiaS0+dHlwZSkpCiAJCXNlcV9wcmludGYobSwgIixkaXJlY3QiKTsKIAllbHNlCiAJCXNlcV9wcmludGYobSwgIixpbmRpcmVjdCIpOwpAQCAtMjg0LDEzICsyODQsMTMgQEAKIAkJCSptYXhwcm90byA9IG9wdGlvbjsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9pbmRpcmVjdDoKLQkJCSp0eXBlID0gQVVUT0ZTX1RZUEVfSU5ESVJFQ1Q7CisJCQlzZXRfYXV0b2ZzX3R5cGVfaW5kaXJlY3QodHlwZSk7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfZGlyZWN0OgotCQkJKnR5cGUgPSBBVVRPRlNfVFlQRV9ESVJFQ1Q7CisJCQlzZXRfYXV0b2ZzX3R5cGVfZGlyZWN0KHR5cGUpOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X29mZnNldDoKLQkJCSp0eXBlID0gQVVUT0ZTX1RZUEVfT0ZGU0VUOworCQkJc2V0X2F1dG9mc190eXBlX29mZnNldCh0eXBlKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcmV0dXJuIDE7CkBAIC0zMzgsNyArMzM4LDcgQEAKIAlzYmktPnNiID0gczsKIAlzYmktPnZlcnNpb24gPSAwOwogCXNiaS0+c3ViX3ZlcnNpb24gPSAwOwotCXNiaS0+dHlwZSA9IEFVVE9GU19UWVBFX0lORElSRUNUOworCXNldF9hdXRvZnNfdHlwZV9pbmRpcmVjdCgmc2JpLT50eXBlKTsKIAlzYmktPm1pbl9wcm90byA9IDA7CiAJc2JpLT5tYXhfcHJvdG8gPSAwOwogCW11dGV4X2luaXQoJnNiaS0+d3FfbXV0ZXgpOwpAQCAtMzgwLDcgKzM4MCw3IEBACiAJfQogCiAJcm9vdF9pbm9kZS0+aV9mb3AgPSAmYXV0b2ZzNF9yb290X29wZXJhdGlvbnM7Ci0Jcm9vdF9pbm9kZS0+aV9vcCA9IHNiaS0+dHlwZSAmIEFVVE9GU19UWVBFX1RSSUdHRVIgPworCXJvb3RfaW5vZGUtPmlfb3AgPSBhdXRvZnNfdHlwZV90cmlnZ2VyKHNiaS0+dHlwZSkgPwogCQkJJmF1dG9mczRfZGlyZWN0X3Jvb3RfaW5vZGVfb3BlcmF0aW9ucyA6CiAJCQkmYXV0b2ZzNF9pbmRpcmVjdF9yb290X2lub2RlX29wZXJhdGlvbnM7CiAKQEAgLTQ1NSwxMSArNDU1LDcgQEAKIAlpZiAoc2ItPnNfcm9vdCkgewogCQlpbm9kZS0+aV91aWQgPSBzYi0+c19yb290LT5kX2lub2RlLT5pX3VpZDsKIAkJaW5vZGUtPmlfZ2lkID0gc2ItPnNfcm9vdC0+ZF9pbm9kZS0+aV9naWQ7Ci0JfSBlbHNlIHsKLQkJaW5vZGUtPmlfdWlkID0gMDsKLQkJaW5vZGUtPmlfZ2lkID0gMDsKIAl9Ci0JaW5vZGUtPmlfYmxvY2tzID0gMDsKIAlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAKIAlpZiAoU19JU0RJUihpbmYtPm1vZGUpKSB7CmRpZmYgLS1naXQgYS9mcy9hdXRvZnM0L3dhaXRxLmMgYi9mcy9hdXRvZnM0L3dhaXRxLmMKaW5kZXggZTAyY2M4YS4uZWViMjQ2OCAxMDA2NDQKLS0tIGEvZnMvYXV0b2ZzNC93YWl0cS5jCisrKyBiL2ZzL2F1dG9mczQvd2FpdHEuYwpAQCAtMzM3LDcgKzMzNyw3IEBACiAJCSAqIGlzIHZlcnkgc2ltaWxhciBmb3IgaW5kaXJlY3QgbW91bnRzIGV4Y2VwdCBvbmx5IGRlbnRyeXMKIAkJICogaW4gdGhlIHJvb3Qgb2YgdGhlIGF1dG9mcyBmaWxlIHN5c3RlbSBtYXkgYmUgbmVnYXRpdmUuCiAJCSAqLwotCQlpZiAoc2JpLT50eXBlICYgQVVUT0ZTX1RZUEVfVFJJR0dFUikKKwkJaWYgKGF1dG9mc190eXBlX3RyaWdnZXIoc2JpLT50eXBlKSkKIAkJCXJldHVybiAtRU5PRU5UOwogCQllbHNlIGlmICghSVNfUk9PVChkZW50cnktPmRfcGFyZW50KSkKIAkJCXJldHVybiAtRU5PRU5UOwpAQCAtMzQ4LDcgKzM0OCw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJLyogSWYgdGhpcyBpcyBhIGRpcmVjdCBtb3VudCByZXF1ZXN0IGNyZWF0ZSBhIGR1bW15IG5hbWUgKi8KLQlpZiAoSVNfUk9PVChkZW50cnkpICYmIHNiaS0+dHlwZSAmIEFVVE9GU19UWVBFX1RSSUdHRVIpCisJaWYgKElTX1JPT1QoZGVudHJ5KSAmJiBhdXRvZnNfdHlwZV90cmlnZ2VyKHNiaS0+dHlwZSkpCiAJCXFzdHIubGVuID0gc3ByaW50ZihuYW1lLCAiJXAiLCBkZW50cnkpOwogCWVsc2UgewogCQlxc3RyLmxlbiA9IGF1dG9mczRfZ2V0cGF0aChzYmksIGRlbnRyeSwgJm5hbWUpOwpAQCAtNDA2LDExICs0MDYsMTEgQEAKIAkJCQl0eXBlID0gYXV0b2ZzX3B0eXBlX2V4cGlyZV9tdWx0aTsKIAkJfSBlbHNlIHsKIAkJCWlmIChub3RpZnkgPT0gTkZZX01PVU5UKQotCQkJCXR5cGUgPSAoc2JpLT50eXBlICYgQVVUT0ZTX1RZUEVfVFJJR0dFUikgPworCQkJCXR5cGUgPSBhdXRvZnNfdHlwZV90cmlnZ2VyKHNiaS0+dHlwZSkgPwogCQkJCQlhdXRvZnNfcHR5cGVfbWlzc2luZ19kaXJlY3QgOgogCQkJCQkgYXV0b2ZzX3B0eXBlX21pc3NpbmdfaW5kaXJlY3Q7CiAJCQllbHNlCi0JCQkJdHlwZSA9IChzYmktPnR5cGUgJiBBVVRPRlNfVFlQRV9UUklHR0VSKSA/CisJCQkJdHlwZSA9IGF1dG9mc190eXBlX3RyaWdnZXIoc2JpLT50eXBlKSA/CiAJCQkJCWF1dG9mc19wdHlwZV9leHBpcmVfZGlyZWN0IDoKIAkJCQkJYXV0b2ZzX3B0eXBlX2V4cGlyZV9pbmRpcmVjdDsKIAkJfQpkaWZmIC0tZ2l0IGEvZnMvYmZzL2lub2RlLmMgYi9mcy9iZnMvaW5vZGUuYwppbmRleCAwZWQ1N2I1Li5jYzQwNjJkIDEwMDY0NAotLS0gYS9mcy9iZnMvaW5vZGUuYworKysgYi9mcy9iZnMvaW5vZGUuYwpAQCAtMjEzLDYgKzIxMyw5IEBACiB7CiAJc3RydWN0IGJmc19zYl9pbmZvICppbmZvID0gQkZTX1NCKHMpOwogCisJaWYgKCFpbmZvKQorCQlyZXR1cm47CisKIAlicmVsc2UoaW5mby0+c2lfc2JoKTsKIAltdXRleF9kZXN0cm95KCZpbmZvLT5iZnNfbG9jayk7CiAJa2ZyZWUoaW5mby0+c2lfaW1hcCk7CkBAIC0zMjcsNiArMzMwLDcgQEAKIAl1bnNpZ25lZCBpLCBpbWFwX2xlbjsKIAlzdHJ1Y3QgYmZzX3NiX2luZm8gKmluZm87CiAJbG9uZyByZXQgPSAtRUlOVkFMOworCXVuc2lnbmVkIGxvbmcgaV9zYmxvY2ssIGlfZWJsb2NrLCBpX2VvZmYsIHNfc2l6ZTsKIAogCWluZm8gPSBremFsbG9jKHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOwogCWlmICghaW5mbykKQEAgLTM1MCw2ICszNTQsMTIgQEAKIAogCXMtPnNfbWFnaWMgPSBCRlNfTUFHSUM7CiAJaW5mby0+c2lfc2JoID0gYmg7CisKKwlpZiAobGUzMl90b19jcHUoYmZzX3NiLT5zX3N0YXJ0KSA+IGxlMzJfdG9fY3B1KGJmc19zYi0+c19lbmQpKSB7CisJCXByaW50ZigiU3VwZXJibG9jayBpcyBjb3JydXB0ZWRcbiIpOworCQlnb3RvIG91dDsKKwl9CisKIAlpbmZvLT5zaV9sYXN0aSA9IChsZTMyX3RvX2NwdShiZnNfc2ItPnNfc3RhcnQpIC0gQkZTX0JTSVpFKSAvCiAJCQkJCXNpemVvZihzdHJ1Y3QgYmZzX2lub2RlKQogCQkJCQkrIEJGU19ST09UX0lOTyAtIDE7CkBAIC0zODAsNiArMzkwLDE4IEBACiAJCQktIGxlMzJfdG9fY3B1KGJmc19zYi0+c19zdGFydCkpID4+IEJGU19CU0laRV9CSVRTOwogCWluZm8tPnNpX2ZyZWVpID0gMDsKIAlpbmZvLT5zaV9sZl9lYmxrID0gMDsKKworCS8qIGNhbiB3ZSByZWFkIHRoZSBsYXN0IGJsb2NrPyAqLworCWJoID0gc2JfYnJlYWQocywgaW5mby0+c2lfYmxvY2tzIC0gMSk7CisJaWYgKCFiaCkgeworCQlwcmludGYoIkxhc3QgYmxvY2sgbm90IGF2YWlsYWJsZTogJWx1XG4iLCBpbmZvLT5zaV9ibG9ja3MgLSAxKTsKKwkJaXB1dChpbm9kZSk7CisJCXJldCA9IC1FSU87CisJCWtmcmVlKGluZm8tPnNpX2ltYXApOworCQlnb3RvIG91dDsKKwl9CisJYnJlbHNlKGJoKTsKKwogCWJoID0gTlVMTDsKIAlmb3IgKGkgPSBCRlNfUk9PVF9JTk87IGkgPD0gaW5mby0+c2lfbGFzdGk7IGkrKykgewogCQlzdHJ1Y3QgYmZzX2lub2RlICpkaTsKQEAgLTM5Nyw2ICs0MTksMjkgQEAKIAogCQlkaSA9IChzdHJ1Y3QgYmZzX2lub2RlICopYmgtPmJfZGF0YSArIG9mZjsKIAorCQkvKiB0ZXN0IGlmIGZpbGVzeXN0ZW0gaXMgbm90IGNvcnJ1cHRlZCAqLworCisJCWlfZW9mZiA9IGxlMzJfdG9fY3B1KGRpLT5pX2VvZmZzZXQpOworCQlpX3NibG9jayA9IGxlMzJfdG9fY3B1KGRpLT5pX3NibG9jayk7CisJCWlfZWJsb2NrID0gbGUzMl90b19jcHUoZGktPmlfZWJsb2NrKTsKKwkJc19zaXplID0gbGUzMl90b19jcHUoYmZzX3NiLT5zX2VuZCk7CisKKwkJaWYgKGlfc2Jsb2NrID4gaW5mby0+c2lfYmxvY2tzIHx8CisJCQlpX2VibG9jayA+IGluZm8tPnNpX2Jsb2NrcyB8fAorCQkJaV9zYmxvY2sgPiBpX2VibG9jayB8fAorCQkJaV9lb2ZmID4gc19zaXplIHx8CisJCQlpX3NibG9jayAqIEJGU19CU0laRSA+IGlfZW9mZikgeworCisJCQlwcmludGYoIklub2RlIDB4JTA4eCBjb3JydXB0ZWRcbiIsIGkpOworCisJCQlicmVsc2UoYmgpOworCQkJcy0+c19yb290ID0gTlVMTDsKKwkJCWtmcmVlKGluZm8tPnNpX2ltYXApOworCQkJa2ZyZWUoaW5mbyk7CisJCQlzLT5zX2ZzX2luZm8gPSBOVUxMOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwogCQlpZiAoIWRpLT5pX2lubykgewogCQkJaW5mby0+c2lfZnJlZWkrKzsKIAkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvZnMvYmluZm10X2VsZi5jIGIvZnMvYmluZm10X2VsZi5jCmluZGV4IGM0MWZhMmEuLmUzZmYyYjkgMTAwNjQ0Ci0tLSBhL2ZzL2JpbmZtdF9lbGYuYworKysgYi9mcy9iaW5mbXRfZWxmLmMKQEAgLTE1Miw4ICsxNTIsMTAgQEAKIAllbGZfYWRkcl90IF9fdXNlciAqc3A7CiAJZWxmX2FkZHJfdCBfX3VzZXIgKnVfcGxhdGZvcm07CiAJZWxmX2FkZHJfdCBfX3VzZXIgKnVfYmFzZV9wbGF0Zm9ybTsKKwllbGZfYWRkcl90IF9fdXNlciAqdV9yYW5kX2J5dGVzOwogCWNvbnN0IGNoYXIgKmtfcGxhdGZvcm0gPSBFTEZfUExBVEZPUk07CiAJY29uc3QgY2hhciAqa19iYXNlX3BsYXRmb3JtID0gRUxGX0JBU0VfUExBVEZPUk07CisJdW5zaWduZWQgY2hhciBrX3JhbmRfYnl0ZXNbMTZdOwogCWludCBpdGVtczsKIAllbGZfYWRkcl90ICplbGZfaW5mbzsKIAlpbnQgZWlfaW5kZXggPSAwOwpAQCAtMTk2LDYgKzE5OCwxNSBAQAogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCisJLyoKKwkgKiBHZW5lcmF0ZSAxNiByYW5kb20gYnl0ZXMgZm9yIHVzZXJzcGFjZSBQUk5HIHNlZWRpbmcuCisJICovCisJZ2V0X3JhbmRvbV9ieXRlcyhrX3JhbmRfYnl0ZXMsIHNpemVvZihrX3JhbmRfYnl0ZXMpKTsKKwl1X3JhbmRfYnl0ZXMgPSAoZWxmX2FkZHJfdCBfX3VzZXIgKikKKwkJICAgICAgIFNUQUNLX0FMTE9DKHAsIHNpemVvZihrX3JhbmRfYnl0ZXMpKTsKKwlpZiAoX19jb3B5X3RvX3VzZXIodV9yYW5kX2J5dGVzLCBrX3JhbmRfYnl0ZXMsIHNpemVvZihrX3JhbmRfYnl0ZXMpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKIAkvKiBDcmVhdGUgdGhlIEVMRiBpbnRlcnByZXRlciBpbmZvICovCiAJZWxmX2luZm8gPSAoZWxmX2FkZHJfdCAqKWN1cnJlbnQtPm1tLT5zYXZlZF9hdXh2OwogCS8qIHVwZGF0ZSBBVF9WRUNUT1JfU0laRV9CQVNFIGlmIHRoZSBudW1iZXIgb2YgTkVXX0FVWF9FTlQoKSBjaGFuZ2VzICovCkBAIC0yMjgsNiArMjM5LDcgQEAKIAlORVdfQVVYX0VOVChBVF9HSUQsIGNyZWQtPmdpZCk7CiAJTkVXX0FVWF9FTlQoQVRfRUdJRCwgY3JlZC0+ZWdpZCk7CiAgCU5FV19BVVhfRU5UKEFUX1NFQ1VSRSwgc2VjdXJpdHlfYnBybV9zZWN1cmVleGVjKGJwcm0pKTsKKwlORVdfQVVYX0VOVChBVF9SQU5ET00sIChlbGZfYWRkcl90KSh1bnNpZ25lZCBsb25nKXVfcmFuZF9ieXRlcyk7CiAJTkVXX0FVWF9FTlQoQVRfRVhFQ0ZOLCBicHJtLT5leGVjKTsKIAlpZiAoa19wbGF0Zm9ybSkgewogCQlORVdfQVVYX0VOVChBVF9QTEFURk9STSwKZGlmZiAtLWdpdCBhL2ZzL2JpbmZtdF9taXNjLmMgYi9mcy9iaW5mbXRfbWlzYy5jCmluZGV4IGYyNzQ0YWIuLmM0ZTgzNTMgMTAwNjQ0Ci0tLSBhL2ZzL2JpbmZtdF9taXNjLmMKKysrIGIvZnMvYmluZm10X21pc2MuYwpAQCAtNDk2LDkgKzQ5Niw2IEBACiAKIAlpZiAoaW5vZGUpIHsKIAkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7Ci0JCWlub2RlLT5pX3VpZCA9IDA7Ci0JCWlub2RlLT5pX2dpZCA9IDA7Ci0JCWlub2RlLT5pX2Jsb2NrcyA9IDA7CiAJCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9CiAJCQljdXJyZW50X2ZzX3RpbWUoaW5vZGUtPmlfc2IpOwogCX0KQEAgLTY1Miw3ICs2NDksNyBAQAogc3RhdGljIHNzaXplX3QKIGJtX3N0YXR1c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpCiB7Ci0JY2hhciAqcyA9IGVuYWJsZWQgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiOworCWNoYXIgKnMgPSBlbmFibGVkID8gImVuYWJsZWRcbiIgOiAiZGlzYWJsZWRcbiI7CiAKIAlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBuYnl0ZXMsIHBwb3MsIHMsIHN0cmxlbihzKSk7CiB9CmRpZmYgLS1naXQgYS9mcy9iaW8uYyBiL2ZzL2Jpby5jCmluZGV4IDcxMWNlZTEuLjA2MjI5OWEgMTAwNjQ0Ci0tLSBhL2ZzL2Jpby5jCisrKyBiL2ZzL2Jpby5jCkBAIC03ODgsNiArNzg4LDcgQEAKIAlpbnQgaSwgcmV0OwogCWludCBucl9wYWdlcyA9IDA7CiAJdW5zaWduZWQgaW50IGxlbiA9IDA7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IG1hcF9kYXRhID8gbWFwX2RhdGEtPm9mZnNldCAmIH5QQUdFX01BU0sgOiAwOwogCiAJZm9yIChpID0gMDsgaSA8IGlvdl9jb3VudDsgaSsrKSB7CiAJCXVuc2lnbmVkIGxvbmcgdWFkZHI7CkBAIC04MTQsMzUgKzgxNSw0MiBAQAogCWJpby0+YmlfcncgfD0gKCF3cml0ZV90b192bSA8PCBCSU9fUlcpOwogCiAJcmV0ID0gMDsKLQlpID0gMDsKLQl3aGlsZSAobGVuKSB7Ci0JCXVuc2lnbmVkIGludCBieXRlczsKIAotCQlpZiAobWFwX2RhdGEpCi0JCQlieXRlcyA9IDFVIDw8IChQQUdFX1NISUZUICsgbWFwX2RhdGEtPnBhZ2Vfb3JkZXIpOwotCQllbHNlCi0JCQlieXRlcyA9IFBBR0VfU0laRTsKKwlpZiAobWFwX2RhdGEpIHsKKwkJbnJfcGFnZXMgPSAxIDw8IG1hcF9kYXRhLT5wYWdlX29yZGVyOworCQlpID0gbWFwX2RhdGEtPm9mZnNldCAvIFBBR0VfU0laRTsKKwl9CisJd2hpbGUgKGxlbikgeworCQl1bnNpZ25lZCBpbnQgYnl0ZXMgPSBQQUdFX1NJWkU7CisKKwkJYnl0ZXMgLT0gb2Zmc2V0OwogCiAJCWlmIChieXRlcyA+IGxlbikKIAkJCWJ5dGVzID0gbGVuOwogCiAJCWlmIChtYXBfZGF0YSkgewotCQkJaWYgKGkgPT0gbWFwX2RhdGEtPm5yX2VudHJpZXMpIHsKKwkJCWlmIChpID09IG1hcF9kYXRhLT5ucl9lbnRyaWVzICogbnJfcGFnZXMpIHsKIAkJCQlyZXQgPSAtRU5PTUVNOwogCQkJCWJyZWFrOwogCQkJfQotCQkJcGFnZSA9IG1hcF9kYXRhLT5wYWdlc1tpKytdOwotCQl9IGVsc2UKKworCQkJcGFnZSA9IG1hcF9kYXRhLT5wYWdlc1tpIC8gbnJfcGFnZXNdOworCQkJcGFnZSArPSAoaSAlIG5yX3BhZ2VzKTsKKworCQkJaSsrOworCQl9IGVsc2UgewogCQkJcGFnZSA9IGFsbG9jX3BhZ2UocS0+Ym91bmNlX2dmcCB8IGdmcF9tYXNrKTsKLQkJaWYgKCFwYWdlKSB7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJYnJlYWs7CisJCQlpZiAoIXBhZ2UpIHsKKwkJCQlyZXQgPSAtRU5PTUVNOworCQkJCWJyZWFrOworCQkJfQogCQl9CiAKLQkJaWYgKGJpb19hZGRfcGNfcGFnZShxLCBiaW8sIHBhZ2UsIGJ5dGVzLCAwKSA8IGJ5dGVzKQorCQlpZiAoYmlvX2FkZF9wY19wYWdlKHEsIGJpbywgcGFnZSwgYnl0ZXMsIG9mZnNldCkgPCBieXRlcykKIAkJCWJyZWFrOwogCiAJCWxlbiAtPSBieXRlczsKKwkJb2Zmc2V0ID0gMDsKIAl9CiAKIAlpZiAocmV0KQpAQCAtODUxLDcgKzg1OSw3IEBACiAJLyoKIAkgKiBzdWNjZXNzCiAJICovCi0JaWYgKCF3cml0ZV90b192bSkgeworCWlmICghd3JpdGVfdG9fdm0gJiYgKCFtYXBfZGF0YSB8fCAhbWFwX2RhdGEtPm51bGxfbWFwcGVkKSkgewogCQlyZXQgPSBfX2Jpb19jb3B5X2lvdihiaW8sIGJpby0+YmlfaW9fdmVjLCBpb3YsIGlvdl9jb3VudCwgMCwgMCk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIGNsZWFudXA7CmRpZmYgLS1naXQgYS9mcy9ibG9ja19kZXYuYyBiL2ZzL2Jsb2NrX2Rldi5jCmluZGV4IDM0OWEyNmMuLmFjNzAzMWYgMTAwNjQ0Ci0tLSBhL2ZzL2Jsb2NrX2Rldi5jCisrKyBiL2ZzL2Jsb2NrX2Rldi5jCkBAIC0xMDA1LDYgKzEwMDUsNyBAQAogCX0KIAogCWxvY2tfa2VybmVsKCk7CisgcmVzdGFydDoKIAogCXJldCA9IC1FTlhJTzsKIAlkaXNrID0gZ2V0X2dlbmRpc2soYmRldi0+YmRfZGV2LCAmcGFydG5vKTsKQEAgLTEwMjUsNiArMTAyNiwxOSBAQAogCiAJCQlpZiAoZGlzay0+Zm9wcy0+b3BlbikgewogCQkJCXJldCA9IGRpc2stPmZvcHMtPm9wZW4oYmRldiwgbW9kZSk7CisJCQkJaWYgKHJldCA9PSAtRVJFU1RBUlRTWVMpIHsKKwkJCQkJLyogTG9zdCBhIHJhY2Ugd2l0aCAnZGlzaycgYmVpbmcKKwkJCQkJICogZGVsZXRlZCwgdHJ5IGFnYWluLgorCQkJCQkgKiBTZWUgbWQuYworCQkJCQkgKi8KKwkJCQkJZGlza19wdXRfcGFydChiZGV2LT5iZF9wYXJ0KTsKKwkJCQkJYmRldi0+YmRfcGFydCA9IE5VTEw7CisJCQkJCW1vZHVsZV9wdXQoZGlzay0+Zm9wcy0+b3duZXIpOworCQkJCQlwdXRfZGlzayhkaXNrKTsKKwkJCQkJYmRldi0+YmRfZGlzayA9IE5VTEw7CisJCQkJCW11dGV4X3VubG9jaygmYmRldi0+YmRfbXV0ZXgpOworCQkJCQlnb3RvIHJlc3RhcnQ7CisJCQkJfQogCQkJCWlmIChyZXQpCiAJCQkJCWdvdG8gb3V0X2NsZWFyOwogCQkJfQpAQCAtMTIyMCw2ICsxMjM0LDIwIEBACiAJcmV0dXJuIGJsa2Rldl9pb2N0bChiZGV2LCBtb2RlLCBjbWQsIGFyZyk7CiB9CiAKKy8qCisgKiBUcnkgdG8gcmVsZWFzZSBhIHBhZ2UgYXNzb2NpYXRlZCB3aXRoIGJsb2NrIGRldmljZSB3aGVuIHRoZSBzeXN0ZW0KKyAqIGlzIHVuZGVyIG1lbW9yeSBwcmVzc3VyZS4KKyAqLworc3RhdGljIGludCBibGtkZXZfcmVsZWFzZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGdmcF90IHdhaXQpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzdXBlciA9IEJERVZfSShwYWdlLT5tYXBwaW5nLT5ob3N0KS0+YmRldi5iZF9zdXBlcjsKKworCWlmIChzdXBlciAmJiBzdXBlci0+c19vcC0+YmRldl90cnlfdG9fZnJlZV9wYWdlKQorCQlyZXR1cm4gc3VwZXItPnNfb3AtPmJkZXZfdHJ5X3RvX2ZyZWVfcGFnZShzdXBlciwgcGFnZSwgd2FpdCk7CisKKwlyZXR1cm4gdHJ5X3RvX2ZyZWVfYnVmZmVycyhwYWdlKTsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgZGVmX2Jsa19hb3BzID0gewogCS5yZWFkcGFnZQk9IGJsa2Rldl9yZWFkcGFnZSwKIAkud3JpdGVwYWdlCT0gYmxrZGV2X3dyaXRlcGFnZSwKQEAgLTEyMjcsNiArMTI1NSw3IEBACiAJLndyaXRlX2JlZ2luCT0gYmxrZGV2X3dyaXRlX2JlZ2luLAogCS53cml0ZV9lbmQJPSBibGtkZXZfd3JpdGVfZW5kLAogCS53cml0ZXBhZ2VzCT0gZ2VuZXJpY193cml0ZXBhZ2VzLAorCS5yZWxlYXNlcGFnZQk9IGJsa2Rldl9yZWxlYXNlcGFnZSwKIAkuZGlyZWN0X0lPCT0gYmxrZGV2X2RpcmVjdF9JTywKIH07CiAKQEAgLTEyNjIsNyArMTI5MSw3IEBACiAKIC8qKgogICogbG9va3VwX2JkZXYgIC0gbG9va3VwIGEgc3RydWN0IGJsb2NrX2RldmljZSBieSBuYW1lCi0gKiBAcGF0aDoJc3BlY2lhbCBmaWxlIHJlcHJlc2VudGluZyB0aGUgYmxvY2sgZGV2aWNlCisgKiBAcGF0aG5hbWU6CXNwZWNpYWwgZmlsZSByZXByZXNlbnRpbmcgdGhlIGJsb2NrIGRldmljZQogICoKICAqIEdldCBhIHJlZmVyZW5jZSB0byB0aGUgYmxvY2tkZXZpY2UgYXQgQHBhdGhuYW1lIGluIHRoZSBjdXJyZW50CiAgKiBuYW1lc3BhY2UgaWYgcG9zc2libGUgYW5kIHJldHVybiBpdC4gIFJldHVybiBFUlJfUFRSKGVycm9yKQpkaWZmIC0tZ2l0IGEvZnMvYnVmZmVyLmMgYi9mcy9idWZmZXIuYwppbmRleCBhMTNmMDliLi5jMjZkYTc4IDEwMDY0NAotLS0gYS9mcy9idWZmZXIuYworKysgYi9mcy9idWZmZXIuYwpAQCAtMjAyMiw3ICsyMDIyLDYgQEAKIAkJCWlmIChwb3MgKyBsZW4gPiBpbm9kZS0+aV9zaXplKQogCQkJCXZtdHJ1bmNhdGUoaW5vZGUsIGlub2RlLT5pX3NpemUpOwogCQl9Ci0JCWdvdG8gb3V0OwogCX0KIAogb3V0OgpkaWZmIC0tZ2l0IGEvZnMvY2hhcl9kZXYuYyBiL2ZzL2NoYXJfZGV2LmMKaW5kZXggNzAwNjk3YS4uMzhmNzEyMiAxMDA2NDQKLS0tIGEvZnMvY2hhcl9kZXYuYworKysgYi9mcy9jaGFyX2Rldi5jCkBAIC0xMjAsNyArMTIwLDcgQEAKIAljZC0+bWFqb3IgPSBtYWpvcjsKIAljZC0+YmFzZW1pbm9yID0gYmFzZW1pbm9yOwogCWNkLT5taW5vcmN0ID0gbWlub3JjdDsKLQlzdHJuY3B5KGNkLT5uYW1lLG5hbWUsIDY0KTsKKwlzdHJsY3B5KGNkLT5uYW1lLCBuYW1lLCBzaXplb2YoY2QtPm5hbWUpKTsKIAogCWkgPSBtYWpvcl90b19pbmRleChtYWpvcik7CiAKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvaW5vZGUuYyBiL2ZzL2NpZnMvaW5vZGUuYwppbmRleCBmMjQ3ZGE5Li41YWI5ODk2IDEwMDY0NAotLS0gYS9mcy9jaWZzL2lub2RlLmMKKysrIGIvZnMvY2lmcy9pbm9kZS5jCkBAIC0xNjQxLDcgKzE2NDEsNyBAQAogCWlfc2l6ZV93cml0ZShpbm9kZSwgb2Zmc2V0KTsKIAlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CiBvdXRfdHJ1bmNhdGU6Ci0JaWYgKGlub2RlLT5pX29wICYmIGlub2RlLT5pX29wLT50cnVuY2F0ZSkKKwlpZiAoaW5vZGUtPmlfb3AtPnRydW5jYXRlKQogCQlpbm9kZS0+aV9vcC0+dHJ1bmNhdGUoaW5vZGUpOwogCXJldHVybiAwOwogb3V0X3NpZzoKZGlmZiAtLWdpdCBhL2ZzL2NvZGEvZmlsZS5jIGIvZnMvY29kYS9maWxlLmMKaW5kZXggNDY2MzAzZC4uNmEzNDdmYiAxMDA2NDQKLS0tIGEvZnMvY29kYS9maWxlLmMKKysrIGIvZnMvY29kYS9maWxlLmMKQEAgLTIwMSw4ICsyMDEsNyBAQAogaW50IGNvZGFfZnN5bmMoc3RydWN0IGZpbGUgKmNvZGFfZmlsZSwgc3RydWN0IGRlbnRyeSAqY29kYV9kZW50cnksIGludCBkYXRhc3luYykKIHsKIAlzdHJ1Y3QgZmlsZSAqaG9zdF9maWxlOwotCXN0cnVjdCBkZW50cnkgKmhvc3RfZGVudHJ5OwotCXN0cnVjdCBpbm9kZSAqaG9zdF9pbm9kZSwgKmNvZGFfaW5vZGUgPSBjb2RhX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmNvZGFfaW5vZGUgPSBjb2RhX2RlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgY29kYV9maWxlX2luZm8gKmNmaTsKIAlpbnQgZXJyID0gMDsKIApAQCAtMjE0LDE0ICsyMTMsNyBAQAogCUJVR19PTighY2ZpIHx8IGNmaS0+Y2ZpX21hZ2ljICE9IENPREFfTUFHSUMpOwogCWhvc3RfZmlsZSA9IGNmaS0+Y2ZpX2NvbnRhaW5lcjsKIAotCWlmIChob3N0X2ZpbGUtPmZfb3AgJiYgaG9zdF9maWxlLT5mX29wLT5mc3luYykgewotCQlob3N0X2RlbnRyeSA9IGhvc3RfZmlsZS0+Zl9wYXRoLmRlbnRyeTsKLQkJaG9zdF9pbm9kZSA9IGhvc3RfZGVudHJ5LT5kX2lub2RlOwotCQltdXRleF9sb2NrKCZob3N0X2lub2RlLT5pX211dGV4KTsKLQkJZXJyID0gaG9zdF9maWxlLT5mX29wLT5mc3luYyhob3N0X2ZpbGUsIGhvc3RfZGVudHJ5LCBkYXRhc3luYyk7Ci0JCW11dGV4X3VubG9jaygmaG9zdF9pbm9kZS0+aV9tdXRleCk7Ci0JfQotCisJZXJyID0gdmZzX2ZzeW5jKGhvc3RfZmlsZSwgaG9zdF9maWxlLT5mX3BhdGguZGVudHJ5LCBkYXRhc3luYyk7CiAJaWYgKCAhZXJyICYmICFkYXRhc3luYyApIHsKIAkJbG9ja19rZXJuZWwoKTsKIAkJZXJyID0gdmVudXNfZnN5bmMoY29kYV9pbm9kZS0+aV9zYiwgY29kYV9pMmYoY29kYV9pbm9kZSkpOwpkaWZmIC0tZ2l0IGEvZnMvY29kYS9zeXNjdGwuYyBiL2ZzL2NvZGEvc3lzY3RsLmMKaW5kZXggODFiNzc3MS4uNDNjOTZjZSAxMDA2NDQKLS0tIGEvZnMvY29kYS9zeXNjdGwuYworKysgYi9mcy9jb2RhL3N5c2N0bC5jCkBAIC0xMSw3ICsxMSw5IEBACiAKICNpbmNsdWRlICJjb2RhX2ludC5oIgogCisjaWZkZWYgQ09ORklHX1NZU0NUTAogc3RhdGljIHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpmc190YWJsZV9oZWFkZXI7CisjZW5kaWYKIAogc3RhdGljIGN0bF90YWJsZSBjb2RhX3RhYmxlW10gPSB7CiAJewpAQCAtNDEsNiArNDMsNyBAQAogCXt9CiB9OwogCisjaWZkZWYgQ09ORklHX1NZU0NUTAogc3RhdGljIGN0bF90YWJsZSBmc190YWJsZVtdID0gewogCXsKIAkJLmN0bF9uYW1lCT0gQ1RMX1VOTlVNQkVSRUQsCkBAIC01MCw3ICs1Myw3IEBACiAJfSwKIAl7fQogfTsKLQorI2VuZGlmCiAKIHZvaWQgY29kYV9zeXNjdGxfaW5pdCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvZnMvY29tcGF0LmMgYi9mcy9jb21wYXQuYwppbmRleCBkMWVjZTc5Li4zMGYyZmFhIDEwMDY0NAotLS0gYS9mcy9jb21wYXQuYworKysgYi9mcy9jb21wYXQuYwpAQCAtMTE4Nyw2ICsxMTg3LDkgQEAKIAlyZXQgPSBjb21wYXRfZG9fcmVhZHZfd3JpdGV2KFJFQUQsIGZpbGUsIHZlYywgdmxlbiwgJmZpbGUtPmZfcG9zKTsKIAogb3V0OgorCWlmIChyZXQgPiAwKQorCQlhZGRfcmNoYXIoY3VycmVudCwgcmV0KTsKKwlpbmNfc3lzY3IoY3VycmVudCk7CiAJZnB1dChmaWxlKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTIxMCw2ICsxMjEzLDkgQEAKIAlyZXQgPSBjb21wYXRfZG9fcmVhZHZfd3JpdGV2KFdSSVRFLCBmaWxlLCB2ZWMsIHZsZW4sICZmaWxlLT5mX3Bvcyk7CiAKIG91dDoKKwlpZiAocmV0ID4gMCkKKwkJYWRkX3djaGFyKGN1cnJlbnQsIHJldCk7CisJaW5jX3N5c2N3KGN1cnJlbnQpOwogCWZwdXQoZmlsZSk7CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2ZzL2NvbmZpZ2ZzL2lub2RlLmMgYi9mcy9jb25maWdmcy9pbm9kZS5jCmluZGV4IDQ4MDNjY2MuLjVkMzQ5ZDMgMTAwNjQ0Ci0tLSBhL2ZzL2NvbmZpZ2ZzL2lub2RlLmMKKysrIGIvZnMvY29uZmlnZnMvaW5vZGUuYwpAQCAtMTE3LDggKzExNyw2IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2RlZmF1bHRfaW5vZGVfYXR0cihzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgbW9kZV90IG1vZGUpCiB7CiAJaW5vZGUtPmlfbW9kZSA9IG1vZGU7Ci0JaW5vZGUtPmlfdWlkID0gMDsKLQlpbm9kZS0+aV9naWQgPSAwOwogCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKIH0KIApAQCAtMTM2LDcgKzEzNCw2IEBACiB7CiAJc3RydWN0IGlub2RlICogaW5vZGUgPSBuZXdfaW5vZGUoY29uZmlnZnNfc2IpOwogCWlmIChpbm9kZSkgewotCQlpbm9kZS0+aV9ibG9ja3MgPSAwOwogCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZjb25maWdmc19hb3BzOwogCQlpbm9kZS0+aV9tYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvID0gJmNvbmZpZ2ZzX2JhY2tpbmdfZGV2X2luZm87CiAJCWlub2RlLT5pX29wID0gJmNvbmZpZ2ZzX2lub2RlX29wZXJhdGlvbnM7CmRpZmYgLS1naXQgYS9mcy9jcmFtZnMvaW5vZGUuYyBiL2ZzL2NyYW1mcy9pbm9kZS5jCmluZGV4IGY0MDQyM2UuLmEwNzMzOGQgMTAwNjQ0Ci0tLSBhL2ZzL2NyYW1mcy9pbm9kZS5jCisrKyBiL2ZzL2NyYW1mcy9pbm9kZS5jCkBAIC04Myw4ICs4Myw2IEBACiAJCQlpbm9kZS0+aV9vcCA9ICZwYWdlX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKIAkJCWlub2RlLT5pX2RhdGEuYV9vcHMgPSAmY3JhbWZzX2FvcHM7CiAJCX0gZWxzZSB7Ci0JCQlpbm9kZS0+aV9zaXplID0gMDsKLQkJCWlub2RlLT5pX2Jsb2NrcyA9IDA7CiAJCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsCiAJCQkJb2xkX2RlY29kZV9kZXYoY3JhbWZzX2lub2RlLT5zaXplKSk7CiAJCX0KZGlmZiAtLWdpdCBhL2ZzL2RjYWNoZS5jIGIvZnMvZGNhY2hlLmMKaW5kZXggZTg4YzIzYi4uNDU0N2Y2NiAxMDA2NDQKLS0tIGEvZnMvZGNhY2hlLmMKKysrIGIvZnMvZGNhY2hlLmMKQEAgLTE1NjcsMTAgKzE1NjcsNiBAQAogCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CiB9CiAKLSNkZWZpbmUgZG9fc3dpdGNoKHgseSkgZG8geyBcCi0JX190eXBlb2ZfXyAoeCkgX190bXAgPSB4OyBcCi0JeCA9IHk7IHkgPSBfX3RtcDsgfSB3aGlsZSAoMCkKLQogLyoKICAqIFdoZW4gc3dpdGNoaW5nIG5hbWVzLCB0aGUgYWN0dWFsIHN0cmluZyBkb2Vzbid0IHN0cmljdGx5IGhhdmUgdG8KICAqIGJlIHByZXNlcnZlZCBpbiB0aGUgdGFyZ2V0IC0gYmVjYXVzZSB3ZSdyZSBkcm9wcGluZyB0aGUgdGFyZ2V0CkBAIC0xNTg5LDcgKzE1ODUsNyBAQAogCQkJLyoKIAkJCSAqIEJvdGggZXh0ZXJuYWw6IHN3YXAgdGhlIHBvaW50ZXJzCiAJCQkgKi8KLQkJCWRvX3N3aXRjaCh0YXJnZXQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKwkJCXN3YXAodGFyZ2V0LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSk7CiAJCX0gZWxzZSB7CiAJCQkvKgogCQkJICogZGVudHJ5OmludGVybmFsLCB0YXJnZXQ6ZXh0ZXJuYWwuICBTdGVhbCB0YXJnZXQncwpAQCAtMTYyMCw3ICsxNjE2LDcgQEAKIAkJCXJldHVybjsKIAkJfQogCX0KLQlkb19zd2l0Y2goZGVudHJ5LT5kX25hbWUubGVuLCB0YXJnZXQtPmRfbmFtZS5sZW4pOworCXN3YXAoZGVudHJ5LT5kX25hbWUubGVuLCB0YXJnZXQtPmRfbmFtZS5sZW4pOwogfQogCiAvKgpAQCAtMTY4MCw3ICsxNjc2LDcgQEAKIAogCS8qIFN3aXRjaCB0aGUgbmFtZXMuLiAqLwogCXN3aXRjaF9uYW1lcyhkZW50cnksIHRhcmdldCk7Ci0JZG9fc3dpdGNoKGRlbnRyeS0+ZF9uYW1lLmhhc2gsIHRhcmdldC0+ZF9uYW1lLmhhc2gpOworCXN3YXAoZGVudHJ5LT5kX25hbWUuaGFzaCwgdGFyZ2V0LT5kX25hbWUuaGFzaCk7CiAKIAkvKiAuLi4gYW5kIHN3aXRjaCB0aGUgcGFyZW50cyAqLwogCWlmIChJU19ST09UKGRlbnRyeSkpIHsKQEAgLTE2ODgsNyArMTY4NCw3IEBACiAJCXRhcmdldC0+ZF9wYXJlbnQgPSB0YXJnZXQ7CiAJCUlOSVRfTElTVF9IRUFEKCZ0YXJnZXQtPmRfdS5kX2NoaWxkKTsKIAl9IGVsc2UgewotCQlkb19zd2l0Y2goZGVudHJ5LT5kX3BhcmVudCwgdGFyZ2V0LT5kX3BhcmVudCk7CisJCXN3YXAoZGVudHJ5LT5kX3BhcmVudCwgdGFyZ2V0LT5kX3BhcmVudCk7CiAKIAkJLyogQW5kIGFkZCB0aGVtIGJhY2sgdG8gdGhlIChuZXcpIHBhcmVudCBsaXN0cyAqLwogCQlsaXN0X2FkZCgmdGFyZ2V0LT5kX3UuZF9jaGlsZCwgJnRhcmdldC0+ZF9wYXJlbnQtPmRfc3ViZGlycyk7CkBAIC0xNzg5LDcgKzE3ODUsNyBAQAogCXN0cnVjdCBkZW50cnkgKmRwYXJlbnQsICphcGFyZW50OwogCiAJc3dpdGNoX25hbWVzKGRlbnRyeSwgYW5vbik7Ci0JZG9fc3dpdGNoKGRlbnRyeS0+ZF9uYW1lLmhhc2gsIGFub24tPmRfbmFtZS5oYXNoKTsKKwlzd2FwKGRlbnRyeS0+ZF9uYW1lLmhhc2gsIGFub24tPmRfbmFtZS5oYXNoKTsKIAogCWRwYXJlbnQgPSBkZW50cnktPmRfcGFyZW50OwogCWFwYXJlbnQgPSBhbm9uLT5kX3BhcmVudDsKZGlmZiAtLWdpdCBhL2ZzL2RlYnVnZnMvZmlsZS5jIGIvZnMvZGVidWdmcy9maWxlLmMKaW5kZXggMTU5YTVlZi4uMzNhOTAxMiAxMDA2NDQKLS0tIGEvZnMvZGVidWdmcy9maWxlLmMKKysrIGIvZnMvZGVidWdmcy9maWxlLmMKQEAgLTI5NCw2ICsyOTQsMzggQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGRlYnVnZnNfY3JlYXRlX3gzMik7CiAKKworc3RhdGljIGludCBkZWJ1Z2ZzX3NpemVfdF9zZXQodm9pZCAqZGF0YSwgdTY0IHZhbCkKK3sKKwkqKHNpemVfdCAqKWRhdGEgPSB2YWw7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW50IGRlYnVnZnNfc2l6ZV90X2dldCh2b2lkICpkYXRhLCB1NjQgKnZhbCkKK3sKKwkqdmFsID0gKihzaXplX3QgKilkYXRhOworCXJldHVybiAwOworfQorREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUoZm9wc19zaXplX3QsIGRlYnVnZnNfc2l6ZV90X2dldCwgZGVidWdmc19zaXplX3Rfc2V0LAorCQkJIiVsbHVcbiIpOwkvKiAlbGx1IGFuZCAlenUgYXJlIG1vcmUgb3IgbGVzcyB0aGUgc2FtZSAqLworCisvKioKKyAqIGRlYnVnZnNfY3JlYXRlX3NpemVfdCAtIGNyZWF0ZSBhIGRlYnVnZnMgZmlsZSB0aGF0IGlzIHVzZWQgdG8gcmVhZCBhbmQgd3JpdGUgYW4gc2l6ZV90IHZhbHVlCisgKiBAbmFtZTogYSBwb2ludGVyIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gY3JlYXRlLgorICogQG1vZGU6IHRoZSBwZXJtaXNzaW9uIHRoYXQgdGhlIGZpbGUgc2hvdWxkIGhhdmUKKyAqIEBwYXJlbnQ6IGEgcG9pbnRlciB0byB0aGUgcGFyZW50IGRlbnRyeSBmb3IgdGhpcyBmaWxlLiAgVGhpcyBzaG91bGQgYmUgYQorICogICAgICAgICAgZGlyZWN0b3J5IGRlbnRyeSBpZiBzZXQuICBJZiB0aGlzIHBhcmFtZXRlciBpcyAlTlVMTCwgdGhlbiB0aGUKKyAqICAgICAgICAgIGZpbGUgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSByb290IG9mIHRoZSBkZWJ1Z2ZzIGZpbGVzeXN0ZW0uCisgKiBAdmFsdWU6IGEgcG9pbnRlciB0byB0aGUgdmFyaWFibGUgdGhhdCB0aGUgZmlsZSBzaG91bGQgcmVhZCB0byBhbmQgd3JpdGUKKyAqICAgICAgICAgZnJvbS4KKyAqLworc3RydWN0IGRlbnRyeSAqZGVidWdmc19jcmVhdGVfc2l6ZV90KGNvbnN0IGNoYXIgKm5hbWUsIG1vZGVfdCBtb2RlLAorCQkJCSAgICAgc3RydWN0IGRlbnRyeSAqcGFyZW50LCBzaXplX3QgKnZhbHVlKQoreworCXJldHVybiBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIG1vZGUsIHBhcmVudCwgdmFsdWUsICZmb3BzX3NpemVfdCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkZWJ1Z2ZzX2NyZWF0ZV9zaXplX3QpOworCisKIHN0YXRpYyBzc2l6ZV90IHJlYWRfZmlsZV9ib29sKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCiAJCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKZGlmZiAtLWdpdCBhL2ZzL2RlYnVnZnMvaW5vZGUuYyBiL2ZzL2RlYnVnZnMvaW5vZGUuYwppbmRleCAzZGJlMjE2Li44MWFlOWVhIDEwMDY0NAotLS0gYS9mcy9kZWJ1Z2ZzL2lub2RlLmMKKysrIGIvZnMvZGVidWdmcy9pbm9kZS5jCkBAIC0zNyw5ICszNyw2IEBACiAKIAlpZiAoaW5vZGUpIHsKIAkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7Ci0JCWlub2RlLT5pX3VpZCA9IDA7Ci0JCWlub2RlLT5pX2dpZCA9IDA7Ci0JCWlub2RlLT5pX2Jsb2NrcyA9IDA7CiAJCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKIAkJc3dpdGNoIChtb2RlICYgU19JRk1UKSB7CiAJCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9mcy9kZXZwdHMvaW5vZGUuYyBiL2ZzL2RldnB0cy9pbm9kZS5jCmluZGV4IGZmZjk2ZTEuLjVmMzIzMWIgMTAwNjQ0Ci0tLSBhL2ZzL2RldnB0cy9pbm9kZS5jCisrKyBiL2ZzL2RldnB0cy9pbm9kZS5jCkBAIC0xODksOCArMTg5LDYgQEAKIAl9CiAKIAlpbm9kZS0+aV9pbm8gPSAyOwotCWlub2RlLT5pX3VpZCA9IGlub2RlLT5pX2dpZCA9IDA7Ci0JaW5vZGUtPmlfYmxvY2tzID0gMDsKIAlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAKIAltb2RlID0gU19JRkNIUnxvcHRzLT5wdG14bW9kZTsKQEAgLTMwMCw4ICsyOTgsNiBAQAogCQlnb3RvIGZyZWVfZnNpOwogCWlub2RlLT5pX2lubyA9IDE7CiAJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwotCWlub2RlLT5pX2Jsb2NrcyA9IDA7Ci0JaW5vZGUtPmlfdWlkID0gaW5vZGUtPmlfZ2lkID0gMDsKIAlpbm9kZS0+aV9tb2RlID0gU19JRkRJUiB8IFNfSVJVR08gfCBTX0lYVUdPIHwgU19JV1VTUjsKIAlpbm9kZS0+aV9vcCA9ICZzaW1wbGVfZGlyX2lub2RlX29wZXJhdGlvbnM7CiAJaW5vZGUtPmlfZm9wID0gJnNpbXBsZV9kaXJfb3BlcmF0aW9uczsKZGlmZiAtLWdpdCBhL2ZzL2RpcmVjdC1pby5jIGIvZnMvZGlyZWN0LWlvLmMKaW5kZXggYWYwNTU4ZC4uYjZkNDM5MCAxMDA2NDQKLS0tIGEvZnMvZGlyZWN0LWlvLmMKKysrIGIvZnMvZGlyZWN0LWlvLmMKQEAgLTEyMDksNiArMTIwOSwxOSBAQAogCXJldHZhbCA9IGRpcmVjdF9pb193b3JrZXIocncsIGlvY2IsIGlub2RlLCBpb3YsIG9mZnNldCwKIAkJCQlucl9zZWdzLCBibGtiaXRzLCBnZXRfYmxvY2ssIGVuZF9pbywgZGlvKTsKIAorCS8qCisJICogSW4gY2FzZSBvZiBlcnJvciBleHRlbmRpbmcgd3JpdGUgbWF5IGhhdmUgaW5zdGFudGlhdGVkIGEgZmV3CisJICogYmxvY2tzIG91dHNpZGUgaV9zaXplLiBUcmltIHRoZXNlIG9mZiBhZ2FpbiBmb3IgRElPX0xPQ0tJTkcuCisJICogTk9URTogRElPX05PX0xPQ0svRElPX09XTl9MT0NLIGNhbGxlcnMgaGF2ZSB0byBoYW5kbGUgdGhpcyBieQorCSAqIGl0J3Mgb3duIG1lYW5lci4KKwkgKi8KKwlpZiAodW5saWtlbHkocmV0dmFsIDwgMCAmJiAocncgJiBXUklURSkpKSB7CisJCWxvZmZfdCBpc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKworCQlpZiAoZW5kID4gaXNpemUgJiYgZGlvX2xvY2tfdHlwZSA9PSBESU9fTE9DS0lORykKKwkJCXZtdHJ1bmNhdGUoaW5vZGUsIGlzaXplKTsKKwl9CisKIAlpZiAocncgPT0gUkVBRCAmJiBkaW9fbG9ja190eXBlID09IERJT19MT0NLSU5HKQogCQlyZWxlYXNlX2lfbXV0ZXggPSAwOwogCmRpZmYgLS1naXQgYS9mcy9kbG0vYXN0LmMgYi9mcy9kbG0vYXN0LmMKaW5kZXggOGJmMzFlMy4uZGMyYWQ2MCAxMDA2NDQKLS0tIGEvZnMvZGxtL2FzdC5jCisrKyBiL2ZzL2RsbS9hc3QuYwpAQCAtMiw3ICsyLDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCiAqKiAgQ29weXJpZ2h0IChDKSBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuICAxOTk3LTIwMDMgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qKiAgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgUmVkIEhhdCwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoqICBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOCBSZWQgSGF0LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogKioKICoqICBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKICoqICBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwpAQCAtMzMsMTAgKzMzLDEwIEBACiAJc3Bpbl91bmxvY2soJmFzdF9xdWV1ZV9sb2NrKTsKIH0KIAotdm9pZCBkbG1fYWRkX2FzdChzdHJ1Y3QgZGxtX2xrYiAqbGtiLCBpbnQgdHlwZSkKK3ZvaWQgZGxtX2FkZF9hc3Qoc3RydWN0IGRsbV9sa2IgKmxrYiwgaW50IHR5cGUsIGludCBiYXN0bW9kZSkKIHsKIAlpZiAobGtiLT5sa2JfZmxhZ3MgJiBETE1fSUZMX1VTRVIpIHsKLQkJZGxtX3VzZXJfYWRkX2FzdChsa2IsIHR5cGUpOworCQlkbG1fdXNlcl9hZGRfYXN0KGxrYiwgdHlwZSwgYmFzdG1vZGUpOwogCQlyZXR1cm47CiAJfQogCkBAIC00Niw2ICs0Niw4IEBACiAJCWxpc3RfYWRkX3RhaWwoJmxrYi0+bGtiX2FzdHF1ZXVlLCAmYXN0X3F1ZXVlKTsKIAl9CiAJbGtiLT5sa2JfYXN0X3R5cGUgfD0gdHlwZTsKKwlpZiAoYmFzdG1vZGUpCisJCWxrYi0+bGtiX2Jhc3Rtb2RlID0gYmFzdG1vZGU7CiAJc3Bpbl91bmxvY2soJmFzdF9xdWV1ZV9sb2NrKTsKIAogCXNldF9iaXQoV0FLRV9BU1RTLCAmYXN0ZF93YWtlZmxhZ3MpOwpAQCAtNTksNTAgKzYxLDQwIEBACiAJc3RydWN0IGRsbV9sa2IgKmxrYjsKIAl2b2lkICgqY2FzdCkgKHZvaWQgKmFzdHBhcmFtKTsKIAl2b2lkICgqYmFzdCkgKHZvaWQgKmFzdHBhcmFtLCBpbnQgbW9kZSk7Ci0JaW50IHR5cGUgPSAwLCBmb3VuZCwgYm1vZGU7CisJaW50IHR5cGUgPSAwLCBiYXN0bW9kZTsKIAotCWZvciAoOzspIHsKLQkJZm91bmQgPSAwOwotCQlzcGluX2xvY2soJmFzdF9xdWV1ZV9sb2NrKTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShsa2IsICZhc3RfcXVldWUsIGxrYl9hc3RxdWV1ZSkgewotCQkJciA9IGxrYi0+bGtiX3Jlc291cmNlOwotCQkJbHMgPSByLT5yZXNfbHM7CityZXBlYXQ6CisJc3Bpbl9sb2NrKCZhc3RfcXVldWVfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShsa2IsICZhc3RfcXVldWUsIGxrYl9hc3RxdWV1ZSkgeworCQlyID0gbGtiLT5sa2JfcmVzb3VyY2U7CisJCWxzID0gci0+cmVzX2xzOwogCi0JCQlpZiAoZGxtX2xvY2tpbmdfc3RvcHBlZChscykpCi0JCQkJY29udGludWU7CisJCWlmIChkbG1fbG9ja2luZ19zdG9wcGVkKGxzKSkKKwkJCWNvbnRpbnVlOwogCi0JCQlsaXN0X2RlbCgmbGtiLT5sa2JfYXN0cXVldWUpOwotCQkJdHlwZSA9IGxrYi0+bGtiX2FzdF90eXBlOwotCQkJbGtiLT5sa2JfYXN0X3R5cGUgPSAwOwotCQkJZm91bmQgPSAxOwotCQkJYnJlYWs7Ci0JCX0KKwkJbGlzdF9kZWwoJmxrYi0+bGtiX2FzdHF1ZXVlKTsKKwkJdHlwZSA9IGxrYi0+bGtiX2FzdF90eXBlOworCQlsa2ItPmxrYl9hc3RfdHlwZSA9IDA7CisJCWJhc3Rtb2RlID0gbGtiLT5sa2JfYmFzdG1vZGU7CisKIAkJc3Bpbl91bmxvY2soJmFzdF9xdWV1ZV9sb2NrKTsKLQotCQlpZiAoIWZvdW5kKQotCQkJYnJlYWs7Ci0KIAkJY2FzdCA9IGxrYi0+bGtiX2FzdGZuOwogCQliYXN0ID0gbGtiLT5sa2JfYmFzdGZuOwotCQlibW9kZSA9IGxrYi0+bGtiX2Jhc3Rtb2RlOwogCiAJCWlmICgodHlwZSAmIEFTVF9DT01QKSAmJiBjYXN0KQogCQkJY2FzdChsa2ItPmxrYl9hc3RwYXJhbSk7CiAKLQkJLyogRklYTUU6IElzIGl0IHNhZmUgdG8gbG9vayBhdCBsa2JfZ3Jtb2RlIGhlcmUKLQkJICAgd2l0aG91dCBkb2luZyBhIGxvY2tfcnNiKCkgPwotCQkgICBMb29rIGF0IG90aGVyIGNoZWNrcyBpbiB2MSB0byBhdm9pZCBiYXN0cy4gKi8KLQogCQlpZiAoKHR5cGUgJiBBU1RfQkFTVCkgJiYgYmFzdCkKLQkJCWlmICghZGxtX21vZGVzX2NvbXBhdChsa2ItPmxrYl9ncm1vZGUsIGJtb2RlKSkKLQkJCQliYXN0KGxrYi0+bGtiX2FzdHBhcmFtLCBibW9kZSk7CisJCQliYXN0KGxrYi0+bGtiX2FzdHBhcmFtLCBiYXN0bW9kZSk7CiAKIAkJLyogdGhpcyByZW1vdmVzIHRoZSByZWZlcmVuY2UgYWRkZWQgYnkgZGxtX2FkZF9hc3QKIAkJICAgYW5kIG1heSByZXN1bHQgaW4gdGhlIGxrYiBiZWluZyBmcmVlZCAqLwogCQlkbG1fcHV0X2xrYihsa2IpOwogCi0JCXNjaGVkdWxlKCk7CisJCWNvbmRfcmVzY2hlZCgpOworCQlnb3RvIHJlcGVhdDsKIAl9CisJc3Bpbl91bmxvY2soJmFzdF9xdWV1ZV9sb2NrKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgbm9fYXN0cyh2b2lkKQpkaWZmIC0tZ2l0IGEvZnMvZGxtL2FzdC5oIGIvZnMvZGxtL2FzdC5oCmluZGV4IDZlZTI3NmMuLjFiNWZjNWYgMTAwNjQ0Ci0tLSBhL2ZzL2RsbS9hc3QuaAorKysgYi9mcy9kbG0vYXN0LmgKQEAgLTEsNyArMSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgotKiogIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiogIENvcHlyaWdodCAoQykgMjAwNS0yMDA4IFJlZCBIYXQsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqKgogKiogIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAogKiogIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCkBAIC0xMyw3ICsxMyw3IEBACiAjaWZuZGVmIF9fQVNURF9ET1RfSF9fCiAjZGVmaW5lIF9fQVNURF9ET1RfSF9fCiAKLXZvaWQgZGxtX2FkZF9hc3Qoc3RydWN0IGRsbV9sa2IgKmxrYiwgaW50IHR5cGUpOwordm9pZCBkbG1fYWRkX2FzdChzdHJ1Y3QgZGxtX2xrYiAqbGtiLCBpbnQgdHlwZSwgaW50IGJhc3Rtb2RlKTsKIHZvaWQgZGxtX2RlbF9hc3Qoc3RydWN0IGRsbV9sa2IgKmxrYik7CiAKIHZvaWQgZGxtX2FzdGRfd2FrZSh2b2lkKTsKZGlmZiAtLWdpdCBhL2ZzL2RsbS9kZWJ1Z19mcy5jIGIvZnMvZGxtL2RlYnVnX2ZzLmMKaW5kZXggOGZjMjRmNC4uMmYxMDdkMSAxMDA2NDQKLS0tIGEvZnMvZGxtL2RlYnVnX2ZzLmMKKysrIGIvZnMvZGxtL2RlYnVnX2ZzLmMKQEAgLTEsNyArMSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgotKiogIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiogIENvcHlyaWdodCAoQykgMjAwNS0yMDA4IFJlZCBIYXQsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqKgogKiogIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAogKiogIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCkBAIC0yNyw3ICsyNyw3IEBACiAKIHN0cnVjdCByc2JfaXRlciB7CiAJaW50IGVudHJ5OwotCWludCBsb2NrczsKKwlpbnQgZm9ybWF0OwogCWludCBoZWFkZXI7CiAJc3RydWN0IGRsbV9scyAqbHM7CiAJc3RydWN0IGxpc3RfaGVhZCAqbmV4dDsKQEAgLTYwLDggKzYwLDggQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHByaW50X3Jlc291cmNlX2xvY2soc3RydWN0IHNlcV9maWxlICpzLCBzdHJ1Y3QgZGxtX2xrYiAqbGtiLAotCQkJCXN0cnVjdCBkbG1fcnNiICpyZXMpCitzdGF0aWMgdm9pZCBwcmludF9mb3JtYXQxX2xvY2soc3RydWN0IHNlcV9maWxlICpzLCBzdHJ1Y3QgZGxtX2xrYiAqbGtiLAorCQkJICAgICAgIHN0cnVjdCBkbG1fcnNiICpyZXMpCiB7CiAJc2VxX3ByaW50ZihzLCAiJTA4eCAlcyIsIGxrYi0+bGtiX2lkLCBwcmludF9sb2NrbW9kZShsa2ItPmxrYl9ncm1vZGUpKTsKIApAQCAtODMsNyArODMsNyBAQAogCXNlcV9wcmludGYocywgIlxuIik7CiB9CiAKLXN0YXRpYyBpbnQgcHJpbnRfcmVzb3VyY2Uoc3RydWN0IGRsbV9yc2IgKnJlcywgc3RydWN0IHNlcV9maWxlICpzKQorc3RhdGljIGludCBwcmludF9mb3JtYXQxKHN0cnVjdCBkbG1fcnNiICpyZXMsIHN0cnVjdCBzZXFfZmlsZSAqcykKIHsKIAlzdHJ1Y3QgZGxtX2xrYiAqbGtiOwogCWludCBpLCBsdmJsZW4gPSByZXMtPnJlc19scy0+bHNfbHZibGVuLCByZWNvdmVyX2xpc3QsIHJvb3RfbGlzdDsKQEAgLTEzNCwxNSArMTM0LDE1IEBACiAJLyogUHJpbnQgdGhlIGxvY2tzIGF0dGFjaGVkIHRvIHRoaXMgcmVzb3VyY2UgKi8KIAlzZXFfcHJpbnRmKHMsICJHcmFudGVkIFF1ZXVlXG4iKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxrYiwgJnJlcy0+cmVzX2dyYW50cXVldWUsIGxrYl9zdGF0ZXF1ZXVlKQotCQlwcmludF9yZXNvdXJjZV9sb2NrKHMsIGxrYiwgcmVzKTsKKwkJcHJpbnRfZm9ybWF0MV9sb2NrKHMsIGxrYiwgcmVzKTsKIAogCXNlcV9wcmludGYocywgIkNvbnZlcnNpb24gUXVldWVcbiIpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkobGtiLCAmcmVzLT5yZXNfY29udmVydHF1ZXVlLCBsa2Jfc3RhdGVxdWV1ZSkKLQkJcHJpbnRfcmVzb3VyY2VfbG9jayhzLCBsa2IsIHJlcyk7CisJCXByaW50X2Zvcm1hdDFfbG9jayhzLCBsa2IsIHJlcyk7CiAKIAlzZXFfcHJpbnRmKHMsICJXYWl0aW5nIFF1ZXVlXG4iKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxrYiwgJnJlcy0+cmVzX3dhaXRxdWV1ZSwgbGtiX3N0YXRlcXVldWUpCi0JCXByaW50X3Jlc291cmNlX2xvY2socywgbGtiLCByZXMpOworCQlwcmludF9mb3JtYXQxX2xvY2socywgbGtiLCByZXMpOwogCiAJaWYgKGxpc3RfZW1wdHkoJnJlcy0+cmVzX2xvb2t1cCkpCiAJCWdvdG8gb3V0OwpAQCAtMTYwLDIzICsxNjAsMjQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcHJpbnRfbG9jayhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHN0cnVjdCBkbG1fbGtiICpsa2IsIHN0cnVjdCBkbG1fcnNiICpyKQorc3RhdGljIHZvaWQgcHJpbnRfZm9ybWF0Ml9sb2NrKHN0cnVjdCBzZXFfZmlsZSAqcywgc3RydWN0IGRsbV9sa2IgKmxrYiwKKwkJCSAgICAgICBzdHJ1Y3QgZGxtX3JzYiAqcikKIHsKLQl1bnNpZ25lZCBpbnQgd2FpdGluZyA9IDA7Ci0JdWludDY0X3QgeGlkID0gMDsKKwl1NjQgeGlkID0gMDsKKwl1NjQgdXM7CiAKIAlpZiAobGtiLT5sa2JfZmxhZ3MgJiBETE1fSUZMX1VTRVIpIHsKIAkJaWYgKGxrYi0+bGtiX3VhKQogCQkJeGlkID0gbGtiLT5sa2JfdWEtPnhpZDsKIAl9CiAKLQlpZiAobGtiLT5sa2JfdGltZXN0YW1wKQotCQl3YWl0aW5nID0gamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gbGtiLT5sa2JfdGltZXN0YW1wKTsKKwkvKiBtaWNyb3NlY29uZHMgc2luY2UgbGtiIHdhcyBhZGRlZCB0byBjdXJyZW50IHF1ZXVlICovCisJdXMgPSBrdGltZV90b191cyhrdGltZV9zdWIoa3RpbWVfZ2V0KCksIGxrYi0+bGtiX3RpbWVzdGFtcCkpOwogCi0JLyogaWQgbm9kZWlkIHJlbWlkIHBpZCB4aWQgZXhmbGFncyBmbGFncyBzdHMgZ3Jtb2RlIHJxbW9kZSB0aW1lX21zCisJLyogaWQgbm9kZWlkIHJlbWlkIHBpZCB4aWQgZXhmbGFncyBmbGFncyBzdHMgZ3Jtb2RlIHJxbW9kZSB0aW1lX3VzCiAJICAgcl9ub2RlaWQgcl9sZW4gcl9uYW1lICovCiAKLQlzZXFfcHJpbnRmKHMsICIleCAlZCAleCAldSAlbGx1ICV4ICV4ICVkICVkICVkICV1ICV1ICVkIFwiJXNcIlxuIiwKKwlzZXFfcHJpbnRmKHMsICIleCAlZCAleCAldSAlbGx1ICV4ICV4ICVkICVkICVkICVsbHUgJXUgJWQgXCIlc1wiXG4iLAogCQkgICBsa2ItPmxrYl9pZCwKIAkJICAgbGtiLT5sa2Jfbm9kZWlkLAogCQkgICBsa2ItPmxrYl9yZW1pZCwKQEAgLTE4NywyNiArMTg4LDExNCBAQAogCQkgICBsa2ItPmxrYl9zdGF0dXMsCiAJCSAgIGxrYi0+bGtiX2dybW9kZSwKIAkJICAgbGtiLT5sa2JfcnFtb2RlLAotCQkgICB3YWl0aW5nLAorCQkgICAodW5zaWduZWQgbG9uZyBsb25nKXVzLAogCQkgICByLT5yZXNfbm9kZWlkLAogCQkgICByLT5yZXNfbGVuZ3RoLAogCQkgICByLT5yZXNfbmFtZSk7CiB9CiAKLXN0YXRpYyBpbnQgcHJpbnRfbG9ja3Moc3RydWN0IGRsbV9yc2IgKnIsIHN0cnVjdCBzZXFfZmlsZSAqcykKK3N0YXRpYyBpbnQgcHJpbnRfZm9ybWF0MihzdHJ1Y3QgZGxtX3JzYiAqciwgc3RydWN0IHNlcV9maWxlICpzKQogewogCXN0cnVjdCBkbG1fbGtiICpsa2I7CiAKIAlsb2NrX3JzYihyKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkobGtiLCAmci0+cmVzX2dyYW50cXVldWUsIGxrYl9zdGF0ZXF1ZXVlKQotCQlwcmludF9sb2NrKHMsIGxrYiwgcik7CisJCXByaW50X2Zvcm1hdDJfbG9jayhzLCBsa2IsIHIpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShsa2IsICZyLT5yZXNfY29udmVydHF1ZXVlLCBsa2Jfc3RhdGVxdWV1ZSkKLQkJcHJpbnRfbG9jayhzLCBsa2IsIHIpOworCQlwcmludF9mb3JtYXQyX2xvY2socywgbGtiLCByKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkobGtiLCAmci0+cmVzX3dhaXRxdWV1ZSwgbGtiX3N0YXRlcXVldWUpCi0JCXByaW50X2xvY2socywgbGtiLCByKTsKKwkJcHJpbnRfZm9ybWF0Ml9sb2NrKHMsIGxrYiwgcik7CisKKwl1bmxvY2tfcnNiKHIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwcmludF9mb3JtYXQzX2xvY2soc3RydWN0IHNlcV9maWxlICpzLCBzdHJ1Y3QgZGxtX2xrYiAqbGtiLAorCQkJICAgICAgIGludCByc2JfbG9va3VwKQoreworCXU2NCB4aWQgPSAwOworCisJaWYgKGxrYi0+bGtiX2ZsYWdzICYgRExNX0lGTF9VU0VSKSB7CisJCWlmIChsa2ItPmxrYl91YSkKKwkJCXhpZCA9IGxrYi0+bGtiX3VhLT54aWQ7CisJfQorCisJc2VxX3ByaW50ZihzLCAibGtiICV4ICVkICV4ICV1ICVsbHUgJXggJXggJWQgJWQgJWQgJWQgJWQgJWQgJXUgJWxsdSAlbGx1XG4iLAorCQkgICBsa2ItPmxrYl9pZCwKKwkJICAgbGtiLT5sa2Jfbm9kZWlkLAorCQkgICBsa2ItPmxrYl9yZW1pZCwKKwkJICAgbGtiLT5sa2Jfb3ducGlkLAorCQkgICAodW5zaWduZWQgbG9uZyBsb25nKXhpZCwKKwkJICAgbGtiLT5sa2JfZXhmbGFncywKKwkJICAgbGtiLT5sa2JfZmxhZ3MsCisJCSAgIGxrYi0+bGtiX3N0YXR1cywKKwkJICAgbGtiLT5sa2JfZ3Jtb2RlLAorCQkgICBsa2ItPmxrYl9ycW1vZGUsCisJCSAgIGxrYi0+bGtiX2hpZ2hiYXN0LAorCQkgICByc2JfbG9va3VwLAorCQkgICBsa2ItPmxrYl93YWl0X3R5cGUsCisJCSAgIGxrYi0+bGtiX2x2YnNlcSwKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylrdGltZV90b19ucyhsa2ItPmxrYl90aW1lc3RhbXApLAorCQkgICAodW5zaWduZWQgbG9uZyBsb25nKWt0aW1lX3RvX25zKGxrYi0+bGtiX3RpbWVfYmFzdCkpOworfQorCitzdGF0aWMgaW50IHByaW50X2Zvcm1hdDMoc3RydWN0IGRsbV9yc2IgKnIsIHN0cnVjdCBzZXFfZmlsZSAqcykKK3sKKwlzdHJ1Y3QgZGxtX2xrYiAqbGtiOworCWludCBpLCBsdmJsZW4gPSByLT5yZXNfbHMtPmxzX2x2YmxlbjsKKwlpbnQgcHJpbnRfbmFtZSA9IDE7CisKKwlsb2NrX3JzYihyKTsKKworCXNlcV9wcmludGYocywgInJzYiAlcCAlZCAleCAlbHggJWQgJWQgJXUgJWQgIiwKKwkJICAgciwKKwkJICAgci0+cmVzX25vZGVpZCwKKwkJICAgci0+cmVzX2ZpcnN0X2xraWQsCisJCSAgIHItPnJlc19mbGFncywKKwkJICAgIWxpc3RfZW1wdHkoJnItPnJlc19yb290X2xpc3QpLAorCQkgICAhbGlzdF9lbXB0eSgmci0+cmVzX3JlY292ZXJfbGlzdCksCisJCSAgIHItPnJlc19yZWNvdmVyX2xvY2tzX2NvdW50LAorCQkgICByLT5yZXNfbGVuZ3RoKTsKKworCWZvciAoaSA9IDA7IGkgPCByLT5yZXNfbGVuZ3RoOyBpKyspIHsKKwkJaWYgKCFpc2FzY2lpKHItPnJlc19uYW1lW2ldKSB8fCAhaXNwcmludChyLT5yZXNfbmFtZVtpXSkpCisJCQlwcmludF9uYW1lID0gMDsKKwl9CisKKwlzZXFfcHJpbnRmKHMsICIlcyIsIHByaW50X25hbWUgPyAic3RyICIgOiAiaGV4Iik7CisKKwlmb3IgKGkgPSAwOyBpIDwgci0+cmVzX2xlbmd0aDsgaSsrKSB7CisJCWlmIChwcmludF9uYW1lKQorCQkJc2VxX3ByaW50ZihzLCAiJWMiLCByLT5yZXNfbmFtZVtpXSk7CisJCWVsc2UKKwkJCXNlcV9wcmludGYocywgIiAlMDJ4IiwgKHVuc2lnbmVkIGNoYXIpci0+cmVzX25hbWVbaV0pOworCX0KKwlzZXFfcHJpbnRmKHMsICJcbiIpOworCisJaWYgKCFyLT5yZXNfbHZicHRyKQorCQlnb3RvIGRvX2xvY2tzOworCisJc2VxX3ByaW50ZihzLCAibHZiICV1ICVkIiwgci0+cmVzX2x2YnNlcSwgbHZibGVuKTsKKworCWZvciAoaSA9IDA7IGkgPCBsdmJsZW47IGkrKykKKwkJc2VxX3ByaW50ZihzLCAiICUwMngiLCAodW5zaWduZWQgY2hhcilyLT5yZXNfbHZicHRyW2ldKTsKKwlzZXFfcHJpbnRmKHMsICJcbiIpOworCisgZG9fbG9ja3M6CisJbGlzdF9mb3JfZWFjaF9lbnRyeShsa2IsICZyLT5yZXNfZ3JhbnRxdWV1ZSwgbGtiX3N0YXRlcXVldWUpCisJCXByaW50X2Zvcm1hdDNfbG9jayhzLCBsa2IsIDApOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShsa2IsICZyLT5yZXNfY29udmVydHF1ZXVlLCBsa2Jfc3RhdGVxdWV1ZSkKKwkJcHJpbnRfZm9ybWF0M19sb2NrKHMsIGxrYiwgMCk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxrYiwgJnItPnJlc193YWl0cXVldWUsIGxrYl9zdGF0ZXF1ZXVlKQorCQlwcmludF9mb3JtYXQzX2xvY2socywgbGtiLCAwKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkobGtiLCAmci0+cmVzX2xvb2t1cCwgbGtiX3JzYl9sb29rdXApCisJCXByaW50X2Zvcm1hdDNfbG9jayhzLCBsa2IsIDEpOwogCiAJdW5sb2NrX3JzYihyKTsKIAlyZXR1cm4gMDsKQEAgLTIzMSw3ICszMjAsNyBAQAogCQkJCWJyZWFrOwogCQkJfQogCQkJcmVhZF91bmxvY2soJmxzLT5sc19yc2J0YmxbaV0ubG9jayk7Ci0gICAgICAgICAgICAgICAgfQorCQl9CiAJCXJpLT5lbnRyeSA9IGk7CiAKIAkJaWYgKHJpLT5lbnRyeSA+PSBscy0+bHNfcnNidGJsX3NpemUpCkBAIC0yNDgsNyArMzM3LDcgQEAKIAkJCXJlYWRfdW5sb2NrKCZscy0+bHNfcnNidGJsW2ldLmxvY2spOwogCQkJZGxtX3B1dF9yc2Iob2xkKTsKIAkJCWdvdG8gdG9wOwotICAgICAgICAgICAgICAgIH0KKwkJfQogCQlyaS0+cnNiID0gbGlzdF9lbnRyeShyaS0+bmV4dCwgc3RydWN0IGRsbV9yc2IsIHJlc19oYXNoY2hhaW4pOwogCQlkbG1faG9sZF9yc2IocmktPnJzYik7CiAJCXJlYWRfdW5sb2NrKCZscy0+bHNfcnNidGJsW2ldLmxvY2spOwpAQCAtMjc0LDYgKzM2Myw3IEBACiAJcmktPmxzID0gbHM7CiAJcmktPmVudHJ5ID0gMDsKIAlyaS0+bmV4dCA9IE5VTEw7CisJcmktPmZvcm1hdCA9IDE7CiAKIAlpZiAocnNiX2l0ZXJfbmV4dChyaSkpIHsKIAkJcnNiX2l0ZXJfZnJlZShyaSk7CkBAIC0zMjUsMTYgKzQxNSwyNiBAQAogewogCXN0cnVjdCByc2JfaXRlciAqcmkgPSBpdGVyX3B0cjsKIAotCWlmIChyaS0+bG9ja3MpIHsKKwlzd2l0Y2ggKHJpLT5mb3JtYXQpIHsKKwljYXNlIDE6CisJCXByaW50X2Zvcm1hdDEocmktPnJzYiwgZmlsZSk7CisJCWJyZWFrOworCWNhc2UgMjoKIAkJaWYgKHJpLT5oZWFkZXIpIHsKLQkJCXNlcV9wcmludGYoZmlsZSwgImlkIG5vZGVpZCByZW1pZCBwaWQgeGlkIGV4ZmxhZ3MgZmxhZ3MgIgotCQkJCQkgInN0cyBncm1vZGUgcnFtb2RlIHRpbWVfbXMgcl9ub2RlaWQgIgotCQkJCQkgInJfbGVuIHJfbmFtZVxuIik7CisJCQlzZXFfcHJpbnRmKGZpbGUsICJpZCBub2RlaWQgcmVtaWQgcGlkIHhpZCBleGZsYWdzICIKKwkJCQkJICJmbGFncyBzdHMgZ3Jtb2RlIHJxbW9kZSB0aW1lX21zICIKKwkJCQkJICJyX25vZGVpZCByX2xlbiByX25hbWVcbiIpOwogCQkJcmktPmhlYWRlciA9IDA7CiAJCX0KLQkJcHJpbnRfbG9ja3MocmktPnJzYiwgZmlsZSk7Ci0JfSBlbHNlIHsKLQkJcHJpbnRfcmVzb3VyY2UocmktPnJzYiwgZmlsZSk7CisJCXByaW50X2Zvcm1hdDIocmktPnJzYiwgZmlsZSk7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJaWYgKHJpLT5oZWFkZXIpIHsKKwkJCXNlcV9wcmludGYoZmlsZSwgInZlcnNpb24gcnNiIDEuMSBsdmIgMS4xIGxrYiAxLjFcbiIpOworCQkJcmktPmhlYWRlciA9IDA7CisJCX0KKwkJcHJpbnRfZm9ybWF0MyhyaS0+cnNiLCBmaWxlKTsKKwkJYnJlYWs7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0zODUsNyArNDg1LDcgQEAKIAlyaS0+bHMgPSBsczsKIAlyaS0+ZW50cnkgPSAwOwogCXJpLT5uZXh0ID0gTlVMTDsKLQlyaS0+bG9ja3MgPSAxOworCXJpLT5mb3JtYXQgPSAyOwogCiAJaWYgKCpwb3MgPT0gMCkKIAkJcmktPmhlYWRlciA9IDE7CkBAIC00NDgsNiArNTQ4LDg0IEBACiB9OwogCiAvKgorICogRHVtcCBhbGwgcnNiL2x2Yi9sa2Igc3RhdGUgaW4gY29tcGFjdCBsaXN0aW5nLCBtb3JlIGNvbXBsZXRlIHRoYW4gX2xvY2tzCisgKiBUaGlzIGNhbiByZXBsYWNlIGJvdGggZm9ybWF0cyAxIGFuZCAyIGV2ZW50dWFsbHkuCisgKi8KKworc3RhdGljIHN0cnVjdCByc2JfaXRlciAqYWxsX2l0ZXJfaW5pdChzdHJ1Y3QgZGxtX2xzICpscywgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHJzYl9pdGVyICpyaTsKKworCXJpID0ga3phbGxvYyhzaXplb2YgKnJpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJpKQorCQlyZXR1cm4gTlVMTDsKKworCXJpLT5scyA9IGxzOworCXJpLT5lbnRyeSA9IDA7CisJcmktPm5leHQgPSBOVUxMOworCXJpLT5mb3JtYXQgPSAzOworCisJaWYgKCpwb3MgPT0gMCkKKwkJcmktPmhlYWRlciA9IDE7CisKKwlpZiAocnNiX2l0ZXJfbmV4dChyaSkpIHsKKwkJcnNiX2l0ZXJfZnJlZShyaSk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiByaTsKK30KKworc3RhdGljIHZvaWQgKmFsbF9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpmaWxlLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgcnNiX2l0ZXIgKnJpOworCWxvZmZfdCBuID0gKnBvczsKKworCXJpID0gYWxsX2l0ZXJfaW5pdChmaWxlLT5wcml2YXRlLCBwb3MpOworCWlmICghcmkpCisJCXJldHVybiBOVUxMOworCisJd2hpbGUgKG4tLSkgeworCQlpZiAocnNiX2l0ZXJfbmV4dChyaSkpIHsKKwkJCXJzYl9pdGVyX2ZyZWUocmkpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisKKwlyZXR1cm4gcmk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgYWxsX3NlcV9vcHMgPSB7CisJLnN0YXJ0ID0gYWxsX3NlcV9zdGFydCwKKwkubmV4dCAgPSByc2Jfc2VxX25leHQsCisJLnN0b3AgID0gcnNiX3NlcV9zdG9wLAorCS5zaG93ICA9IHJzYl9zZXFfc2hvdywKK307CisKK3N0YXRpYyBpbnQgYWxsX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNlcV9maWxlICpzZXE7CisJaW50IHJldDsKKworCXJldCA9IHNlcV9vcGVuKGZpbGUsICZhbGxfc2VxX29wcyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXNlcSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzZXEtPnByaXZhdGUgPSBpbm9kZS0+aV9wcml2YXRlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFsbF9mb3BzID0geworCS5vd25lciAgID0gVEhJU19NT0RVTEUsCisJLm9wZW4gICAgPSBhbGxfb3BlbiwKKwkucmVhZCAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UKK307CisKKy8qCiAgKiBkdW1wIGxrYidzIG9uIHRoZSBsc193YWl0ZXJzIGxpc3QKICAqLwogCkBAIC00ODksMzAgKzY2NywzMyBAQAogCS5yZWFkICAgID0gd2FpdGVyc19yZWFkCiB9OwogCit2b2lkIGRsbV9kZWxldGVfZGVidWdfZmlsZShzdHJ1Y3QgZGxtX2xzICpscykKK3sKKwlpZiAobHMtPmxzX2RlYnVnX3JzYl9kZW50cnkpCisJCWRlYnVnZnNfcmVtb3ZlKGxzLT5sc19kZWJ1Z19yc2JfZGVudHJ5KTsKKwlpZiAobHMtPmxzX2RlYnVnX3dhaXRlcnNfZGVudHJ5KQorCQlkZWJ1Z2ZzX3JlbW92ZShscy0+bHNfZGVidWdfd2FpdGVyc19kZW50cnkpOworCWlmIChscy0+bHNfZGVidWdfbG9ja3NfZGVudHJ5KQorCQlkZWJ1Z2ZzX3JlbW92ZShscy0+bHNfZGVidWdfbG9ja3NfZGVudHJ5KTsKKwlpZiAobHMtPmxzX2RlYnVnX2FsbF9kZW50cnkpCisJCWRlYnVnZnNfcmVtb3ZlKGxzLT5sc19kZWJ1Z19hbGxfZGVudHJ5KTsKK30KKwogaW50IGRsbV9jcmVhdGVfZGVidWdfZmlsZShzdHJ1Y3QgZGxtX2xzICpscykKIHsKIAljaGFyIG5hbWVbRExNX0xPQ0tTUEFDRV9MRU4rOF07CiAKKwkvKiBmb3JtYXQgMSAqLworCiAJbHMtPmxzX2RlYnVnX3JzYl9kZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKGxzLT5sc19uYW1lLAogCQkJCQkJICAgICAgU19JRlJFRyB8IFNfSVJVR08sCiAJCQkJCQkgICAgICBkbG1fcm9vdCwKIAkJCQkJCSAgICAgIGxzLAogCQkJCQkJICAgICAgJnJzYl9mb3BzKTsKIAlpZiAoIWxzLT5sc19kZWJ1Z19yc2JfZGVudHJ5KQotCQlyZXR1cm4gLUVOT01FTTsKKwkJZ290byBmYWlsOwogCi0JbWVtc2V0KG5hbWUsIDAsIHNpemVvZihuYW1lKSk7Ci0Jc25wcmludGYobmFtZSwgRExNX0xPQ0tTUEFDRV9MRU4rOCwgIiVzX3dhaXRlcnMiLCBscy0+bHNfbmFtZSk7Ci0KLQlscy0+bHNfZGVidWdfd2FpdGVyc19kZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsCi0JCQkJCQkJICBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkJCQkgIGRsbV9yb290LAotCQkJCQkJCSAgbHMsCi0JCQkJCQkJICAmd2FpdGVyc19mb3BzKTsKLQlpZiAoIWxzLT5sc19kZWJ1Z193YWl0ZXJzX2RlbnRyeSkgewotCQlkZWJ1Z2ZzX3JlbW92ZShscy0+bHNfZGVidWdfcnNiX2RlbnRyeSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KKwkvKiBmb3JtYXQgMiAqLwogCiAJbWVtc2V0KG5hbWUsIDAsIHNpemVvZihuYW1lKSk7CiAJc25wcmludGYobmFtZSwgRExNX0xPQ0tTUEFDRV9MRU4rOCwgIiVzX2xvY2tzIiwgbHMtPmxzX25hbWUpOwpAQCAtNTIyLDIzICs3MDMsMzggQEAKIAkJCQkJCQlkbG1fcm9vdCwKIAkJCQkJCQlscywKIAkJCQkJCQkmbG9ja3NfZm9wcyk7Ci0JaWYgKCFscy0+bHNfZGVidWdfbG9ja3NfZGVudHJ5KSB7Ci0JCWRlYnVnZnNfcmVtb3ZlKGxzLT5sc19kZWJ1Z193YWl0ZXJzX2RlbnRyeSk7Ci0JCWRlYnVnZnNfcmVtb3ZlKGxzLT5sc19kZWJ1Z19yc2JfZGVudHJ5KTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQorCWlmICghbHMtPmxzX2RlYnVnX2xvY2tzX2RlbnRyeSkKKwkJZ290byBmYWlsOworCisJLyogZm9ybWF0IDMgKi8KKworCW1lbXNldChuYW1lLCAwLCBzaXplb2YobmFtZSkpOworCXNucHJpbnRmKG5hbWUsIERMTV9MT0NLU1BBQ0VfTEVOKzgsICIlc19hbGwiLCBscy0+bHNfbmFtZSk7CisKKwlscy0+bHNfZGVidWdfYWxsX2RlbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwKKwkJCQkJCSAgICAgIFNfSUZSRUcgfCBTX0lSVUdPLAorCQkJCQkJICAgICAgZGxtX3Jvb3QsCisJCQkJCQkgICAgICBscywKKwkJCQkJCSAgICAgICZhbGxfZm9wcyk7CisJaWYgKCFscy0+bHNfZGVidWdfYWxsX2RlbnRyeSkKKwkJZ290byBmYWlsOworCisJbWVtc2V0KG5hbWUsIDAsIHNpemVvZihuYW1lKSk7CisJc25wcmludGYobmFtZSwgRExNX0xPQ0tTUEFDRV9MRU4rOCwgIiVzX3dhaXRlcnMiLCBscy0+bHNfbmFtZSk7CisKKwlscy0+bHNfZGVidWdfd2FpdGVyc19kZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsCisJCQkJCQkJICBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQkJCQkgIGRsbV9yb290LAorCQkJCQkJCSAgbHMsCisJCQkJCQkJICAmd2FpdGVyc19mb3BzKTsKKwlpZiAoIWxzLT5sc19kZWJ1Z193YWl0ZXJzX2RlbnRyeSkKKwkJZ290byBmYWlsOwogCiAJcmV0dXJuIDA7Ci19CiAKLXZvaWQgZGxtX2RlbGV0ZV9kZWJ1Z19maWxlKHN0cnVjdCBkbG1fbHMgKmxzKQotewotCWlmIChscy0+bHNfZGVidWdfcnNiX2RlbnRyeSkKLQkJZGVidWdmc19yZW1vdmUobHMtPmxzX2RlYnVnX3JzYl9kZW50cnkpOwotCWlmIChscy0+bHNfZGVidWdfd2FpdGVyc19kZW50cnkpCi0JCWRlYnVnZnNfcmVtb3ZlKGxzLT5sc19kZWJ1Z193YWl0ZXJzX2RlbnRyeSk7Ci0JaWYgKGxzLT5sc19kZWJ1Z19sb2Nrc19kZW50cnkpCi0JCWRlYnVnZnNfcmVtb3ZlKGxzLT5sc19kZWJ1Z19sb2Nrc19kZW50cnkpOworIGZhaWw6CisJZGxtX2RlbGV0ZV9kZWJ1Z19maWxlKGxzKTsKKwlyZXR1cm4gLUVOT01FTTsKIH0KIAogaW50IF9faW5pdCBkbG1fcmVnaXN0ZXJfZGVidWdmcyh2b2lkKQpkaWZmIC0tZ2l0IGEvZnMvZGxtL2Rpci5jIGIvZnMvZGxtL2Rpci5jCmluZGV4IDg1ZGVmZWIuLjkyOTY5ZjggMTAwNjQ0Ci0tLSBhL2ZzL2RsbS9kaXIuYworKysgYi9mcy9kbG0vZGlyLmMKQEAgLTM3NCw3ICszNzQsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CiAJc3RydWN0IGRsbV9yc2IgKnI7CiAJaW50IG9mZnNldCA9IDAsIGRpcl9ub2RlaWQ7Ci0JdWludDE2X3QgYmVfbmFtZWxlbjsKKwlfX2JlMTYgYmVfbmFtZWxlbjsKIAogCWRvd25fcmVhZCgmbHMtPmxzX3Jvb3Rfc2VtKTsKIApAQCAtNDEwLDE1ICs0MTAsMTUgQEAKIAogCQlpZiAob2Zmc2V0ICsgc2l6ZW9mKHVpbnQxNl90KSoyICsgci0+cmVzX2xlbmd0aCA+IG91dGxlbikgewogCQkJLyogV3JpdGUgZW5kLW9mLWJsb2NrIHJlY29yZCAqLwotCQkJYmVfbmFtZWxlbiA9IDA7Ci0JCQltZW1jcHkob3V0YnVmICsgb2Zmc2V0LCAmYmVfbmFtZWxlbiwgc2l6ZW9mKHVpbnQxNl90KSk7Ci0JCQlvZmZzZXQgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKwkJCWJlX25hbWVsZW4gPSBjcHVfdG9fYmUxNigwKTsKKwkJCW1lbWNweShvdXRidWYgKyBvZmZzZXQsICZiZV9uYW1lbGVuLCBzaXplb2YoX19iZTE2KSk7CisJCQlvZmZzZXQgKz0gc2l6ZW9mKF9fYmUxNik7CiAJCQlnb3RvIG91dDsKIAkJfQogCiAJCWJlX25hbWVsZW4gPSBjcHVfdG9fYmUxNihyLT5yZXNfbGVuZ3RoKTsKLQkJbWVtY3B5KG91dGJ1ZiArIG9mZnNldCwgJmJlX25hbWVsZW4sIHNpemVvZih1aW50MTZfdCkpOwotCQlvZmZzZXQgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKwkJbWVtY3B5KG91dGJ1ZiArIG9mZnNldCwgJmJlX25hbWVsZW4sIHNpemVvZihfX2JlMTYpKTsKKwkJb2Zmc2V0ICs9IHNpemVvZihfX2JlMTYpOwogCQltZW1jcHkob3V0YnVmICsgb2Zmc2V0LCByLT5yZXNfbmFtZSwgci0+cmVzX2xlbmd0aCk7CiAJCW9mZnNldCArPSByLT5yZXNfbGVuZ3RoOwogCX0KQEAgLTQzMCw5ICs0MzAsOSBAQAogCiAJaWYgKChsaXN0ID09ICZscy0+bHNfcm9vdF9saXN0KSAmJgogCSAgICAob2Zmc2V0ICsgc2l6ZW9mKHVpbnQxNl90KSA8PSBvdXRsZW4pKSB7Ci0JCWJlX25hbWVsZW4gPSAweEZGRkY7Ci0JCW1lbWNweShvdXRidWYgKyBvZmZzZXQsICZiZV9uYW1lbGVuLCBzaXplb2YodWludDE2X3QpKTsKLQkJb2Zmc2V0ICs9IHNpemVvZih1aW50MTZfdCk7CisJCWJlX25hbWVsZW4gPSBjcHVfdG9fYmUxNigweEZGRkYpOworCQltZW1jcHkob3V0YnVmICsgb2Zmc2V0LCAmYmVfbmFtZWxlbiwgc2l6ZW9mKF9fYmUxNikpOworCQlvZmZzZXQgKz0gc2l6ZW9mKF9fYmUxNik7CiAJfQogCiAgb3V0OgpkaWZmIC0tZ2l0IGEvZnMvZGxtL2RsbV9pbnRlcm5hbC5oIGIvZnMvZGxtL2RsbV9pbnRlcm5hbC5oCmluZGV4IDg2OGU0YzkuLmVmMmYxZTMgMTAwNjQ0Ci0tLSBhL2ZzL2RsbS9kbG1faW50ZXJuYWwuaAorKysgYi9mcy9kbG0vZGxtX2ludGVybmFsLmgKQEAgLTI0NSw3ICsyNDUsOCBAQAogCXN0cnVjdCBsaXN0X2hlYWQJbGtiX2FzdHF1ZXVlOwkvKiBuZWVkIGFzdCB0byBiZSBzZW50ICovCiAJc3RydWN0IGxpc3RfaGVhZAlsa2Jfb3ducXVldWU7CS8qIGxpc3Qgb2YgbG9ja3MgZm9yIGEgcHJvY2VzcyAqLwogCXN0cnVjdCBsaXN0X2hlYWQJbGtiX3RpbWVfbGlzdDsKLQl1bnNpZ25lZCBsb25nCQlsa2JfdGltZXN0YW1wOworCWt0aW1lX3QJCQlsa2JfdGltZV9iYXN0OwkvKiBmb3IgZGVidWdnaW5nICovCisJa3RpbWVfdAkJCWxrYl90aW1lc3RhbXA7CiAJdW5zaWduZWQgbG9uZwkJbGtiX3RpbWVvdXRfY3M7CiAKIAljaGFyCQkJKmxrYl9sdmJwdHI7CkBAIC00ODEsNiArNDgyLDcgQEAKIAlzdHJ1Y3QgZGVudHJ5CQkqbHNfZGVidWdfcnNiX2RlbnRyeTsgLyogZGVidWdmcyAqLwogCXN0cnVjdCBkZW50cnkJCSpsc19kZWJ1Z193YWl0ZXJzX2RlbnRyeTsgLyogZGVidWdmcyAqLwogCXN0cnVjdCBkZW50cnkJCSpsc19kZWJ1Z19sb2Nrc19kZW50cnk7IC8qIGRlYnVnZnMgKi8KKwlzdHJ1Y3QgZGVudHJ5CQkqbHNfZGVidWdfYWxsX2RlbnRyeTsgLyogZGVidWdmcyAqLwogCiAJd2FpdF9xdWV1ZV9oZWFkX3QJbHNfdWV2ZW50X3dhaXQ7CS8qIHVzZXIgcGFydCBvZiBqb2luL2xlYXZlICovCiAJaW50CQkJbHNfdWV2ZW50X3Jlc3VsdDsKZGlmZiAtLWdpdCBhL2ZzL2RsbS9sb2NrLmMgYi9mcy9kbG0vbG9jay5jCmluZGV4IDcyNGRkYWMuLjZjZmU2NWIgMTAwNjQ0Ci0tLSBhL2ZzL2RsbS9sb2NrLmMKKysrIGIvZnMvZGxtL2xvY2suYwpAQCAtMzA3LDcgKzMwNyw3IEBACiAJbGtiLT5sa2JfbGtzYi0+c2Jfc3RhdHVzID0gcnY7CiAJbGtiLT5sa2JfbGtzYi0+c2JfZmxhZ3MgPSBsa2ItPmxrYl9zYmZsYWdzOwogCi0JZGxtX2FkZF9hc3QobGtiLCBBU1RfQ09NUCk7CisJZGxtX2FkZF9hc3QobGtiLCBBU1RfQ09NUCwgMCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBxdWV1ZV9jYXN0X292ZXJsYXAoc3RydWN0IGRsbV9yc2IgKnIsIHN0cnVjdCBkbG1fbGtiICpsa2IpCkBAIC0zMTgsMTIgKzMxOCwxMiBAQAogCiBzdGF0aWMgdm9pZCBxdWV1ZV9iYXN0KHN0cnVjdCBkbG1fcnNiICpyLCBzdHJ1Y3QgZGxtX2xrYiAqbGtiLCBpbnQgcnFtb2RlKQogeworCWxrYi0+bGtiX3RpbWVfYmFzdCA9IGt0aW1lX2dldCgpOworCiAJaWYgKGlzX21hc3Rlcl9jb3B5KGxrYikpCiAJCXNlbmRfYmFzdChyLCBsa2IsIHJxbW9kZSk7Ci0JZWxzZSB7Ci0JCWxrYi0+bGtiX2Jhc3Rtb2RlID0gcnFtb2RlOwotCQlkbG1fYWRkX2FzdChsa2IsIEFTVF9CQVNUKTsKLQl9CisJZWxzZQorCQlkbG1fYWRkX2FzdChsa2IsIEFTVF9CQVNULCBycW1vZGUpOwogfQogCiAvKgpAQCAtNzQ0LDYgKzc0NCw4IEBACiAKIAlETE1fQVNTRVJUKCFsa2ItPmxrYl9zdGF0dXMsIGRsbV9wcmludF9sa2IobGtiKTspOwogCisJbGtiLT5sa2JfdGltZXN0YW1wID0ga3RpbWVfZ2V0KCk7CisKIAlsa2ItPmxrYl9zdGF0dXMgPSBzdGF0dXM7CiAKIAlzd2l0Y2ggKHN0YXR1cykgewpAQCAtMTAxMywxMCArMTAxNSw4IEBACiB7CiAJc3RydWN0IGRsbV9scyAqbHMgPSBsa2ItPmxrYl9yZXNvdXJjZS0+cmVzX2xzOwogCi0JaWYgKGlzX21hc3Rlcl9jb3B5KGxrYikpIHsKLQkJbGtiLT5sa2JfdGltZXN0YW1wID0gamlmZmllczsKKwlpZiAoaXNfbWFzdGVyX2NvcHkobGtiKSkKIAkJcmV0dXJuOwotCX0KIAogCWlmICh0ZXN0X2JpdChMU0ZMX1RJTUVXQVJOLCAmbHMtPmxzX2ZsYWdzKSAmJgogCSAgICAhKGxrYi0+bGtiX2V4ZmxhZ3MgJiBETE1fTEtGX05PRExDS1dUKSkgewpAQCAtMTAzMSw3ICsxMDMxLDYgQEAKIAlETE1fQVNTRVJUKGxpc3RfZW1wdHkoJmxrYi0+bGtiX3RpbWVfbGlzdCksIGRsbV9wcmludF9sa2IobGtiKTspOwogCW11dGV4X2xvY2soJmxzLT5sc190aW1lb3V0X211dGV4KTsKIAlob2xkX2xrYihsa2IpOwotCWxrYi0+bGtiX3RpbWVzdGFtcCA9IGppZmZpZXM7CiAJbGlzdF9hZGRfdGFpbCgmbGtiLT5sa2JfdGltZV9saXN0LCAmbHMtPmxzX3RpbWVvdXQpOwogCW11dGV4X3VubG9jaygmbHMtPmxzX3RpbWVvdXRfbXV0ZXgpOwogfQpAQCAtMTA1OSw2ICsxMDU4LDcgQEAKIAlzdHJ1Y3QgZGxtX3JzYiAqcjsKIAlzdHJ1Y3QgZGxtX2xrYiAqbGtiOwogCWludCBkb19jYW5jZWwsIGRvX3dhcm47CisJczY0IHdhaXRfdXM7CiAKIAlmb3IgKDs7KSB7CiAJCWlmIChkbG1fbG9ja2luZ19zdG9wcGVkKGxzKSkKQEAgLTEwNjksMTQgKzEwNjksMTUgQEAKIAkJbXV0ZXhfbG9jaygmbHMtPmxzX3RpbWVvdXRfbXV0ZXgpOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxrYiwgJmxzLT5sc190aW1lb3V0LCBsa2JfdGltZV9saXN0KSB7CiAKKwkJCXdhaXRfdXMgPSBrdGltZV90b191cyhrdGltZV9zdWIoa3RpbWVfZ2V0KCksCisJCQkJCSAgICAgIAkJbGtiLT5sa2JfdGltZXN0YW1wKSk7CisKIAkJCWlmICgobGtiLT5sa2JfZXhmbGFncyAmIERMTV9MS0ZfVElNRU9VVCkgJiYKLQkJCSAgICB0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGxrYi0+bGtiX3RpbWVzdGFtcCArCi0JCQkJCSAgbGtiLT5sa2JfdGltZW91dF9jcyAqIEhaLzEwMCkpCisJCQkgICAgd2FpdF91cyA+PSAobGtiLT5sa2JfdGltZW91dF9jcyAqIDEwMDAwKSkKIAkJCQlkb19jYW5jZWwgPSAxOwogCiAJCQlpZiAoKGxrYi0+bGtiX2ZsYWdzICYgRExNX0lGTF9XQVRDSF9USU1FV0FSTikgJiYKLQkJCSAgICB0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGxrYi0+bGtiX3RpbWVzdGFtcCArCi0JCQkJICAgCSAgIGRsbV9jb25maWcuY2lfdGltZXdhcm5fY3MgKiBIWi8xMDApKQorCQkJICAgIHdhaXRfdXMgPj0gZGxtX2NvbmZpZy5jaV90aW1ld2Fybl9jcyAqIDEwMDAwKQogCQkJCWRvX3dhcm4gPSAxOwogCiAJCQlpZiAoIWRvX2NhbmNlbCAmJiAhZG9fd2FybikKQEAgLTExMjIsMTIgKzExMjMsMTIgQEAKIHZvaWQgZGxtX2FkanVzdF90aW1lb3V0cyhzdHJ1Y3QgZGxtX2xzICpscykKIHsKIAlzdHJ1Y3QgZGxtX2xrYiAqbGtiOwotCWxvbmcgYWRqID0gamlmZmllcyAtIGxzLT5sc19yZWNvdmVyX2JlZ2luOworCXU2NCBhZGpfdXMgPSBqaWZmaWVzX3RvX3VzZWNzKGppZmZpZXMgLSBscy0+bHNfcmVjb3Zlcl9iZWdpbik7CiAKIAlscy0+bHNfcmVjb3Zlcl9iZWdpbiA9IDA7CiAJbXV0ZXhfbG9jaygmbHMtPmxzX3RpbWVvdXRfbXV0ZXgpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkobGtiLCAmbHMtPmxzX3RpbWVvdXQsIGxrYl90aW1lX2xpc3QpCi0JCWxrYi0+bGtiX3RpbWVzdGFtcCArPSBhZGo7CisJCWxrYi0+bGtiX3RpbWVzdGFtcCA9IGt0aW1lX2FkZF91cyhsa2ItPmxrYl90aW1lc3RhbXAsIGFkal91cyk7CiAJbXV0ZXhfdW5sb2NrKCZscy0+bHNfdGltZW91dF9tdXRleCk7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2RsbS9sb3djb21tcy5jIGIvZnMvZGxtL2xvd2NvbW1zLmMKaW5kZXggMzk2MjI2Mi4uMTAzYTVlYiAxMDA2NDQKLS0tIGEvZnMvZGxtL2xvd2NvbW1zLmMKKysrIGIvZnMvZGxtL2xvd2NvbW1zLmMKQEAgLTI5NSw2ICsyOTUsNyBAQAogCWNvbi0+c29jay0+c2stPnNrX3dyaXRlX3NwYWNlID0gbG93Y29tbXNfd3JpdGVfc3BhY2U7CiAJY29uLT5zb2NrLT5zay0+c2tfc3RhdGVfY2hhbmdlID0gbG93Y29tbXNfc3RhdGVfY2hhbmdlOwogCWNvbi0+c29jay0+c2stPnNrX3VzZXJfZGF0YSA9IGNvbjsKKwljb24tPnNvY2stPnNrLT5za19hbGxvY2F0aW9uID0gR0ZQX05PRlM7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTgyMyw3ICs4MjQsNiBAQAogCWxlbiA9IGUtPmxlbjsKIAlvZmZzZXQgPSBlLT5vZmZzZXQ7CiAJc3Bpbl91bmxvY2soJmNvbi0+d3JpdGVxdWV1ZV9sb2NrKTsKLQlrbWFwKGUtPnBhZ2UpOwogCiAJLyogU2VuZCB0aGUgZmlyc3QgYmxvY2sgb2ZmIHRoZSB3cml0ZSBxdWV1ZSAqLwogCWlvdlswXS5pb3ZfYmFzZSA9IHBhZ2VfYWRkcmVzcyhlLT5wYWdlKStvZmZzZXQ7CkBAIC04NTQsNyArODU0LDYgQEAKIAogCQlpZiAoZS0+bGVuID09IDAgJiYgZS0+dXNlcnMgPT0gMCkgewogCQkJbGlzdF9kZWwoJmUtPmxpc3QpOwotCQkJa3VubWFwKGUtPnBhZ2UpOwogCQkJZnJlZV9lbnRyeShlKTsKIAkJfQogCQlzcGluX3VubG9jaygmY29uLT53cml0ZXF1ZXVlX2xvY2spOwpAQCAtMTIwMyw4ICsxMjAyLDYgQEAKIAogCWlmIChlKSB7CiAJZ290X29uZToKLQkJaWYgKHVzZXJzID09IDApCi0JCQlrbWFwKGUtPnBhZ2UpOwogCQkqcHBjID0gcGFnZV9hZGRyZXNzKGUtPnBhZ2UpICsgb2Zmc2V0OwogCQlyZXR1cm4gZTsKIAl9CkBAIC0xMjMzLDcgKzEyMzAsNiBAQAogCWlmICh1c2VycykKIAkJZ290byBvdXQ7CiAJZS0+bGVuID0gZS0+ZW5kIC0gZS0+b2Zmc2V0OwotCWt1bm1hcChlLT5wYWdlKTsKIAlzcGluX3VubG9jaygmY29uLT53cml0ZXF1ZXVlX2xvY2spOwogCiAJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KENGX1dSSVRFX1BFTkRJTkcsICZjb24tPmZsYWdzKSkgewpAQCAtMTI3Miw3ICsxMjY4LDYgQEAKIAkJb2Zmc2V0ID0gZS0+b2Zmc2V0OwogCQlCVUdfT04obGVuID09IDAgJiYgZS0+dXNlcnMgPT0gMCk7CiAJCXNwaW5fdW5sb2NrKCZjb24tPndyaXRlcXVldWVfbG9jayk7Ci0JCWttYXAoZS0+cGFnZSk7CiAKIAkJcmV0ID0gMDsKIAkJaWYgKGxlbikgewpAQCAtMTI5NCw3ICsxMjg5LDYgQEAKIAogCQlpZiAoZS0+bGVuID09IDAgJiYgZS0+dXNlcnMgPT0gMCkgewogCQkJbGlzdF9kZWwoJmUtPmxpc3QpOwotCQkJa3VubWFwKGUtPnBhZ2UpOwogCQkJZnJlZV9lbnRyeShlKTsKIAkJCWNvbnRpbnVlOwogCQl9CmRpZmYgLS1naXQgYS9mcy9kbG0vbWVtb3J5LmMgYi9mcy9kbG0vbWVtb3J5LmMKaW5kZXggNTRjMTRjNi4uYzE3NzViOCAxMDA2NDQKLS0tIGEvZnMvZGxtL21lbW9yeS5jCisrKyBiL2ZzL2RsbS9tZW1vcnkuYwpAQCAtMzksNyArMzksNyBAQAogewogCWNoYXIgKnA7CiAKLQlwID0ga3phbGxvYyhscy0+bHNfbHZibGVuLCBHRlBfS0VSTkVMKTsKKwlwID0ga3phbGxvYyhscy0+bHNfbHZibGVuLCBscy0+bHNfYWxsb2NhdGlvbik7CiAJcmV0dXJuIHA7CiB9CiAKQEAgLTU3LDcgKzU3LDcgQEAKIAogCURMTV9BU1NFUlQobmFtZWxlbiA8PSBETE1fUkVTTkFNRV9NQVhMRU4sKTsKIAotCXIgPSBremFsbG9jKHNpemVvZigqcikgKyBuYW1lbGVuLCBHRlBfS0VSTkVMKTsKKwlyID0ga3phbGxvYyhzaXplb2YoKnIpICsgbmFtZWxlbiwgbHMtPmxzX2FsbG9jYXRpb24pOwogCXJldHVybiByOwogfQogCkBAIC03Miw3ICs3Miw3IEBACiB7CiAJc3RydWN0IGRsbV9sa2IgKmxrYjsKIAotCWxrYiA9IGttZW1fY2FjaGVfemFsbG9jKGxrYl9jYWNoZSwgR0ZQX0tFUk5FTCk7CisJbGtiID0ga21lbV9jYWNoZV96YWxsb2MobGtiX2NhY2hlLCBscy0+bHNfYWxsb2NhdGlvbik7CiAJcmV0dXJuIGxrYjsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvZGxtL21pZGNvbW1zLmMgYi9mcy9kbG0vbWlkY29tbXMuYwppbmRleCAwN2FjNzA5Li5mMzM5NmM2IDEwMDY0NAotLS0gYS9mcy9kbG0vbWlkY29tbXMuYworKysgYi9mcy9kbG0vbWlkY29tbXMuYwpAQCAtMTEyLDcgKzExMiw3IEBACiAJCSAgIG9yZGluYXJ5IG1lc3NhZ2VzKS4gKi8KIAogCQlpZiAobXNnbGVuID4gc2l6ZW9mKF9fdG1wKSAmJiBwID09ICZfX3RtcC5wKSB7Ci0JCQlwID0ga21hbGxvYyhkbG1fY29uZmlnLmNpX2J1ZmZlcl9zaXplLCBHRlBfS0VSTkVMKTsKKwkJCXAgPSBrbWFsbG9jKGRsbV9jb25maWcuY2lfYnVmZmVyX3NpemUsIEdGUF9OT0ZTKTsKIAkJCWlmIChwID09IE5VTEwpCiAJCQkJcmV0dXJuIHJldDsKIAkJfQpkaWZmIC0tZ2l0IGEvZnMvZGxtL25ldGxpbmsuYyBiL2ZzL2RsbS9uZXRsaW5rLmMKaW5kZXggYWEyYTU3Ny4uY2NjOWQ2MiAxMDA2NDQKLS0tIGEvZnMvZGxtL25ldGxpbmsuYworKysgYi9mcy9kbG0vbmV0bGluay5jCkBAIC0xMTUsNyArMTE1LDYgQEAKIAlkYXRhLT5zdGF0dXMgPSBsa2ItPmxrYl9zdGF0dXM7CiAJZGF0YS0+Z3Jtb2RlID0gbGtiLT5sa2JfZ3Jtb2RlOwogCWRhdGEtPnJxbW9kZSA9IGxrYi0+bGtiX3JxbW9kZTsKLQlkYXRhLT50aW1lc3RhbXAgPSBsa2ItPmxrYl90aW1lc3RhbXA7CiAJaWYgKGxrYi0+bGtiX3VhKQogCQlkYXRhLT54aWQgPSBsa2ItPmxrYl91YS0+eGlkOwogCWlmIChyKSB7CmRpZmYgLS1naXQgYS9mcy9kbG0vdXNlci5jIGIvZnMvZGxtL3VzZXIuYwppbmRleCBiMzgzMmM2Li4wNjUxNDllIDEwMDY0NAotLS0gYS9mcy9kbG0vdXNlci5jCisrKyBiL2ZzL2RsbS91c2VyLmMKQEAgLTE3NSw3ICsxNzUsNyBAQAogLyogd2UgY291bGQgcG9zc2libHkgY2hlY2sgaWYgdGhlIGNhbmNlbCBvZiBhbiBvcnBoYW4gaGFzIHJlc3VsdGVkIGluIHRoZSBsa2IKICAgIGJlaW5nIHJlbW92ZWQgYW5kIHRoZW4gcmVtb3ZlIHRoYXQgbGtiIGZyb20gdGhlIG9ycGhhbnMgbGlzdCBhbmQgZnJlZSBpdCAqLwogCi12b2lkIGRsbV91c2VyX2FkZF9hc3Qoc3RydWN0IGRsbV9sa2IgKmxrYiwgaW50IHR5cGUpCit2b2lkIGRsbV91c2VyX2FkZF9hc3Qoc3RydWN0IGRsbV9sa2IgKmxrYiwgaW50IHR5cGUsIGludCBiYXN0bW9kZSkKIHsKIAlzdHJ1Y3QgZGxtX2xzICpsczsKIAlzdHJ1Y3QgZGxtX3VzZXJfYXJncyAqdWE7CkBAIC0yMDgsNiArMjA4LDggQEAKIAogCWFzdF90eXBlID0gbGtiLT5sa2JfYXN0X3R5cGU7CiAJbGtiLT5sa2JfYXN0X3R5cGUgfD0gdHlwZTsKKwlpZiAoYmFzdG1vZGUpCisJCWxrYi0+bGtiX2Jhc3Rtb2RlID0gYmFzdG1vZGU7CiAKIAlpZiAoIWFzdF90eXBlKSB7CiAJCWtyZWZfZ2V0KCZsa2ItPmxrYl9yZWYpOwpkaWZmIC0tZ2l0IGEvZnMvZGxtL3VzZXIuaCBiL2ZzL2RsbS91c2VyLmgKaW5kZXggMzVlYjZhMS4uMWM5Njg2NCAxMDA2NDQKLS0tIGEvZnMvZGxtL3VzZXIuaAorKysgYi9mcy9kbG0vdXNlci5oCkBAIC05LDcgKzksNyBAQAogI2lmbmRlZiBfX1VTRVJfRE9UX0hfXwogI2RlZmluZSBfX1VTRVJfRE9UX0hfXwogCi12b2lkIGRsbV91c2VyX2FkZF9hc3Qoc3RydWN0IGRsbV9sa2IgKmxrYiwgaW50IHR5cGUpOwordm9pZCBkbG1fdXNlcl9hZGRfYXN0KHN0cnVjdCBkbG1fbGtiICpsa2IsIGludCB0eXBlLCBpbnQgYmFzdG1vZGUpOwogaW50IGRsbV91c2VyX2luaXQodm9pZCk7CiB2b2lkIGRsbV91c2VyX2V4aXQodm9pZCk7CiBpbnQgZGxtX2RldmljZV9kZXJlZ2lzdGVyKHN0cnVjdCBkbG1fbHMgKmxzKTsKZGlmZiAtLWdpdCBhL2ZzL2RxdW90LmMgYi9mcy9kcXVvdC5jCmluZGV4IGMyMzdjY2MuLjQ4YzA1NzEgMTAwNjQ0Ci0tLSBhL2ZzL2RxdW90LmMKKysrIGIvZnMvZHF1b3QuYwpAQCAtMjExLDggKzIxMSw2IEBACiAKIHN0cnVjdCBkcXN0YXRzIGRxc3RhdHM7CiAKLXN0YXRpYyB2b2lkIGRxcHV0KHN0cnVjdCBkcXVvdCAqZHF1b3QpOwotCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAogaGFzaGZuKGNvbnN0IHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGludCBpZCwgaW50IHR5cGUpCiB7CkBAIC00MTUsNiArNDEzLDE3IEBACiAJcmV0dXJuIHJldDsKIH0KIAordm9pZCBkcXVvdF9kZXN0cm95KHN0cnVjdCBkcXVvdCAqZHF1b3QpCit7CisJa21lbV9jYWNoZV9mcmVlKGRxdW90X2NhY2hlcCwgZHF1b3QpOworfQorRVhQT1JUX1NZTUJPTChkcXVvdF9kZXN0cm95KTsKKworc3RhdGljIGlubGluZSB2b2lkIGRvX2Rlc3Ryb3lfZHF1b3Qoc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwlkcXVvdC0+ZHFfc2ItPmRxX29wLT5kZXN0cm95X2RxdW90KGRxdW90KTsKK30KKwogLyogSW52YWxpZGF0ZSBhbGwgZHF1b3RzIG9uIHRoZSBsaXN0LiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIKICAqIHF1b3RhIGlzIGRpc2FibGVkIGFuZCBwb2ludGVycyBmcm9tIGlub2RlcyByZW1vdmVkIHNvIHRoZXJlIGNhbm5vdCBiZSBuZXcKICAqIHF1b3RhIHVzZXJzLiBUaGVyZSBjYW4gc3RpbGwgYmUgc29tZSB1c2VycyBvZiBxdW90YXMgZHVlIHRvIGlub2RlcyBiZWluZwpAQCAtNDYzLDExICs0NzIsNDYgQEAKIAkJcmVtb3ZlX2RxdW90X2hhc2goZHF1b3QpOwogCQlyZW1vdmVfZnJlZV9kcXVvdChkcXVvdCk7CiAJCXJlbW92ZV9pbnVzZShkcXVvdCk7Ci0JCWttZW1fY2FjaGVfZnJlZShkcXVvdF9jYWNoZXAsIGRxdW90KTsKKwkJZG9fZGVzdHJveV9kcXVvdChkcXVvdCk7CiAJfQogCXNwaW5fdW5sb2NrKCZkcV9saXN0X2xvY2spOwogfQogCisvKiBDYWxsIGNhbGxiYWNrIGZvciBldmVyeSBhY3RpdmUgZHF1b3Qgb24gZ2l2ZW4gZmlsZXN5c3RlbSAqLworaW50IGRxdW90X3NjYW5fYWN0aXZlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCSAgICAgIGludCAoKmZuKShzdHJ1Y3QgZHF1b3QgKmRxdW90LCB1bnNpZ25lZCBsb25nIHByaXYpLAorCQkgICAgICB1bnNpZ25lZCBsb25nIHByaXYpCit7CisJc3RydWN0IGRxdW90ICpkcXVvdCwgKm9sZF9kcXVvdCA9IE5VTEw7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZzYl9kcW9wdChzYiktPmRxb25vZmZfbXV0ZXgpOworCXNwaW5fbG9jaygmZHFfbGlzdF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRxdW90LCAmaW51c2VfbGlzdCwgZHFfaW51c2UpIHsKKwkJaWYgKCF0ZXN0X2JpdChEUV9BQ1RJVkVfQiwgJmRxdW90LT5kcV9mbGFncykpCisJCQljb250aW51ZTsKKwkJaWYgKGRxdW90LT5kcV9zYiAhPSBzYikKKwkJCWNvbnRpbnVlOworCQkvKiBOb3cgd2UgaGF2ZSBhY3RpdmUgZHF1b3Qgc28gd2UgY2FuIGp1c3QgaW5jcmVhc2UgdXNlIGNvdW50ICovCisJCWF0b21pY19pbmMoJmRxdW90LT5kcV9jb3VudCk7CisJCWRxc3RhdHMubG9va3VwcysrOworCQlzcGluX3VubG9jaygmZHFfbGlzdF9sb2NrKTsKKwkJZHFwdXQob2xkX2RxdW90KTsKKwkJb2xkX2RxdW90ID0gZHF1b3Q7CisJCXJldCA9IGZuKGRxdW90LCBwcml2KTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKKwkJc3Bpbl9sb2NrKCZkcV9saXN0X2xvY2spOworCQkvKiBXZSBhcmUgc2FmZSB0byBjb250aW51ZSBub3cgYmVjYXVzZSBvdXIgZHF1b3QgY291bGQgbm90CisJCSAqIGJlIG1vdmVkIG91dCBvZiB0aGUgaW51c2UgbGlzdCB3aGlsZSB3ZSBob2xkIHRoZSByZWZlcmVuY2UgKi8KKwl9CisJc3Bpbl91bmxvY2soJmRxX2xpc3RfbG9jayk7CitvdXQ6CisJZHFwdXQob2xkX2RxdW90KTsKKwltdXRleF91bmxvY2soJnNiX2Rxb3B0KHNiKS0+ZHFvbm9mZl9tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKwogaW50IHZmc19xdW90YV9zeW5jKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKmRpcnR5OwpAQCAtNDc5LDcgKzUyMyw3IEBACiAJZm9yIChjbnQgPSAwOyBjbnQgPCBNQVhRVU9UQVM7IGNudCsrKSB7CiAJCWlmICh0eXBlICE9IC0xICYmIGNudCAhPSB0eXBlKQogCQkJY29udGludWU7Ci0JCWlmICghc2JfaGFzX3F1b3RhX2VuYWJsZWQoc2IsIGNudCkpCisJCWlmICghc2JfaGFzX3F1b3RhX2FjdGl2ZShzYiwgY250KSkKIAkJCWNvbnRpbnVlOwogCQlzcGluX2xvY2soJmRxX2xpc3RfbG9jayk7CiAJCWRpcnR5ID0gJmRxb3B0LT5pbmZvW2NudF0uZHFpX2RpcnR5X2xpc3Q7CkBAIC01MDQsOCArNTQ4LDggQEAKIAl9CiAKIAlmb3IgKGNudCA9IDA7IGNudCA8IE1BWFFVT1RBUzsgY250KyspCi0JCWlmICgoY250ID09IHR5cGUgfHwgdHlwZSA9PSAtMSkgJiYgc2JfaGFzX3F1b3RhX2VuYWJsZWQoc2IsIGNudCkKLQkJCSYmIGluZm9fZGlydHkoJmRxb3B0LT5pbmZvW2NudF0pKQorCQlpZiAoKGNudCA9PSB0eXBlIHx8IHR5cGUgPT0gLTEpICYmIHNiX2hhc19xdW90YV9hY3RpdmUoc2IsIGNudCkKKwkJICAgICYmIGluZm9fZGlydHkoJmRxb3B0LT5pbmZvW2NudF0pKQogCQkJc2ItPmRxX29wLT53cml0ZV9pbmZvKHNiLCBjbnQpOwogCXNwaW5fbG9jaygmZHFfbGlzdF9sb2NrKTsKIAlkcXN0YXRzLnN5bmNzKys7CkBAIC01MjcsNyArNTcxLDcgQEAKIAkJcmVtb3ZlX2RxdW90X2hhc2goZHF1b3QpOwogCQlyZW1vdmVfZnJlZV9kcXVvdChkcXVvdCk7CiAJCXJlbW92ZV9pbnVzZShkcXVvdCk7Ci0JCWttZW1fY2FjaGVfZnJlZShkcXVvdF9jYWNoZXAsIGRxdW90KTsKKwkJZG9fZGVzdHJveV9kcXVvdChkcXVvdCk7CiAJCWNvdW50LS07CiAJCWhlYWQgPSBmcmVlX2RxdW90cy5wcmV2OwogCX0KQEAgLTU1OCw3ICs2MDIsNyBAQAogICogTk9URTogSWYgeW91IGNoYW5nZSB0aGlzIGZ1bmN0aW9uIHBsZWFzZSBjaGVjayB3aGV0aGVyIGRxcHV0X2Jsb2NrcygpIHdvcmtzIHJpZ2h0Li4uCiAgKiBNVVNUIGJlIGNhbGxlZCB3aXRoIGVpdGhlciBkcXB0cl9zZW0gb3IgZHFvbm9mZl9tdXRleCBoZWxkCiAgKi8KLXN0YXRpYyB2b2lkIGRxcHV0KHN0cnVjdCBkcXVvdCAqZHF1b3QpCit2b2lkIGRxcHV0KHN0cnVjdCBkcXVvdCAqZHF1b3QpCiB7CiAJaW50IHJldDsKIApAQCAtNTg0LDcgKzYyOCw3IEBACiAJCS8qIFdlIGhhdmUgbW9yZSB0aGFuIG9uZSB1c2VyLi4uIG5vdGhpbmcgdG8gZG8gKi8KIAkJYXRvbWljX2RlYygmZHF1b3QtPmRxX2NvdW50KTsKIAkJLyogUmVsZWFzaW5nIGRxdW90IGR1cmluZyBxdW90YW9mZiBwaGFzZT8gKi8KLQkJaWYgKCFzYl9oYXNfcXVvdGFfZW5hYmxlZChkcXVvdC0+ZHFfc2IsIGRxdW90LT5kcV90eXBlKSAmJgorCQlpZiAoIXNiX2hhc19xdW90YV9hY3RpdmUoZHF1b3QtPmRxX3NiLCBkcXVvdC0+ZHFfdHlwZSkgJiYKIAkJICAgIGF0b21pY19yZWFkKCZkcXVvdC0+ZHFfY291bnQpID09IDEpCiAJCQl3YWtlX3VwKCZkcXVvdC0+ZHFfd2FpdF91bnVzZWQpOwogCQlzcGluX3VubG9jaygmZHFfbGlzdF9sb2NrKTsKQEAgLTYyNSwxMSArNjY5LDE3IEBACiAJc3Bpbl91bmxvY2soJmRxX2xpc3RfbG9jayk7CiB9CiAKK3N0cnVjdCBkcXVvdCAqZHF1b3RfYWxsb2Moc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpCit7CisJcmV0dXJuIGttZW1fY2FjaGVfemFsbG9jKGRxdW90X2NhY2hlcCwgR0ZQX05PRlMpOworfQorRVhQT1JUX1NZTUJPTChkcXVvdF9hbGxvYyk7CisKIHN0YXRpYyBzdHJ1Y3QgZHF1b3QgKmdldF9lbXB0eV9kcXVvdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKIHsKIAlzdHJ1Y3QgZHF1b3QgKmRxdW90OwogCi0JZHF1b3QgPSBrbWVtX2NhY2hlX3phbGxvYyhkcXVvdF9jYWNoZXAsIEdGUF9OT0ZTKTsKKwlkcXVvdCA9IHNiLT5kcV9vcC0+YWxsb2NfZHF1b3Qoc2IsIHR5cGUpOwogCWlmKCFkcXVvdCkKIAkJcmV0dXJuIE5PRFFVT1Q7CiAKQEAgLTY0NywxNSArNjk3LDMzIEBACiB9CiAKIC8qCisgKiBDaGVjayB3aGV0aGVyIGRxdW90IGlzIGluIG1lbW9yeS4KKyAqIE1VU1QgYmUgY2FsbGVkIHdpdGggZWl0aGVyIGRxcHRyX3NlbSBvciBkcW9ub2ZmX211dGV4IGhlbGQKKyAqLworaW50IGRxdW90X2lzX2NhY2hlZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBpbnQgaWQsIGludCB0eXBlKQoreworCXVuc2lnbmVkIGludCBoYXNoZW50ID0gaGFzaGZuKHNiLCBpZCwgdHlwZSk7CisJaW50IHJldCA9IDA7CisKKyAgICAgICAgaWYgKCFzYl9oYXNfcXVvdGFfYWN0aXZlKHNiLCB0eXBlKSkKKwkJcmV0dXJuIDA7CisJc3Bpbl9sb2NrKCZkcV9saXN0X2xvY2spOworCWlmIChmaW5kX2RxdW90KGhhc2hlbnQsIHNiLCBpZCwgdHlwZSkgIT0gTk9EUVVPVCkKKwkJcmV0ID0gMTsKKwlzcGluX3VubG9jaygmZHFfbGlzdF9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgogICogR2V0IHJlZmVyZW5jZSB0byBkcXVvdAogICogTVVTVCBiZSBjYWxsZWQgd2l0aCBlaXRoZXIgZHFwdHJfc2VtIG9yIGRxb25vZmZfbXV0ZXggaGVsZAogICovCi1zdGF0aWMgc3RydWN0IGRxdW90ICpkcWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBpbnQgaWQsIGludCB0eXBlKQorc3RydWN0IGRxdW90ICpkcWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBpbnQgaWQsIGludCB0eXBlKQogewogCXVuc2lnbmVkIGludCBoYXNoZW50ID0gaGFzaGZuKHNiLCBpZCwgdHlwZSk7CiAJc3RydWN0IGRxdW90ICpkcXVvdCwgKmVtcHR5ID0gTk9EUVVPVDsKIAotICAgICAgICBpZiAoIXNiX2hhc19xdW90YV9lbmFibGVkKHNiLCB0eXBlKSkKKyAgICAgICAgaWYgKCFzYl9oYXNfcXVvdGFfYWN0aXZlKHNiLCB0eXBlKSkKIAkJcmV0dXJuIE5PRFFVT1Q7CiB3ZV9zbGVwdDoKIAlzcGluX2xvY2soJmRxX2xpc3RfbG9jayk7CkBAIC02ODIsNyArNzUwLDcgQEAKIAkJZHFzdGF0cy5sb29rdXBzKys7CiAJCXNwaW5fdW5sb2NrKCZkcV9saXN0X2xvY2spOwogCQlpZiAoZW1wdHkpCi0JCQlrbWVtX2NhY2hlX2ZyZWUoZHF1b3RfY2FjaGVwLCBlbXB0eSk7CisJCQlkb19kZXN0cm95X2RxdW90KGVtcHR5KTsKIAl9CiAJLyogV2FpdCBmb3IgZHFfbG9jayAtIGFmdGVyIHRoaXMgd2Uga25vdyB0aGF0IGVpdGhlciBkcXVvdF9yZWxlYXNlKCkgaXMgYWxyZWFkeQogCSAqIGZpbmlzaGVkIG9yIGl0IHdpbGwgYmUgY2FuY2VsZWQgZHVlIHRvIGRxX2NvdW50ID4gMSB0ZXN0ICovCkBAIC04MjAsNyArODg4LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBkcXVvdF9pbmNyX2lub2RlcyhzdHJ1Y3QgZHF1b3QgKmRxdW90LCB1bnNpZ25lZCBsb25nIG51bWJlcikKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcXVvdF9pbmNyX2lub2RlcyhzdHJ1Y3QgZHF1b3QgKmRxdW90LCBxc2l6ZV90IG51bWJlcikKIHsKIAlkcXVvdC0+ZHFfZHFiLmRxYl9jdXJpbm9kZXMgKz0gbnVtYmVyOwogfQpAQCAtODMwLDkgKzg5OCwxMCBAQAogCWRxdW90LT5kcV9kcWIuZHFiX2N1cnNwYWNlICs9IG51bWJlcjsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGRxdW90X2RlY3JfaW5vZGVzKHN0cnVjdCBkcXVvdCAqZHF1b3QsIHVuc2lnbmVkIGxvbmcgbnVtYmVyKQorc3RhdGljIGlubGluZSB2b2lkIGRxdW90X2RlY3JfaW5vZGVzKHN0cnVjdCBkcXVvdCAqZHF1b3QsIHFzaXplX3QgbnVtYmVyKQogewotCWlmIChkcXVvdC0+ZHFfZHFiLmRxYl9jdXJpbm9kZXMgPiBudW1iZXIpCisJaWYgKHNiX2Rxb3B0KGRxdW90LT5kcV9zYiktPmZsYWdzICYgRFFVT1RfTkVHQVRJVkVfVVNBR0UgfHwKKwkgICAgZHF1b3QtPmRxX2RxYi5kcWJfY3VyaW5vZGVzID49IG51bWJlcikKIAkJZHF1b3QtPmRxX2RxYi5kcWJfY3VyaW5vZGVzIC09IG51bWJlcjsKIAllbHNlCiAJCWRxdW90LT5kcV9kcWIuZHFiX2N1cmlub2RlcyA9IDA7CkBAIC04NDMsMTEgKzkxMiwxMiBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgZHF1b3RfZGVjcl9zcGFjZShzdHJ1Y3QgZHF1b3QgKmRxdW90LCBxc2l6ZV90IG51bWJlcikKIHsKLQlpZiAoZHF1b3QtPmRxX2RxYi5kcWJfY3Vyc3BhY2UgPiBudW1iZXIpCisJaWYgKHNiX2Rxb3B0KGRxdW90LT5kcV9zYiktPmZsYWdzICYgRFFVT1RfTkVHQVRJVkVfVVNBR0UgfHwKKwkgICAgZHF1b3QtPmRxX2RxYi5kcWJfY3Vyc3BhY2UgPj0gbnVtYmVyKQogCQlkcXVvdC0+ZHFfZHFiLmRxYl9jdXJzcGFjZSAtPSBudW1iZXI7CiAJZWxzZQogCQlkcXVvdC0+ZHFfZHFiLmRxYl9jdXJzcGFjZSA9IDA7Ci0JaWYgKHRvcWIoZHF1b3QtPmRxX2RxYi5kcWJfY3Vyc3BhY2UpIDw9IGRxdW90LT5kcV9kcWIuZHFiX2Jzb2Z0bGltaXQpCisJaWYgKGRxdW90LT5kcV9kcWIuZHFiX2N1cnNwYWNlIDw9IGRxdW90LT5kcV9kcWIuZHFiX2Jzb2Z0bGltaXQpCiAJCWRxdW90LT5kcV9kcWIuZHFiX2J0aW1lID0gKHRpbWVfdCkgMDsKIAljbGVhcl9iaXQoRFFfQkxLU19CLCAmZHF1b3QtPmRxX2ZsYWdzKTsKIH0KQEAgLTEwMjMsMTAgKzEwOTMsMTEgQEAKIH0KIAogLyogbmVlZHMgZHFfZGF0YV9sb2NrICovCi1zdGF0aWMgaW50IGNoZWNrX2lkcShzdHJ1Y3QgZHF1b3QgKmRxdW90LCB1bG9uZyBpbm9kZXMsIGNoYXIgKndhcm50eXBlKQorc3RhdGljIGludCBjaGVja19pZHEoc3RydWN0IGRxdW90ICpkcXVvdCwgcXNpemVfdCBpbm9kZXMsIGNoYXIgKndhcm50eXBlKQogewogCSp3YXJudHlwZSA9IFFVT1RBX05MX05PV0FSTjsKLQlpZiAoaW5vZGVzIDw9IDAgfHwgdGVzdF9iaXQoRFFfRkFLRV9CLCAmZHF1b3QtPmRxX2ZsYWdzKSkKKwlpZiAoIXNiX2hhc19xdW90YV9saW1pdHNfZW5hYmxlZChkcXVvdC0+ZHFfc2IsIGRxdW90LT5kcV90eXBlKSB8fAorCSAgICB0ZXN0X2JpdChEUV9GQUtFX0IsICZkcXVvdC0+ZHFfZmxhZ3MpKQogCQlyZXR1cm4gUVVPVEFfT0s7CiAKIAlpZiAoZHF1b3QtPmRxX2RxYi5kcWJfaWhhcmRsaW1pdCAmJgpAQCAtMTA1OCwxMSArMTEyOSwxMiBAQAogc3RhdGljIGludCBjaGVja19iZHEoc3RydWN0IGRxdW90ICpkcXVvdCwgcXNpemVfdCBzcGFjZSwgaW50IHByZWFsbG9jLCBjaGFyICp3YXJudHlwZSkKIHsKIAkqd2FybnR5cGUgPSBRVU9UQV9OTF9OT1dBUk47Ci0JaWYgKHNwYWNlIDw9IDAgfHwgdGVzdF9iaXQoRFFfRkFLRV9CLCAmZHF1b3QtPmRxX2ZsYWdzKSkKKwlpZiAoIXNiX2hhc19xdW90YV9saW1pdHNfZW5hYmxlZChkcXVvdC0+ZHFfc2IsIGRxdW90LT5kcV90eXBlKSB8fAorCSAgICB0ZXN0X2JpdChEUV9GQUtFX0IsICZkcXVvdC0+ZHFfZmxhZ3MpKQogCQlyZXR1cm4gUVVPVEFfT0s7CiAKIAlpZiAoZHF1b3QtPmRxX2RxYi5kcWJfYmhhcmRsaW1pdCAmJgotCSAgIHRvcWIoZHF1b3QtPmRxX2RxYi5kcWJfY3Vyc3BhY2UgKyBzcGFjZSkgPiBkcXVvdC0+ZHFfZHFiLmRxYl9iaGFyZGxpbWl0ICYmCisJICAgIGRxdW90LT5kcV9kcWIuZHFiX2N1cnNwYWNlICsgc3BhY2UgPiBkcXVvdC0+ZHFfZHFiLmRxYl9iaGFyZGxpbWl0ICYmCiAgICAgICAgICAgICAhaWdub3JlX2hhcmRsaW1pdChkcXVvdCkpIHsKIAkJaWYgKCFwcmVhbGxvYykKIAkJCSp3YXJudHlwZSA9IFFVT1RBX05MX0JIQVJEV0FSTjsKQEAgLTEwNzAsNyArMTE0Miw3IEBACiAJfQogCiAJaWYgKGRxdW90LT5kcV9kcWIuZHFiX2Jzb2Z0bGltaXQgJiYKLQkgICB0b3FiKGRxdW90LT5kcV9kcWIuZHFiX2N1cnNwYWNlICsgc3BhY2UpID4gZHF1b3QtPmRxX2RxYi5kcWJfYnNvZnRsaW1pdCAmJgorCSAgICBkcXVvdC0+ZHFfZHFiLmRxYl9jdXJzcGFjZSArIHNwYWNlID4gZHF1b3QtPmRxX2RxYi5kcWJfYnNvZnRsaW1pdCAmJgogCSAgICBkcXVvdC0+ZHFfZHFiLmRxYl9idGltZSAmJiBnZXRfc2Vjb25kcygpID49IGRxdW90LT5kcV9kcWIuZHFiX2J0aW1lICYmCiAgICAgICAgICAgICAhaWdub3JlX2hhcmRsaW1pdChkcXVvdCkpIHsKIAkJaWYgKCFwcmVhbGxvYykKQEAgLTEwNzksNyArMTE1MSw3IEBACiAJfQogCiAJaWYgKGRxdW90LT5kcV9kcWIuZHFiX2Jzb2Z0bGltaXQgJiYKLQkgICB0b3FiKGRxdW90LT5kcV9kcWIuZHFiX2N1cnNwYWNlICsgc3BhY2UpID4gZHF1b3QtPmRxX2RxYi5kcWJfYnNvZnRsaW1pdCAmJgorCSAgICBkcXVvdC0+ZHFfZHFiLmRxYl9jdXJzcGFjZSArIHNwYWNlID4gZHF1b3QtPmRxX2RxYi5kcWJfYnNvZnRsaW1pdCAmJgogCSAgICBkcXVvdC0+ZHFfZHFiLmRxYl9idGltZSA9PSAwKSB7CiAJCWlmICghcHJlYWxsb2MpIHsKIAkJCSp3YXJudHlwZSA9IFFVT1RBX05MX0JTT0ZUV0FSTjsKQEAgLTEwOTYsMTAgKzExNjgsMTEgQEAKIAlyZXR1cm4gUVVPVEFfT0s7CiB9CiAKLXN0YXRpYyBpbnQgaW5mb19pZHFfZnJlZShzdHJ1Y3QgZHF1b3QgKmRxdW90LCB1bG9uZyBpbm9kZXMpCitzdGF0aWMgaW50IGluZm9faWRxX2ZyZWUoc3RydWN0IGRxdW90ICpkcXVvdCwgcXNpemVfdCBpbm9kZXMpCiB7CiAJaWYgKHRlc3RfYml0KERRX0ZBS0VfQiwgJmRxdW90LT5kcV9mbGFncykgfHwKLQkgICAgZHF1b3QtPmRxX2RxYi5kcWJfY3VyaW5vZGVzIDw9IGRxdW90LT5kcV9kcWIuZHFiX2lzb2Z0bGltaXQpCisJICAgIGRxdW90LT5kcV9kcWIuZHFiX2N1cmlub2RlcyA8PSBkcXVvdC0+ZHFfZHFiLmRxYl9pc29mdGxpbWl0IHx8CisJICAgICFzYl9oYXNfcXVvdGFfbGltaXRzX2VuYWJsZWQoZHF1b3QtPmRxX3NiLCBkcXVvdC0+ZHFfdHlwZSkpCiAJCXJldHVybiBRVU9UQV9OTF9OT1dBUk47CiAKIAlpZiAoZHF1b3QtPmRxX2RxYi5kcWJfY3VyaW5vZGVzIC0gaW5vZGVzIDw9IGRxdW90LT5kcV9kcWIuZHFiX2lzb2Z0bGltaXQpCkBAIC0xMTEzLDE1ICsxMTg2LDEzIEBACiBzdGF0aWMgaW50IGluZm9fYmRxX2ZyZWUoc3RydWN0IGRxdW90ICpkcXVvdCwgcXNpemVfdCBzcGFjZSkKIHsKIAlpZiAodGVzdF9iaXQoRFFfRkFLRV9CLCAmZHF1b3QtPmRxX2ZsYWdzKSB8fAotCSAgICB0b3FiKGRxdW90LT5kcV9kcWIuZHFiX2N1cnNwYWNlKSA8PSBkcXVvdC0+ZHFfZHFiLmRxYl9ic29mdGxpbWl0KQorCSAgICBkcXVvdC0+ZHFfZHFiLmRxYl9jdXJzcGFjZSA8PSBkcXVvdC0+ZHFfZHFiLmRxYl9ic29mdGxpbWl0KQogCQlyZXR1cm4gUVVPVEFfTkxfTk9XQVJOOwogCi0JaWYgKHRvcWIoZHF1b3QtPmRxX2RxYi5kcWJfY3Vyc3BhY2UgLSBzcGFjZSkgPD0KLQkgICAgZHF1b3QtPmRxX2RxYi5kcWJfYnNvZnRsaW1pdCkKKwlpZiAoZHF1b3QtPmRxX2RxYi5kcWJfY3Vyc3BhY2UgLSBzcGFjZSA8PSBkcXVvdC0+ZHFfZHFiLmRxYl9ic29mdGxpbWl0KQogCQlyZXR1cm4gUVVPVEFfTkxfQlNPRlRCRUxPVzsKLQlpZiAodG9xYihkcXVvdC0+ZHFfZHFiLmRxYl9jdXJzcGFjZSkgPj0gZHF1b3QtPmRxX2RxYi5kcWJfYmhhcmRsaW1pdCAmJgotCSAgICB0b3FiKGRxdW90LT5kcV9kcWIuZHFiX2N1cnNwYWNlIC0gc3BhY2UpIDwKLQkJCQkJCWRxdW90LT5kcV9kcWIuZHFiX2JoYXJkbGltaXQpCisJaWYgKGRxdW90LT5kcV9kcWIuZHFiX2N1cnNwYWNlID49IGRxdW90LT5kcV9kcWIuZHFiX2JoYXJkbGltaXQgJiYKKwkgICAgZHF1b3QtPmRxX2RxYi5kcWJfY3Vyc3BhY2UgLSBzcGFjZSA8IGRxdW90LT5kcV9kcWIuZHFiX2JoYXJkbGltaXQpCiAJCXJldHVybiBRVU9UQV9OTF9CSEFSREJFTE9XOwogCXJldHVybiBRVU9UQV9OTF9OT1dBUk47CiB9CkBAIC0xMTY2LDE3ICsxMjM3LDIzIEBACiAgKiAJUmVsZWFzZSBhbGwgcXVvdGFzIHJlZmVyZW5jZWQgYnkgaW5vZGUKICAqCVRyYW5zYWN0aW9uIG11c3QgYmUgc3RhcnRlZCBhdCBhbiBlbnRyeQogICovCi1pbnQgZHF1b3RfZHJvcChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoraW50IGRxdW90X2Ryb3BfbG9ja2VkKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJaW50IGNudDsKIAotCWRvd25fd3JpdGUoJnNiX2Rxb3B0KGlub2RlLT5pX3NiKS0+ZHFwdHJfc2VtKTsKIAlmb3IgKGNudCA9IDA7IGNudCA8IE1BWFFVT1RBUzsgY250KyspIHsKIAkJaWYgKGlub2RlLT5pX2RxdW90W2NudF0gIT0gTk9EUVVPVCkgewogCQkJZHFwdXQoaW5vZGUtPmlfZHF1b3RbY250XSk7CiAJCQlpbm9kZS0+aV9kcXVvdFtjbnRdID0gTk9EUVVPVDsKIAkJfQogCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGRxdW90X2Ryb3Aoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlkb3duX3dyaXRlKCZzYl9kcW9wdChpbm9kZS0+aV9zYiktPmRxcHRyX3NlbSk7CisJZHF1b3RfZHJvcF9sb2NrZWQoaW5vZGUpOwogCXVwX3dyaXRlKCZzYl9kcW9wdChpbm9kZS0+aV9zYiktPmRxcHRyX3NlbSk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xMjY0LDcgKzEzNDEsNyBAQAogLyoKICAqIFRoaXMgb3BlcmF0aW9uIGNhbiBibG9jaywgYnV0IG9ubHkgYWZ0ZXIgZXZlcnl0aGluZyBpcyB1cGRhdGVkCiAgKi8KLWludCBkcXVvdF9hbGxvY19pbm9kZShjb25zdCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBsb25nIG51bWJlcikKK2ludCBkcXVvdF9hbGxvY19pbm9kZShjb25zdCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBxc2l6ZV90IG51bWJlcikKIHsKIAlpbnQgY250LCByZXQgPSBOT19RVU9UQTsKIAljaGFyIHdhcm50eXBlW01BWFFVT1RBU107CkBAIC0xMzQ5LDcgKzE0MjYsNyBAQAogLyoKICAqIFRoaXMgb3BlcmF0aW9uIGNhbiBibG9jaywgYnV0IG9ubHkgYWZ0ZXIgZXZlcnl0aGluZyBpcyB1cGRhdGVkCiAgKi8KLWludCBkcXVvdF9mcmVlX2lub2RlKGNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGxvbmcgbnVtYmVyKQoraW50IGRxdW90X2ZyZWVfaW5vZGUoY29uc3Qgc3RydWN0IGlub2RlICppbm9kZSwgcXNpemVfdCBudW1iZXIpCiB7CiAJdW5zaWduZWQgaW50IGNudDsKIAljaGFyIHdhcm50eXBlW01BWFFVT1RBU107CkBAIC0xNDk1LDcgKzE1NzIsNyBAQAogLyogV3JhcHBlciBmb3IgdHJhbnNmZXJyaW5nIG93bmVyc2hpcCBvZiBhbiBpbm9kZSAqLwogaW50IHZmc19kcV90cmFuc2ZlcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaWF0dHIgKmlhdHRyKQogewotCWlmIChzYl9hbnlfcXVvdGFfZW5hYmxlZChpbm9kZS0+aV9zYikgJiYgIUlTX05PUVVPVEEoaW5vZGUpKSB7CisJaWYgKHNiX2FueV9xdW90YV9hY3RpdmUoaW5vZGUtPmlfc2IpICYmICFJU19OT1FVT1RBKGlub2RlKSkgewogCQl2ZnNfZHFfaW5pdChpbm9kZSk7CiAJCWlmIChpbm9kZS0+aV9zYi0+ZHFfb3AtPnRyYW5zZmVyKGlub2RlLCBpYXR0cikgPT0gTk9fUVVPVEEpCiAJCQlyZXR1cm4gMTsKQEAgLTE1MzMsNTQgKzE2MTAsMjcgQEAKIAkuYWNxdWlyZV9kcXVvdAk9IGRxdW90X2FjcXVpcmUsCiAJLnJlbGVhc2VfZHF1b3QJPSBkcXVvdF9yZWxlYXNlLAogCS5tYXJrX2RpcnR5CT0gZHF1b3RfbWFya19kcXVvdF9kaXJ0eSwKLQkud3JpdGVfaW5mbwk9IGRxdW90X2NvbW1pdF9pbmZvCisJLndyaXRlX2luZm8JPSBkcXVvdF9jb21taXRfaW5mbywKKwkuYWxsb2NfZHF1b3QJPSBkcXVvdF9hbGxvYywKKwkuZGVzdHJveV9kcXVvdAk9IGRxdW90X2Rlc3Ryb3ksCiB9OwogCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X2VuYWJsZV9mbGFncyhzdHJ1Y3QgcXVvdGFfaW5mbyAqZHFvcHQsIGludCB0eXBlKQotewotCXN3aXRjaCAodHlwZSkgewotCQljYXNlIFVTUlFVT1RBOgotCQkJZHFvcHQtPmZsYWdzIHw9IERRVU9UX1VTUl9FTkFCTEVEOwotCQkJZHFvcHQtPmZsYWdzICY9IH5EUVVPVF9VU1JfU1VTUEVOREVEOwotCQkJYnJlYWs7Ci0JCWNhc2UgR1JQUVVPVEE6Ci0JCQlkcW9wdC0+ZmxhZ3MgfD0gRFFVT1RfR1JQX0VOQUJMRUQ7Ci0JCQlkcW9wdC0+ZmxhZ3MgJj0gfkRRVU9UX0dSUF9TVVNQRU5ERUQ7Ci0JCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCByZXNldF9lbmFibGVfZmxhZ3Moc3RydWN0IHF1b3RhX2luZm8gKmRxb3B0LCBpbnQgdHlwZSwKLQkJCQkgICAgICBpbnQgcmVtb3VudCkKLXsKLQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSBVU1JRVU9UQToKLQkJCWRxb3B0LT5mbGFncyAmPSB+RFFVT1RfVVNSX0VOQUJMRUQ7Ci0JCQlpZiAocmVtb3VudCkKLQkJCQlkcW9wdC0+ZmxhZ3MgfD0gRFFVT1RfVVNSX1NVU1BFTkRFRDsKLQkJCWVsc2UKLQkJCQlkcW9wdC0+ZmxhZ3MgJj0gfkRRVU9UX1VTUl9TVVNQRU5ERUQ7Ci0JCQlicmVhazsKLQkJY2FzZSBHUlBRVU9UQToKLQkJCWRxb3B0LT5mbGFncyAmPSB+RFFVT1RfR1JQX0VOQUJMRUQ7Ci0JCQlpZiAocmVtb3VudCkKLQkJCQlkcW9wdC0+ZmxhZ3MgfD0gRFFVT1RfR1JQX1NVU1BFTkRFRDsKLQkJCWVsc2UKLQkJCQlkcW9wdC0+ZmxhZ3MgJj0gfkRRVU9UX0dSUF9TVVNQRU5ERUQ7Ci0JCQlicmVhazsKLQl9Ci19Ci0KLQogLyoKICAqIFR1cm4gcXVvdGEgb2ZmIG9uIGEgZGV2aWNlLiB0eXBlID09IC0xID09PiBxdW90YW9mZiBmb3IgYWxsIHR5cGVzICh1bW91bnQpCiAgKi8KLWludCB2ZnNfcXVvdGFfb2ZmKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLCBpbnQgcmVtb3VudCkKK2ludCB2ZnNfcXVvdGFfZGlzYWJsZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IGZsYWdzKQogewogCWludCBjbnQsIHJldCA9IDA7CiAJc3RydWN0IHF1b3RhX2luZm8gKmRxb3B0ID0gc2JfZHFvcHQoc2IpOwogCXN0cnVjdCBpbm9kZSAqdG9wdXRpbm9kZVtNQVhRVU9UQVNdOwogCisJLyogQ2Fubm90IHR1cm4gb2ZmIHVzYWdlIGFjY291bnRpbmcgd2l0aG91dCB0dXJuaW5nIG9mZiBsaW1pdHMsIG9yCisJICogc3VzcGVuZCBxdW90YXMgYW5kIHNpbXVsdGFuZW91c2x5IHR1cm4gcXVvdGFzIG9mZi4gKi8KKwlpZiAoKGZsYWdzICYgRFFVT1RfVVNBR0VfRU5BQkxFRCAmJiAhKGZsYWdzICYgRFFVT1RfTElNSVRTX0VOQUJMRUQpKQorCSAgICB8fCAoZmxhZ3MgJiBEUVVPVF9TVVNQRU5ERUQgJiYgZmxhZ3MgJiAoRFFVT1RfTElNSVRTX0VOQUJMRUQgfAorCSAgICBEUVVPVF9VU0FHRV9FTkFCTEVEKSkpCisJCXJldHVybiAtRUlOVkFMOworCiAJLyogV2UgbmVlZCB0byBzZXJpYWxpemUgcXVvdGFfb2ZmKCkgZm9yIGRldmljZSAqLwogCW11dGV4X2xvY2soJmRxb3B0LT5kcW9ub2ZmX211dGV4KTsKIApAQCAtMTU4OSw3ICsxNjM5LDcgQEAKIAkgKiBzb21ldGltZXMgd2UgYXJlIGNhbGxlZCB3aGVuIGZpbGxfc3VwZXIoKSBmYWlsZWQgYW5kIGNhbGxpbmcKIAkgKiBzeW5jX2ZzKCkgaW4gc3VjaCBjYXNlcyBkb2VzIG5vIGdvb2QuCiAJICovCi0JaWYgKCFzYl9hbnlfcXVvdGFfZW5hYmxlZChzYikgJiYgIXNiX2FueV9xdW90YV9zdXNwZW5kZWQoc2IpKSB7CisJaWYgKCFzYl9hbnlfcXVvdGFfbG9hZGVkKHNiKSkgewogCQltdXRleF91bmxvY2soJmRxb3B0LT5kcW9ub2ZmX211dGV4KTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMTU5NywxNyArMTY0NywyOCBAQAogCQl0b3B1dGlub2RlW2NudF0gPSBOVUxMOwogCQlpZiAodHlwZSAhPSAtMSAmJiBjbnQgIT0gdHlwZSkKIAkJCWNvbnRpbnVlOwotCQkvKiBJZiB3ZSBrZWVwIGlub2RlcyBvZiBxdW90YSBmaWxlcyBhZnRlciByZW1vdW50IGFuZCBxdW90YW9mZgotCQkgKiBpcyBjYWxsZWQsIGRyb3Aga2VwdCBpbm9kZXMuICovCi0JCWlmICghcmVtb3VudCAmJiBzYl9oYXNfcXVvdGFfc3VzcGVuZGVkKHNiLCBjbnQpKSB7Ci0JCQlpcHV0KGRxb3B0LT5maWxlc1tjbnRdKTsKLQkJCWRxb3B0LT5maWxlc1tjbnRdID0gTlVMTDsKLQkJCXJlc2V0X2VuYWJsZV9mbGFncyhkcW9wdCwgY250LCAwKTsKKwkJaWYgKCFzYl9oYXNfcXVvdGFfbG9hZGVkKHNiLCBjbnQpKQogCQkJY29udGludWU7CisKKwkJaWYgKGZsYWdzICYgRFFVT1RfU1VTUEVOREVEKSB7CisJCQlkcW9wdC0+ZmxhZ3MgfD0KKwkJCQlkcXVvdF9zdGF0ZV9mbGFnKERRVU9UX1NVU1BFTkRFRCwgY250KTsKKwkJfSBlbHNlIHsKKwkJCWRxb3B0LT5mbGFncyAmPSB+ZHF1b3Rfc3RhdGVfZmxhZyhmbGFncywgY250KTsKKwkJCS8qIFR1cm5pbmcgb2ZmIHN1c3BlbmRlZCBxdW90YXM/ICovCisJCQlpZiAoIXNiX2hhc19xdW90YV9sb2FkZWQoc2IsIGNudCkgJiYKKwkJCSAgICBzYl9oYXNfcXVvdGFfc3VzcGVuZGVkKHNiLCBjbnQpKSB7CisJCQkJZHFvcHQtPmZsYWdzICY9CX5kcXVvdF9zdGF0ZV9mbGFnKAorCQkJCQkJCURRVU9UX1NVU1BFTkRFRCwgY250KTsKKwkJCQlpcHV0KGRxb3B0LT5maWxlc1tjbnRdKTsKKwkJCQlkcW9wdC0+ZmlsZXNbY250XSA9IE5VTEw7CisJCQkJY29udGludWU7CisJCQl9CiAJCX0KLQkJaWYgKCFzYl9oYXNfcXVvdGFfZW5hYmxlZChzYiwgY250KSkKKworCQkvKiBXZSBzdGlsbCBoYXZlIHRvIGtlZXAgcXVvdGEgbG9hZGVkPyAqLworCQlpZiAoc2JfaGFzX3F1b3RhX2xvYWRlZChzYiwgY250KSAmJiAhKGZsYWdzICYgRFFVT1RfU1VTUEVOREVEKSkKIAkJCWNvbnRpbnVlOwotCQlyZXNldF9lbmFibGVfZmxhZ3MoZHFvcHQsIGNudCwgcmVtb3VudCk7CiAKIAkJLyogTm90ZTogdGhlc2UgYXJlIGJsb2NraW5nIG9wZXJhdGlvbnMgKi8KIAkJZHJvcF9kcXVvdF9yZWYoc2IsIGNudCk7CkBAIC0xNjIzLDcgKzE2ODQsNyBAQAogCQlwdXRfcXVvdGFfZm9ybWF0KGRxb3B0LT5pbmZvW2NudF0uZHFpX2Zvcm1hdCk7CiAKIAkJdG9wdXRpbm9kZVtjbnRdID0gZHFvcHQtPmZpbGVzW2NudF07Ci0JCWlmICghcmVtb3VudCkKKwkJaWYgKCFzYl9oYXNfcXVvdGFfbG9hZGVkKHNiLCBjbnQpKQogCQkJZHFvcHQtPmZpbGVzW2NudF0gPSBOVUxMOwogCQlkcW9wdC0+aW5mb1tjbnRdLmRxaV9mbGFncyA9IDA7CiAJCWRxb3B0LT5pbmZvW2NudF0uZHFpX2lncmFjZSA9IDA7CkBAIC0xNjMxLDYgKzE2OTIsMTEgQEAKIAkJZHFvcHQtPm9wc1tjbnRdID0gTlVMTDsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZkcW9wdC0+ZHFvbm9mZl9tdXRleCk7CisKKwkvKiBTa2lwIHN5bmNpbmcgYW5kIHNldHRpbmcgZmxhZ3MgaWYgcXVvdGEgZmlsZXMgYXJlIGhpZGRlbiAqLworCWlmIChkcW9wdC0+ZmxhZ3MgJiBEUVVPVF9RVU9UQV9TWVNfRklMRSkKKwkJZ290byBwdXRfaW5vZGVzOworCiAJLyogU3luYyB0aGUgc3VwZXJibG9jayBzbyB0aGF0IGJ1ZmZlcnMgd2l0aCBxdW90YSBkYXRhIGFyZSB3cml0dGVuIHRvCiAJICogZGlzayAoYW5kIHNvIHVzZXJzcGFjZSBzZWVzIGNvcnJlY3QgZGF0YSBhZnRlcndhcmRzKS4gKi8KIAlpZiAoc2ItPnNfb3AtPnN5bmNfZnMpCkBAIC0xNjQ2LDcgKzE3MTIsNyBAQAogCQkJbXV0ZXhfbG9jaygmZHFvcHQtPmRxb25vZmZfbXV0ZXgpOwogCQkJLyogSWYgcXVvdGEgd2FzIHJlZW5hYmxlZCBpbiB0aGUgbWVhbnRpbWUsIHdlIGhhdmUKIAkJCSAqIG5vdGhpbmcgdG8gZG8gKi8KLQkJCWlmICghc2JfaGFzX3F1b3RhX2VuYWJsZWQoc2IsIGNudCkpIHsKKwkJCWlmICghc2JfaGFzX3F1b3RhX2xvYWRlZChzYiwgY250KSkgewogCQkJCW11dGV4X2xvY2tfbmVzdGVkKCZ0b3B1dGlub2RlW2NudF0tPmlfbXV0ZXgsIElfTVVURVhfUVVPVEEpOwogCQkJCXRvcHV0aW5vZGVbY250XS0+aV9mbGFncyAmPSB+KFNfSU1NVVRBQkxFIHwKIAkJCQkgIFNfTk9BVElNRSB8IFNfTk9RVU9UQSk7CkBAIC0xNjU1LDI2ICsxNzIxLDQzIEBACiAJCQkJbWFya19pbm9kZV9kaXJ0eSh0b3B1dGlub2RlW2NudF0pOwogCQkJfQogCQkJbXV0ZXhfdW5sb2NrKCZkcW9wdC0+ZHFvbm9mZl9tdXRleCk7CisJCX0KKwlpZiAoc2ItPnNfYmRldikKKwkJaW52YWxpZGF0ZV9iZGV2KHNiLT5zX2JkZXYpOworcHV0X2lub2RlczoKKwlmb3IgKGNudCA9IDA7IGNudCA8IE1BWFFVT1RBUzsgY250KyspCisJCWlmICh0b3B1dGlub2RlW2NudF0pIHsKIAkJCS8qIE9uIHJlbW91bnQgUk8sIHdlIGtlZXAgdGhlIGlub2RlIHBvaW50ZXIgc28gdGhhdCB3ZQotCQkJICogY2FuIHJlZW5hYmxlIHF1b3RhIG9uIHRoZSBzdWJzZXF1ZW50IHJlbW91bnQgUlcuCi0JCQkgKiBCdXQgd2UgaGF2ZSBiZXR0ZXIgbm90IGtlZXAgaW5vZGUgcG9pbnRlciB3aGVuIHRoZXJlCi0JCQkgKiBpcyBwZW5kaW5nIGRlbGV0ZSBvbiB0aGUgcXVvdGEgZmlsZS4uLiAqLwotCQkJaWYgKCFyZW1vdW50KQorCQkJICogY2FuIHJlZW5hYmxlIHF1b3RhIG9uIHRoZSBzdWJzZXF1ZW50IHJlbW91bnQgUlcuIFdlCisJCQkgKiBoYXZlIHRvIGNoZWNrICdmbGFncycgdmFyaWFibGUgYW5kIG5vdCB1c2Ugc2JfaGFzXworCQkJICogZnVuY3Rpb24gYmVjYXVzZSBhbm90aGVyIHF1b3Rhb24gLyBxdW90YW9mZiBjb3VsZAorCQkJICogY2hhbmdlIGdsb2JhbCBzdGF0ZSBiZWZvcmUgd2UgZ290IGhlcmUuIFdlIHJlZnVzZQorCQkJICogdG8gc3VzcGVuZCBxdW90YXMgd2hlbiB0aGVyZSBpcyBwZW5kaW5nIGRlbGV0ZSBvbgorCQkJICogdGhlIHF1b3RhIGZpbGUuLi4gKi8KKwkJCWlmICghKGZsYWdzICYgRFFVT1RfU1VTUEVOREVEKSkKIAkJCQlpcHV0KHRvcHV0aW5vZGVbY250XSk7CiAJCQllbHNlIGlmICghdG9wdXRpbm9kZVtjbnRdLT5pX25saW5rKQogCQkJCXJldCA9IC1FQlVTWTsKIAkJfQotCWlmIChzYi0+c19iZGV2KQotCQlpbnZhbGlkYXRlX2JkZXYoc2ItPnNfYmRldik7CiAJcmV0dXJuIHJldDsKIH0KIAoraW50IHZmc19xdW90YV9vZmYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIGludCByZW1vdW50KQoreworCXJldHVybiB2ZnNfcXVvdGFfZGlzYWJsZShzYiwgdHlwZSwgcmVtb3VudCA/IERRVU9UX1NVU1BFTkRFRCA6CisJCQkJIChEUVVPVF9VU0FHRV9FTkFCTEVEIHwgRFFVT1RfTElNSVRTX0VOQUJMRUQpKTsKK30KKwogLyoKICAqCVR1cm4gcXVvdGFzIG9uIG9uIGEgZGV2aWNlCiAgKi8KIAotLyogSGVscGVyIGZ1bmN0aW9uIHdoZW4gd2UgYWxyZWFkeSBoYXZlIHRoZSBpbm9kZSAqLwotc3RhdGljIGludCB2ZnNfcXVvdGFfb25faW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUsIGludCBmb3JtYXRfaWQpCisvKgorICogSGVscGVyIGZ1bmN0aW9uIHRvIHR1cm4gcXVvdGFzIG9uIHdoZW4gd2UgYWxyZWFkeSBoYXZlIHRoZSBpbm9kZSBvZgorICogcXVvdGEgZmlsZSBhbmQgbm8gcXVvdGEgaW5mb3JtYXRpb24gaXMgbG9hZGVkLgorICovCitzdGF0aWMgaW50IHZmc19sb2FkX3F1b3RhX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlLCBpbnQgZm9ybWF0X2lkLAorCXVuc2lnbmVkIGludCBmbGFncykKIHsKIAlzdHJ1Y3QgcXVvdGFfZm9ybWF0X3R5cGUgKmZtdCA9IGZpbmRfcXVvdGFfZm9ybWF0KGZvcm1hdF9pZCk7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOwpAQCAtMTY5NiwyNyArMTc3OSwzNyBAQAogCQllcnJvciA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0X2ZtdDsKIAl9CisJLyogVXNhZ2UgYWx3YXlzIGhhcyB0byBiZSBzZXQuLi4gKi8KKwlpZiAoIShmbGFncyAmIERRVU9UX1VTQUdFX0VOQUJMRUQpKSB7CisJCWVycm9yID0gLUVJTlZBTDsKKwkJZ290byBvdXRfZm10OworCX0KIAotCS8qIEFzIHdlIGJ5cGFzcyB0aGUgcGFnZWNhY2hlIHdlIG11c3Qgbm93IGZsdXNoIHRoZSBpbm9kZSBzbyB0aGF0Ci0JICogd2Ugc2VlIGFsbCB0aGUgY2hhbmdlcyBmcm9tIHVzZXJzcGFjZS4uLiAqLwotCXdyaXRlX2lub2RlX25vdyhpbm9kZSwgMSk7Ci0JLyogQW5kIG5vdyBmbHVzaCB0aGUgYmxvY2sgY2FjaGUgc28gdGhhdCBrZXJuZWwgc2VlcyB0aGUgY2hhbmdlcyAqLwotCWludmFsaWRhdGVfYmRldihzYi0+c19iZGV2KTsKKwlpZiAoIShkcW9wdC0+ZmxhZ3MgJiBEUVVPVF9RVU9UQV9TWVNfRklMRSkpIHsKKwkJLyogQXMgd2UgYnlwYXNzIHRoZSBwYWdlY2FjaGUgd2UgbXVzdCBub3cgZmx1c2ggdGhlIGlub2RlIHNvCisJCSAqIHRoYXQgd2Ugc2VlIGFsbCB0aGUgY2hhbmdlcyBmcm9tIHVzZXJzcGFjZS4uLiAqLworCQl3cml0ZV9pbm9kZV9ub3coaW5vZGUsIDEpOworCQkvKiBBbmQgbm93IGZsdXNoIHRoZSBibG9jayBjYWNoZSBzbyB0aGF0IGtlcm5lbCBzZWVzIHRoZQorCQkgKiBjaGFuZ2VzICovCisJCWludmFsaWRhdGVfYmRldihzYi0+c19iZGV2KTsKKwl9CiAJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCW11dGV4X2xvY2soJmRxb3B0LT5kcW9ub2ZmX211dGV4KTsKLQlpZiAoc2JfaGFzX3F1b3RhX2VuYWJsZWQoc2IsIHR5cGUpIHx8Ci0JCQlzYl9oYXNfcXVvdGFfc3VzcGVuZGVkKHNiLCB0eXBlKSkgeworCWlmIChzYl9oYXNfcXVvdGFfbG9hZGVkKHNiLCB0eXBlKSkgewogCQllcnJvciA9IC1FQlVTWTsKIAkJZ290byBvdXRfbG9jazsKIAl9Ci0JLyogV2UgZG9uJ3Qgd2FudCBxdW90YSBhbmQgYXRpbWUgb24gcXVvdGEgZmlsZXMgKGRlYWRsb2NrcyBwb3NzaWJsZSkKLQkgKiBBbHNvIG5vYm9keSBzaG91bGQgd3JpdGUgdG8gdGhlIGZpbGUgLSB3ZSB1c2Ugc3BlY2lhbCBJTyBvcGVyYXRpb25zCi0JICogd2hpY2ggaWdub3JlIHRoZSBpbW11dGFibGUgYml0LiAqLwotCWRvd25fd3JpdGUoJmRxb3B0LT5kcXB0cl9zZW0pOwotCW9sZGZsYWdzID0gaW5vZGUtPmlfZmxhZ3MgJiAoU19OT0FUSU1FIHwgU19JTU1VVEFCTEUgfCBTX05PUVVPVEEpOwotCWlub2RlLT5pX2ZsYWdzIHw9IFNfTk9RVU9UQSB8IFNfTk9BVElNRSB8IFNfSU1NVVRBQkxFOwotCXVwX3dyaXRlKCZkcW9wdC0+ZHFwdHJfc2VtKTsKLQlzYi0+ZHFfb3AtPmRyb3AoaW5vZGUpOworCisJaWYgKCEoZHFvcHQtPmZsYWdzICYgRFFVT1RfUVVPVEFfU1lTX0ZJTEUpKSB7CisJCS8qIFdlIGRvbid0IHdhbnQgcXVvdGEgYW5kIGF0aW1lIG9uIHF1b3RhIGZpbGVzIChkZWFkbG9ja3MKKwkJICogcG9zc2libGUpIEFsc28gbm9ib2R5IHNob3VsZCB3cml0ZSB0byB0aGUgZmlsZSAtIHdlIHVzZQorCQkgKiBzcGVjaWFsIElPIG9wZXJhdGlvbnMgd2hpY2ggaWdub3JlIHRoZSBpbW11dGFibGUgYml0LiAqLworCQlkb3duX3dyaXRlKCZkcW9wdC0+ZHFwdHJfc2VtKTsKKwkJb2xkZmxhZ3MgPSBpbm9kZS0+aV9mbGFncyAmIChTX05PQVRJTUUgfCBTX0lNTVVUQUJMRSB8IFNfTk9RVU9UQSk7CisJCWlub2RlLT5pX2ZsYWdzIHw9IFNfTk9RVU9UQSB8IFNfTk9BVElNRSB8IFNfSU1NVVRBQkxFOworCQl1cF93cml0ZSgmZHFvcHQtPmRxcHRyX3NlbSk7CisJCXNiLT5kcV9vcC0+ZHJvcChpbm9kZSk7CisJfQogCiAJZXJyb3IgPSAtRUlPOwogCWRxb3B0LT5maWxlc1t0eXBlXSA9IGlncmFiKGlub2RlKTsKQEAgLTE3MzcsNyArMTgzMCw3IEBACiAJfQogCW11dGV4X3VubG9jaygmZHFvcHQtPmRxaW9fbXV0ZXgpOwogCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwotCXNldF9lbmFibGVfZmxhZ3MoZHFvcHQsIHR5cGUpOworCWRxb3B0LT5mbGFncyB8PSBkcXVvdF9zdGF0ZV9mbGFnKGZsYWdzLCB0eXBlKTsKIAogCWFkZF9kcXVvdF9yZWYoc2IsIHR5cGUpOwogCW11dGV4X3VubG9jaygmZHFvcHQtPmRxb25vZmZfbXV0ZXgpOwpAQCAtMTc3MCwyMCArMTg2MywyMyBAQAogCXN0cnVjdCBxdW90YV9pbmZvICpkcW9wdCA9IHNiX2Rxb3B0KHNiKTsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCWludCByZXQ7CisJdW5zaWduZWQgaW50IGZsYWdzOwogCiAJbXV0ZXhfbG9jaygmZHFvcHQtPmRxb25vZmZfbXV0ZXgpOwogCWlmICghc2JfaGFzX3F1b3RhX3N1c3BlbmRlZChzYiwgdHlwZSkpIHsKIAkJbXV0ZXhfdW5sb2NrKCZkcW9wdC0+ZHFvbm9mZl9tdXRleCk7CiAJCXJldHVybiAwOwogCX0KLQlCVUdfT04oc2JfaGFzX3F1b3RhX2VuYWJsZWQoc2IsIHR5cGUpKTsKLQogCWlub2RlID0gZHFvcHQtPmZpbGVzW3R5cGVdOwogCWRxb3B0LT5maWxlc1t0eXBlXSA9IE5VTEw7Ci0JcmVzZXRfZW5hYmxlX2ZsYWdzKGRxb3B0LCB0eXBlLCAwKTsKKwlmbGFncyA9IGRxb3B0LT5mbGFncyAmIGRxdW90X3N0YXRlX2ZsYWcoRFFVT1RfVVNBR0VfRU5BQkxFRCB8CisJCQkJCQlEUVVPVF9MSU1JVFNfRU5BQkxFRCwgdHlwZSk7CisJZHFvcHQtPmZsYWdzICY9IH5kcXVvdF9zdGF0ZV9mbGFnKERRVU9UX1NUQVRFX0ZMQUdTLCB0eXBlKTsKIAltdXRleF91bmxvY2soJmRxb3B0LT5kcW9ub2ZmX211dGV4KTsKIAotCXJldCA9IHZmc19xdW90YV9vbl9pbm9kZShpbm9kZSwgdHlwZSwgZHFvcHQtPmluZm9bdHlwZV0uZHFpX2ZtdF9pZCk7CisJZmxhZ3MgPSBkcXVvdF9nZW5lcmljX2ZsYWcoZmxhZ3MsIHR5cGUpOworCXJldCA9IHZmc19sb2FkX3F1b3RhX2lub2RlKGlub2RlLCB0eXBlLCBkcW9wdC0+aW5mb1t0eXBlXS5kcWlfZm10X2lkLAorCQkJCSAgIGZsYWdzKTsKIAlpcHV0KGlub2RlKTsKIAogCXJldHVybiByZXQ7CkBAIC0xNzk5LDEyICsxODk1LDEyIEBACiAJaWYgKHBhdGgtPm1udC0+bW50X3NiICE9IHNiKQogCQllcnJvciA9IC1FWERFVjsKIAllbHNlCi0JCWVycm9yID0gdmZzX3F1b3RhX29uX2lub2RlKHBhdGgtPmRlbnRyeS0+ZF9pbm9kZSwgdHlwZSwKLQkJCQkJICAgZm9ybWF0X2lkKTsKKwkJZXJyb3IgPSB2ZnNfbG9hZF9xdW90YV9pbm9kZShwYXRoLT5kZW50cnktPmRfaW5vZGUsIHR5cGUsCisJCQkJCSAgICAgZm9ybWF0X2lkLCBEUVVPVF9VU0FHRV9FTkFCTEVEIHwKKwkJCQkJICAgICBEUVVPVF9MSU1JVFNfRU5BQkxFRCk7CiAJcmV0dXJuIGVycm9yOwogfQogCi0vKiBBY3R1YWwgZnVuY3Rpb24gY2FsbGVkIGZyb20gcXVvdGFjdGwoKSAqLwogaW50IHZmc19xdW90YV9vbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwgaW50IGZvcm1hdF9pZCwgY2hhciAqbmFtZSwKIAkJIGludCByZW1vdW50KQogewpAQCAtMTgyMyw2ICsxOTE5LDUwIEBACiB9CiAKIC8qCisgKiBNb3JlIHBvd2VyZnVsIGZ1bmN0aW9uIGZvciB0dXJuaW5nIG9uIHF1b3RhcyBhbGxvd2luZyBzZXR0aW5nCisgKiBvZiBpbmRpdmlkdWFsIHF1b3RhIGZsYWdzCisgKi8KK2ludCB2ZnNfcXVvdGFfZW5hYmxlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlLCBpbnQgZm9ybWF0X2lkLAorCQl1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBxdW90YV9pbmZvICpkcW9wdCA9IHNiX2Rxb3B0KHNiKTsKKworCS8qIEp1c3QgdW5zdXNwZW5kIHF1b3Rhcz8gKi8KKwlpZiAoZmxhZ3MgJiBEUVVPVF9TVVNQRU5ERUQpCisJCXJldHVybiB2ZnNfcXVvdGFfb25fcmVtb3VudChzYiwgdHlwZSk7CisJaWYgKCFmbGFncykKKwkJcmV0dXJuIDA7CisJLyogSnVzdCB1cGRhdGluZyBmbGFncyBuZWVkZWQ/ICovCisJaWYgKHNiX2hhc19xdW90YV9sb2FkZWQoc2IsIHR5cGUpKSB7CisJCW11dGV4X2xvY2soJmRxb3B0LT5kcW9ub2ZmX211dGV4KTsKKwkJLyogTm93IGRvIGEgcmVsaWFibGUgdGVzdC4uLiAqLworCQlpZiAoIXNiX2hhc19xdW90YV9sb2FkZWQoc2IsIHR5cGUpKSB7CisJCQltdXRleF91bmxvY2soJmRxb3B0LT5kcW9ub2ZmX211dGV4KTsKKwkJCWdvdG8gbG9hZF9xdW90YTsKKwkJfQorCQlpZiAoZmxhZ3MgJiBEUVVPVF9VU0FHRV9FTkFCTEVEICYmCisJCSAgICBzYl9oYXNfcXVvdGFfdXNhZ2VfZW5hYmxlZChzYiwgdHlwZSkpIHsKKwkJCXJldCA9IC1FQlVTWTsKKwkJCWdvdG8gb3V0X2xvY2s7CisJCX0KKwkJaWYgKGZsYWdzICYgRFFVT1RfTElNSVRTX0VOQUJMRUQgJiYKKwkJICAgIHNiX2hhc19xdW90YV9saW1pdHNfZW5hYmxlZChzYiwgdHlwZSkpIHsKKwkJCXJldCA9IC1FQlVTWTsKKwkJCWdvdG8gb3V0X2xvY2s7CisJCX0KKwkJc2JfZHFvcHQoc2IpLT5mbGFncyB8PSBkcXVvdF9zdGF0ZV9mbGFnKGZsYWdzLCB0eXBlKTsKK291dF9sb2NrOgorCQltdXRleF91bmxvY2soJmRxb3B0LT5kcW9ub2ZmX211dGV4KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKK2xvYWRfcXVvdGE6CisJcmV0dXJuIHZmc19sb2FkX3F1b3RhX2lub2RlKGlub2RlLCB0eXBlLCBmb3JtYXRfaWQsIGZsYWdzKTsKK30KKworLyoKICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB3aGVuIGZpbGVzeXN0ZW0gbmVlZHMgdG8gaW5pdGlhbGl6ZSBxdW90YXMKICAqIGR1cmluZyBtb3VudCB0aW1lLgogICovCkBAIC0xODQzLDcgKzE5ODMsOCBAQAogCiAJZXJyb3IgPSBzZWN1cml0eV9xdW90YV9vbihkZW50cnkpOwogCWlmICghZXJyb3IpCi0JCWVycm9yID0gdmZzX3F1b3RhX29uX2lub2RlKGRlbnRyeS0+ZF9pbm9kZSwgdHlwZSwgZm9ybWF0X2lkKTsKKwkJZXJyb3IgPSB2ZnNfbG9hZF9xdW90YV9pbm9kZShkZW50cnktPmRfaW5vZGUsIHR5cGUsIGZvcm1hdF9pZCwKKwkJCQlEUVVPVF9VU0FHRV9FTkFCTEVEIHwgRFFVT1RfTElNSVRTX0VOQUJMRUQpOwogCiBvdXQ6CiAJZHB1dChkZW50cnkpOwpAQCAtMTg2NiwxNCArMjAwNywyNCBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbmxpbmUgcXNpemVfdCBxYnRvcyhxc2l6ZV90IGJsb2NrcykKK3sKKwlyZXR1cm4gYmxvY2tzIDw8IFFJRl9EUUJMS1NJWkVfQklUUzsKK30KKworc3RhdGljIGlubGluZSBxc2l6ZV90IHN0b3FiKHFzaXplX3Qgc3BhY2UpCit7CisJcmV0dXJuIChzcGFjZSArIFFJRl9EUUJMS1NJWkUgLSAxKSA+PiBRSUZfRFFCTEtTSVpFX0JJVFM7Cit9CisKIC8qIEdlbmVyaWMgcm91dGluZSBmb3IgZ2V0dGluZyBjb21tb24gcGFydCBvZiBxdW90YSBzdHJ1Y3R1cmUgKi8KIHN0YXRpYyB2b2lkIGRvX2dldF9kcWJsayhzdHJ1Y3QgZHF1b3QgKmRxdW90LCBzdHJ1Y3QgaWZfZHFibGsgKmRpKQogewogCXN0cnVjdCBtZW1fZHFibGsgKmRtID0gJmRxdW90LT5kcV9kcWI7CiAKIAlzcGluX2xvY2soJmRxX2RhdGFfbG9jayk7Ci0JZGktPmRxYl9iaGFyZGxpbWl0ID0gZG0tPmRxYl9iaGFyZGxpbWl0OwotCWRpLT5kcWJfYnNvZnRsaW1pdCA9IGRtLT5kcWJfYnNvZnRsaW1pdDsKKwlkaS0+ZHFiX2JoYXJkbGltaXQgPSBzdG9xYihkbS0+ZHFiX2JoYXJkbGltaXQpOworCWRpLT5kcWJfYnNvZnRsaW1pdCA9IHN0b3FiKGRtLT5kcWJfYnNvZnRsaW1pdCk7CiAJZGktPmRxYl9jdXJzcGFjZSA9IGRtLT5kcWJfY3Vyc3BhY2U7CiAJZGktPmRxYl9paGFyZGxpbWl0ID0gZG0tPmRxYl9paGFyZGxpbWl0OwogCWRpLT5kcWJfaXNvZnRsaW1pdCA9IGRtLT5kcWJfaXNvZnRsaW1pdDsKQEAgLTE5MTgsMjggKzIwNjksMzggQEAKIAlpZiAoZGktPmRxYl92YWxpZCAmIFFJRl9TUEFDRSkgewogCQlkbS0+ZHFiX2N1cnNwYWNlID0gZGktPmRxYl9jdXJzcGFjZTsKIAkJY2hlY2tfYmxpbSA9IDE7CisJCV9fc2V0X2JpdChEUV9MQVNUU0VUX0IgKyBRSUZfU1BBQ0VfQiwgJmRxdW90LT5kcV9mbGFncyk7CiAJfQogCWlmIChkaS0+ZHFiX3ZhbGlkICYgUUlGX0JMSU1JVFMpIHsKLQkJZG0tPmRxYl9ic29mdGxpbWl0ID0gZGktPmRxYl9ic29mdGxpbWl0OwotCQlkbS0+ZHFiX2JoYXJkbGltaXQgPSBkaS0+ZHFiX2JoYXJkbGltaXQ7CisJCWRtLT5kcWJfYnNvZnRsaW1pdCA9IHFidG9zKGRpLT5kcWJfYnNvZnRsaW1pdCk7CisJCWRtLT5kcWJfYmhhcmRsaW1pdCA9IHFidG9zKGRpLT5kcWJfYmhhcmRsaW1pdCk7CiAJCWNoZWNrX2JsaW0gPSAxOworCQlfX3NldF9iaXQoRFFfTEFTVFNFVF9CICsgUUlGX0JMSU1JVFNfQiwgJmRxdW90LT5kcV9mbGFncyk7CiAJfQogCWlmIChkaS0+ZHFiX3ZhbGlkICYgUUlGX0lOT0RFUykgewogCQlkbS0+ZHFiX2N1cmlub2RlcyA9IGRpLT5kcWJfY3VyaW5vZGVzOwogCQljaGVja19pbGltID0gMTsKKwkJX19zZXRfYml0KERRX0xBU1RTRVRfQiArIFFJRl9JTk9ERVNfQiwgJmRxdW90LT5kcV9mbGFncyk7CiAJfQogCWlmIChkaS0+ZHFiX3ZhbGlkICYgUUlGX0lMSU1JVFMpIHsKIAkJZG0tPmRxYl9pc29mdGxpbWl0ID0gZGktPmRxYl9pc29mdGxpbWl0OwogCQlkbS0+ZHFiX2loYXJkbGltaXQgPSBkaS0+ZHFiX2loYXJkbGltaXQ7CiAJCWNoZWNrX2lsaW0gPSAxOworCQlfX3NldF9iaXQoRFFfTEFTVFNFVF9CICsgUUlGX0lMSU1JVFNfQiwgJmRxdW90LT5kcV9mbGFncyk7CiAJfQotCWlmIChkaS0+ZHFiX3ZhbGlkICYgUUlGX0JUSU1FKQorCWlmIChkaS0+ZHFiX3ZhbGlkICYgUUlGX0JUSU1FKSB7CiAJCWRtLT5kcWJfYnRpbWUgPSBkaS0+ZHFiX2J0aW1lOwotCWlmIChkaS0+ZHFiX3ZhbGlkICYgUUlGX0lUSU1FKQorCQljaGVja19ibGltID0gMTsKKwkJX19zZXRfYml0KERRX0xBU1RTRVRfQiArIFFJRl9CVElNRV9CLCAmZHF1b3QtPmRxX2ZsYWdzKTsKKwl9CisJaWYgKGRpLT5kcWJfdmFsaWQgJiBRSUZfSVRJTUUpIHsKIAkJZG0tPmRxYl9pdGltZSA9IGRpLT5kcWJfaXRpbWU7CisJCWNoZWNrX2lsaW0gPSAxOworCQlfX3NldF9iaXQoRFFfTEFTVFNFVF9CICsgUUlGX0lUSU1FX0IsICZkcXVvdC0+ZHFfZmxhZ3MpOworCX0KIAogCWlmIChjaGVja19ibGltKSB7Ci0JCWlmICghZG0tPmRxYl9ic29mdGxpbWl0IHx8IHRvcWIoZG0tPmRxYl9jdXJzcGFjZSkgPCBkbS0+ZHFiX2Jzb2Z0bGltaXQpIHsKKwkJaWYgKCFkbS0+ZHFiX2Jzb2Z0bGltaXQgfHwgZG0tPmRxYl9jdXJzcGFjZSA8IGRtLT5kcWJfYnNvZnRsaW1pdCkgewogCQkJZG0tPmRxYl9idGltZSA9IDA7CiAJCQljbGVhcl9iaXQoRFFfQkxLU19CLCAmZHF1b3QtPmRxX2ZsYWdzKTsKIAkJfQpAQCAtMTk3MCwxMiArMjEzMSwxNCBAQAogCWludCByYzsKIAogCW11dGV4X2xvY2soJnNiX2Rxb3B0KHNiKS0+ZHFvbm9mZl9tdXRleCk7Ci0JaWYgKCEoZHF1b3QgPSBkcWdldChzYiwgaWQsIHR5cGUpKSkgewotCQltdXRleF91bmxvY2soJnNiX2Rxb3B0KHNiKS0+ZHFvbm9mZl9tdXRleCk7Ci0JCXJldHVybiAtRVNSQ0g7CisJZHF1b3QgPSBkcWdldChzYiwgaWQsIHR5cGUpOworCWlmICghZHF1b3QpIHsKKwkJcmMgPSAtRVNSQ0g7CisJCWdvdG8gb3V0OwogCX0KIAlyYyA9IGRvX3NldF9kcWJsayhkcXVvdCwgZGkpOwogCWRxcHV0KGRxdW90KTsKK291dDoKIAltdXRleF91bmxvY2soJnNiX2Rxb3B0KHNiKS0+ZHFvbm9mZl9tdXRleCk7CiAJcmV0dXJuIHJjOwogfQpAQCAtMTk4Niw3ICsyMTQ5LDcgQEAKIAlzdHJ1Y3QgbWVtX2RxaW5mbyAqbWk7CiAgIAogCW11dGV4X2xvY2soJnNiX2Rxb3B0KHNiKS0+ZHFvbm9mZl9tdXRleCk7Ci0JaWYgKCFzYl9oYXNfcXVvdGFfZW5hYmxlZChzYiwgdHlwZSkpIHsKKwlpZiAoIXNiX2hhc19xdW90YV9hY3RpdmUoc2IsIHR5cGUpKSB7CiAJCW11dGV4X3VubG9jaygmc2JfZHFvcHQoc2IpLT5kcW9ub2ZmX211dGV4KTsKIAkJcmV0dXJuIC1FU1JDSDsKIAl9CkBAIC0yMDA1LDExICsyMTY4LDEyIEBACiBpbnQgdmZzX3NldF9kcWluZm8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIHN0cnVjdCBpZl9kcWluZm8gKmlpKQogewogCXN0cnVjdCBtZW1fZHFpbmZvICptaTsKKwlpbnQgZXJyID0gMDsKIAogCW11dGV4X2xvY2soJnNiX2Rxb3B0KHNiKS0+ZHFvbm9mZl9tdXRleCk7Ci0JaWYgKCFzYl9oYXNfcXVvdGFfZW5hYmxlZChzYiwgdHlwZSkpIHsKLQkJbXV0ZXhfdW5sb2NrKCZzYl9kcW9wdChzYiktPmRxb25vZmZfbXV0ZXgpOwotCQlyZXR1cm4gLUVTUkNIOworCWlmICghc2JfaGFzX3F1b3RhX2FjdGl2ZShzYiwgdHlwZSkpIHsKKwkJZXJyID0gLUVTUkNIOworCQlnb3RvIG91dDsKIAl9CiAJbWkgPSBzYl9kcW9wdChzYiktPmluZm8gKyB0eXBlOwogCXNwaW5fbG9jaygmZHFfZGF0YV9sb2NrKTsKQEAgLTIwMjMsOCArMjE4Nyw5IEBACiAJbWFya19pbmZvX2RpcnR5KHNiLCB0eXBlKTsKIAkvKiBGb3JjZSB3cml0ZSB0byBkaXNrICovCiAJc2ItPmRxX29wLT53cml0ZV9pbmZvKHNiLCB0eXBlKTsKK291dDoKIAltdXRleF91bmxvY2soJnNiX2Rxb3B0KHNiKS0+ZHFvbm9mZl9tdXRleCk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGVycjsKIH0KIAogc3RydWN0IHF1b3RhY3RsX29wcyB2ZnNfcXVvdGFjdGxfb3BzID0gewpAQCAtMjE4NiwxMCArMjM1MSwxMyBAQAogRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX3F1b3RhX2Zvcm1hdCk7CiBFWFBPUlRfU1lNQk9MKGRxc3RhdHMpOwogRVhQT1JUX1NZTUJPTChkcV9kYXRhX2xvY2spOworRVhQT1JUX1NZTUJPTCh2ZnNfcXVvdGFfZW5hYmxlKTsKIEVYUE9SVF9TWU1CT0wodmZzX3F1b3RhX29uKTsKIEVYUE9SVF9TWU1CT0wodmZzX3F1b3RhX29uX3BhdGgpOwogRVhQT1JUX1NZTUJPTCh2ZnNfcXVvdGFfb25fbW91bnQpOworRVhQT1JUX1NZTUJPTCh2ZnNfcXVvdGFfZGlzYWJsZSk7CiBFWFBPUlRfU1lNQk9MKHZmc19xdW90YV9vZmYpOworRVhQT1JUX1NZTUJPTChkcXVvdF9zY2FuX2FjdGl2ZSk7CiBFWFBPUlRfU1lNQk9MKHZmc19xdW90YV9zeW5jKTsKIEVYUE9SVF9TWU1CT0wodmZzX2dldF9kcWluZm8pOwogRVhQT1JUX1NZTUJPTCh2ZnNfc2V0X2RxaW5mbyk7CkBAIC0yMjAyLDcgKzIzNzAsMTEgQEAKIEVYUE9SVF9TWU1CT0woZHF1b3RfbWFya19kcXVvdF9kaXJ0eSk7CiBFWFBPUlRfU1lNQk9MKGRxdW90X2luaXRpYWxpemUpOwogRVhQT1JUX1NZTUJPTChkcXVvdF9kcm9wKTsKK0VYUE9SVF9TWU1CT0woZHF1b3RfZHJvcF9sb2NrZWQpOwogRVhQT1JUX1NZTUJPTCh2ZnNfZHFfZHJvcCk7CitFWFBPUlRfU1lNQk9MKGRxZ2V0KTsKK0VYUE9SVF9TWU1CT0woZHFwdXQpOworRVhQT1JUX1NZTUJPTChkcXVvdF9pc19jYWNoZWQpOwogRVhQT1JUX1NZTUJPTChkcXVvdF9hbGxvY19zcGFjZSk7CiBFWFBPUlRfU1lNQk9MKGRxdW90X2FsbG9jX2lub2RlKTsKIEVYUE9SVF9TWU1CT0woZHF1b3RfZnJlZV9zcGFjZSk7CmRpZmYgLS1naXQgYS9mcy9lY3J5cHRmcy9jcnlwdG8uYyBiL2ZzL2VjcnlwdGZzL2NyeXB0by5jCmluZGV4IDYwNDYyMzkuLmMwMWUwNDMgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL2NyeXB0by5jCisrKyBiL2ZzL2VjcnlwdGZzL2NyeXB0by5jCkBAIC0xNzUsOCArMTc1LDggQEAKICAqCiAgKiBSZXR1cm5zIHplcm8gb24gc3VjY2Vzczsgbm9uLXplcm8gb24gZXJyb3IuCiAgKi8KLXN0YXRpYyBpbnQgZWNyeXB0ZnNfZGVyaXZlX2l2KGNoYXIgKml2LCBzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCAqY3J5cHRfc3RhdCwKLQkJCSAgICAgIGxvZmZfdCBvZmZzZXQpCitpbnQgZWNyeXB0ZnNfZGVyaXZlX2l2KGNoYXIgKml2LCBzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCAqY3J5cHRfc3RhdCwKKwkJICAgICAgIGxvZmZfdCBvZmZzZXQpCiB7CiAJaW50IHJjID0gMDsKIAljaGFyIGRzdFtNRDVfRElHRVNUX1NJWkVdOwpAQCAtOTI0LDYgKzkyNCwxNSBAQAogCQljcnlwdF9zdGF0LT5mbGFncyB8PSBFQ1JZUFRGU19NRVRBREFUQV9JTl9YQVRUUjsKIAlpZiAobW91bnRfY3J5cHRfc3RhdC0+ZmxhZ3MgJiBFQ1JZUFRGU19FTkNSWVBURURfVklFV19FTkFCTEVEKQogCQljcnlwdF9zdGF0LT5mbGFncyB8PSBFQ1JZUFRGU19WSUVXX0FTX0VOQ1JZUFRFRDsKKwlpZiAobW91bnRfY3J5cHRfc3RhdC0+ZmxhZ3MgJiBFQ1JZUFRGU19HTE9CQUxfRU5DUllQVF9GSUxFTkFNRVMpIHsKKwkJY3J5cHRfc3RhdC0+ZmxhZ3MgfD0gRUNSWVBURlNfRU5DUllQVF9GSUxFTkFNRVM7CisJCWlmIChtb3VudF9jcnlwdF9zdGF0LT5mbGFncworCQkgICAgJiBFQ1JZUFRGU19HTE9CQUxfRU5DRk5fVVNFX01PVU5UX0ZORUspCisJCQljcnlwdF9zdGF0LT5mbGFncyB8PSBFQ1JZUFRGU19FTkNGTl9VU0VfTU9VTlRfRk5FSzsKKwkJZWxzZSBpZiAobW91bnRfY3J5cHRfc3RhdC0+ZmxhZ3MKKwkJCSAmIEVDUllQVEZTX0dMT0JBTF9FTkNGTl9VU0VfRkVLKQorCQkJY3J5cHRfc3RhdC0+ZmxhZ3MgfD0gRUNSWVBURlNfRU5DRk5fVVNFX0ZFSzsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgZWNyeXB0ZnNfY29weV9tb3VudF93aWRlX3NpZ3NfdG9faW5vZGVfc2lncygKQEAgLTEwNjAsNyArMTA2OSw4IEBACiBzdGF0aWMgc3RydWN0IGVjcnlwdGZzX2ZsYWdfbWFwX2VsZW0gZWNyeXB0ZnNfZmxhZ19tYXBbXSA9IHsKIAl7MHgwMDAwMDAwMSwgRUNSWVBURlNfRU5BQkxFX0hNQUN9LAogCXsweDAwMDAwMDAyLCBFQ1JZUFRGU19FTkNSWVBURUR9LAotCXsweDAwMDAwMDA0LCBFQ1JZUFRGU19NRVRBREFUQV9JTl9YQVRUUn0KKwl7MHgwMDAwMDAwNCwgRUNSWVBURlNfTUVUQURBVEFfSU5fWEFUVFJ9LAorCXsweDAwMDAwMDA4LCBFQ1JZUFRGU19FTkNSWVBUX0ZJTEVOQU1FU30KIH07CiAKIC8qKgpAQCAtMTE0OSwxOSArMTE1OSwyMCBAQAogCiAvKioKICAqIGVjcnlwdGZzX2NvZGVfZm9yX2NpcGhlcl9zdHJpbmcKLSAqIEBjcnlwdF9zdGF0OiBUaGUgY3J5cHRvZ3JhcGhpYyBjb250ZXh0CisgKiBAY2lwaGVyX25hbWU6IFRoZSBzdHJpbmcgYWxpYXMgZm9yIHRoZSBjaXBoZXIKKyAqIEBrZXlfYnl0ZXM6IExlbmd0aCBvZiBrZXkgaW4gYnl0ZXM7IHVzZWQgZm9yIEFFUyBjb2RlIHNlbGVjdGlvbgogICoKICAqIFJldHVybnMgemVybyBvbiBubyBtYXRjaCwgb3IgdGhlIGNpcGhlciBjb2RlIG9uIG1hdGNoCiAgKi8KLXU4IGVjcnlwdGZzX2NvZGVfZm9yX2NpcGhlcl9zdHJpbmcoc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgKmNyeXB0X3N0YXQpCit1OCBlY3J5cHRmc19jb2RlX2Zvcl9jaXBoZXJfc3RyaW5nKGNoYXIgKmNpcGhlcl9uYW1lLCBzaXplX3Qga2V5X2J5dGVzKQogewogCWludCBpOwogCXU4IGNvZGUgPSAwOwogCXN0cnVjdCBlY3J5cHRmc19jaXBoZXJfY29kZV9zdHJfbWFwX2VsZW0gKm1hcCA9CiAJCWVjcnlwdGZzX2NpcGhlcl9jb2RlX3N0cl9tYXA7CiAKLQlpZiAoc3RyY21wKGNyeXB0X3N0YXQtPmNpcGhlciwgImFlcyIpID09IDApIHsKLQkJc3dpdGNoIChjcnlwdF9zdGF0LT5rZXlfc2l6ZSkgeworCWlmIChzdHJjbXAoY2lwaGVyX25hbWUsICJhZXMiKSA9PSAwKSB7CisJCXN3aXRjaCAoa2V5X2J5dGVzKSB7CiAJCWNhc2UgMTY6CiAJCQljb2RlID0gUkZDMjQ0MF9DSVBIRVJfQUVTXzEyODsKIAkJCWJyZWFrOwpAQCAtMTE3Myw3ICsxMTg0LDcgQEAKIAkJfQogCX0gZWxzZSB7CiAJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGVjcnlwdGZzX2NpcGhlcl9jb2RlX3N0cl9tYXApOyBpKyspCi0JCQlpZiAoc3RyY21wKGNyeXB0X3N0YXQtPmNpcGhlciwgbWFwW2ldLmNpcGhlcl9zdHIpID09IDApeworCQkJaWYgKHN0cmNtcChjaXBoZXJfbmFtZSwgbWFwW2ldLmNpcGhlcl9zdHIpID09IDApIHsKIAkJCQljb2RlID0gbWFwW2ldLmNpcGhlcl9jb2RlOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtMTIxMiw2ICsxMjIzLDggQEAKIAkJJihlY3J5cHRmc19pbm9kZV90b19wcml2YXRlKGVjcnlwdGZzX2lub2RlKS0+Y3J5cHRfc3RhdCk7CiAJaW50IHJjOwogCisJaWYgKGNyeXB0X3N0YXQtPmV4dGVudF9zaXplID09IDApCisJCWNyeXB0X3N0YXQtPmV4dGVudF9zaXplID0gRUNSWVBURlNfREVGQVVMVF9FWFRFTlRfU0laRTsKIAlyYyA9IGVjcnlwdGZzX3JlYWRfbG93ZXIoZGF0YSwgMCwgY3J5cHRfc3RhdC0+ZXh0ZW50X3NpemUsCiAJCQkJIGVjcnlwdGZzX2lub2RlKTsKIAlpZiAocmMpIHsKQEAgLTEyMjEsNyArMTIzNCw2IEBACiAJfQogCWlmICghY29udGFpbnNfZWNyeXB0ZnNfbWFya2VyKGRhdGEgKyBFQ1JZUFRGU19GSUxFX1NJWkVfQllURVMpKSB7CiAJCXJjID0gLUVJTlZBTDsKLQkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fREVCVUcsICJWYWxpZCBtYXJrZXIgbm90IGZvdW5kXG4iKTsKIAl9CiBvdXQ6CiAJcmV0dXJuIHJjOwpAQCAtMTYyOCw5NSArMTY0MCw5NSBAQAogfQogCiAvKioKLSAqIGVjcnlwdGZzX2VuY29kZV9maWxlbmFtZSAtIGNvbnZlcnRzIGEgcGxhaW50ZXh0IGZpbGUgbmFtZSB0byBjaXBoZXIgdGV4dAotICogQGNyeXB0X3N0YXQ6IFRoZSBjcnlwdF9zdGF0IHN0cnVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbGUgYW5lbSB0byBlbmNvZGUKLSAqIEBuYW1lOiBUaGUgcGxhaW50ZXh0IG5hbWUKLSAqIEBsZW5ndGg6IFRoZSBsZW5ndGggb2YgdGhlIHBsYWludGV4dAotICogQGVuY29kZWRfbmFtZTogVGhlIGVuY3lwdGVkIG5hbWUKKyAqIGVjcnlwdGZzX2VuY3J5cHRfZmlsZW5hbWUgLSBlbmNyeXB0IGZpbGVuYW1lCiAgKgotICogRW5jcnlwdHMgYW5kIGVuY29kZXMgYSBmaWxlbmFtZSBpbnRvIHNvbWV0aGluZyB0aGF0IGNvbnN0aXR1dGVzIGEKLSAqIHZhbGlkIGZpbGVuYW1lIGZvciBhIGZpbGVzeXN0ZW0sIHdpdGggcHJpbnRhYmxlIGNoYXJhY3RlcnMuCisgKiBDQkMtZW5jcnlwdHMgdGhlIGZpbGVuYW1lLiBXZSBkbyBub3Qgd2FudCB0byBlbmNyeXB0IHRoZSBzYW1lCisgKiBmaWxlbmFtZSB3aXRoIHRoZSBzYW1lIGtleSBhbmQgSVYsIHdoaWNoIG1heSBoYXBwZW4gd2l0aCBoYXJkCisgKiBsaW5rcywgc28gd2UgcHJlcGVuZCByYW5kb20gYml0cyB0byBlYWNoIGZpbGVuYW1lLgogICoKLSAqIFdlIGFzc3VtZSB0aGF0IHdlIGhhdmUgYSBwcm9wZXJseSBpbml0aWFsaXplZCBjcnlwdG8gY29udGV4dCwKLSAqIHBvaW50ZWQgdG8gYnkgY3J5cHRfc3RhdC0+dGZtLgotICoKLSAqIFRPRE86IEltcGxlbWVudCBmaWxlbmFtZSBkZWNvZGluZyBhbmQgZGVjcnlwdGlvbiBoZXJlLCBpbiBwbGFjZSBvZgotICogbWVtY3B5LiBXZSBhcmUga2VlcGluZyB0aGUgZnJhbWV3b3JrIGFyb3VuZCBmb3Igbm93IHRvICgxKQotICogZmFjaWxpdGF0ZSB0ZXN0aW5nIG9mIHRoZSBjb21wb25lbnRzIG5lZWRlZCB0byBpbXBsZW1lbnQgZmlsZW5hbWUKLSAqIGVuY3J5cHRpb24gYW5kICgyKSB0byBwcm92aWRlIGEgY29kZSBiYXNlIGZyb20gd2hpY2ggb3RoZXIKLSAqIGRldmVsb3BlcnMgaW4gdGhlIGNvbW11bml0eSBjYW4gZWFzaWx5IGltcGxlbWVudCB0aGlzIGZlYXR1cmUuCi0gKgotICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIGVuY29kZWQgZmlsZW5hbWU7IG5lZ2F0aXZlIGlmIGVycm9yCisgKiBSZXR1cm5zIHplcm8gb24gc3VjY2Vzczsgbm9uLXplcm8gb3RoZXJ3aXNlCiAgKi8KLWludAotZWNyeXB0ZnNfZW5jb2RlX2ZpbGVuYW1lKHN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0LAotCQkJIGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW5ndGgsIGNoYXIgKiplbmNvZGVkX25hbWUpCitzdGF0aWMgaW50CitlY3J5cHRmc19lbmNyeXB0X2ZpbGVuYW1lKHN0cnVjdCBlY3J5cHRmc19maWxlbmFtZSAqZmlsZW5hbWUsCisJCQkgIHN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0LAorCQkJICBzdHJ1Y3QgZWNyeXB0ZnNfbW91bnRfY3J5cHRfc3RhdCAqbW91bnRfY3J5cHRfc3RhdCkKIHsKLQlpbnQgZXJyb3IgPSAwOworCWludCByYyA9IDA7CiAKLQkoKmVuY29kZWRfbmFtZSkgPSBrbWFsbG9jKGxlbmd0aCArIDIsIEdGUF9LRVJORUwpOwotCWlmICghKCplbmNvZGVkX25hbWUpKSB7Ci0JCWVycm9yID0gLUVOT01FTTsKKwlmaWxlbmFtZS0+ZW5jcnlwdGVkX2ZpbGVuYW1lID0gTlVMTDsKKwlmaWxlbmFtZS0+ZW5jcnlwdGVkX2ZpbGVuYW1lX3NpemUgPSAwOworCWlmICgoY3J5cHRfc3RhdCAmJiAoY3J5cHRfc3RhdC0+ZmxhZ3MgJiBFQ1JZUFRGU19FTkNGTl9VU0VfTU9VTlRfRk5FSykpCisJICAgIHx8IChtb3VudF9jcnlwdF9zdGF0ICYmIChtb3VudF9jcnlwdF9zdGF0LT5mbGFncworCQkJCSAgICAgJiBFQ1JZUFRGU19HTE9CQUxfRU5DRk5fVVNFX01PVU5UX0ZORUspKSkgeworCQlzaXplX3QgcGFja2V0X3NpemU7CisJCXNpemVfdCByZW1haW5pbmdfYnl0ZXM7CisKKwkJcmMgPSBlY3J5cHRmc193cml0ZV90YWdfNzBfcGFja2V0KAorCQkJTlVMTCwgTlVMTCwKKwkJCSZmaWxlbmFtZS0+ZW5jcnlwdGVkX2ZpbGVuYW1lX3NpemUsCisJCQltb3VudF9jcnlwdF9zdGF0LCBOVUxMLAorCQkJZmlsZW5hbWUtPmZpbGVuYW1lX3NpemUpOworCQlpZiAocmMpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIGF0dGVtcHRpbmcgdG8gZ2V0IHBhY2tldCAiCisJCQkgICAgICAgInNpemUgZm9yIHRhZyA3MjsgcmMgPSBbJWRdXG4iLCBfX2Z1bmNfXywKKwkJCSAgICAgICByYyk7CisJCQlmaWxlbmFtZS0+ZW5jcnlwdGVkX2ZpbGVuYW1lX3NpemUgPSAwOworCQkJZ290byBvdXQ7CisJCX0KKwkJZmlsZW5hbWUtPmVuY3J5cHRlZF9maWxlbmFtZSA9CisJCQlrbWFsbG9jKGZpbGVuYW1lLT5lbmNyeXB0ZWRfZmlsZW5hbWVfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghZmlsZW5hbWUtPmVuY3J5cHRlZF9maWxlbmFtZSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogT3V0IG9mIG1lbW9yeSB3aGlsc3QgYXR0ZW1wdGluZyAiCisJCQkgICAgICAgInRvIGttYWxsb2MgWyV6ZF0gYnl0ZXNcbiIsIF9fZnVuY19fLAorCQkJICAgICAgIGZpbGVuYW1lLT5lbmNyeXB0ZWRfZmlsZW5hbWVfc2l6ZSk7CisJCQlyYyA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCQlyZW1haW5pbmdfYnl0ZXMgPSBmaWxlbmFtZS0+ZW5jcnlwdGVkX2ZpbGVuYW1lX3NpemU7CisJCXJjID0gZWNyeXB0ZnNfd3JpdGVfdGFnXzcwX3BhY2tldChmaWxlbmFtZS0+ZW5jcnlwdGVkX2ZpbGVuYW1lLAorCQkJCQkJICAmcmVtYWluaW5nX2J5dGVzLAorCQkJCQkJICAmcGFja2V0X3NpemUsCisJCQkJCQkgIG1vdW50X2NyeXB0X3N0YXQsCisJCQkJCQkgIGZpbGVuYW1lLT5maWxlbmFtZSwKKwkJCQkJCSAgZmlsZW5hbWUtPmZpbGVuYW1lX3NpemUpOworCQlpZiAocmMpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIGF0dGVtcHRpbmcgdG8gZ2VuZXJhdGUgIgorCQkJICAgICAgICJ0YWcgNzAgcGFja2V0OyByYyA9IFslZF1cbiIsIF9fZnVuY19fLAorCQkJICAgICAgIHJjKTsKKwkJCWtmcmVlKGZpbGVuYW1lLT5lbmNyeXB0ZWRfZmlsZW5hbWUpOworCQkJZmlsZW5hbWUtPmVuY3J5cHRlZF9maWxlbmFtZSA9IE5VTEw7CisJCQlmaWxlbmFtZS0+ZW5jcnlwdGVkX2ZpbGVuYW1lX3NpemUgPSAwOworCQkJZ290byBvdXQ7CisJCX0KKwkJZmlsZW5hbWUtPmVuY3J5cHRlZF9maWxlbmFtZV9zaXplID0gcGFja2V0X3NpemU7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogTm8gc3VwcG9ydCBmb3IgcmVxdWVzdGVkIGZpbGVuYW1lICIKKwkJICAgICAgICJlbmNyeXB0aW9uIG1ldGhvZCBpbiB0aGlzIHJlbGVhc2VcbiIsIF9fZnVuY19fKTsKKwkJcmMgPSAtRU5PVFNVUFA7CiAJCWdvdG8gb3V0OwogCX0KLQkvKiBUT0RPOiBGaWxlbmFtZSBlbmNyeXB0aW9uIGlzIGEgc2NoZWR1bGVkIGZlYXR1cmUgZm9yIGEKLQkgKiBmdXR1cmUgdmVyc2lvbiBvZiBlQ3J5cHRmcy4gVGhpcyBmdW5jdGlvbiBpcyBoZXJlIG9ubHkgZm9yCi0JICogdGhlIHB1cnBvc2Ugb2YgcHJvdmlkaW5nIGEgZnJhbWV3b3JrIGZvciBvdGhlciBkZXZlbG9wZXJzCi0JICogdG8gZWFzaWx5IGltcGxlbWVudCBmaWxlbmFtZSBlbmNyeXB0aW9uLiBIaW50OiBSZXBsYWNlIHRoaXMKLQkgKiBtZW1jcHkoKSB3aXRoIGEgY2FsbCB0byBlbmNyeXB0IGFuZCBlbmNvZGUgdGhlCi0JICogZmlsZW5hbWUsIHRoZSBzZXQgdGhlIGxlbmd0aCBhY2NvcmRpbmdseS4gKi8KLQltZW1jcHkoKHZvaWQgKikoKmVuY29kZWRfbmFtZSksICh2b2lkICopbmFtZSwgbGVuZ3RoKTsKLQkoKmVuY29kZWRfbmFtZSlbbGVuZ3RoXSA9ICdcMCc7Ci0JZXJyb3IgPSBsZW5ndGggKyAxOwogb3V0OgotCXJldHVybiBlcnJvcjsKKwlyZXR1cm4gcmM7CiB9CiAKLS8qKgotICogZWNyeXB0ZnNfZGVjb2RlX2ZpbGVuYW1lIC0gY29udmVydHMgdGhlIGNpcGhlciB0ZXh0IG5hbWUgdG8gcGxhaW50ZXh0Ci0gKiBAY3J5cHRfc3RhdDogVGhlIGNyeXB0X3N0YXQgc3RydWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZQotICogQG5hbWU6IFRoZSBmaWxlbmFtZSBpbiBjaXBoZXIgdGV4dAotICogQGxlbmd0aDogVGhlIGxlbmd0aCBvZiB0aGUgY2lwaGVyIHRleHQgbmFtZQotICogQGRlY3J5cHRlZF9uYW1lOiBUaGUgcGxhaW50ZXh0IG5hbWUKLSAqCi0gKiBEZWNvZGVzIGFuZCBkZWNyeXB0cyB0aGUgZmlsZW5hbWUuCi0gKgotICogV2UgYXNzdW1lIHRoYXQgd2UgaGF2ZSBhIHByb3Blcmx5IGluaXRpYWxpemVkIGNyeXB0byBjb250ZXh0LAotICogcG9pbnRlZCB0byBieSBjcnlwdF9zdGF0LT50Zm0uCi0gKgotICogVE9ETzogSW1wbGVtZW50IGZpbGVuYW1lIGRlY29kaW5nIGFuZCBkZWNyeXB0aW9uIGhlcmUsIGluIHBsYWNlIG9mCi0gKiBtZW1jcHkuIFdlIGFyZSBrZWVwaW5nIHRoZSBmcmFtZXdvcmsgYXJvdW5kIGZvciBub3cgdG8gKDEpCi0gKiBmYWNpbGl0YXRlIHRlc3Rpbmcgb2YgdGhlIGNvbXBvbmVudHMgbmVlZGVkIHRvIGltcGxlbWVudCBmaWxlbmFtZQotICogZW5jcnlwdGlvbiBhbmQgKDIpIHRvIHByb3ZpZGUgYSBjb2RlIGJhc2UgZnJvbSB3aGljaCBvdGhlcgotICogZGV2ZWxvcGVycyBpbiB0aGUgY29tbXVuaXR5IGNhbiBlYXNpbHkgaW1wbGVtZW50IHRoaXMgZmVhdHVyZS4KLSAqCi0gKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgZGVjb2RlZCBmaWxlbmFtZTsgbmVnYXRpdmUgaWYgZXJyb3IKLSAqLwotaW50Ci1lY3J5cHRmc19kZWNvZGVfZmlsZW5hbWUoc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgKmNyeXB0X3N0YXQsCi0JCQkgY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbmd0aCwgY2hhciAqKmRlY3J5cHRlZF9uYW1lKQorc3RhdGljIGludCBlY3J5cHRmc19jb3B5X2ZpbGVuYW1lKGNoYXIgKipjb3BpZWRfbmFtZSwgc2l6ZV90ICpjb3BpZWRfbmFtZV9zaXplLAorCQkJCSAgY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IG5hbWVfc2l6ZSkKIHsKLQlpbnQgZXJyb3IgPSAwOworCWludCByYyA9IDA7CiAKLQkoKmRlY3J5cHRlZF9uYW1lKSA9IGttYWxsb2MobGVuZ3RoICsgMiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCEoKmRlY3J5cHRlZF9uYW1lKSkgewotCQllcnJvciA9IC1FTk9NRU07CisJKCpjb3BpZWRfbmFtZSkgPSBrbWFsbG9jKChuYW1lX3NpemUgKyAyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCEoKmNvcGllZF9uYW1lKSkgeworCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwogCX0KLQkvKiBUT0RPOiBGaWxlbmFtZSBlbmNyeXB0aW9uIGlzIGEgc2NoZWR1bGVkIGZlYXR1cmUgZm9yIGEKLQkgKiBmdXR1cmUgdmVyc2lvbiBvZiBlQ3J5cHRmcy4gVGhpcyBmdW5jdGlvbiBpcyBoZXJlIG9ubHkgZm9yCi0JICogdGhlIHB1cnBvc2Ugb2YgcHJvdmlkaW5nIGEgZnJhbWV3b3JrIGZvciBvdGhlciBkZXZlbG9wZXJzCi0JICogdG8gZWFzaWx5IGltcGxlbWVudCBmaWxlbmFtZSBlbmNyeXB0aW9uLiBIaW50OiBSZXBsYWNlIHRoaXMKLQkgKiBtZW1jcHkoKSB3aXRoIGEgY2FsbCB0byBkZWNvZGUgYW5kIGRlY3J5cHQgdGhlCi0JICogZmlsZW5hbWUsIHRoZSBzZXQgdGhlIGxlbmd0aCBhY2NvcmRpbmdseS4gKi8KLQltZW1jcHkoKHZvaWQgKikoKmRlY3J5cHRlZF9uYW1lKSwgKHZvaWQgKiluYW1lLCBsZW5ndGgpOwotCSgqZGVjcnlwdGVkX25hbWUpW2xlbmd0aCArIDFdID0gJ1wwJzsJLyogT25seSBmb3IgY29udmVuaWVuY2UKKwltZW1jcHkoKHZvaWQgKikoKmNvcGllZF9uYW1lKSwgKHZvaWQgKiluYW1lLCBuYW1lX3NpemUpOworCSgqY29waWVkX25hbWUpWyhuYW1lX3NpemUpXSA9ICdcMCc7CS8qIE9ubHkgZm9yIGNvbnZlbmllbmNlCiAJCQkJCQkgKiBpbiBwcmludGluZyBvdXQgdGhlCiAJCQkJCQkgKiBzdHJpbmcgaW4gZGVidWcKIAkJCQkJCSAqIG1lc3NhZ2VzICovCi0JZXJyb3IgPSBsZW5ndGg7CisJKCpjb3BpZWRfbmFtZV9zaXplKSA9IChuYW1lX3NpemUgKyAxKTsKIG91dDoKLQlyZXR1cm4gZXJyb3I7CisJcmV0dXJuIHJjOwogfQogCiAvKioKQEAgLTE3NDAsNyArMTc1Miw3IEBACiAJKmtleV90Zm0gPSBOVUxMOwogCWlmICgqa2V5X3NpemUgPiBFQ1JZUFRGU19NQVhfS0VZX0JZVEVTKSB7CiAJCXJjID0gLUVJTlZBTDsKLQkJcHJpbnRrKEtFUk5fRVJSICJSZXF1ZXN0ZWQga2V5IHNpemUgaXMgWyVaZF0gYnl0ZXM7IG1heGltdW0gIgorCQlwcmludGsoS0VSTl9FUlIgIlJlcXVlc3RlZCBrZXkgc2l6ZSBpcyBbJXpkXSBieXRlczsgbWF4aW11bSAiCiAJCSAgICAgICJhbGxvd2FibGUgaXMgWyVkXVxuIiwgKmtleV9zaXplLCBFQ1JZUFRGU19NQVhfS0VZX0JZVEVTKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMTc2NSw3ICsxNzc3LDcgQEAKIAlnZXRfcmFuZG9tX2J5dGVzKGR1bW15X2tleSwgKmtleV9zaXplKTsKIAlyYyA9IGNyeXB0b19ibGtjaXBoZXJfc2V0a2V5KCprZXlfdGZtLCBkdW1teV9rZXksICprZXlfc2l6ZSk7CiAJaWYgKHJjKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgYXR0ZW1wdGluZyB0byBzZXQga2V5IG9mIHNpemUgWyVaZF0gZm9yICIKKwkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciBhdHRlbXB0aW5nIHRvIHNldCBrZXkgb2Ygc2l6ZSBbJXpkXSBmb3IgIgogCQkgICAgICAgImNpcGhlciBbJXNdOyByYyA9IFslZF1cbiIsICprZXlfc2l6ZSwgY2lwaGVyX25hbWUsIHJjKTsKIAkJcmMgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKQEAgLTE5MTAsMyArMTkyMiwzNDEgQEAKIAltdXRleF91bmxvY2soJmtleV90Zm1fbGlzdF9tdXRleCk7CiAJcmV0dXJuIHJjOwogfQorCisvKiA2NCBjaGFyYWN0ZXJzIGZvcm1pbmcgYSA2LWJpdCB0YXJnZXQgZmllbGQgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpwb3J0YWJsZV9maWxlbmFtZV9jaGFycyA9ICgiLS4wMTIzNDU2Nzg5QUJDRCIKKwkJCQkJCSAiRUZHSElKS0xNTk9QUVJTVCIKKwkJCQkJCSAiVVZXWFlaYWJjZGVmZ2hpaiIKKwkJCQkJCSAia2xtbm9wcXJzdHV2d3h5eiIpOworCisvKiBXZSBjb3VsZCBlaXRoZXIgb2Zmc2V0IG9uIGV2ZXJ5IHJldmVyc2UgbWFwIG9yIGp1c3QgcGFkIHNvbWUgMHgwMCdzCisgKiBhdCB0aGUgZnJvbnQgaGVyZSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZmlsZW5hbWVfcmV2X21hcFtdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAxNSAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMzEgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAzOSAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIC8qIDQ3ICovCisJMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwgMHgwOSwgLyogNTUgKi8KKwkweDBBLCAweDBCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiA2MyAqLworCTB4MDAsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYsIDB4MTAsIDB4MTEsIDB4MTIsIC8qIDcxICovCisJMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgMHgxOCwgMHgxOSwgMHgxQSwgLyogNzkgKi8KKwkweDFCLCAweDFDLCAweDFELCAweDFFLCAweDFGLCAweDIwLCAweDIxLCAweDIyLCAvKiA4NyAqLworCTB4MjMsIDB4MjQsIDB4MjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDk1ICovCisJMHgwMCwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyQSwgMHgyQiwgMHgyQywgLyogMTAzICovCisJMHgyRCwgMHgyRSwgMHgyRiwgMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgLyogMTExICovCisJMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwgMHgzOSwgMHgzQSwgMHgzQiwgMHgzQywgLyogMTE5ICovCisJMHgzRCwgMHgzRSwgMHgzRgorfTsKKworLyoqCisgKiBlY3J5cHRmc19lbmNvZGVfZm9yX2ZpbGVuYW1lCisgKiBAZHN0OiBEZXN0aW5hdGlvbiBsb2NhdGlvbiBmb3IgZW5jb2RlZCBmaWxlbmFtZQorICogQGRzdF9zaXplOiBTaXplIG9mIHRoZSBlbmNvZGVkIGZpbGVuYW1lIGluIGJ5dGVzCisgKiBAc3JjOiBTb3VyY2UgbG9jYXRpb24gZm9yIHRoZSBmaWxlbmFtZSB0byBlbmNvZGUKKyAqIEBzcmNfc2l6ZTogU2l6ZSBvZiB0aGUgc291cmNlIGluIGJ5dGVzCisgKi8KK3ZvaWQgZWNyeXB0ZnNfZW5jb2RlX2Zvcl9maWxlbmFtZSh1bnNpZ25lZCBjaGFyICpkc3QsIHNpemVfdCAqZHN0X3NpemUsCisJCQkJICB1bnNpZ25lZCBjaGFyICpzcmMsIHNpemVfdCBzcmNfc2l6ZSkKK3sKKwlzaXplX3QgbnVtX2Jsb2NrczsKKwlzaXplX3QgYmxvY2tfbnVtID0gMDsKKwlzaXplX3QgZHN0X29mZnNldCA9IDA7CisJdW5zaWduZWQgY2hhciBsYXN0X2Jsb2NrWzNdOworCisJaWYgKHNyY19zaXplID09IDApIHsKKwkJKCpkc3Rfc2l6ZSkgPSAwOworCQlnb3RvIG91dDsKKwl9CisJbnVtX2Jsb2NrcyA9IChzcmNfc2l6ZSAvIDMpOworCWlmICgoc3JjX3NpemUgJSAzKSA9PSAwKSB7CisJCW1lbWNweShsYXN0X2Jsb2NrLCAoJnNyY1tzcmNfc2l6ZSAtIDNdKSwgMyk7CisJfSBlbHNlIHsKKwkJbnVtX2Jsb2NrcysrOworCQlsYXN0X2Jsb2NrWzJdID0gMHgwMDsKKwkJc3dpdGNoIChzcmNfc2l6ZSAlIDMpIHsKKwkJY2FzZSAxOgorCQkJbGFzdF9ibG9ja1swXSA9IHNyY1tzcmNfc2l6ZSAtIDFdOworCQkJbGFzdF9ibG9ja1sxXSA9IDB4MDA7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJbGFzdF9ibG9ja1swXSA9IHNyY1tzcmNfc2l6ZSAtIDJdOworCQkJbGFzdF9ibG9ja1sxXSA9IHNyY1tzcmNfc2l6ZSAtIDFdOworCQl9CisJfQorCSgqZHN0X3NpemUpID0gKG51bV9ibG9ja3MgKiA0KTsKKwlpZiAoIWRzdCkKKwkJZ290byBvdXQ7CisJd2hpbGUgKGJsb2NrX251bSA8IG51bV9ibG9ja3MpIHsKKwkJdW5zaWduZWQgY2hhciAqc3JjX2Jsb2NrOworCQl1bnNpZ25lZCBjaGFyIGRzdF9ibG9ja1s0XTsKKworCQlpZiAoYmxvY2tfbnVtID09IChudW1fYmxvY2tzIC0gMSkpCisJCQlzcmNfYmxvY2sgPSBsYXN0X2Jsb2NrOworCQllbHNlCisJCQlzcmNfYmxvY2sgPSAmc3JjW2Jsb2NrX251bSAqIDNdOworCQlkc3RfYmxvY2tbMF0gPSAoKHNyY19ibG9ja1swXSA+PiAyKSAmIDB4M0YpOworCQlkc3RfYmxvY2tbMV0gPSAoKChzcmNfYmxvY2tbMF0gPDwgNCkgJiAweDMwKQorCQkJCXwgKChzcmNfYmxvY2tbMV0gPj4gNCkgJiAweDBGKSk7CisJCWRzdF9ibG9ja1syXSA9ICgoKHNyY19ibG9ja1sxXSA8PCAyKSAmIDB4M0MpCisJCQkJfCAoKHNyY19ibG9ja1syXSA+PiA2KSAmIDB4MDMpKTsKKwkJZHN0X2Jsb2NrWzNdID0gKHNyY19ibG9ja1syXSAmIDB4M0YpOworCQlkc3RbZHN0X29mZnNldCsrXSA9IHBvcnRhYmxlX2ZpbGVuYW1lX2NoYXJzW2RzdF9ibG9ja1swXV07CisJCWRzdFtkc3Rfb2Zmc2V0KytdID0gcG9ydGFibGVfZmlsZW5hbWVfY2hhcnNbZHN0X2Jsb2NrWzFdXTsKKwkJZHN0W2RzdF9vZmZzZXQrK10gPSBwb3J0YWJsZV9maWxlbmFtZV9jaGFyc1tkc3RfYmxvY2tbMl1dOworCQlkc3RbZHN0X29mZnNldCsrXSA9IHBvcnRhYmxlX2ZpbGVuYW1lX2NoYXJzW2RzdF9ibG9ja1szXV07CisJCWJsb2NrX251bSsrOworCX0KK291dDoKKwlyZXR1cm47Cit9CisKKy8qKgorICogZWNyeXB0ZnNfZGVjb2RlX2Zyb21fZmlsZW5hbWUKKyAqIEBkc3Q6IElmIE5VTEwsIHRoaXMgZnVuY3Rpb24gb25seSBzZXRzIEBkc3Rfc2l6ZSBhbmQgcmV0dXJucy4gSWYKKyAqICAgICAgIG5vbi1OVUxMLCB0aGlzIGZ1bmN0aW9uIGRlY29kZXMgdGhlIGVuY29kZWQgb2N0ZXRzIGluIEBzcmMKKyAqICAgICAgIGludG8gdGhlIG1lbW9yeSB0aGF0IEBkc3QgcG9pbnRzIHRvLgorICogQGRzdF9zaXplOiBTZXQgdG8gdGhlIHNpemUgb2YgdGhlIGRlY29kZWQgc3RyaW5nLgorICogQHNyYzogVGhlIGVuY29kZWQgc2V0IG9mIG9jdGV0cyB0byBkZWNvZGUuCisgKiBAc3JjX3NpemU6IFRoZSBzaXplIG9mIHRoZSBlbmNvZGVkIHNldCBvZiBvY3RldHMgdG8gZGVjb2RlLgorICovCitzdGF0aWMgdm9pZAorZWNyeXB0ZnNfZGVjb2RlX2Zyb21fZmlsZW5hbWUodW5zaWduZWQgY2hhciAqZHN0LCBzaXplX3QgKmRzdF9zaXplLAorCQkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCBzaXplX3Qgc3JjX3NpemUpCit7CisJdTggY3VycmVudF9iaXRfb2Zmc2V0ID0gMDsKKwlzaXplX3Qgc3JjX2J5dGVfb2Zmc2V0ID0gMDsKKwlzaXplX3QgZHN0X2J5dGVfb2Zmc2V0ID0gMDsKKworCWlmIChkc3QgPT0gTlVMTCkgeworCQkvKiBOb3QgZXhhY3Q7IGNvbnNlcnZhdGl2ZWx5IGxvbmcuIEV2ZXJ5IGJsb2NrIG9mIDQKKwkJICogZW5jb2RlZCBjaGFyYWN0ZXJzIGRlY29kZXMgaW50byBhIGJsb2NrIG9mIDMKKwkJICogZGVjb2RlZCBjaGFyYWN0ZXJzLiBUaGlzIHNlZ21lbnQgb2YgY29kZSBwcm92aWRlcworCQkgKiB0aGUgY2FsbGVyIHdpdGggdGhlIG1heGltdW0gYW1vdW50IG9mIGFsbG9jYXRlZAorCQkgKiBzcGFjZSB0aGF0IEBkc3Qgd2lsbCBuZWVkIHRvIHBvaW50IHRvIGluIGEKKwkJICogc3Vic2VxdWVudCBjYWxsLiAqLworCQkoKmRzdF9zaXplKSA9ICgoKHNyY19zaXplICsgMSkgKiAzKSAvIDQpOworCQlnb3RvIG91dDsKKwl9CisJd2hpbGUgKHNyY19ieXRlX29mZnNldCA8IHNyY19zaXplKSB7CisJCXVuc2lnbmVkIGNoYXIgc3JjX2J5dGUgPQorCQkJCWZpbGVuYW1lX3Jldl9tYXBbKGludClzcmNbc3JjX2J5dGVfb2Zmc2V0XV07CisKKwkJc3dpdGNoIChjdXJyZW50X2JpdF9vZmZzZXQpIHsKKwkJY2FzZSAwOgorCQkJZHN0W2RzdF9ieXRlX29mZnNldF0gPSAoc3JjX2J5dGUgPDwgMik7CisJCQljdXJyZW50X2JpdF9vZmZzZXQgPSA2OworCQkJYnJlYWs7CisJCWNhc2UgNjoKKwkJCWRzdFtkc3RfYnl0ZV9vZmZzZXQrK10gfD0gKHNyY19ieXRlID4+IDQpOworCQkJZHN0W2RzdF9ieXRlX29mZnNldF0gPSAoKHNyY19ieXRlICYgMHhGKQorCQkJCQkJIDw8IDQpOworCQkJY3VycmVudF9iaXRfb2Zmc2V0ID0gNDsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQlkc3RbZHN0X2J5dGVfb2Zmc2V0KytdIHw9IChzcmNfYnl0ZSA+PiAyKTsKKwkJCWRzdFtkc3RfYnl0ZV9vZmZzZXRdID0gKHNyY19ieXRlIDw8IDYpOworCQkJY3VycmVudF9iaXRfb2Zmc2V0ID0gMjsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlkc3RbZHN0X2J5dGVfb2Zmc2V0KytdIHw9IChzcmNfYnl0ZSk7CisJCQlkc3RbZHN0X2J5dGVfb2Zmc2V0XSA9IDA7CisJCQljdXJyZW50X2JpdF9vZmZzZXQgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJc3JjX2J5dGVfb2Zmc2V0Kys7CisJfQorCSgqZHN0X3NpemUpID0gZHN0X2J5dGVfb2Zmc2V0Oworb3V0OgorCXJldHVybjsKK30KKworLyoqCisgKiBlY3J5cHRmc19lbmNyeXB0X2FuZF9lbmNvZGVfZmlsZW5hbWUgLSBjb252ZXJ0cyBhIHBsYWludGV4dCBmaWxlIG5hbWUgdG8gY2lwaGVyIHRleHQKKyAqIEBjcnlwdF9zdGF0OiBUaGUgY3J5cHRfc3RhdCBzdHJ1Y3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWxlIGFuZW0gdG8gZW5jb2RlCisgKiBAbmFtZTogVGhlIHBsYWludGV4dCBuYW1lCisgKiBAbGVuZ3RoOiBUaGUgbGVuZ3RoIG9mIHRoZSBwbGFpbnRleHQKKyAqIEBlbmNvZGVkX25hbWU6IFRoZSBlbmN5cHRlZCBuYW1lCisgKgorICogRW5jcnlwdHMgYW5kIGVuY29kZXMgYSBmaWxlbmFtZSBpbnRvIHNvbWV0aGluZyB0aGF0IGNvbnN0aXR1dGVzIGEKKyAqIHZhbGlkIGZpbGVuYW1lIGZvciBhIGZpbGVzeXN0ZW0sIHdpdGggcHJpbnRhYmxlIGNoYXJhY3RlcnMuCisgKgorICogV2UgYXNzdW1lIHRoYXQgd2UgaGF2ZSBhIHByb3Blcmx5IGluaXRpYWxpemVkIGNyeXB0byBjb250ZXh0LAorICogcG9pbnRlZCB0byBieSBjcnlwdF9zdGF0LT50Zm0uCisgKgorICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3M7IG5vbi16ZXJvIG9uIG90aGVyd2lzZQorICovCitpbnQgZWNyeXB0ZnNfZW5jcnlwdF9hbmRfZW5jb2RlX2ZpbGVuYW1lKAorCWNoYXIgKiplbmNvZGVkX25hbWUsCisJc2l6ZV90ICplbmNvZGVkX25hbWVfc2l6ZSwKKwlzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCAqY3J5cHRfc3RhdCwKKwlzdHJ1Y3QgZWNyeXB0ZnNfbW91bnRfY3J5cHRfc3RhdCAqbW91bnRfY3J5cHRfc3RhdCwKKwljb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbmFtZV9zaXplKQoreworCXNpemVfdCBlbmNvZGVkX25hbWVfbm9fcHJlZml4X3NpemU7CisJaW50IHJjID0gMDsKKworCSgqZW5jb2RlZF9uYW1lKSA9IE5VTEw7CisJKCplbmNvZGVkX25hbWVfc2l6ZSkgPSAwOworCWlmICgoY3J5cHRfc3RhdCAmJiAoY3J5cHRfc3RhdC0+ZmxhZ3MgJiBFQ1JZUFRGU19FTkNSWVBUX0ZJTEVOQU1FUykpCisJICAgIHx8IChtb3VudF9jcnlwdF9zdGF0ICYmIChtb3VudF9jcnlwdF9zdGF0LT5mbGFncworCQkJCSAgICAgJiBFQ1JZUFRGU19HTE9CQUxfRU5DUllQVF9GSUxFTkFNRVMpKSkgeworCQlzdHJ1Y3QgZWNyeXB0ZnNfZmlsZW5hbWUgKmZpbGVuYW1lOworCisJCWZpbGVuYW1lID0ga3phbGxvYyhzaXplb2YoKmZpbGVuYW1lKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghZmlsZW5hbWUpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IE91dCBvZiBtZW1vcnkgd2hpbHN0IGF0dGVtcHRpbmcgIgorCQkJICAgICAgICJ0byBremFsbG9jIFslemRdIGJ5dGVzXG4iLCBfX2Z1bmNfXywKKwkJCSAgICAgICBzaXplb2YoKmZpbGVuYW1lKSk7CisJCQlyYyA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCQlmaWxlbmFtZS0+ZmlsZW5hbWUgPSAoY2hhciAqKW5hbWU7CisJCWZpbGVuYW1lLT5maWxlbmFtZV9zaXplID0gbmFtZV9zaXplOworCQlyYyA9IGVjcnlwdGZzX2VuY3J5cHRfZmlsZW5hbWUoZmlsZW5hbWUsIGNyeXB0X3N0YXQsCisJCQkJCSAgICAgICBtb3VudF9jcnlwdF9zdGF0KTsKKwkJaWYgKHJjKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciBhdHRlbXB0aW5nIHRvIGVuY3J5cHQgIgorCQkJICAgICAgICJmaWxlbmFtZTsgcmMgPSBbJWRdXG4iLCBfX2Z1bmNfXywgcmMpOworCQkJa2ZyZWUoZmlsZW5hbWUpOworCQkJZ290byBvdXQ7CisJCX0KKwkJZWNyeXB0ZnNfZW5jb2RlX2Zvcl9maWxlbmFtZSgKKwkJCU5VTEwsICZlbmNvZGVkX25hbWVfbm9fcHJlZml4X3NpemUsCisJCQlmaWxlbmFtZS0+ZW5jcnlwdGVkX2ZpbGVuYW1lLAorCQkJZmlsZW5hbWUtPmVuY3J5cHRlZF9maWxlbmFtZV9zaXplKTsKKwkJaWYgKChjcnlwdF9zdGF0ICYmIChjcnlwdF9zdGF0LT5mbGFncworCQkJCSAgICAmIEVDUllQVEZTX0VOQ0ZOX1VTRV9NT1VOVF9GTkVLKSkKKwkJICAgIHx8IChtb3VudF9jcnlwdF9zdGF0CisJCQkmJiAobW91bnRfY3J5cHRfc3RhdC0+ZmxhZ3MKKwkJCSAgICAmIEVDUllQVEZTX0dMT0JBTF9FTkNGTl9VU0VfTU9VTlRfRk5FSykpKQorCQkJKCplbmNvZGVkX25hbWVfc2l6ZSkgPQorCQkJCShFQ1JZUFRGU19GTkVLX0VOQ1JZUFRFRF9GSUxFTkFNRV9QUkVGSVhfU0laRQorCQkJCSArIGVuY29kZWRfbmFtZV9ub19wcmVmaXhfc2l6ZSk7CisJCWVsc2UKKwkJCSgqZW5jb2RlZF9uYW1lX3NpemUpID0KKwkJCQkoRUNSWVBURlNfRkVLX0VOQ1JZUFRFRF9GSUxFTkFNRV9QUkVGSVhfU0laRQorCQkJCSArIGVuY29kZWRfbmFtZV9ub19wcmVmaXhfc2l6ZSk7CisJCSgqZW5jb2RlZF9uYW1lKSA9IGttYWxsb2MoKCplbmNvZGVkX25hbWVfc2l6ZSkgKyAxLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCEoKmVuY29kZWRfbmFtZSkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IE91dCBvZiBtZW1vcnkgd2hpbHN0IGF0dGVtcHRpbmcgIgorCQkJICAgICAgICJ0byBremFsbG9jIFslemRdIGJ5dGVzXG4iLCBfX2Z1bmNfXywKKwkJCSAgICAgICAoKmVuY29kZWRfbmFtZV9zaXplKSk7CisJCQlyYyA9IC1FTk9NRU07CisJCQlrZnJlZShmaWxlbmFtZS0+ZW5jcnlwdGVkX2ZpbGVuYW1lKTsKKwkJCWtmcmVlKGZpbGVuYW1lKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmICgoY3J5cHRfc3RhdCAmJiAoY3J5cHRfc3RhdC0+ZmxhZ3MKKwkJCQkgICAgJiBFQ1JZUFRGU19FTkNGTl9VU0VfTU9VTlRfRk5FSykpCisJCSAgICB8fCAobW91bnRfY3J5cHRfc3RhdAorCQkJJiYgKG1vdW50X2NyeXB0X3N0YXQtPmZsYWdzCisJCQkgICAgJiBFQ1JZUFRGU19HTE9CQUxfRU5DRk5fVVNFX01PVU5UX0ZORUspKSkgeworCQkJbWVtY3B5KCgqZW5jb2RlZF9uYW1lKSwKKwkJCSAgICAgICBFQ1JZUFRGU19GTkVLX0VOQ1JZUFRFRF9GSUxFTkFNRV9QUkVGSVgsCisJCQkgICAgICAgRUNSWVBURlNfRk5FS19FTkNSWVBURURfRklMRU5BTUVfUFJFRklYX1NJWkUpOworCQkJZWNyeXB0ZnNfZW5jb2RlX2Zvcl9maWxlbmFtZSgKKwkJCSAgICAoKCplbmNvZGVkX25hbWUpCisJCQkgICAgICsgRUNSWVBURlNfRk5FS19FTkNSWVBURURfRklMRU5BTUVfUFJFRklYX1NJWkUpLAorCQkJICAgICZlbmNvZGVkX25hbWVfbm9fcHJlZml4X3NpemUsCisJCQkgICAgZmlsZW5hbWUtPmVuY3J5cHRlZF9maWxlbmFtZSwKKwkJCSAgICBmaWxlbmFtZS0+ZW5jcnlwdGVkX2ZpbGVuYW1lX3NpemUpOworCQkJKCplbmNvZGVkX25hbWVfc2l6ZSkgPQorCQkJCShFQ1JZUFRGU19GTkVLX0VOQ1JZUFRFRF9GSUxFTkFNRV9QUkVGSVhfU0laRQorCQkJCSArIGVuY29kZWRfbmFtZV9ub19wcmVmaXhfc2l6ZSk7CisJCQkoKmVuY29kZWRfbmFtZSlbKCplbmNvZGVkX25hbWVfc2l6ZSldID0gJ1wwJzsKKwkJCSgqZW5jb2RlZF9uYW1lX3NpemUpKys7CisJCX0gZWxzZSB7CisJCQlyYyA9IC1FTk9UU1VQUDsKKwkJfQorCQlpZiAocmMpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIGF0dGVtcHRpbmcgdG8gZW5jb2RlICIKKwkJCSAgICAgICAiZW5jcnlwdGVkIGZpbGVuYW1lOyByYyA9IFslZF1cbiIsIF9fZnVuY19fLAorCQkJICAgICAgIHJjKTsKKwkJCWtmcmVlKCgqZW5jb2RlZF9uYW1lKSk7CisJCQkoKmVuY29kZWRfbmFtZSkgPSBOVUxMOworCQkJKCplbmNvZGVkX25hbWVfc2l6ZSkgPSAwOworCQl9CisJCWtmcmVlKGZpbGVuYW1lLT5lbmNyeXB0ZWRfZmlsZW5hbWUpOworCQlrZnJlZShmaWxlbmFtZSk7CisJfSBlbHNlIHsKKwkJcmMgPSBlY3J5cHRmc19jb3B5X2ZpbGVuYW1lKGVuY29kZWRfbmFtZSwKKwkJCQkJICAgIGVuY29kZWRfbmFtZV9zaXplLAorCQkJCQkgICAgbmFtZSwgbmFtZV9zaXplKTsKKwl9CitvdXQ6CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIGVjcnlwdGZzX2RlY29kZV9hbmRfZGVjcnlwdF9maWxlbmFtZSAtIGNvbnZlcnRzIHRoZSBlbmNvZGVkIGNpcGhlciB0ZXh0IG5hbWUgdG8gZGVjb2RlZCBwbGFpbnRleHQKKyAqIEBwbGFpbnRleHRfbmFtZTogVGhlIHBsYWludGV4dCBuYW1lCisgKiBAcGxhaW50ZXh0X25hbWVfc2l6ZTogVGhlIHBsYWludGV4dCBuYW1lIHNpemUKKyAqIEBlY3J5cHRmc19kaXJfZGVudHJ5OiBlQ3J5cHRmcyBkaXJlY3RvcnkgZGVudHJ5CisgKiBAbmFtZTogVGhlIGZpbGVuYW1lIGluIGNpcGhlciB0ZXh0CisgKiBAbmFtZV9zaXplOiBUaGUgY2lwaGVyIHRleHQgbmFtZSBzaXplCisgKgorICogRGVjcnlwdHMgYW5kIGRlY29kZXMgdGhlIGZpbGVuYW1lLgorICoKKyAqIFJldHVybnMgemVybyBvbiBlcnJvcjsgbm9uLXplcm8gb3RoZXJ3aXNlCisgKi8KK2ludCBlY3J5cHRmc19kZWNvZGVfYW5kX2RlY3J5cHRfZmlsZW5hbWUoY2hhciAqKnBsYWludGV4dF9uYW1lLAorCQkJCQkgc2l6ZV90ICpwbGFpbnRleHRfbmFtZV9zaXplLAorCQkJCQkgc3RydWN0IGRlbnRyeSAqZWNyeXB0ZnNfZGlyX2RlbnRyeSwKKwkJCQkJIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lX3NpemUpCit7CisJY2hhciAqZGVjb2RlZF9uYW1lOworCXNpemVfdCBkZWNvZGVkX25hbWVfc2l6ZTsKKwlzaXplX3QgcGFja2V0X3NpemU7CisJaW50IHJjID0gMDsKKworCWlmICgobmFtZV9zaXplID4gRUNSWVBURlNfRk5FS19FTkNSWVBURURfRklMRU5BTUVfUFJFRklYX1NJWkUpCisJICAgICYmIChzdHJuY21wKG5hbWUsIEVDUllQVEZTX0ZORUtfRU5DUllQVEVEX0ZJTEVOQU1FX1BSRUZJWCwKKwkJCUVDUllQVEZTX0ZORUtfRU5DUllQVEVEX0ZJTEVOQU1FX1BSRUZJWF9TSVpFKSA9PSAwKSkgeworCQlzdHJ1Y3QgZWNyeXB0ZnNfbW91bnRfY3J5cHRfc3RhdCAqbW91bnRfY3J5cHRfc3RhdCA9CisJCQkmZWNyeXB0ZnNfc3VwZXJibG9ja190b19wcml2YXRlKAorCQkJCWVjcnlwdGZzX2Rpcl9kZW50cnktPmRfc2IpLT5tb3VudF9jcnlwdF9zdGF0OworCQljb25zdCBjaGFyICpvcmlnX25hbWUgPSBuYW1lOworCQlzaXplX3Qgb3JpZ19uYW1lX3NpemUgPSBuYW1lX3NpemU7CisKKwkJbmFtZSArPSBFQ1JZUFRGU19GTkVLX0VOQ1JZUFRFRF9GSUxFTkFNRV9QUkVGSVhfU0laRTsKKwkJbmFtZV9zaXplIC09IEVDUllQVEZTX0ZORUtfRU5DUllQVEVEX0ZJTEVOQU1FX1BSRUZJWF9TSVpFOworCQllY3J5cHRmc19kZWNvZGVfZnJvbV9maWxlbmFtZShOVUxMLCAmZGVjb2RlZF9uYW1lX3NpemUsCisJCQkJCSAgICAgIG5hbWUsIG5hbWVfc2l6ZSk7CisJCWRlY29kZWRfbmFtZSA9IGttYWxsb2MoZGVjb2RlZF9uYW1lX3NpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIWRlY29kZWRfbmFtZSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogT3V0IG9mIG1lbW9yeSB3aGlsc3QgYXR0ZW1wdGluZyAiCisJCQkgICAgICAgInRvIGttYWxsb2MgWyV6ZF0gYnl0ZXNcbiIsIF9fZnVuY19fLAorCQkJICAgICAgIGRlY29kZWRfbmFtZV9zaXplKTsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWVjcnlwdGZzX2RlY29kZV9mcm9tX2ZpbGVuYW1lKGRlY29kZWRfbmFtZSwgJmRlY29kZWRfbmFtZV9zaXplLAorCQkJCQkgICAgICBuYW1lLCBuYW1lX3NpemUpOworCQlyYyA9IGVjcnlwdGZzX3BhcnNlX3RhZ183MF9wYWNrZXQocGxhaW50ZXh0X25hbWUsCisJCQkJCQkgIHBsYWludGV4dF9uYW1lX3NpemUsCisJCQkJCQkgICZwYWNrZXRfc2l6ZSwKKwkJCQkJCSAgbW91bnRfY3J5cHRfc3RhdCwKKwkJCQkJCSAgZGVjb2RlZF9uYW1lLAorCQkJCQkJICBkZWNvZGVkX25hbWVfc2l6ZSk7CisJCWlmIChyYykgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENvdWxkIG5vdCBwYXJzZSB0YWcgNzAgcGFja2V0ICIKKwkJCSAgICAgICAiZnJvbSBmaWxlbmFtZTsgY29weWluZyB0aHJvdWdoIGZpbGVuYW1lICIKKwkJCSAgICAgICAiYXMtaXNcbiIsIF9fZnVuY19fKTsKKwkJCXJjID0gZWNyeXB0ZnNfY29weV9maWxlbmFtZShwbGFpbnRleHRfbmFtZSwKKwkJCQkJCSAgICBwbGFpbnRleHRfbmFtZV9zaXplLAorCQkJCQkJICAgIG9yaWdfbmFtZSwgb3JpZ19uYW1lX3NpemUpOworCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCX0gZWxzZSB7CisJCXJjID0gZWNyeXB0ZnNfY29weV9maWxlbmFtZShwbGFpbnRleHRfbmFtZSwKKwkJCQkJICAgIHBsYWludGV4dF9uYW1lX3NpemUsCisJCQkJCSAgICBuYW1lLCBuYW1lX3NpemUpOworCQlnb3RvIG91dDsKKwl9CitvdXRfZnJlZToKKwlrZnJlZShkZWNvZGVkX25hbWUpOworb3V0OgorCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2ZzL2VjcnlwdGZzL2VjcnlwdGZzX2tlcm5lbC5oIGIvZnMvZWNyeXB0ZnMvZWNyeXB0ZnNfa2VybmVsLmgKaW5kZXggYTc1MDI2ZC4uYzExZmM5NSAxMDA2NDQKLS0tIGEvZnMvZWNyeXB0ZnMvZWNyeXB0ZnNfa2VybmVsLmgKKysrIGIvZnMvZWNyeXB0ZnMvZWNyeXB0ZnNfa2VybmVsLmgKQEAgLTUxLDEyICs1MSwxNiBAQAogI2RlZmluZSBFQ1JZUFRGU19WRVJTSU9OSU5HX1hBVFRSICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCiAjZGVmaW5lIEVDUllQVEZTX1ZFUlNJT05JTkdfTVVMVEtFWSAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKICNkZWZpbmUgRUNSWVBURlNfVkVSU0lPTklOR19ERVZNSVNDICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBFQ1JZUFRGU19WRVJTSU9OSU5HX0hNQUMgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEVDUllQVEZTX1ZFUlNJT05JTkdfRklMRU5BTUVfRU5DUllQVElPTiAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgRUNSWVBURlNfVkVSU0lPTklOR19HQ00gICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAogI2RlZmluZSBFQ1JZUFRGU19WRVJTSU9OSU5HX01BU0sgKEVDUllQVEZTX1ZFUlNJT05JTkdfUEFTU1BIUkFTRSBcCiAJCQkJICB8IEVDUllQVEZTX1ZFUlNJT05JTkdfUExBSU5URVhUX1BBU1NUSFJPVUdIIFwKIAkJCQkgIHwgRUNSWVBURlNfVkVSU0lPTklOR19QVUJLRVkgXAogCQkJCSAgfCBFQ1JZUFRGU19WRVJTSU9OSU5HX1hBVFRSIFwKIAkJCQkgIHwgRUNSWVBURlNfVkVSU0lPTklOR19NVUxUS0VZIFwKLQkJCQkgIHwgRUNSWVBURlNfVkVSU0lPTklOR19ERVZNSVNDKQorCQkJCSAgfCBFQ1JZUFRGU19WRVJTSU9OSU5HX0RFVk1JU0MgXAorCQkJCSAgfCBFQ1JZUFRGU19WRVJTSU9OSU5HX0ZJTEVOQU1FX0VOQ1JZUFRJT04pCiAjZGVmaW5lIEVDUllQVEZTX01BWF9QQVNTV09SRF9MRU5HVEggNjQKICNkZWZpbmUgRUNSWVBURlNfTUFYX1BBU1NQSFJBU0VfQllURVMgRUNSWVBURlNfTUFYX1BBU1NXT1JEX0xFTkdUSAogI2RlZmluZSBFQ1JZUFRGU19TQUxUX1NJWkUgOApAQCAtMTk5LDYgKzIwMyw3IEBACiAjZGVmaW5lIEVDUllQVEZTX0RFRkFVTFRfQ0lQSEVSICJhZXMiCiAjZGVmaW5lIEVDUllQVEZTX0RFRkFVTFRfS0VZX0JZVEVTIDE2CiAjZGVmaW5lIEVDUllQVEZTX0RFRkFVTFRfSEFTSCAibWQ1IgorI2RlZmluZSBFQ1JZUFRGU19UQUdfNzBfRElHRVNUIEVDUllQVEZTX0RFRkFVTFRfSEFTSAogI2RlZmluZSBFQ1JZUFRGU19UQUdfMV9QQUNLRVRfVFlQRSAweDAxCiAjZGVmaW5lIEVDUllQVEZTX1RBR18zX1BBQ0tFVF9UWVBFIDB4OEMKICNkZWZpbmUgRUNSWVBURlNfVEFHXzExX1BBQ0tFVF9UWVBFIDB4RUQKQEAgLTIwNiwzMCArMjExLDY0IEBACiAjZGVmaW5lIEVDUllQVEZTX1RBR182NV9QQUNLRVRfVFlQRSAweDQxCiAjZGVmaW5lIEVDUllQVEZTX1RBR182Nl9QQUNLRVRfVFlQRSAweDQyCiAjZGVmaW5lIEVDUllQVEZTX1RBR182N19QQUNLRVRfVFlQRSAweDQzCisjZGVmaW5lIEVDUllQVEZTX1RBR183MF9QQUNLRVRfVFlQRSAweDQ2IC8qIEZORUstZW5jcnlwdGVkIGZpbGVuYW1lCisJCQkJCSAgKiBhcyBkZW50cnkgbmFtZSAqLworI2RlZmluZSBFQ1JZUFRGU19UQUdfNzFfUEFDS0VUX1RZUEUgMHg0NyAvKiBGTkVLLWVuY3J5cHRlZCBmaWxlbmFtZSBpbgorCQkJCQkgICogbWV0YWRhdGEgKi8KKyNkZWZpbmUgRUNSWVBURlNfVEFHXzcyX1BBQ0tFVF9UWVBFIDB4NDggLyogRkVLLWVuY3J5cHRlZCBmaWxlbmFtZSBhcworCQkJCQkgICogZGVudHJ5IG5hbWUgKi8KKyNkZWZpbmUgRUNSWVBURlNfVEFHXzczX1BBQ0tFVF9UWVBFIDB4NDkgLyogRkVLLWVuY3J5cHRlZCBmaWxlbmFtZSBhcworCQkJCQkgICogbWV0YWRhdGEgKi8KKy8qIENvbnN0cmFpbnQ6IEVDUllQVEZTX0ZJTEVOQU1FX01JTl9SQU5ET01fUFJFUEVORF9CWVRFUyA+PQorICogRUNSWVBURlNfTUFYX0lWX0JZVEVTICovCisjZGVmaW5lIEVDUllQVEZTX0ZJTEVOQU1FX01JTl9SQU5ET01fUFJFUEVORF9CWVRFUyAxNgorI2RlZmluZSBFQ1JZUFRGU19OT05fTlVMTCAweDQyIC8qIEEgcmVhc29uYWJsZSBzdWJzdGl0dXRlIGZvciBOVUxMICovCiAjZGVmaW5lIE1ENV9ESUdFU1RfU0laRSAxNgorI2RlZmluZSBFQ1JZUFRGU19UQUdfNzBfRElHRVNUX1NJWkUgTUQ1X0RJR0VTVF9TSVpFCisjZGVmaW5lIEVDUllQVEZTX0ZFS19FTkNSWVBURURfRklMRU5BTUVfUFJFRklYICJFQ1JZUFRGU19GRUtfRU5DUllQVEVELiIKKyNkZWZpbmUgRUNSWVBURlNfRkVLX0VOQ1JZUFRFRF9GSUxFTkFNRV9QUkVGSVhfU0laRSAyMworI2RlZmluZSBFQ1JZUFRGU19GTkVLX0VOQ1JZUFRFRF9GSUxFTkFNRV9QUkVGSVggIkVDUllQVEZTX0ZORUtfRU5DUllQVEVELiIKKyNkZWZpbmUgRUNSWVBURlNfRk5FS19FTkNSWVBURURfRklMRU5BTUVfUFJFRklYX1NJWkUgMjQKKyNkZWZpbmUgRUNSWVBURlNfRU5DUllQVEVEX0RFTlRSWV9OQU1FX0xFTiAoMTggKyAxICsgNCArIDEgKyAzMikKIAogc3RydWN0IGVjcnlwdGZzX2tleV9zaWcgewogCXN0cnVjdCBsaXN0X2hlYWQgY3J5cHRfc3RhdF9saXN0OwogCWNoYXIga2V5c2lnW0VDUllQVEZTX1NJR19TSVpFX0hFWF07CiB9OwogCitzdHJ1Y3QgZWNyeXB0ZnNfZmlsZW5hbWUgeworCXN0cnVjdCBsaXN0X2hlYWQgY3J5cHRfc3RhdF9saXN0OworI2RlZmluZSBFQ1JZUFRGU19GSUxFTkFNRV9DT05UQUlOU19ERUNSWVBURUQgMHgwMDAwMDAwMQorCXUzMiBmbGFnczsKKwl1MzIgc2VxX25vOworCWNoYXIgKmZpbGVuYW1lOworCWNoYXIgKmVuY3J5cHRlZF9maWxlbmFtZTsKKwlzaXplX3QgZmlsZW5hbWVfc2l6ZTsKKwlzaXplX3QgZW5jcnlwdGVkX2ZpbGVuYW1lX3NpemU7CisJY2hhciBmbmVrX3NpZ1tFQ1JZUFRGU19TSUdfU0laRV9IRVhdOworCWNoYXIgZGVudHJ5X25hbWVbRUNSWVBURlNfRU5DUllQVEVEX0RFTlRSWV9OQU1FX0xFTiArIDFdOworfTsKKwogLyoqCiAgKiBUaGlzIGlzIHRoZSBwcmltYXJ5IHN0cnVjdCBhc3NvY2lhdGVkIHdpdGggZWFjaCBlbmNyeXB0ZWQgZmlsZS4KICAqCiAgKiBUT0RPOiBjYWNoZSBhbGlnbi9wYWNrPwogICovCiBzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCB7Ci0jZGVmaW5lIEVDUllQVEZTX1NUUlVDVF9JTklUSUFMSVpFRCAweDAwMDAwMDAxCi0jZGVmaW5lIEVDUllQVEZTX1BPTElDWV9BUFBMSUVEICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEVDUllQVEZTX05FV19GSUxFICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEVDUllQVEZTX0VOQ1JZUFRFRCAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIEVDUllQVEZTX1NFQ1VSSVRZX1dBUk5JTkcgICAweDAwMDAwMDEwCi0jZGVmaW5lIEVDUllQVEZTX0VOQUJMRV9ITUFDICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIEVDUllQVEZTX0VOQ1JZUFRfSVZfUEFHRVMgICAweDAwMDAwMDQwCi0jZGVmaW5lIEVDUllQVEZTX0tFWV9WQUxJRCAgICAgICAgICAweDAwMDAwMDgwCi0jZGVmaW5lIEVDUllQVEZTX01FVEFEQVRBX0lOX1hBVFRSICAweDAwMDAwMTAwCi0jZGVmaW5lIEVDUllQVEZTX1ZJRVdfQVNfRU5DUllQVEVEICAweDAwMDAwMjAwCi0jZGVmaW5lIEVDUllQVEZTX0tFWV9TRVQgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEVDUllQVEZTX1NUUlVDVF9JTklUSUFMSVpFRCAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgRUNSWVBURlNfUE9MSUNZX0FQUExJRUQgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBFQ1JZUFRGU19ORVdfRklMRSAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEVDUllQVEZTX0VOQ1JZUFRFRCAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgRUNSWVBURlNfU0VDVVJJVFlfV0FSTklORyAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBFQ1JZUFRGU19FTkFCTEVfSE1BQyAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIEVDUllQVEZTX0VOQ1JZUFRfSVZfUEFHRVMgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgRUNSWVBURlNfS0VZX1ZBTElEICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBFQ1JZUFRGU19NRVRBREFUQV9JTl9YQVRUUiAgICAweDAwMDAwMTAwCisjZGVmaW5lIEVDUllQVEZTX1ZJRVdfQVNfRU5DUllQVEVEICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgRUNSWVBURlNfS0VZX1NFVCAgICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBFQ1JZUFRGU19FTkNSWVBUX0ZJTEVOQU1FUyAgICAweDAwMDAwODAwCisjZGVmaW5lIEVDUllQVEZTX0VOQ0ZOX1VTRV9NT1VOVF9GTkVLIDB4MDAwMDEwMDAKKyNkZWZpbmUgRUNSWVBURlNfRU5DRk5fVVNFX0ZFSyAgICAgICAgMHgwMDAwMjAwMAogCXUzMiBmbGFnczsKIAl1bnNpZ25lZCBpbnQgZmlsZV92ZXJzaW9uOwogCXNpemVfdCBpdl9ieXRlczsKQEAgLTMzMiwxMyArMzcxLDIwIEBACiAjZGVmaW5lIEVDUllQVEZTX1hBVFRSX01FVEFEQVRBX0VOQUJMRUQgICAgICAgIDB4MDAwMDAwMDIKICNkZWZpbmUgRUNSWVBURlNfRU5DUllQVEVEX1ZJRVdfRU5BQkxFRCAgICAgICAgMHgwMDAwMDAwNAogI2RlZmluZSBFQ1JZUFRGU19NT1VOVF9DUllQVF9TVEFUX0lOSVRJQUxJWkVEICAweDAwMDAwMDA4CisjZGVmaW5lIEVDUllQVEZTX0dMT0JBTF9FTkNSWVBUX0ZJTEVOQU1FUyAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgRUNSWVBURlNfR0xPQkFMX0VOQ0ZOX1VTRV9NT1VOVF9GTkVLICAgMHgwMDAwMDAyMAorI2RlZmluZSBFQ1JZUFRGU19HTE9CQUxfRU5DRk5fVVNFX0ZFSyAgICAgICAgICAweDAwMDAwMDQwCiAJdTMyIGZsYWdzOwogCXN0cnVjdCBsaXN0X2hlYWQgZ2xvYmFsX2F1dGhfdG9rX2xpc3Q7CiAJc3RydWN0IG11dGV4IGdsb2JhbF9hdXRoX3Rva19saXN0X211dGV4OwogCXNpemVfdCBudW1fZ2xvYmFsX2F1dGhfdG9rczsKIAlzaXplX3QgZ2xvYmFsX2RlZmF1bHRfY2lwaGVyX2tleV9zaXplOworCXNpemVfdCBnbG9iYWxfZGVmYXVsdF9mbl9jaXBoZXJfa2V5X2J5dGVzOwogCXVuc2lnbmVkIGNoYXIgZ2xvYmFsX2RlZmF1bHRfY2lwaGVyX25hbWVbRUNSWVBURlNfTUFYX0NJUEhFUl9OQU1FX1NJWkUKIAkJCQkJCSArIDFdOworCXVuc2lnbmVkIGNoYXIgZ2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX25hbWVbCisJCUVDUllQVEZTX01BWF9DSVBIRVJfTkFNRV9TSVpFICsgMV07CisJY2hhciBnbG9iYWxfZGVmYXVsdF9mbmVrX3NpZ1tFQ1JZUFRGU19TSUdfU0laRV9IRVggKyAxXTsKIH07CiAKIC8qIHN1cGVyYmxvY2sgcHJpdmF0ZSBkYXRhLiAqLwpAQCAtNTcxLDEzICs2MTcsMjIgQEAKIGludCBlY3J5cHRmc19pbnRlcnBvc2Uoc3RydWN0IGRlbnRyeSAqaGlkZGVuX2RlbnRyeSwKIAkJICAgICAgIHN0cnVjdCBkZW50cnkgKnRoaXNfZGVudHJ5LCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAogCQkgICAgICAgdTMyIGZsYWdzKTsKK2ludCBlY3J5cHRmc19sb29rdXBfYW5kX2ludGVycG9zZV9sb3dlcihzdHJ1Y3QgZGVudHJ5ICplY3J5cHRmc19kZW50cnksCisJCQkJCXN0cnVjdCBkZW50cnkgKmxvd2VyX2RlbnRyeSwKKwkJCQkJc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgKmNyeXB0X3N0YXQsCisJCQkJCXN0cnVjdCBpbm9kZSAqZWNyeXB0ZnNfZGlyX2lub2RlLAorCQkJCQlzdHJ1Y3QgbmFtZWlkYXRhICplY3J5cHRmc19uZCk7CitpbnQgZWNyeXB0ZnNfZGVjb2RlX2FuZF9kZWNyeXB0X2ZpbGVuYW1lKGNoYXIgKipkZWNyeXB0ZWRfbmFtZSwKKwkJCQkJIHNpemVfdCAqZGVjcnlwdGVkX25hbWVfc2l6ZSwKKwkJCQkJIHN0cnVjdCBkZW50cnkgKmVjcnlwdGZzX2RlbnRyeSwKKwkJCQkJIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lX3NpemUpOwogaW50IGVjcnlwdGZzX2ZpbGxfemVyb3Moc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBuZXdfbGVuZ3RoKTsKLWludCBlY3J5cHRmc19kZWNvZGVfZmlsZW5hbWUoc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgKmNyeXB0X3N0YXQsCi0JCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW5ndGgsCi0JCQkgICAgIGNoYXIgKipkZWNyeXB0ZWRfbmFtZSk7Ci1pbnQgZWNyeXB0ZnNfZW5jb2RlX2ZpbGVuYW1lKHN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0LAotCQkJICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuZ3RoLAotCQkJICAgICBjaGFyICoqZW5jb2RlZF9uYW1lKTsKK2ludCBlY3J5cHRmc19lbmNyeXB0X2FuZF9lbmNvZGVfZmlsZW5hbWUoCisJY2hhciAqKmVuY29kZWRfbmFtZSwKKwlzaXplX3QgKmVuY29kZWRfbmFtZV9zaXplLAorCXN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0LAorCXN0cnVjdCBlY3J5cHRmc19tb3VudF9jcnlwdF9zdGF0ICptb3VudF9jcnlwdF9zdGF0LAorCWNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lX3NpemUpOwogc3RydWN0IGRlbnRyeSAqZWNyeXB0ZnNfbG93ZXJfZGVudHJ5KHN0cnVjdCBkZW50cnkgKnRoaXNfZGVudHJ5KTsKIHZvaWQgZWNyeXB0ZnNfZHVtcF9oZXgoY2hhciAqZGF0YSwgaW50IGJ5dGVzKTsKIGludCB2aXJ0X3RvX3NjYXR0ZXJsaXN0KGNvbnN0IHZvaWQgKmFkZHIsIGludCBzaXplLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLApAQCAtNTk5LDcgKzY1NCw3IEBACiAJCQkJCSAgICAgc3RydWN0IGlub2RlICplY3J5cHRmc19pbm9kZSk7CiBpbnQgZWNyeXB0ZnNfcmVhZF9hbmRfdmFsaWRhdGVfeGF0dHJfcmVnaW9uKGNoYXIgKnBhZ2VfdmlydCwKIAkJCQkJICAgIHN0cnVjdCBkZW50cnkgKmVjcnlwdGZzX2RlbnRyeSk7Ci11OCBlY3J5cHRmc19jb2RlX2Zvcl9jaXBoZXJfc3RyaW5nKHN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0KTsKK3U4IGVjcnlwdGZzX2NvZGVfZm9yX2NpcGhlcl9zdHJpbmcoY2hhciAqY2lwaGVyX25hbWUsIHNpemVfdCBrZXlfYnl0ZXMpOwogaW50IGVjcnlwdGZzX2NpcGhlcl9jb2RlX3RvX3N0cmluZyhjaGFyICpzdHIsIHU4IGNpcGhlcl9jb2RlKTsKIHZvaWQgZWNyeXB0ZnNfc2V0X2RlZmF1bHRfc2l6ZXMoc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgKmNyeXB0X3N0YXQpOwogaW50IGVjcnlwdGZzX2dlbmVyYXRlX2tleV9wYWNrZXRfc2V0KGNoYXIgKmRlc3RfYmFzZSwKQEAgLTY5NCw1ICs3NDksMTcgQEAKIAkJCSAgICAgc3RydWN0IHZmc21vdW50ICpsb3dlcl9tbnQsCiAJCQkgICAgIGNvbnN0IHN0cnVjdCBjcmVkICpjcmVkKTsKIGludCBlY3J5cHRmc19pbml0X3BlcnNpc3RlbnRfZmlsZShzdHJ1Y3QgZGVudHJ5ICplY3J5cHRmc19kZW50cnkpOworaW50CitlY3J5cHRmc193cml0ZV90YWdfNzBfcGFja2V0KGNoYXIgKmRlc3QsIHNpemVfdCAqcmVtYWluaW5nX2J5dGVzLAorCQkJICAgICBzaXplX3QgKnBhY2tldF9zaXplLAorCQkJICAgICBzdHJ1Y3QgZWNyeXB0ZnNfbW91bnRfY3J5cHRfc3RhdCAqbW91bnRfY3J5cHRfc3RhdCwKKwkJCSAgICAgY2hhciAqZmlsZW5hbWUsIHNpemVfdCBmaWxlbmFtZV9zaXplKTsKK2ludAorZWNyeXB0ZnNfcGFyc2VfdGFnXzcwX3BhY2tldChjaGFyICoqZmlsZW5hbWUsIHNpemVfdCAqZmlsZW5hbWVfc2l6ZSwKKwkJCSAgICAgc2l6ZV90ICpwYWNrZXRfc2l6ZSwKKwkJCSAgICAgc3RydWN0IGVjcnlwdGZzX21vdW50X2NyeXB0X3N0YXQgKm1vdW50X2NyeXB0X3N0YXQsCisJCQkgICAgIGNoYXIgKmRhdGEsIHNpemVfdCBtYXhfcGFja2V0X3NpemUpOworaW50IGVjcnlwdGZzX2Rlcml2ZV9pdihjaGFyICppdiwgc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgKmNyeXB0X3N0YXQsCisJCSAgICAgICBsb2ZmX3Qgb2Zmc2V0KTsKIAogI2VuZGlmIC8qICNpZm5kZWYgRUNSWVBURlNfS0VSTkVMX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2VjcnlwdGZzL2ZpbGUuYyBiL2ZzL2VjcnlwdGZzL2ZpbGUuYwppbmRleCBlYjNkYzRjLi45ZTk0NDA1IDEwMDY0NAotLS0gYS9mcy9lY3J5cHRmcy9maWxlLmMKKysrIGIvZnMvZWNyeXB0ZnMvZmlsZS5jCkBAIC03NywyNyArNzcsMjcgQEAKIAogLyogSW5zcGlyZWQgYnkgZ2VuZXJpYyBmaWxsZGlyIGluIGZzL3JlYWRkaXIuYyAqLwogc3RhdGljIGludAotZWNyeXB0ZnNfZmlsbGRpcih2b2lkICpkaXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLCBsb2ZmX3Qgb2Zmc2V0LAotCQkgdTY0IGlubywgdW5zaWduZWQgaW50IGRfdHlwZSkKK2VjcnlwdGZzX2ZpbGxkaXIodm9pZCAqZGlyZW50LCBjb25zdCBjaGFyICpsb3dlcl9uYW1lLCBpbnQgbG93ZXJfbmFtZWxlbiwKKwkJIGxvZmZfdCBvZmZzZXQsIHU2NCBpbm8sIHVuc2lnbmVkIGludCBkX3R5cGUpCiB7Ci0Jc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgKmNyeXB0X3N0YXQ7CiAJc3RydWN0IGVjcnlwdGZzX2dldGRlbnRzX2NhbGxiYWNrICpidWYgPQogCSAgICAoc3RydWN0IGVjcnlwdGZzX2dldGRlbnRzX2NhbGxiYWNrICopZGlyZW50OworCXNpemVfdCBuYW1lX3NpemU7CisJY2hhciAqbmFtZTsKIAlpbnQgcmM7Ci0JaW50IGRlY29kZWRfbGVuZ3RoOwotCWNoYXIgKmRlY29kZWRfbmFtZTsKIAotCWNyeXB0X3N0YXQgPSBlY3J5cHRmc19kZW50cnlfdG9fcHJpdmF0ZShidWYtPmRlbnRyeSktPmNyeXB0X3N0YXQ7CiAJYnVmLT5maWxsZGlyX2NhbGxlZCsrOwotCWRlY29kZWRfbGVuZ3RoID0gZWNyeXB0ZnNfZGVjb2RlX2ZpbGVuYW1lKGNyeXB0X3N0YXQsIG5hbWUsIG5hbWVsZW4sCi0JCQkJCQkgICZkZWNvZGVkX25hbWUpOwotCWlmIChkZWNvZGVkX2xlbmd0aCA8IDApIHsKLQkJcmMgPSBkZWNvZGVkX2xlbmd0aDsKKwlyYyA9IGVjcnlwdGZzX2RlY29kZV9hbmRfZGVjcnlwdF9maWxlbmFtZSgmbmFtZSwgJm5hbWVfc2l6ZSwKKwkJCQkJCSAgYnVmLT5kZW50cnksIGxvd2VyX25hbWUsCisJCQkJCQkgIGxvd2VyX25hbWVsZW4pOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciBhdHRlbXB0aW5nIHRvIGRlY29kZSBhbmQgZGVjcnlwdCAiCisJCSAgICAgICAiZmlsZW5hbWUgWyVzXTsgcmMgPSBbJWRdXG4iLCBfX2Z1bmNfXywgbG93ZXJfbmFtZSwKKwkJICAgICAgIHJjKTsKIAkJZ290byBvdXQ7CiAJfQotCXJjID0gYnVmLT5maWxsZGlyKGJ1Zi0+ZGlyZW50LCBkZWNvZGVkX25hbWUsIGRlY29kZWRfbGVuZ3RoLCBvZmZzZXQsCi0JCQkgIGlubywgZF90eXBlKTsKLQlrZnJlZShkZWNvZGVkX25hbWUpOworCXJjID0gYnVmLT5maWxsZGlyKGJ1Zi0+ZGlyZW50LCBuYW1lLCBuYW1lX3NpemUsIG9mZnNldCwgaW5vLCBkX3R5cGUpOworCWtmcmVlKG5hbWUpOwogCWlmIChyYyA+PSAwKQogCQlidWYtPmVudHJpZXNfd3JpdHRlbisrOwogb3V0OgpAQCAtMTA2LDggKzEwNiw4IEBACiAKIC8qKgogICogZWNyeXB0ZnNfcmVhZGRpcgotICogQGZpbGU6IFRoZSBlY3J5cHRmcyBmaWxlIHN0cnVjdAotICogQGRpcmVudDogRGlyZWN0b3J5IGVudHJ5CisgKiBAZmlsZTogVGhlIGVDcnlwdGZzIGRpcmVjdG9yeSBmaWxlCisgKiBAZGlyZW50OiBEaXJlY3RvcnkgZW50cnkgaGFuZGxlCiAgKiBAZmlsbGRpcjogVGhlIGZpbGxkaXIgY2FsbGJhY2sgZnVuY3Rpb24KICAqLwogc3RhdGljIGludCBlY3J5cHRmc19yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQpAQCAtMjc1LDE4ICsyNzUsOSBAQAogc3RhdGljIGludAogZWNyeXB0ZnNfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGRhdGFzeW5jKQogewotCXN0cnVjdCBmaWxlICpsb3dlcl9maWxlID0gZWNyeXB0ZnNfZmlsZV90b19sb3dlcihmaWxlKTsKLQlzdHJ1Y3QgZGVudHJ5ICpsb3dlcl9kZW50cnkgPSBlY3J5cHRmc19kZW50cnlfdG9fbG93ZXIoZGVudHJ5KTsKLQlzdHJ1Y3QgaW5vZGUgKmxvd2VyX2lub2RlID0gbG93ZXJfZGVudHJ5LT5kX2lub2RlOwotCWludCByYyA9IC1FSU5WQUw7Ci0KLQlpZiAobG93ZXJfaW5vZGUtPmlfZm9wLT5mc3luYykgewotCQltdXRleF9sb2NrKCZsb3dlcl9pbm9kZS0+aV9tdXRleCk7Ci0JCXJjID0gbG93ZXJfaW5vZGUtPmlfZm9wLT5mc3luYyhsb3dlcl9maWxlLCBsb3dlcl9kZW50cnksCi0JCQkJCSAgICAgICBkYXRhc3luYyk7Ci0JCW11dGV4X3VubG9jaygmbG93ZXJfaW5vZGUtPmlfbXV0ZXgpOwotCX0KLQlyZXR1cm4gcmM7CisJcmV0dXJuIHZmc19mc3luYyhlY3J5cHRmc19maWxlX3RvX2xvd2VyKGZpbGUpLAorCQkJIGVjcnlwdGZzX2RlbnRyeV90b19sb3dlcihkZW50cnkpLAorCQkJIGRhdGFzeW5jKTsKIH0KIAogc3RhdGljIGludCBlY3J5cHRmc19mYXN5bmMoaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGZsYWcpCmRpZmYgLS1naXQgYS9mcy9lY3J5cHRmcy9pbm9kZS5jIGIvZnMvZWNyeXB0ZnMvaW5vZGUuYwppbmRleCA1ZTc4ZmMxLi41Njk3ODk5IDEwMDY0NAotLS0gYS9mcy9lY3J5cHRmcy9pbm9kZS5jCisrKyBiL2ZzL2VjcnlwdGZzL2lub2RlLmMKQEAgLTUyLDggKzUyLDcgQEAKIC8qKgogICogZWNyeXB0ZnNfY3JlYXRlX3VuZGVybHlpbmdfZmlsZQogICogQGxvd2VyX2Rpcl9pbm9kZTogaW5vZGUgb2YgdGhlIHBhcmVudCBpbiB0aGUgbG93ZXIgZnMgb2YgdGhlIG5ldyBmaWxlCi0gKiBAbG93ZXJfZGVudHJ5OiBOZXcgZmlsZSdzIGRlbnRyeSBpbiB0aGUgbG93ZXIgZnMKLSAqIEBlY3J5cHRmc19kZW50cnk6IE5ldyBmaWxlJ3MgZGVudHJ5IGluIGVjcnlwdGZzCisgKiBAZGVudHJ5OiBOZXcgZmlsZSdzIGRlbnRyeQogICogQG1vZGU6IFRoZSBtb2RlIG9mIHRoZSBuZXcgZmlsZQogICogQG5kOiBuYW1laWRhdGEgb2YgZWNyeXB0ZnMnIHBhcmVudCdzIGRlbnRyeSAmIHZmc21vdW50CiAgKgpAQCAtMjI4LDggKzIyNyw3IEBACiB7CiAJaW50IHJjOwogCi0JLyogZWNyeXB0ZnNfZG9fY3JlYXRlKCkgY2FsbHMgZWNyeXB0ZnNfaW50ZXJwb3NlKCksIHdoaWNoIG9wZW5zCi0JICogdGhlIGNyeXB0X3N0YXQtPmxvd2VyX2ZpbGUgKHBlcnNpc3RlbnQgZmlsZSkgKi8KKwkvKiBlY3J5cHRmc19kb19jcmVhdGUoKSBjYWxscyBlY3J5cHRmc19pbnRlcnBvc2UoKSAqLwogCXJjID0gZWNyeXB0ZnNfZG9fY3JlYXRlKGRpcmVjdG9yeV9pbm9kZSwgZWNyeXB0ZnNfZGVudHJ5LCBtb2RlLCBuZCk7CiAJaWYgKHVubGlrZWx5KHJjKSkgewogCQllY3J5cHRmc19wcmludGsoS0VSTl9XQVJOSU5HLCAiRmFpbGVkIHRvIGNyZWF0ZSBmaWxlIGluIgpAQCAtMjQ0LDE0MSArMjQyLDkxIEBACiB9CiAKIC8qKgotICogZWNyeXB0ZnNfbG9va3VwCi0gKiBAZGlyOiBpbm9kZQotICogQGRlbnRyeTogVGhlIGRlbnRyeQotICogQG5kOiBuYW1laWRhdGEsIG1heSBiZSBOVUxMCi0gKgotICogRmluZCBhIGZpbGUgb24gZGlzay4gSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsIHRoZW4gd2UnbGwgYWRkIGl0IHRvIHRoZQotICogZGVudHJ5IGNhY2hlIGFuZCBjb250aW51ZSBvbiB0byByZWFkIGl0IGZyb20gdGhlIGRpc2suCisgKiBlY3J5cHRmc19sb29rdXBfYW5kX2ludGVycG9zZV9sb3dlciAtIFBlcmZvcm0gYSBsb29rdXAKICAqLwotc3RhdGljIHN0cnVjdCBkZW50cnkgKmVjcnlwdGZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAotCQkJCSAgICAgIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoraW50IGVjcnlwdGZzX2xvb2t1cF9hbmRfaW50ZXJwb3NlX2xvd2VyKHN0cnVjdCBkZW50cnkgKmVjcnlwdGZzX2RlbnRyeSwKKwkJCQkJc3RydWN0IGRlbnRyeSAqbG93ZXJfZGVudHJ5LAorCQkJCQlzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCAqY3J5cHRfc3RhdCwKKwkJCQkJc3RydWN0IGlub2RlICplY3J5cHRmc19kaXJfaW5vZGUsCisJCQkJCXN0cnVjdCBuYW1laWRhdGEgKmVjcnlwdGZzX25kKQogewotCWludCByYyA9IDA7CiAJc3RydWN0IGRlbnRyeSAqbG93ZXJfZGlyX2RlbnRyeTsKLQlzdHJ1Y3QgZGVudHJ5ICpsb3dlcl9kZW50cnk7CiAJc3RydWN0IHZmc21vdW50ICpsb3dlcl9tbnQ7Ci0JY2hhciAqZW5jb2RlZF9uYW1lOwotCWludCBlbmNvZGVkX25hbWVsZW47Ci0Jc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgKmNyeXB0X3N0YXQgPSBOVUxMOworCXN0cnVjdCBpbm9kZSAqbG93ZXJfaW5vZGU7CiAJc3RydWN0IGVjcnlwdGZzX21vdW50X2NyeXB0X3N0YXQgKm1vdW50X2NyeXB0X3N0YXQ7CiAJY2hhciAqcGFnZV92aXJ0ID0gTlVMTDsKLQlzdHJ1Y3QgaW5vZGUgKmxvd2VyX2lub2RlOwogCXU2NCBmaWxlX3NpemU7CisJaW50IHJjID0gMDsKIAotCWxvd2VyX2Rpcl9kZW50cnkgPSBlY3J5cHRmc19kZW50cnlfdG9fbG93ZXIoZGVudHJ5LT5kX3BhcmVudCk7Ci0JZGVudHJ5LT5kX29wID0gJmVjcnlwdGZzX2RvcHM7Ci0JaWYgKChkZW50cnktPmRfbmFtZS5sZW4gPT0gMSAmJiAhc3RyY21wKGRlbnRyeS0+ZF9uYW1lLm5hbWUsICIuIikpCi0JICAgIHx8IChkZW50cnktPmRfbmFtZS5sZW4gPT0gMgotCQkmJiAhc3RyY21wKGRlbnRyeS0+ZF9uYW1lLm5hbWUsICIuLiIpKSkgewotCQlkX2Ryb3AoZGVudHJ5KTsKLQkJZ290byBvdXQ7Ci0JfQotCWVuY29kZWRfbmFtZWxlbiA9IGVjcnlwdGZzX2VuY29kZV9maWxlbmFtZShjcnlwdF9zdGF0LAotCQkJCQkJICAgZGVudHJ5LT5kX25hbWUubmFtZSwKLQkJCQkJCSAgIGRlbnRyeS0+ZF9uYW1lLmxlbiwKLQkJCQkJCSAgICZlbmNvZGVkX25hbWUpOwotCWlmIChlbmNvZGVkX25hbWVsZW4gPCAwKSB7Ci0JCXJjID0gZW5jb2RlZF9uYW1lbGVuOwotCQlkX2Ryb3AoZGVudHJ5KTsKLQkJZ290byBvdXQ7Ci0JfQotCWVjcnlwdGZzX3ByaW50ayhLRVJOX0RFQlVHLCAiZW5jb2RlZF9uYW1lID0gWyVzXTsgZW5jb2RlZF9uYW1lbGVuICIKLQkJCSI9IFslZF1cbiIsIGVuY29kZWRfbmFtZSwgZW5jb2RlZF9uYW1lbGVuKTsKLQlsb3dlcl9kZW50cnkgPSBsb29rdXBfb25lX2xlbihlbmNvZGVkX25hbWUsIGxvd2VyX2Rpcl9kZW50cnksCi0JCQkJICAgICAgZW5jb2RlZF9uYW1lbGVuIC0gMSk7Ci0Ja2ZyZWUoZW5jb2RlZF9uYW1lKTsKLQlpZiAoSVNfRVJSKGxvd2VyX2RlbnRyeSkpIHsKLQkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fRVJSLCAiRVJSIGZyb20gbG93ZXJfZGVudHJ5XG4iKTsKLQkJcmMgPSBQVFJfRVJSKGxvd2VyX2RlbnRyeSk7Ci0JCWRfZHJvcChkZW50cnkpOwotCQlnb3RvIG91dDsKLQl9Ci0JbG93ZXJfbW50ID0gbW50Z2V0KGVjcnlwdGZzX2RlbnRyeV90b19sb3dlcl9tbnQoZGVudHJ5LT5kX3BhcmVudCkpOwotCWVjcnlwdGZzX3ByaW50ayhLRVJOX0RFQlVHLCAibG93ZXJfZGVudHJ5ID0gWyVwXTsgbG93ZXJfZGVudHJ5LT4iCi0gICAgICAgCQkiZF9uYW1lLm5hbWUgPSBbJXNdXG4iLCBsb3dlcl9kZW50cnksCi0JCWxvd2VyX2RlbnRyeS0+ZF9uYW1lLm5hbWUpOworCWxvd2VyX2Rpcl9kZW50cnkgPSBsb3dlcl9kZW50cnktPmRfcGFyZW50OworCWxvd2VyX21udCA9IG1udGdldChlY3J5cHRmc19kZW50cnlfdG9fbG93ZXJfbW50KAorCQkJCSAgIGVjcnlwdGZzX2RlbnRyeS0+ZF9wYXJlbnQpKTsKIAlsb3dlcl9pbm9kZSA9IGxvd2VyX2RlbnRyeS0+ZF9pbm9kZTsKLQlmc3N0YWNrX2NvcHlfYXR0cl9hdGltZShkaXIsIGxvd2VyX2Rpcl9kZW50cnktPmRfaW5vZGUpOworCWZzc3RhY2tfY29weV9hdHRyX2F0aW1lKGVjcnlwdGZzX2Rpcl9pbm9kZSwgbG93ZXJfZGlyX2RlbnRyeS0+ZF9pbm9kZSk7CiAJQlVHX09OKCFhdG9taWNfcmVhZCgmbG93ZXJfZGVudHJ5LT5kX2NvdW50KSk7Ci0JZWNyeXB0ZnNfc2V0X2RlbnRyeV9wcml2YXRlKGRlbnRyeSwKKwllY3J5cHRmc19zZXRfZGVudHJ5X3ByaXZhdGUoZWNyeXB0ZnNfZGVudHJ5LAogCQkJCSAgICBrbWVtX2NhY2hlX2FsbG9jKGVjcnlwdGZzX2RlbnRyeV9pbmZvX2NhY2hlLAogCQkJCQkJICAgICBHRlBfS0VSTkVMKSk7Ci0JaWYgKCFlY3J5cHRmc19kZW50cnlfdG9fcHJpdmF0ZShkZW50cnkpKSB7CisJaWYgKCFlY3J5cHRmc19kZW50cnlfdG9fcHJpdmF0ZShlY3J5cHRmc19kZW50cnkpKSB7CiAJCXJjID0gLUVOT01FTTsKLQkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fRVJSLCAiT3V0IG9mIG1lbW9yeSB3aGlsc3QgYXR0ZW1wdGluZyAiCi0JCQkJInRvIGFsbG9jYXRlIGVjcnlwdGZzX2RlbnRyeV9pbmZvIHN0cnVjdFxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IE91dCBvZiBtZW1vcnkgd2hpbHN0IGF0dGVtcHRpbmcgIgorCQkgICAgICAgInRvIGFsbG9jYXRlIGVjcnlwdGZzX2RlbnRyeV9pbmZvIHN0cnVjdFxuIiwKKwkJCV9fZnVuY19fKTsKIAkJZ290byBvdXRfZHB1dDsKIAl9Ci0JZWNyeXB0ZnNfc2V0X2RlbnRyeV9sb3dlcihkZW50cnksIGxvd2VyX2RlbnRyeSk7Ci0JZWNyeXB0ZnNfc2V0X2RlbnRyeV9sb3dlcl9tbnQoZGVudHJ5LCBsb3dlcl9tbnQpOworCWVjcnlwdGZzX3NldF9kZW50cnlfbG93ZXIoZWNyeXB0ZnNfZGVudHJ5LCBsb3dlcl9kZW50cnkpOworCWVjcnlwdGZzX3NldF9kZW50cnlfbG93ZXJfbW50KGVjcnlwdGZzX2RlbnRyeSwgbG93ZXJfbW50KTsKIAlpZiAoIWxvd2VyX2RlbnRyeS0+ZF9pbm9kZSkgewogCQkvKiBXZSB3YW50IHRvIGFkZCBiZWNhdXNlIHdlIGNvdWxkbid0IGZpbmQgaW4gbG93ZXIgKi8KLQkJZF9hZGQoZGVudHJ5LCBOVUxMKTsKKwkJZF9hZGQoZWNyeXB0ZnNfZGVudHJ5LCBOVUxMKTsKIAkJZ290byBvdXQ7CiAJfQotCXJjID0gZWNyeXB0ZnNfaW50ZXJwb3NlKGxvd2VyX2RlbnRyeSwgZGVudHJ5LCBkaXItPmlfc2IsCi0JCQkJRUNSWVBURlNfSU5URVJQT1NFX0ZMQUdfRF9BREQpOworCXJjID0gZWNyeXB0ZnNfaW50ZXJwb3NlKGxvd2VyX2RlbnRyeSwgZWNyeXB0ZnNfZGVudHJ5LAorCQkJCWVjcnlwdGZzX2Rpcl9pbm9kZS0+aV9zYiwgMSk7CiAJaWYgKHJjKSB7Ci0JCWVjcnlwdGZzX3ByaW50ayhLRVJOX0VSUiwgIkVycm9yIGludGVycG9zaW5nXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgaW50ZXJwb3Npbmc7IHJjID0gWyVkXVxuIiwKKwkJICAgICAgIF9fZnVuY19fLCByYyk7CiAJCWdvdG8gb3V0OwogCX0KLQlpZiAoU19JU0RJUihsb3dlcl9pbm9kZS0+aV9tb2RlKSkgewotCQllY3J5cHRmc19wcmludGsoS0VSTl9ERUJVRywgIklzIGEgZGlyZWN0b3J5OyByZXR1cm5pbmdcbiIpOworCWlmIChTX0lTRElSKGxvd2VyX2lub2RlLT5pX21vZGUpKQogCQlnb3RvIG91dDsKLQl9Ci0JaWYgKFNfSVNMTksobG93ZXJfaW5vZGUtPmlfbW9kZSkpIHsKLQkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fREVCVUcsICJJcyBhIHN5bWxpbms7IHJldHVybmluZ1xuIik7CisJaWYgKFNfSVNMTksobG93ZXJfaW5vZGUtPmlfbW9kZSkpCiAJCWdvdG8gb3V0OwotCX0KLQlpZiAoc3BlY2lhbF9maWxlKGxvd2VyX2lub2RlLT5pX21vZGUpKSB7Ci0JCWVjcnlwdGZzX3ByaW50ayhLRVJOX0RFQlVHLCAiSXMgYSBzcGVjaWFsIGZpbGU7IHJldHVybmluZ1xuIik7CisJaWYgKHNwZWNpYWxfZmlsZShsb3dlcl9pbm9kZS0+aV9tb2RlKSkKIAkJZ290byBvdXQ7Ci0JfQotCWlmICghbmQpIHsKLQkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fREVCVUcsICJXZSBoYXZlIGEgTlVMTCBuZCwganVzdCBsZWF2ZSIKLQkJCQkiYXMgd2UgKnRoaW5rKiB3ZSBhcmUgYWJvdXQgdG8gdW5saW5rXG4iKTsKKwlpZiAoIWVjcnlwdGZzX25kKQogCQlnb3RvIG91dDsKLQl9CiAJLyogUmVsZWFzZWQgaW4gdGhpcyBmdW5jdGlvbiAqLwotCXBhZ2VfdmlydCA9IGttZW1fY2FjaGVfemFsbG9jKGVjcnlwdGZzX2hlYWRlcl9jYWNoZV8yLAotCQkJCSAgICAgIEdGUF9VU0VSKTsKKwlwYWdlX3ZpcnQgPSBrbWVtX2NhY2hlX3phbGxvYyhlY3J5cHRmc19oZWFkZXJfY2FjaGVfMiwgR0ZQX1VTRVIpOwogCWlmICghcGFnZV92aXJ0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbm5vdCBrbWVtX2NhY2hlX3phbGxvYygpIGEgcGFnZVxuIiwKKwkJICAgICAgIF9fZnVuY19fKTsKIAkJcmMgPSAtRU5PTUVNOwotCQllY3J5cHRmc19wcmludGsoS0VSTl9FUlIsCi0JCQkJIkNhbm5vdCBlY3J5cHRmc19rbWFsbG9jIGEgcGFnZVxuIik7CiAJCWdvdG8gb3V0OwogCX0KLQljcnlwdF9zdGF0ID0gJmVjcnlwdGZzX2lub2RlX3RvX3ByaXZhdGUoZGVudHJ5LT5kX2lub2RlKS0+Y3J5cHRfc3RhdDsKLQlpZiAoIShjcnlwdF9zdGF0LT5mbGFncyAmIEVDUllQVEZTX1BPTElDWV9BUFBMSUVEKSkKLQkJZWNyeXB0ZnNfc2V0X2RlZmF1bHRfc2l6ZXMoY3J5cHRfc3RhdCk7Ci0JaWYgKCFlY3J5cHRmc19pbm9kZV90b19wcml2YXRlKGRlbnRyeS0+ZF9pbm9kZSktPmxvd2VyX2ZpbGUpIHsKLQkJcmMgPSBlY3J5cHRmc19pbml0X3BlcnNpc3RlbnRfZmlsZShkZW50cnkpOworCWlmICghZWNyeXB0ZnNfaW5vZGVfdG9fcHJpdmF0ZShlY3J5cHRmc19kZW50cnktPmRfaW5vZGUpLT5sb3dlcl9maWxlKSB7CisJCXJjID0gZWNyeXB0ZnNfaW5pdF9wZXJzaXN0ZW50X2ZpbGUoZWNyeXB0ZnNfZGVudHJ5KTsKIAkJaWYgKHJjKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciBhdHRlbXB0aW5nIHRvIGluaXRpYWxpemUgIgogCQkJICAgICAgICJ0aGUgcGVyc2lzdGVudCBmaWxlIGZvciB0aGUgZGVudHJ5IHdpdGggbmFtZSAiCiAJCQkgICAgICAgIlslc107IHJjID0gWyVkXVxuIiwgX19mdW5jX18sCi0JCQkgICAgICAgZGVudHJ5LT5kX25hbWUubmFtZSwgcmMpOwotCQkJZ290byBvdXQ7CisJCQkgICAgICAgZWNyeXB0ZnNfZGVudHJ5LT5kX25hbWUubmFtZSwgcmMpOworCQkJZ290byBvdXRfZnJlZV9rbWVtOwogCQl9CiAJfQogCXJjID0gZWNyeXB0ZnNfcmVhZF9hbmRfdmFsaWRhdGVfaGVhZGVyX3JlZ2lvbihwYWdlX3ZpcnQsCi0JCQkJCQkgICAgICBkZW50cnktPmRfaW5vZGUpOworCQkJCQkJICAgICAgZWNyeXB0ZnNfZGVudHJ5LT5kX2lub2RlKTsKIAlpZiAocmMpIHsKLQkJcmMgPSBlY3J5cHRmc19yZWFkX2FuZF92YWxpZGF0ZV94YXR0cl9yZWdpb24ocGFnZV92aXJ0LCBkZW50cnkpOworCQlyYyA9IGVjcnlwdGZzX3JlYWRfYW5kX3ZhbGlkYXRlX3hhdHRyX3JlZ2lvbihwYWdlX3ZpcnQsCisJCQkJCQkJICAgICBlY3J5cHRmc19kZW50cnkpOwogCQlpZiAocmMpIHsKLQkJCXByaW50ayhLRVJOX0RFQlVHICJWYWxpZCBtZXRhZGF0YSBub3QgZm91bmQgaW4gaGVhZGVyICIKLQkJCSAgICAgICAicmVnaW9uIG9yIHhhdHRyIHJlZ2lvbjsgdHJlYXRpbmcgZmlsZSBhcyAiCi0JCQkgICAgICAgInVuZW5jcnlwdGVkXG4iKTsKIAkJCXJjID0gMDsKLQkJCWttZW1fY2FjaGVfZnJlZShlY3J5cHRmc19oZWFkZXJfY2FjaGVfMiwgcGFnZV92aXJ0KTsKLQkJCWdvdG8gb3V0OworCQkJZ290byBvdXRfZnJlZV9rbWVtOwogCQl9CiAJCWNyeXB0X3N0YXQtPmZsYWdzIHw9IEVDUllQVEZTX01FVEFEQVRBX0lOX1hBVFRSOwogCX0KIAltb3VudF9jcnlwdF9zdGF0ID0gJmVjcnlwdGZzX3N1cGVyYmxvY2tfdG9fcHJpdmF0ZSgKLQkJZGVudHJ5LT5kX3NiKS0+bW91bnRfY3J5cHRfc3RhdDsKKwkJZWNyeXB0ZnNfZGVudHJ5LT5kX3NiKS0+bW91bnRfY3J5cHRfc3RhdDsKIAlpZiAobW91bnRfY3J5cHRfc3RhdC0+ZmxhZ3MgJiBFQ1JZUFRGU19FTkNSWVBURURfVklFV19FTkFCTEVEKSB7CiAJCWlmIChjcnlwdF9zdGF0LT5mbGFncyAmIEVDUllQVEZTX01FVEFEQVRBX0lOX1hBVFRSKQogCQkJZmlsZV9zaXplID0gKGNyeXB0X3N0YXQtPm51bV9oZWFkZXJfYnl0ZXNfYXRfZnJvbnQKQEAgLTM4OCwxNCArMzM2LDEwMyBAQAogCX0gZWxzZSB7CiAJCWZpbGVfc2l6ZSA9IGdldF91bmFsaWduZWRfYmU2NChwYWdlX3ZpcnQpOwogCX0KLQlpX3NpemVfd3JpdGUoZGVudHJ5LT5kX2lub2RlLCAobG9mZl90KWZpbGVfc2l6ZSk7CisJaV9zaXplX3dyaXRlKGVjcnlwdGZzX2RlbnRyeS0+ZF9pbm9kZSwgKGxvZmZfdClmaWxlX3NpemUpOworb3V0X2ZyZWVfa21lbToKIAlrbWVtX2NhY2hlX2ZyZWUoZWNyeXB0ZnNfaGVhZGVyX2NhY2hlXzIsIHBhZ2VfdmlydCk7CiAJZ290byBvdXQ7Ci0KIG91dF9kcHV0OgogCWRwdXQobG93ZXJfZGVudHJ5KTsKLQlkX2Ryb3AoZGVudHJ5KTsKKwlkX2Ryb3AoZWNyeXB0ZnNfZGVudHJ5KTsKIG91dDoKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogZWNyeXB0ZnNfbG9va3VwCisgKiBAZWNyeXB0ZnNfZGlyX2lub2RlOiBUaGUgZUNyeXB0ZnMgZGlyZWN0b3J5IGlub2RlCisgKiBAZWNyeXB0ZnNfZGVudHJ5OiBUaGUgZUNyeXB0ZnMgZGVudHJ5IHRoYXQgd2UgYXJlIGxvb2tpbmcgdXAKKyAqIEBlY3J5cHRmc19uZDogbmFtZWlkYXRhOyBtYXkgYmUgTlVMTAorICoKKyAqIEZpbmQgYSBmaWxlIG9uIGRpc2suIElmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCB0aGVuIHdlJ2xsIGFkZCBpdCB0byB0aGUKKyAqIGRlbnRyeSBjYWNoZSBhbmQgY29udGludWUgb24gdG8gcmVhZCBpdCBmcm9tIHRoZSBkaXNrLgorICovCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqZWNyeXB0ZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqZWNyeXB0ZnNfZGlyX2lub2RlLAorCQkJCSAgICAgIHN0cnVjdCBkZW50cnkgKmVjcnlwdGZzX2RlbnRyeSwKKwkJCQkgICAgICBzdHJ1Y3QgbmFtZWlkYXRhICplY3J5cHRmc19uZCkKK3sKKwljaGFyICplbmNyeXB0ZWRfYW5kX2VuY29kZWRfbmFtZSA9IE5VTEw7CisJc2l6ZV90IGVuY3J5cHRlZF9hbmRfZW5jb2RlZF9uYW1lX3NpemU7CisJc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgKmNyeXB0X3N0YXQgPSBOVUxMOworCXN0cnVjdCBlY3J5cHRmc19tb3VudF9jcnlwdF9zdGF0ICptb3VudF9jcnlwdF9zdGF0ID0gTlVMTDsKKwlzdHJ1Y3QgZWNyeXB0ZnNfaW5vZGVfaW5mbyAqaW5vZGVfaW5mbzsKKwlzdHJ1Y3QgZGVudHJ5ICpsb3dlcl9kaXJfZGVudHJ5LCAqbG93ZXJfZGVudHJ5OworCWludCByYyA9IDA7CisKKwllY3J5cHRmc19kZW50cnktPmRfb3AgPSAmZWNyeXB0ZnNfZG9wczsKKwlpZiAoKGVjcnlwdGZzX2RlbnRyeS0+ZF9uYW1lLmxlbiA9PSAxCisJICAgICAmJiAhc3RyY21wKGVjcnlwdGZzX2RlbnRyeS0+ZF9uYW1lLm5hbWUsICIuIikpCisJICAgIHx8IChlY3J5cHRmc19kZW50cnktPmRfbmFtZS5sZW4gPT0gMgorCQkmJiAhc3RyY21wKGVjcnlwdGZzX2RlbnRyeS0+ZF9uYW1lLm5hbWUsICIuLiIpKSkgeworCQlnb3RvIG91dF9kX2Ryb3A7CisJfQorCWxvd2VyX2Rpcl9kZW50cnkgPSBlY3J5cHRmc19kZW50cnlfdG9fbG93ZXIoZWNyeXB0ZnNfZGVudHJ5LT5kX3BhcmVudCk7CisJbG93ZXJfZGVudHJ5ID0gbG9va3VwX29uZV9sZW4oZWNyeXB0ZnNfZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCQkgICAgICBsb3dlcl9kaXJfZGVudHJ5LAorCQkJCSAgICAgIGVjcnlwdGZzX2RlbnRyeS0+ZF9uYW1lLmxlbik7CisJaWYgKElTX0VSUihsb3dlcl9kZW50cnkpKSB7CisJCXJjID0gUFRSX0VSUihsb3dlcl9kZW50cnkpOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBsb29rdXBfb25lX2xlbigpIHJldHVybmVkIFslZF0gb24gIgorCQkgICAgICAgImxvd2VyX2RlbnRyeSA9IFslc11cbiIsIF9fZnVuY19fLCByYywKKwkJICAgICAgIGVjcnlwdGZzX2RlbnRyeS0+ZF9uYW1lLm5hbWUpOworCQlnb3RvIG91dF9kX2Ryb3A7CisJfQorCWlmIChsb3dlcl9kZW50cnktPmRfaW5vZGUpCisJCWdvdG8gbG9va3VwX2FuZF9pbnRlcnBvc2U7CisJaW5vZGVfaW5mbyA9ICBlY3J5cHRmc19pbm9kZV90b19wcml2YXRlKGVjcnlwdGZzX2RlbnRyeS0+ZF9pbm9kZSk7CisJaWYgKGlub2RlX2luZm8pIHsKKwkJY3J5cHRfc3RhdCA9ICZpbm9kZV9pbmZvLT5jcnlwdF9zdGF0OworCQkvKiBUT0RPOiBsb2NrIGZvciBjcnlwdF9zdGF0IGNvbXBhcmlzb24gKi8KKwkJaWYgKCEoY3J5cHRfc3RhdC0+ZmxhZ3MgJiBFQ1JZUFRGU19QT0xJQ1lfQVBQTElFRCkpCisJCQllY3J5cHRmc19zZXRfZGVmYXVsdF9zaXplcyhjcnlwdF9zdGF0KTsKKwl9CisJaWYgKGNyeXB0X3N0YXQpCisJCW1vdW50X2NyeXB0X3N0YXQgPSBjcnlwdF9zdGF0LT5tb3VudF9jcnlwdF9zdGF0OworCWVsc2UKKwkJbW91bnRfY3J5cHRfc3RhdCA9ICZlY3J5cHRmc19zdXBlcmJsb2NrX3RvX3ByaXZhdGUoCisJCQllY3J5cHRmc19kZW50cnktPmRfc2IpLT5tb3VudF9jcnlwdF9zdGF0OworCWlmICghKGNyeXB0X3N0YXQgJiYgKGNyeXB0X3N0YXQtPmZsYWdzICYgRUNSWVBURlNfRU5DUllQVF9GSUxFTkFNRVMpKQorCSAgICAmJiAhKG1vdW50X2NyeXB0X3N0YXQgJiYgKG1vdW50X2NyeXB0X3N0YXQtPmZsYWdzCisJCQkJICAgICAmIEVDUllQVEZTX0dMT0JBTF9FTkNSWVBUX0ZJTEVOQU1FUykpKQorCQlnb3RvIGxvb2t1cF9hbmRfaW50ZXJwb3NlOworCWRwdXQobG93ZXJfZGVudHJ5KTsKKwlyYyA9IGVjcnlwdGZzX2VuY3J5cHRfYW5kX2VuY29kZV9maWxlbmFtZSgKKwkJJmVuY3J5cHRlZF9hbmRfZW5jb2RlZF9uYW1lLCAmZW5jcnlwdGVkX2FuZF9lbmNvZGVkX25hbWVfc2l6ZSwKKwkJY3J5cHRfc3RhdCwgbW91bnRfY3J5cHRfc3RhdCwgZWNyeXB0ZnNfZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJZWNyeXB0ZnNfZGVudHJ5LT5kX25hbWUubGVuKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgYXR0ZW1wdGluZyB0byBlbmNyeXB0IGFuZCBlbmNvZGUgIgorCQkgICAgICAgImZpbGVuYW1lOyByYyA9IFslZF1cbiIsIF9fZnVuY19fLCByYyk7CisJCWdvdG8gb3V0X2RfZHJvcDsKKwl9CisJbG93ZXJfZGVudHJ5ID0gbG9va3VwX29uZV9sZW4oZW5jcnlwdGVkX2FuZF9lbmNvZGVkX25hbWUsCisJCQkJICAgICAgbG93ZXJfZGlyX2RlbnRyeSwKKwkJCQkgICAgICBlbmNyeXB0ZWRfYW5kX2VuY29kZWRfbmFtZV9zaXplIC0gMSk7CisJaWYgKElTX0VSUihsb3dlcl9kZW50cnkpKSB7CisJCXJjID0gUFRSX0VSUihsb3dlcl9kZW50cnkpOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBsb29rdXBfb25lX2xlbigpIHJldHVybmVkIFslZF0gb24gIgorCQkgICAgICAgImxvd2VyX2RlbnRyeSA9IFslc11cbiIsIF9fZnVuY19fLCByYywKKwkJICAgICAgIGVuY3J5cHRlZF9hbmRfZW5jb2RlZF9uYW1lKTsKKwkJZ290byBvdXRfZF9kcm9wOworCX0KK2xvb2t1cF9hbmRfaW50ZXJwb3NlOgorCXJjID0gZWNyeXB0ZnNfbG9va3VwX2FuZF9pbnRlcnBvc2VfbG93ZXIoZWNyeXB0ZnNfZGVudHJ5LCBsb3dlcl9kZW50cnksCisJCQkJCQkgY3J5cHRfc3RhdCwgZWNyeXB0ZnNfZGlyX2lub2RlLAorCQkJCQkJIGVjcnlwdGZzX25kKTsKKwlnb3RvIG91dDsKK291dF9kX2Ryb3A6CisJZF9kcm9wKGVjcnlwdGZzX2RlbnRyeSk7CitvdXQ6CisJa2ZyZWUoZW5jcnlwdGVkX2FuZF9lbmNvZGVkX25hbWUpOwogCXJldHVybiBFUlJfUFRSKHJjKTsKIH0KIApAQCAtNDY2LDE5ICs1MDMsMjEgQEAKIAlzdHJ1Y3QgZGVudHJ5ICpsb3dlcl9kZW50cnk7CiAJc3RydWN0IGRlbnRyeSAqbG93ZXJfZGlyX2RlbnRyeTsKIAljaGFyICplbmNvZGVkX3N5bW5hbWU7Ci0JaW50IGVuY29kZWRfc3ltbGVuOwotCXN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0ID0gTlVMTDsKKwlzaXplX3QgZW5jb2RlZF9zeW1sZW47CisJc3RydWN0IGVjcnlwdGZzX21vdW50X2NyeXB0X3N0YXQgKm1vdW50X2NyeXB0X3N0YXQgPSBOVUxMOwogCiAJbG93ZXJfZGVudHJ5ID0gZWNyeXB0ZnNfZGVudHJ5X3RvX2xvd2VyKGRlbnRyeSk7CiAJZGdldChsb3dlcl9kZW50cnkpOwogCWxvd2VyX2Rpcl9kZW50cnkgPSBsb2NrX3BhcmVudChsb3dlcl9kZW50cnkpOwotCWVuY29kZWRfc3ltbGVuID0gZWNyeXB0ZnNfZW5jb2RlX2ZpbGVuYW1lKGNyeXB0X3N0YXQsIHN5bW5hbWUsCi0JCQkJCQkgIHN0cmxlbihzeW1uYW1lKSwKLQkJCQkJCSAgJmVuY29kZWRfc3ltbmFtZSk7Ci0JaWYgKGVuY29kZWRfc3ltbGVuIDwgMCkgewotCQlyYyA9IGVuY29kZWRfc3ltbGVuOworCW1vdW50X2NyeXB0X3N0YXQgPSAmZWNyeXB0ZnNfc3VwZXJibG9ja190b19wcml2YXRlKAorCQlkaXItPmlfc2IpLT5tb3VudF9jcnlwdF9zdGF0OworCXJjID0gZWNyeXB0ZnNfZW5jcnlwdF9hbmRfZW5jb2RlX2ZpbGVuYW1lKCZlbmNvZGVkX3N5bW5hbWUsCisJCQkJCQkgICZlbmNvZGVkX3N5bWxlbiwKKwkJCQkJCSAgTlVMTCwKKwkJCQkJCSAgbW91bnRfY3J5cHRfc3RhdCwgc3ltbmFtZSwKKwkJCQkJCSAgc3RybGVuKHN5bW5hbWUpKTsKKwlpZiAocmMpCiAJCWdvdG8gb3V0X2xvY2s7Ci0JfQogCXJjID0gdmZzX3N5bWxpbmsobG93ZXJfZGlyX2RlbnRyeS0+ZF9pbm9kZSwgbG93ZXJfZGVudHJ5LAogCQkJIGVuY29kZWRfc3ltbmFtZSk7CiAJa2ZyZWUoZW5jb2RlZF9zeW1uYW1lKTsKQEAgLTYwMiw1MyArNjQxLDU0IEBACiB9CiAKIHN0YXRpYyBpbnQKLWVjcnlwdGZzX3JlYWRsaW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY2hhciBfX3VzZXIgKiBidWYsIGludCBidWZzaXopCitlY3J5cHRmc19yZWFkbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgX191c2VyICpidWYsIGludCBidWZzaXopCiB7Ci0JaW50IHJjOwotCXN0cnVjdCBkZW50cnkgKmxvd2VyX2RlbnRyeTsKLQljaGFyICpkZWNvZGVkX25hbWU7CiAJY2hhciAqbG93ZXJfYnVmOwotCW1tX3NlZ21lbnRfdCBvbGRfZnM7CisJc3RydWN0IGRlbnRyeSAqbG93ZXJfZGVudHJ5OwogCXN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0OworCWNoYXIgKnBsYWludGV4dF9uYW1lOworCXNpemVfdCBwbGFpbnRleHRfbmFtZV9zaXplOworCW1tX3NlZ21lbnRfdCBvbGRfZnM7CisJaW50IHJjOwogCiAJbG93ZXJfZGVudHJ5ID0gZWNyeXB0ZnNfZGVudHJ5X3RvX2xvd2VyKGRlbnRyeSk7Ci0JaWYgKCFsb3dlcl9kZW50cnktPmRfaW5vZGUtPmlfb3AgfHwKLQkgICAgIWxvd2VyX2RlbnRyeS0+ZF9pbm9kZS0+aV9vcC0+cmVhZGxpbmspIHsKKwlpZiAoIWxvd2VyX2RlbnRyeS0+ZF9pbm9kZS0+aV9vcC0+cmVhZGxpbmspIHsKIAkJcmMgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CisJY3J5cHRfc3RhdCA9ICZlY3J5cHRmc19pbm9kZV90b19wcml2YXRlKGRlbnRyeS0+ZF9pbm9kZSktPmNyeXB0X3N0YXQ7CiAJLyogUmVsZWFzZWQgaW4gdGhpcyBmdW5jdGlvbiAqLwogCWxvd2VyX2J1ZiA9IGttYWxsb2MoYnVmc2l6LCBHRlBfS0VSTkVMKTsKIAlpZiAobG93ZXJfYnVmID09IE5VTEwpIHsKLQkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fRVJSLCAiT3V0IG9mIG1lbW9yeVxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IE91dCBvZiBtZW1vcnkgd2hpbHN0IGF0dGVtcHRpbmcgdG8gIgorCQkgICAgICAgImttYWxsb2MgWyVkXSBieXRlc1xuIiwgX19mdW5jX18sIGJ1ZnNpeik7CiAJCXJjID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiAJfQogCW9sZF9mcyA9IGdldF9mcygpOwogCXNldF9mcyhnZXRfZHMoKSk7Ci0JZWNyeXB0ZnNfcHJpbnRrKEtFUk5fREVCVUcsICJDYWxsaW5nIHJlYWRsaW5rIHcvICIKLQkJCSJsb3dlcl9kZW50cnktPmRfbmFtZS5uYW1lID0gWyVzXVxuIiwKLQkJCWxvd2VyX2RlbnRyeS0+ZF9uYW1lLm5hbWUpOwogCXJjID0gbG93ZXJfZGVudHJ5LT5kX2lub2RlLT5pX29wLT5yZWFkbGluayhsb3dlcl9kZW50cnksCiAJCQkJCQkgICAoY2hhciBfX3VzZXIgKilsb3dlcl9idWYsCiAJCQkJCQkgICBidWZzaXopOwogCXNldF9mcyhvbGRfZnMpOwogCWlmIChyYyA+PSAwKSB7Ci0JCWNyeXB0X3N0YXQgPSBOVUxMOwotCQlyYyA9IGVjcnlwdGZzX2RlY29kZV9maWxlbmFtZShjcnlwdF9zdGF0LCBsb3dlcl9idWYsIHJjLAotCQkJCQkgICAgICAmZGVjb2RlZF9uYW1lKTsKLQkJaWYgKHJjID09IC1FTk9NRU0pCisJCXJjID0gZWNyeXB0ZnNfZGVjb2RlX2FuZF9kZWNyeXB0X2ZpbGVuYW1lKCZwbGFpbnRleHRfbmFtZSwKKwkJCQkJCQkgICZwbGFpbnRleHRfbmFtZV9zaXplLAorCQkJCQkJCSAgZGVudHJ5LCBsb3dlcl9idWYsCisJCQkJCQkJICByYyk7CisJCWlmIChyYykgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgYXR0ZW1wdGluZyB0byBkZWNvZGUgYW5kICIKKwkJCSAgICAgICAiZGVjcnlwdCBmaWxlbmFtZTsgcmMgPSBbJWRdXG4iLCBfX2Z1bmNfXywKKwkJCQlyYyk7CiAJCQlnb3RvIG91dF9mcmVlX2xvd2VyX2J1ZjsKLQkJaWYgKHJjID4gMCkgewotCQkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fREVCVUcsICJDb3B5aW5nIFslZF0gYnl0ZXMgIgotCQkJCQkidG8gdXNlcnNwYWNlOiBbJSpzXVxuIiwgcmMsCi0JCQkJCWRlY29kZWRfbmFtZSk7Ci0JCQlpZiAoY29weV90b191c2VyKGJ1ZiwgZGVjb2RlZF9uYW1lLCByYykpCi0JCQkJcmMgPSAtRUZBVUxUOwogCQl9Ci0JCWtmcmVlKGRlY29kZWRfbmFtZSk7Ci0JCWZzc3RhY2tfY29weV9hdHRyX2F0aW1lKGRlbnRyeS0+ZF9pbm9kZSwKLQkJCQkJbG93ZXJfZGVudHJ5LT5kX2lub2RlKTsKKwkJcmMgPSBjb3B5X3RvX3VzZXIoYnVmLCBwbGFpbnRleHRfbmFtZSwgcGxhaW50ZXh0X25hbWVfc2l6ZSk7CisJCWlmIChyYykKKwkJCXJjID0gLUVGQVVMVDsKKwkJZWxzZQorCQkJcmMgPSBwbGFpbnRleHRfbmFtZV9zaXplOworCQlrZnJlZShwbGFpbnRleHRfbmFtZSk7CisJCWZzc3RhY2tfY29weV9hdHRyX2F0aW1lKGRlbnRyeS0+ZF9pbm9kZSwgbG93ZXJfZGVudHJ5LT5kX2lub2RlKTsKIAl9CiBvdXRfZnJlZV9sb3dlcl9idWY6CiAJa2ZyZWUobG93ZXJfYnVmKTsKQEAgLTY3MCw4ICs3MTAsNiBAQAogCX0KIAlvbGRfZnMgPSBnZXRfZnMoKTsKIAlzZXRfZnMoZ2V0X2RzKCkpOwotCWVjcnlwdGZzX3ByaW50ayhLRVJOX0RFQlVHLCAiQ2FsbGluZyByZWFkbGluayB3LyAiCi0JCQkiZGVudHJ5LT5kX25hbWUubmFtZSA9IFslc11cbiIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOwogCXJjID0gZGVudHJ5LT5kX2lub2RlLT5pX29wLT5yZWFkbGluayhkZW50cnksIChjaGFyIF9fdXNlciAqKWJ1ZiwgbGVuKTsKIAlzZXRfZnMob2xkX2ZzKTsKIAlpZiAocmMgPCAwKQpkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMva2V5c3RvcmUuYyBiL2ZzL2VjcnlwdGZzL2tleXN0b3JlLmMKaW5kZXggMGQ3MTNiNi4uZmY1Mzk0MiAxMDA2NDQKLS0tIGEvZnMvZWNyeXB0ZnMva2V5c3RvcmUuYworKysgYi9mcy9lY3J5cHRmcy9rZXlzdG9yZS5jCkBAIC0zNTgsNyArMzU4LDcgQEAKIAkvKiB2ZXJpZnkgdGhhdCBldmVyeXRoaW5nIHRocm91Z2ggdGhlIGVuY3J5cHRlZCBGRUsgc2l6ZSBpcyBwcmVzZW50ICovCiAJaWYgKG1lc3NhZ2VfbGVuIDwgNCkgewogCQlyYyA9IC1FSU87Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IG1lc3NhZ2VfbGVuIGlzIFslWmRdOyBtaW5pbXVtIGFjY2VwdGFibGUgIgorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBtZXNzYWdlX2xlbiBpcyBbJXpkXTsgbWluaW11bSBhY2NlcHRhYmxlICIKIAkJICAgICAgICJtZXNzYWdlIGxlbmd0aCBpcyBbJWRdXG4iLCBfX2Z1bmNfXywgbWVzc2FnZV9sZW4sIDQpOwogCQlnb3RvIG91dDsKIAl9CkBAIC0zODUsMTMgKzM4NSwxMyBAQAogCWkgKz0gZGF0YV9sZW47CiAJaWYgKG1lc3NhZ2VfbGVuIDwgKGkgKyBrZXlfcmVjLT5lbmNfa2V5X3NpemUpKSB7CiAJCXJjID0gLUVJTzsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogbWVzc2FnZV9sZW4gWyVaZF07IG1heCBsZW4gaXMgWyVaZF1cbiIsCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IG1lc3NhZ2VfbGVuIFslemRdOyBtYXggbGVuIGlzIFslemRdXG4iLAogCQkgICAgICAgX19mdW5jX18sIG1lc3NhZ2VfbGVuLCAoaSArIGtleV9yZWMtPmVuY19rZXlfc2l6ZSkpOwogCQlnb3RvIG91dDsKIAl9CiAJaWYgKGtleV9yZWMtPmVuY19rZXlfc2l6ZSA+IEVDUllQVEZTX01BWF9FTkNSWVBURURfS0VZX0JZVEVTKSB7CiAJCXJjID0gLUVJTzsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogRW5jcnlwdGVkIGtleV9zaXplIFslWmRdIGxhcmdlciB0aGFuICIKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRW5jcnlwdGVkIGtleV9zaXplIFslemRdIGxhcmdlciB0aGFuICIKIAkJICAgICAgICJ0aGUgbWF4aW11bSBrZXkgc2l6ZSBbJWRdXG4iLCBfX2Z1bmNfXywKIAkJICAgICAgIGtleV9yZWMtPmVuY19rZXlfc2l6ZSwKIAkJICAgICAgIEVDUllQVEZTX01BWF9FTkNSWVBURURfS0VZX0JZVEVTKTsKQEAgLTQwMyw2ICs0MDMsNTgwIEBACiB9CiAKIHN0YXRpYyBpbnQKK2VjcnlwdGZzX2ZpbmRfZ2xvYmFsX2F1dGhfdG9rX2Zvcl9zaWcoCisJc3RydWN0IGVjcnlwdGZzX2dsb2JhbF9hdXRoX3RvayAqKmdsb2JhbF9hdXRoX3RvaywKKwlzdHJ1Y3QgZWNyeXB0ZnNfbW91bnRfY3J5cHRfc3RhdCAqbW91bnRfY3J5cHRfc3RhdCwgY2hhciAqc2lnKQoreworCXN0cnVjdCBlY3J5cHRmc19nbG9iYWxfYXV0aF90b2sgKndhbGtlcjsKKwlpbnQgcmMgPSAwOworCisJKCpnbG9iYWxfYXV0aF90b2spID0gTlVMTDsKKwltdXRleF9sb2NrKCZtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfYXV0aF90b2tfbGlzdF9tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh3YWxrZXIsCisJCQkgICAgJm1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9hdXRoX3Rva19saXN0LAorCQkJICAgIG1vdW50X2NyeXB0X3N0YXRfbGlzdCkgeworCQlpZiAobWVtY21wKHdhbGtlci0+c2lnLCBzaWcsIEVDUllQVEZTX1NJR19TSVpFX0hFWCkgPT0gMCkgeworCQkJKCpnbG9iYWxfYXV0aF90b2spID0gd2Fsa2VyOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJcmMgPSAtRUlOVkFMOworb3V0OgorCW11dGV4X3VubG9jaygmbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2F1dGhfdG9rX2xpc3RfbXV0ZXgpOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBlY3J5cHRmc19maW5kX2F1dGhfdG9rX2Zvcl9zaWcKKyAqIEBhdXRoX3RvazogU2V0IHRvIHRoZSBtYXRjaGluZyBhdXRoX3RvazsgTlVMTCBpZiBub3QgZm91bmQKKyAqIEBjcnlwdF9zdGF0OiBpbm9kZSBjcnlwdF9zdGF0IGNyeXB0byBjb250ZXh0CisgKiBAc2lnOiBTaWcgb2YgYXV0aF90b2sgdG8gZmluZAorICoKKyAqIEZvciBub3csIHRoaXMgZnVuY3Rpb24gc2ltcGx5IGxvb2tzIGF0IHRoZSByZWdpc3RlcmVkIGF1dGhfdG9rJ3MKKyAqIGxpbmtlZCBvZmYgdGhlIG1vdW50X2NyeXB0X3N0YXQsIHNvIGFsbCB0aGUgYXV0aF90b2tzIHRoYXQgY2FuIGJlCisgKiB1c2VkIG11c3QgYmUgcmVnaXN0ZXJlZCBhdCBtb3VudCB0aW1lLiBUaGlzIGZ1bmN0aW9uIGNvdWxkCisgKiBwb3RlbnRpYWxseSB0cnkgYSBsb3QgaGFyZGVyIHRvIGZpbmQgYXV0aF90b2sncyAoZS5nLiwgYnkgY2FsbGluZworICogb3V0IHRvIGVjcnlwdGZzZCB0byBkeW5hbWljYWxseSByZXRyaWV2ZSBhbiBhdXRoX3RvayBvYmplY3QpIHNvCisgKiB0aGF0IHN0YXRpYyByZWdpc3RyYXRpb24gb2YgYXV0aF90b2sncyB3aWxsIG5vIGxvbmdlciBiZSBuZWNlc3NhcnkuCisgKgorICogUmV0dXJucyB6ZXJvIG9uIG5vIGVycm9yOyBub24temVybyBvbiBlcnJvcgorICovCitzdGF0aWMgaW50CitlY3J5cHRmc19maW5kX2F1dGhfdG9rX2Zvcl9zaWcoCisJc3RydWN0IGVjcnlwdGZzX2F1dGhfdG9rICoqYXV0aF90b2ssCisJc3RydWN0IGVjcnlwdGZzX21vdW50X2NyeXB0X3N0YXQgKm1vdW50X2NyeXB0X3N0YXQsCisJY2hhciAqc2lnKQoreworCXN0cnVjdCBlY3J5cHRmc19nbG9iYWxfYXV0aF90b2sgKmdsb2JhbF9hdXRoX3RvazsKKwlpbnQgcmMgPSAwOworCisJKCphdXRoX3RvaykgPSBOVUxMOworCWlmIChlY3J5cHRmc19maW5kX2dsb2JhbF9hdXRoX3Rva19mb3Jfc2lnKCZnbG9iYWxfYXV0aF90b2ssCisJCQkJCQkgIG1vdW50X2NyeXB0X3N0YXQsIHNpZykpIHsKKwkJc3RydWN0IGtleSAqYXV0aF90b2tfa2V5OworCisJCXJjID0gZWNyeXB0ZnNfa2V5cmluZ19hdXRoX3Rva19mb3Jfc2lnKCZhdXRoX3Rva19rZXksIGF1dGhfdG9rLAorCQkJCQkJICAgICAgIHNpZyk7CisJfSBlbHNlCisJCSgqYXV0aF90b2spID0gZ2xvYmFsX2F1dGhfdG9rLT5nbG9iYWxfYXV0aF90b2s7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIHdyaXRlX3RhZ183MF9wYWNrZXQgY2FuIGdvYmJsZSBhIGxvdCBvZiBzdGFjayBzcGFjZS4gV2Ugc3R1ZmYgbW9zdAorICogb2YgdGhlIGZ1bmN0aW9uJ3MgcGFyYW1ldGVycyBpbiBhIGttYWxsb2MnZCBzdHJ1Y3QgdG8gaGVscCByZWR1Y2UKKyAqIGVDcnlwdGZzJyBvdmVyYWxsIHN0YWNrIHVzYWdlLgorICovCitzdHJ1Y3QgZWNyeXB0ZnNfd3JpdGVfdGFnXzcwX3BhY2tldF9zaWxseV9zdGFjayB7CisJdTggY2lwaGVyX2NvZGU7CisJc2l6ZV90IG1heF9wYWNrZXRfc2l6ZTsKKwlzaXplX3QgcGFja2V0X3NpemVfbGVuOworCXNpemVfdCBibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemU7CisJc2l6ZV90IGJsb2NrX3NpemU7CisJc2l6ZV90IGk7CisJc2l6ZV90IGo7CisJc2l6ZV90IG51bV9yYW5kX2J5dGVzOworCXN0cnVjdCBtdXRleCAqdGZtX211dGV4OworCWNoYXIgKmJsb2NrX2FsaWduZWRfZmlsZW5hbWU7CisJc3RydWN0IGVjcnlwdGZzX2F1dGhfdG9rICphdXRoX3RvazsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc3JjX3NnOworCXN0cnVjdCBzY2F0dGVybGlzdCBkc3Rfc2c7CisJc3RydWN0IGJsa2NpcGhlcl9kZXNjIGRlc2M7CisJY2hhciBpdltFQ1JZUFRGU19NQVhfSVZfQllURVNdOworCWNoYXIgaGFzaFtFQ1JZUFRGU19UQUdfNzBfRElHRVNUX1NJWkVdOworCWNoYXIgdG1wX2hhc2hbRUNSWVBURlNfVEFHXzcwX0RJR0VTVF9TSVpFXTsKKwlzdHJ1Y3QgaGFzaF9kZXNjIGhhc2hfZGVzYzsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgaGFzaF9zZzsKK307CisKKy8qKgorICogd3JpdGVfdGFnXzcwX3BhY2tldCAtIFdyaXRlIGVuY3J5cHRlZCBmaWxlbmFtZSAoRUZOKSBwYWNrZXQgYWdhaW5zdCBGTkVLCisgKiBAZmlsZW5hbWU6IE5VTEwtdGVybWluYXRlZCBmaWxlbmFtZSBzdHJpbmcKKyAqCisgKiBUaGlzIGlzIHRoZSBzaW1wbGVzdCBtZWNoYW5pc20gZm9yIGFjaGlldmluZyBmaWxlbmFtZSBlbmNyeXB0aW9uIGluCisgKiBlQ3J5cHRmcy4gSXQgZW5jcnlwdHMgdGhlIGdpdmVuIGZpbGVuYW1lIHdpdGggdGhlIG1vdW50LXdpZGUKKyAqIGZpbGVuYW1lIGVuY3J5cHRpb24ga2V5IChGTkVLKSBhbmQgc3RvcmVzIGl0IGluIGEgcGFja2V0IHRvIEBkZXN0LAorICogd2hpY2ggdGhlIGNhbGxlZSB3aWxsIGVuY29kZSBhbmQgd3JpdGUgZGlyZWN0bHkgaW50byB0aGUgZGVudHJ5CisgKiBuYW1lLgorICovCitpbnQKK2VjcnlwdGZzX3dyaXRlX3RhZ183MF9wYWNrZXQoY2hhciAqZGVzdCwgc2l6ZV90ICpyZW1haW5pbmdfYnl0ZXMsCisJCQkgICAgIHNpemVfdCAqcGFja2V0X3NpemUsCisJCQkgICAgIHN0cnVjdCBlY3J5cHRmc19tb3VudF9jcnlwdF9zdGF0ICptb3VudF9jcnlwdF9zdGF0LAorCQkJICAgICBjaGFyICpmaWxlbmFtZSwgc2l6ZV90IGZpbGVuYW1lX3NpemUpCit7CisJc3RydWN0IGVjcnlwdGZzX3dyaXRlX3RhZ183MF9wYWNrZXRfc2lsbHlfc3RhY2sgKnM7CisJaW50IHJjID0gMDsKKworCXMgPSBrbWFsbG9jKHNpemVvZigqcyksIEdGUF9LRVJORUwpOworCWlmICghcykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBPdXQgb2YgbWVtb3J5IHdoaWxzdCB0cnlpbmcgdG8ga21hbGxvYyAiCisJCSAgICAgICAiWyV6ZF0gYnl0ZXMgb2Yga2VybmVsIG1lbW9yeVxuIiwgX19mdW5jX18sIHNpemVvZigqcykpOworCQlnb3RvIG91dDsKKwl9CisJcy0+ZGVzYy5mbGFncyA9IENSWVBUT19URk1fUkVRX01BWV9TTEVFUDsKKwkoKnBhY2tldF9zaXplKSA9IDA7CisJcmMgPSBlY3J5cHRmc19nZXRfdGZtX2FuZF9tdXRleF9mb3JfY2lwaGVyX25hbWUoCisJCSZzLT5kZXNjLnRmbSwKKwkJJnMtPnRmbV9tdXRleCwgbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX25hbWUpOworCWlmICh1bmxpa2VseShyYykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJJbnRlcm5hbCBlcnJvciB3aGlsc3QgYXR0ZW1wdGluZyB0byBnZXQgIgorCQkgICAgICAgInRmbSBhbmQgbXV0ZXggZm9yIGNpcGhlciBuYW1lIFslc107IHJjID0gWyVkXVxuIiwKKwkJICAgICAgIG1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2ZuX2NpcGhlcl9uYW1lLCByYyk7CisJCWdvdG8gb3V0OworCX0KKwltdXRleF9sb2NrKHMtPnRmbV9tdXRleCk7CisJcy0+YmxvY2tfc2l6ZSA9IGNyeXB0b19ibGtjaXBoZXJfYmxvY2tzaXplKHMtPmRlc2MudGZtKTsKKwkvKiBQbHVzIG9uZSBmb3IgdGhlIFwwIHNlcGFyYXRvciBiZXR3ZWVuIHRoZSByYW5kb20gcHJlZml4CisJICogYW5kIHRoZSBwbGFpbnRleHQgZmlsZW5hbWUgKi8KKwlzLT5udW1fcmFuZF9ieXRlcyA9IChFQ1JZUFRGU19GSUxFTkFNRV9NSU5fUkFORE9NX1BSRVBFTkRfQllURVMgKyAxKTsKKwlzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUgPSAocy0+bnVtX3JhbmRfYnl0ZXMgKyBmaWxlbmFtZV9zaXplKTsKKwlpZiAoKHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSAlIHMtPmJsb2NrX3NpemUpICE9IDApIHsKKwkJcy0+bnVtX3JhbmRfYnl0ZXMgKz0gKHMtPmJsb2NrX3NpemUKKwkJCQkgICAgICAtIChzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUKKwkJCQkJICUgcy0+YmxvY2tfc2l6ZSkpOworCQlzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUgPSAocy0+bnVtX3JhbmRfYnl0ZXMKKwkJCQkJCSAgKyBmaWxlbmFtZV9zaXplKTsKKwl9CisJLyogT2N0ZXQgMDogVGFnIDcwIGlkZW50aWZpZXIKKwkgKiBPY3RldHMgMS1OMTogVGFnIDcwIHBhY2tldCBzaXplIChpbmNsdWRlcyBjaXBoZXIgaWRlbnRpZmllcgorCSAqICAgICAgICAgICAgICBhbmQgYmxvY2stYWxpZ25lZCBlbmNyeXB0ZWQgZmlsZW5hbWUgc2l6ZSkKKwkgKiBPY3RldHMgTjEtTjI6IEZORUsgc2lnIChFQ1JZUFRGU19TSUdfU0laRSkKKwkgKiBPY3RldCBOMi1OMzogQ2lwaGVyIGlkZW50aWZpZXIgKDEgb2N0ZXQpCisJICogT2N0ZXRzIE4zLU40OiBCbG9jay1hbGlnbmVkIGVuY3J5cHRlZCBmaWxlbmFtZQorCSAqICAtIENvbnNpc3RzIG9mIGEgbWluaW11bSBudW1iZXIgb2YgcmFuZG9tIGNoYXJhY3RlcnMsIGEgXDAKKwkgKiAgICBzZXBhcmF0b3IsIGFuZCB0aGVuIHRoZSBmaWxlbmFtZSAqLworCXMtPm1heF9wYWNrZXRfc2l6ZSA9ICgxICAgICAgICAgICAgICAgICAgIC8qIFRhZyA3MCBpZGVudGlmaWVyICovCisJCQkgICAgICArIDMgICAgICAgICAgICAgICAgIC8qIE1heCBUYWcgNzAgcGFja2V0IHNpemUgKi8KKwkJCSAgICAgICsgRUNSWVBURlNfU0lHX1NJWkUgLyogRk5FSyBzaWcgKi8KKwkJCSAgICAgICsgMSAgICAgICAgICAgICAgICAgLyogQ2lwaGVyIGlkZW50aWZpZXIgKi8KKwkJCSAgICAgICsgcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplKTsKKwlpZiAoZGVzdCA9PSBOVUxMKSB7CisJCSgqcGFja2V0X3NpemUpID0gcy0+bWF4X3BhY2tldF9zaXplOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCWlmIChzLT5tYXhfcGFja2V0X3NpemUgPiAoKnJlbWFpbmluZ19ieXRlcykpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJlcXVpcmUgWyV6ZF0gYnl0ZXMgdG8gd3JpdGU7IG9ubHkgIgorCQkgICAgICAgIlslemRdIGF2YWlsYWJsZVxuIiwgX19mdW5jX18sIHMtPm1heF9wYWNrZXRfc2l6ZSwKKwkJICAgICAgICgqcmVtYWluaW5nX2J5dGVzKSk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwlzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lID0ga3phbGxvYyhzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUsCisJCQkJCSAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIXMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogT3V0IG9mIGtlcm5lbCBtZW1vcnkgd2hpbHN0IGF0dGVtcHRpbmcgdG8gIgorCQkgICAgICAgImt6YWxsb2MgWyV6ZF0gYnl0ZXNcbiIsIF9fZnVuY19fLAorCQkgICAgICAgcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCXMtPmkgPSAwOworCWRlc3Rbcy0+aSsrXSA9IEVDUllQVEZTX1RBR183MF9QQUNLRVRfVFlQRTsKKwlyYyA9IGVjcnlwdGZzX3dyaXRlX3BhY2tldF9sZW5ndGgoJmRlc3Rbcy0+aV0sCisJCQkJCSAgKEVDUllQVEZTX1NJR19TSVpFCisJCQkJCSAgICsgMSAvKiBDaXBoZXIgY29kZSAqLworCQkJCQkgICArIHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSksCisJCQkJCSAgJnMtPnBhY2tldF9zaXplX2xlbik7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIGdlbmVyYXRpbmcgdGFnIDcwIHBhY2tldCAiCisJCSAgICAgICAiaGVhZGVyOyBjYW5ub3QgZ2VuZXJhdGUgcGFja2V0IGxlbmd0aDsgcmMgPSBbJWRdXG4iLAorCQkgICAgICAgX19mdW5jX18sIHJjKTsKKwkJZ290byBvdXRfZnJlZV91bmxvY2s7CisJfQorCXMtPmkgKz0gcy0+cGFja2V0X3NpemVfbGVuOworCWVjcnlwdGZzX2Zyb21faGV4KCZkZXN0W3MtPmldLAorCQkJICBtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9mbmVrX3NpZywKKwkJCSAgRUNSWVBURlNfU0lHX1NJWkUpOworCXMtPmkgKz0gRUNSWVBURlNfU0lHX1NJWkU7CisJcy0+Y2lwaGVyX2NvZGUgPSBlY3J5cHRmc19jb2RlX2Zvcl9jaXBoZXJfc3RyaW5nKAorCQltb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9mbl9jaXBoZXJfbmFtZSwKKwkJbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX2tleV9ieXRlcyk7CisJaWYgKHMtPmNpcGhlcl9jb2RlID09IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVuYWJsZSB0byBnZW5lcmF0ZSBjb2RlIGZvciAiCisJCSAgICAgICAiY2lwaGVyIFslc10gd2l0aCBrZXkgYnl0ZXMgWyV6ZF1cbiIsIF9fZnVuY19fLAorCQkgICAgICAgbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX25hbWUsCisJCSAgICAgICBtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9mbl9jaXBoZXJfa2V5X2J5dGVzKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIG91dF9mcmVlX3VubG9jazsKKwl9CisJZGVzdFtzLT5pKytdID0gcy0+Y2lwaGVyX2NvZGU7CisJcmMgPSBlY3J5cHRmc19maW5kX2F1dGhfdG9rX2Zvcl9zaWcoCisJCSZzLT5hdXRoX3RvaywgbW91bnRfY3J5cHRfc3RhdCwKKwkJbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5la19zaWcpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciBhdHRlbXB0aW5nIHRvIGZpbmQgYXV0aCB0b2sgZm9yICIKKwkJICAgICAgICJmbmVrIHNpZyBbJXNdOyByYyA9IFslZF1cbiIsIF9fZnVuY19fLAorCQkgICAgICAgbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5la19zaWcsIHJjKTsKKwkJZ290byBvdXRfZnJlZV91bmxvY2s7CisJfQorCS8qIFRPRE86IFN1cHBvcnQgb3RoZXIga2V5IG1vZHVsZXMgdGhhbiBwYXNzcGhyYXNlIGZvcgorCSAqIGZpbGVuYW1lIGVuY3J5cHRpb24gKi8KKwlCVUdfT04ocy0+YXV0aF90b2stPnRva2VuX3R5cGUgIT0gRUNSWVBURlNfUEFTU1dPUkQpOworCXNnX2luaXRfb25lKAorCQkmcy0+aGFzaF9zZywKKwkJKHU4ICopcy0+YXV0aF90b2stPnRva2VuLnBhc3N3b3JkLnNlc3Npb25fa2V5X2VuY3J5cHRpb25fa2V5LAorCQlzLT5hdXRoX3Rvay0+dG9rZW4ucGFzc3dvcmQuc2Vzc2lvbl9rZXlfZW5jcnlwdGlvbl9rZXlfYnl0ZXMpOworCXMtPmhhc2hfZGVzYy5mbGFncyA9IENSWVBUT19URk1fUkVRX01BWV9TTEVFUDsKKwlzLT5oYXNoX2Rlc2MudGZtID0gY3J5cHRvX2FsbG9jX2hhc2goRUNSWVBURlNfVEFHXzcwX0RJR0VTVCwgMCwKKwkJCQkJICAgICBDUllQVE9fQUxHX0FTWU5DKTsKKwlpZiAoSVNfRVJSKHMtPmhhc2hfZGVzYy50Zm0pKSB7CisJCQlyYyA9IFBUUl9FUlIocy0+aGFzaF9kZXNjLnRmbSk7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciBhdHRlbXB0aW5nIHRvICIKKwkJCSAgICAgICAiYWxsb2NhdGUgaGFzaCBjcnlwdG8gY29udGV4dDsgcmMgPSBbJWRdXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCByYyk7CisJCQlnb3RvIG91dF9mcmVlX3VubG9jazsKKwl9CisJcmMgPSBjcnlwdG9faGFzaF9pbml0KCZzLT5oYXNoX2Rlc2MpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICIlczogRXJyb3IgaW5pdGlhbGl6aW5nIGNyeXB0byBoYXNoOyByYyA9IFslZF1cbiIsCisJCSAgICAgICBfX2Z1bmNfXywgcmMpOworCQlnb3RvIG91dF9yZWxlYXNlX2ZyZWVfdW5sb2NrOworCX0KKwlyYyA9IGNyeXB0b19oYXNoX3VwZGF0ZSgKKwkJJnMtPmhhc2hfZGVzYywgJnMtPmhhc2hfc2csCisJCXMtPmF1dGhfdG9rLT50b2tlbi5wYXNzd29yZC5zZXNzaW9uX2tleV9lbmNyeXB0aW9uX2tleV9ieXRlcyk7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIiVzOiBFcnJvciB1cGRhdGluZyBjcnlwdG8gaGFzaDsgcmMgPSBbJWRdXG4iLAorCQkgICAgICAgX19mdW5jX18sIHJjKTsKKwkJZ290byBvdXRfcmVsZWFzZV9mcmVlX3VubG9jazsKKwl9CisJcmMgPSBjcnlwdG9faGFzaF9maW5hbCgmcy0+aGFzaF9kZXNjLCBzLT5oYXNoKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiJXM6IEVycm9yIGZpbmFsaXppbmcgY3J5cHRvIGhhc2g7IHJjID0gWyVkXVxuIiwKKwkJICAgICAgIF9fZnVuY19fLCByYyk7CisJCWdvdG8gb3V0X3JlbGVhc2VfZnJlZV91bmxvY2s7CisJfQorCWZvciAocy0+aiA9IDA7IHMtPmogPCAocy0+bnVtX3JhbmRfYnl0ZXMgLSAxKTsgcy0+aisrKSB7CisJCXMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVbcy0+al0gPQorCQkJcy0+aGFzaFsocy0+aiAlIEVDUllQVEZTX1RBR183MF9ESUdFU1RfU0laRSldOworCQlpZiAoKHMtPmogJSBFQ1JZUFRGU19UQUdfNzBfRElHRVNUX1NJWkUpCisJCSAgICA9PSAoRUNSWVBURlNfVEFHXzcwX0RJR0VTVF9TSVpFIC0gMSkpIHsKKwkJCXNnX2luaXRfb25lKCZzLT5oYXNoX3NnLCAodTggKilzLT5oYXNoLAorCQkJCSAgICBFQ1JZUFRGU19UQUdfNzBfRElHRVNUX1NJWkUpOworCQkJcmMgPSBjcnlwdG9faGFzaF9pbml0KCZzLT5oYXNoX2Rlc2MpOworCQkJaWYgKHJjKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJICAgICAgICIlczogRXJyb3IgaW5pdGlhbGl6aW5nIGNyeXB0byBoYXNoOyAiCisJCQkJICAgICAgICJyYyA9IFslZF1cbiIsIF9fZnVuY19fLCByYyk7CisJCQkJZ290byBvdXRfcmVsZWFzZV9mcmVlX3VubG9jazsKKwkJCX0KKwkJCXJjID0gY3J5cHRvX2hhc2hfdXBkYXRlKCZzLT5oYXNoX2Rlc2MsICZzLT5oYXNoX3NnLAorCQkJCQkJRUNSWVBURlNfVEFHXzcwX0RJR0VTVF9TSVpFKTsKKwkJCWlmIChyYykgeworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCSAgICAgICAiJXM6IEVycm9yIHVwZGF0aW5nIGNyeXB0byBoYXNoOyAiCisJCQkJICAgICAgICJyYyA9IFslZF1cbiIsIF9fZnVuY19fLCByYyk7CisJCQkJZ290byBvdXRfcmVsZWFzZV9mcmVlX3VubG9jazsKKwkJCX0KKwkJCXJjID0gY3J5cHRvX2hhc2hfZmluYWwoJnMtPmhhc2hfZGVzYywgcy0+dG1wX2hhc2gpOworCQkJaWYgKHJjKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJICAgICAgICIlczogRXJyb3IgZmluYWxpemluZyBjcnlwdG8gaGFzaDsgIgorCQkJCSAgICAgICAicmMgPSBbJWRdXG4iLCBfX2Z1bmNfXywgcmMpOworCQkJCWdvdG8gb3V0X3JlbGVhc2VfZnJlZV91bmxvY2s7CisJCQl9CisJCQltZW1jcHkocy0+aGFzaCwgcy0+dG1wX2hhc2gsCisJCQkgICAgICAgRUNSWVBURlNfVEFHXzcwX0RJR0VTVF9TSVpFKTsKKwkJfQorCQlpZiAocy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZVtzLT5qXSA9PSAnXDAnKQorCQkJcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZVtzLT5qXSA9IEVDUllQVEZTX05PTl9OVUxMOworCX0KKwltZW1jcHkoJnMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVbcy0+bnVtX3JhbmRfYnl0ZXNdLCBmaWxlbmFtZSwKKwkgICAgICAgZmlsZW5hbWVfc2l6ZSk7CisJcmMgPSB2aXJ0X3RvX3NjYXR0ZXJsaXN0KHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWUsCisJCQkJIHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSwgJnMtPnNyY19zZywgMSk7CisJaWYgKHJjICE9IDEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSW50ZXJuYWwgZXJyb3Igd2hpbHN0IGF0dGVtcHRpbmcgdG8gIgorCQkgICAgICAgImNvbnZlcnQgZmlsZW5hbWUgbWVtb3J5IHRvIHNjYXR0ZXJsaXN0OyAiCisJCSAgICAgICAiZXhwZWN0ZWQgcmMgPSAxOyBnb3QgcmMgPSBbJWRdLiAiCisJCSAgICAgICAiYmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplID0gWyV6ZF1cbiIsIF9fZnVuY19fLCByYywKKwkJICAgICAgIHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSk7CisJCWdvdG8gb3V0X3JlbGVhc2VfZnJlZV91bmxvY2s7CisJfQorCXJjID0gdmlydF90b19zY2F0dGVybGlzdCgmZGVzdFtzLT5pXSwgcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplLAorCQkJCSAmcy0+ZHN0X3NnLCAxKTsKKwlpZiAocmMgIT0gMSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJbnRlcm5hbCBlcnJvciB3aGlsc3QgYXR0ZW1wdGluZyB0byAiCisJCSAgICAgICAiY29udmVydCBlbmNyeXB0ZWQgZmlsZW5hbWUgbWVtb3J5IHRvIHNjYXR0ZXJsaXN0OyAiCisJCSAgICAgICAiZXhwZWN0ZWQgcmMgPSAxOyBnb3QgcmMgPSBbJWRdLiAiCisJCSAgICAgICAiYmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplID0gWyV6ZF1cbiIsIF9fZnVuY19fLCByYywKKwkJICAgICAgIHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSk7CisJCWdvdG8gb3V0X3JlbGVhc2VfZnJlZV91bmxvY2s7CisJfQorCS8qIFRoZSBjaGFyYWN0ZXJzIGluIHRoZSBmaXJzdCBibG9jayBlZmZlY3RpdmVseSBkbyB0aGUgam9iCisJICogb2YgdGhlIElWIGhlcmUsIHNvIHdlIGp1c3QgdXNlIDAncyBmb3IgdGhlIElWLiBOb3RlIHRoZQorCSAqIGNvbnN0cmFpbnQgdGhhdCBFQ1JZUFRGU19GSUxFTkFNRV9NSU5fUkFORE9NX1BSRVBFTkRfQllURVMKKwkgKiA+PSBFQ1JZUFRGU19NQVhfSVZfQllURVMuICovCisJbWVtc2V0KHMtPml2LCAwLCBFQ1JZUFRGU19NQVhfSVZfQllURVMpOworCXMtPmRlc2MuaW5mbyA9IHMtPml2OworCXJjID0gY3J5cHRvX2Jsa2NpcGhlcl9zZXRrZXkoCisJCXMtPmRlc2MudGZtLAorCQlzLT5hdXRoX3Rvay0+dG9rZW4ucGFzc3dvcmQuc2Vzc2lvbl9rZXlfZW5jcnlwdGlvbl9rZXksCisJCW1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2ZuX2NpcGhlcl9rZXlfYnl0ZXMpOworCWlmIChyYyA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3Igc2V0dGluZyBrZXkgZm9yIGNyeXB0byBjb250ZXh0OyAiCisJCSAgICAgICAicmMgPSBbJWRdLiBzLT5hdXRoX3Rvay0+dG9rZW4ucGFzc3dvcmQuc2Vzc2lvbl9rZXlfIgorCQkgICAgICAgImVuY3J5cHRpb25fa2V5ID0gWzB4JXBdOyBtb3VudF9jcnlwdF9zdGF0LT4iCisJCSAgICAgICAiZ2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX2tleV9ieXRlcyA9IFslemRdXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgIHJjLAorCQkgICAgICAgcy0+YXV0aF90b2stPnRva2VuLnBhc3N3b3JkLnNlc3Npb25fa2V5X2VuY3J5cHRpb25fa2V5LAorCQkgICAgICAgbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX2tleV9ieXRlcyk7CisJCWdvdG8gb3V0X3JlbGVhc2VfZnJlZV91bmxvY2s7CisJfQorCXJjID0gY3J5cHRvX2Jsa2NpcGhlcl9lbmNyeXB0X2l2KCZzLT5kZXNjLCAmcy0+ZHN0X3NnLCAmcy0+c3JjX3NnLAorCQkJCQkgcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgYXR0ZW1wdGluZyB0byBlbmNyeXB0IGZpbGVuYW1lOyAiCisJCSAgICAgICAicmMgPSBbJWRdXG4iLCBfX2Z1bmNfXywgcmMpOworCQlnb3RvIG91dF9yZWxlYXNlX2ZyZWVfdW5sb2NrOworCX0KKwlzLT5pICs9IHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZTsKKwkoKnBhY2tldF9zaXplKSA9IHMtPmk7CisJKCpyZW1haW5pbmdfYnl0ZXMpIC09ICgqcGFja2V0X3NpemUpOworb3V0X3JlbGVhc2VfZnJlZV91bmxvY2s6CisJY3J5cHRvX2ZyZWVfaGFzaChzLT5oYXNoX2Rlc2MudGZtKTsKK291dF9mcmVlX3VubG9jazoKKwltZW1zZXQocy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZSwgMCwgcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplKTsKKwlrZnJlZShzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lKTsKK291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKHMtPnRmbV9tdXRleCk7CitvdXQ6CisJa2ZyZWUocyk7CisJcmV0dXJuIHJjOworfQorCitzdHJ1Y3QgZWNyeXB0ZnNfcGFyc2VfdGFnXzcwX3BhY2tldF9zaWxseV9zdGFjayB7CisJdTggY2lwaGVyX2NvZGU7CisJc2l6ZV90IG1heF9wYWNrZXRfc2l6ZTsKKwlzaXplX3QgcGFja2V0X3NpemVfbGVuOworCXNpemVfdCBwYXJzZWRfdGFnXzcwX3BhY2tldF9zaXplOworCXNpemVfdCBibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemU7CisJc2l6ZV90IGJsb2NrX3NpemU7CisJc2l6ZV90IGk7CisJc3RydWN0IG11dGV4ICp0Zm1fbXV0ZXg7CisJY2hhciAqZGVjcnlwdGVkX2ZpbGVuYW1lOworCXN0cnVjdCBlY3J5cHRmc19hdXRoX3RvayAqYXV0aF90b2s7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNyY19zZzsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgZHN0X3NnOworCXN0cnVjdCBibGtjaXBoZXJfZGVzYyBkZXNjOworCWNoYXIgZm5la19zaWdfaGV4W0VDUllQVEZTX1NJR19TSVpFX0hFWCArIDFdOworCWNoYXIgaXZbRUNSWVBURlNfTUFYX0lWX0JZVEVTXTsKKwljaGFyIGNpcGhlcl9zdHJpbmdbRUNSWVBURlNfTUFYX0NJUEhFUl9OQU1FX1NJWkVdOworfTsKKworLyoqCisgKiBwYXJzZV90YWdfNzBfcGFja2V0IC0gUGFyc2UgYW5kIHByb2Nlc3MgRk5FSy1lbmNyeXB0ZWQgcGFzc3BocmFzZSBwYWNrZXQKKyAqIEBmaWxlbmFtZTogVGhpcyBmdW5jdGlvbiBrbWFsbG9jJ3MgdGhlIG1lbW9yeSBmb3IgdGhlIGZpbGVuYW1lCisgKiBAZmlsZW5hbWVfc2l6ZTogVGhpcyBmdW5jdGlvbiBzZXRzIHRoaXMgdG8gdGhlIGFtb3VudCBvZiBtZW1vcnkKKyAqICAgICAgICAgICAgICAgICBrbWFsbG9jJ2QgZm9yIHRoZSBmaWxlbmFtZQorICogQHBhY2tldF9zaXplOiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhpcyB0byB0aGUgdGhlIG51bWJlciBvZiBvY3RldHMKKyAqICAgICAgICAgICAgICAgaW4gdGhlIHBhY2tldCBwYXJzZWQKKyAqIEBtb3VudF9jcnlwdF9zdGF0OiBUaGUgbW91bnQtd2lkZSBjcnlwdG9ncmFwaGljIGNvbnRleHQKKyAqIEBkYXRhOiBUaGUgbWVtb3J5IGxvY2F0aW9uIGNvbnRhaW5pbmcgdGhlIHN0YXJ0IG9mIHRoZSB0YWcgNzAKKyAqICAgICAgICBwYWNrZXQKKyAqIEBtYXhfcGFja2V0X3NpemU6IFRoZSBtYXhpbXVtIGxlZ2FsIHNpemUgb2YgdGhlIHBhY2tldCB0byBiZSBwYXJzZWQKKyAqICAgICAgICAgICAgICAgICAgIGZyb20gQGRhdGEKKyAqCisgKiBSZXR1cm5zIHplcm8gb24gc3VjY2Vzczsgbm9uLXplcm8gb3RoZXJ3aXNlCisgKi8KK2ludAorZWNyeXB0ZnNfcGFyc2VfdGFnXzcwX3BhY2tldChjaGFyICoqZmlsZW5hbWUsIHNpemVfdCAqZmlsZW5hbWVfc2l6ZSwKKwkJCSAgICAgc2l6ZV90ICpwYWNrZXRfc2l6ZSwKKwkJCSAgICAgc3RydWN0IGVjcnlwdGZzX21vdW50X2NyeXB0X3N0YXQgKm1vdW50X2NyeXB0X3N0YXQsCisJCQkgICAgIGNoYXIgKmRhdGEsIHNpemVfdCBtYXhfcGFja2V0X3NpemUpCit7CisJc3RydWN0IGVjcnlwdGZzX3BhcnNlX3RhZ183MF9wYWNrZXRfc2lsbHlfc3RhY2sgKnM7CisJaW50IHJjID0gMDsKKworCSgqcGFja2V0X3NpemUpID0gMDsKKwkoKmZpbGVuYW1lX3NpemUpID0gMDsKKwkoKmZpbGVuYW1lKSA9IE5VTEw7CisJcyA9IGttYWxsb2Moc2l6ZW9mKCpzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IE91dCBvZiBtZW1vcnkgd2hpbHN0IHRyeWluZyB0byBrbWFsbG9jICIKKwkJICAgICAgICJbJXpkXSBieXRlcyBvZiBrZXJuZWwgbWVtb3J5XG4iLCBfX2Z1bmNfXywgc2l6ZW9mKCpzKSk7CisJCWdvdG8gb3V0OworCX0KKwlzLT5kZXNjLmZsYWdzID0gQ1JZUFRPX1RGTV9SRVFfTUFZX1NMRUVQOworCWlmIChtYXhfcGFja2V0X3NpemUgPCAoMSArIDEgKyBFQ1JZUFRGU19TSUdfU0laRSArIDEgKyAxKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogbWF4X3BhY2tldF9zaXplIGlzIFslemRdOyBpdCBtdXN0IGJlICIKKwkJICAgICAgICJhdCBsZWFzdCBbJWRdXG4iLCBfX2Z1bmNfXywgbWF4X3BhY2tldF9zaXplLAorCQkJKDEgKyAxICsgRUNSWVBURlNfU0lHX1NJWkUgKyAxICsgMSkpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwkvKiBPY3RldCAwOiBUYWcgNzAgaWRlbnRpZmllcgorCSAqIE9jdGV0cyAxLU4xOiBUYWcgNzAgcGFja2V0IHNpemUgKGluY2x1ZGVzIGNpcGhlciBpZGVudGlmaWVyCisJICogICAgICAgICAgICAgIGFuZCBibG9jay1hbGlnbmVkIGVuY3J5cHRlZCBmaWxlbmFtZSBzaXplKQorCSAqIE9jdGV0cyBOMS1OMjogRk5FSyBzaWcgKEVDUllQVEZTX1NJR19TSVpFKQorCSAqIE9jdGV0IE4yLU4zOiBDaXBoZXIgaWRlbnRpZmllciAoMSBvY3RldCkKKwkgKiBPY3RldHMgTjMtTjQ6IEJsb2NrLWFsaWduZWQgZW5jcnlwdGVkIGZpbGVuYW1lCisJICogIC0gQ29uc2lzdHMgb2YgYSBtaW5pbXVtIG51bWJlciBvZiByYW5kb20gbnVtYmVycywgYSBcMAorCSAqICAgIHNlcGFyYXRvciwgYW5kIHRoZW4gdGhlIGZpbGVuYW1lICovCisJaWYgKGRhdGFbKCpwYWNrZXRfc2l6ZSkrK10gIT0gRUNSWVBURlNfVEFHXzcwX1BBQ0tFVF9UWVBFKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBJbnZhbGlkIHBhY2tldCB0YWcgWzB4JS4yeF07IG11c3QgYmUgIgorCQkgICAgICAgInRhZyBbMHglLjJ4XVxuIiwgX19mdW5jX18sCisJCSAgICAgICBkYXRhWygoKnBhY2tldF9zaXplKSAtIDEpXSwgRUNSWVBURlNfVEFHXzcwX1BBQ0tFVF9UWVBFKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJcmMgPSBlY3J5cHRmc19wYXJzZV9wYWNrZXRfbGVuZ3RoKCZkYXRhWygqcGFja2V0X3NpemUpXSwKKwkJCQkJICAmcy0+cGFyc2VkX3RhZ183MF9wYWNrZXRfc2l6ZSwKKwkJCQkJICAmcy0+cGFja2V0X3NpemVfbGVuKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEVycm9yIHBhcnNpbmcgcGFja2V0IGxlbmd0aDsgIgorCQkgICAgICAgInJjID0gWyVkXVxuIiwgX19mdW5jX18sIHJjKTsKKwkJZ290byBvdXQ7CisJfQorCXMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSA9IChzLT5wYXJzZWRfdGFnXzcwX3BhY2tldF9zaXplCisJCQkJCSAgLSBFQ1JZUFRGU19TSUdfU0laRSAtIDEpOworCWlmICgoMSArIHMtPnBhY2tldF9zaXplX2xlbiArIHMtPnBhcnNlZF90YWdfNzBfcGFja2V0X3NpemUpCisJICAgID4gbWF4X3BhY2tldF9zaXplKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBtYXhfcGFja2V0X3NpemUgaXMgWyV6ZF07IHJlYWwgcGFja2V0ICIKKwkJICAgICAgICJzaXplIGlzIFslemRdXG4iLCBfX2Z1bmNfXywgbWF4X3BhY2tldF9zaXplLAorCQkgICAgICAgKDEgKyBzLT5wYWNrZXRfc2l6ZV9sZW4gKyAxCisJCQkrIHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSkpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwkoKnBhY2tldF9zaXplKSArPSBzLT5wYWNrZXRfc2l6ZV9sZW47CisJZWNyeXB0ZnNfdG9faGV4KHMtPmZuZWtfc2lnX2hleCwgJmRhdGFbKCpwYWNrZXRfc2l6ZSldLAorCQkJRUNSWVBURlNfU0lHX1NJWkUpOworCXMtPmZuZWtfc2lnX2hleFtFQ1JZUFRGU19TSUdfU0laRV9IRVhdID0gJ1wwJzsKKwkoKnBhY2tldF9zaXplKSArPSBFQ1JZUFRGU19TSUdfU0laRTsKKwlzLT5jaXBoZXJfY29kZSA9IGRhdGFbKCpwYWNrZXRfc2l6ZSkrK107CisJcmMgPSBlY3J5cHRmc19jaXBoZXJfY29kZV90b19zdHJpbmcocy0+Y2lwaGVyX3N0cmluZywgcy0+Y2lwaGVyX2NvZGUpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ2lwaGVyIGNvZGUgWyVkXSBpcyBpbnZhbGlkXG4iLAorCQkgICAgICAgX19mdW5jX18sIHMtPmNpcGhlcl9jb2RlKTsKKwkJZ290byBvdXQ7CisJfQorCXJjID0gZWNyeXB0ZnNfZ2V0X3RmbV9hbmRfbXV0ZXhfZm9yX2NpcGhlcl9uYW1lKCZzLT5kZXNjLnRmbSwKKwkJCQkJCQkmcy0+dGZtX211dGV4LAorCQkJCQkJCXMtPmNpcGhlcl9zdHJpbmcpOworCWlmICh1bmxpa2VseShyYykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJJbnRlcm5hbCBlcnJvciB3aGlsc3QgYXR0ZW1wdGluZyB0byBnZXQgIgorCQkgICAgICAgInRmbSBhbmQgbXV0ZXggZm9yIGNpcGhlciBuYW1lIFslc107IHJjID0gWyVkXVxuIiwKKwkJICAgICAgIHMtPmNpcGhlcl9zdHJpbmcsIHJjKTsKKwkJZ290byBvdXQ7CisJfQorCW11dGV4X2xvY2socy0+dGZtX211dGV4KTsKKwlyYyA9IHZpcnRfdG9fc2NhdHRlcmxpc3QoJmRhdGFbKCpwYWNrZXRfc2l6ZSldLAorCQkJCSBzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUsICZzLT5zcmNfc2csIDEpOworCWlmIChyYyAhPSAxKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEludGVybmFsIGVycm9yIHdoaWxzdCBhdHRlbXB0aW5nIHRvICIKKwkJICAgICAgICJjb252ZXJ0IGVuY3J5cHRlZCBmaWxlbmFtZSBtZW1vcnkgdG8gc2NhdHRlcmxpc3Q7ICIKKwkJICAgICAgICJleHBlY3RlZCByYyA9IDE7IGdvdCByYyA9IFslZF0uICIKKwkJICAgICAgICJibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUgPSBbJXpkXVxuIiwgX19mdW5jX18sIHJjLAorCQkgICAgICAgcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwkoKnBhY2tldF9zaXplKSArPSBzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemU7CisJcy0+ZGVjcnlwdGVkX2ZpbGVuYW1lID0ga21hbGxvYyhzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUsCisJCQkJCUdGUF9LRVJORUwpOworCWlmICghcy0+ZGVjcnlwdGVkX2ZpbGVuYW1lKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IE91dCBvZiBtZW1vcnkgd2hpbHN0IGF0dGVtcHRpbmcgdG8gIgorCQkgICAgICAgImttYWxsb2MgWyV6ZF0gYnl0ZXNcbiIsIF9fZnVuY19fLAorCQkgICAgICAgcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCXJjID0gdmlydF90b19zY2F0dGVybGlzdChzLT5kZWNyeXB0ZWRfZmlsZW5hbWUsCisJCQkJIHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSwgJnMtPmRzdF9zZywgMSk7CisJaWYgKHJjICE9IDEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSW50ZXJuYWwgZXJyb3Igd2hpbHN0IGF0dGVtcHRpbmcgdG8gIgorCQkgICAgICAgImNvbnZlcnQgZGVjcnlwdGVkIGZpbGVuYW1lIG1lbW9yeSB0byBzY2F0dGVybGlzdDsgIgorCQkgICAgICAgImV4cGVjdGVkIHJjID0gMTsgZ290IHJjID0gWyVkXS4gIgorCQkgICAgICAgImJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSA9IFslemRdXG4iLCBfX2Z1bmNfXywgcmMsCisJCSAgICAgICBzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUpOworCQlnb3RvIG91dF9mcmVlX3VubG9jazsKKwl9CisJLyogVGhlIGNoYXJhY3RlcnMgaW4gdGhlIGZpcnN0IGJsb2NrIGVmZmVjdGl2ZWx5IGRvIHRoZSBqb2Igb2YKKwkgKiB0aGUgSVYgaGVyZSwgc28gd2UganVzdCB1c2UgMCdzIGZvciB0aGUgSVYuIE5vdGUgdGhlCisJICogY29uc3RyYWludCB0aGF0IEVDUllQVEZTX0ZJTEVOQU1FX01JTl9SQU5ET01fUFJFUEVORF9CWVRFUworCSAqID49IEVDUllQVEZTX01BWF9JVl9CWVRFUy4gKi8KKwltZW1zZXQocy0+aXYsIDAsIEVDUllQVEZTX01BWF9JVl9CWVRFUyk7CisJcy0+ZGVzYy5pbmZvID0gcy0+aXY7CisJcmMgPSBlY3J5cHRmc19maW5kX2F1dGhfdG9rX2Zvcl9zaWcoJnMtPmF1dGhfdG9rLCBtb3VudF9jcnlwdF9zdGF0LAorCQkJCQkgICAgcy0+Zm5la19zaWdfaGV4KTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgYXR0ZW1wdGluZyB0byBmaW5kIGF1dGggdG9rIGZvciAiCisJCSAgICAgICAiZm5layBzaWcgWyVzXTsgcmMgPSBbJWRdXG4iLCBfX2Z1bmNfXywgcy0+Zm5la19zaWdfaGV4LAorCQkgICAgICAgcmMpOworCQlnb3RvIG91dF9mcmVlX3VubG9jazsKKwl9CisJLyogVE9ETzogU3VwcG9ydCBvdGhlciBrZXkgbW9kdWxlcyB0aGFuIHBhc3NwaHJhc2UgZm9yCisJICogZmlsZW5hbWUgZW5jcnlwdGlvbiAqLworCUJVR19PTihzLT5hdXRoX3Rvay0+dG9rZW5fdHlwZSAhPSBFQ1JZUFRGU19QQVNTV09SRCk7CisJcmMgPSBjcnlwdG9fYmxrY2lwaGVyX3NldGtleSgKKwkJcy0+ZGVzYy50Zm0sCisJCXMtPmF1dGhfdG9rLT50b2tlbi5wYXNzd29yZC5zZXNzaW9uX2tleV9lbmNyeXB0aW9uX2tleSwKKwkJbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX2tleV9ieXRlcyk7CisJaWYgKHJjIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciBzZXR0aW5nIGtleSBmb3IgY3J5cHRvIGNvbnRleHQ7ICIKKwkJICAgICAgICJyYyA9IFslZF0uIHMtPmF1dGhfdG9rLT50b2tlbi5wYXNzd29yZC5zZXNzaW9uX2tleV8iCisJCSAgICAgICAiZW5jcnlwdGlvbl9rZXkgPSBbMHglcF07IG1vdW50X2NyeXB0X3N0YXQtPiIKKwkJICAgICAgICJnbG9iYWxfZGVmYXVsdF9mbl9jaXBoZXJfa2V5X2J5dGVzID0gWyV6ZF1cbiIsIF9fZnVuY19fLAorCQkgICAgICAgcmMsCisJCSAgICAgICBzLT5hdXRoX3Rvay0+dG9rZW4ucGFzc3dvcmQuc2Vzc2lvbl9rZXlfZW5jcnlwdGlvbl9rZXksCisJCSAgICAgICBtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9mbl9jaXBoZXJfa2V5X2J5dGVzKTsKKwkJZ290byBvdXRfZnJlZV91bmxvY2s7CisJfQorCXJjID0gY3J5cHRvX2Jsa2NpcGhlcl9kZWNyeXB0X2l2KCZzLT5kZXNjLCAmcy0+ZHN0X3NnLCAmcy0+c3JjX3NnLAorCQkJCQkgcy0+YmxvY2tfYWxpZ25lZF9maWxlbmFtZV9zaXplKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgYXR0ZW1wdGluZyB0byBkZWNyeXB0IGZpbGVuYW1lOyAiCisJCSAgICAgICAicmMgPSBbJWRdXG4iLCBfX2Z1bmNfXywgcmMpOworCQlnb3RvIG91dF9mcmVlX3VubG9jazsKKwl9CisJcy0+aSA9IDA7CisJd2hpbGUgKHMtPmRlY3J5cHRlZF9maWxlbmFtZVtzLT5pXSAhPSAnXDAnCisJICAgICAgICYmIHMtPmkgPCBzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUpCisJCXMtPmkrKzsKKwlpZiAocy0+aSA9PSBzLT5ibG9ja19hbGlnbmVkX2ZpbGVuYW1lX3NpemUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEludmFsaWQgdGFnIDcwIHBhY2tldDsgY291bGQgbm90ICIKKwkJICAgICAgICJmaW5kIHZhbGlkIHNlcGFyYXRvciBiZXR3ZWVuIHJhbmRvbSBjaGFyYWN0ZXJzIGFuZCAiCisJCSAgICAgICAidGhlIGZpbGVuYW1lXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBvdXRfZnJlZV91bmxvY2s7CisJfQorCXMtPmkrKzsKKwkoKmZpbGVuYW1lX3NpemUpID0gKHMtPmJsb2NrX2FsaWduZWRfZmlsZW5hbWVfc2l6ZSAtIHMtPmkpOworCWlmICghKCgqZmlsZW5hbWVfc2l6ZSkgPiAwICYmICgqZmlsZW5hbWVfc2l6ZSA8IFBBVEhfTUFYKSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEZpbGVuYW1lIHNpemUgaXMgWyV6ZF0sIHdoaWNoIGlzICIKKwkJICAgICAgICJpbnZhbGlkXG4iLCBfX2Z1bmNfXywgKCpmaWxlbmFtZV9zaXplKSk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBvdXRfZnJlZV91bmxvY2s7CisJfQorCSgqZmlsZW5hbWUpID0ga21hbGxvYygoKCpmaWxlbmFtZV9zaXplKSArIDEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoISgqZmlsZW5hbWUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IE91dCBvZiBtZW1vcnkgd2hpbHN0IGF0dGVtcHRpbmcgdG8gIgorCQkgICAgICAgImttYWxsb2MgWyV6ZF0gYnl0ZXNcbiIsIF9fZnVuY19fLAorCQkgICAgICAgKCgqZmlsZW5hbWVfc2l6ZSkgKyAxKSk7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBvdXRfZnJlZV91bmxvY2s7CisJfQorCW1lbWNweSgoKmZpbGVuYW1lKSwgJnMtPmRlY3J5cHRlZF9maWxlbmFtZVtzLT5pXSwgKCpmaWxlbmFtZV9zaXplKSk7CisJKCpmaWxlbmFtZSlbKCpmaWxlbmFtZV9zaXplKV0gPSAnXDAnOworb3V0X2ZyZWVfdW5sb2NrOgorCWtmcmVlKHMtPmRlY3J5cHRlZF9maWxlbmFtZSk7CitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jayhzLT50Zm1fbXV0ZXgpOworb3V0OgorCWlmIChyYykgeworCQkoKnBhY2tldF9zaXplKSA9IDA7CisJCSgqZmlsZW5hbWVfc2l6ZSkgPSAwOworCQkoKmZpbGVuYW1lKSA9IE5VTEw7CisJfQorCWtmcmVlKHMpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludAogZWNyeXB0ZnNfZ2V0X2F1dGhfdG9rX3NpZyhjaGFyICoqc2lnLCBzdHJ1Y3QgZWNyeXB0ZnNfYXV0aF90b2sgKmF1dGhfdG9rKQogewogCWludCByYyA9IDA7CkBAIC04OTcsMzAgKzE0NzEsNiBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludAotZWNyeXB0ZnNfZmluZF9nbG9iYWxfYXV0aF90b2tfZm9yX3NpZygKLQlzdHJ1Y3QgZWNyeXB0ZnNfZ2xvYmFsX2F1dGhfdG9rICoqZ2xvYmFsX2F1dGhfdG9rLAotCXN0cnVjdCBlY3J5cHRmc19tb3VudF9jcnlwdF9zdGF0ICptb3VudF9jcnlwdF9zdGF0LCBjaGFyICpzaWcpCi17Ci0Jc3RydWN0IGVjcnlwdGZzX2dsb2JhbF9hdXRoX3RvayAqd2Fsa2VyOwotCWludCByYyA9IDA7Ci0KLQkoKmdsb2JhbF9hdXRoX3RvaykgPSBOVUxMOwotCW11dGV4X2xvY2soJm1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9hdXRoX3Rva19saXN0X211dGV4KTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHdhbGtlciwKLQkJCSAgICAmbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2F1dGhfdG9rX2xpc3QsCi0JCQkgICAgbW91bnRfY3J5cHRfc3RhdF9saXN0KSB7Ci0JCWlmIChtZW1jbXAod2Fsa2VyLT5zaWcsIHNpZywgRUNSWVBURlNfU0lHX1NJWkVfSEVYKSA9PSAwKSB7Ci0JCQkoKmdsb2JhbF9hdXRoX3RvaykgPSB3YWxrZXI7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQlyYyA9IC1FSU5WQUw7Ci1vdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfYXV0aF90b2tfbGlzdF9tdXRleCk7Ci0JcmV0dXJuIHJjOwotfQotCiAvKioKICAqIGVjcnlwdGZzX3ZlcmlmeV92ZXJzaW9uCiAgKiBAdmVyc2lvbjogVGhlIHZlcnNpb24gbnVtYmVyIHRvIGNvbmZpcm0KQEAgLTk5MCw0MyArMTU0MCw2IEBACiB9CiAKIC8qKgotICogZWNyeXB0ZnNfZmluZF9hdXRoX3Rva19mb3Jfc2lnCi0gKiBAYXV0aF90b2s6IFNldCB0byB0aGUgbWF0Y2hpbmcgYXV0aF90b2s7IE5VTEwgaWYgbm90IGZvdW5kCi0gKiBAY3J5cHRfc3RhdDogaW5vZGUgY3J5cHRfc3RhdCBjcnlwdG8gY29udGV4dAotICogQHNpZzogU2lnIG9mIGF1dGhfdG9rIHRvIGZpbmQKLSAqCi0gKiBGb3Igbm93LCB0aGlzIGZ1bmN0aW9uIHNpbXBseSBsb29rcyBhdCB0aGUgcmVnaXN0ZXJlZCBhdXRoX3RvaydzCi0gKiBsaW5rZWQgb2ZmIHRoZSBtb3VudF9jcnlwdF9zdGF0LCBzbyBhbGwgdGhlIGF1dGhfdG9rcyB0aGF0IGNhbiBiZQotICogdXNlZCBtdXN0IGJlIHJlZ2lzdGVyZWQgYXQgbW91bnQgdGltZS4gVGhpcyBmdW5jdGlvbiBjb3VsZAotICogcG90ZW50aWFsbHkgdHJ5IGEgbG90IGhhcmRlciB0byBmaW5kIGF1dGhfdG9rJ3MgKGUuZy4sIGJ5IGNhbGxpbmcKLSAqIG91dCB0byBlY3J5cHRmc2QgdG8gZHluYW1pY2FsbHkgcmV0cmlldmUgYW4gYXV0aF90b2sgb2JqZWN0KSBzbwotICogdGhhdCBzdGF0aWMgcmVnaXN0cmF0aW9uIG9mIGF1dGhfdG9rJ3Mgd2lsbCBubyBsb25nZXIgYmUgbmVjZXNzYXJ5LgotICoKLSAqIFJldHVybnMgemVybyBvbiBubyBlcnJvcjsgbm9uLXplcm8gb24gZXJyb3IKLSAqLwotc3RhdGljIGludAotZWNyeXB0ZnNfZmluZF9hdXRoX3Rva19mb3Jfc2lnKAotCXN0cnVjdCBlY3J5cHRmc19hdXRoX3RvayAqKmF1dGhfdG9rLAotCXN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0LCBjaGFyICpzaWcpCi17Ci0Jc3RydWN0IGVjcnlwdGZzX21vdW50X2NyeXB0X3N0YXQgKm1vdW50X2NyeXB0X3N0YXQgPQotCQljcnlwdF9zdGF0LT5tb3VudF9jcnlwdF9zdGF0OwotCXN0cnVjdCBlY3J5cHRmc19nbG9iYWxfYXV0aF90b2sgKmdsb2JhbF9hdXRoX3RvazsKLQlpbnQgcmMgPSAwOwotCi0JKCphdXRoX3RvaykgPSBOVUxMOwotCWlmIChlY3J5cHRmc19maW5kX2dsb2JhbF9hdXRoX3Rva19mb3Jfc2lnKCZnbG9iYWxfYXV0aF90b2ssCi0JCQkJCQkgIG1vdW50X2NyeXB0X3N0YXQsIHNpZykpIHsKLQkJc3RydWN0IGtleSAqYXV0aF90b2tfa2V5OwotCi0JCXJjID0gZWNyeXB0ZnNfa2V5cmluZ19hdXRoX3Rva19mb3Jfc2lnKCZhdXRoX3Rva19rZXksIGF1dGhfdG9rLAotCQkJCQkJICAgICAgIHNpZyk7Ci0JfSBlbHNlCi0JCSgqYXV0aF90b2spID0gZ2xvYmFsX2F1dGhfdG9rLT5nbG9iYWxfYXV0aF90b2s7Ci0JcmV0dXJuIHJjOwotfQotCi0vKioKICAqIGRlY3J5cHRfcGFzc3BocmFzZV9lbmNyeXB0ZWRfc2Vzc2lvbl9rZXkgLSBEZWNyeXB0IHRoZSBzZXNzaW9uIGtleSB3aXRoIHRoZSBnaXZlbiBhdXRoX3Rvay4KICAqIEBhdXRoX3RvazogVGhlIHBhc3NwaHJhc2UgYXV0aGVudGljYXRpb24gdG9rZW4gdG8gdXNlIHRvIGVuY3J5cHQgdGhlIEZFSwogICogQGNyeXB0X3N0YXQ6IFRoZSBjcnlwdG9ncmFwaGljIGNvbnRleHQKQEAgLTEyNTYsNyArMTc2OSw4IEBACiAJCQlyYyA9IC1FSU5WQUw7CiAJCQlnb3RvIG91dF93aXBlX2xpc3Q7CiAJCX0KLQkJZWNyeXB0ZnNfZmluZF9hdXRoX3Rva19mb3Jfc2lnKCZtYXRjaGluZ19hdXRoX3RvaywgY3J5cHRfc3RhdCwKKwkJZWNyeXB0ZnNfZmluZF9hdXRoX3Rva19mb3Jfc2lnKCZtYXRjaGluZ19hdXRoX3RvaywKKwkJCQkJICAgICAgIGNyeXB0X3N0YXQtPm1vdW50X2NyeXB0X3N0YXQsCiAJCQkJCSAgICAgICBjYW5kaWRhdGVfYXV0aF90b2tfc2lnKTsKIAkJaWYgKG1hdGNoaW5nX2F1dGhfdG9rKSB7CiAJCQlmb3VuZF9hdXRoX3RvayA9IDE7CkBAIC0xMzM2LDcgKzE4NTAsOSBAQAogCWludCByYzsKIAogCXJjID0gd3JpdGVfdGFnXzY2X3BhY2tldChhdXRoX3Rvay0+dG9rZW4ucHJpdmF0ZV9rZXkuc2lnbmF0dXJlLAotCQkJCSBlY3J5cHRmc19jb2RlX2Zvcl9jaXBoZXJfc3RyaW5nKGNyeXB0X3N0YXQpLAorCQkJCSBlY3J5cHRmc19jb2RlX2Zvcl9jaXBoZXJfc3RyaW5nKAorCQkJCQkgY3J5cHRfc3RhdC0+Y2lwaGVyLAorCQkJCQkgY3J5cHRfc3RhdC0+a2V5X3NpemUpLAogCQkJCSBjcnlwdF9zdGF0LCAmcGF5bG9hZCwgJnBheWxvYWRfbGVuKTsKIAlpZiAocmMpIHsKIAkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fRVJSLCAiRXJyb3IgZ2VuZXJhdGluZyB0YWcgNjYgcGFja2V0XG4iKTsKQEAgLTE2OTYsNyArMjIxMiw4IEBACiAJZGVzdFsoKnBhY2tldF9zaXplKSsrXSA9IDB4MDQ7IC8qIHZlcnNpb24gNCAqLwogCS8qIFRPRE86IEJyZWFrIGZyb20gUkZDMjQ0MCBzbyB0aGF0IGFyYml0cmFyeSBjaXBoZXJzIGNhbiBiZQogCSAqIHNwZWNpZmllZCB3aXRoIHN0cmluZ3MgKi8KLQljaXBoZXJfY29kZSA9IGVjcnlwdGZzX2NvZGVfZm9yX2NpcGhlcl9zdHJpbmcoY3J5cHRfc3RhdCk7CisJY2lwaGVyX2NvZGUgPSBlY3J5cHRmc19jb2RlX2Zvcl9jaXBoZXJfc3RyaW5nKGNyeXB0X3N0YXQtPmNpcGhlciwKKwkJCQkJCSAgICAgIGNyeXB0X3N0YXQtPmtleV9zaXplKTsKIAlpZiAoY2lwaGVyX2NvZGUgPT0gMCkgewogCQllY3J5cHRmc19wcmludGsoS0VSTl9XQVJOSU5HLCAiVW5hYmxlIHRvIGdlbmVyYXRlIGNvZGUgZm9yICIKIAkJCQkiY2lwaGVyIFslc11cbiIsIGNyeXB0X3N0YXQtPmNpcGhlcik7CmRpZmYgLS1naXQgYS9mcy9lY3J5cHRmcy9tYWluLmMgYi9mcy9lY3J5cHRmcy9tYWluLmMKaW5kZXggZmQ2MzA3MS4uNzg5Y2YyZSAxMDA2NDQKLS0tIGEvZnMvZWNyeXB0ZnMvbWFpbi5jCisrKyBiL2ZzL2VjcnlwdGZzL21haW4uYwpAQCAtMjA2LDcgKzIwNiw5IEBACiAgICAgICAgZWNyeXB0ZnNfb3B0X2NpcGhlciwgZWNyeXB0ZnNfb3B0X2VjcnlwdGZzX2NpcGhlciwKICAgICAgICBlY3J5cHRmc19vcHRfZWNyeXB0ZnNfa2V5X2J5dGVzLAogICAgICAgIGVjcnlwdGZzX29wdF9wYXNzdGhyb3VnaCwgZWNyeXB0ZnNfb3B0X3hhdHRyX21ldGFkYXRhLAotICAgICAgIGVjcnlwdGZzX29wdF9lbmNyeXB0ZWRfdmlldywgZWNyeXB0ZnNfb3B0X2VyciB9OworICAgICAgIGVjcnlwdGZzX29wdF9lbmNyeXB0ZWRfdmlldywgZWNyeXB0ZnNfb3B0X2ZuZWtfc2lnLAorICAgICAgIGVjcnlwdGZzX29wdF9mbl9jaXBoZXIsIGVjcnlwdGZzX29wdF9mbl9jaXBoZXJfa2V5X2J5dGVzLAorICAgICAgIGVjcnlwdGZzX29wdF9lcnIgfTsKIAogc3RhdGljIGNvbnN0IG1hdGNoX3RhYmxlX3QgdG9rZW5zID0gewogCXtlY3J5cHRmc19vcHRfc2lnLCAic2lnPSVzIn0sCkBAIC0yMTcsNiArMjE5LDkgQEAKIAl7ZWNyeXB0ZnNfb3B0X3Bhc3N0aHJvdWdoLCAiZWNyeXB0ZnNfcGFzc3Rocm91Z2gifSwKIAl7ZWNyeXB0ZnNfb3B0X3hhdHRyX21ldGFkYXRhLCAiZWNyeXB0ZnNfeGF0dHJfbWV0YWRhdGEifSwKIAl7ZWNyeXB0ZnNfb3B0X2VuY3J5cHRlZF92aWV3LCAiZWNyeXB0ZnNfZW5jcnlwdGVkX3ZpZXcifSwKKwl7ZWNyeXB0ZnNfb3B0X2ZuZWtfc2lnLCAiZWNyeXB0ZnNfZm5la19zaWc9JXMifSwKKwl7ZWNyeXB0ZnNfb3B0X2ZuX2NpcGhlciwgImVjcnlwdGZzX2ZuX2NpcGhlcj0lcyJ9LAorCXtlY3J5cHRmc19vcHRfZm5fY2lwaGVyX2tleV9ieXRlcywgImVjcnlwdGZzX2ZuX2tleV9ieXRlcz0ldSJ9LAogCXtlY3J5cHRmc19vcHRfZXJyLCBOVUxMfQogfTsKIApAQCAtMjgxLDggKzI4NiwxMSBAQAogCWludCByYyA9IDA7CiAJaW50IHNpZ19zZXQgPSAwOwogCWludCBjaXBoZXJfbmFtZV9zZXQgPSAwOworCWludCBmbl9jaXBoZXJfbmFtZV9zZXQgPSAwOwogCWludCBjaXBoZXJfa2V5X2J5dGVzOwogCWludCBjaXBoZXJfa2V5X2J5dGVzX3NldCA9IDA7CisJaW50IGZuX2NpcGhlcl9rZXlfYnl0ZXM7CisJaW50IGZuX2NpcGhlcl9rZXlfYnl0ZXNfc2V0ID0gMDsKIAlzdHJ1Y3QgZWNyeXB0ZnNfbW91bnRfY3J5cHRfc3RhdCAqbW91bnRfY3J5cHRfc3RhdCA9CiAJCSZlY3J5cHRmc19zdXBlcmJsb2NrX3RvX3ByaXZhdGUoc2IpLT5tb3VudF9jcnlwdF9zdGF0OwogCXN1YnN0cmluZ190IGFyZ3NbTUFYX09QVF9BUkdTXTsKQEAgLTI5MCw3ICsyOTgsMTIgQEAKIAljaGFyICpzaWdfc3JjOwogCWNoYXIgKmNpcGhlcl9uYW1lX2RzdDsKIAljaGFyICpjaXBoZXJfbmFtZV9zcmM7CisJY2hhciAqZm5fY2lwaGVyX25hbWVfZHN0OworCWNoYXIgKmZuX2NpcGhlcl9uYW1lX3NyYzsKKwljaGFyICpmbmVrX2RzdDsKKwljaGFyICpmbmVrX3NyYzsKIAljaGFyICpjaXBoZXJfa2V5X2J5dGVzX3NyYzsKKwljaGFyICpmbl9jaXBoZXJfa2V5X2J5dGVzX3NyYzsKIAogCWlmICghb3B0aW9ucykgewogCQlyYyA9IC1FSU5WQUw7CkBAIC0zMjIsMTAgKzMzNSw3IEBACiAJCQkJZ2xvYmFsX2RlZmF1bHRfY2lwaGVyX25hbWU7CiAJCQlzdHJuY3B5KGNpcGhlcl9uYW1lX2RzdCwgY2lwaGVyX25hbWVfc3JjLAogCQkJCUVDUllQVEZTX01BWF9DSVBIRVJfTkFNRV9TSVpFKTsKLQkJCWVjcnlwdGZzX3ByaW50ayhLRVJOX0RFQlVHLAotCQkJCQkiVGhlIG1vdW50X2NyeXB0X3N0YXQgIgotCQkJCQkiZ2xvYmFsX2RlZmF1bHRfY2lwaGVyX25hbWUgc2V0IHRvOiAiCi0JCQkJCSJbJXNdXG4iLCBjaXBoZXJfbmFtZV9kc3QpOworCQkJY2lwaGVyX25hbWVfZHN0W0VDUllQVEZTX01BWF9DSVBIRVJfTkFNRV9TSVpFXSA9ICdcMCc7CiAJCQljaXBoZXJfbmFtZV9zZXQgPSAxOwogCQkJYnJlYWs7CiAJCWNhc2UgZWNyeXB0ZnNfb3B0X2VjcnlwdGZzX2tleV9ieXRlczoKQEAgLTMzNSwxMSArMzQ1LDYgQEAKIAkJCQkJCSAgICZjaXBoZXJfa2V5X2J5dGVzX3NyYywgMCk7CiAJCQltb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9jaXBoZXJfa2V5X3NpemUgPQogCQkJCWNpcGhlcl9rZXlfYnl0ZXM7Ci0JCQllY3J5cHRmc19wcmludGsoS0VSTl9ERUJVRywKLQkJCQkJIlRoZSBtb3VudF9jcnlwdF9zdGF0ICIKLQkJCQkJImdsb2JhbF9kZWZhdWx0X2NpcGhlcl9rZXlfc2l6ZSAiCi0JCQkJCSJzZXQgdG86IFslZF1cbiIsIG1vdW50X2NyeXB0X3N0YXQtPgotCQkJCQlnbG9iYWxfZGVmYXVsdF9jaXBoZXJfa2V5X3NpemUpOwogCQkJY2lwaGVyX2tleV9ieXRlc19zZXQgPSAxOwogCQkJYnJlYWs7CiAJCWNhc2UgZWNyeXB0ZnNfb3B0X3Bhc3N0aHJvdWdoOgpAQCAtMzU2LDExICszNjEsNTEgQEAKIAkJCW1vdW50X2NyeXB0X3N0YXQtPmZsYWdzIHw9CiAJCQkJRUNSWVBURlNfRU5DUllQVEVEX1ZJRVdfRU5BQkxFRDsKIAkJCWJyZWFrOworCQljYXNlIGVjcnlwdGZzX29wdF9mbmVrX3NpZzoKKwkJCWZuZWtfc3JjID0gYXJnc1swXS5mcm9tOworCQkJZm5la19kc3QgPQorCQkJCW1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2ZuZWtfc2lnOworCQkJc3RybmNweShmbmVrX2RzdCwgZm5la19zcmMsIEVDUllQVEZTX1NJR19TSVpFX0hFWCk7CisJCQltb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9mbmVrX3NpZ1sKKwkJCQlFQ1JZUFRGU19TSUdfU0laRV9IRVhdID0gJ1wwJzsKKwkJCXJjID0gZWNyeXB0ZnNfYWRkX2dsb2JhbF9hdXRoX3RvaygKKwkJCQltb3VudF9jcnlwdF9zdGF0LAorCQkJCW1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2ZuZWtfc2lnKTsKKwkJCWlmIChyYykgeworCQkJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgYXR0ZW1wdGluZyB0byByZWdpc3RlciAiCisJCQkJICAgICAgICJnbG9iYWwgZm5layBzaWcgWyVzXTsgcmMgPSBbJWRdXG4iLAorCQkJCSAgICAgICBtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9mbmVrX3NpZywKKwkJCQkgICAgICAgcmMpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJbW91bnRfY3J5cHRfc3RhdC0+ZmxhZ3MgfD0KKwkJCQkoRUNSWVBURlNfR0xPQkFMX0VOQ1JZUFRfRklMRU5BTUVTCisJCQkJIHwgRUNSWVBURlNfR0xPQkFMX0VOQ0ZOX1VTRV9NT1VOVF9GTkVLKTsKKwkJCWJyZWFrOworCQljYXNlIGVjcnlwdGZzX29wdF9mbl9jaXBoZXI6CisJCQlmbl9jaXBoZXJfbmFtZV9zcmMgPSBhcmdzWzBdLmZyb207CisJCQlmbl9jaXBoZXJfbmFtZV9kc3QgPQorCQkJCW1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2ZuX2NpcGhlcl9uYW1lOworCQkJc3RybmNweShmbl9jaXBoZXJfbmFtZV9kc3QsIGZuX2NpcGhlcl9uYW1lX3NyYywKKwkJCQlFQ1JZUFRGU19NQVhfQ0lQSEVSX05BTUVfU0laRSk7CisJCQltb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9mbl9jaXBoZXJfbmFtZVsKKwkJCQlFQ1JZUFRGU19NQVhfQ0lQSEVSX05BTUVfU0laRV0gPSAnXDAnOworCQkJZm5fY2lwaGVyX25hbWVfc2V0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlIGVjcnlwdGZzX29wdF9mbl9jaXBoZXJfa2V5X2J5dGVzOgorCQkJZm5fY2lwaGVyX2tleV9ieXRlc19zcmMgPSBhcmdzWzBdLmZyb207CisJCQlmbl9jaXBoZXJfa2V5X2J5dGVzID0KKwkJCQkoaW50KXNpbXBsZV9zdHJ0b2woZm5fY2lwaGVyX2tleV9ieXRlc19zcmMsCisJCQkJCQkgICAmZm5fY2lwaGVyX2tleV9ieXRlc19zcmMsIDApOworCQkJbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX2tleV9ieXRlcyA9CisJCQkJZm5fY2lwaGVyX2tleV9ieXRlczsKKwkJCWZuX2NpcGhlcl9rZXlfYnl0ZXNfc2V0ID0gMTsKKwkJCWJyZWFrOwogCQljYXNlIGVjcnlwdGZzX29wdF9lcnI6CiAJCWRlZmF1bHQ6Ci0JCQllY3J5cHRmc19wcmludGsoS0VSTl9XQVJOSU5HLAotCQkJCQkiZUNyeXB0ZnM6IHVucmVjb2duaXplZCBvcHRpb24gJyVzJ1xuIiwKLQkJCQkJcCk7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIiVzOiBlQ3J5cHRmczogdW5yZWNvZ25pemVkIG9wdGlvbiBbJXNdXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCBwKTsKIAkJfQogCX0KIAlpZiAoIXNpZ19zZXQpIHsKQEAgLTM3NCwzMyArNDE5LDYwIEBACiAJCWludCBjaXBoZXJfbmFtZV9sZW4gPSBzdHJsZW4oRUNSWVBURlNfREVGQVVMVF9DSVBIRVIpOwogCiAJCUJVR19PTihjaXBoZXJfbmFtZV9sZW4gPj0gRUNSWVBURlNfTUFYX0NJUEhFUl9OQU1FX1NJWkUpOwotCiAJCXN0cmNweShtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9jaXBoZXJfbmFtZSwKIAkJICAgICAgIEVDUllQVEZTX0RFRkFVTFRfQ0lQSEVSKTsKIAl9Ci0JaWYgKCFjaXBoZXJfa2V5X2J5dGVzX3NldCkgeworCWlmICgobW91bnRfY3J5cHRfc3RhdC0+ZmxhZ3MgJiBFQ1JZUFRGU19HTE9CQUxfRU5DUllQVF9GSUxFTkFNRVMpCisJICAgICYmICFmbl9jaXBoZXJfbmFtZV9zZXQpCisJCXN0cmNweShtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9mbl9jaXBoZXJfbmFtZSwKKwkJICAgICAgIG1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2NpcGhlcl9uYW1lKTsKKwlpZiAoIWNpcGhlcl9rZXlfYnl0ZXNfc2V0KQogCQltb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9jaXBoZXJfa2V5X3NpemUgPSAwOwotCX0KKwlpZiAoKG1vdW50X2NyeXB0X3N0YXQtPmZsYWdzICYgRUNSWVBURlNfR0xPQkFMX0VOQ1JZUFRfRklMRU5BTUVTKQorCSAgICAmJiAhZm5fY2lwaGVyX2tleV9ieXRlc19zZXQpCisJCW1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2ZuX2NpcGhlcl9rZXlfYnl0ZXMgPQorCQkJbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfY2lwaGVyX2tleV9zaXplOwogCW11dGV4X2xvY2soJmtleV90Zm1fbGlzdF9tdXRleCk7CiAJaWYgKCFlY3J5cHRmc190Zm1fZXhpc3RzKG1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2NpcGhlcl9uYW1lLAotCQkJCSBOVUxMKSkKKwkJCQkgTlVMTCkpIHsKIAkJcmMgPSBlY3J5cHRmc19hZGRfbmV3X2tleV90Zm0oCiAJCQlOVUxMLCBtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9jaXBoZXJfbmFtZSwKIAkJCW1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2NpcGhlcl9rZXlfc2l6ZSk7Ci0JbXV0ZXhfdW5sb2NrKCZrZXlfdGZtX2xpc3RfbXV0ZXgpOwotCWlmIChyYykgewotCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIGF0dGVtcHRpbmcgdG8gaW5pdGlhbGl6ZSBjaXBoZXIgd2l0aCAiCi0JCSAgICAgICAibmFtZSA9IFslc10gYW5kIGtleSBzaXplID0gWyV0ZF07IHJjID0gWyVkXVxuIiwKLQkJICAgICAgIG1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9kZWZhdWx0X2NpcGhlcl9uYW1lLAotCQkgICAgICAgbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfY2lwaGVyX2tleV9zaXplLCByYyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7CisJCWlmIChyYykgeworCQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciBhdHRlbXB0aW5nIHRvIGluaXRpYWxpemUgIgorCQkJICAgICAgICJjaXBoZXIgd2l0aCBuYW1lID0gWyVzXSBhbmQga2V5IHNpemUgPSBbJXRkXTsgIgorCQkJICAgICAgICJyYyA9IFslZF1cbiIsCisJCQkgICAgICAgbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfY2lwaGVyX25hbWUsCisJCQkgICAgICAgbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfY2lwaGVyX2tleV9zaXplLAorCQkJICAgICAgIHJjKTsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCW11dGV4X3VubG9jaygma2V5X3RmbV9saXN0X211dGV4KTsKKwkJCWdvdG8gb3V0OworCQl9CiAJfQorCWlmICgobW91bnRfY3J5cHRfc3RhdC0+ZmxhZ3MgJiBFQ1JZUFRGU19HTE9CQUxfRU5DUllQVF9GSUxFTkFNRVMpCisJICAgICYmICFlY3J5cHRmc190Zm1fZXhpc3RzKAorCQkgICAgbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX25hbWUsIE5VTEwpKSB7CisJCXJjID0gZWNyeXB0ZnNfYWRkX25ld19rZXlfdGZtKAorCQkJTlVMTCwgbW91bnRfY3J5cHRfc3RhdC0+Z2xvYmFsX2RlZmF1bHRfZm5fY2lwaGVyX25hbWUsCisJCQltb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9mbl9jaXBoZXJfa2V5X2J5dGVzKTsKKwkJaWYgKHJjKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIGF0dGVtcHRpbmcgdG8gaW5pdGlhbGl6ZSAiCisJCQkgICAgICAgImNpcGhlciB3aXRoIG5hbWUgPSBbJXNdIGFuZCBrZXkgc2l6ZSA9IFsldGRdOyAiCisJCQkgICAgICAgInJjID0gWyVkXVxuIiwKKwkJCSAgICAgICBtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9mbl9jaXBoZXJfbmFtZSwKKwkJCSAgICAgICBtb3VudF9jcnlwdF9zdGF0LT5nbG9iYWxfZGVmYXVsdF9mbl9jaXBoZXJfa2V5X2J5dGVzLAorCQkJICAgICAgIHJjKTsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCW11dGV4X3VubG9jaygma2V5X3RmbV9saXN0X211dGV4KTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCW11dGV4X3VubG9jaygma2V5X3RmbV9saXN0X211dGV4KTsKIAlyYyA9IGVjcnlwdGZzX2luaXRfZ2xvYmFsX2F1dGhfdG9rcyhtb3VudF9jcnlwdF9zdGF0KTsKLQlpZiAocmMpIHsKKwlpZiAocmMpCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIk9uZSBvciBtb3JlIGdsb2JhbCBhdXRoIHRva3MgY291bGQgbm90ICIKIAkJICAgICAgICJwcm9wZXJseSByZWdpc3RlcjsgcmMgPSBbJWRdXG4iLCByYyk7Ci0JfQogb3V0OgogCXJldHVybiByYzsKIH0KZGlmZiAtLWdpdCBhL2ZzL2VjcnlwdGZzL21lc3NhZ2luZy5jIGIvZnMvZWNyeXB0ZnMvbWVzc2FnaW5nLmMKaW5kZXggNjkxM2Y3Mi4uOTZlZjUxNCAxMDA2NDQKLS0tIGEvZnMvZWNyeXB0ZnMvbWVzc2FnaW5nLmMKKysrIGIvZnMvZWNyeXB0ZnMvbWVzc2FnaW5nLmMKQEAgLTE5Myw3ICsxOTMsNyBAQAogCSgqZGFlbW9uKSA9IGt6YWxsb2Moc2l6ZW9mKCoqZGFlbW9uKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCEoKmRhZW1vbikpIHsKIAkJcmMgPSAtRU5PTUVNOwotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgWyVaZF0gYnl0ZXMgb2YgIgorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgWyV6ZF0gYnl0ZXMgb2YgIgogCQkgICAgICAgIkdGUF9LRVJORUwgbWVtb3J5XG4iLCBfX2Z1bmNfXywgc2l6ZW9mKCoqZGFlbW9uKSk7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTQzNSw3ICs0MzUsNyBAQAogCW1zZ19jdHgtPm1zZyA9IGttYWxsb2MobXNnX3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghbXNnX2N0eC0+bXNnKSB7CiAJCXJjID0gLUVOT01FTTsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogRmFpbGVkIHRvIGFsbG9jYXRlIFslWmRdIGJ5dGVzIG9mICIKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRmFpbGVkIHRvIGFsbG9jYXRlIFslemRdIGJ5dGVzIG9mICIKIAkJICAgICAgICJHRlBfS0VSTkVMIG1lbW9yeVxuIiwgX19mdW5jX18sIG1zZ19zaXplKTsKIAkJZ290byB1bmxvY2s7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMvbWlzY2Rldi5jIGIvZnMvZWNyeXB0ZnMvbWlzY2Rldi5jCmluZGV4IGVmZDk1YTAuLmE2N2ZlYTYgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL21pc2NkZXYuYworKysgYi9mcy9lY3J5cHRmcy9taXNjZGV2LmMKQEAgLTE5OSw3ICsxOTksNyBAQAogCQlpZiAoIW1zZ19jdHgtPm1zZykgewogCQkJcmMgPSAtRU5PTUVNOwogCQkJcHJpbnRrKEtFUk5fRVJSICIlczogT3V0IG9mIG1lbW9yeSB3aGlsc3QgYXR0ZW1wdGluZyAiCi0JCQkgICAgICAgInRvIGttYWxsb2MoJVpkLCBHRlBfS0VSTkVMKVxuIiwgX19mdW5jX18sCisJCQkgICAgICAgInRvIGttYWxsb2MoJXpkLCBHRlBfS0VSTkVMKVxuIiwgX19mdW5jX18sCiAJCQkgICAgICAgKHNpemVvZigqbXNnX2N0eC0+bXNnKSArIGRhdGFfc2l6ZSkpOwogCQkJZ290byBvdXRfdW5sb2NrOwogCQl9CkBAIC0zMjIsNyArMzIyLDcgQEAKIAlpZiAoY291bnQgPCB0b3RhbF9sZW5ndGgpIHsKIAkJcmMgPSAwOwogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogT25seSBnaXZlbiB1c2VyIGJ1ZmZlciBvZiAiCi0JCSAgICAgICAic2l6ZSBbJVpkXSwgYnV0IHdlIG5lZWQgWyVaZF0gdG8gcmVhZCB0aGUgIgorCQkgICAgICAgInNpemUgWyV6ZF0sIGJ1dCB3ZSBuZWVkIFslemRdIHRvIHJlYWQgdGhlICIKIAkJICAgICAgICJwZW5kaW5nIG1lc3NhZ2VcbiIsIF9fZnVuY19fLCBjb3VudCwgdG90YWxfbGVuZ3RoKTsKIAkJZ290byBvdXRfdW5sb2NrX21zZ19jdHg7CiAJfQpAQCAtMzc2LDcgKzM3Niw3IEBACiAKIAlpZiAoKHNpemVvZigqbXNnKSArIG1zZy0+ZGF0YV9sZW4pICE9IGRhdGFfc2l6ZSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogKHNpemVvZigqbXNnKSArIG1zZy0+ZGF0YV9sZW4pID0gIgotCQkgICAgICAgIlslWmRdOyBkYXRhX3NpemUgPSBbJVpkXS4gSW52YWxpZCBwYWNrZXQuXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgICJbJXpkXTsgZGF0YV9zaXplID0gWyV6ZF0uIEludmFsaWQgcGFja2V0LlxuIiwgX19mdW5jX18sCiAJCSAgICAgICAoc2l6ZW9mKCptc2cpICsgbXNnLT5kYXRhX2xlbiksIGRhdGFfc2l6ZSk7CiAJCXJjID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CkBAIC00MjEsNyArNDIxLDcgQEAKIAlkYXRhID0ga21hbGxvYyhjb3VudCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkYXRhKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IE91dCBvZiBtZW1vcnkgd2hpbHN0IGF0dGVtcHRpbmcgdG8gIgotCQkgICAgICAgImttYWxsb2MoWyVaZF0sIEdGUF9LRVJORUwpXG4iLCBfX2Z1bmNfXywgY291bnQpOworCQkgICAgICAgImttYWxsb2MoWyV6ZF0sIEdGUF9LRVJORUwpXG4iLCBfX2Z1bmNfXywgY291bnQpOwogCQlnb3RvIG91dDsKIAl9CiAJcmMgPSBjb3B5X2Zyb21fdXNlcihkYXRhLCBidWYsIGNvdW50KTsKQEAgLTQzNiw4ICs0MzYsOCBAQAogCWNhc2UgRUNSWVBURlNfTVNHX1JFU1BPTlNFOgogCQlpZiAoY291bnQgPCAoMSArIDQgKyAxICsgc2l6ZW9mKHN0cnVjdCBlY3J5cHRmc19tZXNzYWdlKSkpIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBNaW5pbXVtIGFjY2VwdGFibGUgcGFja2V0ICIKLQkJCSAgICAgICAic2l6ZSBpcyBbJVpkXSwgYnV0IGFtb3VudCBvZiBkYXRhIHdyaXR0ZW4gaXMgIgotCQkJICAgICAgICJvbmx5IFslWmRdLiBEaXNjYXJkaW5nIHJlc3BvbnNlIHBhY2tldC5cbiIsCisJCQkgICAgICAgInNpemUgaXMgWyV6ZF0sIGJ1dCBhbW91bnQgb2YgZGF0YSB3cml0dGVuIGlzICIKKwkJCSAgICAgICAib25seSBbJXpkXS4gRGlzY2FyZGluZyByZXNwb25zZSBwYWNrZXQuXG4iLAogCQkJICAgICAgIF9fZnVuY19fLAogCQkJICAgICAgICgxICsgNCArIDEgKyBzaXplb2Yoc3RydWN0IGVjcnlwdGZzX21lc3NhZ2UpKSwKIAkJCSAgICAgICBjb3VudCk7CkBAIC00NTUsOSArNDU1LDkgQEAKIAkJfQogCQlpICs9IHBhY2tldF9zaXplX2xlbmd0aDsKIAkJaWYgKCgxICsgNCArIHBhY2tldF9zaXplX2xlbmd0aCArIHBhY2tldF9zaXplKSAhPSBjb3VudCkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6ICgxICsgcGFja2V0X3NpemVfbGVuZ3RoKFslWmRdKSIKLQkJCSAgICAgICAiICsgcGFja2V0X3NpemUoWyVaZF0pKShbJVpkXSkgIT0gIgotCQkJICAgICAgICJjb3VudChbJVpkXSkuIEludmFsaWQgcGFja2V0IGZvcm1hdC5cbiIsCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogKDEgKyBwYWNrZXRfc2l6ZV9sZW5ndGgoWyV6ZF0pIgorCQkJICAgICAgICIgKyBwYWNrZXRfc2l6ZShbJXpkXSkpKFslemRdKSAhPSAiCisJCQkgICAgICAgImNvdW50KFslemRdKS4gSW52YWxpZCBwYWNrZXQgZm9ybWF0LlxuIiwKIAkJCSAgICAgICBfX2Z1bmNfXywgcGFja2V0X3NpemVfbGVuZ3RoLCBwYWNrZXRfc2l6ZSwKIAkJCSAgICAgICAoMSArIHBhY2tldF9zaXplX2xlbmd0aCArIHBhY2tldF9zaXplKSwgY291bnQpOwogCQkJZ290byBvdXRfZnJlZTsKZGlmZiAtLWdpdCBhL2ZzL2V4ZWMuYyBiL2ZzL2V4ZWMuYwppbmRleCAzZWY5Y2Y5Li43MWE2ZWZlIDEwMDY0NAotLS0gYS9mcy9leGVjLmMKKysrIGIvZnMvZXhlYy5jCkBAIC01MSw2ICs1MSw3IEBACiAjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KICNpbmNsdWRlIDxsaW51eC90cmFjZWhvb2suaD4KICNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bGludXgvZnNub3RpZnkuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CkBAIC0xMzIsNiArMTMzLDggQEAKIAlpZiAoSVNfRVJSKGZpbGUpKQogCQlnb3RvIG91dDsKIAorCWZzbm90aWZ5X29wZW4oZmlsZS0+Zl9wYXRoLmRlbnRyeSk7CisKIAllcnJvciA9IC1FTk9FWEVDOwogCWlmKGZpbGUtPmZfb3ApIHsKIAkJc3RydWN0IGxpbnV4X2JpbmZtdCAqIGZtdDsKQEAgLTIyOSwxMyArMjMyLDEzIEBACiAKIHN0YXRpYyBpbnQgX19icHJtX21tX2luaXQoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSkKIHsKLQlpbnQgZXJyID0gLUVOT01FTTsKKwlpbnQgZXJyOwogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gTlVMTDsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGJwcm0tPm1tOwogCiAJYnBybS0+dm1hID0gdm1hID0ga21lbV9jYWNoZV96YWxsb2Modm1fYXJlYV9jYWNoZXAsIEdGUF9LRVJORUwpOwogCWlmICghdm1hKQotCQlnb3RvIGVycjsKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlkb3duX3dyaXRlKCZtbS0+bW1hcF9zZW0pOwogCXZtYS0+dm1fbW0gPSBtbTsKQEAgLTI0OCwyOCArMjUxLDIwIEBACiAJICovCiAJdm1hLT52bV9lbmQgPSBTVEFDS19UT1BfTUFYOwogCXZtYS0+dm1fc3RhcnQgPSB2bWEtPnZtX2VuZCAtIFBBR0VfU0laRTsKLQogCXZtYS0+dm1fZmxhZ3MgPSBWTV9TVEFDS19GTEFHUzsKIAl2bWEtPnZtX3BhZ2VfcHJvdCA9IHZtX2dldF9wYWdlX3Byb3Qodm1hLT52bV9mbGFncyk7CiAJZXJyID0gaW5zZXJ0X3ZtX3N0cnVjdChtbSwgdm1hKTsKLQlpZiAoZXJyKSB7Ci0JCXVwX3dyaXRlKCZtbS0+bW1hcF9zZW0pOworCWlmIChlcnIpCiAJCWdvdG8gZXJyOwotCX0KIAogCW1tLT5zdGFja192bSA9IG1tLT50b3RhbF92bSA9IDE7CiAJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7Ci0KIAlicHJtLT5wID0gdm1hLT52bV9lbmQgLSBzaXplb2Yodm9pZCAqKTsKLQogCXJldHVybiAwOwotCiBlcnI6Ci0JaWYgKHZtYSkgewotCQlicHJtLT52bWEgPSBOVUxMOwotCQlrbWVtX2NhY2hlX2ZyZWUodm1fYXJlYV9jYWNoZXAsIHZtYSk7Ci0JfQotCisJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisJYnBybS0+dm1hID0gTlVMTDsKKwlrbWVtX2NhY2hlX2ZyZWUodm1fYXJlYV9jYWNoZXAsIHZtYSk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNjg0LDYgKzY3OSw4IEBACiAJaWYgKElTX0VSUihmaWxlKSkKIAkJcmV0dXJuIGZpbGU7CiAKKwlmc25vdGlmeV9vcGVuKGZpbGUtPmZfcGF0aC5kZW50cnkpOworCiAJZXJyID0gZGVueV93cml0ZV9hY2Nlc3MoZmlsZSk7CiAJaWYgKGVycikgewogCQlmcHV0KGZpbGUpOwpAQCAtMTY4OSw3ICsxNjg2LDcgQEAKIAlyZXR1cm4gKHJldCA+PSAyKSA/IDIgOiByZXQ7CiB9CiAKLWludCBkb19jb3JlZHVtcChsb25nIHNpZ25yLCBpbnQgZXhpdF9jb2RlLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit2b2lkIGRvX2NvcmVkdW1wKGxvbmcgc2lnbnIsIGludCBleGl0X2NvZGUsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBjb3JlX3N0YXRlIGNvcmVfc3RhdGU7CiAJY2hhciBjb3JlbmFtZVtDT1JFTkFNRV9NQVhfU0laRSArIDFdOwpAQCAtMTc3Myw2ICsxNzcwLDExIEBACiAKICAJaWYgKGlzcGlwZSkgewogCQloZWxwZXJfYXJndiA9IGFyZ3Zfc3BsaXQoR0ZQX0tFUk5FTCwgY29yZW5hbWUrMSwgJmhlbHBlcl9hcmdjKTsKKwkJaWYgKCFoZWxwZXJfYXJndikgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMgZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeVxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXyk7CisJCQlnb3RvIGZhaWxfdW5sb2NrOworCQl9CiAJCS8qIFRlcm1pbmF0ZSB0aGUgc3RyaW5nIGJlZm9yZSB0aGUgZmlyc3Qgb3B0aW9uICovCiAJCWRlbGltaXQgPSBzdHJjaHIoY29yZW5hbWUsICcgJyk7CiAJCWlmIChkZWxpbWl0KQpAQCAtMTg0MCw1ICsxODQyLDUgQEAKIAlwdXRfY3JlZChjcmVkKTsKIAljb3JlZHVtcF9maW5pc2gobW0pOwogZmFpbDoKLQlyZXR1cm4gcmV0dmFsOworCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL2ZzL2V4dDIvaWFsbG9jLmMgYi9mcy9leHQyL2lhbGxvYy5jCmluZGV4IGM0NTRkNWQuLjY2MzIxYTggMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIvaWFsbG9jLmMKKysrIGIvZnMvZXh0Mi9pYWxsb2MuYwpAQCAtNTY1LDEyICs1NjUsOCBAQAogCWlub2RlLT5pX2Jsb2NrcyA9IDA7CiAJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKIAltZW1zZXQoZWktPmlfZGF0YSwgMCwgc2l6ZW9mKGVpLT5pX2RhdGEpKTsKLQllaS0+aV9mbGFncyA9IEVYVDJfSShkaXIpLT5pX2ZsYWdzICYgfkVYVDJfQlRSRUVfRkw7Ci0JaWYgKFNfSVNMTksobW9kZSkpCi0JCWVpLT5pX2ZsYWdzICY9IH4oRVhUMl9JTU1VVEFCTEVfRkx8RVhUMl9BUFBFTkRfRkwpOwotCS8qIGRpcnN5bmMgaXMgb25seSBhcHBsaWVkIHRvIGRpcmVjdG9yaWVzICovCi0JaWYgKCFTX0lTRElSKG1vZGUpKQotCQllaS0+aV9mbGFncyAmPSB+RVhUMl9ESVJTWU5DX0ZMOworCWVpLT5pX2ZsYWdzID0KKwkJZXh0Ml9tYXNrX2ZsYWdzKG1vZGUsIEVYVDJfSShkaXIpLT5pX2ZsYWdzICYgRVhUMl9GTF9JTkhFUklURUQpOwogCWVpLT5pX2ZhZGRyID0gMDsKIAllaS0+aV9mcmFnX25vID0gMDsKIAllaS0+aV9mcmFnX3NpemUgPSAwOwpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9pbm9kZS5jIGIvZnMvZXh0Mi9pbm9kZS5jCmluZGV4IDAyYjM5YTUuLjIzZmZmMmYgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIvaW5vZGUuYworKysgYi9mcy9leHQyL2lub2RlLmMKQEAgLTQ5OCw4ICs0OTgsNiBAQAogICogZXh0Ml9zcGxpY2VfYnJhbmNoIC0gc3BsaWNlIHRoZSBhbGxvY2F0ZWQgYnJhbmNoIG9udG8gaW5vZGUuCiAgKiBAaW5vZGU6IG93bmVyCiAgKiBAYmxvY2s6IChsb2dpY2FsKSBudW1iZXIgb2YgYmxvY2sgd2UgYXJlIGFkZGluZwotICogQGNoYWluOiBjaGFpbiBvZiBpbmRpcmVjdCBibG9ja3MgKHdpdGggYSBtaXNzaW5nIGxpbmsgLSBzZWUKLSAqCWV4dDJfYWxsb2NfYnJhbmNoKQogICogQHdoZXJlOiBsb2NhdGlvbiBvZiBtaXNzaW5nIGxpbmsKICAqIEBudW06ICAgbnVtYmVyIG9mIGluZGlyZWN0IGJsb2NrcyB3ZSBhcmUgYWRkaW5nCiAgKiBAYmxrczogIG51bWJlciBvZiBkaXJlY3QgYmxvY2tzIHdlIGFyZSBhZGRpbmcKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvaW9jdGwuYyBiL2ZzL2V4dDIvaW9jdGwuYwppbmRleCBkZTg3NmZhLi43Y2I0YmFkIDEwMDY0NAotLS0gYS9mcy9leHQyL2lvY3RsLmMKKysrIGIvZnMvZXh0Mi9pb2N0bC5jCkBAIC01MCw4ICs1MCw3IEBACiAJCQlnb3RvIHNldGZsYWdzX291dDsKIAkJfQogCi0JCWlmICghU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKLQkJCWZsYWdzICY9IH5FWFQyX0RJUlNZTkNfRkw7CisJCWZsYWdzID0gZXh0Ml9tYXNrX2ZsYWdzKGlub2RlLT5pX21vZGUsIGZsYWdzKTsKIAogCQltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJCS8qIElzIGl0IHF1b3RhIGZpbGU/IERvIG5vdCBhbGxvdyB1c2VyIHRvIG1lc3Mgd2l0aCBpdCAqLwpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9zdXBlci5jIGIvZnMvZXh0Mi9zdXBlci5jCmluZGV4IDY0N2NkODguLmRhOGJkZWEgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIvc3VwZXIuYworKysgYi9mcy9leHQyL3N1cGVyLmMKQEAgLTEzMiw2ICsxMzIsNyBAQAogCXBlcmNwdV9jb3VudGVyX2Rlc3Ryb3koJnNiaS0+c19kaXJzX2NvdW50ZXIpOwogCWJyZWxzZSAoc2JpLT5zX3NiaCk7CiAJc2ItPnNfZnNfaW5mbyA9IE5VTEw7CisJa2ZyZWUoc2JpLT5zX2Jsb2NrZ3JvdXBfbG9jayk7CiAJa2ZyZWUoc2JpKTsKIAogCXJldHVybjsKQEAgLTc1Niw2ICs3NTcsMTMgQEAKIAlzYmkgPSBremFsbG9jKHNpemVvZigqc2JpKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzYmkpCiAJCXJldHVybiAtRU5PTUVNOworCisJc2JpLT5zX2Jsb2NrZ3JvdXBfbG9jayA9CisJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBibG9ja2dyb3VwX2xvY2spLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNiaS0+c19ibG9ja2dyb3VwX2xvY2spIHsKKwkJa2ZyZWUoc2JpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQogCXNiLT5zX2ZzX2luZm8gPSBzYmk7CiAJc2JpLT5zX3NiX2Jsb2NrID0gc2JfYmxvY2s7CiAKQEAgLTk4Myw3ICs5OTEsNyBAQAogCQlwcmludGsgKCJFWFQyLWZzOiBub3QgZW5vdWdoIG1lbW9yeVxuIik7CiAJCWdvdG8gZmFpbGVkX21vdW50OwogCX0KLQliZ2xfbG9ja19pbml0KCZzYmktPnNfYmxvY2tncm91cF9sb2NrKTsKKwliZ2xfbG9ja19pbml0KHNiaS0+c19ibG9ja2dyb3VwX2xvY2spOwogCXNiaS0+c19kZWJ0cyA9IGtjYWxsb2Moc2JpLT5zX2dyb3Vwc19jb3VudCwgc2l6ZW9mKCpzYmktPnNfZGVidHMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNiaS0+c19kZWJ0cykgewogCQlwcmludGsgKCJFWFQyLWZzOiBub3QgZW5vdWdoIG1lbW9yeVxuIik7CmRpZmYgLS1naXQgYS9mcy9leHQzL2hhc2guYyBiL2ZzL2V4dDMvaGFzaC5jCmluZGV4IGMzMGUxNDkuLjdkMjE1YjQgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvaGFzaC5jCisrKyBiL2ZzL2V4dDMvaGFzaC5jCkBAIC0zNSwyMyArMzUsNzEgQEAKIAogCiAvKiBUaGUgb2xkIGxlZ2FjeSBoYXNoICovCi1zdGF0aWMgX191MzIgZHhfaGFja19oYXNoIChjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuKQorc3RhdGljIF9fdTMyIGR4X2hhY2tfaGFzaF91bnNpZ25lZChjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuKQogewotCV9fdTMyIGhhc2gwID0gMHgxMmEzZmUyZCwgaGFzaDEgPSAweDM3YWJlOGY5OwotCXdoaWxlIChsZW4tLSkgewotCQlfX3UzMiBoYXNoID0gaGFzaDEgKyAoaGFzaDAgXiAoKm5hbWUrKyAqIDcxNTIzNzMpKTsKKwlfX3UzMiBoYXNoLCBoYXNoMCA9IDB4MTJhM2ZlMmQsIGhhc2gxID0gMHgzN2FiZThmOTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICp1Y3AgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBuYW1lOwogCi0JCWlmIChoYXNoICYgMHg4MDAwMDAwMCkgaGFzaCAtPSAweDdmZmZmZmZmOworCXdoaWxlIChsZW4tLSkgeworCQloYXNoID0gaGFzaDEgKyAoaGFzaDAgXiAoKChpbnQpICp1Y3ArKykgKiA3MTUyMzczKSk7CisKKwkJaWYgKGhhc2ggJiAweDgwMDAwMDAwKQorCQkJaGFzaCAtPSAweDdmZmZmZmZmOwogCQloYXNoMSA9IGhhc2gwOwogCQloYXNoMCA9IGhhc2g7CiAJfQotCXJldHVybiAoaGFzaDAgPDwgMSk7CisJcmV0dXJuIGhhc2gwIDw8IDE7CiB9CiAKLXN0YXRpYyB2b2lkIHN0cjJoYXNoYnVmKGNvbnN0IGNoYXIgKm1zZywgaW50IGxlbiwgX191MzIgKmJ1ZiwgaW50IG51bSkKK3N0YXRpYyBfX3UzMiBkeF9oYWNrX2hhc2hfc2lnbmVkKGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4pCit7CisJX191MzIgaGFzaCwgaGFzaDAgPSAweDEyYTNmZTJkLCBoYXNoMSA9IDB4MzdhYmU4Zjk7CisJY29uc3Qgc2lnbmVkIGNoYXIgKnNjcCA9IChjb25zdCBzaWduZWQgY2hhciAqKSBuYW1lOworCisJd2hpbGUgKGxlbi0tKSB7CisJCWhhc2ggPSBoYXNoMSArIChoYXNoMCBeICgoKGludCkgKnNjcCsrKSAqIDcxNTIzNzMpKTsKKworCQlpZiAoaGFzaCAmIDB4ODAwMDAwMDApCisJCQloYXNoIC09IDB4N2ZmZmZmZmY7CisJCWhhc2gxID0gaGFzaDA7CisJCWhhc2gwID0gaGFzaDsKKwl9CisJcmV0dXJuIGhhc2gwIDw8IDE7Cit9CisKK3N0YXRpYyB2b2lkIHN0cjJoYXNoYnVmX3NpZ25lZChjb25zdCBjaGFyICptc2csIGludCBsZW4sIF9fdTMyICpidWYsIGludCBudW0pCiB7CiAJX191MzIJcGFkLCB2YWw7CiAJaW50CWk7CisJY29uc3Qgc2lnbmVkIGNoYXIgKnNjcCA9IChjb25zdCBzaWduZWQgY2hhciAqKSBtc2c7CisKKwlwYWQgPSAoX191MzIpbGVuIHwgKChfX3UzMilsZW4gPDwgOCk7CisJcGFkIHw9IHBhZCA8PCAxNjsKKworCXZhbCA9IHBhZDsKKwlpZiAobGVuID4gbnVtKjQpCisJCWxlbiA9IG51bSAqIDQ7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWlmICgoaSAlIDQpID09IDApCisJCQl2YWwgPSBwYWQ7CisJCXZhbCA9ICgoaW50KSBzY3BbaV0pICsgKHZhbCA8PCA4KTsKKwkJaWYgKChpICUgNCkgPT0gMykgeworCQkJKmJ1ZisrID0gdmFsOworCQkJdmFsID0gcGFkOworCQkJbnVtLS07CisJCX0KKwl9CisJaWYgKC0tbnVtID49IDApCisJCSpidWYrKyA9IHZhbDsKKwl3aGlsZSAoLS1udW0gPj0gMCkKKwkJKmJ1ZisrID0gcGFkOworfQorCitzdGF0aWMgdm9pZCBzdHIyaGFzaGJ1Zl91bnNpZ25lZChjb25zdCBjaGFyICptc2csIGludCBsZW4sIF9fdTMyICpidWYsIGludCBudW0pCit7CisJX191MzIJcGFkLCB2YWw7CisJaW50CWk7CisJY29uc3QgdW5zaWduZWQgY2hhciAqdWNwID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgbXNnOwogCiAJcGFkID0gKF9fdTMyKWxlbiB8ICgoX191MzIpbGVuIDw8IDgpOwogCXBhZCB8PSBwYWQgPDwgMTY7CkBAIC02Miw3ICsxMTAsNyBAQAogCWZvciAoaT0wOyBpIDwgbGVuOyBpKyspIHsKIAkJaWYgKChpICUgNCkgPT0gMCkKIAkJCXZhbCA9IHBhZDsKLQkJdmFsID0gbXNnW2ldICsgKHZhbCA8PCA4KTsKKwkJdmFsID0gKChpbnQpIHVjcFtpXSkgKyAodmFsIDw8IDgpOwogCQlpZiAoKGkgJSA0KSA9PSAzKSB7CiAJCQkqYnVmKysgPSB2YWw7CiAJCQl2YWwgPSBwYWQ7CkBAIC05NSw2ICsxNDMsOCBAQAogCWNvbnN0IGNoYXIJKnA7CiAJaW50CQlpOwogCV9fdTMyCQlpbls4XSwgYnVmWzRdOworCXZvaWQJCSgqc3RyMmhhc2hidWYpKGNvbnN0IGNoYXIgKiwgaW50LCBfX3UzMiAqLCBpbnQpID0KKwkJCQlzdHIyaGFzaGJ1Zl9zaWduZWQ7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBkZWZhdWx0IHNlZWQgZm9yIHRoZSBoYXNoIGNoZWNrc3VtIGZ1bmN0aW9ucyAqLwogCWJ1ZlswXSA9IDB4Njc0NTIzMDE7CkBAIC0xMTMsMTMgKzE2MywxOCBAQAogCX0KIAogCXN3aXRjaCAoaGluZm8tPmhhc2hfdmVyc2lvbikgewotCWNhc2UgRFhfSEFTSF9MRUdBQ1k6Ci0JCWhhc2ggPSBkeF9oYWNrX2hhc2gobmFtZSwgbGVuKTsKKwljYXNlIERYX0hBU0hfTEVHQUNZX1VOU0lHTkVEOgorCQloYXNoID0gZHhfaGFja19oYXNoX3Vuc2lnbmVkKG5hbWUsIGxlbik7CiAJCWJyZWFrOworCWNhc2UgRFhfSEFTSF9MRUdBQ1k6CisJCWhhc2ggPSBkeF9oYWNrX2hhc2hfc2lnbmVkKG5hbWUsIGxlbik7CisJCWJyZWFrOworCWNhc2UgRFhfSEFTSF9IQUxGX01ENF9VTlNJR05FRDoKKwkJc3RyMmhhc2hidWYgPSBzdHIyaGFzaGJ1Zl91bnNpZ25lZDsKIAljYXNlIERYX0hBU0hfSEFMRl9NRDQ6CiAJCXAgPSBuYW1lOwogCQl3aGlsZSAobGVuID4gMCkgewotCQkJc3RyMmhhc2hidWYocCwgbGVuLCBpbiwgOCk7CisJCQkoKnN0cjJoYXNoYnVmKShwLCBsZW4sIGluLCA4KTsKIAkJCWhhbGZfbWQ0X3RyYW5zZm9ybShidWYsIGluKTsKIAkJCWxlbiAtPSAzMjsKIAkJCXAgKz0gMzI7CkBAIC0xMjcsMTAgKzE4MiwxMiBAQAogCQltaW5vcl9oYXNoID0gYnVmWzJdOwogCQloYXNoID0gYnVmWzFdOwogCQlicmVhazsKKwljYXNlIERYX0hBU0hfVEVBX1VOU0lHTkVEOgorCQlzdHIyaGFzaGJ1ZiA9IHN0cjJoYXNoYnVmX3Vuc2lnbmVkOwogCWNhc2UgRFhfSEFTSF9URUE6CiAJCXAgPSBuYW1lOwogCQl3aGlsZSAobGVuID4gMCkgewotCQkJc3RyMmhhc2hidWYocCwgbGVuLCBpbiwgNCk7CisJCQkoKnN0cjJoYXNoYnVmKShwLCBsZW4sIGluLCA0KTsKIAkJCVRFQV90cmFuc2Zvcm0oYnVmLCBpbik7CiAJCQlsZW4gLT0gMTY7CiAJCQlwICs9IDE2OwpkaWZmIC0tZ2l0IGEvZnMvZXh0My9pYWxsb2MuYyBiL2ZzL2V4dDMvaWFsbG9jLmMKaW5kZXggNTY1NWZiYy4uOGRlNmM3MiAxMDA2NDQKLS0tIGEvZnMvZXh0My9pYWxsb2MuYworKysgYi9mcy9leHQzL2lhbGxvYy5jCkBAIC01NTksMTIgKzU1OSw4IEBACiAJZWktPmlfZGlyX3N0YXJ0X2xvb2t1cCA9IDA7CiAJZWktPmlfZGlza3NpemUgPSAwOwogCi0JZWktPmlfZmxhZ3MgPSBFWFQzX0koZGlyKS0+aV9mbGFncyAmIH5FWFQzX0lOREVYX0ZMOwotCWlmIChTX0lTTE5LKG1vZGUpKQotCQllaS0+aV9mbGFncyAmPSB+KEVYVDNfSU1NVVRBQkxFX0ZMfEVYVDNfQVBQRU5EX0ZMKTsKLQkvKiBkaXJzeW5jIG9ubHkgYXBwbGllcyB0byBkaXJlY3RvcmllcyAqLwotCWlmICghU19JU0RJUihtb2RlKSkKLQkJZWktPmlfZmxhZ3MgJj0gfkVYVDNfRElSU1lOQ19GTDsKKwllaS0+aV9mbGFncyA9CisJCWV4dDNfbWFza19mbGFncyhtb2RlLCBFWFQzX0koZGlyKS0+aV9mbGFncyAmIEVYVDNfRkxfSU5IRVJJVEVEKTsKICNpZmRlZiBFWFQzX0ZSQUdNRU5UUwogCWVpLT5pX2ZhZGRyID0gMDsKIAllaS0+aV9mcmFnX25vID0gMDsKZGlmZiAtLWdpdCBhL2ZzL2V4dDMvaW9jdGwuYyBiL2ZzL2V4dDMvaW9jdGwuYwppbmRleCBiNzM5NGQwLi41ZTg2Y2U5IDEwMDY0NAotLS0gYS9mcy9leHQzL2lvY3RsLmMKKysrIGIvZnMvZXh0My9pb2N0bC5jCkBAIC01Myw4ICs1Myw3IEBACiAJCQlnb3RvIGZsYWdzX291dDsKIAkJfQogCi0JCWlmICghU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKLQkJCWZsYWdzICY9IH5FWFQzX0RJUlNZTkNfRkw7CisJCWZsYWdzID0gZXh0M19tYXNrX2ZsYWdzKGlub2RlLT5pX21vZGUsIGZsYWdzKTsKIAogCQltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJCS8qIElzIGl0IHF1b3RhIGZpbGU/IERvIG5vdCBhbGxvdyB1c2VyIHRvIG1lc3Mgd2l0aCBpdCAqLwpkaWZmIC0tZ2l0IGEvZnMvZXh0My9uYW1laS5jIGIvZnMvZXh0My9uYW1laS5jCmluZGV4IDFkZDJhYmUuLjY5YTNkMTkgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvbmFtZWkuYworKysgYi9mcy9leHQzL25hbWVpLmMKQEAgLTc0LDEwICs3NCw2IEBACiAjZGVmaW5lIGFzc2VydCh0ZXN0KSBKX0FTU0VSVCh0ZXN0KQogI2VuZGlmCiAKLSNpZm5kZWYgc3dhcAotI2RlZmluZSBzd2FwKHgsIHkpIGRvIHsgdHlwZW9mKHgpIHogPSB4OyB4ID0geTsgeSA9IHo7IH0gd2hpbGUgKDApCi0jZW5kaWYKLQogI2lmZGVmIERYX0RFQlVHCiAjZGVmaW5lIGR4dHJhY2UoY29tbWFuZCkgY29tbWFuZAogI2Vsc2UKQEAgLTM2OCw2ICszNjQsOCBAQAogCQlnb3RvIGZhaWw7CiAJfQogCWhpbmZvLT5oYXNoX3ZlcnNpb24gPSByb290LT5pbmZvLmhhc2hfdmVyc2lvbjsKKwlpZiAoaGluZm8tPmhhc2hfdmVyc2lvbiA8PSBEWF9IQVNIX1RFQSkKKwkJaGluZm8tPmhhc2hfdmVyc2lvbiArPSBFWFQzX1NCKGRpci0+aV9zYiktPnNfaGFzaF91bnNpZ25lZDsKIAloaW5mby0+c2VlZCA9IEVYVDNfU0IoZGlyLT5pX3NiKS0+c19oYXNoX3NlZWQ7CiAJaWYgKGVudHJ5KQogCQlleHQzZnNfZGlyaGFzaChlbnRyeS0+bmFtZSwgZW50cnktPmxlbiwgaGluZm8pOwpAQCAtNjM2LDYgKzYzNCw5IEBACiAJZGlyID0gZGlyX2ZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJaWYgKCEoRVhUM19JKGRpciktPmlfZmxhZ3MgJiBFWFQzX0lOREVYX0ZMKSkgewogCQloaW5mby5oYXNoX3ZlcnNpb24gPSBFWFQzX1NCKGRpci0+aV9zYiktPnNfZGVmX2hhc2hfdmVyc2lvbjsKKwkJaWYgKGhpbmZvLmhhc2hfdmVyc2lvbiA8PSBEWF9IQVNIX1RFQSkKKwkJCWhpbmZvLmhhc2hfdmVyc2lvbiArPQorCQkJCUVYVDNfU0IoZGlyLT5pX3NiKS0+c19oYXNoX3Vuc2lnbmVkOwogCQloaW5mby5zZWVkID0gRVhUM19TQihkaXItPmlfc2IpLT5zX2hhc2hfc2VlZDsKIAkJY291bnQgPSBodHJlZV9kaXJibG9ja190b190cmVlKGRpcl9maWxlLCBkaXIsIDAsICZoaW5mbywKIAkJCQkJICAgICAgIHN0YXJ0X2hhc2gsIHN0YXJ0X21pbm9yX2hhc2gpOwpAQCAtMTE1Niw5ICsxMTU3LDkgQEAKIAl1MzIgaGFzaDI7CiAJc3RydWN0IGR4X21hcF9lbnRyeSAqbWFwOwogCWNoYXIgKmRhdGExID0gKCpiaCktPmJfZGF0YSwgKmRhdGEyOwotCXVuc2lnbmVkIHNwbGl0LCBtb3ZlLCBzaXplLCBpOworCXVuc2lnbmVkIHNwbGl0LCBtb3ZlLCBzaXplOwogCXN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICpkZSA9IE5VTEwsICpkZTI7Ci0JaW50CWVyciA9IDA7CisJaW50CWVyciA9IDAsIGk7CiAKIAliaDIgPSBleHQzX2FwcGVuZCAoaGFuZGxlLCBkaXIsICZuZXdibG9jaywgJmVycik7CiAJaWYgKCEoYmgyKSkgewpAQCAtMTM5OCw2ICsxMzk5LDggQEAKIAogCS8qIEluaXRpYWxpemUgYXMgZm9yIGR4X3Byb2JlICovCiAJaGluZm8uaGFzaF92ZXJzaW9uID0gcm9vdC0+aW5mby5oYXNoX3ZlcnNpb247CisJaWYgKGhpbmZvLmhhc2hfdmVyc2lvbiA8PSBEWF9IQVNIX1RFQSkKKwkJaGluZm8uaGFzaF92ZXJzaW9uICs9IEVYVDNfU0IoZGlyLT5pX3NiKS0+c19oYXNoX3Vuc2lnbmVkOwogCWhpbmZvLnNlZWQgPSBFWFQzX1NCKGRpci0+aV9zYiktPnNfaGFzaF9zZWVkOwogCWV4dDNmc19kaXJoYXNoKG5hbWUsIG5hbWVsZW4sICZoaW5mbyk7CiAJZnJhbWUgPSBmcmFtZXM7CmRpZmYgLS1naXQgYS9mcy9leHQzL3N1cGVyLmMgYi9mcy9leHQzL3N1cGVyLmMKaW5kZXggZjZjOTRmMi4uNWQwNDdhMCAxMDA2NDQKLS0tIGEvZnMvZXh0My9zdXBlci5jCisrKyBiL2ZzL2V4dDMvc3VwZXIuYwpAQCAtNDM5LDYgKzQzOSw3IEBACiAJCWV4dDNfYmxrZGV2X3JlbW92ZShzYmkpOwogCX0KIAlzYi0+c19mc19pbmZvID0gTlVMTDsKKwlrZnJlZShzYmktPnNfYmxvY2tncm91cF9sb2NrKTsKIAlrZnJlZShzYmkpOwogCXJldHVybjsKIH0KQEAgLTY4Miw2ICs2ODMsMjYgQEAKIAkJCQkgICAgZXh0M19uZnNfZ2V0X2lub2RlKTsKIH0KIAorLyoKKyAqIFRyeSB0byByZWxlYXNlIG1ldGFkYXRhIHBhZ2VzIChpbmRpcmVjdCBibG9ja3MsIGRpcmVjdG9yaWVzKSB3aGljaCBhcmUKKyAqIG1hcHBlZCB2aWEgdGhlIGJsb2NrIGRldmljZS4gIFNpbmNlIHRoZXNlIHBhZ2VzIGNvdWxkIGhhdmUgam91cm5hbCBoZWFkcworICogd2hpY2ggd291bGQgcHJldmVudCB0cnlfdG9fZnJlZV9idWZmZXJzKCkgZnJvbSBmcmVlaW5nIHRoZW0sIHdlIG11c3QgdXNlCisgKiBqYmQgbGF5ZXIncyB0cnlfdG9fZnJlZV9idWZmZXJzKCkgZnVuY3Rpb24gdG8gcmVsZWFzZSB0aGVtLgorICovCitzdGF0aWMgaW50IGJkZXZfdHJ5X3RvX2ZyZWVfcGFnZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQkgZ2ZwX3Qgd2FpdCkKK3sKKwlqb3VybmFsX3QgKmpvdXJuYWwgPSBFWFQzX1NCKHNiKS0+c19qb3VybmFsOworCisJV0FSTl9PTihQYWdlQ2hlY2tlZChwYWdlKSk7CisJaWYgKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKQorCQlyZXR1cm4gMDsKKwlpZiAoam91cm5hbCkKKwkJcmV0dXJuIGpvdXJuYWxfdHJ5X3RvX2ZyZWVfYnVmZmVycyhqb3VybmFsLCBwYWdlLCAKKwkJCQkJCSAgIHdhaXQgJiB+X19HRlBfV0FJVCk7CisJcmV0dXJuIHRyeV90b19mcmVlX2J1ZmZlcnMocGFnZSk7Cit9CisKICNpZmRlZiBDT05GSUdfUVVPVEEKICNkZWZpbmUgUVRZUEUyTkFNRSh0KSAoKHQpPT1VU1JRVU9UQT8idXNlciI6Imdyb3VwIikKICNkZWZpbmUgUVRZUEUyTU9QVChvbiwgdCkgKCh0KT09VVNSUVVPVEE/KChvbikjI1VTUkpRVU9UQSk6KChvbikjI0dSUEpRVU9UQSkpCkBAIC03MTMsNyArNzM0LDkgQEAKIAkuYWNxdWlyZV9kcXVvdAk9IGV4dDNfYWNxdWlyZV9kcXVvdCwKIAkucmVsZWFzZV9kcXVvdAk9IGV4dDNfcmVsZWFzZV9kcXVvdCwKIAkubWFya19kaXJ0eQk9IGV4dDNfbWFya19kcXVvdF9kaXJ0eSwKLQkud3JpdGVfaW5mbwk9IGV4dDNfd3JpdGVfaW5mbworCS53cml0ZV9pbmZvCT0gZXh0M193cml0ZV9pbmZvLAorCS5hbGxvY19kcXVvdAk9IGRxdW90X2FsbG9jLAorCS5kZXN0cm95X2RxdW90CT0gZHF1b3RfZGVzdHJveSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcXVvdGFjdGxfb3BzIGV4dDNfcWN0bF9vcGVyYXRpb25zID0gewpAQCAtNzQ2LDYgKzc2OSw3IEBACiAJLnF1b3RhX3JlYWQJPSBleHQzX3F1b3RhX3JlYWQsCiAJLnF1b3RhX3dyaXRlCT0gZXh0M19xdW90YV93cml0ZSwKICNlbmRpZgorCS5iZGV2X3RyeV90b19mcmVlX3BhZ2UgPSBiZGV2X3RyeV90b19mcmVlX3BhZ2UsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIGV4dDNfZXhwb3J0X29wcyA9IHsKQEAgLTEwMzUsOCArMTA1OSw3IEBACiAJCWNhc2UgT3B0X2dycGpxdW90YToKIAkJCXF0eXBlID0gR1JQUVVPVEE7CiBzZXRfcWZfbmFtZToKLQkJCWlmICgoc2JfYW55X3F1b3RhX2VuYWJsZWQoc2IpIHx8Ci0JCQkgICAgIHNiX2FueV9xdW90YV9zdXNwZW5kZWQoc2IpKSAmJgorCQkJaWYgKHNiX2FueV9xdW90YV9sb2FkZWQoc2IpICYmCiAJCQkgICAgIXNiaS0+c19xZl9uYW1lc1txdHlwZV0pIHsKIAkJCQlwcmludGsoS0VSTl9FUlIKIAkJCQkJIkVYVDMtZnM6IENhbm5vdCBjaGFuZ2Ugam91cm5hbGVkICIKQEAgLTEwNzUsOCArMTA5OCw3IEBACiAJCWNhc2UgT3B0X29mZmdycGpxdW90YToKIAkJCXF0eXBlID0gR1JQUVVPVEE7CiBjbGVhcl9xZl9uYW1lOgotCQkJaWYgKChzYl9hbnlfcXVvdGFfZW5hYmxlZChzYikgfHwKLQkJCSAgICAgc2JfYW55X3F1b3RhX3N1c3BlbmRlZChzYikpICYmCisJCQlpZiAoc2JfYW55X3F1b3RhX2xvYWRlZChzYikgJiYKIAkJCSAgICBzYmktPnNfcWZfbmFtZXNbcXR5cGVdKSB7CiAJCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBDYW5ub3QgY2hhbmdlICIKIAkJCQkJImpvdXJuYWxlZCBxdW90YSBvcHRpb25zIHdoZW4gIgpAQCAtMTA5NSw4ICsxMTE3LDcgQEAKIAkJY2FzZSBPcHRfanFmbXRfdmZzdjA6CiAJCQlxZm10ID0gUUZNVF9WRlNfVjA7CiBzZXRfcWZfZm9ybWF0OgotCQkJaWYgKChzYl9hbnlfcXVvdGFfZW5hYmxlZChzYikgfHwKLQkJCSAgICAgc2JfYW55X3F1b3RhX3N1c3BlbmRlZChzYikpICYmCisJCQlpZiAoc2JfYW55X3F1b3RhX2xvYWRlZChzYikgJiYKIAkJCSAgICBzYmktPnNfanF1b3RhX2ZtdCAhPSBxZm10KSB7CiAJCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBDYW5ub3QgY2hhbmdlICIKIAkJCQkJImpvdXJuYWxlZCBxdW90YSBvcHRpb25zIHdoZW4gIgpAQCAtMTExNSw4ICsxMTM2LDcgQEAKIAkJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgR1JQUVVPVEEpOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X25vcXVvdGE6Ci0JCQlpZiAoc2JfYW55X3F1b3RhX2VuYWJsZWQoc2IpIHx8Ci0JCQkgICAgc2JfYW55X3F1b3RhX3N1c3BlbmRlZChzYikpIHsKKwkJCWlmIChzYl9hbnlfcXVvdGFfbG9hZGVkKHNiKSkgewogCQkJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogQ2Fubm90IGNoYW5nZSBxdW90YSAiCiAJCQkJCSJvcHRpb25zIHdoZW4gcXVvdGEgdHVybmVkIG9uLlxuIik7CiAJCQkJcmV0dXJuIDA7CkBAIC0xNTQ4LDYgKzE1NjgsMTMgQEAKIAlzYmkgPSBremFsbG9jKHNpemVvZigqc2JpKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzYmkpCiAJCXJldHVybiAtRU5PTUVNOworCisJc2JpLT5zX2Jsb2NrZ3JvdXBfbG9jayA9CisJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBibG9ja2dyb3VwX2xvY2spLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNiaS0+c19ibG9ja2dyb3VwX2xvY2spIHsKKwkJa2ZyZWUoc2JpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQogCXNiLT5zX2ZzX2luZm8gPSBzYmk7CiAJc2JpLT5zX21vdW50X29wdCA9IDA7CiAJc2JpLT5zX3Jlc3VpZCA9IEVYVDNfREVGX1JFU1VJRDsKQEAgLTE3NDQsNiArMTc3MSwxOCBAQAogCWZvciAoaT0wOyBpIDwgNDsgaSsrKQogCQlzYmktPnNfaGFzaF9zZWVkW2ldID0gbGUzMl90b19jcHUoZXMtPnNfaGFzaF9zZWVkW2ldKTsKIAlzYmktPnNfZGVmX2hhc2hfdmVyc2lvbiA9IGVzLT5zX2RlZl9oYXNoX3ZlcnNpb247CisJaSA9IGxlMzJfdG9fY3B1KGVzLT5zX2ZsYWdzKTsKKwlpZiAoaSAmIEVYVDJfRkxBR1NfVU5TSUdORURfSEFTSCkKKwkJc2JpLT5zX2hhc2hfdW5zaWduZWQgPSAzOworCWVsc2UgaWYgKChpICYgRVhUMl9GTEFHU19TSUdORURfSEFTSCkgPT0gMCkgeworI2lmZGVmIF9fQ0hBUl9VTlNJR05FRF9fCisJCWVzLT5zX2ZsYWdzIHw9IGNwdV90b19sZTMyKEVYVDJfRkxBR1NfVU5TSUdORURfSEFTSCk7CisJCXNiaS0+c19oYXNoX3Vuc2lnbmVkID0gMzsKKyNlbHNlCisJCWVzLT5zX2ZsYWdzIHw9IGNwdV90b19sZTMyKEVYVDJfRkxBR1NfU0lHTkVEX0hBU0gpOworI2VuZGlmCisJCXNiLT5zX2RpcnQgPSAxOworCX0KIAogCWlmIChzYmktPnNfYmxvY2tzX3Blcl9ncm91cCA+IGJsb2Nrc2l6ZSAqIDgpIHsKIAkJcHJpbnRrIChLRVJOX0VSUgpAQCAtMTc4OCw3ICsxODI3LDcgQEAKIAkJZ290byBmYWlsZWRfbW91bnQ7CiAJfQogCi0JYmdsX2xvY2tfaW5pdCgmc2JpLT5zX2Jsb2NrZ3JvdXBfbG9jayk7CisJYmdsX2xvY2tfaW5pdChzYmktPnNfYmxvY2tncm91cF9sb2NrKTsKIAogCWZvciAoaSA9IDA7IGkgPCBkYl9jb3VudDsgaSsrKSB7CiAJCWJsb2NrID0gZGVzY3JpcHRvcl9sb2Moc2IsIGxvZ2ljX3NiX2Jsb2NrLCBpKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvYmFsbG9jLmMgYi9mcy9leHQ0L2JhbGxvYy5jCmluZGV4IDM4YjNhY2YuLjZiYmEwNmIgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvYmFsbG9jLmMKKysrIGIvZnMvZXh0NC9iYWxsb2MuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgImV4dDQuaCIKICNpbmNsdWRlICJleHQ0X2piZDIuaCIKICNpbmNsdWRlICJncm91cC5oIgorI2luY2x1ZGUgIm1iYWxsb2MuaCIKIAogLyoKICAqIGJhbGxvYy5jIGNvbnRhaW5zIHRoZSBibG9ja3MgYWxsb2NhdGlvbiBhbmQgZGVhbGxvY2F0aW9uIHJvdXRpbmVzCkBAIC0xMDAsMTAgKzEwMSwxMCBAQAogCQkgKiBlc3NlbnRpYWxseSBpbXBsZW1lbnRpbmcgYSBwZXItZ3JvdXAgcmVhZC1vbmx5IGZsYWcuICovCiAJCWlmICghZXh0NF9ncm91cF9kZXNjX2NzdW1fdmVyaWZ5KHNiaSwgYmxvY2tfZ3JvdXAsIGdkcCkpIHsKIAkJCWV4dDRfZXJyb3Ioc2IsIF9fZnVuY19fLAotCQkJCSAgIkNoZWNrc3VtIGJhZCBmb3IgZ3JvdXAgJWx1XG4iLCBibG9ja19ncm91cCk7Ci0JCQlnZHAtPmJnX2ZyZWVfYmxvY2tzX2NvdW50ID0gMDsKLQkJCWdkcC0+YmdfZnJlZV9pbm9kZXNfY291bnQgPSAwOwotCQkJZ2RwLT5iZ19pdGFibGVfdW51c2VkID0gMDsKKwkJCQkgICJDaGVja3N1bSBiYWQgZm9yIGdyb3VwICV1IiwgYmxvY2tfZ3JvdXApOworCQkJZXh0NF9mcmVlX2Jsa3Nfc2V0KHNiLCBnZHAsIDApOworCQkJZXh0NF9mcmVlX2lub2Rlc19zZXQoc2IsIGdkcCwgMCk7CisJCQlleHQ0X2l0YWJsZV91bnVzZWRfc2V0KHNiLCBnZHAsIDApOwogCQkJbWVtc2V0KGJoLT5iX2RhdGEsIDB4ZmYsIHNiLT5zX2Jsb2Nrc2l6ZSk7CiAJCQlyZXR1cm4gMDsKIAkJfQpAQCAtMjA1LDE1ICsyMDYsMTUgQEAKIAkJCQkJICAgICBleHQ0X2dyb3VwX3QgYmxvY2tfZ3JvdXAsCiAJCQkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmgpCiB7Ci0JdW5zaWduZWQgbG9uZyBncm91cF9kZXNjOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCXVuc2lnbmVkIGludCBncm91cF9kZXNjOworCXVuc2lnbmVkIGludCBvZmZzZXQ7CiAJc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqZGVzYzsKIAlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKIAogCWlmIChibG9ja19ncm91cCA+PSBzYmktPnNfZ3JvdXBzX2NvdW50KSB7CiAJCWV4dDRfZXJyb3Ioc2IsICJleHQ0X2dldF9ncm91cF9kZXNjIiwKIAkJCSAgICJibG9ja19ncm91cCA+PSBncm91cHNfY291bnQgLSAiCi0JCQkgICAiYmxvY2tfZ3JvdXAgPSAlbHUsIGdyb3Vwc19jb3VudCA9ICVsdSIsCisJCQkgICAiYmxvY2tfZ3JvdXAgPSAldSwgZ3JvdXBzX2NvdW50ID0gJXUiLAogCQkJICAgYmxvY2tfZ3JvdXAsIHNiaS0+c19ncm91cHNfY291bnQpOwogCiAJCXJldHVybiBOVUxMOwpAQCAtMjI1LDcgKzIyNiw3IEBACiAJaWYgKCFzYmktPnNfZ3JvdXBfZGVzY1tncm91cF9kZXNjXSkgewogCQlleHQ0X2Vycm9yKHNiLCAiZXh0NF9nZXRfZ3JvdXBfZGVzYyIsCiAJCQkgICAiR3JvdXAgZGVzY3JpcHRvciBub3QgbG9hZGVkIC0gIgotCQkJICAgImJsb2NrX2dyb3VwID0gJWx1LCBncm91cF9kZXNjID0gJWx1LCBkZXNjID0gJWx1IiwKKwkJCSAgICJibG9ja19ncm91cCA9ICV1LCBncm91cF9kZXNjID0gJXUsIGRlc2MgPSAldSIsCiAJCQkgICBibG9ja19ncm91cCwgZ3JvdXBfZGVzYywgb2Zmc2V0KTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtMzE1LDI5ICszMTYsNTAgQEAKIAlpZiAodW5saWtlbHkoIWJoKSkgewogCQlleHQ0X2Vycm9yKHNiLCBfX2Z1bmNfXywKIAkJCSAgICAiQ2Fubm90IHJlYWQgYmxvY2sgYml0bWFwIC0gIgotCQkJICAgICJibG9ja19ncm91cCA9ICVsdSwgYmxvY2tfYml0bWFwID0gJWxsdSIsCisJCQkgICAgImJsb2NrX2dyb3VwID0gJXUsIGJsb2NrX2JpdG1hcCA9ICVsbHUiLAogCQkJICAgIGJsb2NrX2dyb3VwLCBiaXRtYXBfYmxrKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCWlmIChidWZmZXJfdXB0b2RhdGUoYmgpICYmCi0JICAgICEoZGVzYy0+YmdfZmxhZ3MgJiBjcHVfdG9fbGUxNihFWFQ0X0JHX0JMT0NLX1VOSU5JVCkpKQorCisJaWYgKGJpdG1hcF91cHRvZGF0ZShiaCkpCiAJCXJldHVybiBiaDsKIAogCWxvY2tfYnVmZmVyKGJoKTsKKwlpZiAoYml0bWFwX3VwdG9kYXRlKGJoKSkgeworCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJcmV0dXJuIGJoOworCX0KIAlzcGluX2xvY2soc2JfYmdsX2xvY2soRVhUNF9TQihzYiksIGJsb2NrX2dyb3VwKSk7CiAJaWYgKGRlc2MtPmJnX2ZsYWdzICYgY3B1X3RvX2xlMTYoRVhUNF9CR19CTE9DS19VTklOSVQpKSB7CiAJCWV4dDRfaW5pdF9ibG9ja19iaXRtYXAoc2IsIGJoLCBibG9ja19ncm91cCwgZGVzYyk7CisJCXNldF9iaXRtYXBfdXB0b2RhdGUoYmgpOwogCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKLQkJdW5sb2NrX2J1ZmZlcihiaCk7CiAJCXNwaW5fdW5sb2NrKHNiX2JnbF9sb2NrKEVYVDRfU0Ioc2IpLCBibG9ja19ncm91cCkpOworCQl1bmxvY2tfYnVmZmVyKGJoKTsKIAkJcmV0dXJuIGJoOwogCX0KIAlzcGluX3VubG9jayhzYl9iZ2xfbG9jayhFWFQ0X1NCKHNiKSwgYmxvY2tfZ3JvdXApKTsKKwlpZiAoYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQkvKgorCQkgKiBpZiBub3QgdW5pbml0IGlmIGJoIGlzIHVwdG9kYXRlLAorCQkgKiBiaXRtYXAgaXMgYWxzbyB1cHRvZGF0ZQorCQkgKi8KKwkJc2V0X2JpdG1hcF91cHRvZGF0ZShiaCk7CisJCXVubG9ja19idWZmZXIoYmgpOworCQlyZXR1cm4gYmg7CisJfQorCS8qCisJICogc3VibWl0IHRoZSBidWZmZXJfaGVhZCBmb3IgcmVhZC4gV2UgY2FuCisJICogc2FmZWx5IG1hcmsgdGhlIGJpdG1hcCBhcyB1cHRvZGF0ZSBub3cuCisJICogV2UgZG8gaXQgaGVyZSBzbyB0aGUgYml0bWFwIHVwdG9kYXRlIGJpdAorCSAqIGdldCBzZXQgd2l0aCBidWZmZXIgbG9jayBoZWxkLgorCSAqLworCXNldF9iaXRtYXBfdXB0b2RhdGUoYmgpOwogCWlmIChiaF9zdWJtaXRfcmVhZChiaCkgPCAwKSB7CiAJCXB1dF9iaChiaCk7CiAJCWV4dDRfZXJyb3Ioc2IsIF9fZnVuY19fLAogCQkJICAgICJDYW5ub3QgcmVhZCBibG9jayBiaXRtYXAgLSAiCi0JCQkgICAgImJsb2NrX2dyb3VwID0gJWx1LCBibG9ja19iaXRtYXAgPSAlbGx1IiwKKwkJCSAgICAiYmxvY2tfZ3JvdXAgPSAldSwgYmxvY2tfYml0bWFwID0gJWxsdSIsCiAJCQkgICAgYmxvY2tfZ3JvdXAsIGJpdG1hcF9ibGspOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC0zNTAsNjIgKzM3Miw0NCBAQAogfQogCiAvKioKLSAqIGV4dDRfZnJlZV9ibG9ja3Nfc2IoKSAtLSBGcmVlIGdpdmVuIGJsb2NrcyBhbmQgdXBkYXRlIHF1b3RhCisgKiBleHQ0X2FkZF9ncm91cGJsb2NrcygpIC0tIEFkZCBnaXZlbiBibG9ja3MgdG8gYW4gZXhpc3RpbmcgZ3JvdXAKICAqIEBoYW5kbGU6CQkJaGFuZGxlIHRvIHRoaXMgdHJhbnNhY3Rpb24KICAqIEBzYjoJCQkJc3VwZXIgYmxvY2sKLSAqIEBibG9jazoJCQlzdGFydCBwaHlzY2lhbCBibG9jayB0byBmcmVlCisgKiBAYmxvY2s6CQkJc3RhcnQgcGh5c2NpYWwgYmxvY2sgdG8gYWRkIHRvIHRoZSBibG9jayBncm91cAogICogQGNvdW50OgkJCW51bWJlciBvZiBibG9ja3MgdG8gZnJlZQotICogQHBkcXVvdF9mcmVlZF9ibG9ja3M6CXBvaW50ZXIgdG8gcXVvdGEKICAqCi0gKiBYWFggVGhpcyBmdW5jdGlvbiBpcyBvbmx5IHVzZWQgYnkgdGhlIG9uLWxpbmUgcmVzaXppbmcgY29kZSwgd2hpY2gKLSAqIHNob3VsZCBwcm9iYWJseSBiZSBmaXhlZCB1cCB0byBjYWxsIHRoZSBtYmFsbG9jIHZhcmlhbnQuICBUaGVyZQotICogdGhpcyBuZWVkcyB0byBiZSBjbGVhbmVkIHVwIGxhdGVyOyBpbiBmYWN0LCBJJ20gbm90IGNvbnZpbmNlZCB0aGlzCi0gKiBpcyAxMDAlIGNvcnJlY3QgaW4gdGhlIGZhY2Ugb2YgdGhlIG1iYWxsb2MgY29kZS4gIFRoZSBvbmxpbmUgcmVzaXppbmcKLSAqIGNvZGUgbmVlZHMgdG8gYmUgZml4ZWQgdXAgdG8gbW9yZSB0aWdodGx5IChhbmQgY29ycmVjdGx5KSBpbnRlcmxvY2sKLSAqIHdpdGggdGhlIG1iYWxsb2MgY29kZS4KKyAqIFRoaXMgbWFya3MgdGhlIGJsb2NrcyBhcyBmcmVlIGluIHRoZSBiaXRtYXAuIFdlIGFzayB0aGUKKyAqIG1iYWxsb2MgdG8gcmVsb2FkIHRoZSBidWRkeSBhZnRlciB0aGlzIGJ5IHNldHRpbmcgZ3JvdXAKKyAqIEVYVDRfR1JPVVBfSU5GT19ORUVEX0lOSVRfQklUIGZsYWcKICAqLwotdm9pZCBleHQ0X2ZyZWVfYmxvY2tzX3NiKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCi0JCQkgZXh0NF9mc2Jsa190IGJsb2NrLCB1bnNpZ25lZCBsb25nIGNvdW50LAotCQkJIHVuc2lnbmVkIGxvbmcgKnBkcXVvdF9mcmVlZF9ibG9ja3MpCit2b2lkIGV4dDRfYWRkX2dyb3VwYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkgZXh0NF9mc2Jsa190IGJsb2NrLCB1bnNpZ25lZCBsb25nIGNvdW50KQogewogCXN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoID0gTlVMTDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmdkX2JoOwogCWV4dDRfZ3JvdXBfdCBibG9ja19ncm91cDsKIAlleHQ0X2dycGJsa190IGJpdDsKLQl1bnNpZ25lZCBsb25nIGk7Ci0JdW5zaWduZWQgbG9uZyBvdmVyZmxvdzsKKwl1bnNpZ25lZCBpbnQgaTsKIAlzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpkZXNjOwogCXN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICplczsKIAlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmk7Ci0JaW50IGVyciA9IDAsIHJldDsKLQlleHQ0X2dycGJsa190IGdyb3VwX2ZyZWVkOworCWludCBlcnIgPSAwLCByZXQsIGJsa19mcmVlX2NvdW50OworCWV4dDRfZ3JwYmxrX3QgYmxvY2tzX2ZyZWVkOworCXN0cnVjdCBleHQ0X2dyb3VwX2luZm8gKmdycDsKIAotCSpwZHF1b3RfZnJlZWRfYmxvY2tzID0gMDsKIAlzYmkgPSBFWFQ0X1NCKHNiKTsKIAllcyA9IHNiaS0+c19lczsKLQlpZiAoYmxvY2sgPCBsZTMyX3RvX2NwdShlcy0+c19maXJzdF9kYXRhX2Jsb2NrKSB8fAotCSAgICBibG9jayArIGNvdW50IDwgYmxvY2sgfHwKLQkgICAgYmxvY2sgKyBjb3VudCA+IGV4dDRfYmxvY2tzX2NvdW50KGVzKSkgewotCQlleHQ0X2Vycm9yKHNiLCAiZXh0NF9mcmVlX2Jsb2NrcyIsCi0JCQkgICAiRnJlZWluZyBibG9ja3Mgbm90IGluIGRhdGF6b25lIC0gIgotCQkJICAgImJsb2NrID0gJWxsdSwgY291bnQgPSAlbHUiLCBibG9jaywgY291bnQpOwotCQlnb3RvIGVycm9yX3JldHVybjsKLQl9CisJZXh0NF9kZWJ1ZygiQWRkaW5nIGJsb2NrKHMpICVsbHUtJWxsdVxuIiwgYmxvY2ssIGJsb2NrICsgY291bnQgLSAxKTsKIAotCWV4dDRfZGVidWcoImZyZWVpbmcgYmxvY2socykgJWxsdS0lbGx1XG4iLCBibG9jaywgYmxvY2sgKyBjb3VudCAtIDEpOwotCi1kb19tb3JlOgotCW92ZXJmbG93ID0gMDsKIAlleHQ0X2dldF9ncm91cF9ub19hbmRfb2Zmc2V0KHNiLCBibG9jaywgJmJsb2NrX2dyb3VwLCAmYml0KTsKKwlncnAgPSBleHQ0X2dldF9ncm91cF9pbmZvKHNiLCBibG9ja19ncm91cCk7CiAJLyoKIAkgKiBDaGVjayB0byBzZWUgaWYgd2UgYXJlIGZyZWVpbmcgYmxvY2tzIGFjcm9zcyBhIGdyb3VwCiAJICogYm91bmRhcnkuCiAJICovCiAJaWYgKGJpdCArIGNvdW50ID4gRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKSkgewotCQlvdmVyZmxvdyA9IGJpdCArIGNvdW50IC0gRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKTsKLQkJY291bnQgLT0gb3ZlcmZsb3c7CisJCWdvdG8gZXJyb3JfcmV0dXJuOwogCX0KLQlicmVsc2UoYml0bWFwX2JoKTsKIAliaXRtYXBfYmggPSBleHQ0X3JlYWRfYmxvY2tfYml0bWFwKHNiLCBibG9ja19ncm91cCk7CiAJaWYgKCFiaXRtYXBfYmgpCiAJCWdvdG8gZXJyb3JfcmV0dXJuOwpAQCAtNDE4LDE4ICs0MjIsMTcgQEAKIAkgICAgaW5fcmFuZ2UoYmxvY2ssIGV4dDRfaW5vZGVfdGFibGUoc2IsIGRlc2MpLCBzYmktPnNfaXRiX3Blcl9ncm91cCkgfHwKIAkgICAgaW5fcmFuZ2UoYmxvY2sgKyBjb3VudCAtIDEsIGV4dDRfaW5vZGVfdGFibGUoc2IsIGRlc2MpLAogCQkgICAgIHNiaS0+c19pdGJfcGVyX2dyb3VwKSkgewotCQlleHQ0X2Vycm9yKHNiLCAiZXh0NF9mcmVlX2Jsb2NrcyIsCi0JCQkgICAiRnJlZWluZyBibG9ja3MgaW4gc3lzdGVtIHpvbmVzIC0gIgorCQlleHQ0X2Vycm9yKHNiLCBfX2Z1bmNfXywKKwkJCSAgICJBZGRpbmcgYmxvY2tzIGluIHN5c3RlbSB6b25lcyAtICIKIAkJCSAgICJCbG9jayA9ICVsbHUsIGNvdW50ID0gJWx1IiwKIAkJCSAgIGJsb2NrLCBjb3VudCk7CiAJCWdvdG8gZXJyb3JfcmV0dXJuOwogCX0KIAogCS8qCi0JICogV2UgYXJlIGFib3V0IHRvIHN0YXJ0IHJlbGVhc2luZyBibG9ja3MgaW4gdGhlIGJpdG1hcCwKKwkgKiBXZSBhcmUgYWJvdXQgdG8gYWRkIGJsb2NrcyB0byB0aGUgYml0bWFwLAogCSAqIHNvIHdlIG5lZWQgdW5kbyBhY2Nlc3MuCiAJICovCi0JLyogQEBAIGNoZWNrIGVycm9ycyAqLwogCUJVRkZFUl9UUkFDRShiaXRtYXBfYmgsICJnZXR0aW5nIHVuZG8gYWNjZXNzIik7CiAJZXJyID0gZXh0NF9qb3VybmFsX2dldF91bmRvX2FjY2VzcyhoYW5kbGUsIGJpdG1hcF9iaCk7CiAJaWYgKGVycikKQEAgLTQ0NCwxMDcgKzQ0Nyw1NSBAQAogCWVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgZ2RfYmgpOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JamJkX2xvY2tfYmhfc3RhdGUoYml0bWFwX2JoKTsKLQotCWZvciAoaSA9IDAsIGdyb3VwX2ZyZWVkID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJLyoKLQkJICogQW4gSEogc3BlY2lhbC4gIFRoaXMgaXMgZXhwZW5zaXZlLi4uCi0JCSAqLwotI2lmZGVmIENPTkZJR19KQkQyX0RFQlVHCi0JCWpiZF91bmxvY2tfYmhfc3RhdGUoYml0bWFwX2JoKTsKLQkJewotCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpkZWJ1Z19iaDsKLQkJCWRlYnVnX2JoID0gc2JfZmluZF9nZXRfYmxvY2soc2IsIGJsb2NrICsgaSk7Ci0JCQlpZiAoZGVidWdfYmgpIHsKLQkJCQlCVUZGRVJfVFJBQ0UoZGVidWdfYmgsICJEZWxldGVkISIpOwotCQkJCWlmICghYmgyamgoYml0bWFwX2JoKS0+Yl9jb21taXR0ZWRfZGF0YSkKLQkJCQkJQlVGRkVSX1RSQUNFKGRlYnVnX2JoLAotCQkJCQkJIk5vIGNvbW1pdGVkIGRhdGEgaW4gYml0bWFwIik7Ci0JCQkJQlVGRkVSX1RSQUNFMihkZWJ1Z19iaCwgYml0bWFwX2JoLCAiYml0bWFwIik7Ci0JCQkJX19icmVsc2UoZGVidWdfYmgpOwotCQkJfQotCQl9Ci0JCWpiZF9sb2NrX2JoX3N0YXRlKGJpdG1hcF9iaCk7Ci0jZW5kaWYKLQkJaWYgKG5lZWRfcmVzY2hlZCgpKSB7Ci0JCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJpdG1hcF9iaCk7Ci0JCQljb25kX3Jlc2NoZWQoKTsKLQkJCWpiZF9sb2NrX2JoX3N0YXRlKGJpdG1hcF9iaCk7Ci0JCX0KLQkJLyogQEBAIFRoaXMgcHJldmVudHMgbmV3bHktYWxsb2NhdGVkIGRhdGEgZnJvbSBiZWluZwotCQkgKiBmcmVlZCBhbmQgdGhlbiByZWFsbG9jYXRlZCB3aXRoaW4gdGhlIHNhbWUKLQkJICogdHJhbnNhY3Rpb24uCi0JCSAqCi0JCSAqIElkZWFsbHkgd2Ugd291bGQgd2FudCB0byBhbGxvdyB0aGF0IHRvIGhhcHBlbiwgYnV0IHRvCi0JCSAqIGRvIHNvIHJlcXVpcmVzIG1ha2luZyBqYmQyX2pvdXJuYWxfZm9yZ2V0KCkgY2FwYWJsZSBvZgotCQkgKiByZXZva2luZyB0aGUgcXVldWVkIHdyaXRlIG9mIGEgZGF0YSBibG9jaywgd2hpY2gKLQkJICogaW1wbGllcyBibG9ja2luZyBvbiB0aGUgam91cm5hbCBsb2NrLiAgKmZvcmdldCgpCi0JCSAqIGNhbm5vdCBibG9jayBkdWUgdG8gdHJ1bmNhdGUgcmFjZXMuCi0JCSAqCi0JCSAqIEV2ZW50dWFsbHkgd2UgY2FuIGZpeCB0aGlzIGJ5IG1ha2luZyBqYmQyX2pvdXJuYWxfZm9yZ2V0KCkKLQkJICogcmV0dXJuIGEgc3RhdHVzIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgaXQgd2FzIGFibGUKLQkJICogdG8gcmV2b2tlIHRoZSBidWZmZXIuICBPbiBzdWNjZXNzZnVsIHJldm9rZSwgaXQgaXMKLQkJICogc2FmZSBub3QgdG8gc2V0IHRoZSBhbGxvY2F0aW9uIGJpdCBpbiB0aGUgY29tbWl0dGVkCi0JCSAqIGJpdG1hcCwgYmVjYXVzZSB3ZSBrbm93IHRoYXQgdGhlcmUgaXMgbm8gb3V0c3RhbmRpbmcKLQkJICogYWN0aXZpdHkgb24gdGhlIGJ1ZmZlciBhbnkgbW9yZSBhbmQgc28gaXQgaXMgc2FmZSB0bwotCQkgKiByZWFsbG9jYXRlIGl0LgotCQkgKi8KLQkJQlVGRkVSX1RSQUNFKGJpdG1hcF9iaCwgInNldCBpbiBiX2NvbW1pdHRlZF9kYXRhIik7Ci0JCUpfQVNTRVJUX0JIKGJpdG1hcF9iaCwKLQkJCQliaDJqaChiaXRtYXBfYmgpLT5iX2NvbW1pdHRlZF9kYXRhICE9IE5VTEwpOwotCQlleHQ0X3NldF9iaXRfYXRvbWljKHNiX2JnbF9sb2NrKHNiaSwgYmxvY2tfZ3JvdXApLCBiaXQgKyBpLAotCQkJCWJoMmpoKGJpdG1hcF9iaCktPmJfY29tbWl0dGVkX2RhdGEpOwotCi0JCS8qCi0JCSAqIFdlIGNsZWFyIHRoZSBiaXQgaW4gdGhlIGJpdG1hcCBhZnRlciBzZXR0aW5nIHRoZSBjb21taXR0ZWQKLQkJICogZGF0YSBiaXQsIGJlY2F1c2UgdGhpcyBpcyB0aGUgcmV2ZXJzZSBvcmRlciB0byB0aGF0IHdoaWNoCi0JCSAqIHRoZSBhbGxvY2F0b3IgdXNlcy4KLQkJICovCisJLyoKKwkgKiBtYWtlIHN1cmUgd2UgZG9uJ3QgYWxsb3cgYSBwYXJhbGxlbCBpbml0IG9uIG90aGVyIGdyb3VwcyBpbiB0aGUKKwkgKiBzYW1lIGJ1ZGR5IGNhY2hlCisJICovCisJZG93bl93cml0ZSgmZ3JwLT5hbGxvY19zZW0pOworCWZvciAoaSA9IDAsIGJsb2Nrc19mcmVlZCA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAJCUJVRkZFUl9UUkFDRShiaXRtYXBfYmgsICJjbGVhciBiaXQiKTsKIAkJaWYgKCFleHQ0X2NsZWFyX2JpdF9hdG9taWMoc2JfYmdsX2xvY2soc2JpLCBibG9ja19ncm91cCksCiAJCQkJCQliaXQgKyBpLCBiaXRtYXBfYmgtPmJfZGF0YSkpIHsKLQkJCWpiZF91bmxvY2tfYmhfc3RhdGUoYml0bWFwX2JoKTsKIAkJCWV4dDRfZXJyb3Ioc2IsIF9fZnVuY19fLAogCQkJCSAgICJiaXQgYWxyZWFkeSBjbGVhcmVkIGZvciBibG9jayAlbGx1IiwKIAkJCQkgICAoZXh0NF9mc2Jsa190KShibG9jayArIGkpKTsKLQkJCWpiZF9sb2NrX2JoX3N0YXRlKGJpdG1hcF9iaCk7CiAJCQlCVUZGRVJfVFJBQ0UoYml0bWFwX2JoLCAiYml0IGFscmVhZHkgY2xlYXJlZCIpOwogCQl9IGVsc2UgewotCQkJZ3JvdXBfZnJlZWQrKzsKKwkJCWJsb2Nrc19mcmVlZCsrOwogCQl9CiAJfQotCWpiZF91bmxvY2tfYmhfc3RhdGUoYml0bWFwX2JoKTsKLQogCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhzYmksIGJsb2NrX2dyb3VwKSk7Ci0JbGUxNl9hZGRfY3B1KCZkZXNjLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCwgZ3JvdXBfZnJlZWQpOworCWJsa19mcmVlX2NvdW50ID0gYmxvY2tzX2ZyZWVkICsgZXh0NF9mcmVlX2Jsa3NfY291bnQoc2IsIGRlc2MpOworCWV4dDRfZnJlZV9ibGtzX3NldChzYiwgZGVzYywgYmxrX2ZyZWVfY291bnQpOwogCWRlc2MtPmJnX2NoZWNrc3VtID0gZXh0NF9ncm91cF9kZXNjX2NzdW0oc2JpLCBibG9ja19ncm91cCwgZGVzYyk7CiAJc3Bpbl91bmxvY2soc2JfYmdsX2xvY2soc2JpLCBibG9ja19ncm91cCkpOwotCXBlcmNwdV9jb3VudGVyX2FkZCgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlciwgY291bnQpOworCXBlcmNwdV9jb3VudGVyX2FkZCgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlciwgYmxvY2tzX2ZyZWVkKTsKIAogCWlmIChzYmktPnNfbG9nX2dyb3Vwc19wZXJfZmxleCkgewogCQlleHQ0X2dyb3VwX3QgZmxleF9ncm91cCA9IGV4dDRfZmxleF9ncm91cChzYmksIGJsb2NrX2dyb3VwKTsKIAkJc3Bpbl9sb2NrKHNiX2JnbF9sb2NrKHNiaSwgZmxleF9ncm91cCkpOwotCQlzYmktPnNfZmxleF9ncm91cHNbZmxleF9ncm91cF0uZnJlZV9ibG9ja3MgKz0gY291bnQ7CisJCXNiaS0+c19mbGV4X2dyb3Vwc1tmbGV4X2dyb3VwXS5mcmVlX2Jsb2NrcyArPSBibG9ja3NfZnJlZWQ7CiAJCXNwaW5fdW5sb2NrKHNiX2JnbF9sb2NrKHNiaSwgZmxleF9ncm91cCkpOwogCX0KKwkvKgorCSAqIHJlcXVlc3QgdG8gcmVsb2FkIHRoZSBidWRkeSB3aXRoIHRoZQorCSAqIG5ldyBiaXRtYXAgaW5mb3JtYXRpb24KKwkgKi8KKwlzZXRfYml0KEVYVDRfR1JPVVBfSU5GT19ORUVEX0lOSVRfQklULCAmKGdycC0+YmJfc3RhdGUpKTsKKwlleHQ0X21iX3VwZGF0ZV9ncm91cF9pbmZvKGdycCwgYmxvY2tzX2ZyZWVkKTsKKwl1cF93cml0ZSgmZ3JwLT5hbGxvY19zZW0pOwogCiAJLyogV2UgZGlydGllZCB0aGUgYml0bWFwIGJsb2NrICovCiAJQlVGRkVSX1RSQUNFKGJpdG1hcF9iaCwgImRpcnRpZWQgYml0bWFwIGJsb2NrIik7Ci0JZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYml0bWFwX2JoKTsKKwllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIGJpdG1hcF9iaCk7CiAKIAkvKiBBbmQgdGhlIGdyb3VwIGRlc2NyaXB0b3IgYmxvY2sgKi8KIAlCVUZGRVJfVFJBQ0UoZ2RfYmgsICJkaXJ0aWVkIGdyb3VwIGRlc2NyaXB0b3IgYmxvY2siKTsKLQlyZXQgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBnZF9iaCk7Ci0JaWYgKCFlcnIpIGVyciA9IHJldDsKLQkqcGRxdW90X2ZyZWVkX2Jsb2NrcyArPSBncm91cF9mcmVlZDsKLQotCWlmIChvdmVyZmxvdyAmJiAhZXJyKSB7Ci0JCWJsb2NrICs9IGNvdW50OwotCQljb3VudCA9IG92ZXJmbG93OwotCQlnb3RvIGRvX21vcmU7Ci0JfQorCXJldCA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgZ2RfYmgpOworCWlmICghZXJyKQorCQllcnIgPSByZXQ7CiAJc2ItPnNfZGlydCA9IDE7CisKIGVycm9yX3JldHVybjoKIAlicmVsc2UoYml0bWFwX2JoKTsKIAlleHQ0X3N0ZF9lcnJvcihzYiwgZXJyKTsKQEAgLTYxNCw3ICs1NjUsNyBAQAogCQlpZiAoZGlydHlfYmxvY2tzIDwgMCkgewogCQkJcHJpbnRrKEtFUk5fQ1JJVCAiRGlydHkgYmxvY2sgYWNjb3VudGluZyAiCiAJCQkJCSJ3ZW50IHdyb25nICVsbGRcbiIsCi0JCQkJCWRpcnR5X2Jsb2Nrcyk7CisJCQkJCShsb25nIGxvbmcpZGlydHlfYmxvY2tzKTsKIAkJfQogCX0KIAkvKiBDaGVjayB3aGV0aGVyIHdlIGhhdmUgc3BhY2UgYWZ0ZXIKQEAgLTY2NiwxMDEgKzYxNyw0NSBAQAogCXJldHVybiBqYmQyX2pvdXJuYWxfZm9yY2VfY29tbWl0X25lc3RlZChFWFQ0X1NCKHNiKS0+c19qb3VybmFsKTsKIH0KIAotI2RlZmluZSBFWFQ0X01FVEFfQkxPQ0sgMHgxCi0KLXN0YXRpYyBleHQ0X2ZzYmxrX3QgZG9fYmxrX2FsbG9jKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJZXh0NF9sYmxrX3QgaWJsb2NrLCBleHQ0X2ZzYmxrX3QgZ29hbCwKLQkJCQl1bnNpZ25lZCBsb25nICpjb3VudCwgaW50ICplcnJwLCBpbnQgZmxhZ3MpCi17Ci0Jc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9yZXF1ZXN0IGFyOwotCWV4dDRfZnNibGtfdCByZXQ7Ci0KLQltZW1zZXQoJmFyLCAwLCBzaXplb2YoYXIpKTsKLQkvKiBGaWxsIHdpdGggbmVpZ2hib3VyIGFsbG9jYXRlZCBibG9ja3MgKi8KLQotCWFyLmlub2RlID0gaW5vZGU7Ci0JYXIuZ29hbCA9IGdvYWw7Ci0JYXIubGVuID0gKmNvdW50OwotCWFyLmxvZ2ljYWwgPSBpYmxvY2s7Ci0KLQlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJiAhKGZsYWdzICYgRVhUNF9NRVRBX0JMT0NLKSkKLQkJLyogZW5hYmxlIGluLWNvcmUgcHJlYWxsb2NhdGlvbiBmb3IgZGF0YSBibG9jayBhbGxvY2F0aW9uICovCi0JCWFyLmZsYWdzID0gRVhUNF9NQl9ISU5UX0RBVEE7Ci0JZWxzZQotCQkvKiBkaXNhYmxlIGluLWNvcmUgcHJlYWxsb2NhdGlvbiBmb3Igbm9uLXJlZ3VsYXIgZmlsZXMgKi8KLQkJYXIuZmxhZ3MgPSAwOwotCi0JcmV0ID0gZXh0NF9tYl9uZXdfYmxvY2tzKGhhbmRsZSwgJmFyLCBlcnJwKTsKLQkqY291bnQgPSBhci5sZW47Ci0JcmV0dXJuIHJldDsKLX0KLQogLyoKICAqIGV4dDRfbmV3X21ldGFfYmxvY2tzKCkgLS0gYWxsb2NhdGUgYmxvY2sgZm9yIG1ldGEgZGF0YSAoaW5kZXhpbmcpIGJsb2NrcwogICoKICAqIEBoYW5kbGU6ICAgICAgICAgICAgIGhhbmRsZSB0byB0aGlzIHRyYW5zYWN0aW9uCiAgKiBAaW5vZGU6ICAgICAgICAgICAgICBmaWxlIGlub2RlCiAgKiBAZ29hbDogICAgICAgICAgICAgICBnaXZlbiB0YXJnZXQgYmxvY2soZmlsZXN5c3RlbSB3aWRlKQotICogQGNvdW50OgkJdG90YWwgbnVtYmVyIG9mIGJsb2NrcyBuZWVkCisgKiBAY291bnQ6CQlwb2ludGVyIHRvIHRvdGFsIG51bWJlciBvZiBibG9ja3MgbmVlZGVkCiAgKiBAZXJycDogICAgICAgICAgICAgICBlcnJvciBjb2RlCiAgKgotICogUmV0dXJuIDFzdCBhbGxvY2F0ZWQgYmxvY2sgbnVtYmVyb24gc3VjY2VzcywgKmNvdW50IHN0b3JlcyB0b3RhbCBhY2NvdW50CisgKiBSZXR1cm4gMXN0IGFsbG9jYXRlZCBibG9jayBudW1iZXIgb24gc3VjY2VzcywgKmNvdW50IHN0b3JlcyB0b3RhbCBhY2NvdW50CiAgKiBlcnJvciBzdG9yZXMgaW4gZXJycCBwb2ludGVyCiAgKi8KIGV4dDRfZnNibGtfdCBleHQ0X25ld19tZXRhX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQlleHQ0X2ZzYmxrX3QgZ29hbCwgdW5zaWduZWQgbG9uZyAqY291bnQsIGludCAqZXJycCkKIHsKKwlzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX3JlcXVlc3QgYXI7CiAJZXh0NF9mc2Jsa190IHJldDsKLQlyZXQgPSBkb19ibGtfYWxsb2MoaGFuZGxlLCBpbm9kZSwgMCwgZ29hbCwKLQkJCQljb3VudCwgZXJycCwgRVhUNF9NRVRBX0JMT0NLKTsKKworCW1lbXNldCgmYXIsIDAsIHNpemVvZihhcikpOworCS8qIEZpbGwgd2l0aCBuZWlnaGJvdXIgYWxsb2NhdGVkIGJsb2NrcyAqLworCWFyLmlub2RlID0gaW5vZGU7CisJYXIuZ29hbCA9IGdvYWw7CisJYXIubGVuID0gY291bnQgPyAqY291bnQgOiAxOworCisJcmV0ID0gZXh0NF9tYl9uZXdfYmxvY2tzKGhhbmRsZSwgJmFyLCBlcnJwKTsKKwlpZiAoY291bnQpCisJCSpjb3VudCA9IGFyLmxlbjsKKwogCS8qCiAJICogQWNjb3VudCBmb3IgdGhlIGFsbG9jYXRlZCBtZXRhIGJsb2NrcwogCSAqLwogCWlmICghKCplcnJwKSAmJiBFWFQ0X0koaW5vZGUpLT5pX2RlbGFsbG9jX3Jlc2VydmVkX2ZsYWcpIHsKIAkJc3Bpbl9sb2NrKCZFWFQ0X0koaW5vZGUpLT5pX2Jsb2NrX3Jlc2VydmF0aW9uX2xvY2spOwotCQlFWFQ0X0koaW5vZGUpLT5pX2FsbG9jYXRlZF9tZXRhX2Jsb2NrcyArPSAqY291bnQ7CisJCUVYVDRfSShpbm9kZSktPmlfYWxsb2NhdGVkX21ldGFfYmxvY2tzICs9IGFyLmxlbjsKIAkJc3Bpbl91bmxvY2soJkVYVDRfSShpbm9kZSktPmlfYmxvY2tfcmVzZXJ2YXRpb25fbG9jayk7CiAJfQogCXJldHVybiByZXQ7CiB9CiAKLS8qCi0gKiBleHQ0X25ld19tZXRhX2Jsb2NrKCkgLS0gYWxsb2NhdGUgYmxvY2sgZm9yIG1ldGEgZGF0YSAoaW5kZXhpbmcpIGJsb2NrcwotICoKLSAqIEBoYW5kbGU6ICAgICAgICAgICAgIGhhbmRsZSB0byB0aGlzIHRyYW5zYWN0aW9uCi0gKiBAaW5vZGU6ICAgICAgICAgICAgICBmaWxlIGlub2RlCi0gKiBAZ29hbDogICAgICAgICAgICAgICBnaXZlbiB0YXJnZXQgYmxvY2soZmlsZXN5c3RlbSB3aWRlKQotICogQGVycnA6ICAgICAgICAgICAgICAgZXJyb3IgY29kZQotICoKLSAqIFJldHVybiBhbGxvY2F0ZWQgYmxvY2sgbnVtYmVyIG9uIHN1Y2Nlc3MKLSAqLwotZXh0NF9mc2Jsa190IGV4dDRfbmV3X21ldGFfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJZXh0NF9mc2Jsa190IGdvYWwsIGludCAqZXJycCkKLXsKLQl1bnNpZ25lZCBsb25nIGNvdW50ID0gMTsKLQlyZXR1cm4gZXh0NF9uZXdfbWV0YV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgZ29hbCwgJmNvdW50LCBlcnJwKTsKLX0KLQotLyoKLSAqIGV4dDRfbmV3X2Jsb2NrcygpIC0tIGFsbG9jYXRlIGRhdGEgYmxvY2tzCi0gKgotICogQGhhbmRsZTogICAgICAgICAgICAgaGFuZGxlIHRvIHRoaXMgdHJhbnNhY3Rpb24KLSAqIEBpbm9kZTogICAgICAgICAgICAgIGZpbGUgaW5vZGUKLSAqIEBnb2FsOiAgICAgICAgICAgICAgIGdpdmVuIHRhcmdldCBibG9jayhmaWxlc3lzdGVtIHdpZGUpCi0gKiBAY291bnQ6CQl0b3RhbCBudW1iZXIgb2YgYmxvY2tzIG5lZWQKLSAqIEBlcnJwOiAgICAgICAgICAgICAgIGVycm9yIGNvZGUKLSAqCi0gKiBSZXR1cm4gMXN0IGFsbG9jYXRlZCBibG9jayBudW1iZXJvbiBzdWNjZXNzLCAqY291bnQgc3RvcmVzIHRvdGFsIGFjY291bnQKLSAqIGVycm9yIHN0b3JlcyBpbiBlcnJwIHBvaW50ZXIKLSAqLwotCi1leHQ0X2ZzYmxrX3QgZXh0NF9uZXdfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJZXh0NF9sYmxrX3QgaWJsb2NrLCBleHQ0X2ZzYmxrX3QgZ29hbCwKLQkJCQl1bnNpZ25lZCBsb25nICpjb3VudCwgaW50ICplcnJwKQotewotCXJldHVybiBkb19ibGtfYWxsb2MoaGFuZGxlLCBpbm9kZSwgaWJsb2NrLCBnb2FsLCBjb3VudCwgZXJycCwgMCk7Ci19Ci0KIC8qKgogICogZXh0NF9jb3VudF9mcmVlX2Jsb2NrcygpIC0tIGNvdW50IGZpbGVzeXN0ZW0gZnJlZSBibG9ja3MKICAqIEBzYjoJCXN1cGVyYmxvY2sKQEAgLTc3Niw3ICs2NzEsNyBAQAogI2lmZGVmIEVYVDRGU19ERUJVRwogCXN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICplczsKIAlleHQ0X2ZzYmxrX3QgYml0bWFwX2NvdW50OwotCXVuc2lnbmVkIGxvbmcgeDsKKwl1bnNpZ25lZCBpbnQgeDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJpdG1hcF9iaCA9IE5VTEw7CiAKIAllcyA9IEVYVDRfU0Ioc2IpLT5zX2VzOwpAQCAtNzk2LDcgKzY5MSw3IEBACiAJCQljb250aW51ZTsKIAogCQl4ID0gZXh0NF9jb3VudF9mcmVlKGJpdG1hcF9iaCwgc2ItPnNfYmxvY2tzaXplKTsKLQkJcHJpbnRrKEtFUk5fREVCVUcgImdyb3VwICVsdTogc3RvcmVkID0gJWQsIGNvdW50ZWQgPSAlbHVcbiIsCisJCXByaW50ayhLRVJOX0RFQlVHICJncm91cCAlbHU6IHN0b3JlZCA9ICVkLCBjb3VudGVkID0gJXVcbiIsCiAJCQlpLCBsZTE2X3RvX2NwdShnZHAtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KSwgeCk7CiAJCWJpdG1hcF9jb3VudCArPSB4OwogCX0KQEAgLTgxMiw3ICs3MDcsNyBAQAogCQlnZHAgPSBleHQ0X2dldF9ncm91cF9kZXNjKHNiLCBpLCBOVUxMKTsKIAkJaWYgKCFnZHApCiAJCQljb250aW51ZTsKLQkJZGVzY19jb3VudCArPSBsZTE2X3RvX2NwdShnZHAtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KTsKKwkJZGVzY19jb3VudCArPSBleHQ0X2ZyZWVfYmxrc19jb3VudChzYiwgZ2RwKTsKIAl9CiAKIAlyZXR1cm4gZGVzY19jb3VudDsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvYml0bWFwLmMgYi9mcy9leHQ0L2JpdG1hcC5jCmluZGV4IDBhN2E2NjYuLmZhM2FmODEgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvYml0bWFwLmMKKysrIGIvZnMvZXh0NC9iaXRtYXAuYwpAQCAtMTUsMTAgKzE1LDkgQEAKIAogc3RhdGljIGNvbnN0IGludCBuaWJibGVtYXBbXSA9IHs0LCAzLCAzLCAyLCAzLCAyLCAyLCAxLCAzLCAyLCAyLCAxLCAyLCAxLCAxLCAwfTsKIAotdW5zaWduZWQgbG9uZyBleHQ0X2NvdW50X2ZyZWUoc3RydWN0IGJ1ZmZlcl9oZWFkICptYXAsIHVuc2lnbmVkIGludCBudW1jaGFycykKK3Vuc2lnbmVkIGludCBleHQ0X2NvdW50X2ZyZWUoc3RydWN0IGJ1ZmZlcl9oZWFkICptYXAsIHVuc2lnbmVkIGludCBudW1jaGFycykKIHsKLQl1bnNpZ25lZCBpbnQgaTsKLQl1bnNpZ25lZCBsb25nIHN1bSA9IDA7CisJdW5zaWduZWQgaW50IGksIHN1bSA9IDA7CiAKIAlpZiAoIW1hcCkKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9mcy9leHQ0L2Rpci5jIGIvZnMvZXh0NC9kaXIuYwppbmRleCBmZWQ1YjYxLi4yZGYyZTQwIDEwMDY0NAotLS0gYS9mcy9leHQ0L2Rpci5jCisrKyBiL2ZzL2V4dDQvZGlyLmMKQEAgLTY0LDcgKzY0LDcgQEAKIGludCBleHQ0X2NoZWNrX2Rpcl9lbnRyeShjb25zdCBjaGFyICpmdW5jdGlvbiwgc3RydWN0IGlub2RlICpkaXIsCiAJCQkgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlLAogCQkJIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCi0JCQkgdW5zaWduZWQgbG9uZyBvZmZzZXQpCisJCQkgdW5zaWduZWQgaW50IG9mZnNldCkKIHsKIAljb25zdCBjaGFyICplcnJvcl9tc2cgPSBOVUxMOwogCWNvbnN0IGludCBybGVuID0gZXh0NF9yZWNfbGVuX2Zyb21fZGlzayhkZS0+cmVjX2xlbik7CkBAIC04NCw5ICs4NCw5IEBACiAJaWYgKGVycm9yX21zZyAhPSBOVUxMKQogCQlleHQ0X2Vycm9yKGRpci0+aV9zYiwgZnVuY3Rpb24sCiAJCQkiYmFkIGVudHJ5IGluIGRpcmVjdG9yeSAjJWx1OiAlcyAtICIKLQkJCSJvZmZzZXQ9JWx1LCBpbm9kZT0lbHUsIHJlY19sZW49JWQsIG5hbWVfbGVuPSVkIiwKKwkJCSJvZmZzZXQ9JXUsIGlub2RlPSV1LCByZWNfbGVuPSVkLCBuYW1lX2xlbj0lZCIsCiAJCQlkaXItPmlfaW5vLCBlcnJvcl9tc2csIG9mZnNldCwKLQkJCSh1bnNpZ25lZCBsb25nKSBsZTMyX3RvX2NwdShkZS0+aW5vZGUpLAorCQkJbGUzMl90b19jcHUoZGUtPmlub2RlKSwKIAkJCXJsZW4sIGRlLT5uYW1lX2xlbik7CiAJcmV0dXJuIGVycm9yX21zZyA9PSBOVUxMID8gMSA6IDA7CiB9CkBAIC05NSw3ICs5NSw3IEBACiAJCQkgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKIHsKIAlpbnQgZXJyb3IgPSAwOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCXVuc2lnbmVkIGludCBvZmZzZXQ7CiAJaW50IGksIHN0b3JlZDsKIAlzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGU7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKQEAgLTQwNSw3ICs0MDUsNyBAQAogCXNiID0gaW5vZGUtPmlfc2I7CiAKIAlpZiAoIWZuYW1lKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZXh0NDogY2FsbF9maWxsZGlyOiBjYWxsZWQgd2l0aCAiCisJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogY2FsbF9maWxsZGlyOiBjYWxsZWQgd2l0aCAiCiAJCSAgICAgICAibnVsbCBmbmFtZT8hP1xuIik7CiAJCXJldHVybiAwOwogCX0KZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZXh0NC5oIGIvZnMvZXh0NC9leHQ0LmgKaW5kZXggYjA1MzdjOC4uYzY2OGU0MyAxMDA2NDQKLS0tIGEvZnMvZXh0NC9leHQ0LmgKKysrIGIvZnMvZXh0NC9leHQ0LmgKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L21hZ2ljLmg+CisjaW5jbHVkZSA8bGludXgvamJkMi5oPgogI2luY2x1ZGUgImV4dDRfaS5oIgogCiAvKgpAQCAtOTQsOSArOTUsOSBAQAogCS8qIHBoeXMuIGJsb2NrIGZvciBeXl4gKi8KIAlleHQ0X2ZzYmxrX3QgcHJpZ2h0OwogCS8qIGhvdyBtYW55IGJsb2NrcyB3ZSB3YW50IHRvIGFsbG9jYXRlICovCi0JdW5zaWduZWQgbG9uZyBsZW47CisJdW5zaWduZWQgaW50IGxlbjsKIAkvKiBmbGFncy4gc2VlIGFib3ZlIEVYVDRfTUJfSElOVF8qICovCi0JdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CiB9OwogCiAvKgpAQCAtMTU2LDEyICsxNTcsMTIgQEAKIAlfX2xlMzIJYmdfYmxvY2tfYml0bWFwX2xvOwkvKiBCbG9ja3MgYml0bWFwIGJsb2NrICovCiAJX19sZTMyCWJnX2lub2RlX2JpdG1hcF9sbzsJLyogSW5vZGVzIGJpdG1hcCBibG9jayAqLwogCV9fbGUzMgliZ19pbm9kZV90YWJsZV9sbzsJLyogSW5vZGVzIHRhYmxlIGJsb2NrICovCi0JX19sZTE2CWJnX2ZyZWVfYmxvY2tzX2NvdW50OwkvKiBGcmVlIGJsb2NrcyBjb3VudCAqLwotCV9fbGUxNgliZ19mcmVlX2lub2Rlc19jb3VudDsJLyogRnJlZSBpbm9kZXMgY291bnQgKi8KLQlfX2xlMTYJYmdfdXNlZF9kaXJzX2NvdW50OwkvKiBEaXJlY3RvcmllcyBjb3VudCAqLworCV9fbGUxNgliZ19mcmVlX2Jsb2Nrc19jb3VudF9sbzsvKiBGcmVlIGJsb2NrcyBjb3VudCAqLworCV9fbGUxNgliZ19mcmVlX2lub2Rlc19jb3VudF9sbzsvKiBGcmVlIGlub2RlcyBjb3VudCAqLworCV9fbGUxNgliZ191c2VkX2RpcnNfY291bnRfbG87CS8qIERpcmVjdG9yaWVzIGNvdW50ICovCiAJX19sZTE2CWJnX2ZsYWdzOwkJLyogRVhUNF9CR19mbGFncyAoSU5PREVfVU5JTklULCBldGMpICovCiAJX191MzIJYmdfcmVzZXJ2ZWRbMl07CQkvKiBMaWtlbHkgYmxvY2svaW5vZGUgYml0bWFwIGNoZWNrc3VtICovCi0JX19sZTE2ICBiZ19pdGFibGVfdW51c2VkOwkvKiBVbnVzZWQgaW5vZGVzIGNvdW50ICovCisJX19sZTE2ICBiZ19pdGFibGVfdW51c2VkX2xvOwkvKiBVbnVzZWQgaW5vZGVzIGNvdW50ICovCiAJX19sZTE2ICBiZ19jaGVja3N1bTsJCS8qIGNyYzE2KHNiX3V1aWQrZ3JvdXArZGVzYykgKi8KIAlfX2xlMzIJYmdfYmxvY2tfYml0bWFwX2hpOwkvKiBCbG9ja3MgYml0bWFwIGJsb2NrIE1TQiAqLwogCV9fbGUzMgliZ19pbm9kZV9iaXRtYXBfaGk7CS8qIElub2RlcyBiaXRtYXAgYmxvY2sgTVNCICovCkBAIC0xNjksNyArMTcwLDcgQEAKIAlfX2xlMTYJYmdfZnJlZV9ibG9ja3NfY291bnRfaGk7LyogRnJlZSBibG9ja3MgY291bnQgTVNCICovCiAJX19sZTE2CWJnX2ZyZWVfaW5vZGVzX2NvdW50X2hpOy8qIEZyZWUgaW5vZGVzIGNvdW50IE1TQiAqLwogCV9fbGUxNgliZ191c2VkX2RpcnNfY291bnRfaGk7CS8qIERpcmVjdG9yaWVzIGNvdW50IE1TQiAqLwotCV9fbGUxNgliZ19pdGFibGVfdW51c2VkX2hpOwkvKiBVbnVzZWQgaW5vZGVzIGNvdW50IE1TQiAqLworCV9fbGUxNiAgYmdfaXRhYmxlX3VudXNlZF9oaTsgICAgLyogVW51c2VkIGlub2RlcyBjb3VudCBNU0IgKi8KIAlfX3UzMgliZ19yZXNlcnZlZDJbM107CiB9OwogCkBAIC0zMjgsNiArMzI5LDcgQEAKIAl1aWRfdCBzX3Jlc3VpZDsKIAlnaWRfdCBzX3Jlc2dpZDsKIAl1bnNpZ25lZCBsb25nIHNfY29tbWl0X2ludGVydmFsOworCXUzMiBzX21pbl9iYXRjaF90aW1lLCBzX21heF9iYXRjaF90aW1lOwogI2lmZGVmIENPTkZJR19RVU9UQQogCWludCBzX2pxdW90YV9mbXQ7CiAJY2hhciAqc19xZl9uYW1lc1tNQVhRVU9UQVNdOwpAQCAtNTM0LDcgKzUzNiw2IEBACiAjZGVmaW5lIEVYVDRfTU9VTlRfUVVPVEEJCTB4ODAwMDAgLyogU29tZSBxdW90YSBvcHRpb24gc2V0ICovCiAjZGVmaW5lIEVYVDRfTU9VTlRfVVNSUVVPVEEJCTB4MTAwMDAwIC8qICJvbGQiIHVzZXIgcXVvdGEgKi8KICNkZWZpbmUgRVhUNF9NT1VOVF9HUlBRVU9UQQkJMHgyMDAwMDAgLyogIm9sZCIgZ3JvdXAgcXVvdGEgKi8KLSNkZWZpbmUgRVhUNF9NT1VOVF9FWFRFTlRTCQkweDQwMDAwMCAvKiBFeHRlbnRzIHN1cHBvcnQgKi8KICNkZWZpbmUgRVhUNF9NT1VOVF9KT1VSTkFMX0NIRUNLU1VNCTB4ODAwMDAwIC8qIEpvdXJuYWwgY2hlY2tzdW1zICovCiAjZGVmaW5lIEVYVDRfTU9VTlRfSk9VUk5BTF9BU1lOQ19DT01NSVQJMHgxMDAwMDAwIC8qIEpvdXJuYWwgQXN5bmMgQ29tbWl0ICovCiAjZGVmaW5lIEVYVDRfTU9VTlRfSV9WRVJTSU9OICAgICAgICAgICAgMHgyMDAwMDAwIC8qIGlfdmVyc2lvbiBzdXBwb3J0ICovCkBAIC03MjYsMTEgKzcyNywxMSBAQAogICovCiAKICNkZWZpbmUgRVhUNF9IQVNfQ09NUEFUX0ZFQVRVUkUoc2IsbWFzaykJCQlcCi0JKEVYVDRfU0Ioc2IpLT5zX2VzLT5zX2ZlYXR1cmVfY29tcGF0ICYgY3B1X3RvX2xlMzIobWFzaykpCisJKChFWFQ0X1NCKHNiKS0+c19lcy0+c19mZWF0dXJlX2NvbXBhdCAmIGNwdV90b19sZTMyKG1hc2spKSAhPSAwKQogI2RlZmluZSBFWFQ0X0hBU19ST19DT01QQVRfRkVBVFVSRShzYixtYXNrKQkJCVwKLQkoRVhUNF9TQihzYiktPnNfZXMtPnNfZmVhdHVyZV9yb19jb21wYXQgJiBjcHVfdG9fbGUzMihtYXNrKSkKKwkoKEVYVDRfU0Ioc2IpLT5zX2VzLT5zX2ZlYXR1cmVfcm9fY29tcGF0ICYgY3B1X3RvX2xlMzIobWFzaykpICE9IDApCiAjZGVmaW5lIEVYVDRfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsbWFzaykJCQlcCi0JKEVYVDRfU0Ioc2IpLT5zX2VzLT5zX2ZlYXR1cmVfaW5jb21wYXQgJiBjcHVfdG9fbGUzMihtYXNrKSkKKwkoKEVYVDRfU0Ioc2IpLT5zX2VzLT5zX2ZlYXR1cmVfaW5jb21wYXQgJiBjcHVfdG9fbGUzMihtYXNrKSkgIT0gMCkKICNkZWZpbmUgRVhUNF9TRVRfQ09NUEFUX0ZFQVRVUkUoc2IsbWFzaykJCQlcCiAJRVhUNF9TQihzYiktPnNfZXMtPnNfZmVhdHVyZV9jb21wYXQgfD0gY3B1X3RvX2xlMzIobWFzaykKICNkZWZpbmUgRVhUNF9TRVRfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsbWFzaykJCQlcCkBAIC04MDYsNiArODA3LDEyIEBACiAjZGVmaW5lIEVYVDRfREVGTV9KTU9ERV9XQkFDSwkweDAwNjAKIAogLyoKKyAqIERlZmF1bHQgam91cm5hbCBiYXRjaCB0aW1lcworICovCisjZGVmaW5lIEVYVDRfREVGX01JTl9CQVRDSF9USU1FCTAKKyNkZWZpbmUgRVhUNF9ERUZfTUFYX0JBVENIX1RJTUUJMTUwMDAgLyogMTVtcyAqLworCisvKgogICogU3RydWN0dXJlIG9mIGEgZGlyZWN0b3J5IGVudHJ5CiAgKi8KICNkZWZpbmUgRVhUNF9OQU1FX0xFTiAyNTUKQEAgLTg5MSw2ICs4OTgsOSBAQAogI2RlZmluZSBEWF9IQVNIX0xFR0FDWQkJMAogI2RlZmluZSBEWF9IQVNIX0hBTEZfTUQ0CTEKICNkZWZpbmUgRFhfSEFTSF9URUEJCTIKKyNkZWZpbmUgRFhfSEFTSF9MRUdBQ1lfVU5TSUdORUQJMworI2RlZmluZSBEWF9IQVNIX0hBTEZfTUQ0X1VOU0lHTkVECTQKKyNkZWZpbmUgRFhfSEFTSF9URUFfVU5TSUdORUQJCTUKIAogI2lmZGVmIF9fS0VSTkVMX18KIApAQCAtOTU1LDcgKzk2NSw3IEBACiAjZGVmaW5lIEVSUl9CQURfRFhfRElSCS03NTAwMAogCiB2b2lkIGV4dDRfZ2V0X2dyb3VwX25vX2FuZF9vZmZzZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgZXh0NF9mc2Jsa190IGJsb2NrbnIsCi0JCQl1bnNpZ25lZCBsb25nICpibG9ja2dycHAsIGV4dDRfZ3JwYmxrX3QgKm9mZnNldHApOworCQkJZXh0NF9ncm91cF90ICpibG9ja2dycHAsIGV4dDRfZ3JwYmxrX3QgKm9mZnNldHApOwogCiBleHRlcm4gc3RydWN0IHByb2NfZGlyX2VudHJ5ICpleHQ0X3Byb2Nfcm9vdDsKIApAQCAtOTg3LDYgKzk5Nyw5IEBACiAjIGRlZmluZSBBVFRSSUJfTk9SRVQJX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKQogIyBkZWZpbmUgTk9SRVRfQU5ECW5vcmV0dXJuLAogCisvKiBiaXRtYXAuYyAqLworZXh0ZXJuIHVuc2lnbmVkIGludCBleHQ0X2NvdW50X2ZyZWUoc3RydWN0IGJ1ZmZlcl9oZWFkICosIHVuc2lnbmVkKTsKKwogLyogYmFsbG9jLmMgKi8KIGV4dGVybiB1bnNpZ25lZCBpbnQgZXh0NF9ibG9ja19ncm91cChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAogCQkJZXh0NF9mc2Jsa190IGJsb2NrbnIpOwpAQCAtOTk1LDIwICsxMDA4LDE0IEBACiBleHRlcm4gaW50IGV4dDRfYmdfaGFzX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGV4dDRfZ3JvdXBfdCBncm91cCk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBleHQ0X2JnX251bV9nZGIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCWV4dDRfZ3JvdXBfdCBncm91cCk7Ci1leHRlcm4gZXh0NF9mc2Jsa190IGV4dDRfbmV3X21ldGFfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCWV4dDRfZnNibGtfdCBnb2FsLCBpbnQgKmVycnApOwogZXh0ZXJuIGV4dDRfZnNibGtfdCBleHQ0X25ld19tZXRhX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJZXh0NF9mc2Jsa190IGdvYWwsIHVuc2lnbmVkIGxvbmcgKmNvdW50LCBpbnQgKmVycnApOwotZXh0ZXJuIGV4dDRfZnNibGtfdCBleHQ0X25ld19ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkJZXh0NF9sYmxrX3QgaWJsb2NrLCBleHQ0X2ZzYmxrX3QgZ29hbCwKLQkJCQkJdW5zaWduZWQgbG9uZyAqY291bnQsIGludCAqZXJycCk7CiBleHRlcm4gaW50IGV4dDRfY2xhaW1fZnJlZV9ibG9ja3Moc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpLCBzNjQgbmJsb2Nrcyk7CiBleHRlcm4gaW50IGV4dDRfaGFzX2ZyZWVfYmxvY2tzKHN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSwgczY0IG5ibG9ja3MpOwogZXh0ZXJuIHZvaWQgZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJZXh0NF9mc2Jsa190IGJsb2NrLCB1bnNpZ25lZCBsb25nIGNvdW50LCBpbnQgbWV0YWRhdGEpOwotZXh0ZXJuIHZvaWQgZXh0NF9mcmVlX2Jsb2Nrc19zYihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkJCWV4dDRfZnNibGtfdCBibG9jaywgdW5zaWduZWQgbG9uZyBjb3VudCwKLQkJCQl1bnNpZ25lZCBsb25nICpwZHF1b3RfZnJlZWRfYmxvY2tzKTsKK2V4dGVybiB2b2lkIGV4dDRfYWRkX2dyb3VwYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJZXh0NF9mc2Jsa190IGJsb2NrLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKIGV4dGVybiBleHQ0X2ZzYmxrX3QgZXh0NF9jb3VudF9mcmVlX2Jsb2NrcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CiBleHRlcm4gdm9pZCBleHQ0X2NoZWNrX2Jsb2Nrc19iaXRtYXAoc3RydWN0IHN1cGVyX2Jsb2NrICopOwogZXh0ZXJuIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKiBleHQ0X2dldF9ncm91cF9kZXNjKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLApAQCAtMTAxOSw3ICsxMDI2LDcgQEAKIC8qIGRpci5jICovCiBleHRlcm4gaW50IGV4dDRfY2hlY2tfZGlyX2VudHJ5KGNvbnN0IGNoYXIgKiwgc3RydWN0IGlub2RlICosCiAJCQkJc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKiwKLQkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwgdW5zaWduZWQgbG9uZyk7CisJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICosIHVuc2lnbmVkIGludCk7CiBleHRlcm4gaW50IGV4dDRfaHRyZWVfc3RvcmVfZGlyZW50KHN0cnVjdCBmaWxlICpkaXJfZmlsZSwgX191MzIgaGFzaCwKIAkJCQkgICAgX191MzIgbWlub3JfaGFzaCwKIAkJCQkgICAgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRpcmVudCk7CkBAIC0xMDM5LDcgKzEwNDYsNiBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZXh0NF9jb3VudF9mcmVlX2lub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBleHQ0X2NvdW50X2RpcnMoc3RydWN0IHN1cGVyX2Jsb2NrICopOwogZXh0ZXJuIHZvaWQgZXh0NF9jaGVja19pbm9kZXNfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIGV4dDRfY291bnRfZnJlZShzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwgdW5zaWduZWQpOwogCiAvKiBtYmFsbG9jLmMgKi8KIGV4dGVybiBsb25nIGV4dDRfbWJfc3RhdHM7CkBAIC0xMDU0LDEyICsxMDYwLDEzIEBACiBleHRlcm4gdm9pZCBleGl0X2V4dDRfbWJhbGxvYyh2b2lkKTsKIGV4dGVybiB2b2lkIGV4dDRfbWJfZnJlZV9ibG9ja3MoaGFuZGxlX3QgKiwgc3RydWN0IGlub2RlICosCiAJCXVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIGludCwgdW5zaWduZWQgbG9uZyAqKTsKLWV4dGVybiBpbnQgZXh0NF9tYl9hZGRfbW9yZV9ncm91cGluZm8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKK2V4dGVybiBpbnQgZXh0NF9tYl9hZGRfZ3JvdXBpbmZvKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCWV4dDRfZ3JvdXBfdCBpLCBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpkZXNjKTsKIGV4dGVybiB2b2lkIGV4dDRfbWJfdXBkYXRlX2dyb3VwX2luZm8oc3RydWN0IGV4dDRfZ3JvdXBfaW5mbyAqZ3JwLAogCQlleHQ0X2dycGJsa190IGFkZCk7Ci0KLQorZXh0ZXJuIGludCBleHQ0X21iX2dldF9idWRkeV9jYWNoZV9sb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBleHQ0X2dyb3VwX3QpOworZXh0ZXJuIHZvaWQgZXh0NF9tYl9wdXRfYnVkZHlfY2FjaGVfbG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwKKwkJCQkJCWV4dDRfZ3JvdXBfdCwgaW50KTsKIC8qIGlub2RlLmMgKi8KIGludCBleHQ0X2ZvcmdldChoYW5kbGVfdCAqaGFuZGxlLCBpbnQgaXNfbWV0YWRhdGEsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGV4dDRfZnNibGtfdCBibG9ja25yKTsKQEAgLTEwNjksMTAgKzEwNzYsNiBAQAogCQkJCQkJZXh0NF9sYmxrX3QsIGludCwgaW50ICopOwogaW50IGV4dDRfZ2V0X2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGlibG9jaywKIAkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwgaW50IGNyZWF0ZSk7Ci1pbnQgZXh0NF9nZXRfYmxvY2tzX2hhbmRsZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCWV4dDRfbGJsa190IGlibG9jaywgdW5zaWduZWQgbG9uZyBtYXhibG9ja3MsCi0JCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsCi0JCQkJaW50IGNyZWF0ZSwgaW50IGV4dGVuZF9kaXNrc2l6ZSk7CiAKIGV4dGVybiBzdHJ1Y3QgaW5vZGUgKmV4dDRfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdW5zaWduZWQgbG9uZyk7CiBleHRlcm4gaW50ICBleHQ0X3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqLCBpbnQpOwpAQCAtMTEyMyw2ICsxMTI2LDkgQEAKIAlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7CiBleHRlcm4gdm9pZCBleHQ0X3dhcm5pbmcoc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pCiAJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOworZXh0ZXJuIHZvaWQgZXh0NF9ncnBfbG9ja2VkX2Vycm9yKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBleHQ0X2dyb3VwX3QsCisJCQkJY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLikKKwlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDQsIDUpKSk7CiBleHRlcm4gdm9pZCBleHQ0X3VwZGF0ZV9keW5hbWljX3JldihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKIGV4dGVybiBpbnQgZXh0NF91cGRhdGVfY29tcGF0X2ZlYXR1cmUoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCQkJX191MzIgY29tcGF0KTsKQEAgLTExMzYsMTIgKzExNDIsMjggQEAKIAkJCQkgICAgICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZyk7CiBleHRlcm4gZXh0NF9mc2Jsa190IGV4dDRfaW5vZGVfdGFibGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCQkgICAgIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmJnKTsKK2V4dGVybiBfX3UzMiBleHQ0X2ZyZWVfYmxrc19jb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmJnKTsKK2V4dGVybiBfX3UzMiBleHQ0X2ZyZWVfaW5vZGVzX2NvdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmJnKTsKK2V4dGVybiBfX3UzMiBleHQ0X3VzZWRfZGlyc19jb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmJnKTsKK2V4dGVybiBfX3UzMiBleHQ0X2l0YWJsZV91bnVzZWRfY291bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkgICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZyk7CiBleHRlcm4gdm9pZCBleHQ0X2Jsb2NrX2JpdG1hcF9zZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCQkgIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmJnLCBleHQ0X2ZzYmxrX3QgYmxrKTsKIGV4dGVybiB2b2lkIGV4dDRfaW5vZGVfYml0bWFwX3NldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAogCQkJCSAgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqYmcsIGV4dDRfZnNibGtfdCBibGspOwogZXh0ZXJuIHZvaWQgZXh0NF9pbm9kZV90YWJsZV9zZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCQkgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqYmcsIGV4dDRfZnNibGtfdCBibGspOworZXh0ZXJuIHZvaWQgZXh0NF9mcmVlX2Jsa3Nfc2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkgICAgICAgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqYmcsIF9fdTMyIGNvdW50KTsKK2V4dGVybiB2b2lkIGV4dDRfZnJlZV9pbm9kZXNfc2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqYmcsIF9fdTMyIGNvdW50KTsKK2V4dGVybiB2b2lkIGV4dDRfdXNlZF9kaXJzX3NldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmJnLCBfX3UzMiBjb3VudCk7CitleHRlcm4gdm9pZCBleHQ0X2l0YWJsZV91bnVzZWRfc2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICAgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqYmcsIF9fdTMyIGNvdW50KTsKIAogc3RhdGljIGlubGluZSBleHQ0X2ZzYmxrX3QgZXh0NF9ibG9ja3NfY291bnQoc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzKQogewpAQCAtMTIyNSwxMSArMTI0NywxMSBAQAogfSB3aGlsZSAoMCkKIAogI2lmZGVmIENPTkZJR19TTVAKLS8qIEVhY2ggQ1BVIGNhbiBhY2N1bXVsYXRlIEZCQ19CQVRDSCBibG9ja3MgaW4gdGhlaXIgbG9jYWwKKy8qIEVhY2ggQ1BVIGNhbiBhY2N1bXVsYXRlIHBlcmNwdV9jb3VudGVyX2JhdGNoIGJsb2NrcyBpbiB0aGVpciBsb2NhbAogICogY291bnRlcnMuIFNvIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHdlIGhhdmUgZnJlZSBibG9ja3MgbW9yZQotICogdGhhbiBGQkNfQkFUQ0ggICogbnJfY3B1X2lkcy4gQWxzbyBhZGQgYSB3aW5kb3cgb2YgNCB0aW1lcy4KKyAqIHRoYW4gcGVyY3B1X2NvdW50ZXJfYmF0Y2ggICogbnJfY3B1X2lkcy4gQWxzbyBhZGQgYSB3aW5kb3cgb2YgNCB0aW1lcy4KICAqLwotI2RlZmluZSBFWFQ0X0ZSRUVCTE9DS1NfV0FURVJNQVJLICg0ICogKEZCQ19CQVRDSCAqIG5yX2NwdV9pZHMpKQorI2RlZmluZSBFWFQ0X0ZSRUVCTE9DS1NfV0FURVJNQVJLICg0ICogKHBlcmNwdV9jb3VudGVyX2JhdGNoICogbnJfY3B1X2lkcykpCiAjZWxzZQogI2RlZmluZSBFWFQ0X0ZSRUVCTE9DS1NfV0FURVJNQVJLIDAKICNlbmRpZgpAQCAtMTI0Niw2ICsxMjY4LDUwIEBACiAJcmV0dXJuIDsKIH0KIAorc3RydWN0IGV4dDRfZ3JvdXBfaW5mbyB7CisJdW5zaWduZWQgbG9uZyAgIGJiX3N0YXRlOworCXN0cnVjdCByYl9yb290ICBiYl9mcmVlX3Jvb3Q7CisJdW5zaWduZWQgc2hvcnQgIGJiX2ZpcnN0X2ZyZWU7CisJdW5zaWduZWQgc2hvcnQgIGJiX2ZyZWU7CisJdW5zaWduZWQgc2hvcnQgIGJiX2ZyYWdtZW50czsKKwlzdHJ1Y3QgICAgICAgICAgbGlzdF9oZWFkIGJiX3ByZWFsbG9jX2xpc3Q7CisjaWZkZWYgRE9VQkxFX0NIRUNLCisJdm9pZCAgICAgICAgICAgICpiYl9iaXRtYXA7CisjZW5kaWYKKwlzdHJ1Y3Qgcndfc2VtYXBob3JlIGFsbG9jX3NlbTsKKwl1bnNpZ25lZCBzaG9ydCAgYmJfY291bnRlcnNbXTsKK307CisKKyNkZWZpbmUgRVhUNF9HUk9VUF9JTkZPX05FRURfSU5JVF9CSVQJMAorI2RlZmluZSBFWFQ0X0dST1VQX0lORk9fTE9DS0VEX0JJVAkxCisKKyNkZWZpbmUgRVhUNF9NQl9HUlBfTkVFRF9JTklUKGdycCkJXAorCSh0ZXN0X2JpdChFWFQ0X0dST1VQX0lORk9fTkVFRF9JTklUX0JJVCwgJigoZ3JwKS0+YmJfc3RhdGUpKSkKKworc3RhdGljIGlubGluZSB2b2lkIGV4dDRfbG9ja19ncm91cChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBleHQ0X2dyb3VwX3QgZ3JvdXApCit7CisJc3RydWN0IGV4dDRfZ3JvdXBfaW5mbyAqZ3JpbmZvID0gZXh0NF9nZXRfZ3JvdXBfaW5mbyhzYiwgZ3JvdXApOworCisJYml0X3NwaW5fbG9jayhFWFQ0X0dST1VQX0lORk9fTE9DS0VEX0JJVCwgJihncmluZm8tPmJiX3N0YXRlKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X3VubG9ja19ncm91cChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCQlleHQ0X2dyb3VwX3QgZ3JvdXApCit7CisJc3RydWN0IGV4dDRfZ3JvdXBfaW5mbyAqZ3JpbmZvID0gZXh0NF9nZXRfZ3JvdXBfaW5mbyhzYiwgZ3JvdXApOworCisJYml0X3NwaW5fdW5sb2NrKEVYVDRfR1JPVVBfSU5GT19MT0NLRURfQklULCAmKGdyaW5mby0+YmJfc3RhdGUpKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZXh0NF9pc19ncm91cF9sb2NrZWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkJZXh0NF9ncm91cF90IGdyb3VwKQoreworCXN0cnVjdCBleHQ0X2dyb3VwX2luZm8gKmdyaW5mbyA9IGV4dDRfZ2V0X2dyb3VwX2luZm8oc2IsIGdyb3VwKTsKKworCXJldHVybiBiaXRfc3Bpbl9pc19sb2NrZWQoRVhUNF9HUk9VUF9JTkZPX0xPQ0tFRF9CSVQsCisJCQkJCQkmKGdyaW5mby0+YmJfc3RhdGUpKTsKK30KKwogLyoKICAqIElub2RlcyBhbmQgZmlsZXMgb3BlcmF0aW9ucwogICovCkBAIC0xMjcxLDE4ICsxMzM3LDM4IEBACiBleHRlcm4gaW50IGV4dDRfZXh0X2luZGV4X3RyYW5zX2Jsb2NrcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbnJibG9ja3MsCiAJCQkJICAgICAgIGludCBjaHVuayk7CiBleHRlcm4gaW50IGV4dDRfZXh0X2dldF9ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCWV4dDRfbGJsa190IGlibG9jaywKLQkJCXVuc2lnbmVkIGxvbmcgbWF4X2Jsb2Nrcywgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsCi0JCQlpbnQgY3JlYXRlLCBpbnQgZXh0ZW5kX2Rpc2tzaXplKTsKKwkJCSAgICAgICBleHQ0X2xibGtfdCBpYmxvY2ssIHVuc2lnbmVkIGludCBtYXhfYmxvY2tzLAorCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LAorCQkJICAgICAgIGludCBjcmVhdGUsIGludCBleHRlbmRfZGlza3NpemUpOwogZXh0ZXJuIHZvaWQgZXh0NF9leHRfdHJ1bmNhdGUoc3RydWN0IGlub2RlICopOwogZXh0ZXJuIHZvaWQgZXh0NF9leHRfaW5pdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CiBleHRlcm4gdm9pZCBleHQ0X2V4dF9yZWxlYXNlKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKIGV4dGVybiBsb25nIGV4dDRfZmFsbG9jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtb2RlLCBsb2ZmX3Qgb2Zmc2V0LAogCQkJICBsb2ZmX3QgbGVuKTsKIGV4dGVybiBpbnQgZXh0NF9nZXRfYmxvY2tzX3dyYXAoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCXNlY3Rvcl90IGJsb2NrLCB1bnNpZ25lZCBsb25nIG1heF9ibG9ja3MsCisJCQlzZWN0b3JfdCBibG9jaywgdW5zaWduZWQgaW50IG1heF9ibG9ja3MsCiAJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgY3JlYXRlLAogCQkJaW50IGV4dGVuZF9kaXNrc2l6ZSwgaW50IGZsYWcpOworZXh0ZXJuIGludCBleHQ0X2ZpZW1hcChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmllbWFwX2V4dGVudF9pbmZvICpmaWVpbmZvLAorCQkJX191NjQgc3RhcnQsIF9fdTY0IGxlbik7CisKKy8qCisgKiBBZGQgbmV3IG1ldGhvZCB0byB0ZXN0IHdldGhlciBibG9jayBhbmQgaW5vZGUgYml0bWFwcyBhcmUgcHJvcGVybHkKKyAqIGluaXRpYWxpemVkLiBXaXRoIHVuaW5pdF9iZyByZWFkaW5nIHRoZSBibG9jayBmcm9tIGRpc2sgaXMgbm90IGVub3VnaAorICogdG8gbWFyayB0aGUgYml0bWFwIHVwdG9kYXRlLiBXZSBuZWVkIHRvIGFsc28gemVyby1vdXQgdGhlIGJpdG1hcAorICovCisjZGVmaW5lIEJIX0JJVE1BUF9VUFRPREFURSBCSF9KQkRQcml2YXRlU3RhcnQKKworc3RhdGljIGlubGluZSBpbnQgYml0bWFwX3VwdG9kYXRlKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJcmV0dXJuIChidWZmZXJfdXB0b2RhdGUoYmgpICYmCisJCQl0ZXN0X2JpdChCSF9CSVRNQVBfVVBUT0RBVEUsICYoYmgpLT5iX3N0YXRlKSk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2JpdG1hcF91cHRvZGF0ZShzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXNldF9iaXQoQkhfQklUTUFQX1VQVE9EQVRFLCAmKGJoKS0+Yl9zdGF0ZSk7Cit9CisKICNlbmRpZgkvKiBfX0tFUk5FTF9fICovCiAKICNlbmRpZgkvKiBfRVhUNF9IICovCmRpZmYgLS1naXQgYS9mcy9leHQ0L2V4dDRfZXh0ZW50cy5oIGIvZnMvZXh0NC9leHQ0X2V4dGVudHMuaAppbmRleCBiZWM3Y2U1Li4xOGNiNjdiIDEwMDY0NAotLS0gYS9mcy9leHQ0L2V4dDRfZXh0ZW50cy5oCisrKyBiL2ZzL2V4dDQvZXh0NF9leHRlbnRzLmgKQEAgLTE5NCwxMSArMTk0LDYgQEAKIAlyZXR1cm4gbGUxNl90b19jcHUoZXh0X2lub2RlX2hkcihpbm9kZSktPmVoX2RlcHRoKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGV4dDRfZXh0X3RyZWVfY2hhbmdlZChzdHJ1Y3QgaW5vZGUgKmlub2RlKQotewotCUVYVDRfSShpbm9kZSktPmlfZXh0X2dlbmVyYXRpb24rKzsKLX0KLQogc3RhdGljIGlubGluZSB2b2lkCiBleHQ0X2V4dF9pbnZhbGlkYXRlX2NhY2hlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CmRpZmYgLS1naXQgYS9mcy9leHQ0L2V4dDRfaS5oIGIvZnMvZXh0NC9leHQ0X2kuaAppbmRleCA1YzEyNGMwLi5lNjlhY2MxIDEwMDY0NAotLS0gYS9mcy9leHQ0L2V4dDRfaS5oCisrKyBiL2ZzL2V4dDQvZXh0NF9pLmgKQEAgLTMxLDcgKzMxLDcgQEAKIHR5cGVkZWYgX191MzIgZXh0NF9sYmxrX3Q7CiAKIC8qIGRhdGEgdHlwZSBmb3IgYmxvY2sgZ3JvdXAgbnVtYmVyICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgZXh0NF9ncm91cF90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgZXh0NF9ncm91cF90OwogCiAjZGVmaW5lIHJzdl9zdGFydCByc3Zfd2luZG93Ll9yc3Zfc3RhcnQKICNkZWZpbmUgcnN2X2VuZCByc3Zfd2luZG93Ll9yc3ZfZW5kCkBAIC0xMDAsOSArMTAwLDYgQEAKIAkgKi8KIAlsb2ZmX3QJaV9kaXNrc2l6ZTsKIAotCS8qIG9uLWRpc2sgYWRkaXRpb25hbCBsZW5ndGggKi8KLQlfX3UxNiBpX2V4dHJhX2lzaXplOwotCiAJLyoKIAkgKiBpX2RhdGFfc2VtIGlzIGZvciBzZXJpYWxpc2luZyBleHQ0X3RydW5jYXRlKCkgYWdhaW5zdAogCSAqIGV4dDRfZ2V0YmxvY2soKS4gIEluIHRoZSAyLjQgZXh0MiBkZXNpZ24sIGdyZWF0IGNodW5rcyBvZiBpbm9kZSdzCkBAIC0xMTcsNyArMTE0LDYgQEAKIAlzdHJ1Y3QgaW5vZGUgdmZzX2lub2RlOwogCXN0cnVjdCBqYmQyX2lub2RlIGppbm9kZTsKIAotCXVuc2lnbmVkIGxvbmcgaV9leHRfZ2VuZXJhdGlvbjsKIAlzdHJ1Y3QgZXh0NF9leHRfY2FjaGUgaV9jYWNoZWRfZXh0ZW50OwogCS8qCiAJICogRmlsZSBjcmVhdGlvbiB0aW1lLiBJdHMgZnVuY3Rpb24gaXMgc2FtZSBhcyB0aGF0IG9mCkBAIC0xMzAsMTAgKzEyNiwxNCBAQAogCXNwaW5sb2NrX3QgaV9wcmVhbGxvY19sb2NrOwogCiAJLyogYWxsb2NhdGlvbiByZXNlcnZhdGlvbiBpbmZvIGZvciBkZWxhbGxvYyAqLwotCXVuc2lnbmVkIGxvbmcgaV9yZXNlcnZlZF9kYXRhX2Jsb2NrczsKLQl1bnNpZ25lZCBsb25nIGlfcmVzZXJ2ZWRfbWV0YV9ibG9ja3M7Ci0JdW5zaWduZWQgbG9uZyBpX2FsbG9jYXRlZF9tZXRhX2Jsb2NrczsKKwl1bnNpZ25lZCBpbnQgaV9yZXNlcnZlZF9kYXRhX2Jsb2NrczsKKwl1bnNpZ25lZCBpbnQgaV9yZXNlcnZlZF9tZXRhX2Jsb2NrczsKKwl1bnNpZ25lZCBpbnQgaV9hbGxvY2F0ZWRfbWV0YV9ibG9ja3M7CiAJdW5zaWduZWQgc2hvcnQgaV9kZWxhbGxvY19yZXNlcnZlZF9mbGFnOworCisJLyogb24tZGlzayBhZGRpdGlvbmFsIGxlbmd0aCAqLworCV9fdTE2IGlfZXh0cmFfaXNpemU7CisKIAlzcGlubG9ja190IGlfYmxvY2tfcmVzZXJ2YXRpb25fbG9jazsKIH07CiAKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZXh0NF9qYmQyLmMgYi9mcy9leHQ0L2V4dDRfamJkMi5jCmluZGV4IGM3NTM4NGIuLmFkMTNhODQgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZXh0NF9qYmQyLmMKKysrIGIvZnMvZXh0NC9leHQ0X2piZDIuYwpAQCAtNyw1MyArNyw5NiBAQAogaW50IF9fZXh0NF9qb3VybmFsX2dldF91bmRvX2FjY2Vzcyhjb25zdCBjaGFyICp3aGVyZSwgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQogewotCWludCBlcnIgPSBqYmQyX2pvdXJuYWxfZ2V0X3VuZG9fYWNjZXNzKGhhbmRsZSwgYmgpOwotCWlmIChlcnIpCi0JCWV4dDRfam91cm5hbF9hYm9ydF9oYW5kbGUod2hlcmUsIF9fZnVuY19fLCBiaCwgaGFuZGxlLCBlcnIpOworCWludCBlcnIgPSAwOworCisJaWYgKGV4dDRfaGFuZGxlX3ZhbGlkKGhhbmRsZSkpIHsKKwkJZXJyID0gamJkMl9qb3VybmFsX2dldF91bmRvX2FjY2VzcyhoYW5kbGUsIGJoKTsKKwkJaWYgKGVycikKKwkJCWV4dDRfam91cm5hbF9hYm9ydF9oYW5kbGUod2hlcmUsIF9fZnVuY19fLCBiaCwKKwkJCQkJCSAgaGFuZGxlLCBlcnIpOworCX0KIAlyZXR1cm4gZXJyOwogfQogCiBpbnQgX19leHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2Vzcyhjb25zdCBjaGFyICp3aGVyZSwgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQogewotCWludCBlcnIgPSBqYmQyX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJoKTsKLQlpZiAoZXJyKQotCQlleHQ0X2pvdXJuYWxfYWJvcnRfaGFuZGxlKHdoZXJlLCBfX2Z1bmNfXywgYmgsIGhhbmRsZSwgZXJyKTsKKwlpbnQgZXJyID0gMDsKKworCWlmIChleHQ0X2hhbmRsZV92YWxpZChoYW5kbGUpKSB7CisJCWVyciA9IGpiZDJfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYmgpOworCQlpZiAoZXJyKQorCQkJZXh0NF9qb3VybmFsX2Fib3J0X2hhbmRsZSh3aGVyZSwgX19mdW5jX18sIGJoLAorCQkJCQkJICBoYW5kbGUsIGVycik7CisJfQogCXJldHVybiBlcnI7CiB9CiAKIGludCBfX2V4dDRfam91cm5hbF9mb3JnZXQoY29uc3QgY2hhciAqd2hlcmUsIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKLQlpbnQgZXJyID0gamJkMl9qb3VybmFsX2ZvcmdldChoYW5kbGUsIGJoKTsKLQlpZiAoZXJyKQotCQlleHQ0X2pvdXJuYWxfYWJvcnRfaGFuZGxlKHdoZXJlLCBfX2Z1bmNfXywgYmgsIGhhbmRsZSwgZXJyKTsKKwlpbnQgZXJyID0gMDsKKworCWlmIChleHQ0X2hhbmRsZV92YWxpZChoYW5kbGUpKSB7CisJCWVyciA9IGpiZDJfam91cm5hbF9mb3JnZXQoaGFuZGxlLCBiaCk7CisJCWlmIChlcnIpCisJCQlleHQ0X2pvdXJuYWxfYWJvcnRfaGFuZGxlKHdoZXJlLCBfX2Z1bmNfXywgYmgsCisJCQkJCQkgIGhhbmRsZSwgZXJyKTsKKwl9CiAJcmV0dXJuIGVycjsKIH0KIAogaW50IF9fZXh0NF9qb3VybmFsX3Jldm9rZShjb25zdCBjaGFyICp3aGVyZSwgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQlleHQ0X2ZzYmxrX3QgYmxvY2tuciwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKLQlpbnQgZXJyID0gamJkMl9qb3VybmFsX3Jldm9rZShoYW5kbGUsIGJsb2NrbnIsIGJoKTsKLQlpZiAoZXJyKQotCQlleHQ0X2pvdXJuYWxfYWJvcnRfaGFuZGxlKHdoZXJlLCBfX2Z1bmNfXywgYmgsIGhhbmRsZSwgZXJyKTsKKwlpbnQgZXJyID0gMDsKKworCWlmIChleHQ0X2hhbmRsZV92YWxpZChoYW5kbGUpKSB7CisJCWVyciA9IGpiZDJfam91cm5hbF9yZXZva2UoaGFuZGxlLCBibG9ja25yLCBiaCk7CisJCWlmIChlcnIpCisJCQlleHQ0X2pvdXJuYWxfYWJvcnRfaGFuZGxlKHdoZXJlLCBfX2Z1bmNfXywgYmgsCisJCQkJCQkgIGhhbmRsZSwgZXJyKTsKKwl9CiAJcmV0dXJuIGVycjsKIH0KIAogaW50IF9fZXh0NF9qb3VybmFsX2dldF9jcmVhdGVfYWNjZXNzKGNvbnN0IGNoYXIgKndoZXJlLAogCQkJCWhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCiB7Ci0JaW50IGVyciA9IGpiZDJfam91cm5hbF9nZXRfY3JlYXRlX2FjY2VzcyhoYW5kbGUsIGJoKTsKLQlpZiAoZXJyKQotCQlleHQ0X2pvdXJuYWxfYWJvcnRfaGFuZGxlKHdoZXJlLCBfX2Z1bmNfXywgYmgsIGhhbmRsZSwgZXJyKTsKKwlpbnQgZXJyID0gMDsKKworCWlmIChleHQ0X2hhbmRsZV92YWxpZChoYW5kbGUpKSB7CisJCWVyciA9IGpiZDJfam91cm5hbF9nZXRfY3JlYXRlX2FjY2VzcyhoYW5kbGUsIGJoKTsKKwkJaWYgKGVycikKKwkJCWV4dDRfam91cm5hbF9hYm9ydF9oYW5kbGUod2hlcmUsIF9fZnVuY19fLCBiaCwKKwkJCQkJCSAgaGFuZGxlLCBlcnIpOworCX0KIAlyZXR1cm4gZXJyOwogfQogCi1pbnQgX19leHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoY29uc3QgY2hhciAqd2hlcmUsCi0JCQkJaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK2ludCBfX2V4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGNvbnN0IGNoYXIgKndoZXJlLCBoYW5kbGVfdCAqaGFuZGxlLAorCQkJCSBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQogewotCWludCBlcnIgPSBqYmQyX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7Ci0JaWYgKGVycikKLQkJZXh0NF9qb3VybmFsX2Fib3J0X2hhbmRsZSh3aGVyZSwgX19mdW5jX18sIGJoLCBoYW5kbGUsIGVycik7CisJaW50IGVyciA9IDA7CisKKwlpZiAoZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSkgeworCQllcnIgPSBqYmQyX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJCWlmIChlcnIpCisJCQlleHQ0X2pvdXJuYWxfYWJvcnRfaGFuZGxlKHdoZXJlLCBfX2Z1bmNfXywgYmgsCisJCQkJCQkgIGhhbmRsZSwgZXJyKTsKKwl9IGVsc2UgeworCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCWlmIChpbm9kZSAmJiBpbm9kZV9uZWVkc19zeW5jKGlub2RlKSkgeworCQkJc3luY19kaXJ0eV9idWZmZXIoYmgpOworCQkJaWYgKGJ1ZmZlcl9yZXEoYmgpICYmICFidWZmZXJfdXB0b2RhdGUoYmgpKSB7CisJCQkJZXh0NF9lcnJvcihpbm9kZS0+aV9zYiwgX19mdW5jX18sCisJCQkJCSAgICJJTyBlcnJvciBzeW5jaW5nIGlub2RlLCAiCisJCQkJCSAgICJpbm9kZT0lbHUsIGJsb2NrPSVsbHUiLAorCQkJCQkgICBpbm9kZS0+aV9pbm8sCisJCQkJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGJoLT5iX2Jsb2NrbnIpOworCQkJCWVyciA9IC1FSU87CisJCQl9CisJCX0KKwl9CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZXh0NF9qYmQyLmggYi9mcy9leHQ0L2V4dDRfamJkMi5oCmluZGV4IGI0NTVjNjguLmJlMmY0MjYgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZXh0NF9qYmQyLmgKKysrIGIvZnMvZXh0NC9leHQ0X2piZDIuaApAQCAtMzIsOCArMzIsOCBAQAogICogNSBsZXZlbHMgb2YgdHJlZSArIHJvb3Qgd2hpY2ggYXJlIHN0b3JlZCBpbiB0aGUgaW5vZGUuICovCiAKICNkZWZpbmUgRVhUNF9TSU5HTEVEQVRBX1RSQU5TX0JMT0NLUyhzYikJCQkJXAotCShFWFQ0X0hBU19JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfRVhURU5UUykJXAotCQl8fCB0ZXN0X29wdChzYiwgRVhURU5UUykgPyAyN1UgOiA4VSkKKwkoRVhUNF9IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0VYVEVOVFMpICAgXAorCSA/IDI3VSA6IDhVKQogCiAvKiBFeHRlbmRlZCBhdHRyaWJ1dGUgb3BlcmF0aW9ucyB0b3VjaCBhdCBtb3N0IHR3byBkYXRhIGJ1ZmZlcnMsCiAgKiB0d28gYml0bWFwIGJ1ZmZlcnMsIGFuZCB0d28gZ3JvdXAgc3VtbWFyaWVzLCBpbiBhZGRpdGlvbiB0byB0aGUgaW5vZGUKQEAgLTEyMiwxMiArMTIyLDYgQEAKICAqIGJlZW4gZG9uZSB5ZXQuCiAgKi8KIAotc3RhdGljIGlubGluZSB2b2lkIGV4dDRfam91cm5hbF9yZWxlYXNlX2J1ZmZlcihoYW5kbGVfdCAqaGFuZGxlLAotCQkJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKLXsKLQlqYmQyX2pvdXJuYWxfcmVsZWFzZV9idWZmZXIoaGFuZGxlLCBiaCk7Ci19Ci0KIHZvaWQgZXh0NF9qb3VybmFsX2Fib3J0X2hhbmRsZShjb25zdCBjaGFyICpjYWxsZXIsIGNvbnN0IGNoYXIgKmVycl9mbiwKIAkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaGFuZGxlX3QgKmhhbmRsZSwgaW50IGVycik7CiAKQEAgLTE0Niw4ICsxNDAsOCBAQAogaW50IF9fZXh0NF9qb3VybmFsX2dldF9jcmVhdGVfYWNjZXNzKGNvbnN0IGNoYXIgKndoZXJlLAogCQkJCWhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOwogCi1pbnQgX19leHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoY29uc3QgY2hhciAqd2hlcmUsCi0JCQkJaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CitpbnQgX19leHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShjb25zdCBjaGFyICp3aGVyZSwgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQkgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CiAKICNkZWZpbmUgZXh0NF9qb3VybmFsX2dldF91bmRvX2FjY2VzcyhoYW5kbGUsIGJoKSBcCiAJX19leHQ0X2pvdXJuYWxfZ2V0X3VuZG9fYWNjZXNzKF9fZnVuY19fLCAoaGFuZGxlKSwgKGJoKSkKQEAgLTE1NywxNCArMTUxLDU3IEBACiAJX19leHQ0X2pvdXJuYWxfcmV2b2tlKF9fZnVuY19fLCAoaGFuZGxlKSwgKGJsb2NrbnIpLCAoYmgpKQogI2RlZmluZSBleHQ0X2pvdXJuYWxfZ2V0X2NyZWF0ZV9hY2Nlc3MoaGFuZGxlLCBiaCkgXAogCV9fZXh0NF9qb3VybmFsX2dldF9jcmVhdGVfYWNjZXNzKF9fZnVuY19fLCAoaGFuZGxlKSwgKGJoKSkKLSNkZWZpbmUgZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpIFwKLQlfX2V4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShfX2Z1bmNfXywgKGhhbmRsZSksIChiaCkpCiAjZGVmaW5lIGV4dDRfam91cm5hbF9mb3JnZXQoaGFuZGxlLCBiaCkgXAogCV9fZXh0NF9qb3VybmFsX2ZvcmdldChfX2Z1bmNfXywgKGhhbmRsZSksIChiaCkpCisjZGVmaW5lIGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgaW5vZGUsIGJoKSBcCisJX19leHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShfX2Z1bmNfXywgKGhhbmRsZSksIChpbm9kZSksIChiaCkpCiAKIGhhbmRsZV90ICpleHQ0X2pvdXJuYWxfc3RhcnRfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IG5ibG9ja3MpOwogaW50IF9fZXh0NF9qb3VybmFsX3N0b3AoY29uc3QgY2hhciAqd2hlcmUsIGhhbmRsZV90ICpoYW5kbGUpOwogCisjZGVmaW5lIEVYVDRfTk9KT1VSTkFMX0hBTkRMRQkoKGhhbmRsZV90ICopIDB4MSkKKworc3RhdGljIGlubGluZSBpbnQgZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlX3QgKmhhbmRsZSkKK3sKKwlpZiAoaGFuZGxlID09IEVYVDRfTk9KT1VSTkFMX0hBTkRMRSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X2hhbmRsZV9zeW5jKGhhbmRsZV90ICpoYW5kbGUpCit7CisJaWYgKGV4dDRfaGFuZGxlX3ZhbGlkKGhhbmRsZSkpCisJCWhhbmRsZS0+aF9zeW5jID0gMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGV4dDRfaGFuZGxlX3JlbGVhc2VfYnVmZmVyKGhhbmRsZV90ICpoYW5kbGUsCisJCQkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWlmIChleHQ0X2hhbmRsZV92YWxpZChoYW5kbGUpKQorCQlqYmQyX2pvdXJuYWxfcmVsZWFzZV9idWZmZXIoaGFuZGxlLCBiaCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGV4dDRfaGFuZGxlX2lzX2Fib3J0ZWQoaGFuZGxlX3QgKmhhbmRsZSkKK3sKKwlpZiAoZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSkKKwkJcmV0dXJuIGlzX2hhbmRsZV9hYm9ydGVkKGhhbmRsZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGV4dDRfaGFuZGxlX2hhc19lbm91Z2hfY3JlZGl0cyhoYW5kbGVfdCAqaGFuZGxlLCBpbnQgbmVlZGVkKQoreworCWlmIChleHQ0X2hhbmRsZV92YWxpZChoYW5kbGUpICYmIGhhbmRsZS0+aF9idWZmZXJfY3JlZGl0cyA8IG5lZWRlZCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X2pvdXJuYWxfcmVsZWFzZV9idWZmZXIoaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJaWYgKGV4dDRfaGFuZGxlX3ZhbGlkKGhhbmRsZSkpCisJCWpiZDJfam91cm5hbF9yZWxlYXNlX2J1ZmZlcihoYW5kbGUsIGJoKTsKK30KKwogc3RhdGljIGlubGluZSBoYW5kbGVfdCAqZXh0NF9qb3VybmFsX3N0YXJ0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBuYmxvY2tzKQogewogCXJldHVybiBleHQ0X2pvdXJuYWxfc3RhcnRfc2IoaW5vZGUtPmlfc2IsIG5ibG9ja3MpOwpAQCAtMTgwLDI3ICsyMTcsMzcgQEAKIAogc3RhdGljIGlubGluZSBpbnQgZXh0NF9qb3VybmFsX2V4dGVuZChoYW5kbGVfdCAqaGFuZGxlLCBpbnQgbmJsb2NrcykKIHsKLQlyZXR1cm4gamJkMl9qb3VybmFsX2V4dGVuZChoYW5kbGUsIG5ibG9ja3MpOworCWlmIChleHQ0X2hhbmRsZV92YWxpZChoYW5kbGUpKQorCQlyZXR1cm4gamJkMl9qb3VybmFsX2V4dGVuZChoYW5kbGUsIG5ibG9ja3MpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBleHQ0X2pvdXJuYWxfcmVzdGFydChoYW5kbGVfdCAqaGFuZGxlLCBpbnQgbmJsb2NrcykKIHsKLQlyZXR1cm4gamJkMl9qb3VybmFsX3Jlc3RhcnQoaGFuZGxlLCBuYmxvY2tzKTsKKwlpZiAoZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSkKKwkJcmV0dXJuIGpiZDJfam91cm5hbF9yZXN0YXJ0KGhhbmRsZSwgbmJsb2Nrcyk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGV4dDRfam91cm5hbF9ibG9ja3NfcGVyX3BhZ2Uoc3RydWN0IGlub2RlICppbm9kZSkKIHsKLQlyZXR1cm4gamJkMl9qb3VybmFsX2Jsb2Nrc19wZXJfcGFnZShpbm9kZSk7CisJaWYgKEVYVDRfSk9VUk5BTChpbm9kZSkgIT0gTlVMTCkKKwkJcmV0dXJuIGpiZDJfam91cm5hbF9ibG9ja3NfcGVyX3BhZ2UoaW5vZGUpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBleHQ0X2pvdXJuYWxfZm9yY2VfY29tbWl0KGpvdXJuYWxfdCAqam91cm5hbCkKIHsKLQlyZXR1cm4gamJkMl9qb3VybmFsX2ZvcmNlX2NvbW1pdChqb3VybmFsKTsKKwlpZiAoam91cm5hbCkKKwkJcmV0dXJuIGpiZDJfam91cm5hbF9mb3JjZV9jb21taXQoam91cm5hbCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGV4dDRfamJkMl9maWxlX2lub2RlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0JcmV0dXJuIGpiZDJfam91cm5hbF9maWxlX2lub2RlKGhhbmRsZSwgJkVYVDRfSShpbm9kZSktPmppbm9kZSk7CisJaWYgKGV4dDRfaGFuZGxlX3ZhbGlkKGhhbmRsZSkpCisJCXJldHVybiBqYmQyX2pvdXJuYWxfZmlsZV9pbm9kZShoYW5kbGUsICZFWFQ0X0koaW5vZGUpLT5qaW5vZGUpOworCXJldHVybiAwOwogfQogCiAvKiBzdXBlci5jICovCkBAIC0yMDgsNiArMjU1LDggQEAKIAogc3RhdGljIGlubGluZSBpbnQgZXh0NF9zaG91bGRfam91cm5hbF9kYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CisJaWYgKEVYVDRfSk9VUk5BTChpbm9kZSkgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CiAJaWYgKCFTX0lTUkVHKGlub2RlLT5pX21vZGUpKQogCQlyZXR1cm4gMTsKIAlpZiAodGVzdF9vcHQoaW5vZGUtPmlfc2IsIERBVEFfRkxBR1MpID09IEVYVDRfTU9VTlRfSk9VUk5BTF9EQVRBKQpAQCAtMjE5LDYgKzI2OCw4IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IGV4dDRfc2hvdWxkX29yZGVyX2RhdGEoc3RydWN0IGlub2RlICppbm9kZSkKIHsKKwlpZiAoRVhUNF9KT1VSTkFMKGlub2RlKSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKIAlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCiAJCXJldHVybiAwOwogCWlmIChFWFQ0X0koaW5vZGUpLT5pX2ZsYWdzICYgRVhUNF9KT1VSTkFMX0RBVEFfRkwpCkBAIC0yMzAsNiArMjgxLDggQEAKIAogc3RhdGljIGlubGluZSBpbnQgZXh0NF9zaG91bGRfd3JpdGViYWNrX2RhdGEoc3RydWN0IGlub2RlICppbm9kZSkKIHsKKwlpZiAoRVhUNF9KT1VSTkFMKGlub2RlKSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKIAlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCiAJCXJldHVybiAwOwogCWlmIChFWFQ0X0koaW5vZGUpLT5pX2ZsYWdzICYgRVhUNF9KT1VSTkFMX0RBVEFfRkwpCmRpZmYgLS1naXQgYS9mcy9leHQ0L2V4dDRfc2IuaCBiL2ZzL2V4dDQvZXh0NF9zYi5oCmluZGV4IGIyMWYxNjcuLjAzOWI2ZWEgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZXh0NF9zYi5oCisrKyBiL2ZzL2V4dDQvZXh0NF9zYi5oCkBAIC01Nyw2ICs1Nyw3IEBACiAJdTMyIHNfbmV4dF9nZW5lcmF0aW9uOwogCXUzMiBzX2hhc2hfc2VlZFs0XTsKIAlpbnQgc19kZWZfaGFzaF92ZXJzaW9uOworCWludCBzX2hhc2hfdW5zaWduZWQ7CS8qIDMgaWYgaGFzaCBzaG91bGQgYmUgc2lnbmVkLCAwIGlmIG5vdCAqLwogCXN0cnVjdCBwZXJjcHVfY291bnRlciBzX2ZyZWVibG9ja3NfY291bnRlcjsKIAlzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgc19mcmVlaW5vZGVzX2NvdW50ZXI7CiAJc3RydWN0IHBlcmNwdV9jb3VudGVyIHNfZGlyc19jb3VudGVyOwpAQCAtNzMsNiArNzQsOCBAQAogCXN0cnVjdCBqb3VybmFsX3MgKnNfam91cm5hbDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHNfb3JwaGFuOwogCXVuc2lnbmVkIGxvbmcgc19jb21taXRfaW50ZXJ2YWw7CisJdTMyIHNfbWF4X2JhdGNoX3RpbWU7CisJdTMyIHNfbWluX2JhdGNoX3RpbWU7CiAJc3RydWN0IGJsb2NrX2RldmljZSAqam91cm5hbF9iZGV2OwogI2lmZGVmIENPTkZJR19KQkQyX0RFQlVHCiAJc3RydWN0IHRpbWVyX2xpc3QgdHVybl9yb190aW1lcjsJLyogRm9yIHR1cm5pbmcgcmVhZC1vbmx5IChjcmFzaCBzaW11bGF0aW9uKSAqLwpAQCAtMTAxLDcgKzEwNCw4IEBACiAJc3BpbmxvY2tfdCBzX3Jlc2VydmVfbG9jazsKIAlzcGlubG9ja190IHNfbWRfbG9jazsKIAl0aWRfdCBzX2xhc3RfdHJhbnNhY3Rpb247Ci0JdW5zaWduZWQgc2hvcnQgKnNfbWJfb2Zmc2V0cywgKnNfbWJfbWF4czsKKwl1bnNpZ25lZCBzaG9ydCAqc19tYl9vZmZzZXRzOworCXVuc2lnbmVkIGludCAqc19tYl9tYXhzOwogCiAJLyogdHVuYWJsZXMgKi8KIAl1bnNpZ25lZCBsb25nIHNfc3RyaXBlOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9leHRlbnRzLmMgYi9mcy9leHQ0L2V4dGVudHMuYwppbmRleCBlYTJjZTNjLi41NGJmMDYyIDEwMDY0NAotLS0gYS9mcy9leHQ0L2V4dGVudHMuYworKysgYi9mcy9leHQ0L2V4dGVudHMuYwpAQCAtOTcsNiArOTcsOCBAQAogewogCWludCBlcnI7CiAKKwlpZiAoIWV4dDRfaGFuZGxlX3ZhbGlkKGhhbmRsZSkpCisJCXJldHVybiAwOwogCWlmIChoYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHMgPiBuZWVkZWQpCiAJCXJldHVybiAwOwogCWVyciA9IGV4dDRfam91cm5hbF9leHRlbmQoaGFuZGxlLCBuZWVkZWQpOwpAQCAtMTM0LDcgKzEzNiw3IEBACiAJaW50IGVycjsKIAlpZiAocGF0aC0+cF9iaCkgewogCQkvKiBwYXRoIHBvaW50cyB0byBibG9jayAqLwotCQllcnIgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBwYXRoLT5wX2JoKTsKKwkJZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBpbm9kZSwgcGF0aC0+cF9iaCk7CiAJfSBlbHNlIHsKIAkJLyogcGF0aCBwb2ludHMgdG8gbGVhZi9pbmRleCBpbiBpbm9kZSBib2R5ICovCiAJCWVyciA9IGV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKQEAgLTE5MSw3ICsxOTMsNyBAQAogCWV4dDRfZnNibGtfdCBnb2FsLCBuZXdibG9jazsKIAogCWdvYWwgPSBleHQ0X2V4dF9maW5kX2dvYWwoaW5vZGUsIHBhdGgsIGxlMzJfdG9fY3B1KGV4LT5lZV9ibG9jaykpOwotCW5ld2Jsb2NrID0gZXh0NF9uZXdfbWV0YV9ibG9jayhoYW5kbGUsIGlub2RlLCBnb2FsLCBlcnIpOworCW5ld2Jsb2NrID0gZXh0NF9uZXdfbWV0YV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgZ29hbCwgTlVMTCwgZXJyKTsKIAlyZXR1cm4gbmV3YmxvY2s7CiB9CiAKQEAgLTc4MCw3ICs3ODIsNyBAQAogCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwogCXVubG9ja19idWZmZXIoYmgpOwogCi0JZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOworCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgaW5vZGUsIGJoKTsKIAlpZiAoZXJyKQogCQlnb3RvIGNsZWFudXA7CiAJYnJlbHNlKGJoKTsKQEAgLTg1OSw3ICs4NjEsNyBAQAogCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKIAkJdW5sb2NrX2J1ZmZlcihiaCk7CiAKLQkJZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOworCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCBiaCk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIGNsZWFudXA7CiAJCWJyZWxzZShiaCk7CkBAIC05NTUsNyArOTU3LDcgQEAKIAlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKIAl1bmxvY2tfYnVmZmVyKGJoKTsKIAotCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKTsKKwllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCBiaCk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKQEAgLTExNjAsMTUgKzExNjIsMTMgQEAKIAl3aGlsZSAoLS1kZXB0aCA+PSAwKSB7CiAJCWl4ID0gcGF0aFtkZXB0aF0ucF9pZHg7CiAJCWlmIChpeCAhPSBFWFRfTEFTVF9JTkRFWChwYXRoW2RlcHRoXS5wX2hkcikpCi0JCQlicmVhazsKKwkJCWdvdG8gZ290X2luZGV4OwogCX0KIAotCWlmIChkZXB0aCA8IDApIHsKLQkJLyogd2UndmUgZ29uZSB1cCB0byB0aGUgcm9vdCBhbmQKLQkJICogZm91bmQgbm8gaW5kZXggdG8gdGhlIHJpZ2h0ICovCi0JCXJldHVybiAwOwotCX0KKwkvKiB3ZSd2ZSBnb25lIHVwIHRvIHRoZSByb290IGFuZCBmb3VuZCBubyBpbmRleCB0byB0aGUgcmlnaHQgKi8KKwlyZXR1cm4gMDsKIAorZ290X2luZGV4OgogCS8qIHdlJ3ZlIGZvdW5kIGluZGV4IHRvIHRoZSByaWdodCwgbGV0J3MKIAkgKiBmb2xsb3cgaXQgYW5kIGZpbmQgdGhlIGNsb3Nlc3QgYWxsb2NhdGVkCiAJICogYmxvY2sgdG8gdGhlIHJpZ2h0ICovCkBAIC0xMjAxLDcgKzEyMDEsNiBAQAogCSpwaHlzID0gZXh0X3BibG9jayhleCk7CiAJcHV0X2JoKGJoKTsKIAlyZXR1cm4gMDsKLQogfQogCiAvKgpAQCAtMTYyMiw3ICsxNjIxLDYgQEAKIAkJZXh0NF9leHRfZHJvcF9yZWZzKG5wYXRoKTsKIAkJa2ZyZWUobnBhdGgpOwogCX0KLQlleHQ0X2V4dF90cmVlX2NoYW5nZWQoaW5vZGUpOwogCWV4dDRfZXh0X2ludmFsaWRhdGVfY2FjaGUoaW5vZGUpOwogCXJldHVybiBlcnI7CiB9CkBAIC0yMjMzLDcgKzIyMzEsNiBAQAogCQl9CiAJfQogb3V0OgotCWV4dDRfZXh0X3RyZWVfY2hhbmdlZChpbm9kZSk7CiAJZXh0NF9leHRfZHJvcF9yZWZzKHBhdGgpOwogCWtmcmVlKHBhdGgpOwogCWV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7CkBAIC0yMjUwLDcgKzIyNDcsNyBAQAogCSAqIHBvc3NpYmxlIGluaXRpYWxpemF0aW9uIHdvdWxkIGJlIGhlcmUKIAkgKi8KIAotCWlmICh0ZXN0X29wdChzYiwgRVhURU5UUykpIHsKKwlpZiAoRVhUNF9IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0VYVEVOVFMpKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIkVYVDQtZnM6IGZpbGUgZXh0ZW50cyBlbmFibGVkIik7CiAjaWZkZWYgQUdHUkVTU0lWRV9URVNUCiAJCXByaW50aygiLCBhZ2dyZXNzaXZlIHRlc3RzIik7CkBAIC0yMjc1LDcgKzIyNzIsNyBAQAogICovCiB2b2lkIGV4dDRfZXh0X3JlbGVhc2Uoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKLQlpZiAoIXRlc3Rfb3B0KHNiLCBFWFRFTlRTKSkKKwlpZiAoIUVYVDRfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9FWFRFTlRTKSkKIAkJcmV0dXJuOwogCiAjaWZkZWYgRVhURU5UU19TVEFUUwpAQCAtMjM4MCw3ICsyMzc3LDcgQEAKIAkJCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJCQlzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCwKIAkJCQkJCWV4dDRfbGJsa190IGlibG9jaywKLQkJCQkJCXVuc2lnbmVkIGxvbmcgbWF4X2Jsb2NrcykKKwkJCQkJCXVuc2lnbmVkIGludCBtYXhfYmxvY2tzKQogewogCXN0cnVjdCBleHQ0X2V4dGVudCAqZXgsIG5ld2V4LCBvcmlnX2V4OwogCXN0cnVjdCBleHQ0X2V4dGVudCAqZXgxID0gTlVMTDsKQEAgLTI1MzYsNyArMjUzMyw3IEBACiAJCSAqLwogCQluZXdkZXB0aCA9IGV4dF9kZXB0aChpbm9kZSk7CiAJCS8qCi0JCSAqIHVwZGF0ZSB0aGUgZXh0ZW50IGxlbmd0aCBhZnRlciBzdWNjZXNzZnVsbCBpbnNlcnQgb2YgdGhlCisJCSAqIHVwZGF0ZSB0aGUgZXh0ZW50IGxlbmd0aCBhZnRlciBzdWNjZXNzZnVsIGluc2VydCBvZiB0aGUKIAkJICogc3BsaXQgZXh0ZW50CiAJCSAqLwogCQlvcmlnX2V4LmVlX2xlbiA9IGNwdV90b19sZTE2KGVlX2xlbiAtCkBAIC0yNjc4LDI2ICsyNjc1LDI2IEBACiAgKi8KIGludCBleHQ0X2V4dF9nZXRfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQlleHQ0X2xibGtfdCBpYmxvY2ssCi0JCQl1bnNpZ25lZCBsb25nIG1heF9ibG9ja3MsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LAorCQkJdW5zaWduZWQgaW50IG1heF9ibG9ja3MsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LAogCQkJaW50IGNyZWF0ZSwgaW50IGV4dGVuZF9kaXNrc2l6ZSkKIHsKIAlzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCA9IE5VTEw7CiAJc3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlciAqZWg7CiAJc3RydWN0IGV4dDRfZXh0ZW50IG5ld2V4LCAqZXg7Ci0JZXh0NF9mc2Jsa190IGdvYWwsIG5ld2Jsb2NrOwotCWludCBlcnIgPSAwLCBkZXB0aCwgcmV0OwotCXVuc2lnbmVkIGxvbmcgYWxsb2NhdGVkID0gMDsKKwlleHQ0X2ZzYmxrX3QgbmV3YmxvY2s7CisJaW50IGVyciA9IDAsIGRlcHRoLCByZXQsIGNhY2hlX3R5cGU7CisJdW5zaWduZWQgaW50IGFsbG9jYXRlZCA9IDA7CiAJc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9yZXF1ZXN0IGFyOwogCWxvZmZfdCBkaXNrc2l6ZTsKIAogCV9fY2xlYXJfYml0KEJIX05ldywgJmJoX3Jlc3VsdC0+Yl9zdGF0ZSk7Ci0JZXh0X2RlYnVnKCJibG9ja3MgJXUvJWx1IHJlcXVlc3RlZCBmb3IgaW5vZGUgJXVcbiIsCisJZXh0X2RlYnVnKCJibG9ja3MgJXUvJXUgcmVxdWVzdGVkIGZvciBpbm9kZSAldVxuIiwKIAkJCWlibG9jaywgbWF4X2Jsb2NrcywgaW5vZGUtPmlfaW5vKTsKIAogCS8qIGNoZWNrIGluIGNhY2hlICovCi0JZ29hbCA9IGV4dDRfZXh0X2luX2NhY2hlKGlub2RlLCBpYmxvY2ssICZuZXdleCk7Ci0JaWYgKGdvYWwpIHsKLQkJaWYgKGdvYWwgPT0gRVhUNF9FWFRfQ0FDSEVfR0FQKSB7CisJY2FjaGVfdHlwZSA9IGV4dDRfZXh0X2luX2NhY2hlKGlub2RlLCBpYmxvY2ssICZuZXdleCk7CisJaWYgKGNhY2hlX3R5cGUpIHsKKwkJaWYgKGNhY2hlX3R5cGUgPT0gRVhUNF9FWFRfQ0FDSEVfR0FQKSB7CiAJCQlpZiAoIWNyZWF0ZSkgewogCQkJCS8qCiAJCQkJICogYmxvY2sgaXNuJ3QgYWxsb2NhdGVkIHlldCBhbmQKQEAgLTI3MDYsNyArMjcwMyw3IEBACiAJCQkJZ290byBvdXQyOwogCQkJfQogCQkJLyogd2Ugc2hvdWxkIGFsbG9jYXRlIHJlcXVlc3RlZCBibG9jayAqLwotCQl9IGVsc2UgaWYgKGdvYWwgPT0gRVhUNF9FWFRfQ0FDSEVfRVhURU5UKSB7CisJCX0gZWxzZSBpZiAoY2FjaGVfdHlwZSA9PSBFWFQ0X0VYVF9DQUNIRV9FWFRFTlQpIHsKIAkJCS8qIGJsb2NrIGlzIGFscmVhZHkgYWxsb2NhdGVkICovCiAJCQluZXdibG9jayA9IGlibG9jawogCQkJCSAgIC0gbGUzMl90b19jcHUobmV3ZXguZWVfYmxvY2spCkBAIC0yODU0LDcgKzI4NTEsNyBAQAogCWlmICghbmV3YmxvY2spCiAJCWdvdG8gb3V0MjsKIAlleHRfZGVidWcoImFsbG9jYXRlIG5ldyBibG9jazogZ29hbCAlbGx1LCBmb3VuZCAlbGx1LyVsdVxuIiwKLQkJCWdvYWwsIG5ld2Jsb2NrLCBhbGxvY2F0ZWQpOworCQkgIGFyLmdvYWwsIG5ld2Jsb2NrLCBhbGxvY2F0ZWQpOwogCiAJLyogdHJ5IHRvIGluc2VydCBuZXcgZXh0ZW50IGludG8gZm91bmQgbGVhZiBhbmQgcmV0dXJuICovCiAJZXh0NF9leHRfc3RvcmVfcGJsb2NrKCZuZXdleCwgbmV3YmxvY2spOwpAQCAtMjk1MCw3ICsyOTQ3LDcgQEAKIAkgKiB0cmFuc2FjdGlvbiBzeW5jaHJvbm91cy4KIAkgKi8KIAlpZiAoSVNfU1lOQyhpbm9kZSkpCi0JCWhhbmRsZS0+aF9zeW5jID0gMTsKKwkJZXh0NF9oYW5kbGVfc3luYyhoYW5kbGUpOwogCiBvdXRfc3RvcDoKIAl1cF93cml0ZSgmRVhUNF9JKGlub2RlKS0+aV9kYXRhX3NlbSk7CkBAIC0zMDA0LDcgKzMwMDEsNyBAQAogCWhhbmRsZV90ICpoYW5kbGU7CiAJZXh0NF9sYmxrX3QgYmxvY2s7CiAJbG9mZl90IG5ld19zaXplOwotCXVuc2lnbmVkIGxvbmcgbWF4X2Jsb2NrczsKKwl1bnNpZ25lZCBpbnQgbWF4X2Jsb2NrczsKIAlpbnQgcmV0ID0gMDsKIAlpbnQgcmV0MiA9IDA7CiAJaW50IHJldHJpZXMgPSAwOwpAQCAtMzA4Myw3ICszMDgwLDcgQEAKIC8qCiAgKiBDYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgZm9yIGVhY2ggZXh0ZW50IHRvIGdhdGhlciBGSUVNQVAgaW5mb3JtYXRpb24uCiAgKi8KLWludCBleHQ0X2V4dF9maWVtYXBfY2Ioc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgsCitzdGF0aWMgaW50IGV4dDRfZXh0X2ZpZW1hcF9jYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCwKIAkJICAgICAgIHN0cnVjdCBleHQ0X2V4dF9jYWNoZSAqbmV3ZXgsIHN0cnVjdCBleHQ0X2V4dGVudCAqZXgsCiAJCSAgICAgICB2b2lkICpkYXRhKQogewpAQCAtMzE1Miw3ICszMTQ5LDggQEAKIC8qIGZpZW1hcCBmbGFncyB3ZSBjYW4gaGFuZGxlIHNwZWNpZmllZCBoZXJlICovCiAjZGVmaW5lIEVYVDRfRklFTUFQX0ZMQUdTCShGSUVNQVBfRkxBR19TWU5DfEZJRU1BUF9GTEFHX1hBVFRSKQogCi1pbnQgZXh0NF94YXR0cl9maWVtYXAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpZW1hcF9leHRlbnRfaW5mbyAqZmllaW5mbykKK3N0YXRpYyBpbnQgZXh0NF94YXR0cl9maWVtYXAoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQlzdHJ1Y3QgZmllbWFwX2V4dGVudF9pbmZvICpmaWVpbmZvKQogewogCV9fdTY0IHBoeXNpY2FsID0gMDsKIAlfX3U2NCBsZW5ndGg7CmRpZmYgLS1naXQgYS9mcy9leHQ0L2ZpbGUuYyBiL2ZzL2V4dDQvZmlsZS5jCmluZGV4IDZiZDExZmIuLmY3MzFjYjUgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZmlsZS5jCisrKyBiL2ZzL2V4dDQvZmlsZS5jCkBAIC0xNDAsOSArMTQwLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotZXh0ZXJuIGludCBleHQ0X2ZpZW1hcChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmllbWFwX2V4dGVudF9pbmZvICpmaWVpbmZvLAotCQlfX3U2NCBzdGFydCwgX191NjQgbGVuKTsKLQogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBleHQ0X2ZpbGVfb3BlcmF0aW9ucyA9IHsKIAkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCiAJLnJlYWQJCT0gZG9fc3luY19yZWFkLApkaWZmIC0tZ2l0IGEvZnMvZXh0NC9oYXNoLmMgYi9mcy9leHQ0L2hhc2guYwppbmRleCA1NTZjYThlLi5hYzhmMTY4IDEwMDY0NAotLS0gYS9mcy9leHQ0L2hhc2guYworKysgYi9mcy9leHQ0L2hhc2guYwpAQCAtMzUsMjMgKzM1LDQzIEBACiAKIAogLyogVGhlIG9sZCBsZWdhY3kgaGFzaCAqLwotc3RhdGljIF9fdTMyIGR4X2hhY2tfaGFzaChjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuKQorc3RhdGljIF9fdTMyIGR4X2hhY2tfaGFzaF91bnNpZ25lZChjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuKQogewotCV9fdTMyIGhhc2gwID0gMHgxMmEzZmUyZCwgaGFzaDEgPSAweDM3YWJlOGY5OwotCXdoaWxlIChsZW4tLSkgewotCQlfX3UzMiBoYXNoID0gaGFzaDEgKyAoaGFzaDAgXiAoKm5hbWUrKyAqIDcxNTIzNzMpKTsKKwlfX3UzMiBoYXNoLCBoYXNoMCA9IDB4MTJhM2ZlMmQsIGhhc2gxID0gMHgzN2FiZThmOTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICp1Y3AgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBuYW1lOwogCi0JCWlmIChoYXNoICYgMHg4MDAwMDAwMCkgaGFzaCAtPSAweDdmZmZmZmZmOworCXdoaWxlIChsZW4tLSkgeworCQloYXNoID0gaGFzaDEgKyAoaGFzaDAgXiAoKChpbnQpICp1Y3ArKykgKiA3MTUyMzczKSk7CisKKwkJaWYgKGhhc2ggJiAweDgwMDAwMDAwKQorCQkJaGFzaCAtPSAweDdmZmZmZmZmOwogCQloYXNoMSA9IGhhc2gwOwogCQloYXNoMCA9IGhhc2g7CiAJfQotCXJldHVybiAoaGFzaDAgPDwgMSk7CisJcmV0dXJuIGhhc2gwIDw8IDE7CiB9CiAKLXN0YXRpYyB2b2lkIHN0cjJoYXNoYnVmKGNvbnN0IGNoYXIgKm1zZywgaW50IGxlbiwgX191MzIgKmJ1ZiwgaW50IG51bSkKK3N0YXRpYyBfX3UzMiBkeF9oYWNrX2hhc2hfc2lnbmVkKGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4pCit7CisJX191MzIgaGFzaCwgaGFzaDAgPSAweDEyYTNmZTJkLCBoYXNoMSA9IDB4MzdhYmU4Zjk7CisJY29uc3Qgc2lnbmVkIGNoYXIgKnNjcCA9IChjb25zdCBzaWduZWQgY2hhciAqKSBuYW1lOworCisJd2hpbGUgKGxlbi0tKSB7CisJCWhhc2ggPSBoYXNoMSArIChoYXNoMCBeICgoKGludCkgKnNjcCsrKSAqIDcxNTIzNzMpKTsKKworCQlpZiAoaGFzaCAmIDB4ODAwMDAwMDApCisJCQloYXNoIC09IDB4N2ZmZmZmZmY7CisJCWhhc2gxID0gaGFzaDA7CisJCWhhc2gwID0gaGFzaDsKKwl9CisJcmV0dXJuIGhhc2gwIDw8IDE7Cit9CisKK3N0YXRpYyB2b2lkIHN0cjJoYXNoYnVmX3NpZ25lZChjb25zdCBjaGFyICptc2csIGludCBsZW4sIF9fdTMyICpidWYsIGludCBudW0pCiB7CiAJX191MzIJcGFkLCB2YWw7CiAJaW50CWk7CisJY29uc3Qgc2lnbmVkIGNoYXIgKnNjcCA9IChjb25zdCBzaWduZWQgY2hhciAqKSBtc2c7CiAKIAlwYWQgPSAoX191MzIpbGVuIHwgKChfX3UzMilsZW4gPDwgOCk7CiAJcGFkIHw9IHBhZCA8PCAxNjsKQEAgLTYyLDcgKzgyLDM1IEBACiAJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAJCWlmICgoaSAlIDQpID09IDApCiAJCQl2YWwgPSBwYWQ7Ci0JCXZhbCA9IG1zZ1tpXSArICh2YWwgPDwgOCk7CisJCXZhbCA9ICgoaW50KSBzY3BbaV0pICsgKHZhbCA8PCA4KTsKKwkJaWYgKChpICUgNCkgPT0gMykgeworCQkJKmJ1ZisrID0gdmFsOworCQkJdmFsID0gcGFkOworCQkJbnVtLS07CisJCX0KKwl9CisJaWYgKC0tbnVtID49IDApCisJCSpidWYrKyA9IHZhbDsKKwl3aGlsZSAoLS1udW0gPj0gMCkKKwkJKmJ1ZisrID0gcGFkOworfQorCitzdGF0aWMgdm9pZCBzdHIyaGFzaGJ1Zl91bnNpZ25lZChjb25zdCBjaGFyICptc2csIGludCBsZW4sIF9fdTMyICpidWYsIGludCBudW0pCit7CisJX191MzIJcGFkLCB2YWw7CisJaW50CWk7CisJY29uc3QgdW5zaWduZWQgY2hhciAqdWNwID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgbXNnOworCisJcGFkID0gKF9fdTMyKWxlbiB8ICgoX191MzIpbGVuIDw8IDgpOworCXBhZCB8PSBwYWQgPDwgMTY7CisKKwl2YWwgPSBwYWQ7CisJaWYgKGxlbiA+IG51bSo0KQorCQlsZW4gPSBudW0gKiA0OworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlpZiAoKGkgJSA0KSA9PSAwKQorCQkJdmFsID0gcGFkOworCQl2YWwgPSAoKGludCkgdWNwW2ldKSArICh2YWwgPDwgOCk7CiAJCWlmICgoaSAlIDQpID09IDMpIHsKIAkJCSpidWYrKyA9IHZhbDsKIAkJCXZhbCA9IHBhZDsKQEAgLTk1LDYgKzE0Myw4IEBACiAJY29uc3QgY2hhcgkqcDsKIAlpbnQJCWk7CiAJX191MzIJCWluWzhdLCBidWZbNF07CisJdm9pZAkJKCpzdHIyaGFzaGJ1ZikoY29uc3QgY2hhciAqLCBpbnQsIF9fdTMyICosIGludCkgPQorCQkJCXN0cjJoYXNoYnVmX3NpZ25lZDsKIAogCS8qIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgc2VlZCBmb3IgdGhlIGhhc2ggY2hlY2tzdW0gZnVuY3Rpb25zICovCiAJYnVmWzBdID0gMHg2NzQ1MjMwMTsKQEAgLTExMywxMyArMTYzLDE4IEBACiAJfQogCiAJc3dpdGNoIChoaW5mby0+aGFzaF92ZXJzaW9uKSB7Ci0JY2FzZSBEWF9IQVNIX0xFR0FDWToKLQkJaGFzaCA9IGR4X2hhY2tfaGFzaChuYW1lLCBsZW4pOworCWNhc2UgRFhfSEFTSF9MRUdBQ1lfVU5TSUdORUQ6CisJCWhhc2ggPSBkeF9oYWNrX2hhc2hfdW5zaWduZWQobmFtZSwgbGVuKTsKIAkJYnJlYWs7CisJY2FzZSBEWF9IQVNIX0xFR0FDWToKKwkJaGFzaCA9IGR4X2hhY2tfaGFzaF9zaWduZWQobmFtZSwgbGVuKTsKKwkJYnJlYWs7CisJY2FzZSBEWF9IQVNIX0hBTEZfTUQ0X1VOU0lHTkVEOgorCQlzdHIyaGFzaGJ1ZiA9IHN0cjJoYXNoYnVmX3Vuc2lnbmVkOwogCWNhc2UgRFhfSEFTSF9IQUxGX01ENDoKIAkJcCA9IG5hbWU7CiAJCXdoaWxlIChsZW4gPiAwKSB7Ci0JCQlzdHIyaGFzaGJ1ZihwLCBsZW4sIGluLCA4KTsKKwkJCSgqc3RyMmhhc2hidWYpKHAsIGxlbiwgaW4sIDgpOwogCQkJaGFsZl9tZDRfdHJhbnNmb3JtKGJ1ZiwgaW4pOwogCQkJbGVuIC09IDMyOwogCQkJcCArPSAzMjsKQEAgLTEyNywxMCArMTgyLDEyIEBACiAJCW1pbm9yX2hhc2ggPSBidWZbMl07CiAJCWhhc2ggPSBidWZbMV07CiAJCWJyZWFrOworCWNhc2UgRFhfSEFTSF9URUFfVU5TSUdORUQ6CisJCXN0cjJoYXNoYnVmID0gc3RyMmhhc2hidWZfdW5zaWduZWQ7CiAJY2FzZSBEWF9IQVNIX1RFQToKIAkJcCA9IG5hbWU7CiAJCXdoaWxlIChsZW4gPiAwKSB7Ci0JCQlzdHIyaGFzaGJ1ZihwLCBsZW4sIGluLCA0KTsKKwkJCSgqc3RyMmhhc2hidWYpKHAsIGxlbiwgaW4sIDQpOwogCQkJVEVBX3RyYW5zZm9ybShidWYsIGluKTsKIAkJCWxlbiAtPSAxNjsKIAkJCXAgKz0gMTY7CmRpZmYgLS1naXQgYS9mcy9leHQ0L2lhbGxvYy5jIGIvZnMvZXh0NC9pYWxsb2MuYwppbmRleCA2ZTYwNTI4Li40ZmI4NmEwIDEwMDY0NAotLS0gYS9mcy9leHQ0L2lhbGxvYy5jCisrKyBiL2ZzL2V4dDQvaWFsbG9jLmMKQEAgLTc0LDE3ICs3NCwxNyBAQAogCS8qIElmIGNoZWNrc3VtIGlzIGJhZCBtYXJrIGFsbCBibG9ja3MgYW5kIGlub2RlcyB1c2UgdG8gcHJldmVudAogCSAqIGFsbG9jYXRpb24sIGVzc2VudGlhbGx5IGltcGxlbWVudGluZyBhIHBlci1ncm91cCByZWFkLW9ubHkgZmxhZy4gKi8KIAlpZiAoIWV4dDRfZ3JvdXBfZGVzY19jc3VtX3ZlcmlmeShzYmksIGJsb2NrX2dyb3VwLCBnZHApKSB7Ci0JCWV4dDRfZXJyb3Ioc2IsIF9fZnVuY19fLCAiQ2hlY2tzdW0gYmFkIGZvciBncm91cCAlbHVcbiIsCisJCWV4dDRfZXJyb3Ioc2IsIF9fZnVuY19fLCAiQ2hlY2tzdW0gYmFkIGZvciBncm91cCAldSIsCiAJCQkgICBibG9ja19ncm91cCk7Ci0JCWdkcC0+YmdfZnJlZV9ibG9ja3NfY291bnQgPSAwOwotCQlnZHAtPmJnX2ZyZWVfaW5vZGVzX2NvdW50ID0gMDsKLQkJZ2RwLT5iZ19pdGFibGVfdW51c2VkID0gMDsKKwkJZXh0NF9mcmVlX2Jsa3Nfc2V0KHNiLCBnZHAsIDApOworCQlleHQ0X2ZyZWVfaW5vZGVzX3NldChzYiwgZ2RwLCAwKTsKKwkJZXh0NF9pdGFibGVfdW51c2VkX3NldChzYiwgZ2RwLCAwKTsKIAkJbWVtc2V0KGJoLT5iX2RhdGEsIDB4ZmYsIHNiLT5zX2Jsb2Nrc2l6ZSk7CiAJCXJldHVybiAwOwogCX0KIAogCW1lbXNldChiaC0+Yl9kYXRhLCAwLCAoRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKSArIDcpIC8gOCk7Ci0JbWFya19iaXRtYXBfZW5kKEVYVDRfSU5PREVTX1BFUl9HUk9VUChzYiksIEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYiksCisJbWFya19iaXRtYXBfZW5kKEVYVDRfSU5PREVTX1BFUl9HUk9VUChzYiksIHNiLT5zX2Jsb2Nrc2l6ZSAqIDgsCiAJCQliaC0+Yl9kYXRhKTsKIAogCXJldHVybiBFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpOwpAQCAtMTExLDI5ICsxMTEsNDkgQEAKIAlpZiAodW5saWtlbHkoIWJoKSkgewogCQlleHQ0X2Vycm9yKHNiLCBfX2Z1bmNfXywKIAkJCSAgICAiQ2Fubm90IHJlYWQgaW5vZGUgYml0bWFwIC0gIgotCQkJICAgICJibG9ja19ncm91cCA9ICVsdSwgaW5vZGVfYml0bWFwID0gJWxsdSIsCisJCQkgICAgImJsb2NrX2dyb3VwID0gJXUsIGlub2RlX2JpdG1hcCA9ICVsbHUiLAogCQkJICAgIGJsb2NrX2dyb3VwLCBiaXRtYXBfYmxrKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCWlmIChidWZmZXJfdXB0b2RhdGUoYmgpICYmCi0JICAgICEoZGVzYy0+YmdfZmxhZ3MgJiBjcHVfdG9fbGUxNihFWFQ0X0JHX0lOT0RFX1VOSU5JVCkpKQorCWlmIChiaXRtYXBfdXB0b2RhdGUoYmgpKQogCQlyZXR1cm4gYmg7CiAKIAlsb2NrX2J1ZmZlcihiaCk7CisJaWYgKGJpdG1hcF91cHRvZGF0ZShiaCkpIHsKKwkJdW5sb2NrX2J1ZmZlcihiaCk7CisJCXJldHVybiBiaDsKKwl9CiAJc3Bpbl9sb2NrKHNiX2JnbF9sb2NrKEVYVDRfU0Ioc2IpLCBibG9ja19ncm91cCkpOwogCWlmIChkZXNjLT5iZ19mbGFncyAmIGNwdV90b19sZTE2KEVYVDRfQkdfSU5PREVfVU5JTklUKSkgewogCQlleHQ0X2luaXRfaW5vZGVfYml0bWFwKHNiLCBiaCwgYmxvY2tfZ3JvdXAsIGRlc2MpOworCQlzZXRfYml0bWFwX3VwdG9kYXRlKGJoKTsKIAkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7Ci0JCXVubG9ja19idWZmZXIoYmgpOwogCQlzcGluX3VubG9jayhzYl9iZ2xfbG9jayhFWFQ0X1NCKHNiKSwgYmxvY2tfZ3JvdXApKTsKKwkJdW5sb2NrX2J1ZmZlcihiaCk7CiAJCXJldHVybiBiaDsKIAl9CiAJc3Bpbl91bmxvY2soc2JfYmdsX2xvY2soRVhUNF9TQihzYiksIGJsb2NrX2dyb3VwKSk7CisJaWYgKGJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKKwkJLyoKKwkJICogaWYgbm90IHVuaW5pdCBpZiBiaCBpcyB1cHRvZGF0ZSwKKwkJICogYml0bWFwIGlzIGFsc28gdXB0b2RhdGUKKwkJICovCisJCXNldF9iaXRtYXBfdXB0b2RhdGUoYmgpOworCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJcmV0dXJuIGJoOworCX0KKwkvKgorCSAqIHN1Ym1pdCB0aGUgYnVmZmVyX2hlYWQgZm9yIHJlYWQuIFdlIGNhbgorCSAqIHNhZmVseSBtYXJrIHRoZSBiaXRtYXAgYXMgdXB0b2RhdGUgbm93LgorCSAqIFdlIGRvIGl0IGhlcmUgc28gdGhlIGJpdG1hcCB1cHRvZGF0ZSBiaXQKKwkgKiBnZXQgc2V0IHdpdGggYnVmZmVyIGxvY2sgaGVsZC4KKwkgKi8KKwlzZXRfYml0bWFwX3VwdG9kYXRlKGJoKTsKIAlpZiAoYmhfc3VibWl0X3JlYWQoYmgpIDwgMCkgewogCQlwdXRfYmgoYmgpOwogCQlleHQ0X2Vycm9yKHNiLCBfX2Z1bmNfXywKIAkJCSAgICAiQ2Fubm90IHJlYWQgaW5vZGUgYml0bWFwIC0gIgotCQkJICAgICJibG9ja19ncm91cCA9ICVsdSwgaW5vZGVfYml0bWFwID0gJWxsdSIsCisJCQkgICAgImJsb2NrX2dyb3VwID0gJXUsIGlub2RlX2JpdG1hcCA9ICVsbHUiLAogCQkJICAgIGJsb2NrX2dyb3VwLCBiaXRtYXBfYmxrKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtMTY4LDcgKzE4OCw3IEBACiAJc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqZ2RwOwogCXN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICplczsKIAlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmk7Ci0JaW50IGZhdGFsID0gMCwgZXJyOworCWludCBmYXRhbCA9IDAsIGVyciwgY291bnQ7CiAJZXh0NF9ncm91cF90IGZsZXhfZ3JvdXA7CiAKIAlpZiAoYXRvbWljX3JlYWQoJmlub2RlLT5pX2NvdW50KSA+IDEpIHsKQEAgLTE5MCw2ICsyMTAsMTEgQEAKIAogCWlubyA9IGlub2RlLT5pX2lubzsKIAlleHQ0X2RlYnVnKCJmcmVlaW5nIGlub2RlICVsdVxuIiwgaW5vKTsKKwl0cmFjZV9tYXJrKGV4dDRfZnJlZV9pbm9kZSwKKwkJICAgImRldiAlcyBpbm8gJWx1IG1vZGUgJWQgdWlkICVsdSBnaWQgJWx1IGJvY2tzICVsbHUiLAorCQkgICBzYi0+c19pZCwgaW5vZGUtPmlfaW5vLCBpbm9kZS0+aV9tb2RlLAorCQkgICAodW5zaWduZWQgbG9uZykgaW5vZGUtPmlfdWlkLCAodW5zaWduZWQgbG9uZykgaW5vZGUtPmlfZ2lkLAorCQkgICAodW5zaWduZWQgbG9uZyBsb25nKSBpbm9kZS0+aV9ibG9ja3MpOwogCiAJLyoKIAkgKiBOb3RlOiB3ZSBtdXN0IGZyZWUgYW55IHF1b3RhIGJlZm9yZSBsb2NraW5nIHRoZSBzdXBlcmJsb2NrLApAQCAtMjM2LDkgKzI2MSwxMiBAQAogCiAJCWlmIChnZHApIHsKIAkJCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhzYmksIGJsb2NrX2dyb3VwKSk7Ci0JCQlsZTE2X2FkZF9jcHUoJmdkcC0+YmdfZnJlZV9pbm9kZXNfY291bnQsIDEpOwotCQkJaWYgKGlzX2RpcmVjdG9yeSkKLQkJCQlsZTE2X2FkZF9jcHUoJmdkcC0+YmdfdXNlZF9kaXJzX2NvdW50LCAtMSk7CisJCQljb3VudCA9IGV4dDRfZnJlZV9pbm9kZXNfY291bnQoc2IsIGdkcCkgKyAxOworCQkJZXh0NF9mcmVlX2lub2Rlc19zZXQoc2IsIGdkcCwgY291bnQpOworCQkJaWYgKGlzX2RpcmVjdG9yeSkgeworCQkJCWNvdW50ID0gZXh0NF91c2VkX2RpcnNfY291bnQoc2IsIGdkcCkgLSAxOworCQkJCWV4dDRfdXNlZF9kaXJzX3NldChzYiwgZ2RwLCBjb3VudCk7CisJCQl9CiAJCQlnZHAtPmJnX2NoZWNrc3VtID0gZXh0NF9ncm91cF9kZXNjX2NzdW0oc2JpLAogCQkJCQkJCWJsb2NrX2dyb3VwLCBnZHApOwogCQkJc3Bpbl91bmxvY2soc2JfYmdsX2xvY2soc2JpLCBibG9ja19ncm91cCkpOwpAQCAtMjUzLDEyICsyODEsMTIgQEAKIAkJCQlzcGluX3VubG9jayhzYl9iZ2xfbG9jayhzYmksIGZsZXhfZ3JvdXApKTsKIAkJCX0KIAkJfQotCQlCVUZGRVJfVFJBQ0UoYmgyLCAiY2FsbCBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEiKTsKLQkJZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgyKTsKKwkJQlVGRkVSX1RSQUNFKGJoMiwgImNhbGwgZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEiKTsKKwkJZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBiaDIpOwogCQlpZiAoIWZhdGFsKSBmYXRhbCA9IGVycjsKIAl9Ci0JQlVGRkVSX1RSQUNFKGJpdG1hcF9iaCwgImNhbGwgZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7Ci0JZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYml0bWFwX2JoKTsKKwlCVUZGRVJfVFJBQ0UoYml0bWFwX2JoLCAiY2FsbCBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YSIpOworCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgYml0bWFwX2JoKTsKIAlpZiAoIWZhdGFsKQogCQlmYXRhbCA9IGVycjsKIAlzYi0+c19kaXJ0ID0gMTsKQEAgLTI5MSwxMyArMzE5LDEzIEBACiAKIAlmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBuZ3JvdXBzOyBncm91cCsrKSB7CiAJCWRlc2MgPSBleHQ0X2dldF9ncm91cF9kZXNjKHNiLCBncm91cCwgTlVMTCk7Ci0JCWlmICghZGVzYyB8fCAhZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQpCisJCWlmICghZGVzYyB8fCAhZXh0NF9mcmVlX2lub2Rlc19jb3VudChzYiwgZGVzYykpCiAJCQljb250aW51ZTsKLQkJaWYgKGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KSA8IGF2ZWZyZWVpKQorCQlpZiAoZXh0NF9mcmVlX2lub2Rlc19jb3VudChzYiwgZGVzYykgPCBhdmVmcmVlaSkKIAkJCWNvbnRpbnVlOwogCQlpZiAoIWJlc3RfZGVzYyB8fAotCQkgICAgKGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KSA+Ci0JCSAgICAgbGUxNl90b19jcHUoYmVzdF9kZXNjLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCkpKSB7CisJCSAgICAoZXh0NF9mcmVlX2Jsa3NfY291bnQoc2IsIGRlc2MpID4KKwkJICAgICBleHQ0X2ZyZWVfYmxrc19jb3VudChzYiwgYmVzdF9kZXNjKSkpIHsKIAkJCSpiZXN0X2dyb3VwID0gZ3JvdXA7CiAJCQliZXN0X2Rlc2MgPSBkZXNjOwogCQkJcmV0ID0gMDsKQEAgLTM2OSw3ICszOTcsNyBAQAogCWZvciAoaSA9IGJlc3RfZmxleCAqIGZsZXhfc2l6ZTsgaSA8IG5ncm91cHMgJiYKIAkJICAgICBpIDwgKGJlc3RfZmxleCArIDEpICogZmxleF9zaXplOyBpKyspIHsKIAkJZGVzYyA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2Moc2IsIGksICZiaCk7Ci0JCWlmIChsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2lub2Rlc19jb3VudCkpIHsKKwkJaWYgKGV4dDRfZnJlZV9pbm9kZXNfY291bnQoc2IsIGRlc2MpKSB7CiAJCQkqYmVzdF9ncm91cCA9IGk7CiAJCQlnb3RvIG91dDsKIAkJfQpAQCAtNDQzLDE3ICs0NzEsMTcgQEAKIAkJZm9yIChpID0gMDsgaSA8IG5ncm91cHM7IGkrKykgewogCQkJZ3JwID0gKHBhcmVudF9ncm91cCArIGkpICUgbmdyb3VwczsKIAkJCWRlc2MgPSBleHQ0X2dldF9ncm91cF9kZXNjKHNiLCBncnAsIE5VTEwpOwotCQkJaWYgKCFkZXNjIHx8ICFkZXNjLT5iZ19mcmVlX2lub2Rlc19jb3VudCkKKwkJCWlmICghZGVzYyB8fCAhZXh0NF9mcmVlX2lub2Rlc19jb3VudChzYiwgZGVzYykpCiAJCQkJY29udGludWU7Ci0JCQlpZiAobGUxNl90b19jcHUoZGVzYy0+YmdfdXNlZF9kaXJzX2NvdW50KSA+PSBiZXN0X25kaXIpCisJCQlpZiAoZXh0NF91c2VkX2RpcnNfY291bnQoc2IsIGRlc2MpID49IGJlc3RfbmRpcikKIAkJCQljb250aW51ZTsKLQkJCWlmIChsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2lub2Rlc19jb3VudCkgPCBhdmVmcmVlaSkKKwkJCWlmIChleHQ0X2ZyZWVfaW5vZGVzX2NvdW50KHNiLCBkZXNjKSA8IGF2ZWZyZWVpKQogCQkJCWNvbnRpbnVlOwotCQkJaWYgKGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KSA8IGF2ZWZyZWViKQorCQkJaWYgKGV4dDRfZnJlZV9ibGtzX2NvdW50KHNiLCBkZXNjKSA8IGF2ZWZyZWViKQogCQkJCWNvbnRpbnVlOwogCQkJKmdyb3VwID0gZ3JwOwogCQkJcmV0ID0gMDsKLQkJCWJlc3RfbmRpciA9IGxlMTZfdG9fY3B1KGRlc2MtPmJnX3VzZWRfZGlyc19jb3VudCk7CisJCQliZXN0X25kaXIgPSBleHQ0X3VzZWRfZGlyc19jb3VudChzYiwgZGVzYyk7CiAJCX0KIAkJaWYgKHJldCA9PSAwKQogCQkJcmV0dXJuIHJldDsKQEAgLTQ3OSwxMyArNTA3LDEzIEBACiAJZm9yIChpID0gMDsgaSA8IG5ncm91cHM7IGkrKykgewogCQkqZ3JvdXAgPSAocGFyZW50X2dyb3VwICsgaSkgJSBuZ3JvdXBzOwogCQlkZXNjID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgKmdyb3VwLCBOVUxMKTsKLQkJaWYgKCFkZXNjIHx8ICFkZXNjLT5iZ19mcmVlX2lub2Rlc19jb3VudCkKKwkJaWYgKCFkZXNjIHx8ICFleHQ0X2ZyZWVfaW5vZGVzX2NvdW50KHNiLCBkZXNjKSkKIAkJCWNvbnRpbnVlOwotCQlpZiAobGUxNl90b19jcHUoZGVzYy0+YmdfdXNlZF9kaXJzX2NvdW50KSA+PSBtYXhfZGlycykKKwkJaWYgKGV4dDRfdXNlZF9kaXJzX2NvdW50KHNiLCBkZXNjKSA+PSBtYXhfZGlycykKIAkJCWNvbnRpbnVlOwotCQlpZiAobGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQpIDwgbWluX2lub2RlcykKKwkJaWYgKGV4dDRfZnJlZV9pbm9kZXNfY291bnQoc2IsIGRlc2MpIDwgbWluX2lub2RlcykKIAkJCWNvbnRpbnVlOwotCQlpZiAobGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9ibG9ja3NfY291bnQpIDwgbWluX2Jsb2NrcykKKwkJaWYgKGV4dDRfZnJlZV9ibGtzX2NvdW50KHNiLCBkZXNjKSA8IG1pbl9ibG9ja3MpCiAJCQljb250aW51ZTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtNDk0LDggKzUyMiw4IEBACiAJZm9yIChpID0gMDsgaSA8IG5ncm91cHM7IGkrKykgewogCQkqZ3JvdXAgPSAocGFyZW50X2dyb3VwICsgaSkgJSBuZ3JvdXBzOwogCQlkZXNjID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgKmdyb3VwLCBOVUxMKTsKLQkJaWYgKGRlc2MgJiYgZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQgJiYKLQkJCWxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KSA+PSBhdmVmcmVlaSkKKwkJaWYgKGRlc2MgJiYgZXh0NF9mcmVlX2lub2Rlc19jb3VudChzYiwgZGVzYykgJiYKKwkJCWV4dDRfZnJlZV9pbm9kZXNfY291bnQoc2IsIGRlc2MpID49IGF2ZWZyZWVpKQogCQkJcmV0dXJuIDA7CiAJfQogCkBAIC01MjQsOCArNTUyLDggQEAKIAkgKi8KIAkqZ3JvdXAgPSBwYXJlbnRfZ3JvdXA7CiAJZGVzYyA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2Moc2IsICpncm91cCwgTlVMTCk7Ci0JaWYgKGRlc2MgJiYgbGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQpICYmCi0JCQlsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCkpCisJaWYgKGRlc2MgJiYgZXh0NF9mcmVlX2lub2Rlc19jb3VudChzYiwgZGVzYykgJiYKKwkJCWV4dDRfZnJlZV9ibGtzX2NvdW50KHNiLCBkZXNjKSkKIAkJcmV0dXJuIDA7CiAKIAkvKgpAQCAtNTQ4LDggKzU3Niw4IEBACiAJCWlmICgqZ3JvdXAgPj0gbmdyb3VwcykKIAkJCSpncm91cCAtPSBuZ3JvdXBzOwogCQlkZXNjID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgKmdyb3VwLCBOVUxMKTsKLQkJaWYgKGRlc2MgJiYgbGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQpICYmCi0JCQkJbGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9ibG9ja3NfY291bnQpKQorCQlpZiAoZGVzYyAmJiBleHQ0X2ZyZWVfaW5vZGVzX2NvdW50KHNiLCBkZXNjKSAmJgorCQkJCWV4dDRfZnJlZV9ibGtzX2NvdW50KHNiLCBkZXNjKSkKIAkJCXJldHVybiAwOwogCX0KIApAQCAtNTYyLDcgKzU5MCw3IEBACiAJCWlmICgrKypncm91cCA+PSBuZ3JvdXBzKQogCQkJKmdyb3VwID0gMDsKIAkJZGVzYyA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2Moc2IsICpncm91cCwgTlVMTCk7Ci0JCWlmIChkZXNjICYmIGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KSkKKwkJaWYgKGRlc2MgJiYgZXh0NF9mcmVlX2lub2Rlc19jb3VudChzYiwgZGVzYykpCiAJCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTU3MCw2ICs1OTgsNzkgQEAKIH0KIAogLyoKKyAqIGNsYWltIHRoZSBpbm9kZSBmcm9tIHRoZSBpbm9kZSBiaXRtYXAuIElmIHRoZSBncm91cAorICogaXMgdW5pbml0IHdlIG5lZWQgdG8gdGFrZSB0aGUgZ3JvdXBzJ3Mgc2JfYmdsX2xvY2sKKyAqIGFuZCBjbGVhciB0aGUgdW5pbml0IGZsYWcuIFRoZSBpbm9kZSBiaXRtYXAgdXBkYXRlCisgKiBhbmQgZ3JvdXAgZGVzYyB1bmluaXQgZmxhZyBjbGVhciBzaG91bGQgYmUgZG9uZQorICogYWZ0ZXIgaG9sZGluZyBzYl9iZ2xfbG9jayBzbyB0aGF0IGV4dDRfcmVhZF9pbm9kZV9iaXRtYXAKKyAqIGRvZXNuJ3QgcmFjZSB3aXRoIHRoZSBleHQ0X2NsYWltX2lub2RlCisgKi8KK3N0YXRpYyBpbnQgZXh0NF9jbGFpbV9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICppbm9kZV9iaXRtYXBfYmgsCisJCQl1bnNpZ25lZCBsb25nIGlubywgZXh0NF9ncm91cF90IGdyb3VwLCBpbnQgbW9kZSkKK3sKKwlpbnQgZnJlZSA9IDAsIHJldHZhbCA9IDAsIGNvdW50OworCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpOworCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmdkcCA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2Moc2IsIGdyb3VwLCBOVUxMKTsKKworCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhzYmksIGdyb3VwKSk7CisJaWYgKGV4dDRfc2V0X2JpdChpbm8sIGlub2RlX2JpdG1hcF9iaC0+Yl9kYXRhKSkgeworCQkvKiBub3QgYSBmcmVlIGlub2RlICovCisJCXJldHZhbCA9IDE7CisJCWdvdG8gZXJyX3JldDsKKwl9CisJaW5vKys7CisJaWYgKChncm91cCA9PSAwICYmIGlubyA8IEVYVDRfRklSU1RfSU5PKHNiKSkgfHwKKwkJCWlubyA+IEVYVDRfSU5PREVTX1BFUl9HUk9VUChzYikpIHsKKwkJc3Bpbl91bmxvY2soc2JfYmdsX2xvY2soc2JpLCBncm91cCkpOworCQlleHQ0X2Vycm9yKHNiLCBfX2Z1bmNfXywKKwkJCSAgICJyZXNlcnZlZCBpbm9kZSBvciBpbm9kZSA+IGlub2RlcyBjb3VudCAtICIKKwkJCSAgICJibG9ja19ncm91cCA9ICV1LCBpbm9kZT0lbHUiLCBncm91cCwKKwkJCSAgIGlubyArIGdyb3VwICogRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKSk7CisJCXJldHVybiAxOworCX0KKwkvKiBJZiB3ZSBkaWRuJ3QgYWxsb2NhdGUgZnJvbSB3aXRoaW4gdGhlIGluaXRpYWxpemVkIHBhcnQgb2YgdGhlIGlub2RlCisJICogdGFibGUgdGhlbiB3ZSBuZWVkIHRvIGluaXRpYWxpemUgdXAgdG8gdGhpcyBpbm9kZS4gKi8KKwlpZiAoRVhUNF9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9ST19DT01QQVRfR0RUX0NTVU0pKSB7CisKKwkJaWYgKGdkcC0+YmdfZmxhZ3MgJiBjcHVfdG9fbGUxNihFWFQ0X0JHX0lOT0RFX1VOSU5JVCkpIHsKKwkJCWdkcC0+YmdfZmxhZ3MgJj0gY3B1X3RvX2xlMTYofkVYVDRfQkdfSU5PREVfVU5JTklUKTsKKwkJCS8qIFdoZW4gbWFya2luZyB0aGUgYmxvY2sgZ3JvdXAgd2l0aAorCQkJICogfkVYVDRfQkdfSU5PREVfVU5JTklUIHdlIGRvbid0IHdhbnQgdG8gZGVwZW5kCisJCQkgKiBvbiB0aGUgdmFsdWUgb2YgYmdfaXRhYmxlX3VudXNlZCBldmVuIHRob3VnaAorCQkJICogbWtlMmZzIGNvdWxkIGhhdmUgaW5pdGlhbGl6ZWQgdGhlIHNhbWUgZm9yIHVzLgorCQkJICogSW5zdGVhZCB3ZSBjYWxjdWxhdGVkIHRoZSB2YWx1ZSBiZWxvdworCQkJICovCisKKwkJCWZyZWUgPSAwOworCQl9IGVsc2UgeworCQkJZnJlZSA9IEVYVDRfSU5PREVTX1BFUl9HUk9VUChzYikgLQorCQkJCWV4dDRfaXRhYmxlX3VudXNlZF9jb3VudChzYiwgZ2RwKTsKKwkJfQorCisJCS8qCisJCSAqIENoZWNrIHRoZSByZWxhdGl2ZSBpbm9kZSBudW1iZXIgYWdhaW5zdCB0aGUgbGFzdCB1c2VkCisJCSAqIHJlbGF0aXZlIGlub2RlIG51bWJlciBpbiB0aGlzIGdyb3VwLiBpZiBpdCBpcyBncmVhdGVyCisJCSAqIHdlIG5lZWQgdG8gIHVwZGF0ZSB0aGUgYmdfaXRhYmxlX3VudXNlZCBjb3VudAorCQkgKgorCQkgKi8KKwkJaWYgKGlubyA+IGZyZWUpCisJCQlleHQ0X2l0YWJsZV91bnVzZWRfc2V0KHNiLCBnZHAsCisJCQkJCShFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpIC0gaW5vKSk7CisJfQorCWNvdW50ID0gZXh0NF9mcmVlX2lub2Rlc19jb3VudChzYiwgZ2RwKSAtIDE7CisJZXh0NF9mcmVlX2lub2Rlc19zZXQoc2IsIGdkcCwgY291bnQpOworCWlmIChTX0lTRElSKG1vZGUpKSB7CisJCWNvdW50ID0gZXh0NF91c2VkX2RpcnNfY291bnQoc2IsIGdkcCkgKyAxOworCQlleHQ0X3VzZWRfZGlyc19zZXQoc2IsIGdkcCwgY291bnQpOworCX0KKwlnZHAtPmJnX2NoZWNrc3VtID0gZXh0NF9ncm91cF9kZXNjX2NzdW0oc2JpLCBncm91cCwgZ2RwKTsKK2Vycl9yZXQ6CisJc3Bpbl91bmxvY2soc2JfYmdsX2xvY2soc2JpLCBncm91cCkpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCiAgKiBUaGVyZSBhcmUgdHdvIHBvbGljaWVzIGZvciBhbGxvY2F0aW5nIGFuIGlub2RlLiAgSWYgdGhlIG5ldyBpbm9kZSBpcwogICogYSBkaXJlY3RvcnksIHRoZW4gYSBmb3J3YXJkIHNlYXJjaCBpcyBtYWRlIGZvciBhIGJsb2NrIGdyb3VwIHdpdGggYm90aAogICogZnJlZSBzcGFjZSBhbmQgYSBsb3cgZGlyZWN0b3J5LXRvLWlub2RlIHJhdGlvOyBpZiB0aGF0IGZhaWxzLCB0aGVuIG9mCkBAIC01ODIsOCArNjgzLDggQEAKIHN0cnVjdCBpbm9kZSAqZXh0NF9uZXdfaW5vZGUoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICpkaXIsIGludCBtb2RlKQogewogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmggPSBOVUxMOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgyOworCXN0cnVjdCBidWZmZXJfaGVhZCAqaW5vZGVfYml0bWFwX2JoID0gTlVMTDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmdyb3VwX2Rlc2NfYmg7CiAJZXh0NF9ncm91cF90IGdyb3VwID0gMDsKIAl1bnNpZ25lZCBsb25nIGlubyA9IDA7CiAJc3RydWN0IGlub2RlICppbm9kZTsKQEAgLTYwMiw2ICs3MDMsOCBAQAogCQlyZXR1cm4gRVJSX1BUUigtRVBFUk0pOwogCiAJc2IgPSBkaXItPmlfc2I7CisJdHJhY2VfbWFyayhleHQ0X3JlcXVlc3RfaW5vZGUsICJkZXYgJXMgZGlyICVsdSBtb2RlICVkIiwgc2ItPnNfaWQsCisJCSAgIGRpci0+aV9pbm8sIG1vZGUpOwogCWlub2RlID0gbmV3X2lub2RlKHNiKTsKIAlpZiAoIWlub2RlKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKQEAgLTYzMSw0MCArNzM0LDUyIEBACiAJZm9yIChpID0gMDsgaSA8IHNiaS0+c19ncm91cHNfY291bnQ7IGkrKykgewogCQllcnIgPSAtRUlPOwogCi0JCWdkcCA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2Moc2IsIGdyb3VwLCAmYmgyKTsKKwkJZ2RwID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgZ3JvdXAsICZncm91cF9kZXNjX2JoKTsKIAkJaWYgKCFnZHApCiAJCQlnb3RvIGZhaWw7CiAKLQkJYnJlbHNlKGJpdG1hcF9iaCk7Ci0JCWJpdG1hcF9iaCA9IGV4dDRfcmVhZF9pbm9kZV9iaXRtYXAoc2IsIGdyb3VwKTsKLQkJaWYgKCFiaXRtYXBfYmgpCisJCWJyZWxzZShpbm9kZV9iaXRtYXBfYmgpOworCQlpbm9kZV9iaXRtYXBfYmggPSBleHQ0X3JlYWRfaW5vZGVfYml0bWFwKHNiLCBncm91cCk7CisJCWlmICghaW5vZGVfYml0bWFwX2JoKQogCQkJZ290byBmYWlsOwogCiAJCWlubyA9IDA7CiAKIHJlcGVhdF9pbl90aGlzX2dyb3VwOgogCQlpbm8gPSBleHQ0X2ZpbmRfbmV4dF96ZXJvX2JpdCgodW5zaWduZWQgbG9uZyAqKQotCQkJCWJpdG1hcF9iaC0+Yl9kYXRhLCBFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpLCBpbm8pOworCQkJCQkgICAgICBpbm9kZV9iaXRtYXBfYmgtPmJfZGF0YSwKKwkJCQkJICAgICAgRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKSwgaW5vKTsKKwogCQlpZiAoaW5vIDwgRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKSkgewogCi0JCQlCVUZGRVJfVFJBQ0UoYml0bWFwX2JoLCAiZ2V0X3dyaXRlX2FjY2VzcyIpOwotCQkJZXJyID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBiaXRtYXBfYmgpOworCQkJQlVGRkVSX1RSQUNFKGlub2RlX2JpdG1hcF9iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKKwkJCWVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwKKwkJCQkJCQkgICAgaW5vZGVfYml0bWFwX2JoKTsKIAkJCWlmIChlcnIpCiAJCQkJZ290byBmYWlsOwogCi0JCQlpZiAoIWV4dDRfc2V0X2JpdF9hdG9taWMoc2JfYmdsX2xvY2soc2JpLCBncm91cCksCi0JCQkJCQlpbm8sIGJpdG1hcF9iaC0+Yl9kYXRhKSkgeworCQkJQlVGRkVSX1RSQUNFKGdyb3VwX2Rlc2NfYmgsICJnZXRfd3JpdGVfYWNjZXNzIik7CisJCQllcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsCisJCQkJCQkJCWdyb3VwX2Rlc2NfYmgpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIGZhaWw7CisJCQlpZiAoIWV4dDRfY2xhaW1faW5vZGUoc2IsIGlub2RlX2JpdG1hcF9iaCwKKwkJCQkJCWlubywgZ3JvdXAsIG1vZGUpKSB7CiAJCQkJLyogd2Ugd29uIGl0ICovCi0JCQkJQlVGRkVSX1RSQUNFKGJpdG1hcF9iaCwKLQkJCQkJImNhbGwgZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7Ci0JCQkJZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwKLQkJCQkJCQkJYml0bWFwX2JoKTsKKwkJCQlCVUZGRVJfVFJBQ0UoaW5vZGVfYml0bWFwX2JoLAorCQkJCQkiY2FsbCBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YSIpOworCQkJCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwKKwkJCQkJCQkJIGlub2RlLAorCQkJCQkJCWlub2RlX2JpdG1hcF9iaCk7CiAJCQkJaWYgKGVycikKIAkJCQkJZ290byBmYWlsOworCQkJCS8qIHplcm8gYml0IGlzIGlub2RlIG51bWJlciAxKi8KKwkJCQlpbm8rKzsKIAkJCQlnb3RvIGdvdDsKIAkJCX0KIAkJCS8qIHdlIGxvc3QgaXQgKi8KLQkJCWpiZDJfam91cm5hbF9yZWxlYXNlX2J1ZmZlcihoYW5kbGUsIGJpdG1hcF9iaCk7CisJCQlleHQ0X2hhbmRsZV9yZWxlYXNlX2J1ZmZlcihoYW5kbGUsIGlub2RlX2JpdG1hcF9iaCk7CisJCQlleHQ0X2hhbmRsZV9yZWxlYXNlX2J1ZmZlcihoYW5kbGUsIGdyb3VwX2Rlc2NfYmgpOwogCiAJCQlpZiAoKytpbm8gPCBFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpKQogCQkJCWdvdG8gcmVwZWF0X2luX3RoaXNfZ3JvdXA7CkBAIC02ODQsMzAgKzc5OSwxNiBAQAogCWdvdG8gb3V0OwogCiBnb3Q6Ci0JaW5vKys7Ci0JaWYgKChncm91cCA9PSAwICYmIGlubyA8IEVYVDRfRklSU1RfSU5PKHNiKSkgfHwKLQkgICAgaW5vID4gRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKSkgewotCQlleHQ0X2Vycm9yKHNiLCBfX2Z1bmNfXywKLQkJCSAgICJyZXNlcnZlZCBpbm9kZSBvciBpbm9kZSA+IGlub2RlcyBjb3VudCAtICIKLQkJCSAgICJibG9ja19ncm91cCA9ICVsdSwgaW5vZGU9JWx1IiwgZ3JvdXAsCi0JCQkgICBpbm8gKyBncm91cCAqIEVYVDRfSU5PREVTX1BFUl9HUk9VUChzYikpOwotCQllcnIgPSAtRUlPOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JQlVGRkVSX1RSQUNFKGJoMiwgImdldF93cml0ZV9hY2Nlc3MiKTsKLQllcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJoMik7Ci0JaWYgKGVycikgZ290byBmYWlsOwotCiAJLyogV2UgbWF5IGhhdmUgdG8gaW5pdGlhbGl6ZSB0aGUgYmxvY2sgYml0bWFwIGlmIGl0IGlzbid0IGFscmVhZHkgKi8KIAlpZiAoRVhUNF9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9ST19DT01QQVRfR0RUX0NTVU0pICYmCiAJICAgIGdkcC0+YmdfZmxhZ3MgJiBjcHVfdG9fbGUxNihFWFQ0X0JHX0JMT0NLX1VOSU5JVCkpIHsKLQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpibG9ja19iaCA9IGV4dDRfcmVhZF9ibG9ja19iaXRtYXAoc2IsIGdyb3VwKTsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpibG9ja19iaXRtYXBfYmg7CiAKLQkJQlVGRkVSX1RSQUNFKGJsb2NrX2JoLCAiZ2V0IGJsb2NrIGJpdG1hcCBhY2Nlc3MiKTsKLQkJZXJyID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBibG9ja19iaCk7CisJCWJsb2NrX2JpdG1hcF9iaCA9IGV4dDRfcmVhZF9ibG9ja19iaXRtYXAoc2IsIGdyb3VwKTsKKwkJQlVGRkVSX1RSQUNFKGJsb2NrX2JpdG1hcF9iaCwgImdldCBibG9jayBiaXRtYXAgYWNjZXNzIik7CisJCWVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYmxvY2tfYml0bWFwX2JoKTsKIAkJaWYgKGVycikgewotCQkJYnJlbHNlKGJsb2NrX2JoKTsKKwkJCWJyZWxzZShibG9ja19iaXRtYXBfYmgpOwogCQkJZ290byBmYWlsOwogCQl9CiAKQEAgLTcxNSw5ICs4MTYsOSBAQAogCQlzcGluX2xvY2soc2JfYmdsX2xvY2soc2JpLCBncm91cCkpOwogCQkvKiByZWNoZWNrIGFuZCBjbGVhciBmbGFnIHVuZGVyIGxvY2sgaWYgd2Ugc3RpbGwgbmVlZCB0byAqLwogCQlpZiAoZ2RwLT5iZ19mbGFncyAmIGNwdV90b19sZTE2KEVYVDRfQkdfQkxPQ0tfVU5JTklUKSkgewotCQkJZ2RwLT5iZ19mbGFncyAmPSBjcHVfdG9fbGUxNih+RVhUNF9CR19CTE9DS19VTklOSVQpOwogCQkJZnJlZSA9IGV4dDRfZnJlZV9ibG9ja3NfYWZ0ZXJfaW5pdChzYiwgZ3JvdXAsIGdkcCk7Ci0JCQlnZHAtPmJnX2ZyZWVfYmxvY2tzX2NvdW50ID0gY3B1X3RvX2xlMTYoZnJlZSk7CisJCQlnZHAtPmJnX2ZsYWdzICY9IGNwdV90b19sZTE2KH5FWFQ0X0JHX0JMT0NLX1VOSU5JVCk7CisJCQlleHQ0X2ZyZWVfYmxrc19zZXQoc2IsIGdkcCwgZnJlZSk7CiAJCQlnZHAtPmJnX2NoZWNrc3VtID0gZXh0NF9ncm91cF9kZXNjX2NzdW0oc2JpLCBncm91cCwKIAkJCQkJCQkJZ2RwKTsKIAkJfQpAQCAtNzI1LDU1ICs4MjYsMTkgQEAKIAogCQkvKiBEb24ndCBuZWVkIHRvIGRpcnR5IGJpdG1hcCBibG9jayBpZiB3ZSBkaWRuJ3QgY2hhbmdlIGl0ICovCiAJCWlmIChmcmVlKSB7Ci0JCQlCVUZGRVJfVFJBQ0UoYmxvY2tfYmgsICJkaXJ0eSBibG9jayBiaXRtYXAiKTsKLQkJCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJsb2NrX2JoKTsKKwkJCUJVRkZFUl9UUkFDRShibG9ja19iaXRtYXBfYmgsICJkaXJ0eSBibG9jayBiaXRtYXAiKTsKKwkJCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwKKwkJCQkJCQlOVUxMLCBibG9ja19iaXRtYXBfYmgpOwogCQl9CiAKLQkJYnJlbHNlKGJsb2NrX2JoKTsKKwkJYnJlbHNlKGJsb2NrX2JpdG1hcF9iaCk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIGZhaWw7CiAJfQotCi0Jc3Bpbl9sb2NrKHNiX2JnbF9sb2NrKHNiaSwgZ3JvdXApKTsKLQkvKiBJZiB3ZSBkaWRuJ3QgYWxsb2NhdGUgZnJvbSB3aXRoaW4gdGhlIGluaXRpYWxpemVkIHBhcnQgb2YgdGhlIGlub2RlCi0JICogdGFibGUgdGhlbiB3ZSBuZWVkIHRvIGluaXRpYWxpemUgdXAgdG8gdGhpcyBpbm9kZS4gKi8KLQlpZiAoRVhUNF9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9ST19DT01QQVRfR0RUX0NTVU0pKSB7Ci0JCWlmIChnZHAtPmJnX2ZsYWdzICYgY3B1X3RvX2xlMTYoRVhUNF9CR19JTk9ERV9VTklOSVQpKSB7Ci0JCQlnZHAtPmJnX2ZsYWdzICY9IGNwdV90b19sZTE2KH5FWFQ0X0JHX0lOT0RFX1VOSU5JVCk7Ci0KLQkJCS8qIFdoZW4gbWFya2luZyB0aGUgYmxvY2sgZ3JvdXAgd2l0aAotCQkJICogfkVYVDRfQkdfSU5PREVfVU5JTklUIHdlIGRvbid0IHdhbnQgdG8gZGVwZW5kCi0JCQkgKiBvbiB0aGUgdmFsdWUgb2YgYmdfaXRhYmxlX3VudXNlZCBldmVuIHRob3VnaAotCQkJICogbWtlMmZzIGNvdWxkIGhhdmUgaW5pdGlhbGl6ZWQgdGhlIHNhbWUgZm9yIHVzLgotCQkJICogSW5zdGVhZCB3ZSBjYWxjdWxhdGVkIHRoZSB2YWx1ZSBiZWxvdwotCQkJICovCi0KLQkJCWZyZWUgPSAwOwotCQl9IGVsc2UgewotCQkJZnJlZSA9IEVYVDRfSU5PREVTX1BFUl9HUk9VUChzYikgLQotCQkJCWxlMTZfdG9fY3B1KGdkcC0+YmdfaXRhYmxlX3VudXNlZCk7Ci0JCX0KLQotCQkvKgotCQkgKiBDaGVjayB0aGUgcmVsYXRpdmUgaW5vZGUgbnVtYmVyIGFnYWluc3QgdGhlIGxhc3QgdXNlZAotCQkgKiByZWxhdGl2ZSBpbm9kZSBudW1iZXIgaW4gdGhpcyBncm91cC4gaWYgaXQgaXMgZ3JlYXRlcgotCQkgKiB3ZSBuZWVkIHRvICB1cGRhdGUgdGhlIGJnX2l0YWJsZV91bnVzZWQgY291bnQKLQkJICoKLQkJICovCi0JCWlmIChpbm8gPiBmcmVlKQotCQkJZ2RwLT5iZ19pdGFibGVfdW51c2VkID0KLQkJCQljcHVfdG9fbGUxNihFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpIC0gaW5vKTsKLQl9Ci0KLQlsZTE2X2FkZF9jcHUoJmdkcC0+YmdfZnJlZV9pbm9kZXNfY291bnQsIC0xKTsKLQlpZiAoU19JU0RJUihtb2RlKSkgewotCQlsZTE2X2FkZF9jcHUoJmdkcC0+YmdfdXNlZF9kaXJzX2NvdW50LCAxKTsKLQl9Ci0JZ2RwLT5iZ19jaGVja3N1bSA9IGV4dDRfZ3JvdXBfZGVzY19jc3VtKHNiaSwgZ3JvdXAsIGdkcCk7Ci0Jc3Bpbl91bmxvY2soc2JfYmdsX2xvY2soc2JpLCBncm91cCkpOwotCUJVRkZFUl9UUkFDRShiaDIsICJjYWxsIGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOwotCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoMik7Ci0JaWYgKGVycikgZ290byBmYWlsOworCUJVRkZFUl9UUkFDRShncm91cF9kZXNjX2JoLCAiY2FsbCBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YSIpOworCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgZ3JvdXBfZGVzY19iaCk7CisJaWYgKGVycikKKwkJZ290byBmYWlsOwogCiAJcGVyY3B1X2NvdW50ZXJfZGVjKCZzYmktPnNfZnJlZWlub2Rlc19jb3VudGVyKTsKIAlpZiAoU19JU0RJUihtb2RlKSkKQEAgLTgyNSw3ICs4OTAsNyBAQAogCiAJZXh0NF9zZXRfaW5vZGVfZmxhZ3MoaW5vZGUpOwogCWlmIChJU19ESVJTWU5DKGlub2RlKSkKLQkJaGFuZGxlLT5oX3N5bmMgPSAxOworCQlleHQ0X2hhbmRsZV9zeW5jKGhhbmRsZSk7CiAJaWYgKGluc2VydF9pbm9kZV9sb2NrZWQoaW5vZGUpIDwgMCkgewogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIGZhaWxfZHJvcDsKQEAgLTg1Miw3ICs5MTcsNyBAQAogCWlmIChlcnIpCiAJCWdvdG8gZmFpbF9mcmVlX2Ryb3A7CiAKLQlpZiAodGVzdF9vcHQoc2IsIEVYVEVOVFMpKSB7CisJaWYgKEVYVDRfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9FWFRFTlRTKSkgewogCQkvKiBzZXQgZXh0ZW50IGZsYWcgb25seSBmb3IgZGlyZWN0b3J5LCBmaWxlIGFuZCBub3JtYWwgc3ltbGluayovCiAJCWlmIChTX0lTRElSKG1vZGUpIHx8IFNfSVNSRUcobW9kZSkgfHwgU19JU0xOSyhtb2RlKSkgewogCQkJRVhUNF9JKGlub2RlKS0+aV9mbGFncyB8PSBFWFQ0X0VYVEVOVFNfRkw7CkBAIC04NjcsNiArOTMyLDggQEAKIAl9CiAKIAlleHQ0X2RlYnVnKCJhbGxvY2F0aW5nIGlub2RlICVsdVxuIiwgaW5vZGUtPmlfaW5vKTsKKwl0cmFjZV9tYXJrKGV4dDRfYWxsb2NhdGVfaW5vZGUsICJkZXYgJXMgaW5vICVsdSBkaXIgJWx1IG1vZGUgJWQiLAorCQkgICBzYi0+c19pZCwgaW5vZGUtPmlfaW5vLCBkaXItPmlfaW5vLCBtb2RlKTsKIAlnb3RvIHJlYWxseV9vdXQ7CiBmYWlsOgogCWV4dDRfc3RkX2Vycm9yKHNiLCBlcnIpOwpAQCAtODc0LDcgKzk0MSw3IEBACiAJaXB1dChpbm9kZSk7CiAJcmV0ID0gRVJSX1BUUihlcnIpOwogcmVhbGx5X291dDoKLQlicmVsc2UoYml0bWFwX2JoKTsKKwlicmVsc2UoaW5vZGVfYml0bWFwX2JoKTsKIAlyZXR1cm4gcmV0OwogCiBmYWlsX2ZyZWVfZHJvcDoKQEAgLTg4Niw3ICs5NTMsNyBAQAogCWlub2RlLT5pX25saW5rID0gMDsKIAl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKIAlpcHV0KGlub2RlKTsKLQlicmVsc2UoYml0bWFwX2JoKTsKKwlicmVsc2UoaW5vZGVfYml0bWFwX2JoKTsKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwogfQogCkBAIC05ODUsNyArMTA1Miw3IEBACiAJCWdkcCA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2Moc2IsIGksIE5VTEwpOwogCQlpZiAoIWdkcCkKIAkJCWNvbnRpbnVlOwotCQlkZXNjX2NvdW50ICs9IGxlMTZfdG9fY3B1KGdkcC0+YmdfZnJlZV9pbm9kZXNfY291bnQpOworCQlkZXNjX2NvdW50ICs9IGV4dDRfZnJlZV9pbm9kZXNfY291bnQoc2IsIGdkcCk7CiAJCWJyZWxzZShiaXRtYXBfYmgpOwogCQliaXRtYXBfYmggPSBleHQ0X3JlYWRfaW5vZGVfYml0bWFwKHNiLCBpKTsKIAkJaWYgKCFiaXRtYXBfYmgpCkBAIC05OTMsNyArMTA2MCw3IEBACiAKIAkJeCA9IGV4dDRfY291bnRfZnJlZShiaXRtYXBfYmgsIEVYVDRfSU5PREVTX1BFUl9HUk9VUChzYikgLyA4KTsKIAkJcHJpbnRrKEtFUk5fREVCVUcgImdyb3VwICVsdTogc3RvcmVkID0gJWQsIGNvdW50ZWQgPSAlbHVcbiIsCi0JCQlpLCBsZTE2X3RvX2NwdShnZHAtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KSwgeCk7CisJCQlpLCBleHQ0X2ZyZWVfaW5vZGVzX2NvdW50KHNiLCBnZHApLCB4KTsKIAkJYml0bWFwX2NvdW50ICs9IHg7CiAJfQogCWJyZWxzZShiaXRtYXBfYmgpOwpAQCAtMTAwNyw3ICsxMDc0LDcgQEAKIAkJZ2RwID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgaSwgTlVMTCk7CiAJCWlmICghZ2RwKQogCQkJY29udGludWU7Ci0JCWRlc2NfY291bnQgKz0gbGUxNl90b19jcHUoZ2RwLT5iZ19mcmVlX2lub2Rlc19jb3VudCk7CisJCWRlc2NfY291bnQgKz0gZXh0NF9mcmVlX2lub2Rlc19jb3VudChzYiwgZ2RwKTsKIAkJY29uZF9yZXNjaGVkKCk7CiAJfQogCXJldHVybiBkZXNjX2NvdW50OwpAQCAtMTAyNCw4ICsxMDkxLDcgQEAKIAkJc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqZ2RwID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgaSwgTlVMTCk7CiAJCWlmICghZ2RwKQogCQkJY29udGludWU7Ci0JCWNvdW50ICs9IGxlMTZfdG9fY3B1KGdkcC0+YmdfdXNlZF9kaXJzX2NvdW50KTsKKwkJY291bnQgKz0gZXh0NF91c2VkX2RpcnNfY291bnQoc2IsIGdkcCk7CiAJfQogCXJldHVybiBjb3VudDsKIH0KLQpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9pbm9kZS5jIGIvZnMvZXh0NC9pbm9kZS5jCmluZGV4IDY3MDJhNDkuLmE2NDQ0Y2UgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvaW5vZGUuYworKysgYi9mcy9leHQ0L2lub2RlLmMKQEAgLTcyLDEyICs3MiwxNyBAQAogICogImJoIiBtYXkgYmUgTlVMTDogYSBtZXRhZGF0YSBibG9jayBtYXkgaGF2ZSBiZWVuIGZyZWVkIGZyb20gbWVtb3J5CiAgKiBidXQgdGhlcmUgbWF5IHN0aWxsIGJlIGEgcmVjb3JkIG9mIGl0IGluIHRoZSBqb3VybmFsLCBhbmQgdGhhdCByZWNvcmQKICAqIHN0aWxsIG5lZWRzIHRvIGJlIHJldm9rZWQuCisgKgorICogSWYgdGhlIGhhbmRsZSBpc24ndCB2YWxpZCB3ZSdyZSBub3Qgam91cm5hbGluZyBzbyB0aGVyZSdzIG5vdGhpbmcgdG8gZG8uCiAgKi8KIGludCBleHQ0X2ZvcmdldChoYW5kbGVfdCAqaGFuZGxlLCBpbnQgaXNfbWV0YWRhdGEsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBleHQ0X2ZzYmxrX3QgYmxvY2tucikKIHsKIAlpbnQgZXJyOwogCisJaWYgKCFleHQ0X2hhbmRsZV92YWxpZChoYW5kbGUpKQorCQlyZXR1cm4gMDsKKwogCW1pZ2h0X3NsZWVwKCk7CiAKIAlCVUZGRVJfVFJBQ0UoYmgsICJlbnRlciIpOwpAQCAtMTcwLDcgKzE3NSw5IEBACiAgKi8KIHN0YXRpYyBpbnQgdHJ5X3RvX2V4dGVuZF90cmFuc2FjdGlvbihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotCWlmIChoYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHMgPiBFWFQ0X1JFU0VSVkVfVFJBTlNfQkxPQ0tTKQorCWlmICghZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSkKKwkJcmV0dXJuIDA7CisJaWYgKGV4dDRfaGFuZGxlX2hhc19lbm91Z2hfY3JlZGl0cyhoYW5kbGUsIEVYVDRfUkVTRVJWRV9UUkFOU19CTE9DS1MrMSkpCiAJCXJldHVybiAwOwogCWlmICghZXh0NF9qb3VybmFsX2V4dGVuZChoYW5kbGUsIGJsb2Nrc19mb3JfdHJ1bmNhdGUoaW5vZGUpKSkKIAkJcmV0dXJuIDA7CkBAIC0xODQsNiArMTkxLDcgQEAKICAqLwogc3RhdGljIGludCBleHQ0X2pvdXJuYWxfdGVzdF9yZXN0YXJ0KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CisJQlVHX09OKEVYVDRfSk9VUk5BTChpbm9kZSkgPT0gTlVMTCk7CiAJamJkX2RlYnVnKDIsICJyZXN0YXJ0aW5nIGhhbmRsZSAlcFxuIiwgaGFuZGxlKTsKIAlyZXR1cm4gZXh0NF9qb3VybmFsX3Jlc3RhcnQoaGFuZGxlLCBibG9ja3NfZm9yX3RydW5jYXRlKGlub2RlKSk7CiB9CkBAIC0yMTYsNyArMjI0LDcgQEAKIAl9CiAKIAlpZiAoSVNfU1lOQyhpbm9kZSkpCi0JCWhhbmRsZS0+aF9zeW5jID0gMTsKKwkJZXh0NF9oYW5kbGVfc3luYyhoYW5kbGUpOwogCWlub2RlLT5pX3NpemUgPSAwOwogCWVyciA9IGV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKIAlpZiAoZXJyKSB7CkBAIC0yMzMsNyArMjQxLDcgQEAKIAkgKiBlbm91Z2ggY3JlZGl0cyBsZWZ0IGluIHRoZSBoYW5kbGUgdG8gcmVtb3ZlIHRoZSBpbm9kZSBmcm9tCiAJICogdGhlIG9ycGhhbiBsaXN0IGFuZCBzZXQgdGhlIGR0aW1lIGZpZWxkLgogCSAqLwotCWlmIChoYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHMgPCAzKSB7CisJaWYgKCFleHQ0X2hhbmRsZV9oYXNfZW5vdWdoX2NyZWRpdHMoaGFuZGxlLCAzKSkgewogCQllcnIgPSBleHQ0X2pvdXJuYWxfZXh0ZW5kKGhhbmRsZSwgMyk7CiAJCWlmIChlcnIgPiAwKQogCQkJZXJyID0gZXh0NF9qb3VybmFsX3Jlc3RhcnQoaGFuZGxlLCAzKTsKQEAgLTUwNiwxMCArNTE0LDEwIEBACiAgKglyZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBibG9ja3MgdG8gYmUgYWxsb2NhdGUsIGluY2x1ZGluZyB0aGUKICAqCWRpcmVjdCBhbmQgaW5kaXJlY3QgYmxvY2tzLgogICovCi1zdGF0aWMgaW50IGV4dDRfYmxrc190b19hbGxvY2F0ZShJbmRpcmVjdCAqYnJhbmNoLCBpbnQgaywgdW5zaWduZWQgbG9uZyBibGtzLAorc3RhdGljIGludCBleHQ0X2Jsa3NfdG9fYWxsb2NhdGUoSW5kaXJlY3QgKmJyYW5jaCwgaW50IGssIHVuc2lnbmVkIGludCBibGtzLAogCQlpbnQgYmxvY2tzX3RvX2JvdW5kYXJ5KQogewotCXVuc2lnbmVkIGxvbmcgY291bnQgPSAwOworCXVuc2lnbmVkIGludCBjb3VudCA9IDA7CiAKIAkvKgogCSAqIFNpbXBsZSBjYXNlLCBbdCxkXUluZGlyZWN0IGJsb2NrKHMpIGhhcyBub3QgYWxsb2NhdGVkIHlldApAQCAtNTQ3LDYgKzU1NSw3IEBACiAJCQkJaW50IGluZGlyZWN0X2Jsa3MsIGludCBibGtzLAogCQkJCWV4dDRfZnNibGtfdCBuZXdfYmxvY2tzWzRdLCBpbnQgKmVycikKIHsKKwlzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX3JlcXVlc3QgYXI7CiAJaW50IHRhcmdldCwgaTsKIAl1bnNpZ25lZCBsb25nIGNvdW50ID0gMCwgYmxrX2FsbG9jYXRlZCA9IDA7CiAJaW50IGluZGV4ID0gMDsKQEAgLTU5NSwxMCArNjA0LDE3IEBACiAJaWYgKCF0YXJnZXQpCiAJCWdvdG8gYWxsb2NhdGVkOwogCS8qIE5vdyBhbGxvY2F0ZSBkYXRhIGJsb2NrcyAqLwotCWNvdW50ID0gdGFyZ2V0OwotCS8qIGFsbG9jYXRpbmcgYmxvY2tzIGZvciBkYXRhIGJsb2NrcyAqLwotCWN1cnJlbnRfYmxvY2sgPSBleHQ0X25ld19ibG9ja3MoaGFuZGxlLCBpbm9kZSwgaWJsb2NrLAotCQkJCQkJZ29hbCwgJmNvdW50LCBlcnIpOworCW1lbXNldCgmYXIsIDAsIHNpemVvZihhcikpOworCWFyLmlub2RlID0gaW5vZGU7CisJYXIuZ29hbCA9IGdvYWw7CisJYXIubGVuID0gdGFyZ2V0OworCWFyLmxvZ2ljYWwgPSBpYmxvY2s7CisJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCisJCS8qIGVuYWJsZSBpbi1jb3JlIHByZWFsbG9jYXRpb24gb25seSBmb3IgcmVndWxhciBmaWxlcyAqLworCQlhci5mbGFncyA9IEVYVDRfTUJfSElOVF9EQVRBOworCisJY3VycmVudF9ibG9jayA9IGV4dDRfbWJfbmV3X2Jsb2NrcyhoYW5kbGUsICZhciwgZXJyKTsKKwogCWlmICgqZXJyICYmICh0YXJnZXQgPT0gYmxrcykpIHsKIAkJLyoKIAkJICogaWYgdGhlIGFsbG9jYXRpb24gZmFpbGVkIGFuZCB3ZSBkaWRuJ3QgYWxsb2NhdGUKQEAgLTYxNCw3ICs2MzAsNyBAQAogCQkgKi8KIAkJCW5ld19ibG9ja3NbaW5kZXhdID0gY3VycmVudF9ibG9jazsKIAkJfQotCQlibGtfYWxsb2NhdGVkICs9IGNvdW50OworCQlibGtfYWxsb2NhdGVkICs9IGFyLmxlbjsKIAl9CiBhbGxvY2F0ZWQ6CiAJLyogdG90YWwgbnVtYmVyIG9mIGJsb2NrcyBhbGxvY2F0ZWQgZm9yIGRpcmVjdCBibG9ja3MgKi8KQEAgLTcwOSw4ICs3MjUsOCBAQAogCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKIAkJdW5sb2NrX2J1ZmZlcihiaCk7CiAKLQkJQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEiKTsKLQkJZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOworCQlCVUZGRVJfVFJBQ0UoYmgsICJjYWxsIGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhIik7CisJCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgaW5vZGUsIGJoKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gZmFpbGVkOwogCX0KQEAgLTc5Miw4ICs4MDgsOCBAQAogCQkgKiBnZW5lcmljX2NvbW1pdF93cml0ZS0+X19tYXJrX2lub2RlX2RpcnR5LT5leHQ0X2RpcnR5X2lub2RlLgogCQkgKi8KIAkJamJkX2RlYnVnKDUsICJzcGxpY2luZyBpbmRpcmVjdCBvbmx5XG4iKTsKLQkJQlVGRkVSX1RSQUNFKHdoZXJlLT5iaCwgImNhbGwgZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7Ci0JCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIHdoZXJlLT5iaCk7CisJCUJVRkZFUl9UUkFDRSh3aGVyZS0+YmgsICJjYWxsIGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhIik7CisJCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgaW5vZGUsIHdoZXJlLT5iaCk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIGVycl9vdXQ7CiAJfSBlbHNlIHsKQEAgLTg0MCwxMCArODU2LDEwIEBACiAgKiBkb3duX3JlYWQoJkVYVDRfSShpbm9kZSktPmlfZGF0YV9zZW0pIGlmIG5vdCBhbGxvY2F0aW5nIGZpbGUgc3lzdGVtIGJsb2NrCiAgKiAoaWUsIGNyZWF0ZSBpcyB6ZXJvKS4gT3RoZXJ3aXNlIGRvd25fd3JpdGUoJkVYVDRfSShpbm9kZSktPmlfZGF0YV9zZW0pCiAgKi8KLWludCBleHQ0X2dldF9ibG9ja3NfaGFuZGxlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCWV4dDRfbGJsa190IGlibG9jaywgdW5zaWduZWQgbG9uZyBtYXhibG9ja3MsCi0JCXN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LAotCQlpbnQgY3JlYXRlLCBpbnQgZXh0ZW5kX2Rpc2tzaXplKQorc3RhdGljIGludCBleHQ0X2dldF9ibG9ja3NfaGFuZGxlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICBleHQ0X2xibGtfdCBpYmxvY2ssIHVuc2lnbmVkIGludCBtYXhibG9ja3MsCisJCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwKKwkJCQkgIGludCBjcmVhdGUsIGludCBleHRlbmRfZGlza3NpemUpCiB7CiAJaW50IGVyciA9IC1FSU87CiAJZXh0NF9sYmxrX3Qgb2Zmc2V0c1s0XTsKQEAgLTEwNDUsNyArMTA2MSw3IEBACiAgKiBJdCByZXR1cm5zIHRoZSBlcnJvciBpbiBjYXNlIG9mIGFsbG9jYXRpb24gZmFpbHVyZS4KICAqLwogaW50IGV4dDRfZ2V0X2Jsb2Nrc193cmFwKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGJsb2NrLAotCQkJdW5zaWduZWQgbG9uZyBtYXhfYmxvY2tzLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAorCQkJdW5zaWduZWQgaW50IG1heF9ibG9ja3MsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCiAJCQlpbnQgY3JlYXRlLCBpbnQgZXh0ZW5kX2Rpc2tzaXplLCBpbnQgZmxhZykKIHsKIAlpbnQgcmV0dmFsOwpAQCAtMTIyMSw4ICsxMjM3LDggQEAKIAkJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKIAkJCX0KIAkJCXVubG9ja19idWZmZXIoYmgpOwotCQkJQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEiKTsKLQkJCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKTsKKwkJCUJVRkZFUl9UUkFDRShiaCwgImNhbGwgZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEiKTsKKwkJCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgaW5vZGUsIGJoKTsKIAkJCWlmICghZmF0YWwpCiAJCQkJZmF0YWwgPSBlcnI7CiAJCX0gZWxzZSB7CkBAIC0xMzM1LDYgKzEzNTEsMTAgQEAKICAJcGdvZmZfdCBpbmRleDsKIAl1bnNpZ25lZCBmcm9tLCB0bzsKIAorCXRyYWNlX21hcmsoZXh0NF93cml0ZV9iZWdpbiwKKwkJICAgImRldiAlcyBpbm8gJWx1IHBvcyAlbGx1IGxlbiAldSBmbGFncyAldSIsCisJCSAgIGlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8sCisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBvcywgbGVuLCBmbGFncyk7CiAgCWluZGV4ID0gcG9zID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CiAJZnJvbSA9IHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKIAl0byA9IGZyb20gKyBsZW47CkBAIC0xMzg3LDcgKzE0MDcsNyBAQAogCWlmICghYnVmZmVyX21hcHBlZChiaCkgfHwgYnVmZmVyX2ZyZWVkKGJoKSkKIAkJcmV0dXJuIDA7CiAJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7Ci0JcmV0dXJuIGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKTsKKwlyZXR1cm4gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBiaCk7CiB9CiAKIC8qCkBAIC0xNDA2LDYgKzE0MjYsMTAgQEAKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKIAlpbnQgcmV0ID0gMCwgcmV0MjsKIAorCXRyYWNlX21hcmsoZXh0NF9vcmRlcmVkX3dyaXRlX2VuZCwKKwkJICAgImRldiAlcyBpbm8gJWx1IHBvcyAlbGx1IGxlbiAldSBjb3BpZWQgJXUiLAorCQkgICBpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vLAorCQkgICAodW5zaWduZWQgbG9uZyBsb25nKSBwb3MsIGxlbiwgY29waWVkKTsKIAlyZXQgPSBleHQ0X2piZDJfZmlsZV9pbm9kZShoYW5kbGUsIGlub2RlKTsKIAogCWlmIChyZXQgPT0gMCkgewpAQCAtMTQ0NCw2ICsxNDY4LDEwIEBACiAJaW50IHJldCA9IDAsIHJldDI7CiAJbG9mZl90IG5ld19pX3NpemU7CiAKKwl0cmFjZV9tYXJrKGV4dDRfd3JpdGViYWNrX3dyaXRlX2VuZCwKKwkJICAgImRldiAlcyBpbm8gJWx1IHBvcyAlbGx1IGxlbiAldSBjb3BpZWQgJXUiLAorCQkgICBpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vLAorCQkgICAodW5zaWduZWQgbG9uZyBsb25nKSBwb3MsIGxlbiwgY29waWVkKTsKIAluZXdfaV9zaXplID0gcG9zICsgY29waWVkOwogCWlmIChuZXdfaV9zaXplID4gRVhUNF9JKGlub2RlKS0+aV9kaXNrc2l6ZSkgewogCQlleHQ0X3VwZGF0ZV9pX2Rpc2tzaXplKGlub2RlLCBuZXdfaV9zaXplKTsKQEAgLTE0NzksNiArMTUwNywxMCBAQAogCXVuc2lnbmVkIGZyb20sIHRvOwogCWxvZmZfdCBuZXdfaV9zaXplOwogCisJdHJhY2VfbWFyayhleHQ0X2pvdXJuYWxsZWRfd3JpdGVfZW5kLAorCQkgICAiZGV2ICVzIGlubyAlbHUgcG9zICVsbHUgbGVuICV1IGNvcGllZCAldSIsCisJCSAgIGlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8sCisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBvcywgbGVuLCBjb3BpZWQpOwogCWZyb20gPSBwb3MgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7CiAJdG8gPSBmcm9tICsgbGVuOwogCkBAIC0xNjI1LDcgKzE2NTcsNyBAQAogCWdldF9ibG9ja190ICpnZXRfYmxvY2s7CiAJc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmM7CiAJaW50IGlvX2RvbmU7Ci0JbG9uZyBwYWdlc193cml0dGVuOworCWludCBwYWdlc193cml0dGVuOwogCWludCByZXR2YWw7CiB9OwogCkBAIC0xNjQ1LDM1ICsxNjc3LDM5IEBACiAgKi8KIHN0YXRpYyBpbnQgbXBhZ2VfZGFfc3VibWl0X2lvKHN0cnVjdCBtcGFnZV9kYV9kYXRhICptcGQpCiB7Ci0Jc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBtcGQtPmlub2RlLT5pX21hcHBpbmc7Ci0JaW50IHJldCA9IDAsIGVyciwgbnJfcGFnZXMsIGk7Ci0JdW5zaWduZWQgbG9uZyBpbmRleCwgZW5kOwotCXN0cnVjdCBwYWdldmVjIHB2ZWM7CiAJbG9uZyBwYWdlc19za2lwcGVkOworCXN0cnVjdCBwYWdldmVjIHB2ZWM7CisJdW5zaWduZWQgbG9uZyBpbmRleCwgZW5kOworCWludCByZXQgPSAwLCBlcnIsIG5yX3BhZ2VzLCBpOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtcGQtPmlub2RlOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKIAogCUJVR19PTihtcGQtPm5leHRfcGFnZSA8PSBtcGQtPmZpcnN0X3BhZ2UpOwotCXBhZ2V2ZWNfaW5pdCgmcHZlYywgMCk7CisJLyoKKwkgKiBXZSBuZWVkIHRvIHN0YXJ0IGZyb20gdGhlIGZpcnN0X3BhZ2UgdG8gdGhlIG5leHRfcGFnZSAtIDEKKwkgKiB0byBtYWtlIHN1cmUgd2UgYWxzbyB3cml0ZSB0aGUgbWFwcGVkIGRpcnR5IGJ1ZmZlcl9oZWFkcy4KKwkgKiBJZiB3ZSBsb29rIGF0IG1wZC0+bGJoLmJfYmxvY2tuciB3ZSB3b3VsZCBvbmx5IGJlIGxvb2tpbmcKKwkgKiBhdCB0aGUgY3VycmVudGx5IG1hcHBlZCBidWZmZXJfaGVhZHMuCisJICovCiAJaW5kZXggPSBtcGQtPmZpcnN0X3BhZ2U7CiAJZW5kID0gbXBkLT5uZXh0X3BhZ2UgLSAxOwogCisJcGFnZXZlY19pbml0KCZwdmVjLCAwKTsKIAl3aGlsZSAoaW5kZXggPD0gZW5kKSB7Ci0JCS8qCi0JCSAqIFdlIGNhbiB1c2UgUEFHRUNBQ0hFX1RBR19ESVJUWSBsb29rdXAgaGVyZSBiZWNhdXNlCi0JCSAqIGV2ZW4gdGhvdWdoIHdlIGhhdmUgY2xlYXJlZCB0aGUgZGlydHkgZmxhZyBvbiB0aGUgcGFnZQotCQkgKiBXZSBzdGlsbCBrZWVwIHRoZSBwYWdlIGluIHRoZSByYWRpeCB0cmVlIHdpdGggdGFnCi0JCSAqIFBBR0VDQUNIRV9UQUdfRElSVFkuIFNlZSBjbGVhcl9wYWdlX2RpcnR5X2Zvcl9pby4KLQkJICogVGhlIFBBR0VDQUNIRV9UQUdfRElSVFkgaXMgY2xlYXJlZCBpbiBzZXRfcGFnZV93cml0ZWJhY2sKLQkJICogd2hpY2ggaXMgY2FsbGVkIHZpYSB0aGUgYmVsb3cgd3JpdGVwYWdlIGNhbGxiYWNrLgotCQkgKi8KLQkJbnJfcGFnZXMgPSBwYWdldmVjX2xvb2t1cF90YWcoJnB2ZWMsIG1hcHBpbmcsICZpbmRleCwKLQkJCQkJUEFHRUNBQ0hFX1RBR19ESVJUWSwKLQkJCQkJbWluKGVuZCAtIGluZGV4LAotCQkJCQkocGdvZmZfdClQQUdFVkVDX1NJWkUtMSkgKyAxKTsKKwkJbnJfcGFnZXMgPSBwYWdldmVjX2xvb2t1cCgmcHZlYywgbWFwcGluZywgaW5kZXgsIFBBR0VWRUNfU0laRSk7CiAJCWlmIChucl9wYWdlcyA9PSAwKQogCQkJYnJlYWs7CiAJCWZvciAoaSA9IDA7IGkgPCBucl9wYWdlczsgaSsrKSB7CiAJCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHB2ZWMucGFnZXNbaV07CiAKKwkJCWluZGV4ID0gcGFnZS0+aW5kZXg7CisJCQlpZiAoaW5kZXggPiBlbmQpCisJCQkJYnJlYWs7CisJCQlpbmRleCsrOworCisJCQlCVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOworCQkJQlVHX09OKFBhZ2VXcml0ZWJhY2socGFnZSkpOworCiAJCQlwYWdlc19za2lwcGVkID0gbXBkLT53YmMtPnBhZ2VzX3NraXBwZWQ7CiAJCQllcnIgPSBtYXBwaW5nLT5hX29wcy0+d3JpdGVwYWdlKHBhZ2UsIG1wZC0+d2JjKTsKIAkJCWlmICghZXJyICYmIChwYWdlc19za2lwcGVkID09IG1wZC0+d2JjLT5wYWdlc19za2lwcGVkKSkKQEAgLTE4MzEsMTMgKzE4NjcsMTMgQEAKIAkJCWV4dDRfY291bnRfZnJlZV9ibG9ja3MoaW5vZGUtPmlfc2IpKTsKIAlwcmludGsoS0VSTl9FTUVSRyAiRnJlZS9EaXJ0eSBibG9jayBkZXRhaWxzXG4iKTsKIAlwcmludGsoS0VSTl9FTUVSRyAiZnJlZV9ibG9ja3M9JWxsZFxuIiwKLQkJCXBlcmNwdV9jb3VudGVyX3N1bSgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlcikpOworCQkJKGxvbmcgbG9uZylwZXJjcHVfY291bnRlcl9zdW0oJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIpKTsKIAlwcmludGsoS0VSTl9FTUVSRyAiZGlydHlfYmxvY2tzPSVsbGRcbiIsCi0JCQlwZXJjcHVfY291bnRlcl9zdW0oJnNiaS0+c19kaXJ0eWJsb2Nrc19jb3VudGVyKSk7CisJCQkobG9uZyBsb25nKXBlcmNwdV9jb3VudGVyX3N1bSgmc2JpLT5zX2RpcnR5YmxvY2tzX2NvdW50ZXIpKTsKIAlwcmludGsoS0VSTl9FTUVSRyAiQmxvY2sgcmVzZXJ2YXRpb24gZGV0YWlsc1xuIik7Ci0JcHJpbnRrKEtFUk5fRU1FUkcgImlfcmVzZXJ2ZWRfZGF0YV9ibG9ja3M9JWx1XG4iLAorCXByaW50ayhLRVJOX0VNRVJHICJpX3Jlc2VydmVkX2RhdGFfYmxvY2tzPSV1XG4iLAogCQkJRVhUNF9JKGlub2RlKS0+aV9yZXNlcnZlZF9kYXRhX2Jsb2Nrcyk7Ci0JcHJpbnRrKEtFUk5fRU1FUkcgImlfcmVzZXJ2ZWRfbWV0YV9ibG9ja3M9JWx1XG4iLAorCXByaW50ayhLRVJOX0VNRVJHICJpX3Jlc2VydmVkX21ldGFfYmxvY2tzPSV1XG4iLAogCQkJRVhUNF9JKGlub2RlKS0+aV9yZXNlcnZlZF9tZXRhX2Jsb2Nrcyk7CiAJcmV0dXJuOwogfQpAQCAtMjA4NywxMSArMjEyMywyOSBAQAogCQliaCA9IGhlYWQ7CiAJCWRvIHsKIAkJCUJVR19PTihidWZmZXJfbG9ja2VkKGJoKSk7CisJCQkvKgorCQkJICogV2UgbmVlZCB0byB0cnkgdG8gYWxsb2NhdGUKKwkJCSAqIHVubWFwcGVkIGJsb2NrcyBpbiB0aGUgc2FtZSBwYWdlLgorCQkJICogT3RoZXJ3aXNlIHdlIHdvbid0IG1ha2UgcHJvZ3Jlc3MKKwkJCSAqIHdpdGggdGhlIHBhZ2UgaW4gZXh0NF9kYV93cml0ZXBhZ2UKKwkJCSAqLwogCQkJaWYgKGJ1ZmZlcl9kaXJ0eShiaCkgJiYKIAkJCQkoIWJ1ZmZlcl9tYXBwZWQoYmgpIHx8IGJ1ZmZlcl9kZWxheShiaCkpKSB7CiAJCQkJbXBhZ2VfYWRkX2JoX3RvX2V4dGVudChtcGQsIGxvZ2ljYWwsIGJoKTsKIAkJCQlpZiAobXBkLT5pb19kb25lKQogCQkJCQlyZXR1cm4gTVBBR0VfREFfRVhURU5UX1RBSUw7CisJCQl9IGVsc2UgaWYgKGJ1ZmZlcl9kaXJ0eShiaCkgJiYgKGJ1ZmZlcl9tYXBwZWQoYmgpKSkgeworCQkJCS8qCisJCQkJICogbWFwcGVkIGRpcnR5IGJ1ZmZlci4gV2UgbmVlZCB0byB1cGRhdGUKKwkJCQkgKiB0aGUgYl9zdGF0ZSBiZWNhdXNlIHdlIGxvb2sgYXQKKwkJCQkgKiBiX3N0YXRlIGluIG1wYWdlX2RhX21hcF9ibG9ja3MuIFdlIGRvbid0CisJCQkJICogdXBkYXRlIGJfc2l6ZSBiZWNhdXNlIGlmIHdlIGZpbmQgYW4KKwkJCQkgKiB1bm1hcHBlZCBidWZmZXJfaGVhZCBsYXRlciB3ZSBuZWVkIHRvCisJCQkJICogdXNlIHRoZSBiX3N0YXRlIGZsYWcgb2YgdGhhdCBidWZmZXJfaGVhZC4KKwkJCQkgKi8KKwkJCQlpZiAobXBkLT5sYmguYl9zaXplID09IDApCisJCQkJCW1wZC0+bGJoLmJfc3RhdGUgPQorCQkJCQkJYmgtPmJfc3RhdGUgJiBCSF9GTEFHUzsKIAkJCX0KIAkJCWxvZ2ljYWwrKzsKIAkJfSB3aGlsZSAoKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKQEAgLTIyNjksMTAgKzIzMjMsMTMgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAlsb2ZmX3Qgc2l6ZTsKLQl1bnNpZ25lZCBsb25nIGxlbjsKKwl1bnNpZ25lZCBpbnQgbGVuOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqcGFnZV9idWZzOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OwogCisJdHJhY2VfbWFyayhleHQ0X2RhX3dyaXRlcGFnZSwKKwkJICAgImRldiAlcyBpbm8gJWx1IHBhZ2VfaW5kZXggJWx1IiwKKwkJICAgaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubywgcGFnZS0+aW5kZXgpOwogCXNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CiAJaWYgKHBhZ2UtPmluZGV4ID09IHNpemUgPj4gUEFHRV9DQUNIRV9TSElGVCkKIAkJbGVuID0gc2l6ZSAmIH5QQUdFX0NBQ0hFX01BU0s7CkBAIC0yMzc4LDEwICsyNDM1LDI1IEBACiAJc3RydWN0IG1wYWdlX2RhX2RhdGEgbXBkOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OwogCWludCBub19ucndyaXRlX2luZGV4X3VwZGF0ZTsKLQlsb25nIHBhZ2VzX3dyaXR0ZW4gPSAwLCBwYWdlc19za2lwcGVkOworCWludCBwYWdlc193cml0dGVuID0gMDsKKwlsb25nIHBhZ2VzX3NraXBwZWQ7CiAJaW50IG5lZWRlZF9ibG9ja3MsIHJldCA9IDAsIG5yX3RvX3dyaXRlYnVtcCA9IDA7CiAJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihtYXBwaW5nLT5ob3N0LT5pX3NiKTsKIAorCXRyYWNlX21hcmsoZXh0NF9kYV93cml0ZXBhZ2VzLAorCQkgICAiZGV2ICVzIGlubyAlbHUgbnJfdF93cml0ZSAlbGQgIgorCQkgICAicGFnZXNfc2tpcHBlZCAlbGQgcmFuZ2Vfc3RhcnQgJWxsdSAiCisJCSAgICJyYW5nZV9lbmQgJWxsdSBub25ibG9ja2luZyAlZCAiCisJCSAgICJmb3Jfa3VwZGF0ZSAlZCBmb3JfcmVjbGFpbSAlZCAiCisJCSAgICJmb3Jfd3JpdGVwYWdlcyAlZCByYW5nZV9jeWNsaWMgJWQiLAorCQkgICBpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vLAorCQkgICB3YmMtPm5yX3RvX3dyaXRlLCB3YmMtPnBhZ2VzX3NraXBwZWQsCisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHdiYy0+cmFuZ2Vfc3RhcnQsCisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHdiYy0+cmFuZ2VfZW5kLAorCQkgICB3YmMtPm5vbmJsb2NraW5nLCB3YmMtPmZvcl9rdXBkYXRlLAorCQkgICB3YmMtPmZvcl9yZWNsYWltLCB3YmMtPmZvcl93cml0ZXBhZ2VzLAorCQkgICB3YmMtPnJhbmdlX2N5Y2xpYyk7CisKIAkvKgogCSAqIE5vIHBhZ2VzIHRvIHdyaXRlPyBUaGlzIGlzIG1haW5seSBhIGtsdWRnZSB0byBhdm9pZCBzdGFydGluZwogCSAqIGEgdHJhbnNhY3Rpb24gZm9yIHNwZWNpYWwgaW5vZGVzIGxpa2Ugam91cm5hbCBpbm9kZSBvbiBsYXN0IGlwdXQoKQpAQCAtMjM4OSw2ICsyNDYxLDIwIEBACiAJICovCiAJaWYgKCFtYXBwaW5nLT5ucnBhZ2VzIHx8ICFtYXBwaW5nX3RhZ2dlZChtYXBwaW5nLCBQQUdFQ0FDSEVfVEFHX0RJUlRZKSkKIAkJcmV0dXJuIDA7CisKKwkvKgorCSAqIElmIHRoZSBmaWxlc3lzdGVtIGhhcyBhYm9ydGVkLCBpdCBpcyByZWFkLW9ubHksIHNvIHJldHVybgorCSAqIHJpZ2h0IGF3YXkgaW5zdGVhZCBvZiBkdW1waW5nIHN0YWNrIHRyYWNlcyBsYXRlciBvbiB0aGF0CisJICogd2lsbCBvYnNjdXJlIHRoZSByZWFsIHNvdXJjZSBvZiB0aGUgcHJvYmxlbS4gIFdlIHRlc3QKKwkgKiBFWFQ0X01PVU5UX0FCT1JUIGluc3RlYWQgb2Ygc2ItPnNfZmxhZydzIE1TX1JET05MWSBiZWNhdXNlCisJICogdGhlIGxhdHRlciBjb3VsZCBiZSB0cnVlIGlmIHRoZSBmaWxlc3lzdGVtIGlzIG1vdW50ZWQKKwkgKiByZWFkLW9ubHksIGFuZCBpbiB0aGF0IGNhc2UsIGV4dDRfZGFfd3JpdGVwYWdlcyBzaG91bGQKKwkgKiAqbmV2ZXIqIGJlIGNhbGxlZCwgc28gaWYgdGhhdCBldmVyIGhhcHBlbnMsIHdlIHdvdWxkIHdhbnQKKwkgKiB0aGUgc3RhY2sgdHJhY2UuCisJICovCisJaWYgKHVubGlrZWx5KHNiaS0+c19tb3VudF9vcHQgJiBFWFQ0X01PVU5UX0FCT1JUKSkKKwkJcmV0dXJuIC1FUk9GUzsKKwogCS8qCiAJICogTWFrZSBzdXJlIG5yX3RvX3dyaXRlIGlzID49IHNiaS0+c19tYl9zdHJlYW1fcmVxdWVzdAogCSAqIFRoaXMgbWFrZSBzdXJlIHNtYWxsIGZpbGVzIGJsb2NrcyBhcmUgYWxsb2NhdGVkIGluCkBAIC0yNDMzLDcgKzI1MTksNyBAQAogCQloYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnQoaW5vZGUsIG5lZWRlZF9ibG9ja3MpOwogCQlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKIAkJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKLQkJCXByaW50ayhLRVJOX0VNRVJHICIlczogamJkMl9zdGFydDogIgorCQkJcHJpbnRrKEtFUk5fQ1JJVCAiJXM6IGpiZDJfc3RhcnQ6ICIKIAkJCSAgICAgICAiJWxkIHBhZ2VzLCBpbm8gJWx1OyBlcnIgJWRcbiIsIF9fZnVuY19fLAogCQkJCXdiYy0+bnJfdG9fd3JpdGUsIGlub2RlLT5pX2lubywgcmV0KTsKIAkJCWR1bXBfc3RhY2soKTsKQEAgLTI0ODYsNiArMjU3MiwxNCBAQAogCWlmICghbm9fbnJ3cml0ZV9pbmRleF91cGRhdGUpCiAJCXdiYy0+bm9fbnJ3cml0ZV9pbmRleF91cGRhdGUgPSAwOwogCXdiYy0+bnJfdG9fd3JpdGUgLT0gbnJfdG9fd3JpdGVidW1wOworCXRyYWNlX21hcmsoZXh0NF9kYV93cml0ZXBhZ2VfcmVzdWx0LAorCQkgICAiZGV2ICVzIGlubyAlbHUgcmV0ICVkIHBhZ2VzX3dyaXR0ZW4gJWQgIgorCQkgICAicGFnZXNfc2tpcHBlZCAlbGQgY29uZ2VzdGlvbiAlZCAiCisJCSAgICJtb3JlX2lvICVkIG5vX25yd3JpdGVfaW5kZXhfdXBkYXRlICVkIiwKKwkJICAgaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubywgcmV0LAorCQkgICBwYWdlc193cml0dGVuLCB3YmMtPnBhZ2VzX3NraXBwZWQsCisJCSAgIHdiYy0+ZW5jb3VudGVyZWRfY29uZ2VzdGlvbiwgd2JjLT5tb3JlX2lvLAorCQkgICB3YmMtPm5vX25yd3JpdGVfaW5kZXhfdXBkYXRlKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0yNDk4LDcgKzI1OTIsNyBAQAogCS8qCiAJICogc3dpdGNoIHRvIG5vbiBkZWxhbGxvYyBtb2RlIGlmIHdlIGFyZSBydW5uaW5nIGxvdwogCSAqIG9uIGZyZWUgYmxvY2suIFRoZSBmcmVlIGJsb2NrIGFjY291bnRpbmcgdmlhIHBlcmNwdQotCSAqIGNvdW50ZXJzIGNhbiBnZXQgc2xpZ2h0bHkgd3Jvbmcgd2l0aCBGQkNfQkFUQ0ggZ2V0dGluZworCSAqIGNvdW50ZXJzIGNhbiBnZXQgc2xpZ2h0bHkgd3Jvbmcgd2l0aCBwZXJjcHVfY291bnRlcl9iYXRjaCBnZXR0aW5nCiAJICogYWNjdW11bGF0ZWQgb24gZWFjaCBDUFUgd2l0aG91dCB1cGRhdGluZyBnbG9iYWwgY291bnRlcnMKIAkgKiBEZWxhbGxvYyBuZWVkIGFuIGFjY3VyYXRlIGZyZWUgYmxvY2sgYWNjb3VudGluZy4gU28gc3dpdGNoCiAJICogdG8gbm9uIGRlbGFsbG9jIHdoZW4gd2UgYXJlIG5lYXIgdG8gZXJyb3IgcmFuZ2UuCkBAIC0yNTM3LDYgKzI2MzEsMTEgQEAKIAkJCQkJbGVuLCBmbGFncywgcGFnZXAsIGZzZGF0YSk7CiAJfQogCSpmc2RhdGEgPSAodm9pZCAqKTA7CisKKwl0cmFjZV9tYXJrKGV4dDRfZGFfd3JpdGVfYmVnaW4sCisJCSAgICJkZXYgJXMgaW5vICVsdSBwb3MgJWxsdSBsZW4gJXUgZmxhZ3MgJXUiLAorCQkgICBpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vLAorCQkgICAodW5zaWduZWQgbG9uZyBsb25nKSBwb3MsIGxlbiwgZmxhZ3MpOwogcmV0cnk6CiAJLyoKIAkgKiBXaXRoIGRlbGF5ZWQgYWxsb2NhdGlvbiwgd2UgZG9uJ3QgbG9nIHRoZSBpX2Rpc2tzaXplIHVwZGF0ZQpAQCAtMjYyNiw2ICsyNzI1LDEwIEBACiAJCX0KIAl9CiAKKwl0cmFjZV9tYXJrKGV4dDRfZGFfd3JpdGVfZW5kLAorCQkgICAiZGV2ICVzIGlubyAlbHUgcG9zICVsbHUgbGVuICV1IGNvcGllZCAldSIsCisJCSAgIGlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8sCisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBvcywgbGVuLCBjb3BpZWQpOwogCXN0YXJ0ID0gcG9zICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOwogCWVuZCA9IHN0YXJ0ICsgY29waWVkIC0gMTsKIApAQCAtMjcxOCw3ICsyODIxLDEwIEBACiAJCWZpbGVtYXBfd3JpdGVfYW5kX3dhaXQobWFwcGluZyk7CiAJfQogCi0JaWYgKEVYVDRfSShpbm9kZSktPmlfc3RhdGUgJiBFWFQ0X1NUQVRFX0pEQVRBKSB7CisJQlVHX09OKCFFWFQ0X0pPVVJOQUwoaW5vZGUpICYmCisJICAgICAgIEVYVDRfSShpbm9kZSktPmlfc3RhdGUgJiBFWFQ0X1NUQVRFX0pEQVRBKTsKKworCWlmIChFWFQ0X0pPVVJOQUwoaW5vZGUpICYmIEVYVDRfSShpbm9kZSktPmlfc3RhdGUgJiBFWFQ0X1NUQVRFX0pEQVRBKSB7CiAJCS8qCiAJCSAqIFRoaXMgaXMgYSBSRUFMTFkgaGVhdnl3ZWlnaHQgYXBwcm9hY2gsIGJ1dCB0aGUgdXNlIG9mCiAJCSAqIGJtYXAgb24gZGlydHkgZmlsZXMgaXMgZXhwZWN0ZWQgdG8gYmUgZXh0cmVtZWx5IHJhcmU6CkBAIC0yODM2LDYgKzI5NDIsOSBAQAogCWxvZmZfdCBzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOwogCWxvZmZfdCBsZW47CiAKKwl0cmFjZV9tYXJrKGV4dDRfbm9ybWFsX3dyaXRlcGFnZSwKKwkJICAgImRldiAlcyBpbm8gJWx1IHBhZ2VfaW5kZXggJWx1IiwKKwkJICAgaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubywgcGFnZS0+aW5kZXgpOwogCUpfQVNTRVJUKFBhZ2VMb2NrZWQocGFnZSkpOwogCWlmIChwYWdlLT5pbmRleCA9PSBzaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQpCiAJCWxlbiA9IHNpemUgJiB+UEFHRV9DQUNIRV9NQVNLOwpAQCAtMjkyMSw2ICszMDMwLDkgQEAKIAlsb2ZmX3Qgc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKIAlsb2ZmX3QgbGVuOwogCisJdHJhY2VfbWFyayhleHQ0X2pvdXJuYWxsZWRfd3JpdGVwYWdlLAorCQkgICAiZGV2ICVzIGlubyAlbHUgcGFnZV9pbmRleCAlbHUiLAorCQkgICBpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vLCBwYWdlLT5pbmRleCk7CiAJSl9BU1NFUlQoUGFnZUxvY2tlZChwYWdlKSk7CiAJaWYgKHBhZ2UtPmluZGV4ID09IHNpemUgPj4gUEFHRV9DQUNIRV9TSElGVCkKIAkJbGVuID0gc2l6ZSAmIH5QQUdFX0NBQ0hFX01BU0s7CkBAIC0yOTg5LDcgKzMxMDEsMTAgQEAKIAlpZiAob2Zmc2V0ID09IDApCiAJCUNsZWFyUGFnZUNoZWNrZWQocGFnZSk7CiAKLQlqYmQyX2pvdXJuYWxfaW52YWxpZGF0ZXBhZ2Uoam91cm5hbCwgcGFnZSwgb2Zmc2V0KTsKKwlpZiAoam91cm5hbCkKKwkJamJkMl9qb3VybmFsX2ludmFsaWRhdGVwYWdlKGpvdXJuYWwsIHBhZ2UsIG9mZnNldCk7CisJZWxzZQorCQlibG9ja19pbnZhbGlkYXRlcGFnZShwYWdlLCBvZmZzZXQpOwogfQogCiBzdGF0aWMgaW50IGV4dDRfcmVsZWFzZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGdmcF90IHdhaXQpCkBAIC0yOTk5LDcgKzMxMTQsMTAgQEAKIAlXQVJOX09OKFBhZ2VDaGVja2VkKHBhZ2UpKTsKIAlpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpCiAJCXJldHVybiAwOwotCXJldHVybiBqYmQyX2pvdXJuYWxfdHJ5X3RvX2ZyZWVfYnVmZmVycyhqb3VybmFsLCBwYWdlLCB3YWl0KTsKKwlpZiAoam91cm5hbCkKKwkJcmV0dXJuIGpiZDJfam91cm5hbF90cnlfdG9fZnJlZV9idWZmZXJzKGpvdXJuYWwsIHBhZ2UsIHdhaXQpOworCWVsc2UKKwkJcmV0dXJuIHRyeV90b19mcmVlX2J1ZmZlcnMocGFnZSk7CiB9CiAKIC8qCkBAIC0zMjcxLDcgKzMzODksNyBAQAogCiAJZXJyID0gMDsKIAlpZiAoZXh0NF9zaG91bGRfam91cm5hbF9kYXRhKGlub2RlKSkgewotCQllcnIgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgaW5vZGUsIGJoKTsKIAl9IGVsc2UgewogCQlpZiAoZXh0NF9zaG91bGRfb3JkZXJfZGF0YShpbm9kZSkpCiAJCQllcnIgPSBleHQ0X2piZDJfZmlsZV9pbm9kZShoYW5kbGUsIGlub2RlKTsKQEAgLTMzOTUsOCArMzUxMyw4IEBACiAJX19sZTMyICpwOwogCWlmICh0cnlfdG9fZXh0ZW5kX3RyYW5zYWN0aW9uKGhhbmRsZSwgaW5vZGUpKSB7CiAJCWlmIChiaCkgewotCQkJQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEiKTsKLQkJCWV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKTsKKwkJCUJVRkZFUl9UUkFDRShiaCwgImNhbGwgZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEiKTsKKwkJCWV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgaW5vZGUsIGJoKTsKIAkJfQogCQlleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CiAJCWV4dDRfam91cm5hbF90ZXN0X3Jlc3RhcnQoaGFuZGxlLCBpbm9kZSk7CkBAIC0zNDk2LDcgKzM2MTQsNyBAQAogCQkJCSAgY291bnQsIGJsb2NrX3RvX2ZyZWVfcCwgcCk7CiAKIAlpZiAodGhpc19iaCkgewotCQlCVUZGRVJfVFJBQ0UodGhpc19iaCwgImNhbGwgZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7CisJCUJVRkZFUl9UUkFDRSh0aGlzX2JoLCAiY2FsbCBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YSIpOwogCiAJCS8qCiAJCSAqIFRoZSBidWZmZXIgaGVhZCBzaG91bGQgaGF2ZSBhbiBhdHRhY2hlZCBqb3VybmFsIGhlYWQgYXQgdGhpcwpAQCAtMzUwNSw3ICszNjIzLDcgQEAKIAkJICogdGhlIGJsb2NrIHdhcyBjbGVhcmVkLiBDaGVjayBmb3IgdGhpcyBpbnN0ZWFkIG9mIE9PUFNpbmcuCiAJCSAqLwogCQlpZiAoYmgyamgodGhpc19iaCkpCi0JCQlleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCB0aGlzX2JoKTsKKwkJCWV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgaW5vZGUsIHRoaXNfYmgpOwogCQllbHNlCiAJCQlleHQ0X2Vycm9yKGlub2RlLT5pX3NiLCBfX2Z1bmNfXywKIAkJCQkgICAiY2lyY3VsYXIgaW5kaXJlY3QgYmxvY2sgZGV0ZWN0ZWQsICIKQEAgLTM1MzUsNyArMzY1Myw3IEBACiAJZXh0NF9mc2Jsa190IG5yOwogCV9fbGUzMiAqcDsKIAotCWlmIChpc19oYW5kbGVfYWJvcnRlZChoYW5kbGUpKQorCWlmIChleHQ0X2hhbmRsZV9pc19hYm9ydGVkKGhhbmRsZSkpCiAJCXJldHVybjsKIAogCWlmIChkZXB0aC0tKSB7CkBAIC0zNjA1LDcgKzM3MjMsNyBAQAogCQkJICogd2lsbCBtZXJlbHkgY29tcGxhaW4gYWJvdXQgcmVsZWFzaW5nIGEgZnJlZSBibG9jaywKIAkJCSAqIHJhdGhlciB0aGFuIGxlYWtpbmcgYmxvY2tzLgogCQkJICovCi0JCQlpZiAoaXNfaGFuZGxlX2Fib3J0ZWQoaGFuZGxlKSkKKwkJCWlmIChleHQ0X2hhbmRsZV9pc19hYm9ydGVkKGhhbmRsZSkpCiAJCQkJcmV0dXJuOwogCQkJaWYgKHRyeV90b19leHRlbmRfdHJhbnNhY3Rpb24oaGFuZGxlLCBpbm9kZSkpIHsKIAkJCQlleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CkBAIC0zNjI0LDkgKzM3NDIsMTAgQEAKIAkJCQkJCQkJICAgcGFyZW50X2JoKSl7CiAJCQkJCSpwID0gMDsKIAkJCQkJQlVGRkVSX1RSQUNFKHBhcmVudF9iaCwKLQkJCQkJImNhbGwgZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7Ci0JCQkJCWV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsCi0JCQkJCQkJCSAgICBwYXJlbnRfYmgpOworCQkJCQkiY2FsbCBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YSIpOworCQkJCQlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsCisJCQkJCQkJCSAgIGlub2RlLAorCQkJCQkJCQkgICBwYXJlbnRfYmgpOwogCQkJCX0KIAkJCX0KIAkJfQpAQCAtMzgxNCw3ICszOTMzLDcgQEAKIAkgKiBzeW5jaHJvbm91cwogCSAqLwogCWlmIChJU19TWU5DKGlub2RlKSkKLQkJaGFuZGxlLT5oX3N5bmMgPSAxOworCQlleHQ0X2hhbmRsZV9zeW5jKGhhbmRsZSk7CiBvdXRfc3RvcDoKIAkvKgogCSAqIElmIHRoaXMgd2FzIGEgc2ltcGxlIGZ0cnVuY2F0ZSgpLCBhbmQgdGhlIGZpbGUgd2lsbCByZW1haW4gYWxpdmUKQEAgLTM4NDQsNyArMzk2Myw3IEBACiAJZXh0NF9mc2Jsa190CQlibG9jazsKIAlpbnQJCQlpbm9kZXNfcGVyX2Jsb2NrLCBpbm9kZV9vZmZzZXQ7CiAKLQlpbG9jLT5iaCA9IDA7CisJaWxvYy0+YmggPSBOVUxMOwogCWlmICghZXh0NF92YWxpZF9pbnVtKHNiLCBpbm9kZS0+aV9pbm8pKQogCQlyZXR1cm4gLUVJTzsKIApAQCAtMzk1MSw3ICs0MDcwLDcgQEAKIAkJCW51bSA9IEVYVDRfSU5PREVTX1BFUl9HUk9VUChzYik7CiAJCQlpZiAoRVhUNF9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsCiAJCQkJICAgICAgIEVYVDRfRkVBVFVSRV9ST19DT01QQVRfR0RUX0NTVU0pKQotCQkJCW51bSAtPSBsZTE2X3RvX2NwdShnZHAtPmJnX2l0YWJsZV91bnVzZWQpOworCQkJCW51bSAtPSBleHQ0X2l0YWJsZV91bnVzZWRfY291bnQoc2IsIGdkcCk7CiAJCQl0YWJsZSArPSBudW0gLyBpbm9kZXNfcGVyX2Jsb2NrOwogCQkJaWYgKGVuZCA+IHRhYmxlKQogCQkJCWVuZCA9IHRhYmxlOwpAQCAtNDMxMyw4ICs0NDMyLDggQEAKIAkJCUVYVDRfU0VUX1JPX0NPTVBBVF9GRUFUVVJFKHNiLAogCQkJCQlFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0xBUkdFX0ZJTEUpOwogCQkJc2ItPnNfZGlydCA9IDE7Ci0JCQloYW5kbGUtPmhfc3luYyA9IDE7Ci0JCQllcnIgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLAorCQkJZXh0NF9oYW5kbGVfc3luYyhoYW5kbGUpOworCQkJZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBpbm9kZSwKIAkJCQkJRVhUNF9TQihzYiktPnNfc2JoKTsKIAkJfQogCX0KQEAgLTQzNDEsOSArNDQ2MCw4IEBACiAJCXJhd19pbm9kZS0+aV9leHRyYV9pc2l6ZSA9IGNwdV90b19sZTE2KGVpLT5pX2V4dHJhX2lzaXplKTsKIAl9CiAKLQotCUJVRkZFUl9UUkFDRShiaCwgImNhbGwgZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7Ci0JcmMgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YSIpOworCXJjID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBpbm9kZSwgYmgpOwogCWlmICghZXJyKQogCQllcnIgPSByYzsKIAllaS0+aV9zdGF0ZSAmPSB+RVhUNF9TVEFURV9ORVc7CkBAIC00NDA2LDYgKzQ1MjQsMjUgQEAKIAlyZXR1cm4gZXh0NF9mb3JjZV9jb21taXQoaW5vZGUtPmlfc2IpOwogfQogCitpbnQgX19leHQ0X3dyaXRlX2RpcnR5X21ldGFkYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJaW50IGVyciA9IDA7CisKKwltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJaWYgKGlub2RlICYmIGlub2RlX25lZWRzX3N5bmMoaW5vZGUpKSB7CisJCXN5bmNfZGlydHlfYnVmZmVyKGJoKTsKKwkJaWYgKGJ1ZmZlcl9yZXEoYmgpICYmICFidWZmZXJfdXB0b2RhdGUoYmgpKSB7CisJCQlleHQ0X2Vycm9yKGlub2RlLT5pX3NiLCBfX2Z1bmNfXywKKwkJCQkgICAiSU8gZXJyb3Igc3luY2luZyBpbm9kZSwgIgorCQkJCSAgICJpbm9kZT0lbHUsIGJsb2NrPSVsbHUiLAorCQkJCSAgIGlub2RlLT5pX2lubywKKwkJCQkgICAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIpOworCQkJZXJyID0gLUVJTzsKKwkJfQorCX0KKwlyZXR1cm4gZXJyOworfQorCiAvKgogICogZXh0NF9zZXRhdHRyKCkKICAqCkBAIC00NzEwLDE2ICs0ODQ3LDE1IEBACiBleHQ0X3Jlc2VydmVfaW5vZGVfd3JpdGUoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCSBzdHJ1Y3QgZXh0NF9pbG9jICppbG9jKQogewotCWludCBlcnIgPSAwOwotCWlmIChoYW5kbGUpIHsKLQkJZXJyID0gZXh0NF9nZXRfaW5vZGVfbG9jKGlub2RlLCBpbG9jKTsKLQkJaWYgKCFlcnIpIHsKLQkJCUJVRkZFUl9UUkFDRShpbG9jLT5iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKLQkJCWVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgaWxvYy0+YmgpOwotCQkJaWYgKGVycikgewotCQkJCWJyZWxzZShpbG9jLT5iaCk7Ci0JCQkJaWxvYy0+YmggPSBOVUxMOwotCQkJfQorCWludCBlcnI7CisKKwllcnIgPSBleHQ0X2dldF9pbm9kZV9sb2MoaW5vZGUsIGlsb2MpOworCWlmICghZXJyKSB7CisJCUJVRkZFUl9UUkFDRShpbG9jLT5iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKKwkJZXJyID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBpbG9jLT5iaCk7CisJCWlmIChlcnIpIHsKKwkJCWJyZWxzZShpbG9jLT5iaCk7CisJCQlpbG9jLT5iaCA9IE5VTEw7CiAJCX0KIAl9CiAJZXh0NF9zdGRfZXJyb3IoaW5vZGUtPmlfc2IsIGVycik7CkBAIC00NzkxLDcgKzQ5MjcsOCBAQAogCiAJbWlnaHRfc2xlZXAoKTsKIAllcnIgPSBleHQ0X3Jlc2VydmVfaW5vZGVfd3JpdGUoaGFuZGxlLCBpbm9kZSwgJmlsb2MpOwotCWlmIChFWFQ0X0koaW5vZGUpLT5pX2V4dHJhX2lzaXplIDwgc2JpLT5zX3dhbnRfZXh0cmFfaXNpemUgJiYKKwlpZiAoZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSAmJgorCSAgICBFWFQ0X0koaW5vZGUpLT5pX2V4dHJhX2lzaXplIDwgc2JpLT5zX3dhbnRfZXh0cmFfaXNpemUgJiYKIAkgICAgIShFWFQ0X0koaW5vZGUpLT5pX3N0YXRlICYgRVhUNF9TVEFURV9OT19FWFBBTkQpKSB7CiAJCS8qCiAJCSAqIFdlIG5lZWQgZXh0cmEgYnVmZmVyIGNyZWRpdHMgc2luY2Ugd2UgbWF5IHdyaXRlIGludG8gRUEgYmxvY2sKQEAgLTQ4NDMsNiArNDk4MCwxMSBAQAogCWhhbmRsZV90ICpjdXJyZW50X2hhbmRsZSA9IGV4dDRfam91cm5hbF9jdXJyZW50X2hhbmRsZSgpOwogCWhhbmRsZV90ICpoYW5kbGU7CiAKKwlpZiAoIWV4dDRfaGFuZGxlX3ZhbGlkKGN1cnJlbnRfaGFuZGxlKSkgeworCQlleHQ0X21hcmtfaW5vZGVfZGlydHkoY3VycmVudF9oYW5kbGUsIGlub2RlKTsKKwkJcmV0dXJuOworCX0KKwogCWhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChpbm9kZSwgMik7CiAJaWYgKElTX0VSUihoYW5kbGUpKQogCQlnb3RvIG91dDsKQEAgLTQ4ODAsOCArNTAyMiw5IEBACiAJCQlCVUZGRVJfVFJBQ0UoaWxvYy5iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKIAkJCWVyciA9IGpiZDJfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgaWxvYy5iaCk7CiAJCQlpZiAoIWVycikKLQkJCQllcnIgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLAotCQkJCQkJCQkgIGlsb2MuYmgpOworCQkJCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwKKwkJCQkJCQkJIGlub2RlLAorCQkJCQkJCQkgaWxvYy5iaCk7CiAJCQlicmVsc2UoaWxvYy5iaCk7CiAJCX0KIAl9CkBAIC00OTA3LDYgKzUwNTAsOCBAQAogCSAqLwogCiAJam91cm5hbCA9IEVYVDRfSk9VUk5BTChpbm9kZSk7CisJaWYgKCFqb3VybmFsKQorCQlyZXR1cm4gMDsKIAlpZiAoaXNfam91cm5hbF9hYm9ydGVkKGpvdXJuYWwpKQogCQlyZXR1cm4gLUVST0ZTOwogCkBAIC00OTM2LDcgKzUwODEsNyBAQAogCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOwogCiAJZXJyID0gZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOwotCWhhbmRsZS0+aF9zeW5jID0gMTsKKwlleHQ0X2hhbmRsZV9zeW5jKGhhbmRsZSk7CiAJZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTsKIAlleHQ0X3N0ZF9lcnJvcihpbm9kZS0+aV9zYiwgZXJyKTsKIApkaWZmIC0tZ2l0IGEvZnMvZXh0NC9pb2N0bC5jIGIvZnMvZXh0NC9pb2N0bC5jCmluZGV4IGRjOTliNDcuLjQyZGM4M2YgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvaW9jdGwuYworKysgYi9mcy9leHQ0L2lvY3RsLmMKQEAgLTk5LDcgKzk5LDcgQEAKIAkJCWdvdG8gZmxhZ3Nfb3V0OwogCQl9CiAJCWlmIChJU19TWU5DKGlub2RlKSkKLQkJCWhhbmRsZS0+aF9zeW5jID0gMTsKKwkJCWV4dDRfaGFuZGxlX3N5bmMoaGFuZGxlKTsKIAkJZXJyID0gZXh0NF9yZXNlcnZlX2lub2RlX3dyaXRlKGhhbmRsZSwgaW5vZGUsICZpbG9jKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gZmxhZ3NfZXJyOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9tYmFsbG9jLmMgYi9mcy9leHQ0L21iYWxsb2MuYwppbmRleCA0NDRhZDk5Li45MThhZWMwIDEwMDY0NAotLS0gYS9mcy9leHQ0L21iYWxsb2MuYworKysgYi9mcy9leHQ0L21iYWxsb2MuYwpAQCAtMTAwLDcgKzEwMCw3IEBACiAgKiBpbm9kZSBhczoKICAqCiAgKiAgeyAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gKiAgWyBncm91cCAwIGJ1ZGR5XVsgZ3JvdXAgMCBiaXRtYXBdIFtncm91cCAxXVsgZ3JvdXAgMV0uLi4KKyAqICBbIGdyb3VwIDAgYml0bWFwXVsgZ3JvdXAgMCBidWRkeV0gW2dyb3VwIDFdWyBncm91cCAxXS4uLgogICoKICAqCiAgKiBvbmUgYmxvY2sgZWFjaCBmb3IgYml0bWFwIGFuZCBidWRkeSBpbmZvcm1hdGlvbi4gIFNvIGZvciBlYWNoIGdyb3VwIHdlCkBAIC0zMzAsNiArMzMwLDE4IEBACiAgKiAgICAgICAgb2JqZWN0CiAgKgogICovCitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmV4dDRfcHNwYWNlX2NhY2hlcDsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqZXh0NF9hY19jYWNoZXA7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmV4dDRfZnJlZV9leHRfY2FjaGVwOworc3RhdGljIHZvaWQgZXh0NF9tYl9nZW5lcmF0ZV9mcm9tX3BhKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmJpdG1hcCwKKwkJCQkJZXh0NF9ncm91cF90IGdyb3VwKTsKK3N0YXRpYyB2b2lkIGV4dDRfbWJfZ2VuZXJhdGVfZnJvbV9mcmVlbGlzdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpiaXRtYXAsCisJCQkJCQlleHQ0X2dyb3VwX3QgZ3JvdXApOworc3RhdGljIGludCBleHQ0X21iX2luaXRfcGVyX2Rldl9wcm9jKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworc3RhdGljIGludCBleHQ0X21iX2Rlc3Ryb3lfcGVyX2Rldl9wcm9jKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworc3RhdGljIHZvaWQgcmVsZWFzZV9ibG9ja3Nfb25fY29tbWl0KGpvdXJuYWxfdCAqam91cm5hbCwgdHJhbnNhY3Rpb25fdCAqdHhuKTsKKworCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCAqbWJfY29ycmVjdF9hZGRyX2FuZF9iaXQoaW50ICpiaXQsIHZvaWQgKmFkZHIpCiB7CkBAIC00NDUsOSArNDU3LDkgQEAKIAkJCWJsb2NrbnIgKz0gZmlyc3QgKyBpOwogCQkJYmxvY2tuciArPQogCQkJICAgIGxlMzJfdG9fY3B1KEVYVDRfU0Ioc2IpLT5zX2VzLT5zX2ZpcnN0X2RhdGFfYmxvY2spOwotCi0JCQlleHQ0X2Vycm9yKHNiLCBfX2Z1bmNfXywgImRvdWJsZS1mcmVlIG9mIGlub2RlIgotCQkJCSAgICIgJWx1J3MgYmxvY2sgJWxsdShiaXQgJXUgaW4gZ3JvdXAgJWx1KVxuIiwKKwkJCWV4dDRfZ3JwX2xvY2tlZF9lcnJvcihzYiwgZTRiLT5iZF9ncm91cCwKKwkJCQkgICBfX2Z1bmNfXywgImRvdWJsZS1mcmVlIG9mIGlub2RlIgorCQkJCSAgICIgJWx1J3MgYmxvY2sgJWxsdShiaXQgJXUgaW4gZ3JvdXAgJXUpIiwKIAkJCQkgICBpbm9kZSA/IGlub2RlLT5pX2lubyA6IDAsIGJsb2NrbnIsCiAJCQkJICAgZmlyc3QgKyBpLCBlNGItPmJkX2dyb3VwKTsKIAkJfQpAQCAtNDc3LDcgKzQ4OSw3IEBACiAJCWIyID0gKHVuc2lnbmVkIGNoYXIgKikgYml0bWFwOwogCQlmb3IgKGkgPSAwOyBpIDwgZTRiLT5iZF9zYi0+c19ibG9ja3NpemU7IGkrKykgewogCQkJaWYgKGIxW2ldICE9IGIyW2ldKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJjb3JydXB0aW9uIGluIGdyb3VwICVsdSAiCisJCQkJcHJpbnRrKEtFUk5fRVJSICJjb3JydXB0aW9uIGluIGdyb3VwICV1ICIKIAkJCQkgICAgICAgImF0IGJ5dGUgJXUoJXUpOiAleCBpbiBjb3B5ICE9ICV4ICIKIAkJCQkgICAgICAgIm9uIGRpc2svcHJlYWxsb2NcbiIsCiAJCQkJICAgICAgIGU0Yi0+YmRfZ3JvdXAsIGksIGkgKiA4LCBiMVtpXSwgYjJbaV0pOwpAQCAtNjkwLDggKzcwMiw4IEBACiAJZ3JwLT5iYl9mcmFnbWVudHMgPSBmcmFnbWVudHM7CiAKIAlpZiAoZnJlZSAhPSBncnAtPmJiX2ZyZWUpIHsKLQkJZXh0NF9lcnJvcihzYiwgX19mdW5jX18sCi0JCQkiRVhUNC1mczogZ3JvdXAgJWx1OiAldSBibG9ja3MgaW4gYml0bWFwLCAldSBpbiBnZFxuIiwKKwkJZXh0NF9ncnBfbG9ja2VkX2Vycm9yKHNiLCBncm91cCwgIF9fZnVuY19fLAorCQkJIkVYVDQtZnM6IGdyb3VwICV1OiAldSBibG9ja3MgaW4gYml0bWFwLCAldSBpbiBnZCIsCiAJCQlncm91cCwgZnJlZSwgZ3JwLT5iYl9mcmVlKTsKIAkJLyoKIAkJICogSWYgd2UgaW50ZW50IHRvIGNvbnRpbnVlLCB3ZSBjb25zaWRlciBncm91cCBkZXNjcml0b3IKQEAgLTcxNiw3ICs3MjgsNyBAQAogICogc3RvcmVkIGluIHRoZSBpbm9kZSBhcwogICoKICAqIHsgICAgICAgICAgICAgICAgICAgICAgICBwYWdlICAgICAgICAgICAgICAgICAgICAgICAgfQotICogWyBncm91cCAwIGJ1ZGR5XVsgZ3JvdXAgMCBiaXRtYXBdIFtncm91cCAxXVsgZ3JvdXAgMV0uLi4KKyAqIFsgZ3JvdXAgMCBiaXRtYXBdWyBncm91cCAwIGJ1ZGR5XSBbZ3JvdXAgMV1bIGdyb3VwIDFdLi4uCiAgKgogICoKICAqIG9uZSBibG9jayBlYWNoIGZvciBiaXRtYXAgYW5kIGJ1ZGR5IGluZm9ybWF0aW9uLgpAQCAtNzgyLDI1ICs3OTQsNDUgQEAKIAkJaWYgKGJoW2ldID09IE5VTEwpCiAJCQlnb3RvIG91dDsKIAotCQlpZiAoYnVmZmVyX3VwdG9kYXRlKGJoW2ldKSAmJgotCQkgICAgIShkZXNjLT5iZ19mbGFncyAmIGNwdV90b19sZTE2KEVYVDRfQkdfQkxPQ0tfVU5JTklUKSkpCisJCWlmIChiaXRtYXBfdXB0b2RhdGUoYmhbaV0pKQogCQkJY29udGludWU7CiAKIAkJbG9ja19idWZmZXIoYmhbaV0pOworCQlpZiAoYml0bWFwX3VwdG9kYXRlKGJoW2ldKSkgeworCQkJdW5sb2NrX2J1ZmZlcihiaFtpXSk7CisJCQljb250aW51ZTsKKwkJfQogCQlzcGluX2xvY2soc2JfYmdsX2xvY2soRVhUNF9TQihzYiksIGZpcnN0X2dyb3VwICsgaSkpOwogCQlpZiAoZGVzYy0+YmdfZmxhZ3MgJiBjcHVfdG9fbGUxNihFWFQ0X0JHX0JMT0NLX1VOSU5JVCkpIHsKIAkJCWV4dDRfaW5pdF9ibG9ja19iaXRtYXAoc2IsIGJoW2ldLAogCQkJCQkJZmlyc3RfZ3JvdXAgKyBpLCBkZXNjKTsKKwkJCXNldF9iaXRtYXBfdXB0b2RhdGUoYmhbaV0pOwogCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaFtpXSk7Ci0JCQl1bmxvY2tfYnVmZmVyKGJoW2ldKTsKIAkJCXNwaW5fdW5sb2NrKHNiX2JnbF9sb2NrKEVYVDRfU0Ioc2IpLCBmaXJzdF9ncm91cCArIGkpKTsKKwkJCXVubG9ja19idWZmZXIoYmhbaV0pOwogCQkJY29udGludWU7CiAJCX0KIAkJc3Bpbl91bmxvY2soc2JfYmdsX2xvY2soRVhUNF9TQihzYiksIGZpcnN0X2dyb3VwICsgaSkpOworCQlpZiAoYnVmZmVyX3VwdG9kYXRlKGJoW2ldKSkgeworCQkJLyoKKwkJCSAqIGlmIG5vdCB1bmluaXQgaWYgYmggaXMgdXB0b2RhdGUsCisJCQkgKiBiaXRtYXAgaXMgYWxzbyB1cHRvZGF0ZQorCQkJICovCisJCQlzZXRfYml0bWFwX3VwdG9kYXRlKGJoW2ldKTsKKwkJCXVubG9ja19idWZmZXIoYmhbaV0pOworCQkJY29udGludWU7CisJCX0KIAkJZ2V0X2JoKGJoW2ldKTsKKwkJLyoKKwkJICogc3VibWl0IHRoZSBidWZmZXJfaGVhZCBmb3IgcmVhZC4gV2UgY2FuCisJCSAqIHNhZmVseSBtYXJrIHRoZSBiaXRtYXAgYXMgdXB0b2RhdGUgbm93LgorCQkgKiBXZSBkbyBpdCBoZXJlIHNvIHRoZSBiaXRtYXAgdXB0b2RhdGUgYml0CisJCSAqIGdldCBzZXQgd2l0aCBidWZmZXIgbG9jayBoZWxkLgorCQkgKi8KKwkJc2V0X2JpdG1hcF91cHRvZGF0ZShiaFtpXSk7CiAJCWJoW2ldLT5iX2VuZF9pbyA9IGVuZF9idWZmZXJfcmVhZF9zeW5jOwogCQlzdWJtaXRfYmgoUkVBRCwgYmhbaV0pOwotCQltYl9kZWJ1ZygicmVhZCBiaXRtYXAgZm9yIGdyb3VwICVsdVxuIiwgZmlyc3RfZ3JvdXAgKyBpKTsKKwkJbWJfZGVidWcoInJlYWQgYml0bWFwIGZvciBncm91cCAldVxuIiwgZmlyc3RfZ3JvdXAgKyBpKTsKIAl9CiAKIAkvKiB3YWl0IGZvciBJL08gY29tcGxldGlvbiAqLwpAQCAtODE0LDYgKzg0Niw4IEBACiAKIAllcnIgPSAwOwogCWZpcnN0X2Jsb2NrID0gcGFnZS0+aW5kZXggKiBibG9ja3NfcGVyX3BhZ2U7CisJLyogaW5pdCB0aGUgcGFnZSAgKi8KKwltZW1zZXQocGFnZV9hZGRyZXNzKHBhZ2UpLCAweGZmLCBQQUdFX0NBQ0hFX1NJWkUpOwogCWZvciAoaSA9IDA7IGkgPCBibG9ja3NfcGVyX3BhZ2U7IGkrKykgewogCQlpbnQgZ3JvdXA7CiAJCXN0cnVjdCBleHQ0X2dyb3VwX2luZm8gKmdyaW5mbzsKQEAgLTg0MCw3ICs4NzQsNiBAQAogCQkJQlVHX09OKGluY29yZSA9PSBOVUxMKTsKIAkJCW1iX2RlYnVnKCJwdXQgYnVkZHkgZm9yIGdyb3VwICV1IGluIHBhZ2UgJWx1LyV4XG4iLAogCQkJCWdyb3VwLCBwYWdlLT5pbmRleCwgaSAqIGJsb2Nrc2l6ZSk7Ci0JCQltZW1zZXQoZGF0YSwgMHhmZiwgYmxvY2tzaXplKTsKIAkJCWdyaW5mbyA9IGV4dDRfZ2V0X2dyb3VwX2luZm8oc2IsIGdyb3VwKTsKIAkJCWdyaW5mby0+YmJfZnJhZ21lbnRzID0gMDsKIAkJCW1lbXNldChncmluZm8tPmJiX2NvdW50ZXJzLCAwLApAQCAtODQ4LDcgKzg4MSw5IEBACiAJCQkvKgogCQkJICogaW5jb3JlIGdvdCBzZXQgdG8gdGhlIGdyb3VwIGJsb2NrIGJpdG1hcCBiZWxvdwogCQkJICovCisJCQlleHQ0X2xvY2tfZ3JvdXAoc2IsIGdyb3VwKTsKIAkJCWV4dDRfbWJfZ2VuZXJhdGVfYnVkZHkoc2IsIGRhdGEsIGluY29yZSwgZ3JvdXApOworCQkJZXh0NF91bmxvY2tfZ3JvdXAoc2IsIGdyb3VwKTsKIAkJCWluY29yZSA9IE5VTEw7CiAJCX0gZWxzZSB7CiAJCQkvKiB0aGlzIGlzIGJsb2NrIG9mIGJpdG1hcCAqLwpAQCAtODYyLDYgKzg5Nyw3IEBACiAKIAkJCS8qIG1hcmsgYWxsIHByZWFsbG9jYXRlZCBibGtzIHVzZWQgaW4gaW4tY29yZSBiaXRtYXAgKi8KIAkJCWV4dDRfbWJfZ2VuZXJhdGVfZnJvbV9wYShzYiwgZGF0YSwgZ3JvdXApOworCQkJZXh0NF9tYl9nZW5lcmF0ZV9mcm9tX2ZyZWVsaXN0KHNiLCBkYXRhLCBncm91cCk7CiAJCQlleHQ0X3VubG9ja19ncm91cChzYiwgZ3JvdXApOwogCiAJCQkvKiBzZXQgaW5jb3JlIHNvIHRoYXQgdGhlIGJ1ZGR5IGluZm9ybWF0aW9uIGNhbiBiZQpAQCAtODg2LDE4ICs5MjIsMjAgQEAKIGV4dDRfbWJfbG9hZF9idWRkeShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBleHQ0X2dyb3VwX3QgZ3JvdXAsCiAJCQkJCXN0cnVjdCBleHQ0X2J1ZGR5ICplNGIpCiB7Ci0Jc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihzYik7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IHNiaS0+c19idWRkeV9jYWNoZTsKIAlpbnQgYmxvY2tzX3Blcl9wYWdlOwogCWludCBibG9jazsKIAlpbnQgcG51bTsKIAlpbnQgcG9mZjsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAlpbnQgcmV0OworCXN0cnVjdCBleHQ0X2dyb3VwX2luZm8gKmdycDsKKwlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gc2JpLT5zX2J1ZGR5X2NhY2hlOwogCi0JbWJfZGVidWcoImxvYWQgZ3JvdXAgJWx1XG4iLCBncm91cCk7CisJbWJfZGVidWcoImxvYWQgZ3JvdXAgJXVcbiIsIGdyb3VwKTsKIAogCWJsb2Nrc19wZXJfcGFnZSA9IFBBR0VfQ0FDSEVfU0laRSAvIHNiLT5zX2Jsb2Nrc2l6ZTsKKwlncnAgPSBleHQ0X2dldF9ncm91cF9pbmZvKHNiLCBncm91cCk7CiAKIAllNGItPmJkX2Jsa2JpdHMgPSBzYi0+c19ibG9ja3NpemVfYml0czsKIAllNGItPmJkX2luZm8gPSBleHQ0X2dldF9ncm91cF9pbmZvKHNiLCBncm91cCk7CkBAIC05MDUsNiArOTQzLDE1IEBACiAJZTRiLT5iZF9ncm91cCA9IGdyb3VwOwogCWU0Yi0+YmRfYnVkZHlfcGFnZSA9IE5VTEw7CiAJZTRiLT5iZF9iaXRtYXBfcGFnZSA9IE5VTEw7CisJZTRiLT5hbGxvY19zZW1wID0gJmdycC0+YWxsb2Nfc2VtOworCisJLyogVGFrZSB0aGUgcmVhZCBsb2NrIG9uIHRoZSBncm91cCBhbGxvYworCSAqIHNlbS4gVGhpcyB3b3VsZCBtYWtlIHN1cmUgYSBwYXJhbGxlbAorCSAqIGV4dDRfbWJfaW5pdF9ncm91cCBoYXBwZW5pbmcgb24gb3RoZXIKKwkgKiBncm91cHMgbWFwcGVkIGJ5IHRoZSBwYWdlIGlzIGJsb2NrZWQKKwkgKiB0aWxsIHdlIGFyZSBkb25lIHdpdGggYWxsb2NhdGlvbgorCSAqLworCWRvd25fcmVhZChlNGItPmFsbG9jX3NlbXApOwogCiAJLyoKIAkgKiB0aGUgYnVkZHkgY2FjaGUgaW5vZGUgc3RvcmVzIHRoZSBibG9jayBiaXRtYXAKQEAgLTkyMCw2ICs5NjcsMTQgQEAKIAlwYWdlID0gZmluZF9nZXRfcGFnZShpbm9kZS0+aV9tYXBwaW5nLCBwbnVtKTsKIAlpZiAocGFnZSA9PSBOVUxMIHx8ICFQYWdlVXB0b2RhdGUocGFnZSkpIHsKIAkJaWYgKHBhZ2UpCisJCQkvKgorCQkJICogZHJvcCB0aGUgcGFnZSByZWZlcmVuY2UgYW5kIHRyeQorCQkJICogdG8gZ2V0IHRoZSBwYWdlIHdpdGggbG9jay4gSWYgd2UKKwkJCSAqIGFyZSBub3QgdXB0b2RhdGUgdGhhdCBpbXBsaWVzCisJCQkgKiBzb21lYm9keSBqdXN0IGNyZWF0ZWQgdGhlIHBhZ2UgYnV0CisJCQkgKiBpcyB5ZXQgdG8gaW5pdGlhbGl6ZSB0aGUgc2FtZS4gU28KKwkJCSAqIHdhaXQgZm9yIGl0IHRvIGluaXRpYWxpemUuCisJCQkgKi8KIAkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAkJcGFnZSA9IGZpbmRfb3JfY3JlYXRlX3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgcG51bSwgR0ZQX05PRlMpOwogCQlpZiAocGFnZSkgewpAQCAtOTg1LDYgKzEwNDAsOSBAQAogCQlwYWdlX2NhY2hlX3JlbGVhc2UoZTRiLT5iZF9idWRkeV9wYWdlKTsKIAllNGItPmJkX2J1ZGR5ID0gTlVMTDsKIAllNGItPmJkX2JpdG1hcCA9IE5VTEw7CisKKwkvKiBEb25lIHdpdGggdGhlIGJ1ZGR5IGNhY2hlICovCisJdXBfcmVhZChlNGItPmFsbG9jX3NlbXApOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTk5NCw2ICsxMDUyLDkgQEAKIAkJcGFnZV9jYWNoZV9yZWxlYXNlKGU0Yi0+YmRfYml0bWFwX3BhZ2UpOwogCWlmIChlNGItPmJkX2J1ZGR5X3BhZ2UpCiAJCXBhZ2VfY2FjaGVfcmVsZWFzZShlNGItPmJkX2J1ZGR5X3BhZ2UpOworCS8qIERvbmUgd2l0aCB0aGUgYnVkZHkgY2FjaGUgKi8KKwlpZiAoZTRiLT5hbGxvY19zZW1wKQorCQl1cF9yZWFkKGU0Yi0+YWxsb2Nfc2VtcCk7CiB9CiAKIApAQCAtMTAzMSw3ICsxMDkyLDEwIEBACiAJCQljdXIgKz0gMzI7CiAJCQljb250aW51ZTsKIAkJfQotCQltYl9jbGVhcl9iaXRfYXRvbWljKGxvY2ssIGN1ciwgYm0pOworCQlpZiAobG9jaykKKwkJCW1iX2NsZWFyX2JpdF9hdG9taWMobG9jaywgY3VyLCBibSk7CisJCWVsc2UKKwkJCW1iX2NsZWFyX2JpdChjdXIsIGJtKTsKIAkJY3VyKys7CiAJfQogfQpAQCAtMTA0OSw3ICsxMTEzLDEwIEBACiAJCQljdXIgKz0gMzI7CiAJCQljb250aW51ZTsKIAkJfQotCQltYl9zZXRfYml0X2F0b21pYyhsb2NrLCBjdXIsIGJtKTsKKwkJaWYgKGxvY2spCisJCQltYl9zZXRfYml0X2F0b21pYyhsb2NrLCBjdXIsIGJtKTsKKwkJZWxzZQorCQkJbWJfc2V0X2JpdChjdXIsIGJtKTsKIAkJY3VyKys7CiAJfQogfQpAQCAtMTA5NCwxMiArMTE2MSwxMSBAQAogCQkJYmxvY2tuciArPSBibG9jazsKIAkJCWJsb2NrbnIgKz0KIAkJCSAgICBsZTMyX3RvX2NwdShFWFQ0X1NCKHNiKS0+c19lcy0+c19maXJzdF9kYXRhX2Jsb2NrKTsKLQkJCWV4dDRfdW5sb2NrX2dyb3VwKHNiLCBlNGItPmJkX2dyb3VwKTsKLQkJCWV4dDRfZXJyb3Ioc2IsIF9fZnVuY19fLCAiZG91YmxlLWZyZWUgb2YgaW5vZGUiCi0JCQkJICAgIiAlbHUncyBibG9jayAlbGx1KGJpdCAldSBpbiBncm91cCAlbHUpXG4iLAorCQkJZXh0NF9ncnBfbG9ja2VkX2Vycm9yKHNiLCBlNGItPmJkX2dyb3VwLAorCQkJCSAgIF9fZnVuY19fLCAiZG91YmxlLWZyZWUgb2YgaW5vZGUiCisJCQkJICAgIiAlbHUncyBibG9jayAlbGx1KGJpdCAldSBpbiBncm91cCAldSkiLAogCQkJCSAgIGlub2RlID8gaW5vZGUtPmlfaW5vIDogMCwgYmxvY2tuciwgYmxvY2ssCiAJCQkJICAgZTRiLT5iZF9ncm91cCk7Ci0JCQlleHQ0X2xvY2tfZ3JvdXAoc2IsIGU0Yi0+YmRfZ3JvdXApOwogCQl9CiAJCW1iX2NsZWFyX2JpdChibG9jaywgRVhUNF9NQl9CSVRNQVAoZTRiKSk7CiAJCWU0Yi0+YmRfaW5mby0+YmJfY291bnRlcnNbb3JkZXJdKys7CkBAIC0xMjk2LDEzICsxMzYyLDIwIEBACiAJYWMtPmFjX3RhaWwgPSByZXQgJiAweGZmZmY7CiAJYWMtPmFjX2J1ZGR5ID0gcmV0ID4+IDE2OwogCi0JLyogWFhYWFhYWDogU1VDSCBBIEhPUlJJQkxFICoqQ0sgKi8KLQkvKkZJWE1FISEgV2h5ID8gKi8KKwkvKgorCSAqIHRha2UgdGhlIHBhZ2UgcmVmZXJlbmNlLiBXZSB3YW50IHRoZSBwYWdlIHRvIGJlIHBpbm5lZAorCSAqIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IGEgZXh0NF9tYl9pbml0X2NhY2hlX2NhbGwgZm9yIHRoaXMKKwkgKiBncm91cCB1bnRpbCB3ZSB1cGRhdGUgdGhlIGJpdG1hcC4gVGhhdCB3b3VsZCBtZWFuIHdlCisJICogZG91YmxlIGFsbG9jYXRlIGJsb2Nrcy4gVGhlIHJlZmVyZW5jZSBpcyBkcm9wcGVkCisJICogaW4gZXh0NF9tYl9yZWxlYXNlX2NvbnRleHQKKwkgKi8KIAlhYy0+YWNfYml0bWFwX3BhZ2UgPSBlNGItPmJkX2JpdG1hcF9wYWdlOwogCWdldF9wYWdlKGFjLT5hY19iaXRtYXBfcGFnZSk7CiAJYWMtPmFjX2J1ZGR5X3BhZ2UgPSBlNGItPmJkX2J1ZGR5X3BhZ2U7CiAJZ2V0X3BhZ2UoYWMtPmFjX2J1ZGR5X3BhZ2UpOwotCisJLyogb24gYWxsb2NhdGlvbiB3ZSB1c2UgYWMgdG8gdHJhY2sgdGhlIGhlbGQgc2VtYXBob3JlICovCisJYWMtPmFsbG9jX3NlbXAgPSAgZTRiLT5hbGxvY19zZW1wOworCWU0Yi0+YWxsb2Nfc2VtcCA9IE5VTEw7CiAJLyogc3RvcmUgbGFzdCBhbGxvY2F0ZWQgZm9yIHN1YnNlcXVlbnQgc3RyZWFtIGFsbG9jYXRpb24gKi8KIAlpZiAoKGFjLT5hY19mbGFncyAmIEVYVDRfTUJfSElOVF9EQVRBKSkgewogCQlzcGluX2xvY2soJnNiaS0+c19tZF9sb2NrKTsKQEAgLTEzMjYsNiArMTM5OSw4IEBACiAJc3RydWN0IGV4dDRfZnJlZV9leHRlbnQgZXg7CiAJaW50IG1heDsKIAorCWlmIChhYy0+YWNfc3RhdHVzID09IEFDX1NUQVRVU19GT1VORCkKKwkJcmV0dXJuOwogCS8qCiAJICogV2UgZG9uJ3Qgd2FudCB0byBzY2FuIGZvciBhIHdob2xlIHllYXIKIAkgKi8KQEAgLTE1NzUsOCArMTY1MCw5IEBACiAJCQkgKiBmcmVlIGJsb2NrcyBldmVuIHRob3VnaCBncm91cCBpbmZvIHNheXMgd2UKIAkJCSAqIHdlIGhhdmUgZnJlZSBibG9ja3MKIAkJCSAqLwotCQkJZXh0NF9lcnJvcihzYiwgX19mdW5jX18sICIlZCBmcmVlIGJsb2NrcyBhcyBwZXIgIgotCQkJCQkiZ3JvdXAgaW5mby4gQnV0IGJpdG1hcCBzYXlzIDBcbiIsCisJCQlleHQ0X2dycF9sb2NrZWRfZXJyb3Ioc2IsIGU0Yi0+YmRfZ3JvdXAsCisJCQkJCV9fZnVuY19fLCAiJWQgZnJlZSBibG9ja3MgYXMgcGVyICIKKwkJCQkJImdyb3VwIGluZm8uIEJ1dCBiaXRtYXAgc2F5cyAwIiwKIAkJCQkJZnJlZSk7CiAJCQlicmVhazsKIAkJfQpAQCAtMTU4NCw4ICsxNjYwLDkgQEAKIAkJbWJfZmluZF9leHRlbnQoZTRiLCAwLCBpLCBhYy0+YWNfZ19leC5mZV9sZW4sICZleCk7CiAJCUJVR19PTihleC5mZV9sZW4gPD0gMCk7CiAJCWlmIChmcmVlIDwgZXguZmVfbGVuKSB7Ci0JCQlleHQ0X2Vycm9yKHNiLCBfX2Z1bmNfXywgIiVkIGZyZWUgYmxvY2tzIGFzIHBlciAiCi0JCQkJCSJncm91cCBpbmZvLiBCdXQgZ290ICVkIGJsb2Nrc1xuIiwKKwkJCWV4dDRfZ3JwX2xvY2tlZF9lcnJvcihzYiwgZTRiLT5iZF9ncm91cCwKKwkJCQkJX19mdW5jX18sICIlZCBmcmVlIGJsb2NrcyBhcyBwZXIgIgorCQkJCQkiZ3JvdXAgaW5mby4gQnV0IGdvdCAlZCBibG9ja3MiLAogCQkJCQlmcmVlLCBleC5mZV9sZW4pOwogCQkJLyoKIAkJCSAqIFRoZSBudW1iZXIgb2YgZnJlZSBibG9ja3MgZGlmZmVycy4gVGhpcyBtb3N0bHkKQEAgLTE2OTIsNiArMTc2OSwxNzMgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIGxvY2sgdGhlIGdyb3VwX2luZm8gYWxsb2Nfc2VtIG9mIGFsbCB0aGUgZ3JvdXBzCisgKiBiZWxvbmdpbmcgdG8gdGhlIHNhbWUgYnVkZHkgY2FjaGUgcGFnZS4gVGhpcworICogbWFrZSBzdXJlIG90aGVyIHBhcmFsbGVsIG9wZXJhdGlvbiBvbiB0aGUgYnVkZHkKKyAqIGNhY2hlIGRvZXNuJ3QgaGFwcGVuICB3aGlsZCBob2xkaW5nIHRoZSBidWRkeSBjYWNoZQorICogbG9jaworICovCitpbnQgZXh0NF9tYl9nZXRfYnVkZHlfY2FjaGVfbG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBleHQ0X2dyb3VwX3QgZ3JvdXApCit7CisJaW50IGk7CisJaW50IGJsb2NrLCBwbnVtOworCWludCBibG9ja3NfcGVyX3BhZ2U7CisJaW50IGdyb3Vwc19wZXJfcGFnZTsKKwlleHQ0X2dyb3VwX3QgZmlyc3RfZ3JvdXA7CisJc3RydWN0IGV4dDRfZ3JvdXBfaW5mbyAqZ3JwOworCisJYmxvY2tzX3Blcl9wYWdlID0gUEFHRV9DQUNIRV9TSVpFIC8gc2ItPnNfYmxvY2tzaXplOworCS8qCisJICogdGhlIGJ1ZGR5IGNhY2hlIGlub2RlIHN0b3JlcyB0aGUgYmxvY2sgYml0bWFwCisJICogYW5kIGJ1ZGR5IGluZm9ybWF0aW9uIGluIGNvbnNlY3V0aXZlIGJsb2Nrcy4KKwkgKiBTbyBmb3IgZWFjaCBncm91cCB3ZSBuZWVkIHR3byBibG9ja3MuCisJICovCisJYmxvY2sgPSBncm91cCAqIDI7CisJcG51bSA9IGJsb2NrIC8gYmxvY2tzX3Blcl9wYWdlOworCWZpcnN0X2dyb3VwID0gcG51bSAqIGJsb2Nrc19wZXJfcGFnZSAvIDI7CisKKwlncm91cHNfcGVyX3BhZ2UgPSBibG9ja3NfcGVyX3BhZ2UgPj4gMTsKKwlpZiAoZ3JvdXBzX3Blcl9wYWdlID09IDApCisJCWdyb3Vwc19wZXJfcGFnZSA9IDE7CisJLyogcmVhZCBhbGwgZ3JvdXBzIHRoZSBwYWdlIGNvdmVycyBpbnRvIHRoZSBjYWNoZSAqLworCWZvciAoaSA9IDA7IGkgPCBncm91cHNfcGVyX3BhZ2U7IGkrKykgeworCisJCWlmICgoZmlyc3RfZ3JvdXAgKyBpKSA+PSBFWFQ0X1NCKHNiKS0+c19ncm91cHNfY291bnQpCisJCQlicmVhazsKKwkJZ3JwID0gZXh0NF9nZXRfZ3JvdXBfaW5mbyhzYiwgZmlyc3RfZ3JvdXAgKyBpKTsKKwkJLyogdGFrZSBhbGwgZ3JvdXBzIHdyaXRlIGFsbG9jYXRpb24KKwkJICogc2VtYXBob3JlLiBUaGlzIG1ha2Ugc3VyZSB0aGVyZSBpcworCQkgKiBubyBibG9jayBhbGxvY2F0aW9uIGdvaW5nIG9uIGluIGFueQorCQkgKiBvZiB0aGF0IGdyb3VwcworCQkgKi8KKwkJZG93bl93cml0ZV9uZXN0ZWQoJmdycC0+YWxsb2Nfc2VtLCBpKTsKKwl9CisJcmV0dXJuIGk7Cit9CisKK3ZvaWQgZXh0NF9tYl9wdXRfYnVkZHlfY2FjaGVfbG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCQlleHQ0X2dyb3VwX3QgZ3JvdXAsIGludCBsb2NrZWRfZ3JvdXApCit7CisJaW50IGk7CisJaW50IGJsb2NrLCBwbnVtOworCWludCBibG9ja3NfcGVyX3BhZ2U7CisJZXh0NF9ncm91cF90IGZpcnN0X2dyb3VwOworCXN0cnVjdCBleHQ0X2dyb3VwX2luZm8gKmdycDsKKworCWJsb2Nrc19wZXJfcGFnZSA9IFBBR0VfQ0FDSEVfU0laRSAvIHNiLT5zX2Jsb2Nrc2l6ZTsKKwkvKgorCSAqIHRoZSBidWRkeSBjYWNoZSBpbm9kZSBzdG9yZXMgdGhlIGJsb2NrIGJpdG1hcAorCSAqIGFuZCBidWRkeSBpbmZvcm1hdGlvbiBpbiBjb25zZWN1dGl2ZSBibG9ja3MuCisJICogU28gZm9yIGVhY2ggZ3JvdXAgd2UgbmVlZCB0d28gYmxvY2tzLgorCSAqLworCWJsb2NrID0gZ3JvdXAgKiAyOworCXBudW0gPSBibG9jayAvIGJsb2Nrc19wZXJfcGFnZTsKKwlmaXJzdF9ncm91cCA9IHBudW0gKiBibG9ja3NfcGVyX3BhZ2UgLyAyOworCS8qIHJlbGVhc2UgbG9ja3Mgb24gYWxsIHRoZSBncm91cHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbG9ja2VkX2dyb3VwOyBpKyspIHsKKworCQlncnAgPSBleHQ0X2dldF9ncm91cF9pbmZvKHNiLCBmaXJzdF9ncm91cCArIGkpOworCQkvKiB0YWtlIGFsbCBncm91cHMgd3JpdGUgYWxsb2NhdGlvbgorCQkgKiBzZW1hcGhvcmUuIFRoaXMgbWFrZSBzdXJlIHRoZXJlIGlzCisJCSAqIG5vIGJsb2NrIGFsbG9jYXRpb24gZ29pbmcgb24gaW4gYW55CisJCSAqIG9mIHRoYXQgZ3JvdXBzCisJCSAqLworCQl1cF93cml0ZSgmZ3JwLT5hbGxvY19zZW0pOworCX0KKworfQorCitzdGF0aWMgaW50IGV4dDRfbWJfaW5pdF9ncm91cChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBleHQ0X2dyb3VwX3QgZ3JvdXApCit7CisKKwlpbnQgcmV0OworCXZvaWQgKmJpdG1hcDsKKwlpbnQgYmxvY2tzX3Blcl9wYWdlOworCWludCBibG9jaywgcG51bSwgcG9mZjsKKwlpbnQgbnVtX2dycF9sb2NrZWQgPSAwOworCXN0cnVjdCBleHQ0X2dyb3VwX2luZm8gKnRoaXNfZ3JwOworCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBzYmktPnNfYnVkZHlfY2FjaGU7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMLCAqYml0bWFwX3BhZ2UgPSBOVUxMOworCisJbWJfZGVidWcoImluaXQgZ3JvdXAgJWx1XG4iLCBncm91cCk7CisJYmxvY2tzX3Blcl9wYWdlID0gUEFHRV9DQUNIRV9TSVpFIC8gc2ItPnNfYmxvY2tzaXplOworCXRoaXNfZ3JwID0gZXh0NF9nZXRfZ3JvdXBfaW5mbyhzYiwgZ3JvdXApOworCS8qCisJICogVGhpcyBlbnN1cmVzIHdlIGRvbid0IGFkZCBncm91cAorCSAqIHRvIHRoaXMgYnVkZHkgY2FjaGUgdmlhIHJlc2l6ZQorCSAqLworCW51bV9ncnBfbG9ja2VkID0gIGV4dDRfbWJfZ2V0X2J1ZGR5X2NhY2hlX2xvY2soc2IsIGdyb3VwKTsKKwlpZiAoIUVYVDRfTUJfR1JQX05FRURfSU5JVCh0aGlzX2dycCkpIHsKKwkJLyoKKwkJICogc29tZWJvZHkgaW5pdGlhbGl6ZWQgdGhlIGdyb3VwCisJCSAqIHJldHVybiB3aXRob3V0IGRvaW5nIGFueXRoaW5nCisJCSAqLworCQlyZXQgPSAwOworCQlnb3RvIGVycjsKKwl9CisJLyoKKwkgKiB0aGUgYnVkZHkgY2FjaGUgaW5vZGUgc3RvcmVzIHRoZSBibG9jayBiaXRtYXAKKwkgKiBhbmQgYnVkZHkgaW5mb3JtYXRpb24gaW4gY29uc2VjdXRpdmUgYmxvY2tzLgorCSAqIFNvIGZvciBlYWNoIGdyb3VwIHdlIG5lZWQgdHdvIGJsb2Nrcy4KKwkgKi8KKwlibG9jayA9IGdyb3VwICogMjsKKwlwbnVtID0gYmxvY2sgLyBibG9ja3NfcGVyX3BhZ2U7CisJcG9mZiA9IGJsb2NrICUgYmxvY2tzX3Blcl9wYWdlOworCXBhZ2UgPSBmaW5kX29yX2NyZWF0ZV9wYWdlKGlub2RlLT5pX21hcHBpbmcsIHBudW0sIEdGUF9OT0ZTKTsKKwlpZiAocGFnZSkgeworCQlCVUdfT04ocGFnZS0+bWFwcGluZyAhPSBpbm9kZS0+aV9tYXBwaW5nKTsKKwkJcmV0ID0gZXh0NF9tYl9pbml0X2NhY2hlKHBhZ2UsIE5VTEwpOworCQlpZiAocmV0KSB7CisJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCWdvdG8gZXJyOworCQl9CisJCXVubG9ja19wYWdlKHBhZ2UpOworCX0KKwlpZiAocGFnZSA9PSBOVUxMIHx8ICFQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnI7CisJfQorCW1hcmtfcGFnZV9hY2Nlc3NlZChwYWdlKTsKKwliaXRtYXBfcGFnZSA9IHBhZ2U7CisJYml0bWFwID0gcGFnZV9hZGRyZXNzKHBhZ2UpICsgKHBvZmYgKiBzYi0+c19ibG9ja3NpemUpOworCisJLyogaW5pdCBidWRkeSBjYWNoZSAqLworCWJsb2NrKys7CisJcG51bSA9IGJsb2NrIC8gYmxvY2tzX3Blcl9wYWdlOworCXBvZmYgPSBibG9jayAlIGJsb2Nrc19wZXJfcGFnZTsKKwlwYWdlID0gZmluZF9vcl9jcmVhdGVfcGFnZShpbm9kZS0+aV9tYXBwaW5nLCBwbnVtLCBHRlBfTk9GUyk7CisJaWYgKHBhZ2UgPT0gYml0bWFwX3BhZ2UpIHsKKwkJLyoKKwkJICogSWYgYm90aCB0aGUgYml0bWFwIGFuZCBidWRkeSBhcmUgaW4KKwkJICogdGhlIHNhbWUgcGFnZSB3ZSBkb24ndCBuZWVkIHRvIGZvcmNlCisJCSAqIGluaXQgdGhlIGJ1ZGR5CisJCSAqLworCQl1bmxvY2tfcGFnZShwYWdlKTsKKwl9IGVsc2UgaWYgKHBhZ2UpIHsKKwkJQlVHX09OKHBhZ2UtPm1hcHBpbmcgIT0gaW5vZGUtPmlfbWFwcGluZyk7CisJCXJldCA9IGV4dDRfbWJfaW5pdF9jYWNoZShwYWdlLCBiaXRtYXApOworCQlpZiAocmV0KSB7CisJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCWdvdG8gZXJyOworCQl9CisJCXVubG9ja19wYWdlKHBhZ2UpOworCX0KKwlpZiAocGFnZSA9PSBOVUxMIHx8ICFQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnI7CisJfQorCW1hcmtfcGFnZV9hY2Nlc3NlZChwYWdlKTsKK2VycjoKKwlleHQ0X21iX3B1dF9idWRkeV9jYWNoZV9sb2NrKHNiLCBncm91cCwgbnVtX2dycF9sb2NrZWQpOworCWlmIChiaXRtYXBfcGFnZSkKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKGJpdG1hcF9wYWdlKTsKKwlpZiAocGFnZSkKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sgaW50CiBleHQ0X21iX3JlZ3VsYXJfYWxsb2NhdG9yKHN0cnVjdCBleHQ0X2FsbG9jYXRpb25fY29udGV4dCAqYWMpCiB7CkBAIC0xNzc1LDcgKzIwMTksNyBAQAogCQkJCWdyb3VwID0gMDsKIAogCQkJLyogcXVpY2sgY2hlY2sgdG8gc2tpcCBlbXB0eSBncm91cHMgKi8KLQkJCWdycCA9IGV4dDRfZ2V0X2dyb3VwX2luZm8oYWMtPmFjX3NiLCBncm91cCk7CisJCQlncnAgPSBleHQ0X2dldF9ncm91cF9pbmZvKHNiLCBncm91cCk7CiAJCQlpZiAoZ3JwLT5iYl9mcmVlID09IDApCiAJCQkJY29udGludWU7CiAKQEAgLTE3ODgsMTAgKzIwMzIsOSBAQAogCQkJCSAqIHdlIG5lZWQgZnVsbCBkYXRhIGFib3V0IHRoZSBncm91cAogCQkJCSAqIHRvIG1ha2UgYSBnb29kIHNlbGVjdGlvbgogCQkJCSAqLwotCQkJCWVyciA9IGV4dDRfbWJfbG9hZF9idWRkeShzYiwgZ3JvdXAsICZlNGIpOworCQkJCWVyciA9IGV4dDRfbWJfaW5pdF9ncm91cChzYiwgZ3JvdXApOwogCQkJCWlmIChlcnIpCiAJCQkJCWdvdG8gb3V0OwotCQkJCWV4dDRfbWJfcmVsZWFzZV9kZXNjKCZlNGIpOwogCQkJfQogCiAJCQkvKgpAQCAtMTkzMiwxMyArMjE3NSwxMyBAQAogCWlmIChocy0+b3AgPT0gRVhUNF9NQl9ISVNUT1JZX0FMTE9DKSB7CiAJCWZtdCA9ICIlLTV1ICUtOHUgJS0yM3MgJS0yM3MgJS0yM3MgJS01dSAlLTV1ICUtMnUgIgogCQkJIiUtNXUgJS01cyAlLTV1ICUtNnVcbiI7Ci0JCXNwcmludGYoYnVmMiwgIiVsdS8lZC8ldUAldSIsIGhzLT5yZXN1bHQuZmVfZ3JvdXAsCisJCXNwcmludGYoYnVmMiwgIiV1LyVkLyV1QCV1IiwgaHMtPnJlc3VsdC5mZV9ncm91cCwKIAkJCWhzLT5yZXN1bHQuZmVfc3RhcnQsIGhzLT5yZXN1bHQuZmVfbGVuLAogCQkJaHMtPnJlc3VsdC5mZV9sb2dpY2FsKTsKLQkJc3ByaW50ZihidWYsICIlbHUvJWQvJXVAJXUiLCBocy0+b3JpZy5mZV9ncm91cCwKKwkJc3ByaW50ZihidWYsICIldS8lZC8ldUAldSIsIGhzLT5vcmlnLmZlX2dyb3VwLAogCQkJaHMtPm9yaWcuZmVfc3RhcnQsIGhzLT5vcmlnLmZlX2xlbiwKIAkJCWhzLT5vcmlnLmZlX2xvZ2ljYWwpOwotCQlzcHJpbnRmKGJ1ZjMsICIlbHUvJWQvJXVAJXUiLCBocy0+Z29hbC5mZV9ncm91cCwKKwkJc3ByaW50ZihidWYzLCAiJXUvJWQvJXVAJXUiLCBocy0+Z29hbC5mZV9ncm91cCwKIAkJCWhzLT5nb2FsLmZlX3N0YXJ0LCBocy0+Z29hbC5mZV9sZW4sCiAJCQlocy0+Z29hbC5mZV9sb2dpY2FsKTsKIAkJc2VxX3ByaW50ZihzZXEsIGZtdCwgaHMtPnBpZCwgaHMtPmlubywgYnVmLCBidWYzLCBidWYyLApAQCAtMTk0NywyMCArMjE5MCwyMCBAQAogCQkJCWhzLT5idWRkeSA/IDEgPDwgaHMtPmJ1ZGR5IDogMCk7CiAJfSBlbHNlIGlmIChocy0+b3AgPT0gRVhUNF9NQl9ISVNUT1JZX1BSRUFMTE9DKSB7CiAJCWZtdCA9ICIlLTV1ICUtOHUgJS0yM3MgJS0yM3MgJS0yM3NcbiI7Ci0JCXNwcmludGYoYnVmMiwgIiVsdS8lZC8ldUAldSIsIGhzLT5yZXN1bHQuZmVfZ3JvdXAsCisJCXNwcmludGYoYnVmMiwgIiV1LyVkLyV1QCV1IiwgaHMtPnJlc3VsdC5mZV9ncm91cCwKIAkJCWhzLT5yZXN1bHQuZmVfc3RhcnQsIGhzLT5yZXN1bHQuZmVfbGVuLAogCQkJaHMtPnJlc3VsdC5mZV9sb2dpY2FsKTsKLQkJc3ByaW50ZihidWYsICIlbHUvJWQvJXVAJXUiLCBocy0+b3JpZy5mZV9ncm91cCwKKwkJc3ByaW50ZihidWYsICIldS8lZC8ldUAldSIsIGhzLT5vcmlnLmZlX2dyb3VwLAogCQkJaHMtPm9yaWcuZmVfc3RhcnQsIGhzLT5vcmlnLmZlX2xlbiwKIAkJCWhzLT5vcmlnLmZlX2xvZ2ljYWwpOwogCQlzZXFfcHJpbnRmKHNlcSwgZm10LCBocy0+cGlkLCBocy0+aW5vLCBidWYsICIiLCBidWYyKTsKIAl9IGVsc2UgaWYgKGhzLT5vcCA9PSBFWFQ0X01CX0hJU1RPUllfRElTQ0FSRCkgewotCQlzcHJpbnRmKGJ1ZjIsICIlbHUvJWQvJXUiLCBocy0+cmVzdWx0LmZlX2dyb3VwLAorCQlzcHJpbnRmKGJ1ZjIsICIldS8lZC8ldSIsIGhzLT5yZXN1bHQuZmVfZ3JvdXAsCiAJCQlocy0+cmVzdWx0LmZlX3N0YXJ0LCBocy0+cmVzdWx0LmZlX2xlbik7CiAJCXNlcV9wcmludGYoc2VxLCAiJS01dSAlLTh1ICUtMjNzIGRpc2NhcmRcbiIsCiAJCQkJaHMtPnBpZCwgaHMtPmlubywgYnVmMik7CiAJfSBlbHNlIGlmIChocy0+b3AgPT0gRVhUNF9NQl9ISVNUT1JZX0ZSRUUpIHsKLQkJc3ByaW50ZihidWYyLCAiJWx1LyVkLyV1IiwgaHMtPnJlc3VsdC5mZV9ncm91cCwKKwkJc3ByaW50ZihidWYyLCAiJXUvJWQvJXUiLCBocy0+cmVzdWx0LmZlX2dyb3VwLAogCQkJaHMtPnJlc3VsdC5mZV9zdGFydCwgaHMtPnJlc3VsdC5mZV9sZW4pOwogCQlzZXFfcHJpbnRmKHNlcSwgIiUtNXUgJS04dSAlLTIzcyBmcmVlXG4iLAogCQkJCWhzLT5waWQsIGhzLT5pbm8sIGJ1ZjIpOwpAQCAtMjA3Myw3ICsyMzE2LDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlncm91cCA9ICpwb3MgKyAxOwotCXJldHVybiAodm9pZCAqKSBncm91cDsKKwlyZXR1cm4gKHZvaWQgKikgKCh1bnNpZ25lZCBsb25nKSBncm91cCk7CiB9CiAKIHN0YXRpYyB2b2lkICpleHQ0X21iX3NlcV9ncm91cHNfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCkBAIC0yMDg2LDEzICsyMzI5LDEzIEBACiAJaWYgKCpwb3MgPCAwIHx8ICpwb3MgPj0gc2JpLT5zX2dyb3Vwc19jb3VudCkKIAkJcmV0dXJuIE5VTEw7CiAJZ3JvdXAgPSAqcG9zICsgMTsKLQlyZXR1cm4gKHZvaWQgKikgZ3JvdXA7OworCXJldHVybiAodm9pZCAqKSAoKHVuc2lnbmVkIGxvbmcpIGdyb3VwKTsKIH0KIAogc3RhdGljIGludCBleHQ0X21iX3NlcV9ncm91cHNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gc2VxLT5wcml2YXRlOwotCWxvbmcgZ3JvdXAgPSAobG9uZykgdjsKKwlleHQ0X2dyb3VwX3QgZ3JvdXAgPSAoZXh0NF9ncm91cF90KSAoKHVuc2lnbmVkIGxvbmcpIHYpOwogCWludCBpOwogCWludCBlcnI7CiAJc3RydWN0IGV4dDRfYnVkZHkgZTRiOwpAQCAtMjExNCw3ICsyMzU3LDcgQEAKIAkJc2l6ZW9mKHN0cnVjdCBleHQ0X2dyb3VwX2luZm8pOwogCWVyciA9IGV4dDRfbWJfbG9hZF9idWRkeShzYiwgZ3JvdXAsICZlNGIpOwogCWlmIChlcnIpIHsKLQkJc2VxX3ByaW50ZihzZXEsICIjJS01bHU6IEkvTyBlcnJvclxuIiwgZ3JvdXApOworCQlzZXFfcHJpbnRmKHNlcSwgIiMlLTV1OiBJL08gZXJyb3JcbiIsIGdyb3VwKTsKIAkJcmV0dXJuIDA7CiAJfQogCWV4dDRfbG9ja19ncm91cChzYiwgZ3JvdXApOwpAQCAtMjEyMiw3ICsyMzY1LDcgQEAKIAlleHQ0X3VubG9ja19ncm91cChzYiwgZ3JvdXApOwogCWV4dDRfbWJfcmVsZWFzZV9kZXNjKCZlNGIpOwogCi0Jc2VxX3ByaW50ZihzZXEsICIjJS01bHU6ICUtNXUgJS01dSAlLTV1IFsiLCBncm91cCwgc2cuaW5mby5iYl9mcmVlLAorCXNlcV9wcmludGYoc2VxLCAiIyUtNXU6ICUtNXUgJS01dSAlLTV1IFsiLCBncm91cCwgc2cuaW5mby5iYl9mcmVlLAogCQkJc2cuaW5mby5iYl9mcmFnbWVudHMsIHNnLmluZm8uYmJfZmlyc3RfZnJlZSk7CiAJZm9yIChpID0gMDsgaSA8PSAxMzsgaSsrKQogCQlzZXFfcHJpbnRmKHNlcSwgIiAlLTV1IiwgaSA8PSBzYi0+c19ibG9ja3NpemVfYml0cyArIDEgPwpAQCAtMjI5NiwxMCArMjUzOSwxMSBAQAogCQkJZXh0NF9mcmVlX2Jsb2Nrc19hZnRlcl9pbml0KHNiLCBncm91cCwgZGVzYyk7CiAJfSBlbHNlIHsKIAkJbWV0YV9ncm91cF9pbmZvW2ldLT5iYl9mcmVlID0KLQkJCWxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KTsKKwkJCWV4dDRfZnJlZV9ibGtzX2NvdW50KHNiLCBkZXNjKTsKIAl9CiAKIAlJTklUX0xJU1RfSEVBRCgmbWV0YV9ncm91cF9pbmZvW2ldLT5iYl9wcmVhbGxvY19saXN0KTsKKwlpbml0X3J3c2VtKCZtZXRhX2dyb3VwX2luZm9baV0tPmFsbG9jX3NlbSk7CiAJbWV0YV9ncm91cF9pbmZvW2ldLT5iYl9mcmVlX3Jvb3QucmJfbm9kZSA9IE5VTEw7OwogCiAjaWZkZWYgRE9VQkxFX0NIRUNLCkBAIC0yMzI3LDU0ICsyNTcxLDYgQEAKIH0gLyogZXh0NF9tYl9hZGRfZ3JvdXBpbmZvICovCiAKIC8qCi0gKiBBZGQgYSBncm91cCB0byB0aGUgZXhpc3RpbmcgZ3JvdXBzLgotICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBvbmxpbmUgcmVzaXplCi0gKi8KLWludCBleHQ0X21iX2FkZF9tb3JlX2dyb3VwaW5mbyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBleHQ0X2dyb3VwX3QgZ3JvdXAsCi0JCQkgICAgICAgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqZGVzYykKLXsKLQlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gc2JpLT5zX2J1ZGR5X2NhY2hlOwotCWludCBibG9ja3NfcGVyX3BhZ2U7Ci0JaW50IGJsb2NrOwotCWludCBwbnVtOwotCXN0cnVjdCBwYWdlICpwYWdlOwotCWludCBlcnI7Ci0KLQkvKiBBZGQgZ3JvdXAgYmFzZWQgb24gZ3JvdXAgZGVzY3JpcHRvciovCi0JZXJyID0gZXh0NF9tYl9hZGRfZ3JvdXBpbmZvKHNiLCBncm91cCwgZGVzYyk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCS8qCi0JICogQ2FjaGUgcGFnZXMgY29udGFpbmluZyBkeW5hbWljIG1iX2FsbG9jIGRhdGFzIChidWRkeSBhbmQgYml0bWFwCi0JICogZGF0YXMpIGFyZSBzZXQgbm90IHVwIHRvIGRhdGUgc28gdGhhdCB0aGV5IHdpbGwgYmUgcmUtaW5pdGlsYWl6ZWQKLQkgKiBkdXJpbmcgdGhlIG5leHQgY2FsbCB0byBleHQ0X21iX2xvYWRfYnVkZHkKLQkgKi8KLQotCS8qIFNldCBidWRkeSBwYWdlIGFzIG5vdCB1cCB0byBkYXRlICovCi0JYmxvY2tzX3Blcl9wYWdlID0gUEFHRV9DQUNIRV9TSVpFIC8gc2ItPnNfYmxvY2tzaXplOwotCWJsb2NrID0gZ3JvdXAgKiAyOwotCXBudW0gPSBibG9jayAvIGJsb2Nrc19wZXJfcGFnZTsKLQlwYWdlID0gZmluZF9nZXRfcGFnZShpbm9kZS0+aV9tYXBwaW5nLCBwbnVtKTsKLQlpZiAocGFnZSAhPSBOVUxMKSB7Ci0JCUNsZWFyUGFnZVVwdG9kYXRlKHBhZ2UpOwotCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JfQotCi0JLyogU2V0IGJpdG1hcCBwYWdlIGFzIG5vdCB1cCB0byBkYXRlICovCi0JYmxvY2srKzsKLQlwbnVtID0gYmxvY2sgLyBibG9ja3NfcGVyX3BhZ2U7Ci0JcGFnZSA9IGZpbmRfZ2V0X3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgcG51bSk7Ci0JaWYgKHBhZ2UgIT0gTlVMTCkgewotCQlDbGVhclBhZ2VVcHRvZGF0ZShwYWdlKTsKLQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKgogICogVXBkYXRlIGFuIGV4aXN0aW5nIGdyb3VwLgogICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBvbmxpbmUgcmVzaXplCiAgKi8KQEAgLTI0NTcsNyArMjY1Myw3IEBACiAJCWRlc2MgPSBleHQ0X2dldF9ncm91cF9kZXNjKHNiLCBpLCBOVUxMKTsKIAkJaWYgKGRlc2MgPT0gTlVMTCkgewogCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJIkVYVDQtZnM6IGNhbid0IHJlYWQgZGVzY3JpcHRvciAlbHVcbiIsIGkpOworCQkJCSJFWFQ0LWZzOiBjYW4ndCByZWFkIGRlc2NyaXB0b3IgJXVcbiIsIGkpOwogCQkJZ290byBlcnJfZnJlZWJ1ZGR5OwogCQl9CiAJCWlmIChleHQ0X21iX2FkZF9ncm91cGluZm8oc2IsIGksIGRlc2MpICE9IDApCkBAIC0yNDkzLDYgKzI2ODksOCBAQAogCWlmIChzYmktPnNfbWJfb2Zmc2V0cyA9PSBOVUxMKSB7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KKworCWkgPSAoc2ItPnNfYmxvY2tzaXplX2JpdHMgKyAyKSAqIHNpemVvZih1bnNpZ25lZCBpbnQpOwogCXNiaS0+c19tYl9tYXhzID0ga21hbGxvYyhpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc2JpLT5zX21iX21heHMgPT0gTlVMTCkgewogCQlrZnJlZShzYmktPnNfbWJfbWF4cyk7CkBAIC0yNTUxLDcgKzI3NDksOCBAQAogCWV4dDRfbWJfaW5pdF9wZXJfZGV2X3Byb2Moc2IpOwogCWV4dDRfbWJfaGlzdG9yeV9pbml0KHNiKTsKIAotCXNiaS0+c19qb3VybmFsLT5qX2NvbW1pdF9jYWxsYmFjayA9IHJlbGVhc2VfYmxvY2tzX29uX2NvbW1pdDsKKwlpZiAoc2JpLT5zX2pvdXJuYWwpCisJCXNiaS0+c19qb3VybmFsLT5qX2NvbW1pdF9jYWxsYmFjayA9IHJlbGVhc2VfYmxvY2tzX29uX2NvbW1pdDsKIAogCXByaW50ayhLRVJOX0lORk8gIkVYVDQtZnM6IG1iYWxsb2MgZW5hYmxlZFxuIik7CiAJcmV0dXJuIDA7CkBAIC0yNjUyLDcgKzI4NTEsNyBAQAogCWxpc3RfZm9yX2VhY2hfc2FmZShsLCBsdG1wLCAmdHhuLT50X3ByaXZhdGVfbGlzdCkgewogCQllbnRyeSA9IGxpc3RfZW50cnkobCwgc3RydWN0IGV4dDRfZnJlZV9kYXRhLCBsaXN0KTsKIAotCQltYl9kZWJ1ZygiZ29ubmEgZnJlZSAldSBibG9ja3MgaW4gZ3JvdXAgJWx1ICgweCVwKToiLAorCQltYl9kZWJ1ZygiZ29ubmEgZnJlZSAldSBibG9ja3MgaW4gZ3JvdXAgJXUgKDB4JXApOiIsCiAJCQkgZW50cnktPmNvdW50LCBlbnRyeS0+Z3JvdXAsIGVudHJ5KTsKIAogCQllcnIgPSBleHQ0X21iX2xvYWRfYnVkZHkoc2IsIGVudHJ5LT5ncm91cCwgJmU0Yik7CkBAIC0yNjc5LDggKzI4NzgsOSBAQAogCQlkaXNjYXJkX2Jsb2NrID0gKGV4dDRfZnNibGtfdCkgZW50cnktPmdyb3VwICogRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKQogCQkJKyBlbnRyeS0+c3RhcnRfYmxrCiAJCQkrIGxlMzJfdG9fY3B1KEVYVDRfU0Ioc2IpLT5zX2VzLT5zX2ZpcnN0X2RhdGFfYmxvY2spOwotCQl0cmFjZV9tYXJrKGV4dDRfZGlzY2FyZF9ibG9ja3MsICJkZXYgJXMgYmxrICVsbHUgY291bnQgJXUiLCBzYi0+c19pZCwKLQkJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGRpc2NhcmRfYmxvY2ssIGVudHJ5LT5jb3VudCk7CisJCXRyYWNlX21hcmsoZXh0NF9kaXNjYXJkX2Jsb2NrcywgImRldiAlcyBibGsgJWxsdSBjb3VudCAldSIsCisJCQkgICBzYi0+c19pZCwgKHVuc2lnbmVkIGxvbmcgbG9uZykgZGlzY2FyZF9ibG9jaywKKwkJCSAgIGVudHJ5LT5jb3VudCk7CiAJCXNiX2lzc3VlX2Rpc2NhcmQoc2IsIGRpc2NhcmRfYmxvY2ssIGVudHJ5LT5jb3VudCk7CiAKIAkJa21lbV9jYWNoZV9mcmVlKGV4dDRfZnJlZV9leHRfY2FjaGVwLCBlbnRyeSk7CkBAIC0yNzkxLDcgKzI5OTEsNyBAQAogICovCiBzdGF0aWMgbm9pbmxpbmVfZm9yX3N0YWNrIGludAogZXh0NF9tYl9tYXJrX2Rpc2tzcGFjZV91c2VkKHN0cnVjdCBleHQ0X2FsbG9jYXRpb25fY29udGV4dCAqYWMsCi0JCQkJaGFuZGxlX3QgKmhhbmRsZSwgdW5zaWduZWQgbG9uZyByZXNlcnZfYmxrcykKKwkJCQloYW5kbGVfdCAqaGFuZGxlLCB1bnNpZ25lZCBpbnQgcmVzZXJ2X2Jsa3MpCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmggPSBOVUxMOwogCXN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICplczsKQEAgLTI4MjQsNyArMzAyNCw3IEBACiAJaWYgKCFnZHApCiAJCWdvdG8gb3V0X2VycjsKIAotCWV4dDRfZGVidWcoInVzaW5nIGJsb2NrIGdyb3VwICVsdSglZClcbiIsIGFjLT5hY19iX2V4LmZlX2dyb3VwLAorCWV4dDRfZGVidWcoInVzaW5nIGJsb2NrIGdyb3VwICV1KCVkKVxuIiwgYWMtPmFjX2JfZXguZmVfZ3JvdXAsCiAJCQlnZHAtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KTsKIAogCWVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgZ2RwX2JoKTsKQEAgLTI4NDMsOCArMzA0Myw4IEBACiAJICAgIGluX3JhbmdlKGJsb2NrICsgbGVuIC0gMSwgZXh0NF9pbm9kZV90YWJsZShzYiwgZ2RwKSwKIAkJICAgICBFWFQ0X1NCKHNiKS0+c19pdGJfcGVyX2dyb3VwKSkgewogCQlleHQ0X2Vycm9yKHNiLCBfX2Z1bmNfXywKLQkJCSAgICJBbGxvY2F0aW5nIGJsb2NrIGluIHN5c3RlbSB6b25lIC0gYmxvY2sgPSAlbGx1IiwKLQkJCSAgIGJsb2NrKTsKKwkJCSAgICJBbGxvY2F0aW5nIGJsb2NrICVsbHUgaW4gc3lzdGVtIHpvbmUgb2YgJWQgZ3JvdXBcbiIsCisJCQkgICBibG9jaywgYWMtPmFjX2JfZXguZmVfZ3JvdXApOwogCQkvKiBGaWxlIHN5c3RlbSBtb3VudGVkIG5vdCB0byBwYW5pYyBvbiBlcnJvcgogCQkgKiBGaXggdGhlIGJpdG1hcCBhbmQgcmVwZWF0IHRoZSBibG9jayBhbGxvY2F0aW9uCiAJCSAqIFdlIGxlYWsgc29tZSBvZiB0aGUgYmxvY2tzIGhlcmUuCkBAIC0yODUyLDcgKzMwNTIsNyBAQAogCQltYl9zZXRfYml0cyhzYl9iZ2xfbG9jayhzYmksIGFjLT5hY19iX2V4LmZlX2dyb3VwKSwKIAkJCQliaXRtYXBfYmgtPmJfZGF0YSwgYWMtPmFjX2JfZXguZmVfc3RhcnQsCiAJCQkJYWMtPmFjX2JfZXguZmVfbGVuKTsKLQkJZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYml0bWFwX2JoKTsKKwkJZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBiaXRtYXBfYmgpOwogCQlpZiAoIWVycikKIAkJCWVyciA9IC1FQUdBSU47CiAJCWdvdG8gb3V0X2VycjsKQEAgLTI4NjYsMTggKzMwNjYsMTcgQEAKIAkJfQogCX0KICNlbmRpZgotCW1iX3NldF9iaXRzKHNiX2JnbF9sb2NrKHNiaSwgYWMtPmFjX2JfZXguZmVfZ3JvdXApLCBiaXRtYXBfYmgtPmJfZGF0YSwKLQkJCQlhYy0+YWNfYl9leC5mZV9zdGFydCwgYWMtPmFjX2JfZXguZmVfbGVuKTsKLQogCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhzYmksIGFjLT5hY19iX2V4LmZlX2dyb3VwKSk7CisJbWJfc2V0X2JpdHMoTlVMTCwgYml0bWFwX2JoLT5iX2RhdGEsCisJCQkJYWMtPmFjX2JfZXguZmVfc3RhcnQsIGFjLT5hY19iX2V4LmZlX2xlbik7CiAJaWYgKGdkcC0+YmdfZmxhZ3MgJiBjcHVfdG9fbGUxNihFWFQ0X0JHX0JMT0NLX1VOSU5JVCkpIHsKIAkJZ2RwLT5iZ19mbGFncyAmPSBjcHVfdG9fbGUxNih+RVhUNF9CR19CTE9DS19VTklOSVQpOwotCQlnZHAtPmJnX2ZyZWVfYmxvY2tzX2NvdW50ID0KLQkJCWNwdV90b19sZTE2KGV4dDRfZnJlZV9ibG9ja3NfYWZ0ZXJfaW5pdChzYiwKLQkJCQkJCWFjLT5hY19iX2V4LmZlX2dyb3VwLAotCQkJCQkJZ2RwKSk7CisJCWV4dDRfZnJlZV9ibGtzX3NldChzYiwgZ2RwLAorCQkJCQlleHQ0X2ZyZWVfYmxvY2tzX2FmdGVyX2luaXQoc2IsCisJCQkJCWFjLT5hY19iX2V4LmZlX2dyb3VwLCBnZHApKTsKIAl9Ci0JbGUxNl9hZGRfY3B1KCZnZHAtPmJnX2ZyZWVfYmxvY2tzX2NvdW50LCAtYWMtPmFjX2JfZXguZmVfbGVuKTsKKwlsZW4gPSBleHQ0X2ZyZWVfYmxrc19jb3VudChzYiwgZ2RwKSAtIGFjLT5hY19iX2V4LmZlX2xlbjsKKwlleHQ0X2ZyZWVfYmxrc19zZXQoc2IsIGdkcCwgbGVuKTsKIAlnZHAtPmJnX2NoZWNrc3VtID0gZXh0NF9ncm91cF9kZXNjX2NzdW0oc2JpLCBhYy0+YWNfYl9leC5mZV9ncm91cCwgZ2RwKTsKIAlzcGluX3VubG9jayhzYl9iZ2xfbG9jayhzYmksIGFjLT5hY19iX2V4LmZlX2dyb3VwKSk7CiAJcGVyY3B1X2NvdW50ZXJfc3ViKCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyLCBhYy0+YWNfYl9leC5mZV9sZW4pOwpAQCAtMjg5OSwxMCArMzA5OCwxMCBAQAogCQlzcGluX3VubG9jayhzYl9iZ2xfbG9jayhzYmksIGZsZXhfZ3JvdXApKTsKIAl9CiAKLQllcnIgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaXRtYXBfYmgpOworCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgYml0bWFwX2JoKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dF9lcnI7Ci0JZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZ2RwX2JoKTsKKwllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIGdkcF9iaCk7CiAKIG91dF9lcnI6CiAJc2ItPnNfZGlydCA9IDE7CkBAIC0zMDMxLDcgKzMyMzAsNyBAQAogCS8qIGNoZWNrIHdlIGRvbid0IGNyb3NzIGFscmVhZHkgcHJlYWxsb2NhdGVkIGJsb2NrcyAqLwogCXJjdV9yZWFkX2xvY2soKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShwYSwgJmVpLT5pX3ByZWFsbG9jX2xpc3QsIHBhX2lub2RlX2xpc3QpIHsKLQkJdW5zaWduZWQgbG9uZyBwYV9lbmQ7CisJCWV4dDRfbGJsa190IHBhX2VuZDsKIAogCQlpZiAocGEtPnBhX2RlbGV0ZWQpCiAJCQljb250aW51ZTsKQEAgLTMwNzUsNyArMzI3NCw3IEBACiAJLyogWFhYOiBleHRyYSBsb29wIHRvIGNoZWNrIHdlIHJlYWxseSBkb24ndCBvdmVybGFwIHByZWFsbG9jYXRpb25zICovCiAJcmN1X3JlYWRfbG9jaygpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHBhLCAmZWktPmlfcHJlYWxsb2NfbGlzdCwgcGFfaW5vZGVfbGlzdCkgewotCQl1bnNpZ25lZCBsb25nIHBhX2VuZDsKKwkJZXh0NF9sYmxrX3QgcGFfZW5kOwogCQlzcGluX2xvY2soJnBhLT5wYV9sb2NrKTsKIAkJaWYgKHBhLT5wYV9kZWxldGVkID09IDApIHsKIAkJCXBhX2VuZCA9IHBhLT5wYV9sc3RhcnQgKyBwYS0+cGFfbGVuOwpAQCAtMzMwNyw2ICszNTA2LDMyIEBACiB9CiAKIC8qCisgKiB0aGUgZnVuY3Rpb24gZ29lcyB0aHJvdWdoIGFsbCBibG9jayBmcmVlZCBpbiB0aGUgZ3JvdXAKKyAqIGJ1dCBub3QgeWV0IGNvbW1pdHRlZCBhbmQgbWFya3MgdGhlbSB1c2VkIGluIGluLWNvcmUgYml0bWFwLgorICogYnVkZHkgbXVzdCBiZSBnZW5lcmF0ZWQgZnJvbSB0aGlzIGJpdG1hcAorICogTmVlZCB0byBiZSBjYWxsZWQgd2l0aCBleHQ0IGdyb3VwIGxvY2sgKGV4dDRfbG9ja19ncm91cCkKKyAqLworc3RhdGljIHZvaWQgZXh0NF9tYl9nZW5lcmF0ZV9mcm9tX2ZyZWVsaXN0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmJpdG1hcCwKKwkJCQkJCWV4dDRfZ3JvdXBfdCBncm91cCkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbjsKKwlzdHJ1Y3QgZXh0NF9ncm91cF9pbmZvICpncnA7CisJc3RydWN0IGV4dDRfZnJlZV9kYXRhICplbnRyeTsKKworCWdycCA9IGV4dDRfZ2V0X2dyb3VwX2luZm8oc2IsIGdyb3VwKTsKKwluID0gcmJfZmlyc3QoJihncnAtPmJiX2ZyZWVfcm9vdCkpOworCisJd2hpbGUgKG4pIHsKKwkJZW50cnkgPSByYl9lbnRyeShuLCBzdHJ1Y3QgZXh0NF9mcmVlX2RhdGEsIG5vZGUpOworCQltYl9zZXRfYml0cyhzYl9iZ2xfbG9jayhFWFQ0X1NCKHNiKSwgZ3JvdXApLAorCQkJCWJpdG1hcCwgZW50cnktPnN0YXJ0X2JsaywKKwkJCQllbnRyeS0+Y291bnQpOworCQluID0gcmJfbmV4dChuKTsKKwl9CisJcmV0dXJuOworfQorCisvKgogICogdGhlIGZ1bmN0aW9uIGdvZXMgdGhyb3VnaCBhbGwgcHJlYWxsb2NhdGlvbiBpbiB0aGlzIGdyb3VwIGFuZCBtYXJrcyB0aGVtCiAgKiB1c2VkIGluIGluLWNvcmUgYml0bWFwLiBidWRkeSBtdXN0IGJlIGdlbmVyYXRlZCBmcm9tIHRoaXMgYml0bWFwCiAgKiBOZWVkIHRvIGJlIGNhbGxlZCB3aXRoIGV4dDQgZ3JvdXAgbG9jayAoZXh0NF9sb2NrX2dyb3VwKQpAQCAtMzM0Niw3ICszNTcxLDcgQEAKIAkJcHJlYWxsb2NhdGVkICs9IGxlbjsKIAkJY291bnQrKzsKIAl9Ci0JbWJfZGVidWcoInByZWxsb2NhdGVkICV1IGZvciBncm91cCAlbHVcbiIsIHByZWFsbG9jYXRlZCwgZ3JvdXApOworCW1iX2RlYnVnKCJwcmVsbG9jYXRlZCAldSBmb3IgZ3JvdXAgJXVcbiIsIHByZWFsbG9jYXRlZCwgZ3JvdXApOwogfQogCiBzdGF0aWMgdm9pZCBleHQ0X21iX3BhX2NhbGxiYWNrKHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKQEAgLTMzNjMsNyArMzU4OCw3IEBACiBzdGF0aWMgdm9pZCBleHQ0X21iX3B1dF9wYShzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX2NvbnRleHQgKmFjLAogCQkJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGV4dDRfcHJlYWxsb2Nfc3BhY2UgKnBhKQogewotCXVuc2lnbmVkIGxvbmcgZ3JwOworCWV4dDRfZ3JvdXBfdCBncnA7CiAKIAlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJnBhLT5wYV9jb3VudCkgfHwgcGEtPnBhX2ZyZWUgIT0gMCkKIAkJcmV0dXJuOwpAQCAtMzQ3Myw2ICszNjk4LDEwIEBACiAKIAltYl9kZWJ1ZygibmV3IGlub2RlIHBhICVwOiAlbGx1LyV1IGZvciAldVxuIiwgcGEsCiAJCQlwYS0+cGFfcHN0YXJ0LCBwYS0+cGFfbGVuLCBwYS0+cGFfbHN0YXJ0KTsKKwl0cmFjZV9tYXJrKGV4dDRfbWJfbmV3X2lub2RlX3BhLAorCQkgICAiZGV2ICVzIGlubyAlbHUgcHN0YXJ0ICVsbHUgbGVuICV1IGxzdGFydCAldSIsCisJCSAgIHNiLT5zX2lkLCBhYy0+YWNfaW5vZGUtPmlfaW5vLAorCQkgICBwYS0+cGFfcHN0YXJ0LCBwYS0+cGFfbGVuLCBwYS0+cGFfbHN0YXJ0KTsKIAogCWV4dDRfbWJfdXNlX2lub2RlX3BhKGFjLCBwYSk7CiAJYXRvbWljX2FkZChwYS0+cGFfZnJlZSwgJkVYVDRfU0Ioc2IpLT5zX21iX3ByZWFsbG9jYXRlZCk7CkBAIC0zNTMwLDcgKzM3NTksOSBAQAogCXBhLT5wYV9saW5lYXIgPSAxOwogCiAJbWJfZGVidWcoIm5ldyBncm91cCBwYSAlcDogJWxsdS8ldSBmb3IgJXVcbiIsIHBhLAotCQkJcGEtPnBhX3BzdGFydCwgcGEtPnBhX2xlbiwgcGEtPnBhX2xzdGFydCk7CisJCSBwYS0+cGFfcHN0YXJ0LCBwYS0+cGFfbGVuLCBwYS0+cGFfbHN0YXJ0KTsKKwl0cmFjZV9tYXJrKGV4dDRfbWJfbmV3X2dyb3VwX3BhLCAiZGV2ICVzIHBzdGFydCAlbGx1IGxlbiAldSBsc3RhcnQgJXUiLAorCQkgICBzYi0+c19pZCwgcGEtPnBhX3BzdGFydCwgcGEtPnBhX2xlbiwgcGEtPnBhX2xzdGFydCk7CiAKIAlleHQ0X21iX3VzZV9ncm91cF9wYShhYywgcGEpOwogCWF0b21pY19hZGQocGEtPnBhX2ZyZWUsICZFWFQ0X1NCKHNiKS0+c19tYl9wcmVhbGxvY2F0ZWQpOwpAQCAtMzU3OSwxNiArMzgxMCwxOCBAQAogewogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBlNGItPmJkX3NiOwogCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpOwotCXVuc2lnbmVkIGxvbmcgZW5kOwotCXVuc2lnbmVkIGxvbmcgbmV4dDsKKwl1bnNpZ25lZCBpbnQgZW5kOworCXVuc2lnbmVkIGludCBuZXh0OwogCWV4dDRfZ3JvdXBfdCBncm91cDsKIAlleHQ0X2dycGJsa190IGJpdDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgZ3JwX2Jsa19zdGFydDsKIAlzZWN0b3JfdCBzdGFydDsKIAlpbnQgZXJyID0gMDsKIAlpbnQgZnJlZSA9IDA7CiAKIAlCVUdfT04ocGEtPnBhX2RlbGV0ZWQgPT0gMCk7CiAJZXh0NF9nZXRfZ3JvdXBfbm9fYW5kX29mZnNldChzYiwgcGEtPnBhX3BzdGFydCwgJmdyb3VwLCAmYml0KTsKKwlncnBfYmxrX3N0YXJ0ID0gcGEtPnBhX3BzdGFydCAtIGJpdDsKIAlCVUdfT04oZ3JvdXAgIT0gZTRiLT5iZF9ncm91cCAmJiBwYS0+cGFfbGVuICE9IDApOwogCWVuZCA9IGJpdCArIHBhLT5wYV9sZW47CiAKQEAgLTM2MTgsNiArMzg1MSwxMCBAQAogCQkJZXh0NF9tYl9zdG9yZV9oaXN0b3J5KGFjKTsKIAkJfQogCisJCXRyYWNlX21hcmsoZXh0NF9tYl9yZWxlYXNlX2lub2RlX3BhLAorCQkJICAgImRldiAlcyBpbm8gJWx1IGJsb2NrICVsbHUgY291bnQgJXUiLAorCQkJICAgc2ItPnNfaWQsIHBhLT5wYV9pbm9kZS0+aV9pbm8sIGdycF9ibGtfc3RhcnQgKyBiaXQsCisJCQkgICBuZXh0IC0gYml0KTsKIAkJbWJfZnJlZV9ibG9ja3MocGEtPnBhX2lub2RlLCBlNGIsIGJpdCwgbmV4dCAtIGJpdCk7CiAJCWJpdCA9IG5leHQgKyAxOwogCX0KQEAgLTM2MjYsOCArMzg2Myw5IEBACiAJCQlwYSwgKHVuc2lnbmVkIGxvbmcpIHBhLT5wYV9sc3RhcnQsCiAJCQkodW5zaWduZWQgbG9uZykgcGEtPnBhX3BzdGFydCwKIAkJCSh1bnNpZ25lZCBsb25nKSBwYS0+cGFfbGVuKTsKLQkJZXh0NF9lcnJvcihzYiwgX19mdW5jX18sICJmcmVlICV1LCBwYV9mcmVlICV1XG4iLAotCQkJCQkJZnJlZSwgcGEtPnBhX2ZyZWUpOworCQlleHQ0X2dycF9sb2NrZWRfZXJyb3Ioc2IsIGdyb3VwLAorCQkJCQlfX2Z1bmNfXywgImZyZWUgJXUsIHBhX2ZyZWUgJXUiLAorCQkJCQlmcmVlLCBwYS0+cGFfZnJlZSk7CiAJCS8qCiAJCSAqIHBhIGlzIGFscmVhZHkgZGVsZXRlZCBzbyB3ZSB1c2UgdGhlIHZhbHVlIG9idGFpbmVkCiAJCSAqIGZyb20gdGhlIGJpdG1hcCBhbmQgY29udGludWUuCkBAIC0zNjUwLDYgKzM4ODgsOCBAQAogCWlmIChhYykKIAkJYWMtPmFjX29wID0gRVhUNF9NQl9ISVNUT1JZX0RJU0NBUkQ7CiAKKwl0cmFjZV9tYXJrKGV4dDRfbWJfcmVsZWFzZV9ncm91cF9wYSwgImRldiAlcyBwc3RhcnQgJWxsdSBsZW4gJWQiLAorCQkgICBzYi0+c19pZCwgcGEtPnBhX3BzdGFydCwgcGEtPnBhX2xlbik7CiAJQlVHX09OKHBhLT5wYV9kZWxldGVkID09IDApOwogCWV4dDRfZ2V0X2dyb3VwX25vX2FuZF9vZmZzZXQoc2IsIHBhLT5wYV9wc3RhcnQsICZncm91cCwgJmJpdCk7CiAJQlVHX09OKGdyb3VwICE9IGU0Yi0+YmRfZ3JvdXAgJiYgcGEtPnBhX2xlbiAhPSAwKTsKQEAgLTM2OTIsNyArMzkzMiw3IEBACiAJaW50IGJ1c3kgPSAwOwogCWludCBmcmVlID0gMDsKIAotCW1iX2RlYnVnKCJkaXNjYXJkIHByZWFsbG9jYXRpb24gZm9yIGdyb3VwICVsdVxuIiwgZ3JvdXApOworCW1iX2RlYnVnKCJkaXNjYXJkIHByZWFsbG9jYXRpb24gZm9yIGdyb3VwICV1XG4iLCBncm91cCk7CiAKIAlpZiAobGlzdF9lbXB0eSgmZ3JwLT5iYl9wcmVhbGxvY19saXN0KSkKIAkJcmV0dXJuIDA7CkBAIC0zNzAwLDE0ICszOTQwLDE0IEBACiAJYml0bWFwX2JoID0gZXh0NF9yZWFkX2Jsb2NrX2JpdG1hcChzYiwgZ3JvdXApOwogCWlmIChiaXRtYXBfYmggPT0gTlVMTCkgewogCQlleHQ0X2Vycm9yKHNiLCBfX2Z1bmNfXywgIkVycm9yIGluIHJlYWRpbmcgYmxvY2sgIgotCQkJCSJiaXRtYXAgZm9yICVsdVxuIiwgZ3JvdXApOworCQkJCSJiaXRtYXAgZm9yICV1IiwgZ3JvdXApOwogCQlyZXR1cm4gMDsKIAl9CiAKIAllcnIgPSBleHQ0X21iX2xvYWRfYnVkZHkoc2IsIGdyb3VwLCAmZTRiKTsKIAlpZiAoZXJyKSB7CiAJCWV4dDRfZXJyb3Ioc2IsIF9fZnVuY19fLCAiRXJyb3IgaW4gbG9hZGluZyBidWRkeSAiCi0JCQkJImluZm9ybWF0aW9uIGZvciAlbHVcbiIsIGdyb3VwKTsKKwkJCQkiaW5mb3JtYXRpb24gZm9yICV1IiwgZ3JvdXApOwogCQlwdXRfYmgoYml0bWFwX2JoKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMzgxNSw2ICs0MDU1LDggQEAKIAl9CiAKIAltYl9kZWJ1ZygiZGlzY2FyZCBwcmVhbGxvY2F0aW9uIGZvciBpbm9kZSAlbHVcbiIsIGlub2RlLT5pX2lubyk7CisJdHJhY2VfbWFyayhleHQ0X2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMsICJkZXYgJXMgaW5vICVsdSIsIHNiLT5zX2lkLAorCQkgICBpbm9kZS0+aV9pbm8pOwogCiAJSU5JVF9MSVNUX0hFQUQoJmxpc3QpOwogCkBAIC0zODc0LDE0ICs0MTE2LDE0IEBACiAJCWVyciA9IGV4dDRfbWJfbG9hZF9idWRkeShzYiwgZ3JvdXAsICZlNGIpOwogCQlpZiAoZXJyKSB7CiAJCQlleHQ0X2Vycm9yKHNiLCBfX2Z1bmNfXywgIkVycm9yIGluIGxvYWRpbmcgYnVkZHkgIgotCQkJCQkiaW5mb3JtYXRpb24gZm9yICVsdVxuIiwgZ3JvdXApOworCQkJCQkiaW5mb3JtYXRpb24gZm9yICV1IiwgZ3JvdXApOwogCQkJY29udGludWU7CiAJCX0KIAogCQliaXRtYXBfYmggPSBleHQ0X3JlYWRfYmxvY2tfYml0bWFwKHNiLCBncm91cCk7CiAJCWlmIChiaXRtYXBfYmggPT0gTlVMTCkgewogCQkJZXh0NF9lcnJvcihzYiwgX19mdW5jX18sICJFcnJvciBpbiByZWFkaW5nIGJsb2NrICIKLQkJCQkJImJpdG1hcCBmb3IgJWx1XG4iLCBncm91cCk7CisJCQkJCSJiaXRtYXAgZm9yICV1IiwgZ3JvdXApOwogCQkJZXh0NF9tYl9yZWxlYXNlX2Rlc2MoJmU0Yik7CiAJCQljb250aW51ZTsKIAkJfQpAQCAtNDAyNCw4ICs0MjY2LDggQEAKIAlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKIAlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXMgPSBzYmktPnNfZXM7CiAJZXh0NF9ncm91cF90IGdyb3VwOwotCXVuc2lnbmVkIGxvbmcgbGVuOwotCXVuc2lnbmVkIGxvbmcgZ29hbDsKKwl1bnNpZ25lZCBpbnQgbGVuOworCWV4dDRfZnNibGtfdCBnb2FsOwogCWV4dDRfZ3JwYmxrX3QgYmxvY2s7CiAKIAkvKiB3ZSBjYW4ndCBhbGxvY2F0ZSA+IGdyb3VwIHNpemUgKi8KQEAgLTQwNjgsNiArNDMxMCw3IEBACiAJYWMtPmFjX3BhID0gTlVMTDsKIAlhYy0+YWNfYml0bWFwX3BhZ2UgPSBOVUxMOwogCWFjLT5hY19idWRkeV9wYWdlID0gTlVMTDsKKwlhYy0+YWxsb2Nfc2VtcCA9IE5VTEw7CiAJYWMtPmFjX2xnID0gTlVMTDsKIAogCS8qIHdlIGhhdmUgdG8gZGVmaW5lIGNvbnRleHQ6IHdlJ2xsIHdlIHdvcmsgd2l0aCBhIGZpbGUgb3IKQEAgLTQxNDYsNyArNDM4OSw3IEBACiAJCWV4dDRfZ2V0X2dyb3VwX25vX2FuZF9vZmZzZXQoc2IsIHBhLT5wYV9wc3RhcnQsICZncm91cCwgTlVMTCk7CiAJCWlmIChleHQ0X21iX2xvYWRfYnVkZHkoc2IsIGdyb3VwLCAmZTRiKSkgewogCQkJZXh0NF9lcnJvcihzYiwgX19mdW5jX18sICJFcnJvciBpbiBsb2FkaW5nIGJ1ZGR5ICIKLQkJCQkJImluZm9ybWF0aW9uIGZvciAlbHVcbiIsIGdyb3VwKTsKKwkJCQkJImluZm9ybWF0aW9uIGZvciAldSIsIGdyb3VwKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCWV4dDRfbG9ja19ncm91cChzYiwgZ3JvdXApOwpAQCAtNDI0OCw2ICs0NDkxLDggQEAKIAkJfQogCQlleHQ0X21iX3B1dF9wYShhYywgYWMtPmFjX3NiLCBwYSk7CiAJfQorCWlmIChhYy0+YWxsb2Nfc2VtcCkKKwkJdXBfcmVhZChhYy0+YWxsb2Nfc2VtcCk7CiAJaWYgKGFjLT5hY19iaXRtYXBfcGFnZSkKIAkJcGFnZV9jYWNoZV9yZWxlYXNlKGFjLT5hY19iaXRtYXBfcGFnZSk7CiAJaWYgKGFjLT5hY19idWRkeV9wYWdlKQpAQCAtNDI2NCw2ICs0NTA5LDggQEAKIAlpbnQgcmV0OwogCWludCBmcmVlZCA9IDA7CiAKKwl0cmFjZV9tYXJrKGV4dDRfbWJfZGlzY2FyZF9wcmVhbGxvY2F0aW9ucywgImRldiAlcyBuZWVkZWQgJWQiLAorCQkgICBzYi0+c19pZCwgbmVlZGVkKTsKIAlmb3IgKGkgPSAwOyBpIDwgRVhUNF9TQihzYiktPnNfZ3JvdXBzX2NvdW50ICYmIG5lZWRlZCA+IDA7IGkrKykgewogCQlyZXQgPSBleHQ0X21iX2Rpc2NhcmRfZ3JvdXBfcHJlYWxsb2NhdGlvbnMoc2IsIGksIG5lZWRlZCk7CiAJCWZyZWVkICs9IHJldDsKQEAgLTQyODYsMTIgKzQ1MzMsMjQgQEAKIAlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmk7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKIAlleHQ0X2ZzYmxrX3QgYmxvY2sgPSAwOwotCXVuc2lnbmVkIGxvbmcgaW5xdW90YTsKLQl1bnNpZ25lZCBsb25nIHJlc2Vydl9ibGtzID0gMDsKKwl1bnNpZ25lZCBpbnQgaW5xdW90YTsKKwl1bnNpZ25lZCBpbnQgcmVzZXJ2X2Jsa3MgPSAwOwogCiAJc2IgPSBhci0+aW5vZGUtPmlfc2I7CiAJc2JpID0gRVhUNF9TQihzYik7CiAKKwl0cmFjZV9tYXJrKGV4dDRfcmVxdWVzdF9ibG9ja3MsICJkZXYgJXMgZmxhZ3MgJXUgbGVuICV1IGlubyAlbHUgIgorCQkgICAibGJsayAlbGx1IGdvYWwgJWxsdSBsbGVmdCAlbGx1IGxyaWdodCAlbGx1ICIKKwkJICAgInBsZWZ0ICVsbHUgcHJpZ2h0ICVsbHUgIiwKKwkJICAgc2ItPnNfaWQsIGFyLT5mbGFncywgYXItPmxlbiwKKwkJICAgYXItPmlub2RlID8gYXItPmlub2RlLT5pX2lubyA6IDAsCisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGFyLT5sb2dpY2FsLAorCQkgICAodW5zaWduZWQgbG9uZyBsb25nKSBhci0+Z29hbCwKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgYXItPmxsZWZ0LAorCQkgICAodW5zaWduZWQgbG9uZyBsb25nKSBhci0+bHJpZ2h0LAorCQkgICAodW5zaWduZWQgbG9uZyBsb25nKSBhci0+cGxlZnQsCisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGFyLT5wcmlnaHQpOworCiAJaWYgKCFFWFQ0X0koYXItPmlub2RlKS0+aV9kZWxhbGxvY19yZXNlcnZlZF9mbGFnKSB7CiAJCS8qCiAJCSAqIFdpdGggZGVsYWxsb2Mgd2UgYWxyZWFkeSByZXNlcnZlZCB0aGUgYmxvY2tzCkBAIC00MzEzLDcgKzQ1NzIsNyBAQAogCX0KIAlpZiAoYXItPmxlbiA9PSAwKSB7CiAJCSplcnJwID0gLUVEUVVPVDsKLQkJcmV0dXJuIDA7CisJCWdvdG8gb3V0MzsKIAl9CiAJaW5xdW90YSA9IGFyLT5sZW47CiAKQEAgLTQzNDgsMTAgKzQ2MDcsMTQgQEAKIAkJCQlhYy0+YWNfb19leC5mZV9sZW4gPCBhYy0+YWNfYl9leC5mZV9sZW4pCiAJCQlleHQ0X21iX25ld19wcmVhbGxvY2F0aW9uKGFjKTsKIAl9Ci0KIAlpZiAobGlrZWx5KGFjLT5hY19zdGF0dXMgPT0gQUNfU1RBVFVTX0ZPVU5EKSkgewogCQkqZXJycCA9IGV4dDRfbWJfbWFya19kaXNrc3BhY2VfdXNlZChhYywgaGFuZGxlLCByZXNlcnZfYmxrcyk7CiAJCWlmICgqZXJycCA9PSAgLUVBR0FJTikgeworCQkJLyoKKwkJCSAqIGRyb3AgdGhlIHJlZmVyZW5jZSB0aGF0IHdlIHRvb2sKKwkJCSAqIGluIGV4dDRfbWJfdXNlX2Jlc3RfZm91bmQKKwkJCSAqLworCQkJZXh0NF9tYl9yZWxlYXNlX2NvbnRleHQoYWMpOwogCQkJYWMtPmFjX2JfZXguZmVfZ3JvdXAgPSAwOwogCQkJYWMtPmFjX2JfZXguZmVfc3RhcnQgPSAwOwogCQkJYWMtPmFjX2JfZXguZmVfbGVuID0gMDsKQEAgLTQzODIsNiArNDY0NSwyNiBAQAogb3V0MToKIAlpZiAoYXItPmxlbiA8IGlucXVvdGEpCiAJCURRVU9UX0ZSRUVfQkxPQ0soYXItPmlub2RlLCBpbnF1b3RhIC0gYXItPmxlbik7CitvdXQzOgorCWlmICghYXItPmxlbikgeworCQlpZiAoIUVYVDRfSShhci0+aW5vZGUpLT5pX2RlbGFsbG9jX3Jlc2VydmVkX2ZsYWcpCisJCQkvKiByZWxlYXNlIGFsbCB0aGUgcmVzZXJ2ZWQgYmxvY2tzIGlmIG5vbiBkZWxhbGxvYyAqLworCQkJcGVyY3B1X2NvdW50ZXJfc3ViKCZzYmktPnNfZGlydHlibG9ja3NfY291bnRlciwKKwkJCQkJCXJlc2Vydl9ibGtzKTsKKwl9CisKKwl0cmFjZV9tYXJrKGV4dDRfYWxsb2NhdGVfYmxvY2tzLAorCQkgICAiZGV2ICVzIGJsb2NrICVsbHUgZmxhZ3MgJXUgbGVuICV1IGlubyAlbHUgIgorCQkgICAibG9naWNhbCAlbGx1IGdvYWwgJWxsdSBsbGVmdCAlbGx1IGxyaWdodCAlbGx1ICIKKwkJICAgInBsZWZ0ICVsbHUgcHJpZ2h0ICVsbHUgIiwKKwkJICAgc2ItPnNfaWQsICh1bnNpZ25lZCBsb25nIGxvbmcpIGJsb2NrLAorCQkgICBhci0+ZmxhZ3MsIGFyLT5sZW4sIGFyLT5pbm9kZSA/IGFyLT5pbm9kZS0+aV9pbm8gOiAwLAorCQkgICAodW5zaWduZWQgbG9uZyBsb25nKSBhci0+bG9naWNhbCwKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgYXItPmdvYWwsCisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGFyLT5sbGVmdCwKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgYXItPmxyaWdodCwKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgYXItPnBsZWZ0LAorCQkgICAodW5zaWduZWQgbG9uZyBsb25nKSBhci0+cHJpZ2h0KTsKIAogCXJldHVybiBibG9jazsKIH0KQEAgLTQ0MDMsMjcgKzQ2ODYsMjMgQEAKIAogc3RhdGljIG5vaW5saW5lX2Zvcl9zdGFjayBpbnQKIGV4dDRfbWJfZnJlZV9tZXRhZGF0YShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZXh0NF9idWRkeSAqZTRiLAotCQkJICBleHQ0X2dyb3VwX3QgZ3JvdXAsIGV4dDRfZ3JwYmxrX3QgYmxvY2ssIGludCBjb3VudCkKKwkJICAgICAgc3RydWN0IGV4dDRfZnJlZV9kYXRhICpuZXdfZW50cnkpCiB7CisJZXh0NF9ncnBibGtfdCBibG9jazsKKwlzdHJ1Y3QgZXh0NF9mcmVlX2RhdGEgKmVudHJ5OwogCXN0cnVjdCBleHQ0X2dyb3VwX2luZm8gKmRiID0gZTRiLT5iZF9pbmZvOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBlNGItPmJkX3NiOwogCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpOwotCXN0cnVjdCBleHQ0X2ZyZWVfZGF0YSAqZW50cnksICpuZXdfZW50cnk7CiAJc3RydWN0IHJiX25vZGUgKipuID0gJmRiLT5iYl9mcmVlX3Jvb3QucmJfbm9kZSwgKm5vZGU7CiAJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEwsICpuZXdfbm9kZTsKIAotCisJQlVHX09OKCFleHQ0X2hhbmRsZV92YWxpZChoYW5kbGUpKTsKIAlCVUdfT04oZTRiLT5iZF9iaXRtYXBfcGFnZSA9PSBOVUxMKTsKIAlCVUdfT04oZTRiLT5iZF9idWRkeV9wYWdlID09IE5VTEwpOwogCi0JbmV3X2VudHJ5ICA9IGttZW1fY2FjaGVfYWxsb2MoZXh0NF9mcmVlX2V4dF9jYWNoZXAsIEdGUF9OT0ZTKTsKLQluZXdfZW50cnktPnN0YXJ0X2JsayA9IGJsb2NrOwotCW5ld19lbnRyeS0+Z3JvdXAgID0gZ3JvdXA7Ci0JbmV3X2VudHJ5LT5jb3VudCA9IGNvdW50OwotCW5ld19lbnRyeS0+dF90aWQgPSBoYW5kbGUtPmhfdHJhbnNhY3Rpb24tPnRfdGlkOwogCW5ld19ub2RlID0gJm5ld19lbnRyeS0+bm9kZTsKKwlibG9jayA9IG5ld19lbnRyeS0+c3RhcnRfYmxrOwogCi0JZXh0NF9sb2NrX2dyb3VwKHNiLCBncm91cCk7CiAJaWYgKCEqbikgewogCQkvKiBmaXJzdCBmcmVlIGJsb2NrIGV4ZW50LiBXZSBuZWVkIHRvCiAJCSAgIHByb3RlY3QgYnVkZHkgY2FjaGUgZnJvbSBiZWluZyBmcmVlZCwKQEAgLTQ0NDEsMTAgKzQ3MjAsOSBAQAogCQllbHNlIGlmIChibG9jayA+PSAoZW50cnktPnN0YXJ0X2JsayArIGVudHJ5LT5jb3VudCkpCiAJCQluID0gJigqbiktPnJiX3JpZ2h0OwogCQllbHNlIHsKLQkJCWV4dDRfdW5sb2NrX2dyb3VwKHNiLCBncm91cCk7Ci0JCQlleHQ0X2Vycm9yKHNiLCBfX2Z1bmNfXywKLQkJCSAgICAiRG91YmxlIGZyZWUgb2YgYmxvY2tzICVkICglZCAlZClcbiIsCi0JCQkgICAgYmxvY2ssIGVudHJ5LT5zdGFydF9ibGssIGVudHJ5LT5jb3VudCk7CisJCQlleHQ0X2dycF9sb2NrZWRfZXJyb3Ioc2IsIGU0Yi0+YmRfZ3JvdXAsIF9fZnVuY19fLAorCQkJCQkiRG91YmxlIGZyZWUgb2YgYmxvY2tzICVkICglZCAlZCkiLAorCQkJCQlibG9jaywgZW50cnktPnN0YXJ0X2JsaywgZW50cnktPmNvdW50KTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQpAQCAtNDQ4Myw3ICs0NzYxLDYgQEAKIAlzcGluX2xvY2soJnNiaS0+c19tZF9sb2NrKTsKIAlsaXN0X2FkZCgmbmV3X2VudHJ5LT5saXN0LCAmaGFuZGxlLT5oX3RyYW5zYWN0aW9uLT50X3ByaXZhdGVfbGlzdCk7CiAJc3Bpbl91bmxvY2soJnNiaS0+c19tZF9sb2NrKTsKLQlleHQ0X3VubG9ja19ncm91cChzYiwgZ3JvdXApOwogCXJldHVybiAwOwogfQogCkBAIC00NDk5LDcgKzQ3NzYsNyBAQAogCXN0cnVjdCBleHQ0X2FsbG9jYXRpb25fY29udGV4dCAqYWMgPSBOVUxMOwogCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmdkcDsKIAlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXM7Ci0JdW5zaWduZWQgbG9uZyBvdmVyZmxvdzsKKwl1bnNpZ25lZCBpbnQgb3ZlcmZsb3c7CiAJZXh0NF9ncnBibGtfdCBiaXQ7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpnZF9iaDsKIAlleHQ0X2dyb3VwX3QgYmxvY2tfZ3JvdXA7CkBAIC00NTIyLDYgKzQ3OTksMTAgQEAKIAl9CiAKIAlleHQ0X2RlYnVnKCJmcmVlaW5nIGJsb2NrICVsdVxuIiwgYmxvY2spOworCXRyYWNlX21hcmsoZXh0NF9mcmVlX2Jsb2NrcywKKwkJICAgImRldiAlcyBibG9jayAlbGx1IGNvdW50ICVsdSBtZXRhZGF0YSAlZCBpbm8gJWx1IiwKKwkJICAgc2ItPnNfaWQsICh1bnNpZ25lZCBsb25nIGxvbmcpIGJsb2NrLCBjb3VudCwgbWV0YWRhdGEsCisJCSAgIGlub2RlID8gaW5vZGUtPmlfaW5vIDogMCk7CiAKIAlhYyA9IGttZW1fY2FjaGVfYWxsb2MoZXh0NF9hY19jYWNoZXAsIEdGUF9OT0ZTKTsKIAlpZiAoYWMpIHsKQEAgLTQ1ODEsMTEgKzQ4NjIsNiBAQAogCWVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgZ2RfYmgpOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JZXJyID0gZXh0NF9tYl9sb2FkX2J1ZGR5KHNiLCBibG9ja19ncm91cCwgJmU0Yik7Ci0JaWYgKGVycikKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0KICNpZmRlZiBBR0dSRVNTSVZFX0NIRUNLCiAJewogCQlpbnQgaTsKQEAgLTQ1OTMsMTMgKzQ4NjksNiBAQAogCQkJQlVHX09OKCFtYl90ZXN0X2JpdChiaXQgKyBpLCBiaXRtYXBfYmgtPmJfZGF0YSkpOwogCX0KICNlbmRpZgotCW1iX2NsZWFyX2JpdHMoc2JfYmdsX2xvY2soc2JpLCBibG9ja19ncm91cCksIGJpdG1hcF9iaC0+Yl9kYXRhLAotCQkJYml0LCBjb3VudCk7Ci0KLQkvKiBXZSBkaXJ0aWVkIHRoZSBiaXRtYXAgYmxvY2sgKi8KLQlCVUZGRVJfVFJBQ0UoYml0bWFwX2JoLCAiZGlydGllZCBiaXRtYXAgYmxvY2siKTsKLQllcnIgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaXRtYXBfYmgpOwotCiAJaWYgKGFjKSB7CiAJCWFjLT5hY19iX2V4LmZlX2dyb3VwID0gYmxvY2tfZ3JvdXA7CiAJCWFjLT5hY19iX2V4LmZlX3N0YXJ0ID0gYml0OwpAQCAtNDYwNywxOSArNDg3Niw0MSBAQAogCQlleHQ0X21iX3N0b3JlX2hpc3RvcnkoYWMpOwogCX0KIAotCWlmIChtZXRhZGF0YSkgewotCQkvKiBibG9ja3MgYmVpbmcgZnJlZWQgYXJlIG1ldGFkYXRhLiB0aGVzZSBibG9ja3Mgc2hvdWxkbid0Ci0JCSAqIGJlIHVzZWQgdW50aWwgdGhpcyB0cmFuc2FjdGlvbiBpcyBjb21taXR0ZWQgKi8KLQkJZXh0NF9tYl9mcmVlX21ldGFkYXRhKGhhbmRsZSwgJmU0YiwgYmxvY2tfZ3JvdXAsIGJpdCwgY291bnQpOworCWVyciA9IGV4dDRfbWJfbG9hZF9idWRkeShzYiwgYmxvY2tfZ3JvdXAsICZlNGIpOworCWlmIChlcnIpCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCWlmIChtZXRhZGF0YSAmJiBleHQ0X2hhbmRsZV92YWxpZChoYW5kbGUpKSB7CisJCXN0cnVjdCBleHQ0X2ZyZWVfZGF0YSAqbmV3X2VudHJ5OworCQkvKgorCQkgKiBibG9ja3MgYmVpbmcgZnJlZWQgYXJlIG1ldGFkYXRhLiB0aGVzZSBibG9ja3Mgc2hvdWxkbid0CisJCSAqIGJlIHVzZWQgdW50aWwgdGhpcyB0cmFuc2FjdGlvbiBpcyBjb21taXR0ZWQKKwkJICovCisJCW5ld19lbnRyeSAgPSBrbWVtX2NhY2hlX2FsbG9jKGV4dDRfZnJlZV9leHRfY2FjaGVwLCBHRlBfTk9GUyk7CisJCW5ld19lbnRyeS0+c3RhcnRfYmxrID0gYml0OworCQluZXdfZW50cnktPmdyb3VwICA9IGJsb2NrX2dyb3VwOworCQluZXdfZW50cnktPmNvdW50ID0gY291bnQ7CisJCW5ld19lbnRyeS0+dF90aWQgPSBoYW5kbGUtPmhfdHJhbnNhY3Rpb24tPnRfdGlkOworCQlleHQ0X2xvY2tfZ3JvdXAoc2IsIGJsb2NrX2dyb3VwKTsKKwkJbWJfY2xlYXJfYml0cyhzYl9iZ2xfbG9jayhzYmksIGJsb2NrX2dyb3VwKSwgYml0bWFwX2JoLT5iX2RhdGEsCisJCQkJYml0LCBjb3VudCk7CisJCWV4dDRfbWJfZnJlZV9tZXRhZGF0YShoYW5kbGUsICZlNGIsIG5ld19lbnRyeSk7CisJCWV4dDRfdW5sb2NrX2dyb3VwKHNiLCBibG9ja19ncm91cCk7CiAJfSBlbHNlIHsKIAkJZXh0NF9sb2NrX2dyb3VwKHNiLCBibG9ja19ncm91cCk7CisJCS8qIG5lZWQgdG8gdXBkYXRlIGdyb3VwX2luZm8tPmJiX2ZyZWUgYW5kIGJpdG1hcAorCQkgKiB3aXRoIGdyb3VwIGxvY2sgaGVsZC4gZ2VuZXJhdGVfYnVkZHkgbG9vayBhdAorCQkgKiB0aGVtIHdpdGggZ3JvdXAgbG9ja19oZWxkCisJCSAqLworCQltYl9jbGVhcl9iaXRzKHNiX2JnbF9sb2NrKHNiaSwgYmxvY2tfZ3JvdXApLCBiaXRtYXBfYmgtPmJfZGF0YSwKKwkJCQliaXQsIGNvdW50KTsKIAkJbWJfZnJlZV9ibG9ja3MoaW5vZGUsICZlNGIsIGJpdCwgY291bnQpOwogCQlleHQ0X21iX3JldHVybl90b19wcmVhbGxvY2F0aW9uKGlub2RlLCAmZTRiLCBibG9jaywgY291bnQpOwogCQlleHQ0X3VubG9ja19ncm91cChzYiwgYmxvY2tfZ3JvdXApOwogCX0KIAogCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhzYmksIGJsb2NrX2dyb3VwKSk7Ci0JbGUxNl9hZGRfY3B1KCZnZHAtPmJnX2ZyZWVfYmxvY2tzX2NvdW50LCBjb3VudCk7CisJcmV0ID0gZXh0NF9mcmVlX2Jsa3NfY291bnQoc2IsIGdkcCkgKyBjb3VudDsKKwlleHQ0X2ZyZWVfYmxrc19zZXQoc2IsIGdkcCwgcmV0KTsKIAlnZHAtPmJnX2NoZWNrc3VtID0gZXh0NF9ncm91cF9kZXNjX2NzdW0oc2JpLCBibG9ja19ncm91cCwgZ2RwKTsKIAlzcGluX3VubG9jayhzYl9iZ2xfbG9jayhzYmksIGJsb2NrX2dyb3VwKSk7CiAJcGVyY3B1X2NvdW50ZXJfYWRkKCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyLCBjb3VudCk7CkBAIC00NjM1LDkgKzQ5MjYsMTMgQEAKIAogCSpmcmVlZCArPSBjb3VudDsKIAorCS8qIFdlIGRpcnRpZWQgdGhlIGJpdG1hcCBibG9jayAqLworCUJVRkZFUl9UUkFDRShiaXRtYXBfYmgsICJkaXJ0aWVkIGJpdG1hcCBibG9jayIpOworCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgYml0bWFwX2JoKTsKKwogCS8qIEFuZCB0aGUgZ3JvdXAgZGVzY3JpcHRvciBibG9jayAqLwogCUJVRkZFUl9UUkFDRShnZF9iaCwgImRpcnRpZWQgZ3JvdXAgZGVzY3JpcHRvciBibG9jayIpOwotCXJldCA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGdkX2JoKTsKKwlyZXQgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIGdkX2JoKTsKIAlpZiAoIWVycikKIAkJZXJyID0gcmV0OwogCmRpZmYgLS1naXQgYS9mcy9leHQ0L21iYWxsb2MuaCBiL2ZzL2V4dDQvbWJhbGxvYy5oCmluZGV4IGI1ZGZmMWYuLjEwYTI5MjEgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvbWJhbGxvYy5oCisrKyBiL2ZzL2V4dDQvbWJhbGxvYy5oCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L21hcmtlci5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSAiZXh0NF9qYmQyLmgiCiAjaW5jbHVkZSAiZXh0NC5oIgogI2luY2x1ZGUgImdyb3VwLmgiCkBAIC05OCw5ICs5OSw2IEBACiAgKi8KICNkZWZpbmUgTUJfREVGQVVMVF9HUk9VUF9QUkVBTExPQwk1MTIKIAotc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpleHQ0X3BzcGFjZV9jYWNoZXA7Ci1zdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmV4dDRfYWNfY2FjaGVwOwotc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpleHQ0X2ZyZWVfZXh0X2NhY2hlcDsKIAogc3RydWN0IGV4dDRfZnJlZV9kYXRhIHsKIAkvKiB0aGlzIGxpbmtzIHRoZSBmcmVlIGJsb2NrIGluZm9ybWF0aW9uIGZyb20gZ3JvdXBfaW5mbyAqLwpAQCAtMTIwLDI2ICsxMTgsNiBAQAogCXRpZF90CXRfdGlkOwogfTsKIAotc3RydWN0IGV4dDRfZ3JvdXBfaW5mbyB7Ci0JdW5zaWduZWQgbG9uZwliYl9zdGF0ZTsKLQlzdHJ1Y3QgcmJfcm9vdCAgYmJfZnJlZV9yb290OwotCXVuc2lnbmVkIHNob3J0CWJiX2ZpcnN0X2ZyZWU7Ci0JdW5zaWduZWQgc2hvcnQJYmJfZnJlZTsKLQl1bnNpZ25lZCBzaG9ydAliYl9mcmFnbWVudHM7Ci0Jc3RydWN0CQlsaXN0X2hlYWQgYmJfcHJlYWxsb2NfbGlzdDsKLSNpZmRlZiBET1VCTEVfQ0hFQ0sKLQl2b2lkCQkqYmJfYml0bWFwOwotI2VuZGlmCi0JdW5zaWduZWQgc2hvcnQJYmJfY291bnRlcnNbXTsKLX07Ci0KLSNkZWZpbmUgRVhUNF9HUk9VUF9JTkZPX05FRURfSU5JVF9CSVQJMAotI2RlZmluZSBFWFQ0X0dST1VQX0lORk9fTE9DS0VEX0JJVAkxCi0KLSNkZWZpbmUgRVhUNF9NQl9HUlBfTkVFRF9JTklUKGdycCkJXAotCSh0ZXN0X2JpdChFWFQ0X0dST1VQX0lORk9fTkVFRF9JTklUX0JJVCwgJigoZ3JwKS0+YmJfc3RhdGUpKSkKLQotCiBzdHJ1Y3QgZXh0NF9wcmVhbGxvY19zcGFjZSB7CiAJc3RydWN0IGxpc3RfaGVhZAlwYV9pbm9kZV9saXN0OwogCXN0cnVjdCBsaXN0X2hlYWQJcGFfZ3JvdXBfbGlzdDsKQEAgLTIxNyw2ICsxOTUsMTEgQEAKIAlfX3U4IGFjX29wOwkJLyogb3BlcmF0aW9uLCBmb3IgaGlzdG9yeSBvbmx5ICovCiAJc3RydWN0IHBhZ2UgKmFjX2JpdG1hcF9wYWdlOwogCXN0cnVjdCBwYWdlICphY19idWRkeV9wYWdlOworCS8qCisJICogcG9pbnRlciB0byB0aGUgaGVsZCBzZW1hcGhvcmUgdXBvbiBzdWNjZXNzZnVsCisJICogYmxvY2sgYWxsb2NhdGlvbgorCSAqLworCXN0cnVjdCByd19zZW1hcGhvcmUgKmFsbG9jX3NlbXA7CiAJc3RydWN0IGV4dDRfcHJlYWxsb2Nfc3BhY2UgKmFjX3BhOwogCXN0cnVjdCBleHQ0X2xvY2FsaXR5X2dyb3VwICphY19sZzsKIH07CkBAIC0yNTAsNiArMjMzLDcgQEAKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmJkX3NiOwogCV9fdTE2IGJkX2Jsa2JpdHM7CiAJZXh0NF9ncm91cF90IGJkX2dyb3VwOworCXN0cnVjdCByd19zZW1hcGhvcmUgKmFsbG9jX3NlbXA7CiB9OwogI2RlZmluZSBFWFQ0X01CX0JJVE1BUChlNGIpCSgoZTRiKS0+YmRfYml0bWFwKQogI2RlZmluZSBFWFQ0X01CX0JVRERZKGU0YikJKChlNGIpLT5iZF9idWRkeSkKQEAgLTI1OSw1MSArMjQzLDEyIEBACiB7CiAJcmV0dXJuOwogfQotI2Vsc2UKLXN0YXRpYyB2b2lkIGV4dDRfbWJfc3RvcmVfaGlzdG9yeShzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX2NvbnRleHQgKmFjKTsKICNlbmRpZgogCiAjZGVmaW5lIGluX3JhbmdlKGIsIGZpcnN0LCBsZW4pCSgoYikgPj0gKGZpcnN0KSAmJiAoYikgPD0gKGZpcnN0KSArIChsZW4pIC0gMSkKIAogc3RydWN0IGJ1ZmZlcl9oZWFkICpyZWFkX2Jsb2NrX2JpdG1hcChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgZXh0NF9ncm91cF90KTsKLQotc3RhdGljIHZvaWQgZXh0NF9tYl9nZW5lcmF0ZV9mcm9tX3BhKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmJpdG1hcCwKLQkJCQkJZXh0NF9ncm91cF90IGdyb3VwKTsKLXN0YXRpYyB2b2lkIGV4dDRfbWJfcmV0dXJuX3RvX3ByZWFsbG9jYXRpb24oc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkJc3RydWN0IGV4dDRfYnVkZHkgKmU0Yiwgc2VjdG9yX3QgYmxvY2ssCi0JCQkJCWludCBjb3VudCk7Ci1zdGF0aWMgdm9pZCBleHQ0X21iX3B1dF9wYShzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX2NvbnRleHQgKiwKLQkJCXN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgZXh0NF9wcmVhbGxvY19zcGFjZSAqcGEpOwotc3RhdGljIGludCBleHQ0X21iX2luaXRfcGVyX2Rldl9wcm9jKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwotc3RhdGljIGludCBleHQ0X21iX2Rlc3Ryb3lfcGVyX2Rldl9wcm9jKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwotc3RhdGljIHZvaWQgcmVsZWFzZV9ibG9ja3Nfb25fY29tbWl0KGpvdXJuYWxfdCAqam91cm5hbCwgdHJhbnNhY3Rpb25fdCAqdHhuKTsKLQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZXh0NF9sb2NrX2dyb3VwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGV4dDRfZ3JvdXBfdCBncm91cCkKLXsKLQlzdHJ1Y3QgZXh0NF9ncm91cF9pbmZvICpncmluZm8gPSBleHQ0X2dldF9ncm91cF9pbmZvKHNiLCBncm91cCk7Ci0KLQliaXRfc3Bpbl9sb2NrKEVYVDRfR1JPVVBfSU5GT19MT0NLRURfQklULCAmKGdyaW5mby0+YmJfc3RhdGUpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGV4dDRfdW5sb2NrX2dyb3VwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCi0JCQkJCWV4dDRfZ3JvdXBfdCBncm91cCkKLXsKLQlzdHJ1Y3QgZXh0NF9ncm91cF9pbmZvICpncmluZm8gPSBleHQ0X2dldF9ncm91cF9pbmZvKHNiLCBncm91cCk7Ci0KLQliaXRfc3Bpbl91bmxvY2soRVhUNF9HUk9VUF9JTkZPX0xPQ0tFRF9CSVQsICYoZ3JpbmZvLT5iYl9zdGF0ZSkpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBleHQ0X2lzX2dyb3VwX2xvY2tlZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkJCQlleHQ0X2dyb3VwX3QgZ3JvdXApCi17Ci0Jc3RydWN0IGV4dDRfZ3JvdXBfaW5mbyAqZ3JpbmZvID0gZXh0NF9nZXRfZ3JvdXBfaW5mbyhzYiwgZ3JvdXApOwotCi0JcmV0dXJuIGJpdF9zcGluX2lzX2xvY2tlZChFWFQ0X0dST1VQX0lORk9fTE9DS0VEX0JJVCwKLQkJCQkJCSYoZ3JpbmZvLT5iYl9zdGF0ZSkpOwotfQotCi1zdGF0aWMgZXh0NF9mc2Jsa190IGV4dDRfZ3JwX29mZnNfdG9fYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKK3N0YXRpYyBpbmxpbmUgZXh0NF9mc2Jsa190IGV4dDRfZ3JwX29mZnNfdG9fYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCQkJc3RydWN0IGV4dDRfZnJlZV9leHRlbnQgKmZleCkKIHsKIAlleHQ0X2ZzYmxrX3QgYmxvY2s7CmRpZmYgLS1naXQgYS9mcy9leHQ0L21pZ3JhdGUuYyBiL2ZzL2V4dDQvbWlncmF0ZS5jCmluZGV4IGYyYTljZjQuLjczNGFiY2EgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvbWlncmF0ZS5jCisrKyBiL2ZzL2V4dDQvbWlncmF0ZS5jCkBAIC01OSw3ICs1OSw4IEBACiAJLyoKIAkgKiBNYWtlIHN1cmUgdGhlIGNyZWRpdCB3ZSBhY2N1bWFsYXRlZCBpcyBub3QgcmVhbGx5IGhpZ2gKIAkgKi8KLQlpZiAobmVlZGVkICYmIGhhbmRsZS0+aF9idWZmZXJfY3JlZGl0cyA+PSBFWFQ0X1JFU0VSVkVfVFJBTlNfQkxPQ0tTKSB7CisJaWYgKG5lZWRlZCAmJiBleHQ0X2hhbmRsZV9oYXNfZW5vdWdoX2NyZWRpdHMoaGFuZGxlLAorCQkJCQkJRVhUNF9SRVNFUlZFX1RSQU5TX0JMT0NLUykpIHsKIAkJcmV0dmFsID0gZXh0NF9qb3VybmFsX3Jlc3RhcnQoaGFuZGxlLCBuZWVkZWQpOwogCQlpZiAocmV0dmFsKQogCQkJZ290byBlcnJfb3V0OwpAQCAtMjI5LDcgKzIzMCw3IEBACiB7CiAJaW50IHJldHZhbCA9IDAsIG5lZWRlZDsKIAotCWlmIChoYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHMgPiBFWFQ0X1JFU0VSVkVfVFJBTlNfQkxPQ0tTKQorCWlmIChleHQ0X2hhbmRsZV9oYXNfZW5vdWdoX2NyZWRpdHMoaGFuZGxlLCBFWFQ0X1JFU0VSVkVfVFJBTlNfQkxPQ0tTKzEpKQogCQlyZXR1cm4gMDsKIAkvKgogCSAqIFdlIGFyZSBmcmVlaW5nIGEgYmxvY2tzLiBEdXJpbmcgdGhpcyB3ZSB0b3VjaApAQCAtNDU4LDEzICs0NTksMTMgQEAKIAlzdHJ1Y3QgbGlzdF9ibG9ja3Nfc3RydWN0IGxiOwogCXVuc2lnbmVkIGxvbmcgbWF4X2VudHJpZXM7CiAKLQlpZiAoIXRlc3Rfb3B0KGlub2RlLT5pX3NiLCBFWFRFTlRTKSkKLQkJLyoKLQkJICogaWYgbW91bnRlZCB3aXRoIG5vZXh0ZW50cyB3ZSBkb24ndCBhbGxvdyB0aGUgbWlncmF0ZQotCQkgKi8KLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoKEVYVDRfSShpbm9kZSktPmlfZmxhZ3MgJiBFWFQ0X0VYVEVOVFNfRkwpKQorCS8qCisJICogSWYgdGhlIGZpbGVzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBleHRlbnRzLCBvciB0aGUgaW5vZGUKKwkgKiBhbHJlYWR5IGlzIGV4dGVudC1iYXNlZCwgZXJyb3Igb3V0LgorCSAqLworCWlmICghRVhUNF9IQVNfSU5DT01QQVRfRkVBVFVSRShpbm9kZS0+aV9zYiwKKwkJCQkgICAgICAgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0VYVEVOVFMpIHx8CisJICAgIChFWFQ0X0koaW5vZGUpLT5pX2ZsYWdzICYgRVhUNF9FWFRFTlRTX0ZMKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSAmJiBpbm9kZS0+aV9ibG9ja3MgPT0gMCkKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbmFtZWkuYyBiL2ZzL2V4dDQvbmFtZWkuYwppbmRleCA5ZmQyYTVlLi5mZWMwYjRjIDEwMDY0NAotLS0gYS9mcy9leHQ0L25hbWVpLmMKKysrIGIvZnMvZXh0NC9uYW1laS5jCkBAIC03NCwxMCArNzQsNiBAQAogI2RlZmluZSBhc3NlcnQodGVzdCkgSl9BU1NFUlQodGVzdCkKICNlbmRpZgogCi0jaWZuZGVmIHN3YXAKLSNkZWZpbmUgc3dhcCh4LCB5KSBkbyB7IHR5cGVvZih4KSB6ID0geDsgeCA9IHk7IHkgPSB6OyB9IHdoaWxlICgwKQotI2VuZGlmCi0KICNpZmRlZiBEWF9ERUJVRwogI2RlZmluZSBkeHRyYWNlKGNvbW1hbmQpIGNvbW1hbmQKICNlbHNlCkBAIC0zNzIsNiArMzY4LDggQEAKIAkJZ290byBmYWlsOwogCX0KIAloaW5mby0+aGFzaF92ZXJzaW9uID0gcm9vdC0+aW5mby5oYXNoX3ZlcnNpb247CisJaWYgKGhpbmZvLT5oYXNoX3ZlcnNpb24gPD0gRFhfSEFTSF9URUEpCisJCWhpbmZvLT5oYXNoX3ZlcnNpb24gKz0gRVhUNF9TQihkaXItPmlfc2IpLT5zX2hhc2hfdW5zaWduZWQ7CiAJaGluZm8tPnNlZWQgPSBFWFQ0X1NCKGRpci0+aV9zYiktPnNfaGFzaF9zZWVkOwogCWlmIChkX25hbWUpCiAJCWV4dDRmc19kaXJoYXNoKGRfbmFtZS0+bmFtZSwgZF9uYW1lLT5sZW4sIGhpbmZvKTsKQEAgLTY0MSw2ICs2MzksOSBAQAogCWRpciA9IGRpcl9maWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCWlmICghKEVYVDRfSShkaXIpLT5pX2ZsYWdzICYgRVhUNF9JTkRFWF9GTCkpIHsKIAkJaGluZm8uaGFzaF92ZXJzaW9uID0gRVhUNF9TQihkaXItPmlfc2IpLT5zX2RlZl9oYXNoX3ZlcnNpb247CisJCWlmIChoaW5mby5oYXNoX3ZlcnNpb24gPD0gRFhfSEFTSF9URUEpCisJCQloaW5mby5oYXNoX3ZlcnNpb24gKz0KKwkJCQlFWFQ0X1NCKGRpci0+aV9zYiktPnNfaGFzaF91bnNpZ25lZDsKIAkJaGluZm8uc2VlZCA9IEVYVDRfU0IoZGlyLT5pX3NiKS0+c19oYXNoX3NlZWQ7CiAJCWNvdW50ID0gaHRyZWVfZGlyYmxvY2tfdG9fdHJlZShkaXJfZmlsZSwgZGlyLCAwLCAmaGluZm8sCiAJCQkJCSAgICAgICBzdGFydF9oYXNoLCBzdGFydF9taW5vcl9oYXNoKTsKQEAgLTgwNiw3ICs4MDcsNyBAQAogc3RhdGljIGlubGluZSBpbnQgc2VhcmNoX2RpcmJsb2NrKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCiAJCQkJICBzdHJ1Y3QgaW5vZGUgKmRpciwKIAkJCQkgIGNvbnN0IHN0cnVjdCBxc3RyICpkX25hbWUsCi0JCQkJICB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCQkgIHVuc2lnbmVkIGludCBvZmZzZXQsCiAJCQkJICBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKiByZXNfZGlyKQogewogCXN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICogZGU7CkBAIC0xMDQzLDExICsxMDQ0LDExIEBACiAJYmggPSBleHQ0X2ZpbmRfZW50cnkoZGlyLCAmZGVudHJ5LT5kX25hbWUsICZkZSk7CiAJaW5vZGUgPSBOVUxMOwogCWlmIChiaCkgewotCQl1bnNpZ25lZCBsb25nIGlubyA9IGxlMzJfdG9fY3B1KGRlLT5pbm9kZSk7CisJCV9fdTMyIGlubyA9IGxlMzJfdG9fY3B1KGRlLT5pbm9kZSk7CiAJCWJyZWxzZShiaCk7CiAJCWlmICghZXh0NF92YWxpZF9pbnVtKGRpci0+aV9zYiwgaW5vKSkgewogCQkJZXh0NF9lcnJvcihkaXItPmlfc2IsICJleHQ0X2xvb2t1cCIsCi0JCQkJICAgImJhZCBpbm9kZSBudW1iZXI6ICVsdSIsIGlubyk7CisJCQkJICAgImJhZCBpbm9kZSBudW1iZXI6ICV1IiwgaW5vKTsKIAkJCXJldHVybiBFUlJfUFRSKC1FSU8pOwogCQl9CiAJCWlub2RlID0gZXh0NF9pZ2V0KGRpci0+aV9zYiwgaW5vKTsKQEAgLTEwNjAsNyArMTA2MSw3IEBACiAKIHN0cnVjdCBkZW50cnkgKmV4dDRfZ2V0X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpjaGlsZCkKIHsKLQl1bnNpZ25lZCBsb25nIGlubzsKKwlfX3UzMiBpbm87CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlzdGF0aWMgY29uc3Qgc3RydWN0IHFzdHIgZG90ZG90ID0gewogCQkubmFtZSA9ICIuLiIsCkBAIC0xMDc4LDcgKzEwNzksNyBAQAogCiAJaWYgKCFleHQ0X3ZhbGlkX2ludW0oY2hpbGQtPmRfaW5vZGUtPmlfc2IsIGlubykpIHsKIAkJZXh0NF9lcnJvcihjaGlsZC0+ZF9pbm9kZS0+aV9zYiwgImV4dDRfZ2V0X3BhcmVudCIsCi0JCQkgICAiYmFkIGlub2RlIG51bWJlcjogJWx1IiwgaW5vKTsKKwkJCSAgICJiYWQgaW5vZGUgbnVtYmVyOiAldSIsIGlubyk7CiAJCXJldHVybiBFUlJfUFRSKC1FSU8pOwogCX0KIApAQCAtMTE2Niw5ICsxMTY3LDkgQEAKIAl1MzIgaGFzaDI7CiAJc3RydWN0IGR4X21hcF9lbnRyeSAqbWFwOwogCWNoYXIgKmRhdGExID0gKCpiaCktPmJfZGF0YSwgKmRhdGEyOwotCXVuc2lnbmVkIHNwbGl0LCBtb3ZlLCBzaXplLCBpOworCXVuc2lnbmVkIHNwbGl0LCBtb3ZlLCBzaXplOwogCXN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSA9IE5VTEwsICpkZTI7Ci0JaW50CWVyciA9IDA7CisJaW50CWVyciA9IDAsIGk7CiAKIAliaDIgPSBleHQ0X2FwcGVuZCAoaGFuZGxlLCBkaXIsICZuZXdibG9jaywgJmVycik7CiAJaWYgKCEoYmgyKSkgewpAQCAtMTIyOCwxMCArMTIyOSwxMCBAQAogCQlkZSA9IGRlMjsKIAl9CiAJZHhfaW5zZXJ0X2Jsb2NrKGZyYW1lLCBoYXNoMiArIGNvbnRpbnVlZCwgbmV3YmxvY2spOwotCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoMik7CisJZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBkaXIsIGJoMik7CiAJaWYgKGVycikKIAkJZ290byBqb3VybmFsX2Vycm9yOwotCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGZyYW1lLT5iaCk7CisJZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBkaXIsIGZyYW1lLT5iaCk7CiAJaWYgKGVycikKIAkJZ290byBqb3VybmFsX2Vycm9yOwogCWJyZWxzZShiaDIpOwpAQCAtMTI2Niw3ICsxMjY3LDcgQEAKIAlzdHJ1Y3QgaW5vZGUJKmRpciA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7CiAJY29uc3QgY2hhcgkqbmFtZSA9IGRlbnRyeS0+ZF9uYW1lLm5hbWU7CiAJaW50CQluYW1lbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOwotCXVuc2lnbmVkIGxvbmcJb2Zmc2V0ID0gMDsKKwl1bnNpZ25lZCBpbnQJb2Zmc2V0ID0gMDsKIAl1bnNpZ25lZCBzaG9ydAlyZWNsZW47CiAJaW50CQlubGVuLCBybGVuLCBlcnI7CiAJY2hhcgkJKnRvcDsKQEAgLTEzMzUsOCArMTMzNiw4IEBACiAJZXh0NF91cGRhdGVfZHhfZmxhZyhkaXIpOwogCWRpci0+aV92ZXJzaW9uKys7CiAJZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgZGlyKTsKLQlCVUZGRVJfVFJBQ0UoYmgsICJjYWxsIGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOwotCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKTsKKwlCVUZGRVJfVFJBQ0UoYmgsICJjYWxsIGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhIik7CisJZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBkaXIsIGJoKTsKIAlpZiAoZXJyKQogCQlleHQ0X3N0ZF9lcnJvcihkaXItPmlfc2IsIGVycik7CiAJYnJlbHNlKGJoKTsKQEAgLTE0MDgsNiArMTQwOSw4IEBACiAKIAkvKiBJbml0aWFsaXplIGFzIGZvciBkeF9wcm9iZSAqLwogCWhpbmZvLmhhc2hfdmVyc2lvbiA9IHJvb3QtPmluZm8uaGFzaF92ZXJzaW9uOworCWlmIChoaW5mby5oYXNoX3ZlcnNpb24gPD0gRFhfSEFTSF9URUEpCisJCWhpbmZvLmhhc2hfdmVyc2lvbiArPSBFWFQ0X1NCKGRpci0+aV9zYiktPnNfaGFzaF91bnNpZ25lZDsKIAloaW5mby5zZWVkID0gRVhUNF9TQihkaXItPmlfc2IpLT5zX2hhc2hfc2VlZDsKIAlleHQ0ZnNfZGlyaGFzaChuYW1lLCBuYW1lbGVuLCAmaGluZm8pOwogCWZyYW1lID0gZnJhbWVzOwpAQCAtMTQzNyw3ICsxNDQwLDYgQEAKIAkJCSAgc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAlzdHJ1Y3QgaW5vZGUgKmRpciA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQ7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAlzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGU7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKQEAgLTE0NTksNyArMTQ2MSw3IEBACiAJCWV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGRpcik7CiAJfQogCWJsb2NrcyA9IGRpci0+aV9zaXplID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOwotCWZvciAoYmxvY2sgPSAwLCBvZmZzZXQgPSAwOyBibG9jayA8IGJsb2NrczsgYmxvY2srKykgeworCWZvciAoYmxvY2sgPSAwOyBibG9jayA8IGJsb2NrczsgYmxvY2srKykgewogCQliaCA9IGV4dDRfYnJlYWQoaGFuZGxlLCBkaXIsIGJsb2NrLCAwLCAmcmV0dmFsKTsKIAkJaWYoIWJoKQogCQkJcmV0dXJuIHJldHZhbDsKQEAgLTE1NzQsNyArMTU3Niw3IEBACiAJCQlkeHRyYWNlKGR4X3Nob3dfaW5kZXgoIm5vZGUiLCBmcmFtZXNbMV0uZW50cmllcykpOwogCQkJZHh0cmFjZShkeF9zaG93X2luZGV4KCJub2RlIiwKIAkJCSAgICAgICAoKHN0cnVjdCBkeF9ub2RlICopIGJoMi0+Yl9kYXRhKS0+ZW50cmllcykpOwotCQkJZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgyKTsKKwkJCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgaW5vZGUsIGJoMik7CiAJCQlpZiAoZXJyKQogCQkJCWdvdG8gam91cm5hbF9lcnJvcjsKIAkJCWJyZWxzZSAoYmgyKTsKQEAgLTE2MDAsNyArMTYwMiw3IEBACiAJCQlpZiAoZXJyKQogCQkJCWdvdG8gam91cm5hbF9lcnJvcjsKIAkJfQotCQlleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBmcmFtZXNbMF0uYmgpOworCQlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCBmcmFtZXNbMF0uYmgpOwogCX0KIAlkZSA9IGRvX3NwbGl0KGhhbmRsZSwgZGlyLCAmYmgsIGZyYW1lLCAmaGluZm8sICZlcnIpOwogCWlmICghZGUpCkBAIC0xNjQ2LDggKzE2NDgsOCBAQAogCQkJZWxzZQogCQkJCWRlLT5pbm9kZSA9IDA7CiAJCQlkaXItPmlfdmVyc2lvbisrOwotCQkJQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEiKTsKLQkJCWV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKTsKKwkJCUJVRkZFUl9UUkFDRShiaCwgImNhbGwgZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEiKTsKKwkJCWV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZGlyLCBiaCk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQlpICs9IGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZGUtPnJlY19sZW4pOwpAQCAtMTcyNSw3ICsxNzI3LDcgQEAKIAkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKIAogCWlmIChJU19ESVJTWU5DKGRpcikpCi0JCWhhbmRsZS0+aF9zeW5jID0gMTsKKwkJZXh0NF9oYW5kbGVfc3luYyhoYW5kbGUpOwogCiAJaW5vZGUgPSBleHQ0X25ld19pbm9kZSAoaGFuZGxlLCBkaXIsIG1vZGUpOwogCWVyciA9IFBUUl9FUlIoaW5vZGUpOwpAQCAtMTc1OSw3ICsxNzYxLDcgQEAKIAkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKIAogCWlmIChJU19ESVJTWU5DKGRpcikpCi0JCWhhbmRsZS0+aF9zeW5jID0gMTsKKwkJZXh0NF9oYW5kbGVfc3luYyhoYW5kbGUpOwogCiAJaW5vZGUgPSBleHQ0X25ld19pbm9kZShoYW5kbGUsIGRpciwgbW9kZSk7CiAJZXJyID0gUFRSX0VSUihpbm9kZSk7CkBAIC0xNzk1LDcgKzE3OTcsNyBAQAogCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOwogCiAJaWYgKElTX0RJUlNZTkMoZGlyKSkKLQkJaGFuZGxlLT5oX3N5bmMgPSAxOworCQlleHQ0X2hhbmRsZV9zeW5jKGhhbmRsZSk7CiAKIAlpbm9kZSA9IGV4dDRfbmV3X2lub2RlKGhhbmRsZSwgZGlyLCBTX0lGRElSIHwgbW9kZSk7CiAJZXJyID0gUFRSX0VSUihpbm9kZSk7CkBAIC0xODI0LDggKzE4MjYsOCBAQAogCXN0cmNweShkZS0+bmFtZSwgIi4uIik7CiAJZXh0NF9zZXRfZGVfdHlwZShkaXItPmlfc2IsIGRlLCBTX0lGRElSKTsKIAlpbm9kZS0+aV9ubGluayA9IDI7Ci0JQlVGRkVSX1RSQUNFKGRpcl9ibG9jaywgImNhbGwgZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7Ci0JZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZGlyX2Jsb2NrKTsKKwlCVUZGRVJfVFJBQ0UoZGlyX2Jsb2NrLCAiY2FsbCBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YSIpOworCWV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZGlyLCBkaXJfYmxvY2spOwogCWJyZWxzZShkaXJfYmxvY2spOwogCWV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKIAllcnIgPSBleHQ0X2FkZF9lbnRyeShoYW5kbGUsIGRlbnRyeSwgaW5vZGUpOwpAQCAtMTg1NCw3ICsxODU2LDcgQEAKICAqLwogc3RhdGljIGludCBlbXB0eV9kaXIoc3RydWN0IGlub2RlICppbm9kZSkKIHsKLQl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAJc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlLCAqZGUxOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CkBAIC0xODk5LDcgKzE5MDEsNyBAQAogCQkJCWlmIChlcnIpCiAJCQkJCWV4dDRfZXJyb3Ioc2IsIF9fZnVuY19fLAogCQkJCQkJICAgImVycm9yICVkIHJlYWRpbmcgZGlyZWN0b3J5IgotCQkJCQkJICAgIiAjJWx1IG9mZnNldCAlbHUiLAorCQkJCQkJICAgIiAjJWx1IG9mZnNldCAldSIsCiAJCQkJCQkgICBlcnIsIGlub2RlLT5pX2lubywgb2Zmc2V0KTsKIAkJCQlvZmZzZXQgKz0gc2ItPnNfYmxvY2tzaXplOwogCQkJCWNvbnRpbnVlOwpAQCAtMTkzNyw2ICsxOTM5LDkgQEAKIAlzdHJ1Y3QgZXh0NF9pbG9jIGlsb2M7CiAJaW50IGVyciA9IDAsIHJjOwogCisJaWYgKCFleHQ0X2hhbmRsZV92YWxpZChoYW5kbGUpKQorCQlyZXR1cm4gMDsKKwogCWxvY2tfc3VwZXIoc2IpOwogCWlmICghbGlzdF9lbXB0eSgmRVhUNF9JKGlub2RlKS0+aV9vcnBoYW4pKQogCQlnb3RvIG91dF91bmxvY2s7CkBAIC0xOTY1LDcgKzE5NzAsNyBAQAogCS8qIEluc2VydCB0aGlzIGlub2RlIGF0IHRoZSBoZWFkIG9mIHRoZSBvbi1kaXNrIG9ycGhhbiBsaXN0Li4uICovCiAJTkVYVF9PUlBIQU4oaW5vZGUpID0gbGUzMl90b19jcHUoRVhUNF9TQihzYiktPnNfZXMtPnNfbGFzdF9vcnBoYW4pOwogCUVYVDRfU0Ioc2IpLT5zX2VzLT5zX2xhc3Rfb3JwaGFuID0gY3B1X3RvX2xlMzIoaW5vZGUtPmlfaW5vKTsKLQllcnIgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBFWFQ0X1NCKHNiKS0+c19zYmgpOworCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgaW5vZGUsIEVYVDRfU0Ioc2IpLT5zX3NiaCk7CiAJcmMgPSBleHQ0X21hcmtfaWxvY19kaXJ0eShoYW5kbGUsIGlub2RlLCAmaWxvYyk7CiAJaWYgKCFlcnIpCiAJCWVyciA9IHJjOwpAQCAtMTk5OSwxMCArMjAwNCwxMyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKnByZXY7CiAJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpOwogCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaTsKLQl1bnNpZ25lZCBsb25nIGlub19uZXh0OworCV9fdTMyIGlub19uZXh0OwogCXN0cnVjdCBleHQ0X2lsb2MgaWxvYzsKIAlpbnQgZXJyID0gMDsKIAorCWlmICghZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSkKKwkJcmV0dXJuIDA7CisKIAlsb2NrX3N1cGVyKGlub2RlLT5pX3NiKTsKIAlpZiAobGlzdF9lbXB0eSgmZWktPmlfb3JwaGFuKSkgewogCQl1bmxvY2tfc3VwZXIoaW5vZGUtPmlfc2IpOwpAQCAtMjAyMSw3ICsyMDI5LDcgQEAKIAkgKiB0cmFuc2FjdGlvbiBoYW5kbGUgd2l0aCB3aGljaCB0byB1cGRhdGUgdGhlIG9ycGhhbiBsaXN0IG9uCiAJICogZGlzaywgYnV0IHdlIHN0aWxsIG5lZWQgdG8gcmVtb3ZlIHRoZSBpbm9kZSBmcm9tIHRoZSBsaW5rZWQKIAkgKiBsaXN0IGluIG1lbW9yeS4gKi8KLQlpZiAoIWhhbmRsZSkKKwlpZiAoc2JpLT5zX2pvdXJuYWwgJiYgIWhhbmRsZSkKIAkJZ290byBvdXQ7CiAKIAllcnIgPSBleHQ0X3Jlc2VydmVfaW5vZGVfd3JpdGUoaGFuZGxlLCBpbm9kZSwgJmlsb2MpOwpAQCAtMjAyOSwxOSArMjAzNywxOSBAQAogCQlnb3RvIG91dF9lcnI7CiAKIAlpZiAocHJldiA9PSAmc2JpLT5zX29ycGhhbikgewotCQlqYmRfZGVidWcoNCwgInN1cGVyYmxvY2sgd2lsbCBwb2ludCB0byAlbHVcbiIsIGlub19uZXh0KTsKKwkJamJkX2RlYnVnKDQsICJzdXBlcmJsb2NrIHdpbGwgcG9pbnQgdG8gJXVcbiIsIGlub19uZXh0KTsKIAkJQlVGRkVSX1RSQUNFKHNiaS0+c19zYmgsICJnZXRfd3JpdGVfYWNjZXNzIik7CiAJCWVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgc2JpLT5zX3NiaCk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dF9icmVsc2U7CiAJCXNiaS0+c19lcy0+c19sYXN0X29ycGhhbiA9IGNwdV90b19sZTMyKGlub19uZXh0KTsKLQkJZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgc2JpLT5zX3NiaCk7CisJCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgaW5vZGUsIHNiaS0+c19zYmgpOwogCX0gZWxzZSB7CiAJCXN0cnVjdCBleHQ0X2lsb2MgaWxvYzI7CiAJCXN0cnVjdCBpbm9kZSAqaV9wcmV2ID0KIAkJCSZsaXN0X2VudHJ5KHByZXYsIHN0cnVjdCBleHQ0X2lub2RlX2luZm8sIGlfb3JwaGFuKS0+dmZzX2lub2RlOwogCi0JCWpiZF9kZWJ1Zyg0LCAib3JwaGFuIGlub2RlICVsdSB3aWxsIHBvaW50IHRvICVsdVxuIiwKKwkJamJkX2RlYnVnKDQsICJvcnBoYW4gaW5vZGUgJWx1IHdpbGwgcG9pbnQgdG8gJXVcbiIsCiAJCQkgIGlfcHJldi0+aV9pbm8sIGlub19uZXh0KTsKIAkJZXJyID0gZXh0NF9yZXNlcnZlX2lub2RlX3dyaXRlKGhhbmRsZSwgaV9wcmV2LCAmaWxvYzIpOwogCQlpZiAoZXJyKQpAQCAtMjA4Niw3ICsyMDk0LDcgQEAKIAkJZ290byBlbmRfcm1kaXI7CiAKIAlpZiAoSVNfRElSU1lOQyhkaXIpKQotCQloYW5kbGUtPmhfc3luYyA9IDE7CisJCWV4dDRfaGFuZGxlX3N5bmMoaGFuZGxlKTsKIAogCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOwogCkBAIC0yMTQwLDcgKzIxNDgsNyBAQAogCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOwogCiAJaWYgKElTX0RJUlNZTkMoZGlyKSkKLQkJaGFuZGxlLT5oX3N5bmMgPSAxOworCQlleHQ0X2hhbmRsZV9zeW5jKGhhbmRsZSk7CiAKIAlyZXR2YWwgPSAtRU5PRU5UOwogCWJoID0gZXh0NF9maW5kX2VudHJ5KGRpciwgJmRlbnRyeS0+ZF9uYW1lLCAmZGUpOwpAQCAtMjE5Nyw3ICsyMjA1LDcgQEAKIAkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKIAogCWlmIChJU19ESVJTWU5DKGRpcikpCi0JCWhhbmRsZS0+aF9zeW5jID0gMTsKKwkJZXh0NF9oYW5kbGVfc3luYyhoYW5kbGUpOwogCiAJaW5vZGUgPSBleHQ0X25ld19pbm9kZShoYW5kbGUsIGRpciwgU19JRkxOS3xTX0lSV1hVR08pOwogCWVyciA9IFBUUl9FUlIoaW5vZGUpOwpAQCAtMjI2MCw3ICsyMjY4LDcgQEAKIAkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKIAogCWlmIChJU19ESVJTWU5DKGRpcikpCi0JCWhhbmRsZS0+aF9zeW5jID0gMTsKKwkJZXh0NF9oYW5kbGVfc3luYyhoYW5kbGUpOwogCiAJaW5vZGUtPmlfY3RpbWUgPSBleHQ0X2N1cnJlbnRfdGltZShpbm9kZSk7CiAJZXh0NF9pbmNfY291bnQoaGFuZGxlLCBpbm9kZSk7CkBAIC0yMzA5LDcgKzIzMTcsNyBAQAogCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOwogCiAJaWYgKElTX0RJUlNZTkMob2xkX2RpcikgfHwgSVNfRElSU1lOQyhuZXdfZGlyKSkKLQkJaGFuZGxlLT5oX3N5bmMgPSAxOworCQlleHQ0X2hhbmRsZV9zeW5jKGhhbmRsZSk7CiAKIAlvbGRfYmggPSBleHQ0X2ZpbmRfZW50cnkob2xkX2RpciwgJm9sZF9kZW50cnktPmRfbmFtZSwgJm9sZF9kZSk7CiAJLyoKQEAgLTIzNjMsOCArMjM3MSw4IEBACiAJCW5ld19kaXItPmlfY3RpbWUgPSBuZXdfZGlyLT5pX210aW1lID0KIAkJCQkJZXh0NF9jdXJyZW50X3RpbWUobmV3X2Rpcik7CiAJCWV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIG5ld19kaXIpOwotCQlCVUZGRVJfVFJBQ0UobmV3X2JoLCAiY2FsbCBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEiKTsKLQkJZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgbmV3X2JoKTsKKwkJQlVGRkVSX1RSQUNFKG5ld19iaCwgImNhbGwgZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEiKTsKKwkJZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBuZXdfZGlyLCBuZXdfYmgpOwogCQlicmVsc2UobmV3X2JoKTsKIAkJbmV3X2JoID0gTlVMTDsKIAl9CkBAIC0yNDE0LDggKzI0MjIsOCBAQAogCQlCVUZGRVJfVFJBQ0UoZGlyX2JoLCAiZ2V0X3dyaXRlX2FjY2VzcyIpOwogCQlleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGRpcl9iaCk7CiAJCVBBUkVOVF9JTk8oZGlyX2JoLT5iX2RhdGEpID0gY3B1X3RvX2xlMzIobmV3X2Rpci0+aV9pbm8pOwotCQlCVUZGRVJfVFJBQ0UoZGlyX2JoLCAiY2FsbCBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEiKTsKLQkJZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZGlyX2JoKTsKKwkJQlVGRkVSX1RSQUNFKGRpcl9iaCwgImNhbGwgZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEiKTsKKwkJZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBvbGRfZGlyLCBkaXJfYmgpOwogCQlleHQ0X2RlY19jb3VudChoYW5kbGUsIG9sZF9kaXIpOwogCQlpZiAobmV3X2lub2RlKSB7CiAJCQkvKiBjaGVja2VkIGVtcHR5X2RpciBhYm92ZSwgY2FuJ3QgaGF2ZSBhbm90aGVyIHBhcmVudCwKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvcmVzaXplLmMgYi9mcy9leHQ0L3Jlc2l6ZS5jCmluZGV4IGI2ZWMxODQuLmMzMjhiZTUgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvcmVzaXplLmMKKysrIGIvZnMvZXh0NC9yZXNpemUuYwpAQCAtNTAsNyArNTAsNyBAQAogCWV4dDRfZ2V0X2dyb3VwX25vX2FuZF9vZmZzZXQoc2IsIHN0YXJ0LCBOVUxMLCAmb2Zmc2V0KTsKIAlpZiAoZ3JvdXAgIT0gc2JpLT5zX2dyb3Vwc19jb3VudCkKIAkJZXh0NF93YXJuaW5nKHNiLCBfX2Z1bmNfXywKLQkJCSAgICAgIkNhbm5vdCBhZGQgYXQgZ3JvdXAgJXUgKG9ubHkgJWx1IGdyb3VwcykiLAorCQkJICAgICAiQ2Fubm90IGFkZCBhdCBncm91cCAldSAob25seSAldSBncm91cHMpIiwKIAkJCSAgICAgaW5wdXQtPmdyb3VwLCBzYmktPnNfZ3JvdXBzX2NvdW50KTsKIAllbHNlIGlmIChvZmZzZXQgIT0gMCkKIAkJCWV4dDRfd2FybmluZyhzYiwgX19mdW5jX18sICJMYXN0IGdyb3VwIG5vdCBmdWxsIik7CkBAIC0xNDksNyArMTQ5LDcgQEAKIHsKIAlpbnQgZXJyOwogCi0JaWYgKGhhbmRsZS0+aF9idWZmZXJfY3JlZGl0cyA+PSB0aHJlc2gpCisJaWYgKGV4dDRfaGFuZGxlX2hhc19lbm91Z2hfY3JlZGl0cyhoYW5kbGUsIHRocmVzaCkpCiAJCXJldHVybiAwOwogCiAJZXJyID0gZXh0NF9qb3VybmFsX2V4dGVuZChoYW5kbGUsIEVYVDRfTUFYX1RSQU5TX0RBVEEpOwpAQCAtMjMyLDcgKzIzMiw3IEBACiAJCW1lbWNweShnZGItPmJfZGF0YSwgc2JpLT5zX2dyb3VwX2Rlc2NbaV0tPmJfZGF0YSwgZ2RiLT5iX3NpemUpOwogCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGdkYik7CiAJCXVubG9ja19idWZmZXIoZ2RiKTsKLQkJZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZ2RiKTsKKwkJZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBnZGIpOwogCQlleHQ0X3NldF9iaXQoYml0LCBiaC0+Yl9kYXRhKTsKIAkJYnJlbHNlKGdkYik7CiAJfQpAQCAtMjUxLDcgKzI1MSw3IEBACiAJCQllcnIgPSBQVFJfRVJSKGJoKTsKIAkJCWdvdG8gZXhpdF9iaDsKIAkJfQotCQlleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBnZGIpOworCQlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIGdkYik7CiAJCWV4dDRfc2V0X2JpdChiaXQsIGJoLT5iX2RhdGEpOwogCQlicmVsc2UoZ2RiKTsKIAl9CkBAIC0yNzYsNyArMjc2LDcgQEAKIAkJCWVyciA9IFBUUl9FUlIoaXQpOwogCQkJZ290byBleGl0X2JoOwogCQl9Ci0JCWV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGl0KTsKKwkJZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBpdCk7CiAJCWJyZWxzZShpdCk7CiAJCWV4dDRfc2V0X2JpdChiaXQsIGJoLT5iX2RhdGEpOwogCX0KQEAgLTI4NCwxMSArMjg0LDkgQEAKIAlpZiAoKGVyciA9IGV4dGVuZF9vcl9yZXN0YXJ0X3RyYW5zYWN0aW9uKGhhbmRsZSwgMiwgYmgpKSkKIAkJZ290byBleGl0X2JoOwogCi0JbWFya19iaXRtYXBfZW5kKGlucHV0LT5ibG9ja3NfY291bnQsIEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYiksCi0JCQliaC0+Yl9kYXRhKTsKLQlleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJbWFya19iaXRtYXBfZW5kKGlucHV0LT5ibG9ja3NfY291bnQsIHNiLT5zX2Jsb2Nrc2l6ZSAqIDgsIGJoLT5iX2RhdGEpOworCWV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgYmgpOwogCWJyZWxzZShiaCk7Ci0KIAkvKiBNYXJrIHVudXNlZCBlbnRyaWVzIGluIGlub2RlIGJpdG1hcCB1c2VkICovCiAJZXh0NF9kZWJ1ZygiY2xlYXIgaW5vZGUgYml0bWFwICUjMDRsbHggKCslbGx1KVxuIiwKIAkJICAgaW5wdXQtPmlub2RlX2JpdG1hcCwgaW5wdXQtPmlub2RlX2JpdG1hcCAtIHN0YXJ0KTsKQEAgLTI5Nyw5ICsyOTUsOSBAQAogCQlnb3RvIGV4aXRfam91cm5hbDsKIAl9CiAKLQltYXJrX2JpdG1hcF9lbmQoRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKSwgRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKSwKKwltYXJrX2JpdG1hcF9lbmQoRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKSwgc2ItPnNfYmxvY2tzaXplICogOCwKIAkJCWJoLT5iX2RhdGEpOwotCWV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKTsKKwlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIGJoKTsKIGV4aXRfYmg6CiAJYnJlbHNlKGJoKTsKIApAQCAtNDg2LDEyICs0ODQsMTIgQEAKIAkgKiByZXNlcnZlZCBpbm9kZSwgYW5kIHdpbGwgYmVjb21lIEdEVCBibG9ja3MgKHByaW1hcnkgYW5kIGJhY2t1cCkuCiAJICovCiAJZGF0YVtnZGJfbnVtICUgRVhUNF9BRERSX1BFUl9CTE9DSyhzYildID0gMDsKLQlleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBkaW5kKTsKKwlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIGRpbmQpOwogCWJyZWxzZShkaW5kKTsKIAlpbm9kZS0+aV9ibG9ja3MgLT0gKGdkYmFja3VwcyArIDEpICogc2ItPnNfYmxvY2tzaXplID4+IDk7CiAJZXh0NF9tYXJrX2lsb2NfZGlydHkoaGFuZGxlLCBpbm9kZSwgJmlsb2MpOwogCW1lbXNldCgoKnByaW1hcnkpLT5iX2RhdGEsIDAsIHNiLT5zX2Jsb2Nrc2l6ZSk7Ci0JZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgKnByaW1hcnkpOworCWV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgKnByaW1hcnkpOwogCiAJb19ncm91cF9kZXNjID0gRVhUNF9TQihzYiktPnNfZ3JvdXBfZGVzYzsKIAltZW1jcHkobl9ncm91cF9kZXNjLCBvX2dyb3VwX2Rlc2MsCkBAIC01MDIsNyArNTAwLDcgQEAKIAlrZnJlZShvX2dyb3VwX2Rlc2MpOwogCiAJbGUxNl9hZGRfY3B1KCZlcy0+c19yZXNlcnZlZF9nZHRfYmxvY2tzLCAtMSk7Ci0JZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgRVhUNF9TQihzYiktPnNfc2JoKTsKKwlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIEVYVDRfU0Ioc2IpLT5zX3NiaCk7CiAKIAlyZXR1cm4gMDsKIApAQCAtNjE4LDcgKzYxNiw3IEBACiAJCSAgICAgICBwcmltYXJ5W2ldLT5iX2Jsb2NrbnIsIGdkYmFja3VwcywKIAkJICAgICAgIGJsayArIHByaW1hcnlbaV0tPmJfYmxvY2tucik7ICovCiAJCWRhdGFbZ2RiYWNrdXBzXSA9IGNwdV90b19sZTMyKGJsayArIHByaW1hcnlbaV0tPmJfYmxvY2tucik7Ci0JCWVycjIgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBwcmltYXJ5W2ldKTsKKwkJZXJyMiA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgcHJpbWFyeVtpXSk7CiAJCWlmICghZXJyKQogCQkJZXJyID0gZXJyMjsKIAl9CkBAIC02NzYsNyArNjc0LDggQEAKIAkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAogCQkvKiBPdXQgb2Ygam91cm5hbCBzcGFjZSwgYW5kIGNhbid0IGdldCBtb3JlIC0gYWJvcnQgLSBzbyBzYWQgKi8KLQkJaWYgKGhhbmRsZS0+aF9idWZmZXJfY3JlZGl0cyA9PSAwICYmCisJCWlmIChleHQ0X2hhbmRsZV92YWxpZChoYW5kbGUpICYmCisJCSAgICBoYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHMgPT0gMCAmJgogCQkgICAgZXh0NF9qb3VybmFsX2V4dGVuZChoYW5kbGUsIEVYVDRfTUFYX1RSQU5TX0RBVEEpICYmCiAJCSAgICAoZXJyID0gZXh0NF9qb3VybmFsX3Jlc3RhcnQoaGFuZGxlLCBFWFQ0X01BWF9UUkFOU19EQVRBKSkpCiAJCQlicmVhazsKQEAgLTY5Niw3ICs2OTUsNyBAQAogCQkJbWVtc2V0KGJoLT5iX2RhdGEgKyBzaXplLCAwLCByZXN0KTsKIAkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CiAJCXVubG9ja19idWZmZXIoYmgpOwotCQlleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJCWV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgYmgpOwogCQlicmVsc2UoYmgpOwogCX0KIAlpZiAoKGVycjIgPSBleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpKSAmJiAhZXJyKQpAQCAtNzE1LDcgKzcxNCw3IEBACiBleGl0X2VycjoKIAlpZiAoZXJyKSB7CiAJCWV4dDRfd2FybmluZyhzYiwgX19mdW5jX18sCi0JCQkgICAgICJjYW4ndCB1cGRhdGUgYmFja3VwIGZvciBncm91cCAlbHUgKGVyciAlZCksICIKKwkJCSAgICAgImNhbid0IHVwZGF0ZSBiYWNrdXAgZm9yIGdyb3VwICV1IChlcnIgJWQpLCAiCiAJCQkgICAgICJmb3JjaW5nIGZzY2sgb24gbmV4dCByZWJvb3QiLCBncm91cCwgZXJyKTsKIAkJc2JpLT5zX21vdW50X3N0YXRlICY9IH5FWFQ0X1ZBTElEX0ZTOwogCQlzYmktPnNfZXMtPnNfc3RhdGUgJj0gY3B1X3RvX2xlMTYofkVYVDRfVkFMSURfRlMpOwpAQCAtNzQ3LDYgKzc0Niw3IEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CiAJaGFuZGxlX3QgKmhhbmRsZTsKIAlpbnQgZ2RiX29mZiwgZ2RiX251bTsKKwlpbnQgbnVtX2dycF9sb2NrZWQgPSAwOwogCWludCBlcnIsIGVycjI7CiAKIAlnZGJfbnVtID0gaW5wdXQtPmdyb3VwIC8gRVhUNF9ERVNDX1BFUl9CTE9DSyhzYik7CkBAIC03NjEsMTMgKzc2MSwxMyBAQAogCiAJaWYgKGV4dDRfYmxvY2tzX2NvdW50KGVzKSArIGlucHV0LT5ibG9ja3NfY291bnQgPAogCSAgICBleHQ0X2Jsb2Nrc19jb3VudChlcykpIHsKLQkJZXh0NF93YXJuaW5nKHNiLCBfX2Z1bmNfXywgImJsb2Nrc19jb3VudCBvdmVyZmxvd1xuIik7CisJCWV4dDRfd2FybmluZyhzYiwgX19mdW5jX18sICJibG9ja3NfY291bnQgb3ZlcmZsb3ciKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKGxlMzJfdG9fY3B1KGVzLT5zX2lub2Rlc19jb3VudCkgKyBFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpIDwKIAkgICAgbGUzMl90b19jcHUoZXMtPnNfaW5vZGVzX2NvdW50KSkgewotCQlleHQ0X3dhcm5pbmcoc2IsIF9fZnVuY19fLCAiaW5vZGVzX2NvdW50IG92ZXJmbG93XG4iKTsKKwkJZXh0NF93YXJuaW5nKHNiLCBfX2Z1bmNfXywgImlub2Rlc19jb3VudCBvdmVyZmxvdyIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTc4Nyw2ICs3ODcsNyBAQAogCQl9CiAJfQogCisKIAlpZiAoKGVyciA9IHZlcmlmeV9ncm91cF9pbnB1dChzYiwgaW5wdXQpKSkKIAkJZ290byBleGl0X3B1dDsKIApAQCAtODU1LDYgKzg1Niw3IEBACiAgICAgICAgICAqIHVzaW5nIHRoZSBuZXcgZGlzayBibG9ja3MuCiAgICAgICAgICAqLwogCisJbnVtX2dycF9sb2NrZWQgPSBleHQ0X21iX2dldF9idWRkeV9jYWNoZV9sb2NrKHNiLCBpbnB1dC0+Z3JvdXApOwogCS8qIFVwZGF0ZSBncm91cCBkZXNjcmlwdG9yIGJsb2NrIGZvciBuZXcgZ3JvdXAgKi8KIAlnZHAgPSAoc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqKSgoY2hhciAqKXByaW1hcnktPmJfZGF0YSArCiAJCQkJCSBnZGJfb2ZmICogRVhUNF9ERVNDX1NJWkUoc2IpKTsKQEAgLTg2MiwxNyArODY0LDIwIEBACiAJZXh0NF9ibG9ja19iaXRtYXBfc2V0KHNiLCBnZHAsIGlucHV0LT5ibG9ja19iaXRtYXApOyAvKiBMViBGSVhNRSAqLwogCWV4dDRfaW5vZGVfYml0bWFwX3NldChzYiwgZ2RwLCBpbnB1dC0+aW5vZGVfYml0bWFwKTsgLyogTFYgRklYTUUgKi8KIAlleHQ0X2lub2RlX3RhYmxlX3NldChzYiwgZ2RwLCBpbnB1dC0+aW5vZGVfdGFibGUpOyAvKiBMViBGSVhNRSAqLwotCWdkcC0+YmdfZnJlZV9ibG9ja3NfY291bnQgPSBjcHVfdG9fbGUxNihpbnB1dC0+ZnJlZV9ibG9ja3NfY291bnQpOwotCWdkcC0+YmdfZnJlZV9pbm9kZXNfY291bnQgPSBjcHVfdG9fbGUxNihFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpKTsKKwlleHQ0X2ZyZWVfYmxrc19zZXQoc2IsIGdkcCwgaW5wdXQtPmZyZWVfYmxvY2tzX2NvdW50KTsKKwlleHQ0X2ZyZWVfaW5vZGVzX3NldChzYiwgZ2RwLCBFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpKTsKKwlnZHAtPmJnX2ZsYWdzIHw9IGNwdV90b19sZTE2KEVYVDRfQkdfSU5PREVfWkVST0VEKTsKIAlnZHAtPmJnX2NoZWNrc3VtID0gZXh0NF9ncm91cF9kZXNjX2NzdW0oc2JpLCBpbnB1dC0+Z3JvdXAsIGdkcCk7CiAKIAkvKgogCSAqIFdlIGNhbiBhbGxvY2F0ZSBtZW1vcnkgZm9yIG1iX2FsbG9jIGJhc2VkIG9uIHRoZSBuZXcgZ3JvdXAKIAkgKiBkZXNjcmlwdG9yCiAJICovCi0JZXJyID0gZXh0NF9tYl9hZGRfbW9yZV9ncm91cGluZm8oc2IsIGlucHV0LT5ncm91cCwgZ2RwKTsKLQlpZiAoZXJyKQorCWVyciA9IGV4dDRfbWJfYWRkX2dyb3VwaW5mbyhzYiwgaW5wdXQtPmdyb3VwLCBnZHApOworCWlmIChlcnIpIHsKKwkJZXh0NF9tYl9wdXRfYnVkZHlfY2FjaGVfbG9jayhzYiwgaW5wdXQtPmdyb3VwLCBudW1fZ3JwX2xvY2tlZCk7CiAJCWdvdG8gZXhpdF9qb3VybmFsOworCX0KIAogCS8qCiAJICogTWFrZSB0aGUgbmV3IGJsb2NrcyBhbmQgaW5vZGVzIHZhbGlkIG5leHQuICBXZSBkbyB0aGlzIGJlZm9yZQpAQCAtOTE0LDggKzkxOSw5IEBACiAKIAkvKiBVcGRhdGUgdGhlIGdsb2JhbCBmcyBzaXplIGZpZWxkcyAqLwogCXNiaS0+c19ncm91cHNfY291bnQrKzsKKwlleHQ0X21iX3B1dF9idWRkeV9jYWNoZV9sb2NrKHNiLCBpbnB1dC0+Z3JvdXAsIG51bV9ncnBfbG9ja2VkKTsKIAotCWV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIHByaW1hcnkpOworCWV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgcHJpbWFyeSk7CiAKIAkvKiBVcGRhdGUgdGhlIHJlc2VydmVkIGJsb2NrIGNvdW50cyBvbmx5IG9uY2UgdGhlIG5ldyBncm91cCBpcwogCSAqIGFjdGl2ZS4gKi8KQEAgLTkzNyw3ICs5NDMsNyBAQAogCQkJRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKTsKIAl9CiAKLQlleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBzYmktPnNfc2JoKTsKKwlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIHNiaS0+c19zYmgpOwogCXNiLT5zX2RpcnQgPSAxOwogCiBleGl0X2pvdXJuYWw6CkBAIC05NzUsOSArOTgxLDcgQEAKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCWhhbmRsZV90ICpoYW5kbGU7CiAJaW50IGVycjsKLQl1bnNpZ25lZCBsb25nIGZyZWVkX2Jsb2NrczsKIAlleHQ0X2dyb3VwX3QgZ3JvdXA7Ci0Jc3RydWN0IGV4dDRfZ3JvdXBfaW5mbyAqZ3JwOwogCiAJLyogV2UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBsb2NraW5nIHdydCBvdGhlciByZXNpemVycyBqdXN0CiAJICogeWV0OiB3ZSdyZSBnb2luZyB0byByZXZhbGlkYXRlIGVzLT5zX2Jsb2Nrc19jb3VudCBhZnRlcgpAQCAtOTk3LDggKzEwMDEsNyBAQAogCQkJIiB0b28gbGFyZ2UgdG8gcmVzaXplIHRvICVsbHUgYmxvY2tzIHNhZmVseVxuIiwKIAkJCXNiLT5zX2lkLCBuX2Jsb2Nrc19jb3VudCk7CiAJCWlmIChzaXplb2Yoc2VjdG9yX3QpIDwgOCkKLQkJCWV4dDRfd2FybmluZyhzYiwgX19mdW5jX18sCi0JCQkiQ09ORklHX0xCRCBub3QgZW5hYmxlZFxuIik7CisJCQlleHQ0X3dhcm5pbmcoc2IsIF9fZnVuY19fLCAiQ09ORklHX0xCRCBub3QgZW5hYmxlZCIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTEwNzEsNjIgKzEwNzQsMTggQEAKIAkJZ290byBleGl0X3B1dDsKIAl9CiAJZXh0NF9ibG9ja3NfY291bnRfc2V0KGVzLCBvX2Jsb2Nrc19jb3VudCArIGFkZCk7Ci0JZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgRVhUNF9TQihzYiktPnNfc2JoKTsKKwlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIEVYVDRfU0Ioc2IpLT5zX3NiaCk7CiAJc2ItPnNfZGlydCA9IDE7CiAJdW5sb2NrX3N1cGVyKHNiKTsKIAlleHQ0X2RlYnVnKCJmcmVlaW5nIGJsb2NrcyAlbGx1IHRocm91Z2ggJWxsdVxuIiwgb19ibG9ja3NfY291bnQsCiAJCSAgIG9fYmxvY2tzX2NvdW50ICsgYWRkKTsKLQlleHQ0X2ZyZWVfYmxvY2tzX3NiKGhhbmRsZSwgc2IsIG9fYmxvY2tzX2NvdW50LCBhZGQsICZmcmVlZF9ibG9ja3MpOworCS8qIFdlIGFkZCB0aGUgYmxvY2tzIHRvIHRoZSBiaXRtYXAgYW5kIHNldCB0aGUgZ3JvdXAgbmVlZCBpbml0IGJpdCAqLworCWV4dDRfYWRkX2dyb3VwYmxvY2tzKGhhbmRsZSwgc2IsIG9fYmxvY2tzX2NvdW50LCBhZGQpOwogCWV4dDRfZGVidWcoImZyZWVkIGJsb2NrcyAlbGx1IHRocm91Z2ggJWxsdVxuIiwgb19ibG9ja3NfY291bnQsCiAJCSAgIG9fYmxvY2tzX2NvdW50ICsgYWRkKTsKIAlpZiAoKGVyciA9IGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSkpKQogCQlnb3RvIGV4aXRfcHV0OwogCi0JLyoKLQkgKiBNYXJrIG1iYWxsb2MgcGFnZXMgYXMgbm90IHVwIHRvIGRhdGUgc28gdGhhdCB0aGV5IHdpbGwgYmUgdXBkYXRlZAotCSAqIG5leHQgdGltZSB0aGV5IGFyZSBsb2FkZWQgYnkgZXh0NF9tYl9sb2FkX2J1ZGR5LgotCSAqCi0JICogWFhYIEJhZCwgQmFkLCBCQUQhISEgIFdlIHNob3VsZCBub3QgYmUgb3ZlcmxvYWRpbmcgdGhlCi0JICogVXB0b2RhdGUgZmxhZywgcGFydGljdWxhcmx5IG9uIHRodGUgYml0bWFwIGJoLCBhcyB3YXkgb2YKLQkgKiBoaW50aW5nIHRvIGV4dDRfbWJfbG9hZF9idWRkeSgpIHRoYXQgaXQgbmVlZHMgdG8gYmUKLQkgKiBvdmVybG9hZGVkLiAgQSB1c2VyIGNvdWxkIHRha2UgYSBMVk0gc25hcHNob3QsIHRoZW4gZG8gYW4KLQkgKiBvbi1saW5lIGZzY2ssIGFuZCBjbGVhciB0aGUgdXB0b2RhdGUgZmxhZywgYW5kIHRoaXMgd291bGQKLQkgKiBub3QgYmUgYSBidWcgaW4gdXNlcnNwYWNlLCBidXQgYSBidWcgaW4gdGhlIGtlcm5lbC4gIEZJWE1FISEhCi0JICovCi0JewotCQlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKLQkJc3RydWN0IGlub2RlICppbm9kZSA9IHNiaS0+c19idWRkeV9jYWNoZTsKLQkJaW50IGJsb2Nrc19wZXJfcGFnZTsKLQkJaW50IGJsb2NrOwotCQlpbnQgcG51bTsKLQkJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0KLQkJLyogU2V0IGJ1ZGR5IHBhZ2UgYXMgbm90IHVwIHRvIGRhdGUgKi8KLQkJYmxvY2tzX3Blcl9wYWdlID0gUEFHRV9DQUNIRV9TSVpFIC8gc2ItPnNfYmxvY2tzaXplOwotCQlibG9jayA9IGdyb3VwICogMjsKLQkJcG51bSA9IGJsb2NrIC8gYmxvY2tzX3Blcl9wYWdlOwotCQlwYWdlID0gZmluZF9nZXRfcGFnZShpbm9kZS0+aV9tYXBwaW5nLCBwbnVtKTsKLQkJaWYgKHBhZ2UgIT0gTlVMTCkgewotCQkJQ2xlYXJQYWdlVXB0b2RhdGUocGFnZSk7Ci0JCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JCX0KLQotCQkvKiBTZXQgYml0bWFwIHBhZ2UgYXMgbm90IHVwIHRvIGRhdGUgKi8KLQkJYmxvY2srKzsKLQkJcG51bSA9IGJsb2NrIC8gYmxvY2tzX3Blcl9wYWdlOwotCQlwYWdlID0gZmluZF9nZXRfcGFnZShpbm9kZS0+aV9tYXBwaW5nLCBwbnVtKTsKLQkJaWYgKHBhZ2UgIT0gTlVMTCkgewotCQkJQ2xlYXJQYWdlVXB0b2RhdGUocGFnZSk7Ci0JCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JCX0KLQotCQkvKiBHZXQgdGhlIGluZm8gb24gdGhlIGxhc3QgZ3JvdXAgKi8KLQkJZ3JwID0gZXh0NF9nZXRfZ3JvdXBfaW5mbyhzYiwgZ3JvdXApOwotCi0JCS8qIFVwZGF0ZSBmcmVlIGJsb2NrcyBpbiBncm91cCBpbmZvICovCi0JCWV4dDRfbWJfdXBkYXRlX2dyb3VwX2luZm8oZ3JwLCBhZGQpOwotCX0KLQogCWlmICh0ZXN0X29wdChzYiwgREVCVUcpKQogCQlwcmludGsoS0VSTl9ERUJVRyAiRVhUNC1mczogZXh0ZW5kZWQgZ3JvdXAgdG8gJWxsdSBibG9ja3NcbiIsCiAJCSAgICAgICBleHQ0X2Jsb2Nrc19jb3VudChlcykpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9zdXBlci5jIGIvZnMvZXh0NC9zdXBlci5jCmluZGV4IDA0MTU4YWQuLjhmN2UwYmUgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvc3VwZXIuYworKysgYi9mcy9leHQ0L3N1cGVyLmMKQEAgLTUxLDggKzUxLDYgQEAKIAogc3RhdGljIGludCBleHQ0X2xvYWRfam91cm5hbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKiwKIAkJCSAgICAgdW5zaWduZWQgbG9uZyBqb3VybmFsX2Rldm51bSk7Ci1zdGF0aWMgaW50IGV4dDRfY3JlYXRlX2pvdXJuYWwoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICosCi0JCQkgICAgICAgdW5zaWduZWQgaW50KTsKIHN0YXRpYyB2b2lkIGV4dDRfY29tbWl0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQkgICAgICBzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXMsIGludCBzeW5jKTsKIHN0YXRpYyB2b2lkIGV4dDRfbWFya19yZWNvdmVyeV9jb21wbGV0ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLApAQCAtOTMsNiArOTEsMzggQEAKIAkJKGV4dDRfZnNibGtfdClsZTMyX3RvX2NwdShiZy0+YmdfaW5vZGVfdGFibGVfaGkpIDw8IDMyIDogMCk7CiB9CiAKK19fdTMyIGV4dDRfZnJlZV9ibGtzX2NvdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkgICAgICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZykKK3sKKwlyZXR1cm4gbGUxNl90b19jcHUoYmctPmJnX2ZyZWVfYmxvY2tzX2NvdW50X2xvKSB8CisJCShFWFQ0X0RFU0NfU0laRShzYikgPj0gRVhUNF9NSU5fREVTQ19TSVpFXzY0QklUID8KKwkJKF9fdTMyKWxlMTZfdG9fY3B1KGJnLT5iZ19mcmVlX2Jsb2Nrc19jb3VudF9oaSkgPDwgMTYgOiAwKTsKK30KKworX191MzIgZXh0NF9mcmVlX2lub2Rlc19jb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJICAgICAgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqYmcpCit7CisJcmV0dXJuIGxlMTZfdG9fY3B1KGJnLT5iZ19mcmVlX2lub2Rlc19jb3VudF9sbykgfAorCQkoRVhUNF9ERVNDX1NJWkUoc2IpID49IEVYVDRfTUlOX0RFU0NfU0laRV82NEJJVCA/CisJCShfX3UzMilsZTE2X3RvX2NwdShiZy0+YmdfZnJlZV9pbm9kZXNfY291bnRfaGkpIDw8IDE2IDogMCk7Cit9CisKK19fdTMyIGV4dDRfdXNlZF9kaXJzX2NvdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkgICAgICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZykKK3sKKwlyZXR1cm4gbGUxNl90b19jcHUoYmctPmJnX3VzZWRfZGlyc19jb3VudF9sbykgfAorCQkoRVhUNF9ERVNDX1NJWkUoc2IpID49IEVYVDRfTUlOX0RFU0NfU0laRV82NEJJVCA/CisJCShfX3UzMilsZTE2X3RvX2NwdShiZy0+YmdfdXNlZF9kaXJzX2NvdW50X2hpKSA8PCAxNiA6IDApOworfQorCitfX3UzMiBleHQ0X2l0YWJsZV91bnVzZWRfY291bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCSAgICAgIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmJnKQoreworCXJldHVybiBsZTE2X3RvX2NwdShiZy0+YmdfaXRhYmxlX3VudXNlZF9sbykgfAorCQkoRVhUNF9ERVNDX1NJWkUoc2IpID49IEVYVDRfTUlOX0RFU0NfU0laRV82NEJJVCA/CisJCShfX3UzMilsZTE2X3RvX2NwdShiZy0+YmdfaXRhYmxlX3VudXNlZF9oaSkgPDwgMTYgOiAwKTsKK30KKwogdm9pZCBleHQ0X2Jsb2NrX2JpdG1hcF9zZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCSAgIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmJnLCBleHQ0X2ZzYmxrX3QgYmxrKQogewpAQCAtMTE3LDYgKzE0NywzOCBAQAogCQliZy0+YmdfaW5vZGVfdGFibGVfaGkgPSBjcHVfdG9fbGUzMihibGsgPj4gMzIpOwogfQogCit2b2lkIGV4dDRfZnJlZV9ibGtzX3NldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZywgX191MzIgY291bnQpCit7CisJYmctPmJnX2ZyZWVfYmxvY2tzX2NvdW50X2xvID0gY3B1X3RvX2xlMTYoKF9fdTE2KWNvdW50KTsKKwlpZiAoRVhUNF9ERVNDX1NJWkUoc2IpID49IEVYVDRfTUlOX0RFU0NfU0laRV82NEJJVCkKKwkJYmctPmJnX2ZyZWVfYmxvY2tzX2NvdW50X2hpID0gY3B1X3RvX2xlMTYoY291bnQgPj4gMTYpOworfQorCit2b2lkIGV4dDRfZnJlZV9pbm9kZXNfc2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkgIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmJnLCBfX3UzMiBjb3VudCkKK3sKKwliZy0+YmdfZnJlZV9pbm9kZXNfY291bnRfbG8gPSBjcHVfdG9fbGUxNigoX191MTYpY291bnQpOworCWlmIChFWFQ0X0RFU0NfU0laRShzYikgPj0gRVhUNF9NSU5fREVTQ19TSVpFXzY0QklUKQorCQliZy0+YmdfZnJlZV9pbm9kZXNfY291bnRfaGkgPSBjcHVfdG9fbGUxNihjb3VudCA+PiAxNik7Cit9CisKK3ZvaWQgZXh0NF91c2VkX2RpcnNfc2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkgIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmJnLCBfX3UzMiBjb3VudCkKK3sKKwliZy0+YmdfdXNlZF9kaXJzX2NvdW50X2xvID0gY3B1X3RvX2xlMTYoKF9fdTE2KWNvdW50KTsKKwlpZiAoRVhUNF9ERVNDX1NJWkUoc2IpID49IEVYVDRfTUlOX0RFU0NfU0laRV82NEJJVCkKKwkJYmctPmJnX3VzZWRfZGlyc19jb3VudF9oaSA9IGNwdV90b19sZTE2KGNvdW50ID4+IDE2KTsKK30KKwordm9pZCBleHQ0X2l0YWJsZV91bnVzZWRfc2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkgIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmJnLCBfX3UzMiBjb3VudCkKK3sKKwliZy0+YmdfaXRhYmxlX3VudXNlZF9sbyA9IGNwdV90b19sZTE2KChfX3UxNiljb3VudCk7CisJaWYgKEVYVDRfREVTQ19TSVpFKHNiKSA+PSBFWFQ0X01JTl9ERVNDX1NJWkVfNjRCSVQpCisJCWJnLT5iZ19pdGFibGVfdW51c2VkX2hpID0gY3B1X3RvX2xlMTYoY291bnQgPj4gMTYpOworfQorCiAvKgogICogV3JhcHBlcnMgZm9yIGpiZDJfam91cm5hbF9zdGFydC9lbmQuCiAgKgpAQCAtMTM2LDEzICsxOTgsMTkgQEAKIAkgKiBiYWNrcyAoZWcuIEVJTyBpbiB0aGUgY29tbWl0IHRocmVhZCksIHRoZW4gd2Ugc3RpbGwgbmVlZCB0bwogCSAqIHRha2UgdGhlIEZTIGl0c2VsZiByZWFkb25seSBjbGVhbmx5LiAqLwogCWpvdXJuYWwgPSBFWFQ0X1NCKHNiKS0+c19qb3VybmFsOwotCWlmIChpc19qb3VybmFsX2Fib3J0ZWQoam91cm5hbCkpIHsKLQkJZXh0NF9hYm9ydChzYiwgX19mdW5jX18sCi0JCQkgICAiRGV0ZWN0ZWQgYWJvcnRlZCBqb3VybmFsIik7Ci0JCXJldHVybiBFUlJfUFRSKC1FUk9GUyk7CisJaWYgKGpvdXJuYWwpIHsKKwkJaWYgKGlzX2pvdXJuYWxfYWJvcnRlZChqb3VybmFsKSkgeworCQkJZXh0NF9hYm9ydChzYiwgX19mdW5jX18sCisJCQkJICAgIkRldGVjdGVkIGFib3J0ZWQgam91cm5hbCIpOworCQkJcmV0dXJuIEVSUl9QVFIoLUVST0ZTKTsKKwkJfQorCQlyZXR1cm4gamJkMl9qb3VybmFsX3N0YXJ0KGpvdXJuYWwsIG5ibG9ja3MpOwogCX0KLQotCXJldHVybiBqYmQyX2pvdXJuYWxfc3RhcnQoam91cm5hbCwgbmJsb2Nrcyk7CisJLyoKKwkgKiBXZSdyZSBub3Qgam91cm5hbGluZywgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBpbmRpY2F0aW9uLgorCSAqLworCWN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IEVYVDRfTk9KT1VSTkFMX0hBTkRMRTsKKwlyZXR1cm4gY3VycmVudC0+am91cm5hbF9pbmZvOwogfQogCiAvKgpAQCAtMTU3LDYgKzIyNSwxNCBAQAogCWludCBlcnI7CiAJaW50IHJjOwogCisJaWYgKCFleHQ0X2hhbmRsZV92YWxpZChoYW5kbGUpKSB7CisJCS8qCisJCSAqIERvIHRoaXMgaGVyZSBzaW5jZSB3ZSBkb24ndCBjYWxsIGpiZDJfam91cm5hbF9zdG9wKCkgaW4KKwkJICogbm8tam91cm5hbCBtb2RlLgorCQkgKi8KKwkJY3VycmVudC0+am91cm5hbF9pbmZvID0gTlVMTDsKKwkJcmV0dXJuIDA7CisJfQogCXNiID0gaGFuZGxlLT5oX3RyYW5zYWN0aW9uLT50X2pvdXJuYWwtPmpfcHJpdmF0ZTsKIAllcnIgPSBoYW5kbGUtPmhfZXJyOwogCXJjID0gamJkMl9qb3VybmFsX3N0b3AoaGFuZGxlKTsKQEAgLTE3NCw2ICsyNTAsOCBAQAogCWNoYXIgbmJ1ZlsxNl07CiAJY29uc3QgY2hhciAqZXJyc3RyID0gZXh0NF9kZWNvZGVfZXJyb3IoTlVMTCwgZXJyLCBuYnVmKTsKIAorCUJVR19PTighZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSk7CisKIAlpZiAoYmgpCiAJCUJVRkZFUl9UUkFDRShiaCwgImFib3J0Iik7CiAKQEAgLTM1MCw2ICs0MjgsNDQgQEAKIAl2YV9lbmQoYXJncyk7CiB9CiAKK3ZvaWQgZXh0NF9ncnBfbG9ja2VkX2Vycm9yKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGV4dDRfZ3JvdXBfdCBncnAsCisJCQkJY29uc3QgY2hhciAqZnVuY3Rpb24sIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQorX19yZWxlYXNlcyhiaXRsb2NrKQorX19hY3F1aXJlcyhiaXRsb2NrKQoreworCXZhX2xpc3QgYXJnczsKKwlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXMgPSBFWFQ0X1NCKHNiKS0+c19lczsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJcHJpbnRrKEtFUk5fQ1JJVCAiRVhUNC1mcyBlcnJvciAoZGV2aWNlICVzKTogJXM6ICIsIHNiLT5zX2lkLCBmdW5jdGlvbik7CisJdnByaW50ayhmbXQsIGFyZ3MpOworCXByaW50aygiXG4iKTsKKwl2YV9lbmQoYXJncyk7CisKKwlpZiAodGVzdF9vcHQoc2IsIEVSUk9SU19DT05UKSkgeworCQlFWFQ0X1NCKHNiKS0+c19tb3VudF9zdGF0ZSB8PSBFWFQ0X0VSUk9SX0ZTOworCQllcy0+c19zdGF0ZSB8PSBjcHVfdG9fbGUxNihFWFQ0X0VSUk9SX0ZTKTsKKwkJZXh0NF9jb21taXRfc3VwZXIoc2IsIGVzLCAwKTsKKwkJcmV0dXJuOworCX0KKwlleHQ0X3VubG9ja19ncm91cChzYiwgZ3JwKTsKKwlleHQ0X2hhbmRsZV9lcnJvcihzYik7CisJLyoKKwkgKiBXZSBvbmx5IGdldCBoZXJlIGluIHRoZSBFUlJPUlNfUk8gY2FzZTsgcmVsb2NraW5nIHRoZSBncm91cAorCSAqIG1heSBiZSBkYW5nZXJvdXMsIGJ1dCBub3RoaW5nIGJhZCB3aWxsIGhhcHBlbiBzaW5jZSB0aGUKKwkgKiBmaWxlc3lzdGVtIHdpbGwgaGF2ZSBhbHJlYWR5IGJlZW4gbWFya2VkIHJlYWQvb25seSBhbmQgdGhlCisJICogam91cm5hbCBoYXMgYmVlbiBhYm9ydGVkLiAgV2UgcmV0dXJuIDEgYXMgYSBoaW50IHRvIGNhbGxlcnMKKwkgKiB3aG8gbWlnaHQgd2hhdCB0byB1c2UgdGhlIHJldHVybiB2YWx1ZSBmcm9tCisJICogZXh0NF9ncnBfbG9ja2VkX2Vycm9yKCkgdG8gZGlzdGluZ3Vpc2ggYmV3ZWVuIHRoZQorCSAqIEVSUk9SU19DT05UIGFuZCBFUlJPUlNfUk8gY2FzZSwgYW5kIHBlcmhhcHMgcmV0dXJuIG1vcmUKKwkgKiBhZ2dyZXNzaXZlbHkgZnJvbSB0aGUgZXh0NCBmdW5jdGlvbiBpbiBxdWVzdGlvbiwgd2l0aCBhCisJICogbW9yZSBhcHByb3ByaWF0ZSBlcnJvciBjb2RlLgorCSAqLworCWV4dDRfbG9ja19ncm91cChzYiwgZ3JwKTsKKwlyZXR1cm47Cit9CisKKwogdm9pZCBleHQ0X3VwZGF0ZV9keW5hbWljX3JldihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCXN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICplcyA9IEVYVDRfU0Ioc2IpLT5zX2VzOwpAQCAtMzg5LDcgKzUwNSw3IEBACiAJcmV0dXJuIGJkZXY7CiAKIGZhaWw6Ci0JcHJpbnRrKEtFUk5fRVJSICJFWFQ0OiBmYWlsZWQgdG8gb3BlbiBqb3VybmFsIGRldmljZSAlczogJWxkXG4iLAorCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogZmFpbGVkIHRvIG9wZW4gam91cm5hbCBkZXZpY2UgJXM6ICVsZFxuIiwKIAkJCV9fYmRldm5hbWUoZGV2LCBiKSwgUFRSX0VSUihiZGV2KSk7CiAJcmV0dXJuIE5VTEw7CiB9CkBAIC00NDgsMTEgKzU2NCwxMyBAQAogCWV4dDRfbWJfcmVsZWFzZShzYik7CiAJZXh0NF9leHRfcmVsZWFzZShzYik7CiAJZXh0NF94YXR0cl9wdXRfc3VwZXIoc2IpOwotCWVyciA9IGpiZDJfam91cm5hbF9kZXN0cm95KHNiaS0+c19qb3VybmFsKTsKLQlzYmktPnNfam91cm5hbCA9IE5VTEw7Ci0JaWYgKGVyciA8IDApCi0JCWV4dDRfYWJvcnQoc2IsIF9fZnVuY19fLCAiQ291bGRuJ3QgY2xlYW4gdXAgdGhlIGpvdXJuYWwiKTsKLQorCWlmIChzYmktPnNfam91cm5hbCkgeworCQllcnIgPSBqYmQyX2pvdXJuYWxfZGVzdHJveShzYmktPnNfam91cm5hbCk7CisJCXNiaS0+c19qb3VybmFsID0gTlVMTDsKKwkJaWYgKGVyciA8IDApCisJCQlleHQ0X2Fib3J0KHNiLCBfX2Z1bmNfXywKKwkJCQkgICAiQ291bGRuJ3QgY2xlYW4gdXAgdGhlIGpvdXJuYWwiKTsKKwl9CiAJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CiAJCUVYVDRfQ0xFQVJfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIpOwogCQllcy0+c19zdGF0ZSA9IGNwdV90b19sZTE2KHNiaS0+c19tb3VudF9zdGF0ZSk7CkBAIC01MjIsNiArNjQwLDExIEBACiAJbWVtc2V0KCZlaS0+aV9jYWNoZWRfZXh0ZW50LCAwLCBzaXplb2Yoc3RydWN0IGV4dDRfZXh0X2NhY2hlKSk7CiAJSU5JVF9MSVNUX0hFQUQoJmVpLT5pX3ByZWFsbG9jX2xpc3QpOwogCXNwaW5fbG9ja19pbml0KCZlaS0+aV9wcmVhbGxvY19sb2NrKTsKKwkvKgorCSAqIE5vdGU6ICBXZSBjYW4gYmUgY2FsbGVkIGJlZm9yZSBFWFQ0X1NCKHNiKS0+c19qb3VybmFsIGlzIHNldCwKKwkgKiB0aGVyZWZvcmUgaXQgY2FuIGJlIG51bGwgaGVyZS4gIERvbid0IGNoZWNrIGl0LCBqdXN0IGluaXRpYWxpemUKKwkgKiBqaW5vZGUuCisJICovCiAJamJkMl9qb3VybmFsX2luaXRfamJkX2lub2RlKCZlaS0+amlub2RlLCAmZWktPnZmc19pbm9kZSk7CiAJZWktPmlfcmVzZXJ2ZWRfZGF0YV9ibG9ja3MgPSAwOwogCWVpLT5pX3Jlc2VydmVkX21ldGFfYmxvY2tzID0gMDsKQEAgLTU4OCw3ICs3MTEsOCBAQAogCX0KICNlbmRpZgogCWV4dDRfZGlzY2FyZF9wcmVhbGxvY2F0aW9ucyhpbm9kZSk7Ci0JamJkMl9qb3VybmFsX3JlbGVhc2VfamJkX2lub2RlKEVYVDRfU0IoaW5vZGUtPmlfc2IpLT5zX2pvdXJuYWwsCisJaWYgKEVYVDRfSk9VUk5BTChpbm9kZSkpCisJCWpiZDJfam91cm5hbF9yZWxlYXNlX2piZF9pbm9kZShFWFQ0X1NCKGlub2RlLT5pX3NiKS0+c19qb3VybmFsLAogCQkJCSAgICAgICAmRVhUNF9JKGlub2RlKS0+amlub2RlKTsKIH0KIApAQCAtNjgxLDEwICs4MDUsMTkgQEAKICNlbmRpZgogCWlmICghdGVzdF9vcHQoc2IsIFJFU0VSVkFUSU9OKSkKIAkJc2VxX3B1dHMoc2VxLCAiLG5vcmVzZXJ2YXRpb24iKTsKLQlpZiAoc2JpLT5zX2NvbW1pdF9pbnRlcnZhbCkgeworCWlmIChzYmktPnNfY29tbWl0X2ludGVydmFsICE9IEpCRDJfREVGQVVMVF9NQVhfQ09NTUlUX0FHRSpIWikgewogCQlzZXFfcHJpbnRmKHNlcSwgIixjb21taXQ9JXUiLAogCQkJICAgKHVuc2lnbmVkKSAoc2JpLT5zX2NvbW1pdF9pbnRlcnZhbCAvIEhaKSk7CiAJfQorCWlmIChzYmktPnNfbWluX2JhdGNoX3RpbWUgIT0gRVhUNF9ERUZfTUlOX0JBVENIX1RJTUUpIHsKKwkJc2VxX3ByaW50ZihzZXEsICIsbWluX2JhdGNoX3RpbWU9JXUiLAorCQkJICAgKHVuc2lnbmVkKSBzYmktPnNfbWluX2JhdGNoX3RpbWUpOworCX0KKwlpZiAoc2JpLT5zX21heF9iYXRjaF90aW1lICE9IEVYVDRfREVGX01BWF9CQVRDSF9USU1FKSB7CisJCXNlcV9wcmludGYoc2VxLCAiLG1heF9iYXRjaF90aW1lPSV1IiwKKwkJCSAgICh1bnNpZ25lZCkgc2JpLT5zX21pbl9iYXRjaF90aW1lKTsKKwl9CisKIAkvKgogCSAqIFdlJ3JlIGNoYW5naW5nIHRoZSBkZWZhdWx0IG9mIGJhcnJpZXIgbW91bnQgb3B0aW9uLCBzbwogCSAqIGxldCdzIGFsd2F5cyBkaXNwbGF5IGl0cyBtb3VudCBzdGF0ZSBzbyBpdCdzIGNsZWFyIHdoYXQgaXRzCkBAIC02OTYsOCArODI5LDYgQEAKIAkJc2VxX3B1dHMoc2VxLCAiLGpvdXJuYWxfYXN5bmNfY29tbWl0Iik7CiAJaWYgKHRlc3Rfb3B0KHNiLCBOT0JIKSkKIAkJc2VxX3B1dHMoc2VxLCAiLG5vYmgiKTsKLQlpZiAoIXRlc3Rfb3B0KHNiLCBFWFRFTlRTKSkKLQkJc2VxX3B1dHMoc2VxLCAiLG5vZXh0ZW50cyIpOwogCWlmICh0ZXN0X29wdChzYiwgSV9WRVJTSU9OKSkKIAkJc2VxX3B1dHMoc2VxLCAiLGlfdmVyc2lvbiIpOwogCWlmICghdGVzdF9vcHQoc2IsIERFTEFMTE9DKSkKQEAgLTc3Miw2ICs5MDMsMjUgQEAKIAkJCQkgICAgZXh0NF9uZnNfZ2V0X2lub2RlKTsKIH0KIAorLyoKKyAqIFRyeSB0byByZWxlYXNlIG1ldGFkYXRhIHBhZ2VzIChpbmRpcmVjdCBibG9ja3MsIGRpcmVjdG9yaWVzKSB3aGljaCBhcmUKKyAqIG1hcHBlZCB2aWEgdGhlIGJsb2NrIGRldmljZS4gIFNpbmNlIHRoZXNlIHBhZ2VzIGNvdWxkIGhhdmUgam91cm5hbCBoZWFkcworICogd2hpY2ggd291bGQgcHJldmVudCB0cnlfdG9fZnJlZV9idWZmZXJzKCkgZnJvbSBmcmVlaW5nIHRoZW0sIHdlIG11c3QgdXNlCisgKiBqYmQyIGxheWVyJ3MgdHJ5X3RvX2ZyZWVfYnVmZmVycygpIGZ1bmN0aW9uIHRvIHJlbGVhc2UgdGhlbS4KKyAqLworc3RhdGljIGludCBiZGV2X3RyeV90b19mcmVlX3BhZ2Uoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IHBhZ2UgKnBhZ2UsIGdmcF90IHdhaXQpCit7CisJam91cm5hbF90ICpqb3VybmFsID0gRVhUNF9TQihzYiktPnNfam91cm5hbDsKKworCVdBUk5fT04oUGFnZUNoZWNrZWQocGFnZSkpOworCWlmICghcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkKKwkJcmV0dXJuIDA7CisJaWYgKGpvdXJuYWwpCisJCXJldHVybiBqYmQyX2pvdXJuYWxfdHJ5X3RvX2ZyZWVfYnVmZmVycyhqb3VybmFsLCBwYWdlLAorCQkJCQkJCXdhaXQgJiB+X19HRlBfV0FJVCk7CisJcmV0dXJuIHRyeV90b19mcmVlX2J1ZmZlcnMocGFnZSk7Cit9CisKICNpZmRlZiBDT05GSUdfUVVPVEEKICNkZWZpbmUgUVRZUEUyTkFNRSh0KSAoKHQpID09IFVTUlFVT1RBID8gInVzZXIiIDogImdyb3VwIikKICNkZWZpbmUgUVRZUEUyTU9QVChvbiwgdCkgKCh0KSA9PSBVU1JRVU9UQT8oKG9uKSMjVVNSSlFVT1RBKTooKG9uKSMjR1JQSlFVT1RBKSkKQEAgLTgwMyw3ICs5NTMsOSBAQAogCS5hY3F1aXJlX2RxdW90CT0gZXh0NF9hY3F1aXJlX2RxdW90LAogCS5yZWxlYXNlX2RxdW90CT0gZXh0NF9yZWxlYXNlX2RxdW90LAogCS5tYXJrX2RpcnR5CT0gZXh0NF9tYXJrX2RxdW90X2RpcnR5LAotCS53cml0ZV9pbmZvCT0gZXh0NF93cml0ZV9pbmZvCisJLndyaXRlX2luZm8JPSBleHQ0X3dyaXRlX2luZm8sCisJLmFsbG9jX2RxdW90CT0gZHF1b3RfYWxsb2MsCisJLmRlc3Ryb3lfZHF1b3QJPSBkcXVvdF9kZXN0cm95LAogfTsKIAogc3RhdGljIHN0cnVjdCBxdW90YWN0bF9vcHMgZXh0NF9xY3RsX29wZXJhdGlvbnMgPSB7CkBAIC04MzYsNiArOTg4LDcgQEAKIAkucXVvdGFfcmVhZAk9IGV4dDRfcXVvdGFfcmVhZCwKIAkucXVvdGFfd3JpdGUJPSBleHQ0X3F1b3RhX3dyaXRlLAogI2VuZGlmCisJLmJkZXZfdHJ5X3RvX2ZyZWVfcGFnZSA9IGJkZXZfdHJ5X3RvX2ZyZWVfcGFnZSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgZXh0NF9leHBvcnRfb3BzID0gewpAQCAtODUwLDE2ICsxMDAzLDE3IEBACiAJT3B0X25vdWlkMzIsIE9wdF9kZWJ1ZywgT3B0X29sZGFsbG9jLCBPcHRfb3Jsb3YsCiAJT3B0X3VzZXJfeGF0dHIsIE9wdF9ub3VzZXJfeGF0dHIsIE9wdF9hY2wsIE9wdF9ub2FjbCwKIAlPcHRfcmVzZXJ2YXRpb24sIE9wdF9ub3Jlc2VydmF0aW9uLCBPcHRfbm9sb2FkLCBPcHRfbm9iaCwgT3B0X2JoLAotCU9wdF9jb21taXQsIE9wdF9qb3VybmFsX3VwZGF0ZSwgT3B0X2pvdXJuYWxfaW51bSwgT3B0X2pvdXJuYWxfZGV2LAorCU9wdF9jb21taXQsIE9wdF9taW5fYmF0Y2hfdGltZSwgT3B0X21heF9iYXRjaF90aW1lLAorCU9wdF9qb3VybmFsX3VwZGF0ZSwgT3B0X2pvdXJuYWxfZGV2LAogCU9wdF9qb3VybmFsX2NoZWNrc3VtLCBPcHRfam91cm5hbF9hc3luY19jb21taXQsCiAJT3B0X2Fib3J0LCBPcHRfZGF0YV9qb3VybmFsLCBPcHRfZGF0YV9vcmRlcmVkLCBPcHRfZGF0YV93cml0ZWJhY2ssCiAJT3B0X2RhdGFfZXJyX2Fib3J0LCBPcHRfZGF0YV9lcnJfaWdub3JlLAogCU9wdF91c3JqcXVvdGEsIE9wdF9ncnBqcXVvdGEsIE9wdF9vZmZ1c3JqcXVvdGEsIE9wdF9vZmZncnBqcXVvdGEsCiAJT3B0X2pxZm10X3Zmc29sZCwgT3B0X2pxZm10X3Zmc3YwLCBPcHRfcXVvdGEsIE9wdF9ub3F1b3RhLAogCU9wdF9pZ25vcmUsIE9wdF9iYXJyaWVyLCBPcHRfZXJyLCBPcHRfcmVzaXplLCBPcHRfdXNycXVvdGEsCi0JT3B0X2dycHF1b3RhLCBPcHRfZXh0ZW50cywgT3B0X25vZXh0ZW50cywgT3B0X2lfdmVyc2lvbiwKKwlPcHRfZ3JwcXVvdGEsIE9wdF9pX3ZlcnNpb24sCiAJT3B0X3N0cmlwZSwgT3B0X2RlbGFsbG9jLCBPcHRfbm9kZWxhbGxvYywKLQlPcHRfaW5vZGVfcmVhZGFoZWFkX2Jsa3MKKwlPcHRfaW5vZGVfcmVhZGFoZWFkX2Jsa3MsIE9wdF9qb3VybmFsX2lvcHJpbwogfTsKIAogc3RhdGljIGNvbnN0IG1hdGNoX3RhYmxlX3QgdG9rZW5zID0gewpAQCAtODg5LDggKzEwNDMsOSBAQAogCXtPcHRfbm9iaCwgIm5vYmgifSwKIAl7T3B0X2JoLCAiYmgifSwKIAl7T3B0X2NvbW1pdCwgImNvbW1pdD0ldSJ9LAorCXtPcHRfbWluX2JhdGNoX3RpbWUsICJtaW5fYmF0Y2hfdGltZT0ldSJ9LAorCXtPcHRfbWF4X2JhdGNoX3RpbWUsICJtYXhfYmF0Y2hfdGltZT0ldSJ9LAogCXtPcHRfam91cm5hbF91cGRhdGUsICJqb3VybmFsPXVwZGF0ZSJ9LAotCXtPcHRfam91cm5hbF9pbnVtLCAiam91cm5hbD0ldSJ9LAogCXtPcHRfam91cm5hbF9kZXYsICJqb3VybmFsX2Rldj0ldSJ9LAogCXtPcHRfam91cm5hbF9jaGVja3N1bSwgImpvdXJuYWxfY2hlY2tzdW0ifSwKIAl7T3B0X2pvdXJuYWxfYXN5bmNfY29tbWl0LCAiam91cm5hbF9hc3luY19jb21taXQifSwKQEAgLTkxMSwxNCArMTA2NiwxMyBAQAogCXtPcHRfcXVvdGEsICJxdW90YSJ9LAogCXtPcHRfdXNycXVvdGEsICJ1c3JxdW90YSJ9LAogCXtPcHRfYmFycmllciwgImJhcnJpZXI9JXUifSwKLQl7T3B0X2V4dGVudHMsICJleHRlbnRzIn0sCi0Je09wdF9ub2V4dGVudHMsICJub2V4dGVudHMifSwKIAl7T3B0X2lfdmVyc2lvbiwgImlfdmVyc2lvbiJ9LAogCXtPcHRfc3RyaXBlLCAic3RyaXBlPSV1In0sCiAJe09wdF9yZXNpemUsICJyZXNpemUifSwKIAl7T3B0X2RlbGFsbG9jLCAiZGVsYWxsb2MifSwKIAl7T3B0X25vZGVsYWxsb2MsICJub2RlbGFsbG9jIn0sCiAJe09wdF9pbm9kZV9yZWFkYWhlYWRfYmxrcywgImlub2RlX3JlYWRhaGVhZF9ibGtzPSV1In0sCisJe09wdF9qb3VybmFsX2lvcHJpbywgImpvdXJuYWxfaW9wcmlvPSV1In0sCiAJe09wdF9lcnIsIE5VTEx9LAogfTsKIApAQCAtOTQzLDggKzEwOTcsMTEgQEAKIAlyZXR1cm4gc2JfYmxvY2s7CiB9CiAKKyNkZWZpbmUgREVGQVVMVF9KT1VSTkFMX0lPUFJJTyAoSU9QUklPX1BSSU9fVkFMVUUoSU9QUklPX0NMQVNTX0JFLCAzKSkKKwogc3RhdGljIGludCBwYXJzZV9vcHRpb25zKGNoYXIgKm9wdGlvbnMsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCi0JCQkgdW5zaWduZWQgaW50ICppbnVtLCB1bnNpZ25lZCBsb25nICpqb3VybmFsX2Rldm51bSwKKwkJCSB1bnNpZ25lZCBsb25nICpqb3VybmFsX2Rldm51bSwKKwkJCSB1bnNpZ25lZCBpbnQgKmpvdXJuYWxfaW9wcmlvLAogCQkJIGV4dDRfZnNibGtfdCAqbl9ibG9ja3NfY291bnQsIGludCBpc19yZW1vdW50KQogewogCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpOwpAQCAtOTU2LDcgKzExMTMsNiBAQAogCWludCBxdHlwZSwgcWZtdDsKIAljaGFyICpxbmFtZTsKICNlbmRpZgotCWV4dDRfZnNibGtfdCBsYXN0X2Jsb2NrOwogCiAJaWYgKCFvcHRpb25zKQogCQlyZXR1cm4gMTsKQEAgLTEwNjgsMTYgKzEyMjQsNiBAQAogCQkJfQogCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBVUERBVEVfSk9VUk5BTCk7CiAJCQlicmVhazsKLQkJY2FzZSBPcHRfam91cm5hbF9pbnVtOgotCQkJaWYgKGlzX3JlbW91bnQpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGNhbm5vdCBzcGVjaWZ5ICIKLQkJCQkgICAgICAgImpvdXJuYWwgb24gcmVtb3VudFxuIik7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKLQkJCQlyZXR1cm4gMDsKLQkJCSppbnVtID0gb3B0aW9uOwotCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2pvdXJuYWxfZGV2OgogCQkJaWYgKGlzX3JlbW91bnQpIHsKIAkJCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGNhbm5vdCBzcGVjaWZ5ICIKQEAgLTExMDcsNiArMTI1MywyMiBAQAogCQkJCW9wdGlvbiA9IEpCRDJfREVGQVVMVF9NQVhfQ09NTUlUX0FHRTsKIAkJCXNiaS0+c19jb21taXRfaW50ZXJ2YWwgPSBIWiAqIG9wdGlvbjsKIAkJCWJyZWFrOworCQljYXNlIE9wdF9tYXhfYmF0Y2hfdGltZToKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQorCQkJCXJldHVybiAwOworCQkJaWYgKG9wdGlvbiA8IDApCisJCQkJcmV0dXJuIDA7CisJCQlpZiAob3B0aW9uID09IDApCisJCQkJb3B0aW9uID0gRVhUNF9ERUZfTUFYX0JBVENIX1RJTUU7CisJCQlzYmktPnNfbWF4X2JhdGNoX3RpbWUgPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbWluX2JhdGNoX3RpbWU6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMDsKKwkJCWlmIChvcHRpb24gPCAwKQorCQkJCXJldHVybiAwOworCQkJc2JpLT5zX21pbl9iYXRjaF90aW1lID0gb3B0aW9uOworCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2RhdGFfam91cm5hbDoKIAkJCWRhdGFfb3B0ID0gRVhUNF9NT1VOVF9KT1VSTkFMX0RBVEE7CiAJCQlnb3RvIGRhdGFjaGVjazsKQEAgLTExNDIsOCArMTMwNCw3IEBACiAJCWNhc2UgT3B0X2dycGpxdW90YToKIAkJCXF0eXBlID0gR1JQUVVPVEE7CiBzZXRfcWZfbmFtZToKLQkJCWlmICgoc2JfYW55X3F1b3RhX2VuYWJsZWQoc2IpIHx8Ci0JCQkgICAgIHNiX2FueV9xdW90YV9zdXNwZW5kZWQoc2IpKSAmJgorCQkJaWYgKHNiX2FueV9xdW90YV9sb2FkZWQoc2IpICYmCiAJCQkgICAgIXNiaS0+c19xZl9uYW1lc1txdHlwZV0pIHsKIAkJCQlwcmludGsoS0VSTl9FUlIKIAkJCQkgICAgICAgIkVYVDQtZnM6IENhbm5vdCBjaGFuZ2Ugam91cm5hbGVkICIKQEAgLTExODIsOCArMTM0Myw3IEBACiAJCWNhc2UgT3B0X29mZmdycGpxdW90YToKIAkJCXF0eXBlID0gR1JQUVVPVEE7CiBjbGVhcl9xZl9uYW1lOgotCQkJaWYgKChzYl9hbnlfcXVvdGFfZW5hYmxlZChzYikgfHwKLQkJCSAgICAgc2JfYW55X3F1b3RhX3N1c3BlbmRlZChzYikpICYmCisJCQlpZiAoc2JfYW55X3F1b3RhX2xvYWRlZChzYikgJiYKIAkJCSAgICBzYmktPnNfcWZfbmFtZXNbcXR5cGVdKSB7CiAJCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBDYW5ub3QgY2hhbmdlICIKIAkJCQkJImpvdXJuYWxlZCBxdW90YSBvcHRpb25zIHdoZW4gIgpAQCAtMTIwMiw4ICsxMzYyLDcgQEAKIAkJY2FzZSBPcHRfanFmbXRfdmZzdjA6CiAJCQlxZm10ID0gUUZNVF9WRlNfVjA7CiBzZXRfcWZfZm9ybWF0OgotCQkJaWYgKChzYl9hbnlfcXVvdGFfZW5hYmxlZChzYikgfHwKLQkJCSAgICAgc2JfYW55X3F1b3RhX3N1c3BlbmRlZChzYikpICYmCisJCQlpZiAoc2JfYW55X3F1b3RhX2xvYWRlZChzYikgJiYKIAkJCSAgICBzYmktPnNfanF1b3RhX2ZtdCAhPSBxZm10KSB7CiAJCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBDYW5ub3QgY2hhbmdlICIKIAkJCQkJImpvdXJuYWxlZCBxdW90YSBvcHRpb25zIHdoZW4gIgpAQCAtMTIyMiw3ICsxMzgxLDcgQEAKIAkJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgR1JQUVVPVEEpOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X25vcXVvdGE6Ci0JCQlpZiAoc2JfYW55X3F1b3RhX2VuYWJsZWQoc2IpKSB7CisJCQlpZiAoc2JfYW55X3F1b3RhX2xvYWRlZChzYikpIHsKIAkJCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IENhbm5vdCBjaGFuZ2UgcXVvdGEgIgogCQkJCQkib3B0aW9ucyB3aGVuIHF1b3RhIHR1cm5lZCBvbi5cbiIpOwogCQkJCXJldHVybiAwOwpAQCAtMTI4MCwzMyArMTQzOSw2IEBACiAJCWNhc2UgT3B0X2JoOgogCQkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIE5PQkgpOwogCQkJYnJlYWs7Ci0JCWNhc2UgT3B0X2V4dGVudHM6Ci0JCQlpZiAoIUVYVDRfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsCi0JCQkJCUVYVDRfRkVBVFVSRV9JTkNPTVBBVF9FWFRFTlRTKSkgewotCQkJCWV4dDRfd2FybmluZyhzYiwgX19mdW5jX18sCi0JCQkJCSJleHRlbnRzIGZlYXR1cmUgbm90IGVuYWJsZWQgIgotCQkJCQkib24gdGhpcyBmaWxlc3lzdGVtLCB1c2UgdHVuZTJmc1xuIik7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIEVYVEVOVFMpOwotCQkJYnJlYWs7Ci0JCWNhc2UgT3B0X25vZXh0ZW50czoKLQkJCS8qCi0JCQkgKiBXaGVuIGUyZnNwcm9ncyBzdXBwb3J0IHJlc2l6aW5nIGFuIGFscmVhZHkgZXhpc3RpbmcKLQkJCSAqIGV4dDMgZmlsZSBzeXN0ZW0gdG8gZ3JlYXRlciB0aGFuIDIqKjMyIHdlIG5lZWQgdG8KLQkJCSAqIGFkZCBzdXBwb3J0IHRvIGJsb2NrIGFsbG9jYXRvciB0byBoYW5kbGUgZ3Jvd2luZwotCQkJICogYWxyZWFkeSBleGlzdGluZyBibG9jayAgbWFwcGVkIGlub2RlIHNvIHRoYXQgYmxvY2tzCi0JCQkgKiBhbGxvY2F0ZWQgZm9yIHRoZW0gZmFsbCB3aXRoaW4gMioqMzIKLQkJCSAqLwotCQkJbGFzdF9ibG9jayA9IGV4dDRfYmxvY2tzX2NvdW50KHNiaS0+c19lcykgLSAxOwotCQkJaWYgKGxhc3RfYmxvY2sgID4gMHhmZmZmZmZmZlVMTCkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogRmlsZXN5c3RlbSB0b28gIgotCQkJCQkJImxhcmdlIHRvIG1vdW50IHdpdGggIgotCQkJCQkJIi1vIG5vZXh0ZW50cyBvcHRpb25zXG4iKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBFWFRFTlRTKTsKLQkJCWJyZWFrOwogCQljYXNlIE9wdF9pX3ZlcnNpb246CiAJCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIElfVkVSU0lPTik7CiAJCQlzYi0+c19mbGFncyB8PSBNU19JX1ZFUlNJT047CkBAIC0xMzMxLDYgKzE0NjMsMTQgQEAKIAkJCQlyZXR1cm4gMDsKIAkJCXNiaS0+c19pbm9kZV9yZWFkYWhlYWRfYmxrcyA9IG9wdGlvbjsKIAkJCWJyZWFrOworCQljYXNlIE9wdF9qb3VybmFsX2lvcHJpbzoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQorCQkJCXJldHVybiAwOworCQkJaWYgKG9wdGlvbiA8IDAgfHwgb3B0aW9uID4gNykKKwkJCQlicmVhazsKKwkJCSpqb3VybmFsX2lvcHJpbyA9IElPUFJJT19QUklPX1ZBTFVFKElPUFJJT19DTEFTU19CRSwKKwkJCQkJCQkgICAgb3B0aW9uKTsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcHJpbnRrKEtFUk5fRVJSCiAJCQkgICAgICAgIkVYVDQtZnM6IFVucmVjb2duaXplZCBtb3VudCBvcHRpb24gXCIlc1wiICIKQEAgLTE0MDYsMjQgKzE1NDYsMTkgQEAKIAkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkgICAgICAgIkVYVDQtZnMgd2FybmluZzogY2hlY2t0aW1lIHJlYWNoZWQsICIKIAkJICAgICAgICJydW5uaW5nIGUyZnNjayBpcyByZWNvbW1lbmRlZFxuIik7Ci0jaWYgMAotCQkvKiBAQEAgV2UgX3dpbGxfIHdhbnQgdG8gY2xlYXIgdGhlIHZhbGlkIGJpdCBpZiB3ZSBmaW5kCi0JCSAqIGluY29uc2lzdGVuY2llcywgdG8gZm9yY2UgYSBmc2NrIGF0IHJlYm9vdC4gIEJ1dCBmb3IKLQkJICogYSBwbGFpbiBqb3VybmFsZWQgZmlsZXN5c3RlbSB3ZSBjYW4ga2VlcCBpdCBzZXQgYXMKLQkJICogdmFsaWQgZm9yZXZlciEgOikKLQkJICovCi0JZXMtPnNfc3RhdGUgJj0gY3B1X3RvX2xlMTYofkVYVDRfVkFMSURfRlMpOwotI2VuZGlmCisJaWYgKCFzYmktPnNfam91cm5hbCkgCisJCWVzLT5zX3N0YXRlICY9IGNwdV90b19sZTE2KH5FWFQ0X1ZBTElEX0ZTKTsKIAlpZiAoIShfX3MxNikgbGUxNl90b19jcHUoZXMtPnNfbWF4X21udF9jb3VudCkpCiAJCWVzLT5zX21heF9tbnRfY291bnQgPSBjcHVfdG9fbGUxNihFWFQ0X0RGTF9NQVhfTU5UX0NPVU5UKTsKIAlsZTE2X2FkZF9jcHUoJmVzLT5zX21udF9jb3VudCwgMSk7CiAJZXMtPnNfbXRpbWUgPSBjcHVfdG9fbGUzMihnZXRfc2Vjb25kcygpKTsKIAlleHQ0X3VwZGF0ZV9keW5hbWljX3JldihzYik7Ci0JRVhUNF9TRVRfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIpOworCWlmIChzYmktPnNfam91cm5hbCkKKwkJRVhUNF9TRVRfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIpOwogCiAJZXh0NF9jb21taXRfc3VwZXIoc2IsIGVzLCAxKTsKIAlpZiAodGVzdF9vcHQoc2IsIERFQlVHKSkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiW0VYVDQgRlMgYnM9JWx1LCBnYz0lbHUsICIKKwkJcHJpbnRrKEtFUk5fSU5GTyAiW0VYVDQgRlMgYnM9JWx1LCBnYz0ldSwgIgogCQkJCSJicGc9JWx1LCBpcGc9JWx1LCBtbz0lMDRseF1cbiIsCiAJCQlzYi0+c19ibG9ja3NpemUsCiAJCQlzYmktPnNfZ3JvdXBzX2NvdW50LApAQCAtMTQzMSw5ICsxNTY2LDEzIEBACiAJCQlFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpLAogCQkJc2JpLT5zX21vdW50X29wdCk7CiAKLQlwcmludGsoS0VSTl9JTkZPICJFWFQ0IEZTIG9uICVzLCAlcyBqb3VybmFsIG9uICVzXG4iLAotCSAgICAgICBzYi0+c19pZCwgRVhUNF9TQihzYiktPnNfam91cm5hbC0+al9pbm9kZSA/ICJpbnRlcm5hbCIgOgotCSAgICAgICAiZXh0ZXJuYWwiLCBFWFQ0X1NCKHNiKS0+c19qb3VybmFsLT5qX2Rldm5hbWUpOworCWlmIChFWFQ0X1NCKHNiKS0+c19qb3VybmFsKSB7CisJCXByaW50ayhLRVJOX0lORk8gIkVYVDQgRlMgb24gJXMsICVzIGpvdXJuYWwgb24gJXNcbiIsCisJCSAgICAgICBzYi0+c19pZCwgRVhUNF9TQihzYiktPnNfam91cm5hbC0+al9pbm9kZSA/ICJpbnRlcm5hbCIgOgorCQkgICAgICAgImV4dGVybmFsIiwgRVhUNF9TQihzYiktPnNfam91cm5hbC0+al9kZXZuYW1lKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPICJFWFQ0IEZTIG9uICVzLCBubyBqb3VybmFsXG4iLCBzYi0+c19pZCk7CisJfQogCXJldHVybiByZXM7CiB9CiAKQEAgLTE0NDUsNyArMTU4NCw2IEBACiAJZXh0NF9ncm91cF90IGZsZXhfZ3JvdXBfY291bnQ7CiAJZXh0NF9ncm91cF90IGZsZXhfZ3JvdXA7CiAJaW50IGdyb3Vwc19wZXJfZmxleCA9IDA7Ci0JX191NjQgYmxvY2tfYml0bWFwID0gMDsKIAlpbnQgaTsKIAogCWlmICghc2JpLT5zX2VzLT5zX2xvZ19ncm91cHNfcGVyX2ZsZXgpIHsKQEAgLTE0NjQsMjEgKzE2MDIsMTggQEAKIAkJCQkgICAgIHNpemVvZihzdHJ1Y3QgZmxleF9ncm91cHMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc2JpLT5zX2ZsZXhfZ3JvdXBzID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBub3QgZW5vdWdoIG1lbW9yeSBmb3IgIgotCQkJCSIlbHUgZmxleCBncm91cHNcbiIsIGZsZXhfZ3JvdXBfY291bnQpOworCQkJCSIldSBmbGV4IGdyb3Vwc1xuIiwgZmxleF9ncm91cF9jb3VudCk7CiAJCWdvdG8gZmFpbGVkOwogCX0KIAotCWdkcCA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2Moc2IsIDEsICZiaCk7Ci0JYmxvY2tfYml0bWFwID0gZXh0NF9ibG9ja19iaXRtYXAoc2IsIGdkcCkgLSAxOwotCiAJZm9yIChpID0gMDsgaSA8IHNiaS0+c19ncm91cHNfY291bnQ7IGkrKykgewogCQlnZHAgPSBleHQ0X2dldF9ncm91cF9kZXNjKHNiLCBpLCAmYmgpOwogCiAJCWZsZXhfZ3JvdXAgPSBleHQ0X2ZsZXhfZ3JvdXAoc2JpLCBpKTsKIAkJc2JpLT5zX2ZsZXhfZ3JvdXBzW2ZsZXhfZ3JvdXBdLmZyZWVfaW5vZGVzICs9Ci0JCQlsZTE2X3RvX2NwdShnZHAtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KTsKKwkJCWV4dDRfZnJlZV9pbm9kZXNfY291bnQoc2IsIGdkcCk7CiAJCXNiaS0+c19mbGV4X2dyb3Vwc1tmbGV4X2dyb3VwXS5mcmVlX2Jsb2NrcyArPQotCQkJbGUxNl90b19jcHUoZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCk7CisJCQlleHQ0X2ZyZWVfYmxrc19jb3VudChzYiwgZ2RwKTsKIAl9CiAKIAlyZXR1cm4gMTsKQEAgLTE1NTIsMTQgKzE2ODcsMTQgQEAKIAkJYmxvY2tfYml0bWFwID0gZXh0NF9ibG9ja19iaXRtYXAoc2IsIGdkcCk7CiAJCWlmIChibG9ja19iaXRtYXAgPCBmaXJzdF9ibG9jayB8fCBibG9ja19iaXRtYXAgPiBsYXN0X2Jsb2NrKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGV4dDRfY2hlY2tfZGVzY3JpcHRvcnM6ICIKLQkJCSAgICAgICAiQmxvY2sgYml0bWFwIGZvciBncm91cCAlbHUgbm90IGluIGdyb3VwICIKKwkJCSAgICAgICAiQmxvY2sgYml0bWFwIGZvciBncm91cCAldSBub3QgaW4gZ3JvdXAgIgogCQkJICAgICAgICIoYmxvY2sgJWxsdSkhXG4iLCBpLCBibG9ja19iaXRtYXApOwogCQkJcmV0dXJuIDA7CiAJCX0KIAkJaW5vZGVfYml0bWFwID0gZXh0NF9pbm9kZV9iaXRtYXAoc2IsIGdkcCk7CiAJCWlmIChpbm9kZV9iaXRtYXAgPCBmaXJzdF9ibG9jayB8fCBpbm9kZV9iaXRtYXAgPiBsYXN0X2Jsb2NrKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGV4dDRfY2hlY2tfZGVzY3JpcHRvcnM6ICIKLQkJCSAgICAgICAiSW5vZGUgYml0bWFwIGZvciBncm91cCAlbHUgbm90IGluIGdyb3VwICIKKwkJCSAgICAgICAiSW5vZGUgYml0bWFwIGZvciBncm91cCAldSBub3QgaW4gZ3JvdXAgIgogCQkJICAgICAgICIoYmxvY2sgJWxsdSkhXG4iLCBpLCBpbm9kZV9iaXRtYXApOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTE1NjcsMTQgKzE3MDIsMTQgQEAKIAkJaWYgKGlub2RlX3RhYmxlIDwgZmlyc3RfYmxvY2sgfHwKIAkJICAgIGlub2RlX3RhYmxlICsgc2JpLT5zX2l0Yl9wZXJfZ3JvdXAgLSAxID4gbGFzdF9ibG9jaykgewogCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBleHQ0X2NoZWNrX2Rlc2NyaXB0b3JzOiAiCi0JCQkgICAgICAgIklub2RlIHRhYmxlIGZvciBncm91cCAlbHUgbm90IGluIGdyb3VwICIKKwkJCSAgICAgICAiSW5vZGUgdGFibGUgZm9yIGdyb3VwICV1IG5vdCBpbiBncm91cCAiCiAJCQkgICAgICAgIihibG9jayAlbGx1KSFcbiIsIGksIGlub2RlX3RhYmxlKTsKIAkJCXJldHVybiAwOwogCQl9CiAJCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhzYmksIGkpKTsKIAkJaWYgKCFleHQ0X2dyb3VwX2Rlc2NfY3N1bV92ZXJpZnkoc2JpLCBpLCBnZHApKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGV4dDRfY2hlY2tfZGVzY3JpcHRvcnM6ICIKLQkJCSAgICAgICAiQ2hlY2tzdW0gZm9yIGdyb3VwICVsdSBmYWlsZWQgKCV1IT0ldSlcbiIsCisJCQkgICAgICAgIkNoZWNrc3VtIGZvciBncm91cCAldSBmYWlsZWQgKCV1IT0ldSlcbiIsCiAJCQkgICAgICAgaSwgbGUxNl90b19jcHUoZXh0NF9ncm91cF9kZXNjX2NzdW0oc2JpLCBpLAogCQkJICAgICAgIGdkcCkpLCBsZTE2X3RvX2NwdShnZHAtPmJnX2NoZWNrc3VtKSk7CiAJCQlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKQEAgLTE4NjYsMTkgKzIwMDEsMjAgQEAKIAlleHQ0X2ZzYmxrX3Qgc2JfYmxvY2sgPSBnZXRfc2JfYmxvY2soJmRhdGEpOwogCWV4dDRfZnNibGtfdCBsb2dpY2FsX3NiX2Jsb2NrOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gMDsKLQl1bnNpZ25lZCBpbnQgam91cm5hbF9pbnVtID0gMDsKIAl1bnNpZ25lZCBsb25nIGpvdXJuYWxfZGV2bnVtID0gMDsKIAl1bnNpZ25lZCBsb25nIGRlZl9tb3VudF9vcHRzOwogCXN0cnVjdCBpbm9kZSAqcm9vdDsKIAljaGFyICpjcDsKKwljb25zdCBjaGFyICpkZXNjcjsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIAlpbnQgYmxvY2tzaXplOwotCWludCBkYl9jb3VudDsKLQlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgZGJfY291bnQ7CisJdW5zaWduZWQgaW50IGk7CiAJaW50IG5lZWRzX3JlY292ZXJ5LCBoYXNfaHVnZV9maWxlczsKLQlfX2xlMzIgZmVhdHVyZXM7CisJaW50IGZlYXR1cmVzOwogCV9fdTY0IGJsb2Nrc19jb3VudDsKIAlpbnQgZXJyOworCXVuc2lnbmVkIGludCBqb3VybmFsX2lvcHJpbyA9IERFRkFVTFRfSk9VUk5BTF9JT1BSSU87CiAKIAlzYmkgPSBremFsbG9jKHNpemVvZigqc2JpKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzYmkpCkBAIC0xOTU5LDMxICsyMDk1LDIyIEBACiAKIAlzYmktPnNfcmVzdWlkID0gbGUxNl90b19jcHUoZXMtPnNfZGVmX3Jlc3VpZCk7CiAJc2JpLT5zX3Jlc2dpZCA9IGxlMTZfdG9fY3B1KGVzLT5zX2RlZl9yZXNnaWQpOworCXNiaS0+c19jb21taXRfaW50ZXJ2YWwgPSBKQkQyX0RFRkFVTFRfTUFYX0NPTU1JVF9BR0UgKiBIWjsKKwlzYmktPnNfbWluX2JhdGNoX3RpbWUgPSBFWFQ0X0RFRl9NSU5fQkFUQ0hfVElNRTsKKwlzYmktPnNfbWF4X2JhdGNoX3RpbWUgPSBFWFQ0X0RFRl9NQVhfQkFUQ0hfVElNRTsKIAogCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgUkVTRVJWQVRJT04pOwogCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgQkFSUklFUik7CiAKIAkvKgotCSAqIHR1cm4gb24gZXh0ZW50cyBmZWF0dXJlIGJ5IGRlZmF1bHQgaW4gZXh0NCBmaWxlc3lzdGVtCi0JICogb25seSBpZiBmZWF0dXJlIGZsYWcgYWxyZWFkeSBzZXQgYnkgbWtmcyBvciB0dW5lMmZzLgotCSAqIFVzZSAtbyBub2V4dGVudHMgdG8gdHVybiBpdCBvZmYKLQkgKi8KLQlpZiAoRVhUNF9IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0VYVEVOVFMpKQotCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIEVYVEVOVFMpOwotCWVsc2UKLQkJZXh0NF93YXJuaW5nKHNiLCBfX2Z1bmNfXywKLQkJCSJleHRlbnRzIGZlYXR1cmUgbm90IGVuYWJsZWQgb24gdGhpcyBmaWxlc3lzdGVtLCAiCi0JCQkidXNlIHR1bmUyZnMuXG4iKTsKLQotCS8qCiAJICogZW5hYmxlIGRlbGF5ZWQgYWxsb2NhdGlvbiBieSBkZWZhdWx0CiAJICogVXNlIC1vIG5vZGVsYWxsb2MgdG8gdHVybiBpdCBvZmYKIAkgKi8KIAlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIERFTEFMTE9DKTsKIAogCi0JaWYgKCFwYXJzZV9vcHRpb25zKChjaGFyICopIGRhdGEsIHNiLCAmam91cm5hbF9pbnVtLCAmam91cm5hbF9kZXZudW0sCi0JCQkgICBOVUxMLCAwKSkKKwlpZiAoIXBhcnNlX29wdGlvbnMoKGNoYXIgKikgZGF0YSwgc2IsICZqb3VybmFsX2Rldm51bSwKKwkJCSAgICZqb3VybmFsX2lvcHJpbywgTlVMTCwgMCkpCiAJCWdvdG8gZmFpbGVkX21vdW50OwogCiAJc2ItPnNfZmxhZ3MgPSAoc2ItPnNfZmxhZ3MgJiB+TVNfUE9TSVhBQ0wpIHwKQEAgLTIwMDUsMTUgKzIxMzIsMTcgQEAKIAlmZWF0dXJlcyA9IEVYVDRfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIH5FWFQ0X0ZFQVRVUkVfSU5DT01QQVRfU1VQUCk7CiAJaWYgKGZlYXR1cmVzKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogJXM6IGNvdWxkbid0IG1vdW50IGJlY2F1c2Ugb2YgIgotCQkgICAgICAgInVuc3VwcG9ydGVkIG9wdGlvbmFsIGZlYXR1cmVzICgleCkuXG4iLAotCQkgICAgICAgc2ItPnNfaWQsIGxlMzJfdG9fY3B1KGZlYXR1cmVzKSk7CisJCSAgICAgICAidW5zdXBwb3J0ZWQgb3B0aW9uYWwgZmVhdHVyZXMgKCV4KS5cbiIsIHNiLT5zX2lkLAorCQkJKGxlMzJfdG9fY3B1KEVYVDRfU0Ioc2IpLT5zX2VzLT5zX2ZlYXR1cmVfaW5jb21wYXQpICYKKwkJCX5FWFQ0X0ZFQVRVUkVfSU5DT01QQVRfU1VQUCkpOwogCQlnb3RvIGZhaWxlZF9tb3VudDsKIAl9CiAJZmVhdHVyZXMgPSBFWFQ0X0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwgfkVYVDRfRkVBVFVSRV9ST19DT01QQVRfU1VQUCk7CiAJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpICYmIGZlYXR1cmVzKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogJXM6IGNvdWxkbid0IG1vdW50IFJEV1IgYmVjYXVzZSBvZiAiCi0JCSAgICAgICAidW5zdXBwb3J0ZWQgb3B0aW9uYWwgZmVhdHVyZXMgKCV4KS5cbiIsCi0JCSAgICAgICBzYi0+c19pZCwgbGUzMl90b19jcHUoZmVhdHVyZXMpKTsKKwkJICAgICAgICJ1bnN1cHBvcnRlZCBvcHRpb25hbCBmZWF0dXJlcyAoJXgpLlxuIiwgc2ItPnNfaWQsCisJCQkobGUzMl90b19jcHUoRVhUNF9TQihzYiktPnNfZXMtPnNfZmVhdHVyZV9yb19jb21wYXQpICYKKwkJCX5FWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX1NVUFApKTsKIAkJZ290byBmYWlsZWRfbW91bnQ7CiAJfQogCWhhc19odWdlX2ZpbGVzID0gRVhUNF9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsCkBAIC0yMTE4LDYgKzIyNDcsMTggQEAKIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQogCQlzYmktPnNfaGFzaF9zZWVkW2ldID0gbGUzMl90b19jcHUoZXMtPnNfaGFzaF9zZWVkW2ldKTsKIAlzYmktPnNfZGVmX2hhc2hfdmVyc2lvbiA9IGVzLT5zX2RlZl9oYXNoX3ZlcnNpb247CisJaSA9IGxlMzJfdG9fY3B1KGVzLT5zX2ZsYWdzKTsKKwlpZiAoaSAmIEVYVDJfRkxBR1NfVU5TSUdORURfSEFTSCkKKwkJc2JpLT5zX2hhc2hfdW5zaWduZWQgPSAzOworCWVsc2UgaWYgKChpICYgRVhUMl9GTEFHU19TSUdORURfSEFTSCkgPT0gMCkgeworI2lmZGVmIF9fQ0hBUl9VTlNJR05FRF9fCisJCWVzLT5zX2ZsYWdzIHw9IGNwdV90b19sZTMyKEVYVDJfRkxBR1NfVU5TSUdORURfSEFTSCk7CisJCXNiaS0+c19oYXNoX3Vuc2lnbmVkID0gMzsKKyNlbHNlCisJCWVzLT5zX2ZsYWdzIHw9IGNwdV90b19sZTMyKEVYVDJfRkxBR1NfU0lHTkVEX0hBU0gpOworI2VuZGlmCisJCXNiLT5zX2RpcnQgPSAxOworCX0KIAogCWlmIChzYmktPnNfYmxvY2tzX3Blcl9ncm91cCA+IGJsb2Nrc2l6ZSAqIDgpIHsKIAkJcHJpbnRrKEtFUk5fRVJSCkBAIC0yMTQ1LDIwICsyMjg2LDMwIEBACiAJaWYgKEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikgPT0gMCkKIAkJZ290byBjYW50ZmluZF9leHQ0OwogCi0JLyogZW5zdXJlIGJsb2Nrc19jb3VudCBjYWxjdWxhdGlvbiBiZWxvdyBkb2Vzbid0IHNpZ24tZXh0ZW5kICovCi0JaWYgKGV4dDRfYmxvY2tzX2NvdW50KGVzKSArIEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikgPAotCSAgICBsZTMyX3RvX2NwdShlcy0+c19maXJzdF9kYXRhX2Jsb2NrKSArIDEpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRVhUNC1mczogYmFkIGdlb21ldHJ5OiBibG9jayBjb3VudCAlbGx1LCAiCi0JCSAgICAgICAiZmlyc3QgZGF0YSBibG9jayAldSwgYmxvY2tzIHBlciBncm91cCAlbHVcbiIsCi0JCQlleHQ0X2Jsb2Nrc19jb3VudChlcyksCi0JCQlsZTMyX3RvX2NwdShlcy0+c19maXJzdF9kYXRhX2Jsb2NrKSwKLQkJCUVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikpOworICAgICAgICAvKgorICAgICAgICAgKiBJdCBtYWtlcyBubyBzZW5zZSBmb3IgdGhlIGZpcnN0IGRhdGEgYmxvY2sgdG8gYmUgYmV5b25kIHRoZSBlbmQKKyAgICAgICAgICogb2YgdGhlIGZpbGVzeXN0ZW0uCisgICAgICAgICAqLworICAgICAgICBpZiAobGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jaykgPj0gZXh0NF9ibG9ja3NfY291bnQoZXMpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiRVhUNC1mczogYmFkIGdlb21ldHJ5OiBmaXJzdCBkYXRhIgorCQkgICAgICAgImJsb2NrICV1IGlzIGJleW9uZCBlbmQgb2YgZmlsZXN5c3RlbSAoJWxsdSlcbiIsCisJCSAgICAgICBsZTMyX3RvX2NwdShlcy0+c19maXJzdF9kYXRhX2Jsb2NrKSwKKwkJICAgICAgIGV4dDRfYmxvY2tzX2NvdW50KGVzKSk7CiAJCWdvdG8gZmFpbGVkX21vdW50OwogCX0KIAlibG9ja3NfY291bnQgPSAoZXh0NF9ibG9ja3NfY291bnQoZXMpIC0KIAkJCWxlMzJfdG9fY3B1KGVzLT5zX2ZpcnN0X2RhdGFfYmxvY2spICsKIAkJCUVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikgLSAxKTsKIAlkb19kaXYoYmxvY2tzX2NvdW50LCBFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpKTsKKwlpZiAoYmxvY2tzX2NvdW50ID4gKCh1aW50NjRfdCkxPDwzMikgLSBFWFQ0X0RFU0NfUEVSX0JMT0NLKHNiKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJFWFQ0LWZzOiBncm91cHMgY291bnQgdG9vIGxhcmdlOiAldSAiCisJCSAgICAgICAiKGJsb2NrIGNvdW50ICVsbHUsIGZpcnN0IGRhdGEgYmxvY2sgJXUsICIKKwkJICAgICAgICJibG9ja3MgcGVyIGdyb3VwICVsdSlcbiIsIHNiaS0+c19ncm91cHNfY291bnQsCisJCSAgICAgICBleHQ0X2Jsb2Nrc19jb3VudChlcyksCisJCSAgICAgICBsZTMyX3RvX2NwdShlcy0+c19maXJzdF9kYXRhX2Jsb2NrKSwKKwkJICAgICAgIEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikpOworCQlnb3RvIGZhaWxlZF9tb3VudDsKKwl9CiAJc2JpLT5zX2dyb3Vwc19jb3VudCA9IGJsb2Nrc19jb3VudDsKIAlkYl9jb3VudCA9IChzYmktPnNfZ3JvdXBzX2NvdW50ICsgRVhUNF9ERVNDX1BFUl9CTE9DSyhzYikgLSAxKSAvCiAJCSAgIEVYVDRfREVTQ19QRVJfQkxPQ0soc2IpOwpAQCAtMjI3MCwyNyArMjQyMSwyNiBAQAogCQkJCUVYVDRfU0Ioc2IpLT5zX21vdW50X3N0YXRlIHw9IEVYVDRfRVJST1JfRlM7CiAJCQkJZXMtPnNfc3RhdGUgfD0gY3B1X3RvX2xlMTYoRVhUNF9FUlJPUl9GUyk7CiAJCQkJZXh0NF9jb21taXRfc3VwZXIoc2IsIGVzLCAxKTsKLQkJCQlwcmludGsoS0VSTl9DUklUCi0JCQkJICAgICAgICJFWFQ0LWZzIChkZXZpY2UgJXMpOiBtb3VudCBmYWlsZWRcbiIsCi0JCQkJICAgICAgc2ItPnNfaWQpOwogCQkJCWdvdG8gZmFpbGVkX21vdW50NDsKIAkJCX0KIAkJfQotCX0gZWxzZSBpZiAoam91cm5hbF9pbnVtKSB7Ci0JCWlmIChleHQ0X2NyZWF0ZV9qb3VybmFsKHNiLCBlcywgam91cm5hbF9pbnVtKSkKLQkJCWdvdG8gZmFpbGVkX21vdW50MzsKKwl9IGVsc2UgaWYgKHRlc3Rfb3B0KHNiLCBOT0xPQUQpICYmICEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpICYmCisJICAgICAgRVhUNF9IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogcmVxdWlyZWQgam91cm5hbCByZWNvdmVyeSAiCisJCSAgICAgICAic3VwcHJlc3NlZCBhbmQgbm90IG1vdW50ZWQgcmVhZC1vbmx5XG4iKTsKKwkJZ290byBmYWlsZWRfbW91bnQ0OwogCX0gZWxzZSB7Ci0JCWlmICghc2lsZW50KQotCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgImV4dDQ6IE5vIGpvdXJuYWwgb24gZmlsZXN5c3RlbSBvbiAlc1xuIiwKLQkJCSAgICAgICBzYi0+c19pZCk7Ci0JCWdvdG8gZmFpbGVkX21vdW50MzsKKwkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIERBVEFfRkxBR1MpOworCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIFdSSVRFQkFDS19EQVRBKTsKKwkJc2JpLT5zX2pvdXJuYWwgPSBOVUxMOworCQluZWVkc19yZWNvdmVyeSA9IDA7CisJCWdvdG8gbm9fam91cm5hbDsKIAl9CiAKIAlpZiAoZXh0NF9ibG9ja3NfY291bnQoZXMpID4gMHhmZmZmZmZmZlVMTCAmJgogCSAgICAhamJkMl9qb3VybmFsX3NldF9mZWF0dXJlcyhFWFQ0X1NCKHNiKS0+c19qb3VybmFsLCAwLCAwLAogCQkJCSAgICAgICBKQkQyX0ZFQVRVUkVfSU5DT01QQVRfNjRCSVQpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZXh0NDogRmFpbGVkIHRvIHNldCA2NC1iaXQgam91cm5hbCBmZWF0dXJlXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBGYWlsZWQgdG8gc2V0IDY0LWJpdCBqb3VybmFsIGZlYXR1cmVcbiIpOwogCQlnb3RvIGZhaWxlZF9tb3VudDQ7CiAJfQogCkBAIC0yMzM1LDYgKzI0ODUsOSBAQAogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KKwlzZXRfdGFza19pb3ByaW8oc2JpLT5zX2pvdXJuYWwtPmpfdGFzaywgam91cm5hbF9pb3ByaW8pOworCitub19qb3VybmFsOgogCiAJaWYgKHRlc3Rfb3B0KHNiLCBOT0JIKSkgewogCQlpZiAoISh0ZXN0X29wdChzYiwgREFUQV9GTEFHUykgPT0gRVhUNF9NT1VOVF9XUklURUJBQ0tfREFUQSkpIHsKQEAgLTI0MjAsMTMgKzI1NzMsMjIgQEAKIAlFWFQ0X1NCKHNiKS0+c19tb3VudF9zdGF0ZSB8PSBFWFQ0X09SUEhBTl9GUzsKIAlleHQ0X29ycGhhbl9jbGVhbnVwKHNiLCBlcyk7CiAJRVhUNF9TQihzYiktPnNfbW91bnRfc3RhdGUgJj0gfkVYVDRfT1JQSEFOX0ZTOwotCWlmIChuZWVkc19yZWNvdmVyeSkKKwlpZiAobmVlZHNfcmVjb3ZlcnkpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiRVhUNC1mczogcmVjb3ZlcnkgY29tcGxldGUuXG4iKTsKLQlleHQ0X21hcmtfcmVjb3ZlcnlfY29tcGxldGUoc2IsIGVzKTsKLQlwcmludGsoS0VSTl9JTkZPICJFWFQ0LWZzOiBtb3VudGVkIGZpbGVzeXN0ZW0gd2l0aCAlcyBkYXRhIG1vZGUuXG4iLAotCSAgICAgICB0ZXN0X29wdChzYiwgREFUQV9GTEFHUykgPT0gRVhUNF9NT1VOVF9KT1VSTkFMX0RBVEEgPyAiam91cm5hbCI6Ci0JICAgICAgIHRlc3Rfb3B0KHNiLCBEQVRBX0ZMQUdTKSA9PSBFWFQ0X01PVU5UX09SREVSRURfREFUQSA/ICJvcmRlcmVkIjoKLQkgICAgICAgIndyaXRlYmFjayIpOworCQlleHQ0X21hcmtfcmVjb3ZlcnlfY29tcGxldGUoc2IsIGVzKTsKKwl9CisJaWYgKEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWwpIHsKKwkJaWYgKHRlc3Rfb3B0KHNiLCBEQVRBX0ZMQUdTKSA9PSBFWFQ0X01PVU5UX0pPVVJOQUxfREFUQSkKKwkJCWRlc2NyID0gIiBqb3VybmFsbGVkIGRhdGEgbW9kZSI7CisJCWVsc2UgaWYgKHRlc3Rfb3B0KHNiLCBEQVRBX0ZMQUdTKSA9PSBFWFQ0X01PVU5UX09SREVSRURfREFUQSkKKwkJCWRlc2NyID0gIiBvcmRlcmVkIGRhdGEgbW9kZSI7CisJCWVsc2UKKwkJCWRlc2NyID0gIiB3cml0ZWJhY2sgZGF0YSBtb2RlIjsKKwl9IGVsc2UKKwkJZGVzY3IgPSAib3V0IGpvdXJuYWwiOworCisJcHJpbnRrKEtFUk5fSU5GTyAiRVhUNC1mczogbW91bnRlZCBmaWxlc3lzdGVtICVzIHdpdGglc1xuIiwKKwkgICAgICAgc2ItPnNfaWQsIGRlc2NyKTsKIAogCWxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIDA7CkBAIC0yNDM4LDggKzI2MDAsMTEgQEAKIAlnb3RvIGZhaWxlZF9tb3VudDsKIAogZmFpbGVkX21vdW50NDoKLQlqYmQyX2pvdXJuYWxfZGVzdHJveShzYmktPnNfam91cm5hbCk7Ci0Jc2JpLT5zX2pvdXJuYWwgPSBOVUxMOworCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mcyAoZGV2aWNlICVzKTogbW91bnQgZmFpbGVkXG4iLCBzYi0+c19pZCk7CisJaWYgKHNiaS0+c19qb3VybmFsKSB7CisJCWpiZDJfam91cm5hbF9kZXN0cm95KHNiaS0+c19qb3VybmFsKTsKKwkJc2JpLT5zX2pvdXJuYWwgPSBOVUxMOworCX0KIGZhaWxlZF9tb3VudDM6CiAJcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlcik7CiAJcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgmc2JpLT5zX2ZyZWVpbm9kZXNfY291bnRlcik7CkBAIC0yNDc2LDExICsyNjQxLDkgQEAKIHsKIAlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKIAotCWlmIChzYmktPnNfY29tbWl0X2ludGVydmFsKQotCQlqb3VybmFsLT5qX2NvbW1pdF9pbnRlcnZhbCA9IHNiaS0+c19jb21taXRfaW50ZXJ2YWw7Ci0JLyogV2UgY291bGQgYWxzbyBzZXQgdXAgYW4gZXh0NC1zcGVjaWZpYyBkZWZhdWx0IGZvciB0aGUgY29tbWl0Ci0JICogaW50ZXJ2YWwgaGVyZSwgYnV0IGZvciBub3cgd2UnbGwganVzdCBmYWxsIGJhY2sgdG8gdGhlIGpiZAotCSAqIGRlZmF1bHQuICovCisJam91cm5hbC0+al9jb21taXRfaW50ZXJ2YWwgPSBzYmktPnNfY29tbWl0X2ludGVydmFsOworCWpvdXJuYWwtPmpfbWluX2JhdGNoX3RpbWUgPSBzYmktPnNfbWluX2JhdGNoX3RpbWU7CisJam91cm5hbC0+al9tYXhfYmF0Y2hfdGltZSA9IHNiaS0+c19tYXhfYmF0Y2hfdGltZTsKIAogCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKIAlpZiAodGVzdF9vcHQoc2IsIEJBUlJJRVIpKQpAQCAtMjUwMCw2ICsyNjYzLDggQEAKIAlzdHJ1Y3QgaW5vZGUgKmpvdXJuYWxfaW5vZGU7CiAJam91cm5hbF90ICpqb3VybmFsOwogCisJQlVHX09OKCFFWFQ0X0hBU19DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTCkpOworCiAJLyogRmlyc3QsIHRlc3QgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYSB2YWxpZCBpbm9kZSBvbiBkaXNrLiAgQmFkCiAJICogdGhpbmdzIGhhcHBlbiBpZiB3ZSBpZ2V0KCkgYW4gdW51c2VkIGlub2RlLCBhcyB0aGUgc3Vic2VxdWVudAogCSAqIGlwdXQoKSB3aWxsIHRyeSB0byBkZWxldGUgaXQuICovCkBAIC0yNTQ4LDEzICsyNzEzLDE1IEBACiAJc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzOwogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CiAKKwlCVUdfT04oIUVYVDRfSEFTX0NPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMKSk7CisKIAliZGV2ID0gZXh0NF9ibGtkZXZfZ2V0KGpfZGV2KTsKIAlpZiAoYmRldiA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAogCWlmIChiZF9jbGFpbShiZGV2LCBzYikpIHsKIAkJcHJpbnRrKEtFUk5fRVJSCi0JCQkiRVhUNDogZmFpbGVkIHRvIGNsYWltIGV4dGVybmFsIGpvdXJuYWwgZGV2aWNlLlxuIik7CisJCQkiRVhUNC1mczogZmFpbGVkIHRvIGNsYWltIGV4dGVybmFsIGpvdXJuYWwgZGV2aWNlLlxuIik7CiAJCWJsa2Rldl9wdXQoYmRldiwgRk1PREVfUkVBRHxGTU9ERV9XUklURSk7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTI2MzUsNiArMjgwMiw4IEBACiAJaW50IGVyciA9IDA7CiAJaW50IHJlYWxseV9yZWFkX29ubHk7CiAKKwlCVUdfT04oIUVYVDRfSEFTX0NPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMKSk7CisKIAlpZiAoam91cm5hbF9kZXZudW0gJiYKIAkgICAgam91cm5hbF9kZXZudW0gIT0gbGUzMl90b19jcHUoZXMtPnNfam91cm5hbF9kZXYpKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIkVYVDQtZnM6IGV4dGVybmFsIGpvdXJuYWwgZGV2aWNlIG1ham9yL21pbm9yICIKQEAgLTI3MTksNDggKzI4ODgsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGV4dDRfY3JlYXRlX2pvdXJuYWwoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKLQkJCSAgICAgICBzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXMsCi0JCQkgICAgICAgdW5zaWduZWQgaW50IGpvdXJuYWxfaW51bSkKLXsKLQlqb3VybmFsX3QgKmpvdXJuYWw7Ci0JaW50IGVycjsKLQotCWlmIChzYi0+c19mbGFncyAmIE1TX1JET05MWSkgewotCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IHJlYWRvbmx5IGZpbGVzeXN0ZW0gd2hlbiB0cnlpbmcgdG8gIgotCQkJCSJjcmVhdGUgam91cm5hbC5cbiIpOwotCQlyZXR1cm4gLUVST0ZTOwotCX0KLQotCWpvdXJuYWwgPSBleHQ0X2dldF9qb3VybmFsKHNiLCBqb3VybmFsX2ludW0pOwotCWlmICgham91cm5hbCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJFWFQ0LWZzOiBjcmVhdGluZyBuZXcgam91cm5hbCBvbiBpbm9kZSAldVxuIiwKLQkgICAgICAgam91cm5hbF9pbnVtKTsKLQotCWVyciA9IGpiZDJfam91cm5hbF9jcmVhdGUoam91cm5hbCk7Ci0JaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGVycm9yIGNyZWF0aW5nIGpvdXJuYWwuXG4iKTsKLQkJamJkMl9qb3VybmFsX2Rlc3Ryb3koam91cm5hbCk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCUVYVDRfU0Ioc2IpLT5zX2pvdXJuYWwgPSBqb3VybmFsOwotCi0JZXh0NF91cGRhdGVfZHluYW1pY19yZXYoc2IpOwotCUVYVDRfU0VUX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSKTsKLQlFWFQ0X1NFVF9DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTCk7Ci0KLQllcy0+c19qb3VybmFsX2ludW0gPSBjcHVfdG9fbGUzMihqb3VybmFsX2ludW0pOwotCXNiLT5zX2RpcnQgPSAxOwotCi0JLyogTWFrZSBzdXJlIHdlIGZsdXNoIHRoZSByZWNvdmVyeSBmbGFnIHRvIGRpc2suICovCi0JZXh0NF9jb21taXRfc3VwZXIoc2IsIGVzLCAxKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgdm9pZCBleHQ0X2NvbW1pdF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAogCQkJICAgICAgc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzLCBpbnQgc3luYykKIHsKQEAgLTI3NzcsMjAgKzI5MDQsMjMgQEAKIAkJICogYmUgcmVtYXBwZWQuICBOb3RoaW5nIHdlIGNhbiBkbyBidXQgdG8gcmV0cnkgdGhlCiAJCSAqIHdyaXRlIGFuZCBob3BlIGZvciB0aGUgYmVzdC4KIAkJICovCi0JCXByaW50ayhLRVJOX0VSUiAiZXh0NDogcHJldmlvdXMgSS9PIGVycm9yIHRvICIKKwkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBwcmV2aW91cyBJL08gZXJyb3IgdG8gIgogCQkgICAgICAgInN1cGVyYmxvY2sgZGV0ZWN0ZWQgZm9yICVzLlxuIiwgc2ItPnNfaWQpOwogCQljbGVhcl9idWZmZXJfd3JpdGVfaW9fZXJyb3Ioc2JoKTsKIAkJc2V0X2J1ZmZlcl91cHRvZGF0ZShzYmgpOwogCX0KIAllcy0+c193dGltZSA9IGNwdV90b19sZTMyKGdldF9zZWNvbmRzKCkpOwotCWV4dDRfZnJlZV9ibG9ja3NfY291bnRfc2V0KGVzLCBleHQ0X2NvdW50X2ZyZWVfYmxvY2tzKHNiKSk7Ci0JZXMtPnNfZnJlZV9pbm9kZXNfY291bnQgPSBjcHVfdG9fbGUzMihleHQ0X2NvdW50X2ZyZWVfaW5vZGVzKHNiKSk7CisJZXh0NF9mcmVlX2Jsb2Nrc19jb3VudF9zZXQoZXMsIHBlcmNwdV9jb3VudGVyX3N1bV9wb3NpdGl2ZSgKKwkJCQkJJkVYVDRfU0Ioc2IpLT5zX2ZyZWVibG9ja3NfY291bnRlcikpOworCWVzLT5zX2ZyZWVfaW5vZGVzX2NvdW50ID0gY3B1X3RvX2xlMzIocGVyY3B1X2NvdW50ZXJfc3VtX3Bvc2l0aXZlKAorCQkJCQkmRVhUNF9TQihzYiktPnNfZnJlZWlub2Rlc19jb3VudGVyKSk7CisKIAlCVUZGRVJfVFJBQ0Uoc2JoLCAibWFya2luZyBkaXJ0eSIpOwogCW1hcmtfYnVmZmVyX2RpcnR5KHNiaCk7CiAJaWYgKHN5bmMpIHsKIAkJc3luY19kaXJ0eV9idWZmZXIoc2JoKTsKIAkJaWYgKGJ1ZmZlcl93cml0ZV9pb19lcnJvcihzYmgpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImV4dDQ6IEkvTyBlcnJvciB3aGlsZSB3cml0aW5nICIKKwkJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogSS9PIGVycm9yIHdoaWxlIHdyaXRpbmcgIgogCQkJICAgICAgICJzdXBlcmJsb2NrIGZvciAlcy5cbiIsIHNiLT5zX2lkKTsKIAkJCWNsZWFyX2J1ZmZlcl93cml0ZV9pb19lcnJvcihzYmgpOwogCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShzYmgpOwpAQCAtMjgwOSw2ICsyOTM5LDEwIEBACiB7CiAJam91cm5hbF90ICpqb3VybmFsID0gRVhUNF9TQihzYiktPnNfam91cm5hbDsKIAorCWlmICghRVhUNF9IQVNfQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUwpKSB7CisJCUJVR19PTihqb3VybmFsICE9IE5VTEwpOworCQlyZXR1cm47CisJfQogCWpiZDJfam91cm5hbF9sb2NrX3VwZGF0ZXMoam91cm5hbCk7CiAJaWYgKGpiZDJfam91cm5hbF9mbHVzaChqb3VybmFsKSA8IDApCiAJCWdvdG8gb3V0OwpAQCAtMjgzOCw2ICsyOTcyLDggQEAKIAlpbnQgal9lcnJubzsKIAljb25zdCBjaGFyICplcnJzdHI7CiAKKwlCVUdfT04oIUVYVDRfSEFTX0NPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMKSk7CisKIAlqb3VybmFsID0gRVhUNF9TQihzYiktPnNfam91cm5hbDsKIAogCS8qCkBAIC0yODcwLDE0ICszMDA2LDE3IEBACiBpbnQgZXh0NF9mb3JjZV9jb21taXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlqb3VybmFsX3QgKmpvdXJuYWw7Ci0JaW50IHJldDsKKwlpbnQgcmV0ID0gMDsKIAogCWlmIChzYi0+c19mbGFncyAmIE1TX1JET05MWSkKIAkJcmV0dXJuIDA7CiAKIAlqb3VybmFsID0gRVhUNF9TQihzYiktPnNfam91cm5hbDsKLQlzYi0+c19kaXJ0ID0gMDsKLQlyZXQgPSBleHQ0X2pvdXJuYWxfZm9yY2VfY29tbWl0KGpvdXJuYWwpOworCWlmIChqb3VybmFsKSB7CisJCXNiLT5zX2RpcnQgPSAwOworCQlyZXQgPSBleHQ0X2pvdXJuYWxfZm9yY2VfY29tbWl0KGpvdXJuYWwpOworCX0KKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTI4ODksOSArMzAyOCwxMyBAQAogICovCiBzdGF0aWMgdm9pZCBleHQ0X3dyaXRlX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7Ci0JaWYgKG11dGV4X3RyeWxvY2soJnNiLT5zX2xvY2spICE9IDApCi0JCUJVRygpOwotCXNiLT5zX2RpcnQgPSAwOworCWlmIChFWFQ0X1NCKHNiKS0+c19qb3VybmFsKSB7CisJCWlmIChtdXRleF90cnlsb2NrKCZzYi0+c19sb2NrKSAhPSAwKQorCQkJQlVHKCk7CisJCXNiLT5zX2RpcnQgPSAwOworCX0gZWxzZSB7CisJCWV4dDRfY29tbWl0X3N1cGVyKHNiLCBFWFQ0X1NCKHNiKS0+c19lcywgMSk7CisJfQogfQogCiBzdGF0aWMgaW50IGV4dDRfc3luY19mcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgd2FpdCkKQEAgLTI5MDAsMTAgKzMwNDMsMTQgQEAKIAogCXRyYWNlX21hcmsoZXh0NF9zeW5jX2ZzLCAiZGV2ICVzIHdhaXQgJWQiLCBzYi0+c19pZCwgd2FpdCk7CiAJc2ItPnNfZGlydCA9IDA7Ci0JaWYgKHdhaXQpCi0JCXJldCA9IGV4dDRfZm9yY2VfY29tbWl0KHNiKTsKLQllbHNlCi0JCWpiZDJfam91cm5hbF9zdGFydF9jb21taXQoRVhUNF9TQihzYiktPnNfam91cm5hbCwgTlVMTCk7CisJaWYgKEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWwpIHsKKwkJaWYgKHdhaXQpCisJCQlyZXQgPSBleHQ0X2ZvcmNlX2NvbW1pdChzYik7CisJCWVsc2UKKyAJCQlqYmQyX2pvdXJuYWxfc3RhcnRfY29tbWl0KEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWwsIE5VTEwpOworCX0gZWxzZSB7CisJCWV4dDRfY29tbWl0X3N1cGVyKHNiLCBFWFQ0X1NCKHNiKS0+c19lcywgd2FpdCk7CisJfQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTI5MTgsMTUgKzMwNjUsMTcgQEAKIAlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKIAkJam91cm5hbF90ICpqb3VybmFsID0gRVhUNF9TQihzYiktPnNfam91cm5hbDsKIAotCQkvKiBOb3cgd2Ugc2V0IHVwIHRoZSBqb3VybmFsIGJhcnJpZXIuICovCi0JCWpiZDJfam91cm5hbF9sb2NrX3VwZGF0ZXMoam91cm5hbCk7CisJCWlmIChqb3VybmFsKSB7CisJCQkvKiBOb3cgd2Ugc2V0IHVwIHRoZSBqb3VybmFsIGJhcnJpZXIuICovCisJCQlqYmQyX2pvdXJuYWxfbG9ja191cGRhdGVzKGpvdXJuYWwpOwogCi0JCS8qCi0JCSAqIFdlIGRvbid0IHdhbnQgdG8gY2xlYXIgbmVlZHNfcmVjb3ZlcnkgZmxhZyB3aGVuIHdlIGZhaWxlZAotCQkgKiB0byBmbHVzaCB0aGUgam91cm5hbC4KLQkJICovCi0JCWlmIChqYmQyX2pvdXJuYWxfZmx1c2goam91cm5hbCkgPCAwKQotCQkJcmV0dXJuOworCQkJLyoKKwkJCSAqIFdlIGRvbid0IHdhbnQgdG8gY2xlYXIgbmVlZHNfcmVjb3ZlcnkgZmxhZyB3aGVuIHdlCisJCQkgKiBmYWlsZWQgdG8gZmx1c2ggdGhlIGpvdXJuYWwuCisJCQkgKi8KKwkJCWlmIChqYmQyX2pvdXJuYWxfZmx1c2goam91cm5hbCkgPCAwKQorCQkJCXJldHVybjsKKwkJfQogCiAJCS8qIEpvdXJuYWwgYmxvY2tlZCBhbmQgZmx1c2hlZCwgY2xlYXIgbmVlZHNfcmVjb3ZlcnkgZmxhZy4gKi8KIAkJRVhUNF9DTEVBUl9JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUik7CkBAIC0yOTQwLDcgKzMwODksNyBAQAogICovCiBzdGF0aWMgdm9pZCBleHQ0X3VubG9ja2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7Ci0JaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJaWYgKEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWwgJiYgIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKIAkJbG9ja19zdXBlcihzYik7CiAJCS8qIFJlc2VyIHRoZSBuZWVkc19yZWNvdmVyeSBmbGFnIGJlZm9yZSB0aGUgZnMgaXMgdW5sb2NrZWQuICovCiAJCUVYVDRfU0VUX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSKTsKQEAgLTI5NTgsNiArMzEwNyw3IEBACiAJdW5zaWduZWQgbG9uZyBvbGRfc2JfZmxhZ3M7CiAJc3RydWN0IGV4dDRfbW91bnRfb3B0aW9ucyBvbGRfb3B0czsKIAlleHQ0X2dyb3VwX3QgZzsKKwl1bnNpZ25lZCBpbnQgam91cm5hbF9pb3ByaW8gPSBERUZBVUxUX0pPVVJOQUxfSU9QUklPOwogCWludCBlcnI7CiAjaWZkZWYgQ09ORklHX1FVT1RBCiAJaW50IGk7CkBAIC0yOTY5LDE2ICszMTE5LDIxIEBACiAJb2xkX29wdHMuc19yZXN1aWQgPSBzYmktPnNfcmVzdWlkOwogCW9sZF9vcHRzLnNfcmVzZ2lkID0gc2JpLT5zX3Jlc2dpZDsKIAlvbGRfb3B0cy5zX2NvbW1pdF9pbnRlcnZhbCA9IHNiaS0+c19jb21taXRfaW50ZXJ2YWw7CisJb2xkX29wdHMuc19taW5fYmF0Y2hfdGltZSA9IHNiaS0+c19taW5fYmF0Y2hfdGltZTsKKwlvbGRfb3B0cy5zX21heF9iYXRjaF90aW1lID0gc2JpLT5zX21heF9iYXRjaF90aW1lOwogI2lmZGVmIENPTkZJR19RVU9UQQogCW9sZF9vcHRzLnNfanF1b3RhX2ZtdCA9IHNiaS0+c19qcXVvdGFfZm10OwogCWZvciAoaSA9IDA7IGkgPCBNQVhRVU9UQVM7IGkrKykKIAkJb2xkX29wdHMuc19xZl9uYW1lc1tpXSA9IHNiaS0+c19xZl9uYW1lc1tpXTsKICNlbmRpZgorCWlmIChzYmktPnNfam91cm5hbCAmJiBzYmktPnNfam91cm5hbC0+al90YXNrLT5pb19jb250ZXh0KQorCQlqb3VybmFsX2lvcHJpbyA9IHNiaS0+c19qb3VybmFsLT5qX3Rhc2stPmlvX2NvbnRleHQtPmlvcHJpbzsKIAogCS8qCiAJICogQWxsb3cgdGhlICJjaGVjayIgb3B0aW9uIHRvIGJlIHBhc3NlZCBhcyBhIHJlbW91bnQgb3B0aW9uLgogCSAqLwotCWlmICghcGFyc2Vfb3B0aW9ucyhkYXRhLCBzYiwgTlVMTCwgTlVMTCwgJm5fYmxvY2tzX2NvdW50LCAxKSkgeworCWlmICghcGFyc2Vfb3B0aW9ucyhkYXRhLCBzYiwgTlVMTCwgJmpvdXJuYWxfaW9wcmlvLAorCQkJICAgJm5fYmxvY2tzX2NvdW50LCAxKSkgewogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIHJlc3RvcmVfb3B0czsKIAl9CkBAIC0yOTkxLDcgKzMxNDYsMTAgQEAKIAogCWVzID0gc2JpLT5zX2VzOwogCi0JZXh0NF9pbml0X2pvdXJuYWxfcGFyYW1zKHNiLCBzYmktPnNfam91cm5hbCk7CisJaWYgKHNiaS0+c19qb3VybmFsKSB7CisJCWV4dDRfaW5pdF9qb3VybmFsX3BhcmFtcyhzYiwgc2JpLT5zX2pvdXJuYWwpOworCQlzZXRfdGFza19pb3ByaW8oc2JpLT5zX2pvdXJuYWwtPmpfdGFzaywgam91cm5hbF9pb3ByaW8pOworCX0KIAogCWlmICgoKmZsYWdzICYgTVNfUkRPTkxZKSAhPSAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpIHx8CiAJCW5fYmxvY2tzX2NvdW50ID4gZXh0NF9ibG9ja3NfY291bnQoZXMpKSB7CkBAIC0zMDIwLDE3ICszMTc4LDIwIEBACiAJCQkgKiBXZSBoYXZlIHRvIHVubG9jayBzdXBlciBzbyB0aGF0IHdlIGNhbiB3YWl0IGZvcgogCQkJICogdHJhbnNhY3Rpb25zLgogCQkJICovCi0JCQl1bmxvY2tfc3VwZXIoc2IpOwotCQkJZXh0NF9tYXJrX3JlY292ZXJ5X2NvbXBsZXRlKHNiLCBlcyk7Ci0JCQlsb2NrX3N1cGVyKHNiKTsKKwkJCWlmIChzYmktPnNfam91cm5hbCkgeworCQkJCXVubG9ja19zdXBlcihzYik7CisJCQkJZXh0NF9tYXJrX3JlY292ZXJ5X2NvbXBsZXRlKHNiLCBlcyk7CisJCQkJbG9ja19zdXBlcihzYik7CisJCQl9CiAJCX0gZWxzZSB7Ci0JCQlfX2xlMzIgcmV0OworCQkJaW50IHJldDsKIAkJCWlmICgocmV0ID0gRVhUNF9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsCiAJCQkJCX5FWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX1NVUFApKSkgewogCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVYVDQtZnM6ICVzOiBjb3VsZG4ndCAiCiAJCQkJICAgICAgICJyZW1vdW50IFJEV1IgYmVjYXVzZSBvZiB1bnN1cHBvcnRlZCAiCi0JCQkJICAgICAgICJvcHRpb25hbCBmZWF0dXJlcyAoJXgpLlxuIiwKLQkJCQkgICAgICAgc2ItPnNfaWQsIGxlMzJfdG9fY3B1KHJldCkpOworCQkJCSAgICAgICAib3B0aW9uYWwgZmVhdHVyZXMgKCV4KS5cbiIsIHNiLT5zX2lkLAorCQkJCShsZTMyX3RvX2NwdShzYmktPnNfZXMtPnNfZmVhdHVyZV9yb19jb21wYXQpICYKKwkJCQkJfkVYVDRfRkVBVFVSRV9ST19DT01QQVRfU1VQUCkpOwogCQkJCWVyciA9IC1FUk9GUzsKIAkJCQlnb3RvIHJlc3RvcmVfb3B0czsKIAkJCX0KQEAgLTMwNDcsNyArMzIwOCw3IEBACiAJCQkJaWYgKCFleHQ0X2dyb3VwX2Rlc2NfY3N1bV92ZXJpZnkoc2JpLCBnLCBnZHApKSB7CiAJCQkJCXByaW50ayhLRVJOX0VSUgogCSAgICAgICAiRVhUNC1mczogZXh0NF9yZW1vdW50OiAiCi0JCSJDaGVja3N1bSBmb3IgZ3JvdXAgJWx1IGZhaWxlZCAoJXUhPSV1KVxuIiwKKwkJIkNoZWNrc3VtIGZvciBncm91cCAldSBmYWlsZWQgKCV1IT0ldSlcbiIsCiAJCWcsIGxlMTZfdG9fY3B1KGV4dDRfZ3JvdXBfZGVzY19jc3VtKHNiaSwgZywgZ2RwKSksCiAJCQkJCSAgICAgICBsZTE2X3RvX2NwdShnZHAtPmJnX2NoZWNrc3VtKSk7CiAJCQkJCWVyciA9IC1FSU5WQUw7CkBAIC0zMDc2LDcgKzMyMzcsOCBAQAogCQkJICogYmVlbiBjaGFuZ2VkIGJ5IGUyZnNjayBzaW5jZSB3ZSBvcmlnaW5hbGx5IG1vdW50ZWQKIAkJCSAqIHRoZSBwYXJ0aXRpb24uKQogCQkJICovCi0JCQlleHQ0X2NsZWFyX2pvdXJuYWxfZXJyKHNiLCBlcyk7CisJCQlpZiAoc2JpLT5zX2pvdXJuYWwpCisJCQkJZXh0NF9jbGVhcl9qb3VybmFsX2VycihzYiwgZXMpOwogCQkJc2JpLT5zX21vdW50X3N0YXRlID0gbGUxNl90b19jcHUoZXMtPnNfc3RhdGUpOwogCQkJaWYgKChlcnIgPSBleHQ0X2dyb3VwX2V4dGVuZChzYiwgZXMsIG5fYmxvY2tzX2NvdW50KSkpCiAJCQkJZ290byByZXN0b3JlX29wdHM7CkBAIC0zMDg0LDYgKzMyNDYsOSBAQAogCQkJCXNiLT5zX2ZsYWdzICY9IH5NU19SRE9OTFk7CiAJCX0KIAl9CisJaWYgKHNiaS0+c19qb3VybmFsID09IE5VTEwpCisJCWV4dDRfY29tbWl0X3N1cGVyKHNiLCBlcywgMSk7CisKICNpZmRlZiBDT05GSUdfUVVPVEEKIAkvKiBSZWxlYXNlIG9sZCBxdW90YSBmaWxlIG5hbWVzICovCiAJZm9yIChpID0gMDsgaSA8IE1BWFFVT1RBUzsgaSsrKQpAQCAtMzA5OCw2ICszMjYzLDggQEAKIAlzYmktPnNfcmVzdWlkID0gb2xkX29wdHMuc19yZXN1aWQ7CiAJc2JpLT5zX3Jlc2dpZCA9IG9sZF9vcHRzLnNfcmVzZ2lkOwogCXNiaS0+c19jb21taXRfaW50ZXJ2YWwgPSBvbGRfb3B0cy5zX2NvbW1pdF9pbnRlcnZhbDsKKwlzYmktPnNfbWluX2JhdGNoX3RpbWUgPSBvbGRfb3B0cy5zX21pbl9iYXRjaF90aW1lOworCXNiaS0+c19tYXhfYmF0Y2hfdGltZSA9IG9sZF9vcHRzLnNfbWF4X2JhdGNoX3RpbWU7CiAjaWZkZWYgQ09ORklHX1FVT1RBCiAJc2JpLT5zX2pxdW90YV9mbXQgPSBvbGRfb3B0cy5zX2pxdW90YV9mbXQ7CiAJZm9yIChpID0gMDsgaSA8IE1BWFFVT1RBUzsgaSsrKSB7CkBAIC0zMzYwLDcgKzM1MjcsOCBAQAogCSAqIFdoZW4gd2Ugam91cm5hbCBkYXRhIG9uIHF1b3RhIGZpbGUsIHdlIGhhdmUgdG8gZmx1c2ggam91cm5hbCB0byBzZWUKIAkgKiBhbGwgdXBkYXRlcyB0byB0aGUgZmlsZSB3aGVuIHdlIGJ5cGFzcyBwYWdlY2FjaGUuLi4KIAkgKi8KLQlpZiAoZXh0NF9zaG91bGRfam91cm5hbF9kYXRhKHBhdGguZGVudHJ5LT5kX2lub2RlKSkgeworCWlmIChFWFQ0X1NCKHNiKS0+c19qb3VybmFsICYmCisJICAgIGV4dDRfc2hvdWxkX2pvdXJuYWxfZGF0YShwYXRoLmRlbnRyeS0+ZF9pbm9kZSkpIHsKIAkJLyoKIAkJICogV2UgZG9uJ3QgbmVlZCB0byBsb2NrIHVwZGF0ZXMgYnV0IGpvdXJuYWxfZmx1c2goKSBjb3VsZAogCQkgKiBvdGhlcndpc2UgYmUgbGl2ZWxvY2tlZC4uLgpAQCAtMzQzNCw3ICszNjAyLDcgQEAKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCWhhbmRsZV90ICpoYW5kbGUgPSBqb3VybmFsX2N1cnJlbnRfaGFuZGxlKCk7CiAKLQlpZiAoIWhhbmRsZSkgeworCWlmIChFWFQ0X1NCKHNiKS0+c19qb3VybmFsICYmICFoYW5kbGUpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiRVhUNC1mczogUXVvdGEgd3JpdGUgKG9mZj0lbGx1LCBsZW49JWxsdSkiCiAJCQkiIGNhbmNlbGxlZCBiZWNhdXNlIHRyYW5zYWN0aW9uIGlzIG5vdCBzdGFydGVkLlxuIiwKIAkJCSh1bnNpZ25lZCBsb25nIGxvbmcpb2ZmLCAodW5zaWduZWQgbG9uZyBsb25nKWxlbik7CkBAIC0zNDU5LDcgKzM2MjcsNyBAQAogCQlmbHVzaF9kY2FjaGVfcGFnZShiaC0+Yl9wYWdlKTsKIAkJdW5sb2NrX2J1ZmZlcihiaCk7CiAJCWlmIChqb3VybmFsX3F1b3RhKQotCQkJZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOworCQkJZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBiaCk7CiAJCWVsc2UgewogCQkJLyogQWx3YXlzIGRvIGF0IGxlYXN0IG9yZGVyZWQgd3JpdGVzIGZvciBxdW90YXMgKi8KIAkJCWVyciA9IGV4dDRfamJkMl9maWxlX2lub2RlKGhhbmRsZSwgaW5vZGUpOwpAQCAtMzUxMywxOCArMzY4MSwxNSBAQAogc3RhdGljIHNzaXplX3QgZXh0NF91aV9wcm9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAogCQkJICAgICAgIHNpemVfdCBjbnQsIGxvZmZfdCAqcHBvcykKIHsKLQl1bnNpZ25lZCBpbnQgKnAgPSBQREUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSktPmRhdGE7CisJdW5zaWduZWQgbG9uZyAqcCA9IFBERShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKS0+ZGF0YTsKIAljaGFyIHN0clszMl07Ci0JdW5zaWduZWQgbG9uZyB2YWx1ZTsKIAogCWlmIChjbnQgPj0gc2l6ZW9mKHN0cikpCiAJCXJldHVybiAtRUlOVkFMOwogCWlmIChjb3B5X2Zyb21fdXNlcihzdHIsIGJ1ZiwgY250KSkKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0JdmFsdWUgPSBzaW1wbGVfc3RydG9sKHN0ciwgTlVMTCwgMCk7Ci0JaWYgKHZhbHVlIDwgMCkKLQkJcmV0dXJuIC1FUkFOR0U7Ci0JKnAgPSB2YWx1ZTsKKworCSpwID0gc2ltcGxlX3N0cnRvdWwoc3RyLCBOVUxMLCAwKTsKIAlyZXR1cm4gY250OwogfQogCkBAIC0zNjE1LDcgKzM3ODAsNyBAQAogfQogCiBNT0RVTEVfQVVUSE9SKCJSZW15IENhcmQsIFN0ZXBoZW4gVHdlZWRpZSwgQW5kcmV3IE1vcnRvbiwgQW5kcmVhcyBEaWxnZXIsIFRoZW9kb3JlIFRzJ28gYW5kIG90aGVycyIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJGb3VydGggRXh0ZW5kZWQgRmlsZXN5c3RlbSB3aXRoIGV4dGVudHMiKTsKK01PRFVMRV9ERVNDUklQVElPTigiRm91cnRoIEV4dGVuZGVkIEZpbGVzeXN0ZW0iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIG1vZHVsZV9pbml0KGluaXRfZXh0NF9mcykKIG1vZHVsZV9leGl0KGV4aXRfZXh0NF9mcykKZGlmZiAtLWdpdCBhL2ZzL2V4dDQveGF0dHIuYyBiL2ZzL2V4dDQveGF0dHIuYwppbmRleCA4MDYyNmQ1Li4xNTdjZTY1IDEwMDY0NAotLS0gYS9mcy9leHQ0L3hhdHRyLmMKKysrIGIvZnMvZXh0NC94YXR0ci5jCkBAIC00NTcsNyArNDU3LDcgQEAKIAlpZiAoZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBFWFQ0X1NCKHNiKS0+c19zYmgpID09IDApIHsKIAkJRVhUNF9TRVRfQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9DT01QQVRfRVhUX0FUVFIpOwogCQlzYi0+c19kaXJ0ID0gMTsKLQkJZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgRVhUNF9TQihzYiktPnNfc2JoKTsKKwkJZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBFWFQ0X1NCKHNiKS0+c19zYmgpOwogCX0KIH0KIApAQCAtNDg3LDkgKzQ4Nyw5IEBACiAJCWV4dDRfZm9yZ2V0KGhhbmRsZSwgMSwgaW5vZGUsIGJoLCBiaC0+Yl9ibG9ja25yKTsKIAl9IGVsc2UgewogCQlsZTMyX2FkZF9jcHUoJkJIRFIoYmgpLT5oX3JlZmNvdW50LCAtMSk7Ci0JCWVycm9yID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOworCQllcnJvciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgaW5vZGUsIGJoKTsKIAkJaWYgKElTX1NZTkMoaW5vZGUpKQotCQkJaGFuZGxlLT5oX3N5bmMgPSAxOworCQkJZXh0NF9oYW5kbGVfc3luYyhoYW5kbGUpOwogCQlEUVVPVF9GUkVFX0JMT0NLKGlub2RlLCAxKTsKIAkJZWFfYmRlYnVnKGJoLCAicmVmY291bnQgbm93PSVkOyByZWxlYXNpbmciLAogCQkJICBsZTMyX3RvX2NwdShCSERSKGJoKS0+aF9yZWZjb3VudCkpOwpAQCAtNzI0LDggKzcyNCw5IEBACiAJCQlpZiAoZXJyb3IgPT0gLUVJTykKIAkJCQlnb3RvIGJhZF9ibG9jazsKIAkJCWlmICghZXJyb3IpCi0JCQkJZXJyb3IgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLAotCQkJCQkJCQkgICAgYnMtPmJoKTsKKwkJCQllcnJvciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwKKwkJCQkJCQkJICAgaW5vZGUsCisJCQkJCQkJCSAgIGJzLT5iaCk7CiAJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBjbGVhbnVwOwogCQkJZ290byBpbnNlcnRlZDsKQEAgLTc5NCw4ICs3OTUsOSBAQAogCQkJCWVhX2JkZWJ1ZyhuZXdfYmgsICJyZXVzaW5nOyByZWZjb3VudCBub3c9JWQiLAogCQkJCQlsZTMyX3RvX2NwdShCSERSKG5ld19iaCktPmhfcmVmY291bnQpKTsKIAkJCQl1bmxvY2tfYnVmZmVyKG5ld19iaCk7Ci0JCQkJZXJyb3IgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLAotCQkJCQkJCQkgICAgbmV3X2JoKTsKKwkJCQllcnJvciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwKKwkJCQkJCQkJICAgaW5vZGUsCisJCQkJCQkJCSAgIG5ld19iaCk7CiAJCQkJaWYgKGVycm9yKQogCQkJCQlnb3RvIGNsZWFudXBfZHF1b3Q7CiAJCQl9CkBAIC04MTAsOCArODEyLDggQEAKIAkJCS8qIFdlIG5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgYmxvY2sgKi8KIAkJCWV4dDRfZnNibGtfdCBnb2FsID0gZXh0NF9ncm91cF9maXJzdF9ibG9ja19ubyhzYiwKIAkJCQkJCUVYVDRfSShpbm9kZSktPmlfYmxvY2tfZ3JvdXApOwotCQkJZXh0NF9mc2Jsa190IGJsb2NrID0gZXh0NF9uZXdfbWV0YV9ibG9jayhoYW5kbGUsIGlub2RlLAotCQkJCQkJCWdvYWwsICZlcnJvcik7CisJCQlleHQ0X2ZzYmxrX3QgYmxvY2sgPSBleHQ0X25ld19tZXRhX2Jsb2NrcyhoYW5kbGUsIGlub2RlLAorCQkJCQkJICBnb2FsLCBOVUxMLCAmZXJyb3IpOwogCQkJaWYgKGVycm9yKQogCQkJCWdvdG8gY2xlYW51cDsKIAkJCWVhX2lkZWJ1Zyhpbm9kZSwgImNyZWF0aW5nIGJsb2NrICVkIiwgYmxvY2spOwpAQCAtODMzLDcgKzgzNSw4IEBACiAJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKG5ld19iaCk7CiAJCQl1bmxvY2tfYnVmZmVyKG5ld19iaCk7CiAJCQlleHQ0X3hhdHRyX2NhY2hlX2luc2VydChuZXdfYmgpOwotCQkJZXJyb3IgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBuZXdfYmgpOworCQkJZXJyb3IgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsCisJCQkJCQkJICAgaW5vZGUsIG5ld19iaCk7CiAJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBjbGVhbnVwOwogCQl9CkBAIC0xMDQwLDcgKzEwNDMsNyBAQAogCQkgKi8KIAkJaXMuaWxvYy5iaCA9IE5VTEw7CiAJCWlmIChJU19TWU5DKGlub2RlKSkKLQkJCWhhbmRsZS0+aF9zeW5jID0gMTsKKwkJCWV4dDRfaGFuZGxlX3N5bmMoaGFuZGxlKTsKIAl9CiAKIGNsZWFudXA6CmRpZmYgLS1naXQgYS9mcy9maWxlc3lzdGVtcy5jIGIvZnMvZmlsZXN5c3RlbXMuYwppbmRleCBkMGUyMGNlLi5kNDg4ZGNkIDEwMDY0NAotLS0gYS9mcy9maWxlc3lzdGVtcy5jCisrKyBiL2ZzL2ZpbGVzeXN0ZW1zLmMKQEAgLTI1MywyNCArMjUzLDI3IEBACiBtb2R1bGVfaW5pdChwcm9jX2ZpbGVzeXN0ZW1zX2luaXQpOwogI2VuZGlmCiAKLXN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpnZXRfZnNfdHlwZShjb25zdCBjaGFyICpuYW1lKQorc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpfX2dldF9mc190eXBlKGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4pCiB7CiAJc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzOwotCWNvbnN0IGNoYXIgKmRvdCA9IHN0cmNocihuYW1lLCAnLicpOwotCXVuc2lnbmVkIGxlbiA9IGRvdCA/IGRvdCAtIG5hbWUgOiBzdHJsZW4obmFtZSk7CiAKIAlyZWFkX2xvY2soJmZpbGVfc3lzdGVtc19sb2NrKTsKIAlmcyA9ICooZmluZF9maWxlc3lzdGVtKG5hbWUsIGxlbikpOwogCWlmIChmcyAmJiAhdHJ5X21vZHVsZV9nZXQoZnMtPm93bmVyKSkKIAkJZnMgPSBOVUxMOwogCXJlYWRfdW5sb2NrKCZmaWxlX3N5c3RlbXNfbG9jayk7Ci0JaWYgKCFmcyAmJiAocmVxdWVzdF9tb2R1bGUoIiUuKnMiLCBsZW4sIG5hbWUpID09IDApKSB7Ci0JCXJlYWRfbG9jaygmZmlsZV9zeXN0ZW1zX2xvY2spOwotCQlmcyA9ICooZmluZF9maWxlc3lzdGVtKG5hbWUsIGxlbikpOwotCQlpZiAoZnMgJiYgIXRyeV9tb2R1bGVfZ2V0KGZzLT5vd25lcikpCi0JCQlmcyA9IE5VTEw7Ci0JCXJlYWRfdW5sb2NrKCZmaWxlX3N5c3RlbXNfbG9jayk7Ci0JfQorCXJldHVybiBmczsKK30KKworc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmdldF9mc190eXBlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzOworCWNvbnN0IGNoYXIgKmRvdCA9IHN0cmNocihuYW1lLCAnLicpOworCWludCBsZW4gPSBkb3QgPyBkb3QgLSBuYW1lIDogc3RybGVuKG5hbWUpOworCisJZnMgPSBfX2dldF9mc190eXBlKG5hbWUsIGxlbik7CisJaWYgKCFmcyAmJiAocmVxdWVzdF9tb2R1bGUoIiUuKnMiLCBsZW4sIG5hbWUpID09IDApKQorCQlmcyA9IF9fZ2V0X2ZzX3R5cGUobmFtZSwgbGVuKTsKIAogCWlmIChkb3QgJiYgZnMgJiYgIShmcy0+ZnNfZmxhZ3MgJiBGU19IQVNfU1VCVFlQRSkpIHsKIAkJcHV0X2ZpbGVzeXN0ZW0oZnMpOwpkaWZmIC0tZ2l0IGEvZnMvZnMtd3JpdGViYWNrLmMgYi9mcy9mcy13cml0ZWJhY2suYwppbmRleCBkMGZmMGI4Li5lNWVhYTYyIDEwMDY0NAotLS0gYS9mcy9mcy13cml0ZWJhY2suYworKysgYi9mcy9mcy13cml0ZWJhY2suYwpAQCAtNDIxLDkgKzQyMSw2IEBACiAgKiBJZiB3ZSdyZSBhIHBkbGZ1c2ggdGhyZWFkLCB0aGVuIGltcGxlbWVudCBwZGZsdXNoIGNvbGxpc2lvbiBhdm9pZGFuY2UKICAqIGFnYWluc3QgdGhlIGVudGlyZSBsaXN0LgogICoKLSAqIFdCX1NZTkNfSE9MRCBpcyBhIGhhY2sgZm9yIHN5c19zeW5jKCk6IHJlYXR0YWNoIHRoZSBpbm9kZSB0byBzYi0+c19kaXJ0eSBzbwotICogdGhhdCBpdCBjYW4gYmUgbG9jYXRlZCBmb3Igd2FpdGluZyBvbiBpbiBfX3dyaXRlYmFja19zaW5nbGVfaW5vZGUoKS4KLSAqCiAgKiBJZiBgYmRpJyBpcyBub24temVybyB0aGVuIHdlJ3JlIGJlaW5nIGFza2VkIHRvIHdyaXRlYmFjayBhIHNwZWNpZmljIHF1ZXVlLgogICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgdGhlIGJsb2NrZGV2IHN1cGVyYmxvY2sncyBpbm9kZXMgYXJlIGJhY2tlZCBieQogICogYSB2YXJpZXR5IG9mIHF1ZXVlcywgc28gYWxsIGlub2RlcyBhcmUgc2VhcmNoZWQuICBGb3Igb3RoZXIgc3VwZXJibG9ja3MsCkBAIC00NDMsNiArNDQwLDcgQEAKIAkJCQlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKIHsKIAljb25zdCB1bnNpZ25lZCBsb25nIHN0YXJ0ID0gamlmZmllczsJLyogbGl2ZWxvY2sgYXZvaWRhbmNlICovCisJaW50IHN5bmMgPSB3YmMtPnN5bmNfbW9kZSA9PSBXQl9TWU5DX0FMTDsKIAogCXNwaW5fbG9jaygmaW5vZGVfbG9jayk7CiAJaWYgKCF3YmMtPmZvcl9rdXBkYXRlIHx8IGxpc3RfZW1wdHkoJnNiLT5zX2lvKSkKQEAgLTQ5OSwxMCArNDk3LDYgQEAKIAkJX19pZ2V0KGlub2RlKTsKIAkJcGFnZXNfc2tpcHBlZCA9IHdiYy0+cGFnZXNfc2tpcHBlZDsKIAkJX193cml0ZWJhY2tfc2luZ2xlX2lub2RlKGlub2RlLCB3YmMpOwotCQlpZiAod2JjLT5zeW5jX21vZGUgPT0gV0JfU1lOQ19IT0xEKSB7Ci0JCQlpbm9kZS0+ZGlydGllZF93aGVuID0gamlmZmllczsKLQkJCWxpc3RfbW92ZSgmaW5vZGUtPmlfbGlzdCwgJnNiLT5zX2RpcnR5KTsKLQkJfQogCQlpZiAoY3VycmVudF9pc19wZGZsdXNoKCkpCiAJCQl3cml0ZWJhY2tfcmVsZWFzZShiZGkpOwogCQlpZiAod2JjLT5wYWdlc19za2lwcGVkICE9IHBhZ2VzX3NraXBwZWQpIHsKQEAgLTUyMyw3ICs1MTcsNDkgQEAKIAkJaWYgKCFsaXN0X2VtcHR5KCZzYi0+c19tb3JlX2lvKSkKIAkJCXdiYy0+bW9yZV9pbyA9IDE7CiAJfQotCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKKworCWlmIChzeW5jKSB7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGUsICpvbGRfaW5vZGUgPSBOVUxMOworCisJCS8qCisJCSAqIERhdGEgaW50ZWdyaXR5IHN5bmMuIE11c3Qgd2FpdCBmb3IgYWxsIHBhZ2VzIHVuZGVyIHdyaXRlYmFjaywKKwkJICogYmVjYXVzZSB0aGVyZSBtYXkgaGF2ZSBiZWVuIHBhZ2VzIGRpcnRpZWQgYmVmb3JlIG91ciBzeW5jCisJCSAqIGNhbGwsIGJ1dCB3aGljaCBoYWQgd3JpdGVvdXQgc3RhcnRlZCBiZWZvcmUgd2Ugd3JpdGUgaXQgb3V0LgorCQkgKiBJbiB3aGljaCBjYXNlLCB0aGUgaW5vZGUgbWF5IG5vdCBiZSBvbiB0aGUgZGlydHkgbGlzdCwgYnV0CisJCSAqIHdlIHN0aWxsIGhhdmUgdG8gd2FpdCBmb3IgdGhhdCB3cml0ZW91dC4KKwkJICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoaW5vZGUsICZzYi0+c19pbm9kZXMsIGlfc2JfbGlzdCkgeworCQkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7CisKKwkJCWlmIChpbm9kZS0+aV9zdGF0ZSAmIChJX0ZSRUVJTkd8SV9XSUxMX0ZSRUUpKQorCQkJCWNvbnRpbnVlOworCQkJbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CisJCQlpZiAobWFwcGluZy0+bnJwYWdlcyA9PSAwKQorCQkJCWNvbnRpbnVlOworCQkJX19pZ2V0KGlub2RlKTsKKwkJCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKKwkJCS8qCisJCQkgKiBXZSBob2xkIGEgcmVmZXJlbmNlIHRvICdpbm9kZScgc28gaXQgY291bGRuJ3QgaGF2ZQorCQkJICogYmVlbiByZW1vdmVkIGZyb20gc19pbm9kZXMgbGlzdCB3aGlsZSB3ZSBkcm9wcGVkIHRoZQorCQkJICogaW5vZGVfbG9jay4gIFdlIGNhbm5vdCBpcHV0IHRoZSBpbm9kZSBub3cgYXMgd2UgY2FuCisJCQkgKiBiZSBob2xkaW5nIHRoZSBsYXN0IHJlZmVyZW5jZSBhbmQgd2UgY2Fubm90IGlwdXQgaXQKKwkJCSAqIHVuZGVyIGlub2RlX2xvY2suIFNvIHdlIGtlZXAgdGhlIHJlZmVyZW5jZSBhbmQgaXB1dAorCQkJICogaXQgbGF0ZXIuCisJCQkgKi8KKwkJCWlwdXQob2xkX2lub2RlKTsKKwkJCW9sZF9pbm9kZSA9IGlub2RlOworCisJCQlmaWxlbWFwX2ZkYXRhd2FpdChtYXBwaW5nKTsKKworCQkJY29uZF9yZXNjaGVkKCk7CisKKwkJCXNwaW5fbG9jaygmaW5vZGVfbG9jayk7CisJCX0KKwkJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworCQlpcHV0KG9sZF9pbm9kZSk7CisJfSBlbHNlCisJCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKKwogCXJldHVybjsJCS8qIExlYXZlIGFueSB1bndyaXR0ZW4gaW5vZGVzIG9uIHNfaW8gKi8KIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGdlbmVyaWNfc3luY19zYl9pbm9kZXMpOwpAQCAtNTg4LDggKzYyNCw3IEBACiAKIC8qCiAgKiB3cml0ZWJhY2sgYW5kIHdhaXQgdXBvbiB0aGUgZmlsZXN5c3RlbSdzIGRpcnR5IGlub2Rlcy4gIFRoZSBjYWxsZXIgd2lsbAotICogZG8gdGhpcyBpbiB0d28gcGFzc2VzIC0gb25lIHRvIHdyaXRlLCBhbmQgb25lIHRvIHdhaXQuICBXQl9TWU5DX0hPTEQgaXMKLSAqIHVzZWQgdG8gcGFyayB0aGUgd3JpdHRlbiBpbm9kZXMgb24gc2ItPnNfZGlydHkgZm9yIHRoZSB3YWl0IHBhc3MuCisgKiBkbyB0aGlzIGluIHR3byBwYXNzZXMgLSBvbmUgdG8gd3JpdGUsIGFuZCBvbmUgdG8gd2FpdC4KICAqCiAgKiBBIGZpbml0ZSBsaW1pdCBpcyBzZXQgb24gdGhlIG51bWJlciBvZiBwYWdlcyB3aGljaCB3aWxsIGJlIHdyaXR0ZW4uCiAgKiBUbyBwcmV2ZW50IGluZmluaXRlIGxpdmVsb2NrIG9mIHN5c19zeW5jKCkuCkBAIC02MDAsMzIgKzYzNSwyMyBAQAogdm9pZCBzeW5jX2lub2Rlc19zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgd2FpdCkKIHsKIAlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgd2JjID0gewotCQkuc3luY19tb2RlCT0gd2FpdCA/IFdCX1NZTkNfQUxMIDogV0JfU1lOQ19IT0xELAorCQkuc3luY19tb2RlCT0gd2FpdCA/IFdCX1NZTkNfQUxMIDogV0JfU1lOQ19OT05FLAogCQkucmFuZ2Vfc3RhcnQJPSAwLAogCQkucmFuZ2VfZW5kCT0gTExPTkdfTUFYLAogCX07Ci0JdW5zaWduZWQgbG9uZyBucl9kaXJ0eSA9IGdsb2JhbF9wYWdlX3N0YXRlKE5SX0ZJTEVfRElSVFkpOwotCXVuc2lnbmVkIGxvbmcgbnJfdW5zdGFibGUgPSBnbG9iYWxfcGFnZV9zdGF0ZShOUl9VTlNUQUJMRV9ORlMpOwogCi0Jd2JjLm5yX3RvX3dyaXRlID0gbnJfZGlydHkgKyBucl91bnN0YWJsZSArCi0JCQkoaW5vZGVzX3N0YXQubnJfaW5vZGVzIC0gaW5vZGVzX3N0YXQubnJfdW51c2VkKSArCi0JCQlucl9kaXJ0eSArIG5yX3Vuc3RhYmxlOwotCXdiYy5ucl90b193cml0ZSArPSB3YmMubnJfdG9fd3JpdGUgLyAyOwkJLyogQml0IG1vcmUgZm9yIGx1Y2sgKi8KKwlpZiAoIXdhaXQpIHsKKwkJdW5zaWduZWQgbG9uZyBucl9kaXJ0eSA9IGdsb2JhbF9wYWdlX3N0YXRlKE5SX0ZJTEVfRElSVFkpOworCQl1bnNpZ25lZCBsb25nIG5yX3Vuc3RhYmxlID0gZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfVU5TVEFCTEVfTkZTKTsKKworCQl3YmMubnJfdG9fd3JpdGUgPSBucl9kaXJ0eSArIG5yX3Vuc3RhYmxlICsKKwkJCShpbm9kZXNfc3RhdC5ucl9pbm9kZXMgLSBpbm9kZXNfc3RhdC5ucl91bnVzZWQpOworCX0gZWxzZQorCQl3YmMubnJfdG9fd3JpdGUgPSBMT05HX01BWDsgLyogZG9lc24ndCBhY3R1YWxseSBtYXR0ZXIgKi8KKwogCXN5bmNfc2JfaW5vZGVzKHNiLCAmd2JjKTsKIH0KIAotLyoKLSAqIFJhdGhlciBsYW1lIGxpdmVsb2NrIGF2b2lkYW5jZS4KLSAqLwotc3RhdGljIHZvaWQgc2V0X3NiX3N5bmNpbmcoaW50IHZhbCkKLXsKLQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOwotCXNwaW5fbG9jaygmc2JfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKHNiLCAmc3VwZXJfYmxvY2tzLCBzX2xpc3QpCi0JCXNiLT5zX3N5bmNpbmcgPSB2YWw7Ci0Jc3Bpbl91bmxvY2soJnNiX2xvY2spOwotfQotCiAvKioKICAqIHN5bmNfaW5vZGVzIC0gd3JpdGVzIGFsbCBpbm9kZXMgdG8gZGlzawogICogQHdhaXQ6IHdhaXQgZm9yIGNvbXBsZXRpb24KQEAgLTY1Miw5ICs2NzgsNiBAQAogCXNwaW5fbG9jaygmc2JfbG9jayk7CiByZXN0YXJ0OgogCWxpc3RfZm9yX2VhY2hfZW50cnkoc2IsICZzdXBlcl9ibG9ja3MsIHNfbGlzdCkgewotCQlpZiAoc2ItPnNfc3luY2luZykKLQkJCWNvbnRpbnVlOwotCQlzYi0+c19zeW5jaW5nID0gMTsKIAkJc2ItPnNfY291bnQrKzsKIAkJc3Bpbl91bmxvY2soJnNiX2xvY2spOwogCQlkb3duX3JlYWQoJnNiLT5zX3Vtb3VudCk7CkBAIC02NzIsMTMgKzY5NSwxMCBAQAogCiB2b2lkIHN5bmNfaW5vZGVzKGludCB3YWl0KQogewotCXNldF9zYl9zeW5jaW5nKDApOwogCV9fc3luY19pbm9kZXMoMCk7CiAKLQlpZiAod2FpdCkgewotCQlzZXRfc2Jfc3luY2luZygwKTsKKwlpZiAod2FpdCkKIAkJX19zeW5jX2lub2RlcygxKTsKLQl9CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZnMvZnVzZS9jb250cm9sLmMgYi9mcy9mdXNlL2NvbnRyb2wuYwppbmRleCA0ZjNjYWIzLi45OWM5OWRmIDEwMDY0NAotLS0gYS9mcy9mdXNlL2NvbnRyb2wuYworKysgYi9mcy9mdXNlL2NvbnRyb2wuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgIEZVU0U6IEZpbGVzeXN0ZW0gaW4gVXNlcnNwYWNlCi0gIENvcHlyaWdodCAoQykgMjAwMS0yMDA2ICBNaWtsb3MgU3plcmVkaSA8bWlrbG9zQHN6ZXJlZGkuaHU+CisgIENvcHlyaWdodCAoQykgMjAwMS0yMDA4ICBNaWtsb3MgU3plcmVkaSA8bWlrbG9zQHN6ZXJlZGkuaHU+CiAKICAgVGhpcyBwcm9ncmFtIGNhbiBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwuCiAgIFNlZSB0aGUgZmlsZSBDT1BZSU5HLgpAQCAtNDgsMTEgKzQ4LDEzIEBACiAJc2l6ZV90IHNpemU7CiAKIAlpZiAoISpwcG9zKSB7CisJCWxvbmcgdmFsdWU7CiAJCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZnVzZV9jdGxfZmlsZV9jb25uX2dldChmaWxlKTsKIAkJaWYgKCFmYykKIAkJCXJldHVybiAwOwogCi0JCWZpbGUtPnByaXZhdGVfZGF0YT0odm9pZCAqKShsb25nKWF0b21pY19yZWFkKCZmYy0+bnVtX3dhaXRpbmcpOworCQl2YWx1ZSA9IGF0b21pY19yZWFkKCZmYy0+bnVtX3dhaXRpbmcpOworCQlmaWxlLT5wcml2YXRlX2RhdGEgPSAodm9pZCAqKXZhbHVlOwogCQlmdXNlX2Nvbm5fcHV0KGZjKTsKIAl9CiAJc2l6ZSA9IHNwcmludGYodG1wLCAiJWxkXG4iLCAobG9uZylmaWxlLT5wcml2YXRlX2RhdGEpOwpkaWZmIC0tZ2l0IGEvZnMvZnVzZS9kZXYuYyBiL2ZzL2Z1c2UvZGV2LmMKaW5kZXggZmJhNTcxNi4uZTBjN2FkYSAxMDA2NDQKLS0tIGEvZnMvZnVzZS9kZXYuYworKysgYi9mcy9mdXNlL2Rldi5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAgRlVTRTogRmlsZXN5c3RlbSBpbiBVc2Vyc3BhY2UKLSAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgIE1pa2xvcyBTemVyZWRpIDxtaWtsb3NAc3plcmVkaS5odT4KKyAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggIE1pa2xvcyBTemVyZWRpIDxtaWtsb3NAc3plcmVkaS5odT4KIAogICBUaGlzIHByb2dyYW0gY2FuIGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTC4KICAgU2VlIHRoZSBmaWxlIENPUFlJTkcuCkBAIC0yNjksNyArMjY5LDcgQEAKICAqIENhbGxlZCB3aXRoIGZjLT5sb2NrLCB1bmxvY2tzIGl0CiAgKi8KIHN0YXRpYyB2b2lkIHJlcXVlc3RfZW5kKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKLQlfX3JlbGVhc2VzKGZjLT5sb2NrKQorX19yZWxlYXNlcygmZmMtPmxvY2spCiB7CiAJdm9pZCAoKmVuZCkgKHN0cnVjdCBmdXNlX2Nvbm4gKiwgc3RydWN0IGZ1c2VfcmVxICopID0gcmVxLT5lbmQ7CiAJcmVxLT5lbmQgPSBOVUxMOwpAQCAtMjkzLDEzICsyOTMsMTMgQEAKIAl3YWtlX3VwKCZyZXEtPndhaXRxKTsKIAlpZiAoZW5kKQogCQllbmQoZmMsIHJlcSk7Ci0JZWxzZQotCQlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiB9CiAKIHN0YXRpYyB2b2lkIHdhaXRfYW5zd2VyX2ludGVycnVwdGlibGUoc3RydWN0IGZ1c2VfY29ubiAqZmMsCiAJCQkJICAgICAgc3RydWN0IGZ1c2VfcmVxICpyZXEpCi0JX19yZWxlYXNlcyhmYy0+bG9jaykgX19hY3F1aXJlcyhmYy0+bG9jaykKK19fcmVsZWFzZXMoJmZjLT5sb2NrKQorX19hY3F1aXJlcygmZmMtPmxvY2spCiB7CiAJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQogCQlyZXR1cm47CkBAIC0zMTcsNyArMzE3LDggQEAKIH0KIAogc3RhdGljIHZvaWQgcmVxdWVzdF93YWl0X2Fuc3dlcihzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpCi0JX19yZWxlYXNlcyhmYy0+bG9jaykgX19hY3F1aXJlcyhmYy0+bG9jaykKK19fcmVsZWFzZXMoJmZjLT5sb2NrKQorX19hY3F1aXJlcygmZmMtPmxvY2spCiB7CiAJaWYgKCFmYy0+bm9faW50ZXJydXB0KSB7CiAJCS8qIEFueSBzaWduYWwgbWF5IGludGVycnVwdCB0aGlzICovCkBAIC0zODAsNyArMzgxLDcgQEAKIAl9CiB9CiAKLXZvaWQgcmVxdWVzdF9zZW5kKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKK3ZvaWQgZnVzZV9yZXF1ZXN0X3NlbmQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQogewogCXJlcS0+aXNyZXBseSA9IDE7CiAJc3Bpbl9sb2NrKCZmYy0+bG9jayk7CkBAIC0zOTksOCArNDAwLDggQEAKIAlzcGluX3VubG9jaygmZmMtPmxvY2spOwogfQogCi1zdGF0aWMgdm9pZCByZXF1ZXN0X3NlbmRfbm93YWl0X2xvY2tlZChzdHJ1Y3QgZnVzZV9jb25uICpmYywKLQkJCQkgICAgICAgc3RydWN0IGZ1c2VfcmVxICpyZXEpCitzdGF0aWMgdm9pZCBmdXNlX3JlcXVlc3Rfc2VuZF9ub3dhaXRfbG9ja2VkKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLAorCQkJCQkgICAgc3RydWN0IGZ1c2VfcmVxICpyZXEpCiB7CiAJcmVxLT5iYWNrZ3JvdW5kID0gMTsKIAlmYy0+bnVtX2JhY2tncm91bmQrKzsKQEAgLTQxNCwxMSArNDE1LDExIEBACiAJZmx1c2hfYmdfcXVldWUoZmMpOwogfQogCi1zdGF0aWMgdm9pZCByZXF1ZXN0X3NlbmRfbm93YWl0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKK3N0YXRpYyB2b2lkIGZ1c2VfcmVxdWVzdF9zZW5kX25vd2FpdChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpCiB7CiAJc3Bpbl9sb2NrKCZmYy0+bG9jayk7CiAJaWYgKGZjLT5jb25uZWN0ZWQpIHsKLQkJcmVxdWVzdF9zZW5kX25vd2FpdF9sb2NrZWQoZmMsIHJlcSk7CisJCWZ1c2VfcmVxdWVzdF9zZW5kX25vd2FpdF9sb2NrZWQoZmMsIHJlcSk7CiAJCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7CiAJfSBlbHNlIHsKIAkJcmVxLT5vdXQuaC5lcnJvciA9IC1FTk9UQ09OTjsKQEAgLTQyNiwxNiArNDI3LDE2IEBACiAJfQogfQogCi12b2lkIHJlcXVlc3Rfc2VuZF9ub3JlcGx5KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKK3ZvaWQgZnVzZV9yZXF1ZXN0X3NlbmRfbm9yZXBseShzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpCiB7CiAJcmVxLT5pc3JlcGx5ID0gMDsKLQlyZXF1ZXN0X3NlbmRfbm93YWl0KGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kX25vd2FpdChmYywgcmVxKTsKIH0KIAotdm9pZCByZXF1ZXN0X3NlbmRfYmFja2dyb3VuZChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpCit2b2lkIGZ1c2VfcmVxdWVzdF9zZW5kX2JhY2tncm91bmQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQogewogCXJlcS0+aXNyZXBseSA9IDE7Ci0JcmVxdWVzdF9zZW5kX25vd2FpdChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZF9ub3dhaXQoZmMsIHJlcSk7CiB9CiAKIC8qCkBAIC00NDMsMTAgKzQ0NCwxMSBAQAogICoKICAqIGZjLT5jb25uZWN0ZWQgbXVzdCBoYXZlIGJlZW4gY2hlY2tlZCBwcmV2aW91c2x5CiAgKi8KLXZvaWQgcmVxdWVzdF9zZW5kX2JhY2tncm91bmRfbG9ja2VkKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKK3ZvaWQgZnVzZV9yZXF1ZXN0X3NlbmRfYmFja2dyb3VuZF9sb2NrZWQoc3RydWN0IGZ1c2VfY29ubiAqZmMsCisJCQkJCSBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKIHsKIAlyZXEtPmlzcmVwbHkgPSAxOwotCXJlcXVlc3Rfc2VuZF9ub3dhaXRfbG9ja2VkKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kX25vd2FpdF9sb2NrZWQoZmMsIHJlcSk7CiB9CiAKIC8qCkBAIC01MzksOCArNTQxLDggQEAKIAkJQlVHX09OKCFjcy0+bnJfc2Vncyk7CiAJCWNzLT5zZWdsZW4gPSBjcy0+aW92WzBdLmlvdl9sZW47CiAJCWNzLT5hZGRyID0gKHVuc2lnbmVkIGxvbmcpIGNzLT5pb3ZbMF0uaW92X2Jhc2U7Ci0JCWNzLT5pb3YgKys7Ci0JCWNzLT5ucl9zZWdzIC0tOworCQljcy0+aW92Kys7CisJCWNzLT5ucl9zZWdzLS07CiAJfQogCWRvd25fcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKIAllcnIgPSBnZXRfdXNlcl9wYWdlcyhjdXJyZW50LCBjdXJyZW50LT5tbSwgY3MtPmFkZHIsIDEsIGNzLT53cml0ZSwgMCwKQEAgLTU4OSw5ICs1OTEsMTEgQEAKIAkJa3VubWFwX2F0b21pYyhtYXBhZGRyLCBLTV9VU0VSMSk7CiAJfQogCXdoaWxlIChjb3VudCkgewotCQlpbnQgZXJyOwotCQlpZiAoIWNzLT5sZW4gJiYgKGVyciA9IGZ1c2VfY29weV9maWxsKGNzKSkpCi0JCQlyZXR1cm4gZXJyOworCQlpZiAoIWNzLT5sZW4pIHsKKwkJCWludCBlcnIgPSBmdXNlX2NvcHlfZmlsbChjcyk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisJCX0KIAkJaWYgKHBhZ2UpIHsKIAkJCXZvaWQgKm1hcGFkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMSk7CiAJCQl2b2lkICpidWYgPSBtYXBhZGRyICsgb2Zmc2V0OwpAQCAtNjMxLDkgKzYzNSwxMSBAQAogc3RhdGljIGludCBmdXNlX2NvcHlfb25lKHN0cnVjdCBmdXNlX2NvcHlfc3RhdGUgKmNzLCB2b2lkICp2YWwsIHVuc2lnbmVkIHNpemUpCiB7CiAJd2hpbGUgKHNpemUpIHsKLQkJaW50IGVycjsKLQkJaWYgKCFjcy0+bGVuICYmIChlcnIgPSBmdXNlX2NvcHlfZmlsbChjcykpKQotCQkJcmV0dXJuIGVycjsKKwkJaWYgKCFjcy0+bGVuKSB7CisJCQlpbnQgZXJyID0gZnVzZV9jb3B5X2ZpbGwoY3MpOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOworCQl9CiAJCWZ1c2VfY29weV9kbyhjcywgJnZhbCwgJnNpemUpOwogCX0KIAlyZXR1cm4gMDsKQEAgLTY2NCw2ICs2NzAsOCBAQAogCiAvKiBXYWl0IHVudGlsIGEgcmVxdWVzdCBpcyBhdmFpbGFibGUgb24gdGhlIHBlbmRpbmcgbGlzdCAqLwogc3RhdGljIHZvaWQgcmVxdWVzdF93YWl0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjKQorX19yZWxlYXNlcygmZmMtPmxvY2spCitfX2FjcXVpcmVzKCZmYy0+bG9jaykKIHsKIAlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKIApAQCAtNjkxLDcgKzY5OSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgZnVzZV9yZWFkX2ludGVycnVwdChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEsCiAJCQkgICAgICAgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIHVuc2lnbmVkIGxvbmcgbnJfc2VncykKLQlfX3JlbGVhc2VzKGZjLT5sb2NrKQorX19yZWxlYXNlcygmZmMtPmxvY2spCiB7CiAJc3RydWN0IGZ1c2VfY29weV9zdGF0ZSBjczsKIAlzdHJ1Y3QgZnVzZV9pbl9oZWFkZXIgaWg7CkBAIC04MTMsNiArODIxLDM0IEBACiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIGludCBmdXNlX25vdGlmeV9wb2xsKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCB1bnNpZ25lZCBpbnQgc2l6ZSwKKwkJCSAgICBzdHJ1Y3QgZnVzZV9jb3B5X3N0YXRlICpjcykKK3sKKwlzdHJ1Y3QgZnVzZV9ub3RpZnlfcG9sbF93YWtldXBfb3V0IG91dGFyZzsKKwlpbnQgZXJyOworCisJaWYgKHNpemUgIT0gc2l6ZW9mKG91dGFyZykpCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyID0gZnVzZV9jb3B5X29uZShjcywgJm91dGFyZywgc2l6ZW9mKG91dGFyZykpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gZnVzZV9ub3RpZnlfcG9sbF93YWtldXAoZmMsICZvdXRhcmcpOworfQorCitzdGF0aWMgaW50IGZ1c2Vfbm90aWZ5KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBlbnVtIGZ1c2Vfbm90aWZ5X2NvZGUgY29kZSwKKwkJICAgICAgIHVuc2lnbmVkIGludCBzaXplLCBzdHJ1Y3QgZnVzZV9jb3B5X3N0YXRlICpjcykKK3sKKwlzd2l0Y2ggKGNvZGUpIHsKKwljYXNlIEZVU0VfTk9USUZZX1BPTEw6CisJCXJldHVybiBmdXNlX25vdGlmeV9wb2xsKGZjLCBzaXplLCBjcyk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKIC8qIExvb2sgdXAgcmVxdWVzdCBvbiBwcm9jZXNzaW5nIGxpc3QgYnkgdW5pcXVlIElEICovCiBzdGF0aWMgc3RydWN0IGZ1c2VfcmVxICpyZXF1ZXN0X2ZpbmQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHU2NCB1bmlxdWUpCiB7CkBAIC04NzYsOSArOTEyLDIzIEBACiAJZXJyID0gZnVzZV9jb3B5X29uZSgmY3MsICZvaCwgc2l6ZW9mKG9oKSk7CiAJaWYgKGVycikKIAkJZ290byBlcnJfZmluaXNoOworCiAJZXJyID0gLUVJTlZBTDsKLQlpZiAoIW9oLnVuaXF1ZSB8fCBvaC5lcnJvciA8PSAtMTAwMCB8fCBvaC5lcnJvciA+IDAgfHwKLQkgICAgb2gubGVuICE9IG5ieXRlcykKKwlpZiAob2gubGVuICE9IG5ieXRlcykKKwkJZ290byBlcnJfZmluaXNoOworCisJLyoKKwkgKiBaZXJvIG9oLnVuaXF1ZSBpbmRpY2F0ZXMgdW5zb2xpY2l0ZWQgbm90aWZpY2F0aW9uIG1lc3NhZ2UKKwkgKiBhbmQgZXJyb3IgY29udGFpbnMgbm90aWZpY2F0aW9uIGNvZGUuCisJICovCisJaWYgKCFvaC51bmlxdWUpIHsKKwkJZXJyID0gZnVzZV9ub3RpZnkoZmMsIG9oLmVycm9yLCBuYnl0ZXMgLSBzaXplb2Yob2gpLCAmY3MpOworCQlmdXNlX2NvcHlfZmluaXNoKCZjcyk7CisJCXJldHVybiBlcnIgPyBlcnIgOiBuYnl0ZXM7CisJfQorCisJZXJyID0gLUVJTlZBTDsKKwlpZiAob2guZXJyb3IgPD0gLTEwMDAgfHwgb2guZXJyb3IgPiAwKQogCQlnb3RvIGVycl9maW5pc2g7CiAKIAlzcGluX2xvY2soJmZjLT5sb2NrKTsKQEAgLTk2Niw2ICsxMDE2LDggQEAKICAqIFRoaXMgZnVuY3Rpb24gcmVsZWFzZXMgYW5kIHJlYWNxdWlyZXMgZmMtPmxvY2sKICAqLwogc3RhdGljIHZvaWQgZW5kX3JlcXVlc3RzKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQorX19yZWxlYXNlcygmZmMtPmxvY2spCitfX2FjcXVpcmVzKCZmYy0+bG9jaykKIHsKIAl3aGlsZSAoIWxpc3RfZW1wdHkoaGVhZCkpIHsKIAkJc3RydWN0IGZ1c2VfcmVxICpyZXE7CkBAIC05ODgsNyArMTA0MCw4IEBACiAgKiBsb2NrZWQpLgogICovCiBzdGF0aWMgdm9pZCBlbmRfaW9fcmVxdWVzdHMoc3RydWN0IGZ1c2VfY29ubiAqZmMpCi0JX19yZWxlYXNlcyhmYy0+bG9jaykgX19hY3F1aXJlcyhmYy0+bG9jaykKK19fcmVsZWFzZXMoJmZjLT5sb2NrKQorX19hY3F1aXJlcygmZmMtPmxvY2spCiB7CiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZmYy0+aW8pKSB7CiAJCXN0cnVjdCBmdXNlX3JlcSAqcmVxID0KQEAgLTEwMDIsMTEgKzEwNTUsMTEgQEAKIAkJd2FrZV91cCgmcmVxLT53YWl0cSk7CiAJCWlmIChlbmQpIHsKIAkJCXJlcS0+ZW5kID0gTlVMTDsKLQkJCS8qIFRoZSBlbmQgZnVuY3Rpb24gd2lsbCBjb25zdW1lIHRoaXMgcmVmZXJlbmNlICovCiAJCQlfX2Z1c2VfZ2V0X3JlcXVlc3QocmVxKTsKIAkJCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7CiAJCQl3YWl0X2V2ZW50KHJlcS0+d2FpdHEsICFyZXEtPmxvY2tlZCk7CiAJCQllbmQoZmMsIHJlcSk7CisJCQlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwogCQkJc3Bpbl9sb2NrKCZmYy0+bG9jayk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9mcy9mdXNlL2Rpci5jIGIvZnMvZnVzZS9kaXIuYwppbmRleCA5NWJjMjJiLi5mZGZmMzQ2IDEwMDY0NAotLS0gYS9mcy9mdXNlL2Rpci5jCisrKyBiL2ZzL2Z1c2UvZGlyLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICBGVVNFOiBGaWxlc3lzdGVtIGluIFVzZXJzcGFjZQotICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiAgTWlrbG9zIFN6ZXJlZGkgPG1pa2xvc0BzemVyZWRpLmh1PgorICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCAgTWlrbG9zIFN6ZXJlZGkgPG1pa2xvc0BzemVyZWRpLmh1PgogCiAgIFRoaXMgcHJvZ3JhbSBjYW4gYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMLgogICBTZWUgdGhlIGZpbGUgQ09QWUlORy4KQEAgLTE4OSw3ICsxODksNyBAQAogCQlwYXJlbnQgPSBkZ2V0X3BhcmVudChlbnRyeSk7CiAJCWZ1c2VfbG9va3VwX2luaXQoZmMsIHJlcSwgZ2V0X25vZGVfaWQocGFyZW50LT5kX2lub2RlKSwKIAkJCQkgJmVudHJ5LT5kX25hbWUsICZvdXRhcmcpOwotCQlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCQlkcHV0KHBhcmVudCk7CiAJCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CiAJCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CkBAIC0yMDQsNyArMjA0LDcgQEAKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJCXNwaW5fbG9jaygmZmMtPmxvY2spOwotCQkJZmktPm5sb29rdXAgKys7CisJCQlmaS0+bmxvb2t1cCsrOwogCQkJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKIAkJfQogCQlmdXNlX3B1dF9yZXF1ZXN0KGZjLCBmb3JnZXRfcmVxKTsKQEAgLTI4Myw3ICsyODMsNyBAQAogCWF0dHJfdmVyc2lvbiA9IGZ1c2VfZ2V0X2F0dHJfdmVyc2lvbihmYyk7CiAKIAlmdXNlX2xvb2t1cF9pbml0KGZjLCByZXEsIG5vZGVpZCwgbmFtZSwgb3V0YXJnKTsKLQlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKIAlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwogCS8qIFplcm8gbm9kZWlkIGlzIHNhbWUgYXMgLUVOT0VOVCwgYnV0IHdpdGggdmFsaWQgdGltZW91dCAqLwpAQCAtMzY5LDcgKzM2OSw3IEBACiB7CiAJZnVzZV9yZWxlYXNlX2ZpbGwoZmYsIG5vZGVpZCwgZmxhZ3MsIEZVU0VfUkVMRUFTRSk7CiAJZmYtPnJlc2VydmVkX3JlcS0+Zm9yY2UgPSAxOwotCXJlcXVlc3Rfc2VuZChmYywgZmYtPnJlc2VydmVkX3JlcSk7CisJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIGZmLT5yZXNlcnZlZF9yZXEpOwogCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIGZmLT5yZXNlcnZlZF9yZXEpOwogCWtmcmVlKGZmKTsKIH0KQEAgLTQwOCw3ICs0MDgsNyBAQAogCQlnb3RvIG91dF9wdXRfZm9yZ2V0X3JlcTsKIAogCWVyciA9IC1FTk9NRU07Ci0JZmYgPSBmdXNlX2ZpbGVfYWxsb2MoKTsKKwlmZiA9IGZ1c2VfZmlsZV9hbGxvYyhmYyk7CiAJaWYgKCFmZikKIAkJZ290byBvdXRfcHV0X3JlcXVlc3Q7CiAKQEAgLTQzMiw3ICs0MzIsNyBAQAogCXJlcS0+b3V0LmFyZ3NbMF0udmFsdWUgPSAmb3V0ZW50cnk7CiAJcmVxLT5vdXQuYXJnc1sxXS5zaXplID0gc2l6ZW9mKG91dG9wZW4pOwogCXJlcS0+b3V0LmFyZ3NbMV0udmFsdWUgPSAmb3V0b3BlbjsKLQlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKIAlpZiAoZXJyKSB7CiAJCWlmIChlcnIgPT0gLUVOT1NZUykKQEAgLTUwMiw3ICs1MDIsNyBAQAogCWVsc2UKIAkJcmVxLT5vdXQuYXJnc1swXS5zaXplID0gc2l6ZW9mKG91dGFyZyk7CiAJcmVxLT5vdXQuYXJnc1swXS52YWx1ZSA9ICZvdXRhcmc7Ci0JcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CiAJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIAlpZiAoZXJyKQpAQCAtNjMxLDE1ICs2MzEsMTcgQEAKIAlyZXEtPmluLm51bWFyZ3MgPSAxOwogCXJlcS0+aW4uYXJnc1swXS5zaXplID0gZW50cnktPmRfbmFtZS5sZW4gKyAxOwogCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9IGVudHJ5LT5kX25hbWUubmFtZTsKLQlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKIAlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwogCWlmICghZXJyKSB7CiAJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBlbnRyeS0+ZF9pbm9kZTsKIAotCQkvKiBTZXQgbmxpbmsgdG8gemVybyBzbyB0aGUgaW5vZGUgY2FuIGJlIGNsZWFyZWQsIGlmCi0gICAgICAgICAgICAgICAgICAgdGhlIGlub2RlIGRvZXMgaGF2ZSBtb3JlIGxpbmtzIHRoaXMgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgIGRpc2NvdmVyZWQgYXQgdGhlIG5leHQgbG9va3VwL2dldGF0dHIgKi8KKwkJLyoKKwkJICogU2V0IG5saW5rIHRvIHplcm8gc28gdGhlIGlub2RlIGNhbiBiZSBjbGVhcmVkLCBpZiB0aGUgaW5vZGUKKwkJICogZG9lcyBoYXZlIG1vcmUgbGlua3MgdGhpcyB3aWxsIGJlIGRpc2NvdmVyZWQgYXQgdGhlIG5leHQKKwkJICogbG9va3VwL2dldGF0dHIuCisJCSAqLwogCQljbGVhcl9ubGluayhpbm9kZSk7CiAJCWZ1c2VfaW52YWxpZGF0ZV9hdHRyKGlub2RlKTsKIAkJZnVzZV9pbnZhbGlkYXRlX2F0dHIoZGlyKTsKQEAgLTY2Miw3ICs2NjQsNyBAQAogCXJlcS0+aW4ubnVtYXJncyA9IDE7CiAJcmVxLT5pbi5hcmdzWzBdLnNpemUgPSBlbnRyeS0+ZF9uYW1lLmxlbiArIDE7CiAJcmVxLT5pbi5hcmdzWzBdLnZhbHVlID0gZW50cnktPmRfbmFtZS5uYW1lOwotCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZChmYywgcmVxKTsKIAllcnIgPSByZXEtPm91dC5oLmVycm9yOwogCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiAJaWYgKCFlcnIpIHsKQEAgLTY5NSw3ICs2OTcsNyBAQAogCXJlcS0+aW4uYXJnc1sxXS52YWx1ZSA9IG9sZGVudC0+ZF9uYW1lLm5hbWU7CiAJcmVxLT5pbi5hcmdzWzJdLnNpemUgPSBuZXdlbnQtPmRfbmFtZS5sZW4gKyAxOwogCXJlcS0+aW4uYXJnc1syXS52YWx1ZSA9IG5ld2VudC0+ZF9uYW1lLm5hbWU7Ci0JcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CiAJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIAlpZiAoIWVycikgewpAQCAtODExLDcgKzgxMyw3IEBACiAJZWxzZQogCQlyZXEtPm91dC5hcmdzWzBdLnNpemUgPSBzaXplb2Yob3V0YXJnKTsKIAlyZXEtPm91dC5hcmdzWzBdLnZhbHVlID0gJm91dGFyZzsKLQlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKIAlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwogCWlmICghZXJyKSB7CkBAIC05MTEsNyArOTEzLDcgQEAKIAlyZXEtPmluLm51bWFyZ3MgPSAxOwogCXJlcS0+aW4uYXJnc1swXS5zaXplID0gc2l6ZW9mKGluYXJnKTsKIAlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSAmaW5hcmc7Ci0JcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CiAJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIAlpZiAoZXJyID09IC1FTk9TWVMpIHsKQEAgLTEwMzMsNyArMTAzNSw3IEBACiAJcmVxLT5udW1fcGFnZXMgPSAxOwogCXJlcS0+cGFnZXNbMF0gPSBwYWdlOwogCWZ1c2VfcmVhZF9maWxsKHJlcSwgZmlsZSwgaW5vZGUsIGZpbGUtPmZfcG9zLCBQQUdFX1NJWkUsIEZVU0VfUkVBRERJUik7Ci0JcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCW5ieXRlcyA9IHJlcS0+b3V0LmFyZ3NbMF0uc2l6ZTsKIAllcnIgPSByZXEtPm91dC5oLmVycm9yOwogCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CkBAIC0xMDY3LDcgKzEwNjksNyBAQAogCXJlcS0+b3V0Lm51bWFyZ3MgPSAxOwogCXJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA9IFBBR0VfU0laRSAtIDE7CiAJcmVxLT5vdXQuYXJnc1swXS52YWx1ZSA9IGxpbms7Ci0JcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCWlmIChyZXEtPm91dC5oLmVycm9yKSB7CiAJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgbGluayk7CiAJCWxpbmsgPSBFUlJfUFRSKHJlcS0+b3V0LmguZXJyb3IpOwpAQCAtMTI3Myw3ICsxMjc1LDcgQEAKIAllbHNlCiAJCXJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihvdXRhcmcpOwogCXJlcS0+b3V0LmFyZ3NbMF0udmFsdWUgPSAmb3V0YXJnOwotCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZChmYywgcmVxKTsKIAllcnIgPSByZXEtPm91dC5oLmVycm9yOwogCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiAJaWYgKGVycikgewpAQCAtMTM2Nyw3ICsxMzY5LDcgQEAKIAlyZXEtPmluLmFyZ3NbMV0udmFsdWUgPSBuYW1lOwogCXJlcS0+aW4uYXJnc1syXS5zaXplID0gc2l6ZTsKIAlyZXEtPmluLmFyZ3NbMl0udmFsdWUgPSB2YWx1ZTsKLQlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKIAlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwogCWlmIChlcnIgPT0gLUVOT1NZUykgewpAQCAtMTQxMyw3ICsxNDE1LDcgQEAKIAkJcmVxLT5vdXQuYXJnc1swXS5zaXplID0gc2l6ZW9mKG91dGFyZyk7CiAJCXJlcS0+b3V0LmFyZ3NbMF0udmFsdWUgPSAmb3V0YXJnOwogCX0KLQlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJcmV0ID0gcmVxLT5vdXQuaC5lcnJvcjsKIAlpZiAoIXJldCkKIAkJcmV0ID0gc2l6ZSA/IHJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA6IG91dGFyZy5zaXplOwpAQCAtMTQ2Myw3ICsxNDY1LDcgQEAKIAkJcmVxLT5vdXQuYXJnc1swXS5zaXplID0gc2l6ZW9mKG91dGFyZyk7CiAJCXJlcS0+b3V0LmFyZ3NbMF0udmFsdWUgPSAmb3V0YXJnOwogCX0KLQlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJcmV0ID0gcmVxLT5vdXQuaC5lcnJvcjsKIAlpZiAoIXJldCkKIAkJcmV0ID0gc2l6ZSA/IHJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA6IG91dGFyZy5zaXplOwpAQCAtMTQ5Niw3ICsxNDk4LDcgQEAKIAlyZXEtPmluLm51bWFyZ3MgPSAxOwogCXJlcS0+aW4uYXJnc1swXS5zaXplID0gc3RybGVuKG5hbWUpICsgMTsKIAlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSBuYW1lOwotCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZChmYywgcmVxKTsKIAllcnIgPSByZXEtPm91dC5oLmVycm9yOwogCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiAJaWYgKGVyciA9PSAtRU5PU1lTKSB7CmRpZmYgLS1naXQgYS9mcy9mdXNlL2ZpbGUuYyBiL2ZzL2Z1c2UvZmlsZS5jCmluZGV4IDRjOWVlNzAuLmU4MTYyNjQgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvZmlsZS5jCisrKyBiL2ZzL2Z1c2UvZmlsZS5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAgRlVTRTogRmlsZXN5c3RlbSBpbiBVc2Vyc3BhY2UKLSAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgIE1pa2xvcyBTemVyZWRpIDxtaWtsb3NAc3plcmVkaS5odT4KKyAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggIE1pa2xvcyBTemVyZWRpIDxtaWtsb3NAc3plcmVkaS5odT4KIAogICBUaGlzIHByb2dyYW0gY2FuIGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTC4KICAgU2VlIHRoZSBmaWxlIENPUFlJTkcuCkBAIC0zOSwxNCArMzksMTQgQEAKIAlyZXEtPm91dC5udW1hcmdzID0gMTsKIAlyZXEtPm91dC5hcmdzWzBdLnNpemUgPSBzaXplb2YoKm91dGFyZ3ApOwogCXJlcS0+b3V0LmFyZ3NbMF0udmFsdWUgPSBvdXRhcmdwOwotCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZChmYywgcmVxKTsKIAllcnIgPSByZXEtPm91dC5oLmVycm9yOwogCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiAKIAlyZXR1cm4gZXJyOwogfQogCi1zdHJ1Y3QgZnVzZV9maWxlICpmdXNlX2ZpbGVfYWxsb2Modm9pZCkKK3N0cnVjdCBmdXNlX2ZpbGUgKmZ1c2VfZmlsZV9hbGxvYyhzdHJ1Y3QgZnVzZV9jb25uICpmYykKIHsKIAlzdHJ1Y3QgZnVzZV9maWxlICpmZjsKIAlmZiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmdXNlX2ZpbGUpLCBHRlBfS0VSTkVMKTsKQEAgLTU4LDcgKzU4LDEyIEBACiAJCX0gZWxzZSB7CiAJCQlJTklUX0xJU1RfSEVBRCgmZmYtPndyaXRlX2VudHJ5KTsKIAkJCWF0b21pY19zZXQoJmZmLT5jb3VudCwgMCk7CisJCQlzcGluX2xvY2soJmZjLT5sb2NrKTsKKwkJCWZmLT5raCA9ICsrZmMtPmtoY3RyOworCQkJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKIAkJfQorCQlSQl9DTEVBUl9OT0RFKCZmZi0+cG9sbGVkX25vZGUpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZmZi0+cG9sbF93YWl0KTsKIAl9CiAJcmV0dXJuIGZmOwogfQpAQCAtNzksNyArODQsNiBAQAogewogCWRwdXQocmVxLT5taXNjLnJlbGVhc2UuZGVudHJ5KTsKIAltbnRwdXQocmVxLT5taXNjLnJlbGVhc2UudmZzbW91bnQpOwotCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiB9CiAKIHN0YXRpYyB2b2lkIGZ1c2VfZmlsZV9wdXQoc3RydWN0IGZ1c2VfZmlsZSAqZmYpCkBAIC04OSw3ICs5Myw3IEBACiAJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSByZXEtPm1pc2MucmVsZWFzZS5kZW50cnktPmRfaW5vZGU7CiAJCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihpbm9kZSk7CiAJCXJlcS0+ZW5kID0gZnVzZV9yZWxlYXNlX2VuZDsKLQkJcmVxdWVzdF9zZW5kX2JhY2tncm91bmQoZmMsIHJlcSk7CisJCWZ1c2VfcmVxdWVzdF9zZW5kX2JhY2tncm91bmQoZmMsIHJlcSk7CiAJCWtmcmVlKGZmKTsKIAl9CiB9CkBAIC0xMDksNiArMTEzLDcgQEAKIAogaW50IGZ1c2Vfb3Blbl9jb21tb24oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIGludCBpc2RpcikKIHsKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOwogCXN0cnVjdCBmdXNlX29wZW5fb3V0IG91dGFyZzsKIAlzdHJ1Y3QgZnVzZV9maWxlICpmZjsKIAlpbnQgZXJyOwpAQCAtMTIxLDcgKzEyNiw3IEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWZmID0gZnVzZV9maWxlX2FsbG9jKCk7CisJZmYgPSBmdXNlX2ZpbGVfYWxsb2MoZmMpOwogCWlmICghZmYpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0xNjcsNyArMTcyLDExIEBACiAKIAkJc3Bpbl9sb2NrKCZmYy0+bG9jayk7CiAJCWxpc3RfZGVsKCZmZi0+d3JpdGVfZW50cnkpOworCQlpZiAoIVJCX0VNUFRZX05PREUoJmZmLT5wb2xsZWRfbm9kZSkpCisJCQlyYl9lcmFzZSgmZmYtPnBvbGxlZF9ub2RlLCAmZmMtPnBvbGxlZF9maWxlcyk7CiAJCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7CisKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX3N5bmMoJmZmLT5wb2xsX3dhaXQpOwogCQkvKgogCQkgKiBOb3JtYWxseSB0aGlzIHdpbGwgc2VuZCB0aGUgUkVMRUFTRSByZXF1ZXN0LAogCQkgKiBob3dldmVyIGlmIHNvbWUgYXN5bmNocm9ub3VzIFJFQUQgb3IgV1JJVEUgcmVxdWVzdHMKQEAgLTI4MCw3ICsyODksNyBAQAogCXJlcS0+aW4uYXJnc1swXS5zaXplID0gc2l6ZW9mKGluYXJnKTsKIAlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSAmaW5hcmc7CiAJcmVxLT5mb3JjZSA9IDE7Ci0JcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CiAJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIAlpZiAoZXJyID09IC1FTk9TWVMpIHsKQEAgLTM0NCw3ICszNTMsNyBAQAogCXJlcS0+aW4ubnVtYXJncyA9IDE7CiAJcmVxLT5pbi5hcmdzWzBdLnNpemUgPSBzaXplb2YoaW5hcmcpOwogCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9ICZpbmFyZzsKLQlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKIAlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwogCWlmIChlcnIgPT0gLUVOT1NZUykgewpAQCAtMzk2LDcgKzQwNSw3IEBACiAJCWluYXJnLT5yZWFkX2ZsYWdzIHw9IEZVU0VfUkVBRF9MT0NLT1dORVI7CiAJCWluYXJnLT5sb2NrX293bmVyID0gZnVzZV9sb2NrX293bmVyX2lkKGZjLCBvd25lcik7CiAJfQotCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZChmYywgcmVxKTsKIAlyZXR1cm4gcmVxLT5vdXQuYXJnc1swXS5zaXplOwogfQogCkBAIC00OTMsNyArNTAyLDYgQEAKIAl9CiAJaWYgKHJlcS0+ZmYpCiAJCWZ1c2VfZmlsZV9wdXQocmVxLT5mZik7Ci0JZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIH0KIAogc3RhdGljIHZvaWQgZnVzZV9zZW5kX3JlYWRwYWdlcyhzdHJ1Y3QgZnVzZV9yZXEgKnJlcSwgc3RydWN0IGZpbGUgKmZpbGUsCkBAIC01MDksMTAgKzUxNywxMSBAQAogCQlzdHJ1Y3QgZnVzZV9maWxlICpmZiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAkJcmVxLT5mZiA9IGZ1c2VfZmlsZV9nZXQoZmYpOwogCQlyZXEtPmVuZCA9IGZ1c2VfcmVhZHBhZ2VzX2VuZDsKLQkJcmVxdWVzdF9zZW5kX2JhY2tncm91bmQoZmMsIHJlcSk7CisJCWZ1c2VfcmVxdWVzdF9zZW5kX2JhY2tncm91bmQoZmMsIHJlcSk7CiAJfSBlbHNlIHsKLQkJcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCQlmdXNlX3JlcXVlc3Rfc2VuZChmYywgcmVxKTsKIAkJZnVzZV9yZWFkcGFnZXNfZW5kKGZjLCByZXEpOworCQlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwogCX0KIH0KIApAQCAtNTQzLDcgKzU1Miw3IEBACiAJCX0KIAl9CiAJcmVxLT5wYWdlc1tyZXEtPm51bV9wYWdlc10gPSBwYWdlOwotCXJlcS0+bnVtX3BhZ2VzICsrOworCXJlcS0+bnVtX3BhZ2VzKys7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTYzNiw3ICs2NDUsNyBAQAogCQlpbmFyZy0+d3JpdGVfZmxhZ3MgfD0gRlVTRV9XUklURV9MT0NLT1dORVI7CiAJCWluYXJnLT5sb2NrX293bmVyID0gZnVzZV9sb2NrX293bmVyX2lkKGZjLCBvd25lcik7CiAJfQotCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZChmYywgcmVxKTsKIAlyZXR1cm4gcmVxLT5taXNjLndyaXRlLm91dC5zaXplOwogfQogCkBAIC0xMDQyLDcgKzEwNTEsNiBAQAogewogCV9fZnJlZV9wYWdlKHJlcS0+cGFnZXNbMF0pOwogCWZ1c2VfZmlsZV9wdXQocmVxLT5mZik7Ci0JZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIH0KIAogc3RhdGljIHZvaWQgZnVzZV93cml0ZXBhZ2VfZmluaXNoKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKQEAgLTEwNjAsNiArMTA2OCw4IEBACiAKIC8qIENhbGxlZCB1bmRlciBmYy0+bG9jaywgbWF5IHJlbGVhc2UgYW5kIHJlYWNxdWlyZSBpdCAqLwogc3RhdGljIHZvaWQgZnVzZV9zZW5kX3dyaXRlcGFnZShzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpCitfX3JlbGVhc2VzKCZmYy0+bG9jaykKK19fYWNxdWlyZXMoJmZjLT5sb2NrKQogewogCXN0cnVjdCBmdXNlX2lub2RlICpmaSA9IGdldF9mdXNlX2lub2RlKHJlcS0+aW5vZGUpOwogCWxvZmZfdCBzaXplID0gaV9zaXplX3JlYWQocmVxLT5pbm9kZSk7CkBAIC0xMDc5LDEzICsxMDg5LDE0IEBACiAKIAlyZXEtPmluLmFyZ3NbMV0uc2l6ZSA9IGluYXJnLT5zaXplOwogCWZpLT53cml0ZWN0cisrOwotCXJlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kX2xvY2tlZChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kX2xvY2tlZChmYywgcmVxKTsKIAlyZXR1cm47CiAKICBvdXRfZnJlZToKIAlmdXNlX3dyaXRlcGFnZV9maW5pc2goZmMsIHJlcSk7CiAJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKIAlmdXNlX3dyaXRlcGFnZV9mcmVlKGZjLCByZXEpOworCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiAJc3Bpbl9sb2NrKCZmYy0+bG9jayk7CiB9CiAKQEAgLTEwOTYsNiArMTEwNyw4IEBACiAgKiBDYWxsZWQgd2l0aCBmYy0+bG9jawogICovCiB2b2lkIGZ1c2VfZmx1c2hfd3JpdGVwYWdlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQorX19yZWxlYXNlcygmZmMtPmxvY2spCitfX2FjcXVpcmVzKCZmYy0+bG9jaykKIHsKIAlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOwogCXN0cnVjdCBmdXNlX2lub2RlICpmaSA9IGdldF9mdXNlX2lub2RlKGlub2RlKTsKQEAgLTEzMjUsNyArMTMzOCw3IEBACiAJcmVxLT5vdXQubnVtYXJncyA9IDE7CiAJcmVxLT5vdXQuYXJnc1swXS5zaXplID0gc2l6ZW9mKG91dGFyZyk7CiAJcmVxLT5vdXQuYXJnc1swXS52YWx1ZSA9ICZvdXRhcmc7Ci0JcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CiAJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIAlpZiAoIWVycikKQEAgLTEzNTcsNyArMTM3MCw3IEBACiAJCXJldHVybiBQVFJfRVJSKHJlcSk7CiAKIAlmdXNlX2xrX2ZpbGwocmVxLCBmaWxlLCBmbCwgb3Bjb2RlLCBwaWQsIGZsb2NrKTsKLQlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKIAkvKiBsb2NraW5nIGlzIHJlc3RhcnRhYmxlICovCiAJaWYgKGVyciA9PSAtRUlOVFIpCkBAIC0xNDMzLDcgKzE0NDYsNyBAQAogCXJlcS0+b3V0Lm51bWFyZ3MgPSAxOwogCXJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihvdXRhcmcpOwogCXJlcS0+b3V0LmFyZ3NbMF0udmFsdWUgPSAmb3V0YXJnOwotCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwlmdXNlX3JlcXVlc3Rfc2VuZChmYywgcmVxKTsKIAllcnIgPSByZXEtPm91dC5oLmVycm9yOwogCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiAJaWYgKGVyciA9PSAtRU5PU1lTKQpAQCAtMTQ3MCw2ICsxNDgzLDQwNiBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKK3N0YXRpYyBpbnQgZnVzZV9pb2N0bF9jb3B5X3VzZXIoc3RydWN0IHBhZ2UgKipwYWdlcywgc3RydWN0IGlvdmVjICppb3YsCisJCQl1bnNpZ25lZCBpbnQgbnJfc2Vncywgc2l6ZV90IGJ5dGVzLCBib29sIHRvX3VzZXIpCit7CisJc3RydWN0IGlvdl9pdGVyIGlpOworCWludCBwYWdlX2lkeCA9IDA7CisKKwlpZiAoIWJ5dGVzKQorCQlyZXR1cm4gMDsKKworCWlvdl9pdGVyX2luaXQoJmlpLCBpb3YsIG5yX3NlZ3MsIGJ5dGVzLCAwKTsKKworCXdoaWxlIChpb3ZfaXRlcl9jb3VudCgmaWkpKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gcGFnZXNbcGFnZV9pZHgrK107CisJCXNpemVfdCB0b2RvID0gbWluX3Qoc2l6ZV90LCBQQUdFX1NJWkUsIGlvdl9pdGVyX2NvdW50KCZpaSkpOworCQl2b2lkICprYWRkciwgKm1hcDsKKworCQlrYWRkciA9IG1hcCA9IGttYXAocGFnZSk7CisKKwkJd2hpbGUgKHRvZG8pIHsKKwkJCWNoYXIgX191c2VyICp1YWRkciA9IGlpLmlvdi0+aW92X2Jhc2UgKyBpaS5pb3Zfb2Zmc2V0OworCQkJc2l6ZV90IGlvdl9sZW4gPSBpaS5pb3YtPmlvdl9sZW4gLSBpaS5pb3Zfb2Zmc2V0OworCQkJc2l6ZV90IGNvcHkgPSBtaW4odG9kbywgaW92X2xlbik7CisJCQlzaXplX3QgbGVmdDsKKworCQkJaWYgKCF0b191c2VyKQorCQkJCWxlZnQgPSBjb3B5X2Zyb21fdXNlcihrYWRkciwgdWFkZHIsIGNvcHkpOworCQkJZWxzZQorCQkJCWxlZnQgPSBjb3B5X3RvX3VzZXIodWFkZHIsIGthZGRyLCBjb3B5KTsKKworCQkJaWYgKHVubGlrZWx5KGxlZnQpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpb3ZfaXRlcl9hZHZhbmNlKCZpaSwgY29weSk7CisJCQl0b2RvIC09IGNvcHk7CisJCQlrYWRkciArPSBjb3B5OworCQl9CisKKwkJa3VubWFwKG1hcCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGb3IgaW9jdGxzLCB0aGVyZSBpcyBubyBnZW5lcmljIHdheSB0byBkZXRlcm1pbmUgaG93IG11Y2ggbWVtb3J5CisgKiBuZWVkcyB0byBiZSByZWFkIGFuZC9vciB3cml0dGVuLiAgRnVydGhlcm1vcmUsIGlvY3RscyBhcmUgYWxsb3dlZAorICogdG8gZGVyZWZlcmVuY2UgdGhlIHBhc3NlZCBwb2ludGVyLCBzbyB0aGUgcGFyYW1ldGVyIHJlcXVpcmVzIGRlZXAKKyAqIGNvcHlpbmcgYnV0IEZVU0UgaGFzIG5vIGlkZWEgd2hhdHNvZXZlciBhYm91dCB3aGF0IHRvIGNvcHkgaW4gb3IKKyAqIG91dC4KKyAqCisgKiBUaGlzIGlzIHNvbHZlZCBieSBhbGxvd2luZyBGVVNFIHNlcnZlciB0byByZXRyeSBpb2N0bCB3aXRoCisgKiBuZWNlc3NhcnkgaW4vb3V0IGlvdmVjcy4gIExldCdzIGFzc3VtZSB0aGUgaW9jdGwgaW1wbGVtZW50YXRpb24KKyAqIG5lZWRzIHRvIHJlYWQgaW4gdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUuCisgKgorICogc3RydWN0IGEgeworICoJY2hhcgkqYnVmOworICoJc2l6ZV90CWJ1ZmxlbjsKKyAqIH0KKyAqCisgKiBPbiB0aGUgZmlyc3QgY2FsbG91dCB0byBGVVNFIHNlcnZlciwgaW5hcmctPmluX3NpemUgYW5kCisgKiBpbmFyZy0+b3V0X3NpemUgd2lsbCBiZSBOVUxMOyB0aGVuLCB0aGUgc2VydmVyIGNvbXBsZXRlcyB0aGUgaW9jdGwKKyAqIHdpdGggRlVTRV9JT0NUTF9SRVRSWSBzZXQgaW4gb3V0LT5mbGFncywgb3V0LT5pbl9pb3ZzIHNldCB0byAxIGFuZAorICogdGhlIGFjdHVhbCBpb3YgYXJyYXkgdG8KKyAqCisgKiB7IHsgLmlvdl9iYXNlID0gaW5hcmcuYXJnLAkuaW92X2xlbiA9IHNpemVvZihzdHJ1Y3QgYSkgfSB9CisgKgorICogd2hpY2ggdGVsbHMgRlVTRSB0byBjb3B5IGluIHRoZSByZXF1ZXN0ZWQgYXJlYSBhbmQgcmV0cnkgdGhlIGlvY3RsLgorICogT24gdGhlIHNlY29uZCByb3VuZCwgdGhlIHNlcnZlciBoYXMgYWNjZXNzIHRvIHRoZSBzdHJ1Y3R1cmUgYW5kCisgKiBmcm9tIHRoYXQgaXQgY2FuIHRlbGwgd2hhdCB0byBsb29rIGZvciBuZXh0LCBzbyBvbiB0aGUgaW52b2NhdGlvbiwKKyAqIGl0IHNldHMgRlVTRV9JT0NUTF9SRVRSWSwgb3V0LT5pbl9pb3ZzIHRvIDIgYW5kIGlvdiBhcnJheSB0bworICoKKyAqIHsgeyAuaW92X2Jhc2UgPSBpbmFyZy5hcmcsCS5pb3ZfbGVuID0gc2l6ZW9mKHN0cnVjdCBhKQl9LAorICogICB7IC5pb3ZfYmFzZSA9IGEuYnVmLAkuaW92X2xlbiA9IGEuYnVmbGVuCQl9IH0KKyAqCisgKiBGVVNFIHdpbGwgY29weSBib3RoIHN0cnVjdCBhIGFuZCB0aGUgcG9pbnRlZCBidWZmZXIgZnJvbSB0aGUKKyAqIHByb2Nlc3MgZG9pbmcgdGhlIGlvY3RsIGFuZCByZXRyeSBpb2N0bCB3aXRoIGJvdGggc3RydWN0IGEgYW5kIHRoZQorICogYnVmZmVyLgorICoKKyAqIFRoaXMgdGltZSwgRlVTRSBzZXJ2ZXIgaGFzIGV2ZXJ5dGhpbmcgaXQgbmVlZHMgYW5kIGNvbXBsZXRlcyBpb2N0bAorICogd2l0aG91dCBGVVNFX0lPQ1RMX1JFVFJZIHdoaWNoIGZpbmlzaGVzIHRoZSBpb2N0bCBjYWxsLgorICoKKyAqIENvcHlpbmcgZGF0YSBvdXQgd29ya3MgdGhlIHNhbWUgd2F5LgorICoKKyAqIE5vdGUgdGhhdCBpZiBGVVNFX0lPQ1RMX1VOUkVTVFJJQ1RFRCBpcyBjbGVhciwgdGhlIGtlcm5lbAorICogYXV0b21hdGljYWxseSBpbml0aWFsaXplcyBpbiBhbmQgb3V0IGlvdnMgYnkgZGVjb2RpbmcgQGNtZCB3aXRoCisgKiBfSU9DXyogbWFjcm9zIGFuZCB0aGUgc2VydmVyIGlzIG5vdCBhbGxvd2VkIHRvIHJlcXVlc3QgUkVUUlkuICBUaGlzCisgKiBsaW1pdHMgaW9jdGwgZGF0YSB0cmFuc2ZlcnMgdG8gd2VsbC1mb3JtZWQgaW9jdGxzIGFuZCBpcyB0aGUgZm9yY2VkCisgKiBiZWhhdmlvciBmb3IgYWxsIEZVU0Ugc2VydmVycy4KKyAqLworc3RhdGljIGxvbmcgZnVzZV9maWxlX2RvX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBmdXNlX2ZpbGUgKmZmID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihpbm9kZSk7CisJc3RydWN0IGZ1c2VfaW9jdGxfaW4gaW5hcmcgPSB7CisJCS5maCA9IGZmLT5maCwKKwkJLmNtZCA9IGNtZCwKKwkJLmFyZyA9IGFyZywKKwkJLmZsYWdzID0gZmxhZ3MKKwl9OworCXN0cnVjdCBmdXNlX2lvY3RsX291dCBvdXRhcmc7CisJc3RydWN0IGZ1c2VfcmVxICpyZXEgPSBOVUxMOworCXN0cnVjdCBwYWdlICoqcGFnZXMgPSBOVUxMOworCXN0cnVjdCBwYWdlICppb3ZfcGFnZSA9IE5VTEw7CisJc3RydWN0IGlvdmVjICppbl9pb3YgPSBOVUxMLCAqb3V0X2lvdiA9IE5VTEw7CisJdW5zaWduZWQgaW50IGluX2lvdnMgPSAwLCBvdXRfaW92cyA9IDAsIG51bV9wYWdlcyA9IDAsIG1heF9wYWdlczsKKwlzaXplX3QgaW5fc2l6ZSwgb3V0X3NpemUsIHRyYW5zZmVycmVkOworCWludCBlcnI7CisKKwkvKiBhc3N1bWUgYWxsIHRoZSBpb3ZzIHJldHVybmVkIGJ5IGNsaWVudCBhbHdheXMgZml0cyBpbiBhIHBhZ2UgKi8KKwlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBpb3ZlYykgKiBGVVNFX0lPQ1RMX01BWF9JT1YgPiBQQUdFX1NJWkUpOworCisJaWYgKCFmdXNlX2FsbG93X3Rhc2soZmMsIGN1cnJlbnQpKQorCQlyZXR1cm4gLUVBQ0NFUzsKKworCWVyciA9IC1FSU87CisJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpCisJCWdvdG8gb3V0OworCisJZXJyID0gLUVOT01FTTsKKwlwYWdlcyA9IGt6YWxsb2Moc2l6ZW9mKHBhZ2VzWzBdKSAqIEZVU0VfTUFYX1BBR0VTX1BFUl9SRVEsIEdGUF9LRVJORUwpOworCWlvdl9wYWdlID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIXBhZ2VzIHx8ICFpb3ZfcGFnZSkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIElmIHJlc3RyaWN0ZWQsIGluaXRpYWxpemUgSU8gcGFyYW1ldGVycyBhcyBlbmNvZGVkIGluIEBjbWQuCisJICogUkVUUlkgZnJvbSBzZXJ2ZXIgaXMgbm90IGFsbG93ZWQuCisJICovCisJaWYgKCEoZmxhZ3MgJiBGVVNFX0lPQ1RMX1VOUkVTVFJJQ1RFRCkpIHsKKwkJc3RydWN0IGlvdmVjICppb3YgPSBwYWdlX2FkZHJlc3MoaW92X3BhZ2UpOworCisJCWlvdi0+aW92X2Jhc2UgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJCWlvdi0+aW92X2xlbiA9IF9JT0NfU0laRShjbWQpOworCisJCWlmIChfSU9DX0RJUihjbWQpICYgX0lPQ19XUklURSkgeworCQkJaW5faW92ID0gaW92OworCQkJaW5faW92cyA9IDE7CisJCX0KKworCQlpZiAoX0lPQ19ESVIoY21kKSAmIF9JT0NfUkVBRCkgeworCQkJb3V0X2lvdiA9IGlvdjsKKwkJCW91dF9pb3ZzID0gMTsKKwkJfQorCX0KKworIHJldHJ5OgorCWluYXJnLmluX3NpemUgPSBpbl9zaXplID0gaW92X2xlbmd0aChpbl9pb3YsIGluX2lvdnMpOworCWluYXJnLm91dF9zaXplID0gb3V0X3NpemUgPSBpb3ZfbGVuZ3RoKG91dF9pb3YsIG91dF9pb3ZzKTsKKworCS8qCisJICogT3V0IGRhdGEgY2FuIGJlIHVzZWQgZWl0aGVyIGZvciBhY3R1YWwgb3V0IGRhdGEgb3IgaW92cywKKwkgKiBtYWtlIHN1cmUgdGhlcmUgYWx3YXlzIGlzIGF0IGxlYXN0IG9uZSBwYWdlLgorCSAqLworCW91dF9zaXplID0gbWF4X3Qoc2l6ZV90LCBvdXRfc2l6ZSwgUEFHRV9TSVpFKTsKKwltYXhfcGFnZXMgPSBESVZfUk9VTkRfVVAobWF4KGluX3NpemUsIG91dF9zaXplKSwgUEFHRV9TSVpFKTsKKworCS8qIG1ha2Ugc3VyZSB0aGVyZSBhcmUgZW5vdWdoIGJ1ZmZlciBwYWdlcyBhbmQgaW5pdCByZXF1ZXN0IHdpdGggdGhlbSAqLworCWVyciA9IC1FTk9NRU07CisJaWYgKG1heF9wYWdlcyA+IEZVU0VfTUFYX1BBR0VTX1BFUl9SRVEpCisJCWdvdG8gb3V0OworCXdoaWxlIChudW1fcGFnZXMgPCBtYXhfcGFnZXMpIHsKKwkJcGFnZXNbbnVtX3BhZ2VzXSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCB8IF9fR0ZQX0hJR0hNRU0pOworCQlpZiAoIXBhZ2VzW251bV9wYWdlc10pCisJCQlnb3RvIG91dDsKKwkJbnVtX3BhZ2VzKys7CisJfQorCisJcmVxID0gZnVzZV9nZXRfcmVxKGZjKTsKKwlpZiAoSVNfRVJSKHJlcSkpIHsKKwkJZXJyID0gUFRSX0VSUihyZXEpOworCQlyZXEgPSBOVUxMOworCQlnb3RvIG91dDsKKwl9CisJbWVtY3B5KHJlcS0+cGFnZXMsIHBhZ2VzLCBzaXplb2YocmVxLT5wYWdlc1swXSkgKiBudW1fcGFnZXMpOworCXJlcS0+bnVtX3BhZ2VzID0gbnVtX3BhZ2VzOworCisJLyogb2theSwgbGV0J3Mgc2VuZCBpdCB0byB0aGUgY2xpZW50ICovCisJcmVxLT5pbi5oLm9wY29kZSA9IEZVU0VfSU9DVEw7CisJcmVxLT5pbi5oLm5vZGVpZCA9IGdldF9ub2RlX2lkKGlub2RlKTsKKwlyZXEtPmluLm51bWFyZ3MgPSAxOworCXJlcS0+aW4uYXJnc1swXS5zaXplID0gc2l6ZW9mKGluYXJnKTsKKwlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSAmaW5hcmc7CisJaWYgKGluX3NpemUpIHsKKwkJcmVxLT5pbi5udW1hcmdzKys7CisJCXJlcS0+aW4uYXJnc1sxXS5zaXplID0gaW5fc2l6ZTsKKwkJcmVxLT5pbi5hcmdwYWdlcyA9IDE7CisKKwkJZXJyID0gZnVzZV9pb2N0bF9jb3B5X3VzZXIocGFnZXMsIGluX2lvdiwgaW5faW92cywgaW5fc2l6ZSwKKwkJCQkJICAgZmFsc2UpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJfQorCisJcmVxLT5vdXQubnVtYXJncyA9IDI7CisJcmVxLT5vdXQuYXJnc1swXS5zaXplID0gc2l6ZW9mKG91dGFyZyk7CisJcmVxLT5vdXQuYXJnc1swXS52YWx1ZSA9ICZvdXRhcmc7CisJcmVxLT5vdXQuYXJnc1sxXS5zaXplID0gb3V0X3NpemU7CisJcmVxLT5vdXQuYXJncGFnZXMgPSAxOworCXJlcS0+b3V0LmFyZ3ZhciA9IDE7CisKKwlmdXNlX3JlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwllcnIgPSByZXEtPm91dC5oLmVycm9yOworCXRyYW5zZmVycmVkID0gcmVxLT5vdXQuYXJnc1sxXS5zaXplOworCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CisJcmVxID0gTlVMTDsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCS8qIGRpZCBpdCBhc2sgZm9yIHJldHJ5PyAqLworCWlmIChvdXRhcmcuZmxhZ3MgJiBGVVNFX0lPQ1RMX1JFVFJZKSB7CisJCWNoYXIgKnZhZGRyOworCisJCS8qIG5vIHJldHJ5IGlmIGluIHJlc3RyaWN0ZWQgbW9kZSAqLworCQllcnIgPSAtRUlPOworCQlpZiAoIShmbGFncyAmIEZVU0VfSU9DVExfVU5SRVNUUklDVEVEKSkKKwkJCWdvdG8gb3V0OworCisJCWluX2lvdnMgPSBvdXRhcmcuaW5faW92czsKKwkJb3V0X2lvdnMgPSBvdXRhcmcub3V0X2lvdnM7CisKKwkJLyoKKwkJICogTWFrZSBzdXJlIHRoaW5ncyBhcmUgaW4gYm91bmRhcnksIHNlcGFyYXRlIGNoZWNrcworCQkgKiBhcmUgdG8gcHJvdGVjdCBhZ2FpbnN0IG92ZXJmbG93LgorCQkgKi8KKwkJZXJyID0gLUVOT01FTTsKKwkJaWYgKGluX2lvdnMgPiBGVVNFX0lPQ1RMX01BWF9JT1YgfHwKKwkJICAgIG91dF9pb3ZzID4gRlVTRV9JT0NUTF9NQVhfSU9WIHx8CisJCSAgICBpbl9pb3ZzICsgb3V0X2lvdnMgPiBGVVNFX0lPQ1RMX01BWF9JT1YpCisJCQlnb3RvIG91dDsKKworCQllcnIgPSAtRUlPOworCQlpZiAoKGluX2lvdnMgKyBvdXRfaW92cykgKiBzaXplb2Yoc3RydWN0IGlvdmVjKSAhPSB0cmFuc2ZlcnJlZCkKKwkJCWdvdG8gb3V0OworCisJCS8qIG9rYXksIGNvcHkgaW4gaW92cyBhbmQgcmV0cnkgKi8KKwkJdmFkZHIgPSBrbWFwX2F0b21pYyhwYWdlc1swXSwgS01fVVNFUjApOworCQltZW1jcHkocGFnZV9hZGRyZXNzKGlvdl9wYWdlKSwgdmFkZHIsIHRyYW5zZmVycmVkKTsKKwkJa3VubWFwX2F0b21pYyh2YWRkciwgS01fVVNFUjApOworCisJCWluX2lvdiA9IHBhZ2VfYWRkcmVzcyhpb3ZfcGFnZSk7CisJCW91dF9pb3YgPSBpbl9pb3YgKyBpbl9pb3ZzOworCisJCWdvdG8gcmV0cnk7CisJfQorCisJZXJyID0gLUVJTzsKKwlpZiAodHJhbnNmZXJyZWQgPiBpbmFyZy5vdXRfc2l6ZSkKKwkJZ290byBvdXQ7CisKKwllcnIgPSBmdXNlX2lvY3RsX2NvcHlfdXNlcihwYWdlcywgb3V0X2lvdiwgb3V0X2lvdnMsIHRyYW5zZmVycmVkLCB0cnVlKTsKKyBvdXQ6CisJaWYgKHJlcSkKKwkJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKKwlpZiAoaW92X3BhZ2UpCisJCV9fZnJlZV9wYWdlKGlvdl9wYWdlKTsKKwl3aGlsZSAobnVtX3BhZ2VzKQorCQlfX2ZyZWVfcGFnZShwYWdlc1stLW51bV9wYWdlc10pOworCWtmcmVlKHBhZ2VzKTsKKworCXJldHVybiBlcnIgPyBlcnIgOiBvdXRhcmcucmVzdWx0OworfQorCitzdGF0aWMgbG9uZyBmdXNlX2ZpbGVfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIGZ1c2VfZmlsZV9kb19pb2N0bChmaWxlLCBjbWQsIGFyZywgMCk7Cit9CisKK3N0YXRpYyBsb25nIGZ1c2VfZmlsZV9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIGZ1c2VfZmlsZV9kb19pb2N0bChmaWxlLCBjbWQsIGFyZywgRlVTRV9JT0NUTF9DT01QQVQpOworfQorCisvKgorICogQWxsIGZpbGVzIHdoaWNoIGhhdmUgYmVlbiBwb2xsZWQgYXJlIGxpbmtlZCB0byBSQiB0cmVlCisgKiBmdXNlX2Nvbm4tPnBvbGxlZF9maWxlcyB3aGljaCBpcyBpbmRleGVkIGJ5IGtoLiAgV2FsayB0aGUgdHJlZSBhbmQKKyAqIGZpbmQgdGhlIG1hdGNoaW5nIG9uZS4KKyAqLworc3RhdGljIHN0cnVjdCByYl9ub2RlICoqZnVzZV9maW5kX3BvbGxlZF9ub2RlKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCB1NjQga2gsCisJCQkJCSAgICAgIHN0cnVjdCByYl9ub2RlICoqcGFyZW50X291dCkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqKmxpbmsgPSAmZmMtPnBvbGxlZF9maWxlcy5yYl9ub2RlOworCXN0cnVjdCByYl9ub2RlICpsYXN0ID0gTlVMTDsKKworCXdoaWxlICgqbGluaykgeworCQlzdHJ1Y3QgZnVzZV9maWxlICpmZjsKKworCQlsYXN0ID0gKmxpbms7CisJCWZmID0gcmJfZW50cnkobGFzdCwgc3RydWN0IGZ1c2VfZmlsZSwgcG9sbGVkX25vZGUpOworCisJCWlmIChraCA8IGZmLT5raCkKKwkJCWxpbmsgPSAmbGFzdC0+cmJfbGVmdDsKKwkJZWxzZSBpZiAoa2ggPiBmZi0+a2gpCisJCQlsaW5rID0gJmxhc3QtPnJiX3JpZ2h0OworCQllbHNlCisJCQlyZXR1cm4gbGluazsKKwl9CisKKwlpZiAocGFyZW50X291dCkKKwkJKnBhcmVudF9vdXQgPSBsYXN0OworCXJldHVybiBsaW5rOworfQorCisvKgorICogVGhlIGZpbGUgaXMgYWJvdXQgdG8gYmUgcG9sbGVkLiAgTWFrZSBzdXJlIGl0J3Mgb24gdGhlIHBvbGxlZF9maWxlcworICogUkIgdHJlZS4gIE5vdGUgdGhhdCBmaWxlcyBvbmNlIGFkZGVkIHRvIHRoZSBwb2xsZWRfZmlsZXMgdHJlZSBhcmUKKyAqIG5vdCByZW1vdmVkIGJlZm9yZSB0aGUgZmlsZSBpcyByZWxlYXNlZC4gIFRoaXMgaXMgYmVjYXVzZSBhIGZpbGUKKyAqIHBvbGxlZCBvbmNlIGlzIGxpa2VseSB0byBiZSBwb2xsZWQgYWdhaW4uCisgKi8KK3N0YXRpYyB2b2lkIGZ1c2VfcmVnaXN0ZXJfcG9sbGVkX2ZpbGUoc3RydWN0IGZ1c2VfY29ubiAqZmMsCisJCQkJICAgICAgc3RydWN0IGZ1c2VfZmlsZSAqZmYpCit7CisJc3Bpbl9sb2NrKCZmYy0+bG9jayk7CisJaWYgKFJCX0VNUFRZX05PREUoJmZmLT5wb2xsZWRfbm9kZSkpIHsKKwkJc3RydWN0IHJiX25vZGUgKipsaW5rLCAqcGFyZW50OworCisJCWxpbmsgPSBmdXNlX2ZpbmRfcG9sbGVkX25vZGUoZmMsIGZmLT5raCwgJnBhcmVudCk7CisJCUJVR19PTigqbGluayk7CisJCXJiX2xpbmtfbm9kZSgmZmYtPnBvbGxlZF9ub2RlLCBwYXJlbnQsIGxpbmspOworCQlyYl9pbnNlcnRfY29sb3IoJmZmLT5wb2xsZWRfbm9kZSwgJmZjLT5wb2xsZWRfZmlsZXMpOworCX0KKwlzcGluX3VubG9jaygmZmMtPmxvY2spOworfQorCitzdGF0aWMgdW5zaWduZWQgZnVzZV9maWxlX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBmdXNlX2ZpbGUgKmZmID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihpbm9kZSk7CisJc3RydWN0IGZ1c2VfcG9sbF9pbiBpbmFyZyA9IHsgLmZoID0gZmYtPmZoLCAua2ggPSBmZi0+a2ggfTsKKwlzdHJ1Y3QgZnVzZV9wb2xsX291dCBvdXRhcmc7CisJc3RydWN0IGZ1c2VfcmVxICpyZXE7CisJaW50IGVycjsKKworCWlmIChmYy0+bm9fcG9sbCkKKwkJcmV0dXJuIERFRkFVTFRfUE9MTE1BU0s7CisKKwlwb2xsX3dhaXQoZmlsZSwgJmZmLT5wb2xsX3dhaXQsIHdhaXQpOworCisJLyoKKwkgKiBBc2sgZm9yIG5vdGlmaWNhdGlvbiBpZmYgdGhlcmUncyBzb21lb25lIHdhaXRpbmcgZm9yIGl0LgorCSAqIFRoZSBjbGllbnQgbWF5IGlnbm9yZSB0aGUgZmxhZyBhbmQgYWx3YXlzIG5vdGlmeS4KKwkgKi8KKwlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmZmYtPnBvbGxfd2FpdCkpIHsKKwkJaW5hcmcuZmxhZ3MgfD0gRlVTRV9QT0xMX1NDSEVEVUxFX05PVElGWTsKKwkJZnVzZV9yZWdpc3Rlcl9wb2xsZWRfZmlsZShmYywgZmYpOworCX0KKworCXJlcSA9IGZ1c2VfZ2V0X3JlcShmYyk7CisJaWYgKElTX0VSUihyZXEpKQorCQlyZXR1cm4gUFRSX0VSUihyZXEpOworCisJcmVxLT5pbi5oLm9wY29kZSA9IEZVU0VfUE9MTDsKKwlyZXEtPmluLmgubm9kZWlkID0gZ2V0X25vZGVfaWQoaW5vZGUpOworCXJlcS0+aW4ubnVtYXJncyA9IDE7CisJcmVxLT5pbi5hcmdzWzBdLnNpemUgPSBzaXplb2YoaW5hcmcpOworCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9ICZpbmFyZzsKKwlyZXEtPm91dC5udW1hcmdzID0gMTsKKwlyZXEtPm91dC5hcmdzWzBdLnNpemUgPSBzaXplb2Yob3V0YXJnKTsKKwlyZXEtPm91dC5hcmdzWzBdLnZhbHVlID0gJm91dGFyZzsKKwlmdXNlX3JlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwllcnIgPSByZXEtPm91dC5oLmVycm9yOworCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CisKKwlpZiAoIWVycikKKwkJcmV0dXJuIG91dGFyZy5yZXZlbnRzOworCWlmIChlcnIgPT0gLUVOT1NZUykgeworCQlmYy0+bm9fcG9sbCA9IDE7CisJCXJldHVybiBERUZBVUxUX1BPTExNQVNLOworCX0KKwlyZXR1cm4gUE9MTEVSUjsKK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIGZyb20gZnVzZV9oYW5kbGVfbm90aWZ5KCkgb24gRlVTRV9OT1RJRllfUE9MTCBhbmQKKyAqIHdha2VzIHVwIHRoZSBwb2xsIHdhaXRlcnMuCisgKi8KK2ludCBmdXNlX25vdGlmeV9wb2xsX3dha2V1cChzdHJ1Y3QgZnVzZV9jb25uICpmYywKKwkJCSAgICBzdHJ1Y3QgZnVzZV9ub3RpZnlfcG9sbF93YWtldXBfb3V0ICpvdXRhcmcpCit7CisJdTY0IGtoID0gb3V0YXJnLT5raDsKKwlzdHJ1Y3QgcmJfbm9kZSAqKmxpbms7CisKKwlzcGluX2xvY2soJmZjLT5sb2NrKTsKKworCWxpbmsgPSBmdXNlX2ZpbmRfcG9sbGVkX25vZGUoZmMsIGtoLCBOVUxMKTsKKwlpZiAoKmxpbmspIHsKKwkJc3RydWN0IGZ1c2VfZmlsZSAqZmY7CisKKwkJZmYgPSByYl9lbnRyeSgqbGluaywgc3RydWN0IGZ1c2VfZmlsZSwgcG9sbGVkX25vZGUpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGVfc3luYygmZmYtPnBvbGxfd2FpdCk7CisJfQorCisJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZnVzZV9maWxlX29wZXJhdGlvbnMgPSB7CiAJLmxsc2VlawkJPSBmdXNlX2ZpbGVfbGxzZWVrLAogCS5yZWFkCQk9IGRvX3N5bmNfcmVhZCwKQEAgLTE0ODQsNiArMTg5Nyw5IEBACiAJLmxvY2sJCT0gZnVzZV9maWxlX2xvY2ssCiAJLmZsb2NrCQk9IGZ1c2VfZmlsZV9mbG9jaywKIAkuc3BsaWNlX3JlYWQJPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3JlYWQsCisJLnVubG9ja2VkX2lvY3RsCT0gZnVzZV9maWxlX2lvY3RsLAorCS5jb21wYXRfaW9jdGwJPSBmdXNlX2ZpbGVfY29tcGF0X2lvY3RsLAorCS5wb2xsCQk9IGZ1c2VfZmlsZV9wb2xsLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZnVzZV9kaXJlY3RfaW9fZmlsZV9vcGVyYXRpb25zID0gewpAQCAtMTQ5Niw2ICsxOTEyLDkgQEAKIAkuZnN5bmMJCT0gZnVzZV9mc3luYywKIAkubG9jawkJPSBmdXNlX2ZpbGVfbG9jaywKIAkuZmxvY2sJCT0gZnVzZV9maWxlX2Zsb2NrLAorCS51bmxvY2tlZF9pb2N0bAk9IGZ1c2VfZmlsZV9pb2N0bCwKKwkuY29tcGF0X2lvY3RsCT0gZnVzZV9maWxlX2NvbXBhdF9pb2N0bCwKKwkucG9sbAkJPSBmdXNlX2ZpbGVfcG9sbCwKIAkvKiBubyBtbWFwIGFuZCBzcGxpY2VfcmVhZCAqLwogfTsKIApkaWZmIC0tZ2l0IGEvZnMvZnVzZS9mdXNlX2kuaCBiL2ZzL2Z1c2UvZnVzZV9pLmgKaW5kZXggMzVhY2NmZC4uNWU2NGI4MSAxMDA2NDQKLS0tIGEvZnMvZnVzZS9mdXNlX2kuaAorKysgYi9mcy9mdXNlL2Z1c2VfaS5oCkBAIC0xLDYgKzEsNiBAQAogLyoKICAgRlVTRTogRmlsZXN5c3RlbSBpbiBVc2Vyc3BhY2UKLSAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgIE1pa2xvcyBTemVyZWRpIDxtaWtsb3NAc3plcmVkaS5odT4KKyAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggIE1pa2xvcyBTemVyZWRpIDxtaWtsb3NAc3plcmVkaS5odT4KIAogICBUaGlzIHByb2dyYW0gY2FuIGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTC4KICAgU2VlIHRoZSBmaWxlIENPUFlJTkcuCkBAIC0xOSw2ICsxOSw4IEBACiAjaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogCiAvKiogTWF4IG51bWJlciBvZiBwYWdlcyB0aGF0IGNhbiBiZSB1c2VkIGluIGEgc2luZ2xlIHJlYWQgcmVxdWVzdCAqLwogI2RlZmluZSBGVVNFX01BWF9QQUdFU19QRVJfUkVRIDMyCkBAIC0xMDAsNiArMTAyLDkgQEAKIAkvKiogUmVxdWVzdCByZXNlcnZlZCBmb3IgZmx1c2ggYW5kIHJlbGVhc2UgKi8KIAlzdHJ1Y3QgZnVzZV9yZXEgKnJlc2VydmVkX3JlcTsKIAorCS8qKiBLZXJuZWwgZmlsZSBoYW5kbGUgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUgKi8KKwl1NjQga2g7CisKIAkvKiogRmlsZSBoYW5kbGUgdXNlZCBieSB1c2Vyc3BhY2UgKi8KIAl1NjQgZmg7CiAKQEAgLTEwOCw2ICsxMTMsMTIgQEAKIAogCS8qKiBFbnRyeSBvbiBpbm9kZSdzIHdyaXRlX2ZpbGVzIGxpc3QgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIHdyaXRlX2VudHJ5OworCisJLyoqIFJCIG5vZGUgdG8gYmUgbGlua2VkIG9uIGZ1c2VfY29ubi0+cG9sbGVkX2ZpbGVzICovCisJc3RydWN0IHJiX25vZGUgcG9sbGVkX25vZGU7CisKKwkvKiogV2FpdCBxdWV1ZSBoZWFkIGZvciBwb2xsICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgcG9sbF93YWl0OwogfTsKIAogLyoqIE9uZSBpbnB1dCBhcmd1bWVudCBvZiBhIHJlcXVlc3QgKi8KQEAgLTMyMiw2ICszMzMsMTIgQEAKIAkvKiogVGhlIGxpc3Qgb2YgcmVxdWVzdHMgdW5kZXIgSS9PICovCiAJc3RydWN0IGxpc3RfaGVhZCBpbzsKIAorCS8qKiBUaGUgbmV4dCB1bmlxdWUga2VybmVsIGZpbGUgaGFuZGxlICovCisJdTY0IGtoY3RyOworCisJLyoqIHJidHJlZSBvZiBmdXNlX2ZpbGVzIHdhaXRpbmcgZm9yIHBvbGwgZXZlbnRzIGluZGV4ZWQgYnkgcGggKi8KKwlzdHJ1Y3QgcmJfcm9vdCBwb2xsZWRfZmlsZXM7CisKIAkvKiogTnVtYmVyIG9mIHJlcXVlc3RzIGN1cnJlbnRseSBpbiB0aGUgYmFja2dyb3VuZCAqLwogCXVuc2lnbmVkIG51bV9iYWNrZ3JvdW5kOwogCkBAIC0zNTUsMTkgKzM3MiwxOSBAQAogCS8qKiBDb25uZWN0aW9uIGZhaWxlZCAodmVyc2lvbiBtaXNtYXRjaCkuICBDYW5ub3QgcmFjZSB3aXRoCiAJICAgIHNldHRpbmcgb3RoZXIgYml0ZmllbGRzIHNpbmNlIGl0IGlzIG9ubHkgc2V0IG9uY2UgaW4gSU5JVAogCSAgICByZXBseSwgYmVmb3JlIGFueSBvdGhlciByZXF1ZXN0LCBhbmQgbmV2ZXIgY2xlYXJlZCAqLwotCXVuc2lnbmVkIGNvbm5fZXJyb3IgOiAxOworCXVuc2lnbmVkIGNvbm5fZXJyb3I6MTsKIAogCS8qKiBDb25uZWN0aW9uIHN1Y2Nlc3NmdWwuICBPbmx5IHNldCBpbiBJTklUICovCi0JdW5zaWduZWQgY29ubl9pbml0IDogMTsKKwl1bnNpZ25lZCBjb25uX2luaXQ6MTsKIAogCS8qKiBEbyByZWFkcGFnZXMgYXN5bmNocm9ub3VzbHk/ICBPbmx5IHNldCBpbiBJTklUICovCi0JdW5zaWduZWQgYXN5bmNfcmVhZCA6IDE7CisJdW5zaWduZWQgYXN5bmNfcmVhZDoxOwogCiAJLyoqIERvIG5vdCBzZW5kIHNlcGFyYXRlIFNFVEFUVFIgcmVxdWVzdCBiZWZvcmUgb3BlbihPX1RSVU5DKSAgKi8KLQl1bnNpZ25lZCBhdG9taWNfb190cnVuYyA6IDE7CisJdW5zaWduZWQgYXRvbWljX29fdHJ1bmM6MTsKIAogCS8qKiBGaWxlc3lzdGVtIHN1cHBvcnRzIE5GUyBleHBvcnRpbmcuICBPbmx5IHNldCBpbiBJTklUICovCi0JdW5zaWduZWQgZXhwb3J0X3N1cHBvcnQgOiAxOworCXVuc2lnbmVkIGV4cG9ydF9zdXBwb3J0OjE7CiAKIAkvKgogCSAqIFRoZSBmb2xsb3dpbmcgYml0ZmllbGRzIGFyZSBvbmx5IGZvciBvcHRpbWl6YXRpb24gcHVycG9zZXMKQEAgLTM3NSw0MyArMzkyLDQ2IEBACiAJICovCiAKIAkvKiogSXMgZnN5bmMgbm90IGltcGxlbWVudGVkIGJ5IGZzPyAqLwotCXVuc2lnbmVkIG5vX2ZzeW5jIDogMTsKKwl1bnNpZ25lZCBub19mc3luYzoxOwogCiAJLyoqIElzIGZzeW5jZGlyIG5vdCBpbXBsZW1lbnRlZCBieSBmcz8gKi8KLQl1bnNpZ25lZCBub19mc3luY2RpciA6IDE7CisJdW5zaWduZWQgbm9fZnN5bmNkaXI6MTsKIAogCS8qKiBJcyBmbHVzaCBub3QgaW1wbGVtZW50ZWQgYnkgZnM/ICovCi0JdW5zaWduZWQgbm9fZmx1c2ggOiAxOworCXVuc2lnbmVkIG5vX2ZsdXNoOjE7CiAKIAkvKiogSXMgc2V0eGF0dHIgbm90IGltcGxlbWVudGVkIGJ5IGZzPyAqLwotCXVuc2lnbmVkIG5vX3NldHhhdHRyIDogMTsKKwl1bnNpZ25lZCBub19zZXR4YXR0cjoxOwogCiAJLyoqIElzIGdldHhhdHRyIG5vdCBpbXBsZW1lbnRlZCBieSBmcz8gKi8KLQl1bnNpZ25lZCBub19nZXR4YXR0ciA6IDE7CisJdW5zaWduZWQgbm9fZ2V0eGF0dHI6MTsKIAogCS8qKiBJcyBsaXN0eGF0dHIgbm90IGltcGxlbWVudGVkIGJ5IGZzPyAqLwotCXVuc2lnbmVkIG5vX2xpc3R4YXR0ciA6IDE7CisJdW5zaWduZWQgbm9fbGlzdHhhdHRyOjE7CiAKIAkvKiogSXMgcmVtb3ZleGF0dHIgbm90IGltcGxlbWVudGVkIGJ5IGZzPyAqLwotCXVuc2lnbmVkIG5vX3JlbW92ZXhhdHRyIDogMTsKKwl1bnNpZ25lZCBub19yZW1vdmV4YXR0cjoxOwogCiAJLyoqIEFyZSBmaWxlIGxvY2tpbmcgcHJpbWl0aXZlcyBub3QgaW1wbGVtZW50ZWQgYnkgZnM/ICovCi0JdW5zaWduZWQgbm9fbG9jayA6IDE7CisJdW5zaWduZWQgbm9fbG9jazoxOwogCiAJLyoqIElzIGFjY2VzcyBub3QgaW1wbGVtZW50ZWQgYnkgZnM/ICovCi0JdW5zaWduZWQgbm9fYWNjZXNzIDogMTsKKwl1bnNpZ25lZCBub19hY2Nlc3M6MTsKIAogCS8qKiBJcyBjcmVhdGUgbm90IGltcGxlbWVudGVkIGJ5IGZzPyAqLwotCXVuc2lnbmVkIG5vX2NyZWF0ZSA6IDE7CisJdW5zaWduZWQgbm9fY3JlYXRlOjE7CiAKIAkvKiogSXMgaW50ZXJydXB0IG5vdCBpbXBsZW1lbnRlZCBieSBmcz8gKi8KLQl1bnNpZ25lZCBub19pbnRlcnJ1cHQgOiAxOworCXVuc2lnbmVkIG5vX2ludGVycnVwdDoxOwogCiAJLyoqIElzIGJtYXAgbm90IGltcGxlbWVudGVkIGJ5IGZzPyAqLwotCXVuc2lnbmVkIG5vX2JtYXAgOiAxOworCXVuc2lnbmVkIG5vX2JtYXA6MTsKKworCS8qKiBJcyBwb2xsIG5vdCBpbXBsZW1lbnRlZCBieSBmcz8gKi8KKwl1bnNpZ25lZCBub19wb2xsOjE7CiAKIAkvKiogRG8gbXVsdGktcGFnZSBjYWNoZWQgd3JpdGVzICovCi0JdW5zaWduZWQgYmlnX3dyaXRlcyA6IDE7CisJdW5zaWduZWQgYmlnX3dyaXRlczoxOwogCiAJLyoqIFRoZSBudW1iZXIgb2YgcmVxdWVzdHMgd2FpdGluZyBmb3IgY29tcGxldGlvbiAqLwogCWF0b21pY190IG51bV93YWl0aW5nOwpAQCAtNDQ1LDYgKzQ2NSw5IEBACiAKIAkvKiogVmVyc2lvbiBjb3VudGVyIGZvciBhdHRyaWJ1dGUgY2hhbmdlcyAqLwogCXU2NCBhdHRyX3ZlcnNpb247CisKKwkvKiogQ2FsbGVkIG9uIGZpbmFsIHB1dCAqLworCXZvaWQgKCpyZWxlYXNlKShzdHJ1Y3QgZnVzZV9jb25uICopOwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgZnVzZV9jb25uICpnZXRfZnVzZV9jb25uX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCkBAIC00OTksNyArNTIyLDcgQEAKICAqLwogaW50IGZ1c2Vfb3Blbl9jb21tb24oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIGludCBpc2Rpcik7CiAKLXN0cnVjdCBmdXNlX2ZpbGUgKmZ1c2VfZmlsZV9hbGxvYyh2b2lkKTsKK3N0cnVjdCBmdXNlX2ZpbGUgKmZ1c2VfZmlsZV9hbGxvYyhzdHJ1Y3QgZnVzZV9jb25uICpmYyk7CiB2b2lkIGZ1c2VfZmlsZV9mcmVlKHN0cnVjdCBmdXNlX2ZpbGUgKmZmKTsKIHZvaWQgZnVzZV9maW5pc2hfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJICAgICAgc3RydWN0IGZ1c2VfZmlsZSAqZmYsIHN0cnVjdCBmdXNlX29wZW5fb3V0ICpvdXRhcmcpOwpAQCAtNTE5LDYgKzU0MiwxMiBAQAogCQkgICAgICBpbnQgaXNkaXIpOwogCiAvKioKKyAqIE5vdGlmeSBwb2xsIHdha2V1cAorICovCitpbnQgZnVzZV9ub3RpZnlfcG9sbF93YWtldXAoc3RydWN0IGZ1c2VfY29ubiAqZmMsCisJCQkgICAgc3RydWN0IGZ1c2Vfbm90aWZ5X3BvbGxfd2FrZXVwX291dCAqb3V0YXJnKTsKKworLyoqCiAgKiBJbml0aWFsaXplIGZpbGUgb3BlcmF0aW9ucyBvbiBhIHJlZ3VsYXIgZmlsZQogICovCiB2b2lkIGZ1c2VfaW5pdF9maWxlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwpAQCAtNTkzLDE5ICs2MjIsMjAgQEAKIC8qKgogICogU2VuZCBhIHJlcXVlc3QgKHN5bmNocm9ub3VzKQogICovCi12b2lkIHJlcXVlc3Rfc2VuZChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpOwordm9pZCBmdXNlX3JlcXVlc3Rfc2VuZChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpOwogCiAvKioKICAqIFNlbmQgYSByZXF1ZXN0IHdpdGggbm8gcmVwbHkKICAqLwotdm9pZCByZXF1ZXN0X3NlbmRfbm9yZXBseShzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpOwordm9pZCBmdXNlX3JlcXVlc3Rfc2VuZF9ub3JlcGx5KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSk7CiAKIC8qKgogICogU2VuZCBhIHJlcXVlc3QgaW4gdGhlIGJhY2tncm91bmQKICAqLwotdm9pZCByZXF1ZXN0X3NlbmRfYmFja2dyb3VuZChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpOwordm9pZCBmdXNlX3JlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSk7CiAKLXZvaWQgcmVxdWVzdF9zZW5kX2JhY2tncm91bmRfbG9ja2VkKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSk7Cit2b2lkIGZ1c2VfcmVxdWVzdF9zZW5kX2JhY2tncm91bmRfbG9ja2VkKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLAorCQkJCQkgc3RydWN0IGZ1c2VfcmVxICpyZXEpOwogCiAvKiBBYm9ydCBhbGwgcmVxdWVzdHMgKi8KIHZvaWQgZnVzZV9hYm9ydF9jb25uKHN0cnVjdCBmdXNlX2Nvbm4gKmZjKTsKQEAgLTYyMyw2ICs2NTMsMTEgQEAKIHN0cnVjdCBmdXNlX2Nvbm4gKmZ1c2VfY29ubl9nZXQoc3RydWN0IGZ1c2VfY29ubiAqZmMpOwogCiAvKioKKyAqIEluaXRpYWxpemUgZnVzZV9jb25uCisgKi8KK2ludCBmdXNlX2Nvbm5faW5pdChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CisKKy8qKgogICogUmVsZWFzZSByZWZlcmVuY2UgdG8gZnVzZV9jb25uCiAgKi8KIHZvaWQgZnVzZV9jb25uX3B1dChzdHJ1Y3QgZnVzZV9jb25uICpmYyk7CmRpZmYgLS1naXQgYS9mcy9mdXNlL2lub2RlLmMgYi9mcy9mdXNlL2lub2RlLmMKaW5kZXggMmU5OWYzNC4uNDdjOTZmZCAxMDA2NDQKLS0tIGEvZnMvZnVzZS9pbm9kZS5jCisrKyBiL2ZzL2Z1c2UvaW5vZGUuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgIEZVU0U6IEZpbGVzeXN0ZW0gaW4gVXNlcnNwYWNlCi0gIENvcHlyaWdodCAoQykgMjAwMS0yMDA2ICBNaWtsb3MgU3plcmVkaSA8bWlrbG9zQHN6ZXJlZGkuaHU+CisgIENvcHlyaWdodCAoQykgMjAwMS0yMDA4ICBNaWtsb3MgU3plcmVkaSA8bWlrbG9zQHN6ZXJlZGkuaHU+CiAKICAgVGhpcyBwcm9ncmFtIGNhbiBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwuCiAgIFNlZSB0aGUgZmlsZSBDT1BZSU5HLgpAQCAtMzcsMTAgKzM3LDEwIEBACiAJdW5zaWduZWQgcm9vdG1vZGU7CiAJdW5zaWduZWQgdXNlcl9pZDsKIAl1bnNpZ25lZCBncm91cF9pZDsKLQl1bnNpZ25lZCBmZF9wcmVzZW50IDogMTsKLQl1bnNpZ25lZCByb290bW9kZV9wcmVzZW50IDogMTsKLQl1bnNpZ25lZCB1c2VyX2lkX3ByZXNlbnQgOiAxOwotCXVuc2lnbmVkIGdyb3VwX2lkX3ByZXNlbnQgOiAxOworCXVuc2lnbmVkIGZkX3ByZXNlbnQ6MTsKKwl1bnNpZ25lZCByb290bW9kZV9wcmVzZW50OjE7CisJdW5zaWduZWQgdXNlcl9pZF9wcmVzZW50OjE7CisJdW5zaWduZWQgZ3JvdXBfaWRfcHJlc2VudDoxOwogCXVuc2lnbmVkIGZsYWdzOwogCXVuc2lnbmVkIG1heF9yZWFkOwogCXVuc2lnbmVkIGJsa3NpemU7CkBAIC05NCw3ICs5NCw3IEBACiAJcmVxLT5pbi5udW1hcmdzID0gMTsKIAlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZnVzZV9mb3JnZXRfaW4pOwogCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9IGluYXJnOwotCXJlcXVlc3Rfc2VuZF9ub3JlcGx5KGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kX25vcmVwbHkoZmMsIHJlcSk7CiB9CiAKIHN0YXRpYyB2b2lkIGZ1c2VfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKQEAgLTI1MCw3ICsyNTAsNyBAQAogCiAJZmkgPSBnZXRfZnVzZV9pbm9kZShpbm9kZSk7CiAJc3Bpbl9sb2NrKCZmYy0+bG9jayk7Ci0JZmktPm5sb29rdXAgKys7CisJZmktPm5sb29rdXArKzsKIAlzcGluX3VubG9jaygmZmMtPmxvY2spOwogCWZ1c2VfY2hhbmdlX2F0dHJpYnV0ZXMoaW5vZGUsIGF0dHIsIGF0dHJfdmFsaWQsIGF0dHJfdmVyc2lvbik7CiAKQEAgLTI2OSw3ICsyNjksNyBAQAogCQlmYy0+ZGVzdHJveV9yZXEgPSBOVUxMOwogCQlyZXEtPmluLmgub3Bjb2RlID0gRlVTRV9ERVNUUk9ZOwogCQlyZXEtPmZvcmNlID0gMTsKLQkJcmVxdWVzdF9zZW5kKGZjLCByZXEpOworCQlmdXNlX3JlcXVlc3Rfc2VuZChmYywgcmVxKTsKIAkJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIAl9CiB9CkBAIC0zMzQsNyArMzM0LDcgQEAKIAlyZXEtPm91dC5hcmdzWzBdLnNpemUgPQogCQlmYy0+bWlub3IgPCA0ID8gRlVTRV9DT01QQVRfU1RBVEZTX1NJWkUgOiBzaXplb2Yob3V0YXJnKTsKIAlyZXEtPm91dC5hcmdzWzBdLnZhbHVlID0gJm91dGFyZzsKLQlyZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CisJZnVzZV9yZXF1ZXN0X3NlbmQoZmMsIHJlcSk7CiAJZXJyID0gcmVxLT5vdXQuaC5lcnJvcjsKIAlpZiAoIWVycikKIAkJY29udmVydF9mdXNlX3N0YXRmcyhidWYsICZvdXRhcmcuc3QpOwpAQCAtNDYyLDY4ICs0NjIsNjkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBmdXNlX2Nvbm4gKm5ld19jb25uKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCitpbnQgZnVzZV9jb25uX2luaXQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7Ci0Jc3RydWN0IGZ1c2VfY29ubiAqZmM7CiAJaW50IGVycjsKIAotCWZjID0ga3phbGxvYyhzaXplb2YoKmZjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGZjKSB7Ci0JCXNwaW5fbG9ja19pbml0KCZmYy0+bG9jayk7Ci0JCW11dGV4X2luaXQoJmZjLT5pbnN0X211dGV4KTsKLQkJYXRvbWljX3NldCgmZmMtPmNvdW50LCAxKTsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmZmMtPndhaXRxKTsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmZmMtPmJsb2NrZWRfd2FpdHEpOwotCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZmYy0+cmVzZXJ2ZWRfcmVxX3dhaXRxKTsKLQkJSU5JVF9MSVNUX0hFQUQoJmZjLT5wZW5kaW5nKTsKLQkJSU5JVF9MSVNUX0hFQUQoJmZjLT5wcm9jZXNzaW5nKTsKLQkJSU5JVF9MSVNUX0hFQUQoJmZjLT5pbyk7Ci0JCUlOSVRfTElTVF9IRUFEKCZmYy0+aW50ZXJydXB0cyk7Ci0JCUlOSVRfTElTVF9IRUFEKCZmYy0+YmdfcXVldWUpOwotCQlhdG9taWNfc2V0KCZmYy0+bnVtX3dhaXRpbmcsIDApOwotCQlmYy0+YmRpLnJhX3BhZ2VzID0gKFZNX01BWF9SRUFEQUhFQUQgKiAxMDI0KSAvIFBBR0VfQ0FDSEVfU0laRTsKLQkJZmMtPmJkaS51bnBsdWdfaW9fZm4gPSBkZWZhdWx0X3VucGx1Z19pb19mbjsKLQkJLyogZnVzZSBkb2VzIGl0J3Mgb3duIHdyaXRlYmFjayBhY2NvdW50aW5nICovCi0JCWZjLT5iZGkuY2FwYWJpbGl0aWVzID0gQkRJX0NBUF9OT19BQ0NUX1dCOwotCQlmYy0+ZGV2ID0gc2ItPnNfZGV2OwotCQllcnIgPSBiZGlfaW5pdCgmZmMtPmJkaSk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIGVycm9yX2tmcmVlOwotCQlpZiAoc2ItPnNfYmRldikgewotCQkJZXJyID0gYmRpX3JlZ2lzdGVyKCZmYy0+YmRpLCBOVUxMLCAiJXU6JXUtZnVzZWJsayIsCi0JCQkJCSAgIE1BSk9SKGZjLT5kZXYpLCBNSU5PUihmYy0+ZGV2KSk7Ci0JCX0gZWxzZSB7Ci0JCQllcnIgPSBiZGlfcmVnaXN0ZXJfZGV2KCZmYy0+YmRpLCBmYy0+ZGV2KTsKLQkJfQotCQlpZiAoZXJyKQotCQkJZ290byBlcnJvcl9iZGlfZGVzdHJveTsKLQkJLyoKLQkJICogRm9yIGEgc2luZ2xlIGZ1c2UgZmlsZXN5c3RlbSB1c2UgbWF4IDElIG9mIGRpcnR5ICsKLQkJICogd3JpdGViYWNrIHRocmVzaG9sZC4KLQkJICoKLQkJICogVGhpcyBnaXZlcyBhYm91dCAxTSBvZiB3cml0ZSBidWZmZXIgZm9yIG1lbW9yeSBtYXBzIG9uIGEKLQkJICogbWFjaGluZSB3aXRoIDFHIGFuZCAxMCUgZGlydHlfcmF0aW8sIHdoaWNoIHNob3VsZCBiZSBtb3JlCi0JCSAqIHRoYW4gZW5vdWdoLgotCQkgKgotCQkgKiBQcml2aWxlZ2VkIHVzZXJzIGNhbiByYWlzZSBpdCBieSB3cml0aW5nIHRvCi0JCSAqCi0JCSAqICAgIC9zeXMvY2xhc3MvYmRpLzxiZGk+L21heF9yYXRpbwotCQkgKi8KLQkJYmRpX3NldF9tYXhfcmF0aW8oJmZjLT5iZGksIDEpOwotCQlmYy0+cmVxY3RyID0gMDsKLQkJZmMtPmJsb2NrZWQgPSAxOwotCQlmYy0+YXR0cl92ZXJzaW9uID0gMTsKLQkJZ2V0X3JhbmRvbV9ieXRlcygmZmMtPnNjcmFtYmxlX2tleSwgc2l6ZW9mKGZjLT5zY3JhbWJsZV9rZXkpKTsKKwltZW1zZXQoZmMsIDAsIHNpemVvZigqZmMpKTsKKwlzcGluX2xvY2tfaW5pdCgmZmMtPmxvY2spOworCW11dGV4X2luaXQoJmZjLT5pbnN0X211dGV4KTsKKwlhdG9taWNfc2V0KCZmYy0+Y291bnQsIDEpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmZjLT53YWl0cSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZmMtPmJsb2NrZWRfd2FpdHEpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmZjLT5yZXNlcnZlZF9yZXFfd2FpdHEpOworCUlOSVRfTElTVF9IRUFEKCZmYy0+cGVuZGluZyk7CisJSU5JVF9MSVNUX0hFQUQoJmZjLT5wcm9jZXNzaW5nKTsKKwlJTklUX0xJU1RfSEVBRCgmZmMtPmlvKTsKKwlJTklUX0xJU1RfSEVBRCgmZmMtPmludGVycnVwdHMpOworCUlOSVRfTElTVF9IRUFEKCZmYy0+YmdfcXVldWUpOworCUlOSVRfTElTVF9IRUFEKCZmYy0+ZW50cnkpOworCWF0b21pY19zZXQoJmZjLT5udW1fd2FpdGluZywgMCk7CisJZmMtPmJkaS5yYV9wYWdlcyA9IChWTV9NQVhfUkVBREFIRUFEICogMTAyNCkgLyBQQUdFX0NBQ0hFX1NJWkU7CisJZmMtPmJkaS51bnBsdWdfaW9fZm4gPSBkZWZhdWx0X3VucGx1Z19pb19mbjsKKwkvKiBmdXNlIGRvZXMgaXQncyBvd24gd3JpdGViYWNrIGFjY291bnRpbmcgKi8KKwlmYy0+YmRpLmNhcGFiaWxpdGllcyA9IEJESV9DQVBfTk9fQUNDVF9XQjsKKwlmYy0+a2hjdHIgPSAwOworCWZjLT5wb2xsZWRfZmlsZXMgPSBSQl9ST09UOworCWZjLT5kZXYgPSBzYi0+c19kZXY7CisJZXJyID0gYmRpX2luaXQoJmZjLT5iZGkpOworCWlmIChlcnIpCisJCWdvdG8gZXJyb3JfbXV0ZXhfZGVzdHJveTsKKwlpZiAoc2ItPnNfYmRldikgeworCQllcnIgPSBiZGlfcmVnaXN0ZXIoJmZjLT5iZGksIE5VTEwsICIldToldS1mdXNlYmxrIiwKKwkJCQkgICBNQUpPUihmYy0+ZGV2KSwgTUlOT1IoZmMtPmRldikpOworCX0gZWxzZSB7CisJCWVyciA9IGJkaV9yZWdpc3Rlcl9kZXYoJmZjLT5iZGksIGZjLT5kZXYpOwogCX0KLQlyZXR1cm4gZmM7CisJaWYgKGVycikKKwkJZ290byBlcnJvcl9iZGlfZGVzdHJveTsKKwkvKgorCSAqIEZvciBhIHNpbmdsZSBmdXNlIGZpbGVzeXN0ZW0gdXNlIG1heCAxJSBvZiBkaXJ0eSArCisJICogd3JpdGViYWNrIHRocmVzaG9sZC4KKwkgKgorCSAqIFRoaXMgZ2l2ZXMgYWJvdXQgMU0gb2Ygd3JpdGUgYnVmZmVyIGZvciBtZW1vcnkgbWFwcyBvbiBhCisJICogbWFjaGluZSB3aXRoIDFHIGFuZCAxMCUgZGlydHlfcmF0aW8sIHdoaWNoIHNob3VsZCBiZSBtb3JlCisJICogdGhhbiBlbm91Z2guCisJICoKKwkgKiBQcml2aWxlZ2VkIHVzZXJzIGNhbiByYWlzZSBpdCBieSB3cml0aW5nIHRvCisJICoKKwkgKiAgICAvc3lzL2NsYXNzL2JkaS88YmRpPi9tYXhfcmF0aW8KKwkgKi8KKwliZGlfc2V0X21heF9yYXRpbygmZmMtPmJkaSwgMSk7CisJZmMtPnJlcWN0ciA9IDA7CisJZmMtPmJsb2NrZWQgPSAxOworCWZjLT5hdHRyX3ZlcnNpb24gPSAxOworCWdldF9yYW5kb21fYnl0ZXMoJmZjLT5zY3JhbWJsZV9rZXksIHNpemVvZihmYy0+c2NyYW1ibGVfa2V5KSk7CiAKLWVycm9yX2JkaV9kZXN0cm95OgorCXJldHVybiAwOworCisgZXJyb3JfYmRpX2Rlc3Ryb3k6CiAJYmRpX2Rlc3Ryb3koJmZjLT5iZGkpOwotZXJyb3Jfa2ZyZWU6CisgZXJyb3JfbXV0ZXhfZGVzdHJveToKIAltdXRleF9kZXN0cm95KCZmYy0+aW5zdF9tdXRleCk7Ci0Ja2ZyZWUoZmMpOwotCXJldHVybiBOVUxMOworCXJldHVybiBlcnI7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChmdXNlX2Nvbm5faW5pdCk7CiAKIHZvaWQgZnVzZV9jb25uX3B1dChzdHJ1Y3QgZnVzZV9jb25uICpmYykKIHsKQEAgLTUzMiw3ICs1MzMsNyBAQAogCQkJZnVzZV9yZXF1ZXN0X2ZyZWUoZmMtPmRlc3Ryb3lfcmVxKTsKIAkJbXV0ZXhfZGVzdHJveSgmZmMtPmluc3RfbXV0ZXgpOwogCQliZGlfZGVzdHJveSgmZmMtPmJkaSk7Ci0JCWtmcmVlKGZjKTsKKwkJZmMtPnJlbGVhc2UoZmMpOwogCX0KIH0KIApAQCAtNTQyLDcgKzU0Myw3IEBACiAJcmV0dXJuIGZjOwogfQogCi1zdGF0aWMgc3RydWN0IGlub2RlICpnZXRfcm9vdF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBtb2RlKQorc3RhdGljIHN0cnVjdCBpbm9kZSAqZnVzZV9nZXRfcm9vdF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBtb2RlKQogewogCXN0cnVjdCBmdXNlX2F0dHIgYXR0cjsKIAltZW1zZXQoJmF0dHIsIDAsIHNpemVvZihhdHRyKSk7CkBAIC01NTMsOCArNTU0LDcgQEAKIAlyZXR1cm4gZnVzZV9pZ2V0KHNiLCAxLCAwLCAmYXR0ciwgMCwgMCk7CiB9CiAKLXN0cnVjdCBmdXNlX2lub2RlX2hhbmRsZQoteworc3RydWN0IGZ1c2VfaW5vZGVfaGFuZGxlIHsKIAl1NjQgbm9kZWlkOwogCXUzMiBnZW5lcmF0aW9uOwogfTsKQEAgLTc2MSw3ICs3NjEsNiBAQAogCQlmYy0+bWF4X3dyaXRlID0gbWF4X3QodW5zaWduZWQsIDQwOTYsIGZjLT5tYXhfd3JpdGUpOwogCQlmYy0+Y29ubl9pbml0ID0gMTsKIAl9Ci0JZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIAlmYy0+YmxvY2tlZCA9IDA7CiAJd2FrZV91cF9hbGwoJmZjLT5ibG9ja2VkX3dhaXRxKTsKIH0KQEAgLTc4Nyw3ICs3ODYsMTIgQEAKIAlyZXEtPm91dC5hcmdzWzBdLnNpemUgPSBzaXplb2Yoc3RydWN0IGZ1c2VfaW5pdF9vdXQpOwogCXJlcS0+b3V0LmFyZ3NbMF0udmFsdWUgPSAmcmVxLT5taXNjLmluaXRfb3V0OwogCXJlcS0+ZW5kID0gcHJvY2Vzc19pbml0X3JlcGx5OwotCXJlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kKGZjLCByZXEpOworCWZ1c2VfcmVxdWVzdF9zZW5kX2JhY2tncm91bmQoZmMsIHJlcSk7Cit9CisKK3N0YXRpYyB2b2lkIGZ1c2VfZnJlZV9jb25uKHN0cnVjdCBmdXNlX2Nvbm4gKmZjKQoreworCWtmcmVlKGZjKTsKIH0KIAogc3RhdGljIGludCBmdXNlX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKQEAgLTgyOCwxMCArODMyLDE3IEBACiAJaWYgKGZpbGUtPmZfb3AgIT0gJmZ1c2VfZGV2X29wZXJhdGlvbnMpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZmMgPSBuZXdfY29ubihzYik7CisJZmMgPSBrbWFsbG9jKHNpemVvZigqZmMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWZjKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCWVyciA9IGZ1c2VfY29ubl9pbml0KGZjLCBzYik7CisJaWYgKGVycikgeworCQlrZnJlZShmYyk7CisJCXJldHVybiBlcnI7CisJfQorCisJZmMtPnJlbGVhc2UgPSBmdXNlX2ZyZWVfY29ubjsKIAlmYy0+ZmxhZ3MgPSBkLmZsYWdzOwogCWZjLT51c2VyX2lkID0gZC51c2VyX2lkOwogCWZjLT5ncm91cF9pZCA9IGQuZ3JvdXBfaWQ7CkBAIC04NDEsNyArODUyLDcgQEAKIAlzYi0+c19mc19pbmZvID0gZmM7CiAKIAllcnIgPSAtRU5PTUVNOwotCXJvb3QgPSBnZXRfcm9vdF9pbm9kZShzYiwgZC5yb290bW9kZSk7CisJcm9vdCA9IGZ1c2VfZ2V0X3Jvb3RfaW5vZGUoc2IsIGQucm9vdG1vZGUpOwogCWlmICghcm9vdCkKIAkJZ290byBlcnI7CiAKQEAgLTk1Miw3ICs5NjMsNyBAQAogCiBzdGF0aWMgdm9pZCBmdXNlX2lub2RlX2luaXRfb25jZSh2b2lkICpmb28pCiB7Ci0Jc3RydWN0IGlub2RlICogaW5vZGUgPSBmb287CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZvbzsKIAogCWlub2RlX2luaXRfb25jZShpbm9kZSk7CiB9CkBAIC0xMDMxLDcgKzEwNDIsNyBAQAogewogCWludCByZXM7CiAKLQlwcmludGsoImZ1c2UgaW5pdCAoQVBJIHZlcnNpb24gJWkuJWkpXG4iLAorCXByaW50ayhLRVJOX0lORk8gImZ1c2UgaW5pdCAoQVBJIHZlcnNpb24gJWkuJWkpXG4iLAogCSAgICAgICBGVVNFX0tFUk5FTF9WRVJTSU9OLCBGVVNFX0tFUk5FTF9NSU5PUl9WRVJTSU9OKTsKIAogCUlOSVRfTElTVF9IRUFEKCZmdXNlX2Nvbm5fbGlzdCk7CmRpZmYgLS1naXQgYS9mcy9nZnMyL0tjb25maWcgYi9mcy9nZnMyL0tjb25maWcKaW5kZXggYWIyZjU3ZS4uZTU2M2E2NCAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9LY29uZmlnCisrKyBiL2ZzL2dmczIvS2NvbmZpZwpAQCAtMSw2ICsxLDYgQEAKIGNvbmZpZyBHRlMyX0ZTCiAJdHJpc3RhdGUgIkdGUzIgZmlsZSBzeXN0ZW0gc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiAoNjRCSVQgfHwgKExTRiAmJiBMQkQpKQorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmICg2NEJJVCB8fCBMQkQpCiAJc2VsZWN0IEZTX1BPU0lYX0FDTAogCXNlbGVjdCBDUkMzMgogCWhlbHAKZGlmZiAtLWdpdCBhL2ZzL2dmczIvTWFrZWZpbGUgYi9mcy9nZnMyL01ha2VmaWxlCmluZGV4IGVjNjU4NTEuLmMxYjRlYzYgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvTWFrZWZpbGUKKysrIGIvZnMvZ2ZzMi9NYWtlZmlsZQpAQCAtMSw1ICsxLDUgQEAKIG9iai0kKENPTkZJR19HRlMyX0ZTKSArPSBnZnMyLm8KLWdmczIteSA6PSBhY2wubyBibWFwLm8gZGFlbW9uLm8gZGlyLm8gZWFvcHMubyBlYXR0ci5vIGdsb2NrLm8gXAorZ2ZzMi15IDo9IGFjbC5vIGJtYXAubyBkaXIubyBlYW9wcy5vIGVhdHRyLm8gZ2xvY2subyBcCiAJZ2xvcHMubyBpbm9kZS5vIGxvZy5vIGxvcHMubyBsb2NraW5nLm8gbWFpbi5vIG1ldGFfaW8ubyBcCiAJbW91bnQubyBvcHNfYWRkcmVzcy5vIG9wc19kZW50cnkubyBvcHNfZXhwb3J0Lm8gb3BzX2ZpbGUubyBcCiAJb3BzX2ZzdHlwZS5vIG9wc19pbm9kZS5vIG9wc19zdXBlci5vIHF1b3RhLm8gXApkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9hY2wuYyBiL2ZzL2dmczIvYWNsLmMKaW5kZXggM2U5YmQ0Ni4uZTMzNWRjZSAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9hY2wuYworKysgYi9mcy9nZnMyL2FjbC5jCkBAIC05MSw3ICs5MSw3IEBACiAJc3RydWN0IGdmczJfZWFfbG9jYXRpb24gZWxfdGhpczsKIAlpbnQgZXJyb3I7CiAKLQlpZiAoIWlwLT5pX2RpLmRpX2VhdHRyKQorCWlmICghaXAtPmlfZWF0dHIpCiAJCXJldHVybiAwOwogCiAJbWVtc2V0KCZlciwgMCwgc2l6ZW9mKHN0cnVjdCBnZnMyX2VhX3JlcXVlc3QpKTsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvYm1hcC5jIGIvZnMvZ2ZzMi9ibWFwLmMKaW5kZXggYmVjNzZiMS4uMTFmZmM1NiAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9ibWFwLmMKKysrIGIvZnMvZ2ZzMi9ibWFwLmMKQEAgLTc1LDkgKzc1LDkgQEAKIAkJdm9pZCAqa2FkZHIgPSBrbWFwKHBhZ2UpOwogCiAJCW1lbWNweShrYWRkciwgZGliaC0+Yl9kYXRhICsgc2l6ZW9mKHN0cnVjdCBnZnMyX2Rpbm9kZSksCi0JCSAgICAgICBpcC0+aV9kaS5kaV9zaXplKTsKLQkJbWVtc2V0KGthZGRyICsgaXAtPmlfZGkuZGlfc2l6ZSwgMCwKLQkJICAgICAgIFBBR0VfQ0FDSEVfU0laRSAtIGlwLT5pX2RpLmRpX3NpemUpOworCQkgICAgICAgaXAtPmlfZGlza3NpemUpOworCQltZW1zZXQoa2FkZHIgKyBpcC0+aV9kaXNrc2l6ZSwgMCwKKwkJICAgICAgIFBBR0VfQ0FDSEVfU0laRSAtIGlwLT5pX2Rpc2tzaXplKTsKIAkJa3VubWFwKHBhZ2UpOwogCiAJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKQEAgLTEzMiw3ICsxMzIsNyBAQAogCWlmIChlcnJvcikKIAkJZ290byBvdXQ7CiAKLQlpZiAoaXAtPmlfZGkuZGlfc2l6ZSkgeworCWlmIChpcC0+aV9kaXNrc2l6ZSkgewogCQkvKiBHZXQgYSBmcmVlIGJsb2NrLCBmaWxsIGl0IHdpdGggdGhlIHN0dWZmZWQgZGF0YSwKIAkJICAgYW5kIHdyaXRlIGl0IG91dCB0byBkaXNrICovCiAKQEAgLTE1OSw3ICsxNTksNyBAQAogCWRpID0gKHN0cnVjdCBnZnMyX2Rpbm9kZSAqKWRpYmgtPmJfZGF0YTsKIAlnZnMyX2J1ZmZlcl9jbGVhcl90YWlsKGRpYmgsIHNpemVvZihzdHJ1Y3QgZ2ZzMl9kaW5vZGUpKTsKIAotCWlmIChpcC0+aV9kaS5kaV9zaXplKSB7CisJaWYgKGlwLT5pX2Rpc2tzaXplKSB7CiAJCSooX19iZTY0ICopKGRpICsgMSkgPSBjcHVfdG9fYmU2NChibG9jayk7CiAJCWdmczJfYWRkX2lub2RlX2Jsb2NrcygmaXAtPmlfaW5vZGUsIDEpOwogCQlkaS0+ZGlfYmxvY2tzID0gY3B1X3RvX2JlNjQoZ2ZzMl9nZXRfaW5vZGVfYmxvY2tzKCZpcC0+aV9pbm9kZSkpOwpAQCAtOTI2LDcgKzkyNiw3IEBACiAJCX0KIAl9CiAKLQlpcC0+aV9kaS5kaV9zaXplID0gc2l6ZTsKKwlpcC0+aV9kaXNrc2l6ZSA9IHNpemU7CiAJaXAtPmlfaW5vZGUuaV9tdGltZSA9IGlwLT5pX2lub2RlLmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAJZ2ZzMl90cmFuc19hZGRfYmgoaXAtPmlfZ2wsIGRpYmgsIDEpOwogCWdmczJfZGlub2RlX291dChpcCwgZGliaC0+Yl9kYXRhKTsKQEAgLTEwMzMsNyArMTAzMyw3IEBACiAJCWdvdG8gb3V0OwogCiAJaWYgKGdmczJfaXNfc3R1ZmZlZChpcCkpIHsKLQkJaXAtPmlfZGkuZGlfc2l6ZSA9IHNpemU7CisJCWlwLT5pX2Rpc2tzaXplID0gc2l6ZTsKIAkJaXAtPmlfaW5vZGUuaV9tdGltZSA9IGlwLT5pX2lub2RlLmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAJCWdmczJfdHJhbnNfYWRkX2JoKGlwLT5pX2dsLCBkaWJoLCAxKTsKIAkJZ2ZzMl9kaW5vZGVfb3V0KGlwLCBkaWJoLT5iX2RhdGEpOwpAQCAtMTA0NSw5ICsxMDQ1LDkgQEAKIAkJCWVycm9yID0gZ2ZzMl9ibG9ja190cnVuY2F0ZV9wYWdlKGlwLT5pX2lub2RlLmlfbWFwcGluZyk7CiAKIAkJaWYgKCFlcnJvcikgewotCQkJaXAtPmlfZGkuZGlfc2l6ZSA9IHNpemU7CisJCQlpcC0+aV9kaXNrc2l6ZSA9IHNpemU7CiAJCQlpcC0+aV9pbm9kZS5pX210aW1lID0gaXAtPmlfaW5vZGUuaV9jdGltZSA9IENVUlJFTlRfVElNRTsKLQkJCWlwLT5pX2RpLmRpX2ZsYWdzIHw9IEdGUzJfRElGX1RSVU5DX0lOX1BST0c7CisJCQlpcC0+aV9kaXNrZmxhZ3MgfD0gR0ZTMl9ESUZfVFJVTkNfSU5fUFJPRzsKIAkJCWdmczJfdHJhbnNfYWRkX2JoKGlwLT5pX2dsLCBkaWJoLCAxKTsKIAkJCWdmczJfZGlub2RlX291dChpcCwgZGliaC0+Yl9kYXRhKTsKIAkJfQpAQCAtMTExNCwxMyArMTExNCwxMyBAQAogCWlmIChlcnJvcikKIAkJZ290byBvdXQ7CiAKLQlpZiAoIWlwLT5pX2RpLmRpX3NpemUpIHsKKwlpZiAoIWlwLT5pX2Rpc2tzaXplKSB7CiAJCWlwLT5pX2hlaWdodCA9IDA7CiAJCWlwLT5pX2dvYWwgPSBpcC0+aV9ub19hZGRyOwogCQlnZnMyX2J1ZmZlcl9jbGVhcl90YWlsKGRpYmgsIHNpemVvZihzdHJ1Y3QgZ2ZzMl9kaW5vZGUpKTsKIAl9CiAJaXAtPmlfaW5vZGUuaV9tdGltZSA9IGlwLT5pX2lub2RlLmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7Ci0JaXAtPmlfZGkuZGlfZmxhZ3MgJj0gfkdGUzJfRElGX1RSVU5DX0lOX1BST0c7CisJaXAtPmlfZGlza2ZsYWdzICY9IH5HRlMyX0RJRl9UUlVOQ19JTl9QUk9HOwogCiAJZ2ZzMl90cmFuc19hZGRfYmgoaXAtPmlfZ2wsIGRpYmgsIDEpOwogCWdmczJfZGlub2RlX291dChpcCwgZGliaC0+Yl9kYXRhKTsKQEAgLTEyMDUsOSArMTIwNSw5IEBACiAJaWYgKGdmczJfYXNzZXJ0X3dhcm4oR0ZTMl9TQigmaXAtPmlfaW5vZGUpLCBTX0lTUkVHKGlwLT5pX2lub2RlLmlfbW9kZSkpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChzaXplID4gaXAtPmlfZGkuZGlfc2l6ZSkKKwlpZiAoc2l6ZSA+IGlwLT5pX2Rpc2tzaXplKQogCQllcnJvciA9IGRvX2dyb3coaXAsIHNpemUpOwotCWVsc2UgaWYgKHNpemUgPCBpcC0+aV9kaS5kaV9zaXplKQorCWVsc2UgaWYgKHNpemUgPCBpcC0+aV9kaXNrc2l6ZSkKIAkJZXJyb3IgPSBkb19zaHJpbmsoaXAsIHNpemUpOwogCWVsc2UKIAkJLyogdXBkYXRlIHRpbWUgc3RhbXBzICovCkBAIC0xMjE5LDcgKzEyMTksNyBAQAogaW50IGdmczJfdHJ1bmNhdGVpX3Jlc3VtZShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXApCiB7CiAJaW50IGVycm9yOwotCWVycm9yID0gdHJ1bmNfZGVhbGxvYyhpcCwgaXAtPmlfZGkuZGlfc2l6ZSk7CisJZXJyb3IgPSB0cnVuY19kZWFsbG9jKGlwLCBpcC0+aV9kaXNrc2l6ZSk7CiAJaWYgKCFlcnJvcikKIAkJZXJyb3IgPSB0cnVuY19lbmQoaXApOwogCXJldHVybiBlcnJvcjsKQEAgLTEyMzEsMzUgKzEyMzEsNiBAQAogfQogCiAvKioKLSAqIGdmczJfd3JpdGVfY2FsY19yZXNlcnYgLSBjYWxjdWxhdGUgbnVtYmVyIG9mIGJsb2NrcyBuZWVkZWQgdG8gd3JpdGUgdG8gYSBmaWxlCi0gKiBAaXA6IHRoZSBmaWxlCi0gKiBAbGVuOiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGZpbGUKLSAqIEBkYXRhX2Jsb2NrczogcmV0dXJucyB0aGUgbnVtYmVyIG9mIGRhdGEgYmxvY2tzIHJlcXVpcmVkCi0gKiBAaW5kX2Jsb2NrczogcmV0dXJucyB0aGUgbnVtYmVyIG9mIGluZGlyZWN0IGJsb2NrcyByZXF1aXJlZAotICoKLSAqLwotCi12b2lkIGdmczJfd3JpdGVfY2FsY19yZXNlcnYoc3RydWN0IGdmczJfaW5vZGUgKmlwLCB1bnNpZ25lZCBpbnQgbGVuLAotCQkJICAgIHVuc2lnbmVkIGludCAqZGF0YV9ibG9ja3MsIHVuc2lnbmVkIGludCAqaW5kX2Jsb2NrcykKLXsKLQlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0IoJmlwLT5pX2lub2RlKTsKLQl1bnNpZ25lZCBpbnQgdG1wOwotCi0JaWYgKGdmczJfaXNfZGlyKGlwKSkgewotCQkqZGF0YV9ibG9ja3MgPSBESVZfUk9VTkRfVVAobGVuLCBzZHAtPnNkX2pic2l6ZSkgKyAyOwotCQkqaW5kX2Jsb2NrcyA9IDMgKiAoc2RwLT5zZF9tYXhfamhlaWdodCAtIDEpOwotCX0gZWxzZSB7Ci0JCSpkYXRhX2Jsb2NrcyA9IChsZW4gPj4gc2RwLT5zZF9zYi5zYl9ic2l6ZV9zaGlmdCkgKyAzOwotCQkqaW5kX2Jsb2NrcyA9IDMgKiAoc2RwLT5zZF9tYXhfaGVpZ2h0IC0gMSk7Ci0JfQotCi0JZm9yICh0bXAgPSAqZGF0YV9ibG9ja3M7IHRtcCA+IHNkcC0+c2RfZGlwdHJzOykgewotCQl0bXAgPSBESVZfUk9VTkRfVVAodG1wLCBzZHAtPnNkX2lucHRycyk7Ci0JCSppbmRfYmxvY2tzICs9IHRtcDsKLQl9Ci19Ci0KLS8qKgogICogZ2ZzMl93cml0ZV9hbGxvY19yZXF1aXJlZCAtIGZpZ3VyZSBvdXQgaWYgYSB3cml0ZSB3aWxsIHJlcXVpcmUgYW4gYWxsb2NhdGlvbgogICogQGlwOiB0aGUgZmlsZSBiZWluZyB3cml0dGVuIHRvCiAgKiBAb2Zmc2V0OiB0aGUgb2Zmc2V0IHRvIHdyaXRlIHRvCkBAIC0xMjc2LDYgKzEyNDcsNyBAQAogCXN0cnVjdCBidWZmZXJfaGVhZCBiaDsKIAl1bnNpZ25lZCBpbnQgc2hpZnQ7CiAJdTY0IGxibG9jaywgbGJsb2NrX3N0b3AsIHNpemU7CisJdTY0IGVuZF9vZl9maWxlOwogCiAJKmFsbG9jX3JlcXVpcmVkID0gMDsKIApAQCAtMTI5MSwxOSArMTI2MywxMiBAQAogCiAJKmFsbG9jX3JlcXVpcmVkID0gMTsKIAlzaGlmdCA9IHNkcC0+c2Rfc2Iuc2JfYnNpemVfc2hpZnQ7Ci0JaWYgKGdmczJfaXNfZGlyKGlwKSkgewotCQl1bnNpZ25lZCBpbnQgYnNpemUgPSBzZHAtPnNkX2pic2l6ZTsKLQkJbGJsb2NrID0gb2Zmc2V0OwotCQlkb19kaXYobGJsb2NrLCBic2l6ZSk7Ci0JCWxibG9ja19zdG9wID0gb2Zmc2V0ICsgbGVuICsgYnNpemUgLSAxOwotCQlkb19kaXYobGJsb2NrX3N0b3AsIGJzaXplKTsKLQl9IGVsc2UgewotCQl1NjQgZW5kX29mX2ZpbGUgPSAoaXAtPmlfZGkuZGlfc2l6ZSArIHNkcC0+c2Rfc2Iuc2JfYnNpemUgLSAxKSA+PiBzaGlmdDsKLQkJbGJsb2NrID0gb2Zmc2V0ID4+IHNoaWZ0OwotCQlsYmxvY2tfc3RvcCA9IChvZmZzZXQgKyBsZW4gKyBzZHAtPnNkX3NiLnNiX2JzaXplIC0gMSkgPj4gc2hpZnQ7Ci0JCWlmIChsYmxvY2tfc3RvcCA+IGVuZF9vZl9maWxlKQotCQkJcmV0dXJuIDA7Ci0JfQorCUJVR19PTihnZnMyX2lzX2RpcihpcCkpOworCWVuZF9vZl9maWxlID0gKGlwLT5pX2Rpc2tzaXplICsgc2RwLT5zZF9zYi5zYl9ic2l6ZSAtIDEpID4+IHNoaWZ0OworCWxibG9jayA9IG9mZnNldCA+PiBzaGlmdDsKKwlsYmxvY2tfc3RvcCA9IChvZmZzZXQgKyBsZW4gKyBzZHAtPnNkX3NiLnNiX2JzaXplIC0gMSkgPj4gc2hpZnQ7CisJaWYgKGxibG9ja19zdG9wID4gZW5kX29mX2ZpbGUpCisJCXJldHVybiAwOwogCiAJc2l6ZSA9IChsYmxvY2tfc3RvcCAtIGxibG9jaykgPDwgc2hpZnQ7CiAJZG8gewpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9ibWFwLmggYi9mcy9nZnMyL2JtYXAuaAppbmRleCA0ZTZjZGUyLi5jOTgzMTc3IDEwMDY0NAotLS0gYS9mcy9nZnMyL2JtYXAuaAorKysgYi9mcy9nZnMyL2JtYXAuaApAQCAtMTAsMTAgKzEwLDQwIEBACiAjaWZuZGVmIF9fQk1BUF9ET1RfSF9fCiAjZGVmaW5lIF9fQk1BUF9ET1RfSF9fCiAKKyNpbmNsdWRlICJpbm9kZS5oIgorCiBzdHJ1Y3QgaW5vZGU7CiBzdHJ1Y3QgZ2ZzMl9pbm9kZTsKIHN0cnVjdCBwYWdlOwogCisKKy8qKgorICogZ2ZzMl93cml0ZV9jYWxjX3Jlc2VydiAtIGNhbGN1bGF0ZSBudW1iZXIgb2YgYmxvY2tzIG5lZWRlZCB0byB3cml0ZSB0byBhIGZpbGUKKyAqIEBpcDogdGhlIGZpbGUKKyAqIEBsZW46IHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgd3JpdHRlbiB0byB0aGUgZmlsZQorICogQGRhdGFfYmxvY2tzOiByZXR1cm5zIHRoZSBudW1iZXIgb2YgZGF0YSBibG9ja3MgcmVxdWlyZWQKKyAqIEBpbmRfYmxvY2tzOiByZXR1cm5zIHRoZSBudW1iZXIgb2YgaW5kaXJlY3QgYmxvY2tzIHJlcXVpcmVkCisgKgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZnMyX3dyaXRlX2NhbGNfcmVzZXJ2KGNvbnN0IHN0cnVjdCBnZnMyX2lub2RlICppcCwKKwkJCQkJICB1bnNpZ25lZCBpbnQgbGVuLAorCQkJCQkgIHVuc2lnbmVkIGludCAqZGF0YV9ibG9ja3MsCisJCQkJCSAgdW5zaWduZWQgaW50ICppbmRfYmxvY2tzKQoreworCWNvbnN0IHN0cnVjdCBnZnMyX3NiZCAqc2RwID0gR0ZTMl9TQigmaXAtPmlfaW5vZGUpOworCXVuc2lnbmVkIGludCB0bXA7CisKKwlCVUdfT04oZ2ZzMl9pc19kaXIoaXApKTsKKwkqZGF0YV9ibG9ja3MgPSAobGVuID4+IHNkcC0+c2Rfc2Iuc2JfYnNpemVfc2hpZnQpICsgMzsKKwkqaW5kX2Jsb2NrcyA9IDMgKiAoc2RwLT5zZF9tYXhfaGVpZ2h0IC0gMSk7CisKKwlmb3IgKHRtcCA9ICpkYXRhX2Jsb2NrczsgdG1wID4gc2RwLT5zZF9kaXB0cnM7KSB7CisJCXRtcCA9IERJVl9ST1VORF9VUCh0bXAsIHNkcC0+c2RfaW5wdHJzKTsKKwkJKmluZF9ibG9ja3MgKz0gdG1wOworCX0KK30KKwogaW50IGdmczJfdW5zdHVmZl9kaW5vZGUoc3RydWN0IGdmczJfaW5vZGUgKmlwLCBzdHJ1Y3QgcGFnZSAqcGFnZSk7CiBpbnQgZ2ZzMl9ibG9ja19tYXAoc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgbGJsb2NrLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgY3JlYXRlKTsKIGludCBnZnMyX2V4dGVudF9tYXAoc3RydWN0IGlub2RlICppbm9kZSwgdTY0IGxibG9jaywgaW50ICpuZXcsIHU2NCAqZGJsb2NrLCB1bnNpZ25lZCAqZXh0bGVuKTsKQEAgLTIxLDEwICs1MSw2IEBACiBpbnQgZ2ZzMl90cnVuY2F0ZWkoc3RydWN0IGdmczJfaW5vZGUgKmlwLCB1NjQgc2l6ZSk7CiBpbnQgZ2ZzMl90cnVuY2F0ZWlfcmVzdW1lKHN0cnVjdCBnZnMyX2lub2RlICppcCk7CiBpbnQgZ2ZzMl9maWxlX2RlYWxsb2Moc3RydWN0IGdmczJfaW5vZGUgKmlwKTsKLQotdm9pZCBnZnMyX3dyaXRlX2NhbGNfcmVzZXJ2KHN0cnVjdCBnZnMyX2lub2RlICppcCwgdW5zaWduZWQgaW50IGxlbiwKLQkJCSAgICB1bnNpZ25lZCBpbnQgKmRhdGFfYmxvY2tzLAotCQkJICAgIHVuc2lnbmVkIGludCAqaW5kX2Jsb2Nrcyk7CiBpbnQgZ2ZzMl93cml0ZV9hbGxvY19yZXF1aXJlZChzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIHU2NCBvZmZzZXQsCiAJCQkgICAgICB1bnNpZ25lZCBpbnQgbGVuLCBpbnQgKmFsbG9jX3JlcXVpcmVkKTsKIApkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9kYWVtb24uYyBiL2ZzL2dmczIvZGFlbW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MTk5MTkuLjAwMDAwMDAKLS0tIGEvZnMvZ2ZzMi9kYWVtb24uYworKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuICAxOTk3LTIwMDMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IFJlZCBIYXQsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCi0gKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KLSNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9nZnMyX29uZGlzay5oPgotI2luY2x1ZGUgPGxpbnV4L2xtX2ludGVyZmFjZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KLQotI2luY2x1ZGUgImdmczIuaCIKLSNpbmNsdWRlICJpbmNvcmUuaCIKLSNpbmNsdWRlICJkYWVtb24uaCIKLSNpbmNsdWRlICJnbG9jay5oIgotI2luY2x1ZGUgImxvZy5oIgotI2luY2x1ZGUgInF1b3RhLmgiCi0jaW5jbHVkZSAicmVjb3ZlcnkuaCIKLSNpbmNsdWRlICJzdXBlci5oIgotI2luY2x1ZGUgInV0aWwuaCIKLQotLyogVGhpcyB1c2VzIHNjaGVkdWxlX3RpbWVvdXQoKSBpbnN0ZWFkIG9mIG1zbGVlcCgpIGJlY2F1c2UgaXQncyBnb29kIGZvcgotICAgdGhlIGRhZW1vbnMgdG8gd2FrZSB1cCBtb3JlIG9mdGVuIHRoYW4gdGhlIHRpbWVvdXQgd2hlbiB1bm1vdW50aW5nIHNvCi0gICB0aGUgdXNlcidzIHVubW91bnQgZG9lc24ndCBzaXQgdGhlcmUgZm9yZXZlci4KLQotICAgVGhlIGt0aHJlYWQgZnVuY3Rpb25zIHVzZWQgdG8gc3RhcnQgdGhlc2UgZGFlbW9ucyBibG9jayBhbmQgZmx1c2ggc2lnbmFscy4gKi8KLQotLyoqCi0gKiBnZnMyX2dsb2NrZCAtIFJlY2xhaW0gdW51c2VkIGdsb2NrIHN0cnVjdHVyZXMKLSAqIEBzZHA6IFBvaW50ZXIgdG8gR0ZTMiBzdXBlcmJsb2NrCi0gKgotICogT25lIG9yIG1vcmUgb2YgdGhlc2UgZGFlbW9ucyBydW4sIHJlY2xhaW1pbmcgZ2xvY2tzIG9uIHNkX3JlY2xhaW1fbGlzdC4KLSAqIE51bWJlciBvZiBkYWVtb25zIGNhbiBiZSBzZXQgYnkgdXNlciwgd2l0aCBudW1fZ2xvY2tkIG1vdW50IG9wdGlvbi4KLSAqLwotCi1pbnQgZ2ZzMl9nbG9ja2Qodm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IGRhdGE7Ci0KLQl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewotCQl3aGlsZSAoYXRvbWljX3JlYWQoJnNkcC0+c2RfcmVjbGFpbV9jb3VudCkpCi0JCQlnZnMyX3JlY2xhaW1fZ2xvY2soc2RwKTsKLQotCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoc2RwLT5zZF9yZWNsYWltX3dxLAotCQkJCQkgKGF0b21pY19yZWFkKCZzZHAtPnNkX3JlY2xhaW1fY291bnQpIHx8Ci0JCQkJCSBrdGhyZWFkX3Nob3VsZF9zdG9wKCkpKTsKLQkJaWYgKGZyZWV6aW5nKGN1cnJlbnQpKQotCQkJcmVmcmlnZXJhdG9yKCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogZ2ZzMl9yZWNvdmVyZCAtIFJlY292ZXIgZGVhZCBtYWNoaW5lJ3Mgam91cm5hbHMKLSAqIEBzZHA6IFBvaW50ZXIgdG8gR0ZTMiBzdXBlcmJsb2NrCi0gKgotICovCi0KLWludCBnZnMyX3JlY292ZXJkKHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGdmczJfc2JkICpzZHAgPSBkYXRhOwotCXVuc2lnbmVkIGxvbmcgdDsKLQotCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7Ci0JCWdmczJfY2hlY2tfam91cm5hbHMoc2RwKTsKLQkJdCA9IGdmczJfdHVuZV9nZXQoc2RwLCAgZ3RfcmVjb3ZlcmRfc2VjcykgKiBIWjsKLQkJaWYgKGZyZWV6aW5nKGN1cnJlbnQpKQotCQkJcmVmcmlnZXJhdG9yKCk7Ci0JCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSh0KTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBnZnMyX3F1b3RhZCAtIFdyaXRlIGNhY2hlZCBxdW90YSBjaGFuZ2VzIGludG8gdGhlIHF1b3RhIGZpbGUKLSAqIEBzZHA6IFBvaW50ZXIgdG8gR0ZTMiBzdXBlcmJsb2NrCi0gKgotICovCi0KLWludCBnZnMyX3F1b3RhZCh2b2lkICpkYXRhKQotewotCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gZGF0YTsKLQl1bnNpZ25lZCBsb25nIHQ7Ci0JaW50IGVycm9yOwotCi0Jd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKLQkJLyogVXBkYXRlIHRoZSBtYXN0ZXIgc3RhdGZzIGZpbGUgKi8KLQotCQl0ID0gc2RwLT5zZF9zdGF0ZnNfc3luY190aW1lICsKLQkJICAgIGdmczJfdHVuZV9nZXQoc2RwLCBndF9zdGF0ZnNfcXVhbnR1bSkgKiBIWjsKLQotCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCB0KSkgewotCQkJZXJyb3IgPSBnZnMyX3N0YXRmc19zeW5jKHNkcCk7Ci0JCQlpZiAoZXJyb3IgJiYKLQkJCSAgICBlcnJvciAhPSAtRVJPRlMgJiYKLQkJCSAgICAhdGVzdF9iaXQoU0RGX1NIVVRET1dOLCAmc2RwLT5zZF9mbGFncykpCi0JCQkJZnNfZXJyKHNkcCwgInF1b3RhZDogKDEpIGVycm9yPSVkXG4iLCBlcnJvcik7Ci0JCQlzZHAtPnNkX3N0YXRmc19zeW5jX3RpbWUgPSBqaWZmaWVzOwotCQl9Ci0KLQkJLyogVXBkYXRlIHF1b3RhIGZpbGUgKi8KLQotCQl0ID0gc2RwLT5zZF9xdW90YV9zeW5jX3RpbWUgKwotCQkgICAgZ2ZzMl90dW5lX2dldChzZHAsIGd0X3F1b3RhX3F1YW50dW0pICogSFo7Ci0KLQkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgdCkpIHsKLQkJCWVycm9yID0gZ2ZzMl9xdW90YV9zeW5jKHNkcCk7Ci0JCQlpZiAoZXJyb3IgJiYKLQkJCSAgICBlcnJvciAhPSAtRVJPRlMgJiYKLQkJCSAgICAhdGVzdF9iaXQoU0RGX1NIVVRET1dOLCAmc2RwLT5zZF9mbGFncykpCi0JCQkJZnNfZXJyKHNkcCwgInF1b3RhZDogKDIpIGVycm9yPSVkXG4iLCBlcnJvcik7Ci0JCQlzZHAtPnNkX3F1b3RhX3N5bmNfdGltZSA9IGppZmZpZXM7Ci0JCX0KLQotCQlnZnMyX3F1b3RhX3NjYW4oc2RwKTsKLQotCQl0ID0gZ2ZzMl90dW5lX2dldChzZHAsIGd0X3F1b3RhZF9zZWNzKSAqIEhaOwotCQlpZiAoZnJlZXppbmcoY3VycmVudCkpCi0JCQlyZWZyaWdlcmF0b3IoKTsKLQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKHQpOwotCX0KLQotCXJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS9mcy9nZnMyL2RhZW1vbi5oIGIvZnMvZ2ZzMi9kYWVtb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJlMDg0Zi4uMDAwMDAwMAotLS0gYS9mcy9nZnMyL2RhZW1vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiAgMTk5Ny0yMDAzIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBSZWQgSGF0LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAotICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuCi0gKi8KLQotI2lmbmRlZiBfX0RBRU1PTl9ET1RfSF9fCi0jZGVmaW5lIF9fREFFTU9OX0RPVF9IX18KLQotaW50IGdmczJfZ2xvY2tkKHZvaWQgKmRhdGEpOwotaW50IGdmczJfcmVjb3ZlcmQodm9pZCAqZGF0YSk7Ci1pbnQgZ2ZzMl9xdW90YWQodm9pZCAqZGF0YSk7Ci0KLSNlbmRpZiAvKiBfX0RBRU1PTl9ET1RfSF9fICovCmRpZmYgLS1naXQgYS9mcy9nZnMyL2Rpci5jIGIvZnMvZ2ZzMi9kaXIuYwppbmRleCBlZWQwNDBkLi5iN2M4ZTVjIDEwMDY0NAotLS0gYS9mcy9nZnMyL2Rpci5jCisrKyBiL2ZzL2dmczIvZGlyLmMKQEAgLTM2LDcgKzM2LDcgQEAKICAqIHRoZSBibG9jay4gIEluIGxlYXZlcywgdGhleSBiZWdpbiBhdCBvZmZzZXQgc2l6ZW9mKHN0cnVjdCBnZnMyX2xlYWYpIGZyb20gdGhlCiAgKiBiZWdpbm5pbmcgb2YgdGhlIGxlYWYgYmxvY2suIFRoZSBkaXJlbnRzIHJlc2lkZSBpbiBsZWF2ZXMgd2hlbgogICoKLSAqIGRpcC0+aV9kaS5kaV9mbGFncyAmIEdGUzJfRElGX0VYSEFTSCBpcyB0cnVlCisgKiBkaXAtPmlfZGlza2ZsYWdzICYgR0ZTMl9ESUZfRVhIQVNIIGlzIHRydWUKICAqCiAgKiBPdGhlcndpc2UsIHRoZSBkaXJlbnRzIGFyZSAibGluZWFyIiwgd2l0aGluIGEgc2luZ2xlIHN0dWZmZWQgZGlub2RlIGJsb2NrLgogICoKQEAgLTEyOCw4ICsxMjgsOCBAQAogCiAJZ2ZzMl90cmFuc19hZGRfYmgoaXAtPmlfZ2wsIGRpYmgsIDEpOwogCW1lbWNweShkaWJoLT5iX2RhdGEgKyBvZmZzZXQgKyBzaXplb2Yoc3RydWN0IGdmczJfZGlub2RlKSwgYnVmLCBzaXplKTsKLQlpZiAoaXAtPmlfZGkuZGlfc2l6ZSA8IG9mZnNldCArIHNpemUpCi0JCWlwLT5pX2RpLmRpX3NpemUgPSBvZmZzZXQgKyBzaXplOworCWlmIChpcC0+aV9kaXNrc2l6ZSA8IG9mZnNldCArIHNpemUpCisJCWlwLT5pX2Rpc2tzaXplID0gb2Zmc2V0ICsgc2l6ZTsKIAlpcC0+aV9pbm9kZS5pX210aW1lID0gaXAtPmlfaW5vZGUuaV9jdGltZSA9IENVUlJFTlRfVElNRTsKIAlnZnMyX2Rpbm9kZV9vdXQoaXAsIGRpYmgtPmJfZGF0YSk7CiAKQEAgLTIyNiw4ICsyMjYsOCBAQAogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwogCi0JaWYgKGlwLT5pX2RpLmRpX3NpemUgPCBvZmZzZXQgKyBjb3BpZWQpCi0JCWlwLT5pX2RpLmRpX3NpemUgPSBvZmZzZXQgKyBjb3BpZWQ7CisJaWYgKGlwLT5pX2Rpc2tzaXplIDwgb2Zmc2V0ICsgY29waWVkKQorCQlpcC0+aV9kaXNrc2l6ZSA9IG9mZnNldCArIGNvcGllZDsKIAlpcC0+aV9pbm9kZS5pX210aW1lID0gaXAtPmlfaW5vZGUuaV9jdGltZSA9IENVUlJFTlRfVElNRTsKIAogCWdmczJfdHJhbnNfYWRkX2JoKGlwLT5pX2dsLCBkaWJoLCAxKTsKQEAgLTI3NywxMSArMjc3LDExIEBACiAJaW50IGNvcGllZCA9IDA7CiAJaW50IGVycm9yID0gMDsKIAotCWlmIChvZmZzZXQgPj0gaXAtPmlfZGkuZGlfc2l6ZSkKKwlpZiAob2Zmc2V0ID49IGlwLT5pX2Rpc2tzaXplKQogCQlyZXR1cm4gMDsKIAotCWlmIChvZmZzZXQgKyBzaXplID4gaXAtPmlfZGkuZGlfc2l6ZSkKLQkJc2l6ZSA9IGlwLT5pX2RpLmRpX3NpemUgLSBvZmZzZXQ7CisJaWYgKG9mZnNldCArIHNpemUgPiBpcC0+aV9kaXNrc2l6ZSkKKwkJc2l6ZSA9IGlwLT5pX2Rpc2tzaXplIC0gb2Zmc2V0OwogCiAJaWYgKCFzaXplKQogCQlyZXR1cm4gMDsKQEAgLTc1NSwxMiArNzU1LDEyIEBACiAJc3RydWN0IGdmczJfaW5vZGUgKmlwID0gR0ZTMl9JKGlub2RlKTsKIAlpbnQgZXJyb3I7CiAKLQlpZiAoaXAtPmlfZGkuZGlfZmxhZ3MgJiBHRlMyX0RJRl9FWEhBU0gpIHsKKwlpZiAoaXAtPmlfZGlza2ZsYWdzICYgR0ZTMl9ESUZfRVhIQVNIKSB7CiAJCXN0cnVjdCBnZnMyX2xlYWYgKmxlYWY7CiAJCXVuc2lnbmVkIGhzaXplID0gMSA8PCBpcC0+aV9kZXB0aDsKIAkJdW5zaWduZWQgaW5kZXg7CiAJCXU2NCBsbjsKLQkJaWYgKGhzaXplICogc2l6ZW9mKHU2NCkgIT0gaXAtPmlfZGkuZGlfc2l6ZSkgeworCQlpZiAoaHNpemUgKiBzaXplb2YodTY0KSAhPSBpcC0+aV9kaXNrc2l6ZSkgewogCQkJZ2ZzMl9jb25zaXN0X2lub2RlKGlwKTsKIAkJCXJldHVybiBFUlJfUFRSKC1FSU8pOwogCQl9CkBAIC04NTgsOCArODU4LDggQEAKIAkJcmV0dXJuIC1FTk9TUEM7CiAJYm4gPSBiaC0+Yl9ibG9ja25yOwogCi0JZ2ZzMl9hc3NlcnQoc2RwLCBkaXAtPmlfZGkuZGlfZW50cmllcyA8ICgxIDw8IDE2KSk7Ci0JbGVhZi0+bGZfZW50cmllcyA9IGNwdV90b19iZTE2KGRpcC0+aV9kaS5kaV9lbnRyaWVzKTsKKwlnZnMyX2Fzc2VydChzZHAsIGRpcC0+aV9lbnRyaWVzIDwgKDEgPDwgMTYpKTsKKwlsZWFmLT5sZl9lbnRyaWVzID0gY3B1X3RvX2JlMTYoZGlwLT5pX2VudHJpZXMpOwogCiAJLyogIENvcHkgZGlyZW50cyAgKi8KIApAQCAtOTA1LDkgKzkwNSw5IEBACiAJZm9yICh4ID0gc2RwLT5zZF9oYXNoX3B0cnM7IHgtLTsgbHArKykKIAkJKmxwID0gY3B1X3RvX2JlNjQoYm4pOwogCi0JZGlwLT5pX2RpLmRpX3NpemUgPSBzZHAtPnNkX3NiLnNiX2JzaXplIC8gMjsKKwlkaXAtPmlfZGlza3NpemUgPSBzZHAtPnNkX3NiLnNiX2JzaXplIC8gMjsKIAlnZnMyX2FkZF9pbm9kZV9ibG9ja3MoJmRpcC0+aV9pbm9kZSwgMSk7Ci0JZGlwLT5pX2RpLmRpX2ZsYWdzIHw9IEdGUzJfRElGX0VYSEFTSDsKKwlkaXAtPmlfZGlza2ZsYWdzIHw9IEdGUzJfRElGX0VYSEFTSDsKIAogCWZvciAoeCA9IHNkcC0+c2RfaGFzaF9wdHJzLCB5ID0gLTE7IHg7IHggPj49IDEsIHkrKykgOwogCWRpcC0+aV9kZXB0aCA9IHk7CkBAIC0xMDgyLDcgKzEwODIsNyBAQAogCWludCBlcnJvciA9IDA7CiAKIAloc2l6ZSA9IDEgPDwgZGlwLT5pX2RlcHRoOwotCWlmIChoc2l6ZSAqIHNpemVvZih1NjQpICE9IGRpcC0+aV9kaS5kaV9zaXplKSB7CisJaWYgKGhzaXplICogc2l6ZW9mKHU2NCkgIT0gZGlwLT5pX2Rpc2tzaXplKSB7CiAJCWdmczJfY29uc2lzdF9pbm9kZShkaXApOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0xMDkxLDcgKzEwOTEsNyBAQAogCiAJYnVmID0ga2NhbGxvYygzLCBzZHAtPnNkX2hhc2hfYnNpemUsIEdGUF9OT0ZTIHwgX19HRlBfTk9GQUlMKTsKIAotCWZvciAoYmxvY2sgPSBkaXAtPmlfZGkuZGlfc2l6ZSA+PiBzZHAtPnNkX2hhc2hfYnNpemVfc2hpZnQ7IGJsb2NrLS07KSB7CisJZm9yIChibG9jayA9IGRpcC0+aV9kaXNrc2l6ZSA+PiBzZHAtPnNkX2hhc2hfYnNpemVfc2hpZnQ7IGJsb2NrLS07KSB7CiAJCWVycm9yID0gZ2ZzMl9kaXJfcmVhZF9kYXRhKGRpcCwgKGNoYXIgKilidWYsCiAJCQkJCSAgICBibG9jayAqIHNkcC0+c2RfaGFzaF9ic2l6ZSwKIAkJCQkJICAgIHNkcC0+c2RfaGFzaF9ic2l6ZSwgMSk7CkBAIC0xMzcwLDcgKzEzNzAsNyBAQAogCXVuc2lnbmVkIGRlcHRoID0gMDsKIAogCWhzaXplID0gMSA8PCBkaXAtPmlfZGVwdGg7Ci0JaWYgKGhzaXplICogc2l6ZW9mKHU2NCkgIT0gZGlwLT5pX2RpLmRpX3NpemUpIHsKKwlpZiAoaHNpemUgKiBzaXplb2YodTY0KSAhPSBkaXAtPmlfZGlza3NpemUpIHsKIAkJZ2ZzMl9jb25zaXN0X2lub2RlKGRpcCk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTE0MjYsMTAgKzE0MjYsMTAgQEAKIAlpbnQgY29waWVkID0gMDsKIAlpbnQgZXJyb3I7CiAKLQlpZiAoIWRpcC0+aV9kaS5kaV9lbnRyaWVzKQorCWlmICghZGlwLT5pX2VudHJpZXMpCiAJCXJldHVybiAwOwogCi0JaWYgKGRpcC0+aV9kaS5kaV9mbGFncyAmIEdGUzJfRElGX0VYSEFTSCkKKwlpZiAoZGlwLT5pX2Rpc2tmbGFncyAmIEdGUzJfRElGX0VYSEFTSCkKIAkJcmV0dXJuIGRpcl9lX3JlYWQoaW5vZGUsIG9mZnNldCwgb3BhcXVlLCBmaWxsZGlyKTsKIAogCWlmICghZ2ZzMl9pc19zdHVmZmVkKGRpcCkpIHsKQEAgLTE0NTMsMTcgKzE0NTMsMTcgQEAKIAkJCWVycm9yID0gUFRSX0VSUihkZW50KTsKIAkJCWdvdG8gb3V0OwogCQl9Ci0JCWlmIChkaXAtPmlfZGkuZGlfZW50cmllcyAhPSBnLm9mZnNldCkgeworCQlpZiAoZGlwLT5pX2VudHJpZXMgIT0gZy5vZmZzZXQpIHsKIAkJCWZzX3dhcm4oc2RwLCAiTnVtYmVyIG9mIGVudHJpZXMgY29ycnVwdCBpbiBkaXIgJWxsdSwgIgotCQkJCSJpcC0+aV9kaS5kaV9lbnRyaWVzICgldSkgIT0gZy5vZmZzZXQgKCV1KVxuIiwKKwkJCQkiaXAtPmlfZW50cmllcyAoJXUpICE9IGcub2Zmc2V0ICgldSlcbiIsCiAJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylkaXAtPmlfbm9fYWRkciwKLQkJCQlkaXAtPmlfZGkuZGlfZW50cmllcywKKwkJCQlkaXAtPmlfZW50cmllcywKIAkJCQlnLm9mZnNldCk7CiAJCQllcnJvciA9IC1FSU87CiAJCQlnb3RvIG91dDsKIAkJfQogCQllcnJvciA9IGRvX2ZpbGxkaXJfbWFpbihkaXAsIG9mZnNldCwgb3BhcXVlLCBmaWxsZGlyLCBkYXJyLAotCQkJCQlkaXAtPmlfZGkuZGlfZW50cmllcywgJmNvcGllZCk7CisJCQkJCWRpcC0+aV9lbnRyaWVzLCAmY29waWVkKTsKIG91dDoKIAkJa2ZyZWUoZGFycik7CiAJfQpAQCAtMTYxMiw3ICsxNjEyLDcgQEAKIAkJCWRlbnQgPSBnZnMyX2luaXRfZGlyZW50KGlub2RlLCBkZW50LCBuYW1lLCBiaCk7CiAJCQlnZnMyX2ludW1fb3V0KG5pcCwgZGVudCk7CiAJCQlkZW50LT5kZV90eXBlID0gY3B1X3RvX2JlMTYodHlwZSk7Ci0JCQlpZiAoaXAtPmlfZGkuZGlfZmxhZ3MgJiBHRlMyX0RJRl9FWEhBU0gpIHsKKwkJCWlmIChpcC0+aV9kaXNrZmxhZ3MgJiBHRlMyX0RJRl9FWEhBU0gpIHsKIAkJCQlsZWFmID0gKHN0cnVjdCBnZnMyX2xlYWYgKiliaC0+Yl9kYXRhOwogCQkJCWJlMTZfYWRkX2NwdSgmbGVhZi0+bGZfZW50cmllcywgMSk7CiAJCQl9CkBAIC0xNjIxLDE0ICsxNjIxLDE0IEBACiAJCQlpZiAoZXJyb3IpCiAJCQkJYnJlYWs7CiAJCQlnZnMyX3RyYW5zX2FkZF9iaChpcC0+aV9nbCwgYmgsIDEpOwotCQkJaXAtPmlfZGkuZGlfZW50cmllcysrOworCQkJaXAtPmlfZW50cmllcysrOwogCQkJaXAtPmlfaW5vZGUuaV9tdGltZSA9IGlwLT5pX2lub2RlLmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAJCQlnZnMyX2Rpbm9kZV9vdXQoaXAsIGJoLT5iX2RhdGEpOwogCQkJYnJlbHNlKGJoKTsKIAkJCWVycm9yID0gMDsKIAkJCWJyZWFrOwogCQl9Ci0JCWlmICghKGlwLT5pX2RpLmRpX2ZsYWdzICYgR0ZTMl9ESUZfRVhIQVNIKSkgeworCQlpZiAoIShpcC0+aV9kaXNrZmxhZ3MgJiBHRlMyX0RJRl9FWEhBU0gpKSB7CiAJCQllcnJvciA9IGRpcl9tYWtlX2V4aGFzaChpbm9kZSk7CiAJCQlpZiAoZXJyb3IpCiAJCQkJYnJlYWs7CkBAIC0xNjkxLDcgKzE2OTEsNyBAQAogCX0KIAogCWRpcmVudF9kZWwoZGlwLCBiaCwgcHJldiwgZGVudCk7Ci0JaWYgKGRpcC0+aV9kaS5kaV9mbGFncyAmIEdGUzJfRElGX0VYSEFTSCkgeworCWlmIChkaXAtPmlfZGlza2ZsYWdzICYgR0ZTMl9ESUZfRVhIQVNIKSB7CiAJCXN0cnVjdCBnZnMyX2xlYWYgKmxlYWYgPSAoc3RydWN0IGdmczJfbGVhZiAqKWJoLT5iX2RhdGE7CiAJCXUxNiBlbnRyaWVzID0gYmUxNl90b19jcHUobGVhZi0+bGZfZW50cmllcyk7CiAJCWlmICghZW50cmllcykKQEAgLTE3MDQsMTAgKzE3MDQsMTAgQEAKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIAotCWlmICghZGlwLT5pX2RpLmRpX2VudHJpZXMpCisJaWYgKCFkaXAtPmlfZW50cmllcykKIAkJZ2ZzMl9jb25zaXN0X2lub2RlKGRpcCk7CiAJZ2ZzMl90cmFuc19hZGRfYmgoZGlwLT5pX2dsLCBiaCwgMSk7Ci0JZGlwLT5pX2RpLmRpX2VudHJpZXMtLTsKKwlkaXAtPmlfZW50cmllcy0tOwogCWRpcC0+aV9pbm9kZS5pX210aW1lID0gZGlwLT5pX2lub2RlLmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAJZ2ZzMl9kaW5vZGVfb3V0KGRpcCwgYmgtPmJfZGF0YSk7CiAJYnJlbHNlKGJoKTsKQEAgLTE3NDgsNyArMTc0OCw3IEBACiAJZ2ZzMl9pbnVtX291dChuaXAsIGRlbnQpOwogCWRlbnQtPmRlX3R5cGUgPSBjcHVfdG9fYmUxNihuZXdfdHlwZSk7CiAKLQlpZiAoZGlwLT5pX2RpLmRpX2ZsYWdzICYgR0ZTMl9ESUZfRVhIQVNIKSB7CisJaWYgKGRpcC0+aV9kaXNrZmxhZ3MgJiBHRlMyX0RJRl9FWEhBU0gpIHsKIAkJYnJlbHNlKGJoKTsKIAkJZXJyb3IgPSBnZnMyX21ldGFfaW5vZGVfYnVmZmVyKGRpcCwgJmJoKTsKIAkJaWYgKGVycm9yKQpAQCAtMTc4NCw3ICsxNzg0LDcgQEAKIAlpbnQgZXJyb3IgPSAwOwogCiAJaHNpemUgPSAxIDw8IGRpcC0+aV9kZXB0aDsKLQlpZiAoaHNpemUgKiBzaXplb2YodTY0KSAhPSBkaXAtPmlfZGkuZGlfc2l6ZSkgeworCWlmIChoc2l6ZSAqIHNpemVvZih1NjQpICE9IGRpcC0+aV9kaXNrc2l6ZSkgewogCQlnZnMyX2NvbnNpc3RfaW5vZGUoZGlwKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9kaXIuaCBiL2ZzL2dmczIvZGlyLmgKaW5kZXggOGE0NjhjYS4uNGY5MTk0NCAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9kaXIuaAorKysgYi9mcy9nZnMyL2Rpci5oCkBAIC0xMSw2ICsxMSw3IEBACiAjZGVmaW5lIF9fRElSX0RPVF9IX18KIAogI2luY2x1ZGUgPGxpbnV4L2RjYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CiAKIHN0cnVjdCBpbm9kZTsKIHN0cnVjdCBnZnMyX2lub2RlOwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9lYXR0ci5jIGIvZnMvZ2ZzMi9lYXR0ci5jCmluZGV4IGUzZjc2ZjQuLjBkMWM3NmQgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvZWF0dHIuYworKysgYi9mcy9nZnMyL2VhdHRyLmMKQEAgLTExNCwxMSArMTE0LDExIEBACiAJX19iZTY0ICplYWJsaywgKmVuZDsKIAlpbnQgZXJyb3I7CiAKLQllcnJvciA9IGdmczJfbWV0YV9yZWFkKGlwLT5pX2dsLCBpcC0+aV9kaS5kaV9lYXR0ciwgRElPX1dBSVQsICZiaCk7CisJZXJyb3IgPSBnZnMyX21ldGFfcmVhZChpcC0+aV9nbCwgaXAtPmlfZWF0dHIsIERJT19XQUlULCAmYmgpOwogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwogCi0JaWYgKCEoaXAtPmlfZGkuZGlfZmxhZ3MgJiBHRlMyX0RJRl9FQV9JTkRJUkVDVCkpIHsKKwlpZiAoIShpcC0+aV9kaXNrZmxhZ3MgJiBHRlMyX0RJRl9FQV9JTkRJUkVDVCkpIHsKIAkJZXJyb3IgPSBlYV9mb3JlYWNoX2koaXAsIGJoLCBlYV9jYWxsLCBkYXRhKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtNDE0LDcgKzQxNCw3IEBACiAJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7CiAKLQlpZiAoaXAtPmlfZGkuZGlfZWF0dHIpIHsKKwlpZiAoaXAtPmlfZWF0dHIpIHsKIAkJc3RydWN0IGVhX2xpc3QgZWkgPSB7IC5laV9lciA9IGVyLCAuZWlfc2l6ZSA9IDAgfTsKIAogCQllcnJvciA9IGVhX2ZvcmVhY2goaXAsIGVhX2xpc3RfaSwgJmVpKTsKQEAgLTUxNCw3ICs1MTQsNyBAQAogCXN0cnVjdCBnZnMyX2VhX2xvY2F0aW9uIGVsOwogCWludCBlcnJvcjsKIAotCWlmICghaXAtPmlfZGkuZGlfZWF0dHIpCisJaWYgKCFpcC0+aV9lYXR0cikKIAkJcmV0dXJuIC1FTk9EQVRBOwogCiAJZXJyb3IgPSBnZnMyX2VhX2ZpbmQoaXAsIGVyLCAmZWwpOwpAQCAtNzQxLDcgKzc0MSw3IEBACiAJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7CiAKLQlpcC0+aV9kaS5kaV9lYXR0ciA9IGJoLT5iX2Jsb2NrbnI7CisJaXAtPmlfZWF0dHIgPSBiaC0+Yl9ibG9ja25yOwogCWVycm9yID0gZWFfd3JpdGUoaXAsIEdGUzJfRUFfQkgyRklSU1QoYmgpLCBlcik7CiAKIAlicmVsc2UoYmgpOwpAQCAtOTM1LDEwICs5MzUsMTAgQEAKIAlpbnQgZXJyb3I7CiAJaW50IG1oX3NpemUgPSBzaXplb2Yoc3RydWN0IGdmczJfbWV0YV9oZWFkZXIpOwogCi0JaWYgKGlwLT5pX2RpLmRpX2ZsYWdzICYgR0ZTMl9ESUZfRUFfSU5ESVJFQ1QpIHsKKwlpZiAoaXAtPmlfZGlza2ZsYWdzICYgR0ZTMl9ESUZfRUFfSU5ESVJFQ1QpIHsKIAkJX19iZTY0ICplbmQ7CiAKLQkJZXJyb3IgPSBnZnMyX21ldGFfcmVhZChpcC0+aV9nbCwgaXAtPmlfZGkuZGlfZWF0dHIsIERJT19XQUlULAorCQllcnJvciA9IGdmczJfbWV0YV9yZWFkKGlwLT5pX2dsLCBpcC0+aV9lYXR0ciwgRElPX1dBSVQsCiAJCQkJICAgICAgICZpbmRiaCk7CiAJCWlmIChlcnJvcikKIAkJCXJldHVybiBlcnJvcjsKQEAgLTk3Miw5ICs5NzIsOSBAQAogCQlnZnMyX2J1ZmZlcl9jbGVhcl90YWlsKGluZGJoLCBtaF9zaXplKTsKIAogCQllYWJsayA9IChfX2JlNjQgKikoaW5kYmgtPmJfZGF0YSArIG1oX3NpemUpOwotCQkqZWFibGsgPSBjcHVfdG9fYmU2NChpcC0+aV9kaS5kaV9lYXR0cik7Ci0JCWlwLT5pX2RpLmRpX2VhdHRyID0gYmxrOwotCQlpcC0+aV9kaS5kaV9mbGFncyB8PSBHRlMyX0RJRl9FQV9JTkRJUkVDVDsKKwkJKmVhYmxrID0gY3B1X3RvX2JlNjQoaXAtPmlfZWF0dHIpOworCQlpcC0+aV9lYXR0ciA9IGJsazsKKwkJaXAtPmlfZGlza2ZsYWdzIHw9IEdGUzJfRElGX0VBX0lORElSRUNUOwogCQlnZnMyX2FkZF9pbm9kZV9ibG9ja3MoJmlwLT5pX2lub2RlLCAxKTsKIAogCQllYWJsaysrOwpAQCAtMTAxNSw3ICsxMDE1LDcgQEAKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIAotCWlmICghKGlwLT5pX2RpLmRpX2ZsYWdzICYgR0ZTMl9ESUZfRUFfSU5ESVJFQ1QpKQorCWlmICghKGlwLT5pX2Rpc2tmbGFncyAmIEdGUzJfRElGX0VBX0lORElSRUNUKSkKIAkJYmxrcysrOwogCWlmIChHRlMyX0VBUkVRX1NJWkVfU1RVRkZFRChlcikgPiBHRlMyX1NCKCZpcC0+aV9pbm9kZSktPnNkX2pic2l6ZSkKIAkJYmxrcyArPSBESVZfUk9VTkRfVVAoZXItPmVyX2RhdGFfbGVuLCBHRlMyX1NCKCZpcC0+aV9pbm9kZSktPnNkX2pic2l6ZSk7CkBAIC0xMDQwLDcgKzEwNDAsNyBAQAogCXN0cnVjdCBnZnMyX2VhX2xvY2F0aW9uIGVsOwogCWludCBlcnJvcjsKIAotCWlmICghaXAtPmlfZGkuZGlfZWF0dHIpIHsKKwlpZiAoIWlwLT5pX2VhdHRyKSB7CiAJCWlmIChlci0+ZXJfZmxhZ3MgJiBYQVRUUl9SRVBMQUNFKQogCQkJcmV0dXJuIC1FTk9EQVRBOwogCQlyZXR1cm4gZWFfaW5pdChpcCwgZXIpOwpAQCAtMTA1MSw3ICsxMDUxLDcgQEAKIAkJcmV0dXJuIGVycm9yOwogCiAJaWYgKGVsLmVsX2VhKSB7Ci0JCWlmIChpcC0+aV9kaS5kaV9mbGFncyAmIEdGUzJfRElGX0FQUEVORE9OTFkpIHsKKwkJaWYgKGlwLT5pX2Rpc2tmbGFncyAmIEdGUzJfRElGX0FQUEVORE9OTFkpIHsKIAkJCWJyZWxzZShlbC5lbF9iaCk7CiAJCQlyZXR1cm4gLUVQRVJNOwogCQl9CkBAIC0xMTQ1LDcgKzExNDUsNyBAQAogCXN0cnVjdCBnZnMyX2VhX2xvY2F0aW9uIGVsOwogCWludCBlcnJvcjsKIAotCWlmICghaXAtPmlfZGkuZGlfZWF0dHIpCisJaWYgKCFpcC0+aV9lYXR0cikKIAkJcmV0dXJuIC1FTk9EQVRBOwogCiAJZXJyb3IgPSBnZnMyX2VhX2ZpbmQoaXAsIGVyLCAmZWwpOwpAQCAtMTMwOSw3ICsxMzA5LDcgQEAKIAogCW1lbXNldCgmcmxpc3QsIDAsIHNpemVvZihzdHJ1Y3QgZ2ZzMl9yZ3JwX2xpc3QpKTsKIAotCWVycm9yID0gZ2ZzMl9tZXRhX3JlYWQoaXAtPmlfZ2wsIGlwLT5pX2RpLmRpX2VhdHRyLCBESU9fV0FJVCwgJmluZGJoKTsKKwllcnJvciA9IGdmczJfbWV0YV9yZWFkKGlwLT5pX2dsLCBpcC0+aV9lYXR0ciwgRElPX1dBSVQsICZpbmRiaCk7CiAJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7CiAKQEAgLTEzODgsNyArMTM4OCw3IEBACiAJaWYgKGJzdGFydCkKIAkJZ2ZzMl9mcmVlX21ldGEoaXAsIGJzdGFydCwgYmxlbik7CiAKLQlpcC0+aV9kaS5kaV9mbGFncyAmPSB+R0ZTMl9ESUZfRUFfSU5ESVJFQ1Q7CisJaXAtPmlfZGlza2ZsYWdzICY9IH5HRlMyX0RJRl9FQV9JTkRJUkVDVDsKIAogCWVycm9yID0gZ2ZzMl9tZXRhX2lub2RlX2J1ZmZlcihpcCwgJmRpYmgpOwogCWlmICghZXJyb3IpIHsKQEAgLTE0MTYsNyArMTQxNiw3IEBACiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaWJoOwogCWludCBlcnJvcjsKIAotCXJnZCA9IGdmczJfYmxrMnJncnBkKHNkcCwgaXAtPmlfZGkuZGlfZWF0dHIpOworCXJnZCA9IGdmczJfYmxrMnJncnBkKHNkcCwgaXAtPmlfZWF0dHIpOwogCWlmICghcmdkKSB7CiAJCWdmczJfY29uc2lzdF9pbm9kZShpcCk7CiAJCXJldHVybiAtRUlPOwpAQCAtMTQzMiw5ICsxNDMyLDkgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X2d1bmxvY2s7CiAKLQlnZnMyX2ZyZWVfbWV0YShpcCwgaXAtPmlfZGkuZGlfZWF0dHIsIDEpOworCWdmczJfZnJlZV9tZXRhKGlwLCBpcC0+aV9lYXR0ciwgMSk7CiAKLQlpcC0+aV9kaS5kaV9lYXR0ciA9IDA7CisJaXAtPmlfZWF0dHIgPSAwOwogCWdmczJfYWRkX2lub2RlX2Jsb2NrcygmaXAtPmlfaW5vZGUsIC0xKTsKIAogCWVycm9yID0gZ2ZzMl9tZXRhX2lub2RlX2J1ZmZlcihpcCwgJmRpYmgpOwpAQCAtMTQ3OSw3ICsxNDc5LDcgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X3JpbmRleDsKIAotCWlmIChpcC0+aV9kaS5kaV9mbGFncyAmIEdGUzJfRElGX0VBX0lORElSRUNUKSB7CisJaWYgKGlwLT5pX2Rpc2tmbGFncyAmIEdGUzJfRElGX0VBX0lORElSRUNUKSB7CiAJCWVycm9yID0gZWFfZGVhbGxvY19pbmRpcmVjdChpcCk7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0X3JpbmRleDsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvZ2xvY2suYyBiL2ZzL2dmczIvZ2xvY2suYwppbmRleCBjOTYyMjgzLi42Yjk4M2FlIDEwMDY0NAotLS0gYS9mcy9nZnMyL2dsb2NrLmMKKysrIGIvZnMvZ2ZzMi9nbG9jay5jCkBAIC00MCw2ICs0MCw3IEBACiAjaW5jbHVkZSAicXVvdGEuaCIKICNpbmNsdWRlICJzdXBlci5oIgogI2luY2x1ZGUgInV0aWwuaCIKKyNpbmNsdWRlICJibWFwLmgiCiAKIHN0cnVjdCBnZnMyX2dsX2hhc2hfYnVja2V0IHsKICAgICAgICAgc3RydWN0IGhsaXN0X2hlYWQgaGJfbGlzdDsKQEAgLTYxLDkgKzYyLDEwIEBACiAKIHN0YXRpYyBERUNMQVJFX1JXU0VNKGdmczJfdW1vdW50X2ZsdXNoX3NlbSk7CiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqZ2ZzMl9yb290Owotc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqc2NhbmRfcHJvY2VzczsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc2NhbmRfc2VjcyA9IDU7CiBzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmdsb2NrX3dvcmtxdWV1ZTsKK3N0YXRpYyBMSVNUX0hFQUQobHJ1X2xpc3QpOworc3RhdGljIGF0b21pY190IGxydV9jb3VudCA9IEFUT01JQ19JTklUKDApOworc3RhdGljIERFRklORV9TUElOTE9DSyhscnVfbG9jayk7CiAKICNkZWZpbmUgR0ZTMl9HTF9IQVNIX1NISUZUICAgICAgMTUKICNkZWZpbmUgR0ZTMl9HTF9IQVNIX1NJWkUgICAgICAgKDEgPDwgR0ZTMl9HTF9IQVNIX1NISUZUKQpAQCAtMTc0LDYgKzE3NiwyMiBAQAogfQogCiAvKioKKyAqIGdmczJfZ2xvY2tfc2NoZWR1bGVfZm9yX3JlY2xhaW0gLSBBZGQgYSBnbG9jayB0byB0aGUgcmVjbGFpbSBsaXN0CisgKiBAZ2w6IHRoZSBnbG9jaworICoKKyAqLworCitzdGF0aWMgdm9pZCBnZnMyX2dsb2NrX3NjaGVkdWxlX2Zvcl9yZWNsYWltKHN0cnVjdCBnZnMyX2dsb2NrICpnbCkKK3sKKwlzcGluX2xvY2soJmxydV9sb2NrKTsKKwlpZiAobGlzdF9lbXB0eSgmZ2wtPmdsX2xydSkgJiYgZ2wtPmdsX3N0YXRlICE9IExNX1NUX1VOTE9DS0VEKSB7CisJCWxpc3RfYWRkX3RhaWwoJmdsLT5nbF9scnUsICZscnVfbGlzdCk7CisJCWF0b21pY19pbmMoJmxydV9jb3VudCk7CisJfQorCXNwaW5fdW5sb2NrKCZscnVfbG9jayk7Cit9CisKKy8qKgogICogZ2ZzMl9nbG9ja19wdXQoKSAtIERlY3JlbWVudCByZWZlcmVuY2UgY291bnQgb24gZ2xvY2sKICAqIEBnbDogVGhlIGdsb2NrIHRvIHB1dAogICoKQEAgLTE4NywxNCArMjA1LDIzIEBACiAJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmdsLT5nbF9yZWYpKSB7CiAJCWhsaXN0X2RlbCgmZ2wtPmdsX2xpc3QpOwogCQl3cml0ZV91bmxvY2soZ2xfbG9ja19hZGRyKGdsLT5nbF9oYXNoKSk7CisJCXNwaW5fbG9jaygmbHJ1X2xvY2spOworCQlpZiAoIWxpc3RfZW1wdHkoJmdsLT5nbF9scnUpKSB7CisJCQlsaXN0X2RlbF9pbml0KCZnbC0+Z2xfbHJ1KTsKKwkJCWF0b21pY19kZWMoJmxydV9jb3VudCk7CisJCX0KKwkJc3Bpbl91bmxvY2soJmxydV9sb2NrKTsKIAkJR0xPQ0tfQlVHX09OKGdsLCBnbC0+Z2xfc3RhdGUgIT0gTE1fU1RfVU5MT0NLRUQpOwotCQlHTE9DS19CVUdfT04oZ2wsICFsaXN0X2VtcHR5KCZnbC0+Z2xfcmVjbGFpbSkpOworCQlHTE9DS19CVUdfT04oZ2wsICFsaXN0X2VtcHR5KCZnbC0+Z2xfbHJ1KSk7CiAJCUdMT0NLX0JVR19PTihnbCwgIWxpc3RfZW1wdHkoJmdsLT5nbF9ob2xkZXJzKSk7CiAJCWdsb2NrX2ZyZWUoZ2wpOwogCQlydiA9IDE7CiAJCWdvdG8gb3V0OwogCX0KIAl3cml0ZV91bmxvY2soZ2xfbG9ja19hZGRyKGdsLT5nbF9oYXNoKSk7CisJLyogMSBmb3IgYmVpbmcgaGFzaGVkLCAxIGZvciBoYXZpbmcgc3RhdGUgIT0gTE1fU1RfVU5MT0NLRUQgKi8KKwlpZiAoYXRvbWljX3JlYWQoJmdsLT5nbF9yZWYpID09IDIpCisJCWdmczJfZ2xvY2tfc2NoZWR1bGVfZm9yX3JlY2xhaW0oZ2wpOwogb3V0OgogCXJldHVybiBydjsKIH0KQEAgLTI4OSwxMCArMzE2LDEzIEBACiAgKiBkb19wcm9tb3RlIC0gcHJvbW90ZSBhcyBtYW55IHJlcXVlc3RzIGFzIHBvc3NpYmxlIG9uIHRoZSBjdXJyZW50IHF1ZXVlCiAgKiBAZ2w6IFRoZSBnbG9jawogICogCi0gKiBSZXR1cm5zOiB0cnVlIGlmIHRoZXJlIGlzIGEgYmxvY2tlZCBob2xkZXIgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QKKyAqIFJldHVybnM6IDEgaWYgdGhlcmUgaXMgYSBibG9ja2VkIGhvbGRlciBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCwgb3IgMgorICogICAgICAgICAgaWYgYSB0eXBlIHNwZWNpZmljIG9wZXJhdGlvbiBpcyB1bmRlcndheS4KICAqLwogCiBzdGF0aWMgaW50IGRvX3Byb21vdGUoc3RydWN0IGdmczJfZ2xvY2sgKmdsKQorX19yZWxlYXNlcygmZ2wtPmdsX3NwaW4pCitfX2FjcXVpcmVzKCZnbC0+Z2xfc3BpbikKIHsKIAljb25zdCBzdHJ1Y3QgZ2ZzMl9nbG9ja19vcGVyYXRpb25zICpnbG9wcyA9IGdsLT5nbF9vcHM7CiAJc3RydWN0IGdmczJfaG9sZGVyICpnaCwgKnRtcDsKQEAgLTMxMCw2ICszNDAsOCBAQAogCQkJCXJldCA9IGdsb3BzLT5nb19sb2NrKGdoKTsKIAkJCQlzcGluX2xvY2soJmdsLT5nbF9zcGluKTsKIAkJCQlpZiAocmV0KSB7CisJCQkJCWlmIChyZXQgPT0gMSkKKwkJCQkJCXJldHVybiAyOwogCQkJCQlnaC0+Z2hfZXJyb3IgPSByZXQ7CiAJCQkJCWxpc3RfZGVsX2luaXQoJmdoLT5naF9saXN0KTsKIAkJCQkJZ2ZzMl9ob2xkZXJfd2FrZShnaCk7CkBAIC00MTQsNiArNDQ2LDcgQEAKIAljb25zdCBzdHJ1Y3QgZ2ZzMl9nbG9ja19vcGVyYXRpb25zICpnbG9wcyA9IGdsLT5nbF9vcHM7CiAJc3RydWN0IGdmczJfaG9sZGVyICpnaDsKIAl1bnNpZ25lZCBzdGF0ZSA9IHJldCAmIExNX09VVF9TVF9NQVNLOworCWludCBydjsKIAogCXNwaW5fbG9jaygmZ2wtPmdsX3NwaW4pOwogCXN0YXRlX2NoYW5nZShnbCwgc3RhdGUpOwpAQCAtNDY4LDcgKzUwMSw2IEBACiAJCWdmczJfZGVtb3RlX3dha2UoZ2wpOwogCWlmIChzdGF0ZSAhPSBMTV9TVF9VTkxPQ0tFRCkgewogCQlpZiAoZ2xvcHMtPmdvX3htb3RlX2JoKSB7Ci0JCQlpbnQgcnY7CiAJCQlzcGluX3VubG9jaygmZ2wtPmdsX3NwaW4pOwogCQkJcnYgPSBnbG9wcy0+Z29feG1vdGVfYmgoZ2wsIGdoKTsKIAkJCWlmIChydiA9PSAtRUFHQUlOKQpAQCAtNDc5LDEwICs1MTEsMTMgQEAKIAkJCQlnb3RvIG91dDsKIAkJCX0KIAkJfQotCQlkb19wcm9tb3RlKGdsKTsKKwkJcnYgPSBkb19wcm9tb3RlKGdsKTsKKwkJaWYgKHJ2ID09IDIpCisJCQlnb3RvIG91dF9sb2NrZWQ7CiAJfQogb3V0OgogCWNsZWFyX2JpdChHTEZfTE9DSywgJmdsLT5nbF9mbGFncyk7CitvdXRfbG9ja2VkOgogCXNwaW5fdW5sb2NrKCZnbC0+Z2xfc3Bpbik7CiAJZ2ZzMl9nbG9ja19wdXQoZ2wpOwogfQpAQCAtNTExLDYgKzU0Niw4IEBACiAgKi8KIAogc3RhdGljIHZvaWQgZG9feG1vdGUoc3RydWN0IGdmczJfZ2xvY2sgKmdsLCBzdHJ1Y3QgZ2ZzMl9ob2xkZXIgKmdoLCB1bnNpZ25lZCBpbnQgdGFyZ2V0KQorX19yZWxlYXNlcygmZ2wtPmdsX3NwaW4pCitfX2FjcXVpcmVzKCZnbC0+Z2xfc3BpbikKIHsKIAljb25zdCBzdHJ1Y3QgZ2ZzMl9nbG9ja19vcGVyYXRpb25zICpnbG9wcyA9IGdsLT5nbF9vcHM7CiAJc3RydWN0IGdmczJfc2JkICpzZHAgPSBnbC0+Z2xfc2JkOwpAQCAtNTc2LDggKzYxMywxMSBAQAogICovCiAKIHN0YXRpYyB2b2lkIHJ1bl9xdWV1ZShzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wsIGNvbnN0IGludCBub25ibG9jaykKK19fcmVsZWFzZXMoJmdsLT5nbF9zcGluKQorX19hY3F1aXJlcygmZ2wtPmdsX3NwaW4pCiB7CiAJc3RydWN0IGdmczJfaG9sZGVyICpnaCA9IE5VTEw7CisJaW50IHJldDsKIAogCWlmICh0ZXN0X2FuZF9zZXRfYml0KEdMRl9MT0NLLCAmZ2wtPmdsX2ZsYWdzKSkKIAkJcmV0dXJuOwpAQCAtNTk2LDggKzYzNiwxMSBAQAogCX0gZWxzZSB7CiAJCWlmICh0ZXN0X2JpdChHTEZfREVNT1RFLCAmZ2wtPmdsX2ZsYWdzKSkKIAkJCWdmczJfZGVtb3RlX3dha2UoZ2wpOwotCQlpZiAoZG9fcHJvbW90ZShnbCkgPT0gMCkKKwkJcmV0ID0gZG9fcHJvbW90ZShnbCk7CisJCWlmIChyZXQgPT0gMCkKIAkJCWdvdG8gb3V0OworCQlpZiAocmV0ID09IDIpCisJCQlyZXR1cm47CiAJCWdoID0gZmluZF9maXJzdF93YWl0ZXIoZ2wpOwogCQlnbC0+Z2xfdGFyZ2V0ID0gZ2gtPmdoX3N0YXRlOwogCQlpZiAoIShnaC0+Z2hfZmxhZ3MgJiAoTE1fRkxBR19UUlkgfCBMTV9GTEFHX1RSWV8xQ0IpKSkKQEAgLTgyMCw3ICs4NjMsNyBAQAogICovCiAKIHN0YXRpYyB2b2lkIGhhbmRsZV9jYWxsYmFjayhzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wsIHVuc2lnbmVkIGludCBzdGF0ZSwKLQkJCSAgICBpbnQgcmVtb3RlLCB1bnNpZ25lZCBsb25nIGRlbGF5KQorCQkJICAgIHVuc2lnbmVkIGxvbmcgZGVsYXkpCiB7CiAJaW50IGJpdCA9IGRlbGF5ID8gR0xGX1BFTkRJTkdfREVNT1RFIDogR0xGX0RFTU9URTsKIApAQCAtODI4LDkgKzg3MSw2IEBACiAJaWYgKGdsLT5nbF9kZW1vdGVfc3RhdGUgPT0gTE1fU1RfRVhDTFVTSVZFKSB7CiAJCWdsLT5nbF9kZW1vdGVfc3RhdGUgPSBzdGF0ZTsKIAkJZ2wtPmdsX2RlbW90ZV90aW1lID0gamlmZmllczsKLQkJaWYgKHJlbW90ZSAmJiBnbC0+Z2xfb3BzLT5nb190eXBlID09IExNX1RZUEVfSU9QRU4gJiYKLQkJICAgIGdsLT5nbF9vYmplY3QpCi0JCQlnZnMyX2dsb2NrX3NjaGVkdWxlX2Zvcl9yZWNsYWltKGdsKTsKIAl9IGVsc2UgaWYgKGdsLT5nbF9kZW1vdGVfc3RhdGUgIT0gTE1fU1RfVU5MT0NLRUQgJiYKIAkJCWdsLT5nbF9kZW1vdGVfc3RhdGUgIT0gc3RhdGUpIHsKIAkJZ2wtPmdsX2RlbW90ZV9zdGF0ZSA9IExNX1NUX1VOTE9DS0VEOwpAQCAtODc3LDYgKzkxNyw4IEBACiAgKi8KIAogc3RhdGljIGlubGluZSB2b2lkIGFkZF90b19xdWV1ZShzdHJ1Y3QgZ2ZzMl9ob2xkZXIgKmdoKQorX19yZWxlYXNlcygmZ2wtPmdsX3NwaW4pCitfX2FjcXVpcmVzKCZnbC0+Z2xfc3BpbikKIHsKIAlzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wgPSBnaC0+Z2hfZ2w7CiAJc3RydWN0IGdmczJfc2JkICpzZHAgPSBnbC0+Z2xfc2JkOwpAQCAtOTk4LDcgKzEwNDAsNyBAQAogCiAJc3Bpbl9sb2NrKCZnbC0+Z2xfc3Bpbik7CiAJaWYgKGdoLT5naF9mbGFncyAmIEdMX05PQ0FDSEUpCi0JCWhhbmRsZV9jYWxsYmFjayhnbCwgTE1fU1RfVU5MT0NLRUQsIDAsIDApOworCQloYW5kbGVfY2FsbGJhY2soZ2wsIExNX1NUX1VOTE9DS0VELCAwKTsKIAogCWxpc3RfZGVsX2luaXQoJmdoLT5naF9saXN0KTsKIAlpZiAoZmluZF9maXJzdF9ob2xkZXIoZ2wpID09IE5VTEwpIHsKQEAgLTEyNjksMTIgKzEzMTEsMjYgQEAKIAkJZGVsYXkgPSBnbC0+Z2xfb3BzLT5nb19taW5faG9sZF90aW1lOwogCiAJc3Bpbl9sb2NrKCZnbC0+Z2xfc3Bpbik7Ci0JaGFuZGxlX2NhbGxiYWNrKGdsLCBzdGF0ZSwgMSwgZGVsYXkpOworCWhhbmRsZV9jYWxsYmFjayhnbCwgc3RhdGUsIGRlbGF5KTsKIAlzcGluX3VubG9jaygmZ2wtPmdsX3NwaW4pOwogCWlmIChxdWV1ZV9kZWxheWVkX3dvcmsoZ2xvY2tfd29ya3F1ZXVlLCAmZ2wtPmdsX3dvcmssIGRlbGF5KSA9PSAwKQogCQlnZnMyX2dsb2NrX3B1dChnbCk7CiB9CiAKK3N0YXRpYyB2b2lkIGdmczJfamRlc2NfbWFrZV9kaXJ0eShzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgdW5zaWduZWQgaW50IGppZCkKK3sKKwlzdHJ1Y3QgZ2ZzMl9qZGVzYyAqamQ7CisKKwlzcGluX2xvY2soJnNkcC0+c2RfamluZGV4X3NwaW4pOworCWxpc3RfZm9yX2VhY2hfZW50cnkoamQsICZzZHAtPnNkX2ppbmRleF9saXN0LCBqZF9saXN0KSB7CisJCWlmIChqZC0+amRfamlkICE9IGppZCkKKwkJCWNvbnRpbnVlOworCQlqZC0+amRfZGlydHkgPSAxOworCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2soJnNkcC0+c2RfamluZGV4X3NwaW4pOworfQorCiAvKioKICAqIGdmczJfZ2xvY2tfY2IgLSBDYWxsYmFjayB1c2VkIGJ5IGxvY2tpbmcgbW9kdWxlCiAgKiBAc2RwOiBQb2ludGVyIHRvIHRoZSBzdXBlcmJsb2NrCkBAIC0xMzM4LDgwICsxMzk0LDgzIEBACiAgKiBSZXR1cm5zOiAxIGlmIGl0J3Mgb2sKICAqLwogCi1zdGF0aWMgaW50IGRlbW90ZV9vayhzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wpCitzdGF0aWMgaW50IGRlbW90ZV9vayhjb25zdCBzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wpCiB7CiAJY29uc3Qgc3RydWN0IGdmczJfZ2xvY2tfb3BlcmF0aW9ucyAqZ2xvcHMgPSBnbC0+Z2xfb3BzOwotCWludCBkZW1vdGUgPSAxOwogCi0JaWYgKHRlc3RfYml0KEdMRl9TVElDS1ksICZnbC0+Z2xfZmxhZ3MpKQotCQlkZW1vdGUgPSAwOwotCWVsc2UgaWYgKGdsb3BzLT5nb19kZW1vdGVfb2spCi0JCWRlbW90ZSA9IGdsb3BzLT5nb19kZW1vdGVfb2soZ2wpOwotCi0JcmV0dXJuIGRlbW90ZTsKKwlpZiAoZ2wtPmdsX3N0YXRlID09IExNX1NUX1VOTE9DS0VEKQorCQlyZXR1cm4gMDsKKwlpZiAoIWxpc3RfZW1wdHkoJmdsLT5nbF9ob2xkZXJzKSkKKwkJcmV0dXJuIDA7CisJaWYgKGdsb3BzLT5nb19kZW1vdGVfb2spCisJCXJldHVybiBnbG9wcy0+Z29fZGVtb3RlX29rKGdsKTsKKwlyZXR1cm4gMTsKIH0KIAotLyoqCi0gKiBnZnMyX2dsb2NrX3NjaGVkdWxlX2Zvcl9yZWNsYWltIC0gQWRkIGEgZ2xvY2sgdG8gdGhlIHJlY2xhaW0gbGlzdAotICogQGdsOiB0aGUgZ2xvY2sKLSAqCi0gKi8KIAotdm9pZCBnZnMyX2dsb2NrX3NjaGVkdWxlX2Zvcl9yZWNsYWltKHN0cnVjdCBnZnMyX2dsb2NrICpnbCkKLXsKLQlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IGdsLT5nbF9zYmQ7Ci0KLQlzcGluX2xvY2soJnNkcC0+c2RfcmVjbGFpbV9sb2NrKTsKLQlpZiAobGlzdF9lbXB0eSgmZ2wtPmdsX3JlY2xhaW0pKSB7Ci0JCWdmczJfZ2xvY2tfaG9sZChnbCk7Ci0JCWxpc3RfYWRkKCZnbC0+Z2xfcmVjbGFpbSwgJnNkcC0+c2RfcmVjbGFpbV9saXN0KTsKLQkJYXRvbWljX2luYygmc2RwLT5zZF9yZWNsYWltX2NvdW50KTsKLQkJc3Bpbl91bmxvY2soJnNkcC0+c2RfcmVjbGFpbV9sb2NrKTsKLQkJd2FrZV91cCgmc2RwLT5zZF9yZWNsYWltX3dxKTsKLQl9IGVsc2UKLQkJc3Bpbl91bmxvY2soJnNkcC0+c2RfcmVjbGFpbV9sb2NrKTsKLX0KLQotLyoqCi0gKiBnZnMyX3JlY2xhaW1fZ2xvY2sgLSBwcm9jZXNzIHRoZSBuZXh0IGdsb2NrIG9uIHRoZSBmaWxlc3lzdGVtJ3MgcmVjbGFpbSBsaXN0Ci0gKiBAc2RwOiB0aGUgZmlsZXN5c3RlbQotICoKLSAqIENhbGxlZCBmcm9tIGdmczJfZ2xvY2tkKCkgZ2xvY2sgcmVjbGFpbSBkYWVtb24sIG9yIHdoZW4gcHJvbW90aW5nIGEKLSAqIGRpZmZlcmVudCBnbG9jayBhbmQgd2Ugbm90aWNlIHRoYXQgdGhlcmUgYXJlIGEgbG90IG9mIGdsb2NrcyBpbiB0aGUKLSAqIHJlY2xhaW0gbGlzdC4KLSAqCi0gKi8KLQotdm9pZCBnZnMyX3JlY2xhaW1fZ2xvY2soc3RydWN0IGdmczJfc2JkICpzZHApCitzdGF0aWMgaW50IGdmczJfc2hyaW5rX2dsb2NrX21lbW9yeShpbnQgbnIsIGdmcF90IGdmcF9tYXNrKQogewogCXN0cnVjdCBnZnMyX2dsb2NrICpnbDsKLQlpbnQgZG9uZV9jYWxsYmFjayA9IDA7CisJaW50IG1heV9kZW1vdGU7CisJaW50IG5yX3NraXBwZWQgPSAwOworCWludCBnb3RfcmVmID0gMDsKKwlMSVNUX0hFQUQoc2tpcHBlZCk7CiAKLQlzcGluX2xvY2soJnNkcC0+c2RfcmVjbGFpbV9sb2NrKTsKLQlpZiAobGlzdF9lbXB0eSgmc2RwLT5zZF9yZWNsYWltX2xpc3QpKSB7Ci0JCXNwaW5fdW5sb2NrKCZzZHAtPnNkX3JlY2xhaW1fbG9jayk7Ci0JCXJldHVybjsKKwlpZiAobnIgPT0gMCkKKwkJZ290byBvdXQ7CisKKwlpZiAoIShnZnBfbWFzayAmIF9fR0ZQX0ZTKSkKKwkJcmV0dXJuIC0xOworCisJc3Bpbl9sb2NrKCZscnVfbG9jayk7CisJd2hpbGUobnIgJiYgIWxpc3RfZW1wdHkoJmxydV9saXN0KSkgeworCQlnbCA9IGxpc3RfZW50cnkobHJ1X2xpc3QubmV4dCwgc3RydWN0IGdmczJfZ2xvY2ssIGdsX2xydSk7CisJCWxpc3RfZGVsX2luaXQoJmdsLT5nbF9scnUpOworCQlhdG9taWNfZGVjKCZscnVfY291bnQpOworCisJCS8qIFRlc3QgZm9yIGJlaW5nIGRlbW90YWJsZSAqLworCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoR0xGX0xPQ0ssICZnbC0+Z2xfZmxhZ3MpKSB7CisJCQlnZnMyX2dsb2NrX2hvbGQoZ2wpOworCQkJZ290X3JlZiA9IDE7CisJCQlzcGluX3VubG9jaygmbHJ1X2xvY2spOworCQkJc3Bpbl9sb2NrKCZnbC0+Z2xfc3Bpbik7CisJCQltYXlfZGVtb3RlID0gZGVtb3RlX29rKGdsKTsKKwkJCXNwaW5fdW5sb2NrKCZnbC0+Z2xfc3Bpbik7CisJCQljbGVhcl9iaXQoR0xGX0xPQ0ssICZnbC0+Z2xfZmxhZ3MpOworCQkJaWYgKG1heV9kZW1vdGUpIHsKKwkJCQloYW5kbGVfY2FsbGJhY2soZ2wsIExNX1NUX1VOTE9DS0VELCAwKTsKKwkJCQluci0tOworCQkJCWlmIChxdWV1ZV9kZWxheWVkX3dvcmsoZ2xvY2tfd29ya3F1ZXVlLCAmZ2wtPmdsX3dvcmssIDApID09IDApCisJCQkJCWdmczJfZ2xvY2tfcHV0KGdsKTsKKwkJCX0KKwkJCXNwaW5fbG9jaygmbHJ1X2xvY2spOworCQkJaWYgKG1heV9kZW1vdGUpCisJCQkJY29udGludWU7CisJCX0KKwkJaWYgKGxpc3RfZW1wdHkoJmdsLT5nbF9scnUpICYmCisJCSAgICAoYXRvbWljX3JlYWQoJmdsLT5nbF9yZWYpIDw9ICgyICsgZ290X3JlZikpKSB7CisJCQlucl9za2lwcGVkKys7CisJCQlsaXN0X2FkZCgmZ2wtPmdsX2xydSwgJnNraXBwZWQpOworCQl9CisJCWlmIChnb3RfcmVmKSB7CisJCQlzcGluX3VubG9jaygmbHJ1X2xvY2spOworCQkJZ2ZzMl9nbG9ja19wdXQoZ2wpOworCQkJc3Bpbl9sb2NrKCZscnVfbG9jayk7CisJCQlnb3RfcmVmID0gMDsKKwkJfQogCX0KLQlnbCA9IGxpc3RfZW50cnkoc2RwLT5zZF9yZWNsYWltX2xpc3QubmV4dCwKLQkJCXN0cnVjdCBnZnMyX2dsb2NrLCBnbF9yZWNsYWltKTsKLQlsaXN0X2RlbF9pbml0KCZnbC0+Z2xfcmVjbGFpbSk7Ci0Jc3Bpbl91bmxvY2soJnNkcC0+c2RfcmVjbGFpbV9sb2NrKTsKLQotCWF0b21pY19kZWMoJnNkcC0+c2RfcmVjbGFpbV9jb3VudCk7Ci0JYXRvbWljX2luYygmc2RwLT5zZF9yZWNsYWltZWQpOwotCi0Jc3Bpbl9sb2NrKCZnbC0+Z2xfc3Bpbik7Ci0JaWYgKGZpbmRfZmlyc3RfaG9sZGVyKGdsKSA9PSBOVUxMICYmCi0JICAgIGdsLT5nbF9zdGF0ZSAhPSBMTV9TVF9VTkxPQ0tFRCAmJiBkZW1vdGVfb2soZ2wpKSB7Ci0JCWhhbmRsZV9jYWxsYmFjayhnbCwgTE1fU1RfVU5MT0NLRUQsIDAsIDApOwotCQlkb25lX2NhbGxiYWNrID0gMTsKLQl9Ci0Jc3Bpbl91bmxvY2soJmdsLT5nbF9zcGluKTsKLQlpZiAoIWRvbmVfY2FsbGJhY2sgfHwKLQkgICAgcXVldWVfZGVsYXllZF93b3JrKGdsb2NrX3dvcmtxdWV1ZSwgJmdsLT5nbF93b3JrLCAwKSA9PSAwKQotCQlnZnMyX2dsb2NrX3B1dChnbCk7CisJbGlzdF9zcGxpY2UoJnNraXBwZWQsICZscnVfbGlzdCk7CisJYXRvbWljX2FkZChucl9za2lwcGVkLCAmbHJ1X2NvdW50KTsKKwlzcGluX3VubG9jaygmbHJ1X2xvY2spOworb3V0OgorCXJldHVybiAoYXRvbWljX3JlYWQoJmxydV9jb3VudCkgLyAxMDApICogc3lzY3RsX3Zmc19jYWNoZV9wcmVzc3VyZTsKIH0KIAorc3RhdGljIHN0cnVjdCBzaHJpbmtlciBnbG9ja19zaHJpbmtlciA9IHsKKwkuc2hyaW5rID0gZ2ZzMl9zaHJpbmtfZ2xvY2tfbWVtb3J5LAorCS5zZWVrcyA9IERFRkFVTFRfU0VFS1MsCit9OworCiAvKioKICAqIGV4YW1pbmVfYnVja2V0IC0gQ2FsbCBhIGZ1bmN0aW9uIGZvciBnbG9jayBpbiBhIGhhc2ggYnVja2V0CiAgKiBAZXhhbWluZXI6IHRoZSBmdW5jdGlvbgpAQCAtMTQ1NywyNiArMTUxNiw2IEBACiB9CiAKIC8qKgotICogc2Nhbl9nbG9jayAtIGxvb2sgYXQgYSBnbG9jayBhbmQgc2VlIGlmIHdlIGNhbiByZWNsYWltIGl0Ci0gKiBAZ2w6IHRoZSBnbG9jayB0byBsb29rIGF0Ci0gKgotICovCi0KLXN0YXRpYyB2b2lkIHNjYW5fZ2xvY2soc3RydWN0IGdmczJfZ2xvY2sgKmdsKQotewotCWlmIChnbC0+Z2xfb3BzID09ICZnZnMyX2lub2RlX2dsb3BzICYmIGdsLT5nbF9vYmplY3QpCi0JCXJldHVybjsKLQlpZiAodGVzdF9iaXQoR0xGX0xPQ0ssICZnbC0+Z2xfZmxhZ3MpKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2soJmdsLT5nbF9zcGluKTsKLQlpZiAoZmluZF9maXJzdF9ob2xkZXIoZ2wpID09IE5VTEwgJiYKLQkgICAgZ2wtPmdsX3N0YXRlICE9IExNX1NUX1VOTE9DS0VEICYmIGRlbW90ZV9vayhnbCkpCi0JCWdmczJfZ2xvY2tfc2NoZWR1bGVfZm9yX3JlY2xhaW0oZ2wpOwotCXNwaW5fdW5sb2NrKCZnbC0+Z2xfc3Bpbik7Ci19Ci0KLS8qKgogICogY2xlYXJfZ2xvY2sgLSBsb29rIGF0IGEgZ2xvY2sgYW5kIHNlZSBpZiB3ZSBjYW4gZnJlZSBpdCBmcm9tIGdsb2NrIGNhY2hlCiAgKiBAZ2w6IHRoZSBnbG9jayB0byBsb29rIGF0CiAgKgpAQCAtMTQ4NCwyMyArMTUyMywxNiBAQAogCiBzdGF0aWMgdm9pZCBjbGVhcl9nbG9jayhzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wpCiB7Ci0Jc3RydWN0IGdmczJfc2JkICpzZHAgPSBnbC0+Z2xfc2JkOwotCWludCByZWxlYXNlZDsKLQotCXNwaW5fbG9jaygmc2RwLT5zZF9yZWNsYWltX2xvY2spOwotCWlmICghbGlzdF9lbXB0eSgmZ2wtPmdsX3JlY2xhaW0pKSB7Ci0JCWxpc3RfZGVsX2luaXQoJmdsLT5nbF9yZWNsYWltKTsKLQkJYXRvbWljX2RlYygmc2RwLT5zZF9yZWNsYWltX2NvdW50KTsKLQkJc3Bpbl91bmxvY2soJnNkcC0+c2RfcmVjbGFpbV9sb2NrKTsKLQkJcmVsZWFzZWQgPSBnZnMyX2dsb2NrX3B1dChnbCk7Ci0JCWdmczJfYXNzZXJ0KHNkcCwgIXJlbGVhc2VkKTsKLQl9IGVsc2UgewotCQlzcGluX3VubG9jaygmc2RwLT5zZF9yZWNsYWltX2xvY2spOworCXNwaW5fbG9jaygmbHJ1X2xvY2spOworCWlmICghbGlzdF9lbXB0eSgmZ2wtPmdsX2xydSkpIHsKKwkJbGlzdF9kZWxfaW5pdCgmZ2wtPmdsX2xydSk7CisJCWF0b21pY19kZWMoJmxydV9jb3VudCk7CiAJfQorCXNwaW5fdW5sb2NrKCZscnVfbG9jayk7CiAKIAlzcGluX2xvY2soJmdsLT5nbF9zcGluKTsKIAlpZiAoZmluZF9maXJzdF9ob2xkZXIoZ2wpID09IE5VTEwgJiYgZ2wtPmdsX3N0YXRlICE9IExNX1NUX1VOTE9DS0VEKQotCQloYW5kbGVfY2FsbGJhY2soZ2wsIExNX1NUX1VOTE9DS0VELCAwLCAwKTsKKwkJaGFuZGxlX2NhbGxiYWNrKGdsLCBMTV9TVF9VTkxPQ0tFRCwgMCk7CiAJc3Bpbl91bmxvY2soJmdsLT5nbF9zcGluKTsKIAlnZnMyX2dsb2NrX2hvbGQoZ2wpOwogCWlmIChxdWV1ZV9kZWxheWVkX3dvcmsoZ2xvY2tfd29ya3F1ZXVlLCAmZ2wtPmdsX3dvcmssIDApID09IDApCkBAIC0xNTQ4LDYgKzE1ODAsMjAgQEAKIAl9CiB9CiAKK3ZvaWQgZ2ZzMl9nbG9ja19maW5pc2hfdHJ1bmNhdGUoc3RydWN0IGdmczJfaW5vZGUgKmlwKQoreworCXN0cnVjdCBnZnMyX2dsb2NrICpnbCA9IGlwLT5pX2dsOworCWludCByZXQ7CisKKwlyZXQgPSBnZnMyX3RydW5jYXRlaV9yZXN1bWUoaXApOworCWdmczJfYXNzZXJ0X3dpdGhkcmF3KGdsLT5nbF9zYmQsIHJldCA9PSAwKTsKKworCXNwaW5fbG9jaygmZ2wtPmdsX3NwaW4pOworCWNsZWFyX2JpdChHTEZfTE9DSywgJmdsLT5nbF9mbGFncyk7CisJcnVuX3F1ZXVlKGdsLCAxKTsKKwlzcGluX3VubG9jaygmZ2wtPmdsX3NwaW4pOworfQorCiBzdGF0aWMgY29uc3QgY2hhciAqc3RhdGUyc3RyKHVuc2lnbmVkIHN0YXRlKQogewogCXN3aXRjaChzdGF0ZSkgewpAQCAtMTYyMyw4ICsxNjY5LDYgQEAKIAljaGFyICpwID0gYnVmOwogCWlmICh0ZXN0X2JpdChHTEZfTE9DSywgZ2ZsYWdzKSkKIAkJKnArKyA9ICdsJzsKLQlpZiAodGVzdF9iaXQoR0xGX1NUSUNLWSwgZ2ZsYWdzKSkKLQkJKnArKyA9ICdzJzsKIAlpZiAodGVzdF9iaXQoR0xGX0RFTU9URSwgZ2ZsYWdzKSkKIAkJKnArKyA9ICdEJzsKIAlpZiAodGVzdF9iaXQoR0xGX1BFTkRJTkdfREVNT1RFLCBnZmxhZ3MpKQpAQCAtMTc0MywzNCArMTc4Nyw2IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi0vKioKLSAqIGdmczJfc2NhbmQgLSBMb29rIGZvciBjYWNoZWQgZ2xvY2tzIGFuZCBpbm9kZXMgdG8gdG9zcyBmcm9tIG1lbW9yeQotICogQHNkcDogUG9pbnRlciB0byBHRlMyIHN1cGVyYmxvY2sKLSAqCi0gKiBPbmUgb2YgdGhlc2UgZGFlbW9ucyBydW5zLCBmaW5kaW5nIGNhbmRpZGF0ZXMgdG8gYWRkIHRvIHNkX3JlY2xhaW1fbGlzdC4KLSAqIFNlZSBnZnMyX2dsb2NrZCgpCi0gKi8KLQotc3RhdGljIGludCBnZnMyX3NjYW5kKHZvaWQgKmRhdGEpCi17Ci0JdW5zaWduZWQgeDsKLQl1bnNpZ25lZCBkZWxheTsKLQotCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7Ci0JCWZvciAoeCA9IDA7IHggPCBHRlMyX0dMX0hBU0hfU0laRTsgeCsrKQotCQkJZXhhbWluZV9idWNrZXQoc2Nhbl9nbG9jaywgTlVMTCwgeCk7Ci0JCWlmIChmcmVlemluZyhjdXJyZW50KSkKLQkJCXJlZnJpZ2VyYXRvcigpOwotCQlkZWxheSA9IHNjYW5kX3NlY3M7Ci0JCWlmIChkZWxheSA8IDEpCi0JCQlkZWxheSA9IDE7Ci0JCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShkZWxheSAqIEhaKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotCiAKIGludCBfX2luaXQgZ2ZzMl9nbG9ja19pbml0KHZvaWQpCiB7CkBAIC0xNzg0LDI4ICsxODAwLDIxIEBACiAJfQogI2VuZGlmCiAKLQlzY2FuZF9wcm9jZXNzID0ga3RocmVhZF9ydW4oZ2ZzMl9zY2FuZCwgTlVMTCwgImdmczJfc2NhbmQiKTsKLQlpZiAoSVNfRVJSKHNjYW5kX3Byb2Nlc3MpKQotCQlyZXR1cm4gUFRSX0VSUihzY2FuZF9wcm9jZXNzKTsKLQogCWdsb2NrX3dvcmtxdWV1ZSA9IGNyZWF0ZV93b3JrcXVldWUoImdsb2NrX3dvcmtxdWV1ZSIpOwotCWlmIChJU19FUlIoZ2xvY2tfd29ya3F1ZXVlKSkgewotCQlrdGhyZWFkX3N0b3Aoc2NhbmRfcHJvY2Vzcyk7CisJaWYgKElTX0VSUihnbG9ja193b3JrcXVldWUpKQogCQlyZXR1cm4gUFRSX0VSUihnbG9ja193b3JrcXVldWUpOwotCX0KKworCXJlZ2lzdGVyX3Nocmlua2VyKCZnbG9ja19zaHJpbmtlcik7CiAKIAlyZXR1cm4gMDsKIH0KIAogdm9pZCBnZnMyX2dsb2NrX2V4aXQodm9pZCkKIHsKKwl1bnJlZ2lzdGVyX3Nocmlua2VyKCZnbG9ja19zaHJpbmtlcik7CiAJZGVzdHJveV93b3JrcXVldWUoZ2xvY2tfd29ya3F1ZXVlKTsKLQlrdGhyZWFkX3N0b3Aoc2NhbmRfcHJvY2Vzcyk7CiB9CiAKLW1vZHVsZV9wYXJhbShzY2FuZF9zZWNzLCB1aW50LCBTX0lSVUdPfFNfSVdVU1IpOwotTU9EVUxFX1BBUk1fREVTQyhzY2FuZF9zZWNzLCAiVGhlIG51bWJlciBvZiBzZWNvbmRzIGJldHdlZW4gc2NhbmQgcnVucyIpOwotCiBzdGF0aWMgaW50IGdmczJfZ2xvY2tfaXRlcl9uZXh0KHN0cnVjdCBnZnMyX2dsb2NrX2l0ZXIgKmdpKQogewogCXN0cnVjdCBnZnMyX2dsb2NrICpnbDsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvZ2xvY2suaCBiL2ZzL2dmczIvZ2xvY2suaAppbmRleCA2OTVjNmIxLi41NDNlYzdlIDEwMDY0NAotLS0gYS9mcy9nZnMyL2dsb2NrLmgKKysrIGIvZnMvZ2ZzMi9nbG9jay5oCkBAIC0xMjksOSArMTI5LDkgQEAKIHZvaWQgZ2ZzMl9sdmJfdW5ob2xkKHN0cnVjdCBnZnMyX2dsb2NrICpnbCk7CiAKIHZvaWQgZ2ZzMl9nbG9ja19jYih2b2lkICpjYl9kYXRhLCB1bnNpZ25lZCBpbnQgdHlwZSwgdm9pZCAqZGF0YSk7Ci12b2lkIGdmczJfZ2xvY2tfc2NoZWR1bGVfZm9yX3JlY2xhaW0oc3RydWN0IGdmczJfZ2xvY2sgKmdsKTsKIHZvaWQgZ2ZzMl9yZWNsYWltX2dsb2NrKHN0cnVjdCBnZnMyX3NiZCAqc2RwKTsKIHZvaWQgZ2ZzMl9nbF9oYXNoX2NsZWFyKHN0cnVjdCBnZnMyX3NiZCAqc2RwKTsKK3ZvaWQgZ2ZzMl9nbG9ja19maW5pc2hfdHJ1bmNhdGUoc3RydWN0IGdmczJfaW5vZGUgKmlwKTsKIAogaW50IF9faW5pdCBnZnMyX2dsb2NrX2luaXQodm9pZCk7CiB2b2lkIGdmczJfZ2xvY2tfZXhpdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvZ2xvcHMuYyBiL2ZzL2dmczIvZ2xvcHMuYwppbmRleCBjNmMzMThjLi44NTIyZDNhIDEwMDY0NAotLS0gYS9mcy9nZnMyL2dsb3BzLmMKKysrIGIvZnMvZ2ZzMi9nbG9wcy5jCkBAIC0yMDEsMTkgKzIwMSwxMiBAQAogICogUmV0dXJuczogMSBpZiBpdCdzIG9rCiAgKi8KIAotc3RhdGljIGludCBpbm9kZV9nb19kZW1vdGVfb2soc3RydWN0IGdmczJfZ2xvY2sgKmdsKQorc3RhdGljIGludCBpbm9kZV9nb19kZW1vdGVfb2soY29uc3Qgc3RydWN0IGdmczJfZ2xvY2sgKmdsKQogewogCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gZ2wtPmdsX3NiZDsKLQlpbnQgZGVtb3RlID0gMDsKLQotCWlmICghZ2wtPmdsX29iamVjdCAmJiAhZ2wtPmdsX2FzcGFjZS0+aV9tYXBwaW5nLT5ucnBhZ2VzKQotCQlkZW1vdGUgPSAxOwotCWVsc2UgaWYgKCFzZHAtPnNkX2FyZ3MuYXJfbG9jYWxjYWNoaW5nICYmCi0JCSB0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGdsLT5nbF9zdGFtcCArCi0JCQkgICAgICAgZ2ZzMl90dW5lX2dldChzZHAsIGd0X2RlbW90ZV9zZWNzKSAqIEhaKSkKLQkJZGVtb3RlID0gMTsKLQotCXJldHVybiBkZW1vdGU7CisJaWYgKHNkcC0+c2RfamluZGV4ID09IGdsLT5nbF9vYmplY3QgfHwgc2RwLT5zZF9yaW5kZXggPT0gZ2wtPmdsX29iamVjdCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7CiB9CiAKIC8qKgpAQCAtMjI3LDYgKzIyMCw3IEBACiBzdGF0aWMgaW50IGlub2RlX2dvX2xvY2soc3RydWN0IGdmczJfaG9sZGVyICpnaCkKIHsKIAlzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wgPSBnaC0+Z2hfZ2w7CisJc3RydWN0IGdmczJfc2JkICpzZHAgPSBnbC0+Z2xfc2JkOwogCXN0cnVjdCBnZnMyX2lub2RlICppcCA9IGdsLT5nbF9vYmplY3Q7CiAJaW50IGVycm9yID0gMDsKIApAQCAtMjM5LDEwICsyMzMsMTYgQEAKIAkJCXJldHVybiBlcnJvcjsKIAl9CiAKLQlpZiAoKGlwLT5pX2RpLmRpX2ZsYWdzICYgR0ZTMl9ESUZfVFJVTkNfSU5fUFJPRykgJiYKKwlpZiAoKGlwLT5pX2Rpc2tmbGFncyAmIEdGUzJfRElGX1RSVU5DX0lOX1BST0cpICYmCiAJICAgIChnbC0+Z2xfc3RhdGUgPT0gTE1fU1RfRVhDTFVTSVZFKSAmJgotCSAgICAoZ2gtPmdoX3N0YXRlID09IExNX1NUX0VYQ0xVU0lWRSkpCi0JCWVycm9yID0gZ2ZzMl90cnVuY2F0ZWlfcmVzdW1lKGlwKTsKKwkgICAgKGdoLT5naF9zdGF0ZSA9PSBMTV9TVF9FWENMVVNJVkUpKSB7CisJCXNwaW5fbG9jaygmc2RwLT5zZF90cnVuY19sb2NrKTsKKwkJaWYgKGxpc3RfZW1wdHkoJmlwLT5pX3RydW5jX2xpc3QpKQorCQkJbGlzdF9hZGQoJnNkcC0+c2RfdHJ1bmNfbGlzdCwgJmlwLT5pX3RydW5jX2xpc3QpOworCQlzcGluX3VubG9jaygmc2RwLT5zZF90cnVuY19sb2NrKTsKKwkJd2FrZV91cCgmc2RwLT5zZF9xdW90YV93YWl0KTsKKwkJcmV0dXJuIDE7CisJfQogCiAJcmV0dXJuIGVycm9yOwogfQpAQCAtMjYwLDEwICsyNjAsMTMgQEAKIAljb25zdCBzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAgPSBnbC0+Z2xfb2JqZWN0OwogCWlmIChpcCA9PSBOVUxMKQogCQlyZXR1cm4gMDsKLQlnZnMyX3ByaW50X2RiZyhzZXEsICIgSTogbjolbGx1LyVsbHUgdDoldSBmOjB4JTA4bHhcbiIsCisJZ2ZzMl9wcmludF9kYmcoc2VxLCAiIEk6IG46JWxsdS8lbGx1IHQ6JXUgZjoweCUwMmx4IGQ6MHglMDh4IHM6JWxsdS8lbGx1XG4iLAogCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpaXAtPmlfbm9fZm9ybWFsX2lubywKIAkJICAodW5zaWduZWQgbG9uZyBsb25nKWlwLT5pX25vX2FkZHIsCi0JCSAgSUYyRFQoaXAtPmlfaW5vZGUuaV9tb2RlKSwgaXAtPmlfZmxhZ3MpOworCQkgIElGMkRUKGlwLT5pX2lub2RlLmlfbW9kZSksIGlwLT5pX2ZsYWdzLAorCQkgICh1bnNpZ25lZCBpbnQpaXAtPmlfZGlza2ZsYWdzLAorCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpaXAtPmlfaW5vZGUuaV9zaXplLAorCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpaXAtPmlfZGlza3NpemUpOwogCXJldHVybiAwOwogfQogCkBAIC0yNzQsNyArMjc3LDcgQEAKICAqIFJldHVybnM6IDEgaWYgaXQncyBvawogICovCiAKLXN0YXRpYyBpbnQgcmdycF9nb19kZW1vdGVfb2soc3RydWN0IGdmczJfZ2xvY2sgKmdsKQorc3RhdGljIGludCByZ3JwX2dvX2RlbW90ZV9vayhjb25zdCBzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wpCiB7CiAJcmV0dXJuICFnbC0+Z2xfYXNwYWNlLT5pX21hcHBpbmctPm5ycGFnZXM7CiB9CkBAIC0zMTgsNyArMzIxLDkgQEAKIAljb25zdCBzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqcmdkID0gZ2wtPmdsX29iamVjdDsKIAlpZiAocmdkID09IE5VTEwpCiAJCXJldHVybiAwOwotCWdmczJfcHJpbnRfZGJnKHNlcSwgIiBSOiBuOiVsbHVcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpcmdkLT5yZF9hZGRyKTsKKwlnZnMyX3ByaW50X2RiZyhzZXEsICIgUjogbjolbGx1IGY6JTAyeCBiOiV1LyV1IGk6JXVcbiIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXJnZC0+cmRfYWRkciwgcmdkLT5yZF9mbGFncywKKwkJICAgICAgIHJnZC0+cmRfZnJlZSwgcmdkLT5yZF9mcmVlX2Nsb25lLCByZ2QtPnJkX2Rpbm9kZXMpOwogCXJldHVybiAwOwogfQogCkBAIC0zNzQsMTMgKzM3OSwyNSBAQAogfQogCiAvKioKKyAqIHRyYW5zX2dvX2RlbW90ZV9vaworICogQGdsOiB0aGUgZ2xvY2sKKyAqCisgKiBBbHdheXMgcmV0dXJucyAwCisgKi8KKworc3RhdGljIGludCB0cmFuc19nb19kZW1vdGVfb2soY29uc3Qgc3RydWN0IGdmczJfZ2xvY2sgKmdsKQoreworCXJldHVybiAwOworfQorCisvKioKICAqIHF1b3RhX2dvX2RlbW90ZV9vayAtIENoZWNrIHRvIHNlZSBpZiBpdCdzIG9rIHRvIHVubG9jayBhIHF1b3RhIGdsb2NrCiAgKiBAZ2w6IHRoZSBnbG9jawogICoKICAqIFJldHVybnM6IDEgaWYgaXQncyBvawogICovCiAKLXN0YXRpYyBpbnQgcXVvdGFfZ29fZGVtb3RlX29rKHN0cnVjdCBnZnMyX2dsb2NrICpnbCkKK3N0YXRpYyBpbnQgcXVvdGFfZ29fZGVtb3RlX29rKGNvbnN0IHN0cnVjdCBnZnMyX2dsb2NrICpnbCkKIHsKIAlyZXR1cm4gIWF0b21pY19yZWFkKCZnbC0+Z2xfbHZiX2NvdW50KTsKIH0KQEAgLTQxNCw2ICs0MzEsNyBAQAogY29uc3Qgc3RydWN0IGdmczJfZ2xvY2tfb3BlcmF0aW9ucyBnZnMyX3RyYW5zX2dsb3BzID0gewogCS5nb194bW90ZV90aCA9IHRyYW5zX2dvX3N5bmMsCiAJLmdvX3htb3RlX2JoID0gdHJhbnNfZ29feG1vdGVfYmgsCisJLmdvX2RlbW90ZV9vayA9IHRyYW5zX2dvX2RlbW90ZV9vaywKIAkuZ29fdHlwZSA9IExNX1RZUEVfTk9ORElTSywKIH07CiAKZGlmZiAtLWdpdCBhL2ZzL2dmczIvaW5jb3JlLmggYi9mcy9nZnMyL2luY29yZS5oCmluZGV4IGY1NjZlYzEuLjYwODg0OWQgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvaW5jb3JlLmgKKysrIGIvZnMvZ2ZzMi9pbmNvcmUuaApAQCAtNjgsMTIgKzY4LDYgQEAKIAl1MzIgYmlfbGVuOwogfTsKIAotc3RydWN0IGdmczJfcmdycF9ob3N0IHsKLQl1MzIgcmdfZnJlZTsKLQl1MzIgcmdfZGlub2RlczsKLQl1NjQgcmdfaWdlbmVyYXRpb247Ci19OwotCiBzdHJ1Y3QgZ2ZzMl9yZ3JwZCB7CiAJc3RydWN0IGxpc3RfaGVhZCByZF9saXN0OwkvKiBMaW5rIHdpdGggc3VwZXJibG9jayAqLwogCXN0cnVjdCBsaXN0X2hlYWQgcmRfbGlzdF9tcnU7CkBAIC04MywxNCArNzcsMTYgQEAKIAl1MzIgcmRfbGVuZ3RoOwkJCS8qIGxlbmd0aCBvZiByZ3JwIGhlYWRlciBpbiBmcyBibG9ja3MgKi8KIAl1MzIgcmRfZGF0YTsJCQkvKiBudW0gb2YgZGF0YSBibG9ja3MgaW4gcmdycCAqLwogCXUzMiByZF9iaXRieXRlczsJCS8qIG51bWJlciBvZiBieXRlcyBpbiBkYXRhIGJpdG1hcHMgKi8KLQlzdHJ1Y3QgZ2ZzMl9yZ3JwX2hvc3QgcmRfcmc7Ci0Jc3RydWN0IGdmczJfYml0bWFwICpyZF9iaXRzOwotCXVuc2lnbmVkIGludCByZF9iaF9jb3VudDsKLQlzdHJ1Y3QgbXV0ZXggcmRfbXV0ZXg7CisJdTMyIHJkX2ZyZWU7CiAJdTMyIHJkX2ZyZWVfY2xvbmU7CisJdTMyIHJkX2Rpbm9kZXM7CisJdTY0IHJkX2lnZW5lcmF0aW9uOworCXN0cnVjdCBnZnMyX2JpdG1hcCAqcmRfYml0czsKKwlzdHJ1Y3QgbXV0ZXggcmRfbXV0ZXg7CiAJc3RydWN0IGdmczJfbG9nX2VsZW1lbnQgcmRfbGU7Ci0JdTMyIHJkX2xhc3RfYWxsb2M7CiAJc3RydWN0IGdmczJfc2JkICpyZF9zYmQ7CisJdW5zaWduZWQgaW50IHJkX2JoX2NvdW50OworCXUzMiByZF9sYXN0X2FsbG9jOwogCXVuc2lnbmVkIGNoYXIgcmRfZmxhZ3M7CiAjZGVmaW5lIEdGUzJfUkRGX0NIRUNLICAgICAgICAweDAxICAgICAgLyogTmVlZCB0byBjaGVjayBmb3IgdW5saW5rZWQgaW5vZGVzICovCiAjZGVmaW5lIEdGUzJfUkRGX05PQUxMT0MgICAgICAweDAyICAgICAgLyogcmcgcHJvaGliaXRzIGFsbG9jYXRpb24gKi8KQEAgLTEyOSw3ICsxMjUsNyBAQAogCXZvaWQgKCpnb194bW90ZV90aCkgKHN0cnVjdCBnZnMyX2dsb2NrICpnbCk7CiAJaW50ICgqZ29feG1vdGVfYmgpIChzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wsIHN0cnVjdCBnZnMyX2hvbGRlciAqZ2gpOwogCXZvaWQgKCpnb19pbnZhbCkgKHN0cnVjdCBnZnMyX2dsb2NrICpnbCwgaW50IGZsYWdzKTsKLQlpbnQgKCpnb19kZW1vdGVfb2spIChzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wpOworCWludCAoKmdvX2RlbW90ZV9vaykgKGNvbnN0IHN0cnVjdCBnZnMyX2dsb2NrICpnbCk7CiAJaW50ICgqZ29fbG9jaykgKHN0cnVjdCBnZnMyX2hvbGRlciAqZ2gpOwogCXZvaWQgKCpnb191bmxvY2spIChzdHJ1Y3QgZ2ZzMl9ob2xkZXIgKmdoKTsKIAlpbnQgKCpnb19kdW1wKShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgY29uc3Qgc3RydWN0IGdmczJfZ2xvY2sgKmdsKTsKQEAgLTE1OSw3ICsxNTUsNiBAQAogCiBlbnVtIHsKIAlHTEZfTE9DSwkJCT0gMSwKLQlHTEZfU1RJQ0tZCQkJPSAyLAogCUdMRl9ERU1PVEUJCQk9IDMsCiAJR0xGX1BFTkRJTkdfREVNT1RFCQk9IDQsCiAJR0xGX0RFTU9URV9JTl9QUk9HUkVTUwkJPSA1LApAQCAtMTk0LDcgKzE4OSw3IEBACiAJdW5zaWduZWQgbG9uZyBnbF90Y2hhbmdlOwogCXZvaWQgKmdsX29iamVjdDsKIAotCXN0cnVjdCBsaXN0X2hlYWQgZ2xfcmVjbGFpbTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGdsX2xydTsKIAogCXN0cnVjdCBnZnMyX3NiZCAqZ2xfc2JkOwogCkBAIC0yMzMsMjkgKzIyOCwyNCBAQAogCUdJRl9VU0VSICAgICAgICAgICAgICAgID0gNCwgLyogdXNlciBpbm9kZSwgbm90IG1ldGFkYXRhIGFkZHIgc3BhY2UgKi8KIH07CiAKLXN0cnVjdCBnZnMyX2Rpbm9kZV9ob3N0IHsKLQl1NjQgZGlfc2l6ZTsJCS8qIG51bWJlciBvZiBieXRlcyBpbiBmaWxlICovCi0JdTY0IGRpX2dlbmVyYXRpb247CS8qIGdlbmVyYXRpb24gbnVtYmVyIGZvciBORlMgKi8KLQl1MzIgZGlfZmxhZ3M7CQkvKiBHRlMyX0RJRl8uLi4gKi8KLQkvKiBUaGVzZSBvbmx5IGFwcGx5IHRvIGRpcmVjdG9yaWVzICAqLwotCXUzMiBkaV9lbnRyaWVzOwkJLyogVGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBkaXJlY3RvcnkgKi8KLQl1NjQgZGlfZWF0dHI7CQkvKiBleHRlbmRlZCBhdHRyaWJ1dGUgYmxvY2sgbnVtYmVyICovCi19OwogCiBzdHJ1Y3QgZ2ZzMl9pbm9kZSB7CiAJc3RydWN0IGlub2RlIGlfaW5vZGU7CiAJdTY0IGlfbm9fYWRkcjsKIAl1NjQgaV9ub19mb3JtYWxfaW5vOworCXU2NCBpX2dlbmVyYXRpb247CisJdTY0IGlfZWF0dHI7CisJbG9mZl90IGlfZGlza3NpemU7CiAJdW5zaWduZWQgbG9uZyBpX2ZsYWdzOwkJLyogR0lGXy4uLiAqLwotCi0Jc3RydWN0IGdmczJfZGlub2RlX2hvc3QgaV9kaTsgLyogVG8gYmUgcmVwbGFjZWQgYnkgcmVmIHRvIGJsb2NrICovCi0KIAlzdHJ1Y3QgZ2ZzMl9nbG9jayAqaV9nbDsgLyogTW92ZSBpbnRvIGlfZ2g/ICovCiAJc3RydWN0IGdmczJfaG9sZGVyIGlfaW9wZW5fZ2g7CiAJc3RydWN0IGdmczJfaG9sZGVyIGlfZ2g7IC8qIGZvciBwcmVwYXJlL2NvbW1pdF93cml0ZSBvbmx5ICovCiAJc3RydWN0IGdmczJfYWxsb2MgKmlfYWxsb2M7CiAJdTY0IGlfZ29hbDsJLyogZ29hbCBibG9jayBmb3IgYWxsb2NhdGlvbnMgKi8KIAlzdHJ1Y3Qgcndfc2VtYXBob3JlIGlfcndfbXV0ZXg7CisJc3RydWN0IGxpc3RfaGVhZCBpX3RydW5jX2xpc3Q7CisJdTMyIGlfZW50cmllczsKKwl1MzIgaV9kaXNrZmxhZ3M7CiAJdTggaV9oZWlnaHQ7CiAJdTggaV9kZXB0aDsKIH07CkBAIC00MDYsMTMgKzM5NiwxMSBAQAogc3RydWN0IGdmczJfdHVuZSB7CiAJc3BpbmxvY2tfdCBndF9zcGluOwogCi0JdW5zaWduZWQgaW50IGd0X2RlbW90ZV9zZWNzOyAvKiBDYWNoZSByZXRlbnRpb24gZm9yIHVuaGVsZCBnbG9jayAqLwogCXVuc2lnbmVkIGludCBndF9pbmNvcmVfbG9nX2Jsb2NrczsKIAl1bnNpZ25lZCBpbnQgZ3RfbG9nX2ZsdXNoX3NlY3M7CiAKIAl1bnNpZ25lZCBpbnQgZ3RfcmVjb3ZlcmRfc2VjczsKIAl1bnNpZ25lZCBpbnQgZ3RfbG9nZF9zZWNzOwotCXVuc2lnbmVkIGludCBndF9xdW90YWRfc2VjczsKIAogCXVuc2lnbmVkIGludCBndF9xdW90YV9zaW11bF9zeW5jOyAvKiBNYXggcXVvdGF2YWxzIHRvIHN5bmMgYXQgb25jZSAqLwogCXVuc2lnbmVkIGludCBndF9xdW90YV93YXJuX3BlcmlvZDsgLyogU2VjcyBiZXR3ZWVuIHF1b3RhIHdhcm4gbXNncyAqLwpAQCAtNDg4LDEwICs0NzYsNiBAQAogCS8qIExvY2sgU3R1ZmYgKi8KIAogCXN0cnVjdCBsbV9sb2Nrc3RydWN0IHNkX2xvY2tzdHJ1Y3Q7Ci0Jc3RydWN0IGxpc3RfaGVhZCBzZF9yZWNsYWltX2xpc3Q7Ci0Jc3BpbmxvY2tfdCBzZF9yZWNsYWltX2xvY2s7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgc2RfcmVjbGFpbV93cTsKLQlhdG9taWNfdCBzZF9yZWNsYWltX2NvdW50OwogCXN0cnVjdCBnZnMyX2hvbGRlciBzZF9saXZlX2doOwogCXN0cnVjdCBnZnMyX2dsb2NrICpzZF9yZW5hbWVfZ2w7CiAJc3RydWN0IGdmczJfZ2xvY2sgKnNkX3RyYW5zX2dsOwpAQCAtNTE5LDcgKzUwMyw2IEBACiAJc3BpbmxvY2tfdCBzZF9zdGF0ZnNfc3BpbjsKIAlzdHJ1Y3QgZ2ZzMl9zdGF0ZnNfY2hhbmdlX2hvc3Qgc2Rfc3RhdGZzX21hc3RlcjsKIAlzdHJ1Y3QgZ2ZzMl9zdGF0ZnNfY2hhbmdlX2hvc3Qgc2Rfc3RhdGZzX2xvY2FsOwotCXVuc2lnbmVkIGxvbmcgc2Rfc3RhdGZzX3N5bmNfdGltZTsKIAogCS8qIFJlc291cmNlIGdyb3VwIHN0dWZmICovCiAKQEAgLTU1Miw4ICs1MzUsNiBAQAogCXN0cnVjdCB0YXNrX3N0cnVjdCAqc2RfcmVjb3ZlcmRfcHJvY2VzczsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnNkX2xvZ2RfcHJvY2VzczsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnNkX3F1b3RhZF9wcm9jZXNzOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqc2RfZ2xvY2tkX3Byb2Nlc3NbR0ZTMl9HTE9DS0RfTUFYXTsKLQl1bnNpZ25lZCBpbnQgc2RfZ2xvY2tkX251bTsKIAogCS8qIFF1b3RhIHN0dWZmICovCiAKQEAgLTU2MSwxMyArNTQyLDE1IEBACiAJYXRvbWljX3Qgc2RfcXVvdGFfY291bnQ7CiAJc3BpbmxvY2tfdCBzZF9xdW90YV9zcGluOwogCXN0cnVjdCBtdXRleCBzZF9xdW90YV9tdXRleDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBzZF9xdW90YV93YWl0OworCXN0cnVjdCBsaXN0X2hlYWQgc2RfdHJ1bmNfbGlzdDsKKwlzcGlubG9ja190IHNkX3RydW5jX2xvY2s7CiAKIAl1bnNpZ25lZCBpbnQgc2RfcXVvdGFfc2xvdHM7CiAJdW5zaWduZWQgaW50IHNkX3F1b3RhX2NodW5rczsKIAl1bnNpZ25lZCBjaGFyICoqc2RfcXVvdGFfYml0bWFwOwogCiAJdTY0IHNkX3F1b3RhX3N5bmNfZ2VuOwotCXVuc2lnbmVkIGxvbmcgc2RfcXVvdGFfc3luY190aW1lOwogCiAJLyogTG9nIHN0dWZmICovCiAKQEAgLTYyNCwxMCArNjA3LDYgQEAKIAlzdHJ1Y3QgbXV0ZXggc2RfZnJlZXplX2xvY2s7CiAJdW5zaWduZWQgaW50IHNkX2ZyZWV6ZV9jb3VudDsKIAotCS8qIENvdW50ZXJzICovCi0KLQlhdG9taWNfdCBzZF9yZWNsYWltZWQ7Ci0KIAljaGFyIHNkX2ZzbmFtZVtHRlMyX0ZTTkFNRV9MRU5dOwogCWNoYXIgc2RfdGFibGVfbmFtZVtHRlMyX0ZTTkFNRV9MRU5dOwogCWNoYXIgc2RfcHJvdG9fbmFtZVtHRlMyX0ZTTkFNRV9MRU5dOwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9pbm9kZS5jIGIvZnMvZ2ZzMi9pbm9kZS5jCmluZGV4IGQ1NzYxNjguLjNiODdjMTggMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvaW5vZGUuYworKysgYi9mcy9nZnMyL2lub2RlLmMKQEAgLTMyLDcgKzMyLDYgQEAKICNpbmNsdWRlICJsb2cuaCIKICNpbmNsdWRlICJtZXRhX2lvLmgiCiAjaW5jbHVkZSAib3BzX2FkZHJlc3MuaCIKLSNpbmNsdWRlICJvcHNfaW5vZGUuaCIKICNpbmNsdWRlICJxdW90YS5oIgogI2luY2x1ZGUgInJncnAuaCIKICNpbmNsdWRlICJ0cmFucy5oIgpAQCAtMjQ4LDcgKzI0Nyw2IEBACiAKIHN0YXRpYyBpbnQgZ2ZzMl9kaW5vZGVfaW4oc3RydWN0IGdmczJfaW5vZGUgKmlwLCBjb25zdCB2b2lkICpidWYpCiB7Ci0Jc3RydWN0IGdmczJfZGlub2RlX2hvc3QgKmRpID0gJmlwLT5pX2RpOwogCWNvbnN0IHN0cnVjdCBnZnMyX2Rpbm9kZSAqc3RyID0gYnVmOwogCXN0cnVjdCB0aW1lc3BlYyBhdGltZTsKIAl1MTYgaGVpZ2h0LCBkZXB0aDsKQEAgLTI3NCw4ICsyNzIsOCBAQAogCSAqIHRvIGRvIHRoYXQuCiAJICovCiAJaXAtPmlfaW5vZGUuaV9ubGluayA9IGJlMzJfdG9fY3B1KHN0ci0+ZGlfbmxpbmspOwotCWRpLT5kaV9zaXplID0gYmU2NF90b19jcHUoc3RyLT5kaV9zaXplKTsKLQlpX3NpemVfd3JpdGUoJmlwLT5pX2lub2RlLCBkaS0+ZGlfc2l6ZSk7CisJaXAtPmlfZGlza3NpemUgPSBiZTY0X3RvX2NwdShzdHItPmRpX3NpemUpOworCWlfc2l6ZV93cml0ZSgmaXAtPmlfaW5vZGUsIGlwLT5pX2Rpc2tzaXplKTsKIAlnZnMyX3NldF9pbm9kZV9ibG9ja3MoJmlwLT5pX2lub2RlLCBiZTY0X3RvX2NwdShzdHItPmRpX2Jsb2NrcykpOwogCWF0aW1lLnR2X3NlYyA9IGJlNjRfdG9fY3B1KHN0ci0+ZGlfYXRpbWUpOwogCWF0aW1lLnR2X25zZWMgPSBiZTMyX3RvX2NwdShzdHItPmRpX2F0aW1lX25zZWMpOwpAQCAtMjg3LDkgKzI4NSw5IEBACiAJaXAtPmlfaW5vZGUuaV9jdGltZS50dl9uc2VjID0gYmUzMl90b19jcHUoc3RyLT5kaV9jdGltZV9uc2VjKTsKIAogCWlwLT5pX2dvYWwgPSBiZTY0X3RvX2NwdShzdHItPmRpX2dvYWxfbWV0YSk7Ci0JZGktPmRpX2dlbmVyYXRpb24gPSBiZTY0X3RvX2NwdShzdHItPmRpX2dlbmVyYXRpb24pOworCWlwLT5pX2dlbmVyYXRpb24gPSBiZTY0X3RvX2NwdShzdHItPmRpX2dlbmVyYXRpb24pOwogCi0JZGktPmRpX2ZsYWdzID0gYmUzMl90b19jcHUoc3RyLT5kaV9mbGFncyk7CisJaXAtPmlfZGlza2ZsYWdzID0gYmUzMl90b19jcHUoc3RyLT5kaV9mbGFncyk7CiAJZ2ZzMl9zZXRfaW5vZGVfZmxhZ3MoJmlwLT5pX2lub2RlKTsKIAloZWlnaHQgPSBiZTE2X3RvX2NwdShzdHItPmRpX2hlaWdodCk7CiAJaWYgKHVubGlrZWx5KGhlaWdodCA+IEdGUzJfTUFYX01FVEFfSEVJR0hUKSkKQEAgLTMwMCw5ICsyOTgsOSBAQAogCWlmICh1bmxpa2VseShkZXB0aCA+IEdGUzJfRElSX01BWF9ERVBUSCkpCiAJCWdvdG8gY29ycnVwdDsKIAlpcC0+aV9kZXB0aCA9ICh1OClkZXB0aDsKLQlkaS0+ZGlfZW50cmllcyA9IGJlMzJfdG9fY3B1KHN0ci0+ZGlfZW50cmllcyk7CisJaXAtPmlfZW50cmllcyA9IGJlMzJfdG9fY3B1KHN0ci0+ZGlfZW50cmllcyk7CiAKLQlkaS0+ZGlfZWF0dHIgPSBiZTY0X3RvX2NwdShzdHItPmRpX2VhdHRyKTsKKwlpcC0+aV9lYXR0ciA9IGJlNjRfdG9fY3B1KHN0ci0+ZGlfZWF0dHIpOwogCWlmIChTX0lTUkVHKGlwLT5pX2lub2RlLmlfbW9kZSkpCiAJCWdmczJfc2V0X2FvcHMoJmlwLT5pX2lub2RlKTsKIApAQCAtMzg4LDcgKzM4Niw2IEBACiAJZ2ZzMl9mcmVlX2RpKHJnZCwgaXApOwogCiAJZ2ZzMl90cmFuc19lbmQoc2RwKTsKLQljbGVhcl9iaXQoR0xGX1NUSUNLWSwgJmlwLT5pX2dsLT5nbF9mbGFncyk7CiAKIG91dF9yZ19ndW5sb2NrOgogCWdmczJfZ2xvY2tfZHFfdW5pbml0KCZhbC0+YWxfcmdkX2doKTsKQEAgLTY5MCw3ICs2ODcsNyBAQAogCQlyZXR1cm4gZXJyb3I7CiAJfQogCi0JaWYgKGRpcC0+aV9kaS5kaV9lbnRyaWVzID09ICh1MzIpLTEpCisJaWYgKGRpcC0+aV9lbnRyaWVzID09ICh1MzIpLTEpCiAJCXJldHVybiAtRUZCSUc7CiAJaWYgKFNfSVNESVIobW9kZSkgJiYgZGlwLT5pX2lub2RlLmlfbmxpbmsgPT0gKHUzMiktMSkKIAkJcmV0dXJuIC1FTUxJTks7CkBAIC03OTAsMTEgKzc4NywxMSBAQAogCWRpLT5kaV9mbGFncyA9IDA7CiAKIAlpZiAoU19JU1JFRyhtb2RlKSkgewotCQlpZiAoKGRpcC0+aV9kaS5kaV9mbGFncyAmIEdGUzJfRElGX0lOSEVSSVRfSkRBVEEpIHx8CisJCWlmICgoZGlwLT5pX2Rpc2tmbGFncyAmIEdGUzJfRElGX0lOSEVSSVRfSkRBVEEpIHx8CiAJCSAgICBnZnMyX3R1bmVfZ2V0KHNkcCwgZ3RfbmV3X2ZpbGVzX2pkYXRhKSkKIAkJCWRpLT5kaV9mbGFncyB8PSBjcHVfdG9fYmUzMihHRlMyX0RJRl9KREFUQSk7CiAJfSBlbHNlIGlmIChTX0lTRElSKG1vZGUpKSB7Ci0JCWRpLT5kaV9mbGFncyB8PSBjcHVfdG9fYmUzMihkaXAtPmlfZGkuZGlfZmxhZ3MgJgorCQlkaS0+ZGlfZmxhZ3MgfD0gY3B1X3RvX2JlMzIoZGlwLT5pX2Rpc2tmbGFncyAmCiAJCQkJCSAgICBHRlMyX0RJRl9JTkhFUklUX0pEQVRBKTsKIAl9CiAKQEAgLTEwNjgsNyArMTA2NSw3IEBACiAJc3RydWN0IHFzdHIgZG90bmFtZTsKIAlpbnQgZXJyb3I7CiAKLQlpZiAoaXAtPmlfZGkuZGlfZW50cmllcyAhPSAyKSB7CisJaWYgKGlwLT5pX2VudHJpZXMgIT0gMikgewogCQlpZiAoZ2ZzMl9jb25zaXN0X2lub2RlKGlwKSkKIAkJCWdmczJfZGlub2RlX3ByaW50KGlwKTsKIAkJcmV0dXJuIC1FSU87CkBAIC0xMTY4LDcgKzExNjUsNyBAQAogCQlyZXR1cm4gZXJyb3I7CiAJfQogCi0JaWYgKCFpcC0+aV9kaS5kaV9zaXplKSB7CisJaWYgKCFpcC0+aV9kaXNrc2l6ZSkgewogCQlnZnMyX2NvbnNpc3RfaW5vZGUoaXApOwogCQllcnJvciA9IC1FSU87CiAJCWdvdG8gb3V0OwpAQCAtMTE3OCw3ICsxMTc1LDcgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0OwogCi0JeCA9IGlwLT5pX2RpLmRpX3NpemUgKyAxOworCXggPSBpcC0+aV9kaXNrc2l6ZSArIDE7CiAJaWYgKHggPiAqbGVuKSB7CiAJCSpidWYgPSBrbWFsbG9jKHgsIEdGUF9OT0ZTKTsKIAkJaWYgKCEqYnVmKSB7CkBAIC0xMjQyLDcgKzEyMzksNiBAQAogCiB2b2lkIGdmczJfZGlub2RlX291dChjb25zdCBzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIHZvaWQgKmJ1ZikKIHsKLQljb25zdCBzdHJ1Y3QgZ2ZzMl9kaW5vZGVfaG9zdCAqZGkgPSAmaXAtPmlfZGk7CiAJc3RydWN0IGdmczJfZGlub2RlICpzdHIgPSBidWY7CiAKIAlzdHItPmRpX2hlYWRlci5taF9tYWdpYyA9IGNwdV90b19iZTMyKEdGUzJfTUFHSUMpOwpAQCAtMTI1Niw3ICsxMjUyLDcgQEAKIAlzdHItPmRpX3VpZCA9IGNwdV90b19iZTMyKGlwLT5pX2lub2RlLmlfdWlkKTsKIAlzdHItPmRpX2dpZCA9IGNwdV90b19iZTMyKGlwLT5pX2lub2RlLmlfZ2lkKTsKIAlzdHItPmRpX25saW5rID0gY3B1X3RvX2JlMzIoaXAtPmlfaW5vZGUuaV9ubGluayk7Ci0Jc3RyLT5kaV9zaXplID0gY3B1X3RvX2JlNjQoZGktPmRpX3NpemUpOworCXN0ci0+ZGlfc2l6ZSA9IGNwdV90b19iZTY0KGlwLT5pX2Rpc2tzaXplKTsKIAlzdHItPmRpX2Jsb2NrcyA9IGNwdV90b19iZTY0KGdmczJfZ2V0X2lub2RlX2Jsb2NrcygmaXAtPmlfaW5vZGUpKTsKIAlzdHItPmRpX2F0aW1lID0gY3B1X3RvX2JlNjQoaXAtPmlfaW5vZGUuaV9hdGltZS50dl9zZWMpOwogCXN0ci0+ZGlfbXRpbWUgPSBjcHVfdG9fYmU2NChpcC0+aV9pbm9kZS5pX210aW1lLnR2X3NlYyk7CkBAIC0xMjY0LDE3ICsxMjYwLDE3IEBACiAKIAlzdHItPmRpX2dvYWxfbWV0YSA9IGNwdV90b19iZTY0KGlwLT5pX2dvYWwpOwogCXN0ci0+ZGlfZ29hbF9kYXRhID0gY3B1X3RvX2JlNjQoaXAtPmlfZ29hbCk7Ci0Jc3RyLT5kaV9nZW5lcmF0aW9uID0gY3B1X3RvX2JlNjQoZGktPmRpX2dlbmVyYXRpb24pOworCXN0ci0+ZGlfZ2VuZXJhdGlvbiA9IGNwdV90b19iZTY0KGlwLT5pX2dlbmVyYXRpb24pOwogCi0Jc3RyLT5kaV9mbGFncyA9IGNwdV90b19iZTMyKGRpLT5kaV9mbGFncyk7CisJc3RyLT5kaV9mbGFncyA9IGNwdV90b19iZTMyKGlwLT5pX2Rpc2tmbGFncyk7CiAJc3RyLT5kaV9oZWlnaHQgPSBjcHVfdG9fYmUxNihpcC0+aV9oZWlnaHQpOwogCXN0ci0+ZGlfcGF5bG9hZF9mb3JtYXQgPSBjcHVfdG9fYmUzMihTX0lTRElSKGlwLT5pX2lub2RlLmlfbW9kZSkgJiYKLQkJCQkJICAgICAhKGlwLT5pX2RpLmRpX2ZsYWdzICYgR0ZTMl9ESUZfRVhIQVNIKSA/CisJCQkJCSAgICAgIShpcC0+aV9kaXNrZmxhZ3MgJiBHRlMyX0RJRl9FWEhBU0gpID8KIAkJCQkJICAgICBHRlMyX0ZPUk1BVF9ERSA6IDApOwogCXN0ci0+ZGlfZGVwdGggPSBjcHVfdG9fYmUxNihpcC0+aV9kZXB0aCk7Ci0Jc3RyLT5kaV9lbnRyaWVzID0gY3B1X3RvX2JlMzIoZGktPmRpX2VudHJpZXMpOworCXN0ci0+ZGlfZW50cmllcyA9IGNwdV90b19iZTMyKGlwLT5pX2VudHJpZXMpOwogCi0Jc3RyLT5kaV9lYXR0ciA9IGNwdV90b19iZTY0KGRpLT5kaV9lYXR0cik7CisJc3RyLT5kaV9lYXR0ciA9IGNwdV90b19iZTY0KGlwLT5pX2VhdHRyKTsKIAlzdHItPmRpX2F0aW1lX25zZWMgPSBjcHVfdG9fYmUzMihpcC0+aV9pbm9kZS5pX2F0aW1lLnR2X25zZWMpOwogCXN0ci0+ZGlfbXRpbWVfbnNlYyA9IGNwdV90b19iZTMyKGlwLT5pX2lub2RlLmlfbXRpbWUudHZfbnNlYyk7CiAJc3RyLT5kaV9jdGltZV9uc2VjID0gY3B1X3RvX2JlMzIoaXAtPmlfaW5vZGUuaV9jdGltZS50dl9uc2VjKTsKQEAgLTEyODIsMjIgKzEyNzgsMjEgQEAKIAogdm9pZCBnZnMyX2Rpbm9kZV9wcmludChjb25zdCBzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXApCiB7Ci0JY29uc3Qgc3RydWN0IGdmczJfZGlub2RlX2hvc3QgKmRpID0gJmlwLT5pX2RpOwotCiAJcHJpbnRrKEtFUk5fSU5GTyAiICBub19mb3JtYWxfaW5vID0gJWxsdVxuIiwKIAkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylpcC0+aV9ub19mb3JtYWxfaW5vKTsKIAlwcmludGsoS0VSTl9JTkZPICIgIG5vX2FkZHIgPSAlbGx1XG4iLAogCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWlwLT5pX25vX2FkZHIpOwotCXByaW50ayhLRVJOX0lORk8gIiAgZGlfc2l6ZSA9ICVsbHVcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpZGktPmRpX3NpemUpOworCXByaW50ayhLRVJOX0lORk8gIiAgaV9kaXNrc2l6ZSA9ICVsbHVcbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpaXAtPmlfZGlza3NpemUpOwogCXByaW50ayhLRVJOX0lORk8gIiAgYmxvY2tzID0gJWxsdVxuIiwKIAkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylnZnMyX2dldF9pbm9kZV9ibG9ja3MoJmlwLT5pX2lub2RlKSk7CiAJcHJpbnRrKEtFUk5fSU5GTyAiICBpX2dvYWwgPSAlbGx1XG4iLAogCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWlwLT5pX2dvYWwpOwotCXByaW50ayhLRVJOX0lORk8gIiAgZGlfZmxhZ3MgPSAweCUuOFhcbiIsIGRpLT5kaV9mbGFncyk7CisJcHJpbnRrKEtFUk5fSU5GTyAiICBpX2Rpc2tmbGFncyA9IDB4JS44WFxuIiwgaXAtPmlfZGlza2ZsYWdzKTsKIAlwcmludGsoS0VSTl9JTkZPICIgIGlfaGVpZ2h0ID0gJXVcbiIsIGlwLT5pX2hlaWdodCk7CiAJcHJpbnRrKEtFUk5fSU5GTyAiICBpX2RlcHRoID0gJXVcbiIsIGlwLT5pX2RlcHRoKTsKLQlwcmludGsoS0VSTl9JTkZPICIgIGRpX2VudHJpZXMgPSAldVxuIiwgZGktPmRpX2VudHJpZXMpOwotCXByaW50ayhLRVJOX0lORk8gIiAgZGlfZWF0dHIgPSAlbGx1XG4iLAotCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWRpLT5kaV9lYXR0cik7CisJcHJpbnRrKEtFUk5fSU5GTyAiICBpX2VudHJpZXMgPSAldVxuIiwgaXAtPmlfZW50cmllcyk7CisJcHJpbnRrKEtFUk5fSU5GTyAiICBpX2VhdHRyID0gJWxsdVxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylpcC0+aV9lYXR0cik7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2dmczIvaW5vZGUuaCBiL2ZzL2dmczIvaW5vZGUuaAppbmRleCAyZDQzZjY5Li5kNTMyOTM2IDEwMDY0NAotLS0gYS9mcy9nZnMyL2lub2RlLmgKKysrIGIvZnMvZ2ZzMi9pbm9kZS5oCkBAIC0xMCw2ICsxMCw3IEBACiAjaWZuZGVmIF9fSU5PREVfRE9UX0hfXwogI2RlZmluZSBfX0lOT0RFX0RPVF9IX18KIAorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSAidXRpbC5oIgogCiBzdGF0aWMgaW5saW5lIGludCBnZnMyX2lzX3N0dWZmZWQoY29uc3Qgc3RydWN0IGdmczJfaW5vZGUgKmlwKQpAQCAtMTksNyArMjAsNyBAQAogCiBzdGF0aWMgaW5saW5lIGludCBnZnMyX2lzX2pkYXRhKGNvbnN0IHN0cnVjdCBnZnMyX2lub2RlICppcCkKIHsKLQlyZXR1cm4gaXAtPmlfZGkuZGlfZmxhZ3MgJiBHRlMyX0RJRl9KREFUQTsKKwlyZXR1cm4gaXAtPmlfZGlza2ZsYWdzICYgR0ZTMl9ESUZfSkRBVEE7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGdmczJfaXNfd3JpdGViYWNrKGNvbnN0IHN0cnVjdCBnZnMyX2lub2RlICppcCkKQEAgLTk3LDUgKzk4LDE1IEBACiB2b2lkIGdmczJfZGlub2RlX291dChjb25zdCBzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIHZvaWQgKmJ1Zik7CiB2b2lkIGdmczJfZGlub2RlX3ByaW50KGNvbnN0IHN0cnVjdCBnZnMyX2lub2RlICppcCk7CiAKK2V4dGVybiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBnZnMyX2ZpbGVfaW9wczsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBnZnMyX2Rpcl9pb3BzOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGdmczJfc3ltbGlua19pb3BzOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZ2ZzMl9maWxlX2ZvcHM7CitleHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBnZnMyX2Rpcl9mb3BzOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZ2ZzMl9maWxlX2ZvcHNfbm9sb2NrOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZ2ZzMl9kaXJfZm9wc19ub2xvY2s7CisKK2V4dGVybiB2b2lkIGdmczJfc2V0X2lub2RlX2ZsYWdzKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworCiAjZW5kaWYgLyogX19JTk9ERV9ET1RfSF9fICovCiAKZGlmZiAtLWdpdCBhL2ZzL2dmczIvbG9ja2luZy9kbG0vbW91bnQuYyBiL2ZzL2dmczIvbG9ja2luZy9kbG0vbW91bnQuYwppbmRleCAwYzRjYmU2Li4xYWE3ZWI2IDEwMDY0NAotLS0gYS9mcy9nZnMyL2xvY2tpbmcvZGxtL21vdW50LmMKKysrIGIvZnMvZ2ZzMi9sb2NraW5nL2RsbS9tb3VudC5jCkBAIC0xOTQsMTcgKzE5NCwyNSBAQAogc3RhdGljIHZvaWQgZ2RsbV9yZWNvdmVyeV9kb25lKHZvaWQgKmxvY2tzcGFjZSwgdW5zaWduZWQgaW50IGppZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWVzc2FnZSkKIHsKKwljaGFyIGVudl9qaWRbMjBdOworCWNoYXIgZW52X3N0YXR1c1syMF07CisJY2hhciAqZW52cFtdID0geyBlbnZfamlkLCBlbnZfc3RhdHVzLCBOVUxMIH07CiAJc3RydWN0IGdkbG1fbHMgKmxzID0gbG9ja3NwYWNlOwogCWxzLT5yZWNvdmVyX2ppZF9kb25lID0gamlkOwogCWxzLT5yZWNvdmVyX2ppZF9zdGF0dXMgPSBtZXNzYWdlOwotCWtvYmplY3RfdWV2ZW50KCZscy0+a29iaiwgS09CSl9DSEFOR0UpOworCXNwcmludGYoZW52X2ppZCwgIkpJRD0lZCIsIGppZCk7CisJc3ByaW50ZihlbnZfc3RhdHVzLCAiUkVDT1ZFUlk9JXMiLAorCQltZXNzYWdlID09IExNX1JEX1NVQ0NFU1MgPyAiRG9uZSIgOiAiRmFpbGVkIik7CisJa29iamVjdF91ZXZlbnRfZW52KCZscy0+a29iaiwgS09CSl9DSEFOR0UsIGVudnApOwogfQogCiBzdGF0aWMgdm9pZCBnZGxtX290aGVyc19tYXlfbW91bnQodm9pZCAqbG9ja3NwYWNlKQogeworCWNoYXIgKm1lc3NhZ2UgPSAiRklSU1RNT1VOVD1Eb25lIjsKKwljaGFyICplbnZwW10gPSB7IG1lc3NhZ2UsIE5VTEwgfTsKIAlzdHJ1Y3QgZ2RsbV9scyAqbHMgPSBsb2Nrc3BhY2U7CiAJbHMtPmZpcnN0X2RvbmUgPSAxOwotCWtvYmplY3RfdWV2ZW50KCZscy0+a29iaiwgS09CSl9DSEFOR0UpOworCWtvYmplY3RfdWV2ZW50X2VudigmbHMtPmtvYmosIEtPQkpfQ0hBTkdFLCBlbnZwKTsKIH0KIAogLyogVXNlcnNwYWNlIGdldHMgdGhlIG9mZmxpbmUgdWV2ZW50LCBibG9ja3MgbmV3IGdmcyBsb2NrcyBvbgpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9sb2NraW5nL2RsbS9zeXNmcy5jIGIvZnMvZ2ZzMi9sb2NraW5nL2RsbS9zeXNmcy5jCmluZGV4IDRlYzU3MWMuLjliN2VkY2YgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvbG9ja2luZy9kbG0vc3lzZnMuYworKysgYi9mcy9nZnMyL2xvY2tpbmcvZGxtL3N5c2ZzLmMKQEAgLTE5NSw5ICsxOTUsMjMgQEAKIAlrb2JqZWN0X3B1dCgmbHMtPmtvYmopOwogfQogCitzdGF0aWMgaW50IGdkbG1fdWV2ZW50KHN0cnVjdCBrc2V0ICprc2V0LCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJICAgICAgIHN0cnVjdCBrb2JqX3VldmVudF9lbnYgKmVudikKK3sKKyAgICAgICAgc3RydWN0IGdkbG1fbHMgKmxzID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBnZGxtX2xzLCBrb2JqKTsKKyAgICAgICAgYWRkX3VldmVudF92YXIoZW52LCAiTE9DS1RBQkxFPSVzOiVzIiwgbHMtPmNsdXN0ZXJuYW1lLCBscy0+ZnNuYW1lKTsKKyAgICAgICAgYWRkX3VldmVudF92YXIoZW52LCAiTE9DS1BST1RPPWxvY2tfZGxtIik7CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGtzZXRfdWV2ZW50X29wcyBnZGxtX3VldmVudF9vcHMgPSB7CisJLnVldmVudCA9IGdkbG1fdWV2ZW50LAorfTsKKworCiBpbnQgZ2RsbV9zeXNmc19pbml0KHZvaWQpCiB7Ci0JZ2RsbV9rc2V0ID0ga3NldF9jcmVhdGVfYW5kX2FkZCgibG9ja19kbG0iLCBOVUxMLCBrZXJuZWxfa29iaik7CisJZ2RsbV9rc2V0ID0ga3NldF9jcmVhdGVfYW5kX2FkZCgibG9ja19kbG0iLCAmZ2RsbV91ZXZlbnRfb3BzLCBrZXJuZWxfa29iaik7CiAJaWYgKCFnZGxtX2tzZXQpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGNhbiBub3QgY3JlYXRlIGtzZXRcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9mcy9nZnMyL21haW4uYyBiL2ZzL2dmczIvbWFpbi5jCmluZGV4IGJiMmNjMzAuLjdjYWNmZGUgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvbWFpbi5jCisrKyBiL2ZzL2dmczIvbWFpbi5jCkBAIC0xOSw3ICsxOSw3IEBACiAKICNpbmNsdWRlICJnZnMyLmgiCiAjaW5jbHVkZSAiaW5jb3JlLmgiCi0jaW5jbHVkZSAib3BzX2ZzdHlwZS5oIgorI2luY2x1ZGUgInN1cGVyLmgiCiAjaW5jbHVkZSAic3lzLmgiCiAjaW5jbHVkZSAidXRpbC5oIgogI2luY2x1ZGUgImdsb2NrLmgiCkBAIC0zMCw2ICszMCw3IEBACiAKIAlpbm9kZV9pbml0X29uY2UoJmlwLT5pX2lub2RlKTsKIAlpbml0X3J3c2VtKCZpcC0+aV9yd19tdXRleCk7CisJSU5JVF9MSVNUX0hFQUQoJmlwLT5pX3RydW5jX2xpc3QpOwogCWlwLT5pX2FsbG9jID0gTlVMTDsKIH0KIApAQCAtNDIsNyArNDMsNyBAQAogCUlOSVRfTElTVF9IRUFEKCZnbC0+Z2xfaG9sZGVycyk7CiAJZ2wtPmdsX2x2YiA9IE5VTEw7CiAJYXRvbWljX3NldCgmZ2wtPmdsX2x2Yl9jb3VudCwgMCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmdsLT5nbF9yZWNsYWltKTsKKwlJTklUX0xJU1RfSEVBRCgmZ2wtPmdsX2xydSk7CiAJSU5JVF9MSVNUX0hFQUQoJmdsLT5nbF9haWxfbGlzdCk7CiAJYXRvbWljX3NldCgmZ2wtPmdsX2FpbF9jb3VudCwgMCk7CiB9CkBAIC05Myw2ICs5NCwxMiBAQAogCWlmICghZ2ZzMl9yZ3JwZF9jYWNoZXApCiAJCWdvdG8gZmFpbDsKIAorCWdmczJfcXVvdGFkX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJnZnMyX3F1b3RhZCIsCisJCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGdmczJfcXVvdGFfZGF0YSksCisJCQkJCSAgICAgICAwLCAwLCBOVUxMKTsKKwlpZiAoIWdmczJfcXVvdGFkX2NhY2hlcCkKKwkJZ290byBmYWlsOworCiAJZXJyb3IgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZnZnMyX2ZzX3R5cGUpOwogCWlmIChlcnJvcikKIAkJZ290byBmYWlsOwpAQCAtMTEyLDYgKzExOSw5IEBACiBmYWlsOgogCWdmczJfZ2xvY2tfZXhpdCgpOwogCisJaWYgKGdmczJfcXVvdGFkX2NhY2hlcCkKKwkJa21lbV9jYWNoZV9kZXN0cm95KGdmczJfcXVvdGFkX2NhY2hlcCk7CisKIAlpZiAoZ2ZzMl9yZ3JwZF9jYWNoZXApCiAJCWttZW1fY2FjaGVfZGVzdHJveShnZnMyX3JncnBkX2NhY2hlcCk7CiAKQEAgLTE0MCw2ICsxNTAsNyBAQAogCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmZ2ZzMl9mc190eXBlKTsKIAl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmdmczJtZXRhX2ZzX3R5cGUpOwogCisJa21lbV9jYWNoZV9kZXN0cm95KGdmczJfcXVvdGFkX2NhY2hlcCk7CiAJa21lbV9jYWNoZV9kZXN0cm95KGdmczJfcmdycGRfY2FjaGVwKTsKIAlrbWVtX2NhY2hlX2Rlc3Ryb3koZ2ZzMl9idWZkYXRhX2NhY2hlcCk7CiAJa21lbV9jYWNoZV9kZXN0cm95KGdmczJfaW5vZGVfY2FjaGVwKTsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvbW91bnQuYyBiL2ZzL2dmczIvbW91bnQuYwppbmRleCBmOTZlYjkwLi4zY2IwYTQ0IDEwMDY0NAotLS0gYS9mcy9nZnMyL21vdW50LmMKKysrIGIvZnMvZ2ZzMi9tb3VudC5jCkBAIC0zMiw3ICszMiw2IEBACiAJT3B0X2RlYnVnLAogCU9wdF9ub2RlYnVnLAogCU9wdF91cGdyYWRlLAotCU9wdF9udW1fZ2xvY2tkLAogCU9wdF9hY2wsCiAJT3B0X25vYWNsLAogCU9wdF9xdW90YV9vZmYsCkBAIC01Nyw3ICs1Niw2IEBACiAJe09wdF9kZWJ1ZywgImRlYnVnIn0sCiAJe09wdF9ub2RlYnVnLCAibm9kZWJ1ZyJ9LAogCXtPcHRfdXBncmFkZSwgInVwZ3JhZGUifSwKLQl7T3B0X251bV9nbG9ja2QsICJudW1fZ2xvY2tkPSVkIn0sCiAJe09wdF9hY2wsICJhY2wifSwKIAl7T3B0X25vYWNsLCAibm9hY2wifSwKIAl7T3B0X3F1b3RhX29mZiwgInF1b3RhPW9mZiJ9LApAQCAtODcsMTYgKzg1LDcgQEAKIAlpbnQgZXJyb3IgPSAwOwogCiAJaWYgKCFyZW1vdW50KSB7Ci0JCS8qICBJZiBzb21lb25lIHByZWxvYWRlZCBvcHRpb25zLCB1c2UgdGhvc2UgaW5zdGVhZCAgKi8KLQkJc3Bpbl9sb2NrKCZnZnMyX3N5c19tYXJnc19sb2NrKTsKLQkJaWYgKGdmczJfc3lzX21hcmdzKSB7Ci0JCQlkYXRhID0gZ2ZzMl9zeXNfbWFyZ3M7Ci0JCQlnZnMyX3N5c19tYXJncyA9IE5VTEw7Ci0JCX0KLQkJc3Bpbl91bmxvY2soJmdmczJfc3lzX21hcmdzX2xvY2spOwotCiAJCS8qICBTZXQgc29tZSBkZWZhdWx0cyAgKi8KLQkJYXJncy0+YXJfbnVtX2dsb2NrZCA9IEdGUzJfR0xPQ0tEX0RFRkFVTFQ7CiAJCWFyZ3MtPmFyX3F1b3RhID0gR0ZTMl9RVU9UQV9ERUZBVUxUOwogCQlhcmdzLT5hcl9kYXRhID0gR0ZTMl9EQVRBX0RFRkFVTFQ7CiAJfQpAQCAtMTA1LDcgKzk0LDcgQEAKIAkgICBwcm9jZXNzIHRoZW0gKi8KIAogCWZvciAob3B0aW9ucyA9IGRhdGE7IChvID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpKTsgKSB7Ci0JCWludCB0b2tlbiwgb3B0aW9uOworCQlpbnQgdG9rZW47CiAJCXN1YnN0cmluZ190IHRtcFtNQVhfT1BUX0FSR1NdOwogCiAJCWlmICghKm8pCkBAIC0xOTYsMjIgKzE4NSw2IEBACiAJCQkJZ290byBjYW50X3JlbW91bnQ7CiAJCQlhcmdzLT5hcl91cGdyYWRlID0gMTsKIAkJCWJyZWFrOwotCQljYXNlIE9wdF9udW1fZ2xvY2tkOgotCQkJaWYgKChlcnJvciA9IG1hdGNoX2ludCgmdG1wWzBdLCAmb3B0aW9uKSkpIHsKLQkJCQlmc19pbmZvKHNkcCwgInByb2JsZW0gZ2V0dGluZyBudW1fZ2xvY2tkXG4iKTsKLQkJCQlnb3RvIG91dF9lcnJvcjsKLQkJCX0KLQotCQkJaWYgKHJlbW91bnQgJiYgb3B0aW9uICE9IGFyZ3MtPmFyX251bV9nbG9ja2QpCi0JCQkJZ290byBjYW50X3JlbW91bnQ7Ci0JCQlpZiAoIW9wdGlvbiB8fCBvcHRpb24gPiBHRlMyX0dMT0NLRF9NQVgpIHsKLQkJCQlmc19pbmZvKHNkcCwgIjAgPCBudW1fZ2xvY2tkIDw9ICV1ICAobm90ICV1KVxuIiwKLQkJCQkgICAgICAgIEdGUzJfR0xPQ0tEX01BWCwgb3B0aW9uKTsKLQkJCQllcnJvciA9IC1FSU5WQUw7Ci0JCQkJZ290byBvdXRfZXJyb3I7Ci0JCQl9Ci0JCQlhcmdzLT5hcl9udW1fZ2xvY2tkID0gb3B0aW9uOwotCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2FjbDoKIAkJCWFyZ3MtPmFyX3Bvc2l4X2FjbCA9IDE7CiAJCQlzZHAtPnNkX3Zmcy0+c19mbGFncyB8PSBNU19QT1NJWEFDTDsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvb3BzX2FkZHJlc3MuYyBiL2ZzL2dmczIvb3BzX2FkZHJlc3MuYwppbmRleCAxNWY3MTBmLi40ZGRhYjY3IDEwMDY0NAotLS0gYS9mcy9nZnMyL29wc19hZGRyZXNzLmMKKysrIGIvZnMvZ2ZzMi9vcHNfYWRkcmVzcy5jCkBAIC0yMTAsMjUgKzIxMCwyMyBAQAogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OwogCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gR0ZTMl9TQihpbm9kZSk7Ci0JaW50IGVycm9yOworCWludCByZXQ7CiAJaW50IGRvbmVfdHJhbnMgPSAwOwogCi0JZXJyb3IgPSBnZnMyX3dyaXRlcGFnZV9jb21tb24ocGFnZSwgd2JjKTsKLQlpZiAoZXJyb3IgPD0gMCkKLQkJcmV0dXJuIGVycm9yOwotCiAJaWYgKFBhZ2VDaGVja2VkKHBhZ2UpKSB7CiAJCWlmICh3YmMtPnN5bmNfbW9kZSAhPSBXQl9TWU5DX0FMTCkKIAkJCWdvdG8gb3V0X2lnbm9yZTsKLQkJZXJyb3IgPSBnZnMyX3RyYW5zX2JlZ2luKHNkcCwgUkVTX0RJTk9ERSArIDEsIDApOwotCQlpZiAoZXJyb3IpCisJCXJldCA9IGdmczJfdHJhbnNfYmVnaW4oc2RwLCBSRVNfRElOT0RFICsgMSwgMCk7CisJCWlmIChyZXQpCiAJCQlnb3RvIG91dF9pZ25vcmU7CiAJCWRvbmVfdHJhbnMgPSAxOwogCX0KLQllcnJvciA9IF9fZ2ZzMl9qZGF0YV93cml0ZXBhZ2UocGFnZSwgd2JjKTsKKwlyZXQgPSBnZnMyX3dyaXRlcGFnZV9jb21tb24ocGFnZSwgd2JjKTsKKwlpZiAocmV0ID4gMCkKKwkJcmV0ID0gX19nZnMyX2pkYXRhX3dyaXRlcGFnZShwYWdlLCB3YmMpOwogCWlmIChkb25lX3RyYW5zKQogCQlnZnMyX3RyYW5zX2VuZChzZHApOwotCXJldHVybiBlcnJvcjsKKwlyZXR1cm4gcmV0OwogCiBvdXRfaWdub3JlOgogCXJlZGlydHlfcGFnZV9mb3Jfd3JpdGVwYWdlKHdiYywgcGFnZSk7CkBAIC00NTMsOCArNDUxLDggQEAKIAogCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOwogCW1lbWNweShrYWRkciwgZGliaC0+Yl9kYXRhICsgc2l6ZW9mKHN0cnVjdCBnZnMyX2Rpbm9kZSksCi0JICAgICAgIGlwLT5pX2RpLmRpX3NpemUpOwotCW1lbXNldChrYWRkciArIGlwLT5pX2RpLmRpX3NpemUsIDAsIFBBR0VfQ0FDSEVfU0laRSAtIGlwLT5pX2RpLmRpX3NpemUpOworCSAgICAgICBpcC0+aV9kaXNrc2l6ZSk7CisJbWVtc2V0KGthZGRyICsgaXAtPmlfZGlza3NpemUsIDAsIFBBR0VfQ0FDSEVfU0laRSAtIGlwLT5pX2Rpc2tzaXplKTsKIAlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CiAJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CiAJYnJlbHNlKGRpYmgpOwpAQCAtNjI3LDcgKzYyNSw3IEBACiB7CiAJc3RydWN0IGdmczJfaW5vZGUgKmlwID0gR0ZTMl9JKG1hcHBpbmctPmhvc3QpOwogCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gR0ZTMl9TQihtYXBwaW5nLT5ob3N0KTsKLQl1bnNpZ25lZCBpbnQgZGF0YV9ibG9ja3MsIGluZF9ibG9ja3MsIHJibG9ja3M7CisJdW5zaWduZWQgaW50IGRhdGFfYmxvY2tzID0gMCwgaW5kX2Jsb2NrcyA9IDAsIHJibG9ja3M7CiAJaW50IGFsbG9jX3JlcXVpcmVkOwogCWludCBlcnJvciA9IDA7CiAJc3RydWN0IGdmczJfYWxsb2MgKmFsOwpAQCAtNjQxLDExICs2MzksMTMgQEAKIAlpZiAodW5saWtlbHkoZXJyb3IpKQogCQlnb3RvIG91dF91bmluaXQ7CiAKLQlnZnMyX3dyaXRlX2NhbGNfcmVzZXJ2KGlwLCBsZW4sICZkYXRhX2Jsb2NrcywgJmluZF9ibG9ja3MpOwogCWVycm9yID0gZ2ZzMl93cml0ZV9hbGxvY19yZXF1aXJlZChpcCwgcG9zLCBsZW4sICZhbGxvY19yZXF1aXJlZCk7CiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF91bmxvY2s7CiAKKwlpZiAoYWxsb2NfcmVxdWlyZWQgfHwgZ2ZzMl9pc19qZGF0YShpcCkpCisJCWdmczJfd3JpdGVfY2FsY19yZXNlcnYoaXAsIGxlbiwgJmRhdGFfYmxvY2tzLCAmaW5kX2Jsb2Nrcyk7CisKIAlpZiAoYWxsb2NfcmVxdWlyZWQpIHsKIAkJYWwgPSBnZnMyX2FsbG9jX2dldChpcCk7CiAJCWlmICghYWwpIHsKQEAgLTY3NSw2ICs2NzUsNyBAQAogCQlnb3RvIG91dF90cmFuc19mYWlsOwogCiAJZXJyb3IgPSAtRU5PTUVNOworCWZsYWdzIHw9IEFPUF9GTEFHX05PRlM7CiAJcGFnZSA9IGdyYWJfY2FjaGVfcGFnZV93cml0ZV9iZWdpbihtYXBwaW5nLCBpbmRleCwgZmxhZ3MpOwogCSpwYWdlcCA9IHBhZ2U7CiAJaWYgKHVubGlrZWx5KCFwYWdlKSkKQEAgLTc4Miw3ICs3ODMsNyBAQAogCiAJaWYgKGlub2RlLT5pX3NpemUgPCB0bykgewogCQlpX3NpemVfd3JpdGUoaW5vZGUsIHRvKTsKLQkJaXAtPmlfZGkuZGlfc2l6ZSA9IGlub2RlLT5pX3NpemU7CisJCWlwLT5pX2Rpc2tzaXplID0gaW5vZGUtPmlfc2l6ZTsKIAkJZGktPmRpX3NpemUgPSBjcHVfdG9fYmU2NChpbm9kZS0+aV9zaXplKTsKIAkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAJfQpAQCAtODQ3LDkgKzg0OCw5IEBACiAKIAlyZXQgPSBnZW5lcmljX3dyaXRlX2VuZChmaWxlLCBtYXBwaW5nLCBwb3MsIGxlbiwgY29waWVkLCBwYWdlLCBmc2RhdGEpOwogCi0JaWYgKGxpa2VseShyZXQgPj0gMCkgJiYgKGlub2RlLT5pX3NpemUgPiBpcC0+aV9kaS5kaV9zaXplKSkgeworCWlmIChsaWtlbHkocmV0ID49IDApICYmIChpbm9kZS0+aV9zaXplID4gaXAtPmlfZGlza3NpemUpKSB7CiAJCWRpID0gKHN0cnVjdCBnZnMyX2Rpbm9kZSAqKWRpYmgtPmJfZGF0YTsKLQkJaXAtPmlfZGkuZGlfc2l6ZSA9IGlub2RlLT5pX3NpemU7CisJCWlwLT5pX2Rpc2tzaXplID0gaW5vZGUtPmlfc2l6ZTsKIAkJZGktPmRpX3NpemUgPSBjcHVfdG9fYmU2NChpbm9kZS0+aV9zaXplKTsKIAkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9vcHNfZGVudHJ5LmMgYi9mcy9nZnMyL29wc19kZW50cnkuYwppbmRleCA0YTVlNjc2Li5jMmFkMzYzIDEwMDY0NAotLS0gYS9mcy9nZnMyL29wc19kZW50cnkuYworKysgYi9mcy9nZnMyL29wc19kZW50cnkuYwpAQCAtMTksNyArMTksNyBAQAogI2luY2x1ZGUgImluY29yZS5oIgogI2luY2x1ZGUgImRpci5oIgogI2luY2x1ZGUgImdsb2NrLmgiCi0jaW5jbHVkZSAib3BzX2RlbnRyeS5oIgorI2luY2x1ZGUgInN1cGVyLmgiCiAjaW5jbHVkZSAidXRpbC5oIgogI2luY2x1ZGUgImlub2RlLmgiCiAKZGlmZiAtLWdpdCBhL2ZzL2dmczIvb3BzX2RlbnRyeS5oIGIvZnMvZ2ZzMi9vcHNfZGVudHJ5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYWEzZGIuLjAwMDAwMDAKLS0tIGEvZnMvZ2ZzMi9vcHNfZGVudHJ5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuICAxOTk3LTIwMDMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IFJlZCBIYXQsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCi0gKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4KLSAqLwotCi0jaWZuZGVmIF9fT1BTX0RFTlRSWV9ET1RfSF9fCi0jZGVmaW5lIF9fT1BTX0RFTlRSWV9ET1RfSF9fCi0KLSNpbmNsdWRlIDxsaW51eC9kY2FjaGUuaD4KLQotZXh0ZXJuIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBnZnMyX2RvcHM7Ci0KLSNlbmRpZiAvKiBfX09QU19ERU5UUllfRE9UX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9vcHNfZXhwb3J0LmMgYi9mcy9nZnMyL29wc19leHBvcnQuYwppbmRleCBiYmI4YzM2Li43ZmRlYjE0IDEwMDY0NAotLS0gYS9mcy9nZnMyL29wc19leHBvcnQuYworKysgYi9mcy9nZnMyL29wc19leHBvcnQuYwpAQCAtMjIsOCArMjIsNyBAQAogI2luY2x1ZGUgImdsb2NrLmgiCiAjaW5jbHVkZSAiZ2xvcHMuaCIKICNpbmNsdWRlICJpbm9kZS5oIgotI2luY2x1ZGUgIm9wc19kZW50cnkuaCIKLSNpbmNsdWRlICJvcHNfZnN0eXBlLmgiCisjaW5jbHVkZSAic3VwZXIuaCIKICNpbmNsdWRlICJyZ3JwLmgiCiAjaW5jbHVkZSAidXRpbC5oIgogCkBAIC0yMTQsNyArMjEzLDcgQEAKIAl9CiAKIAllcnJvciA9IC1FSU87Ci0JaWYgKEdGUzJfSShpbm9kZSktPmlfZGkuZGlfZmxhZ3MgJiBHRlMyX0RJRl9TWVNURU0pIHsKKwlpZiAoR0ZTMl9JKGlub2RlKS0+aV9kaXNrZmxhZ3MgJiBHRlMyX0RJRl9TWVNURU0pIHsKIAkJaXB1dChpbm9kZSk7CiAJCWdvdG8gZmFpbDsKIAl9CmRpZmYgLS1naXQgYS9mcy9nZnMyL29wc19maWxlLmMgYi9mcy9nZnMyL29wc19maWxlLmMKaW5kZXggM2E3NDdmOC4uOTNmZTQxYiAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9vcHNfZmlsZS5jCisrKyBiL2ZzL2dmczIvb3BzX2ZpbGUuYwpAQCAtMzksNyArMzksNiBAQAogI2luY2x1ZGUgInV0aWwuaCIKICNpbmNsdWRlICJlYW9wcy5oIgogI2luY2x1ZGUgIm9wc19hZGRyZXNzLmgiCi0jaW5jbHVkZSAib3BzX2lub2RlLmgiCiAKIC8qKgogICogZ2ZzMl9sbHNlZWsgLSBzZWVrIHRvIGEgbG9jYXRpb24gaW4gYSBmaWxlCkBAIC0xNTgsOCArMTU3LDggQEAKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIAotCWZzZmxhZ3MgPSBmc2ZsYWdzX2N2dChnZnMyX3RvX2ZzZmxhZ3MsIGlwLT5pX2RpLmRpX2ZsYWdzKTsKLQlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYgaXAtPmlfZGkuZGlfZmxhZ3MgJiBHRlMyX0RJRl9KREFUQSkKKwlmc2ZsYWdzID0gZnNmbGFnc19jdnQoZ2ZzMl90b19mc2ZsYWdzLCBpcC0+aV9kaXNrZmxhZ3MpOworCWlmICghU19JU0RJUihpbm9kZS0+aV9tb2RlKSAmJiBpcC0+aV9kaXNrZmxhZ3MgJiBHRlMyX0RJRl9KREFUQSkKIAkJZnNmbGFncyB8PSBGU19KT1VSTkFMX0RBVEFfRkw7CiAJaWYgKHB1dF91c2VyKGZzZmxhZ3MsIHB0cikpCiAJCWVycm9yID0gLUVGQVVMVDsKQEAgLTE3MiwxNyArMTcxLDE2IEBACiB2b2lkIGdmczJfc2V0X2lub2RlX2ZsYWdzKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJc3RydWN0IGdmczJfaW5vZGUgKmlwID0gR0ZTMl9JKGlub2RlKTsKLQlzdHJ1Y3QgZ2ZzMl9kaW5vZGVfaG9zdCAqZGkgPSAmaXAtPmlfZGk7CiAJdW5zaWduZWQgaW50IGZsYWdzID0gaW5vZGUtPmlfZmxhZ3M7CiAKIAlmbGFncyAmPSB+KFNfU1lOQ3xTX0FQUEVORHxTX0lNTVVUQUJMRXxTX05PQVRJTUV8U19ESVJTWU5DKTsKLQlpZiAoZGktPmRpX2ZsYWdzICYgR0ZTMl9ESUZfSU1NVVRBQkxFKQorCWlmIChpcC0+aV9kaXNrZmxhZ3MgJiBHRlMyX0RJRl9JTU1VVEFCTEUpCiAJCWZsYWdzIHw9IFNfSU1NVVRBQkxFOwotCWlmIChkaS0+ZGlfZmxhZ3MgJiBHRlMyX0RJRl9BUFBFTkRPTkxZKQorCWlmIChpcC0+aV9kaXNrZmxhZ3MgJiBHRlMyX0RJRl9BUFBFTkRPTkxZKQogCQlmbGFncyB8PSBTX0FQUEVORDsKLQlpZiAoZGktPmRpX2ZsYWdzICYgR0ZTMl9ESUZfTk9BVElNRSkKKwlpZiAoaXAtPmlfZGlza2ZsYWdzICYgR0ZTMl9ESUZfTk9BVElNRSkKIAkJZmxhZ3MgfD0gU19OT0FUSU1FOwotCWlmIChkaS0+ZGlfZmxhZ3MgJiBHRlMyX0RJRl9TWU5DKQorCWlmIChpcC0+aV9kaXNrZmxhZ3MgJiBHRlMyX0RJRl9TWU5DKQogCQlmbGFncyB8PSBTX1NZTkM7CiAJaW5vZGUtPmlfZmxhZ3MgPSBmbGFnczsKIH0KQEAgLTIyMSw3ICsyMTksNyBAQAogCWlmIChlcnJvcikKIAkJZ290byBvdXRfZHJvcF93cml0ZTsKIAotCWZsYWdzID0gaXAtPmlfZGkuZGlfZmxhZ3M7CisJZmxhZ3MgPSBpcC0+aV9kaXNrZmxhZ3M7CiAJbmV3X2ZsYWdzID0gKGZsYWdzICYgfm1hc2spIHwgKHJlcWZsYWdzICYgbWFzayk7CiAJaWYgKChuZXdfZmxhZ3MgXiBmbGFncykgPT0gMCkKIAkJZ290byBvdXQ7CkBAIC0yNjAsNyArMjU4LDcgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X3RyYW5zX2VuZDsKIAlnZnMyX3RyYW5zX2FkZF9iaChpcC0+aV9nbCwgYmgsIDEpOwotCWlwLT5pX2RpLmRpX2ZsYWdzID0gbmV3X2ZsYWdzOworCWlwLT5pX2Rpc2tmbGFncyA9IG5ld19mbGFnczsKIAlnZnMyX2Rpbm9kZV9vdXQoaXAsIGJoLT5iX2RhdGEpOwogCWJyZWxzZShiaCk7CiAJZ2ZzMl9zZXRfaW5vZGVfZmxhZ3MoaW5vZGUpOwpAQCAtMzQ0LDcgKzM0Miw3IEBACiAJc3RydWN0IGdmczJfaW5vZGUgKmlwID0gR0ZTMl9JKGlub2RlKTsKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0IoaW5vZGUpOwogCXVuc2lnbmVkIGxvbmcgbGFzdF9pbmRleDsKLQl1NjQgcG9zID0gcGFnZS0+aW5kZXggPDwgKFBBR0VfQ0FDSEVfU0laRSAtIGlub2RlLT5pX2Jsa2JpdHMpOworCXU2NCBwb3MgPSBwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUOwogCXVuc2lnbmVkIGludCBkYXRhX2Jsb2NrcywgaW5kX2Jsb2NrcywgcmJsb2NrczsKIAlpbnQgYWxsb2NfcmVxdWlyZWQgPSAwOwogCXN0cnVjdCBnZnMyX2hvbGRlciBnaDsKQEAgLTM1Nyw3ICszNTUsNiBAQAogCQlnb3RvIG91dDsKIAogCXNldF9iaXQoR0lGX1NXX1BBR0VELCAmaXAtPmlfZmxhZ3MpOwotCWdmczJfd3JpdGVfY2FsY19yZXNlcnYoaXAsIFBBR0VfQ0FDSEVfU0laRSwgJmRhdGFfYmxvY2tzLCAmaW5kX2Jsb2Nrcyk7CiAJcmV0ID0gZ2ZzMl93cml0ZV9hbGxvY19yZXF1aXJlZChpcCwgcG9zLCBQQUdFX0NBQ0hFX1NJWkUsICZhbGxvY19yZXF1aXJlZCk7CiAJaWYgKHJldCB8fCAhYWxsb2NfcmVxdWlyZWQpCiAJCWdvdG8gb3V0X3VubG9jazsKQEAgLTM2OSw2ICszNjYsNyBAQAogCXJldCA9IGdmczJfcXVvdGFfbG9ja19jaGVjayhpcCk7CiAJaWYgKHJldCkKIAkJZ290byBvdXRfYWxsb2NfcHV0OworCWdmczJfd3JpdGVfY2FsY19yZXNlcnYoaXAsIFBBR0VfQ0FDSEVfU0laRSwgJmRhdGFfYmxvY2tzLCAmaW5kX2Jsb2Nrcyk7CiAJYWwtPmFsX3JlcXVlc3RlZCA9IGRhdGFfYmxvY2tzICsgaW5kX2Jsb2NrczsKIAlyZXQgPSBnZnMyX2lucGxhY2VfcmVzZXJ2ZShpcCk7CiAJaWYgKHJldCkKQEAgLTQ3OSw3ICs0NzcsNyBAQAogCQkJZ290byBmYWlsOwogCiAJCWlmICghKGZpbGUtPmZfZmxhZ3MgJiBPX0xBUkdFRklMRSkgJiYKLQkJICAgIGlwLT5pX2RpLmRpX3NpemUgPiBNQVhfTk9OX0xGUykgeworCQkgICAgaXAtPmlfZGlza3NpemUgPiBNQVhfTk9OX0xGUykgewogCQkJZXJyb3IgPSAtRU9WRVJGTE9XOwogCQkJZ290byBmYWlsX2d1bmxvY2s7CiAJCX0KZGlmZiAtLWdpdCBhL2ZzL2dmczIvb3BzX2ZzdHlwZS5jIGIvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKaW5kZXggYjExN2ZjZi4uZjkxZWViZCAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKKysrIGIvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKQEAgLTIyLDIwICsyMiwxOCBAQAogI2luY2x1ZGUgImdmczIuaCIKICNpbmNsdWRlICJpbmNvcmUuaCIKICNpbmNsdWRlICJibWFwLmgiCi0jaW5jbHVkZSAiZGFlbW9uLmgiCiAjaW5jbHVkZSAiZ2xvY2suaCIKICNpbmNsdWRlICJnbG9wcy5oIgogI2luY2x1ZGUgImlub2RlLmgiCiAjaW5jbHVkZSAibW91bnQuaCIKLSNpbmNsdWRlICJvcHNfZnN0eXBlLmgiCi0jaW5jbHVkZSAib3BzX2RlbnRyeS5oIgotI2luY2x1ZGUgIm9wc19zdXBlci5oIgogI2luY2x1ZGUgInJlY292ZXJ5LmgiCiAjaW5jbHVkZSAicmdycC5oIgogI2luY2x1ZGUgInN1cGVyLmgiCiAjaW5jbHVkZSAic3lzLmgiCiAjaW5jbHVkZSAidXRpbC5oIgogI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgInF1b3RhLmgiCisjaW5jbHVkZSAiZGlyLmgiCiAKICNkZWZpbmUgRE8gMAogI2RlZmluZSBVTkRPIDEKQEAgLTU4LDEyICs1NiwxMCBAQAogewogCXNwaW5fbG9ja19pbml0KCZndC0+Z3Rfc3Bpbik7CiAKLQlndC0+Z3RfZGVtb3RlX3NlY3MgPSAzMDA7CiAJZ3QtPmd0X2luY29yZV9sb2dfYmxvY2tzID0gMTAyNDsKIAlndC0+Z3RfbG9nX2ZsdXNoX3NlY3MgPSA2MDsKIAlndC0+Z3RfcmVjb3ZlcmRfc2VjcyA9IDYwOwogCWd0LT5ndF9sb2dkX3NlY3MgPSAxOwotCWd0LT5ndF9xdW90YWRfc2VjcyA9IDU7CiAJZ3QtPmd0X3F1b3RhX3NpbXVsX3N5bmMgPSA2NDsKIAlndC0+Z3RfcXVvdGFfd2Fybl9wZXJpb2QgPSAxMDsKIAlndC0+Z3RfcXVvdGFfc2NhbGVfbnVtID0gMTsKQEAgLTkxLDEwICs4Nyw2IEBACiAKIAlnZnMyX3R1bmVfaW5pdCgmc2RwLT5zZF90dW5lKTsKIAotCUlOSVRfTElTVF9IRUFEKCZzZHAtPnNkX3JlY2xhaW1fbGlzdCk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnNkcC0+c2RfcmVjbGFpbV9sb2NrKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzZHAtPnNkX3JlY2xhaW1fd3EpOwotCiAJbXV0ZXhfaW5pdCgmc2RwLT5zZF9pbnVtX211dGV4KTsKIAlzcGluX2xvY2tfaW5pdCgmc2RwLT5zZF9zdGF0ZnNfc3Bpbik7CiAKQEAgLTExMCw2ICsxMDIsOSBAQAogCUlOSVRfTElTVF9IRUFEKCZzZHAtPnNkX3F1b3RhX2xpc3QpOwogCXNwaW5fbG9ja19pbml0KCZzZHAtPnNkX3F1b3RhX3NwaW4pOwogCW11dGV4X2luaXQoJnNkcC0+c2RfcXVvdGFfbXV0ZXgpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNkcC0+c2RfcXVvdGFfd2FpdCk7CisJSU5JVF9MSVNUX0hFQUQoJnNkcC0+c2RfdHJ1bmNfbGlzdCk7CisJc3Bpbl9sb2NrX2luaXQoJnNkcC0+c2RfdHJ1bmNfbG9jayk7CiAKIAlzcGluX2xvY2tfaW5pdCgmc2RwLT5zZF9sb2dfbG9jayk7CiAKQEAgLTQ0MywyNCArNDM4LDExIEBACiBzdGF0aWMgaW50IGluaXRfbG9ja2luZyhzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgc3RydWN0IGdmczJfaG9sZGVyICptb3VudF9naCwKIAkJCWludCB1bmRvKQogewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKIAlpbnQgZXJyb3IgPSAwOwogCiAJaWYgKHVuZG8pCiAJCWdvdG8gZmFpbF90cmFuczsKIAotCWZvciAoc2RwLT5zZF9nbG9ja2RfbnVtID0gMDsKLQkgICAgIHNkcC0+c2RfZ2xvY2tkX251bSA8IHNkcC0+c2RfYXJncy5hcl9udW1fZ2xvY2tkOwotCSAgICAgc2RwLT5zZF9nbG9ja2RfbnVtKyspIHsKLQkJcCA9IGt0aHJlYWRfcnVuKGdmczJfZ2xvY2tkLCBzZHAsICJnZnMyX2dsb2NrZCIpOwotCQllcnJvciA9IElTX0VSUihwKTsKLQkJaWYgKGVycm9yKSB7Ci0JCQlmc19lcnIoc2RwLCAiY2FuJ3Qgc3RhcnQgZ2xvY2tkIHRocmVhZDogJWRcbiIsIGVycm9yKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQlzZHAtPnNkX2dsb2NrZF9wcm9jZXNzW3NkcC0+c2RfZ2xvY2tkX251bV0gPSBwOwotCX0KLQogCWVycm9yID0gZ2ZzMl9nbG9ja19ucV9udW0oc2RwLAogCQkJCSAgR0ZTMl9NT1VOVF9MT0NLLCAmZ2ZzMl9ub25kaXNrX2dsb3BzLAogCQkJCSAgTE1fU1RfRVhDTFVTSVZFLCBMTV9GTEFHX05PRVhQIHwgR0xfTk9DQUNIRSwKQEAgLTQ5Myw3ICs0NzUsNiBAQAogCQlmc19lcnIoc2RwLCAiY2FuJ3QgY3JlYXRlIHRyYW5zYWN0aW9uIGdsb2NrOiAlZFxuIiwgZXJyb3IpOwogCQlnb3RvIGZhaWxfcmVuYW1lOwogCX0KLQlzZXRfYml0KEdMRl9TVElDS1ksICZzZHAtPnNkX3RyYW5zX2dsLT5nbF9mbGFncyk7CiAKIAlyZXR1cm4gMDsKIApAQCAtNTA2LDkgKzQ4Nyw2IEBACiBmYWlsX21vdW50OgogCWdmczJfZ2xvY2tfZHFfdW5pbml0KG1vdW50X2doKTsKIGZhaWw6Ci0Jd2hpbGUgKHNkcC0+c2RfZ2xvY2tkX251bS0tKQotCQlrdGhyZWFkX3N0b3Aoc2RwLT5zZF9nbG9ja2RfcHJvY2Vzc1tzZHAtPnNkX2dsb2NrZF9udW1dKTsKLQogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtNjIwLDcgKzU5OCw3IEBACiAKIAlwcmV2X2RiID0gMDsKIAotCWZvciAobGIgPSAwOyBsYiA8IGlwLT5pX2RpLmRpX3NpemUgPj4gc2RwLT5zZF9zYi5zYl9ic2l6ZV9zaGlmdDsgbGIrKykgeworCWZvciAobGIgPSAwOyBsYiA8IGlwLT5pX2Rpc2tzaXplID4+IHNkcC0+c2Rfc2Iuc2JfYnNpemVfc2hpZnQ7IGxiKyspIHsKIAkJYmguYl9zdGF0ZSA9IDA7CiAJCWJoLmJfYmxvY2tuciA9IDA7CiAJCWJoLmJfc2l6ZSA9IDEgPDwgaXAtPmlfaW5vZGUuaV9ibGtiaXRzOwpAQCAtNjYxLDYgKzYzOSw3MiBAQAogCQkJCQlzZHAtPnNkX2xvY2tzdHJ1Y3QubHNfbG9ja3NwYWNlKTsKIH0KIAorLyoqCisgKiBnZnMyX2ppbmRleF9ob2xkIC0gR3JhYiBhIGxvY2sgb24gdGhlIGppbmRleAorICogQHNkcDogVGhlIEdGUzIgc3VwZXJibG9jaworICogQGppX2doOiB0aGUgaG9sZGVyIGZvciB0aGUgamluZGV4IGdsb2NrCisgKgorICogUmV0dXJuczogZXJybm8KKyAqLworCitzdGF0aWMgaW50IGdmczJfamluZGV4X2hvbGQoc3RydWN0IGdmczJfc2JkICpzZHAsIHN0cnVjdCBnZnMyX2hvbGRlciAqamlfZ2gpCit7CisJc3RydWN0IGdmczJfaW5vZGUgKmRpcCA9IEdGUzJfSShzZHAtPnNkX2ppbmRleCk7CisJc3RydWN0IHFzdHIgbmFtZTsKKwljaGFyIGJ1ZlsyMF07CisJc3RydWN0IGdmczJfamRlc2MgKmpkOworCWludCBlcnJvcjsKKworCW5hbWUubmFtZSA9IGJ1ZjsKKworCW11dGV4X2xvY2soJnNkcC0+c2RfamluZGV4X211dGV4KTsKKworCWZvciAoOzspIHsKKwkJZXJyb3IgPSBnZnMyX2dsb2NrX25xX2luaXQoZGlwLT5pX2dsLCBMTV9TVF9TSEFSRUQsIDAsIGppX2doKTsKKwkJaWYgKGVycm9yKQorCQkJYnJlYWs7CisKKwkJbmFtZS5sZW4gPSBzcHJpbnRmKGJ1ZiwgImpvdXJuYWwldSIsIHNkcC0+c2Rfam91cm5hbHMpOworCQluYW1lLmhhc2ggPSBnZnMyX2Rpc2tfaGFzaChuYW1lLm5hbWUsIG5hbWUubGVuKTsKKworCQllcnJvciA9IGdmczJfZGlyX2NoZWNrKHNkcC0+c2RfamluZGV4LCAmbmFtZSwgTlVMTCk7CisJCWlmIChlcnJvciA9PSAtRU5PRU5UKSB7CisJCQllcnJvciA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCWdmczJfZ2xvY2tfZHFfdW5pbml0KGppX2doKTsKKworCQlpZiAoZXJyb3IpCisJCQlicmVhazsKKworCQllcnJvciA9IC1FTk9NRU07CisJCWpkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGdmczJfamRlc2MpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFqZCkKKwkJCWJyZWFrOworCisJCUlOSVRfTElTVF9IRUFEKCZqZC0+ZXh0ZW50X2xpc3QpOworCQlqZC0+amRfaW5vZGUgPSBnZnMyX2xvb2t1cGkoc2RwLT5zZF9qaW5kZXgsICZuYW1lLCAxKTsKKwkJaWYgKCFqZC0+amRfaW5vZGUgfHwgSVNfRVJSKGpkLT5qZF9pbm9kZSkpIHsKKwkJCWlmICghamQtPmpkX2lub2RlKQorCQkJCWVycm9yID0gLUVOT0VOVDsKKwkJCWVsc2UKKwkJCQllcnJvciA9IFBUUl9FUlIoamQtPmpkX2lub2RlKTsKKwkJCWtmcmVlKGpkKTsKKwkJCWJyZWFrOworCQl9CisKKwkJc3Bpbl9sb2NrKCZzZHAtPnNkX2ppbmRleF9zcGluKTsKKwkJamQtPmpkX2ppZCA9IHNkcC0+c2Rfam91cm5hbHMrKzsKKwkJbGlzdF9hZGRfdGFpbCgmamQtPmpkX2xpc3QsICZzZHAtPnNkX2ppbmRleF9saXN0KTsKKwkJc3Bpbl91bmxvY2soJnNkcC0+c2RfamluZGV4X3NwaW4pOworCX0KKworCW11dGV4X3VubG9jaygmc2RwLT5zZF9qaW5kZXhfbXV0ZXgpOworCisJcmV0dXJuIGVycm9yOworfQorCiBzdGF0aWMgaW50IGluaXRfam91cm5hbChzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgaW50IHVuZG8pCiB7CiAJc3RydWN0IGlub2RlICptYXN0ZXIgPSBzZHAtPnNkX21hc3Rlcl9kaXItPmRfaW5vZGU7CkBAIC02ODEsNyArNzI1LDYgQEAKIAkJcmV0dXJuIFBUUl9FUlIoc2RwLT5zZF9qaW5kZXgpOwogCX0KIAlpcCA9IEdGUzJfSShzZHAtPnNkX2ppbmRleCk7Ci0Jc2V0X2JpdChHTEZfU1RJQ0tZLCAmaXAtPmlfZ2wtPmdsX2ZsYWdzKTsKIAogCS8qIExvYWQgaW4gdGhlIGpvdXJuYWwgaW5kZXggc3BlY2lhbCBmaWxlICovCiAKQEAgLTgzMiw3ICs4NzUsNiBAQAogCQlnb3RvIGZhaWxfc3RhdGZzOwogCX0KIAlpcCA9IEdGUzJfSShzZHAtPnNkX3JpbmRleCk7Ci0Jc2V0X2JpdChHTEZfU1RJQ0tZLCAmaXAtPmlfZ2wtPmdsX2ZsYWdzKTsKIAlzZHAtPnNkX3JpbmRleF91cHRvZGF0ZSA9IDA7CiAKIAkvKiBSZWFkIGluIHRoZSBxdW90YSBpbm9kZSAqLwpAQCAtOTczLDkgKzEwMTUsNiBAQAogCX0KIAlzZHAtPnNkX2xvZ2RfcHJvY2VzcyA9IHA7CiAKLQlzZHAtPnNkX3N0YXRmc19zeW5jX3RpbWUgPSBqaWZmaWVzOwotCXNkcC0+c2RfcXVvdGFfc3luY190aW1lID0gamlmZmllczsKLQogCXAgPSBrdGhyZWFkX3J1bihnZnMyX3F1b3RhZCwgc2RwLCAiZ2ZzMl9xdW90YWQiKTsKIAllcnJvciA9IElTX0VSUihwKTsKIAlpZiAoZXJyb3IpIHsKQEAgLTEyMjQsMTcgKzEyNjMsMjEgQEAKIHN0YXRpYyB2b2lkIGdmczJfa2lsbF9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gc2ItPnNfZnNfaW5mbzsKLQlpZiAoc2RwKSB7Ci0JCWdmczJfbWV0YV9zeW5jZnMoc2RwKTsKLQkJZHB1dChzZHAtPnNkX3Jvb3RfZGlyKTsKLQkJZHB1dChzZHAtPnNkX21hc3Rlcl9kaXIpOwotCQlzZHAtPnNkX3Jvb3RfZGlyID0gTlVMTDsKLQkJc2RwLT5zZF9tYXN0ZXJfZGlyID0gTlVMTDsKKworCWlmIChzZHAgPT0gTlVMTCkgeworCQlraWxsX2Jsb2NrX3N1cGVyKHNiKTsKKwkJcmV0dXJuOwogCX0KKworCWdmczJfbWV0YV9zeW5jZnMoc2RwKTsKKwlkcHV0KHNkcC0+c2Rfcm9vdF9kaXIpOworCWRwdXQoc2RwLT5zZF9tYXN0ZXJfZGlyKTsKKwlzZHAtPnNkX3Jvb3RfZGlyID0gTlVMTDsKKwlzZHAtPnNkX21hc3Rlcl9kaXIgPSBOVUxMOwogCXNocmlua19kY2FjaGVfc2Ioc2IpOwogCWtpbGxfYmxvY2tfc3VwZXIoc2IpOwotCWlmIChzZHApCi0JCWdmczJfZGVsZXRlX2RlYnVnZnNfZmlsZShzZHApOworCWdmczJfZGVsZXRlX2RlYnVnZnNfZmlsZShzZHApOworCWtmcmVlKHNkcCk7CiB9CiAKIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGdmczJfZnNfdHlwZSA9IHsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvb3BzX2ZzdHlwZS5oIGIvZnMvZ2ZzMi9vcHNfZnN0eXBlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhODQ5MDUuLjAwMDAwMDAKLS0tIGEvZnMvZ2ZzMi9vcHNfZnN0eXBlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuICAxOTk3LTIwMDMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IFJlZCBIYXQsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCi0gKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4KLSAqLwotCi0jaWZuZGVmIF9fT1BTX0ZTVFlQRV9ET1RfSF9fCi0jZGVmaW5lIF9fT1BTX0ZTVFlQRV9ET1RfSF9fCi0KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotCi1leHRlcm4gc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgZ2ZzMl9mc190eXBlOwotZXh0ZXJuIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGdmczJtZXRhX2ZzX3R5cGU7Ci1leHRlcm4gY29uc3Qgc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIGdmczJfZXhwb3J0X29wczsKLQotI2VuZGlmIC8qIF9fT1BTX0ZTVFlQRV9ET1RfSF9fICovCmRpZmYgLS1naXQgYS9mcy9nZnMyL29wc19pbm9kZS5jIGIvZnMvZ2ZzMi9vcHNfaW5vZGUuYwppbmRleCBkMjMyOTkxLi40OTg3NzU0IDEwMDY0NAotLS0gYS9mcy9nZnMyL29wc19pbm9kZS5jCisrKyBiL2ZzL2dmczIvb3BzX2lub2RlLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9nZnMyX29uZGlzay5oPgogI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CiAjaW5jbHVkZSA8bGludXgvbG1faW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bGludXgvZmllbWFwLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAogI2luY2x1ZGUgImdmczIuaCIKQEAgLTMxLDEyICszMiwxMSBAQAogI2luY2x1ZGUgImdsb2NrLmgiCiAjaW5jbHVkZSAiaW5vZGUuaCIKICNpbmNsdWRlICJtZXRhX2lvLmgiCi0jaW5jbHVkZSAib3BzX2RlbnRyeS5oIgotI2luY2x1ZGUgIm9wc19pbm9kZS5oIgogI2luY2x1ZGUgInF1b3RhLmgiCiAjaW5jbHVkZSAicmdycC5oIgogI2luY2x1ZGUgInRyYW5zLmgiCiAjaW5jbHVkZSAidXRpbC5oIgorI2luY2x1ZGUgInN1cGVyLmgiCiAKIC8qKgogICogZ2ZzMl9jcmVhdGUgLSBDcmVhdGUgYSBmaWxlCkBAIC0xODUsNyArMTg1LDcgQEAKIAlpZiAoIWRpcC0+aV9pbm9kZS5pX25saW5rKQogCQlnb3RvIG91dF9ndW5sb2NrOwogCWVycm9yID0gLUVGQklHOwotCWlmIChkaXAtPmlfZGkuZGlfZW50cmllcyA9PSAodTMyKS0xKQorCWlmIChkaXAtPmlfZW50cmllcyA9PSAodTMyKS0xKQogCQlnb3RvIG91dF9ndW5sb2NrOwogCWVycm9yID0gLUVQRVJNOwogCWlmIChJU19JTU1VVEFCTEUoaW5vZGUpIHx8IElTX0FQUEVORChpbm9kZSkpCkBAIC0zNzEsNyArMzcxLDcgQEAKIAogCWlwID0gZ2hzWzFdLmdoX2dsLT5nbF9vYmplY3Q7CiAKLQlpcC0+aV9kaS5kaV9zaXplID0gc2l6ZTsKKwlpcC0+aV9kaXNrc2l6ZSA9IHNpemU7CiAKIAllcnJvciA9IGdmczJfbWV0YV9pbm9kZV9idWZmZXIoaXAsICZkaWJoKTsKIApAQCAtNDI1LDkgKzQyNSw5IEBACiAJaXAgPSBnaHNbMV0uZ2hfZ2wtPmdsX29iamVjdDsKIAogCWlwLT5pX2lub2RlLmlfbmxpbmsgPSAyOwotCWlwLT5pX2RpLmRpX3NpemUgPSBzZHAtPnNkX3NiLnNiX2JzaXplIC0gc2l6ZW9mKHN0cnVjdCBnZnMyX2Rpbm9kZSk7Ci0JaXAtPmlfZGkuZGlfZmxhZ3MgfD0gR0ZTMl9ESUZfSkRBVEE7Ci0JaXAtPmlfZGkuZGlfZW50cmllcyA9IDI7CisJaXAtPmlfZGlza3NpemUgPSBzZHAtPnNkX3NiLnNiX2JzaXplIC0gc2l6ZW9mKHN0cnVjdCBnZnMyX2Rpbm9kZSk7CisJaXAtPmlfZGlza2ZsYWdzIHw9IEdGUzJfRElGX0pEQVRBOworCWlwLT5pX2VudHJpZXMgPSAyOwogCiAJZXJyb3IgPSBnZnMyX21ldGFfaW5vZGVfYnVmZmVyKGlwLCAmZGliaCk7CiAKQEAgLTUxNywxMyArNTE3LDEzIEBACiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF9ndW5sb2NrOwogCi0JaWYgKGlwLT5pX2RpLmRpX2VudHJpZXMgPCAyKSB7CisJaWYgKGlwLT5pX2VudHJpZXMgPCAyKSB7CiAJCWlmIChnZnMyX2NvbnNpc3RfaW5vZGUoaXApKQogCQkJZ2ZzMl9kaW5vZGVfcHJpbnQoaXApOwogCQllcnJvciA9IC1FSU87CiAJCWdvdG8gb3V0X2d1bmxvY2s7CiAJfQotCWlmIChpcC0+aV9kaS5kaV9lbnRyaWVzID4gMikgeworCWlmIChpcC0+aV9lbnRyaWVzID4gMikgewogCQllcnJvciA9IC1FTk9URU1QVFk7CiAJCWdvdG8gb3V0X2d1bmxvY2s7CiAJfQpAQCAtNzI2LDEzICs3MjYsMTMgQEAKIAkJCWdvdG8gb3V0X2d1bmxvY2s7CiAKIAkJaWYgKFNfSVNESVIobmlwLT5pX2lub2RlLmlfbW9kZSkpIHsKLQkJCWlmIChuaXAtPmlfZGkuZGlfZW50cmllcyA8IDIpIHsKKwkJCWlmIChuaXAtPmlfZW50cmllcyA8IDIpIHsKIAkJCQlpZiAoZ2ZzMl9jb25zaXN0X2lub2RlKG5pcCkpCiAJCQkJCWdmczJfZGlub2RlX3ByaW50KG5pcCk7CiAJCQkJZXJyb3IgPSAtRUlPOwogCQkJCWdvdG8gb3V0X2d1bmxvY2s7CiAJCQl9Ci0JCQlpZiAobmlwLT5pX2RpLmRpX2VudHJpZXMgPiAyKSB7CisJCQlpZiAobmlwLT5pX2VudHJpZXMgPiAyKSB7CiAJCQkJZXJyb3IgPSAtRU5PVEVNUFRZOwogCQkJCWdvdG8gb3V0X2d1bmxvY2s7CiAJCQl9CkBAIC03NTgsNyArNzU4LDcgQEAKIAkJCQllcnJvciA9IC1FSU5WQUw7CiAJCQkJZ290byBvdXRfZ3VubG9jazsKIAkJCX0KLQkJCWlmIChuZGlwLT5pX2RpLmRpX2VudHJpZXMgPT0gKHUzMiktMSkgeworCQkJaWYgKG5kaXAtPmlfZW50cmllcyA9PSAodTMyKS0xKSB7CiAJCQkJZXJyb3IgPSAtRUZCSUc7CiAJCQkJZ290byBvdXRfZ3VubG9jazsKIAkJCX0KQEAgLTk5MCw3ICs5OTAsNyBAQAogCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gR0ZTMl9TQihpbm9kZSk7CiAJaW50IGVycm9yOwogCi0JaWYgKGF0dHItPmlhX3NpemUgIT0gaXAtPmlfZGkuZGlfc2l6ZSkgeworCWlmIChhdHRyLT5pYV9zaXplICE9IGlwLT5pX2Rpc2tzaXplKSB7CiAJCWVycm9yID0gZ2ZzMl90cmFuc19iZWdpbihzZHAsIDAsIHNkcC0+c2RfamRlc2MtPmpkX2Jsb2Nrcyk7CiAJCWlmIChlcnJvcikKIAkJCXJldHVybiBlcnJvcjsKQEAgLTEwMDEsOCArMTAwMSw4IEBACiAJfQogCiAJZXJyb3IgPSBnZnMyX3RydW5jYXRlaShpcCwgYXR0ci0+aWFfc2l6ZSk7Ci0JaWYgKGVycm9yICYmIChpbm9kZS0+aV9zaXplICE9IGlwLT5pX2RpLmRpX3NpemUpKQotCQlpX3NpemVfd3JpdGUoaW5vZGUsIGlwLT5pX2RpLmRpX3NpemUpOworCWlmIChlcnJvciAmJiAoaW5vZGUtPmlfc2l6ZSAhPSBpcC0+aV9kaXNrc2l6ZSkpCisJCWlfc2l6ZV93cml0ZShpbm9kZSwgaXAtPmlfZGlza3NpemUpOwogCiAJcmV0dXJuIGVycm9yOwogfQpAQCAtMTIxMiw2ICsxMjEyLDQ4IEBACiAJcmV0dXJuIGdmczJfZWFfcmVtb3ZlKEdGUzJfSShkZW50cnktPmRfaW5vZGUpLCAmZXIpOwogfQogCitzdGF0aWMgaW50IGdmczJfZmllbWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWVtYXBfZXh0ZW50X2luZm8gKmZpZWluZm8sCisJCSAgICAgICB1NjQgc3RhcnQsIHU2NCBsZW4pCit7CisJc3RydWN0IGdmczJfaW5vZGUgKmlwID0gR0ZTMl9JKGlub2RlKTsKKwlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgZ2g7CisJaW50IHJldDsKKworCXJldCA9IGZpZW1hcF9jaGVja19mbGFncyhmaWVpbmZvLCBGSUVNQVBfRkxBR19TWU5DKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCisJcmV0ID0gZ2ZzMl9nbG9ja19ucV9pbml0KGlwLT5pX2dsLCBMTV9TVF9TSEFSRUQsIDAsICZnaCk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlpZiAoZ2ZzMl9pc19zdHVmZmVkKGlwKSkgeworCQl1NjQgcGh5cyA9IGlwLT5pX25vX2FkZHIgPDwgaW5vZGUtPmlfYmxrYml0czsKKwkJdTY0IHNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CisJCXUzMiBmbGFncyA9IEZJRU1BUF9FWFRFTlRfTEFTVHxGSUVNQVBfRVhURU5UX05PVF9BTElHTkVEfAorCQkJICAgIEZJRU1BUF9FWFRFTlRfREFUQV9JTkxJTkU7CisJCXBoeXMgKz0gc2l6ZW9mKHN0cnVjdCBnZnMyX2Rpbm9kZSk7CisJCXBoeXMgKz0gc3RhcnQ7CisJCWlmIChzdGFydCArIGxlbiA+IHNpemUpCisJCQlsZW4gPSBzaXplIC0gc3RhcnQ7CisJCWlmIChzdGFydCA8IHNpemUpCisJCQlyZXQgPSBmaWVtYXBfZmlsbF9uZXh0X2V4dGVudChmaWVpbmZvLCBzdGFydCwgcGh5cywKKwkJCQkJCSAgICAgIGxlbiwgZmxhZ3MpOworCQlpZiAocmV0ID09IDEpCisJCQlyZXQgPSAwOworCX0gZWxzZSB7CisJCXJldCA9IF9fZ2VuZXJpY19ibG9ja19maWVtYXAoaW5vZGUsIGZpZWluZm8sIHN0YXJ0LCBsZW4sCisJCQkJCSAgICAgZ2ZzMl9ibG9ja19tYXApOworCX0KKworCWdmczJfZ2xvY2tfZHFfdW5pbml0KCZnaCk7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKwogY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZ2ZzMl9maWxlX2lvcHMgPSB7CiAJLnBlcm1pc3Npb24gPSBnZnMyX3Blcm1pc3Npb24sCiAJLnNldGF0dHIgPSBnZnMyX3NldGF0dHIsCkBAIC0xMjIwLDYgKzEyNjIsNyBAQAogCS5nZXR4YXR0ciA9IGdmczJfZ2V0eGF0dHIsCiAJLmxpc3R4YXR0ciA9IGdmczJfbGlzdHhhdHRyLAogCS5yZW1vdmV4YXR0ciA9IGdmczJfcmVtb3ZleGF0dHIsCisJLmZpZW1hcCA9IGdmczJfZmllbWFwLAogfTsKIAogY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZ2ZzMl9kaXJfaW9wcyA9IHsKQEAgLTEyMzksNiArMTI4Miw3IEBACiAJLmdldHhhdHRyID0gZ2ZzMl9nZXR4YXR0ciwKIAkubGlzdHhhdHRyID0gZ2ZzMl9saXN0eGF0dHIsCiAJLnJlbW92ZXhhdHRyID0gZ2ZzMl9yZW1vdmV4YXR0ciwKKwkuZmllbWFwID0gZ2ZzMl9maWVtYXAsCiB9OwogCiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBnZnMyX3N5bWxpbmtfaW9wcyA9IHsKQEAgLTEyNTEsNSArMTI5NSw2IEBACiAJLmdldHhhdHRyID0gZ2ZzMl9nZXR4YXR0ciwKIAkubGlzdHhhdHRyID0gZ2ZzMl9saXN0eGF0dHIsCiAJLnJlbW92ZXhhdHRyID0gZ2ZzMl9yZW1vdmV4YXR0ciwKKwkuZmllbWFwID0gZ2ZzMl9maWVtYXAsCiB9OwogCmRpZmYgLS1naXQgYS9mcy9nZnMyL29wc19pbm9kZS5oIGIvZnMvZ2ZzMi9vcHNfaW5vZGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRiNGI3OS4uMDAwMDAwMAotLS0gYS9mcy9nZnMyL29wc19pbm9kZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiAgMTk5Ny0yMDAzIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBSZWQgSGF0LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAotICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuCi0gKi8KLQotI2lmbmRlZiBfX09QU19JTk9ERV9ET1RfSF9fCi0jZGVmaW5lIF9fT1BTX0lOT0RFX0RPVF9IX18KLQotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBnZnMyX2ZpbGVfaW9wczsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBnZnMyX2Rpcl9pb3BzOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGdmczJfc3ltbGlua19pb3BzOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZ2ZzMl9maWxlX2ZvcHM7Ci1leHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBnZnMyX2Rpcl9mb3BzOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZ2ZzMl9maWxlX2ZvcHNfbm9sb2NrOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZ2ZzMl9kaXJfZm9wc19ub2xvY2s7Ci0KLWV4dGVybiB2b2lkIGdmczJfc2V0X2lub2RlX2ZsYWdzKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwotCi0jZW5kaWYgLyogX19PUFNfSU5PREVfRE9UX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9vcHNfc3VwZXIuYyBiL2ZzL2dmczIvb3BzX3N1cGVyLmMKaW5kZXggZDUzNTVkOS4uNzc3NzgzZCAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9vcHNfc3VwZXIuYworKysgYi9mcy9nZnMyL29wc19zdXBlci5jCkBAIC0yOCw3ICsyOCw2IEBACiAjaW5jbHVkZSAiaW5vZGUuaCIKICNpbmNsdWRlICJsb2cuaCIKICNpbmNsdWRlICJtb3VudC5oIgotI2luY2x1ZGUgIm9wc19zdXBlci5oIgogI2luY2x1ZGUgInF1b3RhLmgiCiAjaW5jbHVkZSAicmVjb3ZlcnkuaCIKICNpbmNsdWRlICJyZ3JwLmgiCkBAIC0xNDMsOCArMTQyLDYgQEAKIAlrdGhyZWFkX3N0b3Aoc2RwLT5zZF9xdW90YWRfcHJvY2Vzcyk7CiAJa3RocmVhZF9zdG9wKHNkcC0+c2RfbG9nZF9wcm9jZXNzKTsKIAlrdGhyZWFkX3N0b3Aoc2RwLT5zZF9yZWNvdmVyZF9wcm9jZXNzKTsKLQl3aGlsZSAoc2RwLT5zZF9nbG9ja2RfbnVtLS0pCi0JCWt0aHJlYWRfc3RvcChzZHAtPnNkX2dsb2NrZF9wcm9jZXNzW3NkcC0+c2RfZ2xvY2tkX251bV0pOwogCiAJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CiAJCWVycm9yID0gZ2ZzMl9tYWtlX2ZzX3JvKHNkcCk7CkBAIC0xODUsNyArMTgyLDYgQEAKIAogCS8qICBBdCB0aGlzIHBvaW50LCB3ZSdyZSB0aHJvdWdoIHBhcnRpY2lwYXRpbmcgaW4gdGhlIGxvY2tzcGFjZSAgKi8KIAlnZnMyX3N5c19mc19kZWwoc2RwKTsKLQlrZnJlZShzZHApOwogfQogCiAvKioKQEAgLTI2MCw2ICsyNTYsMTM3IEBACiB9CiAKIC8qKgorICogc3RhdGZzX2ZpbGwgLSBmaWxsIGluIHRoZSBzZyBmb3IgYSBnaXZlbiBSRworICogQHJnZDogdGhlIFJHCisgKiBAc2M6IHRoZSBzYyBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC1FU1RBTEUgaWYgdGhlIExWQiBpcyBpbnZhbGlkCisgKi8KKworc3RhdGljIGludCBzdGF0ZnNfc2xvd19maWxsKHN0cnVjdCBnZnMyX3JncnBkICpyZ2QsCisJCQkgICAgc3RydWN0IGdmczJfc3RhdGZzX2NoYW5nZV9ob3N0ICpzYykKK3sKKwlnZnMyX3JncnBfdmVyaWZ5KHJnZCk7CisJc2MtPnNjX3RvdGFsICs9IHJnZC0+cmRfZGF0YTsKKwlzYy0+c2NfZnJlZSArPSByZ2QtPnJkX2ZyZWU7CisJc2MtPnNjX2Rpbm9kZXMgKz0gcmdkLT5yZF9kaW5vZGVzOworCXJldHVybiAwOworfQorCisvKioKKyAqIGdmczJfc3RhdGZzX3Nsb3cgLSBTdGF0IGEgZmlsZXN5c3RlbSB1c2luZyBhc3luY2hyb25vdXMgbG9ja2luZworICogQHNkcDogdGhlIGZpbGVzeXN0ZW0KKyAqIEBzYzogdGhlIHNjIGluZm8gdGhhdCB3aWxsIGJlIHJldHVybmVkCisgKgorICogQW55IGVycm9yIChvdGhlciB0aGFuIGEgc2lnbmFsKSB3aWxsIGNhdXNlIHRoaXMgcm91dGluZSB0byBmYWxsIGJhY2sKKyAqIHRvIHRoZSBzeW5jaHJvbm91cyB2ZXJzaW9uLgorICoKKyAqIEZJWE1FOiBUaGlzIHJlYWxseSBzaG91bGRuJ3QgYnVzeSB3YWl0IGxpa2UgdGhpcy4KKyAqCisgKiBSZXR1cm5zOiBlcnJubworICovCisKK3N0YXRpYyBpbnQgZ2ZzMl9zdGF0ZnNfc2xvdyhzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgc3RydWN0IGdmczJfc3RhdGZzX2NoYW5nZV9ob3N0ICpzYykKK3sKKwlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgcmlfZ2g7CisJc3RydWN0IGdmczJfcmdycGQgKnJnZF9uZXh0OworCXN0cnVjdCBnZnMyX2hvbGRlciAqZ2hhLCAqZ2g7CisJdW5zaWduZWQgaW50IHNsb3RzID0gNjQ7CisJdW5zaWduZWQgaW50IHg7CisJaW50IGRvbmU7CisJaW50IGVycm9yID0gMCwgZXJyOworCisJbWVtc2V0KHNjLCAwLCBzaXplb2Yoc3RydWN0IGdmczJfc3RhdGZzX2NoYW5nZV9ob3N0KSk7CisJZ2hhID0ga2NhbGxvYyhzbG90cywgc2l6ZW9mKHN0cnVjdCBnZnMyX2hvbGRlciksIEdGUF9LRVJORUwpOworCWlmICghZ2hhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVycm9yID0gZ2ZzMl9yaW5kZXhfaG9sZChzZHAsICZyaV9naCk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKworCXJnZF9uZXh0ID0gZ2ZzMl9yZ3JwZF9nZXRfZmlyc3Qoc2RwKTsKKworCWZvciAoOzspIHsKKwkJZG9uZSA9IDE7CisKKwkJZm9yICh4ID0gMDsgeCA8IHNsb3RzOyB4KyspIHsKKwkJCWdoID0gZ2hhICsgeDsKKworCQkJaWYgKGdoLT5naF9nbCAmJiBnZnMyX2dsb2NrX3BvbGwoZ2gpKSB7CisJCQkJZXJyID0gZ2ZzMl9nbG9ja193YWl0KGdoKTsKKwkJCQlpZiAoZXJyKSB7CisJCQkJCWdmczJfaG9sZGVyX3VuaW5pdChnaCk7CisJCQkJCWVycm9yID0gZXJyOworCQkJCX0gZWxzZSB7CisJCQkJCWlmICghZXJyb3IpCisJCQkJCQllcnJvciA9IHN0YXRmc19zbG93X2ZpbGwoCisJCQkJCQkJZ2gtPmdoX2dsLT5nbF9vYmplY3QsIHNjKTsKKwkJCQkJZ2ZzMl9nbG9ja19kcV91bmluaXQoZ2gpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGdoLT5naF9nbCkKKwkJCQlkb25lID0gMDsKKwkJCWVsc2UgaWYgKHJnZF9uZXh0ICYmICFlcnJvcikgeworCQkJCWVycm9yID0gZ2ZzMl9nbG9ja19ucV9pbml0KHJnZF9uZXh0LT5yZF9nbCwKKwkJCQkJCQkgICBMTV9TVF9TSEFSRUQsCisJCQkJCQkJICAgR0xfQVNZTkMsCisJCQkJCQkJICAgZ2gpOworCQkJCXJnZF9uZXh0ID0gZ2ZzMl9yZ3JwZF9nZXRfbmV4dChyZ2RfbmV4dCk7CisJCQkJZG9uZSA9IDA7CisJCQl9CisKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQllcnJvciA9IC1FUkVTVEFSVFNZUzsKKwkJfQorCisJCWlmIChkb25lKQorCQkJYnJlYWs7CisKKwkJeWllbGQoKTsKKwl9CisKKwlnZnMyX2dsb2NrX2RxX3VuaW5pdCgmcmlfZ2gpOworCitvdXQ6CisJa2ZyZWUoZ2hhKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICogZ2ZzMl9zdGF0ZnNfaSAtIERvIGEgc3RhdGZzCisgKiBAc2RwOiB0aGUgZmlsZXN5c3RlbQorICogQHNnOiB0aGUgc2cgc3RydWN0dXJlCisgKgorICogUmV0dXJuczogZXJybm8KKyAqLworCitzdGF0aWMgaW50IGdmczJfc3RhdGZzX2koc3RydWN0IGdmczJfc2JkICpzZHAsIHN0cnVjdCBnZnMyX3N0YXRmc19jaGFuZ2VfaG9zdCAqc2MpCit7CisJc3RydWN0IGdmczJfc3RhdGZzX2NoYW5nZV9ob3N0ICptX3NjID0gJnNkcC0+c2Rfc3RhdGZzX21hc3RlcjsKKwlzdHJ1Y3QgZ2ZzMl9zdGF0ZnNfY2hhbmdlX2hvc3QgKmxfc2MgPSAmc2RwLT5zZF9zdGF0ZnNfbG9jYWw7CisKKwlzcGluX2xvY2soJnNkcC0+c2Rfc3RhdGZzX3NwaW4pOworCisJKnNjID0gKm1fc2M7CisJc2MtPnNjX3RvdGFsICs9IGxfc2MtPnNjX3RvdGFsOworCXNjLT5zY19mcmVlICs9IGxfc2MtPnNjX2ZyZWU7CisJc2MtPnNjX2Rpbm9kZXMgKz0gbF9zYy0+c2NfZGlub2RlczsKKworCXNwaW5fdW5sb2NrKCZzZHAtPnNkX3N0YXRmc19zcGluKTsKKworCWlmIChzYy0+c2NfZnJlZSA8IDApCisJCXNjLT5zY19mcmVlID0gMDsKKwlpZiAoc2MtPnNjX2ZyZWUgPiBzYy0+c2NfdG90YWwpCisJCXNjLT5zY19mcmVlID0gc2MtPnNjX3RvdGFsOworCWlmIChzYy0+c2NfZGlub2RlcyA8IDApCisJCXNjLT5zY19kaW5vZGVzID0gMDsKKworCXJldHVybiAwOworfQorCisvKioKICAqIGdmczJfc3RhdGZzIC0gR2F0aGVyIGFuZCByZXR1cm4gc3RhdHMgYWJvdXQgdGhlIGZpbGVzeXN0ZW0KICAqIEBzYjogVGhlIHN1cGVyYmxvY2sKICAqIEBzdGF0ZnNidWY6IFRoZSBidWZmZXIKQEAgLTM3MCw3ICs0OTcsNiBAQAogCSAqLwogCWlmICh0ZXN0X2JpdChHSUZfVVNFUiwgJmlwLT5pX2ZsYWdzKSkgewogCQlpcC0+aV9nbC0+Z2xfb2JqZWN0ID0gTlVMTDsKLQkJZ2ZzMl9nbG9ja19zY2hlZHVsZV9mb3JfcmVjbGFpbShpcC0+aV9nbCk7CiAJCWdmczJfZ2xvY2tfcHV0KGlwLT5pX2dsKTsKIAkJaXAtPmlfZ2wgPSBOVUxMOwogCQlpZiAoaXAtPmlfaW9wZW5fZ2guZ2hfZ2wpIHsKQEAgLTQyMyw4ICs1NDksNiBAQAogCQlzZXFfcHJpbnRmKHMsICIsZGVidWciKTsKIAlpZiAoYXJncy0+YXJfdXBncmFkZSkKIAkJc2VxX3ByaW50ZihzLCAiLHVwZ3JhZGUiKTsKLQlpZiAoYXJncy0+YXJfbnVtX2dsb2NrZCAhPSBHRlMyX0dMT0NLRF9ERUZBVUxUKQotCQlzZXFfcHJpbnRmKHMsICIsbnVtX2dsb2NrZD0ldSIsIGFyZ3MtPmFyX251bV9nbG9ja2QpOwogCWlmIChhcmdzLT5hcl9wb3NpeF9hY2wpCiAJCXNlcV9wcmludGYocywgIixhY2wiKTsKIAlpZiAoYXJncy0+YXJfcXVvdGEgIT0gR0ZTMl9RVU9UQV9ERUZBVUxUKSB7CkBAIC00OTQsMTYgKzYxOCwxNiBAQAogCWdmczJfaG9sZGVyX3JlaW5pdChMTV9TVF9FWENMVVNJVkUsIExNX0ZMQUdfVFJZXzFDQiB8IEdMX05PQ0FDSEUsICZpcC0+aV9pb3Blbl9naCk7CiAJZXJyb3IgPSBnZnMyX2dsb2NrX25xKCZpcC0+aV9pb3Blbl9naCk7CiAJaWYgKGVycm9yKQotCQlnb3RvIG91dF91bmluaXQ7CisJCWdvdG8gb3V0X3RydW5jYXRlOwogCiAJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYKLQkgICAgKGlwLT5pX2RpLmRpX2ZsYWdzICYgR0ZTMl9ESUZfRVhIQVNIKSkgeworCSAgICAoaXAtPmlfZGlza2ZsYWdzICYgR0ZTMl9ESUZfRVhIQVNIKSkgewogCQllcnJvciA9IGdmczJfZGlyX2V4aGFzaF9kZWFsbG9jKGlwKTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBvdXRfdW5sb2NrOwogCX0KIAotCWlmIChpcC0+aV9kaS5kaV9lYXR0cikgeworCWlmIChpcC0+aV9lYXR0cikgewogCQllcnJvciA9IGdmczJfZWFfZGVhbGxvYyhpcCk7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0X3VubG9jazsKQEAgLTUxOSw2ICs2NDMsNyBAQAogCWlmIChlcnJvcikKIAkJZ290byBvdXRfdW5sb2NrOwogCitvdXRfdHJ1bmNhdGU6CiAJZXJyb3IgPSBnZnMyX3RyYW5zX2JlZ2luKHNkcCwgMCwgc2RwLT5zZF9qZGVzYy0+amRfYmxvY2tzKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X3VubG9jazsKQEAgLTUyNyw4ICs2NTIsOCBAQAogCWdmczJfdHJhbnNfZW5kKHNkcCk7CiAKIG91dF91bmxvY2s6Ci0JZ2ZzMl9nbG9ja19kcSgmaXAtPmlfaW9wZW5fZ2gpOwotb3V0X3VuaW5pdDoKKwlpZiAodGVzdF9iaXQoSElGX0hPTERFUiwgJmlwLT5pX2lvcGVuX2doLmdoX2lmbGFncykpCisJCWdmczJfZ2xvY2tfZHEoJmlwLT5pX2lvcGVuX2doKTsKIAlnZnMyX2hvbGRlcl91bmluaXQoJmlwLT5pX2lvcGVuX2doKTsKIAlnZnMyX2dsb2NrX2RxX3VuaW5pdCgmZ2gpOwogCWlmIChlcnJvciAmJiBlcnJvciAhPSBHTFJfVFJZRkFJTEVEKQpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9vcHNfc3VwZXIuaCBiL2ZzL2dmczIvb3BzX3N1cGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MmEyNzQuLjAwMDAwMDAKLS0tIGEvZnMvZ2ZzMi9vcHNfc3VwZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFNpc3RpbmEgU29mdHdhcmUsIEluYy4gIDE5OTctMjAwMyBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgUmVkIEhhdCwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKLSAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLgotICovCi0KLSNpZm5kZWYgX19PUFNfU1VQRVJfRE9UX0hfXwotI2RlZmluZSBfX09QU19TVVBFUl9ET1RfSF9fCi0KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotCi1leHRlcm4gY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgZ2ZzMl9zdXBlcl9vcHM7Ci0KLSNlbmRpZiAvKiBfX09QU19TVVBFUl9ET1RfSF9fICovCmRpZmYgLS1naXQgYS9mcy9nZnMyL3F1b3RhLmMgYi9mcy9nZnMyL3F1b3RhLmMKaW5kZXggM2UwNzNmNS4uYjA4ZDA5NiAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9xdW90YS5jCisrKyBiL2ZzL2dmczIvcXVvdGEuYwpAQCAtNDYsNiArNDYsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2Jpby5oPgogI2luY2x1ZGUgPGxpbnV4L2dmczJfb25kaXNrLmg+CiAjaW5jbHVkZSA8bGludXgvbG1faW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KIAogI2luY2x1ZGUgImdmczIuaCIKICNpbmNsdWRlICJpbmNvcmUuaCIKQEAgLTk0LDcgKzk2LDcgQEAKIAlzdHJ1Y3QgZ2ZzMl9xdW90YV9kYXRhICpxZDsKIAlpbnQgZXJyb3I7CiAKLQlxZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBnZnMyX3F1b3RhX2RhdGEpLCBHRlBfTk9GUyk7CisJcWQgPSBrbWVtX2NhY2hlX3phbGxvYyhnZnMyX3F1b3RhZF9jYWNoZXAsIEdGUF9OT0ZTKTsKIAlpZiAoIXFkKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMTE5LDcgKzEyMSw3IEBACiAJcmV0dXJuIDA7CiAKIGZhaWw6Ci0Ja2ZyZWUocWQpOworCWttZW1fY2FjaGVfZnJlZShnZnMyX3F1b3RhZF9jYWNoZXAsIHFkKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTE1OCw3ICsxNjAsNyBAQAogCQlpZiAocWQgfHwgIWNyZWF0ZSkgewogCQkJaWYgKG5ld19xZCkgewogCQkJCWdmczJfbHZiX3VuaG9sZChuZXdfcWQtPnFkX2dsKTsKLQkJCQlrZnJlZShuZXdfcWQpOworCQkJCWttZW1fY2FjaGVfZnJlZShnZnMyX3F1b3RhZF9jYWNoZXAsIG5ld19xZCk7CiAJCQl9CiAJCQkqcWRwID0gcWQ7CiAJCQlyZXR1cm4gMDsKQEAgLTEwMTMsNyArMTAxNSw3IEBACiAKIAlpZiAoZ2ZzMl9hc3NlcnRfd2FybihHRlMyX1NCKCZpcC0+aV9pbm9kZSksIGNoYW5nZSkpCiAJCXJldHVybjsKLQlpZiAoaXAtPmlfZGkuZGlfZmxhZ3MgJiBHRlMyX0RJRl9TWVNURU0pCisJaWYgKGlwLT5pX2Rpc2tmbGFncyAmIEdGUzJfRElGX1NZU1RFTSkKIAkJcmV0dXJuOwogCiAJZm9yICh4ID0gMDsgeCA8IGFsLT5hbF9xZF9udW07IHgrKykgewpAQCAtMTEwMCwxNSArMTEwMiwxNSBAQAogaW50IGdmczJfcXVvdGFfaW5pdChzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCkKIHsKIAlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAgPSBHRlMyX0koc2RwLT5zZF9xY19pbm9kZSk7Ci0JdW5zaWduZWQgaW50IGJsb2NrcyA9IGlwLT5pX2RpLmRpX3NpemUgPj4gc2RwLT5zZF9zYi5zYl9ic2l6ZV9zaGlmdDsKKwl1bnNpZ25lZCBpbnQgYmxvY2tzID0gaXAtPmlfZGlza3NpemUgPj4gc2RwLT5zZF9zYi5zYl9ic2l6ZV9zaGlmdDsKIAl1bnNpZ25lZCBpbnQgeCwgc2xvdCA9IDA7CiAJdW5zaWduZWQgaW50IGZvdW5kID0gMDsKIAl1NjQgZGJsb2NrOwogCXUzMiBleHRsZW4gPSAwOwogCWludCBlcnJvcjsKIAotCWlmICghaXAtPmlfZGkuZGlfc2l6ZSB8fCBpcC0+aV9kaS5kaV9zaXplID4gKDY0IDw8IDIwKSB8fAotCSAgICBpcC0+aV9kaS5kaV9zaXplICYgKHNkcC0+c2Rfc2Iuc2JfYnNpemUgLSAxKSkgeworCWlmICghaXAtPmlfZGlza3NpemUgfHwgaXAtPmlfZGlza3NpemUgPiAoNjQgPDwgMjApIHx8CisJICAgIGlwLT5pX2Rpc2tzaXplICYgKHNkcC0+c2Rfc2Iuc2JfYnNpemUgLSAxKSkgewogCQlnZnMyX2NvbnNpc3RfaW5vZGUoaXApOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0xMTk1LDcgKzExOTcsNyBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotdm9pZCBnZnMyX3F1b3RhX3NjYW4oc3RydWN0IGdmczJfc2JkICpzZHApCitzdGF0aWMgdm9pZCBnZnMyX3F1b3RhX3NjYW4oc3RydWN0IGdmczJfc2JkICpzZHApCiB7CiAJc3RydWN0IGdmczJfcXVvdGFfZGF0YSAqcWQsICpzYWZlOwogCUxJU1RfSEVBRChkZWFkKTsKQEAgLTEyMjIsNyArMTIyNCw3IEBACiAJCWdmczJfYXNzZXJ0X3dhcm4oc2RwLCAhcWQtPnFkX2JoX2NvdW50KTsKIAogCQlnZnMyX2x2Yl91bmhvbGQocWQtPnFkX2dsKTsKLQkJa2ZyZWUocWQpOworCQlrbWVtX2NhY2hlX2ZyZWUoZ2ZzMl9xdW90YWRfY2FjaGVwLCBxZCk7CiAJfQogfQogCkBAIC0xMjU3LDcgKzEyNTksNyBAQAogCQlnZnMyX2Fzc2VydF93YXJuKHNkcCwgIXFkLT5xZF9iaF9jb3VudCk7CiAKIAkJZ2ZzMl9sdmJfdW5ob2xkKHFkLT5xZF9nbCk7Ci0JCWtmcmVlKHFkKTsKKwkJa21lbV9jYWNoZV9mcmVlKGdmczJfcXVvdGFkX2NhY2hlcCwgcWQpOwogCiAJCXNwaW5fbG9jaygmc2RwLT5zZF9xdW90YV9zcGluKTsKIAl9CkBAIC0xMjcyLDMgKzEyNzQsOTQgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIHF1b3RhZF9lcnJvcihzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgY29uc3QgY2hhciAqbXNnLCBpbnQgZXJyb3IpCit7CisJaWYgKGVycm9yID09IDAgfHwgZXJyb3IgPT0gLUVST0ZTKQorCQlyZXR1cm47CisJaWYgKCF0ZXN0X2JpdChTREZfU0hVVERPV04sICZzZHAtPnNkX2ZsYWdzKSkKKwkJZnNfZXJyKHNkcCwgImdmczJfcXVvdGFkOiAlcyBlcnJvciAlZFxuIiwgbXNnLCBlcnJvcik7Cit9CisKK3N0YXRpYyB2b2lkIHF1b3RhZF9jaGVja190aW1lbyhzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgY29uc3QgY2hhciAqbXNnLAorCQkJICAgICAgIGludCAoKmZ4bikoc3RydWN0IGdmczJfc2JkICpzZHApLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdCwgdW5zaWduZWQgbG9uZyAqdGltZW8sCisJCQkgICAgICAgdW5zaWduZWQgaW50ICpuZXdfdGltZW8pCit7CisJaWYgKHQgPj0gKnRpbWVvKSB7CisJCWludCBlcnJvciA9IGZ4bihzZHApOworCQlxdW90YWRfZXJyb3Ioc2RwLCBtc2csIGVycm9yKTsKKwkJKnRpbWVvID0gZ2ZzMl90dW5lX2dldF9pKCZzZHAtPnNkX3R1bmUsIG5ld190aW1lbykgKiBIWjsKKwl9IGVsc2UgeworCQkqdGltZW8gLT0gdDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHF1b3RhZF9jaGVja190cnVuY19saXN0KHN0cnVjdCBnZnMyX3NiZCAqc2RwKQoreworCXN0cnVjdCBnZnMyX2lub2RlICppcDsKKworCXdoaWxlKDEpIHsKKwkJaXAgPSBOVUxMOworCQlzcGluX2xvY2soJnNkcC0+c2RfdHJ1bmNfbG9jayk7CisJCWlmICghbGlzdF9lbXB0eSgmc2RwLT5zZF90cnVuY19saXN0KSkgeworCQkJaXAgPSBsaXN0X2VudHJ5KHNkcC0+c2RfdHJ1bmNfbGlzdC5uZXh0LAorCQkJCQlzdHJ1Y3QgZ2ZzMl9pbm9kZSwgaV90cnVuY19saXN0KTsKKwkJCWxpc3RfZGVsX2luaXQoJmlwLT5pX3RydW5jX2xpc3QpOworCQl9CisJCXNwaW5fdW5sb2NrKCZzZHAtPnNkX3RydW5jX2xvY2spOworCQlpZiAoaXAgPT0gTlVMTCkKKwkJCXJldHVybjsKKwkJZ2ZzMl9nbG9ja19maW5pc2hfdHJ1bmNhdGUoaXApOworCX0KK30KKworLyoqCisgKiBnZnMyX3F1b3RhZCAtIFdyaXRlIGNhY2hlZCBxdW90YSBjaGFuZ2VzIGludG8gdGhlIHF1b3RhIGZpbGUKKyAqIEBzZHA6IFBvaW50ZXIgdG8gR0ZTMiBzdXBlcmJsb2NrCisgKgorICovCisKK2ludCBnZnMyX3F1b3RhZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gZGF0YTsKKwlzdHJ1Y3QgZ2ZzMl90dW5lICp0dW5lID0gJnNkcC0+c2RfdHVuZTsKKwl1bnNpZ25lZCBsb25nIHN0YXRmc190aW1lbyA9IDA7CisJdW5zaWduZWQgbG9uZyBxdW90YWRfdGltZW8gPSAwOworCXVuc2lnbmVkIGxvbmcgdCA9IDA7CisJREVGSU5FX1dBSVQod2FpdCk7CisJaW50IGVtcHR5OworCisJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKKworCQkvKiBVcGRhdGUgdGhlIG1hc3RlciBzdGF0ZnMgZmlsZSAqLworCQlxdW90YWRfY2hlY2tfdGltZW8oc2RwLCAic3RhdGZzIiwgZ2ZzMl9zdGF0ZnNfc3luYywgdCwKKwkJCQkgICAmc3RhdGZzX3RpbWVvLCAmdHVuZS0+Z3Rfc3RhdGZzX3F1YW50dW0pOworCisJCS8qIFVwZGF0ZSBxdW90YSBmaWxlICovCisJCXF1b3RhZF9jaGVja190aW1lbyhzZHAsICJzeW5jIiwgZ2ZzMl9xdW90YV9zeW5jLCB0LAorCQkJCSAgICZxdW90YWRfdGltZW8sICZ0dW5lLT5ndF9xdW90YV9xdWFudHVtKTsKKworCQkvKiBGSVhNRTogVGhpcyBzaG91bGQgYmUgdHVybmVkIGludG8gYSBzaHJpbmtlciAqLworCQlnZnMyX3F1b3RhX3NjYW4oc2RwKTsKKworCQkvKiBDaGVjayBmb3IgJiByZWNvdmVyIHBhcnRpYWxseSB0cnVuY2F0ZWQgaW5vZGVzICovCisJCXF1b3RhZF9jaGVja190cnVuY19saXN0KHNkcCk7CisKKwkJaWYgKGZyZWV6aW5nKGN1cnJlbnQpKQorCQkJcmVmcmlnZXJhdG9yKCk7CisJCXQgPSBtaW4ocXVvdGFkX3RpbWVvLCBzdGF0ZnNfdGltZW8pOworCisJCXByZXBhcmVfdG9fd2FpdCgmc2RwLT5zZF9xdW90YV93YWl0LCAmd2FpdCwgVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzcGluX2xvY2soJnNkcC0+c2RfdHJ1bmNfbG9jayk7CisJCWVtcHR5ID0gbGlzdF9lbXB0eSgmc2RwLT5zZF90cnVuY19saXN0KTsKKwkJc3Bpbl91bmxvY2soJnNkcC0+c2RfdHJ1bmNfbG9jayk7CisJCWlmIChlbXB0eSkKKwkJCXQgLT0gc2NoZWR1bGVfdGltZW91dCh0KTsKKwkJZWxzZQorCQkJdCA9IDA7CisJCWZpbmlzaF93YWl0KCZzZHAtPnNkX3F1b3RhX3dhaXQsICZ3YWl0KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9xdW90YS5oIGIvZnMvZ2ZzMi9xdW90YS5oCmluZGV4IDNiN2Y0YjAuLmNlYzkwMzIgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvcXVvdGEuaAorKysgYi9mcy9nZnMyL3F1b3RhLmgKQEAgLTE1LDIyICsxNSwyMiBAQAogCiAjZGVmaW5lIE5PX1FVT1RBX0NIQU5HRSAoKHUzMiktMSkKIAotaW50IGdmczJfcXVvdGFfaG9sZChzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIHUzMiB1aWQsIHUzMiBnaWQpOwotdm9pZCBnZnMyX3F1b3RhX3VuaG9sZChzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXApOworZXh0ZXJuIGludCBnZnMyX3F1b3RhX2hvbGQoc3RydWN0IGdmczJfaW5vZGUgKmlwLCB1MzIgdWlkLCB1MzIgZ2lkKTsKK2V4dGVybiB2b2lkIGdmczJfcXVvdGFfdW5ob2xkKHN0cnVjdCBnZnMyX2lub2RlICppcCk7CiAKLWludCBnZnMyX3F1b3RhX2xvY2soc3RydWN0IGdmczJfaW5vZGUgKmlwLCB1MzIgdWlkLCB1MzIgZ2lkKTsKLXZvaWQgZ2ZzMl9xdW90YV91bmxvY2soc3RydWN0IGdmczJfaW5vZGUgKmlwKTsKK2V4dGVybiBpbnQgZ2ZzMl9xdW90YV9sb2NrKHN0cnVjdCBnZnMyX2lub2RlICppcCwgdTMyIHVpZCwgdTMyIGdpZCk7CitleHRlcm4gdm9pZCBnZnMyX3F1b3RhX3VubG9jayhzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXApOwogCi1pbnQgZ2ZzMl9xdW90YV9jaGVjayhzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIHUzMiB1aWQsIHUzMiBnaWQpOwotdm9pZCBnZnMyX3F1b3RhX2NoYW5nZShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIHM2NCBjaGFuZ2UsCi0JCSAgICAgICB1MzIgdWlkLCB1MzIgZ2lkKTsKK2V4dGVybiBpbnQgZ2ZzMl9xdW90YV9jaGVjayhzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIHUzMiB1aWQsIHUzMiBnaWQpOworZXh0ZXJuIHZvaWQgZ2ZzMl9xdW90YV9jaGFuZ2Uoc3RydWN0IGdmczJfaW5vZGUgKmlwLCBzNjQgY2hhbmdlLAorCQkJICAgICAgdTMyIHVpZCwgdTMyIGdpZCk7CiAKLWludCBnZnMyX3F1b3RhX3N5bmMoc3RydWN0IGdmczJfc2JkICpzZHApOwotaW50IGdmczJfcXVvdGFfcmVmcmVzaChzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgaW50IHVzZXIsIHUzMiBpZCk7CitleHRlcm4gaW50IGdmczJfcXVvdGFfc3luYyhzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCk7CitleHRlcm4gaW50IGdmczJfcXVvdGFfcmVmcmVzaChzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgaW50IHVzZXIsIHUzMiBpZCk7CiAKLWludCBnZnMyX3F1b3RhX2luaXQoc3RydWN0IGdmczJfc2JkICpzZHApOwotdm9pZCBnZnMyX3F1b3RhX3NjYW4oc3RydWN0IGdmczJfc2JkICpzZHApOwotdm9pZCBnZnMyX3F1b3RhX2NsZWFudXAoc3RydWN0IGdmczJfc2JkICpzZHApOworZXh0ZXJuIGludCBnZnMyX3F1b3RhX2luaXQoc3RydWN0IGdmczJfc2JkICpzZHApOworZXh0ZXJuIHZvaWQgZ2ZzMl9xdW90YV9jbGVhbnVwKHN0cnVjdCBnZnMyX3NiZCAqc2RwKTsKK2V4dGVybiBpbnQgZ2ZzMl9xdW90YWQodm9pZCAqZGF0YSk7CiAKIHN0YXRpYyBpbmxpbmUgaW50IGdmczJfcXVvdGFfbG9ja19jaGVjayhzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXApCiB7CmRpZmYgLS1naXQgYS9mcy9nZnMyL3JlY292ZXJ5LmMgYi9mcy9nZnMyL3JlY292ZXJ5LmMKaW5kZXggZDVlOTFmNC4uZWZkMDljMyAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9yZWNvdmVyeS5jCisrKyBiL2ZzL2dmczIvcmVjb3ZlcnkuYwpAQCAtMTQsNiArMTQsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2dmczJfb25kaXNrLmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KICNpbmNsdWRlIDxsaW51eC9sbV9pbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogCiAjaW5jbHVkZSAiZ2ZzMi5oIgogI2luY2x1ZGUgImluY29yZS5oIgpAQCAtNTgzLDEzICs1ODUsMzUgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgZ2ZzMl9qZGVzYyAqZ2ZzMl9qZGVzY19maW5kX2RpcnR5KHN0cnVjdCBnZnMyX3NiZCAqc2RwKQoreworCXN0cnVjdCBnZnMyX2pkZXNjICpqZDsKKwlpbnQgZm91bmQgPSAwOworCisJc3Bpbl9sb2NrKCZzZHAtPnNkX2ppbmRleF9zcGluKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoamQsICZzZHAtPnNkX2ppbmRleF9saXN0LCBqZF9saXN0KSB7CisJCWlmIChqZC0+amRfZGlydHkpIHsKKwkJCWpkLT5qZF9kaXJ0eSA9IDA7CisJCQlmb3VuZCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmc2RwLT5zZF9qaW5kZXhfc3Bpbik7CisKKwlpZiAoIWZvdW5kKQorCQlqZCA9IE5VTEw7CisKKwlyZXR1cm4gamQ7Cit9CisKIC8qKgogICogZ2ZzMl9jaGVja19qb3VybmFscyAtIFJlY292ZXIgYW55IGRpcnR5IGpvdXJuYWxzCiAgKiBAc2RwOiB0aGUgZmlsZXN5c3RlbQogICoKICAqLwogCi12b2lkIGdmczJfY2hlY2tfam91cm5hbHMoc3RydWN0IGdmczJfc2JkICpzZHApCitzdGF0aWMgdm9pZCBnZnMyX2NoZWNrX2pvdXJuYWxzKHN0cnVjdCBnZnMyX3NiZCAqc2RwKQogewogCXN0cnVjdCBnZnMyX2pkZXNjICpqZDsKIApAQCAtNjAzLDMgKzYyNywyNSBAQAogCX0KIH0KIAorLyoqCisgKiBnZnMyX3JlY292ZXJkIC0gUmVjb3ZlciBkZWFkIG1hY2hpbmUncyBqb3VybmFscworICogQHNkcDogUG9pbnRlciB0byBHRlMyIHN1cGVyYmxvY2sKKyAqCisgKi8KKworaW50IGdmczJfcmVjb3ZlcmQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IGRhdGE7CisJdW5zaWduZWQgbG9uZyB0OworCisJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKKwkJZ2ZzMl9jaGVja19qb3VybmFscyhzZHApOworCQl0ID0gZ2ZzMl90dW5lX2dldChzZHAsICBndF9yZWNvdmVyZF9zZWNzKSAqIEhaOworCQlpZiAoZnJlZXppbmcoY3VycmVudCkpCisJCQlyZWZyaWdlcmF0b3IoKTsKKwkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKHQpOworCX0KKworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9mcy9nZnMyL3JlY292ZXJ5LmggYi9mcy9nZnMyL3JlY292ZXJ5LmgKaW5kZXggZjcyMzVlNi4uYTgyMThlYSAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9yZWNvdmVyeS5oCisrKyBiL2ZzL2dmczIvcmVjb3ZlcnkuaApAQCAtMTgsMTcgKzE4LDE3IEBACiAJICAgICAgICAqYmxrID0gMDsKIH0KIAotaW50IGdmczJfcmVwbGF5X3JlYWRfYmxvY2soc3RydWN0IGdmczJfamRlc2MgKmpkLCB1bnNpZ25lZCBpbnQgYmxrLAorZXh0ZXJuIGludCBnZnMyX3JlcGxheV9yZWFkX2Jsb2NrKHN0cnVjdCBnZnMyX2pkZXNjICpqZCwgdW5zaWduZWQgaW50IGJsaywKIAkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJoKTsKIAotaW50IGdmczJfcmV2b2tlX2FkZChzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgdTY0IGJsa25vLCB1bnNpZ25lZCBpbnQgd2hlcmUpOwotaW50IGdmczJfcmV2b2tlX2NoZWNrKHN0cnVjdCBnZnMyX3NiZCAqc2RwLCB1NjQgYmxrbm8sIHVuc2lnbmVkIGludCB3aGVyZSk7Ci12b2lkIGdmczJfcmV2b2tlX2NsZWFuKHN0cnVjdCBnZnMyX3NiZCAqc2RwKTsKK2V4dGVybiBpbnQgZ2ZzMl9yZXZva2VfYWRkKHN0cnVjdCBnZnMyX3NiZCAqc2RwLCB1NjQgYmxrbm8sIHVuc2lnbmVkIGludCB3aGVyZSk7CitleHRlcm4gaW50IGdmczJfcmV2b2tlX2NoZWNrKHN0cnVjdCBnZnMyX3NiZCAqc2RwLCB1NjQgYmxrbm8sIHVuc2lnbmVkIGludCB3aGVyZSk7CitleHRlcm4gdm9pZCBnZnMyX3Jldm9rZV9jbGVhbihzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCk7CiAKLWludCBnZnMyX2ZpbmRfamhlYWQoc3RydWN0IGdmczJfamRlc2MgKmpkLAorZXh0ZXJuIGludCBnZnMyX2ZpbmRfamhlYWQoc3RydWN0IGdmczJfamRlc2MgKmpkLAogCQkgICAgc3RydWN0IGdmczJfbG9nX2hlYWRlcl9ob3N0ICpoZWFkKTsKLWludCBnZnMyX3JlY292ZXJfam91cm5hbChzdHJ1Y3QgZ2ZzMl9qZGVzYyAqZ2ZzMl9qZCk7Ci12b2lkIGdmczJfY2hlY2tfam91cm5hbHMoc3RydWN0IGdmczJfc2JkICpzZHApOworZXh0ZXJuIGludCBnZnMyX3JlY292ZXJfam91cm5hbChzdHJ1Y3QgZ2ZzMl9qZGVzYyAqZ2ZzMl9qZCk7CitleHRlcm4gaW50IGdmczJfcmVjb3ZlcmQodm9pZCAqZGF0YSk7CiAKICNlbmRpZiAvKiBfX1JFQ09WRVJZX0RPVF9IX18gKi8KIApkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9yZ3JwLmMgYi9mcy9nZnMyL3JncnAuYwppbmRleCAyZDkwZmIyLi44YjAxYzYzIDEwMDY0NAotLS0gYS9mcy9nZnMyL3JncnAuYworKysgYi9mcy9nZnMyL3JncnAuYwpAQCAtMjY5LDE2ICsyNjksMTQgQEAKIAkJCQkJCSAgYmktPmJpX2xlbiwgeCk7CiAJfQogCi0JaWYgKGNvdW50WzBdICE9IHJnZC0+cmRfcmcucmdfZnJlZSkgeworCWlmIChjb3VudFswXSAhPSByZ2QtPnJkX2ZyZWUpIHsKIAkJaWYgKGdmczJfY29uc2lzdF9yZ3JwZChyZ2QpKQogCQkJZnNfZXJyKHNkcCwgImZyZWUgZGF0YSBtaXNtYXRjaDogICV1ICE9ICV1XG4iLAotCQkJICAgICAgIGNvdW50WzBdLCByZ2QtPnJkX3JnLnJnX2ZyZWUpOworCQkJICAgICAgIGNvdW50WzBdLCByZ2QtPnJkX2ZyZWUpOwogCQlyZXR1cm47CiAJfQogCi0JdG1wID0gcmdkLT5yZF9kYXRhIC0KLQkJcmdkLT5yZF9yZy5yZ19mcmVlIC0KLQkJcmdkLT5yZF9yZy5yZ19kaW5vZGVzOworCXRtcCA9IHJnZC0+cmRfZGF0YSAtIHJnZC0+cmRfZnJlZSAtIHJnZC0+cmRfZGlub2RlczsKIAlpZiAoY291bnRbMV0gKyBjb3VudFsyXSAhPSB0bXApIHsKIAkJaWYgKGdmczJfY29uc2lzdF9yZ3JwZChyZ2QpKQogCQkJZnNfZXJyKHNkcCwgInVzZWQgZGF0YSBtaXNtYXRjaDogICV1ICE9ICV1XG4iLApAQCAtMjg2LDEwICsyODQsMTAgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmIChjb3VudFszXSAhPSByZ2QtPnJkX3JnLnJnX2Rpbm9kZXMpIHsKKwlpZiAoY291bnRbM10gIT0gcmdkLT5yZF9kaW5vZGVzKSB7CiAJCWlmIChnZnMyX2NvbnNpc3RfcmdycGQocmdkKSkKIAkJCWZzX2VycihzZHAsICJ1c2VkIG1ldGFkYXRhIG1pc21hdGNoOiAgJXUgIT0gJXVcbiIsCi0JCQkgICAgICAgY291bnRbM10sIHJnZC0+cmRfcmcucmdfZGlub2Rlcyk7CisJCQkgICAgICAgY291bnRbM10sIHJnZC0+cmRfZGlub2Rlcyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTUwMSw3ICs0OTksNyBAQAogCWZvciAocmdycHMgPSAwOzsgcmdycHMrKykgewogCQlsb2ZmX3QgcG9zID0gcmdycHMgKiBzaXplb2Yoc3RydWN0IGdmczJfcmluZGV4KTsKIAotCQlpZiAocG9zICsgc2l6ZW9mKHN0cnVjdCBnZnMyX3JpbmRleCkgPj0gaXAtPmlfZGkuZGlfc2l6ZSkKKwkJaWYgKHBvcyArIHNpemVvZihzdHJ1Y3QgZ2ZzMl9yaW5kZXgpID49IGlwLT5pX2Rpc2tzaXplKQogCQkJYnJlYWs7CiAJCWVycm9yID0gZ2ZzMl9pbnRlcm5hbF9yZWFkKGlwLCAmcmFfc3RhdGUsIGJ1ZiwgJnBvcywKIAkJCQkJICAgc2l6ZW9mKHN0cnVjdCBnZnMyX3JpbmRleCkpOwpAQCAtNTkwLDcgKzU4OCw3IEBACiAJc3RydWN0IGdmczJfc2JkICpzZHAgPSBHRlMyX1NCKCZpcC0+aV9pbm9kZSk7CiAJc3RydWN0IGlub2RlICppbm9kZSA9ICZpcC0+aV9pbm9kZTsKIAlzdHJ1Y3QgZmlsZV9yYV9zdGF0ZSByYV9zdGF0ZTsKLQl1NjQgcmdycF9jb3VudCA9IGlwLT5pX2RpLmRpX3NpemU7CisJdTY0IHJncnBfY291bnQgPSBpcC0+aV9kaXNrc2l6ZTsKIAlpbnQgZXJyb3I7CiAKIAlpZiAoZG9fZGl2KHJncnBfY291bnQsIHNpemVvZihzdHJ1Y3QgZ2ZzMl9yaW5kZXgpKSkgewpAQCAtNjM0LDcgKzYzMiw3IEBACiAJZm9yIChzZHAtPnNkX3JncnBzID0gMDs7IHNkcC0+c2RfcmdycHMrKykgewogCQkvKiBJZ25vcmUgcGFydGlhbHMgKi8KIAkJaWYgKChzZHAtPnNkX3JncnBzICsgMSkgKiBzaXplb2Yoc3RydWN0IGdmczJfcmluZGV4KSA+Ci0JCSAgICBpcC0+aV9kaS5kaV9zaXplKQorCQkgICAgaXAtPmlfZGlza3NpemUpCiAJCQlicmVhazsKIAkJZXJyb3IgPSByZWFkX3JpbmRleF9lbnRyeShpcCwgJnJhX3N0YXRlKTsKIAkJaWYgKGVycm9yKSB7CkBAIC02OTIsNyArNjkwLDYgQEAKIHN0YXRpYyB2b2lkIGdmczJfcmdycF9pbihzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqcmdkLCBjb25zdCB2b2lkICpidWYpCiB7CiAJY29uc3Qgc3RydWN0IGdmczJfcmdycCAqc3RyID0gYnVmOwotCXN0cnVjdCBnZnMyX3JncnBfaG9zdCAqcmcgPSAmcmdkLT5yZF9yZzsKIAl1MzIgcmdfZmxhZ3M7CiAKIAlyZ19mbGFncyA9IGJlMzJfdG9fY3B1KHN0ci0+cmdfZmxhZ3MpOwpAQCAtNzAwLDI0ICs2OTcsMjMgQEAKIAkJcmdkLT5yZF9mbGFncyB8PSBHRlMyX1JERl9OT0FMTE9DOwogCWVsc2UKIAkJcmdkLT5yZF9mbGFncyAmPSB+R0ZTMl9SREZfTk9BTExPQzsKLQlyZy0+cmdfZnJlZSA9IGJlMzJfdG9fY3B1KHN0ci0+cmdfZnJlZSk7Ci0JcmctPnJnX2Rpbm9kZXMgPSBiZTMyX3RvX2NwdShzdHItPnJnX2Rpbm9kZXMpOwotCXJnLT5yZ19pZ2VuZXJhdGlvbiA9IGJlNjRfdG9fY3B1KHN0ci0+cmdfaWdlbmVyYXRpb24pOworCXJnZC0+cmRfZnJlZSA9IGJlMzJfdG9fY3B1KHN0ci0+cmdfZnJlZSk7CisJcmdkLT5yZF9kaW5vZGVzID0gYmUzMl90b19jcHUoc3RyLT5yZ19kaW5vZGVzKTsKKwlyZ2QtPnJkX2lnZW5lcmF0aW9uID0gYmU2NF90b19jcHUoc3RyLT5yZ19pZ2VuZXJhdGlvbik7CiB9CiAKIHN0YXRpYyB2b2lkIGdmczJfcmdycF9vdXQoc3RydWN0IGdmczJfcmdycGQgKnJnZCwgdm9pZCAqYnVmKQogewogCXN0cnVjdCBnZnMyX3JncnAgKnN0ciA9IGJ1ZjsKLQlzdHJ1Y3QgZ2ZzMl9yZ3JwX2hvc3QgKnJnID0gJnJnZC0+cmRfcmc7CiAJdTMyIHJnX2ZsYWdzID0gMDsKIAogCWlmIChyZ2QtPnJkX2ZsYWdzICYgR0ZTMl9SREZfTk9BTExPQykKIAkJcmdfZmxhZ3MgfD0gR0ZTMl9SR0ZfTk9BTExPQzsKIAlzdHItPnJnX2ZsYWdzID0gY3B1X3RvX2JlMzIocmdfZmxhZ3MpOwotCXN0ci0+cmdfZnJlZSA9IGNwdV90b19iZTMyKHJnLT5yZ19mcmVlKTsKLQlzdHItPnJnX2Rpbm9kZXMgPSBjcHVfdG9fYmUzMihyZy0+cmdfZGlub2Rlcyk7CisJc3RyLT5yZ19mcmVlID0gY3B1X3RvX2JlMzIocmdkLT5yZF9mcmVlKTsKKwlzdHItPnJnX2Rpbm9kZXMgPSBjcHVfdG9fYmUzMihyZ2QtPnJkX2Rpbm9kZXMpOwogCXN0ci0+X19wYWQgPSBjcHVfdG9fYmUzMigwKTsKLQlzdHItPnJnX2lnZW5lcmF0aW9uID0gY3B1X3RvX2JlNjQocmctPnJnX2lnZW5lcmF0aW9uKTsKKwlzdHItPnJnX2lnZW5lcmF0aW9uID0gY3B1X3RvX2JlNjQocmdkLT5yZF9pZ2VuZXJhdGlvbik7CiAJbWVtc2V0KCZzdHItPnJnX3Jlc2VydmVkLCAwLCBzaXplb2Yoc3RyLT5yZ19yZXNlcnZlZCkpOwogfQogCkBAIC03NzYsNyArNzcyLDcgQEAKIAl9CiAKIAlzcGluX2xvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOwotCXJnZC0+cmRfZnJlZV9jbG9uZSA9IHJnZC0+cmRfcmcucmdfZnJlZTsKKwlyZ2QtPnJkX2ZyZWVfY2xvbmUgPSByZ2QtPnJkX2ZyZWU7CiAJcmdkLT5yZF9iaF9jb3VudCsrOwogCXNwaW5fdW5sb2NrKCZzZHAtPnNkX3JpbmRleF9zcGluKTsKIApAQCAtODUwLDcgKzg0Niw3IEBACiAJfQogCiAJc3Bpbl9sb2NrKCZzZHAtPnNkX3JpbmRleF9zcGluKTsKLQlyZ2QtPnJkX2ZyZWVfY2xvbmUgPSByZ2QtPnJkX3JnLnJnX2ZyZWU7CisJcmdkLT5yZF9mcmVlX2Nsb25lID0gcmdkLT5yZF9mcmVlOwogCXNwaW5fdW5sb2NrKCZzZHAtPnNkX3JpbmRleF9zcGluKTsKIH0KIApAQCAtMTQwMyw4ICsxMzk5LDggQEAKIAlibG9jayA9IHJnZC0+cmRfZGF0YTAgKyBibGs7CiAJaXAtPmlfZ29hbCA9IGJsb2NrOwogCi0JZ2ZzMl9hc3NlcnRfd2l0aGRyYXcoc2RwLCByZ2QtPnJkX3JnLnJnX2ZyZWUgPj0gKm4pOwotCXJnZC0+cmRfcmcucmdfZnJlZSAtPSAqbjsKKwlnZnMyX2Fzc2VydF93aXRoZHJhdyhzZHAsIHJnZC0+cmRfZnJlZSA+PSAqbik7CisJcmdkLT5yZF9mcmVlIC09ICpuOwogCiAJZ2ZzMl90cmFuc19hZGRfYmgocmdkLT5yZF9nbCwgcmdkLT5yZF9iaXRzWzBdLmJpX2JoLCAxKTsKIAlnZnMyX3JncnBfb3V0KHJnZCwgcmdkLT5yZF9iaXRzWzBdLmJpX2JoLT5iX2RhdGEpOwpAQCAtMTQ0NSwxMCArMTQ0MSwxMCBAQAogCiAJYmxvY2sgPSByZ2QtPnJkX2RhdGEwICsgYmxrOwogCi0JZ2ZzMl9hc3NlcnRfd2l0aGRyYXcoc2RwLCByZ2QtPnJkX3JnLnJnX2ZyZWUpOwotCXJnZC0+cmRfcmcucmdfZnJlZS0tOwotCXJnZC0+cmRfcmcucmdfZGlub2RlcysrOwotCSpnZW5lcmF0aW9uID0gcmdkLT5yZF9yZy5yZ19pZ2VuZXJhdGlvbisrOworCWdmczJfYXNzZXJ0X3dpdGhkcmF3KHNkcCwgcmdkLT5yZF9mcmVlKTsKKwlyZ2QtPnJkX2ZyZWUtLTsKKwlyZ2QtPnJkX2Rpbm9kZXMrKzsKKwkqZ2VuZXJhdGlvbiA9IHJnZC0+cmRfaWdlbmVyYXRpb24rKzsKIAlnZnMyX3RyYW5zX2FkZF9iaChyZ2QtPnJkX2dsLCByZ2QtPnJkX2JpdHNbMF0uYmlfYmgsIDEpOwogCWdmczJfcmdycF9vdXQocmdkLCByZ2QtPnJkX2JpdHNbMF0uYmlfYmgtPmJfZGF0YSk7CiAKQEAgLTE0ODEsNyArMTQ3Nyw3IEBACiAJaWYgKCFyZ2QpCiAJCXJldHVybjsKIAotCXJnZC0+cmRfcmcucmdfZnJlZSArPSBibGVuOworCXJnZC0+cmRfZnJlZSArPSBibGVuOwogCiAJZ2ZzMl90cmFuc19hZGRfYmgocmdkLT5yZF9nbCwgcmdkLT5yZF9iaXRzWzBdLmJpX2JoLCAxKTsKIAlnZnMyX3JncnBfb3V0KHJnZCwgcmdkLT5yZF9iaXRzWzBdLmJpX2JoLT5iX2RhdGEpOwpAQCAtMTUwOSw3ICsxNTA1LDcgQEAKIAlpZiAoIXJnZCkKIAkJcmV0dXJuOwogCi0JcmdkLT5yZF9yZy5yZ19mcmVlICs9IGJsZW47CisJcmdkLT5yZF9mcmVlICs9IGJsZW47CiAKIAlnZnMyX3RyYW5zX2FkZF9iaChyZ2QtPnJkX2dsLCByZ2QtPnJkX2JpdHNbMF0uYmlfYmgsIDEpOwogCWdmczJfcmdycF9vdXQocmdkLCByZ2QtPnJkX2JpdHNbMF0uYmlfYmgtPmJfZGF0YSk7CkBAIC0xNTQ2LDEwICsxNTQyLDEwIEBACiAJCXJldHVybjsKIAlnZnMyX2Fzc2VydF93aXRoZHJhdyhzZHAsIHJnZCA9PSB0bXBfcmdkKTsKIAotCWlmICghcmdkLT5yZF9yZy5yZ19kaW5vZGVzKQorCWlmICghcmdkLT5yZF9kaW5vZGVzKQogCQlnZnMyX2NvbnNpc3RfcmdycGQocmdkKTsKLQlyZ2QtPnJkX3JnLnJnX2Rpbm9kZXMtLTsKLQlyZ2QtPnJkX3JnLnJnX2ZyZWUrKzsKKwlyZ2QtPnJkX2Rpbm9kZXMtLTsKKwlyZ2QtPnJkX2ZyZWUrKzsKIAogCWdmczJfdHJhbnNfYWRkX2JoKHJnZC0+cmRfZ2wsIHJnZC0+cmRfYml0c1swXS5iaV9iaCwgMSk7CiAJZ2ZzMl9yZ3JwX291dChyZ2QsIHJnZC0+cmRfYml0c1swXS5iaV9iaC0+Yl9kYXRhKTsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvc3VwZXIuYyBiL2ZzL2dmczIvc3VwZXIuYwppbmRleCBjM2JhM2Q5Li4xNDFiNzgxIDEwMDY0NAotLS0gYS9mcy9nZnMyL3N1cGVyLmMKKysrIGIvZnMvZ2ZzMi9zdXBlci5jCkBAIC0zNCw3NiArMzQsNiBAQAogI2luY2x1ZGUgInV0aWwuaCIKIAogLyoqCi0gKiBnZnMyX2ppbmRleF9ob2xkIC0gR3JhYiBhIGxvY2sgb24gdGhlIGppbmRleAotICogQHNkcDogVGhlIEdGUzIgc3VwZXJibG9jawotICogQGppX2doOiB0aGUgaG9sZGVyIGZvciB0aGUgamluZGV4IGdsb2NrCi0gKgotICogVGhpcyBpcyB2ZXJ5IHNpbWlsYXIgdG8gdGhlIGdmczJfcmluZGV4X2hvbGQoKSBmdW5jdGlvbiwgZXhjZXB0IHRoYXQKLSAqIGluIGdlbmVyYWwgd2UgaG9sZCB0aGUgamluZGV4IGxvY2sgZm9yIGxvbmdlciBwZXJpb2RzIG9mIHRpbWUgYW5kCi0gKiB3ZSBncmFiIGl0IGZhciBsZXNzIGZyZXF1ZW50bHkgKGluIGdlbmVyYWwpIHRoZW4gdGhlIHJncnAgbG9jay4KLSAqCi0gKiBSZXR1cm5zOiBlcnJubwotICovCi0KLWludCBnZnMyX2ppbmRleF9ob2xkKHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBzdHJ1Y3QgZ2ZzMl9ob2xkZXIgKmppX2doKQotewotCXN0cnVjdCBnZnMyX2lub2RlICpkaXAgPSBHRlMyX0koc2RwLT5zZF9qaW5kZXgpOwotCXN0cnVjdCBxc3RyIG5hbWU7Ci0JY2hhciBidWZbMjBdOwotCXN0cnVjdCBnZnMyX2pkZXNjICpqZDsKLQlpbnQgZXJyb3I7Ci0KLQluYW1lLm5hbWUgPSBidWY7Ci0KLQltdXRleF9sb2NrKCZzZHAtPnNkX2ppbmRleF9tdXRleCk7Ci0KLQlmb3IgKDs7KSB7Ci0JCWVycm9yID0gZ2ZzMl9nbG9ja19ucV9pbml0KGRpcC0+aV9nbCwgTE1fU1RfU0hBUkVELCAwLCBqaV9naCk7Ci0JCWlmIChlcnJvcikKLQkJCWJyZWFrOwotCi0JCW5hbWUubGVuID0gc3ByaW50ZihidWYsICJqb3VybmFsJXUiLCBzZHAtPnNkX2pvdXJuYWxzKTsKLQkJbmFtZS5oYXNoID0gZ2ZzMl9kaXNrX2hhc2gobmFtZS5uYW1lLCBuYW1lLmxlbik7Ci0KLQkJZXJyb3IgPSBnZnMyX2Rpcl9jaGVjayhzZHAtPnNkX2ppbmRleCwgJm5hbWUsIE5VTEwpOwotCQlpZiAoZXJyb3IgPT0gLUVOT0VOVCkgewotCQkJZXJyb3IgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlnZnMyX2dsb2NrX2RxX3VuaW5pdChqaV9naCk7Ci0KLQkJaWYgKGVycm9yKQotCQkJYnJlYWs7Ci0KLQkJZXJyb3IgPSAtRU5PTUVNOwotCQlqZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBnZnMyX2pkZXNjKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghamQpCi0JCQlicmVhazsKLQotCQlJTklUX0xJU1RfSEVBRCgmamQtPmV4dGVudF9saXN0KTsKLQkJamQtPmpkX2lub2RlID0gZ2ZzMl9sb29rdXBpKHNkcC0+c2RfamluZGV4LCAmbmFtZSwgMSk7Ci0JCWlmICghamQtPmpkX2lub2RlIHx8IElTX0VSUihqZC0+amRfaW5vZGUpKSB7Ci0JCQlpZiAoIWpkLT5qZF9pbm9kZSkKLQkJCQllcnJvciA9IC1FTk9FTlQ7Ci0JCQllbHNlCi0JCQkJZXJyb3IgPSBQVFJfRVJSKGpkLT5qZF9pbm9kZSk7Ci0JCQlrZnJlZShqZCk7Ci0JCQlicmVhazsKLQkJfQotCi0JCXNwaW5fbG9jaygmc2RwLT5zZF9qaW5kZXhfc3Bpbik7Ci0JCWpkLT5qZF9qaWQgPSBzZHAtPnNkX2pvdXJuYWxzKys7Ci0JCWxpc3RfYWRkX3RhaWwoJmpkLT5qZF9saXN0LCAmc2RwLT5zZF9qaW5kZXhfbGlzdCk7Ci0JCXNwaW5fdW5sb2NrKCZzZHAtPnNkX2ppbmRleF9zcGluKTsKLQl9Ci0KLQltdXRleF91bmxvY2soJnNkcC0+c2RfamluZGV4X211dGV4KTsKLQotCXJldHVybiBlcnJvcjsKLX0KLQotLyoqCiAgKiBnZnMyX2ppbmRleF9mcmVlIC0gQ2xlYXIgYWxsIHRoZSBqb3VybmFsIGluZGV4IGluZm9ybWF0aW9uCiAgKiBAc2RwOiBUaGUgR0ZTMiBzdXBlcmJsb2NrCiAgKgpAQCAtMTY2LDM5ICs5Niw2IEBACiAJcmV0dXJuIGpkOwogfQogCi12b2lkIGdmczJfamRlc2NfbWFrZV9kaXJ0eShzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgdW5zaWduZWQgaW50IGppZCkKLXsKLQlzdHJ1Y3QgZ2ZzMl9qZGVzYyAqamQ7Ci0KLQlzcGluX2xvY2soJnNkcC0+c2RfamluZGV4X3NwaW4pOwotCWpkID0gamRlc2NfZmluZF9pKCZzZHAtPnNkX2ppbmRleF9saXN0LCBqaWQpOwotCWlmIChqZCkKLQkJamQtPmpkX2RpcnR5ID0gMTsKLQlzcGluX3VubG9jaygmc2RwLT5zZF9qaW5kZXhfc3Bpbik7Ci19Ci0KLXN0cnVjdCBnZnMyX2pkZXNjICpnZnMyX2pkZXNjX2ZpbmRfZGlydHkoc3RydWN0IGdmczJfc2JkICpzZHApCi17Ci0Jc3RydWN0IGdmczJfamRlc2MgKmpkOwotCWludCBmb3VuZCA9IDA7Ci0KLQlzcGluX2xvY2soJnNkcC0+c2RfamluZGV4X3NwaW4pOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShqZCwgJnNkcC0+c2RfamluZGV4X2xpc3QsIGpkX2xpc3QpIHsKLQkJaWYgKGpkLT5qZF9kaXJ0eSkgewotCQkJamQtPmpkX2RpcnR5ID0gMDsKLQkJCWZvdW5kID0gMTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXNwaW5fdW5sb2NrKCZzZHAtPnNkX2ppbmRleF9zcGluKTsKLQotCWlmICghZm91bmQpCi0JCWpkID0gTlVMTDsKLQotCXJldHVybiBqZDsKLX0KLQogaW50IGdmczJfamRlc2NfY2hlY2soc3RydWN0IGdmczJfamRlc2MgKmpkKQogewogCXN0cnVjdCBnZnMyX2lub2RlICppcCA9IEdGUzJfSShqZC0+amRfaW5vZGUpOwpAQCAtMjA2LDE0ICsxMDMsMTQgQEAKIAlpbnQgYXI7CiAJaW50IGVycm9yOwogCi0JaWYgKGlwLT5pX2RpLmRpX3NpemUgPCAoOCA8PCAyMCkgfHwgaXAtPmlfZGkuZGlfc2l6ZSA+ICgxIDw8IDMwKSB8fAotCSAgICAoaXAtPmlfZGkuZGlfc2l6ZSAmIChzZHAtPnNkX3NiLnNiX2JzaXplIC0gMSkpKSB7CisJaWYgKGlwLT5pX2Rpc2tzaXplIDwgKDggPDwgMjApIHx8IGlwLT5pX2Rpc2tzaXplID4gKDEgPDwgMzApIHx8CisJICAgIChpcC0+aV9kaXNrc2l6ZSAmIChzZHAtPnNkX3NiLnNiX2JzaXplIC0gMSkpKSB7CiAJCWdmczJfY29uc2lzdF9pbm9kZShpcCk7CiAJCXJldHVybiAtRUlPOwogCX0KLQlqZC0+amRfYmxvY2tzID0gaXAtPmlfZGkuZGlfc2l6ZSA+PiBzZHAtPnNkX3NiLnNiX2JzaXplX3NoaWZ0OworCWpkLT5qZF9ibG9ja3MgPSBpcC0+aV9kaXNrc2l6ZSA+PiBzZHAtPnNkX3NiLnNiX2JzaXplX3NoaWZ0OwogCi0JZXJyb3IgPSBnZnMyX3dyaXRlX2FsbG9jX3JlcXVpcmVkKGlwLCAwLCBpcC0+aV9kaS5kaV9zaXplLCAmYXIpOworCWVycm9yID0gZ2ZzMl93cml0ZV9hbGxvY19yZXF1aXJlZChpcCwgMCwgaXAtPmlfZGlza3NpemUsICZhcik7CiAJaWYgKCFlcnJvciAmJiBhcikgewogCQlnZnMyX2NvbnNpc3RfaW5vZGUoaXApOwogCQllcnJvciA9IC1FSU87CkBAIC00MjMsMTM3ICszMjAsNiBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotLyoqCi0gKiBnZnMyX3N0YXRmc19pIC0gRG8gYSBzdGF0ZnMKLSAqIEBzZHA6IHRoZSBmaWxlc3lzdGVtCi0gKiBAc2c6IHRoZSBzZyBzdHJ1Y3R1cmUKLSAqCi0gKiBSZXR1cm5zOiBlcnJubwotICovCi0KLWludCBnZnMyX3N0YXRmc19pKHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBzdHJ1Y3QgZ2ZzMl9zdGF0ZnNfY2hhbmdlX2hvc3QgKnNjKQotewotCXN0cnVjdCBnZnMyX3N0YXRmc19jaGFuZ2VfaG9zdCAqbV9zYyA9ICZzZHAtPnNkX3N0YXRmc19tYXN0ZXI7Ci0Jc3RydWN0IGdmczJfc3RhdGZzX2NoYW5nZV9ob3N0ICpsX3NjID0gJnNkcC0+c2Rfc3RhdGZzX2xvY2FsOwotCi0Jc3Bpbl9sb2NrKCZzZHAtPnNkX3N0YXRmc19zcGluKTsKLQotCSpzYyA9ICptX3NjOwotCXNjLT5zY190b3RhbCArPSBsX3NjLT5zY190b3RhbDsKLQlzYy0+c2NfZnJlZSArPSBsX3NjLT5zY19mcmVlOwotCXNjLT5zY19kaW5vZGVzICs9IGxfc2MtPnNjX2Rpbm9kZXM7Ci0KLQlzcGluX3VubG9jaygmc2RwLT5zZF9zdGF0ZnNfc3Bpbik7Ci0KLQlpZiAoc2MtPnNjX2ZyZWUgPCAwKQotCQlzYy0+c2NfZnJlZSA9IDA7Ci0JaWYgKHNjLT5zY19mcmVlID4gc2MtPnNjX3RvdGFsKQotCQlzYy0+c2NfZnJlZSA9IHNjLT5zY190b3RhbDsKLQlpZiAoc2MtPnNjX2Rpbm9kZXMgPCAwKQotCQlzYy0+c2NfZGlub2RlcyA9IDA7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBzdGF0ZnNfZmlsbCAtIGZpbGwgaW4gdGhlIHNnIGZvciBhIGdpdmVuIFJHCi0gKiBAcmdkOiB0aGUgUkcKLSAqIEBzYzogdGhlIHNjIHN0cnVjdHVyZQotICoKLSAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgLUVTVEFMRSBpZiB0aGUgTFZCIGlzIGludmFsaWQKLSAqLwotCi1zdGF0aWMgaW50IHN0YXRmc19zbG93X2ZpbGwoc3RydWN0IGdmczJfcmdycGQgKnJnZCwKLQkJCSAgICBzdHJ1Y3QgZ2ZzMl9zdGF0ZnNfY2hhbmdlX2hvc3QgKnNjKQotewotCWdmczJfcmdycF92ZXJpZnkocmdkKTsKLQlzYy0+c2NfdG90YWwgKz0gcmdkLT5yZF9kYXRhOwotCXNjLT5zY19mcmVlICs9IHJnZC0+cmRfcmcucmdfZnJlZTsKLQlzYy0+c2NfZGlub2RlcyArPSByZ2QtPnJkX3JnLnJnX2Rpbm9kZXM7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogZ2ZzMl9zdGF0ZnNfc2xvdyAtIFN0YXQgYSBmaWxlc3lzdGVtIHVzaW5nIGFzeW5jaHJvbm91cyBsb2NraW5nCi0gKiBAc2RwOiB0aGUgZmlsZXN5c3RlbQotICogQHNjOiB0aGUgc2MgaW5mbyB0aGF0IHdpbGwgYmUgcmV0dXJuZWQKLSAqCi0gKiBBbnkgZXJyb3IgKG90aGVyIHRoYW4gYSBzaWduYWwpIHdpbGwgY2F1c2UgdGhpcyByb3V0aW5lIHRvIGZhbGwgYmFjawotICogdG8gdGhlIHN5bmNocm9ub3VzIHZlcnNpb24uCi0gKgotICogRklYTUU6IFRoaXMgcmVhbGx5IHNob3VsZG4ndCBidXN5IHdhaXQgbGlrZSB0aGlzLgotICoKLSAqIFJldHVybnM6IGVycm5vCi0gKi8KLQotaW50IGdmczJfc3RhdGZzX3Nsb3coc3RydWN0IGdmczJfc2JkICpzZHAsIHN0cnVjdCBnZnMyX3N0YXRmc19jaGFuZ2VfaG9zdCAqc2MpCi17Ci0Jc3RydWN0IGdmczJfaG9sZGVyIHJpX2doOwotCXN0cnVjdCBnZnMyX3JncnBkICpyZ2RfbmV4dDsKLQlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgKmdoYSwgKmdoOwotCXVuc2lnbmVkIGludCBzbG90cyA9IDY0OwotCXVuc2lnbmVkIGludCB4OwotCWludCBkb25lOwotCWludCBlcnJvciA9IDAsIGVycjsKLQotCW1lbXNldChzYywgMCwgc2l6ZW9mKHN0cnVjdCBnZnMyX3N0YXRmc19jaGFuZ2VfaG9zdCkpOwotCWdoYSA9IGtjYWxsb2Moc2xvdHMsIHNpemVvZihzdHJ1Y3QgZ2ZzMl9ob2xkZXIpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWdoYSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQllcnJvciA9IGdmczJfcmluZGV4X2hvbGQoc2RwLCAmcmlfZ2gpOwotCWlmIChlcnJvcikKLQkJZ290byBvdXQ7Ci0KLQlyZ2RfbmV4dCA9IGdmczJfcmdycGRfZ2V0X2ZpcnN0KHNkcCk7Ci0KLQlmb3IgKDs7KSB7Ci0JCWRvbmUgPSAxOwotCi0JCWZvciAoeCA9IDA7IHggPCBzbG90czsgeCsrKSB7Ci0JCQlnaCA9IGdoYSArIHg7Ci0KLQkJCWlmIChnaC0+Z2hfZ2wgJiYgZ2ZzMl9nbG9ja19wb2xsKGdoKSkgewotCQkJCWVyciA9IGdmczJfZ2xvY2tfd2FpdChnaCk7Ci0JCQkJaWYgKGVycikgewotCQkJCQlnZnMyX2hvbGRlcl91bmluaXQoZ2gpOwotCQkJCQllcnJvciA9IGVycjsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoIWVycm9yKQotCQkJCQkJZXJyb3IgPSBzdGF0ZnNfc2xvd19maWxsKAotCQkJCQkJCWdoLT5naF9nbC0+Z2xfb2JqZWN0LCBzYyk7Ci0JCQkJCWdmczJfZ2xvY2tfZHFfdW5pbml0KGdoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChnaC0+Z2hfZ2wpCi0JCQkJZG9uZSA9IDA7Ci0JCQllbHNlIGlmIChyZ2RfbmV4dCAmJiAhZXJyb3IpIHsKLQkJCQllcnJvciA9IGdmczJfZ2xvY2tfbnFfaW5pdChyZ2RfbmV4dC0+cmRfZ2wsCi0JCQkJCQkJICAgTE1fU1RfU0hBUkVELAotCQkJCQkJCSAgIEdMX0FTWU5DLAotCQkJCQkJCSAgIGdoKTsKLQkJCQlyZ2RfbmV4dCA9IGdmczJfcmdycGRfZ2V0X25leHQocmdkX25leHQpOwotCQkJCWRvbmUgPSAwOwotCQkJfQotCi0JCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQkJZXJyb3IgPSAtRVJFU1RBUlRTWVM7Ci0JCX0KLQotCQlpZiAoZG9uZSkKLQkJCWJyZWFrOwotCi0JCXlpZWxkKCk7Ci0JfQotCi0JZ2ZzMl9nbG9ja19kcV91bmluaXQoJnJpX2doKTsKLQotb3V0OgotCWtmcmVlKGdoYSk7Ci0JcmV0dXJuIGVycm9yOwotfQotCiBzdHJ1Y3QgbGZjYyB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXN0cnVjdCBnZnMyX2hvbGRlciBnaDsKQEAgLTU4MCwxMCArMzQ2LDYgQEAKIAlzdHJ1Y3QgZ2ZzMl9sb2dfaGVhZGVyX2hvc3QgbGg7CiAJaW50IGVycm9yOwogCi0JZXJyb3IgPSBnZnMyX2ppbmRleF9ob2xkKHNkcCwgJmppX2doKTsKLQlpZiAoZXJyb3IpCi0JCXJldHVybiBlcnJvcjsKLQogCWxpc3RfZm9yX2VhY2hfZW50cnkoamQsICZzZHAtPnNkX2ppbmRleF9saXN0LCBqZF9saXN0KSB7CiAJCWxmY2MgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbGZjYyksIEdGUF9LRVJORUwpOwogCQlpZiAoIWxmY2MpIHsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvc3VwZXIuaCBiL2ZzL2dmczIvc3VwZXIuaAppbmRleCA1MGE0YzliLi5mNmI4YjAwIDEwMDY0NAotLS0gYS9mcy9nZnMyL3N1cGVyLmgKKysrIGIvZnMvZ2ZzMi9zdXBlci5oCkBAIC0xMCw2ICsxMCw4IEBACiAjaWZuZGVmIF9fU1VQRVJfRE9UX0hfXwogI2RlZmluZSBfX1NVUEVSX0RPVF9IX18KIAorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+CiAjaW5jbHVkZSAiaW5jb3JlLmgiCiAKIHZvaWQgZ2ZzMl9sbV91bm1vdW50KHN0cnVjdCBnZnMyX3NiZCAqc2RwKTsKQEAgLTIzLDEyICsyNSw5IEBACiAJcmV0dXJuIHg7CiB9CiAKLWludCBnZnMyX2ppbmRleF9ob2xkKHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBzdHJ1Y3QgZ2ZzMl9ob2xkZXIgKmppX2doKTsKIHZvaWQgZ2ZzMl9qaW5kZXhfZnJlZShzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCk7CiAKIHN0cnVjdCBnZnMyX2pkZXNjICpnZnMyX2pkZXNjX2ZpbmQoc3RydWN0IGdmczJfc2JkICpzZHAsIHVuc2lnbmVkIGludCBqaWQpOwotdm9pZCBnZnMyX2pkZXNjX21ha2VfZGlydHkoc3RydWN0IGdmczJfc2JkICpzZHAsIHVuc2lnbmVkIGludCBqaWQpOwotc3RydWN0IGdmczJfamRlc2MgKmdmczJfamRlc2NfZmluZF9kaXJ0eShzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCk7CiBpbnQgZ2ZzMl9qZGVzY19jaGVjayhzdHJ1Y3QgZ2ZzMl9qZGVzYyAqamQpOwogCiBpbnQgZ2ZzMl9sb29rdXBfaW5fbWFzdGVyX2RpcihzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgY2hhciAqZmlsZW5hbWUsCkBAIC00MCwxMSArMzksMTUgQEAKIHZvaWQgZ2ZzMl9zdGF0ZnNfY2hhbmdlKHN0cnVjdCBnZnMyX3NiZCAqc2RwLAogCQkJczY0IHRvdGFsLCBzNjQgZnJlZSwgczY0IGRpbm9kZXMpOwogaW50IGdmczJfc3RhdGZzX3N5bmMoc3RydWN0IGdmczJfc2JkICpzZHApOwotaW50IGdmczJfc3RhdGZzX2koc3RydWN0IGdmczJfc2JkICpzZHAsIHN0cnVjdCBnZnMyX3N0YXRmc19jaGFuZ2VfaG9zdCAqc2MpOwotaW50IGdmczJfc3RhdGZzX3Nsb3coc3RydWN0IGdmczJfc2JkICpzZHAsIHN0cnVjdCBnZnMyX3N0YXRmc19jaGFuZ2VfaG9zdCAqc2MpOwogCiBpbnQgZ2ZzMl9mcmVlemVfZnMoc3RydWN0IGdmczJfc2JkICpzZHApOwogdm9pZCBnZnMyX3VuZnJlZXplX2ZzKHN0cnVjdCBnZnMyX3NiZCAqc2RwKTsKIAorZXh0ZXJuIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGdmczJfZnNfdHlwZTsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBnZnMybWV0YV9mc190eXBlOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyBnZnMyX2V4cG9ydF9vcHM7CitleHRlcm4gY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgZ2ZzMl9zdXBlcl9vcHM7CitleHRlcm4gc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGdmczJfZG9wczsKKwogI2VuZGlmIC8qIF9fU1VQRVJfRE9UX0hfXyAqLwogCmRpZmYgLS1naXQgYS9mcy9nZnMyL3N5cy5jIGIvZnMvZ2ZzMi9zeXMuYwppbmRleCA3ZTE4NzlmLi4yNmMxZmE3IDEwMDY0NAotLS0gYS9mcy9nZnMyL3N5cy5jCisrKyBiL2ZzL2dmczIvc3lzLmMKQEAgLTI2LDkgKzI2LDYgQEAKICNpbmNsdWRlICJxdW90YS5oIgogI2luY2x1ZGUgInV0aWwuaCIKIAotY2hhciAqZ2ZzMl9zeXNfbWFyZ3M7Ci1zcGlubG9ja190IGdmczJfc3lzX21hcmdzX2xvY2s7Ci0KIHN0YXRpYyBzc2l6ZV90IGlkX3Nob3coc3RydWN0IGdmczJfc2JkICpzZHAsIGNoYXIgKmJ1ZikKIHsKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIldToldVxuIiwKQEAgLTI2Myw3ICsyNjAsNiBAQAogQVJHU19BVFRSKGxvY2FsZmxvY2tzLCAgICAgIiVkXG4iKTsKIEFSR1NfQVRUUihkZWJ1ZywgICAgICAgICAgICIlZFxuIik7CiBBUkdTX0FUVFIodXBncmFkZSwgICAgICAgICAiJWRcbiIpOwotQVJHU19BVFRSKG51bV9nbG9ja2QsICAgICAgIiV1XG4iKTsKIEFSR1NfQVRUUihwb3NpeF9hY2wsICAgICAgICIlZFxuIik7CiBBUkdTX0FUVFIocXVvdGEsICAgICAgICAgICAiJXVcbiIpOwogQVJHU19BVFRSKHN1aWRkaXIsICAgICAgICAgIiVkXG4iKTsKQEAgLTI3OSw3ICsyNzUsNiBAQAogCSZhcmdzX2F0dHJfbG9jYWxmbG9ja3MuYXR0ciwKIAkmYXJnc19hdHRyX2RlYnVnLmF0dHIsCiAJJmFyZ3NfYXR0cl91cGdyYWRlLmF0dHIsCi0JJmFyZ3NfYXR0cl9udW1fZ2xvY2tkLmF0dHIsCiAJJmFyZ3NfYXR0cl9wb3NpeF9hY2wuYXR0ciwKIAkmYXJnc19hdHRyX3F1b3RhLmF0dHIsCiAJJmFyZ3NfYXR0cl9zdWlkZGlyLmF0dHIsCkBAIC0yODgsMzAgKzI4Myw2IEBACiB9OwogCiAvKgotICogZGlzcGxheSBjb3VudGVycyBmcm9tIHN1cGVyYmxvY2sKLSAqLwotCi1zdHJ1Y3QgY291bnRlcnNfYXR0ciB7Ci0Jc3RydWN0IGF0dHJpYnV0ZSBhdHRyOwotCXNzaXplX3QgKCpzaG93KShzdHJ1Y3QgZ2ZzMl9zYmQgKiwgY2hhciAqKTsKLX07Ci0KLSNkZWZpbmUgQ09VTlRFUlNfQVRUUihuYW1lLCBmbXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1zdGF0aWMgc3NpemVfdCBuYW1lIyNfc2hvdyhzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgY2hhciAqYnVmKSAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsIGZtdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCSh1bnNpZ25lZCBpbnQpYXRvbWljX3JlYWQoJnNkcC0+c2RfIyNuYW1lKSk7ICAgICAgICBcCi19ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotc3RhdGljIHN0cnVjdCBjb3VudGVyc19hdHRyIGNvdW50ZXJzX2F0dHJfIyNuYW1lID0gX19BVFRSX1JPKG5hbWUpCi0KLUNPVU5URVJTX0FUVFIocmVjbGFpbWVkLCAgICAgICAgIiV1XG4iKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmNvdW50ZXJzX2F0dHJzW10gPSB7Ci0JJmNvdW50ZXJzX2F0dHJfcmVjbGFpbWVkLmF0dHIsCi0JTlVMTCwKLX07Ci0KLS8qCiAgKiBnZXQgYW5kIHNldCBzdHJ1Y3QgZ2ZzMl90dW5lIGZpZWxkcwogICovCiAKQEAgLTM5Myw3ICszNjQsNiBAQAogfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogVFVORV9BVFRSXzIobmFtZSwgbmFtZSMjX3N0b3JlKQogCi1UVU5FX0FUVFIoZGVtb3RlX3NlY3MsIDApOwogVFVORV9BVFRSKGluY29yZV9sb2dfYmxvY2tzLCAwKTsKIFRVTkVfQVRUUihsb2dfZmx1c2hfc2VjcywgMCk7CiBUVU5FX0FUVFIocXVvdGFfd2Fybl9wZXJpb2QsIDApOwpAQCAtNDA4LDExICszNzgsOSBAQAogVFVORV9BVFRSKHN0YXRmc19xdWFudHVtLCAxKTsKIFRVTkVfQVRUUl9EQUVNT04ocmVjb3ZlcmRfc2VjcywgcmVjb3ZlcmRfcHJvY2Vzcyk7CiBUVU5FX0FUVFJfREFFTU9OKGxvZ2Rfc2VjcywgbG9nZF9wcm9jZXNzKTsKLVRVTkVfQVRUUl9EQUVNT04ocXVvdGFkX3NlY3MsIHF1b3RhZF9wcm9jZXNzKTsKIFRVTkVfQVRUUl8zKHF1b3RhX3NjYWxlLCBxdW90YV9zY2FsZV9zaG93LCBxdW90YV9zY2FsZV9zdG9yZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp0dW5lX2F0dHJzW10gPSB7Ci0JJnR1bmVfYXR0cl9kZW1vdGVfc2Vjcy5hdHRyLAogCSZ0dW5lX2F0dHJfaW5jb3JlX2xvZ19ibG9ja3MuYXR0ciwKIAkmdHVuZV9hdHRyX2xvZ19mbHVzaF9zZWNzLmF0dHIsCiAJJnR1bmVfYXR0cl9xdW90YV93YXJuX3BlcmlvZC5hdHRyLApAQCAtNDI2LDcgKzM5NCw2IEBACiAJJnR1bmVfYXR0cl9zdGF0ZnNfcXVhbnR1bS5hdHRyLAogCSZ0dW5lX2F0dHJfcmVjb3ZlcmRfc2Vjcy5hdHRyLAogCSZ0dW5lX2F0dHJfbG9nZF9zZWNzLmF0dHIsCi0JJnR1bmVfYXR0cl9xdW90YWRfc2Vjcy5hdHRyLAogCSZ0dW5lX2F0dHJfcXVvdGFfc2NhbGUuYXR0ciwKIAkmdHVuZV9hdHRyX25ld19maWxlc19qZGF0YS5hdHRyLAogCU5VTEwsCkBAIC00MzcsMTEgKzQwNCw2IEBACiAJLmF0dHJzID0gbG9ja3N0cnVjdF9hdHRycywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGNvdW50ZXJzX2dyb3VwID0gewotCS5uYW1lID0gImNvdW50ZXJzIiwKLQkuYXR0cnMgPSBjb3VudGVyc19hdHRycywKLX07Ci0KIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFyZ3NfZ3JvdXAgPSB7CiAJLm5hbWUgPSAiYXJncyIsCiAJLmF0dHJzID0gYXJnc19hdHRycywKQEAgLTQ2NiwxMyArNDI4LDkgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZmFpbF9yZWc7CiAKLQllcnJvciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmc2RwLT5zZF9rb2JqLCAmY291bnRlcnNfZ3JvdXApOwotCWlmIChlcnJvcikKLQkJZ290byBmYWlsX2xvY2tzdHJ1Y3Q7Ci0KIAllcnJvciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmc2RwLT5zZF9rb2JqLCAmYXJnc19ncm91cCk7CiAJaWYgKGVycm9yKQotCQlnb3RvIGZhaWxfY291bnRlcnM7CisJCWdvdG8gZmFpbF9sb2Nrc3RydWN0OwogCiAJZXJyb3IgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnNkcC0+c2Rfa29iaiwgJnR1bmVfZ3JvdXApOwogCWlmIChlcnJvcikKQEAgLTQ4Myw4ICs0NDEsNiBAQAogCiBmYWlsX2FyZ3M6CiAJc3lzZnNfcmVtb3ZlX2dyb3VwKCZzZHAtPnNkX2tvYmosICZhcmdzX2dyb3VwKTsKLWZhaWxfY291bnRlcnM6Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZzZHAtPnNkX2tvYmosICZjb3VudGVyc19ncm91cCk7CiBmYWlsX2xvY2tzdHJ1Y3Q6CiAJc3lzZnNfcmVtb3ZlX2dyb3VwKCZzZHAtPnNkX2tvYmosICZsb2Nrc3RydWN0X2dyb3VwKTsKIGZhaWxfcmVnOgpAQCAtNDk4LDE2ICs0NTQsMjcgQEAKIHsKIAlzeXNmc19yZW1vdmVfZ3JvdXAoJnNkcC0+c2Rfa29iaiwgJnR1bmVfZ3JvdXApOwogCXN5c2ZzX3JlbW92ZV9ncm91cCgmc2RwLT5zZF9rb2JqLCAmYXJnc19ncm91cCk7Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZzZHAtPnNkX2tvYmosICZjb3VudGVyc19ncm91cCk7CiAJc3lzZnNfcmVtb3ZlX2dyb3VwKCZzZHAtPnNkX2tvYmosICZsb2Nrc3RydWN0X2dyb3VwKTsKIAlrb2JqZWN0X3B1dCgmc2RwLT5zZF9rb2JqKTsKIH0KIAorc3RhdGljIGludCBnZnMyX3VldmVudChzdHJ1Y3Qga3NldCAqa3NldCwgc3RydWN0IGtvYmplY3QgKmtvYmosCisJCSAgICAgICBzdHJ1Y3Qga29ial91ZXZlbnRfZW52ICplbnYpCit7CisJc3RydWN0IGdmczJfc2JkICpzZHAgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGdmczJfc2JkLCBzZF9rb2JqKTsKKwlhZGRfdWV2ZW50X3ZhcihlbnYsICJMT0NLVEFCTEU9JXMiLCBzZHAtPnNkX3RhYmxlX25hbWUpOworCWFkZF91ZXZlbnRfdmFyKGVudiwgIkxPQ0tQUk9UTz0lcyIsIHNkcC0+c2RfcHJvdG9fbmFtZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qga3NldF91ZXZlbnRfb3BzIGdmczJfdWV2ZW50X29wcyA9IHsKKwkudWV2ZW50ID0gZ2ZzMl91ZXZlbnQsCit9OworCisKIGludCBnZnMyX3N5c19pbml0KHZvaWQpCiB7Ci0JZ2ZzMl9zeXNfbWFyZ3MgPSBOVUxMOwotCXNwaW5fbG9ja19pbml0KCZnZnMyX3N5c19tYXJnc19sb2NrKTsKLQlnZnMyX2tzZXQgPSBrc2V0X2NyZWF0ZV9hbmRfYWRkKCJnZnMyIiwgTlVMTCwgZnNfa29iaik7CisJZ2ZzMl9rc2V0ID0ga3NldF9jcmVhdGVfYW5kX2FkZCgiZ2ZzMiIsICZnZnMyX3VldmVudF9vcHMsIGZzX2tvYmopOwogCWlmICghZ2ZzMl9rc2V0KQogCQlyZXR1cm4gLUVOT01FTTsKIAlyZXR1cm4gMDsKQEAgLTUxNSw3ICs0ODIsNiBAQAogCiB2b2lkIGdmczJfc3lzX3VuaW5pdCh2b2lkKQogewotCWtmcmVlKGdmczJfc3lzX21hcmdzKTsKIAlrc2V0X3VucmVnaXN0ZXIoZ2ZzMl9rc2V0KTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9zeXMuaCBiL2ZzL2dmczIvc3lzLmgKaW5kZXggMWNhOGNkYS4uZTk0NTYwZSAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9zeXMuaAorKysgYi9mcy9nZnMyL3N5cy5oCkBAIC0xMywxMCArMTMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiBzdHJ1Y3QgZ2ZzMl9zYmQ7CiAKLS8qIEFsbG93IGFyZ3MgdG8gYmUgcGFzc2VkIHRvIEdGUzIgd2hlbiB1c2luZyBhbiBpbml0aWFsIHJhbSBkaXNrICovCi1leHRlcm4gY2hhciAqZ2ZzMl9zeXNfbWFyZ3M7Ci1leHRlcm4gc3BpbmxvY2tfdCBnZnMyX3N5c19tYXJnc19sb2NrOwotCiBpbnQgZ2ZzMl9zeXNfZnNfYWRkKHN0cnVjdCBnZnMyX3NiZCAqc2RwKTsKIHZvaWQgZ2ZzMl9zeXNfZnNfZGVsKHN0cnVjdCBnZnMyX3NiZCAqc2RwKTsKIApkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi91dGlsLmMgYi9mcy9nZnMyL3V0aWwuYwppbmRleCBkMzFlMzU1Li4zNzRmNTBlIDEwMDY0NAotLS0gYS9mcy9nZnMyL3V0aWwuYworKysgYi9mcy9nZnMyL3V0aWwuYwpAQCAtMjUsNiArMjUsNyBAQAogc3RydWN0IGttZW1fY2FjaGUgKmdmczJfaW5vZGVfY2FjaGVwIF9fcmVhZF9tb3N0bHk7CiBzdHJ1Y3Qga21lbV9jYWNoZSAqZ2ZzMl9idWZkYXRhX2NhY2hlcCBfX3JlYWRfbW9zdGx5Owogc3RydWN0IGttZW1fY2FjaGUgKmdmczJfcmdycGRfY2FjaGVwIF9fcmVhZF9tb3N0bHk7CitzdHJ1Y3Qga21lbV9jYWNoZSAqZ2ZzMl9xdW90YWRfY2FjaGVwIF9fcmVhZF9tb3N0bHk7CiAKIHZvaWQgZ2ZzMl9hc3NlcnRfaShzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCkKIHsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvdXRpbC5oIGIvZnMvZ2ZzMi91dGlsLmgKaW5kZXggN2Y0ODU3Ni4uMzNlOTZiMCAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi91dGlsLmgKKysrIGIvZnMvZ2ZzMi91dGlsLmgKQEAgLTE0OCw2ICsxNDgsNyBAQAogZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICpnZnMyX2lub2RlX2NhY2hlcDsKIGV4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqZ2ZzMl9idWZkYXRhX2NhY2hlcDsKIGV4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqZ2ZzMl9yZ3JwZF9jYWNoZXA7CitleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKmdmczJfcXVvdGFkX2NhY2hlcDsKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2ZzMl90dW5lX2dldF9pKHN0cnVjdCBnZnMyX3R1bmUgKmd0LAogCQkJCQkgICB1bnNpZ25lZCBpbnQgKnApCmRpZmYgLS1naXQgYS9mcy9odWdldGxiZnMvaW5vZGUuYyBiL2ZzL2h1Z2V0bGJmcy9pbm9kZS5jCmluZGV4IDdkNDc5Y2UuLjY5MDNkMzcgMTAwNjQ0Ci0tLSBhL2ZzL2h1Z2V0bGJmcy9pbm9kZS5jCisrKyBiL2ZzL2h1Z2V0bGJmcy9pbm9kZS5jCkBAIC0yNTIsNiArMjUyLDcgQEAKIAlmb3IgKDs7KSB7CiAJCXN0cnVjdCBwYWdlICpwYWdlOwogCQl1bnNpZ25lZCBsb25nIG5yLCByZXQ7CisJCWludCByYTsKIAogCQkvKiBuciBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gY29weSBmcm9tIHRoaXMgcGFnZSAqLwogCQluciA9IGh1Z2VfcGFnZV9zaXplKGgpOwpAQCAtMjc0LDE2ICsyNzUsMTkgQEAKIAkJCSAqLwogCQkJcmV0ID0gbGVuIDwgbnIgPyBsZW4gOiBucjsKIAkJCWlmIChjbGVhcl91c2VyKGJ1ZiwgcmV0KSkKLQkJCQlyZXQgPSAtRUZBVUxUOworCQkJCXJhID0gLUVGQVVMVDsKKwkJCWVsc2UKKwkJCQlyYSA9IDA7CiAJCX0gZWxzZSB7CiAJCQkvKgogCQkJICogV2UgaGF2ZSB0aGUgcGFnZSwgY29weSBpdCB0byB1c2VyIHNwYWNlIGJ1ZmZlci4KIAkJCSAqLwotCQkJcmV0ID0gaHVnZXRsYmZzX3JlYWRfYWN0b3IocGFnZSwgb2Zmc2V0LCBidWYsIGxlbiwgbnIpOworCQkJcmEgPSBodWdldGxiZnNfcmVhZF9hY3RvcihwYWdlLCBvZmZzZXQsIGJ1ZiwgbGVuLCBucik7CisJCQlyZXQgPSByYTsKIAkJfQotCQlpZiAocmV0IDwgMCkgeworCQlpZiAocmEgPCAwKSB7CiAJCQlpZiAocmV0dmFsID09IDApCi0JCQkJcmV0dmFsID0gcmV0OworCQkJCXJldHZhbCA9IHJhOwogCQkJaWYgKHBhZ2UpCiAJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwogCQkJZ290byBvdXQ7CkBAIC01MDYsNyArNTEwLDYgQEAKIAkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CiAJCWlub2RlLT5pX3VpZCA9IHVpZDsKIAkJaW5vZGUtPmlfZ2lkID0gZ2lkOwotCQlpbm9kZS0+aV9ibG9ja3MgPSAwOwogCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZodWdldGxiZnNfYW9wczsKIAkJaW5vZGUtPmlfbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbyA9Jmh1Z2V0bGJmc19iYWNraW5nX2Rldl9pbmZvOwogCQlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CmRpZmYgLS1naXQgYS9mcy9pbm9kZS5jIGIvZnMvaW5vZGUuYwppbmRleCA3ZGUxY2RhLi4wMDEzYWMxIDEwMDY0NAotLS0gYS9mcy9pbm9kZS5jCisrKyBiL2ZzL2lub2RlLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvaW5vdGlmeS5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvYXN5bmMuaD4KIAogLyoKICAqIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKQEAgLTExMCw4ICsxMTEsOCBAQAogCiAvKioKICAqIGlub2RlX2luaXRfYWx3YXlzIC0gcGVyZm9ybSBpbm9kZSBzdHJ1Y3R1cmUgaW50aWFsaXNhdGlvbgotICogQHNiCQktIHN1cGVyYmxvY2sgaW5vZGUgYmVsb25ncyB0by4KLSAqIEBpbm9kZQktIGlub2RlIHRvIGluaXRpYWxpc2UKKyAqIEBzYjogc3VwZXJibG9jayBpbm9kZSBiZWxvbmdzIHRvCisgKiBAaW5vZGU6IGlub2RlIHRvIGluaXRpYWxpc2UKICAqCiAgKiBUaGVzZSBhcmUgaW5pdGlhbGl6YXRpb25zIHRoYXQgbmVlZCB0byBiZSBkb25lIG9uIGV2ZXJ5IGlub2RlCiAgKiBhbGxvY2F0aW9uIGFzIHRoZSBmaWVsZHMgYXJlIG5vdCBpbml0aWFsaXNlZCBieSBzbGFiIGFsbG9jYXRpb24uCkBAIC0xMzEsNiArMTMyLDggQEAKIAlpbm9kZS0+aV9vcCA9ICZlbXB0eV9pb3BzOwogCWlub2RlLT5pX2ZvcCA9ICZlbXB0eV9mb3BzOwogCWlub2RlLT5pX25saW5rID0gMTsKKwlpbm9kZS0+aV91aWQgPSAwOworCWlub2RlLT5pX2dpZCA9IDA7CiAJYXRvbWljX3NldCgmaW5vZGUtPmlfd3JpdGVjb3VudCwgMCk7CiAJaW5vZGUtPmlfc2l6ZSA9IDA7CiAJaW5vZGUtPmlfYmxvY2tzID0gMDsKQEAgLTE2NCw3ICsxNjcsNyBAQAogCW1hcHBpbmctPmFfb3BzID0gJmVtcHR5X2FvcHM7CiAJbWFwcGluZy0+aG9zdCA9IGlub2RlOwogCW1hcHBpbmctPmZsYWdzID0gMDsKLQltYXBwaW5nX3NldF9nZnBfbWFzayhtYXBwaW5nLCBHRlBfSElHSFVTRVJfUEFHRUNBQ0hFKTsKKwltYXBwaW5nX3NldF9nZnBfbWFzayhtYXBwaW5nLCBHRlBfSElHSFVTRVJfTU9WQUJMRSk7CiAJbWFwcGluZy0+YXNzb2NfbWFwcGluZyA9IE5VTEw7CiAJbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbyA9ICZkZWZhdWx0X2JhY2tpbmdfZGV2X2luZm87CiAJbWFwcGluZy0+d3JpdGViYWNrX2luZGV4ID0gMDsKQEAgLTU3NCw4ICs1NzcsOCBAQAogCiAvKioKICAqIGlub2RlX2FkZF90b19saXN0cyAtIGFkZCBhIG5ldyBpbm9kZSB0byByZWxldmFudCBsaXN0cwotICogQHNiCQktIHN1cGVyYmxvY2sgaW5vZGUgYmVsb25ncyB0by4KLSAqIEBpbm9kZQktIGlub2RlIHRvIG1hcmsgaW4gdXNlCisgKiBAc2I6IHN1cGVyYmxvY2sgaW5vZGUgYmVsb25ncyB0bworICogQGlub2RlOiBpbm9kZSB0byBtYXJrIGluIHVzZQogICoKICAqIFdoZW4gYW4gaW5vZGUgaXMgYWxsb2NhdGVkIGl0IG5lZWRzIHRvIGJlIGFjY291bnRlZCBmb3IsIGFkZGVkIHRvIHRoZSBpbiB1c2UKICAqIGxpc3QsIHRoZSBvd25pbmcgc3VwZXJibG9jayBhbmQgdGhlIGlub2RlIGhhc2guIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSB1bmRlcgpAQCAtNTk5LDcgKzYwMiw3IEBACiAgKglAc2I6IHN1cGVyYmxvY2sKICAqCiAgKglBbGxvY2F0ZXMgYSBuZXcgaW5vZGUgZm9yIGdpdmVuIHN1cGVyYmxvY2suIFRoZSBkZWZhdWx0IGdmcF9tYXNrCi0gKglmb3IgYWxsb2NhdGlvbnMgcmVsYXRlZCB0byBpbm9kZS0+aV9tYXBwaW5nIGlzIEdGUF9ISUdIVVNFUl9QQUdFQ0FDSEUuCisgKglmb3IgYWxsb2NhdGlvbnMgcmVsYXRlZCB0byBpbm9kZS0+aV9tYXBwaW5nIGlzIEdGUF9ISUdIVVNFUl9NT1ZBQkxFLgogICoJSWYgSElHSE1FTSBwYWdlcyBhcmUgdW5zdWl0YWJsZSBvciBpdCBpcyBrbm93biB0aGF0IHBhZ2VzIGFsbG9jYXRlZAogICoJZm9yIHRoZSBwYWdlIGNhY2hlIGFyZSBub3QgcmVjbGFpbWFibGUgb3IgbWlncmF0YWJsZSwKICAqCW1hcHBpbmdfc2V0X2dmcF9tYXNrKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBzdWl0YWJsZSBmbGFncyBvbiB0aGUKQEAgLTExMzYsMTYgKzExMzksMTEgQEAKICAqIElfRlJFRUlORyBpcyBzZXQgc28gdGhhdCBuby1vbmUgd2lsbCB0YWtlIGEgbmV3IHJlZmVyZW5jZSB0byB0aGUgaW5vZGUgd2hpbGUKICAqIGl0IGlzIGJlaW5nIGRlbGV0ZWQuCiAgKi8KLXZvaWQgZ2VuZXJpY19kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3N0YXRpYyB2b2lkIGdlbmVyaWNfZGVsZXRlX2lub2RlX2FzeW5jKHZvaWQgKmRhdGEsIGFzeW5jX2Nvb2tpZV90IGNvb2tpZSkKIHsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGF0YTsKIAljb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyAqb3AgPSBpbm9kZS0+aV9zYi0+c19vcDsKIAotCWxpc3RfZGVsX2luaXQoJmlub2RlLT5pX2xpc3QpOwotCWxpc3RfZGVsX2luaXQoJmlub2RlLT5pX3NiX2xpc3QpOwotCWlub2RlLT5pX3N0YXRlIHw9IElfRlJFRUlORzsKLQlpbm9kZXNfc3RhdC5ucl9pbm9kZXMtLTsKLQlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7Ci0KIAlzZWN1cml0eV9pbm9kZV9kZWxldGUoaW5vZGUpOwogCiAJaWYgKG9wLT5kZWxldGVfaW5vZGUpIHsKQEAgLTExNjksNiArMTE2NywxNiBAQAogCWRlc3Ryb3lfaW5vZGUoaW5vZGUpOwogfQogCit2b2lkIGdlbmVyaWNfZGVsZXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJbGlzdF9kZWxfaW5pdCgmaW5vZGUtPmlfbGlzdCk7CisJbGlzdF9kZWxfaW5pdCgmaW5vZGUtPmlfc2JfbGlzdCk7CisJaW5vZGUtPmlfc3RhdGUgfD0gSV9GUkVFSU5HOworCWlub2Rlc19zdGF0Lm5yX2lub2Rlcy0tOworCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKKwlhc3luY19zY2hlZHVsZV9zcGVjaWFsKGdlbmVyaWNfZGVsZXRlX2lub2RlX2FzeW5jLCBpbm9kZSwgJmlub2RlLT5pX3NiLT5zX2FzeW5jX2xpc3QpOworfQorCiBFWFBPUlRfU1lNQk9MKGdlbmVyaWNfZGVsZXRlX2lub2RlKTsKIAogc3RhdGljIHZvaWQgZ2VuZXJpY19mb3JnZXRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKZGlmZiAtLWdpdCBhL2ZzL2lvY3RsLmMgYi9mcy9pb2N0bC5jCmluZGV4IDQzZThiMmMuLmNjM2YxYWEgMTAwNjQ0Ci0tLSBhL2ZzL2lvY3RsLmMKKysrIGIvZnMvaW9jdGwuYwpAQCAtMjMxLDcgKzIzMSw4IEBACiAjZGVmaW5lIGJsa190b19sb2dpY2FsKGlub2RlLCBibGspIChibGsgPDwgKGlub2RlKS0+aV9ibGtiaXRzKQogI2RlZmluZSBsb2dpY2FsX3RvX2Jsayhpbm9kZSwgb2Zmc2V0KSAob2Zmc2V0ID4+IChpbm9kZSktPmlfYmxrYml0cyk7CiAKLS8qCisvKioKKyAqIF9fZ2VuZXJpY19ibG9ja19maWVtYXAgLSBGSUVNQVAgZm9yIGJsb2NrIGJhc2VkIGlub2RlcyAobm8gbG9ja2luZykKICAqIEBpbm9kZSAtIHRoZSBpbm9kZSB0byBtYXAKICAqIEBhcmcgLSB0aGUgcG9pbnRlciB0byB1c2Vyc3BhY2Ugd2hlcmUgd2UgY29weSBldmVyeXRoaW5nIHRvCiAgKiBAZ2V0X2Jsb2NrIC0gdGhlIGZzJ3MgZ2V0X2Jsb2NrIGZ1bmN0aW9uCkBAIC0yNDIsMTEgKzI0MywxNSBAQAogICoKICAqIElmIGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgZGF0YSBibG9ja3MgYmV5b25kIGEgaG9sZSBwYXN0IEBpbm9kZS0+aV9zaXplLCB0aGVuCiAgKiBwbGVhc2UgZG8gbm90IHVzZSB0aGlzIGZ1bmN0aW9uLCBpdCB3aWxsIHN0b3AgYXQgdGhlIGZpcnN0IHVubWFwcGVkIGJsb2NrCi0gKiBiZXlvbmQgaV9zaXplCisgKiBiZXlvbmQgaV9zaXplLgorICoKKyAqIElmIHlvdSB1c2UgdGhpcyBmdW5jdGlvbiBkaXJlY3RseSwgeW91IG5lZWQgdG8gZG8geW91ciBvd24gbG9ja2luZy4gVXNlCisgKiBnZW5lcmljX2Jsb2NrX2ZpZW1hcCBpZiB5b3Ugd2FudCB0aGUgbG9ja2luZyBkb25lIGZvciB5b3UuCiAgKi8KLWludCBnZW5lcmljX2Jsb2NrX2ZpZW1hcChzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJIHN0cnVjdCBmaWVtYXBfZXh0ZW50X2luZm8gKmZpZWluZm8sIHU2NCBzdGFydCwKLQkJCSB1NjQgbGVuLCBnZXRfYmxvY2tfdCAqZ2V0X2Jsb2NrKQorCitpbnQgX19nZW5lcmljX2Jsb2NrX2ZpZW1hcChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgc3RydWN0IGZpZW1hcF9leHRlbnRfaW5mbyAqZmllaW5mbywgdTY0IHN0YXJ0LAorCQkJICAgdTY0IGxlbiwgZ2V0X2Jsb2NrX3QgKmdldF9ibG9jaykKIHsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgdG1wOwogCXVuc2lnbmVkIGludCBzdGFydF9ibGs7CkBAIC0yNjAsOSArMjY1LDYgQEAKIAogCXN0YXJ0X2JsayA9IGxvZ2ljYWxfdG9fYmxrKGlub2RlLCBzdGFydCk7CiAKLQkvKiBndWFyZCBhZ2FpbnN0IGNoYW5nZSAqLwotCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKLQogCWxlbmd0aCA9IChsb25nIGxvbmcpbWluX3QodTY0LCBsZW4sIGlfc2l6ZV9yZWFkKGlub2RlKSk7CiAJbWFwX2xlbiA9IGxlbmd0aDsKIApAQCAtMzM0LDE0ICszMzYsMzYgQEAKIAkJY29uZF9yZXNjaGVkKCk7CiAJfSB3aGlsZSAoMSk7CiAKLQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKLQogCS8qIGlmIHJldCBpcyAxIHRoZW4gd2UganVzdCBoaXQgdGhlIGVuZCBvZiB0aGUgZXh0ZW50IGFycmF5ICovCiAJaWYgKHJldCA9PSAxKQogCQlyZXQgPSAwOwogCiAJcmV0dXJuIHJldDsKIH0KK0VYUE9SVF9TWU1CT0woX19nZW5lcmljX2Jsb2NrX2ZpZW1hcCk7CisKKy8qKgorICogZ2VuZXJpY19ibG9ja19maWVtYXAgLSBGSUVNQVAgZm9yIGJsb2NrIGJhc2VkIGlub2RlcworICogQGlub2RlOiBUaGUgaW5vZGUgdG8gbWFwCisgKiBAZmllaW5mbzogVGhlIG1hcHBpbmcgaW5mb3JtYXRpb24KKyAqIEBzdGFydDogVGhlIGluaXRpYWwgYmxvY2sgdG8gbWFwCisgKiBAbGVuOiBUaGUgbGVuZ3RoIG9mIHRoZSBleHRlY3QgdG8gYXR0ZW1wdCB0byBtYXAKKyAqIEBnZXRfYmxvY2s6IFRoZSBibG9jayBtYXBwaW5nIGZ1bmN0aW9uIGZvciB0aGUgZnMKKyAqCisgKiBDYWxscyBfX2dlbmVyaWNfYmxvY2tfZmllbWFwIHRvIG1hcCB0aGUgaW5vZGUsIGFmdGVyIHRha2luZworICogdGhlIGlub2RlJ3MgbXV0ZXggbG9jay4KKyAqLworCitpbnQgZ2VuZXJpY19ibG9ja19maWVtYXAoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSBzdHJ1Y3QgZmllbWFwX2V4dGVudF9pbmZvICpmaWVpbmZvLCB1NjQgc3RhcnQsCisJCQkgdTY0IGxlbiwgZ2V0X2Jsb2NrX3QgKmdldF9ibG9jaykKK3sKKwlpbnQgcmV0OworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKKwlyZXQgPSBfX2dlbmVyaWNfYmxvY2tfZmllbWFwKGlub2RlLCBmaWVpbmZvLCBzdGFydCwgbGVuLCBnZXRfYmxvY2spOworCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CiBFWFBPUlRfU1lNQk9MKGdlbmVyaWNfYmxvY2tfZmllbWFwKTsKIAogI2VuZGlmICAvKiAgQ09ORklHX0JMT0NLICAqLwpkaWZmIC0tZ2l0IGEvZnMvaW9wcmlvLmMgYi9mcy9pb3ByaW8uYwppbmRleCAzNTY5ZTBhLi4xYTM5YWMzIDEwMDY0NAotLS0gYS9mcy9pb3ByaW8uYworKysgYi9mcy9pb3ByaW8uYwpAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvcGlkX25hbWVzcGFjZS5oPgogCi1zdGF0aWMgaW50IHNldF90YXNrX2lvcHJpbyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCBpb3ByaW8pCitpbnQgc2V0X3Rhc2tfaW9wcmlvKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IGlvcHJpbykKIHsKIAlpbnQgZXJyOwogCXN0cnVjdCBpb19jb250ZXh0ICppb2M7CkBAIC03MCw2ICs3MCw3IEBACiAJdGFza191bmxvY2sodGFzayk7CiAJcmV0dXJuIGVycjsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHNldF90YXNrX2lvcHJpbyk7CiAKIGFzbWxpbmthZ2UgbG9uZyBzeXNfaW9wcmlvX3NldChpbnQgd2hpY2gsIGludCB3aG8sIGludCBpb3ByaW8pCiB7CmRpZmYgLS1naXQgYS9mcy9pc29mcy9pbm9kZS5jIGIvZnMvaXNvZnMvaW5vZGUuYwppbmRleCAzZjhhZjBmLi42MTQ3ZWMzIDEwMDY0NAotLS0gYS9mcy9pc29mcy9pbm9kZS5jCisrKyBiL2ZzL2lzb2ZzL2lub2RlLmMKQEAgLTg1NSwxMCArODU1LDYgQEAKIAl9CiAJc2JpLT5zX2pvbGlldF9sZXZlbCA9IGpvbGlldF9sZXZlbDsKIAotCS8qIGNoZWNrIHRoZSByb290IGlub2RlICovCi0JaWYgKCFpbm9kZS0+aV9vcCkKLQkJZ290byBvdXRfYmFkX3Jvb3Q7Ci0KIAkvKiBNYWtlIHN1cmUgdGhlIHJvb3QgaW5vZGUgaXMgYSBkaXJlY3RvcnkgKi8KIAlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORwpAQCAtODg2LDggKzg4Miw2IEBACiAJLyoKIAkgKiBEaXNwbGF5IGVycm9yIG1lc3NhZ2VzIGFuZCBmcmVlIHJlc291cmNlcy4KIAkgKi8KLW91dF9iYWRfcm9vdDoKLQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcm9vdCBpbm9kZSBub3QgaW5pdGlhbGl6ZWRcbiIsIF9fZnVuY19fKTsKIG91dF9pcHV0OgogCWlwdXQoaW5vZGUpOwogCWdvdG8gb3V0X25vX2lub2RlOwpkaWZmIC0tZ2l0IGEvZnMvamJkL2NvbW1pdC5jIGIvZnMvamJkL2NvbW1pdC5jCmluZGV4IDI1NzE5ZDkuLjNmYmZmYjEgMTAwNjQ0Ci0tLSBhL2ZzL2piZC9jb21taXQuYworKysgYi9mcy9qYmQvY29tbWl0LmMKQEAgLTMwNiw2ICszMDYsOCBAQAogCWludCBmbGFnczsKIAlpbnQgZXJyOwogCXVuc2lnbmVkIGxvbmcgYmxvY2tucjsKKwlrdGltZV90IHN0YXJ0X3RpbWU7CisJdTY0IGNvbW1pdF90aW1lOwogCWNoYXIgKnRhZ3AgPSBOVUxMOwogCWpvdXJuYWxfaGVhZGVyX3QgKmhlYWRlcjsKIAlqb3VybmFsX2Jsb2NrX3RhZ190ICp0YWcgPSBOVUxMOwpAQCAtNDE4LDYgKzQyMCw3IEBACiAJY29tbWl0X3RyYW5zYWN0aW9uLT50X3N0YXRlID0gVF9GTFVTSDsKIAlqb3VybmFsLT5qX2NvbW1pdHRpbmdfdHJhbnNhY3Rpb24gPSBjb21taXRfdHJhbnNhY3Rpb247CiAJam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uID0gTlVMTDsKKwlzdGFydF90aW1lID0ga3RpbWVfZ2V0KCk7CiAJY29tbWl0X3RyYW5zYWN0aW9uLT50X2xvZ19zdGFydCA9IGpvdXJuYWwtPmpfaGVhZDsKIAl3YWtlX3VwKCZqb3VybmFsLT5qX3dhaXRfdHJhbnNhY3Rpb25fbG9ja2VkKTsKIAlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKQEAgLTkxMyw2ICs5MTYsMTggQEAKIAlKX0FTU0VSVChjb21taXRfdHJhbnNhY3Rpb24gPT0gam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uKTsKIAlqb3VybmFsLT5qX2NvbW1pdF9zZXF1ZW5jZSA9IGNvbW1pdF90cmFuc2FjdGlvbi0+dF90aWQ7CiAJam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uID0gTlVMTDsKKwljb21taXRfdGltZSA9IGt0aW1lX3RvX25zKGt0aW1lX3N1YihrdGltZV9nZXQoKSwgc3RhcnRfdGltZSkpOworCisJLyoKKwkgKiB3ZWlnaHQgdGhlIGNvbW1pdCB0aW1lIGhpZ2hlciB0aGFuIHRoZSBhdmVyYWdlIHRpbWUgc28gd2UgZG9uJ3QKKwkgKiByZWFjdCB0b28gc3Ryb25nbHkgdG8gdmFzdCBjaGFuZ2VzIGluIGNvbW1pdCB0aW1lCisJICovCisJaWYgKGxpa2VseShqb3VybmFsLT5qX2F2ZXJhZ2VfY29tbWl0X3RpbWUpKQorCQlqb3VybmFsLT5qX2F2ZXJhZ2VfY29tbWl0X3RpbWUgPSAoY29tbWl0X3RpbWUqMyArCisJCQkJam91cm5hbC0+al9hdmVyYWdlX2NvbW1pdF90aW1lKSAvIDQ7CisJZWxzZQorCQlqb3VybmFsLT5qX2F2ZXJhZ2VfY29tbWl0X3RpbWUgPSBjb21taXRfdGltZTsKKwogCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOwogCiAJaWYgKGNvbW1pdF90cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2xpc3QgPT0gTlVMTCAmJgpkaWZmIC0tZ2l0IGEvZnMvamJkL3RyYW5zYWN0aW9uLmMgYi9mcy9qYmQvdHJhbnNhY3Rpb24uYwppbmRleCA2MGQ0YzMyLi5lNmExMTc0IDEwMDY0NAotLS0gYS9mcy9qYmQvdHJhbnNhY3Rpb24uYworKysgYi9mcy9qYmQvdHJhbnNhY3Rpb24uYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvaHJ0aW1lci5oPgogCiBzdGF0aWMgdm9pZCBfX2pvdXJuYWxfdGVtcF91bmxpbmtfYnVmZmVyKHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKTsKIApAQCAtNDksNiArNTAsNyBAQAogewogCXRyYW5zYWN0aW9uLT50X2pvdXJuYWwgPSBqb3VybmFsOwogCXRyYW5zYWN0aW9uLT50X3N0YXRlID0gVF9SVU5OSU5HOworCXRyYW5zYWN0aW9uLT50X3N0YXJ0X3RpbWUgPSBrdGltZV9nZXQoKTsKIAl0cmFuc2FjdGlvbi0+dF90aWQgPSBqb3VybmFsLT5qX3RyYW5zYWN0aW9uX3NlcXVlbmNlKys7CiAJdHJhbnNhY3Rpb24tPnRfZXhwaXJlcyA9IGppZmZpZXMgKyBqb3VybmFsLT5qX2NvbW1pdF9pbnRlcnZhbDsKIAlzcGluX2xvY2tfaW5pdCgmdHJhbnNhY3Rpb24tPnRfaGFuZGxlX2xvY2spOwpAQCAtNzUyLDcgKzc1NCw2IEBACiAgKiBpbnQgam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKCkgLSBub3RpZnkgaW50ZW50IHRvIG1vZGlmeSBhIGJ1ZmZlciBmb3IgbWV0YWRhdGEgKG5vdCBkYXRhKSB1cGRhdGUuCiAgKiBAaGFuZGxlOiB0cmFuc2FjdGlvbiB0byBhZGQgYnVmZmVyIG1vZGlmaWNhdGlvbnMgdG8KICAqIEBiaDogICAgIGJoIHRvIGJlIHVzZWQgZm9yIG1ldGFkYXRhIHdyaXRlcwotICogQGNyZWRpdHM6IHZhcmlhYmxlIHRoYXQgd2lsbCByZWNlaXZlIGNyZWRpdHMgZm9yIHRoZSBidWZmZXIKICAqCiAgKiBSZXR1cm5zIGFuIGVycm9yIGNvZGUgb3IgMCBvbiBzdWNjZXNzLgogICoKQEAgLTEzNzAsNyArMTM3MSw3IEBACiB7CiAJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb24gPSBoYW5kbGUtPmhfdHJhbnNhY3Rpb247CiAJam91cm5hbF90ICpqb3VybmFsID0gdHJhbnNhY3Rpb24tPnRfam91cm5hbDsKLQlpbnQgb2xkX2hhbmRsZV9jb3VudCwgZXJyOworCWludCBlcnI7CiAJcGlkX3QgcGlkOwogCiAJSl9BU1NFUlQoam91cm5hbF9jdXJyZW50X2hhbmRsZSgpID09IGhhbmRsZSk7CkBAIC0xMzk5LDYgKzE0MDAsMTcgQEAKIAkgKiBvbiBJTyBhbnl3YXkuICBTcGVlZHMgdXAgbWFueS10aHJlYWRlZCwgbWFueS1kaXIgb3BlcmF0aW9ucwogCSAqIGJ5IDMweCBvciBtb3JlLi4uCiAJICoKKwkgKiBXZSB0cnkgYW5kIG9wdGltaXplIHRoZSBzbGVlcCB0aW1lIGFnYWluc3Qgd2hhdCB0aGUgdW5kZXJseWluZyBkaXNrCisJICogY2FuIGRvLCBpbnN0ZWFkIG9mIGhhdmluZyBhIHN0YXRpYyBzbGVlcCB0aW1lLiAgVGhpcyBpcyB1c2VmdWxsIGZvcgorCSAqIHRoZSBjYXNlIHdoZXJlIG91ciBzdG9yYWdlIGlzIHNvIGZhc3QgdGhhdCBpdCBpcyBtb3JlIG9wdGltYWwgdG8gZ28KKwkgKiBhaGVhZCBhbmQgZm9yY2UgYSBmbHVzaCBhbmQgd2FpdCBmb3IgdGhlIHRyYW5zYWN0aW9uIHRvIGJlIGNvbW1pdHRlZAorCSAqIHRoYW4gaXQgaXMgdG8gd2FpdCBmb3IgYW4gYXJiaXRyYXJ5IGFtb3VudCBvZiB0aW1lIGZvciBuZXcgd3JpdGVycyB0bworCSAqIGpvaW4gdGhlIHRyYW5zYWN0aW9uLiAgV2UgYWNoZWl2ZSB0aGlzIGJ5IG1lYXN1cmluZyBob3cgbG9uZyBpdCB0YWtlcworCSAqIHRvIGNvbW1pdCBhIHRyYW5zYWN0aW9uLCBhbmQgY29tcGFyZSBpdCB3aXRoIGhvdyBsb25nIHRoaXMKKwkgKiB0cmFuc2FjdGlvbiBoYXMgYmVlbiBydW5uaW5nLCBhbmQgaWYgcnVuIHRpbWUgPCBjb21taXQgdGltZSB0aGVuIHdlCisJICogc2xlZXAgZm9yIHRoZSBkZWx0YSBhbmQgY29tbWl0LiAgVGhpcyBncmVhdGx5IGhlbHBzIHN1cGVyIGZhc3QgZGlza3MKKwkgKiB0aGF0IHdvdWxkIHNlZSBzbG93ZG93bnMgYXMgbW9yZSB0aHJlYWRzIHN0YXJ0ZWQgZG9pbmcgZnN5bmNzLgorCSAqCiAJICogQnV0IGRvbid0IGRvIHRoaXMgaWYgdGhpcyBwcm9jZXNzIHdhcyB0aGUgbW9zdCByZWNlbnQgb25lIHRvCiAJICogcGVyZm9ybSBhIHN5bmNocm9ub3VzIHdyaXRlLiAgV2UgZG8gdGhpcyB0byBkZXRlY3QgdGhlIGNhc2Ugd2hlcmUgYQogCSAqIHNpbmdsZSBwcm9jZXNzIGlzIGRvaW5nIGEgc3RyZWFtIG9mIHN5bmMgd3JpdGVzLiAgTm8gcG9pbnQgaW4gd2FpdGluZwpAQCAtMTQwNiwxMSArMTQxOCwyNiBAQAogCSAqLwogCXBpZCA9IGN1cnJlbnQtPnBpZDsKIAlpZiAoaGFuZGxlLT5oX3N5bmMgJiYgam91cm5hbC0+al9sYXN0X3N5bmNfd3JpdGVyICE9IHBpZCkgeworCQl1NjQgY29tbWl0X3RpbWUsIHRyYW5zX3RpbWU7CisKIAkJam91cm5hbC0+al9sYXN0X3N5bmNfd3JpdGVyID0gcGlkOwotCQlkbyB7Ci0JCQlvbGRfaGFuZGxlX2NvdW50ID0gdHJhbnNhY3Rpb24tPnRfaGFuZGxlX2NvdW50OwotCQkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7Ci0JCX0gd2hpbGUgKG9sZF9oYW5kbGVfY291bnQgIT0gdHJhbnNhY3Rpb24tPnRfaGFuZGxlX2NvdW50KTsKKworCQlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJCWNvbW1pdF90aW1lID0gam91cm5hbC0+al9hdmVyYWdlX2NvbW1pdF90aW1lOworCQlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKworCQl0cmFuc190aW1lID0ga3RpbWVfdG9fbnMoa3RpbWVfc3ViKGt0aW1lX2dldCgpLAorCQkJCQkJICAgdHJhbnNhY3Rpb24tPnRfc3RhcnRfdGltZSkpOworCisJCWNvbW1pdF90aW1lID0gbWluX3QodTY0LCBjb21taXRfdGltZSwKKwkJCQkgICAgMTAwMCpqaWZmaWVzX3RvX3VzZWNzKDEpKTsKKworCQlpZiAodHJhbnNfdGltZSA8IGNvbW1pdF90aW1lKSB7CisJCQlrdGltZV90IGV4cGlyZXMgPSBrdGltZV9hZGRfbnMoa3RpbWVfZ2V0KCksCisJCQkJCQkgICAgICAgY29tbWl0X3RpbWUpOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfaHJ0aW1lb3V0KCZleHBpcmVzLCBIUlRJTUVSX01PREVfQUJTKTsKKwkJfQogCX0KIAogCWN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IE5VTEw7CmRpZmYgLS1naXQgYS9mcy9qYmQyL2NoZWNrcG9pbnQuYyBiL2ZzL2piZDIvY2hlY2twb2ludC5jCmluZGV4IDk0OTc3MTguLjE3MTU5Y2EgMTAwNjQ0Ci0tLSBhL2ZzL2piZDIvY2hlY2twb2ludC5jCisrKyBiL2ZzL2piZDIvY2hlY2twb2ludC5jCkBAIC0yNDksMTYgKzI0OSwxNCBAQAogCXJldHVybiByZXQ7CiB9CiAKLSNkZWZpbmUgTlJfQkFUQ0gJNjQKLQogc3RhdGljIHZvaWQKLV9fZmx1c2hfYmF0Y2goam91cm5hbF90ICpqb3VybmFsLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaHMsIGludCAqYmF0Y2hfY291bnQpCitfX2ZsdXNoX2JhdGNoKGpvdXJuYWxfdCAqam91cm5hbCwgaW50ICpiYXRjaF9jb3VudCkKIHsKIAlpbnQgaTsKIAotCWxsX3J3X2Jsb2NrKFNXUklURSwgKmJhdGNoX2NvdW50LCBiaHMpOworCWxsX3J3X2Jsb2NrKFNXUklURSwgKmJhdGNoX2NvdW50LCBqb3VybmFsLT5qX2Noa3B0X2Jocyk7CiAJZm9yIChpID0gMDsgaSA8ICpiYXRjaF9jb3VudDsgaSsrKSB7Ci0JCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBiaHNbaV07CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBqb3VybmFsLT5qX2Noa3B0X2Joc1tpXTsKIAkJY2xlYXJfYnVmZmVyX2p3cml0ZShiaCk7CiAJCUJVRkZFUl9UUkFDRShiaCwgImJyZWxzZSIpOwogCQlfX2JyZWxzZShiaCk7CkBAIC0yNzcsOCArMjc1LDcgQEAKICAqIENhbGxlZCB1bmRlciBqYmRfbG9ja19iaF9zdGF0ZShqaDJiaChqaCkpLCBhbmQgZHJvcHMgaXQKICAqLwogc3RhdGljIGludCBfX3Byb2Nlc3NfYnVmZmVyKGpvdXJuYWxfdCAqam91cm5hbCwgc3RydWN0IGpvdXJuYWxfaGVhZCAqamgsCi0JCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaHMsIGludCAqYmF0Y2hfY291bnQsCi0JCQl0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbikKKwkJCSAgICBpbnQgKmJhdGNoX2NvdW50LCB0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbikKIHsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gamgyYmgoamgpOwogCWludCByZXQgPSAwOwpAQCAtMzI1LDE0ICszMjIsMTQgQEAKIAkJZ2V0X2JoKGJoKTsKIAkJSl9BU1NFUlRfQkgoYmgsICFidWZmZXJfandyaXRlKGJoKSk7CiAJCXNldF9idWZmZXJfandyaXRlKGJoKTsKLQkJYmhzWypiYXRjaF9jb3VudF0gPSBiaDsKKwkJam91cm5hbC0+al9jaGtwdF9iaHNbKmJhdGNoX2NvdW50XSA9IGJoOwogCQlfX2J1ZmZlcl9yZWxpbmtfaW8oamgpOwogCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKIAkJdHJhbnNhY3Rpb24tPnRfY2hwX3N0YXRzLmNzX3dyaXR0ZW4rKzsKIAkJKCpiYXRjaF9jb3VudCkrKzsKLQkJaWYgKCpiYXRjaF9jb3VudCA9PSBOUl9CQVRDSCkgeworCQlpZiAoKmJhdGNoX2NvdW50ID09IEpCRDJfTlJfQkFUQ0gpIHsKIAkJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7Ci0JCQlfX2ZsdXNoX2JhdGNoKGpvdXJuYWwsIGJocywgYmF0Y2hfY291bnQpOworCQkJX19mbHVzaF9iYXRjaChqb3VybmFsLCBiYXRjaF9jb3VudCk7CiAJCQlyZXQgPSAxOwogCQl9CiAJfQpAQCAtMzg4LDcgKzM4NSw2IEBACiAJaWYgKGpvdXJuYWwtPmpfY2hlY2twb2ludF90cmFuc2FjdGlvbnMgPT0gdHJhbnNhY3Rpb24gJiYKIAkJCXRyYW5zYWN0aW9uLT50X3RpZCA9PSB0aGlzX3RpZCkgewogCQlpbnQgYmF0Y2hfY291bnQgPSAwOwotCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoc1tOUl9CQVRDSF07CiAJCXN0cnVjdCBqb3VybmFsX2hlYWQgKmpoOwogCQlpbnQgcmV0cnkgPSAwLCBlcnI7CiAKQEAgLTQwMiw3ICszOTgsNyBAQAogCQkJCXJldHJ5ID0gMTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCXJldHJ5ID0gX19wcm9jZXNzX2J1ZmZlcihqb3VybmFsLCBqaCwgYmhzLCAmYmF0Y2hfY291bnQsCisJCQlyZXRyeSA9IF9fcHJvY2Vzc19idWZmZXIoam91cm5hbCwgamgsICZiYXRjaF9jb3VudCwKIAkJCQkJCSB0cmFuc2FjdGlvbik7CiAJCQlpZiAocmV0cnkgPCAwICYmICFyZXN1bHQpCiAJCQkJcmVzdWx0ID0gcmV0cnk7CkBAIC00MTksNyArNDE1LDcgQEAKIAkJCQlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOwogCQkJCXJldHJ5ID0gMTsKIAkJCX0KLQkJCV9fZmx1c2hfYmF0Y2goam91cm5hbCwgYmhzLCAmYmF0Y2hfY291bnQpOworCQkJX19mbHVzaF9iYXRjaChqb3VybmFsLCAmYmF0Y2hfY291bnQpOwogCQl9CiAKIAkJaWYgKHJldHJ5KSB7CkBAIC02ODYsNiArNjgyLDcgQEAKIAkgICBzYWZlbHkgcmVtb3ZlIHRoaXMgdHJhbnNhY3Rpb24gZnJvbSB0aGUgbG9nICovCiAKIAlfX2piZDJfam91cm5hbF9kcm9wX3RyYW5zYWN0aW9uKGpvdXJuYWwsIHRyYW5zYWN0aW9uKTsKKwlrZnJlZSh0cmFuc2FjdGlvbik7CiAKIAkvKiBKdXN0IGluIGNhc2UgYW55Ym9keSB3YXMgd2FpdGluZyBmb3IgbW9yZSB0cmFuc2FjdGlvbnMgdG8gYmUKICAgICAgICAgICAgY2hlY2twb2ludGVkLi4uICovCkBAIC03NjAsNSArNzU3LDQgQEAKIAlKX0FTU0VSVChqb3VybmFsLT5qX3J1bm5pbmdfdHJhbnNhY3Rpb24gIT0gdHJhbnNhY3Rpb24pOwogCiAJamJkX2RlYnVnKDEsICJEcm9wcGluZyB0cmFuc2FjdGlvbiAlZCwgYWxsIGRvbmVcbiIsIHRyYW5zYWN0aW9uLT50X3RpZCk7Ci0Ja2ZyZWUodHJhbnNhY3Rpb24pOwogfQpkaWZmIC0tZ2l0IGEvZnMvamJkMi9jb21taXQuYyBiL2ZzL2piZDIvY29tbWl0LmMKaW5kZXggZWJjNjY3Yi4uNjI4MDRlNSAxMDA2NDQKLS0tIGEvZnMvamJkMi9jb21taXQuYworKysgYi9mcy9qYmQyL2NvbW1pdC5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KICNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgorI2luY2x1ZGUgPGxpbnV4L2Jpby5oPgogCiAvKgogICogRGVmYXVsdCBJTyBlbmQgaGFuZGxlciBmb3IgdGVtcG9yYXJ5IEJKX0lPIGJ1ZmZlcl9oZWFkcy4KQEAgLTEzNyw3ICsxMzgsNyBAQAogCQlzZXRfYnVmZmVyX29yZGVyZWQoYmgpOwogCQliYXJyaWVyX2RvbmUgPSAxOwogCX0KLQlyZXQgPSBzdWJtaXRfYmgoV1JJVEUsIGJoKTsKKwlyZXQgPSBzdWJtaXRfYmgoV1JJVEVfU1lOQywgYmgpOwogCWlmIChiYXJyaWVyX2RvbmUpCiAJCWNsZWFyX2J1ZmZlcl9vcmRlcmVkKGJoKTsKIApAQCAtMTU4LDcgKzE1OSw3IEBACiAJCWxvY2tfYnVmZmVyKGJoKTsKIAkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CiAJCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7Ci0JCXJldCA9IHN1Ym1pdF9iaChXUklURSwgYmgpOworCQlyZXQgPSBzdWJtaXRfYmgoV1JJVEVfU1lOQywgYmgpOwogCX0KIAkqY2JoID0gYmg7CiAJcmV0dXJuIHJldDsKQEAgLTE2OCwxMiArMTY5LDM0IEBACiAgKiBUaGlzIGZ1bmN0aW9uIGFsb25nIHdpdGggam91cm5hbF9zdWJtaXRfY29tbWl0X3JlY29yZAogICogYWxsb3dzIHRvIHdyaXRlIHRoZSBjb21taXQgcmVjb3JkIGFzeW5jaHJvbm91c2x5LgogICovCi1zdGF0aWMgaW50IGpvdXJuYWxfd2FpdF9vbl9jb21taXRfcmVjb3JkKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCitzdGF0aWMgaW50IGpvdXJuYWxfd2FpdF9vbl9jb21taXRfcmVjb3JkKGpvdXJuYWxfdCAqam91cm5hbCwKKwkJCQkJIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCiB7CiAJaW50IHJldCA9IDA7CiAKK3JldHJ5OgogCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CiAJd2FpdF9vbl9idWZmZXIoYmgpOworCWlmIChidWZmZXJfZW9wbm90c3VwcChiaCkgJiYgKGpvdXJuYWwtPmpfZmxhZ3MgJiBKQkQyX0JBUlJJRVIpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJKQkQyOiB3YWl0X29uX2NvbW1pdF9yZWNvcmQ6IHN5bmMgZmFpbGVkIG9uICVzIC0gIgorCQkgICAgICAgImRpc2FibGluZyBiYXJyaWVyc1xuIiwgam91cm5hbC0+al9kZXZuYW1lKTsKKwkJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCQlqb3VybmFsLT5qX2ZsYWdzICY9IH5KQkQyX0JBUlJJRVI7CisJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCisJCWxvY2tfYnVmZmVyKGJoKTsKKwkJY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKKwkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCWJoLT5iX2VuZF9pbyA9IGpvdXJuYWxfZW5kX2J1ZmZlcl9pb19zeW5jOworCisJCXJldCA9IHN1Ym1pdF9iaChXUklURV9TWU5DLCBiaCk7CisJCWlmIChyZXQpIHsKKwkJCXVubG9ja19idWZmZXIoYmgpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlnb3RvIHJldHJ5OworCX0KIAogCWlmICh1bmxpa2VseSghYnVmZmVyX3VwdG9kYXRlKGJoKSkpCiAJCXJldCA9IC1FSU87CkBAIC0zMzIsMTMgKzM1NSwxNSBAQAogCWludCBmbGFnczsKIAlpbnQgZXJyOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBibG9ja25yOworCWt0aW1lX3Qgc3RhcnRfdGltZTsKKwl1NjQgY29tbWl0X3RpbWU7CiAJY2hhciAqdGFncCA9IE5VTEw7CiAJam91cm5hbF9oZWFkZXJfdCAqaGVhZGVyOwogCWpvdXJuYWxfYmxvY2tfdGFnX3QgKnRhZyA9IE5VTEw7CiAJaW50IHNwYWNlX2xlZnQgPSAwOwogCWludCBmaXJzdF90YWcgPSAwOwogCWludCB0YWdfZmxhZzsKLQlpbnQgaTsKKwlpbnQgaSwgdG9fZnJlZSA9IDA7CiAJaW50IHRhZ19ieXRlcyA9IGpvdXJuYWxfdGFnX2J5dGVzKGpvdXJuYWwpOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqY2JoID0gTlVMTDsgLyogRm9yIHRyYW5zYWN0aW9uYWwgY2hlY2tzdW1zICovCiAJX191MzIgY3JjMzJfc3VtID0gfjA7CkBAIC00NTgsNiArNDgzLDcgQEAKIAljb21taXRfdHJhbnNhY3Rpb24tPnRfc3RhdGUgPSBUX0ZMVVNIOwogCWpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbiA9IGNvbW1pdF90cmFuc2FjdGlvbjsKIAlqb3VybmFsLT5qX3J1bm5pbmdfdHJhbnNhY3Rpb24gPSBOVUxMOworCXN0YXJ0X3RpbWUgPSBrdGltZV9nZXQoKTsKIAljb21taXRfdHJhbnNhY3Rpb24tPnRfbG9nX3N0YXJ0ID0gam91cm5hbC0+al9oZWFkOwogCXdha2VfdXAoJmpvdXJuYWwtPmpfd2FpdF90cmFuc2FjdGlvbl9sb2NrZWQpOwogCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOwpAQCAtNTA5LDYgKzUzNSwxMCBAQAogCQlpZiAoaXNfam91cm5hbF9hYm9ydGVkKGpvdXJuYWwpKSB7CiAJCQljbGVhcl9idWZmZXJfamJkZGlydHkoamgyYmgoamgpKTsKIAkJCUpCVUZGRVJfVFJBQ0UoamgsICJqb3VybmFsIGlzIGFib3J0aW5nOiByZWZpbGUiKTsKKwkJCWpiZDJfYnVmZmVyX2Fib3J0X3RyaWdnZXIoamgsCisJCQkJCQkgIGpoLT5iX2Zyb3plbl9kYXRhID8KKwkJCQkJCSAgamgtPmJfZnJvemVuX3RyaWdnZXJzIDoKKwkJCQkJCSAgamgtPmJfdHJpZ2dlcnMpOwogCQkJamJkMl9qb3VybmFsX3JlZmlsZV9idWZmZXIoam91cm5hbCwgamgpOwogCQkJLyogSWYgdGhhdCB3YXMgdGhlIGxhc3Qgb25lLCB3ZSBuZWVkIHRvIGNsZWFuIHVwCiAJCQkgKiBhbnkgZGVzY3JpcHRvciBidWZmZXJzIHdoaWNoIG1heSBoYXZlIGJlZW4KQEAgLTc5OSw3ICs4MjksNyBAQAogCQkJX19qYmQyX2pvdXJuYWxfYWJvcnRfaGFyZChqb3VybmFsKTsKIAl9CiAJaWYgKCFlcnIgJiYgIWlzX2pvdXJuYWxfYWJvcnRlZChqb3VybmFsKSkKLQkJZXJyID0gam91cm5hbF93YWl0X29uX2NvbW1pdF9yZWNvcmQoY2JoKTsKKwkJZXJyID0gam91cm5hbF93YWl0X29uX2NvbW1pdF9yZWNvcmQoam91cm5hbCwgY2JoKTsKIAogCWlmIChlcnIpCiAJCWpiZDJfam91cm5hbF9hYm9ydChqb3VybmFsLCBlcnIpOwpAQCAtODQ0LDYgKzg3NCw5IEBACiAJCSAqIGRhdGEuCiAJCSAqCiAJCSAqIE90aGVyd2lzZSwgd2UgY2FuIGp1c3QgdGhyb3cgYXdheSB0aGUgZnJvemVuIGRhdGEgbm93LgorCQkgKgorCQkgKiBXZSBhbHNvIGtub3cgdGhhdCB0aGUgZnJvemVuIGRhdGEgaGFzIGFscmVhZHkgZmlyZWQKKwkJICogaXRzIHRyaWdnZXJzIGlmIHRoZXkgZXhpc3QsIHNvIHdlIGNhbiBjbGVhciB0aGF0IHRvby4KIAkJICovCiAJCWlmIChqaC0+Yl9jb21taXR0ZWRfZGF0YSkgewogCQkJamJkMl9mcmVlKGpoLT5iX2NvbW1pdHRlZF9kYXRhLCBiaC0+Yl9zaXplKTsKQEAgLTg1MSwxMCArODg0LDEyIEBACiAJCQlpZiAoamgtPmJfZnJvemVuX2RhdGEpIHsKIAkJCQlqaC0+Yl9jb21taXR0ZWRfZGF0YSA9IGpoLT5iX2Zyb3plbl9kYXRhOwogCQkJCWpoLT5iX2Zyb3plbl9kYXRhID0gTlVMTDsKKwkJCQlqaC0+Yl9mcm96ZW5fdHJpZ2dlcnMgPSBOVUxMOwogCQkJfQogCQl9IGVsc2UgaWYgKGpoLT5iX2Zyb3plbl9kYXRhKSB7CiAJCQlqYmQyX2ZyZWUoamgtPmJfZnJvemVuX2RhdGEsIGJoLT5iX3NpemUpOwogCQkJamgtPmJfZnJvemVuX2RhdGEgPSBOVUxMOworCQkJamgtPmJfZnJvemVuX3RyaWdnZXJzID0gTlVMTDsKIAkJfQogCiAJCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOwpAQCAtOTcyLDE0ICsxMDA3LDIzIEBACiAJSl9BU1NFUlQoY29tbWl0X3RyYW5zYWN0aW9uID09IGpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbik7CiAJam91cm5hbC0+al9jb21taXRfc2VxdWVuY2UgPSBjb21taXRfdHJhbnNhY3Rpb24tPnRfdGlkOwogCWpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbiA9IE5VTEw7Ci0Jc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJY29tbWl0X3RpbWUgPSBrdGltZV90b19ucyhrdGltZV9zdWIoa3RpbWVfZ2V0KCksIHN0YXJ0X3RpbWUpKTsKIAotCWlmIChqb3VybmFsLT5qX2NvbW1pdF9jYWxsYmFjaykKLQkJam91cm5hbC0+al9jb21taXRfY2FsbGJhY2soam91cm5hbCwgY29tbWl0X3RyYW5zYWN0aW9uKTsKKwkvKgorCSAqIHdlaWdodCB0aGUgY29tbWl0IHRpbWUgaGlnaGVyIHRoYW4gdGhlIGF2ZXJhZ2UgdGltZSBzbyB3ZSBkb24ndAorCSAqIHJlYWN0IHRvbyBzdHJvbmdseSB0byB2YXN0IGNoYW5nZXMgaW4gdGhlIGNvbW1pdCB0aW1lCisJICovCisJaWYgKGxpa2VseShqb3VybmFsLT5qX2F2ZXJhZ2VfY29tbWl0X3RpbWUpKQorCQlqb3VybmFsLT5qX2F2ZXJhZ2VfY29tbWl0X3RpbWUgPSAoY29tbWl0X3RpbWUgKworCQkJCWpvdXJuYWwtPmpfYXZlcmFnZV9jb21taXRfdGltZSozKSAvIDQ7CisJZWxzZQorCQlqb3VybmFsLT5qX2F2ZXJhZ2VfY29tbWl0X3RpbWUgPSBjb21taXRfdGltZTsKKwlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKIAogCWlmIChjb21taXRfdHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9saXN0ID09IE5VTEwgJiYKIAkgICAgY29tbWl0X3RyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfaW9fbGlzdCA9PSBOVUxMKSB7CiAJCV9famJkMl9qb3VybmFsX2Ryb3BfdHJhbnNhY3Rpb24oam91cm5hbCwgY29tbWl0X3RyYW5zYWN0aW9uKTsKKwkJdG9fZnJlZSA9IDE7CiAJfSBlbHNlIHsKIAkJaWYgKGpvdXJuYWwtPmpfY2hlY2twb2ludF90cmFuc2FjdGlvbnMgPT0gTlVMTCkgewogCQkJam91cm5hbC0+al9jaGVja3BvaW50X3RyYW5zYWN0aW9ucyA9IGNvbW1pdF90cmFuc2FjdGlvbjsKQEAgLTk5OCwxMSArMTA0MiwxNiBAQAogCX0KIAlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOwogCisJaWYgKGpvdXJuYWwtPmpfY29tbWl0X2NhbGxiYWNrKQorCQlqb3VybmFsLT5qX2NvbW1pdF9jYWxsYmFjayhqb3VybmFsLCBjb21taXRfdHJhbnNhY3Rpb24pOworCiAJdHJhY2VfbWFyayhqYmQyX2VuZF9jb21taXQsICJkZXYgJXMgdHJhbnNhY3Rpb24gJWQgaGVhZCAlZCIsCi0JCSAgIGpvdXJuYWwtPmpfZGV2bmFtZSwgam91cm5hbC0+al9jb21taXRfc2VxdWVuY2UsCisJCSAgIGpvdXJuYWwtPmpfZGV2bmFtZSwgY29tbWl0X3RyYW5zYWN0aW9uLT50X3RpZCwKIAkJICAgam91cm5hbC0+al90YWlsX3NlcXVlbmNlKTsKIAlqYmRfZGVidWcoMSwgIkpCRDogY29tbWl0ICVkIGNvbXBsZXRlLCBoZWFkICVkXG4iLAogCQkgIGpvdXJuYWwtPmpfY29tbWl0X3NlcXVlbmNlLCBqb3VybmFsLT5qX3RhaWxfc2VxdWVuY2UpOworCWlmICh0b19mcmVlKQorCQlrZnJlZShjb21taXRfdHJhbnNhY3Rpb24pOwogCiAJd2FrZV91cCgmam91cm5hbC0+al93YWl0X2RvbmVfY29tbWl0KTsKIH0KZGlmZiAtLWdpdCBhL2ZzL2piZDIvam91cm5hbC5jIGIvZnMvamJkMi9qb3VybmFsLmMKaW5kZXggZTcwZDY1Ny4uNTY2NzUzMCAxMDA2NDQKLS0tIGEvZnMvamJkMi9qb3VybmFsLmMKKysrIGIvZnMvamJkMi9qb3VybmFsLmMKQEAgLTQwLDYgKzQwLDcgQEAKIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KIAogRVhQT1JUX1NZTUJPTChqYmQyX2pvdXJuYWxfc3RhcnQpOwogRVhQT1JUX1NZTUJPTChqYmQyX2pvdXJuYWxfcmVzdGFydCk7CkBAIC01MCw2ICs1MSw3IEBACiBFWFBPUlRfU1lNQk9MKGpiZDJfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKTsKIEVYUE9SVF9TWU1CT0woamJkMl9qb3VybmFsX2dldF9jcmVhdGVfYWNjZXNzKTsKIEVYUE9SVF9TWU1CT0woamJkMl9qb3VybmFsX2dldF91bmRvX2FjY2Vzcyk7CitFWFBPUlRfU1lNQk9MKGpiZDJfam91cm5hbF9zZXRfdHJpZ2dlcnMpOwogRVhQT1JUX1NZTUJPTChqYmQyX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEpOwogRVhQT1JUX1NZTUJPTChqYmQyX2pvdXJuYWxfcmVsZWFzZV9idWZmZXIpOwogRVhQT1JUX1NZTUJPTChqYmQyX2pvdXJuYWxfZm9yZ2V0KTsKQEAgLTY1LDcgKzY3LDYgQEAKIEVYUE9SVF9TWU1CT0woamJkMl9qb3VybmFsX2NoZWNrX3VzZWRfZmVhdHVyZXMpOwogRVhQT1JUX1NZTUJPTChqYmQyX2pvdXJuYWxfY2hlY2tfYXZhaWxhYmxlX2ZlYXR1cmVzKTsKIEVYUE9SVF9TWU1CT0woamJkMl9qb3VybmFsX3NldF9mZWF0dXJlcyk7Ci1FWFBPUlRfU1lNQk9MKGpiZDJfam91cm5hbF9jcmVhdGUpOwogRVhQT1JUX1NZTUJPTChqYmQyX2pvdXJuYWxfbG9hZCk7CiBFWFBPUlRfU1lNQk9MKGpiZDJfam91cm5hbF9kZXN0cm95KTsKIEVYUE9SVF9TWU1CT0woamJkMl9qb3VybmFsX2Fib3J0KTsKQEAgLTEzMSw4ICsxMzIsOSBAQAogCWpvdXJuYWwtPmpfdGFzayA9IGN1cnJlbnQ7CiAJd2FrZV91cCgmam91cm5hbC0+al93YWl0X2RvbmVfY29tbWl0KTsKIAotCXByaW50ayhLRVJOX0lORk8gImtqb3VybmFsZDIgc3RhcnRpbmcuICBDb21taXQgaW50ZXJ2YWwgJWxkIHNlY29uZHNcbiIsCi0JCQlqb3VybmFsLT5qX2NvbW1pdF9pbnRlcnZhbCAvIEhaKTsKKwlwcmludGsoS0VSTl9JTkZPICJram91cm5hbGQyIHN0YXJ0aW5nOiBwaWQgJWQsIGRldiAlcywgIgorCSAgICAgICAiY29tbWl0IGludGVydmFsICVsZCBzZWNvbmRzXG4iLCBjdXJyZW50LT5waWQsCisJICAgICAgIGpvdXJuYWwtPmpfZGV2bmFtZSwgam91cm5hbC0+al9jb21taXRfaW50ZXJ2YWwgLyBIWik7CiAKIAkvKgogCSAqIEFuZCBub3csIHdhaXQgZm9yZXZlciBmb3IgY29tbWl0IHdha2V1cCBldmVudHMuCkBAIC0yOTAsNiArMjkyLDcgQEAKIAlzdHJ1Y3QgcGFnZSAqbmV3X3BhZ2U7CiAJdW5zaWduZWQgaW50IG5ld19vZmZzZXQ7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9pbiA9IGpoMmJoKGpoX2luKTsKKwlzdHJ1Y3QgamJkMl9idWZmZXJfdHJpZ2dlcl90eXBlICp0cmlnZ2VyczsKIAogCS8qCiAJICogVGhlIGJ1ZmZlciByZWFsbHkgc2hvdWxkbid0IGJlIGxvY2tlZDogb25seSB0aGUgY3VycmVudCBjb21taXR0aW5nCkBAIC0zMTQsMTMgKzMxNywyMyBAQAogCQlkb25lX2NvcHlfb3V0ID0gMTsKIAkJbmV3X3BhZ2UgPSB2aXJ0X3RvX3BhZ2UoamhfaW4tPmJfZnJvemVuX2RhdGEpOwogCQluZXdfb2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UoamhfaW4tPmJfZnJvemVuX2RhdGEpOworCQl0cmlnZ2VycyA9IGpoX2luLT5iX2Zyb3plbl90cmlnZ2VyczsKIAl9IGVsc2UgewogCQluZXdfcGFnZSA9IGpoMmJoKGpoX2luKS0+Yl9wYWdlOwogCQluZXdfb2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UoamgyYmgoamhfaW4pLT5iX2RhdGEpOworCQl0cmlnZ2VycyA9IGpoX2luLT5iX3RyaWdnZXJzOwogCX0KIAogCW1hcHBlZF9kYXRhID0ga21hcF9hdG9taWMobmV3X3BhZ2UsIEtNX1VTRVIwKTsKIAkvKgorCSAqIEZpcmUgYW55IGNvbW1pdCB0cmlnZ2VyLiAgRG8gdGhpcyBiZWZvcmUgY2hlY2tpbmcgZm9yIGVzY2FwaW5nLAorCSAqIGFzIHRoZSB0cmlnZ2VyIG1heSBtb2RpZnkgdGhlIG1hZ2ljIG9mZnNldC4gIElmIGEgY29weS1vdXQKKwkgKiBoYXBwZW5zIGFmdGVyd2FyZHMsIGl0IHdpbGwgaGF2ZSB0aGUgY29ycmVjdCBkYXRhIGluIHRoZSBidWZmZXIuCisJICovCisJamJkMl9idWZmZXJfY29tbWl0X3RyaWdnZXIoamhfaW4sIG1hcHBlZF9kYXRhICsgbmV3X29mZnNldCwKKwkJCQkgICB0cmlnZ2Vycyk7CisKKwkvKgogCSAqIENoZWNrIGZvciBlc2NhcGluZwogCSAqLwogCWlmICgqKChfX2JlMzIgKikobWFwcGVkX2RhdGEgKyBuZXdfb2Zmc2V0KSkgPT0KQEAgLTM1Miw2ICszNjUsMTMgQEAKIAkJbmV3X3BhZ2UgPSB2aXJ0X3RvX3BhZ2UodG1wKTsKIAkJbmV3X29mZnNldCA9IG9mZnNldF9pbl9wYWdlKHRtcCk7CiAJCWRvbmVfY29weV9vdXQgPSAxOworCisJCS8qCisJCSAqIFRoaXMgaXNuJ3Qgc3RyaWN0bHkgbmVjZXNzYXJ5LCBhcyB3ZSdyZSB1c2luZyBmcm96ZW4KKwkJICogZGF0YSBmb3IgdGhlIGVzY2FwaW5nLCBidXQgaXQga2VlcHMgY29uc2lzdGVuY3kgd2l0aAorCQkgKiBiX2Zyb3plbl9kYXRhIHVzYWdlLgorCQkgKi8KKwkJamhfaW4tPmJfZnJvemVuX3RyaWdnZXJzID0gamhfaW4tPmJfdHJpZ2dlcnM7CiAJfQogCiAJLyoKQEAgLTYzMSw2ICs2NTEsOCBAQAogCQlyZXR1cm4gTlVMTDsKIAogCWJoID0gX19nZXRibGsoam91cm5hbC0+al9kZXYsIGJsb2NrbnIsIGpvdXJuYWwtPmpfYmxvY2tzaXplKTsKKwlpZiAoIWJoKQorCQlyZXR1cm4gTlVMTDsKIAlsb2NrX2J1ZmZlcihiaCk7CiAJbWVtc2V0KGJoLT5iX2RhdGEsIDAsIGpvdXJuYWwtPmpfYmxvY2tzaXplKTsKIAlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKQEAgLTgyNCw2ICs4NDYsOCBAQAogCSAgICBqaWZmaWVzX3RvX21zZWNzKHMtPnN0YXRzLT51LnJ1bi5yc19mbHVzaGluZyAvIHMtPnN0YXRzLT50c190aWQpKTsKIAlzZXFfcHJpbnRmKHNlcSwgIiAgJXVtcyBsb2dnaW5nIHRyYW5zYWN0aW9uXG4iLAogCSAgICBqaWZmaWVzX3RvX21zZWNzKHMtPnN0YXRzLT51LnJ1bi5yc19sb2dnaW5nIC8gcy0+c3RhdHMtPnRzX3RpZCkpOworCXNlcV9wcmludGYoc2VxLCAiICAlbHV1cyBhdmVyYWdlIHRyYW5zYWN0aW9uIGNvbW1pdCB0aW1lXG4iLAorCQkgICBkb19kaXYocy0+am91cm5hbC0+al9hdmVyYWdlX2NvbW1pdF90aW1lLCAxMDAwKSk7CiAJc2VxX3ByaW50ZihzZXEsICIgICVsdSBoYW5kbGVzIHBlciB0cmFuc2FjdGlvblxuIiwKIAkgICAgcy0+c3RhdHMtPnUucnVuLnJzX2hhbmRsZV9jb3VudCAvIHMtPnN0YXRzLT50c190aWQpOwogCXNlcV9wcmludGYoc2VxLCAiICAlbHUgYmxvY2tzIHBlciB0cmFuc2FjdGlvblxuIiwKQEAgLTk2MSw2ICs5ODUsOCBAQAogCXNwaW5fbG9ja19pbml0KCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOwogCiAJam91cm5hbC0+al9jb21taXRfaW50ZXJ2YWwgPSAoSFogKiBKQkQyX0RFRkFVTFRfTUFYX0NPTU1JVF9BR0UpOworCWpvdXJuYWwtPmpfbWluX2JhdGNoX3RpbWUgPSAwOworCWpvdXJuYWwtPmpfbWF4X2JhdGNoX3RpbWUgPSAxNTAwMDsgLyogMTVtcyAqLwogCiAJLyogVGhlIGpvdXJuYWwgaXMgbWFya2VkIGZvciBlcnJvciB1bnRpbCB3ZSBzdWNjZWVkIHdpdGggcmVjb3ZlcnkhICovCiAJam91cm5hbC0+al9mbGFncyA9IEpCRDJfQUJPUlQ7CkBAIC0xMDE2LDE1ICsxMDQyLDE0IEBACiAKIAkvKiBqb3VybmFsIGRlc2NyaXB0b3IgY2FuIHN0b3JlIHVwIHRvIG4gYmxvY2tzIC1ienp6ICovCiAJam91cm5hbC0+al9ibG9ja3NpemUgPSBibG9ja3NpemU7CisJamJkMl9zdGF0c19wcm9jX2luaXQoam91cm5hbCk7CiAJbiA9IGpvdXJuYWwtPmpfYmxvY2tzaXplIC8gc2l6ZW9mKGpvdXJuYWxfYmxvY2tfdGFnX3QpOwogCWpvdXJuYWwtPmpfd2J1ZnNpemUgPSBuOwogCWpvdXJuYWwtPmpfd2J1ZiA9IGttYWxsb2MobiAqIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQqKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFqb3VybmFsLT5qX3didWYpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2FudCBhbGxvY2F0ZSBiaHMgZm9yIGNvbW1pdCB0aHJlYWRcbiIsCiAJCQlfX2Z1bmNfXyk7Ci0JCWtmcmVlKGpvdXJuYWwpOwotCQlqb3VybmFsID0gTlVMTDsKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X2VycjsKIAl9CiAJam91cm5hbC0+al9kZXYgPSBiZGV2OwogCWpvdXJuYWwtPmpfZnNfZGV2ID0gZnNfZGV2OwpAQCAtMTAzNCwxNCArMTA1OSwyMiBAQAogCXAgPSBqb3VybmFsLT5qX2Rldm5hbWU7CiAJd2hpbGUgKChwID0gc3RyY2hyKHAsICcvJykpKQogCQkqcCA9ICchJzsKLQlqYmQyX3N0YXRzX3Byb2NfaW5pdChqb3VybmFsKTsKIAogCWJoID0gX19nZXRibGsoam91cm5hbC0+al9kZXYsIHN0YXJ0LCBqb3VybmFsLT5qX2Jsb2Nrc2l6ZSk7Ci0JSl9BU1NFUlQoYmggIT0gTlVMTCk7CisJaWYgKCFiaCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICIlczogQ2Fubm90IGdldCBidWZmZXIgZm9yIGpvdXJuYWwgc3VwZXJibG9ja1xuIiwKKwkJICAgICAgIF9fZnVuY19fKTsKKwkJZ290byBvdXRfZXJyOworCX0KIAlqb3VybmFsLT5qX3NiX2J1ZmZlciA9IGJoOwogCWpvdXJuYWwtPmpfc3VwZXJibG9jayA9IChqb3VybmFsX3N1cGVyYmxvY2tfdCAqKWJoLT5iX2RhdGE7Ci1vdXQ6CisKIAlyZXR1cm4gam91cm5hbDsKK291dF9lcnI6CisJamJkMl9zdGF0c19wcm9jX2V4aXQoam91cm5hbCk7CisJa2ZyZWUoam91cm5hbCk7CisJcmV0dXJuIE5VTEw7CiB9CiAKIC8qKgpAQCAtMTA4OSw5ICsxMTIyLDcgQEAKIAlpZiAoIWpvdXJuYWwtPmpfd2J1ZikgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW50IGFsbG9jYXRlIGJocyBmb3IgY29tbWl0IHRocmVhZFxuIiwKIAkJCV9fZnVuY19fKTsKLQkJamJkMl9zdGF0c19wcm9jX2V4aXQoam91cm5hbCk7Ci0JCWtmcmVlKGpvdXJuYWwpOwotCQlyZXR1cm4gTlVMTDsKKwkJZ290byBvdXRfZXJyOwogCX0KIAogCWVyciA9IGpiZDJfam91cm5hbF9ibWFwKGpvdXJuYWwsIDAsICZibG9ja25yKTsKQEAgLTEwOTksMTcgKzExMzAsMjQgQEAKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbm5ub3QgbG9jYXRlIGpvdXJuYWwgc3VwZXJibG9ja1xuIiwKIAkJICAgICAgIF9fZnVuY19fKTsKLQkJamJkMl9zdGF0c19wcm9jX2V4aXQoam91cm5hbCk7Ci0JCWtmcmVlKGpvdXJuYWwpOwotCQlyZXR1cm4gTlVMTDsKKwkJZ290byBvdXRfZXJyOwogCX0KIAogCWJoID0gX19nZXRibGsoam91cm5hbC0+al9kZXYsIGJsb2NrbnIsIGpvdXJuYWwtPmpfYmxvY2tzaXplKTsKLQlKX0FTU0VSVChiaCAhPSBOVUxMKTsKKwlpZiAoIWJoKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIiVzOiBDYW5ub3QgZ2V0IGJ1ZmZlciBmb3Igam91cm5hbCBzdXBlcmJsb2NrXG4iLAorCQkgICAgICAgX19mdW5jX18pOworCQlnb3RvIG91dF9lcnI7CisJfQogCWpvdXJuYWwtPmpfc2JfYnVmZmVyID0gYmg7CiAJam91cm5hbC0+al9zdXBlcmJsb2NrID0gKGpvdXJuYWxfc3VwZXJibG9ja190ICopYmgtPmJfZGF0YTsKIAogCXJldHVybiBqb3VybmFsOworb3V0X2VycjoKKwlqYmQyX3N0YXRzX3Byb2NfZXhpdChqb3VybmFsKTsKKwlrZnJlZShqb3VybmFsKTsKKwlyZXR1cm4gTlVMTDsKIH0KIAogLyoKQEAgLTExNTgsNzcgKzExOTYsNiBAQAogfQogCiAvKioKLSAqIGludCBqYmQyX2pvdXJuYWxfY3JlYXRlKCkgLSBJbml0aWFsaXNlIHRoZSBuZXcgam91cm5hbCBmaWxlCi0gKiBAam91cm5hbDogSm91cm5hbCB0byBjcmVhdGUuIFRoaXMgc3RydWN0dXJlIG11c3QgaGF2ZSBiZWVuIGluaXRpYWxpc2VkCi0gKgotICogR2l2ZW4gYSBqb3VybmFsX3Qgc3RydWN0dXJlIHdoaWNoIHRlbGxzIHVzIHdoaWNoIGRpc2sgYmxvY2tzIHdlIGNhbgotICogdXNlLCBjcmVhdGUgYSBuZXcgam91cm5hbCBzdXBlcmJsb2NrIGFuZCBpbml0aWFsaXNlIGFsbCBvZiB0aGUKLSAqIGpvdXJuYWwgZmllbGRzIGZyb20gc2NyYXRjaC4KLSAqKi8KLWludCBqYmQyX2pvdXJuYWxfY3JlYXRlKGpvdXJuYWxfdCAqam91cm5hbCkKLXsKLQl1bnNpZ25lZCBsb25nIGxvbmcgYmxvY2tucjsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwotCWpvdXJuYWxfc3VwZXJibG9ja190ICpzYjsKLQlpbnQgaSwgZXJyOwotCi0JaWYgKGpvdXJuYWwtPmpfbWF4bGVuIDwgSkJEMl9NSU5fSk9VUk5BTF9CTE9DS1MpIHsKLQkJcHJpbnRrIChLRVJOX0VSUiAiSm91cm5hbCBsZW5ndGggKCVkIGJsb2NrcykgdG9vIHNob3J0LlxuIiwKLQkJCWpvdXJuYWwtPmpfbWF4bGVuKTsKLQkJam91cm5hbF9mYWlsX3N1cGVyYmxvY2soam91cm5hbCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChqb3VybmFsLT5qX2lub2RlID09IE5VTEwpIHsKLQkJLyoKLQkJICogV2UgZG9uJ3Qga25vdyB3aGF0IGJsb2NrIHRvIHN0YXJ0IGF0IQotCQkgKi8KLQkJcHJpbnRrKEtFUk5fRU1FUkcKLQkJICAgICAgICIlczogY3JlYXRpb24gb2Ygam91cm5hbCBvbiBleHRlcm5hbCBkZXZpY2UhXG4iLAotCQkgICAgICAgX19mdW5jX18pOwotCQlCVUcoKTsKLQl9Ci0KLQkvKiBaZXJvIG91dCB0aGUgZW50aXJlIGpvdXJuYWwgb24gZGlzay4gIFdlIGNhbm5vdCBhZmZvcmQgdG8KLQkgICBoYXZlIGFueSBibG9ja3Mgb24gZGlzayBiZWdpbm5pbmcgd2l0aCBKQkQyX01BR0lDX05VTUJFUi4gKi8KLQlqYmRfZGVidWcoMSwgIkpCRDogWmVyb2luZyBvdXQgam91cm5hbCBibG9ja3MuLi5cbiIpOwotCWZvciAoaSA9IDA7IGkgPCBqb3VybmFsLT5qX21heGxlbjsgaSsrKSB7Ci0JCWVyciA9IGpiZDJfam91cm5hbF9ibWFwKGpvdXJuYWwsIGksICZibG9ja25yKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JCWJoID0gX19nZXRibGsoam91cm5hbC0+al9kZXYsIGJsb2NrbnIsIGpvdXJuYWwtPmpfYmxvY2tzaXplKTsKLQkJbG9ja19idWZmZXIoYmgpOwotCQltZW1zZXQgKGJoLT5iX2RhdGEsIDAsIGpvdXJuYWwtPmpfYmxvY2tzaXplKTsKLQkJQlVGRkVSX1RSQUNFKGJoLCAibWFya2luZyBkaXJ0eSIpOwotCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7Ci0JCUJVRkZFUl9UUkFDRShiaCwgIm1hcmtpbmcgdXB0b2RhdGUiKTsKLQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7Ci0JCXVubG9ja19idWZmZXIoYmgpOwotCQlfX2JyZWxzZShiaCk7Ci0JfQotCi0Jc3luY19ibG9ja2Rldihqb3VybmFsLT5qX2Rldik7Ci0JamJkX2RlYnVnKDEsICJKQkQ6IGpvdXJuYWwgY2xlYXJlZC5cbiIpOwotCi0JLyogT0ssIGZpbGwgaW4gdGhlIGluaXRpYWwgc3RhdGljIGZpZWxkcyBpbiB0aGUgbmV3IHN1cGVyYmxvY2sgKi8KLQlzYiA9IGpvdXJuYWwtPmpfc3VwZXJibG9jazsKLQotCXNiLT5zX2hlYWRlci5oX21hZ2ljCSA9IGNwdV90b19iZTMyKEpCRDJfTUFHSUNfTlVNQkVSKTsKLQlzYi0+c19oZWFkZXIuaF9ibG9ja3R5cGUgPSBjcHVfdG9fYmUzMihKQkQyX1NVUEVSQkxPQ0tfVjIpOwotCi0Jc2ItPnNfYmxvY2tzaXplCT0gY3B1X3RvX2JlMzIoam91cm5hbC0+al9ibG9ja3NpemUpOwotCXNiLT5zX21heGxlbgk9IGNwdV90b19iZTMyKGpvdXJuYWwtPmpfbWF4bGVuKTsKLQlzYi0+c19maXJzdAk9IGNwdV90b19iZTMyKDEpOwotCi0Jam91cm5hbC0+al90cmFuc2FjdGlvbl9zZXF1ZW5jZSA9IDE7Ci0KLQlqb3VybmFsLT5qX2ZsYWdzICY9IH5KQkQyX0FCT1JUOwotCWpvdXJuYWwtPmpfZm9ybWF0X3ZlcnNpb24gPSAyOwotCi0JcmV0dXJuIGpvdXJuYWxfcmVzZXQoam91cm5hbCk7Ci19Ci0KLS8qKgogICogdm9pZCBqYmQyX2pvdXJuYWxfdXBkYXRlX3N1cGVyYmxvY2soKSAtIFVwZGF0ZSBqb3VybmFsIHNiIG9uIGRpc2suCiAgKiBAam91cm5hbDogVGhlIGpvdXJuYWwgdG8gdXBkYXRlLgogICogQHdhaXQ6IFNldCB0byAnMCcgaWYgeW91IGRvbid0IHdhbnQgdG8gd2FpdCBmb3IgSU8gY29tcGxldGlvbi4KQEAgLTE0NzIsNyArMTQzOSw5IEBACiAJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CiAJd2hpbGUgKGpvdXJuYWwtPmpfY2hlY2twb2ludF90cmFuc2FjdGlvbnMgIT0gTlVMTCkgewogCQlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCQltdXRleF9sb2NrKCZqb3VybmFsLT5qX2NoZWNrcG9pbnRfbXV0ZXgpOwogCQlqYmQyX2xvZ19kb19jaGVja3BvaW50KGpvdXJuYWwpOworCQltdXRleF91bmxvY2soJmpvdXJuYWwtPmpfY2hlY2twb2ludF9tdXRleCk7CiAJCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOwogCX0KIApkaWZmIC0tZ2l0IGEvZnMvamJkMi90cmFuc2FjdGlvbi5jIGIvZnMvamJkMi90cmFuc2FjdGlvbi5jCmluZGV4IDM5Yjc4MDUuLjQ2YjRlMzQgMTAwNjQ0Ci0tLSBhL2ZzL2piZDIvdHJhbnNhY3Rpb24uYworKysgYi9mcy9qYmQyL3RyYW5zYWN0aW9uLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KIAogc3RhdGljIHZvaWQgX19qYmQyX2pvdXJuYWxfdGVtcF91bmxpbmtfYnVmZmVyKHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKTsKIApAQCAtNDgsNiArNDksNyBAQAogewogCXRyYW5zYWN0aW9uLT50X2pvdXJuYWwgPSBqb3VybmFsOwogCXRyYW5zYWN0aW9uLT50X3N0YXRlID0gVF9SVU5OSU5HOworCXRyYW5zYWN0aW9uLT50X3N0YXJ0X3RpbWUgPSBrdGltZV9nZXQoKTsKIAl0cmFuc2FjdGlvbi0+dF90aWQgPSBqb3VybmFsLT5qX3RyYW5zYWN0aW9uX3NlcXVlbmNlKys7CiAJdHJhbnNhY3Rpb24tPnRfZXhwaXJlcyA9IGppZmZpZXMgKyBqb3VybmFsLT5qX2NvbW1pdF9pbnRlcnZhbDsKIAlzcGluX2xvY2tfaW5pdCgmdHJhbnNhY3Rpb24tPnRfaGFuZGxlX2xvY2spOwpAQCAtNzQxLDYgKzc0MywxMiBAQAogCQlzb3VyY2UgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CiAJCW1lbWNweShqaC0+Yl9mcm96ZW5fZGF0YSwgc291cmNlK29mZnNldCwgamgyYmgoamgpLT5iX3NpemUpOwogCQlrdW5tYXBfYXRvbWljKHNvdXJjZSwgS01fVVNFUjApOworCisJCS8qCisJCSAqIE5vdyB0aGF0IHRoZSBmcm96ZW4gZGF0YSBpcyBzYXZlZCBvZmYsIHdlIG5lZWQgdG8gc3RvcmUKKwkJICogYW55IG1hdGNoaW5nIHRyaWdnZXJzLgorCQkgKi8KKwkJamgtPmJfZnJvemVuX3RyaWdnZXJzID0gamgtPmJfdHJpZ2dlcnM7CiAJfQogCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOwogCkBAIC05NDQsNiArOTUyLDQ3IEBACiB9CiAKIC8qKgorICogdm9pZCBqYmQyX2pvdXJuYWxfc2V0X3RyaWdnZXJzKCkgLSBBZGQgdHJpZ2dlcnMgZm9yIGNvbW1pdCB3cml0ZW91dAorICogQGJoOiBidWZmZXIgdG8gdHJpZ2dlciBvbgorICogQHR5cGU6IHN0cnVjdCBqYmQyX2J1ZmZlcl90cmlnZ2VyX3R5cGUgY29udGFpbmluZyB0aGUgdHJpZ2dlcihzKS4KKyAqCisgKiBTZXQgYW55IHRyaWdnZXJzIG9uIHRoaXMgam91cm5hbF9oZWFkLiAgVGhpcyBpcyBhbHdheXMgc2FmZSwgYmVjYXVzZQorICogdHJpZ2dlcnMgZm9yIGEgY29tbWl0dGluZyBidWZmZXIgd2lsbCBiZSBzYXZlZCBvZmYsIGFuZCB0cmlnZ2VycyBmb3IKKyAqIGEgcnVubmluZyB0cmFuc2FjdGlvbiB3aWxsIG1hdGNoIHRoZSBidWZmZXIgaW4gdGhhdCB0cmFuc2FjdGlvbi4KKyAqCisgKiBDYWxsIHdpdGggTlVMTCB0byBjbGVhciB0aGUgdHJpZ2dlcnMuCisgKi8KK3ZvaWQgamJkMl9qb3VybmFsX3NldF90cmlnZ2VycyhzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAorCQkJICAgICAgIHN0cnVjdCBqYmQyX2J1ZmZlcl90cmlnZ2VyX3R5cGUgKnR5cGUpCit7CisJc3RydWN0IGpvdXJuYWxfaGVhZCAqamggPSBiaDJqaChiaCk7CisKKwlqaC0+Yl90cmlnZ2VycyA9IHR5cGU7Cit9CisKK3ZvaWQgamJkMl9idWZmZXJfY29tbWl0X3RyaWdnZXIoc3RydWN0IGpvdXJuYWxfaGVhZCAqamgsIHZvaWQgKm1hcHBlZF9kYXRhLAorCQkJCXN0cnVjdCBqYmQyX2J1ZmZlcl90cmlnZ2VyX3R5cGUgKnRyaWdnZXJzKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBqaDJiaChqaCk7CisKKwlpZiAoIXRyaWdnZXJzIHx8ICF0cmlnZ2Vycy0+dF9jb21taXQpCisJCXJldHVybjsKKworCXRyaWdnZXJzLT50X2NvbW1pdCh0cmlnZ2VycywgYmgsIG1hcHBlZF9kYXRhLCBiaC0+Yl9zaXplKTsKK30KKwordm9pZCBqYmQyX2J1ZmZlcl9hYm9ydF90cmlnZ2VyKHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoLAorCQkJICAgICAgIHN0cnVjdCBqYmQyX2J1ZmZlcl90cmlnZ2VyX3R5cGUgKnRyaWdnZXJzKQoreworCWlmICghdHJpZ2dlcnMgfHwgIXRyaWdnZXJzLT50X2Fib3J0KQorCQlyZXR1cm47CisKKwl0cmlnZ2Vycy0+dF9hYm9ydCh0cmlnZ2VycywgamgyYmgoamgpKTsKK30KKworCisKKy8qKgogICogaW50IGpiZDJfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSgpIC0gIG1hcmsgYSBidWZmZXIgYXMgY29udGFpbmluZyBkaXJ0eSBtZXRhZGF0YQogICogQGhhbmRsZTogdHJhbnNhY3Rpb24gdG8gYWRkIGJ1ZmZlciB0by4KICAqIEBiaDogYnVmZmVyIHRvIG1hcmsKQEAgLTExOTMsNyArMTI0Miw3IEBACiB7CiAJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb24gPSBoYW5kbGUtPmhfdHJhbnNhY3Rpb247CiAJam91cm5hbF90ICpqb3VybmFsID0gdHJhbnNhY3Rpb24tPnRfam91cm5hbDsKLQlpbnQgb2xkX2hhbmRsZV9jb3VudCwgZXJyOworCWludCBlcnI7CiAJcGlkX3QgcGlkOwogCiAJSl9BU1NFUlQoam91cm5hbF9jdXJyZW50X2hhbmRsZSgpID09IGhhbmRsZSk7CkBAIC0xMjE2LDI0ICsxMjY1LDU0IEBACiAJLyoKIAkgKiBJbXBsZW1lbnQgc3luY2hyb25vdXMgdHJhbnNhY3Rpb24gYmF0Y2hpbmcuICBJZiB0aGUgaGFuZGxlCiAJICogd2FzIHN5bmNocm9ub3VzLCBkb24ndCBmb3JjZSBhIGNvbW1pdCBpbW1lZGlhdGVseS4gIExldCdzCi0JICogeWllbGQgYW5kIGxldCBhbm90aGVyIHRocmVhZCBwaWdneWJhY2sgb250byB0aGlzIHRyYW5zYWN0aW9uLgotCSAqIEtlZXAgZG9pbmcgdGhhdCB3aGlsZSBuZXcgdGhyZWFkcyBjb250aW51ZSB0byBhcnJpdmUuCi0JICogSXQgZG9lc24ndCBjb3N0IG11Y2ggLSB3ZSdyZSBhYm91dCB0byBydW4gYSBjb21taXQgYW5kIHNsZWVwCi0JICogb24gSU8gYW55d2F5LiAgU3BlZWRzIHVwIG1hbnktdGhyZWFkZWQsIG1hbnktZGlyIG9wZXJhdGlvbnMKLQkgKiBieSAzMHggb3IgbW9yZS4uLgorCSAqIHlpZWxkIGFuZCBsZXQgYW5vdGhlciB0aHJlYWQgcGlnZ3liYWNrIG9udG8gdGhpcworCSAqIHRyYW5zYWN0aW9uLiAgS2VlcCBkb2luZyB0aGF0IHdoaWxlIG5ldyB0aHJlYWRzIGNvbnRpbnVlIHRvCisJICogYXJyaXZlLiAgSXQgZG9lc24ndCBjb3N0IG11Y2ggLSB3ZSdyZSBhYm91dCB0byBydW4gYSBjb21taXQKKwkgKiBhbmQgc2xlZXAgb24gSU8gYW55d2F5LiAgU3BlZWRzIHVwIG1hbnktdGhyZWFkZWQsIG1hbnktZGlyCisJICogb3BlcmF0aW9ucyBieSAzMHggb3IgbW9yZS4uLgogCSAqCi0JICogQnV0IGRvbid0IGRvIHRoaXMgaWYgdGhpcyBwcm9jZXNzIHdhcyB0aGUgbW9zdCByZWNlbnQgb25lIHRvCi0JICogcGVyZm9ybSBhIHN5bmNocm9ub3VzIHdyaXRlLiAgV2UgZG8gdGhpcyB0byBkZXRlY3QgdGhlIGNhc2Ugd2hlcmUgYQotCSAqIHNpbmdsZSBwcm9jZXNzIGlzIGRvaW5nIGEgc3RyZWFtIG9mIHN5bmMgd3JpdGVzLiAgTm8gcG9pbnQgaW4gd2FpdGluZwotCSAqIGZvciBqb2luZXJzIGluIHRoYXQgY2FzZS4KKwkgKiBXZSB0cnkgYW5kIG9wdGltaXplIHRoZSBzbGVlcCB0aW1lIGFnYWluc3Qgd2hhdCB0aGUKKwkgKiB1bmRlcmx5aW5nIGRpc2sgY2FuIGRvLCBpbnN0ZWFkIG9mIGhhdmluZyBhIHN0YXRpYyBzbGVlcAorCSAqIHRpbWUuICBUaGlzIGlzIHVzZWZ1bCBmb3IgdGhlIGNhc2Ugd2hlcmUgb3VyIHN0b3JhZ2UgaXMgc28KKwkgKiBmYXN0IHRoYXQgaXQgaXMgbW9yZSBvcHRpbWFsIHRvIGdvIGFoZWFkIGFuZCBmb3JjZSBhIGZsdXNoCisJICogYW5kIHdhaXQgZm9yIHRoZSB0cmFuc2FjdGlvbiB0byBiZSBjb21taXR0ZWQgdGhhbiBpdCBpcyB0bworCSAqIHdhaXQgZm9yIGFuIGFyYml0cmFyeSBhbW91bnQgb2YgdGltZSBmb3IgbmV3IHdyaXRlcnMgdG8KKwkgKiBqb2luIHRoZSB0cmFuc2FjdGlvbi4gIFdlIGFjaGlldmUgdGhpcyBieSBtZWFzdXJpbmcgaG93CisJICogbG9uZyBpdCB0YWtlcyB0byBjb21taXQgYSB0cmFuc2FjdGlvbiwgYW5kIGNvbXBhcmUgaXQgd2l0aAorCSAqIGhvdyBsb25nIHRoaXMgdHJhbnNhY3Rpb24gaGFzIGJlZW4gcnVubmluZywgYW5kIGlmIHJ1biB0aW1lCisJICogPCBjb21taXQgdGltZSB0aGVuIHdlIHNsZWVwIGZvciB0aGUgZGVsdGEgYW5kIGNvbW1pdC4gIFRoaXMKKwkgKiBncmVhdGx5IGhlbHBzIHN1cGVyIGZhc3QgZGlza3MgdGhhdCB3b3VsZCBzZWUgc2xvd2Rvd25zIGFzCisJICogbW9yZSB0aHJlYWRzIHN0YXJ0ZWQgZG9pbmcgZnN5bmNzLgorCSAqCisJICogQnV0IGRvbid0IGRvIHRoaXMgaWYgdGhpcyBwcm9jZXNzIHdhcyB0aGUgbW9zdCByZWNlbnQgb25lCisJICogdG8gcGVyZm9ybSBhIHN5bmNocm9ub3VzIHdyaXRlLiAgV2UgZG8gdGhpcyB0byBkZXRlY3QgdGhlCisJICogY2FzZSB3aGVyZSBhIHNpbmdsZSBwcm9jZXNzIGlzIGRvaW5nIGEgc3RyZWFtIG9mIHN5bmMKKwkgKiB3cml0ZXMuICBObyBwb2ludCBpbiB3YWl0aW5nIGZvciBqb2luZXJzIGluIHRoYXQgY2FzZS4KIAkgKi8KIAlwaWQgPSBjdXJyZW50LT5waWQ7CiAJaWYgKGhhbmRsZS0+aF9zeW5jICYmIGpvdXJuYWwtPmpfbGFzdF9zeW5jX3dyaXRlciAhPSBwaWQpIHsKKwkJdTY0IGNvbW1pdF90aW1lLCB0cmFuc190aW1lOworCiAJCWpvdXJuYWwtPmpfbGFzdF9zeW5jX3dyaXRlciA9IHBpZDsKLQkJZG8gewotCQkJb2xkX2hhbmRsZV9jb3VudCA9IHRyYW5zYWN0aW9uLT50X2hhbmRsZV9jb3VudDsKLQkJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwotCQl9IHdoaWxlIChvbGRfaGFuZGxlX2NvdW50ICE9IHRyYW5zYWN0aW9uLT50X2hhbmRsZV9jb3VudCk7CisKKwkJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCQljb21taXRfdGltZSA9IGpvdXJuYWwtPmpfYXZlcmFnZV9jb21taXRfdGltZTsKKwkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisKKwkJdHJhbnNfdGltZSA9IGt0aW1lX3RvX25zKGt0aW1lX3N1YihrdGltZV9nZXQoKSwKKwkJCQkJCSAgIHRyYW5zYWN0aW9uLT50X3N0YXJ0X3RpbWUpKTsKKworCQljb21taXRfdGltZSA9IG1heF90KHU2NCwgY29tbWl0X3RpbWUsCisJCQkJICAgIDEwMDAqam91cm5hbC0+al9taW5fYmF0Y2hfdGltZSk7CisJCWNvbW1pdF90aW1lID0gbWluX3QodTY0LCBjb21taXRfdGltZSwKKwkJCQkgICAgMTAwMCpqb3VybmFsLT5qX21heF9iYXRjaF90aW1lKTsKKworCQlpZiAodHJhbnNfdGltZSA8IGNvbW1pdF90aW1lKSB7CisJCQlrdGltZV90IGV4cGlyZXMgPSBrdGltZV9hZGRfbnMoa3RpbWVfZ2V0KCksCisJCQkJCQkgICAgICAgY29tbWl0X3RpbWUpOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfaHJ0aW1lb3V0KCZleHBpcmVzLCBIUlRJTUVSX01PREVfQUJTKTsKKwkJfQogCX0KIAogCWN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IE5VTEw7CmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX2ltYXAuYyBiL2ZzL2pmcy9qZnNfaW1hcC5jCmluZGV4IGQ2MzYzZDguLjBmOTQzODEgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9qZnNfaW1hcC5jCisrKyBiL2ZzL2pmcy9qZnNfaW1hcC5jCkBAIC01OCw5ICs1OCw5IEBACiAKIC8qCiAgKiBfX21hcmtfaW5vZGVfZGlydHkgZXhwZWN0cyBpbm9kZXMgdG8gYmUgaGFzaGVkLiAgU2luY2Ugd2UgZG9uJ3Qgd2FudAotICogc3BlY2lhbCBpbm9kZXMgaW4gdGhlIGZpbGVzZXQgaW5vZGUgc3BhY2UsIHdlIGhhc2ggdGhlbSB0byBhIGR1bW15IGhlYWQKKyAqIHNwZWNpYWwgaW5vZGVzIGluIHRoZSBmaWxlc2V0IGlub2RlIHNwYWNlLCB3ZSBtYWtlIHRoZW0gYXBwZWFyIGhhc2hlZCwKKyAqIGJ1dCBkbyBub3QgcHV0IG9uIGFueSBsaXN0cy4KICAqLwotc3RhdGljIEhMSVNUX0hFQUQoYWdncmVnYXRlX2hhc2gpOwogCiAvKgogICogaW1hcCBsb2NrcwpAQCAtNDk2LDcgKzQ5NiwxMSBAQAogCS8qIHJlbGVhc2UgdGhlIHBhZ2UgKi8KIAlyZWxlYXNlX21ldGFwYWdlKG1wKTsKIAotCWhsaXN0X2FkZF9oZWFkKCZpcC0+aV9oYXNoLCAmYWdncmVnYXRlX2hhc2gpOworCS8qCisJICogdGhhdCB3aWxsIGxvb2sgaGFzaGVkLCBidXQgd29uJ3QgYmUgb24gYW55IGxpc3Q7IGhsaXN0X2RlbCgpCisJICogd2lsbCB3b3JrIGZpbmUgYW5kIHJlcXVpcmUgbm8gbG9ja2luZy4KKwkgKi8KKwlpcC0+aV9oYXNoLnBwcmV2ID0gJmlwLT5pX2hhc2gubmV4dDsKIAogCXJldHVybiAoaXApOwogfQpkaWZmIC0tZ2l0IGEvZnMvbGliZnMuYyBiL2ZzL2xpYmZzLmMKaW5kZXggYmRhZWMxNy4uNDliNDQwOSAxMDA2NDQKLS0tIGEvZnMvbGliZnMuYworKysgYi9mcy9saWJmcy5jCkBAIC0yMzEsNyArMjMxLDYgQEAKIAkgKi8KIAlyb290LT5pX2lubyA9IDE7CiAJcm9vdC0+aV9tb2RlID0gU19JRkRJUiB8IFNfSVJVU1IgfCBTX0lXVVNSOwotCXJvb3QtPmlfdWlkID0gcm9vdC0+aV9naWQgPSAwOwogCXJvb3QtPmlfYXRpbWUgPSByb290LT5pX210aW1lID0gcm9vdC0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKIAlkZW50cnkgPSBkX2FsbG9jKE5VTEwsICZkX25hbWUpOwogCWlmICghZGVudHJ5KSB7CkBAIC00MzYsOCArNDM1LDYgQEAKIAkgKi8KIAlpbm9kZS0+aV9pbm8gPSAxOwogCWlub2RlLT5pX21vZGUgPSBTX0lGRElSIHwgMDc1NTsKLQlpbm9kZS0+aV91aWQgPSBpbm9kZS0+aV9naWQgPSAwOwotCWlub2RlLT5pX2Jsb2NrcyA9IDA7CiAJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCWlub2RlLT5pX29wID0gJnNpbXBsZV9kaXJfaW5vZGVfb3BlcmF0aW9uczsKIAlpbm9kZS0+aV9mb3AgPSAmc2ltcGxlX2Rpcl9vcGVyYXRpb25zOwpAQCAtNDY0LDggKzQ2MSw2IEBACiAJCWlmICghaW5vZGUpCiAJCQlnb3RvIG91dDsKIAkJaW5vZGUtPmlfbW9kZSA9IFNfSUZSRUcgfCBmaWxlcy0+bW9kZTsKLQkJaW5vZGUtPmlfdWlkID0gaW5vZGUtPmlfZ2lkID0gMDsKLQkJaW5vZGUtPmlfYmxvY2tzID0gMDsKIAkJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCQlpbm9kZS0+aV9mb3AgPSBmaWxlcy0+b3BzOwogCQlpbm9kZS0+aV9pbm8gPSBpOwpkaWZmIC0tZ2l0IGEvZnMvbG9ja2QvY2xudHByb2MuYyBiL2ZzL2xvY2tkL2NsbnRwcm9jLmMKaW5kZXggMzE2NjhiNi4uZGQ3OTU3MCAxMDA2NDQKLS0tIGEvZnMvbG9ja2QvY2xudHByb2MuYworKysgYi9mcy9sb2NrZC9jbG50cHJvYy5jCkBAIC0xNiw3ICsxNiw2IEBACiAjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CiAjaW5jbHVkZSA8bGludXgvbG9ja2QvbG9ja2QuaD4KLSNpbmNsdWRlIDxsaW51eC9sb2NrZC9zbV9pbnRlci5oPgogCiAjZGVmaW5lIE5MTURCR19GQUNJTElUWQkJTkxNREJHX0NMSUVOVAogI2RlZmluZSBOTE1DTE5UX0dSQUNFX1dBSVQJKDUqSFopCkBAIC01MTgsMTEgKzUxNyw5IEBACiAJdW5zaWduZWQgY2hhciBmbF90eXBlOwogCWludCBzdGF0dXMgPSAtRU5PTENLOwogCi0JaWYgKG5zbV9tb25pdG9yKGhvc3QpIDwgMCkgewotCQlwcmludGsoS0VSTl9OT1RJQ0UgImxvY2tkOiBmYWlsZWQgdG8gbW9uaXRvciAlc1xuIiwKLQkJCQkJaG9zdC0+aF9uYW1lKTsKKwlpZiAobnNtX21vbml0b3IoaG9zdCkgPCAwKQogCQlnb3RvIG91dDsKLQl9CisKIAlmbC0+ZmxfZmxhZ3MgfD0gRkxfQUNDRVNTOwogCXN0YXR1cyA9IGRvX3Zmc19sb2NrKGZsKTsKIAlmbC0+ZmxfZmxhZ3MgPSBmbF9mbGFnczsKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL2hvc3QuYyBiL2ZzL2xvY2tkL2hvc3QuYwppbmRleCBhYmRlYmY3Li45OWQ3MzdiIDEwMDY0NAotLS0gYS9mcy9sb2NrZC9ob3N0LmMKKysrIGIvZnMvbG9ja2QvaG9zdC5jCkBAIC0xNSw3ICsxNSw2IEBACiAjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CiAjaW5jbHVkZSA8bGludXgvbG9ja2QvbG9ja2QuaD4KLSNpbmNsdWRlIDxsaW51eC9sb2NrZC9zbV9pbnRlci5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKICNpbmNsdWRlIDxuZXQvaXB2Ni5oPgpAQCAtMzIsMTEgKzMxLDYgQEAKIHN0YXRpYyBERUZJTkVfTVVURVgobmxtX2hvc3RfbXV0ZXgpOwogCiBzdGF0aWMgdm9pZAkJCW5sbV9nY19ob3N0cyh2b2lkKTsKLXN0YXRpYyBzdHJ1Y3QgbnNtX2hhbmRsZQkqbnNtX2ZpbmQoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXAsCi0JCQkJCQljb25zdCBzaXplX3Qgc2FsZW4sCi0JCQkJCQljb25zdCBjaGFyICpob3N0bmFtZSwKLQkJCQkJCWNvbnN0IHNpemVfdCBob3N0bmFtZV9sZW4sCi0JCQkJCQljb25zdCBpbnQgY3JlYXRlKTsKIAogc3RydWN0IG5sbV9sb29rdXBfaG9zdF9pbmZvIHsKIAljb25zdCBpbnQJCXNlcnZlcjsJCS8qIHNlYXJjaCBmb3Igc2VydmVyfGNsaWVudCAqLwpAQCAtMTA1LDMyICs5OSw2IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBubG1fZGlzcGxheV9hZGRyZXNzKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwLAotCQkJCWNoYXIgKmJ1ZiwgY29uc3Qgc2l6ZV90IGxlbikKLXsKLQljb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzYXA7Ci0JY29uc3Qgc3RydWN0IHNvY2thZGRyX2luNiAqc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopc2FwOwotCi0Jc3dpdGNoIChzYXAtPnNhX2ZhbWlseSkgewotCWNhc2UgQUZfVU5TUEVDOgotCQlzbnByaW50ZihidWYsIGxlbiwgInVuc3BlY2lmaWVkIik7Ci0JCWJyZWFrOwotCWNhc2UgQUZfSU5FVDoKLQkJc25wcmludGYoYnVmLCBsZW4sICIlcEk0IiwgJnNpbi0+c2luX2FkZHIuc19hZGRyKTsKLQkJYnJlYWs7Ci0JY2FzZSBBRl9JTkVUNjoKLQkJaWYgKGlwdjZfYWRkcl92NG1hcHBlZCgmc2luNi0+c2luNl9hZGRyKSkKLQkJCXNucHJpbnRmKGJ1ZiwgbGVuLCAiJXBJNCIsCi0JCQkJICZzaW42LT5zaW42X2FkZHIuczZfYWRkcjMyWzNdKTsKLQkJZWxzZQotCQkJc25wcmludGYoYnVmLCBsZW4sICIlcEk2IiwgJnNpbjYtPnNpbjZfYWRkcik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXNucHJpbnRmKGJ1ZiwgbGVuLCAidW5zdXBwb3J0ZWQgYWRkcmVzcyBmYW1pbHkiKTsKLQkJYnJlYWs7Ci0JfQotfQotCiAvKgogICogQ29tbW9uIGhvc3QgbG9va3VwIHJvdXRpbmUgZm9yIHNlcnZlciAmIGNsaWVudAogICovCkBAIC0xOTAsOCArMTU4LDggQEAKIAkJYXRvbWljX2luYygmbnNtLT5zbV9jb3VudCk7CiAJZWxzZSB7CiAJCWhvc3QgPSBOVUxMOwotCQluc20gPSBuc21fZmluZChuaS0+c2FwLCBuaS0+c2FsZW4sCi0JCQkJbmktPmhvc3RuYW1lLCBuaS0+aG9zdG5hbWVfbGVuLCAxKTsKKwkJbnNtID0gbnNtX2dldF9oYW5kbGUobmktPnNhcCwgbmktPnNhbGVuLAorCQkJCQluaS0+aG9zdG5hbWUsIG5pLT5ob3N0bmFtZV9sZW4pOwogCQlpZiAoIW5zbSkgewogCQkJZHByaW50aygibG9ja2Q6IG5sbV9sb29rdXBfaG9zdCBmYWlsZWQ7ICIKIAkJCQkibm8gbnNtIGhhbmRsZVxuIik7CkBAIC0yMDYsNiArMTc0LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCWhvc3QtPmhfbmFtZQkgICA9IG5zbS0+c21fbmFtZTsKKwlob3N0LT5oX2FkZHJidWYgICAgPSBuc20tPnNtX2FkZHJidWY7CiAJbWVtY3B5KG5sbV9hZGRyKGhvc3QpLCBuaS0+c2FwLCBuaS0+c2FsZW4pOwogCWhvc3QtPmhfYWRkcmxlbiA9IG5pLT5zYWxlbjsKIAlubG1fY2xlYXJfcG9ydChubG1fYWRkcihob3N0KSk7CkBAIC0yMzIsMTEgKzIwMSw2IEBACiAKIAlucmhvc3RzKys7CiAKLQlubG1fZGlzcGxheV9hZGRyZXNzKChzdHJ1Y3Qgc29ja2FkZHIgKikmaG9zdC0+aF9hZGRyLAotCQkJCWhvc3QtPmhfYWRkcmJ1Ziwgc2l6ZW9mKGhvc3QtPmhfYWRkcmJ1ZikpOwotCW5sbV9kaXNwbGF5X2FkZHJlc3MoKHN0cnVjdCBzb2NrYWRkciAqKSZob3N0LT5oX3NyY2FkZHIsCi0JCQkJaG9zdC0+aF9zcmNhZGRyYnVmLCBzaXplb2YoaG9zdC0+aF9zcmNhZGRyYnVmKSk7Ci0KIAlkcHJpbnRrKCJsb2NrZDogbmxtX2xvb2t1cF9ob3N0IGNyZWF0ZWQgaG9zdCAlc1xuIiwKIAkJCWhvc3QtPmhfbmFtZSk7CiAKQEAgLTI1NiwxMCArMjIwLDggQEAKIAlCVUdfT04oIWxpc3RfZW1wdHkoJmhvc3QtPmhfbG9ja293bmVycykpOwogCUJVR19PTihhdG9taWNfcmVhZCgmaG9zdC0+aF9jb3VudCkpOwogCi0JLyoKLQkgKiBSZWxlYXNlIE5TTSBoYW5kbGUgYW5kIHVubW9uaXRvciBob3N0LgotCSAqLwogCW5zbV91bm1vbml0b3IoaG9zdCk7CisJbnNtX3JlbGVhc2UoaG9zdC0+aF9uc21oYW5kbGUpOwogCiAJY2xudCA9IGhvc3QtPmhfcnBjY2xudDsKIAlpZiAoY2xudCAhPSBOVUxMKQpAQCAtMzc4LDggKzM0MCw4IEBACiB7CiAJc3RydWN0IHJwY19jbG50CSpjbG50OwogCi0JZHByaW50aygibG9ja2Q6IG5sbV9iaW5kX2hvc3QgJXMgKCVzKSwgbXkgYWRkcj0lc1xuIiwKLQkJCWhvc3QtPmhfbmFtZSwgaG9zdC0+aF9hZGRyYnVmLCBob3N0LT5oX3NyY2FkZHJidWYpOworCWRwcmludGsoImxvY2tkOiBubG1fYmluZF9ob3N0ICVzICglcylcbiIsCisJCQlob3N0LT5oX25hbWUsIGhvc3QtPmhfYWRkcmJ1Zik7CiAKIAkvKiBMb2NrIGhvc3QgaGFuZGxlICovCiAJbXV0ZXhfbG9jaygmaG9zdC0+aF9tdXRleCk7CkBAIC00ODEsMzUgKzQ0MywyMyBAQAogCX0KIH0KIAotLyoKLSAqIFdlIHdlcmUgbm90aWZpZWQgdGhhdCB0aGUgaG9zdCBpbmRpY2F0ZWQgYnkgYWRkcmVzcyAmc2luCi0gKiBoYXMgcmVib290ZWQuCi0gKiBSZWxlYXNlIGFsbCByZXNvdXJjZXMgaGVsZCBieSB0aGF0IHBlZXIuCisvKioKKyAqIG5sbV9ob3N0X3JlYm9vdGVkIC0gUmVsZWFzZSBhbGwgcmVzb3VyY2VzIGhlbGQgYnkgcmVib290ZWQgaG9zdAorICogQGluZm86IHBvaW50ZXIgdG8gZGVjb2RlZCByZXN1bHRzIG9mIE5MTV9TTV9OT1RJRlkgY2FsbAorICoKKyAqIFdlIHdlcmUgbm90aWZpZWQgdGhhdCB0aGUgc3BlY2lmaWVkIGhvc3QgaGFzIHJlYm9vdGVkLiAgUmVsZWFzZQorICogYWxsIHJlc291cmNlcyBoZWxkIGJ5IHRoYXQgcGVlci4KICAqLwotdm9pZCBubG1faG9zdF9yZWJvb3RlZChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbiwKLQkJCQljb25zdCBjaGFyICpob3N0bmFtZSwKLQkJCQl1bnNpZ25lZCBpbnQgaG9zdG5hbWVfbGVuLAotCQkJCXUzMiBuZXdfc3RhdGUpCit2b2lkIG5sbV9ob3N0X3JlYm9vdGVkKGNvbnN0IHN0cnVjdCBubG1fcmVib290ICppbmZvKQogewogCXN0cnVjdCBobGlzdF9oZWFkICpjaGFpbjsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zOwogCXN0cnVjdCBuc21faGFuZGxlICpuc207CiAJc3RydWN0IG5sbV9ob3N0CSpob3N0OwogCi0JbnNtID0gbnNtX2ZpbmQoKHN0cnVjdCBzb2NrYWRkciAqKXNpbiwgc2l6ZW9mKCpzaW4pLAotCQkJaG9zdG5hbWUsIGhvc3RuYW1lX2xlbiwgMCk7Ci0JaWYgKG5zbSA9PSBOVUxMKSB7Ci0JCWRwcmludGsoImxvY2tkOiBuZXZlciBzYXcgcmVib290ZWQgcGVlciAnJS4qcycgYmVmb3JlXG4iLAotCQkJCWhvc3RuYW1lX2xlbiwgaG9zdG5hbWUpOworCW5zbSA9IG5zbV9yZWJvb3RfbG9va3VwKGluZm8pOworCWlmICh1bmxpa2VseShuc20gPT0gTlVMTCkpCiAJCXJldHVybjsKLQl9Ci0KLQlkcHJpbnRrKCJsb2NrZDogbmxtX2hvc3RfcmVib290ZWQoJS4qcywgJXMpXG4iLAotCQkJaG9zdG5hbWVfbGVuLCBob3N0bmFtZSwgbnNtLT5zbV9hZGRyYnVmKTsKLQotCS8qIFdoZW4gcmVjbGFpbWluZyBsb2NrcyBvbiB0aGlzIHBlZXIsIG1ha2Ugc3VyZSB0aGF0Ci0JICogd2Ugc2V0IHVwIGEgbmV3IG5vdGlmaWNhdGlvbiAqLwotCW5zbS0+c21fbW9uaXRvcmVkID0gMDsKIAogCS8qIE1hcmsgYWxsIGhvc3RzIHRpZWQgdG8gdGhpcyBOU00gc3RhdGUgYXMgaGF2aW5nIHJlYm9vdGVkLgogCSAqIFdlIHJ1biB0aGUgbG9vcCByZXBlYXRlZGx5LCBiZWNhdXNlIHdlIGRyb3AgdGhlIGhvc3QgdGFibGUKQEAgLTUyMCw4ICs0NzAsOCBAQAogCWZvciAoY2hhaW4gPSBubG1faG9zdHM7IGNoYWluIDwgbmxtX2hvc3RzICsgTkxNX0hPU1RfTlJIQVNIOyArK2NoYWluKSB7CiAJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGhvc3QsIHBvcywgY2hhaW4sIGhfaGFzaCkgewogCQkJaWYgKGhvc3QtPmhfbnNtaGFuZGxlID09IG5zbQotCQkJICYmIGhvc3QtPmhfbnNtc3RhdGUgIT0gbmV3X3N0YXRlKSB7Ci0JCQkJaG9zdC0+aF9uc21zdGF0ZSA9IG5ld19zdGF0ZTsKKwkJCSAmJiBob3N0LT5oX25zbXN0YXRlICE9IGluZm8tPnN0YXRlKSB7CisJCQkJaG9zdC0+aF9uc21zdGF0ZSA9IGluZm8tPnN0YXRlOwogCQkJCWhvc3QtPmhfc3RhdGUrKzsKIAogCQkJCW5sbV9nZXRfaG9zdChob3N0KTsKQEAgLTYyOSw4OSArNTc5LDMgQEAKIAogCW5leHRfZ2MgPSBqaWZmaWVzICsgTkxNX0hPU1RfQ09MTEVDVDsKIH0KLQotCi0vKgotICogTWFuYWdlIE5TTSBoYW5kbGVzCi0gKi8KLXN0YXRpYyBMSVNUX0hFQUQobnNtX2hhbmRsZXMpOwotc3RhdGljIERFRklORV9TUElOTE9DSyhuc21fbG9jayk7Ci0KLXN0YXRpYyBzdHJ1Y3QgbnNtX2hhbmRsZSAqbnNtX2ZpbmQoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXAsCi0JCQkJICAgY29uc3Qgc2l6ZV90IHNhbGVuLAotCQkJCSAgIGNvbnN0IGNoYXIgKmhvc3RuYW1lLAotCQkJCSAgIGNvbnN0IHNpemVfdCBob3N0bmFtZV9sZW4sCi0JCQkJICAgY29uc3QgaW50IGNyZWF0ZSkKLXsKLQlzdHJ1Y3QgbnNtX2hhbmRsZSAqbnNtID0gTlVMTDsKLQlzdHJ1Y3QgbnNtX2hhbmRsZSAqcG9zOwotCi0JaWYgKCFzYXApCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKGhvc3RuYW1lICYmIG1lbWNocihob3N0bmFtZSwgJy8nLCBob3N0bmFtZV9sZW4pICE9IE5VTEwpIHsKLQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSW52YWxpZCBob3N0bmFtZSBcIiUuKnNcIiAiCi0JCQkJCSAgICAiaW4gTkZTIGxvY2sgcmVxdWVzdFxuIiwKLQkJCQkoaW50KWhvc3RuYW1lX2xlbiwgaG9zdG5hbWUpOwotCQl9Ci0JCXJldHVybiBOVUxMOwotCX0KLQotcmV0cnk6Ci0Jc3Bpbl9sb2NrKCZuc21fbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsICZuc21faGFuZGxlcywgc21fbGluaykgewotCi0JCWlmIChob3N0bmFtZSAmJiBuc21fdXNlX2hvc3RuYW1lcykgewotCQkJaWYgKHN0cmxlbihwb3MtPnNtX25hbWUpICE9IGhvc3RuYW1lX2xlbgotCQkJIHx8IG1lbWNtcChwb3MtPnNtX25hbWUsIGhvc3RuYW1lLCBob3N0bmFtZV9sZW4pKQotCQkJCWNvbnRpbnVlOwotCQl9IGVsc2UgaWYgKCFubG1fY21wX2FkZHIobnNtX2FkZHIocG9zKSwgc2FwKSkKLQkJCWNvbnRpbnVlOwotCQlhdG9taWNfaW5jKCZwb3MtPnNtX2NvdW50KTsKLQkJa2ZyZWUobnNtKTsKLQkJbnNtID0gcG9zOwotCQlnb3RvIGZvdW5kOwotCX0KLQlpZiAobnNtKSB7Ci0JCWxpc3RfYWRkKCZuc20tPnNtX2xpbmssICZuc21faGFuZGxlcyk7Ci0JCWdvdG8gZm91bmQ7Ci0JfQotCXNwaW5fdW5sb2NrKCZuc21fbG9jayk7Ci0KLQlpZiAoIWNyZWF0ZSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQluc20gPSBremFsbG9jKHNpemVvZigqbnNtKSArIGhvc3RuYW1lX2xlbiArIDEsIEdGUF9LRVJORUwpOwotCWlmIChuc20gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQltZW1jcHkobnNtX2FkZHIobnNtKSwgc2FwLCBzYWxlbik7Ci0JbnNtLT5zbV9hZGRybGVuID0gc2FsZW47Ci0JbnNtLT5zbV9uYW1lID0gKGNoYXIgKikgKG5zbSArIDEpOwotCW1lbWNweShuc20tPnNtX25hbWUsIGhvc3RuYW1lLCBob3N0bmFtZV9sZW4pOwotCW5zbS0+c21fbmFtZVtob3N0bmFtZV9sZW5dID0gJ1wwJzsKLQlubG1fZGlzcGxheV9hZGRyZXNzKChzdHJ1Y3Qgc29ja2FkZHIgKikmbnNtLT5zbV9hZGRyLAotCQkJCW5zbS0+c21fYWRkcmJ1Ziwgc2l6ZW9mKG5zbS0+c21fYWRkcmJ1ZikpOwotCWF0b21pY19zZXQoJm5zbS0+c21fY291bnQsIDEpOwotCWdvdG8gcmV0cnk7Ci0KLWZvdW5kOgotCXNwaW5fdW5sb2NrKCZuc21fbG9jayk7Ci0JcmV0dXJuIG5zbTsKLX0KLQotLyoKLSAqIFJlbGVhc2UgYW4gTlNNIGhhbmRsZQotICovCi12b2lkCi1uc21fcmVsZWFzZShzdHJ1Y3QgbnNtX2hhbmRsZSAqbnNtKQotewotCWlmICghbnNtKQotCQlyZXR1cm47Ci0JaWYgKGF0b21pY19kZWNfYW5kX2xvY2soJm5zbS0+c21fY291bnQsICZuc21fbG9jaykpIHsKLQkJbGlzdF9kZWwoJm5zbS0+c21fbGluayk7Ci0JCXNwaW5fdW5sb2NrKCZuc21fbG9jayk7Ci0JCWtmcmVlKG5zbSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZnMvbG9ja2QvbW9uLmMgYi9mcy9sb2NrZC9tb24uYwppbmRleCBmZmQzNDYxLi41ZTJjNGQ1IDEwMDY0NAotLS0gYS9mcy9sb2NrZC9tb24uYworKysgYi9mcy9sb2NrZC9tb24uYwpAQCAtOSwzNSArOSwxMjMgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGltZS5oPgorCiAjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMveHBydHNvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CiAjaW5jbHVkZSA8bGludXgvbG9ja2QvbG9ja2QuaD4KLSNpbmNsdWRlIDxsaW51eC9sb2NrZC9zbV9pbnRlci5oPgotCiAKICNkZWZpbmUgTkxNREJHX0ZBQ0lMSVRZCQlOTE1EQkdfTU9OSVRPUgorI2RlZmluZSBOU01fUFJPR1JBTQkJMTAwMDI0CisjZGVmaW5lIE5TTV9WRVJTSU9OCQkxCiAKLSNkZWZpbmUgWERSX0FERFJCVUZfTEVOCQkoMjApCitlbnVtIHsKKwlOU01QUk9DX05VTEwsCisJTlNNUFJPQ19TVEFULAorCU5TTVBST0NfTU9OLAorCU5TTVBST0NfVU5NT04sCisJTlNNUFJPQ19VTk1PTl9BTEwsCisJTlNNUFJPQ19TSU1VX0NSQVNILAorCU5TTVBST0NfTk9USUZZLAorfTsKIAotc3RhdGljIHN0cnVjdCBycGNfY2xudCAqCW5zbV9jcmVhdGUodm9pZCk7CitzdHJ1Y3QgbnNtX2FyZ3MgeworCXN0cnVjdCBuc21fcHJpdmF0ZQkqcHJpdjsKKwl1MzIJCQlwcm9nOwkJLyogUlBDIGNhbGxiYWNrIGluZm8gKi8KKwl1MzIJCQl2ZXJzOworCXUzMgkJCXByb2M7CisKKwljaGFyCQkJKm1vbl9uYW1lOworfTsKKworc3RydWN0IG5zbV9yZXMgeworCXUzMgkJCXN0YXR1czsKKwl1MzIJCQlzdGF0ZTsKK307CiAKIHN0YXRpYyBzdHJ1Y3QgcnBjX3Byb2dyYW0JbnNtX3Byb2dyYW07CitzdGF0aWMJCQkJTElTVF9IRUFEKG5zbV9oYW5kbGVzKTsKK3N0YXRpYwkJCQlERUZJTkVfU1BJTkxPQ0sobnNtX2xvY2spOwogCiAvKgogICogTG9jYWwgTlNNIHN0YXRlCiAgKi8KLWludAkJCQluc21fbG9jYWxfc3RhdGU7CitpbnQJX19yZWFkX21vc3RseQkJbnNtX2xvY2FsX3N0YXRlOworaW50CV9fcmVhZF9tb3N0bHkJCW5zbV91c2VfaG9zdG5hbWVzOwogCi0vKgotICogQ29tbW9uIHByb2NlZHVyZSBmb3IgU01fTU9OL1NNX1VOTU9OIGNhbGxzCi0gKi8KLXN0YXRpYyBpbnQKLW5zbV9tb25fdW5tb24oc3RydWN0IG5zbV9oYW5kbGUgKm5zbSwgdTMyIHByb2MsIHN0cnVjdCBuc21fcmVzICpyZXMpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzb2NrYWRkciAqbnNtX2FkZHIoY29uc3Qgc3RydWN0IG5zbV9oYW5kbGUgKm5zbSkKK3sKKwlyZXR1cm4gKHN0cnVjdCBzb2NrYWRkciAqKSZuc20tPnNtX2FkZHI7Cit9CisKK3N0YXRpYyB2b2lkIG5zbV9kaXNwbGF5X2lwdjRfYWRkcmVzcyhjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCwgY2hhciAqYnVmLAorCQkJCSAgICAgY29uc3Qgc2l6ZV90IGxlbikKK3sKKwljb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzYXA7CisJc25wcmludGYoYnVmLCBsZW4sICIlcEk0IiwgJnNpbi0+c2luX2FkZHIuc19hZGRyKTsKK30KKworc3RhdGljIHZvaWQgbnNtX2Rpc3BsYXlfaXB2Nl9hZGRyZXNzKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwLCBjaGFyICpidWYsCisJCQkJICAgICBjb25zdCBzaXplX3QgbGVuKQoreworCWNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKXNhcDsKKworCWlmIChpcHY2X2FkZHJfdjRtYXBwZWQoJnNpbjYtPnNpbjZfYWRkcikpCisJCXNucHJpbnRmKGJ1ZiwgbGVuLCAiJXBJNCIsICZzaW42LT5zaW42X2FkZHIuczZfYWRkcjMyWzNdKTsKKwllbHNlIGlmIChzaW42LT5zaW42X3Njb3BlX2lkICE9IDApCisJCXNucHJpbnRmKGJ1ZiwgbGVuLCAiJXBJNiUlJXUiLCAmc2luNi0+c2luNl9hZGRyLAorCQkJCXNpbjYtPnNpbjZfc2NvcGVfaWQpOworCWVsc2UKKwkJc25wcmludGYoYnVmLCBsZW4sICIlcEk2IiwgJnNpbjYtPnNpbjZfYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIG5zbV9kaXNwbGF5X2FkZHJlc3MoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXAsCisJCQkJY2hhciAqYnVmLCBjb25zdCBzaXplX3QgbGVuKQoreworCXN3aXRjaCAoc2FwLT5zYV9mYW1pbHkpIHsKKwljYXNlIEFGX0lORVQ6CisJCW5zbV9kaXNwbGF5X2lwdjRfYWRkcmVzcyhzYXAsIGJ1ZiwgbGVuKTsKKwkJYnJlYWs7CisJY2FzZSBBRl9JTkVUNjoKKwkJbnNtX2Rpc3BsYXlfaXB2Nl9hZGRyZXNzKHNhcCwgYnVmLCBsZW4pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzbnByaW50ZihidWYsIGxlbiwgInVuc3VwcG9ydGVkIGFkZHJlc3MgZmFtaWx5Iik7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHN0cnVjdCBycGNfY2xudCAqbnNtX2NyZWF0ZSh2b2lkKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW4gPSB7CisJCS5zaW5fZmFtaWx5CQk9IEFGX0lORVQsCisJCS5zaW5fYWRkci5zX2FkZHIJPSBodG9ubChJTkFERFJfTE9PUEJBQ0spLAorCX07CisJc3RydWN0IHJwY19jcmVhdGVfYXJncyBhcmdzID0geworCQkucHJvdG9jb2wJCT0gWFBSVF9UUkFOU1BPUlRfVURQLAorCQkuYWRkcmVzcwkJPSAoc3RydWN0IHNvY2thZGRyICopJnNpbiwKKwkJLmFkZHJzaXplCQk9IHNpemVvZihzaW4pLAorCQkuc2VydmVybmFtZQkJPSAicnBjLnN0YXRkIiwKKwkJLnByb2dyYW0JCT0gJm5zbV9wcm9ncmFtLAorCQkudmVyc2lvbgkJPSBOU01fVkVSU0lPTiwKKwkJLmF1dGhmbGF2b3IJCT0gUlBDX0FVVEhfTlVMTCwKKwl9OworCisJcmV0dXJuIHJwY19jcmVhdGUoJmFyZ3MpOworfQorCitzdGF0aWMgaW50IG5zbV9tb25fdW5tb24oc3RydWN0IG5zbV9oYW5kbGUgKm5zbSwgdTMyIHByb2MsIHN0cnVjdCBuc21fcmVzICpyZXMpCiB7CiAJc3RydWN0IHJwY19jbG50CSpjbG50OwogCWludAkJc3RhdHVzOwotCXN0cnVjdCBuc21fYXJncwlhcmdzOworCXN0cnVjdCBuc21fYXJncyBhcmdzID0geworCQkucHJpdgkJPSAmbnNtLT5zbV9wcml2LAorCQkucHJvZwkJPSBOTE1fUFJPR1JBTSwKKwkJLnZlcnMJCT0gMywKKwkJLnByb2MJCT0gTkxNUFJPQ19OU01fTk9USUZZLAorCQkubW9uX25hbWUJPSBuc20tPnNtX21vbl9uYW1lLAorCX07CiAJc3RydWN0IHJwY19tZXNzYWdlIG1zZyA9IHsKIAkJLnJwY19hcmdwCT0gJmFyZ3MsCiAJCS5ycGNfcmVzcAk9IHJlcywKQEAgLTQ2LDIyICsxMzQsMTggQEAKIAljbG50ID0gbnNtX2NyZWF0ZSgpOwogCWlmIChJU19FUlIoY2xudCkpIHsKIAkJc3RhdHVzID0gUFRSX0VSUihjbG50KTsKKwkJZHByaW50aygibG9ja2Q6IGZhaWxlZCB0byBjcmVhdGUgTlNNIHVwY2FsbCB0cmFuc3BvcnQsICIKKwkJCQkic3RhdHVzPSVkXG4iLCBzdGF0dXMpOwogCQlnb3RvIG91dDsKIAl9CiAKLQltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7Ci0JYXJncy5tb25fbmFtZSA9IG5zbS0+c21fbmFtZTsKLQlhcmdzLmFkZHIgPSBuc21fYWRkcl9pbihuc20pLT5zaW5fYWRkci5zX2FkZHI7Ci0JYXJncy5wcm9nID0gTkxNX1BST0dSQU07Ci0JYXJncy52ZXJzID0gMzsKLQlhcmdzLnByb2MgPSBOTE1QUk9DX05TTV9OT1RJRlk7CiAJbWVtc2V0KHJlcywgMCwgc2l6ZW9mKCpyZXMpKTsKIAogCW1zZy5ycGNfcHJvYyA9ICZjbG50LT5jbF9wcm9jaW5mb1twcm9jXTsKIAlzdGF0dXMgPSBycGNfY2FsbF9zeW5jKGNsbnQsICZtc2csIDApOwogCWlmIChzdGF0dXMgPCAwKQotCQlwcmludGsoS0VSTl9ERUJVRyAibnNtX21vbl91bm1vbjogcnBjIGZhaWxlZCwgc3RhdHVzPSVkXG4iLAotCQkJc3RhdHVzKTsKKwkJZHByaW50aygibG9ja2Q6IE5TTSB1cGNhbGwgUlBDIGZhaWxlZCwgc3RhdHVzPSVkXG4iLAorCQkJCXN0YXR1cyk7CiAJZWxzZQogCQlzdGF0dXMgPSAwOwogCXJwY19zaHV0ZG93bl9jbGllbnQoY2xudCk7CkBAIC02OSw4MiArMTUzLDI3MiBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLS8qCi0gKiBTZXQgdXAgbW9uaXRvcmluZyBvZiBhIHJlbW90ZSBob3N0CisvKioKKyAqIG5zbV9tb25pdG9yIC0gTm90aWZ5IGEgcGVlciBpbiBjYXNlIHdlIHJlYm9vdAorICogQGhvc3Q6IHBvaW50ZXIgdG8gbmxtX2hvc3Qgb2YgcGVlciB0byBub3RpZnkKKyAqCisgKiBJZiB0aGlzIHBlZXIgaXMgbm90IGFscmVhZHkgbW9uaXRvcmVkLCB0aGlzIGZ1bmN0aW9uIHNlbmRzIGFuCisgKiB1cGNhbGwgdG8gdGhlIGxvY2FsIHJwYy5zdGF0ZCB0byByZWNvcmQgdGhlIG5hbWUvYWRkcmVzcyBvZgorICogdGhlIHBlZXIgdG8gbm90aWZ5IGluIGNhc2Ugd2UgcmVib290LgorICoKKyAqIFJldHVybnMgemVybyBpZiB0aGUgcGVlciBpcyBtb25pdG9yZWQgYnkgdGhlIGxvY2FsIHJwYy5zdGF0ZDsKKyAqIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlIGlzIHJldHVybmVkLgogICovCi1pbnQKLW5zbV9tb25pdG9yKHN0cnVjdCBubG1faG9zdCAqaG9zdCkKK2ludCBuc21fbW9uaXRvcihjb25zdCBzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QpCiB7CiAJc3RydWN0IG5zbV9oYW5kbGUgKm5zbSA9IGhvc3QtPmhfbnNtaGFuZGxlOwogCXN0cnVjdCBuc21fcmVzCXJlczsKIAlpbnQJCXN0YXR1czsKIAotCWRwcmludGsoImxvY2tkOiBuc21fbW9uaXRvciglcylcbiIsIGhvc3QtPmhfbmFtZSk7Ci0JQlVHX09OKG5zbSA9PSBOVUxMKTsKKwlkcHJpbnRrKCJsb2NrZDogbnNtX21vbml0b3IoJXMpXG4iLCBuc20tPnNtX25hbWUpOwogCiAJaWYgKG5zbS0+c21fbW9uaXRvcmVkKQogCQlyZXR1cm4gMDsKIAotCXN0YXR1cyA9IG5zbV9tb25fdW5tb24obnNtLCBTTV9NT04sICZyZXMpOworCS8qCisJICogQ2hvb3NlIHdoZXRoZXIgdG8gcmVjb3JkIHRoZSBjYWxsZXJfbmFtZSBvciBJUCBhZGRyZXNzIG9mCisJICogdGhpcyBwZWVyIGluIHRoZSBsb2NhbCBycGMuc3RhdGQncyBkYXRhYmFzZS4KKwkgKi8KKwluc20tPnNtX21vbl9uYW1lID0gbnNtX3VzZV9ob3N0bmFtZXMgPyBuc20tPnNtX25hbWUgOiBuc20tPnNtX2FkZHJidWY7CiAKLQlpZiAoc3RhdHVzIDwgMCB8fCByZXMuc3RhdHVzICE9IDApCi0JCXByaW50ayhLRVJOX05PVElDRSAibG9ja2Q6IGNhbm5vdCBtb25pdG9yICVzXG4iLCBob3N0LT5oX25hbWUpOworCXN0YXR1cyA9IG5zbV9tb25fdW5tb24obnNtLCBOU01QUk9DX01PTiwgJnJlcyk7CisJaWYgKHJlcy5zdGF0dXMgIT0gMCkKKwkJc3RhdHVzID0gLUVJTzsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJsb2NrZDogY2Fubm90IG1vbml0b3IgJXNcbiIsIG5zbS0+c21fbmFtZSk7CiAJZWxzZQogCQluc20tPnNtX21vbml0b3JlZCA9IDE7CiAJcmV0dXJuIHN0YXR1czsKIH0KIAotLyoKLSAqIENlYXNlIHRvIG1vbml0b3IgcmVtb3RlIGhvc3QKKy8qKgorICogbnNtX3VubW9uaXRvciAtIFVucmVnaXN0ZXIgcGVlciBub3RpZmljYXRpb24KKyAqIEBob3N0OiBwb2ludGVyIHRvIG5sbV9ob3N0IG9mIHBlZXIgdG8gc3RvcCBtb25pdG9yaW5nCisgKgorICogSWYgdGhpcyBwZWVyIGlzIG1vbml0b3JlZCwgdGhpcyBmdW5jdGlvbiBzZW5kcyBhbiB1cGNhbGwgdG8KKyAqIHRlbGwgdGhlIGxvY2FsIHJwYy5zdGF0ZCBub3QgdG8gc2VuZCB0aGlzIHBlZXIgYSBub3RpZmljYXRpb24KKyAqIHdoZW4gd2UgcmVib290LgogICovCi1pbnQKLW5zbV91bm1vbml0b3Ioc3RydWN0IG5sbV9ob3N0ICpob3N0KQordm9pZCBuc21fdW5tb25pdG9yKGNvbnN0IHN0cnVjdCBubG1faG9zdCAqaG9zdCkKIHsKIAlzdHJ1Y3QgbnNtX2hhbmRsZSAqbnNtID0gaG9zdC0+aF9uc21oYW5kbGU7CiAJc3RydWN0IG5zbV9yZXMJcmVzOwotCWludAkJc3RhdHVzID0gMDsKLQotCWlmIChuc20gPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JaG9zdC0+aF9uc21oYW5kbGUgPSBOVUxMOworCWludCBzdGF0dXM7CiAKIAlpZiAoYXRvbWljX3JlYWQoJm5zbS0+c21fY291bnQpID09IDEKIAkgJiYgbnNtLT5zbV9tb25pdG9yZWQgJiYgIW5zbS0+c21fc3RpY2t5KSB7Ci0JCWRwcmludGsoImxvY2tkOiBuc21fdW5tb25pdG9yKCVzKVxuIiwgaG9zdC0+aF9uYW1lKTsKKwkJZHByaW50aygibG9ja2Q6IG5zbV91bm1vbml0b3IoJXMpXG4iLCBuc20tPnNtX25hbWUpOwogCi0JCXN0YXR1cyA9IG5zbV9tb25fdW5tb24obnNtLCBTTV9VTk1PTiwgJnJlcyk7CisJCXN0YXR1cyA9IG5zbV9tb25fdW5tb24obnNtLCBOU01QUk9DX1VOTU9OLCAmcmVzKTsKKwkJaWYgKHJlcy5zdGF0dXMgIT0gMCkKKwkJCXN0YXR1cyA9IC1FSU87CiAJCWlmIChzdGF0dXMgPCAwKQogCQkJcHJpbnRrKEtFUk5fTk9USUNFICJsb2NrZDogY2Fubm90IHVubW9uaXRvciAlc1xuIiwKLQkJCQkJaG9zdC0+aF9uYW1lKTsKKwkJCQkJbnNtLT5zbV9uYW1lKTsKIAkJZWxzZQogCQkJbnNtLT5zbV9tb25pdG9yZWQgPSAwOwogCX0KLQluc21fcmVsZWFzZShuc20pOwotCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbnNtX2hhbmRsZSAqbnNtX2xvb2t1cF9ob3N0bmFtZShjb25zdCBjaGFyICpob3N0bmFtZSwKKwkJCQkJICAgICAgY29uc3Qgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgbnNtX2hhbmRsZSAqbnNtOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShuc20sICZuc21faGFuZGxlcywgc21fbGluaykKKwkJaWYgKHN0cmxlbihuc20tPnNtX25hbWUpID09IGxlbiAmJgorCQkgICAgbWVtY21wKG5zbS0+c21fbmFtZSwgaG9zdG5hbWUsIGxlbikgPT0gMCkKKwkJCXJldHVybiBuc207CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbnNtX2hhbmRsZSAqbnNtX2xvb2t1cF9hZGRyKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwKQoreworCXN0cnVjdCBuc21faGFuZGxlICpuc207CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5zbSwgJm5zbV9oYW5kbGVzLCBzbV9saW5rKQorCQlpZiAobmxtX2NtcF9hZGRyKG5zbV9hZGRyKG5zbSksIHNhcCkpCisJCQlyZXR1cm4gbnNtOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IG5zbV9oYW5kbGUgKm5zbV9sb29rdXBfcHJpdihjb25zdCBzdHJ1Y3QgbnNtX3ByaXZhdGUgKnByaXYpCit7CisJc3RydWN0IG5zbV9oYW5kbGUgKm5zbTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkobnNtLCAmbnNtX2hhbmRsZXMsIHNtX2xpbmspCisJCWlmIChtZW1jbXAobnNtLT5zbV9wcml2LmRhdGEsIHByaXYtPmRhdGEsCisJCQkJCXNpemVvZihwcml2LT5kYXRhKSkgPT0gMCkKKwkJCXJldHVybiBuc207CisJcmV0dXJuIE5VTEw7CiB9CiAKIC8qCi0gKiBDcmVhdGUgTlNNIGNsaWVudCBmb3IgdGhlIGxvY2FsIGhvc3QKKyAqIENvbnN0cnVjdCBhIHVuaXF1ZSBjb29raWUgdG8gbWF0Y2ggdGhpcyBuc21faGFuZGxlIHRvIHRoaXMgbW9uaXRvcmVkCisgKiBob3N0LiAgSXQgaXMgcGFzc2VkIHRvIHRoZSBsb2NhbCBycGMuc3RhdGQgdmlhIE5TTVBST0NfTU9OLCBhbmQKKyAqIHJldHVybmVkIHZpYSBOTE1QUk9DX1NNX05PVElGWSwgaW4gdGhlICJwcml2IiBmaWVsZCBvZiB0aGVzZQorICogcmVxdWVzdHMuCisgKgorICogVGhlIE5TTSBwcm90b2NvbCByZXF1aXJlcyB0aGF0IHRoZXNlIGNvb2tpZXMgYmUgdW5pcXVlIHdoaWxlIHRoZQorICogc3lzdGVtIGlzIHJ1bm5pbmcuICBXZSBwcmVmZXIgYSBzdHJvbmdlciByZXF1aXJlbWVudCBvZiBtYWtpbmcgdGhlbQorICogdW5pcXVlIGFjcm9zcyByZWJvb3RzLiAgSWYgdXNlciBzcGFjZSBidWdzIGNhdXNlIGEgc3RhbGUgY29va2llIHRvCisgKiBiZSBzZW50IHRvIHRoZSBrZXJuZWwsIGl0IGNvdWxkIGNhdXNlIHRoZSB3cm9uZyBob3N0IHRvIGxvc2UgaXRzCisgKiBsb2NrIHN0YXRlIGlmIGNvb2tpZXMgd2VyZSBub3QgdW5pcXVlIGFjcm9zcyByZWJvb3RzLgorICoKKyAqIFRoZSBjb29raWVzIGFyZSBleHBvc2VkIG9ubHkgdG8gbG9jYWwgdXNlciBzcGFjZSB2aWEgbG9vcGJhY2suICBUaGV5CisgKiBkbyBub3QgYXBwZWFyIG9uIHRoZSBwaHlzaWNhbCBuZXR3b3JrLiAgSWYgd2Ugd2FudCBncmVhdGVyIHNlY3VyaXR5CisgKiBmb3Igc29tZSByZWFzb24sIG5zbV9pbml0X3ByaXZhdGUoKSBjb3VsZCBwZXJmb3JtIGEgb25lLXdheSBoYXNoIHRvCisgKiBvYnNjdXJlIHRoZSBjb250ZW50cyBvZiB0aGUgY29va2llLgogICovCi1zdGF0aWMgc3RydWN0IHJwY19jbG50ICoKLW5zbV9jcmVhdGUodm9pZCkKK3N0YXRpYyB2b2lkIG5zbV9pbml0X3ByaXZhdGUoc3RydWN0IG5zbV9oYW5kbGUgKm5zbSkKIHsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW4Jc2luID0gewotCQkuc2luX2ZhbWlseQk9IEFGX0lORVQsCi0JCS5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfTE9PUEJBQ0spLAotCQkuc2luX3BvcnQJPSAwLAotCX07Ci0Jc3RydWN0IHJwY19jcmVhdGVfYXJncyBhcmdzID0gewotCQkucHJvdG9jb2wJPSBYUFJUX1RSQU5TUE9SVF9VRFAsCi0JCS5hZGRyZXNzCT0gKHN0cnVjdCBzb2NrYWRkciAqKSZzaW4sCi0JCS5hZGRyc2l6ZQk9IHNpemVvZihzaW4pLAotCQkuc2VydmVybmFtZQk9ICJsb2NhbGhvc3QiLAotCQkucHJvZ3JhbQk9ICZuc21fcHJvZ3JhbSwKLQkJLnZlcnNpb24JPSBTTV9WRVJTSU9OLAotCQkuYXV0aGZsYXZvcgk9IFJQQ19BVVRIX05VTEwsCi0JfTsKKwl1NjQgKnAgPSAodTY0ICopJm5zbS0+c21fcHJpdi5kYXRhOworCXN0cnVjdCB0aW1lc3BlYyB0czsKIAotCXJldHVybiBycGNfY3JlYXRlKCZhcmdzKTsKKwlrdGltZV9nZXRfdHMoJnRzKTsKKwkqcCsrID0gdGltZXNwZWNfdG9fbnMoJnRzKTsKKwkqcCA9ICh1bnNpZ25lZCBsb25nKW5zbTsKK30KKworc3RhdGljIHN0cnVjdCBuc21faGFuZGxlICpuc21fY3JlYXRlX2hhbmRsZShjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCwKKwkJCQkJICAgIGNvbnN0IHNpemVfdCBzYWxlbiwKKwkJCQkJICAgIGNvbnN0IGNoYXIgKmhvc3RuYW1lLAorCQkJCQkgICAgY29uc3Qgc2l6ZV90IGhvc3RuYW1lX2xlbikKK3sKKwlzdHJ1Y3QgbnNtX2hhbmRsZSAqbmV3OworCisJbmV3ID0ga3phbGxvYyhzaXplb2YoKm5ldykgKyBob3N0bmFtZV9sZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkobmV3ID09IE5VTEwpKQorCQlyZXR1cm4gTlVMTDsKKworCWF0b21pY19zZXQoJm5ldy0+c21fY291bnQsIDEpOworCW5ldy0+c21fbmFtZSA9IChjaGFyICopKG5ldyArIDEpOworCW1lbWNweShuc21fYWRkcihuZXcpLCBzYXAsIHNhbGVuKTsKKwluZXctPnNtX2FkZHJsZW4gPSBzYWxlbjsKKwluc21faW5pdF9wcml2YXRlKG5ldyk7CisJbnNtX2Rpc3BsYXlfYWRkcmVzcygoY29uc3Qgc3RydWN0IHNvY2thZGRyICopJm5ldy0+c21fYWRkciwKKwkJCQluZXctPnNtX2FkZHJidWYsIHNpemVvZihuZXctPnNtX2FkZHJidWYpKTsKKwltZW1jcHkobmV3LT5zbV9uYW1lLCBob3N0bmFtZSwgaG9zdG5hbWVfbGVuKTsKKwluZXctPnNtX25hbWVbaG9zdG5hbWVfbGVuXSA9ICdcMCc7CisKKwlyZXR1cm4gbmV3OworfQorCisvKioKKyAqIG5zbV9nZXRfaGFuZGxlIC0gRmluZCBvciBjcmVhdGUgYSBjYWNoZWQgbnNtX2hhbmRsZQorICogQHNhcDogcG9pbnRlciB0byBzb2NrZXQgYWRkcmVzcyBvZiBoYW5kbGUgdG8gZmluZAorICogQHNhbGVuOiBsZW5ndGggb2Ygc29ja2V0IGFkZHJlc3MKKyAqIEBob3N0bmFtZTogcG9pbnRlciB0byBDIHN0cmluZyBjb250YWluaW5nIGhvc3RuYW1lIHRvIGZpbmQKKyAqIEBob3N0bmFtZV9sZW46IGxlbmd0aCBvZiBDIHN0cmluZworICoKKyAqIEJlaGF2aW9yIGlzIG1vZHVsYXRlZCBieSB0aGUgZ2xvYmFsIG5zbV91c2VfaG9zdG5hbWVzIHZhcmlhYmxlLgorICoKKyAqIFJldHVybnMgYSBjYWNoZWQgbnNtX2hhbmRsZSBhZnRlciBidW1waW5nIGl0cyByZWYgY291bnQsIG9yCisgKiByZXR1cm5zIGEgZnJlc2ggbnNtX2hhbmRsZSBpZiBhIGhhbmRsZSB0aGF0IG1hdGNoZXMgQHNhcCBhbmQvb3IKKyAqIEBob3N0bmFtZSBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIGhhbmRsZSBjYWNoZS4gIFJldHVybnMgTlVMTCBpZgorICogYW4gZXJyb3Igb2NjdXJzLgorICovCitzdHJ1Y3QgbnNtX2hhbmRsZSAqbnNtX2dldF9oYW5kbGUoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXAsCisJCQkJICBjb25zdCBzaXplX3Qgc2FsZW4sIGNvbnN0IGNoYXIgKmhvc3RuYW1lLAorCQkJCSAgY29uc3Qgc2l6ZV90IGhvc3RuYW1lX2xlbikKK3sKKwlzdHJ1Y3QgbnNtX2hhbmRsZSAqY2FjaGVkLCAqbmV3ID0gTlVMTDsKKworCWlmIChob3N0bmFtZSAmJiBtZW1jaHIoaG9zdG5hbWUsICcvJywgaG9zdG5hbWVfbGVuKSAhPSBOVUxMKSB7CisJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkludmFsaWQgaG9zdG5hbWUgXCIlLipzXCIgIgorCQkJCQkgICAgImluIE5GUyBsb2NrIHJlcXVlc3RcbiIsCisJCQkJKGludClob3N0bmFtZV9sZW4sIGhvc3RuYW1lKTsKKwkJfQorCQlyZXR1cm4gTlVMTDsKKwl9CisKK3JldHJ5OgorCXNwaW5fbG9jaygmbnNtX2xvY2spOworCisJaWYgKG5zbV91c2VfaG9zdG5hbWVzICYmIGhvc3RuYW1lICE9IE5VTEwpCisJCWNhY2hlZCA9IG5zbV9sb29rdXBfaG9zdG5hbWUoaG9zdG5hbWUsIGhvc3RuYW1lX2xlbik7CisJZWxzZQorCQljYWNoZWQgPSBuc21fbG9va3VwX2FkZHIoc2FwKTsKKworCWlmIChjYWNoZWQgIT0gTlVMTCkgeworCQlhdG9taWNfaW5jKCZjYWNoZWQtPnNtX2NvdW50KTsKKwkJc3Bpbl91bmxvY2soJm5zbV9sb2NrKTsKKwkJa2ZyZWUobmV3KTsKKwkJZHByaW50aygibG9ja2Q6IGZvdW5kIG5zbV9oYW5kbGUgZm9yICVzICglcyksICIKKwkJCQkiY250ICVkXG4iLCBjYWNoZWQtPnNtX25hbWUsCisJCQkJY2FjaGVkLT5zbV9hZGRyYnVmLAorCQkJCWF0b21pY19yZWFkKCZjYWNoZWQtPnNtX2NvdW50KSk7CisJCXJldHVybiBjYWNoZWQ7CisJfQorCisJaWYgKG5ldyAhPSBOVUxMKSB7CisJCWxpc3RfYWRkKCZuZXctPnNtX2xpbmssICZuc21faGFuZGxlcyk7CisJCXNwaW5fdW5sb2NrKCZuc21fbG9jayk7CisJCWRwcmludGsoImxvY2tkOiBjcmVhdGVkIG5zbV9oYW5kbGUgZm9yICVzICglcylcbiIsCisJCQkJbmV3LT5zbV9uYW1lLCBuZXctPnNtX2FkZHJidWYpOworCQlyZXR1cm4gbmV3OworCX0KKworCXNwaW5fdW5sb2NrKCZuc21fbG9jayk7CisKKwluZXcgPSBuc21fY3JlYXRlX2hhbmRsZShzYXAsIHNhbGVuLCBob3N0bmFtZSwgaG9zdG5hbWVfbGVuKTsKKwlpZiAodW5saWtlbHkobmV3ID09IE5VTEwpKQorCQlyZXR1cm4gTlVMTDsKKwlnb3RvIHJldHJ5OworfQorCisvKioKKyAqIG5zbV9yZWJvb3RfbG9va3VwIC0gbWF0Y2ggTkxNUFJPQ19TTV9OT1RJRlkgYXJndW1lbnRzIHRvIGFuIG5zbV9oYW5kbGUKKyAqIEBpbmZvOiBwb2ludGVyIHRvIE5MTVBST0NfU01fTk9USUZZIGFyZ3VtZW50cworICoKKyAqIFJldHVybnMgYSBtYXRjaGluZyBuc21faGFuZGxlIGlmIGZvdW5kIGluIHRoZSBuc20gY2FjaGU7IHRoZSByZXR1cm5lZAorICogbnNtX2hhbmRsZSdzIHJlZmVyZW5jZSBjb3VudCBpcyBidW1wZWQgYW5kIHNtX21vbml0b3JlZCBpcyBjbGVhcmVkLgorICogT3RoZXJ3aXNlIHJldHVybnMgTlVMTCBpZiBzb21lIGVycm9yIG9jY3VycmVkLgorICovCitzdHJ1Y3QgbnNtX2hhbmRsZSAqbnNtX3JlYm9vdF9sb29rdXAoY29uc3Qgc3RydWN0IG5sbV9yZWJvb3QgKmluZm8pCit7CisJc3RydWN0IG5zbV9oYW5kbGUgKmNhY2hlZDsKKworCXNwaW5fbG9jaygmbnNtX2xvY2spOworCisJY2FjaGVkID0gbnNtX2xvb2t1cF9wcml2KCZpbmZvLT5wcml2KTsKKwlpZiAodW5saWtlbHkoY2FjaGVkID09IE5VTEwpKSB7CisJCXNwaW5fdW5sb2NrKCZuc21fbG9jayk7CisJCWRwcmludGsoImxvY2tkOiBuZXZlciBzYXcgcmVib290ZWQgcGVlciAnJS4qcycgYmVmb3JlXG4iLAorCQkJCWluZm8tPmxlbiwgaW5mby0+bW9uKTsKKwkJcmV0dXJuIGNhY2hlZDsKKwl9CisKKwlhdG9taWNfaW5jKCZjYWNoZWQtPnNtX2NvdW50KTsKKwlzcGluX3VubG9jaygmbnNtX2xvY2spOworCisJLyoKKwkgKiBEdXJpbmcgc3Vic2VxdWVudCBsb2NrIGFjdGl2aXR5LCBmb3JjZSBhIGZyZXNoCisJICogbm90aWZpY2F0aW9uIHRvIGJlIHNldCB1cCBmb3IgdGhpcyBob3N0LgorCSAqLworCWNhY2hlZC0+c21fbW9uaXRvcmVkID0gMDsKKworCWRwcmludGsoImxvY2tkOiBob3N0ICVzICglcykgcmVib290ZWQsIGNudCAlZFxuIiwKKwkJCWNhY2hlZC0+c21fbmFtZSwgY2FjaGVkLT5zbV9hZGRyYnVmLAorCQkJYXRvbWljX3JlYWQoJmNhY2hlZC0+c21fY291bnQpKTsKKwlyZXR1cm4gY2FjaGVkOworfQorCisvKioKKyAqIG5zbV9yZWxlYXNlIC0gUmVsZWFzZSBhbiBOU00gaGFuZGxlCisgKiBAbnNtOiBwb2ludGVyIHRvIGhhbmRsZSB0byBiZSByZWxlYXNlZAorICoKKyAqLwordm9pZCBuc21fcmVsZWFzZShzdHJ1Y3QgbnNtX2hhbmRsZSAqbnNtKQoreworCWlmIChhdG9taWNfZGVjX2FuZF9sb2NrKCZuc20tPnNtX2NvdW50LCAmbnNtX2xvY2spKSB7CisJCWxpc3RfZGVsKCZuc20tPnNtX2xpbmspOworCQlzcGluX3VubG9jaygmbnNtX2xvY2spOworCQlkcHJpbnRrKCJsb2NrZDogZGVzdHJveWVkIG5zbV9oYW5kbGUgZm9yICVzICglcylcbiIsCisJCQkJbnNtLT5zbV9uYW1lLCBuc20tPnNtX2FkZHJidWYpOworCQlrZnJlZShuc20pOworCX0KIH0KIAogLyoKQEAgLTE1NCwxMjcgKzQyOCwxMzIgQEAKICAqIFN0YXR1cyBNb25pdG9yIHdpcmUgcHJvdG9jb2wuCiAgKi8KIAotc3RhdGljIF9fYmUzMiAqeGRyX2VuY29kZV9uc21fc3RyaW5nKF9fYmUzMiAqcCwgY2hhciAqc3RyaW5nKQorc3RhdGljIGludCBlbmNvZGVfbnNtX3N0cmluZyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBjaGFyICpzdHJpbmcpCiB7Ci0Jc2l6ZV90IGxlbiA9IHN0cmxlbihzdHJpbmcpOworCWNvbnN0IHUzMiBsZW4gPSBzdHJsZW4oc3RyaW5nKTsKKwlfX2JlMzIgKnA7CiAKLQlpZiAobGVuID4gU01fTUFYU1RSTEVOKQotCQlsZW4gPSBTTV9NQVhTVFJMRU47Ci0JcmV0dXJuIHhkcl9lbmNvZGVfb3BhcXVlKHAsIHN0cmluZywgbGVuKTsKKwlpZiAodW5saWtlbHkobGVuID4gU01fTUFYU1RSTEVOKSkKKwkJcmV0dXJuIC1FSU87CisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgc2l6ZW9mKHUzMikgKyBsZW4pOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlyZXR1cm4gLUVJTzsKKwl4ZHJfZW5jb2RlX29wYXF1ZShwLCBzdHJpbmcsIGxlbik7CisJcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiAibW9uX25hbWUiIHNwZWNpZmllcyB0aGUgaG9zdCB0byBiZSBtb25pdG9yZWQuCi0gKgotICogTGludXggdXNlcyBhIHRleHQgdmVyc2lvbiBvZiB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgcmVtb3RlCi0gKiBob3N0IGFzIHRoZSBob3N0IGlkZW50aWZpZXIgKHRoZSAibW9uX25hbWUiIGFyZ3VtZW50KS4KLSAqCi0gKiBMaW51eCBzdGF0ZCBhbHdheXMgbG9va3MgdXAgdGhlIGNhbm9uaWNhbCBob3N0bmFtZSBmaXJzdCBmb3IKLSAqIHdoYXRldmVyIHJlbW90ZSBob3N0bmFtZSBpdCByZWNlaXZlcywgc28gdGhpcyB3b3JrcyBhbHJpZ2h0LgogICovCi1zdGF0aWMgX19iZTMyICp4ZHJfZW5jb2RlX21vbl9uYW1lKF9fYmUzMiAqcCwgc3RydWN0IG5zbV9hcmdzICphcmdwKQorc3RhdGljIGludCBlbmNvZGVfbW9uX25hbWUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5zbV9hcmdzICphcmdwKQogewotCWNoYXIJYnVmZmVyW1hEUl9BRERSQlVGX0xFTiArIDFdOwotCWNoYXIJKm5hbWUgPSBhcmdwLT5tb25fbmFtZTsKLQotCWlmICghbnNtX3VzZV9ob3N0bmFtZXMpIHsKLQkJc25wcmludGYoYnVmZmVyLCBYRFJfQUREUkJVRl9MRU4sCi0JCQkgIiVwSTQiLCAmYXJncC0+YWRkcik7Ci0JCW5hbWUgPSBidWZmZXI7Ci0JfQotCi0JcmV0dXJuIHhkcl9lbmNvZGVfbnNtX3N0cmluZyhwLCBuYW1lKTsKKwlyZXR1cm4gZW5jb2RlX25zbV9zdHJpbmcoeGRyLCBhcmdwLT5tb25fbmFtZSk7CiB9CiAKIC8qCiAgKiBUaGUgIm15X2lkIiBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIGhvc3RuYW1lIGFuZCBSUEMgcHJvY2VkdXJlCiAgKiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgc3RhdHVzIG1hbmFnZXIgcmVjZWl2ZXMgbm90aWZpY2F0aW9uCi0gKiAodmlhIHRoZSBTTV9OT1RJRlkgY2FsbCkgdGhhdCB0aGUgc3RhdGUgb2YgaG9zdCAibW9uX25hbWUiCisgKiAodmlhIHRoZSBOTE1QUk9DX1NNX05PVElGWSBjYWxsKSB0aGF0IHRoZSBzdGF0ZSBvZiBob3N0ICJtb25fbmFtZSIKICAqIGhhcyBjaGFuZ2VkLgogICovCi1zdGF0aWMgX19iZTMyICp4ZHJfZW5jb2RlX215X2lkKF9fYmUzMiAqcCwgc3RydWN0IG5zbV9hcmdzICphcmdwKQorc3RhdGljIGludCBlbmNvZGVfbXlfaWQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5zbV9hcmdzICphcmdwKQogewotCXAgPSB4ZHJfZW5jb2RlX25zbV9zdHJpbmcocCwgdXRzbmFtZSgpLT5ub2RlbmFtZSk7Ci0JaWYgKCFwKQotCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKKwlpbnQgc3RhdHVzOworCV9fYmUzMiAqcDsKIAorCXN0YXR1cyA9IGVuY29kZV9uc21fc3RyaW5nKHhkciwgdXRzbmFtZSgpLT5ub2RlbmFtZSk7CisJaWYgKHVubGlrZWx5KHN0YXR1cyAhPSAwKSkKKwkJcmV0dXJuIHN0YXR1czsKKwlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCAzICogc2l6ZW9mKHUzMikpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlyZXR1cm4gLUVJTzsKIAkqcCsrID0gaHRvbmwoYXJncC0+cHJvZyk7CiAJKnArKyA9IGh0b25sKGFyZ3AtPnZlcnMpOwogCSpwKysgPSBodG9ubChhcmdwLT5wcm9jKTsKLQotCXJldHVybiBwOworCXJldHVybiAwOwogfQogCiAvKgogICogVGhlICJtb25faWQiIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgbm9uLXByaXZhdGUgYXJndW1lbnRzCi0gKiBvZiBhbiBTTV9NT04gb3IgU01fVU5NT04gY2FsbC4KKyAqIG9mIGFuIE5TTVBST0NfTU9OIG9yIE5TTVBST0NfVU5NT04gY2FsbC4KICAqLwotc3RhdGljIF9fYmUzMiAqeGRyX2VuY29kZV9tb25faWQoX19iZTMyICpwLCBzdHJ1Y3QgbnNtX2FyZ3MgKmFyZ3ApCitzdGF0aWMgaW50IGVuY29kZV9tb25faWQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5zbV9hcmdzICphcmdwKQogewotCXAgPSB4ZHJfZW5jb2RlX21vbl9uYW1lKHAsIGFyZ3ApOwotCWlmICghcCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTyk7CisJaW50IHN0YXR1czsKIAotCXJldHVybiB4ZHJfZW5jb2RlX215X2lkKHAsIGFyZ3ApOworCXN0YXR1cyA9IGVuY29kZV9tb25fbmFtZSh4ZHIsIGFyZ3ApOworCWlmICh1bmxpa2VseShzdGF0dXMgIT0gMCkpCisJCXJldHVybiBzdGF0dXM7CisJcmV0dXJuIGVuY29kZV9teV9pZCh4ZHIsIGFyZ3ApOwogfQogCiAvKgogICogVGhlICJwcml2IiBhcmd1bWVudCBtYXkgY29udGFpbiBwcml2YXRlIGluZm9ybWF0aW9uIHJlcXVpcmVkCi0gKiBieSB0aGUgU01fTU9OIGNhbGwuIFRoaXMgaW5mb3JtYXRpb24gd2lsbCBiZSBzdXBwbGllZCBpbiB0aGUKLSAqIFNNX05PVElGWSBjYWxsLgotICoKLSAqIExpbnV4IHByb3ZpZGVzIHRoZSByYXcgSVAgYWRkcmVzcyBvZiB0aGUgbW9uaXRvcmVkIGhvc3QsCi0gKiBsZWZ0IGluIG5ldHdvcmsgYnl0ZSBvcmRlci4KKyAqIGJ5IHRoZSBOU01QUk9DX01PTiBjYWxsLiBUaGlzIGluZm9ybWF0aW9uIHdpbGwgYmUgc3VwcGxpZWQgaW4gdGhlCisgKiBOTE1QUk9DX1NNX05PVElGWSBjYWxsLgogICovCi1zdGF0aWMgX19iZTMyICp4ZHJfZW5jb2RlX3ByaXYoX19iZTMyICpwLCBzdHJ1Y3QgbnNtX2FyZ3MgKmFyZ3ApCitzdGF0aWMgaW50IGVuY29kZV9wcml2KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuc21fYXJncyAqYXJncCkKIHsKLQkqcCsrID0gYXJncC0+YWRkcjsKLQkqcCsrID0gMDsKLQkqcCsrID0gMDsKLQkqcCsrID0gMDsKKwlfX2JlMzIgKnA7CiAKLQlyZXR1cm4gcDsKLX0KLQotc3RhdGljIGludAoteGRyX2VuY29kZV9tb24oc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbnNtX2FyZ3MgKmFyZ3ApCi17Ci0JcCA9IHhkcl9lbmNvZGVfbW9uX2lkKHAsIGFyZ3ApOwotCWlmIChJU19FUlIocCkpCi0JCXJldHVybiBQVFJfRVJSKHApOwotCi0JcCA9IHhkcl9lbmNvZGVfcHJpdihwLCBhcmdwKTsKLQlpZiAoSVNfRVJSKHApKQotCQlyZXR1cm4gUFRSX0VSUihwKTsKLQotCXJxc3RwLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhycXN0cC0+cnFfc3ZlYywgcCk7CisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgU01fUFJJVl9TSVpFKTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FSU87CisJeGRyX2VuY29kZV9vcGFxdWVfZml4ZWQocCwgYXJncC0+cHJpdi0+ZGF0YSwgU01fUFJJVl9TSVpFKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludAoteGRyX2VuY29kZV91bm1vbihzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuc21fYXJncyAqYXJncCkKK3N0YXRpYyBpbnQgeGRyX2VuY19tb24oc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBuc21fYXJncyAqYXJncCkKIHsKLQlwID0geGRyX2VuY29kZV9tb25faWQocCwgYXJncCk7Ci0JaWYgKElTX0VSUihwKSkKLQkJcmV0dXJuIFBUUl9FUlIocCk7Ci0JcnFzdHAtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJxc3RwLT5ycV9zdmVjLCBwKTsKLQlyZXR1cm4gMDsKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisJaW50IHN0YXR1czsKKworCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKKwlzdGF0dXMgPSBlbmNvZGVfbW9uX2lkKCZ4ZHIsIGFyZ3ApOworCWlmICh1bmxpa2VseShzdGF0dXMpKQorCQlyZXR1cm4gc3RhdHVzOworCXJldHVybiBlbmNvZGVfcHJpdigmeGRyLCBhcmdwKTsKIH0KIAotc3RhdGljIGludAoteGRyX2RlY29kZV9zdGF0X3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuc21fcmVzICpyZXNwKQorc3RhdGljIGludCB4ZHJfZW5jX3VubW9uKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsCisJCQkgY29uc3Qgc3RydWN0IG5zbV9hcmdzICphcmdwKQogeworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKworCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKKwlyZXR1cm4gZW5jb2RlX21vbl9pZCgmeGRyLCBhcmdwKTsKK30KKworc3RhdGljIGludCB4ZHJfZGVjX3N0YXRfcmVzKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKKwkJCSAgICBzdHJ1Y3QgbnNtX3JlcyAqcmVzcCkKK3sKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisKKwl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKKwlwID0geGRyX2lubGluZV9kZWNvZGUoJnhkciwgMiAqIHNpemVvZih1MzIpKTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FSU87CiAJcmVzcC0+c3RhdHVzID0gbnRvaGwoKnArKyk7Ci0JcmVzcC0+c3RhdGUgPSBudG9obCgqcCsrKTsKLQlkcHJpbnRrKCJuc206IHhkcl9kZWNvZGVfc3RhdF9yZXMgc3RhdHVzICVkIHN0YXRlICVkXG4iLAorCXJlc3AtPnN0YXRlID0gbnRvaGwoKnApOworCisJZHByaW50aygibG9ja2Q6IHhkcl9kZWNfc3RhdF9yZXMgc3RhdHVzICVkIHN0YXRlICVkXG4iLAogCQkJcmVzcC0+c3RhdHVzLCByZXNwLT5zdGF0ZSk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQKLXhkcl9kZWNvZGVfc3RhdChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuc21fcmVzICpyZXNwKQorc3RhdGljIGludCB4ZHJfZGVjX3N0YXQoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLAorCQkJc3RydWN0IG5zbV9yZXMgKnJlc3ApCiB7Ci0JcmVzcC0+c3RhdGUgPSBudG9obCgqcCsrKTsKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisKKwl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKKwlwID0geGRyX2lubGluZV9kZWNvZGUoJnhkciwgc2l6ZW9mKHUzMikpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlyZXR1cm4gLUVJTzsKKwlyZXNwLT5zdGF0ZSA9IG50b2hsKCpwKTsKKworCWRwcmludGsoImxvY2tkOiB4ZHJfZGVjX3N0YXQgc3RhdGUgJWRcbiIsIHJlc3AtPnN0YXRlKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjg4LDIyICs1NjcsMjIgQEAKICNkZWZpbmUgU01fdW5tb25yZXNfc3oJMQogCiBzdGF0aWMgc3RydWN0IHJwY19wcm9jaW5mbwluc21fcHJvY2VkdXJlc1tdID0gewotW1NNX01PTl0gPSB7Ci0JCS5wX3Byb2MJCT0gU01fTU9OLAotCQkucF9lbmNvZGUJPSAoa3hkcnByb2NfdCkgeGRyX2VuY29kZV9tb24sCi0JCS5wX2RlY29kZQk9IChreGRycHJvY190KSB4ZHJfZGVjb2RlX3N0YXRfcmVzLAorW05TTVBST0NfTU9OXSA9IHsKKwkJLnBfcHJvYwkJPSBOU01QUk9DX01PTiwKKwkJLnBfZW5jb2RlCT0gKGt4ZHJwcm9jX3QpeGRyX2VuY19tb24sCisJCS5wX2RlY29kZQk9IChreGRycHJvY190KXhkcl9kZWNfc3RhdF9yZXMsCiAJCS5wX2FyZ2xlbgk9IFNNX21vbl9zeiwKIAkJLnBfcmVwbGVuCT0gU01fbW9ucmVzX3N6LAotCQkucF9zdGF0aWR4CT0gU01fTU9OLAorCQkucF9zdGF0aWR4CT0gTlNNUFJPQ19NT04sCiAJCS5wX25hbWUJCT0gIk1PTklUT1IiLAogCX0sCi1bU01fVU5NT05dID0gewotCQkucF9wcm9jCQk9IFNNX1VOTU9OLAotCQkucF9lbmNvZGUJPSAoa3hkcnByb2NfdCkgeGRyX2VuY29kZV91bm1vbiwKLQkJLnBfZGVjb2RlCT0gKGt4ZHJwcm9jX3QpIHhkcl9kZWNvZGVfc3RhdCwKK1tOU01QUk9DX1VOTU9OXSA9IHsKKwkJLnBfcHJvYwkJPSBOU01QUk9DX1VOTU9OLAorCQkucF9lbmNvZGUJPSAoa3hkcnByb2NfdCl4ZHJfZW5jX3VubW9uLAorCQkucF9kZWNvZGUJPSAoa3hkcnByb2NfdCl4ZHJfZGVjX3N0YXQsCiAJCS5wX2FyZ2xlbgk9IFNNX21vbl9pZF9zeiwKIAkJLnBfcmVwbGVuCT0gU01fdW5tb25yZXNfc3osCi0JCS5wX3N0YXRpZHgJPSBTTV9VTk1PTiwKKwkJLnBfc3RhdGlkeAk9IE5TTVBST0NfVU5NT04sCiAJCS5wX25hbWUJCT0gIlVOTU9OSVRPUiIsCiAJfSwKIH07CkBAIC0zMjIsNyArNjAxLDcgQEAKIAogc3RhdGljIHN0cnVjdCBycGNfcHJvZ3JhbQluc21fcHJvZ3JhbSA9IHsKIAkJLm5hbWUJCT0gInN0YXRkIiwKLQkJLm51bWJlcgkJPSBTTV9QUk9HUkFNLAorCQkubnVtYmVyCQk9IE5TTV9QUk9HUkFNLAogCQkubnJ2ZXJzCQk9IEFSUkFZX1NJWkUobnNtX3ZlcnNpb24pLAogCQkudmVyc2lvbgk9IG5zbV92ZXJzaW9uLAogCQkuc3RhdHMJCT0gJm5zbV9zdGF0cwpkaWZmIC0tZ2l0IGEvZnMvbG9ja2Qvc3ZjLmMgYi9mcy9sb2NrZC9zdmMuYwppbmRleCAyNTJkODAxLi42NGYxYzMxIDEwMDY0NAotLS0gYS9mcy9sb2NrZC9zdmMuYworKysgYi9mcy9sb2NrZC9zdmMuYwpAQCAtMzUsNyArMzUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmNzb2NrLmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSA8bGludXgvbG9ja2QvbG9ja2QuaD4KLSNpbmNsdWRlIDxsaW51eC9sb2NrZC9zbV9pbnRlci5oPgogI2luY2x1ZGUgPGxpbnV4L25mcy5oPgogCiAjZGVmaW5lIE5MTURCR19GQUNJTElUWQkJTkxNREJHX1NWQwpAQCAtNTQsMTMgKzUzLDI2IEBACiB1bnNpZ25lZCBsb25nCQkJbmxtc3ZjX3RpbWVvdXQ7CiAKIC8qCisgKiBJZiB0aGUga2VybmVsIGhhcyBJUHY2IHN1cHBvcnQgYXZhaWxhYmxlLCBhbHdheXMgbGlzdGVuIGZvcgorICogYm90aCBBRl9JTkVUIGFuZCBBRl9JTkVUNiByZXF1ZXN0cy4KKyAqLworI2lmIChkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkpICYmIFwKKwlkZWZpbmVkKENPTkZJR19TVU5SUENfUkVHSVNURVJfVjQpCitzdGF0aWMgY29uc3Qgc2FfZmFtaWx5X3QJbmxtc3ZjX2ZhbWlseSA9IEFGX0lORVQ2OworI2Vsc2UJLyogKENPTkZJR19JUFY2IHx8IENPTkZJR19JUFY2X01PRFVMRSkgJiYgQ09ORklHX1NVTlJQQ19SRUdJU1RFUl9WNCAqLworc3RhdGljIGNvbnN0IHNhX2ZhbWlseV90CW5sbXN2Y19mYW1pbHkgPSBBRl9JTkVUOworI2VuZGlmCS8qIChDT05GSUdfSVBWNiB8fCBDT05GSUdfSVBWNl9NT0RVTEUpICYmIENPTkZJR19TVU5SUENfUkVHSVNURVJfVjQgKi8KKworLyoKICAqIFRoZXNlIGNhbiBiZSBzZXQgYXQgaW5zbW9kIHRpbWUgKHVzZWZ1bCBmb3IgTkZTIGFzIHJvb3QgZmlsZXN5c3RlbSksCiAgKiBhbmQgYWxzbyBjaGFuZ2VkIHRocm91Z2ggdGhlIHN5c2N0bCBpbnRlcmZhY2UuICAtLSBKYW1pZSBMb2tpZXIsIEF1ZyAyMDAzCiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nCQlubG1fZ3JhY2VfcGVyaW9kOwogc3RhdGljIHVuc2lnbmVkIGxvbmcJCW5sbV90aW1lb3V0ID0gTE9DS0RfREZMVF9USU1FTzsKIHN0YXRpYyBpbnQJCQlubG1fdWRwcG9ydCwgbmxtX3RjcHBvcnQ7Ci1pbnQJCQkJbnNtX3VzZV9ob3N0bmFtZXMgPSAwOworCisvKiBSTElNX05PRklMRSBkZWZhdWx0cyB0byAxMDI0LiBUaGF0IHNlZW1zIGxpa2UgYSByZWFzb25hYmxlIGRlZmF1bHQgaGVyZS4gKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQJCW5sbV9tYXhfY29ubmVjdGlvbnMgPSAxMDI0OwogCiAvKgogICogQ29uc3RhbnRzIG5lZWRlZCBmb3IgdGhlIHN5c2N0bCBpbnRlcmZhY2UuCkBAIC0xNDMsNiArMTU1LDkgQEAKIAkJbG9uZyB0aW1lb3V0ID0gTUFYX1NDSEVEVUxFX1RJTUVPVVQ7CiAJCVJQQ19JRkRFQlVHKGNoYXIgYnVmW1JQQ19NQVhfQUREUkJVRkxFTl0pOwogCisJCS8qIHVwZGF0ZSBzdl9tYXhjb25uIGlmIGl0IGhhcyBjaGFuZ2VkICovCisJCXJxc3RwLT5ycV9zZXJ2ZXItPnN2X21heGNvbm4gPSBubG1fbWF4X2Nvbm5lY3Rpb25zOworCiAJCWlmIChzaWduYWxsZWQoKSkgewogCQkJZmx1c2hfc2lnbmFscyhjdXJyZW50KTsKIAkJCWlmIChubG1zdmNfb3BzKSB7CkBAIC0xODksNiArMjA0LDE5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgY3JlYXRlX2xvY2tkX2xpc3RlbmVyKHN0cnVjdCBzdmNfc2VydiAqc2VydiwgY2hhciAqbmFtZSwKKwkJCQkgdW5zaWduZWQgc2hvcnQgcG9ydCkKK3sKKwlzdHJ1Y3Qgc3ZjX3hwcnQgKnhwcnQ7CisKKwl4cHJ0ID0gc3ZjX2ZpbmRfeHBydChzZXJ2LCBuYW1lLCAwLCAwKTsKKwlpZiAoeHBydCA9PSBOVUxMKQorCQlyZXR1cm4gc3ZjX2NyZWF0ZV94cHJ0KHNlcnYsIG5hbWUsIHBvcnQsIFNWQ19TT0NLX0RFRkFVTFRTKTsKKworCXN2Y194cHJ0X3B1dCh4cHJ0KTsKKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIEVuc3VyZSB0aGVyZSBhcmUgYWN0aXZlIFVEUCBhbmQgVENQIGxpc3RlbmVycyBmb3IgbG9ja2QuCiAgKgpAQCAtMjAyLDI5ICsyMzAsMjMgQEAKIHN0YXRpYyBpbnQgbWFrZV9zb2NrcyhzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnYpCiB7CiAJc3RhdGljIGludCB3YXJuZWQ7Ci0Jc3RydWN0IHN2Y194cHJ0ICp4cHJ0OwotCWludCBlcnIgPSAwOworCWludCBlcnI7CiAKLQl4cHJ0ID0gc3ZjX2ZpbmRfeHBydChzZXJ2LCAidWRwIiwgMCwgMCk7Ci0JaWYgKCF4cHJ0KQotCQllcnIgPSBzdmNfY3JlYXRlX3hwcnQoc2VydiwgInVkcCIsIG5sbV91ZHBwb3J0LAotCQkJCSAgICAgIFNWQ19TT0NLX0RFRkFVTFRTKTsKLQllbHNlCi0JCXN2Y194cHJ0X3B1dCh4cHJ0KTsKLQlpZiAoZXJyID49IDApIHsKLQkJeHBydCA9IHN2Y19maW5kX3hwcnQoc2VydiwgInRjcCIsIDAsIDApOwotCQlpZiAoIXhwcnQpCi0JCQllcnIgPSBzdmNfY3JlYXRlX3hwcnQoc2VydiwgInRjcCIsIG5sbV90Y3Bwb3J0LAotCQkJCQkgICAgICBTVkNfU09DS19ERUZBVUxUUyk7Ci0JCWVsc2UKLQkJCXN2Y194cHJ0X3B1dCh4cHJ0KTsKLQl9Ci0JaWYgKGVyciA+PSAwKSB7Ci0JCXdhcm5lZCA9IDA7Ci0JCWVyciA9IDA7Ci0JfSBlbHNlIGlmICh3YXJuZWQrKyA9PSAwKQorCWVyciA9IGNyZWF0ZV9sb2NrZF9saXN0ZW5lcihzZXJ2LCAidWRwIiwgbmxtX3VkcHBvcnQpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dF9lcnI7CisKKwllcnIgPSBjcmVhdGVfbG9ja2RfbGlzdGVuZXIoc2VydiwgInRjcCIsIG5sbV90Y3Bwb3J0KTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXRfZXJyOworCisJd2FybmVkID0gMDsKKwlyZXR1cm4gMDsKKworb3V0X2VycjoKKwlpZiAod2FybmVkKysgPT0gMCkKIAkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgImxvY2tkX3VwOiBtYWtlc29jayBmYWlsZWQsIGVycm9yPSVkXG4iLCBlcnIpOworCQkJImxvY2tkX3VwOiBtYWtlc29jayBmYWlsZWQsIGVycm9yPSVkXG4iLCBlcnIpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTI1Miw3ICsyNzQsNyBAQAogCQkJImxvY2tkX3VwOiBubyBwaWQsICVkIHVzZXJzPz9cbiIsIG5sbXN2Y191c2Vycyk7CiAKIAllcnJvciA9IC1FTk9NRU07Ci0Jc2VydiA9IHN2Y19jcmVhdGUoJm5sbXN2Y19wcm9ncmFtLCBMT0NLRF9CVUZTSVpFLCBBRl9JTkVULCBOVUxMKTsKKwlzZXJ2ID0gc3ZjX2NyZWF0ZSgmbmxtc3ZjX3Byb2dyYW0sIExPQ0tEX0JVRlNJWkUsIG5sbXN2Y19mYW1pbHksIE5VTEwpOwogCWlmICghc2VydikgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJsb2NrZF91cDogY3JlYXRlIHNlcnZpY2UgZmFpbGVkXG4iKTsKIAkJZ290byBvdXQ7CkBAIC0yNzYsNiArMjk4LDcgQEAKIAl9CiAKIAlzdmNfc29ja191cGRhdGVfYnVmcyhzZXJ2KTsKKwlzZXJ2LT5zdl9tYXhjb25uID0gbmxtX21heF9jb25uZWN0aW9uczsKIAogCW5sbXN2Y190YXNrID0ga3RocmVhZF9ydW4obG9ja2QsIG5sbXN2Y19ycXN0LCBzZXJ2LT5zdl9uYW1lKTsKIAlpZiAoSVNfRVJSKG5sbXN2Y190YXNrKSkgewpAQCAtNDg1LDYgKzUwOCw3IEBACiBtb2R1bGVfcGFyYW1fY2FsbChubG1fdGNwcG9ydCwgcGFyYW1fc2V0X3BvcnQsIHBhcmFtX2dldF9pbnQsCiAJCSAgJm5sbV90Y3Bwb3J0LCAwNjQ0KTsKIG1vZHVsZV9wYXJhbShuc21fdXNlX2hvc3RuYW1lcywgYm9vbCwgMDY0NCk7Cittb2R1bGVfcGFyYW0obmxtX21heF9jb25uZWN0aW9ucywgdWludCwgMDY0NCk7CiAKIC8qCiAgKiBJbml0aWFsaXNpbmcgYW5kIHRlcm1pbmF0aW5nIHRoZSBtb2R1bGUuCmRpZmYgLS1naXQgYS9mcy9sb2NrZC9zdmM0cHJvYy5jIGIvZnMvbG9ja2Qvc3ZjNHByb2MuYwppbmRleCA0ZGZkY2JjLi4xNzI1MDM3MyAxMDA2NDQKLS0tIGEvZnMvbG9ja2Qvc3ZjNHByb2MuYworKysgYi9mcy9sb2NrZC9zdmM0cHJvYy5jCkBAIC0xNiw4ICsxNiw2IEBACiAjaW5jbHVkZSA8bGludXgvbmZzZC9uZnNkLmg+CiAjaW5jbHVkZSA8bGludXgvbG9ja2QvbG9ja2QuaD4KICNpbmNsdWRlIDxsaW51eC9sb2NrZC9zaGFyZS5oPgotI2luY2x1ZGUgPGxpbnV4L2xvY2tkL3NtX2ludGVyLmg+Ci0KIAogI2RlZmluZSBOTE1EQkdfRkFDSUxJVFkJCU5MTURCR19DTElFTlQKIApAQCAtNDE5LDggKzQxNyw2IEBACiBubG00c3ZjX3Byb2Nfc21fbm90aWZ5KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fcmVib290ICphcmdwLAogCQkJCQkgICAgICB2b2lkCSAgICAgICAgKnJlc3ApCiB7Ci0Jc3RydWN0IHNvY2thZGRyX2luCXNhZGRyOwotCiAJZHByaW50aygibG9ja2Q6IFNNX05PVElGWSAgICAgY2FsbGVkXG4iKTsKIAogCWlmICghbmxtX3ByaXZpbGVnZWRfcmVxdWVzdGVyKHJxc3RwKSkgewpAQCAtNDMwLDE0ICs0MjYsNyBAQAogCQlyZXR1cm4gcnBjX3N5c3RlbV9lcnI7CiAJfQogCi0JLyogT2J0YWluIHRoZSBob3N0IHBvaW50ZXIgZm9yIHRoaXMgTkZTIHNlcnZlciBhbmQgdHJ5IHRvCi0JICogcmVjbGFpbSBhbGwgbG9ja3Mgd2UgaG9sZCBvbiB0aGlzIHNlcnZlci4KLQkgKi8KLQltZW1zZXQoJnNhZGRyLCAwLCBzaXplb2Yoc2FkZHIpKTsKLQlzYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLQlzYWRkci5zaW5fYWRkci5zX2FkZHIgPSBhcmdwLT5hZGRyOwotCW5sbV9ob3N0X3JlYm9vdGVkKCZzYWRkciwgYXJncC0+bW9uLCBhcmdwLT5sZW4sIGFyZ3AtPnN0YXRlKTsKLQorCW5sbV9ob3N0X3JlYm9vdGVkKGFyZ3ApOwogCXJldHVybiBycGNfc3VjY2VzczsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvbG9ja2Qvc3ZjcHJvYy5jIGIvZnMvbG9ja2Qvc3ZjcHJvYy5jCmluZGV4IDNjYTg5ZTIuLjM2ODhlNTUgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tkL3N2Y3Byb2MuYworKysgYi9mcy9sb2NrZC9zdmNwcm9jLmMKQEAgLTE2LDggKzE2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9uZnNkL25mc2QuaD4KICNpbmNsdWRlIDxsaW51eC9sb2NrZC9sb2NrZC5oPgogI2luY2x1ZGUgPGxpbnV4L2xvY2tkL3NoYXJlLmg+Ci0jaW5jbHVkZSA8bGludXgvbG9ja2Qvc21faW50ZXIuaD4KLQogCiAjZGVmaW5lIE5MTURCR19GQUNJTElUWQkJTkxNREJHX0NMSUVOVAogCkBAIC00NTEsOCArNDQ5LDYgQEAKIG5sbXN2Y19wcm9jX3NtX25vdGlmeShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX3JlYm9vdCAqYXJncCwKIAkJCQkJICAgICAgdm9pZAkgICAgICAgICpyZXNwKQogewotCXN0cnVjdCBzb2NrYWRkcl9pbglzYWRkcjsKLQogCWRwcmludGsoImxvY2tkOiBTTV9OT1RJRlkgICAgIGNhbGxlZFxuIik7CiAKIAlpZiAoIW5sbV9wcml2aWxlZ2VkX3JlcXVlc3RlcihycXN0cCkpIHsKQEAgLTQ2MiwxNCArNDU4LDcgQEAKIAkJcmV0dXJuIHJwY19zeXN0ZW1fZXJyOwogCX0KIAotCS8qIE9idGFpbiB0aGUgaG9zdCBwb2ludGVyIGZvciB0aGlzIE5GUyBzZXJ2ZXIgYW5kIHRyeSB0bwotCSAqIHJlY2xhaW0gYWxsIGxvY2tzIHdlIGhvbGQgb24gdGhpcyBzZXJ2ZXIuCi0JICovCi0JbWVtc2V0KCZzYWRkciwgMCwgc2l6ZW9mKHNhZGRyKSk7Ci0Jc2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0Jc2FkZHIuc2luX2FkZHIuc19hZGRyID0gYXJncC0+YWRkcjsKLQlubG1faG9zdF9yZWJvb3RlZCgmc2FkZHIsIGFyZ3AtPm1vbiwgYXJncC0+bGVuLCBhcmdwLT5zdGF0ZSk7Ci0KKwlubG1faG9zdF9yZWJvb3RlZChhcmdwKTsKIAlyZXR1cm4gcnBjX3N1Y2Nlc3M7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL3N2Y3N1YnMuYyBiL2ZzL2xvY2tkL3N2Y3N1YnMuYwppbmRleCAzNGMyNzY2Li45ZTRkNmFhYiAxMDA2NDQKLS0tIGEvZnMvbG9ja2Qvc3Zjc3Vicy5jCisrKyBiL2ZzL2xvY2tkL3N2Y3N1YnMuYwpAQCAtMTcsNyArMTcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L25mc2QvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbG9ja2QvbG9ja2QuaD4KICNpbmNsdWRlIDxsaW51eC9sb2NrZC9zaGFyZS5oPgotI2luY2x1ZGUgPGxpbnV4L2xvY2tkL3NtX2ludGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KIApkaWZmIC0tZ2l0IGEvZnMvbG9ja2QveGRyLmMgYi9mcy9sb2NrZC94ZHIuYwppbmRleCAxZjIyNjI5Li4wMzM2ZjJiIDEwMDY0NAotLS0gYS9mcy9sb2NrZC94ZHIuYworKysgYi9mcy9sb2NrZC94ZHIuYwpAQCAtMTYsNyArMTYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3RhdHMuaD4KICNpbmNsdWRlIDxsaW51eC9sb2NrZC9sb2NrZC5oPgotI2luY2x1ZGUgPGxpbnV4L2xvY2tkL3NtX2ludGVyLmg+CiAKICNkZWZpbmUgTkxNREJHX0ZBQ0lMSVRZCQlOTE1EQkdfWERSCiAKQEAgLTM0OSw4ICszNDgsOCBAQAogCWlmICghKHAgPSB4ZHJfZGVjb2RlX3N0cmluZ19pbnBsYWNlKHAsICZhcmdwLT5tb24sICZhcmdwLT5sZW4sIFNNX01BWFNUUkxFTikpKQogCQlyZXR1cm4gMDsKIAlhcmdwLT5zdGF0ZSA9IG50b2hsKCpwKyspOwotCS8qIFByZXNlcnZlIHRoZSBhZGRyZXNzIGluIG5ldHdvcmsgYnl0ZSBvcmRlciAqLwotCWFyZ3AtPmFkZHIgPSAqcCsrOworCW1lbWNweSgmYXJncC0+cHJpdi5kYXRhLCBwLCBzaXplb2YoYXJncC0+cHJpdi5kYXRhKSk7CisJcCArPSBYRFJfUVVBRExFTihTTV9QUklWX1NJWkUpOwogCXJldHVybiB4ZHJfYXJnc2l6ZV9jaGVjayhycXN0cCwgcCk7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL3hkcjQuYyBiL2ZzL2xvY2tkL3hkcjQuYwppbmRleCA1MGM0OTNhLi5lMWQ1Mjg2IDEwMDY0NAotLS0gYS9mcy9sb2NrZC94ZHI0LmMKKysrIGIvZnMvbG9ja2QveGRyNC5jCkBAIC0xNyw3ICsxNyw2IEBACiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Yy5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdGF0cy5oPgogI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2xvY2tkLmg+Ci0jaW5jbHVkZSA8bGludXgvbG9ja2Qvc21faW50ZXIuaD4KIAogI2RlZmluZSBOTE1EQkdfRkFDSUxJVFkJCU5MTURCR19YRFIKIApAQCAtMzU2LDggKzM1NSw4IEBACiAJaWYgKCEocCA9IHhkcl9kZWNvZGVfc3RyaW5nX2lucGxhY2UocCwgJmFyZ3AtPm1vbiwgJmFyZ3AtPmxlbiwgU01fTUFYU1RSTEVOKSkpCiAJCXJldHVybiAwOwogCWFyZ3AtPnN0YXRlID0gbnRvaGwoKnArKyk7Ci0JLyogUHJlc2VydmUgdGhlIGFkZHJlc3MgaW4gbmV0d29yayBieXRlIG9yZGVyICovCi0JYXJncC0+YWRkciAgPSAqcCsrOworCW1lbWNweSgmYXJncC0+cHJpdi5kYXRhLCBwLCBzaXplb2YoYXJncC0+cHJpdi5kYXRhKSk7CisJcCArPSBYRFJfUVVBRExFTihTTV9QUklWX1NJWkUpOwogCXJldHVybiB4ZHJfYXJnc2l6ZV9jaGVjayhycXN0cCwgcCk7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL21pbml4L2Rpci5jIGIvZnMvbWluaXgvZGlyLmMKaW5kZXggZjcwNDMzOC4uZDQ5NDZjNCAxMDA2NDQKLS0tIGEvZnMvbWluaXgvZGlyLmMKKysrIGIvZnMvbWluaXgvZGlyLmMKQEAgLTI4MCw3ICsyODAsNyBAQAogCXJldHVybiAtRUlOVkFMOwogCiBnb3RfaXQ6Ci0JcG9zID0gKHBhZ2UtPmluZGV4ID4+IFBBR0VfQ0FDSEVfU0hJRlQpICsgcCAtIChjaGFyKilwYWdlX2FkZHJlc3MocGFnZSk7CisJcG9zID0gcGFnZV9vZmZzZXQocGFnZSkgKyBwIC0gKGNoYXIgKilwYWdlX2FkZHJlc3MocGFnZSk7CiAJZXJyID0gX19taW5peF93cml0ZV9iZWdpbihOVUxMLCBwYWdlLT5tYXBwaW5nLCBwb3MsIHNiaS0+c19kaXJzaXplLAogCQkJCQlBT1BfRkxBR19VTklOVEVSUlVQVElCTEUsICZwYWdlLCBOVUxMKTsKIAlpZiAoZXJyKQpkaWZmIC0tZ2l0IGEvZnMvbXBhZ2UuYyBiL2ZzL21wYWdlLmMKaW5kZXggNTUyYjgwYi4uMTZjM2VmMyAxMDA2NDQKLS0tIGEvZnMvbXBhZ2UuYworKysgYi9mcy9tcGFnZS5jCkBAIC0yNDEsNyArMjQxLDYgQEAKIAkJCQlmaXJzdF9ob2xlID0gcGFnZV9ibG9jazsKIAkJCXBhZ2VfYmxvY2srKzsKIAkJCWJsb2NrX2luX2ZpbGUrKzsKLQkJCWNsZWFyX2J1ZmZlcl9tYXBwZWQobWFwX2JoKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKQEAgLTMwOCw3ICszMDcsMTAgQEAKIAkJZ290byBhbGxvY19uZXc7CiAJfQogCi0JaWYgKGJ1ZmZlcl9ib3VuZGFyeShtYXBfYmgpIHx8IChmaXJzdF9ob2xlICE9IGJsb2Nrc19wZXJfcGFnZSkpCisJcmVsYXRpdmVfYmxvY2sgPSBibG9ja19pbl9maWxlIC0gKmZpcnN0X2xvZ2ljYWxfYmxvY2s7CisJbmJsb2NrcyA9IG1hcF9iaC0+Yl9zaXplID4+IGJsa2JpdHM7CisJaWYgKChidWZmZXJfYm91bmRhcnkobWFwX2JoKSAmJiByZWxhdGl2ZV9ibG9jayA9PSBuYmxvY2tzKSB8fAorCSAgICAoZmlyc3RfaG9sZSAhPSBibG9ja3NfcGVyX3BhZ2UpKQogCQliaW8gPSBtcGFnZV9iaW9fc3VibWl0KFJFQUQsIGJpbyk7CiAJZWxzZQogCQkqbGFzdF9ibG9ja19pbl9iaW8gPSBibG9ja3NbYmxvY2tzX3Blcl9wYWdlIC0gMV07CmRpZmYgLS1naXQgYS9mcy9uYW1laS5jIGIvZnMvbmFtZWkuYwppbmRleCBkZjJkM2RmLi5mMDViZWQyIDEwMDY0NAotLS0gYS9mcy9uYW1laS5jCisrKyBiL2ZzL25hbWVpLmMKQEAgLTI1Nyw3ICsyNTcsNyBAQAogCQkJcmV0dXJuIC1FQUNDRVM7CiAJfQogCi0JaWYgKGlub2RlLT5pX29wICYmIGlub2RlLT5pX29wLT5wZXJtaXNzaW9uKQorCWlmIChpbm9kZS0+aV9vcC0+cGVybWlzc2lvbikKIAkJcmV0dmFsID0gaW5vZGUtPmlfb3AtPnBlcm1pc3Npb24oaW5vZGUsIG1hc2spOwogCWVsc2UKIAkJcmV0dmFsID0gZ2VuZXJpY19wZXJtaXNzaW9uKGlub2RlLCBtYXNrLCBOVUxMKTsKQEAgLTQzMiw3ICs0MzIsNyBAQAogewogCXVtb2RlX3QJbW9kZSA9IGlub2RlLT5pX21vZGU7CiAKLQlpZiAoaW5vZGUtPmlfb3AgJiYgaW5vZGUtPmlfb3AtPnBlcm1pc3Npb24pCisJaWYgKGlub2RlLT5pX29wLT5wZXJtaXNzaW9uKQogCQlyZXR1cm4gLUVBR0FJTjsKIAogCWlmIChjdXJyZW50X2ZzdWlkKCkgPT0gaW5vZGUtPmlfdWlkKQpAQCAtOTA4LDkgKzkwOCw2IEBACiAJCWlub2RlID0gbmV4dC5kZW50cnktPmRfaW5vZGU7CiAJCWlmICghaW5vZGUpCiAJCQlnb3RvIG91dF9kcHV0OwotCQllcnIgPSAtRU5PVERJUjsgCi0JCWlmICghaW5vZGUtPmlfb3ApCi0JCQlnb3RvIG91dF9kcHV0OwogCiAJCWlmIChpbm9kZS0+aV9vcC0+Zm9sbG93X2xpbmspIHsKIAkJCWVyciA9IGRvX2ZvbGxvd19saW5rKCZuZXh0LCBuZCk7CkBAIC05MjAsOSArOTE3LDYgQEAKIAkJCWlub2RlID0gbmQtPnBhdGguZGVudHJ5LT5kX2lub2RlOwogCQkJaWYgKCFpbm9kZSkKIAkJCQlicmVhazsKLQkJCWVyciA9IC1FTk9URElSOyAKLQkJCWlmICghaW5vZGUtPmlfb3ApCi0JCQkJYnJlYWs7CiAJCX0gZWxzZQogCQkJcGF0aF90b19uYW1laWRhdGEoJm5leHQsIG5kKTsKIAkJZXJyID0gLUVOT1RESVI7IApAQCAtOTYxLDcgKzk1NSw3IEBACiAJCQlicmVhazsKIAkJaW5vZGUgPSBuZXh0LmRlbnRyeS0+ZF9pbm9kZTsKIAkJaWYgKChsb29rdXBfZmxhZ3MgJiBMT09LVVBfRk9MTE9XKQotCQkgICAgJiYgaW5vZGUgJiYgaW5vZGUtPmlfb3AgJiYgaW5vZGUtPmlfb3AtPmZvbGxvd19saW5rKSB7CisJCSAgICAmJiBpbm9kZSAmJiBpbm9kZS0+aV9vcC0+Zm9sbG93X2xpbmspIHsKIAkJCWVyciA9IGRvX2ZvbGxvd19saW5rKCZuZXh0LCBuZCk7CiAJCQlpZiAoZXJyKQogCQkJCWdvdG8gcmV0dXJuX2VycjsKQEAgLTk3Myw3ICs5NjcsNyBAQAogCQkJYnJlYWs7CiAJCWlmIChsb29rdXBfZmxhZ3MgJiBMT09LVVBfRElSRUNUT1JZKSB7CiAJCQllcnIgPSAtRU5PVERJUjsgCi0JCQlpZiAoIWlub2RlLT5pX29wIHx8ICFpbm9kZS0+aV9vcC0+bG9va3VwKQorCQkJaWYgKCFpbm9kZS0+aV9vcC0+bG9va3VwKQogCQkJCWJyZWFrOwogCQl9CiAJCWdvdG8gcmV0dXJuX2Jhc2U7CkBAIC0xNDY5LDcgKzE0NjMsNyBAQAogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwogCi0JaWYgKCFkaXItPmlfb3AgfHwgIWRpci0+aV9vcC0+Y3JlYXRlKQorCWlmICghZGlyLT5pX29wLT5jcmVhdGUpCiAJCXJldHVybiAtRUFDQ0VTOwkvKiBzaG91bGRuJ3QgaXQgYmUgRU5PU1lTPyAqLwogCW1vZGUgJj0gU19JQUxMVUdPOwogCW1vZGUgfD0gU19JRlJFRzsKQEAgLTE3NTIsNyArMTc0Niw3IEBACiAJZXJyb3IgPSAtRU5PRU5UOwogCWlmICghcGF0aC5kZW50cnktPmRfaW5vZGUpCiAJCWdvdG8gZXhpdF9kcHV0OwotCWlmIChwYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9vcCAmJiBwYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9vcC0+Zm9sbG93X2xpbmspCisJaWYgKHBhdGguZGVudHJ5LT5kX2lub2RlLT5pX29wLT5mb2xsb3dfbGluaykKIAkJZ290byBkb19saW5rOwogCiAJcGF0aF90b19uYW1laWRhdGEoJnBhdGgsICZuZCk7CkBAIC0xOTMzLDcgKzE5MjcsNyBAQAogCWlmICgoU19JU0NIUihtb2RlKSB8fCBTX0lTQkxLKG1vZGUpKSAmJiAhY2FwYWJsZShDQVBfTUtOT0QpKQogCQlyZXR1cm4gLUVQRVJNOwogCi0JaWYgKCFkaXItPmlfb3AgfHwgIWRpci0+aV9vcC0+bWtub2QpCisJaWYgKCFkaXItPmlfb3AtPm1rbm9kKQogCQlyZXR1cm4gLUVQRVJNOwogCiAJZXJyb3IgPSBkZXZjZ3JvdXBfaW5vZGVfbWtub2QobW9kZSwgZGV2KTsKQEAgLTIwMzUsNyArMjAyOSw3IEBACiAJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7CiAKLQlpZiAoIWRpci0+aV9vcCB8fCAhZGlyLT5pX29wLT5ta2RpcikKKwlpZiAoIWRpci0+aV9vcC0+bWtkaXIpCiAJCXJldHVybiAtRVBFUk07CiAKIAltb2RlICY9IChTX0lSV1hVR098U19JU1ZUWCk7CkBAIC0yMTI2LDcgKzIxMjAsNyBAQAogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwogCi0JaWYgKCFkaXItPmlfb3AgfHwgIWRpci0+aV9vcC0+cm1kaXIpCisJaWYgKCFkaXItPmlfb3AtPnJtZGlyKQogCQlyZXR1cm4gLUVQRVJNOwogCiAJRFFVT1RfSU5JVChkaXIpOwpAQCAtMjIxMyw3ICsyMjA3LDcgQEAKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIAotCWlmICghZGlyLT5pX29wIHx8ICFkaXItPmlfb3AtPnVubGluaykKKwlpZiAoIWRpci0+aV9vcC0+dW5saW5rKQogCQlyZXR1cm4gLUVQRVJNOwogCiAJRFFVT1RfSU5JVChkaXIpOwpAQCAtMjMyMCw3ICsyMzE0LDcgQEAKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIAotCWlmICghZGlyLT5pX29wIHx8ICFkaXItPmlfb3AtPnN5bWxpbmspCisJaWYgKCFkaXItPmlfb3AtPnN5bWxpbmspCiAJCXJldHVybiAtRVBFUk07CiAKIAllcnJvciA9IHNlY3VyaXR5X2lub2RlX3N5bWxpbmsoZGlyLCBkZW50cnksIG9sZG5hbWUpOwpAQCAtMjQwMSw3ICsyMzk1LDcgQEAKIAkgKi8KIAlpZiAoSVNfQVBQRU5EKGlub2RlKSB8fCBJU19JTU1VVEFCTEUoaW5vZGUpKQogCQlyZXR1cm4gLUVQRVJNOwotCWlmICghZGlyLT5pX29wIHx8ICFkaXItPmlfb3AtPmxpbmspCisJaWYgKCFkaXItPmlfb3AtPmxpbmspCiAJCXJldHVybiAtRVBFUk07CiAJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCiAJCXJldHVybiAtRVBFUk07CkBAIC0yNjA4LDcgKzI2MDIsNyBAQAogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwogCi0JaWYgKCFvbGRfZGlyLT5pX29wIHx8ICFvbGRfZGlyLT5pX29wLT5yZW5hbWUpCisJaWYgKCFvbGRfZGlyLT5pX29wLT5yZW5hbWUpCiAJCXJldHVybiAtRVBFUk07CiAKIAlEUVVPVF9JTklUKG9sZF9kaXIpOwpkaWZmIC0tZ2l0IGEvZnMvbmNwZnMvZ2V0b3B0LmMgYi9mcy9uY3Bmcy9nZXRvcHQuYwppbmRleCAzMzViMDAzLi4wYWYzMzQ5IDEwMDY0NAotLS0gYS9mcy9uY3Bmcy9nZXRvcHQuYworKysgYi9mcy9uY3Bmcy9nZXRvcHQuYwpAQCAtMTYsNyArMTYsNiBAQAogICoJQG9wdHM6IGFuIGFycmF5IG9mICZzdHJ1Y3Qgb3B0aW9uIGVudHJpZXMgY29udHJvbGxpbmcgcGFyc2VyIG9wZXJhdGlvbnMKICAqCUBvcHRvcHQ6IG91dHB1dDsgd2lsbCBjb250YWluIHRoZSBjdXJyZW50IG9wdGlvbgogICoJQG9wdGFyZzogb3V0cHV0OyB3aWxsIGNvbnRhaW4gdGhlIHZhbHVlIChpZiBvbmUgZXhpc3RzKQotICoJQGZsYWc6IG91dHB1dDsgbWF5IGJlIE5VTEw7IHNob3VsZCBwb2ludCB0byBhIGxvbmcgZm9yIG9yJ2luZyBmbGFncwogICoJQHZhbHVlOiBvdXRwdXQ7IG1heSBiZSBOVUxMOyB3aWxsIGJlIG92ZXJ3cml0dGVuIHdpdGggdGhlIGludGVnZXIgdmFsdWUKICAqCQlvZiB0aGUgY3VycmVudCBhcmd1bWVudC4KICAqCmRpZmYgLS1naXQgYS9mcy9uY3Bmcy9pb2N0bC5jIGIvZnMvbmNwZnMvaW9jdGwuYwppbmRleCA2ZDA0ZTA1Li5mNTQzNjBmIDEwMDY0NAotLS0gYS9mcy9uY3Bmcy9pb2N0bC5jCisrKyBiL2ZzL25jcGZzL2lvY3RsLmMKQEAgLTk4LDcgKzk4LDcgQEAKIHsKIAlzMzIJCWF1dGhfdHlwZTsKIAl1MzIJCW9iamVjdF9uYW1lX2xlbjsKLQljb21wYXRfY2FkZHJfdAlvYmplY3RfbmFtZTsJLyogYW4gdXNlcnNwYWNlIGRhdGEsIGluIG1vc3QgY2FzZXMgdXNlciBuYW1lICovCisJY29tcGF0X2NhZGRyX3QJb2JqZWN0X25hbWU7CS8qIGEgdXNlcnNwYWNlIGRhdGEsIGluIG1vc3QgY2FzZXMgdXNlciBuYW1lICovCiB9OwogCiBzdHJ1Y3QgY29tcGF0X25jcF9mc19pbmZvX3YyIHsKZGlmZiAtLWdpdCBhL2ZzL25mc2QvYXV0aC5jIGIvZnMvbmZzZC9hdXRoLmMKaW5kZXggMDE4NGZlOS4uYzkwM2UwNCAxMDA2NDQKLS0tIGEvZnMvbmZzZC9hdXRoLmMKKysrIGIvZnMvbmZzZC9hdXRoLmMKQEAgLTc2LDEwICs3NiwxMCBAQAogCiAJcmV0ID0gc2V0X2dyb3VwcyhuZXcsIGdpKTsKIAlwdXRfZ3JvdXBfaW5mbyhnaSk7Ci0JaWYgKCFyZXQpCisJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyb3I7CiAKLQlpZiAobmV3LT51aWQpCisJaWYgKG5ldy0+ZnN1aWQpCiAJCW5ldy0+Y2FwX2VmZmVjdGl2ZSA9IGNhcF9kcm9wX25mc2Rfc2V0KG5ldy0+Y2FwX2VmZmVjdGl2ZSk7CiAJZWxzZQogCQluZXctPmNhcF9lZmZlY3RpdmUgPSBjYXBfcmFpc2VfbmZzZF9zZXQobmV3LT5jYXBfZWZmZWN0aXZlLApkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0Y2FsbGJhY2suYyBiL2ZzL25mc2QvbmZzNGNhbGxiYWNrLmMKaW5kZXggNmQ3ZDhjMC4uYzQ2NDE4MSAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0Y2FsbGJhY2suYworKysgYi9mcy9uZnNkL25mczRjYWxsYmFjay5jCkBAIC01Myw5ICs1Myw2IEBACiAjZGVmaW5lIE5GU1BST0M0X0NCX05VTEwgMAogI2RlZmluZSBORlNQUk9DNF9DQl9DT01QT1VORCAxCiAKLS8qIGRlY2xhcmF0aW9ucyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBycGNfY2FsbF9vcHMgbmZzNF9jYl9udWxsX29wczsKLQogLyogSW5kZXggb2YgcHJlZGVmaW5lZCBMaW51eCBjYWxsYmFjayBjbGllbnQgb3BlcmF0aW9ucyAqLwogCiBlbnVtIHsKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNHByb2MuYyBiL2ZzL25mc2QvbmZzNHByb2MuYwppbmRleCA2Njk0NjFlLi45ZmE2MGEzIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczRwcm9jLmMKKysrIGIvZnMvbmZzZC9uZnM0cHJvYy5jCkBAIC05NDYsNiArOTQ2LDExIEBACiAJCQluZnNkNF9lbmNvZGVfb3BlcmF0aW9uKHJlc3AsIG9wKTsKIAkJCXN0YXR1cyA9IG9wLT5zdGF0dXM7CiAJCX0KKworCQlkcHJpbnRrKCJuZnN2NCBjb21wb3VuZCBvcCAlcCBvcGNudCAlZCAjJWQ6ICVkOiBzdGF0dXMgJWRcbiIsCisJCQlhcmdzLT5vcHMsIGFyZ3MtPm9wY250LCByZXNwLT5vcGNudCwgb3AtPm9wbnVtLAorCQkJYmUzMl90b19jcHUoc3RhdHVzKSk7CisKIAkJaWYgKGNzdGF0ZS0+cmVwbGF5X293bmVyKSB7CiAJCQluZnM0X3B1dF9zdGF0ZW93bmVyKGNzdGF0ZS0+cmVwbGF5X293bmVyKTsKIAkJCWNzdGF0ZS0+cmVwbGF5X293bmVyID0gTlVMTDsKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNHJlY292ZXIuYyBiL2ZzL25mc2QvbmZzNHJlY292ZXIuYwppbmRleCAwZjlkNmVmLi43NGY3YjY3IDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczRyZWNvdmVyLmMKKysrIGIvZnMvbmZzZC9uZnM0cmVjb3Zlci5jCkBAIC0xMTYsOSArMTE2LDkgQEAKIAogCW1kNV90b19oZXgoZG5hbWUsIGNrc3VtLmRhdGEpOwogCi0Ja2ZyZWUoY2tzdW0uZGF0YSk7CiAJc3RhdHVzID0gbmZzX29rOwogb3V0OgorCWtmcmVlKGNrc3VtLmRhdGEpOwogCWNyeXB0b19mcmVlX2hhc2goZGVzYy50Zm0pOwogb3V0X25vX3RmbToKIAlyZXR1cm4gc3RhdHVzOwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0c3RhdGUuYyBiL2ZzL25mc2QvbmZzNHN0YXRlLmMKaW5kZXggMTNlMGUwNy4uODhkYjdkMyAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0c3RhdGUuYworKysgYi9mcy9uZnNkL25mczRzdGF0ZS5jCkBAIC0yNDE2LDYgKzI0MTYsMjYgQEAKICNkZWZpbmUgTE9DS19IQVNIX1NJWkUgICAgICAgICAgICAgKDEgPDwgTE9DS19IQVNIX0JJVFMpCiAjZGVmaW5lIExPQ0tfSEFTSF9NQVNLICAgICAgICAgICAgIChMT0NLX0hBU0hfU0laRSAtIDEpCiAKK3N0YXRpYyBpbmxpbmUgdTY0CitlbmRfb2Zmc2V0KHU2NCBzdGFydCwgdTY0IGxlbikKK3sKKwl1NjQgZW5kOworCisJZW5kID0gc3RhcnQgKyBsZW47CisJcmV0dXJuIGVuZCA+PSBzdGFydCA/IGVuZDogTkZTNF9NQVhfVUlOVDY0OworfQorCisvKiBsYXN0IG9jdGV0IGluIGEgcmFuZ2UgKi8KK3N0YXRpYyBpbmxpbmUgdTY0CitsYXN0X2J5dGVfb2Zmc2V0KHU2NCBzdGFydCwgdTY0IGxlbikKK3sKKwl1NjQgZW5kOworCisJQlVHX09OKCFsZW4pOworCWVuZCA9IHN0YXJ0ICsgbGVuOworCXJldHVybiBlbmQgPiBzdGFydCA/IGVuZCAtIDE6IE5GUzRfTUFYX1VJTlQ2NDsKK30KKwogI2RlZmluZSBsb2Nrb3duZXJpZF9oYXNodmFsKGlkKSBcCiAgICAgICAgICgoaWQpICYgTE9DS19IQVNIX01BU0spCiAKQEAgLTI0MzUsMTMgKzI0NTUsMTMgQEAKIHN0YXRpYyBzdHJ1Y3QgbmZzNF9zdGF0ZWlkICoKIGZpbmRfc3RhdGVpZChzdGF0ZWlkX3QgKnN0aWQsIGludCBmbGFncykKIHsKLQlzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpsb2NhbCA9IE5VTEw7CisJc3RydWN0IG5mczRfc3RhdGVpZCAqbG9jYWw7CiAJdTMyIHN0X2lkID0gc3RpZC0+c2lfc3RhdGVvd25lcmlkOwogCXUzMiBmX2lkID0gc3RpZC0+c2lfZmlsZWlkOwogCXVuc2lnbmVkIGludCBoYXNodmFsOwogCiAJZHByaW50aygiTkZTRDogZmluZF9zdGF0ZWlkIGZsYWdzIDB4JXhcbiIsZmxhZ3MpOwotCWlmICgoZmxhZ3MgJiBMT0NLX1NUQVRFKSB8fCAoZmxhZ3MgJiBSRF9TVEFURSkgfHwgKGZsYWdzICYgV1JfU1RBVEUpKSB7CisJaWYgKGZsYWdzICYgKExPQ0tfU1RBVEUgfCBSRF9TVEFURSB8IFdSX1NUQVRFKSkgewogCQloYXNodmFsID0gc3RhdGVpZF9oYXNodmFsKHN0X2lkLCBmX2lkKTsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShsb2NhbCwgJmxvY2tzdGF0ZWlkX2hhc2h0YmxbaGFzaHZhbF0sIHN0X2hhc2gpIHsKIAkJCWlmICgobG9jYWwtPnN0X3N0YXRlaWQuc2lfc3RhdGVvd25lcmlkID09IHN0X2lkKSAmJgpAQCAtMjQ0OSw3ICsyNDY5LDggQEAKIAkJCQlyZXR1cm4gbG9jYWw7CiAJCX0KIAl9IAotCWlmICgoZmxhZ3MgJiBPUEVOX1NUQVRFKSB8fCAoZmxhZ3MgJiBSRF9TVEFURSkgfHwgKGZsYWdzICYgV1JfU1RBVEUpKSB7CisKKwlpZiAoZmxhZ3MgJiAoT1BFTl9TVEFURSB8IFJEX1NUQVRFIHwgV1JfU1RBVEUpKSB7CiAJCWhhc2h2YWwgPSBzdGF0ZWlkX2hhc2h2YWwoc3RfaWQsIGZfaWQpOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvY2FsLCAmc3RhdGVpZF9oYXNodGJsW2hhc2h2YWxdLCBzdF9oYXNoKSB7CiAJCQlpZiAoKGxvY2FsLT5zdF9zdGF0ZWlkLnNpX3N0YXRlb3duZXJpZCA9PSBzdF9pZCkgJiYKQEAgLTI1MTgsOCArMjUzOSw4IEBACiAJCWRlbnktPmxkX2NsaWVudGlkLmNsX2lkID0gMDsKIAl9CiAJZGVueS0+bGRfc3RhcnQgPSBmbC0+Zmxfc3RhcnQ7Ci0JZGVueS0+bGRfbGVuZ3RoID0gfih1NjQpMDsKLQlpZiAoZmwtPmZsX2VuZCAhPSB+KHU2NCkwKQorCWRlbnktPmxkX2xlbmd0aCA9IE5GUzRfTUFYX1VJTlQ2NDsKKwlpZiAoZmwtPmZsX2VuZCAhPSBORlM0X01BWF9VSU5UNjQpCiAJCWRlbnktPmxkX2xlbmd0aCA9IGZsLT5mbF9lbmQgLSBmbC0+Zmxfc3RhcnQgKyAxOyAgICAgICAgCiAJZGVueS0+bGRfdHlwZSA9IE5GUzRfUkVBRF9MVDsKIAlpZiAoZmwtPmZsX3R5cGUgIT0gRl9SRExDSykKQEAgLTI2MTYsNyArMjYzNyw3IEBACiBzdGF0aWMgaW50CiBjaGVja19sb2NrX2xlbmd0aCh1NjQgb2Zmc2V0LCB1NjQgbGVuZ3RoKQogewotCXJldHVybiAoKGxlbmd0aCA9PSAwKSAgfHwgKChsZW5ndGggIT0gfih1NjQpMCkgJiYKKwlyZXR1cm4gKChsZW5ndGggPT0gMCkgIHx8ICgobGVuZ3RoICE9IE5GUzRfTUFYX1VJTlQ2NCkgJiYKIAkgICAgIExPRkZfT1ZFUkZMT1cob2Zmc2V0LCBsZW5ndGgpKSk7CiB9CiAKQEAgLTI3MzYsMTEgKzI3NTcsNyBAQAogCWZpbGVfbG9jay5mbF9sbW9wcyA9ICZuZnNkX3Bvc2l4X21uZ19vcHM7CiAKIAlmaWxlX2xvY2suZmxfc3RhcnQgPSBsb2NrLT5sa19vZmZzZXQ7Ci0JaWYgKChsb2NrLT5sa19sZW5ndGggPT0gfih1NjQpMCkgfHwgCi0JCQlMT0ZGX09WRVJGTE9XKGxvY2stPmxrX29mZnNldCwgbG9jay0+bGtfbGVuZ3RoKSkKLQkJZmlsZV9sb2NrLmZsX2VuZCA9IH4odTY0KTA7Ci0JZWxzZQotCQlmaWxlX2xvY2suZmxfZW5kID0gbG9jay0+bGtfb2Zmc2V0ICsgbG9jay0+bGtfbGVuZ3RoIC0gMTsKKwlmaWxlX2xvY2suZmxfZW5kID0gbGFzdF9ieXRlX29mZnNldChsb2NrLT5sa19vZmZzZXQsIGxvY2stPmxrX2xlbmd0aCk7CiAJbmZzNF90cmFuc2Zvcm1fbG9ja19vZmZzZXQoJmZpbGVfbG9jayk7CiAKIAkvKgpAQCAtMjc4MSw2ICsyNzk4LDI1IEBACiB9CiAKIC8qCisgKiBUaGUgTkZTdjQgc3BlYyBhbGxvd3MgYSBjbGllbnQgdG8gZG8gYSBMT0NLVCB3aXRob3V0IGhvbGRpbmcgYW4gT1BFTiwKKyAqIHNvIHdlIGRvIGEgdGVtcG9yYXJ5IG9wZW4gaGVyZSBqdXN0IHRvIGdldCBhbiBvcGVuIGZpbGUgdG8gcGFzcyB0bworICogdmZzX3Rlc3RfbG9jay4gIChBcmd1YWJseSBwZXJoYXBzIHRlc3RfbG9jayBzaG91bGQgYmUgZG9uZSB3aXRoIGFuCisgKiBpbm9kZSBvcGVyYXRpb24uKQorICovCitzdGF0aWMgaW50IG5mc2RfdGVzdF9sb2NrKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmZocCwgc3RydWN0IGZpbGVfbG9jayAqbG9jaykKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlpbnQgZXJyOworCisJZXJyID0gbmZzZF9vcGVuKHJxc3RwLCBmaHAsIFNfSUZSRUcsIE5GU0RfTUFZX1JFQUQsICZmaWxlKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCWVyciA9IHZmc190ZXN0X2xvY2soZmlsZSwgbG9jayk7CisJbmZzZF9jbG9zZShmaWxlKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgogICogTE9DS1Qgb3BlcmF0aW9uCiAgKi8KIF9fYmUzMgpAQCAtMjc4OCw3ICsyODI0LDYgQEAKIAkgICAgc3RydWN0IG5mc2Q0X2xvY2t0ICpsb2NrdCkKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwotCXN0cnVjdCBmaWxlIGZpbGU7CiAJc3RydWN0IGZpbGVfbG9jayBmaWxlX2xvY2s7CiAJaW50IGVycm9yOwogCV9fYmUzMiBzdGF0dXM7CkBAIC0yODM5LDIzICsyODc0LDEyIEBACiAJZmlsZV9sb2NrLmZsX2xtb3BzID0gJm5mc2RfcG9zaXhfbW5nX29wczsKIAogCWZpbGVfbG9jay5mbF9zdGFydCA9IGxvY2t0LT5sdF9vZmZzZXQ7Ci0JaWYgKChsb2NrdC0+bHRfbGVuZ3RoID09IH4odTY0KTApIHx8IExPRkZfT1ZFUkZMT1cobG9ja3QtPmx0X29mZnNldCwgbG9ja3QtPmx0X2xlbmd0aCkpCi0JCWZpbGVfbG9jay5mbF9lbmQgPSB+KHU2NCkwOwotCWVsc2UKLQkJZmlsZV9sb2NrLmZsX2VuZCA9IGxvY2t0LT5sdF9vZmZzZXQgKyBsb2NrdC0+bHRfbGVuZ3RoIC0gMTsKKwlmaWxlX2xvY2suZmxfZW5kID0gbGFzdF9ieXRlX29mZnNldChsb2NrdC0+bHRfb2Zmc2V0LCBsb2NrdC0+bHRfbGVuZ3RoKTsKIAogCW5mczRfdHJhbnNmb3JtX2xvY2tfb2Zmc2V0KCZmaWxlX2xvY2spOwogCi0JLyogdmZzX3Rlc3RfbG9jayB1c2VzIHRoZSBzdHJ1Y3QgZmlsZSBfb25seV8gdG8gcmVzb2x2ZSB0aGUgaW5vZGUuCi0JICogc2luY2UgTE9DS1QgZG9lc24ndCByZXF1aXJlIGFuIE9QRU4sIGFuZCB0aGVyZWZvcmUgYSBzdHJ1Y3QKLQkgKiBmaWxlIG1heSBub3QgZXhpc3QsIHBhc3MgdmZzX3Rlc3RfbG9jayBhIHN0cnVjdCBmaWxlIHdpdGgKLQkgKiBvbmx5IHRoZSBkZW50cnk6aW5vZGUgc2V0LgotCSAqLwotCW1lbXNldCgmZmlsZSwgMCwgc2l6ZW9mIChzdHJ1Y3QgZmlsZSkpOwotCWZpbGUuZl9wYXRoLmRlbnRyeSA9IGNzdGF0ZS0+Y3VycmVudF9maC5maF9kZW50cnk7Ci0KIAlzdGF0dXMgPSBuZnNfb2s7Ci0JZXJyb3IgPSB2ZnNfdGVzdF9sb2NrKCZmaWxlLCAmZmlsZV9sb2NrKTsKKwllcnJvciA9IG5mc2RfdGVzdF9sb2NrKHJxc3RwLCAmY3N0YXRlLT5jdXJyZW50X2ZoLCAmZmlsZV9sb2NrKTsKIAlpZiAoZXJyb3IpIHsKIAkJc3RhdHVzID0gbmZzZXJybm8oZXJyb3IpOwogCQlnb3RvIG91dDsKQEAgLTI5MDYsMTAgKzI5MzAsNyBAQAogCWZpbGVfbG9jay5mbF9sbW9wcyA9ICZuZnNkX3Bvc2l4X21uZ19vcHM7CiAJZmlsZV9sb2NrLmZsX3N0YXJ0ID0gbG9ja3UtPmx1X29mZnNldDsKIAotCWlmICgobG9ja3UtPmx1X2xlbmd0aCA9PSB+KHU2NCkwKSB8fCBMT0ZGX09WRVJGTE9XKGxvY2t1LT5sdV9vZmZzZXQsIGxvY2t1LT5sdV9sZW5ndGgpKQotCQlmaWxlX2xvY2suZmxfZW5kID0gfih1NjQpMDsKLQllbHNlCi0JCWZpbGVfbG9jay5mbF9lbmQgPSBsb2NrdS0+bHVfb2Zmc2V0ICsgbG9ja3UtPmx1X2xlbmd0aCAtIDE7CisJZmlsZV9sb2NrLmZsX2VuZCA9IGxhc3RfYnl0ZV9vZmZzZXQobG9ja3UtPmx1X29mZnNldCwgbG9ja3UtPmx1X2xlbmd0aCk7CiAJbmZzNF90cmFuc2Zvcm1fbG9ja19vZmZzZXQoJmZpbGVfbG9jayk7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0eGRyLmMgYi9mcy9uZnNkL25mczR4ZHIuYwppbmRleCBhZmNkZjRiLi5mNjU5NTNiIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczR4ZHIuYworKysgYi9mcy9uZnNkL25mczR4ZHIuYwpAQCAtMSw2ICsxLDQgQEAKIC8qCi0gKiAgZnMvbmZzL25mczR4ZHIuYwotICoKICAqICBTZXJ2ZXItc2lkZSBYRFIgZm9yIE5GU3Y0CiAgKgogICogIENvcHlyaWdodCAoYykgMjAwMiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBNaWNoaWdhbi4KZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzY3RsLmMgYi9mcy9uZnNkL25mc2N0bC5jCmluZGV4IDc3ZDdiOGMuLjNkOTNiMjAgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzY3RsLmMKKysrIGIvZnMvbmZzZC9uZnNjdGwuYwpAQCAtODQsNiArODQsOCBAQAogc3RhdGljIHNzaXplX3Qgd3JpdGVfZ2V0ZmQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpOwogc3RhdGljIHNzaXplX3Qgd3JpdGVfZ2V0ZnMoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpOwogc3RhdGljIHNzaXplX3Qgd3JpdGVfZmlsZWhhbmRsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSk7CitzdGF0aWMgc3NpemVfdCB3cml0ZV91bmxvY2tfaXAoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpOworc3RhdGljIHNzaXplX3Qgd3JpdGVfdW5sb2NrX2ZzKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKTsKIHN0YXRpYyBzc2l6ZV90IHdyaXRlX3RocmVhZHMoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpOwogc3RhdGljIHNzaXplX3Qgd3JpdGVfcG9vbF90aHJlYWRzKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKTsKIHN0YXRpYyBzc2l6ZV90IHdyaXRlX3ZlcnNpb25zKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKTsKQEAgLTk0LDkgKzk2LDYgQEAKIHN0YXRpYyBzc2l6ZV90IHdyaXRlX3JlY292ZXJ5ZGlyKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKTsKICNlbmRpZgogCi1zdGF0aWMgc3NpemVfdCBmYWlsb3Zlcl91bmxvY2tfaXAoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpOwotc3RhdGljIHNzaXplX3QgZmFpbG92ZXJfdW5sb2NrX2ZzKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKTsKLQogc3RhdGljIHNzaXplX3QgKCp3cml0ZV9vcFtdKShzdHJ1Y3QgZmlsZSAqLCBjaGFyICosIHNpemVfdCkgPSB7CiAJW05GU0RfU3ZjXSA9IHdyaXRlX3N2YywKIAlbTkZTRF9BZGRdID0gd3JpdGVfYWRkLApAQCAtMTA2LDggKzEwNSw4IEBACiAJW05GU0RfR2V0ZmRdID0gd3JpdGVfZ2V0ZmQsCiAJW05GU0RfR2V0ZnNdID0gd3JpdGVfZ2V0ZnMsCiAJW05GU0RfRmhdID0gd3JpdGVfZmlsZWhhbmRsZSwKLQlbTkZTRF9GT19VbmxvY2tJUF0gPSBmYWlsb3Zlcl91bmxvY2tfaXAsCi0JW05GU0RfRk9fVW5sb2NrRlNdID0gZmFpbG92ZXJfdW5sb2NrX2ZzLAorCVtORlNEX0ZPX1VubG9ja0lQXSA9IHdyaXRlX3VubG9ja19pcCwKKwlbTkZTRF9GT19VbmxvY2tGU10gPSB3cml0ZV91bmxvY2tfZnMsCiAJW05GU0RfVGhyZWFkc10gPSB3cml0ZV90aHJlYWRzLAogCVtORlNEX1Bvb2xfVGhyZWFkc10gPSB3cml0ZV9wb29sX3RocmVhZHMsCiAJW05GU0RfVmVyc2lvbnNdID0gd3JpdGVfdmVyc2lvbnMsCkBAIC0xNzYsMTAgKzE3NSwyNCBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qCiAgKiBwYXlsb2FkIC0gd3JpdGUgbWV0aG9kcwotICogSWYgdGhlIG1ldGhvZCBoYXMgYSByZXNwb25zZSwgdGhlIHJlc3BvbnNlIHNob3VsZCBiZSBwdXQgaW4gYnVmLAotICogYW5kIHRoZSBsZW5ndGggcmV0dXJuZWQuICBPdGhlcndpc2UgcmV0dXJuIDAgb3IgYW5kIC1lcnJvci4KICAqLwogCisvKioKKyAqIHdyaXRlX3N2YyAtIFN0YXJ0IGtlcm5lbCdzIE5GU0Qgc2VydmVyCisgKgorICogRGVwcmVjYXRlZC4gIC9wcm9jL2ZzL25mc2QvdGhyZWFkcyBpcyBwcmVmZXJyZWQuCisgKiBGdW5jdGlvbiByZW1haW5zIHRvIHN1cHBvcnQgb2xkIHZlcnNpb25zIG9mIG5mcy11dGlscy4KKyAqCisgKiBJbnB1dDoKKyAqCQkJYnVmOglzdHJ1Y3QgbmZzY3RsX3N2YworICoJCQkJc3ZjX3BvcnQ6CXBvcnQgbnVtYmVyIG9mIHRoaXMKKyAqCQkJCQkJc2VydmVyJ3MgbGlzdGVuZXIKKyAqCQkJCXN2Y19udGhyZWFkczoJbnVtYmVyIG9mIHRocmVhZHMgdG8gc3RhcnQKKyAqCQkJc2l6ZToJc2l6ZSBpbiBieXRlcyBvZiBwYXNzZWQgaW4gbmZzY3RsX3N2YworICogT3V0cHV0OgorICoJT24gc3VjY2VzczoJcmV0dXJucyB6ZXJvCisgKglPbiBlcnJvcjoJcmV0dXJuIGNvZGUgaXMgbmVnYXRpdmUgZXJybm8gdmFsdWUKKyAqLwogc3RhdGljIHNzaXplX3Qgd3JpdGVfc3ZjKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQogewogCXN0cnVjdCBuZnNjdGxfc3ZjICpkYXRhOwpAQCAtMTg5LDYgKzIwMiwzMCBAQAogCXJldHVybiBuZnNkX3N2YyhkYXRhLT5zdmNfcG9ydCwgZGF0YS0+c3ZjX250aHJlYWRzKTsKIH0KIAorLyoqCisgKiB3cml0ZV9hZGQgLSBBZGQgb3IgbW9kaWZ5IGNsaWVudCBlbnRyeSBpbiBhdXRoIHVuaXggY2FjaGUKKyAqCisgKiBEZXByZWNhdGVkLiAgL3Byb2MvbmV0L3JwYy9hdXRoLnVuaXguaXAgaXMgcHJlZmVycmVkLgorICogRnVuY3Rpb24gcmVtYWlucyB0byBzdXBwb3J0IG9sZCB2ZXJzaW9ucyBvZiBuZnMtdXRpbHMuCisgKgorICogSW5wdXQ6CisgKgkJCWJ1ZjoJc3RydWN0IG5mc2N0bF9jbGllbnQKKyAqCQkJCWNsX2lkZW50OgknXDAnLXRlcm1pbmF0ZWQgQyBzdHJpbmcKKyAqCQkJCQkJY29udGFpbmluZyBkb21haW4gbmFtZQorICoJCQkJCQlvZiBjbGllbnQKKyAqCQkJCWNsX25hZGRyOgluby4gb2YgaXRlbXMgaW4gY2xfYWRkcmxpc3QKKyAqCQkJCWNsX2FkZHJsaXN0OglhcnJheSBvZiBjbGllbnQgYWRkcmVzc2VzCisgKgkJCQljbF9maGtleXR5cGU6CWlnbm9yZWQKKyAqCQkJCWNsX2Zoa2V5bGVuOglpZ25vcmVkCisgKgkJCQljbF9maGtleToJaWdub3JlZAorICoJCQlzaXplOglzaXplIGluIGJ5dGVzIG9mIHBhc3NlZCBpbiBuZnNjdGxfY2xpZW50CisgKiBPdXRwdXQ6CisgKglPbiBzdWNjZXNzOglyZXR1cm5zIHplcm8KKyAqCU9uIGVycm9yOglyZXR1cm4gY29kZSBpcyBuZWdhdGl2ZSBlcnJubyB2YWx1ZQorICoKKyAqIE5vdGU6IE9ubHkgQUZfSU5FVCBjbGllbnQgYWRkcmVzc2VzIGFyZSBwYXNzZWQgaW4sIHNpbmNlCisgKiBuZnNjdGxfY2xpZW50LmNsX2FkZHJsaXN0IGNvbnRhaW5zIG9ubHkgaW5fYWRkciBmaWVsZHMgZm9yIGFkZHJlc3Nlcy4KKyAqLwogc3RhdGljIHNzaXplX3Qgd3JpdGVfYWRkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQogewogCXN0cnVjdCBuZnNjdGxfY2xpZW50ICpkYXRhOwpAQCAtMTk4LDYgKzIzNSwzMCBAQAogCXJldHVybiBleHBfYWRkY2xpZW50KGRhdGEpOwogfQogCisvKioKKyAqIHdyaXRlX2RlbCAtIFJlbW92ZSBjbGllbnQgZnJvbSBhdXRoIHVuaXggY2FjaGUKKyAqCisgKiBEZXByZWNhdGVkLiAgL3Byb2MvbmV0L3JwYy9hdXRoLnVuaXguaXAgaXMgcHJlZmVycmVkLgorICogRnVuY3Rpb24gcmVtYWlucyB0byBzdXBwb3J0IG9sZCB2ZXJzaW9ucyBvZiBuZnMtdXRpbHMuCisgKgorICogSW5wdXQ6CisgKgkJCWJ1ZjoJc3RydWN0IG5mc2N0bF9jbGllbnQKKyAqCQkJCWNsX2lkZW50OgknXDAnLXRlcm1pbmF0ZWQgQyBzdHJpbmcKKyAqCQkJCQkJY29udGFpbmluZyBkb21haW4gbmFtZQorICoJCQkJCQlvZiBjbGllbnQKKyAqCQkJCWNsX25hZGRyOglpZ25vcmVkCisgKgkJCQljbF9hZGRybGlzdDoJaWdub3JlZAorICoJCQkJY2xfZmhrZXl0eXBlOglpZ25vcmVkCisgKgkJCQljbF9maGtleWxlbjoJaWdub3JlZAorICoJCQkJY2xfZmhrZXk6CWlnbm9yZWQKKyAqCQkJc2l6ZToJc2l6ZSBpbiBieXRlcyBvZiBwYXNzZWQgaW4gbmZzY3RsX2NsaWVudAorICogT3V0cHV0OgorICoJT24gc3VjY2VzczoJcmV0dXJucyB6ZXJvCisgKglPbiBlcnJvcjoJcmV0dXJuIGNvZGUgaXMgbmVnYXRpdmUgZXJybm8gdmFsdWUKKyAqCisgKiBOb3RlOiBPbmx5IEFGX0lORVQgY2xpZW50IGFkZHJlc3NlcyBhcmUgcGFzc2VkIGluLCBzaW5jZQorICogbmZzY3RsX2NsaWVudC5jbF9hZGRybGlzdCBjb250YWlucyBvbmx5IGluX2FkZHIgZmllbGRzIGZvciBhZGRyZXNzZXMuCisgKi8KIHN0YXRpYyBzc2l6ZV90IHdyaXRlX2RlbChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKIAlzdHJ1Y3QgbmZzY3RsX2NsaWVudCAqZGF0YTsKQEAgLTIwNyw2ICsyNjgsMzMgQEAKIAlyZXR1cm4gZXhwX2RlbGNsaWVudChkYXRhKTsKIH0KIAorLyoqCisgKiB3cml0ZV9leHBvcnQgLSBFeHBvcnQgcGFydCBvciBhbGwgb2YgYSBsb2NhbCBmaWxlIHN5c3RlbQorICoKKyAqIERlcHJlY2F0ZWQuICAvcHJvYy9uZXQvcnBjL3tuZnNkLmV4cG9ydCxuZnNkLmZofSBhcmUgcHJlZmVycmVkLgorICogRnVuY3Rpb24gcmVtYWlucyB0byBzdXBwb3J0IG9sZCB2ZXJzaW9ucyBvZiBuZnMtdXRpbHMuCisgKgorICogSW5wdXQ6CisgKgkJCWJ1ZjoJc3RydWN0IG5mc2N0bF9leHBvcnQKKyAqCQkJCWV4X2NsaWVudDoJJ1wwJy10ZXJtaW5hdGVkIEMgc3RyaW5nCisgKgkJCQkJCWNvbnRhaW5pbmcgZG9tYWluIG5hbWUKKyAqCQkJCQkJb2YgY2xpZW50IGFsbG93ZWQgdG8gYWNjZXNzCisgKgkJCQkJCXRoaXMgZXhwb3J0CisgKgkJCQlleF9wYXRoOgknXDAnLXRlcm1pbmF0ZWQgQyBzdHJpbmcKKyAqCQkJCQkJY29udGFpbmluZyBwYXRobmFtZSBvZgorICoJCQkJCQlkaXJlY3RvcnkgaW4gbG9jYWwgZmlsZSBzeXN0ZW0KKyAqCQkJCWV4X2RldjoJCWZzaWQgdG8gdXNlIGZvciB0aGlzIGV4cG9ydAorICoJCQkJZXhfaW5vOgkJaWdub3JlZAorICoJCQkJZXhfZmxhZ3M6CWV4cG9ydCBmbGFncyBmb3IgdGhpcyBleHBvcnQKKyAqCQkJCWV4X2Fub25fdWlkOglVSUQgdG8gdXNlIGZvciBhbm9ueW1vdXMKKyAqCQkJCQkJcmVxdWVzdHMKKyAqCQkJCWV4X2Fub25fZ2lkOglHSUQgdG8gdXNlIGZvciBhbm9ueW1vdXMKKyAqCQkJCQkJcmVxdWVzdHMKKyAqCQkJc2l6ZToJc2l6ZSBpbiBieXRlcyBvZiBwYXNzZWQgaW4gbmZzY3RsX2V4cG9ydAorICogT3V0cHV0OgorICoJT24gc3VjY2VzczoJcmV0dXJucyB6ZXJvCisgKglPbiBlcnJvcjoJcmV0dXJuIGNvZGUgaXMgbmVnYXRpdmUgZXJybm8gdmFsdWUKKyAqLwogc3RhdGljIHNzaXplX3Qgd3JpdGVfZXhwb3J0KHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQogewogCXN0cnVjdCBuZnNjdGxfZXhwb3J0ICpkYXRhOwpAQCAtMjE2LDYgKzMwNCwzMSBAQAogCXJldHVybiBleHBfZXhwb3J0KGRhdGEpOwogfQogCisvKioKKyAqIHdyaXRlX3VuZXhwb3J0IC0gVW5leHBvcnQgYSBwcmV2aW91c2x5IGV4cG9ydGVkIGZpbGUgc3lzdGVtCisgKgorICogRGVwcmVjYXRlZC4gIC9wcm9jL25ldC9ycGMve25mc2QuZXhwb3J0LG5mc2QuZmh9IGFyZSBwcmVmZXJyZWQuCisgKiBGdW5jdGlvbiByZW1haW5zIHRvIHN1cHBvcnQgb2xkIHZlcnNpb25zIG9mIG5mcy11dGlscy4KKyAqCisgKiBJbnB1dDoKKyAqCQkJYnVmOglzdHJ1Y3QgbmZzY3RsX2V4cG9ydAorICoJCQkJZXhfY2xpZW50OgknXDAnLXRlcm1pbmF0ZWQgQyBzdHJpbmcKKyAqCQkJCQkJY29udGFpbmluZyBkb21haW4gbmFtZQorICoJCQkJCQlvZiBjbGllbnQgbm8gbG9uZ2VyIGFsbG93ZWQKKyAqCQkJCQkJdG8gYWNjZXNzIHRoaXMgZXhwb3J0CisgKgkJCQlleF9wYXRoOgknXDAnLXRlcm1pbmF0ZWQgQyBzdHJpbmcKKyAqCQkJCQkJY29udGFpbmluZyBwYXRobmFtZSBvZgorICoJCQkJCQlkaXJlY3RvcnkgaW4gbG9jYWwgZmlsZSBzeXN0ZW0KKyAqCQkJCWV4X2RldjoJCWlnbm9yZWQKKyAqCQkJCWV4X2lubzoJCWlnbm9yZWQKKyAqCQkJCWV4X2ZsYWdzOglpZ25vcmVkCisgKgkJCQlleF9hbm9uX3VpZDoJaWdub3JlZAorICoJCQkJZXhfYW5vbl9naWQ6CWlnbm9yZWQKKyAqCQkJc2l6ZToJc2l6ZSBpbiBieXRlcyBvZiBwYXNzZWQgaW4gbmZzY3RsX2V4cG9ydAorICogT3V0cHV0OgorICoJT24gc3VjY2VzczoJcmV0dXJucyB6ZXJvCisgKglPbiBlcnJvcjoJcmV0dXJuIGNvZGUgaXMgbmVnYXRpdmUgZXJybm8gdmFsdWUKKyAqLwogc3RhdGljIHNzaXplX3Qgd3JpdGVfdW5leHBvcnQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7CiAJc3RydWN0IG5mc2N0bF9leHBvcnQgKmRhdGE7CkBAIC0yMjYsNiArMzM5LDMwIEBACiAJcmV0dXJuIGV4cF91bmV4cG9ydChkYXRhKTsKIH0KIAorLyoqCisgKiB3cml0ZV9nZXRmcyAtIEdldCBhIHZhcmlhYmxlLWxlbmd0aCBORlMgZmlsZSBoYW5kbGUgYnkgcGF0aAorICoKKyAqIERlcHJlY2F0ZWQuICAvcHJvYy9mcy9uZnNkL2ZpbGVoYW5kbGUgaXMgcHJlZmVycmVkLgorICogRnVuY3Rpb24gcmVtYWlucyB0byBzdXBwb3J0IG9sZCB2ZXJzaW9ucyBvZiBuZnMtdXRpbHMuCisgKgorICogSW5wdXQ6CisgKgkJCWJ1ZjoJc3RydWN0IG5mc2N0bF9mc3Bhcm0KKyAqCQkJCWdkX2FkZHI6CXNvY2tldCBhZGRyZXNzIG9mIGNsaWVudAorICoJCQkJZ2RfcGF0aDoJJ1wwJy10ZXJtaW5hdGVkIEMgc3RyaW5nCisgKgkJCQkJCWNvbnRhaW5pbmcgcGF0aG5hbWUgb2YKKyAqCQkJCQkJZGlyZWN0b3J5IGluIGxvY2FsIGZpbGUgc3lzdGVtCisgKgkJCQlnZF9tYXhsZW46CW1heGltdW0gc2l6ZSBvZiByZXR1cm5lZCBmaWxlCisgKgkJCQkJCWhhbmRsZQorICoJCQlzaXplOglzaXplIGluIGJ5dGVzIG9mIHBhc3NlZCBpbiBuZnNjdGxfZnNwYXJtCisgKiBPdXRwdXQ6CisgKglPbiBzdWNjZXNzOglwYXNzZWQtaW4gYnVmZmVyIGZpbGxlZCB3aXRoIGEga25mc2RfZmggc3RydWN0dXJlCisgKgkJCShhIHZhcmlhYmxlLWxlbmd0aCByYXcgTkZTIGZpbGUgaGFuZGxlKTsKKyAqCQkJcmV0dXJuIGNvZGUgaXMgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGZpbGUgaGFuZGxlCisgKglPbiBlcnJvcjoJcmV0dXJuIGNvZGUgaXMgbmVnYXRpdmUgZXJybm8gdmFsdWUKKyAqCisgKiBOb3RlOiBPbmx5IEFGX0lORVQgY2xpZW50IGFkZHJlc3NlcyBhcmUgcGFzc2VkIGluLCBzaW5jZSBnZF9hZGRyCisgKiBpcyB0aGUgc2FtZSBzaXplIGFzIGEgc3RydWN0IHNvY2thZGRyX2luLgorICovCiBzdGF0aWMgc3NpemVfdCB3cml0ZV9nZXRmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKIAlzdHJ1Y3QgbmZzY3RsX2ZzcGFybSAqZGF0YTsKQEAgLTI2NSw2ICs0MDIsMjkgQEAKIAlyZXR1cm4gZXJyOwogfQogCisvKioKKyAqIHdyaXRlX2dldGZkIC0gR2V0IGEgZml4ZWQtbGVuZ3RoIE5GUyBmaWxlIGhhbmRsZSBieSBwYXRoICh1c2VkIGJ5IG1vdW50ZCkKKyAqCisgKiBEZXByZWNhdGVkLiAgL3Byb2MvZnMvbmZzZC9maWxlaGFuZGxlIGlzIHByZWZlcnJlZC4KKyAqIEZ1bmN0aW9uIHJlbWFpbnMgdG8gc3VwcG9ydCBvbGQgdmVyc2lvbnMgb2YgbmZzLXV0aWxzLgorICoKKyAqIElucHV0OgorICoJCQlidWY6CXN0cnVjdCBuZnNjdGxfZmRwYXJtCisgKgkJCQlnZF9hZGRyOglzb2NrZXQgYWRkcmVzcyBvZiBjbGllbnQKKyAqCQkJCWdkX3BhdGg6CSdcMCctdGVybWluYXRlZCBDIHN0cmluZworICoJCQkJCQljb250YWluaW5nIHBhdGhuYW1lIG9mCisgKgkJCQkJCWRpcmVjdG9yeSBpbiBsb2NhbCBmaWxlIHN5c3RlbQorICoJCQkJZ2RfdmVyc2lvbjoJZmRwYXJtIHN0cnVjdHVyZSB2ZXJzaW9uCisgKgkJCXNpemU6CXNpemUgaW4gYnl0ZXMgb2YgcGFzc2VkIGluIG5mc2N0bF9mZHBhcm0KKyAqIE91dHB1dDoKKyAqCU9uIHN1Y2Nlc3M6CXBhc3NlZC1pbiBidWZmZXIgZmlsbGVkIHdpdGggbmZzY3RsX3JlcworICoJCQkoYSBmaXhlZC1sZW5ndGggcmF3IE5GUyBmaWxlIGhhbmRsZSk7CisgKgkJCXJldHVybiBjb2RlIGlzIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBmaWxlIGhhbmRsZQorICoJT24gZXJyb3I6CXJldHVybiBjb2RlIGlzIG5lZ2F0aXZlIGVycm5vIHZhbHVlCisgKgorICogTm90ZTogT25seSBBRl9JTkVUIGNsaWVudCBhZGRyZXNzZXMgYXJlIHBhc3NlZCBpbiwgc2luY2UgZ2RfYWRkcgorICogaXMgdGhlIHNhbWUgc2l6ZSBhcyBhIHN0cnVjdCBzb2NrYWRkcl9pbi4KKyAqLwogc3RhdGljIHNzaXplX3Qgd3JpdGVfZ2V0ZmQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7CiAJc3RydWN0IG5mc2N0bF9mZHBhcm0gKmRhdGE7CkBAIC0zMDksNyArNDY5LDIzIEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHNzaXplX3QgZmFpbG92ZXJfdW5sb2NrX2lwKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQorLyoqCisgKiB3cml0ZV91bmxvY2tfaXAgLSBSZWxlYXNlIGFsbCBsb2NrcyB1c2VkIGJ5IGEgY2xpZW50CisgKgorICogRXhwZXJpbWVudGFsLgorICoKKyAqIElucHV0OgorICoJCQlidWY6CSdcbictdGVybWluYXRlZCBDIHN0cmluZyBjb250YWluaW5nIGEKKyAqCQkJCXByZXNlbnRhdGlvbiBmb3JtYXQgSVB2NCBhZGRyZXNzCisgKgkJCXNpemU6CWxlbmd0aCBvZiBDIHN0cmluZyBpbiBAYnVmCisgKiBPdXRwdXQ6CisgKglPbiBzdWNjZXNzOglyZXR1cm5zIHplcm8gaWYgYWxsIHNwZWNpZmllZCBsb2NrcyB3ZXJlIHJlbGVhc2VkOworICoJCQlyZXR1cm5zIG9uZSBpZiBvbmUgb3IgbW9yZSBsb2NrcyB3ZXJlIG5vdCByZWxlYXNlZAorICoJT24gZXJyb3I6CXJldHVybiBjb2RlIGlzIG5lZ2F0aXZlIGVycm5vIHZhbHVlCisgKgorICogTm90ZTogT25seSBBRl9JTkVUIGNsaWVudCBhZGRyZXNzZXMgYXJlIHBhc3NlZCBpbgorICovCitzdGF0aWMgc3NpemVfdCB3cml0ZV91bmxvY2tfaXAoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7CiAJc3RydWN0IHNvY2thZGRyX2luIHNpbiA9IHsKIAkJLnNpbl9mYW1pbHkJPSBBRl9JTkVULApAQCAtMzM5LDcgKzUxNSwyMSBAQAogCXJldHVybiBubG1zdmNfdW5sb2NrX2FsbF9ieV9pcCgoc3RydWN0IHNvY2thZGRyICopJnNpbik7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGZhaWxvdmVyX3VubG9ja19mcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKKy8qKgorICogd3JpdGVfdW5sb2NrX2ZzIC0gUmVsZWFzZSBhbGwgbG9ja3Mgb24gYSBsb2NhbCBmaWxlIHN5c3RlbQorICoKKyAqIEV4cGVyaW1lbnRhbC4KKyAqCisgKiBJbnB1dDoKKyAqCQkJYnVmOgknXG4nLXRlcm1pbmF0ZWQgQyBzdHJpbmcgY29udGFpbmluZyB0aGUKKyAqCQkJCWFic29sdXRlIHBhdGhuYW1lIG9mIGEgbG9jYWwgZmlsZSBzeXN0ZW0KKyAqCQkJc2l6ZToJbGVuZ3RoIG9mIEMgc3RyaW5nIGluIEBidWYKKyAqIE91dHB1dDoKKyAqCU9uIHN1Y2Nlc3M6CXJldHVybnMgemVybyBpZiBhbGwgc3BlY2lmaWVkIGxvY2tzIHdlcmUgcmVsZWFzZWQ7CisgKgkJCXJldHVybnMgb25lIGlmIG9uZSBvciBtb3JlIGxvY2tzIHdlcmUgbm90IHJlbGVhc2VkCisgKglPbiBlcnJvcjoJcmV0dXJuIGNvZGUgaXMgbmVnYXRpdmUgZXJybm8gdmFsdWUKKyAqLworc3RhdGljIHNzaXplX3Qgd3JpdGVfdW5sb2NrX2ZzKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQogewogCXN0cnVjdCBwYXRoIHBhdGg7CiAJY2hhciAqZm9fcGF0aDsKQEAgLTM2MCwyMSArNTUwLDQ0IEBACiAJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7CiAKKwkvKgorCSAqIFhYWDogTmVlZHMgYmV0dGVyIHNhbml0eSBjaGVja2luZy4gIE90aGVyd2lzZSB3ZSBjb3VsZCBlbmQgdXAKKwkgKiByZWxlYXNpbmcgbG9ja3Mgb24gdGhlIHdyb25nIGZpbGUgc3lzdGVtLgorCSAqCisJICogRm9yIGV4YW1wbGU6CisJICogMS4gIERvZXMgdGhlIHBhdGggcmVmZXIgdG8gYSBkaXJlY3Rvcnk/CisJICogMi4gIElzIHRoYXQgZGlyZWN0b3J5IGEgbW91bnQgcG9pbnQsIG9yCisJICogMy4gIElzIHRoYXQgZGlyZWN0b3J5IHRoZSByb290IG9mIGFuIGV4cG9ydGVkIGZpbGUgc3lzdGVtPworCSAqLwogCWVycm9yID0gbmxtc3ZjX3VubG9ja19hbGxfYnlfc2IocGF0aC5tbnQtPm1udF9zYik7CiAKIAlwYXRoX3B1dCgmcGF0aCk7CiAJcmV0dXJuIGVycm9yOwogfQogCisvKioKKyAqIHdyaXRlX2ZpbGVoYW5kbGUgLSBHZXQgYSB2YXJpYWJsZS1sZW5ndGggTkZTIGZpbGUgaGFuZGxlIGJ5IHBhdGgKKyAqCisgKiBPbiBpbnB1dCwgdGhlIGJ1ZmZlciBjb250YWlucyBhICdcbictdGVybWluYXRlZCBDIHN0cmluZyBjb21wcmlzZWQgb2YKKyAqIHRocmVlIGFscGhhbnVtZXJpYyB3b3JkcyBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZS4gIFRoZSBzdHJpbmcgbWF5CisgKiBjb250YWluIGVzY2FwZSBzZXF1ZW5jZXMuCisgKgorICogSW5wdXQ6CisgKgkJCWJ1ZjoKKyAqCQkJCWRvbWFpbjoJCWNsaWVudCBkb21haW4gbmFtZQorICoJCQkJcGF0aDoJCWV4cG9ydCBwYXRobmFtZQorICoJCQkJbWF4c2l6ZToJbnVtZXJpYyBtYXhpbXVtIHNpemUgb2YKKyAqCQkJCQkJQGJ1ZgorICoJCQlzaXplOglsZW5ndGggb2YgQyBzdHJpbmcgaW4gQGJ1ZgorICogT3V0cHV0OgorICoJT24gc3VjY2VzczoJcGFzc2VkLWluIGJ1ZmZlciBmaWxsZWQgd2l0aCAnXG4nLXRlcm1pbmF0ZWQgQworICoJCQlzdHJpbmcgY29udGFpbmluZyBhIEFTQ0lJIGhleCB0ZXh0IHZlcnNpb24KKyAqCQkJb2YgdGhlIE5GUyBmaWxlIGhhbmRsZTsKKyAqCQkJcmV0dXJuIGNvZGUgaXMgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHN0cmluZworICoJT24gZXJyb3I6CXJldHVybiBjb2RlIGlzIG5lZ2F0aXZlIGVycm5vIHZhbHVlCisgKi8KIHN0YXRpYyBzc2l6ZV90IHdyaXRlX2ZpbGVoYW5kbGUoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7Ci0JLyogcmVxdWVzdCBpczoKLQkgKiAgIGRvbWFpbiBwYXRoIG1heHNpemUKLQkgKiByZXNwb25zZSBpcwotCSAqICAgZmlsZWhhbmRsZQotCSAqCi0JICogcXdvcmQgcXVvdGluZyBpcyB1c2VkLCBzbyBmaWxlaGFuZGxlIHdpbGwgYmUgXHguLi4uCi0JICovCiAJY2hhciAqZG5hbWUsICpwYXRoOwogCWludCB1bmluaXRpYWxpemVkX3ZhcihtYXhzaXplKTsKIAljaGFyICptZXNnID0gYnVmOwpAQCAtMzkxLDExICs2MDQsMTMgQEAKIAogCWRuYW1lID0gbWVzZzsKIAlsZW4gPSBxd29yZF9nZXQoJm1lc2csIGRuYW1lLCBzaXplKTsKLQlpZiAobGVuIDw9IDApIHJldHVybiAtRUlOVkFMOworCWlmIChsZW4gPD0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJCiAJcGF0aCA9IGRuYW1lK2xlbisxOwogCWxlbiA9IHF3b3JkX2dldCgmbWVzZywgcGF0aCwgc2l6ZSk7Ci0JaWYgKGxlbiA8PSAwKSByZXR1cm4gLUVJTlZBTDsKKwlpZiAobGVuIDw9IDApCisJCXJldHVybiAtRUlOVkFMOwogCiAJbGVuID0gZ2V0X2ludCgmbWVzZywgJm1heHNpemUpOwogCWlmIChsZW4pCkBAIC00MTksMTcgKzYzNCw0MyBAQAogCWlmIChsZW4pCiAJCXJldHVybiBsZW47CiAJCi0JbWVzZyA9IGJ1ZjsgbGVuID0gU0lNUExFX1RSQU5TQUNUSU9OX0xJTUlUOworCW1lc2cgPSBidWY7CisJbGVuID0gU0lNUExFX1RSQU5TQUNUSU9OX0xJTUlUOwogCXF3b3JkX2FkZGhleCgmbWVzZywgJmxlbiwgKGNoYXIqKSZmaC5maF9iYXNlLCBmaC5maF9zaXplKTsKIAltZXNnWy0xXSA9ICdcbic7CiAJcmV0dXJuIG1lc2cgLSBidWY7CQogfQogCisvKioKKyAqIHdyaXRlX3RocmVhZHMgLSBTdGFydCBORlNELCBvciByZXBvcnQgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHJ1bm5pbmcgdGhyZWFkcworICoKKyAqIElucHV0OgorICoJCQlidWY6CQlpZ25vcmVkCisgKgkJCXNpemU6CQl6ZXJvCisgKiBPdXRwdXQ6CisgKglPbiBzdWNjZXNzOglwYXNzZWQtaW4gYnVmZmVyIGZpbGxlZCB3aXRoICdcbictdGVybWluYXRlZCBDCisgKgkJCXN0cmluZyBudW1lcmljIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgbnVtYmVyIG9mCisgKgkJCXJ1bm5pbmcgTkZTRCB0aHJlYWRzOworICoJCQlyZXR1cm4gY29kZSBpcyB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgc3RyaW5nCisgKglPbiBlcnJvcjoJcmV0dXJuIGNvZGUgaXMgemVybworICoKKyAqIE9SCisgKgorICogSW5wdXQ6CisgKgkJCWJ1ZjoJCUMgc3RyaW5nIGNvbnRhaW5pbmcgYW4gdW5zaWduZWQKKyAqCQkJCQlpbnRlZ2VyIHZhbHVlIHJlcHJlc2VudGluZyB0aGUKKyAqCQkJCQludW1iZXIgb2YgTkZTRCB0aHJlYWRzIHRvIHN0YXJ0CisgKgkJCXNpemU6CQlub24temVybyBsZW5ndGggb2YgQyBzdHJpbmcgaW4gQGJ1ZgorICogT3V0cHV0OgorICoJT24gc3VjY2VzczoJTkZTIHNlcnZpY2UgaXMgc3RhcnRlZDsKKyAqCQkJcGFzc2VkLWluIGJ1ZmZlciBmaWxsZWQgd2l0aCAnXG4nLXRlcm1pbmF0ZWQgQworICoJCQlzdHJpbmcgbnVtZXJpYyB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZgorICoJCQlydW5uaW5nIE5GU0QgdGhyZWFkczsKKyAqCQkJcmV0dXJuIGNvZGUgaXMgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHN0cmluZworICoJT24gZXJyb3I6CXJldHVybiBjb2RlIGlzIHplcm8gb3IgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZQorICovCiBzdGF0aWMgc3NpemVfdCB3cml0ZV90aHJlYWRzKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQogewotCS8qIGlmIHNpemUgPiAwLCBsb29rIGZvciBhIG51bWJlciBvZiB0aHJlYWRzIGFuZCBjYWxsIG5mc2Rfc3ZjCi0JICogdGhlbiB3cml0ZSBvdXQgbnVtYmVyIG9mIHRocmVhZHMgYXMgcmVwbHkKLQkgKi8KIAljaGFyICptZXNnID0gYnVmOwogCWludCBydjsKIAlpZiAoc2l6ZSA+IDApIHsKQEAgLTQzNyw5ICs2NzgsOSBAQAogCQlydiA9IGdldF9pbnQoJm1lc2csICZuZXd0aHJlYWRzKTsKIAkJaWYgKHJ2KQogCQkJcmV0dXJuIHJ2OwotCQlpZiAobmV3dGhyZWFkcyA8MCkKKwkJaWYgKG5ld3RocmVhZHMgPCAwKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXJ2ID0gbmZzZF9zdmMoMjA0OSwgbmV3dGhyZWFkcyk7CisJCXJ2ID0gbmZzZF9zdmMoTkZTX1BPUlQsIG5ld3RocmVhZHMpOwogCQlpZiAocnYpCiAJCQlyZXR1cm4gcnY7CiAJfQpAQCAtNDQ3LDYgKzY4OCwyOCBAQAogCXJldHVybiBzdHJsZW4oYnVmKTsKIH0KIAorLyoqCisgKiB3cml0ZV9wb29sX3RocmVhZHMgLSBTZXQgb3IgcmVwb3J0IHRoZSBjdXJyZW50IG51bWJlciBvZiB0aHJlYWRzIHBlciBwb29sCisgKgorICogSW5wdXQ6CisgKgkJCWJ1ZjoJCWlnbm9yZWQKKyAqCQkJc2l6ZToJCXplcm8KKyAqCisgKiBPUgorICoKKyAqIElucHV0OgorICogCQkJYnVmOgkJQyBzdHJpbmcgY29udGFpbmluZyB3aGl0ZXNwYWNlLQorICogCQkJCQlzZXBhcmF0ZWQgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMKKyAqCQkJCQlyZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZiBORlNECisgKgkJCQkJdGhyZWFkcyB0byBzdGFydCBpbiBlYWNoIHBvb2wKKyAqCQkJc2l6ZToJCW5vbi16ZXJvIGxlbmd0aCBvZiBDIHN0cmluZyBpbiBAYnVmCisgKiBPdXRwdXQ6CisgKglPbiBzdWNjZXNzOglwYXNzZWQtaW4gYnVmZmVyIGZpbGxlZCB3aXRoICdcbictdGVybWluYXRlZCBDCisgKgkJCXN0cmluZyBjb250YWluaW5nIGludGVnZXIgdmFsdWVzIHJlcHJlc2VudGluZyB0aGUKKyAqCQkJbnVtYmVyIG9mIE5GU0QgdGhyZWFkcyBpbiBlYWNoIHBvb2w7CisgKgkJCXJldHVybiBjb2RlIGlzIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBzdHJpbmcKKyAqCU9uIGVycm9yOglyZXR1cm4gY29kZSBpcyB6ZXJvIG9yIGEgbmVnYXRpdmUgZXJybm8gdmFsdWUKKyAqLwogc3RhdGljIHNzaXplX3Qgd3JpdGVfcG9vbF90aHJlYWRzKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQogewogCS8qIGlmIHNpemUgPiAwLCBsb29rIGZvciBhbiBhcnJheSBvZiBudW1iZXIgb2YgdGhyZWFkcyBwZXIgbm9kZQpAQCAtNTE3LDEwICs3ODAsNiBAQAogCiBzdGF0aWMgc3NpemVfdCBfX3dyaXRlX3ZlcnNpb25zKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQogewotCS8qCi0JICogRm9ybWF0OgotCSAqICAgWy0vK112ZXJzIFstLytddmVycyAuLi4KLQkgKi8KIAljaGFyICptZXNnID0gYnVmOwogCWNoYXIgKnZlcnMsIHNpZ247CiAJaW50IGxlbiwgbnVtOwpAQCAtNTc4LDYgKzgzNywzOCBAQAogCXJldHVybiBsZW47CiB9CiAKKy8qKgorICogd3JpdGVfdmVyc2lvbnMgLSBTZXQgb3IgcmVwb3J0IHRoZSBhdmFpbGFibGUgTkZTIHByb3RvY29sIHZlcnNpb25zCisgKgorICogSW5wdXQ6CisgKgkJCWJ1ZjoJCWlnbm9yZWQKKyAqCQkJc2l6ZToJCXplcm8KKyAqIE91dHB1dDoKKyAqCU9uIHN1Y2Nlc3M6CXBhc3NlZC1pbiBidWZmZXIgZmlsbGVkIHdpdGggJ1xuJy10ZXJtaW5hdGVkIEMKKyAqCQkJc3RyaW5nIGNvbnRhaW5pbmcgcG9zaXRpdmUgb3IgbmVnYXRpdmUgaW50ZWdlcgorICoJCQl2YWx1ZXMgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHN0YXR1cyBvZiBlYWNoCisgKgkJCXByb3RvY29sIHZlcnNpb247CisgKgkJCXJldHVybiBjb2RlIGlzIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBzdHJpbmcKKyAqCU9uIGVycm9yOglyZXR1cm4gY29kZSBpcyB6ZXJvIG9yIGEgbmVnYXRpdmUgZXJybm8gdmFsdWUKKyAqCisgKiBPUgorICoKKyAqIElucHV0OgorICogCQkJYnVmOgkJQyBzdHJpbmcgY29udGFpbmluZyB3aGl0ZXNwYWNlLQorICogCQkJCQlzZXBhcmF0ZWQgcG9zaXRpdmUgb3IgbmVnYXRpdmUKKyAqIAkJCQkJaW50ZWdlciB2YWx1ZXMgcmVwcmVzZW50aW5nIE5GUworICogCQkJCQlwcm90b2NvbCB2ZXJzaW9ucyB0byBlbmFibGUgKCIrbiIpCisgKiAJCQkJCW9yIGRpc2FibGUgKCItbiIpCisgKgkJCXNpemU6CQlub24temVybyBsZW5ndGggb2YgQyBzdHJpbmcgaW4gQGJ1ZgorICogT3V0cHV0OgorICoJT24gc3VjY2VzczoJc3RhdHVzIG9mIHplcm8gb3IgbW9yZSBwcm90b2NvbCB2ZXJzaW9ucyBoYXMKKyAqCQkJYmVlbiB1cGRhdGVkOyBwYXNzZWQtaW4gYnVmZmVyIGZpbGxlZCB3aXRoCisgKgkJCSdcbictdGVybWluYXRlZCBDIHN0cmluZyBjb250YWluaW5nIHBvc2l0aXZlCisgKgkJCW9yIG5lZ2F0aXZlIGludGVnZXIgdmFsdWVzIHJlcHJlc2VudGluZyB0aGUKKyAqCQkJY3VycmVudCBzdGF0dXMgb2YgZWFjaCBwcm90b2NvbCB2ZXJzaW9uOworICoJCQlyZXR1cm4gY29kZSBpcyB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgc3RyaW5nCisgKglPbiBlcnJvcjoJcmV0dXJuIGNvZGUgaXMgemVybyBvciBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlCisgKi8KIHN0YXRpYyBzc2l6ZV90IHdyaXRlX3ZlcnNpb25zKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQogewogCXNzaXplX3QgcnY7CkBAIC02ODcsNiArOTc4LDc1IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKKy8qKgorICogd3JpdGVfcG9ydHMgLSBQYXNzIGEgc29ja2V0IGZpbGUgZGVzY3JpcHRvciBvciB0cmFuc3BvcnQgbmFtZSB0byBsaXN0ZW4gb24KKyAqCisgKiBJbnB1dDoKKyAqCQkJYnVmOgkJaWdub3JlZAorICoJCQlzaXplOgkJemVybworICogT3V0cHV0OgorICoJT24gc3VjY2VzczoJcGFzc2VkLWluIGJ1ZmZlciBmaWxsZWQgd2l0aCBhICdcbictdGVybWluYXRlZCBDCisgKgkJCXN0cmluZyBjb250YWluaW5nIGEgd2hpdGVzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZgorICoJCQluYW1lZCBORlNEIGxpc3RlbmVyczsKKyAqCQkJcmV0dXJuIGNvZGUgaXMgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHN0cmluZworICoJT24gZXJyb3I6CXJldHVybiBjb2RlIGlzIHplcm8gb3IgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZQorICoKKyAqIE9SCisgKgorICogSW5wdXQ6CisgKgkJCWJ1ZjoJCUMgc3RyaW5nIGNvbnRhaW5pbmcgYW4gdW5zaWduZWQKKyAqCQkJCQlpbnRlZ2VyIHZhbHVlIHJlcHJlc2VudGluZyBhIGJvdW5kCisgKgkJCQkJYnV0IHVuY29ubmVjdGVkIHNvY2tldCB0aGF0IGlzIHRvIGJlCisgKgkJCQkJdXNlZCBhcyBhbiBORlNEIGxpc3RlbmVyCisgKgkJCXNpemU6CQlub24temVybyBsZW5ndGggb2YgQyBzdHJpbmcgaW4gQGJ1ZgorICogT3V0cHV0OgorICoJT24gc3VjY2VzczoJTkZTIHNlcnZpY2UgaXMgc3RhcnRlZDsKKyAqCQkJcGFzc2VkLWluIGJ1ZmZlciBmaWxsZWQgd2l0aCBhICdcbictdGVybWluYXRlZCBDCisgKgkJCXN0cmluZyBjb250YWluaW5nIGEgdW5pcXVlIGFscGhhbnVtZXJpYyBuYW1lIG9mCisgKgkJCXRoZSBsaXN0ZW5lcjsKKyAqCQkJcmV0dXJuIGNvZGUgaXMgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHN0cmluZworICoJT24gZXJyb3I6CXJldHVybiBjb2RlIGlzIGEgbmVnYXRpdmUgZXJybm8gdmFsdWUKKyAqCisgKiBPUgorICoKKyAqIElucHV0OgorICoJCQlidWY6CQlDIHN0cmluZyBjb250YWluaW5nIGEgIi0iIGZvbGxvd2VkCisgKgkJCQkJYnkgYW4gaW50ZWdlciB2YWx1ZSByZXByZXNlbnRpbmcgYQorICoJCQkJCXByZXZpb3VzbHkgcGFzc2VkIGluIHNvY2tldCBmaWxlCisgKgkJCQkJZGVzY3JpcHRvcgorICoJCQlzaXplOgkJbm9uLXplcm8gbGVuZ3RoIG9mIEMgc3RyaW5nIGluIEBidWYKKyAqIE91dHB1dDoKKyAqCU9uIHN1Y2Nlc3M6CU5GUyBzZXJ2aWNlIG5vIGxvbmdlciBsaXN0ZW5zIG9uIHRoYXQgc29ja2V0OworICoJCQlwYXNzZWQtaW4gYnVmZmVyIGZpbGxlZCB3aXRoIGEgJ1xuJy10ZXJtaW5hdGVkIEMKKyAqCQkJc3RyaW5nIGNvbnRhaW5pbmcgYSB1bmlxdWUgbmFtZSBvZiB0aGUgbGlzdGVuZXI7CisgKgkJCXJldHVybiBjb2RlIGlzIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBzdHJpbmcKKyAqCU9uIGVycm9yOglyZXR1cm4gY29kZSBpcyBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlCisgKgorICogT1IKKyAqCisgKiBJbnB1dDoKKyAqCQkJYnVmOgkJQyBzdHJpbmcgY29udGFpbmluZyBhIHRyYW5zcG9ydAorICoJCQkJCW5hbWUgYW5kIGFuIHVuc2lnbmVkIGludGVnZXIgdmFsdWUKKyAqCQkJCQlyZXByZXNlbnRpbmcgdGhlIHBvcnQgdG8gbGlzdGVuIG9uLAorICoJCQkJCXNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlCisgKgkJCXNpemU6CQlub24temVybyBsZW5ndGggb2YgQyBzdHJpbmcgaW4gQGJ1ZgorICogT3V0cHV0OgorICoJT24gc3VjY2VzczoJcmV0dXJucyB6ZXJvOyBORlMgc2VydmljZSBpcyBzdGFydGVkCisgKglPbiBlcnJvcjoJcmV0dXJuIGNvZGUgaXMgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZQorICoKKyAqIE9SCisgKgorICogSW5wdXQ6CisgKgkJCWJ1ZjoJCUMgc3RyaW5nIGNvbnRhaW5pbmcgYSAiLSIgZm9sbG93ZWQKKyAqCQkJCQlieSBhIHRyYW5zcG9ydCBuYW1lIGFuZCBhbiB1bnNpZ25lZAorICoJCQkJCWludGVnZXIgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBwb3J0CisgKgkJCQkJdG8gbGlzdGVuIG9uLCBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZQorICoJCQlzaXplOgkJbm9uLXplcm8gbGVuZ3RoIG9mIEMgc3RyaW5nIGluIEBidWYKKyAqIE91dHB1dDoKKyAqCU9uIHN1Y2Nlc3M6CXJldHVybnMgemVybzsgTkZTIHNlcnZpY2Ugbm8gbG9uZ2VyIGxpc3RlbnMKKyAqCQkJb24gdGhhdCB0cmFuc3BvcnQKKyAqCU9uIGVycm9yOglyZXR1cm4gY29kZSBpcyBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlCisgKi8KIHN0YXRpYyBzc2l6ZV90IHdyaXRlX3BvcnRzKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQogewogCXNzaXplX3QgcnY7CkBAIC03MDAsNiArMTA2MCwyNyBAQAogCiBpbnQgbmZzZF9tYXhfYmxrc2l6ZTsKIAorLyoqCisgKiB3cml0ZV9tYXhibGtzaXplIC0gU2V0IG9yIHJlcG9ydCB0aGUgY3VycmVudCBORlMgYmxrc2l6ZQorICoKKyAqIElucHV0OgorICoJCQlidWY6CQlpZ25vcmVkCisgKgkJCXNpemU6CQl6ZXJvCisgKgorICogT1IKKyAqCisgKiBJbnB1dDoKKyAqIAkJCWJ1ZjoJCUMgc3RyaW5nIGNvbnRhaW5pbmcgYW4gdW5zaWduZWQKKyAqIAkJCQkJaW50ZWdlciB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIG5ldworICogCQkJCQlORlMgYmxrc2l6ZQorICoJCQlzaXplOgkJbm9uLXplcm8gbGVuZ3RoIG9mIEMgc3RyaW5nIGluIEBidWYKKyAqIE91dHB1dDoKKyAqCU9uIHN1Y2Nlc3M6CXBhc3NlZC1pbiBidWZmZXIgZmlsbGVkIHdpdGggJ1xuJy10ZXJtaW5hdGVkIEMgc3RyaW5nCisgKgkJCWNvbnRhaW5pbmcgbnVtZXJpYyB2YWx1ZSBvZiB0aGUgY3VycmVudCBORlMgYmxrc2l6ZQorICoJCQlzZXR0aW5nOworICoJCQlyZXR1cm4gY29kZSBpcyB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgc3RyaW5nCisgKglPbiBlcnJvcjoJcmV0dXJuIGNvZGUgaXMgemVybyBvciBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlCisgKi8KIHN0YXRpYyBzc2l6ZV90IHdyaXRlX21heGJsa3NpemUoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7CiAJY2hhciAqbWVzZyA9IGJ1ZjsKQEAgLTc1Miw2ICsxMTMzLDI3IEBACiAJcmV0dXJuIHN0cmxlbihidWYpOwogfQogCisvKioKKyAqIHdyaXRlX2xlYXNldGltZSAtIFNldCBvciByZXBvcnQgdGhlIGN1cnJlbnQgTkZTdjQgbGVhc2UgdGltZQorICoKKyAqIElucHV0OgorICoJCQlidWY6CQlpZ25vcmVkCisgKgkJCXNpemU6CQl6ZXJvCisgKgorICogT1IKKyAqCisgKiBJbnB1dDoKKyAqCQkJYnVmOgkJQyBzdHJpbmcgY29udGFpbmluZyBhbiB1bnNpZ25lZAorICoJCQkJCWludGVnZXIgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBuZXcKKyAqCQkJCQlORlN2NCBsZWFzZSBleHBpcnkgdGltZQorICoJCQlzaXplOgkJbm9uLXplcm8gbGVuZ3RoIG9mIEMgc3RyaW5nIGluIEBidWYKKyAqIE91dHB1dDoKKyAqCU9uIHN1Y2Nlc3M6CXBhc3NlZC1pbiBidWZmZXIgZmlsbGVkIHdpdGggJ1xuJy10ZXJtaW5hdGVkIEMKKyAqCQkJc3RyaW5nIGNvbnRhaW5pbmcgdW5zaWduZWQgaW50ZWdlciB2YWx1ZSBvZiB0aGUKKyAqCQkJY3VycmVudCBsZWFzZSBleHBpcnkgdGltZTsKKyAqCQkJcmV0dXJuIGNvZGUgaXMgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHN0cmluZworICoJT24gZXJyb3I6CXJldHVybiBjb2RlIGlzIHplcm8gb3IgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZQorICovCiBzdGF0aWMgc3NpemVfdCB3cml0ZV9sZWFzZXRpbWUoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7CiAJc3NpemVfdCBydjsKQEAgLTc4OCw2ICsxMTkwLDI3IEBACiAJcmV0dXJuIHN0cmxlbihidWYpOwogfQogCisvKioKKyAqIHdyaXRlX3JlY292ZXJ5ZGlyIC0gU2V0IG9yIHJlcG9ydCB0aGUgcGF0aG5hbWUgb2YgdGhlIHJlY292ZXJ5IGRpcmVjdG9yeQorICoKKyAqIElucHV0OgorICoJCQlidWY6CQlpZ25vcmVkCisgKgkJCXNpemU6CQl6ZXJvCisgKgorICogT1IKKyAqCisgKiBJbnB1dDoKKyAqCQkJYnVmOgkJQyBzdHJpbmcgY29udGFpbmluZyB0aGUgcGF0aG5hbWUKKyAqCQkJCQlvZiB0aGUgZGlyZWN0b3J5IG9uIGEgbG9jYWwgZmlsZQorICoJCQkJCXN5c3RlbSBjb250YWluaW5nIHBlcm1hbmVudCBORlN2NAorICoJCQkJCXJlY292ZXJ5IGRhdGEKKyAqCQkJc2l6ZToJCW5vbi16ZXJvIGxlbmd0aCBvZiBDIHN0cmluZyBpbiBAYnVmCisgKiBPdXRwdXQ6CisgKglPbiBzdWNjZXNzOglwYXNzZWQtaW4gYnVmZmVyIGZpbGxlZCB3aXRoICdcbictdGVybWluYXRlZCBDIHN0cmluZworICoJCQljb250YWluaW5nIHRoZSBjdXJyZW50IHJlY292ZXJ5IHBhdGhuYW1lIHNldHRpbmc7CisgKgkJCXJldHVybiBjb2RlIGlzIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBzdHJpbmcKKyAqCU9uIGVycm9yOglyZXR1cm4gY29kZSBpcyB6ZXJvIG9yIGEgbmVnYXRpdmUgZXJybm8gdmFsdWUKKyAqLwogc3RhdGljIHNzaXplX3Qgd3JpdGVfcmVjb3ZlcnlkaXIoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7CiAJc3NpemVfdCBydjsKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzZmguYyBiL2ZzL25mc2QvbmZzZmguYwppbmRleCBmMGRhN2Q5Li45ZjFjYTE3IDEwMDY0NAotLS0gYS9mcy9uZnNkL25mc2ZoLmMKKysrIGIvZnMvbmZzZC9uZnNmaC5jCkBAIC0yNTgsMTQgKzI1OCwzMiBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotLyoKLSAqIFBlcmZvcm0gc2FuaXR5IGNoZWNrcyBvbiB0aGUgZGVudHJ5IGluIGEgY2xpZW50J3MgZmlsZSBoYW5kbGUuCisvKioKKyAqIGZoX3ZlcmlmeSAtIGZpbGVoYW5kbGUgbG9va3VwIGFuZCBhY2Nlc3MgY2hlY2tpbmcKKyAqIEBycXN0cDogcG9pbnRlciB0byBjdXJyZW50IHJwYyByZXF1ZXN0CisgKiBAZmhwOiBmaWxlaGFuZGxlIHRvIGJlIHZlcmlmaWVkCisgKiBAdHlwZTogZXhwZWN0ZWQgdHlwZSBvZiBvYmplY3QgcG9pbnRlZCB0byBieSBmaWxlaGFuZGxlCisgKiBAYWNjZXNzOiB0eXBlIG9mIGFjY2VzcyBuZWVkZWQgdG8gb2JqZWN0CiAgKgotICogTm90ZSB0aGF0IHRoZSBmaWxlIGhhbmRsZSBkZW50cnkgbWF5IG5lZWQgdG8gYmUgZnJlZWQgZXZlbiBhZnRlcgotICogYW4gZXJyb3IgcmV0dXJuLgorICogTG9vayB1cCBhIGRlbnRyeSBmcm9tIHRoZSBvbi10aGUtd2lyZSBmaWxlaGFuZGxlLCBjaGVjayB0aGUgY2xpZW50J3MKKyAqIGFjY2VzcyB0byB0aGUgZXhwb3J0LCBhbmQgc2V0IHRoZSBjdXJyZW50IHRhc2sncyBjcmVkZW50aWFscy4KICAqCi0gKiBUaGlzIGlzIG9ubHkgY2FsbGVkIGF0IHRoZSBzdGFydCBvZiBhbiBuZnNwcm9jIGNhbGwsIHNvIGZocCBwb2ludHMgdG8KLSAqIGEgc3ZjX2ZoIHdoaWNoIGlzIGFsbCAwIGV4Y2VwdCBmb3IgdGhlIG92ZXItdGhlLXdpcmUgZmlsZSBoYW5kbGUuCisgKiBSZWdhcmRsZXNzIG9mIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBvZiBmaF92ZXJpZnkoKSwgZmhfcHV0KCkgc2hvdWxkIGJlCisgKiBjYWxsZWQgb24gQGZocCB3aGVuIHRoZSBjYWxsZXIgaXMgZmluaXNoZWQgd2l0aCB0aGUgZmlsZWhhbmRsZS4KKyAqCisgKiBmaF92ZXJpZnkoKSBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIG9uIGEgZ2l2ZW4gZmlsZWhhbmRsZSwgZm9yCisgKiBleGFtcGxlLCB3aGVuIHByb2Nlc3NpbmcgYW4gTkZTdjQgY29tcG91bmQuICBUaGUgZmlyc3QgY2FsbCB3aWxsIGxvb2sKKyAqIHVwIGEgZGVudHJ5IHVzaW5nIHRoZSBvbi10aGUtd2lyZSBmaWxlaGFuZGxlLiAgU3Vic2VxdWVudCBjYWxscyB3aWxsCisgKiBza2lwIHRoZSBsb29rdXAgYW5kIGp1c3QgcGVyZm9ybSB0aGUgb3RoZXIgY2hlY2tzIGFuZCBwb3NzaWJseSBjaGFuZ2UKKyAqIHRoZSBjdXJyZW50IHRhc2sncyBjcmVkZW50aWFscy4KKyAqCisgKiBAdHlwZSBzcGVjaWZpZXMgdGhlIHR5cGUgb2Ygb2JqZWN0IGV4cGVjdGVkIHVzaW5nIG9uZSBvZiB0aGUgU19JRioKKyAqIGNvbnN0YW50cyBkZWZpbmVkIGluIGluY2x1ZGUvbGludXgvc3RhdC5oLiAgVGhlIGNhbGxlciBtYXkgdXNlIHplcm8KKyAqIHRvIGluZGljYXRlIHRoYXQgaXQgZG9lc24ndCBjYXJlLCBvciBhIG5lZ2F0aXZlIGludGVnZXIgdG8gaW5kaWNhdGUKKyAqIHRoYXQgaXQgZXhwZWN0cyBzb21ldGhpbmcgbm90IG9mIHRoZSBnaXZlbiB0eXBlLgorICoKKyAqIEBhY2Nlc3MgaXMgZm9ybWVkIGZyb20gdGhlIE5GU0RfTUFZXyogY29uc3RhbnRzIGRlZmluZWQgaW4KKyAqIGluY2x1ZGUvbGludXgvbmZzZC9uZnNkLmguCiAgKi8KIF9fYmUzMgogZmhfdmVyaWZ5KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmZocCwgaW50IHR5cGUsIGludCBhY2Nlc3MpCkBAIC00NjYsNiArNDg0LDggQEAKIAkJCQlnb3RvIHJldHJ5OwogCQkJYnJlYWs7CiAJCX0KKwl9IGVsc2UgaWYgKGV4cC0+ZXhfZmxhZ3MgJiBORlNFWFBfRlNJRCkgeworCQlmc2lkX3R5cGUgPSBGU0lEX05VTTsKIAl9IGVsc2UgaWYgKGV4cC0+ZXhfdXVpZCkgewogCQlpZiAoZmhwLT5maF9tYXhzaXplID49IDY0KSB7CiAJCQlpZiAocm9vdF9leHBvcnQpCkBAIC00NzgsOSArNDk4LDcgQEAKIAkJCWVsc2UKIAkJCQlmc2lkX3R5cGUgPSBGU0lEX1VVSUQ0X0lOVU07CiAJCX0KLQl9IGVsc2UgaWYgKGV4cC0+ZXhfZmxhZ3MgJiBORlNFWFBfRlNJRCkKLQkJZnNpZF90eXBlID0gRlNJRF9OVU07Ci0JZWxzZSBpZiAoIW9sZF92YWxpZF9kZXYoZXhfZGV2KSkKKwl9IGVsc2UgaWYgKCFvbGRfdmFsaWRfZGV2KGV4X2RldikpCiAJCS8qIGZvciBuZXdlciBkZXZpY2UgbnVtYmVycywgd2UgbXVzdCB1c2UgYSBuZXdlciBmc2lkIGZvcm1hdCAqLwogCQlmc2lkX3R5cGUgPSBGU0lEX0VOQ09ERV9ERVY7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnNwcm9jLmMgYi9mcy9uZnNkL25mc3Byb2MuYwppbmRleCA1Y2ZmZWNhLi42ZjdmMjYzIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mc3Byb2MuYworKysgYi9mcy9uZnNkL25mc3Byb2MuYwpAQCAtNjIyLDYgKzYyMiw3IEBACiAJCXsgbmZzZXJyX2JhZG5hbWUsIC1FU1JDSCB9LAogCQl7IG5mc2Vycl9pbywgLUVUWFRCU1kgfSwKIAkJeyBuZnNlcnJfbm90c3VwcCwgLUVPUE5PVFNVUFAgfSwKKwkJeyBuZnNlcnJfdG9vc21hbGwsIC1FVE9PU01BTEwgfSwKIAl9OwogCWludAlpOwogCmRpZmYgLS1naXQgYS9mcy9uZnNkL3Zmcy5jIGIvZnMvbmZzZC92ZnMuYwppbmRleCBkMWM1Zjc4Li42ZTUwYWFhIDEwMDY0NAotLS0gYS9mcy9uZnNkL3Zmcy5jCisrKyBiL2ZzL25mc2QvdmZzLmMKQEAgLTc2NCw3ICs3NjQsNiBAQAogCiAJcmV0dXJuIGVycjsKIH0KLQkKIAogc3RhdGljIGludAogbmZzZF9zeW5jKHN0cnVjdCBmaWxlICpmaWxwKQpAQCAtMTIxMSw3ICsxMjEwLDcgQEAKIAlkaXJwID0gZGVudHJ5LT5kX2lub2RlOwogCiAJZXJyID0gbmZzZXJyX25vdGRpcjsKLQlpZighZGlycC0+aV9vcCB8fCAhZGlycC0+aV9vcC0+bG9va3VwKQorCWlmICghZGlycC0+aV9vcC0+bG9va3VwKQogCQlnb3RvIG91dDsKIAkvKgogCSAqIENoZWNrIHdoZXRoZXIgdGhlIHJlc3BvbnNlIGZpbGUgaGFuZGxlIGhhcyBiZWVuIHZlcmlmaWVkIHlldC4KQEAgLTEzNDcsNyArMTM0Niw3IEBACiAJLyogR2V0IGFsbCB0aGUgc2FuaXR5IGNoZWNrcyBvdXQgb2YgdGhlIHdheSBiZWZvcmUKIAkgKiB3ZSBsb2NrIHRoZSBwYXJlbnQuICovCiAJZXJyID0gbmZzZXJyX25vdGRpcjsKLQlpZighZGlycC0+aV9vcCB8fCAhZGlycC0+aV9vcC0+bG9va3VwKQorCWlmICghZGlycC0+aV9vcC0+bG9va3VwKQogCQlnb3RvIG91dDsKIAlmaF9sb2NrX25lc3RlZChmaHAsIElfTVVURVhfUEFSRU5UKTsKIApAQCAtMTQ4Miw3ICsxNDgxLDcgQEAKIAlpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKIAogCWVyciA9IG5mc2Vycl9pbnZhbDsKLQlpZiAoIWlub2RlLT5pX29wIHx8ICFpbm9kZS0+aV9vcC0+cmVhZGxpbmspCisJaWYgKCFpbm9kZS0+aV9vcC0+cmVhZGxpbmspCiAJCWdvdG8gb3V0OwogCiAJdG91Y2hfYXRpbWUoZmhwLT5maF9leHBvcnQtPmV4X3BhdGgubW50LCBkZW50cnkpOwpAQCAtMjE2Miw3ICsyMTYxLDcgQEAKIAlzaXplX3Qgc2l6ZTsKIAlpbnQgZXJyb3I7CiAKLQlpZiAoIUlTX1BPU0lYQUNMKGlub2RlKSB8fCAhaW5vZGUtPmlfb3AgfHwKKwlpZiAoIUlTX1BPU0lYQUNMKGlub2RlKSB8fAogCSAgICAhaW5vZGUtPmlfb3AtPnNldHhhdHRyIHx8ICFpbm9kZS0+aV9vcC0+cmVtb3ZleGF0dHIpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAlzd2l0Y2godHlwZSkgewpkaWZmIC0tZ2l0IGEvZnMvbm90aWZ5L2lub3RpZnkvaW5vdGlmeV91c2VyLmMgYi9mcy9ub3RpZnkvaW5vdGlmeS9pbm90aWZ5X3VzZXIuYwppbmRleCA0MDBmODA2Li44MWI4NjQ0IDEwMDY0NAotLS0gYS9mcy9ub3RpZnkvaW5vdGlmeS9pbm90aWZ5X3VzZXIuYworKysgYi9mcy9ub3RpZnkvaW5vdGlmeS9pbm90aWZ5X3VzZXIuYwpAQCAtNzA0LDcgKzcwNCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19pbm90aWZ5X3JtX3dhdGNoKGludCBmZCwgdTMyIHdkKQorYXNtbGlua2FnZSBsb25nIHN5c19pbm90aWZ5X3JtX3dhdGNoKGludCBmZCwgX19zMzIgd2QpCiB7CiAJc3RydWN0IGZpbGUgKmZpbHA7CiAJc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXY7CmRpZmYgLS1naXQgYS9mcy9udGZzL2lub2RlLmMgYi9mcy9udGZzL2lub2RlLmMKaW5kZXggZTlkYTA5Mi4uODZiZWYxNSAxMDA2NDQKLS0tIGEvZnMvbnRmcy9pbm9kZS5jCisrKyBiL2ZzL250ZnMvaW5vZGUuYwpAQCAtMTQwNiw5ICsxNDA2LDYgQEAKIAkJbmktPmFsbG9jYXRlZF9zaXplID0gc2xlNjRfdG9fY3B1KAogCQkJCWEtPmRhdGEubm9uX3Jlc2lkZW50LmFsbG9jYXRlZF9zaXplKTsKIAl9Ci0JLyogU2V0dXAgdGhlIG9wZXJhdGlvbnMgZm9yIHRoaXMgYXR0cmlidXRlIGlub2RlLiAqLwotCXZpLT5pX29wID0gTlVMTDsKLQl2aS0+aV9mb3AgPSBOVUxMOwogCWlmIChOSW5vTXN0UHJvdGVjdGVkKG5pKSkKIAkJdmktPmlfbWFwcGluZy0+YV9vcHMgPSAmbnRmc19tc3RfYW9wczsKIAllbHNlCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9NYWtlZmlsZSBiL2ZzL29jZnMyL01ha2VmaWxlCmluZGV4IDU4OWRjZGYuLjAxNTk2MDcgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL01ha2VmaWxlCisrKyBiL2ZzL29jZnMyL01ha2VmaWxlCkBAIC0xMiw2ICsxMiw3IEBACiBvY2ZzMi1vYmpzIDo9IFwKIAlhbGxvYy5vIAkJXAogCWFvcHMubyAJCQlcCisJYmxvY2tjaGVjay5vCQlcCiAJYnVmZmVyX2hlYWRfaW8ubwlcCiAJZGNhY2hlLm8gCQlcCiAJZGlyLm8gCQkJXApAQCAtMzUsOCArMzYsMTQgQEAKIAlzeXNmaWxlLm8gCQlcCiAJdXB0b2RhdGUubwkJXAogCXZlci5vCQkJXAorCXF1b3RhX2xvY2FsLm8JCVwKKwlxdW90YV9nbG9iYWwubwkJXAogCXhhdHRyLm8KIAoraWZlcSAoJChDT05GSUdfT0NGUzJfRlNfUE9TSVhfQUNMKSx5KQorb2NmczItb2JqcyArPSBhY2wubworZW5kaWYKKwogb2NmczJfc3RhY2tnbHVlLW9ianMgOj0gc3RhY2tnbHVlLm8KIG9jZnMyX3N0YWNrX28yY2Itb2JqcyA6PSBzdGFja19vMmNiLm8KIG9jZnMyX3N0YWNrX3VzZXItb2JqcyA6PSBzdGFja191c2VyLm8KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2FjbC5jIGIvZnMvb2NmczIvYWNsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJkZmI0NAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL29jZnMyL2FjbC5jCkBAIC0wLDAgKzEsNDc5IEBACisvKiAtKi0gbW9kZTogYzsgYy1iYXNpYy1vZmZzZXQ6IDg7IC0qLQorICogdmltOiBub2V4cGFuZHRhYiBzdz04IHRzPTggc3RzPTA6CisgKgorICogYWNsLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDggT3JhY2xlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDUkVESVRTOgorICogTG90cyBvZiBjb2RlIGluIHRoaXMgZmlsZSBpcyBjb3B5IGZyb20gbGludXgvZnMvZXh0My9hY2wuYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIEFuZHJlYXMgR3J1ZW5iYWNoZXIsIDxhZ3J1ZW5Ac3VzZS5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKworI2RlZmluZSBNTE9HX01BU0tfUFJFRklYIE1MX0lOT0RFCisjaW5jbHVkZSA8Y2x1c3Rlci9tYXNrbG9nLmg+CisKKyNpbmNsdWRlICJvY2ZzMi5oIgorI2luY2x1ZGUgImFsbG9jLmgiCisjaW5jbHVkZSAiZGxtZ2x1ZS5oIgorI2luY2x1ZGUgImZpbGUuaCIKKyNpbmNsdWRlICJvY2ZzMl9mcy5oIgorCisjaW5jbHVkZSAieGF0dHIuaCIKKyNpbmNsdWRlICJhY2wuaCIKKworLyoKKyAqIENvbnZlcnQgZnJvbSB4YXR0ciB2YWx1ZSB0byBhY2wgc3RydWN0LgorICovCitzdGF0aWMgc3RydWN0IHBvc2l4X2FjbCAqb2NmczJfYWNsX2Zyb21feGF0dHIoY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplKQoreworCWludCBuLCBjb3VudDsKKwlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CisKKwlpZiAoIXZhbHVlKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoc2l6ZSA8IHNpemVvZihzdHJ1Y3QgcG9zaXhfYWNsX2VudHJ5KSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwljb3VudCA9IHNpemUgLyBzaXplb2Yoc3RydWN0IHBvc2l4X2FjbF9lbnRyeSk7CisJaWYgKGNvdW50IDwgMCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJaWYgKGNvdW50ID09IDApCisJCXJldHVybiBOVUxMOworCisJYWNsID0gcG9zaXhfYWNsX2FsbG9jKGNvdW50LCBHRlBfTk9GUyk7CisJaWYgKCFhY2wpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWZvciAobiA9IDA7IG4gPCBjb3VudDsgbisrKSB7CisJCXN0cnVjdCBvY2ZzMl9hY2xfZW50cnkgKmVudHJ5ID0KKwkJCShzdHJ1Y3Qgb2NmczJfYWNsX2VudHJ5ICopdmFsdWU7CisKKwkJYWNsLT5hX2VudHJpZXNbbl0uZV90YWcgID0gbGUxNl90b19jcHUoZW50cnktPmVfdGFnKTsKKwkJYWNsLT5hX2VudHJpZXNbbl0uZV9wZXJtID0gbGUxNl90b19jcHUoZW50cnktPmVfcGVybSk7CisJCWFjbC0+YV9lbnRyaWVzW25dLmVfaWQgICA9IGxlMzJfdG9fY3B1KGVudHJ5LT5lX2lkKTsKKwkJdmFsdWUgKz0gc2l6ZW9mKHN0cnVjdCBwb3NpeF9hY2xfZW50cnkpOworCisJfQorCXJldHVybiBhY2w7Cit9CisKKy8qCisgKiBDb252ZXJ0IGFjbCBzdHJ1Y3QgdG8geGF0dHIgdmFsdWUuCisgKi8KK3N0YXRpYyB2b2lkICpvY2ZzMl9hY2xfdG9feGF0dHIoY29uc3Qgc3RydWN0IHBvc2l4X2FjbCAqYWNsLCBzaXplX3QgKnNpemUpCit7CisJc3RydWN0IG9jZnMyX2FjbF9lbnRyeSAqZW50cnkgPSBOVUxMOworCWNoYXIgKm9jZnMyX2FjbDsKKwlzaXplX3QgbjsKKworCSpzaXplID0gYWNsLT5hX2NvdW50ICogc2l6ZW9mKHN0cnVjdCBwb3NpeF9hY2xfZW50cnkpOworCisJb2NmczJfYWNsID0ga21hbGxvYygqc2l6ZSwgR0ZQX05PRlMpOworCWlmICghb2NmczJfYWNsKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWVudHJ5ID0gKHN0cnVjdCBvY2ZzMl9hY2xfZW50cnkgKilvY2ZzMl9hY2w7CisJZm9yIChuID0gMDsgbiA8IGFjbC0+YV9jb3VudDsgbisrLCBlbnRyeSsrKSB7CisJCWVudHJ5LT5lX3RhZyAgPSBjcHVfdG9fbGUxNihhY2wtPmFfZW50cmllc1tuXS5lX3RhZyk7CisJCWVudHJ5LT5lX3Blcm0gPSBjcHVfdG9fbGUxNihhY2wtPmFfZW50cmllc1tuXS5lX3Blcm0pOworCQllbnRyeS0+ZV9pZCAgID0gY3B1X3RvX2xlMzIoYWNsLT5hX2VudHJpZXNbbl0uZV9pZCk7CisJfQorCXJldHVybiBvY2ZzMl9hY2w7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcG9zaXhfYWNsICpvY2ZzMl9nZXRfYWNsX25vbG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICAgICBpbnQgdHlwZSwKKwkJCQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCkKK3sKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwlpbnQgbmFtZV9pbmRleDsKKwljaGFyICp2YWx1ZSA9IE5VTEw7CisJc3RydWN0IHBvc2l4X2FjbCAqYWNsOworCWludCByZXR2YWw7CisKKwlpZiAoIShvc2ItPnNfbW91bnRfb3B0ICYgT0NGUzJfTU9VTlRfUE9TSVhfQUNMKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEFDTF9UWVBFX0FDQ0VTUzoKKwkJbmFtZV9pbmRleCA9IE9DRlMyX1hBVFRSX0lOREVYX1BPU0lYX0FDTF9BQ0NFU1M7CisJCWJyZWFrOworCWNhc2UgQUNMX1RZUEVfREVGQVVMVDoKKwkJbmFtZV9pbmRleCA9IE9DRlMyX1hBVFRSX0lOREVYX1BPU0lYX0FDTF9ERUZBVUxUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisKKwlyZXR2YWwgPSBvY2ZzMl94YXR0cl9nZXRfbm9sb2NrKGlub2RlLCBkaV9iaCwgbmFtZV9pbmRleCwgIiIsIE5VTEwsIDApOworCWlmIChyZXR2YWwgPiAwKSB7CisJCXZhbHVlID0ga21hbGxvYyhyZXR2YWwsIEdGUF9OT0ZTKTsKKwkJaWYgKCF2YWx1ZSkKKwkJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCQlyZXR2YWwgPSBvY2ZzMl94YXR0cl9nZXRfbm9sb2NrKGlub2RlLCBkaV9iaCwgbmFtZV9pbmRleCwKKwkJCQkJCSIiLCB2YWx1ZSwgcmV0dmFsKTsKKwl9CisKKwlpZiAocmV0dmFsID4gMCkKKwkJYWNsID0gb2NmczJfYWNsX2Zyb21feGF0dHIodmFsdWUsIHJldHZhbCk7CisJZWxzZSBpZiAocmV0dmFsID09IC1FTk9EQVRBIHx8IHJldHZhbCA9PSAwKQorCQlhY2wgPSBOVUxMOworCWVsc2UKKwkJYWNsID0gRVJSX1BUUihyZXR2YWwpOworCisJa2ZyZWUodmFsdWUpOworCisJcmV0dXJuIGFjbDsKK30KKworCisvKgorICogR2V0IHBvc2l4IGFjbC4KKyAqLworc3RhdGljIHN0cnVjdCBwb3NpeF9hY2wgKm9jZnMyX2dldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpCit7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCA9IE5VTEw7CisJc3RydWN0IHBvc2l4X2FjbCAqYWNsOworCWludCByZXQ7CisKKwlpZiAoIShvc2ItPnNfbW91bnRfb3B0ICYgT0NGUzJfTU9VTlRfUE9TSVhfQUNMKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXQgPSBvY2ZzMl9pbm9kZV9sb2NrKGlub2RlLCAmZGlfYmgsIDApOworCWlmIChyZXQgPCAwKSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJYWNsID0gRVJSX1BUUihyZXQpOworCQlyZXR1cm4gYWNsOworCX0KKworCWFjbCA9IG9jZnMyX2dldF9hY2xfbm9sb2NrKGlub2RlLCB0eXBlLCBkaV9iaCk7CisKKwlvY2ZzMl9pbm9kZV91bmxvY2soaW5vZGUsIDApOworCisJYnJlbHNlKGRpX2JoKTsKKworCXJldHVybiBhY2w7Cit9CisKKy8qCisgKiBTZXQgdGhlIGFjY2VzcyBvciBkZWZhdWx0IEFDTCBvZiBhbiBpbm9kZS4KKyAqLworc3RhdGljIGludCBvY2ZzMl9zZXRfYWNsKGhhbmRsZV90ICpoYW5kbGUsCisJCQkgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLAorCQkJIGludCB0eXBlLAorCQkJIHN0cnVjdCBwb3NpeF9hY2wgKmFjbCwKKwkJCSBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYywKKwkJCSBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqZGF0YV9hYykKK3sKKwlpbnQgbmFtZV9pbmRleDsKKwl2b2lkICp2YWx1ZSA9IE5VTEw7CisJc2l6ZV90IHNpemUgPSAwOworCWludCByZXQ7CisKKwlpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBBQ0xfVFlQRV9BQ0NFU1M6CisJCW5hbWVfaW5kZXggPSBPQ0ZTMl9YQVRUUl9JTkRFWF9QT1NJWF9BQ0xfQUNDRVNTOworCQlpZiAoYWNsKSB7CisJCQltb2RlX3QgbW9kZSA9IGlub2RlLT5pX21vZGU7CisJCQlyZXQgPSBwb3NpeF9hY2xfZXF1aXZfbW9kZShhY2wsICZtb2RlKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisJCQllbHNlIHsKKwkJCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKKwkJCQlpZiAocmV0ID09IDApCisJCQkJCWFjbCA9IE5VTEw7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBBQ0xfVFlQRV9ERUZBVUxUOgorCQluYW1lX2luZGV4ID0gT0NGUzJfWEFUVFJfSU5ERVhfUE9TSVhfQUNMX0RFRkFVTFQ7CisJCWlmICghU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJCXJldHVybiBhY2wgPyAtRUFDQ0VTIDogMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGFjbCkgeworCQl2YWx1ZSA9IG9jZnMyX2FjbF90b194YXR0cihhY2wsICZzaXplKTsKKwkJaWYgKElTX0VSUih2YWx1ZSkpCisJCQlyZXR1cm4gKGludClQVFJfRVJSKHZhbHVlKTsKKwl9CisKKwlpZiAoaGFuZGxlKQorCQlyZXQgPSBvY2ZzMl94YXR0cl9zZXRfaGFuZGxlKGhhbmRsZSwgaW5vZGUsIGRpX2JoLCBuYW1lX2luZGV4LAorCQkJCQkgICAgICIiLCB2YWx1ZSwgc2l6ZSwgMCwKKwkJCQkJICAgICBtZXRhX2FjLCBkYXRhX2FjKTsKKwllbHNlCisJCXJldCA9IG9jZnMyX3hhdHRyX3NldChpbm9kZSwgbmFtZV9pbmRleCwgIiIsIHZhbHVlLCBzaXplLCAwKTsKKworCWtmcmVlKHZhbHVlKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBvY2ZzMl9jaGVja19hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2spCit7CisJc3RydWN0IHBvc2l4X2FjbCAqYWNsID0gb2NmczJfZ2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTKTsKKworCWlmIChJU19FUlIoYWNsKSkKKwkJcmV0dXJuIFBUUl9FUlIoYWNsKTsKKwlpZiAoYWNsKSB7CisJCWludCByZXQgPSBwb3NpeF9hY2xfcGVybWlzc2lvbihpbm9kZSwgYWNsLCBtYXNrKTsKKwkJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gLUVBR0FJTjsKK30KKworaW50IG9jZnMyX2FjbF9jaG1vZChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbCwgKmNsb25lOworCWludCByZXQ7CisKKwlpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKCEob3NiLT5zX21vdW50X29wdCAmIE9DRlMyX01PVU5UX1BPU0lYX0FDTCkpCisJCXJldHVybiAwOworCisJYWNsID0gb2NmczJfZ2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTKTsKKwlpZiAoSVNfRVJSKGFjbCkgfHwgIWFjbCkKKwkJcmV0dXJuIFBUUl9FUlIoYWNsKTsKKwljbG9uZSA9IHBvc2l4X2FjbF9jbG9uZShhY2wsIEdGUF9LRVJORUwpOworCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7CisJaWYgKCFjbG9uZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0ID0gcG9zaXhfYWNsX2NobW9kX21hc3EoY2xvbmUsIGlub2RlLT5pX21vZGUpOworCWlmICghcmV0KQorCQlyZXQgPSBvY2ZzMl9zZXRfYWNsKE5VTEwsIGlub2RlLCBOVUxMLCBBQ0xfVFlQRV9BQ0NFU1MsCisJCQkJICAgIGNsb25lLCBOVUxMLCBOVUxMKTsKKwlwb3NpeF9hY2xfcmVsZWFzZShjbG9uZSk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEluaXRpYWxpemUgdGhlIEFDTHMgb2YgYSBuZXcgaW5vZGUuIElmIHBhcmVudCBkaXJlY3RvcnkgaGFzIGRlZmF1bHQgQUNMLAorICogdGhlbiBjbG9uZSB0byBuZXcgaW5vZGUuIENhbGxlZCBmcm9tIG9jZnMyX21rbm9kLgorICovCitpbnQgb2NmczJfaW5pdF9hY2woaGFuZGxlX3QgKmhhbmRsZSwKKwkJICAgc3RydWN0IGlub2RlICppbm9kZSwKKwkJICAgc3RydWN0IGlub2RlICpkaXIsCisJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgsCisJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlyX2JoLAorCQkgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYywKKwkJICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmRhdGFfYWMpCit7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CisJc3RydWN0IHBvc2l4X2FjbCAqYWNsID0gTlVMTDsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkgeworCQlpZiAob3NiLT5zX21vdW50X29wdCAmIE9DRlMyX01PVU5UX1BPU0lYX0FDTCkgeworCQkJYWNsID0gb2NmczJfZ2V0X2FjbF9ub2xvY2soZGlyLCBBQ0xfVFlQRV9ERUZBVUxULAorCQkJCQkJICAgZGlyX2JoKTsKKwkJCWlmIChJU19FUlIoYWNsKSkKKwkJCQlyZXR1cm4gUFRSX0VSUihhY2wpOworCQl9CisJCWlmICghYWNsKQorCQkJaW5vZGUtPmlfbW9kZSAmPSB+Y3VycmVudC0+ZnMtPnVtYXNrOworCX0KKwlpZiAoKG9zYi0+c19tb3VudF9vcHQgJiBPQ0ZTMl9NT1VOVF9QT1NJWF9BQ0wpICYmIGFjbCkgeworCQlzdHJ1Y3QgcG9zaXhfYWNsICpjbG9uZTsKKwkJbW9kZV90IG1vZGU7CisKKwkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJCXJldCA9IG9jZnMyX3NldF9hY2woaGFuZGxlLCBpbm9kZSwgZGlfYmgsCisJCQkJCSAgICBBQ0xfVFlQRV9ERUZBVUxULCBhY2wsCisJCQkJCSAgICBtZXRhX2FjLCBkYXRhX2FjKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBjbGVhbnVwOworCQl9CisJCWNsb25lID0gcG9zaXhfYWNsX2Nsb25lKGFjbCwgR0ZQX05PRlMpOworCQlyZXQgPSAtRU5PTUVNOworCQlpZiAoIWNsb25lKQorCQkJZ290byBjbGVhbnVwOworCisJCW1vZGUgPSBpbm9kZS0+aV9tb2RlOworCQlyZXQgPSBwb3NpeF9hY2xfY3JlYXRlX21hc3EoY2xvbmUsICZtb2RlKTsKKwkJaWYgKHJldCA+PSAwKSB7CisJCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKKwkJCWlmIChyZXQgPiAwKSB7CisJCQkJcmV0ID0gb2NmczJfc2V0X2FjbChoYW5kbGUsIGlub2RlLAorCQkJCQkJICAgIGRpX2JoLCBBQ0xfVFlQRV9BQ0NFU1MsCisJCQkJCQkgICAgY2xvbmUsIG1ldGFfYWMsIGRhdGFfYWMpOworCQkJfQorCQl9CisJCXBvc2l4X2FjbF9yZWxlYXNlKGNsb25lKTsKKwl9CitjbGVhbnVwOgorCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNpemVfdCBvY2ZzMl94YXR0cl9saXN0X2FjbF9hY2Nlc3Moc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICBjaGFyICpsaXN0LAorCQkJCQkgIHNpemVfdCBsaXN0X2xlbiwKKwkJCQkJICBjb25zdCBjaGFyICpuYW1lLAorCQkJCQkgIHNpemVfdCBuYW1lX2xlbikKK3sKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwljb25zdCBzaXplX3Qgc2l6ZSA9IHNpemVvZihQT1NJWF9BQ0xfWEFUVFJfQUNDRVNTKTsKKworCWlmICghKG9zYi0+c19tb3VudF9vcHQgJiBPQ0ZTMl9NT1VOVF9QT1NJWF9BQ0wpKQorCQlyZXR1cm4gMDsKKworCWlmIChsaXN0ICYmIHNpemUgPD0gbGlzdF9sZW4pCisJCW1lbWNweShsaXN0LCBQT1NJWF9BQ0xfWEFUVFJfQUNDRVNTLCBzaXplKTsKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHNpemVfdCBvY2ZzMl94YXR0cl9saXN0X2FjbF9kZWZhdWx0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgIGNoYXIgKmxpc3QsCisJCQkJCSAgIHNpemVfdCBsaXN0X2xlbiwKKwkJCQkJICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJICAgc2l6ZV90IG5hbWVfbGVuKQoreworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworCWNvbnN0IHNpemVfdCBzaXplID0gc2l6ZW9mKFBPU0lYX0FDTF9YQVRUUl9ERUZBVUxUKTsKKworCWlmICghKG9zYi0+c19tb3VudF9vcHQgJiBPQ0ZTMl9NT1VOVF9QT1NJWF9BQ0wpKQorCQlyZXR1cm4gMDsKKworCWlmIChsaXN0ICYmIHNpemUgPD0gbGlzdF9sZW4pCisJCW1lbWNweShsaXN0LCBQT1NJWF9BQ0xfWEFUVFJfREVGQVVMVCwgc2l6ZSk7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfZ2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICAgIGludCB0eXBlLAorCQkJICAgICAgIHZvaWQgKmJ1ZmZlciwKKwkJCSAgICAgICBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CisJaW50IHJldDsKKworCWlmICghKG9zYi0+c19tb3VudF9vcHQgJiBPQ0ZTMl9NT1VOVF9QT1NJWF9BQ0wpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlhY2wgPSBvY2ZzMl9nZXRfYWNsKGlub2RlLCB0eXBlKTsKKwlpZiAoSVNfRVJSKGFjbCkpCisJCXJldHVybiBQVFJfRVJSKGFjbCk7CisJaWYgKGFjbCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RBVEE7CisJcmV0ID0gcG9zaXhfYWNsX3RvX3hhdHRyKGFjbCwgYnVmZmVyLCBzaXplKTsKKwlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvY2ZzMl94YXR0cl9nZXRfYWNsX2FjY2VzcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgICAgdm9pZCAqYnVmZmVyLAorCQkJCSAgICAgIHNpemVfdCBzaXplKQoreworCWlmIChzdHJjbXAobmFtZSwgIiIpICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBvY2ZzMl94YXR0cl9nZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MsIGJ1ZmZlciwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfZ2V0X2FjbF9kZWZhdWx0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgICAgIHZvaWQgKmJ1ZmZlciwKKwkJCQkgICAgICAgc2l6ZV90IHNpemUpCit7CisJaWYgKHN0cmNtcChuYW1lLCAiIikgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIG9jZnMyX3hhdHRyX2dldF9hY2woaW5vZGUsIEFDTF9UWVBFX0RFRkFVTFQsIGJ1ZmZlciwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfc2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICAgIGludCB0eXBlLAorCQkJICAgICAgIGNvbnN0IHZvaWQgKnZhbHVlLAorCQkJICAgICAgIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghKG9zYi0+c19tb3VudF9vcHQgJiBPQ0ZTMl9NT1VOVF9QT1NJWF9BQ0wpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoIWlzX293bmVyX29yX2NhcChpbm9kZSkpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAodmFsdWUpIHsKKwkJYWNsID0gcG9zaXhfYWNsX2Zyb21feGF0dHIodmFsdWUsIHNpemUpOworCQlpZiAoSVNfRVJSKGFjbCkpCisJCQlyZXR1cm4gUFRSX0VSUihhY2wpOworCQllbHNlIGlmIChhY2wpIHsKKwkJCXJldCA9IHBvc2l4X2FjbF92YWxpZChhY2wpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGNsZWFudXA7CisJCX0KKwl9IGVsc2UKKwkJYWNsID0gTlVMTDsKKworCXJldCA9IG9jZnMyX3NldF9hY2woTlVMTCwgaW5vZGUsIE5VTEwsIHR5cGUsIGFjbCwgTlVMTCwgTlVMTCk7CisKK2NsZWFudXA6CisJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX3NldF9hY2xfYWNjZXNzKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgICAgICBjb25zdCB2b2lkICp2YWx1ZSwKKwkJCQkgICAgICBzaXplX3Qgc2l6ZSwKKwkJCQkgICAgICBpbnQgZmxhZ3MpCit7CisJaWYgKHN0cmNtcChuYW1lLCAiIikgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIG9jZnMyX3hhdHRyX3NldF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgdmFsdWUsIHNpemUpOworfQorCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX3NldF9hY2xfZGVmYXVsdChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgICAgICBjb25zdCB2b2lkICp2YWx1ZSwKKwkJCQkgICAgICAgc2l6ZV90IHNpemUsCisJCQkJICAgICAgIGludCBmbGFncykKK3sKKwlpZiAoc3RyY21wKG5hbWUsICIiKSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gb2NmczJfeGF0dHJfc2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfREVGQVVMVCwgdmFsdWUsIHNpemUpOworfQorCitzdHJ1Y3QgeGF0dHJfaGFuZGxlciBvY2ZzMl94YXR0cl9hY2xfYWNjZXNzX2hhbmRsZXIgPSB7CisJLnByZWZpeAk9IFBPU0lYX0FDTF9YQVRUUl9BQ0NFU1MsCisJLmxpc3QJPSBvY2ZzMl94YXR0cl9saXN0X2FjbF9hY2Nlc3MsCisJLmdldAk9IG9jZnMyX3hhdHRyX2dldF9hY2xfYWNjZXNzLAorCS5zZXQJPSBvY2ZzMl94YXR0cl9zZXRfYWNsX2FjY2VzcywKK307CisKK3N0cnVjdCB4YXR0cl9oYW5kbGVyIG9jZnMyX3hhdHRyX2FjbF9kZWZhdWx0X2hhbmRsZXIgPSB7CisJLnByZWZpeAk9IFBPU0lYX0FDTF9YQVRUUl9ERUZBVUxULAorCS5saXN0CT0gb2NmczJfeGF0dHJfbGlzdF9hY2xfZGVmYXVsdCwKKwkuZ2V0CT0gb2NmczJfeGF0dHJfZ2V0X2FjbF9kZWZhdWx0LAorCS5zZXQJPSBvY2ZzMl94YXR0cl9zZXRfYWNsX2RlZmF1bHQsCit9OwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvYWNsLmggYi9mcy9vY2ZzMi9hY2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjYzODllCi0tLSAvZGV2L251bGwKKysrIGIvZnMvb2NmczIvYWNsLmgKQEAgLTAsMCArMSw1OCBAQAorLyogLSotIG1vZGU6IGM7IGMtYmFzaWMtb2Zmc2V0OiA4OyAtKi0KKyAqIHZpbTogbm9leHBhbmR0YWIgc3c9OCB0cz04IHN0cz0wOgorICoKKyAqIGFjbC5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA4IE9yYWNsZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgT0NGUzJfQUNMX0gKKyNkZWZpbmUgT0NGUzJfQUNMX0gKKworI2luY2x1ZGUgPGxpbnV4L3Bvc2l4X2FjbF94YXR0ci5oPgorCitzdHJ1Y3Qgb2NmczJfYWNsX2VudHJ5IHsKKwlfX2xlMTYgZV90YWc7CisJX19sZTE2IGVfcGVybTsKKwlfX2xlMzIgZV9pZDsKK307CisKKyNpZmRlZiBDT05GSUdfT0NGUzJfRlNfUE9TSVhfQUNMCisKK2V4dGVybiBpbnQgb2NmczJfY2hlY2tfYWNsKHN0cnVjdCBpbm9kZSAqLCBpbnQpOworZXh0ZXJuIGludCBvY2ZzMl9hY2xfY2htb2Qoc3RydWN0IGlub2RlICopOworZXh0ZXJuIGludCBvY2ZzMl9pbml0X2FjbChoYW5kbGVfdCAqLCBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGlub2RlICosCisJCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwKKwkJCSAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKiwKKwkJCSAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKik7CisKKyNlbHNlIC8qIENPTkZJR19PQ0ZTMl9GU19QT1NJWF9BQ0wqLworCisjZGVmaW5lIG9jZnMyX2NoZWNrX2FjbCBOVUxMCitzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9hY2xfY2htb2Qoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgaW50IG9jZnMyX2luaXRfYWNsKGhhbmRsZV90ICpoYW5kbGUsCisJCQkJIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJIHN0cnVjdCBpbm9kZSAqZGlyLAorCQkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLAorCQkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpcl9iaCwKKwkJCQkgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMsCisJCQkJIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICpkYXRhX2FjKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogQ09ORklHX09DRlMyX0ZTX1BPU0lYX0FDTCovCisKKyNlbmRpZiAvKiBPQ0ZTMl9BQ0xfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvYWxsb2MuYyBiL2ZzL29jZnMyL2FsbG9jLmMKaW5kZXggMGNjMmRlYi4uZDg2MTA5NiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvYWxsb2MuYworKysgYi9mcy9vY2ZzMi9hbGxvYy5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KIAogI2RlZmluZSBNTE9HX01BU0tfUFJFRklYIE1MX0RJU0tfQUxMT0MKICNpbmNsdWRlIDxjbHVzdGVyL21hc2tsb2cuaD4KQEAgLTM2LDYgKzM3LDcgQEAKIAogI2luY2x1ZGUgImFsbG9jLmgiCiAjaW5jbHVkZSAiYW9wcy5oIgorI2luY2x1ZGUgImJsb2NrY2hlY2suaCIKICNpbmNsdWRlICJkbG1nbHVlLmgiCiAjaW5jbHVkZSAiZXh0ZW50X21hcC5oIgogI2luY2x1ZGUgImlub2RlLmgiCkBAIC00Niw2ICs0OCw3IEBACiAjaW5jbHVkZSAiZmlsZS5oIgogI2luY2x1ZGUgInN1cGVyLmgiCiAjaW5jbHVkZSAidXB0b2RhdGUuaCIKKyNpbmNsdWRlICJ4YXR0ci5oIgogCiAjaW5jbHVkZSAiYnVmZmVyX2hlYWRfaW8uaCIKIApAQCAtMTg3LDIwICsxOTAsMTIgQEAKIHN0YXRpYyBpbnQgb2NmczJfZGlub2RlX3Nhbml0eV9jaGVjayhzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCSAgICAgc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCkKIHsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaTsKKwlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSA9IGV0LT5ldF9vYmplY3Q7CiAKIAlCVUdfT04oZXQtPmV0X29wcyAhPSAmb2NmczJfZGlub2RlX2V0X29wcyk7CisJQlVHX09OKCFPQ0ZTMl9JU19WQUxJRF9ESU5PREUoZGkpKTsKIAotCWRpID0gZXQtPmV0X29iamVjdDsKLQlpZiAoIU9DRlMyX0lTX1ZBTElEX0RJTk9ERShkaSkpIHsKLQkJcmV0ID0gLUVJTzsKLQkJb2NmczJfZXJyb3IoaW5vZGUtPmlfc2IsCi0JCQkiSW5vZGUgJWxsdSBoYXMgaW52YWxpZCBwYXRoIHJvb3QiLAotCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8pOwotCX0KLQotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIG9jZnMyX2Rpbm9kZV9maWxsX3Jvb3RfZWwoc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCkKQEAgLTIxMywzNiArMjA4LDMzIEBACiAKIHN0YXRpYyB2b2lkIG9jZnMyX3hhdHRyX3ZhbHVlX2ZpbGxfcm9vdF9lbChzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgKmV0KQogewotCXN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9yb290ICp4diA9IGV0LT5ldF9vYmplY3Q7CisJc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX2J1ZiAqdmIgPSBldC0+ZXRfb2JqZWN0OwogCi0JZXQtPmV0X3Jvb3RfZWwgPSAmeHYtPnhyX2xpc3Q7CisJZXQtPmV0X3Jvb3RfZWwgPSAmdmItPnZiX3h2LT54cl9saXN0OwogfQogCiBzdGF0aWMgdm9pZCBvY2ZzMl94YXR0cl92YWx1ZV9zZXRfbGFzdF9lYl9ibGsoc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwKIAkJCQkJICAgICAgdTY0IGJsa25vKQogewotCXN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9yb290ICp4diA9Ci0JCShzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCAqKWV0LT5ldF9vYmplY3Q7CisJc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX2J1ZiAqdmIgPSBldC0+ZXRfb2JqZWN0OwogCi0JeHYtPnhyX2xhc3RfZWJfYmxrID0gY3B1X3RvX2xlNjQoYmxrbm8pOworCXZiLT52Yl94di0+eHJfbGFzdF9lYl9ibGsgPSBjcHVfdG9fbGU2NChibGtubyk7CiB9CiAKIHN0YXRpYyB1NjQgb2NmczJfeGF0dHJfdmFsdWVfZ2V0X2xhc3RfZWJfYmxrKHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQpCiB7Ci0Jc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX3Jvb3QgKnh2ID0KLQkJKHN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9yb290ICopIGV0LT5ldF9vYmplY3Q7CisJc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX2J1ZiAqdmIgPSBldC0+ZXRfb2JqZWN0OwogCi0JcmV0dXJuIGxlNjRfdG9fY3B1KHh2LT54cl9sYXN0X2ViX2Jsayk7CisJcmV0dXJuIGxlNjRfdG9fY3B1KHZiLT52Yl94di0+eHJfbGFzdF9lYl9ibGspOwogfQogCiBzdGF0aWMgdm9pZCBvY2ZzMl94YXR0cl92YWx1ZV91cGRhdGVfY2x1c3RlcnMoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkJICAgICAgc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwKIAkJCQkJICAgICAgdTMyIGNsdXN0ZXJzKQogewotCXN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9yb290ICp4diA9Ci0JCShzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCAqKWV0LT5ldF9vYmplY3Q7CisJc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX2J1ZiAqdmIgPSBldC0+ZXRfb2JqZWN0OwogCi0JbGUzMl9hZGRfY3B1KCZ4di0+eHJfY2x1c3RlcnMsIGNsdXN0ZXJzKTsKKwlsZTMyX2FkZF9jcHUoJnZiLT52Yl94di0+eHJfY2x1c3RlcnMsIGNsdXN0ZXJzKTsKIH0KIAogc3RhdGljIHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZV9vcGVyYXRpb25zIG9jZnMyX3hhdHRyX3ZhbHVlX2V0X29wcyA9IHsKQEAgLTMwNCwxMSArMjk2LDEzIEBACiBzdGF0aWMgdm9pZCBfX29jZnMyX2luaXRfZXh0ZW50X3RyZWUoc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwKIAkJCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAorCQkJCSAgICAgb2NmczJfam91cm5hbF9hY2Nlc3NfZnVuYyBhY2Nlc3MsCiAJCQkJICAgICB2b2lkICpvYmosCiAJCQkJICAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWVfb3BlcmF0aW9ucyAqb3BzKQogewogCWV0LT5ldF9vcHMgPSBvcHM7CiAJZXQtPmV0X3Jvb3RfYmggPSBiaDsKKwlldC0+ZXRfcm9vdF9qb3VybmFsX2FjY2VzcyA9IGFjY2VzczsKIAlpZiAoIW9iaikKIAkJb2JqID0gKHZvaWQgKiliaC0+Yl9kYXRhOwogCWV0LT5ldF9vYmplY3QgPSBvYmo7CkBAIC0zMjQsMjMgKzMxOCwyMyBAQAogCQkJCSAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKLQlfX29jZnMyX2luaXRfZXh0ZW50X3RyZWUoZXQsIGlub2RlLCBiaCwgTlVMTCwgJm9jZnMyX2Rpbm9kZV9ldF9vcHMpOworCV9fb2NmczJfaW5pdF9leHRlbnRfdHJlZShldCwgaW5vZGUsIGJoLCBvY2ZzMl9qb3VybmFsX2FjY2Vzc19kaSwKKwkJCQkgTlVMTCwgJm9jZnMyX2Rpbm9kZV9ldF9vcHMpOwogfQogCiB2b2lkIG9jZnMyX2luaXRfeGF0dHJfdHJlZV9leHRlbnRfdHJlZShzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgKmV0LAogCQkJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQogewotCV9fb2NmczJfaW5pdF9leHRlbnRfdHJlZShldCwgaW5vZGUsIGJoLCBOVUxMLAotCQkJCSAmb2NmczJfeGF0dHJfdHJlZV9ldF9vcHMpOworCV9fb2NmczJfaW5pdF9leHRlbnRfdHJlZShldCwgaW5vZGUsIGJoLCBvY2ZzMl9qb3VybmFsX2FjY2Vzc194YiwKKwkJCQkgTlVMTCwgJm9jZnMyX3hhdHRyX3RyZWVfZXRfb3BzKTsKIH0KIAogdm9pZCBvY2ZzMl9pbml0X3hhdHRyX3ZhbHVlX2V4dGVudF90cmVlKHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQsCiAJCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCi0JCQkJCXN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9yb290ICp4dikKKwkJCQkJc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX2J1ZiAqdmIpCiB7Ci0JX19vY2ZzMl9pbml0X2V4dGVudF90cmVlKGV0LCBpbm9kZSwgYmgsIHh2LAorCV9fb2NmczJfaW5pdF9leHRlbnRfdHJlZShldCwgaW5vZGUsIHZiLT52Yl9iaCwgdmItPnZiX2FjY2VzcywgdmIsCiAJCQkJICZvY2ZzMl94YXR0cl92YWx1ZV9ldF9vcHMpOwogfQogCkBAIC0zNjIsNiArMzU2LDE1IEBACiAJZXQtPmV0X29wcy0+ZW9fdXBkYXRlX2NsdXN0ZXJzKGlub2RlLCBldCwgY2x1c3RlcnMpOwogfQogCitzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9ldF9yb290X2pvdXJuYWxfYWNjZXNzKGhhbmRsZV90ICpoYW5kbGUsCisJCQkJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICAgICAgc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwKKwkJCQkJICAgICAgIGludCB0eXBlKQoreworCXJldHVybiBldC0+ZXRfcm9vdF9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBldC0+ZXRfcm9vdF9iaCwKKwkJCQkJICB0eXBlKTsKK30KKwogc3RhdGljIGlubGluZSBpbnQgb2NmczJfZXRfaW5zZXJ0X2NoZWNrKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJCXN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQsCiAJCQkJCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpyZWMpCkBAIC00MDIsMTIgKzQwNSwxNCBAQAogI2RlZmluZSBPQ0ZTMl9NQVhfUEFUSF9ERVBUSAk1CiAKIHN0cnVjdCBvY2ZzMl9wYXRoIHsKLQlpbnQJCQlwX3RyZWVfZGVwdGg7Ci0Jc3RydWN0IG9jZnMyX3BhdGhfaXRlbQlwX25vZGVbT0NGUzJfTUFYX1BBVEhfREVQVEhdOworCWludAkJCQlwX3RyZWVfZGVwdGg7CisJb2NmczJfam91cm5hbF9hY2Nlc3NfZnVuYwlwX3Jvb3RfYWNjZXNzOworCXN0cnVjdCBvY2ZzMl9wYXRoX2l0ZW0JCXBfbm9kZVtPQ0ZTMl9NQVhfUEFUSF9ERVBUSF07CiB9OwogCiAjZGVmaW5lIHBhdGhfcm9vdF9iaChfcGF0aCkgKChfcGF0aCktPnBfbm9kZVswXS5iaCkKICNkZWZpbmUgcGF0aF9yb290X2VsKF9wYXRoKSAoKF9wYXRoKS0+cF9ub2RlWzBdLmVsKQorI2RlZmluZSBwYXRoX3Jvb3RfYWNjZXNzKF9wYXRoKSgoX3BhdGgpLT5wX3Jvb3RfYWNjZXNzKQogI2RlZmluZSBwYXRoX2xlYWZfYmgoX3BhdGgpICgoX3BhdGgpLT5wX25vZGVbKF9wYXRoKS0+cF90cmVlX2RlcHRoXS5iaCkKICNkZWZpbmUgcGF0aF9sZWFmX2VsKF9wYXRoKSAoKF9wYXRoKS0+cF9ub2RlWyhfcGF0aCktPnBfdHJlZV9kZXB0aF0uZWwpCiAjZGVmaW5lIHBhdGhfbnVtX2l0ZW1zKF9wYXRoKSAoKF9wYXRoKS0+cF90cmVlX2RlcHRoICsgMSkKQEAgLTQ0MCw2ICs0NDUsOCBAQAogCSAqLwogCWlmIChrZWVwX3Jvb3QpCiAJCWRlcHRoID0gbGUxNl90b19jcHUocGF0aF9yb290X2VsKHBhdGgpLT5sX3RyZWVfZGVwdGgpOworCWVsc2UKKwkJcGF0aF9yb290X2FjY2VzcyhwYXRoKSA9IE5VTEw7CiAKIAlwYXRoLT5wX3RyZWVfZGVwdGggPSBkZXB0aDsKIH0KQEAgLTQ2NSw2ICs0NzIsNyBAQAogCiAJQlVHX09OKHBhdGhfcm9vdF9iaChkZXN0KSAhPSBwYXRoX3Jvb3RfYmgoc3JjKSk7CiAJQlVHX09OKHBhdGhfcm9vdF9lbChkZXN0KSAhPSBwYXRoX3Jvb3RfZWwoc3JjKSk7CisJQlVHX09OKHBhdGhfcm9vdF9hY2Nlc3MoZGVzdCkgIT0gcGF0aF9yb290X2FjY2VzcyhzcmMpKTsKIAogCW9jZnMyX3JlaW5pdF9wYXRoKGRlc3QsIDEpOwogCkBAIC00ODYsNiArNDk0LDcgQEAKIAlpbnQgaTsKIAogCUJVR19PTihwYXRoX3Jvb3RfYmgoZGVzdCkgIT0gcGF0aF9yb290X2JoKHNyYykpOworCUJVR19PTihwYXRoX3Jvb3RfYWNjZXNzKGRlc3QpICE9IHBhdGhfcm9vdF9hY2Nlc3Moc3JjKSk7CiAKIAlmb3IoaSA9IDE7IGkgPCBPQ0ZTMl9NQVhfUEFUSF9ERVBUSDsgaSsrKSB7CiAJCWJyZWxzZShkZXN0LT5wX25vZGVbaV0uYmgpOwpAQCAtNTIxLDcgKzUzMCw4IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgb2NmczJfcGF0aCAqb2NmczJfbmV3X3BhdGgoc3RydWN0IGJ1ZmZlcl9oZWFkICpyb290X2JoLAotCQkJCQkgc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICpyb290X2VsKQorCQkJCQkgc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICpyb290X2VsLAorCQkJCQkgb2NmczJfam91cm5hbF9hY2Nlc3NfZnVuYyBhY2Nlc3MpCiB7CiAJc3RydWN0IG9jZnMyX3BhdGggKnBhdGg7CiAKQEAgLTUzMywxMSArNTQzLDQ4IEBACiAJCWdldF9iaChyb290X2JoKTsKIAkJcGF0aF9yb290X2JoKHBhdGgpID0gcm9vdF9iaDsKIAkJcGF0aF9yb290X2VsKHBhdGgpID0gcm9vdF9lbDsKKwkJcGF0aF9yb290X2FjY2VzcyhwYXRoKSA9IGFjY2VzczsKIAl9CiAKIAlyZXR1cm4gcGF0aDsKIH0KIAorc3RhdGljIHN0cnVjdCBvY2ZzMl9wYXRoICpvY2ZzMl9uZXdfcGF0aF9mcm9tX3BhdGgoc3RydWN0IG9jZnMyX3BhdGggKnBhdGgpCit7CisJcmV0dXJuIG9jZnMyX25ld19wYXRoKHBhdGhfcm9vdF9iaChwYXRoKSwgcGF0aF9yb290X2VsKHBhdGgpLAorCQkJICAgICAgcGF0aF9yb290X2FjY2VzcyhwYXRoKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2NmczJfcGF0aCAqb2NmczJfbmV3X3BhdGhfZnJvbV9ldChzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgKmV0KQoreworCXJldHVybiBvY2ZzMl9uZXdfcGF0aChldC0+ZXRfcm9vdF9iaCwgZXQtPmV0X3Jvb3RfZWwsCisJCQkgICAgICBldC0+ZXRfcm9vdF9qb3VybmFsX2FjY2Vzcyk7Cit9CisKKy8qCisgKiBKb3VybmFsIHRoZSBidWZmZXIgYXQgZGVwdGggaWR4LiAgQWxsIGlkeD4wIGFyZSBleHRlbnRfYmxvY2tzLAorICogb3RoZXJ3aXNlIGl0J3MgdGhlIHJvb3RfYWNjZXNzIGZ1bmN0aW9uLgorICoKKyAqIEkgZG9uJ3QgbGlrZSB0aGUgd2F5IHRoaXMgZnVuY3Rpb24ncyBuYW1lIGxvb2tzIG5leHQgdG8KKyAqIG9jZnMyX2pvdXJuYWxfYWNjZXNzX3BhdGgoKSwgYnV0IEkgZG9uJ3QgaGF2ZSBhIGJldHRlciBvbmUuCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfcGF0aF9iaF9qb3VybmFsX2FjY2VzcyhoYW5kbGVfdCAqaGFuZGxlLAorCQkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQlzdHJ1Y3Qgb2NmczJfcGF0aCAqcGF0aCwKKwkJCQkJaW50IGlkeCkKK3sKKwlvY2ZzMl9qb3VybmFsX2FjY2Vzc19mdW5jIGFjY2VzcyA9IHBhdGhfcm9vdF9hY2Nlc3MocGF0aCk7CisKKwlpZiAoIWFjY2VzcykKKwkJYWNjZXNzID0gb2NmczJfam91cm5hbF9hY2Nlc3M7CisKKwlpZiAoaWR4KQorCQlhY2Nlc3MgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19lYjsKKworCXJldHVybiBhY2Nlc3MoaGFuZGxlLCBpbm9kZSwgcGF0aC0+cF9ub2RlW2lkeF0uYmgsCisJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKK30KKwogLyoKICAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGpvdXJuYWwgYWxsIGNvbXBvbmVudHMgaW4gYSBwYXRoLgogICovCkBAIC01NTAsOCArNTk3LDcgQEAKIAkJZ290byBvdXQ7CiAKIAlmb3IoaSA9IDA7IGkgPCBwYXRoX251bV9pdGVtcyhwYXRoKTsgaSsrKSB7Ci0JCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHBhdGgtPnBfbm9kZVtpXS5iaCwKLQkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCQlyZXQgPSBvY2ZzMl9wYXRoX2JoX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHBhdGgsIGkpOwogCQlpZiAocmV0IDwgMCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJZ290byBvdXQ7CkBAIC02ODYsNiArNzMyLDgwIEBACiAJaW50CQkJY19zcGxpdF9jb3ZlcnNfcmVjOwogfTsKIAorc3RhdGljIGludCBvY2ZzMl92YWxpZGF0ZV9leHRlbnRfYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlpbnQgcmM7CisJc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqZWIgPQorCQkoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKWJoLT5iX2RhdGE7CisKKwltbG9nKDAsICJWYWxpZGF0aW5nIGV4dGVudCBibG9jayAlbGx1XG4iLAorCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yKTsKKworCUJVR19PTighYnVmZmVyX3VwdG9kYXRlKGJoKSk7CisKKwkvKgorCSAqIElmIHRoZSBlY2MgZmFpbHMsIHdlIHJldHVybiB0aGUgZXJyb3IgYnV0IG90aGVyd2lzZQorCSAqIGxlYXZlIHRoZSBmaWxlc3lzdGVtIHJ1bm5pbmcuICBXZSBrbm93IGFueSBlcnJvciBpcworCSAqIGxvY2FsIHRvIHRoaXMgYmxvY2suCisJICovCisJcmMgPSBvY2ZzMl92YWxpZGF0ZV9tZXRhX2VjYyhzYiwgYmgtPmJfZGF0YSwgJmViLT5oX2NoZWNrKTsKKwlpZiAocmMpIHsKKwkJbWxvZyhNTF9FUlJPUiwgIkNoZWNrc3VtIGZhaWxlZCBmb3IgZXh0ZW50IGJsb2NrICVsbHVcbiIsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qCisJICogRXJyb3JzIGFmdGVyIGhlcmUgYXJlIGZhdGFsLgorCSAqLworCisJaWYgKCFPQ0ZTMl9JU19WQUxJRF9FWFRFTlRfQkxPQ0soZWIpKSB7CisJCW9jZnMyX2Vycm9yKHNiLAorCQkJICAgICJFeHRlbnQgYmxvY2sgIyVsbHUgaGFzIGJhZCBzaWduYXR1cmUgJS4qcyIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yLCA3LAorCQkJICAgIGViLT5oX3NpZ25hdHVyZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChsZTY0X3RvX2NwdShlYi0+aF9ibGtubykgIT0gYmgtPmJfYmxvY2tucikgeworCQlvY2ZzMl9lcnJvcihzYiwKKwkJCSAgICAiRXh0ZW50IGJsb2NrICMlbGx1IGhhcyBhbiBpbnZhbGlkIGhfYmxrbm8gIgorCQkJICAgICJvZiAlbGx1IiwKKwkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShlYi0+aF9ibGtubykpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobGUzMl90b19jcHUoZWItPmhfZnNfZ2VuZXJhdGlvbikgIT0gT0NGUzJfU0Ioc2IpLT5mc19nZW5lcmF0aW9uKSB7CisJCW9jZnMyX2Vycm9yKHNiLAorCQkJICAgICJFeHRlbnQgYmxvY2sgIyVsbHUgaGFzIGFuIGludmFsaWQgIgorCQkJICAgICJoX2ZzX2dlbmVyYXRpb24gb2YgIyV1IiwKKwkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIsCisJCQkgICAgbGUzMl90b19jcHUoZWItPmhfZnNfZ2VuZXJhdGlvbikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IG9jZnMyX3JlYWRfZXh0ZW50X2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCBlYl9ibGtubywKKwkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaCkKK3sKKwlpbnQgcmM7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICp0bXAgPSAqYmg7CisKKwlyYyA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIGViX2Jsa25vLCAmdG1wLAorCQkJICAgICAgb2NmczJfdmFsaWRhdGVfZXh0ZW50X2Jsb2NrKTsKKworCS8qIElmIG9jZnMyX3JlYWRfYmxvY2soKSBnb3QgdXMgYSBuZXcgYmgsIHBhc3MgaXQgdXAuICovCisJaWYgKCFyYyAmJiAhKmJoKQorCQkqYmggPSB0bXA7CisKKwlyZXR1cm4gcmM7Cit9CisKKwogLyoKICAqIEhvdyBtYW55IGZyZWUgZXh0ZW50cyBoYXZlIHdlIGdvdCBiZWZvcmUgd2UgbmVlZCBtb3JlIG1ldGEgZGF0YT8KICAqLwpAQCAtNzA1LDggKzgyNSw3IEBACiAJbGFzdF9lYl9ibGsgPSBvY2ZzMl9ldF9nZXRfbGFzdF9lYl9ibGsoZXQpOwogCiAJaWYgKGxhc3RfZWJfYmxrKSB7Ci0JCXJldHZhbCA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIGxhc3RfZWJfYmxrLAotCQkJCQkgICZlYl9iaCk7CisJCXJldHZhbCA9IG9jZnMyX3JlYWRfZXh0ZW50X2Jsb2NrKGlub2RlLCBsYXN0X2ViX2JsaywgJmViX2JoKTsKIAkJaWYgKHJldHZhbCA8IDApIHsKIAkJCW1sb2dfZXJybm8ocmV0dmFsKTsKIAkJCWdvdG8gYmFpbDsKQEAgLTc2OCw4ICs4ODcsOCBAQAogCQkJfQogCQkJb2NmczJfc2V0X25ld19idWZmZXJfdXB0b2RhdGUoaW5vZGUsIGJoc1tpXSk7CiAKLQkJCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGJoc1tpXSwKLQkJCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX0NSRUFURSk7CisJCQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19lYihoYW5kbGUsIGlub2RlLCBiaHNbaV0sCisJCQkJCQkJIE9DRlMyX0pPVVJOQUxfQUNDRVNTX0NSRUFURSk7CiAJCQlpZiAoc3RhdHVzIDwgMCkgewogCQkJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJCQlnb3RvIGJhaWw7CkBAIC05MDgsMTUgKzEwMjcsMTIgQEAKIAlmb3IoaSA9IDA7IGkgPCBuZXdfYmxvY2tzOyBpKyspIHsKIAkJYmggPSBuZXdfZWJfYmhzW2ldOwogCQllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopIGJoLT5iX2RhdGE7Ci0JCWlmICghT0NGUzJfSVNfVkFMSURfRVhURU5UX0JMT0NLKGViKSkgewotCQkJT0NGUzJfUk9fT05fSU5WQUxJRF9FWFRFTlRfQkxPQ0soaW5vZGUtPmlfc2IsIGViKTsKLQkJCXN0YXR1cyA9IC1FSU87Ci0JCQlnb3RvIGJhaWw7Ci0JCX0KKwkJLyogb2NmczJfY3JlYXRlX25ld19tZXRhX2JocygpIHNob3VsZCBjcmVhdGUgaXQgcmlnaHQhICovCisJCUJVR19PTighT0NGUzJfSVNfVkFMSURfRVhURU5UX0JMT0NLKGViKSk7CiAJCWViX2VsID0gJmViLT5oX2xpc3Q7CiAKLQkJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgYmgsCi0JCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX0NSRUFURSk7CisJCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2ViKGhhbmRsZSwgaW5vZGUsIGJoLAorCQkJCQkJIE9DRlMyX0pPVVJOQUxfQUNDRVNTX0NSRUFURSk7CiAJCWlmIChzdGF0dXMgPCAwKSB7CiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCQlnb3RvIGJhaWw7CkBAIC05NTUsMjEgKzEwNzEsMjEgQEAKIAkgKiBqb3VybmFsX2RpcnR5IGVycm9yaW5nIGFzIGl0IHdvbid0IHVubGVzcyB3ZSd2ZSBhYm9ydGVkIHRoZQogCSAqIGhhbmRsZSAoaW4gd2hpY2ggY2FzZSB3ZSB3b3VsZCBuZXZlciBiZSBoZXJlKSBzbyByZXNlcnZpbmcKIAkgKiB0aGUgd3JpdGUgd2l0aCBqb3VybmFsX2FjY2VzcyBpcyBhbGwgd2UgbmVlZCB0byBkby4gKi8KLQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCAqbGFzdF9lYl9iaCwKLQkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZWIoaGFuZGxlLCBpbm9kZSwgKmxhc3RfZWJfYmgsCisJCQkJCSBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGJhaWw7CiAJfQotCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGV0LT5ldF9yb290X2JoLAotCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlzdGF0dXMgPSBvY2ZzMl9ldF9yb290X2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGV0LAorCQkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGJhaWw7CiAJfQogCWlmIChlYl9iaCkgewotCQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBlYl9iaCwKLQkJCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19lYihoYW5kbGUsIGlub2RlLCBlYl9iaCwKKwkJCQkJCSBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJCWlmIChzdGF0dXMgPCAwKSB7CiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCQlnb3RvIGJhaWw7CkBAIC0xMDUyLDE3ICsxMTY4LDE0IEBACiAJfQogCiAJZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKSBuZXdfZWJfYmgtPmJfZGF0YTsKLQlpZiAoIU9DRlMyX0lTX1ZBTElEX0VYVEVOVF9CTE9DSyhlYikpIHsKLQkJT0NGUzJfUk9fT05fSU5WQUxJRF9FWFRFTlRfQkxPQ0soaW5vZGUtPmlfc2IsIGViKTsKLQkJc3RhdHVzID0gLUVJTzsKLQkJZ290byBiYWlsOwotCX0KKwkvKiBvY2ZzMl9jcmVhdGVfbmV3X21ldGFfYmhzKCkgc2hvdWxkIGNyZWF0ZSBpdCByaWdodCEgKi8KKwlCVUdfT04oIU9DRlMyX0lTX1ZBTElEX0VYVEVOVF9CTE9DSyhlYikpOwogCiAJZWJfZWwgPSAmZWItPmhfbGlzdDsKIAlyb290X2VsID0gZXQtPmV0X3Jvb3RfZWw7CiAKLQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBuZXdfZWJfYmgsCi0JCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfQ1JFQVRFKTsKKwlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19lYihoYW5kbGUsIGlub2RlLCBuZXdfZWJfYmgsCisJCQkJCSBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19DUkVBVEUpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBiYWlsOwpAQCAtMTA4MCw4ICsxMTkzLDggQEAKIAkJZ290byBiYWlsOwogCX0KIAotCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGV0LT5ldF9yb290X2JoLAotCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlzdGF0dXMgPSBvY2ZzMl9ldF9yb290X2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGV0LAorCQkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGJhaWw7CkBAIC0xMTc2LDE4ICsxMjg5LDEzIEBACiAJCWJyZWxzZShiaCk7CiAJCWJoID0gTlVMTDsKIAotCQlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBibGtubywgJmJoKTsKKwkJc3RhdHVzID0gb2NmczJfcmVhZF9leHRlbnRfYmxvY2soaW5vZGUsIGJsa25vLCAmYmgpOwogCQlpZiAoc3RhdHVzIDwgMCkgewogCQkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQkJZ290byBiYWlsOwogCQl9CiAKIAkJZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKSBiaC0+Yl9kYXRhOwotCQlpZiAoIU9DRlMyX0lTX1ZBTElEX0VYVEVOVF9CTE9DSyhlYikpIHsKLQkJCU9DRlMyX1JPX09OX0lOVkFMSURfRVhURU5UX0JMT0NLKGlub2RlLT5pX3NiLCBlYik7Ci0JCQlzdGF0dXMgPSAtRUlPOwotCQkJZ290byBiYWlsOwotCQl9CiAJCWVsID0gJmViLT5oX2xpc3Q7CiAKIAkJaWYgKGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpIDwKQEAgLTE1NDAsNyArMTY0OCw3IEBACiAKIAkJYnJlbHNlKGJoKTsKIAkJYmggPSBOVUxMOwotCQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBibGtubywgJmJoKTsKKwkJcmV0ID0gb2NmczJfcmVhZF9leHRlbnRfYmxvY2soaW5vZGUsIGJsa25vLCAmYmgpOwogCQlpZiAocmV0KSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlnb3RvIG91dDsKQEAgLTE1NDgsMTEgKzE2NTYsNiBAQAogCiAJCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKikgYmgtPmJfZGF0YTsKIAkJZWwgPSAmZWItPmhfbGlzdDsKLQkJaWYgKCFPQ0ZTMl9JU19WQUxJRF9FWFRFTlRfQkxPQ0soZWIpKSB7Ci0JCQlPQ0ZTMl9ST19PTl9JTlZBTElEX0VYVEVOVF9CTE9DSyhpbm9kZS0+aV9zYiwgZWIpOwotCQkJcmV0ID0gLUVJTzsKLQkJCWdvdG8gb3V0OwotCQl9CiAKIAkJaWYgKGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpID4KIAkJICAgIGxlMTZfdG9fY3B1KGVsLT5sX2NvdW50KSkgewpAQCAtMTg2MCwyNSArMTk2MywyMyBAQAogCXJvb3RfYmggPSBsZWZ0X3BhdGgtPnBfbm9kZVtzdWJ0cmVlX2luZGV4XS5iaDsKIAlCVUdfT04ocm9vdF9iaCAhPSByaWdodF9wYXRoLT5wX25vZGVbc3VidHJlZV9pbmRleF0uYmgpOwogCi0JcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgcm9vdF9iaCwKLQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJcmV0ID0gb2NmczJfcGF0aF9iaF9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCByaWdodF9wYXRoLAorCQkJCQkgICBzdWJ0cmVlX2luZGV4KTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CiAJfQogCiAJZm9yKGkgPSBzdWJ0cmVlX2luZGV4ICsgMTsgaSA8IHBhdGhfbnVtX2l0ZW1zKHJpZ2h0X3BhdGgpOyBpKyspIHsKLQkJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwKLQkJCQkJICAgcmlnaHRfcGF0aC0+cF9ub2RlW2ldLmJoLAotCQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJCXJldCA9IG9jZnMyX3BhdGhfYmhfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwKKwkJCQkJCSAgIHJpZ2h0X3BhdGgsIGkpOwogCQlpZiAocmV0KSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlnb3RvIG91dDsKIAkJfQogCi0JCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsCi0JCQkJCSAgIGxlZnRfcGF0aC0+cF9ub2RlW2ldLmJoLAotCQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJCXJldCA9IG9jZnMyX3BhdGhfYmhfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwKKwkJCQkJCSAgIGxlZnRfcGF0aCwgaSk7CiAJCWlmIChyZXQpIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCWdvdG8gb3V0OwpAQCAtMjEwMiw4ICsyMjAzLDcgQEAKIAogCSpyZXRfbGVmdF9wYXRoID0gTlVMTDsKIAotCWxlZnRfcGF0aCA9IG9jZnMyX25ld19wYXRoKHBhdGhfcm9vdF9iaChyaWdodF9wYXRoKSwKLQkJCQkgICBwYXRoX3Jvb3RfZWwocmlnaHRfcGF0aCkpOworCWxlZnRfcGF0aCA9IG9jZnMyX25ld19wYXRoX2Zyb21fcGF0aChyaWdodF9wYXRoKTsKIAlpZiAoIWxlZnRfcGF0aCkgewogCQlyZXQgPSAtRU5PTUVNOwogCQltbG9nX2Vycm5vKHJldCk7CkBAIC0yMzk4LDkgKzI0OTgsOSBAQAogCQkJcmV0dXJuIC1FQUdBSU47CiAKIAkJaWYgKGxlMTZfdG9fY3B1KHJpZ2h0X2xlYWZfZWwtPmxfbmV4dF9mcmVlX3JlYykgPiAxKSB7Ci0JCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLAotCQkJCQkJICAgcGF0aF9sZWFmX2JoKHJpZ2h0X3BhdGgpLAotCQkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCQkJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZWIoaGFuZGxlLCBpbm9kZSwKKwkJCQkJCSAgICAgIHBhdGhfbGVhZl9iaChyaWdodF9wYXRoKSwKKwkJCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAkJCWlmIChyZXQpIHsKIAkJCQltbG9nX2Vycm5vKHJldCk7CiAJCQkJZ290byBvdXQ7CkBAIC0yNDE3LDggKzI1MTcsOCBAQAogCQkgKiBXZSBoYXZlIHRvIHVwZGF0ZSBpX2xhc3RfZWJfYmxrIGR1cmluZyB0aGUgbWV0YQogCQkgKiBkYXRhIGRlbGV0ZS4KIAkJICovCi0JCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGV0X3Jvb3RfYmgsCi0JCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwkJcmV0ID0gb2NmczJfZXRfcm9vdF9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBldCwKKwkJCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJZ290byBvdXQ7CkBAIC0yNDMzLDI1ICsyNTMzLDIzIEBACiAJICovCiAJQlVHX09OKHJpZ2h0X2hhc19lbXB0eSAmJiAhZGVsX3JpZ2h0X3N1YnRyZWUpOwogCi0JcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgcm9vdF9iaCwKLQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJcmV0ID0gb2NmczJfcGF0aF9iaF9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCByaWdodF9wYXRoLAorCQkJCQkgICBzdWJ0cmVlX2luZGV4KTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CiAJfQogCiAJZm9yKGkgPSBzdWJ0cmVlX2luZGV4ICsgMTsgaSA8IHBhdGhfbnVtX2l0ZW1zKHJpZ2h0X3BhdGgpOyBpKyspIHsKLQkJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwKLQkJCQkJICAgcmlnaHRfcGF0aC0+cF9ub2RlW2ldLmJoLAotCQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJCXJldCA9IG9jZnMyX3BhdGhfYmhfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwKKwkJCQkJCSAgIHJpZ2h0X3BhdGgsIGkpOwogCQlpZiAocmV0KSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlnb3RvIG91dDsKIAkJfQogCi0JCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsCi0JCQkJCSAgIGxlZnRfcGF0aC0+cF9ub2RlW2ldLmJoLAotCQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJCXJldCA9IG9jZnMyX3BhdGhfYmhfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwKKwkJCQkJCSAgIGxlZnRfcGF0aCwgaSk7CiAJCWlmIChyZXQpIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCWdvdG8gb3V0OwpAQCAtMjU5NiwxNiArMjY5NCwxNyBAQAogCiBzdGF0aWMgaW50IG9jZnMyX3JvdGF0ZV9yaWdodG1vc3RfbGVhZl9sZWZ0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJCSAgICBoYW5kbGVfdCAqaGFuZGxlLAotCQkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKLQkJCQkJICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwpCisJCQkJCSAgICBzdHJ1Y3Qgb2NmczJfcGF0aCAqcGF0aCkKIHsKIAlpbnQgcmV0OworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBwYXRoX2xlYWZfYmgocGF0aCk7CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCA9IHBhdGhfbGVhZl9lbChwYXRoKTsKIAogCWlmICghb2NmczJfaXNfZW1wdHlfZXh0ZW50KCZlbC0+bF9yZWNzWzBdKSkKIAkJcmV0dXJuIDA7CiAKLQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBiaCwKLQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJcmV0ID0gb2NmczJfcGF0aF9iaF9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBwYXRoLAorCQkJCQkgICBwYXRoX251bV9pdGVtcyhwYXRoKSAtIDEpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dDsKQEAgLTI2NDQsOCArMjc0Myw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWxlZnRfcGF0aCA9IG9jZnMyX25ld19wYXRoKHBhdGhfcm9vdF9iaChwYXRoKSwKLQkJCQkgICBwYXRoX3Jvb3RfZWwocGF0aCkpOworCWxlZnRfcGF0aCA9IG9jZnMyX25ld19wYXRoX2Zyb21fcGF0aChwYXRoKTsKIAlpZiAoIWxlZnRfcGF0aCkgewogCQlyZXQgPSAtRU5PTUVNOwogCQltbG9nX2Vycm5vKHJldCk7CkBAIC0yNjU0LDggKzI3NTIsNyBAQAogCiAJb2NmczJfY3BfcGF0aChsZWZ0X3BhdGgsIHBhdGgpOwogCi0JcmlnaHRfcGF0aCA9IG9jZnMyX25ld19wYXRoKHBhdGhfcm9vdF9iaChwYXRoKSwKLQkJCQkgICAgcGF0aF9yb290X2VsKHBhdGgpKTsKKwlyaWdodF9wYXRoID0gb2NmczJfbmV3X3BhdGhfZnJvbV9wYXRoKHBhdGgpOwogCWlmICghcmlnaHRfcGF0aCkgewogCQlyZXQgPSAtRU5PTUVNOwogCQltbG9nX2Vycm5vKHJldCk7CkBAIC0yNjg5LDkgKzI3ODYsOCBAQAogCQkgKiBDYWxsZXIgbWlnaHQgc3RpbGwgd2FudCB0byBtYWtlIGNoYW5nZXMgdG8gdGhlCiAJCSAqIHRyZWUgcm9vdCwgc28gcmUtYWRkIGl0IHRvIHRoZSBqb3VybmFsIGhlcmUuCiAJCSAqLwotCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLAotCQkJCQkgICBwYXRoX3Jvb3RfYmgobGVmdF9wYXRoKSwKLQkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCQlyZXQgPSBvY2ZzMl9wYXRoX2JoX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsCisJCQkJCQkgICBsZWZ0X3BhdGgsIDApOwogCQlpZiAocmV0KSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlnb3RvIG91dDsKQEAgLTI3ODUsOCArMjg4MSw3IEBACiAJCSAqIFdlIGhhdmUgYSBwYXRoIHRvIHRoZSBsZWZ0IG9mIHRoaXMgb25lIC0gaXQgbmVlZHMKIAkJICogYW4gdXBkYXRlIHRvby4KIAkJICovCi0JCWxlZnRfcGF0aCA9IG9jZnMyX25ld19wYXRoKHBhdGhfcm9vdF9iaChwYXRoKSwKLQkJCQkJICAgcGF0aF9yb290X2VsKHBhdGgpKTsKKwkJbGVmdF9wYXRoID0gb2NmczJfbmV3X3BhdGhfZnJvbV9wYXRoKHBhdGgpOwogCQlpZiAoIWxlZnRfcGF0aCkgewogCQkJcmV0ID0gLUVOT01FTTsKIAkJCW1sb2dfZXJybm8ocmV0KTsKQEAgLTI4NzUsOCArMjk3MCw3IEBACiAJCSAqIGl0IHVwIGZyb250LgogCQkgKi8KIAkJcmV0ID0gb2NmczJfcm90YXRlX3JpZ2h0bW9zdF9sZWFmX2xlZnQoaW5vZGUsIGhhbmRsZSwKLQkJCQkJCSAgICAgICBwYXRoX2xlYWZfYmgocGF0aCksCi0JCQkJCQkgICAgICAgcGF0aF9sZWFmX2VsKHBhdGgpKTsKKwkJCQkJCSAgICAgICBwYXRoKTsKIAkJaWYgKHJldCkKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CkBAIC0zMDI3LDggKzMxMjEsNyBAQAogCS8qIFRoaXMgZnVuY3Rpb24gc2hvdWxkbid0IGJlIGNhbGxlZCBmb3IgdGhlIHJpZ2h0bW9zdCBsZWFmLiAqLwogCUJVR19PTihyaWdodF9jcG9zID09IDApOwogCi0JcmlnaHRfcGF0aCA9IG9jZnMyX25ld19wYXRoKHBhdGhfcm9vdF9iaChsZWZ0X3BhdGgpLAotCQkJCSAgICBwYXRoX3Jvb3RfZWwobGVmdF9wYXRoKSk7CisJcmlnaHRfcGF0aCA9IG9jZnMyX25ld19wYXRoX2Zyb21fcGF0aChsZWZ0X3BhdGgpOwogCWlmICghcmlnaHRfcGF0aCkgewogCQlyZXQgPSAtRU5PTUVNOwogCQltbG9nX2Vycm5vKHJldCk7CkBAIC0zMTExLDggKzMyMDQsOCBAQAogCQlyb290X2JoID0gbGVmdF9wYXRoLT5wX25vZGVbc3VidHJlZV9pbmRleF0uYmg7CiAJCUJVR19PTihyb290X2JoICE9IHJpZ2h0X3BhdGgtPnBfbm9kZVtzdWJ0cmVlX2luZGV4XS5iaCk7CiAKLQkJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgcm9vdF9iaCwKLQkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCQlyZXQgPSBvY2ZzMl9wYXRoX2JoX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHJpZ2h0X3BhdGgsCisJCQkJCQkgICBzdWJ0cmVlX2luZGV4KTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJZ290byBvdXQ7CkBAIC0zMTIwLDE3ICszMjEzLDE1IEBACiAKIAkJZm9yIChpID0gc3VidHJlZV9pbmRleCArIDE7CiAJCSAgICAgaSA8IHBhdGhfbnVtX2l0ZW1zKHJpZ2h0X3BhdGgpOyBpKyspIHsKLQkJCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsCi0JCQkJCQkgICByaWdodF9wYXRoLT5wX25vZGVbaV0uYmgsCi0JCQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJCQlyZXQgPSBvY2ZzMl9wYXRoX2JoX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsCisJCQkJCQkJICAgcmlnaHRfcGF0aCwgaSk7CiAJCQlpZiAocmV0KSB7CiAJCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJCWdvdG8gb3V0OwogCQkJfQogCi0JCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLAotCQkJCQkJICAgbGVmdF9wYXRoLT5wX25vZGVbaV0uYmgsCi0JCQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJCQlyZXQgPSBvY2ZzMl9wYXRoX2JoX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsCisJCQkJCQkJICAgbGVmdF9wYXRoLCBpKTsKIAkJCWlmIChyZXQpIHsKIAkJCQltbG9nX2Vycm5vKHJldCk7CiAJCQkJZ290byBvdXQ7CkBAIC0zMTQyLDggKzMyMzMsOCBAQAogCQlyaWdodF9yZWMgPSAmZWwtPmxfcmVjc1tpbmRleCArIDFdOwogCX0KIAotCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGJoLAotCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlyZXQgPSBvY2ZzMl9wYXRoX2JoX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGxlZnRfcGF0aCwKKwkJCQkJICAgcGF0aF9udW1faXRlbXMobGVmdF9wYXRoKSAtIDEpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dDsKQEAgLTMxOTksOCArMzI5MCw3IEBACiAJLyogVGhpcyBmdW5jdGlvbiBzaG91bGRuJ3QgYmUgY2FsbGVkIGZvciB0aGUgbGVmdG1vc3QgbGVhZi4gKi8KIAlCVUdfT04obGVmdF9jcG9zID09IDApOwogCi0JbGVmdF9wYXRoID0gb2NmczJfbmV3X3BhdGgocGF0aF9yb290X2JoKHJpZ2h0X3BhdGgpLAotCQkJCSAgIHBhdGhfcm9vdF9lbChyaWdodF9wYXRoKSk7CisJbGVmdF9wYXRoID0gb2NmczJfbmV3X3BhdGhfZnJvbV9wYXRoKHJpZ2h0X3BhdGgpOwogCWlmICghbGVmdF9wYXRoKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCW1sb2dfZXJybm8ocmV0KTsKQEAgLTMyODMsOCArMzM3Myw4IEBACiAJCXJvb3RfYmggPSBsZWZ0X3BhdGgtPnBfbm9kZVtzdWJ0cmVlX2luZGV4XS5iaDsKIAkJQlVHX09OKHJvb3RfYmggIT0gcmlnaHRfcGF0aC0+cF9ub2RlW3N1YnRyZWVfaW5kZXhdLmJoKTsKIAotCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCByb290X2JoLAotCQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJCXJldCA9IG9jZnMyX3BhdGhfYmhfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgcmlnaHRfcGF0aCwKKwkJCQkJCSAgIHN1YnRyZWVfaW5kZXgpOwogCQlpZiAocmV0KSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlnb3RvIG91dDsKQEAgLTMyOTIsMTcgKzMzODIsMTUgQEAKIAogCQlmb3IgKGkgPSBzdWJ0cmVlX2luZGV4ICsgMTsKIAkJICAgICBpIDwgcGF0aF9udW1faXRlbXMocmlnaHRfcGF0aCk7IGkrKykgewotCQkJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwKLQkJCQkJCSAgIHJpZ2h0X3BhdGgtPnBfbm9kZVtpXS5iaCwKLQkJCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwkJCXJldCA9IG9jZnMyX3BhdGhfYmhfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwKKwkJCQkJCQkgICByaWdodF9wYXRoLCBpKTsKIAkJCWlmIChyZXQpIHsKIAkJCQltbG9nX2Vycm5vKHJldCk7CiAJCQkJZ290byBvdXQ7CiAJCQl9CiAKLQkJCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsCi0JCQkJCQkgICBsZWZ0X3BhdGgtPnBfbm9kZVtpXS5iaCwKLQkJCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwkJCXJldCA9IG9jZnMyX3BhdGhfYmhfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwKKwkJCQkJCQkgICBsZWZ0X3BhdGgsIGkpOwogCQkJaWYgKHJldCkgewogCQkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCQlnb3RvIG91dDsKQEAgLTMzMTQsOCArMzQwMiw4IEBACiAJCQloYXNfZW1wdHlfZXh0ZW50ID0gMTsKIAl9CiAKLQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBiaCwKLQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJcmV0ID0gb2NmczJfcGF0aF9iaF9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCByaWdodF9wYXRoLAorCQkJCQkgICBwYXRoX251bV9pdGVtcyhyaWdodF9wYXRoKSAtIDEpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dDsKQEAgLTM3MzIsOCArMzgyMCw3IEBACiAJCSAqIGxlZnRtb3N0IGxlYWYuCiAJCSAqLwogCQlpZiAobGVmdF9jcG9zKSB7Ci0JCQlsZWZ0X3BhdGggPSBvY2ZzMl9uZXdfcGF0aChwYXRoX3Jvb3RfYmgocmlnaHRfcGF0aCksCi0JCQkJCQkgICBwYXRoX3Jvb3RfZWwocmlnaHRfcGF0aCkpOworCQkJbGVmdF9wYXRoID0gb2NmczJfbmV3X3BhdGhfZnJvbV9wYXRoKHJpZ2h0X3BhdGgpOwogCQkJaWYgKCFsZWZ0X3BhdGgpIHsKIAkJCQlyZXQgPSAtRU5PTUVNOwogCQkJCW1sb2dfZXJybm8ocmV0KTsKQEAgLTM3ODEsNyArMzg2OCw3IEBACiAJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICpsZWZ0X2VsID0gTlVMTCwgKnJpZ2h0X2VsLCAqaW5zZXJ0X2VsLCAqZWw7CiAJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJlYywgKnRtcHJlYzsKIAotCXJpZ2h0X2VsID0gcGF0aF9sZWFmX2VsKHJpZ2h0X3BhdGgpOzsKKwlyaWdodF9lbCA9IHBhdGhfbGVhZl9lbChyaWdodF9wYXRoKTsKIAlpZiAobGVmdF9wYXRoKQogCQlsZWZ0X2VsID0gcGF0aF9sZWFmX2VsKGxlZnRfcGF0aCk7CiAKQEAgLTM5NTgsOCArNDA0NSw4IEBACiAKIAllbCA9IGV0LT5ldF9yb290X2VsOwogCi0JcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZXQtPmV0X3Jvb3RfYmgsCi0JCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCXJldCA9IG9jZnMyX2V0X3Jvb3Rfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZXQsCisJCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CkBAIC0zOTcwLDcgKzQwNTcsNyBAQAogCQlnb3RvIG91dF91cGRhdGVfY2x1c3RlcnM7CiAJfQogCi0JcmlnaHRfcGF0aCA9IG9jZnMyX25ld19wYXRoKGV0LT5ldF9yb290X2JoLCBldC0+ZXRfcm9vdF9lbCk7CisJcmlnaHRfcGF0aCA9IG9jZnMyX25ld19wYXRoX2Zyb21fZXQoZXQpOwogCWlmICghcmlnaHRfcGF0aCkgewogCQlyZXQgPSAtRU5PTUVNOwogCQltbG9nX2Vycm5vKHJldCk7CkBAIC00MDIwLDggKzQxMDcsOCBAQAogCQkgKiBvY2ZzMl9yb3RhdGVfdHJlZV9yaWdodCgpIG1pZ2h0IGhhdmUgZXh0ZW5kZWQgdGhlCiAJCSAqIHRyYW5zYWN0aW9uIHdpdGhvdXQgcmUtam91cm5hbGluZyBvdXIgdHJlZSByb290LgogCQkgKi8KLQkJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZXQtPmV0X3Jvb3RfYmgsCi0JCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwkJcmV0ID0gb2NmczJfZXRfcm9vdF9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBldCwKKwkJCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJZ290byBvdXQ7CkBAIC00MDgyLDggKzQxNjksNyBAQAogCQkJZ290byBvdXQ7CiAKIAkJaWYgKGxlZnRfY3BvcyAhPSAwKSB7Ci0JCQlsZWZ0X3BhdGggPSBvY2ZzMl9uZXdfcGF0aChwYXRoX3Jvb3RfYmgocGF0aCksCi0JCQkJCQkgICBwYXRoX3Jvb3RfZWwocGF0aCkpOworCQkJbGVmdF9wYXRoID0gb2NmczJfbmV3X3BhdGhfZnJvbV9wYXRoKHBhdGgpOwogCQkJaWYgKCFsZWZ0X3BhdGgpCiAJCQkJZ290byBvdXQ7CiAKQEAgLTQwOTcsOCArNDE4MywxNSBAQAogCQkJICAgIGxlMTZfdG9fY3B1KG5ld19lbC0+bF9jb3VudCkpIHsKIAkJCQliaCA9IHBhdGhfbGVhZl9iaChsZWZ0X3BhdGgpOwogCQkJCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKiliaC0+Yl9kYXRhOwotCQkJCU9DRlMyX1JPX09OX0lOVkFMSURfRVhURU5UX0JMT0NLKGlub2RlLT5pX3NiLAotCQkJCQkJCQkgZWIpOworCQkJCW9jZnMyX2Vycm9yKGlub2RlLT5pX3NiLAorCQkJCQkgICAgIkV4dGVudCBibG9jayAjJWxsdSBoYXMgYW4gIgorCQkJCQkgICAgImludmFsaWQgbF9uZXh0X2ZyZWVfcmVjIG9mICIKKwkJCQkJICAgICIlZC4gIEl0IHNob3VsZCBoYXZlICIKKwkJCQkJICAgICJtYXRjaGVkIHRoZSBsX2NvdW50IG9mICVkIiwKKwkJCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoZWItPmhfYmxrbm8pLAorCQkJCQkgICAgbGUxNl90b19jcHUobmV3X2VsLT5sX25leHRfZnJlZV9yZWMpLAorCQkJCQkgICAgbGUxNl90b19jcHUobmV3X2VsLT5sX2NvdW50KSk7CisJCQkJc3RhdHVzID0gLUVJTlZBTDsKIAkJCQlnb3RvIG91dDsKIAkJCX0KIAkJCXJlYyA9ICZuZXdfZWwtPmxfcmVjc1sKQEAgLTQxMzIsOCArNDIyNSw3IEBACiAJCWlmIChyaWdodF9jcG9zID09IDApCiAJCQlnb3RvIG91dDsKIAotCQlyaWdodF9wYXRoID0gb2NmczJfbmV3X3BhdGgocGF0aF9yb290X2JoKHBhdGgpLAotCQkJCQkgICAgcGF0aF9yb290X2VsKHBhdGgpKTsKKwkJcmlnaHRfcGF0aCA9IG9jZnMyX25ld19wYXRoX2Zyb21fcGF0aChwYXRoKTsKIAkJaWYgKCFyaWdodF9wYXRoKQogCQkJZ290byBvdXQ7CiAKQEAgLTQxNDcsOCArNDIzOSwxMiBAQAogCQkJaWYgKGxlMTZfdG9fY3B1KG5ld19lbC0+bF9uZXh0X2ZyZWVfcmVjKSA8PSAxKSB7CiAJCQkJYmggPSBwYXRoX2xlYWZfYmgocmlnaHRfcGF0aCk7CiAJCQkJZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKWJoLT5iX2RhdGE7Ci0JCQkJT0NGUzJfUk9fT05fSU5WQUxJRF9FWFRFTlRfQkxPQ0soaW5vZGUtPmlfc2IsCi0JCQkJCQkJCSBlYik7CisJCQkJb2NmczJfZXJyb3IoaW5vZGUtPmlfc2IsCisJCQkJCSAgICAiRXh0ZW50IGJsb2NrICMlbGx1IGhhcyBhbiAiCisJCQkJCSAgICAiaW52YWxpZCBsX25leHRfZnJlZV9yZWMgb2YgJWQiLAorCQkJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShlYi0+aF9ibGtubyksCisJCQkJCSAgICBsZTE2X3RvX2NwdShuZXdfZWwtPmxfbmV4dF9mcmVlX3JlYykpOworCQkJCXN0YXR1cyA9IC1FSU5WQUw7CiAJCQkJZ290byBvdXQ7CiAJCQl9CiAJCQlyZWMgPSAmbmV3X2VsLT5sX3JlY3NbMV07CkBAIC00Mjk0LDcgKzQzOTAsOSBAQAogCQkgKiBvY2ZzMl9maWd1cmVfaW5zZXJ0X3R5cGUoKSBhbmQgb2NmczJfYWRkX2JyYW5jaCgpCiAJCSAqIG1heSB3YW50IGl0IGxhdGVyLgogCQkgKi8KLQkJcmV0ID0gb2NmczJfcmVhZF9ibG9jayhpbm9kZSwgb2NmczJfZXRfZ2V0X2xhc3RfZWJfYmxrKGV0KSwgJmJoKTsKKwkJcmV0ID0gb2NmczJfcmVhZF9leHRlbnRfYmxvY2soaW5vZGUsCisJCQkJCSAgICAgIG9jZnMyX2V0X2dldF9sYXN0X2ViX2JsayhldCksCisJCQkJCSAgICAgICZiaCk7CiAJCWlmIChyZXQpIHsKIAkJCW1sb2dfZXhpdChyZXQpOwogCQkJZ290byBvdXQ7CkBAIC00MzIwLDcgKzQ0MTgsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlwYXRoID0gb2NmczJfbmV3X3BhdGgoZXQtPmV0X3Jvb3RfYmgsIGV0LT5ldF9yb290X2VsKTsKKwlwYXRoID0gb2NmczJfbmV3X3BhdGhfZnJvbV9ldChldCk7CiAJaWYgKCFwYXRoKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCW1sb2dfZXJybm8ocmV0KTsKQEAgLTQ1MzEsOSArNDYyOSw5IEBACiAKIAlCVUdfT04obnVtX2JpdHMgPiBjbHVzdGVyc190b19hZGQpOwogCi0JLyogcmVzZXJ2ZSBvdXIgd3JpdGUgZWFybHkgLS0gaW5zZXJ0X2V4dGVudCBtYXkgdXBkYXRlIHRoZSBpbm9kZSAqLwotCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGV0LT5ldF9yb290X2JoLAotCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwkvKiByZXNlcnZlIG91ciB3cml0ZSBlYXJseSAtLSBpbnNlcnRfZXh0ZW50IG1heSB1cGRhdGUgdGhlIHRyZWUgcm9vdCAqLworCXN0YXR1cyA9IG9jZnMyX2V0X3Jvb3Rfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZXQsCisJCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gbGVhdmU7CkBAIC00NzYwLDIwICs0ODU4LDE1IEBACiAJaWYgKHBhdGgtPnBfdHJlZV9kZXB0aCkgewogCQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYjsKIAotCQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBvY2ZzMl9ldF9nZXRfbGFzdF9lYl9ibGsoZXQpLAotCQkJCSAgICAgICAmbGFzdF9lYl9iaCk7CisJCXJldCA9IG9jZnMyX3JlYWRfZXh0ZW50X2Jsb2NrKGlub2RlLAorCQkJCQkgICAgICBvY2ZzMl9ldF9nZXRfbGFzdF9lYl9ibGsoZXQpLAorCQkJCQkgICAgICAmbGFzdF9lYl9iaCk7CiAJCWlmIChyZXQpIHsKIAkJCW1sb2dfZXhpdChyZXQpOwogCQkJZ290byBvdXQ7CiAJCX0KIAogCQllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopIGxhc3RfZWJfYmgtPmJfZGF0YTsKLQkJaWYgKCFPQ0ZTMl9JU19WQUxJRF9FWFRFTlRfQkxPQ0soZWIpKSB7Ci0JCQlPQ0ZTMl9ST19PTl9JTlZBTElEX0VYVEVOVF9CTE9DSyhpbm9kZS0+aV9zYiwgZWIpOwotCQkJcmV0ID0gLUVST0ZTOwotCQkJZ290byBvdXQ7Ci0JCX0KLQogCQlyaWdodG1vc3RfZWwgPSAmZWItPmhfbGlzdDsKIAl9IGVsc2UKIAkJcmlnaHRtb3N0X2VsID0gcGF0aF9yb290X2VsKHBhdGgpOwpAQCAtNDg1NCw3ICs0OTQ3LDcgQEAKIAlpZiAoZXQtPmV0X29wcyA9PSAmb2NmczJfZGlub2RlX2V0X29wcykKIAkJb2NmczJfZXh0ZW50X21hcF90cnVuYyhpbm9kZSwgMCk7CiAKLQlsZWZ0X3BhdGggPSBvY2ZzMl9uZXdfcGF0aChldC0+ZXRfcm9vdF9iaCwgZXQtPmV0X3Jvb3RfZWwpOworCWxlZnRfcGF0aCA9IG9jZnMyX25ld19wYXRoX2Zyb21fZXQoZXQpOwogCWlmICghbGVmdF9wYXRoKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCW1sb2dfZXJybm8ocmV0KTsKQEAgLTQ5MTgsOCArNTAxMSw5IEBACiAKIAlkZXB0aCA9IHBhdGgtPnBfdHJlZV9kZXB0aDsKIAlpZiAoZGVwdGggPiAwKSB7Ci0JCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIG9jZnMyX2V0X2dldF9sYXN0X2ViX2JsayhldCksCi0JCQkJICAgICAgICZsYXN0X2ViX2JoKTsKKwkJcmV0ID0gb2NmczJfcmVhZF9leHRlbnRfYmxvY2soaW5vZGUsCisJCQkJCSAgICAgIG9jZnMyX2V0X2dldF9sYXN0X2ViX2JsayhldCksCisJCQkJCSAgICAgICZsYXN0X2ViX2JoKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCWdvdG8gb3V0OwpAQCAtNTAyNSw4ICs1MTE5LDcgQEAKIAkJfQogCiAJCWlmIChsZWZ0X2Nwb3MgJiYgbGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYykgPiAxKSB7Ci0JCQlsZWZ0X3BhdGggPSBvY2ZzMl9uZXdfcGF0aChwYXRoX3Jvb3RfYmgocGF0aCksCi0JCQkJCQkgICBwYXRoX3Jvb3RfZWwocGF0aCkpOworCQkJbGVmdF9wYXRoID0gb2NmczJfbmV3X3BhdGhfZnJvbV9wYXRoKHBhdGgpOwogCQkJaWYgKCFsZWZ0X3BhdGgpIHsKIAkJCQlyZXQgPSAtRU5PTUVNOwogCQkJCW1sb2dfZXJybm8ocmV0KTsKQEAgLTUxMzUsNyArNTIyOCw3IEBACiAKIAlvY2ZzMl9leHRlbnRfbWFwX3RydW5jKGlub2RlLCAwKTsKIAotCXBhdGggPSBvY2ZzMl9uZXdfcGF0aChldC0+ZXRfcm9vdF9iaCwgZXQtPmV0X3Jvb3RfZWwpOworCXBhdGggPSBvY2ZzMl9uZXdfcGF0aF9mcm9tX2V0KGV0KTsKIAlpZiAoIXBhdGgpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJbWxvZ19lcnJubyhyZXQpOwpAQCAtNTI1NSw2ICs1MzQ4LDc4IEBACiAJcmV0dXJuIHJldDsKIH0KIAoraW50IG9jZnMyX3JlbW92ZV9idHJlZV9yYW5nZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgKmV0LAorCQkJICAgICB1MzIgY3BvcywgdTMyIHBoeXNfY3BvcywgdTMyIGxlbiwKKwkJCSAgICAgc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmRlYWxsb2MpCit7CisJaW50IHJldDsKKwl1NjQgcGh5c19ibGtubyA9IG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgcGh5c19jcG9zKTsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3QgaW5vZGUgKnRsX2lub2RlID0gb3NiLT5vc2JfdGxfaW5vZGU7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYyA9IE5VTEw7CisKKwlyZXQgPSBvY2ZzMl9sb2NrX2FsbG9jYXRvcnMoaW5vZGUsIGV0LCAwLCAxLCBOVUxMLCAmbWV0YV9hYyk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJbXV0ZXhfbG9jaygmdGxfaW5vZGUtPmlfbXV0ZXgpOworCisJaWYgKG9jZnMyX3RydW5jYXRlX2xvZ19uZWVkc19mbHVzaChvc2IpKSB7CisJCXJldCA9IF9fb2NmczJfZmx1c2hfdHJ1bmNhdGVfbG9nKG9zYik7CisJCWlmIChyZXQgPCAwKSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgb2NmczJfcmVtb3ZlX2V4dGVudF9jcmVkaXRzKG9zYi0+c2IpKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG9jZnMyX2V0X3Jvb3Rfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZXQsCisJCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfcmVtb3ZlX2V4dGVudChpbm9kZSwgZXQsIGNwb3MsIGxlbiwgaGFuZGxlLCBtZXRhX2FjLAorCQkJCSAgZGVhbGxvYyk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0X2NvbW1pdDsKKwl9CisKKwlvY2ZzMl9ldF91cGRhdGVfY2x1c3RlcnMoaW5vZGUsIGV0LCAtbGVuKTsKKworCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBldC0+ZXRfcm9vdF9iaCk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0X2NvbW1pdDsKKwl9CisKKwlyZXQgPSBvY2ZzMl90cnVuY2F0ZV9sb2dfYXBwZW5kKG9zYiwgaGFuZGxlLCBwaHlzX2Jsa25vLCBsZW4pOworCWlmIChyZXQpCisJCW1sb2dfZXJybm8ocmV0KTsKKworb3V0X2NvbW1pdDoKKwlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOworb3V0OgorCW11dGV4X3VubG9jaygmdGxfaW5vZGUtPmlfbXV0ZXgpOworCisJaWYgKG1ldGFfYWMpCisJCW9jZnMyX2ZyZWVfYWxsb2NfY29udGV4dChtZXRhX2FjKTsKKworCXJldHVybiByZXQ7Cit9CisKIGludCBvY2ZzMl90cnVuY2F0ZV9sb2dfbmVlZHNfZmx1c2goc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICp0bF9iaCA9IG9zYi0+b3NiX3RsX2JoOwpAQCAtNTMwOCwxMyArNTQ3MywxMyBAQAogCXN0YXJ0X2NsdXN0ZXIgPSBvY2ZzMl9ibG9ja3NfdG9fY2x1c3RlcnMob3NiLT5zYiwgc3RhcnRfYmxrKTsKIAogCWRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKikgdGxfYmgtPmJfZGF0YTsKLQl0bCA9ICZkaS0+aWQyLmlfZGVhbGxvYzsKLQlpZiAoIU9DRlMyX0lTX1ZBTElEX0RJTk9ERShkaSkpIHsKLQkJT0NGUzJfUk9fT05fSU5WQUxJRF9ESU5PREUob3NiLT5zYiwgZGkpOwotCQlzdGF0dXMgPSAtRUlPOwotCQlnb3RvIGJhaWw7Ci0JfQogCisJLyogdGxfYmggaXMgbG9hZGVkIGZyb20gb2NmczJfdHJ1bmNhdGVfbG9nX2luaXQoKS4gIEl0J3MgdmFsaWRhdGVkCisJICogYnkgdGhlIHVuZGVybHlpbmcgY2FsbCB0byBvY2ZzMl9yZWFkX2lub2RlX2Jsb2NrKCksIHNvIGFueQorCSAqIGNvcnJ1cHRpb24gaXMgYSBjb2RlIGJ1ZyAqLworCUJVR19PTighT0NGUzJfSVNfVkFMSURfRElOT0RFKGRpKSk7CisKKwl0bCA9ICZkaS0+aWQyLmlfZGVhbGxvYzsKIAl0bF9jb3VudCA9IGxlMTZfdG9fY3B1KHRsLT50bF9jb3VudCk7CiAJbWxvZ19idWdfb25fbXNnKHRsX2NvdW50ID4gb2NmczJfdHJ1bmNhdGVfcmVjc19wZXJfaW5vZGUob3NiLT5zYikgfHwKIAkJCXRsX2NvdW50ID09IDAsCkBAIC01MzMyLDggKzU0OTcsOCBAQAogCQlnb3RvIGJhaWw7CiAJfQogCi0Jc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCB0bF9pbm9kZSwgdGxfYmgsCi0JCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RpKGhhbmRsZSwgdGxfaW5vZGUsIHRsX2JoLAorCQkJCQkgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBiYWlsOwpAQCAtNTM5NCw4ICs1NTU5LDggQEAKIAl3aGlsZSAoaSA+PSAwKSB7CiAJCS8qIENhbGxlciBoYXMgZ2l2ZW4gdXMgYXQgbGVhc3QgZW5vdWdoIGNyZWRpdHMgdG8KIAkJICogdXBkYXRlIHRoZSB0cnVuY2F0ZSBsb2cgZGlub2RlICovCi0JCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgdGxfaW5vZGUsIHRsX2JoLAotCQkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RpKGhhbmRsZSwgdGxfaW5vZGUsIHRsX2JoLAorCQkJCQkJIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJCWdvdG8gYmFpbDsKQEAgLTU0NjQsMTMgKzU2MjksMTMgQEAKIAlCVUdfT04obXV0ZXhfdHJ5bG9jaygmdGxfaW5vZGUtPmlfbXV0ZXgpKTsKIAogCWRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKikgdGxfYmgtPmJfZGF0YTsKLQl0bCA9ICZkaS0+aWQyLmlfZGVhbGxvYzsKLQlpZiAoIU9DRlMyX0lTX1ZBTElEX0RJTk9ERShkaSkpIHsKLQkJT0NGUzJfUk9fT05fSU5WQUxJRF9ESU5PREUob3NiLT5zYiwgZGkpOwotCQlzdGF0dXMgPSAtRUlPOwotCQlnb3RvIG91dDsKLQl9CiAKKwkvKiB0bF9iaCBpcyBsb2FkZWQgZnJvbSBvY2ZzMl90cnVuY2F0ZV9sb2dfaW5pdCgpLiAgSXQncyB2YWxpZGF0ZWQKKwkgKiBieSB0aGUgdW5kZXJseWluZyBjYWxsIHRvIG9jZnMyX3JlYWRfaW5vZGVfYmxvY2soKSwgc28gYW55CisJICogY29ycnVwdGlvbiBpcyBhIGNvZGUgYnVnICovCisJQlVHX09OKCFPQ0ZTMl9JU19WQUxJRF9ESU5PREUoZGkpKTsKKworCXRsID0gJmRpLT5pZDIuaV9kZWFsbG9jOwogCW51bV90b19mbHVzaCA9IGxlMTZfdG9fY3B1KHRsLT50bF91c2VkKTsKIAltbG9nKDAsICJGbHVzaCAldSByZWNvcmRzIGZyb20gdHJ1bmNhdGUgbG9nICMlbGx1XG4iLAogCSAgICAgbnVtX3RvX2ZsdXNoLCAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0kodGxfaW5vZGUpLT5pcF9ibGtubyk7CkBAIC01NTg2LDcgKzU3NTEsNyBAQAogCQlnb3RvIGJhaWw7CiAJfQogCi0Jc3RhdHVzID0gb2NmczJfcmVhZF9ibG9jayhpbm9kZSwgT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLCAmYmgpOworCXN0YXR1cyA9IG9jZnMyX3JlYWRfaW5vZGVfYmxvY2soaW5vZGUsICZiaCk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJaXB1dChpbm9kZSk7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKQEAgLTU2MjUsMTMgKzU3OTAsMTMgQEAKIAl9CiAKIAlkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopIHRsX2JoLT5iX2RhdGE7Ci0JdGwgPSAmZGktPmlkMi5pX2RlYWxsb2M7Ci0JaWYgKCFPQ0ZTMl9JU19WQUxJRF9ESU5PREUoZGkpKSB7Ci0JCU9DRlMyX1JPX09OX0lOVkFMSURfRElOT0RFKHRsX2lub2RlLT5pX3NiLCBkaSk7Ci0JCXN0YXR1cyA9IC1FSU87Ci0JCWdvdG8gYmFpbDsKLQl9CiAKKwkvKiB0bF9iaCBpcyBsb2FkZWQgZnJvbSBvY2ZzMl9nZXRfdHJ1bmNhdGVfbG9nX2luZm8oKS4gIEl0J3MKKwkgKiB2YWxpZGF0ZWQgYnkgdGhlIHVuZGVybHlpbmcgY2FsbCB0byBvY2ZzMl9yZWFkX2lub2RlX2Jsb2NrKCksCisJICogc28gYW55IGNvcnJ1cHRpb24gaXMgYSBjb2RlIGJ1ZyAqLworCUJVR19PTighT0NGUzJfSVNfVkFMSURfRElOT0RFKGRpKSk7CisKKwl0bCA9ICZkaS0+aWQyLmlfZGVhbGxvYzsKIAlpZiAobGUxNl90b19jcHUodGwtPnRsX3VzZWQpKSB7CiAJCW1sb2coMCwgIldlJ2xsIGhhdmUgJXUgbG9ncyB0byByZWNvdmVyXG4iLAogCQkgICAgIGxlMTZfdG9fY3B1KHRsLT50bF91c2VkKSk7CkBAIC01NjUxLDYgKzU4MTYsNyBAQAogCQkgKiB0bF91c2VkLiAqLwogCQl0bC0+dGxfdXNlZCA9IDA7CiAKKwkJb2NmczJfY29tcHV0ZV9tZXRhX2VjYyhvc2ItPnNiLCB0bF9iaC0+Yl9kYXRhLCAmZGktPmlfY2hlY2spOwogCQlzdGF0dXMgPSBvY2ZzMl93cml0ZV9ibG9jayhvc2IsIHRsX2JoLCB0bF9pbm9kZSk7CiAJCWlmIChzdGF0dXMgPCAwKSB7CiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC01ODAwLDcgKzU5NjYsMTAgQEAKICAqLwogCiAvKgotICogRGVzY3JpYmVzIGEgc2luZ2xlIGJsb2NrIGZyZWUgZnJvbSBhIHN1YmFsbG9jYXRvcgorICogRGVzY3JpYmUgYSBzaW5nbGUgYml0IGZyZWVkIGZyb20gYSBzdWJhbGxvY2F0b3IuICBGb3IgdGhlIGJsb2NrCisgKiBzdWJhbGxvY2F0b3JzLCBpdCByZXByZXNlbnRzIG9uZSBibG9jay4gIEZvciB0aGUgZ2xvYmFsIGNsdXN0ZXIKKyAqIGFsbG9jYXRvciwgaXQgcmVwcmVzZW50cyBzb21lIGNsdXN0ZXJzIGFuZCBmcmVlX2JpdCBpbmRpY2F0ZXMKKyAqIGNsdXN0ZXJzIG51bWJlci4KICAqLwogc3RydWN0IG9jZnMyX2NhY2hlZF9ibG9ja19mcmVlIHsKIAlzdHJ1Y3Qgb2NmczJfY2FjaGVkX2Jsb2NrX2ZyZWUJCSpmcmVlX25leHQ7CkBAIC01ODE1LDEwICs1OTg0LDEwIEBACiAJc3RydWN0IG9jZnMyX2NhY2hlZF9ibG9ja19mcmVlCQkqZl9maXJzdDsKIH07CiAKLXN0YXRpYyBpbnQgb2NmczJfZnJlZV9jYWNoZWRfaXRlbXMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkJICAgaW50IHN5c2ZpbGVfdHlwZSwKLQkJCQkgICBpbnQgc2xvdCwKLQkJCQkgICBzdHJ1Y3Qgb2NmczJfY2FjaGVkX2Jsb2NrX2ZyZWUgKmhlYWQpCitzdGF0aWMgaW50IG9jZnMyX2ZyZWVfY2FjaGVkX2Jsb2NrcyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKKwkJCQkgICAgaW50IHN5c2ZpbGVfdHlwZSwKKwkJCQkgICAgaW50IHNsb3QsCisJCQkJICAgIHN0cnVjdCBvY2ZzMl9jYWNoZWRfYmxvY2tfZnJlZSAqaGVhZCkKIHsKIAlpbnQgcmV0OwogCXU2NCBiZ19ibGtubzsKQEAgLTU4OTMsNiArNjA2Miw4MiBAQAogCXJldHVybiByZXQ7CiB9CiAKK2ludCBvY2ZzMl9jYWNoZV9jbHVzdGVyX2RlYWxsb2Moc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmN0eHQsCisJCQkJdTY0IGJsa25vLCB1bnNpZ25lZCBpbnQgYml0KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBvY2ZzMl9jYWNoZWRfYmxvY2tfZnJlZSAqaXRlbTsKKworCWl0ZW0gPSBrbWFsbG9jKHNpemVvZigqaXRlbSksIEdGUF9OT0ZTKTsKKwlpZiAoaXRlbSA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwltbG9nKDAsICJJbnNlcnQgY2x1c3RlcnM6IChiaXQgJXUsIGJsayAlbGx1KVxuIiwKKwkgICAgIGJpdCwgKHVuc2lnbmVkIGxvbmcgbG9uZylibGtubyk7CisKKwlpdGVtLT5mcmVlX2JsayA9IGJsa25vOworCWl0ZW0tPmZyZWVfYml0ID0gYml0OworCWl0ZW0tPmZyZWVfbmV4dCA9IGN0eHQtPmNfZ2xvYmFsX2FsbG9jYXRvcjsKKworCWN0eHQtPmNfZ2xvYmFsX2FsbG9jYXRvciA9IGl0ZW07CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvY2ZzMl9mcmVlX2NhY2hlZF9jbHVzdGVycyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKKwkJCQkgICAgICBzdHJ1Y3Qgb2NmczJfY2FjaGVkX2Jsb2NrX2ZyZWUgKmhlYWQpCit7CisJc3RydWN0IG9jZnMyX2NhY2hlZF9ibG9ja19mcmVlICp0bXA7CisJc3RydWN0IGlub2RlICp0bF9pbm9kZSA9IG9zYi0+b3NiX3RsX2lub2RlOworCWhhbmRsZV90ICpoYW5kbGU7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZ0bF9pbm9kZS0+aV9tdXRleCk7CisKKwl3aGlsZSAoaGVhZCkgeworCQlpZiAob2NmczJfdHJ1bmNhdGVfbG9nX25lZWRzX2ZsdXNoKG9zYikpIHsKKwkJCXJldCA9IF9fb2NmczJfZmx1c2hfdHJ1bmNhdGVfbG9nKG9zYik7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgT0NGUzJfVFJVTkNBVEVfTE9HX1VQREFURSk7CisJCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJYnJlYWs7CisJCX0KKworCQlyZXQgPSBvY2ZzMl90cnVuY2F0ZV9sb2dfYXBwZW5kKG9zYiwgaGFuZGxlLCBoZWFkLT5mcmVlX2JsaywKKwkJCQkJCWhlYWQtPmZyZWVfYml0KTsKKworCQlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOworCQl0bXAgPSBoZWFkOworCQloZWFkID0gaGVhZC0+ZnJlZV9uZXh0OworCQlrZnJlZSh0bXApOworCisJCWlmIChyZXQgPCAwKSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCW11dGV4X3VubG9jaygmdGxfaW5vZGUtPmlfbXV0ZXgpOworCisJd2hpbGUgKGhlYWQpIHsKKwkJLyogUHJlbWF0dXJlIGV4aXQgbWF5IGhhdmUgbGVmdCBzb21lIGRhbmdsaW5nIGl0ZW1zLiAqLworCQl0bXAgPSBoZWFkOworCQloZWFkID0gaGVhZC0+ZnJlZV9uZXh0OworCQlrZnJlZSh0bXApOworCX0KKworCXJldHVybiByZXQ7Cit9CisKIGludCBvY2ZzMl9ydW5fZGVhbGxvY3Moc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCSAgICAgICBzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqY3R4dCkKIHsKQEAgLTU5MDgsOCArNjE1MywxMCBAQAogCQlpZiAoZmwtPmZfZmlyc3QpIHsKIAkJCW1sb2coMCwgIkZyZWUgaXRlbXM6ICh0eXBlICV1LCBzbG90ICVkKVxuIiwKIAkJCSAgICAgZmwtPmZfaW5vZGVfdHlwZSwgZmwtPmZfc2xvdCk7Ci0JCQlyZXQyID0gb2NmczJfZnJlZV9jYWNoZWRfaXRlbXMob3NiLCBmbC0+Zl9pbm9kZV90eXBlLAotCQkJCQkJICAgICAgIGZsLT5mX3Nsb3QsIGZsLT5mX2ZpcnN0KTsKKwkJCXJldDIgPSBvY2ZzMl9mcmVlX2NhY2hlZF9ibG9ja3Mob3NiLAorCQkJCQkJCWZsLT5mX2lub2RlX3R5cGUsCisJCQkJCQkJZmwtPmZfc2xvdCwKKwkJCQkJCQlmbC0+Zl9maXJzdCk7CiAJCQlpZiAocmV0MikKIAkJCQltbG9nX2Vycm5vKHJldDIpOwogCQkJaWYgKCFyZXQpCkBAIC01OTIwLDYgKzYxNjcsMTcgQEAKIAkJa2ZyZWUoZmwpOwogCX0KIAorCWlmIChjdHh0LT5jX2dsb2JhbF9hbGxvY2F0b3IpIHsKKwkJcmV0MiA9IG9jZnMyX2ZyZWVfY2FjaGVkX2NsdXN0ZXJzKG9zYiwKKwkJCQkJCSAgY3R4dC0+Y19nbG9iYWxfYWxsb2NhdG9yKTsKKwkJaWYgKHJldDIpCisJCQltbG9nX2Vycm5vKHJldDIpOworCQlpZiAoIXJldCkKKwkJCXJldCA9IHJldDI7CisKKwkJY3R4dC0+Y19nbG9iYWxfYWxsb2NhdG9yID0gTlVMTDsKKwl9CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC02MDc1LDExICs2MzMzLDEwIEBACiAKIAllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopIGJoLT5iX2RhdGE7CiAJZWwgPSAmZWItPmhfbGlzdDsKLQlpZiAoIU9DRlMyX0lTX1ZBTElEX0VYVEVOVF9CTE9DSyhlYikpIHsKLQkJT0NGUzJfUk9fT05fSU5WQUxJRF9FWFRFTlRfQkxPQ0soaW5vZGUtPmlfc2IsIGViKTsKLQkJcmV0ID0gLUVST0ZTOwotCQlnb3RvIG91dDsKLQl9CisKKwkvKiBvY2ZzMl9maW5kX2xlYWYoKSBnZXRzIHRoZSBlYiBmcm9tIG9jZnMyX3JlYWRfZXh0ZW50X2Jsb2NrKCkuCisJICogQW55IGNvcnJ1cHRpb24gaXMgYSBjb2RlIGJ1Zy4gKi8KKwlCVUdfT04oIU9DRlMyX0lTX1ZBTElEX0VYVEVOVF9CTE9DSyhlYikpOwogCiAJKm5ld19sYXN0X2ViID0gYmg7CiAJZ2V0X2JoKCpuZXdfbGFzdF9lYik7CkBAIC02MzI2LDggKzY1ODMsOCBAQAogCX0KIAogCWlmIChsYXN0X2ViX2JoKSB7Ci0JCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGxhc3RfZWJfYmgsCi0JCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwkJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZWIoaGFuZGxlLCBpbm9kZSwgbGFzdF9lYl9iaCwKKwkJCQkJCSBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJCWlmIChzdGF0dXMgPCAwKSB7CiAJCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCQlnb3RvIGJhaWw7CkBAIC02MzUwLDYgKzY2MDcsOCBAQAogCQlnb3RvIGJhaWw7CiAJfQogCisJdmZzX2RxX2ZyZWVfc3BhY2Vfbm9kaXJ0eShpbm9kZSwKKwkJCW9jZnMyX2NsdXN0ZXJzX3RvX2J5dGVzKG9zYi0+c2IsIGNsdXN0ZXJzX3RvX2RlbCkpOwogCXNwaW5fbG9jaygmT0NGUzJfSShpbm9kZSktPmlwX2xvY2spOwogCU9DRlMyX0koaW5vZGUpLT5pcF9jbHVzdGVycyA9IGxlMzJfdG9fY3B1KGZlLT5pX2NsdXN0ZXJzKSAtCiAJCQkJICAgICAgY2x1c3RlcnNfdG9fZGVsOwpAQCAtNjQzNiwxMSArNjY5NSw2IEBACiAJCW1sb2dfZXJybm8ocmV0KTsKIAllbHNlIGlmIChvY2ZzMl9zaG91bGRfb3JkZXJfZGF0YShpbm9kZSkpIHsKIAkJcmV0ID0gb2NmczJfamJkMl9maWxlX2lub2RlKGhhbmRsZSwgaW5vZGUpOwotI2lmZGVmIENPTkZJR19PQ0ZTMl9DT01QQVRfSkJECi0JCXJldCA9IHdhbGtfcGFnZV9idWZmZXJzKGhhbmRsZSwgcGFnZV9idWZmZXJzKHBhZ2UpLAotCQkJCQlmcm9tLCB0bywgJnBhcnRpYWwsCi0JCQkJCW9jZnMyX2pvdXJuYWxfZGlydHlfZGF0YSk7Ci0jZW5kaWYKIAkJaWYgKHJldCA8IDApCiAJCQltbG9nX2Vycm5vKHJldCk7CiAJfQpAQCAtNjY2Myw2ICs2OTE3LDcgQEAKIAlzdHJ1Y3QgcGFnZSAqKnBhZ2VzID0gTlVMTDsKIAlsb2ZmX3QgZW5kID0gb3NiLT5zX2NsdXN0ZXJzaXplOwogCXN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSBldDsKKwlpbnQgZGlkX3F1b3RhID0gMDsKIAogCWhhc19kYXRhID0gaV9zaXplX3JlYWQoaW5vZGUpID8gMSA6IDA7CiAKQEAgLTY2ODIsMTUgKzY5MzcsMTYgQEAKIAkJfQogCX0KIAotCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgT0NGUzJfSU5MSU5FX1RPX0VYVEVOVFNfQ1JFRElUUyk7CisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLAorCQkJCSAgIG9jZnMyX2lubGluZV90b19leHRlbnRzX2NyZWRpdHMob3NiLT5zYikpOwogCWlmIChJU19FUlIoaGFuZGxlKSkgewogCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KIAotCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGRpX2JoLAotCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19kaShoYW5kbGUsIGlub2RlLCBkaV9iaCwKKwkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0X2NvbW1pdDsKQEAgLTY3MDEsNiArNjk1NywxMyBAQAogCQl1bnNpZ25lZCBpbnQgcGFnZV9lbmQ7CiAJCXU2NCBwaHlzOwogCisJCWlmICh2ZnNfZHFfYWxsb2Nfc3BhY2Vfbm9kaXJ0eShpbm9kZSwKKwkJCQkgICAgICAgb2NmczJfY2x1c3RlcnNfdG9fYnl0ZXMob3NiLT5zYiwgMSkpKSB7CisJCQlyZXQgPSAtRURRVU9UOworCQkJZ290byBvdXRfY29tbWl0OworCQl9CisJCWRpZF9xdW90YSA9IDE7CisKIAkJcmV0ID0gb2NmczJfY2xhaW1fY2x1c3RlcnMob3NiLCBoYW5kbGUsIGRhdGFfYWMsIDEsICZiaXRfb2ZmLAogCQkJCQkgICAmbnVtKTsKIAkJaWYgKHJldCkgewpAQCAtNjc3NCw2ICs3MDM3LDEwIEBACiAJfQogCiBvdXRfY29tbWl0OgorCWlmIChyZXQgPCAwICYmIGRpZF9xdW90YSkKKwkJdmZzX2RxX2ZyZWVfc3BhY2Vfbm9kaXJ0eShpbm9kZSwKKwkJCQkJICBvY2ZzMl9jbHVzdGVyc190b19ieXRlcyhvc2ItPnNiLCAxKSk7CisKIAlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOwogCiBvdXRfdW5sb2NrOgpAQCAtNjgxMyw3ICs3MDgwLDggQEAKIAluZXdfaGlnaGVzdF9jcG9zID0gb2NmczJfY2x1c3RlcnNfZm9yX2J5dGVzKG9zYi0+c2IsCiAJCQkJCQkgICAgIGlfc2l6ZV9yZWFkKGlub2RlKSk7CiAKLQlwYXRoID0gb2NmczJfbmV3X3BhdGgoZmVfYmgsICZkaS0+aWQyLmlfbGlzdCk7CisJcGF0aCA9IG9jZnMyX25ld19wYXRoKGZlX2JoLCAmZGktPmlkMi5pX2xpc3QsCisJCQkgICAgICBvY2ZzMl9qb3VybmFsX2FjY2Vzc19kaSk7CiAJaWYgKCFwYXRoKSB7CiAJCXN0YXR1cyA9IC1FTk9NRU07CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKQEAgLTY5ODQsMjAgKzcyNTIsMTQgQEAKIAlvY2ZzMl9pbml0X2RlYWxsb2NfY3R4dCgmKCp0YyktPnRjX2RlYWxsb2MpOwogCiAJaWYgKGZlLT5pZDIuaV9saXN0LmxfdHJlZV9kZXB0aCkgewotCQlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBsZTY0X3RvX2NwdShmZS0+aV9sYXN0X2ViX2JsayksCi0JCQkJCSAgJmxhc3RfZWJfYmgpOworCQlzdGF0dXMgPSBvY2ZzMl9yZWFkX2V4dGVudF9ibG9jayhpbm9kZSwKKwkJCQkJCSBsZTY0X3RvX2NwdShmZS0+aV9sYXN0X2ViX2JsayksCisJCQkJCQkgJmxhc3RfZWJfYmgpOwogCQlpZiAoc3RhdHVzIDwgMCkgewogCQkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQkJZ290byBiYWlsOwogCQl9CiAJCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKikgbGFzdF9lYl9iaC0+Yl9kYXRhOwotCQlpZiAoIU9DRlMyX0lTX1ZBTElEX0VYVEVOVF9CTE9DSyhlYikpIHsKLQkJCU9DRlMyX1JPX09OX0lOVkFMSURfRVhURU5UX0JMT0NLKGlub2RlLT5pX3NiLCBlYik7Ci0KLQkJCWJyZWxzZShsYXN0X2ViX2JoKTsKLQkJCXN0YXR1cyA9IC1FSU87Ci0JCQlnb3RvIGJhaWw7Ci0JCX0KIAl9CiAKIAkoKnRjKS0+dGNfbGFzdF9lYl9iaCA9IGxhc3RfZWJfYmg7CkBAIC03MDUyLDggKzczMTQsOCBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBkaV9iaCwKLQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZGkoaGFuZGxlLCBpbm9kZSwgZGlfYmgsCisJCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dF9jb21taXQ7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9hbGxvYy5oIGIvZnMvb2NmczIvYWxsb2MuaAppbmRleCA3MDI1N2M4Li5jY2VmZjVjIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9hbGxvYy5oCisrKyBiL2ZzL29jZnMyL2FsbG9jLmgKQEAgLTQ1LDcgKzQ1LDkgQEAKICAqCiAgKiBvY2ZzMl9leHRlbnRfdHJlZSBjb250YWlucyBpbmZvIGZvciB0aGUgcm9vdCBvZiB0aGUgYi10cmVlLCBpdCBtdXN0IGhhdmUgYQogICogcm9vdCBvY2ZzMl9leHRlbnRfbGlzdCBhbmQgYSByb290X2JoIHNvIHRoYXQgdGhleSBjYW4gYmUgdXNlZCBpbiB0aGUgYi10cmVlCi0gKiBmdW5jdGlvbnMuCisgKiBmdW5jdGlvbnMuICBXaXRoIG1ldGFkYXRhIGVjYywgd2Ugbm93IGNhbGwgZGlmZmVyZW50IGpvdXJuYWxfYWNjZXNzCisgKiBmdW5jdGlvbnMgZm9yIGVhY2ggdHlwZSBvZiBtZXRhZGF0YSwgc28gaXQgbXVzdCBoYXZlIHRoZQorICogcm9vdF9qb3VybmFsX2FjY2VzcyBmdW5jdGlvbi4KICAqIG9jZnMyX2V4dGVudF90cmVlX29wZXJhdGlvbnMgYWJzdHJhY3QgdGhlIG5vcm1hbCBvcGVyYXRpb25zIHdlIGRvIGZvcgogICogdGhlIHJvb3Qgb2YgZXh0ZW50IGItdHJlZS4KICAqLwpAQCAtNTQsNiArNTYsNyBAQAogCXN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZV9vcGVyYXRpb25zCSpldF9vcHM7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkCQkJKmV0X3Jvb3RfYmg7CiAJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0CQkqZXRfcm9vdF9lbDsKKwlvY2ZzMl9qb3VybmFsX2FjY2Vzc19mdW5jCQlldF9yb290X2pvdXJuYWxfYWNjZXNzOwogCXZvaWQJCQkJCSpldF9vYmplY3Q7CiAJdW5zaWduZWQgaW50CQkJCWV0X21heF9sZWFmX2NsdXN0ZXJzOwogfTsKQEAgLTY4LDEwICs3MSwxOCBAQAogdm9pZCBvY2ZzMl9pbml0X3hhdHRyX3RyZWVfZXh0ZW50X3RyZWUoc3RydWN0IG9jZnMyX2V4dGVudF90cmVlICpldCwKIAkJCQkgICAgICAgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CitzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfYnVmOwogdm9pZCBvY2ZzMl9pbml0X3hhdHRyX3ZhbHVlX2V4dGVudF90cmVlKHN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSAqZXQsCiAJCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCi0JCQkJCXN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9yb290ICp4dik7CisJCQkJCXN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9idWYgKnZiKTsKKworLyoKKyAqIFJlYWQgYW4gZXh0ZW50IGJsb2NrIGludG8gKmJoLiAgSWYgKmJoIGlzIE5VTEwsIGEgYmggd2lsbCBiZQorICogYWxsb2NhdGVkLiAgVGhpcyBpcyBhIGNhY2hlZCByZWFkLiAgVGhlIGV4dGVudCBibG9jayB3aWxsIGJlIHZhbGlkYXRlZAorICogd2l0aCBvY2ZzMl92YWxpZGF0ZV9leHRlbnRfYmxvY2soKS4KKyAqLworaW50IG9jZnMyX3JlYWRfZXh0ZW50X2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCBlYl9ibGtubywKKwkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaCk7CiAKIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0OwogaW50IG9jZnMyX2luc2VydF9leHRlbnQoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCkBAIC0xMTAsNiArMTIxLDExIEBACiAJCQl1MzIgY3BvcywgdTMyIGxlbiwgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjLAogCQkJc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmRlYWxsb2MpOworaW50IG9jZnMyX3JlbW92ZV9idHJlZV9yYW5nZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgKmV0LAorCQkJICAgICB1MzIgY3BvcywgdTMyIHBoeXNfY3BvcywgdTMyIGxlbiwKKwkJCSAgICAgc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmRlYWxsb2MpOworCiBpbnQgb2NmczJfbnVtX2ZyZWVfZXh0ZW50cyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKIAkJCSAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgKmV0KTsKQEAgLTE2NywxMCArMTgzLDE4IEBACiAgKi8KIHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0IHsKIAlzdHJ1Y3Qgb2NmczJfcGVyX3Nsb3RfZnJlZV9saXN0CQkqY19maXJzdF9zdWJhbGxvY2F0b3I7CisJc3RydWN0IG9jZnMyX2NhY2hlZF9ibG9ja19mcmVlIAkJKmNfZ2xvYmFsX2FsbG9jYXRvcjsKIH07CiBzdGF0aWMgaW5saW5lIHZvaWQgb2NmczJfaW5pdF9kZWFsbG9jX2N0eHQoc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmMpCiB7CiAJYy0+Y19maXJzdF9zdWJhbGxvY2F0b3IgPSBOVUxMOworCWMtPmNfZ2xvYmFsX2FsbG9jYXRvciA9IE5VTEw7Cit9CitpbnQgb2NmczJfY2FjaGVfY2x1c3Rlcl9kZWFsbG9jKHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpjdHh0LAorCQkJCXU2NCBibGtubywgdW5zaWduZWQgaW50IGJpdCk7CitzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9kZWFsbG9jX2hhc19jbHVzdGVyKHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpjKQoreworCXJldHVybiBjLT5jX2dsb2JhbF9hbGxvY2F0b3IgIT0gTlVMTDsKIH0KIGludCBvY2ZzMl9ydW5fZGVhbGxvY3Moc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCSAgICAgICBzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqY3R4dCk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9hb3BzLmMgYi9mcy9vY2ZzMi9hb3BzLmMKaW5kZXggYzIyNTQzYi4uYTA2N2E2YyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvYW9wcy5jCisrKyBiL2ZzL29jZnMyL2FvcHMuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KICNpbmNsdWRlIDxsaW51eC9waXBlX2ZzX2kuaD4KICNpbmNsdWRlIDxsaW51eC9tcGFnZS5oPgorI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CiAKICNkZWZpbmUgTUxPR19NQVNLX1BSRUZJWCBNTF9GSUxFX0lPCiAjaW5jbHVkZSA8Y2x1c3Rlci9tYXNrbG9nLmg+CkBAIC02OCwyMCArNjksMTMgQEAKIAkJZ290byBiYWlsOwogCX0KIAotCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIE9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywgJmJoKTsKKwlzdGF0dXMgPSBvY2ZzMl9yZWFkX2lub2RlX2Jsb2NrKGlub2RlLCAmYmgpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBiYWlsOwogCX0KIAlmZSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopIGJoLT5iX2RhdGE7CiAKLQlpZiAoIU9DRlMyX0lTX1ZBTElEX0RJTk9ERShmZSkpIHsKLQkJbWxvZyhNTF9FUlJPUiwgIkludmFsaWQgZGlub2RlICMlbGx1OiBzaWduYXR1cmUgPSAlLipzXG4iLAotCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoZmUtPmlfYmxrbm8pLCA3LAotCQkgICAgIGZlLT5pX3NpZ25hdHVyZSk7Ci0JCWdvdG8gYmFpbDsKLQl9Ci0KIAlpZiAoKHU2NClpYmxvY2sgPj0gb2NmczJfY2x1c3RlcnNfdG9fYmxvY2tzKGlub2RlLT5pX3NiLAogCQkJCQkJICAgIGxlMzJfdG9fY3B1KGZlLT5pX2NsdXN0ZXJzKSkpIHsKIAkJbWxvZyhNTF9FUlJPUiwgImJsb2NrIG9mZnNldCBpcyBvdXRzaWRlIHRoZSBhbGxvY2F0ZWQgc2l6ZTogIgpAQCAtMjYyLDcgKzI1Niw3IEBACiAJQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKIAlCVUdfT04oIShPQ0ZTMl9JKGlub2RlKS0+aXBfZHluX2ZlYXR1cmVzICYgT0NGUzJfSU5MSU5FX0RBVEFfRkwpKTsKIAotCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIE9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywgJmRpX2JoKTsKKwlyZXQgPSBvY2ZzMl9yZWFkX2lub2RlX2Jsb2NrKGlub2RlLCAmZGlfYmgpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dDsKQEAgLTQ4MSwxMiArNDc1LDYgQEAKIAogCWlmIChvY2ZzMl9zaG91bGRfb3JkZXJfZGF0YShpbm9kZSkpIHsKIAkJcmV0ID0gb2NmczJfamJkMl9maWxlX2lub2RlKGhhbmRsZSwgaW5vZGUpOwotI2lmZGVmIENPTkZJR19PQ0ZTMl9DT01QQVRfSkJECi0JCXJldCA9IHdhbGtfcGFnZV9idWZmZXJzKGhhbmRsZSwKLQkJCQkJcGFnZV9idWZmZXJzKHBhZ2UpLAotCQkJCQlmcm9tLCB0bywgTlVMTCwKLQkJCQkJb2NmczJfam91cm5hbF9kaXJ0eV9kYXRhKTsKLSNlbmRpZgogCQlpZiAocmV0IDwgMCkKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAl9CkBAIC0xMDcyLDE1ICsxMDYwLDggQEAKIAkJdG1wcGFnZSA9IHdjLT53X3BhZ2VzW2ldOwogCiAJCWlmIChwYWdlX2hhc19idWZmZXJzKHRtcHBhZ2UpKSB7Ci0JCQlpZiAob2NmczJfc2hvdWxkX29yZGVyX2RhdGEoaW5vZGUpKSB7CisJCQlpZiAob2NmczJfc2hvdWxkX29yZGVyX2RhdGEoaW5vZGUpKQogCQkJCW9jZnMyX2piZDJfZmlsZV9pbm9kZSh3Yy0+d19oYW5kbGUsIGlub2RlKTsKLSNpZmRlZiBDT05GSUdfT0NGUzJfQ09NUEFUX0pCRAotCQkJCXdhbGtfcGFnZV9idWZmZXJzKHdjLT53X2hhbmRsZSwKLQkJCQkJCSAgcGFnZV9idWZmZXJzKHRtcHBhZ2UpLAotCQkJCQkJICBmcm9tLCB0bywgTlVMTCwKLQkJCQkJCSAgb2NmczJfam91cm5hbF9kaXJ0eV9kYXRhKTsKLSNlbmRpZgotCQkJfQogCiAJCQlibG9ja19jb21taXRfd3JpdGUodG1wcGFnZSwgZnJvbSwgdG8pOwogCQl9CkBAIC0xNTMxLDggKzE1MTIsOCBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCB3Yy0+d19kaV9iaCwKLQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZGkoaGFuZGxlLCBpbm9kZSwgd2MtPndfZGlfYmgsCisJCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChyZXQpIHsKIAkJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKIApAQCAtMTc1MCwxNSArMTczMSwyMCBAQAogCiAJd2MtPndfaGFuZGxlID0gaGFuZGxlOwogCisJaWYgKGNsdXN0ZXJzX3RvX2FsbG9jICYmIHZmc19kcV9hbGxvY19zcGFjZV9ub2RpcnR5KGlub2RlLAorCQkJb2NmczJfY2x1c3RlcnNfdG9fYnl0ZXMob3NiLT5zYiwgY2x1c3RlcnNfdG9fYWxsb2MpKSkgeworCQlyZXQgPSAtRURRVU9UOworCQlnb3RvIG91dF9jb21taXQ7CisJfQogCS8qCiAJICogV2UgZG9uJ3Qgd2FudCB0aGlzIHRvIGZhaWwgaW4gb2NmczJfd3JpdGVfZW5kKCksIHNvIGRvIGl0CiAJICogaGVyZS4KIAkgKi8KLQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCB3Yy0+d19kaV9iaCwKLQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZGkoaGFuZGxlLCBpbm9kZSwgd2MtPndfZGlfYmgsCisJCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dF9jb21taXQ7CisJCWdvdG8gb3V0X3F1b3RhOwogCX0KIAogCS8qCkBAIC0xNzcxLDE0ICsxNzU3LDE0IEBACiAJCQkJCSBtbWFwX3BhZ2UpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dF9jb21taXQ7CisJCWdvdG8gb3V0X3F1b3RhOwogCX0KIAogCXJldCA9IG9jZnMyX3dyaXRlX2NsdXN0ZXJfYnlfZGVzYyhtYXBwaW5nLCBkYXRhX2FjLCBtZXRhX2FjLCB3YywgcG9zLAogCQkJCQkgIGxlbik7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0X2NvbW1pdDsKKwkJZ290byBvdXRfcXVvdGE7CiAJfQogCiAJaWYgKGRhdGFfYWMpCkBAIC0xNzkwLDYgKzE3NzYsMTAgQEAKIAkqcGFnZXAgPSB3Yy0+d190YXJnZXRfcGFnZTsKIAkqZnNkYXRhID0gd2M7CiAJcmV0dXJuIDA7CitvdXRfcXVvdGE6CisJaWYgKGNsdXN0ZXJzX3RvX2FsbG9jKQorCQl2ZnNfZHFfZnJlZV9zcGFjZShpbm9kZSwKKwkJCSAgb2NmczJfY2x1c3RlcnNfdG9fYnl0ZXMob3NiLT5zYiwgY2x1c3RlcnNfdG9fYWxsb2MpKTsKIG91dF9jb21taXQ6CiAJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKIApAQCAtMTkxOSwxNSArMTkwOSw4IEBACiAJCX0KIAogCQlpZiAocGFnZV9oYXNfYnVmZmVycyh0bXBwYWdlKSkgewotCQkJaWYgKG9jZnMyX3Nob3VsZF9vcmRlcl9kYXRhKGlub2RlKSkgeworCQkJaWYgKG9jZnMyX3Nob3VsZF9vcmRlcl9kYXRhKGlub2RlKSkKIAkJCQlvY2ZzMl9qYmQyX2ZpbGVfaW5vZGUod2MtPndfaGFuZGxlLCBpbm9kZSk7Ci0jaWZkZWYgQ09ORklHX09DRlMyX0NPTVBBVF9KQkQKLQkJCQl3YWxrX3BhZ2VfYnVmZmVycyh3Yy0+d19oYW5kbGUsCi0JCQkJCQkgIHBhZ2VfYnVmZmVycyh0bXBwYWdlKSwKLQkJCQkJCSAgZnJvbSwgdG8sIE5VTEwsCi0JCQkJCQkgIG9jZnMyX2pvdXJuYWxfZGlydHlfZGF0YSk7Ci0jZW5kaWYKLQkJCX0KIAkJCWJsb2NrX2NvbW1pdF93cml0ZSh0bXBwYWdlLCBmcm9tLCB0byk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9ibG9ja2NoZWNrLmMgYi9mcy9vY2ZzMi9ibG9ja2NoZWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE5NDdjNAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL29jZnMyL2Jsb2NrY2hlY2suYwpAQCAtMCwwICsxLDQ3NyBAQAorLyogLSotIG1vZGU6IGM7IGMtYmFzaWMtb2Zmc2V0OiA4OyAtKi0KKyAqIHZpbTogbm9leHBhbmR0YWIgc3c9OCB0cz04IHN0cz0wOgorICoKKyAqIGJsb2NrY2hlY2suYworICoKKyAqIENoZWNrc3VtIGFuZCBFQ0MgY29kZXMgZm9yIHRoZSBPQ0ZTMiB1c2Vyc3BhY2UgbGlicmFyeS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDggT3JhY2xlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UsIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjaW5jbHVkZSA8Y2x1c3Rlci9tYXNrbG9nLmg+CisKKyNpbmNsdWRlICJvY2ZzMi5oIgorCisjaW5jbHVkZSAiYmxvY2tjaGVjay5oIgorCisKKy8qCisgKiBXZSB1c2UgdGhlIGZvbGxvd2luZyBjb252ZW50aW9uczoKKyAqCisgKiBkID0gIyBkYXRhIGJpdHMKKyAqIHAgPSAjIHBhcml0eSBiaXRzCisgKiBjID0gIyB0b3RhbCBjb2RlIGJpdHMgKGQgKyBwKQorICovCisKKworLyoKKyAqIENhbGN1bGF0ZSB0aGUgYml0IG9mZnNldCBpbiB0aGUgaGFtbWluZyBjb2RlIGJ1ZmZlciBiYXNlZCBvbiB0aGUgYml0J3MKKyAqIG9mZnNldCBpbiB0aGUgZGF0YSBidWZmZXIuICBTaW5jZSB0aGUgaGFtbWluZyBjb2RlIHJlc2VydmVzIGFsbAorICogcG93ZXItb2YtdHdvIGJpdHMgZm9yIHBhcml0eSwgdGhlIGRhdGEgYml0IG51bWJlciBhbmQgdGhlIGNvZGUgYml0CisgKiBudW1iZXIgYXJlIG9mZmVzdCBieSBhbGwgdGhlIHBhcml0eSBiaXRzIGJlZm9yZWhhbmQuCisgKgorICogUmVjYWxsIHRoYXQgYml0IG51bWJlcnMgaW4gaGFtbWluZyBjb2RlIGFyZSAxLWJhc2VkLiAgVGhpcyBmdW5jdGlvbgorICogdGFrZXMgdGhlIDAtYmFzZWQgZGF0YSBiaXQgZnJvbSB0aGUgY2FsbGVyLgorICoKKyAqIEFuIGV4YW1wbGUuICBUYWtlIGJpdCAxIG9mIHRoZSBkYXRhIGJ1ZmZlci4gIDEgaXMgYSBwb3dlciBvZiB0d28gKDJeMCksCisgKiBzbyBpdCdzIGEgcGFyaXR5IGJpdC4gIDIgaXMgYSBwb3dlciBvZiB0d28gKDJeMSksIHNvIGl0J3MgYSBwYXJpdHkgYml0LgorICogMyBpcyBub3QgYSBwb3dlciBvZiB0d28uICBTbyBiaXQgMSBvZiB0aGUgZGF0YSBidWZmZXIgZW5kcyB1cCBhcyBiaXQgMworICogaW4gdGhlIGNvZGUgYnVmZmVyLgorICoKKyAqIFRoZSBjYWxsZXIgY2FuIHBhc3MgaW4gKnAgaWYgaXQgd2FudHMgdG8ga2VlcCB0cmFjayBvZiB0aGUgbW9zdCByZWNlbnQKKyAqIG51bWJlciBvZiBwYXJpdHkgYml0cyBhZGRlZC4gIFRoaXMgYWxsb3dzIHRoZSBmdW5jdGlvbiB0byBzdGFydCB0aGUKKyAqIGNhbGN1bGF0aW9uIGF0IHRoZSBsYXN0IHBsYWNlLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGNhbGNfY29kZV9iaXQodW5zaWduZWQgaW50IGksIHVuc2lnbmVkIGludCAqcF9jYWNoZSkKK3sKKwl1bnNpZ25lZCBpbnQgYiwgcCA9IDA7CisKKwkvKgorCSAqIERhdGEgYml0cyBhcmUgMC1iYXNlZCwgYnV0IHdlJ3JlIHRhbGtpbmcgY29kZSBiaXRzLCB3aGljaAorCSAqIGFyZSAxLWJhc2VkLgorCSAqLworCWIgPSBpICsgMTsKKworCS8qIFVzZSB0aGUgY2FjaGUgaWYgaXQgaXMgdGhlcmUgKi8KKwlpZiAocF9jYWNoZSkKKwkJcCA9ICpwX2NhY2hlOworICAgICAgICBiICs9IHA7CisKKwkvKgorCSAqIEZvciBldmVyeSBwb3dlciBvZiB0d28gYmVsb3cgb3VyIGJpdCBudW1iZXIsIGJ1bXAgb3VyIGJpdC4KKwkgKgorCSAqIFdlIGNvbXBhcmUgd2l0aCAoYiArIDEpIGJlY2F1c2Ugd2UgaGF2ZSB0byBjb21wYXJlIHdpdGggd2hhdCBiCisJICogd291bGQgYmUgX2lmXyBpdCB3ZXJlIGJ1bXBlZCB1cCBieSB0aGUgcGFyaXR5IGJpdC4gIENhcGljZT8KKwkgKgorCSAqIHAgaXMgc2V0IGFib3ZlLgorCSAqLworCWZvciAoOyAoMSA8PCBwKSA8IChiICsgMSk7IHArKykKKwkJYisrOworCisJaWYgKHBfY2FjaGUpCisJCSpwX2NhY2hlID0gcDsKKworCXJldHVybiBiOworfQorCisvKgorICogVGhpcyBpcyB0aGUgbG93IGxldmVsIGVuY29kZXIgZnVuY3Rpb24uICBJdCBjYW4gYmUgY2FsbGVkIGFjcm9zcworICogbXVsdGlwbGUgaHVua3MganVzdCBsaWtlIHRoZSBjcmMzMiBjb2RlLiAgJ2QnIGlzIHRoZSBudW1iZXIgb2YgYml0cworICogX2luX3RoaXNfaHVua18uICBuciBpcyB0aGUgYml0IG9mZnNldCBvZiB0aGlzIGh1bmsuICBTbywgaWYgeW91IGhhZAorICogdHdvIDUxMkIgYnVmZmVycywgeW91IHdvdWxkIGRvIGl0IGxpa2Ugc286CisgKgorICogcGFyaXR5ID0gb2NmczJfaGFtbWluZ19lbmNvZGUoMCwgYnVmMSwgNTEyICogOCwgMCk7CisgKiBwYXJpdHkgPSBvY2ZzMl9oYW1taW5nX2VuY29kZShwYXJpdHksIGJ1ZjIsIDUxMiAqIDgsIDUxMiAqIDgpOworICoKKyAqIElmIHlvdSBqdXN0IGhhdmUgb25lIGJ1ZmZlciwgdXNlIG9jZnMyX2hhbW1pbmdfZW5jb2RlX2Jsb2NrKCkuCisgKi8KK3UzMiBvY2ZzMl9oYW1taW5nX2VuY29kZSh1MzIgcGFyaXR5LCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgZCwgdW5zaWduZWQgaW50IG5yKQoreworCXVuc2lnbmVkIGludCBpLCBiLCBwID0gMDsKKworCUJVR19PTighZCk7CisKKwkvKgorCSAqIGIgaXMgdGhlIGhhbW1pbmcgY29kZSBiaXQgbnVtYmVyLiAgSGFtbWluZyBjb2RlIHNwZWNpZmllcyBhCisJICogMS1iYXNlZCBhcnJheSwgYnV0IEMgdXNlcyAwLWJhc2VkLiAgU28gJ2knIGlzIGZvciBDLCBhbmQgJ2InIGlzCisJICogZm9yIHRoZSBhbGdvcml0aG0uCisJICoKKwkgKiBUaGUgaSsrIGluIHRoZSBmb3IgbG9vcCBpcyBzbyB0aGF0IHRoZSBzdGFydCBvZmZzZXQgcGFzc2VkCisJICogdG8gb2NmczJfZmluZF9uZXh0X2JpdF9zZXQoKSBpcyBvbmUgZ3JlYXRlciB0aGFuIHRoZSBwcmV2aW91c2x5CisJICogZm91bmQgYml0LgorCSAqLworCWZvciAoaSA9IDA7IChpID0gb2NmczJfZmluZF9uZXh0X2JpdChkYXRhLCBkLCBpKSkgPCBkOyBpKyspCisJeworCQkvKgorCQkgKiBpIGlzIHRoZSBvZmZzZXQgaW4gdGhpcyBodW5rLCBuciArIGkgaXMgdGhlIHRvdGFsIGJpdAorCQkgKiBvZmZzZXQuCisJCSAqLworCQliID0gY2FsY19jb2RlX2JpdChuciArIGksICZwKTsKKworCQkvKgorCQkgKiBEYXRhIGJpdHMgaW4gdGhlIHJlc3VsdGFudCBjb2RlIGFyZSBjaGVja2VkIGJ5CisJCSAqIHBhcml0eSBiaXRzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIGJpdCBudW1iZXIKKwkJICogcmVwcmVzZW50YXRpb24uICBIdWg/CisJCSAqCisJCSAqIDx3aWtpcGVkaWEgaHJlZj0iaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IYW1taW5nX2NvZGUiPgorCQkgKiBJbiBvdGhlciB3b3JkcywgdGhlIHBhcml0eSBiaXQgYXQgcG9zaXRpb24gMl5rCisJCSAqIGNoZWNrcyBiaXRzIGluIHBvc2l0aW9ucyBoYXZpbmcgYml0IGsgc2V0IGluCisJCSAqIHRoZWlyIGJpbmFyeSByZXByZXNlbnRhdGlvbi4gIENvbnZlcnNlbHksIGZvcgorCQkgKiBpbnN0YW5jZSwgYml0IDEzLCBpLmUuIDExMDEoMiksIGlzIGNoZWNrZWQgYnkKKwkJICogYml0cyAxMDAwKDIpID0gOCwgMDEwMCgyKT00IGFuZCAwMDAxKDIpID0gMS4KKwkJICogPC93aWtpcGVkaWE+CisJCSAqCisJCSAqIE5vdGUgdGhhdCAnaycgaXMgdGhlIF9jb2RlXyBiaXQgbnVtYmVyLiAgJ2InIGluCisJCSAqIG91ciBsb29wLgorCQkgKi8KKwkJcGFyaXR5IF49IGI7CisJfQorCisJLyogV2hpbGUgdGhlIGRhdGEgYnVmZmVyIHdhcyB0cmVhdGVkIGFzIGxpdHRsZSBlbmRpYW4sIHRoZQorCSAqIHJldHVybiB2YWx1ZSBpcyBpbiBob3N0IGVuZGlhbi4gKi8KKwlyZXR1cm4gcGFyaXR5OworfQorCit1MzIgb2NmczJfaGFtbWluZ19lbmNvZGVfYmxvY2sodm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGJsb2Nrc2l6ZSkKK3sKKwlyZXR1cm4gb2NmczJfaGFtbWluZ19lbmNvZGUoMCwgZGF0YSwgYmxvY2tzaXplICogOCwgMCk7Cit9CisKKy8qCisgKiBMaWtlIG9jZnMyX2hhbW1pbmdfZW5jb2RlKCksIHRoaXMgY2FuIGhhbmRsZSBodW5rcy4gIG5yIGlzIHRoZSBiaXQKKyAqIG9mZnNldCBvZiB0aGUgY3VycmVudCBodW5rLiAgSWYgYml0IHRvIGJlIGZpeGVkIGlzIG5vdCBwYXJ0IG9mIHRoZQorICogY3VycmVudCBodW5rLCB0aGlzIGRvZXMgbm90aGluZy4KKyAqCisgKiBJZiB5b3Ugb25seSBoYXZlIG9uZSBodW5rLCB1c2Ugb2NmczJfaGFtbWluZ19maXhfYmxvY2soKS4KKyAqLwordm9pZCBvY2ZzMl9oYW1taW5nX2ZpeCh2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgZCwgdW5zaWduZWQgaW50IG5yLAorCQkgICAgICAgdW5zaWduZWQgaW50IGZpeCkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgYjsKKworCUJVR19PTighZCk7CisKKwkvKgorCSAqIElmIHRoZSBiaXQgdG8gZml4IGhhcyBhbiBod2VpZ2h0IG9mIDEsIGl0J3MgYSBwYXJpdHkgYml0LiAgT25lCisJICogYnVzdGVkIHBhcml0eSBiaXQgaXMgaXRzIG93biBlcnJvci4gIE5vdGhpbmcgdG8gZG8gaGVyZS4KKwkgKi8KKwlpZiAoaHdlaWdodDMyKGZpeCkgPT0gMSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBuciArIGQgaXMgdGhlIGJpdCByaWdodCBwYXN0IHRoZSBkYXRhIGh1bmsgd2UncmUgbG9va2luZyBhdC4KKwkgKiBJZiBmaXggYWZ0ZXIgdGhhdCwgbm90aGluZyB0byBkbworCSAqLworCWlmIChmaXggPj0gY2FsY19jb2RlX2JpdChuciArIGQsIE5VTEwpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIG5yIGlzIHRoZSBvZmZzZXQgaW4gdGhlIGRhdGEgaHVuayB3ZSdyZSBzdGFydGluZyBhdC4gIExldCdzCisJICogc3RhcnQgYiBhdCB0aGUgb2Zmc2V0IGluIHRoZSBjb2RlIGJ1ZmZlci4gIFNlZSBoYW1taW5nX2VuY29kZSgpCisJICogZm9yIGEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiAnYicuCisJICovCisJYiA9IGNhbGNfY29kZV9iaXQobnIsIE5VTEwpOworCS8qIElmIHRoZSBmaXggaXMgYmVmb3JlIHRoaXMgaHVuaywgbm90aGluZyB0byBkbyAqLworCWlmIChmaXggPCBiKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgZDsgaSsrLCBiKyspCisJeworCQkvKiBTa2lwIHBhc3QgcGFyaXR5IGJpdHMgKi8KKwkJd2hpbGUgKGh3ZWlnaHQzMihiKSA9PSAxKQorCQkJYisrOworCisJCS8qCisJCSAqIGkgaXMgdGhlIG9mZnNldCBpbiB0aGlzIGRhdGEgaHVuay4KKwkJICogbnIgKyBpIGlzIHRoZSBvZmZzZXQgaW4gdGhlIHRvdGFsIGRhdGEgYnVmZmVyLgorCQkgKiBiIGlzIHRoZSBvZmZzZXQgaW4gdGhlIHRvdGFsIGNvZGUgYnVmZmVyLgorCQkgKgorCQkgKiBUaHVzLCB3aGVuIGIgPT0gZml4LCBiaXQgaSBpbiB0aGUgY3VycmVudCBodW5rIG5lZWRzCisJCSAqIGZpeGluZy4KKwkJICovCisJCWlmIChiID09IGZpeCkKKwkJeworCQkJaWYgKG9jZnMyX3Rlc3RfYml0KGksIGRhdGEpKQorCQkJCW9jZnMyX2NsZWFyX2JpdChpLCBkYXRhKTsKKwkJCWVsc2UKKwkJCQlvY2ZzMl9zZXRfYml0KGksIGRhdGEpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3ZvaWQgb2NmczJfaGFtbWluZ19maXhfYmxvY2sodm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGJsb2Nrc2l6ZSwKKwkJCSAgICAgdW5zaWduZWQgaW50IGZpeCkKK3sKKwlvY2ZzMl9oYW1taW5nX2ZpeChkYXRhLCBibG9ja3NpemUgKiA4LCAwLCBmaXgpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgY2hlY2sgaW5mb3JtYXRpb24gZm9yIGEgYmxvY2suCisgKiBkYXRhIGlzIHRoZSBibG9jayB0byBiZSBjaGVja2VkLiAgYmMgaXMgYSBwb2ludGVyIHRvIHRoZQorICogb2NmczJfYmxvY2tfY2hlY2sgc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIGNyYzMyIGFuZCB0aGUgZWNjLgorICoKKyAqIGJjIHNob3VsZCBiZSBhIHBvaW50ZXIgaW5zaWRlIGRhdGEsIGFzIHRoZSBmdW5jdGlvbiB3aWxsCisgKiB0YWtlIGNhcmUgb2YgemVyb2luZyBpdCBiZWZvcmUgY2FsY3VsYXRpbmcgdGhlIGNoZWNrIGluZm9ybWF0aW9uLiAgSWYKKyAqIGJjIGRvZXMgbm90IHBvaW50IGluc2lkZSBkYXRhLCB0aGUgY2FsbGVyIG11c3QgbWFrZSBzdXJlIGFueSBpbmxpbmUKKyAqIG9jZnMyX2Jsb2NrX2NoZWNrIHN0cnVjdHVyZXMgYXJlIHplcm9lZC4KKyAqCisgKiBUaGUgZGF0YSBidWZmZXIgbXVzdCBiZSBpbiBvbi1kaXNrIGVuZGlhbiAobGl0dGxlIGVuZGlhbiBmb3Igb2NmczIpLgorICogYmMgd2lsbCBiZSBmaWxsZWQgd2l0aCBsaXR0bGUtZW5kaWFuIHZhbHVlcyBhbmQgd2lsbCBiZSByZWFkeSB0byBnbyB0bworICogZGlzay4KKyAqLwordm9pZCBvY2ZzMl9ibG9ja19jaGVja19jb21wdXRlKHZvaWQgKmRhdGEsIHNpemVfdCBibG9ja3NpemUsCisJCQkgICAgICAgc3RydWN0IG9jZnMyX2Jsb2NrX2NoZWNrICpiYykKK3sKKwl1MzIgY3JjOworCXUzMiBlY2M7CisKKwltZW1zZXQoYmMsIDAsIHNpemVvZihzdHJ1Y3Qgb2NmczJfYmxvY2tfY2hlY2spKTsKKworCWNyYyA9IGNyYzMyX2xlKH4wLCBkYXRhLCBibG9ja3NpemUpOworCWVjYyA9IG9jZnMyX2hhbW1pbmdfZW5jb2RlX2Jsb2NrKGRhdGEsIGJsb2Nrc2l6ZSk7CisKKwkvKgorCSAqIE5vIGVjYydkIG9jZnMyIHN0cnVjdHVyZSBpcyBsYXJnZXIgdGhhbiA0Sywgc28gZWNjIHdpbGwgYmUgbm8KKwkgKiBsYXJnZXIgdGhhbiAxNiBiaXRzLgorCSAqLworCUJVR19PTihlY2MgPiBVU0hPUlRfTUFYKTsKKworCWJjLT5iY19jcmMzMmUgPSBjcHVfdG9fbGUzMihjcmMpOworCWJjLT5iY19lY2MgPSBjcHVfdG9fbGUxNigodTE2KWVjYyk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHZhbGlkYXRlcyBleGlzdGluZyBjaGVjayBpbmZvcm1hdGlvbi4gIExpa2UgX2NvbXB1dGUsCisgKiB0aGUgZnVuY3Rpb24gd2lsbCB0YWtlIGNhcmUgb2YgemVyb2luZyBiYyBiZWZvcmUgY2FsY3VsYXRpbmcgY2hlY2sgY29kZXMuCisgKiBJZiBiYyBpcyBub3QgYSBwb2ludGVyIGluc2lkZSBkYXRhLCB0aGUgY2FsbGVyIG11c3QgaGF2ZSB6ZXJvZWQgYW55CisgKiBpbmxpbmUgb2NmczJfYmxvY2tfY2hlY2sgc3RydWN0dXJlcy4KKyAqCisgKiBBZ2FpbiwgdGhlIGRhdGEgcGFzc2VkIGluIHNob3VsZCBiZSB0aGUgb24tZGlzayBlbmRpYW4uCisgKi8KK2ludCBvY2ZzMl9ibG9ja19jaGVja192YWxpZGF0ZSh2b2lkICpkYXRhLCBzaXplX3QgYmxvY2tzaXplLAorCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9ibG9ja19jaGVjayAqYmMpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3Qgb2NmczJfYmxvY2tfY2hlY2sgY2hlY2s7CisJdTMyIGNyYywgZWNjOworCisJY2hlY2suYmNfY3JjMzJlID0gbGUzMl90b19jcHUoYmMtPmJjX2NyYzMyZSk7CisJY2hlY2suYmNfZWNjID0gbGUxNl90b19jcHUoYmMtPmJjX2VjYyk7CisKKwltZW1zZXQoYmMsIDAsIHNpemVvZihzdHJ1Y3Qgb2NmczJfYmxvY2tfY2hlY2spKTsKKworCS8qIEZhc3QgcGF0aCAtIGlmIHRoZSBjcmMzMiB2YWxpZGF0ZXMsIHdlJ3JlIGdvb2QgdG8gZ28gKi8KKwljcmMgPSBjcmMzMl9sZSh+MCwgZGF0YSwgYmxvY2tzaXplKTsKKwlpZiAoY3JjID09IGNoZWNrLmJjX2NyYzMyZSkKKwkJZ290byBvdXQ7CisKKwltbG9nKE1MX0VSUk9SLAorCSAgICAgIkNSQzMyIGZhaWxlZDogc3RvcmVkOiAldSwgY29tcHV0ZWQgJXUuICBBcHBseWluZyBFQ0MuXG4iLAorCSAgICAgKHVuc2lnbmVkIGludCljaGVjay5iY19jcmMzMmUsICh1bnNpZ25lZCBpbnQpY3JjKTsKKworCS8qIE9rLCB0cnkgRUNDIGZpeHVwcyAqLworCWVjYyA9IG9jZnMyX2hhbW1pbmdfZW5jb2RlX2Jsb2NrKGRhdGEsIGJsb2Nrc2l6ZSk7CisJb2NmczJfaGFtbWluZ19maXhfYmxvY2soZGF0YSwgYmxvY2tzaXplLCBlY2MgXiBjaGVjay5iY19lY2MpOworCisJLyogQW5kIGNoZWNrIHRoZSBjcmMzMiBhZ2FpbiAqLworCWNyYyA9IGNyYzMyX2xlKH4wLCBkYXRhLCBibG9ja3NpemUpOworCWlmIChjcmMgPT0gY2hlY2suYmNfY3JjMzJlKQorCQlnb3RvIG91dDsKKworCW1sb2coTUxfRVJST1IsICJGaXhlZCBDUkMzMiBmYWlsZWQ6IHN0b3JlZDogJXUsIGNvbXB1dGVkICV1XG4iLAorCSAgICAgKHVuc2lnbmVkIGludCljaGVjay5iY19jcmMzMmUsICh1bnNpZ25lZCBpbnQpY3JjKTsKKworCXJjID0gLUVJTzsKKworb3V0OgorCWJjLT5iY19jcmMzMmUgPSBjcHVfdG9fbGUzMihjaGVjay5iY19jcmMzMmUpOworCWJjLT5iY19lY2MgPSBjcHVfdG9fbGUxNihjaGVjay5iY19lY2MpOworCisJcmV0dXJuIHJjOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgY2hlY2sgaW5mb3JtYXRpb24gZm9yIGEgbGlzdCBvZiBidWZmZXJfaGVhZHMuCisgKiBiaHMgaXMgdGhlIGJsb2NrcyB0byBiZSBjaGVja2VkLiAgYmMgaXMgYSBwb2ludGVyIHRvIHRoZQorICogb2NmczJfYmxvY2tfY2hlY2sgc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIGNyYzMyIGFuZCB0aGUgZWNjLgorICoKKyAqIGJjIHNob3VsZCBiZSBhIHBvaW50ZXIgaW5zaWRlIGRhdGEsIGFzIHRoZSBmdW5jdGlvbiB3aWxsCisgKiB0YWtlIGNhcmUgb2YgemVyb2luZyBpdCBiZWZvcmUgY2FsY3VsYXRpbmcgdGhlIGNoZWNrIGluZm9ybWF0aW9uLiAgSWYKKyAqIGJjIGRvZXMgbm90IHBvaW50IGluc2lkZSBkYXRhLCB0aGUgY2FsbGVyIG11c3QgbWFrZSBzdXJlIGFueSBpbmxpbmUKKyAqIG9jZnMyX2Jsb2NrX2NoZWNrIHN0cnVjdHVyZXMgYXJlIHplcm9lZC4KKyAqCisgKiBUaGUgZGF0YSBidWZmZXIgbXVzdCBiZSBpbiBvbi1kaXNrIGVuZGlhbiAobGl0dGxlIGVuZGlhbiBmb3Igb2NmczIpLgorICogYmMgd2lsbCBiZSBmaWxsZWQgd2l0aCBsaXR0bGUtZW5kaWFuIHZhbHVlcyBhbmQgd2lsbCBiZSByZWFkeSB0byBnbyB0bworICogZGlzay4KKyAqLwordm9pZCBvY2ZzMl9ibG9ja19jaGVja19jb21wdXRlX2JocyhzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaHMsIGludCBuciwKKwkJCQkgICBzdHJ1Y3Qgb2NmczJfYmxvY2tfY2hlY2sgKmJjKQoreworCWludCBpOworCXUzMiBjcmMsIGVjYzsKKworCUJVR19PTihuciA8IDApOworCisJaWYgKCFucikKKwkJcmV0dXJuOworCisJbWVtc2V0KGJjLCAwLCBzaXplb2Yoc3RydWN0IG9jZnMyX2Jsb2NrX2NoZWNrKSk7CisKKwlmb3IgKGkgPSAwLCBjcmMgPSB+MCwgZWNjID0gMDsgaSA8IG5yOyBpKyspIHsKKwkJY3JjID0gY3JjMzJfbGUoY3JjLCBiaHNbaV0tPmJfZGF0YSwgYmhzW2ldLT5iX3NpemUpOworCQkvKgorCQkgKiBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gYSBidWZmZXIgaXMgb2J2aW91c2x5IGJfc2l6ZSo4LgorCQkgKiBUaGUgb2Zmc2V0IG9mIHRoaXMgYnVmZmVyIGlzIGJfc2l6ZSppLCBzbyB0aGUgYml0IG9mZnNldAorCQkgKiBvZiB0aGlzIGJ1ZmZlciBpcyBiX3NpemUqOCppLgorCQkgKi8KKwkJZWNjID0gKHUxNilvY2ZzMl9oYW1taW5nX2VuY29kZShlY2MsIGJoc1tpXS0+Yl9kYXRhLAorCQkJCQkJYmhzW2ldLT5iX3NpemUgKiA4LAorCQkJCQkJYmhzW2ldLT5iX3NpemUgKiA4ICogaSk7CisJfQorCisJLyoKKwkgKiBObyBlY2MnZCBvY2ZzMiBzdHJ1Y3R1cmUgaXMgbGFyZ2VyIHRoYW4gNEssIHNvIGVjYyB3aWxsIGJlIG5vCisJICogbGFyZ2VyIHRoYW4gMTYgYml0cy4KKwkgKi8KKwlCVUdfT04oZWNjID4gVVNIT1JUX01BWCk7CisKKwliYy0+YmNfY3JjMzJlID0gY3B1X3RvX2xlMzIoY3JjKTsKKwliYy0+YmNfZWNjID0gY3B1X3RvX2xlMTYoKHUxNillY2MpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiB2YWxpZGF0ZXMgZXhpc3RpbmcgY2hlY2sgaW5mb3JtYXRpb24gb24gYSBsaXN0IG9mCisgKiBidWZmZXJfaGVhZHMuICBMaWtlIF9jb21wdXRlX2JocywgdGhlIGZ1bmN0aW9uIHdpbGwgdGFrZSBjYXJlIG9mCisgKiB6ZXJvaW5nIGJjIGJlZm9yZSBjYWxjdWxhdGluZyBjaGVjayBjb2Rlcy4gIElmIGJjIGlzIG5vdCBhIHBvaW50ZXIKKyAqIGluc2lkZSBkYXRhLCB0aGUgY2FsbGVyIG11c3QgaGF2ZSB6ZXJvZWQgYW55IGlubGluZQorICogb2NmczJfYmxvY2tfY2hlY2sgc3RydWN0dXJlcy4KKyAqCisgKiBBZ2FpbiwgdGhlIGRhdGEgcGFzc2VkIGluIHNob3VsZCBiZSB0aGUgb24tZGlzayBlbmRpYW4uCisgKi8KK2ludCBvY2ZzMl9ibG9ja19jaGVja192YWxpZGF0ZV9iaHMoc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhzLCBpbnQgbnIsCisJCQkJICAgc3RydWN0IG9jZnMyX2Jsb2NrX2NoZWNrICpiYykKK3sKKwlpbnQgaSwgcmMgPSAwOworCXN0cnVjdCBvY2ZzMl9ibG9ja19jaGVjayBjaGVjazsKKwl1MzIgY3JjLCBlY2MsIGZpeDsKKworCUJVR19PTihuciA8IDApOworCisJaWYgKCFucikKKwkJcmV0dXJuIDA7CisKKwljaGVjay5iY19jcmMzMmUgPSBsZTMyX3RvX2NwdShiYy0+YmNfY3JjMzJlKTsKKwljaGVjay5iY19lY2MgPSBsZTE2X3RvX2NwdShiYy0+YmNfZWNjKTsKKworCW1lbXNldChiYywgMCwgc2l6ZW9mKHN0cnVjdCBvY2ZzMl9ibG9ja19jaGVjaykpOworCisJLyogRmFzdCBwYXRoIC0gaWYgdGhlIGNyYzMyIHZhbGlkYXRlcywgd2UncmUgZ29vZCB0byBnbyAqLworCWZvciAoaSA9IDAsIGNyYyA9IH4wOyBpIDwgbnI7IGkrKykKKwkJY3JjID0gY3JjMzJfbGUoY3JjLCBiaHNbaV0tPmJfZGF0YSwgYmhzW2ldLT5iX3NpemUpOworCWlmIChjcmMgPT0gY2hlY2suYmNfY3JjMzJlKQorCQlnb3RvIG91dDsKKworCW1sb2coTUxfRVJST1IsCisJICAgICAiQ1JDMzIgZmFpbGVkOiBzdG9yZWQ6ICV1LCBjb21wdXRlZCAldS4gIEFwcGx5aW5nIEVDQy5cbiIsCisJICAgICAodW5zaWduZWQgaW50KWNoZWNrLmJjX2NyYzMyZSwgKHVuc2lnbmVkIGludCljcmMpOworCisJLyogT2ssIHRyeSBFQ0MgZml4dXBzICovCisJZm9yIChpID0gMCwgZWNjID0gMDsgaSA8IG5yOyBpKyspIHsKKwkJLyoKKwkJICogVGhlIG51bWJlciBvZiBiaXRzIGluIGEgYnVmZmVyIGlzIG9idmlvdXNseSBiX3NpemUqOC4KKwkJICogVGhlIG9mZnNldCBvZiB0aGlzIGJ1ZmZlciBpcyBiX3NpemUqaSwgc28gdGhlIGJpdCBvZmZzZXQKKwkJICogb2YgdGhpcyBidWZmZXIgaXMgYl9zaXplKjgqaS4KKwkJICovCisJCWVjYyA9ICh1MTYpb2NmczJfaGFtbWluZ19lbmNvZGUoZWNjLCBiaHNbaV0tPmJfZGF0YSwKKwkJCQkJCWJoc1tpXS0+Yl9zaXplICogOCwKKwkJCQkJCWJoc1tpXS0+Yl9zaXplICogOCAqIGkpOworCX0KKwlmaXggPSBlY2MgXiBjaGVjay5iY19lY2M7CisJZm9yIChpID0gMDsgaSA8IG5yOyBpKyspIHsKKwkJLyoKKwkJICogVHJ5IHRoZSBmaXggYWdhaW5zdCBlYWNoIGJ1ZmZlci4gIEl0IHdpbGwgb25seSBhZmZlY3QKKwkJICogb25lIG9mIHRoZW0uCisJCSAqLworCQlvY2ZzMl9oYW1taW5nX2ZpeChiaHNbaV0tPmJfZGF0YSwgYmhzW2ldLT5iX3NpemUgKiA4LAorCQkJCSAgYmhzW2ldLT5iX3NpemUgKiA4ICogaSwgZml4KTsKKwl9CisKKwkvKiBBbmQgY2hlY2sgdGhlIGNyYzMyIGFnYWluICovCisJZm9yIChpID0gMCwgY3JjID0gfjA7IGkgPCBucjsgaSsrKQorCQljcmMgPSBjcmMzMl9sZShjcmMsIGJoc1tpXS0+Yl9kYXRhLCBiaHNbaV0tPmJfc2l6ZSk7CisJaWYgKGNyYyA9PSBjaGVjay5iY19jcmMzMmUpCisJCWdvdG8gb3V0OworCisJbWxvZyhNTF9FUlJPUiwgIkZpeGVkIENSQzMyIGZhaWxlZDogc3RvcmVkOiAldSwgY29tcHV0ZWQgJXVcbiIsCisJICAgICAodW5zaWduZWQgaW50KWNoZWNrLmJjX2NyYzMyZSwgKHVuc2lnbmVkIGludCljcmMpOworCisJcmMgPSAtRUlPOworCitvdXQ6CisJYmMtPmJjX2NyYzMyZSA9IGNwdV90b19sZTMyKGNoZWNrLmJjX2NyYzMyZSk7CisJYmMtPmJjX2VjYyA9IGNwdV90b19sZTE2KGNoZWNrLmJjX2VjYyk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIG1haW4gQVBJLiAgVGhleSBjaGVjayB0aGUgc3VwZXJibG9jayBmbGFnIGJlZm9yZQorICogY2FsbGluZyB0aGUgdW5kZXJseWluZyBvcGVyYXRpb25zLgorICoKKyAqIFRoZXkgZXhwZWN0IHRoZSBidWZmZXIocykgdG8gYmUgaW4gZGlzayBmb3JtYXQuCisgKi8KK3ZvaWQgb2NmczJfY29tcHV0ZV9tZXRhX2VjYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLAorCQkJICAgIHN0cnVjdCBvY2ZzMl9ibG9ja19jaGVjayAqYmMpCit7CisJaWYgKG9jZnMyX21ldGFfZWNjKE9DRlMyX1NCKHNiKSkpCisJCW9jZnMyX2Jsb2NrX2NoZWNrX2NvbXB1dGUoZGF0YSwgc2ItPnNfYmxvY2tzaXplLCBiYyk7Cit9CisKK2ludCBvY2ZzMl92YWxpZGF0ZV9tZXRhX2VjYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLAorCQkJICAgIHN0cnVjdCBvY2ZzMl9ibG9ja19jaGVjayAqYmMpCit7CisJaW50IHJjID0gMDsKKworCWlmIChvY2ZzMl9tZXRhX2VjYyhPQ0ZTMl9TQihzYikpKQorCQlyYyA9IG9jZnMyX2Jsb2NrX2NoZWNrX3ZhbGlkYXRlKGRhdGEsIHNiLT5zX2Jsb2Nrc2l6ZSwgYmMpOworCisJcmV0dXJuIHJjOworfQorCit2b2lkIG9jZnMyX2NvbXB1dGVfbWV0YV9lY2NfYmhzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhzLCBpbnQgbnIsCisJCQkJc3RydWN0IG9jZnMyX2Jsb2NrX2NoZWNrICpiYykKK3sKKwlpZiAob2NmczJfbWV0YV9lY2MoT0NGUzJfU0Ioc2IpKSkKKwkJb2NmczJfYmxvY2tfY2hlY2tfY29tcHV0ZV9iaHMoYmhzLCBuciwgYmMpOworfQorCitpbnQgb2NmczJfdmFsaWRhdGVfbWV0YV9lY2NfYmhzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhzLCBpbnQgbnIsCisJCQkJc3RydWN0IG9jZnMyX2Jsb2NrX2NoZWNrICpiYykKK3sKKwlpbnQgcmMgPSAwOworCisJaWYgKG9jZnMyX21ldGFfZWNjKE9DRlMyX1NCKHNiKSkpCisJCXJjID0gb2NmczJfYmxvY2tfY2hlY2tfdmFsaWRhdGVfYmhzKGJocywgbnIsIGJjKTsKKworCXJldHVybiByYzsKK30KKwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvYmxvY2tjaGVjay5oIGIvZnMvb2NmczIvYmxvY2tjaGVjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZWMzZmUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9vY2ZzMi9ibG9ja2NoZWNrLmgKQEAgLTAsMCArMSw4MiBAQAorLyogLSotIG1vZGU6IGM7IGMtYmFzaWMtb2Zmc2V0OiA4OyAtKi0KKyAqIHZpbTogbm9leHBhbmR0YWIgc3c9OCB0cz04IHN0cz0wOgorICoKKyAqIGJsb2NrY2hlY2suaAorICoKKyAqIENoZWNrc3VtIGFuZCBFQ0MgY29kZXMgZm9yIHRoZSBPQ0ZTMiB1c2Vyc3BhY2UgbGlicmFyeS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDggT3JhY2xlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UsIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIE9DRlMyX0JMT0NLQ0hFQ0tfSAorI2RlZmluZSBPQ0ZTMl9CTE9DS0NIRUNLX0gKKworCisvKiBIaWdoIGxldmVsIGJsb2NrIEFQSSAqLwordm9pZCBvY2ZzMl9jb21wdXRlX21ldGFfZWNjKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEsCisJCQkgICAgc3RydWN0IG9jZnMyX2Jsb2NrX2NoZWNrICpiYyk7CitpbnQgb2NmczJfdmFsaWRhdGVfbWV0YV9lY2Moc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwKKwkJCSAgICBzdHJ1Y3Qgb2NmczJfYmxvY2tfY2hlY2sgKmJjKTsKK3ZvaWQgb2NmczJfY29tcHV0ZV9tZXRhX2VjY19iaHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaHMsIGludCBuciwKKwkJCQlzdHJ1Y3Qgb2NmczJfYmxvY2tfY2hlY2sgKmJjKTsKK2ludCBvY2ZzMl92YWxpZGF0ZV9tZXRhX2VjY19iaHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaHMsIGludCBuciwKKwkJCQlzdHJ1Y3Qgb2NmczJfYmxvY2tfY2hlY2sgKmJjKTsKKworLyogTG93ZXIgbGV2ZWwgQVBJICovCit2b2lkIG9jZnMyX2Jsb2NrX2NoZWNrX2NvbXB1dGUodm9pZCAqZGF0YSwgc2l6ZV90IGJsb2Nrc2l6ZSwKKwkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfYmxvY2tfY2hlY2sgKmJjKTsKK2ludCBvY2ZzMl9ibG9ja19jaGVja192YWxpZGF0ZSh2b2lkICpkYXRhLCBzaXplX3QgYmxvY2tzaXplLAorCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9ibG9ja19jaGVjayAqYmMpOwordm9pZCBvY2ZzMl9ibG9ja19jaGVja19jb21wdXRlX2JocyhzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaHMsIGludCBuciwKKwkJCQkgICBzdHJ1Y3Qgb2NmczJfYmxvY2tfY2hlY2sgKmJjKTsKK2ludCBvY2ZzMl9ibG9ja19jaGVja192YWxpZGF0ZV9iaHMoc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhzLCBpbnQgbnIsCisJCQkJICAgc3RydWN0IG9jZnMyX2Jsb2NrX2NoZWNrICpiYyk7CisKKy8qCisgKiBIYW1taW5nIGNvZGUgZnVuY3Rpb25zCisgKi8KKworLyoKKyAqIEVuY29kaW5nIGhhbW1pbmcgY29kZSBwYXJpdHkgYml0cyBmb3IgYSBidWZmZXIuCisgKgorICogVGhpcyBpcyB0aGUgbG93IGxldmVsIGVuY29kZXIgZnVuY3Rpb24uICBJdCBjYW4gYmUgY2FsbGVkIGFjcm9zcworICogbXVsdGlwbGUgaHVua3MganVzdCBsaWtlIHRoZSBjcmMzMiBjb2RlLiAgJ2QnIGlzIHRoZSBudW1iZXIgb2YgYml0cworICogX2luX3RoaXNfaHVua18uICBuciBpcyB0aGUgYml0IG9mZnNldCBvZiB0aGlzIGh1bmsuICBTbywgaWYgeW91IGhhZAorICogdHdvIDUxMkIgYnVmZmVycywgeW91IHdvdWxkIGRvIGl0IGxpa2Ugc286CisgKgorICogcGFyaXR5ID0gb2NmczJfaGFtbWluZ19lbmNvZGUoMCwgYnVmMSwgNTEyICogOCwgMCk7CisgKiBwYXJpdHkgPSBvY2ZzMl9oYW1taW5nX2VuY29kZShwYXJpdHksIGJ1ZjIsIDUxMiAqIDgsIDUxMiAqIDgpOworICoKKyAqIElmIHlvdSBqdXN0IGhhdmUgb25lIGJ1ZmZlciwgdXNlIG9jZnMyX2hhbW1pbmdfZW5jb2RlX2Jsb2NrKCkuCisgKi8KK3UzMiBvY2ZzMl9oYW1taW5nX2VuY29kZSh1MzIgcGFyaXR5LCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgZCwKKwkJCSB1bnNpZ25lZCBpbnQgbnIpOworLyoKKyAqIEZpeCBhIGJ1ZmZlciB3aXRoIGEgYml0IGVycm9yLiAgVGhlICdmaXgnIGlzIHRoZSBvcmlnaW5hbCBwYXJpdHkKKyAqIHhvcidkIHdpdGggdGhlIHBhcml0eSBjYWxjdWxhdGVkIG5vdy4KKyAqCisgKiBMaWtlIG9jZnMyX2hhbW1pbmdfZW5jb2RlKCksIHRoaXMgY2FuIGhhbmRsZSBodW5rcy4gIG5yIGlzIHRoZSBiaXQKKyAqIG9mZnNldCBvZiB0aGUgY3VycmVudCBodW5rLiAgSWYgYml0IHRvIGJlIGZpeGVkIGlzIG5vdCBwYXJ0IG9mIHRoZQorICogY3VycmVudCBodW5rLCB0aGlzIGRvZXMgbm90aGluZy4KKyAqCisgKiBJZiB5b3Ugb25seSBoYXZlIG9uZSBidWZmZXIsIHVzZSBvY2ZzMl9oYW1taW5nX2ZpeF9ibG9jaygpLgorICovCit2b2lkIG9jZnMyX2hhbW1pbmdfZml4KHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBkLCB1bnNpZ25lZCBpbnQgbnIsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgZml4KTsKKworLyogQ29udmVuaWVuY2Ugd3JhcHBlcnMgZm9yIGEgc2luZ2xlIGJ1ZmZlciBvZiBkYXRhICovCitleHRlcm4gdTMyIG9jZnMyX2hhbW1pbmdfZW5jb2RlX2Jsb2NrKHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBibG9ja3NpemUpOworZXh0ZXJuIHZvaWQgb2NmczJfaGFtbWluZ19maXhfYmxvY2sodm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGJsb2Nrc2l6ZSwKKwkJCQkgICAgdW5zaWduZWQgaW50IGZpeCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2J1ZmZlcl9oZWFkX2lvLmMgYi9mcy9vY2ZzMi9idWZmZXJfaGVhZF9pby5jCmluZGV4IDNhMTc4ZWMuLjE1YzhlNmQgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2J1ZmZlcl9oZWFkX2lvLmMKKysrIGIvZnMvb2NmczIvYnVmZmVyX2hlYWRfaW8uYwpAQCAtMzksNiArMzksMTggQEAKIAogI2luY2x1ZGUgImJ1ZmZlcl9oZWFkX2lvLmgiCiAKKy8qCisgKiBCaXRzIG9uIGJoLT5iX3N0YXRlIHVzZWQgYnkgb2NmczIuCisgKgorICogVGhlc2UgTVVTVCBiZSBhZnRlciB0aGUgSkJEMiBiaXRzLiAgSGVuY2UsIHdlIHVzZSBCSF9KQkRQcml2YXRlU3RhcnQuCisgKi8KK2VudW0gb2NmczJfc3RhdGVfYml0cyB7CisJQkhfTmVlZHNWYWxpZGF0ZSA9IEJIX0pCRFByaXZhdGVTdGFydCwKK307CisKKy8qIEV4cGFuZCB0aGUgbWFnaWMgYl9zdGF0ZSBmdW5jdGlvbnMgKi8KK0JVRkZFUl9GTlMoTmVlZHNWYWxpZGF0ZSwgbmVlZHNfdmFsaWRhdGUpOworCiBpbnQgb2NmczJfd3JpdGVfYmxvY2soc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCiAJCSAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CkBAIC0xNjYsNyArMTc4LDkgQEAKIH0KIAogaW50IG9jZnMyX3JlYWRfYmxvY2tzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCBibG9jaywgaW50IG5yLAotCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoc1tdLCBpbnQgZmxhZ3MpCisJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhzW10sIGludCBmbGFncywKKwkJICAgICAgaW50ICgqdmFsaWRhdGUpKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkpCiB7CiAJaW50IHN0YXR1cyA9IDA7CiAJaW50IGksIGlnbm9yZV9jYWNoZSA9IDA7CkBAIC0yOTgsNiArMzEyLDggQEAKIAogCQkJY2xlYXJfYnVmZmVyX3VwdG9kYXRlKGJoKTsKIAkJCWdldF9iaChiaCk7IC8qIGZvciBlbmRfYnVmZmVyX3JlYWRfc3luYygpICovCisJCQlpZiAodmFsaWRhdGUpCisJCQkJc2V0X2J1ZmZlcl9uZWVkc192YWxpZGF0ZShiaCk7CiAJCQliaC0+Yl9lbmRfaW8gPSBlbmRfYnVmZmVyX3JlYWRfc3luYzsKIAkJCXN1Ym1pdF9iaChSRUFELCBiaCk7CiAJCQljb250aW51ZTsKQEAgLTMyOCw2ICszNDQsMjAgQEAKIAkJCQliaHNbaV0gPSBOVUxMOwogCQkJCWNvbnRpbnVlOwogCQkJfQorCisJCQlpZiAoYnVmZmVyX25lZWRzX3ZhbGlkYXRlKGJoKSkgeworCQkJCS8qIFdlIG5ldmVyIHNldCBOZWVkc1ZhbGlkYXRlIGlmIHRoZQorCQkJCSAqIGJ1ZmZlciB3YXMgaGVsZCBieSB0aGUgam91cm5hbCwgc28KKwkJCQkgKiB0aGF0IGJldHRlciBub3QgaGF2ZSBjaGFuZ2VkICovCisJCQkJQlVHX09OKGJ1ZmZlcl9qYmQoYmgpKTsKKwkJCQljbGVhcl9idWZmZXJfbmVlZHNfdmFsaWRhdGUoYmgpOworCQkJCXN0YXR1cyA9IHZhbGlkYXRlKGlub2RlLT5pX3NiLCBiaCk7CisJCQkJaWYgKHN0YXR1cykgeworCQkJCQlwdXRfYmgoYmgpOworCQkJCQliaHNbaV0gPSBOVUxMOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CiAJCX0KIAogCQkvKiBBbHdheXMgc2V0IHRoZSBidWZmZXIgaW4gdGhlIGNhY2hlLCBldmVuIGlmIGl0IHdhcwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvYnVmZmVyX2hlYWRfaW8uaCBiL2ZzL29jZnMyL2J1ZmZlcl9oZWFkX2lvLmgKaW5kZXggNzVlMWRjYi4uYzc1ZDY4MiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvYnVmZmVyX2hlYWRfaW8uaAorKysgYi9mcy9vY2ZzMi9idWZmZXJfaGVhZF9pby5oCkBAIC0zMSwyMSArMzEsMjQgQEAKIHZvaWQgb2NmczJfZW5kX2J1ZmZlcl9pb19zeW5jKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCiAJCQkgICAgIGludCB1cHRvZGF0ZSk7CiAKLXN0YXRpYyBpbmxpbmUgaW50IG9jZnMyX3JlYWRfYmxvY2soc3RydWN0IGlub2RlCSAgICAgICAqaW5vZGUsCi0JCQkJICAgdTY0ICAgICAgICAgICAgICAgICAgb2ZmLAotCQkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJoKTsKLQogaW50IG9jZnMyX3dyaXRlX2Jsb2NrKHN0cnVjdCBvY2ZzMl9zdXBlciAgICAgICAgICAqb3NiLAogCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgICpiaCwKIAkJICAgICAgc3RydWN0IGlub2RlICAgICAgICAqaW5vZGUpOwotaW50IG9jZnMyX3JlYWRfYmxvY2tzKHN0cnVjdCBpbm9kZQkgICppbm9kZSwKLQkJICAgICAgdTY0ICAgICAgICAgICAgICAgICAgYmxvY2ssCi0JCSAgICAgIGludCAgICAgICAgICAgICAgICAgIG5yLAotCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgICpiaHNbXSwKLQkJICAgICAgaW50ICAgICAgICAgICAgICAgICAgZmxhZ3MpOwogaW50IG9jZnMyX3JlYWRfYmxvY2tzX3N5bmMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsIHU2NCBibG9jaywKIAkJCSAgIHVuc2lnbmVkIGludCBuciwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaHNbXSk7CiAKKy8qCisgKiBJZiBub3QgTlVMTCwgdmFsaWRhdGUoKSB3aWxsIGJlIGNhbGxlZCBvbiBhIGJ1ZmZlciB0aGF0IGlzIGZyZXNobHkKKyAqIHJlYWQgZnJvbSBkaXNrLiAgSXQgd2lsbCBub3QgYmUgY2FsbGVkIGlmIHRoZSBidWZmZXIgd2FzIGluIGNhY2hlLgorICogTm90ZSB0aGF0IGlmIHZhbGlkYXRlKCkgaXMgYmVpbmcgdXNlZCBmb3IgdGhpcyBidWZmZXIsIGl0IG5lZWRzIHRvCisgKiBiZSBzZXQgZXZlbiBmb3IgYSBSRUFEQUhFQUQgY2FsbCwgYXMgaXQgbWFya3MgdGhlIGJ1ZmZlciBmb3IgbGF0ZXIKKyAqIHZhbGlkYXRpb24uCisgKi8KK2ludCBvY2ZzMl9yZWFkX2Jsb2NrcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgYmxvY2ssIGludCBuciwKKwkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaHNbXSwgaW50IGZsYWdzLAorCQkgICAgICBpbnQgKCp2YWxpZGF0ZSkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKSk7CisKIGludCBvY2ZzMl93cml0ZV9zdXBlcl9vcl9iYWNrdXAoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CiAKQEAgLTUzLDcgKzU2LDkgQEAKICNkZWZpbmUgT0NGUzJfQkhfUkVBREFIRUFEICAgICAgICAgOAogCiBzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9yZWFkX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCBvZmYsCi0JCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmgpCisJCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmgsCisJCQkJICAgaW50ICgqdmFsaWRhdGUpKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKSkKIHsKIAlpbnQgc3RhdHVzID0gMDsKIApAQCAtNjMsNyArNjgsNyBAQAogCQlnb3RvIGJhaWw7CiAJfQogCi0Jc3RhdHVzID0gb2NmczJfcmVhZF9ibG9ja3MoaW5vZGUsIG9mZiwgMSwgYmgsIDApOworCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2tzKGlub2RlLCBvZmYsIDEsIGJoLCAwLCB2YWxpZGF0ZSk7CiAKIGJhaWw6CiAJcmV0dXJuIHN0YXR1czsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2NsdXN0ZXIvaGVhcnRiZWF0LmMgYi9mcy9vY2ZzMi9jbHVzdGVyL2hlYXJ0YmVhdC5jCmluZGV4IDZlYmFhNTguLjA0Njk3YmEgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2NsdXN0ZXIvaGVhcnRiZWF0LmMKKysrIGIvZnMvb2NmczIvY2x1c3Rlci9oZWFydGJlYXQuYwpAQCAtODU0LDcgKzg1NCw3IEBACiAKIAl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSAmJiAhcmVnLT5ocl91bmNsZWFuX3N0b3ApIHsKIAkJLyogV2UgdHJhY2sgdGhlIHRpbWUgc3BlbnQgaW5zaWRlCi0JCSAqIG8yaGJfZG9fZGlza19oZWFydGJlYXQgc28gdGhhdCB3ZSBhdm9pZCBtb3JlIHRoZW4KKwkJICogbzJoYl9kb19kaXNrX2hlYXJ0YmVhdCBzbyB0aGF0IHdlIGF2b2lkIG1vcmUgdGhhbgogCQkgKiBocl90aW1lb3V0X21zIGJldHdlZW4gZGlzayB3cml0ZXMuIE9uIGJ1c3kgc3lzdGVtcwogCQkgKiB0aGlzIHNob3VsZCByZXN1bHQgaW4gYSBoZWFydGJlYXQgd2hpY2ggaXMgbGVzcwogCQkgKiBsaWtlbHkgdG8gdGltZSBpdHNlbGYgb3V0LiAqLwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvY2x1c3Rlci9tYXNrbG9nLmMgYi9mcy9vY2ZzMi9jbHVzdGVyL21hc2tsb2cuYwppbmRleCBkOGEwY2I5Li45NmRmNTQxIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9jbHVzdGVyL21hc2tsb2cuYworKysgYi9mcy9vY2ZzMi9jbHVzdGVyL21hc2tsb2cuYwpAQCAtMTEwLDYgKzExMCw3IEBACiAJZGVmaW5lX21hc2soUVVPUlVNKSwKIAlkZWZpbmVfbWFzayhFWFBPUlQpLAogCWRlZmluZV9tYXNrKFhBVFRSKSwKKwlkZWZpbmVfbWFzayhRVU9UQSksCiAJZGVmaW5lX21hc2soRVJST1IpLAogCWRlZmluZV9tYXNrKE5PVElDRSksCiAJZGVmaW5lX21hc2soS1RIUkVBRCksCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9jbHVzdGVyL21hc2tsb2cuaCBiL2ZzL29jZnMyL2NsdXN0ZXIvbWFza2xvZy5oCmluZGV4IDU3NjcwYzYuLjdlNzJhODEgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2NsdXN0ZXIvbWFza2xvZy5oCisrKyBiL2ZzL29jZnMyL2NsdXN0ZXIvbWFza2xvZy5oCkBAIC0xMTMsNiArMTEzLDcgQEAKICNkZWZpbmUgTUxfUVVPUlVNCTB4MDAwMDAwMDAwODAwMDAwMFVMTCAvKiBuZXQgY29ubmVjdGlvbiBxdW9ydW0gKi8KICNkZWZpbmUgTUxfRVhQT1JUCTB4MDAwMDAwMDAxMDAwMDAwMFVMTCAvKiBvY2ZzMiBleHBvcnQgb3BlcmF0aW9ucyAqLwogI2RlZmluZSBNTF9YQVRUUgkweDAwMDAwMDAwMjAwMDAwMDBVTEwgLyogb2NmczIgZXh0ZW5kZWQgYXR0cmlidXRlcyAqLworI2RlZmluZSBNTF9RVU9UQQkweDAwMDAwMDAwNDAwMDAwMDBVTEwgLyogb2NmczIgcXVvdGEgb3BlcmF0aW9ucyAqLwogLyogYml0cyB0aGF0IGFyZSBpbmZyZXF1ZW50bHkgZ2l2ZW4gYW5kIGZyZXF1ZW50bHkgbWF0Y2hlZCBpbiB0aGUgaGlnaCB3b3JkICovCiAjZGVmaW5lIE1MX0VSUk9SCTB4MDAwMDAwMDEwMDAwMDAwMFVMTCAvKiBzZW50IHRvIEtFUk5fRVJSICovCiAjZGVmaW5lIE1MX05PVElDRQkweDAwMDAwMDAyMDAwMDAwMDBVTEwgLyogc2V0biB0byBLRVJOX05PVElDRSAqLwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGlyLmMgYi9mcy9vY2ZzMi9kaXIuYwppbmRleCAwMjZlNmViLi5mMmM0MDk4IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kaXIuYworKysgYi9mcy9vY2ZzMi9kaXIuYwpAQCAtNDAsNiArNDAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgogCiAjZGVmaW5lIE1MT0dfTUFTS19QUkVGSVggTUxfTkFNRUkKICNpbmNsdWRlIDxjbHVzdGVyL21hc2tsb2cuaD4KQEAgLTQ3LDYgKzQ4LDcgQEAKICNpbmNsdWRlICJvY2ZzMi5oIgogCiAjaW5jbHVkZSAiYWxsb2MuaCIKKyNpbmNsdWRlICJibG9ja2NoZWNrLmgiCiAjaW5jbHVkZSAiZGlyLmgiCiAjaW5jbHVkZSAiZGxtZ2x1ZS5oIgogI2luY2x1ZGUgImV4dGVudF9tYXAuaCIKQEAgLTgyLDQ3ICs4NCw3MiBAQAogCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjLAogCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKm5ld19iaCk7CiAKLXN0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKm9jZnMyX2JyZWFkKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJICAgICAgIGludCBibG9jaywgaW50ICplcnIsIGludCByZWFkYSkKKy8qCisgKiBUaGVzZSBhcmUgZGlzdGluY3QgY2hlY2tzIGJlY2F1c2UgZnV0dXJlIHZlcnNpb25zIG9mIHRoZSBmaWxlIHN5c3RlbSB3aWxsCisgKiB3YW50IHRvIGhhdmUgYSB0cmFpbGluZyBkaXJlbnQgc3RydWN0dXJlIGluZGVwZW5kZW50IG9mIGluZGV4aW5nLgorICovCitzdGF0aWMgaW50IG9jZnMyX2Rpcl9oYXNfdHJhaWxlcihzdHJ1Y3QgaW5vZGUgKmRpcikKIHsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKLQlpbnQgdG1wZXJyOwotCXU2NCBwX2Jsa25vOwotCWludCByZWFkZmxhZ3MgPSAwOworCWlmIChPQ0ZTMl9JKGRpciktPmlwX2R5bl9mZWF0dXJlcyAmIE9DRlMyX0lOTElORV9EQVRBX0ZMKQorCQlyZXR1cm4gMDsKIAotCWlmIChyZWFkYSkKLQkJcmVhZGZsYWdzIHw9IE9DRlMyX0JIX1JFQURBSEVBRDsKKwlyZXR1cm4gb2NmczJfbWV0YV9lY2MoT0NGUzJfU0IoZGlyLT5pX3NiKSk7Cit9CiAKLQlpZiAoKCh1NjQpYmxvY2sgPDwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpID49Ci0JICAgIGlfc2l6ZV9yZWFkKGlub2RlKSkgewotCQlCVUdfT04oIXJlYWRhKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorc3RhdGljIGludCBvY2ZzMl9zdXBwb3J0c19kaXJfdHJhaWxlcihzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYikKK3sKKwlyZXR1cm4gb2NmczJfbWV0YV9lY2Mob3NiKTsKK30KIAotCWRvd25fcmVhZCgmT0NGUzJfSShpbm9kZSktPmlwX2FsbG9jX3NlbSk7Ci0JdG1wZXJyID0gb2NmczJfZXh0ZW50X21hcF9nZXRfYmxvY2tzKGlub2RlLCBibG9jaywgJnBfYmxrbm8sIE5VTEwsCi0JCQkJCSAgICAgTlVMTCk7Ci0JdXBfcmVhZCgmT0NGUzJfSShpbm9kZSktPmlwX2FsbG9jX3NlbSk7Ci0JaWYgKHRtcGVyciA8IDApIHsKLQkJbWxvZ19lcnJubyh0bXBlcnIpOwotCQlnb3RvIGZhaWw7Ci0JfQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgb2NmczJfZGlyX3RyYWlsZXJfYmxrX29mZihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXJldHVybiBzYi0+c19ibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IG9jZnMyX2Rpcl9ibG9ja190cmFpbGVyKTsKK30KIAotCXRtcGVyciA9IG9jZnMyX3JlYWRfYmxvY2tzKGlub2RlLCBwX2Jsa25vLCAxLCAmYmgsIHJlYWRmbGFncyk7Ci0JaWYgKHRtcGVyciA8IDApCi0JCWdvdG8gZmFpbDsKKyNkZWZpbmUgb2NmczJfdHJhaWxlcl9mcm9tX2JoKF9iaCwgX3NiKSAoKHN0cnVjdCBvY2ZzMl9kaXJfYmxvY2tfdHJhaWxlciAqKSAoKF9iaCktPmJfZGF0YSArIG9jZnMyX2Rpcl90cmFpbGVyX2Jsa19vZmYoKF9zYikpKSkKIAotCXRtcGVyciA9IDA7CisvKiBYWFggb2NmczJfYmxvY2tfZHF0cmFpbGVyKCkgaXMgc2ltaWxhciBidXQgbm90IHF1aXRlIC0gY2FuIHdlIG1ha2UKKyAqIHRoZW0gbW9yZSBjb25zaXN0ZW50PyAqLworc3RydWN0IG9jZnMyX2Rpcl9ibG9ja190cmFpbGVyICpvY2ZzMl9kaXJfdHJhaWxlcl9mcm9tX3NpemUoaW50IGJsb2Nrc2l6ZSwKKwkJCQkJCQkgICAgdm9pZCAqZGF0YSkKK3sKKwljaGFyICpwID0gZGF0YTsKIAotCSplcnIgPSAwOwotCXJldHVybiBiaDsKKwlwICs9IGJsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3Qgb2NmczJfZGlyX2Jsb2NrX3RyYWlsZXIpOworCXJldHVybiAoc3RydWN0IG9jZnMyX2Rpcl9ibG9ja190cmFpbGVyICopcDsKK30KIAotZmFpbDoKLQlicmVsc2UoYmgpOwotCWJoID0gTlVMTDsKKy8qCisgKiBYWFg6IFRoaXMgaXMgZXhlY3V0ZWQgb25jZSBvbiBldmVyeSBkaXJlbnQuIFdlIHNob3VsZCBjb25zaWRlciBvcHRpbWl6aW5nCisgKiBpdC4KKyAqLworc3RhdGljIGludCBvY2ZzMl9za2lwX2Rpcl90cmFpbGVyKHN0cnVjdCBpbm9kZSAqZGlyLAorCQkJCSAgc3RydWN0IG9jZnMyX2Rpcl9lbnRyeSAqZGUsCisJCQkJICB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgYmxrbGVuKQoreworCXVuc2lnbmVkIGxvbmcgdG9mZiA9IGJsa2xlbiAtIHNpemVvZihzdHJ1Y3Qgb2NmczJfZGlyX2Jsb2NrX3RyYWlsZXIpOwogCi0JKmVyciA9IC1FSU87Ci0JcmV0dXJuIE5VTEw7CisJaWYgKCFvY2ZzMl9kaXJfaGFzX3RyYWlsZXIoZGlyKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAob2Zmc2V0ICE9IHRvZmYpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIG9jZnMyX2luaXRfZGlyX3RyYWlsZXIoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXN0cnVjdCBvY2ZzMl9kaXJfYmxvY2tfdHJhaWxlciAqdHJhaWxlcjsKKworCXRyYWlsZXIgPSBvY2ZzMl90cmFpbGVyX2Zyb21fYmgoYmgsIGlub2RlLT5pX3NiKTsKKwlzdHJjcHkodHJhaWxlci0+ZGJfc2lnbmF0dXJlLCBPQ0ZTMl9ESVJfVFJBSUxFUl9TSUdOQVRVUkUpOworCXRyYWlsZXItPmRiX2NvbXBhdF9yZWNfbGVuID0KKwkJCWNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3Qgb2NmczJfZGlyX2Jsb2NrX3RyYWlsZXIpKTsKKwl0cmFpbGVyLT5kYl9wYXJlbnRfZGlub2RlID0gY3B1X3RvX2xlNjQoT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vKTsKKwl0cmFpbGVyLT5kYl9ibGtubyA9IGNwdV90b19sZTY0KGJoLT5iX2Jsb2NrbnIpOwogfQogCiAvKgpAQCAtMjMxLDcgKzI1OCw3IEBACiAJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGk7CiAJc3RydWN0IG9jZnMyX2lubGluZV9kYXRhICpkYXRhOwogCi0JcmV0ID0gb2NmczJfcmVhZF9ibG9jayhkaXIsIE9DRlMyX0koZGlyKS0+aXBfYmxrbm8sICZkaV9iaCk7CisJcmV0ID0gb2NmczJfcmVhZF9pbm9kZV9ibG9jayhkaXIsICZkaV9iaCk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwpAQCAtMjUwLDYgKzI3NywxMDggQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIGludCBvY2ZzMl92YWxpZGF0ZV9kaXJfYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlpbnQgcmM7CisJc3RydWN0IG9jZnMyX2Rpcl9ibG9ja190cmFpbGVyICp0cmFpbGVyID0KKwkJb2NmczJfdHJhaWxlcl9mcm9tX2JoKGJoLCBzYik7CisKKworCS8qCisJICogV2UgZG9uJ3QgdmFsaWRhdGUgZGlyZW50cyBoZXJlLCB0aGF0J3MgaGFuZGxlZAorCSAqIGluLXBsYWNlIHdoZW4gdGhlIGNvZGUgd2Fsa3MgdGhlbS4KKwkgKi8KKwltbG9nKDAsICJWYWxpZGF0aW5nIGRpcmJsb2NrICVsbHVcbiIsCisJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIpOworCisJQlVHX09OKCFidWZmZXJfdXB0b2RhdGUoYmgpKTsKKworCS8qCisJICogSWYgdGhlIGVjYyBmYWlscywgd2UgcmV0dXJuIHRoZSBlcnJvciBidXQgb3RoZXJ3aXNlCisJICogbGVhdmUgdGhlIGZpbGVzeXN0ZW0gcnVubmluZy4gIFdlIGtub3cgYW55IGVycm9yIGlzCisJICogbG9jYWwgdG8gdGhpcyBibG9jay4KKwkgKgorCSAqIE5vdGUgdGhhdCB3ZSBhcmUgc2FmZSB0byBjYWxsIHRoaXMgZXZlbiBpZiB0aGUgZGlyZWN0b3J5CisJICogZG9lc24ndCBoYXZlIGEgdHJhaWxlci4gIEZpbGVzeXN0ZW1zIHdpdGhvdXQgbWV0YWVjYyB3aWxsIGRvCisJICogbm90aGluZywgYW5kIGZpbGVzeXN0ZW1zIHdpdGggaXQgd2lsbCBoYXZlIG9uZS4KKwkgKi8KKwlyYyA9IG9jZnMyX3ZhbGlkYXRlX21ldGFfZWNjKHNiLCBiaC0+Yl9kYXRhLCAmdHJhaWxlci0+ZGJfY2hlY2spOworCWlmIChyYykKKwkJbWxvZyhNTF9FUlJPUiwgIkNoZWNrc3VtIGZhaWxlZCBmb3IgZGlub2RlICVsbHVcbiIsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yKTsKKworCXJldHVybiByYzsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZm9yY2VzIGFsbCBlcnJvcnMgdG8gLUVJTyBmb3IgY29uc2lzdGVuY3kgd2l0aCBpdHMKKyAqIHByZWRlY2Vzc29yLCBvY2ZzMl9icmVhZCgpLiAgV2UgaGF2ZW4ndCBhdWRpdGVkIHdoYXQgcmV0dXJuaW5nIHRoZQorICogcmVhbCBlcnJvciBjb2RlcyB3b3VsZCBkbyB0byBjYWxsZXJzLiAgV2UgbG9nIHRoZSByZWFsIGNvZGVzIHdpdGgKKyAqIG1sb2dfZXJybm8oKSBiZWZvcmUgd2Ugc3F1YXNoIHRoZW0uCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfcmVhZF9kaXJfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgdTY0IHZfYmxvY2ssCisJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmgsIGludCBmbGFncykKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBidWZmZXJfaGVhZCAqdG1wID0gKmJoOworCXN0cnVjdCBvY2ZzMl9kaXJfYmxvY2tfdHJhaWxlciAqdHJhaWxlcjsKKworCXJjID0gb2NmczJfcmVhZF92aXJ0X2Jsb2Nrcyhpbm9kZSwgdl9ibG9jaywgMSwgJnRtcCwgZmxhZ3MsCisJCQkJICAgIG9jZnMyX3ZhbGlkYXRlX2Rpcl9ibG9jayk7CisJaWYgKHJjKSB7CisJCW1sb2dfZXJybm8ocmMpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIFdlIGNoZWNrIHRoZSB0cmFpbGVyIGhlcmUgcmF0aGVyIHRoYW4gaW4KKwkgKiBvY2ZzMl92YWxpZGF0ZV9kaXJfYmxvY2soKSBiZWNhdXNlIHRoYXQgZnVuY3Rpb24gZG9lc24ndCBoYXZlCisJICogdGhlIGlub2RlIHRvIHRlc3QuCisJICovCisJaWYgKCEoZmxhZ3MgJiBPQ0ZTMl9CSF9SRUFEQUhFQUQpICYmCisJICAgIG9jZnMyX2Rpcl9oYXNfdHJhaWxlcihpbm9kZSkpIHsKKwkJdHJhaWxlciA9IG9jZnMyX3RyYWlsZXJfZnJvbV9iaCh0bXAsIGlub2RlLT5pX3NiKTsKKwkJaWYgKCFPQ0ZTMl9JU19WQUxJRF9ESVJfVFJBSUxFUih0cmFpbGVyKSkgeworCQkJcmMgPSAtRUlOVkFMOworCQkJb2NmczJfZXJyb3IoaW5vZGUtPmlfc2IsCisJCQkJICAgICJJbnZhbGlkIGRpcmJsb2NrICMlbGx1OiAiCisJCQkJICAgICJzaWduYXR1cmUgPSAlLipzXG4iLAorCQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKXRtcC0+Yl9ibG9ja25yLCA3LAorCQkJCSAgICB0cmFpbGVyLT5kYl9zaWduYXR1cmUpOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKGxlNjRfdG9fY3B1KHRyYWlsZXItPmRiX2Jsa25vKSAhPSB0bXAtPmJfYmxvY2tucikgeworCQkJcmMgPSAtRUlOVkFMOworCQkJb2NmczJfZXJyb3IoaW5vZGUtPmlfc2IsCisJCQkJICAgICJEaXJlY3RvcnkgYmxvY2sgIyVsbHUgaGFzIGFuIGludmFsaWQgIgorCQkJCSAgICAiZGJfYmxrbm8gb2YgJWxsdSIsCisJCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpdG1wLT5iX2Jsb2NrbnIsCisJCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUodHJhaWxlci0+ZGJfYmxrbm8pKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChsZTY0X3RvX2NwdSh0cmFpbGVyLT5kYl9wYXJlbnRfZGlub2RlKSAhPQorCQkgICAgT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vKSB7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlvY2ZzMl9lcnJvcihpbm9kZS0+aV9zYiwKKwkJCQkgICAgIkRpcmVjdG9yeSBibG9jayAjJWxsdSBvbiBkaW5vZGUgIgorCQkJCSAgICAiIyVsbHUgaGFzIGFuIGludmFsaWQgcGFyZW50X2Rpbm9kZSAiCisJCQkJICAgICJvZiAlbGx1IiwKKwkJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl0bXAtPmJfYmxvY2tuciwKKwkJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sCisJCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUodHJhaWxlci0+ZGJfYmxrbm8pKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJLyogSWYgb2NmczJfcmVhZF92aXJ0X2Jsb2NrcygpIGdvdCB1cyBhIG5ldyBiaCwgcGFzcyBpdCB1cC4gKi8KKwlpZiAoISpiaCkKKwkJKmJoID0gdG1wOworCitvdXQ6CisJcmV0dXJuIHJjID8gLUVJTyA6IDA7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKm9jZnMyX2ZpbmRfZW50cnlfZWwoY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sCiAJCQkJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKmRpciwKIAkJCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9kaXJfZW50cnkgKipyZXNfZGlyKQpAQCAtMjk2LDE1ICs0MjUsMTcgQEAKIAkJCQl9CiAJCQkJbnVtKys7CiAKLQkJCQliaCA9IG9jZnMyX2JyZWFkKGRpciwgYisrLCAmZXJyLCAxKTsKKwkJCQliaCA9IE5VTEw7CisJCQkJZXJyID0gb2NmczJfcmVhZF9kaXJfYmxvY2soZGlyLCBiKyssICZiaCwKKwkJCQkJCQkgICBPQ0ZTMl9CSF9SRUFEQUhFQUQpOwogCQkJCWJoX3VzZVtyYV9tYXhdID0gYmg7CiAJCQl9CiAJCX0KIAkJaWYgKChiaCA9IGJoX3VzZVtyYV9wdHIrK10pID09IE5VTEwpCiAJCQlnb3RvIG5leHQ7Ci0JCWlmIChvY2ZzMl9yZWFkX2Jsb2NrKGRpciwgYmxvY2ssICZiaCkpIHsKKwkJaWYgKG9jZnMyX3JlYWRfZGlyX2Jsb2NrKGRpciwgYmxvY2ssICZiaCwgMCkpIHsKIAkJCS8qIHJlYWQgZXJyb3IsIHNraXAgYmxvY2sgJiBob3BlIGZvciB0aGUgYmVzdC4KLQkJCSAqIG9jZnMyX3JlYWRfYmxvY2soKSBoYXMgcmVsZWFzZWQgdGhlIGJoLiAqLworCQkJICogb2NmczJfcmVhZF9kaXJfYmxvY2soKSBoYXMgcmVsZWFzZWQgdGhlIGJoLiAqLwogCQkJb2NmczJfZXJyb3IoZGlyLT5pX3NiLCAicmVhZGluZyBkaXJlY3RvcnkgJWxsdSwgIgogCQkJCSAgICAib2Zmc2V0ICVsdVxuIiwKIAkJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGRpciktPmlwX2Jsa25vLApAQCAtMzgxLDE0ICs1MTIsMTggQEAKIAkJICAgICAgIHN0cnVjdCBpbm9kZSAqbmV3X2VudHJ5X2lub2RlKQogewogCWludCByZXQ7CisJb2NmczJfam91cm5hbF9hY2Nlc3NfZnVuYyBhY2Nlc3MgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19kYjsKIAogCS8qCiAJICogVGhlIHNhbWUgY29kZSB3b3JrcyBmaW5lIGZvciBib3RoIGlubGluZS1kYXRhIGFuZCBleHRlbnQKLQkgKiBiYXNlZCBkaXJlY3Rvcmllcywgc28gbm8gbmVlZCB0byBzcGxpdCB0aGlzIHVwLgorCSAqIGJhc2VkIGRpcmVjdG9yaWVzLCBzbyBubyBuZWVkIHRvIHNwbGl0IHRoaXMgdXAuICBUaGUgb25seQorCSAqIGRpZmZlcmVuY2UgaXMgdGhlIGpvdXJuYWxfYWNjZXNzIGZ1bmN0aW9uLgogCSAqLwogCi0JcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBkaXIsIGRlX2JoLAotCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlpZiAoT0NGUzJfSShkaXIpLT5pcF9keW5fZmVhdHVyZXMgJiBPQ0ZTMl9JTkxJTkVfREFUQV9GTCkKKwkJYWNjZXNzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZGk7CisKKwlyZXQgPSBhY2Nlc3MoaGFuZGxlLCBkaXIsIGRlX2JoLCBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwpAQCAtNDEwLDkgKzU0NSwxMyBAQAogewogCXN0cnVjdCBvY2ZzMl9kaXJfZW50cnkgKmRlLCAqcGRlOwogCWludCBpLCBzdGF0dXMgPSAtRU5PRU5UOworCW9jZnMyX2pvdXJuYWxfYWNjZXNzX2Z1bmMgYWNjZXNzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZGI7CiAKIAltbG9nX2VudHJ5KCIoMHglcCwgMHglcCwgMHglcCwgMHglcClcbiIsIGhhbmRsZSwgZGlyLCBkZV9kZWwsIGJoKTsKIAorCWlmIChPQ0ZTMl9JKGRpciktPmlwX2R5bl9mZWF0dXJlcyAmIE9DRlMyX0lOTElORV9EQVRBX0ZMKQorCQlhY2Nlc3MgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19kaTsKKwogCWkgPSAwOwogCXBkZSA9IE5VTEw7CiAJZGUgPSAoc3RydWN0IG9jZnMyX2Rpcl9lbnRyeSAqKSBmaXJzdF9kZTsKQEAgLTQyMyw4ICs1NjIsOCBAQAogCQkJZ290byBiYWlsOwogCQl9CiAJCWlmIChkZSA9PSBkZV9kZWwpICB7Ci0JCQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGRpciwgYmgsCi0JCQkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJCQlzdGF0dXMgPSBhY2Nlc3MoaGFuZGxlLCBkaXIsIGJoLAorCQkJCQlPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJCQlpZiAoc3RhdHVzIDwgMCkgewogCQkJCXN0YXR1cyA9IC1FSU87CiAJCQkJbWxvZ19lcnJubyhzdGF0dXMpOwpAQCAtNDU4LDcgKzU5Nyw3IEBACiAJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGk7CiAJc3RydWN0IG9jZnMyX2lubGluZV9kYXRhICpkYXRhOwogCi0JcmV0ID0gb2NmczJfcmVhZF9ibG9jayhkaXIsIE9DRlMyX0koZGlyKS0+aXBfYmxrbm8sICZkaV9iaCk7CisJcmV0ID0gb2NmczJfcmVhZF9pbm9kZV9ibG9jayhkaXIsICZkaV9iaCk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwpAQCAtNTc2LDYgKzcxNSwxNiBAQAogCQkJZ290byBiYWlsOwogCQl9CiAKKwkJLyogV2UncmUgZ3VhcmFudGVlZCB0aGF0IHdlIHNob3VsZCBoYXZlIHNwYWNlLCBzbyB3ZQorCQkgKiBjYW4ndCBwb3NzaWJseSBoYXZlIGhpdCB0aGUgdHJhaWxlci4uLnJpZ2h0PyAqLworCQltbG9nX2J1Z19vbl9tc2cob2NmczJfc2tpcF9kaXJfdHJhaWxlcihkaXIsIGRlLCBvZmZzZXQsIHNpemUpLAorCQkJCSJIaXQgZGlyIHRyYWlsZXIgdHJ5aW5nIHRvIGluc2VydCAlLipzICIKKwkJCSAgICAgICAgIihuYW1lbGVuICVkKSBpbnRvIGRpcmVjdG9yeSAlbGx1LiAgIgorCQkJCSJvZmZzZXQgaXMgJWx1LCB0cmFpbGVyIG9mZnNldCBpcyAlZFxuIiwKKwkJCQluYW1lbGVuLCBuYW1lLCBuYW1lbGVuLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcGFyZW50X2ZlX2JoLT5iX2Jsb2NrbnIsCisJCQkJb2Zmc2V0LCBvY2ZzMl9kaXJfdHJhaWxlcl9ibGtfb2ZmKGRpci0+aV9zYikpOworCiAJCWlmIChvY2ZzMl9kaXJlbnRfd291bGRfZml0KGRlLCByZWNfbGVuKSkgewogCQkJZGlyLT5pX210aW1lID0gZGlyLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCQkJcmV0dmFsID0gb2NmczJfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGRpciwgcGFyZW50X2ZlX2JoKTsKQEAgLTU4NCw4ICs3MzMsMTQgQEAKIAkJCQlnb3RvIGJhaWw7CiAJCQl9CiAKLQkJCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgZGlyLCBpbnNlcnRfYmgsCi0JCQkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJCQlpZiAoaW5zZXJ0X2JoID09IHBhcmVudF9mZV9iaCkKKwkJCQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19kaShoYW5kbGUsIGRpciwKKwkJCQkJCQkJIGluc2VydF9iaCwKKwkJCQkJCQkJIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwkJCWVsc2UKKwkJCQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19kYihoYW5kbGUsIGRpciwKKwkJCQkJCQkJIGluc2VydF9iaCwKKwkJCQkJCQkJIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAkJCS8qIEJ5IG5vdyB0aGUgYnVmZmVyIGlzIG1hcmtlZCBmb3Igam91cm5hbGluZyAqLwogCQkJb2Zmc2V0ICs9IGxlMTZfdG9fY3B1KGRlLT5yZWNfbGVuKTsKIAkJCWlmIChsZTY0X3RvX2NwdShkZS0+aW5vZGUpKSB7CkBAIC02MTEsNiArNzY2LDcgQEAKIAkJCXJldHZhbCA9IDA7CiAJCQlnb3RvIGJhaWw7CiAJCX0KKwogCQlvZmZzZXQgKz0gbGUxNl90b19jcHUoZGUtPnJlY19sZW4pOwogCQlkZSA9IChzdHJ1Y3Qgb2NmczJfZGlyX2VudHJ5ICopICgoY2hhciAqKSBkZSArIGxlMTZfdG9fY3B1KGRlLT5yZWNfbGVuKSk7CiAJfQpAQCAtNjM2LDcgKzc5Miw3IEBACiAJc3RydWN0IG9jZnMyX2lubGluZV9kYXRhICpkYXRhOwogCXN0cnVjdCBvY2ZzMl9kaXJfZW50cnkgKmRlOwogCi0JcmV0ID0gb2NmczJfcmVhZF9ibG9jayhpbm9kZSwgT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLCAmZGlfYmgpOworCXJldCA9IG9jZnMyX3JlYWRfaW5vZGVfYmxvY2soaW5vZGUsICZkaV9iaCk7CiAJaWYgKHJldCkgewogCQltbG9nKE1MX0VSUk9SLCAiVW5hYmxlIHRvIHJlYWQgaW5vZGUgYmxvY2sgZm9yIGRpciAlbGx1XG4iLAogCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vKTsKQEAgLTcyNCw3ICs4ODAsNiBAQAogCWludCBpLCBzdG9yZWQ7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgsICogdG1wOwogCXN0cnVjdCBvY2ZzMl9kaXJfZW50cnkgKiBkZTsKLQlpbnQgZXJyOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiID0gaW5vZGUtPmlfc2I7CiAJdW5zaWduZWQgaW50IHJhX3NlY3RvcnMgPSAxNjsKIApAQCAtNzM1LDEyICs4OTAsOCBAQAogCiAJd2hpbGUgKCFlcnJvciAmJiAhc3RvcmVkICYmICpmX3BvcyA8IGlfc2l6ZV9yZWFkKGlub2RlKSkgewogCQlibGsgPSAoKmZfcG9zKSA+PiBzYi0+c19ibG9ja3NpemVfYml0czsKLQkJYmggPSBvY2ZzMl9icmVhZChpbm9kZSwgYmxrLCAmZXJyLCAwKTsKLQkJaWYgKCFiaCkgewotCQkJbWxvZyhNTF9FUlJPUiwKLQkJCSAgICAgImRpcmVjdG9yeSAjJWxsdSBjb250YWlucyBhIGhvbGUgYXQgb2Zmc2V0ICVsbGRcbiIsCi0JCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAotCQkJICAgICAqZl9wb3MpOworCQlpZiAob2NmczJfcmVhZF9kaXJfYmxvY2soaW5vZGUsIGJsaywgJmJoLCAwKSkgeworCQkJLyogU2tpcCB0aGUgY29ycnVwdCBkaXJibG9jayBhbmQga2VlcCB0cnlpbmcgKi8KIAkJCSpmX3BvcyArPSBzYi0+c19ibG9ja3NpemUgLSBvZmZzZXQ7CiAJCQljb250aW51ZTsKIAkJfQpAQCAtNzU0LDggKzkwNSwxMCBAQAogCQkgICAgfHwgKCgobGFzdF9yYV9ibGsgLSBibGspIDw8IDkpIDw9IChyYV9zZWN0b3JzIC8gMikpKSB7CiAJCQlmb3IgKGkgPSByYV9zZWN0b3JzID4+IChzYi0+c19ibG9ja3NpemVfYml0cyAtIDkpOwogCQkJICAgICBpID4gMDsgaS0tKSB7Ci0JCQkJdG1wID0gb2NmczJfYnJlYWQoaW5vZGUsICsrYmxrLCAmZXJyLCAxKTsKLQkJCQlicmVsc2UodG1wKTsKKwkJCQl0bXAgPSBOVUxMOworCQkJCWlmICghb2NmczJfcmVhZF9kaXJfYmxvY2soaW5vZGUsICsrYmxrLCAmdG1wLAorCQkJCQkJCSAgT0NGUzJfQkhfUkVBREFIRUFEKSkKKwkJCQkJYnJlbHNlKHRtcCk7CiAJCQl9CiAJCQlsYXN0X3JhX2JsayA9IGJsazsKIAkJCXJhX3NlY3RvcnMgPSA4OwpAQCAtODI4LDYgKzk4MSw3IEBACiAJCX0KIAkJb2Zmc2V0ID0gMDsKIAkJYnJlbHNlKGJoKTsKKwkJYmggPSBOVUxMOwogCX0KIAogCXN0b3JlZCA9IDA7CkBAIC0xMDUwLDkgKzEyMDQsMTUgQEAKIAlyZXR1cm4gIXByaXYuc2Vlbl9vdGhlcjsKIH0KIAotc3RhdGljIHZvaWQgb2NmczJfZmlsbF9pbml0aWFsX2RpcmVudHMoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkgICAgICAgc3RydWN0IGlub2RlICpwYXJlbnQsCi0JCQkJICAgICAgIGNoYXIgKnN0YXJ0LCB1bnNpZ25lZCBpbnQgc2l6ZSkKKy8qCisgKiBGaWxscyAiLiIgYW5kICIuLiIgZGlyZW50cyBpbiBhIG5ldyBkaXJlY3RvcnkgYmxvY2suIFJldHVybnMgZGlyZW50IGZvcgorICogIi4uIiwgd2hpY2ggbWlnaHQgYmUgdXNlZCBkdXJpbmcgY3JlYXRpb24gb2YgYSBkaXJlY3Rvcnkgd2l0aCBhIHRyYWlsaW5nCisgKiBoZWFkZXIuIEl0IGlzIG90aGVyd2lzZSBzYWZlIHRvIGlnbm9yZSB0aGUgcmV0dXJuIGNvZGUuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgb2NmczJfZGlyX2VudHJ5ICpvY2ZzMl9maWxsX2luaXRpYWxfZGlyZW50cyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkJCSAgc3RydWN0IGlub2RlICpwYXJlbnQsCisJCQkJCQkJICBjaGFyICpzdGFydCwKKwkJCQkJCQkgIHVuc2lnbmVkIGludCBzaXplKQogewogCXN0cnVjdCBvY2ZzMl9kaXJfZW50cnkgKmRlID0gKHN0cnVjdCBvY2ZzMl9kaXJfZW50cnkgKilzdGFydDsKIApAQCAtMTA2OSw2ICsxMjI5LDggQEAKIAlkZS0+bmFtZV9sZW4gPSAyOwogCXN0cmNweShkZS0+bmFtZSwgIi4uIik7CiAJb2NmczJfc2V0X2RlX3R5cGUoZGUsIFNfSUZESVIpOworCisJcmV0dXJuIGRlOwogfQogCiAvKgpAQCAtMTA4Niw4ICsxMjQ4LDggQEAKIAlzdHJ1Y3Qgb2NmczJfaW5saW5lX2RhdGEgKmRhdGEgPSAmZGktPmlkMi5pX2RhdGE7CiAJdW5zaWduZWQgaW50IHNpemUgPSBsZTE2X3RvX2NwdShkYXRhLT5pZF9jb3VudCk7CiAKLQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBkaV9iaCwKLQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZGkoaGFuZGxlLCBpbm9kZSwgZGlfYmgsCisJCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dDsKQEAgLTExMjEsMTAgKzEyODMsMTUgQEAKIAkJCQkgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmRhdGFfYWMpCiB7CiAJaW50IHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9IG9zYi0+c2ItPnNfYmxvY2tzaXplOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqbmV3X2JoID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfZGlyX2VudHJ5ICpkZTsKIAogCW1sb2dfZW50cnlfdm9pZCgpOwogCisJaWYgKG9jZnMyX3N1cHBvcnRzX2Rpcl90cmFpbGVyKG9zYikpCisJCXNpemUgPSBvY2ZzMl9kaXJfdHJhaWxlcl9ibGtfb2ZmKHBhcmVudC0+aV9zYik7CisKIAlzdGF0dXMgPSBvY2ZzMl9kb19leHRlbmRfZGlyKG9zYi0+c2IsIGhhbmRsZSwgaW5vZGUsIGZlX2JoLAogCQkJCSAgICAgZGF0YV9hYywgTlVMTCwgJm5ld19iaCk7CiAJaWYgKHN0YXR1cyA8IDApIHsKQEAgLTExMzQsMTYgKzEzMDEsMTcgQEAKIAogCW9jZnMyX3NldF9uZXdfYnVmZmVyX3VwdG9kYXRlKGlub2RlLCBuZXdfYmgpOwogCi0Jc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgbmV3X2JoLAotCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX0NSRUFURSk7CisJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZGIoaGFuZGxlLCBpbm9kZSwgbmV3X2JoLAorCQkJCQkgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfQ1JFQVRFKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKIAl9CiAJbWVtc2V0KG5ld19iaC0+Yl9kYXRhLCAwLCBvc2ItPnNiLT5zX2Jsb2Nrc2l6ZSk7CiAKLQlvY2ZzMl9maWxsX2luaXRpYWxfZGlyZW50cyhpbm9kZSwgcGFyZW50LCBuZXdfYmgtPmJfZGF0YSwKLQkJCQkgICBvc2ItPnNiLT5zX2Jsb2Nrc2l6ZSk7CisJZGUgPSBvY2ZzMl9maWxsX2luaXRpYWxfZGlyZW50cyhpbm9kZSwgcGFyZW50LCBuZXdfYmgtPmJfZGF0YSwgc2l6ZSk7CisJaWYgKG9jZnMyX3N1cHBvcnRzX2Rpcl90cmFpbGVyKG9zYikpCisJCW9jZnMyX2luaXRfZGlyX3RyYWlsZXIoaW5vZGUsIG5ld19iaCk7CiAKIAlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgbmV3X2JoKTsKIAlpZiAoc3RhdHVzIDwgMCkgewpAQCAtMTE4NCwxMyArMTM1MiwyNyBAQAogCQkJCSAgICAgZGF0YV9hYyk7CiB9CiAKKy8qCisgKiBFeHBhbmQgcmVjX2xlbiBvZiB0aGUgcmlnaHRtb3N0IGRpcmVudCBpbiBhIGRpcmVjdG9yeSBibG9jayBzbyB0aGF0IGl0CisgKiBjb250YWlucyB0aGUgZW5kIG9mIG91ciB2YWxpZCBzcGFjZSBmb3IgZGlyZW50cy4gV2UgZG8gdGhpcyBkdXJpbmcKKyAqIGV4cGFuc2lvbiBmcm9tIGFuIGlubGluZSBkaXJlY3RvcnkgdG8gb25lIHdpdGggZXh0ZW50cy4gVGhlIGZpcnN0IGRpciBibG9jaworICogaW4gdGhhdCBjYXNlIGlzIHRha2VuIGZyb20gdGhlIGlubGluZSBkYXRhIHBvcnRpb24gb2YgdGhlIGlub2RlIGJsb2NrLgorICoKKyAqIFdlIGFkZCB0aGUgZGlyIHRyYWlsZXIgaWYgdGhpcyBmaWxlc3lzdGVtIHdhbnRzIGl0LgorICovCiBzdGF0aWMgdm9pZCBvY2ZzMl9leHBhbmRfbGFzdF9kaXJlbnQoY2hhciAqc3RhcnQsIHVuc2lnbmVkIGludCBvbGRfc2l6ZSwKLQkJCQkgICAgIHVuc2lnbmVkIGludCBuZXdfc2l6ZSkKKwkJCQkgICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IG9jZnMyX2Rpcl9lbnRyeSAqZGU7CiAJc3RydWN0IG9jZnMyX2Rpcl9lbnRyeSAqcHJldl9kZTsKIAljaGFyICpkZV9idWYsICpsaW1pdDsKLQl1bnNpZ25lZCBpbnQgYnl0ZXMgPSBuZXdfc2l6ZSAtIG9sZF9zaXplOworCXVuc2lnbmVkIGludCBuZXdfc2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZTsKKwl1bnNpZ25lZCBpbnQgYnl0ZXM7CisKKwlpZiAob2NmczJfc3VwcG9ydHNfZGlyX3RyYWlsZXIoT0NGUzJfU0Ioc2IpKSkKKwkJbmV3X3NpemUgPSBvY2ZzMl9kaXJfdHJhaWxlcl9ibGtfb2ZmKHNiKTsKKworCWJ5dGVzID0gbmV3X3NpemUgLSBvbGRfc2l6ZTsKIAogCWxpbWl0ID0gc3RhcnQgKyBvbGRfc2l6ZTsKIAlkZV9idWYgPSBzdGFydDsKQEAgLTEyMTYsOSArMTM5OCw5IEBACiAJCQkJICAgdW5zaWduZWQgaW50IGJsb2Nrc193YW50ZWQsCiAJCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqZmlyc3RfYmxvY2tfYmgpCiB7Ci0JaW50IHJldCwgY3JlZGl0cyA9IE9DRlMyX0lOTElORV9UT19FWFRFTlRTX0NSRURJVFM7CiAJdTMyIGFsbG9jLCBiaXRfb2ZmLCBsZW47CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRpci0+aV9zYjsKKwlpbnQgcmV0LCBjcmVkaXRzID0gb2NmczJfaW5saW5lX3RvX2V4dGVudHNfY3JlZGl0cyhzYik7CiAJdTY0IGJsa25vLCBieXRlcyA9IGJsb2Nrc193YW50ZWQgPDwgc2ItPnNfYmxvY2tzaXplX2JpdHM7CiAJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihkaXItPmlfc2IpOwogCXN0cnVjdCBvY2ZzMl9pbm9kZV9pbmZvICpvaSA9IE9DRlMyX0koZGlyKTsKQEAgLTEyMjcsNiArMTQwOSw3IEBACiAJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKWRpX2JoLT5iX2RhdGE7CiAJaGFuZGxlX3QgKmhhbmRsZTsKIAlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgZXQ7CisJaW50IGRpZF9xdW90YSA9IDA7CiAKIAlvY2ZzMl9pbml0X2Rpbm9kZV9leHRlbnRfdHJlZSgmZXQsIGRpciwgZGlfYmgpOwogCkBAIC0xMjY0LDYgKzE0NDcsMTIgQEAKIAkJZ290byBvdXRfc2VtOwogCX0KIAorCWlmICh2ZnNfZHFfYWxsb2Nfc3BhY2Vfbm9kaXJ0eShkaXIsCisJCQkJb2NmczJfY2x1c3RlcnNfdG9fYnl0ZXMob3NiLT5zYiwgYWxsb2MpKSkgeworCQlyZXQgPSAtRURRVU9UOworCQlnb3RvIG91dF9jb21taXQ7CisJfQorCWRpZF9xdW90YSA9IDE7CiAJLyoKIAkgKiBUcnkgdG8gY2xhaW0gYXMgbWFueSBjbHVzdGVycyBhcyB0aGUgYml0bWFwIGNhbiBnaXZlIHRob3VnaAogCSAqIGlmIHdlIG9ubHkgZ2V0IG9uZSBub3csIHRoYXQncyBlbm91Z2ggdG8gY29udGludWUuIFRoZSByZXN0CkBAIC0xMjkwLDggKzE0NzksOCBAQAogCiAJb2NmczJfc2V0X25ld19idWZmZXJfdXB0b2RhdGUoZGlyLCBkaXJkYXRhX2JoKTsKIAotCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgZGlyLCBkaXJkYXRhX2JoLAotCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX0NSRUFURSk7CisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZGIoaGFuZGxlLCBkaXIsIGRpcmRhdGFfYmgsCisJCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfQ1JFQVRFKTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXRfY29tbWl0OwpAQCAtMTMwMCw4ICsxNDg5LDkgQEAKIAltZW1jcHkoZGlyZGF0YV9iaC0+Yl9kYXRhLCBkaS0+aWQyLmlfZGF0YS5pZF9kYXRhLCBpX3NpemVfcmVhZChkaXIpKTsKIAltZW1zZXQoZGlyZGF0YV9iaC0+Yl9kYXRhICsgaV9zaXplX3JlYWQoZGlyKSwgMCwKIAkgICAgICAgc2ItPnNfYmxvY2tzaXplIC0gaV9zaXplX3JlYWQoZGlyKSk7Ci0Jb2NmczJfZXhwYW5kX2xhc3RfZGlyZW50KGRpcmRhdGFfYmgtPmJfZGF0YSwgaV9zaXplX3JlYWQoZGlyKSwKLQkJCQkgc2ItPnNfYmxvY2tzaXplKTsKKwlvY2ZzMl9leHBhbmRfbGFzdF9kaXJlbnQoZGlyZGF0YV9iaC0+Yl9kYXRhLCBpX3NpemVfcmVhZChkaXIpLCBzYik7CisJaWYgKG9jZnMyX3N1cHBvcnRzX2Rpcl90cmFpbGVyKG9zYikpCisJCW9jZnMyX2luaXRfZGlyX3RyYWlsZXIoZGlyLCBkaXJkYXRhX2JoKTsKIAogCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBkaXJkYXRhX2JoKTsKIAlpZiAocmV0KSB7CkBAIC0xMzE3LDggKzE1MDcsOCBAQAogCSAqIFdlIGxldCB0aGUgbGF0ZXIgZGlyZW50IGluc2VydCBtb2RpZnkgYy9tdGltZSAtIHRvIHRoZSB1c2VyCiAJICogdGhlIGRhdGEgaGFzbid0IGNoYW5nZWQuCiAJICovCi0JcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBkaXIsIGRpX2JoLAotCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX0NSRUFURSk7CisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZGkoaGFuZGxlLCBkaXIsIGRpX2JoLAorCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX0NSRUFURSk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0X2NvbW1pdDsKQEAgLTEzODYsNiArMTU3Niw5IEBACiAJZGlyZGF0YV9iaCA9IE5VTEw7CiAKIG91dF9jb21taXQ6CisJaWYgKHJldCA8IDAgJiYgZGlkX3F1b3RhKQorCQl2ZnNfZHFfZnJlZV9zcGFjZV9ub2RpcnR5KGRpciwKKwkJCW9jZnMyX2NsdXN0ZXJzX3RvX2J5dGVzKG9zYi0+c2IsIDIpKTsKIAlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOwogCiBvdXRfc2VtOgpAQCAtMTQxMCw3ICsxNjAzLDcgQEAKIAkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipuZXdfYmgpCiB7CiAJaW50IHN0YXR1czsKLQlpbnQgZXh0ZW5kOworCWludCBleHRlbmQsIGRpZF9xdW90YSA9IDA7CiAJdTY0IHBfYmxrbm8sIHZfYmxrbm87CiAKIAlzcGluX2xvY2soJk9DRlMyX0koZGlyKS0+aXBfbG9jayk7CkBAIC0xNDIwLDYgKzE2MTMsMTMgQEAKIAlpZiAoZXh0ZW5kKSB7CiAJCXUzMiBvZmZzZXQgPSBPQ0ZTMl9JKGRpciktPmlwX2NsdXN0ZXJzOwogCisJCWlmICh2ZnNfZHFfYWxsb2Nfc3BhY2Vfbm9kaXJ0eShkaXIsCisJCQkJCW9jZnMyX2NsdXN0ZXJzX3RvX2J5dGVzKHNiLCAxKSkpIHsKKwkJCXN0YXR1cyA9IC1FRFFVT1Q7CisJCQlnb3RvIGJhaWw7CisJCX0KKwkJZGlkX3F1b3RhID0gMTsKKwogCQlzdGF0dXMgPSBvY2ZzMl9hZGRfaW5vZGVfZGF0YShPQ0ZTMl9TQihzYiksIGRpciwgJm9mZnNldCwKIAkJCQkJICAgICAgMSwgMCwgcGFyZW50X2ZlX2JoLCBoYW5kbGUsCiAJCQkJCSAgICAgIGRhdGFfYWMsIG1ldGFfYWMsIE5VTEwpOwpAQCAtMTQ0NSw2ICsxNjQ1LDggQEAKIAl9CiAJc3RhdHVzID0gMDsKIGJhaWw6CisJaWYgKGRpZF9xdW90YSAmJiBzdGF0dXMgPCAwKQorCQl2ZnNfZHFfZnJlZV9zcGFjZV9ub2RpcnR5KGRpciwgb2NmczJfY2x1c3RlcnNfdG9fYnl0ZXMoc2IsIDEpKTsKIAltbG9nX2V4aXQoc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMTU2OSwxNiArMTc3MSwyMiBAQAogCiAJb2NmczJfc2V0X25ld19idWZmZXJfdXB0b2RhdGUoZGlyLCBuZXdfYmgpOwogCi0Jc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBkaXIsIG5ld19iaCwKLQkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19DUkVBVEUpOworCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RiKGhhbmRsZSwgZGlyLCBuZXdfYmgsCisJCQkJCSBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19DUkVBVEUpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBiYWlsOwogCX0KIAltZW1zZXQobmV3X2JoLT5iX2RhdGEsIDAsIHNiLT5zX2Jsb2Nrc2l6ZSk7CisKIAlkZSA9IChzdHJ1Y3Qgb2NmczJfZGlyX2VudHJ5ICopIG5ld19iaC0+Yl9kYXRhOwogCWRlLT5pbm9kZSA9IDA7Ci0JZGUtPnJlY19sZW4gPSBjcHVfdG9fbGUxNihzYi0+c19ibG9ja3NpemUpOworCWlmIChvY2ZzMl9kaXJfaGFzX3RyYWlsZXIoZGlyKSkgeworCQlkZS0+cmVjX2xlbiA9IGNwdV90b19sZTE2KG9jZnMyX2Rpcl90cmFpbGVyX2Jsa19vZmYoc2IpKTsKKwkJb2NmczJfaW5pdF9kaXJfdHJhaWxlcihkaXIsIG5ld19iaCk7CisJfSBlbHNlIHsKKwkJZGUtPnJlY19sZW4gPSBjcHVfdG9fbGUxNihzYi0+c19ibG9ja3NpemUpOworCX0KIAlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgbmV3X2JoKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC0xNjIwLDExICsxODI4LDIxIEBACiAJCQkJICAgdW5zaWduZWQgaW50ICpibG9ja3Nfd2FudGVkKQogewogCWludCByZXQ7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRpci0+aV9zYjsKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopZGlfYmgtPmJfZGF0YTsKIAlzdHJ1Y3Qgb2NmczJfZGlyX2VudHJ5ICpkZSwgKmxhc3RfZGUgPSBOVUxMOwogCWNoYXIgKmRlX2J1ZiwgKmxpbWl0OwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gMDsKLQl1bnNpZ25lZCBpbnQgcmVjX2xlbiwgbmV3X3JlY19sZW47CisJdW5zaWduZWQgaW50IHJlY19sZW4sIG5ld19yZWNfbGVuLCBmcmVlX3NwYWNlID0gZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKworCS8qCisJICogVGhpcyBjYWxjdWxhdGVzIGhvdyBtYW55IGZyZWUgYnl0ZXMgd2UnZCBoYXZlIGluIGJsb2NrIHplcm8sIHNob3VsZAorCSAqIHRoaXMgZnVuY3Rpb24gZm9yY2UgZXhwYW5zaW9uIHRvIGFuIGV4dGVudCB0cmVlLgorCSAqLworCWlmIChvY2ZzMl9zdXBwb3J0c19kaXJfdHJhaWxlcihPQ0ZTMl9TQihzYikpKQorCQlmcmVlX3NwYWNlID0gb2NmczJfZGlyX3RyYWlsZXJfYmxrX29mZihzYikgLSBpX3NpemVfcmVhZChkaXIpOworCWVsc2UKKwkJZnJlZV9zcGFjZSA9IGRpci0+aV9zYi0+c19ibG9ja3NpemUgLSBpX3NpemVfcmVhZChkaXIpOwogCiAJZGVfYnVmID0gZGktPmlkMi5pX2RhdGEuaWRfZGF0YTsKIAlsaW1pdCA9IGRlX2J1ZiArIGlfc2l6ZV9yZWFkKGRpcik7CkBAIC0xNjQxLDYgKzE4NTksMTEgQEAKIAkJCXJldCA9IC1FRVhJU1Q7CiAJCQlnb3RvIG91dDsKIAkJfQorCQkvKgorCQkgKiBObyBuZWVkIHRvIGNoZWNrIGZvciBhIHRyYWlsaW5nIGRpcmVudCByZWNvcmQgaGVyZSBhcworCQkgKiB0aGV5J3JlIG5vdCB1c2VkIGZvciBpbmxpbmUgZGlycy4KKwkJICovCisKIAkJaWYgKG9jZnMyX2RpcmVudF93b3VsZF9maXQoZGUsIHJlY19sZW4pKSB7CiAJCQkvKiBPaywgd2UgZm91bmQgYSBzcG90LiBSZXR1cm4gdGhpcyBiaCBhbmQgbGV0CiAJCQkgKiB0aGUgY2FsbGVyIGFjdHVhbGx5IGZpbGwgaXQgaW4uICovCkBAIC0xNjYxLDcgKzE4ODQsNyBAQAogCSAqIGRpcmVudCBjYW4gYmUgZm91bmQuCiAJICovCiAJKmJsb2Nrc193YW50ZWQgPSAxOwotCW5ld19yZWNfbGVuID0gbGUxNl90b19jcHUobGFzdF9kZS0+cmVjX2xlbikgKyAoZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIGlfc2l6ZV9yZWFkKGRpcikpOworCW5ld19yZWNfbGVuID0gbGUxNl90b19jcHUobGFzdF9kZS0+cmVjX2xlbikgKyBmcmVlX3NwYWNlOwogCWlmIChuZXdfcmVjX2xlbiA8IChyZWNfbGVuICsgT0NGUzJfRElSX1JFQ19MRU4obGFzdF9kZS0+bmFtZV9sZW4pKSkKIAkJKmJsb2Nrc193YW50ZWQgPSAyOwogCkBAIC0xNjc5LDkgKzE5MDIsMTAgQEAKIAlzdHJ1Y3Qgb2NmczJfZGlyX2VudHJ5ICpkZTsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGlyLT5pX3NiOwogCWludCBzdGF0dXM7CisJaW50IGJsb2Nrc2l6ZSA9IGRpci0+aV9zYi0+c19ibG9ja3NpemU7CiAKLQliaCA9IG9jZnMyX2JyZWFkKGRpciwgMCwgJnN0YXR1cywgMCk7Ci0JaWYgKCFiaCkgeworCXN0YXR1cyA9IG9jZnMyX3JlYWRfZGlyX2Jsb2NrKGRpciwgMCwgJmJoLCAwKTsKKwlpZiAoc3RhdHVzKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBiYWlsOwogCX0KQEAgLTE3MDIsMTEgKzE5MjYsMTAgQEAKIAkJCQlzdGF0dXMgPSAtRU5PU1BDOwogCQkJCWdvdG8gYmFpbDsKIAkJCX0KLQkJCWJoID0gb2NmczJfYnJlYWQoZGlyLAotCQkJCQkgb2Zmc2V0ID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzLAotCQkJCQkgJnN0YXR1cywKLQkJCQkJIDApOwotCQkJaWYgKCFiaCkgeworCQkJc3RhdHVzID0gb2NmczJfcmVhZF9kaXJfYmxvY2soZGlyLAorCQkJCQkgICAgIG9mZnNldCA+PiBzYi0+c19ibG9ja3NpemVfYml0cywKKwkJCQkJICAgICAmYmgsIDApOworCQkJaWYgKHN0YXR1cykgewogCQkJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJCQlnb3RvIGJhaWw7CiAJCQl9CkBAIC0xNzIxLDYgKzE5NDQsMTEgQEAKIAkJCXN0YXR1cyA9IC1FRVhJU1Q7CiAJCQlnb3RvIGJhaWw7CiAJCX0KKworCQlpZiAob2NmczJfc2tpcF9kaXJfdHJhaWxlcihkaXIsIGRlLCBvZmZzZXQgJSBibG9ja3NpemUsCisJCQkJCSAgIGJsb2Nrc2l6ZSkpCisJCQlnb3RvIG5leHQ7CisKIAkJaWYgKG9jZnMyX2RpcmVudF93b3VsZF9maXQoZGUsIHJlY19sZW4pKSB7CiAJCQkvKiBPaywgd2UgZm91bmQgYSBzcG90LiBSZXR1cm4gdGhpcyBiaCBhbmQgbGV0CiAJCQkgKiB0aGUgY2FsbGVyIGFjdHVhbGx5IGZpbGwgaXQgaW4uICovCkBAIC0xNzI5LDYgKzE5NTcsNyBAQAogCQkJc3RhdHVzID0gMDsKIAkJCWdvdG8gYmFpbDsKIAkJfQorbmV4dDoKIAkJb2Zmc2V0ICs9IGxlMTZfdG9fY3B1KGRlLT5yZWNfbGVuKTsKIAkJZGUgPSAoc3RydWN0IG9jZnMyX2Rpcl9lbnRyeSAqKSgoY2hhciAqKSBkZSArIGxlMTZfdG9fY3B1KGRlLT5yZWNfbGVuKSk7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGlyLmggYi9mcy9vY2ZzMi9kaXIuaAppbmRleCBjZTQ4YjkwLi5jNTExZTJlIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kaXIuaAorKysgYi9mcy9vY2ZzMi9kaXIuaApAQCAtODMsNCArODMsNiBAQAogCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCwKIAkJICAgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICpkYXRhX2FjKTsKIAorc3RydWN0IG9jZnMyX2Rpcl9ibG9ja190cmFpbGVyICpvY2ZzMl9kaXJfdHJhaWxlcl9mcm9tX3NpemUoaW50IGJsb2Nrc2l6ZSwKKwkJCQkJCQkgICAgdm9pZCAqZGF0YSk7CiAjZW5kaWYgLyogT0NGUzJfRElSX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2RsbS9kbG1hc3QuYyBiL2ZzL29jZnMyL2RsbS9kbG1hc3QuYwppbmRleCA2NDRiZWU1Li5kMDdkZGJlIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kbG0vZGxtYXN0LmMKKysrIGIvZnMvb2NmczIvZGxtL2RsbWFzdC5jCkBAIC0yNzUsNiArMjc1LDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyLCAqaGVhZD1OVUxMOwogCXU2NCBjb29raWU7CiAJdTMyIGZsYWdzOworCXU4IG5vZGU7CiAKIAlpZiAoIWRsbV9ncmFiKGRsbSkpIHsKIAkJZGxtX2Vycm9yKERMTV9SRUpFQ1RFRCk7CkBAIC0yODYsMTggKzI4NywyMSBAQAogCiAJbmFtZSA9IHBhc3QtPm5hbWU7CiAJbG9ja2xlbiA9IHBhc3QtPm5hbWVsZW47Ci0JY29va2llID0gYmU2NF90b19jcHUocGFzdC0+Y29va2llKTsKKwljb29raWUgPSBwYXN0LT5jb29raWU7CiAJZmxhZ3MgPSBiZTMyX3RvX2NwdShwYXN0LT5mbGFncyk7CisJbm9kZSA9IHBhc3QtPm5vZGVfaWR4OwogCiAJaWYgKGxvY2tsZW4gPiBETE1fTE9DS0lEX05BTUVfTUFYKSB7CiAJCXJldCA9IERMTV9JVkJVRkxFTjsKLQkJbWxvZyhNTF9FUlJPUiwgIkludmFsaWQgbmFtZSBsZW5ndGggaW4gcHJveHkgYXN0IGhhbmRsZXIhXG4iKTsKKwkJbWxvZyhNTF9FUlJPUiwgIkludmFsaWQgbmFtZSBsZW5ndGggKCVkKSBpbiBwcm94eSBhc3QgIgorCQkgICAgICJoYW5kbGVyIVxuIiwgbG9ja2xlbik7CiAJCWdvdG8gbGVhdmU7CiAJfQogCiAJaWYgKChmbGFncyAmIChMS01fUFVUX0xWQnxMS01fR0VUX0xWQikpID09CiAJICAgICAoTEtNX1BVVF9MVkJ8TEtNX0dFVF9MVkIpKSB7Ci0JCW1sb2coTUxfRVJST1IsICJib3RoIFBVVCBhbmQgR0VUIGx2YiBzcGVjaWZpZWRcbiIpOworCQltbG9nKE1MX0VSUk9SLCAiQm90aCBQVVQgYW5kIEdFVCBsdmIgc3BlY2lmaWVkLCAoMHgleClcbiIsCisJCSAgICAgZmxhZ3MpOwogCQlyZXQgPSBETE1fQkFEQVJHUzsKIAkJZ290byBsZWF2ZTsKIAl9CkBAIC0zMTAsMjIgKzMxNCwyMSBAQAogCWlmIChwYXN0LT50eXBlICE9IERMTV9BU1QgJiYKIAkgICAgcGFzdC0+dHlwZSAhPSBETE1fQkFTVCkgewogCQltbG9nKE1MX0VSUk9SLCAiVW5rbm93biBhc3QgdHlwZSEgJWQsIGNvb2tpZT0ldTolbGx1IgotCQkgICAgICJuYW1lPSUuKnNcbiIsIHBhc3QtPnR5cGUsIAotCQkgICAgIGRsbV9nZXRfbG9ja19jb29raWVfbm9kZShjb29raWUpLAotCQkgICAgIGRsbV9nZXRfbG9ja19jb29raWVfc2VxKGNvb2tpZSksCi0JCSAgICAgbG9ja2xlbiwgbmFtZSk7CisJCSAgICAgIm5hbWU9JS4qcywgbm9kZT0ldVxuIiwgcGFzdC0+dHlwZSwKKwkJICAgICBkbG1fZ2V0X2xvY2tfY29va2llX25vZGUoYmU2NF90b19jcHUoY29va2llKSksCisJCSAgICAgZGxtX2dldF9sb2NrX2Nvb2tpZV9zZXEoYmU2NF90b19jcHUoY29va2llKSksCisJCSAgICAgbG9ja2xlbiwgbmFtZSwgbm9kZSk7CiAJCXJldCA9IERMTV9JVkxPQ0tJRDsKIAkJZ290byBsZWF2ZTsKIAl9CiAKIAlyZXMgPSBkbG1fbG9va3VwX2xvY2tyZXMoZGxtLCBuYW1lLCBsb2NrbGVuKTsKIAlpZiAoIXJlcykgewotCQltbG9nKDAsICJnb3QgJXNhc3QgZm9yIHVua25vd24gbG9ja3JlcyEgIgotCQkgICAgICJjb29raWU9JXU6JWxsdSwgbmFtZT0lLipzLCBuYW1lbGVuPSV1XG4iLAotCQkgICAgIHBhc3QtPnR5cGUgPT0gRExNX0FTVCA/ICIiIDogImIiLAotCQkgICAgIGRsbV9nZXRfbG9ja19jb29raWVfbm9kZShjb29raWUpLAotCQkgICAgIGRsbV9nZXRfbG9ja19jb29raWVfc2VxKGNvb2tpZSksCi0JCSAgICAgbG9ja2xlbiwgbmFtZSwgbG9ja2xlbik7CisJCW1sb2coMCwgIkdvdCAlc2FzdCBmb3IgdW5rbm93biBsb2NrcmVzISBjb29raWU9JXU6JWxsdSwgIgorCQkgICAgICJuYW1lPSUuKnMsIG5vZGU9JXVcbiIsIChwYXN0LT50eXBlID09IERMTV9BU1QgPyAiIiA6ICJiIiksCisJCSAgICAgZGxtX2dldF9sb2NrX2Nvb2tpZV9ub2RlKGJlNjRfdG9fY3B1KGNvb2tpZSkpLAorCQkgICAgIGRsbV9nZXRfbG9ja19jb29raWVfc2VxKGJlNjRfdG9fY3B1KGNvb2tpZSkpLAorCQkgICAgIGxvY2tsZW4sIG5hbWUsIG5vZGUpOwogCQlyZXQgPSBETE1fSVZMT0NLSUQ7CiAJCWdvdG8gbGVhdmU7CiAJfQpAQCAtMzM3LDEyICszNDAsMTIgQEAKIAogCXNwaW5fbG9jaygmcmVzLT5zcGlubG9jayk7CiAJaWYgKHJlcy0+c3RhdGUgJiBETE1fTE9DS19SRVNfUkVDT1ZFUklORykgewotCQltbG9nKDAsICJyZXNwb25kaW5nIHdpdGggRExNX1JFQ09WRVJJTkchXG4iKTsKKwkJbWxvZygwLCAiUmVzcG9uZGluZyB3aXRoIERMTV9SRUNPVkVSSU5HIVxuIik7CiAJCXJldCA9IERMTV9SRUNPVkVSSU5HOwogCQlnb3RvIHVubG9ja19vdXQ7CiAJfQogCWlmIChyZXMtPnN0YXRlICYgRExNX0xPQ0tfUkVTX01JR1JBVElORykgewotCQltbG9nKDAsICJyZXNwb25kaW5nIHdpdGggRExNX01JR1JBVElORyFcbiIpOworCQltbG9nKDAsICJSZXNwb25kaW5nIHdpdGggRExNX01JR1JBVElORyFcbiIpOwogCQlyZXQgPSBETE1fTUlHUkFUSU5HOwogCQlnb3RvIHVubG9ja19vdXQ7CiAJfQpAQCAtMzUxLDcgKzM1NCw3IEBACiAJbG9jayA9IE5VTEw7CiAJbGlzdF9mb3JfZWFjaChpdGVyLCBoZWFkKSB7CiAJCWxvY2sgPSBsaXN0X2VudHJ5IChpdGVyLCBzdHJ1Y3QgZGxtX2xvY2ssIGxpc3QpOwotCQlpZiAoYmU2NF90b19jcHUobG9jay0+bWwuY29va2llKSA9PSBjb29raWUpCisJCWlmIChsb2NrLT5tbC5jb29raWUgPT0gY29va2llKQogCQkJZ290byBkb19hc3Q7CiAJfQogCkBAIC0zNjMsMTUgKzM2NiwxNSBAQAogCiAJbGlzdF9mb3JfZWFjaChpdGVyLCBoZWFkKSB7CiAJCWxvY2sgPSBsaXN0X2VudHJ5IChpdGVyLCBzdHJ1Y3QgZGxtX2xvY2ssIGxpc3QpOwotCQlpZiAoYmU2NF90b19jcHUobG9jay0+bWwuY29va2llKSA9PSBjb29raWUpCisJCWlmIChsb2NrLT5tbC5jb29raWUgPT0gY29va2llKQogCQkJZ290byBkb19hc3Q7CiAJfQogCi0JbWxvZygwLCAiZ290ICVzYXN0IGZvciB1bmtub3duIGxvY2shICBjb29raWU9JXU6JWxsdSwgIgotCSAgICAgIm5hbWU9JS4qcywgbmFtZWxlbj0ldVxuIiwgcGFzdC0+dHlwZSA9PSBETE1fQVNUID8gIiIgOiAiYiIsIAotCSAgICAgZGxtX2dldF9sb2NrX2Nvb2tpZV9ub2RlKGNvb2tpZSksCi0JICAgICBkbG1fZ2V0X2xvY2tfY29va2llX3NlcShjb29raWUpLAotCSAgICAgbG9ja2xlbiwgbmFtZSwgbG9ja2xlbik7CisJbWxvZygwLCAiR290ICVzYXN0IGZvciB1bmtub3duIGxvY2shIGNvb2tpZT0ldTolbGx1LCBuYW1lPSUuKnMsICIKKwkgICAgICJub2RlPSV1XG4iLCBwYXN0LT50eXBlID09IERMTV9BU1QgPyAiIiA6ICJiIiwKKwkgICAgIGRsbV9nZXRfbG9ja19jb29raWVfbm9kZShiZTY0X3RvX2NwdShjb29raWUpKSwKKwkgICAgIGRsbV9nZXRfbG9ja19jb29raWVfc2VxKGJlNjRfdG9fY3B1KGNvb2tpZSkpLAorCSAgICAgbG9ja2xlbiwgbmFtZSwgbm9kZSk7CiAKIAlyZXQgPSBETE1fTk9STUFMOwogdW5sb2NrX291dDoKQEAgLTM4Myw4ICszODYsOCBAQAogCWlmIChwYXN0LT50eXBlID09IERMTV9BU1QpIHsKIAkJLyogZG8gbm90IGFsdGVyIGxvY2sgcmVmY291bnQuICBzd2l0Y2hpbmcgbGlzdHMuICovCiAJCWxpc3RfbW92ZV90YWlsKCZsb2NrLT5saXN0LCAmcmVzLT5ncmFudGVkKTsKLQkJbWxvZygwLCAiYXN0OiBhZGRpbmcgdG8gZ3JhbnRlZCBsaXN0Li4uIHR5cGU9JWQsICIKLQkJCSAgImNvbnZlcnRfdHlwZT0lZFxuIiwgbG9jay0+bWwudHlwZSwgbG9jay0+bWwuY29udmVydF90eXBlKTsKKwkJbWxvZygwLCAiYXN0OiBBZGRpbmcgdG8gZ3JhbnRlZCBsaXN0Li4uIHR5cGU9JWQsICIKKwkJICAgICAiY29udmVydF90eXBlPSVkXG4iLCBsb2NrLT5tbC50eXBlLCBsb2NrLT5tbC5jb252ZXJ0X3R5cGUpOwogCQlpZiAobG9jay0+bWwuY29udmVydF90eXBlICE9IExLTV9JVk1PREUpIHsKIAkJCWxvY2stPm1sLnR5cGUgPSBsb2NrLT5tbC5jb252ZXJ0X3R5cGU7CiAJCQlsb2NrLT5tbC5jb252ZXJ0X3R5cGUgPSBMS01fSVZNT0RFOwpAQCAtNDA4LDcgKzQxMSw2IEBACiAJCWRsbV9kb19sb2NhbF9iYXN0KGRsbSwgcmVzLCBsb2NrLCBwYXN0LT5ibG9ja2VkX3R5cGUpOwogCiBsZWF2ZToKLQogCWlmIChyZXMpCiAJCWRsbV9sb2NrcmVzX3B1dChyZXMpOwogCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kbG0vZGxtY29tbW9uLmggYi9mcy9vY2ZzMi9kbG0vZGxtY29tbW9uLmgKaW5kZXggZDVhODZmYi4uYmI1MzcxNCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtL2RsbWNvbW1vbi5oCisrKyBiL2ZzL29jZnMyL2RsbS9kbG1jb21tb24uaApAQCAtMTQwLDYgKzE0MCw3IEBACiAJdW5zaWduZWQgaW50IHB1cmdlX2NvdW50OwogCXNwaW5sb2NrX3Qgc3BpbmxvY2s7CiAJc3BpbmxvY2tfdCBhc3RfbG9jazsKKwlzcGlubG9ja190IHRyYWNrX2xvY2s7CiAJY2hhciAqbmFtZTsKIAl1OCBub2RlX251bTsKIAl1MzIga2V5OwpAQCAtMzE2LDYgKzMxNyw4IEBACiAJICogcHV0IG9uIGEgbGlzdCBmb3IgdGhlIGRsbSB0aHJlYWQgdG8gcnVuLiAqLwogCXVuc2lnbmVkIGxvbmcgICAgbGFzdF91c2VkOwogCisJc3RydWN0IGRsbV9jdHh0ICpkbG07CisKIAl1bnNpZ25lZCBtaWdyYXRpb25fcGVuZGluZzoxOwogCWF0b21pY190IGFzdHNfcmVzZXJ2ZWQ7CiAJc3BpbmxvY2tfdCBzcGlubG9jazsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2RsbS9kbG1kZWJ1Zy5jIGIvZnMvb2NmczIvZGxtL2RsbWRlYnVnLmMKaW5kZXggMWI4MWRjYi4uYjMyZjYwYSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtL2RsbWRlYnVnLmMKKysrIGIvZnMvb2NmczIvZGxtL2RsbWRlYnVnLmMKQEAgLTYzMCw0MyArNjMwLDM4IEBACiB7CiAJc3RydWN0IGRlYnVnX2xvY2tyZXMgKmRsID0gbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgZGxtX2N0eHQgKmRsbSA9IGRsLT5kbF9jdHh0OworCXN0cnVjdCBkbG1fbG9ja19yZXNvdXJjZSAqb2xkcmVzID0gZGwtPmRsX3JlczsKIAlzdHJ1Y3QgZGxtX2xvY2tfcmVzb3VyY2UgKnJlcyA9IE5VTEw7CisJc3RydWN0IGxpc3RfaGVhZCAqdHJhY2tfbGlzdDsKIAotCXNwaW5fbG9jaygmZGxtLT5zcGlubG9jayk7CisJc3Bpbl9sb2NrKCZkbG0tPnRyYWNrX2xvY2spOworCWlmIChvbGRyZXMpCisJCXRyYWNrX2xpc3QgPSAmb2xkcmVzLT50cmFja2luZzsKKwllbHNlCisJCXRyYWNrX2xpc3QgPSAmZGxtLT50cmFja2luZ19saXN0OwogCi0JaWYgKGRsLT5kbF9yZXMpIHsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXMsICZkbC0+ZGxfcmVzLT50cmFja2luZywgdHJhY2tpbmcpIHsKLQkJCWlmIChkbC0+ZGxfcmVzKSB7Ci0JCQkJZGxtX2xvY2tyZXNfcHV0KGRsLT5kbF9yZXMpOwotCQkJCWRsLT5kbF9yZXMgPSBOVUxMOwotCQkJfQotCQkJaWYgKCZyZXMtPnRyYWNraW5nID09ICZkbG0tPnRyYWNraW5nX2xpc3QpIHsKLQkJCQltbG9nKDAsICJFbmQgb2YgbGlzdCBmb3VuZCwgJXBcbiIsIHJlcyk7Ci0JCQkJZGwgPSBOVUxMOwotCQkJCWJyZWFrOwotCQkJfQorCWxpc3RfZm9yX2VhY2hfZW50cnkocmVzLCB0cmFja19saXN0LCB0cmFja2luZykgeworCQlpZiAoJnJlcy0+dHJhY2tpbmcgPT0gJmRsbS0+dHJhY2tpbmdfbGlzdCkKKwkJCXJlcyA9IE5VTEw7CisJCWVsc2UKIAkJCWRsbV9sb2NrcmVzX2dldChyZXMpOwotCQkJZGwtPmRsX3JlcyA9IHJlczsKLQkJCWJyZWFrOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKCFsaXN0X2VtcHR5KCZkbG0tPnRyYWNraW5nX2xpc3QpKSB7Ci0JCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcywgJmRsbS0+dHJhY2tpbmdfbGlzdCwgdHJhY2tpbmcpCi0JCQkJYnJlYWs7Ci0JCQlkbG1fbG9ja3Jlc19nZXQocmVzKTsKLQkJCWRsLT5kbF9yZXMgPSByZXM7Ci0JCX0gZWxzZQotCQkJZGwgPSBOVUxMOworCQlicmVhazsKIAl9CisJc3Bpbl91bmxvY2soJmRsbS0+dHJhY2tfbG9jayk7CiAKLQlpZiAoZGwpIHsKLQkJc3Bpbl9sb2NrKCZkbC0+ZGxfcmVzLT5zcGlubG9jayk7Ci0JCWR1bXBfbG9ja3JlcyhkbC0+ZGxfcmVzLCBkbC0+ZGxfYnVmLCBkbC0+ZGxfbGVuIC0gMSk7Ci0JCXNwaW5fdW5sb2NrKCZkbC0+ZGxfcmVzLT5zcGlubG9jayk7Ci0JfQorCWlmIChvbGRyZXMpCisJCWRsbV9sb2NrcmVzX3B1dChvbGRyZXMpOwogCi0Jc3Bpbl91bmxvY2soJmRsbS0+c3BpbmxvY2spOworCWRsLT5kbF9yZXMgPSByZXM7CiAKKwlpZiAocmVzKSB7CisJCXNwaW5fbG9jaygmcmVzLT5zcGlubG9jayk7CisJCWR1bXBfbG9ja3JlcyhyZXMsIGRsLT5kbF9idWYsIGRsLT5kbF9sZW4gLSAxKTsKKwkJc3Bpbl91bmxvY2soJnJlcy0+c3BpbmxvY2spOworCX0gZWxzZQorCQlkbCA9IE5VTEw7CisKKwkvKiBwYXNzZWQgdG8gc2VxX3Nob3cgKi8KIAlyZXR1cm4gZGw7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2RsbS9kbG1kb21haW4uYyBiL2ZzL29jZnMyL2RsbS9kbG1kb21haW4uYwppbmRleCA2M2Y4MTI1Li5kOGQ1NzhmIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kbG0vZGxtZG9tYWluLmMKKysrIGIvZnMvb2NmczIvZGxtL2RsbWRvbWFpbi5jCkBAIC0xNTUwLDYgKzE1NTAsNyBAQAogCXNwaW5fbG9ja19pbml0KCZkbG0tPnNwaW5sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmZGxtLT5tYXN0ZXJfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmRsbS0+YXN0X2xvY2spOworCXNwaW5fbG9ja19pbml0KCZkbG0tPnRyYWNrX2xvY2spOwogCUlOSVRfTElTVF9IRUFEKCZkbG0tPmxpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZkbG0tPmRpcnR5X2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZkbG0tPnJlY28ucmVzb3VyY2VzKTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2RsbS9kbG1mcy5jIGIvZnMvb2NmczIvZGxtL2RsbWZzLmMKaW5kZXggNmY3YTc3ZC4uMWM5ZWZiNCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtL2RsbWZzLmMKKysrIGIvZnMvb2NmczIvZGxtL2RsbWZzLmMKQEAgLTM0MSw3ICszNDEsNiBAQAogCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKIAkJaW5vZGUtPmlfdWlkID0gY3VycmVudF9mc3VpZCgpOwogCQlpbm9kZS0+aV9naWQgPSBjdXJyZW50X2ZzZ2lkKCk7Ci0JCWlub2RlLT5pX2Jsb2NrcyA9IDA7CiAJCWlub2RlLT5pX21hcHBpbmctPmJhY2tpbmdfZGV2X2luZm8gPSAmZGxtZnNfYmFja2luZ19kZXZfaW5mbzsKIAkJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCQlpbmNfbmxpbmsoaW5vZGUpOwpAQCAtMzY3LDcgKzM2Niw2IEBACiAJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CiAJaW5vZGUtPmlfdWlkID0gY3VycmVudF9mc3VpZCgpOwogCWlub2RlLT5pX2dpZCA9IGN1cnJlbnRfZnNnaWQoKTsKLQlpbm9kZS0+aV9ibG9ja3MgPSAwOwogCWlub2RlLT5pX21hcHBpbmctPmJhY2tpbmdfZGV2X2luZm8gPSAmZGxtZnNfYmFja2luZ19kZXZfaW5mbzsKIAlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2RsbS9kbG1tYXN0ZXIuYyBiL2ZzL29jZnMyL2RsbS9kbG1tYXN0ZXIuYwppbmRleCA0NGY4N2NhLi41NGUxODJhIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kbG0vZGxtbWFzdGVyLmMKKysrIGIvZnMvb2NmczIvZGxtL2RsbW1hc3Rlci5jCkBAIC01MDUsOCArNTA1LDEwIEBACiBzdGF0aWMgdm9pZCBkbG1fbG9ja3Jlc19yZWxlYXNlKHN0cnVjdCBrcmVmICprcmVmKQogewogCXN0cnVjdCBkbG1fbG9ja19yZXNvdXJjZSAqcmVzOworCXN0cnVjdCBkbG1fY3R4dCAqZGxtOwogCiAJcmVzID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBkbG1fbG9ja19yZXNvdXJjZSwgcmVmcyk7CisJZGxtID0gcmVzLT5kbG07CiAKIAkvKiBUaGlzIHNob3VsZCBub3QgaGFwcGVuIC0tIGFsbCBsb2NrcmVzJyBoYXZlIGEgbmFtZQogCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGVtIGF0IGluaXQgdGltZS4gKi8KQEAgLTUxNSw2ICs1MTcsNyBAQAogCW1sb2coMCwgImRlc3Ryb3lpbmcgbG9ja3JlcyAlLipzXG4iLCByZXMtPmxvY2tuYW1lLmxlbiwKIAkgICAgIHJlcy0+bG9ja25hbWUubmFtZSk7CiAKKwlzcGluX2xvY2soJmRsbS0+dHJhY2tfbG9jayk7CiAJaWYgKCFsaXN0X2VtcHR5KCZyZXMtPnRyYWNraW5nKSkKIAkJbGlzdF9kZWxfaW5pdCgmcmVzLT50cmFja2luZyk7CiAJZWxzZSB7CkBAIC01MjIsNiArNTI1LDkgQEAKIAkJICAgICByZXMtPmxvY2tuYW1lLmxlbiwgcmVzLT5sb2NrbmFtZS5uYW1lKTsKIAkJZGxtX3ByaW50X29uZV9sb2NrX3Jlc291cmNlKHJlcyk7CiAJfQorCXNwaW5fdW5sb2NrKCZkbG0tPnRyYWNrX2xvY2spOworCisJZGxtX3B1dChkbG0pOwogCiAJaWYgKCFobGlzdF91bmhhc2hlZCgmcmVzLT5oYXNoX25vZGUpIHx8CiAJICAgICFsaXN0X2VtcHR5KCZyZXMtPmdyYW50ZWQpIHx8CkBAIC01OTUsNiArNjAxLDEwIEBACiAJcmVzLT5taWdyYXRpb25fcGVuZGluZyA9IDA7CiAJcmVzLT5pbmZsaWdodF9sb2NrcyA9IDA7CiAKKwkvKiBwdXQgaW4gZGxtX2xvY2tyZXNfcmVsZWFzZSAqLworCWRsbV9ncmFiKGRsbSk7CisJcmVzLT5kbG0gPSBkbG07CisKIAlrcmVmX2luaXQoJnJlcy0+cmVmcyk7CiAKIAkvKiBqdXN0IGZvciBjb25zaXN0ZW5jeSAqLwpAQCAtNzIyLDE0ICs3MzIsMjEgQEAKIAlpZiAodG1wcmVzKSB7CiAJCWludCBkcm9wcGluZ19yZWYgPSAwOwogCisJCXNwaW5fdW5sb2NrKCZkbG0tPnNwaW5sb2NrKTsKKwogCQlzcGluX2xvY2soJnRtcHJlcy0+c3BpbmxvY2spOworCQkvKiBXZSB3YWl0IGZvciB0aGUgb3RoZXIgdGhyZWFkIHRoYXQgaXMgbWFzdGVyaW5nIHRoZSByZXNvdXJjZSAqLworCQlpZiAodG1wcmVzLT5vd25lciA9PSBETE1fTE9DS19SRVNfT1dORVJfVU5LTk9XTikgeworCQkJX19kbG1fd2FpdF9vbl9sb2NrcmVzKHRtcHJlcyk7CisJCQlCVUdfT04odG1wcmVzLT5vd25lciA9PSBETE1fTE9DS19SRVNfT1dORVJfVU5LTk9XTik7CisJCX0KKwogCQlpZiAodG1wcmVzLT5vd25lciA9PSBkbG0tPm5vZGVfbnVtKSB7CiAJCQlCVUdfT04odG1wcmVzLT5zdGF0ZSAmIERMTV9MT0NLX1JFU19EUk9QUElOR19SRUYpOwogCQkJZGxtX2xvY2tyZXNfZ3JhYl9pbmZsaWdodF9yZWYoZGxtLCB0bXByZXMpOwogCQl9IGVsc2UgaWYgKHRtcHJlcy0+c3RhdGUgJiBETE1fTE9DS19SRVNfRFJPUFBJTkdfUkVGKQogCQkJZHJvcHBpbmdfcmVmID0gMTsKIAkJc3Bpbl91bmxvY2soJnRtcHJlcy0+c3BpbmxvY2spOwotCQlzcGluX3VubG9jaygmZGxtLT5zcGlubG9jayk7CiAKIAkJLyogd2FpdCB1bnRpbCBkb25lIG1lc3NhZ2luZyB0aGUgbWFzdGVyLCBkcm9wIG91ciByZWYgdG8gYWxsb3cKIAkJICogdGhlIGxvY2tyZXMgdG8gYmUgcHVyZ2VkLCBzdGFydCBvdmVyLiAqLwpAQCAtMjk0OSw3ICsyOTY2LDcgQEAKIAkJCQkgIHN0cnVjdCBkbG1fbm9kZV9pdGVyICppdGVyKQogewogCXN0cnVjdCBkbG1fbWlncmF0ZV9yZXF1ZXN0IG1pZ3JhdGU7Ci0JaW50IHJldCwgc3RhdHVzID0gMDsKKwlpbnQgcmV0LCBza2lwLCBzdGF0dXMgPSAwOwogCWludCBub2RlbnVtOwogCiAJbWVtc2V0KCZtaWdyYXRlLCAwLCBzaXplb2YobWlncmF0ZSkpOwpAQCAtMjk2NiwxMiArMjk4MywyNyBAQAogCQkgICAgbm9kZW51bSA9PSBuZXdfbWFzdGVyKQogCQkJY29udGludWU7CiAKKwkJLyogV2UgY291bGQgcmFjZSBleGl0IGRvbWFpbi4gSWYgZXhpdGVkLCBza2lwLiAqLworCQlzcGluX2xvY2soJmRsbS0+c3BpbmxvY2spOworCQlza2lwID0gKCF0ZXN0X2JpdChub2RlbnVtLCBkbG0tPmRvbWFpbl9tYXApKTsKKwkJc3Bpbl91bmxvY2soJmRsbS0+c3BpbmxvY2spOworCQlpZiAoc2tpcCkgeworCQkJY2xlYXJfYml0KG5vZGVudW0sIGl0ZXItPm5vZGVfbWFwKTsKKwkJCWNvbnRpbnVlOworCQl9CisKIAkJcmV0ID0gbzJuZXRfc2VuZF9tZXNzYWdlKERMTV9NSUdSQVRFX1JFUVVFU1RfTVNHLCBkbG0tPmtleSwKIAkJCQkJICZtaWdyYXRlLCBzaXplb2YobWlncmF0ZSksIG5vZGVudW0sCiAJCQkJCSAmc3RhdHVzKTsKLQkJaWYgKHJldCA8IDApCi0JCQltbG9nX2Vycm5vKHJldCk7Ci0JCWVsc2UgaWYgKHN0YXR1cyA8IDApIHsKKwkJaWYgKHJldCA8IDApIHsKKwkJCW1sb2coMCwgIm1pZ3JhdGVfcmVxdWVzdCByZXR1cm5lZCAlZCFcbiIsIHJldCk7CisJCQlpZiAoIWRsbV9pc19ob3N0X2Rvd24ocmV0KSkgeworCQkJCW1sb2coTUxfRVJST1IsICJ1bmhhbmRsZWQgZXJyb3I9JWQhXG4iLCByZXQpOworCQkJCUJVRygpOworCQkJfQorCQkJY2xlYXJfYml0KG5vZGVudW0sIGl0ZXItPm5vZGVfbWFwKTsKKwkJCXJldCA9IDA7CisJCX0gZWxzZSBpZiAoc3RhdHVzIDwgMCkgewogCQkJbWxvZygwLCAibWlncmF0ZSByZXF1ZXN0IChub2RlICV1KSByZXR1cm5lZCAlZCFcbiIsCiAJCQkgICAgIG5vZGVudW0sIHN0YXR1cyk7CiAJCQlyZXQgPSBzdGF0dXM7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kbG0vZGxtdGhyZWFkLmMgYi9mcy9vY2ZzMi9kbG0vZGxtdGhyZWFkLmMKaW5kZXggNDA2MGJiMy4uZDEyOTUyMCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtL2RsbXRocmVhZC5jCisrKyBiL2ZzL29jZnMyL2RsbS9kbG10aHJlYWQuYwpAQCAtMTgxLDcgKzE4MSw4IEBACiAKIAkJc3Bpbl9sb2NrKCZyZXMtPnNwaW5sb2NrKTsKIAkJLyogVGhpcyBlbnN1cmVzIHRoYXQgY2xlYXIgcmVmbWFwIGlzIHNlbnQgYWZ0ZXIgdGhlIHNldCAqLwotCQlfX2RsbV93YWl0X29uX2xvY2tyZXNfZmxhZ3MocmVzLCBETE1fTE9DS19SRVNfU0VUUkVGX0lOUFJPRyk7CisJCV9fZGxtX3dhaXRfb25fbG9ja3Jlc19mbGFncyhyZXMsIChETE1fTE9DS19SRVNfU0VUUkVGX0lOUFJPRyB8CisJCQkJCQkgIERMTV9MT0NLX1JFU19NSUdSQVRJTkcpKTsKIAkJc3Bpbl91bmxvY2soJnJlcy0+c3BpbmxvY2spOwogCiAJCS8qIGNsZWFyIG91ciBiaXQgZnJvbSB0aGUgbWFzdGVyJ3MgcmVmbWFwLCBpZ25vcmUgZXJyb3JzICovCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kbG1nbHVlLmMgYi9mcy9vY2ZzMi9kbG1nbHVlLmMKaW5kZXggNmU2Y2MwYS4uYjBjNGNhZCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtZ2x1ZS5jCisrKyBiL2ZzL29jZnMyL2RsbWdsdWUuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgogCiAjZGVmaW5lIE1MT0dfTUFTS19QUkVGSVggTUxfRExNX0dMVUUKICNpbmNsdWRlIDxjbHVzdGVyL21hc2tsb2cuaD4KQEAgLTUxLDYgKzUyLDcgQEAKICNpbmNsdWRlICJzbG90X21hcC5oIgogI2luY2x1ZGUgInN1cGVyLmgiCiAjaW5jbHVkZSAidXB0b2RhdGUuaCIKKyNpbmNsdWRlICJxdW90YS5oIgogCiAjaW5jbHVkZSAiYnVmZmVyX2hlYWRfaW8uaCIKIApAQCAtNjgsNiArNzAsNyBAQAogc3RhdGljIHN0cnVjdCBvY2ZzMl9zdXBlciAqb2NmczJfZ2V0X2RlbnRyeV9vc2Ioc3RydWN0IG9jZnMyX2xvY2tfcmVzICpsb2NrcmVzKTsKIHN0YXRpYyBzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9jZnMyX2dldF9pbm9kZV9vc2Ioc3RydWN0IG9jZnMyX2xvY2tfcmVzICpsb2NrcmVzKTsKIHN0YXRpYyBzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9jZnMyX2dldF9maWxlX29zYihzdHJ1Y3Qgb2NmczJfbG9ja19yZXMgKmxvY2tyZXMpOworc3RhdGljIHN0cnVjdCBvY2ZzMl9zdXBlciAqb2NmczJfZ2V0X3FpbmZvX29zYihzdHJ1Y3Qgb2NmczJfbG9ja19yZXMgKmxvY2tyZXMpOwogCiAvKgogICogUmV0dXJuIHZhbHVlIGZyb20gLT5kb3duY29udmVydF93b3JrZXIgZnVuY3Rpb25zLgpAQCAtMTAyLDYgKzEwNSw3IEBACiBzdGF0aWMgdm9pZCBvY2ZzMl9kZW50cnlfcG9zdF91bmxvY2soc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCQkJICAgICBzdHJ1Y3Qgb2NmczJfbG9ja19yZXMgKmxvY2tyZXMpOwogCitzdGF0aWMgdm9pZCBvY2ZzMl9zZXRfcWluZm9fbHZiKHN0cnVjdCBvY2ZzMl9sb2NrX3JlcyAqbG9ja3Jlcyk7CiAKICNkZWZpbmUgbWxvZ19tZXRhX2x2YihfX2xldmVsLCBfX2xvY2tyZXMpIG9jZnMyX2R1bXBfbWV0YV9sdmJfaW5mbyhfX2xldmVsLCBfX1BSRVRUWV9GVU5DVElPTl9fLCBfX0xJTkVfXywgX19sb2NrcmVzKQogCkBAIC0xMTEsOCArMTE1LDcgQEAKIAkJCQkgICAgIHVuc2lnbmVkIGludCBsaW5lLAogCQkJCSAgICAgc3RydWN0IG9jZnMyX2xvY2tfcmVzICpsb2NrcmVzKQogewotCXN0cnVjdCBvY2ZzMl9tZXRhX2x2YiAqbHZiID0KLQkJKHN0cnVjdCBvY2ZzMl9tZXRhX2x2YiAqKW9jZnMyX2RsbV9sdmIoJmxvY2tyZXMtPmxfbGtzYik7CisJc3RydWN0IG9jZnMyX21ldGFfbHZiICpsdmIgPSBvY2ZzMl9kbG1fbHZiKCZsb2NrcmVzLT5sX2xrc2IpOwogCiAJbWxvZyhsZXZlbCwgIkxWQiBpbmZvcm1hdGlvbiBmb3IgJXMgKGNhbGxlZCBmcm9tICVzOiV1KTpcbiIsCiAJICAgICBsb2NrcmVzLT5sX25hbWUsIGZ1bmN0aW9uLCBsaW5lKTsKQEAgLTI1OCw2ICsyNjEsMTIgQEAKIAkuZmxhZ3MJCT0gMCwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgb2NmczJfbG9ja19yZXNfb3BzIG9jZnMyX3FpbmZvX2xvcHMgPSB7CisJLnNldF9sdmIJPSBvY2ZzMl9zZXRfcWluZm9fbHZiLAorCS5nZXRfb3NiCT0gb2NmczJfZ2V0X3FpbmZvX29zYiwKKwkuZmxhZ3MJCT0gTE9DS19UWVBFX1JFUVVJUkVTX1JFRlJFU0ggfCBMT0NLX1RZUEVfVVNFU19MVkIsCit9OworCiBzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9pc19pbm9kZV9sb2NrKHN0cnVjdCBvY2ZzMl9sb2NrX3JlcyAqbG9ja3JlcykKIHsKIAlyZXR1cm4gbG9ja3Jlcy0+bF90eXBlID09IE9DRlMyX0xPQ0tfVFlQRV9NRVRBIHx8CkBAIC0yNzksNiArMjg4LDEzIEBACiAJcmV0dXJuIChzdHJ1Y3Qgb2NmczJfZGVudHJ5X2xvY2sgKilsb2NrcmVzLT5sX3ByaXY7CiB9CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG9jZnMyX21lbV9kcWluZm8gKm9jZnMyX2xvY2tfcmVzX3FpbmZvKHN0cnVjdCBvY2ZzMl9sb2NrX3JlcyAqbG9ja3JlcykKK3sKKwlCVUdfT04obG9ja3Jlcy0+bF90eXBlICE9IE9DRlMyX0xPQ0tfVFlQRV9RSU5GTyk7CisKKwlyZXR1cm4gKHN0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvICopbG9ja3Jlcy0+bF9wcml2OworfQorCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBvY2ZzMl9zdXBlciAqb2NmczJfZ2V0X2xvY2tyZXNfb3NiKHN0cnVjdCBvY2ZzMl9sb2NrX3JlcyAqbG9ja3JlcykKIHsKIAlpZiAobG9ja3Jlcy0+bF9vcHMtPmdldF9vc2IpCkBAIC01MDcsNiArNTIzLDEzIEBACiAJcmV0dXJuIE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKIH0KIAorc3RhdGljIHN0cnVjdCBvY2ZzMl9zdXBlciAqb2NmczJfZ2V0X3FpbmZvX29zYihzdHJ1Y3Qgb2NmczJfbG9ja19yZXMgKmxvY2tyZXMpCit7CisJc3RydWN0IG9jZnMyX21lbV9kcWluZm8gKmluZm8gPSBsb2NrcmVzLT5sX3ByaXY7CisKKwlyZXR1cm4gT0NGUzJfU0IoaW5mby0+ZHFpX2dpLmRxaV9zYik7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9jZnMyX2dldF9maWxlX29zYihzdHJ1Y3Qgb2NmczJfbG9ja19yZXMgKmxvY2tyZXMpCiB7CiAJc3RydWN0IG9jZnMyX2ZpbGVfcHJpdmF0ZSAqZnAgPSBsb2NrcmVzLT5sX3ByaXY7CkBAIC02MDksNiArNjMyLDE3IEBACiAJbG9ja3Jlcy0+bF9mbGFncyB8PSBPQ0ZTMl9MT0NLX05PQ0FDSEU7CiB9CiAKK3ZvaWQgb2NmczJfcWluZm9fbG9ja19yZXNfaW5pdChzdHJ1Y3Qgb2NmczJfbG9ja19yZXMgKmxvY2tyZXMsCisJCQkgICAgICAgc3RydWN0IG9jZnMyX21lbV9kcWluZm8gKmluZm8pCit7CisJb2NmczJfbG9ja19yZXNfaW5pdF9vbmNlKGxvY2tyZXMpOworCW9jZnMyX2J1aWxkX2xvY2tfbmFtZShPQ0ZTMl9MT0NLX1RZUEVfUUlORk8sIGluZm8tPmRxaV9naS5kcWlfdHlwZSwKKwkJCSAgICAgIDAsIGxvY2tyZXMtPmxfbmFtZSk7CisJb2NmczJfbG9ja19yZXNfaW5pdF9jb21tb24oT0NGUzJfU0IoaW5mby0+ZHFpX2dpLmRxaV9zYiksIGxvY2tyZXMsCisJCQkJICAgT0NGUzJfTE9DS19UWVBFX1FJTkZPLCAmb2NmczJfcWluZm9fbG9wcywKKwkJCQkgICBpbmZvKTsKK30KKwogdm9pZCBvY2ZzMl9sb2NrX3Jlc19mcmVlKHN0cnVjdCBvY2ZzMl9sb2NrX3JlcyAqcmVzKQogewogCW1sb2dfZW50cnlfdm9pZCgpOwpAQCAtMTI5MCw3ICsxMzI0LDcgQEAKIAkJCWdvdG8gb3V0OwogCQl9CiAKLQkJbWxvZygwLCAibG9jayAlcywgc3VjY2Vzc2Z1bGwgcmV0dXJuIGZyb20gb2NmczJfZGxtX2xvY2tcbiIsCisJCW1sb2coMCwgImxvY2sgJXMsIHN1Y2Nlc3NmdWwgcmV0dXJuIGZyb20gb2NmczJfZGxtX2xvY2tcbiIsCiAJCSAgICAgbG9ja3Jlcy0+bF9uYW1lKTsKIAogCQkvKiBBdCB0aGlzIHBvaW50IHdlJ3ZlIGdvbmUgaW5zaWRlIHRoZSBkbG0gYW5kIG5lZWQgdG8KQEAgLTE4MjksNyArMTg2Myw3IEBACiAKIAltbG9nX2VudHJ5X3ZvaWQoKTsKIAotCWx2YiA9IChzdHJ1Y3Qgb2NmczJfbWV0YV9sdmIgKilvY2ZzMl9kbG1fbHZiKCZsb2NrcmVzLT5sX2xrc2IpOworCWx2YiA9IG9jZnMyX2RsbV9sdmIoJmxvY2tyZXMtPmxfbGtzYik7CiAKIAkvKgogCSAqIEludmFsaWRhdGUgdGhlIExWQiBvZiBhIGRlbGV0ZWQgaW5vZGUgLSB0aGlzIHdheSBvdGhlcgpAQCAtMTg4MSw3ICsxOTE1LDcgQEAKIAogCW1sb2dfbWV0YV9sdmIoMCwgbG9ja3Jlcyk7CiAKLQlsdmIgPSAoc3RydWN0IG9jZnMyX21ldGFfbHZiICopb2NmczJfZGxtX2x2YigmbG9ja3Jlcy0+bF9sa3NiKTsKKwlsdmIgPSBvY2ZzMl9kbG1fbHZiKCZsb2NrcmVzLT5sX2xrc2IpOwogCiAJLyogV2UncmUgc2FmZSBoZXJlIHdpdGhvdXQgdGhlIGxvY2tyZXMgbG9jay4uLiAqLwogCXNwaW5fbG9jaygmb2ktPmlwX2xvY2spOwpAQCAtMTkxNiw4ICsxOTUwLDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50IG9jZnMyX21ldGFfbHZiX2lzX3RydXN0YWJsZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCQkgICAgICBzdHJ1Y3Qgb2NmczJfbG9ja19yZXMgKmxvY2tyZXMpCiB7Ci0Jc3RydWN0IG9jZnMyX21ldGFfbHZiICpsdmIgPQotCQkoc3RydWN0IG9jZnMyX21ldGFfbHZiICopb2NmczJfZGxtX2x2YigmbG9ja3Jlcy0+bF9sa3NiKTsKKwlzdHJ1Y3Qgb2NmczJfbWV0YV9sdmIgKmx2YiA9IG9jZnMyX2RsbV9sdmIoJmxvY2tyZXMtPmxfbGtzYik7CiAKIAlpZiAobHZiLT5sdmJfdmVyc2lvbiA9PSBPQ0ZTMl9MVkJfVkVSU0lPTgogCSAgICAmJiBiZTMyX3RvX2NwdShsdmItPmx2Yl9pZ2VuZXJhdGlvbikgPT0gaW5vZGUtPmlfZ2VuZXJhdGlvbikKQEAgLTIwMjQsNyArMjA1Nyw3IEBACiAJfSBlbHNlIHsKIAkJLyogQm9vLCB3ZSBoYXZlIHRvIGdvIHRvIGRpc2suICovCiAJCS8qIHJlYWQgYmgsIGNhc3QsIG9jZnMyX3JlZnJlc2hfaW5vZGUgKi8KLQkJc3RhdHVzID0gb2NmczJfcmVhZF9ibG9jayhpbm9kZSwgb2ktPmlwX2Jsa25vLCBiaCk7CisJCXN0YXR1cyA9IG9jZnMyX3JlYWRfaW5vZGVfYmxvY2soaW5vZGUsIGJoKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJCWdvdG8gYmFpbF9yZWZyZXNoOwpAQCAtMjAzMiwxOCArMjA2NSwxNCBAQAogCQlmZSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopICgqYmgpLT5iX2RhdGE7CiAKIAkJLyogVGhpcyBpcyBhIGdvb2QgY2hhbmNlIHRvIG1ha2Ugc3VyZSB3ZSdyZSBub3QKLQkJICogbG9ja2luZyBhbiBpbnZhbGlkIG9iamVjdC4KKwkJICogbG9ja2luZyBhbiBpbnZhbGlkIG9iamVjdC4gIG9jZnMyX3JlYWRfaW5vZGVfYmxvY2soKQorCQkgKiBhbHJlYWR5IGNoZWNrZWQgdGhhdCB0aGUgaW5vZGUgYmxvY2sgaXMgc2FuZS4KIAkJICoKIAkJICogV2UgYnVnIG9uIGEgc3RhbGUgaW5vZGUgaGVyZSBiZWNhdXNlIHdlIGNoZWNrZWQKIAkJICogYWJvdmUgd2hldGhlciBpdCB3YXMgd2lwZWQgZnJvbSBkaXNrLiBUaGUgd2lwaW5nCiAJCSAqIG5vZGUgcHJvdmlkZXMgYSBndWFyYW50ZWUgdGhhdCB3ZSByZWNlaXZlIHRoYXQKIAkJICogbWVzc2FnZSBhbmQgY2FuIG1hcmsgdGhlIGlub2RlIGJlZm9yZSBkcm9wcGluZyBhbnkKIAkJICogbG9ja3MgYXNzb2NpYXRlZCB3aXRoIGl0LiAqLwotCQlpZiAoIU9DRlMyX0lTX1ZBTElEX0RJTk9ERShmZSkpIHsKLQkJCU9DRlMyX1JPX09OX0lOVkFMSURfRElOT0RFKGlub2RlLT5pX3NiLCBmZSk7Ci0JCQlzdGF0dXMgPSAtRUlPOwotCQkJZ290byBiYWlsX3JlZnJlc2g7Ci0JCX0KIAkJbWxvZ19idWdfb25fbXNnKGlub2RlLT5pX2dlbmVyYXRpb24gIT0KIAkJCQlsZTMyX3RvX2NwdShmZS0+aV9nZW5lcmF0aW9uKSwKIAkJCQkiSW52YWxpZCBkaW5vZGUgJWxsdSBkaXNrIGdlbmVyYXRpb246ICV1ICIKQEAgLTIwODUsNyArMjExNCw3IEBACiAJCXJldHVybiAwOwogCX0KIAotCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIE9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywgcmV0X2JoKTsKKwlzdGF0dXMgPSBvY2ZzMl9yZWFkX2lub2RlX2Jsb2NrKGlub2RlLCByZXRfYmgpOwogCWlmIChzdGF0dXMgPCAwKQogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAKQEAgLTI5MjIsNyArMjk1MSw3IEBACiAJCW9jZnMyX2RsbV9kdW1wX2xrc2IoJmxvY2tyZXMtPmxfbGtzYik7CiAJCUJVRygpOwogCX0KLQltbG9nKDAsICJsb2NrICVzLCBzdWNjZXNzZnVsbCByZXR1cm4gZnJvbSBvY2ZzMl9kbG1fdW5sb2NrXG4iLAorCW1sb2coMCwgImxvY2sgJXMsIHN1Y2Nlc3NmdWwgcmV0dXJuIGZyb20gb2NmczJfZGxtX3VubG9ja1xuIiwKIAkgICAgIGxvY2tyZXMtPmxfbmFtZSk7CiAKIAlvY2ZzMl93YWl0X29uX2J1c3lfbG9jayhsb2NrcmVzKTsKQEAgLTM0NDksNiArMzQ3OCwxMTcgQEAKIAlyZXR1cm4gVU5CTE9DS19DT05USU5VRV9QT1NUOwogfQogCitzdGF0aWMgdm9pZCBvY2ZzMl9zZXRfcWluZm9fbHZiKHN0cnVjdCBvY2ZzMl9sb2NrX3JlcyAqbG9ja3JlcykKK3sKKwlzdHJ1Y3Qgb2NmczJfcWluZm9fbHZiICpsdmI7CisJc3RydWN0IG9jZnMyX21lbV9kcWluZm8gKm9pbmZvID0gb2NmczJfbG9ja19yZXNfcWluZm8obG9ja3Jlcyk7CisJc3RydWN0IG1lbV9kcWluZm8gKmluZm8gPSBzYl9kcWluZm8ob2luZm8tPmRxaV9naS5kcWlfc2IsCisJCQkJCSAgICBvaW5mby0+ZHFpX2dpLmRxaV90eXBlKTsKKworCW1sb2dfZW50cnlfdm9pZCgpOworCisJbHZiID0gb2NmczJfZGxtX2x2YigmbG9ja3Jlcy0+bF9sa3NiKTsKKwlsdmItPmx2Yl92ZXJzaW9uID0gT0NGUzJfUUlORk9fTFZCX1ZFUlNJT047CisJbHZiLT5sdmJfYmdyYWNlID0gY3B1X3RvX2JlMzIoaW5mby0+ZHFpX2JncmFjZSk7CisJbHZiLT5sdmJfaWdyYWNlID0gY3B1X3RvX2JlMzIoaW5mby0+ZHFpX2lncmFjZSk7CisJbHZiLT5sdmJfc3luY21zID0gY3B1X3RvX2JlMzIob2luZm8tPmRxaV9zeW5jbXMpOworCWx2Yi0+bHZiX2Jsb2NrcyA9IGNwdV90b19iZTMyKG9pbmZvLT5kcWlfZ2kuZHFpX2Jsb2Nrcyk7CisJbHZiLT5sdmJfZnJlZV9ibGsgPSBjcHVfdG9fYmUzMihvaW5mby0+ZHFpX2dpLmRxaV9mcmVlX2Jsayk7CisJbHZiLT5sdmJfZnJlZV9lbnRyeSA9IGNwdV90b19iZTMyKG9pbmZvLT5kcWlfZ2kuZHFpX2ZyZWVfZW50cnkpOworCisJbWxvZ19leGl0X3ZvaWQoKTsKK30KKwordm9pZCBvY2ZzMl9xaW5mb191bmxvY2soc3RydWN0IG9jZnMyX21lbV9kcWluZm8gKm9pbmZvLCBpbnQgZXgpCit7CisJc3RydWN0IG9jZnMyX2xvY2tfcmVzICpsb2NrcmVzID0gJm9pbmZvLT5kcWlfZ3Fsb2NrOworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0Iob2luZm8tPmRxaV9naS5kcWlfc2IpOworCWludCBsZXZlbCA9IGV4ID8gRExNX0xPQ0tfRVggOiBETE1fTE9DS19QUjsKKworCW1sb2dfZW50cnlfdm9pZCgpOworCWlmICghb2NmczJfaXNfaGFyZF9yZWFkb25seShvc2IpICYmICFvY2ZzMl9tb3VudF9sb2NhbChvc2IpKQorCQlvY2ZzMl9jbHVzdGVyX3VubG9jayhvc2IsIGxvY2tyZXMsIGxldmVsKTsKKwltbG9nX2V4aXRfdm9pZCgpOworfQorCitzdGF0aWMgaW50IG9jZnMyX3JlZnJlc2hfcWluZm8oc3RydWN0IG9jZnMyX21lbV9kcWluZm8gKm9pbmZvKQoreworCXN0cnVjdCBtZW1fZHFpbmZvICppbmZvID0gc2JfZHFpbmZvKG9pbmZvLT5kcWlfZ2kuZHFpX3NiLAorCQkJCQkgICAgb2luZm8tPmRxaV9naS5kcWlfdHlwZSk7CisJc3RydWN0IG9jZnMyX2xvY2tfcmVzICpsb2NrcmVzID0gJm9pbmZvLT5kcWlfZ3Fsb2NrOworCXN0cnVjdCBvY2ZzMl9xaW5mb19sdmIgKmx2YiA9IG9jZnMyX2RsbV9sdmIoJmxvY2tyZXMtPmxfbGtzYik7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJc3RydWN0IG9jZnMyX2dsb2JhbF9kaXNrX2RxaW5mbyAqZ2RpbmZvOworCWludCBzdGF0dXMgPSAwOworCisJaWYgKGx2Yi0+bHZiX3ZlcnNpb24gPT0gT0NGUzJfUUlORk9fTFZCX1ZFUlNJT04pIHsKKwkJaW5mby0+ZHFpX2JncmFjZSA9IGJlMzJfdG9fY3B1KGx2Yi0+bHZiX2JncmFjZSk7CisJCWluZm8tPmRxaV9pZ3JhY2UgPSBiZTMyX3RvX2NwdShsdmItPmx2Yl9pZ3JhY2UpOworCQlvaW5mby0+ZHFpX3N5bmNtcyA9IGJlMzJfdG9fY3B1KGx2Yi0+bHZiX3N5bmNtcyk7CisJCW9pbmZvLT5kcWlfZ2kuZHFpX2Jsb2NrcyA9IGJlMzJfdG9fY3B1KGx2Yi0+bHZiX2Jsb2Nrcyk7CisJCW9pbmZvLT5kcWlfZ2kuZHFpX2ZyZWVfYmxrID0gYmUzMl90b19jcHUobHZiLT5sdmJfZnJlZV9ibGspOworCQlvaW5mby0+ZHFpX2dpLmRxaV9mcmVlX2VudHJ5ID0KKwkJCQkJYmUzMl90b19jcHUobHZiLT5sdmJfZnJlZV9lbnRyeSk7CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gb2NmczJfcmVhZF9xdW90YV9ibG9jayhvaW5mby0+ZHFpX2dxaW5vZGUsIDAsICZiaCk7CisJCWlmIChzdGF0dXMpIHsKKwkJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJCWdvdG8gYmFpbDsKKwkJfQorCQlnZGluZm8gPSAoc3RydWN0IG9jZnMyX2dsb2JhbF9kaXNrX2RxaW5mbyAqKQorCQkJCQkoYmgtPmJfZGF0YSArIE9DRlMyX0dMT0JBTF9JTkZPX09GRik7CisJCWluZm8tPmRxaV9iZ3JhY2UgPSBsZTMyX3RvX2NwdShnZGluZm8tPmRxaV9iZ3JhY2UpOworCQlpbmZvLT5kcWlfaWdyYWNlID0gbGUzMl90b19jcHUoZ2RpbmZvLT5kcWlfaWdyYWNlKTsKKwkJb2luZm8tPmRxaV9zeW5jbXMgPSBsZTMyX3RvX2NwdShnZGluZm8tPmRxaV9zeW5jbXMpOworCQlvaW5mby0+ZHFpX2dpLmRxaV9ibG9ja3MgPSBsZTMyX3RvX2NwdShnZGluZm8tPmRxaV9ibG9ja3MpOworCQlvaW5mby0+ZHFpX2dpLmRxaV9mcmVlX2JsayA9IGxlMzJfdG9fY3B1KGdkaW5mby0+ZHFpX2ZyZWVfYmxrKTsKKwkJb2luZm8tPmRxaV9naS5kcWlfZnJlZV9lbnRyeSA9CisJCQkJCWxlMzJfdG9fY3B1KGdkaW5mby0+ZHFpX2ZyZWVfZW50cnkpOworCQlicmVsc2UoYmgpOworCQlvY2ZzMl90cmFja19sb2NrX3JlZnJlc2gobG9ja3Jlcyk7CisJfQorCitiYWlsOgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIExvY2sgcXVvdGEgaW5mbywgdGhpcyBmdW5jdGlvbiBleHBlY3RzIGF0IGxlYXN0IHNoYXJlZCBsb2NrIG9uIHRoZSBxdW90YSBmaWxlCisgKiBzbyB0aGF0IHdlIGNhbiBzYWZlbHkgcmVmcmVzaCBxdW90YSBpbmZvIGZyb20gZGlzay4gKi8KK2ludCBvY2ZzMl9xaW5mb19sb2NrKHN0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvICpvaW5mbywgaW50IGV4KQoreworCXN0cnVjdCBvY2ZzMl9sb2NrX3JlcyAqbG9ja3JlcyA9ICZvaW5mby0+ZHFpX2dxbG9jazsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKG9pbmZvLT5kcWlfZ2kuZHFpX3NiKTsKKwlpbnQgbGV2ZWwgPSBleCA/IERMTV9MT0NLX0VYIDogRExNX0xPQ0tfUFI7CisJaW50IHN0YXR1cyA9IDA7CisKKwltbG9nX2VudHJ5X3ZvaWQoKTsKKworCS8qIE9uIFJPIGRldmljZXMsIGxvY2tpbmcgcmVhbGx5IGlzbid0IG5lZWRlZC4uLiAqLworCWlmIChvY2ZzMl9pc19oYXJkX3JlYWRvbmx5KG9zYikpIHsKKwkJaWYgKGV4KQorCQkJc3RhdHVzID0gLUVST0ZTOworCQlnb3RvIGJhaWw7CisJfQorCWlmIChvY2ZzMl9tb3VudF9sb2NhbChvc2IpKQorCQlnb3RvIGJhaWw7CisKKwlzdGF0dXMgPSBvY2ZzMl9jbHVzdGVyX2xvY2sob3NiLCBsb2NrcmVzLCBsZXZlbCwgMCwgMCk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIGJhaWw7CisJfQorCWlmICghb2NmczJfc2hvdWxkX3JlZnJlc2hfbG9ja19yZXMobG9ja3JlcykpCisJCWdvdG8gYmFpbDsKKwkvKiBPSywgd2UgaGF2ZSB0aGUgbG9jayBidXQgd2UgbmVlZCB0byByZWZyZXNoIHRoZSBxdW90YSBpbmZvICovCisJc3RhdHVzID0gb2NmczJfcmVmcmVzaF9xaW5mbyhvaW5mbyk7CisJaWYgKHN0YXR1cykKKwkJb2NmczJfcWluZm9fdW5sb2NrKG9pbmZvLCBleCk7CisJb2NmczJfY29tcGxldGVfbG9ja19yZXNfcmVmcmVzaChsb2NrcmVzLCBzdGF0dXMpOworYmFpbDoKKwltbG9nX2V4aXQoc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCiAvKgogICogVGhpcyBpcyB0aGUgZmlsZXN5c3RlbSBsb2NraW5nIHByb3RvY29sLiAgSXQgcHJvdmlkZXMgdGhlIGxvY2sgaGFuZGxpbmcKICAqIGhvb2tzIGZvciB0aGUgdW5kZXJseWluZyBETE0uICBJdCBoYXMgYSBtYXhpbXVtIHZlcnNpb24gbnVtYmVyLgpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtZ2x1ZS5oIGIvZnMvb2NmczIvZGxtZ2x1ZS5oCmluZGV4IDJiYjAxZjAuLjNmOGQ5OTggMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2RsbWdsdWUuaAorKysgYi9mcy9vY2ZzMi9kbG1nbHVlLmgKQEAgLTQ5LDYgKzQ5LDE5IEBACiAJX19iZTMyICAgICAgIGx2Yl9yZXNlcnZlZDI7CiB9OwogCisjZGVmaW5lIE9DRlMyX1FJTkZPX0xWQl9WRVJTSU9OIDEKKworc3RydWN0IG9jZnMyX3FpbmZvX2x2YiB7CisJX191OAlsdmJfdmVyc2lvbjsKKwlfX3U4CWx2Yl9yZXNlcnZlZFszXTsKKwlfX2JlMzIJbHZiX2JncmFjZTsKKwlfX2JlMzIJbHZiX2lncmFjZTsKKwlfX2JlMzIJbHZiX3N5bmNtczsKKwlfX2JlMzIJbHZiX2Jsb2NrczsKKwlfX2JlMzIJbHZiX2ZyZWVfYmxrOworCV9fYmUzMglsdmJfZnJlZV9lbnRyeTsKK307CisKIC8qIG9jZnMyX2lub2RlX2xvY2tfZnVsbCgpICdhcmdfZmxhZ3MnIGZsYWdzICovCiAvKiBkb24ndCB3YWl0IG9uIHJlY292ZXJ5LiAqLwogI2RlZmluZSBPQ0ZTMl9NRVRBX0xPQ0tfUkVDT1ZFUlkJKDB4MDEpCkBAIC02OSw2ICs4Miw5IEBACiBzdHJ1Y3Qgb2NmczJfZmlsZV9wcml2YXRlOwogdm9pZCBvY2ZzMl9maWxlX2xvY2tfcmVzX2luaXQoc3RydWN0IG9jZnMyX2xvY2tfcmVzICpsb2NrcmVzLAogCQkJICAgICAgc3RydWN0IG9jZnMyX2ZpbGVfcHJpdmF0ZSAqZnApOworc3RydWN0IG9jZnMyX21lbV9kcWluZm87Cit2b2lkIG9jZnMyX3FpbmZvX2xvY2tfcmVzX2luaXQoc3RydWN0IG9jZnMyX2xvY2tfcmVzICpsb2NrcmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvICppbmZvKTsKIHZvaWQgb2NmczJfbG9ja19yZXNfZnJlZShzdHJ1Y3Qgb2NmczJfbG9ja19yZXMgKnJlcyk7CiBpbnQgb2NmczJfY3JlYXRlX25ld19pbm9kZV9sb2NrcyhzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIGludCBvY2ZzMl9kcm9wX2lub2RlX2xvY2tzKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwpAQCAtMTAzLDYgKzExOSw5IEBACiB2b2lkIG9jZnMyX2RlbnRyeV91bmxvY2soc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgZXgpOwogaW50IG9jZnMyX2ZpbGVfbG9jayhzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGV4LCBpbnQgdHJ5bG9jayk7CiB2b2lkIG9jZnMyX2ZpbGVfdW5sb2NrKHN0cnVjdCBmaWxlICpmaWxlKTsKK2ludCBvY2ZzMl9xaW5mb19sb2NrKHN0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvICpvaW5mbywgaW50IGV4KTsKK3ZvaWQgb2NmczJfcWluZm9fdW5sb2NrKHN0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvICpvaW5mbywgaW50IGV4KTsKKwogCiB2b2lkIG9jZnMyX21hcmtfbG9ja3Jlc19mcmVlaW5nKHN0cnVjdCBvY2ZzMl9sb2NrX3JlcyAqbG9ja3Jlcyk7CiB2b2lkIG9jZnMyX3NpbXBsZV9kcm9wX2xvY2tyZXMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9leHRlbnRfbWFwLmMgYi9mcy9vY2ZzMi9leHRlbnRfbWFwLmMKaW5kZXggMmJhZWRhYy4uZjJiYjFhMCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZXh0ZW50X21hcC5jCisrKyBiL2ZzL29jZnMyL2V4dGVudF9tYXAuYwpAQCAtMjkzLDcgKzI5Myw3IEBACiAJc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqZWI7CiAJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbDsKIAotCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIGxhc3RfZWJfYmxrLCAmZWJfYmgpOworCXJldCA9IG9jZnMyX3JlYWRfZXh0ZW50X2Jsb2NrKGlub2RlLCBsYXN0X2ViX2JsaywgJmViX2JoKTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CkBAIC0zMDIsMTIgKzMwMiw2IEBACiAJZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKSBlYl9iaC0+Yl9kYXRhOwogCWVsID0gJmViLT5oX2xpc3Q7CiAKLQlpZiAoIU9DRlMyX0lTX1ZBTElEX0VYVEVOVF9CTE9DSyhlYikpIHsKLQkJcmV0ID0gLUVST0ZTOwotCQlPQ0ZTMl9ST19PTl9JTlZBTElEX0VYVEVOVF9CTE9DSyhpbm9kZS0+aV9zYiwgZWIpOwotCQlnb3RvIG91dDsKLQl9Ci0KIAlpZiAoZWwtPmxfdHJlZV9kZXB0aCkgewogCQlvY2ZzMl9lcnJvcihpbm9kZS0+aV9zYiwKIAkJCSAgICAiSW5vZGUgJWx1IGhhcyBub24gemVybyB0cmVlIGRlcHRoIGluICIKQEAgLTM4MSwyMyArMzc1LDE2IEBACiAJCWlmIChsZTY0X3RvX2NwdShlYi0+aF9uZXh0X2xlYWZfYmxrKSA9PSAwVUxMKQogCQkJZ290byBub19tb3JlX2V4dGVudHM7CiAKLQkJcmV0ID0gb2NmczJfcmVhZF9ibG9jayhpbm9kZSwKLQkJCQkgICAgICAgbGU2NF90b19jcHUoZWItPmhfbmV4dF9sZWFmX2JsayksCi0JCQkJICAgICAgICZuZXh0X2ViX2JoKTsKKwkJcmV0ID0gb2NmczJfcmVhZF9leHRlbnRfYmxvY2soaW5vZGUsCisJCQkJCSAgICAgIGxlNjRfdG9fY3B1KGViLT5oX25leHRfbGVhZl9ibGspLAorCQkJCQkgICAgICAmbmV4dF9lYl9iaCk7CiAJCWlmIChyZXQpIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCWdvdG8gb3V0OwogCQl9CisKIAkJbmV4dF9lYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopbmV4dF9lYl9iaC0+Yl9kYXRhOwotCi0JCWlmICghT0NGUzJfSVNfVkFMSURfRVhURU5UX0JMT0NLKG5leHRfZWIpKSB7Ci0JCQlyZXQgPSAtRVJPRlM7Ci0JCQlPQ0ZTMl9ST19PTl9JTlZBTElEX0VYVEVOVF9CTE9DSyhpbm9kZS0+aV9zYiwgbmV4dF9lYik7Ci0JCQlnb3RvIG91dDsKLQkJfQotCiAJCWVsID0gJm5leHRfZWItPmhfbGlzdDsKLQogCQlpID0gb2NmczJfc2VhcmNoX2Zvcl9ob2xlX2luZGV4KGVsLCB2X2NsdXN0ZXIpOwogCX0KIApAQCAtNjMwLDcgKzYxNyw3IEBACiAJaWYgKHJldCA9PSAwKQogCQlnb3RvIG91dDsKIAotCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIE9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywgJmRpX2JoKTsKKwlyZXQgPSBvY2ZzMl9yZWFkX2lub2RlX2Jsb2NrKGlub2RlLCAmZGlfYmgpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dDsKQEAgLTgxOSwzICs4MDYsNzQgQEAKIAogCXJldHVybiByZXQ7CiB9CisKK2ludCBvY2ZzMl9yZWFkX3ZpcnRfYmxvY2tzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCB2X2Jsb2NrLCBpbnQgbnIsCisJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoc1tdLCBpbnQgZmxhZ3MsCisJCQkgICBpbnQgKCp2YWxpZGF0ZSkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkpCit7CisJaW50IHJjID0gMDsKKwl1NjQgcF9ibG9jaywgcF9jb3VudDsKKwlpbnQgaSwgY291bnQsIGRvbmUgPSAwOworCisJbWxvZ19lbnRyeSgiKGlub2RlID0gJXAsIHZfYmxvY2sgPSAlbGx1LCBuciA9ICVkLCBiaHMgPSAlcCwgIgorCQkgICAiZmxhZ3MgPSAleCwgdmFsaWRhdGUgPSAlcClcbiIsCisJCSAgIGlub2RlLCAodW5zaWduZWQgbG9uZyBsb25nKXZfYmxvY2ssIG5yLCBiaHMsIGZsYWdzLAorCQkgICB2YWxpZGF0ZSk7CisKKwlpZiAoKCh2X2Jsb2NrICsgbnIgLSAxKSA8PCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cykgPj0KKwkgICAgaV9zaXplX3JlYWQoaW5vZGUpKSB7CisJCUJVR19PTighKGZsYWdzICYgT0NGUzJfQkhfUkVBREFIRUFEKSk7CisJCWdvdG8gb3V0OworCX0KKworCXdoaWxlIChkb25lIDwgbnIpIHsKKwkJZG93bl9yZWFkKCZPQ0ZTMl9JKGlub2RlKS0+aXBfYWxsb2Nfc2VtKTsKKwkJcmMgPSBvY2ZzMl9leHRlbnRfbWFwX2dldF9ibG9ja3MoaW5vZGUsIHZfYmxvY2sgKyBkb25lLAorCQkJCQkJICZwX2Jsb2NrLCAmcF9jb3VudCwgTlVMTCk7CisJCXVwX3JlYWQoJk9DRlMyX0koaW5vZGUpLT5pcF9hbGxvY19zZW0pOworCQlpZiAocmMpIHsKKwkJCW1sb2dfZXJybm8ocmMpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIXBfYmxvY2spIHsKKwkJCXJjID0gLUVJTzsKKwkJCW1sb2coTUxfRVJST1IsCisJCQkgICAgICJJbm9kZSAjJWxsdSBjb250YWlucyBhIGhvbGUgYXQgb2Zmc2V0ICVsbHVcbiIsCisJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAorCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKSh2X2Jsb2NrICsgZG9uZSkgPDwKKwkJCSAgICAgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCQkJYnJlYWs7CisJCX0KKworCQljb3VudCA9IG5yIC0gZG9uZTsKKwkJaWYgKHBfY291bnQgPCBjb3VudCkKKwkJCWNvdW50ID0gcF9jb3VudDsKKworCQkvKgorCQkgKiBJZiB0aGUgY2FsbGVyIHBhc3NlZCB1cyBiaHMsIHRoZXkgc2hvdWxkIGhhdmUgY29tZQorCQkgKiBmcm9tIGEgcHJldmlvdXMgcmVhZGFoZWFkIGNhbGwgdG8gdGhpcyBmdW5jdGlvbi4gIFRodXMsCisJCSAqIHRoZXkgc2hvdWxkIGhhdmUgdGhlIHJpZ2h0IGJfYmxvY2tuci4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQlpZiAoIWJoc1tkb25lICsgaV0pCisJCQkJY29udGludWU7CisJCQlCVUdfT04oYmhzW2RvbmUgKyBpXS0+Yl9ibG9ja25yICE9IChwX2Jsb2NrICsgaSkpOworCQl9CisKKwkJcmMgPSBvY2ZzMl9yZWFkX2Jsb2Nrcyhpbm9kZSwgcF9ibG9jaywgY291bnQsIGJocyArIGRvbmUsCisJCQkJICAgICAgIGZsYWdzLCB2YWxpZGF0ZSk7CisJCWlmIChyYykgeworCQkJbWxvZ19lcnJubyhyYyk7CisJCQlicmVhazsKKwkJfQorCQlkb25lICs9IGNvdW50OworCX0KKworb3V0OgorCW1sb2dfZXhpdChyYyk7CisJcmV0dXJuIHJjOworfQorCisKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2V4dGVudF9tYXAuaCBiL2ZzL29jZnMyL2V4dGVudF9tYXAuaAppbmRleCAxYzRhYThiLi5iN2RkOTczIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9leHRlbnRfbWFwLmgKKysrIGIvZnMvb2NmczIvZXh0ZW50X21hcC5oCkBAIC01Nyw0ICs1NywyOCBAQAogCQkJICAgICB1MzIgKnBfY2x1c3RlciwgdTMyICpudW1fY2x1c3RlcnMsCiAJCQkgICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwpOwogCitpbnQgb2NmczJfcmVhZF92aXJ0X2Jsb2NrcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgdl9ibG9jaywgaW50IG5yLAorCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaHNbXSwgaW50IGZsYWdzLAorCQkJICAgaW50ICgqdmFsaWRhdGUpKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpKTsKK3N0YXRpYyBpbmxpbmUgaW50IG9jZnMyX3JlYWRfdmlydF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgdl9ibG9jaywKKwkJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmgsCisJCQkJCWludCAoKnZhbGlkYXRlKShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgpKQoreworCWludCBzdGF0dXMgPSAwOworCisJaWYgKGJoID09IE5VTEwpIHsKKwkJcHJpbnRrKCJvY2ZzMjogYmggPT0gTlVMTFxuIik7CisJCXN0YXR1cyA9IC1FSU5WQUw7CisJCWdvdG8gYmFpbDsKKwl9CisKKwlzdGF0dXMgPSBvY2ZzMl9yZWFkX3ZpcnRfYmxvY2tzKGlub2RlLCB2X2Jsb2NrLCAxLCBiaCwgMCwgdmFsaWRhdGUpOworCitiYWlsOgorCXJldHVybiBzdGF0dXM7Cit9CisKKwogI2VuZGlmICAvKiBfRVhURU5UX01BUF9IICovCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9maWxlLmMgYi9mcy9vY2ZzMi9maWxlLmMKaW5kZXggZTI1NzBhMy4uYTU4ODdkZiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZmlsZS5jCisrKyBiL2ZzL29jZnMyL2ZpbGUuYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CiAjaW5jbHVkZSA8bGludXgvZmFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KIAogI2RlZmluZSBNTE9HX01BU0tfUFJFRklYIE1MX0lOT0RFCiAjaW5jbHVkZSA8Y2x1c3Rlci9tYXNrbG9nLmg+CkBAIC01Niw2ICs1Nyw4IEBACiAjaW5jbHVkZSAic3ViYWxsb2MuaCIKICNpbmNsdWRlICJzdXBlci5oIgogI2luY2x1ZGUgInhhdHRyLmgiCisjaW5jbHVkZSAiYWNsLmgiCisjaW5jbHVkZSAicXVvdGEuaCIKIAogI2luY2x1ZGUgImJ1ZmZlcl9oZWFkX2lvLmgiCiAKQEAgLTI1Myw4ICsyNTYsOCBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBiaCwKLQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZGkoaGFuZGxlLCBpbm9kZSwgYmgsCisJCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dF9jb21taXQ7CkBAIC0zMDMsOSArMzA2LDkgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgaW50IG9jZnMyX3NpbXBsZV9zaXplX3VwZGF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLAotCQkJCSAgICB1NjQgbmV3X2lfc2l6ZSkKK2ludCBvY2ZzMl9zaW1wbGVfc2l6ZV91cGRhdGUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCwKKwkJCSAgICAgdTY0IG5ld19pX3NpemUpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKQEAgLTM1MCw4ICszNTMsOCBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBmZV9iaCwKLQkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZGkoaGFuZGxlLCBpbm9kZSwgZmVfYmgsCisJCQkJCSBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIG91dF9jb21taXQ7CkBAIC00MDEsMTIgKzQwNCw5IEBACiAJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAogCQkgICAodW5zaWduZWQgbG9uZyBsb25nKW5ld19pX3NpemUpOwogCisJLyogV2UgdHJ1c3QgZGlfYmggYmVjYXVzZSBpdCBjb21lcyBmcm9tIG9jZnMyX2lub2RlX2xvY2soKSwgd2hpY2gKKwkgKiBhbHJlYWR5IHZhbGlkYXRlZCBpdCAqLwogCWZlID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKikgZGlfYmgtPmJfZGF0YTsKLQlpZiAoIU9DRlMyX0lTX1ZBTElEX0RJTk9ERShmZSkpIHsKLQkJT0NGUzJfUk9fT05fSU5WQUxJRF9ESU5PREUoaW5vZGUtPmlfc2IsIGZlKTsKLQkJc3RhdHVzID0gLUVJTzsKLQkJZ290byBiYWlsOwotCX0KIAogCW1sb2dfYnVnX29uX21zZyhsZTY0X3RvX2NwdShmZS0+aV9zaXplKSAhPSBpX3NpemVfcmVhZChpbm9kZSksCiAJCQkiSW5vZGUgJWxsdSwgaW5vZGUgaV9zaXplID0gJWxsZCAhPSBkaSAiCkBAIC01MzYsNiArNTM2LDcgQEAKIAllbnVtIG9jZnMyX2FsbG9jX3Jlc3RhcnRlZCB3aHk7CiAJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CiAJc3RydWN0IG9jZnMyX2V4dGVudF90cmVlIGV0OworCWludCBkaWRfcXVvdGEgPSAwOwogCiAJbWxvZ19lbnRyeSgiKGNsdXN0ZXJzX3RvX2FkZCA9ICV1KVxuIiwgY2x1c3RlcnNfdG9fYWRkKTsKIApAQCAtNTQ1LDE4ICs1NDYsMTIgQEAKIAkgKi8KIAlCVUdfT04obWFya191bndyaXR0ZW4gJiYgIW9jZnMyX3NwYXJzZV9hbGxvYyhvc2IpKTsKIAotCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIE9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywgJmJoKTsKKwlzdGF0dXMgPSBvY2ZzMl9yZWFkX2lub2RlX2Jsb2NrKGlub2RlLCAmYmgpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBsZWF2ZTsKIAl9Ci0KIAlmZSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopIGJoLT5iX2RhdGE7Ci0JaWYgKCFPQ0ZTMl9JU19WQUxJRF9ESU5PREUoZmUpKSB7Ci0JCU9DRlMyX1JPX09OX0lOVkFMSURfRElOT0RFKGlub2RlLT5pX3NiLCBmZSk7Ci0JCXN0YXR1cyA9IC1FSU87Ci0JCWdvdG8gbGVhdmU7Ci0JfQogCiByZXN0YXJ0X2FsbDoKIAlCVUdfT04obGUzMl90b19jcHUoZmUtPmlfY2x1c3RlcnMpICE9IE9DRlMyX0koaW5vZGUpLT5pcF9jbHVzdGVycyk7CkBAIC01ODUsMTEgKzU4MCwxOCBAQAogCX0KIAogcmVzdGFydGVkX3RyYW5zYWN0aW9uOgorCWlmICh2ZnNfZHFfYWxsb2Nfc3BhY2Vfbm9kaXJ0eShpbm9kZSwgb2NmczJfY2x1c3RlcnNfdG9fYnl0ZXMob3NiLT5zYiwKKwkgICAgY2x1c3RlcnNfdG9fYWRkKSkpIHsKKwkJc3RhdHVzID0gLUVEUVVPVDsKKwkJZ290byBsZWF2ZTsKKwl9CisJZGlkX3F1b3RhID0gMTsKKwogCS8qIHJlc2VydmUgYSB3cml0ZSB0byB0aGUgZmlsZSBlbnRyeSBlYXJseSBvbiAtIHRoYXQgd2UgaWYgd2UKIAkgKiBydW4gb3V0IG9mIGNyZWRpdHMgaW4gdGhlIGFsbG9jYXRpb24gcGF0aCwgd2UgY2FuIHN0aWxsCiAJICogdXBkYXRlIGlfc2l6ZS4gKi8KLQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBiaCwKLQkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZGkoaGFuZGxlLCBpbm9kZSwgYmgsCisJCQkJCSBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGxlYXZlOwpAQCAtNjIyLDYgKzYyNCwxMCBAQAogCXNwaW5fbG9jaygmT0NGUzJfSShpbm9kZSktPmlwX2xvY2spOwogCWNsdXN0ZXJzX3RvX2FkZCAtPSAoT0NGUzJfSShpbm9kZSktPmlwX2NsdXN0ZXJzIC0gcHJldl9jbHVzdGVycyk7CiAJc3Bpbl91bmxvY2soJk9DRlMyX0koaW5vZGUpLT5pcF9sb2NrKTsKKwkvKiBSZWxlYXNlIHVudXNlZCBxdW90YSByZXNlcnZhdGlvbiAqLworCXZmc19kcV9mcmVlX3NwYWNlKGlub2RlLAorCQkJb2NmczJfY2x1c3RlcnNfdG9fYnl0ZXMob3NiLT5zYiwgY2x1c3RlcnNfdG9fYWRkKSk7CisJZGlkX3F1b3RhID0gMDsKIAogCWlmICh3aHkgIT0gUkVTVEFSVF9OT05FICYmIGNsdXN0ZXJzX3RvX2FkZCkgewogCQlpZiAod2h5ID09IFJFU1RBUlRfTUVUQSkgewpAQCAtNjU0LDYgKzY2MCw5IEBACiAJICAgICBPQ0ZTMl9JKGlub2RlKS0+aXBfY2x1c3RlcnMsIChsb25nIGxvbmcpaV9zaXplX3JlYWQoaW5vZGUpKTsKIAogbGVhdmU6CisJaWYgKHN0YXR1cyA8IDAgJiYgZGlkX3F1b3RhKQorCQl2ZnNfZHFfZnJlZV9zcGFjZShpbm9kZSwKKwkJCW9jZnMyX2NsdXN0ZXJzX3RvX2J5dGVzKG9zYi0+c2IsIGNsdXN0ZXJzX3RvX2FkZCkpOwogCWlmIChoYW5kbGUpIHsKIAkJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKIAkJaGFuZGxlID0gTlVMTDsKQEAgLTg4NSw2ICs4OTQsOSBAQAogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0Ioc2IpOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOwogCWhhbmRsZV90ICpoYW5kbGUgPSBOVUxMOworCWludCBsb2NrZWRbTUFYUVVPVEFTXSA9IHswLCAwfTsKKwlpbnQgY3JlZGl0cywgcXR5cGU7CisJc3RydWN0IG9jZnMyX21lbV9kcWluZm8gKm9pbmZvOwogCiAJbWxvZ19lbnRyeSgiKDB4JXAsICclLipzJylcbiIsIGRlbnRyeSwKIAkgICAgICAgICAgIGRlbnRyeS0+ZF9uYW1lLmxlbiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CkBAIC05NTUsMTEgKzk2Nyw0NyBAQAogCQl9CiAJfQogCi0JaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUyk7Ci0JaWYgKElTX0VSUihoYW5kbGUpKSB7Ci0JCXN0YXR1cyA9IFBUUl9FUlIoaGFuZGxlKTsKLQkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQlnb3RvIGJhaWxfdW5sb2NrOworCWlmICgoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1VJRCAmJiBhdHRyLT5pYV91aWQgIT0gaW5vZGUtPmlfdWlkKSB8fAorCSAgICAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX0dJRCAmJiBhdHRyLT5pYV9naWQgIT0gaW5vZGUtPmlfZ2lkKSkgeworCQljcmVkaXRzID0gT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFM7CisJCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfVUlEICYmIGF0dHItPmlhX3VpZCAhPSBpbm9kZS0+aV91aWQKKwkJICAgICYmIE9DRlMyX0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwKKwkJICAgIE9DRlMyX0ZFQVRVUkVfUk9fQ09NUEFUX1VTUlFVT1RBKSkgeworCQkJb2luZm8gPSBzYl9kcWluZm8oc2IsIFVTUlFVT1RBKS0+ZHFpX3ByaXY7CisJCQlzdGF0dXMgPSBvY2ZzMl9sb2NrX2dsb2JhbF9xZihvaW5mbywgMSk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlnb3RvIGJhaWxfdW5sb2NrOworCQkJY3JlZGl0cyArPSBvY2ZzMl9jYWxjX3Fpbml0X2NyZWRpdHMoc2IsIFVTUlFVT1RBKSArCisJCQkJb2NmczJfY2FsY19xZGVsX2NyZWRpdHMoc2IsIFVTUlFVT1RBKTsKKwkJCWxvY2tlZFtVU1JRVU9UQV0gPSAxOworCQl9CisJCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfR0lEICYmIGF0dHItPmlhX2dpZCAhPSBpbm9kZS0+aV9naWQKKwkJICAgICYmIE9DRlMyX0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwKKwkJICAgIE9DRlMyX0ZFQVRVUkVfUk9fQ09NUEFUX0dSUFFVT1RBKSkgeworCQkJb2luZm8gPSBzYl9kcWluZm8oc2IsIEdSUFFVT1RBKS0+ZHFpX3ByaXY7CisJCQlzdGF0dXMgPSBvY2ZzMl9sb2NrX2dsb2JhbF9xZihvaW5mbywgMSk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlnb3RvIGJhaWxfdW5sb2NrOworCQkJY3JlZGl0cyArPSBvY2ZzMl9jYWxjX3Fpbml0X2NyZWRpdHMoc2IsIEdSUFFVT1RBKSArCisJCQkJICAgb2NmczJfY2FsY19xZGVsX2NyZWRpdHMoc2IsIEdSUFFVT1RBKTsKKwkJCWxvY2tlZFtHUlBRVU9UQV0gPSAxOworCQl9CisJCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgY3JlZGl0cyk7CisJCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQkJc3RhdHVzID0gUFRSX0VSUihoYW5kbGUpOworCQkJbWxvZ19lcnJubyhzdGF0dXMpOworCQkJZ290byBiYWlsX3VubG9jazsKKwkJfQorCQlzdGF0dXMgPSB2ZnNfZHFfdHJhbnNmZXIoaW5vZGUsIGF0dHIpID8gLUVEUVVPVCA6IDA7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBiYWlsX2NvbW1pdDsKKwl9IGVsc2UgeworCQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX0lOT0RFX1VQREFURV9DUkVESVRTKTsKKwkJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCQlzdGF0dXMgPSBQVFJfRVJSKGhhbmRsZSk7CisJCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCQlnb3RvIGJhaWxfdW5sb2NrOworCQl9CiAJfQogCiAJLyoKQEAgLTk4Miw2ICsxMDMwLDEyIEBACiBiYWlsX2NvbW1pdDoKIAlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOwogYmFpbF91bmxvY2s6CisJZm9yIChxdHlwZSA9IDA7IHF0eXBlIDwgTUFYUVVPVEFTOyBxdHlwZSsrKSB7CisJCWlmICghbG9ja2VkW3F0eXBlXSkKKwkJCWNvbnRpbnVlOworCQlvaW5mbyA9IHNiX2RxaW5mbyhzYiwgcXR5cGUpLT5kcWlfcHJpdjsKKwkJb2NmczJfdW5sb2NrX2dsb2JhbF9xZihvaW5mbywgMSk7CisJfQogCW9jZnMyX2lub2RlX3VubG9jayhpbm9kZSwgMSk7CiBiYWlsX3VubG9ja19ydzoKIAlpZiAoc2l6ZV9jaGFuZ2UpCkBAIC05ODksNiArMTA0MywxMiBAQAogYmFpbDoKIAlicmVsc2UoYmgpOwogCisJaWYgKCFzdGF0dXMgJiYgYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01PREUpIHsKKwkJc3RhdHVzID0gb2NmczJfYWNsX2NobW9kKGlub2RlKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJfQorCiAJbWxvZ19leGl0KHN0YXR1cyk7CiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTEwMzUsNyArMTA5NSw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXJldCA9IGdlbmVyaWNfcGVybWlzc2lvbihpbm9kZSwgbWFzaywgTlVMTCk7CisJcmV0ID0gZ2VuZXJpY19wZXJtaXNzaW9uKGlub2RlLCBtYXNrLCBvY2ZzMl9jaGVja19hY2wpOwogCiAJb2NmczJfaW5vZGVfdW5sb2NrKGlub2RlLCAwKTsKIG91dDoKQEAgLTEwNjEsOCArMTEyMSw4IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGJoLAotCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19kaShoYW5kbGUsIGlub2RlLCBiaCwKKwkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJaWYgKHJldCA8IDApIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dF90cmFuczsKQEAgLTExMjgsOSArMTE4OCw4IEBACiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKLQlzdHJ1Y3Qgb2NmczJfaW5vZGVfaW5mbyAqb2kgPSBPQ0ZTMl9JKGlub2RlKTsKIAotCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIG9pLT5pcF9ibGtubywgJmJoKTsKKwlyZXQgPSBvY2ZzMl9yZWFkX2lub2RlX2Jsb2NrKGlub2RlLCAmYmgpOwogCWlmIChyZXQgPCAwKSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CkBAIC0xMTU2LDggKzEyMTUsNyBAQAogCXN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmggPSBOVUxMOwogCiAJaWYgKE9DRlMyX0koaW5vZGUpLT5pcF9keW5fZmVhdHVyZXMgJiBPQ0ZTMl9JTkxJTkVfREFUQV9GTCkgewotCQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sCi0JCQkJICAgICAgICZkaV9iaCk7CisJCXJldCA9IG9jZnMyX3JlYWRfaW5vZGVfYmxvY2soaW5vZGUsICZkaV9iaCk7CiAJCWlmIChyZXQpIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCWdvdG8gb3V0OwpAQCAtMTIyNiw4MyArMTI4NCw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBfX29jZnMyX3JlbW92ZV9pbm9kZV9yYW5nZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgsCi0JCQkJICAgICAgdTMyIGNwb3MsIHUzMiBwaHlzX2Nwb3MsIHUzMiBsZW4sCi0JCQkJICAgICAgc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmRlYWxsb2MpCi17Ci0JaW50IHJldDsKLQl1NjQgcGh5c19ibGtubyA9IG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgcGh5c19jcG9zKTsKLQlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKLQlzdHJ1Y3QgaW5vZGUgKnRsX2lub2RlID0gb3NiLT5vc2JfdGxfaW5vZGU7Ci0JaGFuZGxlX3QgKmhhbmRsZTsKLQlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYyA9IE5VTEw7Ci0Jc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKWRpX2JoLT5iX2RhdGE7Ci0Jc3RydWN0IG9jZnMyX2V4dGVudF90cmVlIGV0OwotCi0Jb2NmczJfaW5pdF9kaW5vZGVfZXh0ZW50X3RyZWUoJmV0LCBpbm9kZSwgZGlfYmgpOwotCi0JcmV0ID0gb2NmczJfbG9ja19hbGxvY2F0b3JzKGlub2RlLCAmZXQsIDAsIDEsIE5VTEwsICZtZXRhX2FjKTsKLQlpZiAocmV0KSB7Ci0JCW1sb2dfZXJybm8ocmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQltdXRleF9sb2NrKCZ0bF9pbm9kZS0+aV9tdXRleCk7Ci0KLQlpZiAob2NmczJfdHJ1bmNhdGVfbG9nX25lZWRzX2ZsdXNoKG9zYikpIHsKLQkJcmV0ID0gX19vY2ZzMl9mbHVzaF90cnVuY2F0ZV9sb2cob3NiKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCW1sb2dfZXJybm8ocmV0KTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCi0JaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9SRU1PVkVfRVhURU5UX0NSRURJVFMpOwotCWlmIChJU19FUlIoaGFuZGxlKSkgewotCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7Ci0JCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZGlfYmgsCi0JCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwotCWlmIChyZXQpIHsKLQkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlyZXQgPSBvY2ZzMl9yZW1vdmVfZXh0ZW50KGlub2RlLCAmZXQsIGNwb3MsIGxlbiwgaGFuZGxlLCBtZXRhX2FjLAotCQkJCSAgZGVhbGxvYyk7Ci0JaWYgKHJldCkgewotCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0X2NvbW1pdDsKLQl9Ci0KLQlPQ0ZTMl9JKGlub2RlKS0+aXBfY2x1c3RlcnMgLT0gbGVuOwotCWRpLT5pX2NsdXN0ZXJzID0gY3B1X3RvX2xlMzIoT0NGUzJfSShpbm9kZSktPmlwX2NsdXN0ZXJzKTsKLQotCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBkaV9iaCk7Ci0JaWYgKHJldCkgewotCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0X2NvbW1pdDsKLQl9Ci0KLQlyZXQgPSBvY2ZzMl90cnVuY2F0ZV9sb2dfYXBwZW5kKG9zYiwgaGFuZGxlLCBwaHlzX2Jsa25vLCBsZW4pOwotCWlmIChyZXQpCi0JCW1sb2dfZXJybm8ocmV0KTsKLQotb3V0X2NvbW1pdDoKLQlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOwotb3V0OgotCW11dGV4X3VubG9jaygmdGxfaW5vZGUtPmlfbXV0ZXgpOwotCi0JaWYgKG1ldGFfYWMpCi0JCW9jZnMyX2ZyZWVfYWxsb2NfY29udGV4dChtZXRhX2FjKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KIC8qCiAgKiBUcnVuY2F0ZSBhIGJ5dGUgcmFuZ2UsIGF2b2lkaW5nIHBhZ2VzIHdpdGhpbiBwYXJ0aWFsIGNsdXN0ZXJzLiBUaGlzCiAgKiBwcmVzZXJ2ZXMgdGhvc2UgcGFnZXMgZm9yIHRoZSB6ZXJvaW5nIGNvZGUgdG8gd3JpdGUgdG8uCkBAIC0xNDAyLDcgKzEzODMsOSBAQAogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOwogCXN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0IGRlYWxsb2M7CiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSBldDsKIAorCW9jZnMyX2luaXRfZGlub2RlX2V4dGVudF90cmVlKCZldCwgaW5vZGUsIGRpX2JoKTsKIAlvY2ZzMl9pbml0X2RlYWxsb2NfY3R4dCgmZGVhbGxvYyk7CiAKIAlpZiAoYnl0ZV9sZW4gPT0gMCkKQEAgLTE0NTgsOSArMTQ0MSw5IEBACiAKIAkJLyogT25seSBkbyB3b3JrIGZvciBub24taG9sZXMgKi8KIAkJaWYgKHBoeXNfY3BvcyAhPSAwKSB7Ci0JCQlyZXQgPSBfX29jZnMyX3JlbW92ZV9pbm9kZV9yYW5nZShpbm9kZSwgZGlfYmgsIGNwb3MsCi0JCQkJCQkJIHBoeXNfY3BvcywgYWxsb2Nfc2l6ZSwKLQkJCQkJCQkgJmRlYWxsb2MpOworCQkJcmV0ID0gb2NmczJfcmVtb3ZlX2J0cmVlX3JhbmdlKGlub2RlLCAmZXQsIGNwb3MsCisJCQkJCQkgICAgICAgcGh5c19jcG9zLCBhbGxvY19zaXplLAorCQkJCQkJICAgICAgICZkZWFsbG9jKTsKIAkJCWlmIChyZXQpIHsKIAkJCQltbG9nX2Vycm5vKHJldCk7CiAJCQkJZ290byBvdXQ7CkBAIC0xNjIyLDcgKzE2MDUsNyBAQAogCQkJICAgIHN0cnVjdCBvY2ZzMl9zcGFjZV9yZXN2ICpzcikKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKLQlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTs7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CiAKIAlpZiAoKGNtZCA9PSBPQ0ZTMl9JT0NfUkVTVlNQIHx8IGNtZCA9PSBPQ0ZTMl9JT0NfUkVTVlNQNjQpICYmCiAJICAgICFvY2ZzMl93cml0ZXNfdW53cml0dGVuX2V4dGVudHMob3NiKSkKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2ZpbGUuaCBiL2ZzL29jZnMyL2ZpbGUuaAppbmRleCBlOTIzODJjLi4xNzJmOWZiIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9maWxlLmgKKysrIGIvZnMvb2NmczIvZmlsZS5oCkBAIC01MSw2ICs1MSw5IEBACiAJCQkgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmRhdGFfYWMsCiAJCQkgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMsCiAJCQkgZW51bSBvY2ZzMl9hbGxvY19yZXN0YXJ0ZWQgKnJlYXNvbl9yZXQpOworaW50IG9jZnMyX3NpbXBsZV9zaXplX3VwZGF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLAorCQkJICAgICB1NjQgbmV3X2lfc2l6ZSk7CiBpbnQgb2NmczJfZXh0ZW5kX25vX2hvbGVzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCBuZXdfaV9zaXplLAogCQkJICB1NjQgemVyb190byk7CiBpbnQgb2NmczJfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqYXR0cik7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9pbm9kZS5jIGIvZnMvb2NmczIvaW5vZGUuYwppbmRleCA3YWEwMGQ1Li4yMjllNzA3IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9pbm9kZS5jCisrKyBiL2ZzL29jZnMyL2lub2RlLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgogCiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogCkBAIC0zNyw2ICszOCw3IEBACiAjaW5jbHVkZSAib2NmczIuaCIKIAogI2luY2x1ZGUgImFsbG9jLmgiCisjaW5jbHVkZSAiYmxvY2tjaGVjay5oIgogI2luY2x1ZGUgImRsbWdsdWUuaCIKICNpbmNsdWRlICJleHRlbnRfbWFwLmgiCiAjaW5jbHVkZSAiZmlsZS5oIgpAQCAtMjE0LDEyICsyMTYsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IG9jZnMyX3BvcHVsYXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBvY2ZzMl9kaW5vZGUgKmZlLAotCQkgICAgIAkgaW50IGNyZWF0ZV9pbm8pCit2b2lkIG9jZnMyX3BvcHVsYXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBvY2ZzMl9kaW5vZGUgKmZlLAorCQkJICBpbnQgY3JlYXRlX2lubykKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOwogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiOwotCWludCBzdGF0dXMgPSAtRUlOVkFMOwogCWludCB1c2VfcGxvY2tzID0gMTsKIAogCW1sb2dfZW50cnkoIigweCVwLCBzaXplOiVsbHUpXG4iLCBpbm9kZSwKQEAgLTIzMiwyNSArMjMzLDE3IEBACiAJICAgIG9jZnMyX21vdW50X2xvY2FsKG9zYikgfHwgIW9jZnMyX3N0YWNrX3N1cHBvcnRzX3Bsb2NrcygpKQogCQl1c2VfcGxvY2tzID0gMDsKIAotCS8qIHRoaXMgbWVhbnMgdGhhdCByZWFkX2lub2RlIGNhbm5vdCBjcmVhdGUgYSBzdXBlcmJsb2NrIGlub2RlCi0JICogdG9kYXkuICBjaGFuZ2UgaWYgbmVlZGVkLiAqLwotCWlmICghT0NGUzJfSVNfVkFMSURfRElOT0RFKGZlKSB8fAotCSAgICAhKGZlLT5pX2ZsYWdzICYgY3B1X3RvX2xlMzIoT0NGUzJfVkFMSURfRkwpKSkgewotCQltbG9nKDAsICJJbnZhbGlkIGRpbm9kZTogaV9pbm89JWx1LCBpX2Jsa25vPSVsbHUsICIKLQkJICAgICAic2lnbmF0dXJlID0gJS4qcywgZmxhZ3MgPSAweCV4XG4iLAotCQkgICAgIGlub2RlLT5pX2lubywKLQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KGZlLT5pX2Jsa25vKSwgNywKLQkJICAgICBmZS0+aV9zaWduYXR1cmUsIGxlMzJfdG9fY3B1KGZlLT5pX2ZsYWdzKSk7Ci0JCWdvdG8gYmFpbDsKLQl9CisJLyoKKwkgKiBUaGVzZSBoYXZlIGFsbCBiZWVuIGNoZWNrZWQgYnkgb2NmczJfcmVhZF9pbm9kZV9ibG9jaygpIG9yIHNldAorCSAqIGJ5IG9jZnMyX21rbm9kX2xvY2tlZCgpLCBzbyBhIGZhaWx1cmUgaXMgYSBjb2RlIGJ1Zy4KKwkgKi8KKwlCVUdfT04oIU9DRlMyX0lTX1ZBTElEX0RJTk9ERShmZSkpOyAgLyogVGhpcyBtZWFucyB0aGF0IHJlYWRfaW5vZGUKKwkJCQkJCWNhbm5vdCBjcmVhdGUgYSBzdXBlcmJsb2NrCisJCQkJCQlpbm9kZSB0b2RheS4gIGNoYW5nZSBpZgorCQkJCQkJdGhhdCBpcyBuZWVkZWQuICovCisJQlVHX09OKCEoZmUtPmlfZmxhZ3MgJiBjcHVfdG9fbGUzMihPQ0ZTMl9WQUxJRF9GTCkpKTsKKwlCVUdfT04obGUzMl90b19jcHUoZmUtPmlfZnNfZ2VuZXJhdGlvbikgIT0gb3NiLT5mc19nZW5lcmF0aW9uKTsKIAotCWlmIChsZTMyX3RvX2NwdShmZS0+aV9mc19nZW5lcmF0aW9uKSAhPSBvc2ItPmZzX2dlbmVyYXRpb24pIHsKLQkJbWxvZyhNTF9FUlJPUiwgImZpbGUgZW50cnkgZ2VuZXJhdGlvbiBkb2VzIG5vdCBtYXRjaCAiCi0JCSAgICAgInN1cGVyYmxvY2shIG9zYi0+ZnNfZ2VuZXJhdGlvbj0leCwgIgotCQkgICAgICJmZS0+aV9mc19nZW5lcmF0aW9uPSV4XG4iLAotCQkgICAgIG9zYi0+ZnNfZ2VuZXJhdGlvbiwgbGUzMl90b19jcHUoZmUtPmlfZnNfZ2VuZXJhdGlvbikpOwotCQlnb3RvIGJhaWw7Ci0JfQogCiAJT0NGUzJfSShpbm9kZSktPmlwX2NsdXN0ZXJzID0gbGUzMl90b19jcHUoZmUtPmlfY2x1c3RlcnMpOwogCU9DRlMyX0koaW5vZGUpLT5pcF9hdHRyID0gbGUzMl90b19jcHUoZmUtPmlfYXR0cik7CkBAIC0yODQsMTQgKzI3NywxOCBAQAogCiAJaW5vZGUtPmlfbmxpbmsgPSBsZTE2X3RvX2NwdShmZS0+aV9saW5rc19jb3VudCk7CiAKLQlpZiAoZmUtPmlfZmxhZ3MgJiBjcHVfdG9fbGUzMihPQ0ZTMl9TWVNURU1fRkwpKQorCWlmIChmZS0+aV9mbGFncyAmIGNwdV90b19sZTMyKE9DRlMyX1NZU1RFTV9GTCkpIHsKIAkJT0NGUzJfSShpbm9kZSktPmlwX2ZsYWdzIHw9IE9DRlMyX0lOT0RFX1NZU1RFTV9GSUxFOworCQlpbm9kZS0+aV9mbGFncyB8PSBTX05PUVVPVEE7CisJfQogCiAJaWYgKGZlLT5pX2ZsYWdzICYgY3B1X3RvX2xlMzIoT0NGUzJfTE9DQUxfQUxMT0NfRkwpKSB7CiAJCU9DRlMyX0koaW5vZGUpLT5pcF9mbGFncyB8PSBPQ0ZTMl9JTk9ERV9CSVRNQVA7CiAJCW1sb2coMCwgImxvY2FsIGFsbG9jIGlub2RlOiBpX2lubz0lbHVcbiIsIGlub2RlLT5pX2lubyk7CiAJfSBlbHNlIGlmIChmZS0+aV9mbGFncyAmIGNwdV90b19sZTMyKE9DRlMyX0JJVE1BUF9GTCkpIHsKIAkJT0NGUzJfSShpbm9kZSktPmlwX2ZsYWdzIHw9IE9DRlMyX0lOT0RFX0JJVE1BUDsKKwl9IGVsc2UgaWYgKGZlLT5pX2ZsYWdzICYgY3B1X3RvX2xlMzIoT0NGUzJfUVVPVEFfRkwpKSB7CisJCWlub2RlLT5pX2ZsYWdzIHw9IFNfTk9RVU9UQTsKIAl9IGVsc2UgaWYgKGZlLT5pX2ZsYWdzICYgY3B1X3RvX2xlMzIoT0NGUzJfU1VQRVJfQkxPQ0tfRkwpKSB7CiAJCW1sb2coMCwgInN1cGVyYmxvY2sgaW5vZGU6IGlfaW5vPSVsdVxuIiwgaW5vZGUtPmlfaW5vKTsKIAkJLyogd2UgY2FuJ3QgYWN0dWFsbHkgaGl0IHRoaXMgYXMgcmVhZF9pbm9kZSBjYW4ndApAQCAtMzU0LDEwICszNTEsNyBAQAogCiAJb2NmczJfc2V0X2lub2RlX2ZsYWdzKGlub2RlKTsKIAotCXN0YXR1cyA9IDA7Ci1iYWlsOgotCW1sb2dfZXhpdChzdGF0dXMpOwotCXJldHVybiBzdGF0dXM7CisJbWxvZ19leGl0X3ZvaWQoKTsKIH0KIAogc3RhdGljIGludCBvY2ZzMl9yZWFkX2xvY2tlZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLApAQCAtNDYwLDExICs0NTQsMTQgQEAKIAkJfQogCX0KIAotCWlmIChjYW5fbG9jaykKLQkJc3RhdHVzID0gb2NmczJfcmVhZF9ibG9ja3MoaW5vZGUsIGFyZ3MtPmZpX2Jsa25vLCAxLCAmYmgsCi0JCQkJCSAgIE9DRlMyX0JIX0lHTk9SRV9DQUNIRSk7Ci0JZWxzZQorCWlmIChjYW5fbG9jaykgeworCQlzdGF0dXMgPSBvY2ZzMl9yZWFkX2lub2RlX2Jsb2NrX2Z1bGwoaW5vZGUsICZiaCwKKwkJCQkJCSAgICAgT0NGUzJfQkhfSUdOT1JFX0NBQ0hFKTsKKwl9IGVsc2UgewogCQlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2Nrc19zeW5jKG9zYiwgYXJncy0+ZmlfYmxrbm8sIDEsICZiaCk7CisJCWlmICghc3RhdHVzKQorCQkJc3RhdHVzID0gb2NmczJfdmFsaWRhdGVfaW5vZGVfYmxvY2sob3NiLT5zYiwgYmgpOworCX0KIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKQEAgLTQ3MiwxMiArNDY5LDYgQEAKIAogCXN0YXR1cyA9IC1FSU5WQUw7CiAJZmUgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKSBiaC0+Yl9kYXRhOwotCWlmICghT0NGUzJfSVNfVkFMSURfRElOT0RFKGZlKSkgewotCQltbG9nKDAsICJJbnZhbGlkIGRpbm9kZSAjJWxsdTogc2lnbmF0dXJlID0gJS4qc1xuIiwKLQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWFyZ3MtPmZpX2Jsa25vLCA3LAotCQkgICAgIGZlLT5pX3NpZ25hdHVyZSk7Ci0JCWdvdG8gYmFpbDsKLQl9CiAKIAkvKgogCSAqIFRoaXMgaXMgYSBjb2RlIGJ1Zy4gUmlnaHQgbm93IHRoZSBjYWxsZXIgbmVlZHMgdG8KQEAgLTQ5MSwxMCArNDgyLDkgQEAKIAogCWlmIChTX0lTQ0hSKGxlMTZfdG9fY3B1KGZlLT5pX21vZGUpKSB8fAogCSAgICBTX0lTQkxLKGxlMTZfdG9fY3B1KGZlLT5pX21vZGUpKSkKLSAgICAJCWlub2RlLT5pX3JkZXYgPSBodWdlX2RlY29kZV9kZXYobGU2NF90b19jcHUoZmUtPmlkMS5kZXYxLmlfcmRldikpOworCQlpbm9kZS0+aV9yZGV2ID0gaHVnZV9kZWNvZGVfZGV2KGxlNjRfdG9fY3B1KGZlLT5pZDEuZGV2MS5pX3JkZXYpKTsKIAotCWlmIChvY2ZzMl9wb3B1bGF0ZV9pbm9kZShpbm9kZSwgZmUsIDApIDwgMCkKLQkJZ290byBiYWlsOworCW9jZnMyX3BvcHVsYXRlX2lub2RlKGlub2RlLCBmZSwgMCk7CiAKIAlCVUdfT04oYXJncy0+ZmlfYmxrbm8gIT0gbGU2NF90b19jcHUoZmUtPmlfYmxrbm8pKTsKIApAQCAtNTQ3LDggKzUzNyw4IEBACiAJCQlnb3RvIG91dDsKIAkJfQogCi0JCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGZlX2JoLAotCQkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RpKGhhbmRsZSwgaW5vZGUsIGZlX2JoLAorCQkJCQkJIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJCWdvdG8gb3V0OwpAQCAtNjE1LDcgKzYwNSw4IEBACiAJCWdvdG8gYmFpbDsKIAl9CiAKLQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX0RFTEVURV9JTk9ERV9DUkVESVRTKTsKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX0RFTEVURV9JTk9ERV9DUkVESVRTICsKKwkJCQkJb2NmczJfcXVvdGFfdHJhbnNfY3JlZGl0cyhpbm9kZS0+aV9zYikpOwogCWlmIChJU19FUlIoaGFuZGxlKSkgewogCQlzdGF0dXMgPSBQVFJfRVJSKGhhbmRsZSk7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKQEAgLTYzMCw4ICs2MjEsOCBAQAogCX0KIAogCS8qIHNldCB0aGUgaW5vZGVzIGR0aW1lICovCi0Jc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZGlfYmgsCi0JCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RpKGhhbmRsZSwgaW5vZGUsIGRpX2JoLAorCQkJCQkgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBiYWlsX2NvbW1pdDsKQEAgLTY0Nyw2ICs2MzgsNyBAQAogCX0KIAogCW9jZnMyX3JlbW92ZV9mcm9tX2NhY2hlKGlub2RlLCBkaV9iaCk7CisJdmZzX2RxX2ZyZWVfaW5vZGUoaW5vZGUpOwogCiAJc3RhdHVzID0gb2NmczJfZnJlZV9kaW5vZGUoaGFuZGxlLCBpbm9kZV9hbGxvY19pbm9kZSwKIAkJCQkgICBpbm9kZV9hbGxvY19iaCwgZGkpOwpAQCAtOTI5LDcgKzkyMSwxMCBAQAogCiAJbWxvZ19lbnRyeSgiKGlub2RlLT5pX2lubyA9ICVsdSlcbiIsIGlub2RlLT5pX2lubyk7CiAKLQlpZiAoaXNfYmFkX2lub2RlKGlub2RlKSkgeworCS8qIFdoZW4gd2UgZmFpbCBpbiByZWFkX2lub2RlKCkgd2UgbWFyayBpbm9kZSBhcyBiYWQuIFRoZSBzZWNvbmQgdGVzdAorCSAqIGNhdGNoZXMgdGhlIGNhc2Ugd2hlbiBpbm9kZSBhbGxvY2F0aW9uIGZhaWxzIGJlZm9yZSBhbGxvY2F0aW5nCisJICogYSBibG9jayBmb3IgaW5vZGUuICovCisJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkgfHwgIU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubykgewogCQltbG9nKDAsICJTa2lwcGluZyBkZWxldGUgb2YgYmFkIGlub2RlXG4iKTsKIAkJZ290byBiYWlsOwogCX0KQEAgLTExOTUsOCArMTE5MCw4IEBACiAJbWxvZ19lbnRyeSgiKGlub2RlICVsbHUpXG4iLAogCQkgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubyk7CiAKLQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBiaCwKLQkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZGkoaGFuZGxlLCBpbm9kZSwgYmgsCisJCQkJCSBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGxlYXZlOwpAQCAtMTI2NCwzICsxMjU5LDg5IEBACiAKIAlzcGluX3VubG9jaygmT0NGUzJfSShpbm9kZSktPmlwX2xvY2spOwogfQorCitpbnQgb2NmczJfdmFsaWRhdGVfaW5vZGVfYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWludCByYzsKKwlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopYmgtPmJfZGF0YTsKKworCW1sb2coMCwgIlZhbGlkYXRpbmcgZGlub2RlICVsbHVcbiIsCisJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIpOworCisJQlVHX09OKCFidWZmZXJfdXB0b2RhdGUoYmgpKTsKKworCS8qCisJICogSWYgdGhlIGVjYyBmYWlscywgd2UgcmV0dXJuIHRoZSBlcnJvciBidXQgb3RoZXJ3aXNlCisJICogbGVhdmUgdGhlIGZpbGVzeXN0ZW0gcnVubmluZy4gIFdlIGtub3cgYW55IGVycm9yIGlzCisJICogbG9jYWwgdG8gdGhpcyBibG9jay4KKwkgKi8KKwlyYyA9IG9jZnMyX3ZhbGlkYXRlX21ldGFfZWNjKHNiLCBiaC0+Yl9kYXRhLCAmZGktPmlfY2hlY2spOworCWlmIChyYykgeworCQltbG9nKE1MX0VSUk9SLCAiQ2hlY2tzdW0gZmFpbGVkIGZvciBkaW5vZGUgJWxsdVxuIiwKKwkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIpOworCQlnb3RvIGJhaWw7CisJfQorCisJLyoKKwkgKiBFcnJvcnMgYWZ0ZXIgaGVyZSBhcmUgZmF0YWwuCisJICovCisKKwlyYyA9IC1FSU5WQUw7CisKKwlpZiAoIU9DRlMyX0lTX1ZBTElEX0RJTk9ERShkaSkpIHsKKwkJb2NmczJfZXJyb3Ioc2IsICJJbnZhbGlkIGRpbm9kZSAjJWxsdTogc2lnbmF0dXJlID0gJS4qc1xuIiwKKwkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIsIDcsCisJCQkgICAgZGktPmlfc2lnbmF0dXJlKTsKKwkJZ290byBiYWlsOworCX0KKworCWlmIChsZTY0X3RvX2NwdShkaS0+aV9ibGtubykgIT0gYmgtPmJfYmxvY2tucikgeworCQlvY2ZzMl9lcnJvcihzYiwgIkludmFsaWQgZGlub2RlICMlbGx1OiBpX2Jsa25vIGlzICVsbHVcbiIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yLAorCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoZGktPmlfYmxrbm8pKTsKKwkJZ290byBiYWlsOworCX0KKworCWlmICghKGRpLT5pX2ZsYWdzICYgY3B1X3RvX2xlMzIoT0NGUzJfVkFMSURfRkwpKSkgeworCQlvY2ZzMl9lcnJvcihzYiwKKwkJCSAgICAiSW52YWxpZCBkaW5vZGUgIyVsbHU6IE9DRlMyX1ZBTElEX0ZMIG5vdCBzZXRcbiIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yKTsKKwkJZ290byBiYWlsOworCX0KKworCWlmIChsZTMyX3RvX2NwdShkaS0+aV9mc19nZW5lcmF0aW9uKSAhPQorCSAgICBPQ0ZTMl9TQihzYiktPmZzX2dlbmVyYXRpb24pIHsKKwkJb2NmczJfZXJyb3Ioc2IsCisJCQkgICAgIkludmFsaWQgZGlub2RlICMlbGx1OiBmc19nZW5lcmF0aW9uIGlzICV1XG4iLAorCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tuciwKKwkJCSAgICBsZTMyX3RvX2NwdShkaS0+aV9mc19nZW5lcmF0aW9uKSk7CisJCWdvdG8gYmFpbDsKKwl9CisKKwlyYyA9IDA7CisKK2JhaWw6CisJcmV0dXJuIHJjOworfQorCitpbnQgb2NmczJfcmVhZF9pbm9kZV9ibG9ja19mdWxsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJoLAorCQkJCWludCBmbGFncykKK3sKKwlpbnQgcmM7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICp0bXAgPSAqYmg7CisKKwlyYyA9IG9jZnMyX3JlYWRfYmxvY2tzKGlub2RlLCBPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sIDEsICZ0bXAsCisJCQkgICAgICAgZmxhZ3MsIG9jZnMyX3ZhbGlkYXRlX2lub2RlX2Jsb2NrKTsKKworCS8qIElmIG9jZnMyX3JlYWRfYmxvY2tzKCkgZ290IHVzIGEgbmV3IGJoLCBwYXNzIGl0IHVwLiAqLworCWlmICghcmMgJiYgISpiaCkKKwkJKmJoID0gdG1wOworCisJcmV0dXJuIHJjOworfQorCitpbnQgb2NmczJfcmVhZF9pbm9kZV9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaCkKK3sKKwlyZXR1cm4gb2NmczJfcmVhZF9pbm9kZV9ibG9ja19mdWxsKGlub2RlLCBiaCwgMCk7Cit9CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9pbm9kZS5oIGIvZnMvb2NmczIvaW5vZGUuaAppbmRleCAyZjM3YWY5Li5lYjNjMzAyIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9pbm9kZS5oCisrKyBiL2ZzL29jZnMyL2lub2RlLmgKQEAgLTEyOCw4ICsxMjgsOCBAQAogCQkJIGludCBzeXNmaWxlX3R5cGUpOwogaW50IG9jZnMyX2lub2RlX2luaXRfcHJpdmF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIGludCBvY2ZzMl9pbm9kZV9yZXZhbGlkYXRlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSk7Ci1pbnQgb2NmczJfcG9wdWxhdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG9jZnMyX2Rpbm9kZSAqZmUsCi0JCQkgaW50IGNyZWF0ZV9pbm8pOwordm9pZCBvY2ZzMl9wb3B1bGF0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qgb2NmczJfZGlub2RlICpmZSwKKwkJCSAgaW50IGNyZWF0ZV9pbm8pOwogdm9pZCBvY2ZzMl9yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogdm9pZCBvY2ZzMl9yZWFkX2lub2RlMihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpvcGFxdWUpOwogc3NpemVfdCBvY2ZzMl9yd19kaXJlY3QoaW50IHJ3LCBzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciAqYnVmLApAQCAtMTQyLDYgKzE0Miw4IEBACiAJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKIGludCBvY2ZzMl9haW9fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGtpb2NiICpyZXEsIHN0cnVjdCBpb2NiICppb2NiKTsKIGludCBvY2ZzMl9haW9fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBraW9jYiAqcmVxLCBzdHJ1Y3QgaW9jYiAqaW9jYik7CitzdHJ1Y3QgYnVmZmVyX2hlYWQgKm9jZnMyX2JyZWFkKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJaW50IGJsb2NrLCBpbnQgKmVyciwgaW50IHJlYWRhKTsKIAogdm9pZCBvY2ZzMl9zZXRfaW5vZGVfZmxhZ3Moc3RydWN0IGlub2RlICppbm9kZSk7CiB2b2lkIG9jZnMyX2dldF9pbm9kZV9mbGFncyhzdHJ1Y3Qgb2NmczJfaW5vZGVfaW5mbyAqb2kpOwpAQCAtMTUzLDQgKzE1NSwxNiBAQAogCXJldHVybiAoYmxrY250X3QpKE9DRlMyX0koaW5vZGUpLT5pcF9jbHVzdGVycyA8PCBjX3RvX3NfYml0cyk7CiB9CiAKKy8qIFZhbGlkYXRlIHRoYXQgYSBiaCBjb250YWlucyBhIHZhbGlkIGlub2RlICovCitpbnQgb2NmczJfdmFsaWRhdGVfaW5vZGVfYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKKy8qCisgKiBSZWFkIGFuIGlub2RlIGJsb2NrIGludG8gKmJoLiAgSWYgKmJoIGlzIE5VTEwsIGEgYmggd2lsbCBiZSBhbGxvY2F0ZWQuCisgKiBUaGlzIGlzIGEgY2FjaGVkIHJlYWQuICBUaGUgaW5vZGUgd2lsbCBiZSB2YWxpZGF0ZWQgd2l0aAorICogb2NmczJfdmFsaWRhdGVfaW5vZGVfYmxvY2soKS4KKyAqLworaW50IG9jZnMyX3JlYWRfaW5vZGVfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmgpOworLyogVGhlIHNhbWUsIGJ1dCBjYW4gYmUgcGFzc2VkIE9DRlMyX0JIXyogZmxhZ3MgKi8KK2ludCBvY2ZzMl9yZWFkX2lub2RlX2Jsb2NrX2Z1bGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmgsCisJCQkJaW50IGZsYWdzKTsKICNlbmRpZiAvKiBPQ0ZTMl9JTk9ERV9IICovCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9qb3VybmFsLmMgYi9mcy9vY2ZzMi9qb3VybmFsLmMKaW5kZXggOTlmZTlkNS4uNTdkN2QyNSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvam91cm5hbC5jCisrKyBiL2ZzL29jZnMyL2pvdXJuYWwuYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgIm9jZnMyLmgiCiAKICNpbmNsdWRlICJhbGxvYy5oIgorI2luY2x1ZGUgImJsb2NrY2hlY2suaCIKICNpbmNsdWRlICJkaXIuaCIKICNpbmNsdWRlICJkbG1nbHVlLmgiCiAjaW5jbHVkZSAiZXh0ZW50X21hcC5oIgpAQCAtNDUsNiArNDYsNyBAQAogI2luY2x1ZGUgInNsb3RfbWFwLmgiCiAjaW5jbHVkZSAic3VwZXIuaCIKICNpbmNsdWRlICJzeXNmaWxlLmgiCisjaW5jbHVkZSAicXVvdGEuaCIKIAogI2luY2x1ZGUgImJ1ZmZlcl9oZWFkX2lvLmgiCiAKQEAgLTUyLDEwICs1NCwxMCBAQAogCiBzdGF0aWMgaW50IG9jZnMyX2ZvcmNlX3JlYWRfam91cm5hbChzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIHN0YXRpYyBpbnQgb2NmczJfcmVjb3Zlcl9ub2RlKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJICAgICAgaW50IG5vZGVfbnVtKTsKKwkJCSAgICAgIGludCBub2RlX251bSwgaW50IHNsb3RfbnVtKTsKIHN0YXRpYyBpbnQgX19vY2ZzMl9yZWNvdmVyeV90aHJlYWQodm9pZCAqYXJnKTsKIHN0YXRpYyBpbnQgb2NmczJfY29tbWl0X2NhY2hlKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiKTsKLXN0YXRpYyBpbnQgb2NmczJfd2FpdF9vbl9tb3VudChzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYik7CitzdGF0aWMgaW50IF9fb2NmczJfd2FpdF9vbl9tb3VudChzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwgaW50IHF1b3RhKTsKIHN0YXRpYyBpbnQgb2NmczJfam91cm5hbF90b2dnbGVfZGlydHkoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCQkJICAgICAgaW50IGRpcnR5LCBpbnQgcmVwbGF5ZWQpOwogc3RhdGljIGludCBvY2ZzMl90cnlsb2NrX2pvdXJuYWwoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCkBAIC02NCw2ICs2NiwxNyBAQAogCQkJCSBpbnQgc2xvdCk7CiBzdGF0aWMgaW50IG9jZnMyX2NvbW1pdF90aHJlYWQodm9pZCAqYXJnKTsKIAorc3RhdGljIGlubGluZSBpbnQgb2NmczJfd2FpdF9vbl9tb3VudChzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYikKK3sKKwlyZXR1cm4gX19vY2ZzMl93YWl0X29uX21vdW50KG9zYiwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG9jZnMyX3dhaXRfb25fcXVvdGFzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiKQoreworCXJldHVybiBfX29jZnMyX3dhaXRfb25fbW91bnQob3NiLCAxKTsKK30KKworCiAKIC8qCiAgKiBUaGUgcmVjb3ZlcnlfbGlzdCBpcyBhIHNpbXBsZSBsaW5rZWQgbGlzdCBvZiBub2RlIG51bWJlcnMgdG8gcmVjb3Zlci4KQEAgLTI1NiwxMSArMjY5LDkgQEAKIAlCVUdfT04ob3NiLT5qb3VybmFsLT5qX3N0YXRlID09IE9DRlMyX0pPVVJOQUxfRlJFRSk7CiAJQlVHX09OKG1heF9idWZmcyA8PSAwKTsKIAotCS8qIEpCRCBtaWdodCBzdXBwb3J0IHRoaXMsIGJ1dCBvdXIgam91cm5hbGxpbmcgY29kZSBkb2Vzbid0IHlldC4gKi8KLQlpZiAoam91cm5hbF9jdXJyZW50X2hhbmRsZSgpKSB7Ci0JCW1sb2coTUxfRVJST1IsICJSZWN1cnNpdmUgdHJhbnNhY3Rpb24gYXR0ZW1wdGVkIVxuIik7Ci0JCUJVRygpOwotCX0KKwkvKiBOZXN0ZWQgdHJhbnNhY3Rpb24/IEp1c3QgcmV0dXJuIHRoZSBoYW5kbGUuLi4gKi8KKwlpZiAoam91cm5hbF9jdXJyZW50X2hhbmRsZSgpKQorCQlyZXR1cm4gamJkMl9qb3VybmFsX3N0YXJ0KGpvdXJuYWwsIG1heF9idWZmcyk7CiAKIAlkb3duX3JlYWQoJm9zYi0+am91cm5hbC0+al90cmFuc19iYXJyaWVyKTsKIApAQCAtMjg1LDE2ICsyOTYsMTggQEAKIGludCBvY2ZzMl9jb21taXRfdHJhbnMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCSAgICAgICBoYW5kbGVfdCAqaGFuZGxlKQogewotCWludCByZXQ7CisJaW50IHJldCwgbmVzdGVkOwogCXN0cnVjdCBvY2ZzMl9qb3VybmFsICpqb3VybmFsID0gb3NiLT5qb3VybmFsOwogCiAJQlVHX09OKCFoYW5kbGUpOwogCisJbmVzdGVkID0gaGFuZGxlLT5oX3JlZiA+IDE7CiAJcmV0ID0gamJkMl9qb3VybmFsX3N0b3AoaGFuZGxlKTsKIAlpZiAocmV0IDwgMCkKIAkJbWxvZ19lcnJubyhyZXQpOwogCi0JdXBfcmVhZCgmam91cm5hbC0+al90cmFuc19iYXJyaWVyKTsKKwlpZiAoIW5lc3RlZCkKKwkJdXBfcmVhZCgmam91cm5hbC0+al90cmFuc19iYXJyaWVyKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0zNTcsMTAgKzM3MCwxMzcgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1pbnQgb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlX3QgKmhhbmRsZSwKLQkJCSBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCi0JCQkgaW50IHR5cGUpCitzdHJ1Y3Qgb2NmczJfdHJpZ2dlcnMgeworCXN0cnVjdCBqYmQyX2J1ZmZlcl90cmlnZ2VyX3R5cGUJb3RfdHJpZ2dlcnM7CisJaW50CQkJCW90X29mZnNldDsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG9jZnMyX3RyaWdnZXJzICp0b19vY2ZzMl90cmlnZ2VyKHN0cnVjdCBqYmQyX2J1ZmZlcl90cmlnZ2VyX3R5cGUgKnRyaWdnZXJzKQoreworCXJldHVybiBjb250YWluZXJfb2YodHJpZ2dlcnMsIHN0cnVjdCBvY2ZzMl90cmlnZ2Vycywgb3RfdHJpZ2dlcnMpOworfQorCitzdGF0aWMgdm9pZCBvY2ZzMl9jb21taXRfdHJpZ2dlcihzdHJ1Y3QgamJkMl9idWZmZXJfdHJpZ2dlcl90eXBlICp0cmlnZ2VycywKKwkJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJCQkgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IG9jZnMyX3RyaWdnZXJzICpvdCA9IHRvX29jZnMyX3RyaWdnZXIodHJpZ2dlcnMpOworCisJLyoKKwkgKiBXZSBhcmVuJ3QgZ3VhcmFudGVlZCB0byBoYXZlIHRoZSBzdXBlcmJsb2NrIGhlcmUsIHNvIHdlCisJICogbXVzdCB1bmNvbmRpdGlvbmFsbHkgY29tcHV0ZSB0aGUgZWNjIGRhdGEuCisJICogX19vY2ZzMl9qb3VybmFsX2FjY2VzcygpIHdpbGwgb25seSBzZXQgdGhlIHRyaWdnZXJzIGlmCisJICogbWV0YWVjYyBpcyBlbmFibGVkLgorCSAqLworCW9jZnMyX2Jsb2NrX2NoZWNrX2NvbXB1dGUoZGF0YSwgc2l6ZSwgZGF0YSArIG90LT5vdF9vZmZzZXQpOworfQorCisvKgorICogUXVvdGEgYmxvY2tzIGhhdmUgdGhlaXIgb3duIHRyaWdnZXIgYmVjYXVzZSB0aGUgc3RydWN0IG9jZnMyX2Jsb2NrX2NoZWNrCisgKiBvZmZzZXQgZGVwZW5kcyBvbiB0aGUgYmxvY2tzaXplLgorICovCitzdGF0aWMgdm9pZCBvY2ZzMl9kcV9jb21taXRfdHJpZ2dlcihzdHJ1Y3QgamJkMl9idWZmZXJfdHJpZ2dlcl90eXBlICp0cmlnZ2VycywKKwkJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJCQkgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IG9jZnMyX2Rpc2tfZHF0cmFpbGVyICpkcXQgPQorCQlvY2ZzMl9ibG9ja19kcXRyYWlsZXIoc2l6ZSwgZGF0YSk7CisKKwkvKgorCSAqIFdlIGFyZW4ndCBndWFyYW50ZWVkIHRvIGhhdmUgdGhlIHN1cGVyYmxvY2sgaGVyZSwgc28gd2UKKwkgKiBtdXN0IHVuY29uZGl0aW9uYWxseSBjb21wdXRlIHRoZSBlY2MgZGF0YS4KKwkgKiBfX29jZnMyX2pvdXJuYWxfYWNjZXNzKCkgd2lsbCBvbmx5IHNldCB0aGUgdHJpZ2dlcnMgaWYKKwkgKiBtZXRhZWNjIGlzIGVuYWJsZWQuCisJICovCisJb2NmczJfYmxvY2tfY2hlY2tfY29tcHV0ZShkYXRhLCBzaXplLCAmZHF0LT5kcV9jaGVjayk7Cit9CisKKy8qCisgKiBEaXJlY3RvcnkgYmxvY2tzIGFsc28gaGF2ZSB0aGVpciBvd24gdHJpZ2dlciBiZWNhdXNlIHRoZQorICogc3RydWN0IG9jZnMyX2Jsb2NrX2NoZWNrIG9mZnNldCBkZXBlbmRzIG9uIHRoZSBibG9ja3NpemUuCisgKi8KK3N0YXRpYyB2b2lkIG9jZnMyX2RiX2NvbW1pdF90cmlnZ2VyKHN0cnVjdCBqYmQyX2J1ZmZlcl90cmlnZ2VyX3R5cGUgKnRyaWdnZXJzLAorCQkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAorCQkJCSB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3Qgb2NmczJfZGlyX2Jsb2NrX3RyYWlsZXIgKnRyYWlsZXIgPQorCQlvY2ZzMl9kaXJfdHJhaWxlcl9mcm9tX3NpemUoc2l6ZSwgZGF0YSk7CisKKwkvKgorCSAqIFdlIGFyZW4ndCBndWFyYW50ZWVkIHRvIGhhdmUgdGhlIHN1cGVyYmxvY2sgaGVyZSwgc28gd2UKKwkgKiBtdXN0IHVuY29uZGl0aW9uYWxseSBjb21wdXRlIHRoZSBlY2MgZGF0YS4KKwkgKiBfX29jZnMyX2pvdXJuYWxfYWNjZXNzKCkgd2lsbCBvbmx5IHNldCB0aGUgdHJpZ2dlcnMgaWYKKwkgKiBtZXRhZWNjIGlzIGVuYWJsZWQuCisJICovCisJb2NmczJfYmxvY2tfY2hlY2tfY29tcHV0ZShkYXRhLCBzaXplLCAmdHJhaWxlci0+ZGJfY2hlY2spOworfQorCitzdGF0aWMgdm9pZCBvY2ZzMl9hYm9ydF90cmlnZ2VyKHN0cnVjdCBqYmQyX2J1ZmZlcl90cmlnZ2VyX3R5cGUgKnRyaWdnZXJzLAorCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJbWxvZyhNTF9FUlJPUiwKKwkgICAgICJvY2ZzMl9hYm9ydF90cmlnZ2VyIGNhbGxlZCBieSBKQkQyLiAgYmggPSAweCVseCwgIgorCSAgICAgImJoLT5iX2Jsb2NrbnIgPSAlbGx1XG4iLAorCSAgICAgKHVuc2lnbmVkIGxvbmcpYmgsCisJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIpOworCisJLyogV2UgYXJlbid0IGd1YXJhbnRlZWQgdG8gaGF2ZSB0aGUgc3VwZXJibG9jayBoZXJlIC0gYnV0IGlmIHdlCisJICogZG9uJ3QsIGl0J2xsIGp1c3QgY3Jhc2guICovCisJb2NmczJfZXJyb3IoYmgtPmJfYXNzb2NfbWFwLT5ob3N0LT5pX3NiLAorCQkgICAgIkpCRDIgaGFzIGFib3J0ZWQgb3VyIGpvdXJuYWwsIG9jZnMyIGNhbm5vdCBjb250aW51ZVxuIik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2NmczJfdHJpZ2dlcnMgZGlfdHJpZ2dlcnMgPSB7CisJLm90X3RyaWdnZXJzID0geworCQkudF9jb21taXQgPSBvY2ZzMl9jb21taXRfdHJpZ2dlciwKKwkJLnRfYWJvcnQgPSBvY2ZzMl9hYm9ydF90cmlnZ2VyLAorCX0sCisJLm90X29mZnNldAk9IG9mZnNldG9mKHN0cnVjdCBvY2ZzMl9kaW5vZGUsIGlfY2hlY2spLAorfTsKKworc3RhdGljIHN0cnVjdCBvY2ZzMl90cmlnZ2VycyBlYl90cmlnZ2VycyA9IHsKKwkub3RfdHJpZ2dlcnMgPSB7CisJCS50X2NvbW1pdCA9IG9jZnMyX2NvbW1pdF90cmlnZ2VyLAorCQkudF9hYm9ydCA9IG9jZnMyX2Fib3J0X3RyaWdnZXIsCisJfSwKKwkub3Rfb2Zmc2V0CT0gb2Zmc2V0b2Yoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jaywgaF9jaGVjayksCit9OworCitzdGF0aWMgc3RydWN0IG9jZnMyX3RyaWdnZXJzIGdkX3RyaWdnZXJzID0geworCS5vdF90cmlnZ2VycyA9IHsKKwkJLnRfY29tbWl0ID0gb2NmczJfY29tbWl0X3RyaWdnZXIsCisJCS50X2Fib3J0ID0gb2NmczJfYWJvcnRfdHJpZ2dlciwKKwl9LAorCS5vdF9vZmZzZXQJPSBvZmZzZXRvZihzdHJ1Y3Qgb2NmczJfZ3JvdXBfZGVzYywgYmdfY2hlY2spLAorfTsKKworc3RhdGljIHN0cnVjdCBvY2ZzMl90cmlnZ2VycyBkYl90cmlnZ2VycyA9IHsKKwkub3RfdHJpZ2dlcnMgPSB7CisJCS50X2NvbW1pdCA9IG9jZnMyX2RiX2NvbW1pdF90cmlnZ2VyLAorCQkudF9hYm9ydCA9IG9jZnMyX2Fib3J0X3RyaWdnZXIsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb2NmczJfdHJpZ2dlcnMgeGJfdHJpZ2dlcnMgPSB7CisJLm90X3RyaWdnZXJzID0geworCQkudF9jb21taXQgPSBvY2ZzMl9jb21taXRfdHJpZ2dlciwKKwkJLnRfYWJvcnQgPSBvY2ZzMl9hYm9ydF90cmlnZ2VyLAorCX0sCisJLm90X29mZnNldAk9IG9mZnNldG9mKHN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jaywgeGJfY2hlY2spLAorfTsKKworc3RhdGljIHN0cnVjdCBvY2ZzMl90cmlnZ2VycyBkcV90cmlnZ2VycyA9IHsKKwkub3RfdHJpZ2dlcnMgPSB7CisJCS50X2NvbW1pdCA9IG9jZnMyX2RxX2NvbW1pdF90cmlnZ2VyLAorCQkudF9hYm9ydCA9IG9jZnMyX2Fib3J0X3RyaWdnZXIsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19vY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGVfdCAqaGFuZGxlLAorCQkJCSAgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCisJCQkJICBzdHJ1Y3Qgb2NmczJfdHJpZ2dlcnMgKnRyaWdnZXJzLAorCQkJCSAgaW50IHR5cGUpCiB7CiAJaW50IHN0YXR1czsKIApAQCAtNDA2LDYgKzU0Niw4IEBACiAJCXN0YXR1cyA9IC1FSU5WQUw7CiAJCW1sb2coTUxfRVJST1IsICJVa25vd24gYWNjZXNzIHR5cGUhXG4iKTsKIAl9CisJaWYgKCFzdGF0dXMgJiYgb2NmczJfbWV0YV9lY2MoT0NGUzJfU0IoaW5vZGUtPmlfc2IpKSAmJiB0cmlnZ2VycykKKwkJamJkMl9qb3VybmFsX3NldF90cmlnZ2VycyhiaCwgJnRyaWdnZXJzLT5vdF90cmlnZ2Vycyk7CiAJbXV0ZXhfdW5sb2NrKCZPQ0ZTMl9JKGlub2RlKS0+aXBfaW9fbXV0ZXgpOwogCiAJaWYgKHN0YXR1cyA8IDApCkBAIC00MTYsNiArNTU4LDU0IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAoraW50IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RpKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHR5cGUpCit7CisJcmV0dXJuIF9fb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgYmgsICZkaV90cmlnZ2VycywKKwkJCQkgICAgICB0eXBlKTsKK30KKworaW50IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2ViKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHR5cGUpCit7CisJcmV0dXJuIF9fb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgYmgsICZlYl90cmlnZ2VycywKKwkJCQkgICAgICB0eXBlKTsKK30KKworaW50IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2dkKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHR5cGUpCit7CisJcmV0dXJuIF9fb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgYmgsICZnZF90cmlnZ2VycywKKwkJCQkgICAgICB0eXBlKTsKK30KKworaW50IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RiKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHR5cGUpCit7CisJcmV0dXJuIF9fb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgYmgsICZkYl90cmlnZ2VycywKKwkJCQkgICAgICB0eXBlKTsKK30KKworaW50IG9jZnMyX2pvdXJuYWxfYWNjZXNzX3hiKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHR5cGUpCit7CisJcmV0dXJuIF9fb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgYmgsICZ4Yl90cmlnZ2VycywKKwkJCQkgICAgICB0eXBlKTsKK30KKworaW50IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RxKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHR5cGUpCit7CisJcmV0dXJuIF9fb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgYmgsICZkcV90cmlnZ2VycywKKwkJCQkgICAgICB0eXBlKTsKK30KKworaW50IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHR5cGUpCit7CisJcmV0dXJuIF9fb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgYmgsIE5VTEwsIHR5cGUpOworfQorCiBpbnQgb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGVfdCAqaGFuZGxlLAogCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKQEAgLTQzNCwyMCArNjI0LDYgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi0jaWZkZWYgQ09ORklHX09DRlMyX0NPTVBBVF9KQkQKLWludCBvY2ZzMl9qb3VybmFsX2RpcnR5X2RhdGEoaGFuZGxlX3QgKmhhbmRsZSwKLQkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKLXsKLQlpbnQgZXJyID0gam91cm5hbF9kaXJ0eV9kYXRhKGhhbmRsZSwgYmgpOwotCWlmIChlcnIpCi0JCW1sb2dfZXJybm8oZXJyKTsKLQkvKiBUT0RPOiBXaGVuIHdlIGNhbiBoYW5kbGUgaXQsIGFib3J0IHRoZSBoYW5kbGUgYW5kIGdvIFJPIG9uCi0JICogZXJyb3IgaGVyZS4gKi8KLQotCXJldHVybiBlcnI7Ci19Ci0jZW5kaWYKLQogI2RlZmluZSBPQ0ZTMl9ERUZBVUxUX0NPTU1JVF9JTlRFUlZBTAkoSFogKiBKQkQyX0RFRkFVTFRfTUFYX0NPTU1JVF9BR0UpCiAKIHZvaWQgb2NmczJfc2V0X2pvdXJuYWxfcGFyYW1zKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiKQpAQCAtNTg3LDE3ICs3NjMsMTEgQEAKIAltbG9nX2VudHJ5X3ZvaWQoKTsKIAogCWZlID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKiliaC0+Yl9kYXRhOwotCWlmICghT0NGUzJfSVNfVkFMSURfRElOT0RFKGZlKSkgewotCQkvKiBUaGlzIGlzIGNhbGxlZCBmcm9tIHN0YXJ0dXAvc2h1dGRvd24gd2hpY2ggd2lsbAotCQkgKiBoYW5kbGUgdGhlIGVycm9ycyBpbiBhIHNwZWNpZmljIG1hbm5lciwgc28gbm8gbmVlZAotCQkgKiB0byBjYWxsIG9jZnMyX2Vycm9yKCkgaGVyZS4gKi8KLQkJbWxvZyhNTF9FUlJPUiwgIkpvdXJuYWwgZGlub2RlICVsbHUgIGhhcyBpbnZhbGlkICIKLQkJICAgICAic2lnbmF0dXJlOiAlLipzIiwKLQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KGZlLT5pX2Jsa25vKSwgNywKLQkJICAgICBmZS0+aV9zaWduYXR1cmUpOwotCQlzdGF0dXMgPSAtRUlPOwotCQlnb3RvIG91dDsKLQl9CisKKwkvKiBUaGUgam91cm5hbCBiaCBvbiB0aGUgb3NiIGFsd2F5cyBjb21lcyBmcm9tIG9jZnMyX2pvdXJuYWxfaW5pdCgpCisJICogYW5kIHdhcyB2YWxpZGF0ZWQgdGhlcmUgaW5zaWRlIG9jZnMyX2lub2RlX2xvY2tfZnVsbCgpLiAgSXQncyBhCisJICogY29kZSBidWcgaWYgd2UgbWVzcyBpdCB1cC4gKi8KKwlCVUdfT04oIU9DRlMyX0lTX1ZBTElEX0RJTk9ERShmZSkpOwogCiAJZmxhZ3MgPSBsZTMyX3RvX2NwdShmZS0+aWQxLmpvdXJuYWwxLmlqX2ZsYWdzKTsKIAlpZiAoZGlydHkpCkBAIC02MDksMTEgKzc3OSwxMSBAQAogCWlmIChyZXBsYXllZCkKIAkJb2NmczJfYnVtcF9yZWNvdmVyeV9nZW5lcmF0aW9uKGZlKTsKIAorCW9jZnMyX2NvbXB1dGVfbWV0YV9lY2Mob3NiLT5zYiwgYmgtPmJfZGF0YSwgJmZlLT5pX2NoZWNrKTsKIAlzdGF0dXMgPSBvY2ZzMl93cml0ZV9ibG9jayhvc2IsIGJoLCBqb3VybmFsLT5qX2lub2RlKTsKIAlpZiAoc3RhdHVzIDwgMCkKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCi1vdXQ6CiAJbWxvZ19leGl0KHN0YXR1cyk7CiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTg3OCw2ICsxMDQ4LDcgQEAKIAlpbnQJCQlscmlfc2xvdDsKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlCSpscmlfbGFfZGlub2RlOwogCXN0cnVjdCBvY2ZzMl9kaW5vZGUJKmxyaV90bF9kaW5vZGU7CisJc3RydWN0IG9jZnMyX3F1b3RhX3JlY292ZXJ5ICpscmlfcXJlYzsKIH07CiAKIC8qIERvZXMgdGhlIHNlY29uZCBoYWxmIG9mIHRoZSByZWNvdmVyeSBwcm9jZXNzLiBCeSB0aGlzIHBvaW50LCB0aGUKQEAgLTg5OCw2ICsxMDY5LDcgQEAKIAlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IGpvdXJuYWwtPmpfb3NiOwogCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmxhX2Rpbm9kZSwgKnRsX2Rpbm9kZTsKIAlzdHJ1Y3Qgb2NmczJfbGFfcmVjb3ZlcnlfaXRlbSAqaXRlbSwgKm47CisJc3RydWN0IG9jZnMyX3F1b3RhX3JlY292ZXJ5ICpxcmVjOwogCUxJU1RfSEVBRCh0bXBfbGFfbGlzdCk7CiAKIAltbG9nX2VudHJ5X3ZvaWQoKTsKQEAgLTkxMyw2ICsxMDg1LDggQEAKIAogCQltbG9nKDAsICJDb21wbGV0ZSByZWNvdmVyeSBmb3Igc2xvdCAlZFxuIiwgaXRlbS0+bHJpX3Nsb3QpOwogCisJCW9jZnMyX3dhaXRfb25fcXVvdGFzKG9zYik7CisKIAkJbGFfZGlub2RlID0gaXRlbS0+bHJpX2xhX2Rpbm9kZTsKIAkJaWYgKGxhX2Rpbm9kZSkgewogCQkJbWxvZygwLCAiQ2xlYW4gdXAgbG9jYWwgYWxsb2MgJWxsdVxuIiwKQEAgLTk0Myw2ICsxMTE3LDE2IEBACiAJCWlmIChyZXQgPCAwKQogCQkJbWxvZ19lcnJubyhyZXQpOwogCisJCXFyZWMgPSBpdGVtLT5scmlfcXJlYzsKKwkJaWYgKHFyZWMpIHsKKwkJCW1sb2coMCwgIlJlY292ZXJpbmcgcXVvdGEgZmlsZXMiKTsKKwkJCXJldCA9IG9jZnMyX2ZpbmlzaF9xdW90YV9yZWNvdmVyeShvc2IsIHFyZWMsCisJCQkJCQkJICBpdGVtLT5scmlfc2xvdCk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQltbG9nX2Vycm5vKHJldCk7CisJCQkvKiBSZWNvdmVyeSBpbmZvIGlzIGFscmVhZHkgZnJlZWQgbm93ICovCisJCX0KKwogCQlrZnJlZShpdGVtKTsKIAl9CiAKQEAgLTk1Niw3ICsxMTQwLDggQEAKIHN0YXRpYyB2b2lkIG9jZnMyX3F1ZXVlX3JlY292ZXJ5X2NvbXBsZXRpb24oc3RydWN0IG9jZnMyX2pvdXJuYWwgKmpvdXJuYWwsCiAJCQkJCSAgICBpbnQgc2xvdF9udW0sCiAJCQkJCSAgICBzdHJ1Y3Qgb2NmczJfZGlub2RlICpsYV9kaW5vZGUsCi0JCQkJCSAgICBzdHJ1Y3Qgb2NmczJfZGlub2RlICp0bF9kaW5vZGUpCisJCQkJCSAgICBzdHJ1Y3Qgb2NmczJfZGlub2RlICp0bF9kaW5vZGUsCisJCQkJCSAgICBzdHJ1Y3Qgb2NmczJfcXVvdGFfcmVjb3ZlcnkgKnFyZWMpCiB7CiAJc3RydWN0IG9jZnMyX2xhX3JlY292ZXJ5X2l0ZW0gKml0ZW07CiAKQEAgLTk3MSw2ICsxMTU2LDkgQEAKIAkJaWYgKHRsX2Rpbm9kZSkKIAkJCWtmcmVlKHRsX2Rpbm9kZSk7CiAKKwkJaWYgKHFyZWMpCisJCQlvY2ZzMl9mcmVlX3F1b3RhX3JlY292ZXJ5KHFyZWMpOworCiAJCW1sb2dfZXJybm8oLUVOT01FTSk7CiAJCXJldHVybjsKIAl9CkBAIC05NzksNiArMTE2Nyw3IEBACiAJaXRlbS0+bHJpX2xhX2Rpbm9kZSA9IGxhX2Rpbm9kZTsKIAlpdGVtLT5scmlfc2xvdCA9IHNsb3RfbnVtOwogCWl0ZW0tPmxyaV90bF9kaW5vZGUgPSB0bF9kaW5vZGU7CisJaXRlbS0+bHJpX3FyZWMgPSBxcmVjOwogCiAJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2xvY2spOwogCWxpc3RfYWRkX3RhaWwoJml0ZW0tPmxyaV9saXN0LCAmam91cm5hbC0+al9sYV9jbGVhbnVwcyk7CkBAIC05OTgsNiArMTE4Nyw3IEBACiAJCW9jZnMyX3F1ZXVlX3JlY292ZXJ5X2NvbXBsZXRpb24oam91cm5hbCwKIAkJCQkJCW9zYi0+c2xvdF9udW0sCiAJCQkJCQlvc2ItPmxvY2FsX2FsbG9jX2NvcHksCisJCQkJCQlOVUxMLAogCQkJCQkJTlVMTCk7CiAJCW9jZnMyX3NjaGVkdWxlX3RydW5jYXRlX2xvZ19mbHVzaChvc2IsIDApOwogCkBAIC0xMDA2LDExICsxMTk2LDI2IEBACiAJfQogfQogCit2b2lkIG9jZnMyX2NvbXBsZXRlX3F1b3RhX3JlY292ZXJ5KHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiKQoreworCWlmIChvc2ItPnF1b3RhX3JlYykgeworCQlvY2ZzMl9xdWV1ZV9yZWNvdmVyeV9jb21wbGV0aW9uKG9zYi0+am91cm5hbCwKKwkJCQkJCW9zYi0+c2xvdF9udW0sCisJCQkJCQlOVUxMLAorCQkJCQkJTlVMTCwKKwkJCQkJCW9zYi0+cXVvdGFfcmVjKTsKKwkJb3NiLT5xdW90YV9yZWMgPSBOVUxMOworCX0KK30KKwogc3RhdGljIGludCBfX29jZnMyX3JlY292ZXJ5X3RocmVhZCh2b2lkICphcmcpCiB7Ci0JaW50IHN0YXR1cywgbm9kZV9udW07CisJaW50IHN0YXR1cywgbm9kZV9udW0sIHNsb3RfbnVtOwogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gYXJnOwogCXN0cnVjdCBvY2ZzMl9yZWNvdmVyeV9tYXAgKnJtID0gb3NiLT5yZWNvdmVyeV9tYXA7CisJaW50ICpybV9xdW90YSA9IE5VTEw7CisJaW50IHJtX3F1b3RhX3VzZWQgPSAwLCBpOworCXN0cnVjdCBvY2ZzMl9xdW90YV9yZWNvdmVyeSAqcXJlYzsKIAogCW1sb2dfZW50cnlfdm9pZCgpOwogCkBAIC0xMDE5LDYgKzEyMjQsMTEgQEAKIAkJZ290byBiYWlsOwogCX0KIAorCXJtX3F1b3RhID0ga3phbGxvYyhvc2ItPm1heF9zbG90cyAqIHNpemVvZihpbnQpLCBHRlBfTk9GUyk7CisJaWYgKCFybV9xdW90YSkgeworCQlzdGF0dXMgPSAtRU5PTUVNOworCQlnb3RvIGJhaWw7CisJfQogcmVzdGFydDoKIAlzdGF0dXMgPSBvY2ZzMl9zdXBlcl9sb2NrKG9zYiwgMSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKQEAgLTEwMzIsOCArMTI0MiwyOCBAQAogCQkgKiBjbGVhciBpdCB1bnRpbCBvY2ZzMl9yZWNvdmVyX25vZGUoKSBoYXMgc3VjY2VlZGVkLiAqLwogCQlub2RlX251bSA9IHJtLT5ybV9lbnRyaWVzWzBdOwogCQlzcGluX3VubG9jaygmb3NiLT5vc2JfbG9jayk7CisJCW1sb2coMCwgImNoZWNraW5nIG5vZGUgJWRcbiIsIG5vZGVfbnVtKTsKKwkJc2xvdF9udW0gPSBvY2ZzMl9ub2RlX251bV90b19zbG90KG9zYiwgbm9kZV9udW0pOworCQlpZiAoc2xvdF9udW0gPT0gLUVOT0VOVCkgeworCQkJc3RhdHVzID0gMDsKKwkJCW1sb2coMCwgIm5vIHNsb3QgZm9yIHRoaXMgbm9kZSwgc28gbm8gcmVjb3ZlcnkiCisJCQkgICAgICJyZXF1aXJlZC5cbiIpOworCQkJZ290byBza2lwX3JlY292ZXJ5OworCQl9CisJCW1sb2coMCwgIm5vZGUgJWQgd2FzIHVzaW5nIHNsb3QgJWRcbiIsIG5vZGVfbnVtLCBzbG90X251bSk7CiAKLQkJc3RhdHVzID0gb2NmczJfcmVjb3Zlcl9ub2RlKG9zYiwgbm9kZV9udW0pOworCQkvKiBJdCBpcyBhIGJpdCBzdWJ0bGUgd2l0aCBxdW90YSByZWNvdmVyeS4gV2UgY2Fubm90IGRvIGl0CisJCSAqIGltbWVkaWF0ZWx5IGJlY2F1c2Ugd2UgaGF2ZSB0byBvYnRhaW4gY2x1c3RlciBsb2NrcyBmcm9tCisJCSAqIHF1b3RhIGZpbGVzIGFuZCB3ZSBhbHNvIGRvbid0IHdhbnQgdG8ganVzdCBza2lwIGl0IGJlY2F1c2UKKwkJICogdGhlbiBxdW90YSB1c2FnZSB3b3VsZCBiZSBvdXQgb2Ygc3luYyB1bnRpbCBzb21lIG5vZGUgdGFrZXMKKwkJICogdGhlIHNsb3QuIFNvIHdlIHJlbWVtYmVyIHdoaWNoIG5vZGVzIG5lZWQgcXVvdGEgcmVjb3ZlcnkKKwkJICogYW5kIHdoZW4gZXZlcnl0aGluZyBlbHNlIGlzIGRvbmUsIHdlIHJlY292ZXIgcXVvdGFzLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgcm1fcXVvdGFfdXNlZCAmJiBybV9xdW90YVtpXSAhPSBzbG90X251bTsgaSsrKTsKKwkJaWYgKGkgPT0gcm1fcXVvdGFfdXNlZCkKKwkJCXJtX3F1b3RhW3JtX3F1b3RhX3VzZWQrK10gPSBzbG90X251bTsKKworCQlzdGF0dXMgPSBvY2ZzMl9yZWNvdmVyX25vZGUob3NiLCBub2RlX251bSwgc2xvdF9udW0pOworc2tpcF9yZWNvdmVyeToKIAkJaWYgKCFzdGF0dXMpIHsKIAkJCW9jZnMyX3JlY292ZXJ5X21hcF9jbGVhcihvc2IsIG5vZGVfbnVtKTsKIAkJfSBlbHNlIHsKQEAgLTEwNTUsMTMgKzEyODUsMjcgQEAKIAlpZiAoc3RhdHVzIDwgMCkKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCisJLyogTm93IGl0IGlzIHJpZ2h0IHRpbWUgdG8gcmVjb3ZlciBxdW90YXMuLi4gV2UgaGF2ZSB0byBkbyB0aGlzIHVuZGVyCisJICogc3VwZXJibG9jayBsb2NrIHNvIHRoYXQgbm9vbmUgY2FuIHN0YXJ0IHVzaW5nIHRoZSBzbG90IChhbmQgY3Jhc2gpCisJICogYmVmb3JlIHdlIHJlY292ZXIgaXQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcm1fcXVvdGFfdXNlZDsgaSsrKSB7CisJCXFyZWMgPSBvY2ZzMl9iZWdpbl9xdW90YV9yZWNvdmVyeShvc2IsIHJtX3F1b3RhW2ldKTsKKwkJaWYgKElTX0VSUihxcmVjKSkgeworCQkJc3RhdHVzID0gUFRSX0VSUihxcmVjKTsKKwkJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCW9jZnMyX3F1ZXVlX3JlY292ZXJ5X2NvbXBsZXRpb24ob3NiLT5qb3VybmFsLCBybV9xdW90YVtpXSwKKwkJCQkJCU5VTEwsIE5VTEwsIHFyZWMpOworCX0KKwogCW9jZnMyX3N1cGVyX3VubG9jayhvc2IsIDEpOwogCiAJLyogV2UgYWx3YXlzIHJ1biByZWNvdmVyeSBvbiBvdXIgb3duIG9ycGhhbiBkaXIgLSB0aGUgZGVhZAogCSAqIG5vZGUocykgbWF5IGhhdmUgZGlzYWxsb3dkIGEgcHJldmlvcyBpbm9kZSBkZWxldGUuIFJlLXByb2Nlc3NpbmcKIAkgKiBpcyB0aGVyZWZvcmUgcmVxdWlyZWQuICovCiAJb2NmczJfcXVldWVfcmVjb3ZlcnlfY29tcGxldGlvbihvc2ItPmpvdXJuYWwsIG9zYi0+c2xvdF9udW0sIE5VTEwsCi0JCQkJCU5VTEwpOworCQkJCQlOVUxMLCBOVUxMKTsKIAogYmFpbDoKIAltdXRleF9sb2NrKCZvc2ItPnJlY292ZXJ5X2xvY2spOwpAQCAtMTA3Niw2ICsxMzIwLDkgQEAKIAogCW11dGV4X3VubG9jaygmb3NiLT5yZWNvdmVyeV9sb2NrKTsKIAorCWlmIChybV9xdW90YSkKKwkJa2ZyZWUocm1fcXVvdGEpOworCiAJbWxvZ19leGl0KHN0YXR1cyk7CiAJLyogbm8gb25lIGlzIGNhbGxpbnQga3RocmVhZF9zdG9wKCkgZm9yIHVzIHNvIHRoZSBrdGhyZWFkKCkgYXBpCiAJICogcmVxdWlyZXMgdGhhdCB3ZSBjYWxsIGRvX2V4aXQoKS4gIEFuZCBpdCBpc24ndCBleHBvcnRlZCwgYnV0CkBAIC0xMTM1LDggKzEzODIsNyBAQAogCX0KIAlTRVRfSU5PREVfSk9VUk5BTChpbm9kZSk7CiAKLQlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2Nrcyhpbm9kZSwgT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLCAxLCBiaCwKLQkJCQkgICBPQ0ZTMl9CSF9JR05PUkVfQ0FDSEUpOworCXN0YXR1cyA9IG9jZnMyX3JlYWRfaW5vZGVfYmxvY2tfZnVsbChpbm9kZSwgYmgsIE9DRlMyX0JIX0lHTk9SRV9DQUNIRSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGJhaWw7CkBAIC0xMjY4LDYgKzE1MTQsNyBAQAogCW9zYi0+c2xvdF9yZWNvdmVyeV9nZW5lcmF0aW9uc1tzbG90X251bV0gPQogCQkJCQlvY2ZzMl9nZXRfcmVjb3ZlcnlfZ2VuZXJhdGlvbihmZSk7CiAKKwlvY2ZzMl9jb21wdXRlX21ldGFfZWNjKG9zYi0+c2IsIGJoLT5iX2RhdGEsICZmZS0+aV9jaGVjayk7CiAJc3RhdHVzID0gb2NmczJfd3JpdGVfYmxvY2sob3NiLCBiaCwgaW5vZGUpOwogCWlmIChzdGF0dXMgPCAwKQogCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC0xMzA0LDMxICsxNTUxLDE5IEBACiAgKiBmYXIgbGVzcyBjb25jZXJuaW5nLgogICovCiBzdGF0aWMgaW50IG9jZnMyX3JlY292ZXJfbm9kZShzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCSAgICAgIGludCBub2RlX251bSkKKwkJCSAgICAgIGludCBub2RlX251bSwgaW50IHNsb3RfbnVtKQogewogCWludCBzdGF0dXMgPSAwOwotCWludCBzbG90X251bTsKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpsYV9jb3B5ID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICp0bF9jb3B5ID0gTlVMTDsKIAotCW1sb2dfZW50cnkoIihub2RlX251bT0lZCwgb3NiLT5ub2RlX251bSA9ICVkKVxuIiwKLQkJICAgbm9kZV9udW0sIG9zYi0+bm9kZV9udW0pOwotCi0JbWxvZygwLCAiY2hlY2tpbmcgbm9kZSAlZFxuIiwgbm9kZV9udW0pOworCW1sb2dfZW50cnkoIihub2RlX251bT0lZCwgc2xvdF9udW09JWQsIG9zYi0+bm9kZV9udW0gPSAlZClcbiIsCisJCSAgIG5vZGVfbnVtLCBzbG90X251bSwgb3NiLT5ub2RlX251bSk7CiAKIAkvKiBTaG91bGQgbm90IGV2ZXIgYmUgY2FsbGVkIHRvIHJlY292ZXIgb3Vyc2VsdmVzIC0tIGluIHRoYXQKIAkgKiBjYXNlIHdlIHNob3VsZCd2ZSBjYWxsZWQgb2NmczJfam91cm5hbF9sb2FkIGluc3RlYWQuICovCiAJQlVHX09OKG9zYi0+bm9kZV9udW0gPT0gbm9kZV9udW0pOwogCi0Jc2xvdF9udW0gPSBvY2ZzMl9ub2RlX251bV90b19zbG90KG9zYiwgbm9kZV9udW0pOwotCWlmIChzbG90X251bSA9PSAtRU5PRU5UKSB7Ci0JCXN0YXR1cyA9IDA7Ci0JCW1sb2coMCwgIm5vIHNsb3QgZm9yIHRoaXMgbm9kZSwgc28gbm8gcmVjb3ZlcnkgcmVxdWlyZWQuXG4iKTsKLQkJZ290byBkb25lOwotCX0KLQotCW1sb2coMCwgIm5vZGUgJWQgd2FzIHVzaW5nIHNsb3QgJWRcbiIsIG5vZGVfbnVtLCBzbG90X251bSk7Ci0KIAlzdGF0dXMgPSBvY2ZzMl9yZXBsYXlfam91cm5hbChvc2IsIG5vZGVfbnVtLCBzbG90X251bSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJaWYgKHN0YXR1cyA9PSAtRUJVU1kpIHsKQEAgLTEzNjQsNyArMTU5OSw3IEBACiAKIAkvKiBUaGlzIHdpbGwga2ZyZWUgdGhlIG1lbW9yeSBwb2ludGVkIHRvIGJ5IGxhX2NvcHkgYW5kIHRsX2NvcHkgKi8KIAlvY2ZzMl9xdWV1ZV9yZWNvdmVyeV9jb21wbGV0aW9uKG9zYi0+am91cm5hbCwgc2xvdF9udW0sIGxhX2NvcHksCi0JCQkJCXRsX2NvcHkpOworCQkJCQl0bF9jb3B5LCBOVUxMKTsKIAogCXN0YXR1cyA9IDA7CiBkb25lOgpAQCAtMTY1OSwxMyArMTg5NCwxNCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgb2NmczJfd2FpdF9vbl9tb3VudChzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYikKK3N0YXRpYyBpbnQgX19vY2ZzMl93YWl0X29uX21vdW50KHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLCBpbnQgcXVvdGEpCiB7CiAJLyogVGhpcyBjaGVjayBpcyBnb29kIGJlY2F1c2Ugb2NmczIgd2lsbCB3YWl0IG9uIG91ciByZWNvdmVyeQogCSAqIHRocmVhZCBiZWZvcmUgY2hhbmdpbmcgaXQgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gTU9VTlRFRAogCSAqIG9yIERJU0FCTEVELiAqLwogCXdhaXRfZXZlbnQob3NiLT5vc2JfbW91bnRfZXZlbnQsCi0JCSAgIGF0b21pY19yZWFkKCZvc2ItPnZvbF9zdGF0ZSkgPT0gVk9MVU1FX01PVU5URUQgfHwKKwkJICAoIXF1b3RhICYmIGF0b21pY19yZWFkKCZvc2ItPnZvbF9zdGF0ZSkgPT0gVk9MVU1FX01PVU5URUQpIHx8CisJCSAgIGF0b21pY19yZWFkKCZvc2ItPnZvbF9zdGF0ZSkgPT0gVk9MVU1FX01PVU5URURfUVVPVEFTIHx8CiAJCSAgIGF0b21pY19yZWFkKCZvc2ItPnZvbF9zdGF0ZSkgPT0gVk9MVU1FX0RJU0FCTEVEKTsKIAogCS8qIElmIHRoZXJlJ3MgYW4gZXJyb3Igb24gbW91bnQsIHRoZW4gd2UgbWF5IG5ldmVyIGdldCB0byB0aGUKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2pvdXJuYWwuaCBiL2ZzL29jZnMyL2pvdXJuYWwuaAppbmRleCBkNGQxNGU5Li4zYzM1MzJlIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9qb3VybmFsLmgKKysrIGIvZnMvb2NmczIvam91cm5hbC5oCkBAIC0yNywxMiArMjcsNyBAQAogI2RlZmluZSBPQ0ZTMl9KT1VSTkFMX0gKIAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaWZuZGVmIENPTkZJR19PQ0ZTMl9DT01QQVRfSkJECi0jIGluY2x1ZGUgPGxpbnV4L2piZDIuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPGxpbnV4L2piZC5oPgotIyBpbmNsdWRlICJvY2ZzMl9qYmRfY29tcGF0LmgiCi0jZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9qYmQyLmg+CiAKIGVudW0gb2NmczJfam91cm5hbF9zdGF0ZSB7CiAJT0NGUzJfSk9VUk5BTF9GUkVFID0gMCwKQEAgLTE3Myw2ICsxNjgsNyBAQAogCQkJICAgICBpbnQgbm9kZV9udW0pOwogaW50ICAgIG9jZnMyX21hcmtfZGVhZF9ub2RlcyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYik7CiB2b2lkICAgb2NmczJfY29tcGxldGVfbW91bnRfcmVjb3Zlcnkoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpOwordm9pZCBvY2ZzMl9jb21wbGV0ZV9xdW90YV9yZWNvdmVyeShzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYik7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBvY2ZzMl9zdGFydF9jaGVja3BvaW50KHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiKQogewpAQCAtMjE2LDkgKzIxMiwxMiBAQAogICogIG9jZnMyX2V4dGVuZF90cmFucyAgICAgLSBFeHRlbmQgYSBoYW5kbGUgYnkgbmJsb2NrcyBjcmVkaXRzLiBUaGlzIG1heQogICogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1pdCB0aGUgaGFuZGxlIHRvIGRpc2sgaW4gdGhlIHByb2Nlc3MsIGJ1dCB3aWxsCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IHJlbGVhc2UgYW55IGxvY2tzIHRha2VuIGR1cmluZyB0aGUgdHJhbnNhY3Rpb24uCi0gKiAgb2NmczJfam91cm5hbF9hY2Nlc3MgICAtIE5vdGlmeSB0aGUgaGFuZGxlIHRoYXQgd2Ugd2FudCB0byBqb3VybmFsIHRoaXMKKyAqICBvY2ZzMl9qb3VybmFsX2FjY2VzcyogLSBOb3RpZnkgdGhlIGhhbmRsZSB0aGF0IHdlIHdhbnQgdG8gam91cm5hbCB0aGlzCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLiBXaWxsIGhhdmUgdG8gY2FsbCBvY2ZzMl9qb3VybmFsX2RpcnR5IG9uY2UKICAqICAgICAgICAgICAgICAgICAgICAgICAgICB3ZSd2ZSBhY3R1YWxseSBkaXJ0aWVkIGl0LiBUeXBlIGlzIG9uZSBvZiAuIG9yIC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBBbHdheXMgY2FsbCB0aGUgc3BlY2lmaWMgZmxhdm9yIG9mCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb2NmczJfam91cm5hbF9hY2Nlc3NfKigpIHVubGVzcyB5b3UgaW50ZW5kIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlIHRoZSBjaGVja3N1bSBieSBoYW5kLgogICogIG9jZnMyX2pvdXJuYWxfZGlydHkgICAgLSBNYXJrIGEgam91cm5hbGxlZCBidWZmZXIgYXMgaGF2aW5nIGRpcnR5IGRhdGEuCiAgKiAgb2NmczJfamJkMl9maWxlX2lub2RlICAtIE1hcmsgYW4gaW5vZGUgc28gdGhhdCBpdHMgZGF0YSBnb2VzIG91dCBiZWZvcmUKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgaGFuZGxlIGNvbW1pdHMuCkBAIC0yNDgsMTAgKzI0NywyOSBAQAogI2RlZmluZSBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSAgMQogI2RlZmluZSBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19VTkRPICAgMgogCi1pbnQgICAgICAgICAgICAgICAgICBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGVfdCAqaGFuZGxlLAotCQkJCQkgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKLQkJCQkJICBpbnQgdHlwZSk7CisKKy8qIG9jZnMyX2lub2RlICovCitpbnQgb2NmczJfam91cm5hbF9hY2Nlc3NfZGkoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgdHlwZSk7CisvKiBvY2ZzMl9leHRlbnRfYmxvY2sgKi8KK2ludCBvY2ZzMl9qb3VybmFsX2FjY2Vzc19lYihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCB0eXBlKTsKKy8qIG9jZnMyX2dyb3VwX2Rlc2MgKi8KK2ludCBvY2ZzMl9qb3VybmFsX2FjY2Vzc19nZChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCB0eXBlKTsKKy8qIG9jZnMyX3hhdHRyX2Jsb2NrICovCitpbnQgb2NmczJfam91cm5hbF9hY2Nlc3NfeGIoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgdHlwZSk7CisvKiBxdW90YSBibG9ja3MgKi8KK2ludCBvY2ZzMl9qb3VybmFsX2FjY2Vzc19kcShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCB0eXBlKTsKKy8qIGRpcmJsb2NrICovCitpbnQgb2NmczJfam91cm5hbF9hY2Nlc3NfZGIoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgdHlwZSk7CisvKiBBbnl0aGluZyB0aGF0IGhhcyBubyBlY2MgKi8KK2ludCBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCB0eXBlKTsKKwogLyoKICAqIEEgd29yZCBhYm91dCB0aGUgam91cm5hbF9hY2Nlc3Mvam91cm5hbF9kaXJ0eSAiZGFuY2UiLiBJdCBpcwogICogZW50aXJlbHkgbGVnYWwgdG8gam91cm5hbF9hY2Nlc3MgYSBidWZmZXIgbW9yZSB0aGFuIG9uY2UgKGFzIGxvbmcKQEAgLTI3MywxMCArMjkxLDYgQEAKICAqLwogaW50ICAgICAgICAgICAgICAgICAgb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGVfdCAqaGFuZGxlLAogCQkJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7Ci0jaWZkZWYgQ09ORklHX09DRlMyX0NPTVBBVF9KQkQKLWludCAgICAgICAgICAgICAgICAgIG9jZnMyX2pvdXJuYWxfZGlydHlfZGF0YShoYW5kbGVfdCAqaGFuZGxlLAotCQkJCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKLSNlbmRpZgogCiAvKgogICogIENyZWRpdCBNYWNyb3M6CkBAIC0yOTMsNiArMzA3LDM3IEBACiAvKiBleHRlbmRlZCBhdHRyaWJ1dGUgYmxvY2sgdXBkYXRlICovCiAjZGVmaW5lIE9DRlMyX1hBVFRSX0JMT0NLX1VQREFURV9DUkVESVRTIDEKIAorLyogZ2xvYmFsIHF1b3RhZmlsZSBpbm9kZSB1cGRhdGUsIGRhdGEgYmxvY2sgKi8KKyNkZWZpbmUgT0NGUzJfUUlORk9fV1JJVEVfQ1JFRElUUyAoT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFMgKyAxKQorCisvKgorICogVGhlIHR3byB3cml0ZXMgYmVsb3cgY2FuIGFjY2lkZW50YWxseSBzZWUgZ2xvYmFsIGluZm8gZGlydHkgZHVlCisgKiB0byBzZXRfaW5mbygpIHF1b3RhY3RsIHNvIG1ha2UgdGhlbSBwcmVwYXJlZCBmb3IgdGhlIHdyaXRlcy4KKyAqLworLyogcXVvdGEgZGF0YSBibG9jaywgZ2xvYmFsIGluZm8gKi8KKy8qIFdyaXRlIHRvIGxvY2FsIHF1b3RhIGZpbGUgKi8KKyNkZWZpbmUgT0NGUzJfUVdSSVRFX0NSRURJVFMgKE9DRlMyX1FJTkZPX1dSSVRFX0NSRURJVFMgKyAxKQorCisvKiBnbG9iYWwgcXVvdGEgZGF0YSBibG9jaywgbG9jYWwgcXVvdGEgZGF0YSBibG9jaywgZ2xvYmFsIHF1b3RhIGlub2RlLAorICogZ2xvYmFsIHF1b3RhIGluZm8gKi8KKyNkZWZpbmUgT0NGUzJfUVNZTkNfQ1JFRElUUyAoT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFMgKyAzKQorCitzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9xdW90YV90cmFuc19jcmVkaXRzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJaW50IGNyZWRpdHMgPSAwOworCisJaWYgKE9DRlMyX0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwgT0NGUzJfRkVBVFVSRV9ST19DT01QQVRfVVNSUVVPVEEpKQorCQljcmVkaXRzICs9IE9DRlMyX1FXUklURV9DUkVESVRTOworCWlmIChPQ0ZTMl9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsIE9DRlMyX0ZFQVRVUkVfUk9fQ09NUEFUX0dSUFFVT1RBKSkKKwkJY3JlZGl0cyArPSBPQ0ZTMl9RV1JJVEVfQ1JFRElUUzsKKwlyZXR1cm4gY3JlZGl0czsKK30KKworLyogTnVtYmVyIG9mIGNyZWRpdHMgbmVlZGVkIGZvciByZW1vdmluZyBxdW90YSBzdHJ1Y3R1cmUgZnJvbSBmaWxlICovCitpbnQgb2NmczJfY2FsY19xZGVsX2NyZWRpdHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpOworLyogTnVtYmVyIG9mIGNyZWRpdHMgbmVlZGVkIGZvciBpbml0aWFsaXphdGlvbiBvZiBuZXcgcXVvdGEgc3RydWN0dXJlICovCitpbnQgb2NmczJfY2FsY19xaW5pdF9jcmVkaXRzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKTsKKwogLyogZ3JvdXAgZXh0ZW5kLiBpbm9kZSB1cGRhdGUgYW5kIGxhc3QgZ3JvdXAgdXBkYXRlLiAqLwogI2RlZmluZSBPQ0ZTMl9HUk9VUF9FWFRFTkRfQ1JFRElUUwkoT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFMgKyAxKQogCkBAIC0zMDMsOCArMzQ4LDExIEBACiAgKiBwcmV2LiBncm91cCBkZXNjLiBpZiB3ZSByZWxpbmsuICovCiAjZGVmaW5lIE9DRlMyX1NVQkFMTE9DX0FMTE9DICgzKQogCi0jZGVmaW5lIE9DRlMyX0lOTElORV9UT19FWFRFTlRTX0NSRURJVFMgKE9DRlMyX1NVQkFMTE9DX0FMTE9DCQlcCi0JCQkJCSArIE9DRlMyX0lOT0RFX1VQREFURV9DUkVESVRTKQorc3RhdGljIGlubGluZSBpbnQgb2NmczJfaW5saW5lX3RvX2V4dGVudHNfY3JlZGl0cyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXJldHVybiBPQ0ZTMl9TVUJBTExPQ19BTExPQyArIE9DRlMyX0lOT0RFX1VQREFURV9DUkVESVRTICsKKwkgICAgICAgb2NmczJfcXVvdGFfdHJhbnNfY3JlZGl0cyhzYik7Cit9CiAKIC8qIGRpbm9kZSArIGdyb3VwIGRlc2NyaXB0b3IgdXBkYXRlLiBXZSBkb24ndCByZWxpbmsgb24gZnJlZSB5ZXQuICovCiAjZGVmaW5lIE9DRlMyX1NVQkFMTE9DX0ZSRUUgICgyKQpAQCAtMzEzLDE2ICszNjEsMjMgQEAKICNkZWZpbmUgT0NGUzJfVFJVTkNBVEVfTE9HX0ZMVVNIX09ORV9SRUMgKE9DRlMyX1NVQkFMTE9DX0ZSRUUgCQkgICAgICBcCiAJCQkJCSArIE9DRlMyX1RSVU5DQVRFX0xPR19VUERBVEUpCiAKLSNkZWZpbmUgT0NGUzJfUkVNT1ZFX0VYVEVOVF9DUkVESVRTIChPQ0ZTMl9UUlVOQ0FURV9MT0dfVVBEQVRFICsgT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFMpCitzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9yZW1vdmVfZXh0ZW50X2NyZWRpdHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlyZXR1cm4gT0NGUzJfVFJVTkNBVEVfTE9HX1VQREFURSArIE9DRlMyX0lOT0RFX1VQREFURV9DUkVESVRTICsKKwkgICAgICAgb2NmczJfcXVvdGFfdHJhbnNfY3JlZGl0cyhzYik7Cit9CiAKIC8qIGRhdGEgYmxvY2sgZm9yIG5ldyBkaXIvc3ltbGluaywgMiBmb3IgYml0bWFwIHVwZGF0ZXMgKGJpdG1hcCBmZSArCiAgKiBiaXRtYXAgYmxvY2sgZm9yIHRoZSBuZXcgYml0KSAqLwogI2RlZmluZSBPQ0ZTMl9ESVJfTElOS19BRERJVElPTkFMX0NSRURJVFMgKDEgKyAyKQogCiAvKiBwYXJlbnQgZmUsIHBhcmVudCBibG9jaywgbmV3IGZpbGUgZW50cnksIGlub2RlIGFsbG9jIGZlLCBpbm9kZSBhbGxvYwotICogZ3JvdXAgZGVzY3JpcHRvciArIG1rZGlyL3N5bWxpbmsgYmxvY2tzICovCi0jZGVmaW5lIE9DRlMyX01LTk9EX0NSRURJVFMgKDMgKyBPQ0ZTMl9TVUJBTExPQ19BTExPQyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkgICAgKyBPQ0ZTMl9ESVJfTElOS19BRERJVElPTkFMX0NSRURJVFMpCisgKiBncm91cCBkZXNjcmlwdG9yICsgbWtkaXIvc3ltbGluayBibG9ja3MgKyBxdW90YSB1cGRhdGUgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG9jZnMyX21rbm9kX2NyZWRpdHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlyZXR1cm4gMyArIE9DRlMyX1NVQkFMTE9DX0FMTE9DICsgT0NGUzJfRElSX0xJTktfQURESVRJT05BTF9DUkVESVRTICsKKwkgICAgICAgb2NmczJfcXVvdGFfdHJhbnNfY3JlZGl0cyhzYik7Cit9CiAKIC8qIGxvY2FsIGFsbG9jIG1ldGFkYXRhIGNoYW5nZSArIG1haW4gYml0bWFwIHVwZGF0ZXMgKi8KICNkZWZpbmUgT0NGUzJfV0lORE9XX01PVkVfQ1JFRElUUyAoT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFMgICAgICAgICAgICAgICAgIFwKQEAgLTMzMiwxMyArMzg3LDIxIEBACiAgKiBmb3IgdGhlIGRpbm9kZSwgb25lIGZvciB0aGUgbmV3IGJsb2NrLiAqLwogI2RlZmluZSBPQ0ZTMl9TSU1QTEVfRElSX0VYVEVORF9DUkVESVRTICgyKQogCi0vKiBmaWxlIHVwZGF0ZSAobmxpbmssIGV0YykgKyBkaXJlY3RvcnkgbXRpbWUvY3RpbWUgKyBkaXIgZW50cnkgYmxvY2sgKi8KLSNkZWZpbmUgT0NGUzJfTElOS19DUkVESVRTICAoMipPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUyArIDEpCisvKiBmaWxlIHVwZGF0ZSAobmxpbmssIGV0YykgKyBkaXJlY3RvcnkgbXRpbWUvY3RpbWUgKyBkaXIgZW50cnkgYmxvY2sgKyBxdW90YQorICogdXBkYXRlIG9uIGRpciAqLworc3RhdGljIGlubGluZSBpbnQgb2NmczJfbGlua19jcmVkaXRzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJcmV0dXJuIDIqT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFMgKyAxICsKKwkgICAgICAgb2NmczJfcXVvdGFfdHJhbnNfY3JlZGl0cyhzYik7Cit9CiAKIC8qIGlub2RlICsgZGlyIGlub2RlIChpZiB3ZSB1bmxpbmsgYSBkaXIpLCArIGRpciBlbnRyeSBibG9jayArIG9ycGhhbgogICogZGlyIGlub2RlIGxpbmsgKi8KLSNkZWZpbmUgT0NGUzJfVU5MSU5LX0NSRURJVFMgICgyICogT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFMgKyAxICAgICAgICAgICAgIFwKLQkJCSAgICAgICsgT0NGUzJfTElOS19DUkVESVRTKQorc3RhdGljIGlubGluZSBpbnQgb2NmczJfdW5saW5rX2NyZWRpdHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwkvKiBUaGUgcXVvdGEgdXBkYXRlIGZyb20gb2NmczJfbGlua19jcmVkaXRzIGlzIHVudXNlZCBoZXJlLi4uICovCisJcmV0dXJuIDIgKiBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUyArIDEgKyBvY2ZzMl9saW5rX2NyZWRpdHMoc2IpOworfQogCiAvKiBkaW5vZGUgKyBvcnBoYW4gZGlyIGRpbm9kZSArIGlub2RlIGFsbG9jIGRpbm9kZSArIG9ycGhhbiBkaXIgZW50cnkgKwogICogaW5vZGUgYWxsb2MgZ3JvdXAgZGVzY3JpcHRvciAqLwpAQCAtMzQ3LDggKzQxMCwxMCBAQAogLyogZGlub2RlIHVwZGF0ZSwgb2xkIGRpciBkaW5vZGUgdXBkYXRlLCBuZXcgZGlyIGRpbm9kZSB1cGRhdGUsIG9sZAogICogZGlyIGRpciBlbnRyeSwgbmV3IGRpciBkaXIgZW50cnksIGRpciBlbnRyeSB1cGRhdGUgZm9yIHJlbmFtaW5nCiAgKiBkaXJlY3RvcnkgKyB0YXJnZXQgdW5saW5rICovCi0jZGVmaW5lIE9DRlMyX1JFTkFNRV9DUkVESVRTICgzICogT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFMgKyAzICAgICAgICAgICAgICBcCi0JCQkgICAgICsgT0NGUzJfVU5MSU5LX0NSRURJVFMpCitzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9yZW5hbWVfY3JlZGl0cyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXJldHVybiAzICogT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFMgKyAzICsgb2NmczJfdW5saW5rX2NyZWRpdHMoc2IpOworfQogCiAvKiBnbG9iYWwgYml0bWFwIGRpbm9kZSwgZ3JvdXAgZGVzYy4sIHJlbGlua2VkIGdyb3VwLAogICogc3ViYWxsb2NhdG9yIGRpbm9kZSwgZ3JvdXAgZGVzYy4sIHJlbGlua2VkIGdyb3VwLApAQCAtMzg2LDE4ICs0NTEsMTkgQEAKIAkgKiBjcmVkaXQgZm9yIHRoZSBkaW5vZGUgdGhlcmUuICovCiAJZXh0ZW50X2Jsb2NrcyA9IDEgKyAxICsgbGUxNl90b19jcHUocm9vdF9lbC0+bF90cmVlX2RlcHRoKTsKIAotCXJldHVybiBiaXRtYXBfYmxvY2tzICsgc3lzZmlsZV9iaXRtYXBfYmxvY2tzICsgZXh0ZW50X2Jsb2NrczsKKwlyZXR1cm4gYml0bWFwX2Jsb2NrcyArIHN5c2ZpbGVfYml0bWFwX2Jsb2NrcyArIGV4dGVudF9ibG9ja3MgKworCSAgICAgICBvY2ZzMl9xdW90YV90cmFuc19jcmVkaXRzKHNiKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgb2NmczJfY2FsY19zeW1saW5rX2NyZWRpdHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKLQlpbnQgYmxvY2tzID0gT0NGUzJfTUtOT0RfQ1JFRElUUzsKKwlpbnQgYmxvY2tzID0gb2NmczJfbWtub2RfY3JlZGl0cyhzYik7CiAKIAkvKiBsaW5rcyBjYW4gYmUgbG9uZ2VyIHRoYW4gb25lIGJsb2NrIHNvIHdlIG1heSB1cGRhdGUgbWFueQogCSAqIHdpdGhpbiBvdXIgc2luZ2xlIGFsbG9jYXRlZCBleHRlbnQuICovCiAJYmxvY2tzICs9IG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2NrcyhzYiwgMSk7CiAKLQlyZXR1cm4gYmxvY2tzOworCXJldHVybiBibG9ja3MgKyBvY2ZzMl9xdW90YV90cmFuc19jcmVkaXRzKHNiKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgb2NmczJfY2FsY19ncm91cF9hbGxvY19jcmVkaXRzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCkBAIC00MzQsNiArNTAwLDggQEAKIAkvKiB1cGRhdGUgdG8gdGhlIHRydW5jYXRlIGxvZy4gKi8KIAljcmVkaXRzICs9IE9DRlMyX1RSVU5DQVRFX0xPR19VUERBVEU7CiAKKwljcmVkaXRzICs9IG9jZnMyX3F1b3RhX3RyYW5zX2NyZWRpdHMoc2IpOworCiAJcmV0dXJuIGNyZWRpdHM7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2xvY2FsYWxsb2MuYyBiL2ZzL29jZnMyL2xvY2FsYWxsb2MuYwppbmRleCA2ODdiMjg3Li5lYzcwY2RiIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9sb2NhbGFsbG9jLmMKKysrIGIvZnMvb2NmczIvbG9jYWxhbGxvYy5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSAib2NmczIuaCIKIAogI2luY2x1ZGUgImFsbG9jLmgiCisjaW5jbHVkZSAiYmxvY2tjaGVjay5oIgogI2luY2x1ZGUgImRsbWdsdWUuaCIKICNpbmNsdWRlICJpbm9kZS5oIgogI2luY2x1ZGUgImpvdXJuYWwuaCIKQEAgLTI0OCw4ICsyNDksOCBAQAogCQlnb3RvIGJhaWw7CiAJfQogCi0Jc3RhdHVzID0gb2NmczJfcmVhZF9ibG9ja3MoaW5vZGUsIE9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywgMSwKLQkJCQkgICAmYWxsb2NfYmgsIE9DRlMyX0JIX0lHTk9SRV9DQUNIRSk7CisJc3RhdHVzID0gb2NmczJfcmVhZF9pbm9kZV9ibG9ja19mdWxsKGlub2RlLCAmYWxsb2NfYmgsCisJCQkJCSAgICAgT0NGUzJfQkhfSUdOT1JFX0NBQ0hFKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKQEAgLTM4Miw4ICszODMsOCBAQAogCX0KIAltZW1jcHkoYWxsb2NfY29weSwgYWxsb2MsIGJoLT5iX3NpemUpOwogCi0Jc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBsb2NhbF9hbGxvY19pbm9kZSwgYmgsCi0JCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RpKGhhbmRsZSwgbG9jYWxfYWxsb2NfaW5vZGUsIGJoLAorCQkJCQkgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBvdXRfY29tbWl0OwpAQCAtNDU5LDggKzQ2MCw4IEBACiAKIAltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAKLQlzdGF0dXMgPSBvY2ZzMl9yZWFkX2Jsb2Nrcyhpbm9kZSwgT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLCAxLAotCQkJCSAgICZhbGxvY19iaCwgT0NGUzJfQkhfSUdOT1JFX0NBQ0hFKTsKKwlzdGF0dXMgPSBvY2ZzMl9yZWFkX2lub2RlX2Jsb2NrX2Z1bGwoaW5vZGUsICZhbGxvY19iaCwKKwkJCQkJICAgICBPQ0ZTMl9CSF9JR05PUkVfQ0FDSEUpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBiYWlsOwpAQCAtNDc2LDYgKzQ3Nyw3IEBACiAJYWxsb2MgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKSBhbGxvY19iaC0+Yl9kYXRhOwogCW9jZnMyX2NsZWFyX2xvY2FsX2FsbG9jKGFsbG9jKTsKIAorCW9jZnMyX2NvbXB1dGVfbWV0YV9lY2Mob3NiLT5zYiwgYWxsb2NfYmgtPmJfZGF0YSwgJmFsbG9jLT5pX2NoZWNrKTsKIAlzdGF0dXMgPSBvY2ZzMl93cml0ZV9ibG9jayhvc2IsIGFsbG9jX2JoLCBpbm9kZSk7CiAJaWYgKHN0YXR1cyA8IDApCiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKQEAgLTc2Miw5ICs3NjQsOSBAQAogCSAqIGRlbGV0ZSBiaXRzIGZyb20gaXQhICovCiAJKm51bV9iaXRzID0gYml0c193YW50ZWQ7CiAKLQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGxvY2FsX2FsbG9jX2lub2RlLAotCQkJCSAgICAgIG9zYi0+bG9jYWxfYWxsb2NfYmgsCi0JCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RpKGhhbmRsZSwgbG9jYWxfYWxsb2NfaW5vZGUsCisJCQkJCSBvc2ItPmxvY2FsX2FsbG9jX2JoLAorCQkJCQkgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBiYWlsOwpAQCAtMTI0MCw5ICsxMjQyLDkgQEAKIAl9CiAJbWVtY3B5KGFsbG9jX2NvcHksIGFsbG9jLCBvc2ItPmxvY2FsX2FsbG9jX2JoLT5iX3NpemUpOwogCi0Jc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBsb2NhbF9hbGxvY19pbm9kZSwKLQkJCQkgICAgICBvc2ItPmxvY2FsX2FsbG9jX2JoLAotCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19kaShoYW5kbGUsIGxvY2FsX2FsbG9jX2lub2RlLAorCQkJCQkgb3NiLT5sb2NhbF9hbGxvY19iaCwKKwkJCQkJIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL25hbWVpLmMgYi9mcy9vY2ZzMi9uYW1laS5jCmluZGV4IDI1NDVlNzQuLjA4NGFiYTggMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL25hbWVpLmMKKysrIGIvZnMvb2NmczIvbmFtZWkuYwpAQCAtNDAsNiArNDAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgogCiAjZGVmaW5lIE1MT0dfTUFTS19QUkVGSVggTUxfTkFNRUkKICNpbmNsdWRlIDxjbHVzdGVyL21hc2tsb2cuaD4KQEAgLTYxLDE3ICs2MiwxOCBAQAogI2luY2x1ZGUgInN5c2ZpbGUuaCIKICNpbmNsdWRlICJ1cHRvZGF0ZS5oIgogI2luY2x1ZGUgInhhdHRyLmgiCisjaW5jbHVkZSAiYWNsLmgiCiAKICNpbmNsdWRlICJidWZmZXJfaGVhZF9pby5oIgogCiBzdGF0aWMgaW50IG9jZnMyX21rbm9kX2xvY2tlZChzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKIAkJCSAgICAgIHN0cnVjdCBpbm9kZSAqZGlyLAotCQkJICAgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwKKwkJCSAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCiAJCQkgICAgICBkZXZfdCBkZXYsCiAJCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipuZXdfZmVfYmgsCiAJCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBhcmVudF9mZV9iaCwKIAkJCSAgICAgIGhhbmRsZV90ICpoYW5kbGUsCi0JCQkgICAgICBzdHJ1Y3QgaW5vZGUgKipyZXRfaW5vZGUsCiAJCQkgICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqaW5vZGVfYWMpOwogCiBzdGF0aWMgaW50IG9jZnMyX3ByZXBhcmVfb3JwaGFuX2RpcihzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKQEAgLTE4Niw2ICsxODgsMzUgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgc3RydWN0IGlub2RlICpvY2ZzMl9nZXRfaW5pdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmRpciwgaW50IG1vZGUpCit7CisJc3RydWN0IGlub2RlICppbm9kZTsKKworCWlub2RlID0gbmV3X2lub2RlKGRpci0+aV9zYik7CisJaWYgKCFpbm9kZSkgeworCQltbG9nKE1MX0VSUk9SLCAibmV3X2lub2RlIGZhaWxlZCFcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBwb3B1bGF0ZSBhcyBtYW55IGZpZWxkcyBlYXJseSBvbiBhcyBwb3NzaWJsZSAtIG1hbnkgb2YKKwkgKiB0aGVzZSBhcmUgdXNlZCBieSB0aGUgc3VwcG9ydCBmdW5jdGlvbnMgaGVyZSBhbmQgaW4KKwkgKiBjYWxsZXJzLiAqLworCWlmIChTX0lTRElSKG1vZGUpKQorCQlpbm9kZS0+aV9ubGluayA9IDI7CisJZWxzZQorCQlpbm9kZS0+aV9ubGluayA9IDE7CisJaW5vZGUtPmlfdWlkID0gY3VycmVudF9mc3VpZCgpOworCWlmIChkaXItPmlfbW9kZSAmIFNfSVNHSUQpIHsKKwkJaW5vZGUtPmlfZ2lkID0gZGlyLT5pX2dpZDsKKwkJaWYgKFNfSVNESVIobW9kZSkpCisJCQltb2RlIHw9IFNfSVNHSUQ7CisJfSBlbHNlCisJCWlub2RlLT5pX2dpZCA9IGN1cnJlbnRfZnNnaWQoKTsKKwlpbm9kZS0+aV9tb2RlID0gbW9kZTsKKwl2ZnNfZHFfaW5pdChpbm9kZSk7CisJcmV0dXJuIGlub2RlOworfQorCiBzdGF0aWMgaW50IG9jZnMyX21rbm9kKHN0cnVjdCBpbm9kZSAqZGlyLAogCQkgICAgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkgICAgICAgaW50IG1vZGUsCkBAIC0yMDEsNiArMjMyLDEzIEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CiAJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmlub2RlX2FjID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqZGF0YV9hYyA9IE5VTEw7CisJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKnhhdHRyX2FjID0gTlVMTDsKKwlpbnQgd2FudF9jbHVzdGVycyA9IDA7CisJaW50IHhhdHRyX2NyZWRpdHMgPSAwOworCXN0cnVjdCBvY2ZzMl9zZWN1cml0eV94YXR0cl9pbmZvIHNpID0geworCQkuZW5hYmxlID0gMSwKKwl9OworCWludCBkaWRfcXVvdGFfaW5vZGUgPSAwOwogCiAJbWxvZ19lbnRyeSgiKDB4JXAsIDB4JXAsICVkLCAlbHUsICclLipzJylcbiIsIGRpciwgZGVudHJ5LCBtb2RlLAogCQkgICAodW5zaWduZWQgbG9uZylkZXYsIGRlbnRyeS0+ZF9uYW1lLmxlbiwKQEAgLTI1MCwxNyArMjg4LDQ2IEBACiAJCWdvdG8gbGVhdmU7CiAJfQogCi0JLyogUmVzZXJ2ZSBhIGNsdXN0ZXIgaWYgY3JlYXRpbmcgYW4gZXh0ZW50IGJhc2VkIGRpcmVjdG9yeS4gKi8KLQlpZiAoU19JU0RJUihtb2RlKSAmJiAhb2NmczJfc3VwcG9ydHNfaW5saW5lX2RhdGEob3NiKSkgewotCQlzdGF0dXMgPSBvY2ZzMl9yZXNlcnZlX2NsdXN0ZXJzKG9zYiwgMSwgJmRhdGFfYWMpOwotCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJaWYgKHN0YXR1cyAhPSAtRU5PU1BDKQotCQkJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwlpbm9kZSA9IG9jZnMyX2dldF9pbml0X2lub2RlKGRpciwgbW9kZSk7CisJaWYgKCFpbm9kZSkgeworCQlzdGF0dXMgPSAtRU5PTUVNOworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gbGVhdmU7CisJfQorCisJLyogZ2V0IHNlY3VyaXR5IHhhdHRyICovCisJc3RhdHVzID0gb2NmczJfaW5pdF9zZWN1cml0eV9nZXQoaW5vZGUsIGRpciwgJnNpKTsKKwlpZiAoc3RhdHVzKSB7CisJCWlmIChzdGF0dXMgPT0gLUVPUE5PVFNVUFApCisJCQlzaS5lbmFibGUgPSAwOworCQllbHNlIHsKKwkJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJCWdvdG8gbGVhdmU7CiAJCX0KIAl9CiAKLQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX01LTk9EX0NSRURJVFMpOworCS8qIGNhbGN1bGF0ZSBtZXRhIGRhdGEvY2x1c3RlcnMgZm9yIHNldHRpbmcgc2VjdXJpdHkgYW5kIGFjbCB4YXR0ciAqLworCXN0YXR1cyA9IG9jZnMyX2NhbGNfeGF0dHJfaW5pdChkaXIsIHBhcmVudF9mZV9iaCwgbW9kZSwKKwkJCQkJJnNpLCAmd2FudF9jbHVzdGVycywKKwkJCQkJJnhhdHRyX2NyZWRpdHMsICZ4YXR0cl9hYyk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIGxlYXZlOworCX0KKworCS8qIFJlc2VydmUgYSBjbHVzdGVyIGlmIGNyZWF0aW5nIGFuIGV4dGVudCBiYXNlZCBkaXJlY3RvcnkuICovCisJaWYgKFNfSVNESVIobW9kZSkgJiYgIW9jZnMyX3N1cHBvcnRzX2lubGluZV9kYXRhKG9zYikpCisJCXdhbnRfY2x1c3RlcnMgKz0gMTsKKworCXN0YXR1cyA9IG9jZnMyX3Jlc2VydmVfY2x1c3RlcnMob3NiLCB3YW50X2NsdXN0ZXJzLCAmZGF0YV9hYyk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJaWYgKHN0YXR1cyAhPSAtRU5PU1BDKQorCQkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIGxlYXZlOworCX0KKworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgb2NmczJfbWtub2RfY3JlZGl0cyhvc2ItPnNiKSArCisJCQkJICAgeGF0dHJfY3JlZGl0cyk7CiAJaWYgKElTX0VSUihoYW5kbGUpKSB7CiAJCXN0YXR1cyA9IFBUUl9FUlIoaGFuZGxlKTsKIAkJaGFuZGxlID0gTlVMTDsKQEAgLTI2OCwxMCArMzM1LDE5IEBACiAJCWdvdG8gbGVhdmU7CiAJfQogCisJLyogV2UgZG9uJ3QgdXNlIHN0YW5kYXJkIFZGUyB3cmFwcGVyIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB2ZnNfZHFfaW5pdAorCSAqIHRvIGJlIGNhbGxlZC4gKi8KKwlpZiAoc2JfYW55X3F1b3RhX2FjdGl2ZShvc2ItPnNiKSAmJgorCSAgICBvc2ItPnNiLT5kcV9vcC0+YWxsb2NfaW5vZGUoaW5vZGUsIDEpID09IE5PX1FVT1RBKSB7CisJCXN0YXR1cyA9IC1FRFFVT1Q7CisJCWdvdG8gbGVhdmU7CisJfQorCWRpZF9xdW90YV9pbm9kZSA9IDE7CisKIAkvKiBkbyB0aGUgcmVhbCB3b3JrIG5vdy4gKi8KLQlzdGF0dXMgPSBvY2ZzMl9ta25vZF9sb2NrZWQob3NiLCBkaXIsIGRlbnRyeSwgbW9kZSwgZGV2LAorCXN0YXR1cyA9IG9jZnMyX21rbm9kX2xvY2tlZChvc2IsIGRpciwgaW5vZGUsIGRlbnRyeSwgZGV2LAogCQkJCSAgICAmbmV3X2ZlX2JoLCBwYXJlbnRfZmVfYmgsIGhhbmRsZSwKLQkJCQkgICAgJmlub2RlLCBpbm9kZV9hYyk7CisJCQkJICAgIGlub2RlX2FjKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gbGVhdmU7CkBAIC0yODUsOCArMzYxLDggQEAKIAkJCWdvdG8gbGVhdmU7CiAJCX0KIAotCQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGRpciwgcGFyZW50X2ZlX2JoLAotCQkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RpKGhhbmRsZSwgZGlyLCBwYXJlbnRfZmVfYmgsCisJCQkJCQkgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCQlpZiAoc3RhdHVzIDwgMCkgewogCQkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQkJZ290byBsZWF2ZTsKQEAgLTMwMCw2ICszNzYsMjIgQEAKIAkJaW5jX25saW5rKGRpcik7CiAJfQogCisJc3RhdHVzID0gb2NmczJfaW5pdF9hY2woaGFuZGxlLCBpbm9kZSwgZGlyLCBuZXdfZmVfYmgsIHBhcmVudF9mZV9iaCwKKwkJCQl4YXR0cl9hYywgZGF0YV9hYyk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIGxlYXZlOworCX0KKworCWlmIChzaS5lbmFibGUpIHsKKwkJc3RhdHVzID0gb2NmczJfaW5pdF9zZWN1cml0eV9zZXQoaGFuZGxlLCBpbm9kZSwgbmV3X2ZlX2JoLCAmc2ksCisJCQkJCQkgeGF0dHJfYWMsIGRhdGFfYWMpOworCQlpZiAoc3RhdHVzIDwgMCkgeworCQkJbWxvZ19lcnJubyhzdGF0dXMpOworCQkJZ290byBsZWF2ZTsKKwkJfQorCX0KKwogCXN0YXR1cyA9IG9jZnMyX2FkZF9lbnRyeShoYW5kbGUsIGRlbnRyeSwgaW5vZGUsCiAJCQkJIE9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywgcGFyZW50X2ZlX2JoLAogCQkJCSBkZV9iaCk7CkBAIC0zMjAsNiArNDEyLDggQEAKIAlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwogCXN0YXR1cyA9IDA7CiBsZWF2ZToKKwlpZiAoc3RhdHVzIDwgMCAmJiBkaWRfcXVvdGFfaW5vZGUpCisJCXZmc19kcV9mcmVlX2lub2RlKGlub2RlKTsKIAlpZiAoaGFuZGxlKQogCQlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOwogCkBAIC0zMzEsOSArNDI1LDEzIEBACiAJYnJlbHNlKG5ld19mZV9iaCk7CiAJYnJlbHNlKGRlX2JoKTsKIAlicmVsc2UocGFyZW50X2ZlX2JoKTsKKwlrZnJlZShzaS5uYW1lKTsKKwlrZnJlZShzaS52YWx1ZSk7CiAKLQlpZiAoKHN0YXR1cyA8IDApICYmIGlub2RlKQorCWlmICgoc3RhdHVzIDwgMCkgJiYgaW5vZGUpIHsKKwkJY2xlYXJfbmxpbmsoaW5vZGUpOwogCQlpcHV0KGlub2RlKTsKKwl9CiAKIAlpZiAoaW5vZGVfYWMpCiAJCW9jZnMyX2ZyZWVfYWxsb2NfY29udGV4dChpbm9kZV9hYyk7CkBAIC0zNDEsNiArNDM5LDkgQEAKIAlpZiAoZGF0YV9hYykKIAkJb2NmczJfZnJlZV9hbGxvY19jb250ZXh0KGRhdGFfYWMpOwogCisJaWYgKHhhdHRyX2FjKQorCQlvY2ZzMl9mcmVlX2FsbG9jX2NvbnRleHQoeGF0dHJfYWMpOworCiAJbWxvZ19leGl0KHN0YXR1cyk7CiAKIAlyZXR1cm4gc3RhdHVzOwpAQCAtMzQ4LDEyICs0NDksMTIgQEAKIAogc3RhdGljIGludCBvY2ZzMl9ta25vZF9sb2NrZWQoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCQkgICAgICBzdHJ1Y3QgaW5vZGUgKmRpciwKLQkJCSAgICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsCisJCQkgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkJICAgICAgZGV2X3QgZGV2LAogCQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqbmV3X2ZlX2JoLAogCQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpwYXJlbnRfZmVfYmgsCiAJCQkgICAgICBoYW5kbGVfdCAqaGFuZGxlLAotCQkJICAgICAgc3RydWN0IGlub2RlICoqcmV0X2lub2RlLAogCQkJICAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmlub2RlX2FjKQogewogCWludCBzdGF0dXMgPSAwOwpAQCAtMzYxLDE0ICs0NjIsMTIgQEAKIAlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmZlbDsKIAl1NjQgZmVfYmxrbm8gPSAwOwogCXUxNiBzdWJhbGxvY19iaXQ7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CiAKLQltbG9nX2VudHJ5KCIoMHglcCwgMHglcCwgJWQsICVsdSwgJyUuKnMnKVxuIiwgZGlyLCBkZW50cnksIG1vZGUsCi0JCSAgICh1bnNpZ25lZCBsb25nKWRldiwgZGVudHJ5LT5kX25hbWUubGVuLAorCW1sb2dfZW50cnkoIigweCVwLCAweCVwLCAlZCwgJWx1LCAnJS4qcycpXG4iLCBkaXIsIGRlbnRyeSwKKwkJICAgaW5vZGUtPmlfbW9kZSwgKHVuc2lnbmVkIGxvbmcpZGV2LCBkZW50cnktPmRfbmFtZS5sZW4sCiAJCSAgIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOwogCiAJKm5ld19mZV9iaCA9IE5VTEw7Ci0JKnJldF9pbm9kZSA9IE5VTEw7CiAKIAlzdGF0dXMgPSBvY2ZzMl9jbGFpbV9uZXdfaW5vZGUob3NiLCBoYW5kbGUsIGlub2RlX2FjLCAmc3ViYWxsb2NfYml0LAogCQkJCSAgICAgICAmZmVfYmxrbm8pOwpAQCAtMzc3LDIzICs0NzYsMTEgQEAKIAkJZ290byBsZWF2ZTsKIAl9CiAKLQlpbm9kZSA9IG5ld19pbm9kZShkaXItPmlfc2IpOwotCWlmICghaW5vZGUpIHsKLQkJc3RhdHVzID0gLUVOT01FTTsKLQkJbWxvZyhNTF9FUlJPUiwgIm5ld19pbm9kZSBmYWlsZWQhXG4iKTsKLQkJZ290byBsZWF2ZTsKLQl9Ci0KIAkvKiBwb3B1bGF0ZSBhcyBtYW55IGZpZWxkcyBlYXJseSBvbiBhcyBwb3NzaWJsZSAtIG1hbnkgb2YKIAkgKiB0aGVzZSBhcmUgdXNlZCBieSB0aGUgc3VwcG9ydCBmdW5jdGlvbnMgaGVyZSBhbmQgaW4KIAkgKiBjYWxsZXJzLiAqLwogCWlub2RlLT5pX2lubyA9IGlub19mcm9tX2Jsa25vKG9zYi0+c2IsIGZlX2Jsa25vKTsKIAlPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8gPSBmZV9ibGtubzsKLQlpZiAoU19JU0RJUihtb2RlKSkKLQkJaW5vZGUtPmlfbmxpbmsgPSAyOwotCWVsc2UKLQkJaW5vZGUtPmlfbmxpbmsgPSAxOwotCWlub2RlLT5pX21vZGUgPSBtb2RlOwogCXNwaW5fbG9jaygmb3NiLT5vc2JfbG9jayk7CiAJaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IG9zYi0+c19uZXh0X2dlbmVyYXRpb24rKzsKIAlzcGluX3VubG9jaygmb3NiLT5vc2JfbG9jayk7CkBAIC00MDYsOCArNDkzLDggQEAKIAl9CiAJb2NmczJfc2V0X25ld19idWZmZXJfdXB0b2RhdGUoaW5vZGUsICpuZXdfZmVfYmgpOwogCi0Jc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgKm5ld19mZV9iaCwKLQkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19DUkVBVEUpOworCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RpKGhhbmRsZSwgaW5vZGUsICpuZXdfZmVfYmgsCisJCQkJCSBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19DUkVBVEUpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBsZWF2ZTsKQEAgLTQyMSwxNyArNTA4LDExIEBACiAJZmUtPmlfYmxrbm8gPSBjcHVfdG9fbGU2NChmZV9ibGtubyk7CiAJZmUtPmlfc3ViYWxsb2NfYml0ID0gY3B1X3RvX2xlMTYoc3ViYWxsb2NfYml0KTsKIAlmZS0+aV9zdWJhbGxvY19zbG90ID0gY3B1X3RvX2xlMTYoaW5vZGVfYWMtPmFjX2FsbG9jX3Nsb3QpOwotCWZlLT5pX3VpZCA9IGNwdV90b19sZTMyKGN1cnJlbnRfZnN1aWQoKSk7Ci0JaWYgKGRpci0+aV9tb2RlICYgU19JU0dJRCkgewotCQlmZS0+aV9naWQgPSBjcHVfdG9fbGUzMihkaXItPmlfZ2lkKTsKLQkJaWYgKFNfSVNESVIobW9kZSkpCi0JCQltb2RlIHw9IFNfSVNHSUQ7Ci0JfSBlbHNlCi0JCWZlLT5pX2dpZCA9IGNwdV90b19sZTMyKGN1cnJlbnRfZnNnaWQoKSk7Ci0JZmUtPmlfbW9kZSA9IGNwdV90b19sZTE2KG1vZGUpOwotCWlmIChTX0lTQ0hSKG1vZGUpIHx8IFNfSVNCTEsobW9kZSkpCisJZmUtPmlfdWlkID0gY3B1X3RvX2xlMzIoaW5vZGUtPmlfdWlkKTsKKwlmZS0+aV9naWQgPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9naWQpOworCWZlLT5pX21vZGUgPSBjcHVfdG9fbGUxNihpbm9kZS0+aV9tb2RlKTsKKwlpZiAoU19JU0NIUihpbm9kZS0+aV9tb2RlKSB8fCBTX0lTQkxLKGlub2RlLT5pX21vZGUpKQogCQlmZS0+aWQxLmRldjEuaV9yZGV2ID0gY3B1X3RvX2xlNjQoaHVnZV9lbmNvZGVfZGV2KGRldikpOwotCiAJZmUtPmlfbGlua3NfY291bnQgPSBjcHVfdG9fbGUxNihpbm9kZS0+aV9ubGluayk7CiAKIAlmZS0+aV9sYXN0X2ViX2JsayA9IDA7CkBAIC00NDYsNyArNTI3LDcgQEAKIAkvKgogCSAqIElmIHN1cHBvcnRlZCwgZGlyZWN0b3JpZXMgc3RhcnQgd2l0aCBpbmxpbmUgZGF0YS4KIAkgKi8KLQlpZiAoU19JU0RJUihtb2RlKSAmJiBvY2ZzMl9zdXBwb3J0c19pbmxpbmVfZGF0YShvc2IpKSB7CisJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYgb2NmczJfc3VwcG9ydHNfaW5saW5lX2RhdGEob3NiKSkgewogCQl1MTYgZmVhdCA9IGxlMTZfdG9fY3B1KGZlLT5pX2R5bl9mZWF0dXJlcyk7CiAKIAkJZmUtPmlfZHluX2ZlYXR1cmVzID0gY3B1X3RvX2xlMTYoZmVhdCB8IE9DRlMyX0lOTElORV9EQVRBX0ZMKTsKQEAgLTQ2NSwxNSArNTQ2LDcgQEAKIAkJZ290byBsZWF2ZTsKIAl9CiAKLQlpZiAob2NmczJfcG9wdWxhdGVfaW5vZGUoaW5vZGUsIGZlLCAxKSA8IDApIHsKLQkJbWxvZyhNTF9FUlJPUiwgInBvcHVsYXRlIGlub2RlIGZhaWxlZCEgYmgtPmJfYmxvY2tucj0lbGx1LCAiCi0JCSAgICAgImlfYmxrbm89JWxsdSwgaV9pbm89JWx1XG4iLAotCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpKCpuZXdfZmVfYmgpLT5iX2Jsb2NrbnIsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShmZS0+aV9ibGtubyksCi0JCSAgICAgaW5vZGUtPmlfaW5vKTsKLQkJQlVHKCk7Ci0JfQotCisJb2NmczJfcG9wdWxhdGVfaW5vZGUoaW5vZGUsIGZlLCAxKTsKIAlvY2ZzMl9pbm9kZV9zZXRfbmV3KG9zYiwgaW5vZGUpOwogCWlmICghb2NmczJfbW91bnRfbG9jYWwob3NiKSkgewogCQlzdGF0dXMgPSBvY2ZzMl9jcmVhdGVfbmV3X2lub2RlX2xvY2tzKGlub2RlKTsKQEAgLTQ4NCwxNyArNTU3LDEyIEBACiAJc3RhdHVzID0gMDsgLyogZXJyb3IgaW4gb2NmczJfY3JlYXRlX25ld19pbm9kZV9sb2NrcyBpcyBub3QKIAkJICAgICAqIGNyaXRpY2FsICovCiAKLQkqcmV0X2lub2RlID0gaW5vZGU7CiBsZWF2ZToKIAlpZiAoc3RhdHVzIDwgMCkgewogCQlpZiAoKm5ld19mZV9iaCkgewogCQkJYnJlbHNlKCpuZXdfZmVfYmgpOwogCQkJKm5ld19mZV9iaCA9IE5VTEw7CiAJCX0KLQkJaWYgKGlub2RlKSB7Ci0JCQljbGVhcl9ubGluayhpbm9kZSk7Ci0JCQlpcHV0KGlub2RlKTsKLQkJfQogCX0KIAogCW1sb2dfZXhpdChzdGF0dXMpOwpAQCAtNTg4LDcgKzY1Niw3IEBACiAJCWdvdG8gb3V0X3VubG9ja19pbm9kZTsKIAl9CiAKLQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX0xJTktfQ1JFRElUUyk7CisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBvY2ZzMl9saW5rX2NyZWRpdHMob3NiLT5zYikpOwogCWlmIChJU19FUlIoaGFuZGxlKSkgewogCQllcnIgPSBQVFJfRVJSKGhhbmRsZSk7CiAJCWhhbmRsZSA9IE5VTEw7CkBAIC01OTYsOCArNjY0LDggQEAKIAkJZ290byBvdXRfdW5sb2NrX2lub2RlOwogCX0KIAotCWVyciA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGZlX2JoLAotCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwllcnIgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19kaShoYW5kbGUsIGlub2RlLCBmZV9iaCwKKwkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJaWYgKGVyciA8IDApIHsKIAkJbWxvZ19lcnJubyhlcnIpOwogCQlnb3RvIG91dF9jb21taXQ7CkBAIC03NzUsNyArODQzLDcgQEAKIAkJfQogCX0KIAotCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgT0NGUzJfVU5MSU5LX0NSRURJVFMpOworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgb2NmczJfdW5saW5rX2NyZWRpdHMob3NiLT5zYikpOwogCWlmIChJU19FUlIoaGFuZGxlKSkgewogCQlzdGF0dXMgPSBQVFJfRVJSKGhhbmRsZSk7CiAJCWhhbmRsZSA9IE5VTEw7CkBAIC03ODMsOCArODUxLDggQEAKIAkJZ290byBsZWF2ZTsKIAl9CiAKLQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBmZV9iaCwKLQkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZGkoaGFuZGxlLCBpbm9kZSwgZmVfYmgsCisJCQkJCSBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGxlYXZlOwpAQCAtMTE4MSw3ICsxMjQ5LDcgQEAKIAkJfQogCX0KIAotCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgT0NGUzJfUkVOQU1FX0NSRURJVFMpOworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgb2NmczJfcmVuYW1lX2NyZWRpdHMob3NiLT5zYikpOwogCWlmIChJU19FUlIoaGFuZGxlKSkgewogCQlzdGF0dXMgPSBQVFJfRVJSKGhhbmRsZSk7CiAJCWhhbmRsZSA9IE5VTEw7CkBAIC0xMTk3LDggKzEyNjUsOCBAQAogCQkJCWdvdG8gYmFpbDsKIAkJCX0KIAkJfQotCQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIG5ld19pbm9kZSwgbmV3ZmVfYmgsCi0JCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwkJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZGkoaGFuZGxlLCBuZXdfaW5vZGUsIG5ld2ZlX2JoLAorCQkJCQkJIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJCWdvdG8gYmFpbDsKQEAgLTEyNDQsOCArMTMxMiw4IEBACiAJb2xkX2lub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCW1hcmtfaW5vZGVfZGlydHkob2xkX2lub2RlKTsKIAotCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgb2xkX2lub2RlLCBvbGRfaW5vZGVfYmgsCi0JCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RpKGhhbmRsZSwgb2xkX2lub2RlLCBvbGRfaW5vZGVfYmgsCisJCQkJCSBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJaWYgKHN0YXR1cyA+PSAwKSB7CiAJCW9sZF9kaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopIG9sZF9pbm9kZV9iaC0+Yl9kYXRhOwogCkBAIC0xMzIxLDkgKzEzODksOSBAQAogCQkJICAgICAoaW50KW9sZF9kaXJfbmxpbmssIG9sZF9kaXItPmlfbmxpbmspOwogCQl9IGVsc2UgewogCQkJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZmU7Ci0JCQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIG9sZF9kaXIsCi0JCQkJCQkgICAgICBvbGRfZGlyX2JoLAotCQkJCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCQkJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZGkoaGFuZGxlLCBvbGRfZGlyLAorCQkJCQkJCSBvbGRfZGlyX2JoLAorCQkJCQkJCSBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJCQlmZSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopIG9sZF9kaXJfYmgtPmJfZGF0YTsKIAkJCWZlLT5pX2xpbmtzX2NvdW50ID0gY3B1X3RvX2xlMTYob2xkX2Rpci0+aV9ubGluayk7CiAJCQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgb2xkX2Rpcl9iaCk7CkBAIC0xNDk2LDYgKzE1NjQsMTMgQEAKIAloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqaW5vZGVfYWMgPSBOVUxMOwogCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICpkYXRhX2FjID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqeGF0dHJfYWMgPSBOVUxMOworCWludCB3YW50X2NsdXN0ZXJzID0gMDsKKwlpbnQgeGF0dHJfY3JlZGl0cyA9IDA7CisJc3RydWN0IG9jZnMyX3NlY3VyaXR5X3hhdHRyX2luZm8gc2kgPSB7CisJCS5lbmFibGUgPSAxLAorCX07CisJaW50IGRpZF9xdW90YSA9IDAsIGRpZF9xdW90YV9pbm9kZSA9IDA7CiAKIAltbG9nX2VudHJ5KCIoMHglcCwgMHglcCwgc3ltbmFtZT0nJXMnIGFjdHVhbD0nJS4qcycpXG4iLCBkaXIsCiAJCSAgIGRlbnRyeSwgc3ltbmFtZSwgZGVudHJ5LT5kX25hbWUubGVuLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKQEAgLTE1NDIsMTcgKzE2MTcsNDYgQEAKIAkJZ290byBiYWlsOwogCX0KIAotCS8qIGRvbid0IHJlc2VydmUgYml0bWFwIHNwYWNlIGZvciBmYXN0IHN5bWxpbmtzLiAqLwotCWlmIChsID4gb2NmczJfZmFzdF9zeW1saW5rX2NoYXJzKHNiKSkgewotCQlzdGF0dXMgPSBvY2ZzMl9yZXNlcnZlX2NsdXN0ZXJzKG9zYiwgMSwgJmRhdGFfYWMpOwotCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJaWYgKHN0YXR1cyAhPSAtRU5PU1BDKQotCQkJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwlpbm9kZSA9IG9jZnMyX2dldF9pbml0X2lub2RlKGRpciwgU19JRkxOSyB8IFNfSVJXWFVHTyk7CisJaWYgKCFpbm9kZSkgeworCQlzdGF0dXMgPSAtRU5PTUVNOworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gYmFpbDsKKwl9CisKKwkvKiBnZXQgc2VjdXJpdHkgeGF0dHIgKi8KKwlzdGF0dXMgPSBvY2ZzMl9pbml0X3NlY3VyaXR5X2dldChpbm9kZSwgZGlyLCAmc2kpOworCWlmIChzdGF0dXMpIHsKKwkJaWYgKHN0YXR1cyA9PSAtRU9QTk9UU1VQUCkKKwkJCXNpLmVuYWJsZSA9IDA7CisJCWVsc2UgeworCQkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQkJZ290byBiYWlsOwogCQl9CiAJfQogCi0JaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBjcmVkaXRzKTsKKwkvKiBjYWxjdWxhdGUgbWV0YSBkYXRhL2NsdXN0ZXJzIGZvciBzZXR0aW5nIHNlY3VyaXR5IHhhdHRyICovCisJaWYgKHNpLmVuYWJsZSkgeworCQlzdGF0dXMgPSBvY2ZzMl9jYWxjX3NlY3VyaXR5X2luaXQoZGlyLCAmc2ksICZ3YW50X2NsdXN0ZXJzLAorCQkJCQkJICAmeGF0dHJfY3JlZGl0cywgJnhhdHRyX2FjKTsKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJCWdvdG8gYmFpbDsKKwkJfQorCX0KKworCS8qIGRvbid0IHJlc2VydmUgYml0bWFwIHNwYWNlIGZvciBmYXN0IHN5bWxpbmtzLiAqLworCWlmIChsID4gb2NmczJfZmFzdF9zeW1saW5rX2NoYXJzKHNiKSkKKwkJd2FudF9jbHVzdGVycyArPSAxOworCisJc3RhdHVzID0gb2NmczJfcmVzZXJ2ZV9jbHVzdGVycyhvc2IsIHdhbnRfY2x1c3RlcnMsICZkYXRhX2FjKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlpZiAoc3RhdHVzICE9IC1FTk9TUEMpCisJCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gYmFpbDsKKwl9CisKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIGNyZWRpdHMgKyB4YXR0cl9jcmVkaXRzKTsKIAlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKIAkJc3RhdHVzID0gUFRSX0VSUihoYW5kbGUpOwogCQloYW5kbGUgPSBOVUxMOwpAQCAtMTU2MCwxMCArMTY2NCwxOCBAQAogCQlnb3RvIGJhaWw7CiAJfQogCi0Jc3RhdHVzID0gb2NmczJfbWtub2RfbG9ja2VkKG9zYiwgZGlyLCBkZW50cnksCi0JCQkJICAgIFNfSUZMTksgfCBTX0lSV1hVR08sIDAsCi0JCQkJICAgICZuZXdfZmVfYmgsIHBhcmVudF9mZV9iaCwgaGFuZGxlLAotCQkJCSAgICAmaW5vZGUsIGlub2RlX2FjKTsKKwkvKiBXZSBkb24ndCB1c2Ugc3RhbmRhcmQgVkZTIHdyYXBwZXIgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHZmc19kcV9pbml0CisJICogdG8gYmUgY2FsbGVkLiAqLworCWlmIChzYl9hbnlfcXVvdGFfYWN0aXZlKG9zYi0+c2IpICYmCisJICAgIG9zYi0+c2ItPmRxX29wLT5hbGxvY19pbm9kZShpbm9kZSwgMSkgPT0gTk9fUVVPVEEpIHsKKwkJc3RhdHVzID0gLUVEUVVPVDsKKwkJZ290byBiYWlsOworCX0KKwlkaWRfcXVvdGFfaW5vZGUgPSAxOworCisJc3RhdHVzID0gb2NmczJfbWtub2RfbG9ja2VkKG9zYiwgZGlyLCBpbm9kZSwgZGVudHJ5LAorCQkJCSAgICAwLCAmbmV3X2ZlX2JoLCBwYXJlbnRfZmVfYmgsIGhhbmRsZSwKKwkJCQkgICAgaW5vZGVfYWMpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBiYWlsOwpAQCAtMTU3Niw2ICsxNjg4LDEyIEBACiAJCXUzMiBvZmZzZXQgPSAwOwogCiAJCWlub2RlLT5pX29wID0gJm9jZnMyX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJaWYgKHZmc19kcV9hbGxvY19zcGFjZV9ub2RpcnR5KGlub2RlLAorCQkgICAgb2NmczJfY2x1c3RlcnNfdG9fYnl0ZXMob3NiLT5zYiwgMSkpKSB7CisJCQlzdGF0dXMgPSAtRURRVU9UOworCQkJZ290byBiYWlsOworCQl9CisJCWRpZF9xdW90YSA9IDE7CiAJCXN0YXR1cyA9IG9jZnMyX2FkZF9pbm9kZV9kYXRhKG9zYiwgaW5vZGUsICZvZmZzZXQsIDEsIDAsCiAJCQkJCSAgICAgIG5ld19mZV9iaCwKIAkJCQkJICAgICAgaGFuZGxlLCBkYXRhX2FjLCBOVUxMLApAQCAtMTYxNCw2ICsxNzMyLDE1IEBACiAJCX0KIAl9CiAKKwlpZiAoc2kuZW5hYmxlKSB7CisJCXN0YXR1cyA9IG9jZnMyX2luaXRfc2VjdXJpdHlfc2V0KGhhbmRsZSwgaW5vZGUsIG5ld19mZV9iaCwgJnNpLAorCQkJCQkJIHhhdHRyX2FjLCBkYXRhX2FjKTsKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJCWdvdG8gYmFpbDsKKwkJfQorCX0KKwogCXN0YXR1cyA9IG9jZnMyX2FkZF9lbnRyeShoYW5kbGUsIGRlbnRyeSwgaW5vZGUsCiAJCQkJIGxlNjRfdG9fY3B1KGZlLT5pX2Jsa25vKSwgcGFyZW50X2ZlX2JoLAogCQkJCSBkZV9iaCk7CkBAIC0xNjMyLDYgKzE3NTksMTEgQEAKIAlkZW50cnktPmRfb3AgPSAmb2NmczJfZGVudHJ5X29wczsKIAlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwogYmFpbDoKKwlpZiAoc3RhdHVzIDwgMCAmJiBkaWRfcXVvdGEpCisJCXZmc19kcV9mcmVlX3NwYWNlX25vZGlydHkoaW5vZGUsCisJCQkJCW9jZnMyX2NsdXN0ZXJzX3RvX2J5dGVzKG9zYi0+c2IsIDEpKTsKKwlpZiAoc3RhdHVzIDwgMCAmJiBkaWRfcXVvdGFfaW5vZGUpCisJCXZmc19kcV9mcmVlX2lub2RlKGlub2RlKTsKIAlpZiAoaGFuZGxlKQogCQlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOwogCkBAIC0xNjQwLDEyICsxNzcyLDE4IEBACiAJYnJlbHNlKG5ld19mZV9iaCk7CiAJYnJlbHNlKHBhcmVudF9mZV9iaCk7CiAJYnJlbHNlKGRlX2JoKTsKKwlrZnJlZShzaS5uYW1lKTsKKwlrZnJlZShzaS52YWx1ZSk7CiAJaWYgKGlub2RlX2FjKQogCQlvY2ZzMl9mcmVlX2FsbG9jX2NvbnRleHQoaW5vZGVfYWMpOwogCWlmIChkYXRhX2FjKQogCQlvY2ZzMl9mcmVlX2FsbG9jX2NvbnRleHQoZGF0YV9hYyk7Ci0JaWYgKChzdGF0dXMgPCAwKSAmJiBpbm9kZSkKKwlpZiAoeGF0dHJfYWMpCisJCW9jZnMyX2ZyZWVfYWxsb2NfY29udGV4dCh4YXR0cl9hYyk7CisJaWYgKChzdGF0dXMgPCAwKSAmJiBpbm9kZSkgeworCQljbGVhcl9ubGluayhpbm9kZSk7CiAJCWlwdXQoaW5vZGUpOworCX0KIAogCW1sb2dfZXhpdChzdGF0dXMpOwogCkBAIC0xNzU0LDE2ICsxODkyLDE0IEBACiAKIAltbG9nX2VudHJ5KCIoaW5vZGUtPmlfaW5vID0gJWx1KVxuIiwgaW5vZGUtPmlfaW5vKTsKIAotCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2sob3JwaGFuX2Rpcl9pbm9kZSwKLQkJCQkgIE9DRlMyX0kob3JwaGFuX2Rpcl9pbm9kZSktPmlwX2Jsa25vLAotCQkJCSAgJm9ycGhhbl9kaXJfYmgpOworCXN0YXR1cyA9IG9jZnMyX3JlYWRfaW5vZGVfYmxvY2sob3JwaGFuX2Rpcl9pbm9kZSwgJm9ycGhhbl9kaXJfYmgpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBsZWF2ZTsKIAl9CiAKLQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIG9ycGhhbl9kaXJfaW5vZGUsIG9ycGhhbl9kaXJfYmgsCi0JCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RpKGhhbmRsZSwgb3JwaGFuX2Rpcl9pbm9kZSwgb3JwaGFuX2Rpcl9iaCwKKwkJCQkJIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gbGVhdmU7CkBAIC0xODUwLDggKzE5ODYsOCBAQAogCQlnb3RvIGxlYXZlOwogCX0KIAotCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSxvcnBoYW5fZGlyX2lub2RlLCAgb3JwaGFuX2Rpcl9iaCwKLQkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZGkoaGFuZGxlLG9ycGhhbl9kaXJfaW5vZGUsICBvcnBoYW5fZGlyX2JoLAorCQkJCQkgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBsZWF2ZTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL29jZnMyLmggYi9mcy9vY2ZzMi9vY2ZzMi5oCmluZGV4IDNmZWQ5ZTMuLmFkNWMyNGEgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL29jZnMyLmgKKysrIGIvZnMvb2NmczIvb2NmczIuaApAQCAtMTYxLDYgKzE2MSw3IEBACiB7CiAJVk9MVU1FX0lOSVQgPSAwLAogCVZPTFVNRV9NT1VOVEVELAorCVZPTFVNRV9NT1VOVEVEX1FVT1RBUywKIAlWT0xVTUVfRElTTU9VTlRFRCwKIAlWT0xVTUVfRElTQUJMRUQKIH07CkBAIC0xOTUsNiArMTk2LDkgQEAKIAlPQ0ZTMl9NT1VOVF9MT0NBTEZMT0NLUyA9IDEgPDwgNSwgLyogTm8gY2x1c3RlciBhd2FyZSB1c2VyIGZpbGUgbG9ja3MgKi8KIAlPQ0ZTMl9NT1VOVF9OT1VTRVJYQVRUUiA9IDEgPDwgNiwgLyogTm8gdXNlciB4YXR0ciAqLwogCU9DRlMyX01PVU5UX0lOT0RFNjQgPSAxIDw8IDcsCS8qIEFsbG93IGlub2RlIG51bWJlcnMgPiAyXjMyICovCisJT0NGUzJfTU9VTlRfUE9TSVhfQUNMID0gMSA8PCA4LAkvKiBQT1NJWCBhY2Nlc3MgY29udHJvbCBsaXN0cyAqLworCU9DRlMyX01PVU5UX1VTUlFVT1RBID0gMSA8PCA5LCAvKiBXZSBzdXBwb3J0IHVzZXIgcXVvdGFzICovCisJT0NGUzJfTU9VTlRfR1JQUVVPVEEgPSAxIDw8IDEwLCAvKiBXZSBzdXBwb3J0IGdyb3VwIHF1b3RhcyAqLwogfTsKIAogI2RlZmluZSBPQ0ZTMl9PU0JfU09GVF9STwkweDAwMDEKQEAgLTIwNSw2ICsyMDksNyBAQAogc3RydWN0IG9jZnMyX2pvdXJuYWw7CiBzdHJ1Y3Qgb2NmczJfc2xvdF9pbmZvOwogc3RydWN0IG9jZnMyX3JlY292ZXJ5X21hcDsKK3N0cnVjdCBvY2ZzMl9xdW90YV9yZWNvdmVyeTsKIHN0cnVjdCBvY2ZzMl9zdXBlcgogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqY29tbWl0X3Rhc2s7CkBAIC0yODYsMTAgKzI5MSwxMSBAQAogCWNoYXIgKmxvY2FsX2FsbG9jX2RlYnVnX2J1ZjsKICNlbmRpZgogCi0JLyogTmV4dCB0d28gZmllbGRzIGFyZSBmb3IgbG9jYWwgbm9kZSBzbG90IHJlY292ZXJ5IGR1cmluZworCS8qIE5leHQgdGhyZWUgZmllbGRzIGFyZSBmb3IgbG9jYWwgbm9kZSBzbG90IHJlY292ZXJ5IGR1cmluZwogCSAqIG1vdW50LiAqLwogCWludCBkaXJ0eTsKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpsb2NhbF9hbGxvY19jb3B5OworCXN0cnVjdCBvY2ZzMl9xdW90YV9yZWNvdmVyeSAqcXVvdGFfcmVjOwogCiAJc3RydWN0IG9jZnMyX2FsbG9jX3N0YXRzIGFsbG9jX3N0YXRzOwogCWNoYXIgZGV2X3N0clsyMF07CQkvKiAibWFqb3IsbWlub3IiIG9mIHRoZSBkZXZpY2UgKi8KQEAgLTMzMyw2ICszMzksMTAgQEAKIAogI2RlZmluZSBPQ0ZTMl9TQihzYikJICAgICgoc3RydWN0IG9jZnMyX3N1cGVyICopKHNiKS0+c19mc19pbmZvKQogCisvKiBVc2VmdWwgdHlwZWRlZiBmb3IgcGFzc2luZyBhcm91bmQgam91cm5hbCBhY2Nlc3MgZnVuY3Rpb25zICovCit0eXBlZGVmIGludCAoKm9jZnMyX2pvdXJuYWxfYWNjZXNzX2Z1bmMpKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgdHlwZSk7CisKIHN0YXRpYyBpbmxpbmUgaW50IG9jZnMyX3Nob3VsZF9vcmRlcl9kYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJaWYgKCFTX0lTUkVHKGlub2RlLT5pX21vZGUpKQpAQCAtMzc2LDYgKzM4NiwxMyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9tZXRhX2VjYyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYikKK3sKKwlpZiAob3NiLT5zX2ZlYXR1cmVfaW5jb21wYXQgJiBPQ0ZTMl9GRUFUVVJFX0lOQ09NUEFUX01FVEFfRUNDKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKwogLyogc2V0IC8gY2xlYXIgZnVuY3Rpb25zIGJlY2F1c2UgY2x1c3RlciBldmVudHMgY2FuIG1ha2UgdGhlc2UgaGFwcGVuCiAgKiBpbiBwYXJhbGxlbCBzbyB3ZSB3YW50IHRoZSB0cmFuc2l0aW9ucyB0byBiZSBhdG9taWMuIHRoaXMgYWxzbwogICogbWVhbnMgdGhhdCBhbnkgZnV0dXJlIGZsYWdzIG9zYl9mbGFncyBtdXN0IGJlIHByb3RlY3RlZCBieSBzcGlubG9jawpAQCAtNDQzLDM5ICs0NjAsMTkgQEAKICNkZWZpbmUgT0NGUzJfSVNfVkFMSURfRElOT0RFKHB0cikJCQkJCVwKIAkoIXN0cmNtcCgocHRyKS0+aV9zaWduYXR1cmUsIE9DRlMyX0lOT0RFX1NJR05BVFVSRSkpCiAKLSNkZWZpbmUgT0NGUzJfUk9fT05fSU5WQUxJRF9ESU5PREUoX19zYiwgX19kaSkJZG8gewkJCVwKLQl0eXBlb2YoX19kaSkgX19fX2RpID0gKF9fZGkpOwkJCQkJXAotCW9jZnMyX2Vycm9yKChfX3NiKSwgCQkJCQkJXAotCQkiRGlub2RlICMgJWxsdSBoYXMgYmFkIHNpZ25hdHVyZSAlLipzIiwJCQlcCi0JCSh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoKF9fX19kaSktPmlfYmxrbm8pLCA3LCAJXAotCQkoX19fX2RpKS0+aV9zaWduYXR1cmUpOwkJCQkJXAotfSB3aGlsZSAoMCkKLQogI2RlZmluZSBPQ0ZTMl9JU19WQUxJRF9FWFRFTlRfQkxPQ0socHRyKQkJCQlcCiAJKCFzdHJjbXAoKHB0ciktPmhfc2lnbmF0dXJlLCBPQ0ZTMl9FWFRFTlRfQkxPQ0tfU0lHTkFUVVJFKSkKIAotI2RlZmluZSBPQ0ZTMl9ST19PTl9JTlZBTElEX0VYVEVOVF9CTE9DSyhfX3NiLCBfX2ViKQlkbyB7CQlcCi0JdHlwZW9mKF9fZWIpIF9fX19lYiA9IChfX2ViKTsJCQkJCVwKLQlvY2ZzMl9lcnJvcigoX19zYiksIAkJCQkJCVwKLQkJIkV4dGVudCBCbG9jayAjICVsbHUgaGFzIGJhZCBzaWduYXR1cmUgJS4qcyIsCQlcCi0JCSh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoKF9fX19lYiktPmhfYmxrbm8pLCA3LAlcCi0JCShfX19fZWIpLT5oX3NpZ25hdHVyZSk7CQkJCQlcCi19IHdoaWxlICgwKQotCiAjZGVmaW5lIE9DRlMyX0lTX1ZBTElEX0dST1VQX0RFU0MocHRyKQkJCQkJXAogCSghc3RyY21wKChwdHIpLT5iZ19zaWduYXR1cmUsIE9DRlMyX0dST1VQX0RFU0NfU0lHTkFUVVJFKSkKIAotI2RlZmluZSBPQ0ZTMl9ST19PTl9JTlZBTElEX0dST1VQX0RFU0MoX19zYiwgX19nZCkJZG8gewkJXAotCXR5cGVvZihfX2dkKSBfX19fZ2QgPSAoX19nZCk7CQkJCQlcCi0JCW9jZnMyX2Vycm9yKChfX3NiKSwJCQkJCVwKLQkJIkdyb3VwIERlc2NyaXB0b3IgIyAlbGx1IGhhcyBiYWQgc2lnbmF0dXJlICUuKnMiLAlcCi0JCSh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoKF9fX19nZCktPmJnX2Jsa25vKSwgNywgXAotCQkoX19fX2dkKS0+Ymdfc2lnbmF0dXJlKTsJCQkJXAotfSB3aGlsZSAoMCkKIAogI2RlZmluZSBPQ0ZTMl9JU19WQUxJRF9YQVRUUl9CTE9DSyhwdHIpCQkJCQlcCiAJKCFzdHJjbXAoKHB0ciktPnhiX3NpZ25hdHVyZSwgT0NGUzJfWEFUVFJfQkxPQ0tfU0lHTkFUVVJFKSkKIAorI2RlZmluZSBPQ0ZTMl9JU19WQUxJRF9ESVJfVFJBSUxFUihwdHIpCQkJCQlcCisJKCFzdHJjbXAoKHB0ciktPmRiX3NpZ25hdHVyZSwgT0NGUzJfRElSX1RSQUlMRVJfU0lHTkFUVVJFKSkKKwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGlub19mcm9tX2Jsa25vKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQkJCSAgIHU2NCBibGtubykKIHsKQEAgLTYzMiw1ICs2MjksNiBAQAogI2RlZmluZSBvY2ZzMl9jbGVhcl9iaXQgZXh0Ml9jbGVhcl9iaXQKICNkZWZpbmUgb2NmczJfdGVzdF9iaXQgZXh0Ml90ZXN0X2JpdAogI2RlZmluZSBvY2ZzMl9maW5kX25leHRfemVyb19iaXQgZXh0Ml9maW5kX25leHRfemVyb19iaXQKKyNkZWZpbmUgb2NmczJfZmluZF9uZXh0X2JpdCBleHQyX2ZpbmRfbmV4dF9iaXQKICNlbmRpZiAgLyogT0NGUzJfSCAqLwogCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9vY2ZzMl9mcy5oIGIvZnMvb2NmczIvb2NmczJfZnMuaAppbmRleCA1ZTBjMGQwLi5jN2FlNDVhIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9vY2ZzMl9mcy5oCisrKyBiL2ZzL29jZnMyL29jZnMyX2ZzLmgKQEAgLTY1LDYgKzY1LDcgQEAKICNkZWZpbmUgT0NGUzJfRVhURU5UX0JMT0NLX1NJR05BVFVSRQkiRVhCTEswMSIKICNkZWZpbmUgT0NGUzJfR1JPVVBfREVTQ19TSUdOQVRVUkUgICAgICAiR1JPVVAwMSIKICNkZWZpbmUgT0NGUzJfWEFUVFJfQkxPQ0tfU0lHTkFUVVJFCSJYQVRUUjAxIgorI2RlZmluZSBPQ0ZTMl9ESVJfVFJBSUxFUl9TSUdOQVRVUkUJIkRJUlRSTDEiCiAKIC8qIENvbXBhdGliaWxpdHkgZmxhZ3MgKi8KICNkZWZpbmUgT0NGUzJfSEFTX0NPTVBBVF9GRUFUVVJFKHNiLG1hc2spCQkJXApAQCAtOTMsOCArOTQsMTEgQEAKIAkJCQkJIHwgT0NGUzJfRkVBVFVSRV9JTkNPTVBBVF9JTkxJTkVfREFUQSBcCiAJCQkJCSB8IE9DRlMyX0ZFQVRVUkVfSU5DT01QQVRfRVhURU5ERURfU0xPVF9NQVAgXAogCQkJCQkgfCBPQ0ZTMl9GRUFUVVJFX0lOQ09NUEFUX1VTRVJTUEFDRV9TVEFDSyBcCi0JCQkJCSB8IE9DRlMyX0ZFQVRVUkVfSU5DT01QQVRfWEFUVFIpCi0jZGVmaW5lIE9DRlMyX0ZFQVRVUkVfUk9fQ09NUEFUX1NVUFAJT0NGUzJfRkVBVFVSRV9ST19DT01QQVRfVU5XUklUVEVOCisJCQkJCSB8IE9DRlMyX0ZFQVRVUkVfSU5DT01QQVRfWEFUVFIgXAorCQkJCQkgfCBPQ0ZTMl9GRUFUVVJFX0lOQ09NUEFUX01FVEFfRUNDKQorI2RlZmluZSBPQ0ZTMl9GRUFUVVJFX1JPX0NPTVBBVF9TVVBQCShPQ0ZTMl9GRUFUVVJFX1JPX0NPTVBBVF9VTldSSVRURU4gXAorCQkJCQkgfCBPQ0ZTMl9GRUFUVVJFX1JPX0NPTVBBVF9VU1JRVU9UQSBcCisJCQkJCSB8IE9DRlMyX0ZFQVRVUkVfUk9fQ09NUEFUX0dSUFFVT1RBKQogCiAvKgogICogSGVhcnRiZWF0LW9ubHkgZGV2aWNlcyBhcmUgbWlzc2luZyBqb3VybmFscyBhbmQgb3RoZXIgZmlsZXMuICBUaGUKQEAgLTE0Nyw2ICsxNTEsOSBAQAogLyogU3VwcG9ydCBmb3IgZXh0ZW5kZWQgYXR0cmlidXRlcyAqLwogI2RlZmluZSBPQ0ZTMl9GRUFUVVJFX0lOQ09NUEFUX1hBVFRSCQkweDAyMDAKIAorLyogTWV0YWRhdGEgY2hlY2tzdW0gYW5kIGVycm9yIGNvcnJlY3Rpb24gKi8KKyNkZWZpbmUgT0NGUzJfRkVBVFVSRV9JTkNPTVBBVF9NRVRBX0VDQwkJMHgwODAwCisKIC8qCiAgKiBiYWNrdXAgc3VwZXJibG9jayBmbGFnIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIHZvbHVtZQogICogaGFzIGJhY2t1cCBzdXBlcmJsb2Nrcy4KQEAgLTE2Myw2ICsxNzAsMTIgQEAKICAqLwogI2RlZmluZSBPQ0ZTMl9GRUFUVVJFX1JPX0NPTVBBVF9VTldSSVRURU4JMHgwMDAxCiAKKy8qCisgKiBNYWludGFpbiBxdW90YSBpbmZvcm1hdGlvbiBmb3IgdGhpcyBmaWxlc3lzdGVtCisgKi8KKyNkZWZpbmUgT0NGUzJfRkVBVFVSRV9ST19DT01QQVRfVVNSUVVPVEEJMHgwMDAyCisjZGVmaW5lIE9DRlMyX0ZFQVRVUkVfUk9fQ09NUEFUX0dSUFFVT1RBCTB4MDAwNAorCiAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGZpcnN0IGJhY2t1cCBibG9jayB3aWxsIGJlIDFHLgogICogVGhlIGZvbGxvd2luZyB3aWxsIGJlIDRHLCAxNkcsIDY0RywgMjU2RyBhbmQgMVQuCiAgKi8KQEAgLTE5Miw2ICsyMDUsNyBAQAogI2RlZmluZSBPQ0ZTMl9IRUFSVEJFQVRfRkwJKDB4MDAwMDAyMDApCS8qIEhlYXJ0YmVhdCBhcmVhICovCiAjZGVmaW5lIE9DRlMyX0NIQUlOX0ZMCQkoMHgwMDAwMDQwMCkJLyogQ2hhaW4gYWxsb2NhdG9yICovCiAjZGVmaW5lIE9DRlMyX0RFQUxMT0NfRkwJKDB4MDAwMDA4MDApCS8qIFRydW5jYXRlIGxvZyAqLworI2RlZmluZSBPQ0ZTMl9RVU9UQV9GTAkJKDB4MDAwMDEwMDApCS8qIFF1b3RhIGZpbGUgKi8KIAogLyoKICAqIEZsYWdzIG9uIG9jZnMyX2Rpbm9kZS5pX2R5bl9mZWF0dXJlcwpAQCAtMzI5LDEzICszNDMsMTcgQEAKICNkZWZpbmUgT0NGUzJfRklSU1RfT05MSU5FX1NZU1RFTV9JTk9ERSBTTE9UX01BUF9TWVNURU1fSU5PREUKIAlIRUFSVEJFQVRfU1lTVEVNX0lOT0RFLAogCUdMT0JBTF9CSVRNQVBfU1lTVEVNX0lOT0RFLAotI2RlZmluZSBPQ0ZTMl9MQVNUX0dMT0JBTF9TWVNURU1fSU5PREUgR0xPQkFMX0JJVE1BUF9TWVNURU1fSU5PREUKKwlVU0VSX1FVT1RBX1NZU1RFTV9JTk9ERSwKKwlHUk9VUF9RVU9UQV9TWVNURU1fSU5PREUsCisjZGVmaW5lIE9DRlMyX0xBU1RfR0xPQkFMX1NZU1RFTV9JTk9ERSBHUk9VUF9RVU9UQV9TWVNURU1fSU5PREUKIAlPUlBIQU5fRElSX1NZU1RFTV9JTk9ERSwKIAlFWFRFTlRfQUxMT0NfU1lTVEVNX0lOT0RFLAogCUlOT0RFX0FMTE9DX1NZU1RFTV9JTk9ERSwKIAlKT1VSTkFMX1NZU1RFTV9JTk9ERSwKIAlMT0NBTF9BTExPQ19TWVNURU1fSU5PREUsCiAJVFJVTkNBVEVfTE9HX1NZU1RFTV9JTk9ERSwKKwlMT0NBTF9VU0VSX1FVT1RBX1NZU1RFTV9JTk9ERSwKKwlMT0NBTF9HUk9VUF9RVU9UQV9TWVNURU1fSU5PREUsCiAJTlVNX1NZU1RFTV9JTk9ERVMKIH07CiAKQEAgLTM0OSw2ICszNjcsOCBAQAogCVtTTE9UX01BUF9TWVNURU1fSU5PREVdCQkJPSB7ICJzbG90X21hcCIsIDAsIFNfSUZSRUcgfCAwNjQ0IH0sCiAJW0hFQVJUQkVBVF9TWVNURU1fSU5PREVdCQk9IHsgImhlYXJ0YmVhdCIsIE9DRlMyX0hFQVJUQkVBVF9GTCwgU19JRlJFRyB8IDA2NDQgfSwKIAlbR0xPQkFMX0JJVE1BUF9TWVNURU1fSU5PREVdCQk9IHsgImdsb2JhbF9iaXRtYXAiLCAwLCBTX0lGUkVHIHwgMDY0NCB9LAorCVtVU0VSX1FVT1RBX1NZU1RFTV9JTk9ERV0JCT0geyAiYXF1b3RhLnVzZXIiLCBPQ0ZTMl9RVU9UQV9GTCwgU19JRlJFRyB8IDA2NDQgfSwKKwlbR1JPVVBfUVVPVEFfU1lTVEVNX0lOT0RFXQkJPSB7ICJhcXVvdGEuZ3JvdXAiLCBPQ0ZTMl9RVU9UQV9GTCwgU19JRlJFRyB8IDA2NDQgfSwKIAogCS8qIFNsb3Qtc3BlY2lmaWMgc3lzdGVtIGlub2RlcyAob25lIGNvcHkgcGVyIHNsb3QpICovCiAJW09SUEhBTl9ESVJfU1lTVEVNX0lOT0RFXQkJPSB7ICJvcnBoYW5fZGlyOiUwNGQiLCAwLCBTX0lGRElSIHwgMDc1NSB9LApAQCAtMzU2LDcgKzM3Niw5IEBACiAJW0lOT0RFX0FMTE9DX1NZU1RFTV9JTk9ERV0JCT0geyAiaW5vZGVfYWxsb2M6JTA0ZCIsIE9DRlMyX0JJVE1BUF9GTCB8IE9DRlMyX0NIQUlOX0ZMLCBTX0lGUkVHIHwgMDY0NCB9LAogCVtKT1VSTkFMX1NZU1RFTV9JTk9ERV0JCQk9IHsgImpvdXJuYWw6JTA0ZCIsIE9DRlMyX0pPVVJOQUxfRkwsIFNfSUZSRUcgfCAwNjQ0IH0sCiAJW0xPQ0FMX0FMTE9DX1NZU1RFTV9JTk9ERV0JCT0geyAibG9jYWxfYWxsb2M6JTA0ZCIsIE9DRlMyX0JJVE1BUF9GTCB8IE9DRlMyX0xPQ0FMX0FMTE9DX0ZMLCBTX0lGUkVHIHwgMDY0NCB9LAotCVtUUlVOQ0FURV9MT0dfU1lTVEVNX0lOT0RFXQkJPSB7ICJ0cnVuY2F0ZV9sb2c6JTA0ZCIsIE9DRlMyX0RFQUxMT0NfRkwsIFNfSUZSRUcgfCAwNjQ0IH0KKwlbVFJVTkNBVEVfTE9HX1NZU1RFTV9JTk9ERV0JCT0geyAidHJ1bmNhdGVfbG9nOiUwNGQiLCBPQ0ZTMl9ERUFMTE9DX0ZMLCBTX0lGUkVHIHwgMDY0NCB9LAorCVtMT0NBTF9VU0VSX1FVT1RBX1NZU1RFTV9JTk9ERV0JCT0geyAiYXF1b3RhLnVzZXI6JTA0ZCIsIE9DRlMyX1FVT1RBX0ZMLCBTX0lGUkVHIHwgMDY0NCB9LAorCVtMT0NBTF9HUk9VUF9RVU9UQV9TWVNURU1fSU5PREVdCT0geyAiYXF1b3RhLmdyb3VwOiUwNGQiLCBPQ0ZTMl9RVU9UQV9GTCwgU19JRlJFRyB8IDA2NDQgfSwKIH07CiAKIC8qIFBhcmFtZXRlciBwYXNzZWQgZnJvbSBtb3VudC5vY2ZzMiB0byBtb2R1bGUgKi8KQEAgLTQxMCw2ICs0MzIsMjIgQEAKICNkZWZpbmUgT0NGUzJfUkFXX1NCKGRpbm9kZSkJCSgmKChkaW5vZGUpLT5pZDIuaV9zdXBlcikpCiAKIC8qCisgKiBCbG9jayBjaGVja2luZyBzdHJ1Y3R1cmUuICBUaGlzIGlzIHVzZWQgaW4gbWV0YWRhdGEgdG8gdmFsaWRhdGUgdGhlCisgKiBjb250ZW50cy4gIElmIE9DRlMyX0ZFQVRVUkVfSU5DT01QQVRfTUVUQV9FQ0MgaXMgbm90IHNldCwgaXQgaXMgYWxsCisgKiB6ZXJvcy4KKyAqLworc3RydWN0IG9jZnMyX2Jsb2NrX2NoZWNrIHsKKy8qMDAqLwlfX2xlMzIgYmNfY3JjMzJlOwkvKiA4MDIuMyBFdGhlcm5ldCBJSSBDUkMzMiAqLworCV9fbGUxNiBiY19lY2M7CQkvKiBTaW5nbGUtZXJyb3ItY29ycmVjdGlvbiBwYXJpdHkgdmVjdG9yLgorCQkJCSAgIFRoaXMgaXMgYSBzaW1wbGUgSGFtbWluZyBjb2RlIGRlcGVuZGFudAorCQkJCSAgIG9uIHRoZSBibG9ja3NpemUuICBPQ0ZTMidzIG1heGltdW0KKwkJCQkgICBibG9ja3NpemUsIDRLLCByZXF1aXJlcyAxNiBwYXJpdHkgYml0cywKKwkJCQkgICBzbyB3ZSBmaXQgaW4gX19sZTE2LiAqLworCV9fbGUxNiBiY19yZXNlcnZlZDE7CisvKjA4Ki8KK307CisKKy8qCiAgKiBPbiBkaXNrIGV4dGVudCByZWNvcmQgZm9yIE9DRlMyCiAgKiBJdCBkZXNjcmliZXMgYSByYW5nZSBvZiBjbHVzdGVycyBvbiBkaXNrLgogICoKQEAgLTQ5Niw3ICs1MzQsNyBAQAogc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jawogewogLyowMCovCV9fdTggaF9zaWduYXR1cmVbOF07CQkvKiBTaWduYXR1cmUgZm9yIHZlcmlmaWNhdGlvbiAqLwotCV9fbGU2NCBoX3Jlc2VydmVkMTsKKwlzdHJ1Y3Qgb2NmczJfYmxvY2tfY2hlY2sgaF9jaGVjazsJLyogRXJyb3IgY2hlY2tpbmcgKi8KIC8qMTAqLwlfX2xlMTYgaF9zdWJhbGxvY19zbG90OwkJLyogU2xvdCBzdWJhbGxvY2F0b3IgdGhpcwogCQkJCQkgICBleHRlbnRfaGVhZGVyIGJlbG9uZ3MgdG8gKi8KIAlfX2xlMTYgaF9zdWJhbGxvY19iaXQ7CQkvKiBCaXQgb2Zmc2V0IGluIHN1YmFsbG9jYXRvcgpAQCAtNjY2LDcgKzcwNCw4IEBACiAJCQkJCSAgIHdhcyBzZXQgaW4gaV9mbGFncyAqLwogCV9fbGUxNiBpX2R5bl9mZWF0dXJlczsKIAlfX2xlNjQgaV94YXR0cl9sb2M7Ci0vKjgwKi8JX19sZTY0IGlfcmVzZXJ2ZWQyWzddOworLyo4MCovCXN0cnVjdCBvY2ZzMl9ibG9ja19jaGVjayBpX2NoZWNrOwkvKiBFcnJvciBjaGVja2luZyAqLworLyo4OCovCV9fbGU2NCBpX3Jlc2VydmVkMls2XTsKIC8qQjgqLwl1bmlvbiB7CiAJCV9fbGU2NCBpX3BhZDE7CQkvKiBHZW5lcmljIHdheSB0byByZWZlciB0byB0aGlzCiAJCQkJCSAgIDY0Yml0IHVuaW9uICovCkBAIC03MTUsNiArNzU0LDM0IEBACiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAogLyoKKyAqIFBlci1ibG9jayByZWNvcmQgZm9yIHRoZSB1bmluZGV4ZWQgZGlyZWN0b3J5IGJ0cmVlLiBUaGlzIGlzIGNhcmVmdWxseQorICogY3JhZnRlZCBzbyB0aGF0IHRoZSByZWNfbGVuIGFuZCBuYW1lX2xlbiByZWNvcmRzIG9mIGFuIG9jZnMyX2Rpcl9lbnRyeSBhcmUKKyAqIG1pcnJvcmVkLiBUaGF0IHdheSwgdGhlIGRpcmVjdG9yeSBtYW5pcHVsYXRpb24gY29kZSBuZWVkcyBhIG1pbmltYWwgYW1vdW50CisgKiBvZiB1cGRhdGUuCisgKgorICogTk9URTogS2VlcCB0aGlzIHN0cnVjdHVyZSBhbGlnbmVkIHRvIGEgbXVsdGlwbGUgb2YgNCBieXRlcy4KKyAqLworc3RydWN0IG9jZnMyX2Rpcl9ibG9ja190cmFpbGVyIHsKKy8qMDAqLwlfX2xlNjQJCWRiX2NvbXBhdF9pbm9kZTsJLyogQWx3YXlzIHplcm8uIFdhcyBpbm9kZSAqLworCisJX19sZTE2CQlkYl9jb21wYXRfcmVjX2xlbjsJLyogQmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aAorCQkJCQkJICogb2NmczJfZGlyX2VudHJ5LiAqLworCV9fdTgJCWRiX2NvbXBhdF9uYW1lX2xlbjsJLyogQWx3YXlzIHplcm8uIFdhcyBuYW1lX2xlbiAqLworCV9fdTgJCWRiX3Jlc2VydmVkMDsKKwlfX2xlMTYJCWRiX3Jlc2VydmVkMTsKKwlfX2xlMTYJCWRiX2ZyZWVfcmVjX2xlbjsJLyogU2l6ZSBvZiBsYXJnZXN0IGVtcHR5IGhvbGUKKwkJCQkJCSAqIGluIHRoaXMgYmxvY2suICh1bnVzZWQpICovCisvKjEwKi8JX191OAkJZGJfc2lnbmF0dXJlWzhdOwkvKiBTaWduYXR1cmUgZm9yIHZlcmlmaWNhdGlvbiAqLworCV9fbGU2NAkJZGJfcmVzZXJ2ZWQyOworCV9fbGU2NAkJZGJfZnJlZV9uZXh0OwkJLyogTmV4dCBibG9jayBpbiBsaXN0ICh1bnVzZWQpICovCisvKjIwKi8JX19sZTY0CQlkYl9ibGtubzsJCS8qIE9mZnNldCBvbiBkaXNrLCBpbiBibG9ja3MgKi8KKwlfX2xlNjQJCWRiX3BhcmVudF9kaW5vZGU7CS8qIGRpbm9kZSB3aGljaCBvd25zIG1lLCBpbgorCQkJCQkJICAgYmxvY2tzICovCisvKjMwKi8Jc3RydWN0IG9jZnMyX2Jsb2NrX2NoZWNrIGRiX2NoZWNrOwkvKiBFcnJvciBjaGVja2luZyAqLworLyo0MCovCit9OworCisvKgogICogT24gZGlzayBhbGxvY2F0b3IgZ3JvdXAgc3RydWN0dXJlIGZvciBPQ0ZTMgogICovCiBzdHJ1Y3Qgb2NmczJfZ3JvdXBfZGVzYwpAQCAtNzMzLDcgKzgwMCw4IEBACiAvKjIwKi8JX19sZTY0ICAgYmdfcGFyZW50X2Rpbm9kZTsgICAgICAgLyogZGlub2RlIHdoaWNoIG93bnMgbWUsIGluCiAJCQkJCSAgIGJsb2NrcyAqLwogCV9fbGU2NCAgIGJnX2Jsa25vOyAgICAgICAgICAgICAgIC8qIE9mZnNldCBvbiBkaXNrLCBpbiBibG9ja3MgKi8KLS8qMzAqLwlfX2xlNjQgICBiZ19yZXNlcnZlZDJbMl07CisvKjMwKi8Jc3RydWN0IG9jZnMyX2Jsb2NrX2NoZWNrIGJnX2NoZWNrOwkvKiBFcnJvciBjaGVja2luZyAqLworCV9fbGU2NCAgIGJnX3Jlc2VydmVkMjsKIC8qNDAqLwlfX3U4ICAgIGJnX2JpdG1hcFswXTsKIH07CiAKQEAgLTc3Niw3ICs4NDQsMTIgQEAKIAkJCQkJCSAgIGluIHRoaXMgZXh0ZW50IHJlY29yZCwKIAkJCQkJCSAgIG9ubHkgdmFsaWQgaW4gdGhlIGZpcnN0CiAJCQkJCQkgICBidWNrZXQuICovCi0JX19sZTY0ICB4aF9jc3VtOworCXN0cnVjdCBvY2ZzMl9ibG9ja19jaGVjayB4aF9jaGVjazsJLyogRXJyb3IgY2hlY2tpbmcKKwkJCQkJCSAgIChOb3RlLCB0aGlzIGlzIG9ubHkKKwkJCQkJCSAgICB1c2VkIGZvciB4YXR0cgorCQkJCQkJICAgIGJ1Y2tldHMuICBBIGJsb2NrIHVzZXMKKwkJCQkJCSAgICB4Yl9jaGVjayBhbmQgc2V0cworCQkJCQkJICAgIHRoaXMgZmllbGQgdG8gemVyby4pICovCiAJc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5IHhoX2VudHJpZXNbMF07IC8qIHhhdHRyIGVudHJ5IGxpc3QuICovCiB9OwogCkBAIC04MjcsNyArOTAwLDcgQEAKIAkJCQkJYmxvY2sgZ3JvdXAgKi8KIAlfX2xlMzIJeGJfZnNfZ2VuZXJhdGlvbjsgICAgLyogTXVzdCBtYXRjaCBzdXBlciBibG9jayAqLwogLyoxMCovCV9fbGU2NAl4Yl9ibGtubzsgICAgICAgICAgICAvKiBPZmZzZXQgb24gZGlzaywgaW4gYmxvY2tzICovCi0JX19sZTY0CXhiX2NzdW07CisJc3RydWN0IG9jZnMyX2Jsb2NrX2NoZWNrIHhiX2NoZWNrOwkvKiBFcnJvciBjaGVja2luZyAqLwogLyoyMCovCV9fbGUxNgl4Yl9mbGFnczsgICAgICAgICAgICAvKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGJsb2NrIGNvbnRhaW5zCiAJCQkJCXJlYWwgeGF0dHIgb3IgYSB4YXR0ciB0cmVlLiAqLwogCV9fbGUxNgl4Yl9yZXNlcnZlZDA7CkBAIC04NjgsNiArOTQxLDEyOCBAQAogCXJldHVybiB4ZS0+eGVfdHlwZSAmIE9DRlMyX1hBVFRSX1RZUEVfTUFTSzsKIH0KIAorLyoKKyAqICBPbiBkaXNrIHN0cnVjdHVyZXMgZm9yIGdsb2JhbCBxdW90YSBmaWxlCisgKi8KKworLyogTWFnaWMgbnVtYmVycyBhbmQga25vd24gdmVyc2lvbnMgZm9yIGdsb2JhbCBxdW90YSBmaWxlcyAqLworI2RlZmluZSBPQ0ZTMl9HTE9CQUxfUU1BR0lDUyB7XAorCTB4MGNmNTI0NzAsIC8qIFVTUlFVT1RBICovIFwKKwkweDBjZjUyNDcxICAvKiBHUlBRVU9UQSAqLyBcCit9CisKKyNkZWZpbmUgT0NGUzJfR0xPQkFMX1FWRVJTSU9OUyB7XAorCTAsIFwKKwkwLCBcCit9CisKKworLyogRWFjaCBibG9jayBvZiBlYWNoIHF1b3RhIGZpbGUgaGFzIGEgY2VydGFpbiBmaXhlZCBudW1iZXIgb2YgYnl0ZXMgcmVzZXJ2ZWQKKyAqIGZvciBPQ0ZTMiBpbnRlcm5hbCB1c2UgYXQgaXRzIGVuZC4gT0NGUzIgY2FuIHVzZSBpdCBmb3IgdGhpbmdzIGxpa2UKKyAqIGNoZWNrc3VtcywgZXRjLiAqLworI2RlZmluZSBPQ0ZTMl9RQkxLX1JFU0VSVkVEX1NQQUNFIDgKKworLyogR2VuZXJpYyBoZWFkZXIgb2YgYWxsIHF1b3RhIGZpbGVzICovCitzdHJ1Y3Qgb2NmczJfZGlza19kcWhlYWRlciB7CisJX19sZTMyIGRxaF9tYWdpYzsJLyogTWFnaWMgbnVtYmVyIGlkZW50aWZ5aW5nIGZpbGUgKi8KKwlfX2xlMzIgZHFoX3ZlcnNpb247CS8qIFF1b3RhIGZvcm1hdCB2ZXJzaW9uICovCit9OworCisjZGVmaW5lIE9DRlMyX0dMT0JBTF9JTkZPX09GRiAoc2l6ZW9mKHN0cnVjdCBvY2ZzMl9kaXNrX2RxaGVhZGVyKSkKKworLyogSW5mb3JtYXRpb24gaGVhZGVyIG9mIGdsb2JhbCBxdW90YSBmaWxlIChpbW1lZGlhdGVseSBmb2xsb3dzIHRoZSBnZW5lcmljCisgKiBoZWFkZXIpICovCitzdHJ1Y3Qgb2NmczJfZ2xvYmFsX2Rpc2tfZHFpbmZvIHsKKy8qMDAqLwlfX2xlMzIgZHFpX2JncmFjZTsJLyogR3JhY2UgdGltZSBmb3Igc3BhY2Ugc29mdGxpbWl0IGV4Y2VzcyAqLworCV9fbGUzMiBkcWlfaWdyYWNlOwkvKiBHcmFjZSB0aW1lIGZvciBpbm9kZSBzb2Z0bGltaXQgZXhjZXNzICovCisJX19sZTMyIGRxaV9zeW5jbXM7CS8qIFRpbWUgYWZ0ZXIgd2hpY2ggd2Ugc3luYyBsb2NhbCBjaGFuZ2VzIHRvCisJCQkJICogZ2xvYmFsIHF1b3RhIGZpbGUgKi8KKwlfX2xlMzIgZHFpX2Jsb2NrczsJLyogTnVtYmVyIG9mIGJsb2NrcyBpbiBxdW90YSBmaWxlICovCisvKjEwKi8JX19sZTMyIGRxaV9mcmVlX2JsazsJLyogRmlyc3QgZnJlZSBibG9jayBpbiBxdW90YSBmaWxlICovCisJX19sZTMyIGRxaV9mcmVlX2VudHJ5OwkvKiBGaXJzdCBibG9jayB3aXRoIGZyZWUgZHF1b3QgZW50cnkgaW4gcXVvdGEKKwkJCQkgKiBmaWxlICovCit9OworCisvKiBTdHJ1Y3R1cmUgd2l0aCBnbG9iYWwgdXNlciAvIGdyb3VwIGluZm9ybWF0aW9uLiBXZSByZXNlcnZlIHNvbWUgc3BhY2UKKyAqIGZvciBmdXR1cmUgdXNlLiAqLworc3RydWN0IG9jZnMyX2dsb2JhbF9kaXNrX2RxYmxrIHsKKy8qMDAqLwlfX2xlMzIgZHFiX2lkOyAgICAgICAgICAvKiBJRCB0aGUgc3RydWN0dXJlIGJlbG9uZ3MgdG8gKi8KKwlfX2xlMzIgZHFiX3VzZV9jb3VudDsgICAvKiBOdW1iZXIgb2Ygbm9kZXMgaGF2aW5nIHJlZmVyZW5jZSB0byB0aGlzIHN0cnVjdHVyZSAqLworCV9fbGU2NCBkcWJfaWhhcmRsaW1pdDsgIC8qIGFic29sdXRlIGxpbWl0IG9uIGFsbG9jYXRlZCBpbm9kZXMgKi8KKy8qMTAqLwlfX2xlNjQgZHFiX2lzb2Z0bGltaXQ7ICAvKiBwcmVmZXJyZWQgaW5vZGUgbGltaXQgKi8KKwlfX2xlNjQgZHFiX2N1cmlub2RlczsgICAvKiBjdXJyZW50ICMgYWxsb2NhdGVkIGlub2RlcyAqLworLyoyMCovCV9fbGU2NCBkcWJfYmhhcmRsaW1pdDsgIC8qIGFic29sdXRlIGxpbWl0IG9uIGRpc2sgc3BhY2UgKi8KKwlfX2xlNjQgZHFiX2Jzb2Z0bGltaXQ7ICAvKiBwcmVmZXJyZWQgbGltaXQgb24gZGlzayBzcGFjZSAqLworLyozMCovCV9fbGU2NCBkcWJfY3Vyc3BhY2U7ICAgIC8qIGN1cnJlbnQgc3BhY2Ugb2NjdXBpZWQgKi8KKwlfX2xlNjQgZHFiX2J0aW1lOyAgICAgICAvKiB0aW1lIGxpbWl0IGZvciBleGNlc3NpdmUgZGlzayB1c2UgKi8KKy8qNDAqLwlfX2xlNjQgZHFiX2l0aW1lOyAgICAgICAvKiB0aW1lIGxpbWl0IGZvciBleGNlc3NpdmUgaW5vZGUgdXNlICovCisJX19sZTY0IGRxYl9wYWQxOworLyo1MCovCV9fbGU2NCBkcWJfcGFkMjsKK307CisKKy8qCisgKiAgT24tZGlzayBzdHJ1Y3R1cmVzIGZvciBsb2NhbCBxdW90YSBmaWxlCisgKi8KKworLyogTWFnaWMgbnVtYmVycyBhbmQga25vd24gdmVyc2lvbnMgZm9yIGxvY2FsIHF1b3RhIGZpbGVzICovCisjZGVmaW5lIE9DRlMyX0xPQ0FMX1FNQUdJQ1Mge1wKKwkweDBjZjUyNGMwLCAvKiBVU1JRVU9UQSAqLyBcCisJMHgwY2Y1MjRjMSAgLyogR1JQUVVPVEEgKi8gXAorfQorCisjZGVmaW5lIE9DRlMyX0xPQ0FMX1FWRVJTSU9OUyB7XAorCTAsIFwKKwkwLCBcCit9CisKKy8qIFF1b3RhIGZsYWdzIGluIGRxaW5mbyBoZWFkZXIgKi8KKyNkZWZpbmUgT0xRRl9DTEVBTgkweDAwMDEJLyogUXVvdGEgZmlsZSBpcyBlbXB0eSAodGhpcyBzaG91bGQgYmUgYWZ0ZXJcCisJCQkJICogcXVvdGEgaGFzIGJlZW4gY2xlYW5seSB0dXJuZWQgb2ZmKSAqLworCisjZGVmaW5lIE9DRlMyX0xPQ0FMX0lORk9fT0ZGIChzaXplb2Yoc3RydWN0IG9jZnMyX2Rpc2tfZHFoZWFkZXIpKQorCisvKiBJbmZvcm1hdGlvbiBoZWFkZXIgb2YgbG9jYWwgcXVvdGEgZmlsZSAoaW1tZWRpYXRlbHkgZm9sbG93cyB0aGUgZ2VuZXJpYworICogaGVhZGVyKSAqLworc3RydWN0IG9jZnMyX2xvY2FsX2Rpc2tfZHFpbmZvIHsKKwlfX2xlMzIgZHFpX2ZsYWdzOwkvKiBGbGFncyBmb3IgcXVvdGEgZmlsZSAqLworCV9fbGUzMiBkcWlfY2h1bmtzOwkvKiBOdW1iZXIgb2YgY2h1bmtzIG9mIHF1b3RhIHN0cnVjdHVyZXMKKwkJCQkgKiB3aXRoIGEgYml0bWFwICovCisJX19sZTMyIGRxaV9ibG9ja3M7CS8qIE51bWJlciBvZiBibG9ja3MgYWxsb2NhdGVkIGZvciBxdW90YSBmaWxlICovCit9OworCisvKiBIZWFkZXIgb2Ygb25lIGNodW5rIG9mIGEgcXVvdGEgZmlsZSAqLworc3RydWN0IG9jZnMyX2xvY2FsX2Rpc2tfY2h1bmsgeworCV9fbGUzMiBkcWNfZnJlZTsJLyogTnVtYmVyIG9mIGZyZWUgZW50cmllcyBpbiB0aGUgYml0bWFwICovCisJdTggZHFjX2JpdG1hcFswXTsJLyogQml0bWFwIG9mIGVudHJpZXMgaW4gdGhlIGNvcnJlc3BvbmRpbmcKKwkJCQkgKiBjaHVuayBvZiBxdW90YSBmaWxlICovCit9OworCisvKiBPbmUgZW50cnkgaW4gbG9jYWwgcXVvdGEgZmlsZSAqLworc3RydWN0IG9jZnMyX2xvY2FsX2Rpc2tfZHFibGsgeworLyowMCovCV9fbGU2NCBkcWJfaWQ7CQkvKiBpZCB0aGlzIHF1b3RhIGFwcGxpZXMgdG8gKi8KKwlfX2xlNjQgZHFiX3NwYWNlbW9kOwkvKiBDaGFuZ2UgaW4gdGhlIGFtb3VudCBvZiB1c2VkIHNwYWNlICovCisvKjEwKi8JX19sZTY0IGRxYl9pbm9kZW1vZDsJLyogQ2hhbmdlIGluIHRoZSBhbW91bnQgb2YgdXNlZCBpbm9kZXMgKi8KK307CisKKworLyoKKyAqIFRoZSBxdW90YSB0cmFpbGVyIGxpdmVzIGF0IHRoZSBlbmQgb2YgZWFjaCBxdW90YSBibG9jay4KKyAqLworCitzdHJ1Y3Qgb2NmczJfZGlza19kcXRyYWlsZXIgeworLyowMCovCXN0cnVjdCBvY2ZzMl9ibG9ja19jaGVjayBkcV9jaGVjazsJLyogRXJyb3IgY2hlY2tpbmcgKi8KKy8qMDgqLwkvKiBDYW5ub3QgYmUgbGFyZ2VyIHRoYW4gT0NGUzJfUUJMS19SRVNFUlZFRF9TUEFDRSAqLworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgb2NmczJfZGlza19kcXRyYWlsZXIgKm9jZnMyX2Jsb2NrX2RxdHJhaWxlcihpbnQgYmxvY2tzaXplLAorCQkJCQkJCQkgdm9pZCAqYnVmKQoreworCWNoYXIgKnB0ciA9IGJ1ZjsKKwlwdHIgKz0gYmxvY2tzaXplIC0gT0NGUzJfUUJMS19SRVNFUlZFRF9TUEFDRTsKKworCXJldHVybiAoc3RydWN0IG9jZnMyX2Rpc2tfZHF0cmFpbGVyICopcHRyOworfQorCiAjaWZkZWYgX19LRVJORUxfXwogc3RhdGljIGlubGluZSBpbnQgb2NmczJfZmFzdF9zeW1saW5rX2NoYXJzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9vY2ZzMl9qYmRfY29tcGF0LmggYi9mcy9vY2ZzMi9vY2ZzMl9qYmRfY29tcGF0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MWM3OGYuLjAwMDAwMDAKLS0tIGEvZnMvb2NmczIvb2NmczJfamJkX2NvbXBhdC5oCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyogLSotIG1vZGU6IGM7IGMtYmFzaWMtb2Zmc2V0OiA4OyAtKi0KLSAqIHZpbTogbm9leHBhbmR0YWIgc3c9OCB0cz04IHN0cz0wOgotICoKLSAqIG9jZnMyX2piZF9jb21wYXQuaAotICoKLSAqIENvbXBhdGliaWxpdHkgZGVmaW5lcyBmb3IgSkJELgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBPcmFjbGUuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIE9DRlMyX0pCRF9DT01QQVRfSAotI2RlZmluZSBPQ0ZTMl9KQkRfQ09NUEFUX0gKLQotI2lmbmRlZiBDT05GSUdfT0NGUzJfQ09NUEFUX0pCRAotIyBlcnJvciBTaG91bGQgbm90IGhhdmUgYmVlbiBpbmNsdWRlZAotI2VuZGlmCi0KLXN0cnVjdCBqYmQyX2lub2RlIHsKLQl1bnNpZ25lZCBpbnQgZHVtbXk7Ci19OwotCi0jZGVmaW5lIEpCRDJfQkFSUklFUgkJCUpGU19CQVJSSUVSCi0jZGVmaW5lIEpCRDJfREVGQVVMVF9NQVhfQ09NTUlUX0FHRQlKQkRfREVGQVVMVF9NQVhfQ09NTUlUX0FHRQotCi0jZGVmaW5lIGpiZDJfam91cm5hbF9hY2tfZXJyCQkJam91cm5hbF9hY2tfZXJyCi0jZGVmaW5lIGpiZDJfam91cm5hbF9jbGVhcl9lcnIJCQlqb3VybmFsX2NsZWFyX2VycgotI2RlZmluZSBqYmQyX2pvdXJuYWxfZGVzdHJveQkJCWpvdXJuYWxfZGVzdHJveQotI2RlZmluZSBqYmQyX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEJCWpvdXJuYWxfZGlydHlfbWV0YWRhdGEKLSNkZWZpbmUgamJkMl9qb3VybmFsX2Vycm5vCQkJam91cm5hbF9lcnJubwotI2RlZmluZSBqYmQyX2pvdXJuYWxfZXh0ZW5kCQkJam91cm5hbF9leHRlbmQKLSNkZWZpbmUgamJkMl9qb3VybmFsX2ZsdXNoCQkJam91cm5hbF9mbHVzaAotI2RlZmluZSBqYmQyX2pvdXJuYWxfZm9yY2VfY29tbWl0CQlqb3VybmFsX2ZvcmNlX2NvbW1pdAotI2RlZmluZSBqYmQyX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcwkJam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzCi0jZGVmaW5lIGpiZDJfam91cm5hbF9nZXRfdW5kb19hY2Nlc3MJCWpvdXJuYWxfZ2V0X3VuZG9fYWNjZXNzCi0jZGVmaW5lIGpiZDJfam91cm5hbF9pbml0X2lub2RlCQkJam91cm5hbF9pbml0X2lub2RlCi0jZGVmaW5lIGpiZDJfam91cm5hbF9pbnZhbGlkYXRlcGFnZQkJam91cm5hbF9pbnZhbGlkYXRlcGFnZQotI2RlZmluZSBqYmQyX2pvdXJuYWxfbG9hZAkJCWpvdXJuYWxfbG9hZAotI2RlZmluZSBqYmQyX2pvdXJuYWxfbG9ja191cGRhdGVzCQlqb3VybmFsX2xvY2tfdXBkYXRlcwotI2RlZmluZSBqYmQyX2pvdXJuYWxfcmVzdGFydAkJCWpvdXJuYWxfcmVzdGFydAotI2RlZmluZSBqYmQyX2pvdXJuYWxfc3RhcnQJCQlqb3VybmFsX3N0YXJ0Ci0jZGVmaW5lIGpiZDJfam91cm5hbF9zdGFydF9jb21taXQJCWpvdXJuYWxfc3RhcnRfY29tbWl0Ci0jZGVmaW5lIGpiZDJfam91cm5hbF9zdG9wCQkJam91cm5hbF9zdG9wCi0jZGVmaW5lIGpiZDJfam91cm5hbF90cnlfdG9fZnJlZV9idWZmZXJzCWpvdXJuYWxfdHJ5X3RvX2ZyZWVfYnVmZmVycwotI2RlZmluZSBqYmQyX2pvdXJuYWxfdW5sb2NrX3VwZGF0ZXMJCWpvdXJuYWxfdW5sb2NrX3VwZGF0ZXMKLSNkZWZpbmUgamJkMl9qb3VybmFsX3dpcGUJCQlqb3VybmFsX3dpcGUKLSNkZWZpbmUgamJkMl9sb2dfd2FpdF9jb21taXQJCQlsb2dfd2FpdF9jb21taXQKLQotc3RhdGljIGlubGluZSBpbnQgamJkMl9qb3VybmFsX2ZpbGVfaW5vZGUoaGFuZGxlX3QgKmhhbmRsZSwKLQkJCQkJICBzdHJ1Y3QgamJkMl9pbm9kZSAqaW5vZGUpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGpiZDJfam91cm5hbF9iZWdpbl9vcmRlcmVkX3RydW5jYXRlKHN0cnVjdCBqYmQyX2lub2RlICppbm9kZSwKLQkJCQkJCSAgICAgIGxvZmZfdCBuZXdfc2l6ZSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGpiZDJfam91cm5hbF9pbml0X2piZF9pbm9kZShzdHJ1Y3QgamJkMl9pbm9kZSAqamlub2RlLAotCQkJCQkgICAgICAgc3RydWN0IGlub2RlICppbm9kZSkKLXsKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBqYmQyX2pvdXJuYWxfcmVsZWFzZV9qYmRfaW5vZGUoam91cm5hbF90ICpqb3VybmFsLAotCQkJCQkJICBzdHJ1Y3QgamJkMl9pbm9kZSAqamlub2RlKQotewotCXJldHVybjsKLX0KLQotCi0jZW5kaWYgIC8qIE9DRlMyX0pCRF9DT01QQVRfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvb2NmczJfbG9ja2lkLmggYi9mcy9vY2ZzMi9vY2ZzMl9sb2NraWQuaAppbmRleCA4MmMyMDBmLi5lYjZmNTBjIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9vY2ZzMl9sb2NraWQuaAorKysgYi9mcy9vY2ZzMi9vY2ZzMl9sb2NraWQuaApAQCAtNDYsNiArNDYsNyBAQAogCU9DRlMyX0xPQ0tfVFlQRV9ERU5UUlksCiAJT0NGUzJfTE9DS19UWVBFX09QRU4sCiAJT0NGUzJfTE9DS19UWVBFX0ZMT0NLLAorCU9DRlMyX0xPQ0tfVFlQRV9RSU5GTywKIAlPQ0ZTMl9OVU1fTE9DS19UWVBFUwogfTsKIApAQCAtNzcsNiArNzgsOSBAQAogCQljYXNlIE9DRlMyX0xPQ0tfVFlQRV9GTE9DSzoKIAkJCWMgPSAnRic7CiAJCQlicmVhazsKKwkJY2FzZSBPQ0ZTMl9MT0NLX1RZUEVfUUlORk86CisJCQljID0gJ1EnOworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQljID0gJ1wwJzsKIAl9CkBAIC05NSw2ICs5OSw3IEBACiAJW09DRlMyX0xPQ0tfVFlQRV9ERU5UUlldID0gIkRlbnRyeSIsCiAJW09DRlMyX0xPQ0tfVFlQRV9PUEVOXSA9ICJPcGVuIiwKIAlbT0NGUzJfTE9DS19UWVBFX0ZMT0NLXSA9ICJGbG9jayIsCisJW09DRlMyX0xPQ0tfVFlQRV9RSU5GT10gPSAiUXVvdGEiLAogfTsKIAogc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpvY2ZzMl9sb2NrX3R5cGVfc3RyaW5nKGVudW0gb2NmczJfbG9ja190eXBlIHR5cGUpCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9xdW90YS5oIGIvZnMvb2NmczIvcXVvdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzY1ZTJlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvb2NmczIvcXVvdGEuaApAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIHF1b3RhLmggZm9yIE9DRlMyCisgKgorICogT24gZGlzayBxdW90YSBzdHJ1Y3R1cmVzIGZvciBsb2NhbCBhbmQgZ2xvYmFsIHF1b3RhIGZpbGUsIGluLW1lbW9yeQorICogc3RydWN0dXJlcy4KKyAqCisgKi8KKworI2lmbmRlZiBfT0NGUzJfUVVPVEFfSAorI2RlZmluZSBfT0NGUzJfUVVPVEFfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGEuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvZHFibGtfcXRyZWUuaD4KKworI2luY2x1ZGUgIm9jZnMyLmgiCisKKy8qIENvbW1vbiBzdHVmZiAqLworLyogaWQgbnVtYmVyIG9mIHF1b3RhIGZvcm1hdCAqLworI2RlZmluZSBRRk1UX09DRlMyIDMKKworLyoKKyAqIEluLW1lbW9yeSBzdHJ1Y3R1cmVzCisgKi8KK3N0cnVjdCBvY2ZzMl9kcXVvdCB7CisJc3RydWN0IGRxdW90IGRxX2RxdW90OwkvKiBHZW5lcmljIFZGUyBkcXVvdCAqLworCWxvZmZfdCBkcV9sb2NhbF9vZmY7CS8qIE9mZnNldCBpbiB0aGUgbG9jYWwgcXVvdGEgZmlsZSAqLworCXN0cnVjdCBvY2ZzMl9xdW90YV9jaHVuayAqZHFfY2h1bms7CS8qIENodW5rIGRxdW90IGlzIGluICovCisJdW5zaWduZWQgaW50IGRxX3VzZV9jb3VudDsJLyogTnVtYmVyIG9mIG5vZGVzIGhhdmluZyByZWZlcmVuY2UgdG8gdGhpcyBlbnRyeSBpbiBnbG9iYWwgcXVvdGEgZmlsZSAqLworCXM2NCBkcV9vcmlnc3BhY2U7CS8qIExhc3QgZ2xvYmFsbHkgc3luY2VkIHNwYWNlIHVzYWdlICovCisJczY0IGRxX29yaWdpbm9kZXM7CS8qIExhc3QgZ2xvYmFsbHkgc3luY2VkIGlub2RlIHVzYWdlICovCit9OworCisvKiBEZXNjcmlwdGlvbiBvZiBvbmUgY2h1bmsgdG8gcmVjb3ZlciBpbiBtZW1vcnkgKi8KK3N0cnVjdCBvY2ZzMl9yZWNvdmVyeV9jaHVuayB7CisJc3RydWN0IGxpc3RfaGVhZCByY19saXN0OwkvKiBMaXN0IG9mIGNodW5rcyAqLworCWludCByY19jaHVuazsJCQkvKiBDaHVuayBudW1iZXIgKi8KKwl1bnNpZ25lZCBsb25nICpyY19iaXRtYXA7CS8qIEJpdG1hcCBvZiBlbnRyaWVzIHRvIHJlY292ZXIgKi8KK307CisKK3N0cnVjdCBvY2ZzMl9xdW90YV9yZWNvdmVyeSB7CisJc3RydWN0IGxpc3RfaGVhZCByX2xpc3RbTUFYUVVPVEFTXTsJLyogTGlzdCBvZiBjaHVua3MgdG8gcmVjb3ZlciAqLworfTsKKworLyogSW4tbWVtb3J5IHN0cnVjdHVyZSB3aXRoIHF1b3RhIGhlYWRlciBpbmZvcm1hdGlvbiAqLworc3RydWN0IG9jZnMyX21lbV9kcWluZm8geworCXVuc2lnbmVkIGludCBkcWlfdHlwZTsJCS8qIFF1b3RhIHR5cGUgdGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzICovCisJdW5zaWduZWQgaW50IGRxaV9jaHVua3M7CS8qIE51bWJlciBvZiBjaHVua3MgaW4gbG9jYWwgcXVvdGEgZmlsZSAqLworCXVuc2lnbmVkIGludCBkcWlfYmxvY2tzOwkvKiBOdW1iZXIgb2YgYmxvY2tzIGFsbG9jYXRlZCBmb3IgbG9jYWwgcXVvdGEgZmlsZSAqLworCXVuc2lnbmVkIGludCBkcWlfc3luY21zOwkvKiBIb3cgb2Z0ZW4gc2hvdWxkIHdlIHN5bmMgd2l0aCBvdGhlciBub2RlcyAqLworCXVuc2lnbmVkIGludCBkcWlfc3luY2ppZmY7CS8qIFByZWNvbXB1dGVkIGRxaV9zeW5jbXMgaW4gamlmZmllcyAqLworCXN0cnVjdCBsaXN0X2hlYWQgZHFpX2NodW5rOwkvKiBMaXN0IG9mIGNodW5rcyAqLworCXN0cnVjdCBpbm9kZSAqZHFpX2dxaW5vZGU7CS8qIEdsb2JhbCBxdW90YSBmaWxlIGlub2RlICovCisJc3RydWN0IG9jZnMyX2xvY2tfcmVzIGRxaV9ncWxvY2s7CS8qIExvY2sgcHJvdGVjdGluZyBxdW90YSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRxaV9ncWlfYmg7CS8qIEJ1ZmZlciBoZWFkIHdpdGggZ2xvYmFsIHF1b3RhIGZpbGUgaW5vZGUgLSBzZXQgb25seSBpZiBpbm9kZSBsb2NrIGlzIG9idGFpbmVkICovCisJaW50IGRxaV9ncWlfY291bnQ7CQkvKiBOdW1iZXIgb2YgaG9sZGVycyBvZiBkcWlfZ3FpX2JoICovCisJc3RydWN0IGJ1ZmZlcl9oZWFkICpkcWlfbHFpX2JoOwkvKiBCdWZmZXIgaGVhZCB3aXRoIGxvY2FsIHF1b3RhIGZpbGUgaW5vZGUgKi8KKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRxaV9pYmg7CS8qIEJ1ZmZlciB3aXRoIGluZm9ybWF0aW9uIGhlYWRlciAqLworCXN0cnVjdCBxdHJlZV9tZW1fZHFpbmZvIGRxaV9naTsJLyogSW5mbyBhYm91dCBnbG9iYWwgZmlsZSAqLworCXN0cnVjdCBkZWxheWVkX3dvcmsgZHFpX3N5bmNfd29yazsJLyogV29yayBmb3Igc3luY2luZyBkcXVvdHMgKi8KKwlzdHJ1Y3Qgb2NmczJfcXVvdGFfcmVjb3ZlcnkgKmRxaV9yZWM7CS8qIFBvaW50ZXIgdG8gcmVjb3ZlcnkKKwkJCQkJCSAqIGluZm9ybWF0aW9uLCBpbiBjYXNlIHdlCisJCQkJCQkgKiBlbmFibGUgcXVvdGFzIG9uIGZpbGUKKwkJCQkJCSAqIG5lZWRpbmcgaXQgKi8KK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG9jZnMyX2RxdW90ICpPQ0ZTMl9EUVVPVChzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCXJldHVybiBjb250YWluZXJfb2YoZHF1b3QsIHN0cnVjdCBvY2ZzMl9kcXVvdCwgZHFfZHF1b3QpOworfQorCitzdHJ1Y3Qgb2NmczJfcXVvdGFfY2h1bmsgeworCXN0cnVjdCBsaXN0X2hlYWQgcWNfY2h1bms7CS8qIExpc3Qgb2YgcXVvdGFmaWxlIGNodW5rcyAqLworCWludCBxY19udW07CQkJLyogTnVtYmVyIG9mIHF1b3RhIGNodW5rICovCisJc3RydWN0IGJ1ZmZlcl9oZWFkICpxY19oZWFkZXJiaDsJLyogQnVmZmVyIGhlYWQgd2l0aCBjaHVuayBoZWFkZXIgKi8KK307CisKK2V4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqb2NmczJfZHF1b3RfY2FjaGVwOworZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICpvY2ZzMl9xZl9jaHVua19jYWNoZXA7CisKK2V4dGVybiBzdHJ1Y3QgcXRyZWVfZm10X29wZXJhdGlvbnMgb2NmczJfZ2xvYmFsX29wczsKKworc3RydWN0IG9jZnMyX3F1b3RhX3JlY292ZXJ5ICpvY2ZzMl9iZWdpbl9xdW90YV9yZWNvdmVyeSgKKwkJCQlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwgaW50IHNsb3RfbnVtKTsKK2ludCBvY2ZzMl9maW5pc2hfcXVvdGFfcmVjb3Zlcnkoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCisJCQkJc3RydWN0IG9jZnMyX3F1b3RhX3JlY292ZXJ5ICpyZWMsCisJCQkJaW50IHNsb3RfbnVtKTsKK3ZvaWQgb2NmczJfZnJlZV9xdW90YV9yZWNvdmVyeShzdHJ1Y3Qgb2NmczJfcXVvdGFfcmVjb3ZlcnkgKnJlYyk7Citzc2l6ZV90IG9jZnMyX3F1b3RhX3JlYWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIGNoYXIgKmRhdGEsCisJCQkgc2l6ZV90IGxlbiwgbG9mZl90IG9mZik7Citzc2l6ZV90IG9jZnMyX3F1b3RhX3dyaXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLAorCQkJICBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuLCBsb2ZmX3Qgb2ZmKTsKK2ludCBvY2ZzMl9nbG9iYWxfcmVhZF9pbmZvKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKTsKK2ludCBvY2ZzMl9nbG9iYWxfd3JpdGVfaW5mbyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSk7CitpbnQgb2NmczJfZ2xvYmFsX3JlYWRfZHF1b3Qoc3RydWN0IGRxdW90ICpkcXVvdCk7CitpbnQgX19vY2ZzMl9zeW5jX2RxdW90KHN0cnVjdCBkcXVvdCAqZHF1b3QsIGludCBmcmVlaW5nKTsKK3N0YXRpYyBpbmxpbmUgaW50IG9jZnMyX3N5bmNfZHF1b3Qoc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwlyZXR1cm4gX19vY2ZzMl9zeW5jX2RxdW90KGRxdW90LCAwKTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IG9jZnMyX2dsb2JhbF9yZWxlYXNlX2RxdW90KHN0cnVjdCBkcXVvdCAqZHF1b3QpCit7CisJcmV0dXJuIF9fb2NmczJfc3luY19kcXVvdChkcXVvdCwgMSk7Cit9CisKK2ludCBvY2ZzMl9sb2NrX2dsb2JhbF9xZihzdHJ1Y3Qgb2NmczJfbWVtX2RxaW5mbyAqb2luZm8sIGludCBleCk7Cit2b2lkIG9jZnMyX3VubG9ja19nbG9iYWxfcWYoc3RydWN0IG9jZnMyX21lbV9kcWluZm8gKm9pbmZvLCBpbnQgZXgpOworaW50IG9jZnMyX3JlYWRfcXVvdGFfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgdTY0IHZfYmxvY2ssCisJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaCk7CisKK2V4dGVybiBzdHJ1Y3QgZHF1b3Rfb3BlcmF0aW9ucyBvY2ZzMl9xdW90YV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBxdW90YV9mb3JtYXRfdHlwZSBvY2ZzMl9xdW90YV9mb3JtYXQ7CisKK2ludCBvY2ZzMl9xdW90YV9zZXR1cCh2b2lkKTsKK3ZvaWQgb2NmczJfcXVvdGFfc2h1dGRvd24odm9pZCk7CisKKyNlbmRpZiAvKiBfT0NGUzJfUVVPVEFfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvcXVvdGFfZ2xvYmFsLmMgYi9mcy9vY2ZzMi9xdW90YV9nbG9iYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWZmOGYyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvb2NmczIvcXVvdGFfZ2xvYmFsLmMKQEAgLTAsMCArMSwxMDI1IEBACisvKgorICogIEltcGxlbWVudGF0aW9uIG9mIG9wZXJhdGlvbnMgb3ZlciBnbG9iYWwgcXVvdGEgZmlsZQorICovCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3F1b3RhLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9kcWJsa19xdHJlZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworI2RlZmluZSBNTE9HX01BU0tfUFJFRklYIE1MX1FVT1RBCisjaW5jbHVkZSA8Y2x1c3Rlci9tYXNrbG9nLmg+CisKKyNpbmNsdWRlICJvY2ZzMl9mcy5oIgorI2luY2x1ZGUgIm9jZnMyLmgiCisjaW5jbHVkZSAiYWxsb2MuaCIKKyNpbmNsdWRlICJibG9ja2NoZWNrLmgiCisjaW5jbHVkZSAiaW5vZGUuaCIKKyNpbmNsdWRlICJqb3VybmFsLmgiCisjaW5jbHVkZSAiZmlsZS5oIgorI2luY2x1ZGUgInN5c2ZpbGUuaCIKKyNpbmNsdWRlICJkbG1nbHVlLmgiCisjaW5jbHVkZSAidXB0b2RhdGUuaCIKKyNpbmNsdWRlICJxdW90YS5oIgorCitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKm9jZnMyX3F1b3RhX3dxID0gTlVMTDsKKworc3RhdGljIHZvaWQgcXN5bmNfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworCitzdGF0aWMgdm9pZCBvY2ZzMl9nbG9iYWxfZGlzazJtZW1kcWIoc3RydWN0IGRxdW90ICpkcXVvdCwgdm9pZCAqZHApCit7CisJc3RydWN0IG9jZnMyX2dsb2JhbF9kaXNrX2RxYmxrICpkID0gZHA7CisJc3RydWN0IG1lbV9kcWJsayAqbSA9ICZkcXVvdC0+ZHFfZHFiOworCisJLyogVXBkYXRlIGZyb20gZGlzayBvbmx5IGVudHJpZXMgbm90IHNldCBieSB0aGUgYWRtaW4gKi8KKwlpZiAoIXRlc3RfYml0KERRX0xBU1RTRVRfQiArIFFJRl9JTElNSVRTX0IsICZkcXVvdC0+ZHFfZmxhZ3MpKSB7CisJCW0tPmRxYl9paGFyZGxpbWl0ID0gbGU2NF90b19jcHUoZC0+ZHFiX2loYXJkbGltaXQpOworCQltLT5kcWJfaXNvZnRsaW1pdCA9IGxlNjRfdG9fY3B1KGQtPmRxYl9pc29mdGxpbWl0KTsKKwl9CisJaWYgKCF0ZXN0X2JpdChEUV9MQVNUU0VUX0IgKyBRSUZfSU5PREVTX0IsICZkcXVvdC0+ZHFfZmxhZ3MpKQorCQltLT5kcWJfY3VyaW5vZGVzID0gbGU2NF90b19jcHUoZC0+ZHFiX2N1cmlub2Rlcyk7CisJaWYgKCF0ZXN0X2JpdChEUV9MQVNUU0VUX0IgKyBRSUZfQkxJTUlUU19CLCAmZHF1b3QtPmRxX2ZsYWdzKSkgeworCQltLT5kcWJfYmhhcmRsaW1pdCA9IGxlNjRfdG9fY3B1KGQtPmRxYl9iaGFyZGxpbWl0KTsKKwkJbS0+ZHFiX2Jzb2Z0bGltaXQgPSBsZTY0X3RvX2NwdShkLT5kcWJfYnNvZnRsaW1pdCk7CisJfQorCWlmICghdGVzdF9iaXQoRFFfTEFTVFNFVF9CICsgUUlGX1NQQUNFX0IsICZkcXVvdC0+ZHFfZmxhZ3MpKQorCQltLT5kcWJfY3Vyc3BhY2UgPSBsZTY0X3RvX2NwdShkLT5kcWJfY3Vyc3BhY2UpOworCWlmICghdGVzdF9iaXQoRFFfTEFTVFNFVF9CICsgUUlGX0JUSU1FX0IsICZkcXVvdC0+ZHFfZmxhZ3MpKQorCQltLT5kcWJfYnRpbWUgPSBsZTY0X3RvX2NwdShkLT5kcWJfYnRpbWUpOworCWlmICghdGVzdF9iaXQoRFFfTEFTVFNFVF9CICsgUUlGX0lUSU1FX0IsICZkcXVvdC0+ZHFfZmxhZ3MpKQorCQltLT5kcWJfaXRpbWUgPSBsZTY0X3RvX2NwdShkLT5kcWJfaXRpbWUpOworCU9DRlMyX0RRVU9UKGRxdW90KS0+ZHFfdXNlX2NvdW50ID0gbGUzMl90b19jcHUoZC0+ZHFiX3VzZV9jb3VudCk7Cit9CisKK3N0YXRpYyB2b2lkIG9jZnMyX2dsb2JhbF9tZW0yZGlza2RxYih2b2lkICpkcCwgc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwlzdHJ1Y3Qgb2NmczJfZ2xvYmFsX2Rpc2tfZHFibGsgKmQgPSBkcDsKKwlzdHJ1Y3QgbWVtX2RxYmxrICptID0gJmRxdW90LT5kcV9kcWI7CisKKwlkLT5kcWJfaWQgPSBjcHVfdG9fbGUzMihkcXVvdC0+ZHFfaWQpOworCWQtPmRxYl91c2VfY291bnQgPSBjcHVfdG9fbGUzMihPQ0ZTMl9EUVVPVChkcXVvdCktPmRxX3VzZV9jb3VudCk7CisJZC0+ZHFiX2loYXJkbGltaXQgPSBjcHVfdG9fbGU2NChtLT5kcWJfaWhhcmRsaW1pdCk7CisJZC0+ZHFiX2lzb2Z0bGltaXQgPSBjcHVfdG9fbGU2NChtLT5kcWJfaXNvZnRsaW1pdCk7CisJZC0+ZHFiX2N1cmlub2RlcyA9IGNwdV90b19sZTY0KG0tPmRxYl9jdXJpbm9kZXMpOworCWQtPmRxYl9iaGFyZGxpbWl0ID0gY3B1X3RvX2xlNjQobS0+ZHFiX2JoYXJkbGltaXQpOworCWQtPmRxYl9ic29mdGxpbWl0ID0gY3B1X3RvX2xlNjQobS0+ZHFiX2Jzb2Z0bGltaXQpOworCWQtPmRxYl9jdXJzcGFjZSA9IGNwdV90b19sZTY0KG0tPmRxYl9jdXJzcGFjZSk7CisJZC0+ZHFiX2J0aW1lID0gY3B1X3RvX2xlNjQobS0+ZHFiX2J0aW1lKTsKKwlkLT5kcWJfaXRpbWUgPSBjcHVfdG9fbGU2NChtLT5kcWJfaXRpbWUpOworfQorCitzdGF0aWMgaW50IG9jZnMyX2dsb2JhbF9pc19pZCh2b2lkICpkcCwgc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwlzdHJ1Y3Qgb2NmczJfZ2xvYmFsX2Rpc2tfZHFibGsgKmQgPSBkcDsKKwlzdHJ1Y3Qgb2NmczJfbWVtX2RxaW5mbyAqb2luZm8gPQorCQkJc2JfZHFpbmZvKGRxdW90LT5kcV9zYiwgZHF1b3QtPmRxX3R5cGUpLT5kcWlfcHJpdjsKKworCWlmIChxdHJlZV9lbnRyeV91bnVzZWQoJm9pbmZvLT5kcWlfZ2ksIGRwKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGxlMzJfdG9fY3B1KGQtPmRxYl9pZCkgPT0gZHF1b3QtPmRxX2lkOworfQorCitzdHJ1Y3QgcXRyZWVfZm10X29wZXJhdGlvbnMgb2NmczJfZ2xvYmFsX29wcyA9IHsKKwkubWVtMmRpc2tfZHFibGsgPSBvY2ZzMl9nbG9iYWxfbWVtMmRpc2tkcWIsCisJLmRpc2sybWVtX2RxYmxrID0gb2NmczJfZ2xvYmFsX2Rpc2sybWVtZHFiLAorCS5pc19pZCA9IG9jZnMyX2dsb2JhbF9pc19pZCwKK307CisKK3N0YXRpYyBpbnQgb2NmczJfdmFsaWRhdGVfcXVvdGFfYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXN0cnVjdCBvY2ZzMl9kaXNrX2RxdHJhaWxlciAqZHF0ID0KKwkJb2NmczJfYmxvY2tfZHF0cmFpbGVyKHNiLT5zX2Jsb2Nrc2l6ZSwgYmgtPmJfZGF0YSk7CisKKwltbG9nKDAsICJWYWxpZGF0aW5nIHF1b3RhIGJsb2NrICVsbHVcbiIsCisJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIpOworCisJQlVHX09OKCFidWZmZXJfdXB0b2RhdGUoYmgpKTsKKworCS8qCisJICogSWYgdGhlIGVjYyBmYWlscywgd2UgcmV0dXJuIHRoZSBlcnJvciBidXQgb3RoZXJ3aXNlCisJICogbGVhdmUgdGhlIGZpbGVzeXN0ZW0gcnVubmluZy4gIFdlIGtub3cgYW55IGVycm9yIGlzCisJICogbG9jYWwgdG8gdGhpcyBibG9jay4KKwkgKi8KKwlyZXR1cm4gb2NmczJfdmFsaWRhdGVfbWV0YV9lY2Moc2IsIGJoLT5iX2RhdGEsICZkcXQtPmRxX2NoZWNrKTsKK30KKworaW50IG9jZnMyX3JlYWRfcXVvdGFfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgdTY0IHZfYmxvY2ssCisJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaCkKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBidWZmZXJfaGVhZCAqdG1wID0gKmJoOworCisJcmMgPSBvY2ZzMl9yZWFkX3ZpcnRfYmxvY2tzKGlub2RlLCB2X2Jsb2NrLCAxLCAmdG1wLCAwLAorCQkJCSAgICBvY2ZzMl92YWxpZGF0ZV9xdW90YV9ibG9jayk7CisJaWYgKHJjKQorCQltbG9nX2Vycm5vKHJjKTsKKworCS8qIElmIG9jZnMyX3JlYWRfdmlydF9ibG9ja3MoKSBnb3QgdXMgYSBuZXcgYmgsIHBhc3MgaXQgdXAuICovCisJaWYgKCFyYyAmJiAhKmJoKQorCQkqYmggPSB0bXA7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfZ2V0X3F1b3RhX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBibG9jaywKKwkJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmgpCit7CisJdTY0IHBibG9jaywgcGNvdW50OworCWludCBlcnI7CisKKwlkb3duX3JlYWQoJk9DRlMyX0koaW5vZGUpLT5pcF9hbGxvY19zZW0pOworCWVyciA9IG9jZnMyX2V4dGVudF9tYXBfZ2V0X2Jsb2Nrcyhpbm9kZSwgYmxvY2ssICZwYmxvY2ssICZwY291bnQsIE5VTEwpOworCXVwX3JlYWQoJk9DRlMyX0koaW5vZGUpLT5pcF9hbGxvY19zZW0pOworCWlmIChlcnIpIHsKKwkJbWxvZ19lcnJubyhlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKwkqYmggPSBzYl9nZXRibGsoaW5vZGUtPmlfc2IsIHBibG9jayk7CisJaWYgKCEqYmgpIHsKKwkJZXJyID0gLUVJTzsKKwkJbWxvZ19lcnJubyhlcnIpOworCX0KKwlyZXR1cm4gZXJyOzsKK30KKworLyogUmVhZCBkYXRhIGZyb20gZ2xvYmFsIHF1b3RhZmlsZSAtIGF2b2lkIHBhZ2VjYWNoZSBhbmQgc3VjaCBiZWNhdXNlIHdlIGNhbm5vdAorICogYWZmb3JkIGFjcXVpcmluZyB0aGUgbG9ja3MuLi4gV2UgdXNlIHF1b3RhIGNsdXN0ZXIgbG9jayB0byBzZXJpYWxpemUKKyAqIG9wZXJhdGlvbnMuIENhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWNxdWlyaW5nIGl0LiAqLworc3NpemVfdCBvY2ZzMl9xdW90YV9yZWFkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLCBjaGFyICpkYXRhLAorCQkJIHNpemVfdCBsZW4sIGxvZmZfdCBvZmYpCit7CisJc3RydWN0IG9jZnMyX21lbV9kcWluZm8gKm9pbmZvID0gc2JfZHFpbmZvKHNiLCB0eXBlKS0+ZHFpX3ByaXY7CisJc3RydWN0IGlub2RlICpncWlub2RlID0gb2luZm8tPmRxaV9ncWlub2RlOworCWxvZmZfdCBpX3NpemUgPSBpX3NpemVfcmVhZChncWlub2RlKTsKKwlpbnQgb2Zmc2V0ID0gb2ZmICYgKHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpOworCXNlY3Rvcl90IGJsayA9IG9mZiA+PiBzYi0+c19ibG9ja3NpemVfYml0czsKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXNpemVfdCB0b3JlYWQsIHRvY29weTsKKworCWlmIChvZmYgPiBpX3NpemUpCisJCXJldHVybiAwOworCWlmIChvZmYgKyBsZW4gPiBpX3NpemUpCisJCWxlbiA9IGlfc2l6ZSAtIG9mZjsKKwl0b3JlYWQgPSBsZW47CisJd2hpbGUgKHRvcmVhZCA+IDApIHsKKwkJdG9jb3B5ID0gbWluX3Qoc2l6ZV90LCAoc2ItPnNfYmxvY2tzaXplIC0gb2Zmc2V0KSwgdG9yZWFkKTsKKwkJYmggPSBOVUxMOworCQllcnIgPSBvY2ZzMl9yZWFkX3F1b3RhX2Jsb2NrKGdxaW5vZGUsIGJsaywgJmJoKTsKKwkJaWYgKGVycikgeworCQkJbWxvZ19lcnJubyhlcnIpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQltZW1jcHkoZGF0YSwgYmgtPmJfZGF0YSArIG9mZnNldCwgdG9jb3B5KTsKKwkJYnJlbHNlKGJoKTsKKwkJb2Zmc2V0ID0gMDsKKwkJdG9yZWFkIC09IHRvY29weTsKKwkJZGF0YSArPSB0b2NvcHk7CisJCWJsaysrOworCX0KKwlyZXR1cm4gbGVuOworfQorCisvKiBXcml0ZSB0byBxdW90YWZpbGUgKHdlIGtub3cgdGhlIHRyYW5zYWN0aW9uIGlzIGFscmVhZHkgc3RhcnRlZCBhbmQgaGFzCisgKiBlbm91Z2ggY3JlZGl0cykgKi8KK3NzaXplX3Qgb2NmczJfcXVvdGFfd3JpdGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsCisJCQkgIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW4sIGxvZmZfdCBvZmYpCit7CisJc3RydWN0IG1lbV9kcWluZm8gKmluZm8gPSBzYl9kcWluZm8oc2IsIHR5cGUpOworCXN0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvICpvaW5mbyA9IGluZm8tPmRxaV9wcml2OworCXN0cnVjdCBpbm9kZSAqZ3Fpbm9kZSA9IG9pbmZvLT5kcWlfZ3Fpbm9kZTsKKwlpbnQgb2Zmc2V0ID0gb2ZmICYgKHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpOworCXNlY3Rvcl90IGJsayA9IG9mZiA+PiBzYi0+c19ibG9ja3NpemVfYml0czsKKwlpbnQgZXJyID0gMCwgbmV3ID0gMCwgamFfdHlwZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwloYW5kbGVfdCAqaGFuZGxlID0gam91cm5hbF9jdXJyZW50X2hhbmRsZSgpOworCisJaWYgKCFoYW5kbGUpIHsKKwkJbWxvZyhNTF9FUlJPUiwgIlF1b3RhIHdyaXRlIChvZmY9JWxsdSwgbGVuPSVsbHUpIGNhbmNlbGxlZCAiCisJCSAgICAgImJlY2F1c2UgdHJhbnNhY3Rpb24gd2FzIG5vdCBzdGFydGVkLlxuIiwKKwkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKW9mZiwgKHVuc2lnbmVkIGxvbmcgbG9uZylsZW4pOworCQlyZXR1cm4gLUVJTzsKKwl9CisJaWYgKGxlbiA+IHNiLT5zX2Jsb2Nrc2l6ZSAtIE9DRlMyX1FCTEtfUkVTRVJWRURfU1BBQ0UgLSBvZmZzZXQpIHsKKwkJV0FSTl9PTigxKTsKKwkJbGVuID0gc2ItPnNfYmxvY2tzaXplIC0gT0NGUzJfUUJMS19SRVNFUlZFRF9TUEFDRSAtIG9mZnNldDsKKwl9CisKKwltdXRleF9sb2NrX25lc3RlZCgmZ3Fpbm9kZS0+aV9tdXRleCwgSV9NVVRFWF9RVU9UQSk7CisJaWYgKGdxaW5vZGUtPmlfc2l6ZSA8IG9mZiArIGxlbikgeworCQlkb3duX3dyaXRlKCZPQ0ZTMl9JKGdxaW5vZGUpLT5pcF9hbGxvY19zZW0pOworCQllcnIgPSBvY2ZzMl9leHRlbmRfbm9faG9sZXMoZ3Fpbm9kZSwgb2ZmICsgbGVuLCBvZmYpOworCQl1cF93cml0ZSgmT0NGUzJfSShncWlub2RlKS0+aXBfYWxsb2Nfc2VtKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIG91dDsKKwkJZXJyID0gb2NmczJfc2ltcGxlX3NpemVfdXBkYXRlKGdxaW5vZGUsCisJCQkJCSAgICAgICBvaW5mby0+ZHFpX2dxaV9iaCwKKwkJCQkJICAgICAgIG9mZiArIGxlbik7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBvdXQ7CisJCW5ldyA9IDE7CisJfQorCS8qIE5vdCByZXdyaXRpbmcgd2hvbGUgYmxvY2s/ICovCisJaWYgKChvZmZzZXQgfHwgbGVuIDwgc2ItPnNfYmxvY2tzaXplIC0gT0NGUzJfUUJMS19SRVNFUlZFRF9TUEFDRSkgJiYKKwkgICAgIW5ldykgeworCQllcnIgPSBvY2ZzMl9yZWFkX3F1b3RhX2Jsb2NrKGdxaW5vZGUsIGJsaywgJmJoKTsKKwkJamFfdHlwZSA9IE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFOworCX0gZWxzZSB7CisJCWVyciA9IG9jZnMyX2dldF9xdW90YV9ibG9jayhncWlub2RlLCBibGssICZiaCk7CisJCWphX3R5cGUgPSBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19DUkVBVEU7CisJfQorCWlmIChlcnIpIHsKKwkJbWxvZ19lcnJubyhlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKwlsb2NrX2J1ZmZlcihiaCk7CisJaWYgKG5ldykKKwkJbWVtc2V0KGJoLT5iX2RhdGEsIDAsIHNiLT5zX2Jsb2Nrc2l6ZSk7CisJbWVtY3B5KGJoLT5iX2RhdGEgKyBvZmZzZXQsIGRhdGEsIGxlbik7CisJZmx1c2hfZGNhY2hlX3BhZ2UoYmgtPmJfcGFnZSk7CisJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJdW5sb2NrX2J1ZmZlcihiaCk7CisJb2NmczJfc2V0X2J1ZmZlcl91cHRvZGF0ZShncWlub2RlLCBiaCk7CisJZXJyID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZHEoaGFuZGxlLCBncWlub2RlLCBiaCwgamFfdHlwZSk7CisJaWYgKGVyciA8IDApIHsKKwkJYnJlbHNlKGJoKTsKKwkJZ290byBvdXQ7CisJfQorCWVyciA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBiaCk7CisJYnJlbHNlKGJoKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXQ7CitvdXQ6CisJaWYgKGVycikgeworCQltdXRleF91bmxvY2soJmdxaW5vZGUtPmlfbXV0ZXgpOworCQltbG9nX2Vycm5vKGVycik7CisJCXJldHVybiBlcnI7CisJfQorCWdxaW5vZGUtPmlfdmVyc2lvbisrOworCW9jZnMyX21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBncWlub2RlLCBvaW5mby0+ZHFpX2dxaV9iaCk7CisJbXV0ZXhfdW5sb2NrKCZncWlub2RlLT5pX211dGV4KTsKKwlyZXR1cm4gbGVuOworfQorCitpbnQgb2NmczJfbG9ja19nbG9iYWxfcWYoc3RydWN0IG9jZnMyX21lbV9kcWluZm8gKm9pbmZvLCBpbnQgZXgpCit7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKworCXN0YXR1cyA9IG9jZnMyX2lub2RlX2xvY2sob2luZm8tPmRxaV9ncWlub2RlLCAmYmgsIGV4KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKwlzcGluX2xvY2soJmRxX2RhdGFfbG9jayk7CisJaWYgKCFvaW5mby0+ZHFpX2dxaV9jb3VudCsrKQorCQlvaW5mby0+ZHFpX2dxaV9iaCA9IGJoOworCWVsc2UKKwkJV0FSTl9PTihiaCAhPSBvaW5mby0+ZHFpX2dxaV9iaCk7CisJc3Bpbl91bmxvY2soJmRxX2RhdGFfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgb2NmczJfdW5sb2NrX2dsb2JhbF9xZihzdHJ1Y3Qgb2NmczJfbWVtX2RxaW5mbyAqb2luZm8sIGludCBleCkKK3sKKwlvY2ZzMl9pbm9kZV91bmxvY2sob2luZm8tPmRxaV9ncWlub2RlLCBleCk7CisJYnJlbHNlKG9pbmZvLT5kcWlfZ3FpX2JoKTsKKwlzcGluX2xvY2soJmRxX2RhdGFfbG9jayk7CisJaWYgKCEtLW9pbmZvLT5kcWlfZ3FpX2NvdW50KQorCQlvaW5mby0+ZHFpX2dxaV9iaCA9IE5VTEw7CisJc3Bpbl91bmxvY2soJmRxX2RhdGFfbG9jayk7Cit9CisKKy8qIFJlYWQgaW5mb3JtYXRpb24gaGVhZGVyIGZyb20gZ2xvYmFsIHF1b3RhIGZpbGUgKi8KK2ludCBvY2ZzMl9nbG9iYWxfcmVhZF9pbmZvKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQoreworCXN0cnVjdCBpbm9kZSAqZ3Fpbm9kZSA9IE5VTEw7CisJdW5zaWduZWQgaW50IGlub1tNQVhRVU9UQVNdID0geyBVU0VSX1FVT1RBX1NZU1RFTV9JTk9ERSwKKwkJCQkJR1JPVVBfUVVPVEFfU1lTVEVNX0lOT0RFIH07CisJc3RydWN0IG9jZnMyX2dsb2JhbF9kaXNrX2RxaW5mbyBkaW5mbzsKKwlzdHJ1Y3QgbWVtX2RxaW5mbyAqaW5mbyA9IHNiX2RxaW5mbyhzYiwgdHlwZSk7CisJc3RydWN0IG9jZnMyX21lbV9kcWluZm8gKm9pbmZvID0gaW5mby0+ZHFpX3ByaXY7CisJaW50IHN0YXR1czsKKworCW1sb2dfZW50cnlfdm9pZCgpOworCisJLyogUmVhZCBnbG9iYWwgaGVhZGVyICovCisJZ3Fpbm9kZSA9IG9jZnMyX2dldF9zeXN0ZW1fZmlsZV9pbm9kZShPQ0ZTMl9TQihzYiksIGlub1t0eXBlXSwKKwkJCU9DRlMyX0lOVkFMSURfU0xPVCk7CisJaWYgKCFncWlub2RlKSB7CisJCW1sb2coTUxfRVJST1IsICJmYWlsZWQgdG8gZ2V0IGdsb2JhbCBxdW90YSBpbm9kZSAodHlwZT0lZClcbiIsCisJCQl0eXBlKTsKKwkJc3RhdHVzID0gLUVJTlZBTDsKKwkJZ290byBvdXRfZXJyOworCX0KKwlvaW5mby0+ZHFpX2dpLmRxaV9zYiA9IHNiOworCW9pbmZvLT5kcWlfZ2kuZHFpX3R5cGUgPSB0eXBlOworCW9jZnMyX3FpbmZvX2xvY2tfcmVzX2luaXQoJm9pbmZvLT5kcWlfZ3Fsb2NrLCBvaW5mbyk7CisJb2luZm8tPmRxaV9naS5kcWlfZW50cnlfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgb2NmczJfZ2xvYmFsX2Rpc2tfZHFibGspOworCW9pbmZvLT5kcWlfZ2kuZHFpX29wcyA9ICZvY2ZzMl9nbG9iYWxfb3BzOworCW9pbmZvLT5kcWlfZ3FpX2JoID0gTlVMTDsKKwlvaW5mby0+ZHFpX2dxaV9jb3VudCA9IDA7CisJb2luZm8tPmRxaV9ncWlub2RlID0gZ3Fpbm9kZTsKKwlzdGF0dXMgPSBvY2ZzMl9sb2NrX2dsb2JhbF9xZihvaW5mbywgMCk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIG91dF9lcnI7CisJfQorCXN0YXR1cyA9IHNiLT5zX29wLT5xdW90YV9yZWFkKHNiLCB0eXBlLCAoY2hhciAqKSZkaW5mbywKKwkJCQkgICAgICBzaXplb2Yoc3RydWN0IG9jZnMyX2dsb2JhbF9kaXNrX2RxaW5mbyksCisJCQkJICAgICAgT0NGUzJfR0xPQkFMX0lORk9fT0ZGKTsKKwlvY2ZzMl91bmxvY2tfZ2xvYmFsX3FmKG9pbmZvLCAwKTsKKwlpZiAoc3RhdHVzICE9IHNpemVvZihzdHJ1Y3Qgb2NmczJfZ2xvYmFsX2Rpc2tfZHFpbmZvKSkgeworCQltbG9nKE1MX0VSUk9SLCAiQ2Fubm90IHJlYWQgZ2xvYmFsIHF1b3RhIGluZm8gKCVkKS5cbiIsCisJCSAgICAgc3RhdHVzKTsKKwkJaWYgKHN0YXR1cyA+PSAwKQorCQkJc3RhdHVzID0gLUVJTzsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIG91dF9lcnI7CisJfQorCWluZm8tPmRxaV9iZ3JhY2UgPSBsZTMyX3RvX2NwdShkaW5mby5kcWlfYmdyYWNlKTsKKwlpbmZvLT5kcWlfaWdyYWNlID0gbGUzMl90b19jcHUoZGluZm8uZHFpX2lncmFjZSk7CisJb2luZm8tPmRxaV9zeW5jbXMgPSBsZTMyX3RvX2NwdShkaW5mby5kcWlfc3luY21zKTsKKwlvaW5mby0+ZHFpX3N5bmNqaWZmID0gbXNlY3NfdG9famlmZmllcyhvaW5mby0+ZHFpX3N5bmNtcyk7CisJb2luZm8tPmRxaV9naS5kcWlfYmxvY2tzID0gbGUzMl90b19jcHUoZGluZm8uZHFpX2Jsb2Nrcyk7CisJb2luZm8tPmRxaV9naS5kcWlfZnJlZV9ibGsgPSBsZTMyX3RvX2NwdShkaW5mby5kcWlfZnJlZV9ibGspOworCW9pbmZvLT5kcWlfZ2kuZHFpX2ZyZWVfZW50cnkgPSBsZTMyX3RvX2NwdShkaW5mby5kcWlfZnJlZV9lbnRyeSk7CisJb2luZm8tPmRxaV9naS5kcWlfYmxvY2tzaXplX2JpdHMgPSBzYi0+c19ibG9ja3NpemVfYml0czsKKwlvaW5mby0+ZHFpX2dpLmRxaV91c2FibGVfYnMgPSBzYi0+c19ibG9ja3NpemUgLQorCQkJCQkJT0NGUzJfUUJMS19SRVNFUlZFRF9TUEFDRTsKKwlvaW5mby0+ZHFpX2dpLmRxaV9xdHJlZV9kZXB0aCA9IHF0cmVlX2RlcHRoKCZvaW5mby0+ZHFpX2dpKTsKKwlJTklUX0RFTEFZRURfV09SSygmb2luZm8tPmRxaV9zeW5jX3dvcmssIHFzeW5jX3dvcmtfZm4pOworCXF1ZXVlX2RlbGF5ZWRfd29yayhvY2ZzMl9xdW90YV93cSwgJm9pbmZvLT5kcWlfc3luY193b3JrLAorCQkJICAgb2luZm8tPmRxaV9zeW5jamlmZik7CisKK291dF9lcnI6CisJbWxvZ19leGl0KHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogV3JpdGUgaW5mb3JtYXRpb24gdG8gZ2xvYmFsIHF1b3RhIGZpbGUuIEV4cGVjdHMgZXhsdXNpdmUgbG9jayBvbiBxdW90YQorICogZmlsZSBpbm9kZSBhbmQgcXVvdGEgaW5mbyAqLworc3RhdGljIGludCBfX29jZnMyX2dsb2JhbF93cml0ZV9pbmZvKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQoreworCXN0cnVjdCBtZW1fZHFpbmZvICppbmZvID0gc2JfZHFpbmZvKHNiLCB0eXBlKTsKKwlzdHJ1Y3Qgb2NmczJfbWVtX2RxaW5mbyAqb2luZm8gPSBpbmZvLT5kcWlfcHJpdjsKKwlzdHJ1Y3Qgb2NmczJfZ2xvYmFsX2Rpc2tfZHFpbmZvIGRpbmZvOworCXNzaXplX3Qgc2l6ZTsKKworCXNwaW5fbG9jaygmZHFfZGF0YV9sb2NrKTsKKwlpbmZvLT5kcWlfZmxhZ3MgJj0gfkRRRl9JTkZPX0RJUlRZOworCWRpbmZvLmRxaV9iZ3JhY2UgPSBjcHVfdG9fbGUzMihpbmZvLT5kcWlfYmdyYWNlKTsKKwlkaW5mby5kcWlfaWdyYWNlID0gY3B1X3RvX2xlMzIoaW5mby0+ZHFpX2lncmFjZSk7CisJc3Bpbl91bmxvY2soJmRxX2RhdGFfbG9jayk7CisJZGluZm8uZHFpX3N5bmNtcyA9IGNwdV90b19sZTMyKG9pbmZvLT5kcWlfc3luY21zKTsKKwlkaW5mby5kcWlfYmxvY2tzID0gY3B1X3RvX2xlMzIob2luZm8tPmRxaV9naS5kcWlfYmxvY2tzKTsKKwlkaW5mby5kcWlfZnJlZV9ibGsgPSBjcHVfdG9fbGUzMihvaW5mby0+ZHFpX2dpLmRxaV9mcmVlX2Jsayk7CisJZGluZm8uZHFpX2ZyZWVfZW50cnkgPSBjcHVfdG9fbGUzMihvaW5mby0+ZHFpX2dpLmRxaV9mcmVlX2VudHJ5KTsKKwlzaXplID0gc2ItPnNfb3AtPnF1b3RhX3dyaXRlKHNiLCB0eXBlLCAoY2hhciAqKSZkaW5mbywKKwkJCQkgICAgIHNpemVvZihzdHJ1Y3Qgb2NmczJfZ2xvYmFsX2Rpc2tfZHFpbmZvKSwKKwkJCQkgICAgIE9DRlMyX0dMT0JBTF9JTkZPX09GRik7CisJaWYgKHNpemUgIT0gc2l6ZW9mKHN0cnVjdCBvY2ZzMl9nbG9iYWxfZGlza19kcWluZm8pKSB7CisJCW1sb2coTUxfRVJST1IsICJDYW5ub3Qgd3JpdGUgZ2xvYmFsIHF1b3RhIGluZm8gc3RydWN0dXJlXG4iKTsKKwkJaWYgKHNpemUgPj0gMCkKKwkJCXNpemUgPSAtRUlPOworCQlyZXR1cm4gc2l6ZTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBvY2ZzMl9nbG9iYWxfd3JpdGVfaW5mbyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvICppbmZvID0gc2JfZHFpbmZvKHNiLCB0eXBlKS0+ZHFpX3ByaXY7CisKKwllcnIgPSBvY2ZzMl9xaW5mb19sb2NrKGluZm8sIDEpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWVyciA9IF9fb2NmczJfZ2xvYmFsX3dyaXRlX2luZm8oc2IsIHR5cGUpOworCW9jZnMyX3FpbmZvX3VubG9jayhpbmZvLCAxKTsKKwlyZXR1cm4gZXJyOworfQorCisvKiBSZWFkIGluIGluZm9ybWF0aW9uIGZyb20gZ2xvYmFsIHF1b3RhIGZpbGUgYW5kIGFjcXVpcmUgYSByZWZlcmVuY2UgdG8gaXQuCisgKiBkcXVvdF9hY3F1aXJlKCkgaGFzIGFscmVhZHkgc3RhcnRlZCB0aGUgdHJhbnNhY3Rpb24gYW5kIGxvY2tlZCBxdW90YSBmaWxlICovCitpbnQgb2NmczJfZ2xvYmFsX3JlYWRfZHF1b3Qoc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwlpbnQgZXJyLCBlcnIyLCBleCA9IDA7CisJc3RydWN0IG9jZnMyX21lbV9kcWluZm8gKmluZm8gPQorCQkJc2JfZHFpbmZvKGRxdW90LT5kcV9zYiwgZHF1b3QtPmRxX3R5cGUpLT5kcWlfcHJpdjsKKworCWVyciA9IG9jZnMyX3FpbmZvX2xvY2soaW5mbywgMCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OworCWVyciA9IHF0cmVlX3JlYWRfZHF1b3QoJmluZm8tPmRxaV9naSwgZHF1b3QpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dF9xbG9jazsKKwlPQ0ZTMl9EUVVPVChkcXVvdCktPmRxX3VzZV9jb3VudCsrOworCU9DRlMyX0RRVU9UKGRxdW90KS0+ZHFfb3JpZ3NwYWNlID0gZHF1b3QtPmRxX2RxYi5kcWJfY3Vyc3BhY2U7CisJT0NGUzJfRFFVT1QoZHF1b3QpLT5kcV9vcmlnaW5vZGVzID0gZHF1b3QtPmRxX2RxYi5kcWJfY3VyaW5vZGVzOworCWlmICghZHF1b3QtPmRxX29mZikgewkvKiBObyByZWFsIHF1b3RhIGVudHJ5PyAqLworCQkvKiBVcGdyYWRlIHRvIGV4Y2x1c2l2ZSBsb2NrIGZvciBhbGxvY2F0aW9uICovCisJCWVyciA9IG9jZnMyX3FpbmZvX2xvY2soaW5mbywgMSk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBvdXRfcWxvY2s7CisJCWV4ID0gMTsKKwl9CisJZXJyID0gcXRyZWVfd3JpdGVfZHF1b3QoJmluZm8tPmRxaV9naSwgZHF1b3QpOworCWlmIChleCAmJiBpbmZvX2RpcnR5KHNiX2RxaW5mbyhkcXVvdC0+ZHFfc2IsIGRxdW90LT5kcV90eXBlKSkpIHsKKwkJZXJyMiA9IF9fb2NmczJfZ2xvYmFsX3dyaXRlX2luZm8oZHF1b3QtPmRxX3NiLCBkcXVvdC0+ZHFfdHlwZSk7CisJCWlmICghZXJyKQorCQkJZXJyID0gZXJyMjsKKwl9CitvdXRfcWxvY2s6CisJaWYgKGV4KQorCQlvY2ZzMl9xaW5mb191bmxvY2soaW5mbywgMSk7CisJb2NmczJfcWluZm9fdW5sb2NrKGluZm8sIDApOworb3V0OgorCWlmIChlcnIgPCAwKQorCQltbG9nX2Vycm5vKGVycik7CisJcmV0dXJuIGVycjsKK30KKworLyogU3luYyBsb2NhbCBpbmZvcm1hdGlvbiBhYm91dCBxdW90YSBtb2RpZmljYXRpb25zIHdpdGggZ2xvYmFsIHF1b3RhIGZpbGUuCisgKiBDYWxsZXIgbXVzdCBoYXZlIHN0YXJ0ZWQgdGhlIHRyYW5zYWN0aW9uIGFuZCBvYnRhaW5lZCBleGNsdXNpdmUgbG9jayBmb3IKKyAqIGdsb2JhbCBxdW90YSBmaWxlIGlub2RlICovCitpbnQgX19vY2ZzMl9zeW5jX2RxdW90KHN0cnVjdCBkcXVvdCAqZHF1b3QsIGludCBmcmVlaW5nKQoreworCWludCBlcnIsIGVycjI7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRxdW90LT5kcV9zYjsKKwlpbnQgdHlwZSA9IGRxdW90LT5kcV90eXBlOworCXN0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvICppbmZvID0gc2JfZHFpbmZvKHNiLCB0eXBlKS0+ZHFpX3ByaXY7CisJc3RydWN0IG9jZnMyX2dsb2JhbF9kaXNrX2RxYmxrIGRxYmxrOworCXM2NCBzcGFjZWNoYW5nZSwgaW5vZGVjaGFuZ2U7CisJdGltZV90IG9sZGl0aW1lLCBvbGRidGltZTsKKworCWVyciA9IHNiLT5zX29wLT5xdW90YV9yZWFkKHNiLCB0eXBlLCAoY2hhciAqKSZkcWJsaywKKwkJCQkgICBzaXplb2Yoc3RydWN0IG9jZnMyX2dsb2JhbF9kaXNrX2RxYmxrKSwKKwkJCQkgICBkcXVvdC0+ZHFfb2ZmKTsKKwlpZiAoZXJyICE9IHNpemVvZihzdHJ1Y3Qgb2NmczJfZ2xvYmFsX2Rpc2tfZHFibGspKSB7CisJCWlmIChlcnIgPj0gMCkgeworCQkJbWxvZyhNTF9FUlJPUiwgIlNob3J0IHJlYWQgZnJvbSBnbG9iYWwgcXVvdGEgZmlsZSAiCisJCQkJICAgICAgICIoJXUgcmVhZClcbiIsIGVycik7CisJCQllcnIgPSAtRUlPOworCQl9CisJCWdvdG8gb3V0OworCX0KKworCS8qIFVwZGF0ZSBzcGFjZSBhbmQgaW5vZGUgdXNhZ2UuIEdldCBhbHNvIG90aGVyIGluZm9ybWF0aW9uIGZyb20KKwkgKiBnbG9iYWwgcXVvdGEgZmlsZSBzbyB0aGF0IHdlIGRvbid0IG92ZXJ3cml0ZSBhbnkgY2hhbmdlcyB0aGVyZS4KKwkgKiBXZSBhcmUgKi8KKwlzcGluX2xvY2soJmRxX2RhdGFfbG9jayk7CisJc3BhY2VjaGFuZ2UgPSBkcXVvdC0+ZHFfZHFiLmRxYl9jdXJzcGFjZSAtCisJCQkJCU9DRlMyX0RRVU9UKGRxdW90KS0+ZHFfb3JpZ3NwYWNlOworCWlub2RlY2hhbmdlID0gZHF1b3QtPmRxX2RxYi5kcWJfY3VyaW5vZGVzIC0KKwkJCQkJT0NGUzJfRFFVT1QoZHF1b3QpLT5kcV9vcmlnaW5vZGVzOworCW9sZGl0aW1lID0gZHF1b3QtPmRxX2RxYi5kcWJfaXRpbWU7CisJb2xkYnRpbWUgPSBkcXVvdC0+ZHFfZHFiLmRxYl9idGltZTsKKwlvY2ZzMl9nbG9iYWxfZGlzazJtZW1kcWIoZHF1b3QsICZkcWJsayk7CisJbWxvZygwLCAiU3luY2luZyBnbG9iYWwgZHF1b3QgJXUgc3BhY2UgJWxsZCslbGxkLCBpbm9kZXMgJWxsZCslbGxkXG4iLAorCSAgICAgZHF1b3QtPmRxX2lkLCBkcXVvdC0+ZHFfZHFiLmRxYl9jdXJzcGFjZSwgKGxvbmcgbG9uZylzcGFjZWNoYW5nZSwKKwkgICAgIGRxdW90LT5kcV9kcWIuZHFiX2N1cmlub2RlcywgKGxvbmcgbG9uZylpbm9kZWNoYW5nZSk7CisJaWYgKCF0ZXN0X2JpdChEUV9MQVNUU0VUX0IgKyBRSUZfU1BBQ0VfQiwgJmRxdW90LT5kcV9mbGFncykpCisJCWRxdW90LT5kcV9kcWIuZHFiX2N1cnNwYWNlICs9IHNwYWNlY2hhbmdlOworCWlmICghdGVzdF9iaXQoRFFfTEFTVFNFVF9CICsgUUlGX0lOT0RFU19CLCAmZHF1b3QtPmRxX2ZsYWdzKSkKKwkJZHF1b3QtPmRxX2RxYi5kcWJfY3VyaW5vZGVzICs9IGlub2RlY2hhbmdlOworCS8qIFNldCBwcm9wZXJseSBzcGFjZSBncmFjZSB0aW1lLi4uICovCisJaWYgKGRxdW90LT5kcV9kcWIuZHFiX2Jzb2Z0bGltaXQgJiYKKwkgICAgZHF1b3QtPmRxX2RxYi5kcWJfY3Vyc3BhY2UgPiBkcXVvdC0+ZHFfZHFiLmRxYl9ic29mdGxpbWl0KSB7CisJCWlmICghdGVzdF9iaXQoRFFfTEFTVFNFVF9CICsgUUlGX0JUSU1FX0IsICZkcXVvdC0+ZHFfZmxhZ3MpICYmCisJCSAgICBvbGRidGltZSA+IDApIHsKKwkJCWlmIChkcXVvdC0+ZHFfZHFiLmRxYl9idGltZSA+IDApCisJCQkJZHF1b3QtPmRxX2RxYi5kcWJfYnRpbWUgPQorCQkJCQltaW4oZHF1b3QtPmRxX2RxYi5kcWJfYnRpbWUsIG9sZGJ0aW1lKTsKKwkJCWVsc2UKKwkJCQlkcXVvdC0+ZHFfZHFiLmRxYl9idGltZSA9IG9sZGJ0aW1lOworCQl9CisJfSBlbHNlIHsKKwkJZHF1b3QtPmRxX2RxYi5kcWJfYnRpbWUgPSAwOworCQljbGVhcl9iaXQoRFFfQkxLU19CLCAmZHF1b3QtPmRxX2ZsYWdzKTsKKwl9CisJLyogU2V0IHByb3Blcmx5IGlub2RlIGdyYWNlIHRpbWUuLi4gKi8KKwlpZiAoZHF1b3QtPmRxX2RxYi5kcWJfaXNvZnRsaW1pdCAmJgorCSAgICBkcXVvdC0+ZHFfZHFiLmRxYl9jdXJpbm9kZXMgPiBkcXVvdC0+ZHFfZHFiLmRxYl9pc29mdGxpbWl0KSB7CisJCWlmICghdGVzdF9iaXQoRFFfTEFTVFNFVF9CICsgUUlGX0lUSU1FX0IsICZkcXVvdC0+ZHFfZmxhZ3MpICYmCisJCSAgICBvbGRpdGltZSA+IDApIHsKKwkJCWlmIChkcXVvdC0+ZHFfZHFiLmRxYl9pdGltZSA+IDApCisJCQkJZHF1b3QtPmRxX2RxYi5kcWJfaXRpbWUgPQorCQkJCQltaW4oZHF1b3QtPmRxX2RxYi5kcWJfaXRpbWUsIG9sZGl0aW1lKTsKKwkJCWVsc2UKKwkJCQlkcXVvdC0+ZHFfZHFiLmRxYl9pdGltZSA9IG9sZGl0aW1lOworCQl9CisJfSBlbHNlIHsKKwkJZHF1b3QtPmRxX2RxYi5kcWJfaXRpbWUgPSAwOworCQljbGVhcl9iaXQoRFFfSU5PREVTX0IsICZkcXVvdC0+ZHFfZmxhZ3MpOworCX0KKwkvKiBBbGwgaW5mb3JtYXRpb24gaXMgcHJvcGVybHkgdXBkYXRlZCwgY2xlYXIgdGhlIGZsYWdzICovCisJX19jbGVhcl9iaXQoRFFfTEFTVFNFVF9CICsgUUlGX1NQQUNFX0IsICZkcXVvdC0+ZHFfZmxhZ3MpOworCV9fY2xlYXJfYml0KERRX0xBU1RTRVRfQiArIFFJRl9JTk9ERVNfQiwgJmRxdW90LT5kcV9mbGFncyk7CisJX19jbGVhcl9iaXQoRFFfTEFTVFNFVF9CICsgUUlGX0JMSU1JVFNfQiwgJmRxdW90LT5kcV9mbGFncyk7CisJX19jbGVhcl9iaXQoRFFfTEFTVFNFVF9CICsgUUlGX0lMSU1JVFNfQiwgJmRxdW90LT5kcV9mbGFncyk7CisJX19jbGVhcl9iaXQoRFFfTEFTVFNFVF9CICsgUUlGX0JUSU1FX0IsICZkcXVvdC0+ZHFfZmxhZ3MpOworCV9fY2xlYXJfYml0KERRX0xBU1RTRVRfQiArIFFJRl9JVElNRV9CLCAmZHF1b3QtPmRxX2ZsYWdzKTsKKwlPQ0ZTMl9EUVVPVChkcXVvdCktPmRxX29yaWdzcGFjZSA9IGRxdW90LT5kcV9kcWIuZHFiX2N1cnNwYWNlOworCU9DRlMyX0RRVU9UKGRxdW90KS0+ZHFfb3JpZ2lub2RlcyA9IGRxdW90LT5kcV9kcWIuZHFiX2N1cmlub2RlczsKKwlzcGluX3VubG9jaygmZHFfZGF0YV9sb2NrKTsKKwllcnIgPSBvY2ZzMl9xaW5mb19sb2NrKGluZm8sIGZyZWVpbmcpOworCWlmIChlcnIgPCAwKSB7CisJCW1sb2coTUxfRVJST1IsICJGYWlsZWQgdG8gbG9jayBxdW90YSBpbmZvLCBsb29zaW5nIHF1b3RhIHdyaXRlIgorCQkJICAgICAgICIgKHR5cGU9JWQsIGlkPSV1KVxuIiwgZHF1b3QtPmRxX3R5cGUsCisJCQkgICAgICAgKHVuc2lnbmVkKWRxdW90LT5kcV9pZCk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoZnJlZWluZykKKwkJT0NGUzJfRFFVT1QoZHF1b3QpLT5kcV91c2VfY291bnQtLTsKKwllcnIgPSBxdHJlZV93cml0ZV9kcXVvdCgmaW5mby0+ZHFpX2dpLCBkcXVvdCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0X3Fsb2NrOworCWlmIChmcmVlaW5nICYmICFPQ0ZTMl9EUVVPVChkcXVvdCktPmRxX3VzZV9jb3VudCkgeworCQllcnIgPSBxdHJlZV9yZWxlYXNlX2RxdW90KCZpbmZvLT5kcWlfZ2ksIGRxdW90KTsKKwkJaWYgKGluZm9fZGlydHkoc2JfZHFpbmZvKHNiLCB0eXBlKSkpIHsKKwkJCWVycjIgPSBfX29jZnMyX2dsb2JhbF93cml0ZV9pbmZvKHNiLCB0eXBlKTsKKwkJCWlmICghZXJyKQorCQkJCWVyciA9IGVycjI7CisJCX0KKwl9CitvdXRfcWxvY2s6CisJb2NmczJfcWluZm9fdW5sb2NrKGluZm8sIGZyZWVpbmcpOworb3V0OgorCWlmIChlcnIgPCAwKQorCQltbG9nX2Vycm5vKGVycik7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqICBGdW5jdGlvbnMgZm9yIHBlcmlvZGljIHN5bmNpbmcgb2YgZHF1b3RzIHdpdGggZ2xvYmFsIGZpbGUKKyAqLworc3RhdGljIGludCBvY2ZzMl9zeW5jX2RxdW90X2hlbHBlcihzdHJ1Y3QgZHF1b3QgKmRxdW90LCB1bnNpZ25lZCBsb25nIHR5cGUpCit7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZHF1b3QtPmRxX3NiOworCXN0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvICpvaW5mbyA9IHNiX2RxaW5mbyhzYiwgdHlwZSktPmRxaV9wcml2OworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0Ioc2IpOworCWludCBzdGF0dXMgPSAwOworCisJbWxvZ19lbnRyeSgiaWQ9JXUgcXR5cGU9JXUgdHlwZT0lbHUgZGV2aWNlPSVzXG4iLCBkcXVvdC0+ZHFfaWQsCisJCSAgIGRxdW90LT5kcV90eXBlLCB0eXBlLCBzYi0+c19pZCk7CisJaWYgKHR5cGUgIT0gZHF1b3QtPmRxX3R5cGUpCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IG9jZnMyX2xvY2tfZ2xvYmFsX3FmKG9pbmZvLCAxKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBvdXQ7CisKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX1FTWU5DX0NSRURJVFMpOworCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQlzdGF0dXMgPSBQVFJfRVJSKGhhbmRsZSk7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBvdXRfaWxvY2s7CisJfQorCW11dGV4X2xvY2soJnNiX2Rxb3B0KHNiKS0+ZHFpb19tdXRleCk7CisJc3RhdHVzID0gb2NmczJfc3luY19kcXVvdChkcXVvdCk7CisJbXV0ZXhfdW5sb2NrKCZzYl9kcW9wdChzYiktPmRxaW9fbXV0ZXgpOworCWlmIChzdGF0dXMgPCAwKQorCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJLyogV2UgaGF2ZSB0byB3cml0ZSBsb2NhbCBzdHJ1Y3R1cmUgYXMgd2VsbC4uLiAqLworCWRxdW90X21hcmtfZHF1b3RfZGlydHkoZHF1b3QpOworCXN0YXR1cyA9IGRxdW90X2NvbW1pdChkcXVvdCk7CisJaWYgKHN0YXR1cyA8IDApCisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOworb3V0X2lsb2NrOgorCW9jZnMyX3VubG9ja19nbG9iYWxfcWYob2luZm8sIDEpOworb3V0OgorCW1sb2dfZXhpdChzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIHFzeW5jX3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvICpvaW5mbyA9IGNvbnRhaW5lcl9vZih3b3JrLAorCQkJCQkJICAgICAgc3RydWN0IG9jZnMyX21lbV9kcWluZm8sCisJCQkJCQkgICAgICBkcWlfc3luY193b3JrLndvcmspOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBvaW5mby0+ZHFpX2dxaW5vZGUtPmlfc2I7CisKKwlkcXVvdF9zY2FuX2FjdGl2ZShzYiwgb2NmczJfc3luY19kcXVvdF9oZWxwZXIsIG9pbmZvLT5kcWlfdHlwZSk7CisJcXVldWVfZGVsYXllZF93b3JrKG9jZnMyX3F1b3RhX3dxLCAmb2luZm8tPmRxaV9zeW5jX3dvcmssCisJCQkgICBvaW5mby0+ZHFpX3N5bmNqaWZmKTsKK30KKworLyoKKyAqICBXcmFwcGVycyBmb3IgZ2VuZXJpYyBxdW90YSBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW50IG9jZnMyX3dyaXRlX2RxdW90KHN0cnVjdCBkcXVvdCAqZHF1b3QpCit7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGRxdW90LT5kcV9zYik7CisJaW50IHN0YXR1cyA9IDA7CisKKwltbG9nX2VudHJ5KCJpZD0ldSwgdHlwZT0lZCIsIGRxdW90LT5kcV9pZCwgZHF1b3QtPmRxX3R5cGUpOworCisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9RV1JJVEVfQ1JFRElUUyk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCXN0YXR1cyA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIG91dDsKKwl9CisJc3RhdHVzID0gZHF1b3RfY29tbWl0KGRxdW90KTsKKwlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOworb3V0OgorCW1sb2dfZXhpdChzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK2ludCBvY2ZzMl9jYWxjX3FkZWxfY3JlZGl0cyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3Qgb2NmczJfbWVtX2RxaW5mbyAqb2luZm87CisJaW50IGZlYXR1cmVzW01BWFFVT1RBU10gPSB7IE9DRlMyX0ZFQVRVUkVfUk9fQ09NUEFUX1VTUlFVT1RBLAorCQkJCSAgICBPQ0ZTMl9GRUFUVVJFX1JPX0NPTVBBVF9HUlBRVU9UQSB9OworCisJaWYgKCFPQ0ZTMl9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsIGZlYXR1cmVzW3R5cGVdKSkKKwkJcmV0dXJuIDA7CisKKwlvaW5mbyA9IHNiX2RxaW5mbyhzYiwgdHlwZSktPmRxaV9wcml2OworCS8qIFdlIG1vZGlmeSB0cmVlLCBsZWFmIGJsb2NrLCBnbG9iYWwgaW5mbywgbG9jYWwgY2h1bmsgaGVhZGVyLAorCSAqIGdsb2JhbCBhbmQgbG9jYWwgaW5vZGUgKi8KKwlyZXR1cm4gb2luZm8tPmRxaV9naS5kcWlfcXRyZWVfZGVwdGggKyAyICsgMSArCisJICAgICAgIDIgKiBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUzsKK30KKworc3RhdGljIGludCBvY2ZzMl9yZWxlYXNlX2RxdW90KHN0cnVjdCBkcXVvdCAqZHF1b3QpCit7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlzdHJ1Y3Qgb2NmczJfbWVtX2RxaW5mbyAqb2luZm8gPQorCQkJc2JfZHFpbmZvKGRxdW90LT5kcV9zYiwgZHF1b3QtPmRxX3R5cGUpLT5kcWlfcHJpdjsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGRxdW90LT5kcV9zYik7CisJaW50IHN0YXR1cyA9IDA7CisKKwltbG9nX2VudHJ5KCJpZD0ldSwgdHlwZT0lZCIsIGRxdW90LT5kcV9pZCwgZHF1b3QtPmRxX3R5cGUpOworCisJc3RhdHVzID0gb2NmczJfbG9ja19nbG9iYWxfcWYob2luZm8sIDEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIG91dDsKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsCisJCW9jZnMyX2NhbGNfcWRlbF9jcmVkaXRzKGRxdW90LT5kcV9zYiwgZHF1b3QtPmRxX3R5cGUpKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJc3RhdHVzID0gUFRSX0VSUihoYW5kbGUpOworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gb3V0X2lsb2NrOworCX0KKwlzdGF0dXMgPSBkcXVvdF9yZWxlYXNlKGRxdW90KTsKKwlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOworb3V0X2lsb2NrOgorCW9jZnMyX3VubG9ja19nbG9iYWxfcWYob2luZm8sIDEpOworb3V0OgorCW1sb2dfZXhpdChzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK2ludCBvY2ZzMl9jYWxjX3Fpbml0X2NyZWRpdHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpCit7CisJc3RydWN0IG9jZnMyX21lbV9kcWluZm8gKm9pbmZvOworCWludCBmZWF0dXJlc1tNQVhRVU9UQVNdID0geyBPQ0ZTMl9GRUFUVVJFX1JPX0NPTVBBVF9VU1JRVU9UQSwKKwkJCQkgICAgT0NGUzJfRkVBVFVSRV9ST19DT01QQVRfR1JQUVVPVEEgfTsKKwlzdHJ1Y3Qgb2NmczJfZGlub2RlICpsZmUsICpnZmU7CisKKwlpZiAoIU9DRlMyX0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwgZmVhdHVyZXNbdHlwZV0pKQorCQlyZXR1cm4gMDsKKworCW9pbmZvID0gc2JfZHFpbmZvKHNiLCB0eXBlKS0+ZHFpX3ByaXY7CisJZ2ZlID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKilvaW5mby0+ZHFpX2dxaV9iaC0+Yl9kYXRhOworCWxmZSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopb2luZm8tPmRxaV9scWlfYmgtPmJfZGF0YTsKKwkvKiBXZSBjYW4gZXh0ZW5kIGxvY2FsIGZpbGUgKyBnbG9iYWwgZmlsZS4gSW4gbG9jYWwgZmlsZSB3ZQorCSAqIGNhbiBtb2RpZnkgaW5mbywgY2h1bmsgaGVhZGVyIGJsb2NrIGFuZCBkcXVvdCBibG9jay4gSW4KKwkgKiBnbG9iYWwgZmlsZSB3ZSBjYW4gbW9kaWZ5IGluZm8sIHRyZWUgYW5kIGxlYWYgYmxvY2sgKi8KKwlyZXR1cm4gb2NmczJfY2FsY19leHRlbmRfY3JlZGl0cyhzYiwgJmxmZS0+aWQyLmlfbGlzdCwgMCkgKworCSAgICAgICBvY2ZzMl9jYWxjX2V4dGVuZF9jcmVkaXRzKHNiLCAmZ2ZlLT5pZDIuaV9saXN0LCAwKSArCisJICAgICAgIDMgKyBvaW5mby0+ZHFpX2dpLmRxaV9xdHJlZV9kZXB0aCArIDI7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfYWNxdWlyZV9kcXVvdChzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCWhhbmRsZV90ICpoYW5kbGU7CisJc3RydWN0IG9jZnMyX21lbV9kcWluZm8gKm9pbmZvID0KKwkJCXNiX2RxaW5mbyhkcXVvdC0+ZHFfc2IsIGRxdW90LT5kcV90eXBlKS0+ZHFpX3ByaXY7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihkcXVvdC0+ZHFfc2IpOworCWludCBzdGF0dXMgPSAwOworCisJbWxvZ19lbnRyeSgiaWQ9JXUsIHR5cGU9JWQiLCBkcXVvdC0+ZHFfaWQsIGRxdW90LT5kcV90eXBlKTsKKwkvKiBXZSBuZWVkIGFuIGV4Y2x1c2l2ZSBsb2NrLCBiZWNhdXNlIHdlJ3JlIGdvaW5nIHRvIHVwZGF0ZSB1c2UgY291bnQKKwkgKiBhbmQgaW5zdGFudGlhdGUgcG9zc2libHkgbmV3IGRxdW90IHN0cnVjdHVyZSAqLworCXN0YXR1cyA9IG9jZnMyX2xvY2tfZ2xvYmFsX3FmKG9pbmZvLCAxKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBvdXQ7CisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLAorCQlvY2ZzMl9jYWxjX3Fpbml0X2NyZWRpdHMoZHF1b3QtPmRxX3NiLCBkcXVvdC0+ZHFfdHlwZSkpOworCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQlzdGF0dXMgPSBQVFJfRVJSKGhhbmRsZSk7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBvdXRfaWxvY2s7CisJfQorCXN0YXR1cyA9IGRxdW90X2FjcXVpcmUoZHF1b3QpOworCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CitvdXRfaWxvY2s6CisJb2NmczJfdW5sb2NrX2dsb2JhbF9xZihvaW5mbywgMSk7CitvdXQ6CisJbWxvZ19leGl0KHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBvY2ZzMl9tYXJrX2RxdW90X2RpcnR5KHN0cnVjdCBkcXVvdCAqZHF1b3QpCit7CisJdW5zaWduZWQgbG9uZyBtYXNrID0gKDEgPDwgKERRX0xBU1RTRVRfQiArIFFJRl9JTElNSVRTX0IpKSB8CisJCQkgICAgICgxIDw8IChEUV9MQVNUU0VUX0IgKyBRSUZfQkxJTUlUU19CKSkgfAorCQkJICAgICAoMSA8PCAoRFFfTEFTVFNFVF9CICsgUUlGX0lOT0RFU19CKSkgfAorCQkJICAgICAoMSA8PCAoRFFfTEFTVFNFVF9CICsgUUlGX1NQQUNFX0IpKSB8CisJCQkgICAgICgxIDw8IChEUV9MQVNUU0VUX0IgKyBRSUZfQlRJTUVfQikpIHwKKwkJCSAgICAgKDEgPDwgKERRX0xBU1RTRVRfQiArIFFJRl9JVElNRV9CKSk7CisJaW50IHN5bmMgPSAwOworCWludCBzdGF0dXM7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRxdW90LT5kcV9zYjsKKwlpbnQgdHlwZSA9IGRxdW90LT5kcV90eXBlOworCXN0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvICpvaW5mbyA9IHNiX2RxaW5mbyhzYiwgdHlwZSktPmRxaV9wcml2OworCWhhbmRsZV90ICpoYW5kbGU7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihzYik7CisKKwltbG9nX2VudHJ5KCJpZD0ldSwgdHlwZT0lZCIsIGRxdW90LT5kcV9pZCwgdHlwZSk7CisJZHF1b3RfbWFya19kcXVvdF9kaXJ0eShkcXVvdCk7CisKKwkvKiBJbiBjYXNlIHVzZXIgc2V0IHNvbWUgbGltaXRzLCBzeW5jIGRxdW90IGltbWVkaWF0ZWx5IHRvIGdsb2JhbAorCSAqIHF1b3RhIGZpbGUgc28gdGhhdCBpbmZvcm1hdGlvbiBwcm9wYWdhdGVzIHF1aWNrZXIgKi8KKwlzcGluX2xvY2soJmRxX2RhdGFfbG9jayk7CisJaWYgKGRxdW90LT5kcV9mbGFncyAmIG1hc2spCisJCXN5bmMgPSAxOworCXNwaW5fdW5sb2NrKCZkcV9kYXRhX2xvY2spOworCWlmICghc3luYykgeworCQlzdGF0dXMgPSBvY2ZzMl93cml0ZV9kcXVvdChkcXVvdCk7CisJCWdvdG8gb3V0OworCX0KKwlzdGF0dXMgPSBvY2ZzMl9sb2NrX2dsb2JhbF9xZihvaW5mbywgMSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gb3V0OworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgT0NGUzJfUVNZTkNfQ1JFRElUUyk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCXN0YXR1cyA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIG91dF9pbG9jazsKKwl9CisJc3RhdHVzID0gb2NmczJfc3luY19kcXVvdChkcXVvdCk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIG91dF90cmFuczsKKwl9CisJLyogTm93IHdyaXRlIHVwZGF0ZWQgbG9jYWwgZHF1b3Qgc3RydWN0dXJlICovCisJc3RhdHVzID0gZHF1b3RfY29tbWl0KGRxdW90KTsKK291dF90cmFuczoKKwlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOworb3V0X2lsb2NrOgorCW9jZnMyX3VubG9ja19nbG9iYWxfcWYob2luZm8sIDEpOworb3V0OgorCW1sb2dfZXhpdChzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIFRoaXMgc2hvdWxkIGhhcHBlbiBvbmx5IGFmdGVyIHNldF9kcWluZm8oKS4gKi8KK3N0YXRpYyBpbnQgb2NmczJfd3JpdGVfaW5mbyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKK3sKKwloYW5kbGVfdCAqaGFuZGxlOworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvICpvaW5mbyA9IHNiX2RxaW5mbyhzYiwgdHlwZSktPmRxaV9wcml2OworCisJbWxvZ19lbnRyeV92b2lkKCk7CisKKwlzdGF0dXMgPSBvY2ZzMl9sb2NrX2dsb2JhbF9xZihvaW5mbywgMSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gb3V0OworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKE9DRlMyX1NCKHNiKSwgT0NGUzJfUUlORk9fV1JJVEVfQ1JFRElUUyk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCXN0YXR1cyA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIG91dF9pbG9jazsKKwl9CisJc3RhdHVzID0gZHF1b3RfY29tbWl0X2luZm8oc2IsIHR5cGUpOworCW9jZnMyX2NvbW1pdF90cmFucyhPQ0ZTMl9TQihzYiksIGhhbmRsZSk7CitvdXRfaWxvY2s6CisJb2NmczJfdW5sb2NrX2dsb2JhbF9xZihvaW5mbywgMSk7CitvdXQ6CisJbWxvZ19leGl0KHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogVGhpcyBpcyBkaWZmaWN1bHQuIFdlIGhhdmUgdG8gbG9jayBxdW90YSBpbm9kZSBhbmQgc3RhcnQgdHJhbnNhY3Rpb24KKyAqIGluIHRoaXMgZnVuY3Rpb24gYnV0IHdlIGRvbid0IHdhbnQgdG8gdGFrZSB0aGUgcGVuYWx0eSBvZiBleGx1c2l2ZQorICogcXVvdGEgZmlsZSBsb2NrIHdoZW4gd2UgYXJlIGp1c3QgZ29pbmcgdG8gdXNlIGNhY2hlZCBzdHJ1Y3R1cmVzLiBTbworICogd2UganVzdCB0YWtlIHJlYWQgbG9jayBjaGVjayB3aGV0aGVyIHdlIGhhdmUgZHF1b3QgY2FjaGVkIGFuZCBpZiBzbywKKyAqIHdlIGRvbid0IGhhdmUgdG8gdGFrZSB0aGUgd3JpdGUgbG9jay4uLiAqLworc3RhdGljIGludCBvY2ZzMl9kcXVvdF9pbml0aWFsaXplKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKQoreworCWhhbmRsZV90ICpoYW5kbGUgPSBOVUxMOworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3Qgb2NmczJfbWVtX2RxaW5mbyAqb2luZm87CisJaW50IGV4Y2x1c2l2ZSA9IDA7CisJaW50IGNudDsKKwlxaWRfdCBpZDsKKworCW1sb2dfZW50cnlfdm9pZCgpOworCisJZm9yIChjbnQgPSAwOyBjbnQgPCBNQVhRVU9UQVM7IGNudCsrKSB7CisJCWlmICh0eXBlICE9IC0xICYmIGNudCAhPSB0eXBlKQorCQkJY29udGludWU7CisJCWlmICghc2JfaGFzX3F1b3RhX2FjdGl2ZShzYiwgY250KSkKKwkJCWNvbnRpbnVlOworCQlvaW5mbyA9IHNiX2RxaW5mbyhzYiwgY250KS0+ZHFpX3ByaXY7CisJCXN0YXR1cyA9IG9jZnMyX2xvY2tfZ2xvYmFsX3FmKG9pbmZvLCAwKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIG91dDsKKwkJLyogVGhpcyBpcyBqdXN0IGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIG5vdCBhIHJlbGlhYmxlIHRlc3QuCisJCSAqIFNpbmNlIHdlIGhvbGQgYW4gaW5vZGUgbG9jaywgbm9vbmUgY2FuIGFjdHVhbGx5IHJlbGVhc2UKKwkJICogdGhlIHN0cnVjdHVyZSB1bnRpbCB3ZSBhcmUgZmluaXNoZWQgd2l0aCBpbml0aWFsaXphdGlvbi4gKi8KKwkJaWYgKGlub2RlLT5pX2RxdW90W2NudF0gIT0gTk9EUVVPVCkgeworCQkJb2NmczJfdW5sb2NrX2dsb2JhbF9xZihvaW5mbywgMCk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBXaGVuIHdlIGhhdmUgaW5vZGUgbG9jaywgd2Uga25vdyB0aGF0IG5vIGRxdW90X3JlbGVhc2UoKSBjYW4KKwkJICogcnVuIGFuZCB0aHVzIHdlIGNhbiBzYWZlbHkgY2hlY2sgd2hldGhlciB3ZSBuZWVkIHRvCisJCSAqIHJlYWQrbW9kaWZ5IGdsb2JhbCBmaWxlIHRvIGdldCBxdW90YSBpbmZvcm1hdGlvbiBvciB3aGV0aGVyCisJCSAqIG91ciBub2RlIGFscmVhZHkgaGFzIGl0LiAqLworCQlpZiAoY250ID09IFVTUlFVT1RBKQorCQkJaWQgPSBpbm9kZS0+aV91aWQ7CisJCWVsc2UgaWYgKGNudCA9PSBHUlBRVU9UQSkKKwkJCWlkID0gaW5vZGUtPmlfZ2lkOworCQllbHNlCisJCQlCVUcoKTsKKwkJLyogT2J0YWluIGV4Y2x1c2lvbiBmcm9tIHF1b3RhIG9mZi4uLiAqLworCQlkb3duX3dyaXRlKCZzYl9kcW9wdChzYiktPmRxcHRyX3NlbSk7CisJCWV4Y2x1c2l2ZSA9ICFkcXVvdF9pc19jYWNoZWQoc2IsIGlkLCBjbnQpOworCQl1cF93cml0ZSgmc2JfZHFvcHQoc2IpLT5kcXB0cl9zZW0pOworCQlpZiAoZXhjbHVzaXZlKSB7CisJCQlzdGF0dXMgPSBvY2ZzMl9sb2NrX2dsb2JhbF9xZihvaW5mbywgMSk7CisJCQlpZiAoc3RhdHVzIDwgMCkgeworCQkJCWV4Y2x1c2l2ZSA9IDA7CisJCQkJbWxvZ19lcnJubyhzdGF0dXMpOworCQkJCWdvdG8gb3V0X2lsb2NrOworCQkJfQorCQkJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMoT0NGUzJfU0Ioc2IpLAorCQkJCQlvY2ZzMl9jYWxjX3Fpbml0X2NyZWRpdHMoc2IsIGNudCkpOworCQkJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCQkJc3RhdHVzID0gUFRSX0VSUihoYW5kbGUpOworCQkJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJCQlnb3RvIG91dF9pbG9jazsKKwkJCX0KKwkJfQorCQlkcXVvdF9pbml0aWFsaXplKGlub2RlLCBjbnQpOworCQlpZiAoZXhjbHVzaXZlKSB7CisJCQlvY2ZzMl9jb21taXRfdHJhbnMoT0NGUzJfU0Ioc2IpLCBoYW5kbGUpOworCQkJb2NmczJfdW5sb2NrX2dsb2JhbF9xZihvaW5mbywgMSk7CisJCX0KKwkJb2NmczJfdW5sb2NrX2dsb2JhbF9xZihvaW5mbywgMCk7CisJfQorCW1sb2dfZXhpdCgwKTsKKwlyZXR1cm4gMDsKK291dF9pbG9jazoKKwlpZiAoZXhjbHVzaXZlKQorCQlvY2ZzMl91bmxvY2tfZ2xvYmFsX3FmKG9pbmZvLCAxKTsKKwlvY2ZzMl91bmxvY2tfZ2xvYmFsX3FmKG9pbmZvLCAwKTsKK291dDoKKwltbG9nX2V4aXQoc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IG9jZnMyX2RxdW90X2Ryb3Bfc2xvdyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWludCBzdGF0dXMgPSAwOworCWludCBjbnQ7CisJaW50IGdvdF9sb2NrW01BWFFVT1RBU10gPSB7MCwgMH07CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IG9jZnMyX21lbV9kcWluZm8gKm9pbmZvOworCisJZm9yIChjbnQgPSAwOyBjbnQgPCBNQVhRVU9UQVM7IGNudCsrKSB7CisJCWlmICghc2JfaGFzX3F1b3RhX2FjdGl2ZShzYiwgY250KSkKKwkJCWNvbnRpbnVlOworCQlvaW5mbyA9IHNiX2RxaW5mbyhzYiwgY250KS0+ZHFpX3ByaXY7CisJCXN0YXR1cyA9IG9jZnMyX2xvY2tfZ2xvYmFsX3FmKG9pbmZvLCAxKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIG91dDsKKwkJZ290X2xvY2tbY250XSA9IDE7CisJfQorCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKE9DRlMyX1NCKHNiKSwKKwkJCW9jZnMyX2NhbGNfcWluaXRfY3JlZGl0cyhzYiwgVVNSUVVPVEEpICsKKwkJCW9jZnMyX2NhbGNfcWluaXRfY3JlZGl0cyhzYiwgR1JQUVVPVEEpKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJc3RhdHVzID0gUFRSX0VSUihoYW5kbGUpOworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gb3V0OworCX0KKwlkcXVvdF9kcm9wKGlub2RlKTsKKwlvY2ZzMl9jb21taXRfdHJhbnMoT0NGUzJfU0Ioc2IpLCBoYW5kbGUpOworb3V0OgorCWZvciAoY250ID0gMDsgY250IDwgTUFYUVVPVEFTOyBjbnQrKykKKwkJaWYgKGdvdF9sb2NrW2NudF0pIHsKKwkJCW9pbmZvID0gc2JfZHFpbmZvKHNiLCBjbnQpLT5kcWlfcHJpdjsKKwkJCW9jZnMyX3VubG9ja19nbG9iYWxfcWYob2luZm8sIDEpOworCQl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogU2VlIHRoZSBjb21tZW50IGJlZm9yZSBvY2ZzMl9kcXVvdF9pbml0aWFsaXplLiAqLworc3RhdGljIGludCBvY2ZzMl9kcXVvdF9kcm9wKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvICpvaW5mbzsKKwlpbnQgZXhjbHVzaXZlID0gMDsKKwlpbnQgY250OworCWludCBnb3RfbG9ja1tNQVhRVU9UQVNdID0gezAsIDB9OworCisJbWxvZ19lbnRyeV92b2lkKCk7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBNQVhRVU9UQVM7IGNudCsrKSB7CisJCWlmICghc2JfaGFzX3F1b3RhX2FjdGl2ZShzYiwgY250KSkKKwkJCWNvbnRpbnVlOworCQlvaW5mbyA9IHNiX2RxaW5mbyhzYiwgY250KS0+ZHFpX3ByaXY7CisJCXN0YXR1cyA9IG9jZnMyX2xvY2tfZ2xvYmFsX3FmKG9pbmZvLCAwKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIG91dDsKKwkJZ290X2xvY2tbY250XSA9IDE7CisJfQorCS8qIExvY2sgYWdhaW5zdCBhbnlvbmUgcmVsZWFzaW5nIHJlZmVyZW5jZXMgc28gdGhhdCB3aGVuIHdoZW4gd2UgY2hlY2sKKwkgKiB3ZSBrbm93IHdlIGFyZSBub3QgZ29pbmcgdG8gYmUgbGFzdCBvbmVzIHRvIHJlbGVhc2UgZHF1b3QgKi8KKwlkb3duX3dyaXRlKCZzYl9kcW9wdChzYiktPmRxcHRyX3NlbSk7CisJLyogVXJnaCwgdGhpcyBpcyBhIHRlcnJpYmxlIGhhY2sgOiggKi8KKwlmb3IgKGNudCA9IDA7IGNudCA8IE1BWFFVT1RBUzsgY250KyspIHsKKwkJaWYgKGlub2RlLT5pX2RxdW90W2NudF0gIT0gTk9EUVVPVCAmJgorCQkgICAgYXRvbWljX3JlYWQoJmlub2RlLT5pX2RxdW90W2NudF0tPmRxX2NvdW50KSA+IDEpIHsKKwkJCWV4Y2x1c2l2ZSA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoIWV4Y2x1c2l2ZSkKKwkJZHF1b3RfZHJvcF9sb2NrZWQoaW5vZGUpOworCXVwX3dyaXRlKCZzYl9kcW9wdChzYiktPmRxcHRyX3NlbSk7CitvdXQ6CisJZm9yIChjbnQgPSAwOyBjbnQgPCBNQVhRVU9UQVM7IGNudCsrKQorCQlpZiAoZ290X2xvY2tbY250XSkgeworCQkJb2luZm8gPSBzYl9kcWluZm8oc2IsIGNudCktPmRxaV9wcml2OworCQkJb2NmczJfdW5sb2NrX2dsb2JhbF9xZihvaW5mbywgMCk7CisJCX0KKwkvKiBJbiBjYXNlIHdlIGJhaWxlZCBvdXQgYmVjYXVzZSB3ZSBoYWQgdG8gZG8gZXhwZW5zaXZlIGxvY2tpbmcKKwkgKiBkbyBpdCBub3cuLi4gKi8KKwlpZiAoZXhjbHVzaXZlKQorCQlzdGF0dXMgPSBvY2ZzMl9kcXVvdF9kcm9wX3Nsb3coaW5vZGUpOworCW1sb2dfZXhpdChzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHF1b3QgKm9jZnMyX2FsbG9jX2RxdW90KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQoreworCXN0cnVjdCBvY2ZzMl9kcXVvdCAqZHF1b3QgPQorCQkJCWttZW1fY2FjaGVfemFsbG9jKG9jZnMyX2RxdW90X2NhY2hlcCwgR0ZQX05PRlMpOworCisJaWYgKCFkcXVvdCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuICZkcXVvdC0+ZHFfZHF1b3Q7Cit9CisKK3N0YXRpYyB2b2lkIG9jZnMyX2Rlc3Ryb3lfZHF1b3Qoc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwlrbWVtX2NhY2hlX2ZyZWUob2NmczJfZHF1b3RfY2FjaGVwLCBkcXVvdCk7Cit9CisKK3N0cnVjdCBkcXVvdF9vcGVyYXRpb25zIG9jZnMyX3F1b3RhX29wZXJhdGlvbnMgPSB7CisJLmluaXRpYWxpemUJPSBvY2ZzMl9kcXVvdF9pbml0aWFsaXplLAorCS5kcm9wCQk9IG9jZnMyX2RxdW90X2Ryb3AsCisJLmFsbG9jX3NwYWNlCT0gZHF1b3RfYWxsb2Nfc3BhY2UsCisJLmFsbG9jX2lub2RlCT0gZHF1b3RfYWxsb2NfaW5vZGUsCisJLmZyZWVfc3BhY2UJPSBkcXVvdF9mcmVlX3NwYWNlLAorCS5mcmVlX2lub2RlCT0gZHF1b3RfZnJlZV9pbm9kZSwKKwkudHJhbnNmZXIJPSBkcXVvdF90cmFuc2ZlciwKKwkud3JpdGVfZHF1b3QJPSBvY2ZzMl93cml0ZV9kcXVvdCwKKwkuYWNxdWlyZV9kcXVvdAk9IG9jZnMyX2FjcXVpcmVfZHF1b3QsCisJLnJlbGVhc2VfZHF1b3QJPSBvY2ZzMl9yZWxlYXNlX2RxdW90LAorCS5tYXJrX2RpcnR5CT0gb2NmczJfbWFya19kcXVvdF9kaXJ0eSwKKwkud3JpdGVfaW5mbwk9IG9jZnMyX3dyaXRlX2luZm8sCisJLmFsbG9jX2RxdW90CT0gb2NmczJfYWxsb2NfZHF1b3QsCisJLmRlc3Ryb3lfZHF1b3QJPSBvY2ZzMl9kZXN0cm95X2RxdW90LAorfTsKKworaW50IG9jZnMyX3F1b3RhX3NldHVwKHZvaWQpCit7CisJb2NmczJfcXVvdGFfd3EgPSBjcmVhdGVfd29ya3F1ZXVlKCJvMnF1b3QiKTsKKwlpZiAoIW9jZnMyX3F1b3RhX3dxKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBvY2ZzMl9xdW90YV9zaHV0ZG93bih2b2lkKQoreworCWlmIChvY2ZzMl9xdW90YV93cSkgeworCQlmbHVzaF93b3JrcXVldWUob2NmczJfcXVvdGFfd3EpOworCQlkZXN0cm95X3dvcmtxdWV1ZShvY2ZzMl9xdW90YV93cSk7CisJCW9jZnMyX3F1b3RhX3dxID0gTlVMTDsKKwl9Cit9CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9xdW90YV9sb2NhbC5jIGIvZnMvb2NmczIvcXVvdGFfbG9jYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2RlZWM1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvb2NmczIvcXVvdGFfbG9jYWwuYwpAQCAtMCwwICsxLDEyNTMgQEAKKy8qCisgKiAgSW1wbGVtZW50YXRpb24gb2Ygb3BlcmF0aW9ucyBvdmVyIGxvY2FsIHF1b3RhIGZpbGUKKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YS5oPgorI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNkZWZpbmUgTUxPR19NQVNLX1BSRUZJWCBNTF9RVU9UQQorI2luY2x1ZGUgPGNsdXN0ZXIvbWFza2xvZy5oPgorCisjaW5jbHVkZSAib2NmczJfZnMuaCIKKyNpbmNsdWRlICJvY2ZzMi5oIgorI2luY2x1ZGUgImlub2RlLmgiCisjaW5jbHVkZSAiYWxsb2MuaCIKKyNpbmNsdWRlICJmaWxlLmgiCisjaW5jbHVkZSAiYnVmZmVyX2hlYWRfaW8uaCIKKyNpbmNsdWRlICJqb3VybmFsLmgiCisjaW5jbHVkZSAic3lzZmlsZS5oIgorI2luY2x1ZGUgImRsbWdsdWUuaCIKKyNpbmNsdWRlICJxdW90YS5oIgorCisvKiBOdW1iZXIgb2YgbG9jYWwgcXVvdGEgc3RydWN0dXJlcyBwZXIgYmxvY2sgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG9sX3F1b3RhX2VudHJpZXNfcGVyX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJcmV0dXJuICgoc2ItPnNfYmxvY2tzaXplIC0gT0NGUzJfUUJMS19SRVNFUlZFRF9TUEFDRSkgLworCQlzaXplb2Yoc3RydWN0IG9jZnMyX2xvY2FsX2Rpc2tfZHFibGspKTsKK30KKworLyogTnVtYmVyIG9mIGJsb2NrcyB3aXRoIGVudHJpZXMgaW4gb25lIGNodW5rICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBvbF9jaHVua19ibG9ja3Moc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlyZXR1cm4gKChzYi0+c19ibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IG9jZnMyX2xvY2FsX2Rpc2tfY2h1bmspIC0KKwkJIE9DRlMyX1FCTEtfUkVTRVJWRURfU1BBQ0UpIDw8IDMpIC8KKwkgICAgICAgb2xfcXVvdGFfZW50cmllc19wZXJfYmxvY2soc2IpOworfQorCisvKiBOdW1iZXIgb2YgZW50cmllcyBpbiBhIGNodW5rIGJpdG1hcCAqLworc3RhdGljIHVuc2lnbmVkIGludCBvbF9jaHVua19lbnRyaWVzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJcmV0dXJuIG9sX2NodW5rX2Jsb2NrcyhzYikgKiBvbF9xdW90YV9lbnRyaWVzX3Blcl9ibG9jayhzYik7Cit9CisKKy8qIE9mZnNldCBvZiB0aGUgY2h1bmsgaW4gcXVvdGEgZmlsZSAqLworc3RhdGljIHVuc2lnbmVkIGludCBvbF9xdW90YV9jaHVua19ibG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgYykKK3sKKwkvKiAxIGJsb2NrIGZvciBsb2NhbCBxdW90YSBmaWxlIGluZm8sIDEgYmxvY2sgcGVyIGNodW5rIGZvciBjaHVuayBpbmZvICovCisJcmV0dXJuIDEgKyAob2xfY2h1bmtfYmxvY2tzKHNiKSArIDEpICogYzsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBvbF9kcWJsa19ibG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgYywgaW50IG9mZikKK3sKKwlpbnQgZXBiID0gb2xfcXVvdGFfZW50cmllc19wZXJfYmxvY2soc2IpOworCisJcmV0dXJuIG9sX3F1b3RhX2NodW5rX2Jsb2NrKHNiLCBjKSArIDEgKyBvZmYgLyBlcGI7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgb2xfZHFibGtfYmxvY2tfb2ZmKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBjLCBpbnQgb2ZmKQoreworCWludCBlcGIgPSBvbF9xdW90YV9lbnRyaWVzX3Blcl9ibG9jayhzYik7CisKKwlyZXR1cm4gKG9mZiAlIGVwYikgKiBzaXplb2Yoc3RydWN0IG9jZnMyX2xvY2FsX2Rpc2tfZHFibGspOworfQorCisvKiBPZmZzZXQgb2YgdGhlIGRxdW90IHN0cnVjdHVyZSBpbiB0aGUgcXVvdGEgZmlsZSAqLworc3RhdGljIGxvZmZfdCBvbF9kcWJsa19vZmYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGMsIGludCBvZmYpCit7CisJcmV0dXJuIChvbF9kcWJsa19ibG9jayhzYiwgYywgb2ZmKSA8PCBzYi0+c19ibG9ja3NpemVfYml0cykgKworCSAgICAgICBvbF9kcWJsa19ibG9ja19vZmYoc2IsIGMsIG9mZik7Cit9CisKKy8qIENvbXB1dGUgYmxvY2sgbnVtYmVyIGZyb20gZ2l2ZW4gb2Zmc2V0ICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBvbF9kcWJsa19maWxlX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGxvZmZfdCBvZmYpCit7CisJcmV0dXJuIG9mZiA+PiBzYi0+c19ibG9ja3NpemVfYml0czsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgb2xfZHFibGtfYmxvY2tfb2Zmc2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGxvZmZfdCBvZmYpCit7CisJcmV0dXJuIG9mZiAmICgoMSA8PCBzYi0+c19ibG9ja3NpemVfYml0cykgLSAxKTsKK30KKworLyogQ29tcHV0ZSBvZmZzZXQgaW4gdGhlIGNodW5rIG9mIGEgc3RydWN0dXJlIHdpdGggdGhlIGdpdmVuIG9mZnNldCAqLworc3RhdGljIGludCBvbF9kcWJsa19jaHVua19vZmYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGMsIGxvZmZfdCBvZmYpCit7CisJaW50IGVwYiA9IG9sX3F1b3RhX2VudHJpZXNfcGVyX2Jsb2NrKHNiKTsKKworCXJldHVybiAoKG9mZiA+PiBzYi0+c19ibG9ja3NpemVfYml0cykgLQorCQkJb2xfcXVvdGFfY2h1bmtfYmxvY2soc2IsIGMpIC0gMSkgKiBlcGIKKwkgICAgICAgKyAoKHVuc2lnbmVkIGludCkob2ZmICYgKCgxIDw8IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSAtIDEpKSkgLworCQkgc2l6ZW9mKHN0cnVjdCBvY2ZzMl9sb2NhbF9kaXNrX2RxYmxrKTsKK30KKworLyogV3JpdGUgYnVmZmVyaGVhZCBpbnRvIHRoZSBmcyAqLworc3RhdGljIGludCBvY2ZzMl9tb2RpZnlfYmgoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJdm9pZCAoKm1vZGlmeSkoc3RydWN0IGJ1ZmZlcl9oZWFkICosIHZvaWQgKiksIHZvaWQgKnByaXZhdGUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCWhhbmRsZV90ICpoYW5kbGU7CisJaW50IHN0YXR1czsKKworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKE9DRlMyX1NCKHNiKSwgMSk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCXN0YXR1cyA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKwlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19kcShoYW5kbGUsIGlub2RlLCBiaCwKKwkJCQkJIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCW9jZnMyX2NvbW1pdF90cmFucyhPQ0ZTMl9TQihzYiksIGhhbmRsZSk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCWxvY2tfYnVmZmVyKGJoKTsKKwltb2RpZnkoYmgsIHByaXZhdGUpOworCXVubG9ja19idWZmZXIoYmgpOworCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBiaCk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlvY2ZzMl9jb21taXRfdHJhbnMoT0NGUzJfU0Ioc2IpLCBoYW5kbGUpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKwlzdGF0dXMgPSBvY2ZzMl9jb21taXRfdHJhbnMoT0NGUzJfU0Ioc2IpLCBoYW5kbGUpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIENoZWNrIHdoZXRoZXIgd2UgdW5kZXJzdGFuZCBmb3JtYXQgb2YgcXVvdGEgZmlsZXMgKi8KK3N0YXRpYyBpbnQgb2NmczJfbG9jYWxfY2hlY2tfcXVvdGFfZmlsZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKK3sKKwl1bnNpZ25lZCBpbnQgbG1hZ2ljc1tNQVhRVU9UQVNdID0gT0NGUzJfTE9DQUxfUU1BR0lDUzsKKwl1bnNpZ25lZCBpbnQgbHZlcnNpb25zW01BWFFVT1RBU10gPSBPQ0ZTMl9MT0NBTF9RVkVSU0lPTlM7CisJdW5zaWduZWQgaW50IGdtYWdpY3NbTUFYUVVPVEFTXSA9IE9DRlMyX0dMT0JBTF9RTUFHSUNTOworCXVuc2lnbmVkIGludCBndmVyc2lvbnNbTUFYUVVPVEFTXSA9IE9DRlMyX0dMT0JBTF9RVkVSU0lPTlM7CisJdW5zaWduZWQgaW50IGlub1tNQVhRVU9UQVNdID0geyBVU0VSX1FVT1RBX1NZU1RFTV9JTk9ERSwKKwkJCQkJR1JPVVBfUVVPVEFfU1lTVEVNX0lOT0RFIH07CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJc3RydWN0IGlub2RlICpsaW5vZGUgPSBzYl9kcW9wdChzYiktPmZpbGVzW3R5cGVdOworCXN0cnVjdCBpbm9kZSAqZ2lub2RlID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfZGlza19kcWhlYWRlciAqZHFoZWFkOworCWludCBzdGF0dXMsIHJldCA9IDA7CisKKwkvKiBGaXJzdCBjaGVjayB3aGV0aGVyIHdlIHVuZGVyc3RhbmQgbG9jYWwgcXVvdGEgZmlsZSAqLworCXN0YXR1cyA9IG9jZnMyX3JlYWRfcXVvdGFfYmxvY2sobGlub2RlLCAwLCAmYmgpOworCWlmIChzdGF0dXMpIHsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQltbG9nKE1MX0VSUk9SLCAiZmFpbGVkIHRvIHJlYWQgcXVvdGEgZmlsZSBoZWFkZXIgKHR5cGU9JWQpXG4iLAorCQkJdHlwZSk7CisJCWdvdG8gb3V0X2VycjsKKwl9CisJZHFoZWFkID0gKHN0cnVjdCBvY2ZzMl9kaXNrX2RxaGVhZGVyICopKGJoLT5iX2RhdGEpOworCWlmIChsZTMyX3RvX2NwdShkcWhlYWQtPmRxaF9tYWdpYykgIT0gbG1hZ2ljc1t0eXBlXSkgeworCQltbG9nKE1MX0VSUk9SLCAicXVvdGEgZmlsZSBtYWdpYyBkb2VzIG5vdCBtYXRjaCAoJXUgIT0gJXUpLCIKKwkJCSIgdHlwZT0lZFxuIiwgbGUzMl90b19jcHUoZHFoZWFkLT5kcWhfbWFnaWMpLAorCQkJbG1hZ2ljc1t0eXBlXSwgdHlwZSk7CisJCWdvdG8gb3V0X2VycjsKKwl9CisJaWYgKGxlMzJfdG9fY3B1KGRxaGVhZC0+ZHFoX3ZlcnNpb24pICE9IGx2ZXJzaW9uc1t0eXBlXSkgeworCQltbG9nKE1MX0VSUk9SLCAicXVvdGEgZmlsZSB2ZXJzaW9uIGRvZXMgbm90IG1hdGNoICgldSAhPSAldSksIgorCQkJIiB0eXBlPSVkXG4iLCBsZTMyX3RvX2NwdShkcWhlYWQtPmRxaF92ZXJzaW9uKSwKKwkJCWx2ZXJzaW9uc1t0eXBlXSwgdHlwZSk7CisJCWdvdG8gb3V0X2VycjsKKwl9CisJYnJlbHNlKGJoKTsKKwliaCA9IE5VTEw7CisKKwkvKiBOZXh0IGNoZWNrIHdoZXRoZXIgd2UgdW5kZXJzdGFuZCBnbG9iYWwgcXVvdGEgZmlsZSAqLworCWdpbm9kZSA9IG9jZnMyX2dldF9zeXN0ZW1fZmlsZV9pbm9kZShPQ0ZTMl9TQihzYiksIGlub1t0eXBlXSwKKwkJCQkJCU9DRlMyX0lOVkFMSURfU0xPVCk7CisJaWYgKCFnaW5vZGUpIHsKKwkJbWxvZyhNTF9FUlJPUiwgImNhbm5vdCBnZXQgZ2xvYmFsIHF1b3RhIGZpbGUgaW5vZGUgIgorCQkJCSIodHlwZT0lZClcbiIsIHR5cGUpOworCQlnb3RvIG91dF9lcnI7CisJfQorCS8qIFNpbmNlIHRoZSBoZWFkZXIgaXMgcmVhZCBvbmx5LCB3ZSBkb24ndCBjYXJlIGFib3V0IGxvY2tpbmcgKi8KKwlzdGF0dXMgPSBvY2ZzMl9yZWFkX3F1b3RhX2Jsb2NrKGdpbm9kZSwgMCwgJmJoKTsKKwlpZiAoc3RhdHVzKSB7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJbWxvZyhNTF9FUlJPUiwgImZhaWxlZCB0byByZWFkIGdsb2JhbCBxdW90YSBmaWxlIGhlYWRlciAiCisJCQkJIih0eXBlPSVkKVxuIiwgdHlwZSk7CisJCWdvdG8gb3V0X2VycjsKKwl9CisJZHFoZWFkID0gKHN0cnVjdCBvY2ZzMl9kaXNrX2RxaGVhZGVyICopKGJoLT5iX2RhdGEpOworCWlmIChsZTMyX3RvX2NwdShkcWhlYWQtPmRxaF9tYWdpYykgIT0gZ21hZ2ljc1t0eXBlXSkgeworCQltbG9nKE1MX0VSUk9SLCAiZ2xvYmFsIHF1b3RhIGZpbGUgbWFnaWMgZG9lcyBub3QgbWF0Y2ggIgorCQkJIigldSAhPSAldSksIHR5cGU9JWRcbiIsCisJCQlsZTMyX3RvX2NwdShkcWhlYWQtPmRxaF9tYWdpYyksIGdtYWdpY3NbdHlwZV0sIHR5cGUpOworCQlnb3RvIG91dF9lcnI7CisJfQorCWlmIChsZTMyX3RvX2NwdShkcWhlYWQtPmRxaF92ZXJzaW9uKSAhPSBndmVyc2lvbnNbdHlwZV0pIHsKKwkJbWxvZyhNTF9FUlJPUiwgImdsb2JhbCBxdW90YSBmaWxlIHZlcnNpb24gZG9lcyBub3QgbWF0Y2ggIgorCQkJIigldSAhPSAldSksIHR5cGU9JWRcbiIsCisJCQlsZTMyX3RvX2NwdShkcWhlYWQtPmRxaF92ZXJzaW9uKSwgZ3ZlcnNpb25zW3R5cGVdLAorCQkJdHlwZSk7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlyZXQgPSAxOworb3V0X2VycjoKKwlicmVsc2UoYmgpOworCWlwdXQoZ2lub2RlKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBSZWxlYXNlIGdpdmVuIGxpc3Qgb2YgcXVvdGEgZmlsZSBjaHVua3MgKi8KK3N0YXRpYyB2b2lkIG9jZnMyX3JlbGVhc2VfbG9jYWxfcXVvdGFfYml0bWFwcyhzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCXN0cnVjdCBvY2ZzMl9xdW90YV9jaHVuayAqcG9zLCAqbmV4dDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb3MsIG5leHQsIGhlYWQsIHFjX2NodW5rKSB7CisJCWxpc3RfZGVsKCZwb3MtPnFjX2NodW5rKTsKKwkJYnJlbHNlKHBvcy0+cWNfaGVhZGVyYmgpOworCQlrbWVtX2NhY2hlX2ZyZWUob2NmczJfcWZfY2h1bmtfY2FjaGVwLCBwb3MpOworCX0KK30KKworLyogTG9hZCBxdW90YSBiaXRtYXBzIGludG8gbWVtb3J5ICovCitzdGF0aWMgaW50IG9jZnMyX2xvYWRfbG9jYWxfcXVvdGFfYml0bWFwcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJc3RydWN0IG9jZnMyX2xvY2FsX2Rpc2tfZHFpbmZvICpsZGluZm8sCisJCQlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCXN0cnVjdCBvY2ZzMl9xdW90YV9jaHVuayAqbmV3Y2h1bms7CisJaW50IGksIHN0YXR1czsKKworCUlOSVRfTElTVF9IRUFEKGhlYWQpOworCWZvciAoaSA9IDA7IGkgPCBsZTMyX3RvX2NwdShsZGluZm8tPmRxaV9jaHVua3MpOyBpKyspIHsKKwkJbmV3Y2h1bmsgPSBrbWVtX2NhY2hlX2FsbG9jKG9jZnMyX3FmX2NodW5rX2NhY2hlcCwgR0ZQX05PRlMpOworCQlpZiAoIW5ld2NodW5rKSB7CisJCQlvY2ZzMl9yZWxlYXNlX2xvY2FsX3F1b3RhX2JpdG1hcHMoaGVhZCk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQluZXdjaHVuay0+cWNfbnVtID0gaTsKKwkJbmV3Y2h1bmstPnFjX2hlYWRlcmJoID0gTlVMTDsKKwkJc3RhdHVzID0gb2NmczJfcmVhZF9xdW90YV9ibG9jayhpbm9kZSwKKwkJCQlvbF9xdW90YV9jaHVua19ibG9jayhpbm9kZS0+aV9zYiwgaSksCisJCQkJJm5ld2NodW5rLT5xY19oZWFkZXJiaCk7CisJCWlmIChzdGF0dXMpIHsKKwkJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJCWttZW1fY2FjaGVfZnJlZShvY2ZzMl9xZl9jaHVua19jYWNoZXAsIG5ld2NodW5rKTsKKwkJCW9jZnMyX3JlbGVhc2VfbG9jYWxfcXVvdGFfYml0bWFwcyhoZWFkKTsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKwkJbGlzdF9hZGRfdGFpbCgmbmV3Y2h1bmstPnFjX2NodW5rLCBoZWFkKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG9scV91cGRhdGVfaW5mbyhzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCB2b2lkICpwcml2YXRlKQoreworCXN0cnVjdCBtZW1fZHFpbmZvICppbmZvID0gcHJpdmF0ZTsKKwlzdHJ1Y3Qgb2NmczJfbWVtX2RxaW5mbyAqb2luZm8gPSBpbmZvLT5kcWlfcHJpdjsKKwlzdHJ1Y3Qgb2NmczJfbG9jYWxfZGlza19kcWluZm8gKmxkaW5mbzsKKworCWxkaW5mbyA9IChzdHJ1Y3Qgb2NmczJfbG9jYWxfZGlza19kcWluZm8gKikoYmgtPmJfZGF0YSArCisJCQkJCQlPQ0ZTMl9MT0NBTF9JTkZPX09GRik7CisJc3Bpbl9sb2NrKCZkcV9kYXRhX2xvY2spOworCWxkaW5mby0+ZHFpX2ZsYWdzID0gY3B1X3RvX2xlMzIoaW5mby0+ZHFpX2ZsYWdzICYgRFFGX01BU0spOworCWxkaW5mby0+ZHFpX2NodW5rcyA9IGNwdV90b19sZTMyKG9pbmZvLT5kcWlfY2h1bmtzKTsKKwlsZGluZm8tPmRxaV9ibG9ja3MgPSBjcHVfdG9fbGUzMihvaW5mby0+ZHFpX2Jsb2Nrcyk7CisJc3Bpbl91bmxvY2soJmRxX2RhdGFfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfYWRkX3JlY292ZXJ5X2NodW5rKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICAgIHN0cnVjdCBvY2ZzMl9sb2NhbF9kaXNrX2NodW5rICpkY2h1bmssCisJCQkJICAgIGludCBjaHVuaywKKwkJCQkgICAgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3Qgb2NmczJfcmVjb3ZlcnlfY2h1bmsgKnJjOworCisJcmMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgb2NmczJfcmVjb3ZlcnlfY2h1bmspLCBHRlBfTk9GUyk7CisJaWYgKCFyYykKKwkJcmV0dXJuIC1FTk9NRU07CisJcmMtPnJjX2NodW5rID0gY2h1bms7CisJcmMtPnJjX2JpdG1hcCA9IGttYWxsb2Moc2ItPnNfYmxvY2tzaXplLCBHRlBfTk9GUyk7CisJaWYgKCFyYy0+cmNfYml0bWFwKSB7CisJCWtmcmVlKHJjKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbWNweShyYy0+cmNfYml0bWFwLCBkY2h1bmstPmRxY19iaXRtYXAsCisJICAgICAgIChvbF9jaHVua19lbnRyaWVzKHNiKSArIDcpID4+IDMpOworCWxpc3RfYWRkX3RhaWwoJnJjLT5yY19saXN0LCBoZWFkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9yZWNvdmVyeV9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IG9jZnMyX3JlY292ZXJ5X2NodW5rICpuZXh0OworCXN0cnVjdCBvY2ZzMl9yZWNvdmVyeV9jaHVuayAqcmNodW5rOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJjaHVuaywgbmV4dCwgaGVhZCwgcmNfbGlzdCkgeworCQlsaXN0X2RlbCgmcmNodW5rLT5yY19saXN0KTsKKwkJa2ZyZWUocmNodW5rLT5yY19iaXRtYXApOworCQlrZnJlZShyY2h1bmspOworCX0KK30KKwordm9pZCBvY2ZzMl9mcmVlX3F1b3RhX3JlY292ZXJ5KHN0cnVjdCBvY2ZzMl9xdW90YV9yZWNvdmVyeSAqcmVjKQoreworCWludCB0eXBlOworCisJZm9yICh0eXBlID0gMDsgdHlwZSA8IE1BWFFVT1RBUzsgdHlwZSsrKQorCQlmcmVlX3JlY292ZXJ5X2xpc3QoJihyZWMtPnJfbGlzdFt0eXBlXSkpOworCWtmcmVlKHJlYyk7Cit9CisKKy8qIExvYWQgZW50cmllcyBpbiBvdXIgcXVvdGEgZmlsZSB3ZSBoYXZlIHRvIHJlY292ZXIqLworc3RhdGljIGludCBvY2ZzMl9yZWNvdmVyeV9sb2FkX3F1b3RhKHN0cnVjdCBpbm9kZSAqbHFpbm9kZSwKKwkJCQkgICAgIHN0cnVjdCBvY2ZzMl9sb2NhbF9kaXNrX2RxaW5mbyAqbGRpbmZvLAorCQkJCSAgICAgaW50IHR5cGUsCisJCQkJICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBscWlub2RlLT5pX3NiOworCXN0cnVjdCBidWZmZXJfaGVhZCAqaGJoOworCXN0cnVjdCBvY2ZzMl9sb2NhbF9kaXNrX2NodW5rICpkY2h1bms7CisJaW50IGksIGNodW5rcyA9IGxlMzJfdG9fY3B1KGxkaW5mby0+ZHFpX2NodW5rcyk7CisJaW50IHN0YXR1cyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2h1bmtzOyBpKyspIHsKKwkJaGJoID0gTlVMTDsKKwkJc3RhdHVzID0gb2NmczJfcmVhZF9xdW90YV9ibG9jayhscWlub2RlLAorCQkJCQkJb2xfcXVvdGFfY2h1bmtfYmxvY2soc2IsIGkpLAorCQkJCQkJJmhiaCk7CisJCWlmIChzdGF0dXMpIHsKKwkJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJCWJyZWFrOworCQl9CisJCWRjaHVuayA9IChzdHJ1Y3Qgb2NmczJfbG9jYWxfZGlza19jaHVuayAqKWhiaC0+Yl9kYXRhOworCQlpZiAobGUzMl90b19jcHUoZGNodW5rLT5kcWNfZnJlZSkgPCBvbF9jaHVua19lbnRyaWVzKHNiKSkKKwkJCXN0YXR1cyA9IG9jZnMyX2FkZF9yZWNvdmVyeV9jaHVuayhzYiwgZGNodW5rLCBpLCBoZWFkKTsKKwkJYnJlbHNlKGhiaCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJfQorCWlmIChzdGF0dXMgPCAwKQorCQlmcmVlX3JlY292ZXJ5X2xpc3QoaGVhZCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHN0cnVjdCBvY2ZzMl9xdW90YV9yZWNvdmVyeSAqb2NmczJfYWxsb2NfcXVvdGFfcmVjb3Zlcnkodm9pZCkKK3sKKwlpbnQgdHlwZTsKKwlzdHJ1Y3Qgb2NmczJfcXVvdGFfcmVjb3ZlcnkgKnJlYzsKKworCXJlYyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBvY2ZzMl9xdW90YV9yZWNvdmVyeSksIEdGUF9OT0ZTKTsKKwlpZiAoIXJlYykKKwkJcmV0dXJuIE5VTEw7CisJZm9yICh0eXBlID0gMDsgdHlwZSA8IE1BWFFVT1RBUzsgdHlwZSsrKQorCQlJTklUX0xJU1RfSEVBRCgmKHJlYy0+cl9saXN0W3R5cGVdKSk7CisJcmV0dXJuIHJlYzsKK30KKworLyogTG9hZCBpbmZvcm1hdGlvbiB3ZSBuZWVkIGZvciBxdW90YSByZWNvdmVyeSBpbnRvIG1lbW9yeSAqLworc3RydWN0IG9jZnMyX3F1b3RhX3JlY292ZXJ5ICpvY2ZzMl9iZWdpbl9xdW90YV9yZWNvdmVyeSgKKwkJCQkJCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAorCQkJCQkJaW50IHNsb3RfbnVtKQoreworCXVuc2lnbmVkIGludCBmZWF0dXJlW01BWFFVT1RBU10gPSB7IE9DRlMyX0ZFQVRVUkVfUk9fQ09NUEFUX1VTUlFVT1RBLAorCQkJCQkgICAgT0NGUzJfRkVBVFVSRV9ST19DT01QQVRfR1JQUVVPVEF9OworCXVuc2lnbmVkIGludCBpbm9bTUFYUVVPVEFTXSA9IHsgTE9DQUxfVVNFUl9RVU9UQV9TWVNURU1fSU5PREUsCisJCQkJCUxPQ0FMX0dST1VQX1FVT1RBX1NZU1RFTV9JTk9ERSB9OworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBvc2ItPnNiOworCXN0cnVjdCBvY2ZzMl9sb2NhbF9kaXNrX2RxaW5mbyAqbGRpbmZvOworCXN0cnVjdCBpbm9kZSAqbHFpbm9kZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWludCB0eXBlOworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBvY2ZzMl9xdW90YV9yZWNvdmVyeSAqcmVjOworCisJbWxvZyhNTF9OT1RJQ0UsICJCZWdpbm5pbmcgcXVvdGEgcmVjb3ZlcnkgaW4gc2xvdCAldVxuIiwgc2xvdF9udW0pOworCXJlYyA9IG9jZnMyX2FsbG9jX3F1b3RhX3JlY292ZXJ5KCk7CisJaWYgKCFyZWMpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCS8qIEZpcnN0IGluaXQuLi4gKi8KKworCWZvciAodHlwZSA9IDA7IHR5cGUgPCBNQVhRVU9UQVM7IHR5cGUrKykgeworCQlpZiAoIU9DRlMyX0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwgZmVhdHVyZVt0eXBlXSkpCisJCQljb250aW51ZTsKKwkJLyogQXQgdGhpcyBwb2ludCwgam91cm5hbCBvZiB0aGUgc2xvdCBpcyBhbHJlYWR5IHJlcGxheWVkIHNvCisJCSAqIHdlIGNhbiB0cnVzdCBtZXRhZGF0YSBhbmQgZGF0YSBvZiB0aGUgcXVvdGEgZmlsZSAqLworCQlscWlub2RlID0gb2NmczJfZ2V0X3N5c3RlbV9maWxlX2lub2RlKG9zYiwgaW5vW3R5cGVdLCBzbG90X251bSk7CisJCWlmICghbHFpbm9kZSkgeworCQkJc3RhdHVzID0gLUVOT0VOVDsKKwkJCWdvdG8gb3V0OworCQl9CisJCXN0YXR1cyA9IG9jZnMyX2lub2RlX2xvY2tfZnVsbChscWlub2RlLCBOVUxMLCAxLAorCQkJCQkgICAgICAgT0NGUzJfTUVUQV9MT0NLX1JFQ09WRVJZKTsKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJCWdvdG8gb3V0X3B1dDsKKwkJfQorCQkvKiBOb3cgcmVhZCBsb2NhbCBoZWFkZXIgKi8KKwkJYmggPSBOVUxMOworCQlzdGF0dXMgPSBvY2ZzMl9yZWFkX3F1b3RhX2Jsb2NrKGxxaW5vZGUsIDAsICZiaCk7CisJCWlmIChzdGF0dXMpIHsKKwkJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJCW1sb2coTUxfRVJST1IsICJmYWlsZWQgdG8gcmVhZCBxdW90YSBmaWxlIGluZm8gaGVhZGVyICIKKwkJCQkiKHNsb3Q9JWQgdHlwZT0lZClcbiIsIHNsb3RfbnVtLCB0eXBlKTsKKwkJCWdvdG8gb3V0X2xvY2s7CisJCX0KKwkJbGRpbmZvID0gKHN0cnVjdCBvY2ZzMl9sb2NhbF9kaXNrX2RxaW5mbyAqKShiaC0+Yl9kYXRhICsKKwkJCQkJCQlPQ0ZTMl9MT0NBTF9JTkZPX09GRik7CisJCXN0YXR1cyA9IG9jZnMyX3JlY292ZXJ5X2xvYWRfcXVvdGEobHFpbm9kZSwgbGRpbmZvLCB0eXBlLAorCQkJCQkJICAgJnJlYy0+cl9saXN0W3R5cGVdKTsKKwkJYnJlbHNlKGJoKTsKK291dF9sb2NrOgorCQlvY2ZzMl9pbm9kZV91bmxvY2sobHFpbm9kZSwgMSk7CitvdXRfcHV0OgorCQlpcHV0KGxxaW5vZGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCX0KK291dDoKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlvY2ZzMl9mcmVlX3F1b3RhX3JlY292ZXJ5KHJlYyk7CisJCXJlYyA9IEVSUl9QVFIoc3RhdHVzKTsKKwl9CisJcmV0dXJuIHJlYzsKK30KKworLyogU3luYyBjaGFuZ2VzIGluIGxvY2FsIHF1b3RhIGZpbGUgaW50byBnbG9iYWwgcXVvdGEgZmlsZSBhbmQKKyAqIHJlaW5pdGlhbGl6ZSBsb2NhbCBxdW90YSBmaWxlLgorICogVGhlIGZ1bmN0aW9uIGV4cGVjdHMgbG9jYWwgcXVvdGEgZmlsZSB0byBiZSBhbHJlYWR5IGxvY2tlZCBhbmQKKyAqIGRxb25vZmZfbXV0ZXggbG9ja2VkLiAqLworc3RhdGljIGludCBvY2ZzMl9yZWNvdmVyX2xvY2FsX3F1b3RhX2ZpbGUoc3RydWN0IGlub2RlICpscWlub2RlLAorCQkJCQkgIGludCB0eXBlLAorCQkJCQkgIHN0cnVjdCBvY2ZzMl9xdW90YV9yZWNvdmVyeSAqcmVjKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBscWlub2RlLT5pX3NiOworCXN0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvICpvaW5mbyA9IHNiX2RxaW5mbyhzYiwgdHlwZSktPmRxaV9wcml2OworCXN0cnVjdCBvY2ZzMl9sb2NhbF9kaXNrX2NodW5rICpkY2h1bms7CisJc3RydWN0IG9jZnMyX2xvY2FsX2Rpc2tfZHFibGsgKmRxYmxrOworCXN0cnVjdCBkcXVvdCAqZHF1b3Q7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhiaCA9IE5VTEwsICpxYmggPSBOVUxMOworCWludCBzdGF0dXMgPSAwOworCWludCBiaXQsIGNodW5rOworCXN0cnVjdCBvY2ZzMl9yZWNvdmVyeV9jaHVuayAqcmNodW5rLCAqbmV4dDsKKwlxc2l6ZV90IHNwYWNlY2hhbmdlLCBpbm9kZWNoYW5nZTsKKworCW1sb2dfZW50cnkoImlubz0lbHUgdHlwZT0ldSIsICh1bnNpZ25lZCBsb25nKWxxaW5vZGUtPmlfaW5vLCB0eXBlKTsKKworCXN0YXR1cyA9IG9jZnMyX2xvY2tfZ2xvYmFsX3FmKG9pbmZvLCAxKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBvdXQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmNodW5rLCBuZXh0LCAmKHJlYy0+cl9saXN0W3R5cGVdKSwgcmNfbGlzdCkgeworCQljaHVuayA9IHJjaHVuay0+cmNfY2h1bms7CisJCWhiaCA9IE5VTEw7CisJCXN0YXR1cyA9IG9jZnMyX3JlYWRfcXVvdGFfYmxvY2sobHFpbm9kZSwKKwkJCQkJCW9sX3F1b3RhX2NodW5rX2Jsb2NrKHNiLCBjaHVuayksCisJCQkJCQkmaGJoKTsKKwkJaWYgKHN0YXR1cykgeworCQkJbWxvZ19lcnJubyhzdGF0dXMpOworCQkJYnJlYWs7CisJCX0KKwkJZGNodW5rID0gKHN0cnVjdCBvY2ZzMl9sb2NhbF9kaXNrX2NodW5rICopaGJoLT5iX2RhdGE7CisJCWZvcl9lYWNoX2JpdChiaXQsIHJjaHVuay0+cmNfYml0bWFwLCBvbF9jaHVua19lbnRyaWVzKHNiKSkgeworCQkJcWJoID0gTlVMTDsKKwkJCXN0YXR1cyA9IG9jZnMyX3JlYWRfcXVvdGFfYmxvY2sobHFpbm9kZSwKKwkJCQkJCW9sX2RxYmxrX2Jsb2NrKHNiLCBjaHVuaywgYml0KSwKKwkJCQkJCSZxYmgpOworCQkJaWYgKHN0YXR1cykgeworCQkJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRxYmxrID0gKHN0cnVjdCBvY2ZzMl9sb2NhbF9kaXNrX2RxYmxrICopKHFiaC0+Yl9kYXRhICsKKwkJCQlvbF9kcWJsa19ibG9ja19vZmYoc2IsIGNodW5rLCBiaXQpKTsKKwkJCWRxdW90ID0gZHFnZXQoc2IsIGxlNjRfdG9fY3B1KGRxYmxrLT5kcWJfaWQpLCB0eXBlKTsKKwkJCWlmICghZHF1b3QpIHsKKwkJCQlzdGF0dXMgPSAtRUlPOworCQkJCW1sb2coTUxfRVJST1IsICJGYWlsZWQgdG8gZ2V0IHF1b3RhIHN0cnVjdHVyZSAiCisJCQkJICAgICAiZm9yIGlkICV1LCB0eXBlICVkLiBDYW5ub3QgZmluaXNoIHF1b3RhICIKKwkJCQkgICAgICJmaWxlIHJlY292ZXJ5LlxuIiwKKwkJCQkgICAgICh1bnNpZ25lZClsZTY0X3RvX2NwdShkcWJsay0+ZHFiX2lkKSwKKwkJCQkgICAgIHR5cGUpOworCQkJCWdvdG8gb3V0X3B1dF9iaDsKKwkJCX0KKwkJCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKE9DRlMyX1NCKHNiKSwKKwkJCQkJCSAgIE9DRlMyX1FTWU5DX0NSRURJVFMpOworCQkJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCQkJc3RhdHVzID0gUFRSX0VSUihoYW5kbGUpOworCQkJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJCQlnb3RvIG91dF9wdXRfZHF1b3Q7CisJCQl9CisJCQltdXRleF9sb2NrKCZzYl9kcW9wdChzYiktPmRxaW9fbXV0ZXgpOworCQkJc3Bpbl9sb2NrKCZkcV9kYXRhX2xvY2spOworCQkJLyogQWRkIHVzYWdlIGZyb20gcXVvdGEgZW50cnkgaW50byBxdW90YSBjaGFuZ2VzCisJCQkgKiBvZiBvdXIgbm9kZS4gQXV4aWxpYXJ5IHZhcmlhYmxlcyBhcmUgaW1wb3J0YW50CisJCQkgKiBkdWUgdG8gc2lnbmVkbmVzcyAqLworCQkJc3BhY2VjaGFuZ2UgPSBsZTY0X3RvX2NwdShkcWJsay0+ZHFiX3NwYWNlbW9kKTsKKwkJCWlub2RlY2hhbmdlID0gbGU2NF90b19jcHUoZHFibGstPmRxYl9pbm9kZW1vZCk7CisJCQlkcXVvdC0+ZHFfZHFiLmRxYl9jdXJzcGFjZSArPSBzcGFjZWNoYW5nZTsKKwkJCWRxdW90LT5kcV9kcWIuZHFiX2N1cmlub2RlcyArPSBpbm9kZWNoYW5nZTsKKwkJCXNwaW5fdW5sb2NrKCZkcV9kYXRhX2xvY2spOworCQkJLyogV2Ugd2FudCB0byBkcm9wIHJlZmVyZW5jZSBoZWxkIGJ5IHRoZSBjcmFzaGVkCisJCQkgKiBub2RlLiBTaW5jZSB3ZSBoYXZlIG91ciBvd24gcmVmZXJlbmNlIHdlIGtub3cKKwkJCSAqIGdsb2JhbCBzdHJ1Y3R1cmUgYWN0dWFsbHkgd29uJ3QgYmUgZnJlZWQuICovCisJCQlzdGF0dXMgPSBvY2ZzMl9nbG9iYWxfcmVsZWFzZV9kcXVvdChkcXVvdCk7CisJCQlpZiAoc3RhdHVzIDwgMCkgeworCQkJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJCQlnb3RvIG91dF9jb21taXQ7CisJCQl9CisJCQkvKiBSZWxlYXNlIGxvY2FsIHF1b3RhIGZpbGUgZW50cnkgKi8KKwkJCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RxKGhhbmRsZSwgbHFpbm9kZSwKKwkJCQkJcWJoLCBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJCQlpZiAoc3RhdHVzIDwgMCkgeworCQkJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJCQlnb3RvIG91dF9jb21taXQ7CisJCQl9CisJCQlsb2NrX2J1ZmZlcihxYmgpOworCQkJV0FSTl9PTighb2NmczJfdGVzdF9iaXQoYml0LCBkY2h1bmstPmRxY19iaXRtYXApKTsKKwkJCW9jZnMyX2NsZWFyX2JpdChiaXQsIGRjaHVuay0+ZHFjX2JpdG1hcCk7CisJCQlsZTMyX2FkZF9jcHUoJmRjaHVuay0+ZHFjX2ZyZWUsIDEpOworCQkJdW5sb2NrX2J1ZmZlcihxYmgpOworCQkJc3RhdHVzID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHFiaCk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQltbG9nX2Vycm5vKHN0YXR1cyk7CitvdXRfY29tbWl0OgorCQkJbXV0ZXhfdW5sb2NrKCZzYl9kcW9wdChzYiktPmRxaW9fbXV0ZXgpOworCQkJb2NmczJfY29tbWl0X3RyYW5zKE9DRlMyX1NCKHNiKSwgaGFuZGxlKTsKK291dF9wdXRfZHF1b3Q6CisJCQlkcXB1dChkcXVvdCk7CitvdXRfcHV0X2JoOgorCQkJYnJlbHNlKHFiaCk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlicmVhazsKKwkJfQorCQlicmVsc2UoaGJoKTsKKwkJbGlzdF9kZWwoJnJjaHVuay0+cmNfbGlzdCk7CisJCWtmcmVlKHJjaHVuay0+cmNfYml0bWFwKTsKKwkJa2ZyZWUocmNodW5rKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwl9CisJb2NmczJfdW5sb2NrX2dsb2JhbF9xZihvaW5mbywgMSk7CitvdXQ6CisJaWYgKHN0YXR1cyA8IDApCisJCWZyZWVfcmVjb3ZlcnlfbGlzdCgmKHJlYy0+cl9saXN0W3R5cGVdKSk7CisJbWxvZ19leGl0KHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogUmVjb3ZlciBsb2NhbCBxdW90YSBmaWxlcyBmb3IgZ2l2ZW4gbm9kZSBkaWZmZXJlbnQgZnJvbSB1cyAqLworaW50IG9jZnMyX2ZpbmlzaF9xdW90YV9yZWNvdmVyeShzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKKwkJCQlzdHJ1Y3Qgb2NmczJfcXVvdGFfcmVjb3ZlcnkgKnJlYywKKwkJCQlpbnQgc2xvdF9udW0pCit7CisJdW5zaWduZWQgaW50IGlub1tNQVhRVU9UQVNdID0geyBMT0NBTF9VU0VSX1FVT1RBX1NZU1RFTV9JTk9ERSwKKwkJCQkJTE9DQUxfR1JPVVBfUVVPVEFfU1lTVEVNX0lOT0RFIH07CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IG9zYi0+c2I7CisJc3RydWN0IG9jZnMyX2xvY2FsX2Rpc2tfZHFpbmZvICpsZGluZm87CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwloYW5kbGVfdCAqaGFuZGxlOworCWludCB0eXBlOworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBpbm9kZSAqbHFpbm9kZTsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisKKwltbG9nKE1MX05PVElDRSwgIkZpbmlzaGluZyBxdW90YSByZWNvdmVyeSBpbiBzbG90ICV1XG4iLCBzbG90X251bSk7CisJbXV0ZXhfbG9jaygmc2JfZHFvcHQoc2IpLT5kcW9ub2ZmX211dGV4KTsKKwlmb3IgKHR5cGUgPSAwOyB0eXBlIDwgTUFYUVVPVEFTOyB0eXBlKyspIHsKKwkJaWYgKGxpc3RfZW1wdHkoJihyZWMtPnJfbGlzdFt0eXBlXSkpKQorCQkJY29udGludWU7CisJCW1sb2coMCwgIlJlY292ZXJpbmcgcXVvdGEgaW4gc2xvdCAlZFxuIiwgc2xvdF9udW0pOworCQlscWlub2RlID0gb2NmczJfZ2V0X3N5c3RlbV9maWxlX2lub2RlKG9zYiwgaW5vW3R5cGVdLCBzbG90X251bSk7CisJCWlmICghbHFpbm9kZSkgeworCQkJc3RhdHVzID0gLUVOT0VOVDsKKwkJCWdvdG8gb3V0OworCQl9CisJCXN0YXR1cyA9IG9jZnMyX2lub2RlX2xvY2tfZnVsbChscWlub2RlLCBOVUxMLCAxLAorCQkJCQkJICAgICAgIE9DRlMyX01FVEFfTE9DS19OT1FVRVVFKTsKKwkJLyogU29tZW9uZSBlbHNlIGlzIGhvbGRpbmcgdGhlIGxvY2s/IFRoZW4gaGUgbXVzdCBiZQorCQkgKiBkb2luZyB0aGUgcmVjb3ZlcnkuIEp1c3Qgc2tpcCB0aGUgZmlsZS4uLiAqLworCQlpZiAoc3RhdHVzID09IC1FQUdBSU4pIHsKKwkJCW1sb2coTUxfTk9USUNFLCAic2tpcHBpbmcgcXVvdGEgcmVjb3ZlcnkgZm9yIHNsb3QgJWQgIgorCQkJICAgICAiYmVjYXVzZSBxdW90YSBmaWxlIGlzIGxvY2tlZC5cbiIsIHNsb3RfbnVtKTsKKwkJCXN0YXR1cyA9IDA7CisJCQlnb3RvIG91dF9wdXQ7CisJCX0gZWxzZSBpZiAoc3RhdHVzIDwgMCkgeworCQkJbWxvZ19lcnJubyhzdGF0dXMpOworCQkJZ290byBvdXRfcHV0OworCQl9CisJCS8qIE5vdyByZWFkIGxvY2FsIGhlYWRlciAqLworCQliaCA9IE5VTEw7CisJCXN0YXR1cyA9IG9jZnMyX3JlYWRfcXVvdGFfYmxvY2sobHFpbm9kZSwgMCwgJmJoKTsKKwkJaWYgKHN0YXR1cykgeworCQkJbWxvZ19lcnJubyhzdGF0dXMpOworCQkJbWxvZyhNTF9FUlJPUiwgImZhaWxlZCB0byByZWFkIHF1b3RhIGZpbGUgaW5mbyBoZWFkZXIgIgorCQkJCSIoc2xvdD0lZCB0eXBlPSVkKVxuIiwgc2xvdF9udW0sIHR5cGUpOworCQkJZ290byBvdXRfbG9jazsKKwkJfQorCQlsZGluZm8gPSAoc3RydWN0IG9jZnMyX2xvY2FsX2Rpc2tfZHFpbmZvICopKGJoLT5iX2RhdGEgKworCQkJCQkJCU9DRlMyX0xPQ0FMX0lORk9fT0ZGKTsKKwkJLyogSXMgcmVjb3Zlcnkgc3RpbGwgbmVlZGVkPyAqLworCQlmbGFncyA9IGxlMzJfdG9fY3B1KGxkaW5mby0+ZHFpX2ZsYWdzKTsKKwkJaWYgKCEoZmxhZ3MgJiBPTFFGX0NMRUFOKSkKKwkJCXN0YXR1cyA9IG9jZnMyX3JlY292ZXJfbG9jYWxfcXVvdGFfZmlsZShscWlub2RlLAorCQkJCQkJCQl0eXBlLAorCQkJCQkJCQlyZWMpOworCQkvKiBXZSBkb24ndCB3YW50IHRvIG1hcmsgZmlsZSBhcyBjbGVhbiB3aGVuIGl0IGlzIGFjdHVhbGx5CisJCSAqIGFjdGl2ZSAqLworCQlpZiAoc2xvdF9udW0gPT0gb3NiLT5zbG90X251bSkKKwkJCWdvdG8gb3V0X2JoOworCQkvKiBNYXJrIHF1b3RhIGZpbGUgYXMgY2xlYW4gaWYgd2UgYXJlIHJlY292ZXJpbmcgcXVvdGEgZmlsZSBvZgorCQkgKiBzb21lIG90aGVyIG5vZGUuICovCisJCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgMSk7CisJCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQkJc3RhdHVzID0gUFRSX0VSUihoYW5kbGUpOworCQkJbWxvZ19lcnJubyhzdGF0dXMpOworCQkJZ290byBvdXRfYmg7CisJCX0KKwkJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZHEoaGFuZGxlLCBscWlub2RlLCBiaCwKKwkJCQkJCSBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJCWlmIChzdGF0dXMgPCAwKSB7CisJCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCQlnb3RvIG91dF90cmFuczsKKwkJfQorCQlsb2NrX2J1ZmZlcihiaCk7CisJCWxkaW5mby0+ZHFpX2ZsYWdzID0gY3B1X3RvX2xlMzIoZmxhZ3MgfCBPTFFGX0NMRUFOKTsKKwkJdW5sb2NrX2J1ZmZlcihiaCk7CisJCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBiaCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJbWxvZ19lcnJubyhzdGF0dXMpOworb3V0X3RyYW5zOgorCQlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOworb3V0X2JoOgorCQlicmVsc2UoYmgpOworb3V0X2xvY2s6CisJCW9jZnMyX2lub2RlX3VubG9jayhscWlub2RlLCAxKTsKK291dF9wdXQ6CisJCWlwdXQobHFpbm9kZSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJfQorb3V0OgorCW11dGV4X3VubG9jaygmc2JfZHFvcHQoc2IpLT5kcW9ub2ZmX211dGV4KTsKKwlrZnJlZShyZWMpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIFJlYWQgaW5mb3JtYXRpb24gaGVhZGVyIGZyb20gcXVvdGEgZmlsZSAqLworc3RhdGljIGludCBvY2ZzMl9sb2NhbF9yZWFkX2luZm8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpCit7CisJc3RydWN0IG9jZnMyX2xvY2FsX2Rpc2tfZHFpbmZvICpsZGluZm87CisJc3RydWN0IG1lbV9kcWluZm8gKmluZm8gPSBzYl9kcWluZm8oc2IsIHR5cGUpOworCXN0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvICpvaW5mbzsKKwlzdHJ1Y3QgaW5vZGUgKmxxaW5vZGUgPSBzYl9kcW9wdChzYiktPmZpbGVzW3R5cGVdOworCWludCBzdGF0dXM7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJc3RydWN0IG9jZnMyX3F1b3RhX3JlY292ZXJ5ICpyZWM7CisJaW50IGxvY2tlZCA9IDA7CisKKwlpbmZvLT5kcWlfbWF4YmxpbWl0ID0gMHg3ZmZmZmZmZmZmZmZmZmZmTEw7CisJaW5mby0+ZHFpX21heGlsaW1pdCA9IDB4N2ZmZmZmZmZmZmZmZmZmZkxMOworCW9pbmZvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG9jZnMyX21lbV9kcWluZm8pLCBHRlBfTk9GUyk7CisJaWYgKCFvaW5mbykgeworCQltbG9nKE1MX0VSUk9SLCAiZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igb2NmczIgcXVvdGEiCisJCQkgICAgICAgIiBpbmZvLiIpOworCQlnb3RvIG91dF9lcnI7CisJfQorCWluZm8tPmRxaV9wcml2ID0gb2luZm87CisJb2luZm8tPmRxaV90eXBlID0gdHlwZTsKKwlJTklUX0xJU1RfSEVBRCgmb2luZm8tPmRxaV9jaHVuayk7CisJb2luZm8tPmRxaV9yZWMgPSBOVUxMOworCW9pbmZvLT5kcWlfbHFpX2JoID0gTlVMTDsKKwlvaW5mby0+ZHFpX2liaCA9IE5VTEw7CisKKwlzdGF0dXMgPSBvY2ZzMl9nbG9iYWxfcmVhZF9pbmZvKHNiLCB0eXBlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBvdXRfZXJyOworCisJc3RhdHVzID0gb2NmczJfaW5vZGVfbG9jayhscWlub2RlLCAmb2luZm8tPmRxaV9scWlfYmgsIDEpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBvdXRfZXJyOworCX0KKwlsb2NrZWQgPSAxOworCisJLyogTm93IHJlYWQgbG9jYWwgaGVhZGVyICovCisJc3RhdHVzID0gb2NmczJfcmVhZF9xdW90YV9ibG9jayhscWlub2RlLCAwLCAmYmgpOworCWlmIChzdGF0dXMpIHsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQltbG9nKE1MX0VSUk9SLCAiZmFpbGVkIHRvIHJlYWQgcXVvdGEgZmlsZSBpbmZvIGhlYWRlciAiCisJCQkiKHR5cGU9JWQpXG4iLCB0eXBlKTsKKwkJZ290byBvdXRfZXJyOworCX0KKwlsZGluZm8gPSAoc3RydWN0IG9jZnMyX2xvY2FsX2Rpc2tfZHFpbmZvICopKGJoLT5iX2RhdGEgKworCQkJCQkJT0NGUzJfTE9DQUxfSU5GT19PRkYpOworCWluZm8tPmRxaV9mbGFncyA9IGxlMzJfdG9fY3B1KGxkaW5mby0+ZHFpX2ZsYWdzKTsKKwlvaW5mby0+ZHFpX2NodW5rcyA9IGxlMzJfdG9fY3B1KGxkaW5mby0+ZHFpX2NodW5rcyk7CisJb2luZm8tPmRxaV9ibG9ja3MgPSBsZTMyX3RvX2NwdShsZGluZm8tPmRxaV9ibG9ja3MpOworCW9pbmZvLT5kcWlfaWJoID0gYmg7CisKKwkvKiBXZSBjcmFzaGVkIHdoZW4gdXNpbmcgbG9jYWwgcXVvdGEgZmlsZT8gKi8KKwlpZiAoIShpbmZvLT5kcWlfZmxhZ3MgJiBPTFFGX0NMRUFOKSkgeworCQlyZWMgPSBPQ0ZTMl9TQihzYiktPnF1b3RhX3JlYzsKKwkJaWYgKCFyZWMpIHsKKwkJCXJlYyA9IG9jZnMyX2FsbG9jX3F1b3RhX3JlY292ZXJ5KCk7CisJCQlpZiAoIXJlYykgeworCQkJCXN0YXR1cyA9IC1FTk9NRU07CisJCQkJbWxvZ19lcnJubyhzdGF0dXMpOworCQkJCWdvdG8gb3V0X2VycjsKKwkJCX0KKwkJCU9DRlMyX1NCKHNiKS0+cXVvdGFfcmVjID0gcmVjOworCQl9CisKKwkJc3RhdHVzID0gb2NmczJfcmVjb3ZlcnlfbG9hZF9xdW90YShscWlub2RlLCBsZGluZm8sIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjLT5yX2xpc3RbdHlwZV0pOworCQlpZiAoc3RhdHVzIDwgMCkgeworCQkJbWxvZ19lcnJubyhzdGF0dXMpOworCQkJZ290byBvdXRfZXJyOworCQl9CisJfQorCisJc3RhdHVzID0gb2NmczJfbG9hZF9sb2NhbF9xdW90YV9iaXRtYXBzKGxxaW5vZGUsCisJCQkJCQlsZGluZm8sCisJCQkJCQkmb2luZm8tPmRxaV9jaHVuayk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJLyogTm93IG1hcmsgcXVvdGEgZmlsZSBhcyB1c2VkICovCisJaW5mby0+ZHFpX2ZsYWdzICY9IH5PTFFGX0NMRUFOOworCXN0YXR1cyA9IG9jZnMyX21vZGlmeV9iaChscWlub2RlLCBiaCwgb2xxX3VwZGF0ZV9pbmZvLCBpbmZvKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlyZXR1cm4gMDsKK291dF9lcnI6CisJaWYgKG9pbmZvKSB7CisJCWlwdXQob2luZm8tPmRxaV9ncWlub2RlKTsKKwkJb2NmczJfc2ltcGxlX2Ryb3BfbG9ja3JlcyhPQ0ZTMl9TQihzYiksICZvaW5mby0+ZHFpX2dxbG9jayk7CisJCW9jZnMyX2xvY2tfcmVzX2ZyZWUoJm9pbmZvLT5kcWlfZ3Fsb2NrKTsKKwkJYnJlbHNlKG9pbmZvLT5kcWlfbHFpX2JoKTsKKwkJaWYgKGxvY2tlZCkKKwkJCW9jZnMyX2lub2RlX3VubG9jayhscWlub2RlLCAxKTsKKwkJb2NmczJfcmVsZWFzZV9sb2NhbF9xdW90YV9iaXRtYXBzKCZvaW5mby0+ZHFpX2NodW5rKTsKKwkJa2ZyZWUob2luZm8pOworCX0KKwlicmVsc2UoYmgpOworCXJldHVybiAtMTsKK30KKworLyogV3JpdGUgbG9jYWwgaW5mbyB0byBxdW90YSBmaWxlICovCitzdGF0aWMgaW50IG9jZnMyX2xvY2FsX3dyaXRlX2luZm8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpCit7CisJc3RydWN0IG1lbV9kcWluZm8gKmluZm8gPSBzYl9kcWluZm8oc2IsIHR5cGUpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSAoKHN0cnVjdCBvY2ZzMl9tZW1fZHFpbmZvICopaW5mby0+ZHFpX3ByaXYpCisJCQkJCQktPmRxaV9pYmg7CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IG9jZnMyX21vZGlmeV9iaChzYl9kcW9wdChzYiktPmZpbGVzW3R5cGVdLCBiaCwgb2xxX3VwZGF0ZV9pbmZvLAorCQkJCSBpbmZvKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogUmVsZWFzZSBpbmZvIGZyb20gbWVtb3J5ICovCitzdGF0aWMgaW50IG9jZnMyX2xvY2FsX2ZyZWVfaW5mbyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgbWVtX2RxaW5mbyAqaW5mbyA9IHNiX2RxaW5mbyhzYiwgdHlwZSk7CisJc3RydWN0IG9jZnMyX21lbV9kcWluZm8gKm9pbmZvID0gaW5mby0+ZHFpX3ByaXY7CisJc3RydWN0IG9jZnMyX3F1b3RhX2NodW5rICpjaHVuazsKKwlzdHJ1Y3Qgb2NmczJfbG9jYWxfZGlza19jaHVuayAqZGNodW5rOworCWludCBtYXJrX2NsZWFuID0gMSwgbGVuOworCWludCBzdGF0dXM7CisKKwkvKiBBdCB0aGlzIHBvaW50IHdlIGtub3cgdGhlcmUgYXJlIG5vIG1vcmUgZHF1b3RzIGFuZCB0aHVzCisJICogZXZlbiBpZiB0aGVyZSdzIHNvbWUgc3luYyBpbiB0aGUgcGRmbHVzaCBxdWV1ZSwgaXQgd29uJ3QKKwkgKiBmaW5kIGFueSBkcXVvdHMgYW5kIHJldHVybiB3aXRob3V0IGRvaW5nIGFueXRoaW5nICovCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZvaW5mby0+ZHFpX3N5bmNfd29yayk7CisJaXB1dChvaW5mby0+ZHFpX2dxaW5vZGUpOworCW9jZnMyX3NpbXBsZV9kcm9wX2xvY2tyZXMoT0NGUzJfU0Ioc2IpLCAmb2luZm8tPmRxaV9ncWxvY2spOworCW9jZnMyX2xvY2tfcmVzX2ZyZWUoJm9pbmZvLT5kcWlfZ3Fsb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNodW5rLCAmb2luZm8tPmRxaV9jaHVuaywgcWNfY2h1bmspIHsKKwkJZGNodW5rID0gKHN0cnVjdCBvY2ZzMl9sb2NhbF9kaXNrX2NodW5rICopCisJCQkJCShjaHVuay0+cWNfaGVhZGVyYmgtPmJfZGF0YSk7CisJCWlmIChjaHVuay0+cWNfbnVtIDwgb2luZm8tPmRxaV9jaHVua3MgLSAxKSB7CisJCQlsZW4gPSBvbF9jaHVua19lbnRyaWVzKHNiKTsKKwkJfSBlbHNlIHsKKwkJCWxlbiA9IChvaW5mby0+ZHFpX2Jsb2NrcyAtCisJCQkgICAgICAgb2xfcXVvdGFfY2h1bmtfYmxvY2soc2IsIGNodW5rLT5xY19udW0pIC0gMSkKKwkJCSAgICAgICogb2xfcXVvdGFfZW50cmllc19wZXJfYmxvY2soc2IpOworCQl9CisJCS8qIE5vdCBhbGwgZW50cmllcyBmcmVlPyBCdWchICovCisJCWlmIChsZTMyX3RvX2NwdShkY2h1bmstPmRxY19mcmVlKSAhPSBsZW4pIHsKKwkJCW1sb2coTUxfRVJST1IsICJyZWxlYXNpbmcgcXVvdGEgZmlsZSB3aXRoIHVzZWQgIgorCQkJCQkiZW50cmllcyAodHlwZT0lZClcbiIsIHR5cGUpOworCQkJbWFya19jbGVhbiA9IDA7CisJCX0KKwl9CisJb2NmczJfcmVsZWFzZV9sb2NhbF9xdW90YV9iaXRtYXBzKCZvaW5mby0+ZHFpX2NodW5rKTsKKworCS8qIGRxb25vZmZfbXV0ZXggcHJvdGVjdHMgdXMgYWdhaW5zdCByYWNpbmcgd2l0aCByZWNvdmVyeSB0aHJlYWQuLi4gKi8KKwlpZiAob2luZm8tPmRxaV9yZWMpIHsKKwkJb2NmczJfZnJlZV9xdW90YV9yZWNvdmVyeShvaW5mby0+ZHFpX3JlYyk7CisJCW1hcmtfY2xlYW4gPSAwOworCX0KKworCWlmICghbWFya19jbGVhbikKKwkJZ290byBvdXQ7CisKKwkvKiBNYXJrIGxvY2FsIGZpbGUgYXMgY2xlYW4gKi8KKwlpbmZvLT5kcWlfZmxhZ3MgfD0gT0xRRl9DTEVBTjsKKwlzdGF0dXMgPSBvY2ZzMl9tb2RpZnlfYmgoc2JfZHFvcHQoc2IpLT5maWxlc1t0eXBlXSwKKwkJCQkgb2luZm8tPmRxaV9pYmgsCisJCQkJIG9scV91cGRhdGVfaW5mbywKKwkJCQkgaW5mbyk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIG91dDsKKwl9CisKK291dDoKKwlvY2ZzMl9pbm9kZV91bmxvY2soc2JfZHFvcHQoc2IpLT5maWxlc1t0eXBlXSwgMSk7CisJYnJlbHNlKG9pbmZvLT5kcWlfaWJoKTsKKwlicmVsc2Uob2luZm8tPmRxaV9scWlfYmgpOworCWtmcmVlKG9pbmZvKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgb2xxX3NldF9kcXVvdChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCB2b2lkICpwcml2YXRlKQoreworCXN0cnVjdCBvY2ZzMl9kcXVvdCAqb2QgPSBwcml2YXRlOworCXN0cnVjdCBvY2ZzMl9sb2NhbF9kaXNrX2RxYmxrICpkcWJsazsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gb2QtPmRxX2RxdW90LmRxX3NiOworCisJZHFibGsgPSAoc3RydWN0IG9jZnMyX2xvY2FsX2Rpc2tfZHFibGsgKikoYmgtPmJfZGF0YQorCQkrIG9sX2RxYmxrX2Jsb2NrX29mZnNldChzYiwgb2QtPmRxX2xvY2FsX29mZikpOworCisJZHFibGstPmRxYl9pZCA9IGNwdV90b19sZTY0KG9kLT5kcV9kcXVvdC5kcV9pZCk7CisJc3Bpbl9sb2NrKCZkcV9kYXRhX2xvY2spOworCWRxYmxrLT5kcWJfc3BhY2Vtb2QgPSBjcHVfdG9fbGU2NChvZC0+ZHFfZHF1b3QuZHFfZHFiLmRxYl9jdXJzcGFjZSAtCisJCQkJCSAgb2QtPmRxX29yaWdzcGFjZSk7CisJZHFibGstPmRxYl9pbm9kZW1vZCA9IGNwdV90b19sZTY0KG9kLT5kcV9kcXVvdC5kcV9kcWIuZHFiX2N1cmlub2RlcyAtCisJCQkJCSAgb2QtPmRxX29yaWdpbm9kZXMpOworCXNwaW5fdW5sb2NrKCZkcV9kYXRhX2xvY2spOworCW1sb2coMCwgIldyaXRpbmcgbG9jYWwgZHF1b3QgJXUgc3BhY2UgJWxsZCBpbm9kZXMgJWxsZFxuIiwKKwkgICAgIG9kLT5kcV9kcXVvdC5kcV9pZCwgKGxvbmcgbG9uZylsZTY0X3RvX2NwdShkcWJsay0+ZHFiX3NwYWNlbW9kKSwKKwkgICAgIChsb25nIGxvbmcpbGU2NF90b19jcHUoZHFibGstPmRxYl9pbm9kZW1vZCkpOworfQorCisvKiBXcml0ZSBkcXVvdCB0byBsb2NhbCBxdW90YSBmaWxlICovCitzdGF0aWMgaW50IG9jZnMyX2xvY2FsX3dyaXRlX2RxdW90KHN0cnVjdCBkcXVvdCAqZHF1b3QpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRxdW90LT5kcV9zYjsKKwlzdHJ1Y3Qgb2NmczJfZHF1b3QgKm9kID0gT0NGUzJfRFFVT1QoZHF1b3QpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBvY2ZzMl9yZWFkX3F1b3RhX2Jsb2NrKHNiX2Rxb3B0KHNiKS0+ZmlsZXNbZHF1b3QtPmRxX3R5cGVdLAorCQkJCSAgICBvbF9kcWJsa19maWxlX2Jsb2NrKHNiLCBvZC0+ZHFfbG9jYWxfb2ZmKSwKKwkJCQkgICAgJmJoKTsKKwlpZiAoc3RhdHVzKSB7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBvdXQ7CisJfQorCXN0YXR1cyA9IG9jZnMyX21vZGlmeV9iaChzYl9kcW9wdChzYiktPmZpbGVzW2RxdW90LT5kcV90eXBlXSwgYmgsCisJCQkJIG9scV9zZXRfZHF1b3QsIG9kKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gb3V0OworCX0KK291dDoKKwlicmVsc2UoYmgpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIEZpbmQgZnJlZSBlbnRyeSBpbiBsb2NhbCBxdW90YSBmaWxlICovCitzdGF0aWMgc3RydWN0IG9jZnMyX3F1b3RhX2NodW5rICpvY2ZzMl9maW5kX2ZyZWVfZW50cnkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkJCSAgICAgICBpbnQgdHlwZSwKKwkJCQkJCSAgICAgICBpbnQgKm9mZnNldCkKK3sKKwlzdHJ1Y3QgbWVtX2RxaW5mbyAqaW5mbyA9IHNiX2RxaW5mbyhzYiwgdHlwZSk7CisJc3RydWN0IG9jZnMyX21lbV9kcWluZm8gKm9pbmZvID0gaW5mby0+ZHFpX3ByaXY7CisJc3RydWN0IG9jZnMyX3F1b3RhX2NodW5rICpjaHVuazsKKwlzdHJ1Y3Qgb2NmczJfbG9jYWxfZGlza19jaHVuayAqZGNodW5rOworCWludCBmb3VuZCA9IDAsIGxlbjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2h1bmssICZvaW5mby0+ZHFpX2NodW5rLCBxY19jaHVuaykgeworCQlkY2h1bmsgPSAoc3RydWN0IG9jZnMyX2xvY2FsX2Rpc2tfY2h1bmsgKikKKwkJCQkJCWNodW5rLT5xY19oZWFkZXJiaC0+Yl9kYXRhOworCQlpZiAobGUzMl90b19jcHUoZGNodW5rLT5kcWNfZnJlZSkgPiAwKSB7CisJCQlmb3VuZCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoIWZvdW5kKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChjaHVuay0+cWNfbnVtIDwgb2luZm8tPmRxaV9jaHVua3MgLSAxKSB7CisJCWxlbiA9IG9sX2NodW5rX2VudHJpZXMoc2IpOworCX0gZWxzZSB7CisJCWxlbiA9IChvaW5mby0+ZHFpX2Jsb2NrcyAtCisJCSAgICAgICBvbF9xdW90YV9jaHVua19ibG9jayhzYiwgY2h1bmstPnFjX251bSkgLSAxKQorCQkgICAgICAqIG9sX3F1b3RhX2VudHJpZXNfcGVyX2Jsb2NrKHNiKTsKKwl9CisKKwlmb3VuZCA9IG9jZnMyX2ZpbmRfbmV4dF96ZXJvX2JpdChkY2h1bmstPmRxY19iaXRtYXAsIGxlbiwgMCk7CisJLyogV2UgZmFpbGVkPyAqLworCWlmIChmb3VuZCA9PSBsZW4pIHsKKwkJbWxvZyhNTF9FUlJPUiwgIkRpZCBub3QgZmluZCBlbXB0eSBlbnRyeSBpbiBjaHVuayAlZCB3aXRoICV1IgorCQkgICAgICIgZW50cmllcyBmcmVlICh0eXBlPSVkKVxuIiwgY2h1bmstPnFjX251bSwKKwkJICAgICBsZTMyX3RvX2NwdShkY2h1bmstPmRxY19mcmVlKSwgdHlwZSk7CisJCXJldHVybiBFUlJfUFRSKC1FSU8pOworCX0KKwkqb2Zmc2V0ID0gZm91bmQ7CisJcmV0dXJuIGNodW5rOworfQorCisvKiBBZGQgbmV3IGNodW5rIHRvIHRoZSBsb2NhbCBxdW90YSBmaWxlICovCitzdGF0aWMgc3RydWN0IG9jZnMyX3F1b3RhX2NodW5rICpvY2ZzMl9sb2NhbF9xdW90YV9hZGRfY2h1bmsoCisJCQkJCQkJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkJCQlpbnQgdHlwZSwKKwkJCQkJCQlpbnQgKm9mZnNldCkKK3sKKwlzdHJ1Y3QgbWVtX2RxaW5mbyAqaW5mbyA9IHNiX2RxaW5mbyhzYiwgdHlwZSk7CisJc3RydWN0IG9jZnMyX21lbV9kcWluZm8gKm9pbmZvID0gaW5mby0+ZHFpX3ByaXY7CisJc3RydWN0IGlub2RlICpscWlub2RlID0gc2JfZHFvcHQoc2IpLT5maWxlc1t0eXBlXTsKKwlzdHJ1Y3Qgb2NmczJfcXVvdGFfY2h1bmsgKmNodW5rID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfbG9jYWxfZGlza19jaHVuayAqZGNodW5rOworCWludCBzdGF0dXM7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwl1NjQgcF9ibGtubzsKKworCS8qIFdlIGFyZSBwcm90ZWN0ZWQgYnkgZHFpb19zZW0gc28gbm8gbG9ja2luZyBuZWVkZWQgKi8KKwlzdGF0dXMgPSBvY2ZzMl9leHRlbmRfbm9faG9sZXMobHFpbm9kZSwKKwkJCQkgICAgICAgbHFpbm9kZS0+aV9zaXplICsgMiAqIHNiLT5zX2Jsb2Nrc2l6ZSwKKwkJCQkgICAgICAgbHFpbm9kZS0+aV9zaXplKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gb3V0OworCX0KKwlzdGF0dXMgPSBvY2ZzMl9zaW1wbGVfc2l6ZV91cGRhdGUobHFpbm9kZSwgb2luZm8tPmRxaV9scWlfYmgsCisJCQkJCSAgbHFpbm9kZS0+aV9zaXplICsgMiAqIHNiLT5zX2Jsb2Nrc2l6ZSk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIG91dDsKKwl9CisKKwljaHVuayA9IGttZW1fY2FjaGVfYWxsb2Mob2NmczJfcWZfY2h1bmtfY2FjaGVwLCBHRlBfTk9GUyk7CisJaWYgKCFjaHVuaykgeworCQlzdGF0dXMgPSAtRU5PTUVNOworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gb3V0OworCX0KKworCWRvd25fcmVhZCgmT0NGUzJfSShscWlub2RlKS0+aXBfYWxsb2Nfc2VtKTsKKwlzdGF0dXMgPSBvY2ZzMl9leHRlbnRfbWFwX2dldF9ibG9ja3MobHFpbm9kZSwgb2luZm8tPmRxaV9ibG9ja3MsCisJCQkJCSAgICAgJnBfYmxrbm8sIE5VTEwsIE5VTEwpOworCXVwX3JlYWQoJk9DRlMyX0kobHFpbm9kZSktPmlwX2FsbG9jX3NlbSk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIG91dDsKKwl9CisJYmggPSBzYl9nZXRibGsoc2IsIHBfYmxrbm8pOworCWlmICghYmgpIHsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIG91dDsKKwl9CisJZGNodW5rID0gKHN0cnVjdCBvY2ZzMl9sb2NhbF9kaXNrX2NodW5rICopYmgtPmJfZGF0YTsKKworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKE9DRlMyX1NCKHNiKSwgMik7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCXN0YXR1cyA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIG91dDsKKwl9CisKKwlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19kcShoYW5kbGUsIGxxaW5vZGUsIGJoLAorCQkJCQkgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBvdXRfdHJhbnM7CisJfQorCWxvY2tfYnVmZmVyKGJoKTsKKwlkY2h1bmstPmRxY19mcmVlID0gY3B1X3RvX2xlMzIob2xfcXVvdGFfZW50cmllc19wZXJfYmxvY2soc2IpKTsKKwltZW1zZXQoZGNodW5rLT5kcWNfYml0bWFwLCAwLAorCSAgICAgICBzYi0+c19ibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IG9jZnMyX2xvY2FsX2Rpc2tfY2h1bmspIC0KKwkgICAgICAgT0NGUzJfUUJMS19SRVNFUlZFRF9TUEFDRSk7CisJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJdW5sb2NrX2J1ZmZlcihiaCk7CisJc3RhdHVzID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGJoKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gb3V0X3RyYW5zOworCX0KKworCW9pbmZvLT5kcWlfYmxvY2tzICs9IDI7CisJb2luZm8tPmRxaV9jaHVua3MrKzsKKwlzdGF0dXMgPSBvY2ZzMl9sb2NhbF93cml0ZV9pbmZvKHNiLCB0eXBlKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gb3V0X3RyYW5zOworCX0KKwlzdGF0dXMgPSBvY2ZzMl9jb21taXRfdHJhbnMoT0NGUzJfU0Ioc2IpLCBoYW5kbGUpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBvdXQ7CisJfQorCisJbGlzdF9hZGRfdGFpbCgmY2h1bmstPnFjX2NodW5rLCAmb2luZm8tPmRxaV9jaHVuayk7CisJY2h1bmstPnFjX251bSA9IGxpc3RfZW50cnkoY2h1bmstPnFjX2NodW5rLnByZXYsCisJCQkJICAgc3RydWN0IG9jZnMyX3F1b3RhX2NodW5rLAorCQkJCSAgIHFjX2NodW5rKS0+cWNfbnVtICsgMTsKKwljaHVuay0+cWNfaGVhZGVyYmggPSBiaDsKKwkqb2Zmc2V0ID0gMDsKKwlyZXR1cm4gY2h1bms7CitvdXRfdHJhbnM6CisJb2NmczJfY29tbWl0X3RyYW5zKE9DRlMyX1NCKHNiKSwgaGFuZGxlKTsKK291dDoKKwlicmVsc2UoYmgpOworCWttZW1fY2FjaGVfZnJlZShvY2ZzMl9xZl9jaHVua19jYWNoZXAsIGNodW5rKTsKKwlyZXR1cm4gRVJSX1BUUihzdGF0dXMpOworfQorCisvKiBGaW5kIGZyZWUgZW50cnkgaW4gbG9jYWwgcXVvdGEgZmlsZSAqLworc3RhdGljIHN0cnVjdCBvY2ZzMl9xdW90YV9jaHVuayAqb2NmczJfZXh0ZW5kX2xvY2FsX3F1b3RhX2ZpbGUoCisJCQkJCQkgICAgICAgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkJCSAgICAgICBpbnQgdHlwZSwKKwkJCQkJCSAgICAgICBpbnQgKm9mZnNldCkKK3sKKwlzdHJ1Y3QgbWVtX2RxaW5mbyAqaW5mbyA9IHNiX2RxaW5mbyhzYiwgdHlwZSk7CisJc3RydWN0IG9jZnMyX21lbV9kcWluZm8gKm9pbmZvID0gaW5mby0+ZHFpX3ByaXY7CisJc3RydWN0IG9jZnMyX3F1b3RhX2NodW5rICpjaHVuazsKKwlzdHJ1Y3QgaW5vZGUgKmxxaW5vZGUgPSBzYl9kcW9wdChzYiktPmZpbGVzW3R5cGVdOworCXN0cnVjdCBvY2ZzMl9sb2NhbF9kaXNrX2NodW5rICpkY2h1bms7CisJaW50IGVwYiA9IG9sX3F1b3RhX2VudHJpZXNfcGVyX2Jsb2NrKHNiKTsKKwl1bnNpZ25lZCBpbnQgY2h1bmtfYmxvY2tzOworCWludCBzdGF0dXM7CisJaGFuZGxlX3QgKmhhbmRsZTsKKworCWlmIChsaXN0X2VtcHR5KCZvaW5mby0+ZHFpX2NodW5rKSkKKwkJcmV0dXJuIG9jZnMyX2xvY2FsX3F1b3RhX2FkZF9jaHVuayhzYiwgdHlwZSwgb2Zmc2V0KTsKKwkvKiBJcyB0aGUgbGFzdCBjaHVuayBmdWxsPyAqLworCWNodW5rID0gbGlzdF9lbnRyeShvaW5mby0+ZHFpX2NodW5rLnByZXYsCisJCQlzdHJ1Y3Qgb2NmczJfcXVvdGFfY2h1bmssIHFjX2NodW5rKTsKKwljaHVua19ibG9ja3MgPSBvaW5mby0+ZHFpX2Jsb2NrcyAtCisJCQlvbF9xdW90YV9jaHVua19ibG9jayhzYiwgY2h1bmstPnFjX251bSkgLSAxOworCWlmIChvbF9jaHVua19ibG9ja3Moc2IpID09IGNodW5rX2Jsb2NrcykKKwkJcmV0dXJuIG9jZnMyX2xvY2FsX3F1b3RhX2FkZF9jaHVuayhzYiwgdHlwZSwgb2Zmc2V0KTsKKworCS8qIFdlIGFyZSBwcm90ZWN0ZWQgYnkgZHFpb19zZW0gc28gbm8gbG9ja2luZyBuZWVkZWQgKi8KKwlzdGF0dXMgPSBvY2ZzMl9leHRlbmRfbm9faG9sZXMobHFpbm9kZSwKKwkJCQkgICAgICAgbHFpbm9kZS0+aV9zaXplICsgc2ItPnNfYmxvY2tzaXplLAorCQkJCSAgICAgICBscWlub2RlLT5pX3NpemUpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBvdXQ7CisJfQorCXN0YXR1cyA9IG9jZnMyX3NpbXBsZV9zaXplX3VwZGF0ZShscWlub2RlLCBvaW5mby0+ZHFpX2xxaV9iaCwKKwkJCQkJICBscWlub2RlLT5pX3NpemUgKyBzYi0+c19ibG9ja3NpemUpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBvdXQ7CisJfQorCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKE9DRlMyX1NCKHNiKSwgMik7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCXN0YXR1cyA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIG91dDsKKwl9CisJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZHEoaGFuZGxlLCBscWlub2RlLCBjaHVuay0+cWNfaGVhZGVyYmgsCisJCQkJIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gb3V0X3RyYW5zOworCX0KKworCWRjaHVuayA9IChzdHJ1Y3Qgb2NmczJfbG9jYWxfZGlza19jaHVuayAqKWNodW5rLT5xY19oZWFkZXJiaC0+Yl9kYXRhOworCWxvY2tfYnVmZmVyKGNodW5rLT5xY19oZWFkZXJiaCk7CisJbGUzMl9hZGRfY3B1KCZkY2h1bmstPmRxY19mcmVlLCBvbF9xdW90YV9lbnRyaWVzX3Blcl9ibG9jayhzYikpOworCXVubG9ja19idWZmZXIoY2h1bmstPnFjX2hlYWRlcmJoKTsKKwlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgY2h1bmstPnFjX2hlYWRlcmJoKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gb3V0X3RyYW5zOworCX0KKwlvaW5mby0+ZHFpX2Jsb2NrcysrOworCXN0YXR1cyA9IG9jZnMyX2xvY2FsX3dyaXRlX2luZm8oc2IsIHR5cGUpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBvdXRfdHJhbnM7CisJfQorCisJc3RhdHVzID0gb2NmczJfY29tbWl0X3RyYW5zKE9DRlMyX1NCKHNiKSwgaGFuZGxlKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gb3V0OworCX0KKwkqb2Zmc2V0ID0gY2h1bmtfYmxvY2tzICogZXBiOworCXJldHVybiBjaHVuazsKK291dF90cmFuczoKKwlvY2ZzMl9jb21taXRfdHJhbnMoT0NGUzJfU0Ioc2IpLCBoYW5kbGUpOworb3V0OgorCXJldHVybiBFUlJfUFRSKHN0YXR1cyk7Cit9CisKK3N0YXRpYyB2b2lkIG9scV9hbGxvY19kcXVvdChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCB2b2lkICpwcml2YXRlKQoreworCWludCAqb2Zmc2V0ID0gcHJpdmF0ZTsKKwlzdHJ1Y3Qgb2NmczJfbG9jYWxfZGlza19jaHVuayAqZGNodW5rOworCisJZGNodW5rID0gKHN0cnVjdCBvY2ZzMl9sb2NhbF9kaXNrX2NodW5rICopYmgtPmJfZGF0YTsKKwlvY2ZzMl9zZXRfYml0KCpvZmZzZXQsIGRjaHVuay0+ZHFjX2JpdG1hcCk7CisJbGUzMl9hZGRfY3B1KCZkY2h1bmstPmRxY19mcmVlLCAtMSk7Cit9CisKKy8qIENyZWF0ZSBkcXVvdCBpbiB0aGUgbG9jYWwgZmlsZSBmb3IgZ2l2ZW4gaWQgKi8KK3N0YXRpYyBpbnQgb2NmczJfY3JlYXRlX2xvY2FsX2RxdW90KHN0cnVjdCBkcXVvdCAqZHF1b3QpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRxdW90LT5kcV9zYjsKKwlpbnQgdHlwZSA9IGRxdW90LT5kcV90eXBlOworCXN0cnVjdCBpbm9kZSAqbHFpbm9kZSA9IHNiX2Rxb3B0KHNiKS0+ZmlsZXNbdHlwZV07CisJc3RydWN0IG9jZnMyX3F1b3RhX2NodW5rICpjaHVuazsKKwlzdHJ1Y3Qgb2NmczJfZHF1b3QgKm9kID0gT0NGUzJfRFFVT1QoZHF1b3QpOworCWludCBvZmZzZXQ7CisJaW50IHN0YXR1czsKKworCWNodW5rID0gb2NmczJfZmluZF9mcmVlX2VudHJ5KHNiLCB0eXBlLCAmb2Zmc2V0KTsKKwlpZiAoIWNodW5rKSB7CisJCWNodW5rID0gb2NmczJfZXh0ZW5kX2xvY2FsX3F1b3RhX2ZpbGUoc2IsIHR5cGUsICZvZmZzZXQpOworCQlpZiAoSVNfRVJSKGNodW5rKSkKKwkJCXJldHVybiBQVFJfRVJSKGNodW5rKTsKKwl9IGVsc2UgaWYgKElTX0VSUihjaHVuaykpIHsKKwkJcmV0dXJuIFBUUl9FUlIoY2h1bmspOworCX0KKwlvZC0+ZHFfbG9jYWxfb2ZmID0gb2xfZHFibGtfb2ZmKHNiLCBjaHVuay0+cWNfbnVtLCBvZmZzZXQpOworCW9kLT5kcV9jaHVuayA9IGNodW5rOworCisJLyogSW5pdGlhbGl6ZSBkcXVvdCBzdHJ1Y3R1cmUgb24gZGlzayAqLworCXN0YXR1cyA9IG9jZnMyX2xvY2FsX3dyaXRlX2RxdW90KGRxdW90KTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIE1hcmsgc3RydWN0dXJlIGFzIGFsbG9jYXRlZCAqLworCXN0YXR1cyA9IG9jZnMyX21vZGlmeV9iaChscWlub2RlLCBjaHVuay0+cWNfaGVhZGVyYmgsIG9scV9hbGxvY19kcXVvdCwKKwkJCQkgJm9mZnNldCk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIG91dDsKKwl9CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogQ3JlYXRlIGVudHJ5IGluIGxvY2FsIGZpbGUgZm9yIGRxdW90LCBsb2FkIGRhdGEgZnJvbSB0aGUgZ2xvYmFsIGZpbGUgKi8KK3N0YXRpYyBpbnQgb2NmczJfbG9jYWxfcmVhZF9kcXVvdChzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCWludCBzdGF0dXM7CisKKwltbG9nX2VudHJ5KCJpZD0ldSwgdHlwZT0lZFxuIiwgZHF1b3QtPmRxX2lkLCBkcXVvdC0+ZHFfdHlwZSk7CisKKwlzdGF0dXMgPSBvY2ZzMl9nbG9iYWxfcmVhZF9kcXVvdChkcXVvdCk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJLyogTm93IGNyZWF0ZSBlbnRyeSBpbiB0aGUgbG9jYWwgcXVvdGEgZmlsZSAqLworCXN0YXR1cyA9IG9jZnMyX2NyZWF0ZV9sb2NhbF9kcXVvdChkcXVvdCk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIG91dF9lcnI7CisJfQorCW1sb2dfZXhpdCgwKTsKKwlyZXR1cm4gMDsKK291dF9lcnI6CisJbWxvZ19leGl0KHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogUmVsZWFzZSBkcXVvdCBzdHJ1Y3R1cmUgZnJvbSBsb2NhbCBxdW90YSBmaWxlLiBvY2ZzMl9yZWxlYXNlX2RxdW90KCkgaGFzCisgKiBhbHJlYWR5IHN0YXJ0ZWQgYSB0cmFuc2FjdGlvbiBhbmQgb2J0YWluZWQgZXhjbHVzaXZlIGxvY2sgZm9yIGdsb2JhbAorICogcXVvdGEgZmlsZS4gKi8KK3N0YXRpYyBpbnQgb2NmczJfbG9jYWxfcmVsZWFzZV9kcXVvdChzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCWludCBzdGF0dXM7CisJaW50IHR5cGUgPSBkcXVvdC0+ZHFfdHlwZTsKKwlzdHJ1Y3Qgb2NmczJfZHF1b3QgKm9kID0gT0NGUzJfRFFVT1QoZHF1b3QpOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkcXVvdC0+ZHFfc2I7CisJc3RydWN0IG9jZnMyX2xvY2FsX2Rpc2tfY2h1bmsgKmRjaHVuazsKKwlpbnQgb2Zmc2V0OworCWhhbmRsZV90ICpoYW5kbGUgPSBqb3VybmFsX2N1cnJlbnRfaGFuZGxlKCk7CisKKwlCVUdfT04oIWhhbmRsZSk7CisJLyogRmlyc3Qgd3JpdGUgYWxsIGxvY2FsIGNoYW5nZXMgdG8gZ2xvYmFsIGZpbGUgKi8KKwlzdGF0dXMgPSBvY2ZzMl9nbG9iYWxfcmVsZWFzZV9kcXVvdChkcXVvdCk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIG91dDsKKwl9CisKKwlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19kcShoYW5kbGUsIHNiX2Rxb3B0KHNiKS0+ZmlsZXNbdHlwZV0sCisJCQlvZC0+ZHFfY2h1bmstPnFjX2hlYWRlcmJoLCBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlnb3RvIG91dDsKKwl9CisJb2Zmc2V0ID0gb2xfZHFibGtfY2h1bmtfb2ZmKHNiLCBvZC0+ZHFfY2h1bmstPnFjX251bSwKKwkJCQkJICAgICBvZC0+ZHFfbG9jYWxfb2ZmKTsKKwlkY2h1bmsgPSAoc3RydWN0IG9jZnMyX2xvY2FsX2Rpc2tfY2h1bmsgKikKKwkJCShvZC0+ZHFfY2h1bmstPnFjX2hlYWRlcmJoLT5iX2RhdGEpOworCS8qIE1hcmsgc3RydWN0dXJlIGFzIGZyZWVkICovCisJbG9ja19idWZmZXIob2QtPmRxX2NodW5rLT5xY19oZWFkZXJiaCk7CisJb2NmczJfY2xlYXJfYml0KG9mZnNldCwgZGNodW5rLT5kcWNfYml0bWFwKTsKKwlsZTMyX2FkZF9jcHUoJmRjaHVuay0+ZHFjX2ZyZWUsIDEpOworCXVubG9ja19idWZmZXIob2QtPmRxX2NodW5rLT5xY19oZWFkZXJiaCk7CisJc3RhdHVzID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIG9kLT5kcV9jaHVuay0+cWNfaGVhZGVyYmgpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJZ290byBvdXQ7CisJfQorCXN0YXR1cyA9IDA7CitvdXQ6CisJLyogQ2xlYXIgdGhlIHJlYWQgYml0IHNvIHRoYXQgbmV4dCB0aW1lIHNvbWVvbmUgdXNlcyB0aGlzCisJICogZHF1b3QgaGUgcmVhZHMgZnJlc2ggaW5mbyBmcm9tIGRpc2sgYW5kIGFsbG9jYXRlcyBsb2NhbAorCSAqIGRxdW90IHN0cnVjdHVyZSAqLworCWNsZWFyX2JpdChEUV9SRUFEX0IsICZkcXVvdC0+ZHFfZmxhZ3MpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcXVvdGFfZm9ybWF0X29wcyBvY2ZzMl9mb3JtYXRfb3BzID0geworCS5jaGVja19xdW90YV9maWxlCT0gb2NmczJfbG9jYWxfY2hlY2tfcXVvdGFfZmlsZSwKKwkucmVhZF9maWxlX2luZm8JCT0gb2NmczJfbG9jYWxfcmVhZF9pbmZvLAorCS53cml0ZV9maWxlX2luZm8JPSBvY2ZzMl9nbG9iYWxfd3JpdGVfaW5mbywKKwkuZnJlZV9maWxlX2luZm8JCT0gb2NmczJfbG9jYWxfZnJlZV9pbmZvLAorCS5yZWFkX2RxYmxrCQk9IG9jZnMyX2xvY2FsX3JlYWRfZHF1b3QsCisJLmNvbW1pdF9kcWJsawkJPSBvY2ZzMl9sb2NhbF93cml0ZV9kcXVvdCwKKwkucmVsZWFzZV9kcWJsawkJPSBvY2ZzMl9sb2NhbF9yZWxlYXNlX2RxdW90LAorfTsKKworc3RydWN0IHF1b3RhX2Zvcm1hdF90eXBlIG9jZnMyX3F1b3RhX2Zvcm1hdCA9IHsKKwkucWZfZm10X2lkID0gUUZNVF9PQ0ZTMiwKKwkucWZfb3BzID0gJm9jZnMyX2Zvcm1hdF9vcHMsCisJLnFmX293bmVyID0gVEhJU19NT0RVTEUKK307CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9yZXNpemUuYyBiL2ZzL29jZnMyL3Jlc2l6ZS5jCmluZGV4IGZmZDQ4ZGIuLjQyNGFkYWEgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL3Jlc2l6ZS5jCisrKyBiL2ZzL29jZnMyL3Jlc2l6ZS5jCkBAIC0xMDYsOCArMTA2LDggQEAKIAltbG9nX2VudHJ5KCIobmV3X2NsdXN0ZXJzPSVkLCBmaXJzdF9uZXdfY2x1c3RlciA9ICV1KVxuIiwKIAkJICAgbmV3X2NsdXN0ZXJzLCBmaXJzdF9uZXdfY2x1c3Rlcik7CiAKLQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGJtX2lub2RlLCBncm91cF9iaCwKLQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZ2QoaGFuZGxlLCBibV9pbm9kZSwgZ3JvdXBfYmgsCisJCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChyZXQgPCAwKSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CkBAIC0xNDEsOCArMTQxLDggQEAKIAl9CiAKIAkvKiB1cGRhdGUgdGhlIGlub2RlIGFjY29yZGluZ2x5LiAqLwotCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgYm1faW5vZGUsIGJtX2JoLAotCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19kaShoYW5kbGUsIGJtX2lub2RlLCBibV9iaCwKKwkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJaWYgKHJldCA8IDApIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dF9yb2xsYmFjazsKQEAgLTMxNCw2ICszMTQsMTAgQEAKIAogCWZlID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKiltYWluX2JtX2JoLT5iX2RhdGE7CiAKKwkvKiBtYWluX2JtX2JoIGlzIHZhbGlkYXRlZCBieSBpbm9kZSByZWFkIGluc2lkZSBvY2ZzMl9pbm9kZV9sb2NrKCksCisJICogc28gYW55IGNvcnJ1cHRpb24gaXMgYSBjb2RlIGJ1Zy4gKi8KKwlCVUdfT04oIU9DRlMyX0lTX1ZBTElEX0RJTk9ERShmZSkpOworCiAJaWYgKGxlMTZfdG9fY3B1KGZlLT5pZDIuaV9jaGFpbi5jbF9jcGcpICE9CiAJCQkJIG9jZnMyX2dyb3VwX2JpdG1hcF9zaXplKG9zYi0+c2IpICogOCkgewogCQltbG9nKE1MX0VSUk9SLCAiVGhlIGRpc2sgaXMgdG9vIG9sZCBhbmQgc21hbGwuICIKQEAgLTMyMiwzMCArMzI2LDE4IEBACiAJCWdvdG8gb3V0X3VubG9jazsKIAl9CiAKLQlpZiAoIU9DRlMyX0lTX1ZBTElEX0RJTk9ERShmZSkpIHsKLQkJT0NGUzJfUk9fT05fSU5WQUxJRF9ESU5PREUobWFpbl9ibV9pbm9kZS0+aV9zYiwgZmUpOwotCQlyZXQgPSAtRUlPOwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfQotCiAJZmlyc3RfbmV3X2NsdXN0ZXIgPSBsZTMyX3RvX2NwdShmZS0+aV9jbHVzdGVycyk7CiAJbGdkX2Jsa25vID0gb2NmczJfd2hpY2hfY2x1c3Rlcl9ncm91cChtYWluX2JtX2lub2RlLAogCQkJCQkgICAgICBmaXJzdF9uZXdfY2x1c3RlciAtIDEpOwogCi0JcmV0ID0gb2NmczJfcmVhZF9ibG9jayhtYWluX2JtX2lub2RlLCBsZ2RfYmxrbm8sICZncm91cF9iaCk7CisJcmV0ID0gb2NmczJfcmVhZF9ncm91cF9kZXNjcmlwdG9yKG1haW5fYm1faW5vZGUsIGZlLCBsZ2RfYmxrbm8sCisJCQkJCSAgJmdyb3VwX2JoKTsKIAlpZiAocmV0IDwgMCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0X3VubG9jazsKIAl9Ci0KIAlncm91cCA9IChzdHJ1Y3Qgb2NmczJfZ3JvdXBfZGVzYyAqKWdyb3VwX2JoLT5iX2RhdGE7CiAKLQlyZXQgPSBvY2ZzMl9jaGVja19ncm91cF9kZXNjcmlwdG9yKGlub2RlLT5pX3NiLCBmZSwgZ3JvdXApOwotCWlmIChyZXQpIHsKLQkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfQotCiAJY2xfYnBjID0gbGUxNl90b19jcHUoZmUtPmlkMi5pX2NoYWluLmNsX2JwYyk7CiAJaWYgKGxlMTZfdG9fY3B1KGdyb3VwLT5iZ19iaXRzKSAvIGNsX2JwYyArIG5ld19jbHVzdGVycyA+CiAJCWxlMTZfdG9fY3B1KGZlLT5pZDIuaV9jaGFpbi5jbF9jcGcpKSB7CkBAIC0zOTgsNDEgKzM5MCwxNiBAQAogCQkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmdyb3VwX2JoKQogewogCWludCByZXQ7Ci0Jc3RydWN0IG9jZnMyX2dyb3VwX2Rlc2MgKmdkOworCXN0cnVjdCBvY2ZzMl9ncm91cF9kZXNjICpnZCA9CisJCShzdHJ1Y3Qgb2NmczJfZ3JvdXBfZGVzYyAqKWdyb3VwX2JoLT5iX2RhdGE7CiAJdTE2IGNsX2JwYyA9IGxlMTZfdG9fY3B1KGRpLT5pZDIuaV9jaGFpbi5jbF9icGMpOwotCXVuc2lnbmVkIGludCBtYXhfYml0cyA9IGxlMTZfdG9fY3B1KGRpLT5pZDIuaV9jaGFpbi5jbF9jcGcpICoKLQkJCQlsZTE2X3RvX2NwdShkaS0+aWQyLmlfY2hhaW4uY2xfYnBjKTsKIAorCXJldCA9IG9jZnMyX2NoZWNrX2dyb3VwX2Rlc2NyaXB0b3IoaW5vZGUtPmlfc2IsIGRpLCBncm91cF9iaCk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CiAKLQlnZCA9IChzdHJ1Y3Qgb2NmczJfZ3JvdXBfZGVzYyAqKWdyb3VwX2JoLT5iX2RhdGE7Ci0KLQlyZXQgPSAtRUlPOwotCWlmICghT0NGUzJfSVNfVkFMSURfR1JPVVBfREVTQyhnZCkpCi0JCW1sb2coTUxfRVJST1IsICJHcm91cCBkZXNjcmlwdG9yICMgJWxsdSBpc24ndCB2YWxpZC5cbiIsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShnZC0+YmdfYmxrbm8pKTsKLQllbHNlIGlmIChkaS0+aV9ibGtubyAhPSBnZC0+YmdfcGFyZW50X2Rpbm9kZSkKLQkJbWxvZyhNTF9FUlJPUiwgIkdyb3VwIGRlc2NyaXB0b3IgIyAlbGx1IGhhcyBiYWQgcGFyZW50ICIKLQkJICAgICAicG9pbnRlciAoJWxsdSwgZXhwZWN0ZWQgJWxsdSlcbiIsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShnZC0+YmdfYmxrbm8pLAotCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoZ2QtPmJnX3BhcmVudF9kaW5vZGUpLAotCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoZGktPmlfYmxrbm8pKTsKLQllbHNlIGlmIChsZTE2X3RvX2NwdShnZC0+YmdfYml0cykgPiBtYXhfYml0cykKLQkJbWxvZyhNTF9FUlJPUiwgIkdyb3VwIGRlc2NyaXB0b3IgIyAlbGx1IGhhcyBiaXQgY291bnQgb2YgJXVcbiIsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShnZC0+YmdfYmxrbm8pLAotCQkgICAgIGxlMTZfdG9fY3B1KGdkLT5iZ19iaXRzKSk7Ci0JZWxzZSBpZiAobGUxNl90b19jcHUoZ2QtPmJnX2ZyZWVfYml0c19jb3VudCkgPiBsZTE2X3RvX2NwdShnZC0+YmdfYml0cykpCi0JCW1sb2coTUxfRVJST1IsICJHcm91cCBkZXNjcmlwdG9yICMgJWxsdSBoYXMgYml0IGNvdW50ICV1IGJ1dCAiCi0JCSAgICAgImNsYWltcyB0aGF0ICV1IGFyZSBmcmVlXG4iLAotCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoZ2QtPmJnX2Jsa25vKSwKLQkJICAgICBsZTE2X3RvX2NwdShnZC0+YmdfYml0cyksCi0JCSAgICAgbGUxNl90b19jcHUoZ2QtPmJnX2ZyZWVfYml0c19jb3VudCkpOwotCWVsc2UgaWYgKGxlMTZfdG9fY3B1KGdkLT5iZ19iaXRzKSA+ICg4ICogbGUxNl90b19jcHUoZ2QtPmJnX3NpemUpKSkKLQkJbWxvZyhNTF9FUlJPUiwgIkdyb3VwIGRlc2NyaXB0b3IgIyAlbGx1IGhhcyBiaXQgY291bnQgJXUgYnV0ICIKLQkJICAgICAibWF4IGJpdG1hcCBiaXRzIG9mICV1XG4iLAotCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoZ2QtPmJnX2Jsa25vKSwKLQkJICAgICBsZTE2X3RvX2NwdShnZC0+YmdfYml0cyksCi0JCSAgICAgOCAqIGxlMTZfdG9fY3B1KGdkLT5iZ19zaXplKSk7Ci0JZWxzZSBpZiAobGUxNl90b19jcHUoZ2QtPmJnX2NoYWluKSAhPSBpbnB1dC0+Y2hhaW4pCisJcmV0ID0gLUVJTlZBTDsKKwlpZiAobGUxNl90b19jcHUoZ2QtPmJnX2NoYWluKSAhPSBpbnB1dC0+Y2hhaW4pCiAJCW1sb2coTUxfRVJST1IsICJHcm91cCBkZXNjcmlwdG9yICMgJWxsdSBoYXMgYmFkIGNoYWluICV1ICIKIAkJICAgICAid2hpbGUgaW5wdXQgaGFzICV1IHNldC5cbiIsCiAJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShnZC0+YmdfYmxrbm8pLApAQCAtNDUxLDYgKzQxOCw3IEBACiAJZWxzZQogCQlyZXQgPSAwOwogCitvdXQ6CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNTY4LDggKzUzNiw4IEBACiAJY2wgPSAmZmUtPmlkMi5pX2NoYWluOwogCWNyID0gJmNsLT5jbF9yZWNzW2lucHV0LT5jaGFpbl07CiAKLQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIG1haW5fYm1faW5vZGUsIGdyb3VwX2JoLAotCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19nZChoYW5kbGUsIG1haW5fYm1faW5vZGUsIGdyb3VwX2JoLAorCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAlpZiAocmV0IDwgMCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0X2NvbW1pdDsKQEAgLTU4NCw4ICs1NTIsOCBAQAogCQlnb3RvIG91dF9jb21taXQ7CiAJfQogCi0JcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBtYWluX2JtX2lub2RlLCBtYWluX2JtX2JoLAotCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19kaShoYW5kbGUsIG1haW5fYm1faW5vZGUsIG1haW5fYm1fYmgsCisJCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChyZXQgPCAwKSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXRfY29tbWl0OwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvc2xvdF9tYXAuYyBiL2ZzL29jZnMyL3Nsb3RfbWFwLmMKaW5kZXggYmRkYTJkOC4uNDA2NjFlNyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc2xvdF9tYXAuYworKysgYi9mcy9vY2ZzMi9zbG90X21hcC5jCkBAIC0xNTEsNyArMTUxLDcgQEAKIAkgKiB0aGlzIGlzIG5vdCB0cnVlLCB0aGUgcmVhZCBvZiAtMSAoVUlOVDY0X01BWCkgd2lsbCBmYWlsLgogCSAqLwogCXJldCA9IG9jZnMyX3JlYWRfYmxvY2tzKHNpLT5zaV9pbm9kZSwgLTEsIHNpLT5zaV9ibG9ja3MsIHNpLT5zaV9iaCwKLQkJCQlPQ0ZTMl9CSF9JR05PUkVfQ0FDSEUpOworCQkJCU9DRlMyX0JIX0lHTk9SRV9DQUNIRSwgTlVMTCk7CiAJaWYgKHJldCA9PSAwKSB7CiAJCXNwaW5fbG9jaygmb3NiLT5vc2JfbG9jayk7CiAJCW9jZnMyX3VwZGF0ZV9zbG90X2luZm8oc2kpOwpAQCAtNDA1LDcgKzQwNSw3IEBACiAKIAkJYmggPSBOVUxMOyAgLyogQWNxdWlyZSBhIGZyZXNoIGJoICovCiAJCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2tzKHNpLT5zaV9pbm9kZSwgYmxrbm8sIDEsICZiaCwKLQkJCQkJICAgT0NGUzJfQkhfSUdOT1JFX0NBQ0hFKTsKKwkJCQkJICAgT0NGUzJfQkhfSUdOT1JFX0NBQ0hFLCBOVUxMKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJCWdvdG8gYmFpbDsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL3N1YmFsbG9jLmMgYi9mcy9vY2ZzMi9zdWJhbGxvYy5jCmluZGV4IGM1ZmYxOGIuLmE2OTYyODYgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL3N1YmFsbG9jLmMKKysrIGIvZnMvb2NmczIvc3ViYWxsb2MuYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgIm9jZnMyLmgiCiAKICNpbmNsdWRlICJhbGxvYy5oIgorI2luY2x1ZGUgImJsb2NrY2hlY2suaCIKICNpbmNsdWRlICJkbG1nbHVlLmgiCiAjaW5jbHVkZSAiaW5vZGUuaCIKICNpbmNsdWRlICJqb3VybmFsLmgiCkBAIC0xNDUsNjQgKzE0NiwxODUgQEAKIAlyZXR1cm4gKHUzMilsZTE2X3RvX2NwdShjbC0+Y2xfY3BnKSAqICh1MzIpbGUxNl90b19jcHUoY2wtPmNsX2JwYyk7CiB9CiAKLS8qIHNvbWV3aGF0IG1vcmUgZXhwZW5zaXZlIHRoYW4gb3VyIG90aGVyIGNoZWNrcywgc28gdXNlIHNwYXJpbmdseS4gKi8KLWludCBvY2ZzMl9jaGVja19ncm91cF9kZXNjcmlwdG9yKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCi0JCQkJIHN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpLAotCQkJCSBzdHJ1Y3Qgb2NmczJfZ3JvdXBfZGVzYyAqZ2QpCisjZGVmaW5lIGRvX2Vycm9yKGZtdCwgLi4uKQkJCQkJCVwKKwlkb3sJCQkJCQkJCVwKKwkJaWYgKGNsZWFuX2Vycm9yKQkJCQkJXAorCQkJbWxvZyhNTF9FUlJPUiwgZm10ICJcbiIsICMjX19WQV9BUkdTX18pOwlcCisJCWVsc2UJCQkJCQkJXAorCQkJb2NmczJfZXJyb3Ioc2IsIGZtdCwgIyNfX1ZBX0FSR1NfXyk7CQlcCisJfSB3aGlsZSAoMCkKKworc3RhdGljIGludCBvY2ZzMl92YWxpZGF0ZV9nZF9zZWxmKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAorCQkJCSAgaW50IGNsZWFuX2Vycm9yKQogewotCXVuc2lnbmVkIGludCBtYXhfYml0czsKKwlzdHJ1Y3Qgb2NmczJfZ3JvdXBfZGVzYyAqZ2QgPSAoc3RydWN0IG9jZnMyX2dyb3VwX2Rlc2MgKiliaC0+Yl9kYXRhOwogCiAJaWYgKCFPQ0ZTMl9JU19WQUxJRF9HUk9VUF9ERVNDKGdkKSkgewotCQlPQ0ZTMl9ST19PTl9JTlZBTElEX0dST1VQX0RFU0Moc2IsIGdkKTsKLQkJcmV0dXJuIC1FSU87CisJCWRvX2Vycm9yKCJHcm91cCBkZXNjcmlwdG9yICMlbGx1IGhhcyBiYWQgc2lnbmF0dXJlICUuKnMiLAorCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tuciwgNywKKwkJCSBnZC0+Ymdfc2lnbmF0dXJlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJaWYgKGxlNjRfdG9fY3B1KGdkLT5iZ19ibGtubykgIT0gYmgtPmJfYmxvY2tucikgeworCQlkb19lcnJvcigiR3JvdXAgZGVzY3JpcHRvciAjJWxsdSBoYXMgYW4gaW52YWxpZCBiZ19ibGtubyAiCisJCQkgIm9mICVsbHUiLAorCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tuciwKKwkJCSAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KGdkLT5iZ19ibGtubykpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobGUzMl90b19jcHUoZ2QtPmJnX2dlbmVyYXRpb24pICE9IE9DRlMyX1NCKHNiKS0+ZnNfZ2VuZXJhdGlvbikgeworCQlkb19lcnJvcigiR3JvdXAgZGVzY3JpcHRvciAjJWxsdSBoYXMgYW4gaW52YWxpZCAiCisJCQkgImZzX2dlbmVyYXRpb24gb2YgIyV1IiwKKwkJCSAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIsCisJCQkgbGUzMl90b19jcHUoZ2QtPmJnX2dlbmVyYXRpb24pKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGxlMTZfdG9fY3B1KGdkLT5iZ19mcmVlX2JpdHNfY291bnQpID4gbGUxNl90b19jcHUoZ2QtPmJnX2JpdHMpKSB7CisJCWRvX2Vycm9yKCJHcm91cCBkZXNjcmlwdG9yICMlbGx1IGhhcyBiaXQgY291bnQgJXUgYnV0ICIKKwkJCSAiY2xhaW1zIHRoYXQgJXUgYXJlIGZyZWUiLAorCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tuciwKKwkJCSBsZTE2X3RvX2NwdShnZC0+YmdfYml0cyksCisJCQkgbGUxNl90b19jcHUoZ2QtPmJnX2ZyZWVfYml0c19jb3VudCkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobGUxNl90b19jcHUoZ2QtPmJnX2JpdHMpID4gKDggKiBsZTE2X3RvX2NwdShnZC0+Ymdfc2l6ZSkpKSB7CisJCWRvX2Vycm9yKCJHcm91cCBkZXNjcmlwdG9yICMlbGx1IGhhcyBiaXQgY291bnQgJXUgYnV0ICIKKwkJCSAibWF4IGJpdG1hcCBiaXRzIG9mICV1IiwKKwkJCSAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIsCisJCQkgbGUxNl90b19jcHUoZ2QtPmJnX2JpdHMpLAorCQkJIDggKiBsZTE2X3RvX2NwdShnZC0+Ymdfc2l6ZSkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvY2ZzMl92YWxpZGF0ZV9nZF9wYXJlbnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkgICAgc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGksCisJCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCisJCQkJICAgIGludCBjbGVhbl9lcnJvcikKK3sKKwl1bnNpZ25lZCBpbnQgbWF4X2JpdHM7CisJc3RydWN0IG9jZnMyX2dyb3VwX2Rlc2MgKmdkID0gKHN0cnVjdCBvY2ZzMl9ncm91cF9kZXNjICopYmgtPmJfZGF0YTsKKwogCWlmIChkaS0+aV9ibGtubyAhPSBnZC0+YmdfcGFyZW50X2Rpbm9kZSkgewotCQlvY2ZzMl9lcnJvcihzYiwgIkdyb3VwIGRlc2NyaXB0b3IgIyAlbGx1IGhhcyBiYWQgcGFyZW50ICIKLQkJCSAgICAicG9pbnRlciAoJWxsdSwgZXhwZWN0ZWQgJWxsdSkiLAotCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoZ2QtPmJnX2Jsa25vKSwKLQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KGdkLT5iZ19wYXJlbnRfZGlub2RlKSwKLQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KGRpLT5pX2Jsa25vKSk7Ci0JCXJldHVybiAtRUlPOworCQlkb19lcnJvcigiR3JvdXAgZGVzY3JpcHRvciAjJWxsdSBoYXMgYmFkIHBhcmVudCAiCisJCQkgInBvaW50ZXIgKCVsbHUsIGV4cGVjdGVkICVsbHUpIiwKKwkJCSAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIsCisJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShnZC0+YmdfcGFyZW50X2Rpbm9kZSksCisJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShkaS0+aV9ibGtubykpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAltYXhfYml0cyA9IGxlMTZfdG9fY3B1KGRpLT5pZDIuaV9jaGFpbi5jbF9jcGcpICogbGUxNl90b19jcHUoZGktPmlkMi5pX2NoYWluLmNsX2JwYyk7CiAJaWYgKGxlMTZfdG9fY3B1KGdkLT5iZ19iaXRzKSA+IG1heF9iaXRzKSB7Ci0JCW9jZnMyX2Vycm9yKHNiLCAiR3JvdXAgZGVzY3JpcHRvciAjICVsbHUgaGFzIGJpdCBjb3VudCBvZiAldSIsCi0JCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShnZC0+YmdfYmxrbm8pLAotCQkJICAgIGxlMTZfdG9fY3B1KGdkLT5iZ19iaXRzKSk7Ci0JCXJldHVybiAtRUlPOworCQlkb19lcnJvcigiR3JvdXAgZGVzY3JpcHRvciAjJWxsdSBoYXMgYml0IGNvdW50IG9mICV1IiwKKwkJCSAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIsCisJCQkgbGUxNl90b19jcHUoZ2QtPmJnX2JpdHMpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKGxlMTZfdG9fY3B1KGdkLT5iZ19jaGFpbikgPj0KIAkgICAgbGUxNl90b19jcHUoZGktPmlkMi5pX2NoYWluLmNsX25leHRfZnJlZV9yZWMpKSB7Ci0JCW9jZnMyX2Vycm9yKHNiLCAiR3JvdXAgZGVzY3JpcHRvciAjICVsbHUgaGFzIGJhZCBjaGFpbiAldSIsCi0JCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShnZC0+YmdfYmxrbm8pLAotCQkJICAgIGxlMTZfdG9fY3B1KGdkLT5iZ19jaGFpbikpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlpZiAobGUxNl90b19jcHUoZ2QtPmJnX2ZyZWVfYml0c19jb3VudCkgPiBsZTE2X3RvX2NwdShnZC0+YmdfYml0cykpIHsKLQkJb2NmczJfZXJyb3Ioc2IsICJHcm91cCBkZXNjcmlwdG9yICMgJWxsdSBoYXMgYml0IGNvdW50ICV1IGJ1dCAiCi0JCQkgICAgImNsYWltcyB0aGF0ICV1IGFyZSBmcmVlIiwKLQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KGdkLT5iZ19ibGtubyksCi0JCQkgICAgbGUxNl90b19jcHUoZ2QtPmJnX2JpdHMpLAotCQkJICAgIGxlMTZfdG9fY3B1KGdkLT5iZ19mcmVlX2JpdHNfY291bnQpKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JaWYgKGxlMTZfdG9fY3B1KGdkLT5iZ19iaXRzKSA+ICg4ICogbGUxNl90b19jcHUoZ2QtPmJnX3NpemUpKSkgewotCQlvY2ZzMl9lcnJvcihzYiwgIkdyb3VwIGRlc2NyaXB0b3IgIyAlbGx1IGhhcyBiaXQgY291bnQgJXUgYnV0ICIKLQkJCSAgICAibWF4IGJpdG1hcCBiaXRzIG9mICV1IiwKLQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KGdkLT5iZ19ibGtubyksCi0JCQkgICAgbGUxNl90b19jcHUoZ2QtPmJnX2JpdHMpLAotCQkJICAgIDggKiBsZTE2X3RvX2NwdShnZC0+Ymdfc2l6ZSkpOwotCQlyZXR1cm4gLUVJTzsKKwkJZG9fZXJyb3IoIkdyb3VwIGRlc2NyaXB0b3IgIyVsbHUgaGFzIGJhZCBjaGFpbiAldSIsCisJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yLAorCQkJIGxlMTZfdG9fY3B1KGdkLT5iZ19jaGFpbikpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAorI3VuZGVmIGRvX2Vycm9yCisKKy8qCisgKiBUaGlzIHZlcnNpb24gb25seSBwcmludHMgZXJyb3JzLiAgSXQgZG9lcyBub3QgZmFpbCB0aGUgZmlsZXN5c3RlbSwgYW5kCisgKiBleGlzdHMgb25seSBmb3IgcmVzaXplLgorICovCitpbnQgb2NmczJfY2hlY2tfZ3JvdXBfZGVzY3JpcHRvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSBzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSwKKwkJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlpbnQgcmM7CisJc3RydWN0IG9jZnMyX2dyb3VwX2Rlc2MgKmdkID0gKHN0cnVjdCBvY2ZzMl9ncm91cF9kZXNjICopYmgtPmJfZGF0YTsKKworCUJVR19PTighYnVmZmVyX3VwdG9kYXRlKGJoKSk7CisKKwkvKgorCSAqIElmIHRoZSBlY2MgZmFpbHMsIHdlIHJldHVybiB0aGUgZXJyb3IgYnV0IG90aGVyd2lzZQorCSAqIGxlYXZlIHRoZSBmaWxlc3lzdGVtIHJ1bm5pbmcuICBXZSBrbm93IGFueSBlcnJvciBpcworCSAqIGxvY2FsIHRvIHRoaXMgYmxvY2suCisJICovCisJcmMgPSBvY2ZzMl92YWxpZGF0ZV9tZXRhX2VjYyhzYiwgYmgtPmJfZGF0YSwgJmdkLT5iZ19jaGVjayk7CisJaWYgKHJjKSB7CisJCW1sb2coTUxfRVJST1IsCisJCSAgICAgIkNoZWNrc3VtIGZhaWxlZCBmb3IgZ3JvdXAgZGVzY3JpcHRvciAlbGx1XG4iLAorCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tucik7CisJfSBlbHNlCisJCXJjID0gb2NmczJfdmFsaWRhdGVfZ2Rfc2VsZihzYiwgYmgsIDEpOworCWlmICghcmMpCisJCXJjID0gb2NmczJfdmFsaWRhdGVfZ2RfcGFyZW50KHNiLCBkaSwgYmgsIDEpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG9jZnMyX3ZhbGlkYXRlX2dyb3VwX2Rlc2NyaXB0b3Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlpbnQgcmM7CisJc3RydWN0IG9jZnMyX2dyb3VwX2Rlc2MgKmdkID0gKHN0cnVjdCBvY2ZzMl9ncm91cF9kZXNjICopYmgtPmJfZGF0YTsKKworCW1sb2coMCwgIlZhbGlkYXRpbmcgZ3JvdXAgZGVzY3JpcHRvciAlbGx1XG4iLAorCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yKTsKKworCUJVR19PTighYnVmZmVyX3VwdG9kYXRlKGJoKSk7CisKKwkvKgorCSAqIElmIHRoZSBlY2MgZmFpbHMsIHdlIHJldHVybiB0aGUgZXJyb3IgYnV0IG90aGVyd2lzZQorCSAqIGxlYXZlIHRoZSBmaWxlc3lzdGVtIHJ1bm5pbmcuICBXZSBrbm93IGFueSBlcnJvciBpcworCSAqIGxvY2FsIHRvIHRoaXMgYmxvY2suCisJICovCisJcmMgPSBvY2ZzMl92YWxpZGF0ZV9tZXRhX2VjYyhzYiwgYmgtPmJfZGF0YSwgJmdkLT5iZ19jaGVjayk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwkvKgorCSAqIEVycm9ycyBhZnRlciBoZXJlIGFyZSBmYXRhbC4KKwkgKi8KKworCXJldHVybiBvY2ZzMl92YWxpZGF0ZV9nZF9zZWxmKHNiLCBiaCwgMCk7Cit9CisKK2ludCBvY2ZzMl9yZWFkX2dyb3VwX2Rlc2NyaXB0b3Ioc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGksCisJCQkJdTY0IGdkX2Jsa25vLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaCkKK3sKKwlpbnQgcmM7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICp0bXAgPSAqYmg7CisKKwlyYyA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIGdkX2Jsa25vLCAmdG1wLAorCQkJICAgICAgb2NmczJfdmFsaWRhdGVfZ3JvdXBfZGVzY3JpcHRvcik7CisJaWYgKHJjKQorCQlnb3RvIG91dDsKKworCXJjID0gb2NmczJfdmFsaWRhdGVfZ2RfcGFyZW50KGlub2RlLT5pX3NiLCBkaSwgdG1wLCAwKTsKKwlpZiAocmMpIHsKKwkJYnJlbHNlKHRtcCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIElmIG9jZnMyX3JlYWRfYmxvY2soKSBnb3QgdXMgYSBuZXcgYmgsIHBhc3MgaXQgdXAuICovCisJaWYgKCEqYmgpCisJCSpiaCA9IHRtcDsKKworb3V0OgorCXJldHVybiByYzsKK30KKwogc3RhdGljIGludCBvY2ZzMl9ibG9ja19ncm91cF9maWxsKGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJICBzdHJ1Y3QgaW5vZGUgKmFsbG9jX2lub2RlLAogCQkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiZ19iaCwKQEAgLTIyNSwxMCArMzQ3LDEwIEBACiAJCWdvdG8gYmFpbDsKIAl9CiAKLQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsCi0JCQkJICAgICAgYWxsb2NfaW5vZGUsCi0JCQkJICAgICAgYmdfYmgsCi0JCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfQ1JFQVRFKTsKKwlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19nZChoYW5kbGUsCisJCQkJCSBhbGxvY19pbm9kZSwKKwkJCQkJIGJnX2JoLAorCQkJCQkgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfQ1JFQVRFKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKQEAgLTM1OCw4ICs0ODAsOCBAQAogCiAJYmcgPSAoc3RydWN0IG9jZnMyX2dyb3VwX2Rlc2MgKikgYmdfYmgtPmJfZGF0YTsKIAotCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgYWxsb2NfaW5vZGUsCi0JCQkJICAgICAgYmgsIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19kaShoYW5kbGUsIGFsbG9jX2lub2RlLAorCQkJCQkgYmgsIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKQEAgLTQ0MSwxMSArNTYzLDExIEBACiAJYWMtPmFjX2FsbG9jX3Nsb3QgPSBzbG90OwogCiAJZmUgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKSBiaC0+Yl9kYXRhOwotCWlmICghT0NGUzJfSVNfVkFMSURfRElOT0RFKGZlKSkgewotCQlPQ0ZTMl9ST19PTl9JTlZBTElEX0RJTk9ERShhbGxvY19pbm9kZS0+aV9zYiwgZmUpOwotCQlzdGF0dXMgPSAtRUlPOwotCQlnb3RvIGJhaWw7Ci0JfQorCisJLyogVGhlIGJoIHdhcyB2YWxpZGF0ZWQgYnkgdGhlIGlub2RlIHJlYWQgaW5zaWRlCisJICogb2NmczJfaW5vZGVfbG9jaygpLiAgQW55IGNvcnJ1cHRpb24gaXMgYSBjb2RlIGJ1Zy4gKi8KKwlCVUdfT04oIU9DRlMyX0lTX1ZBTElEX0RJTk9ERShmZSkpOworCiAJaWYgKCEoZmUtPmlfZmxhZ3MgJiBjcHVfdG9fbGUzMihPQ0ZTMl9DSEFJTl9GTCkpKSB7CiAJCW9jZnMyX2Vycm9yKGFsbG9jX2lub2RlLT5pX3NiLCAiSW52YWxpZCBjaGFpbiBhbGxvY2F0b3IgJWxsdSIsCiAJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShmZS0+aV9ibGtubykpOwpAQCAtNzkwLDEwICs5MTIsOSBAQAogCWludCBvZmZzZXQsIHN0YXJ0LCBmb3VuZCwgc3RhdHVzID0gMDsKIAlzdHJ1Y3Qgb2NmczJfZ3JvdXBfZGVzYyAqYmcgPSAoc3RydWN0IG9jZnMyX2dyb3VwX2Rlc2MgKikgYmdfYmgtPmJfZGF0YTsKIAotCWlmICghT0NGUzJfSVNfVkFMSURfR1JPVVBfREVTQyhiZykpIHsKLQkJT0NGUzJfUk9fT05fSU5WQUxJRF9HUk9VUF9ERVNDKG9zYi0+c2IsIGJnKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQorCS8qIENhbGxlcnMgZ290IHRoaXMgZGVzY3JpcHRvciBmcm9tCisJICogb2NmczJfcmVhZF9ncm91cF9kZXNjcmlwdG9yKCkuICBBbnkgY29ycnVwdGlvbiBpcyBhIGNvZGUgYnVnLiAqLworCUJVR19PTighT0NGUzJfSVNfVkFMSURfR1JPVVBfREVTQyhiZykpOwogCiAJZm91bmQgPSBzdGFydCA9IGJlc3Rfb2Zmc2V0ID0gYmVzdF9zaXplID0gMDsKIAliaXRtYXAgPSBiZy0+YmdfYml0bWFwOwpAQCAtODU4LDExICs5NzksOSBAQAogCiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKLQlpZiAoIU9DRlMyX0lTX1ZBTElEX0dST1VQX0RFU0MoYmcpKSB7Ci0JCU9DRlMyX1JPX09OX0lOVkFMSURfR1JPVVBfREVTQyhhbGxvY19pbm9kZS0+aV9zYiwgYmcpOwotCQlzdGF0dXMgPSAtRUlPOwotCQlnb3RvIGJhaWw7Ci0JfQorCS8qIEFsbCBjYWxsZXJzIGdldCB0aGUgZGVzY3JpcHRvciB2aWEKKwkgKiBvY2ZzMl9yZWFkX2dyb3VwX2Rlc2NyaXB0b3IoKS4gIEFueSBjb3JydXB0aW9uIGlzIGEgY29kZSBidWcuICovCisJQlVHX09OKCFPQ0ZTMl9JU19WQUxJRF9HUk9VUF9ERVNDKGJnKSk7CiAJQlVHX09OKGxlMTZfdG9fY3B1KGJnLT5iZ19mcmVlX2JpdHNfY291bnQpIDwgbnVtX2JpdHMpOwogCiAJbWxvZygwLCAiYmxvY2tfZ3JvdXBfc2V0X2JpdHM6IG9mZiA9ICV1LCBudW0gPSAldVxuIiwgYml0X29mZiwKQEAgLTg3MSwxMCArOTkwLDEwIEBACiAJaWYgKG9jZnMyX2lzX2NsdXN0ZXJfYml0bWFwKGFsbG9jX2lub2RlKSkKIAkJam91cm5hbF90eXBlID0gT0NGUzJfSk9VUk5BTF9BQ0NFU1NfVU5ETzsKIAotCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwKLQkJCQkgICAgICBhbGxvY19pbm9kZSwKLQkJCQkgICAgICBncm91cF9iaCwKLQkJCQkgICAgICBqb3VybmFsX3R5cGUpOworCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2dkKGhhbmRsZSwKKwkJCQkJIGFsbG9jX2lub2RlLAorCQkJCQkgZ3JvdXBfYmgsCisJCQkJCSBqb3VybmFsX3R5cGUpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBiYWlsOwpAQCAtOTMxLDIxICsxMDUwLDEwIEBACiAJc3RydWN0IG9jZnMyX2dyb3VwX2Rlc2MgKmJnID0gKHN0cnVjdCBvY2ZzMl9ncm91cF9kZXNjICopIGJnX2JoLT5iX2RhdGE7CiAJc3RydWN0IG9jZnMyX2dyb3VwX2Rlc2MgKnByZXZfYmcgPSAoc3RydWN0IG9jZnMyX2dyb3VwX2Rlc2MgKikgcHJldl9iZ19iaC0+Yl9kYXRhOwogCi0JaWYgKCFPQ0ZTMl9JU19WQUxJRF9ESU5PREUoZmUpKSB7Ci0JCU9DRlMyX1JPX09OX0lOVkFMSURfRElOT0RFKGFsbG9jX2lub2RlLT5pX3NiLCBmZSk7Ci0JCXN0YXR1cyA9IC1FSU87Ci0JCWdvdG8gb3V0OwotCX0KLQlpZiAoIU9DRlMyX0lTX1ZBTElEX0dST1VQX0RFU0MoYmcpKSB7Ci0JCU9DRlMyX1JPX09OX0lOVkFMSURfR1JPVVBfREVTQyhhbGxvY19pbm9kZS0+aV9zYiwgYmcpOwotCQlzdGF0dXMgPSAtRUlPOwotCQlnb3RvIG91dDsKLQl9Ci0JaWYgKCFPQ0ZTMl9JU19WQUxJRF9HUk9VUF9ERVNDKHByZXZfYmcpKSB7Ci0JCU9DRlMyX1JPX09OX0lOVkFMSURfR1JPVVBfREVTQyhhbGxvY19pbm9kZS0+aV9zYiwgcHJldl9iZyk7Ci0JCXN0YXR1cyA9IC1FSU87Ci0JCWdvdG8gb3V0OwotCX0KKwkvKiBUaGUgY2FsbGVyIGdvdCB0aGVzZSBkZXNjcmlwdG9ycyBmcm9tCisJICogb2NmczJfcmVhZF9ncm91cF9kZXNjcmlwdG9yKCkuICBBbnkgY29ycnVwdGlvbiBpcyBhIGNvZGUgYnVnLiAqLworCUJVR19PTighT0NGUzJfSVNfVkFMSURfR1JPVVBfREVTQyhiZykpOworCUJVR19PTighT0NGUzJfSVNfVkFMSURfR1JPVVBfREVTQyhwcmV2X2JnKSk7CiAKIAltbG9nKDAsICJTdWJhbGxvYyAlbGx1LCBjaGFpbiAldSwgbW92ZSBncm91cCAlbGx1IHRvIHRvcCwgcHJldiA9ICVsbHVcbiIsCiAJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KGZlLT5pX2Jsa25vKSwgY2hhaW4sCkBAIC05NTYsOCArMTA2NCw4IEBACiAJYmdfcHRyID0gbGU2NF90b19jcHUoYmctPmJnX25leHRfZ3JvdXApOwogCXByZXZfYmdfcHRyID0gbGU2NF90b19jcHUocHJldl9iZy0+YmdfbmV4dF9ncm91cCk7CiAKLQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGFsbG9jX2lub2RlLCBwcmV2X2JnX2JoLAotCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19nZChoYW5kbGUsIGFsbG9jX2lub2RlLCBwcmV2X2JnX2JoLAorCQkJCQkgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBvdXRfcm9sbGJhY2s7CkBAIC05NzEsOCArMTA3OSw4IEBACiAJCWdvdG8gb3V0X3JvbGxiYWNrOwogCX0KIAotCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgYWxsb2NfaW5vZGUsIGJnX2JoLAotCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19nZChoYW5kbGUsIGFsbG9jX2lub2RlLCBiZ19iaCwKKwkJCQkJIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gb3V0X3JvbGxiYWNrOwpAQCAtOTg2LDggKzEwOTQsOCBAQAogCQlnb3RvIG91dF9yb2xsYmFjazsKIAl9CiAKLQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGFsbG9jX2lub2RlLCBmZV9iaCwKLQkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZGkoaGFuZGxlLCBhbGxvY19pbm9kZSwgZmVfYmgsCisJCQkJCSBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIG91dF9yb2xsYmFjazsKQEAgLTEwMDgsNyArMTExNiw3IEBACiAJCWJnLT5iZ19uZXh0X2dyb3VwID0gY3B1X3RvX2xlNjQoYmdfcHRyKTsKIAkJcHJldl9iZy0+YmdfbmV4dF9ncm91cCA9IGNwdV90b19sZTY0KHByZXZfYmdfcHRyKTsKIAl9Ci1vdXQ6CisKIAltbG9nX2V4aXQoc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMTEzOCw4ICsxMjQ2LDggQEAKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopIGRpX2JoLT5iX2RhdGE7CiAJc3RydWN0IG9jZnMyX2NoYWluX2xpc3QgKmNsID0gKHN0cnVjdCBvY2ZzMl9jaGFpbl9saXN0ICopICZkaS0+aWQyLmlfY2hhaW47CiAKLQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBkaV9iaCwKLQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZGkoaGFuZGxlLCBpbm9kZSwgZGlfYmgsCisJCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChyZXQgPCAwKSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CkBAIC0xMTcwLDIxICsxMjc4LDE3IEBACiAJdTE2IGZvdW5kOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqZ3JvdXBfYmggPSBOVUxMOwogCXN0cnVjdCBvY2ZzMl9ncm91cF9kZXNjICpnZDsKKwlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopYWMtPmFjX2JoLT5iX2RhdGE7CiAJc3RydWN0IGlub2RlICphbGxvY19pbm9kZSA9IGFjLT5hY19pbm9kZTsKIAotCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soYWxsb2NfaW5vZGUsIGdkX2Jsa25vLCAmZ3JvdXBfYmgpOworCXJldCA9IG9jZnMyX3JlYWRfZ3JvdXBfZGVzY3JpcHRvcihhbGxvY19pbm9kZSwgZGksIGdkX2Jsa25vLAorCQkJCQkgICZncm91cF9iaCk7CiAJaWYgKHJldCA8IDApIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIAogCWdkID0gKHN0cnVjdCBvY2ZzMl9ncm91cF9kZXNjICopIGdyb3VwX2JoLT5iX2RhdGE7Ci0JaWYgKCFPQ0ZTMl9JU19WQUxJRF9HUk9VUF9ERVNDKGdkKSkgewotCQlPQ0ZTMl9ST19PTl9JTlZBTElEX0dST1VQX0RFU0MoYWxsb2NfaW5vZGUtPmlfc2IsIGdkKTsKLQkJcmV0ID0gLUVJTzsKLQkJZ290byBvdXQ7Ci0JfQotCiAJcmV0ID0gYWMtPmFjX2dyb3VwX3NlYXJjaChhbGxvY19pbm9kZSwgZ3JvdXBfYmgsIGJpdHNfd2FudGVkLCBtaW5fYml0cywKIAkJCQkgIGFjLT5hY19tYXhfYmxvY2ssIGJpdF9vZmYsICZmb3VuZCk7CiAJaWYgKHJldCA8IDApIHsKQEAgLTEyNDEsMTkgKzEzNDUsMTQgQEAKIAkgICAgIGJpdHNfd2FudGVkLCBjaGFpbiwKIAkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShhbGxvY19pbm9kZSktPmlwX2Jsa25vKTsKIAotCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2soYWxsb2NfaW5vZGUsCi0JCQkJICBsZTY0X3RvX2NwdShjbC0+Y2xfcmVjc1tjaGFpbl0uY19ibGtubyksCi0JCQkJICAmZ3JvdXBfYmgpOworCXN0YXR1cyA9IG9jZnMyX3JlYWRfZ3JvdXBfZGVzY3JpcHRvcihhbGxvY19pbm9kZSwgZmUsCisJCQkJCSAgICAgbGU2NF90b19jcHUoY2wtPmNsX3JlY3NbY2hhaW5dLmNfYmxrbm8pLAorCQkJCQkgICAgICZncm91cF9iaCk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGJhaWw7CiAJfQogCWJnID0gKHN0cnVjdCBvY2ZzMl9ncm91cF9kZXNjICopIGdyb3VwX2JoLT5iX2RhdGE7Ci0Jc3RhdHVzID0gb2NmczJfY2hlY2tfZ3JvdXBfZGVzY3JpcHRvcihhbGxvY19pbm9kZS0+aV9zYiwgZmUsIGJnKTsKLQlpZiAoc3RhdHVzKSB7Ci0JCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBiYWlsOwotCX0KIAogCXN0YXR1cyA9IC1FTk9TUEM7CiAJLyogZm9yIG5vdywgdGhlIGNoYWluIHNlYXJjaCBpcyBhIGJpdCBzaW1wbGlzdGljLiBXZSBqdXN0IHVzZQpAQCAtMTI3MSwxOCArMTM3MCwxMyBAQAogCQluZXh0X2dyb3VwID0gbGU2NF90b19jcHUoYmctPmJnX25leHRfZ3JvdXApOwogCQlwcmV2X2dyb3VwX2JoID0gZ3JvdXBfYmg7CiAJCWdyb3VwX2JoID0gTlVMTDsKLQkJc3RhdHVzID0gb2NmczJfcmVhZF9ibG9jayhhbGxvY19pbm9kZSwKLQkJCQkJICBuZXh0X2dyb3VwLCAmZ3JvdXBfYmgpOworCQlzdGF0dXMgPSBvY2ZzMl9yZWFkX2dyb3VwX2Rlc2NyaXB0b3IoYWxsb2NfaW5vZGUsIGZlLAorCQkJCQkJICAgICBuZXh0X2dyb3VwLCAmZ3JvdXBfYmgpOwogCQlpZiAoc3RhdHVzIDwgMCkgewogCQkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQkJZ290byBiYWlsOwogCQl9CiAJCWJnID0gKHN0cnVjdCBvY2ZzMl9ncm91cF9kZXNjICopIGdyb3VwX2JoLT5iX2RhdGE7Ci0JCXN0YXR1cyA9IG9jZnMyX2NoZWNrX2dyb3VwX2Rlc2NyaXB0b3IoYWxsb2NfaW5vZGUtPmlfc2IsIGZlLCBiZyk7Ci0JCWlmIChzdGF0dXMpIHsKLQkJCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJCWdvdG8gYmFpbDsKLQkJfQogCX0KIAlpZiAoc3RhdHVzIDwgMCkgewogCQlpZiAoc3RhdHVzICE9IC1FTk9TUEMpCkBAIC0xMzI0LDEwICsxNDE4LDEwIEBACiAKIAkvKiBPaywgY2xhaW0gb3VyIGJpdHMgbm93OiBzZXQgdGhlIGluZm8gb24gZGlub2RlLCBjaGFpbmxpc3QKIAkgKiBhbmQgdGhlbiB0aGUgZ3JvdXAgKi8KLQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsCi0JCQkJICAgICAgYWxsb2NfaW5vZGUsCi0JCQkJICAgICAgYWMtPmFjX2JoLAotCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19kaShoYW5kbGUsCisJCQkJCSBhbGxvY19pbm9kZSwKKwkJCQkJIGFjLT5hY19iaCwKKwkJCQkJIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKQEAgLTEzOTIsMTEgKzE0ODYsMTEgQEAKIAlCVUdfT04oIWFjLT5hY19iaCk7CiAKIAlmZSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopIGFjLT5hY19iaC0+Yl9kYXRhOwotCWlmICghT0NGUzJfSVNfVkFMSURfRElOT0RFKGZlKSkgewotCQlPQ0ZTMl9ST19PTl9JTlZBTElEX0RJTk9ERShvc2ItPnNiLCBmZSk7Ci0JCXN0YXR1cyA9IC1FSU87Ci0JCWdvdG8gYmFpbDsKLQl9CisKKwkvKiBUaGUgYmggd2FzIHZhbGlkYXRlZCBieSB0aGUgaW5vZGUgcmVhZCBkdXJpbmcKKwkgKiBvY2ZzMl9yZXNlcnZlX3N1YmFsbG9jX2JpdHMoKS4gIEFueSBjb3JydXB0aW9uIGlzIGEgY29kZSBidWcuICovCisJQlVHX09OKCFPQ0ZTMl9JU19WQUxJRF9ESU5PREUoZmUpKTsKKwogCWlmIChsZTMyX3RvX2NwdShmZS0+aWQxLmJpdG1hcDEuaV91c2VkKSA+PQogCSAgICBsZTMyX3RvX2NwdShmZS0+aWQxLmJpdG1hcDEuaV90b3RhbCkpIHsKIAkJb2NmczJfZXJyb3Iob3NiLT5zYiwgIkNoYWluIGFsbG9jYXRvciBkaW5vZGUgJWxsdSBoYXMgJXUgdXNlZCAiCkBAIC0xNzI1LDE5ICsxODE5LDE3IEBACiAKIAltbG9nX2VudHJ5X3ZvaWQoKTsKIAotCWlmICghT0NGUzJfSVNfVkFMSURfR1JPVVBfREVTQyhiZykpIHsKLQkJT0NGUzJfUk9fT05fSU5WQUxJRF9HUk9VUF9ERVNDKGFsbG9jX2lub2RlLT5pX3NiLCBiZyk7Ci0JCXN0YXR1cyA9IC1FSU87Ci0JCWdvdG8gYmFpbDsKLQl9CisJLyogVGhlIGNhbGxlciBnb3QgdGhpcyBkZXNjcmlwdG9yIGZyb20KKwkgKiBvY2ZzMl9yZWFkX2dyb3VwX2Rlc2NyaXB0b3IoKS4gIEFueSBjb3JydXB0aW9uIGlzIGEgY29kZSBidWcuICovCisJQlVHX09OKCFPQ0ZTMl9JU19WQUxJRF9HUk9VUF9ERVNDKGJnKSk7CiAKIAltbG9nKDAsICJvZmYgPSAldSwgbnVtID0gJXVcbiIsIGJpdF9vZmYsIG51bV9iaXRzKTsKIAogCWlmIChvY2ZzMl9pc19jbHVzdGVyX2JpdG1hcChhbGxvY19pbm9kZSkpCiAJCWpvdXJuYWxfdHlwZSA9IE9DRlMyX0pPVVJOQUxfQUNDRVNTX1VORE87CiAKLQlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGFsbG9jX2lub2RlLCBncm91cF9iaCwKLQkJCQkgICAgICBqb3VybmFsX3R5cGUpOworCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2dkKGhhbmRsZSwgYWxsb2NfaW5vZGUsIGdyb3VwX2JoLAorCQkJCQkgam91cm5hbF90eXBlKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKQEAgLTE3ODIsMjkgKzE4NzQsMjYgQEAKIAogCW1sb2dfZW50cnlfdm9pZCgpOwogCi0JaWYgKCFPQ0ZTMl9JU19WQUxJRF9ESU5PREUoZmUpKSB7Ci0JCU9DRlMyX1JPX09OX0lOVkFMSURfRElOT0RFKGFsbG9jX2lub2RlLT5pX3NiLCBmZSk7Ci0JCXN0YXR1cyA9IC1FSU87Ci0JCWdvdG8gYmFpbDsKLQl9CisJLyogVGhlIGFsbG9jX2JoIGNvbWVzIGZyb20gb2NmczJfZnJlZV9kaW5vZGUoKSBvcgorCSAqIG9jZnMyX2ZyZWVfY2x1c3RlcnMoKS4gIFRoZSBjYWxsZXJzIGhhdmUgYWxsIGxvY2tlZCB0aGUKKwkgKiBhbGxvY2F0b3IgYW5kIGdvdHRlbiBhbGxvY19iaCBmcm9tIHRoZSBsb2NrIGNhbGwuICBUaGlzCisJICogdmFsaWRhdGVzIHRoZSBkaW5vZGUgYnVmZmVyLiAgQW55IGNvcnJ1cHRpb24gdGhhdCBoYXMgaGFwcGVuZGVkCisJICogaXMgYSBjb2RlIGJ1Zy4gKi8KKwlCVUdfT04oIU9DRlMyX0lTX1ZBTElEX0RJTk9ERShmZSkpOwogCUJVR19PTigoY291bnQgKyBzdGFydF9iaXQpID4gb2NmczJfYml0c19wZXJfZ3JvdXAoY2wpKTsKIAogCW1sb2coMCwgIiVsbHU6IGZyZWVpbmcgJXUgYml0cyBmcm9tIGdyb3VwICVsbHUsIHN0YXJ0aW5nIGF0ICV1XG4iLAogCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGFsbG9jX2lub2RlKS0+aXBfYmxrbm8sIGNvdW50LAogCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliZ19ibGtubywgc3RhcnRfYml0KTsKIAotCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2soYWxsb2NfaW5vZGUsIGJnX2Jsa25vLCAmZ3JvdXBfYmgpOworCXN0YXR1cyA9IG9jZnMyX3JlYWRfZ3JvdXBfZGVzY3JpcHRvcihhbGxvY19pbm9kZSwgZmUsIGJnX2Jsa25vLAorCQkJCQkgICAgICZncm91cF9iaCk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGJhaWw7CiAJfQotCiAJZ3JvdXAgPSAoc3RydWN0IG9jZnMyX2dyb3VwX2Rlc2MgKikgZ3JvdXBfYmgtPmJfZGF0YTsKLQlzdGF0dXMgPSBvY2ZzMl9jaGVja19ncm91cF9kZXNjcmlwdG9yKGFsbG9jX2lub2RlLT5pX3NiLCBmZSwgZ3JvdXApOwotCWlmIChzdGF0dXMpIHsKLQkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQlnb3RvIGJhaWw7Ci0JfQorCiAJQlVHX09OKChjb3VudCArIHN0YXJ0X2JpdCkgPiBsZTE2X3RvX2NwdShncm91cC0+YmdfYml0cykpOwogCiAJc3RhdHVzID0gb2NmczJfYmxvY2tfZ3JvdXBfY2xlYXJfYml0cyhoYW5kbGUsIGFsbG9jX2lub2RlLApAQCAtMTgxNSw4ICsxOTA0LDggQEAKIAkJZ290byBiYWlsOwogCX0KIAotCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgYWxsb2NfaW5vZGUsIGFsbG9jX2JoLAotCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19kaShoYW5kbGUsIGFsbG9jX2lub2RlLCBhbGxvY19iaCwKKwkJCQkJIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL3N1YmFsbG9jLmggYi9mcy9vY2ZzMi9zdWJhbGxvYy5oCmluZGV4IDRkZjE1OWQuLmUzYzEzYzcgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL3N1YmFsbG9jLmgKKysrIGIvZnMvb2NmczIvc3ViYWxsb2MuaApAQCAtMTY0LDEwICsxNjQsMjQgQEAKICAqIGFuZCByZXR1cm4gdGhhdCBibG9jayBvZmZzZXQuICovCiB1NjQgb2NmczJfd2hpY2hfY2x1c3Rlcl9ncm91cChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1MzIgY2x1c3Rlcik7CiAKLS8qIHNvbWV3aGF0IG1vcmUgZXhwZW5zaXZlIHRoYW4gb3VyIG90aGVyIGNoZWNrcywgc28gdXNlIHNwYXJpbmdseS4gKi8KKy8qCisgKiBCeSBkZWZhdWx0LCBvY2ZzMl9yZWFkX2dyb3VwX2Rlc2NyaXB0b3IoKSBjYWxscyBvY2ZzMl9lcnJvcigpIHdoZW4gaXQKKyAqIGZpbmRzIGEgcHJvYmxlbS4gIEEgY2FsbGVyIHRoYXQgd2FudHMgdG8gY2hlY2sgYSBncm91cCBkZXNjcmlwdG9yCisgKiB3aXRob3V0IGdvaW5nIHJlYWRvbmx5IHNob3VsZCByZWFkIHRoZSBibG9jayB3aXRoIG9jZnMyX3JlYWRfYmxvY2tbc10oKQorICogYW5kIHRoZW4gY2hlY2tpbmcgaXQgd2l0aCB0aGlzIGZ1bmN0aW9uLiAgVGhpcyBpcyBvbmx5IHJlc2l6ZSwgcmVhbGx5LgorICogRXZlcnlvbmUgZWxzZSBzaG91bGQgYmUgdXNpbmcgb2NmczJfcmVhZF9ncm91cF9kZXNjcmlwdG9yKCkuCisgKi8KIGludCBvY2ZzMl9jaGVja19ncm91cF9kZXNjcmlwdG9yKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQkJIHN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpLAotCQkJCSBzdHJ1Y3Qgb2NmczJfZ3JvdXBfZGVzYyAqZ2QpOworCQkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKKy8qCisgKiBSZWFkIGEgZ3JvdXAgZGVzY3JpcHRvciBibG9jayBpbnRvICpiaC4gIElmICpiaCBpcyBOVUxMLCBhIGJoIHdpbGwgYmUKKyAqIGFsbG9jYXRlZC4gIFRoaXMgaXMgYSBjYWNoZWQgcmVhZC4gIFRoZSBkZXNjcmlwdG9yIHdpbGwgYmUgdmFsaWRhdGVkIHdpdGgKKyAqIG9jZnMyX3ZhbGlkYXRlX2dyb3VwX2Rlc2NyaXB0b3IoKS4KKyAqLworaW50IG9jZnMyX3JlYWRfZ3JvdXBfZGVzY3JpcHRvcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSwKKwkJCQl1NjQgZ2RfYmxrbm8sIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJoKTsKKwogaW50IG9jZnMyX2xvY2tfYWxsb2NhdG9ycyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgKmV0LAogCQkJICB1MzIgY2x1c3RlcnNfdG9fYWRkLCB1MzIgZXh0ZW50c190b19zcGxpdCwKIAkJCSAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKipkYXRhX2FjLApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvc3VwZXIuYyBiL2ZzL29jZnMyL3N1cGVyLmMKaW5kZXggMzA0YjYzYS4uNDNlZDExMyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc3VwZXIuYworKysgYi9mcy9vY2ZzMi9zdXBlci5jCkBAIC00MSw2ICs0MSw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgogCiAjZGVmaW5lIE1MT0dfTUFTS19QUkVGSVggTUxfU1VQRVIKICNpbmNsdWRlIDxjbHVzdGVyL21hc2tsb2cuaD4KQEAgLTUxLDYgKzUyLDcgQEAKICNpbmNsdWRlICJvY2ZzMV9mc19jb21wYXQuaCIKIAogI2luY2x1ZGUgImFsbG9jLmgiCisjaW5jbHVkZSAiYmxvY2tjaGVjay5oIgogI2luY2x1ZGUgImRsbWdsdWUuaCIKICNpbmNsdWRlICJleHBvcnQuaCIKICNpbmNsdWRlICJleHRlbnRfbWFwLmgiCkBAIC02NSwxMCArNjcsMTMgQEAKICNpbmNsdWRlICJ1cHRvZGF0ZS5oIgogI2luY2x1ZGUgInZlci5oIgogI2luY2x1ZGUgInhhdHRyLmgiCisjaW5jbHVkZSAicXVvdGEuaCIKIAogI2luY2x1ZGUgImJ1ZmZlcl9oZWFkX2lvLmgiCiAKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqb2NmczJfaW5vZGVfY2FjaGVwID0gTlVMTDsKK3N0cnVjdCBrbWVtX2NhY2hlICpvY2ZzMl9kcXVvdF9jYWNoZXA7CitzdHJ1Y3Qga21lbV9jYWNoZSAqb2NmczJfcWZfY2h1bmtfY2FjaGVwOwogCiAvKiBPQ0ZTMiBuZWVkcyB0byBzY2hlZHVsZSBzZXZlcmFsIGRpZmZlcm50IHR5cGVzIG9mIHdvcmsgd2hpY2gKICAqIHJlcXVpcmUgY2x1c3RlciBsb2NraW5nLCBkaXNrIEkvTywgcmVjb3Zlcnkgd2FpdHMsIGV0Yy4gU2luY2UgdGhlc2UKQEAgLTEyNCw2ICsxMjksOSBAQAogc3RhdGljIHZvaWQgb2NmczJfd3JpdGVfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CiBzdGF0aWMgc3RydWN0IGlub2RlICpvY2ZzMl9hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKIHN0YXRpYyB2b2lkIG9jZnMyX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CitzdGF0aWMgaW50IG9jZnMyX3N1c3BfcXVvdGFzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLCBpbnQgdW5zdXNwZW5kKTsKK3N0YXRpYyBpbnQgb2NmczJfZW5hYmxlX3F1b3RhcyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYik7CitzdGF0aWMgdm9pZCBvY2ZzMl9kaXNhYmxlX3F1b3RhcyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYik7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBvY2ZzMl9zb3BzID0gewogCS5zdGF0ZnMJCT0gb2NmczJfc3RhdGZzLApAQCAtMTM3LDYgKzE0NSw4IEBACiAJLnB1dF9zdXBlcgk9IG9jZnMyX3B1dF9zdXBlciwKIAkucmVtb3VudF9mcwk9IG9jZnMyX3JlbW91bnQsCiAJLnNob3dfb3B0aW9ucyAgID0gb2NmczJfc2hvd19vcHRpb25zLAorCS5xdW90YV9yZWFkCT0gb2NmczJfcXVvdGFfcmVhZCwKKwkucXVvdGFfd3JpdGUJPSBvY2ZzMl9xdW90YV93cml0ZSwKIH07CiAKIGVudW0gewpAQCAtMTU4LDYgKzE2OCwxMCBAQAogCU9wdF91c2VyX3hhdHRyLAogCU9wdF9ub3VzZXJfeGF0dHIsCiAJT3B0X2lub2RlNjQsCisJT3B0X2FjbCwKKwlPcHRfbm9hY2wsCisJT3B0X3VzcnF1b3RhLAorCU9wdF9ncnBxdW90YSwKIAlPcHRfZXJyLAogfTsKIApAQCAtMTgwLDYgKzE5NCwxMCBAQAogCXtPcHRfdXNlcl94YXR0ciwgInVzZXJfeGF0dHIifSwKIAl7T3B0X25vdXNlcl94YXR0ciwgIm5vdXNlcl94YXR0ciJ9LAogCXtPcHRfaW5vZGU2NCwgImlub2RlNjQifSwKKwl7T3B0X2FjbCwgImFjbCJ9LAorCXtPcHRfbm9hY2wsICJub2FjbCJ9LAorCXtPcHRfdXNycXVvdGEsICJ1c3JxdW90YSJ9LAorCXtPcHRfZ3JwcXVvdGEsICJncnBxdW90YSJ9LAogCXtPcHRfZXJyLCBOVUxMfQogfTsKIApAQCAtMjIxLDYgKzIzOSwxOSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG9jZnMyX25lZWRfc3lzdGVtX2lub2RlKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLCBpbnQgaW5vKQoreworCWlmICghT0NGUzJfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKG9zYi0+c2IsIE9DRlMyX0ZFQVRVUkVfUk9fQ09NUEFUX1VTUlFVT1RBKQorCSAgICAmJiAoaW5vID09IFVTRVJfUVVPVEFfU1lTVEVNX0lOT0RFCisJCXx8IGlubyA9PSBMT0NBTF9VU0VSX1FVT1RBX1NZU1RFTV9JTk9ERSkpCisJCXJldHVybiAwOworCWlmICghT0NGUzJfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKG9zYi0+c2IsIE9DRlMyX0ZFQVRVUkVfUk9fQ09NUEFUX0dSUFFVT1RBKQorCSAgICAmJiAoaW5vID09IEdST1VQX1FVT1RBX1NZU1RFTV9JTk9ERQorCQl8fCBpbm8gPT0gTE9DQUxfR1JPVVBfUVVPVEFfU1lTVEVNX0lOT0RFKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKIHN0YXRpYyBpbnQgb2NmczJfaW5pdF9nbG9iYWxfc3lzdGVtX2lub2RlcyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYikKIHsKIAlzdHJ1Y3QgaW5vZGUgKm5ldyA9IE5VTEw7CkBAIC0yNDcsNiArMjc4LDggQEAKIAogCWZvciAoaSA9IE9DRlMyX0ZJUlNUX09OTElORV9TWVNURU1fSU5PREU7CiAJICAgICBpIDw9IE9DRlMyX0xBU1RfR0xPQkFMX1NZU1RFTV9JTk9ERTsgaSsrKSB7CisJCWlmICghb2NmczJfbmVlZF9zeXN0ZW1faW5vZGUob3NiLCBpKSkKKwkJCWNvbnRpbnVlOwogCQluZXcgPSBvY2ZzMl9nZXRfc3lzdGVtX2ZpbGVfaW5vZGUob3NiLCBpLCBvc2ItPnNsb3RfbnVtKTsKIAkJaWYgKCFuZXcpIHsKIAkJCW9jZnMyX3JlbGVhc2Vfc3lzdGVtX2lub2Rlcyhvc2IpOwpAQCAtMjc3LDYgKzMxMCw4IEBACiAJZm9yIChpID0gT0NGUzJfTEFTVF9HTE9CQUxfU1lTVEVNX0lOT0RFICsgMTsKIAkgICAgIGkgPCBOVU1fU1lTVEVNX0lOT0RFUzsKIAkgICAgIGkrKykgeworCQlpZiAoIW9jZnMyX25lZWRfc3lzdGVtX2lub2RlKG9zYiwgaSkpCisJCQljb250aW51ZTsKIAkJbmV3ID0gb2NmczJfZ2V0X3N5c3RlbV9maWxlX2lub2RlKG9zYiwgaSwgb3NiLT5zbG90X251bSk7CiAJCWlmICghbmV3KSB7CiAJCQlvY2ZzMl9yZWxlYXNlX3N5c3RlbV9pbm9kZXMob3NiKTsKQEAgLTQyNiw2ICs0NjEsMTIgQEAKIAogCS8qIFdlJ3JlIGdvaW5nIHRvL2Zyb20gcmVhZG9ubHkgbW9kZS4gKi8KIAlpZiAoKCpmbGFncyAmIE1TX1JET05MWSkgIT0gKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQkvKiBEaXNhYmxlIHF1b3RhIGFjY291bnRpbmcgYmVmb3JlIHJlbW91bnRpbmcgUk8gKi8KKwkJaWYgKCpmbGFncyAmIE1TX1JET05MWSkgeworCQkJcmV0ID0gb2NmczJfc3VzcF9xdW90YXMob3NiLCAwKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWdvdG8gb3V0OworCQl9CiAJCS8qIExvY2sgaGVyZSBzbyB0aGUgY2hlY2sgb2YgSEFSRF9STyBhbmQgdGhlIHBvdGVudGlhbAogCQkgKiBzZXR0aW5nIG9mIFNPRlRfUk8gaXMgYXRvbWljLiAqLwogCQlzcGluX2xvY2soJm9zYi0+b3NiX2xvY2spOwpAQCAtNDYxLDExICs1MDIsMjggQEAKIAkJfQogdW5sb2NrX29zYjoKIAkJc3Bpbl91bmxvY2soJm9zYi0+b3NiX2xvY2spOworCQkvKiBFbmFibGUgcXVvdGEgYWNjb3VudGluZyBhZnRlciByZW1vdW50aW5nIFJXICovCisJCWlmICghcmV0ICYmICEoKmZsYWdzICYgTVNfUkRPTkxZKSkgeworCQkJaWYgKHNiX2FueV9xdW90YV9zdXNwZW5kZWQoc2IpKQorCQkJCXJldCA9IG9jZnMyX3N1c3BfcXVvdGFzKG9zYiwgMSk7CisJCQllbHNlCisJCQkJcmV0ID0gb2NmczJfZW5hYmxlX3F1b3Rhcyhvc2IpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQkvKiBSZXR1cm4gYmFjayBjaGFuZ2VzLi4uICovCisJCQkJc3Bpbl9sb2NrKCZvc2ItPm9zYl9sb2NrKTsKKwkJCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CisJCQkJb3NiLT5vc2JfZmxhZ3MgfD0gT0NGUzJfT1NCX1NPRlRfUk87CisJCQkJc3Bpbl91bmxvY2soJm9zYi0+b3NiX2xvY2spOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CiAJfQogCiAJaWYgKCFyZXQpIHsKIAkJLyogT25seSBzYXZlIG9mZiB0aGUgbmV3IG1vdW50IG9wdGlvbnMgaW4gY2FzZSBvZiBhIHN1Y2Nlc3NmdWwKIAkJICogcmVtb3VudC4gKi8KKwkJaWYgKCEob3NiLT5zX2ZlYXR1cmVfaW5jb21wYXQgJiBPQ0ZTMl9GRUFUVVJFX0lOQ09NUEFUX1hBVFRSKSkKKwkJCXBhcnNlZF9vcHRpb25zLm1vdW50X29wdCAmPSB+T0NGUzJfTU9VTlRfUE9TSVhfQUNMOwogCQlvc2ItPnNfbW91bnRfb3B0ID0gcGFyc2VkX29wdGlvbnMubW91bnRfb3B0OwogCQlvc2ItPnNfYXRpbWVfcXVhbnR1bSA9IHBhcnNlZF9vcHRpb25zLmF0aW1lX3F1YW50dW07CiAJCW9zYi0+cHJlZmVycmVkX3Nsb3QgPSBwYXJzZWRfb3B0aW9ucy5zbG90OwpAQCAtNjE5LDYgKzY3NywxMzEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBvY2ZzMl9zdXNwX3F1b3RhcyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwgaW50IHVuc3VzcGVuZCkKK3sKKwlpbnQgdHlwZTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gb3NiLT5zYjsKKwl1bnNpZ25lZCBpbnQgZmVhdHVyZVtNQVhRVU9UQVNdID0geyBPQ0ZTMl9GRUFUVVJFX1JPX0NPTVBBVF9VU1JRVU9UQSwKKwkJCQkJICAgICBPQ0ZTMl9GRUFUVVJFX1JPX0NPTVBBVF9HUlBRVU9UQX07CisJaW50IHN0YXR1cyA9IDA7CisKKwlmb3IgKHR5cGUgPSAwOyB0eXBlIDwgTUFYUVVPVEFTOyB0eXBlKyspIHsKKwkJaWYgKCFPQ0ZTMl9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsIGZlYXR1cmVbdHlwZV0pKQorCQkJY29udGludWU7CisJCWlmICh1bnN1c3BlbmQpCisJCQlzdGF0dXMgPSB2ZnNfcXVvdGFfZW5hYmxlKAorCQkJCQlzYl9kcW9wdChzYiktPmZpbGVzW3R5cGVdLAorCQkJCQl0eXBlLCBRRk1UX09DRlMyLAorCQkJCQlEUVVPVF9TVVNQRU5ERUQpOworCQllbHNlCisJCQlzdGF0dXMgPSB2ZnNfcXVvdGFfZGlzYWJsZShzYiwgdHlwZSwKKwkJCQkJCSAgIERRVU9UX1NVU1BFTkRFRCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJfQorCWlmIChzdGF0dXMgPCAwKQorCQltbG9nKE1MX0VSUk9SLCAiRmFpbGVkIHRvIHN1c3BlbmQvdW5zdXNwZW5kIHF1b3RhcyBvbiAiCisJCSAgICAgInJlbW91bnQgKGVycm9yID0gJWQpLlxuIiwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IG9jZnMyX2VuYWJsZV9xdW90YXMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpCit7CisJc3RydWN0IGlub2RlICppbm9kZVtNQVhRVU9UQVNdID0geyBOVUxMLCBOVUxMIH07CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IG9zYi0+c2I7CisJdW5zaWduZWQgaW50IGZlYXR1cmVbTUFYUVVPVEFTXSA9IHsgT0NGUzJfRkVBVFVSRV9ST19DT01QQVRfVVNSUVVPVEEsCisJCQkJCSAgICAgT0NGUzJfRkVBVFVSRV9ST19DT01QQVRfR1JQUVVPVEF9OworCXVuc2lnbmVkIGludCBpbm9bTUFYUVVPVEFTXSA9IHsgTE9DQUxfVVNFUl9RVU9UQV9TWVNURU1fSU5PREUsCisJCQkJCUxPQ0FMX0dST1VQX1FVT1RBX1NZU1RFTV9JTk9ERSB9OworCWludCBzdGF0dXM7CisJaW50IHR5cGU7CisKKwlzYl9kcW9wdChzYiktPmZsYWdzIHw9IERRVU9UX1FVT1RBX1NZU19GSUxFIHwgRFFVT1RfTkVHQVRJVkVfVVNBR0U7CisJZm9yICh0eXBlID0gMDsgdHlwZSA8IE1BWFFVT1RBUzsgdHlwZSsrKSB7CisJCWlmICghT0NGUzJfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLCBmZWF0dXJlW3R5cGVdKSkKKwkJCWNvbnRpbnVlOworCQlpbm9kZVt0eXBlXSA9IG9jZnMyX2dldF9zeXN0ZW1fZmlsZV9pbm9kZShvc2IsIGlub1t0eXBlXSwKKwkJCQkJCQlvc2ItPnNsb3RfbnVtKTsKKwkJaWYgKCFpbm9kZVt0eXBlXSkgeworCQkJc3RhdHVzID0gLUVOT0VOVDsKKwkJCWdvdG8gb3V0X3F1b3RhX29mZjsKKwkJfQorCQlzdGF0dXMgPSB2ZnNfcXVvdGFfZW5hYmxlKGlub2RlW3R5cGVdLCB0eXBlLCBRRk1UX09DRlMyLAorCQkJCQkJRFFVT1RfVVNBR0VfRU5BQkxFRCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBvdXRfcXVvdGFfb2ZmOworCX0KKworCWZvciAodHlwZSA9IDA7IHR5cGUgPCBNQVhRVU9UQVM7IHR5cGUrKykKKwkJaXB1dChpbm9kZVt0eXBlXSk7CisJcmV0dXJuIDA7CitvdXRfcXVvdGFfb2ZmOgorCW9jZnMyX2Rpc2FibGVfcXVvdGFzKG9zYik7CisJZm9yICh0eXBlID0gMDsgdHlwZSA8IE1BWFFVT1RBUzsgdHlwZSsrKQorCQlpcHV0KGlub2RlW3R5cGVdKTsKKwltbG9nX2Vycm5vKHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHZvaWQgb2NmczJfZGlzYWJsZV9xdW90YXMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpCit7CisJaW50IHR5cGU7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gb3NiLT5zYjsKKworCS8qIFdlIG1vc3RseSBpZ25vcmUgZXJyb3JzIGluIHRoaXMgZnVuY3Rpb24gYmVjYXVzZSB0aGVyZSdzIG5vdCBtdWNoCisJICogd2UgY2FuIGRvIHdoZW4gd2Ugc2VlIHRoZW0gKi8KKwlmb3IgKHR5cGUgPSAwOyB0eXBlIDwgTUFYUVVPVEFTOyB0eXBlKyspIHsKKwkJaWYgKCFzYl9oYXNfcXVvdGFfbG9hZGVkKHNiLCB0eXBlKSkKKwkJCWNvbnRpbnVlOworCQlpbm9kZSA9IGlncmFiKHNiLT5zX2RxdW90LmZpbGVzW3R5cGVdKTsKKwkJLyogVHVybiBvZmYgcXVvdGFzLiBUaGlzIHdpbGwgcmVtb3ZlIGFsbCBkcXVvdCBzdHJ1Y3R1cmVzIGZyb20KKwkJICogbWVtb3J5IGFuZCBzbyB0aGV5IHdpbGwgYmUgYXV0b21hdGljYWxseSBzeW5jZWQgdG8gZ2xvYmFsCisJCSAqIHF1b3RhIGZpbGVzICovCisJCXZmc19xdW90YV9kaXNhYmxlKHNiLCB0eXBlLCBEUVVPVF9VU0FHRV9FTkFCTEVEIHwKKwkJCQkJICAgIERRVU9UX0xJTUlUU19FTkFCTEVEKTsKKwkJaWYgKCFpbm9kZSkKKwkJCWNvbnRpbnVlOworCQlpcHV0KGlub2RlKTsKKwl9Cit9CisKKy8qIEhhbmRsZSBxdW90YSBvbiBxdW90YWN0bCAqLworc3RhdGljIGludCBvY2ZzMl9xdW90YV9vbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwgaW50IGZvcm1hdF9pZCwKKwkJCSAgY2hhciAqcGF0aCwgaW50IHJlbW91bnQpCit7CisJdW5zaWduZWQgaW50IGZlYXR1cmVbTUFYUVVPVEFTXSA9IHsgT0NGUzJfRkVBVFVSRV9ST19DT01QQVRfVVNSUVVPVEEsCisJCQkJCSAgICAgT0NGUzJfRkVBVFVSRV9ST19DT01QQVRfR1JQUVVPVEF9OworCisJaWYgKCFPQ0ZTMl9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsIGZlYXR1cmVbdHlwZV0pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChyZW1vdW50KQorCQlyZXR1cm4gMDsJLyogSnVzdCBpZ25vcmUgaXQgaGFzIGJlZW4gaGFuZGxlZCBpbgorCQkJCSAqIG9jZnMyX3JlbW91bnQoKSAqLworCXJldHVybiB2ZnNfcXVvdGFfZW5hYmxlKHNiX2Rxb3B0KHNiKS0+ZmlsZXNbdHlwZV0sIHR5cGUsCisJCQkJICAgIGZvcm1hdF9pZCwgRFFVT1RfTElNSVRTX0VOQUJMRUQpOworfQorCisvKiBIYW5kbGUgcXVvdGEgb2ZmIHF1b3RhY3RsICovCitzdGF0aWMgaW50IG9jZnMyX3F1b3RhX29mZihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwgaW50IHJlbW91bnQpCit7CisJaWYgKHJlbW91bnQpCisJCXJldHVybiAwOwkvKiBJZ25vcmUgbm93IGFuZCBoYW5kbGUgbGF0ZXIgaW4KKwkJCQkgKiBvY2ZzMl9yZW1vdW50KCkgKi8KKwlyZXR1cm4gdmZzX3F1b3RhX2Rpc2FibGUoc2IsIHR5cGUsIERRVU9UX0xJTUlUU19FTkFCTEVEKTsKK30KKworc3RhdGljIHN0cnVjdCBxdW90YWN0bF9vcHMgb2NmczJfcXVvdGFjdGxfb3BzID0geworCS5xdW90YV9vbgk9IG9jZnMyX3F1b3RhX29uLAorCS5xdW90YV9vZmYJPSBvY2ZzMl9xdW90YV9vZmYsCisJLnF1b3RhX3N5bmMJPSB2ZnNfcXVvdGFfc3luYywKKwkuZ2V0X2luZm8JPSB2ZnNfZ2V0X2RxaW5mbywKKwkuc2V0X2luZm8JPSB2ZnNfc2V0X2RxaW5mbywKKwkuZ2V0X2RxYmxrCT0gdmZzX2dldF9kcWJsaywKKwkuc2V0X2RxYmxrCT0gdmZzX3NldF9kcWJsaywKK307CisKIHN0YXRpYyBpbnQgb2NmczJfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KQogewogCXN0cnVjdCBkZW50cnkgKnJvb3Q7CkBAIC02NTEsMTIgKzgzNCwzMiBAQAogCX0KIAlicmVsc2UoYmgpOwogCWJoID0gTlVMTDsKKworCWlmICghKG9zYi0+c19mZWF0dXJlX2luY29tcGF0ICYgT0NGUzJfRkVBVFVSRV9JTkNPTVBBVF9YQVRUUikpCisJCXBhcnNlZF9vcHRpb25zLm1vdW50X29wdCAmPSB+T0NGUzJfTU9VTlRfUE9TSVhfQUNMOworCiAJb3NiLT5zX21vdW50X29wdCA9IHBhcnNlZF9vcHRpb25zLm1vdW50X29wdDsKIAlvc2ItPnNfYXRpbWVfcXVhbnR1bSA9IHBhcnNlZF9vcHRpb25zLmF0aW1lX3F1YW50dW07CiAJb3NiLT5wcmVmZXJyZWRfc2xvdCA9IHBhcnNlZF9vcHRpb25zLnNsb3Q7CiAJb3NiLT5vc2JfY29tbWl0X2ludGVydmFsID0gcGFyc2VkX29wdGlvbnMuY29tbWl0X2ludGVydmFsOwogCW9zYi0+bG9jYWxfYWxsb2NfZGVmYXVsdF9iaXRzID0gb2NmczJfbWVnYWJ5dGVzX3RvX2NsdXN0ZXJzKHNiLCBwYXJzZWRfb3B0aW9ucy5sb2NhbGFsbG9jX29wdCk7CiAJb3NiLT5sb2NhbF9hbGxvY19iaXRzID0gb3NiLT5sb2NhbF9hbGxvY19kZWZhdWx0X2JpdHM7CisJaWYgKG9zYi0+c19tb3VudF9vcHQgJiBPQ0ZTMl9NT1VOVF9VU1JRVU9UQSAmJgorCSAgICAhT0NGUzJfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLAorCQkJCQkgT0NGUzJfRkVBVFVSRV9ST19DT01QQVRfVVNSUVVPVEEpKSB7CisJCXN0YXR1cyA9IC1FSU5WQUw7CisJCW1sb2coTUxfRVJST1IsICJVc2VyIHF1b3RhcyB3ZXJlIHJlcXVlc3RlZCwgYnV0IHRoaXMgIgorCQkgICAgICJmaWxlc3lzdGVtIGRvZXMgbm90IGhhdmUgdGhlIGZlYXR1cmUgZW5hYmxlZC5cbiIpOworCQlnb3RvIHJlYWRfc3VwZXJfZXJyb3I7CisJfQorCWlmIChvc2ItPnNfbW91bnRfb3B0ICYgT0NGUzJfTU9VTlRfR1JQUVVPVEEgJiYKKwkgICAgIU9DRlMyX0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwKKwkJCQkJIE9DRlMyX0ZFQVRVUkVfUk9fQ09NUEFUX0dSUFFVT1RBKSkgeworCQlzdGF0dXMgPSAtRUlOVkFMOworCQltbG9nKE1MX0VSUk9SLCAiR3JvdXAgcXVvdGFzIHdlcmUgcmVxdWVzdGVkLCBidXQgdGhpcyAiCisJCSAgICAgImZpbGVzeXN0ZW0gZG9lcyBub3QgaGF2ZSB0aGUgZmVhdHVyZSBlbmFibGVkLlxuIik7CisJCWdvdG8gcmVhZF9zdXBlcl9lcnJvcjsKKwl9CiAKIAlzdGF0dXMgPSBvY2ZzMl92ZXJpZnlfdXNlcnNwYWNlX3N0YWNrKG9zYiwgJnBhcnNlZF9vcHRpb25zKTsKIAlpZiAoc3RhdHVzKQpAQCAtNjY0LDYgKzg2Nyw5IEBACiAKIAlzYi0+c19tYWdpYyA9IE9DRlMyX1NVUEVSX01BR0lDOwogCisJc2ItPnNfZmxhZ3MgPSAoc2ItPnNfZmxhZ3MgJiB+TVNfUE9TSVhBQ0wpIHwKKwkJKChvc2ItPnNfbW91bnRfb3B0ICYgT0NGUzJfTU9VTlRfUE9TSVhfQUNMKSA/IE1TX1BPU0lYQUNMIDogMCk7CisKIAkvKiBIYXJkIHJlYWRvbmx5IG1vZGUgb25seSBpZjogYmRldl9yZWFkX29ubHksIE1TX1JET05MWSwKIAkgKiBoZWFydGJlYXQ9bm9uZSAqLwogCWlmIChiZGV2X3JlYWRfb25seShzYi0+c19iZGV2KSkgewpAQCAtNzU4LDYgKzk2NCwyOCBAQAogCWF0b21pY19zZXQoJm9zYi0+dm9sX3N0YXRlLCBWT0xVTUVfTU9VTlRFRCk7CiAJd2FrZV91cCgmb3NiLT5vc2JfbW91bnRfZXZlbnQpOwogCisJLyogTm93IHdlIGNhbiBpbml0aWFsaXplIHF1b3RhcyBiZWNhdXNlIHdlIGNhbiBhZmZvcmQgdG8gd2FpdAorCSAqIGZvciBjbHVzdGVyIGxvY2tzIHJlY292ZXJ5IG5vdy4gVGhhdCBhbHNvIG1lYW5zIHRoYXQgdHJ1bmNhdGlvbgorCSAqIGxvZyByZWNvdmVyeSBjYW4gaGFwcGVuIGJ1dCB0aGF0IHdhaXRzIGZvciBwcm9wZXIgcXVvdGEgc2V0dXAgKi8KKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJc3RhdHVzID0gb2NmczJfZW5hYmxlX3F1b3Rhcyhvc2IpOworCQlpZiAoc3RhdHVzIDwgMCkgeworCQkJLyogV2UgaGF2ZSB0byBlcnItb3V0IHNwZWNpYWxseSBoZXJlIGJlY2F1c2UKKwkJCSAqIHNfcm9vdCBpcyBhbHJlYWR5IHNldCAqLworCQkJbWxvZ19lcnJubyhzdGF0dXMpOworCQkJYXRvbWljX3NldCgmb3NiLT52b2xfc3RhdGUsIFZPTFVNRV9ESVNBQkxFRCk7CisJCQl3YWtlX3VwKCZvc2ItPm9zYl9tb3VudF9ldmVudCk7CisJCQltbG9nX2V4aXQoc3RhdHVzKTsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKwl9CisKKwlvY2ZzMl9jb21wbGV0ZV9xdW90YV9yZWNvdmVyeShvc2IpOworCisJLyogTm93IHdlIHdha2UgdXAgYWdhaW4gZm9yIHByb2Nlc3NlcyB3YWl0aW5nIGZvciBxdW90YXMgKi8KKwlhdG9taWNfc2V0KCZvc2ItPnZvbF9zdGF0ZSwgVk9MVU1FX01PVU5URURfUVVPVEFTKTsKKwl3YWtlX3VwKCZvc2ItPm9zYl9tb3VudF9ldmVudCk7CisKIAltbG9nX2V4aXQoc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwogCkBAIC05NDUsNiArMTE3Myw0MSBAQAogCQljYXNlIE9wdF9pbm9kZTY0OgogCQkJbW9wdC0+bW91bnRfb3B0IHw9IE9DRlMyX01PVU5UX0lOT0RFNjQ7CiAJCQlicmVhazsKKwkJY2FzZSBPcHRfdXNycXVvdGE6CisJCQkvKiBXZSBjaGVjayBvbmx5IG9uIHJlbW91bnQsIG90aGVyd2lzZSBmZWF0dXJlcworCQkJICogYXJlbid0IHlldCBpbml0aWFsaXplZC4gKi8KKwkJCWlmIChpc19yZW1vdW50ICYmICFPQ0ZTMl9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsCisJCQkgICAgT0NGUzJfRkVBVFVSRV9ST19DT01QQVRfVVNSUVVPVEEpKSB7CisJCQkJbWxvZyhNTF9FUlJPUiwgIlVzZXIgcXVvdGEgcmVxdWVzdGVkIGJ1dCAiCisJCQkJICAgICAiZmlsZXN5c3RlbSBmZWF0dXJlIGlzIG5vdCBzZXRcbiIpOworCQkJCXN0YXR1cyA9IDA7CisJCQkJZ290byBiYWlsOworCQkJfQorCQkJbW9wdC0+bW91bnRfb3B0IHw9IE9DRlMyX01PVU5UX1VTUlFVT1RBOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2dycHF1b3RhOgorCQkJaWYgKGlzX3JlbW91bnQgJiYgIU9DRlMyX0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwKKwkJCSAgICBPQ0ZTMl9GRUFUVVJFX1JPX0NPTVBBVF9HUlBRVU9UQSkpIHsKKwkJCQltbG9nKE1MX0VSUk9SLCAiR3JvdXAgcXVvdGEgcmVxdWVzdGVkIGJ1dCAiCisJCQkJICAgICAiZmlsZXN5c3RlbSBmZWF0dXJlIGlzIG5vdCBzZXRcbiIpOworCQkJCXN0YXR1cyA9IDA7CisJCQkJZ290byBiYWlsOworCQkJfQorCQkJbW9wdC0+bW91bnRfb3B0IHw9IE9DRlMyX01PVU5UX0dSUFFVT1RBOworCQkJYnJlYWs7CisjaWZkZWYgQ09ORklHX09DRlMyX0ZTX1BPU0lYX0FDTAorCQljYXNlIE9wdF9hY2w6CisJCQltb3B0LT5tb3VudF9vcHQgfD0gT0NGUzJfTU9VTlRfUE9TSVhfQUNMOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X25vYWNsOgorCQkJbW9wdC0+bW91bnRfb3B0ICY9IH5PQ0ZTMl9NT1VOVF9QT1NJWF9BQ0w7CisJCQlicmVhazsKKyNlbHNlCisJCWNhc2UgT3B0X2FjbDoKKwkJY2FzZSBPcHRfbm9hY2w6CisJCQlwcmludGsoS0VSTl9JTkZPICJvY2ZzMiAobm8pYWNsIG9wdGlvbnMgbm90IHN1cHBvcnRlZFxuIik7CisJCQlicmVhazsKKyNlbmRpZgogCQlkZWZhdWx0OgogCQkJbWxvZyhNTF9FUlJPUiwKIAkJCSAgICAgIlVucmVjb2duaXplZCBtb3VudCBvcHRpb24gXCIlc1wiICIKQEAgLTEwMDgsNiArMTI3MSwxMCBAQAogCWlmIChvc2ItPm9zYl9jbHVzdGVyX3N0YWNrWzBdKQogCQlzZXFfcHJpbnRmKHMsICIsY2x1c3Rlcl9zdGFjaz0lLipzIiwgT0NGUzJfU1RBQ0tfTEFCRUxfTEVOLAogCQkJICAgb3NiLT5vc2JfY2x1c3Rlcl9zdGFjayk7CisJaWYgKG9wdHMgJiBPQ0ZTMl9NT1VOVF9VU1JRVU9UQSkKKwkJc2VxX3ByaW50ZihzLCAiLHVzcnF1b3RhIik7CisJaWYgKG9wdHMgJiBPQ0ZTMl9NT1VOVF9HUlBRVU9UQSkKKwkJc2VxX3ByaW50ZihzLCAiLGdycHF1b3RhIik7CiAKIAlpZiAob3B0cyAmIE9DRlMyX01PVU5UX05PVVNFUlhBVFRSKQogCQlzZXFfcHJpbnRmKHMsICIsbm91c2VyX3hhdHRyIik7CkBAIC0xMDE3LDYgKzEyODQsMTMgQEAKIAlpZiAob3B0cyAmIE9DRlMyX01PVU5UX0lOT0RFNjQpCiAJCXNlcV9wcmludGYocywgIixpbm9kZTY0Iik7CiAKKyNpZmRlZiBDT05GSUdfT0NGUzJfRlNfUE9TSVhfQUNMCisJaWYgKG9wdHMgJiBPQ0ZTMl9NT1VOVF9QT1NJWF9BQ0wpCisJCXNlcV9wcmludGYocywgIixhY2wiKTsKKwllbHNlCisJCXNlcV9wcmludGYocywgIixub2FjbCIpOworI2VuZGlmCisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTA1MiwxMCArMTMyNiwxNiBAQAogCQltbG9nKE1MX0VSUk9SLCAiVW5hYmxlIHRvIGNyZWF0ZSBvY2ZzMiBkZWJ1Z2ZzIHJvb3QuXG4iKTsKIAl9CiAKKwlzdGF0dXMgPSBvY2ZzMl9xdW90YV9zZXR1cCgpOworCWlmIChzdGF0dXMpCisJCWdvdG8gbGVhdmU7CisKIAlvY2ZzMl9zZXRfbG9ja2luZ19wcm90b2NvbCgpOwogCisJc3RhdHVzID0gcmVnaXN0ZXJfcXVvdGFfZm9ybWF0KCZvY2ZzMl9xdW90YV9mb3JtYXQpOwogbGVhdmU6CiAJaWYgKHN0YXR1cyA8IDApIHsKKwkJb2NmczJfcXVvdGFfc2h1dGRvd24oKTsKIAkJb2NmczJfZnJlZV9tZW1fY2FjaGVzKCk7CiAJCWV4aXRfb2NmczJfdXB0b2RhdGVfY2FjaGUoKTsKIAl9CkBAIC0xMDcyLDExICsxMzUyLDE1IEBACiB7CiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKKwlvY2ZzMl9xdW90YV9zaHV0ZG93bigpOworCiAJaWYgKG9jZnMyX3dxKSB7CiAJCWZsdXNoX3dvcmtxdWV1ZShvY2ZzMl93cSk7CiAJCWRlc3Ryb3lfd29ya3F1ZXVlKG9jZnMyX3dxKTsKIAl9CiAKKwl1bnJlZ2lzdGVyX3F1b3RhX2Zvcm1hdCgmb2NmczJfcXVvdGFfZm9ybWF0KTsKKwogCWRlYnVnZnNfcmVtb3ZlKG9jZnMyX2RlYnVnZnNfcm9vdCk7CiAKIAlvY2ZzMl9mcmVlX21lbV9jYWNoZXMoKTsKQEAgLTExOTIsOCArMTQ3NiwyNyBAQAogCQkJCSAgICAgICAoU0xBQl9IV0NBQ0hFX0FMSUdOfFNMQUJfUkVDTEFJTV9BQ0NPVU5UfAogCQkJCQkJU0xBQl9NRU1fU1BSRUFEKSwKIAkJCQkgICAgICAgb2NmczJfaW5vZGVfaW5pdF9vbmNlKTsKLQlpZiAoIW9jZnMyX2lub2RlX2NhY2hlcCkKKwlvY2ZzMl9kcXVvdF9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgib2NmczJfZHF1b3RfY2FjaGUiLAorCQkJCQlzaXplb2Yoc3RydWN0IG9jZnMyX2RxdW90KSwKKwkJCQkJMCwKKwkJCQkJKFNMQUJfSFdDQUNIRV9BTElHTnxTTEFCX1JFQ0xBSU1fQUNDT1VOVHwKKwkJCQkJCVNMQUJfTUVNX1NQUkVBRCksCisJCQkJCU5VTEwpOworCW9jZnMyX3FmX2NodW5rX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJvY2ZzMl9xZl9jaHVua19jYWNoZSIsCisJCQkJCXNpemVvZihzdHJ1Y3Qgb2NmczJfcXVvdGFfY2h1bmspLAorCQkJCQkwLAorCQkJCQkoU0xBQl9SRUNMQUlNX0FDQ09VTlR8U0xBQl9NRU1fU1BSRUFEKSwKKwkJCQkJTlVMTCk7CisJaWYgKCFvY2ZzMl9pbm9kZV9jYWNoZXAgfHwgIW9jZnMyX2RxdW90X2NhY2hlcCB8fAorCSAgICAhb2NmczJfcWZfY2h1bmtfY2FjaGVwKSB7CisJCWlmIChvY2ZzMl9pbm9kZV9jYWNoZXApCisJCQlrbWVtX2NhY2hlX2Rlc3Ryb3kob2NmczJfaW5vZGVfY2FjaGVwKTsKKwkJaWYgKG9jZnMyX2RxdW90X2NhY2hlcCkKKwkJCWttZW1fY2FjaGVfZGVzdHJveShvY2ZzMl9kcXVvdF9jYWNoZXApOworCQlpZiAob2NmczJfcWZfY2h1bmtfY2FjaGVwKQorCQkJa21lbV9jYWNoZV9kZXN0cm95KG9jZnMyX3FmX2NodW5rX2NhY2hlcCk7CiAJCXJldHVybiAtRU5PTUVNOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtMTIwMiw4ICsxNTA1LDE1IEBACiB7CiAJaWYgKG9jZnMyX2lub2RlX2NhY2hlcCkKIAkJa21lbV9jYWNoZV9kZXN0cm95KG9jZnMyX2lub2RlX2NhY2hlcCk7Ci0KIAlvY2ZzMl9pbm9kZV9jYWNoZXAgPSBOVUxMOworCisJaWYgKG9jZnMyX2RxdW90X2NhY2hlcCkKKwkJa21lbV9jYWNoZV9kZXN0cm95KG9jZnMyX2RxdW90X2NhY2hlcCk7CisJb2NmczJfZHF1b3RfY2FjaGVwID0gTlVMTDsKKworCWlmIChvY2ZzMl9xZl9jaHVua19jYWNoZXApCisJCWttZW1fY2FjaGVfZGVzdHJveShvY2ZzMl9xZl9jaHVua19jYWNoZXApOworCW9jZnMyX3FmX2NodW5rX2NhY2hlcCA9IE5VTEw7CiB9CiAKIHN0YXRpYyBpbnQgb2NmczJfZ2V0X3NlY3RvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLApAQCAtMTMwMyw2ICsxNjEzLDggQEAKIAlvc2IgPSBPQ0ZTMl9TQihzYik7CiAJQlVHX09OKCFvc2IpOwogCisJb2NmczJfZGlzYWJsZV9xdW90YXMob3NiKTsKKwogCW9jZnMyX3NodXRkb3duX2xvY2FsX2FsbG9jKG9zYik7CiAKIAlvY2ZzMl90cnVuY2F0ZV9sb2dfc2h1dGRvd24ob3NiKTsKQEAgLTE0MTMsNiArMTcyNSw4IEBACiAJc2ItPnNfZnNfaW5mbyA9IG9zYjsKIAlzYi0+c19vcCA9ICZvY2ZzMl9zb3BzOwogCXNiLT5zX2V4cG9ydF9vcCA9ICZvY2ZzMl9leHBvcnRfb3BzOworCXNiLT5zX3Fjb3AgPSAmb2NmczJfcXVvdGFjdGxfb3BzOworCXNiLT5kcV9vcCA9ICZvY2ZzMl9xdW90YV9vcGVyYXRpb25zOwogCXNiLT5zX3hhdHRyID0gb2NmczJfeGF0dHJfaGFuZGxlcnM7CiAJc2ItPnNfdGltZV9ncmFuID0gMTsKIAlzYi0+c19mbGFncyB8PSBNU19OT0FUSU1FOwpAQCAtMTY3Niw2ICsxOTkwLDE1IEBACiAKIAlpZiAobWVtY21wKGRpLT5pX3NpZ25hdHVyZSwgT0NGUzJfU1VQRVJfQkxPQ0tfU0lHTkFUVVJFLAogCQkgICBzdHJsZW4oT0NGUzJfU1VQRVJfQkxPQ0tfU0lHTkFUVVJFKSkgPT0gMCkgeworCQkvKiBXZSBoYXZlIHRvIGRvIGEgcmF3IGNoZWNrIG9mIHRoZSBmZWF0dXJlIGhlcmUgKi8KKwkJaWYgKGxlMzJfdG9fY3B1KGRpLT5pZDIuaV9zdXBlci5zX2ZlYXR1cmVfaW5jb21wYXQpICYKKwkJICAgIE9DRlMyX0ZFQVRVUkVfSU5DT01QQVRfTUVUQV9FQ0MpIHsKKwkJCXN0YXR1cyA9IG9jZnMyX2Jsb2NrX2NoZWNrX3ZhbGlkYXRlKGJoLT5iX2RhdGEsCisJCQkJCQkJICAgIGJoLT5iX3NpemUsCisJCQkJCQkJICAgICZkaS0+aV9jaGVjayk7CisJCQlpZiAoc3RhdHVzKQorCQkJCWdvdG8gb3V0OworCQl9CiAJCXN0YXR1cyA9IC1FSU5WQUw7CiAJCWlmICgoMSA8PCBsZTMyX3RvX2NwdShkaS0+aWQyLmlfc3VwZXIuc19ibG9ja3NpemVfYml0cykpICE9IGJsa3N6KSB7CiAJCQltbG9nKE1MX0VSUk9SLCAiZm91bmQgc3VwZXJibG9jayB3aXRoIGluY29ycmVjdCBibG9jayAiCkBAIC0xNzE3LDYgKzIwNDAsNyBAQAogCQl9CiAJfQogCitvdXQ6CiAJbWxvZ19leGl0KHN0YXR1cyk7CiAJcmV0dXJuIHN0YXR1czsKIH0KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL3N5bWxpbmsuYyBiL2ZzL29jZnMyL3N5bWxpbmsuYwppbmRleCBjYmQwM2RmLi5lZDBhMGNmIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9zeW1saW5rLmMKKysrIGIvZnMvb2NmczIvc3ltbGluay5jCkBAIC04NCw3ICs4NCw3IEBACiAKIAltbG9nX2VudHJ5X3ZvaWQoKTsKIAotCXN0YXR1cyA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIE9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywgYmgpOworCXN0YXR1cyA9IG9jZnMyX3JlYWRfaW5vZGVfYmxvY2soaW5vZGUsIGJoKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWxpbmsgPSBFUlJfUFRSKHN0YXR1cyk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi94YXR0ci5jIGIvZnMvb2NmczIveGF0dHIuYwppbmRleCA3NGQ3MzY3Li5lMWQ2MzhhIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi94YXR0ci5jCisrKyBiL2ZzL29jZnMyL3hhdHRyLmMKQEAgLTM1LDEyICszNSwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogCiAjZGVmaW5lIE1MT0dfTUFTS19QUkVGSVggTUxfWEFUVFIKICNpbmNsdWRlIDxjbHVzdGVyL21hc2tsb2cuaD4KIAogI2luY2x1ZGUgIm9jZnMyLmgiCiAjaW5jbHVkZSAiYWxsb2MuaCIKKyNpbmNsdWRlICJibG9ja2NoZWNrLmgiCiAjaW5jbHVkZSAiZGxtZ2x1ZS5oIgogI2luY2x1ZGUgImZpbGUuaCIKICNpbmNsdWRlICJzeW1saW5rLmgiCkBAIC02MSwxMiArNjMsMzIgQEAKIH07CiAKIHN0cnVjdCBvY2ZzMl94YXR0cl9idWNrZXQgewotCXN0cnVjdCBidWZmZXJfaGVhZCAqYmhzW09DRlMyX1hBVFRSX01BWF9CTE9DS1NfUEVSX0JVQ0tFVF07Ci0Jc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqeGg7CisJLyogVGhlIGlub2RlIHRoZXNlIHhhdHRycyBhcmUgYXNzb2NpYXRlZCB3aXRoICovCisJc3RydWN0IGlub2RlICpidV9pbm9kZTsKKworCS8qIFRoZSBhY3R1YWwgYnVmZmVycyB0aGF0IG1ha2UgdXAgdGhlIGJ1Y2tldCAqLworCXN0cnVjdCBidWZmZXJfaGVhZCAqYnVfYmhzW09DRlMyX1hBVFRSX01BWF9CTE9DS1NfUEVSX0JVQ0tFVF07CisKKwkvKiBIb3cgbWFueSBibG9ja3MgbWFrZSB1cCBvbmUgYnVja2V0IGZvciB0aGlzIGZpbGVzeXN0ZW0gKi8KKwlpbnQgYnVfYmxvY2tzOworfTsKKworc3RydWN0IG9jZnMyX3hhdHRyX3NldF9jdHh0IHsKKwloYW5kbGVfdCAqaGFuZGxlOworCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjOworCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICpkYXRhX2FjOworCXN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0IGRlYWxsb2M7CiB9OwogCiAjZGVmaW5lIE9DRlMyX1hBVFRSX1JPT1RfU0laRQkoc2l6ZW9mKHN0cnVjdCBvY2ZzMl94YXR0cl9kZWZfdmFsdWVfcm9vdCkpCiAjZGVmaW5lIE9DRlMyX1hBVFRSX0lOTElORV9TSVpFCTgwCisjZGVmaW5lIE9DRlMyX1hBVFRSX0ZSRUVfSU5fSUJPRFkJKE9DRlMyX01JTl9YQVRUUl9JTkxJTkVfU0laRSBcCisJCQkJCSAtIHNpemVvZihzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyKSBcCisJCQkJCSAtIHNpemVvZihfX3UzMikpCisjZGVmaW5lIE9DRlMyX1hBVFRSX0ZSRUVfSU5fQkxPQ0socHRyKQkoKHB0ciktPmlfc2ItPnNfYmxvY2tzaXplIFwKKwkJCQkJIC0gc2l6ZW9mKHN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jaykgXAorCQkJCQkgLSBzaXplb2Yoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlcikgXAorCQkJCQkgLSBzaXplb2YoX191MzIpKQogCiBzdGF0aWMgc3RydWN0IG9jZnMyX3hhdHRyX2RlZl92YWx1ZV9yb290IGRlZl94diA9IHsKIAkueHYueHJfbGlzdC5sX2NvdW50ID0gY3B1X3RvX2xlMTYoMSksCkBAIC03NCwxMyArOTYsMjUgQEAKIAogc3RydWN0IHhhdHRyX2hhbmRsZXIgKm9jZnMyX3hhdHRyX2hhbmRsZXJzW10gPSB7CiAJJm9jZnMyX3hhdHRyX3VzZXJfaGFuZGxlciwKKyNpZmRlZiBDT05GSUdfT0NGUzJfRlNfUE9TSVhfQUNMCisJJm9jZnMyX3hhdHRyX2FjbF9hY2Nlc3NfaGFuZGxlciwKKwkmb2NmczJfeGF0dHJfYWNsX2RlZmF1bHRfaGFuZGxlciwKKyNlbmRpZgogCSZvY2ZzMl94YXR0cl90cnVzdGVkX2hhbmRsZXIsCisJJm9jZnMyX3hhdHRyX3NlY3VyaXR5X2hhbmRsZXIsCiAJTlVMTAogfTsKIAogc3RhdGljIHN0cnVjdCB4YXR0cl9oYW5kbGVyICpvY2ZzMl94YXR0cl9oYW5kbGVyX21hcFtPQ0ZTMl9YQVRUUl9NQVhdID0gewogCVtPQ0ZTMl9YQVRUUl9JTkRFWF9VU0VSXQk9ICZvY2ZzMl94YXR0cl91c2VyX2hhbmRsZXIsCisjaWZkZWYgQ09ORklHX09DRlMyX0ZTX1BPU0lYX0FDTAorCVtPQ0ZTMl9YQVRUUl9JTkRFWF9QT1NJWF9BQ0xfQUNDRVNTXQorCQkJCQk9ICZvY2ZzMl94YXR0cl9hY2xfYWNjZXNzX2hhbmRsZXIsCisJW09DRlMyX1hBVFRSX0lOREVYX1BPU0lYX0FDTF9ERUZBVUxUXQorCQkJCQk9ICZvY2ZzMl94YXR0cl9hY2xfZGVmYXVsdF9oYW5kbGVyLAorI2VuZGlmCiAJW09DRlMyX1hBVFRSX0lOREVYX1RSVVNURURdCT0gJm9jZnMyX3hhdHRyX3RydXN0ZWRfaGFuZGxlciwKKwlbT0NGUzJfWEFUVFJfSU5ERVhfU0VDVVJJVFldCT0gJm9jZnMyX3hhdHRyX3NlY3VyaXR5X2hhbmRsZXIsCiB9OwogCiBzdHJ1Y3Qgb2NmczJfeGF0dHJfaW5mbyB7CkBAIC05OCw3ICsxMzIsNyBAQAogCSAqLwogCXN0cnVjdCBidWZmZXJfaGVhZCAqeGF0dHJfYmg7CiAJc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqaGVhZGVyOwotCXN0cnVjdCBvY2ZzMl94YXR0cl9idWNrZXQgYnVja2V0OworCXN0cnVjdCBvY2ZzMl94YXR0cl9idWNrZXQgKmJ1Y2tldDsKIAl2b2lkICpiYXNlOwogCXZvaWQgKmVuZDsKIAlzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkgKmhlcmU7CkBAIC0xMjcsMTQgKzE2MSwyMCBAQAogCQkJCQlzaXplX3QgYnVmZmVyX3NpemUpOwogCiBzdGF0aWMgaW50IG9jZnMyX3hhdHRyX2NyZWF0ZV9pbmRleF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCQkgIHN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggKnhzKTsKKwkJCQkJICBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cywKKwkJCQkJICBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2V0X2N0eHQgKmN0eHQpOwogCiBzdGF0aWMgaW50IG9jZnMyX3hhdHRyX3NldF9lbnRyeV9pbmRleF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCQkgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9pbmZvICp4aSwKLQkJCQkJICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cyk7CisJCQkJCSAgICAgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMsCisJCQkJCSAgICAgc3RydWN0IG9jZnMyX3hhdHRyX3NldF9jdHh0ICpjdHh0KTsKIAogc3RhdGljIGludCBvY2ZzMl9kZWxldGVfeGF0dHJfaW5kZXhfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnhiX2JoKTsKK3N0YXRpYyBpbnQgb2NmczJfbXZfeGF0dHJfYnVja2V0cyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBoYW5kbGVfdCAqaGFuZGxlLAorCQkJCSAgdTY0IHNyY19ibGssIHU2NCBsYXN0X2JsaywgdTY0IHRvX2JsaywKKwkJCQkgIHVuc2lnbmVkIGludCBzdGFydF9idWNrZXQsCisJCQkJICB1MzIgKmZpcnN0X2hhc2gpOwogCiBzdGF0aWMgaW5saW5lIHUxNiBvY2ZzMl94YXR0cl9idWNrZXRzX3Blcl9jbHVzdGVyKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiKQogewpAQCAtMTU0LDYgKzE5NCwyMTYgQEAKIAlyZXR1cm4gbGVuIC8gc2l6ZW9mKHN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSk7CiB9CiAKKyNkZWZpbmUgYnVja2V0X2Jsa25vKF9iKSAoKF9iKS0+YnVfYmhzWzBdLT5iX2Jsb2NrbnIpCisjZGVmaW5lIGJ1Y2tldF9ibG9jayhfYiwgX24pICgoX2IpLT5idV9iaHNbKF9uKV0tPmJfZGF0YSkKKyNkZWZpbmUgYnVja2V0X3hoKF9iKSAoKHN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKilidWNrZXRfYmxvY2soKF9iKSwgMCkpCisKK3N0YXRpYyBzdHJ1Y3Qgb2NmczJfeGF0dHJfYnVja2V0ICpvY2ZzMl94YXR0cl9idWNrZXRfbmV3KHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IG9jZnMyX3hhdHRyX2J1Y2tldCAqYnVja2V0OworCWludCBibGtzID0gb2NmczJfYmxvY2tzX3Blcl94YXR0cl9idWNrZXQoaW5vZGUtPmlfc2IpOworCisJQlVHX09OKGJsa3MgPiBPQ0ZTMl9YQVRUUl9NQVhfQkxPQ0tTX1BFUl9CVUNLRVQpOworCisJYnVja2V0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG9jZnMyX3hhdHRyX2J1Y2tldCksIEdGUF9OT0ZTKTsKKwlpZiAoYnVja2V0KSB7CisJCWJ1Y2tldC0+YnVfaW5vZGUgPSBpbm9kZTsKKwkJYnVja2V0LT5idV9ibG9ja3MgPSBibGtzOworCX0KKworCXJldHVybiBidWNrZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG9jZnMyX3hhdHRyX2J1Y2tldF9yZWxzZShzdHJ1Y3Qgb2NmczJfeGF0dHJfYnVja2V0ICpidWNrZXQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYnVja2V0LT5idV9ibG9ja3M7IGkrKykgeworCQlicmVsc2UoYnVja2V0LT5idV9iaHNbaV0pOworCQlidWNrZXQtPmJ1X2Joc1tpXSA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgdm9pZCBvY2ZzMl94YXR0cl9idWNrZXRfZnJlZShzdHJ1Y3Qgb2NmczJfeGF0dHJfYnVja2V0ICpidWNrZXQpCit7CisJaWYgKGJ1Y2tldCkgeworCQlvY2ZzMl94YXR0cl9idWNrZXRfcmVsc2UoYnVja2V0KTsKKwkJYnVja2V0LT5idV9pbm9kZSA9IE5VTEw7CisJCWtmcmVlKGJ1Y2tldCk7CisJfQorfQorCisvKgorICogQSBidWNrZXQgdGhhdCBoYXMgbmV2ZXIgYmVlbiB3cml0dGVuIHRvIGRpc2sgZG9lc24ndCBuZWVkIHRvIGJlCisgKiByZWFkLiAgV2UganVzdCBuZWVkIHRoZSBidWZmZXJfaGVhZHMuICBEb24ndCBjYWxsIHRoaXMgZm9yCisgKiBidWNrZXRzIHRoYXQgYXJlIGFscmVhZHkgb24gZGlzay4gIG9jZnMyX3JlYWRfeGF0dHJfYnVja2V0KCkgaW5pdGlhbGl6ZXMKKyAqIHRoZW0gZnVsbHkuCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfaW5pdF94YXR0cl9idWNrZXQoc3RydWN0IG9jZnMyX3hhdHRyX2J1Y2tldCAqYnVja2V0LAorCQkJCSAgIHU2NCB4Yl9ibGtubykKK3sKKwlpbnQgaSwgcmMgPSAwOworCisJZm9yIChpID0gMDsgaSA8IGJ1Y2tldC0+YnVfYmxvY2tzOyBpKyspIHsKKwkJYnVja2V0LT5idV9iaHNbaV0gPSBzYl9nZXRibGsoYnVja2V0LT5idV9pbm9kZS0+aV9zYiwKKwkJCQkJICAgICAgeGJfYmxrbm8gKyBpKTsKKwkJaWYgKCFidWNrZXQtPmJ1X2Joc1tpXSkgeworCQkJcmMgPSAtRUlPOworCQkJbWxvZ19lcnJubyhyYyk7CisJCQlicmVhazsKKwkJfQorCisJCWlmICghb2NmczJfYnVmZmVyX3VwdG9kYXRlKGJ1Y2tldC0+YnVfaW5vZGUsCisJCQkJCSAgIGJ1Y2tldC0+YnVfYmhzW2ldKSkKKwkJCW9jZnMyX3NldF9uZXdfYnVmZmVyX3VwdG9kYXRlKGJ1Y2tldC0+YnVfaW5vZGUsCisJCQkJCQkgICAgICBidWNrZXQtPmJ1X2Joc1tpXSk7CisJfQorCisJaWYgKHJjKQorCQlvY2ZzMl94YXR0cl9idWNrZXRfcmVsc2UoYnVja2V0KTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qIFJlYWQgdGhlIHhhdHRyIGJ1Y2tldCBhdCB4Yl9ibGtubyAqLworc3RhdGljIGludCBvY2ZzMl9yZWFkX3hhdHRyX2J1Y2tldChzdHJ1Y3Qgb2NmczJfeGF0dHJfYnVja2V0ICpidWNrZXQsCisJCQkJICAgdTY0IHhiX2Jsa25vKQoreworCWludCByYzsKKworCXJjID0gb2NmczJfcmVhZF9ibG9ja3MoYnVja2V0LT5idV9pbm9kZSwgeGJfYmxrbm8sCisJCQkgICAgICAgYnVja2V0LT5idV9ibG9ja3MsIGJ1Y2tldC0+YnVfYmhzLCAwLAorCQkJICAgICAgIE5VTEwpOworCWlmICghcmMpIHsKKwkJcmMgPSBvY2ZzMl92YWxpZGF0ZV9tZXRhX2VjY19iaHMoYnVja2V0LT5idV9pbm9kZS0+aV9zYiwKKwkJCQkJCSBidWNrZXQtPmJ1X2JocywKKwkJCQkJCSBidWNrZXQtPmJ1X2Jsb2NrcywKKwkJCQkJCSAmYnVja2V0X3hoKGJ1Y2tldCktPnhoX2NoZWNrKTsKKwkJaWYgKHJjKQorCQkJbWxvZ19lcnJubyhyYyk7CisJfQorCisJaWYgKHJjKQorCQlvY2ZzMl94YXR0cl9idWNrZXRfcmVsc2UoYnVja2V0KTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfYnVja2V0X2pvdXJuYWxfYWNjZXNzKGhhbmRsZV90ICpoYW5kbGUsCisJCQkJCSAgICAgc3RydWN0IG9jZnMyX3hhdHRyX2J1Y2tldCAqYnVja2V0LAorCQkJCQkgICAgIGludCB0eXBlKQoreworCWludCBpLCByYyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgYnVja2V0LT5idV9ibG9ja3M7IGkrKykgeworCQlyYyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgYnVja2V0LT5idV9pbm9kZSwKKwkJCQkJICBidWNrZXQtPmJ1X2Joc1tpXSwgdHlwZSk7CisJCWlmIChyYykgeworCQkJbWxvZ19lcnJubyhyYyk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgb2NmczJfeGF0dHJfYnVja2V0X2pvdXJuYWxfZGlydHkoaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQkJICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfYnVja2V0ICpidWNrZXQpCit7CisJaW50IGk7CisKKwlvY2ZzMl9jb21wdXRlX21ldGFfZWNjX2JocyhidWNrZXQtPmJ1X2lub2RlLT5pX3NiLAorCQkJCSAgIGJ1Y2tldC0+YnVfYmhzLCBidWNrZXQtPmJ1X2Jsb2NrcywKKwkJCQkgICAmYnVja2V0X3hoKGJ1Y2tldCktPnhoX2NoZWNrKTsKKworCWZvciAoaSA9IDA7IGkgPCBidWNrZXQtPmJ1X2Jsb2NrczsgaSsrKQorCQlvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgYnVja2V0LT5idV9iaHNbaV0pOworfQorCitzdGF0aWMgdm9pZCBvY2ZzMl94YXR0cl9idWNrZXRfY29weV9kYXRhKHN0cnVjdCBvY2ZzMl94YXR0cl9idWNrZXQgKmRlc3QsCisJCQkJCSBzdHJ1Y3Qgb2NmczJfeGF0dHJfYnVja2V0ICpzcmMpCit7CisJaW50IGk7CisJaW50IGJsb2Nrc2l6ZSA9IHNyYy0+YnVfaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworCisJQlVHX09OKGRlc3QtPmJ1X2Jsb2NrcyAhPSBzcmMtPmJ1X2Jsb2Nrcyk7CisJQlVHX09OKGRlc3QtPmJ1X2lub2RlICE9IHNyYy0+YnVfaW5vZGUpOworCisJZm9yIChpID0gMDsgaSA8IHNyYy0+YnVfYmxvY2tzOyBpKyspIHsKKwkJbWVtY3B5KGJ1Y2tldF9ibG9jayhkZXN0LCBpKSwgYnVja2V0X2Jsb2NrKHNyYywgaSksCisJCSAgICAgICBibG9ja3NpemUpOworCX0KK30KKworc3RhdGljIGludCBvY2ZzMl92YWxpZGF0ZV94YXR0cl9ibG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJaW50IHJjOworCXN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqeGIgPQorCQkoc3RydWN0IG9jZnMyX3hhdHRyX2Jsb2NrICopYmgtPmJfZGF0YTsKKworCW1sb2coMCwgIlZhbGlkYXRpbmcgeGF0dHIgYmxvY2sgJWxsdVxuIiwKKwkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tucik7CisKKwlCVUdfT04oIWJ1ZmZlcl91cHRvZGF0ZShiaCkpOworCisJLyoKKwkgKiBJZiB0aGUgZWNjIGZhaWxzLCB3ZSByZXR1cm4gdGhlIGVycm9yIGJ1dCBvdGhlcndpc2UKKwkgKiBsZWF2ZSB0aGUgZmlsZXN5c3RlbSBydW5uaW5nLiAgV2Uga25vdyBhbnkgZXJyb3IgaXMKKwkgKiBsb2NhbCB0byB0aGlzIGJsb2NrLgorCSAqLworCXJjID0gb2NmczJfdmFsaWRhdGVfbWV0YV9lY2Moc2IsIGJoLT5iX2RhdGEsICZ4Yi0+eGJfY2hlY2spOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJLyoKKwkgKiBFcnJvcnMgYWZ0ZXIgaGVyZSBhcmUgZmF0YWwKKwkgKi8KKworCWlmICghT0NGUzJfSVNfVkFMSURfWEFUVFJfQkxPQ0soeGIpKSB7CisJCW9jZnMyX2Vycm9yKHNiLAorCQkJICAgICJFeHRlbmRlZCBhdHRyaWJ1dGUgYmxvY2sgIyVsbHUgaGFzIGJhZCAiCisJCQkgICAgInNpZ25hdHVyZSAlLipzIiwKKwkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIsIDcsCisJCQkgICAgeGItPnhiX3NpZ25hdHVyZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChsZTY0X3RvX2NwdSh4Yi0+eGJfYmxrbm8pICE9IGJoLT5iX2Jsb2NrbnIpIHsKKwkJb2NmczJfZXJyb3Ioc2IsCisJCQkgICAgIkV4dGVuZGVkIGF0dHJpYnV0ZSBibG9jayAjJWxsdSBoYXMgYW4gIgorCQkJICAgICJpbnZhbGlkIHhiX2Jsa25vIG9mICVsbHUiLAorCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tuciwKKwkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KHhiLT54Yl9ibGtubykpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobGUzMl90b19jcHUoeGItPnhiX2ZzX2dlbmVyYXRpb24pICE9IE9DRlMyX1NCKHNiKS0+ZnNfZ2VuZXJhdGlvbikgeworCQlvY2ZzMl9lcnJvcihzYiwKKwkJCSAgICAiRXh0ZW5kZWQgYXR0cmlidXRlIGJsb2NrICMlbGx1IGhhcyBhbiBpbnZhbGlkICIKKwkJCSAgICAieGJfZnNfZ2VuZXJhdGlvbiBvZiAjJXUiLAorCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tuciwKKwkJCSAgICBsZTMyX3RvX2NwdSh4Yi0+eGJfZnNfZ2VuZXJhdGlvbikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvY2ZzMl9yZWFkX3hhdHRyX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCB4Yl9ibGtubywKKwkJCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJoKQoreworCWludCByYzsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRtcCA9ICpiaDsKKworCXJjID0gb2NmczJfcmVhZF9ibG9jayhpbm9kZSwgeGJfYmxrbm8sICZ0bXAsCisJCQkgICAgICBvY2ZzMl92YWxpZGF0ZV94YXR0cl9ibG9jayk7CisKKwkvKiBJZiBvY2ZzMl9yZWFkX2Jsb2NrKCkgZ290IHVzIGEgbmV3IGJoLCBwYXNzIGl0IHVwLiAqLworCWlmICghcmMgJiYgISpiaCkKKwkJKmJoID0gdG1wOworCisJcmV0dXJuIHJjOworfQorCiBzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKm9jZnMyX3hhdHRyX3ByZWZpeChpbnQgbmFtZV9pbmRleCkKIHsKIAlzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqaGFuZGxlciA9IE5VTEw7CkBAIC0yMDAsNTQgKzQ1MCwxNjMgQEAKIAlyZXR1cm47CiB9CiAKK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfZW50cnlfcmVhbF9zaXplKGludCBuYW1lX2xlbiwgc2l6ZV90IHZhbHVlX2xlbikKK3sKKwlpbnQgc2l6ZSA9IDA7CisKKwlpZiAodmFsdWVfbGVuIDw9IE9DRlMyX1hBVFRSX0lOTElORV9TSVpFKQorCQlzaXplID0gT0NGUzJfWEFUVFJfU0laRShuYW1lX2xlbikgKyBPQ0ZTMl9YQVRUUl9TSVpFKHZhbHVlX2xlbik7CisJZWxzZQorCQlzaXplID0gT0NGUzJfWEFUVFJfU0laRShuYW1lX2xlbikgKyBPQ0ZTMl9YQVRUUl9ST09UX1NJWkU7CisJc2l6ZSArPSBzaXplb2Yoc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5KTsKKworCXJldHVybiBzaXplOworfQorCitpbnQgb2NmczJfY2FsY19zZWN1cml0eV9pbml0KHN0cnVjdCBpbm9kZSAqZGlyLAorCQkJICAgICBzdHJ1Y3Qgb2NmczJfc2VjdXJpdHlfeGF0dHJfaW5mbyAqc2ksCisJCQkgICAgIGludCAqd2FudF9jbHVzdGVycywKKwkJCSAgICAgaW50ICp4YXR0cl9jcmVkaXRzLAorCQkJICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqKnhhdHRyX2FjKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoZGlyLT5pX3NiKTsKKwlpbnQgc19zaXplID0gb2NmczJfeGF0dHJfZW50cnlfcmVhbF9zaXplKHN0cmxlbihzaS0+bmFtZSksCisJCQkJCQkgc2ktPnZhbHVlX2xlbik7CisKKwkvKgorCSAqIFRoZSBtYXggc3BhY2Ugb2Ygc2VjdXJpdHkgeGF0dHIgdGFrZW4gaW5saW5lIGlzCisJICogMjU2KG5hbWUpICsgODAodmFsdWUpICsgMTYoZW50cnkpID0gMzUyIGJ5dGVzLAorCSAqIFNvIHJlc2VydmUgb25lIG1ldGFkYXRhIGJsb2NrIGZvciBpdCBpcyBvay4KKwkgKi8KKwlpZiAoZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSA9PSBPQ0ZTMl9NSU5fQkxPQ0tTSVpFIHx8CisJICAgIHNfc2l6ZSA+IE9DRlMyX1hBVFRSX0ZSRUVfSU5fSUJPRFkpIHsKKwkJcmV0ID0gb2NmczJfcmVzZXJ2ZV9uZXdfbWV0YWRhdGFfYmxvY2tzKG9zYiwgMSwgeGF0dHJfYWMpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCSp4YXR0cl9jcmVkaXRzICs9IE9DRlMyX1hBVFRSX0JMT0NLX0NSRUFURV9DUkVESVRTOworCX0KKworCS8qIHJlc2VydmUgY2x1c3RlcnMgZm9yIHhhdHRyIHZhbHVlIHdoaWNoIHdpbGwgYmUgc2V0IGluIEIgdHJlZSovCisJaWYgKHNpLT52YWx1ZV9sZW4gPiBPQ0ZTMl9YQVRUUl9JTkxJTkVfU0laRSkgeworCQlpbnQgbmV3X2NsdXN0ZXJzID0gb2NmczJfY2x1c3RlcnNfZm9yX2J5dGVzKGRpci0+aV9zYiwKKwkJCQkJCQkgICAgc2ktPnZhbHVlX2xlbik7CisKKwkJKnhhdHRyX2NyZWRpdHMgKz0gb2NmczJfY2x1c3RlcnNfdG9fYmxvY2tzKGRpci0+aV9zYiwKKwkJCQkJCQkgICBuZXdfY2x1c3RlcnMpOworCQkqd2FudF9jbHVzdGVycyArPSBuZXdfY2x1c3RlcnM7CisJfQorCXJldHVybiByZXQ7Cit9CisKK2ludCBvY2ZzMl9jYWxjX3hhdHRyX2luaXQoc3RydWN0IGlub2RlICpkaXIsCisJCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlyX2JoLAorCQkJICBpbnQgbW9kZSwKKwkJCSAgc3RydWN0IG9jZnMyX3NlY3VyaXR5X3hhdHRyX2luZm8gKnNpLAorCQkJICBpbnQgKndhbnRfY2x1c3RlcnMsCisJCQkgIGludCAqeGF0dHJfY3JlZGl0cywKKwkJCSAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKip4YXR0cl9hYykKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGRpci0+aV9zYik7CisJaW50IHNfc2l6ZSA9IDAsIGFfc2l6ZSA9IDAsIGFjbF9sZW4gPSAwLCBuZXdfY2x1c3RlcnM7CisKKwlpZiAoc2ktPmVuYWJsZSkKKwkJc19zaXplID0gb2NmczJfeGF0dHJfZW50cnlfcmVhbF9zaXplKHN0cmxlbihzaS0+bmFtZSksCisJCQkJCQkgICAgIHNpLT52YWx1ZV9sZW4pOworCisJaWYgKG9zYi0+c19tb3VudF9vcHQgJiBPQ0ZTMl9NT1VOVF9QT1NJWF9BQ0wpIHsKKwkJYWNsX2xlbiA9IG9jZnMyX3hhdHRyX2dldF9ub2xvY2soZGlyLCBkaXJfYmgsCisJCQkJCU9DRlMyX1hBVFRSX0lOREVYX1BPU0lYX0FDTF9ERUZBVUxULAorCQkJCQkiIiwgTlVMTCwgMCk7CisJCWlmIChhY2xfbGVuID4gMCkgeworCQkJYV9zaXplID0gb2NmczJfeGF0dHJfZW50cnlfcmVhbF9zaXplKDAsIGFjbF9sZW4pOworCQkJaWYgKFNfSVNESVIobW9kZSkpCisJCQkJYV9zaXplIDw8PSAxOworCQl9IGVsc2UgaWYgKGFjbF9sZW4gIT0gMCAmJiBhY2xfbGVuICE9IC1FTk9EQVRBKSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJaWYgKCEoc19zaXplICsgYV9zaXplKSkKKwkJcmV0dXJuIHJldDsKKworCS8qCisJICogVGhlIG1heCBzcGFjZSBvZiBzZWN1cml0eSB4YXR0ciB0YWtlbiBpbmxpbmUgaXMKKwkgKiAyNTYobmFtZSkgKyA4MCh2YWx1ZSkgKyAxNihlbnRyeSkgPSAzNTIgYnl0ZXMsCisJICogVGhlIG1heCBzcGFjZSBvZiBhY2wgeGF0dHIgdGFrZW4gaW5saW5lIGlzCisJICogODAodmFsdWUpICsgMTYoZW50cnkpICogMihpZiBkaXJlY3RvcnkpID0gMTkyIGJ5dGVzLAorCSAqIHdoZW4gYmxvY2tzaXplID0gNTEyLCBtYXkgcmVzZXJ2ZSBvbmUgbW9yZSBjbHVzZXIgZm9yCisJICogeGF0dHIgYnVja2V0LCBvdGhlcndpc2UgcmVzZXJ2ZSBvbmUgbWV0YWRhdGEgYmxvY2sKKwkgKiBmb3IgdGhlbSBpcyBvay4KKwkgKi8KKwlpZiAoZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSA9PSBPQ0ZTMl9NSU5fQkxPQ0tTSVpFIHx8CisJICAgIChzX3NpemUgKyBhX3NpemUpID4gT0NGUzJfWEFUVFJfRlJFRV9JTl9JQk9EWSkgeworCQlyZXQgPSBvY2ZzMl9yZXNlcnZlX25ld19tZXRhZGF0YV9ibG9ja3Mob3NiLCAxLCB4YXR0cl9hYyk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJKnhhdHRyX2NyZWRpdHMgKz0gT0NGUzJfWEFUVFJfQkxPQ0tfQ1JFQVRFX0NSRURJVFM7CisJfQorCisJaWYgKGRpci0+aV9zYi0+c19ibG9ja3NpemUgPT0gT0NGUzJfTUlOX0JMT0NLU0laRSAmJgorCSAgICAoc19zaXplICsgYV9zaXplKSA+IE9DRlMyX1hBVFRSX0ZSRUVfSU5fQkxPQ0soZGlyKSkgeworCQkqd2FudF9jbHVzdGVycyArPSAxOworCQkqeGF0dHJfY3JlZGl0cyArPSBvY2ZzMl9ibG9ja3NfcGVyX3hhdHRyX2J1Y2tldChkaXItPmlfc2IpOworCX0KKworCS8qCisJICogcmVzZXJ2ZSBjcmVkaXRzIGFuZCBjbHVzdGVycyBmb3IgeGF0dHJzIHdoaWNoIGhhcyBsYXJnZSB2YWx1ZQorCSAqIGFuZCBoYXZlIHRvIGJlIHNldCBvdXRzaWRlCisJICovCisJaWYgKHNpLT5lbmFibGUgJiYgc2ktPnZhbHVlX2xlbiA+IE9DRlMyX1hBVFRSX0lOTElORV9TSVpFKSB7CisJCW5ld19jbHVzdGVycyA9IG9jZnMyX2NsdXN0ZXJzX2Zvcl9ieXRlcyhkaXItPmlfc2IsCisJCQkJCQkJc2ktPnZhbHVlX2xlbik7CisJCSp4YXR0cl9jcmVkaXRzICs9IG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2NrcyhkaXItPmlfc2IsCisJCQkJCQkJICAgbmV3X2NsdXN0ZXJzKTsKKwkJKndhbnRfY2x1c3RlcnMgKz0gbmV3X2NsdXN0ZXJzOworCX0KKwlpZiAob3NiLT5zX21vdW50X29wdCAmIE9DRlMyX01PVU5UX1BPU0lYX0FDTCAmJgorCSAgICBhY2xfbGVuID4gT0NGUzJfWEFUVFJfSU5MSU5FX1NJWkUpIHsKKwkJLyogZm9yIGRpcmVjdG9yeSwgaXQgaGFzIERFRkFVTFQgYW5kIEFDQ0VTUyB0d28gdHlwZXMgb2YgYWNscyAqLworCQluZXdfY2x1c3RlcnMgPSAoU19JU0RJUihtb2RlKSA/IDIgOiAxKSAqCisJCQkJb2NmczJfY2x1c3RlcnNfZm9yX2J5dGVzKGRpci0+aV9zYiwgYWNsX2xlbik7CisJCSp4YXR0cl9jcmVkaXRzICs9IG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2NrcyhkaXItPmlfc2IsCisJCQkJCQkJICAgbmV3X2NsdXN0ZXJzKTsKKwkJKndhbnRfY2x1c3RlcnMgKz0gbmV3X2NsdXN0ZXJzOworCX0KKworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBpbnQgb2NmczJfeGF0dHJfZXh0ZW5kX2FsbG9jYXRpb24oc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkJIHUzMiBjbHVzdGVyc190b19hZGQsCi0JCQkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnhhdHRyX2JoLAotCQkJCQkgc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX3Jvb3QgKnh2KQorCQkJCQkgc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX2J1ZiAqdmIsCisJCQkJCSBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2V0X2N0eHQgKmN0eHQpCiB7CiAJaW50IHN0YXR1cyA9IDA7Ci0JaW50IHJlc3RhcnRfZnVuYyA9IDA7Ci0JaW50IGNyZWRpdHMgPSAwOwotCWhhbmRsZV90ICpoYW5kbGUgPSBOVUxMOwotCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICpkYXRhX2FjID0gTlVMTDsKLQlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYyA9IE5VTEw7CisJaGFuZGxlX3QgKmhhbmRsZSA9IGN0eHQtPmhhbmRsZTsKIAllbnVtIG9jZnMyX2FsbG9jX3Jlc3RhcnRlZCB3aHk7CiAJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7Ci0JdTMyIHByZXZfY2x1c3RlcnMsIGxvZ2ljYWxfc3RhcnQgPSBsZTMyX3RvX2NwdSh4di0+eHJfY2x1c3RlcnMpOworCXUzMiBwcmV2X2NsdXN0ZXJzLCBsb2dpY2FsX3N0YXJ0ID0gbGUzMl90b19jcHUodmItPnZiX3h2LT54cl9jbHVzdGVycyk7CiAJc3RydWN0IG9jZnMyX2V4dGVudF90cmVlIGV0OwogCiAJbWxvZygwLCAiKGNsdXN0ZXJzX3RvX2FkZCBmb3IgeGF0dHI9ICV1KVxuIiwgY2x1c3RlcnNfdG9fYWRkKTsKIAotCW9jZnMyX2luaXRfeGF0dHJfdmFsdWVfZXh0ZW50X3RyZWUoJmV0LCBpbm9kZSwgeGF0dHJfYmgsIHh2KTsKKwlvY2ZzMl9pbml0X3hhdHRyX3ZhbHVlX2V4dGVudF90cmVlKCZldCwgaW5vZGUsIHZiKTsKIAotcmVzdGFydF9hbGw6Ci0KLQlzdGF0dXMgPSBvY2ZzMl9sb2NrX2FsbG9jYXRvcnMoaW5vZGUsICZldCwgY2x1c3RlcnNfdG9fYWRkLCAwLAotCQkJCSAgICAgICAmZGF0YV9hYywgJm1ldGFfYWMpOwotCWlmIChzdGF0dXMpIHsKLQkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQlnb3RvIGxlYXZlOwotCX0KLQotCWNyZWRpdHMgPSBvY2ZzMl9jYWxjX2V4dGVuZF9jcmVkaXRzKG9zYi0+c2IsIGV0LmV0X3Jvb3RfZWwsCi0JCQkJCSAgICBjbHVzdGVyc190b19hZGQpOwotCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgY3JlZGl0cyk7Ci0JaWYgKElTX0VSUihoYW5kbGUpKSB7Ci0JCXN0YXR1cyA9IFBUUl9FUlIoaGFuZGxlKTsKLQkJaGFuZGxlID0gTlVMTDsKLQkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQlnb3RvIGxlYXZlOwotCX0KLQotcmVzdGFydGVkX3RyYW5zYWN0aW9uOgotCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHhhdHRyX2JoLAotCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlzdGF0dXMgPSB2Yi0+dmJfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHZiLT52Yl9iaCwKKwkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gbGVhdmU7CiAJfQogCi0JcHJldl9jbHVzdGVycyA9IGxlMzJfdG9fY3B1KHh2LT54cl9jbHVzdGVycyk7CisJcHJldl9jbHVzdGVycyA9IGxlMzJfdG9fY3B1KHZiLT52Yl94di0+eHJfY2x1c3RlcnMpOwogCXN0YXR1cyA9IG9jZnMyX2FkZF9jbHVzdGVyc19pbl9idHJlZShvc2IsCiAJCQkJCSAgICAgaW5vZGUsCiAJCQkJCSAgICAgJmxvZ2ljYWxfc3RhcnQsCkBAIC0yNTUsMTU3ICs2MTQsODQgQEAKIAkJCQkJICAgICAwLAogCQkJCQkgICAgICZldCwKIAkJCQkJICAgICBoYW5kbGUsCi0JCQkJCSAgICAgZGF0YV9hYywKLQkJCQkJICAgICBtZXRhX2FjLAorCQkJCQkgICAgIGN0eHQtPmRhdGFfYWMsCisJCQkJCSAgICAgY3R4dC0+bWV0YV9hYywKIAkJCQkJICAgICAmd2h5KTsKLQlpZiAoKHN0YXR1cyA8IDApICYmIChzdGF0dXMgIT0gLUVBR0FJTikpIHsKLQkJaWYgKHN0YXR1cyAhPSAtRU5PU1BDKQotCQkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQlnb3RvIGxlYXZlOwotCX0KLQotCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCB4YXR0cl9iaCk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGxlYXZlOwogCX0KIAotCWNsdXN0ZXJzX3RvX2FkZCAtPSBsZTMyX3RvX2NwdSh4di0+eHJfY2x1c3RlcnMpIC0gcHJldl9jbHVzdGVyczsKLQotCWlmICh3aHkgIT0gUkVTVEFSVF9OT05FICYmIGNsdXN0ZXJzX3RvX2FkZCkgewotCQlpZiAod2h5ID09IFJFU1RBUlRfTUVUQSkgewotCQkJbWxvZygwLCAicmVzdGFydGluZyBmdW5jdGlvbi5cbiIpOwotCQkJcmVzdGFydF9mdW5jID0gMTsKLQkJfSBlbHNlIHsKLQkJCUJVR19PTih3aHkgIT0gUkVTVEFSVF9UUkFOUyk7Ci0KLQkJCW1sb2coMCwgInJlc3RhcnRpbmcgdHJhbnNhY3Rpb24uXG4iKTsKLQkJCS8qIFRPRE86IFRoaXMgY2FuIGJlIG1vcmUgaW50ZWxsaWdlbnQuICovCi0JCQljcmVkaXRzID0gb2NmczJfY2FsY19leHRlbmRfY3JlZGl0cyhvc2ItPnNiLAotCQkJCQkJCSAgICBldC5ldF9yb290X2VsLAotCQkJCQkJCSAgICBjbHVzdGVyc190b19hZGQpOwotCQkJc3RhdHVzID0gb2NmczJfZXh0ZW5kX3RyYW5zKGhhbmRsZSwgY3JlZGl0cyk7Ci0JCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJCS8qIGhhbmRsZSBzdGlsbCBoYXMgdG8gYmUgY29tbWl0dGVkIGF0Ci0JCQkJICogdGhpcyBwb2ludC4gKi8KLQkJCQlzdGF0dXMgPSAtRU5PTUVNOwotCQkJCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJCQlnb3RvIGxlYXZlOwotCQkJfQotCQkJZ290byByZXN0YXJ0ZWRfdHJhbnNhY3Rpb247Ci0JCX0KKwlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgdmItPnZiX2JoKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCWdvdG8gbGVhdmU7CiAJfQogCisJY2x1c3RlcnNfdG9fYWRkIC09IGxlMzJfdG9fY3B1KHZiLT52Yl94di0+eHJfY2x1c3RlcnMpIC0gcHJldl9jbHVzdGVyczsKKworCS8qCisJICogV2Ugc2hvdWxkIGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgZW5vdWdoIHNwYWNlIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24sCisJICogc28gbm8gbmVlZCB0byByZXN0YXJ0LgorCSAqLworCUJVR19PTih3aHkgIT0gUkVTVEFSVF9OT05FIHx8IGNsdXN0ZXJzX3RvX2FkZCk7CisKIGxlYXZlOgotCWlmIChoYW5kbGUpIHsKLQkJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKLQkJaGFuZGxlID0gTlVMTDsKLQl9Ci0JaWYgKGRhdGFfYWMpIHsKLQkJb2NmczJfZnJlZV9hbGxvY19jb250ZXh0KGRhdGFfYWMpOwotCQlkYXRhX2FjID0gTlVMTDsKLQl9Ci0JaWYgKG1ldGFfYWMpIHsKLQkJb2NmczJfZnJlZV9hbGxvY19jb250ZXh0KG1ldGFfYWMpOwotCQltZXRhX2FjID0gTlVMTDsKLQl9Ci0JaWYgKCghc3RhdHVzKSAmJiByZXN0YXJ0X2Z1bmMpIHsKLQkJcmVzdGFydF9mdW5jID0gMDsKLQkJZ290byByZXN0YXJ0X2FsbDsKLQl9CiAKIAlyZXR1cm4gc3RhdHVzOwogfQogCiBzdGF0aWMgaW50IF9fb2NmczJfcmVtb3ZlX3hhdHRyX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpyb290X2JoLAotCQkJCSAgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9yb290ICp4diwKKwkJCQkgICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfYnVmICp2YiwKIAkJCQkgICAgICB1MzIgY3BvcywgdTMyIHBoeXNfY3BvcywgdTMyIGxlbiwKLQkJCQkgICAgICBzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqZGVhbGxvYykKKwkJCQkgICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2V0X2N0eHQgKmN0eHQpCiB7CiAJaW50IHJldDsKIAl1NjQgcGh5c19ibGtubyA9IG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgcGh5c19jcG9zKTsKLQlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKLQlzdHJ1Y3QgaW5vZGUgKnRsX2lub2RlID0gb3NiLT5vc2JfdGxfaW5vZGU7Ci0JaGFuZGxlX3QgKmhhbmRsZTsKLQlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYyA9IE5VTEw7CisJaGFuZGxlX3QgKmhhbmRsZSA9IGN0eHQtPmhhbmRsZTsKIAlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgZXQ7CiAKLQlvY2ZzMl9pbml0X3hhdHRyX3ZhbHVlX2V4dGVudF90cmVlKCZldCwgaW5vZGUsIHJvb3RfYmgsIHh2KTsKKwlvY2ZzMl9pbml0X3hhdHRyX3ZhbHVlX2V4dGVudF90cmVlKCZldCwgaW5vZGUsIHZiKTsKIAotCXJldCA9IG9jZnMyX2xvY2tfYWxsb2NhdG9ycyhpbm9kZSwgJmV0LCAwLCAxLCBOVUxMLCAmbWV0YV9hYyk7CisJcmV0ID0gdmItPnZiX2FjY2VzcyhoYW5kbGUsIGlub2RlLCB2Yi0+dmJfYmgsCisJCQkgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCW11dGV4X2xvY2soJnRsX2lub2RlLT5pX211dGV4KTsKLQotCWlmIChvY2ZzMl90cnVuY2F0ZV9sb2dfbmVlZHNfZmx1c2gob3NiKSkgewotCQlyZXQgPSBfX29jZnMyX2ZsdXNoX3RydW5jYXRlX2xvZyhvc2IpOwotCQlpZiAocmV0IDwgMCkgewotCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0KLQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX1JFTU9WRV9FWFRFTlRfQ1JFRElUUyk7Ci0JaWYgKElTX0VSUihoYW5kbGUpKSB7Ci0JCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKLQkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dDsKIAl9CiAKLQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCByb290X2JoLAotCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlyZXQgPSBvY2ZzMl9yZW1vdmVfZXh0ZW50KGlub2RlLCAmZXQsIGNwb3MsIGxlbiwgaGFuZGxlLCBjdHh0LT5tZXRhX2FjLAorCQkJCSAgJmN0eHQtPmRlYWxsb2MpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dF9jb21taXQ7CisJCWdvdG8gb3V0OwogCX0KIAotCXJldCA9IG9jZnMyX3JlbW92ZV9leHRlbnQoaW5vZGUsICZldCwgY3BvcywgbGVuLCBoYW5kbGUsIG1ldGFfYWMsCi0JCQkJICBkZWFsbG9jKTsKKwlsZTMyX2FkZF9jcHUoJnZiLT52Yl94di0+eHJfY2x1c3RlcnMsIC1sZW4pOworCisJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHZiLT52Yl9iaCk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0X2NvbW1pdDsKKwkJZ290byBvdXQ7CiAJfQogCi0JbGUzMl9hZGRfY3B1KCZ4di0+eHJfY2x1c3RlcnMsIC1sZW4pOwotCi0JcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHJvb3RfYmgpOwotCWlmIChyZXQpIHsKLQkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dF9jb21taXQ7Ci0JfQotCi0JcmV0ID0gb2NmczJfdHJ1bmNhdGVfbG9nX2FwcGVuZChvc2IsIGhhbmRsZSwgcGh5c19ibGtubywgbGVuKTsKKwlyZXQgPSBvY2ZzMl9jYWNoZV9jbHVzdGVyX2RlYWxsb2MoJmN0eHQtPmRlYWxsb2MsIHBoeXNfYmxrbm8sIGxlbik7CiAJaWYgKHJldCkKIAkJbWxvZ19lcnJubyhyZXQpOwogCi1vdXRfY29tbWl0OgotCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CiBvdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZ0bF9pbm9kZS0+aV9tdXRleCk7Ci0KLQlpZiAobWV0YV9hYykKLQkJb2NmczJfZnJlZV9hbGxvY19jb250ZXh0KG1ldGFfYWMpOwotCiAJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBvY2ZzMl94YXR0cl9zaHJpbmtfc2l6ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCSAgIHUzMiBvbGRfY2x1c3RlcnMsCiAJCQkJICAgdTMyIG5ld19jbHVzdGVycywKLQkJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnJvb3RfYmgsCi0JCQkJICAgc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX3Jvb3QgKnh2KQorCQkJCSAgIHN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9idWYgKnZiLAorCQkJCSAgIHN0cnVjdCBvY2ZzMl94YXR0cl9zZXRfY3R4dCAqY3R4dCkKIHsKIAlpbnQgcmV0ID0gMDsKIAl1MzIgdHJ1bmNfbGVuLCBjcG9zLCBwaHlzX2Nwb3MsIGFsbG9jX3NpemU7CiAJdTY0IGJsb2NrOwotCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOwotCXN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0IGRlYWxsb2M7Ci0KLQlvY2ZzMl9pbml0X2RlYWxsb2NfY3R4dCgmZGVhbGxvYyk7CiAKIAlpZiAob2xkX2NsdXN0ZXJzIDw9IG5ld19jbHVzdGVycykKIAkJcmV0dXJuIDA7CkBAIC00MTQsNyArNzAwLDggQEAKIAl0cnVuY19sZW4gPSBvbGRfY2x1c3RlcnMgLSBuZXdfY2x1c3RlcnM7CiAJd2hpbGUgKHRydW5jX2xlbikgewogCQlyZXQgPSBvY2ZzMl94YXR0cl9nZXRfY2x1c3RlcnMoaW5vZGUsIGNwb3MsICZwaHlzX2Nwb3MsCi0JCQkJCSAgICAgICAmYWxsb2Nfc2l6ZSwgJnh2LT54cl9saXN0KTsKKwkJCQkJICAgICAgICZhbGxvY19zaXplLAorCQkJCQkgICAgICAgJnZiLT52Yl94di0+eHJfbGlzdCk7CiAJCWlmIChyZXQpIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCWdvdG8gb3V0OwpAQCAtNDIzLDkgKzcxMCw5IEBACiAJCWlmIChhbGxvY19zaXplID4gdHJ1bmNfbGVuKQogCQkJYWxsb2Nfc2l6ZSA9IHRydW5jX2xlbjsKIAotCQlyZXQgPSBfX29jZnMyX3JlbW92ZV94YXR0cl9yYW5nZShpbm9kZSwgcm9vdF9iaCwgeHYsIGNwb3MsCisJCXJldCA9IF9fb2NmczJfcmVtb3ZlX3hhdHRyX3JhbmdlKGlub2RlLCB2YiwgY3BvcywKIAkJCQkJCSBwaHlzX2Nwb3MsIGFsbG9jX3NpemUsCi0JCQkJCQkgJmRlYWxsb2MpOworCQkJCQkJIGN0eHQpOwogCQlpZiAocmV0KSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlnb3RvIG91dDsKQEAgLTQzOSwyMCArNzI2LDE3IEBACiAJfQogCiBvdXQ6Ci0Jb2NmczJfc2NoZWR1bGVfdHJ1bmNhdGVfbG9nX2ZsdXNoKG9zYiwgMSk7Ci0Jb2NmczJfcnVuX2RlYWxsb2NzKG9zYiwgJmRlYWxsb2MpOwotCiAJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBvY2ZzMl94YXR0cl92YWx1ZV90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqcm9vdF9iaCwKLQkJCQkgICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCAqeHYsCi0JCQkJICAgICAgaW50IGxlbikKKwkJCQkgICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfYnVmICp2YiwKKwkJCQkgICAgICBpbnQgbGVuLAorCQkJCSAgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9zZXRfY3R4dCAqY3R4dCkKIHsKIAlpbnQgcmV0OwogCXUzMiBuZXdfY2x1c3RlcnMgPSBvY2ZzMl9jbHVzdGVyc19mb3JfYnl0ZXMoaW5vZGUtPmlfc2IsIGxlbik7Ci0JdTMyIG9sZF9jbHVzdGVycyA9IGxlMzJfdG9fY3B1KHh2LT54cl9jbHVzdGVycyk7CisJdTMyIG9sZF9jbHVzdGVycyA9IGxlMzJfdG9fY3B1KHZiLT52Yl94di0+eHJfY2x1c3RlcnMpOwogCiAJaWYgKG5ld19jbHVzdGVycyA9PSBvbGRfY2x1c3RlcnMpCiAJCXJldHVybiAwOwpAQCAtNDYwLDExICs3NDQsMTEgQEAKIAlpZiAobmV3X2NsdXN0ZXJzID4gb2xkX2NsdXN0ZXJzKQogCQlyZXQgPSBvY2ZzMl94YXR0cl9leHRlbmRfYWxsb2NhdGlvbihpbm9kZSwKIAkJCQkJCSAgICBuZXdfY2x1c3RlcnMgLSBvbGRfY2x1c3RlcnMsCi0JCQkJCQkgICAgcm9vdF9iaCwgeHYpOworCQkJCQkJICAgIHZiLCBjdHh0KTsKIAllbHNlCiAJCXJldCA9IG9jZnMyX3hhdHRyX3Nocmlua19zaXplKGlub2RlLAogCQkJCQkgICAgICBvbGRfY2x1c3RlcnMsIG5ld19jbHVzdGVycywKLQkJCQkJICAgICAgcm9vdF9iaCwgeHYpOworCQkJCQkgICAgICB2YiwgY3R4dCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNTU0LDE4ICs4MzgsMTQgQEAKIAlpZiAoIWRpLT5pX3hhdHRyX2xvYykKIAkJcmV0dXJuIHJldDsKIAotCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIGxlNjRfdG9fY3B1KGRpLT5pX3hhdHRyX2xvYyksICZibGtfYmgpOworCXJldCA9IG9jZnMyX3JlYWRfeGF0dHJfYmxvY2soaW5vZGUsIGxlNjRfdG9fY3B1KGRpLT5pX3hhdHRyX2xvYyksCisJCQkJICAgICAmYmxrX2JoKTsKIAlpZiAocmV0IDwgMCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCiAJeGIgPSAoc3RydWN0IG9jZnMyX3hhdHRyX2Jsb2NrICopYmxrX2JoLT5iX2RhdGE7Ci0JaWYgKCFPQ0ZTMl9JU19WQUxJRF9YQVRUUl9CTE9DSyh4YikpIHsKLQkJcmV0ID0gLUVJTzsKLQkJZ290byBjbGVhbnVwOwotCX0KLQogCWlmICghKGxlMTZfdG9fY3B1KHhiLT54Yl9mbGFncykgJiBPQ0ZTMl9YQVRUUl9JTkRFWEVEKSkgewogCQlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICpoZWFkZXIgPSAmeGItPnhiX2F0dHJzLnhiX2hlYWRlcjsKIAkJcmV0ID0gb2NmczJfeGF0dHJfbGlzdF9lbnRyaWVzKGlub2RlLCBoZWFkZXIsCkBAIC01NzUsNyArODU1LDcgQEAKIAkJcmV0ID0gb2NmczJfeGF0dHJfdHJlZV9saXN0X2luZGV4X2Jsb2NrKGlub2RlLCB4dCwKIAkJCQkJCSAgIGJ1ZmZlciwgYnVmZmVyX3NpemUpOwogCX0KLWNsZWFudXA6CisKIAlicmVsc2UoYmxrX2JoKTsKIAogCXJldHVybiByZXQ7CkBAIC02ODUsNyArOTY1LDcgQEAKIAkJYmxrbm8gPSBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3MoaW5vZGUtPmlfc2IsIHBfY2x1c3Rlcik7CiAJCS8qIENvcHkgb2NmczJfeGF0dHJfdmFsdWUgKi8KIAkJZm9yIChpID0gMDsgaSA8IG51bV9jbHVzdGVycyAqIGJwYzsgaSsrLCBibGtubysrKSB7Ci0JCQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBibGtubywgJmJoKTsKKwkJCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIGJsa25vLCAmYmgsIE5VTEwpOwogCQkJaWYgKHJldCkgewogCQkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCQlnb3RvIG91dDsKQEAgLTc2OSw3ICsxMDQ5LDEyIEBACiAJc2l6ZV90IHNpemU7CiAJaW50IHJldCA9IC1FTk9EQVRBLCBuYW1lX29mZnNldCwgbmFtZV9sZW4sIGJsb2NrX29mZiwgaTsKIAotCW1lbXNldCgmeHMtPmJ1Y2tldCwgMCwgc2l6ZW9mKHhzLT5idWNrZXQpKTsKKwl4cy0+YnVja2V0ID0gb2NmczJfeGF0dHJfYnVja2V0X25ldyhpbm9kZSk7CisJaWYgKCF4cy0+YnVja2V0KSB7CisJCXJldCA9IC1FTk9NRU07CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBjbGVhbnVwOworCX0KIAogCXJldCA9IG9jZnMyX3hhdHRyX2Jsb2NrX2ZpbmQoaW5vZGUsIG5hbWVfaW5kZXgsIG5hbWUsIHhzKTsKIAlpZiAocmV0KSB7CkBAIC03OTUsMTEgKzEwODAsMTEgQEAKIAogCQlpZiAobGUxNl90b19jcHUoeGItPnhiX2ZsYWdzKSAmIE9DRlMyX1hBVFRSX0lOREVYRUQpIHsKIAkJCXJldCA9IG9jZnMyX3hhdHRyX2J1Y2tldF9nZXRfbmFtZV92YWx1ZShpbm9kZSwKLQkJCQkJCQkJeHMtPmJ1Y2tldC54aCwKKwkJCQkJCQkJYnVja2V0X3hoKHhzLT5idWNrZXQpLAogCQkJCQkJCQlpLAogCQkJCQkJCQkmYmxvY2tfb2ZmLAogCQkJCQkJCQkmbmFtZV9vZmZzZXQpOwotCQkJeHMtPmJhc2UgPSB4cy0+YnVja2V0LmJoc1tibG9ja19vZmZdLT5iX2RhdGE7CisJCQl4cy0+YmFzZSA9IGJ1Y2tldF9ibG9jayh4cy0+YnVja2V0LCBibG9ja19vZmYpOwogCQl9CiAJCWlmIChvY2ZzMl94YXR0cl9pc19sb2NhbCh4cy0+aGVyZSkpIHsKIAkJCW1lbWNweShidWZmZXIsICh2b2lkICopeHMtPmJhc2UgKwpAQCAtODE3LDE1ICsxMTAyLDUwIEBACiAJfQogCXJldCA9IHNpemU7CiBjbGVhbnVwOgotCWZvciAoaSA9IDA7IGkgPCBPQ0ZTMl9YQVRUUl9NQVhfQkxPQ0tTX1BFUl9CVUNLRVQ7IGkrKykKLQkJYnJlbHNlKHhzLT5idWNrZXQuYmhzW2ldKTsKLQltZW1zZXQoJnhzLT5idWNrZXQsIDAsIHNpemVvZih4cy0+YnVja2V0KSk7CisJb2NmczJfeGF0dHJfYnVja2V0X2ZyZWUoeHMtPmJ1Y2tldCk7CiAKIAlicmVsc2UoeHMtPnhhdHRyX2JoKTsKIAl4cy0+eGF0dHJfYmggPSBOVUxMOwogCXJldHVybiByZXQ7CiB9CiAKK2ludCBvY2ZzMl94YXR0cl9nZXRfbm9sb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLAorCQkJICAgaW50IG5hbWVfaW5kZXgsCisJCQkgICBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgdm9pZCAqYnVmZmVyLAorCQkJICAgc2l6ZV90IGJ1ZmZlcl9zaXplKQoreworCWludCByZXQ7CisJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkgPSBOVUxMOworCXN0cnVjdCBvY2ZzMl9pbm9kZV9pbmZvICpvaSA9IE9DRlMyX0koaW5vZGUpOworCXN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggeGlzID0geworCQkubm90X2ZvdW5kID0gLUVOT0RBVEEsCisJfTsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoIHhicyA9IHsKKwkJLm5vdF9mb3VuZCA9IC1FTk9EQVRBLAorCX07CisKKwlpZiAoIW9jZnMyX3N1cHBvcnRzX3hhdHRyKE9DRlMyX1NCKGlub2RlLT5pX3NiKSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmICghKG9pLT5pcF9keW5fZmVhdHVyZXMgJiBPQ0ZTMl9IQVNfWEFUVFJfRkwpKQorCQlyZXQgPSAtRU5PREFUQTsKKworCXhpcy5pbm9kZV9iaCA9IHhicy5pbm9kZV9iaCA9IGRpX2JoOworCWRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKilkaV9iaC0+Yl9kYXRhOworCisJZG93bl9yZWFkKCZvaS0+aXBfeGF0dHJfc2VtKTsKKwlyZXQgPSBvY2ZzMl94YXR0cl9pYm9keV9nZXQoaW5vZGUsIG5hbWVfaW5kZXgsIG5hbWUsIGJ1ZmZlciwKKwkJCQkgICAgYnVmZmVyX3NpemUsICZ4aXMpOworCWlmIChyZXQgPT0gLUVOT0RBVEEgJiYgZGktPmlfeGF0dHJfbG9jKQorCQlyZXQgPSBvY2ZzMl94YXR0cl9ibG9ja19nZXQoaW5vZGUsIG5hbWVfaW5kZXgsIG5hbWUsIGJ1ZmZlciwKKwkJCQkJICAgIGJ1ZmZlcl9zaXplLCAmeGJzKTsKKwl1cF9yZWFkKCZvaS0+aXBfeGF0dHJfc2VtKTsKKworCXJldHVybiByZXQ7Cit9CisKIC8qIG9jZnMyX3hhdHRyX2dldCgpCiAgKgogICogQ29weSBhbiBleHRlbmRlZCBhdHRyaWJ1dGUgaW50byB0aGUgYnVmZmVyIHByb3ZpZGVkLgpAQCAtODM4LDM3ICsxMTU4LDE2IEBACiAJCQkgICBzaXplX3QgYnVmZmVyX3NpemUpCiB7CiAJaW50IHJldDsKLQlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSA9IE5VTEw7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCA9IE5VTEw7Ci0Jc3RydWN0IG9jZnMyX2lub2RlX2luZm8gKm9pID0gT0NGUzJfSShpbm9kZSk7Ci0Jc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCB4aXMgPSB7Ci0JCS5ub3RfZm91bmQgPSAtRU5PREFUQSwKLQl9OwotCXN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggeGJzID0gewotCQkubm90X2ZvdW5kID0gLUVOT0RBVEEsCi0JfTsKLQotCWlmICghb2NmczJfc3VwcG9ydHNfeGF0dHIoT0NGUzJfU0IoaW5vZGUtPmlfc2IpKSkKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0JaWYgKCEob2ktPmlwX2R5bl9mZWF0dXJlcyAmIE9DRlMyX0hBU19YQVRUUl9GTCkpCi0JCXJldCA9IC1FTk9EQVRBOwogCiAJcmV0ID0gb2NmczJfaW5vZGVfbG9jayhpbm9kZSwgJmRpX2JoLCAwKTsKIAlpZiAocmV0IDwgMCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQotCXhpcy5pbm9kZV9iaCA9IHhicy5pbm9kZV9iaCA9IGRpX2JoOwotCWRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKilkaV9iaC0+Yl9kYXRhOworCXJldCA9IG9jZnMyX3hhdHRyX2dldF9ub2xvY2soaW5vZGUsIGRpX2JoLCBuYW1lX2luZGV4LAorCQkJCSAgICAgbmFtZSwgYnVmZmVyLCBidWZmZXJfc2l6ZSk7CiAKLQlkb3duX3JlYWQoJm9pLT5pcF94YXR0cl9zZW0pOwotCXJldCA9IG9jZnMyX3hhdHRyX2lib2R5X2dldChpbm9kZSwgbmFtZV9pbmRleCwgbmFtZSwgYnVmZmVyLAotCQkJCSAgICBidWZmZXJfc2l6ZSwgJnhpcyk7Ci0JaWYgKHJldCA9PSAtRU5PREFUQSAmJiBkaS0+aV94YXR0cl9sb2MpCi0JCXJldCA9IG9jZnMyX3hhdHRyX2Jsb2NrX2dldChpbm9kZSwgbmFtZV9pbmRleCwgbmFtZSwgYnVmZmVyLAotCQkJCQkgICAgYnVmZmVyX3NpemUsICZ4YnMpOwotCXVwX3JlYWQoJm9pLT5pcF94YXR0cl9zZW0pOwogCW9jZnMyX2lub2RlX3VubG9jayhpbm9kZSwgMCk7CiAKIAlicmVsc2UoZGlfYmgpOwpAQCAtODc3LDQ0ICsxMTc2LDM2IEBACiB9CiAKIHN0YXRpYyBpbnQgX19vY2ZzMl94YXR0cl9zZXRfdmFsdWVfb3V0c2lkZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICBoYW5kbGVfdCAqaGFuZGxlLAogCQkJCQkgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCAqeHYsCiAJCQkJCSAgIGNvbnN0IHZvaWQgKnZhbHVlLAogCQkJCQkgICBpbnQgdmFsdWVfbGVuKQogewotCWludCByZXQgPSAwLCBpLCBjcF9sZW4sIGNyZWRpdHM7CisJaW50IHJldCA9IDAsIGksIGNwX2xlbjsKIAl1MTYgYmxvY2tzaXplID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOwogCXUzMiBwX2NsdXN0ZXIsIG51bV9jbHVzdGVyczsKIAl1MzIgY3BvcyA9IDAsIGJwYyA9IG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgMSk7CiAJdTMyIGNsdXN0ZXJzID0gb2NmczJfY2x1c3RlcnNfZm9yX2J5dGVzKGlub2RlLT5pX3NiLCB2YWx1ZV9sZW4pOwogCXU2NCBibGtubzsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKLQloYW5kbGVfdCAqaGFuZGxlOwogCiAJQlVHX09OKGNsdXN0ZXJzID4gbGUzMl90b19jcHUoeHYtPnhyX2NsdXN0ZXJzKSk7CiAKLQljcmVkaXRzID0gY2x1c3RlcnMgKiBicGM7Ci0JaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMoT0NGUzJfU0IoaW5vZGUtPmlfc2IpLCBjcmVkaXRzKTsKLQlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKLQkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOwotCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0OwotCX0KLQogCXdoaWxlIChjcG9zIDwgY2x1c3RlcnMpIHsKIAkJcmV0ID0gb2NmczJfeGF0dHJfZ2V0X2NsdXN0ZXJzKGlub2RlLCBjcG9zLCAmcF9jbHVzdGVyLAogCQkJCQkgICAgICAgJm51bV9jbHVzdGVycywgJnh2LT54cl9saXN0KTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJZ290byBvdXRfY29tbWl0OworCQkJZ290byBvdXQ7CiAJCX0KIAogCQlibGtubyA9IG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgcF9jbHVzdGVyKTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2NsdXN0ZXJzICogYnBjOyBpKyssIGJsa25vKyspIHsKLQkJCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIGJsa25vLCAmYmgpOworCQkJcmV0ID0gb2NmczJfcmVhZF9ibG9jayhpbm9kZSwgYmxrbm8sICZiaCwgTlVMTCk7CiAJCQlpZiAocmV0KSB7CiAJCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJCWdvdG8gb3V0X2NvbW1pdDsKKwkJCQlnb3RvIG91dDsKIAkJCX0KIAogCQkJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLApAQCAtOTIzLDcgKzEyMTQsNyBAQAogCQkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCQkJaWYgKHJldCA8IDApIHsKIAkJCQltbG9nX2Vycm5vKHJldCk7Ci0JCQkJZ290byBvdXRfY29tbWl0OworCQkJCWdvdG8gb3V0OwogCQkJfQogCiAJCQljcF9sZW4gPSB2YWx1ZV9sZW4gPiBibG9ja3NpemUgPyBibG9ja3NpemUgOiB2YWx1ZV9sZW47CkBAIC05MzcsNyArMTIyOCw3IEBACiAJCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgYmgpOwogCQkJaWYgKHJldCA8IDApIHsKIAkJCQltbG9nX2Vycm5vKHJldCk7Ci0JCQkJZ290byBvdXRfY29tbWl0OworCQkJCWdvdG8gb3V0OwogCQkJfQogCQkJYnJlbHNlKGJoKTsKIAkJCWJoID0gTlVMTDsKQEAgLTk1MSw4ICsxMjQyLDYgQEAKIAkJfQogCQljcG9zICs9IG51bV9jbHVzdGVyczsKIAl9Ci1vdXRfY29tbWl0OgotCW9jZnMyX2NvbW1pdF90cmFucyhPQ0ZTMl9TQihpbm9kZS0+aV9zYiksIGhhbmRsZSk7CiBvdXQ6CiAJYnJlbHNlKGJoKTsKIApAQCAtOTYwLDI4ICsxMjQ5LDIyIEBACiB9CiAKIHN0YXRpYyBpbnQgb2NmczJfeGF0dHJfY2xlYW51cChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICAgIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkgICAgICAgc3RydWN0IG9jZnMyX3hhdHRyX2luZm8gKnhpLAogCQkJICAgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggKnhzLAorCQkJICAgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9idWYgKnZiLAogCQkJICAgICAgIHNpemVfdCBvZmZzKQogewotCWhhbmRsZV90ICpoYW5kbGUgPSBOVUxMOwogCWludCByZXQgPSAwOwogCXNpemVfdCBuYW1lX2xlbiA9IHN0cmxlbih4aS0+bmFtZSk7CiAJdm9pZCAqdmFsID0geHMtPmJhc2UgKyBvZmZzOwogCXNpemVfdCBzaXplID0gT0NGUzJfWEFUVFJfU0laRShuYW1lX2xlbikgKyBPQ0ZTMl9YQVRUUl9ST09UX1NJWkU7CiAKLQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucygoT0NGUzJfU0IoaW5vZGUtPmlfc2IpKSwKLQkJCQkgICBPQ0ZTMl9YQVRUUl9CTE9DS19VUERBVEVfQ1JFRElUUyk7Ci0JaWYgKElTX0VSUihoYW5kbGUpKSB7Ci0JCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKLQkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dDsKLQl9Ci0JcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgeHMtPnhhdHRyX2JoLAotCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlyZXQgPSB2Yi0+dmJfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHZiLT52Yl9iaCwKKwkJCSAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0X2NvbW1pdDsKKwkJZ290byBvdXQ7CiAJfQogCS8qIERlY3JlYXNlIHhhdHRyIGNvdW50ICovCiAJbGUxNl9hZGRfY3B1KCZ4cy0+aGVhZGVyLT54aF9jb3VudCwgLTEpOwpAQCAtOTg5LDM1ICsxMjcyLDI3IEBACiAJbWVtc2V0KCh2b2lkICopeHMtPmhlcmUsIDAsIHNpemVvZihzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkpKTsKIAltZW1zZXQodmFsLCAwLCBzaXplKTsKIAotCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCB4cy0+eGF0dHJfYmgpOworCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCB2Yi0+dmJfYmgpOwogCWlmIChyZXQgPCAwKQogCQltbG9nX2Vycm5vKHJldCk7Ci1vdXRfY29tbWl0OgotCW9jZnMyX2NvbW1pdF90cmFucyhPQ0ZTMl9TQihpbm9kZS0+aV9zYiksIGhhbmRsZSk7CiBvdXQ6CiAJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBvY2ZzMl94YXR0cl91cGRhdGVfZW50cnkoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkgICAgc3RydWN0IG9jZnMyX3hhdHRyX2luZm8gKnhpLAogCQkJCSAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cywKKwkJCQkgICAgc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX2J1ZiAqdmIsCiAJCQkJICAgIHNpemVfdCBvZmZzKQogewotCWhhbmRsZV90ICpoYW5kbGUgPSBOVUxMOwotCWludCByZXQgPSAwOworCWludCByZXQ7CiAKLQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucygoT0NGUzJfU0IoaW5vZGUtPmlfc2IpKSwKLQkJCQkgICBPQ0ZTMl9YQVRUUl9CTE9DS19VUERBVEVfQ1JFRElUUyk7Ci0JaWYgKElTX0VSUihoYW5kbGUpKSB7Ci0JCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKLQkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dDsKLQl9Ci0JcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgeHMtPnhhdHRyX2JoLAotCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlyZXQgPSB2Yi0+dmJfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHZiLT52Yl9iaCwKKwkJCSAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0X2NvbW1pdDsKKwkJZ290byBvdXQ7CiAJfQogCiAJeHMtPmhlcmUtPnhlX25hbWVfb2Zmc2V0ID0gY3B1X3RvX2xlMTYob2Zmcyk7CkBAIC0xMDI4LDExICsxMzAzLDkgQEAKIAkJb2NmczJfeGF0dHJfc2V0X2xvY2FsKHhzLT5oZXJlLCAwKTsKIAlvY2ZzMl94YXR0cl9oYXNoX2VudHJ5KGlub2RlLCB4cy0+aGVhZGVyLCB4cy0+aGVyZSk7CiAKLQlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgeHMtPnhhdHRyX2JoKTsKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgdmItPnZiX2JoKTsKIAlpZiAocmV0IDwgMCkKIAkJbWxvZ19lcnJubyhyZXQpOwotb3V0X2NvbW1pdDoKLQlvY2ZzMl9jb21taXRfdHJhbnMoT0NGUzJfU0IoaW5vZGUtPmlfc2IpLCBoYW5kbGUpOwogb3V0OgogCXJldHVybiByZXQ7CiB9CkBAIC0xMDQ1LDYgKzEzMTgsOCBAQAogc3RhdGljIGludCBvY2ZzMl94YXR0cl9zZXRfdmFsdWVfb3V0c2lkZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCQkgc3RydWN0IG9jZnMyX3hhdHRyX2luZm8gKnhpLAogCQkJCQkgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMsCisJCQkJCSBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2V0X2N0eHQgKmN0eHQsCisJCQkJCSBzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfYnVmICp2YiwKIAkJCQkJIHNpemVfdCBvZmZzKQogewogCXNpemVfdCBuYW1lX2xlbiA9IHN0cmxlbih4aS0+bmFtZSk7CkBAIC0xMDYyLDIwICsxMzM3LDIwIEBACiAJeHYtPnhyX2xpc3QubF90cmVlX2RlcHRoID0gMDsKIAl4di0+eHJfbGlzdC5sX2NvdW50ID0gY3B1X3RvX2xlMTYoMSk7CiAJeHYtPnhyX2xpc3QubF9uZXh0X2ZyZWVfcmVjID0gMDsKKwl2Yi0+dmJfeHYgPSB4djsKIAotCXJldCA9IG9jZnMyX3hhdHRyX3ZhbHVlX3RydW5jYXRlKGlub2RlLCB4cy0+eGF0dHJfYmgsIHh2LAotCQkJCQkgeGktPnZhbHVlX2xlbik7CisJcmV0ID0gb2NmczJfeGF0dHJfdmFsdWVfdHJ1bmNhdGUoaW5vZGUsIHZiLCB4aS0+dmFsdWVfbGVuLCBjdHh0KTsKIAlpZiAocmV0IDwgMCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQotCXJldCA9IF9fb2NmczJfeGF0dHJfc2V0X3ZhbHVlX291dHNpZGUoaW5vZGUsIHh2LCB4aS0+dmFsdWUsCi0JCQkJCSAgICAgIHhpLT52YWx1ZV9sZW4pOworCXJldCA9IG9jZnMyX3hhdHRyX3VwZGF0ZV9lbnRyeShpbm9kZSwgY3R4dC0+aGFuZGxlLCB4aSwgeHMsIHZiLCBvZmZzKTsKIAlpZiAocmV0IDwgMCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQotCXJldCA9IG9jZnMyX3hhdHRyX3VwZGF0ZV9lbnRyeShpbm9kZSwgeGksIHhzLCBvZmZzKTsKKwlyZXQgPSBfX29jZnMyX3hhdHRyX3NldF92YWx1ZV9vdXRzaWRlKGlub2RlLCBjdHh0LT5oYW5kbGUsIHZiLT52Yl94diwKKwkJCQkJICAgICAgeGktPnZhbHVlLCB4aS0+dmFsdWVfbGVuKTsKIAlpZiAocmV0IDwgMCkKIAkJbWxvZ19lcnJubyhyZXQpOwogCkBAIC0xMTk1LDYgKzE0NzAsNyBAQAogc3RhdGljIGludCBvY2ZzMl94YXR0cl9zZXRfZW50cnkoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkgc3RydWN0IG9jZnMyX3hhdHRyX2luZm8gKnhpLAogCQkJCSBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cywKKwkJCQkgc3RydWN0IG9jZnMyX3hhdHRyX3NldF9jdHh0ICpjdHh0LAogCQkJCSBpbnQgZmxhZykKIHsKIAlzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkgKmxhc3Q7CkBAIC0xMjAyLDcgKzE0NzgsNyBAQAogCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKil4cy0+aW5vZGVfYmgtPmJfZGF0YTsKIAlzaXplX3QgbWluX29mZnMgPSB4cy0+ZW5kIC0geHMtPmJhc2UsIG5hbWVfbGVuID0gc3RybGVuKHhpLT5uYW1lKTsKIAlzaXplX3Qgc2l6ZV9sID0gMDsKLQloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKKwloYW5kbGVfdCAqaGFuZGxlID0gY3R4dC0+aGFuZGxlOwogCWludCBmcmVlLCBpLCByZXQ7CiAJc3RydWN0IG9jZnMyX3hhdHRyX2luZm8geGlfbCA9IHsKIAkJLm5hbWVfaW5kZXggPSB4aS0+bmFtZV9pbmRleCwKQEAgLTEyMTAsNiArMTQ4NiwxNiBAQAogCQkudmFsdWUgPSB4aS0+dmFsdWUsCiAJCS52YWx1ZV9sZW4gPSB4aS0+dmFsdWVfbGVuLAogCX07CisJc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX2J1ZiB2YiA9IHsKKwkJLnZiX2JoID0geHMtPnhhdHRyX2JoLAorCQkudmJfYWNjZXNzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZGksCisJfTsKKworCWlmICghKGZsYWcgJiBPQ0ZTMl9JTkxJTkVfWEFUVFJfRkwpKSB7CisJCUJVR19PTih4cy0+eGF0dHJfYmggPT0geHMtPmlub2RlX2JoKTsKKwkJdmIudmJfYWNjZXNzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfeGI7CisJfSBlbHNlCisJCUJVR19PTih4cy0+eGF0dHJfYmggIT0geHMtPmlub2RlX2JoKTsKIAogCS8qIENvbXB1dGUgbWluX29mZnMsIGxhc3QgYW5kIGZyZWUgc3BhY2UuICovCiAJbGFzdCA9IHhzLT5oZWFkZXItPnhoX2VudHJpZXM7CkBAIC0xMjY1LDE1ICsxNTUxLDE0IEBACiAJCWlmIChvY2ZzMl94YXR0cl9pc19sb2NhbCh4cy0+aGVyZSkgJiYgc2l6ZSA9PSBzaXplX2wpIHsKIAkJCS8qIFJlcGxhY2UgZXhpc3RpbmcgbG9jYWwgeGF0dHIgd2l0aCB0cmVlIHJvb3QgKi8KIAkJCXJldCA9IG9jZnMyX3hhdHRyX3NldF92YWx1ZV9vdXRzaWRlKGlub2RlLCB4aSwgeHMsCi0JCQkJCQkJICAgIG9mZnMpOworCQkJCQkJCSAgICBjdHh0LCAmdmIsIG9mZnMpOwogCQkJaWYgKHJldCA8IDApCiAJCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJZ290byBvdXQ7CiAJCX0gZWxzZSBpZiAoIW9jZnMyX3hhdHRyX2lzX2xvY2FsKHhzLT5oZXJlKSkgewogCQkJLyogRm9yIGV4aXN0aW5nIHhhdHRyIHdoaWNoIGhhcyB2YWx1ZSBvdXRzaWRlICovCi0JCQlzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCAqeHYgPSBOVUxMOwotCQkJeHYgPSAoc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX3Jvb3QgKikodmFsICsKLQkJCQlPQ0ZTMl9YQVRUUl9TSVpFKG5hbWVfbGVuKSk7CisJCQl2Yi52Yl94diA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCAqKQorCQkJCSh2YWwgKyBPQ0ZTMl9YQVRUUl9TSVpFKG5hbWVfbGVuKSk7CiAKIAkJCWlmICh4aS0+dmFsdWVfbGVuID4gT0NGUzJfWEFUVFJfSU5MSU5FX1NJWkUpIHsKIAkJCQkvKgpAQCAtMTI4MiwyNyArMTU2NywzMCBAQAogCQkJCSAqIHRoZW4gc2V0IG5ldyB2YWx1ZSB3aXRoIHNldF92YWx1ZV9vdXRzaWRlKCkuCiAJCQkJICovCiAJCQkJcmV0ID0gb2NmczJfeGF0dHJfdmFsdWVfdHJ1bmNhdGUoaW5vZGUsCi0JCQkJCQkJCSB4cy0+eGF0dHJfYmgsCi0JCQkJCQkJCSB4diwKLQkJCQkJCQkJIHhpLT52YWx1ZV9sZW4pOwotCQkJCWlmIChyZXQgPCAwKSB7Ci0JCQkJCW1sb2dfZXJybm8ocmV0KTsKLQkJCQkJZ290byBvdXQ7Ci0JCQkJfQotCi0JCQkJcmV0ID0gX19vY2ZzMl94YXR0cl9zZXRfdmFsdWVfb3V0c2lkZShpbm9kZSwKLQkJCQkJCQkJeHYsCi0JCQkJCQkJCXhpLT52YWx1ZSwKLQkJCQkJCQkJeGktPnZhbHVlX2xlbik7CisJCQkJCQkJCSAmdmIsCisJCQkJCQkJCSB4aS0+dmFsdWVfbGVuLAorCQkJCQkJCQkgY3R4dCk7CiAJCQkJaWYgKHJldCA8IDApIHsKIAkJCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJCQlnb3RvIG91dDsKIAkJCQl9CiAKIAkJCQlyZXQgPSBvY2ZzMl94YXR0cl91cGRhdGVfZW50cnkoaW5vZGUsCisJCQkJCQkJICAgICAgIGhhbmRsZSwKIAkJCQkJCQkgICAgICAgeGksCiAJCQkJCQkJICAgICAgIHhzLAorCQkJCQkJCSAgICAgICAmdmIsCiAJCQkJCQkJICAgICAgIG9mZnMpOworCQkJCWlmIChyZXQgPCAwKSB7CisJCQkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCisJCQkJcmV0ID0gX19vY2ZzMl94YXR0cl9zZXRfdmFsdWVfb3V0c2lkZShpbm9kZSwKKwkJCQkJCQkJaGFuZGxlLAorCQkJCQkJCQl2Yi52Yl94diwKKwkJCQkJCQkJeGktPnZhbHVlLAorCQkJCQkJCQl4aS0+dmFsdWVfbGVuKTsKIAkJCQlpZiAocmV0IDwgMCkKIAkJCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJCWdvdG8gb3V0OwpAQCAtMTMxMiw0NCArMTYwMCwyOCBAQAogCQkJCSAqIGp1c3QgdHJ1Y2F0ZSBvbGQgdmFsdWUgdG8gemVyby4KIAkJCQkgKi8KIAkJCQkgcmV0ID0gb2NmczJfeGF0dHJfdmFsdWVfdHJ1bmNhdGUoaW5vZGUsCi0JCQkJCQkJCSB4cy0+eGF0dHJfYmgsCi0JCQkJCQkJCSB4diwKLQkJCQkJCQkJIDApOworCQkJCQkJCQkgICZ2YiwKKwkJCQkJCQkJICAwLAorCQkJCQkJCQkgIGN0eHQpOwogCQkJCWlmIChyZXQgPCAwKQogCQkJCQltbG9nX2Vycm5vKHJldCk7CiAJCQl9CiAJCX0KIAl9CiAKLQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucygoT0NGUzJfU0IoaW5vZGUtPmlfc2IpKSwKLQkJCQkgICBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUyk7Ci0JaWYgKElTX0VSUihoYW5kbGUpKSB7Ci0JCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19kaShoYW5kbGUsIGlub2RlLCB4cy0+aW5vZGVfYmgsCisJCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dDsKIAl9CiAKLQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCB4cy0+aW5vZGVfYmgsCi0JCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwotCWlmIChyZXQpIHsKLQkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dF9jb21taXQ7Ci0JfQotCiAJaWYgKCEoZmxhZyAmIE9DRlMyX0lOTElORV9YQVRUUl9GTCkpIHsKLQkJLyogc2V0IGV4dGVuZGVkIGF0dHJpYnV0ZSBpbiBleHRlcm5hbCBibG9jay4gKi8KLQkJcmV0ID0gb2NmczJfZXh0ZW5kX3RyYW5zKGhhbmRsZSwKLQkJCQkJIE9DRlMyX0lOT0RFX1VQREFURV9DUkVESVRTICsKLQkJCQkJIE9DRlMyX1hBVFRSX0JMT0NLX1VQREFURV9DUkVESVRTKTsKKwkJcmV0ID0gdmIudmJfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHZiLnZiX2JoLAorCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJZ290byBvdXRfY29tbWl0OwotCQl9Ci0JCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHhzLT54YXR0cl9iaCwKLQkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwotCQlpZiAocmV0KSB7Ci0JCQltbG9nX2Vycm5vKHJldCk7Ci0JCQlnb3RvIG91dF9jb21taXQ7CisJCQlnb3RvIG91dDsKIAkJfQogCX0KIApAQCAtMTM2Myw3ICsxNjM1LDcgQEAKIAkJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHhzLT54YXR0cl9iaCk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQltbG9nX2Vycm5vKHJldCk7Ci0JCQlnb3RvIG91dF9jb21taXQ7CisJCQlnb3RvIG91dDsKIAkJfQogCX0KIApAQCAtMTM5MSwyNSArMTY2MywxOSBAQAogCW9pLT5pcF9keW5fZmVhdHVyZXMgfD0gZmxhZzsKIAlkaS0+aV9keW5fZmVhdHVyZXMgPSBjcHVfdG9fbGUxNihvaS0+aXBfZHluX2ZlYXR1cmVzKTsKIAlzcGluX3VubG9jaygmb2ktPmlwX2xvY2spOwotCS8qIFVwZGF0ZSBpbm9kZSBjdGltZSAqLwotCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwotCWRpLT5pX2N0aW1lID0gY3B1X3RvX2xlNjQoaW5vZGUtPmlfY3RpbWUudHZfc2VjKTsKLQlkaS0+aV9jdGltZV9uc2VjID0gY3B1X3RvX2xlMzIoaW5vZGUtPmlfY3RpbWUudHZfbnNlYyk7CiAKIAlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgeHMtPmlub2RlX2JoKTsKIAlpZiAocmV0IDwgMCkKIAkJbWxvZ19lcnJubyhyZXQpOwogCi1vdXRfY29tbWl0OgotCW9jZnMyX2NvbW1pdF90cmFucyhPQ0ZTMl9TQihpbm9kZS0+aV9zYiksIGhhbmRsZSk7Ci0KIAlpZiAoIXJldCAmJiB4aS0+dmFsdWVfbGVuID4gT0NGUzJfWEFUVFJfSU5MSU5FX1NJWkUpIHsKIAkJLyoKIAkJICogU2V0IHZhbHVlIG91dHNpZGUgaW4gQiB0cmVlLgogCQkgKiBUaGlzIGlzIHRoZSBzZWNvbmQgc3RlcCBmb3IgdmFsdWUgc2l6ZSA+IElOTElORV9TSVpFLgogCQkgKi8KIAkJc2l6ZV90IG9mZnMgPSBsZTE2X3RvX2NwdSh4cy0+aGVyZS0+eGVfbmFtZV9vZmZzZXQpOwotCQlyZXQgPSBvY2ZzMl94YXR0cl9zZXRfdmFsdWVfb3V0c2lkZShpbm9kZSwgeGksIHhzLCBvZmZzKTsKKwkJcmV0ID0gb2NmczJfeGF0dHJfc2V0X3ZhbHVlX291dHNpZGUoaW5vZGUsIHhpLCB4cywgY3R4dCwKKwkJCQkJCSAgICAmdmIsIG9mZnMpOwogCQlpZiAocmV0IDwgMCkgewogCQkJaW50IHJldDI7CiAKQEAgLTE0MTgsNDEgKzE2ODQsNTYgQEAKIAkJCSAqIElmIHNldCB2YWx1ZSBvdXRzaWRlIGZhaWxlZCwgd2UgaGF2ZSB0byBjbGVhbgogCQkJICogdGhlIGp1bmsgdHJlZSByb290IHdlIGhhdmUgYWxyZWFkeSBzZXQgaW4gbG9jYWwuCiAJCQkgKi8KLQkJCXJldDIgPSBvY2ZzMl94YXR0cl9jbGVhbnVwKGlub2RlLCB4aSwgeHMsIG9mZnMpOworCQkJcmV0MiA9IG9jZnMyX3hhdHRyX2NsZWFudXAoaW5vZGUsIGN0eHQtPmhhbmRsZSwKKwkJCQkJCSAgIHhpLCB4cywgJnZiLCBvZmZzKTsKIAkJCWlmIChyZXQyIDwgMCkKIAkJCQltbG9nX2Vycm5vKHJldDIpOwogCQl9CiAJfQogb3V0OgogCXJldHVybiByZXQ7Ci0KIH0KIAogc3RhdGljIGludCBvY2ZzMl9yZW1vdmVfdmFsdWVfb3V0c2lkZShzdHJ1Y3QgaW5vZGUqaW5vZGUsCi0JCQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJCQkgICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfYnVmICp2YiwKIAkJCQkgICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICpoZWFkZXIpCiB7CiAJaW50IHJldCA9IDAsIGk7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CisJc3RydWN0IG9jZnMyX3hhdHRyX3NldF9jdHh0IGN0eHQgPSB7IE5VTEwsIE5VTEwsIH07CisKKwlvY2ZzMl9pbml0X2RlYWxsb2NfY3R4dCgmY3R4dC5kZWFsbG9jKTsKKworCWN0eHQuaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLAorCQkJCQlvY2ZzMl9yZW1vdmVfZXh0ZW50X2NyZWRpdHMob3NiLT5zYikpOworCWlmIChJU19FUlIoY3R4dC5oYW5kbGUpKSB7CisJCXJldCA9IFBUUl9FUlIoY3R4dC5oYW5kbGUpOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KIAogCWZvciAoaSA9IDA7IGkgPCBsZTE2X3RvX2NwdShoZWFkZXItPnhoX2NvdW50KTsgaSsrKSB7CiAJCXN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSAqZW50cnkgPSAmaGVhZGVyLT54aF9lbnRyaWVzW2ldOwogCiAJCWlmICghb2NmczJfeGF0dHJfaXNfbG9jYWwoZW50cnkpKSB7Ci0JCQlzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCAqeHY7CiAJCQl2b2lkICp2YWw7CiAKIAkJCXZhbCA9ICh2b2lkICopaGVhZGVyICsKIAkJCQlsZTE2X3RvX2NwdShlbnRyeS0+eGVfbmFtZV9vZmZzZXQpOwotCQkJeHYgPSAoc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX3Jvb3QgKikKKwkJCXZiLT52Yl94diA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCAqKQogCQkJCSh2YWwgKyBPQ0ZTMl9YQVRUUl9TSVpFKGVudHJ5LT54ZV9uYW1lX2xlbikpOwotCQkJcmV0ID0gb2NmczJfeGF0dHJfdmFsdWVfdHJ1bmNhdGUoaW5vZGUsIGJoLCB4diwgMCk7CisJCQlyZXQgPSBvY2ZzMl94YXR0cl92YWx1ZV90cnVuY2F0ZShpbm9kZSwgdmIsIDAsICZjdHh0KTsKIAkJCWlmIChyZXQgPCAwKSB7CiAJCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJCXJldHVybiByZXQ7CisJCQkJYnJlYWs7CiAJCQl9CiAJCX0KIAl9CiAKKwlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBjdHh0LmhhbmRsZSk7CisJb2NmczJfc2NoZWR1bGVfdHJ1bmNhdGVfbG9nX2ZsdXNoKG9zYiwgMSk7CisJb2NmczJfcnVuX2RlYWxsb2NzKG9zYiwgJmN0eHQuZGVhbGxvYyk7CitvdXQ6CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTQ2MywxMiArMTc0NCwxNiBAQAogCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKilkaV9iaC0+Yl9kYXRhOwogCXN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKmhlYWRlcjsKIAlpbnQgcmV0OworCXN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9idWYgdmIgPSB7CisJCS52Yl9iaCA9IGRpX2JoLAorCQkudmJfYWNjZXNzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZGksCisJfTsKIAogCWhlYWRlciA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICopCiAJCSAoKHZvaWQgKilkaSArIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtCiAJCSBsZTE2X3RvX2NwdShkaS0+aV94YXR0cl9pbmxpbmVfc2l6ZSkpOwogCi0JcmV0ID0gb2NmczJfcmVtb3ZlX3ZhbHVlX291dHNpZGUoaW5vZGUsIGRpX2JoLCBoZWFkZXIpOworCXJldCA9IG9jZnMyX3JlbW92ZV92YWx1ZV9vdXRzaWRlKGlub2RlLCAmdmIsIGhlYWRlcik7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTQ3OCwxMSArMTc2MywxNSBAQAogewogCXN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqeGI7CiAJaW50IHJldCA9IDA7CisJc3RydWN0IG9jZnMyX3hhdHRyX3ZhbHVlX2J1ZiB2YiA9IHsKKwkJLnZiX2JoID0gYmxrX2JoLAorCQkudmJfYWNjZXNzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfeGIsCisJfTsKIAogCXhiID0gKHN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqKWJsa19iaC0+Yl9kYXRhOwogCWlmICghKGxlMTZfdG9fY3B1KHhiLT54Yl9mbGFncykgJiBPQ0ZTMl9YQVRUUl9JTkRFWEVEKSkgewogCQlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICpoZWFkZXIgPSAmKHhiLT54Yl9hdHRycy54Yl9oZWFkZXIpOwotCQlyZXQgPSBvY2ZzMl9yZW1vdmVfdmFsdWVfb3V0c2lkZShpbm9kZSwgYmxrX2JoLCBoZWFkZXIpOworCQlyZXQgPSBvY2ZzMl9yZW1vdmVfdmFsdWVfb3V0c2lkZShpbm9kZSwgJnZiLCBoZWFkZXIpOwogCX0gZWxzZQogCQlyZXQgPSBvY2ZzMl9kZWxldGVfeGF0dHJfaW5kZXhfYmxvY2soaW5vZGUsIGJsa19iaCk7CiAKQEAgLTE1MDIsMjQgKzE3OTEsMTkgQEAKIAl1NjQgYmxrLCBiZ19ibGtubzsKIAl1MTYgYml0OwogCi0JcmV0ID0gb2NmczJfcmVhZF9ibG9jayhpbm9kZSwgYmxvY2ssICZibGtfYmgpOworCXJldCA9IG9jZnMyX3JlYWRfeGF0dHJfYmxvY2soaW5vZGUsIGJsb2NrLCAmYmxrX2JoKTsKIAlpZiAocmV0IDwgMCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwogCX0KIAotCXhiID0gKHN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqKWJsa19iaC0+Yl9kYXRhOwotCWlmICghT0NGUzJfSVNfVkFMSURfWEFUVFJfQkxPQ0soeGIpKSB7Ci0JCXJldCA9IC1FSU87Ci0JCWdvdG8gb3V0OwotCX0KLQogCXJldCA9IG9jZnMyX3hhdHRyX2Jsb2NrX3JlbW92ZShpbm9kZSwgYmxrX2JoKTsKIAlpZiAocmV0IDwgMCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwogCX0KIAorCXhiID0gKHN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqKWJsa19iaC0+Yl9kYXRhOwogCWJsayA9IGxlNjRfdG9fY3B1KHhiLT54Yl9ibGtubyk7CiAJYml0ID0gbGUxNl90b19jcHUoeGItPnhiX3N1YmFsbG9jX2JpdCk7CiAJYmdfYmxrbm8gPSBvY2ZzMl93aGljaF9zdWJhbGxvY19ncm91cChibGssIGJpdCk7CkBAIC0xNjA2LDggKzE4OTAsOCBAQAogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwogCX0KLQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBkaV9iaCwKLQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZGkoaGFuZGxlLCBpbm9kZSwgZGlfYmgsCisJCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dF9jb21taXQ7CkBAIC0xNzE0LDcgKzE5OTgsOCBAQAogICovCiBzdGF0aWMgaW50IG9jZnMyX3hhdHRyX2lib2R5X3NldChzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCSBzdHJ1Y3Qgb2NmczJfeGF0dHJfaW5mbyAqeGksCi0JCQkJIHN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggKnhzKQorCQkJCSBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cywKKwkJCQkgc3RydWN0IG9jZnMyX3hhdHRyX3NldF9jdHh0ICpjdHh0KQogewogCXN0cnVjdCBvY2ZzMl9pbm9kZV9pbmZvICpvaSA9IE9DRlMyX0koaW5vZGUpOwogCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKil4cy0+aW5vZGVfYmgtPmJfZGF0YTsKQEAgLTE3MzEsNyArMjAxNiw3IEBACiAJCX0KIAl9CiAKLQlyZXQgPSBvY2ZzMl94YXR0cl9zZXRfZW50cnkoaW5vZGUsIHhpLCB4cywKKwlyZXQgPSBvY2ZzMl94YXR0cl9zZXRfZW50cnkoaW5vZGUsIHhpLCB4cywgY3R4dCwKIAkJCQkoT0NGUzJfSU5MSU5FX1hBVFRSX0ZMIHwgT0NGUzJfSEFTX1hBVFRSX0ZMKSk7CiBvdXQ6CiAJdXBfd3JpdGUoJm9pLT5pcF9hbGxvY19zZW0pOwpAQCAtMTc1OCwxOSArMjA0MywxNSBAQAogCWlmICghZGktPmlfeGF0dHJfbG9jKQogCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gb2NmczJfcmVhZF9ibG9jayhpbm9kZSwgbGU2NF90b19jcHUoZGktPmlfeGF0dHJfbG9jKSwgJmJsa19iaCk7CisJcmV0ID0gb2NmczJfcmVhZF94YXR0cl9ibG9jayhpbm9kZSwgbGU2NF90b19jcHUoZGktPmlfeGF0dHJfbG9jKSwKKwkJCQkgICAgICZibGtfYmgpOwogCWlmIChyZXQgPCAwKSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQl4YiA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2sgKilibGtfYmgtPmJfZGF0YTsKLQlpZiAoIU9DRlMyX0lTX1ZBTElEX1hBVFRSX0JMT0NLKHhiKSkgewotCQlyZXQgPSAtRUlPOwotCQlnb3RvIGNsZWFudXA7Ci0JfQotCiAJeHMtPnhhdHRyX2JoID0gYmxrX2JoOworCXhiID0gKHN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqKWJsa19iaC0+Yl9kYXRhOwogCiAJaWYgKCEobGUxNl90b19jcHUoeGItPnhiX2ZsYWdzKSAmIE9DRlMyX1hBVFRSX0lOREVYRUQpKSB7CiAJCXhzLT5oZWFkZXIgPSAmeGItPnhiX2F0dHJzLnhiX2hlYWRlcjsKQEAgLTE4MDQsMTMgKzIwODUsMTMgQEAKICAqLwogc3RhdGljIGludCBvY2ZzMl94YXR0cl9ibG9ja19zZXQoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkgc3RydWN0IG9jZnMyX3hhdHRyX2luZm8gKnhpLAotCQkJCSBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cykKKwkJCQkgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMsCisJCQkJIHN0cnVjdCBvY2ZzMl94YXR0cl9zZXRfY3R4dCAqY3R4dCkKIHsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm5ld19iaCA9IE5VTEw7CiAJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CiAJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkgPSAgKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKil4cy0+aW5vZGVfYmgtPmJfZGF0YTsKLQlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYyA9IE5VTEw7Ci0JaGFuZGxlX3QgKmhhbmRsZSA9IE5VTEw7CisJaGFuZGxlX3QgKmhhbmRsZSA9IGN0eHQtPmhhbmRsZTsKIAlzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2sgKnhibGsgPSBOVUxMOwogCXUxNiBzdWJhbGxvY19iaXRfc3RhcnQ7CiAJdTMyIG51bV9nb3Q7CkBAIC0xODE4LDQ1ICsyMDk5LDI5IEBACiAJaW50IHJldDsKIAogCWlmICgheHMtPnhhdHRyX2JoKSB7Ci0JCS8qCi0JCSAqIEFsbG9jIG9uZSBleHRlcm5hbCBibG9jayBmb3IgZXh0ZW5kZWQgYXR0cmlidXRlCi0JCSAqIG91dHNpZGUgb2YgaW5vZGUuCi0JCSAqLwotCQlyZXQgPSBvY2ZzMl9yZXNlcnZlX25ld19tZXRhZGF0YV9ibG9ja3Mob3NiLCAxLCAmbWV0YV9hYyk7CisJCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RpKGhhbmRsZSwgaW5vZGUsIHhzLT5pbm9kZV9iaCwKKwkJCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfQ1JFQVRFKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwKLQkJCQkJICAgT0NGUzJfWEFUVFJfQkxPQ0tfQ1JFQVRFX0NSRURJVFMpOwotCQlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKLQkJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKLQkJCW1sb2dfZXJybm8ocmV0KTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHhzLT5pbm9kZV9iaCwKLQkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfQ1JFQVRFKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCW1sb2dfZXJybm8ocmV0KTsKLQkJCWdvdG8gb3V0X2NvbW1pdDsKKwkJCWdvdG8gZW5kOwogCQl9CiAKLQkJcmV0ID0gb2NmczJfY2xhaW1fbWV0YWRhdGEob3NiLCBoYW5kbGUsIG1ldGFfYWMsIDEsCisJCXJldCA9IG9jZnMyX2NsYWltX21ldGFkYXRhKG9zYiwgaGFuZGxlLCBjdHh0LT5tZXRhX2FjLCAxLAogCQkJCQkgICAmc3ViYWxsb2NfYml0X3N0YXJ0LCAmbnVtX2dvdCwKIAkJCQkJICAgJmZpcnN0X2Jsa25vKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKLQkJCWdvdG8gb3V0X2NvbW1pdDsKKwkJCWdvdG8gZW5kOwogCQl9CiAKIAkJbmV3X2JoID0gc2JfZ2V0YmxrKGlub2RlLT5pX3NiLCBmaXJzdF9ibGtubyk7CiAJCW9jZnMyX3NldF9uZXdfYnVmZmVyX3VwdG9kYXRlKGlub2RlLCBuZXdfYmgpOwogCi0JCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIG5ld19iaCwKLQkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfQ1JFQVRFKTsKKwkJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3NfeGIoaGFuZGxlLCBpbm9kZSwgbmV3X2JoLAorCQkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19DUkVBVEUpOwogCQlpZiAocmV0IDwgMCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJZ290byBvdXRfY29tbWl0OworCQkJZ290byBlbmQ7CiAJCX0KIAogCQkvKiBJbml0aWFsaXplIG9jZnMyX3hhdHRyX2Jsb2NrICovCkBAIC0xODc0LDQ0ICsyMTM5LDU1NSBAQAogCQl4cy0+ZW5kID0gKHZvaWQgKil4YmxrICsgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOwogCQl4cy0+aGVyZSA9IHhzLT5oZWFkZXItPnhoX2VudHJpZXM7CiAKLQogCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgbmV3X2JoKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKLQkJCWdvdG8gb3V0X2NvbW1pdDsKKwkJCWdvdG8gZW5kOwogCQl9CiAJCWRpLT5pX3hhdHRyX2xvYyA9IGNwdV90b19sZTY0KGZpcnN0X2Jsa25vKTsKLQkJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHhzLT5pbm9kZV9iaCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJbWxvZ19lcnJubyhyZXQpOwotb3V0X2NvbW1pdDoKLQkJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKLW91dDoKLQkJaWYgKG1ldGFfYWMpCi0JCQlvY2ZzMl9mcmVlX2FsbG9jX2NvbnRleHQobWV0YV9hYyk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKKwkJb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHhzLT5pbm9kZV9iaCk7CiAJfSBlbHNlCiAJCXhibGsgPSAoc3RydWN0IG9jZnMyX3hhdHRyX2Jsb2NrICopeHMtPnhhdHRyX2JoLT5iX2RhdGE7CiAKIAlpZiAoIShsZTE2X3RvX2NwdSh4YmxrLT54Yl9mbGFncykgJiBPQ0ZTMl9YQVRUUl9JTkRFWEVEKSkgewogCQkvKiBTZXQgZXh0ZW5kZWQgYXR0cmlidXRlIGludG8gZXh0ZXJuYWwgYmxvY2sgKi8KLQkJcmV0ID0gb2NmczJfeGF0dHJfc2V0X2VudHJ5KGlub2RlLCB4aSwgeHMsIE9DRlMyX0hBU19YQVRUUl9GTCk7CisJCXJldCA9IG9jZnMyX3hhdHRyX3NldF9lbnRyeShpbm9kZSwgeGksIHhzLCBjdHh0LAorCQkJCQkgICAgT0NGUzJfSEFTX1hBVFRSX0ZMKTsKIAkJaWYgKCFyZXQgfHwgcmV0ICE9IC1FTk9TUEMpCiAJCQlnb3RvIGVuZDsKIAotCQlyZXQgPSBvY2ZzMl94YXR0cl9jcmVhdGVfaW5kZXhfYmxvY2soaW5vZGUsIHhzKTsKKwkJcmV0ID0gb2NmczJfeGF0dHJfY3JlYXRlX2luZGV4X2Jsb2NrKGlub2RlLCB4cywgY3R4dCk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIGVuZDsKIAl9CiAKLQlyZXQgPSBvY2ZzMl94YXR0cl9zZXRfZW50cnlfaW5kZXhfYmxvY2soaW5vZGUsIHhpLCB4cyk7CisJcmV0ID0gb2NmczJfeGF0dHJfc2V0X2VudHJ5X2luZGV4X2Jsb2NrKGlub2RlLCB4aSwgeHMsIGN0eHQpOwogCiBlbmQ6CiAKIAlyZXR1cm4gcmV0OwogfQogCisvKiBDaGVjayB3aGV0aGVyIHRoZSBuZXcgeGF0dHIgY2FuIGJlIGluc2VydGVkIGludG8gdGhlIGlub2RlLiAqLworc3RhdGljIGludCBvY2ZzMl94YXR0cl9jYW5fYmVfaW5faW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgICAgc3RydWN0IG9jZnMyX3hhdHRyX2luZm8gKnhpLAorCQkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cykKK3sKKwl1NjQgdmFsdWVfc2l6ZTsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkgKmxhc3Q7CisJaW50IGZyZWUsIGk7CisJc2l6ZV90IG1pbl9vZmZzID0geHMtPmVuZCAtIHhzLT5iYXNlOworCisJaWYgKCF4cy0+aGVhZGVyKQorCQlyZXR1cm4gMDsKKworCWxhc3QgPSB4cy0+aGVhZGVyLT54aF9lbnRyaWVzOworCisJZm9yIChpID0gMDsgaSA8IGxlMTZfdG9fY3B1KHhzLT5oZWFkZXItPnhoX2NvdW50KTsgaSsrKSB7CisJCXNpemVfdCBvZmZzID0gbGUxNl90b19jcHUobGFzdC0+eGVfbmFtZV9vZmZzZXQpOworCQlpZiAob2ZmcyA8IG1pbl9vZmZzKQorCQkJbWluX29mZnMgPSBvZmZzOworCQlsYXN0ICs9IDE7CisJfQorCisJZnJlZSA9IG1pbl9vZmZzIC0gKCh2b2lkICopbGFzdCAtIHhzLT5iYXNlKSAtIHNpemVvZihfX3UzMik7CisJaWYgKGZyZWUgPCAwKQorCQlyZXR1cm4gMDsKKworCUJVR19PTigheHMtPm5vdF9mb3VuZCk7CisKKwlpZiAoeGktPnZhbHVlX2xlbiA+IE9DRlMyX1hBVFRSX0lOTElORV9TSVpFKQorCQl2YWx1ZV9zaXplID0gT0NGUzJfWEFUVFJfUk9PVF9TSVpFOworCWVsc2UKKwkJdmFsdWVfc2l6ZSA9IE9DRlMyX1hBVFRSX1NJWkUoeGktPnZhbHVlX2xlbik7CisKKwlpZiAoZnJlZSA+PSBzaXplb2Yoc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5KSArCisJCSAgIE9DRlMyX1hBVFRSX1NJWkUoc3RybGVuKHhpLT5uYW1lKSkgKyB2YWx1ZV9zaXplKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9jZnMyX2NhbGNfeGF0dHJfc2V0X25lZWQoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgIHN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpLAorCQkJCSAgICAgc3RydWN0IG9jZnMyX3hhdHRyX2luZm8gKnhpLAorCQkJCSAgICAgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeGlzLAorCQkJCSAgICAgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeGJzLAorCQkJCSAgICAgaW50ICpjbHVzdGVyc19uZWVkLAorCQkJCSAgICAgaW50ICptZXRhX25lZWQsCisJCQkJICAgICBpbnQgKmNyZWRpdHNfbmVlZCkKK3sKKwlpbnQgcmV0ID0gMCwgb2xkX2luX3hiID0gMDsKKwlpbnQgY2x1c3RlcnNfYWRkID0gMCwgbWV0YV9hZGQgPSAwLCBjcmVkaXRzID0gMDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2sgKnhiID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkgKnhlID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCAqeHYgPSBOVUxMOworCWNoYXIgKmJhc2UgPSBOVUxMOworCWludCBuYW1lX29mZnNldCwgbmFtZV9sZW4gPSAwOworCXUzMiBuZXdfY2x1c3RlcnMgPSBvY2ZzMl9jbHVzdGVyc19mb3JfYnl0ZXMoaW5vZGUtPmlfc2IsCisJCQkJCQkgICAgeGktPnZhbHVlX2xlbik7CisJdTY0IHZhbHVlX3NpemU7CisKKwkvKgorCSAqIENhbGN1bGF0ZSB0aGUgY2x1c3RlcnMgd2UgbmVlZCB0byB3cml0ZS4KKwkgKiBObyBtYXR0ZXIgd2hldGhlciB3ZSByZXBsYWNlIGFuIG9sZCBvbmUgb3IgYWRkIGEgbmV3IG9uZSwKKwkgKiB3ZSBuZWVkIHRoaXMgZm9yIHdyaXRpbmcuCisJICovCisJaWYgKHhpLT52YWx1ZV9sZW4gPiBPQ0ZTMl9YQVRUUl9JTkxJTkVfU0laRSkKKwkJY3JlZGl0cyArPSBuZXdfY2x1c3RlcnMgKgorCQkJICAgb2NmczJfY2x1c3RlcnNfdG9fYmxvY2tzKGlub2RlLT5pX3NiLCAxKTsKKworCWlmICh4aXMtPm5vdF9mb3VuZCAmJiB4YnMtPm5vdF9mb3VuZCkgeworCQljcmVkaXRzICs9IG9jZnMyX2Jsb2Nrc19wZXJfeGF0dHJfYnVja2V0KGlub2RlLT5pX3NiKTsKKworCQlpZiAoeGktPnZhbHVlX2xlbiA+IE9DRlMyX1hBVFRSX0lOTElORV9TSVpFKSB7CisJCQljbHVzdGVyc19hZGQgKz0gbmV3X2NsdXN0ZXJzOworCQkJY3JlZGl0cyArPSBvY2ZzMl9jYWxjX2V4dGVuZF9jcmVkaXRzKGlub2RlLT5pX3NiLAorCQkJCQkJCSZkZWZfeHYueHYueHJfbGlzdCwKKwkJCQkJCQluZXdfY2x1c3RlcnMpOworCQl9CisKKwkJZ290byBtZXRhX2d1ZXNzOworCX0KKworCWlmICgheGlzLT5ub3RfZm91bmQpIHsKKwkJeGUgPSB4aXMtPmhlcmU7CisJCW5hbWVfb2Zmc2V0ID0gbGUxNl90b19jcHUoeGUtPnhlX25hbWVfb2Zmc2V0KTsKKwkJbmFtZV9sZW4gPSBPQ0ZTMl9YQVRUUl9TSVpFKHhlLT54ZV9uYW1lX2xlbik7CisJCWJhc2UgPSB4aXMtPmJhc2U7CisJCWNyZWRpdHMgKz0gT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFM7CisJfSBlbHNlIHsKKwkJaW50IGksIGJsb2NrX29mZiA9IDA7CisJCXhiID0gKHN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqKXhicy0+eGF0dHJfYmgtPmJfZGF0YTsKKwkJeGUgPSB4YnMtPmhlcmU7CisJCW5hbWVfb2Zmc2V0ID0gbGUxNl90b19jcHUoeGUtPnhlX25hbWVfb2Zmc2V0KTsKKwkJbmFtZV9sZW4gPSBPQ0ZTMl9YQVRUUl9TSVpFKHhlLT54ZV9uYW1lX2xlbik7CisJCWkgPSB4YnMtPmhlcmUgLSB4YnMtPmhlYWRlci0+eGhfZW50cmllczsKKwkJb2xkX2luX3hiID0gMTsKKworCQlpZiAobGUxNl90b19jcHUoeGItPnhiX2ZsYWdzKSAmIE9DRlMyX1hBVFRSX0lOREVYRUQpIHsKKwkJCXJldCA9IG9jZnMyX3hhdHRyX2J1Y2tldF9nZXRfbmFtZV92YWx1ZShpbm9kZSwKKwkJCQkJCQlidWNrZXRfeGgoeGJzLT5idWNrZXQpLAorCQkJCQkJCWksICZibG9ja19vZmYsCisJCQkJCQkJJm5hbWVfb2Zmc2V0KTsKKwkJCWJhc2UgPSBidWNrZXRfYmxvY2soeGJzLT5idWNrZXQsIGJsb2NrX29mZik7CisJCQljcmVkaXRzICs9IG9jZnMyX2Jsb2Nrc19wZXJfeGF0dHJfYnVja2V0KGlub2RlLT5pX3NiKTsKKwkJfSBlbHNlIHsKKwkJCWJhc2UgPSB4YnMtPmJhc2U7CisJCQljcmVkaXRzICs9IE9DRlMyX1hBVFRSX0JMT0NLX1VQREFURV9DUkVESVRTOworCQl9CisJfQorCisJLyoKKwkgKiBkZWxldGUgYSB4YXR0ciBkb2Vzbid0IG5lZWQgbWV0YWRhdGEgYW5kIGNsdXN0ZXIgYWxsb2NhdGlvbi4KKwkgKiBzbyBqdXN0IGNhbGN1bGF0ZSB0aGUgY3JlZGl0cyBhbmQgcmV0dXJuLgorCSAqCisJICogVGhlIGNyZWRpdHMgZm9yIHJlbW92aW5nIHRoZSB2YWx1ZSB0cmVlIHdpbGwgYmUgZXh0ZW5kZWQKKwkgKiBieSBvY2ZzMl9yZW1vdmVfZXh0ZW50IGl0c2VsZi4KKwkgKi8KKwlpZiAoIXhpLT52YWx1ZSkgeworCQlpZiAoIW9jZnMyX3hhdHRyX2lzX2xvY2FsKHhlKSkKKwkJCWNyZWRpdHMgKz0gb2NmczJfcmVtb3ZlX2V4dGVudF9jcmVkaXRzKGlub2RlLT5pX3NiKTsKKworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBkbyBjbHVzdGVyIGFsbG9jYXRpb24gZ3Vlc3MgZmlyc3QuICovCisJdmFsdWVfc2l6ZSA9IGxlNjRfdG9fY3B1KHhlLT54ZV92YWx1ZV9zaXplKTsKKworCWlmIChvbGRfaW5feGIpIHsKKwkJLyoKKwkJICogSW4geGF0dHIgc2V0LCB3ZSBhbHdheXMgdHJ5IHRvIHNldCB0aGUgeGUgaW4gaW5vZGUgZmlyc3QsCisJCSAqIHNvIGlmIGl0IGNhbiBiZSBpbnNlcnRlZCBpbnRvIGlub2RlIHN1Y2Nlc3NmdWxseSwgdGhlIG9sZAorCQkgKiBvbmUgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIHhhdHRyIGJsb2NrLCBhbmQgdGhpcyB4YXR0cgorCQkgKiB3aWxsIGJlIGluc2VydGVkIGludG8gaW5vZGUgYXMgYSBuZXcgeGF0dHIgaW4gaW5vZGUuCisJCSAqLworCQlpZiAob2NmczJfeGF0dHJfY2FuX2JlX2luX2lub2RlKGlub2RlLCB4aSwgeGlzKSkgeworCQkJY2x1c3RlcnNfYWRkICs9IG5ld19jbHVzdGVyczsKKwkJCWNyZWRpdHMgKz0gb2NmczJfcmVtb3ZlX2V4dGVudF9jcmVkaXRzKGlub2RlLT5pX3NiKSArCisJCQkJICAgIE9DRlMyX0lOT0RFX1VQREFURV9DUkVESVRTOworCQkJaWYgKCFvY2ZzMl94YXR0cl9pc19sb2NhbCh4ZSkpCisJCQkJY3JlZGl0cyArPSBvY2ZzMl9jYWxjX2V4dGVuZF9jcmVkaXRzKAorCQkJCQkJCWlub2RlLT5pX3NiLAorCQkJCQkJCSZkZWZfeHYueHYueHJfbGlzdCwKKwkJCQkJCQluZXdfY2x1c3RlcnMpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpZiAoeGktPnZhbHVlX2xlbiA+IE9DRlMyX1hBVFRSX0lOTElORV9TSVpFKSB7CisJCS8qIHRoZSBuZXcgdmFsdWVzIHdpbGwgYmUgc3RvcmVkIG91dHNpZGUuICovCisJCXUzMiBvbGRfY2x1c3RlcnMgPSAwOworCisJCWlmICghb2NmczJfeGF0dHJfaXNfbG9jYWwoeGUpKSB7CisJCQlvbGRfY2x1c3RlcnMgPQlvY2ZzMl9jbHVzdGVyc19mb3JfYnl0ZXMoaW5vZGUtPmlfc2IsCisJCQkJCQkJCSB2YWx1ZV9zaXplKTsKKwkJCXh2ID0gKHN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9yb290ICopCisJCQkgICAgIChiYXNlICsgbmFtZV9vZmZzZXQgKyBuYW1lX2xlbik7CisJCQl2YWx1ZV9zaXplID0gT0NGUzJfWEFUVFJfUk9PVF9TSVpFOworCQl9IGVsc2UKKwkJCXh2ID0gJmRlZl94di54djsKKworCQlpZiAob2xkX2NsdXN0ZXJzID49IG5ld19jbHVzdGVycykgeworCQkJY3JlZGl0cyArPSBvY2ZzMl9yZW1vdmVfZXh0ZW50X2NyZWRpdHMoaW5vZGUtPmlfc2IpOworCQkJZ290byBvdXQ7CisJCX0gZWxzZSB7CisJCQltZXRhX2FkZCArPSBvY2ZzMl9leHRlbmRfbWV0YV9uZWVkZWQoJnh2LT54cl9saXN0KTsKKwkJCWNsdXN0ZXJzX2FkZCArPSBuZXdfY2x1c3RlcnMgLSBvbGRfY2x1c3RlcnM7CisJCQljcmVkaXRzICs9IG9jZnMyX2NhbGNfZXh0ZW5kX2NyZWRpdHMoaW5vZGUtPmlfc2IsCisJCQkJCQkJICAgICAmeHYtPnhyX2xpc3QsCisJCQkJCQkJICAgICBuZXdfY2x1c3RlcnMgLQorCQkJCQkJCSAgICAgb2xkX2NsdXN0ZXJzKTsKKwkJCWlmICh2YWx1ZV9zaXplID49IE9DRlMyX1hBVFRSX1JPT1RfU0laRSkKKwkJCQlnb3RvIG91dDsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIE5vdyB0aGUgbmV3IHZhbHVlIHdpbGwgYmUgc3RvcmVkIGluc2lkZS4gU28gaWYgdGhlIG5ldworCQkgKiB2YWx1ZSBpcyBzbWFsbGVyIHRoYW4gdGhlIHNpemUgb2YgdmFsdWUgcm9vdCBvciB0aGUgb2xkCisJCSAqIHZhbHVlLCB3ZSBkb24ndCBuZWVkIGFueSBhbGxvY2F0aW9uLCBvdGhlcndpc2Ugd2UgaGF2ZQorCQkgKiB0byBndWVzcyBtZXRhZGF0YSBhbGxvY2F0aW9uLgorCQkgKi8KKwkJaWYgKChvY2ZzMl94YXR0cl9pc19sb2NhbCh4ZSkgJiYgdmFsdWVfc2l6ZSA+PSB4aS0+dmFsdWVfbGVuKSB8fAorCQkgICAgKCFvY2ZzMl94YXR0cl9pc19sb2NhbCh4ZSkgJiYKKwkJICAgICBPQ0ZTMl9YQVRUUl9ST09UX1NJWkUgPj0geGktPnZhbHVlX2xlbikpCisJCQlnb3RvIG91dDsKKwl9CisKK21ldGFfZ3Vlc3M6CisJLyogY2FsY3VsYXRlIG1ldGFkYXRhIGFsbG9jYXRpb24uICovCisJaWYgKGRpLT5pX3hhdHRyX2xvYykgeworCQlpZiAoIXhicy0+eGF0dHJfYmgpIHsKKwkJCXJldCA9IG9jZnMyX3JlYWRfeGF0dHJfYmxvY2soaW5vZGUsCisJCQkJCQkgICAgIGxlNjRfdG9fY3B1KGRpLT5pX3hhdHRyX2xvYyksCisJCQkJCQkgICAgICZiaCk7CisJCQlpZiAocmV0KSB7CisJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQl4YiA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2sgKiliaC0+Yl9kYXRhOworCQl9IGVsc2UKKwkJCXhiID0gKHN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqKXhicy0+eGF0dHJfYmgtPmJfZGF0YTsKKworCQkvKgorCQkgKiBJZiB0aGVyZSBpcyBhbHJlYWR5IGFuIHhhdHRyIHRyZWUsIGdvb2QsIHdlIGNhbiBjYWxjdWxhdGUKKwkJICogbGlrZSBvdGhlciBiLXRyZWVzLiBPdGhlcndpc2Ugd2UgbWF5IGhhdmUgdGhlIGNoYW5jZSBvZgorCQkgKiBjcmVhdGUgYSB0cmVlLCB0aGUgY3JlZGl0IGNhbGN1bGF0aW9uIGlzIGJvcnJvd2VkIGZyb20KKwkJICogb2NmczJfY2FsY19leHRlbmRfY3JlZGl0cyB3aXRoIHJvb3RfZWwgPSBOVUxMLiBBbmQgdGhlCisJCSAqIG5ldyB0cmVlIHdpbGwgYmUgY2x1c3RlciBiYXNlZCwgc28gbm8gbWV0YSBpcyBuZWVkZWQuCisJCSAqLworCQlpZiAobGUxNl90b19jcHUoeGItPnhiX2ZsYWdzKSAmIE9DRlMyX1hBVFRSX0lOREVYRUQpIHsKKwkJCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwgPQorCQkJCSAmeGItPnhiX2F0dHJzLnhiX3Jvb3QueHRfbGlzdDsKKwkJCW1ldGFfYWRkICs9IG9jZnMyX2V4dGVuZF9tZXRhX25lZWRlZChlbCk7CisJCQljcmVkaXRzICs9IG9jZnMyX2NhbGNfZXh0ZW5kX2NyZWRpdHMoaW5vZGUtPmlfc2IsCisJCQkJCQkJICAgICBlbCwgMSk7CisJCX0gZWxzZQorCQkJY3JlZGl0cyArPSBPQ0ZTMl9TVUJBTExPQ19BTExPQyArIDE7CisKKwkJLyoKKwkJICogVGhpcyBjbHVzdGVyIHdpbGwgYmUgdXNlZCBlaXRoZXIgZm9yIG5ldyBidWNrZXQgb3IgZm9yCisJCSAqIG5ldyB4YXR0ciBibG9jay4KKwkJICogSWYgdGhlIGNsdXN0ZXIgc2l6ZSBpcyB0aGUgc2FtZSBhcyB0aGUgYnVja2V0IHNpemUsIG9uZQorCQkgKiBtb3JlIGlzIG5lZWRlZCBzaW5jZSB3ZSBtYXkgbmVlZCB0byBleHRlbmQgdGhlIGJ1Y2tldAorCQkgKiBhbHNvLgorCQkgKi8KKwkJY2x1c3RlcnNfYWRkICs9IDE7CisJCWNyZWRpdHMgKz0gb2NmczJfYmxvY2tzX3Blcl94YXR0cl9idWNrZXQoaW5vZGUtPmlfc2IpOworCQlpZiAoT0NGUzJfWEFUVFJfQlVDS0VUX1NJWkUgPT0KKwkJCU9DRlMyX1NCKGlub2RlLT5pX3NiKS0+c19jbHVzdGVyc2l6ZSkgeworCQkJY3JlZGl0cyArPSBvY2ZzMl9ibG9ja3NfcGVyX3hhdHRyX2J1Y2tldChpbm9kZS0+aV9zYik7CisJCQljbHVzdGVyc19hZGQgKz0gMTsKKwkJfQorCX0gZWxzZSB7CisJCW1ldGFfYWRkICs9IDE7CisJCWNyZWRpdHMgKz0gT0NGUzJfWEFUVFJfQkxPQ0tfQ1JFQVRFX0NSRURJVFM7CisJfQorb3V0OgorCWlmIChjbHVzdGVyc19uZWVkKQorCQkqY2x1c3RlcnNfbmVlZCA9IGNsdXN0ZXJzX2FkZDsKKwlpZiAobWV0YV9uZWVkKQorCQkqbWV0YV9uZWVkID0gbWV0YV9hZGQ7CisJaWYgKGNyZWRpdHNfbmVlZCkKKwkJKmNyZWRpdHNfbmVlZCA9IGNyZWRpdHM7CisJYnJlbHNlKGJoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9jZnMyX2luaXRfeGF0dHJfc2V0X2N0eHQoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgIHN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpLAorCQkJCSAgICAgc3RydWN0IG9jZnMyX3hhdHRyX2luZm8gKnhpLAorCQkJCSAgICAgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeGlzLAorCQkJCSAgICAgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeGJzLAorCQkJCSAgICAgc3RydWN0IG9jZnMyX3hhdHRyX3NldF9jdHh0ICpjdHh0LAorCQkJCSAgICAgaW50ICpjcmVkaXRzKQoreworCWludCBjbHVzdGVyc19hZGQsIG1ldGFfYWRkLCByZXQ7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CisKKwltZW1zZXQoY3R4dCwgMCwgc2l6ZW9mKHN0cnVjdCBvY2ZzMl94YXR0cl9zZXRfY3R4dCkpOworCisJb2NmczJfaW5pdF9kZWFsbG9jX2N0eHQoJmN0eHQtPmRlYWxsb2MpOworCisJcmV0ID0gb2NmczJfY2FsY194YXR0cl9zZXRfbmVlZChpbm9kZSwgZGksIHhpLCB4aXMsIHhicywKKwkJCQkJJmNsdXN0ZXJzX2FkZCwgJm1ldGFfYWRkLCBjcmVkaXRzKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwltbG9nKDAsICJTZXQgeGF0dHIgJXMsIHJlc2VydmUgbWV0YSBibG9ja3MgPSAlZCwgY2x1c3RlcnMgPSAlZCwgIgorCSAgICAgImNyZWRpdHMgPSAlZFxuIiwgeGktPm5hbWUsIG1ldGFfYWRkLCBjbHVzdGVyc19hZGQsICpjcmVkaXRzKTsKKworCWlmIChtZXRhX2FkZCkgeworCQlyZXQgPSBvY2ZzMl9yZXNlcnZlX25ld19tZXRhZGF0YV9ibG9ja3Mob3NiLCBtZXRhX2FkZCwKKwkJCQkJCQkmY3R4dC0+bWV0YV9hYyk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKGNsdXN0ZXJzX2FkZCkgeworCQlyZXQgPSBvY2ZzMl9yZXNlcnZlX2NsdXN0ZXJzKG9zYiwgY2x1c3RlcnNfYWRkLCAmY3R4dC0+ZGF0YV9hYyk7CisJCWlmIChyZXQpCisJCQltbG9nX2Vycm5vKHJldCk7CisJfQorb3V0OgorCWlmIChyZXQpIHsKKwkJaWYgKGN0eHQtPm1ldGFfYWMpIHsKKwkJCW9jZnMyX2ZyZWVfYWxsb2NfY29udGV4dChjdHh0LT5tZXRhX2FjKTsKKwkJCWN0eHQtPm1ldGFfYWMgPSBOVUxMOworCQl9CisKKwkJLyoKKwkJICogV2UgY2Fubm90IGhhdmUgYW4gZXJyb3IgYW5kIGEgbm9uIG51bGwgY3R4dC0+ZGF0YV9hYy4KKwkJICovCisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX29jZnMyX3hhdHRyX3NldF9oYW5kbGUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGksCisJCQkJICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9pbmZvICp4aSwKKwkJCQkgICAgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeGlzLAorCQkJCSAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4YnMsCisJCQkJICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9zZXRfY3R4dCAqY3R4dCkKK3sKKwlpbnQgcmV0ID0gMCwgY3JlZGl0cywgb2xkX2ZvdW5kOworCisJaWYgKCF4aS0+dmFsdWUpIHsKKwkJLyogUmVtb3ZlIGV4aXN0aW5nIGV4dGVuZGVkIGF0dHJpYnV0ZSAqLworCQlpZiAoIXhpcy0+bm90X2ZvdW5kKQorCQkJcmV0ID0gb2NmczJfeGF0dHJfaWJvZHlfc2V0KGlub2RlLCB4aSwgeGlzLCBjdHh0KTsKKwkJZWxzZSBpZiAoIXhicy0+bm90X2ZvdW5kKQorCQkJcmV0ID0gb2NmczJfeGF0dHJfYmxvY2tfc2V0KGlub2RlLCB4aSwgeGJzLCBjdHh0KTsKKwl9IGVsc2UgeworCQkvKiBXZSBhbHdheXMgdHJ5IHRvIHNldCBleHRlbmRlZCBhdHRyaWJ1dGUgaW50byBpbm9kZSBmaXJzdCovCisJCXJldCA9IG9jZnMyX3hhdHRyX2lib2R5X3NldChpbm9kZSwgeGksIHhpcywgY3R4dCk7CisJCWlmICghcmV0ICYmICF4YnMtPm5vdF9mb3VuZCkgeworCQkJLyoKKwkJCSAqIElmIHN1Y2NlZWQgYW5kIHRoYXQgZXh0ZW5kZWQgYXR0cmlidXRlIGV4aXN0aW5nIGluCisJCQkgKiBleHRlcm5hbCBibG9jaywgdGhlbiB3ZSB3aWxsIHJlbW92ZSBpdC4KKwkJCSAqLworCQkJeGktPnZhbHVlID0gTlVMTDsKKwkJCXhpLT52YWx1ZV9sZW4gPSAwOworCisJCQlvbGRfZm91bmQgPSB4aXMtPm5vdF9mb3VuZDsKKwkJCXhpcy0+bm90X2ZvdW5kID0gLUVOT0RBVEE7CisJCQlyZXQgPSBvY2ZzMl9jYWxjX3hhdHRyX3NldF9uZWVkKGlub2RlLAorCQkJCQkJCWRpLAorCQkJCQkJCXhpLAorCQkJCQkJCXhpcywKKwkJCQkJCQl4YnMsCisJCQkJCQkJTlVMTCwKKwkJCQkJCQlOVUxMLAorCQkJCQkJCSZjcmVkaXRzKTsKKwkJCXhpcy0+bm90X2ZvdW5kID0gb2xkX2ZvdW5kOworCQkJaWYgKHJldCkgeworCQkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJcmV0ID0gb2NmczJfZXh0ZW5kX3RyYW5zKGN0eHQtPmhhbmRsZSwgY3JlZGl0cyArCisJCQkJCWN0eHQtPmhhbmRsZS0+aF9idWZmZXJfY3JlZGl0cyk7CisJCQlpZiAocmV0KSB7CisJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJcmV0ID0gb2NmczJfeGF0dHJfYmxvY2tfc2V0KGlub2RlLCB4aSwgeGJzLCBjdHh0KTsKKwkJfSBlbHNlIGlmIChyZXQgPT0gLUVOT1NQQykgeworCQkJaWYgKGRpLT5pX3hhdHRyX2xvYyAmJiAheGJzLT54YXR0cl9iaCkgeworCQkJCXJldCA9IG9jZnMyX3hhdHRyX2Jsb2NrX2ZpbmQoaW5vZGUsCisJCQkJCQkJICAgICB4aS0+bmFtZV9pbmRleCwKKwkJCQkJCQkgICAgIHhpLT5uYW1lLCB4YnMpOworCQkJCWlmIChyZXQpCisJCQkJCWdvdG8gb3V0OworCisJCQkJb2xkX2ZvdW5kID0geGlzLT5ub3RfZm91bmQ7CisJCQkJeGlzLT5ub3RfZm91bmQgPSAtRU5PREFUQTsKKwkJCQlyZXQgPSBvY2ZzMl9jYWxjX3hhdHRyX3NldF9uZWVkKGlub2RlLAorCQkJCQkJCQlkaSwKKwkJCQkJCQkJeGksCisJCQkJCQkJCXhpcywKKwkJCQkJCQkJeGJzLAorCQkJCQkJCQlOVUxMLAorCQkJCQkJCQlOVUxMLAorCQkJCQkJCQkmY3JlZGl0cyk7CisJCQkJeGlzLT5ub3RfZm91bmQgPSBvbGRfZm91bmQ7CisJCQkJaWYgKHJldCkgeworCQkJCQltbG9nX2Vycm5vKHJldCk7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKworCQkJCXJldCA9IG9jZnMyX2V4dGVuZF90cmFucyhjdHh0LT5oYW5kbGUsIGNyZWRpdHMgKworCQkJCQljdHh0LT5oYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHMpOworCQkJCWlmIChyZXQpIHsKKwkJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQl9CisJCQkvKgorCQkJICogSWYgbm8gc3BhY2UgaW4gaW5vZGUsIHdlIHdpbGwgc2V0IGV4dGVuZGVkIGF0dHJpYnV0ZQorCQkJICogaW50byBleHRlcm5hbCBibG9jay4KKwkJCSAqLworCQkJcmV0ID0gb2NmczJfeGF0dHJfYmxvY2tfc2V0KGlub2RlLCB4aSwgeGJzLCBjdHh0KTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBvdXQ7CisJCQlpZiAoIXhpcy0+bm90X2ZvdW5kKSB7CisJCQkJLyoKKwkJCQkgKiBJZiBzdWNjZWVkIGFuZCB0aGF0IGV4dGVuZGVkIGF0dHJpYnV0ZQorCQkJCSAqIGV4aXN0aW5nIGluIGlub2RlLCB3ZSB3aWxsIHJlbW92ZSBpdC4KKwkJCQkgKi8KKwkJCQl4aS0+dmFsdWUgPSBOVUxMOworCQkJCXhpLT52YWx1ZV9sZW4gPSAwOworCQkJCXhicy0+bm90X2ZvdW5kID0gLUVOT0RBVEE7CisJCQkJcmV0ID0gb2NmczJfY2FsY194YXR0cl9zZXRfbmVlZChpbm9kZSwKKwkJCQkJCQkJZGksCisJCQkJCQkJCXhpLAorCQkJCQkJCQl4aXMsCisJCQkJCQkJCXhicywKKwkJCQkJCQkJTlVMTCwKKwkJCQkJCQkJTlVMTCwKKwkJCQkJCQkJJmNyZWRpdHMpOworCQkJCWlmIChyZXQpIHsKKwkJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisKKwkJCQlyZXQgPSBvY2ZzMl9leHRlbmRfdHJhbnMoY3R4dC0+aGFuZGxlLCBjcmVkaXRzICsKKwkJCQkJCWN0eHQtPmhhbmRsZS0+aF9idWZmZXJfY3JlZGl0cyk7CisJCQkJaWYgKHJldCkgeworCQkJCQltbG9nX2Vycm5vKHJldCk7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlyZXQgPSBvY2ZzMl94YXR0cl9pYm9keV9zZXQoaW5vZGUsIHhpLAorCQkJCQkJCSAgICB4aXMsIGN0eHQpOworCQkJfQorCQl9CisJfQorCisJaWYgKCFyZXQpIHsKKwkJLyogVXBkYXRlIGlub2RlIGN0aW1lLiAqLworCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhjdHh0LT5oYW5kbGUsIGlub2RlLCB4aXMtPmlub2RlX2JoLAorCQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CisJCWRpLT5pX2N0aW1lID0gY3B1X3RvX2xlNjQoaW5vZGUtPmlfY3RpbWUudHZfc2VjKTsKKwkJZGktPmlfY3RpbWVfbnNlYyA9IGNwdV90b19sZTMyKGlub2RlLT5pX2N0aW1lLnR2X25zZWMpOworCQlvY2ZzMl9qb3VybmFsX2RpcnR5KGN0eHQtPmhhbmRsZSwgeGlzLT5pbm9kZV9iaCk7CisJfQorb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIG9ubHkgY2FsbGVkIGR1aW5nIGNyZWF0aW5nIGlub2RlCisgKiBmb3IgaW5pdCBzZWN1cml0eS9hY2wgeGF0dHJzIG9mIHRoZSBuZXcgaW5vZGUuCisgKiBBbGwgdHJhbnNhbmN0aW9uIGNyZWRpdHMgaGF2ZSBiZWVuIHJlc2VydmVkIGluIG1rbm9kLgorICovCitpbnQgb2NmczJfeGF0dHJfc2V0X2hhbmRsZShoYW5kbGVfdCAqaGFuZGxlLAorCQkJICAgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgsCisJCQkgICBpbnQgbmFtZV9pbmRleCwKKwkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICBjb25zdCB2b2lkICp2YWx1ZSwKKwkJCSAgIHNpemVfdCB2YWx1ZV9sZW4sCisJCQkgICBpbnQgZmxhZ3MsCisJCQkgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYywKKwkJCSAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICpkYXRhX2FjKQoreworCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpOworCWludCByZXQ7CisKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfaW5mbyB4aSA9IHsKKwkJLm5hbWVfaW5kZXggPSBuYW1lX2luZGV4LAorCQkubmFtZSA9IG5hbWUsCisJCS52YWx1ZSA9IHZhbHVlLAorCQkudmFsdWVfbGVuID0gdmFsdWVfbGVuLAorCX07CisKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoIHhpcyA9IHsKKwkJLm5vdF9mb3VuZCA9IC1FTk9EQVRBLAorCX07CisKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoIHhicyA9IHsKKwkJLm5vdF9mb3VuZCA9IC1FTk9EQVRBLAorCX07CisKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfc2V0X2N0eHQgY3R4dCA9IHsKKwkJLmhhbmRsZSA9IGhhbmRsZSwKKwkJLm1ldGFfYWMgPSBtZXRhX2FjLAorCQkuZGF0YV9hYyA9IGRhdGFfYWMsCisJfTsKKworCWlmICghb2NmczJfc3VwcG9ydHNfeGF0dHIoT0NGUzJfU0IoaW5vZGUtPmlfc2IpKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJLyoKKwkgKiBJbiBleHRyZW1lIHNpdHVhdGlvbiwgbWF5IG5lZWQgeGF0dHIgYnVja2V0IHdoZW4KKwkgKiBibG9jayBzaXplIGlzIHRvbyBzbWFsbC4gQW5kIHdlIGhhdmUgYWxyZWFkeSByZXNlcnZlZAorCSAqIHRoZSBjcmVkaXRzIGZvciBidWNrZXQgaW4gbWtub2QuCisJICovCisJaWYgKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSA9PSBPQ0ZTMl9NSU5fQkxPQ0tTSVpFKSB7CisJCXhicy5idWNrZXQgPSBvY2ZzMl94YXR0cl9idWNrZXRfbmV3KGlub2RlKTsKKwkJaWYgKCF4YnMuYnVja2V0KSB7CisJCQltbG9nX2Vycm5vKC1FTk9NRU0pOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisKKwl4aXMuaW5vZGVfYmggPSB4YnMuaW5vZGVfYmggPSBkaV9iaDsKKwlkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopZGlfYmgtPmJfZGF0YTsKKworCWRvd25fd3JpdGUoJk9DRlMyX0koaW5vZGUpLT5pcF94YXR0cl9zZW0pOworCisJcmV0ID0gb2NmczJfeGF0dHJfaWJvZHlfZmluZChpbm9kZSwgbmFtZV9pbmRleCwgbmFtZSwgJnhpcyk7CisJaWYgKHJldCkKKwkJZ290byBjbGVhbnVwOworCWlmICh4aXMubm90X2ZvdW5kKSB7CisJCXJldCA9IG9jZnMyX3hhdHRyX2Jsb2NrX2ZpbmQoaW5vZGUsIG5hbWVfaW5kZXgsIG5hbWUsICZ4YnMpOworCQlpZiAocmV0KQorCQkJZ290byBjbGVhbnVwOworCX0KKworCXJldCA9IF9fb2NmczJfeGF0dHJfc2V0X2hhbmRsZShpbm9kZSwgZGksICZ4aSwgJnhpcywgJnhicywgJmN0eHQpOworCitjbGVhbnVwOgorCXVwX3dyaXRlKCZPQ0ZTMl9JKGlub2RlKS0+aXBfeGF0dHJfc2VtKTsKKwlicmVsc2UoeGJzLnhhdHRyX2JoKTsKKwlvY2ZzMl94YXR0cl9idWNrZXRfZnJlZSh4YnMuYnVja2V0KTsKKworCXJldHVybiByZXQ7Cit9CisKIC8qCiAgKiBvY2ZzMl94YXR0cl9zZXQoKQogICoKQEAgLTE5MjgsOCArMjcwNCwxMCBAQAogewogCXN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmggPSBOVUxMOwogCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpOwotCWludCByZXQ7Ci0JdTE2IGksIGJsa19wZXJfYnVja2V0ID0gb2NmczJfYmxvY2tzX3Blcl94YXR0cl9idWNrZXQoaW5vZGUtPmlfc2IpOworCWludCByZXQsIGNyZWRpdHM7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CisJc3RydWN0IGlub2RlICp0bF9pbm9kZSA9IG9zYi0+b3NiX3RsX2lub2RlOworCXN0cnVjdCBvY2ZzMl94YXR0cl9zZXRfY3R4dCBjdHh0ID0geyBOVUxMLCBOVUxMLCB9OwogCiAJc3RydWN0IG9jZnMyX3hhdHRyX2luZm8geGkgPSB7CiAJCS5uYW1lX2luZGV4ID0gbmFtZV9pbmRleCwKQEAgLTE5NDksMTAgKzI3MjcsMjAgQEAKIAlpZiAoIW9jZnMyX3N1cHBvcnRzX3hhdHRyKE9DRlMyX1NCKGlub2RlLT5pX3NiKSkpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAorCS8qCisJICogT25seSB4YnMgd2lsbCBiZSB1c2VkIG9uIGluZGV4ZWQgdHJlZXMuICB4aXMgZG9lc24ndCBuZWVkIGEKKwkgKiBidWNrZXQuCisJICovCisJeGJzLmJ1Y2tldCA9IG9jZnMyX3hhdHRyX2J1Y2tldF9uZXcoaW5vZGUpOworCWlmICgheGJzLmJ1Y2tldCkgeworCQltbG9nX2Vycm5vKC1FTk9NRU0pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKIAlyZXQgPSBvY2ZzMl9pbm9kZV9sb2NrKGlub2RlLCAmZGlfYmgsIDEpOwogCWlmIChyZXQgPCAwKSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKLQkJcmV0dXJuIHJldDsKKwkJZ290byBjbGVhbnVwX25vbG9jazsKIAl9CiAJeGlzLmlub2RlX2JoID0geGJzLmlub2RlX2JoID0gZGlfYmg7CiAJZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKWRpX2JoLT5iX2RhdGE7CkBAIC0xOTg0LDU1ICsyNzcyLDUzIEBACiAJCQlnb3RvIGNsZWFudXA7CiAJfQogCi0JaWYgKCF2YWx1ZSkgewotCQkvKiBSZW1vdmUgZXhpc3RpbmcgZXh0ZW5kZWQgYXR0cmlidXRlICovCi0JCWlmICgheGlzLm5vdF9mb3VuZCkKLQkJCXJldCA9IG9jZnMyX3hhdHRyX2lib2R5X3NldChpbm9kZSwgJnhpLCAmeGlzKTsKLQkJZWxzZSBpZiAoIXhicy5ub3RfZm91bmQpCi0JCQlyZXQgPSBvY2ZzMl94YXR0cl9ibG9ja19zZXQoaW5vZGUsICZ4aSwgJnhicyk7Ci0JfSBlbHNlIHsKLQkJLyogV2UgYWx3YXlzIHRyeSB0byBzZXQgZXh0ZW5kZWQgYXR0cmlidXRlIGludG8gaW5vZGUgZmlyc3QqLwotCQlyZXQgPSBvY2ZzMl94YXR0cl9pYm9keV9zZXQoaW5vZGUsICZ4aSwgJnhpcyk7Ci0JCWlmICghcmV0ICYmICF4YnMubm90X2ZvdW5kKSB7Ci0JCQkvKgotCQkJICogSWYgc3VjY2VlZCBhbmQgdGhhdCBleHRlbmRlZCBhdHRyaWJ1dGUgZXhpc3RpbmcgaW4KLQkJCSAqIGV4dGVybmFsIGJsb2NrLCB0aGVuIHdlIHdpbGwgcmVtb3ZlIGl0LgotCQkJICovCi0JCQl4aS52YWx1ZSA9IE5VTEw7Ci0JCQl4aS52YWx1ZV9sZW4gPSAwOwotCQkJcmV0ID0gb2NmczJfeGF0dHJfYmxvY2tfc2V0KGlub2RlLCAmeGksICZ4YnMpOwotCQl9IGVsc2UgaWYgKHJldCA9PSAtRU5PU1BDKSB7Ci0JCQlpZiAoZGktPmlfeGF0dHJfbG9jICYmICF4YnMueGF0dHJfYmgpIHsKLQkJCQlyZXQgPSBvY2ZzMl94YXR0cl9ibG9ja19maW5kKGlub2RlLCBuYW1lX2luZGV4LAotCQkJCQkJCSAgICAgbmFtZSwgJnhicyk7Ci0JCQkJaWYgKHJldCkKLQkJCQkJZ290byBjbGVhbnVwOwotCQkJfQotCQkJLyoKLQkJCSAqIElmIG5vIHNwYWNlIGluIGlub2RlLCB3ZSB3aWxsIHNldCBleHRlbmRlZCBhdHRyaWJ1dGUKLQkJCSAqIGludG8gZXh0ZXJuYWwgYmxvY2suCi0JCQkgKi8KLQkJCXJldCA9IG9jZnMyX3hhdHRyX2Jsb2NrX3NldChpbm9kZSwgJnhpLCAmeGJzKTsKLQkJCWlmIChyZXQpCi0JCQkJZ290byBjbGVhbnVwOwotCQkJaWYgKCF4aXMubm90X2ZvdW5kKSB7Ci0JCQkJLyoKLQkJCQkgKiBJZiBzdWNjZWVkIGFuZCB0aGF0IGV4dGVuZGVkIGF0dHJpYnV0ZQotCQkJCSAqIGV4aXN0aW5nIGluIGlub2RlLCB3ZSB3aWxsIHJlbW92ZSBpdC4KLQkJCQkgKi8KLQkJCQl4aS52YWx1ZSA9IE5VTEw7Ci0JCQkJeGkudmFsdWVfbGVuID0gMDsKLQkJCQlyZXQgPSBvY2ZzMl94YXR0cl9pYm9keV9zZXQoaW5vZGUsICZ4aSwgJnhpcyk7Ci0JCQl9CisKKwltdXRleF9sb2NrKCZ0bF9pbm9kZS0+aV9tdXRleCk7CisKKwlpZiAob2NmczJfdHJ1bmNhdGVfbG9nX25lZWRzX2ZsdXNoKG9zYikpIHsKKwkJcmV0ID0gX19vY2ZzMl9mbHVzaF90cnVuY2F0ZV9sb2cob3NiKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCW11dGV4X3VubG9jaygmdGxfaW5vZGUtPmlfbXV0ZXgpOworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBjbGVhbnVwOwogCQl9CiAJfQorCW11dGV4X3VubG9jaygmdGxfaW5vZGUtPmlfbXV0ZXgpOworCisJcmV0ID0gb2NmczJfaW5pdF94YXR0cl9zZXRfY3R4dChpbm9kZSwgZGksICZ4aSwgJnhpcywKKwkJCQkJJnhicywgJmN0eHQsICZjcmVkaXRzKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qIHdlIG5lZWQgdG8gdXBkYXRlIGlub2RlJ3MgY3RpbWUgZmllbGQsIHNvIGFkZCBjcmVkaXQgZm9yIGl0LiAqLworCWNyZWRpdHMgKz0gT0NGUzJfSU5PREVfVVBEQVRFX0NSRURJVFM7CisJY3R4dC5oYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIGNyZWRpdHMpOworCWlmIChJU19FUlIoY3R4dC5oYW5kbGUpKSB7CisJCXJldCA9IFBUUl9FUlIoY3R4dC5oYW5kbGUpOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlyZXQgPSBfX29jZnMyX3hhdHRyX3NldF9oYW5kbGUoaW5vZGUsIGRpLCAmeGksICZ4aXMsICZ4YnMsICZjdHh0KTsKKworCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGN0eHQuaGFuZGxlKTsKKworCWlmIChjdHh0LmRhdGFfYWMpCisJCW9jZnMyX2ZyZWVfYWxsb2NfY29udGV4dChjdHh0LmRhdGFfYWMpOworCWlmIChjdHh0Lm1ldGFfYWMpCisJCW9jZnMyX2ZyZWVfYWxsb2NfY29udGV4dChjdHh0Lm1ldGFfYWMpOworCWlmIChvY2ZzMl9kZWFsbG9jX2hhc19jbHVzdGVyKCZjdHh0LmRlYWxsb2MpKQorCQlvY2ZzMl9zY2hlZHVsZV90cnVuY2F0ZV9sb2dfZmx1c2gob3NiLCAxKTsKKwlvY2ZzMl9ydW5fZGVhbGxvY3Mob3NiLCAmY3R4dC5kZWFsbG9jKTsKIGNsZWFudXA6CiAJdXBfd3JpdGUoJk9DRlMyX0koaW5vZGUpLT5pcF94YXR0cl9zZW0pOwogCW9jZnMyX2lub2RlX3VubG9jayhpbm9kZSwgMSk7CitjbGVhbnVwX25vbG9jazoKIAlicmVsc2UoZGlfYmgpOwogCWJyZWxzZSh4YnMueGF0dHJfYmgpOwotCWZvciAoaSA9IDA7IGkgPCBibGtfcGVyX2J1Y2tldDsgaSsrKQotCQlicmVsc2UoeGJzLmJ1Y2tldC5iaHNbaV0pOworCW9jZnMyX3hhdHRyX2J1Y2tldF9mcmVlKHhicy5idWNrZXQpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTIxMDcsNyArMjg5Myw3IEBACiAJCQkJdm9pZCAqcGFyYSk7CiAKIHN0YXRpYyBpbnQgb2NmczJfZmluZF94ZV9pbl9idWNrZXQoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWRlcl9iaCwKKwkJCQkgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfYnVja2V0ICpidWNrZXQsCiAJCQkJICAgaW50IG5hbWVfaW5kZXgsCiAJCQkJICAgY29uc3QgY2hhciAqbmFtZSwKIAkJCQkgICB1MzIgbmFtZV9oYXNoLApAQCAtMjExNSwxMSArMjkwMSw5IEBACiAJCQkJICAgaW50ICpmb3VuZCkKIHsKIAlpbnQgaSwgcmV0ID0gMCwgY21wID0gMSwgYmxvY2tfb2ZmLCBuZXdfb2Zmc2V0OwotCXN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKnhoID0KLQkJCShzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICopaGVhZGVyX2JoLT5iX2RhdGE7CisJc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqeGggPSBidWNrZXRfeGgoYnVja2V0KTsKIAlzaXplX3QgbmFtZV9sZW4gPSBzdHJsZW4obmFtZSk7CiAJc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICp4ZSA9IE5VTEw7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpuYW1lX2JoID0gTlVMTDsKIAljaGFyICp4ZV9uYW1lOwogCiAJLyoKQEAgLTIxNTAsMTkgKzI5MzQsOSBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBoZWFkZXJfYmgtPmJfYmxvY2tuciArIGJsb2NrX29mZiwKLQkJCQkgICAgICAgJm5hbWVfYmgpOwotCQlpZiAocmV0KSB7Ci0JCQltbG9nX2Vycm5vKHJldCk7Ci0JCQlicmVhazsKLQkJfQotCQl4ZV9uYW1lID0gbmFtZV9iaC0+Yl9kYXRhICsgbmV3X29mZnNldDsKIAotCQljbXAgPSBtZW1jbXAobmFtZSwgeGVfbmFtZSwgbmFtZV9sZW4pOwotCQlicmVsc2UobmFtZV9iaCk7Ci0JCW5hbWVfYmggPSBOVUxMOwotCi0JCWlmIChjbXAgPT0gMCkgeworCQl4ZV9uYW1lID0gYnVja2V0X2Jsb2NrKGJ1Y2tldCwgYmxvY2tfb2ZmKSArIG5ld19vZmZzZXQ7CisJCWlmICghbWVtY21wKG5hbWUsIHhlX25hbWUsIG5hbWVfbGVuKSkgewogCQkJKnhlX2luZGV4ID0gaTsKIAkJCSpmb3VuZCA9IDE7CiAJCQlyZXQgPSAwOwpAQCAtMjE5MiwzOSArMjk2Niw0MiBAQAogCQkJCSAgIHN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggKnhzKQogewogCWludCByZXQsIGZvdW5kID0gMDsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmxvd2VyX2JoID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICp4aCA9IE5VTEw7CiAJc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICp4ZSA9IE5VTEw7CiAJdTE2IGluZGV4ID0gMDsKIAl1MTYgYmxrX3Blcl9idWNrZXQgPSBvY2ZzMl9ibG9ja3NfcGVyX3hhdHRyX2J1Y2tldChpbm9kZS0+aV9zYik7CiAJaW50IGxvd19idWNrZXQgPSAwLCBidWNrZXQsIGhpZ2hfYnVja2V0OworCXN0cnVjdCBvY2ZzMl94YXR0cl9idWNrZXQgKnNlYXJjaDsKIAl1MzIgbGFzdF9oYXNoOwotCXU2NCBibGtubzsKKwl1NjQgYmxrbm8sIGxvd2VyX2Jsa25vID0gMDsKIAotCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIHBfYmxrbm8sICZiaCk7CisJc2VhcmNoID0gb2NmczJfeGF0dHJfYnVja2V0X25ldyhpbm9kZSk7CisJaWYgKCFzZWFyY2gpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBvY2ZzMl9yZWFkX3hhdHRyX2J1Y2tldChzZWFyY2gsIHBfYmxrbm8pOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dDsKIAl9CiAKLQl4aCA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICopYmgtPmJfZGF0YTsKKwl4aCA9IGJ1Y2tldF94aChzZWFyY2gpOwogCWhpZ2hfYnVja2V0ID0gbGUxNl90b19jcHUoeGgtPnhoX251bV9idWNrZXRzKSAtIDE7Ci0KIAl3aGlsZSAobG93X2J1Y2tldCA8PSBoaWdoX2J1Y2tldCkgewotCQlicmVsc2UoYmgpOwotCQliaCA9IE5VTEw7CisJCW9jZnMyX3hhdHRyX2J1Y2tldF9yZWxzZShzZWFyY2gpOworCiAJCWJ1Y2tldCA9IChsb3dfYnVja2V0ICsgaGlnaF9idWNrZXQpIC8gMjsKLQogCQlibGtubyA9IHBfYmxrbm8gKyBidWNrZXQgKiBibGtfcGVyX2J1Y2tldDsKLQotCQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2NrKGlub2RlLCBibGtubywgJmJoKTsKKwkJcmV0ID0gb2NmczJfcmVhZF94YXR0cl9idWNrZXQoc2VhcmNoLCBibGtubyk7CiAJCWlmIChyZXQpIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCWdvdG8gb3V0OwogCQl9CiAKLQkJeGggPSAoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqKWJoLT5iX2RhdGE7CisJCXhoID0gYnVja2V0X3hoKHNlYXJjaCk7CiAJCXhlID0gJnhoLT54aF9lbnRyaWVzWzBdOwogCQlpZiAobmFtZV9oYXNoIDwgbGUzMl90b19jcHUoeGUtPnhlX25hbWVfaGFzaCkpIHsKIAkJCWhpZ2hfYnVja2V0ID0gYnVja2V0IC0gMTsKQEAgLTIyNDEsMTAgKzMwMTgsOCBAQAogCiAJCWxhc3RfaGFzaCA9IGxlMzJfdG9fY3B1KHhlLT54ZV9uYW1lX2hhc2gpOwogCi0JCS8qIHJlY29yZCBsb3dlcl9iaCB3aGljaCBtYXkgYmUgdGhlIGluc2VydCBwbGFjZS4gKi8KLQkJYnJlbHNlKGxvd2VyX2JoKTsKLQkJbG93ZXJfYmggPSBiaDsKLQkJYmggPSBOVUxMOworCQkvKiByZWNvcmQgbG93ZXJfYmxrbm8gd2hpY2ggbWF5IGJlIHRoZSBpbnNlcnQgcGxhY2UuICovCisJCWxvd2VyX2Jsa25vID0gYmxrbm87CiAKIAkJaWYgKG5hbWVfaGFzaCA+IGxlMzJfdG9fY3B1KHhlLT54ZV9uYW1lX2hhc2gpKSB7CiAJCQlsb3dfYnVja2V0ID0gYnVja2V0ICsgMTsKQEAgLTIyNTIsNyArMzAyNyw3IEBACiAJCX0KIAogCQkvKiB0aGUgc2VhcmNoZWQgeGF0dHIgc2hvdWxkIHJlc2lkZSBpbiB0aGlzIGJ1Y2tldCBpZiBleGlzdHMuICovCi0JCXJldCA9IG9jZnMyX2ZpbmRfeGVfaW5fYnVja2V0KGlub2RlLCBsb3dlcl9iaCwKKwkJcmV0ID0gb2NmczJfZmluZF94ZV9pbl9idWNrZXQoaW5vZGUsIHNlYXJjaCwKIAkJCQkJICAgICAgbmFtZV9pbmRleCwgbmFtZSwgbmFtZV9oYXNoLAogCQkJCQkgICAgICAmaW5kZXgsICZmb3VuZCk7CiAJCWlmIChyZXQpIHsKQEAgLTIyNjcsNDYgKzMwNDIsMjkgQEAKIAkgKiBXaGVuIHRoZSB4YXR0cidzIGhhc2ggdmFsdWUgaXMgaW4gdGhlIGdhcCBvZiAyIGJ1Y2tldHMsIHdlIHdpbGwKIAkgKiBhbHdheXMgc2V0IGl0IHRvIHRoZSBwcmV2aW91cyBidWNrZXQuCiAJICovCi0JaWYgKCFsb3dlcl9iaCkgewotCQkvKgotCQkgKiBXZSBjYW4ndCBmaW5kIGFueSBidWNrZXQgd2hvc2UgZmlyc3QgbmFtZV9oYXNoIGlzIGxlc3MKLQkJICogdGhhbiB0aGUgZmluZCBuYW1lX2hhc2guCi0JCSAqLwotCQlCVUdfT04oYmgtPmJfYmxvY2tuciAhPSBwX2Jsa25vKTsKLQkJbG93ZXJfYmggPSBiaDsKLQkJYmggPSBOVUxMOwotCX0KLQl4cy0+YnVja2V0LmJoc1swXSA9IGxvd2VyX2JoOwotCXhzLT5idWNrZXQueGggPSAoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqKQotCQkJCQl4cy0+YnVja2V0LmJoc1swXS0+Yl9kYXRhOwotCWxvd2VyX2JoID0gTlVMTDsKKwlpZiAoIWxvd2VyX2Jsa25vKQorCQlsb3dlcl9ibGtubyA9IHBfYmxrbm87CiAKLQl4cy0+aGVhZGVyID0geHMtPmJ1Y2tldC54aDsKLQl4cy0+YmFzZSA9IHhzLT5idWNrZXQuYmhzWzBdLT5iX2RhdGE7CisJLyogVGhpcyBzaG91bGQgYmUgaW4gY2FjaGUgLSB3ZSBqdXN0IHJlYWQgaXQgZHVyaW5nIHRoZSBzZWFyY2ggKi8KKwlyZXQgPSBvY2ZzMl9yZWFkX3hhdHRyX2J1Y2tldCh4cy0+YnVja2V0LCBsb3dlcl9ibGtubyk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXhzLT5oZWFkZXIgPSBidWNrZXRfeGgoeHMtPmJ1Y2tldCk7CisJeHMtPmJhc2UgPSBidWNrZXRfYmxvY2soeHMtPmJ1Y2tldCwgMCk7CiAJeHMtPmVuZCA9IHhzLT5iYXNlICsgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOwogCiAJaWYgKGZvdW5kKSB7Ci0JCS8qCi0JCSAqIElmIHdlIGhhdmUgZm91bmQgdGhlIHhhdHRyIGVudHksIHJlYWQgYWxsIHRoZSBibG9ja3MgaW4KLQkJICogdGhpcyBidWNrZXQuCi0JCSAqLwotCQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2Nrcyhpbm9kZSwgeHMtPmJ1Y2tldC5iaHNbMF0tPmJfYmxvY2tuciArIDEsCi0JCQkJCWJsa19wZXJfYnVja2V0IC0gMSwgJnhzLT5idWNrZXQuYmhzWzFdLAotCQkJCQkwKTsKLQkJaWYgKHJldCkgewotCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQogCQl4cy0+aGVyZSA9ICZ4cy0+aGVhZGVyLT54aF9lbnRyaWVzW2luZGV4XTsKIAkJbWxvZygwLCAiZmluZCB4YXR0ciAlcyBpbiBidWNrZXQgJWxsdSwgZW50cnkgPSAldVxuIiwgbmFtZSwKLQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKXhzLT5idWNrZXQuYmhzWzBdLT5iX2Jsb2NrbnIsIGluZGV4KTsKKwkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJ1Y2tldF9ibGtubyh4cy0+YnVja2V0KSwgaW5kZXgpOwogCX0gZWxzZQogCQlyZXQgPSAtRU5PREFUQTsKIAogb3V0OgotCWJyZWxzZShiaCk7Ci0JYnJlbHNlKGxvd2VyX2JoKTsKKwlvY2ZzMl94YXR0cl9idWNrZXRfZnJlZShzZWFyY2gpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTIzNTcsNTMgKzMxMTUsNTAgQEAKIAkJCQkgICAgICAgeGF0dHJfYnVja2V0X2Z1bmMgKmZ1bmMsCiAJCQkJICAgICAgIHZvaWQgKnBhcmEpCiB7Ci0JaW50IGksIGosIHJldCA9IDA7Ci0JaW50IGJsa19wZXJfYnVja2V0ID0gb2NmczJfYmxvY2tzX3Blcl94YXR0cl9idWNrZXQoaW5vZGUtPmlfc2IpOworCWludCBpLCByZXQgPSAwOwogCXUzMiBicGMgPSBvY2ZzMl94YXR0cl9idWNrZXRzX3Blcl9jbHVzdGVyKE9DRlMyX1NCKGlub2RlLT5pX3NiKSk7CiAJdTMyIG51bV9idWNrZXRzID0gY2x1c3RlcnMgKiBicGM7Ci0Jc3RydWN0IG9jZnMyX3hhdHRyX2J1Y2tldCBidWNrZXQ7CisJc3RydWN0IG9jZnMyX3hhdHRyX2J1Y2tldCAqYnVja2V0OwogCi0JbWVtc2V0KCZidWNrZXQsIDAsIHNpemVvZihidWNrZXQpKTsKKwlidWNrZXQgPSBvY2ZzMl94YXR0cl9idWNrZXRfbmV3KGlub2RlKTsKKwlpZiAoIWJ1Y2tldCkgeworCQltbG9nX2Vycm5vKC1FTk9NRU0pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CiAKIAltbG9nKDAsICJpdGVyYXRpbmcgeGF0dHIgYnVja2V0cyBpbiAldSBjbHVzdGVycyBzdGFydGluZyBmcm9tICVsbHVcbiIsCiAJICAgICBjbHVzdGVycywgKHVuc2lnbmVkIGxvbmcgbG9uZylibGtubyk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2J1Y2tldHM7IGkrKywgYmxrbm8gKz0gYmxrX3Blcl9idWNrZXQpIHsKLQkJcmV0ID0gb2NmczJfcmVhZF9ibG9ja3MoaW5vZGUsIGJsa25vLCBibGtfcGVyX2J1Y2tldCwKLQkJCQkJYnVja2V0LmJocywgMCk7CisJZm9yIChpID0gMDsgaSA8IG51bV9idWNrZXRzOyBpKyssIGJsa25vICs9IGJ1Y2tldC0+YnVfYmxvY2tzKSB7CisJCXJldCA9IG9jZnMyX3JlYWRfeGF0dHJfYnVja2V0KGJ1Y2tldCwgYmxrbm8pOwogCQlpZiAocmV0KSB7CiAJCQltbG9nX2Vycm5vKHJldCk7Ci0JCQlnb3RvIG91dDsKKwkJCWJyZWFrOwogCQl9CiAKLQkJYnVja2V0LnhoID0gKHN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKilidWNrZXQuYmhzWzBdLT5iX2RhdGE7CiAJCS8qCiAJCSAqIFRoZSByZWFsIGJ1Y2tldCBudW0gaW4gdGhpcyBzZXJpZXMgb2YgYmxvY2tzIGlzIHN0b3JlZAogCQkgKiBpbiB0aGUgMXN0IGJ1Y2tldC4KIAkJICovCiAJCWlmIChpID09IDApCi0JCQludW1fYnVja2V0cyA9IGxlMTZfdG9fY3B1KGJ1Y2tldC54aC0+eGhfbnVtX2J1Y2tldHMpOworCQkJbnVtX2J1Y2tldHMgPSBsZTE2X3RvX2NwdShidWNrZXRfeGgoYnVja2V0KS0+eGhfbnVtX2J1Y2tldHMpOwogCiAJCW1sb2coMCwgIml0ZXJhdGluZyB4YXR0ciBidWNrZXQgJWxsdSwgZmlyc3QgaGFzaCAldVxuIiwKIAkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJsa25vLAotCQkgICAgIGxlMzJfdG9fY3B1KGJ1Y2tldC54aC0+eGhfZW50cmllc1swXS54ZV9uYW1lX2hhc2gpKTsKKwkJICAgICBsZTMyX3RvX2NwdShidWNrZXRfeGgoYnVja2V0KS0+eGhfZW50cmllc1swXS54ZV9uYW1lX2hhc2gpKTsKIAkJaWYgKGZ1bmMpIHsKLQkJCXJldCA9IGZ1bmMoaW5vZGUsICZidWNrZXQsIHBhcmEpOwotCQkJaWYgKHJldCkgeworCQkJcmV0ID0gZnVuYyhpbm9kZSwgYnVja2V0LCBwYXJhKTsKKwkJCWlmIChyZXQpCiAJCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJCWJyZWFrOwotCQkJfQorCQkJLyogRmFsbCB0aHJvdWdoIHRvIGJ1Y2tldF9yZWxzZSgpICovCiAJCX0KIAotCQlmb3IgKGogPSAwOyBqIDwgYmxrX3Blcl9idWNrZXQ7IGorKykKLQkJCWJyZWxzZShidWNrZXQuYmhzW2pdKTsKLQkJbWVtc2V0KCZidWNrZXQsIDAsIHNpemVvZihidWNrZXQpKTsKKwkJb2NmczJfeGF0dHJfYnVja2V0X3JlbHNlKGJ1Y2tldCk7CisJCWlmIChyZXQpCisJCQlicmVhazsKIAl9CiAKLW91dDoKLQlmb3IgKGogPSAwOyBqIDwgYmxrX3Blcl9idWNrZXQ7IGorKykKLQkJYnJlbHNlKGJ1Y2tldC5iaHNbal0pOwotCisJb2NmczJfeGF0dHJfYnVja2V0X2ZyZWUoYnVja2V0KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0yNDQxLDIxICszMTk2LDIxIEBACiAJaW50IGksIGJsb2NrX29mZiwgbmV3X29mZnNldDsKIAljb25zdCBjaGFyICpwcmVmaXgsICpuYW1lOwogCi0JZm9yIChpID0gMCA7IGkgPCBsZTE2X3RvX2NwdShidWNrZXQtPnhoLT54aF9jb3VudCk7IGkrKykgewotCQlzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkgKmVudHJ5ID0gJmJ1Y2tldC0+eGgtPnhoX2VudHJpZXNbaV07CisJZm9yIChpID0gMCA7IGkgPCBsZTE2X3RvX2NwdShidWNrZXRfeGgoYnVja2V0KS0+eGhfY291bnQpOyBpKyspIHsKKwkJc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICplbnRyeSA9ICZidWNrZXRfeGgoYnVja2V0KS0+eGhfZW50cmllc1tpXTsKIAkJdHlwZSA9IG9jZnMyX3hhdHRyX2dldF90eXBlKGVudHJ5KTsKIAkJcHJlZml4ID0gb2NmczJfeGF0dHJfcHJlZml4KHR5cGUpOwogCiAJCWlmIChwcmVmaXgpIHsKIAkJCXJldCA9IG9jZnMyX3hhdHRyX2J1Y2tldF9nZXRfbmFtZV92YWx1ZShpbm9kZSwKLQkJCQkJCQkJYnVja2V0LT54aCwKKwkJCQkJCQkJYnVja2V0X3hoKGJ1Y2tldCksCiAJCQkJCQkJCWksCiAJCQkJCQkJCSZibG9ja19vZmYsCiAJCQkJCQkJCSZuZXdfb2Zmc2V0KTsKIAkJCWlmIChyZXQpCiAJCQkJYnJlYWs7CiAKLQkJCW5hbWUgPSAoY29uc3QgY2hhciAqKWJ1Y2tldC0+YmhzW2Jsb2NrX29mZl0tPmJfZGF0YSArCisJCQluYW1lID0gKGNvbnN0IGNoYXIgKilidWNrZXRfYmxvY2soYnVja2V0LCBibG9ja19vZmYpICsKIAkJCQluZXdfb2Zmc2V0OwogCQkJcmV0ID0gb2NmczJfeGF0dHJfbGlzdF9lbnRyeSh4bC0+YnVmZmVyLAogCQkJCQkJICAgICB4bC0+YnVmZmVyX3NpemUsCkBAIC0yNTQwLDMyICszMjk1LDM0IEBACiAvKgogICogV2hlbiB0aGUgb2NmczJfeGF0dHJfYmxvY2sgaXMgZmlsbGVkIHVwLCBuZXcgYnVja2V0IHdpbGwgYmUgY3JlYXRlZAogICogYW5kIGFsbCB0aGUgeGF0dHIgZW50cmllcyB3aWxsIGJlIG1vdmVkIHRvIHRoZSBuZXcgYnVja2V0LgorICogVGhlIGhlYWRlciBnb2VzIGF0IHRoZSBzdGFydCBvZiB0aGUgYnVja2V0LCBhbmQgdGhlIG5hbWVzK3ZhbHVlcyBhcmUKKyAqIGZpbGxlZCBmcm9tIHRoZSBlbmQuICBUaGlzIGlzIHdoeSAqdGFyZ2V0IHN0YXJ0cyBhcyB0aGUgbGFzdCBidWZmZXIuCiAgKiBOb3RlOiB3ZSBuZWVkIHRvIHNvcnQgdGhlIGVudHJpZXMgc2luY2UgdGhleSBhcmUgbm90IHNhdmVkIGluIG9yZGVyCiAgKiBpbiB0aGUgb2NmczJfeGF0dHJfYmxvY2suCiAgKi8KIHN0YXRpYyB2b2lkIG9jZnMyX2NwX3hhdHRyX2Jsb2NrX3RvX2J1Y2tldChzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnhiX2JoLAotCQkJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnhoX2JoLAotCQkJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRhdGFfYmgpCisJCQkJCSAgIHN0cnVjdCBvY2ZzMl94YXR0cl9idWNrZXQgKmJ1Y2tldCkKIHsKIAlpbnQgaSwgYmxvY2tzaXplID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworCWludCBibGtzID0gb2NmczJfYmxvY2tzX3Blcl94YXR0cl9idWNrZXQoaW5vZGUtPmlfc2IpOwogCXUxNiBvZmZzZXQsIHNpemUsIG9mZl9jaGFuZ2U7CiAJc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICp4ZTsKIAlzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2sgKnhiID0KIAkJCQkoc3RydWN0IG9jZnMyX3hhdHRyX2Jsb2NrICopeGJfYmgtPmJfZGF0YTsKIAlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICp4Yl94aCA9ICZ4Yi0+eGJfYXR0cnMueGJfaGVhZGVyOwotCXN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKnhoID0KLQkJCQkoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqKXhoX2JoLT5iX2RhdGE7CisJc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqeGggPSBidWNrZXRfeGgoYnVja2V0KTsKIAl1MTYgY291bnQgPSBsZTE2X3RvX2NwdSh4Yl94aC0+eGhfY291bnQpOwotCWNoYXIgKnRhcmdldCA9IHhoX2JoLT5iX2RhdGEsICpzcmMgPSB4Yl9iaC0+Yl9kYXRhOworCWNoYXIgKnNyYyA9IHhiX2JoLT5iX2RhdGE7CisJY2hhciAqdGFyZ2V0ID0gYnVja2V0X2Jsb2NrKGJ1Y2tldCwgYmxrcyAtIDEpOwogCiAJbWxvZygwLCAiY3AgeGF0dHIgZnJvbSBibG9jayAlbGx1IHRvIGJ1Y2tldCAlbGx1XG4iLAogCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl4Yl9iaC0+Yl9ibG9ja25yLAotCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl4aF9iaC0+Yl9ibG9ja25yKTsKKwkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYnVja2V0X2Jsa25vKGJ1Y2tldCkpOwogCi0JbWVtc2V0KHhoX2JoLT5iX2RhdGEsIDAsIGJsb2Nrc2l6ZSk7Ci0JaWYgKGRhdGFfYmgpCi0JCW1lbXNldChkYXRhX2JoLT5iX2RhdGEsIDAsIGJsb2Nrc2l6ZSk7CisJZm9yIChpID0gMDsgaSA8IGJsa3M7IGkrKykKKwkJbWVtc2V0KGJ1Y2tldF9ibG9jayhidWNrZXQsIGkpLCAwLCBibG9ja3NpemUpOworCiAJLyoKIAkgKiBTaW5jZSB0aGUgeGVfbmFtZV9vZmZzZXQgaXMgYmFzZWQgb24gb2NmczJfeGF0dHJfaGVhZGVyLAogCSAqIHRoZXJlIGlzIGEgb2Zmc2V0IGNoYW5nZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBjaGFuZ2Ugb2YKQEAgLTI1NzcsOCArMzMzNCw2IEBACiAJc2l6ZSA9IGJsb2Nrc2l6ZSAtIG9mZnNldDsKIAogCS8qIGNvcHkgYWxsIHRoZSBuYW1lcyBhbmQgdmFsdWVzLiAqLwotCWlmIChkYXRhX2JoKQotCQl0YXJnZXQgPSBkYXRhX2JoLT5iX2RhdGE7CiAJbWVtY3B5KHRhcmdldCArIG9mZnNldCwgc3JjICsgb2Zmc2V0LCBzaXplKTsKIAogCS8qIEluaXQgbmV3IGhlYWRlciBub3cuICovCkBAIC0yNTg4LDcgKzMzNDMsNyBAQAogCXhoLT54aF9mcmVlX3N0YXJ0ID0gY3B1X3RvX2xlMTYoT0NGUzJfWEFUVFJfQlVDS0VUX1NJWkUgLSBzaXplKTsKIAogCS8qIGNvcHkgYWxsIHRoZSBlbnRyaWVzLiAqLwotCXRhcmdldCA9IHhoX2JoLT5iX2RhdGE7CisJdGFyZ2V0ID0gYnVja2V0X2Jsb2NrKGJ1Y2tldCwgMCk7CiAJb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciwgeGhfZW50cmllcyk7CiAJc2l6ZSA9IGNvdW50ICogc2l6ZW9mKHN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSk7CiAJbWVtY3B5KHRhcmdldCArIG9mZnNldCwgKGNoYXIgKil4Yl94aCArIG9mZnNldCwgc2l6ZSk7CkBAIC0yNjE0LDczICszMzY5LDQ3IEBACiAgKiBXaGlsZSBpZiB0aGUgZW50cnkgaXMgaW4gaW5kZXggYi10cmVlLCAiYnVja2V0IiBpbmRpY2F0ZXMgdGhlCiAgKiByZWFsIHBsYWNlIG9mIHRoZSB4YXR0ci4KICAqLwotc3RhdGljIGludCBvY2ZzMl94YXR0cl91cGRhdGVfeGF0dHJfc2VhcmNoKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJCSAgIHN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggKnhzLAotCQkJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKm9sZF9iaCwKLQkJCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpuZXdfYmgpCitzdGF0aWMgdm9pZCBvY2ZzMl94YXR0cl91cGRhdGVfeGF0dHJfc2VhcmNoKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cywKKwkJCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqb2xkX2JoKQogewotCWludCByZXQgPSAwOwogCWNoYXIgKmJ1ZiA9IG9sZF9iaC0+Yl9kYXRhOwogCXN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqb2xkX3hiID0gKHN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jayAqKWJ1ZjsKIAlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICpvbGRfeGggPSAmb2xkX3hiLT54Yl9hdHRycy54Yl9oZWFkZXI7Ci0JaW50IGksIGJsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKLQl1MTYgYmxrX3Blcl9idWNrZXQgPSBvY2ZzMl9ibG9ja3NfcGVyX3hhdHRyX2J1Y2tldChpbm9kZS0+aV9zYik7CisJaW50IGk7CiAKLQl4cy0+YnVja2V0LmJoc1swXSA9IG5ld19iaDsKLQlnZXRfYmgobmV3X2JoKTsKLQl4cy0+YnVja2V0LnhoID0gKHN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKil4cy0+YnVja2V0LmJoc1swXS0+Yl9kYXRhOwotCXhzLT5oZWFkZXIgPSB4cy0+YnVja2V0LnhoOwotCi0JeHMtPmJhc2UgPSBuZXdfYmgtPmJfZGF0YTsKKwl4cy0+aGVhZGVyID0gYnVja2V0X3hoKHhzLT5idWNrZXQpOworCXhzLT5iYXNlID0gYnVja2V0X2Jsb2NrKHhzLT5idWNrZXQsIDApOwogCXhzLT5lbmQgPSB4cy0+YmFzZSArIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKIAotCWlmICgheHMtPm5vdF9mb3VuZCkgewotCQlpZiAoT0NGUzJfWEFUVFJfQlVDS0VUX1NJWkUgIT0gYmxvY2tzaXplKSB7Ci0JCQlyZXQgPSBvY2ZzMl9yZWFkX2Jsb2Nrcyhpbm9kZSwKLQkJCQkJeHMtPmJ1Y2tldC5iaHNbMF0tPmJfYmxvY2tuciArIDEsCi0JCQkJCWJsa19wZXJfYnVja2V0IC0gMSwgJnhzLT5idWNrZXQuYmhzWzFdLAotCQkJCQkwKTsKLQkJCWlmIChyZXQpIHsKLQkJCQltbG9nX2Vycm5vKHJldCk7Ci0JCQkJcmV0dXJuIHJldDsKLQkJCX0KKwlpZiAoeHMtPm5vdF9mb3VuZCkKKwkJcmV0dXJuOwogCi0JCX0KLQkJaSA9IHhzLT5oZXJlIC0gb2xkX3hoLT54aF9lbnRyaWVzOwotCQl4cy0+aGVyZSA9ICZ4cy0+aGVhZGVyLT54aF9lbnRyaWVzW2ldOwotCX0KLQotCXJldHVybiByZXQ7CisJaSA9IHhzLT5oZXJlIC0gb2xkX3hoLT54aF9lbnRyaWVzOworCXhzLT5oZXJlID0gJnhzLT5oZWFkZXItPnhoX2VudHJpZXNbaV07CiB9CiAKIHN0YXRpYyBpbnQgb2NmczJfeGF0dHJfY3JlYXRlX2luZGV4X2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJCSAgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMpCisJCQkJCSAgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMsCisJCQkJCSAgc3RydWN0IG9jZnMyX3hhdHRyX3NldF9jdHh0ICpjdHh0KQogewotCWludCByZXQsIGNyZWRpdHMgPSBPQ0ZTMl9TVUJBTExPQ19BTExPQzsKKwlpbnQgcmV0OwogCXUzMiBiaXRfb2ZmLCBsZW47CiAJdTY0IGJsa25vOwotCWhhbmRsZV90ICpoYW5kbGU7CisJaGFuZGxlX3QgKmhhbmRsZSA9IGN0eHQtPmhhbmRsZTsKIAlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKIAlzdHJ1Y3Qgb2NmczJfaW5vZGVfaW5mbyAqb2kgPSBPQ0ZTMl9JKGlub2RlKTsKLQlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqZGF0YV9hYzsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnhoX2JoID0gTlVMTCwgKmRhdGFfYmggPSBOVUxMOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqeGJfYmggPSB4cy0+eGF0dHJfYmg7CiAJc3RydWN0IG9jZnMyX3hhdHRyX2Jsb2NrICp4YiA9CiAJCQkoc3RydWN0IG9jZnMyX3hhdHRyX2Jsb2NrICopeGJfYmgtPmJfZGF0YTsKIAlzdHJ1Y3Qgb2NmczJfeGF0dHJfdHJlZV9yb290ICp4cjsKIAl1MTYgeGJfZmxhZ3MgPSBsZTE2X3RvX2NwdSh4Yi0+eGJfZmxhZ3MpOwotCXUxNiBicGIgPSBvY2ZzMl9ibG9ja3NfcGVyX3hhdHRyX2J1Y2tldChpbm9kZS0+aV9zYik7CiAKIAltbG9nKDAsICJjcmVhdGUgeGF0dHIgaW5kZXggYmxvY2sgZm9yICVsbHVcbiIsCiAJICAgICAodW5zaWduZWQgbG9uZyBsb25nKXhiX2JoLT5iX2Jsb2NrbnIpOwogCiAJQlVHX09OKHhiX2ZsYWdzICYgT0NGUzJfWEFUVFJfSU5ERVhFRCk7Ci0KLQlyZXQgPSBvY2ZzMl9yZXNlcnZlX2NsdXN0ZXJzKG9zYiwgMSwgJmRhdGFfYWMpOwotCWlmIChyZXQpIHsKLQkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dDsKLQl9CisJQlVHX09OKCF4cy0+YnVja2V0KTsKIAogCS8qCiAJICogWFhYOgpAQCAtMjY4OSwyOSArMzQxOCwxOCBAQAogCSAqLwogCWRvd25fd3JpdGUoJm9pLT5pcF9hbGxvY19zZW0pOwogCi0JLyoKLQkgKiAzIG1vcmUgY3JlZGl0cywgb25lIGZvciB4YXR0ciBibG9jayB1cGRhdGUsIG9uZSBmb3IgdGhlIDFzdCBibG9jawotCSAqIG9mIHRoZSBuZXcgeGF0dHIgYnVja2V0IGFuZCBvbmUgZm9yIHRoZSB2YWx1ZS9kYXRhLgotCSAqLwotCWNyZWRpdHMgKz0gMzsKLQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIGNyZWRpdHMpOwotCWlmIChJU19FUlIoaGFuZGxlKSkgewotCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7Ci0JCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXRfc2VtOwotCX0KLQotCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHhiX2JoLAotCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc194YihoYW5kbGUsIGlub2RlLCB4Yl9iaCwKKwkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0X2NvbW1pdDsKKwkJZ290byBvdXQ7CiAJfQogCi0JcmV0ID0gb2NmczJfY2xhaW1fY2x1c3RlcnMob3NiLCBoYW5kbGUsIGRhdGFfYWMsIDEsICZiaXRfb2ZmLCAmbGVuKTsKKwlyZXQgPSBfX29jZnMyX2NsYWltX2NsdXN0ZXJzKG9zYiwgaGFuZGxlLCBjdHh0LT5kYXRhX2FjLAorCQkJCSAgICAgMSwgMSwgJmJpdF9vZmYsICZsZW4pOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dF9jb21taXQ7CisJCWdvdG8gb3V0OwogCX0KIAogCS8qCkBAIC0yNzI0LDUyICszNDQyLDI0IEBACiAJbWxvZygwLCAiYWxsb2NhdGUgMSBjbHVzdGVyIGZyb20gJWxsdSB0byB4YXR0ciBibG9ja1xuIiwKIAkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmxrbm8pOwogCi0JeGhfYmggPSBzYl9nZXRibGsoaW5vZGUtPmlfc2IsIGJsa25vKTsKLQlpZiAoIXhoX2JoKSB7Ci0JCXJldCA9IC1FSU87Ci0JCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXRfY29tbWl0OwotCX0KLQotCW9jZnMyX3NldF9uZXdfYnVmZmVyX3VwdG9kYXRlKGlub2RlLCB4aF9iaCk7Ci0KLQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCB4aF9iaCwKLQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19DUkVBVEUpOworCXJldCA9IG9jZnMyX2luaXRfeGF0dHJfYnVja2V0KHhzLT5idWNrZXQsIGJsa25vKTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXRfY29tbWl0OworCQlnb3RvIG91dDsKIAl9CiAKLQlpZiAoYnBiID4gMSkgewotCQlkYXRhX2JoID0gc2JfZ2V0YmxrKGlub2RlLT5pX3NiLCBibGtubyArIGJwYiAtIDEpOwotCQlpZiAoIWRhdGFfYmgpIHsKLQkJCXJldCA9IC1FSU87Ci0JCQltbG9nX2Vycm5vKHJldCk7Ci0JCQlnb3RvIG91dF9jb21taXQ7Ci0JCX0KLQotCQlvY2ZzMl9zZXRfbmV3X2J1ZmZlcl91cHRvZGF0ZShpbm9kZSwgZGF0YV9iaCk7Ci0KLQkJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZGF0YV9iaCwKLQkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfQ1JFQVRFKTsKLQkJaWYgKHJldCkgewotCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJZ290byBvdXRfY29tbWl0OwotCQl9Ci0JfQotCi0Jb2NmczJfY3BfeGF0dHJfYmxvY2tfdG9fYnVja2V0KGlub2RlLCB4Yl9iaCwgeGhfYmgsIGRhdGFfYmgpOwotCi0Jb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHhoX2JoKTsKLQlpZiAoZGF0YV9iaCkKLQkJb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGRhdGFfYmgpOwotCi0JcmV0ID0gb2NmczJfeGF0dHJfdXBkYXRlX3hhdHRyX3NlYXJjaChpbm9kZSwgeHMsIHhiX2JoLCB4aF9iaCk7CisJcmV0ID0gb2NmczJfeGF0dHJfYnVja2V0X2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgeHMtPmJ1Y2tldCwKKwkJCQkJCU9DRlMyX0pPVVJOQUxfQUNDRVNTX0NSRUFURSk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0X2NvbW1pdDsKKwkJZ290byBvdXQ7CiAJfQogCisJb2NmczJfY3BfeGF0dHJfYmxvY2tfdG9fYnVja2V0KGlub2RlLCB4Yl9iaCwgeHMtPmJ1Y2tldCk7CisJb2NmczJfeGF0dHJfYnVja2V0X2pvdXJuYWxfZGlydHkoaGFuZGxlLCB4cy0+YnVja2V0KTsKKworCW9jZnMyX3hhdHRyX3VwZGF0ZV94YXR0cl9zZWFyY2goaW5vZGUsIHhzLCB4Yl9iaCk7CisKIAkvKiBDaGFuZ2UgZnJvbSBvY2ZzMl94YXR0cl9oZWFkZXIgdG8gb2NmczJfeGF0dHJfdHJlZV9yb290ICovCiAJbWVtc2V0KCZ4Yi0+eGJfYXR0cnMsIDAsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtCiAJICAgICAgIG9mZnNldG9mKHN0cnVjdCBvY2ZzMl94YXR0cl9ibG9jaywgeGJfYXR0cnMpKTsKQEAgLTI3ODcsMjQgKzM0NzcsMTAgQEAKIAogCXhiLT54Yl9mbGFncyA9IGNwdV90b19sZTE2KHhiX2ZsYWdzIHwgT0NGUzJfWEFUVFJfSU5ERVhFRCk7CiAKLQlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgeGJfYmgpOwotCWlmIChyZXQpIHsKLQkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dF9jb21taXQ7Ci0JfQotCi1vdXRfY29tbWl0OgotCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7Ci0KLW91dF9zZW06Ci0JdXBfd3JpdGUoJm9pLT5pcF9hbGxvY19zZW0pOworCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCB4Yl9iaCk7CiAKIG91dDoKLQlpZiAoZGF0YV9hYykKLQkJb2NmczJfZnJlZV9hbGxvY19jb250ZXh0KGRhdGFfYWMpOwotCi0JYnJlbHNlKHhoX2JoKTsKLQlicmVsc2UoZGF0YV9iaCk7CisJdXBfd3JpdGUoJm9pLT5pcF9hbGxvY19zZW0pOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTI4MjksMjkgKzM1MDUsMTggQEAKICAqIHNvIHRoYXQgd2UgY2FuIHNwYXJlIHNvbWUgc3BhY2UgZm9yIGluc2VydGlvbi4KICAqLwogc3RhdGljIGludCBvY2ZzMl9kZWZyYWdfeGF0dHJfYnVja2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgICBoYW5kbGVfdCAqaGFuZGxlLAogCQkJCSAgICAgc3RydWN0IG9jZnMyX3hhdHRyX2J1Y2tldCAqYnVja2V0KQogewogCWludCByZXQsIGk7CiAJc2l6ZV90IGVuZCwgb2Zmc2V0LCBsZW4sIHZhbHVlX2xlbjsKIAlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICp4aDsKIAljaGFyICplbnRyaWVzLCAqYnVmLCAqYnVja2V0X2J1ZiA9IE5VTEw7Ci0JdTY0IGJsa25vID0gYnVja2V0LT5iaHNbMF0tPmJfYmxvY2tucjsKLQl1MTYgYmxrX3Blcl9idWNrZXQgPSBvY2ZzMl9ibG9ja3NfcGVyX3hhdHRyX2J1Y2tldChpbm9kZS0+aV9zYik7CisJdTY0IGJsa25vID0gYnVja2V0X2Jsa25vKGJ1Y2tldCk7CiAJdTE2IHhoX2ZyZWVfc3RhcnQ7CiAJc2l6ZV90IGJsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKLQloYW5kbGVfdCAqaGFuZGxlOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqKmJoczsKIAlzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkgKnhlOwogCi0JYmhzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopICogYmxrX3Blcl9idWNrZXQsCi0JCQlHRlBfTk9GUyk7Ci0JaWYgKCFiaHMpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmV0ID0gb2NmczJfcmVhZF9ibG9ja3MoaW5vZGUsIGJsa25vLCBibGtfcGVyX2J1Y2tldCwgYmhzLCAwKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dDsKLQogCS8qCiAJICogSW4gb3JkZXIgdG8gbWFrZSB0aGUgb3BlcmF0aW9uIG1vcmUgZWZmaWNpZW50IGFuZCBnZW5lcmljLAogCSAqIHdlIGNvcHkgYWxsIHRoZSBibG9ja3MgaW50byBhIGNvbnRpZ3VvdXMgbWVtb3J5IGFuZCBkbyB0aGUKQEAgLTI4NjUsMjYgKzM1MzAsMTYgQEAKIAl9CiAKIAlidWYgPSBidWNrZXRfYnVmOwotCWZvciAoaSA9IDA7IGkgPCBibGtfcGVyX2J1Y2tldDsgaSsrLCBidWYgKz0gYmxvY2tzaXplKQotCQltZW1jcHkoYnVmLCBiaHNbaV0tPmJfZGF0YSwgYmxvY2tzaXplKTsKKwlmb3IgKGkgPSAwOyBpIDwgYnVja2V0LT5idV9ibG9ja3M7IGkrKywgYnVmICs9IGJsb2Nrc2l6ZSkKKwkJbWVtY3B5KGJ1ZiwgYnVja2V0X2Jsb2NrKGJ1Y2tldCwgaSksIGJsb2Nrc2l6ZSk7CiAKLQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucygoT0NGUzJfU0IoaW5vZGUtPmlfc2IpKSwgYmxrX3Blcl9idWNrZXQpOwotCWlmIChJU19FUlIoaGFuZGxlKSkgewotCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7Ci0JCWhhbmRsZSA9IE5VTEw7CisJcmV0ID0gb2NmczJfeGF0dHJfYnVja2V0X2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgYnVja2V0LAorCQkJCQkJT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCWlmIChyZXQgPCAwKSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IGJsa19wZXJfYnVja2V0OyBpKyspIHsKLQkJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgYmhzW2ldLAotCQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQltbG9nX2Vycm5vKHJldCk7Ci0JCQlnb3RvIGNvbW1pdDsKLQkJfQotCX0KLQogCXhoID0gKHN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKilidWNrZXRfYnVmOwogCWVudHJpZXMgPSAoY2hhciAqKXhoLT54aF9lbnRyaWVzOwogCXhoX2ZyZWVfc3RhcnQgPSBsZTE2X3RvX2NwdSh4aC0+eGhfZnJlZV9zdGFydCk7CkBAIC0yOTQwLDcgKzM1OTUsNyBAQAogCQkJImJ1Y2tldCAlbGx1XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKWJsa25vKTsKIAogCWlmICh4aF9mcmVlX3N0YXJ0ID09IGVuZCkKLQkJZ290byBjb21taXQ7CisJCWdvdG8gb3V0OwogCiAJbWVtc2V0KGJ1Y2tldF9idWYgKyB4aF9mcmVlX3N0YXJ0LCAwLCBlbmQgLSB4aF9mcmVlX3N0YXJ0KTsKIAl4aC0+eGhfZnJlZV9zdGFydCA9IGNwdV90b19sZTE2KGVuZCk7CkBAIC0yOTUxLDE2OSArMzYwNiw5NCBAQAogCSAgICAgY21wX3hlLCBzd2FwX3hlKTsKIAogCWJ1ZiA9IGJ1Y2tldF9idWY7Ci0JZm9yIChpID0gMDsgaSA8IGJsa19wZXJfYnVja2V0OyBpKyssIGJ1ZiArPSBibG9ja3NpemUpIHsKLQkJbWVtY3B5KGJoc1tpXS0+Yl9kYXRhLCBidWYsIGJsb2Nrc2l6ZSk7Ci0JCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBiaHNbaV0pOwotCX0KKwlmb3IgKGkgPSAwOyBpIDwgYnVja2V0LT5idV9ibG9ja3M7IGkrKywgYnVmICs9IGJsb2Nrc2l6ZSkKKwkJbWVtY3B5KGJ1Y2tldF9ibG9jayhidWNrZXQsIGkpLCBidWYsIGJsb2Nrc2l6ZSk7CisJb2NmczJfeGF0dHJfYnVja2V0X2pvdXJuYWxfZGlydHkoaGFuZGxlLCBidWNrZXQpOwogCi1jb21taXQ6Ci0Jb2NmczJfY29tbWl0X3RyYW5zKE9DRlMyX1NCKGlub2RlLT5pX3NiKSwgaGFuZGxlKTsKIG91dDoKLQotCWlmIChiaHMpIHsKLQkJZm9yIChpID0gMDsgaSA8IGJsa19wZXJfYnVja2V0OyBpKyspCi0JCQlicmVsc2UoYmhzW2ldKTsKLQl9Ci0Ja2ZyZWUoYmhzKTsKLQogCWtmcmVlKGJ1Y2tldF9idWYpOwogCXJldHVybiByZXQ7CiB9CiAKIC8qCi0gKiBNb3ZlIGhhbGYgbnVtcyBvZiB0aGUgeGF0dHIgYnVja2V0IGluIHRoZSBwcmV2aW91cyBjbHVzdGVyIHRvIHRoaXMgbmV3Ci0gKiBjbHVzdGVyLiBXZSBvbmx5IHRvdWNoIHRoZSBsYXN0IGNsdXN0ZXIgb2YgdGhlIHByZXZpb3VzIGV4dGVuZCByZWNvcmQuCisgKiBwcmV2X2Jsa25vIHBvaW50cyB0byB0aGUgc3RhcnQgb2YgYW4gZXhpc3RpbmcgZXh0ZW50LiAgbmV3X2Jsa25vCisgKiBwb2ludHMgdG8gYSBuZXdseSBhbGxvY2F0ZWQgZXh0ZW50LiAgQmVjYXVzZSB3ZSBrbm93IGVhY2ggb2Ygb3VyCisgKiBjbHVzdGVycyBjb250YWlucyBtb3JlIHRoYW4gYnVja2V0LCB3ZSBjYW4gZWFzaWx5IHNwbGl0IG9uZSBjbHVzdGVyCisgKiBhdCBhIGJ1Y2tldCBib3VuZGFyeS4gIFNvIHdlIHRha2UgdGhlIGxhc3QgY2x1c3RlciBvZiB0aGUgZXhpc3RpbmcKKyAqIGV4dGVudCBhbmQgc3BsaXQgaXQgZG93biB0aGUgbWlkZGxlLiAgV2UgbW92ZSB0aGUgbGFzdCBoYWxmIG9mIHRoZQorICogYnVja2V0cyBpbiB0aGUgbGFzdCBjbHVzdGVyIG9mIHRoZSBleGlzdGluZyBleHRlbnQgb3ZlciB0byB0aGUgbmV3CisgKiBleHRlbnQuCiAgKgotICogZmlyc3RfYmggaXMgdGhlIGZpcnN0IGJ1ZmZlcl9oZWFkIG9mIGEgc2VyaWVzIG9mIGJ1Y2tldCBpbiB0aGUgc2FtZQotICogZXh0ZW50IHJlYyBhbmQgaGVhZGVyX2JoIGlzIHRoZSBoZWFkZXIgb2Ygb25lIGJ1Y2tldCBpbiB0aGlzIGNsdXN0ZXIuCi0gKiBUaGV5IHdpbGwgYmUgdXBkYXRlZCBpZiB3ZSBtb3ZlIHRoZSBkYXRhIGhlYWRlcl9iaCBjb250YWlucyB0byB0aGUgbmV3Ci0gKiBjbHVzdGVyLiBmaXJzdF9oYXNoIHdpbGwgYmUgc2V0IGFzIHRoZSAxc3QgeGUncyBuYW1lX2hhc2ggb2YgdGhlIG5ldyBjbHVzdGVyLgorICogZmlyc3RfYmggaXMgdGhlIGJ1ZmZlciBhdCBwcmV2X2Jsa25vIHNvIHdlIGNhbiB1cGRhdGUgdGhlIGV4aXN0aW5nCisgKiBleHRlbnQncyBidWNrZXQgY291bnQuICBoZWFkZXJfYmggaXMgdGhlIGJ1Y2tldCB3ZXJlIHdlIHdlcmUgaG9waW5nCisgKiB0byBpbnNlcnQgb3VyIHhhdHRyLiAgSWYgdGhlIGJ1Y2tldCBtb3ZlIHBsYWNlcyB0aGUgdGFyZ2V0IGluIHRoZSBuZXcKKyAqIGV4dGVudCwgd2UnbGwgdXBkYXRlIGZpcnN0X2JoIGFuZCBoZWFkZXJfYmggYWZ0ZXIgbW9kaWZ5aW5nIHRoZSBvbGQKKyAqIGV4dGVudC4KKyAqCisgKiBmaXJzdF9oYXNoIHdpbGwgYmUgc2V0IGFzIHRoZSAxc3QgeGUncyBuYW1lX2hhc2ggaW4gdGhlIG5ldyBleHRlbnQuCiAgKi8KIHN0YXRpYyBpbnQgb2NmczJfbXZfeGF0dHJfYnVja2V0X2Nyb3NzX2NsdXN0ZXIoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkJICAgICAgIGhhbmRsZV90ICpoYW5kbGUsCi0JCQkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipmaXJzdF9iaCwKLQkJCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmhlYWRlcl9iaCwKKwkJCQkJICAgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9idWNrZXQgKmZpcnN0LAorCQkJCQkgICAgICAgc3RydWN0IG9jZnMyX3hhdHRyX2J1Y2tldCAqdGFyZ2V0LAogCQkJCQkgICAgICAgdTY0IG5ld19ibGtubywKLQkJCQkJICAgICAgIHU2NCBwcmV2X2Jsa25vLAogCQkJCQkgICAgICAgdTMyIG51bV9jbHVzdGVycywKIAkJCQkJICAgICAgIHUzMiAqZmlyc3RfaGFzaCkKIHsKLQlpbnQgaSwgcmV0LCBjcmVkaXRzOwotCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOwotCWludCBicGMgPSBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3MoaW5vZGUtPmlfc2IsIDEpOwotCWludCBudW1fYnVja2V0cyA9IG9jZnMyX3hhdHRyX2J1Y2tldHNfcGVyX2NsdXN0ZXIob3NiKTsKLQlpbnQgYmxvY2tzaXplID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqb2xkX2JoLCAqbmV3X2JoLCAqcHJldl9iaCwgKm5ld19maXJzdF9iaCA9IE5VTEw7Ci0Jc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqbmV3X3hoOwotCXN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKnhoID0KLQkJCShzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICopKCgqZmlyc3RfYmgpLT5iX2RhdGEpOworCWludCByZXQ7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCWludCBibGtzX3Blcl9idWNrZXQgPSBvY2ZzMl9ibG9ja3NfcGVyX3hhdHRyX2J1Y2tldChzYik7CisJaW50IG51bV9idWNrZXRzID0gb2NmczJfeGF0dHJfYnVja2V0c19wZXJfY2x1c3RlcihPQ0ZTMl9TQihzYikpOworCWludCB0b19tb3ZlID0gbnVtX2J1Y2tldHMgLyAyOworCXU2NCBzcmNfYmxrbm87CisJdTY0IGxhc3RfY2x1c3Rlcl9ibGtubyA9IGJ1Y2tldF9ibGtubyhmaXJzdCkgKworCQkoKG51bV9jbHVzdGVycyAtIDEpICogb2NmczJfY2x1c3RlcnNfdG9fYmxvY2tzKHNiLCAxKSk7CiAKLQlCVUdfT04obGUxNl90b19jcHUoeGgtPnhoX251bV9idWNrZXRzKSA8IG51bV9idWNrZXRzKTsKLQlCVUdfT04oT0NGUzJfWEFUVFJfQlVDS0VUX1NJWkUgPT0gb3NiLT5zX2NsdXN0ZXJzaXplKTsKLQotCXByZXZfYmggPSAqZmlyc3RfYmg7Ci0JZ2V0X2JoKHByZXZfYmgpOwotCXhoID0gKHN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKilwcmV2X2JoLT5iX2RhdGE7Ci0KLQlwcmV2X2Jsa25vICs9IChudW1fY2x1c3RlcnMgLSAxKSAqIGJwYyArIGJwYyAvIDI7CisJQlVHX09OKGxlMTZfdG9fY3B1KGJ1Y2tldF94aChmaXJzdCktPnhoX251bV9idWNrZXRzKSA8IG51bV9idWNrZXRzKTsKKwlCVUdfT04oT0NGUzJfWEFUVFJfQlVDS0VUX1NJWkUgPT0gT0NGUzJfU0Ioc2IpLT5zX2NsdXN0ZXJzaXplKTsKIAogCW1sb2coMCwgIm1vdmUgaGFsZiBvZiB4YXR0cnMgaW4gY2x1c3RlciAlbGx1IHRvICVsbHVcbiIsCi0JICAgICAodW5zaWduZWQgbG9uZyBsb25nKXByZXZfYmxrbm8sICh1bnNpZ25lZCBsb25nIGxvbmcpbmV3X2Jsa25vKTsKKwkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGFzdF9jbHVzdGVyX2Jsa25vLCAodW5zaWduZWQgbG9uZyBsb25nKW5ld19ibGtubyk7CisKKwlyZXQgPSBvY2ZzMl9tdl94YXR0cl9idWNrZXRzKGlub2RlLCBoYW5kbGUsIGJ1Y2tldF9ibGtubyhmaXJzdCksCisJCQkJICAgICBsYXN0X2NsdXN0ZXJfYmxrbm8sIG5ld19ibGtubywKKwkJCQkgICAgIHRvX21vdmUsIGZpcnN0X2hhc2gpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBUaGlzIGlzIHRoZSBmaXJzdCBidWNrZXQgdGhhdCBnb3QgbW92ZWQgKi8KKwlzcmNfYmxrbm8gPSBsYXN0X2NsdXN0ZXJfYmxrbm8gKyAodG9fbW92ZSAqIGJsa3NfcGVyX2J1Y2tldCk7CiAKIAkvKgotCSAqIFdlIG5lZWQgdG8gdXBkYXRlIHRoZSAxc3QgaGFsZiBvZiB0aGUgbmV3IGNsdXN0ZXIgYW5kCi0JICogMSBtb3JlIGZvciB0aGUgdXBkYXRlIG9mIHRoZSAxc3QgYnVja2V0IG9mIHRoZSBwcmV2aW91cwotCSAqIGV4dGVudCByZWNvcmQuCisJICogSWYgdGhlIHRhcmdldCBidWNrZXQgd2FzIHBhcnQgb2YgdGhlIG1vdmVkIGJ1Y2tldHMsIHdlIG5lZWQgdG8KKwkgKiB1cGRhdGUgZmlyc3QgYW5kIHRhcmdldC4KIAkgKi8KLQljcmVkaXRzID0gYnBjIC8gMiArIDE7Ci0JcmV0ID0gb2NmczJfZXh0ZW5kX3RyYW5zKGhhbmRsZSwgY3JlZGl0cyk7Ci0JaWYgKHJldCkgewotCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0OwotCX0KKwlpZiAoYnVja2V0X2Jsa25vKHRhcmdldCkgPj0gc3JjX2Jsa25vKSB7CisJCS8qIEZpbmQgdGhlIGJsb2NrIGZvciB0aGUgbmV3IHRhcmdldCBidWNrZXQgKi8KKwkJc3JjX2Jsa25vID0gbmV3X2Jsa25vICsKKwkJCShidWNrZXRfYmxrbm8odGFyZ2V0KSAtIHNyY19ibGtubyk7CiAKLQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBwcmV2X2JoLAotCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKLQlpZiAocmV0KSB7Ci0JCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXQ7Ci0JfQorCQlvY2ZzMl94YXR0cl9idWNrZXRfcmVsc2UoZmlyc3QpOworCQlvY2ZzMl94YXR0cl9idWNrZXRfcmVsc2UodGFyZ2V0KTsKIAotCWZvciAoaSA9IDA7IGkgPCBicGMgLyAyOyBpKyssIHByZXZfYmxrbm8rKywgbmV3X2Jsa25vKyspIHsKLQkJb2xkX2JoID0gbmV3X2JoID0gTlVMTDsKLQkJbmV3X2JoID0gc2JfZ2V0YmxrKGlub2RlLT5pX3NiLCBuZXdfYmxrbm8pOwotCQlpZiAoIW5ld19iaCkgewotCQkJcmV0ID0gLUVJTzsKKwkJLyoKKwkJICogVGhlc2Ugc2hvdWxkbid0IGZhaWwgLSB0aGUgYnVmZmVycyBhcmUgaW4gdGhlCisJCSAqIGpvdXJuYWwgZnJvbSBvY2ZzMl9jcF94YXR0cl9idWNrZXQoKS4KKwkJICovCisJCXJldCA9IG9jZnMyX3JlYWRfeGF0dHJfYnVja2V0KGZpcnN0LCBuZXdfYmxrbm8pOworCQlpZiAocmV0KSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlnb3RvIG91dDsKIAkJfQotCi0JCW9jZnMyX3NldF9uZXdfYnVmZmVyX3VwdG9kYXRlKGlub2RlLCBuZXdfYmgpOwotCi0JCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIG5ld19iaCwKLQkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfQ1JFQVRFKTsKLQkJaWYgKHJldCA8IDApIHsKKwkJcmV0ID0gb2NmczJfcmVhZF94YXR0cl9idWNrZXQodGFyZ2V0LCBzcmNfYmxrbm8pOworCQlpZiAocmV0KQogCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJYnJlbHNlKG5ld19iaCk7Ci0JCQlnb3RvIG91dDsKLQkJfQogCi0JCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIHByZXZfYmxrbm8sICZvbGRfYmgpOwotCQlpZiAocmV0IDwgMCkgewotCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJYnJlbHNlKG5ld19iaCk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCW1lbWNweShuZXdfYmgtPmJfZGF0YSwgb2xkX2JoLT5iX2RhdGEsIGJsb2Nrc2l6ZSk7Ci0KLQkJaWYgKGkgPT0gMCkgewotCQkJbmV3X3hoID0gKHN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKiluZXdfYmgtPmJfZGF0YTsKLQkJCW5ld194aC0+eGhfbnVtX2J1Y2tldHMgPSBjcHVfdG9fbGUxNihudW1fYnVja2V0cyAvIDIpOwotCi0JCQlpZiAoZmlyc3RfaGFzaCkKLQkJCQkqZmlyc3RfaGFzaCA9IGxlMzJfdG9fY3B1KAotCQkJCQluZXdfeGgtPnhoX2VudHJpZXNbMF0ueGVfbmFtZV9oYXNoKTsKLQkJCW5ld19maXJzdF9iaCA9IG5ld19iaDsKLQkJCWdldF9iaChuZXdfZmlyc3RfYmgpOwotCQl9Ci0KLQkJb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIG5ld19iaCk7Ci0KLQkJaWYgKCpoZWFkZXJfYmggPT0gb2xkX2JoKSB7Ci0JCQlicmVsc2UoKmhlYWRlcl9iaCk7Ci0JCQkqaGVhZGVyX2JoID0gbmV3X2JoOwotCQkJZ2V0X2JoKCpoZWFkZXJfYmgpOwotCi0JCQlicmVsc2UoKmZpcnN0X2JoKTsKLQkJCSpmaXJzdF9iaCA9IG5ld19maXJzdF9iaDsKLQkJCWdldF9iaCgqZmlyc3RfYmgpOwotCQl9Ci0JCWJyZWxzZShuZXdfYmgpOwotCQlicmVsc2Uob2xkX2JoKTsKIAl9CiAKLQlsZTE2X2FkZF9jcHUoJnhoLT54aF9udW1fYnVja2V0cywgLShudW1fYnVja2V0cyAvIDIpKTsKLQotCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBwcmV2X2JoKTsKIG91dDoKLQlicmVsc2UocHJldl9iaCk7Ci0JYnJlbHNlKG5ld19maXJzdF9iaCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBvY2ZzMl9yZWFkX3hhdHRyX2J1Y2tldChzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCSAgIHU2NCBibGtubywKLQkJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaHMsCi0JCQkJICAgaW50IG5ldykKLXsKLQlpbnQgcmV0ID0gMDsKLQl1MTYgaSwgYmxrX3Blcl9idWNrZXQgPSBvY2ZzMl9ibG9ja3NfcGVyX3hhdHRyX2J1Y2tldChpbm9kZS0+aV9zYik7Ci0KLQlpZiAoIW5ldykKLQkJcmV0dXJuIG9jZnMyX3JlYWRfYmxvY2tzKGlub2RlLCBibGtubywKLQkJCQkJIGJsa19wZXJfYnVja2V0LCBiaHMsIDApOwotCi0JZm9yIChpID0gMDsgaSA8IGJsa19wZXJfYnVja2V0OyBpKyspIHsKLQkJYmhzW2ldID0gc2JfZ2V0YmxrKGlub2RlLT5pX3NiLCBibGtubyArIGkpOwotCQlpZiAoYmhzW2ldID09IE5VTEwpIHsKLQkJCXJldCA9IC1FSU87Ci0JCQltbG9nX2Vycm5vKHJldCk7Ci0JCQlicmVhazsKLQkJfQotCQlvY2ZzMl9zZXRfbmV3X2J1ZmZlcl91cHRvZGF0ZShpbm9kZSwgYmhzW2ldKTsKLQl9Ci0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC0zMTc4LDggKzM3NTgsNyBAQAogewogCWludCByZXQsIGk7CiAJaW50IGNvdW50LCBzdGFydCwgbGVuLCBuYW1lX3ZhbHVlX2xlbiA9IDAsIHhlX2xlbiwgbmFtZV9vZmZzZXQgPSAwOwotCXUxNiBibGtfcGVyX2J1Y2tldCA9IG9jZnMyX2Jsb2Nrc19wZXJfeGF0dHJfYnVja2V0KGlub2RlLT5pX3NiKTsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKipzX2JocywgKip0X2JocyA9IE5VTEw7CisJc3RydWN0IG9jZnMyX3hhdHRyX2J1Y2tldCAqc19idWNrZXQgPSBOVUxMLCAqdF9idWNrZXQgPSBOVUxMOwogCXN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKnhoOwogCXN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSAqeGU7CiAJaW50IGJsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKQEAgLTMxODcsNDcgKzM3NjYsNTIgQEAKIAltbG9nKDAsICJtb3ZlIHNvbWUgb2YgeGF0dHJzIGZyb20gYnVja2V0ICVsbHUgdG8gJWxsdVxuIiwKIAkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmxrLCAodW5zaWduZWQgbG9uZyBsb25nKW5ld19ibGspOwogCi0Jc19iaHMgPSBrY2FsbG9jKGJsa19wZXJfYnVja2V0LCBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLCBHRlBfTk9GUyk7Ci0JaWYgKCFzX2JocykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlyZXQgPSBvY2ZzMl9yZWFkX3hhdHRyX2J1Y2tldChpbm9kZSwgYmxrLCBzX2JocywgMCk7Ci0JaWYgKHJldCkgewotCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHNfYmhzWzBdLAotCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKLQlpZiAocmV0KSB7Ci0JCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JdF9iaHMgPSBrY2FsbG9jKGJsa19wZXJfYnVja2V0LCBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLCBHRlBfTk9GUyk7Ci0JaWYgKCF0X2JocykgeworCXNfYnVja2V0ID0gb2NmczJfeGF0dHJfYnVja2V0X25ldyhpbm9kZSk7CisJdF9idWNrZXQgPSBvY2ZzMl94YXR0cl9idWNrZXRfbmV3KGlub2RlKTsKKwlpZiAoIXNfYnVja2V0IHx8ICF0X2J1Y2tldCkgewogCQlyZXQgPSAtRU5PTUVNOworCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwogCX0KIAotCXJldCA9IG9jZnMyX3JlYWRfeGF0dHJfYnVja2V0KGlub2RlLCBuZXdfYmxrLCB0X2JocywgbmV3X2J1Y2tldF9oZWFkKTsKKwlyZXQgPSBvY2ZzMl9yZWFkX3hhdHRyX2J1Y2tldChzX2J1Y2tldCwgYmxrKTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IGJsa19wZXJfYnVja2V0OyBpKyspIHsKLQkJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgdF9iaHNbaV0sCi0JCQkJCSAgIG5ld19idWNrZXRfaGVhZCA/Ci0JCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX0NSRUFURSA6Ci0JCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKLQkJaWYgKHJldCkgewotCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJZ290byBvdXQ7Ci0JCX0KKwlyZXQgPSBvY2ZzMl94YXR0cl9idWNrZXRfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBzX2J1Y2tldCwKKwkJCQkJCU9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CiAJfQogCi0JeGggPSAoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqKXNfYmhzWzBdLT5iX2RhdGE7CisJLyoKKwkgKiBFdmVuIGlmICFuZXdfYnVja2V0X2hlYWQsIHdlJ3JlIG92ZXJ3cml0aW5nIHRfYnVja2V0LiAgVGh1cywKKwkgKiB0aGVyZSdzIG5vIG5lZWQgdG8gcmVhZCBpdC4KKwkgKi8KKwlyZXQgPSBvY2ZzMl9pbml0X3hhdHRyX2J1Y2tldCh0X2J1Y2tldCwgbmV3X2Jsayk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogSGV5LCBpZiB3ZSdyZSBvdmVyd3JpdGluZyB0X2J1Y2tldCwgd2hhdCBkaWZmZXJlbmNlIGRvZXMKKwkgKiBBQ0NFU1NfQ1JFQVRFIHZzIEFDQ0VTU19XUklURSBtYWtlPyAgU2VlIHRoZSBjb21tZW50IGluIHRoZQorCSAqIHNhbWUgcGFydCBvZiBvY2ZzMl9jcF94YXR0cl9idWNrZXQoKS4KKwkgKi8KKwlyZXQgPSBvY2ZzMl94YXR0cl9idWNrZXRfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCB0X2J1Y2tldCwKKwkJCQkJCW5ld19idWNrZXRfaGVhZCA/CisJCQkJCQlPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19DUkVBVEUgOgorCQkJCQkJT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwl4aCA9IGJ1Y2tldF94aChzX2J1Y2tldCk7CiAJY291bnQgPSBsZTE2X3RvX2NwdSh4aC0+eGhfY291bnQpOwogCXN0YXJ0ID0gb2NmczJfeGF0dHJfZmluZF9kaXZpZGVfcG9zKHhoKTsKIApAQCAtMzIzOSwxMCArMzgyMywxMCBAQAogCQkgKiBUaGUgaGFzaCB2YWx1ZSBpcyBzZXQgYXMgb25lIGxhcmdlciB0aGFuCiAJCSAqIHRoYXQgb2YgdGhlIGxhc3QgZW50cnkgaW4gdGhlIHByZXZpb3VzIGJ1Y2tldC4KIAkJICovCi0JCWZvciAoaSA9IDA7IGkgPCBibGtfcGVyX2J1Y2tldDsgaSsrKQotCQkJbWVtc2V0KHRfYmhzW2ldLT5iX2RhdGEsIDAsIGJsb2Nrc2l6ZSk7CisJCWZvciAoaSA9IDA7IGkgPCB0X2J1Y2tldC0+YnVfYmxvY2tzOyBpKyspCisJCQltZW1zZXQoYnVja2V0X2Jsb2NrKHRfYnVja2V0LCBpKSwgMCwgYmxvY2tzaXplKTsKIAotCQl4aCA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICopdF9iaHNbMF0tPmJfZGF0YTsKKwkJeGggPSBidWNrZXRfeGgodF9idWNrZXQpOwogCQl4aC0+eGhfZnJlZV9zdGFydCA9IGNwdV90b19sZTE2KGJsb2Nrc2l6ZSk7CiAJCXhoLT54aF9lbnRyaWVzWzBdLnhlX25hbWVfaGFzaCA9IHhlLT54ZV9uYW1lX2hhc2g7CiAJCWxlMzJfYWRkX2NwdSgmeGgtPnhoX2VudHJpZXNbMF0ueGVfbmFtZV9oYXNoLCAxKTsKQEAgLTMyNTEsMTEgKzM4MzUsMTAgQEAKIAl9CiAKIAkvKiBjb3B5IHRoZSB3aG9sZSBidWNrZXQgdG8gdGhlIG5ldyBmaXJzdC4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgYmxrX3Blcl9idWNrZXQ7IGkrKykKLQkJbWVtY3B5KHRfYmhzW2ldLT5iX2RhdGEsIHNfYmhzW2ldLT5iX2RhdGEsIGJsb2Nrc2l6ZSk7CisJb2NmczJfeGF0dHJfYnVja2V0X2NvcHlfZGF0YSh0X2J1Y2tldCwgc19idWNrZXQpOwogCiAJLyogdXBkYXRlIHRoZSBuZXcgYnVja2V0LiAqLwotCXhoID0gKHN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKil0X2Joc1swXS0+Yl9kYXRhOworCXhoID0gYnVja2V0X3hoKHRfYnVja2V0KTsKIAogCS8qCiAJICogQ2FsY3VsYXRlIHRoZSB0b3RhbCBuYW1lL3ZhbHVlIGxlbiBhbmQgeGhfZnJlZV9zdGFydCBmb3IKQEAgLTMzMTksMTEgKzM5MDIsNyBAQAogCWVsc2UKIAkJeGgtPnhoX251bV9idWNrZXRzID0gMDsKIAotCWZvciAoaSA9IDA7IGkgPCBibGtfcGVyX2J1Y2tldDsgaSsrKSB7Ci0JCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCB0X2Joc1tpXSk7Ci0JCWlmIChyZXQpCi0JCQltbG9nX2Vycm5vKHJldCk7Ci0JfQorCW9jZnMyX3hhdHRyX2J1Y2tldF9qb3VybmFsX2RpcnR5KGhhbmRsZSwgdF9idWNrZXQpOwogCiAJLyogc3RvcmUgdGhlIGZpcnN0X2hhc2ggb2YgdGhlIG5ldyBidWNrZXQuICovCiAJaWYgKGZpcnN0X2hhc2gpCkBAIC0zMzM3LDI5ICszOTE2LDE4IEBACiAJaWYgKHN0YXJ0ID09IGNvdW50KQogCQlnb3RvIG91dDsKIAotCXhoID0gKHN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKilzX2Joc1swXS0+Yl9kYXRhOworCXhoID0gYnVja2V0X3hoKHNfYnVja2V0KTsKIAltZW1zZXQoJnhoLT54aF9lbnRyaWVzW3N0YXJ0XSwgMCwKIAkgICAgICAgc2l6ZW9mKHN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSkgKiAoY291bnQgLSBzdGFydCkpOwogCXhoLT54aF9jb3VudCA9IGNwdV90b19sZTE2KHN0YXJ0KTsKIAl4aC0+eGhfZnJlZV9zdGFydCA9IGNwdV90b19sZTE2KG5hbWVfb2Zmc2V0KTsKIAl4aC0+eGhfbmFtZV92YWx1ZV9sZW4gPSBjcHVfdG9fbGUxNihuYW1lX3ZhbHVlX2xlbik7CiAKLQlvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgc19iaHNbMF0pOwotCWlmIChyZXQpCi0JCW1sb2dfZXJybm8ocmV0KTsKKwlvY2ZzMl94YXR0cl9idWNrZXRfam91cm5hbF9kaXJ0eShoYW5kbGUsIHNfYnVja2V0KTsKIAogb3V0OgotCWlmIChzX2JocykgewotCQlmb3IgKGkgPSAwOyBpIDwgYmxrX3Blcl9idWNrZXQ7IGkrKykKLQkJCWJyZWxzZShzX2Joc1tpXSk7Ci0JfQotCWtmcmVlKHNfYmhzKTsKLQotCWlmICh0X2JocykgewotCQlmb3IgKGkgPSAwOyBpIDwgYmxrX3Blcl9idWNrZXQ7IGkrKykKLQkJCWJyZWxzZSh0X2Joc1tpXSk7Ci0JfQotCWtmcmVlKHRfYmhzKTsKKwlvY2ZzMl94YXR0cl9idWNrZXRfZnJlZShzX2J1Y2tldCk7CisJb2NmczJfeGF0dHJfYnVja2V0X2ZyZWUodF9idWNrZXQpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTMzNzYsMTAgKzM5NDQsOCBAQAogCQkJCSB1NjQgdF9ibGtubywKIAkJCQkgaW50IHRfaXNfbmV3KQogewotCWludCByZXQsIGk7Ci0JaW50IGJsa19wZXJfYnVja2V0ID0gb2NmczJfYmxvY2tzX3Blcl94YXR0cl9idWNrZXQoaW5vZGUtPmlfc2IpOwotCWludCBibG9ja3NpemUgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICoqc19iaHMsICoqdF9iaHMgPSBOVUxMOworCWludCByZXQ7CisJc3RydWN0IG9jZnMyX3hhdHRyX2J1Y2tldCAqc19idWNrZXQgPSBOVUxMLCAqdF9idWNrZXQgPSBOVUxMOwogCiAJQlVHX09OKHNfYmxrbm8gPT0gdF9ibGtubyk7CiAKQEAgLTMzODcsOTIgKzM5NTMsMTE1IEBACiAJICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNfYmxrbm8sICh1bnNpZ25lZCBsb25nIGxvbmcpdF9ibGtubywKIAkgICAgIHRfaXNfbmV3KTsKIAotCXNfYmhzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopICogYmxrX3Blcl9idWNrZXQsCi0JCQlHRlBfTk9GUyk7Ci0JaWYgKCFzX2JocykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlyZXQgPSBvY2ZzMl9yZWFkX3hhdHRyX2J1Y2tldChpbm9kZSwgc19ibGtubywgc19iaHMsIDApOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0OwotCi0JdF9iaHMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKikgKiBibGtfcGVyX2J1Y2tldCwKLQkJCUdGUF9OT0ZTKTsKLQlpZiAoIXRfYmhzKSB7CisJc19idWNrZXQgPSBvY2ZzMl94YXR0cl9idWNrZXRfbmV3KGlub2RlKTsKKwl0X2J1Y2tldCA9IG9jZnMyX3hhdHRyX2J1Y2tldF9uZXcoaW5vZGUpOworCWlmICghc19idWNrZXQgfHwgIXRfYnVja2V0KSB7CiAJCXJldCA9IC1FTk9NRU07CisJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CiAJfQogCi0JcmV0ID0gb2NmczJfcmVhZF94YXR0cl9idWNrZXQoaW5vZGUsIHRfYmxrbm8sIHRfYmhzLCB0X2lzX25ldyk7CisJcmV0ID0gb2NmczJfcmVhZF94YXR0cl9idWNrZXQoc19idWNrZXQsIHNfYmxrbm8pOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCi0JZm9yIChpID0gMDsgaSA8IGJsa19wZXJfYnVja2V0OyBpKyspIHsKLQkJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgdF9iaHNbaV0sCi0JCQkJCSAgIHRfaXNfbmV3ID8KLQkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfQ1JFQVRFIDoKLQkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwotCQlpZiAocmV0KQotCQkJZ290byBvdXQ7Ci0JfQorCS8qCisJICogRXZlbiBpZiAhdF9pc19uZXcsIHdlJ3JlIG92ZXJ3cml0aW5nIHRfYnVja2V0LiAgVGh1cywKKwkgKiB0aGVyZSdzIG5vIG5lZWQgdG8gcmVhZCBpdC4KKwkgKi8KKwlyZXQgPSBvY2ZzMl9pbml0X3hhdHRyX2J1Y2tldCh0X2J1Y2tldCwgdF9ibGtubyk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CiAKLQlmb3IgKGkgPSAwOyBpIDwgYmxrX3Blcl9idWNrZXQ7IGkrKykgewotCQltZW1jcHkodF9iaHNbaV0tPmJfZGF0YSwgc19iaHNbaV0tPmJfZGF0YSwgYmxvY2tzaXplKTsKLQkJb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHRfYmhzW2ldKTsKLQl9CisJLyoKKwkgKiBIZXksIGlmIHdlJ3JlIG92ZXJ3cml0aW5nIHRfYnVja2V0LCB3aGF0IGRpZmZlcmVuY2UgZG9lcworCSAqIEFDQ0VTU19DUkVBVEUgdnMgQUNDRVNTX1dSSVRFIG1ha2U/ICBXZWxsLCBpZiB3ZSBhbGxvY2F0ZWQgYSBuZXcKKwkgKiBjbHVzdGVyIHRvIGZpbGwsIHdlIGNhbWUgaGVyZSBmcm9tCisJICogb2NmczJfbXZfeGF0dHJfYnVja2V0cygpLCBhbmQgaXQgaXMgcmVhbGx5IG5ldyAtCisJICogQUNDRVNTX0NSRUFURSBpcyByZXF1aXJlZC4gIEJ1dCB3ZSBhbHNvIG1pZ2h0IGhhdmUgbW92ZWQgZGF0YQorCSAqIG91dCBvZiB0X2J1Y2tldCBiZWZvcmUgZXh0ZW5kaW5nIGJhY2sgaW50byBpdC4KKwkgKiBvY2ZzMl9hZGRfbmV3X3hhdHRyX2J1Y2tldCgpIGNhbiBkbyB0aGlzIC0gaXRzIGNhbGwgdG8KKwkgKiBvY2ZzMl9hZGRfbmV3X3hhdHRyX2NsdXN0ZXIoKSBtYXkgaGF2ZSBjcmVhdGVkIGEgbmV3IGV4dGVudAorCSAqIGFuZCBjb3BpZWQgb3V0IHRoZSBlbmQgb2YgdGhlIG9sZCBleHRlbnQuICBUaGVuIGl0IHJlLWV4dGVuZHMKKwkgKiB0aGUgb2xkIGV4dGVudCBiYWNrIHRvIGNyZWF0ZSBzcGFjZSBmb3IgbmV3IHhhdHRycy4gIFRoYXQncworCSAqIGhvdyB3ZSBnZXQgaGVyZSwgYW5kIHRoZSBidWNrZXQgaXNuJ3QgcmVhbGx5IG5ldy4KKwkgKi8KKwlyZXQgPSBvY2ZzMl94YXR0cl9idWNrZXRfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCB0X2J1Y2tldCwKKwkJCQkJCXRfaXNfbmV3ID8KKwkJCQkJCU9DRlMyX0pPVVJOQUxfQUNDRVNTX0NSRUFURSA6CisJCQkJCQlPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlvY2ZzMl94YXR0cl9idWNrZXRfY29weV9kYXRhKHRfYnVja2V0LCBzX2J1Y2tldCk7CisJb2NmczJfeGF0dHJfYnVja2V0X2pvdXJuYWxfZGlydHkoaGFuZGxlLCB0X2J1Y2tldCk7CiAKIG91dDoKLQlpZiAoc19iaHMpIHsKLQkJZm9yIChpID0gMDsgaSA8IGJsa19wZXJfYnVja2V0OyBpKyspCi0JCQlicmVsc2Uoc19iaHNbaV0pOwotCX0KLQlrZnJlZShzX2Jocyk7Ci0KLQlpZiAodF9iaHMpIHsKLQkJZm9yIChpID0gMDsgaSA8IGJsa19wZXJfYnVja2V0OyBpKyspCi0JCQlicmVsc2UodF9iaHNbaV0pOwotCX0KLQlrZnJlZSh0X2Jocyk7CisJb2NmczJfeGF0dHJfYnVja2V0X2ZyZWUodF9idWNrZXQpOworCW9jZnMyX3hhdHRyX2J1Y2tldF9mcmVlKHNfYnVja2V0KTsKIAogCXJldHVybiByZXQ7CiB9CiAKIC8qCi0gKiBDb3B5IG9uZSB4YXR0ciBjbHVzdGVyIGZyb20gc3JjX2JsayB0byB0b19ibGsuCi0gKiBUaGUgdG9fYmxrIHdpbGwgYmVjb21lIHRoZSBmaXJzdCBidWNrZXQgaGVhZGVyIG9mIHRoZSBjbHVzdGVyLCBzbyBpdHMKLSAqIHhoX251bV9idWNrZXRzIHdpbGwgYmUgaW5pdGlhbGl6ZWQgYXMgdGhlIGJ1Y2tldCBudW0gaW4gdGhlIGNsdXN0ZXIuCisgKiBzcmNfYmxrIHBvaW50cyB0byB0aGUgc3RhcnQgb2YgYW4gZXhpc3RpbmcgZXh0ZW50LiAgbGFzdF9ibGsgcG9pbnRzIHRvCisgKiBsYXN0IGNsdXN0ZXIgaW4gdGhhdCBleHRlbnQuICB0b19ibGsgcG9pbnRzIHRvIGEgbmV3bHkgYWxsb2NhdGVkCisgKiBleHRlbnQuICBXZSBjb3B5IHRoZSBidWNrZXRzIGZyb20gdGhlIGNsdXN0ZXIgYXQgbGFzdF9ibGsgdG8gdGhlIG5ldworICogZXh0ZW50LiAgSWYgc3RhcnRfYnVja2V0IGlzIG5vbi16ZXJvLCB3ZSBza2lwIHRoYXQgbWFueSBidWNrZXRzIGJlZm9yZQorICogd2Ugc3RhcnQgY29weWluZy4gIFRoZSBuZXcgZXh0ZW50J3MgeGhfbnVtX2J1Y2tldHMgZ2V0cyBzZXQgdG8gdGhlCisgKiBudW1iZXIgb2YgYnVja2V0cyB3ZSBjb3BpZWQuICBUaGUgb2xkIGV4dGVudCdzIHhoX251bV9idWNrZXRzIHNocmlua3MKKyAqIGJ5IHRoZSBzYW1lIGFtb3VudC4KICAqLwotc3RhdGljIGludCBvY2ZzMl9jcF94YXR0cl9jbHVzdGVyKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJICBoYW5kbGVfdCAqaGFuZGxlLAotCQkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpmaXJzdF9iaCwKLQkJCQkgIHU2NCBzcmNfYmxrLAotCQkJCSAgdTY0IHRvX2JsaywKK3N0YXRpYyBpbnQgb2NmczJfbXZfeGF0dHJfYnVja2V0cyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBoYW5kbGVfdCAqaGFuZGxlLAorCQkJCSAgdTY0IHNyY19ibGssIHU2NCBsYXN0X2JsaywgdTY0IHRvX2JsaywKKwkJCQkgIHVuc2lnbmVkIGludCBzdGFydF9idWNrZXQsCiAJCQkJICB1MzIgKmZpcnN0X2hhc2gpCiB7CiAJaW50IGksIHJldCwgY3JlZGl0czsKIAlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKLQlpbnQgYnBjID0gb2NmczJfY2x1c3RlcnNfdG9fYmxvY2tzKGlub2RlLT5pX3NiLCAxKTsKKwlpbnQgYmxrc19wZXJfYnVja2V0ID0gb2NmczJfYmxvY2tzX3Blcl94YXR0cl9idWNrZXQoaW5vZGUtPmlfc2IpOwogCWludCBudW1fYnVja2V0cyA9IG9jZnMyX3hhdHRyX2J1Y2tldHNfcGVyX2NsdXN0ZXIob3NiKTsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKLQlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICp4aDsKLQl1NjQgdG9fYmxrX3N0YXJ0ID0gdG9fYmxrOworCXN0cnVjdCBvY2ZzMl94YXR0cl9idWNrZXQgKm9sZF9maXJzdCwgKm5ld19maXJzdDsKIAotCW1sb2coMCwgImNwIHhhdHRycyBmcm9tIGNsdXN0ZXIgJWxsdSB0byAlbGx1XG4iLAotCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzcmNfYmxrLCAodW5zaWduZWQgbG9uZyBsb25nKXRvX2Jsayk7CisJbWxvZygwLCAibXYgeGF0dHJzIGZyb20gY2x1c3RlciAlbGx1IHRvICVsbHVcbiIsCisJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxhc3RfYmxrLCAodW5zaWduZWQgbG9uZyBsb25nKXRvX2Jsayk7CisKKwlCVUdfT04oc3RhcnRfYnVja2V0ID49IG51bV9idWNrZXRzKTsKKwlpZiAoc3RhcnRfYnVja2V0KSB7CisJCW51bV9idWNrZXRzIC09IHN0YXJ0X2J1Y2tldDsKKwkJbGFzdF9ibGsgKz0gKHN0YXJ0X2J1Y2tldCAqIGJsa3NfcGVyX2J1Y2tldCk7CisJfQorCisJLyogVGhlIGZpcnN0IGJ1Y2tldCBvZiB0aGUgb3JpZ2luYWwgZXh0ZW50ICovCisJb2xkX2ZpcnN0ID0gb2NmczJfeGF0dHJfYnVja2V0X25ldyhpbm9kZSk7CisJLyogVGhlIGZpcnN0IGJ1Y2tldCBvZiB0aGUgbmV3IGV4dGVudCAqLworCW5ld19maXJzdCA9IG9jZnMyX3hhdHRyX2J1Y2tldF9uZXcoaW5vZGUpOworCWlmICghb2xkX2ZpcnN0IHx8ICFuZXdfZmlyc3QpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBvY2ZzMl9yZWFkX3hhdHRyX2J1Y2tldChvbGRfZmlyc3QsIHNyY19ibGspOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CiAKIAkvKgotCSAqIFdlIG5lZWQgdG8gdXBkYXRlIHRoZSBuZXcgY2x1c3RlciBhbmQgMSBtb3JlIGZvciB0aGUgdXBkYXRlIG9mCi0JICogdGhlIDFzdCBidWNrZXQgb2YgdGhlIHByZXZpb3VzIGV4dGVudCByZWMuCisJICogV2UgbmVlZCB0byB1cGRhdGUgdGhlIGZpcnN0IGJ1Y2tldCBvZiB0aGUgb2xkIGV4dGVudCBhbmQgYWxsCisJICogdGhlIGJ1Y2tldHMgZ29pbmcgdG8gdGhlIG5ldyBleHRlbnQuCiAJICovCi0JY3JlZGl0cyA9IGJwYyArIDE7CisJY3JlZGl0cyA9ICgobnVtX2J1Y2tldHMgKyAxKSAqIGJsa3NfcGVyX2J1Y2tldCkgKworCQloYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHM7CiAJcmV0ID0gb2NmczJfZXh0ZW5kX3RyYW5zKGhhbmRsZSwgY3JlZGl0cyk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwogCX0KIAotCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGZpcnN0X2JoLAotCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlyZXQgPSBvY2ZzMl94YXR0cl9idWNrZXRfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBvbGRfZmlyc3QsCisJCQkJCQlPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwpAQCAtMzQ4MCw0NSArNDA2OSw0NSBAQAogCiAJZm9yIChpID0gMDsgaSA8IG51bV9idWNrZXRzOyBpKyspIHsKIAkJcmV0ID0gb2NmczJfY3BfeGF0dHJfYnVja2V0KGlub2RlLCBoYW5kbGUsCi0JCQkJCSAgICBzcmNfYmxrLCB0b19ibGssIDEpOworCQkJCQkgICAgbGFzdF9ibGsgKyAoaSAqIGJsa3NfcGVyX2J1Y2tldCksCisJCQkJCSAgICB0b19ibGsgKyAoaSAqIGJsa3NfcGVyX2J1Y2tldCksCisJCQkJCSAgICAxKTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJZ290byBvdXQ7CiAJCX0KLQotCQlzcmNfYmxrICs9IG9jZnMyX2Jsb2Nrc19wZXJfeGF0dHJfYnVja2V0KGlub2RlLT5pX3NiKTsKLQkJdG9fYmxrICs9IG9jZnMyX2Jsb2Nrc19wZXJfeGF0dHJfYnVja2V0KGlub2RlLT5pX3NiKTsKIAl9CiAKLQkvKiB1cGRhdGUgdGhlIG9sZCBidWNrZXQgaGVhZGVyLiAqLwotCXhoID0gKHN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKilmaXJzdF9iaC0+Yl9kYXRhOwotCWxlMTZfYWRkX2NwdSgmeGgtPnhoX251bV9idWNrZXRzLCAtbnVtX2J1Y2tldHMpOwotCi0Jb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGZpcnN0X2JoKTsKLQotCS8qIHVwZGF0ZSB0aGUgbmV3IGJ1Y2tldCBoZWFkZXIuICovCi0JcmV0ID0gb2NmczJfcmVhZF9ibG9jayhpbm9kZSwgdG9fYmxrX3N0YXJ0LCAmYmgpOwotCWlmIChyZXQgPCAwKSB7CisJLyoKKwkgKiBHZXQgdGhlIG5ldyBidWNrZXQgcmVhZHkgYmVmb3JlIHdlIGRpcnR5IGFueXRoaW5nCisJICogKFRoaXMgYWN0dWFsbHkgc2hvdWxkbid0IGZhaWwsIGJlY2F1c2Ugd2UgYWxyZWFkeSBkaXJ0aWVkCisJICogaXQgb25jZSBpbiBvY2ZzMl9jcF94YXR0cl9idWNrZXQoKSkuCisJICovCisJcmV0ID0gb2NmczJfcmVhZF94YXR0cl9idWNrZXQobmV3X2ZpcnN0LCB0b19ibGspOworCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dDsKIAl9Ci0KLQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBiaCwKLQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJcmV0ID0gb2NmczJfeGF0dHJfYnVja2V0X2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgbmV3X2ZpcnN0LAorCQkJCQkJT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dDsKIAl9CiAKLQl4aCA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICopYmgtPmJfZGF0YTsKLQl4aC0+eGhfbnVtX2J1Y2tldHMgPSBjcHVfdG9fbGUxNihudW1fYnVja2V0cyk7CisJLyogTm93IHVwZGF0ZSB0aGUgaGVhZGVycyAqLworCWxlMTZfYWRkX2NwdSgmYnVja2V0X3hoKG9sZF9maXJzdCktPnhoX251bV9idWNrZXRzLCAtbnVtX2J1Y2tldHMpOworCW9jZnMyX3hhdHRyX2J1Y2tldF9qb3VybmFsX2RpcnR5KGhhbmRsZSwgb2xkX2ZpcnN0KTsKIAotCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBiaCk7CisJYnVja2V0X3hoKG5ld19maXJzdCktPnhoX251bV9idWNrZXRzID0gY3B1X3RvX2xlMTYobnVtX2J1Y2tldHMpOworCW9jZnMyX3hhdHRyX2J1Y2tldF9qb3VybmFsX2RpcnR5KGhhbmRsZSwgbmV3X2ZpcnN0KTsKIAogCWlmIChmaXJzdF9oYXNoKQotCQkqZmlyc3RfaGFzaCA9IGxlMzJfdG9fY3B1KHhoLT54aF9lbnRyaWVzWzBdLnhlX25hbWVfaGFzaCk7CisJCSpmaXJzdF9oYXNoID0gbGUzMl90b19jcHUoYnVja2V0X3hoKG5ld19maXJzdCktPnhoX2VudHJpZXNbMF0ueGVfbmFtZV9oYXNoKTsKKwogb3V0OgotCWJyZWxzZShiaCk7CisJb2NmczJfeGF0dHJfYnVja2V0X2ZyZWUobmV3X2ZpcnN0KTsKKwlvY2ZzMl94YXR0cl9idWNrZXRfZnJlZShvbGRfZmlyc3QpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTM1MzQsNyArNDEyMyw3IEBACiAJCQkJICAgICAgdTMyICpmaXJzdF9oYXNoKQogewogCXUxNiBibGtfcGVyX2J1Y2tldCA9IG9jZnMyX2Jsb2Nrc19wZXJfeGF0dHJfYnVja2V0KGlub2RlLT5pX3NiKTsKLQlpbnQgcmV0LCBjcmVkaXRzID0gMiAqIGJsa19wZXJfYnVja2V0OworCWludCByZXQsIGNyZWRpdHMgPSAyICogYmxrX3Blcl9idWNrZXQgKyBoYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHM7CiAKIAlCVUdfT04oT0NGUzJfWEFUVFJfQlVDS0VUX1NJWkUgPCBPQ0ZTMl9TQihpbm9kZS0+aV9zYiktPnNfY2x1c3RlcnNpemUpOwogCkBAIC0zNTc3LDQzICs0MTY2LDQ5IEBACiAgKi8KIHN0YXRpYyBpbnQgb2NmczJfYWRqdXN0X3hhdHRyX2Nyb3NzX2NsdXN0ZXIoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkJICAgIGhhbmRsZV90ICpoYW5kbGUsCi0JCQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipmaXJzdF9iaCwKLQkJCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmhlYWRlcl9iaCwKKwkJCQkJICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9idWNrZXQgKmZpcnN0LAorCQkJCQkgICAgc3RydWN0IG9jZnMyX3hhdHRyX2J1Y2tldCAqdGFyZ2V0LAogCQkJCQkgICAgdTY0IG5ld19ibGssCi0JCQkJCSAgICB1NjQgcHJldl9ibGssCiAJCQkJCSAgICB1MzIgcHJldl9jbHVzdGVycywKIAkJCQkJICAgIHUzMiAqdl9zdGFydCwKIAkJCQkJICAgIGludCAqZXh0ZW5kKQogewotCWludCByZXQgPSAwOwotCWludCBicGMgPSBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3MoaW5vZGUtPmlfc2IsIDEpOworCWludCByZXQ7CiAKIAltbG9nKDAsICJhZGp1c3QgeGF0dHJzIGZyb20gY2x1c3RlciAlbGx1IGxlbiAldSB0byAlbGx1XG4iLAotCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwcmV2X2JsaywgcHJldl9jbHVzdGVycywKKwkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYnVja2V0X2Jsa25vKGZpcnN0KSwgcHJldl9jbHVzdGVycywKIAkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbmV3X2Jsayk7CiAKLQlpZiAob2NmczJfeGF0dHJfYnVja2V0c19wZXJfY2x1c3RlcihPQ0ZTMl9TQihpbm9kZS0+aV9zYikpID4gMSkKKwlpZiAob2NmczJfeGF0dHJfYnVja2V0c19wZXJfY2x1c3RlcihPQ0ZTMl9TQihpbm9kZS0+aV9zYikpID4gMSkgewogCQlyZXQgPSBvY2ZzMl9tdl94YXR0cl9idWNrZXRfY3Jvc3NfY2x1c3Rlcihpbm9kZSwKIAkJCQkJCQkgIGhhbmRsZSwKLQkJCQkJCQkgIGZpcnN0X2JoLAotCQkJCQkJCSAgaGVhZGVyX2JoLAorCQkJCQkJCSAgZmlyc3QsIHRhcmdldCwKIAkJCQkJCQkgIG5ld19ibGssCi0JCQkJCQkJICBwcmV2X2JsaywKIAkJCQkJCQkgIHByZXZfY2x1c3RlcnMsCiAJCQkJCQkJICB2X3N0YXJ0KTsKLQllbHNlIHsKLQkJdTY0IGxhc3RfYmxrID0gcHJldl9ibGsgKyBicGMgKiAocHJldl9jbHVzdGVycyAtIDEpOworCQlpZiAocmV0KQorCQkJbWxvZ19lcnJubyhyZXQpOworCX0gZWxzZSB7CisJCS8qIFRoZSBzdGFydCBvZiB0aGUgbGFzdCBjbHVzdGVyIGluIHRoZSBmaXJzdCBleHRlbnQgKi8KKwkJdTY0IGxhc3RfYmxrID0gYnVja2V0X2Jsa25vKGZpcnN0KSArCisJCQkoKHByZXZfY2x1c3RlcnMgLSAxKSAqCisJCQkgb2NmczJfY2x1c3RlcnNfdG9fYmxvY2tzKGlub2RlLT5pX3NiLCAxKSk7CiAKLQkJaWYgKHByZXZfY2x1c3RlcnMgPiAxICYmICgqaGVhZGVyX2JoKS0+Yl9ibG9ja25yICE9IGxhc3RfYmxrKQotCQkJcmV0ID0gb2NmczJfY3BfeGF0dHJfY2x1c3Rlcihpbm9kZSwgaGFuZGxlLCAqZmlyc3RfYmgsCi0JCQkJCQkgICAgIGxhc3RfYmxrLCBuZXdfYmxrLAorCQlpZiAocHJldl9jbHVzdGVycyA+IDEgJiYgYnVja2V0X2Jsa25vKHRhcmdldCkgIT0gbGFzdF9ibGspIHsKKwkJCXJldCA9IG9jZnMyX212X3hhdHRyX2J1Y2tldHMoaW5vZGUsIGhhbmRsZSwKKwkJCQkJCSAgICAgYnVja2V0X2Jsa25vKGZpcnN0KSwKKwkJCQkJCSAgICAgbGFzdF9ibGssIG5ld19ibGssIDAsCiAJCQkJCQkgICAgIHZfc3RhcnQpOwotCQllbHNlIHsKKwkJCWlmIChyZXQpCisJCQkJbWxvZ19lcnJubyhyZXQpOworCQl9IGVsc2UgewogCQkJcmV0ID0gb2NmczJfZGl2aWRlX3hhdHRyX2NsdXN0ZXIoaW5vZGUsIGhhbmRsZSwKIAkJCQkJCQkgbGFzdF9ibGssIG5ld19ibGssCiAJCQkJCQkJIHZfc3RhcnQpOworCQkJaWYgKHJldCkKKwkJCQltbG9nX2Vycm5vKHJldCk7CiAKLQkJCWlmICgoKmhlYWRlcl9iaCktPmJfYmxvY2tuciA9PSBsYXN0X2JsayAmJiBleHRlbmQpCisJCQlpZiAoKGJ1Y2tldF9ibGtubyh0YXJnZXQpID09IGxhc3RfYmxrKSAmJiBleHRlbmQpCiAJCQkJKmV4dGVuZCA9IDA7CiAJCX0KIAl9CkBAIC0zNjM5LDU2ICs0MjM0LDM3IEBACiAgKi8KIHN0YXRpYyBpbnQgb2NmczJfYWRkX25ld194YXR0cl9jbHVzdGVyKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqcm9vdF9iaCwKLQkJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqZmlyc3RfYmgsCi0JCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmhlYWRlcl9iaCwKKwkJCQkgICAgICAgc3RydWN0IG9jZnMyX3hhdHRyX2J1Y2tldCAqZmlyc3QsCisJCQkJICAgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9idWNrZXQgKnRhcmdldCwKIAkJCQkgICAgICAgdTMyICpudW1fY2x1c3RlcnMsCiAJCQkJICAgICAgIHUzMiBwcmV2X2Nwb3MsCi0JCQkJICAgICAgIHU2NCBwcmV2X2Jsa25vLAotCQkJCSAgICAgICBpbnQgKmV4dGVuZCkKKwkJCQkgICAgICAgaW50ICpleHRlbmQsCisJCQkJICAgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9zZXRfY3R4dCAqY3R4dCkKIHsKLQlpbnQgcmV0LCBjcmVkaXRzOworCWludCByZXQ7CiAJdTE2IGJwYyA9IG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgMSk7CiAJdTMyIHByZXZfY2x1c3RlcnMgPSAqbnVtX2NsdXN0ZXJzOwogCXUzMiBjbHVzdGVyc190b19hZGQgPSAxLCBiaXRfb2ZmLCBudW1fYml0cywgdl9zdGFydCA9IDA7CiAJdTY0IGJsb2NrOwotCWhhbmRsZV90ICpoYW5kbGUgPSBOVUxMOwotCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICpkYXRhX2FjID0gTlVMTDsKLQlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYyA9IE5VTEw7CisJaGFuZGxlX3QgKmhhbmRsZSA9IGN0eHQtPmhhbmRsZTsKIAlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKIAlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3RyZWUgZXQ7CiAKIAltbG9nKDAsICJBZGQgbmV3IHhhdHRyIGNsdXN0ZXIgZm9yICVsbHUsIHByZXZpb3VzIHhhdHRyIGhhc2ggPSAldSwgIgogCSAgICAgInByZXZpb3VzIHhhdHRyIGJsa25vID0gJWxsdVxuIiwKIAkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAotCSAgICAgcHJldl9jcG9zLCAodW5zaWduZWQgbG9uZyBsb25nKXByZXZfYmxrbm8pOworCSAgICAgcHJldl9jcG9zLCAodW5zaWduZWQgbG9uZyBsb25nKWJ1Y2tldF9ibGtubyhmaXJzdCkpOwogCiAJb2NmczJfaW5pdF94YXR0cl90cmVlX2V4dGVudF90cmVlKCZldCwgaW5vZGUsIHJvb3RfYmgpOwogCi0JcmV0ID0gb2NmczJfbG9ja19hbGxvY2F0b3JzKGlub2RlLCAmZXQsIGNsdXN0ZXJzX3RvX2FkZCwgMCwKLQkJCQkgICAgJmRhdGFfYWMsICZtZXRhX2FjKTsKLQlpZiAocmV0KSB7Ci0JCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBsZWF2ZTsKLQl9Ci0KLQljcmVkaXRzID0gb2NmczJfY2FsY19leHRlbmRfY3JlZGl0cyhvc2ItPnNiLCBldC5ldF9yb290X2VsLAotCQkJCQkgICAgY2x1c3RlcnNfdG9fYWRkKTsKLQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIGNyZWRpdHMpOwotCWlmIChJU19FUlIoaGFuZGxlKSkgewotCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7Ci0JCWhhbmRsZSA9IE5VTEw7Ci0JCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBsZWF2ZTsKLQl9Ci0KLQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCByb290X2JoLAotCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc194YihoYW5kbGUsIGlub2RlLCByb290X2JoLAorCQkJCSAgICAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAlpZiAocmV0IDwgMCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gbGVhdmU7CiAJfQogCi0JcmV0ID0gX19vY2ZzMl9jbGFpbV9jbHVzdGVycyhvc2IsIGhhbmRsZSwgZGF0YV9hYywgMSwKKwlyZXQgPSBfX29jZnMyX2NsYWltX2NsdXN0ZXJzKG9zYiwgaGFuZGxlLCBjdHh0LT5kYXRhX2FjLCAxLAogCQkJCSAgICAgY2x1c3RlcnNfdG9fYWRkLCAmYml0X29mZiwgJm51bV9iaXRzKTsKIAlpZiAocmV0IDwgMCkgewogCQlpZiAocmV0ICE9IC1FTk9TUEMpCkBAIC0zNzAyLDcgKzQyNzgsNyBAQAogCW1sb2coMCwgIkFsbG9jYXRpbmcgJXUgY2x1c3RlcnMgYXQgYmxvY2sgJXUgZm9yIHhhdHRyIGluIGlub2RlICVsbHVcbiIsCiAJICAgICBudW1fYml0cywgYml0X29mZiwgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8pOwogCi0JaWYgKHByZXZfYmxrbm8gKyBwcmV2X2NsdXN0ZXJzICogYnBjID09IGJsb2NrICYmCisJaWYgKGJ1Y2tldF9ibGtubyhmaXJzdCkgKyAocHJldl9jbHVzdGVycyAqIGJwYykgPT0gYmxvY2sgJiYKIAkgICAgKHByZXZfY2x1c3RlcnMgKyBudW1fYml0cykgPDwgb3NiLT5zX2NsdXN0ZXJzaXplX2JpdHMgPD0KIAkgICAgIE9DRlMyX01BWF9YQVRUUl9UUkVFX0xFQUZfU0laRSkgewogCQkvKgpAQCAtMzcyMSwxMCArNDI5Nyw5IEBACiAJfSBlbHNlIHsKIAkJcmV0ID0gb2NmczJfYWRqdXN0X3hhdHRyX2Nyb3NzX2NsdXN0ZXIoaW5vZGUsCiAJCQkJCQkgICAgICAgaGFuZGxlLAotCQkJCQkJICAgICAgIGZpcnN0X2JoLAotCQkJCQkJICAgICAgIGhlYWRlcl9iaCwKKwkJCQkJCSAgICAgICBmaXJzdCwKKwkJCQkJCSAgICAgICB0YXJnZXQsCiAJCQkJCQkgICAgICAgYmxvY2ssCi0JCQkJCQkgICAgICAgcHJldl9ibGtubywKIAkJCQkJCSAgICAgICBwcmV2X2NsdXN0ZXJzLAogCQkJCQkJICAgICAgICZ2X3N0YXJ0LAogCQkJCQkJICAgICAgIGV4dGVuZCk7CkBAIC0zNzM0LDE0OSArNDMwOSwxMzcgQEAKIAkJfQogCX0KIAotCWlmIChoYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHMgPCBjcmVkaXRzKSB7Ci0JCS8qCi0JCSAqIFRoZSBqb3VybmFsIGhhcyBiZWVuIHJlc3RhcnRlZCBiZWZvcmUsIGFuZCBkb24ndAotCQkgKiBoYXZlIGVub3VnaCBzcGFjZSBmb3IgdGhlIGluc2VydGlvbiwgc28gZXh0ZW5kIGl0Ci0JCSAqIGhlcmUuCi0JCSAqLwotCQlyZXQgPSBvY2ZzMl9leHRlbmRfdHJhbnMoaGFuZGxlLCBjcmVkaXRzKTsKLQkJaWYgKHJldCkgewotCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJZ290byBsZWF2ZTsKLQkJfQotCX0KIAltbG9nKDAsICJJbnNlcnQgJXUgY2x1c3RlcnMgYXQgYmxvY2sgJWxsdSBmb3IgeGF0dHIgYXQgJXVcbiIsCiAJICAgICBudW1fYml0cywgKHVuc2lnbmVkIGxvbmcgbG9uZylibG9jaywgdl9zdGFydCk7CiAJcmV0ID0gb2NmczJfaW5zZXJ0X2V4dGVudChvc2IsIGhhbmRsZSwgaW5vZGUsICZldCwgdl9zdGFydCwgYmxvY2ssCi0JCQkJICBudW1fYml0cywgMCwgbWV0YV9hYyk7CisJCQkJICBudW1fYml0cywgMCwgY3R4dC0+bWV0YV9hYyk7CiAJaWYgKHJldCA8IDApIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIGxlYXZlOwogCX0KIAogCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCByb290X2JoKTsKLQlpZiAocmV0IDwgMCkgeworCWlmIChyZXQgPCAwKQogCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gbGVhdmU7Ci0JfQogCiBsZWF2ZToKLQlpZiAoaGFuZGxlKQotCQlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOwotCWlmIChkYXRhX2FjKQotCQlvY2ZzMl9mcmVlX2FsbG9jX2NvbnRleHQoZGF0YV9hYyk7Ci0JaWYgKG1ldGFfYWMpCi0JCW9jZnMyX2ZyZWVfYWxsb2NfY29udGV4dChtZXRhX2FjKTsKLQogCXJldHVybiByZXQ7CiB9CiAKIC8qCi0gKiBFeHRlbmQgYSBuZXcgeGF0dHIgYnVja2V0IGFuZCBtb3ZlIHhhdHRycyB0byB0aGUgZW5kIG9uZSBieSBvbmUgdW50aWwKLSAqIFdlIG1lZXQgd2l0aCBzdGFydF9iaC4gT25seSBtb3ZlIGhhbGYgb2YgdGhlIHhhdHRycyB0byB0aGUgYnVja2V0IGFmdGVyIGl0LgorICogV2UgYXJlIGdpdmVuIGFuIGV4dGVudC4gICdmaXJzdCcgaXMgdGhlIGJ1Y2tldCBhdCB0aGUgdmVyeSBmcm9udCBvZgorICogdGhlIGV4dGVudC4gIFRoZSBleHRlbnQgaGFzIHNwYWNlIGZvciBhbiBhZGRpdGlvbmFsIGJ1Y2tldCBwYXN0CisgKiBidWNrZXRfeGgoZmlyc3QpLT54aF9udW1fYnVja2V0cy4gICd0YXJnZXRfYmxrbm8nIGlzIHRoZSBibG9jayBudW1iZXIKKyAqIG9mIHRoZSB0YXJnZXQgYnVja2V0LiAgV2Ugd2lzaCB0byBzaGlmdCBldmVyeSBidWNrZXQgcGFzdCB0aGUgdGFyZ2V0CisgKiBkb3duIG9uZSwgZmlsbGluZyBpbiB0aGF0IGFkZGl0aW9uYWwgc3BhY2UuICBXaGVuIHdlIGdldCBiYWNrIHRvIHRoZQorICogdGFyZ2V0LCB3ZSBzcGxpdCB0aGUgdGFyZ2V0IGJldHdlZW4gaXRzZWxmIGFuZCB0aGUgbm93LWVtcHR5IGJ1Y2tldAorICogYXQgdGFyZ2V0KzEgKGFrYSwgdGFyZ2V0X2Jsa25vICsgYmxrc19wZXJfYnVja2V0KS4KICAqLwogc3RhdGljIGludCBvY2ZzMl9leHRlbmRfeGF0dHJfYnVja2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmZpcnN0X2JoLAotCQkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpzdGFydF9iaCwKKwkJCQkgICAgIGhhbmRsZV90ICpoYW5kbGUsCisJCQkJICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfYnVja2V0ICpmaXJzdCwKKwkJCQkgICAgIHU2NCB0YXJnZXRfYmxrLAogCQkJCSAgICAgdTMyIG51bV9jbHVzdGVycykKIHsKIAlpbnQgcmV0LCBjcmVkaXRzOwogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOwogCXUxNiBibGtfcGVyX2J1Y2tldCA9IG9jZnMyX2Jsb2Nrc19wZXJfeGF0dHJfYnVja2V0KGlub2RlLT5pX3NiKTsKLQl1NjQgc3RhcnRfYmxrID0gc3RhcnRfYmgtPmJfYmxvY2tuciwgZW5kX2JsazsKLQl1MzIgbnVtX2J1Y2tldHMgPSBudW1fY2x1c3RlcnMgKiBvY2ZzMl94YXR0cl9idWNrZXRzX3Blcl9jbHVzdGVyKG9zYik7Ci0JaGFuZGxlX3QgKmhhbmRsZTsKLQlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICpmaXJzdF94aCA9Ci0JCQkJKHN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKilmaXJzdF9iaC0+Yl9kYXRhOwotCXUxNiBidWNrZXQgPSBsZTE2X3RvX2NwdShmaXJzdF94aC0+eGhfbnVtX2J1Y2tldHMpOworCXU2NCBlbmRfYmxrOworCXUxNiBuZXdfYnVja2V0ID0gbGUxNl90b19jcHUoYnVja2V0X3hoKGZpcnN0KS0+eGhfbnVtX2J1Y2tldHMpOwogCiAJbWxvZygwLCAiZXh0ZW5kIHhhdHRyIGJ1Y2tldCBpbiAlbGx1LCB4YXR0ciBleHRlbmQgcmVjIHN0YXJ0aW5nICIKLQkgICAgICJmcm9tICVsbHUsIGxlbiA9ICV1XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKXN0YXJ0X2JsaywKLQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZmlyc3RfYmgtPmJfYmxvY2tuciwgbnVtX2NsdXN0ZXJzKTsKKwkgICAgICJmcm9tICVsbHUsIGxlbiA9ICV1XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKXRhcmdldF9ibGssCisJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJ1Y2tldF9ibGtubyhmaXJzdCksIG51bV9jbHVzdGVycyk7CiAKLQlCVUdfT04oYnVja2V0ID49IG51bV9idWNrZXRzKTsKKwkvKiBUaGUgZXh0ZW50IG11c3QgaGF2ZSByb29tIGZvciBhbiBhZGRpdGlvbmFsIGJ1Y2tldCAqLworCUJVR19PTihuZXdfYnVja2V0ID49CisJICAgICAgIChudW1fY2x1c3RlcnMgKiBvY2ZzMl94YXR0cl9idWNrZXRzX3Blcl9jbHVzdGVyKG9zYikpKTsKIAotCWVuZF9ibGsgPSBmaXJzdF9iaC0+Yl9ibG9ja25yICsgKGJ1Y2tldCAtIDEpICogYmxrX3Blcl9idWNrZXQ7CisJLyogZW5kX2JsayBwb2ludHMgdG8gdGhlIGxhc3QgZXhpc3RpbmcgYnVja2V0ICovCisJZW5kX2JsayA9IGJ1Y2tldF9ibGtubyhmaXJzdCkgKyAoKG5ld19idWNrZXQgLSAxKSAqIGJsa19wZXJfYnVja2V0KTsKIAogCS8qCi0JICogV2Ugd2lsbCB0b3VjaCBhbGwgdGhlIGJ1Y2tldHMgYWZ0ZXIgdGhlIHN0YXJ0X2JoKGluY2x1ZGUgaXQpLgotCSAqIEFkZCBvbmUgbW9yZSBidWNrZXQgYW5kIG1vZGlmeSB0aGUgZmlyc3RfYmguCisJICogZW5kX2JsayBpcyB0aGUgc3RhcnQgb2YgdGhlIGxhc3QgZXhpc3RpbmcgYnVja2V0LgorCSAqIFRodXMsIChlbmRfYmxrIC0gdGFyZ2V0X2JsaykgY292ZXJzIHRoZSB0YXJnZXQgYnVja2V0IGFuZAorCSAqIGV2ZXJ5IGJ1Y2tldCBhZnRlciBpdCB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIHRoZSBsYXN0CisJICogZXhpc3RpbmcgYnVja2V0LiAgVGhlbiB3ZSBhZGQgdGhlIGxhc3QgZXhpc3RpbmcgYnVja2V0LCB0aGUKKwkgKiBuZXcgYnVja2V0LCBhbmQgdGhlIGZpcnN0IGJ1Y2tldCAoMyAqIGJsa19wZXJfYnVja2V0KS4KIAkgKi8KLQljcmVkaXRzID0gZW5kX2JsayAtIHN0YXJ0X2JsayArIDIgKiBibGtfcGVyX2J1Y2tldCArIDE7Ci0JaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBjcmVkaXRzKTsKLQlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKLQkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOwotCQloYW5kbGUgPSBOVUxMOworCWNyZWRpdHMgPSAoZW5kX2JsayAtIHRhcmdldF9ibGspICsgKDMgKiBibGtfcGVyX2J1Y2tldCkgKworCQkgIGhhbmRsZS0+aF9idWZmZXJfY3JlZGl0czsKKwlyZXQgPSBvY2ZzMl9leHRlbmRfdHJhbnMoaGFuZGxlLCBjcmVkaXRzKTsKKwlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CiAJfQogCi0JcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZmlyc3RfYmgsCi0JCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCXJldCA9IG9jZnMyX3hhdHRyX2J1Y2tldF9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGZpcnN0LAorCQkJCQkJT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIGNvbW1pdDsKKwkJZ290byBvdXQ7CiAJfQogCi0Jd2hpbGUgKGVuZF9ibGsgIT0gc3RhcnRfYmxrKSB7CisJd2hpbGUgKGVuZF9ibGsgIT0gdGFyZ2V0X2JsaykgewogCQlyZXQgPSBvY2ZzMl9jcF94YXR0cl9idWNrZXQoaW5vZGUsIGhhbmRsZSwgZW5kX2JsaywKIAkJCQkJICAgIGVuZF9ibGsgKyBibGtfcGVyX2J1Y2tldCwgMCk7CiAJCWlmIChyZXQpCi0JCQlnb3RvIGNvbW1pdDsKKwkJCWdvdG8gb3V0OwogCQllbmRfYmxrIC09IGJsa19wZXJfYnVja2V0OwogCX0KIAotCS8qIE1vdmUgaGFsZiBvZiB0aGUgeGF0dHIgaW4gc3RhcnRfYmxrIHRvIHRoZSBuZXh0IGJ1Y2tldC4gKi8KLQlyZXQgPSBvY2ZzMl9kaXZpZGVfeGF0dHJfYnVja2V0KGlub2RlLCBoYW5kbGUsIHN0YXJ0X2JsaywKLQkJCQkJc3RhcnRfYmxrICsgYmxrX3Blcl9idWNrZXQsIE5VTEwsIDApOworCS8qIE1vdmUgaGFsZiBvZiB0aGUgeGF0dHIgaW4gdGFyZ2V0X2Jsa25vIHRvIHRoZSBuZXh0IGJ1Y2tldC4gKi8KKwlyZXQgPSBvY2ZzMl9kaXZpZGVfeGF0dHJfYnVja2V0KGlub2RlLCBoYW5kbGUsIHRhcmdldF9ibGssCisJCQkJCXRhcmdldF9ibGsgKyBibGtfcGVyX2J1Y2tldCwgTlVMTCwgMCk7CiAKLQlsZTE2X2FkZF9jcHUoJmZpcnN0X3hoLT54aF9udW1fYnVja2V0cywgMSk7Ci0Jb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGZpcnN0X2JoKTsKKwlsZTE2X2FkZF9jcHUoJmJ1Y2tldF94aChmaXJzdCktPnhoX251bV9idWNrZXRzLCAxKTsKKwlvY2ZzMl94YXR0cl9idWNrZXRfam91cm5hbF9kaXJ0eShoYW5kbGUsIGZpcnN0KTsKIAotY29tbWl0OgotCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CiBvdXQ6CiAJcmV0dXJuIHJldDsKIH0KIAogLyoKLSAqIEFkZCBuZXcgeGF0dHIgYnVja2V0IGluIGFuIGV4dGVudCByZWNvcmQgYW5kIGFkanVzdCB0aGUgYnVja2V0cyBhY2NvcmRpbmdseS4KLSAqIHhiX2JoIGlzIHRoZSBvY2ZzMl94YXR0cl9ibG9jay4KLSAqIFdlIHdpbGwgbW92ZSBhbGwgdGhlIGJ1Y2tldHMgc3RhcnRpbmcgZnJvbSBoZWFkZXJfYmggdG8gdGhlIG5leHQgcGxhY2UuIEFzCi0gKiBmb3IgdGhpcyBvbmUsIGhhbGYgbnVtIG9mIGl0cyB4YXR0cnMgd2lsbCBiZSBtb3ZlZCB0byB0aGUgbmV4dCBvbmUuCisgKiBBZGQgbmV3IHhhdHRyIGJ1Y2tldCBpbiBhbiBleHRlbnQgcmVjb3JkIGFuZCBhZGp1c3QgdGhlIGJ1Y2tldHMKKyAqIGFjY29yZGluZ2x5LiAgeGJfYmggaXMgdGhlIG9jZnMyX3hhdHRyX2Jsb2NrLCBhbmQgdGFyZ2V0IGlzIHRoZQorICogYnVja2V0IHdlIHdhbnQgdG8gaW5zZXJ0IGludG8uCiAgKgotICogV2Ugd2lsbCBhbGxvY2F0ZSBhIG5ldyBjbHVzdGVyIGlmIGN1cnJlbnQgY2x1c3RlciBpcyBmdWxsIGFuZCBhZGp1c3QKLSAqIGhlYWRlcl9iaCBhbmQgZmlyc3RfYmggaWYgdGhlIGluc2VydCBwbGFjZSBpcyBtb3ZlZCB0byB0aGUgbmV3IGNsdXN0ZXIuCisgKiBJbiB0aGUgZWFzeSBjYXNlLCB3ZSB3aWxsIG1vdmUgYWxsIHRoZSBidWNrZXRzIGFmdGVyIHRhcmdldCBkb3duIGJ5CisgKiBvbmUuIEhhbGYgb2YgdGFyZ2V0J3MgeGF0dHJzIHdpbGwgYmUgbW92ZWQgdG8gdGhlIG5leHQgYnVja2V0LgorICoKKyAqIElmIGN1cnJlbnQgY2x1c3RlciBpcyBmdWxsLCB3ZSdsbCBhbGxvY2F0ZSBhIG5ldyBvbmUuICBUaGlzIG1heSBub3QKKyAqIGJlIGNvbnRpZ3VvdXMuICBUaGUgdW5kZXJseWluZyBjYWxscyB3aWxsIG1ha2Ugc3VyZSB0aGF0IHRoZXJlIGlzCisgKiBzcGFjZSBmb3IgdGhlIGluc2VydCwgc2hpZnRpbmcgYnVja2V0cyBhcm91bmQgaWYgbmVjZXNzYXJ5LgorICogJ3RhcmdldCcgbWF5IGJlIG1vdmVkIGJ5IHRob3NlIGNhbGxzLgogICovCiBzdGF0aWMgaW50IG9jZnMyX2FkZF9uZXdfeGF0dHJfYnVja2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICp4Yl9iaCwKLQkJCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWRlcl9iaCkKKwkJCQkgICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfYnVja2V0ICp0YXJnZXQsCisJCQkJICAgICAgc3RydWN0IG9jZnMyX3hhdHRyX3NldF9jdHh0ICpjdHh0KQogewotCXN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKmZpcnN0X3hoID0gTlVMTDsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmZpcnN0X2JoID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2sgKnhiID0KIAkJCShzdHJ1Y3Qgb2NmczJfeGF0dHJfYmxvY2sgKil4Yl9iaC0+Yl9kYXRhOwogCXN0cnVjdCBvY2ZzMl94YXR0cl90cmVlX3Jvb3QgKnhiX3Jvb3QgPSAmeGItPnhiX2F0dHJzLnhiX3Jvb3Q7CiAJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCA9ICZ4Yl9yb290LT54dF9saXN0OwotCXN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKnhoID0KLQkJCShzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICopaGVhZGVyX2JoLT5iX2RhdGE7Ci0JdTMyIG5hbWVfaGFzaCA9IGxlMzJfdG9fY3B1KHhoLT54aF9lbnRyaWVzWzBdLnhlX25hbWVfaGFzaCk7Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOwotCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0Ioc2IpOworCXUzMiBuYW1lX2hhc2ggPQorCQlsZTMyX3RvX2NwdShidWNrZXRfeGgodGFyZ2V0KS0+eGhfZW50cmllc1swXS54ZV9uYW1lX2hhc2gpOworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOwogCWludCByZXQsIG51bV9idWNrZXRzLCBleHRlbmQgPSAxOwogCXU2NCBwX2Jsa25vOwogCXUzMiBlX2Nwb3MsIG51bV9jbHVzdGVyczsKKwkvKiBUaGUgYnVja2V0IGF0IHRoZSBmcm9udCBvZiB0aGUgZXh0ZW50ICovCisJc3RydWN0IG9jZnMyX3hhdHRyX2J1Y2tldCAqZmlyc3Q7CiAKLQltbG9nKDAsICJBZGQgbmV3IHhhdHRyIGJ1Y2tldCBzdGFydGluZyBmb3JtICVsbHVcbiIsCi0JICAgICAodW5zaWduZWQgbG9uZyBsb25nKWhlYWRlcl9iaC0+Yl9ibG9ja25yKTsKKwltbG9nKDAsICJBZGQgbmV3IHhhdHRyIGJ1Y2tldCBzdGFydGluZyBmcm9tICVsbHVcbiIsCisJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJ1Y2tldF9ibGtubyh0YXJnZXQpKTsKIAotCS8qCi0JICogQWRkIHJlZnJlbmNlIGZvciBoZWFkZXJfYmggaGVyZSBiZWNhdXNlIGl0IG1heSBiZQotCSAqIGNoYW5nZWQgaW4gb2NmczJfYWRkX25ld194YXR0cl9jbHVzdGVyIGFuZCB3ZSBuZWVkCi0JICogdG8gZnJlZSBpdCBpbiB0aGUgZW5kLgotCSAqLwotCWdldF9iaChoZWFkZXJfYmgpOworCS8qIFRoZSBmaXJzdCBidWNrZXQgb2YgdGhlIG9yaWdpbmFsIGV4dGVudCAqLworCWZpcnN0ID0gb2NmczJfeGF0dHJfYnVja2V0X25ldyhpbm9kZSk7CisJaWYgKCFmaXJzdCkgeworCQlyZXQgPSAtRU5PTUVNOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KIAogCXJldCA9IG9jZnMyX3hhdHRyX2dldF9yZWMoaW5vZGUsIG5hbWVfaGFzaCwgJnBfYmxrbm8sICZlX2Nwb3MsCiAJCQkJICAmbnVtX2NsdXN0ZXJzLCBlbCk7CkBAIC0zODg1LDQwICs0NDQ4LDQ1IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIHBfYmxrbm8sICZmaXJzdF9iaCk7CisJcmV0ID0gb2NmczJfcmVhZF94YXR0cl9idWNrZXQoZmlyc3QsIHBfYmxrbm8pOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dDsKIAl9CiAKIAludW1fYnVja2V0cyA9IG9jZnMyX3hhdHRyX2J1Y2tldHNfcGVyX2NsdXN0ZXIob3NiKSAqIG51bV9jbHVzdGVyczsKLQlmaXJzdF94aCA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICopZmlyc3RfYmgtPmJfZGF0YTsKLQotCWlmIChudW1fYnVja2V0cyA9PSBsZTE2X3RvX2NwdShmaXJzdF94aC0+eGhfbnVtX2J1Y2tldHMpKSB7CisJaWYgKG51bV9idWNrZXRzID09IGxlMTZfdG9fY3B1KGJ1Y2tldF94aChmaXJzdCktPnhoX251bV9idWNrZXRzKSkgeworCQkvKgorCQkgKiBUaGlzIGNhbiBtb3ZlIGZpcnN0K3RhcmdldCBpZiB0aGUgdGFyZ2V0IGJ1Y2tldCBtb3ZlcworCQkgKiB0byB0aGUgbmV3IGV4dGVudC4KKwkJICovCiAJCXJldCA9IG9jZnMyX2FkZF9uZXdfeGF0dHJfY2x1c3Rlcihpbm9kZSwKIAkJCQkJCSAgeGJfYmgsCi0JCQkJCQkgICZmaXJzdF9iaCwKLQkJCQkJCSAgJmhlYWRlcl9iaCwKKwkJCQkJCSAgZmlyc3QsCisJCQkJCQkgIHRhcmdldCwKIAkJCQkJCSAgJm51bV9jbHVzdGVycywKIAkJCQkJCSAgZV9jcG9zLAotCQkJCQkJICBwX2Jsa25vLAotCQkJCQkJICAmZXh0ZW5kKTsKKwkJCQkJCSAgJmV4dGVuZCwKKwkJCQkJCSAgY3R4dCk7CiAJCWlmIChyZXQpIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCWdvdG8gb3V0OwogCQl9CiAJfQogCi0JaWYgKGV4dGVuZCkKKwlpZiAoZXh0ZW5kKSB7CiAJCXJldCA9IG9jZnMyX2V4dGVuZF94YXR0cl9idWNrZXQoaW5vZGUsCi0JCQkJCQlmaXJzdF9iaCwKLQkJCQkJCWhlYWRlcl9iaCwKKwkJCQkJCWN0eHQtPmhhbmRsZSwKKwkJCQkJCWZpcnN0LAorCQkJCQkJYnVja2V0X2Jsa25vKHRhcmdldCksCiAJCQkJCQludW1fY2x1c3RlcnMpOwotCWlmIChyZXQpCi0JCW1sb2dfZXJybm8ocmV0KTsKKwkJaWYgKHJldCkKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwl9CisKIG91dDoKLQlicmVsc2UoZmlyc3RfYmgpOwotCWJyZWxzZShoZWFkZXJfYmgpOworCW9jZnMyX3hhdHRyX2J1Y2tldF9mcmVlKGZpcnN0KTsKKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTM5MjksNyArNDQ5Nyw3IEBACiAJaW50IGJsb2NrX29mZiA9IG9mZnMgPj4gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHM7CiAKIAlvZmZzID0gb2ZmcyAlIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKLQlyZXR1cm4gYnVja2V0LT5iaHNbYmxvY2tfb2ZmXS0+Yl9kYXRhICsgb2ZmczsKKwlyZXR1cm4gYnVja2V0X2Jsb2NrKGJ1Y2tldCwgYmxvY2tfb2ZmKSArIG9mZnM7CiB9CiAKIC8qCkBAIC0zOTg0LDcgKzQ1NTIsNyBAQAogCQkJCXhlLT54ZV92YWx1ZV9zaXplID0gMDsKIAogCQkJdmFsID0gb2NmczJfeGF0dHJfYnVja2V0X2dldF92YWwoaW5vZGUsCi0JCQkJCQkJICZ4cy0+YnVja2V0LCBvZmZzKTsKKwkJCQkJCQkgeHMtPmJ1Y2tldCwgb2Zmcyk7CiAJCQltZW1zZXQodmFsICsgT0NGUzJfWEFUVFJfU0laRShuYW1lX2xlbiksIDAsCiAJCQkgICAgICAgc2l6ZSAtIE9DRlMyX1hBVFRSX1NJWkUobmFtZV9sZW4pKTsKIAkJCWlmIChPQ0ZTMl9YQVRUUl9TSVpFKHhpLT52YWx1ZV9sZW4pID4gMCkKQEAgLTQwNjIsOCArNDYzMCw3IEBACiAJCXhoLT54aF9mcmVlX3N0YXJ0ID0gY3B1X3RvX2xlMTYob2Zmcyk7CiAJfQogCi0JdmFsID0gb2NmczJfeGF0dHJfYnVja2V0X2dldF92YWwoaW5vZGUsCi0JCQkJCSAmeHMtPmJ1Y2tldCwgb2ZmcyAtIHNpemUpOworCXZhbCA9IG9jZnMyX3hhdHRyX2J1Y2tldF9nZXRfdmFsKGlub2RlLCB4cy0+YnVja2V0LCBvZmZzIC0gc2l6ZSk7CiAJeGUtPnhlX25hbWVfb2Zmc2V0ID0gY3B1X3RvX2xlMTYob2ZmcyAtIHNpemUpOwogCiAJbWVtc2V0KHZhbCwgMCwgc2l6ZSk7CkBAIC00MDc5LDEyNSArNDY0Niw0NSBAQAogCXJldHVybjsKIH0KIAotc3RhdGljIGludCBvY2ZzMl94YXR0cl9idWNrZXRfaGFuZGxlX2pvdXJuYWwoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkJICAgICBoYW5kbGVfdCAqaGFuZGxlLAotCQkJCQkgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggKnhzLAotCQkJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJocywKLQkJCQkJICAgICB1MTYgYmhfbnVtKQotewotCWludCByZXQgPSAwLCBvZmYsIGJsb2NrX29mZjsKLQlzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkgKnhlID0geHMtPmhlcmU7Ci0KLQkvKgotCSAqIEZpcnN0IGNhbGN1bGF0ZSBhbGwgdGhlIGJsb2NrcyB3ZSBzaG91bGQgam91cm5hbF9hY2Nlc3MKLQkgKiBhbmQgam91cm5hbF9kaXJ0eS4gVGhlIGZpcnN0IGJsb2NrIHNob3VsZCBhbHdheXMgYmUgdG91Y2hlZC4KLQkgKi8KLQlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgYmhzWzBdKTsKLQlpZiAocmV0KQotCQltbG9nX2Vycm5vKHJldCk7Ci0KLQkvKiBjYWxjIHRoZSBkYXRhLiAqLwotCW9mZiA9IGxlMTZfdG9fY3B1KHhlLT54ZV9uYW1lX29mZnNldCk7Ci0JYmxvY2tfb2ZmID0gb2ZmID4+IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzOwotCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBiaHNbYmxvY2tfb2ZmXSk7Ci0JaWYgKHJldCkKLQkJbWxvZ19lcnJubyhyZXQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQogLyoKICAqIFNldCB0aGUgeGF0dHIgZW50cnkgaW4gdGhlIHNwZWNpZmllZCBidWNrZXQuCiAgKiBUaGUgYnVja2V0IGlzIGluZGljYXRlZCBieSB4cy0+YnVja2V0IGFuZCBpdCBzaG91bGQgaGF2ZSB0aGUgZW5vdWdoCiAgKiBzcGFjZSBmb3IgdGhlIHhhdHRyIGluc2VydGlvbi4KICAqLwogc3RhdGljIGludCBvY2ZzMl94YXR0cl9zZXRfZW50cnlfaW5fYnVja2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJCSAgIHN0cnVjdCBvY2ZzMl94YXR0cl9pbmZvICp4aSwKIAkJCQkJICAgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMsCiAJCQkJCSAgIHUzMiBuYW1lX2hhc2gsCiAJCQkJCSAgIGludCBsb2NhbCkKIHsKLQlpbnQgaSwgcmV0OwotCWhhbmRsZV90ICpoYW5kbGUgPSBOVUxMOwotCXUxNiBibGtfcGVyX2J1Y2tldCA9IG9jZnMyX2Jsb2Nrc19wZXJfeGF0dHJfYnVja2V0KGlub2RlLT5pX3NiKTsKLQlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwlpbnQgcmV0OworCXU2NCBibGtubzsKIAogCW1sb2coMCwgIlNldCB4YXR0ciBlbnRyeSBsZW4gPSAlbHUgaW5kZXggPSAlZCBpbiBidWNrZXQgJWxsdVxuIiwKIAkgICAgICh1bnNpZ25lZCBsb25nKXhpLT52YWx1ZV9sZW4sIHhpLT5uYW1lX2luZGV4LAotCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl4cy0+YnVja2V0LmJoc1swXS0+Yl9ibG9ja25yKTsKKwkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYnVja2V0X2Jsa25vKHhzLT5idWNrZXQpKTsKIAotCWlmICgheHMtPmJ1Y2tldC5iaHNbMV0pIHsKLQkJcmV0ID0gb2NmczJfcmVhZF9ibG9ja3MoaW5vZGUsCi0JCQkJCXhzLT5idWNrZXQuYmhzWzBdLT5iX2Jsb2NrbnIgKyAxLAotCQkJCQlibGtfcGVyX2J1Y2tldCAtIDEsICZ4cy0+YnVja2V0LmJoc1sxXSwKLQkJCQkJMCk7CisJaWYgKCF4cy0+YnVja2V0LT5idV9iaHNbMV0pIHsKKwkJYmxrbm8gPSBidWNrZXRfYmxrbm8oeHMtPmJ1Y2tldCk7CisJCW9jZnMyX3hhdHRyX2J1Y2tldF9yZWxzZSh4cy0+YnVja2V0KTsKKwkJcmV0ID0gb2NmczJfcmVhZF94YXR0cl9idWNrZXQoeHMtPmJ1Y2tldCwgYmxrbm8pOwogCQlpZiAocmV0KSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlnb3RvIG91dDsKIAkJfQogCX0KIAotCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgYmxrX3Blcl9idWNrZXQpOwotCWlmIChJU19FUlIoaGFuZGxlKSkgewotCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7Ci0JCWhhbmRsZSA9IE5VTEw7CisJcmV0ID0gb2NmczJfeGF0dHJfYnVja2V0X2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgeHMtPmJ1Y2tldCwKKwkJCQkJCU9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwlpZiAocmV0IDwgMCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBibGtfcGVyX2J1Y2tldDsgaSsrKSB7Ci0JCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHhzLT5idWNrZXQuYmhzW2ldLAotCQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQltbG9nX2Vycm5vKHJldCk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQogCW9jZnMyX3hhdHRyX3NldF9lbnRyeV9ub3JtYWwoaW5vZGUsIHhpLCB4cywgbmFtZV9oYXNoLCBsb2NhbCk7CisJb2NmczJfeGF0dHJfYnVja2V0X2pvdXJuYWxfZGlydHkoaGFuZGxlLCB4cy0+YnVja2V0KTsKIAotCS8qT25seSBkaXJ0eSB0aGUgYmxvY2tzIHdlIGhhdmUgdG91Y2hlZCBpbiBzZXQgeGF0dHIuICovCi0JcmV0ID0gb2NmczJfeGF0dHJfYnVja2V0X2hhbmRsZV9qb3VybmFsKGlub2RlLCBoYW5kbGUsIHhzLAotCQkJCQkJeHMtPmJ1Y2tldC5iaHMsIGJsa19wZXJfYnVja2V0KTsKLQlpZiAocmV0KQotCQltbG9nX2Vycm5vKHJldCk7Ci1vdXQ6Ci0Jb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgb2NmczJfeGF0dHJfdmFsdWVfdXBkYXRlX3NpemUoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkJIHN0cnVjdCBidWZmZXJfaGVhZCAqeGVfYmgsCi0JCQkJCSBzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkgKnhlLAotCQkJCQkgdTY0IG5ld19zaXplKQotewotCWludCByZXQ7Ci0Jc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7Ci0JaGFuZGxlX3QgKmhhbmRsZSA9IE5VTEw7Ci0KLQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIDEpOwotCWlmIChJU19FUlIoaGFuZGxlKSkgewotCQlyZXQgPSAtRU5PTUVNOwotCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHhlX2JoLAotCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKLQlpZiAocmV0IDwgMCkgewotCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0X2NvbW1pdDsKLQl9Ci0KLQl4ZS0+eGVfdmFsdWVfc2l6ZSA9IGNwdV90b19sZTY0KG5ld19zaXplKTsKLQotCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCB4ZV9iaCk7Ci0JaWYgKHJldCA8IDApCi0JCW1sb2dfZXJybm8ocmV0KTsKLQotb3V0X2NvbW1pdDoKLQlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOwogb3V0OgogCXJldHVybiByZXQ7CiB9CkBAIC00MjEwLDE4ICs0Njk3LDE5IEBACiAgKiBDb3B5IHRoZSBuZXcgdXBkYXRlZCB4ZSBhbmQgeGVfdmFsdWVfcm9vdCB0byBuZXdfeGUgYW5kIG5ld194diBpZiBuZWVkZWQuCiAgKi8KIHN0YXRpYyBpbnQgb2NmczJfeGF0dHJfYnVja2V0X3ZhbHVlX3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpoZWFkZXJfYmgsCisJCQkJCSAgICAgc3RydWN0IG9jZnMyX3hhdHRyX2J1Y2tldCAqYnVja2V0LAogCQkJCQkgICAgIGludCB4ZV9vZmYsCi0JCQkJCSAgICAgaW50IGxlbikKKwkJCQkJICAgICBpbnQgbGVuLAorCQkJCQkgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9zZXRfY3R4dCAqY3R4dCkKIHsKIAlpbnQgcmV0LCBvZmZzZXQ7CiAJdTY0IHZhbHVlX2JsazsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnZhbHVlX2JoID0gTlVMTDsKLQlzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCAqeHY7CiAJc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICp4ZTsKLQlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICp4aCA9Ci0JCQkoc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqKWhlYWRlcl9iaC0+Yl9kYXRhOworCXN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKnhoID0gYnVja2V0X3hoKGJ1Y2tldCk7CiAJc2l6ZV90IGJsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfYnVmIHZiID0geworCQkudmJfYWNjZXNzID0gb2NmczJfam91cm5hbF9hY2Nlc3MsCisJfTsKIAogCXhlID0gJnhoLT54aF9lbnRyaWVzW3hlX29mZl07CiAKQEAgLTQyMzQsNDkgKzQ3MjIsNTggQEAKIAogCS8qIFdlIGRvbid0IGFsbG93IG9jZnMyX3hhdHRyX3ZhbHVlIHRvIGJlIHN0b3JlZCBpbiBkaWZmZXJlbnQgYmxvY2suICovCiAJQlVHX09OKHZhbHVlX2JsayAhPSAob2Zmc2V0ICsgT0NGUzJfWEFUVFJfUk9PVF9TSVpFIC0gMSkgLyBibG9ja3NpemUpOwotCXZhbHVlX2JsayArPSBoZWFkZXJfYmgtPmJfYmxvY2tucjsKIAotCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soaW5vZGUsIHZhbHVlX2JsaywgJnZhbHVlX2JoKTsKKwl2Yi52Yl9iaCA9IGJ1Y2tldC0+YnVfYmhzW3ZhbHVlX2Jsa107CisJQlVHX09OKCF2Yi52Yl9iaCk7CisKKwl2Yi52Yl94diA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfdmFsdWVfcm9vdCAqKQorCQkodmIudmJfYmgtPmJfZGF0YSArIG9mZnNldCAlIGJsb2Nrc2l6ZSk7CisKKwlyZXQgPSBvY2ZzMl94YXR0cl9idWNrZXRfam91cm5hbF9hY2Nlc3MoY3R4dC0+aGFuZGxlLCBidWNrZXQsCisJCQkJCQlPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwogCX0KIAotCXh2ID0gKHN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9yb290ICopCi0JCSh2YWx1ZV9iaC0+Yl9kYXRhICsgb2Zmc2V0ICUgYmxvY2tzaXplKTsKLQorCS8qCisJICogRnJvbSBoZXJlIG9uIG91dCB3ZSBoYXZlIHRvIGRpcnR5IHRoZSBidWNrZXQuICBUaGUgZ2VuZXJpYworCSAqIHZhbHVlIGNhbGxzIG9ubHkgbW9kaWZ5IG9uZSBvZiB0aGUgYnVja2V0J3MgYmhzLCBidXQgd2UgbmVlZAorCSAqIHRvIHNlbmQgdGhlIGJ1Y2tldCBhdCBvbmNlLiAgU28gaWYgdGhleSBlcnJvciwgdGhleSAqY291bGQqIGhhdmUKKwkgKiBtb2RpZmllZCBzb21ldGhpbmcuICBXZSBoYXZlIHRvIGFzc3VtZSB0aGV5IGRpZCwgYW5kIGRpcnR5CisJICogdGhlIHdob2xlIGJ1Y2tldC4gIFRoaXMgbGVhdmVzIHVzIGluIGEgY29uc2lzdGVudCBzdGF0ZS4KKwkgKi8KIAltbG9nKDAsICJ0cnVuY2F0ZSAldSBpbiB4YXR0ciBidWNrZXQgJWxsdSB0byAlZCBieXRlcy5cbiIsCi0JICAgICB4ZV9vZmYsICh1bnNpZ25lZCBsb25nIGxvbmcpaGVhZGVyX2JoLT5iX2Jsb2NrbnIsIGxlbik7Ci0JcmV0ID0gb2NmczJfeGF0dHJfdmFsdWVfdHJ1bmNhdGUoaW5vZGUsIHZhbHVlX2JoLCB4diwgbGVuKTsKKwkgICAgIHhlX29mZiwgKHVuc2lnbmVkIGxvbmcgbG9uZylidWNrZXRfYmxrbm8oYnVja2V0KSwgbGVuKTsKKwlyZXQgPSBvY2ZzMl94YXR0cl92YWx1ZV90cnVuY2F0ZShpbm9kZSwgJnZiLCBsZW4sIGN0eHQpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfZGlydHk7CiAJfQogCi0JcmV0ID0gb2NmczJfeGF0dHJfdmFsdWVfdXBkYXRlX3NpemUoaW5vZGUsIGhlYWRlcl9iaCwgeGUsIGxlbik7Ci0JaWYgKHJldCkgewotCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0OwotCX0KKwl4ZS0+eGVfdmFsdWVfc2l6ZSA9IGNwdV90b19sZTY0KGxlbik7CisKK291dF9kaXJ0eToKKwlvY2ZzMl94YXR0cl9idWNrZXRfam91cm5hbF9kaXJ0eShjdHh0LT5oYW5kbGUsIGJ1Y2tldCk7CiAKIG91dDoKLQlicmVsc2UodmFsdWVfYmgpOwogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgb2NmczJfeGF0dHJfYnVja2V0X3ZhbHVlX3RydW5jYXRlX3hzKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJCQlzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cywKLQkJCQkJCWludCBsZW4pCisJCQkJCXN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggKnhzLAorCQkJCQlpbnQgbGVuLAorCQkJCQlzdHJ1Y3Qgb2NmczJfeGF0dHJfc2V0X2N0eHQgKmN0eHQpCiB7CiAJaW50IHJldCwgb2Zmc2V0OwogCXN0cnVjdCBvY2ZzMl94YXR0cl9lbnRyeSAqeGUgPSB4cy0+aGVyZTsKIAlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICp4aCA9IChzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICopeHMtPmJhc2U7CiAKLQlCVUdfT04oIXhzLT5idWNrZXQuYmhzWzBdIHx8ICF4ZSB8fCBvY2ZzMl94YXR0cl9pc19sb2NhbCh4ZSkpOworCUJVR19PTigheHMtPmJ1Y2tldC0+YnVfYmhzWzBdIHx8ICF4ZSB8fCBvY2ZzMl94YXR0cl9pc19sb2NhbCh4ZSkpOwogCiAJb2Zmc2V0ID0geGUgLSB4aC0+eGhfZW50cmllczsKLQlyZXQgPSBvY2ZzMl94YXR0cl9idWNrZXRfdmFsdWVfdHJ1bmNhdGUoaW5vZGUsIHhzLT5idWNrZXQuYmhzWzBdLAotCQkJCQkJb2Zmc2V0LCBsZW4pOworCXJldCA9IG9jZnMyX3hhdHRyX2J1Y2tldF92YWx1ZV90cnVuY2F0ZShpbm9kZSwgeHMtPmJ1Y2tldCwKKwkJCQkJCW9mZnNldCwgbGVuLCBjdHh0KTsKIAlpZiAocmV0KQogCQltbG9nX2Vycm5vKHJldCk7CiAKQEAgLTQyODQsNiArNDc4MSw3IEBACiB9CiAKIHN0YXRpYyBpbnQgb2NmczJfeGF0dHJfYnVja2V0X3NldF92YWx1ZV9vdXRzaWRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCQloYW5kbGVfdCAqaGFuZGxlLAogCQkJCQkJc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMsCiAJCQkJCQljaGFyICp2YWwsCiAJCQkJCQlpbnQgdmFsdWVfbGVuKQpAQCAtNDI5OSw3ICs0Nzk3LDggQEAKIAogCXh2ID0gKHN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9yb290ICopKHhzLT5iYXNlICsgb2Zmc2V0KTsKIAotCXJldHVybiBfX29jZnMyX3hhdHRyX3NldF92YWx1ZV9vdXRzaWRlKGlub2RlLCB4diwgdmFsLCB2YWx1ZV9sZW4pOworCXJldHVybiBfX29jZnMyX3hhdHRyX3NldF92YWx1ZV9vdXRzaWRlKGlub2RlLCBoYW5kbGUsCisJCQkJCSAgICAgICB4diwgdmFsLCB2YWx1ZV9sZW4pOwogfQogCiBzdGF0aWMgaW50IG9jZnMyX3JtX3hhdHRyX2NsdXN0ZXIoc3RydWN0IGlub2RlICppbm9kZSwKQEAgLTQzNDMsMTUgKzQ4NDIsMTUgQEAKIAkJfQogCX0KIAotCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgT0NGUzJfUkVNT1ZFX0VYVEVOVF9DUkVESVRTKTsKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIG9jZnMyX3JlbW92ZV9leHRlbnRfY3JlZGl0cyhvc2ItPnNiKSk7CiAJaWYgKElTX0VSUihoYW5kbGUpKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CiAJfQogCi0JcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgcm9vdF9iaCwKLQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3NfeGIoaGFuZGxlLCBpbm9kZSwgcm9vdF9iaCwKKwkJCQkgICAgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0X2NvbW1pdDsKQEAgLTQzOTIsMjYgKzQ4OTEsMTkgQEAKIH0KIAogc3RhdGljIHZvaWQgb2NmczJfeGF0dHJfYnVja2V0X3JlbW92ZV94cyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkJIHN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggKnhzKQogewotCWhhbmRsZV90ICpoYW5kbGUgPSBOVUxMOwotCXN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKnhoID0geHMtPmJ1Y2tldC54aDsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICp4aCA9IGJ1Y2tldF94aCh4cy0+YnVja2V0KTsKIAlzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkgKmxhc3QgPSAmeGgtPnhoX2VudHJpZXNbCiAJCQkJCQlsZTE2X3RvX2NwdSh4aC0+eGhfY291bnQpIC0gMV07CiAJaW50IHJldCA9IDA7CiAKLQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucygoT0NGUzJfU0IoaW5vZGUtPmlfc2IpKSwgMSk7Ci0JaWYgKElTX0VSUihoYW5kbGUpKSB7Ci0JCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKLQkJbWxvZ19lcnJubyhyZXQpOwotCQlyZXR1cm47Ci0JfQotCi0JcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgeHMtPmJ1Y2tldC5iaHNbMF0sCi0JCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCXJldCA9IG9jZnMyX3hhdHRyX2J1Y2tldF9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIHhzLT5idWNrZXQsCisJCQkJCQlPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0X2NvbW1pdDsKKwkJcmV0dXJuOwogCX0KIAogCS8qIFJlbW92ZSB0aGUgb2xkIGVudHJ5LiAqLwpAQCAtNDQyMCwxMSArNDkxMiw3IEBACiAJbWVtc2V0KGxhc3QsIDAsIHNpemVvZihzdHJ1Y3Qgb2NmczJfeGF0dHJfZW50cnkpKTsKIAlsZTE2X2FkZF9jcHUoJnhoLT54aF9jb3VudCwgLTEpOwogCi0JcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHhzLT5idWNrZXQuYmhzWzBdKTsKLQlpZiAocmV0IDwgMCkKLQkJbWxvZ19lcnJubyhyZXQpOwotb3V0X2NvbW1pdDoKLQlvY2ZzMl9jb21taXRfdHJhbnMoT0NGUzJfU0IoaW5vZGUtPmlfc2IpLCBoYW5kbGUpOworCW9jZnMyX3hhdHRyX2J1Y2tldF9qb3VybmFsX2RpcnR5KGhhbmRsZSwgeHMtPmJ1Y2tldCk7CiB9CiAKIC8qCkBAIC00NDQwLDcgKzQ5MjgsOCBAQAogICovCiBzdGF0aWMgaW50IG9jZnMyX3hhdHRyX3NldF9pbl9idWNrZXQoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9pbmZvICp4aSwKLQkJCQkgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9zZWFyY2ggKnhzKQorCQkJCSAgICAgc3RydWN0IG9jZnMyX3hhdHRyX3NlYXJjaCAqeHMsCisJCQkJICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2V0X2N0eHQgKmN0eHQpCiB7CiAJaW50IHJldCwgbG9jYWwgPSAxOwogCXNpemVfdCB2YWx1ZV9sZW47CkBAIC00NDY4LDcgKzQ5NTcsOCBAQAogCQkJdmFsdWVfbGVuID0gMDsKIAogCQlyZXQgPSBvY2ZzMl94YXR0cl9idWNrZXRfdmFsdWVfdHJ1bmNhdGVfeHMoaW5vZGUsIHhzLAotCQkJCQkJCSAgIHZhbHVlX2xlbik7CisJCQkJCQkJICAgdmFsdWVfbGVuLAorCQkJCQkJCSAgIGN0eHQpOwogCQlpZiAocmV0KQogCQkJZ290byBvdXQ7CiAKQEAgLTQ0ODgsNyArNDk3OCw4IEBACiAJCXhpLT52YWx1ZV9sZW4gPSBPQ0ZTMl9YQVRUUl9ST09UX1NJWkU7CiAJfQogCi0JcmV0ID0gb2NmczJfeGF0dHJfc2V0X2VudHJ5X2luX2J1Y2tldChpbm9kZSwgeGksIHhzLCBuYW1lX2hhc2gsIGxvY2FsKTsKKwlyZXQgPSBvY2ZzMl94YXR0cl9zZXRfZW50cnlfaW5fYnVja2V0KGlub2RlLCBjdHh0LT5oYW5kbGUsIHhpLCB4cywKKwkJCQkJICAgICAgbmFtZV9oYXNoLCBsb2NhbCk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwpAQCAtNDQ5OSw3ICs0OTkwLDcgQEAKIAogCS8qIGFsbG9jYXRlIHRoZSBzcGFjZSBub3cgZm9yIHRoZSBvdXRzaWRlIGJsb2NrIHN0b3JhZ2UuICovCiAJcmV0ID0gb2NmczJfeGF0dHJfYnVja2V0X3ZhbHVlX3RydW5jYXRlX3hzKGlub2RlLCB4cywKLQkJCQkJCSAgIHZhbHVlX2xlbik7CisJCQkJCQkgICB2YWx1ZV9sZW4sIGN0eHQpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCkBAIC00NTA5LDEzICs1MDAwLDE0IEBACiAJCQkgKiBzdG9yYWdlIGFuZCB3ZSBoYXZlIGFsbG9jYXRlZCB4YXR0ciBhbHJlYWR5LAogCQkJICogc28gbmVlZCB0byByZW1vdmUgaXQuCiAJCQkgKi8KLQkJCW9jZnMyX3hhdHRyX2J1Y2tldF9yZW1vdmVfeHMoaW5vZGUsIHhzKTsKKwkJCW9jZnMyX3hhdHRyX2J1Y2tldF9yZW1vdmVfeHMoaW5vZGUsIGN0eHQtPmhhbmRsZSwgeHMpOwogCQl9CiAJCWdvdG8gb3V0OwogCX0KIAogc2V0X3ZhbHVlX291dHNpZGU6Ci0JcmV0ID0gb2NmczJfeGF0dHJfYnVja2V0X3NldF92YWx1ZV9vdXRzaWRlKGlub2RlLCB4cywgdmFsLCB2YWx1ZV9sZW4pOworCXJldCA9IG9jZnMyX3hhdHRyX2J1Y2tldF9zZXRfdmFsdWVfb3V0c2lkZShpbm9kZSwgY3R4dC0+aGFuZGxlLAorCQkJCQkJICAgeHMsIHZhbCwgdmFsdWVfbGVuKTsKIG91dDoKIAlyZXR1cm4gcmV0OwogfQpAQCAtNDUzMCw3ICs1MDIyLDcgQEAKIAkJCQkJICAgICAgc3RydWN0IG9jZnMyX3hhdHRyX2J1Y2tldCAqYnVja2V0LAogCQkJCQkgICAgICBjb25zdCBjaGFyICpuYW1lKQogewotCXN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKnhoID0gYnVja2V0LT54aDsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfaGVhZGVyICp4aCA9IGJ1Y2tldF94aChidWNrZXQpOwogCXUzMiBuYW1lX2hhc2ggPSBvY2ZzMl94YXR0cl9uYW1lX2hhc2goaW5vZGUsIG5hbWUsIHN0cmxlbihuYW1lKSk7CiAKIAlpZiAobmFtZV9oYXNoICE9IGxlMzJfdG9fY3B1KHhoLT54aF9lbnRyaWVzWzBdLnhlX25hbWVfaGFzaCkpCkBAIC00NTQwLDcgKzUwMzIsNyBAQAogCSAgICB4aC0+eGhfZW50cmllc1swXS54ZV9uYW1lX2hhc2gpIHsKIAkJbWxvZyhNTF9FUlJPUiwgIlRvbyBtdWNoIGhhc2ggY29sbGlzaW9uIGluIHhhdHRyIGJ1Y2tldCAlbGx1LCAiCiAJCSAgICAgImhhc2ggPSAldVxuIiwKLQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJ1Y2tldC0+YmhzWzBdLT5iX2Jsb2NrbnIsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylidWNrZXRfYmxrbm8oYnVja2V0KSwKIAkJICAgICBsZTMyX3RvX2NwdSh4aC0+eGhfZW50cmllc1swXS54ZV9uYW1lX2hhc2gpKTsKIAkJcmV0dXJuIC1FTk9TUEM7CiAJfQpAQCAtNDU1MCwxNiArNTA0MiwxNiBAQAogCiBzdGF0aWMgaW50IG9jZnMyX3hhdHRyX3NldF9lbnRyeV9pbmRleF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCQkgICAgIHN0cnVjdCBvY2ZzMl94YXR0cl9pbmZvICp4aSwKLQkJCQkJICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cykKKwkJCQkJICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2VhcmNoICp4cywKKwkJCQkJICAgICBzdHJ1Y3Qgb2NmczJfeGF0dHJfc2V0X2N0eHQgKmN0eHQpCiB7CiAJc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqeGg7CiAJc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICp4ZTsKIAl1MTYgY291bnQsIGhlYWRlcl9zaXplLCB4aF9mcmVlX3N0YXJ0OwotCWludCBpLCBmcmVlLCBtYXhfZnJlZSwgbmVlZCwgb2xkOworCWludCBmcmVlLCBtYXhfZnJlZSwgbmVlZCwgb2xkOwogCXNpemVfdCB2YWx1ZV9zaXplID0gMCwgbmFtZV9sZW4gPSBzdHJsZW4oeGktPm5hbWUpOwogCXNpemVfdCBibG9ja3NpemUgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CiAJaW50IHJldCwgYWxsb2NhdGlvbiA9IDA7Ci0JdTE2IGJsa19wZXJfYnVja2V0ID0gb2NmczJfYmxvY2tzX3Blcl94YXR0cl9idWNrZXQoaW5vZGUtPmlfc2IpOwogCiAJbWxvZ19lbnRyeSgiU2V0IHhhdHRyICVzIGluIHhhdHRyIGluZGV4IGJsb2NrXG4iLCB4aS0+bmFtZSk7CiAKQEAgLTQ1NzQsNyArNTA2Niw3IEBACiAKIAltbG9nX2J1Z19vbl9tc2coaGVhZGVyX3NpemUgPiBibG9ja3NpemUsICJidWNrZXQgJWxsdSBoYXMgaGVhZGVyIHNpemUgIgogCQkJIm9mICV1IHdoaWNoIGV4Y2VlZCBibG9jayBzaXplXG4iLAotCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl4cy0+YnVja2V0LmJoc1swXS0+Yl9ibG9ja25yLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylidWNrZXRfYmxrbm8oeHMtPmJ1Y2tldCksCiAJCQloZWFkZXJfc2l6ZSk7CiAKIAlpZiAoeGktPnZhbHVlICYmIHhpLT52YWx1ZV9sZW4gPiBPQ0ZTMl9YQVRUUl9JTkxJTkVfU0laRSkKQEAgLTQ2MTQsMTEgKzUxMDYsMTMgQEAKIAltbG9nKDAsICJ4cy0+bm90X2ZvdW5kID0gJWQsIGluIHhhdHRyIGJ1Y2tldCAlbGx1OiBmcmVlID0gJWQsICIKIAkgICAgICJuZWVkID0gJWQsIG1heF9mcmVlID0gJWQsIHhoX2ZyZWVfc3RhcnQgPSAldSwgeGhfbmFtZV92YWx1ZV9sZW4gPSIKIAkgICAgICIgJXVcbiIsIHhzLT5ub3RfZm91bmQsCi0JICAgICAodW5zaWduZWQgbG9uZyBsb25nKXhzLT5idWNrZXQuYmhzWzBdLT5iX2Jsb2NrbnIsCisJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJ1Y2tldF9ibGtubyh4cy0+YnVja2V0KSwKIAkgICAgIGZyZWUsIG5lZWQsIG1heF9mcmVlLCBsZTE2X3RvX2NwdSh4aC0+eGhfZnJlZV9zdGFydCksCiAJICAgICBsZTE2X3RvX2NwdSh4aC0+eGhfbmFtZV92YWx1ZV9sZW4pKTsKIAotCWlmIChmcmVlIDwgbmVlZCB8fCBjb3VudCA9PSBvY2ZzMl94YXR0cl9tYXhfeGVfaW5fYnVja2V0KGlub2RlLT5pX3NiKSkgeworCWlmIChmcmVlIDwgbmVlZCB8fAorCSAgICAoeHMtPm5vdF9mb3VuZCAmJgorCSAgICAgY291bnQgPT0gb2NmczJfeGF0dHJfbWF4X3hlX2luX2J1Y2tldChpbm9kZS0+aV9zYikpKSB7CiAJCWlmIChuZWVkIDw9IG1heF9mcmVlICYmCiAJCSAgICBjb3VudCA8IG9jZnMyX3hhdHRyX21heF94ZV9pbl9idWNrZXQoaW5vZGUtPmlfc2IpKSB7CiAJCQkvKgpAQCAtNDYyNiw3ICs1MTIwLDggQEAKIAkJCSAqIG5hbWUvdmFsdWUgd2lsbCBiZSBtb3ZlZCwgdGhlIHhlIHNob3VsZG4ndCBiZSBjaGFuZ2VkCiAJCQkgKiBpbiB4cy4KIAkJCSAqLwotCQkJcmV0ID0gb2NmczJfZGVmcmFnX3hhdHRyX2J1Y2tldChpbm9kZSwgJnhzLT5idWNrZXQpOworCQkJcmV0ID0gb2NmczJfZGVmcmFnX3hhdHRyX2J1Y2tldChpbm9kZSwgY3R4dC0+aGFuZGxlLAorCQkJCQkJCXhzLT5idWNrZXQpOwogCQkJaWYgKHJldCkgewogCQkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCQlnb3RvIG91dDsKQEAgLTQ2NTgsNyArNTE1Myw3IEBACiAJCSAqIGFkZCBhIG5ldyBidWNrZXQgZm9yIHRoZSBpbnNlcnQuCiAJCSAqLwogCQlyZXQgPSBvY2ZzMl9jaGVja194YXR0cl9idWNrZXRfY29sbGlzaW9uKGlub2RlLAotCQkJCQkJCSAmeHMtPmJ1Y2tldCwKKwkJCQkJCQkgeHMtPmJ1Y2tldCwKIAkJCQkJCQkgeGktPm5hbWUpOwogCQlpZiAocmV0KSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CkBAIC00NjY3LDE3ICs1MTYyLDIxIEBACiAKIAkJcmV0ID0gb2NmczJfYWRkX25ld194YXR0cl9idWNrZXQoaW5vZGUsCiAJCQkJCQkgeHMtPnhhdHRyX2JoLAotCQkJCQkJIHhzLT5idWNrZXQuYmhzWzBdKTsKKwkJCQkJCSB4cy0+YnVja2V0LAorCQkJCQkJIGN0eHQpOwogCQlpZiAocmV0KSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlnb3RvIG91dDsKIAkJfQogCi0JCWZvciAoaSA9IDA7IGkgPCBibGtfcGVyX2J1Y2tldDsgaSsrKQotCQkJYnJlbHNlKHhzLT5idWNrZXQuYmhzW2ldKTsKLQotCQltZW1zZXQoJnhzLT5idWNrZXQsIDAsIHNpemVvZih4cy0+YnVja2V0KSk7Ci0KKwkJLyoKKwkJICogb2NmczJfYWRkX25ld194YXR0cl9idWNrZXQoKSB3aWxsIGhhdmUgdXBkYXRlZAorCQkgKiB4cy0+YnVja2V0IGlmIGl0IG1vdmVkLCBidXQgaXQgd2lsbCBub3QgaGF2ZSB1cGRhdGVkCisJCSAqIGFueSBvZiB0aGUgb3RoZXIgc2VhcmNoIGZpZWxkcy4gIFRodXMsIHdlIGRyb3AgaXQgYW5kCisJCSAqIHJlLXNlYXJjaC4gIEV2ZXJ5dGhpbmcgc2hvdWxkIGJlIGNhY2hlZCwgc28gaXQnbGwgYmUKKwkJICogcXVpY2suCisJCSAqLworCQlvY2ZzMl94YXR0cl9idWNrZXRfcmVsc2UoeHMtPmJ1Y2tldCk7CiAJCXJldCA9IG9jZnMyX3hhdHRyX2luZGV4X2Jsb2NrX2ZpbmQoaW5vZGUsIHhzLT54YXR0cl9iaCwKIAkJCQkJCSAgIHhpLT5uYW1lX2luZGV4LAogCQkJCQkJICAgeGktPm5hbWUsIHhzKTsKQEAgLTQ2ODksNyArNTE4OCw3IEBACiAJfQogCiB4YXR0cl9zZXQ6Ci0JcmV0ID0gb2NmczJfeGF0dHJfc2V0X2luX2J1Y2tldChpbm9kZSwgeGksIHhzKTsKKwlyZXQgPSBvY2ZzMl94YXR0cl9zZXRfaW5fYnVja2V0KGlub2RlLCB4aSwgeHMsIGN0eHQpOwogb3V0OgogCW1sb2dfZXhpdChyZXQpOwogCXJldHVybiByZXQ7CkBAIC00NzAwLDI0ICs1MTk5LDQxIEBACiAJCQkJCXZvaWQgKnBhcmEpCiB7CiAJaW50IHJldCA9IDA7Ci0Jc3RydWN0IG9jZnMyX3hhdHRyX2hlYWRlciAqeGggPSBidWNrZXQtPnhoOworCXN0cnVjdCBvY2ZzMl94YXR0cl9oZWFkZXIgKnhoID0gYnVja2V0X3hoKGJ1Y2tldCk7CiAJdTE2IGk7CiAJc3RydWN0IG9jZnMyX3hhdHRyX2VudHJ5ICp4ZTsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3Qgb2NmczJfeGF0dHJfc2V0X2N0eHQgY3R4dCA9IHtOVUxMLCBOVUxMLH07CisJaW50IGNyZWRpdHMgPSBvY2ZzMl9yZW1vdmVfZXh0ZW50X2NyZWRpdHMob3NiLT5zYikgKworCQlvY2ZzMl9ibG9ja3NfcGVyX3hhdHRyX2J1Y2tldChpbm9kZS0+aV9zYik7CisKKworCW9jZnMyX2luaXRfZGVhbGxvY19jdHh0KCZjdHh0LmRlYWxsb2MpOwogCiAJZm9yIChpID0gMDsgaSA8IGxlMTZfdG9fY3B1KHhoLT54aF9jb3VudCk7IGkrKykgewogCQl4ZSA9ICZ4aC0+eGhfZW50cmllc1tpXTsKIAkJaWYgKG9jZnMyX3hhdHRyX2lzX2xvY2FsKHhlKSkKIAkJCWNvbnRpbnVlOwogCi0JCXJldCA9IG9jZnMyX3hhdHRyX2J1Y2tldF92YWx1ZV90cnVuY2F0ZShpbm9kZSwKLQkJCQkJCQlidWNrZXQtPmJoc1swXSwKLQkJCQkJCQlpLCAwKTsKKwkJY3R4dC5oYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIGNyZWRpdHMpOworCQlpZiAoSVNfRVJSKGN0eHQuaGFuZGxlKSkgeworCQkJcmV0ID0gUFRSX0VSUihjdHh0LmhhbmRsZSk7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlicmVhazsKKwkJfQorCisJCXJldCA9IG9jZnMyX3hhdHRyX2J1Y2tldF92YWx1ZV90cnVuY2F0ZShpbm9kZSwgYnVja2V0LAorCQkJCQkJCWksIDAsICZjdHh0KTsKKworCQlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBjdHh0LmhhbmRsZSk7CiAJCWlmIChyZXQpIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCWJyZWFrOwogCQl9CiAJfQogCisJb2NmczJfc2NoZWR1bGVfdHJ1bmNhdGVfbG9nX2ZsdXNoKG9zYiwgMSk7CisJb2NmczJfcnVuX2RlYWxsb2NzKG9zYiwgJmN0eHQuZGVhbGxvYyk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNDc2OCw2ICs1Mjg0LDc0IEBACiB9CiAKIC8qCisgKiAnc2VjdXJpdHknIGF0dHJpYnV0ZXMgc3VwcG9ydAorICovCitzdGF0aWMgc2l6ZV90IG9jZnMyX3hhdHRyX3NlY3VyaXR5X2xpc3Qoc3RydWN0IGlub2RlICppbm9kZSwgY2hhciAqbGlzdCwKKwkJCQkJc2l6ZV90IGxpc3Rfc2l6ZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJc2l6ZV90IG5hbWVfbGVuKQoreworCWNvbnN0IHNpemVfdCBwcmVmaXhfbGVuID0gWEFUVFJfU0VDVVJJVFlfUFJFRklYX0xFTjsKKwljb25zdCBzaXplX3QgdG90YWxfbGVuID0gcHJlZml4X2xlbiArIG5hbWVfbGVuICsgMTsKKworCWlmIChsaXN0ICYmIHRvdGFsX2xlbiA8PSBsaXN0X3NpemUpIHsKKwkJbWVtY3B5KGxpc3QsIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCwgcHJlZml4X2xlbik7CisJCW1lbWNweShsaXN0ICsgcHJlZml4X2xlbiwgbmFtZSwgbmFtZV9sZW4pOworCQlsaXN0W3ByZWZpeF9sZW4gKyBuYW1lX2xlbl0gPSAnXDAnOworCX0KKwlyZXR1cm4gdG90YWxfbGVuOworfQorCitzdGF0aWMgaW50IG9jZnMyX3hhdHRyX3NlY3VyaXR5X2dldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgICB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQoreworCWlmIChzdHJjbXAobmFtZSwgIiIpID09IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBvY2ZzMl94YXR0cl9nZXQoaW5vZGUsIE9DRlMyX1hBVFRSX0lOREVYX1NFQ1VSSVRZLCBuYW1lLAorCQkJICAgICAgIGJ1ZmZlciwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfeGF0dHJfc2VjdXJpdHlfc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCWlmIChzdHJjbXAobmFtZSwgIiIpID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIG9jZnMyX3hhdHRyX3NldChpbm9kZSwgT0NGUzJfWEFUVFJfSU5ERVhfU0VDVVJJVFksIG5hbWUsIHZhbHVlLAorCQkJICAgICAgIHNpemUsIGZsYWdzKTsKK30KKworaW50IG9jZnMyX2luaXRfc2VjdXJpdHlfZ2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgc3RydWN0IGlub2RlICpkaXIsCisJCQkgICAgc3RydWN0IG9jZnMyX3NlY3VyaXR5X3hhdHRyX2luZm8gKnNpKQoreworCS8qIGNoZWNrIHdoZXRoZXIgb2NmczIgc3VwcG9ydCBmZWF0dXJlIHhhdHRyICovCisJaWYgKCFvY2ZzMl9zdXBwb3J0c194YXR0cihPQ0ZTMl9TQihkaXItPmlfc2IpKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCXJldHVybiBzZWN1cml0eV9pbm9kZV9pbml0X3NlY3VyaXR5KGlub2RlLCBkaXIsICZzaS0+bmFtZSwgJnNpLT52YWx1ZSwKKwkJCQkJICAgICZzaS0+dmFsdWVfbGVuKTsKK30KKworaW50IG9jZnMyX2luaXRfc2VjdXJpdHlfc2V0KGhhbmRsZV90ICpoYW5kbGUsCisJCQkgICAgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLAorCQkJICAgIHN0cnVjdCBvY2ZzMl9zZWN1cml0eV94YXR0cl9pbmZvICpzaSwKKwkJCSAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqeGF0dHJfYWMsCisJCQkgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmRhdGFfYWMpCit7CisJcmV0dXJuIG9jZnMyX3hhdHRyX3NldF9oYW5kbGUoaGFuZGxlLCBpbm9kZSwgZGlfYmgsCisJCQkJICAgICBPQ0ZTMl9YQVRUUl9JTkRFWF9TRUNVUklUWSwKKwkJCQkgICAgIHNpLT5uYW1lLCBzaS0+dmFsdWUsIHNpLT52YWx1ZV9sZW4sIDAsCisJCQkJICAgICB4YXR0cl9hYywgZGF0YV9hYyk7Cit9CisKK3N0cnVjdCB4YXR0cl9oYW5kbGVyIG9jZnMyX3hhdHRyX3NlY3VyaXR5X2hhbmRsZXIgPSB7CisJLnByZWZpeAk9IFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCwKKwkubGlzdAk9IG9jZnMyX3hhdHRyX3NlY3VyaXR5X2xpc3QsCisJLmdldAk9IG9jZnMyX3hhdHRyX3NlY3VyaXR5X2dldCwKKwkuc2V0CT0gb2NmczJfeGF0dHJfc2VjdXJpdHlfc2V0LAorfTsKKworLyoKICAqICd0cnVzdGVkJyBhdHRyaWJ1dGVzIHN1cHBvcnQKICAqLwogc3RhdGljIHNpemVfdCBvY2ZzMl94YXR0cl90cnVzdGVkX2xpc3Qoc3RydWN0IGlub2RlICppbm9kZSwgY2hhciAqbGlzdCwKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL3hhdHRyLmggYi9mcy9vY2ZzMi94YXR0ci5oCmluZGV4IDFkODMxNGMuLjVhMWViYzcgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL3hhdHRyLmgKKysrIGIvZnMvb2NmczIveGF0dHIuaApAQCAtMzAsMTMgKzMwLDU4IEBACiAJT0NGUzJfWEFUVFJfTUFYCiB9OwogCitzdHJ1Y3Qgb2NmczJfc2VjdXJpdHlfeGF0dHJfaW5mbyB7CisJaW50IGVuYWJsZTsKKwljaGFyICpuYW1lOworCXZvaWQgKnZhbHVlOworCXNpemVfdCB2YWx1ZV9sZW47Cit9OworCiBleHRlcm4gc3RydWN0IHhhdHRyX2hhbmRsZXIgb2NmczJfeGF0dHJfdXNlcl9oYW5kbGVyOwogZXh0ZXJuIHN0cnVjdCB4YXR0cl9oYW5kbGVyIG9jZnMyX3hhdHRyX3RydXN0ZWRfaGFuZGxlcjsKK2V4dGVybiBzdHJ1Y3QgeGF0dHJfaGFuZGxlciBvY2ZzMl94YXR0cl9zZWN1cml0eV9oYW5kbGVyOworI2lmZGVmIENPTkZJR19PQ0ZTMl9GU19QT1NJWF9BQ0wKK2V4dGVybiBzdHJ1Y3QgeGF0dHJfaGFuZGxlciBvY2ZzMl94YXR0cl9hY2xfYWNjZXNzX2hhbmRsZXI7CitleHRlcm4gc3RydWN0IHhhdHRyX2hhbmRsZXIgb2NmczJfeGF0dHJfYWNsX2RlZmF1bHRfaGFuZGxlcjsKKyNlbmRpZgogZXh0ZXJuIHN0cnVjdCB4YXR0cl9oYW5kbGVyICpvY2ZzMl94YXR0cl9oYW5kbGVyc1tdOwogCiBzc2l6ZV90IG9jZnMyX2xpc3R4YXR0cihzdHJ1Y3QgZGVudHJ5ICosIGNoYXIgKiwgc2l6ZV90KTsKK2ludCBvY2ZzMl94YXR0cl9nZXRfbm9sb2NrKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwgaW50LAorCQkJICAgY29uc3QgY2hhciAqLCB2b2lkICosIHNpemVfdCk7CiBpbnQgb2NmczJfeGF0dHJfc2V0KHN0cnVjdCBpbm9kZSAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgY29uc3Qgdm9pZCAqLAogCQkgICAgc2l6ZV90LCBpbnQpOworaW50IG9jZnMyX3hhdHRyX3NldF9oYW5kbGUoaGFuZGxlX3QgKiwgc3RydWN0IGlub2RlICosIHN0cnVjdCBidWZmZXJfaGVhZCAqLAorCQkJICAgaW50LCBjb25zdCBjaGFyICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90LCBpbnQsCisJCQkgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqLAorCQkJICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKik7CiBpbnQgb2NmczJfeGF0dHJfcmVtb3ZlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKik7CitpbnQgb2NmczJfaW5pdF9zZWN1cml0eV9nZXQoc3RydWN0IGlub2RlICosIHN0cnVjdCBpbm9kZSAqLAorCQkJICAgIHN0cnVjdCBvY2ZzMl9zZWN1cml0eV94YXR0cl9pbmZvICopOworaW50IG9jZnMyX2luaXRfc2VjdXJpdHlfc2V0KGhhbmRsZV90ICosIHN0cnVjdCBpbm9kZSAqLAorCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqLAorCQkJICAgIHN0cnVjdCBvY2ZzMl9zZWN1cml0eV94YXR0cl9pbmZvICosCisJCQkgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKiwKKwkJCSAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqKTsKK2ludCBvY2ZzMl9jYWxjX3NlY3VyaXR5X2luaXQoc3RydWN0IGlub2RlICosCisJCQkgICAgIHN0cnVjdCBvY2ZzMl9zZWN1cml0eV94YXR0cl9pbmZvICosCisJCQkgICAgIGludCAqLCBpbnQgKiwgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKiopOworaW50IG9jZnMyX2NhbGNfeGF0dHJfaW5pdChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGJ1ZmZlcl9oZWFkICosCisJCQkgIGludCwgc3RydWN0IG9jZnMyX3NlY3VyaXR5X3hhdHRyX2luZm8gKiwKKwkJCSAgaW50ICosIGludCAqLCBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqKik7CisKKy8qCisgKiB4YXR0cnMgY2FuIGxpdmUgaW5zaWRlIGFuIGlub2RlLCBhcyBwYXJ0IG9mIGFuIGV4dGVybmFsIHhhdHRyIGJsb2NrLAorICogb3IgaW5zaWRlIGFuIHhhdHRyIGJ1Y2tldCwgd2hpY2ggaXMgdGhlIGxlYWYgb2YgYSB0cmVlIHJvb3RlZCBpbiBhbgorICogeGF0dHIgYmxvY2suICBTb21lIG9mIHRoZSB4YXR0ciBjYWxscywgZXNwZWNpYWxseSB0aGUgdmFsdWUgc2V0dGluZworICogZnVuY3Rpb25zLCB3YW50IHRvIHRyZWF0IGVhY2ggb2YgdGhlc2UgbG9jYXRpb25zIGFzIGVxdWFsLiAgTGV0J3Mgd3JhcAorICogdGhlbSBpbiBhIHN0cnVjdHVyZSB0aGF0IHdlIGNhbiBwYXNzIGFyb3VuZCBpbnN0ZWFkIG9mIHJhdyBidWZmZXJfaGVhZHMuCisgKi8KK3N0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9idWYgeworCXN0cnVjdCBidWZmZXJfaGVhZAkJKnZiX2JoOworCW9jZnMyX2pvdXJuYWxfYWNjZXNzX2Z1bmMJdmJfYWNjZXNzOworCXN0cnVjdCBvY2ZzMl94YXR0cl92YWx1ZV9yb290CSp2Yl94djsKK307CisKIAogI2VuZGlmIC8qIE9DRlMyX1hBVFRSX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL29tZnMvaW5vZGUuYyBiL2ZzL29tZnMvaW5vZGUuYwppbmRleCA2YWZlNTdjLi42MzNlOWRjIDEwMDY0NAotLS0gYS9mcy9vbWZzL2lub2RlLmMKKysrIGIvZnMvb21mcy9pbm9kZS5jCkBAIC0zOSw3ICszOSw2IEBACiAJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CiAJaW5vZGUtPmlfdWlkID0gY3VycmVudF9mc3VpZCgpOwogCWlub2RlLT5pX2dpZCA9IGN1cnJlbnRfZnNnaWQoKTsKLQlpbm9kZS0+aV9ibG9ja3MgPSAwOwogCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJm9tZnNfYW9wczsKIAogCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKZGlmZiAtLWdpdCBhL2ZzL29wZW4uYyBiL2ZzL29wZW4uYwppbmRleCAxY2Q3ZDQwLi5kODgyZmQyIDEwMDY0NAotLS0gYS9mcy9vcGVuLmMKKysrIGIvZnMvb3Blbi5jCkBAIC00MTIsNyArNDEyLDcgQEAKIAlpZiAoKChvZmZzZXQgKyBsZW4pID4gaW5vZGUtPmlfc2ItPnNfbWF4Ynl0ZXMpIHx8ICgob2Zmc2V0ICsgbGVuKSA8IDApKQogCQlnb3RvIG91dF9mcHV0OwogCi0JaWYgKGlub2RlLT5pX29wICYmIGlub2RlLT5pX29wLT5mYWxsb2NhdGUpCisJaWYgKGlub2RlLT5pX29wLT5mYWxsb2NhdGUpCiAJCXJldCA9IGlub2RlLT5pX29wLT5mYWxsb2NhdGUoaW5vZGUsIG1vZGUsIG9mZnNldCwgbGVuKTsKIAllbHNlCiAJCXJldCA9IC1FT1BOT1RTVVBQOwpkaWZmIC0tZ2l0IGEvZnMvb3BlbnByb21mcy9pbm9kZS5jIGIvZnMvb3BlbnByb21mcy9pbm9kZS5jCmluZGV4IGQ0MWJkYzcuLmZmY2QwNGYgMTAwNjQ0Ci0tLSBhL2ZzL29wZW5wcm9tZnMvaW5vZGUuYworKysgYi9mcy9vcGVucHJvbWZzL2lub2RlLmMKQEAgLTI1Niw5ICsyNTYsNiBAQAogCQlicmVhazsKIAl9CiAKLQlpbm9kZS0+aV9naWQgPSAwOwotCWlub2RlLT5pX3VpZCA9IDA7Ci0KIAlkX2FkZChkZW50cnksIGlub2RlKTsKIAlyZXR1cm4gTlVMTDsKIH0KZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvY2hlY2suYyBiL2ZzL3BhcnRpdGlvbnMvY2hlY2suYwppbmRleCA2ZDViMjEzLi41MTk4YWRhIDEwMDY0NAotLS0gYS9mcy9wYXJ0aXRpb25zL2NoZWNrLmMKKysrIGIvZnMvcGFydGl0aW9ucy9jaGVjay5jCkBAIC0zODQsOSArMzg0LDkgQEAKIAogCWRuYW1lID0gZGV2X25hbWUoZGRldik7CiAJaWYgKGlzZGlnaXQoZG5hbWVbc3RybGVuKGRuYW1lKSAtIDFdKSkKLQkJc25wcmludGYocGRldi0+YnVzX2lkLCBCVVNfSURfU0laRSwgIiVzcCVkIiwgZG5hbWUsIHBhcnRubyk7CisJCWRldl9zZXRfbmFtZShwZGV2LCAiJXNwJWQiLCBkbmFtZSwgcGFydG5vKTsKIAllbHNlCi0JCXNucHJpbnRmKHBkZXYtPmJ1c19pZCwgQlVTX0lEX1NJWkUsICIlcyVkIiwgZG5hbWUsIHBhcnRubyk7CisJCWRldl9zZXRfbmFtZShwZGV2LCAiJXMlZCIsIGRuYW1lLCBwYXJ0bm8pOwogCiAJZGV2aWNlX2luaXRpYWxpemUocGRldik7CiAJcGRldi0+Y2xhc3MgPSAmYmxvY2tfY2xhc3M7CkBAIC00NDcsMTYgKzQ0NywxMSBAQAogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CiAJc3RydWN0IGRpc2tfcGFydF9pdGVyIHBpdGVyOwogCXN0cnVjdCBoZF9zdHJ1Y3QgKnBhcnQ7Ci0JY2hhciAqczsKIAlpbnQgZXJyOwogCiAJZGRldi0+cGFyZW50ID0gZGlzay0+ZHJpdmVyZnNfZGV2OwogCi0Jc3RybGNweShkZGV2LT5idXNfaWQsIGRpc2stPmRpc2tfbmFtZSwgQlVTX0lEX1NJWkUpOwotCS8qIGV3d3cuLi4gc29tZSBvZiB0aGVzZSBidWdnZXJzIGhhdmUgLyBpbiB0aGUgbmFtZS4uLiAqLwotCXMgPSBzdHJjaHIoZGRldi0+YnVzX2lkLCAnLycpOwotCWlmIChzKQotCQkqcyA9ICchJzsKKwlkZXZfc2V0X25hbWUoZGRldiwgZGlzay0+ZGlza19uYW1lKTsKIAogCS8qIGRlbGF5IHVldmVudHMsIHVudGlsIHdlIHNjYW5uZWQgcGFydGl0aW9uIHRhYmxlICovCiAJZGRldi0+dWV2ZW50X3N1cHByZXNzID0gMTsKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvYmFzZS5jIGIvZnMvcHJvYy9iYXNlLmMKaW5kZXggY2FkOTJjMS4uMGM5ZGUxOSAxMDA2NDQKLS0tIGEvZnMvcHJvYy9iYXNlLmMKKysrIGIvZnMvcHJvYy9iYXNlLmMKQEAgLTY1LDYgKzY1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGFja3RyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcmVzb3VyY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgpAQCAtMTA5LDI1ICsxMTAsMjIgQEAKIAkub3AgICA9IE9QLAkJCQkJXAogfQogCi0jZGVmaW5lIERJUihOQU1FLCBNT0RFLCBPVFlQRSkJCQkJCQkJXAotCU5PRChOQU1FLCAoU19JRkRJUnwoTU9ERSkpLAkJCQkJCVwKLQkJJnByb2NfIyNPVFlQRSMjX2lub2RlX29wZXJhdGlvbnMsICZwcm9jXyMjT1RZUEUjI19vcGVyYXRpb25zLAlcCi0JCXt9ICkKLSNkZWZpbmUgTE5LKE5BTUUsIE9UWVBFKQkJCQkJXAorI2RlZmluZSBESVIoTkFNRSwgTU9ERSwgaW9wcywgZm9wcykJXAorCU5PRChOQU1FLCAoU19JRkRJUnwoTU9ERSkpLCAmaW9wcywgJmZvcHMsIHt9ICkKKyNkZWZpbmUgTE5LKE5BTUUsIGdldF9saW5rKQkJCQkJXAogCU5PRChOQU1FLCAoU19JRkxOS3xTX0lSV1hVR08pLAkJCQlcCiAJCSZwcm9jX3BpZF9saW5rX2lub2RlX29wZXJhdGlvbnMsIE5VTEwsCQlcCi0JCXsgLnByb2NfZ2V0X2xpbmsgPSAmcHJvY18jI09UWVBFIyNfbGluayB9ICkKLSNkZWZpbmUgUkVHKE5BTUUsIE1PREUsIE9UWVBFKQkJCQlcCi0JTk9EKE5BTUUsIChTX0lGUkVHfChNT0RFKSksIE5VTEwsCQlcCi0JCSZwcm9jXyMjT1RZUEUjI19vcGVyYXRpb25zLCB7fSkKLSNkZWZpbmUgSU5GKE5BTUUsIE1PREUsIE9UWVBFKQkJCQlcCisJCXsgLnByb2NfZ2V0X2xpbmsgPSBnZXRfbGluayB9ICkKKyNkZWZpbmUgUkVHKE5BTUUsIE1PREUsIGZvcHMpCQkJCVwKKwlOT0QoTkFNRSwgKFNfSUZSRUd8KE1PREUpKSwgTlVMTCwgJmZvcHMsIHt9KQorI2RlZmluZSBJTkYoTkFNRSwgTU9ERSwgcmVhZCkJCQkJXAogCU5PRChOQU1FLCAoU19JRlJFR3woTU9ERSkpLCAJCQlcCiAJCU5VTEwsICZwcm9jX2luZm9fZmlsZV9vcGVyYXRpb25zLAlcCi0JCXsgLnByb2NfcmVhZCA9ICZwcm9jXyMjT1RZUEUgfSApCi0jZGVmaW5lIE9ORShOQU1FLCBNT0RFLCBPVFlQRSkJCQkJXAorCQl7IC5wcm9jX3JlYWQgPSByZWFkIH0gKQorI2RlZmluZSBPTkUoTkFNRSwgTU9ERSwgc2hvdykJCQkJXAogCU5PRChOQU1FLCAoU19JRlJFR3woTU9ERSkpLCAJCQlcCiAJCU5VTEwsICZwcm9jX3NpbmdsZV9maWxlX29wZXJhdGlvbnMsCVwKLQkJeyAucHJvY19zaG93ID0gJnByb2NfIyNPVFlQRSB9ICkKKwkJeyAucHJvY19zaG93ID0gc2hvdyB9ICkKIAogLyoKICAqIENvdW50IHRoZSBudW1iZXIgb2YgaGFyZGxpbmtzIGZvciB0aGUgcGlkX2VudHJ5IHRhYmxlLCBleGNsdWRpbmcgdGhlIC4KQEAgLTMwOCw5ICszMDYsOSBAQAogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gZ2V0X3Rhc2tfbW0odGFzayk7CiAJaWYgKG1tKSB7CiAJCXVuc2lnbmVkIGludCBud29yZHMgPSAwOwotCQlkbworCQlkbyB7CiAJCQlud29yZHMgKz0gMjsKLQkJd2hpbGUgKG1tLT5zYXZlZF9hdXh2W253b3JkcyAtIDJdICE9IDApOyAvKiBBVF9OVUxMICovCisJCX0gd2hpbGUgKG1tLT5zYXZlZF9hdXh2W253b3JkcyAtIDJdICE9IDApOyAvKiBBVF9OVUxMICovCiAJCXJlcyA9IG53b3JkcyAqIHNpemVvZihtbS0+c2F2ZWRfYXV4dlswXSk7CiAJCWlmIChyZXMgPiBQQUdFX1NJWkUpCiAJCQlyZXMgPSBQQUdFX1NJWkU7CkBAIC0zNDAsNiArMzM4LDM3IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX0tBTExTWU1TICovCiAKKyNpZmRlZiBDT05GSUdfU1RBQ0tUUkFDRQorCisjZGVmaW5lIE1BWF9TVEFDS19UUkFDRV9ERVBUSAk2NAorCitzdGF0aWMgaW50IHByb2NfcGlkX3N0YWNrKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zLAorCQkJICBzdHJ1Y3QgcGlkICpwaWQsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlzdHJ1Y3Qgc3RhY2tfdHJhY2UgdHJhY2U7CisJdW5zaWduZWQgbG9uZyAqZW50cmllczsKKwlpbnQgaTsKKworCWVudHJpZXMgPSBrbWFsbG9jKE1BWF9TVEFDS19UUkFDRV9ERVBUSCAqIHNpemVvZigqZW50cmllcyksIEdGUF9LRVJORUwpOworCWlmICghZW50cmllcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0cmFjZS5ucl9lbnRyaWVzCT0gMDsKKwl0cmFjZS5tYXhfZW50cmllcwk9IE1BWF9TVEFDS19UUkFDRV9ERVBUSDsKKwl0cmFjZS5lbnRyaWVzCQk9IGVudHJpZXM7CisJdHJhY2Uuc2tpcAkJPSAwOworCXNhdmVfc3RhY2tfdHJhY2VfdHNrKHRhc2ssICZ0cmFjZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdHJhY2UubnJfZW50cmllczsgaSsrKSB7CisJCXNlcV9wcmludGYobSwgIls8JXA+XSAlcFNcbiIsCisJCQkgICAodm9pZCAqKWVudHJpZXNbaV0sICh2b2lkICopZW50cmllc1tpXSk7CisJfQorCWtmcmVlKGVudHJpZXMpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKwogI2lmZGVmIENPTkZJR19TQ0hFRFNUQVRTCiAvKgogICogUHJvdmlkZXMgL3Byb2MvUElEL3NjaGVkc3RhdApAQCAtMTE4Niw4ICsxMjE1LDYgQEAKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7CiAKLQlXQVJOX09OKCFpbm9kZSk7Ci0KIAlwID0gZ2V0X3Byb2NfdGFzayhpbm9kZSk7CiAJaWYgKCFwKQogCQlyZXR1cm4gLUVTUkNIOwpAQCAtMTIwNSw4ICsxMjMyLDYgQEAKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7CiAKLQlXQVJOX09OKCFpbm9kZSk7Ci0KIAlwID0gZ2V0X3Byb2NfdGFzayhpbm9kZSk7CiAJaWYgKCFwKQogCQlyZXR1cm4gLUVTUkNIOwpAQCAtMTQyNiw4ICsxNDUxLDYgQEAKIAlpZiAoIWVpLT5waWQpCiAJCWdvdG8gb3V0X3VubG9jazsKIAotCWlub2RlLT5pX3VpZCA9IDA7Ci0JaW5vZGUtPmlfZ2lkID0gMDsKIAlpZiAodGFza19kdW1wYWJsZSh0YXNrKSkgewogCQlyY3VfcmVhZF9sb2NrKCk7CiAJCWNyZWQgPSBfX3Rhc2tfY3JlZCh0YXNrKTsKQEAgLTE5NzYsMTMgKzE5OTksMTEgQEAKIAkJCQkJIGNvbnN0IHN0cnVjdCBwaWRfZW50cnkgKmVudHMsCiAJCQkJCSB1bnNpZ25lZCBpbnQgbmVudHMpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZTsKIAlzdHJ1Y3QgZGVudHJ5ICplcnJvcjsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBnZXRfcHJvY190YXNrKGRpcik7CiAJY29uc3Qgc3RydWN0IHBpZF9lbnRyeSAqcCwgKmxhc3Q7CiAKIAllcnJvciA9IEVSUl9QVFIoLUVOT0VOVCk7Ci0JaW5vZGUgPSBOVUxMOwogCiAJaWYgKCF0YXNrKQogCQlnb3RvIG91dF9ub190YXNrOwpAQCAtMjEzOCwxMiArMjE1OSwxMiBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwaWRfZW50cnkgYXR0cl9kaXJfc3R1ZmZbXSA9IHsKLQlSRUcoImN1cnJlbnQiLCAgICBTX0lSVUdPfFNfSVdVR08sIHBpZF9hdHRyKSwKLQlSRUcoInByZXYiLCAgICAgICBTX0lSVUdPLAkgICBwaWRfYXR0ciksCi0JUkVHKCJleGVjIiwgICAgICAgU19JUlVHT3xTX0lXVUdPLCBwaWRfYXR0ciksCi0JUkVHKCJmc2NyZWF0ZSIsICAgU19JUlVHT3xTX0lXVUdPLCBwaWRfYXR0ciksCi0JUkVHKCJrZXljcmVhdGUiLCAgU19JUlVHT3xTX0lXVUdPLCBwaWRfYXR0ciksCi0JUkVHKCJzb2NrY3JlYXRlIiwgU19JUlVHT3xTX0lXVUdPLCBwaWRfYXR0ciksCisJUkVHKCJjdXJyZW50IiwgICAgU19JUlVHT3xTX0lXVUdPLCBwcm9jX3BpZF9hdHRyX29wZXJhdGlvbnMpLAorCVJFRygicHJldiIsICAgICAgIFNfSVJVR08sCSAgIHByb2NfcGlkX2F0dHJfb3BlcmF0aW9ucyksCisJUkVHKCJleGVjIiwgICAgICAgU19JUlVHT3xTX0lXVUdPLCBwcm9jX3BpZF9hdHRyX29wZXJhdGlvbnMpLAorCVJFRygiZnNjcmVhdGUiLCAgIFNfSVJVR098U19JV1VHTywgcHJvY19waWRfYXR0cl9vcGVyYXRpb25zKSwKKwlSRUcoImtleWNyZWF0ZSIsICBTX0lSVUdPfFNfSVdVR08sIHByb2NfcGlkX2F0dHJfb3BlcmF0aW9ucyksCisJUkVHKCJzb2NrY3JlYXRlIiwgU19JUlVHT3xTX0lXVUdPLCBwcm9jX3BpZF9hdHRyX29wZXJhdGlvbnMpLAogfTsKIAogc3RhdGljIGludCBwcm9jX2F0dHJfZGlyX3JlYWRkaXIoc3RydWN0IGZpbGUgKiBmaWxwLApAQCAtMjM0OSw4ICsyMzcwLDYgQEAKIAlpZiAoIWVpLT5waWQpCiAJCWdvdG8gb3V0X2lwdXQ7CiAKLQlpbm9kZS0+aV91aWQgPSAwOwotCWlub2RlLT5pX2dpZCA9IDA7CiAJaW5vZGUtPmlfbW9kZSA9IHAtPm1vZGU7CiAJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCiAJCWlub2RlLT5pX25saW5rID0gMjsKQEAgLTI0NjUsNzQgKzI0ODQsNzcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBwcm9jX3Rhc2tfaW5vZGVfb3BlcmF0aW9uczsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwaWRfZW50cnkgdGdpZF9iYXNlX3N0dWZmW10gPSB7Ci0JRElSKCJ0YXNrIiwgICAgICAgU19JUlVHT3xTX0lYVUdPLCB0YXNrKSwKLQlESVIoImZkIiwgICAgICAgICBTX0lSVVNSfFNfSVhVU1IsIGZkKSwKLQlESVIoImZkaW5mbyIsICAgICBTX0lSVVNSfFNfSVhVU1IsIGZkaW5mbyksCisJRElSKCJ0YXNrIiwgICAgICAgU19JUlVHT3xTX0lYVUdPLCBwcm9jX3Rhc2tfaW5vZGVfb3BlcmF0aW9ucywgcHJvY190YXNrX29wZXJhdGlvbnMpLAorCURJUigiZmQiLCAgICAgICAgIFNfSVJVU1J8U19JWFVTUiwgcHJvY19mZF9pbm9kZV9vcGVyYXRpb25zLCBwcm9jX2ZkX29wZXJhdGlvbnMpLAorCURJUigiZmRpbmZvIiwgICAgIFNfSVJVU1J8U19JWFVTUiwgcHJvY19mZGluZm9faW5vZGVfb3BlcmF0aW9ucywgcHJvY19mZGluZm9fb3BlcmF0aW9ucyksCiAjaWZkZWYgQ09ORklHX05FVAotCURJUigibmV0IiwgICAgICAgIFNfSVJVR098U19JWFVHTywgbmV0KSwKKwlESVIoIm5ldCIsICAgICAgICBTX0lSVUdPfFNfSVhVR08sIHByb2NfbmV0X2lub2RlX29wZXJhdGlvbnMsIHByb2NfbmV0X29wZXJhdGlvbnMpLAogI2VuZGlmCi0JUkVHKCJlbnZpcm9uIiwgICAgU19JUlVTUiwgZW52aXJvbiksCi0JSU5GKCJhdXh2IiwgICAgICAgU19JUlVTUiwgcGlkX2F1eHYpLAotCU9ORSgic3RhdHVzIiwgICAgIFNfSVJVR08sIHBpZF9zdGF0dXMpLAotCU9ORSgicGVyc29uYWxpdHkiLCBTX0lSVVNSLCBwaWRfcGVyc29uYWxpdHkpLAotCUlORigibGltaXRzIiwJICBTX0lSVVNSLCBwaWRfbGltaXRzKSwKKwlSRUcoImVudmlyb24iLCAgICBTX0lSVVNSLCBwcm9jX2Vudmlyb25fb3BlcmF0aW9ucyksCisJSU5GKCJhdXh2IiwgICAgICAgU19JUlVTUiwgcHJvY19waWRfYXV4diksCisJT05FKCJzdGF0dXMiLCAgICAgU19JUlVHTywgcHJvY19waWRfc3RhdHVzKSwKKwlPTkUoInBlcnNvbmFsaXR5IiwgU19JUlVTUiwgcHJvY19waWRfcGVyc29uYWxpdHkpLAorCUlORigibGltaXRzIiwJICBTX0lSVVNSLCBwcm9jX3BpZF9saW1pdHMpLAogI2lmZGVmIENPTkZJR19TQ0hFRF9ERUJVRwotCVJFRygic2NoZWQiLCAgICAgIFNfSVJVR098U19JV1VTUiwgcGlkX3NjaGVkKSwKKwlSRUcoInNjaGVkIiwgICAgICBTX0lSVUdPfFNfSVdVU1IsIHByb2NfcGlkX3NjaGVkX29wZXJhdGlvbnMpLAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0sKLQlJTkYoInN5c2NhbGwiLCAgICBTX0lSVVNSLCBwaWRfc3lzY2FsbCksCisJSU5GKCJzeXNjYWxsIiwgICAgU19JUlVTUiwgcHJvY19waWRfc3lzY2FsbCksCiAjZW5kaWYKLQlJTkYoImNtZGxpbmUiLCAgICBTX0lSVUdPLCBwaWRfY21kbGluZSksCi0JT05FKCJzdGF0IiwgICAgICAgU19JUlVHTywgdGdpZF9zdGF0KSwKLQlPTkUoInN0YXRtIiwgICAgICBTX0lSVUdPLCBwaWRfc3RhdG0pLAotCVJFRygibWFwcyIsICAgICAgIFNfSVJVR08sIG1hcHMpLAorCUlORigiY21kbGluZSIsICAgIFNfSVJVR08sIHByb2NfcGlkX2NtZGxpbmUpLAorCU9ORSgic3RhdCIsICAgICAgIFNfSVJVR08sIHByb2NfdGdpZF9zdGF0KSwKKwlPTkUoInN0YXRtIiwgICAgICBTX0lSVUdPLCBwcm9jX3BpZF9zdGF0bSksCisJUkVHKCJtYXBzIiwgICAgICAgU19JUlVHTywgcHJvY19tYXBzX29wZXJhdGlvbnMpLAogI2lmZGVmIENPTkZJR19OVU1BCi0JUkVHKCJudW1hX21hcHMiLCAgU19JUlVHTywgbnVtYV9tYXBzKSwKKwlSRUcoIm51bWFfbWFwcyIsICBTX0lSVUdPLCBwcm9jX251bWFfbWFwc19vcGVyYXRpb25zKSwKICNlbmRpZgotCVJFRygibWVtIiwgICAgICAgIFNfSVJVU1J8U19JV1VTUiwgbWVtKSwKLQlMTksoImN3ZCIsICAgICAgICBjd2QpLAotCUxOSygicm9vdCIsICAgICAgIHJvb3QpLAotCUxOSygiZXhlIiwgICAgICAgIGV4ZSksCi0JUkVHKCJtb3VudHMiLCAgICAgU19JUlVHTywgbW91bnRzKSwKLQlSRUcoIm1vdW50aW5mbyIsICBTX0lSVUdPLCBtb3VudGluZm8pLAotCVJFRygibW91bnRzdGF0cyIsIFNfSVJVU1IsIG1vdW50c3RhdHMpLAorCVJFRygibWVtIiwgICAgICAgIFNfSVJVU1J8U19JV1VTUiwgcHJvY19tZW1fb3BlcmF0aW9ucyksCisJTE5LKCJjd2QiLCAgICAgICAgcHJvY19jd2RfbGluayksCisJTE5LKCJyb290IiwgICAgICAgcHJvY19yb290X2xpbmspLAorCUxOSygiZXhlIiwgICAgICAgIHByb2NfZXhlX2xpbmspLAorCVJFRygibW91bnRzIiwgICAgIFNfSVJVR08sIHByb2NfbW91bnRzX29wZXJhdGlvbnMpLAorCVJFRygibW91bnRpbmZvIiwgIFNfSVJVR08sIHByb2NfbW91bnRpbmZvX29wZXJhdGlvbnMpLAorCVJFRygibW91bnRzdGF0cyIsIFNfSVJVU1IsIHByb2NfbW91bnRzdGF0c19vcGVyYXRpb25zKSwKICNpZmRlZiBDT05GSUdfUFJPQ19QQUdFX01PTklUT1IKLQlSRUcoImNsZWFyX3JlZnMiLCBTX0lXVVNSLCBjbGVhcl9yZWZzKSwKLQlSRUcoInNtYXBzIiwgICAgICBTX0lSVUdPLCBzbWFwcyksCi0JUkVHKCJwYWdlbWFwIiwgICAgU19JUlVTUiwgcGFnZW1hcCksCisJUkVHKCJjbGVhcl9yZWZzIiwgU19JV1VTUiwgcHJvY19jbGVhcl9yZWZzX29wZXJhdGlvbnMpLAorCVJFRygic21hcHMiLCAgICAgIFNfSVJVR08sIHByb2Nfc21hcHNfb3BlcmF0aW9ucyksCisJUkVHKCJwYWdlbWFwIiwgICAgU19JUlVTUiwgcHJvY19wYWdlbWFwX29wZXJhdGlvbnMpLAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1NFQ1VSSVRZCi0JRElSKCJhdHRyIiwgICAgICAgU19JUlVHT3xTX0lYVUdPLCBhdHRyX2RpciksCisJRElSKCJhdHRyIiwgICAgICAgU19JUlVHT3xTX0lYVUdPLCBwcm9jX2F0dHJfZGlyX2lub2RlX29wZXJhdGlvbnMsIHByb2NfYXR0cl9kaXJfb3BlcmF0aW9ucyksCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfS0FMTFNZTVMKLQlJTkYoIndjaGFuIiwgICAgICBTX0lSVUdPLCBwaWRfd2NoYW4pLAorCUlORigid2NoYW4iLCAgICAgIFNfSVJVR08sIHByb2NfcGlkX3djaGFuKSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TVEFDS1RSQUNFCisJT05FKCJzdGFjayIsICAgICAgU19JUlVTUiwgcHJvY19waWRfc3RhY2spLAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1NDSEVEU1RBVFMKLQlJTkYoInNjaGVkc3RhdCIsICBTX0lSVUdPLCBwaWRfc2NoZWRzdGF0KSwKKwlJTkYoInNjaGVkc3RhdCIsICBTX0lSVUdPLCBwcm9jX3BpZF9zY2hlZHN0YXQpLAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0xBVEVOQ1lUT1AKLQlSRUcoImxhdGVuY3kiLCAgU19JUlVHTywgbHN0YXRzKSwKKwlSRUcoImxhdGVuY3kiLCAgU19JUlVHTywgcHJvY19sc3RhdHNfb3BlcmF0aW9ucyksCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfUFJPQ19QSURfQ1BVU0VUCi0JUkVHKCJjcHVzZXQiLCAgICAgU19JUlVHTywgY3B1c2V0KSwKKwlSRUcoImNwdXNldCIsICAgICBTX0lSVUdPLCBwcm9jX2NwdXNldF9vcGVyYXRpb25zKSwKICNlbmRpZgogI2lmZGVmIENPTkZJR19DR1JPVVBTCi0JUkVHKCJjZ3JvdXAiLCAgU19JUlVHTywgY2dyb3VwKSwKKwlSRUcoImNncm91cCIsICBTX0lSVUdPLCBwcm9jX2Nncm91cF9vcGVyYXRpb25zKSwKICNlbmRpZgotCUlORigib29tX3Njb3JlIiwgIFNfSVJVR08sIG9vbV9zY29yZSksCi0JUkVHKCJvb21fYWRqIiwgICAgU19JUlVHT3xTX0lXVVNSLCBvb21fYWRqdXN0KSwKKwlJTkYoIm9vbV9zY29yZSIsICBTX0lSVUdPLCBwcm9jX29vbV9zY29yZSksCisJUkVHKCJvb21fYWRqIiwgICAgU19JUlVHT3xTX0lXVVNSLCBwcm9jX29vbV9hZGp1c3Rfb3BlcmF0aW9ucyksCiAjaWZkZWYgQ09ORklHX0FVRElUU1lTQ0FMTAotCVJFRygibG9naW51aWQiLCAgIFNfSVdVU1J8U19JUlVHTywgbG9naW51aWQpLAotCVJFRygic2Vzc2lvbmlkIiwgIFNfSVJVR08sIHNlc3Npb25pZCksCisJUkVHKCJsb2dpbnVpZCIsICAgU19JV1VTUnxTX0lSVUdPLCBwcm9jX2xvZ2ludWlkX29wZXJhdGlvbnMpLAorCVJFRygic2Vzc2lvbmlkIiwgIFNfSVJVR08sIHByb2Nfc2Vzc2lvbmlkX29wZXJhdGlvbnMpLAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0ZBVUxUX0lOSkVDVElPTgotCVJFRygibWFrZS1pdC1mYWlsIiwgU19JUlVHT3xTX0lXVVNSLCBmYXVsdF9pbmplY3QpLAorCVJFRygibWFrZS1pdC1mYWlsIiwgU19JUlVHT3xTX0lXVVNSLCBwcm9jX2ZhdWx0X2luamVjdF9vcGVyYXRpb25zKSwKICNlbmRpZgogI2lmIGRlZmluZWQoVVNFX0VMRl9DT1JFX0RVTVApICYmIGRlZmluZWQoQ09ORklHX0VMRl9DT1JFKQotCVJFRygiY29yZWR1bXBfZmlsdGVyIiwgU19JUlVHT3xTX0lXVVNSLCBjb3JlZHVtcF9maWx0ZXIpLAorCVJFRygiY29yZWR1bXBfZmlsdGVyIiwgU19JUlVHT3xTX0lXVVNSLCBwcm9jX2NvcmVkdW1wX2ZpbHRlcl9vcGVyYXRpb25zKSwKICNlbmRpZgogI2lmZGVmIENPTkZJR19UQVNLX0lPX0FDQ09VTlRJTkcKLQlJTkYoImlvIiwJU19JUlVHTywgdGdpZF9pb19hY2NvdW50aW5nKSwKKwlJTkYoImlvIiwJU19JUlVHTywgcHJvY190Z2lkX2lvX2FjY291bnRpbmcpLAogI2VuZGlmCiB9OwogCkBAIC0yODA1LDY2ICsyODI3LDY5IEBACiAgKiBUYXNrcwogICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBpZF9lbnRyeSB0aWRfYmFzZV9zdHVmZltdID0gewotCURJUigiZmQiLCAgICAgICAgU19JUlVTUnxTX0lYVVNSLCBmZCksCi0JRElSKCJmZGluZm8iLCAgICBTX0lSVVNSfFNfSVhVU1IsIGZkaW5mbyksCi0JUkVHKCJlbnZpcm9uIiwgICBTX0lSVVNSLCBlbnZpcm9uKSwKLQlJTkYoImF1eHYiLCAgICAgIFNfSVJVU1IsIHBpZF9hdXh2KSwKLQlPTkUoInN0YXR1cyIsICAgIFNfSVJVR08sIHBpZF9zdGF0dXMpLAotCU9ORSgicGVyc29uYWxpdHkiLCBTX0lSVVNSLCBwaWRfcGVyc29uYWxpdHkpLAotCUlORigibGltaXRzIiwJIFNfSVJVU1IsIHBpZF9saW1pdHMpLAorCURJUigiZmQiLCAgICAgICAgU19JUlVTUnxTX0lYVVNSLCBwcm9jX2ZkX2lub2RlX29wZXJhdGlvbnMsIHByb2NfZmRfb3BlcmF0aW9ucyksCisJRElSKCJmZGluZm8iLCAgICBTX0lSVVNSfFNfSVhVU1IsIHByb2NfZmRpbmZvX2lub2RlX29wZXJhdGlvbnMsIHByb2NfZmRfb3BlcmF0aW9ucyksCisJUkVHKCJlbnZpcm9uIiwgICBTX0lSVVNSLCBwcm9jX2Vudmlyb25fb3BlcmF0aW9ucyksCisJSU5GKCJhdXh2IiwgICAgICBTX0lSVVNSLCBwcm9jX3BpZF9hdXh2KSwKKwlPTkUoInN0YXR1cyIsICAgIFNfSVJVR08sIHByb2NfcGlkX3N0YXR1cyksCisJT05FKCJwZXJzb25hbGl0eSIsIFNfSVJVU1IsIHByb2NfcGlkX3BlcnNvbmFsaXR5KSwKKwlJTkYoImxpbWl0cyIsCSBTX0lSVVNSLCBwcm9jX3BpZF9saW1pdHMpLAogI2lmZGVmIENPTkZJR19TQ0hFRF9ERUJVRwotCVJFRygic2NoZWQiLCAgICAgU19JUlVHT3xTX0lXVVNSLCBwaWRfc2NoZWQpLAorCVJFRygic2NoZWQiLCAgICAgU19JUlVHT3xTX0lXVVNSLCBwcm9jX3BpZF9zY2hlZF9vcGVyYXRpb25zKSwKICNlbmRpZgogI2lmZGVmIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LCi0JSU5GKCJzeXNjYWxsIiwgICBTX0lSVVNSLCBwaWRfc3lzY2FsbCksCisJSU5GKCJzeXNjYWxsIiwgICBTX0lSVVNSLCBwcm9jX3BpZF9zeXNjYWxsKSwKICNlbmRpZgotCUlORigiY21kbGluZSIsICAgU19JUlVHTywgcGlkX2NtZGxpbmUpLAotCU9ORSgic3RhdCIsICAgICAgU19JUlVHTywgdGlkX3N0YXQpLAotCU9ORSgic3RhdG0iLCAgICAgU19JUlVHTywgcGlkX3N0YXRtKSwKLQlSRUcoIm1hcHMiLCAgICAgIFNfSVJVR08sIG1hcHMpLAorCUlORigiY21kbGluZSIsICAgU19JUlVHTywgcHJvY19waWRfY21kbGluZSksCisJT05FKCJzdGF0IiwgICAgICBTX0lSVUdPLCBwcm9jX3RpZF9zdGF0KSwKKwlPTkUoInN0YXRtIiwgICAgIFNfSVJVR08sIHByb2NfcGlkX3N0YXRtKSwKKwlSRUcoIm1hcHMiLCAgICAgIFNfSVJVR08sIHByb2NfbWFwc19vcGVyYXRpb25zKSwKICNpZmRlZiBDT05GSUdfTlVNQQotCVJFRygibnVtYV9tYXBzIiwgU19JUlVHTywgbnVtYV9tYXBzKSwKKwlSRUcoIm51bWFfbWFwcyIsIFNfSVJVR08sIHByb2NfbnVtYV9tYXBzX29wZXJhdGlvbnMpLAogI2VuZGlmCi0JUkVHKCJtZW0iLCAgICAgICBTX0lSVVNSfFNfSVdVU1IsIG1lbSksCi0JTE5LKCJjd2QiLCAgICAgICBjd2QpLAotCUxOSygicm9vdCIsICAgICAgcm9vdCksCi0JTE5LKCJleGUiLCAgICAgICBleGUpLAotCVJFRygibW91bnRzIiwgICAgU19JUlVHTywgbW91bnRzKSwKLQlSRUcoIm1vdW50aW5mbyIsICBTX0lSVUdPLCBtb3VudGluZm8pLAorCVJFRygibWVtIiwgICAgICAgU19JUlVTUnxTX0lXVVNSLCBwcm9jX21lbV9vcGVyYXRpb25zKSwKKwlMTksoImN3ZCIsICAgICAgIHByb2NfY3dkX2xpbmspLAorCUxOSygicm9vdCIsICAgICAgcHJvY19yb290X2xpbmspLAorCUxOSygiZXhlIiwgICAgICAgcHJvY19leGVfbGluayksCisJUkVHKCJtb3VudHMiLCAgICBTX0lSVUdPLCBwcm9jX21vdW50c19vcGVyYXRpb25zKSwKKwlSRUcoIm1vdW50aW5mbyIsICBTX0lSVUdPLCBwcm9jX21vdW50aW5mb19vcGVyYXRpb25zKSwKICNpZmRlZiBDT05GSUdfUFJPQ19QQUdFX01PTklUT1IKLQlSRUcoImNsZWFyX3JlZnMiLCBTX0lXVVNSLCBjbGVhcl9yZWZzKSwKLQlSRUcoInNtYXBzIiwgICAgIFNfSVJVR08sIHNtYXBzKSwKLQlSRUcoInBhZ2VtYXAiLCAgICBTX0lSVVNSLCBwYWdlbWFwKSwKKwlSRUcoImNsZWFyX3JlZnMiLCBTX0lXVVNSLCBwcm9jX2NsZWFyX3JlZnNfb3BlcmF0aW9ucyksCisJUkVHKCJzbWFwcyIsICAgICBTX0lSVUdPLCBwcm9jX3NtYXBzX29wZXJhdGlvbnMpLAorCVJFRygicGFnZW1hcCIsICAgIFNfSVJVU1IsIHByb2NfcGFnZW1hcF9vcGVyYXRpb25zKSwKICNlbmRpZgogI2lmZGVmIENPTkZJR19TRUNVUklUWQotCURJUigiYXR0ciIsICAgICAgU19JUlVHT3xTX0lYVUdPLCBhdHRyX2RpciksCisJRElSKCJhdHRyIiwgICAgICBTX0lSVUdPfFNfSVhVR08sIHByb2NfYXR0cl9kaXJfaW5vZGVfb3BlcmF0aW9ucywgcHJvY19hdHRyX2Rpcl9vcGVyYXRpb25zKSwKICNlbmRpZgogI2lmZGVmIENPTkZJR19LQUxMU1lNUwotCUlORigid2NoYW4iLCAgICAgU19JUlVHTywgcGlkX3djaGFuKSwKKwlJTkYoIndjaGFuIiwgICAgIFNfSVJVR08sIHByb2NfcGlkX3djaGFuKSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TVEFDS1RSQUNFCisJT05FKCJzdGFjayIsICAgICAgU19JUlVTUiwgcHJvY19waWRfc3RhY2spLAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1NDSEVEU1RBVFMKLQlJTkYoInNjaGVkc3RhdCIsIFNfSVJVR08sIHBpZF9zY2hlZHN0YXQpLAorCUlORigic2NoZWRzdGF0IiwgU19JUlVHTywgcHJvY19waWRfc2NoZWRzdGF0KSwKICNlbmRpZgogI2lmZGVmIENPTkZJR19MQVRFTkNZVE9QCi0JUkVHKCJsYXRlbmN5IiwgIFNfSVJVR08sIGxzdGF0cyksCisJUkVHKCJsYXRlbmN5IiwgIFNfSVJVR08sIHByb2NfbHN0YXRzX29wZXJhdGlvbnMpLAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1BST0NfUElEX0NQVVNFVAotCVJFRygiY3B1c2V0IiwgICAgU19JUlVHTywgY3B1c2V0KSwKKwlSRUcoImNwdXNldCIsICAgIFNfSVJVR08sIHByb2NfY3B1c2V0X29wZXJhdGlvbnMpLAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0NHUk9VUFMKLQlSRUcoImNncm91cCIsICBTX0lSVUdPLCBjZ3JvdXApLAorCVJFRygiY2dyb3VwIiwgIFNfSVJVR08sIHByb2NfY2dyb3VwX29wZXJhdGlvbnMpLAogI2VuZGlmCi0JSU5GKCJvb21fc2NvcmUiLCBTX0lSVUdPLCBvb21fc2NvcmUpLAotCVJFRygib29tX2FkaiIsICAgU19JUlVHT3xTX0lXVVNSLCBvb21fYWRqdXN0KSwKKwlJTkYoIm9vbV9zY29yZSIsIFNfSVJVR08sIHByb2Nfb29tX3Njb3JlKSwKKwlSRUcoIm9vbV9hZGoiLCAgIFNfSVJVR098U19JV1VTUiwgcHJvY19vb21fYWRqdXN0X29wZXJhdGlvbnMpLAogI2lmZGVmIENPTkZJR19BVURJVFNZU0NBTEwKLQlSRUcoImxvZ2ludWlkIiwgIFNfSVdVU1J8U19JUlVHTywgbG9naW51aWQpLAotCVJFRygic2Vzc2lvbmlkIiwgIFNfSVJVU1IsIHNlc3Npb25pZCksCisJUkVHKCJsb2dpbnVpZCIsICBTX0lXVVNSfFNfSVJVR08sIHByb2NfbG9naW51aWRfb3BlcmF0aW9ucyksCisJUkVHKCJzZXNzaW9uaWQiLCAgU19JUlVTUiwgcHJvY19zZXNzaW9uaWRfb3BlcmF0aW9ucyksCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfRkFVTFRfSU5KRUNUSU9OCi0JUkVHKCJtYWtlLWl0LWZhaWwiLCBTX0lSVUdPfFNfSVdVU1IsIGZhdWx0X2luamVjdCksCisJUkVHKCJtYWtlLWl0LWZhaWwiLCBTX0lSVUdPfFNfSVdVU1IsIHByb2NfZmF1bHRfaW5qZWN0X29wZXJhdGlvbnMpLAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1RBU0tfSU9fQUNDT1VOVElORwotCUlORigiaW8iLAlTX0lSVUdPLCB0aWRfaW9fYWNjb3VudGluZyksCisJSU5GKCJpbyIsCVNfSVJVR08sIHByb2NfdGlkX2lvX2FjY291bnRpbmcpLAogI2VuZGlmCiB9OwogCmRpZmYgLS1naXQgYS9mcy9wcm9jL2dlbmVyaWMuYyBiL2ZzL3Byb2MvZ2VuZXJpYy5jCmluZGV4IDYwYTM1OWIuLmRiN2ZhNWMgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvZ2VuZXJpYy5jCisrKyBiL2ZzL3Byb2MvZ2VuZXJpYy5jCkBAIC0xNCw3ICsxNCw2IEBACiAjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaWRyLmg+CiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KQEAgLTM3OSw3ICszNzgsNiBAQAogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOwogCWludCBlcnJvciA9IC1FTk9FTlQ7CiAKLQlsb2NrX2tlcm5lbCgpOwogCXNwaW5fbG9jaygmcHJvY19zdWJkaXJfbG9jayk7CiAJZm9yIChkZSA9IGRlLT5zdWJkaXI7IGRlIDsgZGUgPSBkZS0+bmV4dCkgewogCQlpZiAoZGUtPm5hbWVsZW4gIT0gZGVudHJ5LT5kX25hbWUubGVuKQpAQCAtMzk3LDcgKzM5NSw2IEBACiAJfQogCXNwaW5fdW5sb2NrKCZwcm9jX3N1YmRpcl9sb2NrKTsKIG91dF91bmxvY2s6Ci0JdW5sb2NrX2tlcm5lbCgpOwogCiAJaWYgKGlub2RlKSB7CiAJCWRlbnRyeS0+ZF9vcCA9ICZwcm9jX2RlbnRyeV9vcGVyYXRpb25zOwpAQCAtNDMyLDggKzQyOSw2IEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJaW50IHJldCA9IDA7CiAKLQlsb2NrX2tlcm5lbCgpOwotCiAJaW5vID0gaW5vZGUtPmlfaW5vOwogCWkgPSBmaWxwLT5mX3BvczsKIAlzd2l0Y2ggKGkpIHsKQEAgLTQ4Nyw3ICs0ODIsNyBAQAogCQkJc3Bpbl91bmxvY2soJnByb2Nfc3ViZGlyX2xvY2spOwogCX0KIAlyZXQgPSAxOwotb3V0Ogl1bmxvY2tfa2VybmVsKCk7CitvdXQ6CiAJcmV0dXJuIHJldDsJCiB9CiAKQEAgLTUwNCw2ICs0OTksNyBAQAogICogdGhlIC9wcm9jIGRpcmVjdG9yeS4KICAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19kaXJfb3BlcmF0aW9ucyA9IHsKKwkubGxzZWVrCQkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAogCS5yZWFkCQkJPSBnZW5lcmljX3JlYWRfZGlyLAogCS5yZWFkZGlyCQk9IHByb2NfcmVhZGRpciwKIH07CmRpZmYgLS1naXQgYS9mcy9wcm9jL2lub2RlLmMgYi9mcy9wcm9jL2lub2RlLmMKaW5kZXggMjU0M2ZkMC4uM2U3NmJiOSAxMDA2NDQKLS0tIGEvZnMvcHJvYy9pbm9kZS5jCisrKyBiL2ZzL3Byb2MvaW5vZGUuYwpAQCAtMzUsMTYgKzM1LDEzIEBACiAgKi8KIHZvaWQgZGVfcHV0KHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGUpCiB7Ci0JbG9ja19rZXJuZWwoKTsKIAlpZiAoIWF0b21pY19yZWFkKCZkZS0+Y291bnQpKSB7CiAJCXByaW50aygiZGVfcHV0OiBlbnRyeSAlcyBhbHJlYWR5IGZyZWUhXG4iLCBkZS0+bmFtZSk7Ci0JCXVubG9ja19rZXJuZWwoKTsKIAkJcmV0dXJuOwogCX0KIAogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZkZS0+Y291bnQpKQogCQlmcmVlX3Byb2NfZW50cnkoZGUpOwotCXVubG9ja19rZXJuZWwoKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvcHJvY19uZXQuYyBiL2ZzL3Byb2MvcHJvY19uZXQuYwppbmRleCA3YmMyOTZmLi4wNGQxMjcwIDEwMDY0NAotLS0gYS9mcy9wcm9jL3Byb2NfbmV0LmMKKysrIGIvZnMvcHJvYy9wcm9jX25ldC5jCkBAIC0xOCw3ICsxOCw2IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvbnNwcm94eS5oPgogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CkBAIC0xNzIsNiArMTcxLDcgQEAKIH0KIAogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX25ldF9vcGVyYXRpb25zID0geworCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKIAkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAogCS5yZWFkZGlyCT0gcHJvY190Z2lkX25ldF9yZWFkZGlyLAogfTsKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvcHJvY19zeXNjdGwuYyBiL2ZzL3Byb2MvcHJvY19zeXNjdGwuYwppbmRleCAwNmVkMTBiLi45NGZjZmZmIDEwMDY0NAotLS0gYS9mcy9wcm9jL3Byb2Nfc3lzY3RsLmMKKysrIGIvZnMvcHJvYy9wcm9jX3N5c2N0bC5jCkBAIC0zMSw3ICszMSw2IEBACiAJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCWlub2RlLT5pX2ZsYWdzIHw9IFNfUFJJVkFURTsgLyogdGVsbCBzZWxpbnV4IHRvIGlnbm9yZSB0aGlzIGlub2RlICovCiAJaW5vZGUtPmlfbW9kZSA9IHRhYmxlLT5tb2RlOwotCWlub2RlLT5pX3VpZCA9IGlub2RlLT5pX2dpZCA9IDA7CiAJaWYgKCF0YWJsZS0+Y2hpbGQpIHsKIAkJaW5vZGUtPmlfbW9kZSB8PSBTX0lGUkVHOwogCQlpbm9kZS0+aV9vcCA9ICZwcm9jX3N5c19pbm9kZV9vcGVyYXRpb25zOwpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9yb290LmMgYi9mcy9wcm9jL3Jvb3QuYwppbmRleCA3NzYxNjAyLi5mNjI5OWEyIDEwMDY0NAotLS0gYS9mcy9wcm9jL3Jvb3QuYworKysgYi9mcy9wcm9jL3Jvb3QuYwpAQCAtMTYsNyArMTYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L3BpZF9uYW1lc3BhY2UuaD4KIApAQCAtMTYyLDE3ICsxNjEsMTIgQEAKIAl1bnNpZ25lZCBpbnQgbnIgPSBmaWxwLT5mX3BvczsKIAlpbnQgcmV0OwogCi0JbG9ja19rZXJuZWwoKTsKLQogCWlmIChuciA8IEZJUlNUX1BST0NFU1NfRU5UUlkpIHsKIAkJaW50IGVycm9yID0gcHJvY19yZWFkZGlyKGZpbHAsIGRpcmVudCwgZmlsbGRpcik7Ci0JCWlmIChlcnJvciA8PSAwKSB7Ci0JCQl1bmxvY2tfa2VybmVsKCk7CisJCWlmIChlcnJvciA8PSAwKQogCQkJcmV0dXJuIGVycm9yOwotCQl9CiAJCWZpbHAtPmZfcG9zID0gRklSU1RfUFJPQ0VTU19FTlRSWTsKIAl9Ci0JdW5sb2NrX2tlcm5lbCgpOwogCiAJcmV0ID0gcHJvY19waWRfcmVhZGRpcihmaWxwLCBkaXJlbnQsIGZpbGxkaXIpOwogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9mcy9wcm9jL3Rhc2tfbW11LmMgYi9mcy9wcm9jL3Rhc2tfbW11LmMKaW5kZXggM2E4YmRkNy4uOTQwNjM4NCAxMDA2NDQKLS0tIGEvZnMvcHJvYy90YXNrX21tdS5jCisrKyBiL2ZzL3Byb2MvdGFza19tbXUuYwpAQCAtMzk2LDcgKzM5Niw5IEBACiAJCSAgICJQcml2YXRlX0NsZWFuOiAgJThsdSBrQlxuIgogCQkgICAiUHJpdmF0ZV9EaXJ0eTogICU4bHUga0JcbiIKIAkJICAgIlJlZmVyZW5jZWQ6ICAgICAlOGx1IGtCXG4iCi0JCSAgICJTd2FwOiAgICAgICAgICAgJThsdSBrQlxuIiwKKwkJICAgIlN3YXA6ICAgICAgICAgICAlOGx1IGtCXG4iCisJCSAgICJLZXJuZWxQYWdlU2l6ZTogJThsdSBrQlxuIgorCQkgICAiTU1VUGFnZVNpemU6ICAgICU4bHUga0JcbiIsCiAJCSAgICh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpID4+IDEwLAogCQkgICBtc3MucmVzaWRlbnQgPj4gMTAsCiAJCSAgICh1bnNpZ25lZCBsb25nKShtc3MucHNzID4+ICgxMCArIFBTU19TSElGVCkpLApAQCAtNDA1LDcgKzQwNyw5IEBACiAJCSAgIG1zcy5wcml2YXRlX2NsZWFuID4+IDEwLAogCQkgICBtc3MucHJpdmF0ZV9kaXJ0eSA+PiAxMCwKIAkJICAgbXNzLnJlZmVyZW5jZWQgPj4gMTAsCi0JCSAgIG1zcy5zd2FwID4+IDEwKTsKKwkJICAgbXNzLnN3YXAgPj4gMTAsCisJCSAgIHZtYV9rZXJuZWxfcGFnZXNpemUodm1hKSA+PiAxMCwKKwkJICAgdm1hX21tdV9wYWdlc2l6ZSh2bWEpID4+IDEwKTsKIAogCWlmIChtLT5jb3VudCA8IG0tPnNpemUpICAvKiB2bWEgaXMgY29waWVkIHN1Y2Nlc3NmdWxseSAqLwogCQltLT52ZXJzaW9uID0gKHZtYSAhPSBnZXRfZ2F0ZV92bWEodGFzaykpID8gdm1hLT52bV9zdGFydCA6IDA7CmRpZmYgLS1naXQgYS9mcy9wcm9jL3Rhc2tfbm9tbXUuYyBiL2ZzL3Byb2MvdGFza19ub21tdS5jCmluZGV4IDIxOWJkNzkuLmQ0YThiZTMgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvdGFza19ub21tdS5jCisrKyBiL2ZzL3Byb2MvdGFza19ub21tdS5jCkBAIC05LDcgKzksNyBAQAogCiAvKgogICogTG9naWM6IHdlJ3ZlIGdvdCB0d28gbWVtb3J5IHN1bXMgZm9yIGVhY2ggcHJvY2VzcywgInNoYXJlZCIsIGFuZAotICogIm5vbi1zaGFyZWQiLiBTaGFyZWQgbWVtb3J5IG1heSBnZXQgY291bnRlZCBtb3JlIHRoZW4gb25jZSwgZm9yCisgKiAibm9uLXNoYXJlZCIuIFNoYXJlZCBtZW1vcnkgbWF5IGdldCBjb3VudGVkIG1vcmUgdGhhbiBvbmNlLCBmb3IKICAqIGVhY2ggcHJvY2VzcyB0aGF0IG93bnMgaXQuIE5vbi1zaGFyZWQgbWVtb3J5IGlzIGNvdW50ZWQKICAqIGFjY3VyYXRlbHkuCiAgKi8KZGlmZiAtLWdpdCBhL2ZzL3Byb2Mvdm1jb3JlLmMgYi9mcy9wcm9jL3ZtY29yZS5jCmluZGV4IDAzZWM1OTUuLjVlZGNjM2YgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2Mvdm1jb3JlLmMKKysrIGIvZnMvcHJvYy92bWNvcmUuYwpAQCAtNDcsOCArNDcsNiBAQAogCiAJb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpKCpwcG9zICUgUEFHRV9TSVpFKTsKIAlwZm4gPSAodW5zaWduZWQgbG9uZykoKnBwb3MgLyBQQUdFX1NJWkUpOwotCWlmIChwZm4gPiBzYXZlZF9tYXhfcGZuKQotCQlyZXR1cm4gLUVJTlZBTDsKIAogCWRvIHsKIAkJaWYgKGNvdW50ID4gKFBBR0VfU0laRSAtIG9mZnNldCkpCmRpZmYgLS1naXQgYS9mcy9xdW90YS5jIGIvZnMvcXVvdGEuYwppbmRleCBiN2ZlNDRlLi40YThjOTRmIDEwMDY0NAotLS0gYS9mcy9xdW90YS5jCisrKyBiL2ZzL3F1b3RhLmMKQEAgLTczLDcgKzczLDcgQEAKIAkJY2FzZSBRX1NFVFFVT1RBOgogCQljYXNlIFFfR0VUUVVPVEE6CiAJCQkvKiBUaGlzIGlzIGp1c3QgaW5mb3JtYXRpdmUgdGVzdCBzbyB3ZSBhcmUgc2F0aXNmaWVkIHdpdGhvdXQgYSBsb2NrICovCi0JCQlpZiAoIXNiX2hhc19xdW90YV9lbmFibGVkKHNiLCB0eXBlKSkKKwkJCWlmICghc2JfaGFzX3F1b3RhX2FjdGl2ZShzYiwgdHlwZSkpCiAJCQkJcmV0dXJuIC1FU1JDSDsKIAl9CiAKQEAgLTE2MCw2ICsxNjAsOSBAQAogCWludCBjbnQ7CiAKIAlzYi0+c19xY29wLT5xdW90YV9zeW5jKHNiLCB0eXBlKTsKKworCWlmIChzYl9kcW9wdChzYiktPmZsYWdzICYgRFFVT1RfUVVPVEFfU1lTX0ZJTEUpCisJCXJldHVybjsKIAkvKiBUaGlzIGlzIG5vdCB2ZXJ5IGNsZXZlciAoYW5kIGZhc3QpIGJ1dCBjdXJyZW50bHkgSSBkb24ndCBrbm93IGFib3V0CiAJICogYW55IG90aGVyIHNpbXBsZSB3YXkgb2YgZ2V0dGluZyBxdW90YSBkYXRhIHRvIGRpc2sgYW5kIHdlIG11c3QgZ2V0CiAJICogdGhlbSB0aGVyZSBmb3IgdXNlcnNwYWNlIHRvIGJlIHZpc2libGUuLi4gKi8KQEAgLTE3NSw3ICsxNzgsNyBAQAogCWZvciAoY250ID0gMDsgY250IDwgTUFYUVVPVEFTOyBjbnQrKykgewogCQlpZiAodHlwZSAhPSAtMSAmJiBjbnQgIT0gdHlwZSkKIAkJCWNvbnRpbnVlOwotCQlpZiAoIXNiX2hhc19xdW90YV9lbmFibGVkKHNiLCBjbnQpKQorCQlpZiAoIXNiX2hhc19xdW90YV9hY3RpdmUoc2IsIGNudCkpCiAJCQljb250aW51ZTsKIAkJbXV0ZXhfbG9ja19uZXN0ZWQoJnNiX2Rxb3B0KHNiKS0+ZmlsZXNbY250XS0+aV9tdXRleCwgSV9NVVRFWF9RVU9UQSk7CiAJCXRydW5jYXRlX2lub2RlX3BhZ2VzKCZzYl9kcW9wdChzYiktPmZpbGVzW2NudF0tPmlfZGF0YSwgMCk7CkBAIC0yMDEsNyArMjA0LDcgQEAKIAkJZm9yIChjbnQgPSAwOyBjbnQgPCBNQVhRVU9UQVM7IGNudCsrKSB7CiAJCQlpZiAodHlwZSAhPSAtMSAmJiB0eXBlICE9IGNudCkKIAkJCQljb250aW51ZTsKLQkJCWlmICghc2JfaGFzX3F1b3RhX2VuYWJsZWQoc2IsIGNudCkpCisJCQlpZiAoIXNiX2hhc19xdW90YV9hY3RpdmUoc2IsIGNudCkpCiAJCQkJY29udGludWU7CiAJCQlpZiAoIWluZm9fZGlydHkoJnNiX2Rxb3B0KHNiKS0+aW5mb1tjbnRdKSAmJgogCQkJICAgIGxpc3RfZW1wdHkoJnNiX2Rxb3B0KHNiKS0+aW5mb1tjbnRdLmRxaV9kaXJ0eV9saXN0KSkKQEAgLTI0NSw3ICsyNDgsNyBAQAogCQkJX191MzIgZm10OwogCiAJCQlkb3duX3JlYWQoJnNiX2Rxb3B0KHNiKS0+ZHFwdHJfc2VtKTsKLQkJCWlmICghc2JfaGFzX3F1b3RhX2VuYWJsZWQoc2IsIHR5cGUpKSB7CisJCQlpZiAoIXNiX2hhc19xdW90YV9hY3RpdmUoc2IsIHR5cGUpKSB7CiAJCQkJdXBfcmVhZCgmc2JfZHFvcHQoc2IpLT5kcXB0cl9zZW0pOwogCQkJCXJldHVybiAtRVNSQ0g7CiAJCQl9CmRpZmYgLS1naXQgYS9mcy9xdW90YV90cmVlLmMgYi9mcy9xdW90YV90cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUzNDA0YwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3F1b3RhX3RyZWUuYwpAQCAtMCwwICsxLDY0NSBAQAorLyoKKyAqCXZmc3YwIHF1b3RhIElPIG9wZXJhdGlvbnMgb24gZmlsZQorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kcWJsa192Mi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2luY2x1ZGUgInF1b3RhX3RyZWUuaCIKKworTU9EVUxFX0FVVEhPUigiSmFuIEthcmEiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUXVvdGEgdHJpZSBzdXBwb3J0Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNkZWZpbmUgX19RVU9UQV9RVF9QQVJBTk9JQQorCit0eXBlZGVmIGNoYXIgKmRxYnVmX3Q7CisKK3N0YXRpYyBpbnQgZ2V0X2luZGV4KHN0cnVjdCBxdHJlZV9tZW1fZHFpbmZvICppbmZvLCBxaWRfdCBpZCwgaW50IGRlcHRoKQoreworCXVuc2lnbmVkIGludCBlcGIgPSBpbmZvLT5kcWlfdXNhYmxlX2JzID4+IDI7CisKKwlkZXB0aCA9IGluZm8tPmRxaV9xdHJlZV9kZXB0aCAtIGRlcHRoIC0gMTsKKwl3aGlsZSAoZGVwdGgtLSkKKwkJaWQgLz0gZXBiOworCXJldHVybiBpZCAlIGVwYjsKK30KKworLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gb25lIGJsb2NrcyAqLworc3RhdGljIGlubGluZSBpbnQgcXRyZWVfZHFzdHJfaW5fYmxrKHN0cnVjdCBxdHJlZV9tZW1fZHFpbmZvICppbmZvKQoreworCXJldHVybiAoaW5mby0+ZHFpX3VzYWJsZV9icyAtIHNpemVvZihzdHJ1Y3QgcXRfZGlza19kcWRiaGVhZGVyKSkKKwkgICAgICAgLyBpbmZvLT5kcWlfZW50cnlfc2l6ZTsKK30KKworc3RhdGljIGRxYnVmX3QgZ2V0ZHFidWYoc2l6ZV90IHNpemUpCit7CisJZHFidWZfdCBidWYgPSBrbWFsbG9jKHNpemUsIEdGUF9OT0ZTKTsKKwlpZiAoIWJ1ZikKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVkZTOiBOb3QgZW5vdWdoIG1lbW9yeSBmb3IgcXVvdGEgYnVmZmVycy5cbiIpOworCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlZHFidWYoZHFidWZfdCBidWYpCit7CisJa2ZyZWUoYnVmKTsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IHJlYWRfYmxrKHN0cnVjdCBxdHJlZV9tZW1fZHFpbmZvICppbmZvLCB1aW50IGJsaywgZHFidWZfdCBidWYpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGluZm8tPmRxaV9zYjsKKworCW1lbXNldChidWYsIDAsIGluZm8tPmRxaV91c2FibGVfYnMpOworCXJldHVybiBzYi0+c19vcC0+cXVvdGFfcmVhZChzYiwgaW5mby0+ZHFpX3R5cGUsIChjaGFyICopYnVmLAorCSAgICAgICBpbmZvLT5kcWlfdXNhYmxlX2JzLCBibGsgPDwgaW5mby0+ZHFpX2Jsb2Nrc2l6ZV9iaXRzKTsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IHdyaXRlX2JsayhzdHJ1Y3QgcXRyZWVfbWVtX2RxaW5mbyAqaW5mbywgdWludCBibGssIGRxYnVmX3QgYnVmKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbmZvLT5kcWlfc2I7CisKKwlyZXR1cm4gc2ItPnNfb3AtPnF1b3RhX3dyaXRlKHNiLCBpbmZvLT5kcWlfdHlwZSwgKGNoYXIgKilidWYsCisJICAgICAgIGluZm8tPmRxaV91c2FibGVfYnMsIGJsayA8PCBpbmZvLT5kcWlfYmxvY2tzaXplX2JpdHMpOworfQorCisvKiBSZW1vdmUgZW1wdHkgYmxvY2sgZnJvbSBsaXN0IGFuZCByZXR1cm4gaXQgKi8KK3N0YXRpYyBpbnQgZ2V0X2ZyZWVfZHFibGsoc3RydWN0IHF0cmVlX21lbV9kcWluZm8gKmluZm8pCit7CisJZHFidWZfdCBidWYgPSBnZXRkcWJ1ZihpbmZvLT5kcWlfdXNhYmxlX2JzKTsKKwlzdHJ1Y3QgcXRfZGlza19kcWRiaGVhZGVyICpkaCA9IChzdHJ1Y3QgcXRfZGlza19kcWRiaGVhZGVyICopYnVmOworCWludCByZXQsIGJsazsKKworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoaW5mby0+ZHFpX2ZyZWVfYmxrKSB7CisJCWJsayA9IGluZm8tPmRxaV9mcmVlX2JsazsKKwkJcmV0ID0gcmVhZF9ibGsoaW5mbywgYmxrLCBidWYpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0X2J1ZjsKKwkJaW5mby0+ZHFpX2ZyZWVfYmxrID0gbGUzMl90b19jcHUoZGgtPmRxZGhfbmV4dF9mcmVlKTsKKwl9CisJZWxzZSB7CisJCW1lbXNldChidWYsIDAsIGluZm8tPmRxaV91c2FibGVfYnMpOworCQkvKiBBc3N1cmUgYmxvY2sgYWxsb2NhdGlvbi4uLiAqLworCQlyZXQgPSB3cml0ZV9ibGsoaW5mbywgaW5mby0+ZHFpX2Jsb2NrcywgYnVmKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dF9idWY7CisJCWJsayA9IGluZm8tPmRxaV9ibG9ja3MrKzsKKwl9CisJbWFya19pbmZvX2RpcnR5KGluZm8tPmRxaV9zYiwgaW5mby0+ZHFpX3R5cGUpOworCXJldCA9IGJsazsKK291dF9idWY6CisJZnJlZWRxYnVmKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworLyogSW5zZXJ0IGVtcHR5IGJsb2NrIHRvIHRoZSBsaXN0ICovCitzdGF0aWMgaW50IHB1dF9mcmVlX2RxYmxrKHN0cnVjdCBxdHJlZV9tZW1fZHFpbmZvICppbmZvLCBkcWJ1Zl90IGJ1ZiwgdWludCBibGspCit7CisJc3RydWN0IHF0X2Rpc2tfZHFkYmhlYWRlciAqZGggPSAoc3RydWN0IHF0X2Rpc2tfZHFkYmhlYWRlciAqKWJ1ZjsKKwlpbnQgZXJyOworCisJZGgtPmRxZGhfbmV4dF9mcmVlID0gY3B1X3RvX2xlMzIoaW5mby0+ZHFpX2ZyZWVfYmxrKTsKKwlkaC0+ZHFkaF9wcmV2X2ZyZWUgPSBjcHVfdG9fbGUzMigwKTsKKwlkaC0+ZHFkaF9lbnRyaWVzID0gY3B1X3RvX2xlMTYoMCk7CisJZXJyID0gd3JpdGVfYmxrKGluZm8sIGJsaywgYnVmKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlpbmZvLT5kcWlfZnJlZV9ibGsgPSBibGs7CisJbWFya19pbmZvX2RpcnR5KGluZm8tPmRxaV9zYiwgaW5mby0+ZHFpX3R5cGUpOworCXJldHVybiAwOworfQorCisvKiBSZW1vdmUgZ2l2ZW4gYmxvY2sgZnJvbSB0aGUgbGlzdCBvZiBibG9ja3Mgd2l0aCBmcmVlIGVudHJpZXMgKi8KK3N0YXRpYyBpbnQgcmVtb3ZlX2ZyZWVfZHFlbnRyeShzdHJ1Y3QgcXRyZWVfbWVtX2RxaW5mbyAqaW5mbywgZHFidWZfdCBidWYsIHVpbnQgYmxrKQoreworCWRxYnVmX3QgdG1wYnVmID0gZ2V0ZHFidWYoaW5mby0+ZHFpX3VzYWJsZV9icyk7CisJc3RydWN0IHF0X2Rpc2tfZHFkYmhlYWRlciAqZGggPSAoc3RydWN0IHF0X2Rpc2tfZHFkYmhlYWRlciAqKWJ1ZjsKKwl1aW50IG5leHRibGsgPSBsZTMyX3RvX2NwdShkaC0+ZHFkaF9uZXh0X2ZyZWUpOworCXVpbnQgcHJldmJsayA9IGxlMzJfdG9fY3B1KGRoLT5kcWRoX3ByZXZfZnJlZSk7CisJaW50IGVycjsKKworCWlmICghdG1wYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAobmV4dGJsaykgeworCQllcnIgPSByZWFkX2JsayhpbmZvLCBuZXh0YmxrLCB0bXBidWYpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gb3V0X2J1ZjsKKwkJKChzdHJ1Y3QgcXRfZGlza19kcWRiaGVhZGVyICopdG1wYnVmKS0+ZHFkaF9wcmV2X2ZyZWUgPQorCQkJCQkJCWRoLT5kcWRoX3ByZXZfZnJlZTsKKwkJZXJyID0gd3JpdGVfYmxrKGluZm8sIG5leHRibGssIHRtcGJ1Zik7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBvdXRfYnVmOworCX0KKwlpZiAocHJldmJsaykgeworCQllcnIgPSByZWFkX2JsayhpbmZvLCBwcmV2YmxrLCB0bXBidWYpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gb3V0X2J1ZjsKKwkJKChzdHJ1Y3QgcXRfZGlza19kcWRiaGVhZGVyICopdG1wYnVmKS0+ZHFkaF9uZXh0X2ZyZWUgPQorCQkJCQkJCWRoLT5kcWRoX25leHRfZnJlZTsKKwkJZXJyID0gd3JpdGVfYmxrKGluZm8sIHByZXZibGssIHRtcGJ1Zik7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBvdXRfYnVmOworCX0gZWxzZSB7CisJCWluZm8tPmRxaV9mcmVlX2VudHJ5ID0gbmV4dGJsazsKKwkJbWFya19pbmZvX2RpcnR5KGluZm8tPmRxaV9zYiwgaW5mby0+ZHFpX3R5cGUpOworCX0KKwlmcmVlZHFidWYodG1wYnVmKTsKKwlkaC0+ZHFkaF9uZXh0X2ZyZWUgPSBkaC0+ZHFkaF9wcmV2X2ZyZWUgPSBjcHVfdG9fbGUzMigwKTsKKwkvKiBObyBtYXR0ZXIgd2hldGhlciB3cml0ZSBzdWNjZWVkcyBibG9jayBpcyBvdXQgb2YgbGlzdCAqLworCWlmICh3cml0ZV9ibGsoaW5mbywgYmxrLCBidWYpIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IENhbid0IHdyaXRlIGJsb2NrICgldSkgd2l0aCBmcmVlIGVudHJpZXMuXG4iLCBibGspOworCXJldHVybiAwOworb3V0X2J1ZjoKKwlmcmVlZHFidWYodG1wYnVmKTsKKwlyZXR1cm4gZXJyOworfQorCisvKiBJbnNlcnQgZ2l2ZW4gYmxvY2sgdG8gdGhlIGJlZ2lubmluZyBvZiBsaXN0IHdpdGggZnJlZSBlbnRyaWVzICovCitzdGF0aWMgaW50IGluc2VydF9mcmVlX2RxZW50cnkoc3RydWN0IHF0cmVlX21lbV9kcWluZm8gKmluZm8sIGRxYnVmX3QgYnVmLCB1aW50IGJsaykKK3sKKwlkcWJ1Zl90IHRtcGJ1ZiA9IGdldGRxYnVmKGluZm8tPmRxaV91c2FibGVfYnMpOworCXN0cnVjdCBxdF9kaXNrX2RxZGJoZWFkZXIgKmRoID0gKHN0cnVjdCBxdF9kaXNrX2RxZGJoZWFkZXIgKilidWY7CisJaW50IGVycjsKKworCWlmICghdG1wYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKwlkaC0+ZHFkaF9uZXh0X2ZyZWUgPSBjcHVfdG9fbGUzMihpbmZvLT5kcWlfZnJlZV9lbnRyeSk7CisJZGgtPmRxZGhfcHJldl9mcmVlID0gY3B1X3RvX2xlMzIoMCk7CisJZXJyID0gd3JpdGVfYmxrKGluZm8sIGJsaywgYnVmKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXRfYnVmOworCWlmIChpbmZvLT5kcWlfZnJlZV9lbnRyeSkgeworCQllcnIgPSByZWFkX2JsayhpbmZvLCBpbmZvLT5kcWlfZnJlZV9lbnRyeSwgdG1wYnVmKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIG91dF9idWY7CisJCSgoc3RydWN0IHF0X2Rpc2tfZHFkYmhlYWRlciAqKXRtcGJ1ZiktPmRxZGhfcHJldl9mcmVlID0KKwkJCQkJCQljcHVfdG9fbGUzMihibGspOworCQllcnIgPSB3cml0ZV9ibGsoaW5mbywgaW5mby0+ZHFpX2ZyZWVfZW50cnksIHRtcGJ1Zik7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBvdXRfYnVmOworCX0KKwlmcmVlZHFidWYodG1wYnVmKTsKKwlpbmZvLT5kcWlfZnJlZV9lbnRyeSA9IGJsazsKKwltYXJrX2luZm9fZGlydHkoaW5mby0+ZHFpX3NiLCBpbmZvLT5kcWlfdHlwZSk7CisJcmV0dXJuIDA7CitvdXRfYnVmOgorCWZyZWVkcWJ1Zih0bXBidWYpOworCXJldHVybiBlcnI7Cit9CisKKy8qIElzIHRoZSBlbnRyeSBpbiB0aGUgYmxvY2sgZnJlZT8gKi8KK2ludCBxdHJlZV9lbnRyeV91bnVzZWQoc3RydWN0IHF0cmVlX21lbV9kcWluZm8gKmluZm8sIGNoYXIgKmRpc2spCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5mby0+ZHFpX2VudHJ5X3NpemU7IGkrKykKKwkJaWYgKGRpc2tbaV0pCisJCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KK0VYUE9SVF9TWU1CT0wocXRyZWVfZW50cnlfdW51c2VkKTsKKworLyogRmluZCBzcGFjZSBmb3IgZHF1b3QgKi8KK3N0YXRpYyB1aW50IGZpbmRfZnJlZV9kcWVudHJ5KHN0cnVjdCBxdHJlZV9tZW1fZHFpbmZvICppbmZvLAorCQkJICAgICAgc3RydWN0IGRxdW90ICpkcXVvdCwgaW50ICplcnIpCit7CisJdWludCBibGssIGk7CisJc3RydWN0IHF0X2Rpc2tfZHFkYmhlYWRlciAqZGg7CisJZHFidWZfdCBidWYgPSBnZXRkcWJ1ZihpbmZvLT5kcWlfdXNhYmxlX2JzKTsKKwljaGFyICpkZHF1b3Q7CisKKwkqZXJyID0gMDsKKwlpZiAoIWJ1ZikgeworCQkqZXJyID0gLUVOT01FTTsKKwkJcmV0dXJuIDA7CisJfQorCWRoID0gKHN0cnVjdCBxdF9kaXNrX2RxZGJoZWFkZXIgKilidWY7CisJaWYgKGluZm8tPmRxaV9mcmVlX2VudHJ5KSB7CisJCWJsayA9IGluZm8tPmRxaV9mcmVlX2VudHJ5OworCQkqZXJyID0gcmVhZF9ibGsoaW5mbywgYmxrLCBidWYpOworCQlpZiAoKmVyciA8IDApCisJCQlnb3RvIG91dF9idWY7CisJfSBlbHNlIHsKKwkJYmxrID0gZ2V0X2ZyZWVfZHFibGsoaW5mbyk7CisJCWlmICgoaW50KWJsayA8IDApIHsKKwkJCSplcnIgPSBibGs7CisJCQlmcmVlZHFidWYoYnVmKTsKKwkJCXJldHVybiAwOworCQl9CisJCW1lbXNldChidWYsIDAsIGluZm8tPmRxaV91c2FibGVfYnMpOworCQkvKiBUaGlzIGlzIGVub3VnaCBhcyBibG9jayBpcyBhbHJlYWR5IHplcm9lZCBhbmQgZW50cnkgbGlzdCBpcyBlbXB0eS4uLiAqLworCQlpbmZvLT5kcWlfZnJlZV9lbnRyeSA9IGJsazsKKwkJbWFya19pbmZvX2RpcnR5KGRxdW90LT5kcV9zYiwgZHF1b3QtPmRxX3R5cGUpOworCX0KKwkvKiBCbG9jayB3aWxsIGJlIGZ1bGw/ICovCisJaWYgKGxlMTZfdG9fY3B1KGRoLT5kcWRoX2VudHJpZXMpICsgMSA+PSBxdHJlZV9kcXN0cl9pbl9ibGsoaW5mbykpIHsKKwkJKmVyciA9IHJlbW92ZV9mcmVlX2RxZW50cnkoaW5mbywgYnVmLCBibGspOworCQlpZiAoKmVyciA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBmaW5kX2ZyZWVfZHFlbnRyeSgpOiBDYW4ndCAiCisJCQkgICAgICAgInJlbW92ZSBibG9jayAoJXUpIGZyb20gZW50cnkgZnJlZSBsaXN0LlxuIiwKKwkJCSAgICAgICBibGspOworCQkJZ290byBvdXRfYnVmOworCQl9CisJfQorCWxlMTZfYWRkX2NwdSgmZGgtPmRxZGhfZW50cmllcywgMSk7CisJLyogRmluZCBmcmVlIHN0cnVjdHVyZSBpbiBibG9jayAqLworCWZvciAoaSA9IDAsIGRkcXVvdCA9ICgoY2hhciAqKWJ1ZikgKyBzaXplb2Yoc3RydWN0IHF0X2Rpc2tfZHFkYmhlYWRlcik7CisJICAgICBpIDwgcXRyZWVfZHFzdHJfaW5fYmxrKGluZm8pICYmICFxdHJlZV9lbnRyeV91bnVzZWQoaW5mbywgZGRxdW90KTsKKwkgICAgIGkrKywgZGRxdW90ICs9IGluZm8tPmRxaV9lbnRyeV9zaXplKTsKKyNpZmRlZiBfX1FVT1RBX1FUX1BBUkFOT0lBCisJaWYgKGkgPT0gcXRyZWVfZHFzdHJfaW5fYmxrKGluZm8pKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBmaW5kX2ZyZWVfZHFlbnRyeSgpOiBEYXRhIGJsb2NrIGZ1bGwgIgorCQkJCSJidXQgaXQgc2hvdWxkbid0LlxuIik7CisJCSplcnIgPSAtRUlPOworCQlnb3RvIG91dF9idWY7CisJfQorI2VuZGlmCisJKmVyciA9IHdyaXRlX2JsayhpbmZvLCBibGssIGJ1Zik7CisJaWYgKCplcnIgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBmaW5kX2ZyZWVfZHFlbnRyeSgpOiBDYW4ndCB3cml0ZSBxdW90YSAiCisJCQkJImRhdGEgYmxvY2sgJXUuXG4iLCBibGspOworCQlnb3RvIG91dF9idWY7CisJfQorCWRxdW90LT5kcV9vZmYgPSAoYmxrIDw8IGluZm8tPmRxaV9ibG9ja3NpemVfYml0cykgKworCQkJc2l6ZW9mKHN0cnVjdCBxdF9kaXNrX2RxZGJoZWFkZXIpICsKKwkJCWkgKiBpbmZvLT5kcWlfZW50cnlfc2l6ZTsKKwlmcmVlZHFidWYoYnVmKTsKKwlyZXR1cm4gYmxrOworb3V0X2J1ZjoKKwlmcmVlZHFidWYoYnVmKTsKKwlyZXR1cm4gMDsKK30KKworLyogSW5zZXJ0IHJlZmVyZW5jZSB0byBzdHJ1Y3R1cmUgaW50byB0aGUgdHJpZSAqLworc3RhdGljIGludCBkb19pbnNlcnRfdHJlZShzdHJ1Y3QgcXRyZWVfbWVtX2RxaW5mbyAqaW5mbywgc3RydWN0IGRxdW90ICpkcXVvdCwKKwkJCSAgdWludCAqdHJlZWJsaywgaW50IGRlcHRoKQoreworCWRxYnVmX3QgYnVmID0gZ2V0ZHFidWYoaW5mby0+ZHFpX3VzYWJsZV9icyk7CisJaW50IHJldCA9IDAsIG5ld3NvbiA9IDAsIG5ld2FjdCA9IDA7CisJX19sZTMyICpyZWY7CisJdWludCBuZXdibGs7CisKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKCEqdHJlZWJsaykgeworCQlyZXQgPSBnZXRfZnJlZV9kcWJsayhpbmZvKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dF9idWY7CisJCSp0cmVlYmxrID0gcmV0OworCQltZW1zZXQoYnVmLCAwLCBpbmZvLT5kcWlfdXNhYmxlX2JzKTsKKwkJbmV3YWN0ID0gMTsKKwl9IGVsc2UgeworCQlyZXQgPSByZWFkX2JsayhpbmZvLCAqdHJlZWJsaywgYnVmKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBDYW4ndCByZWFkIHRyZWUgcXVvdGEgYmxvY2sgIgorCQkJCQkiJXUuXG4iLCAqdHJlZWJsayk7CisJCQlnb3RvIG91dF9idWY7CisJCX0KKwl9CisJcmVmID0gKF9fbGUzMiAqKWJ1ZjsKKwluZXdibGsgPSBsZTMyX3RvX2NwdShyZWZbZ2V0X2luZGV4KGluZm8sIGRxdW90LT5kcV9pZCwgZGVwdGgpXSk7CisJaWYgKCFuZXdibGspCisJCW5ld3NvbiA9IDE7CisJaWYgKGRlcHRoID09IGluZm8tPmRxaV9xdHJlZV9kZXB0aCAtIDEpIHsKKyNpZmRlZiBfX1FVT1RBX1FUX1BBUkFOT0lBCisJCWlmIChuZXdibGspIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBJbnNlcnRpbmcgYWxyZWFkeSBwcmVzZW50IHF1b3RhICIKKwkJCQkJImVudHJ5IChibG9jayAldSkuXG4iLAorCQkJICAgICAgIGxlMzJfdG9fY3B1KHJlZltnZXRfaW5kZXgoaW5mbywKKwkJCQkJCWRxdW90LT5kcV9pZCwgZGVwdGgpXSkpOworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gb3V0X2J1ZjsKKwkJfQorI2VuZGlmCisJCW5ld2JsayA9IGZpbmRfZnJlZV9kcWVudHJ5KGluZm8sIGRxdW90LCAmcmV0KTsKKwl9IGVsc2UgeworCQlyZXQgPSBkb19pbnNlcnRfdHJlZShpbmZvLCBkcXVvdCwgJm5ld2JsaywgZGVwdGgrMSk7CisJfQorCWlmIChuZXdzb24gJiYgcmV0ID49IDApIHsKKwkJcmVmW2dldF9pbmRleChpbmZvLCBkcXVvdC0+ZHFfaWQsIGRlcHRoKV0gPQorCQkJCQkJCWNwdV90b19sZTMyKG5ld2Jsayk7CisJCXJldCA9IHdyaXRlX2JsayhpbmZvLCAqdHJlZWJsaywgYnVmKTsKKwl9IGVsc2UgaWYgKG5ld2FjdCAmJiByZXQgPCAwKSB7CisJCXB1dF9mcmVlX2RxYmxrKGluZm8sIGJ1ZiwgKnRyZWVibGspOworCX0KK291dF9idWY6CisJZnJlZWRxYnVmKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworLyogV3JhcHBlciBmb3IgaW5zZXJ0aW5nIHF1b3RhIHN0cnVjdHVyZSBpbnRvIHRyZWUgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGRxX2luc2VydF90cmVlKHN0cnVjdCBxdHJlZV9tZW1fZHFpbmZvICppbmZvLAorCQkJCSBzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCWludCB0bXAgPSBRVF9UUkVFT0ZGOworCXJldHVybiBkb19pbnNlcnRfdHJlZShpbmZvLCBkcXVvdCwgJnRtcCwgMCk7Cit9CisKKy8qCisgKglXZSBkb24ndCBoYXZlIHRvIGJlIGFmcmFpZCBvZiBkZWFkbG9ja3MgYXMgd2UgbmV2ZXIgaGF2ZSBxdW90YXMgb24gcXVvdGEgZmlsZXMuLi4KKyAqLworaW50IHF0cmVlX3dyaXRlX2RxdW90KHN0cnVjdCBxdHJlZV9tZW1fZHFpbmZvICppbmZvLCBzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCWludCB0eXBlID0gZHF1b3QtPmRxX3R5cGU7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRxdW90LT5kcV9zYjsKKwlzc2l6ZV90IHJldDsKKwlkcWJ1Zl90IGRkcXVvdCA9IGdldGRxYnVmKGluZm8tPmRxaV9lbnRyeV9zaXplKTsKKworCWlmICghZGRxdW90KQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIGRxX29mZiBpcyBndWFyZGVkIGJ5IGRxaW9fbXV0ZXggKi8KKwlpZiAoIWRxdW90LT5kcV9vZmYpIHsKKwkJcmV0ID0gZHFfaW5zZXJ0X3RyZWUoaW5mbywgZHF1b3QpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IEVycm9yICV6ZCBvY2N1cnJlZCB3aGlsZSAiCisJCQkJCSJjcmVhdGluZyBxdW90YS5cbiIsIHJldCk7CisJCQlmcmVlZHFidWYoZGRxdW90KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisJc3Bpbl9sb2NrKCZkcV9kYXRhX2xvY2spOworCWluZm8tPmRxaV9vcHMtPm1lbTJkaXNrX2RxYmxrKGRkcXVvdCwgZHF1b3QpOworCXNwaW5fdW5sb2NrKCZkcV9kYXRhX2xvY2spOworCXJldCA9IHNiLT5zX29wLT5xdW90YV93cml0ZShzYiwgdHlwZSwgKGNoYXIgKilkZHF1b3QsCisJCQkJCWluZm8tPmRxaV9lbnRyeV9zaXplLCBkcXVvdC0+ZHFfb2ZmKTsKKwlpZiAocmV0ICE9IGluZm8tPmRxaV9lbnRyeV9zaXplKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlZGUzogZHF1b3RhIHdyaXRlIGZhaWxlZCBvbiBkZXYgJXNcbiIsCisJCSAgICAgICBzYi0+c19pZCk7CisJCWlmIChyZXQgPj0gMCkKKwkJCXJldCA9IC1FTk9TUEM7CisJfSBlbHNlIHsKKwkJcmV0ID0gMDsKKwl9CisJZHFzdGF0cy53cml0ZXMrKzsKKwlmcmVlZHFidWYoZGRxdW90KTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHF0cmVlX3dyaXRlX2RxdW90KTsKKworLyogRnJlZSBkcXVvdCBlbnRyeSBpbiBkYXRhIGJsb2NrICovCitzdGF0aWMgaW50IGZyZWVfZHFlbnRyeShzdHJ1Y3QgcXRyZWVfbWVtX2RxaW5mbyAqaW5mbywgc3RydWN0IGRxdW90ICpkcXVvdCwKKwkJCXVpbnQgYmxrKQoreworCXN0cnVjdCBxdF9kaXNrX2RxZGJoZWFkZXIgKmRoOworCWRxYnVmX3QgYnVmID0gZ2V0ZHFidWYoaW5mby0+ZHFpX3VzYWJsZV9icyk7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKGRxdW90LT5kcV9vZmYgPj4gaW5mby0+ZHFpX2Jsb2Nrc2l6ZV9iaXRzICE9IGJsaykgeworCQlwcmludGsoS0VSTl9FUlIgIlZGUzogUXVvdGEgc3RydWN0dXJlIGhhcyBvZmZzZXQgdG8gb3RoZXIgIgorCQkgICJibG9jayAoJXUpIHRoYW4gaXQgc2hvdWxkICgldSkuXG4iLCBibGssCisJCSAgKHVpbnQpKGRxdW90LT5kcV9vZmYgPj4gaW5mby0+ZHFpX2Jsb2Nrc2l6ZV9iaXRzKSk7CisJCWdvdG8gb3V0X2J1ZjsKKwl9CisJcmV0ID0gcmVhZF9ibGsoaW5mbywgYmxrLCBidWYpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBDYW4ndCByZWFkIHF1b3RhIGRhdGEgYmxvY2sgJXVcbiIsIGJsayk7CisJCWdvdG8gb3V0X2J1ZjsKKwl9CisJZGggPSAoc3RydWN0IHF0X2Rpc2tfZHFkYmhlYWRlciAqKWJ1ZjsKKwlsZTE2X2FkZF9jcHUoJmRoLT5kcWRoX2VudHJpZXMsIC0xKTsKKwlpZiAoIWxlMTZfdG9fY3B1KGRoLT5kcWRoX2VudHJpZXMpKSB7CS8qIEJsb2NrIGdvdCBmcmVlPyAqLworCQlyZXQgPSByZW1vdmVfZnJlZV9kcWVudHJ5KGluZm8sIGJ1ZiwgYmxrKTsKKwkJaWYgKHJldCA+PSAwKQorCQkJcmV0ID0gcHV0X2ZyZWVfZHFibGsoaW5mbywgYnVmLCBibGspOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IENhbid0IG1vdmUgcXVvdGEgZGF0YSBibG9jayAoJXUpICIKKwkJCSAgInRvIGZyZWUgbGlzdC5cbiIsIGJsayk7CisJCQlnb3RvIG91dF9idWY7CisJCX0KKwl9IGVsc2UgeworCQltZW1zZXQoYnVmICsKKwkJICAgICAgIChkcXVvdC0+ZHFfb2ZmICYgKCgxIDw8IGluZm8tPmRxaV9ibG9ja3NpemVfYml0cykgLSAxKSksCisJCSAgICAgICAwLCBpbmZvLT5kcWlfZW50cnlfc2l6ZSk7CisJCWlmIChsZTE2X3RvX2NwdShkaC0+ZHFkaF9lbnRyaWVzKSA9PQorCQkgICAgcXRyZWVfZHFzdHJfaW5fYmxrKGluZm8pIC0gMSkgeworCQkJLyogSW5zZXJ0IHdpbGwgd3JpdGUgYmxvY2sgaXRzZWxmICovCisJCQlyZXQgPSBpbnNlcnRfZnJlZV9kcWVudHJ5KGluZm8sIGJ1ZiwgYmxrKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IENhbid0IGluc2VydCBxdW90YSBkYXRhICIKKwkJCQkgICAgICAgImJsb2NrICgldSkgdG8gZnJlZSBlbnRyeSBsaXN0LlxuIiwgYmxrKTsKKwkJCQlnb3RvIG91dF9idWY7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXQgPSB3cml0ZV9ibGsoaW5mbywgYmxrLCBidWYpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIlZGUzogQ2FuJ3Qgd3JpdGUgcXVvdGEgZGF0YSAiCisJCQkJICAiYmxvY2sgJXVcbiIsIGJsayk7CisJCQkJZ290byBvdXRfYnVmOworCQkJfQorCQl9CisJfQorCWRxdW90LT5kcV9vZmYgPSAwOwkvKiBRdW90YSBpcyBub3cgdW5hdHRhY2hlZCAqLworb3V0X2J1ZjoKKwlmcmVlZHFidWYoYnVmKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBSZW1vdmUgcmVmZXJlbmNlIHRvIGRxdW90IGZyb20gdHJlZSAqLworc3RhdGljIGludCByZW1vdmVfdHJlZShzdHJ1Y3QgcXRyZWVfbWVtX2RxaW5mbyAqaW5mbywgc3RydWN0IGRxdW90ICpkcXVvdCwKKwkJICAgICAgIHVpbnQgKmJsaywgaW50IGRlcHRoKQoreworCWRxYnVmX3QgYnVmID0gZ2V0ZHFidWYoaW5mby0+ZHFpX3VzYWJsZV9icyk7CisJaW50IHJldCA9IDA7CisJdWludCBuZXdibGs7CisJX19sZTMyICpyZWYgPSAoX19sZTMyICopYnVmOworCisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOworCXJldCA9IHJlYWRfYmxrKGluZm8sICpibGssIGJ1Zik7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IENhbid0IHJlYWQgcXVvdGEgZGF0YSBibG9jayAldVxuIiwgKmJsayk7CisJCWdvdG8gb3V0X2J1ZjsKKwl9CisJbmV3YmxrID0gbGUzMl90b19jcHUocmVmW2dldF9pbmRleChpbmZvLCBkcXVvdC0+ZHFfaWQsIGRlcHRoKV0pOworCWlmIChkZXB0aCA9PSBpbmZvLT5kcWlfcXRyZWVfZGVwdGggLSAxKSB7CisJCXJldCA9IGZyZWVfZHFlbnRyeShpbmZvLCBkcXVvdCwgbmV3YmxrKTsKKwkJbmV3YmxrID0gMDsKKwl9IGVsc2UgeworCQlyZXQgPSByZW1vdmVfdHJlZShpbmZvLCBkcXVvdCwgJm5ld2JsaywgZGVwdGgrMSk7CisJfQorCWlmIChyZXQgPj0gMCAmJiAhbmV3YmxrKSB7CisJCWludCBpOworCQlyZWZbZ2V0X2luZGV4KGluZm8sIGRxdW90LT5kcV9pZCwgZGVwdGgpXSA9IGNwdV90b19sZTMyKDApOworCQkvKiBCbG9jayBnb3QgZW1wdHk/ICovCisJCWZvciAoaSA9IDA7CisJCSAgICAgaSA8IChpbmZvLT5kcWlfdXNhYmxlX2JzID4+IDIpICYmICFyZWZbaV07CisJCSAgICAgaSsrKTsKKwkJLyogRG9uJ3QgcHV0IHRoZSByb290IGJsb2NrIGludG8gdGhlIGZyZWUgYmxvY2sgbGlzdCAqLworCQlpZiAoaSA9PSAoaW5mby0+ZHFpX3VzYWJsZV9icyA+PiAyKQorCQkgICAgJiYgKmJsayAhPSBRVF9UUkVFT0ZGKSB7CisJCQlwdXRfZnJlZV9kcWJsayhpbmZvLCBidWYsICpibGspOworCQkJKmJsayA9IDA7CisJCX0gZWxzZSB7CisJCQlyZXQgPSB3cml0ZV9ibGsoaW5mbywgKmJsaywgYnVmKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBDYW4ndCB3cml0ZSBxdW90YSB0cmVlICIKKwkJCQkgICJibG9jayAldS5cbiIsICpibGspOworCQl9CisJfQorb3V0X2J1ZjoKKwlmcmVlZHFidWYoYnVmKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBEZWxldGUgZHF1b3QgZnJvbSB0cmVlICovCitpbnQgcXRyZWVfZGVsZXRlX2RxdW90KHN0cnVjdCBxdHJlZV9tZW1fZHFpbmZvICppbmZvLCBzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCXVpbnQgdG1wID0gUVRfVFJFRU9GRjsKKworCWlmICghZHF1b3QtPmRxX29mZikJLyogRXZlbiBub3QgYWxsb2NhdGVkPyAqLworCQlyZXR1cm4gMDsKKwlyZXR1cm4gcmVtb3ZlX3RyZWUoaW5mbywgZHF1b3QsICZ0bXAsIDApOworfQorRVhQT1JUX1NZTUJPTChxdHJlZV9kZWxldGVfZHF1b3QpOworCisvKiBGaW5kIGVudHJ5IGluIGJsb2NrICovCitzdGF0aWMgbG9mZl90IGZpbmRfYmxvY2tfZHFlbnRyeShzdHJ1Y3QgcXRyZWVfbWVtX2RxaW5mbyAqaW5mbywKKwkJCQkgc3RydWN0IGRxdW90ICpkcXVvdCwgdWludCBibGspCit7CisJZHFidWZfdCBidWYgPSBnZXRkcWJ1ZihpbmZvLT5kcWlfdXNhYmxlX2JzKTsKKwlsb2ZmX3QgcmV0ID0gMDsKKwlpbnQgaTsKKwljaGFyICpkZHF1b3Q7CisKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0ID0gcmVhZF9ibGsoaW5mbywgYmxrLCBidWYpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBDYW4ndCByZWFkIHF1b3RhIHRyZWUgYmxvY2sgJXUuXG4iLCBibGspOworCQlnb3RvIG91dF9idWY7CisJfQorCWZvciAoaSA9IDAsIGRkcXVvdCA9ICgoY2hhciAqKWJ1ZikgKyBzaXplb2Yoc3RydWN0IHF0X2Rpc2tfZHFkYmhlYWRlcik7CisJICAgICBpIDwgcXRyZWVfZHFzdHJfaW5fYmxrKGluZm8pICYmICFpbmZvLT5kcWlfb3BzLT5pc19pZChkZHF1b3QsIGRxdW90KTsKKwkgICAgIGkrKywgZGRxdW90ICs9IGluZm8tPmRxaV9lbnRyeV9zaXplKTsKKwlpZiAoaSA9PSBxdHJlZV9kcXN0cl9pbl9ibGsoaW5mbykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IFF1b3RhIGZvciBpZCAldSByZWZlcmVuY2VkICIKKwkJICAiYnV0IG5vdCBwcmVzZW50LlxuIiwgZHF1b3QtPmRxX2lkKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBvdXRfYnVmOworCX0gZWxzZSB7CisJCXJldCA9IChibGsgPDwgaW5mby0+ZHFpX2Jsb2Nrc2l6ZV9iaXRzKSArIHNpemVvZihzdHJ1Y3QKKwkJICBxdF9kaXNrX2RxZGJoZWFkZXIpICsgaSAqIGluZm8tPmRxaV9lbnRyeV9zaXplOworCX0KK291dF9idWY6CisJZnJlZWRxYnVmKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworLyogRmluZCBlbnRyeSBmb3IgZ2l2ZW4gaWQgaW4gdGhlIHRyZWUgKi8KK3N0YXRpYyBsb2ZmX3QgZmluZF90cmVlX2RxZW50cnkoc3RydWN0IHF0cmVlX21lbV9kcWluZm8gKmluZm8sCisJCQkJc3RydWN0IGRxdW90ICpkcXVvdCwgdWludCBibGssIGludCBkZXB0aCkKK3sKKwlkcWJ1Zl90IGJ1ZiA9IGdldGRxYnVmKGluZm8tPmRxaV91c2FibGVfYnMpOworCWxvZmZfdCByZXQgPSAwOworCV9fbGUzMiAqcmVmID0gKF9fbGUzMiAqKWJ1ZjsKKworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXQgPSByZWFkX2JsayhpbmZvLCBibGssIGJ1Zik7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IENhbid0IHJlYWQgcXVvdGEgdHJlZSBibG9jayAldS5cbiIsIGJsayk7CisJCWdvdG8gb3V0X2J1ZjsKKwl9CisJcmV0ID0gMDsKKwlibGsgPSBsZTMyX3RvX2NwdShyZWZbZ2V0X2luZGV4KGluZm8sIGRxdW90LT5kcV9pZCwgZGVwdGgpXSk7CisJaWYgKCFibGspCS8qIE5vIHJlZmVyZW5jZT8gKi8KKwkJZ290byBvdXRfYnVmOworCWlmIChkZXB0aCA8IGluZm8tPmRxaV9xdHJlZV9kZXB0aCAtIDEpCisJCXJldCA9IGZpbmRfdHJlZV9kcWVudHJ5KGluZm8sIGRxdW90LCBibGssIGRlcHRoKzEpOworCWVsc2UKKwkJcmV0ID0gZmluZF9ibG9ja19kcWVudHJ5KGluZm8sIGRxdW90LCBibGspOworb3V0X2J1ZjoKKwlmcmVlZHFidWYoYnVmKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBGaW5kIGVudHJ5IGZvciBnaXZlbiBpZCBpbiB0aGUgdHJlZSAtIHdyYXBwZXIgZnVuY3Rpb24gKi8KK3N0YXRpYyBpbmxpbmUgbG9mZl90IGZpbmRfZHFlbnRyeShzdHJ1Y3QgcXRyZWVfbWVtX2RxaW5mbyAqaW5mbywKKwkJCQkgIHN0cnVjdCBkcXVvdCAqZHF1b3QpCit7CisJcmV0dXJuIGZpbmRfdHJlZV9kcWVudHJ5KGluZm8sIGRxdW90LCBRVF9UUkVFT0ZGLCAwKTsKK30KKworaW50IHF0cmVlX3JlYWRfZHF1b3Qoc3RydWN0IHF0cmVlX21lbV9kcWluZm8gKmluZm8sIHN0cnVjdCBkcXVvdCAqZHF1b3QpCit7CisJaW50IHR5cGUgPSBkcXVvdC0+ZHFfdHlwZTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZHF1b3QtPmRxX3NiOworCWxvZmZfdCBvZmZzZXQ7CisJZHFidWZfdCBkZHF1b3Q7CisJaW50IHJldCA9IDA7CisKKyNpZmRlZiBfX1FVT1RBX1FUX1BBUkFOT0lBCisJLyogSW52YWxpZGF0ZWQgcXVvdGE/ICovCisJaWYgKCFzYl9kcW9wdChkcXVvdC0+ZHFfc2IpLT5maWxlc1t0eXBlXSkgeworCQlwcmludGsoS0VSTl9FUlIgIlZGUzogUXVvdGEgaW52YWxpZGF0ZWQgd2hpbGUgcmVhZGluZyFcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisjZW5kaWYKKwkvKiBEbyB3ZSBrbm93IG9mZnNldCBvZiB0aGUgZHF1b3QgZW50cnkgaW4gdGhlIHF1b3RhIGZpbGU/ICovCisJaWYgKCFkcXVvdC0+ZHFfb2ZmKSB7CisJCW9mZnNldCA9IGZpbmRfZHFlbnRyeShpbmZvLCBkcXVvdCk7CisJCWlmIChvZmZzZXQgPD0gMCkgewkvKiBFbnRyeSBub3QgcHJlc2VudD8gKi8KKwkJCWlmIChvZmZzZXQgPCAwKQorCQkJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBDYW4ndCByZWFkIHF1b3RhICIKKwkJCQkgICJzdHJ1Y3R1cmUgZm9yIGlkICV1LlxuIiwgZHF1b3QtPmRxX2lkKTsKKwkJCWRxdW90LT5kcV9vZmYgPSAwOworCQkJc2V0X2JpdChEUV9GQUtFX0IsICZkcXVvdC0+ZHFfZmxhZ3MpOworCQkJbWVtc2V0KCZkcXVvdC0+ZHFfZHFiLCAwLCBzaXplb2Yoc3RydWN0IG1lbV9kcWJsaykpOworCQkJcmV0ID0gb2Zmc2V0OworCQkJZ290byBvdXQ7CisJCX0KKwkJZHF1b3QtPmRxX29mZiA9IG9mZnNldDsKKwl9CisJZGRxdW90ID0gZ2V0ZHFidWYoaW5mby0+ZHFpX2VudHJ5X3NpemUpOworCWlmICghZGRxdW90KQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXQgPSBzYi0+c19vcC0+cXVvdGFfcmVhZChzYiwgdHlwZSwgKGNoYXIgKilkZHF1b3QsCisJCQkJICAgaW5mby0+ZHFpX2VudHJ5X3NpemUsIGRxdW90LT5kcV9vZmYpOworCWlmIChyZXQgIT0gaW5mby0+ZHFpX2VudHJ5X3NpemUpIHsKKwkJaWYgKHJldCA+PSAwKQorCQkJcmV0ID0gLUVJTzsKKwkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IEVycm9yIHdoaWxlIHJlYWRpbmcgcXVvdGEgIgorCQkJCSJzdHJ1Y3R1cmUgZm9yIGlkICV1LlxuIiwgZHF1b3QtPmRxX2lkKTsKKwkJc2V0X2JpdChEUV9GQUtFX0IsICZkcXVvdC0+ZHFfZmxhZ3MpOworCQltZW1zZXQoJmRxdW90LT5kcV9kcWIsIDAsIHNpemVvZihzdHJ1Y3QgbWVtX2RxYmxrKSk7CisJCWZyZWVkcWJ1ZihkZHF1b3QpOworCQlnb3RvIG91dDsKKwl9CisJc3Bpbl9sb2NrKCZkcV9kYXRhX2xvY2spOworCWluZm8tPmRxaV9vcHMtPmRpc2sybWVtX2RxYmxrKGRxdW90LCBkZHF1b3QpOworCWlmICghZHF1b3QtPmRxX2RxYi5kcWJfYmhhcmRsaW1pdCAmJgorCSAgICAhZHF1b3QtPmRxX2RxYi5kcWJfYnNvZnRsaW1pdCAmJgorCSAgICAhZHF1b3QtPmRxX2RxYi5kcWJfaWhhcmRsaW1pdCAmJgorCSAgICAhZHF1b3QtPmRxX2RxYi5kcWJfaXNvZnRsaW1pdCkKKwkJc2V0X2JpdChEUV9GQUtFX0IsICZkcXVvdC0+ZHFfZmxhZ3MpOworCXNwaW5fdW5sb2NrKCZkcV9kYXRhX2xvY2spOworCWZyZWVkcWJ1ZihkZHF1b3QpOworb3V0OgorCWRxc3RhdHMucmVhZHMrKzsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChxdHJlZV9yZWFkX2RxdW90KTsKKworLyogQ2hlY2sgd2hldGhlciBkcXVvdCBzaG91bGQgbm90IGJlIGRlbGV0ZWQuIFdlIGtub3cgd2UgYXJlCisgKiB0aGUgb25seSBvbmUgb3BlcmF0aW5nIG9uIGRxdW90ICh0aGFua3MgdG8gZHFfbG9jaykgKi8KK2ludCBxdHJlZV9yZWxlYXNlX2RxdW90KHN0cnVjdCBxdHJlZV9tZW1fZHFpbmZvICppbmZvLCBzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCWlmICh0ZXN0X2JpdChEUV9GQUtFX0IsICZkcXVvdC0+ZHFfZmxhZ3MpICYmICEoZHF1b3QtPmRxX2RxYi5kcWJfY3VyaW5vZGVzIHwgZHF1b3QtPmRxX2RxYi5kcWJfY3Vyc3BhY2UpKQorCQlyZXR1cm4gcXRyZWVfZGVsZXRlX2RxdW90KGluZm8sIGRxdW90KTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wocXRyZWVfcmVsZWFzZV9kcXVvdCk7CmRpZmYgLS1naXQgYS9mcy9xdW90YV90cmVlLmggYi9mcy9xdW90YV90cmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFhYjhkYgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3F1b3RhX3RyZWUuaApAQCAtMCwwICsxLDI1IEBACisvKgorICoJRGVmaW5pdGlvbnMgb2Ygc3RydWN0dXJlcyBmb3IgdmZzdjAgcXVvdGEgZm9ybWF0CisgKi8KKworI2lmbmRlZiBfTElOVVhfUVVPVEFfVFJFRV9ICisjZGVmaW5lIF9MSU5VWF9RVU9UQV9UUkVFX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGEuaD4KKworLyoKKyAqICBTdHJ1Y3R1cmUgb2YgaGVhZGVyIG9mIGJsb2NrIHdpdGggcXVvdGEgc3RydWN0dXJlcy4gSXQgaXMgcGFkZGVkIHRvIDE2IGJ5dGVzIHNvCisgKiAgdGhlcmUgd2lsbCBiZSBzcGFjZSBmb3IgZXhhY3RseSAyMSBxdW90YS1lbnRyaWVzIGluIGEgYmxvY2sKKyAqLworc3RydWN0IHF0X2Rpc2tfZHFkYmhlYWRlciB7CisJX19sZTMyIGRxZGhfbmV4dF9mcmVlOwkvKiBOdW1iZXIgb2YgbmV4dCBibG9jayB3aXRoIGZyZWUgZW50cnkgKi8KKwlfX2xlMzIgZHFkaF9wcmV2X2ZyZWU7CS8qIE51bWJlciBvZiBwcmV2aW91cyBibG9jayB3aXRoIGZyZWUgZW50cnkgKi8KKwlfX2xlMTYgZHFkaF9lbnRyaWVzOwkvKiBOdW1iZXIgb2YgdmFsaWQgZW50cmllcyBpbiBibG9jayAqLworCV9fbGUxNiBkcWRoX3BhZDE7CisJX19sZTMyIGRxZGhfcGFkMjsKK307CisKKyNkZWZpbmUgUVRfVFJFRU9GRgkxCQkvKiBPZmZzZXQgb2YgdHJlZSBpbiBmaWxlIGluIGJsb2NrcyAqLworCisjZW5kaWYgLyogX0xJTlVYX1FVT1RBSU9fVFJFRV9IICovCmRpZmYgLS1naXQgYS9mcy9xdW90YV92MS5jIGIvZnMvcXVvdGFfdjEuYwppbmRleCA1YWUxNWIxLi5iNGFmMWM2IDEwMDY0NAotLS0gYS9mcy9xdW90YV92MS5jCisrKyBiL2ZzL3F1b3RhX3YxLmMKQEAgLTMsMjUgKzMsMzkgQEAKICNpbmNsdWRlIDxsaW51eC9xdW90YS5oPgogI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvZHFibGtfdjEuaD4KLSNpbmNsdWRlIDxsaW51eC9xdW90YWlvX3YxLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogCisjaW5jbHVkZSAicXVvdGFpb192MS5oIgorCiBNT0RVTEVfQVVUSE9SKCJKYW4gS2FyYSIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJPbGQgcXVvdGEgZm9ybWF0IHN1cHBvcnQiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAorI2RlZmluZSBRVU9UQUJMT0NLX0JJVFMgMTAKKyNkZWZpbmUgUVVPVEFCTE9DS19TSVpFICgxIDw8IFFVT1RBQkxPQ0tfQklUUykKKworc3RhdGljIGlubGluZSBxc2l6ZV90IHYxX3N0b3FiKHFzaXplX3Qgc3BhY2UpCit7CisJcmV0dXJuIChzcGFjZSArIFFVT1RBQkxPQ0tfU0laRSAtIDEpID4+IFFVT1RBQkxPQ0tfQklUUzsKK30KKworc3RhdGljIGlubGluZSBxc2l6ZV90IHYxX3FidG9zKHFzaXplX3QgYmxvY2tzKQoreworCXJldHVybiBibG9ja3MgPDwgUVVPVEFCTE9DS19CSVRTOworfQorCiBzdGF0aWMgdm9pZCB2MV9kaXNrMm1lbV9kcWJsayhzdHJ1Y3QgbWVtX2RxYmxrICptLCBzdHJ1Y3QgdjFfZGlza19kcWJsayAqZCkKIHsKIAltLT5kcWJfaWhhcmRsaW1pdCA9IGQtPmRxYl9paGFyZGxpbWl0OwogCW0tPmRxYl9pc29mdGxpbWl0ID0gZC0+ZHFiX2lzb2Z0bGltaXQ7CiAJbS0+ZHFiX2N1cmlub2RlcyA9IGQtPmRxYl9jdXJpbm9kZXM7Ci0JbS0+ZHFiX2JoYXJkbGltaXQgPSBkLT5kcWJfYmhhcmRsaW1pdDsKLQltLT5kcWJfYnNvZnRsaW1pdCA9IGQtPmRxYl9ic29mdGxpbWl0OwotCW0tPmRxYl9jdXJzcGFjZSA9ICgocXNpemVfdClkLT5kcWJfY3VyYmxvY2tzKSA8PCBRVU9UQUJMT0NLX0JJVFM7CisJbS0+ZHFiX2JoYXJkbGltaXQgPSB2MV9xYnRvcyhkLT5kcWJfYmhhcmRsaW1pdCk7CisJbS0+ZHFiX2Jzb2Z0bGltaXQgPSB2MV9xYnRvcyhkLT5kcWJfYnNvZnRsaW1pdCk7CisJbS0+ZHFiX2N1cnNwYWNlID0gdjFfcWJ0b3MoZC0+ZHFiX2N1cmJsb2Nrcyk7CiAJbS0+ZHFiX2l0aW1lID0gZC0+ZHFiX2l0aW1lOwogCW0tPmRxYl9idGltZSA9IGQtPmRxYl9idGltZTsKIH0KQEAgLTMxLDkgKzQ1LDkgQEAKIAlkLT5kcWJfaWhhcmRsaW1pdCA9IG0tPmRxYl9paGFyZGxpbWl0OwogCWQtPmRxYl9pc29mdGxpbWl0ID0gbS0+ZHFiX2lzb2Z0bGltaXQ7CiAJZC0+ZHFiX2N1cmlub2RlcyA9IG0tPmRxYl9jdXJpbm9kZXM7Ci0JZC0+ZHFiX2JoYXJkbGltaXQgPSBtLT5kcWJfYmhhcmRsaW1pdDsKLQlkLT5kcWJfYnNvZnRsaW1pdCA9IG0tPmRxYl9ic29mdGxpbWl0OwotCWQtPmRxYl9jdXJibG9ja3MgPSB0b3FiKG0tPmRxYl9jdXJzcGFjZSk7CisJZC0+ZHFiX2JoYXJkbGltaXQgPSB2MV9zdG9xYihtLT5kcWJfYmhhcmRsaW1pdCk7CisJZC0+ZHFiX2Jzb2Z0bGltaXQgPSB2MV9zdG9xYihtLT5kcWJfYnNvZnRsaW1pdCk7CisJZC0+ZHFiX2N1cmJsb2NrcyA9IHYxX3N0b3FiKG0tPmRxYl9jdXJzcGFjZSk7CiAJZC0+ZHFiX2l0aW1lID0gbS0+ZHFiX2l0aW1lOwogCWQtPmRxYl9idGltZSA9IG0tPmRxYl9idGltZTsKIH0KZGlmZiAtLWdpdCBhL2ZzL3F1b3RhX3YyLmMgYi9mcy9xdW90YV92Mi5jCmluZGV4IGI1MzgyN2QuLmI2MThiNTYgMTAwNjQ0Ci0tLSBhL2ZzL3F1b3RhX3YyLmMKKysrIGIvZnMvcXVvdGFfdjIuYwpAQCAtNiw3ICs2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvZHFibGtfdjIuaD4KLSNpbmNsdWRlIDxsaW51eC9xdW90YWlvX3YyLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMTUsMTYgKzE0LDM3IEBACiAKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKKyNpbmNsdWRlICJxdW90YV90cmVlLmgiCisjaW5jbHVkZSAicXVvdGFpb192Mi5oIgorCiBNT0RVTEVfQVVUSE9SKCJKYW4gS2FyYSIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJRdW90YSBmb3JtYXQgdjIgc3VwcG9ydCIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiAjZGVmaW5lIF9fUVVPVEFfVjJfUEFSQU5PSUEKIAotdHlwZWRlZiBjaGFyICpkcWJ1Zl90Oworc3RhdGljIHZvaWQgdjJfbWVtMmRpc2tkcWIodm9pZCAqZHAsIHN0cnVjdCBkcXVvdCAqZHF1b3QpOworc3RhdGljIHZvaWQgdjJfZGlzazJtZW1kcWIoc3RydWN0IGRxdW90ICpkcXVvdCwgdm9pZCAqZHApOworc3RhdGljIGludCB2Ml9pc19pZCh2b2lkICpkcCwgc3RydWN0IGRxdW90ICpkcXVvdCk7CiAKLSNkZWZpbmUgR0VUSURJTkRFWChpZCwgZGVwdGgpICgoKGlkKSA+PiAoKFYyX0RRVFJFRURFUFRILShkZXB0aCktMSkqOCkpICYgMHhmZikKLSNkZWZpbmUgR0VURU5UUklFUyhidWYpICgoc3RydWN0IHYyX2Rpc2tfZHFibGsgKikoKChjaGFyICopYnVmKStzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFkYmhlYWRlcikpKQorc3RhdGljIHN0cnVjdCBxdHJlZV9mbXRfb3BlcmF0aW9ucyB2Ml9xdHJlZV9vcHMgPSB7CisJLm1lbTJkaXNrX2RxYmxrID0gdjJfbWVtMmRpc2tkcWIsCisJLmRpc2sybWVtX2RxYmxrID0gdjJfZGlzazJtZW1kcWIsCisJLmlzX2lkID0gdjJfaXNfaWQsCit9OworCisjZGVmaW5lIFFVT1RBQkxPQ0tfQklUUyAxMAorI2RlZmluZSBRVU9UQUJMT0NLX1NJWkUgKDEgPDwgUVVPVEFCTE9DS19CSVRTKQorCitzdGF0aWMgaW5saW5lIHFzaXplX3QgdjJfc3RvcWIocXNpemVfdCBzcGFjZSkKK3sKKwlyZXR1cm4gKHNwYWNlICsgUVVPVEFCTE9DS19TSVpFIC0gMSkgPj4gUVVPVEFCTE9DS19CSVRTOworfQorCitzdGF0aWMgaW5saW5lIHFzaXplX3QgdjJfcWJ0b3MocXNpemVfdCBibG9ja3MpCit7CisJcmV0dXJuIGJsb2NrcyA8PCBRVU9UQUJMT0NLX0JJVFM7Cit9CiAKIC8qIENoZWNrIHdoZXRoZXIgZ2l2ZW4gZmlsZSBpcyByZWFsbHkgdmZzdjAgcXVvdGFmaWxlICovCiBzdGF0aWMgaW50IHYyX2NoZWNrX3F1b3RhX2ZpbGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpCkBAIC01MCw3ICs3MCw4IEBACiBzdGF0aWMgaW50IHYyX3JlYWRfZmlsZV9pbmZvKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQogewogCXN0cnVjdCB2Ml9kaXNrX2RxaW5mbyBkaW5mbzsKLQlzdHJ1Y3QgbWVtX2RxaW5mbyAqaW5mbyA9IHNiX2Rxb3B0KHNiKS0+aW5mbyt0eXBlOworCXN0cnVjdCBtZW1fZHFpbmZvICppbmZvID0gc2JfZHFpbmZvKHNiLCB0eXBlKTsKKwlzdHJ1Y3QgcXRyZWVfbWVtX2RxaW5mbyAqcWluZm87CiAJc3NpemVfdCBzaXplOwogCiAJc2l6ZSA9IHNiLT5zX29wLT5xdW90YV9yZWFkKHNiLCB0eXBlLCAoY2hhciAqKSZkaW5mbywKQEAgLTYwLDE1ICs4MSwyOSBAQAogCQkJc2ItPnNfaWQpOwogCQlyZXR1cm4gLTE7CiAJfQorCWluZm8tPmRxaV9wcml2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHF0cmVlX21lbV9kcWluZm8pLCBHRlBfTk9GUyk7CisJaWYgKCFpbmZvLT5kcWlfcHJpdikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiTm90IGVub3VnaCBtZW1vcnkgZm9yIHF1b3RhIGluZm9ybWF0aW9uIHN0cnVjdHVyZS5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXFpbmZvID0gaW5mby0+ZHFpX3ByaXY7CiAJLyogbGltaXRzIGFyZSBzdG9yZWQgYXMgdW5zaWduZWQgMzItYml0IGRhdGEgKi8KIAlpbmZvLT5kcWlfbWF4YmxpbWl0ID0gMHhmZmZmZmZmZjsKIAlpbmZvLT5kcWlfbWF4aWxpbWl0ID0gMHhmZmZmZmZmZjsKIAlpbmZvLT5kcWlfYmdyYWNlID0gbGUzMl90b19jcHUoZGluZm8uZHFpX2JncmFjZSk7CiAJaW5mby0+ZHFpX2lncmFjZSA9IGxlMzJfdG9fY3B1KGRpbmZvLmRxaV9pZ3JhY2UpOwogCWluZm8tPmRxaV9mbGFncyA9IGxlMzJfdG9fY3B1KGRpbmZvLmRxaV9mbGFncyk7Ci0JaW5mby0+dS52Ml9pLmRxaV9ibG9ja3MgPSBsZTMyX3RvX2NwdShkaW5mby5kcWlfYmxvY2tzKTsKLQlpbmZvLT51LnYyX2kuZHFpX2ZyZWVfYmxrID0gbGUzMl90b19jcHUoZGluZm8uZHFpX2ZyZWVfYmxrKTsKLQlpbmZvLT51LnYyX2kuZHFpX2ZyZWVfZW50cnkgPSBsZTMyX3RvX2NwdShkaW5mby5kcWlfZnJlZV9lbnRyeSk7CisJcWluZm8tPmRxaV9zYiA9IHNiOworCXFpbmZvLT5kcWlfdHlwZSA9IHR5cGU7CisJcWluZm8tPmRxaV9ibG9ja3MgPSBsZTMyX3RvX2NwdShkaW5mby5kcWlfYmxvY2tzKTsKKwlxaW5mby0+ZHFpX2ZyZWVfYmxrID0gbGUzMl90b19jcHUoZGluZm8uZHFpX2ZyZWVfYmxrKTsKKwlxaW5mby0+ZHFpX2ZyZWVfZW50cnkgPSBsZTMyX3RvX2NwdShkaW5mby5kcWlfZnJlZV9lbnRyeSk7CisJcWluZm8tPmRxaV9ibG9ja3NpemVfYml0cyA9IFYyX0RRQkxLU0laRV9CSVRTOworCXFpbmZvLT5kcWlfdXNhYmxlX2JzID0gMSA8PCBWMl9EUUJMS1NJWkVfQklUUzsKKwlxaW5mby0+ZHFpX3F0cmVlX2RlcHRoID0gcXRyZWVfZGVwdGgocWluZm8pOworCXFpbmZvLT5kcWlfZW50cnlfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWJsayk7CisJcWluZm8tPmRxaV9vcHMgPSAmdjJfcXRyZWVfb3BzOwogCXJldHVybiAwOwogfQogCkBAIC03Niw3ICsxMTEsOCBAQAogc3RhdGljIGludCB2Ml93cml0ZV9maWxlX2luZm8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpCiB7CiAJc3RydWN0IHYyX2Rpc2tfZHFpbmZvIGRpbmZvOwotCXN0cnVjdCBtZW1fZHFpbmZvICppbmZvID0gc2JfZHFvcHQoc2IpLT5pbmZvK3R5cGU7CisJc3RydWN0IG1lbV9kcWluZm8gKmluZm8gPSBzYl9kcWluZm8oc2IsIHR5cGUpOworCXN0cnVjdCBxdHJlZV9tZW1fZHFpbmZvICpxaW5mbyA9IGluZm8tPmRxaV9wcml2OwogCXNzaXplX3Qgc2l6ZTsKIAogCXNwaW5fbG9jaygmZHFfZGF0YV9sb2NrKTsKQEAgLTg1LDkgKzEyMSw5IEBACiAJZGluZm8uZHFpX2lncmFjZSA9IGNwdV90b19sZTMyKGluZm8tPmRxaV9pZ3JhY2UpOwogCWRpbmZvLmRxaV9mbGFncyA9IGNwdV90b19sZTMyKGluZm8tPmRxaV9mbGFncyAmIERRRl9NQVNLKTsKIAlzcGluX3VubG9jaygmZHFfZGF0YV9sb2NrKTsKLQlkaW5mby5kcWlfYmxvY2tzID0gY3B1X3RvX2xlMzIoaW5mby0+dS52Ml9pLmRxaV9ibG9ja3MpOwotCWRpbmZvLmRxaV9mcmVlX2JsayA9IGNwdV90b19sZTMyKGluZm8tPnUudjJfaS5kcWlfZnJlZV9ibGspOwotCWRpbmZvLmRxaV9mcmVlX2VudHJ5ID0gY3B1X3RvX2xlMzIoaW5mby0+dS52Ml9pLmRxaV9mcmVlX2VudHJ5KTsKKwlkaW5mby5kcWlfYmxvY2tzID0gY3B1X3RvX2xlMzIocWluZm8tPmRxaV9ibG9ja3MpOworCWRpbmZvLmRxaV9mcmVlX2JsayA9IGNwdV90b19sZTMyKHFpbmZvLT5kcWlfZnJlZV9ibGspOworCWRpbmZvLmRxaV9mcmVlX2VudHJ5ID0gY3B1X3RvX2xlMzIocWluZm8tPmRxaV9mcmVlX2VudHJ5KTsKIAlzaXplID0gc2ItPnNfb3AtPnF1b3RhX3dyaXRlKHNiLCB0eXBlLCAoY2hhciAqKSZkaW5mbywKIAkgICAgICAgc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxaW5mbyksIFYyX0RRSU5GT09GRik7CiAJaWYgKHNpemUgIT0gc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxaW5mbykpIHsKQEAgLTk4LDU3NCArMTM0LDc1IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGRpc2sybWVtZHFiKHN0cnVjdCBtZW1fZHFibGsgKm0sIHN0cnVjdCB2Ml9kaXNrX2RxYmxrICpkKQorc3RhdGljIHZvaWQgdjJfZGlzazJtZW1kcWIoc3RydWN0IGRxdW90ICpkcXVvdCwgdm9pZCAqZHApCiB7CisJc3RydWN0IHYyX2Rpc2tfZHFibGsgKmQgPSBkcCwgZW1wdHk7CisJc3RydWN0IG1lbV9kcWJsayAqbSA9ICZkcXVvdC0+ZHFfZHFiOworCiAJbS0+ZHFiX2loYXJkbGltaXQgPSBsZTMyX3RvX2NwdShkLT5kcWJfaWhhcmRsaW1pdCk7CiAJbS0+ZHFiX2lzb2Z0bGltaXQgPSBsZTMyX3RvX2NwdShkLT5kcWJfaXNvZnRsaW1pdCk7CiAJbS0+ZHFiX2N1cmlub2RlcyA9IGxlMzJfdG9fY3B1KGQtPmRxYl9jdXJpbm9kZXMpOwogCW0tPmRxYl9pdGltZSA9IGxlNjRfdG9fY3B1KGQtPmRxYl9pdGltZSk7Ci0JbS0+ZHFiX2JoYXJkbGltaXQgPSBsZTMyX3RvX2NwdShkLT5kcWJfYmhhcmRsaW1pdCk7Ci0JbS0+ZHFiX2Jzb2Z0bGltaXQgPSBsZTMyX3RvX2NwdShkLT5kcWJfYnNvZnRsaW1pdCk7CisJbS0+ZHFiX2JoYXJkbGltaXQgPSB2Ml9xYnRvcyhsZTMyX3RvX2NwdShkLT5kcWJfYmhhcmRsaW1pdCkpOworCW0tPmRxYl9ic29mdGxpbWl0ID0gdjJfcWJ0b3MobGUzMl90b19jcHUoZC0+ZHFiX2Jzb2Z0bGltaXQpKTsKIAltLT5kcWJfY3Vyc3BhY2UgPSBsZTY0X3RvX2NwdShkLT5kcWJfY3Vyc3BhY2UpOwogCW0tPmRxYl9idGltZSA9IGxlNjRfdG9fY3B1KGQtPmRxYl9idGltZSk7CisJLyogV2UgbmVlZCB0byBlc2NhcGUgYmFjayBhbGwtemVybyBzdHJ1Y3R1cmUgKi8KKwltZW1zZXQoJmVtcHR5LCAwLCBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFibGspKTsKKwllbXB0eS5kcWJfaXRpbWUgPSBjcHVfdG9fbGU2NCgxKTsKKwlpZiAoIW1lbWNtcCgmZW1wdHksIGRwLCBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFibGspKSkKKwkJbS0+ZHFiX2l0aW1lID0gMDsKIH0KIAotc3RhdGljIHZvaWQgbWVtMmRpc2tkcWIoc3RydWN0IHYyX2Rpc2tfZHFibGsgKmQsIHN0cnVjdCBtZW1fZHFibGsgKm0sIHFpZF90IGlkKQorc3RhdGljIHZvaWQgdjJfbWVtMmRpc2tkcWIodm9pZCAqZHAsIHN0cnVjdCBkcXVvdCAqZHF1b3QpCiB7CisJc3RydWN0IHYyX2Rpc2tfZHFibGsgKmQgPSBkcDsKKwlzdHJ1Y3QgbWVtX2RxYmxrICptID0gJmRxdW90LT5kcV9kcWI7CisJc3RydWN0IHF0cmVlX21lbV9kcWluZm8gKmluZm8gPQorCQkJc2JfZHFpbmZvKGRxdW90LT5kcV9zYiwgZHF1b3QtPmRxX3R5cGUpLT5kcWlfcHJpdjsKKwogCWQtPmRxYl9paGFyZGxpbWl0ID0gY3B1X3RvX2xlMzIobS0+ZHFiX2loYXJkbGltaXQpOwogCWQtPmRxYl9pc29mdGxpbWl0ID0gY3B1X3RvX2xlMzIobS0+ZHFiX2lzb2Z0bGltaXQpOwogCWQtPmRxYl9jdXJpbm9kZXMgPSBjcHVfdG9fbGUzMihtLT5kcWJfY3VyaW5vZGVzKTsKIAlkLT5kcWJfaXRpbWUgPSBjcHVfdG9fbGU2NChtLT5kcWJfaXRpbWUpOwotCWQtPmRxYl9iaGFyZGxpbWl0ID0gY3B1X3RvX2xlMzIobS0+ZHFiX2JoYXJkbGltaXQpOwotCWQtPmRxYl9ic29mdGxpbWl0ID0gY3B1X3RvX2xlMzIobS0+ZHFiX2Jzb2Z0bGltaXQpOworCWQtPmRxYl9iaGFyZGxpbWl0ID0gY3B1X3RvX2xlMzIodjJfc3RvcWIobS0+ZHFiX2JoYXJkbGltaXQpKTsKKwlkLT5kcWJfYnNvZnRsaW1pdCA9IGNwdV90b19sZTMyKHYyX3N0b3FiKG0tPmRxYl9ic29mdGxpbWl0KSk7CiAJZC0+ZHFiX2N1cnNwYWNlID0gY3B1X3RvX2xlNjQobS0+ZHFiX2N1cnNwYWNlKTsKIAlkLT5kcWJfYnRpbWUgPSBjcHVfdG9fbGU2NChtLT5kcWJfYnRpbWUpOwotCWQtPmRxYl9pZCA9IGNwdV90b19sZTMyKGlkKTsKKwlkLT5kcWJfaWQgPSBjcHVfdG9fbGUzMihkcXVvdC0+ZHFfaWQpOworCWlmIChxdHJlZV9lbnRyeV91bnVzZWQoaW5mbywgZHApKQorCQlkLT5kcWJfaXRpbWUgPSBjcHVfdG9fbGU2NCgxKTsKIH0KIAotc3RhdGljIGRxYnVmX3QgZ2V0ZHFidWYodm9pZCkKK3N0YXRpYyBpbnQgdjJfaXNfaWQodm9pZCAqZHAsIHN0cnVjdCBkcXVvdCAqZHF1b3QpCiB7Ci0JZHFidWZfdCBidWYgPSBrbWFsbG9jKFYyX0RRQkxLU0laRSwgR0ZQX05PRlMpOwotCWlmICghYnVmKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJWRlM6IE5vdCBlbm91Z2ggbWVtb3J5IGZvciBxdW90YSBidWZmZXJzLlxuIik7Ci0JcmV0dXJuIGJ1ZjsKLX0KKwlzdHJ1Y3QgdjJfZGlza19kcWJsayAqZCA9IGRwOworCXN0cnVjdCBxdHJlZV9tZW1fZHFpbmZvICppbmZvID0KKwkJCXNiX2RxaW5mbyhkcXVvdC0+ZHFfc2IsIGRxdW90LT5kcV90eXBlKS0+ZHFpX3ByaXY7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBmcmVlZHFidWYoZHFidWZfdCBidWYpCi17Ci0Ja2ZyZWUoYnVmKTsKLX0KLQotc3RhdGljIGlubGluZSBzc2l6ZV90IHJlYWRfYmxrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLCB1aW50IGJsaywgZHFidWZfdCBidWYpCi17Ci0JbWVtc2V0KGJ1ZiwgMCwgVjJfRFFCTEtTSVpFKTsKLQlyZXR1cm4gc2ItPnNfb3AtPnF1b3RhX3JlYWQoc2IsIHR5cGUsIChjaGFyICopYnVmLAotCSAgICAgICBWMl9EUUJMS1NJWkUsIGJsayA8PCBWMl9EUUJMS1NJWkVfQklUUyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc3NpemVfdCB3cml0ZV9ibGsoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIHVpbnQgYmxrLCBkcWJ1Zl90IGJ1ZikKLXsKLQlyZXR1cm4gc2ItPnNfb3AtPnF1b3RhX3dyaXRlKHNiLCB0eXBlLCAoY2hhciAqKWJ1ZiwKLQkgICAgICAgVjJfRFFCTEtTSVpFLCBibGsgPDwgVjJfRFFCTEtTSVpFX0JJVFMpOwotfQotCi0vKiBSZW1vdmUgZW1wdHkgYmxvY2sgZnJvbSBsaXN0IGFuZCByZXR1cm4gaXQgKi8KLXN0YXRpYyBpbnQgZ2V0X2ZyZWVfZHFibGsoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpCi17Ci0JZHFidWZfdCBidWYgPSBnZXRkcWJ1ZigpOwotCXN0cnVjdCBtZW1fZHFpbmZvICppbmZvID0gc2JfZHFpbmZvKHNiLCB0eXBlKTsKLQlzdHJ1Y3QgdjJfZGlza19kcWRiaGVhZGVyICpkaCA9IChzdHJ1Y3QgdjJfZGlza19kcWRiaGVhZGVyICopYnVmOwotCWludCByZXQsIGJsazsKLQotCWlmICghYnVmKQotCQlyZXR1cm4gLUVOT01FTTsKLQlpZiAoaW5mby0+dS52Ml9pLmRxaV9mcmVlX2JsaykgewotCQlibGsgPSBpbmZvLT51LnYyX2kuZHFpX2ZyZWVfYmxrOwotCQlpZiAoKHJldCA9IHJlYWRfYmxrKHNiLCB0eXBlLCBibGssIGJ1ZikpIDwgMCkKLQkJCWdvdG8gb3V0X2J1ZjsKLQkJaW5mby0+dS52Ml9pLmRxaV9mcmVlX2JsayA9IGxlMzJfdG9fY3B1KGRoLT5kcWRoX25leHRfZnJlZSk7Ci0JfQotCWVsc2UgewotCQltZW1zZXQoYnVmLCAwLCBWMl9EUUJMS1NJWkUpOwotCQkvKiBBc3N1cmUgYmxvY2sgYWxsb2NhdGlvbi4uLiAqLwotCQlpZiAoKHJldCA9IHdyaXRlX2JsayhzYiwgdHlwZSwgaW5mby0+dS52Ml9pLmRxaV9ibG9ja3MsIGJ1ZikpIDwgMCkKLQkJCWdvdG8gb3V0X2J1ZjsKLQkJYmxrID0gaW5mby0+dS52Ml9pLmRxaV9ibG9ja3MrKzsKLQl9Ci0JbWFya19pbmZvX2RpcnR5KHNiLCB0eXBlKTsKLQlyZXQgPSBibGs7Ci1vdXRfYnVmOgotCWZyZWVkcWJ1ZihidWYpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qIEluc2VydCBlbXB0eSBibG9jayB0byB0aGUgbGlzdCAqLwotc3RhdGljIGludCBwdXRfZnJlZV9kcWJsayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwgZHFidWZfdCBidWYsIHVpbnQgYmxrKQotewotCXN0cnVjdCBtZW1fZHFpbmZvICppbmZvID0gc2JfZHFpbmZvKHNiLCB0eXBlKTsKLQlzdHJ1Y3QgdjJfZGlza19kcWRiaGVhZGVyICpkaCA9IChzdHJ1Y3QgdjJfZGlza19kcWRiaGVhZGVyICopYnVmOwotCWludCBlcnI7Ci0KLQlkaC0+ZHFkaF9uZXh0X2ZyZWUgPSBjcHVfdG9fbGUzMihpbmZvLT51LnYyX2kuZHFpX2ZyZWVfYmxrKTsKLQlkaC0+ZHFkaF9wcmV2X2ZyZWUgPSBjcHVfdG9fbGUzMigwKTsKLQlkaC0+ZHFkaF9lbnRyaWVzID0gY3B1X3RvX2xlMTYoMCk7Ci0JaW5mby0+dS52Ml9pLmRxaV9mcmVlX2JsayA9IGJsazsKLQltYXJrX2luZm9fZGlydHkoc2IsIHR5cGUpOwotCS8qIFNvbWUgc3RyYW5nZSBibG9jay4gV2UgaGFkIGJldHRlciBsZWF2ZSBpdC4uLiAqLwotCWlmICgoZXJyID0gd3JpdGVfYmxrKHNiLCB0eXBlLCBibGssIGJ1ZikpIDwgMCkKLQkJcmV0dXJuIGVycjsKLQlyZXR1cm4gMDsKLX0KLQotLyogUmVtb3ZlIGdpdmVuIGJsb2NrIGZyb20gdGhlIGxpc3Qgb2YgYmxvY2tzIHdpdGggZnJlZSBlbnRyaWVzICovCi1zdGF0aWMgaW50IHJlbW92ZV9mcmVlX2RxZW50cnkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIGRxYnVmX3QgYnVmLCB1aW50IGJsaykKLXsKLQlkcWJ1Zl90IHRtcGJ1ZiA9IGdldGRxYnVmKCk7Ci0Jc3RydWN0IG1lbV9kcWluZm8gKmluZm8gPSBzYl9kcWluZm8oc2IsIHR5cGUpOwotCXN0cnVjdCB2Ml9kaXNrX2RxZGJoZWFkZXIgKmRoID0gKHN0cnVjdCB2Ml9kaXNrX2RxZGJoZWFkZXIgKilidWY7Ci0JdWludCBuZXh0YmxrID0gbGUzMl90b19jcHUoZGgtPmRxZGhfbmV4dF9mcmVlKSwgcHJldmJsayA9IGxlMzJfdG9fY3B1KGRoLT5kcWRoX3ByZXZfZnJlZSk7Ci0JaW50IGVycjsKLQotCWlmICghdG1wYnVmKQotCQlyZXR1cm4gLUVOT01FTTsKLQlpZiAobmV4dGJsaykgewotCQlpZiAoKGVyciA9IHJlYWRfYmxrKHNiLCB0eXBlLCBuZXh0YmxrLCB0bXBidWYpKSA8IDApCi0JCQlnb3RvIG91dF9idWY7Ci0JCSgoc3RydWN0IHYyX2Rpc2tfZHFkYmhlYWRlciAqKXRtcGJ1ZiktPmRxZGhfcHJldl9mcmVlID0gZGgtPmRxZGhfcHJldl9mcmVlOwotCQlpZiAoKGVyciA9IHdyaXRlX2JsayhzYiwgdHlwZSwgbmV4dGJsaywgdG1wYnVmKSkgPCAwKQotCQkJZ290byBvdXRfYnVmOwotCX0KLQlpZiAocHJldmJsaykgewotCQlpZiAoKGVyciA9IHJlYWRfYmxrKHNiLCB0eXBlLCBwcmV2YmxrLCB0bXBidWYpKSA8IDApCi0JCQlnb3RvIG91dF9idWY7Ci0JCSgoc3RydWN0IHYyX2Rpc2tfZHFkYmhlYWRlciAqKXRtcGJ1ZiktPmRxZGhfbmV4dF9mcmVlID0gZGgtPmRxZGhfbmV4dF9mcmVlOwotCQlpZiAoKGVyciA9IHdyaXRlX2JsayhzYiwgdHlwZSwgcHJldmJsaywgdG1wYnVmKSkgPCAwKQotCQkJZ290byBvdXRfYnVmOwotCX0KLQllbHNlIHsKLQkJaW5mby0+dS52Ml9pLmRxaV9mcmVlX2VudHJ5ID0gbmV4dGJsazsKLQkJbWFya19pbmZvX2RpcnR5KHNiLCB0eXBlKTsKLQl9Ci0JZnJlZWRxYnVmKHRtcGJ1Zik7Ci0JZGgtPmRxZGhfbmV4dF9mcmVlID0gZGgtPmRxZGhfcHJldl9mcmVlID0gY3B1X3RvX2xlMzIoMCk7Ci0JLyogTm8gbWF0dGVyIHdoZXRoZXIgd3JpdGUgc3VjY2VlZHMgYmxvY2sgaXMgb3V0IG9mIGxpc3QgKi8KLQlpZiAod3JpdGVfYmxrKHNiLCB0eXBlLCBibGssIGJ1ZikgPCAwKQotCQlwcmludGsoS0VSTl9FUlIgIlZGUzogQ2FuJ3Qgd3JpdGUgYmxvY2sgKCV1KSB3aXRoIGZyZWUgZW50cmllcy5cbiIsIGJsayk7Ci0JcmV0dXJuIDA7Ci1vdXRfYnVmOgotCWZyZWVkcWJ1Zih0bXBidWYpOwotCXJldHVybiBlcnI7Ci19Ci0KLS8qIEluc2VydCBnaXZlbiBibG9jayB0byB0aGUgYmVnaW5uaW5nIG9mIGxpc3Qgd2l0aCBmcmVlIGVudHJpZXMgKi8KLXN0YXRpYyBpbnQgaW5zZXJ0X2ZyZWVfZHFlbnRyeShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwgZHFidWZfdCBidWYsIHVpbnQgYmxrKQotewotCWRxYnVmX3QgdG1wYnVmID0gZ2V0ZHFidWYoKTsKLQlzdHJ1Y3QgbWVtX2RxaW5mbyAqaW5mbyA9IHNiX2RxaW5mbyhzYiwgdHlwZSk7Ci0Jc3RydWN0IHYyX2Rpc2tfZHFkYmhlYWRlciAqZGggPSAoc3RydWN0IHYyX2Rpc2tfZHFkYmhlYWRlciAqKWJ1ZjsKLQlpbnQgZXJyOwotCi0JaWYgKCF0bXBidWYpCi0JCXJldHVybiAtRU5PTUVNOwotCWRoLT5kcWRoX25leHRfZnJlZSA9IGNwdV90b19sZTMyKGluZm8tPnUudjJfaS5kcWlfZnJlZV9lbnRyeSk7Ci0JZGgtPmRxZGhfcHJldl9mcmVlID0gY3B1X3RvX2xlMzIoMCk7Ci0JaWYgKChlcnIgPSB3cml0ZV9ibGsoc2IsIHR5cGUsIGJsaywgYnVmKSkgPCAwKQotCQlnb3RvIG91dF9idWY7Ci0JaWYgKGluZm8tPnUudjJfaS5kcWlfZnJlZV9lbnRyeSkgewotCQlpZiAoKGVyciA9IHJlYWRfYmxrKHNiLCB0eXBlLCBpbmZvLT51LnYyX2kuZHFpX2ZyZWVfZW50cnksIHRtcGJ1ZikpIDwgMCkKLQkJCWdvdG8gb3V0X2J1ZjsKLQkJKChzdHJ1Y3QgdjJfZGlza19kcWRiaGVhZGVyICopdG1wYnVmKS0+ZHFkaF9wcmV2X2ZyZWUgPSBjcHVfdG9fbGUzMihibGspOwotCQlpZiAoKGVyciA9IHdyaXRlX2JsayhzYiwgdHlwZSwgaW5mby0+dS52Ml9pLmRxaV9mcmVlX2VudHJ5LCB0bXBidWYpKSA8IDApCi0JCQlnb3RvIG91dF9idWY7Ci0JfQotCWZyZWVkcWJ1Zih0bXBidWYpOwotCWluZm8tPnUudjJfaS5kcWlfZnJlZV9lbnRyeSA9IGJsazsKLQltYXJrX2luZm9fZGlydHkoc2IsIHR5cGUpOwotCXJldHVybiAwOwotb3V0X2J1ZjoKLQlmcmVlZHFidWYodG1wYnVmKTsKLQlyZXR1cm4gZXJyOwotfQotCi0vKiBGaW5kIHNwYWNlIGZvciBkcXVvdCAqLwotc3RhdGljIHVpbnQgZmluZF9mcmVlX2RxZW50cnkoc3RydWN0IGRxdW90ICpkcXVvdCwgaW50ICplcnIpCi17Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRxdW90LT5kcV9zYjsKLQlzdHJ1Y3QgbWVtX2RxaW5mbyAqaW5mbyA9IHNiX2Rxb3B0KHNiKS0+aW5mbytkcXVvdC0+ZHFfdHlwZTsKLQl1aW50IGJsaywgaTsKLQlzdHJ1Y3QgdjJfZGlza19kcWRiaGVhZGVyICpkaDsKLQlzdHJ1Y3QgdjJfZGlza19kcWJsayAqZGRxdW90OwotCXN0cnVjdCB2Ml9kaXNrX2RxYmxrIGZha2VkcXVvdDsKLQlkcWJ1Zl90IGJ1ZjsKLQotCSplcnIgPSAwOwotCWlmICghKGJ1ZiA9IGdldGRxYnVmKCkpKSB7Ci0JCSplcnIgPSAtRU5PTUVNOworCWlmIChxdHJlZV9lbnRyeV91bnVzZWQoaW5mbywgZHApKQogCQlyZXR1cm4gMDsKLQl9Ci0JZGggPSAoc3RydWN0IHYyX2Rpc2tfZHFkYmhlYWRlciAqKWJ1ZjsKLQlkZHF1b3QgPSBHRVRFTlRSSUVTKGJ1Zik7Ci0JaWYgKGluZm8tPnUudjJfaS5kcWlfZnJlZV9lbnRyeSkgewotCQlibGsgPSBpbmZvLT51LnYyX2kuZHFpX2ZyZWVfZW50cnk7Ci0JCWlmICgoKmVyciA9IHJlYWRfYmxrKHNiLCBkcXVvdC0+ZHFfdHlwZSwgYmxrLCBidWYpKSA8IDApCi0JCQlnb3RvIG91dF9idWY7Ci0JfQotCWVsc2UgewotCQlibGsgPSBnZXRfZnJlZV9kcWJsayhzYiwgZHF1b3QtPmRxX3R5cGUpOwotCQlpZiAoKGludClibGsgPCAwKSB7Ci0JCQkqZXJyID0gYmxrOwotCQkJZnJlZWRxYnVmKGJ1Zik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQltZW1zZXQoYnVmLCAwLCBWMl9EUUJMS1NJWkUpOwotCQkvKiBUaGlzIGlzIGVub3VnaCBhcyBibG9jayBpcyBhbHJlYWR5IHplcm9lZCBhbmQgZW50cnkgbGlzdCBpcyBlbXB0eS4uLiAqLwotCQlpbmZvLT51LnYyX2kuZHFpX2ZyZWVfZW50cnkgPSBibGs7Ci0JCW1hcmtfaW5mb19kaXJ0eShzYiwgZHF1b3QtPmRxX3R5cGUpOwotCX0KLQlpZiAobGUxNl90b19jcHUoZGgtPmRxZGhfZW50cmllcykrMSA+PSBWMl9EUVNUUklOQkxLKQkvKiBCbG9jayB3aWxsIGJlIGZ1bGw/ICovCi0JCWlmICgoKmVyciA9IHJlbW92ZV9mcmVlX2RxZW50cnkoc2IsIGRxdW90LT5kcV90eXBlLCBidWYsIGJsaykpIDwgMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IGZpbmRfZnJlZV9kcWVudHJ5KCk6IENhbid0IHJlbW92ZSBibG9jayAoJXUpIGZyb20gZW50cnkgZnJlZSBsaXN0LlxuIiwgYmxrKTsKLQkJCWdvdG8gb3V0X2J1ZjsKLQkJfQotCWxlMTZfYWRkX2NwdSgmZGgtPmRxZGhfZW50cmllcywgMSk7Ci0JbWVtc2V0KCZmYWtlZHF1b3QsIDAsIHNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWJsaykpOwotCS8qIEZpbmQgZnJlZSBzdHJ1Y3R1cmUgaW4gYmxvY2sgKi8KLQlmb3IgKGkgPSAwOyBpIDwgVjJfRFFTVFJJTkJMSyAmJiBtZW1jbXAoJmZha2VkcXVvdCwgZGRxdW90K2ksIHNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWJsaykpOyBpKyspOwotI2lmZGVmIF9fUVVPVEFfVjJfUEFSQU5PSUEKLQlpZiAoaSA9PSBWMl9EUVNUUklOQkxLKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVkZTOiBmaW5kX2ZyZWVfZHFlbnRyeSgpOiBEYXRhIGJsb2NrIGZ1bGwgYnV0IGl0IHNob3VsZG4ndC5cbiIpOwotCQkqZXJyID0gLUVJTzsKLQkJZ290byBvdXRfYnVmOwotCX0KLSNlbmRpZgotCWlmICgoKmVyciA9IHdyaXRlX2JsayhzYiwgZHF1b3QtPmRxX3R5cGUsIGJsaywgYnVmKSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVkZTOiBmaW5kX2ZyZWVfZHFlbnRyeSgpOiBDYW4ndCB3cml0ZSBxdW90YSBkYXRhIGJsb2NrICV1LlxuIiwgYmxrKTsKLQkJZ290byBvdXRfYnVmOwotCX0KLQlkcXVvdC0+ZHFfb2ZmID0gKGJsazw8VjJfRFFCTEtTSVpFX0JJVFMpK3NpemVvZihzdHJ1Y3QgdjJfZGlza19kcWRiaGVhZGVyKStpKnNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWJsayk7Ci0JZnJlZWRxYnVmKGJ1Zik7Ci0JcmV0dXJuIGJsazsKLW91dF9idWY6Ci0JZnJlZWRxYnVmKGJ1Zik7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIEluc2VydCByZWZlcmVuY2UgdG8gc3RydWN0dXJlIGludG8gdGhlIHRyaWUgKi8KLXN0YXRpYyBpbnQgZG9faW5zZXJ0X3RyZWUoc3RydWN0IGRxdW90ICpkcXVvdCwgdWludCAqdHJlZWJsaywgaW50IGRlcHRoKQotewotCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkcXVvdC0+ZHFfc2I7Ci0JZHFidWZfdCBidWY7Ci0JaW50IHJldCA9IDAsIG5ld3NvbiA9IDAsIG5ld2FjdCA9IDA7Ci0JX19sZTMyICpyZWY7Ci0JdWludCBuZXdibGs7Ci0KLQlpZiAoIShidWYgPSBnZXRkcWJ1ZigpKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JaWYgKCEqdHJlZWJsaykgewotCQlyZXQgPSBnZXRfZnJlZV9kcWJsayhzYiwgZHF1b3QtPmRxX3R5cGUpOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gb3V0X2J1ZjsKLQkJKnRyZWVibGsgPSByZXQ7Ci0JCW1lbXNldChidWYsIDAsIFYyX0RRQkxLU0laRSk7Ci0JCW5ld2FjdCA9IDE7Ci0JfQotCWVsc2UgewotCQlpZiAoKHJldCA9IHJlYWRfYmxrKHNiLCBkcXVvdC0+ZHFfdHlwZSwgKnRyZWVibGssIGJ1ZikpIDwgMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IENhbid0IHJlYWQgdHJlZSBxdW90YSBibG9jayAldS5cbiIsICp0cmVlYmxrKTsKLQkJCWdvdG8gb3V0X2J1ZjsKLQkJfQotCX0KLQlyZWYgPSAoX19sZTMyICopYnVmOwotCW5ld2JsayA9IGxlMzJfdG9fY3B1KHJlZltHRVRJRElOREVYKGRxdW90LT5kcV9pZCwgZGVwdGgpXSk7Ci0JaWYgKCFuZXdibGspCi0JCW5ld3NvbiA9IDE7Ci0JaWYgKGRlcHRoID09IFYyX0RRVFJFRURFUFRILTEpIHsKLSNpZmRlZiBfX1FVT1RBX1YyX1BBUkFOT0lBCi0JCWlmIChuZXdibGspIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBJbnNlcnRpbmcgYWxyZWFkeSBwcmVzZW50IHF1b3RhIGVudHJ5IChibG9jayAldSkuXG4iLCBsZTMyX3RvX2NwdShyZWZbR0VUSURJTkRFWChkcXVvdC0+ZHFfaWQsIGRlcHRoKV0pKTsKLQkJCXJldCA9IC1FSU87Ci0JCQlnb3RvIG91dF9idWY7Ci0JCX0KLSNlbmRpZgotCQluZXdibGsgPSBmaW5kX2ZyZWVfZHFlbnRyeShkcXVvdCwgJnJldCk7Ci0JfQotCWVsc2UKLQkJcmV0ID0gZG9faW5zZXJ0X3RyZWUoZHF1b3QsICZuZXdibGssIGRlcHRoKzEpOwotCWlmIChuZXdzb24gJiYgcmV0ID49IDApIHsKLQkJcmVmW0dFVElESU5ERVgoZHF1b3QtPmRxX2lkLCBkZXB0aCldID0gY3B1X3RvX2xlMzIobmV3YmxrKTsKLQkJcmV0ID0gd3JpdGVfYmxrKHNiLCBkcXVvdC0+ZHFfdHlwZSwgKnRyZWVibGssIGJ1Zik7Ci0JfQotCWVsc2UgaWYgKG5ld2FjdCAmJiByZXQgPCAwKQotCQlwdXRfZnJlZV9kcWJsayhzYiwgZHF1b3QtPmRxX3R5cGUsIGJ1ZiwgKnRyZWVibGspOwotb3V0X2J1ZjoKLQlmcmVlZHFidWYoYnVmKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKiBXcmFwcGVyIGZvciBpbnNlcnRpbmcgcXVvdGEgc3RydWN0dXJlIGludG8gdHJlZSAqLwotc3RhdGljIGlubGluZSBpbnQgZHFfaW5zZXJ0X3RyZWUoc3RydWN0IGRxdW90ICpkcXVvdCkKLXsKLQlpbnQgdG1wID0gVjJfRFFUUkVFT0ZGOwotCXJldHVybiBkb19pbnNlcnRfdHJlZShkcXVvdCwgJnRtcCwgMCk7Ci19Ci0KLS8qCi0gKglXZSBkb24ndCBoYXZlIHRvIGJlIGFmcmFpZCBvZiBkZWFkbG9ja3MgYXMgd2UgbmV2ZXIgaGF2ZSBxdW90YXMgb24gcXVvdGEgZmlsZXMuLi4KLSAqLwotc3RhdGljIGludCB2Ml93cml0ZV9kcXVvdChzdHJ1Y3QgZHF1b3QgKmRxdW90KQotewotCWludCB0eXBlID0gZHF1b3QtPmRxX3R5cGU7Ci0Jc3NpemVfdCByZXQ7Ci0Jc3RydWN0IHYyX2Rpc2tfZHFibGsgZGRxdW90LCBlbXB0eTsKLQotCS8qIGRxX29mZiBpcyBndWFyZGVkIGJ5IGRxaW9fbXV0ZXggKi8KLQlpZiAoIWRxdW90LT5kcV9vZmYpCi0JCWlmICgocmV0ID0gZHFfaW5zZXJ0X3RyZWUoZHF1b3QpKSA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBFcnJvciAlemQgb2NjdXJyZWQgd2hpbGUgY3JlYXRpbmcgcXVvdGEuXG4iLCByZXQpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCXNwaW5fbG9jaygmZHFfZGF0YV9sb2NrKTsKLQltZW0yZGlza2RxYigmZGRxdW90LCAmZHF1b3QtPmRxX2RxYiwgZHF1b3QtPmRxX2lkKTsKLQkvKiBBcmdoLi4uIFdlIG1heSBuZWVkIHRvIHdyaXRlIHN0cnVjdHVyZSBmdWxsIG9mIHplcm9lcyBidXQgdGhhdCB3b3VsZCBiZQotCSAqIHRyZWF0ZWQgYXMgYW4gZW1wdHkgcGxhY2UgYnkgdGhlIHJlc3Qgb2YgdGhlIGNvZGUuIEZvcm1hdCBjaGFuZ2Ugd291bGQKLQkgKiBiZSBkZWZpbml0ZWx5IGNsZWFuZXIgYnV0IHRoZSBwcm9ibGVtcyBwcm9iYWJseSBhcmUgbm90IHdvcnRoIGl0ICovCi0JbWVtc2V0KCZlbXB0eSwgMCwgc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxYmxrKSk7Ci0JaWYgKCFtZW1jbXAoJmVtcHR5LCAmZGRxdW90LCBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFibGspKSkKLQkJZGRxdW90LmRxYl9pdGltZSA9IGNwdV90b19sZTY0KDEpOwotCXNwaW5fdW5sb2NrKCZkcV9kYXRhX2xvY2spOwotCXJldCA9IGRxdW90LT5kcV9zYi0+c19vcC0+cXVvdGFfd3JpdGUoZHF1b3QtPmRxX3NiLCB0eXBlLAotCSAgICAgIChjaGFyICopJmRkcXVvdCwgc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxYmxrKSwgZHF1b3QtPmRxX29mZik7Ci0JaWYgKHJldCAhPSBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFibGspKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIlZGUzogZHF1b3RhIHdyaXRlIGZhaWxlZCBvbiBkZXYgJXNcbiIsIGRxdW90LT5kcV9zYi0+c19pZCk7Ci0JCWlmIChyZXQgPj0gMCkKLQkJCXJldCA9IC1FTk9TUEM7Ci0JfQotCWVsc2UKLQkJcmV0ID0gMDsKLQlkcXN0YXRzLndyaXRlcysrOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyogRnJlZSBkcXVvdCBlbnRyeSBpbiBkYXRhIGJsb2NrICovCi1zdGF0aWMgaW50IGZyZWVfZHFlbnRyeShzdHJ1Y3QgZHF1b3QgKmRxdW90LCB1aW50IGJsaykKLXsKLQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZHF1b3QtPmRxX3NiOwotCWludCB0eXBlID0gZHF1b3QtPmRxX3R5cGU7Ci0Jc3RydWN0IHYyX2Rpc2tfZHFkYmhlYWRlciAqZGg7Ci0JZHFidWZfdCBidWYgPSBnZXRkcWJ1ZigpOwotCWludCByZXQgPSAwOwotCi0JaWYgKCFidWYpCi0JCXJldHVybiAtRU5PTUVNOwotCWlmIChkcXVvdC0+ZHFfb2ZmID4+IFYyX0RRQkxLU0laRV9CSVRTICE9IGJsaykgewotCQlwcmludGsoS0VSTl9FUlIgIlZGUzogUXVvdGEgc3RydWN0dXJlIGhhcyBvZmZzZXQgdG8gb3RoZXIgIgotCQkgICJibG9jayAoJXUpIHRoYW4gaXQgc2hvdWxkICgldSkuXG4iLCBibGssCi0JCSAgKHVpbnQpKGRxdW90LT5kcV9vZmYgPj4gVjJfRFFCTEtTSVpFX0JJVFMpKTsKLQkJZ290byBvdXRfYnVmOwotCX0KLQlpZiAoKHJldCA9IHJlYWRfYmxrKHNiLCB0eXBlLCBibGssIGJ1ZikpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIlZGUzogQ2FuJ3QgcmVhZCBxdW90YSBkYXRhIGJsb2NrICV1XG4iLCBibGspOwotCQlnb3RvIG91dF9idWY7Ci0JfQotCWRoID0gKHN0cnVjdCB2Ml9kaXNrX2RxZGJoZWFkZXIgKilidWY7Ci0JbGUxNl9hZGRfY3B1KCZkaC0+ZHFkaF9lbnRyaWVzLCAtMSk7Ci0JaWYgKCFsZTE2X3RvX2NwdShkaC0+ZHFkaF9lbnRyaWVzKSkgewkvKiBCbG9jayBnb3QgZnJlZT8gKi8KLQkJaWYgKChyZXQgPSByZW1vdmVfZnJlZV9kcWVudHJ5KHNiLCB0eXBlLCBidWYsIGJsaykpIDwgMCB8fAotCQkgICAgKHJldCA9IHB1dF9mcmVlX2RxYmxrKHNiLCB0eXBlLCBidWYsIGJsaykpIDwgMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IENhbid0IG1vdmUgcXVvdGEgZGF0YSBibG9jayAoJXUpICIKLQkJCSAgInRvIGZyZWUgbGlzdC5cbiIsIGJsayk7Ci0JCQlnb3RvIG91dF9idWY7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCW1lbXNldChidWYrKGRxdW90LT5kcV9vZmYgJiAoKDEgPDwgVjJfRFFCTEtTSVpFX0JJVFMpLTEpKSwgMCwKLQkJICBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFibGspKTsKLQkJaWYgKGxlMTZfdG9fY3B1KGRoLT5kcWRoX2VudHJpZXMpID09IFYyX0RRU1RSSU5CTEstMSkgewotCQkJLyogSW5zZXJ0IHdpbGwgd3JpdGUgYmxvY2sgaXRzZWxmICovCi0JCQlpZiAoKHJldCA9IGluc2VydF9mcmVlX2RxZW50cnkoc2IsIHR5cGUsIGJ1ZiwgYmxrKSkgPCAwKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IENhbid0IGluc2VydCBxdW90YSBkYXRhIGJsb2NrICgldSkgdG8gZnJlZSBlbnRyeSBsaXN0LlxuIiwgYmxrKTsKLQkJCQlnb3RvIG91dF9idWY7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQkJaWYgKChyZXQgPSB3cml0ZV9ibGsoc2IsIHR5cGUsIGJsaywgYnVmKSkgPCAwKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IENhbid0IHdyaXRlIHF1b3RhIGRhdGEgIgotCQkJCSAgImJsb2NrICV1XG4iLCBibGspOwotCQkJCWdvdG8gb3V0X2J1ZjsKLQkJCX0KLQl9Ci0JZHF1b3QtPmRxX29mZiA9IDA7CS8qIFF1b3RhIGlzIG5vdyB1bmF0dGFjaGVkICovCi1vdXRfYnVmOgotCWZyZWVkcWJ1ZihidWYpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qIFJlbW92ZSByZWZlcmVuY2UgdG8gZHF1b3QgZnJvbSB0cmVlICovCi1zdGF0aWMgaW50IHJlbW92ZV90cmVlKHN0cnVjdCBkcXVvdCAqZHF1b3QsIHVpbnQgKmJsaywgaW50IGRlcHRoKQotewotCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkcXVvdC0+ZHFfc2I7Ci0JaW50IHR5cGUgPSBkcXVvdC0+ZHFfdHlwZTsKLQlkcWJ1Zl90IGJ1ZiA9IGdldGRxYnVmKCk7Ci0JaW50IHJldCA9IDA7Ci0JdWludCBuZXdibGs7Ci0JX19sZTMyICpyZWYgPSAoX19sZTMyICopYnVmOwotCQotCWlmICghYnVmKQotCQlyZXR1cm4gLUVOT01FTTsKLQlpZiAoKHJldCA9IHJlYWRfYmxrKHNiLCB0eXBlLCAqYmxrLCBidWYpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IENhbid0IHJlYWQgcXVvdGEgZGF0YSBibG9jayAldVxuIiwgKmJsayk7Ci0JCWdvdG8gb3V0X2J1ZjsKLQl9Ci0JbmV3YmxrID0gbGUzMl90b19jcHUocmVmW0dFVElESU5ERVgoZHF1b3QtPmRxX2lkLCBkZXB0aCldKTsKLQlpZiAoZGVwdGggPT0gVjJfRFFUUkVFREVQVEgtMSkgewotCQlyZXQgPSBmcmVlX2RxZW50cnkoZHF1b3QsIG5ld2Jsayk7Ci0JCW5ld2JsayA9IDA7Ci0JfQotCWVsc2UKLQkJcmV0ID0gcmVtb3ZlX3RyZWUoZHF1b3QsICZuZXdibGssIGRlcHRoKzEpOwotCWlmIChyZXQgPj0gMCAmJiAhbmV3YmxrKSB7Ci0JCWludCBpOwotCQlyZWZbR0VUSURJTkRFWChkcXVvdC0+ZHFfaWQsIGRlcHRoKV0gPSBjcHVfdG9fbGUzMigwKTsKLQkJZm9yIChpID0gMDsgaSA8IFYyX0RRQkxLU0laRSAmJiAhYnVmW2ldOyBpKyspOwkvKiBCbG9jayBnb3QgZW1wdHk/ICovCi0JCS8qIERvbid0IHB1dCB0aGUgcm9vdCBibG9jayBpbnRvIHRoZSBmcmVlIGJsb2NrIGxpc3QgKi8KLQkJaWYgKGkgPT0gVjJfRFFCTEtTSVpFICYmICpibGsgIT0gVjJfRFFUUkVFT0ZGKSB7Ci0JCQlwdXRfZnJlZV9kcWJsayhzYiwgdHlwZSwgYnVmLCAqYmxrKTsKLQkJCSpibGsgPSAwOwotCQl9Ci0JCWVsc2UKLQkJCWlmICgocmV0ID0gd3JpdGVfYmxrKHNiLCB0eXBlLCAqYmxrLCBidWYpKSA8IDApCi0JCQkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IENhbid0IHdyaXRlIHF1b3RhIHRyZWUgIgotCQkJCSAgImJsb2NrICV1LlxuIiwgKmJsayk7Ci0JfQotb3V0X2J1ZjoKLQlmcmVlZHFidWYoYnVmKTsKLQlyZXR1cm4gcmV0OwkKLX0KLQotLyogRGVsZXRlIGRxdW90IGZyb20gdHJlZSAqLwotc3RhdGljIGludCB2Ml9kZWxldGVfZHF1b3Qoc3RydWN0IGRxdW90ICpkcXVvdCkKLXsKLQl1aW50IHRtcCA9IFYyX0RRVFJFRU9GRjsKLQotCWlmICghZHF1b3QtPmRxX29mZikJLyogRXZlbiBub3QgYWxsb2NhdGVkPyAqLwotCQlyZXR1cm4gMDsKLQlyZXR1cm4gcmVtb3ZlX3RyZWUoZHF1b3QsICZ0bXAsIDApOwotfQotCi0vKiBGaW5kIGVudHJ5IGluIGJsb2NrICovCi1zdGF0aWMgbG9mZl90IGZpbmRfYmxvY2tfZHFlbnRyeShzdHJ1Y3QgZHF1b3QgKmRxdW90LCB1aW50IGJsaykKLXsKLQlkcWJ1Zl90IGJ1ZiA9IGdldGRxYnVmKCk7Ci0JbG9mZl90IHJldCA9IDA7Ci0JaW50IGk7Ci0Jc3RydWN0IHYyX2Rpc2tfZHFibGsgKmRkcXVvdCA9IEdFVEVOVFJJRVMoYnVmKTsKLQotCWlmICghYnVmKQotCQlyZXR1cm4gLUVOT01FTTsKLQlpZiAoKHJldCA9IHJlYWRfYmxrKGRxdW90LT5kcV9zYiwgZHF1b3QtPmRxX3R5cGUsIGJsaywgYnVmKSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVkZTOiBDYW4ndCByZWFkIHF1b3RhIHRyZWUgYmxvY2sgJXUuXG4iLCBibGspOwotCQlnb3RvIG91dF9idWY7Ci0JfQotCWlmIChkcXVvdC0+ZHFfaWQpCi0JCWZvciAoaSA9IDA7IGkgPCBWMl9EUVNUUklOQkxLICYmCi0JCSAgICAgbGUzMl90b19jcHUoZGRxdW90W2ldLmRxYl9pZCkgIT0gZHF1b3QtPmRxX2lkOyBpKyspOwotCWVsc2UgewkvKiBJRCAwIGFzIGEgYml0IG1vcmUgY29tcGxpY2F0ZWQgc2VhcmNoaW5nLi4uICovCi0JCXN0cnVjdCB2Ml9kaXNrX2RxYmxrIGZha2VkcXVvdDsKLQotCQltZW1zZXQoJmZha2VkcXVvdCwgMCwgc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxYmxrKSk7Ci0JCWZvciAoaSA9IDA7IGkgPCBWMl9EUVNUUklOQkxLOyBpKyspCi0JCQlpZiAoIWxlMzJfdG9fY3B1KGRkcXVvdFtpXS5kcWJfaWQpICYmCi0JCQkgICAgbWVtY21wKCZmYWtlZHF1b3QsIGRkcXVvdCtpLCBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFibGspKSkKLQkJCQlicmVhazsKLQl9Ci0JaWYgKGkgPT0gVjJfRFFTVFJJTkJMSykgewotCQlwcmludGsoS0VSTl9FUlIgIlZGUzogUXVvdGEgZm9yIGlkICV1IHJlZmVyZW5jZWQgIgotCQkgICJidXQgbm90IHByZXNlbnQuXG4iLCBkcXVvdC0+ZHFfaWQpOwotCQlyZXQgPSAtRUlPOwotCQlnb3RvIG91dF9idWY7Ci0JfQotCWVsc2UKLQkJcmV0ID0gKGJsayA8PCBWMl9EUUJMS1NJWkVfQklUUykgKyBzaXplb2Yoc3RydWN0Ci0JCSAgdjJfZGlza19kcWRiaGVhZGVyKSArIGkgKiBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFibGspOwotb3V0X2J1ZjoKLQlmcmVlZHFidWYoYnVmKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKiBGaW5kIGVudHJ5IGZvciBnaXZlbiBpZCBpbiB0aGUgdHJlZSAqLwotc3RhdGljIGxvZmZfdCBmaW5kX3RyZWVfZHFlbnRyeShzdHJ1Y3QgZHF1b3QgKmRxdW90LCB1aW50IGJsaywgaW50IGRlcHRoKQotewotCWRxYnVmX3QgYnVmID0gZ2V0ZHFidWYoKTsKLQlsb2ZmX3QgcmV0ID0gMDsKLQlfX2xlMzIgKnJlZiA9IChfX2xlMzIgKilidWY7Ci0KLQlpZiAoIWJ1ZikKLQkJcmV0dXJuIC1FTk9NRU07Ci0JaWYgKChyZXQgPSByZWFkX2JsayhkcXVvdC0+ZHFfc2IsIGRxdW90LT5kcV90eXBlLCBibGssIGJ1ZikpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIlZGUzogQ2FuJ3QgcmVhZCBxdW90YSB0cmVlIGJsb2NrICV1LlxuIiwgYmxrKTsKLQkJZ290byBvdXRfYnVmOwotCX0KLQlyZXQgPSAwOwotCWJsayA9IGxlMzJfdG9fY3B1KHJlZltHRVRJRElOREVYKGRxdW90LT5kcV9pZCwgZGVwdGgpXSk7Ci0JaWYgKCFibGspCS8qIE5vIHJlZmVyZW5jZT8gKi8KLQkJZ290byBvdXRfYnVmOwotCWlmIChkZXB0aCA8IFYyX0RRVFJFRURFUFRILTEpCi0JCXJldCA9IGZpbmRfdHJlZV9kcWVudHJ5KGRxdW90LCBibGssIGRlcHRoKzEpOwotCWVsc2UKLQkJcmV0ID0gZmluZF9ibG9ja19kcWVudHJ5KGRxdW90LCBibGspOwotb3V0X2J1ZjoKLQlmcmVlZHFidWYoYnVmKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKiBGaW5kIGVudHJ5IGZvciBnaXZlbiBpZCBpbiB0aGUgdHJlZSAtIHdyYXBwZXIgZnVuY3Rpb24gKi8KLXN0YXRpYyBpbmxpbmUgbG9mZl90IGZpbmRfZHFlbnRyeShzdHJ1Y3QgZHF1b3QgKmRxdW90KQotewotCXJldHVybiBmaW5kX3RyZWVfZHFlbnRyeShkcXVvdCwgVjJfRFFUUkVFT0ZGLCAwKTsKKwlyZXR1cm4gbGUzMl90b19jcHUoZC0+ZHFiX2lkKSA9PSBkcXVvdC0+ZHFfaWQ7CiB9CiAKIHN0YXRpYyBpbnQgdjJfcmVhZF9kcXVvdChzdHJ1Y3QgZHF1b3QgKmRxdW90KQogewotCWludCB0eXBlID0gZHF1b3QtPmRxX3R5cGU7Ci0JbG9mZl90IG9mZnNldDsKLQlzdHJ1Y3QgdjJfZGlza19kcWJsayBkZHF1b3QsIGVtcHR5OwotCWludCByZXQgPSAwOwotCi0jaWZkZWYgX19RVU9UQV9WMl9QQVJBTk9JQQotCS8qIEludmFsaWRhdGVkIHF1b3RhPyAqLwotCWlmICghZHF1b3QtPmRxX3NiIHx8ICFzYl9kcW9wdChkcXVvdC0+ZHFfc2IpLT5maWxlc1t0eXBlXSkgewotCQlwcmludGsoS0VSTl9FUlIgIlZGUzogUXVvdGEgaW52YWxpZGF0ZWQgd2hpbGUgcmVhZGluZyFcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0jZW5kaWYKLQlvZmZzZXQgPSBmaW5kX2RxZW50cnkoZHF1b3QpOwotCWlmIChvZmZzZXQgPD0gMCkgewkvKiBFbnRyeSBub3QgcHJlc2VudD8gKi8KLQkJaWYgKG9mZnNldCA8IDApCi0JCQlwcmludGsoS0VSTl9FUlIgIlZGUzogQ2FuJ3QgcmVhZCBxdW90YSAiCi0JCQkgICJzdHJ1Y3R1cmUgZm9yIGlkICV1LlxuIiwgZHF1b3QtPmRxX2lkKTsKLQkJZHF1b3QtPmRxX29mZiA9IDA7Ci0JCXNldF9iaXQoRFFfRkFLRV9CLCAmZHF1b3QtPmRxX2ZsYWdzKTsKLQkJbWVtc2V0KCZkcXVvdC0+ZHFfZHFiLCAwLCBzaXplb2Yoc3RydWN0IG1lbV9kcWJsaykpOwotCQlyZXQgPSBvZmZzZXQ7Ci0JfQotCWVsc2UgewotCQlkcXVvdC0+ZHFfb2ZmID0gb2Zmc2V0OwotCQlpZiAoKHJldCA9IGRxdW90LT5kcV9zYi0+c19vcC0+cXVvdGFfcmVhZChkcXVvdC0+ZHFfc2IsIHR5cGUsCi0JCSAgICAoY2hhciAqKSZkZHF1b3QsIHNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWJsayksIG9mZnNldCkpCi0JCSAgICAhPSBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFibGspKSB7Ci0JCQlpZiAocmV0ID49IDApCi0JCQkJcmV0ID0gLUVJTzsKLQkJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBFcnJvciB3aGlsZSByZWFkaW5nIHF1b3RhICIKLQkJCSAgInN0cnVjdHVyZSBmb3IgaWQgJXUuXG4iLCBkcXVvdC0+ZHFfaWQpOwotCQkJbWVtc2V0KCZkZHF1b3QsIDAsIHNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWJsaykpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0ID0gMDsKLQkJCS8qIFdlIG5lZWQgdG8gZXNjYXBlIGJhY2sgYWxsLXplcm8gc3RydWN0dXJlICovCi0JCQltZW1zZXQoJmVtcHR5LCAwLCBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFibGspKTsKLQkJCWVtcHR5LmRxYl9pdGltZSA9IGNwdV90b19sZTY0KDEpOwotCQkJaWYgKCFtZW1jbXAoJmVtcHR5LCAmZGRxdW90LCBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFibGspKSkKLQkJCQlkZHF1b3QuZHFiX2l0aW1lID0gMDsKLQkJfQotCQlkaXNrMm1lbWRxYigmZHF1b3QtPmRxX2RxYiwgJmRkcXVvdCk7Ci0JCWlmICghZHF1b3QtPmRxX2RxYi5kcWJfYmhhcmRsaW1pdCAmJgotCQkJIWRxdW90LT5kcV9kcWIuZHFiX2Jzb2Z0bGltaXQgJiYKLQkJCSFkcXVvdC0+ZHFfZHFiLmRxYl9paGFyZGxpbWl0ICYmCi0JCQkhZHF1b3QtPmRxX2RxYi5kcWJfaXNvZnRsaW1pdCkKLQkJCXNldF9iaXQoRFFfRkFLRV9CLCAmZHF1b3QtPmRxX2ZsYWdzKTsKLQl9Ci0JZHFzdGF0cy5yZWFkcysrOwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gcXRyZWVfcmVhZF9kcXVvdChzYl9kcWluZm8oZHF1b3QtPmRxX3NiLCBkcXVvdC0+ZHFfdHlwZSktPmRxaV9wcml2LCBkcXVvdCk7CiB9CiAKLS8qIENoZWNrIHdoZXRoZXIgZHF1b3Qgc2hvdWxkIG5vdCBiZSBkZWxldGVkLiBXZSBrbm93IHdlIGFyZQotICogdGhlIG9ubHkgb25lIG9wZXJhdGluZyBvbiBkcXVvdCAodGhhbmtzIHRvIGRxX2xvY2spICovCitzdGF0aWMgaW50IHYyX3dyaXRlX2RxdW90KHN0cnVjdCBkcXVvdCAqZHF1b3QpCit7CisJcmV0dXJuIHF0cmVlX3dyaXRlX2RxdW90KHNiX2RxaW5mbyhkcXVvdC0+ZHFfc2IsIGRxdW90LT5kcV90eXBlKS0+ZHFpX3ByaXYsIGRxdW90KTsKK30KKwogc3RhdGljIGludCB2Ml9yZWxlYXNlX2RxdW90KHN0cnVjdCBkcXVvdCAqZHF1b3QpCiB7Ci0JaWYgKHRlc3RfYml0KERRX0ZBS0VfQiwgJmRxdW90LT5kcV9mbGFncykgJiYgIShkcXVvdC0+ZHFfZHFiLmRxYl9jdXJpbm9kZXMgfCBkcXVvdC0+ZHFfZHFiLmRxYl9jdXJzcGFjZSkpCi0JCXJldHVybiB2Ml9kZWxldGVfZHF1b3QoZHF1b3QpOworCXJldHVybiBxdHJlZV9yZWxlYXNlX2RxdW90KHNiX2RxaW5mbyhkcXVvdC0+ZHFfc2IsIGRxdW90LT5kcV90eXBlKS0+ZHFpX3ByaXYsIGRxdW90KTsKK30KKworc3RhdGljIGludCB2Ml9mcmVlX2ZpbGVfaW5mbyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKK3sKKwlrZnJlZShzYl9kcWluZm8oc2IsIHR5cGUpLT5kcWlfcHJpdik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTY3Myw3ICsyMTAsNyBAQAogCS5jaGVja19xdW90YV9maWxlCT0gdjJfY2hlY2tfcXVvdGFfZmlsZSwKIAkucmVhZF9maWxlX2luZm8JCT0gdjJfcmVhZF9maWxlX2luZm8sCiAJLndyaXRlX2ZpbGVfaW5mbwk9IHYyX3dyaXRlX2ZpbGVfaW5mbywKLQkuZnJlZV9maWxlX2luZm8JCT0gTlVMTCwKKwkuZnJlZV9maWxlX2luZm8JCT0gdjJfZnJlZV9maWxlX2luZm8sCiAJLnJlYWRfZHFibGsJCT0gdjJfcmVhZF9kcXVvdCwKIAkuY29tbWl0X2RxYmxrCQk9IHYyX3dyaXRlX2RxdW90LAogCS5yZWxlYXNlX2RxYmxrCQk9IHYyX3JlbGVhc2VfZHF1b3QsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3F1b3RhaW9fdjEuaCBiL2ZzL3F1b3RhaW9fdjEuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9saW51eC9xdW90YWlvX3YxLmgKcmVuYW1lIHRvIGZzL3F1b3RhaW9fdjEuaApkaWZmIC0tZ2l0IGEvZnMvcXVvdGFpb192Mi5oIGIvZnMvcXVvdGFpb192Mi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMGZlNTgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9xdW90YWlvX3YyLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqCURlZmluaXRpb25zIG9mIHN0cnVjdHVyZXMgZm9yIHZmc3YwIHF1b3RhIGZvcm1hdAorICovCisKKyNpZm5kZWYgX0xJTlVYX1FVT1RBSU9fVjJfSAorI2RlZmluZSBfTElOVVhfUVVPVEFJT19WMl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3F1b3RhLmg+CisKKy8qCisgKiBEZWZpbml0aW9ucyBvZiBtYWdpY3MgYW5kIHZlcnNpb25zIG9mIGN1cnJlbnQgcXVvdGEgZmlsZXMKKyAqLworI2RlZmluZSBWMl9JTklUUU1BR0lDUyB7XAorCTB4ZDljMDFmMTEsCS8qIFVTUlFVT1RBICovXAorCTB4ZDljMDE5MjcJLyogR1JQUVVPVEEgKi9cCit9CisKKyNkZWZpbmUgVjJfSU5JVFFWRVJTSU9OUyB7XAorCTAsCQkvKiBVU1JRVU9UQSAqL1wKKwkwCQkvKiBHUlBRVU9UQSAqL1wKK30KKworLyogRmlyc3QgZ2VuZXJpYyBoZWFkZXIgKi8KK3N0cnVjdCB2Ml9kaXNrX2RxaGVhZGVyIHsKKwlfX2xlMzIgZHFoX21hZ2ljOwkvKiBNYWdpYyBudW1iZXIgaWRlbnRpZnlpbmcgZmlsZSAqLworCV9fbGUzMiBkcWhfdmVyc2lvbjsJLyogRmlsZSB2ZXJzaW9uICovCit9OworCisvKgorICogVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgZm9ybWF0IG9mIHRoZSBkaXNrIHF1b3RhIGZpbGUKKyAqIChhcyBpdCBhcHBlYXJzIG9uIGRpc2spIC0gdGhlIGZpbGUgaXMgYSByYWRpeCB0cmVlIHdob3NlIGxlYXZlcyBwb2ludAorICogdG8gYmxvY2tzIG9mIHRoZXNlIHN0cnVjdHVyZXMuCisgKi8KK3N0cnVjdCB2Ml9kaXNrX2RxYmxrIHsKKwlfX2xlMzIgZHFiX2lkOwkJLyogaWQgdGhpcyBxdW90YSBhcHBsaWVzIHRvICovCisJX19sZTMyIGRxYl9paGFyZGxpbWl0OwkvKiBhYnNvbHV0ZSBsaW1pdCBvbiBhbGxvY2F0ZWQgaW5vZGVzICovCisJX19sZTMyIGRxYl9pc29mdGxpbWl0OwkvKiBwcmVmZXJyZWQgaW5vZGUgbGltaXQgKi8KKwlfX2xlMzIgZHFiX2N1cmlub2RlczsJLyogY3VycmVudCAjIGFsbG9jYXRlZCBpbm9kZXMgKi8KKwlfX2xlMzIgZHFiX2JoYXJkbGltaXQ7CS8qIGFic29sdXRlIGxpbWl0IG9uIGRpc2sgc3BhY2UgKGluIFFVT1RBQkxPQ0tfU0laRSkgKi8KKwlfX2xlMzIgZHFiX2Jzb2Z0bGltaXQ7CS8qIHByZWZlcnJlZCBsaW1pdCBvbiBkaXNrIHNwYWNlIChpbiBRVU9UQUJMT0NLX1NJWkUpICovCisJX19sZTY0IGRxYl9jdXJzcGFjZTsJLyogY3VycmVudCBzcGFjZSBvY2N1cGllZCAoaW4gYnl0ZXMpICovCisJX19sZTY0IGRxYl9idGltZTsJLyogdGltZSBsaW1pdCBmb3IgZXhjZXNzaXZlIGRpc2sgdXNlICovCisJX19sZTY0IGRxYl9pdGltZTsJLyogdGltZSBsaW1pdCBmb3IgZXhjZXNzaXZlIGlub2RlIHVzZSAqLworfTsKKworLyogSGVhZGVyIHdpdGggdHlwZSBhbmQgdmVyc2lvbiBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLworc3RydWN0IHYyX2Rpc2tfZHFpbmZvIHsKKwlfX2xlMzIgZHFpX2JncmFjZTsJLyogVGltZSBiZWZvcmUgYmxvY2sgc29mdCBsaW1pdCBiZWNvbWVzIGhhcmQgbGltaXQgKi8KKwlfX2xlMzIgZHFpX2lncmFjZTsJLyogVGltZSBiZWZvcmUgaW5vZGUgc29mdCBsaW1pdCBiZWNvbWVzIGhhcmQgbGltaXQgKi8KKwlfX2xlMzIgZHFpX2ZsYWdzOwkvKiBGbGFncyBmb3IgcXVvdGFmaWxlIChEUUZfKikgKi8KKwlfX2xlMzIgZHFpX2Jsb2NrczsJLyogTnVtYmVyIG9mIGJsb2NrcyBpbiBmaWxlICovCisJX19sZTMyIGRxaV9mcmVlX2JsazsJLyogTnVtYmVyIG9mIGZpcnN0IGZyZWUgYmxvY2sgaW4gdGhlIGxpc3QgKi8KKwlfX2xlMzIgZHFpX2ZyZWVfZW50cnk7CS8qIE51bWJlciBvZiBibG9jayB3aXRoIGF0IGxlYXN0IG9uZSBmcmVlIGVudHJ5ICovCit9OworCisjZGVmaW5lIFYyX0RRSU5GT09GRglzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFoZWFkZXIpCS8qIE9mZnNldCBvZiBpbmZvIGhlYWRlciBpbiBmaWxlICovCisjZGVmaW5lIFYyX0RRQkxLU0laRV9CSVRTIDEwCQkJCS8qIFNpemUgb2YgbGVhZiBibG9jayBpbiB0cmVlICovCisKKyNlbmRpZiAvKiBfTElOVVhfUVVPVEFJT19WMl9IICovCmRpZmYgLS1naXQgYS9mcy9yYW1mcy9pbm9kZS5jIGIvZnMvcmFtZnMvaW5vZGUuYwppbmRleCBhODNhMzUxLi5iN2U2YWM3IDEwMDY0NAotLS0gYS9mcy9yYW1mcy9pbm9kZS5jCisrKyBiL2ZzL3JhbWZzL2lub2RlLmMKQEAgLTU3LDcgKzU3LDYgQEAKIAkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CiAJCWlub2RlLT5pX3VpZCA9IGN1cnJlbnRfZnN1aWQoKTsKIAkJaW5vZGUtPmlfZ2lkID0gY3VycmVudF9mc2dpZCgpOwotCQlpbm9kZS0+aV9ibG9ja3MgPSAwOwogCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZyYW1mc19hb3BzOwogCQlpbm9kZS0+aV9tYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvID0gJnJhbWZzX2JhY2tpbmdfZGV2X2luZm87CiAJCW1hcHBpbmdfc2V0X2dmcF9tYXNrKGlub2RlLT5pX21hcHBpbmcsIEdGUF9ISUdIVVNFUik7CmRpZmYgLS1naXQgYS9mcy9yZWFkX3dyaXRlLmMgYi9mcy9yZWFkX3dyaXRlLmMKaW5kZXggOTY5YTZkOS4uNWNjNjkyNCAxMDA2NDQKLS0tIGEvZnMvcmVhZF93cml0ZS5jCisrKyBiL2ZzL3JlYWRfd3JpdGUuYwpAQCAtNTAsNiArNTAsMTQgQEAKIAkJb2Zmc2V0ICs9IGlub2RlLT5pX3NpemU7CiAJCWJyZWFrOwogCWNhc2UgU0VFS19DVVI6CisJCS8qCisJCSAqIEhlcmUgd2Ugc3BlY2lhbC1jYXNlIHRoZSBsc2VlayhmZCwgMCwgU0VFS19DVVIpCisJCSAqIHBvc2l0aW9uLXF1ZXJ5aW5nIG9wZXJhdGlvbi4gIEF2b2lkIHJld3JpdGluZyB0aGUgInNhbWUiCisJCSAqIGZfcG9zIHZhbHVlIGJhY2sgdG8gdGhlIGZpbGUgYmVjYXVzZSBhIGNvbmN1cnJlbnQgcmVhZCgpLAorCQkgKiB3cml0ZSgpIG9yIGxzZWVrKCkgbWlnaHQgaGF2ZSBhbHRlcmVkIGl0CisJCSAqLworCQlpZiAob2Zmc2V0ID09IDApCisJCQlyZXR1cm4gZmlsZS0+Zl9wb3M7CiAJCW9mZnNldCArPSBmaWxlLT5mX3BvczsKIAkJYnJlYWs7CiAJfQpAQCAtMTA1LDYgKzExMywxMCBAQAogCQkJb2Zmc2V0ICs9IGlfc2l6ZV9yZWFkKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwogCQkJYnJlYWs7CiAJCWNhc2UgU0VFS19DVVI6CisJCQlpZiAob2Zmc2V0ID09IDApIHsKKwkJCQlyZXR2YWwgPSBmaWxlLT5mX3BvczsKKwkJCQlnb3RvIG91dDsKKwkJCX0KIAkJCW9mZnNldCArPSBmaWxlLT5mX3BvczsKIAl9CiAJcmV0dmFsID0gLUVJTlZBTDsKQEAgLTExNSw2ICsxMjcsNyBAQAogCQl9CiAJCXJldHZhbCA9IG9mZnNldDsKIAl9CitvdXQ6CiAJdW5sb2NrX2tlcm5lbCgpOwogCXJldHVybiByZXR2YWw7CiB9CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9pbm9kZS5jIGIvZnMvcmVpc2VyZnMvaW5vZGUuYwppbmRleCBlZDA0ZjQ3Li41NWZjZTkyIDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9pbm9kZS5jCisrKyBiL2ZzL3JlaXNlcmZzL2lub2RlLmMKQEAgLTE3ODIsNiArMTc4MiwxMiBAQAogCQlnb3RvIG91dF9iYWRfaW5vZGU7CiAJfQogCWFyZ3Mub2JqZWN0aWQgPSBpbm9kZS0+aV9pbm8gPSBsZTMyX3RvX2NwdShpaC5paF9rZXkua19vYmplY3RpZCk7CisJaWYgKG9sZF9mb3JtYXRfb25seShzYikpCisJCW1ha2VfbGVfaXRlbV9oZWFkKCZpaCwgTlVMTCwgS0VZX0ZPUk1BVF8zXzUsIFNEX09GRlNFVCwKKwkJCQkgIFRZUEVfU1RBVF9EQVRBLCBTRF9WMV9TSVpFLCBNQVhfVVNfSU5UKTsKKwllbHNlCisJCW1ha2VfbGVfaXRlbV9oZWFkKCZpaCwgTlVMTCwgS0VZX0ZPUk1BVF8zXzYsIFNEX09GRlNFVCwKKwkJCQkgIFRZUEVfU1RBVF9EQVRBLCBTRF9TSVpFLCBNQVhfVVNfSU5UKTsKIAltZW1jcHkoSU5PREVfUEtFWShpbm9kZSksICYoaWguaWhfa2V5KSwgS0VZX1NJWkUpOwogCWFyZ3MuZGlyaWQgPSBsZTMyX3RvX2NwdShpaC5paF9rZXkua19kaXJfaWQpOwogCWlmIChpbnNlcnRfaW5vZGVfbG9ja2VkNChpbm9kZSwgYXJncy5vYmplY3RpZCwKQEAgLTE4MzQsMTMgKzE4NDAsNiBAQAogCXJlaXNlcmZzX2luaXRfYWNsX2RlZmF1bHQoaW5vZGUpOwogCXJlaXNlcmZzX2luaXRfeGF0dHJfcndzZW0oaW5vZGUpOwogCi0JaWYgKG9sZF9mb3JtYXRfb25seShzYikpCi0JCW1ha2VfbGVfaXRlbV9oZWFkKCZpaCwgTlVMTCwgS0VZX0ZPUk1BVF8zXzUsIFNEX09GRlNFVCwKLQkJCQkgIFRZUEVfU1RBVF9EQVRBLCBTRF9WMV9TSVpFLCBNQVhfVVNfSU5UKTsKLQllbHNlCi0JCW1ha2VfbGVfaXRlbV9oZWFkKCZpaCwgTlVMTCwgS0VZX0ZPUk1BVF8zXzYsIFNEX09GRlNFVCwKLQkJCQkgIFRZUEVfU1RBVF9EQVRBLCBTRF9TSVpFLCBNQVhfVVNfSU5UKTsKLQogCS8qIGtleSB0byBzZWFyY2ggZm9yIGNvcnJlY3QgcGxhY2UgZm9yIG5ldyBzdGF0IGRhdGEgKi8KIAlfbWFrZV9jcHVfa2V5KCZrZXksIEtFWV9GT1JNQVRfM182LCBsZTMyX3RvX2NwdShpaC5paF9rZXkua19kaXJfaWQpLAogCQkgICAgICBsZTMyX3RvX2NwdShpaC5paF9rZXkua19vYmplY3RpZCksIFNEX09GRlNFVCwKZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL3N1cGVyLmMgYi9mcy9yZWlzZXJmcy9zdXBlci5jCmluZGV4IDY2M2E5MWYuLmM1NTY1MWYgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL3N1cGVyLmMKKysrIGIvZnMvcmVpc2VyZnMvc3VwZXIuYwpAQCAtNjQ5LDYgKzY0OSw4IEBACiAJLnJlbGVhc2VfZHF1b3QgPSByZWlzZXJmc19yZWxlYXNlX2RxdW90LAogCS5tYXJrX2RpcnR5ID0gcmVpc2VyZnNfbWFya19kcXVvdF9kaXJ0eSwKIAkud3JpdGVfaW5mbyA9IHJlaXNlcmZzX3dyaXRlX2luZm8sCisJLmFsbG9jX2RxdW90CT0gZHF1b3RfYWxsb2MsCisJLmRlc3Ryb3lfZHF1b3QJPSBkcXVvdF9kZXN0cm95LAogfTsKIAogc3RhdGljIHN0cnVjdCBxdW90YWN0bF9vcHMgcmVpc2VyZnNfcWN0bF9vcGVyYXRpb25zID0gewpAQCAtOTk0LDggKzk5Niw3IEBACiAJCWlmIChjID09ICd1JyB8fCBjID09ICdnJykgewogCQkJaW50IHF0eXBlID0gYyA9PSAndScgPyBVU1JRVU9UQSA6IEdSUFFVT1RBOwogCi0JCQlpZiAoKHNiX2FueV9xdW90YV9lbmFibGVkKHMpIHx8Ci0JCQkgICAgIHNiX2FueV9xdW90YV9zdXNwZW5kZWQocykpICYmCisJCQlpZiAoc2JfYW55X3F1b3RhX2xvYWRlZChzKSAmJgogCQkJICAgICghKmFyZyAhPSAhUkVJU0VSRlNfU0IocyktPnNfcWZfbmFtZXNbcXR5cGVdKSkgewogCQkJCXJlaXNlcmZzX3dhcm5pbmcocywKIAkJCQkJCSAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogY2Fubm90IGNoYW5nZSBqb3VybmFsZWQgcXVvdGEgb3B0aW9ucyB3aGVuIHF1b3RhIHR1cm5lZCBvbi4iKTsKQEAgLTEwNDEsOCArMTA0Miw3IEBACiAJCQkJCQkgInJlaXNlcmZzX3BhcnNlX29wdGlvbnM6IHVua25vd24gcXVvdGEgZm9ybWF0IHNwZWNpZmllZC4iKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KLQkJCWlmICgoc2JfYW55X3F1b3RhX2VuYWJsZWQocykgfHwKLQkJCSAgICAgc2JfYW55X3F1b3RhX3N1c3BlbmRlZChzKSkgJiYKKwkJCWlmIChzYl9hbnlfcXVvdGFfbG9hZGVkKHMpICYmCiAJCQkgICAgKnFmbXQgIT0gUkVJU0VSRlNfU0IocyktPnNfanF1b3RhX2ZtdCkgewogCQkJCXJlaXNlcmZzX3dhcm5pbmcocywKIAkJCQkJCSAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogY2Fubm90IGNoYW5nZSBqb3VybmFsZWQgcXVvdGEgb3B0aW9ucyB3aGVuIHF1b3RhIHR1cm5lZCBvbi4iKTsKQEAgLTEwNjcsNyArMTA2Nyw3IEBACiAJfQogCS8qIFRoaXMgY2hlY2tpbmcgaXMgbm90IHByZWNpc2Ugd3J0IHRoZSBxdW90YSB0eXBlIGJ1dCBmb3Igb3VyIHB1cnBvc2VzIGl0IGlzIHN1ZmZpY2llbnQgKi8KIAlpZiAoISgqbW91bnRfb3B0aW9ucyAmICgxIDw8IFJFSVNFUkZTX1FVT1RBKSkKLQkgICAgJiYgc2JfYW55X3F1b3RhX2VuYWJsZWQocykpIHsKKwkgICAgJiYgc2JfYW55X3F1b3RhX2xvYWRlZChzKSkgewogCQlyZWlzZXJmc193YXJuaW5nKHMsCiAJCQkJICJyZWlzZXJmc19wYXJzZV9vcHRpb25zOiBxdW90YSBvcHRpb25zIG11c3QgYmUgcHJlc2VudCB3aGVuIHF1b3RhIGlzIHR1cm5lZCBvbi4iKTsKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9mcy9yb21mcy9pbm9kZS5jIGIvZnMvcm9tZnMvaW5vZGUuYwppbmRleCA2MGQyZjgyLi45OGEyMzJmIDEwMDY0NAotLS0gYS9mcy9yb21mcy9pbm9kZS5jCisrKyBiL2ZzL3JvbWZzL2lub2RlLmMKQEAgLTQ5MCw3ICs0OTAsNyBAQAogc3RhdGljIHN0cnVjdCBpbm9kZSAqCiByb21mc19pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGxvbmcgaW5vKQogewotCWludCBuZXh0Zmg7CisJaW50IG5leHRmaCwgcmV0OwogCXN0cnVjdCByb21mc19pbm9kZSByaTsKIAlzdHJ1Y3QgaW5vZGUgKmk7CiAKQEAgLTUyNCwxNCArNTI0LDEzIEBACiAJaS0+aV9zaXplID0gYmUzMl90b19jcHUocmkuc2l6ZSk7CiAJaS0+aV9tdGltZS50dl9zZWMgPSBpLT5pX2F0aW1lLnR2X3NlYyA9IGktPmlfY3RpbWUudHZfc2VjID0gMDsKIAlpLT5pX210aW1lLnR2X25zZWMgPSBpLT5pX2F0aW1lLnR2X25zZWMgPSBpLT5pX2N0aW1lLnR2X25zZWMgPSAwOwotCWktPmlfdWlkID0gaS0+aV9naWQgPSAwOwogCiAgICAgICAgIC8qIFByZWNhbGN1bGF0ZSB0aGUgZGF0YSBvZmZzZXQgKi8KLSAgICAgICAgaW5vID0gcm9tZnNfc3RybmxlbihpLCBpbm8rUk9NRkhfU0laRSwgUk9NRlNfTUFYRk4pOwotICAgICAgICBpZiAoaW5vID49IDApCi0gICAgICAgICAgICAgICAgaW5vID0gKChST01GSF9TSVpFK2lubysxK1JPTUZIX1BBRCkmUk9NRkhfTUFTSyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBpbm8gPSAwOworCXJldCA9IHJvbWZzX3N0cm5sZW4oaSwgaW5vICsgUk9NRkhfU0laRSwgUk9NRlNfTUFYRk4pOworCWlmIChyZXQgPj0gMCkKKwkJaW5vID0gKFJPTUZIX1NJWkUgKyByZXQgKyAxICsgUk9NRkhfUEFEKSAmIFJPTUZIX01BU0s7CisJZWxzZQorCQlpbm8gPSAwOwogCiAgICAgICAgIFJPTUZTX0koaSktPmlfbWV0YXNpemUgPSBpbm87CiAgICAgICAgIFJPTUZTX0koaSktPmlfZGF0YW9mZnNldCA9IGlubysoaS0+aV9pbm8mUk9NRkhfTUFTSyk7CmRpZmYgLS1naXQgYS9mcy9zZWxlY3QuYyBiL2ZzL3NlbGVjdC5jCmluZGV4IDg3ZGY1MWUuLjA4YjkxYmUgMTAwNjQ0Ci0tLSBhL2ZzL3NlbGVjdC5jCisrKyBiL2ZzL3NlbGVjdC5jCkBAIC0xMDksMTEgKzEwOSwxMSBAQAogdm9pZCBwb2xsX2luaXR3YWl0KHN0cnVjdCBwb2xsX3dxdWV1ZXMgKnB3cSkKIHsKIAlpbml0X3BvbGxfZnVuY3B0cigmcHdxLT5wdCwgX19wb2xsd2FpdCk7CisJcHdxLT5wb2xsaW5nX3Rhc2sgPSBjdXJyZW50OwogCXB3cS0+ZXJyb3IgPSAwOwogCXB3cS0+dGFibGUgPSBOVUxMOwogCXB3cS0+aW5saW5lX2luZGV4ID0gMDsKIH0KLQogRVhQT1JUX1NZTUJPTChwb2xsX2luaXR3YWl0KTsKIAogc3RhdGljIHZvaWQgZnJlZV9wb2xsX2VudHJ5KHN0cnVjdCBwb2xsX3RhYmxlX2VudHJ5ICplbnRyeSkKQEAgLTE0MiwxMiArMTQyLDEwIEBACiAJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgb2xkKTsKIAl9CiB9Ci0KIEVYUE9SVF9TWU1CT0wocG9sbF9mcmVld2FpdCk7CiAKLXN0YXRpYyBzdHJ1Y3QgcG9sbF90YWJsZV9lbnRyeSAqcG9sbF9nZXRfZW50cnkocG9sbF90YWJsZSAqX3ApCitzdGF0aWMgc3RydWN0IHBvbGxfdGFibGVfZW50cnkgKnBvbGxfZ2V0X2VudHJ5KHN0cnVjdCBwb2xsX3dxdWV1ZXMgKnApCiB7Ci0Jc3RydWN0IHBvbGxfd3F1ZXVlcyAqcCA9IGNvbnRhaW5lcl9vZihfcCwgc3RydWN0IHBvbGxfd3F1ZXVlcywgcHQpOwogCXN0cnVjdCBwb2xsX3RhYmxlX3BhZ2UgKnRhYmxlID0gcC0+dGFibGU7CiAKIAlpZiAocC0+aW5saW5lX2luZGV4IDwgTl9JTkxJTkVfUE9MTF9FTlRSSUVTKQpAQCAtMTU5LDcgKzE1Nyw2IEBACiAJCW5ld190YWJsZSA9IChzdHJ1Y3QgcG9sbF90YWJsZV9wYWdlICopIF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKIAkJaWYgKCFuZXdfdGFibGUpIHsKIAkJCXAtPmVycm9yID0gLUVOT01FTTsKLQkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJCW5ld190YWJsZS0+ZW50cnkgPSBuZXdfdGFibGUtPmVudHJpZXM7CkBAIC0xNzEsMjAgKzE2OCw3NSBAQAogCXJldHVybiB0YWJsZS0+ZW50cnkrKzsKIH0KIAorc3RhdGljIGludCBwb2xsd2FrZSh3YWl0X3F1ZXVlX3QgKndhaXQsIHVuc2lnbmVkIG1vZGUsIGludCBzeW5jLCB2b2lkICprZXkpCit7CisJc3RydWN0IHBvbGxfd3F1ZXVlcyAqcHdxID0gd2FpdC0+cHJpdmF0ZTsKKwlERUNMQVJFX1dBSVRRVUVVRShkdW1teV93YWl0LCBwd3EtPnBvbGxpbmdfdGFzayk7CisKKwkvKgorCSAqIEFsdGhvdWdoIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHVuZGVyIHdhaXRxdWV1ZSBsb2NrLCBMT0NLCisJICogZG9lc24ndCBpbXBseSB3cml0ZSBiYXJyaWVyIGFuZCB0aGUgdXNlcnMgZXhwZWN0IHdyaXRlCisJICogYmFycmllciBzZW1hbnRpY3Mgb24gd2FrZXVwIGZ1bmN0aW9ucy4gIFRoZSBmb2xsb3dpbmcKKwkgKiBzbXBfd21iKCkgaXMgZXF1aXZhbGVudCB0byBzbXBfd21iKCkgaW4gdHJ5X3RvX3dha2VfdXAoKQorCSAqIGFuZCBpcyBwYWlyZWQgd2l0aCBzZXRfbWIoKSBpbiBwb2xsX3NjaGVkdWxlX3RpbWVvdXQuCisJICovCisJc21wX3dtYigpOworCXB3cS0+dHJpZ2dlcmVkID0gMTsKKworCS8qCisJICogUGVyZm9ybSB0aGUgZGVmYXVsdCB3YWtlIHVwIG9wZXJhdGlvbiB1c2luZyBhIGR1bW15CisJICogd2FpdHF1ZXVlLgorCSAqCisJICogVE9ETzogVGhpcyBpcyBoYWNreSBidXQgdGhlcmUgY3VycmVudGx5IGlzIG5vIGludGVyZmFjZSB0bworCSAqIHBhc3MgaW4gQHN5bmMuICBAc3luYyBpcyBzY2hlZHVsZWQgdG8gYmUgcmVtb3ZlZCBhbmQgb25jZQorCSAqIHRoYXQgaGFwcGVucywgd2FrZV91cF9wcm9jZXNzKCkgY2FuIGJlIHVzZWQgZGlyZWN0bHkuCisJICovCisJcmV0dXJuIGRlZmF1bHRfd2FrZV9mdW5jdGlvbigmZHVtbXlfd2FpdCwgbW9kZSwgc3luYywga2V5KTsKK30KKwogLyogQWRkIGEgbmV3IGVudHJ5ICovCiBzdGF0aWMgdm9pZCBfX3BvbGx3YWl0KHN0cnVjdCBmaWxlICpmaWxwLCB3YWl0X3F1ZXVlX2hlYWRfdCAqd2FpdF9hZGRyZXNzLAogCQkJCXBvbGxfdGFibGUgKnApCiB7Ci0Jc3RydWN0IHBvbGxfdGFibGVfZW50cnkgKmVudHJ5ID0gcG9sbF9nZXRfZW50cnkocCk7CisJc3RydWN0IHBvbGxfd3F1ZXVlcyAqcHdxID0gY29udGFpbmVyX29mKHAsIHN0cnVjdCBwb2xsX3dxdWV1ZXMsIHB0KTsKKwlzdHJ1Y3QgcG9sbF90YWJsZV9lbnRyeSAqZW50cnkgPSBwb2xsX2dldF9lbnRyeShwd3EpOwogCWlmICghZW50cnkpCiAJCXJldHVybjsKIAlnZXRfZmlsZShmaWxwKTsKIAllbnRyeS0+ZmlscCA9IGZpbHA7CiAJZW50cnktPndhaXRfYWRkcmVzcyA9IHdhaXRfYWRkcmVzczsKLQlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmZW50cnktPndhaXQsIGN1cnJlbnQpOworCWluaXRfd2FpdHF1ZXVlX2Z1bmNfZW50cnkoJmVudHJ5LT53YWl0LCBwb2xsd2FrZSk7CisJZW50cnktPndhaXQucHJpdmF0ZSA9IHB3cTsKIAlhZGRfd2FpdF9xdWV1ZSh3YWl0X2FkZHJlc3MsICZlbnRyeS0+d2FpdCk7CiB9CiAKK2ludCBwb2xsX3NjaGVkdWxlX3RpbWVvdXQoc3RydWN0IHBvbGxfd3F1ZXVlcyAqcHdxLCBpbnQgc3RhdGUsCisJCQkgIGt0aW1lX3QgKmV4cGlyZXMsIHVuc2lnbmVkIGxvbmcgc2xhY2spCit7CisJaW50IHJjID0gLUVJTlRSOworCisJc2V0X2N1cnJlbnRfc3RhdGUoc3RhdGUpOworCWlmICghcHdxLT50cmlnZ2VyZWQpCisJCXJjID0gc2NoZWR1bGVfaHJ0aW1lb3V0X3JhbmdlKGV4cGlyZXMsIHNsYWNrLCBIUlRJTUVSX01PREVfQUJTKTsKKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisKKwkvKgorCSAqIFByZXBhcmUgZm9yIHRoZSBuZXh0IGl0ZXJhdGlvbi4KKwkgKgorCSAqIFRoZSBmb2xsb3dpbmcgc2V0X21iKCkgc2VydmVzIHR3byBwdXJwb3Nlcy4gIEZpcnN0LCBpdCdzCisJICogdGhlIGNvdW50ZXJwYXJ0IHJtYiBvZiB0aGUgd21iIGluIHBvbGx3YWtlKCkgc3VjaCB0aGF0IGRhdGEKKwkgKiB3cml0dGVuIGJlZm9yZSB3YWtlIHVwIGlzIGFsd2F5cyB2aXNpYmxlIGFmdGVyIHdha2UgdXAuCisJICogU2Vjb25kLCB0aGUgZnVsbCBiYXJyaWVyIGd1YXJhbnRlZXMgdGhhdCB0cmlnZ2VyZWQgY2xlYXJpbmcKKwkgKiBkb2Vzbid0IHBhc3MgZXZlbnQgY2hlY2sgb2YgdGhlIG5leHQgaXRlcmF0aW9uLiAgTm90ZSB0aGF0CisJICogdGhpcyBwcm9ibGVtIGRvZXNuJ3QgZXhpc3QgZm9yIHRoZSBmaXJzdCBpdGVyYXRpb24gYXMKKwkgKiBhZGRfd2FpdF9xdWV1ZSgpIGhhcyBmdWxsIGJhcnJpZXIgc2VtYW50aWNzLgorCSAqLworCXNldF9tYihwd3EtPnRyaWdnZXJlZCwgMCk7CisKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MKHBvbGxfc2NoZWR1bGVfdGltZW91dCk7CisKIC8qKgogICogcG9sbF9zZWxlY3Rfc2V0X3RpbWVvdXQgLSBoZWxwZXIgZnVuY3Rpb24gdG8gc2V0dXAgdGhlIHRpbWVvdXQgdmFsdWUKICAqIEB0bzoJCXBvaW50ZXIgdG8gdGltZXNwZWMgdmFyaWFibGUgZm9yIHRoZSBmaW5hbCB0aW1lb3V0CkBAIC0zNDAsOCArMzkyLDYgQEAKIAlmb3IgKDs7KSB7CiAJCXVuc2lnbmVkIGxvbmcgKnJpbnAsICpyb3V0cCwgKnJleHAsICppbnAsICpvdXRwLCAqZXhwOwogCi0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0KIAkJaW5wID0gZmRzLT5pbjsgb3V0cCA9IGZkcy0+b3V0OyBleHAgPSBmZHMtPmV4OwogCQlyaW5wID0gZmRzLT5yZXNfaW47IHJvdXRwID0gZmRzLT5yZXNfb3V0OyByZXhwID0gZmRzLT5yZXNfZXg7CiAKQEAgLTQxMSwxMCArNDYxLDEwIEBACiAJCQl0byA9ICZleHBpcmU7CiAJCX0KIAotCQlpZiAoIXNjaGVkdWxlX2hydGltZW91dF9yYW5nZSh0bywgc2xhY2ssIEhSVElNRVJfTU9ERV9BQlMpKQorCQlpZiAoIXBvbGxfc2NoZWR1bGVfdGltZW91dCgmdGFibGUsIFRBU0tfSU5URVJSVVBUSUJMRSwKKwkJCQkJICAgdG8sIHNsYWNrKSkKIAkJCXRpbWVkX291dCA9IDE7CiAJfQotCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIAogCXBvbGxfZnJlZXdhaXQoJnRhYmxlKTsKIApAQCAtNjY2LDcgKzcxNiw2IEBACiAJZm9yICg7OykgewogCQlzdHJ1Y3QgcG9sbF9saXN0ICp3YWxrOwogCi0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJCWZvciAod2FsayA9IGxpc3Q7IHdhbGsgIT0gTlVMTDsgd2FsayA9IHdhbGstPm5leHQpIHsKIAkJCXN0cnVjdCBwb2xsZmQgKiBwZmQsICogcGZkX2VuZDsKIApAQCAtNzA5LDEwICs3NTgsOSBAQAogCQkJdG8gPSAmZXhwaXJlOwogCQl9CiAKLQkJaWYgKCFzY2hlZHVsZV9ocnRpbWVvdXRfcmFuZ2UodG8sIHNsYWNrLCBIUlRJTUVSX01PREVfQUJTKSkKKwkJaWYgKCFwb2xsX3NjaGVkdWxlX3RpbWVvdXQod2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFLCB0bywgc2xhY2spKQogCQkJdGltZWRfb3V0ID0gMTsKIAl9Ci0JX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwogCXJldHVybiBjb3VudDsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvc3BsaWNlLmMgYi9mcy9zcGxpY2UuYwppbmRleCAxYWJhYjVjLi5hNTRiM2UzIDEwMDY0NAotLS0gYS9mcy9zcGxpY2UuYworKysgYi9mcy9zcGxpY2UuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvc3BsaWNlLmg+CisjaW5jbHVkZSA8bGludXgvbWVtY29udHJvbC5oPgogI2luY2x1ZGUgPGxpbnV4L21tX2lubGluZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KZGlmZiAtLWdpdCBhL2ZzL3N0YXQuYyBiL2ZzL3N0YXQuYwppbmRleCA3YzQ2ZmJlLi43ZTEyYTZmOCAxMDA2NDQKLS0tIGEvZnMvc3RhdC5jCisrKyBiL2ZzL3N0YXQuYwpAQCAtMzA1LDcgKzMwNSw3IEBACiAJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAogCQllcnJvciA9IC1FSU5WQUw7Ci0JCWlmIChpbm9kZS0+aV9vcCAmJiBpbm9kZS0+aV9vcC0+cmVhZGxpbmspIHsKKwkJaWYgKGlub2RlLT5pX29wLT5yZWFkbGluaykgewogCQkJZXJyb3IgPSBzZWN1cml0eV9pbm9kZV9yZWFkbGluayhwYXRoLmRlbnRyeSk7CiAJCQlpZiAoIWVycm9yKSB7CiAJCQkJdG91Y2hfYXRpbWUocGF0aC5tbnQsIHBhdGguZGVudHJ5KTsKZGlmZiAtLWdpdCBhL2ZzL3N1cGVyLmMgYi9mcy9zdXBlci5jCmluZGV4IGRkYmEwNjkuLmVkMDgwYzQgMTAwNjQ0Ci0tLSBhL2ZzL3N1cGVyLmMKKysrIGIvZnMvc3VwZXIuYwpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9hc3luYy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIApAQCAtNzEsNiArNzIsNyBAQAogCQlJTklUX0hMSVNUX0hFQUQoJnMtPnNfYW5vbik7CiAJCUlOSVRfTElTVF9IRUFEKCZzLT5zX2lub2Rlcyk7CiAJCUlOSVRfTElTVF9IRUFEKCZzLT5zX2RlbnRyeV9scnUpOworCQlJTklUX0xJU1RfSEVBRCgmcy0+c19hc3luY19saXN0KTsKIAkJaW5pdF9yd3NlbSgmcy0+c191bW91bnQpOwogCQltdXRleF9pbml0KCZzLT5zX2xvY2spOwogCQlsb2NrZGVwX3NldF9jbGFzcygmcy0+c191bW91bnQsICZ0eXBlLT5zX3Vtb3VudF9rZXkpOwpAQCAtMjg5LDExICsyOTEsMTggQEAKIHsKIAljb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyAqc29wID0gc2ItPnNfb3A7CiAKKwogCWlmIChzYi0+c19yb290KSB7CiAJCXNocmlua19kY2FjaGVfZm9yX3Vtb3VudChzYik7CiAJCWZzeW5jX3N1cGVyKHNiKTsKIAkJbG9ja19zdXBlcihzYik7CiAJCXNiLT5zX2ZsYWdzICY9IH5NU19BQ1RJVkU7CisKKwkJLyoKKwkJICogd2FpdCBmb3IgYXN5bmNocm9ub3VzIGZzIG9wZXJhdGlvbnMgdG8gZmluaXNoIGJlZm9yZSBnb2luZyBmdXJ0aGVyCisJCSAqLworCQlhc3luY19zeW5jaHJvbml6ZV9mdWxsX3NwZWNpYWwoJnNiLT5zX2FzeW5jX2xpc3QpOworCiAJCS8qIGJhZCBuYW1lIC0gaXQgc2hvdWxkIGJlIGV2aWN0X2lub2RlcygpICovCiAJCWludmFsaWRhdGVfaW5vZGVzKHNiKTsKIAkJbG9ja19rZXJuZWwoKTsKQEAgLTQ2MSw2ICs0NzAsNyBAQAogCQlzYi0+c19jb3VudCsrOwogCQlzcGluX3VubG9jaygmc2JfbG9jayk7CiAJCWRvd25fcmVhZCgmc2ItPnNfdW1vdW50KTsKKwkJYXN5bmNfc3luY2hyb25pemVfZnVsbF9zcGVjaWFsKCZzYi0+c19hc3luY19saXN0KTsKIAkJaWYgKHNiLT5zX3Jvb3QgJiYgKHdhaXQgfHwgc2ItPnNfZGlydCkpCiAJCQlzYi0+c19vcC0+c3luY19mcyhzYiwgd2FpdCk7CiAJCXVwX3JlYWQoJnNiLT5zX3Vtb3VudCk7CkBAIC04MDAsNiArODEwLDcgQEAKIAkJfQogCiAJCXMtPnNfZmxhZ3MgfD0gTVNfQUNUSVZFOworCQliZGV2LT5iZF9zdXBlciA9IHM7CiAJfQogCiAJcmV0dXJuIHNpbXBsZV9zZXRfbW50KG1udCwgcyk7CkBAIC04MTksNiArODMwLDcgQEAKIAlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gc2ItPnNfYmRldjsKIAlmbW9kZV90IG1vZGUgPSBzYi0+c19tb2RlOwogCisJYmRldi0+YmRfc3VwZXIgPSAwOwogCWdlbmVyaWNfc2h1dGRvd25fc3VwZXIoc2IpOwogCXN5bmNfYmxvY2tkZXYoYmRldik7CiAJY2xvc2VfYmRldl9leGNsdXNpdmUoYmRldiwgbW9kZSk7CmRpZmYgLS1naXQgYS9mcy9zeW5jLmMgYi9mcy9zeW5jLmMKaW5kZXggMjk2NzU2Mi4uYWMwMmI1NiAxMDA2NDQKLS0tIGEvZnMvc3luYy5jCisrKyBiL2ZzL3N5bmMuYwpAQCAtNzUsMTQgKzc1LDM5IEBACiAJcmV0dXJuIHJldDsKIH0KIAotbG9uZyBkb19mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGRhdGFzeW5jKQorLyoqCisgKiB2ZnNfZnN5bmMgLSBwZXJmb3JtIGEgZnN5bmMgb3IgZmRhdGFzeW5jIG9uIGEgZmlsZQorICogQGZpbGU6CQlmaWxlIHRvIHN5bmMKKyAqIEBkZW50cnk6CQlkZW50cnkgb2YgQGZpbGUKKyAqIEBkYXRhOgkJb25seSBwZXJmb3JtIGEgZmRhdGFzeW5jIG9wZXJhdGlvbgorICoKKyAqIFdyaXRlIGJhY2sgZGF0YSBhbmQgbWV0YWRhdGEgZm9yIEBmaWxlIHRvIGRpc2suICBJZiBAZGF0YXN5bmMgaXMKKyAqIHNldCBvbmx5IG1ldGFkYXRhIG5lZWRlZCB0byBhY2Nlc3MgbW9kaWZpZWQgZmlsZSBkYXRhIGlzIHdyaXR0ZW4uCisgKgorICogSW4gY2FzZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIG5mc2QgQGZpbGUgbWF5IGJlICVOVUxMIGFuZAorICogb25seSBAZGVudHJ5IGlzIHNldC4gIFRoaXMgY2FuIG9ubHkgaGFwcGVuIHdoZW4gdGhlIGZpbGVzeXN0ZW0KKyAqIGltcGxlbWVudHMgdGhlIGV4cG9ydF9vcGVyYXRpb25zIEFQSS4KKyAqLworaW50IHZmc19mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgZGF0YXN5bmMpCiB7Ci0JaW50IHJldDsKLQlpbnQgZXJyOwotCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZmlsZS0+Zl9tYXBwaW5nOworCWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcDsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKKwlpbnQgZXJyLCByZXQ7CiAKLQlpZiAoIWZpbGUtPmZfb3AgfHwgIWZpbGUtPmZfb3AtPmZzeW5jKSB7Ci0JCS8qIFdoeT8gIFdlIGNhbiBzdGlsbCBjYWxsIGZpbGVtYXBfZmRhdGF3cml0ZSAqLworCS8qCisJICogR2V0IG1hcHBpbmcgYW5kIG9wZXJhdGlvbnMgZnJvbSB0aGUgZmlsZSBpbiBjYXNlIHdlIGhhdmUKKwkgKiBhcyBmaWxlLCBvciBnZXQgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGVtIGluIGNhc2Ugd2UKKwkgKiBkb24ndCBoYXZlIGEgc3RydWN0IGZpbGUgYXZhaWxhYmxlLiAgRGFtbiBuZnNkLi4KKwkgKi8KKwlpZiAoZmlsZSkgeworCQltYXBwaW5nID0gZmlsZS0+Zl9tYXBwaW5nOworCQlmb3AgPSBmaWxlLT5mX29wOworCX0gZWxzZSB7CisJCW1hcHBpbmcgPSBkZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZzsKKwkJZm9wID0gZGVudHJ5LT5kX2lub2RlLT5pX2ZvcDsKKwl9CisKKwlpZiAoIWZvcCB8fCAhZm9wLT5mc3luYykgewogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CkBAIC05NCw3ICsxMTksNyBAQAogCSAqIGxpdmVsb2NrcyBpbiBmc3luY19idWZmZXJzX2xpc3QoKS4KIAkgKi8KIAltdXRleF9sb2NrKCZtYXBwaW5nLT5ob3N0LT5pX211dGV4KTsKLQllcnIgPSBmaWxlLT5mX29wLT5mc3luYyhmaWxlLCBmaWxlLT5mX3BhdGguZGVudHJ5LCBkYXRhc3luYyk7CisJZXJyID0gZm9wLT5mc3luYyhmaWxlLCBkZW50cnksIGRhdGFzeW5jKTsKIAlpZiAoIXJldCkKIAkJcmV0ID0gZXJyOwogCW11dGV4X3VubG9jaygmbWFwcGluZy0+aG9zdC0+aV9tdXRleCk7CkBAIC0xMDQsMTUgKzEyOSwxNiBAQAogb3V0OgogCXJldHVybiByZXQ7CiB9CitFWFBPUlRfU1lNQk9MKHZmc19mc3luYyk7CiAKLXN0YXRpYyBsb25nIF9fZG9fZnN5bmModW5zaWduZWQgaW50IGZkLCBpbnQgZGF0YXN5bmMpCitzdGF0aWMgaW50IGRvX2ZzeW5jKHVuc2lnbmVkIGludCBmZCwgaW50IGRhdGFzeW5jKQogewogCXN0cnVjdCBmaWxlICpmaWxlOwogCWludCByZXQgPSAtRUJBREY7CiAKIAlmaWxlID0gZmdldChmZCk7CiAJaWYgKGZpbGUpIHsKLQkJcmV0ID0gZG9fZnN5bmMoZmlsZSwgZGF0YXN5bmMpOworCQlyZXQgPSB2ZnNfZnN5bmMoZmlsZSwgZmlsZS0+Zl9wYXRoLmRlbnRyeSwgZGF0YXN5bmMpOwogCQlmcHV0KGZpbGUpOwogCX0KIAlyZXR1cm4gcmV0OwpAQCAtMTIwLDEyICsxNDYsMTIgQEAKIAogYXNtbGlua2FnZSBsb25nIHN5c19mc3luYyh1bnNpZ25lZCBpbnQgZmQpCiB7Ci0JcmV0dXJuIF9fZG9fZnN5bmMoZmQsIDApOworCXJldHVybiBkb19mc3luYyhmZCwgMCk7CiB9CiAKIGFzbWxpbmthZ2UgbG9uZyBzeXNfZmRhdGFzeW5jKHVuc2lnbmVkIGludCBmZCkKIHsKLQlyZXR1cm4gX19kb19mc3luYyhmZCwgMSk7CisJcmV0dXJuIGRvX2ZzeW5jKGZkLCAxKTsKIH0KIAogLyoKQEAgLTI2OSw3ICsyOTUsNyBAQAogCiAJaWYgKGZsYWdzICYgU1lOQ19GSUxFX1JBTkdFX1dSSVRFKSB7CiAJCXJldCA9IF9fZmlsZW1hcF9mZGF0YXdyaXRlX3JhbmdlKG1hcHBpbmcsIG9mZnNldCwgZW5kYnl0ZSwKLQkJCQkJCVdCX1NZTkNfTk9ORSk7CisJCQkJCQlXQl9TWU5DX0FMTCk7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBvdXQ7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvaW5vZGUuYyBiL2ZzL3N5c2ZzL2lub2RlLmMKaW5kZXggZWI1M2M2My4uZGZhM2Q5NCAxMDA2NDQKLS0tIGEvZnMvc3lzZnMvaW5vZGUuYworKysgYi9mcy9zeXNmcy9pbm9kZS5jCkBAIC0xMDcsOCArMTA3LDYgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZGVmYXVsdF9pbm9kZV9hdHRyKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBtb2RlX3QgbW9kZSkKIHsKIAlpbm9kZS0+aV9tb2RlID0gbW9kZTsKLQlpbm9kZS0+aV91aWQgPSAwOwotCWlub2RlLT5pX2dpZCA9IDA7CiAJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogfQogCkBAIC0xNDksNyArMTQ3LDYgQEAKIHsKIAlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHI7CiAKLQlpbm9kZS0+aV9ibG9ja3MgPSAwOwogCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJnN5c2ZzX2FvcHM7CiAJaW5vZGUtPmlfbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbyA9ICZzeXNmc19iYWNraW5nX2Rldl9pbmZvOwogCWlub2RlLT5pX29wID0gJnN5c2ZzX2lub2RlX29wZXJhdGlvbnM7CmRpZmYgLS1naXQgYS9mcy91Ymlmcy9LY29uZmlnIGIvZnMvdWJpZnMvS2NvbmZpZwppbmRleCA5MWNlZWRhLi5lMzViNTRkIDEwMDY0NAotLS0gYS9mcy91Ymlmcy9LY29uZmlnCisrKyBiL2ZzL3ViaWZzL0tjb25maWcKQEAgLTQwLDcgKzQwLDcgQEAKIAlkZXBlbmRzIG9uIFVCSUZTX0ZTCiAJZGVmYXVsdCB5CiAJaGVscAotCSAgWmxpYiBjb3ByZXNzZXMgYmV0dGVyIHRoZW4gTFpPIGJ1dCBpdCBpcyBzbG93ZXIuIFNheSAnWScgaWYgdW5zdXJlLgorCSAgWmxpYiBjb21wcmVzc2VzIGJldHRlciB0aGFuIExaTyBidXQgaXQgaXMgc2xvd2VyLiBTYXkgJ1knIGlmIHVuc3VyZS4KIAogIyBEZWJ1Z2dpbmctcmVsYXRlZCBzdHVmZgogY29uZmlnIFVCSUZTX0ZTX0RFQlVHCmRpZmYgLS1naXQgYS9mcy91Ymlmcy9idWRnZXQuYyBiL2ZzL3ViaWZzL2J1ZGdldC5jCmluZGV4IDBlNWU1NGQuLjE3NWY5YzUgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL2J1ZGdldC5jCisrKyBiL2ZzL3ViaWZzL2J1ZGdldC5jCkBAIC0xNDIsNyArMTQyLDcgQEAKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGFuIG9wZXJhdGlvbiBjYW5ub3QgYmUgYnVkZ2V0ZWQgYmVjYXVzZSB0aGVyZQogICogaXMgc3VwcG9zZWRseSBubyBmcmVlIHNwYWNlLiBCdXQgaW4gbW9zdCBjYXNlcyB0aGVyZSBpcyBzb21lIGZyZWUgc3BhY2U6Ci0gKiAgIG8gYnVkZ2V0aW5nIGlzIHBlc3NpbWlzdGljLCBzbyBpdCBhbHdheXMgYnVkZ2V0cyBtb3JlIHRoZW4gaXQgaXMgYWN0dWFsbHkKKyAqICAgbyBidWRnZXRpbmcgaXMgcGVzc2ltaXN0aWMsIHNvIGl0IGFsd2F5cyBidWRnZXRzIG1vcmUgdGhhbiBpdCBpcyBhY3R1YWxseQogICogICAgIG5lZWRlZCwgc28gc2hyaW5raW5nIHRoZSBsaWFiaWxpdHkgaXMgb25lIHdheSB0byBtYWtlIGZyZWUgc3BhY2UgLSB0aGUKICAqICAgICBjYWNoZWQgZGF0YSB3aWxsIHRha2UgbGVzcyBzcGFjZSB0aGVuIGl0IHdhcyBidWRnZXRlZCBmb3I7CiAgKiAgIG8gR0MgbWF5IHR1cm4gc29tZSBkYXJrIHNwYWNlIGludG8gZnJlZSBzcGFjZSAoYnVkZ2V0aW5nIHRyZWF0cyBkYXJrIHNwYWNlCkBAIC02MDYsNyArNjA2LDcgQEAKICAqIEBjOiBVQklGUyBmaWxlLXN5c3RlbSBkZXNjcmlwdGlvbiBvYmplY3QKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGJ1ZGdldCB3aGljaCB3YXMgYWxsb2NhdGVkIGZvciBhIG5ldyBwYWdlIG9mIGRhdGEgdG8KLSAqIHRoZSBidWRnZXQgb2YgY2hhbmdpbmcgYW4gZXhpc3RpbmcgcGFnZSBvZiBkYXRhLiBUaGUgbGF0dGVyIGlzIHNtYWxsZXIgdGhlbgorICogdGhlIGJ1ZGdldCBvZiBjaGFuZ2luZyBhbiBleGlzdGluZyBwYWdlIG9mIGRhdGEuIFRoZSBsYXR0ZXIgaXMgc21hbGxlciB0aGFuCiAgKiB0aGUgZm9ybWVyLCBzbyB0aGlzIGZ1bmN0aW9uIG9ubHkgZG9lcyBzaW1wbGUgcmUtY2FsY3VsYXRpb24gYW5kIGRvZXMgbm90CiAgKiBpbnZvbHZlIGFueSB3cml0ZS1iYWNrLgogICovCmRpZmYgLS1naXQgYS9mcy91Ymlmcy9nYy5jIGIvZnMvdWJpZnMvZ2MuYwppbmRleCAwYmVmNjUwLi45ODMyZjlhIDEwMDY0NAotLS0gYS9mcy91Ymlmcy9nYy5jCisrKyBiL2ZzL3ViaWZzL2djLmMKQEAgLTQ1LDcgKzQ1LDcgQEAKICNkZWZpbmUgU01BTExfTk9ERV9XTSAgVUJJRlNfTUFYX0RFTlRfTk9ERV9TWgogCiAvKgotICogR0MgbWF5IG5lZWQgdG8gbW92ZSBtb3JlIHRoZW4gb25lIExFQiB0byBtYWtlIHByb2dyZXNzLiBUaGUgYmVsb3cgY29uc3RhbnRzCisgKiBHQyBtYXkgbmVlZCB0byBtb3ZlIG1vcmUgdGhhbiBvbmUgTEVCIHRvIG1ha2UgcHJvZ3Jlc3MuIFRoZSBiZWxvdyBjb25zdGFudHMKICAqIGRlZmluZSAic29mdCIgYW5kICJoYXJkIiBsaW1pdHMgb24gdGhlIG51bWJlciBvZiBMRUJzIHRoZSBnYXJiYWdlIGNvbGxlY3RvcgogICogbWF5IG1vdmUuCiAgKi8KZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL2pvdXJuYWwuYyBiL2ZzL3ViaWZzL2pvdXJuYWwuYwppbmRleCAxMGFlMjViLi45YjdjNTRlIDEwMDY0NAotLS0gYS9mcy91Ymlmcy9qb3VybmFsLmMKKysrIGIvZnMvdWJpZnMvam91cm5hbC5jCkBAIC0xOTEsNyArMTkxLDcgQEAKIAlpZiAod2J1Zi0+bG51bSAhPSAtMSAmJiBhdmFpbCA+PSBsZW4pIHsKIAkJLyoKIAkJICogU29tZW9uZSBlbHNlIGhhcyBzd2l0Y2hlZCB0aGUgam91cm5hbCBoZWFkIGFuZCB3ZSBoYXZlCi0JCSAqIGVub3VnaCBzcGFjZSBub3cuIFRoaXMgaGFwcGVucyB3aGVuIG1vcmUgdGhlbiBvbmUgcHJvY2VzcyBpcworCQkgKiBlbm91Z2ggc3BhY2Ugbm93LiBUaGlzIGhhcHBlbnMgd2hlbiBtb3JlIHRoYW4gb25lIHByb2Nlc3MgaXMKIAkJICogdHJ5aW5nIHRvIHdyaXRlIHRvIHRoZSBzYW1lIGpvdXJuYWwgaGVhZCBhdCB0aGUgc2FtZSB0aW1lLgogCQkgKi8KIAkJZGJnX2pubCgicmV0dXJuIExFQiAlZCBiYWNrLCBhbHJlYWR5IGhhdmUgTEVCICVkOiVkIiwKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL3Nocmlua2VyLmMgYi9mcy91Ymlmcy9zaHJpbmtlci5jCmluZGV4IGYyNDg1MzMuLmU3YmFiNTIgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL3Nocmlua2VyLmMKKysrIGIvZnMvdWJpZnMvc2hyaW5rZXIuYwpAQCAtMTUxLDcgKzE1MSw3IEBACiAgKiBAY29udGVudGlvbjogaWYgYW55IGNvbnRlbnRpb24sIHRoaXMgaXMgc2V0IHRvICUxCiAgKgogICogVGhpcyBmdW5jdGlvbiB3YWxrcyB0aGUgbGlzdCBvZiBtb3VudGVkIFVCSUZTIGZpbGUtc3lzdGVtcyBhbmQgZnJlZXMgY2xlYW4KLSAqIHpub2RlcyB3aGljaCBhcmUgb2xkZXIgdGhlbiBAYWdlLCB1bnRpbCBhdCBsZWFzdCBAbnIgem5vZGVzIGFyZSBmcmVlZC4KKyAqIHpub2RlcyB3aGljaCBhcmUgb2xkZXIgdGhhbiBAYWdlLCB1bnRpbCBhdCBsZWFzdCBAbnIgem5vZGVzIGFyZSBmcmVlZC4KICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBmcmVlZCB6bm9kZXMuCiAgKi8KIHN0YXRpYyBpbnQgc2hyaW5rX3RuY190cmVlcyhpbnQgbnIsIGludCBhZ2UsIGludCAqY29udGVudGlvbikKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL3N1cGVyLmMgYi9mcy91Ymlmcy9zdXBlci5jCmluZGV4IDBkNzU2NGIuLjg5NTU2ZWUgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL3N1cGVyLmMKKysrIGIvZnMvdWJpZnMvc3VwZXIuYwpAQCAtNDMyLDEyICs0MzIsMTkgQEAKIAlpbnQgaSwgZXJyOwogCXN0cnVjdCB1Ymlmc19pbmZvICpjID0gc2ItPnNfZnNfaW5mbzsKIAlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgd2JjID0gewotCQkuc3luY19tb2RlICAgPSB3YWl0ID8gV0JfU1lOQ19BTEwgOiBXQl9TWU5DX0hPTEQsCisJCS5zeW5jX21vZGUgICA9IHdhaXQgPyBXQl9TWU5DX0FMTCA6IFdCX1NZTkNfTk9ORSwKIAkJLnJhbmdlX3N0YXJ0ID0gMCwKIAkJLnJhbmdlX2VuZCAgID0gTExPTkdfTUFYLAogCQkubnJfdG9fd3JpdGUgPSBMT05HX01BWCwKIAl9OwogCisJLyoKKwkgKiBOb3RlIGJ5IGFrcG0gYWJvdXQgV0JfU1lOQ19OT05FIHVzZWQgYWJvdmU6IHplcm8gQHdhaXQgaXMganVzdCBhbgorCSAqIGFkdmlzb3J5IHRoaW5nIHRvIGhlbHAgdGhlIGZpbGUgc3lzdGVtIHNob3ZlIGxvdHMgb2YgZGF0YSBpbnRvIHRoZQorCSAqIHF1ZXVlcy4gSWYgc29tZSBnZXRzIG1pc3NlZCB0aGVuIGl0J2xsIGJlIHBpY2tlZCB1cCBvbiB0aGUgc2Vjb25kCisJICogJy0+c3luY19mcygpJyBjYWxsLCB3aXRoIG5vbi16ZXJvIEB3YWl0LgorCSAqLworCiAJaWYgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKQogCQlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvZnMveGF0dHIuYyBiL2ZzL3hhdHRyLmMKaW5kZXggNDY4Mzc3ZS4uMjM3ODA0YyAxMDA2NDQKLS0tIGEvZnMveGF0dHIuYworKysgYi9mcy94YXR0ci5jCkBAIC0xNzUsNyArMTc1LDcgQEAKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIAllcnJvciA9IC1FT1BOT1RTVVBQOwotCWlmIChkLT5kX2lub2RlLT5pX29wICYmIGQtPmRfaW5vZGUtPmlfb3AtPmxpc3R4YXR0cikgeworCWlmIChkLT5kX2lub2RlLT5pX29wLT5saXN0eGF0dHIpIHsKIAkJZXJyb3IgPSBkLT5kX2lub2RlLT5pX29wLT5saXN0eGF0dHIoZCwgbGlzdCwgc2l6ZSk7CiAJfSBlbHNlIHsKIAkJZXJyb3IgPSBzZWN1cml0eV9pbm9kZV9saXN0c2VjdXJpdHkoZC0+ZF9pbm9kZSwgbGlzdCwgc2l6ZSk7CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuYwppbmRleCAzNmY2Y2M3Li5iZTg0NmQ2IDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMKQEAgLTEzNDgsNyArMTM0OCw3IEBACiB7CiAJaW50CQkJcm9ubHkgPSAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfUkRPTkxZKTsKIAotCS8qIEZhaWwgYSBtb3VudCB3aGVyZSB0aGUgbG9nYnVmIGlzIHNtYWxsZXIgdGhlbiB0aGUgbG9nIHN0cmlwZSAqLworCS8qIEZhaWwgYSBtb3VudCB3aGVyZSB0aGUgbG9nYnVmIGlzIHNtYWxsZXIgdGhhbiB0aGUgbG9nIHN0cmlwZSAqLwogCWlmICh4ZnNfc2JfdmVyc2lvbl9oYXNsb2d2MigmbXAtPm1fc2IpKSB7CiAJCWlmIChtcC0+bV9sb2dic2l6ZSA8PSAwICYmCiAJCSAgICBtcC0+bV9zYi5zYl9sb2dzdW5pdCA+IFhMT0dfQklHX1JFQ09SRF9CU0laRSkgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjbWFjcm9zLmggYi9pbmNsdWRlL2FjcGkvYWNtYWNyb3MuaAppbmRleCBhNTk3MjA3Li4xOTU0YzlkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNtYWNyb3MuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNtYWNyb3MuaApAQCAtMzMzLDggKzMzMyw4IEBACiAjZGVmaW5lIEFDUElfSU5TRVJUX0JJVFModGFyZ2V0LCBtYXNrLCBzb3VyY2UpICAgICAgICAgIHRhcmdldCA9ICgodGFyZ2V0ICYgKH4obWFzaykpKSB8IChzb3VyY2UgJiBtYXNrKSkKIAogLyoKLSAqIEFuIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlIGNhbiBhcHBlYXIgaW4gc29tZSBjb250ZXh0cwotICogd2hlcmUgYSBwb2ludGVyIHRvIGFuIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgY2FuIGFsc28KKyAqIEEgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgY2FuIGFwcGVhciBpbiBzb21lIGNvbnRleHRzCisgKiB3aGVyZSBhIHBvaW50ZXIgdG8gYSB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0IGNhbiBhbHNvCiAgKiBhcHBlYXIuIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBkaXN0aW5ndWlzaCB0aGVtLgogICoKICAqIFRoZSAiRGVzY3JpcHRvciIgZmllbGQgaXMgdGhlIGZpcnN0IGZpZWxkIGluIGJvdGggc3RydWN0dXJlcy4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3R5cGVzLmggYi9pbmNsdWRlL2FjcGkvYWN0eXBlcy5oCmluZGV4IDcyMjAzNjEuLjgyMjJlOGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3R5cGVzLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjdHlwZXMuaApAQCAtNDY3LDcgKzQ2Nyw3IEBACiAKIC8qCiAgKiBUaGVzZSBhcmUgc3BlY2lhbCBvYmplY3QgdHlwZXMgdGhhdCBuZXZlciBhcHBlYXIgaW4KLSAqIGEgTmFtZXNwYWNlIG5vZGUsIG9ubHkgaW4gYW4gdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdAorICogYSBOYW1lc3BhY2Ugbm9kZSwgb25seSBpbiBhIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QKICAqLwogI2RlZmluZSBBQ1BJX1RZUEVfTE9DQUxfRVhUUkEgICAgICAgICAgIDB4MUMKICNkZWZpbmUgQUNQSV9UWVBFX0xPQ0FMX0RBVEEgICAgICAgICAgICAweDFECmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvS2J1aWxkIGIvaW5jbHVkZS9hc20tZnJ2L0tidWlsZAppbmRleCAwZjg5NTZkLi4xZjQ0ZTdjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1mcnYvS2J1aWxkCisrKyBiL2luY2x1ZGUvYXNtLWZydi9LYnVpbGQKQEAgLTMsMyArMyw0IEBACiBoZWFkZXIteSArPSByZWdpc3RlcnMuaAogCiB1bmlmZGVmLXkgKz0gdGVybWlvcy5oCit1bmlmZGVmLXkgKz0gc3dhYi5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvYXRvbWljLmggYi9pbmNsdWRlL2FzbS1mcnYvYXRvbWljLmgKaW5kZXggNDZkNjk2Yi4uMjk2YzM1YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZnJ2L2F0b21pYy5oCisrKyBiL2luY2x1ZGUvYXNtLWZydi9hdG9taWMuaApAQCAtMzUsMTAgKzM1LDYgQEAKICNkZWZpbmUgc21wX21iX19iZWZvcmVfYXRvbWljX2luYygpCWJhcnJpZXIoKQogI2RlZmluZSBzbXBfbWJfX2FmdGVyX2F0b21pY19pbmMoKQliYXJyaWVyKCkKIAotdHlwZWRlZiBzdHJ1Y3QgewotCWludCBjb3VudGVyOwotfSBhdG9taWNfdDsKLQogI2RlZmluZSBBVE9NSUNfSU5JVChpKQkJeyAoaSkgfQogI2RlZmluZSBhdG9taWNfcmVhZCh2KQkJKCh2KS0+Y291bnRlcikKICNkZWZpbmUgYXRvbWljX3NldCh2LCBpKQkoKCh2KS0+Y291bnRlcikgPSAoaSkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvYnl0ZW9yZGVyLmggYi9pbmNsdWRlL2FzbS1mcnYvYnl0ZW9yZGVyLmgKaW5kZXggNDExYmVjMy4uMTE4N2U1MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZnJ2L2J5dGVvcmRlci5oCisrKyBiL2luY2x1ZGUvYXNtLWZydi9ieXRlb3JkZXIuaApAQCAtMSwxMyArMSw3IEBACiAjaWZuZGVmIF9BU01fQllURU9SREVSX0gKICNkZWZpbmUgX0FTTV9CWVRFT1JERVJfSAogCi0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+Ci0KLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pIHx8IGRlZmluZWQoX19LRVJORUxfXykKLSMgIGRlZmluZSBfX0JZVEVPUkRFUl9IQVNfVTY0X18KLSMgIGRlZmluZSBfX1NXQUJfNjRfVEhSVV8zMl9fCi0jZW5kaWYKLQorI2luY2x1ZGUgPGFzbS9zd2FiLmg+CiAjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2JpZ19lbmRpYW4uaD4KIAogI2VuZGlmIC8qIF9BU01fQllURU9SREVSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWZydi9zd2FiLmggYi9pbmNsdWRlL2FzbS1mcnYvc3dhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYjMzOTYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1mcnYvc3dhYi5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgX0FTTV9TV0FCX0gKKyNkZWZpbmUgX0FTTV9TV0FCX0gKKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSB8fCBkZWZpbmVkKF9fS0VSTkVMX18pCisjICBkZWZpbmUgX19TV0FCXzY0X1RIUlVfMzJfXworI2VuZGlmCisKKyNlbmRpZiAvKiBfQVNNX1NXQUJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9idWcuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvYnVnLmgKaW5kZXggOGFmMjc2My4uMzdiODJjYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9idWcuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL2J1Zy5oCkBAIC0yOCw2ICsyOCwxNyBAQAogI2RlZmluZSBCVUdGTEFHX1dBUk5JTkcJKDE8PDApCiAjZW5kaWYJLyogQ09ORklHX0dFTkVSSUNfQlVHICovCiAKKy8qCisgKiBEb24ndCB1c2UgQlVHKCkgb3IgQlVHX09OKCkgdW5sZXNzIHRoZXJlJ3MgcmVhbGx5IG5vIHdheSBvdXQ7IG9uZQorICogZXhhbXBsZSBtaWdodCBiZSBkZXRlY3RpbmcgZGF0YSBzdHJ1Y3R1cmUgY29ycnVwdGlvbiBpbiB0aGUgbWlkZGxlCisgKiBvZiBhbiBvcGVyYXRpb24gdGhhdCBjYW4ndCBiZSBiYWNrZWQgb3V0IG9mLiAgSWYgdGhlIChzdWIpc3lzdGVtCisgKiBjYW4gc29tZWhvdyBjb250aW51ZSBvcGVyYXRpbmcsIHBlcmhhcHMgd2l0aCByZWR1Y2VkIGZ1bmN0aW9uYWxpdHksCisgKiBpdCdzIHByb2JhYmx5IG5vdCBCVUctd29ydGh5LgorICoKKyAqIElmIHlvdSdyZSB0ZW1wdGVkIHRvIEJVRygpLCB0aGluayBhZ2FpbjogIGlzIGNvbXBsZXRlbHkgZ2l2aW5nIHVwCisgKiByZWFsbHkgdGhlICpvbmx5KiBzb2x1dGlvbj8gIFRoZXJlIGFyZSB1c3VhbGx5IGJldHRlciBvcHRpb25zLCB3aGVyZQorICogdXNlcnMgZG9uJ3QgbmVlZCB0byByZWJvb3QgQVNBUCBhbmQgY2FuIG1vc3RseSBzaHV0IGRvd24gY2xlYW5seS4KKyAqLwogI2lmbmRlZiBIQVZFX0FSQ0hfQlVHCiAjZGVmaW5lIEJVRygpIGRvIHsgXAogCXByaW50aygiQlVHOiBmYWlsdXJlIGF0ICVzOiVkLyVzKCkhXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsgXApAQCAtMzksNiArNTAsMTIgQEAKICNkZWZpbmUgQlVHX09OKGNvbmRpdGlvbikgZG8geyBpZiAodW5saWtlbHkoY29uZGl0aW9uKSkgQlVHKCk7IH0gd2hpbGUoMCkKICNlbmRpZgogCisvKgorICogV0FSTigpLCBXQVJOX09OKCksIFdBUk5fT05fT05DRSwgYW5kIHNvIG9uIGNhbiBiZSB1c2VkIHRvIHJlcG9ydAorICogc2lnbmlmaWNhbnQgaXNzdWVzIHRoYXQgbmVlZCBwcm9tcHQgYXR0ZW50aW9uIGlmIHRoZXkgc2hvdWxkIGV2ZXIKKyAqIGFwcGVhciBhdCBydW50aW1lLiAgVXNlIHRoZSB2ZXJzaW9ucyB3aXRoIHByaW50ayBmb3JtYXQgc3RyaW5ncworICogdG8gcHJvdmlkZSBiZXR0ZXIgZGlhZ25vc3RpY3MuCisgKi8KICNpZm5kZWYgX19XQVJOCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogZXh0ZXJuIHZvaWQgd2Fybl9zbG93cGF0aChjb25zdCBjaGFyICpmaWxlLCBjb25zdCBpbnQgbGluZSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvbG9jYWwuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvbG9jYWwuaAppbmRleCAzM2Q3ZDA0Li5kYmQ2MTUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL2xvY2FsLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9sb2NhbC5oCkBAIC0yLDcgKzIsNiBAQAogI2RlZmluZSBfQVNNX0dFTkVSSUNfTE9DQUxfSAogCiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+Ci0jaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9tZW1vcnlfbW9kZWwuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvbWVtb3J5X21vZGVsLmgKaW5kZXggMzZmYTI4Ni4uNGM4ZDBhZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9tZW1vcnlfbW9kZWwuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL21lbW9yeV9tb2RlbC5oCkBAIC02OSwxNSArNjksOCBAQAogfSkKICNlbmRpZiAvKiBDT05GSUdfRkxBVE1FTS9ESVNDT05USUdNRU0vU1BBUlNFTUVNICovCiAKLSNpZmRlZiBDT05GSUdfT1VUX09GX0xJTkVfUEZOX1RPX1BBR0UKLXN0cnVjdCBwYWdlOwotLyogdGhpcyBpcyB1c2VmdWwgd2hlbiBpbmxpbmVkIHBmbl90b19wYWdlIGlzIHRvbyBiaWcgKi8KLWV4dGVybiBzdHJ1Y3QgcGFnZSAqcGZuX3RvX3BhZ2UodW5zaWduZWQgbG9uZyBwZm4pOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGFnZV90b19wZm4oc3RydWN0IHBhZ2UgKnBhZ2UpOwotI2Vsc2UKICNkZWZpbmUgcGFnZV90b19wZm4gX19wYWdlX3RvX3BmbgogI2RlZmluZSBwZm5fdG9fcGFnZSBfX3Bmbl90b19wYWdlCi0jZW5kaWYgLyogQ09ORklHX09VVF9PRl9MSU5FX1BGTl9UT19QQUdFICovCiAKICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9LYnVpbGQgYi9pbmNsdWRlL2FzbS1tMzJyL0tidWlsZAppbmRleCBjNjhlMTY4Li4yN2IxMDhhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tMzJyL0tidWlsZAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL0tidWlsZApAQCAtMSArMSwyIEBACiBpbmNsdWRlIGluY2x1ZGUvYXNtLWdlbmVyaWMvS2J1aWxkLmFzbQordW5pZmRlZi15ICs9IHN3YWIuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9hdG9taWMuaCBiL2luY2x1ZGUvYXNtLW0zMnIvYXRvbWljLmgKaW5kZXggM2EzOGZmZS4uMmVlZDMwZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTMyci9hdG9taWMuaAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL2F0b21pYy5oCkBAIC05LDYgKzksNyBAQAogICogICAgQ29weXJpZ2h0IChDKSAyMDA0ICBIaXJva2F6dSBUYWthdGEgPHRha2F0YSBhdCBsaW51eC1tMzJyLm9yZz4KICAqLwogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCkBAIC0xNywxMyArMTgsNiBAQAogICogcmVzb3VyY2UgY291bnRpbmcgZXRjLi4KICAqLwogCi0vKgotICogTWFrZSBzdXJlIGdjYyBkb2Vzbid0IHRyeSB0byBiZSBjbGV2ZXIgYW5kIG1vdmUgdGhpbmdzIGFyb3VuZAotICogb24gdXMuIFdlIG5lZWQgdG8gdXNlIF9leGFjdGx5XyB0aGUgYWRkcmVzcyB0aGUgdXNlciBnYXZlIHVzLAotICogbm90IHNvbWUgYWxpYXMgdGhhdCBjb250YWlucyB0aGUgc2FtZSBpbmZvcm1hdGlvbi4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBpbnQgY291bnRlcjsgfSBhdG9taWNfdDsKLQogI2RlZmluZSBBVE9NSUNfSU5JVChpKQl7IChpKSB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9ieXRlb3JkZXIuaCBiL2luY2x1ZGUvYXNtLW0zMnIvYnl0ZW9yZGVyLmgKaW5kZXggMTBiMmMxZC4uNjFmZjljZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTMyci9ieXRlb3JkZXIuaAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL2J5dGVvcmRlci5oCkBAIC0xLDEyICsxLDcgQEAKICNpZm5kZWYgX0FTTV9NMzJSX0JZVEVPUkRFUl9ICiAjZGVmaW5lIF9BU01fTTMyUl9CWVRFT1JERVJfSAogCi0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+Ci0KLSNpZiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pIHx8IGRlZmluZWQoX19LRVJORUxfXykKLSMgIGRlZmluZSBfX0JZVEVPUkRFUl9IQVNfVTY0X18KLSMgIGRlZmluZSBfX1NXQUJfNjRfVEhSVV8zMl9fCi0jZW5kaWYKKyNpbmNsdWRlIDxhc20vc3dhYi5oPgogCiAjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fXykKICMgIGluY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9saXR0bGVfZW5kaWFuLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tMzJyL3N3YWIuaCBiL2luY2x1ZGUvYXNtLW0zMnIvc3dhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3OTczZTEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL3N3YWIuaApAQCAtMCwwICsxLDEwIEBACisjaWZuZGVmIF9BU01fTTMyUl9TV0FCX0gKKyNkZWZpbmUgX0FTTV9NMzJSX1NXQUJfSAorCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKKyNpZiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pIHx8IGRlZmluZWQoX19LRVJORUxfXykKKyMgIGRlZmluZSBfX1NXQUJfNjRfVEhSVV8zMl9fCisjZW5kaWYKKworI2VuZGlmIC8qIF9BU01fTTMyUl9TV0FCX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvS2J1aWxkIGIvaW5jbHVkZS9hc20tbTY4ay9LYnVpbGQKaW5kZXggMWE5MjJmYS4uNTJmZDk2YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9LYnVpbGQKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9LYnVpbGQKQEAgLTEsMiArMSwzIEBACiBpbmNsdWRlIGluY2x1ZGUvYXNtLWdlbmVyaWMvS2J1aWxkLmFzbQogaGVhZGVyLXkgKz0gY2FjaGVjdGwuaAordW5pZmRlZi15ICs9IHN3YWIuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9hdG9taWMuaCBiL2luY2x1ZGUvYXNtLW02OGsvYXRvbWljLmgKaW5kZXggNDkxNTI5NC4uZWIwYWI5ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9hdG9taWMuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL2F0b21pYy5oCkBAIC0xLDcgKzEsNyBAQAogI2lmbmRlZiBfX0FSQ0hfTTY4S19BVE9NSUNfXwogI2RlZmluZSBfX0FSQ0hfTTY4S19BVE9NSUNfXwogCi0KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAogLyoKQEAgLTEzLDcgKzEzLDYgQEAKICAqIFdlIGRvIG5vdCBoYXZlIFNNUCBtNjhrIHN5c3RlbXMsIHNvIHdlIGRvbid0IGhhdmUgdG8gZGVhbCB3aXRoIHRoYXQuCiAgKi8KIAotdHlwZWRlZiBzdHJ1Y3QgeyBpbnQgY291bnRlcjsgfSBhdG9taWNfdDsKICNkZWZpbmUgQVRPTUlDX0lOSVQoaSkJeyAoaSkgfQogCiAjZGVmaW5lIGF0b21pY19yZWFkKHYpCQkoKHYpLT5jb3VudGVyKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9ieXRlb3JkZXIuaCBiL2luY2x1ZGUvYXNtLW02OGsvYnl0ZW9yZGVyLmgKaW5kZXggYjM1NGFjZC4uMzAwODY2NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9ieXRlb3JkZXIuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL2J5dGVvcmRlci5oCkBAIC0xLDE5ICsxLDcgQEAKICNpZm5kZWYgX002OEtfQllURU9SREVSX0gKICNkZWZpbmUgX002OEtfQllURU9SREVSX0gKIAotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+Ci0KLSNkZWZpbmUgX19CSUdfRU5ESUFOCi0jZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KLQotc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyIF9fYXJjaF9zd2FiMzIoX191MzIgdmFsKQotewotCV9fYXNtX18oInJvbHcgIzgsJTA7IHN3YXAgJTA7IHJvbHcgIzgsJTAiIDogIj1kIiAodmFsKSA6ICIwIiAodmFsKSk7Ci0JcmV0dXJuIHZhbDsKLX0KLSNkZWZpbmUgX19hcmNoX3N3YWIzMiBfX2FyY2hfc3dhYjMyCi0KLSNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vc3dhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9iaWdfZW5kaWFuLmg+CiAKICNlbmRpZiAvKiBfTTY4S19CWVRFT1JERVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9zd2FiLmggYi9pbmNsdWRlL2FzbS1tNjhrL3N3YWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjIxZTMwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9zd2FiLmgKQEAgLTAsMCArMSwxNiBAQAorI2lmbmRlZiBfTTY4S19TV0FCX0gKKyNkZWZpbmUgX002OEtfU1dBQl9ICisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorCisjZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KKworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyIF9fYXJjaF9zd2FiMzIoX191MzIgdmFsKQoreworCV9fYXNtX18oInJvbHcgIzgsJTA7IHN3YXAgJTA7IHJvbHcgIzgsJTAiIDogIj1kIiAodmFsKSA6ICIwIiAodmFsKSk7CisJcmV0dXJuIHZhbDsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWIzMiBfX2FyY2hfc3dhYjMyCisKKyNlbmRpZiAvKiBfTTY4S19TV0FCX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvS2J1aWxkIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9LYnVpbGQKaW5kZXggYzY4ZTE2OC4uMjdiMTA4YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbW4xMDMwMC9LYnVpbGQKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9LYnVpbGQKQEAgLTEgKzEsMiBAQAogaW5jbHVkZSBpbmNsdWRlL2FzbS1nZW5lcmljL0tidWlsZC5hc20KK3VuaWZkZWYteSArPSBzd2FiLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvYXRvbWljLmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL2F0b21pYy5oCmluZGV4IDI3Yzk2OTAuLmJjMDY0ODIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvYXRvbWljLmgKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9hdG9taWMuaApAQCAtMjAsMTUgKzIwLDYgQEAKICAqIHJlc291cmNlIGNvdW50aW5nIGV0Yy4uCiAgKi8KIAotLyoKLSAqIE1ha2Ugc3VyZSBnY2MgZG9lc24ndCB0cnkgdG8gYmUgY2xldmVyIGFuZCBtb3ZlIHRoaW5ncyBhcm91bmQKLSAqIG9uIHVzLiBXZSBuZWVkIHRvIHVzZSBfZXhhY3RseV8gdGhlIGFkZHJlc3MgdGhlIHVzZXIgZ2F2ZSB1cywKLSAqIG5vdCBzb21lIGFsaWFzIHRoYXQgY29udGFpbnMgdGhlIHNhbWUgaW5mb3JtYXRpb24uCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLQlpbnQJY291bnRlcjsKLX0gYXRvbWljX3Q7Ci0KICNkZWZpbmUgQVRPTUlDX0lOSVQoaSkJeyAoaSkgfQogCiAjaWZkZWYgX19LRVJORUxfXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC9ieXRlb3JkZXIuaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvYnl0ZW9yZGVyLmgKaW5kZXggM2M5OTNjYy4uNDViMThkZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbW4xMDMwMC9ieXRlb3JkZXIuaAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL2J5dGVvcmRlci5oCkBAIC0xLDQ2ICsxLDcgQEAKLS8qIE1OMTAzMDAgQnl0ZS1vcmRlciBwcmltaXRpdmUgY29uc3RydWN0aW9uCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCiAjaWZuZGVmIF9BU01fQllURU9SREVSX0gKICNkZWZpbmUgX0FTTV9CWVRFT1JERVJfSAogCi0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+Ci0KLSNpZmRlZiBfX0dOVUNfXwotCi1zdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18oKGNvbnN0KSkKLV9fdTMyIF9fX2FyY2hfX3N3YWIzMihfX3UzMiB4KQotewotCV9fdTMyIHJldDsKLQlhc20oInN3YXAgJTEsJTAiIDogIj1yIiAocmV0KSA6ICJyIiAoeCkpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXygoY29uc3QpKQotX191MTYgX19fYXJjaF9fc3dhYjE2KF9fdTE2IHgpCi17Ci0JX191MTYgcmV0OwotCWFzbSgic3dhcGggJTEsJTAiIDogIj1yIiAocmV0KSA6ICJyIiAoeCkpOwotCXJldHVybiByZXQ7Ci19Ci0KLSNkZWZpbmUgX19hcmNoX19zd2FiMzIoeCkgX19fYXJjaF9fc3dhYjMyKHgpCi0jZGVmaW5lIF9fYXJjaF9fc3dhYjE2KHgpIF9fX2FyY2hfX3N3YWIxNih4KQotCi0jaWYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSB8fCBkZWZpbmVkKF9fS0VSTkVMX18pCi0jICBkZWZpbmUgX19CWVRFT1JERVJfSEFTX1U2NF9fCi0jICBkZWZpbmUgX19TV0FCXzY0X1RIUlVfMzJfXwotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX0dOVUNfXyAqLwotCisjaW5jbHVkZSA8YXNtL3N3YWIuaD4KICNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvbGl0dGxlX2VuZGlhbi5oPgogCiAjZW5kaWYgLyogX0FTTV9CWVRFT1JERVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC9zd2FiLmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3N3YWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTA0ZDFiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9zd2FiLmgKQEAgLTAsMCArMSw0MiBAQAorLyogTU4xMDMwMCBCeXRlLW9yZGVyIHByaW1pdGl2ZSBjb25zdHJ1Y3Rpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0FTTV9TV0FCX0gKKyNkZWZpbmUgX0FTTV9TV0FCX0gKKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCisjaWZkZWYgX19HTlVDX18KKworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fKChjb25zdCkpCitfX3UzMiBfX2FyY2hfc3dhYjMyKF9fdTMyIHgpCit7CisJX191MzIgcmV0OworCWFzbSgic3dhcCAlMSwlMCIgOiAiPXIiIChyZXQpIDogInIiICh4KSk7CisJcmV0dXJuIHJldDsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWIzMiBfX2FyY2hfc3dhYjMyCisKK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXygoY29uc3QpKQorX191MTYgX19hcmNoX3N3YWIxNihfX3UxNiB4KQoreworCV9fdTE2IHJldDsKKwlhc20oInN3YXBoICUxLCUwIiA6ICI9ciIgKHJldCkgOiAiciIgKHgpKTsKKwlyZXR1cm4gcmV0OworfQorI2RlZmluZSBfX2FyY2hfc3dhYjMyIF9fYXJjaF9zd2FiMzIKKworI2lmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgfHwgZGVmaW5lZChfX0tFUk5FTF9fKQorIyAgZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KKyNlbmRpZgorCisjZW5kaWYgLyogX19HTlVDX18gKi8KKworI2VuZGlmIC8qIF9BU01fU1dBQl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvS2J1aWxkIGIvaW5jbHVkZS9hc20teHRlbnNhL0tidWlsZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY4ZTE2OC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvS2J1aWxkCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotaW5jbHVkZSBpbmNsdWRlL2FzbS1nZW5lcmljL0tidWlsZC5hc20KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9hc21tYWNyby5oIGIvaW5jbHVkZS9hc20teHRlbnNhL2FzbW1hY3JvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2OTE1Y2EuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL2FzbW1hY3JvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoKLSAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9hc21tYWNyby5oCi0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFRlbnNpbGljYSBJbmMuCi0gKi8KLQotI2lmbmRlZiBfWFRFTlNBX0FTTU1BQ1JPX0gKLSNkZWZpbmUgX1hURU5TQV9BU01NQUNST19ICi0KLSNpbmNsdWRlIDxhc20vdmFyaWFudC9jb3JlLmg+Ci0KLS8qCi0gKiBTb21lIGxpdHRsZSBoZWxwZXJzIGZvciBsb29wcy4gVXNlIHplcm8tb3ZlcmhlYWQtbG9vcHMKLSAqIHdoZXJlIGFwcGxpY2FibGUgYW5kIGlmIHN1cHBvcnRlZCBieSB0aGUgcHJvY2Vzc29yLgotICoKLSAqIF9fbG9vcGkgYXIsIGF0LCBzaXplLCBpbmMKLSAqICAgICAgICAgYXIJcmVnaXN0ZXIgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgc3RhcnQgYWRkcmVzcwotICoJICAgYXQJc2NyYXRjaCByZWdpc3RlciB1c2VkIGJ5IG1hY3JvCi0gKgkgICBzaXplCXNpemUgaW1tZWRpYXRlIHZhbHVlCi0gKgkgICBpbmMJaW5jcmVtZW50Ci0gKgotICogX19sb29wcyBhciwgYXMsIGF0LCBpbmNfbG9nMlssIG1hc2tfbG9nMl1bLCBjb25kXVssIG5jb25kXQotICoJICAgYXIJcmVnaXN0ZXIgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgc3RhcnQgYWRkcmVzcwotICoJICAgYXMJcmVnaXN0ZXIgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgc2l6ZQotICoJICAgYXQJc2NyYXRjaCByZWdpc3RlciB1c2UgYnkgbWFjcm8KLSAqCSAgIGluY19sb2cyCWluY3JlbWVudCBbaW4gbG9nMl0KLSAqCSAgIG1hc2tfbG9nMgltYXNrIFtpbiBsb2cyXQotICoJICAgY29uZAkJdHJ1ZSBjb25kaXRpb24gKHVzZWQgaW4gbG9vcCdjb25kJykKLSAqCSAgIG5jb25kCWZhbHNlIGNvbmRpdGlvbiAodXNlZCBpbiBiJ25jb25kJykKLSAqCi0gKiBfX2xvb3AgIGFzCi0gKgkgICByZXN0YXJ0IGxvb3AuICdhcycgcmVnaXN0ZXIgbXVzdCBub3QgaGF2ZSBiZWVuIG1vZGlmaWVkIQotICoKLSAqIF9fZW5kbGEgYXIsIGF0LCBpbmNyCi0gKgkgICBhcglzdGFydCBhZGRyZXNzIChtb2RpZmllZCkKLSAqCSAgIGFzCXNjcmF0Y2ggcmVnaXN0ZXIgdXNlZCBieSBtYWNybwotICoJICAgaW5jCWluY3JlbWVudAotICovCi0KLS8qCi0gKiBsb29wIGZvciBnaXZlbiBzaXplIGFzIGltbWVkaWF0ZQotICovCi0KLQkubWFjcm8JX19sb29waSBhciwgYXQsIHNpemUsIGluY3IKLQotI2lmIFhDSEFMX0hBVkVfTE9PUFMKLQkJbW92aQlcYXQsICgoXHNpemUgKyBcaW5jciAtIDEpIC8gKFxpbmNyKSkKLQkJbG9vcAlcYXQsIDk5ZgotI2Vsc2UKLQkJYWRkaQlcYXQsIFxhciwgXHNpemUKLQkJOTg6Ci0jZW5kaWYKLQotCS5lbmRtCi0KLS8qCi0gKiBsb29wIGZvciBnaXZlbiBzaXplIGluIHJlZ2lzdGVyCi0gKi8KLQotCS5tYWNybwlfX2xvb3BzCWFyLCBhcywgYXQsIGluY3JfbG9nMiwgbWFza19sb2cyLCBjb25kLCBuY29uZAotCi0jaWYgWENIQUxfSEFWRV9MT09QUwotCQkuaWZndCBcaW5jcl9sb2cyIC0gMQotCQkJYWRkaQlcYXQsIFxhcywgKDEgPDwgXGluY3JfbG9nMikgLSAxCi0JCQkuaWZuYyBcbWFza19sb2cyLAotCQkJCWV4dHVpCVxhdCwgXGF0LCBcaW5jcl9sb2cyLCBcbWFza19sb2cyCi0JCQkuZWxzZQotCQkJCXNybGkJXGF0LCBcYXQsIFxpbmNyX2xvZzIKLQkJCS5lbmRpZgotCQkuZW5kaWYKLQkJbG9vcFxjb25kCVxhdCwgOTlmCi0jZWxzZQotCQkuaWZuYyBcbWFza19sb2cyLAotCQkJZXh0dWkJXGF0LCBcYXMsIFxpbmNyX2xvZzIsIFxtYXNrX2xvZzIKLQkJLmVsc2UKLQkJCS5pZm5jIFxuY29uZCwKLQkJCQlzcmxpCVxhdCwgXGFzLCBcaW5jcl9sb2cyCi0JCQkuZW5kaWYKLQkJLmVuZGlmCi0JCS5pZm5jIFxuY29uZCwKLQkJCWJcbmNvbmQJXGF0LCA5OWYKLQotCQkuZW5kaWYKLQkJLmlmbmMgXG1hc2tfbG9nMiwKLQkJCXNsbGkJXGF0LCBcYXQsIFxpbmNyX2xvZzIKLQkJCWFkZAlcYXQsIFxhciwgXGF0Ci0JCS5lbHNlCi0JCQlhZGQJXGF0LCBcYXIsIFxhcwotCQkuZW5kaWYKLSNlbmRpZgotCQk5ODoKLQotCS5lbmRtCi0KLS8qCi0gKiBsb29wIGZyb20gYXIgdG8gYXgKLSAqLwotCi0JLm1hY3JvCV9fbG9vcHQJYXIsIGFzLCBhdCwgaW5jcl9sb2cyCi0KLSNpZiBYQ0hBTF9IQVZFX0xPT1BTCi0JCXN1YglcYXQsIFxhcywgXGFyCi0JCS5pZmd0CVxpbmNyX2xvZzIgLSAxCi0JCQlhZGRpCVxhdCwgXGF0LCAoMSA8PCBcaW5jcl9sb2cyKSAtIDEKLQkJCXNybGkJXGF0LCBcYXQsIFxpbmNyX2xvZzIKLQkJLmVuZGlmCi0JCWxvb3AJXGF0LCA5OWYKLSNlbHNlCi0JCTk4OgotI2VuZGlmCi0KLQkuZW5kbQotCi0vKgotICogcmVzdGFydCBsb29wLiByZWdpc3RlcnMgbXVzdCBiZSB1bmNoYW5nZWQKLSAqLwotCi0JLm1hY3JvCV9fbG9vcAlhcwotCi0jaWYgWENIQUxfSEFWRV9MT09QUwotCQlsb29wCVxhcywgOTlmCi0jZWxzZQotCQk5ODoKLSNlbmRpZgotCi0JLmVuZG0KLQotLyoKLSAqIGVuZCBvZiBsb29wIHdpdGggbm8gaW5jcmVtZW50IG9mIHRoZSBhZGRyZXNzLgotICovCi0KLQkubWFjcm8JX19lbmRsCWFyLCBhcwotI2lmICFYQ0hBTF9IQVZFX0xPT1BTCi0JCWJsdHUJXGFyLCBcYXMsIDk4YgotI2VuZGlmCi0JCTk5OgotCS5lbmRtCi0KLS8qCi0gKiBlbmQgb2YgbG9vcCB3aXRoIGluY3JlbWVudCBvZiB0aGUgYWRkcmVzcy4KLSAqLwotCi0JLm1hY3JvCV9fZW5kbGEJYXIsIGFzLCBpbmNyCi0JCWFkZGkJXGFyLCBcYXIsIFxpbmNyCi0JCV9fZW5kbAlcYXIgXGFzCi0JLmVuZG0KLQotCi0jZW5kaWYgLyogX1hURU5TQV9BU01NQUNST19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvYXRvbWljLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvYXRvbWljLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYjIzNTQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL2F0b21pYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLS8qCi0gKiBpbmNsdWRlL2FzbS14dGVuc2EvYXRvbWljLmgKLSAqCi0gKiBBdG9taWMgb3BlcmF0aW9ucyB0aGF0IEMgY2FuJ3QgZ3VhcmFudGVlIHVzLiAgVXNlZnVsIGZvciByZXNvdXJjZSBjb3VudGluZy4uCi0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgotICovCi0KLSNpZm5kZWYgX1hURU5TQV9BVE9NSUNfSAotI2RlZmluZSBfWFRFTlNBX0FUT01JQ19ICi0KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KLQotdHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBpbnQgY291bnRlcjsgfSBhdG9taWNfdDsKLQotI2lmZGVmIF9fS0VSTkVMX18KLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotCi0jZGVmaW5lIEFUT01JQ19JTklUKGkpCXsgKGkpIH0KLQotLyoKLSAqIFRoaXMgWHRlbnNhIGltcGxlbWVudGF0aW9uIGFzc3VtZXMgdGhhdCB0aGUgcmlnaHQgbWVjaGFuaXNtCi0gKiBmb3IgZXhjbHVzaW9uIGlzIGZvciBsb2NraW5nIGludGVycnVwdHMgdG8gbGV2ZWwgMS4KLSAqCi0gKiBMb2NraW5nIGludGVycnVwdHMgbG9va3MgbGlrZSB0aGlzOgotICoKLSAqICAgIHJzaWwgYTE1LCAxCi0gKiAgICA8Y29kZT4KLSAqICAgIHdzciAgYTE1LCBQUwotICogICAgcnN5bmMKLSAqCi0gKiBOb3RlIHRoYXQgYTE1IGlzIHVzZWQgaGVyZSBiZWNhdXNlIHRoZSByZWdpc3RlciBhbGxvY2F0aW9uCi0gKiBkb25lIGJ5IHRoZSBjb21waWxlciBpcyBub3QgZ3VhcmFudGVlZCBhbmQgYSB3aW5kb3cgb3ZlcmZsb3cKLSAqIG1heSBub3Qgb2NjdXIgYmV0d2VlbiB0aGUgcnNpbCBhbmQgd3NyIGluc3RydWN0aW9ucy4gQnkgdXNpbmcKLSAqIGExNSBpbiB0aGUgcnNpbCwgdGhlIG1hY2hpbmUgaXMgZ3VhcmFudGVlZCB0byBiZSBpbiBhIHN0YXRlCi0gKiB3aGVyZSBubyByZWdpc3RlciByZWZlcmVuY2Ugd2lsbCBjYXVzZSBhbiBvdmVyZmxvdy4KLSAqLwotCi0vKioKLSAqIGF0b21pY19yZWFkIC0gcmVhZCBhdG9taWMgdmFyaWFibGUKLSAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKLSAqCi0gKiBBdG9taWNhbGx5IHJlYWRzIHRoZSB2YWx1ZSBvZiBAdi4KLSAqLwotI2RlZmluZSBhdG9taWNfcmVhZCh2KQkJKCh2KS0+Y291bnRlcikKLQotLyoqCi0gKiBhdG9taWNfc2V0IC0gc2V0IGF0b21pYyB2YXJpYWJsZQotICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAotICogQGk6IHJlcXVpcmVkIHZhbHVlCi0gKgotICogQXRvbWljYWxseSBzZXRzIHRoZSB2YWx1ZSBvZiBAdiB0byBAaS4KLSAqLwotI2RlZmluZSBhdG9taWNfc2V0KHYsaSkJCSgodiktPmNvdW50ZXIgPSAoaSkpCi0KLS8qKgotICogYXRvbWljX2FkZCAtIGFkZCBpbnRlZ2VyIHRvIGF0b21pYyB2YXJpYWJsZQotICogQGk6IGludGVnZXIgdmFsdWUgdG8gYWRkCi0gKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190Ci0gKgotICogQXRvbWljYWxseSBhZGRzIEBpIHRvIEB2LgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX2FkZChpbnQgaSwgYXRvbWljX3QgKiB2KQotewotICAgIHVuc2lnbmVkIGludCB2dmFsOwotCi0gICAgX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JInJzaWwgICAgYTE1LCAiX19zdHJpbmdpZnkoTE9DS0xFVkVMKSJcblx0IgotCSJsMzJpICAgICUwLCAlMiwgMCAgICAgICAgICAgICAgXG5cdCIKLQkiYWRkICAgICAlMCwgJTAsICUxICAgICAgICAgICAgIFxuXHQiCi0JInMzMmkgICAgJTAsICUyLCAwICAgICAgICAgICAgICBcblx0IgotCSJ3c3IgICAgIGExNSwgIl9fc3RyaW5naWZ5KFBTKSIgICAgICAgXG5cdCIKLQkicnN5bmMgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgotCTogIj0mYSIgKHZ2YWwpCi0JOiAiYSIgKGkpLCAiYSIgKHYpCi0JOiAiYTE1IiwgIm1lbW9yeSIKLQkpOwotfQotCi0vKioKLSAqIGF0b21pY19zdWIgLSBzdWJ0cmFjdCB0aGUgYXRvbWljIHZhcmlhYmxlCi0gKiBAaTogaW50ZWdlciB2YWx1ZSB0byBzdWJ0cmFjdAotICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAotICoKLSAqIEF0b21pY2FsbHkgc3VidHJhY3RzIEBpIGZyb20gQHYuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBhdG9taWNfc3ViKGludCBpLCBhdG9taWNfdCAqdikKLXsKLSAgICB1bnNpZ25lZCBpbnQgdnZhbDsKLQotICAgIF9fYXNtX18gX192b2xhdGlsZV9fKAotCSJyc2lsICAgIGExNSwgIl9fc3RyaW5naWZ5KExPQ0tMRVZFTCkiXG5cdCIKLQkibDMyaSAgICAlMCwgJTIsIDAgICAgICAgICAgICAgIFxuXHQiCi0JInN1YiAgICAgJTAsICUwLCAlMSAgICAgICAgICAgICBcblx0IgotCSJzMzJpICAgICUwLCAlMiwgMCAgICAgICAgICAgICAgXG5cdCIKLQkid3NyICAgICBhMTUsICJfX3N0cmluZ2lmeShQUykiICAgICAgIFxuXHQiCi0JInJzeW5jICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKLQk6ICI9JmEiICh2dmFsKQotCTogImEiIChpKSwgImEiICh2KQotCTogImExNSIsICJtZW1vcnkiCi0JKTsKLX0KLQotLyoKLSAqIFdlIHVzZSBhdG9taWNfe2FkZHxzdWJ9X3JldHVybiB0byBkZWZpbmUgb3RoZXIgZnVuY3Rpb25zLgotICovCi0KLXN0YXRpYyBpbmxpbmUgaW50IGF0b21pY19hZGRfcmV0dXJuKGludCBpLCBhdG9taWNfdCAqIHYpCi17Ci0gICAgIHVuc2lnbmVkIGludCB2dmFsOwotCi0gICAgX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JInJzaWwgICAgYTE1LCJfX3N0cmluZ2lmeShMT0NLTEVWRUwpIlxuXHQiCi0JImwzMmkgICAgJTAsICUyLCAwICAgICAgICAgICAgIFxuXHQiCi0JImFkZCAgICAgJTAsICUwLCAlMSAgICAgICAgICAgIFxuXHQiCi0JInMzMmkgICAgJTAsICUyLCAwICAgICAgICAgICAgIFxuXHQiCi0JIndzciAgICAgYTE1LCAiX19zdHJpbmdpZnkoUFMpIiAgICAgIFxuXHQiCi0JInJzeW5jICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgotCTogIj0mYSIgKHZ2YWwpCi0JOiAiYSIgKGkpLCAiYSIgKHYpCi0JOiAiYTE1IiwgIm1lbW9yeSIKLQkpOwotCi0gICAgcmV0dXJuIHZ2YWw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGF0b21pY19zdWJfcmV0dXJuKGludCBpLCBhdG9taWNfdCAqIHYpCi17Ci0gICAgdW5zaWduZWQgaW50IHZ2YWw7Ci0KLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkicnNpbCAgICBhMTUsIl9fc3RyaW5naWZ5KExPQ0tMRVZFTCkiXG5cdCIKLQkibDMyaSAgICAlMCwgJTIsIDAgICAgICAgICAgICAgXG5cdCIKLQkic3ViICAgICAlMCwgJTAsICUxICAgICAgICAgICAgXG5cdCIKLQkiczMyaSAgICAlMCwgJTIsIDAgICAgICAgICAgICAgXG5cdCIKLQkid3NyICAgICBhMTUsICJfX3N0cmluZ2lmeShQUykiICAgICAgIFxuXHQiCi0JInJzeW5jICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgotCTogIj0mYSIgKHZ2YWwpCi0JOiAiYSIgKGkpLCAiYSIgKHYpCi0JOiAiYTE1IiwgIm1lbW9yeSIKLQkpOwotCi0gICAgcmV0dXJuIHZ2YWw7Ci19Ci0KLS8qKgotICogYXRvbWljX3N1Yl9hbmRfdGVzdCAtIHN1YnRyYWN0IHZhbHVlIGZyb20gdmFyaWFibGUgYW5kIHRlc3QgcmVzdWx0Ci0gKiBAaTogaW50ZWdlciB2YWx1ZSB0byBzdWJ0cmFjdAotICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAotICoKLSAqIEF0b21pY2FsbHkgc3VidHJhY3RzIEBpIGZyb20gQHYgYW5kIHJldHVybnMKLSAqIHRydWUgaWYgdGhlIHJlc3VsdCBpcyB6ZXJvLCBvciBmYWxzZSBmb3IgYWxsCi0gKiBvdGhlciBjYXNlcy4KLSAqLwotI2RlZmluZSBhdG9taWNfc3ViX2FuZF90ZXN0KGksdikgKGF0b21pY19zdWJfcmV0dXJuKChpKSwodikpID09IDApCi0KLS8qKgotICogYXRvbWljX2luYyAtIGluY3JlbWVudCBhdG9taWMgdmFyaWFibGUKLSAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKLSAqCi0gKiBBdG9taWNhbGx5IGluY3JlbWVudHMgQHYgYnkgMS4KLSAqLwotI2RlZmluZSBhdG9taWNfaW5jKHYpIGF0b21pY19hZGQoMSwodikpCi0KLS8qKgotICogYXRvbWljX2luYyAtIGluY3JlbWVudCBhdG9taWMgdmFyaWFibGUKLSAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKLSAqCi0gKiBBdG9taWNhbGx5IGluY3JlbWVudHMgQHYgYnkgMS4KLSAqLwotI2RlZmluZSBhdG9taWNfaW5jX3JldHVybih2KSBhdG9taWNfYWRkX3JldHVybigxLCh2KSkKLQotLyoqCi0gKiBhdG9taWNfZGVjIC0gZGVjcmVtZW50IGF0b21pYyB2YXJpYWJsZQotICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAotICoKLSAqIEF0b21pY2FsbHkgZGVjcmVtZW50cyBAdiBieSAxLgotICovCi0jZGVmaW5lIGF0b21pY19kZWModikgYXRvbWljX3N1YigxLCh2KSkKLQotLyoqCi0gKiBhdG9taWNfZGVjX3JldHVybiAtIGRlY3JlbWVudCBhdG9taWMgdmFyaWFibGUKLSAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKLSAqCi0gKiBBdG9taWNhbGx5IGRlY3JlbWVudHMgQHYgYnkgMS4KLSAqLwotI2RlZmluZSBhdG9taWNfZGVjX3JldHVybih2KSBhdG9taWNfc3ViX3JldHVybigxLCh2KSkKLQotLyoqCi0gKiBhdG9taWNfZGVjX2FuZF90ZXN0IC0gZGVjcmVtZW50IGFuZCB0ZXN0Ci0gKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190Ci0gKgotICogQXRvbWljYWxseSBkZWNyZW1lbnRzIEB2IGJ5IDEgYW5kCi0gKiByZXR1cm5zIHRydWUgaWYgdGhlIHJlc3VsdCBpcyAwLCBvciBmYWxzZSBmb3IgYWxsIG90aGVyCi0gKiBjYXNlcy4KLSAqLwotI2RlZmluZSBhdG9taWNfZGVjX2FuZF90ZXN0KHYpIChhdG9taWNfc3ViX3JldHVybigxLCh2KSkgPT0gMCkKLQotLyoqCi0gKiBhdG9taWNfaW5jX2FuZF90ZXN0IC0gaW5jcmVtZW50IGFuZCB0ZXN0Ci0gKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190Ci0gKgotICogQXRvbWljYWxseSBpbmNyZW1lbnRzIEB2IGJ5IDEKLSAqIGFuZCByZXR1cm5zIHRydWUgaWYgdGhlIHJlc3VsdCBpcyB6ZXJvLCBvciBmYWxzZSBmb3IgYWxsCi0gKiBvdGhlciBjYXNlcy4KLSAqLwotI2RlZmluZSBhdG9taWNfaW5jX2FuZF90ZXN0KHYpIChhdG9taWNfYWRkX3JldHVybigxLCh2KSkgPT0gMCkKLQotLyoqCi0gKiBhdG9taWNfYWRkX25lZ2F0aXZlIC0gYWRkIGFuZCB0ZXN0IGlmIG5lZ2F0aXZlCi0gKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190Ci0gKiBAaTogaW50ZWdlciB2YWx1ZSB0byBhZGQKLSAqCi0gKiBBdG9taWNhbGx5IGFkZHMgQGkgdG8gQHYgYW5kIHJldHVybnMgdHJ1ZQotICogaWYgdGhlIHJlc3VsdCBpcyBuZWdhdGl2ZSwgb3IgZmFsc2Ugd2hlbgotICogcmVzdWx0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB6ZXJvLgotICovCi0jZGVmaW5lIGF0b21pY19hZGRfbmVnYXRpdmUoaSx2KSAoYXRvbWljX2FkZF9yZXR1cm4oKGkpLCh2KSkgPCAwKQotCi0jZGVmaW5lIGF0b21pY19jbXB4Y2hnKHYsIG8sIG4pICgoaW50KWNtcHhjaGcoJigodiktPmNvdW50ZXIpLCAobyksIChuKSkpCi0jZGVmaW5lIGF0b21pY194Y2hnKHYsIG5ldykgKHhjaGcoJigodiktPmNvdW50ZXIpLCBuZXcpKQotCi0vKioKLSAqIGF0b21pY19hZGRfdW5sZXNzIC0gYWRkIHVubGVzcyB0aGUgbnVtYmVyIGlzIGEgZ2l2ZW4gdmFsdWUKLSAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKLSAqIEBhOiB0aGUgYW1vdW50IHRvIGFkZCB0byB2Li4uCi0gKiBAdTogLi4udW5sZXNzIHYgaXMgZXF1YWwgdG8gdS4KLSAqCi0gKiBBdG9taWNhbGx5IGFkZHMgQGEgdG8gQHYsIHNvIGxvbmcgYXMgaXQgd2FzIG5vdCBAdS4KLSAqIFJldHVybnMgbm9uLXplcm8gaWYgQHYgd2FzIG5vdCBAdSwgYW5kIHplcm8gb3RoZXJ3aXNlLgotICovCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgYXRvbWljX2FkZF91bmxlc3MoYXRvbWljX3QgKnYsIGludCBhLCBpbnQgdSkKLXsKLQlpbnQgYywgb2xkOwotCWMgPSBhdG9taWNfcmVhZCh2KTsKLQlmb3IgKDs7KSB7Ci0JCWlmICh1bmxpa2VseShjID09ICh1KSkpCi0JCQlicmVhazsKLQkJb2xkID0gYXRvbWljX2NtcHhjaGcoKHYpLCBjLCBjICsgKGEpKTsKLQkJaWYgKGxpa2VseShvbGQgPT0gYykpCi0JCQlicmVhazsKLQkJYyA9IG9sZDsKLQl9Ci0JcmV0dXJuIGMgIT0gKHUpOwotfQotCi0jZGVmaW5lIGF0b21pY19pbmNfbm90X3plcm8odikgYXRvbWljX2FkZF91bmxlc3MoKHYpLCAxLCAwKQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX2NsZWFyX21hc2sodW5zaWduZWQgaW50IG1hc2ssIGF0b21pY190ICp2KQotewotICAgIHVuc2lnbmVkIGludCBhbGxfZiA9IC0xOwotICAgIHVuc2lnbmVkIGludCB2dmFsOwotCi0gICAgX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JInJzaWwgICAgYTE1LCJfX3N0cmluZ2lmeShMT0NLTEVWRUwpIlxuXHQiCi0JImwzMmkgICAgJTAsICUyLCAwICAgICAgICAgICAgIFxuXHQiCi0JInhvciAgICAgJTEsICU0LCAlMyAgICAgICAgICAgIFxuXHQiCi0JImFuZCAgICAgJTAsICUwLCAlNCAgICAgICAgICAgIFxuXHQiCi0JInMzMmkgICAgJTAsICUyLCAwICAgICAgICAgICAgIFxuXHQiCi0JIndzciAgICAgYTE1LCAiX19zdHJpbmdpZnkoUFMpIiAgICAgIFxuXHQiCi0JInJzeW5jICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgotCTogIj0mYSIgKHZ2YWwpLCAiPWEiIChtYXNrKQotCTogImEiICh2KSwgImEiIChhbGxfZiksICIxIiAobWFzaykKLQk6ICJhMTUiLCAibWVtb3J5IgotCSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhdG9taWNfc2V0X21hc2sodW5zaWduZWQgaW50IG1hc2ssIGF0b21pY190ICp2KQotewotICAgIHVuc2lnbmVkIGludCB2dmFsOwotCi0gICAgX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JInJzaWwgICAgYTE1LCJfX3N0cmluZ2lmeShMT0NLTEVWRUwpIlxuXHQiCi0JImwzMmkgICAgJTAsICUyLCAwICAgICAgICAgICAgIFxuXHQiCi0JIm9yICAgICAgJTAsICUwLCAlMSAgICAgICAgICAgIFxuXHQiCi0JInMzMmkgICAgJTAsICUyLCAwICAgICAgICAgICAgIFxuXHQiCi0JIndzciAgICAgYTE1LCAiX19zdHJpbmdpZnkoUFMpIiAgICAgICBcblx0IgotCSJyc3luYyAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKLQk6ICI9JmEiICh2dmFsKQotCTogImEiIChtYXNrKSwgImEiICh2KQotCTogImExNSIsICJtZW1vcnkiCi0JKTsKLX0KLQotLyogQXRvbWljIG9wZXJhdGlvbnMgYXJlIGFscmVhZHkgc2VyaWFsaXppbmcgKi8KLSNkZWZpbmUgc21wX21iX19iZWZvcmVfYXRvbWljX2RlYygpCWJhcnJpZXIoKQotI2RlZmluZSBzbXBfbWJfX2FmdGVyX2F0b21pY19kZWMoKQliYXJyaWVyKCkKLSNkZWZpbmUgc21wX21iX19iZWZvcmVfYXRvbWljX2luYygpCWJhcnJpZXIoKQotI2RlZmluZSBzbXBfbWJfX2FmdGVyX2F0b21pY19pbmMoKQliYXJyaWVyKCkKLQotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2F0b21pYy5oPgotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQotI2VuZGlmIC8qIF9YVEVOU0FfQVRPTUlDX0ggKi8KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2J5dGVvcmRlci5oIGIvaW5jbHVkZS9hc20teHRlbnNhL2J5dGVvcmRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjVlZGYxLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9ieXRlb3JkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBpbmNsdWRlL2FzbS14dGVuc2EvYnl0ZW9yZGVyLmgKLSAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCi0gKi8KLQotI2lmbmRlZiBfWFRFTlNBX0JZVEVPUkRFUl9ICi0jZGVmaW5lIF9YVEVOU0FfQllURU9SREVSX0gKLQotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+Ci0KLXN0YXRpYyBfX2lubGluZV9fIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19fYXJjaF9fc3dhYjMyKF9fdTMyIHgpCi17Ci0gICAgX191MzIgcmVzOwotICAgIC8qIGluc3RydWN0aW9uIHNlcXVlbmNlIGZyb20gWHRlbnNhIElTQSByZWxlYXNlIDIvMjAwMCAqLwotICAgIF9fYXNtX18oInNzYWkgICAgIDggICAgICAgICAgIFxuXHQiCi0JICAgICJzcmxpICAgICAlMCwgJTEsIDE2ICBcblx0IgotCSAgICAic3JjICAgICAgJTAsICUwLCAlMSAgXG5cdCIKLQkgICAgInNyYyAgICAgICUwLCAlMCwgJTAgIFxuXHQiCi0JICAgICJzcmMgICAgICAlMCwgJTEsICUwICBcbiIKLQkgICAgOiAiPSZhIiAocmVzKQotCSAgICA6ICJhIiAoeCkKLQkgICAgKTsKLSAgICByZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTE2IF9fX2FyY2hfX3N3YWIxNihfX3UxNiB4KQotewotICAgIC8qIEdpdmVuIHRoYXQgJ3Nob3J0JyB2YWx1ZXMgYXJlIHNpZ25lZCAoaS5lLiwgY2FuIGJlIG5lZ2F0aXZlKSwKLSAgICAgKiB3ZSBjYW5ub3QgYXNzdW1lIHRoYXQgdGhlIHVwcGVyIDE2LWJpdHMgb2YgdGhlIHJlZ2lzdGVyIGFyZQotICAgICAqIHplcm8uICBXZSBhcmUgY2FyZWZ1bCB0byBtYXNrIHZhbHVlcyBhZnRlciBzaGlmdGluZy4KLSAgICAgKi8KLQotICAgIC8qIFRoZXJlIGV4aXN0cyBhbiBhbm9tYWx5IGJldHdlZW4geHQtZ2NjIGFuZCB4dC14Y2MuICB4dC1nY2MKLSAgICAgKiBpbnNlcnRzIGFuIGV4dHVpIGluc3RydWN0aW9uIGFmdGVyIHB1dHRpbmcgdGhpcyBmdW5jdGlvbiBpbmxpbmUKLSAgICAgKiB0byBlbnN1cmUgdGhhdCBpdCB1c2VzIG9ubHkgdGhlIGxlYXN0LXNpZ25pZmljYW50IDE2IGJpdHMgb2YKLSAgICAgKiB0aGUgcmVzdWx0LiAgeHQteGNjIGRvZXNuJ3QgdXNlIGFuIGV4dHVpLCBidXQgYXNzdW1lcyB0aGUKLSAgICAgKiBfX2FzbV9fIG1hY3JvIGZvbGxvd3MgY29udmVudGlvbiB0aGF0IHRoZSB1cHBlciAxNiBiaXRzIG9mIGFuCi0gICAgICogJ3Vuc2lnbmVkIHNob3J0JyByZXN1bHQgYXJlIHN0aWxsIHplcm8uICBUaGlzIG1hY3JvIGRvZXNuJ3QKLSAgICAgKiBmb2xsb3cgY29udmVudGlvbjsgaW5kZWVkLCBpdCBsZWF2ZXMgZ2FyYmFnZSBpbiB0aGUgdXBwb3J0IDE2Ci0gICAgICogYml0cyBvZiB0aGUgcmVnaXN0ZXIuCi0KLSAgICAgKiBEZWNsYXJpbmcgdGhlIHRlbXBvcmFyeSB2YXJpYWJsZXMgJ3JlcycgYW5kICd0bXAnIHRvIGJlIDMyLWJpdAotICAgICAqIHR5cGVzIHdoaWxlIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgZnVuY3Rpb24gaXMgYSAxNi1iaXQgdHlwZQotICAgICAqIGZvcmNlcyBib3RoIGNvbXBpbGVycyB0byBpbnNlcnQgZXhhY3RseSBvbmUgZXh0dWkgaW5zdHJ1Y3Rpb24KLSAgICAgKiAob3IgZXF1aXZhbGVudCkgdG8gbWFzayBvZmYgdGhlIHVwcGVyIDE2IGJpdHMuICovCi0KLSAgICBfX3UzMiByZXM7Ci0gICAgX191MzIgdG1wOwotCi0gICAgX19hc21fXygiZXh0dWkgICAgJTEsICUyLCA4LCA4XG5cdCIKLQkgICAgInNsbGkgICAgICUwLCAlMiwgOCAgIFxuXHQiCi0JICAgICJvciAgICAgICAlMCwgJTAsICUxICBcbiIKLQkgICAgOiAiPSZhIiAocmVzKSwgIj0mYSIgKHRtcCkKLQkgICAgOiAiYSIgKHgpCi0JICAgICk7Ci0KLSAgICByZXR1cm4gcmVzOwotfQotCi0jZGVmaW5lIF9fYXJjaF9fc3dhYjMyKHgpIF9fX2FyY2hfX3N3YWIzMih4KQotI2RlZmluZSBfX2FyY2hfX3N3YWIxNih4KSBfX19hcmNoX19zd2FiMTYoeCkKLQotI2lmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgfHwgZGVmaW5lZChfX0tFUk5FTF9fKQotIyAgZGVmaW5lIF9fQllURU9SREVSX0hBU19VNjRfXwotIyAgZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KLSNlbmRpZgotCi0jaWZkZWYgX19YVEVOU0FfRUxfXwotIyBpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvbGl0dGxlX2VuZGlhbi5oPgotI2VsaWYgZGVmaW5lZChfX1hURU5TQV9FQl9fKQotIyBpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvYmlnX2VuZGlhbi5oPgotI2Vsc2UKLSMgZXJyb3IgcHJvY2Vzc29yIGJ5dGUgb3JkZXIgdW5kZWZpbmVkIQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfWFRFTlNBX0JZVEVPUkRFUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvY2FjaGUuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9jYWNoZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmJhMmE1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9jYWNoZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9jYWNoZS5oCi0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCi0gKi8KLQotI2lmbmRlZiBfWFRFTlNBX0NBQ0hFX0gKLSNkZWZpbmUgX1hURU5TQV9DQUNIRV9ICi0KLSNpbmNsdWRlIDxhc20vdmFyaWFudC9jb3JlLmg+Ci0KLSNkZWZpbmUgTDFfQ0FDSEVfU0hJRlQJWENIQUxfRENBQ0hFX0xJTkVXSURUSAotI2RlZmluZSBMMV9DQUNIRV9CWVRFUwlYQ0hBTF9EQ0FDSEVfTElORVNJWkUKLSNkZWZpbmUgU01QX0NBQ0hFX0JZVEVTCUwxX0NBQ0hFX0JZVEVTCi0KLSNkZWZpbmUgRENBQ0hFX1dBWV9TSVpFCShYQ0hBTF9EQ0FDSEVfU0laRS9YQ0hBTF9EQ0FDSEVfV0FZUykKLSNkZWZpbmUgSUNBQ0hFX1dBWV9TSVpFCShYQ0hBTF9JQ0FDSEVfU0laRS9YQ0hBTF9JQ0FDSEVfV0FZUykKLSNkZWZpbmUgRENBQ0hFX1dBWV9TSElGVCAoWENIQUxfRENBQ0hFX1NFVFdJRFRIICsgWENIQUxfRENBQ0hFX0xJTkVXSURUSCkKLSNkZWZpbmUgSUNBQ0hFX1dBWV9TSElGVCAoWENIQUxfSUNBQ0hFX1NFVFdJRFRIICsgWENIQUxfSUNBQ0hFX0xJTkVXSURUSCkKLQotLyogTWF4aW11bSBjYWNoZSBzaXplIHBlciB3YXkuICovCi0jaWYgRENBQ0hFX1dBWV9TSVpFID49IElDQUNIRV9XQVlfU0laRQotIyBkZWZpbmUgQ0FDSEVfV0FZX1NJWkUgRENBQ0hFX1dBWV9TSVpFCi0jZWxzZQotIyBkZWZpbmUgQ0FDSEVfV0FZX1NJWkUgSUNBQ0hFX1dBWV9TSVpFCi0jZW5kaWYKLQotCi0jZW5kaWYJLyogX1hURU5TQV9DQUNIRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvY2hlY2tzdW0uaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9jaGVja3N1bS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzUzNGM2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9jaGVja3N1bS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qCi0gKiBpbmNsdWRlL2FzbS14dGVuc2EvY2hlY2tzdW0uaAotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KLSAqLwotCi0jaWZuZGVmIF9YVEVOU0FfQ0hFQ0tTVU1fSAotI2RlZmluZSBfWFRFTlNBX0NIRUNLU1VNX0gKLQotI2luY2x1ZGUgPGxpbnV4L2luNi5oPgotI2luY2x1ZGUgPGFzbS92YXJpYW50L2NvcmUuaD4KLQotLyoKLSAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiBhIG1lbW9yeSBibG9jayBhdCBidWZmLCBsZW5ndGggbGVuLAotICogYW5kIGFkZHMgaW4gInN1bSIgKDMyLWJpdCkKLSAqCi0gKiByZXR1cm5zIGEgMzItYml0IG51bWJlciBzdWl0YWJsZSBmb3IgZmVlZGluZyBpbnRvIGl0c2VsZgotICogb3IgY3N1bV90Y3B1ZHBfbWFnaWMKLSAqCi0gKiB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggZXZlbiBsZW5ndGhzLCBleGNlcHQKLSAqIGZvciB0aGUgbGFzdCBmcmFnbWVudCwgd2hpY2ggbWF5IGJlIG9kZAotICoKLSAqIGl0J3MgYmVzdCB0byBoYXZlIGJ1ZmYgYWxpZ25lZCBvbiBhIDMyLWJpdCBib3VuZGFyeQotICovCi1hc21saW5rYWdlIF9fd3N1bSBjc3VtX3BhcnRpYWwoY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbiwgX193c3VtIHN1bSk7Ci0KLS8qCi0gKiB0aGUgc2FtZSBhcyBjc3VtX3BhcnRpYWwsIGJ1dCBjb3BpZXMgZnJvbSBzcmMgd2hpbGUgaXQKLSAqIGNoZWNrc3VtcywgYW5kIGhhbmRsZXMgdXNlci1zcGFjZSBwb2ludGVyIGV4Y2VwdGlvbnMgY29ycmVjdGx5LCB3aGVuIG5lZWRlZC4KLSAqCi0gKiBoZXJlIGV2ZW4gbW9yZSBpbXBvcnRhbnQgdG8gYWxpZ24gc3JjIGFuZCBkc3Qgb24gYSAzMi1iaXQgKG9yIGV2ZW4KLSAqIGJldHRlciA2NC1iaXQpIGJvdW5kYXJ5Ci0gKi8KLQotYXNtbGlua2FnZSBfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYyhjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwgaW50IGxlbiwgX193c3VtIHN1bSwKLQkJCQkJCSAgIGludCAqc3JjX2Vycl9wdHIsIGludCAqZHN0X2Vycl9wdHIpOwotCi0vKgotICoJTm90ZTogd2hlbiB5b3UgZ2V0IGEgTlVMTCBwb2ludGVyIGV4Y2VwdGlvbiBoZXJlIHRoaXMgbWVhbnMgc29tZW9uZQotICoJcGFzc2VkIGluIGFuIGluY29ycmVjdCBrZXJuZWwgYWRkcmVzcyB0byBvbmUgb2YgdGhlc2UgZnVuY3Rpb25zLgotICoKLSAqCUlmIHlvdSB1c2UgdGhlc2UgZnVuY3Rpb25zIGRpcmVjdGx5IHBsZWFzZSBkb24ndCBmb3JnZXQgdGhlIGFjY2Vzc19vaygpLgotICovCi1zdGF0aWMgaW5saW5lCi1fX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwKLQkJCQkJaW50IGxlbiwgX193c3VtIHN1bSkKLXsKLQlyZXR1cm4gY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYyhzcmMsIGRzdCwgbGVuLCBzdW0sIE5VTEwsIE5VTEwpOwotfQotCi1zdGF0aWMgaW5saW5lCi1fX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IHZvaWQgX191c2VyICpzcmMsIHZvaWQgKmRzdCwKLQkJCQkJCWludCBsZW4sIF9fd3N1bSBzdW0sIGludCAqZXJyX3B0cikKLXsKLQlyZXR1cm4gY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYygoX19mb3JjZSBjb25zdCB2b2lkICopc3JjLCBkc3QsCi0JCQkJCWxlbiwgc3VtLCBlcnJfcHRyLCBOVUxMKTsKLX0KLQotLyoKLSAqCUZvbGQgYSBwYXJ0aWFsIGNoZWNrc3VtCi0gKi8KLQotc3RhdGljIF9faW5saW5lX18gX19zdW0xNiBjc3VtX2ZvbGQoX193c3VtIHN1bSkKLXsKLQl1bnNpZ25lZCBpbnQgX19kdW1teTsKLQlfX2FzbV9fKCJleHR1aQklMSwgJTAsIDE2LCAxNlxuXHQiCi0JCSJleHR1aQklMCAsJTAsIDAsIDE2XG5cdCIKLQkJImFkZAklMCwgJTAsICUxXG5cdCIKLQkJInNsbGkJJTEsICUwLCAxNlxuXHQiCi0JCSJhZGQJJTAsICUwLCAlMVxuXHQiCi0JCSJleHR1aQklMCwgJTAsIDE2LCAxNlxuXHQiCi0JCSJuZWcJJTAsICUwXG5cdCIKLQkJImFkZGkJJTAsICUwLCAtMVxuXHQiCi0JCSJleHR1aQklMCwgJTAsIDAsIDE2XG5cdCIKLQkJOiAiPXIiIChzdW0pLCAiPSZyIiAoX19kdW1teSkKLQkJOiAiMCIgKHN1bSkpOwotCXJldHVybiAoX19mb3JjZSBfX3N1bTE2KXN1bTsKLX0KLQotLyoKLSAqCVRoaXMgaXMgYSB2ZXJzaW9uIG9mIGlwX2NvbXB1dGVfY3N1bSgpIG9wdGltaXplZCBmb3IgSVAgaGVhZGVycywKLSAqCXdoaWNoIGFsd2F5cyBjaGVja3N1bSBvbiA0IG9jdGV0IGJvdW5kYXJpZXMuCi0gKi8KLXN0YXRpYyBfX2lubGluZV9fIF9fc3VtMTYgaXBfZmFzdF9jc3VtKGNvbnN0IHZvaWQgKmlwaCwgdW5zaWduZWQgaW50IGlobCkKLXsKLQl1bnNpZ25lZCBpbnQgc3VtLCB0bXAsIGVuZGFkZHI7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJInN1YgkJJTAsICUwLCAlMFxuXHQiCi0jaWYgWENIQUxfSEFWRV9MT09QUwotCQkibG9vcGd0egklMiwgMmZcblx0IgotI2Vsc2UKLQkJImJlcXoJCSUyLCAyZlxuXHQiCi0JCSJzbGxpCQklNCwgJTIsIDJcblx0IgotCQkiYWRkCQklNCwgJTQsICUxXG5cdCIKLQkJIjA6XHQiCi0jZW5kaWYKLQkJImwzMmkJCSUzLCAlMSwgMFxuXHQiCi0JCSJhZGQJCSUwLCAlMCwgJTNcblx0IgotCQkiYmdldQkJJTAsICUzLCAxZlxuXHQiCi0JCSJhZGRpCQklMCwgJTAsIDFcblx0IgotCQkiMTpcdCIKLQkJImFkZGkJCSUxLCAlMSwgNFxuXHQiCi0jaWYgIVhDSEFMX0hBVkVfTE9PUFMKLQkJImJsdAkJJTEsICU0LCAwYlxuXHQiCi0jZW5kaWYKLQkJIjI6XHQiCi0JLyogU2luY2UgdGhlIGlucHV0IHJlZ2lzdGVycyB3aGljaCBhcmUgbG9hZGVkIHdpdGggaXBoIGFuZCBpaGwKLQkgICBhcmUgbW9kaWZpZWQsIHdlIG11c3QgYWxzbyBzcGVjaWZ5IHRoZW0gYXMgb3V0cHV0cywgb3IgZ2NjCi0JICAgd2lsbCBhc3N1bWUgdGhleSBjb250YWluIHRoZWlyIG9yaWdpbmFsIHZhbHVlcy4gKi8KLQkJOiAiPXIiIChzdW0pLCAiPXIiIChpcGgpLCAiPXIiIChpaGwpLCAiPSZyIiAodG1wKSwgIj0mciIgKGVuZGFkZHIpCi0JCTogIjEiIChpcGgpLCAiMiIgKGlobCkpOwotCi0JcmV0dXJuCWNzdW1fZm9sZChzdW0pOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyBfX3dzdW0gY3N1bV90Y3B1ZHBfbm9mb2xkKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAotCQkJCQkJICAgdW5zaWduZWQgc2hvcnQgbGVuLAotCQkJCQkJICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCQkgICBfX3dzdW0gc3VtKQotewotCi0jaWZkZWYgX19YVEVOU0FfRUxfXwotCXVuc2lnbmVkIGxvbmcgbGVuX3Byb3RvID0gKGxlbiArIHByb3RvKSA8PCA4OwotI2VsaWYgZGVmaW5lZChfX1hURU5TQV9FQl9fKQotCXVuc2lnbmVkIGxvbmcgbGVuX3Byb3RvID0gbGVuICsgcHJvdG87Ci0jZWxzZQotIyBlcnJvciBwcm9jZXNzb3IgYnl0ZSBvcmRlciB1bmRlZmluZWQhCi0jZW5kaWYKLQlfX2FzbV9fKCJhZGQJJTAsICUwLCAlMVxuXHQiCi0JCSJiZ2V1CSUwLCAlMSwgMWZcblx0IgotCQkiYWRkaQklMCwgJTAsIDFcblx0IgotCQkiMTpcdCIKLQkJImFkZAklMCwgJTAsICUyXG5cdCIKLQkJImJnZXUJJTAsICUyLCAxZlxuXHQiCi0JCSJhZGRpCSUwLCAlMCwgMVxuXHQiCi0JCSIxOlx0IgotCQkiYWRkCSUwLCAlMCwgJTNcblx0IgotCQkiYmdldQklMCwgJTMsIDFmXG5cdCIKLQkJImFkZGkJJTAsICUwLCAxXG5cdCIKLQkJIjE6XHQiCi0JCTogIj1yIiAoc3VtKSwgIj1yIiAobGVuX3Byb3RvKQotCQk6ICJyIiAoZGFkZHIpLCAiciIgKHNhZGRyKSwgIjEiIChsZW5fcHJvdG8pLCAiMCIgKHN1bSkpOwotCXJldHVybiBzdW07Ci19Ci0KLS8qCi0gKiBjb21wdXRlcyB0aGUgY2hlY2tzdW0gb2YgdGhlIFRDUC9VRFAgcHNldWRvLWhlYWRlcgotICogcmV0dXJucyBhIDE2LWJpdCBjaGVja3N1bSwgYWxyZWFkeSBjb21wbGVtZW50ZWQKLSAqLwotc3RhdGljIF9faW5saW5lX18gX19zdW0xNiBjc3VtX3RjcHVkcF9tYWdpYyhfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKLQkJCQkJCSAgICAgICB1bnNpZ25lZCBzaG9ydCBsZW4sCi0JCQkJCQkgICAgICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCQkgICAgICAgX193c3VtIHN1bSkKLXsKLQlyZXR1cm4gY3N1bV9mb2xkKGNzdW1fdGNwdWRwX25vZm9sZChzYWRkcixkYWRkcixsZW4scHJvdG8sc3VtKSk7Ci19Ci0KLS8qCi0gKiB0aGlzIHJvdXRpbmUgaXMgdXNlZCBmb3IgbWlzY2VsbGFuZW91cyBJUC1saWtlIGNoZWNrc3VtcywgbWFpbmx5Ci0gKiBpbiBpY21wLmMKLSAqLwotCi1zdGF0aWMgX19pbmxpbmVfXyBfX3N1bTE2IGlwX2NvbXB1dGVfY3N1bShjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuKQotewotICAgIHJldHVybiBjc3VtX2ZvbGQgKGNzdW1fcGFydGlhbChidWZmLCBsZW4sIDApKTsKLX0KLQotI2RlZmluZSBfSEFWRV9BUkNIX0lQVjZfQ1NVTQotc3RhdGljIF9faW5saW5lX18gX19zdW0xNiBjc3VtX2lwdjZfbWFnaWMoY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkciwKLQkJCQkJICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLAotCQkJCQkgIF9fdTMyIGxlbiwgdW5zaWduZWQgc2hvcnQgcHJvdG8sCi0JCQkJCSAgX193c3VtIHN1bSkKLXsKLQl1bnNpZ25lZCBpbnQgX19kdW1teTsKLQlfX2FzbV9fKCJsMzJpCSUxLCAlMiwgMFxuXHQiCi0JCSJhZGQJJTAsICUwLCAlMVxuXHQiCi0JCSJiZ2V1CSUwLCAlMSwgMWZcblx0IgotCQkiYWRkaQklMCwgJTAsIDFcblx0IgotCQkiMTpcdCIKLQkJImwzMmkJJTEsICUyLCA0XG5cdCIKLQkJImFkZAklMCwgJTAsICUxXG5cdCIKLQkJImJnZXUJJTAsICUxLCAxZlxuXHQiCi0JCSJhZGRpCSUwLCAlMCwgMVxuXHQiCi0JCSIxOlx0IgotCQkibDMyaQklMSwgJTIsIDhcblx0IgotCQkiYWRkCSUwLCAlMCwgJTFcblx0IgotCQkiYmdldQklMCwgJTEsIDFmXG5cdCIKLQkJImFkZGkJJTAsICUwLCAxXG5cdCIKLQkJIjE6XHQiCi0JCSJsMzJpCSUxLCAlMiwgMTJcblx0IgotCQkiYWRkCSUwLCAlMCwgJTFcblx0IgotCQkiYmdldQklMCwgJTEsIDFmXG5cdCIKLQkJImFkZGkJJTAsICUwLCAxXG5cdCIKLQkJIjE6XHQiCi0JCSJsMzJpCSUxLCAlMywgMFxuXHQiCi0JCSJhZGQJJTAsICUwLCAlMVxuXHQiCi0JCSJiZ2V1CSUwLCAlMSwgMWZcblx0IgotCQkiYWRkaQklMCwgJTAsIDFcblx0IgotCQkiMTpcdCIKLQkJImwzMmkJJTEsICUzLCA0XG5cdCIKLQkJImFkZAklMCwgJTAsICUxXG5cdCIKLQkJImJnZXUJJTAsICUxLCAxZlxuXHQiCi0JCSJhZGRpCSUwLCAlMCwgMVxuXHQiCi0JCSIxOlx0IgotCQkibDMyaQklMSwgJTMsIDhcblx0IgotCQkiYWRkCSUwLCAlMCwgJTFcblx0IgotCQkiYmdldQklMCwgJTEsIDFmXG5cdCIKLQkJImFkZGkJJTAsICUwLCAxXG5cdCIKLQkJIjE6XHQiCi0JCSJsMzJpCSUxLCAlMywgMTJcblx0IgotCQkiYWRkCSUwLCAlMCwgJTFcblx0IgotCQkiYmdldQklMCwgJTEsIDFmXG5cdCIKLQkJImFkZGkJJTAsICUwLCAxXG5cdCIKLQkJIjE6XHQiCi0JCSJhZGQJJTAsICUwLCAlNFxuXHQiCi0JCSJiZ2V1CSUwLCAlNCwgMWZcblx0IgotCQkiYWRkaQklMCwgJTAsIDFcblx0IgotCQkiMTpcdCIKLQkJImFkZAklMCwgJTAsICU1XG5cdCIKLQkJImJnZXUJJTAsICU1LCAxZlxuXHQiCi0JCSJhZGRpCSUwLCAlMCwgMVxuXHQiCi0JCSIxOlx0IgotCQk6ICI9ciIgKHN1bSksICI9JnIiIChfX2R1bW15KQotCQk6ICJyIiAoc2FkZHIpLCAiciIgKGRhZGRyKSwKLQkJICAiciIgKGh0b25sKGxlbikpLCAiciIgKGh0b25sKHByb3RvKSksICIwIiAoc3VtKSk7Ci0KLQlyZXR1cm4gY3N1bV9mb2xkKHN1bSk7Ci19Ci0KLS8qCi0gKglDb3B5IGFuZCBjaGVja3N1bSB0byB1c2VyCi0gKi8KLSNkZWZpbmUgSEFWRV9DU1VNX0NPUFlfVVNFUgotc3RhdGljIF9faW5saW5lX18gX193c3VtIGNzdW1fYW5kX2NvcHlfdG9fdXNlcihjb25zdCB2b2lkICpzcmMsIHZvaWQgX191c2VyICpkc3QsCi0JCQkJICAgIGludCBsZW4sIF9fd3N1bSBzdW0sIGludCAqZXJyX3B0cikKLXsKLQlpZiAoYWNjZXNzX29rKFZFUklGWV9XUklURSwgZHN0LCBsZW4pKQotCQlyZXR1cm4gY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYyhzcmMsIGRzdCwgbGVuLCBzdW0sIE5VTEwsIGVycl9wdHIpOwotCi0JaWYgKGxlbikKLQkJKmVycl9wdHIgPSAtRUZBVUxUOwotCi0JcmV0dXJuIChfX2ZvcmNlIF9fd3N1bSktMTsgLyogaW52YWxpZCBjaGVja3N1bSAqLwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvY29wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9jb3Byb2Nlc3Nvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2JjZjkwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9jb3Byb2Nlc3Nvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qCi0gKiBpbmNsdWRlL2FzbS14dGVuc2EvY29wcm9jZXNzb3IuaAotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDcgVGVuc2lsaWNhIEluYy4KLSAqLwotCi0KLSNpZm5kZWYgX1hURU5TQV9DT1BST0NFU1NPUl9ICi0jZGVmaW5lIF9YVEVOU0FfQ09QUk9DRVNTT1JfSAotCi0jaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+Ci0jaW5jbHVkZSA8YXNtL3ZhcmlhbnQvdGllLmg+Ci0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+Ci0KLSNpZmRlZiBfX0FTU0VNQkxZX18KLSMgaW5jbHVkZSA8YXNtL3ZhcmlhbnQvdGllLWFzbS5oPgotCi0ubWFjcm8JeGNoYWxfc2Ffc3RhcnQgIGEgYgotCS5zZXQgLkx4Y2hhbF9wb2ZzXywgMAotCS5zZXQgLkx4Y2hhbF9vZnNfLCAwCi0uZW5kbQotCi0ubWFjcm8JeGNoYWxfc2FfYWxpZ24gIHB0ciBtaW5vZnMgbWF4b2ZzIG9mc2FsaWduIHRvdGFsaWduCi0JLnNldAkuTHhjaGFsX29mc18sIC5MeGNoYWxfb2ZzXyArIC5MeGNoYWxfcG9mc18gKyBcdG90YWxpZ24gLSAxCi0JLnNldAkuTHhjaGFsX29mc18sICguTHhjaGFsX29mc18gJiAtXHRvdGFsaWduKSAtIC5MeGNoYWxfcG9mc18KLS5lbmRtCi0KLSNkZWZpbmUgX1NFTEVDVAkoICBYVEhBTF9TQVNfVElFIHwgWFRIQUxfU0FTX09QVCBcCi0JCSB8IFhUSEFMX1NBU19DQyBcCi0JCSB8IFhUSEFMX1NBU19DQUxSIHwgWFRIQUxfU0FTX0NBTEUgKQotCi0ubWFjcm8gc2F2ZV94dHJlZ3Nfb3B0IHB0ciBjbGIgYXQxIGF0MiBhdDMgYXQ0IG9mZnNldAotCS5pZiBYVFJFR1NfT1BUX1NJWkUgPiAwCi0JCWFkZGkJXGNsYiwgXHB0ciwgXG9mZnNldAotCQl4Y2hhbF9uY3Bfc3RvcmUgXGNsYiBcYXQxIFxhdDIgXGF0MyBcYXQ0IHNlbGVjdD1fU0VMRUNUCi0JLmVuZGlmCi0uZW5kbQotCi0ubWFjcm8gbG9hZF94dHJlZ3Nfb3B0IHB0ciBjbGIgYXQxIGF0MiBhdDMgYXQ0IG9mZnNldAotCS5pZiBYVFJFR1NfT1BUX1NJWkUgPiAwCi0JCWFkZGkJXGNsYiwgXHB0ciwgXG9mZnNldAotCQl4Y2hhbF9uY3BfbG9hZCBcY2xiIFxhdDEgXGF0MiBcYXQzIFxhdDQgc2VsZWN0PV9TRUxFQ1QKLQkuZW5kaWYKLS5lbmRtCi0jdW5kZWYgX1NFTEVDVAotCi0jZGVmaW5lIF9TRUxFQ1QJKCAgWFRIQUxfU0FTX1RJRSB8IFhUSEFMX1NBU19PUFQgXAotCQkgfCBYVEhBTF9TQVNfTk9DQyBcCi0JCSB8IFhUSEFMX1NBU19DQUxSIHwgWFRIQUxfU0FTX0NBTEUgfCBYVEhBTF9TQVNfR0xPQiApCi0KLS5tYWNybyBzYXZlX3h0cmVnc191c2VyIHB0ciBjbGIgYXQxIGF0MiBhdDMgYXQ0IG9mZnNldAotCS5pZiBYVFJFR1NfVVNFUl9TSVpFID4gMAotCQlhZGRpCVxjbGIsIFxwdHIsIFxvZmZzZXQKLQkJeGNoYWxfbmNwX3N0b3JlIFxjbGIgXGF0MSBcYXQyIFxhdDMgXGF0NCBzZWxlY3Q9X1NFTEVDVAotCS5lbmRpZgotLmVuZG0KLQotLm1hY3JvIGxvYWRfeHRyZWdzX3VzZXIgcHRyIGNsYiBhdDEgYXQyIGF0MyBhdDQgb2Zmc2V0Ci0JLmlmIFhUUkVHU19VU0VSX1NJWkUgPiAwCi0JCWFkZGkJXGNsYiwgXHB0ciwgXG9mZnNldAotCQl4Y2hhbF9uY3BfbG9hZCBcY2xiIFxhdDEgXGF0MiBcYXQzIFxhdDQgc2VsZWN0PV9TRUxFQ1QKLQkuZW5kaWYKLS5lbmRtCi0jdW5kZWYgX1NFTEVDVAotCi0KLQotI2VuZGlmCS8qIF9fQVNTRU1CTFlfXyAqLwotCi0vKgotICogWFRFTlNBX0hBVkVfQ09QUk9DRVNTT1IoeCkgcmV0dXJucyAxIGlmIGNvcHJvY2Vzc29yIHggaXMgY29uZmlndXJlZC4KLSAqCi0gKiBYVEVOU0FfSEFWRV9JT19QT1JUKHgpIHJldHVybnMgMSBpZiBpby1wb3J0IHggaXMgY29uZmlndXJlZC4KLSAqCi0gKi8KLQotI2RlZmluZSBYVEVOU0FfSEFWRV9DT1BST0NFU1NPUih4KQkJCQkJXAotCSgoWENIQUxfQ1BfTUFTSyBeIFhDSEFMX0NQX1BPUlRfTUFTSykgJiAoMSA8PCAoeCkpKQotI2RlZmluZSBYVEVOU0FfSEFWRV9DT1BST0NFU1NPUlMJCQkJCVwKLQkoWENIQUxfQ1BfTUFTSyBeIFhDSEFMX0NQX1BPUlRfTUFTSykKLSNkZWZpbmUgWFRFTlNBX0hBVkVfSU9fUE9SVCh4KQkJCQkJCVwKLQkoWENIQUxfQ1BfUE9SVF9NQVNLICYgKDEgPDwgKHgpKSkKLSNkZWZpbmUgWFRFTlNBX0hBVkVfSU9fUE9SVFMJCQkJCQlcCi0JWENIQUxfQ1BfUE9SVF9NQVNLCi0KLSNpZm5kZWYgX19BU1NFTUJMWV9fCi0KLQotI2lmIFhDSEFMX0hBVkVfQ1AKLQotI2RlZmluZSBSU1JfQ1BFTkFCTEUoeCkJZG8gewkJCQkJCSAgXAotCV9fYXNtX18gX192b2xhdGlsZV9fKCJyc3IgJTAsIiBfX3N0cmluZ2lmeShDUEVOQUJMRSkgOiAiPWEiICh4KSk7IFwKLQl9IHdoaWxlKDApOwotI2RlZmluZSBXU1JfQ1BFTkFCTEUoeCkJZG8gewkJCQkJCSAgXAotICAJX19hc21fXyBfX3ZvbGF0aWxlX18oIndzciAlMCwiIF9fc3RyaW5naWZ5KENQRU5BQkxFKSAiOyByc3luYyIgCSAgXAotCSAgICAJCSAgICAgOjogImEiICh4KSk7CQkJCSAgXAotCX0gd2hpbGUoMCk7Ci0KLSNlbmRpZiAvKiBYQ0hBTF9IQVZFX0NQICovCi0KLQotLyoKLSAqIEFkZGl0aW9uYWwgcmVnaXN0ZXJzLgotICogV2UgZGVmaW5lIHRocmVlIHR5cGVzIG9mIGFkZGl0aW9uYWwgcmVnaXN0ZXJzOgotICogIGV4dDogZXh0cmEgcmVnaXN0ZXJzIHRoYXQgYXJlIHVzZWQgYnkgdGhlIGNvbXBpbGVyCi0gKiAgY3BuOiBvcHRpb25hbCByZWdpc3RlcnMgdGhhdCBjYW4gYmUgdXNlZCBieSBhIHVzZXIgYXBwbGljYXRpb24KLSAqICBjcFg6IGNvcHJvY2Vzc29yIHJlZ2lzdGVycyB0aGF0IGNhbiBvbmx5IGJlIHVzZWQgaWYgdGhlIGNvcnJlc3BvbmRpbmcKLSAqICAgICAgIENQRU5BQkxFIGJpdCBpcyBzZXQuCi0gKi8KLQotI2RlZmluZSBYQ0hBTF9TQV9SRUcobGlzdCxjYyxhYmksdHlwZSx5LG5hbWUseixhbGlnbixzaXplLC4uLikJXAotCV9fUkVHICMjIGxpc3QgKGNjLCBhYmksIHR5cGUsIG5hbWUsIHNpemUsIGFsaWduKQotCi0jZGVmaW5lIF9fUkVHMChjYyxhYmksdCxuYW1lLHMsYSkJX19SRUcwXyAjIyBjYyAoYWJpLG5hbWUpCi0jZGVmaW5lIF9fUkVHMShjYyxhYmksdCxuYW1lLHMsYSkJX19SRUcxXyAjIyBjYyAobmFtZSkKLSNkZWZpbmUgX19SRUcyKGNjLGFiaSx0eXBlLC4uLikJCV9fUkVHMl8gIyMgdHlwZSAoX19WQV9BUkdTX18pCi0KLSNkZWZpbmUgX19SRUcwXzAoYWJpLG5hbWUpCi0jZGVmaW5lIF9fUkVHMF8xKGFiaSxuYW1lKQkJX19SRUcwXzEgIyMgYWJpIChuYW1lKQotI2RlZmluZSBfX1JFRzBfMTAobmFtZSkJX191MzIgbmFtZTsKLSNkZWZpbmUgX19SRUcwXzExKG5hbWUpCV9fdTMyIG5hbWU7Ci0jZGVmaW5lIF9fUkVHMF8xMihuYW1lKQotCi0jZGVmaW5lIF9fUkVHMV8wKG5hbWUpCV9fdTMyIG5hbWU7Ci0jZGVmaW5lIF9fUkVHMV8xKG5hbWUpCi0KLSNkZWZpbmUgX19SRUcyXzAobixzLGEpCV9fdTMyIG5hbWU7Ci0jZGVmaW5lIF9fUkVHMl8xKG4scyxhKQl1bnNpZ25lZCBjaGFyIG5bc10gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoYSkpKTsKLSNkZWZpbmUgX19SRUcyXzIobixzLGEpIHVuc2lnbmVkIGNoYXIgbltzXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZChhKSkpOwotCi10eXBlZGVmIHN0cnVjdCB7IFhDSEFMX05DUF9TQV9MSVNUKDApIH0geHRyZWdzX29wdF90Ci0JX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKFhDSEFMX05DUF9TQV9BTElHTikpKTsKLXR5cGVkZWYgc3RydWN0IHsgWENIQUxfTkNQX1NBX0xJU1QoMSkgfSB4dHJlZ3NfdXNlcl90Ci0JX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKFhDSEFMX05DUF9TQV9BTElHTikpKTsKLQotI2lmIFhURU5TQV9IQVZFX0NPUFJPQ0VTU09SUwotCi10eXBlZGVmIHN0cnVjdCB7IFhDSEFMX0NQMF9TQV9MSVNUKDIpIH0geHRyZWdzX2NwMF90Ci0JX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKFhDSEFMX0NQMF9TQV9BTElHTikpKTsKLXR5cGVkZWYgc3RydWN0IHsgWENIQUxfQ1AxX1NBX0xJU1QoMikgfSB4dHJlZ3NfY3AxX3QKLQlfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoWENIQUxfQ1AxX1NBX0FMSUdOKSkpOwotdHlwZWRlZiBzdHJ1Y3QgeyBYQ0hBTF9DUDJfU0FfTElTVCgyKSB9IHh0cmVnc19jcDJfdAotCV9fYXR0cmlidXRlX18gKChhbGlnbmVkIChYQ0hBTF9DUDJfU0FfQUxJR04pKSk7Ci10eXBlZGVmIHN0cnVjdCB7IFhDSEFMX0NQM19TQV9MSVNUKDIpIH0geHRyZWdzX2NwM190Ci0JX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKFhDSEFMX0NQM19TQV9BTElHTikpKTsKLXR5cGVkZWYgc3RydWN0IHsgWENIQUxfQ1A0X1NBX0xJU1QoMikgfSB4dHJlZ3NfY3A0X3QKLQlfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoWENIQUxfQ1A0X1NBX0FMSUdOKSkpOwotdHlwZWRlZiBzdHJ1Y3QgeyBYQ0hBTF9DUDVfU0FfTElTVCgyKSB9IHh0cmVnc19jcDVfdAotCV9fYXR0cmlidXRlX18gKChhbGlnbmVkIChYQ0hBTF9DUDVfU0FfQUxJR04pKSk7Ci10eXBlZGVmIHN0cnVjdCB7IFhDSEFMX0NQNl9TQV9MSVNUKDIpIH0geHRyZWdzX2NwNl90Ci0JX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKFhDSEFMX0NQNl9TQV9BTElHTikpKTsKLXR5cGVkZWYgc3RydWN0IHsgWENIQUxfQ1A3X1NBX0xJU1QoMikgfSB4dHJlZ3NfY3A3X3QKLQlfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoWENIQUxfQ1A3X1NBX0FMSUdOKSkpOwotCi1leHRlcm4gc3RydWN0IHRocmVhZF9pbmZvKiBjb3Byb2Nlc3Nvcl9vd25lcltYQ0hBTF9DUF9NQVhdOwotZXh0ZXJuIHZvaWQgY29wcm9jZXNzb3Jfc2F2ZSh2b2lkKiwgaW50KTsKLWV4dGVybiB2b2lkIGNvcHJvY2Vzc29yX2xvYWQodm9pZCosIGludCk7Ci1leHRlcm4gdm9pZCBjb3Byb2Nlc3Nvcl9mbHVzaChzdHJ1Y3QgdGhyZWFkX2luZm8qLCBpbnQpOwotZXh0ZXJuIHZvaWQgY29wcm9jZXNzb3JfcmVzdG9yZShzdHJ1Y3QgdGhyZWFkX2luZm8qLCBpbnQpOwotCi1leHRlcm4gdm9pZCBjb3Byb2Nlc3Nvcl9yZWxlYXNlX2FsbChzdHJ1Y3QgdGhyZWFkX2luZm8qKTsKLWV4dGVybiB2b2lkIGNvcHJvY2Vzc29yX2ZsdXNoX2FsbChzdHJ1Y3QgdGhyZWFkX2luZm8qKTsKLQotc3RhdGljIGlubGluZSB2b2lkIGNvcHJvY2Vzc29yX2NsZWFyX2NwZW5hYmxlKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBpID0gMDsKLQlXU1JfQ1BFTkFCTEUoaSk7Ci19Ci0KLSNlbmRpZgkvKiBYVEVOU0FfSEFWRV9DT1BST0NFU1NPUlMgKi8KLQotI2VuZGlmCS8qICFfX0FTU0VNQkxZX18gKi8KLSNlbmRpZgkvKiBfWFRFTlNBX0NPUFJPQ0VTU09SX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9pcnEuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9pcnEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM3M2I3Zi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvaXJxLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogaW5jbHVkZS9hc20teHRlbnNhL2lycS5oCi0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgotICovCi0KLSNpZm5kZWYgX1hURU5TQV9JUlFfSAotI2RlZmluZSBfWFRFTlNBX0lSUV9ICi0KLSNpbmNsdWRlIDxhc20vcGxhdGZvcm0vaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vdmFyaWFudC9jb3JlLmg+Ci0KLSNpZm5kZWYgUExBVEZPUk1fTlJfSVJRUwotIyBkZWZpbmUgUExBVEZPUk1fTlJfSVJRUyAwCi0jZW5kaWYKLSNkZWZpbmUgWFRFTlNBX05SX0lSUVMgWENIQUxfTlVNX0lOVEVSUlVQVFMKLSNkZWZpbmUgTlJfSVJRUyAoWFRFTlNBX05SX0lSUVMgKyBQTEFURk9STV9OUl9JUlFTKQotCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgaXJxX2Nhbm9uaWNhbGl6ZShpbnQgaXJxKQotewotCXJldHVybiAoaXJxKTsKLX0KLQotc3RydWN0IGlycWFjdGlvbjsKLQotI2VuZGlmCS8qIF9YVEVOU0FfSVJRX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wbGF0Zm9ybS5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3BsYXRmb3JtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MTM1YTkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL3BsYXRmb3JtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogaW5jbHVkZS9hc20teHRlbnNhL3BsYXRmb3JtLmgKLSAqCi0gKiBQbGF0Zm9ybSBzcGVjaWZpYyBmdW5jdGlvbnMKLSAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsCi0gKiBQdWJsaWMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mCi0gKiB0aGlzIGFyY2hpdmUgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCi0gKi8KLQotI2lmbmRlZiBfWFRFTlNBX1BMQVRGT1JNX0gKLSNkZWZpbmUgX1hURU5TQV9QTEFURk9STV9ICi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotCi0jaW5jbHVkZSA8YXNtL2Jvb3RwYXJhbS5oPgotCi0vKgotICogcGxhdGZvcm1faW5pdCBpcyBjYWxsZWQgYmVmb3JlIHRoZSBtbXUgaXMgaW5pdGlhbGl6ZWQgdG8gZ2l2ZSB0aGUKLSAqIHBsYXRmb3JtIGEgZWFybHkgaG9vay11cC4gYnBfdGFnX3QgaXMgYSBsaXN0IG9mIGNvbmZpZ3VyYXRpb24gdGFncwotICogcGFzc2VkIGZyb20gdGhlIGJvb3QtbG9hZGVyLgotICovCi1leHRlcm4gdm9pZCBwbGF0Zm9ybV9pbml0KGJwX3RhZ190Kik7Ci0KLS8qCi0gKiBwbGF0Zm9ybV9zZXR1cCBpcyBjYWxsZWQgZnJvbSBzZXR1cF9hcmNoIHdpdGggYSBwb2ludGVyIHRvIHRoZSBjb21tYW5kLWxpbmUKLSAqIHN0cmluZy4KLSAqLwotZXh0ZXJuIHZvaWQgcGxhdGZvcm1fc2V0dXAgKGNoYXIgKiopOwotCi0vKgotICogcGxhdGZvcm1faW5pdF9pcnEgaXMgY2FsbGVkIGZyb20gaW5pdF9JUlEuCi0gKi8KLWV4dGVybiB2b2lkIHBsYXRmb3JtX2luaXRfaXJxICh2b2lkKTsKLQotLyoKLSAqIHBsYXRmb3JtX3Jlc3RhcnQgaXMgY2FsbGVkIHRvIHJlc3RhcnQgdGhlIHN5c3RlbS4KLSAqLwotZXh0ZXJuIHZvaWQgcGxhdGZvcm1fcmVzdGFydCAodm9pZCk7Ci0KLS8qCi0gKiBwbGF0Zm9ybV9oYWx0IGlzIGNhbGxlZCB0byBzdG9wIHRoZSBzeXN0ZW0gYW5kIGhhbHQuCi0gKi8KLWV4dGVybiB2b2lkIHBsYXRmb3JtX2hhbHQgKHZvaWQpOwotCi0vKgotICogcGxhdGZvcm1fcG93ZXJfb2ZmIGlzIGNhbGxlZCB0byBzdG9wIHRoZSBzeXN0ZW0gYW5kIHBvd2VyIGl0IG9mZi4KLSAqLwotZXh0ZXJuIHZvaWQgcGxhdGZvcm1fcG93ZXJfb2ZmICh2b2lkKTsKLQotLyoKLSAqIHBsYXRmb3JtX2lkbGUgaXMgY2FsbGVkIGZyb20gdGhlIGlkbGUgZnVuY3Rpb24uCi0gKi8KLWV4dGVybiB2b2lkIHBsYXRmb3JtX2lkbGUgKHZvaWQpOwotCi0vKgotICogcGxhdGZvcm1faGVhcnRiZWF0IGlzIGNhbGxlZCBldmVyeSBIWgotICovCi1leHRlcm4gdm9pZCBwbGF0Zm9ybV9oZWFydGJlYXQgKHZvaWQpOwotCi0vKgotICogcGxhdGZvcm1fcGNpYmlvc19pbml0IGlzIGNhbGxlZCB0byBhbGxvdyB0aGUgcGxhdGZvcm0gdG8gc2V0dXAgdGhlIHBjaSBidXMuCi0gKi8KLWV4dGVybiB2b2lkIHBsYXRmb3JtX3BjaWJpb3NfaW5pdCAodm9pZCk7Ci0KLS8qCi0gKiBwbGF0Zm9ybV9wY2liaW9zX2ZpeHVwIGFsbG93cyB0byBtb2RpZnkgdGhlIFBDSSBjb25maWd1cmF0aW9uLgotICovCi1leHRlcm4gaW50IHBsYXRmb3JtX3BjaWJpb3NfZml4dXAgKHZvaWQpOwotCi0vKgotICogcGxhdGZvcm1fY2FsaWJyYXRlX2Njb3VudCBjYWxpYnJhdGVzIGNwdSBjbG9jayBmcmVxIChDT05GSUdfWFRFTlNBX0NBTElCUkFURSkKLSAqLwotZXh0ZXJuIHZvaWQgcGxhdGZvcm1fY2FsaWJyYXRlX2Njb3VudCAodm9pZCk7Ci0KLS8qCi0gKiBwbGF0Zm9ybV9nZXRfcnRjX3RpbWUgcmV0dXJucyBSVEMgc2Vjb25kcyAocmV0dXJucyAwIGZvciBubyBlcnJvcikKLSAqLwotZXh0ZXJuIGludCBwbGF0Zm9ybV9nZXRfcnRjX3RpbWUodGltZV90Kik7Ci0KLS8qCi0gKiBwbGF0Zm9ybV9zZXRfcnRjX3RpbWUgc2V0IFJUQyBzZWNvbmRzIChyZXR1cm5zIDAgZm9yIG5vIGVycm9yKQotICovCi1leHRlcm4gaW50IHBsYXRmb3JtX3NldF9ydGNfdGltZSh0aW1lX3QpOwotCi0KLSNlbmRpZgkvKiBfWFRFTlNBX1BMQVRGT1JNX0ggKi8KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3Byb2Nlc3Nvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTE4YTRlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wcm9jZXNzb3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKgotICogaW5jbHVkZS9hc20teHRlbnNhL3Byb2Nlc3Nvci5oCi0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgotICovCi0KLSNpZm5kZWYgX1hURU5TQV9QUk9DRVNTT1JfSAotI2RlZmluZSBfWFRFTlNBX1BST0NFU1NPUl9ICi0KLSNpbmNsdWRlIDxhc20vdmFyaWFudC9jb3JlLmg+Ci0jaW5jbHVkZSA8YXNtL2NvcHJvY2Vzc29yLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KLSNpbmNsdWRlIDxhc20vdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vcmVncy5oPgotCi0vKiBBc3NlcnRpb25zLiAqLwotCi0jaWYgKFhDSEFMX0hBVkVfV0lORE9XRUQgIT0gMSkKLSMgZXJyb3IgTGludXggcmVxdWlyZXMgdGhlIFh0ZW5zYSBXaW5kb3dlZCBSZWdpc3RlcnMgT3B0aW9uLgotI2VuZGlmCi0KLS8qCi0gKiBVc2VyIHNwYWNlIHByb2Nlc3Mgc2l6ZTogMSBHQi4KLSAqIFdpbmRvd2VkIGNhbGwgQUJJIHJlcXVpcmVzIGNhbGxlciBhbmQgY2FsbGVlIHRvIGJlIGxvY2F0ZWQgd2l0aGluIHRoZSBzYW1lCi0gKiAxIEdCIHJlZ2lvbi4gVGhlIEMgY29tcGlsZXIgcGxhY2VzIHRyYW1wb2xpbmUgY29kZSBvbiB0aGUgc3RhY2sgZm9yIHNvdXJjZXMKLSAqIHRoYXQgdGFrZSB0aGUgYWRkcmVzcyBvZiBhIG5lc3RlZCBDIGZ1bmN0aW9uIChhIGZlYXR1cmUgdXNlZCBieSBnbGliYyksIHNvCi0gKiB0aGUgMSBHQiByZXF1aXJlbWVudCBhcHBsaWVzIHRvIHRoZSBzdGFjayBhcyB3ZWxsLgotICovCi0KLSNkZWZpbmUgVEFTS19TSVpFCV9fWFRFTlNBX1VMX0NPTlNUKDB4NDAwMDAwMDApCi0jZGVmaW5lIFNUQUNLX1RPUAlUQVNLX1NJWkUKLSNkZWZpbmUgU1RBQ0tfVE9QX01BWAlTVEFDS19UT1AKLQotLyoKLSAqIEdlbmVyYWwgZXhjZXB0aW9uIGNhdXNlIGFzc2lnbmVkIHRvIGRlYnVnIGV4Y2VwdGlvbnMuIERlYnVnIGV4Y2VwdGlvbnMgZ28KLSAqIHRvIHRoZWlyIG93biB2ZWN0b3IsIHJhdGhlciB0aGFuIHRoZSBnZW5lcmFsIGV4Y2VwdGlvbiB2ZWN0b3JzICh1c2VyLAotICoga2VybmVsLCBkb3VibGUpOyBhbmQgdGhlaXIgc3BlY2lmaWMgY2F1c2VzIGFyZSByZXBvcnRlZCB2aWEgREVCVUdDQVVTRQotICogcmF0aGVyIHRoYW4gRVhDQ0FVU0UuICBIb3dldmVyIGl0IGlzIHNvbWV0aW1lcyBjb252ZW5pZW50IHRvIHJlZGlyZWN0IGRlYnVnCi0gKiBleGNlcHRpb25zIHRvIHRoZSBnZW5lcmFsIGV4Y2VwdGlvbiBtZWNoYW5pc20uICBUbyBkbyB0aGlzLCBhbiBvdGhlcndpc2UKLSAqIHVudXNlZCBFWENDQVVTRSB2YWx1ZSB3YXMgYXNzaWduZWQgdG8gZGVidWcgZXhjZXB0aW9ucyBmb3IgdGhpcyBwdXJwb3NlLgotICovCi0KLSNkZWZpbmUgRVhDQ0FVU0VfTUFQUEVEX0RFQlVHCTYzCi0KLS8qCi0gKiBXZSB1c2UgREVQQyBhbHNvIGFzIGEgZmxhZyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGRvdWJsZSBhbmQgcmVndWxhcgotICogZXhjZXB0aW9ucy4gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIERFUEMgbWlnaHQgY29udGFpbiB0aGUgdmFsdWUgb2YKLSAqIEVYQ0NBVVNFIGZvciByZWd1bGFyIGV4Y2VwdGlvbnMsIHNvIHdlIHVzZSB0aGlzIGRlZmluaXRpb24gdG8gbWFyayBhCi0gKiB2YWxpZCBkb3VibGUgZXhjZXB0aW9uIGFkZHJlc3MuCi0gKiAoTm90ZTogV2UgdXNlIGl0IGluIGJnZXVpLCBzbyBpdCBzaG91bGQgYmUgNjQsIDEyOCwgb3IgMjU2KQotICovCi0KLSNkZWZpbmUgVkFMSURfRE9VQkxFX0VYQ0VQVElPTl9BRERSRVNTCTY0Ci0KLS8qIExPQ0tMRVZFTCBkZWZpbmVzIHRoZSBpbnRlcnJ1cHQgbGV2ZWwgdGhhdCBtYXNrcyBhbGwKLSAqIGdlbmVyYWwtcHVycG9zZSBpbnRlcnJ1cHRzLgotICovCi0jZGVmaW5lIExPQ0tMRVZFTCAxCi0KLS8qIFdTQklUUyBhbmQgV0JCSVRTIGFyZSB0aGUgd2lkdGggb2YgdGhlIFdJTkRPV1NUQVJUIGFuZCBXSU5ET1dCQVNFCi0gKiByZWdpc3RlcnMKLSAqLwotI2RlZmluZSBXU0JJVFMgIChYQ0hBTF9OVU1fQVJFR1MgLyA0KSAgICAgIC8qIHdpZHRoIG9mIFdJTkRPV1NUQVJUIGluIGJpdHMgKi8KLSNkZWZpbmUgV0JCSVRTICAoWENIQUxfTlVNX0FSRUdTX0xPRzIgLSAyKSAvKiB3aWR0aCBvZiBXSU5ET1dCQVNFIGluIGJpdHMgKi8KLQotI2lmbmRlZiBfX0FTU0VNQkxZX18KLQotLyogQnVpbGQgYSB2YWxpZCByZXR1cm4gYWRkcmVzcyBmb3IgdGhlIHNwZWNpZmllZCBjYWxsIHdpbnNpemUuCi0gKiB3aW5zaXplIG11c3QgYmUgMSAoY2FsbDQpLCAyIChjYWxsOCksIG9yIDMgKGNhbGwxMikKLSAqLwotI2RlZmluZSBNQUtFX1JBX0ZPUl9DQUxMKHJhLHdzKSAgICgoKHJhKSAmIDB4M2ZmZmZmZmYpIHwgKHdzKSA8PCAzMCkKLQotLyogQ29udmVydCByZXR1cm4gYWRkcmVzcyB0byBhIHZhbGlkIHBjCi0gKiBOb3RlOiBXZSBhc3N1bWUgdGhhdCB0aGUgc3RhY2sgcG9pbnRlciBpcyBpbiB0aGUgc2FtZSAxR0IgcmFuZ2VzIGFzIHRoZSByYQotICovCi0jZGVmaW5lIE1BS0VfUENfRlJPTV9SQShyYSxzcCkgICAgKCgocmEpICYgMHgzZmZmZmZmZikgfCAoKHNwKSAmIDB4YzAwMDAwMDApKQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdW5zaWduZWQgbG9uZyBzZWc7Ci19IG1tX3NlZ21lbnRfdDsKLQotc3RydWN0IHRocmVhZF9zdHJ1Y3QgewotCi0JLyoga2VybmVsJ3MgcmV0dXJuIGFkZHJlc3MgYW5kIHN0YWNrIHBvaW50ZXIgZm9yIGNvbnRleHQgc3dpdGNoaW5nICovCi0JdW5zaWduZWQgbG9uZyByYTsgLyoga2VybmVsJ3MgYTA6IHJldHVybiBhZGRyZXNzIGFuZCB3aW5kb3cgY2FsbCBzaXplICovCi0JdW5zaWduZWQgbG9uZyBzcDsgLyoga2VybmVsJ3MgYTE6IHN0YWNrIHBvaW50ZXIgKi8KLQotCW1tX3NlZ21lbnRfdCBjdXJyZW50X2RzOyAgICAvKiBzZWUgdWFjY2Vzcy5oIGZvciBleGFtcGxlIHVzZXMgKi8KLQotCS8qIHN0cnVjdCB4dGVuc2FfY3B1aW5mbyBpbmZvOyAqLwotCi0JdW5zaWduZWQgbG9uZyBiYWRfdmFkZHI7IC8qIGxhc3QgdXNlciBmYXVsdCAqLwotCXVuc2lnbmVkIGxvbmcgYmFkX3VhZGRyOyAvKiBsYXN0IGtlcm5lbCBmYXVsdCBhY2Nlc3NpbmcgdXNlciBzcGFjZSAqLwotCXVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZTsKLQotCXVuc2lnbmVkIGxvbmcgaWJyZWFrW1hDSEFMX05VTV9JQlJFQUtdOwotCXVuc2lnbmVkIGxvbmcgZGJyZWFrYVtYQ0hBTF9OVU1fREJSRUFLXTsKLQl1bnNpZ25lZCBsb25nIGRicmVha2NbWENIQUxfTlVNX0RCUkVBS107Ci0KLQkvKiBNYWtlIHN0cnVjdHVyZSAxNiBieXRlcyBhbGlnbmVkLiAqLwotCWludCBhbGlnblswXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgxNikpKTsKLX07Ci0KLQotLyoKLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgbWFjcm8gdGhhdCByZXR1cm5zIGN1cnJlbnQKLSAqIGluc3RydWN0aW9uIHBvaW50ZXIgKCJwcm9ncmFtIGNvdW50ZXIiKS4KLSAqLwotI2RlZmluZSBjdXJyZW50X3RleHRfYWRkcigpICAoeyBfX2xhYmVsX18gX2w7IF9sOiAmJl9sO30pCi0KLQotLyogVGhpcyBkZWNpZGVzIHdoZXJlIHRoZSBrZXJuZWwgd2lsbCBzZWFyY2ggZm9yIGEgZnJlZSBjaHVuayBvZiB2bQotICogc3BhY2UgZHVyaW5nIG1tYXAncy4KLSAqLwotI2RlZmluZSBUQVNLX1VOTUFQUEVEX0JBU0UJKFRBU0tfU0laRSAvIDIpCi0KLSNkZWZpbmUgSU5JVF9USFJFQUQgIFwKLXsJCQkJCQkJCQlcCi0JcmE6CQkwLCAJCQkJCQlcCi0Jc3A6CQlzaXplb2YoaW5pdF9zdGFjaykgKyAobG9uZykgJmluaXRfc3RhY2ssCVwKLQljdXJyZW50X2RzOgl7MH0sCQkJCQkJXAotCS8qaW5mbzoJCXswfSwgKi8JCQkJCQlcCi0JYmFkX3ZhZGRyOgkwLAkJCQkJCVwKLQliYWRfdWFkZHI6CTAsCQkJCQkJXAotCWVycm9yX2NvZGU6CTAsCQkJCQkJXAotfQotCi0KLS8qCi0gKiBEbyBuZWNlc3Nhcnkgc2V0dXAgdG8gc3RhcnQgdXAgYSBuZXdseSBleGVjdXRlZCB0aHJlYWQuCi0gKiBOb3RlOiBXZSBzZXQtdXAgcHMgYXMgaWYgd2UgZGlkIGEgY2FsbDQgdG8gdGhlIG5ldyBwYy4KLSAqICAgICAgIHNldF90aHJlYWRfc3RhdGUgaW4gc2lnbmFsLmMgZGVwZW5kcyBvbiBpdC4KLSAqLwotI2RlZmluZSBVU0VSX1BTX1ZBTFVFICgoMSA8PCBQU19XT0VfQklUKSB8CQkJCVwKLSAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgUFNfQ0FMTElOQ19TSElGVCkgfAkJCVwKLSAgICAgICAgICAgICAgICAgICAgICAgKFVTRVJfUklORyA8PCBQU19SSU5HX1NISUZUKSB8CQkJXAotICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBQU19VTV9CSVQpIHwJCQkJXAotICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBQU19FWENNX0JJVCkpCi0KLS8qIENsZWFyaW5nIGEwIHRlcm1pbmF0ZXMgdGhlIGJhY2t0cmFjZS4gKi8KLSNkZWZpbmUgc3RhcnRfdGhyZWFkKHJlZ3MsIG5ld19wYywgbmV3X3NwKSBcCi0JcmVncy0+cGMgPSBuZXdfcGM7IFwKLQlyZWdzLT5wcyA9IFVTRVJfUFNfVkFMVUU7IFwKLQlyZWdzLT5hcmVnWzFdID0gbmV3X3NwOyBcCi0JcmVncy0+YXJlZ1swXSA9IDA7IFwKLQlyZWdzLT53bWFzayA9IDE7IFwKLQlyZWdzLT5kZXBjID0gMDsgXAotCXJlZ3MtPndpbmRvd2Jhc2UgPSAwOyBcCi0JcmVncy0+d2luZG93c3RhcnQgPSAxOwotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9uICovCi1zdHJ1Y3QgdGFza19zdHJ1Y3Q7Ci1zdHJ1Y3QgbW1fc3RydWN0OwotCi0vKiBGcmVlIGFsbCByZXNvdXJjZXMgaGVsZCBieSBhIHRocmVhZC4gKi8KLSNkZWZpbmUgcmVsZWFzZV90aHJlYWQodGhyZWFkKSBkbyB7IH0gd2hpbGUoMCkKLQotLyogUHJlcGFyZSB0byBjb3B5IHRocmVhZCBzdGF0ZSAtIHVubGF6eSBhbGwgbGF6eSBzdGF0dXMgKi8KLWV4dGVybiB2b2lkIHByZXBhcmVfdG9fY29weShzdHJ1Y3QgdGFza19zdHJ1Y3QqKTsKLQotLyogQ3JlYXRlIGEga2VybmVsIHRocmVhZCB3aXRob3V0IHJlbW92aW5nIGl0IGZyb20gdGFza2xpc3RzICovCi1leHRlcm4gaW50IGtlcm5lbF90aHJlYWQoaW50ICgqZm4pKHZvaWQgKiksIHZvaWQgKiBhcmcsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwotCi0vKiBDb3B5IGFuZCByZWxlYXNlIGFsbCBzZWdtZW50IGluZm8gYXNzb2NpYXRlZCB3aXRoIGEgVk0gKi8KLSNkZWZpbmUgY29weV9zZWdtZW50cyhwLCBtbSkJZG8geyB9IHdoaWxlKDApCi0jZGVmaW5lIHJlbGVhc2Vfc2VnbWVudHMobW0pCWRvIHsgfSB3aGlsZSgwKQotI2RlZmluZSBmb3JnZXRfc2VnbWVudHMoKQlkbyB7IH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgdGhyZWFkX3NhdmVkX3BjKHRzaykJKHRhc2tfcHRfcmVncyh0c2spLT5wYykKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZ2V0X3djaGFuKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7Ci0KLSNkZWZpbmUgS1NUS19FSVAodHNrKQkJKHRhc2tfcHRfcmVncyh0c2spLT5wYykKLSNkZWZpbmUgS1NUS19FU1AodHNrKQkJKHRhc2tfcHRfcmVncyh0c2spLT5hcmVnWzFdKQotCi0jZGVmaW5lIGNwdV9yZWxheCgpICBiYXJyaWVyKCkKLQotLyogU3BlY2lhbCByZWdpc3RlciBhY2Nlc3MuICovCi0KLSNkZWZpbmUgV1NSKHYsc3IpIF9fYXNtX18gX192b2xhdGlsZV9fICgid3NyICUwLCJfX3N0cmluZ2lmeShzcikgOjogImEiKHYpKTsKLSNkZWZpbmUgUlNSKHYsc3IpIF9fYXNtX18gX192b2xhdGlsZV9fICgicnNyICUwLCJfX3N0cmluZ2lmeShzcikgOiAiPWEiKHYpKTsKLQotI2RlZmluZSBzZXRfc3IoeCxzcikgKHt1bnNpZ25lZCBpbnQgdj0odW5zaWduZWQgaW50KXg7IFdTUih2LHNyKTt9KQotI2RlZmluZSBnZXRfc3Ioc3IpICh7dW5zaWduZWQgaW50IHY7IFJTUih2LHNyKTsgdjsgfSkKLQotI2VuZGlmCS8qIF9fQVNTRU1CTFlfXyAqLwotI2VuZGlmCS8qIF9YVEVOU0FfUFJPQ0VTU09SX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wdHJhY2UuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9wdHJhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg5YjBkYi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvcHRyYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoKLSAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9wdHJhY2UuaAotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KLSAqLwotCi0jaWZuZGVmIF9YVEVOU0FfUFRSQUNFX0gKLSNkZWZpbmUgX1hURU5TQV9QVFJBQ0VfSAotCi0vKgotICogS2VybmVsIHN0YWNrCi0gKgotICogCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICAtLS0tLS0tLSBTVEFDS19TSVpFCi0gKiAJCXwgICAgIHJlZ2lzdGVyIGZpbGUgICAgIHwgIHwKLSAqIAkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgfAotICogCQl8ICAgIHN0cnVjdCBwdF9yZWdzICAgICB8ICB8Ci0gKiAJCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgIHwgLS0tLS0tIFBUX1JFR1NfT0ZGU0VUCi0gKiBkb3VibGUgCTogIDE2IGJ5dGVzIHNwaWxsIGFyZWEgIDogIHwgIF4KLSAqIGV4Y2V0aW9uIAk6LSAtIC0gLSAtIC0gLSAtIC0gLSAtIC06ICB8ICB8Ci0gKiBmcmFtZQk6ICAgIHN0cnVjdCBwdF9yZWdzICAgICA6ICB8ICB8Ci0gKiAJCTotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLTogIHwgIHwKLSAqIAkJfCAgICAgICAgICAgICAgICAgICAgICAgfCAgfCAgfAotICogCQl8ICAgICBtZW1vcnkgc3RhY2sgICAgICB8ICB8ICB8Ci0gKiAJCXwgICAgICAgICAgICAgICAgICAgICAgIHwgIHwgIHwKLSAqIAkJfiAgICAgICAgICAgICAgICAgICAgICAgfiAgfiAgfgotICogCQl+ICAgICAgICAgICAgICAgICAgICAgICB+ICB+ICB+Ci0gKiAJCXwgICAgICAgICAgICAgICAgICAgICAgIHwgIHwgIHwKLSAqIAkJfCAgICAgICAgICAgICAgICAgICAgICAgfCAgfCAgfAotICogCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICB8ICB8IC0tLSBTVEFDS19CSUFTCi0gKiAJCXwgIHN0cnVjdCB0YXNrX3N0cnVjdCAgIHwgIHwgIHwgIF4KLSAqICBjdXJyZW50IC0tPiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICB8ICB8ICB8Ci0gKiAJCXwgIHN0cnVjdCB0aHJlYWRfaW5mbyAgIHwgIHwgIHwgIHwKLSAqCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rIC0tLS0tLS0tCi0gKi8KLQotI2RlZmluZSBLRVJORUxfU1RBQ0tfU0laRSAoMiAqIFBBR0VfU0laRSkKLQotLyogIE9mZnNldHMgZm9yIGV4Y2VwdGlvbl9oYW5kbGVyc1tdICgzIHggNjQtZW50cmllcyB4IDQtYnl0ZSB0YWJsZXMpLiAqLwotCi0jZGVmaW5lIEVYQ19UQUJMRV9LU1RLCQkweDAwNAkvKiBLZXJuZWwgU3RhY2sgKi8KLSNkZWZpbmUgRVhDX1RBQkxFX0RPVUJMRV9TQVZFCTB4MDA4CS8qIERvdWJsZSBleGNlcHRpb24gc2F2ZSBhcmVhIGZvciBhMCAqLwotI2RlZmluZSBFWENfVEFCTEVfRklYVVAJCTB4MDBjCS8qIEZpeHVwIGhhbmRsZXIgKi8KLSNkZWZpbmUgRVhDX1RBQkxFX1BBUkFNCQkweDAxMAkvKiBGb3IgcGFzc2luZyBhIHBhcmFtZXRlciB0byBmaXh1cCAqLwotI2RlZmluZSBFWENfVEFCTEVfU1lTQ0FMTF9TQVZFCTB4MDE0CS8qIEZvciBmYXN0IHN5c2NhbGwgaGFuZGxlciAqLwotI2RlZmluZSBFWENfVEFCTEVfRkFTVF9VU0VSCTB4MTAwCS8qIEZhc3QgdXNlciBleGNlcHRpb24gaGFuZGxlciAqLwotI2RlZmluZSBFWENfVEFCTEVfRkFTVF9LRVJORUwJMHgyMDAJLyogRmFzdCBrZXJuZWwgZXhjZXB0aW9uIGhhbmRsZXIgKi8KLSNkZWZpbmUgRVhDX1RBQkxFX0RFRkFVTFQJMHgzMDAJLyogRGVmYXVsdCBDLUhhbmRsZXIgKi8KLSNkZWZpbmUgRVhDX1RBQkxFX1NJWkUJCTB4NDAwCi0KLS8qIFJlZ2lzdGVycyB1c2VkIGJ5IHN0cmFjZSAqLwotCi0jZGVmaW5lIFJFR19BX0JBU0UJMHgwMDAwCi0jZGVmaW5lIFJFR19BUl9CQVNFCTB4MDEwMAotI2RlZmluZSBSRUdfUEMJCTB4MDAyMAotI2RlZmluZSBSRUdfUFMJCTB4MDJlNgotI2RlZmluZSBSRUdfV0IJCTB4MDI0OAotI2RlZmluZSBSRUdfV1MJCTB4MDI0OQotI2RlZmluZSBSRUdfTEJFRwkweDAyMDAKLSNkZWZpbmUgUkVHX0xFTkQJMHgwMjAxCi0jZGVmaW5lIFJFR19MQ09VTlQJMHgwMjAyCi0jZGVmaW5lIFJFR19TQVIJCTB4MDIwMwotCi0jZGVmaW5lIFNZU0NBTExfTlIJMHgwMGZmCi0KLS8qIE90aGVyIFBUUkFDRV8gdmFsdWVzIGRlZmluZWQgaW4gPGxpbnV4L3B0cmFjZS5oPiB1c2luZyB2YWx1ZXMgMC05LDE2LDE3LDI0ICovCi0KLSNkZWZpbmUgUFRSQUNFX0dFVFJFR1MJCTEyCi0jZGVmaW5lIFBUUkFDRV9TRVRSRUdTCQkxMwotI2RlZmluZSBQVFJBQ0VfR0VUWFRSRUdTCTE4Ci0jZGVmaW5lIFBUUkFDRV9TRVRYVFJFR1MJMTkKLQotI2lmZGVmIF9fS0VSTkVMX18KLQotI2lmbmRlZiBfX0FTU0VNQkxZX18KLQotLyoKLSAqIFRoaXMgc3RydWN0IGRlZmluZXMgdGhlIHdheSB0aGUgcmVnaXN0ZXJzIGFyZSBzdG9yZWQgb24gdGhlCi0gKiBrZXJuZWwgc3RhY2sgZHVyaW5nIGEgc3lzdGVtIGNhbGwgb3Igb3RoZXIga2VybmVsIGVudHJ5LgotICovCi1zdHJ1Y3QgcHRfcmVncyB7Ci0JdW5zaWduZWQgbG9uZyBwYzsJCS8qICAgNCAqLwotCXVuc2lnbmVkIGxvbmcgcHM7CQkvKiAgIDggKi8KLQl1bnNpZ25lZCBsb25nIGRlcGM7CQkvKiAgMTIgKi8KLQl1bnNpZ25lZCBsb25nIGV4Y2NhdXNlOwkJLyogIDE2ICovCi0JdW5zaWduZWQgbG9uZyBleGN2YWRkcjsJCS8qICAyMCAqLwotCXVuc2lnbmVkIGxvbmcgZGVidWdjYXVzZTsJLyogIDI0ICovCi0JdW5zaWduZWQgbG9uZyB3bWFzazsJCS8qICAyOCAqLwotCXVuc2lnbmVkIGxvbmcgbGJlZzsJCS8qICAzMiAqLwotCXVuc2lnbmVkIGxvbmcgbGVuZDsJCS8qICAzNiAqLwotCXVuc2lnbmVkIGxvbmcgbGNvdW50OwkJLyogIDQwICovCi0JdW5zaWduZWQgbG9uZyBzYXI7CQkvKiAgNDQgKi8KLQl1bnNpZ25lZCBsb25nIHdpbmRvd2Jhc2U7CS8qICA0OCAqLwotCXVuc2lnbmVkIGxvbmcgd2luZG93c3RhcnQ7CS8qICA1MiAqLwotCXVuc2lnbmVkIGxvbmcgc3lzY2FsbDsJCS8qICA1NiAqLwotCXVuc2lnbmVkIGxvbmcgaWNvdW50bGV2ZWw7CS8qICA2MCAqLwotCWludCByZXNlcnZlZFsxXTsJCS8qICA2NCAqLwotCi0JLyogQWRkaXRpb25hbCBjb25maWd1cmFibGUgcmVnaXN0ZXJzIHRoYXQgYXJlIHVzZWQgYnkgdGhlIGNvbXBpbGVyLiAqLwotCXh0cmVnc19vcHRfdCB4dHJlZ3Nfb3B0OwotCi0JLyogTWFrZSBzdXJlIHRoZSBhcmVnIGZpZWxkIGlzIDE2IGJ5dGVzIGFsaWduZWQuICovCi0JaW50IGFsaWduWzBdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDE2KSkpOwotCi0JLyogY3VycmVudCByZWdpc3RlciBmcmFtZS4KLQkgKiBOb3RlOiBUaGUgRVNGIGZvciBrZXJuZWwgZXhjZXB0aW9ucyBlbmRzIGFmdGVyIDE2IHJlZ2lzdGVycyEKLQkgKi8KLQl1bnNpZ25lZCBsb25nIGFyZWdbMTZdOwkJLyogMTI4ICg2NCkgKi8KLX07Ci0KLSNpbmNsdWRlIDxhc20vdmFyaWFudC9jb3JlLmg+Ci0KLSMgZGVmaW5lIHRhc2tfcHRfcmVncyh0c2spICgoc3RydWN0IHB0X3JlZ3MqKSBcCi0gICh0YXNrX3N0YWNrX3BhZ2UodHNrKSArIEtFUk5FTF9TVEFDS19TSVpFIC0gKFhDSEFMX05VTV9BUkVHUy0xNikqNCkgLSAxKQotIyBkZWZpbmUgdXNlcl9tb2RlKHJlZ3MpICgoKHJlZ3MpLT5wcyAmIDB4MDAwMDAwMjApIT0wKQotIyBkZWZpbmUgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKSAoKHJlZ3MpLT5wYykKLWV4dGVybiB2b2lkIHNob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqKTsKLQotIyBpZm5kZWYgQ09ORklHX1NNUAotIyAgZGVmaW5lIHByb2ZpbGVfcGMocmVncykgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKQotIyBlbmRpZgotCi0jZWxzZQkvKiBfX0FTU0VNQkxZX18gKi8KLQotIyBpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KLSNkZWZpbmUgUFRfUkVHU19PRkZTRVQJICAoS0VSTkVMX1NUQUNLX1NJWkUgLSBQVF9VU0VSX1NJWkUpCi0KLSNlbmRpZgkvKiAhX19BU1NFTUJMWV9fICovCi0KLSNlbmRpZiAgLyogX19LRVJORUxfXyAqLwotCi0jZW5kaWYJLyogX1hURU5TQV9QVFJBQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3NlcmlhbC5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3NlcmlhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzA0MTE0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9zZXJpYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qCi0gKiBpbmNsdWRlL2FzbS14dGVuc2Evc2VyaWFsLmgKLSAqCi0gKiBDb25maWd1cmF0aW9uIGRldGFpbHMgZm9yIDgyNTAsIDE2NDUwLCAxNjU1MCwgZXRjLiBzZXJpYWwgcG9ydHMKLSAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCi0gKi8KLQotI2lmbmRlZiBfWFRFTlNBX1NFUklBTF9ICi0jZGVmaW5lIF9YVEVOU0FfU0VSSUFMX0gKLQotI2luY2x1ZGUgPGFzbS9wbGF0Zm9ybS9zZXJpYWwuaD4KLQotI2VuZGlmCS8qIF9YVEVOU0FfU0VSSUFMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS91bmFsaWduZWQuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS91bmFsaWduZWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYzNDI0Zi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvdW5hbGlnbmVkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogWHRlbnNhIGRvZXNuJ3QgaGFuZGxlIHVuYWxpZ25lZCBhY2Nlc3NlcyBlZmZpY2llbnRseS4KLSAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCi0gKi8KLSNpZm5kZWYgX0FTTV9YVEVOU0FfVU5BTElHTkVEX0gKLSNkZWZpbmUgX0FTTV9YVEVOU0FfVU5BTElHTkVEX0gKLQotI2lmZGVmIF9fWFRFTlNBX0VMX18KLSMgaW5jbHVkZSA8bGludXgvdW5hbGlnbmVkL2xlX21lbW1vdmUuaD4KLSMgaW5jbHVkZSA8bGludXgvdW5hbGlnbmVkL2JlX2J5dGVzaGlmdC5oPgotIyBpbmNsdWRlIDxsaW51eC91bmFsaWduZWQvZ2VuZXJpYy5oPgotIyBkZWZpbmUgZ2V0X3VuYWxpZ25lZAlfX2dldF91bmFsaWduZWRfbGUKLSMgZGVmaW5lIHB1dF91bmFsaWduZWQJX19wdXRfdW5hbGlnbmVkX2xlCi0jZWxpZiBkZWZpbmVkKF9fWFRFTlNBX0VCX18pCi0jIGluY2x1ZGUgPGxpbnV4L3VuYWxpZ25lZC9iZV9tZW1tb3ZlLmg+Ci0jIGluY2x1ZGUgPGxpbnV4L3VuYWxpZ25lZC9sZV9ieXRlc2hpZnQuaD4KLSMgaW5jbHVkZSA8bGludXgvdW5hbGlnbmVkL2dlbmVyaWMuaD4KLSMgZGVmaW5lIGdldF91bmFsaWduZWQJX19nZXRfdW5hbGlnbmVkX2JlCi0jIGRlZmluZSBwdXRfdW5hbGlnbmVkCV9fcHV0X3VuYWxpZ25lZF9iZQotI2Vsc2UKLSMgZXJyb3IgcHJvY2Vzc29yIGJ5dGUgb3JkZXIgdW5kZWZpbmVkIQotI2VuZGlmCi0KLSNlbmRpZgkvKiBfQVNNX1hURU5TQV9VTkFMSUdORURfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9LYnVpbGQgYi9pbmNsdWRlL2xpbnV4L0tidWlsZAppbmRleCA5NWFjODIzNC4uMTJlOWEyOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9LYnVpbGQKKysrIGIvaW5jbHVkZS9saW51eC9LYnVpbGQKQEAgLTU2LDggKzU2LDYgQEAKIGhlYWRlci15ICs9IGRsbV9uZXRsaW5rLmgKIGhlYWRlci15ICs9IGRtLWlvY3RsLmgKIGhlYWRlci15ICs9IGRuLmgKLWhlYWRlci15ICs9IGRxYmxrX3YxLmgKLWhlYWRlci15ICs9IGRxYmxrX3YyLmgKIGhlYWRlci15ICs9IGRxYmxrX3hmcy5oCiBoZWFkZXIteSArPSBlZnNfZnNfc2IuaAogaGVhZGVyLXkgKz0gZWxmLWZkcGljLmgKQEAgLTEzNCw4ICsxMzIsNiBAQAogaGVhZGVyLXkgKz0gcHBkZXYuaAogaGVhZGVyLXkgKz0gcHJjdGwuaAogaGVhZGVyLXkgKz0gcW54dHlwZXMuaAotaGVhZGVyLXkgKz0gcXVvdGFpb192MS5oCi1oZWFkZXIteSArPSBxdW90YWlvX3YyLmgKIGhlYWRlci15ICs9IHJhZGVvbmZiLmgKIGhlYWRlci15ICs9IHJhdy5oCiBoZWFkZXIteSArPSByZXNvdXJjZS5oCkBAIC0xODMsNyArMTc5LDYgQEAKIHVuaWZkZWYteSArPSBhdXh2ZWMuaAogdW5pZmRlZi15ICs9IGJpbmZtdHMuaAogdW5pZmRlZi15ICs9IGJsa3RyYWNlX2FwaS5oCi11bmlmZGVmLXkgKz0gYnl0ZW9yZGVyLmgKIHVuaWZkZWYteSArPSBjYXBhYmlsaXR5LmgKIHVuaWZkZWYteSArPSBjYXBpLmgKIHVuaWZkZWYteSArPSBjY2lzc19pb2N0bC5oCkBAIC0zNzYsMyArMzcxLDUgQEAKIHVuaWZkZWYteSArPSB4ZnJtLmgKIAogb2JqaGRyLXkgKz0gdmVyc2lvbi5oCitoZWFkZXIteSArPSB3aW1heC5oCitoZWFkZXIteSArPSB3aW1heC8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXN5bmMuaCBiL2luY2x1ZGUvbGludXgvYXN5bmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGVjYWNkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9hc3luYy5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBhc3luYy5oOiBBc3luY2hyb25vdXMgZnVuY3Rpb24gY2FsbHMgZm9yIGJvb3QgcGVyZm9ybWFuY2UKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogQXJqYW4gdmFuIGRlIFZlbiA8YXJqYW5AbGludXguaW50ZWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKK3R5cGVkZWYgdTY0IGFzeW5jX2Nvb2tpZV90OwordHlwZWRlZiB2b2lkIChhc3luY19mdW5jX3B0cikgKHZvaWQgKmRhdGEsIGFzeW5jX2Nvb2tpZV90IGNvb2tpZSk7CisKK2V4dGVybiBhc3luY19jb29raWVfdCBhc3luY19zY2hlZHVsZShhc3luY19mdW5jX3B0ciAqcHRyLCB2b2lkICpkYXRhKTsKK2V4dGVybiBhc3luY19jb29raWVfdCBhc3luY19zY2hlZHVsZV9zcGVjaWFsKGFzeW5jX2Z1bmNfcHRyICpwdHIsIHZvaWQgKmRhdGEsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpOworZXh0ZXJuIHZvaWQgYXN5bmNfc3luY2hyb25pemVfZnVsbCh2b2lkKTsKK2V4dGVybiB2b2lkIGFzeW5jX3N5bmNocm9uaXplX2Z1bGxfc3BlY2lhbChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KTsKK2V4dGVybiB2b2lkIGFzeW5jX3N5bmNocm9uaXplX2Nvb2tpZShhc3luY19jb29raWVfdCBjb29raWUpOworZXh0ZXJuIHZvaWQgYXN5bmNfc3luY2hyb25pemVfY29va2llX3NwZWNpYWwoYXN5bmNfY29va2llX3QgY29va2llLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KTsKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hc3luY190eC5oIGIvaW5jbHVkZS9saW51eC9hc3luY190eC5oCmluZGV4IDBmNTBkNGMuLjQ1ZjYyOTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYXN5bmNfdHguaAorKysgYi9pbmNsdWRlL2xpbnV4L2FzeW5jX3R4LmgKQEAgLTU5LDkgKzU5LDcgQEAKIH07CiAKICNpZmRlZiBDT05GSUdfRE1BX0VOR0lORQotdm9pZCBhc3luY190eF9pc3N1ZV9wZW5kaW5nX2FsbCh2b2lkKTsKLWVudW0gZG1hX3N0YXR1cyBkbWFfd2FpdF9mb3JfYXN5bmNfdHgoc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eCk7Ci12b2lkIGFzeW5jX3R4X3J1bl9kZXBlbmRlbmNpZXMoc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eCk7CisjZGVmaW5lIGFzeW5jX3R4X2lzc3VlX3BlbmRpbmdfYWxsIGRtYV9pc3N1ZV9wZW5kaW5nX2FsbAogI2lmZGVmIENPTkZJR19BUkNIX0hBU19BU1lOQ19UWF9GSU5EX0NIQU5ORUwKICNpbmNsdWRlIDxhc20vYXN5bmNfdHguaD4KICNlbHNlCkBAIC03NywxOSArNzUsNiBAQAogCWRvIHsgfSB3aGlsZSAoMCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgZW51bSBkbWFfc3RhdHVzCi1kbWFfd2FpdF9mb3JfYXN5bmNfdHgoc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eCkKLXsKLQlyZXR1cm4gRE1BX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotYXN5bmNfdHhfcnVuX2RlcGVuZGVuY2llcyhzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4LAotCXN0cnVjdCBkbWFfY2hhbiAqaG9zdF9jaGFuKQotewotCWRvIHsgfSB3aGlsZSAoMCk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgc3RydWN0IGRtYV9jaGFuICoKIGFzeW5jX3R4X2ZpbmRfY2hhbm5lbChzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlcGVuZF90eCwKIAllbnVtIGRtYV90cmFuc2FjdGlvbl90eXBlIHR4X3R5cGUsIHN0cnVjdCBwYWdlICoqZHN0LCBpbnQgZHN0X2NvdW50LApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hdG1lbC1tY2kuaCBiL2luY2x1ZGUvbGludXgvYXRtZWwtbWNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYxZjk1NwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvYXRtZWwtbWNpLmgKQEAgLTAsMCArMSwzOSBAQAorI2lmbmRlZiBfX0xJTlVYX0FUTUVMX01DSV9ICisjZGVmaW5lIF9fTElOVVhfQVRNRUxfTUNJX0gKKworI2RlZmluZSBBVE1FTF9NQ0lfTUFYX05SX1NMT1RTCTIKKworI2luY2x1ZGUgPGxpbnV4L2R3X2RtYWMuaD4KKworLyoqCisgKiBzdHJ1Y3QgbWNpX3Nsb3RfcGRhdGEgLSBib2FyZC1zcGVjaWZpYyBwZXItc2xvdCBjb25maWd1cmF0aW9uCisgKiBAYnVzX3dpZHRoOiBOdW1iZXIgb2YgZGF0YSBsaW5lcyB3aXJlZCB1cCB0aGUgc2xvdAorICogQGRldGVjdF9waW46IEdQSU8gcGluIHdpcmVkIHRvIHRoZSBjYXJkIGRldGVjdCBzd2l0Y2gKKyAqIEB3cF9waW46IEdQSU8gcGluIHdpcmVkIHRvIHRoZSB3cml0ZSBwcm90ZWN0IHNlbnNvcgorICoKKyAqIElmIGEgZ2l2ZW4gc2xvdCBpcyBub3QgcHJlc2VudCBvbiB0aGUgYm9hcmQsIEBidXNfd2lkdGggc2hvdWxkIGJlCisgKiBzZXQgdG8gMC4gVGhlIG90aGVyIGZpZWxkcyBhcmUgaWdub3JlZCBpbiB0aGlzIGNhc2UuCisgKgorICogQW55IHBpbnMgdGhhdCBhcmVuJ3QgYXZhaWxhYmxlIHNob3VsZCBiZSBzZXQgdG8gYSBuZWdhdGl2ZSB2YWx1ZS4KKyAqCisgKiBOb3RlIHRoYXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc2xvdHMgaXMgZXhwZXJpbWVudGFsIC0tIHNvbWUgY2FyZHMKKyAqIG1pZ2h0IGdldCB1cHNldCBpZiB3ZSBkb24ndCBnZXQgdGhlIGNsb2NrIG1hbmFnZW1lbnQgZXhhY3RseSByaWdodC4KKyAqIEJ1dCBpbiBtb3N0IGNhc2VzLCBpdCBzaG91bGQgd29yayBqdXN0IGZpbmUuCisgKi8KK3N0cnVjdCBtY2lfc2xvdF9wZGF0YSB7CisJdW5zaWduZWQgaW50CQlidXNfd2lkdGg7CisJaW50CQkJZGV0ZWN0X3BpbjsKKwlpbnQJCQl3cF9waW47Cit9OworCisvKioKKyAqIHN0cnVjdCBtY2lfcGxhdGZvcm1fZGF0YSAtIGJvYXJkLXNwZWNpZmljIE1NQy9TRGNhcmQgY29uZmlndXJhdGlvbgorICogQGRtYV9zbGF2ZTogRE1BIHNsYXZlIGludGVyZmFjZSB0byB1c2UgaW4gZGF0YSB0cmFuc2ZlcnMuCisgKiBAc2xvdDogUGVyLXNsb3QgY29uZmlndXJhdGlvbiBkYXRhLgorICovCitzdHJ1Y3QgbWNpX3BsYXRmb3JtX2RhdGEgeworCXN0cnVjdCBkd19kbWFfc2xhdmUJZG1hX3NsYXZlOworCXN0cnVjdCBtY2lfc2xvdF9wZGF0YQlzbG90W0FUTUVMX01DSV9NQVhfTlJfU0xPVFNdOworfTsKKworI2VuZGlmIC8qIF9fTElOVVhfQVRNRUxfTUNJX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXV0b19kZXYtaW9jdGwuaCBiL2luY2x1ZGUvbGludXgvYXV0b19kZXYtaW9jdGwuaAppbmRleCBmNGQwNWNjLi45MWE3NzM5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2F1dG9fZGV2LWlvY3RsLmgKKysrIGIvaW5jbHVkZS9saW51eC9hdXRvX2Rldi1pb2N0bC5oCkBAIC0xMCw2ICsxMCw3IEBACiAjaWZuZGVmIF9MSU5VWF9BVVRPX0RFVl9JT0NUTF9ICiAjZGVmaW5lIF9MSU5VWF9BVVRPX0RFVl9JT0NUTF9ICiAKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiAjZGVmaW5lIEFVVE9GU19ERVZJQ0VfTkFNRQkJImF1dG9mcyIKQEAgLTI1LDYgKzI2LDYwIEBACiAgKiBBbiBpb2N0bCBpbnRlcmZhY2UgZm9yIGF1dG9mcyBtb3VudCBwb2ludCBjb250cm9sLgogICovCiAKK3N0cnVjdCBhcmdzX3Byb3RvdmVyIHsKKwlfX3UzMgl2ZXJzaW9uOworfTsKKworc3RydWN0IGFyZ3NfcHJvdG9zdWJ2ZXIgeworCV9fdTMyCXN1Yl92ZXJzaW9uOworfTsKKworc3RydWN0IGFyZ3Nfb3Blbm1vdW50IHsKKwlfX3UzMglkZXZpZDsKK307CisKK3N0cnVjdCBhcmdzX3JlYWR5IHsKKwlfX3UzMgl0b2tlbjsKK307CisKK3N0cnVjdCBhcmdzX2ZhaWwgeworCV9fdTMyCXRva2VuOworCV9fczMyCXN0YXR1czsKK307CisKK3N0cnVjdCBhcmdzX3NldHBpcGVmZCB7CisJX19zMzIJcGlwZWZkOworfTsKKworc3RydWN0IGFyZ3NfdGltZW91dCB7CisJX191NjQJdGltZW91dDsKK307CisKK3N0cnVjdCBhcmdzX3JlcXVlc3RlciB7CisJX191MzIJdWlkOworCV9fdTMyCWdpZDsKK307CisKK3N0cnVjdCBhcmdzX2V4cGlyZSB7CisJX191MzIJaG93OworfTsKKworc3RydWN0IGFyZ3NfYXNrdW1vdW50IHsKKwlfX3UzMgltYXlfdW1vdW50OworfTsKKworc3RydWN0IGFyZ3NfaXNtb3VudHBvaW50IHsKKwl1bmlvbiB7CisJCXN0cnVjdCBhcmdzX2luIHsKKwkJCV9fdTMyCXR5cGU7CisJCX0gaW47CisJCXN0cnVjdCBhcmdzX291dCB7CisJCQlfX3UzMglkZXZpZDsKKwkJCV9fdTMyCW1hZ2ljOworCQl9IG91dDsKKwl9OworfTsKKwogLyoKICAqIEFsbCB0aGUgaW9jdGxzIHVzZSB0aGlzIHN0cnVjdHVyZS4KICAqIFdoZW4gc2VuZGluZyBhIHBhdGggc2l6ZSBtdXN0IGFjY291bnQgZm9yIHRoZSB0b3RhbCBsZW5ndGgKQEAgLTM5LDIwICs5NCwzMiBAQAogCQkJCSAqIGluY2x1ZGluZyB0aGlzIHN0cnVjdCAqLwogCV9fczMyIGlvY3RsZmQ7CQkvKiBhdXRvbW91bnQgY29tbWFuZCBmZCAqLwogCi0JX191MzIgYXJnMTsJCS8qIENvbW1hbmQgcGFyYW1ldGVycyAqLwotCV9fdTMyIGFyZzI7CisJLyogQ29tbWFuZCBwYXJhbWV0ZXJzICovCisKKwl1bmlvbiB7CisJCXN0cnVjdCBhcmdzX3Byb3RvdmVyCQlwcm90b3ZlcjsKKwkJc3RydWN0IGFyZ3NfcHJvdG9zdWJ2ZXIJCXByb3Rvc3VidmVyOworCQlzdHJ1Y3QgYXJnc19vcGVubW91bnQJCW9wZW5tb3VudDsKKwkJc3RydWN0IGFyZ3NfcmVhZHkJCXJlYWR5OworCQlzdHJ1Y3QgYXJnc19mYWlsCQlmYWlsOworCQlzdHJ1Y3QgYXJnc19zZXRwaXBlZmQJCXNldHBpcGVmZDsKKwkJc3RydWN0IGFyZ3NfdGltZW91dAkJdGltZW91dDsKKwkJc3RydWN0IGFyZ3NfcmVxdWVzdGVyCQlyZXF1ZXN0ZXI7CisJCXN0cnVjdCBhcmdzX2V4cGlyZQkJZXhwaXJlOworCQlzdHJ1Y3QgYXJnc19hc2t1bW91bnQJCWFza3Vtb3VudDsKKwkJc3RydWN0IGFyZ3NfaXNtb3VudHBvaW50CWlzbW91bnRwb2ludDsKKwl9OwogCiAJY2hhciBwYXRoWzBdOwogfTsKIAogc3RhdGljIGlubGluZSB2b2lkIGluaXRfYXV0b2ZzX2Rldl9pb2N0bChzdHJ1Y3QgYXV0b2ZzX2Rldl9pb2N0bCAqaW4pCiB7CisJbWVtc2V0KGluLCAwLCBzaXplb2Yoc3RydWN0IGF1dG9mc19kZXZfaW9jdGwpKTsKIAlpbi0+dmVyX21ham9yID0gQVVUT0ZTX0RFVl9JT0NUTF9WRVJTSU9OX01BSk9SOwogCWluLT52ZXJfbWlub3IgPSBBVVRPRlNfREVWX0lPQ1RMX1ZFUlNJT05fTUlOT1I7CiAJaW4tPnNpemUgPSBzaXplb2Yoc3RydWN0IGF1dG9mc19kZXZfaW9jdGwpOwogCWluLT5pb2N0bGZkID0gLTE7Ci0JaW4tPmFyZzEgPSAwOwotCWluLT5hcmcyID0gMDsKIAlyZXR1cm47CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXV0b19mczQuaCBiL2luY2x1ZGUvbGludXgvYXV0b19mczQuaAppbmRleCAyMjUzNzE2Li41NWZhNDc4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2F1dG9fZnM0LmgKKysrIGIvaW5jbHVkZS9saW51eC9hdXRvX2ZzNC5oCkBAIC0yOSwxMCArMjksNjQgQEAKICNkZWZpbmUgQVVUT0ZTX0VYUF9JTU1FRElBVEUJCTEKICNkZWZpbmUgQVVUT0ZTX0VYUF9MRUFWRVMJCTIKIAotI2RlZmluZSBBVVRPRlNfVFlQRV9BTlkJCQkweDAwMDAKLSNkZWZpbmUgQVVUT0ZTX1RZUEVfSU5ESVJFQ1QJCTB4MDAwMQotI2RlZmluZSBBVVRPRlNfVFlQRV9ESVJFQ1QJCTB4MDAwMgotI2RlZmluZSBBVVRPRlNfVFlQRV9PRkZTRVQJCTB4MDAwNAorI2RlZmluZSBBVVRPRlNfVFlQRV9BTlkJCQkwVQorI2RlZmluZSBBVVRPRlNfVFlQRV9JTkRJUkVDVAkJMVUKKyNkZWZpbmUgQVVUT0ZTX1RZUEVfRElSRUNUCQkyVQorI2RlZmluZSBBVVRPRlNfVFlQRV9PRkZTRVQJCTRVCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfYXV0b2ZzX3R5cGVfaW5kaXJlY3QodW5zaWduZWQgaW50ICp0eXBlKQoreworCSp0eXBlID0gQVVUT0ZTX1RZUEVfSU5ESVJFQ1Q7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBhdXRvZnNfdHlwZV9pbmRpcmVjdCh1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwlyZXR1cm4gKHR5cGUgPT0gQVVUT0ZTX1RZUEVfSU5ESVJFQ1QpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2F1dG9mc190eXBlX2RpcmVjdCh1bnNpZ25lZCBpbnQgKnR5cGUpCit7CisJKnR5cGUgPSBBVVRPRlNfVFlQRV9ESVJFQ1Q7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBhdXRvZnNfdHlwZV9kaXJlY3QodW5zaWduZWQgaW50IHR5cGUpCit7CisJcmV0dXJuICh0eXBlID09IEFVVE9GU19UWVBFX0RJUkVDVCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfYXV0b2ZzX3R5cGVfb2Zmc2V0KHVuc2lnbmVkIGludCAqdHlwZSkKK3sKKwkqdHlwZSA9IEFVVE9GU19UWVBFX09GRlNFVDsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGF1dG9mc190eXBlX29mZnNldCh1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwlyZXR1cm4gKHR5cGUgPT0gQVVUT0ZTX1RZUEVfT0ZGU0VUKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYXV0b2ZzX3R5cGVfdHJpZ2dlcih1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwlyZXR1cm4gKHR5cGUgPT0gQVVUT0ZTX1RZUEVfRElSRUNUIHx8IHR5cGUgPT0gQVVUT0ZTX1RZUEVfT0ZGU0VUKTsKK30KKworLyoKKyAqIFRoaXMgaXNuJ3QgcmVhbGx5IGEgdHlwZSBhcyB3ZSB1c2UgaXQgdG8gc2F5ICJubyB0eXBlIHNldCIgdG8KKyAqIGluZGljYXRlIHdlIHdhbnQgdG8gc2VhcmNoIGZvciAiYW55IiBtb3VudCBpbiB0aGUKKyAqIGF1dG9mc19kZXZfaW9jdGxfaXNtb3VudHBvaW50KCkgZGV2aWNlIGlvY3RsIGZ1bmN0aW9uLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2F1dG9mc190eXBlX2FueSh1bnNpZ25lZCBpbnQgKnR5cGUpCit7CisJKnR5cGUgPSBBVVRPRlNfVFlQRV9BTlk7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBhdXRvZnNfdHlwZV9hbnkodW5zaWduZWQgaW50IHR5cGUpCit7CisJcmV0dXJuICh0eXBlID09IEFVVE9GU19UWVBFX0FOWSk7Cit9CiAKIC8qIERhZW1vbiBub3RpZmljYXRpb24gcGFja2V0IHR5cGVzICovCiBlbnVtIGF1dG9mc19ub3RpZnkgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hdXh2ZWMuaCBiL2luY2x1ZGUvbGludXgvYXV4dmVjLmgKaW5kZXggZDdhZmE5ZC4uZjNiNWQ0ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hdXh2ZWMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2F1eHZlYy5oCkBAIC0yMywxNiArMjMsMTYgQEAKICNkZWZpbmUgQVRfUExBVEZPUk0gMTUgIC8qIHN0cmluZyBpZGVudGlmeWluZyBDUFUgZm9yIG9wdGltaXphdGlvbnMgKi8KICNkZWZpbmUgQVRfSFdDQVAgIDE2ICAgIC8qIGFyY2ggZGVwZW5kZW50IGhpbnRzIGF0IENQVSBjYXBhYmlsaXRpZXMgKi8KICNkZWZpbmUgQVRfQ0xLVENLIDE3CS8qIGZyZXF1ZW5jeSBhdCB3aGljaCB0aW1lcygpIGluY3JlbWVudHMgKi8KLQorLyogQVRfKiB2YWx1ZXMgMTggdGhyb3VnaCAyMiBhcmUgcmVzZXJ2ZWQgKi8KICNkZWZpbmUgQVRfU0VDVVJFIDIzICAgLyogc2VjdXJlIG1vZGUgYm9vbGVhbiAqLwotCiAjZGVmaW5lIEFUX0JBU0VfUExBVEZPUk0gMjQJLyogc3RyaW5nIGlkZW50aWZ5aW5nIHJlYWwgcGxhdGZvcm0sIG1heQogCQkJCSAqIGRpZmZlciBmcm9tIEFUX1BMQVRGT1JNLiAqLworI2RlZmluZSBBVF9SQU5ET00gMjUJLyogYWRkcmVzcyBvZiAxNiByYW5kb20gYnl0ZXMgKi8KIAogI2RlZmluZSBBVF9FWEVDRk4gIDMxCS8qIGZpbGVuYW1lIG9mIHByb2dyYW0gKi8KIAogI2lmZGVmIF9fS0VSTkVMX18KLSNkZWZpbmUgQVRfVkVDVE9SX1NJWkVfQkFTRSAxOCAvKiBORVdfQVVYX0VOVCBlbnRyaWVzIGluIGF1eGlsaWFyeSB0YWJsZSAqLworI2RlZmluZSBBVF9WRUNUT1JfU0laRV9CQVNFIDE5IC8qIE5FV19BVVhfRU5UIGVudHJpZXMgaW4gYXV4aWxpYXJ5IHRhYmxlICovCiAgIC8qIG51bWJlciBvZiAiI2RlZmluZSBBVF8uKiIgYWJvdmUsIG1pbnVzIHtBVF9OVUxMLCBBVF9JR05PUkUsIEFUX05PVEVMRn0gKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2JpbmZtdHMuaCBiL2luY2x1ZGUvbGludXgvYmluZm10cy5oCmluZGV4IDZjYmZiZTIuLjc3YjRhOWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmluZm10cy5oCisrKyBiL2luY2x1ZGUvbGludXgvYmluZm10cy5oCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIEJJTlBSTV9CVUZfU0laRSAxMjgKIAogI2lmZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAKICNkZWZpbmUgQ09SRU5BTUVfTUFYX1NJWkUgMTI4CiAKQEAgLTEwNiw3ICsxMDcsNyBAQAogZXh0ZXJuIGludCBicHJtX21tX2luaXQoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSk7CiBleHRlcm4gaW50IGNvcHlfc3RyaW5nc19rZXJuZWwoaW50IGFyZ2MsY2hhciAqKiBhcmd2LHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pOwogZXh0ZXJuIHZvaWQgaW5zdGFsbF9leGVjX2NyZWRzKHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pOwotZXh0ZXJuIGludCBkb19jb3JlZHVtcChsb25nIHNpZ25yLCBpbnQgZXhpdF9jb2RlLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpOworZXh0ZXJuIHZvaWQgZG9fY29yZWR1bXAobG9uZyBzaWduciwgaW50IGV4aXRfY29kZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogZXh0ZXJuIGludCBzZXRfYmluZm10KHN0cnVjdCBsaW51eF9iaW5mbXQgKm5ldyk7CiBleHRlcm4gdm9pZCBmcmVlX2Jwcm0oc3RydWN0IGxpbnV4X2JpbnBybSAqKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ibGtkZXYuaCBiL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKaW5kZXggNzAzNWNlYy4uMDQ0NDY3ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ibGtkZXYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCkBAIC02OTAsNiArNjkwLDggQEAKIAlzdHJ1Y3QgcGFnZSAqKnBhZ2VzOwogCWludCBwYWdlX29yZGVyOwogCWludCBucl9lbnRyaWVzOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCWludCBudWxsX21hcHBlZDsKIH07CiAKIHN0cnVjdCByZXFfaXRlcmF0b3IgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIuaCBiL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZjAwMmQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3MiArMCwwIEBACi0jaWZuZGVmIF9MSU5VWF9CWVRFT1JERVJfSAotI2RlZmluZSBfTElOVVhfQllURU9SREVSX0gKLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvc3dhYi5oPgotCi0jaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pICYmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotIyBlcnJvciBGaXggYXNtL2J5dGVvcmRlci5oIHRvIGRlZmluZSBvbmUgZW5kaWFubmVzcwotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pICYmICFkZWZpbmVkKF9fQklHX0VORElBTikKLSMgZXJyb3IgRml4IGFzbS9ieXRlb3JkZXIuaCB0byBkZWZpbmUgYXJjaCBlbmRpYW5uZXNzCi0jZW5kaWYKLQotI2lmZGVmIF9fTElUVExFX0VORElBTgotIyB1bmRlZiBfX0xJVFRMRV9FTkRJQU4KLSMgZGVmaW5lIF9fTElUVExFX0VORElBTiAxMjM0Ci0jZW5kaWYKLQotI2lmZGVmIF9fQklHX0VORElBTgotIyB1bmRlZiBfX0JJR19FTkRJQU4KLSMgZGVmaW5lIF9fQklHX0VORElBTiA0MzIxCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKSAmJiAhZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCi0jIGRlZmluZSBfX0xJVFRMRV9FTkRJQU5fQklURklFTEQKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pICYmICFkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKLSMgZGVmaW5lIF9fQklHX0VORElBTl9CSVRGSUVMRAotI2VuZGlmCi0KLSNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KLSMgZGVmaW5lIF9fbGUxNl90b19jcHUoeCkgKChfX2ZvcmNlIF9fdTE2KShfX2xlMTYpKHgpKQotIyBkZWZpbmUgX19sZTMyX3RvX2NwdSh4KSAoKF9fZm9yY2UgX191MzIpKF9fbGUzMikoeCkpCi0jIGRlZmluZSBfX2xlNjRfdG9fY3B1KHgpICgoX19mb3JjZSBfX3U2NCkoX19sZTY0KSh4KSkKLSMgZGVmaW5lIF9fY3B1X3RvX2xlMTYoeCkgKChfX2ZvcmNlIF9fbGUxNikoX191MTYpKHgpKQotIyBkZWZpbmUgX19jcHVfdG9fbGUzMih4KSAoKF9fZm9yY2UgX19sZTMyKShfX3UzMikoeCkpCi0jIGRlZmluZSBfX2NwdV90b19sZTY0KHgpICgoX19mb3JjZSBfX2xlNjQpKF9fdTY0KSh4KSkKLQotIyBkZWZpbmUgX19iZTE2X3RvX2NwdSh4KSBfX3N3YWIxNigoX19mb3JjZSBfX3UxNikoX19iZTE2KSh4KSkKLSMgZGVmaW5lIF9fYmUzMl90b19jcHUoeCkgX19zd2FiMzIoKF9fZm9yY2UgX191MzIpKF9fYmUzMikoeCkpCi0jIGRlZmluZSBfX2JlNjRfdG9fY3B1KHgpIF9fc3dhYjY0KChfX2ZvcmNlIF9fdTY0KShfX2JlNjQpKHgpKQotIyBkZWZpbmUgX19jcHVfdG9fYmUxNih4KSAoKF9fZm9yY2UgX19iZTE2KV9fc3dhYjE2KHgpKQotIyBkZWZpbmUgX19jcHVfdG9fYmUzMih4KSAoKF9fZm9yY2UgX19iZTMyKV9fc3dhYjMyKHgpKQotIyBkZWZpbmUgX19jcHVfdG9fYmU2NCh4KSAoKF9fZm9yY2UgX19iZTY0KV9fc3dhYjY0KHgpKQotI2VuZGlmCi0KLSNpZmRlZiBfX0JJR19FTkRJQU4KLSMgZGVmaW5lIF9fYmUxNl90b19jcHUoeCkgKChfX2ZvcmNlIF9fdTE2KShfX2JlMTYpKHgpKQotIyBkZWZpbmUgX19iZTMyX3RvX2NwdSh4KSAoKF9fZm9yY2UgX191MzIpKF9fYmUzMikoeCkpCi0jIGRlZmluZSBfX2JlNjRfdG9fY3B1KHgpICgoX19mb3JjZSBfX3U2NCkoX19iZTY0KSh4KSkKLSMgZGVmaW5lIF9fY3B1X3RvX2JlMTYoeCkgKChfX2ZvcmNlIF9fYmUxNikoX191MTYpKHgpKQotIyBkZWZpbmUgX19jcHVfdG9fYmUzMih4KSAoKF9fZm9yY2UgX19iZTMyKShfX3UzMikoeCkpCi0jIGRlZmluZSBfX2NwdV90b19iZTY0KHgpICgoX19mb3JjZSBfX2JlNjQpKF9fdTY0KSh4KSkKLQotIyBkZWZpbmUgX19sZTE2X3RvX2NwdSh4KSBfX3N3YWIxNigoX19mb3JjZSBfX3UxNikoX19sZTE2KSh4KSkKLSMgZGVmaW5lIF9fbGUzMl90b19jcHUoeCkgX19zd2FiMzIoKF9fZm9yY2UgX191MzIpKF9fbGUzMikoeCkpCi0jIGRlZmluZSBfX2xlNjRfdG9fY3B1KHgpIF9fc3dhYjY0KChfX2ZvcmNlIF9fdTY0KShfX2xlNjQpKHgpKQotIyBkZWZpbmUgX19jcHVfdG9fbGUxNih4KSAoKF9fZm9yY2UgX19sZTE2KV9fc3dhYjE2KHgpKQotIyBkZWZpbmUgX19jcHVfdG9fbGUzMih4KSAoKF9fZm9yY2UgX19sZTMyKV9fc3dhYjMyKHgpKQotIyBkZWZpbmUgX19jcHVfdG9fbGU2NCh4KSAoKF9fZm9yY2UgX19sZTY0KV9fc3dhYjY0KHgpKQotI2VuZGlmCi0KLS8qCi0gKiBUaGVzZSBoZWxwZXJzIGNvdWxkIGJlIHBoYXNlZCBvdXQgb3ZlciB0aW1lIGFzIHRoZSBiYXNlIHZlcnNpb24KLSAqIGhhbmRsZXMgY29uc3RhbnQgZm9sZGluZy4KLSAqLwotI2RlZmluZSBfX2NvbnN0YW50X2h0b25sKHgpIF9fY3B1X3RvX2JlMzIoeCkKLSNkZWZpbmUgX19jb25zdGFudF9udG9obCh4KSBfX2JlMzJfdG9fY3B1KHgpCi0jZGVmaW5lIF9fY29uc3RhbnRfaHRvbnMoeCkgX19jcHVfdG9fYmUxNih4KQotI2RlZmluZSBfX2NvbnN0YW50X250b2hzKHgpIF9fYmUxNl90b19jcHUoeCkKLQotI2RlZmluZSBfX2NvbnN0YW50X2xlMTZfdG9fY3B1KHgpIF9fbGUxNl90b19jcHUoeCkKLSNkZWZpbmUgX19jb25zdGFudF9sZTMyX3RvX2NwdSh4KSBfX2xlMzJfdG9fY3B1KHgpCi0jZGVmaW5lIF9fY29uc3RhbnRfbGU2NF90b19jcHUoeCkgX19sZTY0X3RvX2NwdSh4KQotI2RlZmluZSBfX2NvbnN0YW50X2JlMTZfdG9fY3B1KHgpIF9fYmUxNl90b19jcHUoeCkKLSNkZWZpbmUgX19jb25zdGFudF9iZTMyX3RvX2NwdSh4KSBfX2JlMzJfdG9fY3B1KHgpCi0jZGVmaW5lIF9fY29uc3RhbnRfYmU2NF90b19jcHUoeCkgX19iZTY0X3RvX2NwdSh4KQotCi0jZGVmaW5lIF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoeCkgX19jcHVfdG9fbGUxNih4KQotI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19sZTMyKHgpIF9fY3B1X3RvX2xlMzIoeCkKLSNkZWZpbmUgX19jb25zdGFudF9jcHVfdG9fbGU2NCh4KSBfX2NwdV90b19sZTY0KHgpCi0jZGVmaW5lIF9fY29uc3RhbnRfY3B1X3RvX2JlMTYoeCkgX19jcHVfdG9fYmUxNih4KQotI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19iZTMyKHgpIF9fY3B1X3RvX2JlMzIoeCkKLSNkZWZpbmUgX19jb25zdGFudF9jcHVfdG9fYmU2NCh4KSBfX2NwdV90b19iZTY0KHgpCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2xlMTZfdG9fY3B1cyhfX3UxNiAqcCkKLXsKLSNpZmRlZiBfX0JJR19FTkRJQU4KLQlfX3N3YWIxNnMocCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9fY3B1X3RvX2xlMTZzKF9fdTE2ICpwKQotewotI2lmZGVmIF9fQklHX0VORElBTgotCV9fc3dhYjE2cyhwKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19sZTMyX3RvX2NwdXMoX191MzIgKnApCi17Ci0jaWZkZWYgX19CSUdfRU5ESUFOCi0JX19zd2FiMzJzKHApOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2NwdV90b19sZTMycyhfX3UzMiAqcCkKLXsKLSNpZmRlZiBfX0JJR19FTkRJQU4KLQlfX3N3YWIzMnMocCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9fbGU2NF90b19jcHVzKF9fdTY0ICpwKQotewotI2lmZGVmIF9fQklHX0VORElBTgotCV9fc3dhYjY0cyhwKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19jcHVfdG9fbGU2NHMoX191NjQgKnApCi17Ci0jaWZkZWYgX19CSUdfRU5ESUFOCi0JX19zd2FiNjRzKHApOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2JlMTZfdG9fY3B1cyhfX3UxNiAqcCkKLXsKLSNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KLQlfX3N3YWIxNnMocCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9fY3B1X3RvX2JlMTZzKF9fdTE2ICpwKQotewotI2lmZGVmIF9fTElUVExFX0VORElBTgotCV9fc3dhYjE2cyhwKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19iZTMyX3RvX2NwdXMoX191MzIgKnApCi17Ci0jaWZkZWYgX19MSVRUTEVfRU5ESUFOCi0JX19zd2FiMzJzKHApOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2NwdV90b19iZTMycyhfX3UzMiAqcCkKLXsKLSNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KLQlfX3N3YWIzMnMocCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9fYmU2NF90b19jcHVzKF9fdTY0ICpwKQotewotI2lmZGVmIF9fTElUVExFX0VORElBTgotCV9fc3dhYjY0cyhwKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19jcHVfdG9fYmU2NHMoX191NjQgKnApCi17Ci0jaWZkZWYgX19MSVRUTEVfRU5ESUFOCi0JX19zd2FiNjRzKHApOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgX191MTYgX19sZTE2X3RvX2NwdXAoY29uc3QgX19sZTE2ICpwKQotewotI2lmZGVmIF9fTElUVExFX0VORElBTgotCXJldHVybiAoX19mb3JjZSBfX3UxNikqcDsKLSNlbHNlCi0JcmV0dXJuIF9fc3dhYjE2cCgoX19mb3JjZSBfX3UxNiAqKXApOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgX191MzIgX19sZTMyX3RvX2NwdXAoY29uc3QgX19sZTMyICpwKQotewotI2lmZGVmIF9fTElUVExFX0VORElBTgotCXJldHVybiAoX19mb3JjZSBfX3UzMikqcDsKLSNlbHNlCi0JcmV0dXJuIF9fc3dhYjMycCgoX19mb3JjZSBfX3UzMiAqKXApOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgX191NjQgX19sZTY0X3RvX2NwdXAoY29uc3QgX19sZTY0ICpwKQotewotI2lmZGVmIF9fTElUVExFX0VORElBTgotCXJldHVybiAoX19mb3JjZSBfX3U2NCkqcDsKLSNlbHNlCi0JcmV0dXJuIF9fc3dhYjY0cCgoX19mb3JjZSBfX3U2NCAqKXApOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgX19sZTE2IF9fY3B1X3RvX2xlMTZwKGNvbnN0IF9fdTE2ICpwKQotewotI2lmZGVmIF9fTElUVExFX0VORElBTgotCXJldHVybiAoX19mb3JjZSBfX2xlMTYpKnA7Ci0jZWxzZQotCXJldHVybiAoX19mb3JjZSBfX2xlMTYpX19zd2FiMTZwKHApOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgX19sZTMyIF9fY3B1X3RvX2xlMzJwKGNvbnN0IF9fdTMyICpwKQotewotI2lmZGVmIF9fTElUVExFX0VORElBTgotCXJldHVybiAoX19mb3JjZSBfX2xlMzIpKnA7Ci0jZWxzZQotCXJldHVybiAoX19mb3JjZSBfX2xlMzIpX19zd2FiMzJwKHApOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgX19sZTY0IF9fY3B1X3RvX2xlNjRwKGNvbnN0IF9fdTY0ICpwKQotewotI2lmZGVmIF9fTElUVExFX0VORElBTgotCXJldHVybiAoX19mb3JjZSBfX2xlNjQpKnA7Ci0jZWxzZQotCXJldHVybiAoX19mb3JjZSBfX2xlNjQpX19zd2FiNjRwKHApOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgX191MTYgX19iZTE2X3RvX2NwdXAoY29uc3QgX19iZTE2ICpwKQotewotI2lmZGVmIF9fQklHX0VORElBTgotCXJldHVybiAoX19mb3JjZSBfX3UxNikqcDsKLSNlbHNlCi0JcmV0dXJuIF9fc3dhYjE2cCgoX19mb3JjZSBfX3UxNiAqKXApOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgX191MzIgX19iZTMyX3RvX2NwdXAoY29uc3QgX19iZTMyICpwKQotewotI2lmZGVmIF9fQklHX0VORElBTgotCXJldHVybiAoX19mb3JjZSBfX3UzMikqcDsKLSNlbHNlCi0JcmV0dXJuIF9fc3dhYjMycCgoX19mb3JjZSBfX3UzMiAqKXApOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgX191NjQgX19iZTY0X3RvX2NwdXAoY29uc3QgX19iZTY0ICpwKQotewotI2lmZGVmIF9fQklHX0VORElBTgotCXJldHVybiAoX19mb3JjZSBfX3U2NCkqcDsKLSNlbHNlCi0JcmV0dXJuIF9fc3dhYjY0cCgoX19mb3JjZSBfX3U2NCAqKXApOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgX19iZTE2IF9fY3B1X3RvX2JlMTZwKGNvbnN0IF9fdTE2ICpwKQotewotI2lmZGVmIF9fQklHX0VORElBTgotCXJldHVybiAoX19mb3JjZSBfX2JlMTYpKnA7Ci0jZWxzZQotCXJldHVybiAoX19mb3JjZSBfX2JlMTYpX19zd2FiMTZwKHApOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgX19iZTMyIF9fY3B1X3RvX2JlMzJwKGNvbnN0IF9fdTMyICpwKQotewotI2lmZGVmIF9fQklHX0VORElBTgotCXJldHVybiAoX19mb3JjZSBfX2JlMzIpKnA7Ci0jZWxzZQotCXJldHVybiAoX19mb3JjZSBfX2JlMzIpX19zd2FiMzJwKHApOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgX19iZTY0IF9fY3B1X3RvX2JlNjRwKGNvbnN0IF9fdTY0ICpwKQotewotI2lmZGVmIF9fQklHX0VORElBTgotCXJldHVybiAoX19mb3JjZSBfX2JlNjQpKnA7Ci0jZWxzZQotCXJldHVybiAoX19mb3JjZSBfX2JlNjQpX19zd2FiNjRwKHApOwotI2VuZGlmCi19Ci0KLSNpZmRlZiBfX0tFUk5FTF9fCi0KLSMgZGVmaW5lIGxlMTZfdG9fY3B1IF9fbGUxNl90b19jcHUKLSMgZGVmaW5lIGxlMzJfdG9fY3B1IF9fbGUzMl90b19jcHUKLSMgZGVmaW5lIGxlNjRfdG9fY3B1IF9fbGU2NF90b19jcHUKLSMgZGVmaW5lIGJlMTZfdG9fY3B1IF9fYmUxNl90b19jcHUKLSMgZGVmaW5lIGJlMzJfdG9fY3B1IF9fYmUzMl90b19jcHUKLSMgZGVmaW5lIGJlNjRfdG9fY3B1IF9fYmU2NF90b19jcHUKLSMgZGVmaW5lIGNwdV90b19sZTE2IF9fY3B1X3RvX2xlMTYKLSMgZGVmaW5lIGNwdV90b19sZTMyIF9fY3B1X3RvX2xlMzIKLSMgZGVmaW5lIGNwdV90b19sZTY0IF9fY3B1X3RvX2xlNjQKLSMgZGVmaW5lIGNwdV90b19iZTE2IF9fY3B1X3RvX2JlMTYKLSMgZGVmaW5lIGNwdV90b19iZTMyIF9fY3B1X3RvX2JlMzIKLSMgZGVmaW5lIGNwdV90b19iZTY0IF9fY3B1X3RvX2JlNjQKLQotIyBkZWZpbmUgbGUxNl90b19jcHVwIF9fbGUxNl90b19jcHVwCi0jIGRlZmluZSBsZTMyX3RvX2NwdXAgX19sZTMyX3RvX2NwdXAKLSMgZGVmaW5lIGxlNjRfdG9fY3B1cCBfX2xlNjRfdG9fY3B1cAotIyBkZWZpbmUgYmUxNl90b19jcHVwIF9fYmUxNl90b19jcHVwCi0jIGRlZmluZSBiZTMyX3RvX2NwdXAgX19iZTMyX3RvX2NwdXAKLSMgZGVmaW5lIGJlNjRfdG9fY3B1cCBfX2JlNjRfdG9fY3B1cAotIyBkZWZpbmUgY3B1X3RvX2xlMTZwIF9fY3B1X3RvX2xlMTZwCi0jIGRlZmluZSBjcHVfdG9fbGUzMnAgX19jcHVfdG9fbGUzMnAKLSMgZGVmaW5lIGNwdV90b19sZTY0cCBfX2NwdV90b19sZTY0cAotIyBkZWZpbmUgY3B1X3RvX2JlMTZwIF9fY3B1X3RvX2JlMTZwCi0jIGRlZmluZSBjcHVfdG9fYmUzMnAgX19jcHVfdG9fYmUzMnAKLSMgZGVmaW5lIGNwdV90b19iZTY0cCBfX2NwdV90b19iZTY0cAotCi0jIGRlZmluZSBsZTE2X3RvX2NwdXMgX19sZTE2X3RvX2NwdXMKLSMgZGVmaW5lIGxlMzJfdG9fY3B1cyBfX2xlMzJfdG9fY3B1cwotIyBkZWZpbmUgbGU2NF90b19jcHVzIF9fbGU2NF90b19jcHVzCi0jIGRlZmluZSBiZTE2X3RvX2NwdXMgX19iZTE2X3RvX2NwdXMKLSMgZGVmaW5lIGJlMzJfdG9fY3B1cyBfX2JlMzJfdG9fY3B1cwotIyBkZWZpbmUgYmU2NF90b19jcHVzIF9fYmU2NF90b19jcHVzCi0jIGRlZmluZSBjcHVfdG9fbGUxNnMgX19jcHVfdG9fbGUxNnMKLSMgZGVmaW5lIGNwdV90b19sZTMycyBfX2NwdV90b19sZTMycwotIyBkZWZpbmUgY3B1X3RvX2xlNjRzIF9fY3B1X3RvX2xlNjRzCi0jIGRlZmluZSBjcHVfdG9fYmUxNnMgX19jcHVfdG9fYmUxNnMKLSMgZGVmaW5lIGNwdV90b19iZTMycyBfX2NwdV90b19iZTMycwotIyBkZWZpbmUgY3B1X3RvX2JlNjRzIF9fY3B1X3RvX2JlNjRzCi0KLS8qCi0gKiBUaGV5IGhhdmUgdG8gYmUgbWFjcm9zIGluIG9yZGVyIHRvIGRvIHRoZSBjb25zdGFudCBmb2xkaW5nCi0gKiBjb3JyZWN0bHkgLSBpZiB0aGUgYXJndW1lbnQgcGFzc2VkIGludG8gYSBpbmxpbmUgZnVuY3Rpb24KLSAqIGl0IGlzIG5vIGxvbmdlciBjb25zdGFudCBhY2NvcmRpbmcgdG8gZ2NjLi4KLSAqLwotIyB1bmRlZiBudG9obAotIyB1bmRlZiBudG9ocwotIyB1bmRlZiBodG9ubAotIyB1bmRlZiBodG9ucwotCi0jIGRlZmluZSBfX19odG9ubCh4KSBfX2NwdV90b19iZTMyKHgpCi0jIGRlZmluZSBfX19odG9ucyh4KSBfX2NwdV90b19iZTE2KHgpCi0jIGRlZmluZSBfX19udG9obCh4KSBfX2JlMzJfdG9fY3B1KHgpCi0jIGRlZmluZSBfX19udG9ocyh4KSBfX2JlMTZfdG9fY3B1KHgpCi0KLSMgZGVmaW5lIGh0b25sKHgpIF9fX2h0b25sKHgpCi0jIGRlZmluZSBudG9obCh4KSBfX19udG9obCh4KQotIyBkZWZpbmUgaHRvbnMoeCkgX19faHRvbnMoeCkKLSMgZGVmaW5lIG50b2hzKHgpIF9fX250b2hzKHgpCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBsZTE2X2FkZF9jcHUoX19sZTE2ICp2YXIsIHUxNiB2YWwpCi17Ci0JKnZhciA9IGNwdV90b19sZTE2KGxlMTZfdG9fY3B1cCh2YXIpICsgdmFsKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGxlMzJfYWRkX2NwdShfX2xlMzIgKnZhciwgdTMyIHZhbCkKLXsKLQkqdmFyID0gY3B1X3RvX2xlMzIobGUzMl90b19jcHVwKHZhcikgKyB2YWwpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbGU2NF9hZGRfY3B1KF9fbGU2NCAqdmFyLCB1NjQgdmFsKQotewotCSp2YXIgPSBjcHVfdG9fbGU2NChsZTY0X3RvX2NwdXAodmFyKSArIHZhbCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBiZTE2X2FkZF9jcHUoX19iZTE2ICp2YXIsIHUxNiB2YWwpCi17Ci0JKnZhciA9IGNwdV90b19iZTE2KGJlMTZfdG9fY3B1cCh2YXIpICsgdmFsKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGJlMzJfYWRkX2NwdShfX2JlMzIgKnZhciwgdTMyIHZhbCkKLXsKLQkqdmFyID0gY3B1X3RvX2JlMzIoYmUzMl90b19jcHVwKHZhcikgKyB2YWwpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYmU2NF9hZGRfY3B1KF9fYmU2NCAqdmFyLCB1NjQgdmFsKQotewotCSp2YXIgPSBjcHVfdG9fYmU2NChiZTY0X3RvX2NwdXAodmFyKSArIHZhbCk7Ci19Ci0KLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0jZW5kaWYgLyogX0xJTlVYX0JZVEVPUkRFUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9LYnVpbGQgYi9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9LYnVpbGQKaW5kZXggZmJhYTdmOS4uMzg0MzcyMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvS2J1aWxkCisrKyBiL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL0tidWlsZApAQCAtMSw0ICsxLDIgQEAKIHVuaWZkZWYteSArPSBiaWdfZW5kaWFuLmgKIHVuaWZkZWYteSArPSBsaXR0bGVfZW5kaWFuLmgKLXVuaWZkZWYteSArPSBzd2FiLmgKLXVuaWZkZWYteSArPSBzd2FiYi5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9iaWdfZW5kaWFuLmggYi9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9iaWdfZW5kaWFuLmgKaW5kZXggMWNiYTNmMy4uM2M4MGZkNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvYmlnX2VuZGlhbi5oCisrKyBiL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL2JpZ19lbmRpYW4uaApAQCAtOSw4ICs5LDcgQEAKICNlbmRpZgogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvc3dhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9zd2FiYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N3YWIuaD4KIAogI2RlZmluZSBfX2NvbnN0YW50X2h0b25sKHgpICgoX19mb3JjZSBfX2JlMzIpKF9fdTMyKSh4KSkKICNkZWZpbmUgX19jb25zdGFudF9udG9obCh4KSAoKF9fZm9yY2UgX191MzIpKF9fYmUzMikoeCkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9saXR0bGVfZW5kaWFuLmggYi9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9saXR0bGVfZW5kaWFuLmgKaW5kZXggY2VkYzFiNS4uODMxOTVmYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvbGl0dGxlX2VuZGlhbi5oCisrKyBiL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL2xpdHRsZV9lbmRpYW4uaApAQCAtOSw4ICs5LDcgQEAKICNlbmRpZgogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvc3dhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9zd2FiYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N3YWIuaD4KIAogI2RlZmluZSBfX2NvbnN0YW50X2h0b25sKHgpICgoX19mb3JjZSBfX2JlMzIpX19fY29uc3RhbnRfc3dhYjMyKCh4KSkpCiAjZGVmaW5lIF9fY29uc3RhbnRfbnRvaGwoeCkgX19fY29uc3RhbnRfc3dhYjMyKChfX2ZvcmNlIF9fYmUzMikoeCkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9zd2FiLmggYi9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9zd2FiLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MjEzNGYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvc3dhYi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLSNpZm5kZWYgX0xJTlVYX0JZVEVPUkRFUl9TV0FCX0gKLSNkZWZpbmUgX0xJTlVYX0JZVEVPUkRFUl9TV0FCX0gKLQotLyoKLSAqIGxpbnV4L2J5dGVvcmRlci9zd2FiLmgKLSAqIEJ5dGUtc3dhcHBpbmcsIGluZGVwZW5kZW50bHkgZnJvbSBDUFUgZW5kaWFubmVzcwotICoJc3dhYlhYW3BzXT8oZm9vKQotICoKLSAqIEZyYW5jb2lzLVJlbmUgUmlkZWF1IDxmYXJlQHR1bmVzLm9yZz4gMTk5NzEyMDUKLSAqICAgIHNlcGFyYXRlZCBzd2FiIGZ1bmN0aW9ucyBmcm9tIGNwdV90b19YWCwKLSAqICAgIHRvIGNsZWFuIHVwIHN1cHBvcnQgZm9yIGJpemFycmUtZW5kaWFuIGFyY2hpdGVjdHVyZXMuCi0gKgotICogVHJlbnQgUGllcGhvIDx4eXp6eUBzcGVha2Vhc3kub3JnPiAyMDA3MTE0Ci0gKiAgICBtYWtlIGNvbnN0YW50LWZvbGRpbmcgd29yaywgcHJvdmlkZSBDIHZlcnNpb25zIHRoYXQKLSAqICAgIGdjYyBjYW4gb3B0aW1pemUgYmV0dGVyLCBleHBsYWluIGRpZmZlcmVudCB2ZXJzaW9ucwotICoKLSAqIFNlZSBhc20taTM4Ni9ieXRlb3JkZXIuaCBhbmQgc3VjaGVzIGZvciBleGFtcGxlcyBvZiBob3cgdG8gcHJvdmlkZQotICogYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBvcHRpbWl6ZWQgdmVyc2lvbnMKLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+Ci0KLS8qIEZ1bmN0aW9ucy9tYWNyb3MgZGVmaW5lZCwgdGhlcmUgYXJlIGEgbG90OgotICoKLSAqIF9fX3N3YWJYWAotICogICAgR2VuZXJpYyBDIHZlcnNpb25zIG9mIHRoZSBzd2FiIGZ1bmN0aW9ucy4KLSAqCi0gKiBfX19jb25zdGFudF9zd2FiWFgKLSAqICAgIEMgdmVyc2lvbnMgdGhhdCBnY2MgY2FuIGZvbGQgaW50byBhIGNvbXBpbGUtdGltZSBjb25zdGFudCB3aGVuCi0gKiAgICB0aGUgYXJndW1lbnQgaXMgYSBjb21waWxlLXRpbWUgY29uc3RhbnQuCi0gKgotICogX19hcmNoX19zd2FiWFhbc3BdPwotICogICAgQXJjaGl0ZWN0dXJlIG9wdGltaXplZCB2ZXJzaW9ucyBvZiBhbGwgdGhlIHN3YWIgZnVuY3Rpb25zCi0gKiAgICAoaW5jbHVkaW5nIHRoZSBzIGFuZCBwIHZlcnNpb25zKS4gIFRoZXNlIGNhbiBiZSBkZWZpbmVkIGluCi0gKiAgICBhc20tYXJjaC9ieXRlb3JkZXIuaC4gIEFueSB3aGljaCBhcmUgbm90LCBhcmUgZGVmaW5lZCBoZXJlLgotICogICAgX19hcmNoX19zd2FiWFhzKCkgaXMgZGVmaW5lZCBpbiB0ZXJtcyBvZiBfX2FyY2hfX3N3YWJYWHAoKSwgd2hpY2gKLSAqICAgIGlzIGRlZmluZWQgaW4gdGVybXMgb2YgX19hcmNoX19zd2FiWFgoKSwgd2hpY2ggaXMgaW4gdHVybiBkZWZpbmVkCi0gKiAgICBpbiB0ZXJtcyBvZiBfX19zd2FiWFgoeCkuCi0gKiAgICBUaGVzZSBtdXN0IGJlIG1hY3Jvcy4gIFRoZXkgbWF5IGJlIHVuc2FmZSBmb3IgYXJndW1lbnRzIHdpdGgKLSAqICAgIHNpZGUtZWZmZWN0cy4KLSAqCi0gKiBfX2Zzd2FiWFgKLSAqICAgIElubGluZSBmdW5jdGlvbiB2ZXJzaW9ucyBvZiB0aGUgX19hcmNoX18gbWFjcm9zLiAgVGhlc2UgX2FyZV8gc2FmZQotICogICAgaWYgdGhlIGFyZ3VtZW50cyBoYXZlIHNpZGUtZWZmZWN0cy4gIE5vdGUgdGhlcmUgYXJlIG5vIHMgYW5kIHAKLSAqICAgIHZlcnNpb25zIG9mIHRoZXNlLgotICoKLSAqIF9fc3dhYlhYW3NiXQotICogICAgVGhlcmUgYXJlIHRoZSBvbmVzIHlvdSBzaG91bGQgYWN0dWFsbHkgdXNlLiAgVGhlIF9fc3dhYlhYIHZlcnNpb25zCi0gKiAgICB3aWxsIGJlIGEgY29uc3RhbnQgZ2l2ZW4gYSBjb25zdGFudCBhcmd1bWVudCBhbmQgdXNlIHRoZSBhcmNoCi0gKiAgICBzcGVjaWZpYyBjb2RlIChpZiBhbnkpIGZvciBub24tY29uc3RhbnQgYXJndW1lbnRzLiAgVGhlIHMgYW5kIHAKLSAqICAgIHZlcnNpb25zIGFsd2F5cyB1c2UgdGhlIGFyY2ggc3BlY2lmaWMgY29kZSAoY29uc3RhbnQgZm9sZGluZwotICogICAgZG9lc24ndCBhcHBseSkuICBUaGV5IGFyZSBzYWZlIHRvIHVzZSB3aXRoIGFyZ3VtZW50cyB3aXRoCi0gKiAgICBzaWRlLWVmZmVjdHMuCi0gKgotICogc3dhYlhYW3NiXQotICogICAgTmlja25hbWVzIGZvciBfX3N3YWJYWFtzYl0gdG8gdXNlIGluIHRoZSBrZXJuZWwuCi0gKi8KLQotLyogY2FzdHMgYXJlIG5lY2Vzc2FyeSBmb3IgY29uc3RhbnRzLCBiZWNhdXNlIHdlIG5ldmVyIGtub3cgaG93IGZvciBzdXJlCi0gKiBob3cgVS9VTC9VTEwgbWFwIHRvIF9fdTE2LCBfX3UzMiwgX191NjQuIEF0IGxlYXN0IG5vdCBpbiBhIHBvcnRhYmxlIHdheS4KLSAqLwotCi1zdGF0aWMgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTE2IF9fX3N3YWIxNihfX3UxNiB4KQotewotCXJldHVybiB4PDw4IHwgeD4+ODsKLX0KLXN0YXRpYyBfX2lubGluZV9fIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19fc3dhYjMyKF9fdTMyIHgpCi17Ci0JcmV0dXJuIHg8PDI0IHwgeD4+MjQgfAotCQkoeCAmIChfX3UzMikweDAwMDBmZjAwVUwpPDw4IHwKLQkJKHggJiAoX191MzIpMHgwMGZmMDAwMFVMKT4+ODsKLX0KLXN0YXRpYyBfX2lubGluZV9fIF9fYXR0cmlidXRlX2NvbnN0X18gX191NjQgX19fc3dhYjY0KF9fdTY0IHgpCi17Ci0JcmV0dXJuIHg8PDU2IHwgeD4+NTYgfAotCQkoeCAmIChfX3U2NCkweDAwMDAwMDAwMDAwMGZmMDBVTEwpPDw0MCB8Ci0JCSh4ICYgKF9fdTY0KTB4MDAwMDAwMDAwMGZmMDAwMFVMTCk8PDI0IHwKLQkJKHggJiAoX191NjQpMHgwMDAwMDAwMGZmMDAwMDAwVUxMKTw8IDggfAotCSAgICAgICAgKHggJiAoX191NjQpMHgwMDAwMDBmZjAwMDAwMDAwVUxMKT4+IDggfAotCQkoeCAmIChfX3U2NCkweDAwMDBmZjAwMDAwMDAwMDBVTEwpPj4yNCB8Ci0JCSh4ICYgKF9fdTY0KTB4MDBmZjAwMDAwMDAwMDAwMFVMTCk+PjQwOwotfQotCi0jZGVmaW5lIF9fX2NvbnN0YW50X3N3YWIxNih4KSBcCi0JKChfX3UxNikoIFwKLQkJKCgoX191MTYpKHgpICYgKF9fdTE2KTB4MDBmZlUpIDw8IDgpIHwgXAotCQkoKChfX3UxNikoeCkgJiAoX191MTYpMHhmZjAwVSkgPj4gOCkgKSkKLSNkZWZpbmUgX19fY29uc3RhbnRfc3dhYjMyKHgpIFwKLQkoKF9fdTMyKSggXAotCQkoKChfX3UzMikoeCkgJiAoX191MzIpMHgwMDAwMDBmZlVMKSA8PCAyNCkgfCBcCi0JCSgoKF9fdTMyKSh4KSAmIChfX3UzMikweDAwMDBmZjAwVUwpIDw8ICA4KSB8IFwKLQkJKCgoX191MzIpKHgpICYgKF9fdTMyKTB4MDBmZjAwMDBVTCkgPj4gIDgpIHwgXAotCQkoKChfX3UzMikoeCkgJiAoX191MzIpMHhmZjAwMDAwMFVMKSA+PiAyNCkgKSkKLSNkZWZpbmUgX19fY29uc3RhbnRfc3dhYjY0KHgpIFwKLQkoKF9fdTY0KSggXAotCQkoX191NjQpKCgoX191NjQpKHgpICYgKF9fdTY0KTB4MDAwMDAwMDAwMDAwMDBmZlVMTCkgPDwgNTYpIHwgXAotCQkoX191NjQpKCgoX191NjQpKHgpICYgKF9fdTY0KTB4MDAwMDAwMDAwMDAwZmYwMFVMTCkgPDwgNDApIHwgXAotCQkoX191NjQpKCgoX191NjQpKHgpICYgKF9fdTY0KTB4MDAwMDAwMDAwMGZmMDAwMFVMTCkgPDwgMjQpIHwgXAotCQkoX191NjQpKCgoX191NjQpKHgpICYgKF9fdTY0KTB4MDAwMDAwMDBmZjAwMDAwMFVMTCkgPDwgIDgpIHwgXAotCSAgICAgICAgKF9fdTY0KSgoKF9fdTY0KSh4KSAmIChfX3U2NCkweDAwMDAwMGZmMDAwMDAwMDBVTEwpID4+ICA4KSB8IFwKLQkJKF9fdTY0KSgoKF9fdTY0KSh4KSAmIChfX3U2NCkweDAwMDBmZjAwMDAwMDAwMDBVTEwpID4+IDI0KSB8IFwKLQkJKF9fdTY0KSgoKF9fdTY0KSh4KSAmIChfX3U2NCkweDAwZmYwMDAwMDAwMDAwMDBVTEwpID4+IDQwKSB8IFwKLQkJKF9fdTY0KSgoKF9fdTY0KSh4KSAmIChfX3U2NCkweGZmMDAwMDAwMDAwMDAwMDBVTEwpID4+IDU2KSApKQotCi0vKgotICogcHJvdmlkZSBkZWZhdWx0cyB3aGVuIG5vIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBvcHRpbWl6YXRpb24gaXMgZGV0ZWN0ZWQKLSAqLwotI2lmbmRlZiBfX2FyY2hfX3N3YWIxNgotIyAgZGVmaW5lIF9fYXJjaF9fc3dhYjE2KHgpIF9fX3N3YWIxNih4KQotI2VuZGlmCi0jaWZuZGVmIF9fYXJjaF9fc3dhYjMyCi0jICBkZWZpbmUgX19hcmNoX19zd2FiMzIoeCkgX19fc3dhYjMyKHgpCi0jZW5kaWYKLSNpZm5kZWYgX19hcmNoX19zd2FiNjQKLSMgIGRlZmluZSBfX2FyY2hfX3N3YWI2NCh4KSBfX19zd2FiNjQoeCkKLSNlbmRpZgotCi0jaWZuZGVmIF9fYXJjaF9fc3dhYjE2cAotIyAgZGVmaW5lIF9fYXJjaF9fc3dhYjE2cCh4KSBfX2FyY2hfX3N3YWIxNigqKHgpKQotI2VuZGlmCi0jaWZuZGVmIF9fYXJjaF9fc3dhYjMycAotIyAgZGVmaW5lIF9fYXJjaF9fc3dhYjMycCh4KSBfX2FyY2hfX3N3YWIzMigqKHgpKQotI2VuZGlmCi0jaWZuZGVmIF9fYXJjaF9fc3dhYjY0cAotIyAgZGVmaW5lIF9fYXJjaF9fc3dhYjY0cCh4KSBfX2FyY2hfX3N3YWI2NCgqKHgpKQotI2VuZGlmCi0KLSNpZm5kZWYgX19hcmNoX19zd2FiMTZzCi0jICBkZWZpbmUgX19hcmNoX19zd2FiMTZzKHgpICgodm9pZCkoKih4KSA9IF9fYXJjaF9fc3dhYjE2cCh4KSkpCi0jZW5kaWYKLSNpZm5kZWYgX19hcmNoX19zd2FiMzJzCi0jICBkZWZpbmUgX19hcmNoX19zd2FiMzJzKHgpICgodm9pZCkoKih4KSA9IF9fYXJjaF9fc3dhYjMycCh4KSkpCi0jZW5kaWYKLSNpZm5kZWYgX19hcmNoX19zd2FiNjRzCi0jICBkZWZpbmUgX19hcmNoX19zd2FiNjRzKHgpICgodm9pZCkoKih4KSA9IF9fYXJjaF9fc3dhYjY0cCh4KSkpCi0jZW5kaWYKLQotCi0vKgotICogQWxsb3cgY29uc3RhbnQgZm9sZGluZwotICovCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX09QVElNSVpFX18pCi0jICBkZWZpbmUgX19zd2FiMTYoeCkgXAotKF9fYnVpbHRpbl9jb25zdGFudF9wKChfX3UxNikoeCkpID8gXAotIF9fX2NvbnN0YW50X3N3YWIxNigoeCkpIDogXAotIF9fZnN3YWIxNigoeCkpKQotIyAgZGVmaW5lIF9fc3dhYjMyKHgpIFwKLShfX2J1aWx0aW5fY29uc3RhbnRfcCgoX191MzIpKHgpKSA/IFwKLSBfX19jb25zdGFudF9zd2FiMzIoKHgpKSA6IFwKLSBfX2Zzd2FiMzIoKHgpKSkKLSMgIGRlZmluZSBfX3N3YWI2NCh4KSBcCi0oX19idWlsdGluX2NvbnN0YW50X3AoKF9fdTY0KSh4KSkgPyBcCi0gX19fY29uc3RhbnRfc3dhYjY0KCh4KSkgOiBcCi0gX19mc3dhYjY0KCh4KSkpCi0jZWxzZQotIyAgZGVmaW5lIF9fc3dhYjE2KHgpIF9fZnN3YWIxNih4KQotIyAgZGVmaW5lIF9fc3dhYjMyKHgpIF9fZnN3YWIzMih4KQotIyAgZGVmaW5lIF9fc3dhYjY0KHgpIF9fZnN3YWI2NCh4KQotI2VuZGlmIC8qIE9QVElNSVpFICovCi0KLQotc3RhdGljIF9faW5saW5lX18gX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UxNiBfX2Zzd2FiMTYoX191MTYgeCkKLXsKLQlyZXR1cm4gX19hcmNoX19zd2FiMTYoeCk7Ci19Ci1zdGF0aWMgX19pbmxpbmVfXyBfX3UxNiBfX3N3YWIxNnAoY29uc3QgX191MTYgKngpCi17Ci0JcmV0dXJuIF9fYXJjaF9fc3dhYjE2cCh4KTsKLX0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgX19zd2FiMTZzKF9fdTE2ICphZGRyKQotewotCV9fYXJjaF9fc3dhYjE2cyhhZGRyKTsKLX0KLQotc3RhdGljIF9faW5saW5lX18gX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UzMiBfX2Zzd2FiMzIoX191MzIgeCkKLXsKLQlyZXR1cm4gX19hcmNoX19zd2FiMzIoeCk7Ci19Ci1zdGF0aWMgX19pbmxpbmVfXyBfX3UzMiBfX3N3YWIzMnAoY29uc3QgX191MzIgKngpCi17Ci0JcmV0dXJuIF9fYXJjaF9fc3dhYjMycCh4KTsKLX0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgX19zd2FiMzJzKF9fdTMyICphZGRyKQotewotCV9fYXJjaF9fc3dhYjMycyhhZGRyKTsKLX0KLQotI2lmZGVmIF9fQllURU9SREVSX0hBU19VNjRfXwotc3RhdGljIF9faW5saW5lX18gX19hdHRyaWJ1dGVfY29uc3RfXyBfX3U2NCBfX2Zzd2FiNjQoX191NjQgeCkKLXsKLSMgIGlmZGVmIF9fU1dBQl82NF9USFJVXzMyX18KLQlfX3UzMiBoID0geCA+PiAzMjsKLSAgICAgICAgX191MzIgbCA9IHggJiAoKDFVTEw8PDMyKS0xKTsKLSAgICAgICAgcmV0dXJuICgoKF9fdTY0KV9fc3dhYjMyKGwpKSA8PCAzMikgfCAoKF9fdTY0KShfX3N3YWIzMihoKSkpOwotIyAgZWxzZQotCXJldHVybiBfX2FyY2hfX3N3YWI2NCh4KTsKLSMgIGVuZGlmCi19Ci1zdGF0aWMgX19pbmxpbmVfXyBfX3U2NCBfX3N3YWI2NHAoY29uc3QgX191NjQgKngpCi17Ci0JcmV0dXJuIF9fYXJjaF9fc3dhYjY0cCh4KTsKLX0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgX19zd2FiNjRzKF9fdTY0ICphZGRyKQotewotCV9fYXJjaF9fc3dhYjY0cyhhZGRyKTsKLX0KLSNlbmRpZiAvKiBfX0JZVEVPUkRFUl9IQVNfVTY0X18gKi8KLQotI2lmIGRlZmluZWQoX19LRVJORUxfXykKLSNkZWZpbmUgc3dhYjE2IF9fc3dhYjE2Ci0jZGVmaW5lIHN3YWIzMiBfX3N3YWIzMgotI2RlZmluZSBzd2FiNjQgX19zd2FiNjQKLSNkZWZpbmUgc3dhYjE2cCBfX3N3YWIxNnAKLSNkZWZpbmUgc3dhYjMycCBfX3N3YWIzMnAKLSNkZWZpbmUgc3dhYjY0cCBfX3N3YWI2NHAKLSNkZWZpbmUgc3dhYjE2cyBfX3N3YWIxNnMKLSNkZWZpbmUgc3dhYjMycyBfX3N3YWIzMnMKLSNkZWZpbmUgc3dhYjY0cyBfX3N3YWI2NHMKLSNlbmRpZgotCi0jZW5kaWYgLyogX0xJTlVYX0JZVEVPUkRFUl9TV0FCX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL3N3YWJiLmggYi9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9zd2FiYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Yzc4MGM3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL3N3YWJiLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotI2lmbmRlZiBfTElOVVhfQllURU9SREVSX1NXQUJCX0gKLSNkZWZpbmUgX0xJTlVYX0JZVEVPUkRFUl9TV0FCQl9ICi0KLS8qCi0gKiBsaW51eC9ieXRlb3JkZXIvc3dhYmIuaAotICogU1dBcCBCeXRlcyBCaXphcnJlbHkKLSAqCXN3YUhIWFhbcHNdPyhmb28pCi0gKgotICogU3VwcG9ydCBmb3Igb2JOVVhJb3VzIHBkcC1lbmRpYW4gYW5kIG90aGVyIGJpemFycmUgYXJjaGl0ZWN0dXJlcy4KLSAqIFdpbGwgTGludXggZXZlciBydW4gb24gc3VjaCBhbmNpZW50IGJlYXN0cz8gaWYgbm90LCB0aGlzIGZpbGUKLSAqIHdpbGwgYmUgYnV0IGEgcHJvZ3JhbW1pbmcgcGVhcmwuIFN0aWxsLCBpdCdzIGEgcmVtaW5kZXIgdGhhdCB3ZQotICogc2hvdWxkbid0IGJlIG1ha2luZyB0b28gbWFueSBhc3N1bXB0aW9ucyB3aGVuIHRyeWluZyB0byBiZSBwb3J0YWJsZS4KLSAqCi0gKi8KLQotLyoKLSAqIE1lYW5pbmcgb2YgdGhlIG5hbWVzIEkgY2hvc2UgKHZheGxpbnV4IHBlb3BsZSBmZWVsIGZyZWUgdG8gY29ycmVjdCB0aGVtKToKLSAqIHN3YWh3MzIJc3dhcCAxNi1iaXQgaGFsZi13b3JkcyBpbiBhIDMyLWJpdCB3b3JkCi0gKiBzd2FoYjMyCXN3YXAgOC1iaXQgaGFsdmVzIG9mIGVhY2ggMTYtYml0IGhhbGYtd29yZCBpbiBhIDMyLWJpdCB3b3JkCi0gKgotICogTm8gNjQtYml0IHN1cHBvcnQgeWV0LiBJIGRvbid0IGtub3cgTlVYSSBjb252ZW50aW9ucyBmb3IgbG9uZyBsb25ncy4KLSAqIEkgZ3VhcmFudGVlIGl0IHdpbGwgYmUgYSBtZXNzIHdoZW4gaXQncyB0aGVyZSwgdGhvdWdoIDotPgotICogSXQgd2lsbCBiZSBldmVuIHdvcnNlIGlmIHRoZXJlIGFyZSBjb25mbGljdGluZyA2NC1iaXQgY29udmVudGlvbnMuCi0gKiBIb3BlZnVsbHksIG5vIG9uZSBldmVyIHVzZWQgNjQtYml0IG9iamVjdHMgb24gTlVYSSBtYWNoaW5lcy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0KLSNkZWZpbmUgX19fc3dhaHczMih4KSBcCi0oeyBcCi0JX191MzIgX194ID0gKHgpOyBcCi0JKChfX3UzMikoIFwKLQkJKCgoX191MzIpKF9feCkgJiAoX191MzIpMHgwMDAwZmZmZlVMKSA8PCAxNikgfCBcCi0JCSgoKF9fdTMyKShfX3gpICYgKF9fdTMyKTB4ZmZmZjAwMDBVTCkgPj4gMTYpICkpOyBcCi19KQotI2RlZmluZSBfX19zd2FoYjMyKHgpIFwKLSh7IFwKLQlfX3UzMiBfX3ggPSAoeCk7IFwKLQkoKF9fdTMyKSggXAotCQkoKChfX3UzMikoX194KSAmIChfX3UzMikweDAwZmYwMGZmVUwpIDw8IDgpIHwgXAotCQkoKChfX3UzMikoX194KSAmIChfX3UzMikweGZmMDBmZjAwVUwpID4+IDgpICkpOyBcCi19KQotCi0jZGVmaW5lIF9fX2NvbnN0YW50X3N3YWh3MzIoeCkgXAotCSgoX191MzIpKCBcCi0JCSgoKF9fdTMyKSh4KSAmIChfX3UzMikweDAwMDBmZmZmVUwpIDw8IDE2KSB8IFwKLQkJKCgoX191MzIpKHgpICYgKF9fdTMyKTB4ZmZmZjAwMDBVTCkgPj4gMTYpICkpCi0jZGVmaW5lIF9fX2NvbnN0YW50X3N3YWhiMzIoeCkgXAotCSgoX191MzIpKCBcCi0JCSgoKF9fdTMyKSh4KSAmIChfX3UzMikweDAwZmYwMGZmVUwpIDw8IDgpIHwgXAotCQkoKChfX3UzMikoeCkgJiAoX191MzIpMHhmZjAwZmYwMFVMKSA+PiA4KSApKQotCi0vKgotICogcHJvdmlkZSBkZWZhdWx0cyB3aGVuIG5vIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBvcHRpbWl6YXRpb24gaXMgZGV0ZWN0ZWQKLSAqLwotI2lmbmRlZiBfX2FyY2hfX3N3YWh3MzIKLSMgIGRlZmluZSBfX2FyY2hfX3N3YWh3MzIoeCkgX19fc3dhaHczMih4KQotI2VuZGlmCi0jaWZuZGVmIF9fYXJjaF9fc3dhaGIzMgotIyAgZGVmaW5lIF9fYXJjaF9fc3dhaGIzMih4KSBfX19zd2FoYjMyKHgpCi0jZW5kaWYKLQotI2lmbmRlZiBfX2FyY2hfX3N3YWh3MzJwCi0jICBkZWZpbmUgX19hcmNoX19zd2FodzMycCh4KSBfX3N3YWh3MzIoKih4KSkKLSNlbmRpZgotI2lmbmRlZiBfX2FyY2hfX3N3YWhiMzJwCi0jICBkZWZpbmUgX19hcmNoX19zd2FoYjMycCh4KSBfX3N3YWhiMzIoKih4KSkKLSNlbmRpZgotCi0jaWZuZGVmIF9fYXJjaF9fc3dhaHczMnMKLSMgIGRlZmluZSBfX2FyY2hfX3N3YWh3MzJzKHgpIGRvIHsgKih4KSA9IF9fc3dhaHczMnAoKHgpKTsgfSB3aGlsZSAoMCkKLSNlbmRpZgotI2lmbmRlZiBfX2FyY2hfX3N3YWhiMzJzCi0jICBkZWZpbmUgX19hcmNoX19zd2FoYjMycyh4KSBkbyB7ICooeCkgPSBfX3N3YWhiMzJwKCh4KSk7IH0gd2hpbGUgKDApCi0jZW5kaWYKLQotCi0vKgotICogQWxsb3cgY29uc3RhbnQgZm9sZGluZwotICovCi0jZGVmaW5lIF9fc3dhaHczMih4KSBcCi0oX19idWlsdGluX2NvbnN0YW50X3AoKF9fdTMyKSh4KSkgPyBcCi0gX19fc3dhaHczMigoeCkpIDogXAotIF9fZnN3YWh3MzIoKHgpKSkKLSNkZWZpbmUgX19zd2FoYjMyKHgpIFwKLShfX2J1aWx0aW5fY29uc3RhbnRfcCgoX191MzIpKHgpKSA/IFwKLSBfX19zd2FoYjMyKCh4KSkgOiBcCi0gX19mc3dhaGIzMigoeCkpKQotCi0KLXN0YXRpYyBpbmxpbmUgX191MzIgX19mc3dhaHczMihfX3UzMiB4KQotewotCXJldHVybiBfX2FyY2hfX3N3YWh3MzIoeCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgX191MzIgX19zd2FodzMycChfX3UzMiAqeCkKLXsKLQlyZXR1cm4gX19hcmNoX19zd2FodzMycCh4KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9fc3dhaHczMnMoX191MzIgKmFkZHIpCi17Ci0JX19hcmNoX19zd2FodzMycyhhZGRyKTsKLX0KLQotc3RhdGljIGlubGluZSBfX3UzMiBfX2Zzd2FoYjMyKF9fdTMyIHgpCi17Ci0JcmV0dXJuIF9fYXJjaF9fc3dhaGIzMih4KTsKLX0KLQotc3RhdGljIGlubGluZSBfX3UzMiBfX3N3YWhiMzJwKF9fdTMyICp4KQotewotCXJldHVybiBfX2FyY2hfX3N3YWhiMzJwKHgpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19zd2FoYjMycyhfX3UzMiAqYWRkcikKLXsKLQlfX2FyY2hfX3N3YWhiMzJzKGFkZHIpOwotfQotCi0jaWZkZWYgX19CWVRFT1JERVJfSEFTX1U2NF9fCi0vKgotICogTm90IHN1cHBvcnRlZCB5ZXQKLSAqLwotI2VuZGlmIC8qIF9fQllURU9SREVSX0hBU19VNjRfXyAqLwotCi0jZGVmaW5lIHN3YWh3MzIgX19zd2FodzMyCi0jZGVmaW5lIHN3YWhiMzIgX19zd2FoYjMyCi0jZGVmaW5lIHN3YWh3MzJwIF9fc3dhaHczMnAKLSNkZWZpbmUgc3dhaGIzMnAgX19zd2FoYjMycAotI2RlZmluZSBzd2FodzMycyBfX3N3YWh3MzJzCi0jZGVmaW5lIHN3YWhiMzJzIF9fc3dhaGIzMnMKLQotI2VuZGlmIC8qIF9MSU5VWF9CWVRFT1JERVJfU1dBQkJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jYW4vY29yZS5oIGIvaW5jbHVkZS9saW51eC9jYW4vY29yZS5oCmluZGV4IGY1MDc4NWEuLjI1MDg1Y2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY2FuL2NvcmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Nhbi9jb3JlLmgKQEAgLTE5LDcgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KIAotI2RlZmluZSBDQU5fVkVSU0lPTiAiMjAwODExMzAiCisjZGVmaW5lIENBTl9WRVJTSU9OICIyMDA5MDEwNSIKIAogLyogaW5jcmVtZW50IHRoaXMgbnVtYmVyIGVhY2ggdGltZSB5b3UgY2hhbmdlIHNvbWUgdXNlci1zcGFjZSBpbnRlcmZhY2UgKi8KICNkZWZpbmUgQ0FOX0FCSV9WRVJTSU9OICI4IgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jYXBhYmlsaXR5LmggYi9pbmNsdWRlL2xpbnV4L2NhcGFiaWxpdHkuaAppbmRleCBlMjJmNDhjLi4wMmJkYjc2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NhcGFiaWxpdHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NhcGFiaWxpdHkuaApAQCAtNTI5LDggKzUyOSwyMSBAQAogICoKICAqIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IHNldCBQRl9TVVBFUlBSSVYgb24gdGhlIHRhc2suCiAgKi8KLSNkZWZpbmUgaGFzX2NhcGFiaWxpdHkodCwgY2FwKSAoc2VjdXJpdHlfY2FwYWJsZSgodCksIChjYXApKSA9PSAwKQotI2RlZmluZSBoYXNfY2FwYWJpbGl0eV9ub2F1ZGl0KHQsIGNhcCkgKHNlY3VyaXR5X2NhcGFibGVfbm9hdWRpdCgodCksIChjYXApKSA9PSAwKQorI2RlZmluZSBoYXNfY2FwYWJpbGl0eSh0LCBjYXApIChzZWN1cml0eV9yZWFsX2NhcGFibGUoKHQpLCAoY2FwKSkgPT0gMCkKKworLyoqCisgKiBoYXNfY2FwYWJpbGl0eV9ub2F1ZGl0IC0gRGV0ZXJtaW5lIGlmIGEgdGFzayBoYXMgYSBzdXBlcmlvciBjYXBhYmlsaXR5IGF2YWlsYWJsZSAodW5hdWRpdGVkKQorICogQHQ6IFRoZSB0YXNrIGluIHF1ZXN0aW9uCisgKiBAY2FwOiBUaGUgY2FwYWJpbGl0eSB0byBiZSB0ZXN0ZWQgZm9yCisgKgorICogUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCB0YXNrIGhhcyB0aGUgZ2l2ZW4gc3VwZXJpb3IgY2FwYWJpbGl0eQorICogY3VycmVudGx5IGluIGVmZmVjdCwgZmFsc2UgaWYgbm90LCBidXQgZG9uJ3Qgd3JpdGUgYW4gYXVkaXQgbWVzc2FnZSBmb3IgdGhlCisgKiBjaGVjay4KKyAqCisgKiBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBzZXQgUEZfU1VQRVJQUklWIG9uIHRoZSB0YXNrLgorICovCisjZGVmaW5lIGhhc19jYXBhYmlsaXR5X25vYXVkaXQodCwgY2FwKSBcCisJKHNlY3VyaXR5X3JlYWxfY2FwYWJsZV9ub2F1ZGl0KCh0KSwgKGNhcCkpID09IDApCiAKIGV4dGVybiBpbnQgY2FwYWJsZShpbnQgY2FwKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jZ3JvdXAuaCBiL2luY2x1ZGUvbGludXgvY2dyb3VwLmgKaW5kZXggMTE2NDk2My4uZTI2N2U2MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jZ3JvdXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Nncm91cC5oCkBAIC01Miw5ICs1Miw5IEBACiAJICogaGllcmFyY2h5IHN0cnVjdHVyZSAqLwogCXN0cnVjdCBjZ3JvdXAgKmNncm91cDsKIAotCS8qIFN0YXRlIG1haW50YWluZWQgYnkgdGhlIGNncm91cCBzeXN0ZW0gdG8gYWxsb3cKLQkgKiBzdWJzeXN0ZW1zIHRvIGJlICJidXN5Ii4gU2hvdWxkIGJlIGFjY2Vzc2VkIHZpYSBjc3NfZ2V0KCkKLQkgKiBhbmQgY3NzX3B1dCgpICovCisJLyogU3RhdGUgbWFpbnRhaW5lZCBieSB0aGUgY2dyb3VwIHN5c3RlbSB0byBhbGxvdyBzdWJzeXN0ZW1zCisJICogdG8gYmUgImJ1c3kiLiBTaG91bGQgYmUgYWNjZXNzZWQgdmlhIGNzc19nZXQoKSwKKwkgKiBjc3NfdHJ5Z2V0KCkgYW5kIGFuZCBjc3NfcHV0KCkuICovCiAKIAlhdG9taWNfdCByZWZjbnQ7CiAKQEAgLTY0LDExICs2NCwxNCBAQAogLyogYml0cyBpbiBzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSBmbGFncyBmaWVsZCAqLwogZW51bSB7CiAJQ1NTX1JPT1QsIC8qIFRoaXMgQ1NTIGlzIHRoZSByb290IG9mIHRoZSBzdWJzeXN0ZW0gKi8KKwlDU1NfUkVNT1ZFRCwgLyogVGhpcyBDU1MgaXMgZGVhZCAqLwogfTsKIAogLyoKLSAqIENhbGwgY3NzX2dldCgpIHRvIGhvbGQgYSByZWZlcmVuY2Ugb24gdGhlIGNncm91cDsKLSAqCisgKiBDYWxsIGNzc19nZXQoKSB0byBob2xkIGEgcmVmZXJlbmNlIG9uIHRoZSBjc3M7IGl0IGNhbiBiZSB1c2VkCisgKiBmb3IgYSByZWZlcmVuY2Ugb2J0YWluZWQgdmlhOgorICogLSBhbiBleGlzdGluZyByZWYtY291bnRlZCByZWZlcmVuY2UgdG8gdGhlIGNzcworICogLSB0YXNrLT5jZ3JvdXBzIGZvciBhIGxvY2tlZCB0YXNrCiAgKi8KIAogc3RhdGljIGlubGluZSB2b2lkIGNzc19nZXQoc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzcykKQEAgLTc3LDkgKzgwLDMyIEBACiAJaWYgKCF0ZXN0X2JpdChDU1NfUk9PVCwgJmNzcy0+ZmxhZ3MpKQogCQlhdG9taWNfaW5jKCZjc3MtPnJlZmNudCk7CiB9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBjc3NfaXNfcmVtb3ZlZChzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzKQoreworCXJldHVybiB0ZXN0X2JpdChDU1NfUkVNT1ZFRCwgJmNzcy0+ZmxhZ3MpOworfQorCisvKgorICogQ2FsbCBjc3NfdHJ5Z2V0KCkgdG8gdGFrZSBhIHJlZmVyZW5jZSBvbiBhIGNzcyBpZiB5b3VyIGV4aXN0aW5nCisgKiAoa25vd24tdmFsaWQpIHJlZmVyZW5jZSBpc24ndCBhbHJlYWR5IHJlZi1jb3VudGVkLiBSZXR1cm5zIGZhbHNlIGlmCisgKiB0aGUgY3NzIGhhcyBiZWVuIGRlc3Ryb3llZC4KKyAqLworCitzdGF0aWMgaW5saW5lIGJvb2wgY3NzX3RyeWdldChzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzKQoreworCWlmICh0ZXN0X2JpdChDU1NfUk9PVCwgJmNzcy0+ZmxhZ3MpKQorCQlyZXR1cm4gdHJ1ZTsKKwl3aGlsZSAoIWF0b21pY19pbmNfbm90X3plcm8oJmNzcy0+cmVmY250KSkgeworCQlpZiAodGVzdF9iaXQoQ1NTX1JFTU9WRUQsICZjc3MtPmZsYWdzKSkKKwkJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHRydWU7Cit9CisKIC8qCiAgKiBjc3NfcHV0KCkgc2hvdWxkIGJlIGNhbGxlZCB0byByZWxlYXNlIGEgcmVmZXJlbmNlIHRha2VuIGJ5Ci0gKiBjc3NfZ2V0KCkKKyAqIGNzc19nZXQoKSBvciBjc3NfdHJ5Z2V0KCkKICAqLwogCiBleHRlcm4gdm9pZCBfX2Nzc19wdXQoc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzcyk7CkBAIC0xMTYsNyArMTQyLDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGNoaWxkcmVuOwkvKiBteSBjaGlsZHJlbiAqLwogCiAJc3RydWN0IGNncm91cCAqcGFyZW50OwkvKiBteSBwYXJlbnQgKi8KLQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CSAgCS8qIGNncm91cCBmcyBlbnRyeSAqLworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsJICAJLyogY2dyb3VwIGZzIGVudHJ5LCBSQ1UgcHJvdGVjdGVkICovCiAKIAkvKiBQcml2YXRlIHBvaW50ZXJzIGZvciBlYWNoIHJlZ2lzdGVyZWQgc3Vic3lzdGVtICovCiAJc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKnN1YnN5c1tDR1JPVVBfU1VCU1lTX0NPVU5UXTsKQEAgLTE0NSw2ICsxNzEsOSBAQAogCWludCBwaWRzX3VzZV9jb3VudDsKIAkvKiBMZW5ndGggb2YgdGhlIGN1cnJlbnQgdGFza3NfcGlkcyBhcnJheSAqLwogCWludCBwaWRzX2xlbmd0aDsKKworCS8qIEZvciBSQ1UtcHJvdGVjdGVkIGRlbGV0aW9uICovCisJc3RydWN0IHJjdV9oZWFkIHJjdV9oZWFkOwogfTsKIAogLyogQSBjc3Nfc2V0IGlzIGEgc3RydWN0dXJlIGhvbGRpbmcgcG9pbnRlcnMgdG8gYSBzZXQgb2YKQEAgLTMyOSwxMyArMzU4LDcgQEAKIAkJCXN0cnVjdCBjZ3JvdXAgKmNncnApOwogCXZvaWQgKCpwb3N0X2Nsb25lKShzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsIHN0cnVjdCBjZ3JvdXAgKmNncnApOwogCXZvaWQgKCpiaW5kKShzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsIHN0cnVjdCBjZ3JvdXAgKnJvb3QpOwotCS8qCi0JICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aXRoIHRoZSB0YXNrX2xvY2sgb2YgbW0tPm93bmVyIGhlbGQKLQkgKi8KLQl2b2lkICgqbW1fb3duZXJfY2hhbmdlZCkoc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLAotCQkJCQlzdHJ1Y3QgY2dyb3VwICpvbGQsCi0JCQkJCXN0cnVjdCBjZ3JvdXAgKm5ldywKLQkJCQkJc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKKwogCWludCBzdWJzeXNfaWQ7CiAJaW50IGFjdGl2ZTsKIAlpbnQgZGlzYWJsZWQ7CkBAIC0zNDMsOSArMzY2LDIzIEBACiAjZGVmaW5lIE1BWF9DR1JPVVBfVFlQRV9OQU1FTEVOIDMyCiAJY29uc3QgY2hhciAqbmFtZTsKIAotCS8qIFByb3RlY3RlZCBieSBSQ1UgKi8KLQlzdHJ1Y3QgY2dyb3VwZnNfcm9vdCAqcm9vdDsKKwkvKgorCSAqIFByb3RlY3RzIHNpYmxpbmcvY2hpbGRyZW4gbGlua3Mgb2YgY2dyb3VwcyBpbiB0aGlzCisJICogaGllcmFyY2h5LCBwbHVzIHByb3RlY3RzIHdoaWNoIGhpZXJhcmNoeSAob3Igbm9uZSkgdGhlCisJICogc3Vic3lzdGVtIGlzIGEgcGFydCBvZiAoaS5lLiByb290L3NpYmxpbmcpLiAgVG8gYXZvaWQKKwkgKiBwb3RlbnRpYWwgZGVhZGxvY2tzLCB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbnMgc2hvdWxkIG5vdCBiZQorCSAqIHVuZGVydGFrZW4gd2hpbGUgaG9sZGluZyBhbnkgaGllcmFyY2h5X211dGV4OgorCSAqCisJICogLSBhbGxvY2F0aW5nIG1lbW9yeQorCSAqIC0gaW5pdGlhdGluZyBob3RwbHVnIGV2ZW50cworCSAqLworCXN0cnVjdCBtdXRleCBoaWVyYXJjaHlfbXV0ZXg7CiAKKwkvKgorCSAqIExpbmsgdG8gcGFyZW50LCBhbmQgbGlzdCBlbnRyeSBpbiBwYXJlbnQncyBjaGlsZHJlbi4KKwkgKiBQcm90ZWN0ZWQgYnkgdGhpcy0+aGllcmFyY2h5X211dGV4IGFuZCBjZ3JvdXBfbG9jaygpCisJICovCisJc3RydWN0IGNncm91cGZzX3Jvb3QgKnJvb3Q7CiAJc3RydWN0IGxpc3RfaGVhZCBzaWJsaW5nOwogfTsKIApAQCAtNDAwLDkgKzQzNyw2IEBACiBpbnQgY2dyb3VwX3NjYW5fdGFza3Moc3RydWN0IGNncm91cF9zY2FubmVyICpzY2FuKTsKIGludCBjZ3JvdXBfYXR0YWNoX3Rhc2soc3RydWN0IGNncm91cCAqLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7CiAKLXZvaWQgY2dyb3VwX21tX293bmVyX2NhbGxiYWNrcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKm9sZCwKLQkJCSAgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5ldyk7Ci0KICNlbHNlIC8qICFDT05GSUdfQ0dST1VQUyAqLwogCiBzdGF0aWMgaW5saW5lIGludCBjZ3JvdXBfaW5pdF9lYXJseSh2b2lkKSB7IHJldHVybiAwOyB9CkBAIC00MjAsOSArNDU0LDYgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGNncm91cF9tbV9vd25lcl9jYWxsYmFja3Moc3RydWN0IHRhc2tfc3RydWN0ICpvbGQsCi0JCQkJCSAgICAgc3RydWN0IHRhc2tfc3RydWN0ICpuZXcpIHt9Ci0KICNlbmRpZiAvKiAhQ09ORklHX0NHUk9VUFMgKi8KIAogI2VuZGlmIC8qIF9MSU5VWF9DR1JPVVBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcHVmcmVxLmggYi9pbmNsdWRlL2xpbnV4L2NwdWZyZXEuaAppbmRleCAxZWU2MDhmLi40ODRiM2FiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NwdWZyZXEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NwdWZyZXEuaApAQCAtMjM0LDYgKzIzNCw3IEBACiAJaW50CSgqc3VzcGVuZCkJKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LCBwbV9tZXNzYWdlX3QgcG1zZyk7CiAJaW50CSgqcmVzdW1lKQkoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpOwogCXN0cnVjdCBmcmVxX2F0dHIJKiphdHRyOworCWJvb2wJCQloaWRlX2ludGVyZmFjZTsKIH07CiAKIC8qIGZsYWdzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NwdXNldC5oIGIvaW5jbHVkZS9saW51eC9jcHVzZXQuaAppbmRleCA4ZTU0MGQzLi45MGM2MDc0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NwdXNldC5oCisrKyBiL2luY2x1ZGUvbGludXgvY3B1c2V0LmgKQEAgLTIwLDggKzIwLDkgQEAKIGV4dGVybiBpbnQgY3B1c2V0X2luaXRfZWFybHkodm9pZCk7CiBleHRlcm4gaW50IGNwdXNldF9pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgY3B1c2V0X2luaXRfc21wKHZvaWQpOwotZXh0ZXJuIHZvaWQgY3B1c2V0X2NwdXNfYWxsb3dlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGNwdW1hc2tfdCAqbWFzayk7Ci1leHRlcm4gdm9pZCBjcHVzZXRfY3B1c19hbGxvd2VkX2xvY2tlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGNwdW1hc2tfdCAqbWFzayk7CitleHRlcm4gdm9pZCBjcHVzZXRfY3B1c19hbGxvd2VkKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgc3RydWN0IGNwdW1hc2sgKm1hc2spOworZXh0ZXJuIHZvaWQgY3B1c2V0X2NwdXNfYWxsb3dlZF9sb2NrZWQoc3RydWN0IHRhc2tfc3RydWN0ICpwLAorCQkJCSAgICAgICBzdHJ1Y3QgY3B1bWFzayAqbWFzayk7CiBleHRlcm4gbm9kZW1hc2tfdCBjcHVzZXRfbWVtc19hbGxvd2VkKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CiAjZGVmaW5lIGNwdXNldF9jdXJyZW50X21lbXNfYWxsb3dlZCAoY3VycmVudC0+bWVtc19hbGxvd2VkKQogdm9pZCBjcHVzZXRfaW5pdF9jdXJyZW50X21lbXNfYWxsb3dlZCh2b2lkKTsKQEAgLTc4LDE4ICs3OSwyMSBAQAogCiBleHRlcm4gdm9pZCByZWJ1aWxkX3NjaGVkX2RvbWFpbnModm9pZCk7CiAKK2V4dGVybiB2b2lkIGNwdXNldF9wcmludF90YXNrX21lbXNfYWxsb3dlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOworCiAjZWxzZSAvKiAhQ09ORklHX0NQVVNFVFMgKi8KIAogc3RhdGljIGlubGluZSBpbnQgY3B1c2V0X2luaXRfZWFybHkodm9pZCkgeyByZXR1cm4gMDsgfQogc3RhdGljIGlubGluZSBpbnQgY3B1c2V0X2luaXQodm9pZCkgeyByZXR1cm4gMDsgfQogc3RhdGljIGlubGluZSB2b2lkIGNwdXNldF9pbml0X3NtcCh2b2lkKSB7fQogCi1zdGF0aWMgaW5saW5lIHZvaWQgY3B1c2V0X2NwdXNfYWxsb3dlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGNwdW1hc2tfdCAqbWFzaykKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVzZXRfY3B1c19hbGxvd2VkKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwKKwkJCQkgICAgICAgc3RydWN0IGNwdW1hc2sgKm1hc2spCiB7CiAJKm1hc2sgPSBjcHVfcG9zc2libGVfbWFwOwogfQogc3RhdGljIGlubGluZSB2b2lkIGNwdXNldF9jcHVzX2FsbG93ZWRfbG9ja2VkKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwKLQkJCQkJCQkJY3B1bWFza190ICptYXNrKQorCQkJCQkgICAgICBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKIHsKIAkqbWFzayA9IGNwdV9wb3NzaWJsZV9tYXA7CiB9CkBAIC0xNTksNiArMTYzLDEwIEBACiAJcGFydGl0aW9uX3NjaGVkX2RvbWFpbnMoMSwgTlVMTCwgTlVMTCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVzZXRfcHJpbnRfdGFza19tZW1zX2FsbG93ZWQoc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworfQorCiAjZW5kaWYgLyogIUNPTkZJR19DUFVTRVRTICovCiAKICNlbmRpZiAvKiBfTElOVVhfQ1BVU0VUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGVidWdmcy5oIGIvaW5jbHVkZS9saW51eC9kZWJ1Z2ZzLmgKaW5kZXggZTFhNmMwNC4uMjM5MzZiMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kZWJ1Z2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9kZWJ1Z2ZzLmgKQEAgLTYzLDYgKzYzLDggQEAKIAkJCQkgIHN0cnVjdCBkZW50cnkgKnBhcmVudCwgdTE2ICp2YWx1ZSk7CiBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2NyZWF0ZV94MzIoY29uc3QgY2hhciAqbmFtZSwgbW9kZV90IG1vZGUsCiAJCQkJICBzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsIHUzMiAqdmFsdWUpOworc3RydWN0IGRlbnRyeSAqZGVidWdmc19jcmVhdGVfc2l6ZV90KGNvbnN0IGNoYXIgKm5hbWUsIG1vZGVfdCBtb2RlLAorCQkJCSAgICAgc3RydWN0IGRlbnRyeSAqcGFyZW50LCBzaXplX3QgKnZhbHVlKTsKIHN0cnVjdCBkZW50cnkgKmRlYnVnZnNfY3JlYXRlX2Jvb2woY29uc3QgY2hhciAqbmFtZSwgbW9kZV90IG1vZGUsCiAJCQkJICBzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsIHUzMiAqdmFsdWUpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RldmljZS1tYXBwZXIuaCBiL2luY2x1ZGUvbGludXgvZGV2aWNlLW1hcHBlci5oCmluZGV4IGMxN2ZkMzMuLjgyMDllMDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGV2aWNlLW1hcHBlci5oCisrKyBiL2luY2x1ZGUvbGludXgvZGV2aWNlLW1hcHBlci5oCkBAIC00NSw2ICs0NSw4IEBACiAgKi8KIHR5cGVkZWYgaW50ICgqZG1fbWFwX2ZuKSAoc3RydWN0IGRtX3RhcmdldCAqdGksIHN0cnVjdCBiaW8gKmJpbywKIAkJCSAgdW5pb24gbWFwX2luZm8gKm1hcF9jb250ZXh0KTsKK3R5cGVkZWYgaW50ICgqZG1fbWFwX3JlcXVlc3RfZm4pIChzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgc3RydWN0IHJlcXVlc3QgKmNsb25lLAorCQkJCSAgdW5pb24gbWFwX2luZm8gKm1hcF9jb250ZXh0KTsKIAogLyoKICAqIFJldHVybnM6CkBAIC01Nyw2ICs1OSw5IEBACiB0eXBlZGVmIGludCAoKmRtX2VuZGlvX2ZuKSAoc3RydWN0IGRtX3RhcmdldCAqdGksCiAJCQkgICAgc3RydWN0IGJpbyAqYmlvLCBpbnQgZXJyb3IsCiAJCQkgICAgdW5pb24gbWFwX2luZm8gKm1hcF9jb250ZXh0KTsKK3R5cGVkZWYgaW50ICgqZG1fcmVxdWVzdF9lbmRpb19mbikgKHN0cnVjdCBkbV90YXJnZXQgKnRpLAorCQkJCSAgICBzdHJ1Y3QgcmVxdWVzdCAqY2xvbmUsIGludCBlcnJvciwKKwkJCQkgICAgdW5pb24gbWFwX2luZm8gKm1hcF9jb250ZXh0KTsKIAogdHlwZWRlZiB2b2lkICgqZG1fZmx1c2hfZm4pIChzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSk7CiB0eXBlZGVmIHZvaWQgKCpkbV9wcmVzdXNwZW5kX2ZuKSAoc3RydWN0IGRtX3RhcmdldCAqdGkpOwpAQCAtNzUsNiArODAsMTMgQEAKIHR5cGVkZWYgaW50ICgqZG1fbWVyZ2VfZm4pIChzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgc3RydWN0IGJ2ZWNfbWVyZ2VfZGF0YSAqYnZtLAogCQkJICAgIHN0cnVjdCBiaW9fdmVjICpiaW92ZWMsIGludCBtYXhfc2l6ZSk7CiAKKy8qCisgKiBSZXR1cm5zOgorICogICAgMDogVGhlIHRhcmdldCBjYW4gaGFuZGxlIHRoZSBuZXh0IEkvTyBpbW1lZGlhdGVseS4KKyAqICAgIDE6IFRoZSB0YXJnZXQgY2FuJ3QgaGFuZGxlIHRoZSBuZXh0IEkvTyBpbW1lZGlhdGVseS4KKyAqLwordHlwZWRlZiBpbnQgKCpkbV9idXN5X2ZuKSAoc3RydWN0IGRtX3RhcmdldCAqdGkpOworCiB2b2lkIGRtX2Vycm9yKGNvbnN0IGNoYXIgKm1lc3NhZ2UpOwogCiAvKgpAQCAtMTAwLDE0ICsxMTIsMjMgQEAKIC8qCiAgKiBJbmZvcm1hdGlvbiBhYm91dCBhIHRhcmdldCB0eXBlCiAgKi8KKworLyoKKyAqIFRhcmdldCBmZWF0dXJlcworICovCisjZGVmaW5lIERNX1RBUkdFVF9TVVBQT1JUU19CQVJSSUVSUyAweDAwMDAwMDAxCisKIHN0cnVjdCB0YXJnZXRfdHlwZSB7CisJdWludDY0X3QgZmVhdHVyZXM7CiAJY29uc3QgY2hhciAqbmFtZTsKIAlzdHJ1Y3QgbW9kdWxlICptb2R1bGU7CiAJdW5zaWduZWQgdmVyc2lvblszXTsKIAlkbV9jdHJfZm4gY3RyOwogCWRtX2R0cl9mbiBkdHI7CiAJZG1fbWFwX2ZuIG1hcDsKKwlkbV9tYXBfcmVxdWVzdF9mbiBtYXBfcnE7CiAJZG1fZW5kaW9fZm4gZW5kX2lvOworCWRtX3JlcXVlc3RfZW5kaW9fZm4gcnFfZW5kX2lvOwogCWRtX2ZsdXNoX2ZuIGZsdXNoOwogCWRtX3ByZXN1c3BlbmRfZm4gcHJlc3VzcGVuZDsKIAlkbV9wb3N0c3VzcGVuZF9mbiBwb3N0c3VzcGVuZDsKQEAgLTExNyw2ICsxMzgsNyBAQAogCWRtX21lc3NhZ2VfZm4gbWVzc2FnZTsKIAlkbV9pb2N0bF9mbiBpb2N0bDsKIAlkbV9tZXJnZV9mbiBtZXJnZTsKKwlkbV9idXN5X2ZuIGJ1c3k7CiB9OwogCiBzdHJ1Y3QgaW9fcmVzdHJpY3Rpb25zIHsKQEAgLTE1Nyw4ICsxNzksNyBAQAogfTsKIAogaW50IGRtX3JlZ2lzdGVyX3RhcmdldChzdHJ1Y3QgdGFyZ2V0X3R5cGUgKnQpOwotaW50IGRtX3VucmVnaXN0ZXJfdGFyZ2V0KHN0cnVjdCB0YXJnZXRfdHlwZSAqdCk7Ci0KK3ZvaWQgZG1fdW5yZWdpc3Rlcl90YXJnZXQoc3RydWN0IHRhcmdldF90eXBlICp0KTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogRnVuY3Rpb25zIGZvciBjcmVhdGluZyBhbmQgbWFuaXB1bGF0aW5nIG1hcHBlZCBkZXZpY2VzLgpAQCAtMjc2LDYgKzI5Nyw5IEBACiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjZGVmaW5lIERNX05BTUUgImRldmljZS1tYXBwZXIiCiAKKyNkZWZpbmUgRE1DUklUKGYsIGFyZy4uLikgXAorCXByaW50ayhLRVJOX0NSSVQgRE1fTkFNRSAiOiAiIERNX01TR19QUkVGSVggIjogIiBmICJcbiIsICMjIGFyZykKKwogI2RlZmluZSBETUVSUihmLCBhcmcuLi4pIFwKIAlwcmludGsoS0VSTl9FUlIgRE1fTkFNRSAiOiAiIERNX01TR19QUkVGSVggIjogIiBmICJcbiIsICMjIGFyZykKICNkZWZpbmUgRE1FUlJfTElNSVQoZiwgYXJnLi4uKSBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RldmljZS5oIGIvaW5jbHVkZS9saW51eC9kZXZpY2UuaAppbmRleCAxYTM2ODZkLi43ZDlkYTRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKQEAgLTI4LDYgKzI4LDcgQEAKICNkZWZpbmUgQlVTX0lEX1NJWkUJCTIwCiAKIHN0cnVjdCBkZXZpY2U7CitzdHJ1Y3QgZGV2aWNlX3ByaXZhdGU7CiBzdHJ1Y3QgZGV2aWNlX2RyaXZlcjsKIHN0cnVjdCBkcml2ZXJfcHJpdmF0ZTsKIHN0cnVjdCBjbGFzczsKQEAgLTY1LDcgKzY2LDcgQEAKIAlpbnQgKCpyZXN1bWVfZWFybHkpKHN0cnVjdCBkZXZpY2UgKmRldik7CiAJaW50ICgqcmVzdW1lKShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogCi0Jc3RydWN0IHBtX2V4dF9vcHMgKnBtOworCXN0cnVjdCBkZXZfcG1fb3BzICpwbTsKIAogCXN0cnVjdCBidXNfdHlwZV9wcml2YXRlICpwOwogfTsKQEAgLTEzMyw3ICsxMzQsNyBAQAogCWludCAoKnJlc3VtZSkgKHN0cnVjdCBkZXZpY2UgKmRldik7CiAJc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqKmdyb3VwczsKIAotCXN0cnVjdCBwbV9vcHMgKnBtOworCXN0cnVjdCBkZXZfcG1fb3BzICpwbTsKIAogCXN0cnVjdCBkcml2ZXJfcHJpdmF0ZSAqcDsKIH07CkBAIC0xOTgsNyArMTk5LDcgQEAKIAlpbnQgKCpzdXNwZW5kKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CiAJaW50ICgqcmVzdW1lKShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogCi0Jc3RydWN0IHBtX29wcyAqcG07CisJc3RydWN0IGRldl9wbV9vcHMgKnBtOwogCXN0cnVjdCBjbGFzc19wcml2YXRlICpwOwogfTsKIApAQCAtMjkxLDcgKzI5Miw3IEBACiAJaW50ICgqc3VzcGVuZCkoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOwogCWludCAoKnJlc3VtZSkoc3RydWN0IGRldmljZSAqZGV2KTsKIAotCXN0cnVjdCBwbV9vcHMgKnBtOworCXN0cnVjdCBkZXZfcG1fb3BzICpwbTsKIH07CiAKIC8qIGludGVyZmFjZSBmb3IgZXhwb3J0aW5nIGRldmljZSBhdHRyaWJ1dGVzICovCkBAIC0zNjUsMTcgKzM2NiwxNSBAQAogfTsKIAogc3RydWN0IGRldmljZSB7Ci0Jc3RydWN0IGtsaXN0CQlrbGlzdF9jaGlsZHJlbjsKLQlzdHJ1Y3Qga2xpc3Rfbm9kZQlrbm9kZV9wYXJlbnQ7CS8qIG5vZGUgaW4gc2libGluZyBsaXN0ICovCi0Jc3RydWN0IGtsaXN0X25vZGUJa25vZGVfZHJpdmVyOwotCXN0cnVjdCBrbGlzdF9ub2RlCWtub2RlX2J1czsKIAlzdHJ1Y3QgZGV2aWNlCQkqcGFyZW50OwogCisJc3RydWN0IGRldmljZV9wcml2YXRlCSpwOworCiAJc3RydWN0IGtvYmplY3Qga29iajsKIAljaGFyCWJ1c19pZFtCVVNfSURfU0laRV07CS8qIHBvc2l0aW9uIG9uIHBhcmVudCBidXMgKi8KKwl1bnNpZ25lZAkJdWV2ZW50X3N1cHByZXNzOjE7CiAJY29uc3QgY2hhcgkJKmluaXRfbmFtZTsgLyogaW5pdGlhbCBuYW1lIG9mIHRoZSBkZXZpY2UgKi8KIAlzdHJ1Y3QgZGV2aWNlX3R5cGUJKnR5cGU7Ci0JdW5zaWduZWQJCXVldmVudF9zdXBwcmVzczoxOwogCiAJc3RydWN0IHNlbWFwaG9yZQlzZW07CS8qIHNlbWFwaG9yZSB0byBzeW5jaHJvbml6ZSBjYWxscyB0bwogCQkJCQkgKiBpdHMgZHJpdmVyLgpAQCAtNDA4LDEyICs0MDcsMTMgQEAKIAkvKiBhcmNoIHNwZWNpZmljIGFkZGl0aW9ucyAqLwogCXN0cnVjdCBkZXZfYXJjaGRhdGEJYXJjaGRhdGE7CiAKKwlkZXZfdAkJCWRldnQ7CS8qIGRldl90LCBjcmVhdGVzIHRoZSBzeXNmcyAiZGV2IiAqLworCiAJc3BpbmxvY2tfdAkJZGV2cmVzX2xvY2s7CiAJc3RydWN0IGxpc3RfaGVhZAlkZXZyZXNfaGVhZDsKIAogCXN0cnVjdCBrbGlzdF9ub2RlCWtub2RlX2NsYXNzOwogCXN0cnVjdCBjbGFzcwkJKmNsYXNzOwotCWRldl90CQkJZGV2dDsJLyogZGV2X3QsIGNyZWF0ZXMgdGhlIHN5c2ZzICJkZXYiICovCiAJc3RydWN0IGF0dHJpYnV0ZV9ncm91cAkqKmdyb3VwczsJLyogb3B0aW9uYWwgZ3JvdXBzICovCiAKIAl2b2lkCSgqcmVsZWFzZSkoc3RydWN0IGRldmljZSAqZGV2KTsKQEAgLTQ4Myw2ICs0ODMsMTcgQEAKIGV4dGVybiBpbnQgZGV2aWNlX21vdmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICpuZXdfcGFyZW50KTsKIAogLyoKKyAqIFJvb3QgZGV2aWNlIG9iamVjdHMgZm9yIGdyb3VwaW5nIHVuZGVyIC9zeXMvZGV2aWNlcworICovCitleHRlcm4gc3RydWN0IGRldmljZSAqX19yb290X2RldmljZV9yZWdpc3Rlcihjb25zdCBjaGFyICpuYW1lLAorCQkJCQkgICAgIHN0cnVjdCBtb2R1bGUgKm93bmVyKTsKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRldmljZSAqcm9vdF9kZXZpY2VfcmVnaXN0ZXIoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gX19yb290X2RldmljZV9yZWdpc3RlcihuYW1lLCBUSElTX01PRFVMRSk7Cit9CitleHRlcm4gdm9pZCByb290X2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKnJvb3QpOworCisvKgogICogTWFudWFsIGJpbmRpbmcgb2YgYSBkZXZpY2UgdG8gZHJpdmVyLiBTZWUgZHJpdmVycy9iYXNlL2J1cy5jCiAgKiBmb3IgaW5mb3JtYXRpb24gb24gdXNlLgogICovCkBAIC01NTMsMTMgKzU2NCwxMyBAQAogI2RlZmluZSBkZXZfaW5mbyhkZXYsIGZvcm1hdCwgYXJnLi4uKQkJXAogCWRldl9wcmludGsoS0VSTl9JTkZPICwgZGV2ICwgZm9ybWF0ICwgIyMgYXJnKQogCi0jaWYgZGVmaW5lZChDT05GSUdfRFlOQU1JQ19QUklOVEtfREVCVUcpCisjaWYgZGVmaW5lZChERUJVRykKKyNkZWZpbmUgZGV2X2RiZyhkZXYsIGZvcm1hdCwgYXJnLi4uKQkJXAorCWRldl9wcmludGsoS0VSTl9ERUJVRyAsIGRldiAsIGZvcm1hdCAsICMjIGFyZykKKyNlbGlmIGRlZmluZWQoQ09ORklHX0RZTkFNSUNfUFJJTlRLX0RFQlVHKQogI2RlZmluZSBkZXZfZGJnKGRldiwgZm9ybWF0LCAuLi4pIGRvIHsgXAogCWR5bmFtaWNfZGV2X2RiZyhkZXYsIGZvcm1hdCwgIyNfX1ZBX0FSR1NfXyk7IFwKIAl9IHdoaWxlICgwKQotI2VsaWYgZGVmaW5lZChERUJVRykKLSNkZWZpbmUgZGV2X2RiZyhkZXYsIGZvcm1hdCwgYXJnLi4uKQkJXAotCWRldl9wcmludGsoS0VSTl9ERUJVRyAsIGRldiAsIGZvcm1hdCAsICMjIGFyZykKICNlbHNlCiAjZGVmaW5lIGRldl9kYmcoZGV2LCBmb3JtYXQsIGFyZy4uLikJCVwKIAkoeyBpZiAoMCkgZGV2X3ByaW50ayhLRVJOX0RFQlVHLCBkZXYsIGZvcm1hdCwgIyNhcmcpOyAwOyB9KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kbWFfcmVtYXBwaW5nLmggYi9pbmNsdWRlL2xpbnV4L2RtYV9yZW1hcHBpbmcuaAppbmRleCAxMzZmMTcwLi5hZjFkYWI0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RtYV9yZW1hcHBpbmcuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RtYV9yZW1hcHBpbmcuaApAQCAtMTcsNyArMTcsMTUgQEAKIHN0cnVjdCByb290X2VudHJ5OwogCiBleHRlcm4gdm9pZCBmcmVlX2RtYXJfaW9tbXUoc3RydWN0IGludGVsX2lvbW11ICppb21tdSk7CisKKyNpZmRlZiBDT05GSUdfRE1BUgogZXh0ZXJuIGludCBpb21tdV9jYWxjdWxhdGVfYWdhdyhzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11KTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBpb21tdV9jYWxjdWxhdGVfYWdhdyhzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11KQoreworCXJldHVybiAwOworfQorI2VuZGlmCiAKIGV4dGVybiBpbnQgZG1hcl9kaXNhYmxlZDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kbWFlbmdpbmUuaCBiL2luY2x1ZGUvbGludXgvZG1hZW5naW5lLmgKaW5kZXggYWRiMGIwOC4uNjRkZWEyYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kbWFlbmdpbmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RtYWVuZ2luZS5oCkBAIC0yOSwzMiArMjksNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAKIC8qKgotICogZW51bSBkbWFfc3RhdGUgLSByZXNvdXJjZSBQTlAvcG93ZXIgbWFuYWdlbWVudCBzdGF0ZQotICogQERNQV9SRVNPVVJDRV9TVVNQRU5EOiBETUEgZGV2aWNlIGdvaW5nIGludG8gbG93IHBvd2VyIHN0YXRlCi0gKiBARE1BX1JFU09VUkNFX1JFU1VNRTogRE1BIGRldmljZSByZXR1cm5pbmcgdG8gZnVsbCBwb3dlcgotICogQERNQV9SRVNPVVJDRV9BVkFJTEFCTEU6IERNQSBkZXZpY2UgYXZhaWxhYmxlIHRvIHRoZSBzeXN0ZW0KLSAqIEBETUFfUkVTT1VSQ0VfUkVNT1ZFRDogRE1BIGRldmljZSByZW1vdmVkIGZyb20gdGhlIHN5c3RlbQotICovCi1lbnVtIGRtYV9zdGF0ZSB7Ci0JRE1BX1JFU09VUkNFX1NVU1BFTkQsCi0JRE1BX1JFU09VUkNFX1JFU1VNRSwKLQlETUFfUkVTT1VSQ0VfQVZBSUxBQkxFLAotCURNQV9SRVNPVVJDRV9SRU1PVkVELAotfTsKLQotLyoqCi0gKiBlbnVtIGRtYV9zdGF0ZV9jbGllbnQgLSBzdGF0ZSBvZiB0aGUgY2hhbm5lbCBpbiB0aGUgY2xpZW50Ci0gKiBARE1BX0FDSzogY2xpZW50IHdvdWxkIGxpa2UgdG8gdXNlLCBvciB3YXMgdXNpbmcgdGhpcyBjaGFubmVsCi0gKiBARE1BX0RVUDogY2xpZW50IGhhcyBhbHJlYWR5IHNlZW4gdGhpcyBjaGFubmVsLCBvciBpcyBub3QgdXNpbmcgdGhpcyBjaGFubmVsCi0gKiBARE1BX05BSzogY2xpZW50IGRvZXMgbm90IHdhbnQgdG8gc2VlIGFueSBtb3JlIGNoYW5uZWxzCi0gKi8KLWVudW0gZG1hX3N0YXRlX2NsaWVudCB7Ci0JRE1BX0FDSywKLQlETUFfRFVQLAotCURNQV9OQUssCi19OwotCi0vKioKICAqIHR5cGVkZWYgZG1hX2Nvb2tpZV90IC0gYW4gb3BhcXVlIERNQSBjb29raWUKICAqCiAgKiBpZiBkbWFfY29va2llX3QgaXMgPjAgaXQncyBhIERNQSByZXF1ZXN0IGNvb2tpZSwgPDAgaXQncyBhbiBlcnJvciBjb2RlCkBAIC04OSwyMyArNjMsMTMgQEAKIAlETUFfTUVNU0VULAogCURNQV9NRU1DUFlfQ1JDMzJDLAogCURNQV9JTlRFUlJVUFQsCisJRE1BX1BSSVZBVEUsCiAJRE1BX1NMQVZFLAogfTsKIAogLyogbGFzdCB0cmFuc2FjdGlvbiB0eXBlIGZvciBjcmVhdGlvbiBvZiB0aGUgY2FwYWJpbGl0aWVzIG1hc2sgKi8KICNkZWZpbmUgRE1BX1RYX1RZUEVfRU5EIChETUFfU0xBVkUgKyAxKQogCi0vKioKLSAqIGVudW0gZG1hX3NsYXZlX3dpZHRoIC0gRE1BIHNsYXZlIHJlZ2lzdGVyIGFjY2VzcyB3aWR0aC4KLSAqIEBETUFfU0xBVkVfV0lEVEhfOEJJVDogRG8gOC1iaXQgc2xhdmUgcmVnaXN0ZXIgYWNjZXNzZXMKLSAqIEBETUFfU0xBVkVfV0lEVEhfMTZCSVQ6IERvIDE2LWJpdCBzbGF2ZSByZWdpc3RlciBhY2Nlc3NlcwotICogQERNQV9TTEFWRV9XSURUSF8zMkJJVDogRG8gMzItYml0IHNsYXZlIHJlZ2lzdGVyIGFjY2Vzc2VzCi0gKi8KLWVudW0gZG1hX3NsYXZlX3dpZHRoIHsKLQlETUFfU0xBVkVfV0lEVEhfOEJJVCwKLQlETUFfU0xBVkVfV0lEVEhfMTZCSVQsCi0JRE1BX1NMQVZFX1dJRFRIXzMyQklULAotfTsKIAogLyoqCiAgKiBlbnVtIGRtYV9jdHJsX2ZsYWdzIC0gRE1BIGZsYWdzIHRvIGF1Z21lbnQgb3BlcmF0aW9uIHByZXBhcmF0aW9uLApAQCAtMTMyLDMyICs5Niw2IEBACiB0eXBlZGVmIHN0cnVjdCB7IERFQ0xBUkVfQklUTUFQKGJpdHMsIERNQV9UWF9UWVBFX0VORCk7IH0gZG1hX2NhcF9tYXNrX3Q7CiAKIC8qKgotICogc3RydWN0IGRtYV9zbGF2ZSAtIEluZm9ybWF0aW9uIGFib3V0IGEgRE1BIHNsYXZlCi0gKiBAZGV2OiBkZXZpY2UgYWN0aW5nIGFzIERNQSBzbGF2ZQotICogQGRtYV9kZXY6IHJlcXVpcmVkIERNQSBtYXN0ZXIgZGV2aWNlLiBJZiBub24tTlVMTCwgdGhlIGNsaWVudCBjYW4gbm90IGJlCi0gKglib3VuZCB0byBvdGhlciBtYXN0ZXJzIHRoYW4gdGhpcy4KLSAqIEB0eF9yZWc6IHBoeXNpY2FsIGFkZHJlc3Mgb2YgZGF0YSByZWdpc3RlciB1c2VkIGZvcgotICoJbWVtb3J5LXRvLXBlcmlwaGVyYWwgdHJhbnNmZXJzCi0gKiBAcnhfcmVnOiBwaHlzaWNhbCBhZGRyZXNzIG9mIGRhdGEgcmVnaXN0ZXIgdXNlZCBmb3IKLSAqCXBlcmlwaGVyYWwtdG8tbWVtb3J5IHRyYW5zZmVycwotICogQHJlZ193aWR0aDogcGVyaXBoZXJhbCByZWdpc3RlciB3aWR0aAotICoKLSAqIElmIGRtYV9kZXYgaXMgbm9uLU5VTEwsIHRoZSBjbGllbnQgY2FuIG5vdCBiZSBib3VuZCB0byBvdGhlciBETUEKLSAqIG1hc3RlcnMgdGhhbiB0aGUgb25lIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBkZXZpY2UuIFRoZSBETUEgbWFzdGVyCi0gKiBkcml2ZXIgbWF5IHVzZSB0aGlzIHRvIGRldGVybWluZSBpZiB0aGVyZSBpcyBjb250cm9sbGVyLXNwZWNpZmljCi0gKiBkYXRhIHdyYXBwZWQgYXJvdW5kIHRoaXMgc3RydWN0LiBEcml2ZXJzIG9mIHBsYXRmb3JtIGNvZGUgdGhhdCBzZXRzCi0gKiB0aGUgZG1hX2RldiBmaWVsZCBtdXN0IHRoZXJlZm9yZSBtYWtlIHN1cmUgdG8gdXNlIGFuIGFwcHJvcHJpYXRlCi0gKiBjb250cm9sbGVyLXNwZWNpZmljIGRtYSBzbGF2ZSBzdHJ1Y3R1cmUgd3JhcHBpbmcgdGhpcyBzdHJ1Y3QuCi0gKi8KLXN0cnVjdCBkbWFfc2xhdmUgewotCXN0cnVjdCBkZXZpY2UJCSpkZXY7Ci0Jc3RydWN0IGRldmljZQkJKmRtYV9kZXY7Ci0JZG1hX2FkZHJfdAkJdHhfcmVnOwotCWRtYV9hZGRyX3QJCXJ4X3JlZzsKLQllbnVtIGRtYV9zbGF2ZV93aWR0aAlyZWdfd2lkdGg7Ci19OwotCi0vKioKICAqIHN0cnVjdCBkbWFfY2hhbl9wZXJjcHUgLSB0aGUgcGVyLUNQVSBwYXJ0IG9mIHN0cnVjdCBkbWFfY2hhbgogICogQHJlZmNvdW50OiBsb2NhbF90IHVzZWQgZm9yIG9wZW4tY29kZWQgImJpZ3JlZiIgY291bnRpbmcKICAqIEBtZW1jcHlfY291bnQ6IHRyYW5zYWN0aW9uIGNvdW50ZXIKQEAgLTE2NSw3ICsxMDMsNiBAQAogICovCiAKIHN0cnVjdCBkbWFfY2hhbl9wZXJjcHUgewotCWxvY2FsX3QgcmVmY291bnQ7CiAJLyogc3RhdHMgKi8KIAl1bnNpZ25lZCBsb25nIG1lbWNweV9jb3VudDsKIAl1bnNpZ25lZCBsb25nIGJ5dGVzX3RyYW5zZmVycmVkOwpAQCAtMTc2LDEzICsxMTMsMTQgQEAKICAqIEBkZXZpY2U6IHB0ciB0byB0aGUgZG1hIGRldmljZSB3aG8gc3VwcGxpZXMgdGhpcyBjaGFubmVsLCBhbHdheXMgISVOVUxMCiAgKiBAY29va2llOiBsYXN0IGNvb2tpZSB2YWx1ZSByZXR1cm5lZCB0byBjbGllbnQKICAqIEBjaGFuX2lkOiBjaGFubmVsIElEIGZvciBzeXNmcwotICogQGNsYXNzX2RldjogY2xhc3MgZGV2aWNlIGZvciBzeXNmcworICogQGRldjogY2xhc3MgZGV2aWNlIGZvciBzeXNmcwogICogQHJlZmNvdW50OiBrcmVmLCB1c2VkIGluICJiaWdyZWYiIHNsb3ctbW9kZQogICogQHNsb3dfcmVmOiBpbmRpY2F0ZXMgdGhhdCB0aGUgRE1BIGNoYW5uZWwgaXMgZnJlZQogICogQHJjdTogdGhlIERNQSBjaGFubmVsJ3MgUkNVIGhlYWQKICAqIEBkZXZpY2Vfbm9kZTogdXNlZCB0byBhZGQgdGhpcyB0byB0aGUgZGV2aWNlIGNoYW4gbGlzdAogICogQGxvY2FsOiBwZXItY3B1IHBvaW50ZXIgdG8gYSBzdHJ1Y3QgZG1hX2NoYW5fcGVyY3B1CiAgKiBAY2xpZW50LWNvdW50OiBob3cgbWFueSBjbGllbnRzIGFyZSB1c2luZyB0aGlzIGNoYW5uZWwKKyAqIEB0YWJsZV9jb3VudDogbnVtYmVyIG9mIGFwcGVhcmFuY2VzIGluIHRoZSBtZW0tdG8tbWVtIGFsbG9jYXRpb24gdGFibGUKICAqLwogc3RydWN0IGRtYV9jaGFuIHsKIAlzdHJ1Y3QgZG1hX2RldmljZSAqZGV2aWNlOwpAQCAtMTkwLDczICsxMjgsNDcgQEAKIAogCS8qIHN5c2ZzICovCiAJaW50IGNoYW5faWQ7Ci0Jc3RydWN0IGRldmljZSBkZXY7Ci0KLQlzdHJ1Y3Qga3JlZiByZWZjb3VudDsKLQlpbnQgc2xvd19yZWY7Ci0Jc3RydWN0IHJjdV9oZWFkIHJjdTsKKwlzdHJ1Y3QgZG1hX2NoYW5fZGV2ICpkZXY7CiAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGRldmljZV9ub2RlOwogCXN0cnVjdCBkbWFfY2hhbl9wZXJjcHUgKmxvY2FsOwogCWludCBjbGllbnRfY291bnQ7CisJaW50IHRhYmxlX2NvdW50OwogfTsKIAotI2RlZmluZSB0b19kbWFfY2hhbihwKSBjb250YWluZXJfb2YocCwgc3RydWN0IGRtYV9jaGFuLCBkZXYpCisvKioKKyAqIHN0cnVjdCBkbWFfY2hhbl9kZXYgLSByZWxhdGUgc3lzZnMgZGV2aWNlIG5vZGUgdG8gYmFja2luZyBjaGFubmVsIGRldmljZQorICogQGNoYW4gLSBkcml2ZXIgY2hhbm5lbCBkZXZpY2UKKyAqIEBkZXZpY2UgLSBzeXNmcyBkZXZpY2UKKyAqIEBkZXZfaWQgLSBwYXJlbnQgZG1hX2RldmljZSBkZXZfaWQKKyAqIEBpZHJfcmVmIC0gcmVmZXJlbmNlIGNvdW50IHRvIGdhdGUgcmVsZWFzZSBvZiBkbWFfZGV2aWNlIGRldl9pZAorICovCitzdHJ1Y3QgZG1hX2NoYW5fZGV2IHsKKwlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW47CisJc3RydWN0IGRldmljZSBkZXZpY2U7CisJaW50IGRldl9pZDsKKwlhdG9taWNfdCAqaWRyX3JlZjsKK307CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqZG1hX2NoYW5fbmFtZShzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJcmV0dXJuIGRldl9uYW1lKCZjaGFuLT5kZXYtPmRldmljZSk7Cit9CiAKIHZvaWQgZG1hX2NoYW5fY2xlYW51cChzdHJ1Y3Qga3JlZiAqa3JlZik7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBkbWFfY2hhbl9nZXQoc3RydWN0IGRtYV9jaGFuICpjaGFuKQotewotCWlmICh1bmxpa2VseShjaGFuLT5zbG93X3JlZikpCi0JCWtyZWZfZ2V0KCZjaGFuLT5yZWZjb3VudCk7Ci0JZWxzZSB7Ci0JCWxvY2FsX2luYygmKHBlcl9jcHVfcHRyKGNoYW4tPmxvY2FsLCBnZXRfY3B1KCkpLT5yZWZjb3VudCkpOwotCQlwdXRfY3B1KCk7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZG1hX2NoYW5fcHV0KHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKLXsKLQlpZiAodW5saWtlbHkoY2hhbi0+c2xvd19yZWYpKQotCQlrcmVmX3B1dCgmY2hhbi0+cmVmY291bnQsIGRtYV9jaGFuX2NsZWFudXApOwotCWVsc2UgewotCQlsb2NhbF9kZWMoJihwZXJfY3B1X3B0cihjaGFuLT5sb2NhbCwgZ2V0X2NwdSgpKS0+cmVmY291bnQpKTsKLQkJcHV0X2NwdSgpOwotCX0KLX0KLQotLyoKLSAqIHR5cGVkZWYgZG1hX2V2ZW50X2NhbGxiYWNrIC0gZnVuY3Rpb24gcG9pbnRlciB0byBhIERNQSBldmVudCBjYWxsYmFjawotICogRm9yIGVhY2ggY2hhbm5lbCBhZGRlZCB0byB0aGUgc3lzdGVtIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgZm9yIGVhY2ggY2xpZW50LgotICogSWYgdGhlIGNsaWVudCB3b3VsZCBsaWtlIHRvIHVzZSB0aGUgY2hhbm5lbCBpdCByZXR1cm5zICcxJyB0byBzaWduYWwgKGFjaykKLSAqIHRoZSBkbWFlbmdpbmUgY29yZSB0byB0YWtlIG91dCBhIHJlZmVyZW5jZSBvbiB0aGUgY2hhbm5lbCBhbmQgaXRzCi0gKiBjb3JyZXNwb25kaW5nIGRldmljZS4gIEEgY2xpZW50IG11c3Qgbm90ICdhY2snIGFuIGF2YWlsYWJsZSBjaGFubmVsIG1vcmUKLSAqIHRoYW4gb25jZS4gIFdoZW4gYSBjaGFubmVsIGlzIHJlbW92ZWQgYWxsIGNsaWVudHMgYXJlIG5vdGlmaWVkLiAgSWYgYSBjbGllbnQKLSAqIGlzIHVzaW5nIHRoZSBjaGFubmVsIGl0IG11c3QgJ2FjaycgdGhlIHJlbW92YWwuICBBIGNsaWVudCBtdXN0IG5vdCAnYWNrJyBhCi0gKiByZW1vdmVkIGNoYW5uZWwgbW9yZSB0aGFuIG9uY2UuCi0gKiBAY2xpZW50IC0gJ3RoaXMnIHBvaW50ZXIgZm9yIHRoZSBjbGllbnQgY29udGV4dAotICogQGNoYW4gLSBjaGFubmVsIHRvIGJlIGFjdGVkIHVwb24KLSAqIEBzdGF0ZSAtIGF2YWlsYWJsZSBvciByZW1vdmVkCi0gKi8KLXN0cnVjdCBkbWFfY2xpZW50OwotdHlwZWRlZiBlbnVtIGRtYV9zdGF0ZV9jbGllbnQgKCpkbWFfZXZlbnRfY2FsbGJhY2spIChzdHJ1Y3QgZG1hX2NsaWVudCAqY2xpZW50LAotCQlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIGVudW0gZG1hX3N0YXRlIHN0YXRlKTsKLQogLyoqCi0gKiBzdHJ1Y3QgZG1hX2NsaWVudCAtIGluZm8gb24gdGhlIGVudGl0eSBtYWtpbmcgdXNlIG9mIERNQSBzZXJ2aWNlcwotICogQGV2ZW50X2NhbGxiYWNrOiBmdW5jIHB0ciB0byBjYWxsIHdoZW4gc29tZXRoaW5nIGhhcHBlbnMKLSAqIEBjYXBfbWFzazogb25seSByZXR1cm4gY2hhbm5lbHMgdGhhdCBzYXRpc2Z5IHRoZSByZXF1ZXN0ZWQgY2FwYWJpbGl0aWVzCi0gKiAgYSB2YWx1ZSBvZiB6ZXJvIGNvcnJlc3BvbmRzIHRvIGFueSBjYXBhYmlsaXR5Ci0gKiBAc2xhdmU6IGRhdGEgZm9yIHByZXBhcmluZyBzbGF2ZSB0cmFuc2Zlci4gTXVzdCBiZSBub24tTlVMTCBpZmYgdGhlCi0gKiAgRE1BX1NMQVZFIGNhcGFiaWxpdHkgaXMgcmVxdWVzdGVkLgotICogQGdsb2JhbF9ub2RlOiBsaXN0X2hlYWQgZm9yIGdsb2JhbCBkbWFfY2xpZW50X2xpc3QKKyAqIHR5cGVkZWYgZG1hX2ZpbHRlcl9mbiAtIGNhbGxiYWNrIGZpbHRlciBmb3IgZG1hX3JlcXVlc3RfY2hhbm5lbAorICogQGNoYW46IGNoYW5uZWwgdG8gYmUgcmV2aWV3ZWQKKyAqIEBmaWx0ZXJfcGFyYW06IG9wYXF1ZSBwYXJhbWV0ZXIgcGFzc2VkIHRocm91Z2ggZG1hX3JlcXVlc3RfY2hhbm5lbAorICoKKyAqIFdoZW4gdGhpcyBvcHRpb25hbCBwYXJhbWV0ZXIgaXMgc3BlY2lmaWVkIGluIGEgY2FsbCB0byBkbWFfcmVxdWVzdF9jaGFubmVsIGEKKyAqIHN1aXRhYmxlIGNoYW5uZWwgaXMgcGFzc2VkIHRvIHRoaXMgcm91dGluZSBmb3IgZnVydGhlciBkaXNwb3NpdGlvbmluZyBiZWZvcmUKKyAqIGJlaW5nIHJldHVybmVkLiAgV2hlcmUgJ3N1aXRhYmxlJyBpbmRpY2F0ZXMgYSBub24tYnVzeSBjaGFubmVsIHRoYXQKKyAqIHNhdGlzZmllcyB0aGUgZ2l2ZW4gY2FwYWJpbGl0eSBtYXNrLiAgSXQgcmV0dXJucyAndHJ1ZScgdG8gaW5kaWNhdGUgdGhhdCB0aGUKKyAqIGNoYW5uZWwgaXMgc3VpdGFibGUuCiAgKi8KLXN0cnVjdCBkbWFfY2xpZW50IHsKLQlkbWFfZXZlbnRfY2FsbGJhY2sJZXZlbnRfY2FsbGJhY2s7Ci0JZG1hX2NhcF9tYXNrX3QJCWNhcF9tYXNrOwotCXN0cnVjdCBkbWFfc2xhdmUJKnNsYXZlOwotCXN0cnVjdCBsaXN0X2hlYWQJZ2xvYmFsX25vZGU7Ci19OwordHlwZWRlZiBib29sICgqZG1hX2ZpbHRlcl9mbikoc3RydWN0IGRtYV9jaGFuICpjaGFuLCB2b2lkICpmaWx0ZXJfcGFyYW0pOwogCiB0eXBlZGVmIHZvaWQgKCpkbWFfYXN5bmNfdHhfY2FsbGJhY2spKHZvaWQgKmRtYV9hc3luY19wYXJhbSk7CiAvKioKQEAgLTMyMywxNCArMjM1LDEwIEBACiAJZG1hX2NhcF9tYXNrX3QgIGNhcF9tYXNrOwogCWludCBtYXhfeG9yOwogCi0Jc3RydWN0IGtyZWYgcmVmY291bnQ7Ci0Jc3RydWN0IGNvbXBsZXRpb24gZG9uZTsKLQogCWludCBkZXZfaWQ7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCi0JaW50ICgqZGV2aWNlX2FsbG9jX2NoYW5fcmVzb3VyY2VzKShzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sCi0JCQlzdHJ1Y3QgZG1hX2NsaWVudCAqY2xpZW50KTsKKwlpbnQgKCpkZXZpY2VfYWxsb2NfY2hhbl9yZXNvdXJjZXMpKHN0cnVjdCBkbWFfY2hhbiAqY2hhbik7CiAJdm9pZCAoKmRldmljZV9mcmVlX2NoYW5fcmVzb3VyY2VzKShzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pOwogCiAJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICooKmRldmljZV9wcmVwX2RtYV9tZW1jcHkpKApAQCAtMzYyLDkgKzI3MCw4IEBACiAKIC8qIC0tLSBwdWJsaWMgRE1BIGVuZ2luZSBBUEkgLS0tICovCiAKLXZvaWQgZG1hX2FzeW5jX2NsaWVudF9yZWdpc3RlcihzdHJ1Y3QgZG1hX2NsaWVudCAqY2xpZW50KTsKLXZvaWQgZG1hX2FzeW5jX2NsaWVudF91bnJlZ2lzdGVyKHN0cnVjdCBkbWFfY2xpZW50ICpjbGllbnQpOwotdm9pZCBkbWFfYXN5bmNfY2xpZW50X2NoYW5fcmVxdWVzdChzdHJ1Y3QgZG1hX2NsaWVudCAqY2xpZW50KTsKK3ZvaWQgZG1hZW5naW5lX2dldCh2b2lkKTsKK3ZvaWQgZG1hZW5naW5lX3B1dCh2b2lkKTsKIGRtYV9jb29raWVfdCBkbWFfYXN5bmNfbWVtY3B5X2J1Zl90b19idWYoc3RydWN0IGRtYV9jaGFuICpjaGFuLAogCXZvaWQgKmRlc3QsIHZvaWQgKnNyYywgc2l6ZV90IGxlbik7CiBkbWFfY29va2llX3QgZG1hX2FzeW5jX21lbWNweV9idWZfdG9fcGcoc3RydWN0IGRtYV9jaGFuICpjaGFuLApAQCAtNDA2LDYgKzMxMywxMiBAQAogCXNldF9iaXQodHhfdHlwZSwgZHN0cC0+Yml0cyk7CiB9CiAKKyNkZWZpbmUgZG1hX2NhcF96ZXJvKG1hc2spIF9fZG1hX2NhcF96ZXJvKCYobWFzaykpCitzdGF0aWMgaW5saW5lIHZvaWQgX19kbWFfY2FwX3plcm8oZG1hX2NhcF9tYXNrX3QgKmRzdHApCit7CisJYml0bWFwX3plcm8oZHN0cC0+Yml0cywgRE1BX1RYX1RZUEVfRU5EKTsKK30KKwogI2RlZmluZSBkbWFfaGFzX2NhcCh0eCwgbWFzaykgX19kbWFfaGFzX2NhcCgodHgpLCAmKG1hc2spKQogc3RhdGljIGlubGluZSBpbnQKIF9fZG1hX2hhc19jYXAoZW51bSBkbWFfdHJhbnNhY3Rpb25fdHlwZSB0eF90eXBlLCBkbWFfY2FwX21hc2tfdCAqc3JjcCkKQEAgLTQ3NSwxMSArMzg4LDI1IEBACiB9CiAKIGVudW0gZG1hX3N0YXR1cyBkbWFfc3luY193YWl0KHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgZG1hX2Nvb2tpZV90IGNvb2tpZSk7CisjaWZkZWYgQ09ORklHX0RNQV9FTkdJTkUKK2VudW0gZG1hX3N0YXR1cyBkbWFfd2FpdF9mb3JfYXN5bmNfdHgoc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eCk7CisjZWxzZQorc3RhdGljIGlubGluZSBlbnVtIGRtYV9zdGF0dXMgZG1hX3dhaXRfZm9yX2FzeW5jX3R4KHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHgpCit7CisJcmV0dXJuIERNQV9TVUNDRVNTOworfQorI2VuZGlmCiAKIC8qIC0tLSBETUEgZGV2aWNlIC0tLSAqLwogCiBpbnQgZG1hX2FzeW5jX2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgZG1hX2RldmljZSAqZGV2aWNlKTsKIHZvaWQgZG1hX2FzeW5jX2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCBkbWFfZGV2aWNlICpkZXZpY2UpOwordm9pZCBkbWFfcnVuX2RlcGVuZGVuY2llcyhzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4KTsKK3N0cnVjdCBkbWFfY2hhbiAqZG1hX2ZpbmRfY2hhbm5lbChlbnVtIGRtYV90cmFuc2FjdGlvbl90eXBlIHR4X3R5cGUpOwordm9pZCBkbWFfaXNzdWVfcGVuZGluZ19hbGwodm9pZCk7CisjZGVmaW5lIGRtYV9yZXF1ZXN0X2NoYW5uZWwobWFzaywgeCwgeSkgX19kbWFfcmVxdWVzdF9jaGFubmVsKCYobWFzayksIHgsIHkpCitzdHJ1Y3QgZG1hX2NoYW4gKl9fZG1hX3JlcXVlc3RfY2hhbm5lbChkbWFfY2FwX21hc2tfdCAqbWFzaywgZG1hX2ZpbHRlcl9mbiBmbiwgdm9pZCAqZm5fcGFyYW0pOwordm9pZCBkbWFfcmVsZWFzZV9jaGFubmVsKHN0cnVjdCBkbWFfY2hhbiAqY2hhbik7CiAKIC8qIC0tLSBIZWxwZXIgaW92LWxvY2tpbmcgZnVuY3Rpb25zIC0tLSAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RxYmxrX3F0cmVlLmggYi9pbmNsdWRlL2xpbnV4L2RxYmxrX3F0cmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJhMTY1MgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvZHFibGtfcXRyZWUuaApAQCAtMCwwICsxLDU2IEBACisvKgorICoJRGVmaW5pdGlvbnMgb2Ygc3RydWN0dXJlcyBhbmQgZnVuY3Rpb25zIGZvciBxdW90YSBmb3JtYXRzIHVzaW5nIHRyaWUKKyAqLworCisjaWZuZGVmIF9MSU5VWF9EUUJMS19RVFJFRV9ICisjZGVmaW5lIF9MSU5VWF9EUUJMS19RVFJFRV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBOdW1iZXJzIG9mIGJsb2NrcyBuZWVkZWQgZm9yIHVwZGF0ZXMgLSB3ZSBjb3VudCB3aXRoIHRoZSBzbWFsbGVzdAorICogcG9zc2libGUgYmxvY2sgc2l6ZSAoMTAyNCkgKi8KKyNkZWZpbmUgUVRSRUVfSU5JVF9BTExPQyA0CisjZGVmaW5lIFFUUkVFX0lOSVRfUkVXUklURSAyCisjZGVmaW5lIFFUUkVFX0RFTF9BTExPQyAwCisjZGVmaW5lIFFUUkVFX0RFTF9SRVdSSVRFIDYKKworc3RydWN0IGRxdW90OworCisvKiBPcGVyYXRpb25zICovCitzdHJ1Y3QgcXRyZWVfZm10X29wZXJhdGlvbnMgeworCXZvaWQgKCptZW0yZGlza19kcWJsaykodm9pZCAqZGlzaywgc3RydWN0IGRxdW90ICpkcXVvdCk7CS8qIENvbnZlcnQgZ2l2ZW4gZW50cnkgZnJvbSBpbiBtZW1vcnkgZm9ybWF0IHRvIGRpc2sgb25lICovCisJdm9pZCAoKmRpc2sybWVtX2RxYmxrKShzdHJ1Y3QgZHF1b3QgKmRxdW90LCB2b2lkICpkaXNrKTsJLyogQ29udmVydCBnaXZlbiBlbnRyeSBmcm9tIGRpc2sgZm9ybWF0IHRvIGluIG1lbW9yeSBvbmUgKi8KKwlpbnQgKCppc19pZCkodm9pZCAqZGlzaywgc3RydWN0IGRxdW90ICpkcXVvdCk7CS8qIElzIHRoaXMgc3RydWN0dXJlIGZvciBnaXZlbiBpZD8gKi8KK307CisKKy8qIElubWVtb3J5IGNvcHkgb2YgdmVyc2lvbiBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLworc3RydWN0IHF0cmVlX21lbV9kcWluZm8geworCXN0cnVjdCBzdXBlcl9ibG9jayAqZHFpX3NiOwkvKiBTYiBxdW90YSBpcyBvbiAqLworCWludCBkcWlfdHlwZTsJCQkvKiBRdW90YSB0eXBlICovCisJdW5zaWduZWQgaW50IGRxaV9ibG9ja3M7CS8qICMgb2YgYmxvY2tzIGluIHF1b3RhIGZpbGUgKi8KKwl1bnNpZ25lZCBpbnQgZHFpX2ZyZWVfYmxrOwkvKiBGaXJzdCBibG9jayBpbiBsaXN0IG9mIGZyZWUgYmxvY2tzICovCisJdW5zaWduZWQgaW50IGRxaV9mcmVlX2VudHJ5OwkvKiBGaXJzdCBibG9jayB3aXRoIGZyZWUgZW50cnkgKi8KKwl1bnNpZ25lZCBpbnQgZHFpX2Jsb2Nrc2l6ZV9iaXRzOwkvKiBCbG9jayBzaXplIG9mIHF1b3RhIGZpbGUgKi8KKwl1bnNpZ25lZCBpbnQgZHFpX2VudHJ5X3NpemU7CS8qIFNpemUgb2YgcXVvdGEgZW50cnkgaW4gcXVvdGEgZmlsZSAqLworCXVuc2lnbmVkIGludCBkcWlfdXNhYmxlX2JzOwkvKiBTcGFjZSB1c2FibGUgaW4gYmxvY2sgZm9yIHF1b3RhIGRhdGEgKi8KKwl1bnNpZ25lZCBpbnQgZHFpX3F0cmVlX2RlcHRoOwkvKiBQcmVjb21wdXRlZCBkZXB0aCBvZiBxdW90YSB0cmVlICovCisJc3RydWN0IHF0cmVlX2ZtdF9vcGVyYXRpb25zICpkcWlfb3BzOwkvKiBPcGVyYXRpb25zIGZvciBlbnRyeSBtYW5pcHVsYXRpb24gKi8KK307CisKK2ludCBxdHJlZV93cml0ZV9kcXVvdChzdHJ1Y3QgcXRyZWVfbWVtX2RxaW5mbyAqaW5mbywgc3RydWN0IGRxdW90ICpkcXVvdCk7CitpbnQgcXRyZWVfcmVhZF9kcXVvdChzdHJ1Y3QgcXRyZWVfbWVtX2RxaW5mbyAqaW5mbywgc3RydWN0IGRxdW90ICpkcXVvdCk7CitpbnQgcXRyZWVfZGVsZXRlX2RxdW90KHN0cnVjdCBxdHJlZV9tZW1fZHFpbmZvICppbmZvLCBzdHJ1Y3QgZHF1b3QgKmRxdW90KTsKK2ludCBxdHJlZV9yZWxlYXNlX2RxdW90KHN0cnVjdCBxdHJlZV9tZW1fZHFpbmZvICppbmZvLCBzdHJ1Y3QgZHF1b3QgKmRxdW90KTsKK2ludCBxdHJlZV9lbnRyeV91bnVzZWQoc3RydWN0IHF0cmVlX21lbV9kcWluZm8gKmluZm8sIGNoYXIgKmRpc2spOworc3RhdGljIGlubGluZSBpbnQgcXRyZWVfZGVwdGgoc3RydWN0IHF0cmVlX21lbV9kcWluZm8gKmluZm8pCit7CisJdW5zaWduZWQgaW50IGVwYiA9IGluZm8tPmRxaV91c2FibGVfYnMgPj4gMjsKKwl1bnNpZ25lZCBsb25nIGxvbmcgZW50cmllcyA9IGVwYjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDE7IGVudHJpZXMgPCAoMVVMTCA8PCAzMik7IGkrKykKKwkJZW50cmllcyAqPSBlcGI7CisJcmV0dXJuIGk7Cit9CisKKyNlbmRpZiAvKiBfTElOVVhfRFFCTEtfUVRSRUVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kcWJsa192MS5oIGIvaW5jbHVkZS9saW51eC9kcWJsa192MS5oCmluZGV4IDU3ZjEyNTAuLjM3MTNhNzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZHFibGtfdjEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RxYmxrX3YxLmgKQEAgLTUsOSArNSw2IEBACiAjaWZuZGVmIF9MSU5VWF9EUUJMS19WMV9ICiAjZGVmaW5lIF9MSU5VWF9EUUJMS19WMV9ICiAKLS8qIElkIG9mIHF1b3RhIGZvcm1hdCAqLwotI2RlZmluZSBRRk1UX1ZGU19PTEQgMQotCiAvKiBSb290IHNxdWFzaCB0dXJuZWQgb24gKi8KICNkZWZpbmUgVjFfRFFGX1JTUVVBU0ggMQogCkBAIC0xNyw4ICsxNCw0IEBACiAjZGVmaW5lIFYxX0RFTF9BTExPQyAwCiAjZGVmaW5lIFYxX0RFTF9SRVdSSVRFIDIKIAotLyogU3BlY2lhbCBpbmZvcm1hdGlvbiBhYm91dCBxdW90YWZpbGUgKi8KLXN0cnVjdCB2MV9tZW1fZHFpbmZvIHsKLX07Ci0KICNlbmRpZgkvKiBfTElOVVhfRFFCTEtfVjFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kcWJsa192Mi5oIGIvaW5jbHVkZS9saW51eC9kcWJsa192Mi5oCmluZGV4IDRmODUzMzIuLjE4MDAwYTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZHFibGtfdjIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RxYmxrX3YyLmgKQEAgLTEsMjYgKzEsMTYgQEAKIC8qCi0gKglEZWZpbml0aW9ucyBvZiBzdHJ1Y3R1cmVzIGZvciB2ZnN2MCBxdW90YSBmb3JtYXQKKyAqICBEZWZpbml0aW9ucyBmb3IgdmZzdjAgcXVvdGEgZm9ybWF0CiAgKi8KIAogI2lmbmRlZiBfTElOVVhfRFFCTEtfVjJfSAogI2RlZmluZSBfTElOVVhfRFFCTEtfVjJfSAogCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQotLyogaWQgbnVtYmVycyBvZiBxdW90YSBmb3JtYXQgKi8KLSNkZWZpbmUgUUZNVF9WRlNfVjAgMgorI2luY2x1ZGUgPGxpbnV4L2RxYmxrX3F0cmVlLmg+CiAKIC8qIE51bWJlcnMgb2YgYmxvY2tzIG5lZWRlZCBmb3IgdXBkYXRlcyAqLwotI2RlZmluZSBWMl9JTklUX0FMTE9DIDQKLSNkZWZpbmUgVjJfSU5JVF9SRVdSSVRFIDIKLSNkZWZpbmUgVjJfREVMX0FMTE9DIDAKLSNkZWZpbmUgVjJfREVMX1JFV1JJVEUgNgotCi0vKiBJbm1lbW9yeSBjb3B5IG9mIHZlcnNpb24gc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KLXN0cnVjdCB2Ml9tZW1fZHFpbmZvIHsKLQl1bnNpZ25lZCBpbnQgZHFpX2Jsb2NrczsKLQl1bnNpZ25lZCBpbnQgZHFpX2ZyZWVfYmxrOwotCXVuc2lnbmVkIGludCBkcWlfZnJlZV9lbnRyeTsKLX07CisjZGVmaW5lIFYyX0lOSVRfQUxMT0MgUVRSRUVfSU5JVF9BTExPQworI2RlZmluZSBWMl9JTklUX1JFV1JJVEUgUVRSRUVfSU5JVF9SRVdSSVRFCisjZGVmaW5lIFYyX0RFTF9BTExPQyBRVFJFRV9ERUxfQUxMT0MKKyNkZWZpbmUgVjJfREVMX1JFV1JJVEUgUVRSRUVfREVMX1JFV1JJVEUKIAogI2VuZGlmIC8qIF9MSU5VWF9EUUJMS19WMl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2R3X2RtYWMuaCBiL2luY2x1ZGUvbGludXgvZHdfZG1hYy5oCmluZGV4IDA0ZDIxN2IuLmQ3OTdkZGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZHdfZG1hYy5oCisrKyBiL2luY2x1ZGUvbGludXgvZHdfZG1hYy5oCkBAIC0yMiwxNCArMjIsMzQgQEAKIH07CiAKIC8qKgorICogZW51bSBkd19kbWFfc2xhdmVfd2lkdGggLSBETUEgc2xhdmUgcmVnaXN0ZXIgYWNjZXNzIHdpZHRoLgorICogQERNQV9TTEFWRV9XSURUSF84QklUOiBEbyA4LWJpdCBzbGF2ZSByZWdpc3RlciBhY2Nlc3NlcworICogQERNQV9TTEFWRV9XSURUSF8xNkJJVDogRG8gMTYtYml0IHNsYXZlIHJlZ2lzdGVyIGFjY2Vzc2VzCisgKiBARE1BX1NMQVZFX1dJRFRIXzMyQklUOiBEbyAzMi1iaXQgc2xhdmUgcmVnaXN0ZXIgYWNjZXNzZXMKKyAqLworZW51bSBkd19kbWFfc2xhdmVfd2lkdGggeworCURXX0RNQV9TTEFWRV9XSURUSF84QklULAorCURXX0RNQV9TTEFWRV9XSURUSF8xNkJJVCwKKwlEV19ETUFfU0xBVkVfV0lEVEhfMzJCSVQsCit9OworCisvKioKICAqIHN0cnVjdCBkd19kbWFfc2xhdmUgLSBDb250cm9sbGVyLXNwZWNpZmljIGluZm9ybWF0aW9uIGFib3V0IGEgc2xhdmUKLSAqIEBzbGF2ZTogR2VuZXJpYyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2xhdmUKLSAqIEBjdGxfbG86IFBsYXRmb3JtLXNwZWNpZmljIGluaXRpYWxpemVyIGZvciB0aGUgQ1RMX0xPIHJlZ2lzdGVyCisgKgorICogQGRtYV9kZXY6IHJlcXVpcmVkIERNQSBtYXN0ZXIgZGV2aWNlCisgKiBAdHhfcmVnOiBwaHlzaWNhbCBhZGRyZXNzIG9mIGRhdGEgcmVnaXN0ZXIgdXNlZCBmb3IKKyAqCW1lbW9yeS10by1wZXJpcGhlcmFsIHRyYW5zZmVycworICogQHJ4X3JlZzogcGh5c2ljYWwgYWRkcmVzcyBvZiBkYXRhIHJlZ2lzdGVyIHVzZWQgZm9yCisgKglwZXJpcGhlcmFsLXRvLW1lbW9yeSB0cmFuc2ZlcnMKKyAqIEByZWdfd2lkdGg6IHBlcmlwaGVyYWwgcmVnaXN0ZXIgd2lkdGgKICAqIEBjZmdfaGk6IFBsYXRmb3JtLXNwZWNpZmljIGluaXRpYWxpemVyIGZvciB0aGUgQ0ZHX0hJIHJlZ2lzdGVyCiAgKiBAY2ZnX2xvOiBQbGF0Zm9ybS1zcGVjaWZpYyBpbml0aWFsaXplciBmb3IgdGhlIENGR19MTyByZWdpc3RlcgogICovCiBzdHJ1Y3QgZHdfZG1hX3NsYXZlIHsKLQlzdHJ1Y3QgZG1hX3NsYXZlCXNsYXZlOworCXN0cnVjdCBkZXZpY2UJCSpkbWFfZGV2OworCWRtYV9hZGRyX3QJCXR4X3JlZzsKKwlkbWFfYWRkcl90CQlyeF9yZWc7CisJZW51bSBkd19kbWFfc2xhdmVfd2lkdGgJcmVnX3dpZHRoOwogCXUzMgkJCWNmZ19oaTsKIAl1MzIJCQljZmdfbG87CiB9OwpAQCAtNTQsOSArNzQsNCBAQAogI2RlZmluZSBEV0NfQ0ZHTF9IU19EU1RfUE9MCSgxIDw8IDE4KQkvKiBkc3QgaGFuZHNoYWtlIGFjdGl2ZSBsb3cgKi8KICNkZWZpbmUgRFdDX0NGR0xfSFNfU1JDX1BPTAkoMSA8PCAxOSkJLyogc3JjIGhhbmRzaGFrZSBhY3RpdmUgbG93ICovCiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGR3X2RtYV9zbGF2ZSAqdG9fZHdfZG1hX3NsYXZlKHN0cnVjdCBkbWFfc2xhdmUgKnNsYXZlKQotewotCXJldHVybiBjb250YWluZXJfb2Yoc2xhdmUsIHN0cnVjdCBkd19kbWFfc2xhdmUsIHNsYXZlKTsKLX0KLQogI2VuZGlmIC8qIERXX0RNQUNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9leHQyX2ZzLmggYi9pbmNsdWRlL2xpbnV4L2V4dDJfZnMuaAppbmRleCA3OGM3NzVhLi4xMjE3MjBkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2V4dDJfZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2V4dDJfZnMuaApAQCAtMTk0LDYgKzE5NCwzMCBAQAogI2RlZmluZSBFWFQyX0ZMX1VTRVJfVklTSUJMRQkJRlNfRkxfVVNFUl9WSVNJQkxFCS8qIFVzZXIgdmlzaWJsZSBmbGFncyAqLwogI2RlZmluZSBFWFQyX0ZMX1VTRVJfTU9ESUZJQUJMRQkJRlNfRkxfVVNFUl9NT0RJRklBQkxFCS8qIFVzZXIgbW9kaWZpYWJsZSBmbGFncyAqLwogCisvKiBGbGFncyB0aGF0IHNob3VsZCBiZSBpbmhlcml0ZWQgYnkgbmV3IGlub2RlcyBmcm9tIHRoZWlyIHBhcmVudC4gKi8KKyNkZWZpbmUgRVhUMl9GTF9JTkhFUklURUQgKEVYVDJfU0VDUk1fRkwgfCBFWFQyX1VOUk1fRkwgfCBFWFQyX0NPTVBSX0ZMIHxcCisJCQkgICBFWFQyX1NZTkNfRkwgfCBFWFQyX0lNTVVUQUJMRV9GTCB8IEVYVDJfQVBQRU5EX0ZMIHxcCisJCQkgICBFWFQyX05PRFVNUF9GTCB8IEVYVDJfTk9BVElNRV9GTCB8IEVYVDJfQ09NUFJCTEtfRkx8XAorCQkJICAgRVhUMl9OT0NPTVBfRkwgfCBFWFQyX0pPVVJOQUxfREFUQV9GTCB8XAorCQkJICAgRVhUMl9OT1RBSUxfRkwgfCBFWFQyX0RJUlNZTkNfRkwpCisKKy8qIEZsYWdzIHRoYXQgYXJlIGFwcHJvcHJpYXRlIGZvciByZWd1bGFyIGZpbGVzIChhbGwgYnV0IGRpci1zcGVjaWZpYyBvbmVzKS4gKi8KKyNkZWZpbmUgRVhUMl9SRUdfRkxNQVNLICh+KEVYVDJfRElSU1lOQ19GTCB8IEVYVDJfVE9QRElSX0ZMKSkKKworLyogRmxhZ3MgdGhhdCBhcmUgYXBwcm9wcmlhdGUgZm9yIG5vbi1kaXJlY3Rvcmllcy9yZWd1bGFyIGZpbGVzLiAqLworI2RlZmluZSBFWFQyX09USEVSX0ZMTUFTSyAoRVhUMl9OT0RVTVBfRkwgfCBFWFQyX05PQVRJTUVfRkwpCisKKy8qIE1hc2sgb3V0IGZsYWdzIHRoYXQgYXJlIGluYXBwcm9wcmlhdGUgZm9yIHRoZSBnaXZlbiB0eXBlIG9mIGlub2RlLiAqLworc3RhdGljIGlubGluZSBfX3UzMiBleHQyX21hc2tfZmxhZ3ModW1vZGVfdCBtb2RlLCBfX3UzMiBmbGFncykKK3sKKwlpZiAoU19JU0RJUihtb2RlKSkKKwkJcmV0dXJuIGZsYWdzOworCWVsc2UgaWYgKFNfSVNSRUcobW9kZSkpCisJCXJldHVybiBmbGFncyAmIEVYVDJfUkVHX0ZMTUFTSzsKKwllbHNlCisJCXJldHVybiBmbGFncyAmIEVYVDJfT1RIRVJfRkxNQVNLOworfQorCiAvKgogICogaW9jdGwgY29tbWFuZHMKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9leHQyX2ZzX3NiLmggYi9pbmNsdWRlL2xpbnV4L2V4dDJfZnNfc2IuaAppbmRleCBkYzU0MWYzLi4xY2RiNjYzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2V4dDJfZnNfc2IuaAorKysgYi9pbmNsdWRlL2xpbnV4L2V4dDJfZnNfc2IuaApAQCAtMTAxLDcgKzEwMSw3IEBACiAJc3RydWN0IHBlcmNwdV9jb3VudGVyIHNfZnJlZWJsb2Nrc19jb3VudGVyOwogCXN0cnVjdCBwZXJjcHVfY291bnRlciBzX2ZyZWVpbm9kZXNfY291bnRlcjsKIAlzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgc19kaXJzX2NvdW50ZXI7Ci0Jc3RydWN0IGJsb2NrZ3JvdXBfbG9jayBzX2Jsb2NrZ3JvdXBfbG9jazsKKwlzdHJ1Y3QgYmxvY2tncm91cF9sb2NrICpzX2Jsb2NrZ3JvdXBfbG9jazsKIAkvKiByb290IG9mIHRoZSBwZXIgZnMgcmVzZXJ2YXRpb24gd2luZG93IHRyZWUgKi8KIAlzcGlubG9ja190IHNfcnN2X3dpbmRvd19sb2NrOwogCXN0cnVjdCByYl9yb290IHNfcnN2X3dpbmRvd19yb290OwpAQCAtMTExLDcgKzExMSw3IEBACiBzdGF0aWMgaW5saW5lIHNwaW5sb2NrX3QgKgogc2JfYmdsX2xvY2soc3RydWN0IGV4dDJfc2JfaW5mbyAqc2JpLCB1bnNpZ25lZCBpbnQgYmxvY2tfZ3JvdXApCiB7Ci0JcmV0dXJuIGJnbF9sb2NrX3B0cigmc2JpLT5zX2Jsb2NrZ3JvdXBfbG9jaywgYmxvY2tfZ3JvdXApOworCXJldHVybiBiZ2xfbG9ja19wdHIoc2JpLT5zX2Jsb2NrZ3JvdXBfbG9jaywgYmxvY2tfZ3JvdXApOwogfQogCiAjZW5kaWYJLyogX0xJTlVYX0VYVDJfRlNfU0IgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZXh0M19mcy5oIGIvaW5jbHVkZS9saW51eC9leHQzX2ZzLmgKaW5kZXggZDE0ZjAyOS4uZGQ0OTViOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9leHQzX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9leHQzX2ZzLmgKQEAgLTE3OCw2ICsxNzgsMzAgQEAKICNkZWZpbmUgRVhUM19GTF9VU0VSX1ZJU0lCTEUJCTB4MDAwM0RGRkYgLyogVXNlciB2aXNpYmxlIGZsYWdzICovCiAjZGVmaW5lIEVYVDNfRkxfVVNFUl9NT0RJRklBQkxFCQkweDAwMDM4MEZGIC8qIFVzZXIgbW9kaWZpYWJsZSBmbGFncyAqLwogCisvKiBGbGFncyB0aGF0IHNob3VsZCBiZSBpbmhlcml0ZWQgYnkgbmV3IGlub2RlcyBmcm9tIHRoZWlyIHBhcmVudC4gKi8KKyNkZWZpbmUgRVhUM19GTF9JTkhFUklURUQgKEVYVDNfU0VDUk1fRkwgfCBFWFQzX1VOUk1fRkwgfCBFWFQzX0NPTVBSX0ZMIHxcCisJCQkgICBFWFQzX1NZTkNfRkwgfCBFWFQzX0lNTVVUQUJMRV9GTCB8IEVYVDNfQVBQRU5EX0ZMIHxcCisJCQkgICBFWFQzX05PRFVNUF9GTCB8IEVYVDNfTk9BVElNRV9GTCB8IEVYVDNfQ09NUFJCTEtfRkx8XAorCQkJICAgRVhUM19OT0NPTVBSX0ZMIHwgRVhUM19KT1VSTkFMX0RBVEFfRkwgfFwKKwkJCSAgIEVYVDNfTk9UQUlMX0ZMIHwgRVhUM19ESVJTWU5DX0ZMKQorCisvKiBGbGFncyB0aGF0IGFyZSBhcHByb3ByaWF0ZSBmb3IgcmVndWxhciBmaWxlcyAoYWxsIGJ1dCBkaXItc3BlY2lmaWMgb25lcykuICovCisjZGVmaW5lIEVYVDNfUkVHX0ZMTUFTSyAofihFWFQzX0RJUlNZTkNfRkwgfCBFWFQzX1RPUERJUl9GTCkpCisKKy8qIEZsYWdzIHRoYXQgYXJlIGFwcHJvcHJpYXRlIGZvciBub24tZGlyZWN0b3JpZXMvcmVndWxhciBmaWxlcy4gKi8KKyNkZWZpbmUgRVhUM19PVEhFUl9GTE1BU0sgKEVYVDNfTk9EVU1QX0ZMIHwgRVhUM19OT0FUSU1FX0ZMKQorCisvKiBNYXNrIG91dCBmbGFncyB0aGF0IGFyZSBpbmFwcHJvcHJpYXRlIGZvciB0aGUgZ2l2ZW4gdHlwZSBvZiBpbm9kZS4gKi8KK3N0YXRpYyBpbmxpbmUgX191MzIgZXh0M19tYXNrX2ZsYWdzKHVtb2RlX3QgbW9kZSwgX191MzIgZmxhZ3MpCit7CisJaWYgKFNfSVNESVIobW9kZSkpCisJCXJldHVybiBmbGFnczsKKwllbHNlIGlmIChTX0lTUkVHKG1vZGUpKQorCQlyZXR1cm4gZmxhZ3MgJiBFWFQzX1JFR19GTE1BU0s7CisJZWxzZQorCQlyZXR1cm4gZmxhZ3MgJiBFWFQzX09USEVSX0ZMTUFTSzsKK30KKwogLyoKICAqIElub2RlIGR5bmFtaWMgc3RhdGUgZmxhZ3MKICAqLwpAQCAtMzU0LDYgKzM3OCwxMyBAQAogI2RlZmluZQlFWFQzX09SUEhBTl9GUwkJCTB4MDAwNAkvKiBPcnBoYW5zIGJlaW5nIHJlY292ZXJlZCAqLwogCiAvKgorICogTWlzYy4gZmlsZXN5c3RlbSBmbGFncworICovCisjZGVmaW5lIEVYVDJfRkxBR1NfU0lHTkVEX0hBU0gJCTB4MDAwMSAgLyogU2lnbmVkIGRpcmhhc2ggaW4gdXNlICovCisjZGVmaW5lIEVYVDJfRkxBR1NfVU5TSUdORURfSEFTSAkweDAwMDIgIC8qIFVuc2lnbmVkIGRpcmhhc2ggaW4gdXNlICovCisjZGVmaW5lIEVYVDJfRkxBR1NfVEVTVF9GSUxFU1lTCQkweDAwMDQJLyogdG8gdGVzdCBkZXZlbG9wbWVudCBjb2RlICovCisKKy8qCiAgKiBNb3VudCBmbGFncwogICovCiAjZGVmaW5lIEVYVDNfTU9VTlRfQ0hFQ0sJCTB4MDAwMDEJLyogRG8gbW91bnQtdGltZSBjaGVja3MgKi8KQEAgLTQ4OSw3ICs1MjAsMjMgQEAKIAlfX3UxNglzX3Jlc2VydmVkX3dvcmRfcGFkOwogCV9fbGUzMglzX2RlZmF1bHRfbW91bnRfb3B0czsKIAlfX2xlMzIJc19maXJzdF9tZXRhX2JnOwkvKiBGaXJzdCBtZXRhYmxvY2sgYmxvY2sgZ3JvdXAgKi8KLQlfX3UzMglzX3Jlc2VydmVkWzE5MF07CS8qIFBhZGRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgYmxvY2sgKi8KKwlfX2xlMzIJc19ta2ZzX3RpbWU7CQkvKiBXaGVuIHRoZSBmaWxlc3lzdGVtIHdhcyBjcmVhdGVkICovCisJX19sZTMyCXNfam5sX2Jsb2Nrc1sxN107CS8qIEJhY2t1cCBvZiB0aGUgam91cm5hbCBpbm9kZSAqLworCS8qIDY0Yml0IHN1cHBvcnQgdmFsaWQgaWYgRVhUNF9GRUFUVVJFX0NPTVBBVF82NEJJVCAqLworLyoxNTAqLwlfX2xlMzIJc19ibG9ja3NfY291bnRfaGk7CS8qIEJsb2NrcyBjb3VudCAqLworCV9fbGUzMglzX3JfYmxvY2tzX2NvdW50X2hpOwkvKiBSZXNlcnZlZCBibG9ja3MgY291bnQgKi8KKwlfX2xlMzIJc19mcmVlX2Jsb2Nrc19jb3VudF9oaTsJLyogRnJlZSBibG9ja3MgY291bnQgKi8KKwlfX2xlMTYJc19taW5fZXh0cmFfaXNpemU7CS8qIEFsbCBpbm9kZXMgaGF2ZSBhdCBsZWFzdCAjIGJ5dGVzICovCisJX19sZTE2CXNfd2FudF9leHRyYV9pc2l6ZTsgCS8qIE5ldyBpbm9kZXMgc2hvdWxkIHJlc2VydmUgIyBieXRlcyAqLworCV9fbGUzMglzX2ZsYWdzOwkJLyogTWlzY2VsbGFuZW91cyBmbGFncyAqLworCV9fbGUxNiAgc19yYWlkX3N0cmlkZTsJCS8qIFJBSUQgc3RyaWRlICovCisJX19sZTE2ICBzX21tcF9pbnRlcnZhbDsgICAgICAgICAvKiAjIHNlY29uZHMgdG8gd2FpdCBpbiBNTVAgY2hlY2tpbmcgKi8KKwlfX2xlNjQgIHNfbW1wX2Jsb2NrOyAgICAgICAgICAgIC8qIEJsb2NrIGZvciBtdWx0aS1tb3VudCBwcm90ZWN0aW9uICovCisJX19sZTMyICBzX3JhaWRfc3RyaXBlX3dpZHRoOyAgICAvKiBibG9ja3Mgb24gYWxsIGRhdGEgZGlza3MgKE4qc3RyaWRlKSovCisJX191OAlzX2xvZ19ncm91cHNfcGVyX2ZsZXg7ICAvKiBGTEVYX0JHIGdyb3VwIHNpemUgKi8KKwlfX3U4CXNfcmVzZXJ2ZWRfY2hhcl9wYWQyOworCV9fbGUxNiAgc19yZXNlcnZlZF9wYWQ7CisJX191MzIgICBzX3Jlc2VydmVkWzE2Ml07ICAgICAgICAvKiBQYWRkaW5nIHRvIHRoZSBlbmQgb2YgdGhlIGJsb2NrICovCiB9OwogCiAjaWZkZWYgX19LRVJORUxfXwpAQCAtNjk0LDYgKzc0MSw5IEBACiAjZGVmaW5lIERYX0hBU0hfTEVHQUNZCQkwCiAjZGVmaW5lIERYX0hBU0hfSEFMRl9NRDQJMQogI2RlZmluZSBEWF9IQVNIX1RFQQkJMgorI2RlZmluZSBEWF9IQVNIX0xFR0FDWV9VTlNJR05FRAkzCisjZGVmaW5lIERYX0hBU0hfSEFMRl9NRDRfVU5TSUdORUQJNAorI2RlZmluZSBEWF9IQVNIX1RFQV9VTlNJR05FRAkJNQogCiAjaWZkZWYgX19LRVJORUxfXwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V4dDNfZnNfc2IuaCBiL2luY2x1ZGUvbGludXgvZXh0M19mc19zYi5oCmluZGV4IGUwMjRlMzguLmYwN2YzNGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZXh0M19mc19zYi5oCisrKyBiL2luY2x1ZGUvbGludXgvZXh0M19mc19zYi5oCkBAIC01NywxMCArNTcsMTEgQEAKIAl1MzIgc19uZXh0X2dlbmVyYXRpb247CiAJdTMyIHNfaGFzaF9zZWVkWzRdOwogCWludCBzX2RlZl9oYXNoX3ZlcnNpb247CisJaW50IHNfaGFzaF91bnNpZ25lZDsJLyogMyBpZiBoYXNoIHNob3VsZCBiZSBzaWduZWQsIDAgaWYgbm90ICovCiAJc3RydWN0IHBlcmNwdV9jb3VudGVyIHNfZnJlZWJsb2Nrc19jb3VudGVyOwogCXN0cnVjdCBwZXJjcHVfY291bnRlciBzX2ZyZWVpbm9kZXNfY291bnRlcjsKIAlzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgc19kaXJzX2NvdW50ZXI7Ci0Jc3RydWN0IGJsb2NrZ3JvdXBfbG9jayBzX2Jsb2NrZ3JvdXBfbG9jazsKKwlzdHJ1Y3QgYmxvY2tncm91cF9sb2NrICpzX2Jsb2NrZ3JvdXBfbG9jazsKIAogCS8qIHJvb3Qgb2YgdGhlIHBlciBmcyByZXNlcnZhdGlvbiB3aW5kb3cgdHJlZSAqLwogCXNwaW5sb2NrX3Qgc19yc3Zfd2luZG93X2xvY2s7CkBAIC04Niw3ICs4Nyw3IEBACiBzdGF0aWMgaW5saW5lIHNwaW5sb2NrX3QgKgogc2JfYmdsX2xvY2soc3RydWN0IGV4dDNfc2JfaW5mbyAqc2JpLCB1bnNpZ25lZCBpbnQgYmxvY2tfZ3JvdXApCiB7Ci0JcmV0dXJuIGJnbF9sb2NrX3B0cigmc2JpLT5zX2Jsb2NrZ3JvdXBfbG9jaywgYmxvY2tfZ3JvdXApOworCXJldHVybiBiZ2xfbG9ja19wdHIoc2JpLT5zX2Jsb2NrZ3JvdXBfbG9jaywgYmxvY2tfZ3JvdXApOwogfQogCiAjZW5kaWYJLyogX0xJTlVYX0VYVDNfRlNfU0IgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnMuaCBiL2luY2x1ZGUvbGludXgvZnMuaAppbmRleCBmMmEzMDEwMS4uMGI4N2IyOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvZnMuaApAQCAtNTY1LDYgKzU2NSw3IEBACiBzdHJ1Y3QgYmxvY2tfZGV2aWNlIHsKIAlkZXZfdAkJCWJkX2RldjsgIC8qIG5vdCBhIGtkZXZfdCAtIGl0J3MgYSBzZWFyY2gga2V5ICovCiAJc3RydWN0IGlub2RlICoJCWJkX2lub2RlOwkvKiB3aWxsIGRpZSAqLworCXN0cnVjdCBzdXBlcl9ibG9jayAqCWJkX3N1cGVyOwogCWludAkJCWJkX29wZW5lcnM7CiAJc3RydWN0IG11dGV4CQliZF9tdXRleDsJLyogb3Blbi9jbG9zZSBtdXRleCAqLwogCXN0cnVjdCBzZW1hcGhvcmUJYmRfbW91bnRfc2VtOwpAQCAtMTEzMyw3ICsxMTM0LDYgQEAKIAlzdHJ1Y3Qgcndfc2VtYXBob3JlCXNfdW1vdW50OwogCXN0cnVjdCBtdXRleAkJc19sb2NrOwogCWludAkJCXNfY291bnQ7Ci0JaW50CQkJc19zeW5jaW5nOwogCWludAkJCXNfbmVlZF9zeW5jX2ZzOwogCWF0b21pY190CQlzX2FjdGl2ZTsKICNpZmRlZiBDT05GSUdfU0VDVVJJVFkKQEAgLTExODUsNiArMTE4NSwxMSBAQAogCSAqIGdlbmVyaWNfc2hvd19vcHRpb25zKCkKIAkgKi8KIAljaGFyICpzX29wdGlvbnM7CisKKwkvKgorCSAqIHN0b3JhZ2UgZm9yIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zCisJICovCisJc3RydWN0IGxpc3RfaGVhZCBzX2FzeW5jX2xpc3Q7CiB9OwogCiBleHRlcm4gc3RydWN0IHRpbWVzcGVjIGN1cnJlbnRfZnNfdGltZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKQEAgLTEzODUsNiArMTM5MCw3IEBACiAJc3NpemVfdCAoKnF1b3RhX3JlYWQpKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbnQsIGNoYXIgKiwgc2l6ZV90LCBsb2ZmX3QpOwogCXNzaXplX3QgKCpxdW90YV93cml0ZSkoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCwgY29uc3QgY2hhciAqLCBzaXplX3QsIGxvZmZfdCk7CiAjZW5kaWYKKwlpbnQgKCpiZGV2X3RyeV90b19mcmVlX3BhZ2UpKHN0cnVjdCBzdXBlcl9ibG9jayosIHN0cnVjdCBwYWdlKiwgZ2ZwX3QpOwogfTsKIAogLyoKQEAgLTE4MzAsNyArMTgzNiw3IEBACiBleHRlcm4gaW50IGZpbGVtYXBfZmRhdGF3cml0ZV9yYW5nZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKIAkJCQlsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQpOwogCi1leHRlcm4gbG9uZyBkb19mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGRhdGFzeW5jKTsKK2V4dGVybiBpbnQgdmZzX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBkYXRhc3luYyk7CiBleHRlcm4gdm9pZCBzeW5jX3N1cGVycyh2b2lkKTsKIGV4dGVybiB2b2lkIHN5bmNfZmlsZXN5c3RlbXMoaW50IHdhaXQpOwogZXh0ZXJuIHZvaWQgX19mc3luY19zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKQEAgLTIwNTksNiArMjA2NSw5IEBACiAKIGV4dGVybiBpbnQgZG9fdmZzX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsCiAJCSAgICB1bnNpZ25lZCBsb25nIGFyZyk7CitleHRlcm4gaW50IF9fZ2VuZXJpY19ibG9ja19maWVtYXAoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgIHN0cnVjdCBmaWVtYXBfZXh0ZW50X2luZm8gKmZpZWluZm8sIHU2NCBzdGFydCwKKwkJCQkgIHU2NCBsZW4sIGdldF9ibG9ja190ICpnZXRfYmxvY2spOwogZXh0ZXJuIGludCBnZW5lcmljX2Jsb2NrX2ZpZW1hcChzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCXN0cnVjdCBmaWVtYXBfZXh0ZW50X2luZm8gKmZpZWluZm8sIHU2NCBzdGFydCwKIAkJCQl1NjQgbGVuLCBnZXRfYmxvY2tfdCAqZ2V0X2Jsb2NrKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnVzZS5oIGIvaW5jbHVkZS9saW51eC9mdXNlLmgKaW5kZXggMzUwZmU5Ny4uMTYyZTVkZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mdXNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9mdXNlLmgKQEAgLTEsNiArMSw2IEBACiAvKgogICAgIEZVU0U6IEZpbGVzeXN0ZW0gaW4gVXNlcnNwYWNlCi0gICAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgIE1pa2xvcyBTemVyZWRpIDxtaWtsb3NAc3plcmVkaS5odT4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCAgTWlrbG9zIFN6ZXJlZGkgPG1pa2xvc0BzemVyZWRpLmh1PgogCiAgICAgVGhpcyBwcm9ncmFtIGNhbiBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwuCiAgICAgU2VlIHRoZSBmaWxlIENPUFlJTkcuCkBAIC0yMCwyOSArMjAsMjcgQEAKICAqCiAgKiA3LjEwCiAgKiAgLSBhZGQgbm9uc2Vla2FibGUgb3BlbiBmbGFnCisgKgorICogNy4xMQorICogIC0gYWRkIElPQ1RMIG1lc3NhZ2UKKyAqICAtIGFkZCB1bnNvbGljaXRlZCBub3RpZmljYXRpb24gc3VwcG9ydAorICogIC0gYWRkIFBPTEwgbWVzc2FnZSBhbmQgTk9USUZZX1BPTEwgbm90aWZpY2F0aW9uCiAgKi8KIAogI2lmbmRlZiBfTElOVVhfRlVTRV9ICiAjZGVmaW5lIF9MSU5VWF9GVVNFX0gKIAotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogLyoqIFZlcnNpb24gbnVtYmVyIG9mIHRoaXMgaW50ZXJmYWNlICovCiAjZGVmaW5lIEZVU0VfS0VSTkVMX1ZFUlNJT04gNwogCiAvKiogTWlub3IgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBpbnRlcmZhY2UgKi8KLSNkZWZpbmUgRlVTRV9LRVJORUxfTUlOT1JfVkVSU0lPTiAxMAorI2RlZmluZSBGVVNFX0tFUk5FTF9NSU5PUl9WRVJTSU9OIDExCiAKIC8qKiBUaGUgbm9kZSBJRCBvZiB0aGUgcm9vdCBpbm9kZSAqLwogI2RlZmluZSBGVVNFX1JPT1RfSUQgMQogCi0vKiogVGhlIG1ham9yIG51bWJlciBvZiB0aGUgZnVzZSBjaGFyYWN0ZXIgZGV2aWNlICovCi0jZGVmaW5lIEZVU0VfTUFKT1IgTUlTQ19NQUpPUgotCi0vKiogVGhlIG1pbm9yIG51bWJlciBvZiB0aGUgZnVzZSBjaGFyYWN0ZXIgZGV2aWNlICovCi0jZGVmaW5lIEZVU0VfTUlOT1IgMjI5Ci0KIC8qIE1ha2Ugc3VyZSBhbGwgc3RydWN0dXJlcyBhcmUgcGFkZGVkIHRvIDY0Yml0IGJvdW5kYXJ5LCBzbyAzMmJpdAogICAgdXNlcnNwYWNlIHdvcmtzIHVuZGVyIDY0Yml0IGtlcm5lbHMgKi8KIApAQCAtMTUxLDYgKzE0OSwyOCBAQAogICovCiAjZGVmaW5lIEZVU0VfUkVBRF9MT0NLT1dORVIJKDEgPDwgMSkKIAorLyoqCisgKiBJb2N0bCBmbGFncworICoKKyAqIEZVU0VfSU9DVExfQ09NUEFUOiAzMmJpdCBjb21wYXQgaW9jdGwgb24gNjRiaXQgbWFjaGluZQorICogRlVTRV9JT0NUTF9VTlJFU1RSSUNURUQ6IG5vdCByZXN0cmljdGVkIHRvIHdlbGwtZm9ybWVkIGlvY3RscywgcmV0cnkgYWxsb3dlZAorICogRlVTRV9JT0NUTF9SRVRSWTogcmV0cnkgd2l0aCBuZXcgaW92ZWNzCisgKgorICogRlVTRV9JT0NUTF9NQVhfSU9WOiBtYXhpbXVtIG9mIGluX2lvdmVjcyArIG91dF9pb3ZlY3MKKyAqLworI2RlZmluZSBGVVNFX0lPQ1RMX0NPTVBBVAkoMSA8PCAwKQorI2RlZmluZSBGVVNFX0lPQ1RMX1VOUkVTVFJJQ1RFRAkoMSA8PCAxKQorI2RlZmluZSBGVVNFX0lPQ1RMX1JFVFJZCSgxIDw8IDIpCisKKyNkZWZpbmUgRlVTRV9JT0NUTF9NQVhfSU9WCTI1NgorCisvKioKKyAqIFBvbGwgZmxhZ3MKKyAqCisgKiBGVVNFX1BPTExfU0NIRURVTEVfTk9USUZZOiByZXF1ZXN0IHBvbGwgbm90aWZ5CisgKi8KKyNkZWZpbmUgRlVTRV9QT0xMX1NDSEVEVUxFX05PVElGWSAoMSA8PCAwKQorCiBlbnVtIGZ1c2Vfb3Bjb2RlIHsKIAlGVVNFX0xPT0tVUAkgICA9IDEsCiAJRlVTRV9GT1JHRVQJICAgPSAyLCAgLyogbm8gcmVwbHkgKi8KQEAgLTE4OCw2ICsyMDgsMTMgQEAKIAlGVVNFX0lOVEVSUlVQVCAgICAgPSAzNiwKIAlGVVNFX0JNQVAgICAgICAgICAgPSAzNywKIAlGVVNFX0RFU1RST1kgICAgICAgPSAzOCwKKwlGVVNFX0lPQ1RMICAgICAgICAgPSAzOSwKKwlGVVNFX1BPTEwgICAgICAgICAgPSA0MCwKK307CisKK2VudW0gZnVzZV9ub3RpZnlfY29kZSB7CisJRlVTRV9OT1RJRllfUE9MTCAgID0gMSwKKwlGVVNFX05PVElGWV9DT0RFX01BWCwKIH07CiAKIC8qIFRoZSByZWFkIGJ1ZmZlciBpcyByZXF1aXJlZCB0byBiZSBhdCBsZWFzdCA4aywgYnV0IG1heSBiZSBtdWNoIGxhcmdlciAqLwpAQCAtMzg4LDYgKzQxNSwzOCBAQAogCV9fdTY0CWJsb2NrOwogfTsKIAorc3RydWN0IGZ1c2VfaW9jdGxfaW4geworCV9fdTY0CWZoOworCV9fdTMyCWZsYWdzOworCV9fdTMyCWNtZDsKKwlfX3U2NAlhcmc7CisJX191MzIJaW5fc2l6ZTsKKwlfX3UzMglvdXRfc2l6ZTsKK307CisKK3N0cnVjdCBmdXNlX2lvY3RsX291dCB7CisJX19zMzIJcmVzdWx0OworCV9fdTMyCWZsYWdzOworCV9fdTMyCWluX2lvdnM7CisJX191MzIJb3V0X2lvdnM7Cit9OworCitzdHJ1Y3QgZnVzZV9wb2xsX2luIHsKKwlfX3U2NAlmaDsKKwlfX3U2NAlraDsKKwlfX3UzMglmbGFnczsKKwlfX3UzMiAgIHBhZGRpbmc7Cit9OworCitzdHJ1Y3QgZnVzZV9wb2xsX291dCB7CisJX191MzIJcmV2ZW50czsKKwlfX3UzMglwYWRkaW5nOworfTsKKworc3RydWN0IGZ1c2Vfbm90aWZ5X3BvbGxfd2FrZXVwX291dCB7CisJX191NjQJa2g7Cit9OworCiBzdHJ1Y3QgZnVzZV9pbl9oZWFkZXIgewogCV9fdTMyCWxlbjsKIAlfX3UzMglvcGNvZGU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2dmcC5oIGIvaW5jbHVkZS9saW51eC9nZnAuaAppbmRleCBlODAwM2FmLi5kZDIwY2Q3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2dmcC5oCisrKyBiL2luY2x1ZGUvbGludXgvZ2ZwLmgKQEAgLTY5LDEyICs2OSw2IEBACiAjZGVmaW5lIEdGUF9ISUdIVVNFUl9NT1ZBQkxFCShfX0dGUF9XQUlUIHwgX19HRlBfSU8gfCBfX0dGUF9GUyB8IFwKIAkJCQkgX19HRlBfSEFSRFdBTEwgfCBfX0dGUF9ISUdITUVNIHwgXAogCQkJCSBfX0dGUF9NT1ZBQkxFKQotI2RlZmluZSBHRlBfTk9GU19QQUdFQ0FDSEUJKF9fR0ZQX1dBSVQgfCBfX0dGUF9JTyB8IF9fR0ZQX01PVkFCTEUpCi0jZGVmaW5lIEdGUF9VU0VSX1BBR0VDQUNIRQkoX19HRlBfV0FJVCB8IF9fR0ZQX0lPIHwgX19HRlBfRlMgfCBcCi0JCQkJIF9fR0ZQX0hBUkRXQUxMIHwgX19HRlBfTU9WQUJMRSkKLSNkZWZpbmUgR0ZQX0hJR0hVU0VSX1BBR0VDQUNIRQkoX19HRlBfV0FJVCB8IF9fR0ZQX0lPIHwgX19HRlBfRlMgfCBcCi0JCQkJIF9fR0ZQX0hBUkRXQUxMIHwgX19HRlBfSElHSE1FTSB8IFwKLQkJCQkgX19HRlBfTU9WQUJMRSkKIAogI2lmZGVmIENPTkZJR19OVU1BCiAjZGVmaW5lIEdGUF9USElTTk9ERQkoX19HRlBfVEhJU05PREUgfCBfX0dGUF9OT1dBUk4gfCBfX0dGUF9OT1JFVFJZKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ncGlvX2tleXMuaCBiL2luY2x1ZGUvbGludXgvZ3Bpb19rZXlzLmgKaW5kZXggZWM2ZWNkNy4uMTI4OWZhNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ncGlvX2tleXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2dwaW9fa2V5cy5oCkBAIC0xNSw2ICsxNSw3IEBACiBzdHJ1Y3QgZ3Bpb19rZXlzX3BsYXRmb3JtX2RhdGEgewogCXN0cnVjdCBncGlvX2tleXNfYnV0dG9uICpidXR0b25zOwogCWludCBuYnV0dG9uczsKKwl1bnNpZ25lZCBpbnQgcmVwOjE7CQkvKiBlbmFibGUgaW5wdXQgc3Vic3lzdGVtIGF1dG8gcmVwZWF0ICovCiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaGlkLmggYi9pbmNsdWRlL2xpbnV4L2hpZC5oCmluZGV4IGU1NzgwZjguLjgxYWE4NGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaGlkLmgKKysrIGIvaW5jbHVkZS9saW51eC9oaWQuaApAQCAtNDAzLDE1ICs0MDMsNiBAQAogI2RlZmluZSBISURfU1RBVF9BRERFRAkJMQogI2RlZmluZSBISURfU1RBVF9QQVJTRUQJCTIKIAotI2RlZmluZSBISURfQ1RSTF9SVU5OSU5HCTEKLSNkZWZpbmUgSElEX09VVF9SVU5OSU5HCQkyCi0jZGVmaW5lIEhJRF9JTl9SVU5OSU5HCQkzCi0jZGVmaW5lIEhJRF9SRVNFVF9QRU5ESU5HCTQKLSNkZWZpbmUgSElEX1NVU1BFTkRFRAkJNQotI2RlZmluZSBISURfQ0xFQVJfSEFMVAkJNgotI2RlZmluZSBISURfRElTQ09OTkVDVEVECTcKLSNkZWZpbmUgSElEX1NUQVJURUQJCTgKLQogc3RydWN0IGhpZF9pbnB1dCB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQ7CkBAIC01NDAsNiArNTMxLDggQEAKICAqIEBuYW1lOiBkcml2ZXIgbmFtZSAoZS5nLiAiRm9vdGVjaF9iYXItd2hlZWwiKQogICogQGlkX3RhYmxlOiB3aGljaCBkZXZpY2VzIGlzIHRoaXMgZHJpdmVyIGZvciAobXVzdCBiZSBub24tTlVMTCBmb3IgcHJvYmUKICAqIAkgICAgICB0byBiZSBjYWxsZWQpCisgKiBAZHluX2xpc3Q6IGxpc3Qgb2YgZHluYW1pY2FsbHkgYWRkZWQgZGV2aWNlIGlkcworICogQGR5bl9sb2NrOiBsb2NrIHByb3RlY3RpbmcgQGR5bl9saXN0CiAgKiBAcHJvYmU6IG5ldyBkZXZpY2UgaW5zZXJ0ZWQKICAqIEByZW1vdmU6IGRldmljZSByZW1vdmVkIChOVUxMIGlmIG5vdCBhIGhvdC1wbHVnIGNhcGFibGUgZHJpdmVyKQogICogQHJlcG9ydF90YWJsZTogb24gd2hpY2ggcmVwb3J0cyB0byBjYWxsIHJhd19ldmVudCAoTlVMTCBtZWFucyBhbGwpCkBAIC01NjcsNiArNTYwLDkgQEAKIAljaGFyICpuYW1lOwogCWNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkICppZF90YWJsZTsKIAorCXN0cnVjdCBsaXN0X2hlYWQgZHluX2xpc3Q7CisJc3BpbmxvY2tfdCBkeW5fbG9jazsKKwogCWludCAoKnByb2JlKShzdHJ1Y3QgaGlkX2RldmljZSAqZGV2LCBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCAqaWQpOwogCXZvaWQgKCpyZW1vdmUpKHN0cnVjdCBoaWRfZGV2aWNlICpkZXYpOwogCkBAIC03OTcsNiArNzkzLDggQEAKIAogI2lmZGVmIENPTkZJR19ISURfQ09NUEFUCiAjZGVmaW5lIEhJRF9DT01QQVRfTE9BRF9EUklWRVIobmFtZSkJXAorLyogcHJvdG90eXBlIHRvIGF2b2lkIHNwYXJzZSB3YXJuaW5nICovCVwKK2V4dGVybiB2b2lkIGhpZF9jb21wYXRfIyNuYW1lKHZvaWQpOwlcCiB2b2lkIGhpZF9jb21wYXRfIyNuYW1lKHZvaWQpIHsgfQlcCiBFWFBPUlRfU1lNQk9MKGhpZF9jb21wYXRfIyNuYW1lKQogI2Vsc2UKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaGlkcmF3LmggYi9pbmNsdWRlL2xpbnV4L2hpZHJhdy5oCmluZGV4IGRiYjVjOGMuLmRkOGQ2OTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaGlkcmF3LmgKKysrIGIvaW5jbHVkZS9saW51eC9oaWRyYXcuaApAQCAtMzMsNiArMzMsOCBAQAogI2RlZmluZSBISURJT0NHUkRFU0NTSVpFCV9JT1IoJ0gnLCAweDAxLCBpbnQpCiAjZGVmaW5lIEhJRElPQ0dSREVTQwkJX0lPUignSCcsIDB4MDIsIHN0cnVjdCBoaWRyYXdfcmVwb3J0X2Rlc2NyaXB0b3IpCiAjZGVmaW5lIEhJRElPQ0dSQVdJTkZPCQlfSU9SKCdIJywgMHgwMywgc3RydWN0IGhpZHJhd19kZXZpbmZvKQorI2RlZmluZSBISURJT0NHUkFXTkFNRShsZW4pICAgICBfSU9DKF9JT0NfUkVBRCwgJ0gnLCAweDA0LCBsZW4pCisjZGVmaW5lIEhJRElPQ0dSQVdQSFlTKGxlbikgICAgIF9JT0MoX0lPQ19SRUFELCAnSCcsIDB4MDUsIGxlbikKIAogI2RlZmluZSBISURSQVdfRklSU1RfTUlOT1IgMAogI2RlZmluZSBISURSQVdfTUFYX0RFVklDRVMgNjQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaHVnZXRsYi5oIGIvaW5jbHVkZS9saW51eC9odWdldGxiLmgKaW5kZXggZTFjOGFmYy4uZjFkMmZiYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9odWdldGxiLmgKKysrIGIvaW5jbHVkZS9saW51eC9odWdldGxiLmgKQEAgLTIzMyw2ICsyMzMsMTAgQEAKIAlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpUEFHRV9TSVpFIDw8IGgtPm9yZGVyOwogfQogCitleHRlcm4gdW5zaWduZWQgbG9uZyB2bWFfa2VybmVsX3BhZ2VzaXplKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdm1hX21tdV9wYWdlc2l6ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CisKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBodWdlX3BhZ2VfbWFzayhzdHJ1Y3QgaHN0YXRlICpoKQogewogCXJldHVybiBoLT5tYXNrOwpAQCAtMjczLDYgKzI3Nyw4IEBACiAjZGVmaW5lIGhzdGF0ZV9pbm9kZShpKSBOVUxMCiAjZGVmaW5lIGh1Z2VfcGFnZV9zaXplKGgpIFBBR0VfU0laRQogI2RlZmluZSBodWdlX3BhZ2VfbWFzayhoKSBQQUdFX01BU0sKKyNkZWZpbmUgdm1hX2tlcm5lbF9wYWdlc2l6ZSh2KSBQQUdFX1NJWkUKKyNkZWZpbmUgdm1hX21tdV9wYWdlc2l6ZSh2KSBQQUdFX1NJWkUKICNkZWZpbmUgaHVnZV9wYWdlX29yZGVyKGgpIDAKICNkZWZpbmUgaHVnZV9wYWdlX3NoaWZ0KGgpIFBBR0VfU0hJRlQKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHBhZ2VzX3Blcl9odWdlX3BhZ2Uoc3RydWN0IGhzdGF0ZSAqaCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaTJjLmggYi9pbmNsdWRlL2xpbnV4L2kyYy5oCmluZGV4IDMzYTU5OTIuLjIwODczZDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaTJjLmgKKysrIGIvaW5jbHVkZS9saW51eC9pMmMuaApAQCAtMzkzLDExICszOTMsNyBAQAogI2RlZmluZSBJMkNfQ0xBU1NfVFZfQU5BTE9HCSgxPDwxKQkvKiBidHR2ICsgZnJpZW5kcyAqLwogI2RlZmluZSBJMkNfQ0xBU1NfVFZfRElHSVRBTAkoMTw8MikJLyogZHZiIGNhcmRzICovCiAjZGVmaW5lIEkyQ19DTEFTU19EREMJCSgxPDwzKQkvKiBEREMgYnVzIG9uIGdyYXBoaWNzIGFkYXB0ZXJzICovCi0jZGVmaW5lIEkyQ19DTEFTU19DQU1fQU5BTE9HCSgxPDw0KQkvKiBjYW1lcmEgd2l0aCBhbmFsb2cgQ0NEICovCi0jZGVmaW5lIEkyQ19DTEFTU19DQU1fRElHSVRBTAkoMTw8NSkJLyogbW9zdCB3ZWJjYW1zICovCi0jZGVmaW5lIEkyQ19DTEFTU19TT1VORAkJKDE8PDYpCS8qIHNvdW5kIGRldmljZXMgKi8KICNkZWZpbmUgSTJDX0NMQVNTX1NQRAkJKDE8PDcpCS8qIFNQRCBFRVBST01zIGFuZCBzaW1pbGFyICovCi0jZGVmaW5lIEkyQ19DTEFTU19BTEwJCShVSU5UX01BWCkgLyogYWxsIG9mIHRoZSBhYm92ZSAqLwogCiAvKiBpMmNfY2xpZW50X2FkZHJlc3NfZGF0YSBpcyB0aGUgc3RydWN0IGZvciBob2xkaW5nIGRlZmF1bHQgY2xpZW50CiAgKiBhZGRyZXNzZXMgZm9yIGEgZHJpdmVyIGFuZCBmb3IgdGhlIHBhcmFtZXRlcnMgc3VwcGxpZWQgb24gdGhlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2kyYy9kbTM1NWV2bV9tc3AuaCBiL2luY2x1ZGUvbGludXgvaTJjL2RtMzU1ZXZtX21zcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MjQ3MDMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2kyYy9kbTM1NWV2bV9tc3AuaApAQCAtMCwwICsxLDc5IEBACisvKgorICogZG0zNTVldm1fbXNwLmggLSBzdXBwb3J0IE1TUDQzMCBtaWNyb2NvbnRyb2xsZXIgb24gRE0zNTVFVk0gYm9hcmQKKyAqLworI2lmbmRlZiBfX0xJTlVYX0kyQ19ETTM1NUVWTV9NU1AKKyNkZWZpbmUgX19MSU5VWF9JMkNfRE0zNTVFVk1fTVNQCisKKy8qCisgKiBXcml0dGVuIGFnYWluc3QgU3BlY3RydW0ncyB3cml0ZXVwIGZvciB0aGUgQTQgZmlybXdhcmUgcmV2aXNpb24sCisgKiBhbmQgdHdlYWtlZCB0byBtYXRjaCBzb3VyY2UgYW5kIHJldiBEMiBzY2hlbWF0aWNzIGJ5IHJlbW92aW5nIENQTEQKKyAqIGFuZCBOT1IgZmxhc2ggaG9va3MgKHdoaWNoIHdlcmUgbGFzdCBhcHByb3ByaWF0ZSBpbiByZXYgQiBib2FyZHMpLgorICoKKyAqIE5vdGUgdGhhdCB0aGUgZmlybXdhcmUgc3VwcG9ydHMgYSBmbGF2b3Igb2Ygd3JpdGUgcG9zdGluZyAuLi4gdG8gYmUKKyAqIHN1cmUgYSB3cml0ZSBjb21wbGV0ZXMsIGlzc3VlIGFub3RoZXIgcmVhZCBvciB3cml0ZS4KKyAqLworCisvKiB1dGlsaXRpZXMgdG8gYWNjZXNzICJyZWdpc3RlcnMiIGVtdWxhdGVkIGJ5IG1zcDQzMCBmaXJtd2FyZSAqLworZXh0ZXJuIGludCBkbTM1NWV2bV9tc3Bfd3JpdGUodTggdmFsdWUsIHU4IHJlZyk7CitleHRlcm4gaW50IGRtMzU1ZXZtX21zcF9yZWFkKHU4IHJlZyk7CisKKworLyogY29tbWFuZC9jb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBETTM1NUVWTV9NU1BfQ09NTUFORAkJMHgwMAorIwlkZWZpbmUgTVNQX0NPTU1BTkRfTlVMTAkJMAorIwlkZWZpbmUgTVNQX0NPTU1BTkRfUkVTRVRfQ09MRAkxCisjCWRlZmluZSBNU1BfQ09NTUFORF9SRVNFVF9XQVJNCTIKKyMJZGVmaW5lIE1TUF9DT01NQU5EX1JFU0VUX1dBUk1fSQkzCisjCWRlZmluZSBNU1BfQ09NTUFORF9QT1dFUk9GRgk0CisjCWRlZmluZSBNU1BfQ09NTUFORF9JUl9SRUlOSVQJNQorI2RlZmluZSBETTM1NUVWTV9NU1BfU1RBVFVTCQkweDAxCisjCWRlZmluZSBNU1BfU1RBVFVTX0JBRF9PRkZTRVQJQklUKDApCisjCWRlZmluZSBNU1BfU1RBVFVTX0JBRF9DT01NQU5ECUJJVCgxKQorIwlkZWZpbmUgTVNQX1NUQVRVU19QT1dFUl9FUlJPUglCSVQoMikKKyMJZGVmaW5lIE1TUF9TVEFUVVNfUlhCVUZfT1ZFUlJVTglCSVQoMykKKyNkZWZpbmUgRE0zNTVFVk1fTVNQX1JFU0VUCQkweDAyCS8qIDAgYml0cyA9PSBpbiByZXNldCAqLworIwlkZWZpbmUgTVNQX1JFU0VUX0RDNQkJQklUKDApCisjCWRlZmluZSBNU1BfUkVTRVRfVFZQNTE1NAlCSVQoMikKKyMJZGVmaW5lIE1TUF9SRVNFVF9JTUFHRVIJCUJJVCgzKQorIwlkZWZpbmUgTVNQX1JFU0VUX0VUSEVSTkVUCUJJVCg0KQorIwlkZWZpbmUgTVNQX1JFU0VUX1NZUwkJQklUKDUpCisjCWRlZmluZSBNU1BfUkVTRVRfQUlDMzMJCUJJVCg3KQorCisvKiBHUElPIHJlZ2lzdGVycyAuLi4gYml0IHBhdHRlcm5zIG1vc3RseSBtYXRjaCB0aGUgc291cmNlIE1TUCBwb3J0cyAqLworI2RlZmluZSBETTM1NUVWTV9NU1BfTEVECQkweDAzCS8qIGFjdGl2ZSBsb3cgKE1TUCBQNCkgKi8KKyNkZWZpbmUgRE0zNTVFVk1fTVNQX1NXSVRDSDEJCTB4MDQJLyogKE1TUCBQNSwgbWFza2VkKSAqLworIwlkZWZpbmUgTVNQX1NXSVRDSDFfU1c2XzEJQklUKDApCisjCWRlZmluZSBNU1BfU1dJVENIMV9TVzZfMglCSVQoMSkKKyMJZGVmaW5lIE1TUF9TV0lUQ0gxX1NXNl8zCUJJVCgyKQorIwlkZWZpbmUgTVNQX1NXSVRDSDFfU1c2XzQJQklUKDMpCisjCWRlZmluZSBNU1BfU1dJVENIMV9KMQkJQklUKDQpCS8qIE5UU0MvUEFMICovCisjCWRlZmluZSBNU1BfU1dJVENIMV9NU1BfSU5UCUJJVCg1KQkvKiBhY3RpdmUgbG93ICovCisjZGVmaW5lIERNMzU1RVZNX01TUF9TV0lUQ0gyCQkweDA1CS8qIChNU1AgUDYsIG1hc2tlZCkgKi8KKyMJZGVmaW5lIE1TUF9TV0lUQ0gyX1NXMTAJCUJJVCgzKQorIwlkZWZpbmUgTVNQX1NXSVRDSDJfU1cxMQkJQklUKDQpCisjCWRlZmluZSBNU1BfU1dJVENIMl9TVzEyCQlCSVQoNSkKKyMJZGVmaW5lIE1TUF9TV0lUQ0gyX1NXMTMJCUJJVCg2KQorIwlkZWZpbmUgTVNQX1NXSVRDSDJfU1cxNAkJQklUKDcpCisjZGVmaW5lIERNMzU1RVZNX01TUF9TRE1NQwkJMHgwNgkvKiAoTVNQIFAyLCBtYXNrZWQpICovCisjCWRlZmluZSBNU1BfU0RNTUNfMF9XUAkJQklUKDEpCisjCWRlZmluZSBNU1BfU0RNTUNfMF9DRAkJQklUKDIpCS8qIGFjdGl2ZSBsb3cgKi8KKyMJZGVmaW5lIE1TUF9TRE1NQ18xX1dQCQlCSVQoMykKKyMJZGVmaW5lIE1TUF9TRE1NQ18xX0NECQlCSVQoNCkJLyogYWN0aXZlIGxvdyAqLworI2RlZmluZSBETTM1NUVWTV9NU1BfRklSTVJFVgkJMHgwNwkvKiBub3QgYSBHUElPIChvdXQgb2Ygb3JkZXIpICovCisjZGVmaW5lIERNMzU1RVZNX01TUF9WSURFT19JTgkJMHgwOAkvKiAoTVNQIFAzLCBtYXNrZWQpICovCisjCWRlZmluZSBNU1BfVklERU9fSU1BR0VSCQlCSVQoNykJLyogbG93ID09IHR2cDUxNDYgKi8KKworLyogcG93ZXIgc3VwcGx5IHJlZ2lzdGVycyBhcmUgY3VycmVudGx5IG9taXR0ZWQgKi8KKworLyogUlRDIHJlZ2lzdGVycyAqLworI2RlZmluZSBETTM1NUVWTV9NU1BfUlRDXzAJCTB4MTIJLyogTFNCICovCisjZGVmaW5lIERNMzU1RVZNX01TUF9SVENfMQkJMHgxMworI2RlZmluZSBETTM1NUVWTV9NU1BfUlRDXzIJCTB4MTQKKyNkZWZpbmUgRE0zNTVFVk1fTVNQX1JUQ18zCQkweDE1CS8qIE1TQiAqLworCisvKiBpbnB1dCBldmVudCBxdWV1ZSByZWdpc3RlcnM7IGNvZGUgPT0gKChISUdIIDw8IDgpIHwgTE9XKSAqLworI2RlZmluZSBETTM1NUVWTV9NU1BfSU5QVVRfQ09VTlQJMHgxNgkvKiBkZWNyZW1lbnQgYnkgcmVhZGluZyBMT1cgKi8KKyNkZWZpbmUgRE0zNTVFVk1fTVNQX0lOUFVUX0hJR0gJCTB4MTcKKyNkZWZpbmUgRE0zNTVFVk1fTVNQX0lOUFVUX0xPVwkJMHgxOAorCisjZW5kaWYgLyogX19MSU5VWF9JMkNfRE0zNTVFVk1fTVNQICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2kyYy90c2MyMDA3LmggYi9pbmNsdWRlL2xpbnV4L2kyYy90c2MyMDA3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYzNjFmYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvaTJjL3RzYzIwMDcuaApAQCAtMCwwICsxLDE3IEBACisjaWZuZGVmIF9fTElOVVhfSTJDX1RTQzIwMDdfSAorI2RlZmluZSBfX0xJTlVYX0kyQ19UU0MyMDA3X0gKKworLyogbGludXgvaTJjL3RzYzIwMDcuaCAqLworCitzdHJ1Y3QgdHNjMjAwN19wbGF0Zm9ybV9kYXRhIHsKKwl1MTYJbW9kZWw7CQkJCS8qIDIwMDcuICovCisJdTE2CXhfcGxhdGVfb2htczsKKworCWludAkoKmdldF9wZW5kb3duX3N0YXRlKSh2b2lkKTsKKwl2b2lkCSgqY2xlYXJfcGVuaXJxKSh2b2lkKTsJCS8qIElmIG5lZWRlZCwgY2xlYXIgMm5kIGxldmVsCisJCQkJCQkgICBpbnRlcnJ1cHQgc291cmNlICovCisJaW50CSgqaW5pdF9wbGF0Zm9ybV9odykodm9pZCk7CisJdm9pZAkoKmV4aXRfcGxhdGZvcm1faHcpKHZvaWQpOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2kyYy90d2w0MDMwLmggYi9pbmNsdWRlL2xpbnV4L2kyYy90d2w0MDMwLmgKaW5kZXggZmI2MDRkYy4uODEzN2Y2NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pMmMvdHdsNDAzMC5oCisrKyBiL2luY2x1ZGUvbGludXgvaTJjL3R3bDQwMzAuaApAQCAtNzgsOCArNzgsOCBAQAogICogSU1QT1JUQU5UOiAgRm9yIHR3bDQwMzBfaTJjX3dyaXRlKCksIGFsbG9jYXRlIG51bV9ieXRlcyArIDEKICAqIGZvciB0aGUgdmFsdWUsIGFuZCBwb3B1bGF0ZSB5b3VyIGRhdGEgc3RhcnRpbmcgYXQgb2Zmc2V0IDEuCiAgKi8KLWludCB0d2w0MDMwX2kyY193cml0ZSh1OCBtb2Rfbm8sIHU4ICp2YWx1ZSwgdTggcmVnLCB1OCBudW1fYnl0ZXMpOwotaW50IHR3bDQwMzBfaTJjX3JlYWQodTggbW9kX25vLCB1OCAqdmFsdWUsIHU4IHJlZywgdTggbnVtX2J5dGVzKTsKK2ludCB0d2w0MDMwX2kyY193cml0ZSh1OCBtb2Rfbm8sIHU4ICp2YWx1ZSwgdTggcmVnLCB1bnNpZ25lZCBudW1fYnl0ZXMpOworaW50IHR3bDQwMzBfaTJjX3JlYWQodTggbW9kX25vLCB1OCAqdmFsdWUsIHU4IHJlZywgdW5zaWduZWQgbnVtX2J5dGVzKTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApAQCAtMjM0LDYgKzIzNCw5IEBACiAJLyogZ3Bpby1uIHNob3VsZCBjb250cm9sIFZNTUMobisxKSBpZiBCSVQobikgaW4gbW1jX2NkIGlzIHNldCAqLwogCXU4CQltbWNfY2Q7CiAKKwkvKiBpZiBCSVQoTikgaXMgc2V0LCBvciBWTU1DKG4rMSkgaXMgbGlua2VkLCBkZWJvdW5jZSBHUElPLU4gKi8KKwl1MzIJCWRlYm91bmNlOworCiAJLyogRm9yIGdwaW8tTiwgYml0ICgxIDw8IE4pIGluICJwdWxsdXBzIiBpcyBzZXQgaWYgdGhhdCBwdWxsdXAKIAkgKiBzaG91bGQgYmUgZW5hYmxlZC4gIEVsc2UsIGlmIHRoYXQgYml0IGlzIHNldCBpbiAicHVsbGRvd25zIiwKIAkgKiB0aGF0IHB1bGxkb3duIGlzIGVuYWJsZWQuICBEb24ndCB3YXN0ZSBwb3dlciBieSBsZXR0aW5nIGFueQpAQCAtMjc4LDYgKzI4MSwxOCBAQAogCXN0cnVjdCB0d2w0MDMwX2tleXBhZF9kYXRhCQkqa2V5cGFkOwogCXN0cnVjdCB0d2w0MDMwX3VzYl9kYXRhCQkJKnVzYjsKIAorCS8qIExETyByZWd1bGF0b3JzICovCisJc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEJCSp2ZGFjOworCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhCQkqdnBsbDE7CisJc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEJCSp2cGxsMjsKKwlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YQkJKnZtbWMxOworCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhCQkqdm1tYzI7CisJc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEJCSp2c2ltOworCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhCQkqdmF1eDE7CisJc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEJCSp2YXV4MjsKKwlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YQkJKnZhdXgzOworCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhCQkqdmF1eDQ7CisKIAkvKiBSRVZJU0lUIG1vcmUgdG8gY29tZSAuLi4gX25vdGhpbmdfIHNob3VsZCBiZSBoYXJkLXdpcmVkICovCiB9OwogCkBAIC0yODUsMzMgKzMwMCw2IEBACiAKIGludCB0d2w0MDMwX3NpaF9zZXR1cChpbnQgbW9kdWxlKTsKIAotLyoKLSAqIEZJWE1FIGNvbXBsZXRlbHkgc3RvcCB1c2luZyBUV0w0MDMwX0lSUV9CQVNFIC4uLiBpbnN0ZWFkLCBwYXNzIHRoZQotICogSVJRIGRhdGEgdG8gc3Vic2lkaWFyeSBkZXZpY2VzIHVzaW5nIHBsYXRmb3JtIGRldmljZSByZXNvdXJjZXMuCi0gKi8KLQotLyogSVJRIGluZm9ybWF0aW9uLW5lZWQgYmFzZSAqLwotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgotLyogVFdMNDAzMCBpbnRlcnJ1cHRzICovCi0KLS8qICNkZWZpbmUgVFdMNDAzMF9NT0RJUlFfR1BJTwkJKFRXTDQwMzBfSVJRX0JBU0UgKyAwKSAqLwotI2RlZmluZSBUV0w0MDMwX01PRElSUV9LRVlQQUQJCShUV0w0MDMwX0lSUV9CQVNFICsgMSkKLSNkZWZpbmUgVFdMNDAzMF9NT0RJUlFfQkNJCQkoVFdMNDAzMF9JUlFfQkFTRSArIDIpCi0jZGVmaW5lIFRXTDQwMzBfTU9ESVJRX01BREMJCShUV0w0MDMwX0lSUV9CQVNFICsgMykKLS8qICNkZWZpbmUgVFdMNDAzMF9NT0RJUlFfVVNCCQkoVFdMNDAzMF9JUlFfQkFTRSArIDQpICovCi0vKiAjZGVmaW5lIFRXTDQwMzBfTU9ESVJRX1BXUgkJKFRXTDQwMzBfSVJRX0JBU0UgKyA1KSAqLwotCi0jZGVmaW5lIFRXTDQwMzBfUFdSSVJRX1BXUkJUTgkJKFRXTDQwMzBfUFdSX0lSUV9CQVNFICsgMCkKLS8qICNkZWZpbmUgVFdMNDAzMF9QV1JJUlFfQ0hHX1BSRVMJCShUV0w0MDMwX1BXUl9JUlFfQkFTRSArIDEpICovCi0vKiAjZGVmaW5lIFRXTDQwMzBfUFdSSVJRX1VTQl9QUkVTCQkoVFdMNDAzMF9QV1JfSVJRX0JBU0UgKyAyKSAqLwotLyogI2RlZmluZSBUV0w0MDMwX1BXUklSUV9SVEMJCShUV0w0MDMwX1BXUl9JUlFfQkFTRSArIDMpICovCi0vKiAjZGVmaW5lIFRXTDQwMzBfUFdSSVJRX0hPVF9ESUUJCShUV0w0MDMwX1BXUl9JUlFfQkFTRSArIDQpICovCi0vKiAjZGVmaW5lIFRXTDQwMzBfUFdSSVJRX1BXUk9LX1RJTUVPVVQJKFRXTDQwMzBfUFdSX0lSUV9CQVNFICsgNSkgKi8KLS8qICNkZWZpbmUgVFdMNDAzMF9QV1JJUlFfTUJDSEcJCShUV0w0MDMwX1BXUl9JUlFfQkFTRSArIDYpICovCi0vKiAjZGVmaW5lIFRXTDQwMzBfUFdSSVJRX1NDX0RFVEVDVAkoVFdMNDAzMF9QV1JfSVJRX0JBU0UgKyA3KSAqLwotCi0vKiBSZXN0IGFyZSB1bnN1ZWQgY3VycmVudGx5Ki8KLQogLyogT2Zmc2V0cyB0byBQb3dlciBSZWdpc3RlcnMgKi8KICNkZWZpbmUgVFdMNDAzMF9WREFDX0RFVl9HUlAJCTB4M0IKICNkZWZpbmUgVFdMNDAzMF9WREFDX0RFRElDQVRFRAkJMHgzRQpAQCAtMzIyLDE2ICszMTAsNiBAQAogI2RlZmluZSBUV0w0MDMwX1ZBVVgzX0RFVl9HUlAJCTB4MUYKICNkZWZpbmUgVFdMNDAzMF9WQVVYM19ERURJQ0FURUQJCTB4MjIKIAotLyogVFdMNDAzMCBHUElPIGludGVycnVwdCBkZWZpbml0aW9ucyAqLwotCi0jZGVmaW5lIFRXTDQwMzBfR1BJT19JUlFfTk8obikJCShUV0w0MDMwX0dQSU9fSVJRX0JBU0UgKyAobikpCi0KLS8qCi0gKiBFeHBvcnRlZCBUV0w0MDMwIEdQSU8gQVBJcwotICoKLSAqIFdBUk5JTkcgLS0gdXNlIHN0YW5kYXJkIEdQSU8gYW5kIElSUSBjYWxscyBpbnN0ZWFkOyB0aGVzZSB3aWxsIHZhbmlzaC4KLSAqLwotaW50IHR3bDQwMzBfc2V0X2dwaW9fZGVib3VuY2UoaW50IGdwaW8sIGludCBlbmFibGUpOwogCiAjaWYgZGVmaW5lZChDT05GSUdfVFdMNDAzMF9CQ0lfQkFUVEVSWSkgfHwgXAogCWRlZmluZWQoQ09ORklHX1RXTDQwMzBfQkNJX0JBVFRFUllfTU9EVUxFKQpAQCAtMzQwLDQgKzMxOCwzOCBAQAogCXN0YXRpYyBpbmxpbmUgaW50IHR3bDQwMzBjaGFyZ2VyX3VzYl9lbihpbnQgZW5hYmxlKSB7IHJldHVybiAwOyB9CiAjZW5kaWYKIAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogTGludXgtc3BlY2lmaWMgcmVndWxhdG9yIGlkZW50aWZpZXJzIC4uLiBmb3Igbm93LCB3ZSBvbmx5IHN1cHBvcnQKKyAqIHRoZSBMRE9zLCBhbmQgbGVhdmUgdGhlIHRocmVlIGJ1Y2sgY29udmVydGVycyBhbG9uZS4gIFZERDEgYW5kIFZERDIKKyAqIG5lZWQgdG8gdGllIGludG8gaGFyZHdhcmUgYmFzZWQgdm9sdGFnZSBzY2FsaW5nIChjcHVmcmVxIGV0YyksIHdoaWxlCisgKiBWSU8gaXMgZ2VuZXJhbGx5IGZpeGVkLgorICovCisKKy8qIEVYVEVSTkFMIGRjLXRvLWRjIGJ1Y2sgY29udmVydGVycyAqLworI2RlZmluZSBUV0w0MDMwX1JFR19WREQxCTAKKyNkZWZpbmUgVFdMNDAzMF9SRUdfVkREMgkxCisjZGVmaW5lIFRXTDQwMzBfUkVHX1ZJTwkJMgorCisvKiBFWFRFUk5BTCBMRE9zICovCisjZGVmaW5lIFRXTDQwMzBfUkVHX1ZEQUMJMworI2RlZmluZSBUV0w0MDMwX1JFR19WUExMMQk0CisjZGVmaW5lIFRXTDQwMzBfUkVHX1ZQTEwyCTUJLyogbm90IG9uIGFsbCBjaGlwcyAqLworI2RlZmluZSBUV0w0MDMwX1JFR19WTU1DMQk2CisjZGVmaW5lIFRXTDQwMzBfUkVHX1ZNTUMyCTcJLyogbm90IG9uIGFsbCBjaGlwcyAqLworI2RlZmluZSBUV0w0MDMwX1JFR19WU0lNCTgJLyogbm90IG9uIGFsbCBjaGlwcyAqLworI2RlZmluZSBUV0w0MDMwX1JFR19WQVVYMQk5CS8qIG5vdCBvbiBhbGwgY2hpcHMgKi8KKyNkZWZpbmUgVFdMNDAzMF9SRUdfVkFVWDJfNDAzMAkxMAkvKiAodHdsNDAzMC1zcGVjaWZpYykgKi8KKyNkZWZpbmUgVFdMNDAzMF9SRUdfVkFVWDIJMTEJLyogKHR3bDUwMzAgYW5kIG5ld2VyKSAqLworI2RlZmluZSBUV0w0MDMwX1JFR19WQVVYMwkxMgkvKiBub3Qgb24gYWxsIGNoaXBzICovCisjZGVmaW5lIFRXTDQwMzBfUkVHX1ZBVVg0CTEzCS8qIG5vdCBvbiBhbGwgY2hpcHMgKi8KKworLyogSU5URVJOQUwgTERPcyAqLworI2RlZmluZSBUV0w0MDMwX1JFR19WSU5UQU5BMQkxNAorI2RlZmluZSBUV0w0MDMwX1JFR19WSU5UQU5BMgkxNQorI2RlZmluZSBUV0w0MDMwX1JFR19WSU5URElHCTE2CisjZGVmaW5lIFRXTDQwMzBfUkVHX1ZVU0IxVjUJMTcKKyNkZWZpbmUgVFdMNDAzMF9SRUdfVlVTQjFWOAkxOAorI2RlZmluZSBUV0w0MDMwX1JFR19WVVNCM1YxCTE5CisKICNlbmRpZiAvKiBFbmQgb2YgX19UV0w0MDMwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWRlLmggYi9pbmNsdWRlL2xpbnV4L2lkZS5oCmluZGV4IGRiNWVmOGEuLjM2NDRmNjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWRlLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZGUuaApAQCAtMzIsMTggKzMyLDE0IEBACiAjIGRlZmluZSBTVVBQT1JUX1ZMQl9TWU5DIDEKICNlbmRpZgogCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIJYnl0ZTsJLyogdXNlZCBldmVyeXdoZXJlICovCi0KIC8qCiAgKiBQcm9iYWJseSBub3Qgd2lzZSB0byBmaWRkbGUgd2l0aCB0aGVzZQogICovCisjZGVmaW5lIElERV9ERUZBVUxUX01BWF9GQUlMVVJFUwkxCiAjZGVmaW5lIEVSUk9SX01BWAk4CS8qIE1heCByZWFkL3dyaXRlIGVycm9ycyBwZXIgc2VjdG9yICovCiAjZGVmaW5lIEVSUk9SX1JFU0VUCTMJLyogUmVzZXQgY29udHJvbGxlciBldmVyeSA0dGggcmV0cnkgKi8KICNkZWZpbmUgRVJST1JfUkVDQUwJMQkvKiBSZWNhbGlicmF0ZSBldmVyeSAybmQgcmV0cnkgKi8KIAotI2RlZmluZSBIV0lGKGRyaXZlKQkJKChpZGVfaHdpZl90ICopKChkcml2ZSktPmh3aWYpKQotI2RlZmluZSBIV0dST1VQKGRyaXZlKQkJKChpZGVfaHdncm91cF90ICopKEhXSUYoZHJpdmUpLT5od2dyb3VwKSkKLQogLyoKICAqIERlZmluaXRpb25zIGZvciBhY2Nlc3NpbmcgSURFIGNvbnRyb2xsZXIgcmVnaXN0ZXJzCiAgKi8KQEAgLTE4NSw5ICsxODEsNiBAQAogCXVuc2lnbmVkIGxvbmcJY29uZmlnOwogfSBod19yZWdzX3Q7CiAKLXZvaWQgaWRlX2luaXRfcG9ydF9kYXRhKHN0cnVjdCBod2lmX3MgKiwgdW5zaWduZWQgaW50KTsKLXZvaWQgaWRlX2luaXRfcG9ydF9odyhzdHJ1Y3QgaHdpZl9zICosIGh3X3JlZ3NfdCAqKTsKLQogc3RhdGljIGlubGluZSB2b2lkIGlkZV9zdGRfaW5pdF9wb3J0cyhod19yZWdzX3QgKmh3LAogCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgaW9fYWRkciwKIAkJCQkgICAgICB1bnNpZ25lZCBsb25nIGN0bF9hZGRyKQpAQCAtNDMzLDE4ICs0MjYsMTQgQEAKIAlzdHJ1Y3QgaWRldGFwZV9iaCAqYmg7CiAJY2hhciAqYl9kYXRhOwogCi0JLyogaWRlc2NzaSBvbmx5IGZvciBub3cgKi8KIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwogCXVuc2lnbmVkIGludCBzZ19jbnQ7CiAKLQlzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpX2NtZDsKLQl2b2lkICgqZG9uZSkgKHN0cnVjdCBzY3NpX2NtbmQgKik7Ci0KIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CiB9OwogCiBzdHJ1Y3QgaWRlX2RldnNldDsKLXN0cnVjdCBpZGVfZHJpdmVyX3M7CitzdHJ1Y3QgaWRlX2RyaXZlcjsKIAogI2lmZGVmIENPTkZJR19CTEtfREVWX0lERUFDUEkKIHN0cnVjdCBpZGVfYWNwaV9kcml2ZV9saW5rOwpAQCAtNTg4LDcgKzU3Nyw2IEBACiAJc3RydWN0IHJlcXVlc3RfcXVldWUJKnF1ZXVlOwkvKiByZXF1ZXN0IHF1ZXVlICovCiAKIAlzdHJ1Y3QgcmVxdWVzdAkJKnJxOwkvKiBjdXJyZW50IHJlcXVlc3QgKi8KLQlzdHJ1Y3QgaWRlX2RyaXZlX3MgCSpuZXh0OwkvKiBjaXJjdWxhciBsaXN0IG9mIGh3Z3JvdXAgZHJpdmVzICovCiAJdm9pZAkJKmRyaXZlcl9kYXRhOwkvKiBleHRyYSBkcml2ZXIgZGF0YSAqLwogCXUxNgkJCSppZDsJLyogaWRlbnRpZmljYXRpb24gaW5mbyAqLwogI2lmZGVmIENPTkZJR19JREVfUFJPQ19GUwpAQCAtNjYyLDYgKzY1MCw4IEBACiAJaW50ICAoKnBjX2lvX2J1ZmZlcnMpKHN0cnVjdCBpZGVfZHJpdmVfcyAqLCBzdHJ1Y3QgaWRlX2F0YXBpX3BjICosCiAJCQkgICAgICB1bnNpZ25lZCBpbnQsIGludCk7CiAKKwlpZGVfc3RhcnRzdG9wX3QgKCppcnFfaGFuZGxlcikoc3RydWN0IGlkZV9kcml2ZV9zICopOworCiAJdW5zaWduZWQgbG9uZyBhdGFwaV9mbGFnczsKIAogCXN0cnVjdCBpZGVfYXRhcGlfcGMgcmVxdWVzdF9zZW5zZV9wYzsKQEAgLTY4NCw3ICs2NzQsNiBAQAogCXZvaWQJKCpleGVjX2NvbW1hbmQpKHN0cnVjdCBod2lmX3MgKiwgdTgpOwogCXU4CSgqcmVhZF9zdGF0dXMpKHN0cnVjdCBod2lmX3MgKik7CiAJdTgJKCpyZWFkX2FsdHN0YXR1cykoc3RydWN0IGh3aWZfcyAqKTsKLQl1OAkoKnJlYWRfc2ZmX2RtYV9zdGF0dXMpKHN0cnVjdCBod2lmX3MgKik7CiAKIAl2b2lkCSgqc2V0X2lycSkoc3RydWN0IGh3aWZfcyAqLCBpbnQpOwogCkBAIC03NDUsMTQgKzczNCwxNyBAQAogCWludAkoKmRtYV90ZXN0X2lycSkoc3RydWN0IGlkZV9kcml2ZV9zICopOwogCXZvaWQJKCpkbWFfbG9zdF9pcnEpKHN0cnVjdCBpZGVfZHJpdmVfcyAqKTsKIAl2b2lkCSgqZG1hX3RpbWVvdXQpKHN0cnVjdCBpZGVfZHJpdmVfcyAqKTsKKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgbWV0aG9kIGlzIG9wdGlvbmFsIGFuZCBvbmx5IHJlcXVpcmVkIHRvIGJlCisJICogaW1wbGVtZW50ZWQgZm9yIHRoZSBTRkYtODAzOGkgY29tcGF0aWJsZSBjb250cm9sbGVycy4KKwkgKi8KKwl1OAkoKmRtYV9zZmZfcmVhZF9zdGF0dXMpKHN0cnVjdCBod2lmX3MgKik7CiB9OwogCiBzdHJ1Y3QgaWRlX2hvc3Q7CiAKIHR5cGVkZWYgc3RydWN0IGh3aWZfcyB7Ci0Jc3RydWN0IGh3aWZfcyAqbmV4dDsJCS8qIGZvciBsaW5rZWQtbGlzdCBpbiBpZGVfaHdncm91cF90ICovCiAJc3RydWN0IGh3aWZfcyAqbWF0ZTsJCS8qIG90aGVyIGh3aWYgZnJvbSBzYW1lIFBDSSBjaGlwICovCi0Jc3RydWN0IGh3Z3JvdXBfcyAqaHdncm91cDsJLyogYWN0dWFsbHkgKGlkZV9od2dyb3VwX3QgKikgKi8KIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2M7CS8qIC9wcm9jL2lkZS8gZGlyZWN0b3J5IGVudHJ5ICovCiAKIAlzdHJ1Y3QgaWRlX2hvc3QgKmhvc3Q7CkBAIC03NjMsNyArNzU1LDcgQEAKIAogCXVuc2lnbmVkIGxvbmcJc2F0YV9zY3JbU0FUQV9OUl9QT1JUU107CiAKLQlpZGVfZHJpdmVfdAlkcml2ZXNbTUFYX0RSSVZFU107CS8qIGRyaXZlIGluZm8gKi8KKwlpZGVfZHJpdmVfdAkqZGV2aWNlc1tNQVhfRFJJVkVTICsgMV07CiAKIAl1OCBtYWpvcjsJLyogb3VyIG1ham9yIG51bWJlciAqLwogCXU4IGluZGV4OwkvKiAwIGZvciBpZGUwOyAxIGZvciBpZGUxOyAuLi4gKi8KQEAgLTgyOSw3ICs4MjEsNyBAQAogCXVuc2lnbmVkCWV4dHJhX3BvcnRzOwkvKiBudW1iZXIgb2YgZXh0cmEgZG1hIHBvcnRzICovCiAKIAl1bnNpZ25lZAlwcmVzZW50ICAgIDogMTsJLyogdGhpcyBpbnRlcmZhY2UgZXhpc3RzICovCi0JdW5zaWduZWQJc2dfbWFwcGVkICA6IDE7CS8qIHNnX3RhYmxlIGFuZCBzZ19uZW50cyBhcmUgcmVhZHkgKi8KKwl1bnNpZ25lZAlidXN5CSAgIDogMTsgLyogc2VyaWFsaXplcyBkZXZpY2VzIG9uIGEgcG9ydCAqLwogCiAJc3RydWN0IGRldmljZQkJZ2VuZGV2OwogCXN0cnVjdCBkZXZpY2UJCSpwb3J0ZGV2OwpAQCAtODQxLDE5ICs4MzMsNDkgQEAKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JREVBQ1BJCiAJc3RydWN0IGlkZV9hY3BpX2h3aWZfbGluayAqYWNwaWRhdGE7CiAjZW5kaWYKKworCS8qIElSUSBoYW5kbGVyLCBpZiBhY3RpdmUgKi8KKwlpZGVfc3RhcnRzdG9wX3QJKCpoYW5kbGVyKShpZGVfZHJpdmVfdCAqKTsKKworCS8qIEJPT0w6IHBvbGxpbmcgYWN0aXZlICYgcG9sbF90aW1lb3V0IGZpZWxkIHZhbGlkICovCisJdW5zaWduZWQgaW50IHBvbGxpbmcgOiAxOworCisJLyogY3VycmVudCBkcml2ZSAqLworCWlkZV9kcml2ZV90ICpjdXJfZGV2OworCisJLyogY3VycmVudCByZXF1ZXN0ICovCisJc3RydWN0IHJlcXVlc3QgKnJxOworCisJLyogZmFpbHNhZmUgdGltZXIgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwkvKiB0aW1lb3V0IHZhbHVlIGR1cmluZyBsb25nIHBvbGxzICovCisJdW5zaWduZWQgbG9uZyBwb2xsX3RpbWVvdXQ7CisJLyogcXVlcmllZCB1cG9uIHRpbWVvdXRzICovCisJaW50ICgqZXhwaXJ5KShpZGVfZHJpdmVfdCAqKTsKKworCWludCByZXFfZ2VuOworCWludCByZXFfZ2VuX3RpbWVyOworCisJc3BpbmxvY2tfdCBsb2NrOwogfSBfX19fY2FjaGVsaW5lX2ludGVybm9kZWFsaWduZWRfaW5fc21wIGlkZV9od2lmX3Q7CiAKICNkZWZpbmUgTUFYX0hPU1RfUE9SVFMgNAogCiBzdHJ1Y3QgaWRlX2hvc3QgewotCWlkZV9od2lmX3QJKnBvcnRzW01BWF9IT1NUX1BPUlRTXTsKKwlpZGVfaHdpZl90CSpwb3J0c1tNQVhfSE9TVF9QT1JUUyArIDFdOwogCXVuc2lnbmVkIGludAluX3BvcnRzOwogCXN0cnVjdCBkZXZpY2UJKmRldlsyXTsKIAl1bnNpZ25lZCBpbnQJKCppbml0X2NoaXBzZXQpKHN0cnVjdCBwY2lfZGV2ICopOwogCXVuc2lnbmVkIGxvbmcJaG9zdF9mbGFnczsKIAl2b2lkCQkqaG9zdF9wcml2OworCWlkZV9od2lmX3QJKmN1cl9wb3J0OwkvKiBmb3IgaG9zdHMgcmVxdWlyaW5nIHNlcmlhbGl6YXRpb24gKi8KKworCS8qIHVzZWQgZm9yIGhvc3RzIHJlcXVpcmluZyBzZXJpYWxpemF0aW9uICovCisJdm9sYXRpbGUgbG9uZwlob3N0X2J1c3k7CiB9OwogCisjZGVmaW5lIElERV9IT1NUX0JVU1kgMAorCiAvKgogICogIGludGVybmFsIGlkZSBpbnRlcnJ1cHQgaGFuZGxlciB0eXBlCiAgKi8KQEAgLTg2MywzOCArODg1LDYgQEAKIC8qIHVzZWQgYnkgaWRlLWNkLCBpZGUtZmxvcHB5LCBldGMuICovCiB0eXBlZGVmIHZvaWQgKHhmZXJfZnVuY190KShpZGVfZHJpdmVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsIHZvaWQgKiwgdW5zaWduZWQpOwogCi10eXBlZGVmIHN0cnVjdCBod2dyb3VwX3MgewotCQkvKiBpcnEgaGFuZGxlciwgaWYgYWN0aXZlICovCi0JaWRlX3N0YXJ0c3RvcF90CSgqaGFuZGxlcikoaWRlX2RyaXZlX3QgKik7Ci0KLQkJLyogQk9PTDogcHJvdGVjdHMgYWxsIGZpZWxkcyBiZWxvdyAqLwotCXZvbGF0aWxlIGludCBidXN5OwotCQkvKiBCT09MOiBwb2xsaW5nIGFjdGl2ZSAmIHBvbGxfdGltZW91dCBmaWVsZCB2YWxpZCAqLwotCXVuc2lnbmVkIGludCBwb2xsaW5nCTogMTsKLQotCQkvKiBjdXJyZW50IGRyaXZlICovCi0JaWRlX2RyaXZlX3QgKmRyaXZlOwotCQkvKiBwdHIgdG8gY3VycmVudCBod2lmIGluIGxpbmtlZC1saXN0ICovCi0JaWRlX2h3aWZfdCAqaHdpZjsKLQotCQkvKiBjdXJyZW50IHJlcXVlc3QgKi8KLQlzdHJ1Y3QgcmVxdWVzdCAqcnE7Ci0KLQkJLyogZmFpbHNhZmUgdGltZXIgKi8KLQlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKLQkJLyogdGltZW91dCB2YWx1ZSBkdXJpbmcgbG9uZyBwb2xscyAqLwotCXVuc2lnbmVkIGxvbmcgcG9sbF90aW1lb3V0OwotCQkvKiBxdWVyaWVkIHVwb24gdGltZW91dHMgKi8KLQlpbnQgKCpleHBpcnkpKGlkZV9kcml2ZV90ICopOwotCi0JaW50IHJlcV9nZW47Ci0JaW50IHJlcV9nZW5fdGltZXI7Ci0KLQlzcGlubG9ja190IGxvY2s7Ci19IGlkZV9od2dyb3VwX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IGlkZV9kcml2ZXJfcyBpZGVfZHJpdmVyX3Q7Ci0KIGV4dGVybiBzdHJ1Y3QgbXV0ZXggaWRlX3NldHRpbmdfbXR4OwogCiAvKgpAQCAtMTAyMCw4ICsxMDEwLDggQEAKIHZvaWQgaWRlX3Byb2NfcG9ydF9yZWdpc3Rlcl9kZXZpY2VzKGlkZV9od2lmX3QgKik7CiB2b2lkIGlkZV9wcm9jX3VucmVnaXN0ZXJfZGV2aWNlKGlkZV9kcml2ZV90ICopOwogdm9pZCBpZGVfcHJvY191bnJlZ2lzdGVyX3BvcnQoaWRlX2h3aWZfdCAqKTsKLXZvaWQgaWRlX3Byb2NfcmVnaXN0ZXJfZHJpdmVyKGlkZV9kcml2ZV90ICosIGlkZV9kcml2ZXJfdCAqKTsKLXZvaWQgaWRlX3Byb2NfdW5yZWdpc3Rlcl9kcml2ZXIoaWRlX2RyaXZlX3QgKiwgaWRlX2RyaXZlcl90ICopOwordm9pZCBpZGVfcHJvY19yZWdpc3Rlcl9kcml2ZXIoaWRlX2RyaXZlX3QgKiwgc3RydWN0IGlkZV9kcml2ZXIgKik7Cit2b2lkIGlkZV9wcm9jX3VucmVnaXN0ZXJfZHJpdmVyKGlkZV9kcml2ZV90ICosIHN0cnVjdCBpZGVfZHJpdmVyICopOwogCiByZWFkX3Byb2NfdCBwcm9jX2lkZV9yZWFkX2NhcGFjaXR5OwogcmVhZF9wcm9jX3QgcHJvY19pZGVfcmVhZF9nZW9tZXRyeTsKQEAgLTEwNDgsOCArMTAzOCwxMCBAQAogc3RhdGljIGlubGluZSB2b2lkIGlkZV9wcm9jX3BvcnRfcmVnaXN0ZXJfZGV2aWNlcyhpZGVfaHdpZl90ICpod2lmKSB7IDsgfQogc3RhdGljIGlubGluZSB2b2lkIGlkZV9wcm9jX3VucmVnaXN0ZXJfZGV2aWNlKGlkZV9kcml2ZV90ICpkcml2ZSkgeyA7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBpZGVfcHJvY191bnJlZ2lzdGVyX3BvcnQoaWRlX2h3aWZfdCAqaHdpZikgeyA7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpZGVfcHJvY19yZWdpc3Rlcl9kcml2ZXIoaWRlX2RyaXZlX3QgKmRyaXZlLCBpZGVfZHJpdmVyX3QgKmRyaXZlcikgeyA7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpZGVfcHJvY191bnJlZ2lzdGVyX2RyaXZlcihpZGVfZHJpdmVfdCAqZHJpdmUsIGlkZV9kcml2ZXJfdCAqZHJpdmVyKSB7IDsgfQorc3RhdGljIGlubGluZSB2b2lkIGlkZV9wcm9jX3JlZ2lzdGVyX2RyaXZlcihpZGVfZHJpdmVfdCAqZHJpdmUsCisJCQkJCSAgICBzdHJ1Y3QgaWRlX2RyaXZlciAqZHJpdmVyKSB7IDsgfQorc3RhdGljIGlubGluZSB2b2lkIGlkZV9wcm9jX3VucmVnaXN0ZXJfZHJpdmVyKGlkZV9kcml2ZV90ICpkcml2ZSwKKwkJCQkJICAgICAgc3RydWN0IGlkZV9kcml2ZXIgKmRyaXZlcikgeyA7IH0KICNkZWZpbmUgUFJPQ19JREVfUkVBRF9SRVRVUk4ocGFnZSxzdGFydCxvZmYsY291bnQsZW9mLGxlbikgcmV0dXJuIDA7CiAjZW5kaWYKIApAQCAtMTExOCwxMSArMTExMCwxMCBAQAogICogVGhlIGdlbmRyaXZlci5vd25lciBmaWVsZCBzaG91bGQgYmUgc2V0IHRvIHRoZSBtb2R1bGUgb3duZXIgb2YgdGhpcyBkcml2ZXIuCiAgKiBUaGUgZ2VuZHJpdmVyLm5hbWUgZmllbGQgc2hvdWxkIGJlIHNldCB0byB0aGUgbmFtZSBvZiB0aGlzIGRyaXZlcgogICovCi1zdHJ1Y3QgaWRlX2RyaXZlcl9zIHsKK3N0cnVjdCBpZGVfZHJpdmVyIHsKIAljb25zdCBjaGFyCQkJKnZlcnNpb247CiAJaWRlX3N0YXJ0c3RvcF90CSgqZG9fcmVxdWVzdCkoaWRlX2RyaXZlX3QgKiwgc3RydWN0IHJlcXVlc3QgKiwgc2VjdG9yX3QpOwogCWludAkJKCplbmRfcmVxdWVzdCkoaWRlX2RyaXZlX3QgKiwgaW50LCBpbnQpOwotCWlkZV9zdGFydHN0b3BfdAkoKmVycm9yKShpZGVfZHJpdmVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsIHU4LCB1OCk7CiAJc3RydWN0IGRldmljZV9kcml2ZXIJZ2VuX2RyaXZlcjsKIAlpbnQJCSgqcHJvYmUpKGlkZV9kcml2ZV90ICopOwogCXZvaWQJCSgqcmVtb3ZlKShpZGVfZHJpdmVfdCAqKTsKQEAgLTExMzQsNyArMTEyNSw3IEBACiAjZW5kaWYKIH07CiAKLSNkZWZpbmUgdG9faWRlX2RyaXZlcihkcnYpIGNvbnRhaW5lcl9vZihkcnYsIGlkZV9kcml2ZXJfdCwgZ2VuX2RyaXZlcikKKyNkZWZpbmUgdG9faWRlX2RyaXZlcihkcnYpIGNvbnRhaW5lcl9vZihkcnYsIHN0cnVjdCBpZGVfZHJpdmVyLCBnZW5fZHJpdmVyKQogCiBpbnQgaWRlX2RldmljZV9nZXQoaWRlX2RyaXZlX3QgKik7CiB2b2lkIGlkZV9kZXZpY2VfcHV0KGlkZV9kcml2ZV90ICopOwpAQCAtMTE2Niw5ICsxMTU3LDcgQEAKIAogdm9pZCBpZGVfcGFkX3RyYW5zZmVyKGlkZV9kcml2ZV90ICosIGludCwgaW50KTsKIAotaWRlX3N0YXJ0c3RvcF90IF9faWRlX2Vycm9yKGlkZV9kcml2ZV90ICosIHN0cnVjdCByZXF1ZXN0ICosIHU4LCB1OCk7Ci0KLWlkZV9zdGFydHN0b3BfdCBpZGVfZXJyb3IgKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgY2hhciAqbXNnLCBieXRlIHN0YXQpOworaWRlX3N0YXJ0c3RvcF90IGlkZV9lcnJvcihpZGVfZHJpdmVfdCAqLCBjb25zdCBjaGFyICosIHU4KTsKIAogdm9pZCBpZGVfZml4X2RyaXZlaWQodTE2ICopOwogCkBAIC0xMTkyLDcgKzExODEsNiBAQAogdm9pZCBpZGVfZXhlY19jb21tYW5kKGlkZV9od2lmX3QgKiwgdTgpOwogdTggaWRlX3JlYWRfc3RhdHVzKGlkZV9od2lmX3QgKik7CiB1OCBpZGVfcmVhZF9hbHRzdGF0dXMoaWRlX2h3aWZfdCAqKTsKLXU4IGlkZV9yZWFkX3NmZl9kbWFfc3RhdHVzKGlkZV9od2lmX3QgKik7CiAKIHZvaWQgaWRlX3NldF9pcnEoaWRlX2h3aWZfdCAqLCBpbnQpOwogCkBAIC0xMjcyLDI2ICsxMjYwLDYgQEAKIAogZXh0ZXJuIHZvaWQgaWRlX3RpbWVyX2V4cGlyeSh1bnNpZ25lZCBsb25nKTsKIGV4dGVybiBpcnFyZXR1cm5fdCBpZGVfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwotCi1zdGF0aWMgaW5saW5lIGludCBpZGVfbG9ja19od2dyb3VwKGlkZV9od2dyb3VwX3QgKmh3Z3JvdXApCi17Ci0JaWYgKGh3Z3JvdXAtPmJ1c3kpCi0JCXJldHVybiAxOwotCi0JaHdncm91cC0+YnVzeSA9IDE7Ci0JLyogZm9yIGF0YXJpIG9ubHkgKi8KLQlpZGVfZ2V0X2xvY2soaWRlX2ludHIsIGh3Z3JvdXApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpZGVfdW5sb2NrX2h3Z3JvdXAoaWRlX2h3Z3JvdXBfdCAqaHdncm91cCkKLXsKLQkvKiBmb3IgYXRhcmkgb25seSAqLwotCWlkZV9yZWxlYXNlX2xvY2soKTsKLQlod2dyb3VwLT5idXN5ID0gMDsKLX0KLQogZXh0ZXJuIHZvaWQgZG9faWRlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKik7CiAKIHZvaWQgaWRlX2luaXRfZGlzayhzdHJ1Y3QgZ2VuZGlzayAqLCBpZGVfZHJpdmVfdCAqKTsKQEAgLTEzMjcsMTEgKzEyOTUsMTEgQEAKIH0KICNlbmRpZgogCi10eXBlZGVmIHN0cnVjdCBpZGVfcGNpX2VuYWJsZWJpdF9zIHsKK3N0cnVjdCBpZGVfcGNpX2VuYWJsZWJpdCB7CiAJdTgJcmVnOwkvKiBieXRlIHBjaSByZWcgaG9sZGluZyB0aGUgZW5hYmxlLWJpdCAqLwogCXU4CW1hc2s7CS8qIG1hc2sgdG8gaXNvbGF0ZSB0aGUgZW5hYmxlLWJpdCAqLwogCXU4CXZhbDsJLyogdmFsdWUgb2YgbWFza2VkIHJlZyB3aGVuICJlbmFibGVkIiAqLwotfSBpZGVfcGNpX2VuYWJsZWJpdF90OworfTsKIAogZW51bSB7CiAJLyogVXNlcyBJU0EgY29udHJvbCBwb3J0cyBub3QgUENJIG9uZXMuICovCkBAIC0xNDIwLDcgKzEzODgsOCBAQAogCWNvbnN0IHN0cnVjdCBpZGVfcG9ydF9vcHMJKnBvcnRfb3BzOwogCWNvbnN0IHN0cnVjdCBpZGVfZG1hX29wcwkqZG1hX29wczsKIAotCWlkZV9wY2lfZW5hYmxlYml0X3QJZW5hYmxlYml0c1syXTsKKwlzdHJ1Y3QgaWRlX3BjaV9lbmFibGViaXQJZW5hYmxlYml0c1syXTsKKwogCWh3aWZfY2hpcHNldF90CQljaGlwc2V0OwogCiAJdTE2CQkJbWF4X3NlY3RvcnM7CS8qIGlmIDwgdGhhbiB0aGUgZGVmYXVsdCBvbmUgKi8KQEAgLTE0OTIsNiArMTQ2MSw3IEBACiBleHRlcm4gdm9pZCBpZGVfZG1hX3N0YXJ0KGlkZV9kcml2ZV90ICopOwogaW50IGlkZV9kbWFfZW5kKGlkZV9kcml2ZV90ICopOwogaW50IGlkZV9kbWFfdGVzdF9pcnEoaWRlX2RyaXZlX3QgKik7Cit1OCBpZGVfZG1hX3NmZl9yZWFkX3N0YXR1cyhpZGVfaHdpZl90ICopOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpZGVfZG1hX29wcyBzZmZfZG1hX29wczsKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBjb25maWdfZHJpdmVfZm9yX2RtYShpZGVfZHJpdmVfdCAqZHJpdmUpIHsgcmV0dXJuIDA7IH0KQEAgLTE1MjksOSArMTQ5OSw2IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgaWRlX2FjcGlfc2V0X3N0YXRlKGlkZV9od2lmX3QgKmh3aWYsIGludCBvbikge30KICNlbmRpZgogCi12b2lkIGlkZV9yZW1vdmVfcG9ydF9mcm9tX2h3Z3JvdXAoaWRlX2h3aWZfdCAqKTsKLXZvaWQgaWRlX3VucmVnaXN0ZXIoaWRlX2h3aWZfdCAqKTsKLQogdm9pZCBpZGVfcmVnaXN0ZXJfcmVnaW9uKHN0cnVjdCBnZW5kaXNrICopOwogdm9pZCBpZGVfdW5yZWdpc3Rlcl9yZWdpb24oc3RydWN0IGdlbmRpc2sgKik7CiAKQEAgLTE2MTYsMjMgKzE1ODMsNiBAQAogCWlkZV9zZXRfcGlvKGRyaXZlLCAyNTUpOwogfQogCi1leHRlcm4gc3BpbmxvY2tfdCBpZGVfbG9jazsKLWV4dGVybiBzdHJ1Y3QgbXV0ZXggaWRlX2NmZ19tdHg7Ci0vKgotICogU3RydWN0dXJlIGxvY2tpbmc6Ci0gKgotICogaWRlX2NmZ19tdHggYW5kIGh3Z3JvdXAtPmxvY2sgdG9nZXRoZXIgcHJvdGVjdCBjaGFuZ2VzIHRvCi0gKiBpZGVfaHdpZl90LT5uZXh0Ci0gKiBpZGVfZHJpdmVfdC0+bmV4dAotICoKLSAqIGlkZV9od2dyb3VwX3QtPmJ1c3k6IGh3Z3JvdXAtPmxvY2sKLSAqIGlkZV9od2dyb3VwX3QtPmh3aWY6IGh3Z3JvdXAtPmxvY2sKLSAqIGlkZV9od2lmX3QtPntod2dyb3VwLG1hdGV9OiBjb25zdGFudCwgbm8gbG9ja2luZwotICogaWRlX2RyaXZlX3QtPmh3aWY6IGNvbnN0YW50LCBubyBsb2NraW5nCi0gKi8KLQotI2RlZmluZSBsb2NhbF9pcnFfc2V0KGZsYWdzKQlkbyB7IGxvY2FsX3NhdmVfZmxhZ3MoKGZsYWdzKSk7IGxvY2FsX2lycV9lbmFibGVfaW5faGFyZGlycSgpOyB9IHdoaWxlICgwKQotCiBjaGFyICppZGVfbWVkaWFfc3RyaW5nKGlkZV9kcml2ZV90ICopOwogCiBleHRlcm4gc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgaWRlX2Rldl9hdHRyc1tdOwpAQCAtMTY1MSw4ICsxNjAxLDE1IEBACiAKIHN0YXRpYyBpbmxpbmUgaWRlX2RyaXZlX3QgKmlkZV9nZXRfcGFpcl9kZXYoaWRlX2RyaXZlX3QgKmRyaXZlKQogewotCWlkZV9kcml2ZV90ICpwZWVyID0gJmRyaXZlLT5od2lmLT5kcml2ZXNbKGRyaXZlLT5kbiBeIDEpICYgMV07CisJaWRlX2RyaXZlX3QgKnBlZXIgPSBkcml2ZS0+aHdpZi0+ZGV2aWNlc1soZHJpdmUtPmRuIF4gMSkgJiAxXTsKIAogCXJldHVybiAocGVlci0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1BSRVNFTlQpID8gcGVlciA6IE5VTEw7CiB9CisKKyNkZWZpbmUgaWRlX3BvcnRfZm9yX2VhY2hfZGV2KGksIGRldiwgcG9ydCkgXAorCWZvciAoKGkpID0gMDsgKChkZXYpID0gKHBvcnQpLT5kZXZpY2VzW2ldKSB8fCAoaSkgPCBNQVhfRFJJVkVTOyAoaSkrKykKKworI2RlZmluZSBpZGVfaG9zdF9mb3JfZWFjaF9wb3J0KGksIHBvcnQsIGhvc3QpIFwKKwlmb3IgKChpKSA9IDA7ICgocG9ydCkgPSAoaG9zdCktPnBvcnRzW2ldKSB8fCAoaSkgPCBNQVhfSE9TVF9QT1JUUzsgKGkpKyspCisKICNlbmRpZiAvKiBfSURFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWZfdmxhbi5oIGIvaW5jbHVkZS9saW51eC9pZl92bGFuLmgKaW5kZXggYTVjYjBjMy4uZjhmZjkxOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZl92bGFuLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZl92bGFuLmgKQEAgLTExNSw2ICsxMTUsMTEgQEAKIGV4dGVybiBpbnQgX192bGFuX2h3YWNjZWxfcngoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCwKIAkJCSAgICAgdTE2IHZsYW5fdGNpLCBpbnQgcG9sbGluZyk7CiBleHRlcm4gaW50IHZsYW5faHdhY2NlbF9kb19yZWNlaXZlKHN0cnVjdCBza19idWZmICpza2IpOworZXh0ZXJuIGludCB2bGFuX2dyb19yZWNlaXZlKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgdmxhbl90Y2ksIHN0cnVjdCBza19idWZmICpza2IpOworZXh0ZXJuIGludCB2bGFuX2dyb19mcmFncyhzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIHN0cnVjdCB2bGFuX2dyb3VwICpncnAsCisJCQkgIHVuc2lnbmVkIGludCB2bGFuX3RjaSwKKwkJCSAgc3RydWN0IG5hcGlfZ3JvX2ZyYWdpbmZvICppbmZvKTsKIAogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgc3RydWN0IG5ldF9kZXZpY2UgKnZsYW5fZGV2X3JlYWxfZGV2KGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0xNDAsNiArMTQ1LDIwIEBACiB7CiAJcmV0dXJuIDA7CiB9CisKK3N0YXRpYyBpbmxpbmUgaW50IHZsYW5fZ3JvX3JlY2VpdmUoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLAorCQkJCSAgIHN0cnVjdCB2bGFuX2dyb3VwICpncnAsCisJCQkJICAgdW5zaWduZWQgaW50IHZsYW5fdGNpLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBORVRfUlhfRFJPUDsKK30KKworc3RhdGljIGlubGluZSBpbnQgdmxhbl9ncm9fZnJhZ3Moc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLAorCQkJCSBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwLCB1bnNpZ25lZCBpbnQgdmxhbl90Y2ksCisJCQkJIHN0cnVjdCBuYXBpX2dyb19mcmFnaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gTkVUX1JYX0RST1A7Cit9CiAjZW5kaWYKIAogLyoqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oIGIvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaAppbmRleCAwNzAyYzRkLi45MTI3ZjZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oCisrKyBiL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmgKQEAgLTE0LDcgKzE0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pcnFmbGFncy5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgotI2luY2x1ZGUgPGxpbnV4L2lycW5yLmg+CiAKICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgpAQCAtMjUzLDcgKzI1Miw4IEBACiAJQkxPQ0tfU09GVElSUSwKIAlUQVNLTEVUX1NPRlRJUlEsCiAJU0NIRURfU09GVElSUSwKLQlSQ1VfU09GVElSUSwgCS8qIFByZWZlcmFibGUgUkNVIHNob3VsZCBhbHdheXMgYmUgdGhlIGxhc3Qgc29mdGlycSAqLworCUhSVElNRVJfU09GVElSUSwKKwlSQ1VfU09GVElSUSwJLyogUHJlZmVyYWJsZSBSQ1Ugc2hvdWxkIGFsd2F5cyBiZSB0aGUgbGFzdCBzb2Z0aXJxICovCiAKIAlOUl9TT0ZUSVJRUwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW9wb3J0LmggYi9pbmNsdWRlL2xpbnV4L2lvcG9ydC5oCmluZGV4IDA0MWU5NWEuLmY2YmIyY2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW9wb3J0LmgKKysrIGIvaW5jbHVkZS9saW51eC9pb3BvcnQuaApAQCAtNDksNiArNDksNyBAQAogI2RlZmluZSBJT1JFU09VUkNFX1NJWkVBTElHTgkweDAwMDIwMDAwCS8qIHNpemUgaW5kaWNhdGVzIGFsaWdubWVudCAqLwogI2RlZmluZSBJT1JFU09VUkNFX1NUQVJUQUxJR04JMHgwMDA0MDAwMAkvKiBzdGFydCBmaWVsZCBpcyBhbGlnbm1lbnQgKi8KIAorI2RlZmluZSBJT1JFU09VUkNFX0VYQ0xVU0lWRQkweDA4MDAwMDAwCS8qIFVzZXJsYW5kIG1heSBub3QgbWFwIHRoaXMgcmVzb3VyY2UgKi8KICNkZWZpbmUgSU9SRVNPVVJDRV9ESVNBQkxFRAkweDEwMDAwMDAwCiAjZGVmaW5lIElPUkVTT1VSQ0VfVU5TRVQJMHgyMDAwMDAwMAogI2RlZmluZSBJT1JFU09VUkNFX0FVVE8JCTB4NDAwMDAwMDAKQEAgLTEzMywxMyArMTM0LDE2IEBACiB9CiAKIC8qIENvbnZlbmllbmNlIHNob3J0aGFuZCB3aXRoIGFsbG9jYXRpb24gKi8KLSNkZWZpbmUgcmVxdWVzdF9yZWdpb24oc3RhcnQsbixuYW1lKQlfX3JlcXVlc3RfcmVnaW9uKCZpb3BvcnRfcmVzb3VyY2UsIChzdGFydCksIChuKSwgKG5hbWUpKQotI2RlZmluZSByZXF1ZXN0X21lbV9yZWdpb24oc3RhcnQsbixuYW1lKSBfX3JlcXVlc3RfcmVnaW9uKCZpb21lbV9yZXNvdXJjZSwgKHN0YXJ0KSwgKG4pLCAobmFtZSkpCisjZGVmaW5lIHJlcXVlc3RfcmVnaW9uKHN0YXJ0LG4sbmFtZSkJX19yZXF1ZXN0X3JlZ2lvbigmaW9wb3J0X3Jlc291cmNlLCAoc3RhcnQpLCAobiksIChuYW1lKSwgMCkKKyNkZWZpbmUgX19yZXF1ZXN0X21lbV9yZWdpb24oc3RhcnQsbixuYW1lLCBleGNsKSBfX3JlcXVlc3RfcmVnaW9uKCZpb21lbV9yZXNvdXJjZSwgKHN0YXJ0KSwgKG4pLCAobmFtZSksIGV4Y2wpCisjZGVmaW5lIHJlcXVlc3RfbWVtX3JlZ2lvbihzdGFydCxuLG5hbWUpIF9fcmVxdWVzdF9yZWdpb24oJmlvbWVtX3Jlc291cmNlLCAoc3RhcnQpLCAobiksIChuYW1lKSwgMCkKKyNkZWZpbmUgcmVxdWVzdF9tZW1fcmVnaW9uX2V4Y2x1c2l2ZShzdGFydCxuLG5hbWUpIFwKKwlfX3JlcXVlc3RfcmVnaW9uKCZpb21lbV9yZXNvdXJjZSwgKHN0YXJ0KSwgKG4pLCAobmFtZSksIElPUkVTT1VSQ0VfRVhDTFVTSVZFKQogI2RlZmluZSByZW5hbWVfcmVnaW9uKHJlZ2lvbiwgbmV3bmFtZSkgZG8geyAocmVnaW9uKS0+bmFtZSA9IChuZXduYW1lKTsgfSB3aGlsZSAoMCkKIAogZXh0ZXJuIHN0cnVjdCByZXNvdXJjZSAqIF9fcmVxdWVzdF9yZWdpb24oc3RydWN0IHJlc291cmNlICosCiAJCQkJCXJlc291cmNlX3NpemVfdCBzdGFydCwKLQkJCQkJcmVzb3VyY2Vfc2l6ZV90IG4sIGNvbnN0IGNoYXIgKm5hbWUpOworCQkJCQlyZXNvdXJjZV9zaXplX3QgbiwgY29uc3QgY2hhciAqbmFtZSwgaW50IHJlbGF4ZWQpOwogCiAvKiBDb21wYXRpYmlsaXR5IGNydWZ0ICovCiAjZGVmaW5lIHJlbGVhc2VfcmVnaW9uKHN0YXJ0LG4pCV9fcmVsZWFzZV9yZWdpb24oJmlvcG9ydF9yZXNvdXJjZSwgKHN0YXJ0KSwgKG4pKQpAQCAtMTc1LDYgKzE3OSw3IEBACiBleHRlcm4gdm9pZCBfX2Rldm1fcmVsZWFzZV9yZWdpb24oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKnBhcmVudCwKIAkJCQkgIHJlc291cmNlX3NpemVfdCBzdGFydCwgcmVzb3VyY2Vfc2l6ZV90IG4pOwogZXh0ZXJuIGludCBpb21lbV9tYXBfc2FuaXR5X2NoZWNrKHJlc291cmNlX3NpemVfdCBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpOworZXh0ZXJuIGludCBpb21lbV9pc19leGNsdXNpdmUodTY0IGFkZHIpOwogCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAjZW5kaWYJLyogX0xJTlVYX0lPUE9SVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lvcHJpby5oIGIvaW5jbHVkZS9saW51eC9pb3ByaW8uaAppbmRleCBmOThhNjU2Li43NmRhZDQ4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lvcHJpby5oCisrKyBiL2luY2x1ZGUvbGludXgvaW9wcmlvLmgKQEAgLTg2LDQgKzg2LDYgQEAKICAqLwogZXh0ZXJuIGludCBpb3ByaW9fYmVzdCh1bnNpZ25lZCBzaG9ydCBhcHJpbywgdW5zaWduZWQgc2hvcnQgYnByaW8pOwogCitleHRlcm4gaW50IHNldF90YXNrX2lvcHJpbyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCBpb3ByaW8pOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXJxbnIuaCBiL2luY2x1ZGUvbGludXgvaXJxbnIuaAppbmRleCA1NTA0YTVjLi44NmFmOTJlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lycW5yLmgKKysrIGIvaW5jbHVkZS9saW51eC9pcnFuci5oCkBAIC04LDcgKzgsMTIgQEAKIAogI2lmbmRlZiBDT05GSUdfR0VORVJJQ19IQVJESVJRUwogI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSMgZGVmaW5lIG5yX2lycXMJCU5SX0lSUVMKKworLyoKKyAqIFdyYXBwZXJzIGZvciBub24tZ2VuaXJxIGFyY2hpdGVjdHVyZXM6CisgKi8KKyNkZWZpbmUgbnJfaXJxcwkJCU5SX0lSUVMKKyNkZWZpbmUgaXJxX3RvX2Rlc2MoaXJxKQkoJmlycV9kZXNjW2lycV0pCiAKICMgZGVmaW5lIGZvcl9lYWNoX2lycV9kZXNjKGlycSwgZGVzYykJCVwKIAlmb3IgKGlycSA9IDA7IGlycSA8IG5yX2lycXM7IGlycSsrKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9qYmQuaCBiL2luY2x1ZGUvbGludXgvamJkLmgKaW5kZXggMzQ2ZTJiOC4uNjM4NGIxOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9qYmQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2piZC5oCkBAIC01NDMsNiArNTQzLDExIEBACiAJdW5zaWduZWQgbG9uZwkJdF9leHBpcmVzOwogCiAJLyoKKwkgKiBXaGVuIHRoaXMgdHJhbnNhY3Rpb24gc3RhcnRlZCwgaW4gbmFub3NlY29uZHMgW25vIGxvY2tpbmddCisJICovCisJa3RpbWVfdAkJCXRfc3RhcnRfdGltZTsKKworCS8qCiAJICogSG93IG1hbnkgaGFuZGxlcyB1c2VkIHRoaXMgdHJhbnNhY3Rpb24/IFt0X2hhbmRsZV9sb2NrXQogCSAqLwogCWludCB0X2hhbmRsZV9jb3VudDsKQEAgLTc5OCw5ICs4MDMsMTkgQEAKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQJKipqX3didWY7CiAJaW50CQkJal93YnVmc2l6ZTsKIAorCS8qCisJICogdGhpcyBpcyB0aGUgcGlkIG9mIHRoZSBsYXN0IHBlcnNvbiB0byBydW4gYSBzeW5jaHJvbm91cyBvcGVyYXRpb24KKwkgKiB0aHJvdWdoIHRoZSBqb3VybmFsLgorCSAqLwogCXBpZF90CQkJal9sYXN0X3N5bmNfd3JpdGVyOwogCiAJLyoKKwkgKiB0aGUgYXZlcmFnZSBhbW91bnQgb2YgdGltZSBpbiBuYW5vc2Vjb25kcyBpdCB0YWtlcyB0byBjb21taXQgYQorCSAqIHRyYW5zYWN0aW9uIHRvIHRoZSBkaXNrLiAgW2pfc3RhdGVfbG9ja10KKwkgKi8KKwl1NjQJCQlqX2F2ZXJhZ2VfY29tbWl0X3RpbWU7CisKKwkvKgogCSAqIEFuIG9wYXF1ZSBwb2ludGVyIHRvIGZzLXByaXZhdGUgaW5mb3JtYXRpb24uICBleHQzIHB1dHMgaXRzCiAJICogc3VwZXJibG9jayBwb2ludGVyIGhlcmUKIAkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvamJkMi5oIGIvaW5jbHVkZS9saW51eC9qYmQyLmgKaW5kZXggYzdkMTA2ZS4uYjQ1MTA5YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9qYmQyLmgKKysrIGIvaW5jbHVkZS9saW51eC9qYmQyLmgKQEAgLTMyOSw2ICszMjksNyBAQAogCUJIX1N0YXRlLAkJLyogUGlucyBtb3N0IGpvdXJuYWxfaGVhZCBzdGF0ZSAqLwogCUJIX0pvdXJuYWxIZWFkLAkJLyogUGlucyBiaC0+Yl9wcml2YXRlIGFuZCBqaC0+Yl9iaCAqLwogCUJIX1Vuc2hhZG93LAkJLyogRHVtbXkgYml0LCBmb3IgQkpfU2hhZG93IHdha2V1cCBmaWx0ZXJpbmcgKi8KKwlCSF9KQkRQcml2YXRlU3RhcnQsCS8qIEZpcnN0IGJpdCBhdmFpbGFibGUgZm9yIHByaXZhdGUgdXNlIGJ5IEZTICovCiB9OwogCiBCVUZGRVJfRk5TKEpCRCwgamJkKQpAQCAtNjM3LDYgKzYzOCwxMSBAQAogCXVuc2lnbmVkIGxvbmcJCXRfZXhwaXJlczsKIAogCS8qCisJICogV2hlbiB0aGlzIHRyYW5zYWN0aW9uIHN0YXJ0ZWQsIGluIG5hbm9zZWNvbmRzIFtubyBsb2NraW5nXQorCSAqLworCWt0aW1lX3QJCQl0X3N0YXJ0X3RpbWU7CisKKwkvKgogCSAqIEhvdyBtYW55IGhhbmRsZXMgdXNlZCB0aGlzIHRyYW5zYWN0aW9uPyBbdF9oYW5kbGVfbG9ja10KIAkgKi8KIAlpbnQgdF9oYW5kbGVfY291bnQ7CkBAIC02ODEsNiArNjg3LDggQEAKIAlyZXR1cm4gZW5kICsgKE1BWF9KSUZGWV9PRkZTRVQgLSBzdGFydCk7CiB9CiAKKyNkZWZpbmUgSkJEMl9OUl9CQVRDSAk2NAorCiAvKioKICAqIHN0cnVjdCBqb3VybmFsX3MgLSBUaGUgam91cm5hbF9zIHR5cGUgaXMgdGhlIGNvbmNyZXRlIHR5cGUgYXNzb2NpYXRlZCB3aXRoCiAgKiAgICAgam91cm5hbF90LgpAQCAtODI1LDYgKzgzMywxNCBAQAogCXN0cnVjdCBtdXRleAkJal9jaGVja3BvaW50X211dGV4OwogCiAJLyoKKwkgKiBMaXN0IG9mIGJ1ZmZlciBoZWFkcyB1c2VkIGJ5IHRoZSBjaGVja3BvaW50IHJvdXRpbmUuICBUaGlzCisJICogd2FzIG1vdmVkIGZyb20gamJkMl9sb2dfZG9fY2hlY2twb2ludCgpIHRvIHJlZHVjZSBzdGFjaworCSAqIHVzYWdlLiAgQWNjZXNzIHRvIHRoaXMgYXJyYXkgaXMgY29udHJvbGxlZCBieSB0aGUKKwkgKiBqX2NoZWNrcG9pbnRfbXV0ZXguICBbal9jaGVja3BvaW50X211dGV4XQorCSAqLworCXN0cnVjdCBidWZmZXJfaGVhZAkqal9jaGtwdF9iaHNbSkJEMl9OUl9CQVRDSF07CisJCisJLyoKIAkgKiBKb3VybmFsIGhlYWQ6IGlkZW50aWZpZXMgdGhlIGZpcnN0IHVudXNlZCBibG9jayBpbiB0aGUgam91cm5hbC4KIAkgKiBbal9zdGF0ZV9sb2NrXQogCSAqLwpAQCAtOTM4LDggKzk1NCwyNiBAQAogCXN0cnVjdCBidWZmZXJfaGVhZAkqKmpfd2J1ZjsKIAlpbnQJCQlqX3didWZzaXplOwogCisJLyoKKwkgKiB0aGlzIGlzIHRoZSBwaWQgb2YgaHRlIGxhc3QgcGVyc29uIHRvIHJ1biBhIHN5bmNocm9ub3VzIG9wZXJhdGlvbgorCSAqIHRocm91Z2ggdGhlIGpvdXJuYWwKKwkgKi8KIAlwaWRfdAkJCWpfbGFzdF9zeW5jX3dyaXRlcjsKIAorCS8qCisJICogdGhlIGF2ZXJhZ2UgYW1vdW50IG9mIHRpbWUgaW4gbmFub3NlY29uZHMgaXQgdGFrZXMgdG8gY29tbWl0IGEKKwkgKiB0cmFuc2FjdGlvbiB0byBkaXNrLiBbal9zdGF0ZV9sb2NrXQorCSAqLworCXU2NAkJCWpfYXZlcmFnZV9jb21taXRfdGltZTsKKworCS8qCisJICogbWluaW11bSBhbmQgbWF4aW11bSB0aW1lcyB0aGF0IHdlIHNob3VsZCB3YWl0IGZvcgorCSAqIGFkZGl0aW9uYWwgZmlsZXN5c3RlbSBvcGVyYXRpb25zIHRvIGdldCBiYXRjaGVkIGludG8gYQorCSAqIHN5bmNocm9ub3VzIGhhbmRsZSBpbiBtaWNyb3NlY29uZHMKKwkgKi8KKwl1MzIJCQlqX21pbl9iYXRjaF90aW1lOworCXUzMgkJCWpfbWF4X2JhdGNoX3RpbWU7CisKIAkvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgdHJhbnNhY3Rpb24gaXMgY2xvc2VkICovCiAJdm9pZAkJCSgqal9jb21taXRfY2FsbGJhY2spKGpvdXJuYWxfdCAqLAogCQkJCQkJICAgICB0cmFuc2FjdGlvbl90ICopOwpAQCAtMTAwNyw2ICsxMDQxLDM1IEBACiBpbnQgX19qYmQyX2pvdXJuYWxfcmVtb3ZlX2NoZWNrcG9pbnQoc3RydWN0IGpvdXJuYWxfaGVhZCAqKTsKIHZvaWQgX19qYmQyX2pvdXJuYWxfaW5zZXJ0X2NoZWNrcG9pbnQoc3RydWN0IGpvdXJuYWxfaGVhZCAqLCB0cmFuc2FjdGlvbl90ICopOwogCisKKy8qCisgKiBUcmlnZ2VycworICovCisKK3N0cnVjdCBqYmQyX2J1ZmZlcl90cmlnZ2VyX3R5cGUgeworCS8qCisJICogRmlyZWQganVzdCBiZWZvcmUgYSBidWZmZXIgaXMgd3JpdHRlbiB0byB0aGUgam91cm5hbC4KKwkgKiBtYXBwZWRfZGF0YSBpcyBhIG1hcHBlZCBidWZmZXIgdGhhdCBpcyB0aGUgZnJvemVuIGRhdGEgZm9yCisJICogY29tbWl0LgorCSAqLworCXZvaWQgKCp0X2NvbW1pdCkoc3RydWN0IGpiZDJfYnVmZmVyX3RyaWdnZXJfdHlwZSAqdHlwZSwKKwkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCB2b2lkICptYXBwZWRfZGF0YSwKKwkJCSBzaXplX3Qgc2l6ZSk7CisKKwkvKgorCSAqIEZpcmVkIGR1cmluZyBqb3VybmFsIGFib3J0IGZvciBkaXJ0eSBidWZmZXJzIHRoYXQgd2lsbCBub3QgYmUKKwkgKiBjb21taXR0ZWQuCisJICovCisJdm9pZCAoKnRfYWJvcnQpKHN0cnVjdCBqYmQyX2J1ZmZlcl90cmlnZ2VyX3R5cGUgKnR5cGUsCisJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKK307CisKK2V4dGVybiB2b2lkIGpiZDJfYnVmZmVyX2NvbW1pdF90cmlnZ2VyKHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoLAorCQkJCSAgICAgICB2b2lkICptYXBwZWRfZGF0YSwKKwkJCQkgICAgICAgc3RydWN0IGpiZDJfYnVmZmVyX3RyaWdnZXJfdHlwZSAqdHJpZ2dlcnMpOworZXh0ZXJuIHZvaWQgamJkMl9idWZmZXJfYWJvcnRfdHJpZ2dlcihzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCwKKwkJCQkgICAgICBzdHJ1Y3QgamJkMl9idWZmZXJfdHJpZ2dlcl90eXBlICp0cmlnZ2Vycyk7CisKIC8qIEJ1ZmZlciBJTyAqLwogZXh0ZXJuIGludAogamJkMl9qb3VybmFsX3dyaXRlX21ldGFkYXRhX2J1ZmZlcih0cmFuc2FjdGlvbl90CSAgKnRyYW5zYWN0aW9uLApAQCAtMTA0NSw2ICsxMTA4LDggQEAKIGV4dGVybiBpbnQJIGpiZDJfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZV90ICosIHN0cnVjdCBidWZmZXJfaGVhZCAqKTsKIGV4dGVybiBpbnQJIGpiZDJfam91cm5hbF9nZXRfY3JlYXRlX2FjY2VzcyAoaGFuZGxlX3QgKiwgc3RydWN0IGJ1ZmZlcl9oZWFkICopOwogZXh0ZXJuIGludAkgamJkMl9qb3VybmFsX2dldF91bmRvX2FjY2VzcyhoYW5kbGVfdCAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKik7Cit2b2lkCQkgamJkMl9qb3VybmFsX3NldF90cmlnZ2VycyhzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwKKwkJCQkJICAgc3RydWN0IGpiZDJfYnVmZmVyX3RyaWdnZXJfdHlwZSAqdHlwZSk7CiBleHRlcm4gaW50CSBqYmQyX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEgKGhhbmRsZV90ICosIHN0cnVjdCBidWZmZXJfaGVhZCAqKTsKIGV4dGVybiB2b2lkCSBqYmQyX2pvdXJuYWxfcmVsZWFzZV9idWZmZXIgKGhhbmRsZV90ICosIHN0cnVjdCBidWZmZXJfaGVhZCAqKTsKIGV4dGVybiBpbnQJIGpiZDJfam91cm5hbF9mb3JnZXQgKGhhbmRsZV90ICosIHN0cnVjdCBidWZmZXJfaGVhZCAqKTsKQEAgLTEwNzAsNyArMTEzNSw2IEBACiAJCSAgIChqb3VybmFsX3QgKiwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7CiBleHRlcm4gdm9pZAkgICBqYmQyX2pvdXJuYWxfY2xlYXJfZmVhdHVyZXMKIAkJICAgKGpvdXJuYWxfdCAqLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKLWV4dGVybiBpbnQJICAgamJkMl9qb3VybmFsX2NyZWF0ZSAgICAgKGpvdXJuYWxfdCAqKTsKIGV4dGVybiBpbnQJICAgamJkMl9qb3VybmFsX2xvYWQgICAgICAgKGpvdXJuYWxfdCAqam91cm5hbCk7CiBleHRlcm4gaW50CSAgIGpiZDJfam91cm5hbF9kZXN0cm95ICAgIChqb3VybmFsX3QgKik7CiBleHRlcm4gaW50CSAgIGpiZDJfam91cm5hbF9yZWNvdmVyICAgIChqb3VybmFsX3QgKmpvdXJuYWwpOwpAQCAtMTE0NSw4ICsxMjA5LDggQEAKIGludCBqYmQyX2xvZ19kb19jaGVja3BvaW50KGpvdXJuYWxfdCAqam91cm5hbCk7CiAKIHZvaWQgX19qYmQyX2xvZ193YWl0X2Zvcl9zcGFjZShqb3VybmFsX3QgKmpvdXJuYWwpOwotZXh0ZXJuIHZvaWQJX19qYmQyX2pvdXJuYWxfZHJvcF90cmFuc2FjdGlvbihqb3VybmFsX3QgKiwgdHJhbnNhY3Rpb25fdCAqKTsKLWV4dGVybiBpbnQJamJkMl9jbGVhbnVwX2pvdXJuYWxfdGFpbChqb3VybmFsX3QgKik7CitleHRlcm4gdm9pZCBfX2piZDJfam91cm5hbF9kcm9wX3RyYW5zYWN0aW9uKGpvdXJuYWxfdCAqLCB0cmFuc2FjdGlvbl90ICopOworZXh0ZXJuIGludCBqYmQyX2NsZWFudXBfam91cm5hbF90YWlsKGpvdXJuYWxfdCAqKTsKIAogLyogRGVidWdnaW5nIGNvZGUgb25seTogKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9qb3VybmFsLWhlYWQuaCBiL2luY2x1ZGUvbGludXgvam91cm5hbC1oZWFkLmgKaW5kZXggYmI3MGViYi4uNTI1YWFjMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9qb3VybmFsLWhlYWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2pvdXJuYWwtaGVhZC5oCkBAIC0xMiw2ICsxMiw4IEBACiAKIHR5cGVkZWYgdW5zaWduZWQgaW50CQl0aWRfdDsJCS8qIFVuaXF1ZSB0cmFuc2FjdGlvbiBJRCAqLwogdHlwZWRlZiBzdHJ1Y3QgdHJhbnNhY3Rpb25fcwl0cmFuc2FjdGlvbl90OwkvKiBDb21wb3VuZCB0cmFuc2FjdGlvbiB0eXBlICovCisKKwogc3RydWN0IGJ1ZmZlcl9oZWFkOwogCiBzdHJ1Y3Qgam91cm5hbF9oZWFkIHsKQEAgLTg3LDYgKzg5LDEyIEBACiAJICogW2pfbGlzdF9sb2NrXQogCSAqLwogCXN0cnVjdCBqb3VybmFsX2hlYWQgKmJfY3BuZXh0LCAqYl9jcHByZXY7CisKKwkvKiBUcmlnZ2VyIHR5cGUgKi8KKwlzdHJ1Y3QgamJkMl9idWZmZXJfdHJpZ2dlcl90eXBlICpiX3RyaWdnZXJzOworCisJLyogVHJpZ2dlciB0eXBlIGZvciB0aGUgY29tbWl0dGluZyB0cmFuc2FjdGlvbidzIGZyb3plbiBkYXRhICovCisJc3RydWN0IGpiZDJfYnVmZmVyX3RyaWdnZXJfdHlwZSAqYl9mcm96ZW5fdHJpZ2dlcnM7CiB9OwogCiAjZW5kaWYJCS8qIEpPVVJOQUxfSEVBRF9IX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oIGIvaW5jbHVkZS9saW51eC9rZXJuZWwuaAppbmRleCBjYTlmZjY0Li4zNDNkZjllIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCisrKyBiL2luY2x1ZGUvbGludXgva2VybmVsLmgKQEAgLTQ4LDYgKzQ4LDEyIEBACiAjZGVmaW5lIEZJRUxEX1NJWkVPRih0LCBmKSAoc2l6ZW9mKCgodCopMCktPmYpKQogI2RlZmluZSBESVZfUk9VTkRfVVAobixkKSAoKChuKSArIChkKSAtIDEpIC8gKGQpKQogI2RlZmluZSByb3VuZHVwKHgsIHkpICgoKCh4KSArICgoeSkgLSAxKSkgLyAoeSkpICogKHkpKQorI2RlZmluZSBESVZfUk9VTkRfQ0xPU0VTVCh4LCBkaXZpc29yKSgJCQlcCit7CQkJCQkJCVwKKwl0eXBlb2YoZGl2aXNvcikgX19kaXZpc29yID0gZGl2aXNvcjsJCVwKKwkoKCh4KSArICgoX19kaXZpc29yKSAvIDIpKSAvIChfX2Rpdmlzb3IpKTsJXAorfQkJCQkJCQlcCispCiAKICNkZWZpbmUgX1JFVF9JUF8JCSh1bnNpZ25lZCBsb25nKV9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKQogI2RlZmluZSBfVEhJU19JUF8gICh7IF9fbGFiZWxfXyBfX2hlcmU7IF9faGVyZTogKHVuc2lnbmVkIGxvbmcpJiZfX2hlcmU7IH0pCkBAIC0zNDksMTMgKzM1NSwxMyBAQAogICAgICAgICBwcmludGsoS0VSTl9JTkZPIHByX2ZtdChmbXQpLCAjI19fVkFfQVJHU19fKQogCiAvKiBJZiB5b3UgYXJlIHdyaXRpbmcgYSBkcml2ZXIsIHBsZWFzZSB1c2UgZGV2X2RiZyBpbnN0ZWFkICovCi0jaWYgZGVmaW5lZChDT05GSUdfRFlOQU1JQ19QUklOVEtfREVCVUcpCisjaWYgZGVmaW5lZChERUJVRykKKyNkZWZpbmUgcHJfZGVidWcoZm10LCAuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyBwcl9mbXQoZm10KSwgIyNfX1ZBX0FSR1NfXykKKyNlbGlmIGRlZmluZWQoQ09ORklHX0RZTkFNSUNfUFJJTlRLX0RFQlVHKQogI2RlZmluZSBwcl9kZWJ1ZyhmbXQsIC4uLikgZG8geyBcCiAJZHluYW1pY19wcl9kZWJ1Zyhwcl9mbXQoZm10KSwgIyNfX1ZBX0FSR1NfXyk7IFwKIAl9IHdoaWxlICgwKQotI2VsaWYgZGVmaW5lZChERUJVRykKLSNkZWZpbmUgcHJfZGVidWcoZm10LCAuLi4pIFwKLQlwcmludGsoS0VSTl9ERUJVRyBwcl9mbXQoZm10KSwgIyNfX1ZBX0FSR1NfXykKICNlbHNlCiAjZGVmaW5lIHByX2RlYnVnKGZtdCwgLi4uKSBcCiAJKHsgaWYgKDApIHByaW50ayhLRVJOX0RFQlVHIHByX2ZtdChmbXQpLCAjI19fVkFfQVJHU19fKTsgMDsgfSkKQEAgLTQ3MCw2ICs0NzYsMTIgQEAKIAlfX3ZhbCA9IF9fdmFsIDwgX19taW4gPyBfX21pbjogX192YWw7CVwKIAlfX3ZhbCA+IF9fbWF4ID8gX19tYXg6IF9fdmFsOyB9KQogCisKKy8qCisgKiBzd2FwIC0gc3dhcCB2YWx1ZSBvZiBAYSBhbmQgQGIKKyAqLworI2RlZmluZSBzd2FwKGEsIGIpICh7IHR5cGVvZihhKSBfX3RtcCA9IChhKTsgKGEpID0gKGIpOyAoYikgPSBfX3RtcDsgfSkKKwogLyoqCiAgKiBjb250YWluZXJfb2YgLSBjYXN0IGEgbWVtYmVyIG9mIGEgc3RydWN0dXJlIG91dCB0byB0aGUgY29udGFpbmluZyBzdHJ1Y3R1cmUKICAqIEBwdHI6CXRoZSBwb2ludGVyIHRvIHRoZSBtZW1iZXIuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tsaXN0LmggYi9pbmNsdWRlL2xpbnV4L2tsaXN0LmgKaW5kZXggOGVhOThkYi4uZDVhMjdhZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rbGlzdC5oCisrKyBiL2luY2x1ZGUvbGludXgva2xpc3QuaApAQCAtMTMsNyArMTMsNiBAQAogI2RlZmluZSBfTElOVVhfS0xJU1RfSAogCiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgva3JlZi5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KIApAQCAtNDEsNyArNDAsNiBAQAogCXZvaWQJCQkqbl9rbGlzdDsJLyogbmV2ZXIgYWNjZXNzIGRpcmVjdGx5ICovCiAJc3RydWN0IGxpc3RfaGVhZAluX25vZGU7CiAJc3RydWN0IGtyZWYJCW5fcmVmOwotCXN0cnVjdCBjb21wbGV0aW9uCW5fcmVtb3ZlZDsKIH07CiAKIGV4dGVybiB2b2lkIGtsaXN0X2FkZF90YWlsKHN0cnVjdCBrbGlzdF9ub2RlICpuLCBzdHJ1Y3Qga2xpc3QgKmspOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rcHJvYmVzLmggYi9pbmNsdWRlL2xpbnV4L2twcm9iZXMuaAppbmRleCA0OTdiMWQxLi5kNmVhMTllIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2twcm9iZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2twcm9iZXMuaApAQCAtNjksOSArNjksNiBAQAogCS8qIGxpc3Qgb2Yga3Byb2JlcyBmb3IgbXVsdGktaGFuZGxlciBzdXBwb3J0ICovCiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCi0JLyogSW5kaWNhdGVzIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgbW9kdWxlIGhhcyBiZWVuIHJlZiBjb3VudGVkICovCi0JdW5zaWduZWQgaW50IG1vZF9yZWZjb3VudGVkOwotCiAJLypjb3VudCB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgcHJvYmUgd2FzIHRlbXBvcmFyaWx5IGRpc2FybWVkICovCiAJdW5zaWduZWQgbG9uZyBubWlzc2VkOwogCkBAIC0xMDMsOCArMTAwLDE5IEBACiAKIAkvKiBjb3B5IG9mIHRoZSBvcmlnaW5hbCBpbnN0cnVjdGlvbiAqLwogCXN0cnVjdCBhcmNoX3NwZWNpZmljX2luc24gYWluc247CisKKwkvKiBJbmRpY2F0ZXMgdmFyaW91cyBzdGF0dXMgZmxhZ3MuICBQcm90ZWN0ZWQgYnkga3Byb2JlX211dGV4LiAqLworCXUzMiBmbGFnczsKIH07CiAKKy8qIEtwcm9iZSBzdGF0dXMgZmxhZ3MgKi8KKyNkZWZpbmUgS1BST0JFX0ZMQUdfR09ORQkxIC8qIGJyZWFrcG9pbnQgaGFzIGFscmVhZHkgZ29uZSAqLworCitzdGF0aWMgaW5saW5lIGludCBrcHJvYmVfZ29uZShzdHJ1Y3Qga3Byb2JlICpwKQoreworCXJldHVybiBwLT5mbGFncyAmIEtQUk9CRV9GTEFHX0dPTkU7Cit9CisKIC8qCiAgKiBTcGVjaWFsIHByb2JlIHR5cGUgdGhhdCB1c2VzIHNldGptcC1sb25nam1wIHR5cGUgdHJpY2tzIHRvIHJlc3VtZQogICogZXhlY3V0aW9uIGF0IGEgc3BlY2lmaWVkIGVudHJ5IHdpdGggYSBtYXRjaGluZyBwcm90b3R5cGUgY29ycmVzcG9uZGluZwpAQCAtMjAxLDcgKzIwOSw2IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX0tQUk9CRVNfU0FOSVRZX1RFU1QgKi8KIAotZXh0ZXJuIHN0cnVjdCBtdXRleCBrcHJvYmVfbXV0ZXg7CiBleHRlcm4gaW50IGFyY2hfcHJlcGFyZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCk7CiBleHRlcm4gdm9pZCBhcmNoX2FybV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCk7CiBleHRlcm4gdm9pZCBhcmNoX2Rpc2FybV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oIGIvaW5jbHVkZS9saW51eC9saWJhdGEuaAppbmRleCAzNDQ5ZGU1Li40ZjdjOGZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oCisrKyBiL2luY2x1ZGUvbGludXgvbGliYXRhLmgKQEAgLTE1MTgsNiArMTUxOCw3IEBACiAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBhdGFfc2ZmX3BvcnRfb3BzOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGF0YV9ibWRtYV9wb3J0X29wczsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBhdGFfYm1kbWEzMl9wb3J0X29wczsKIAogLyogUElPIG9ubHksIHNnX3RhYmxlc2l6ZSBhbmQgZG1hX2JvdW5kYXJ5IGxpbWl0cyBjYW4gYmUgcmVtb3ZlZCAqLwogI2RlZmluZSBBVEFfUElPX1NIVChkcnZfbmFtZSkJCQkJCVwKQEAgLTE1NDUsNiArMTU0Niw4IEBACiAJCQkJIGNvbnN0IHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmKTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgYXRhX3NmZl9kYXRhX3hmZXIoc3RydWN0IGF0YV9kZXZpY2UgKmRldiwKIAkJCXVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgaW50IGJ1ZmxlbiwgaW50IHJ3KTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgYXRhX3NmZl9kYXRhX3hmZXIzMihzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LAorCQkJdW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgYnVmbGVuLCBpbnQgcncpOwogZXh0ZXJuIHVuc2lnbmVkIGludCBhdGFfc2ZmX2RhdGFfeGZlcl9ub2lycShzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LAogCQkJdW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgYnVmbGVuLCBpbnQgcncpOwogZXh0ZXJuIHU4IGF0YV9zZmZfaXJxX29uKHN0cnVjdCBhdGFfcG9ydCAqYXApOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9saWJwczIuaCBiL2luY2x1ZGUvbGludXgvbGlicHMyLmgKaW5kZXggYWZjNDEzMy4uYjk0NTM0YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9saWJwczIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xpYnBzMi5oCkBAIC0xOCwxMSArMTgsMTMgQEAKICNkZWZpbmUgUFMyX1JFVF9JRAkJMHgwMAogI2RlZmluZSBQUzJfUkVUX0FDSwkJMHhmYQogI2RlZmluZSBQUzJfUkVUX05BSwkJMHhmZQorI2RlZmluZSBQUzJfUkVUX0VSUgkJMHhmYwogCiAjZGVmaW5lIFBTMl9GTEFHX0FDSwkJMQkvKiBXYWl0aW5nIGZvciBBQ0svTkFLICovCiAjZGVmaW5lIFBTMl9GTEFHX0NNRAkJMgkvKiBXYWl0aW5nIGZvciBjb21tYW5kIHRvIGZpbmlzaCAqLwogI2RlZmluZSBQUzJfRkxBR19DTUQxCQk0CS8qIFdhaXRpbmcgZm9yIHRoZSBmaXJzdCBieXRlIG9mIGNvbW1hbmQgcmVzcG9uc2UgKi8KICNkZWZpbmUgUFMyX0ZMQUdfV0FJVElECQk4CS8qIENvbW1hbmQgZXhlY2l0aW5nIGlzIEdFVCBJRCAqLworI2RlZmluZSBQUzJfRkxBR19OQUsJCTE2CS8qIExhc3QgdHJhbnNtaXNzaW9uIHdhcyBOQUtlZCAqLwogCiBzdHJ1Y3QgcHMyZGV2IHsKIAlzdHJ1Y3Qgc2VyaW8gKnNlcmlvOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sb2NrZC9sb2NrZC5oIGIvaW5jbHVkZS9saW51eC9sb2NrZC9sb2NrZC5oCmluZGV4IDIzZGEzZmEuLmFhNmZlNzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbG9ja2QvbG9ja2QuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xvY2tkL2xvY2tkLmgKQEAgLTQzLDggKzQzLDggQEAKIAlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZQloX2FkZHI7CQkvKiBwZWVyIGFkZHJlc3MgKi8KIAlzaXplX3QJCQloX2FkZHJsZW47CiAJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UJaF9zcmNhZGRyOwkvKiBvdXIgYWRkcmVzcyAob3B0aW9uYWwpICovCi0Jc3RydWN0IHJwY19jbG50CSoJaF9ycGNjbG50OwkvKiBSUEMgY2xpZW50IHRvIHRhbGsgdG8gcGVlciAqLwotCWNoYXIgKgkJCWhfbmFtZTsJCS8qIHJlbW90ZSBob3N0bmFtZSAqLworCXN0cnVjdCBycGNfY2xudAkJKmhfcnBjY2xudDsJLyogUlBDIGNsaWVudCB0byB0YWxrIHRvIHBlZXIgKi8KKwljaGFyCQkJKmhfbmFtZTsJCS8qIHJlbW90ZSBob3N0bmFtZSAqLwogCXUzMgkJCWhfdmVyc2lvbjsJLyogaW50ZXJmYWNlIHZlcnNpb24gKi8KIAl1bnNpZ25lZCBzaG9ydAkJaF9wcm90bzsJLyogdHJhbnNwb3J0IHByb3RvICovCiAJdW5zaWduZWQgc2hvcnQJCWhfcmVjbGFpbWluZyA6IDEsCkBAIC02NCwyMSArNjQsMjkgQEAKIAlzcGlubG9ja190CQloX2xvY2s7CiAJc3RydWN0IGxpc3RfaGVhZAloX2dyYW50ZWQ7CS8qIExvY2tzIGluIEdSQU5URUQgc3RhdGUgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCWhfcmVjbGFpbTsJLyogTG9ja3MgaW4gUkVDTEFJTSBzdGF0ZSAqLwotCXN0cnVjdCBuc21faGFuZGxlICoJaF9uc21oYW5kbGU7CS8qIE5TTSBzdGF0dXMgaGFuZGxlICovCi0KLQljaGFyCQkJaF9hZGRyYnVmWzQ4XSwJLyogYWRkcmVzcyBleWVjYXRjaGVycyAqLwotCQkJCWhfc3JjYWRkcmJ1Zls0OF07CisJc3RydWN0IG5zbV9oYW5kbGUJKmhfbnNtaGFuZGxlOwkvKiBOU00gc3RhdHVzIGhhbmRsZSAqLworCWNoYXIJCQkqaF9hZGRyYnVmOwkvKiBhZGRyZXNzIGV5ZWNhdGNoZXIgKi8KIH07CiAKKy8qCisgKiBUaGUgbGFyZ2VzdCBzdHJpbmcgc21fYWRkcmJ1ZiBzaG91bGQgaG9sZCBpcyBhIGZ1bGwtc2l6ZSBJUHY2IGFkZHJlc3MKKyAqIChubyAiOjoiIGFueXdoZXJlKSB3aXRoIGEgc2NvcGUgSUQuICBUaGUgYnVmZmVyIHNpemUgaXMgY29tcHV0ZWQgdG8KKyAqIGhvbGQgZWlnaHQgZ3JvdXBzIG9mIGNvbG9uLXNlcGFyYXRlZCBmb3VyLWhleC1kaWdpdCBudW1iZXJzLCBhCisgKiBwZXJjZW50IHNpZ24sIGEgc2NvcGUgaWQgKGF0IG1vc3QgMzIgYml0cywgaW4gZGVjaW1hbCksIGFuZCBOVUwuCisgKi8KKyNkZWZpbmUgTlNNX0FERFJCVUYJCSgoOCAqIDQgKyA3KSArICgxICsgMTApICsgMSkKKwogc3RydWN0IG5zbV9oYW5kbGUgewogCXN0cnVjdCBsaXN0X2hlYWQJc21fbGluazsKIAlhdG9taWNfdAkJc21fY291bnQ7Ci0JY2hhciAqCQkJc21fbmFtZTsKKwljaGFyCQkJKnNtX21vbl9uYW1lOworCWNoYXIJCQkqc21fbmFtZTsKIAlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZQlzbV9hZGRyOwogCXNpemVfdAkJCXNtX2FkZHJsZW47CiAJdW5zaWduZWQgaW50CQlzbV9tb25pdG9yZWQgOiAxLAogCQkJCXNtX3N0aWNreSA6IDE7CS8qIGRvbid0IHVubW9uaXRvciAqLwotCWNoYXIJCQlzbV9hZGRyYnVmWzQ4XTsJLyogYWRkcmVzcyBleWVjYXRjaGVyICovCisJc3RydWN0IG5zbV9wcml2YXRlCXNtX3ByaXY7CisJY2hhcgkJCXNtX2FkZHJidWZbTlNNX0FERFJCVUZdOwogfTsKIAogLyoKQEAgLTEwNCwxNiArMTEyLDYgQEAKIAlyZXR1cm4gKHN0cnVjdCBzb2NrYWRkciAqKSZob3N0LT5oX3NyY2FkZHI7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHNvY2thZGRyX2luICpuc21fYWRkcl9pbihjb25zdCBzdHJ1Y3QgbnNtX2hhbmRsZSAqaGFuZGxlKQotewotCXJldHVybiAoc3RydWN0IHNvY2thZGRyX2luICopJmhhbmRsZS0+c21fYWRkcjsKLX0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3Qgc29ja2FkZHIgKm5zbV9hZGRyKGNvbnN0IHN0cnVjdCBuc21faGFuZGxlICpoYW5kbGUpCi17Ci0JcmV0dXJuIChzdHJ1Y3Qgc29ja2FkZHIgKikmaGFuZGxlLT5zbV9hZGRyOwotfQotCiAvKgogICogTWFwIGFuIGZsX293bmVyX3QgaW50byBhIHVuaXF1ZSAzMi1iaXQgInBpZCIKICAqLwpAQCAtMTk3LDYgKzE5NSw3IEBACiBleHRlcm4gaW50CQkJbmxtc3ZjX2dyYWNlX3BlcmlvZDsKIGV4dGVybiB1bnNpZ25lZCBsb25nCQlubG1zdmNfdGltZW91dDsKIGV4dGVybiBpbnQJCQluc21fdXNlX2hvc3RuYW1lczsKK2V4dGVybiBpbnQJCQluc21fbG9jYWxfc3RhdGU7CiAKIC8qCiAgKiBMb2NrZCBjbGllbnQgZnVuY3Rpb25zCkBAIC0yMzEsMTAgKzIzMCwyMCBAQAogc3RydWN0IG5sbV9ob3N0ICogbmxtX2dldF9ob3N0KHN0cnVjdCBubG1faG9zdCAqKTsKIHZvaWQJCSAgbmxtX3JlbGVhc2VfaG9zdChzdHJ1Y3QgbmxtX2hvc3QgKik7CiB2b2lkCQkgIG5sbV9zaHV0ZG93bl9ob3N0cyh2b2lkKTsKLWV4dGVybiB2b2lkCSAgbmxtX2hvc3RfcmVib290ZWQoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICosIGNvbnN0IGNoYXIgKiwKLQkJCQkJdW5zaWduZWQgaW50LCB1MzIpOwotdm9pZAkJICBuc21fcmVsZWFzZShzdHJ1Y3QgbnNtX2hhbmRsZSAqKTsKK3ZvaWQJCSAgbmxtX2hvc3RfcmVib290ZWQoY29uc3Qgc3RydWN0IG5sbV9yZWJvb3QgKik7CiAKKy8qCisgKiBIb3N0IG1vbml0b3JpbmcKKyAqLworaW50CQkgIG5zbV9tb25pdG9yKGNvbnN0IHN0cnVjdCBubG1faG9zdCAqaG9zdCk7Cit2b2lkCQkgIG5zbV91bm1vbml0b3IoY29uc3Qgc3RydWN0IG5sbV9ob3N0ICpob3N0KTsKKworc3RydWN0IG5zbV9oYW5kbGUgKm5zbV9nZXRfaGFuZGxlKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwLAorCQkJCQljb25zdCBzaXplX3Qgc2FsZW4sCisJCQkJCWNvbnN0IGNoYXIgKmhvc3RuYW1lLAorCQkJCQljb25zdCBzaXplX3QgaG9zdG5hbWVfbGVuKTsKK3N0cnVjdCBuc21faGFuZGxlICpuc21fcmVib290X2xvb2t1cChjb25zdCBzdHJ1Y3QgbmxtX3JlYm9vdCAqaW5mbyk7Cit2b2lkCQkgIG5zbV9yZWxlYXNlKHN0cnVjdCBuc21faGFuZGxlICpuc20pOwogCiAvKgogICogVGhpcyBpcyB1c2VkIGluIGdhcmJhZ2UgY29sbGVjdGlvbiBhbmQgcmVzb3VyY2UgcmVjbGFpbQpAQCAtMjgyLDE2ICsyOTEsMjUgQEAKIHN0YXRpYyBpbmxpbmUgaW50IF9fbmxtX3ByaXZpbGVnZWRfcmVxdWVzdDQoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXApCiB7CiAJY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICpzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopc2FwOwotCXJldHVybiAoc2luLT5zaW5fYWRkci5zX2FkZHIgPT0gaHRvbmwoSU5BRERSX0xPT1BCQUNLKSkgJiYKLQkJCShudG9ocyhzaW4tPnNpbl9wb3J0KSA8IDEwMjQpOworCisJaWYgKG50b2hzKHNpbi0+c2luX3BvcnQpID4gMTAyMykKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gaXB2NF9pc19sb29wYmFjayhzaW4tPnNpbl9hZGRyLnNfYWRkcik7CiB9CiAKICNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKIHN0YXRpYyBpbmxpbmUgaW50IF9fbmxtX3ByaXZpbGVnZWRfcmVxdWVzdDYoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXApCiB7CiAJY29uc3Qgc3RydWN0IHNvY2thZGRyX2luNiAqc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopc2FwOwotCXJldHVybiAoaXB2Nl9hZGRyX3R5cGUoJnNpbjYtPnNpbjZfYWRkcikgJiBJUFY2X0FERFJfTE9PUEJBQ0spICYmCi0JCQkobnRvaHMoc2luNi0+c2luNl9wb3J0KSA8IDEwMjQpOworCisJaWYgKG50b2hzKHNpbjYtPnNpbjZfcG9ydCkgPiAxMDIzKQorCQlyZXR1cm4gMDsKKworCWlmIChpcHY2X2FkZHJfdHlwZSgmc2luNi0+c2luNl9hZGRyKSAmIElQVjZfQUREUl9NQVBQRUQpCisJCXJldHVybiBpcHY0X2lzX2xvb3BiYWNrKHNpbjYtPnNpbjZfYWRkci5zNl9hZGRyMzJbM10pOworCisJcmV0dXJuIGlwdjZfYWRkcl90eXBlKCZzaW42LT5zaW42X2FkZHIpICYgSVBWNl9BRERSX0xPT1BCQUNLOwogfQogI2Vsc2UJLyogZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpICovCiBzdGF0aWMgaW5saW5lIGludCBfX25sbV9wcml2aWxlZ2VkX3JlcXVlc3Q2KGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sb2NrZC9zbV9pbnRlci5oIGIvaW5jbHVkZS9saW51eC9sb2NrZC9zbV9pbnRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTU0NDhiLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvbG9ja2Qvc21faW50ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBsaW51eC9pbmNsdWRlL2xpbnV4L2xvY2tkL3NtX2ludGVyLmgKLSAqCi0gKiBEZWNsYXJhdGlvbnMgZm9yIHRoZSBrZXJuZWwgc3RhdGQgY2xpZW50LgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NiwgT2xhZiBLaXJjaCA8b2tpckBtb25hZC5zd2IuZGU+Ci0gKi8KLQotI2lmbmRlZiBMSU5VWF9MT0NLRF9TTV9JTlRFUl9ICi0jZGVmaW5lIExJTlVYX0xPQ0tEX1NNX0lOVEVSX0gKLQotI2RlZmluZSBTTV9QUk9HUkFNCTEwMDAyNAotI2RlZmluZSBTTV9WRVJTSU9OCTEKLSNkZWZpbmUgU01fU1RBVAkJMQotI2RlZmluZSBTTV9NT04JCTIKLSNkZWZpbmUgU01fVU5NT04JMwotI2RlZmluZSBTTV9VTk1PTl9BTEwJNAotI2RlZmluZSBTTV9TSU1VX0NSQVNICTUKLSNkZWZpbmUgU01fTk9USUZZCTYKLQotI2RlZmluZSBTTV9NQVhTVFJMRU4JMTAyNAotI2RlZmluZSBTTV9QUklWX1NJWkUJMTYKLQotLyoKLSAqIEFyZ3VtZW50cyBmb3IgYWxsIGNhbGxzIHRvIHN0YXRkCi0gKi8KLXN0cnVjdCBuc21fYXJncyB7Ci0JX19iZTMyCQlhZGRyOwkJLyogcmVtb3RlIGFkZHJlc3MgKi8KLQl1MzIJCXByb2c7CQkvKiBSUEMgY2FsbGJhY2sgaW5mbyAqLwotCXUzMgkJdmVyczsKLQl1MzIJCXByb2M7Ci0KLQljaGFyICoJCW1vbl9uYW1lOwotfTsKLQotLyoKLSAqIFJlc3VsdCByZXR1cm5lZCBieSBzdGF0ZAotICovCi1zdHJ1Y3QgbnNtX3JlcyB7Ci0JdTMyCQlzdGF0dXM7Ci0JdTMyCQlzdGF0ZTsKLX07Ci0KLWludAkJbnNtX21vbml0b3Ioc3RydWN0IG5sbV9ob3N0ICopOwotaW50CQluc21fdW5tb25pdG9yKHN0cnVjdCBubG1faG9zdCAqKTsKLWV4dGVybiBpbnQJbnNtX2xvY2FsX3N0YXRlOwotCi0jZW5kaWYgLyogTElOVVhfTE9DS0RfU01fSU5URVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sb2NrZC94ZHIuaCBiL2luY2x1ZGUvbGludXgvbG9ja2QveGRyLmgKaW5kZXggZDZiM2E4MC4uN2RjNWI2YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9sb2NrZC94ZHIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xvY2tkL3hkci5oCkBAIC0xMyw2ICsxMywxMyBAQAogI2luY2x1ZGUgPGxpbnV4L25mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy94ZHIuaD4KIAorI2RlZmluZSBTTV9NQVhTVFJMRU4JCTEwMjQKKyNkZWZpbmUgU01fUFJJVl9TSVpFCQkxNgorCitzdHJ1Y3QgbnNtX3ByaXZhdGUgeworCXVuc2lnbmVkIGNoYXIJCWRhdGFbU01fUFJJVl9TSVpFXTsKK307CisKIHN0cnVjdCBzdmNfcnFzdDsKIAogI2RlZmluZSBOTE1fTUFYQ09PS0lFTEVOICAgIAkzMgpAQCAtNzcsMTAgKzg0LDEwIEBACiAgKiBzdGF0ZCBjYWxsYmFjayB3aGVuIGNsaWVudCBoYXMgcmVib290ZWQKICAqLwogc3RydWN0IG5sbV9yZWJvb3QgewotCWNoYXIgKgkJbW9uOwotCXVuc2lnbmVkIGludAlsZW47Ci0JdTMyCQlzdGF0ZTsKLQlfX2JlMzIJCWFkZHI7CisJY2hhcgkJCSptb247CisJdW5zaWduZWQgaW50CQlsZW47CisJdTMyCQkJc3RhdGU7CisJc3RydWN0IG5zbV9wcml2YXRlCXByaXY7CiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tYWdpYy5oIGIvaW5jbHVkZS9saW51eC9tYWdpYy5oCmluZGV4IGY3ZjNmZGQuLjQzOWY2ZjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWFnaWMuaAorKysgYi9pbmNsdWRlL2xpbnV4L21hZ2ljLmgKQEAgLTEzLDYgKzEzLDcgQEAKICNkZWZpbmUgRUZTX1NVUEVSX01BR0lDCQkweDQxNEE1MwogI2RlZmluZSBFWFQyX1NVUEVSX01BR0lDCTB4RUY1MwogI2RlZmluZSBFWFQzX1NVUEVSX01BR0lDCTB4RUY1MworI2RlZmluZSBYRU5GU19TVVBFUl9NQUdJQwkweGFiYmExOTc0CiAjZGVmaW5lIEVYVDRfU1VQRVJfTUFHSUMJMHhFRjUzCiAjZGVmaW5lIEhQRlNfU1VQRVJfTUFHSUMJMHhmOTk1ZTg0OQogI2RlZmluZSBJU09GU19TVVBFUl9NQUdJQwkweDk2NjAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWFwX3RvXzdzZWdtZW50LmggYi9pbmNsdWRlL2xpbnV4L21hcF90b183c2VnbWVudC5oCmluZGV4IDdkZjg0MzIuLjEyZDYyYTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWFwX3RvXzdzZWdtZW50LmgKKysrIGIvaW5jbHVkZS9saW51eC9tYXBfdG9fN3NlZ21lbnQuaApAQCAtNzUsNyArNzUsNyBAQAogCXVuc2lnbmVkIGNoYXIJdGFibGVbMTI4XTsKIH07CiAKLXN0YXRpYyBpbmxpbmUgaW50IG1hcF90b19zZWc3KHN0cnVjdCBzZWc3X2NvbnZlcnNpb25fbWFwICptYXAsIGludCBjKQorc3RhdGljIF9faW5saW5lX18gaW50IG1hcF90b19zZWc3KHN0cnVjdCBzZWc3X2NvbnZlcnNpb25fbWFwICptYXAsIGludCBjKQogewogCXJldHVybiBjID49IDAgJiYgYyA8IHNpemVvZihtYXAtPnRhYmxlKSA/IG1hcC0+dGFibGVbY10gOiAtRUlOVkFMOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmggYi9pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaAppbmRleCAxZmJlMTRkLi4zMjZmNDVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaAorKysgYi9pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaApAQCAtMTksMjIgKzE5LDQ1IEBACiAKICNpZm5kZWYgX0xJTlVYX01FTUNPTlRST0xfSAogI2RlZmluZSBfTElOVVhfTUVNQ09OVFJPTF9ICi0KKyNpbmNsdWRlIDxsaW51eC9jZ3JvdXAuaD4KIHN0cnVjdCBtZW1fY2dyb3VwOwogc3RydWN0IHBhZ2VfY2dyb3VwOwogc3RydWN0IHBhZ2U7CiBzdHJ1Y3QgbW1fc3RydWN0OwogCiAjaWZkZWYgQ09ORklHX0NHUk9VUF9NRU1fUkVTX0NUTFIKKy8qCisgKiBBbGwgImNoYXJnZSIgZnVuY3Rpb25zIHdpdGggZ2ZwX21hc2sgc2hvdWxkIHVzZSBHRlBfS0VSTkVMIG9yCisgKiAoZ2ZwX21hc2sgJiBHRlBfUkVDTEFJTV9NQVNLKS4gSW4gY3VycmVudCBpbXBsZW1lbnRhdGluLCBtZW1jZyBkb2Vzbid0CisgKiBhbGxvYyBtZW1vcnkgYnV0IHJlY2xhaW1zIG1lbW9yeSBmcm9tIGFsbCBhdmFpbGFibGUgem9uZXMuIFNvLCAid2hlcmUgSSB3YW50CisgKiBtZW1vcnkgZnJvbSIgYml0cyBvZiBnZnBfbWFzayBoYXMgbm8gbWVhbmluZy4gU28gYW55IGJpdHMgb2YgdGhhdCBmaWVsZCBpcworICogYXZhaWxhYmxlIGJ1dCBhZGRpbmcgYSBydWxlIGlzIGJldHRlci4gY2hhcmdlIGZ1bmN0aW9ucycgZ2ZwX21hc2sgc2hvdWxkCisgKiBiZSBzZXQgdG8gR0ZQX0tFUk5FTCBvciBnZnBfbWFzayAmIEdGUF9SRUNMQUlNX01BU0sgZm9yIGF2b2lkaW5nIGFtYmlndW91cworICogY29kZXMuCisgKiAoT2YgY291cnNlLCBpZiBtZW1jZyBkb2VzIG1lbW9yeSBhbGxvY2F0aW9uIGluIGZ1dHVyZSwgR0ZQX0tFUk5FTCBpcyBzYW5lLikKKyAqLwogCi1leHRlcm4gaW50IG1lbV9jZ3JvdXBfY2hhcmdlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSwKK2V4dGVybiBpbnQgbWVtX2Nncm91cF9uZXdwYWdlX2NoYXJnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCQkJZ2ZwX3QgZ2ZwX21hc2spOworLyogZm9yIHN3YXAgaGFuZGxpbmcgKi8KK2V4dGVybiBpbnQgbWVtX2Nncm91cF90cnlfY2hhcmdlX3N3YXBpbihzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJc3RydWN0IHBhZ2UgKnBhZ2UsIGdmcF90IG1hc2ssIHN0cnVjdCBtZW1fY2dyb3VwICoqcHRyKTsKK2V4dGVybiB2b2lkIG1lbV9jZ3JvdXBfY29tbWl0X2NoYXJnZV9zd2FwaW4oc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJCXN0cnVjdCBtZW1fY2dyb3VwICpwdHIpOworZXh0ZXJuIHZvaWQgbWVtX2Nncm91cF9jYW5jZWxfY2hhcmdlX3N3YXBpbihzdHJ1Y3QgbWVtX2Nncm91cCAqcHRyKTsKKwogZXh0ZXJuIGludCBtZW1fY2dyb3VwX2NhY2hlX2NoYXJnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCQkJCWdmcF90IGdmcF9tYXNrKTsKLWV4dGVybiB2b2lkIG1lbV9jZ3JvdXBfbW92ZV9saXN0cyhzdHJ1Y3QgcGFnZSAqcGFnZSwgZW51bSBscnVfbGlzdCBscnUpOworZXh0ZXJuIHZvaWQgbWVtX2Nncm91cF9hZGRfbHJ1X2xpc3Qoc3RydWN0IHBhZ2UgKnBhZ2UsIGVudW0gbHJ1X2xpc3QgbHJ1KTsKK2V4dGVybiB2b2lkIG1lbV9jZ3JvdXBfZGVsX2xydV9saXN0KHN0cnVjdCBwYWdlICpwYWdlLCBlbnVtIGxydV9saXN0IGxydSk7CitleHRlcm4gdm9pZCBtZW1fY2dyb3VwX3JvdGF0ZV9scnVfbGlzdChzdHJ1Y3QgcGFnZSAqcGFnZSwgZW51bSBscnVfbGlzdCBscnUpOworZXh0ZXJuIHZvaWQgbWVtX2Nncm91cF9kZWxfbHJ1KHN0cnVjdCBwYWdlICpwYWdlKTsKK2V4dGVybiB2b2lkIG1lbV9jZ3JvdXBfbW92ZV9saXN0cyhzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQkgIGVudW0gbHJ1X2xpc3QgZnJvbSwgZW51bSBscnVfbGlzdCB0byk7CiBleHRlcm4gdm9pZCBtZW1fY2dyb3VwX3VuY2hhcmdlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpOwogZXh0ZXJuIHZvaWQgbWVtX2Nncm91cF91bmNoYXJnZV9jYWNoZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKTsKLWV4dGVybiBpbnQgbWVtX2Nncm91cF9zaHJpbmtfdXNhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIGdmcF90IGdmcF9tYXNrKTsKK2V4dGVybiBpbnQgbWVtX2Nncm91cF9zaHJpbmtfdXNhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQlzdHJ1Y3QgbW1fc3RydWN0ICptbSwgZ2ZwX3QgZ2ZwX21hc2spOwogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBtZW1fY2dyb3VwX2lzb2xhdGVfcGFnZXModW5zaWduZWQgbG9uZyBucl90b19zY2FuLAogCQkJCQlzdHJ1Y3QgbGlzdF9oZWFkICpkc3QsCkBAIC00NywxMiArNzAsMjAgQEAKIAogZXh0ZXJuIHN0cnVjdCBtZW1fY2dyb3VwICptZW1fY2dyb3VwX2Zyb21fdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOwogCi0jZGVmaW5lIG1tX21hdGNoX2Nncm91cChtbSwgY2dyb3VwKQlcCi0JKChjZ3JvdXApID09IG1lbV9jZ3JvdXBfZnJvbV90YXNrKChtbSktPm93bmVyKSkKK3N0YXRpYyBpbmxpbmUKK2ludCBtbV9tYXRjaF9jZ3JvdXAoY29uc3Qgc3RydWN0IG1tX3N0cnVjdCAqbW0sIGNvbnN0IHN0cnVjdCBtZW1fY2dyb3VwICpjZ3JvdXApCit7CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbTsKKwlyY3VfcmVhZF9sb2NrKCk7CisJbWVtID0gbWVtX2Nncm91cF9mcm9tX3Rhc2soKG1tKS0+b3duZXIpOworCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiBjZ3JvdXAgPT0gbWVtOworfQogCiBleHRlcm4gaW50Ci1tZW1fY2dyb3VwX3ByZXBhcmVfbWlncmF0aW9uKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgcGFnZSAqbmV3cGFnZSk7Ci1leHRlcm4gdm9pZCBtZW1fY2dyb3VwX2VuZF9taWdyYXRpb24oc3RydWN0IHBhZ2UgKnBhZ2UpOworbWVtX2Nncm91cF9wcmVwYXJlX21pZ3JhdGlvbihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IG1lbV9jZ3JvdXAgKipwdHIpOworZXh0ZXJuIHZvaWQgbWVtX2Nncm91cF9lbmRfbWlncmF0aW9uKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCisJc3RydWN0IHBhZ2UgKm9sZHBhZ2UsIHN0cnVjdCBwYWdlICpuZXdwYWdlKTsKIAogLyoKICAqIEZvciBtZW1vcnkgcmVjbGFpbS4KQEAgLTY1LDEzICs5NiwzMiBAQAogCQkJCQkJCWludCBwcmlvcml0eSk7CiBleHRlcm4gdm9pZCBtZW1fY2dyb3VwX3JlY29yZF9yZWNsYWltX3ByaW9yaXR5KHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCiAJCQkJCQkJaW50IHByaW9yaXR5KTsKK2ludCBtZW1fY2dyb3VwX2luYWN0aXZlX2Fub25faXNfbG93KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyk7Cit1bnNpZ25lZCBsb25nIG1lbV9jZ3JvdXBfem9uZV9ucl9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCisJCQkJICAgICAgIHN0cnVjdCB6b25lICp6b25lLAorCQkJCSAgICAgICBlbnVtIGxydV9saXN0IGxydSk7CitzdHJ1Y3Qgem9uZV9yZWNsYWltX3N0YXQgKm1lbV9jZ3JvdXBfZ2V0X3JlY2xhaW1fc3RhdChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCisJCQkJCQkgICAgICBzdHJ1Y3Qgem9uZSAqem9uZSk7CitzdHJ1Y3Qgem9uZV9yZWNsYWltX3N0YXQqCittZW1fY2dyb3VwX2dldF9yZWNsYWltX3N0YXRfZnJvbV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKTsKIAotZXh0ZXJuIGxvbmcgbWVtX2Nncm91cF9jYWxjX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwgc3RydWN0IHpvbmUgKnpvbmUsCi0JCQkJCWludCBwcmlvcml0eSwgZW51bSBscnVfbGlzdCBscnUpOworI2lmZGVmIENPTkZJR19DR1JPVVBfTUVNX1JFU19DVExSX1NXQVAKK2V4dGVybiBpbnQgZG9fc3dhcF9hY2NvdW50OworI2VuZGlmCiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBtZW1fY2dyb3VwX2Rpc2FibGVkKHZvaWQpCit7CisJaWYgKG1lbV9jZ3JvdXBfc3Vic3lzLmRpc2FibGVkKQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK2V4dGVybiBib29sIG1lbV9jZ3JvdXBfb29tX2NhbGxlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spOwogCiAjZWxzZSAvKiBDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUiAqLwotc3RhdGljIGlubGluZSBpbnQgbWVtX2Nncm91cF9jaGFyZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsCitzdHJ1Y3QgbWVtX2Nncm91cDsKKworc3RhdGljIGlubGluZSBpbnQgbWVtX2Nncm91cF9uZXdwYWdlX2NoYXJnZShzdHJ1Y3QgcGFnZSAqcGFnZSwKIAkJCQkJc3RydWN0IG1tX3N0cnVjdCAqbW0sIGdmcF90IGdmcF9tYXNrKQogewogCXJldHVybiAwOwpAQCAtODMsNiArMTMzLDIxIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IG1lbV9jZ3JvdXBfdHJ5X2NoYXJnZV9zd2FwaW4oc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCXN0cnVjdCBwYWdlICpwYWdlLCBnZnBfdCBnZnBfbWFzaywgc3RydWN0IG1lbV9jZ3JvdXAgKipwdHIpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZW1fY2dyb3VwX2NvbW1pdF9jaGFyZ2Vfc3dhcGluKHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCQkgIHN0cnVjdCBtZW1fY2dyb3VwICpwdHIpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZW1fY2dyb3VwX2NhbmNlbF9jaGFyZ2Vfc3dhcGluKHN0cnVjdCBtZW1fY2dyb3VwICpwdHIpCit7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBtZW1fY2dyb3VwX3VuY2hhcmdlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiB9CkBAIC05MSwxMiArMTU2LDMzIEBACiB7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IG1lbV9jZ3JvdXBfc2hyaW5rX3VzYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBnZnBfdCBnZnBfbWFzaykKK3N0YXRpYyBpbmxpbmUgaW50IG1lbV9jZ3JvdXBfc2hyaW5rX3VzYWdlKHN0cnVjdCBwYWdlICpwYWdlLAorCQkJc3RydWN0IG1tX3N0cnVjdCAqbW0sIGdmcF90IGdmcF9tYXNrKQogewogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgbWVtX2Nncm91cF9tb3ZlX2xpc3RzKHN0cnVjdCBwYWdlICpwYWdlLCBib29sIGFjdGl2ZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZW1fY2dyb3VwX2FkZF9scnVfbGlzdChzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IGxydSkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1lbV9jZ3JvdXBfZGVsX2xydV9saXN0KHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgbHJ1KQoreworCXJldHVybiA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZW1fY2dyb3VwX3JvdGF0ZV9scnVfbGlzdChzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IGxydSkKK3sKKwlyZXR1cm4gOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWVtX2Nncm91cF9kZWxfbHJ1KHN0cnVjdCBwYWdlICpwYWdlKQoreworCXJldHVybiA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorbWVtX2Nncm91cF9tb3ZlX2xpc3RzKHN0cnVjdCBwYWdlICpwYWdlLCBlbnVtIGxydV9saXN0IGZyb20sIGVudW0gbHJ1X2xpc3QgdG8pCiB7CiB9CiAKQEAgLTExMiwxMiArMTk4LDE0IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1tZW1fY2dyb3VwX3ByZXBhcmVfbWlncmF0aW9uKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgcGFnZSAqbmV3cGFnZSkKK21lbV9jZ3JvdXBfcHJlcGFyZV9taWdyYXRpb24oc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBtZW1fY2dyb3VwICoqcHRyKQogewogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgbWVtX2Nncm91cF9lbmRfbWlncmF0aW9uKHN0cnVjdCBwYWdlICpwYWdlKQorc3RhdGljIGlubGluZSB2b2lkIG1lbV9jZ3JvdXBfZW5kX21pZ3JhdGlvbihzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLAorCQkJCQlzdHJ1Y3QgcGFnZSAqb2xkcGFnZSwKKwkJCQkJc3RydWN0IHBhZ2UgKm5ld3BhZ2UpCiB7CiB9CiAKQEAgLTE0NiwxMiArMjM0LDQyIEBACiB7CiB9CiAKLXN0YXRpYyBpbmxpbmUgbG9uZyBtZW1fY2dyb3VwX2NhbGNfcmVjbGFpbShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLAotCQkJCQlzdHJ1Y3Qgem9uZSAqem9uZSwgaW50IHByaW9yaXR5LAotCQkJCQllbnVtIGxydV9saXN0IGxydSkKK3N0YXRpYyBpbmxpbmUgYm9vbCBtZW1fY2dyb3VwX2Rpc2FibGVkKHZvaWQpCit7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBtZW1fY2dyb3VwX29vbV9jYWxsZWQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQoreworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK21lbV9jZ3JvdXBfaW5hY3RpdmVfYW5vbl9pc19sb3coc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQoreworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKK21lbV9jZ3JvdXBfem9uZV9ucl9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIHN0cnVjdCB6b25lICp6b25lLAorCQkJIGVudW0gbHJ1X2xpc3QgbHJ1KQogewogCXJldHVybiAwOwogfQorCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHpvbmVfcmVjbGFpbV9zdGF0KgorbWVtX2Nncm91cF9nZXRfcmVjbGFpbV9zdGF0KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgc3RydWN0IHpvbmUgKnpvbmUpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHpvbmVfcmVjbGFpbV9zdGF0KgorbWVtX2Nncm91cF9nZXRfcmVjbGFpbV9zdGF0X2Zyb21fcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKwogI2VuZGlmIC8qIENPTkZJR19DR1JPVVBfTUVNX0NPTlQgKi8KIAogI2VuZGlmIC8qIF9MSU5VWF9NRU1DT05UUk9MX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWVtb3J5LmggYi9pbmNsdWRlL2xpbnV4L21lbW9yeS5oCmluZGV4IDM2YzgyYzkuLjNmZGMxMDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWVtb3J5LmgKKysrIGIvaW5jbHVkZS9saW51eC9tZW1vcnkuaApAQCAtNzksMTQgKzc5LDE0IEBACiAjZWxzZQogZXh0ZXJuIGludCByZWdpc3Rlcl9tZW1vcnlfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7CiBleHRlcm4gdm9pZCB1bnJlZ2lzdGVyX21lbW9yeV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKTsKLWV4dGVybiBpbnQgcmVnaXN0ZXJfbmV3X21lbW9yeShzdHJ1Y3QgbWVtX3NlY3Rpb24gKik7CitleHRlcm4gaW50IHJlZ2lzdGVyX25ld19tZW1vcnkoaW50LCBzdHJ1Y3QgbWVtX3NlY3Rpb24gKik7CiBleHRlcm4gaW50IHVucmVnaXN0ZXJfbWVtb3J5X3NlY3Rpb24oc3RydWN0IG1lbV9zZWN0aW9uICopOwogZXh0ZXJuIGludCBtZW1vcnlfZGV2X2luaXQodm9pZCk7CiBleHRlcm4gaW50IHJlbW92ZV9tZW1vcnlfYmxvY2sodW5zaWduZWQgbG9uZywgc3RydWN0IG1lbV9zZWN0aW9uICosIGludCk7CiBleHRlcm4gaW50IG1lbW9yeV9ub3RpZnkodW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKnYpOworZXh0ZXJuIHN0cnVjdCBtZW1vcnlfYmxvY2sgKmZpbmRfbWVtb3J5X2Jsb2NrKHN0cnVjdCBtZW1fc2VjdGlvbiAqKTsKICNkZWZpbmUgQ09ORklHX01FTV9CTE9DS19TSVpFCShQQUdFU19QRVJfU0VDVElPTjw8UEFHRV9TSElGVCkKLQotCitlbnVtIG1lbV9hZGRfY29udGV4dCB7IEJPT1QsIEhPVFBMVUcgfTsKICNlbmRpZiAvKiBDT05GSUdfTUVNT1JZX0hPVFBMVUdfU1BBUlNFICovCiAKICNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFBMVUcKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWVtb3J5X2hvdHBsdWcuaCBiL2luY2x1ZGUvbGludXgvbWVtb3J5X2hvdHBsdWcuaAppbmRleCA3NjNiYTgxLi5kOTVmNzJlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21lbW9yeV9ob3RwbHVnLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oCkBAIC03Miw3ICs3Miw3IEBACiBleHRlcm4gaW50IG9mZmxpbmVfcGFnZXModW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7CiAKIC8qIHJlYXNvbmFibHkgZ2VuZXJpYyBpbnRlcmZhY2UgdG8gZXhwYW5kIHRoZSBwaHlzaWNhbCBwYWdlcyBpbiBhIHpvbmUgICovCi1leHRlcm4gaW50IF9fYWRkX3BhZ2VzKHN0cnVjdCB6b25lICp6b25lLCB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwKK2V4dGVybiBpbnQgX19hZGRfcGFnZXMoaW50IG5pZCwgc3RydWN0IHpvbmUgKnpvbmUsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLAogCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpOwogZXh0ZXJuIGludCBfX3JlbW92ZV9wYWdlcyhzdHJ1Y3Qgem9uZSAqem9uZSwgdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sCiAJdW5zaWduZWQgbG9uZyBucl9wYWdlcyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC9kYTkwM3guaCBiL2luY2x1ZGUvbGludXgvbWZkL2RhOTAzeC5oCmluZGV4IGNhZDMxNGMuLjExNWRiZTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL2RhOTAzeC5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL2RhOTAzeC5oCkBAIC0zMiw2ICszMiw3IEBACiAJREE5MDMwX0lEX0xETzE4LAogCURBOTAzMF9JRF9MRE8xOSwKIAlEQTkwMzBfSURfTERPX0lOVCwJLyogTERPIEludGVybmFsICovCisJREE5MDMwX0lEX0JBVCwJCS8qIGJhdHRlcnkgY2hhcmdlciAqLwogCiAJREE5MDM0X0lEX0xFRF8xLAogCURBOTAzNF9JRF9MRURfMiwKQEAgLTkzLDYgKzk0LDQzIEBACiAJaW50CXlfaW52ZXJ0ZWQ7CiB9OwogCisvKiBEQTkwMzAgYmF0dGVyeSBjaGFyZ2VyIGRhdGEgKi8KK3N0cnVjdCBwb3dlcl9zdXBwbHlfaW5mbzsKKworc3RydWN0IGRhOTAzMF9iYXR0ZXJ5X2luZm8geworCS8qIGJhdHRlcnkgcGFyYW1ldGVycyAqLworCXN0cnVjdCBwb3dlcl9zdXBwbHlfaW5mbyAqYmF0dGVyeV9pbmZvOworCisJLyogY3VycmVudCBhbmQgdm9sdGFnZSB0byB1c2UgZm9yIGJhdHRlcnkgY2hhcmdpbmcgKi8KKwl1bnNpZ25lZCBpbnQgY2hhcmdlX21pbGxpYW1wOworCXVuc2lnbmVkIGludCBjaGFyZ2VfbWlsbGl2b2x0OworCisJLyogdm9sdGFnZSB0aHJlc2hvbGRzIChpbiBtaWxsaXZvbHRzKSAqLworCWludCB2YmF0X2xvdzsKKwlpbnQgdmJhdF9jcml0OworCWludCB2YmF0X2NoYXJnZV9zdGFydDsKKwlpbnQgdmJhdF9jaGFyZ2Vfc3RvcDsKKwlpbnQgdmJhdF9jaGFyZ2VfcmVzdGFydDsKKworCS8qIGJhdHRlcnkgbm9taW5hbCBtaW5pbWFsIGFuZCBtYXhpbWFsIHZvbHRhZ2VzIGluIG1pbGxpdm9sdHMgKi8KKwlpbnQgdmNoYXJnZV9taW47CisJaW50IHZjaGFyZ2VfbWF4OworCisJLyogVGVtcGVyYXR1cmUgdGhyZXNob2xkcy4gVGhlc2UgYXJlIERBOTAzMCByZWdpc3RlciB2YWx1ZXMKKwkgICAiYXMgaXMiIGFuZCBzaG91bGQgYmUgbWVhc3VyZWQgZm9yIGVhY2ggYmF0dGVyeSB0eXBlICovCisJaW50IHRiYXRfbG93OworCWludCB0YmF0X2hpZ2g7CisJaW50IHRiYXRfcmVzdGFydDsKKworCisJLyogYmF0dGVyeSBtb25pdG9yIGludGVydmFsIChzZWNvbmRzKSAqLworCXVuc2lnbmVkIGludCBiYXRtb25faW50ZXJ2YWw7CisKKwkvKiBwbGF0Zm9ybSBjYWxsYmFja3MgZm9yIGJhdHRlcnkgbG93IGFuZCBjcml0aWNhbCBldmVudHMgKi8KKwl2b2lkICgqYmF0dGVyeV9sb3cpKHZvaWQpOworCXZvaWQgKCpiYXR0ZXJ5X2NyaXRpY2FsKSh2b2lkKTsKK307CisKIHN0cnVjdCBkYTkwM3hfc3ViZGV2X2luZm8gewogCWludAkJaWQ7CiAJY29uc3QgY2hhcgkqbmFtZTsKQEAgLTE5MCwxMSArMjI4LDEzIEBACiBleHRlcm4gaW50IGRhOTAzeF9xdWVyeV9zdGF0dXMoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgc3RhdHVzKTsKIAogCi0vKiBOT1RFOiB0aGUgdHdvIGZ1bmN0aW9ucyBiZWxvdyBhcmUgbm90IGludGVuZGVkIGZvciB1c2Ugb3V0c2lkZQotICogb2YgdGhlIERBOTAzNCBzdWItZGV2aWNlIGRyaXZlcnMKKy8qIE5PVEU6IHRoZSBmdW5jdGlvbnMgYmVsb3cgYXJlIG5vdCBpbnRlbmRlZCBmb3IgdXNlIG91dHNpZGUKKyAqIG9mIHRoZSBEQTkwM3ggc3ViLWRldmljZSBkcml2ZXJzCiAgKi8KIGV4dGVybiBpbnQgZGE5MDN4X3dyaXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHJlZywgdWludDhfdCB2YWwpOworZXh0ZXJuIGludCBkYTkwM3hfd3JpdGVzKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHJlZywgaW50IGxlbiwgdWludDhfdCAqdmFsKTsKIGV4dGVybiBpbnQgZGE5MDN4X3JlYWQoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgcmVnLCB1aW50OF90ICp2YWwpOworZXh0ZXJuIGludCBkYTkwM3hfcmVhZHMoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgcmVnLCBpbnQgbGVuLCB1aW50OF90ICp2YWwpOwogZXh0ZXJuIGludCBkYTkwM3hfdXBkYXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHJlZywgdWludDhfdCB2YWwsIHVpbnQ4X3QgbWFzayk7CiBleHRlcm4gaW50IGRhOTAzeF9zZXRfYml0cyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCByZWcsIHVpbnQ4X3QgYml0X21hc2spOwogZXh0ZXJuIGludCBkYTkwM3hfY2xyX2JpdHMoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgcmVnLCB1aW50OF90IGJpdF9tYXNrKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3dtODM1MC9jb21wYXJhdG9yLmggYi9pbmNsdWRlL2xpbnV4L21mZC93bTgzNTAvY29tcGFyYXRvci5oCmluZGV4IDA1Mzc4ODYuLjU0YmM1ZDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL3dtODM1MC9jb21wYXJhdG9yLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvd204MzUwL2NvbXBhcmF0b3IuaApAQCAtMTY0LDQgKzE2NCwxMiBAQAogI2RlZmluZSBXTTgzNTBfQVVYQURDX0JBVFQJCQk2CiAjZGVmaW5lIFdNODM1MF9BVVhBRENfVEVNUAkJCTcKIAorc3RydWN0IHdtODM1MDsKKworLyoKKyAqIEFVWCBBREMgUmVhZGJhY2sKKyAqLworaW50IHdtODM1MF9yZWFkX2F1eGFkYyhzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGludCBjaGFubmVsLCBpbnQgc2NhbGUsCisJCSAgICAgICBpbnQgdnJlZik7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvd204MzUwL2NvcmUuaCBiL2luY2x1ZGUvbGludXgvbWZkL3dtODM1MC9jb3JlLmgKaW5kZXggNmViZjk3Zi4uOTgwNjY5ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvd204MzUwL2NvcmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC93bTgzNTAvY29yZS5oCkBAIC0yOSw2ICsyOSw3IEBACiAgKi8KICNkZWZpbmUgV004MzUwX1JFU0VUX0lEICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAKICNkZWZpbmUgV004MzUwX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgV004MzUwX1JFVklTSU9OCQkJCTB4MDIKICNkZWZpbmUgV004MzUwX1NZU1RFTV9DT05UUk9MXzEgICAgICAgICAgICAgICAgIDB4MDMKICNkZWZpbmUgV004MzUwX1NZU1RFTV9DT05UUk9MXzIgICAgICAgICAgICAgICAgIDB4MDQKICNkZWZpbmUgV004MzUwX1NZU1RFTV9ISUJFUk5BVEUgICAgICAgICAgICAgICAgIDB4MDUKQEAgLTU3LDYgKzU4LDEwIEBACiAjZGVmaW5lIFdNODM1MF9PVkVSX0NVUlJFTlRfSU5UX1NUQVRVU19NQVNLICAgICAweDI1CiAjZGVmaW5lIFdNODM1MF9HUElPX0lOVF9TVEFUVVNfTUFTSyAgICAgICAgICAgICAweDI2CiAjZGVmaW5lIFdNODM1MF9DT01QQVJBVE9SX0lOVF9TVEFUVVNfTUFTSyAgICAgICAweDI3CisjZGVmaW5lIFdNODM1MF9DSEFSR0VSX09WRVJSSURFUwkJMHhFMgorI2RlZmluZSBXTTgzNTBfTUlTQ19PVkVSUklERVMJCQkweEUzCisjZGVmaW5lIFdNODM1MF9DT01QQVJBVE9SX09WRVJSSURFUwkJMHhFNworI2RlZmluZSBXTTgzNTBfU1RBVEVfTUFDSElORV9TVEFUVVMJCTB4RTkKIAogI2RlZmluZSBXTTgzNTBfTUFYX1JFR0lTVEVSICAgICAgICAgICAgICAgICAgICAgMHhGRgogCkBAIC03Nyw2ICs4MiwxMSBAQAogI2RlZmluZSBXTTgzNTBfQ1VTVF9JRF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMEZGCiAKIC8qCisgKiBSMiAoMHgwMikgLSBSZXZpc2lvbgorICovCisjZGVmaW5lIFdNODM1MF9NQVNLX1JFVl9NQVNLCQkJMHgwMEZGCisKKy8qCiAgKiBSMyAoMHgwMykgLSBTeXN0ZW0gQ29udHJvbCAxCiAgKi8KICNkZWZpbmUgV004MzUwX0NISVBfT04gICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMApAQCAtNTIzLDYgKzUzMywzNSBAQAogI2RlZmluZSBXTTgzNTBfREMyX1NUUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCiAjZGVmaW5lIFdNODM1MF9EQzFfU1RTICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKIAorLyoKKyAqIFIyMjYgKDB4RTIpIC0gQ2hhcmdlciBzdGF0dXMKKyAqLworI2RlZmluZSBXTTgzNTBfQ0hHX0JBVFRfSE9UX09WUkRFCQkweDgwMDAKKyNkZWZpbmUgV004MzUwX0NIR19CQVRUX0NPTERfT1ZSREUJCTB4NDAwMAorCisvKgorICogUjIyNyAoMHhFMykgLSBNaXNjIE92ZXJyaWRlcworICovCisjZGVmaW5lIFdNODM1MF9VU0JfTElNSVRfT1ZSREUJCQkweDA0MDAKKworLyoKKyAqIFIyMjcgKDB4RTcpIC0gQ29tcGFyYXRvciBPdmVycmlkZXMKKyAqLworI2RlZmluZSBXTTgzNTBfVVNCX0ZCX09WUkRFCQkJMHg4MDAwCisjZGVmaW5lIFdNODM1MF9XQUxMX0ZCX09WUkRFCQkJMHg0MDAwCisjZGVmaW5lIFdNODM1MF9CQVRUX0ZCX09WUkRFCQkJMHgyMDAwCisKKworLyoKKyAqIFIyMzMgKDB4RTkpIC0gU3RhdGUgTWFjaGluaW5lIFN0YXR1cworICovCisjZGVmaW5lIFdNODM1MF9VU0JfU01fTUFTSwkJCTB4MDcwMAorI2RlZmluZSBXTTgzNTBfVVNCX1NNX1NISUZUCQkJOAorCisjZGVmaW5lIFdNODM1MF9VU0JfU01fMTAwX1NMViAgIDEKKyNkZWZpbmUgV004MzUwX1VTQl9TTV81MDBfU0xWICAgNQorI2RlZmluZSBXTTgzNTBfVVNCX1NNX1NUREJZX1NMViA3CisKIC8qIFdNODM1MCB3YWtlIHVwIGNvbmRpdGlvbnMgKi8KICNkZWZpbmUgV004MzUwX0lSUV9XS1VQX09GRl9TVEFURQkJNDMKICNkZWZpbmUgV004MzUwX0lSUV9XS1VQX0hJQl9TVEFURQkJNDQKQEAgLTUzNiw2ICs1NzUsNyBAQAogI2RlZmluZSBXTTgzNTBfUkVWX0UJCQkJMHg0CiAjZGVmaW5lIFdNODM1MF9SRVZfRgkJCQkweDUKICNkZWZpbmUgV004MzUwX1JFVl9HCQkJCTB4NgorI2RlZmluZSBXTTgzNTBfUkVWX0gJCQkJMHg3CiAKICNkZWZpbmUgV004MzUwX05VTV9JUlEJCQkJNjMKIApAQCAtNTQ5LDYgKzU4OSwxNCBAQAogZXh0ZXJuIGNvbnN0IHUxNiB3bTgzNTBfbW9kZTFfZGVmYXVsdHNbXTsKIGV4dGVybiBjb25zdCB1MTYgd204MzUwX21vZGUyX2RlZmF1bHRzW107CiBleHRlcm4gY29uc3QgdTE2IHdtODM1MF9tb2RlM19kZWZhdWx0c1tdOworZXh0ZXJuIGNvbnN0IHUxNiB3bTgzNTFfbW9kZTBfZGVmYXVsdHNbXTsKK2V4dGVybiBjb25zdCB1MTYgd204MzUxX21vZGUxX2RlZmF1bHRzW107CitleHRlcm4gY29uc3QgdTE2IHdtODM1MV9tb2RlMl9kZWZhdWx0c1tdOworZXh0ZXJuIGNvbnN0IHUxNiB3bTgzNTFfbW9kZTNfZGVmYXVsdHNbXTsKK2V4dGVybiBjb25zdCB1MTYgd204MzUyX21vZGUwX2RlZmF1bHRzW107CitleHRlcm4gY29uc3QgdTE2IHdtODM1Ml9tb2RlMV9kZWZhdWx0c1tdOworZXh0ZXJuIGNvbnN0IHUxNiB3bTgzNTJfbW9kZTJfZGVmYXVsdHNbXTsKK2V4dGVybiBjb25zdCB1MTYgd204MzUyX21vZGUzX2RlZmF1bHRzW107CiAKIHN0cnVjdCB3bTgzNTA7CiAKQEAgLTU1OCw4ICs2MDYsNiBAQAogfTsKIAogc3RydWN0IHdtODM1MCB7Ci0JaW50IHJldjsJCS8qIGNoaXAgcmV2aXNpb24gKi8KLQogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAogCS8qIGRldmljZSBJTyAqLwpAQCAtNTcyLDYgKzYxOCw4IEBACiAJCQkgdm9pZCAqc3JjKTsKIAl1MTYgKnJlZ19jYWNoZTsKIAorCXN0cnVjdCBtdXRleCBhdXhhZGNfbXV0ZXg7CisKIAkvKiBJbnRlcnJ1cHQgaGFuZGxpbmcgKi8KIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgaXJxX3dvcms7CiAJc3RydWN0IG11dGV4IGlycV9tdXRleDsgLyogSVJRIHRhYmxlIG11dGV4ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC93bTgzNTAvcG1pYy5oIGIvaW5jbHVkZS9saW51eC9tZmQvd204MzUwL3BtaWMuaAppbmRleCA2OWI2OWUwLi45NmFjYmZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC93bTgzNTAvcG1pYy5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3dtODM1MC9wbWljLmgKQEAgLTcwMSw2ICs3MDEsMTAgQEAKIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhOwogCiBzdHJ1Y3Qgd204MzUwX3BtaWMgeworCS8qIE51bWJlciBvZiByZWd1bGF0b3JzIG9mIGVhY2ggdHlwZSBvbiB0aGlzIGRldmljZSAqLworCWludCBtYXhfZGNkYzsKKwlpbnQgbWF4X2lzaW5rOworCiAJLyogSVNJTksgdG8gRENEQyBtYXBwaW5nICovCiAJaW50IGlzaW5rX0FfZGNkYzsKIAlpbnQgaXNpbmtfQl9kY2RjOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvd204MzUwL3N1cHBseS5oIGIvaW5jbHVkZS9saW51eC9tZmQvd204MzUwL3N1cHBseS5oCmluZGV4IDFjOGYzY2QuLjJiOTQ3OTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL3dtODM1MC9zdXBwbHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC93bTgzNTAvc3VwcGx5LmgKQEAgLTEzLDcgKzEzLDggQEAKICNpZm5kZWYgX19MSU5VWF9NRkRfV004MzUwX1NVUFBMWV9IXwogI2RlZmluZSBfX0xJTlVYX01GRF9XTTgzNTBfU1VQUExZX0hfCiAKLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgogCiAvKgogICogQ2hhcmdlciByZWdpc3RlcnMKQEAgLTEwNCw4ICsxMDUsMzAgQEAKICNkZWZpbmUgV004MzUwX0lSUV9FWFRfV0FMTF9GQgkJCTM3CiAjZGVmaW5lIFdNODM1MF9JUlFfRVhUX0JBVF9GQgkJCTM4CiAKKy8qCisgKiBQb2xpY3kgdG8gY29udHJvbCBjaGFyZ2VyIHN0YXRlIG1hY2hpbmUuCisgKi8KK3N0cnVjdCB3bTgzNTBfY2hhcmdlcl9wb2xpY3kgeworCisJLyogY2hhcmdlciBzdGF0ZSBtYWNoaW5lIHBvbGljeSAgLSBzZXQgaW4gbWFjaGluZSBkcml2ZXIgKi8KKwlpbnQgZW9jX21BOwkJLyogZW5kIG9mIGNoYXJnZSBjdXJyZW50IChtQSkgICovCisJaW50IGNoYXJnZV9tVjsJCS8qIGNoYXJnZSB2b2x0YWdlICovCisJaW50IGZhc3RfbGltaXRfbUE7CS8qIGZhc3QgY2hhcmdlIGN1cnJlbnQgbGltaXQgKi8KKwlpbnQgZmFzdF9saW1pdF9VU0JfbUE7CS8qIFVTQiBmYXN0IGNoYXJnZSBjdXJyZW50IGxpbWl0ICovCisJaW50IGNoYXJnZV90aW1lb3V0OwkvKiBjaGFyZ2UgdGltZW91dCAobWlucykgKi8KKwlpbnQgdHJpY2tsZV9zdGFydF9tVjsJLyogdHJpY2tsZSBjaGFyZ2Ugc3RhcnRzIGF0IG1WICovCisJaW50IHRyaWNrbGVfY2hhcmdlX21BOwkvKiB0cmlja2xlIGNoYXJnZSBjdXJyZW50ICovCisJaW50IHRyaWNrbGVfY2hhcmdlX1VTQl9tQTsJLyogVVNCIHRyaWNrbGUgY2hhcmdlIGN1cnJlbnQgKi8KK307CisKIHN0cnVjdCB3bTgzNTBfcG93ZXIgewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJc3RydWN0IHBvd2VyX3N1cHBseSBiYXR0ZXJ5OworCXN0cnVjdCBwb3dlcl9zdXBwbHkgdXNiOworCXN0cnVjdCBwb3dlcl9zdXBwbHkgYWM7CisJc3RydWN0IHdtODM1MF9jaGFyZ2VyX3BvbGljeSAqcG9saWN5OworCisJaW50IHJldl9nX2NvZWZmOwogfTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21pZ3JhdGUuaCBiL2luY2x1ZGUvbGludXgvbWlncmF0ZS5oCmluZGV4IDNmMzQwMDUuLjUyNzYwMmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWlncmF0ZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWlncmF0ZS5oCkBAIC03LDYgKzcsOCBAQAogdHlwZWRlZiBzdHJ1Y3QgcGFnZSAqbmV3X3BhZ2VfdChzdHJ1Y3QgcGFnZSAqLCB1bnNpZ25lZCBsb25nIHByaXZhdGUsIGludCAqKik7CiAKICNpZmRlZiBDT05GSUdfTUlHUkFUSU9OCisjZGVmaW5lIFBBR0VfTUlHUkFUSU9OIDEKKwogZXh0ZXJuIGludCBwdXRiYWNrX2xydV9wYWdlcyhzdHJ1Y3QgbGlzdF9oZWFkICpsKTsKIGV4dGVybiBpbnQgbWlncmF0ZV9wYWdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICosCiAJCQlzdHJ1Y3QgcGFnZSAqLCBzdHJ1Y3QgcGFnZSAqKTsKQEAgLTIwLDYgKzIyLDggQEAKIAkJY29uc3Qgbm9kZW1hc2tfdCAqZnJvbSwgY29uc3Qgbm9kZW1hc2tfdCAqdG8sCiAJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpOwogI2Vsc2UKKyNkZWZpbmUgUEFHRV9NSUdSQVRJT04gMAorCiBzdGF0aWMgaW5saW5lIGludCBwdXRiYWNrX2xydV9wYWdlcyhzdHJ1Y3QgbGlzdF9oZWFkICpsKSB7IHJldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIGludCBtaWdyYXRlX3BhZ2VzKHN0cnVjdCBsaXN0X2hlYWQgKmwsIG5ld19wYWdlX3QgeCwKIAkJdW5zaWduZWQgbG9uZyBwcml2YXRlKSB7IHJldHVybiAtRU5PU1lTOyB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21pc2NkZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvbWlzY2RldmljZS5oCmluZGV4IDI2NDMzZWMuLmE4MjBmODEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWlzY2RldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWlzY2RldmljZS5oCkBAIC0zLDMzICszLDMzIEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KIAotI2RlZmluZSBQU01PVVNFX01JTk9SICAxCi0jZGVmaW5lIE1TX0JVU01PVVNFX01JTk9SIDIKLSNkZWZpbmUgQVRJWExfQlVTTU9VU0VfTUlOT1IgMwotLyojZGVmaW5lIEFNSUdBTU9VU0VfTUlOT1IgNAlGSVhNRSBPQlNPTEVURSAqLwotI2RlZmluZSBBVEFSSU1PVVNFX01JTk9SIDUKLSNkZWZpbmUgU1VOX01PVVNFX01JTk9SIDYKLSNkZWZpbmUgQVBPTExPX01PVVNFX01JTk9SIDcKLSNkZWZpbmUgUEMxMTBQQURfTUlOT1IgOQotLyojZGVmaW5lIEFEQl9NT1VTRV9NSU5PUiAxMAlGSVhNRSBPQlNPTEVURSAqLworI2RlZmluZSBQU01PVVNFX01JTk9SCQkxCisjZGVmaW5lIE1TX0JVU01PVVNFX01JTk9SCTIKKyNkZWZpbmUgQVRJWExfQlVTTU9VU0VfTUlOT1IJMworLyojZGVmaW5lIEFNSUdBTU9VU0VfTUlOT1IJNAlGSVhNRSBPQlNPTEVURSAqLworI2RlZmluZSBBVEFSSU1PVVNFX01JTk9SCTUKKyNkZWZpbmUgU1VOX01PVVNFX01JTk9SCQk2CisjZGVmaW5lIEFQT0xMT19NT1VTRV9NSU5PUgk3CisjZGVmaW5lIFBDMTEwUEFEX01JTk9SCQk5CisvKiNkZWZpbmUgQURCX01PVVNFX01JTk9SCTEwCUZJWE1FIE9CU09MRVRFICovCiAjZGVmaW5lIFdBVENIRE9HX01JTk9SCQkxMzAJLyogV2F0Y2hkb2cgdGltZXIgICAgICovCiAjZGVmaW5lIFRFTVBfTUlOT1IJCTEzMQkvKiBUZW1wZXJhdHVyZSBTZW5zb3IgKi8KLSNkZWZpbmUgUlRDX01JTk9SIDEzNQorI2RlZmluZSBSVENfTUlOT1IJCTEzNQogI2RlZmluZSBFRklfUlRDX01JTk9SCQkxMzYJLyogRUZJIFRpbWUgc2VydmljZXMgKi8KLSNkZWZpbmUgU1VOX09QRU5QUk9NX01JTk9SIDEzOQorI2RlZmluZSBTVU5fT1BFTlBST01fTUlOT1IJMTM5CiAjZGVmaW5lIERNQVBJX01JTk9SCQkxNDAJLyogRE1BUEkgKi8KLSNkZWZpbmUgTlZSQU1fTUlOT1IgMTQ0Ci0jZGVmaW5lIFNHSV9NTVRJTUVSICAgICAgICAxNTMKKyNkZWZpbmUgTlZSQU1fTUlOT1IJCTE0NAorI2RlZmluZSBTR0lfTU1USU1FUgkJMTUzCiAjZGVmaW5lIFNUT1JFX1FVRVVFX01JTk9SCTE1NQotI2RlZmluZSBJMk9fTUlOT1IgMTY2CisjZGVmaW5lIEkyT19NSU5PUgkJMTY2CiAjZGVmaW5lIE1JQ1JPQ09ERV9NSU5PUgkJMTg0Ci0jZGVmaW5lIE1XQVZFX01JTk9SCTIxOQkJLyogQUNQL013YXZlIE1vZGVtICovCi0jZGVmaW5lIE1QVF9NSU5PUgkyMjAKLSNkZWZpbmUgTUlTQ19EWU5BTUlDX01JTk9SIDI1NQotCi0jZGVmaW5lIFRVTl9NSU5PUgkgICAgIDIwMAotI2RlZmluZQlIUEVUX01JTk9SCSAgICAgMjI4Ci0jZGVmaW5lIEtWTV9NSU5PUiAgICAgICAgICAgIDIzMgorI2RlZmluZSBUVU5fTUlOT1IJCTIwMAorI2RlZmluZSBNV0FWRV9NSU5PUgkJMjE5CS8qIEFDUC9Nd2F2ZSBNb2RlbSAqLworI2RlZmluZSBNUFRfTUlOT1IJCTIyMAorI2RlZmluZSBIUEVUX01JTk9SCQkyMjgKKyNkZWZpbmUgRlVTRV9NSU5PUgkJMjI5CisjZGVmaW5lIEtWTV9NSU5PUgkJMjMyCisjZGVmaW5lIE1JU0NfRFlOQU1JQ19NSU5PUgkyNTUKIAogc3RydWN0IGRldmljZTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbS5oIGIvaW5jbHVkZS9saW51eC9tbS5oCmluZGV4IGFhYThiODQuLjRhM2QyOGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW0uaAorKysgYi9pbmNsdWRlL2xpbnV4L21tLmgKQEAgLTcxNyw2ICs3MTcsMTEgQEAKIAogI2RlZmluZSBWTV9GQVVMVF9FUlJPUgkoVk1fRkFVTFRfT09NIHwgVk1fRkFVTFRfU0lHQlVTKQogCisvKgorICogQ2FuIGJlIGNhbGxlZCBieSB0aGUgcGFnZWZhdWx0IGhhbmRsZXIgd2hlbiBpdCBnZXRzIGEgVk1fRkFVTFRfT09NLgorICovCitleHRlcm4gdm9pZCBwYWdlZmF1bHRfb3V0X29mX21lbW9yeSh2b2lkKTsKKwogI2RlZmluZSBvZmZzZXRfaW5fcGFnZShwKQkoKHVuc2lnbmVkIGxvbmcpKHApICYgflBBR0VfTUFTSykKIAogZXh0ZXJuIHZvaWQgc2hvd19mcmVlX2FyZWFzKHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbV9pbmxpbmUuaCBiL2luY2x1ZGUvbGludXgvbW1faW5saW5lLmgKaW5kZXggYzk0ODM1MC4uN2ZiYjk3MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbV9pbmxpbmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tX2lubGluZS5oCkBAIC0yOCw2ICsyOCw3IEBACiB7CiAJbGlzdF9hZGQoJnBhZ2UtPmxydSwgJnpvbmUtPmxydVtsXS5saXN0KTsKIAlfX2luY196b25lX3N0YXRlKHpvbmUsIE5SX0xSVV9CQVNFICsgbCk7CisJbWVtX2Nncm91cF9hZGRfbHJ1X2xpc3QocGFnZSwgbCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZApAQCAtMzUsNiArMzYsNyBAQAogewogCWxpc3RfZGVsKCZwYWdlLT5scnUpOwogCV9fZGVjX3pvbmVfc3RhdGUoem9uZSwgTlJfTFJVX0JBU0UgKyBsKTsKKwltZW1fY2dyb3VwX2RlbF9scnVfbGlzdChwYWdlLCBsKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCkBAIC01NCw2ICs1Niw3IEBACiAJCWwgKz0gcGFnZV9pc19maWxlX2NhY2hlKHBhZ2UpOwogCX0KIAlfX2RlY196b25lX3N0YXRlKHpvbmUsIE5SX0xSVV9CQVNFICsgbCk7CisJbWVtX2Nncm91cF9kZWxfbHJ1X2xpc3QocGFnZSwgbCk7CiB9CiAKIC8qKgpAQCAtNzgsMjMgKzgxLDQgQEAKIAlyZXR1cm4gbHJ1OwogfQogCi0vKioKLSAqIGluYWN0aXZlX2Fub25faXNfbG93IC0gY2hlY2sgaWYgYW5vbnltb3VzIHBhZ2VzIG5lZWQgdG8gYmUgZGVhY3RpdmF0ZWQKLSAqIEB6b25lOiB6b25lIHRvIGNoZWNrCi0gKgotICogUmV0dXJucyB0cnVlIGlmIHRoZSB6b25lIGRvZXMgbm90IGhhdmUgZW5vdWdoIGluYWN0aXZlIGFub24gcGFnZXMsCi0gKiBtZWFuaW5nIHNvbWUgYWN0aXZlIGFub24gcGFnZXMgbmVlZCB0byBiZSBkZWFjdGl2YXRlZC4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgaW5hY3RpdmVfYW5vbl9pc19sb3coc3RydWN0IHpvbmUgKnpvbmUpCi17Ci0JdW5zaWduZWQgbG9uZyBhY3RpdmUsIGluYWN0aXZlOwotCi0JYWN0aXZlID0gem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0FDVElWRV9BTk9OKTsKLQlpbmFjdGl2ZSA9IHpvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9JTkFDVElWRV9BTk9OKTsKLQotCWlmIChpbmFjdGl2ZSAqIHpvbmUtPmluYWN0aXZlX3JhdGlvIDwgYWN0aXZlKQotCQlyZXR1cm4gMTsKLQotCXJldHVybiAwOwotfQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tem9uZS5oIGIvaW5jbHVkZS9saW51eC9tbXpvbmUuaAppbmRleCAzNWE3YjVlLi4wOWMxNGUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tem9uZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW16b25lLmgKQEAgLTI2Myw2ICsyNjMsMTkgQEAKICNlcnJvciBaT05FU19TSElGVCAtLSB0b28gbWFueSB6b25lcyBjb25maWd1cmVkIGFkanVzdCBjYWxjdWxhdGlvbgogI2VuZGlmCiAKK3N0cnVjdCB6b25lX3JlY2xhaW1fc3RhdCB7CisJLyoKKwkgKiBUaGUgcGFnZW91dCBjb2RlIGluIHZtc2Nhbi5jIGtlZXBzIHRyYWNrIG9mIGhvdyBtYW55IG9mIHRoZQorCSAqIG1lbS9zd2FwIGJhY2tlZCBhbmQgZmlsZSBiYWNrZWQgcGFnZXMgYXJlIHJlZmVmZXJlbmNlZC4KKwkgKiBUaGUgaGlnaGVyIHRoZSByb3RhdGVkL3NjYW5uZWQgcmF0aW8sIHRoZSBtb3JlIHZhbHVhYmxlCisJICogdGhhdCBjYWNoZSBpcy4KKwkgKgorCSAqIFRoZSBhbm9uIExSVSBzdGF0cyBsaXZlIGluIFswXSwgZmlsZSBMUlUgc3RhdHMgaW4gWzFdCisJICovCisJdW5zaWduZWQgbG9uZwkJcmVjZW50X3JvdGF0ZWRbMl07CisJdW5zaWduZWQgbG9uZwkJcmVjZW50X3NjYW5uZWRbMl07Cit9OworCiBzdHJ1Y3Qgem9uZSB7CiAJLyogRmllbGRzIGNvbW1vbmx5IGFjY2Vzc2VkIGJ5IHRoZSBwYWdlIGFsbG9jYXRvciAqLwogCXVuc2lnbmVkIGxvbmcJCXBhZ2VzX21pbiwgcGFnZXNfbG93LCBwYWdlc19oaWdoOwpAQCAtMzE1LDE2ICszMjgsNyBAQAogCQl1bnNpZ25lZCBsb25nIG5yX3NjYW47CiAJfSBscnVbTlJfTFJVX0xJU1RTXTsKIAotCS8qCi0JICogVGhlIHBhZ2VvdXQgY29kZSBpbiB2bXNjYW4uYyBrZWVwcyB0cmFjayBvZiBob3cgbWFueSBvZiB0aGUKLQkgKiBtZW0vc3dhcCBiYWNrZWQgYW5kIGZpbGUgYmFja2VkIHBhZ2VzIGFyZSByZWZlZmVyZW5jZWQuCi0JICogVGhlIGhpZ2hlciB0aGUgcm90YXRlZC9zY2FubmVkIHJhdGlvLCB0aGUgbW9yZSB2YWx1YWJsZQotCSAqIHRoYXQgY2FjaGUgaXMuCi0JICoKLQkgKiBUaGUgYW5vbiBMUlUgc3RhdHMgbGl2ZSBpbiBbMF0sIGZpbGUgTFJVIHN0YXRzIGluIFsxXQotCSAqLwotCXVuc2lnbmVkIGxvbmcJCXJlY2VudF9yb3RhdGVkWzJdOwotCXVuc2lnbmVkIGxvbmcJCXJlY2VudF9zY2FubmVkWzJdOworCXN0cnVjdCB6b25lX3JlY2xhaW1fc3RhdCByZWNsYWltX3N0YXQ7CiAKIAl1bnNpZ25lZCBsb25nCQlwYWdlc19zY2FubmVkOwkgICAvKiBzaW5jZSBsYXN0IHJlY2xhaW0gKi8KIAl1bnNpZ25lZCBsb25nCQlmbGFnczsJCSAgIC8qIHpvbmUgZmxhZ3MsIHNlZSBiZWxvdyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tb2R1bGUuaCBiL2luY2x1ZGUvbGludXgvbW9kdWxlLmgKaW5kZXggM2JmZWQwMS4uNGY3ZWExMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tb2R1bGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21vZHVsZS5oCkBAIC0yOTQsOSArMjk0LDYgQEAKIAkvKiBUaGUgc2l6ZSBvZiB0aGUgZXhlY3V0YWJsZSBjb2RlIGluIGVhY2ggc2VjdGlvbi4gICovCiAJdW5zaWduZWQgaW50IGluaXRfdGV4dF9zaXplLCBjb3JlX3RleHRfc2l6ZTsKIAotCS8qIFRoZSBoYW5kbGUgcmV0dXJuZWQgZnJvbSB1bndpbmRfYWRkX3RhYmxlLiAqLwotCXZvaWQgKnVud2luZF9pbmZvOwotCiAJLyogQXJjaC1zcGVjaWZpYyBtb2R1bGUgdmFsdWVzICovCiAJc3RydWN0IG1vZF9hcmNoX3NwZWNpZmljIGFyY2g7CiAKQEAgLTM2OCw2ICszNjUsMTggQEAKIHN0cnVjdCBtb2R1bGUgKl9fbW9kdWxlX3RleHRfYWRkcmVzcyh1bnNpZ25lZCBsb25nIGFkZHIpOwogaW50IGlzX21vZHVsZV9hZGRyZXNzKHVuc2lnbmVkIGxvbmcgYWRkcik7CiAKK3N0YXRpYyBpbmxpbmUgaW50IHdpdGhpbl9tb2R1bGVfY29yZSh1bnNpZ25lZCBsb25nIGFkZHIsIHN0cnVjdCBtb2R1bGUgKm1vZCkKK3sKKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpbW9kLT5tb2R1bGVfY29yZSA8PSBhZGRyICYmCisJICAgICAgIGFkZHIgPCAodW5zaWduZWQgbG9uZyltb2QtPm1vZHVsZV9jb3JlICsgbW9kLT5jb3JlX3NpemU7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHdpdGhpbl9tb2R1bGVfaW5pdCh1bnNpZ25lZCBsb25nIGFkZHIsIHN0cnVjdCBtb2R1bGUgKm1vZCkKK3sKKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpbW9kLT5tb2R1bGVfaW5pdCA8PSBhZGRyICYmCisJICAgICAgIGFkZHIgPCAodW5zaWduZWQgbG9uZyltb2QtPm1vZHVsZV9pbml0ICsgbW9kLT5pbml0X3NpemU7Cit9CisKIC8qIFJldHVybnMgMCBhbmQgZmlsbHMgaW4gdmFsdWUsIGRlZmluZWQgYW5kIG5hbWVidWYsIG9yIC1FUkFOR0UgaWYKICAgIHN5bW51bSBvdXQgb2YgcmFuZ2UuICovCiBpbnQgbW9kdWxlX2dldF9rYWxsc3ltKHVuc2lnbmVkIGludCBzeW1udW0sIHVuc2lnbmVkIGxvbmcgKnZhbHVlLCBjaGFyICp0eXBlLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tb2R1bGVsb2FkZXIuaCBiL2luY2x1ZGUvbGludXgvbW9kdWxlbG9hZGVyLmgKaW5kZXggZWIxMDMzOS4uYzFmNDBjMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tb2R1bGVsb2FkZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L21vZHVsZWxvYWRlci5oCkBAIC0xMyw2ICsxMyw5IEBACiAJCQkgICAgICBjaGFyICpzZWNzdHJpbmdzLAogCQkJICAgICAgc3RydWN0IG1vZHVsZSAqbW9kKTsKIAorLyogQWRkaXRpb25hbCBieXRlcyBuZWVkZWQgYnkgYXJjaCBpbiBmcm9udCBvZiBpbmRpdmlkdWFsIHNlY3Rpb25zICovCit1bnNpZ25lZCBpbnQgYXJjaF9tb2Rfc2VjdGlvbl9wcmVwZW5kKHN0cnVjdCBtb2R1bGUgKm1vZCwgdW5zaWduZWQgaW50IHNlY3Rpb24pOworCiAvKiBBbGxvY2F0b3IgdXNlZCBmb3IgYWxsb2NhdGluZyBzdHJ1Y3QgbW9kdWxlLCBjb3JlIHNlY3Rpb25zIGFuZCBpbml0CiAgICBzZWN0aW9ucy4gIFJldHVybnMgTlVMTCBvbiBmYWlsdXJlLiAqLwogdm9pZCAqbW9kdWxlX2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L210ZC9jb25jYXQuaCBiL2luY2x1ZGUvbGludXgvbXRkL2NvbmNhdC5oCmluZGV4IGMwMmYzZDIuLmU4MGM2NzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbXRkL2NvbmNhdC5oCisrKyBiL2luY2x1ZGUvbGludXgvbXRkL2NvbmNhdC5oCkBAIC0xMyw3ICsxMyw3IEBACiBzdHJ1Y3QgbXRkX2luZm8gKm10ZF9jb25jYXRfY3JlYXRlKAogICAgIHN0cnVjdCBtdGRfaW5mbyAqc3ViZGV2W10sICAvKiBzdWJkZXZpY2VzIHRvIGNvbmNhdGVuYXRlICovCiAgICAgaW50IG51bV9kZXZzLCAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBzdWJkZXZpY2VzICAgICAgKi8KLSAgICBjaGFyICpuYW1lKTsgICAgICAgICAgICAgICAgLyogbmFtZSBmb3IgdGhlIG5ldyBkZXZpY2UgICAqLworICAgIGNvbnN0IGNoYXIgKm5hbWUpOyAgICAgICAgICAvKiBuYW1lIGZvciB0aGUgbmV3IGRldmljZSAgICovCiAKIHZvaWQgbXRkX2NvbmNhdF9kZXN0cm95KHN0cnVjdCBtdGRfaW5mbyAqbXRkKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tdGQvbXRkLmggYi9pbmNsdWRlL2xpbnV4L210ZC9tdGQuaAppbmRleCBlYWUyNmJiLi42NDQzM2ViIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L210ZC9tdGQuaAorKysgYi9pbmNsdWRlL2xpbnV4L210ZC9tdGQuaApAQCAtODMsNyArODMsNyBAQAogICogQGRhdGJ1ZjoJZGF0YSBidWZmZXIgLSBpZiBOVUxMIG9ubHkgb29iIGRhdGEgYXJlIHJlYWQvd3JpdHRlbgogICogQG9vYmJ1ZjoJb29iIGRhdGEgYnVmZmVyCiAgKgotICogTm90ZSwgaXQgaXMgYWxsb3dlZCB0byByZWFkIG1vcmUgdGhlbiBvbmUgT09CIGFyZWEgYXQgb25lIGdvLCBidXQgbm90IHdyaXRlLgorICogTm90ZSwgaXQgaXMgYWxsb3dlZCB0byByZWFkIG1vcmUgdGhhbiBvbmUgT09CIGFyZWEgYXQgb25lIGdvLCBidXQgbm90IHdyaXRlLgogICogVGhlIGludGVyZmFjZSBhc3N1bWVzIHRoYXQgdGhlIE9PQiB3cml0ZSByZXF1ZXN0cyBwcm9ncmFtIG9ubHkgb25lIHBhZ2UncwogICogT09CIGFyZWEuCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmNwX2ZzLmggYi9pbmNsdWRlL2xpbnV4L25jcF9mcy5oCmluZGV4IDlmMmQ3NjMuLmY2OWU2NmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmNwX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9uY3BfZnMuaApAQCAtODcsNyArODcsNyBAQAogI2RlZmluZSBOQ1BfQVVUSF9ORFMJMHgzMgogCWludAkJYXV0aF90eXBlOwogCXNpemVfdAkJb2JqZWN0X25hbWVfbGVuOwotCXZvaWQgX191c2VyICoJb2JqZWN0X25hbWU7CS8qIGFuIHVzZXJzcGFjZSBkYXRhLCBpbiBtb3N0IGNhc2VzIHVzZXIgbmFtZSAqLworCXZvaWQgX191c2VyICoJb2JqZWN0X25hbWU7CS8qIGEgdXNlcnNwYWNlIGRhdGEsIGluIG1vc3QgY2FzZXMgdXNlciBuYW1lICovCiB9OwogCiBzdHJ1Y3QgbmNwX3ByaXZhdGVkYXRhX2lvY3RsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oIGIvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaAppbmRleCA0MWUxMjI0Li5mMjQ1NTY4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKQEAgLTMxMywxMCArMzEzLDExIEBACiAjaWZkZWYgQ09ORklHX05FVFBPTEwKIAlzcGlubG9ja190CQlwb2xsX2xvY2s7CiAJaW50CQkJcG9sbF9vd25lcjsKLQlzdHJ1Y3QgbmV0X2RldmljZQkqZGV2OwogI2VuZGlmCisJc3RydWN0IG5ldF9kZXZpY2UJKmRldjsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWRldl9saXN0OwogCXN0cnVjdCBza19idWZmCQkqZ3JvX2xpc3Q7CisJc3RydWN0IHNrX2J1ZmYJCSpza2I7CiB9OwogCiBlbnVtCkBAIC05OTAsNiArOTkxLDkgQEAKIAogCS8qIE51bWJlciBvZiBzZWdtZW50cyBhZ2dyZWdhdGVkLiAqLwogCWludCBjb3VudDsKKworCS8qIEZyZWUgdGhlIHNrYj8gKi8KKwlpbnQgZnJlZTsKIH07CiAKICNkZWZpbmUgTkFQSV9HUk9fQ0Ioc2tiKSAoKHN0cnVjdCBuYXBpX2dyb19jYiAqKShza2IpLT5jYikKQEAgLTEwMTEsNiArMTAxNSwxNCBAQAogCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKIH07CiAKK3N0cnVjdCBuYXBpX2dyb19mcmFnaW5mbyB7CisJc2tiX2ZyYWdfdCBmcmFnc1tNQVhfU0tCX0ZSQUdTXTsKKwl1bnNpZ25lZCBpbnQgbnJfZnJhZ3M7CisJdW5zaWduZWQgaW50IGlwX3N1bW1lZDsKKwl1bnNpZ25lZCBpbnQgbGVuOworCV9fd3N1bSBjc3VtOworfTsKKwogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAKQEAgLTExMTMsOSArMTEyNSw2IEBACiAJc3RydWN0IHNrX2J1ZmYJCSpjb21wbGV0aW9uX3F1ZXVlOwogCiAJc3RydWN0IG5hcGlfc3RydWN0CWJhY2tsb2c7Ci0jaWZkZWYgQ09ORklHX05FVF9ETUEKLQlzdHJ1Y3QgZG1hX2NoYW4JCSpuZXRfZG1hOwotI2VuZGlmCiB9OwogCiBERUNMQVJFX1BFUl9DUFUoc3RydWN0IHNvZnRuZXRfZGF0YSxzb2Z0bmV0X2RhdGEpOwpAQCAtMTM2MSw4ICsxMzcwLDE2IEBACiAjZGVmaW5lIEhBVkVfTkVUSUZfUkVDRUlWRV9TS0IgMQogZXh0ZXJuIGludAkJbmV0aWZfcmVjZWl2ZV9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBleHRlcm4gdm9pZAkJbmFwaV9ncm9fZmx1c2goc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpKTsKK2V4dGVybiBpbnQJCWRldl9ncm9fcmVjZWl2ZShzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksCisJCQkJCXN0cnVjdCBza19idWZmICpza2IpOwogZXh0ZXJuIGludAkJbmFwaV9ncm9fcmVjZWl2ZShzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksCiAJCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2V4dGVybiB2b2lkCQluYXBpX3JldXNlX3NrYihzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksCisJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IpOworZXh0ZXJuIHN0cnVjdCBza19idWZmICoJbmFwaV9mcmFnaW5mb19za2Ioc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLAorCQkJCQkgIHN0cnVjdCBuYXBpX2dyb19mcmFnaW5mbyAqaW5mbyk7CitleHRlcm4gaW50CQluYXBpX2dyb19mcmFncyhzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksCisJCQkJICAgICAgIHN0cnVjdCBuYXBpX2dyb19mcmFnaW5mbyAqaW5mbyk7CiBleHRlcm4gdm9pZAkJbmV0aWZfbml0X2RlbGl2ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBleHRlcm4gaW50CQlkZXZfdmFsaWRfbmFtZShjb25zdCBjaGFyICpuYW1lKTsKIGV4dGVybiBpbnQJCWRldl9pb2N0bChzdHJ1Y3QgbmV0ICpuZXQsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnM0LmggYi9pbmNsdWRlL2xpbnV4L25mczQuaAppbmRleCBlYTAzNjY3Li5iOTEyMzExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mczQuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mczQuaApAQCAtODgsNiArODgsOCBAQAogI2RlZmluZSBORlM0X0FDRV9HRU5FUklDX0VYRUNVVEUgICAgICAgICAgICAgIDB4MDAxMjAwQTAKICNkZWZpbmUgTkZTNF9BQ0VfTUFTS19BTEwgICAgICAgICAgICAgICAgICAgICAweDAwMUYwMUZGCiAKKyNkZWZpbmUgTkZTNF9NQVhfVUlOVDY0CSh+KHU2NCkwKQorCiBlbnVtIG5mczRfYWNsX3dob3R5cGUgewogCU5GUzRfQUNMX1dIT19OQU1FRCA9IDAsCiAJTkZTNF9BQ0xfV0hPX09XTkVSLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNkL25mc2QuaCBiL2luY2x1ZGUvbGludXgvbmZzZC9uZnNkLmgKaW5kZXggMjEyNjk0MC4uZTE5ZjQ1OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNkL25mc2QuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc2QvbmZzZC5oCkBAIC0yMyw3ICsyMyw2IEBACiAvKgogICogbmZzZCB2ZXJzaW9uCiAgKi8KLSNkZWZpbmUgTkZTRF9WRVJTSU9OCQkiMC41IgogI2RlZmluZSBORlNEX1NVUFBPUlRFRF9NSU5PUl9WRVJTSU9OCTAKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzZC9uZnNmaC5oIGIvaW5jbHVkZS9saW51eC9uZnNkL25mc2ZoLmgKaW5kZXggZDE5NDFjYi4uYjJlMDkzOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNkL25mc2ZoLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnNkL25mc2ZoLmgKQEAgLTY4LDYgKzY4LDEwIEBACiAgKiAgICAgMSAgLSA0IGJ5dGUgdXNlciBzcGVjaWZpZWQgaWRlbnRpZmllcgogICogICAgIDIgIC0gNCBieXRlIG1ham9yLCA0IGJ5dGUgbWlub3IsIDQgYnl0ZSBpbm9kZSBudW1iZXIgLSBERVBSRUNBVEVECiAgKiAgICAgMyAgLSA0IGJ5dGUgZGV2aWNlIGlkLCBlbmNvZGVkIGZvciB1c2VyLXNwYWNlLCA0IGJ5dGUgaW5vZGUgbnVtYmVyCisgKiAgICAgNCAgLSA0IGJ5dGUgaW5vZGUgbnVtYmVyIGFuZCA0IGJ5dGUgdXVpZAorICogICAgIDUgIC0gOCBieXRlIHV1aWQKKyAqICAgICA2ICAtIDE2IGJ5dGUgdXVpZAorICogICAgIDcgIC0gOCBieXRlIGlub2RlIG51bWJlciBhbmQgMTYgYnl0ZSB1dWlkCiAgKgogICogVGhlIGZpbGVpZF90eXBlIGlkZW50aWZpZWQgaG93IHRoZSBmaWxlIHdpdGhpbiB0aGUgZmlsZXN5c3RlbSBpcyBlbmNvZGVkLgogICogVGhpcyBpcyAod2lsbCBiZSkgcGFzc2VkIHRvLCBhbmQgc2V0IGJ5LCB0aGUgdW5kZXJseWluZyBmaWxlc3lzdGVtIGlmIGl0IHN1cHBvcnRzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25vZGUuaCBiL2luY2x1ZGUvbGludXgvbm9kZS5oCmluZGV4IGJjMDAxYmMuLjY4MWE2OTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbm9kZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbm9kZS5oCkBAIC0yNiw2ICsyNiw3IEBACiAJc3RydWN0IHN5c19kZXZpY2UJc3lzZGV2OwogfTsKIAorc3RydWN0IG1lbW9yeV9ibG9jazsKIGV4dGVybiBzdHJ1Y3Qgbm9kZSBub2RlX2RldmljZXNbXTsKIAogZXh0ZXJuIGludCByZWdpc3Rlcl9ub2RlKHN0cnVjdCBub2RlICosIGludCwgc3RydWN0IG5vZGUgKik7CkBAIC0zNSw2ICszNiw5IEBACiBleHRlcm4gdm9pZCB1bnJlZ2lzdGVyX29uZV9ub2RlKGludCBuaWQpOwogZXh0ZXJuIGludCByZWdpc3Rlcl9jcHVfdW5kZXJfbm9kZSh1bnNpZ25lZCBpbnQgY3B1LCB1bnNpZ25lZCBpbnQgbmlkKTsKIGV4dGVybiBpbnQgdW5yZWdpc3Rlcl9jcHVfdW5kZXJfbm9kZSh1bnNpZ25lZCBpbnQgY3B1LCB1bnNpZ25lZCBpbnQgbmlkKTsKK2V4dGVybiBpbnQgcmVnaXN0ZXJfbWVtX3NlY3RfdW5kZXJfbm9kZShzdHJ1Y3QgbWVtb3J5X2Jsb2NrICptZW1fYmxrLAorCQkJCQkJaW50IG5pZCk7CitleHRlcm4gaW50IHVucmVnaXN0ZXJfbWVtX3NlY3RfdW5kZXJfbm9kZXMoc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtX2Jsayk7CiAjZWxzZQogc3RhdGljIGlubGluZSBpbnQgcmVnaXN0ZXJfb25lX25vZGUoaW50IG5pZCkKIHsKQEAgLTUyLDYgKzU2LDE1IEBACiB7CiAJcmV0dXJuIDA7CiB9CitzdGF0aWMgaW5saW5lIGludCByZWdpc3Rlcl9tZW1fc2VjdF91bmRlcl9ub2RlKHN0cnVjdCBtZW1vcnlfYmxvY2sgKm1lbV9ibGssCisJCQkJCQkJaW50IG5pZCkKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgaW50IHVucmVnaXN0ZXJfbWVtX3NlY3RfdW5kZXJfbm9kZXMoc3RydWN0IG1lbW9yeV9ibG9jayAqbWVtX2JsaykKK3sKKwlyZXR1cm4gMDsKK30KICNlbmRpZgogCiAjZGVmaW5lIHRvX25vZGUoc3lzX2RldmljZSkgY29udGFpbmVyX29mKHN5c19kZXZpY2UsIHN0cnVjdCBub2RlLCBzeXNkZXYpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L253cHNlcmlhbC5oIGIvaW5jbHVkZS9saW51eC9ud3BzZXJpYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWNiMjE1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9ud3BzZXJpYWwuaApAQCAtMCwwICsxLDE4IEBACisvKgorICogIFNlcmlhbCBQb3J0IGRyaXZlciBmb3IgYSBOV1AgdWFydCBkZXZpY2UKKyAqCisgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDggSUJNIENvcnAuLCBCZW5qYW1pbiBLcmlsbCA8YmVuQGNvZGllcnQub3JnPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworI2lmbmRlZiBfTldQU0VSSUFMX0gKKyNkZWZpbmUgX05XUFNFUklBTF9ICisKK2ludCBud3BzZXJpYWxfcmVnaXN0ZXJfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KTsKK3ZvaWQgbndwc2VyaWFsX3VucmVnaXN0ZXJfcG9ydChpbnQgbGluZSk7CisKKyNlbmRpZiAvKiBfTldQU0VSSUFMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvb3h1MjEwaHAuaCBiL2luY2x1ZGUvbGludXgvb3h1MjEwaHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmY5NmVhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9veHUyMTBocC5oCkBAIC0wLDAgKzEsNyBAQAorLyogcGxhdGZvcm0gZGF0YSBmb3IgdGhlIE9YVTIxMEhQIEhDRCAqLworCitzdHJ1Y3Qgb3h1MjEwaHBfcGxhdGZvcm1fZGF0YSB7CisJdW5zaWduZWQgaW50IGJ1czE2OjE7CisJdW5zaWduZWQgaW50IHVzZV9oY2Rfb3RnOjE7CisJdW5zaWduZWQgaW50IHVzZV9oY2Rfc3BoOjE7Cit9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wYWdlLWZsYWdzLmggYi9pbmNsdWRlL2xpbnV4L3BhZ2UtZmxhZ3MuaAppbmRleCBiMTJmOTNhLi4yMTlhNTIzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BhZ2UtZmxhZ3MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BhZ2UtZmxhZ3MuaApAQCAtMjI4LDYgKzIyOCw3IEBACiBQQUdFRkxBRyhTd2FwQ2FjaGUsIHN3YXBjYWNoZSkKICNlbHNlCiBQQUdFRkxBR19GQUxTRShTd2FwQ2FjaGUpCisJU0VUUEFHRUZMQUdfTk9PUChTd2FwQ2FjaGUpIENMRUFSUEFHRUZMQUdfTk9PUChTd2FwQ2FjaGUpCiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19VTkVWSUNUQUJMRV9MUlUKQEAgLTM3MiwzMSArMzczLDIyIEBACiAjZGVmaW5lIF9fUEdfTUxPQ0tFRAkJMAogI2VuZGlmCiAKLSNkZWZpbmUgUEFHRV9GTEFHUwkoMSA8PCBQR19scnUgICB8IDEgPDwgUEdfcHJpdmF0ZSAgIHwgMSA8PCBQR19sb2NrZWQgfCBcCi0JCQkgMSA8PCBQR19idWRkeSB8IDEgPDwgUEdfd3JpdGViYWNrIHwgXAotCQkJIDEgPDwgUEdfc2xhYiAgfCAxIDw8IFBHX3N3YXBjYWNoZSB8IDEgPDwgUEdfYWN0aXZlIHwgXAotCQkJIF9fUEdfVU5FVklDVEFCTEUgfCBfX1BHX01MT0NLRUQpCi0KLS8qCi0gKiBGbGFncyBjaGVja2VkIGluIGJhZF9wYWdlKCkuICBQYWdlcyBvbiB0aGUgZnJlZSBsaXN0IHNob3VsZCBub3QgaGF2ZQotICogdGhlc2UgZmxhZ3Mgc2V0LiAgSXQgdGhleSBhcmUsIHRoZXJlIGlzIGEgcHJvYmxlbS4KLSAqLwotI2RlZmluZSBQQUdFX0ZMQUdTX0NMRUFSX1dIRU5fQkFEIChQQUdFX0ZMQUdTIHwgXAotCQkxIDw8IFBHX3JlY2xhaW0gfCAxIDw8IFBHX2RpcnR5IHwgMSA8PCBQR19zd2FwYmFja2VkKQotCiAvKgogICogRmxhZ3MgY2hlY2tlZCB3aGVuIGEgcGFnZSBpcyBmcmVlZC4gIFBhZ2VzIGJlaW5nIGZyZWVkIHNob3VsZCBub3QgaGF2ZQogICogdGhlc2UgZmxhZ3Mgc2V0LiAgSXQgdGhleSBhcmUsIHRoZXJlIGlzIGEgcHJvYmxlbS4KICAqLwotI2RlZmluZSBQQUdFX0ZMQUdTX0NIRUNLX0FUX0ZSRUUgKFBBR0VfRkxBR1MgfCAxIDw8IFBHX3Jlc2VydmVkKQorI2RlZmluZSBQQUdFX0ZMQUdTX0NIRUNLX0FUX0ZSRUUgXAorCSgxIDw8IFBHX2xydSAgIHwgMSA8PCBQR19wcml2YXRlICAgfCAxIDw8IFBHX2xvY2tlZCB8IFwKKwkgMSA8PCBQR19idWRkeSB8IDEgPDwgUEdfd3JpdGViYWNrIHwgMSA8PCBQR19yZXNlcnZlZCB8IFwKKwkgMSA8PCBQR19zbGFiICB8IDEgPDwgUEdfc3dhcGNhY2hlIHwgMSA8PCBQR19hY3RpdmUgfCBcCisJIF9fUEdfVU5FVklDVEFCTEUgfCBfX1BHX01MT0NLRUQpCiAKIC8qCiAgKiBGbGFncyBjaGVja2VkIHdoZW4gYSBwYWdlIGlzIHByZXBwZWQgZm9yIHJldHVybiBieSB0aGUgcGFnZSBhbGxvY2F0b3IuCi0gKiBQYWdlcyBiZWluZyBwcmVwcGVkIHNob3VsZCBub3QgaGF2ZSB0aGVzZSBmbGFncyBzZXQuICBJdCB0aGV5IGFyZSwgdGhlcmUKLSAqIGlzIGEgcHJvYmxlbS4KKyAqIFBhZ2VzIGJlaW5nIHByZXBwZWQgc2hvdWxkIG5vdCBoYXZlIGFueSBmbGFncyBzZXQuICBJdCB0aGV5IGFyZSBzZXQsCisgKiB0aGVyZSBoYXMgYmVlbiBhIGtlcm5lbCBidWcgb3Igc3RydWN0IHBhZ2UgY29ycnVwdGlvbi4KICAqLwotI2RlZmluZSBQQUdFX0ZMQUdTX0NIRUNLX0FUX1BSRVAgKFBBR0VfRkxBR1MgfCBcCi0JCTEgPDwgUEdfcmVzZXJ2ZWQgfCAxIDw8IFBHX2RpcnR5IHwgMSA8PCBQR19zd2FwYmFja2VkKQorI2RlZmluZSBQQUdFX0ZMQUdTX0NIRUNLX0FUX1BSRVAJKCgxIDw8IE5SX1BBR0VGTEFHUykgLSAxKQogCiAjZW5kaWYgLyogIV9fR0VORVJBVElOR19CT1VORFNfSCAqLwogI2VuZGlmCS8qIFBBR0VfRkxBR1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wYWdlX2Nncm91cC5oIGIvaW5jbHVkZS9saW51eC9wYWdlX2Nncm91cC5oCmluZGV4IDFlNmQzNGIuLjYwMmNjMWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGFnZV9jZ3JvdXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BhZ2VfY2dyb3VwLmgKQEAgLTI2LDEwICsyNiw2IEBACiAJUENHX0xPQ0ssICAvKiBwYWdlIGNncm91cCBpcyBsb2NrZWQgKi8KIAlQQ0dfQ0FDSEUsIC8qIGNoYXJnZWQgYXMgY2FjaGUgKi8KIAlQQ0dfVVNFRCwgLyogdGhpcyBvYmplY3QgaXMgaW4gdXNlLiAqLwotCS8qIGZsYWdzIGZvciBMUlUgcGxhY2VtZW50ICovCi0JUENHX0FDVElWRSwgLyogcGFnZSBpcyBhY3RpdmUgaW4gdGhpcyBjZ3JvdXAgKi8KLQlQQ0dfRklMRSwgLyogcGFnZSBpcyBmaWxlIHN5c3RlbSBiYWNrZWQgKi8KLQlQQ0dfVU5FVklDVEFCTEUsIC8qIHBhZ2UgaXMgdW5ldmljdGFibGVhYmxlICovCiB9OwogCiAjZGVmaW5lIFRFU1RQQ0dGTEFHKHVuYW1lLCBsbmFtZSkJCQlcCkBAIC01MCwxOSArNDYsNiBAQAogVEVTVFBDR0ZMQUcoVXNlZCwgVVNFRCkKIENMRUFSUENHRkxBRyhVc2VkLCBVU0VEKQogCi0vKiBMUlUgbWFuYWdlbWVudCBmbGFncyAoZnJvbSBnbG9iYWwtbHJ1IGRlZmluaXRpb24pICovCi1URVNUUENHRkxBRyhGaWxlLCBGSUxFKQotU0VUUENHRkxBRyhGaWxlLCBGSUxFKQotQ0xFQVJQQ0dGTEFHKEZpbGUsIEZJTEUpCi0KLVRFU1RQQ0dGTEFHKEFjdGl2ZSwgQUNUSVZFKQotU0VUUENHRkxBRyhBY3RpdmUsIEFDVElWRSkKLUNMRUFSUENHRkxBRyhBY3RpdmUsIEFDVElWRSkKLQotVEVTVFBDR0ZMQUcoVW5ldmljdGFibGUsIFVORVZJQ1RBQkxFKQotU0VUUENHRkxBRyhVbmV2aWN0YWJsZSwgVU5FVklDVEFCTEUpCi1DTEVBUlBDR0ZMQUcoVW5ldmljdGFibGUsIFVORVZJQ1RBQkxFKQotCiBzdGF0aWMgaW5saW5lIGludCBwYWdlX2Nncm91cF9uaWQoc3RydWN0IHBhZ2VfY2dyb3VwICpwYykKIHsKIAlyZXR1cm4gcGFnZV90b19uaWQocGMtPnBhZ2UpOwpAQCAtMTA1LDQgKzg4LDM5IEBACiB9CiAKICNlbmRpZgorCisjaWZkZWYgQ09ORklHX0NHUk9VUF9NRU1fUkVTX0NUTFJfU1dBUAorI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KK2V4dGVybiBzdHJ1Y3QgbWVtX2Nncm91cCAqCitzd2FwX2Nncm91cF9yZWNvcmQoc3dwX2VudHJ5X3QgZW50LCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKTsKK2V4dGVybiBzdHJ1Y3QgbWVtX2Nncm91cCAqbG9va3VwX3N3YXBfY2dyb3VwKHN3cF9lbnRyeV90IGVudCk7CitleHRlcm4gaW50IHN3YXBfY2dyb3VwX3N3YXBvbihpbnQgdHlwZSwgdW5zaWduZWQgbG9uZyBtYXhfcGFnZXMpOworZXh0ZXJuIHZvaWQgc3dhcF9jZ3JvdXBfc3dhcG9mZihpbnQgdHlwZSk7CisjZWxzZQorI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KKworc3RhdGljIGlubGluZQorc3RydWN0IG1lbV9jZ3JvdXAgKnN3YXBfY2dyb3VwX3JlY29yZChzd3BfZW50cnlfdCBlbnQsIHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCit7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCBtZW1fY2dyb3VwICpsb29rdXBfc3dhcF9jZ3JvdXAoc3dwX2VudHJ5X3QgZW50KQoreworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIGludAorc3dhcF9jZ3JvdXBfc3dhcG9uKGludCB0eXBlLCB1bnNpZ25lZCBsb25nIG1heF9wYWdlcykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN3YXBfY2dyb3VwX3N3YXBvZmYoaW50IHR5cGUpCit7CisJcmV0dXJuOworfQorCisjZW5kaWYKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wYWdldmVjLmggYi9pbmNsdWRlL2xpbnV4L3BhZ2V2ZWMuaAppbmRleCBlOTBhMmNiLi43YjI4ODZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BhZ2V2ZWMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BhZ2V2ZWMuaApAQCAtMjEsNyArMjEsNiBAQAogfTsKIAogdm9pZCBfX3BhZ2V2ZWNfcmVsZWFzZShzdHJ1Y3QgcGFnZXZlYyAqcHZlYyk7Ci12b2lkIF9fcGFnZXZlY19yZWxlYXNlX25vbmxydShzdHJ1Y3QgcGFnZXZlYyAqcHZlYyk7CiB2b2lkIF9fcGFnZXZlY19mcmVlKHN0cnVjdCBwYWdldmVjICpwdmVjKTsKIHZvaWQgX19fX3BhZ2V2ZWNfbHJ1X2FkZChzdHJ1Y3QgcGFnZXZlYyAqcHZlYywgZW51bSBscnVfbGlzdCBscnUpOwogdm9pZCBwYWdldmVjX3N0cmlwKHN0cnVjdCBwYWdldmVjICpwdmVjKTsKQEAgLTY5LDEyICs2OCw2IEBACiAJCV9fcGFnZXZlY19yZWxlYXNlKHB2ZWMpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGFnZXZlY19yZWxlYXNlX25vbmxydShzdHJ1Y3QgcGFnZXZlYyAqcHZlYykKLXsKLQlpZiAocGFnZXZlY19jb3VudChwdmVjKSkKLQkJX19wYWdldmVjX3JlbGVhc2Vfbm9ubHJ1KHB2ZWMpOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgcGFnZXZlY19mcmVlKHN0cnVjdCBwYWdldmVjICpwdmVjKQogewogCWlmIChwYWdldmVjX2NvdW50KHB2ZWMpKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2ktYWNwaS5oIGIvaW5jbHVkZS9saW51eC9wY2ktYWNwaS5oCmluZGV4IDg4Mzc5MjguLjA0MmMxNjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGNpLWFjcGkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaS1hY3BpLmgKQEAgLTgsNiArOCw4IEBACiAjaWZuZGVmIF9QQ0lfQUNQSV9IXwogI2RlZmluZSBfUENJX0FDUElfSF8KIAorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKwogI2RlZmluZSBPU0NfUVVFUllfVFlQRQkJCTAKICNkZWZpbmUgT1NDX1NVUFBPUlRfVFlQRSAJCTEKICNkZWZpbmUgT1NDX0NPTlRST0xfVFlQRQkJMgpAQCAtNDgsMTUgKzUwLDcgQEAKIAogI2lmZGVmIENPTkZJR19BQ1BJCiBleHRlcm4gYWNwaV9zdGF0dXMgcGNpX29zY19jb250cm9sX3NldChhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBmbGFncyk7Ci1leHRlcm4gYWNwaV9zdGF0dXMgX19wY2lfb3NjX3N1cHBvcnRfc2V0KHUzMiBmbGFncywgY29uc3QgY2hhciAqaGlkKTsKLXN0YXRpYyBpbmxpbmUgYWNwaV9zdGF0dXMgcGNpX29zY19zdXBwb3J0X3NldCh1MzIgZmxhZ3MpCi17Ci0JcmV0dXJuIF9fcGNpX29zY19zdXBwb3J0X3NldChmbGFncywgUENJX1JPT1RfSElEX1NUUklORyk7Ci19Ci1zdGF0aWMgaW5saW5lIGFjcGlfc3RhdHVzIHBjaWVfb3NjX3N1cHBvcnRfc2V0KHUzMiBmbGFncykKLXsKLQlyZXR1cm4gX19wY2lfb3NjX3N1cHBvcnRfc2V0KGZsYWdzLCBQQ0lfRVhQUkVTU19ST09UX0hJRF9TVFJJTkcpOwotfQoraW50IHBjaV9hY3BpX29zY19zdXBwb3J0KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGZsYWdzKTsKIHN0YXRpYyBpbmxpbmUgYWNwaV9oYW5kbGUgYWNwaV9maW5kX3Jvb3RfYnJpZGdlX2hhbmRsZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAkvKiBGaW5kIHJvb3QgaG9zdCBicmlkZ2UgKi8KQEAgLTY2LDYgKzYwLDE1IEBACiAJcmV0dXJuIGFjcGlfZ2V0X3BjaV9yb290YnJpZGdlX2hhbmRsZShwY2lfZG9tYWluX25yKHBkZXYtPmJ1cyksCiAJCQlwZGV2LT5idXMtPm51bWJlcik7CiB9CisKK3N0YXRpYyBpbmxpbmUgYWNwaV9oYW5kbGUgYWNwaV9wY2lfZ2V0X2JyaWRnZV9oYW5kbGUoc3RydWN0IHBjaV9idXMgKnBidXMpCit7CisJaW50IHNlZyA9IHBjaV9kb21haW5fbnIocGJ1cyksIGJ1c25yID0gcGJ1cy0+bnVtYmVyOworCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2UgPSBwYnVzLT5zZWxmOworCWlmIChicmlkZ2UpCisJCXJldHVybiBERVZJQ0VfQUNQSV9IQU5ETEUoJihicmlkZ2UtPmRldikpOworCXJldHVybiBhY3BpX2dldF9wY2lfcm9vdGJyaWRnZV9oYW5kbGUoc2VnLCBidXNucik7Cit9CiAjZWxzZQogI2lmICFkZWZpbmVkKEFFX0VSUk9SKQogdHlwZWRlZiB1MzIgCQlhY3BpX3N0YXR1czsKQEAgLTczLDggKzc2LDYgQEAKICNlbmRpZiAgICAKIHN0YXRpYyBpbmxpbmUgYWNwaV9zdGF0dXMgcGNpX29zY19jb250cm9sX3NldChhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBmbGFncykKIHtyZXR1cm4gQUVfRVJST1I7fQotc3RhdGljIGlubGluZSBhY3BpX3N0YXR1cyBwY2lfb3NjX3N1cHBvcnRfc2V0KHUzMiBmbGFncykge3JldHVybiBBRV9FUlJPUjt9IAotc3RhdGljIGlubGluZSBhY3BpX3N0YXR1cyBwY2llX29zY19zdXBwb3J0X3NldCh1MzIgZmxhZ3MpIHtyZXR1cm4gQUVfRVJST1I7fQogc3RhdGljIGlubGluZSBhY3BpX2hhbmRsZSBhY3BpX2ZpbmRfcm9vdF9icmlkZ2VfaGFuZGxlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogeyByZXR1cm4gTlVMTDsgfQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaS5oIGIvaW5jbHVkZS9saW51eC9wY2kuaAppbmRleCAwM2IwYjhjLi44MGY4YjhiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGNpLmgKQEAgLTgyLDcgKzgyLDMwIEBACiAjZGVmaW5lIFBDSV9ETUFfRlJPTURFVklDRQkyCiAjZGVmaW5lIFBDSV9ETUFfTk9ORQkJMwogCi0jZGVmaW5lIERFVklDRV9DT1VOVF9SRVNPVVJDRQkxMgorLyoKKyAqICBGb3IgUENJIGRldmljZXMsIHRoZSByZWdpb24gbnVtYmVycyBhcmUgYXNzaWduZWQgdGhpcyB3YXk6CisgKi8KK2VudW0geworCS8qICMwLTU6IHN0YW5kYXJkIFBDSSByZXNvdXJjZXMgKi8KKwlQQ0lfU1REX1JFU09VUkNFUywKKwlQQ0lfU1REX1JFU09VUkNFX0VORCA9IDUsCisKKwkvKiAjNjogZXhwYW5zaW9uIFJPTSByZXNvdXJjZSAqLworCVBDSV9ST01fUkVTT1VSQ0UsCisKKwkvKiByZXNvdXJjZXMgYXNzaWduZWQgdG8gYnVzZXMgYmVoaW5kIHRoZSBicmlkZ2UgKi8KKyNkZWZpbmUgUENJX0JSSURHRV9SRVNPVVJDRV9OVU0gNAorCisJUENJX0JSSURHRV9SRVNPVVJDRVMsCisJUENJX0JSSURHRV9SRVNPVVJDRV9FTkQgPSBQQ0lfQlJJREdFX1JFU09VUkNFUyArCisJCQkJICBQQ0lfQlJJREdFX1JFU09VUkNFX05VTSAtIDEsCisKKwkvKiB0b3RhbCByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGEgUENJIGRldmljZSAqLworCVBDSV9OVU1fUkVTT1VSQ0VTLAorCisJLyogcHJlc2VydmUgdGhpcyBmb3IgY29tcGF0aWJpbGl0eSAqLworCURFVklDRV9DT1VOVF9SRVNPVVJDRQorfTsKIAogdHlwZWRlZiBpbnQgX19iaXR3aXNlIHBjaV9wb3dlcl90OwogCkBAIC0yNzQsMTggKzI5Nyw2IEBACiAJaGxpc3RfYWRkX2hlYWQoJm5ld19jYXAtPm5leHQsICZwY2lfZGV2LT5zYXZlZF9jYXBfc3BhY2UpOwogfQogCi0vKgotICogIEZvciBQQ0kgZGV2aWNlcywgdGhlIHJlZ2lvbiBudW1iZXJzIGFyZSBhc3NpZ25lZCB0aGlzIHdheToKLSAqCi0gKgkwLTUJc3RhbmRhcmQgUENJIHJlZ2lvbnMKLSAqCTYJZXhwYW5zaW9uIFJPTQotICoJNy0xMAlicmlkZ2VzOiBhZGRyZXNzIHNwYWNlIGFzc2lnbmVkIHRvIGJ1c2VzIGJlaGluZCB0aGUgYnJpZGdlCi0gKi8KLQotI2RlZmluZSBQQ0lfUk9NX1JFU09VUkNFCTYKLSNkZWZpbmUgUENJX0JSSURHRV9SRVNPVVJDRVMJNwotI2RlZmluZSBQQ0lfTlVNX1JFU09VUkNFUwkxMQotCiAjaWZuZGVmIFBDSV9CVVNfTlVNX1JFU09VUkNFUwogI2RlZmluZSBQQ0lfQlVTX05VTV9SRVNPVVJDRVMJMTYKICNlbmRpZgpAQCAtMzI1LDYgKzMzNiwxNSBAQAogI2RlZmluZSBwY2lfYnVzX2IobikJbGlzdF9lbnRyeShuLCBzdHJ1Y3QgcGNpX2J1cywgbm9kZSkKICNkZWZpbmUgdG9fcGNpX2J1cyhuKQljb250YWluZXJfb2Yobiwgc3RydWN0IHBjaV9idXMsIGRldikKIAorI2lmZGVmIENPTkZJR19QQ0lfTVNJCitzdGF0aWMgaW5saW5lIGJvb2wgcGNpX2Rldl9tc2lfZW5hYmxlZChzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3sKKwlyZXR1cm4gcGNpX2Rldi0+bXNpX2VuYWJsZWQgfHwgcGNpX2Rldi0+bXNpeF9lbmFibGVkOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgYm9vbCBwY2lfZGV2X21zaV9lbmFibGVkKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KSB7IHJldHVybiBmYWxzZTsgfQorI2VuZGlmCisKIC8qCiAgKiBFcnJvciB2YWx1ZXMgdGhhdCBtYXkgYmUgcmV0dXJuZWQgYnkgUENJIGZ1bmN0aW9ucy4KICAqLwpAQCAtNDIxLDcgKzQ0MSw2IEBACiAJaW50ICAoKnJlc3VtZV9lYXJseSkgKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogCWludCAgKCpyZXN1bWUpIChzdHJ1Y3QgcGNpX2RldiAqZGV2KTsJICAgICAgICAgICAgICAgIC8qIERldmljZSB3b2tlbiB1cCAqLwogCXZvaWQgKCpzaHV0ZG93bikgKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwotCXN0cnVjdCBwbV9leHRfb3BzICpwbTsKIAlzdHJ1Y3QgcGNpX2Vycm9yX2hhbmRsZXJzICplcnJfaGFuZGxlcjsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlcglkcml2ZXI7CiAJc3RydWN0IHBjaV9keW5pZHMgZHluaWRzOwpAQCAtNTMzLDcgKzU1Miw5IEBACiB2b2lkIHBjaV9yZWFkX2JyaWRnZV9iYXNlcyhzdHJ1Y3QgcGNpX2J1cyAqY2hpbGQpOwogc3RydWN0IHJlc291cmNlICpwY2lfZmluZF9wYXJlbnRfcmVzb3VyY2UoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwKIAkJCQkJICBzdHJ1Y3QgcmVzb3VyY2UgKnJlcyk7Cit1OCBwY2lfc3dpenpsZV9pbnRlcnJ1cHRfcGluKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHBpbik7CiBpbnQgcGNpX2dldF9pbnRlcnJ1cHRfcGluKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCBwY2lfZGV2ICoqYnJpZGdlKTsKK3U4IHBjaV9jb21tb25fc3dpenpsZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCAqcGlucCk7CiBleHRlcm4gc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZfZ2V0KHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogZXh0ZXJuIHZvaWQgcGNpX2Rldl9wdXQoc3RydWN0IHBjaV9kZXYgKmRldik7CiBleHRlcm4gdm9pZCBwY2lfcmVtb3ZlX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYik7CkBAIC02MzAsNiArNjUxLDcgQEAKIAogdm9pZCBwY2lfZGlzYWJsZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldik7CiB2b2lkIHBjaV9zZXRfbWFzdGVyKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwordm9pZCBwY2lfY2xlYXJfbWFzdGVyKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogaW50IHBjaV9zZXRfcGNpZV9yZXNldF9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBlbnVtIHBjaWVfcmVzZXRfc3RhdGUgc3RhdGUpOwogI2RlZmluZSBIQVZFX1BDSV9TRVRfTVdJCiBpbnQgX19tdXN0X2NoZWNrIHBjaV9zZXRfbXdpKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwpAQCAtNjQ4LDcgKzY3MCw3IEBACiBpbnQgcGNpZV9zZXRfcmVhZHJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBycSk7CiBpbnQgcGNpX3Jlc2V0X2Z1bmN0aW9uKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogaW50IHBjaV9leGVjdXRlX3Jlc2V0X2Z1bmN0aW9uKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwotdm9pZCBwY2lfdXBkYXRlX3Jlc291cmNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCByZXNvdXJjZSAqcmVzLCBpbnQgcmVzbm8pOwordm9pZCBwY2lfdXBkYXRlX3Jlc291cmNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCByZXNubyk7CiBpbnQgX19tdXN0X2NoZWNrIHBjaV9hc3NpZ25fcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGkpOwogaW50IHBjaV9zZWxlY3RfYmFycyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKIApAQCAtNjc1LDYgKzY5NywxMSBAQAogLyogRnVuY3Rpb25zIGZvciBQQ0kgSG90cGx1ZyBkcml2ZXJzIHRvIHVzZSAqLwogaW50IHBjaV9idXNfZmluZF9jYXBhYmlsaXR5KHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IGNhcCk7CiAKKy8qIFZpdGFsIHByb2R1Y3QgZGF0YSByb3V0aW5lcyAqLworc3NpemVfdCBwY2lfcmVhZF92cGQoc3RydWN0IHBjaV9kZXYgKmRldiwgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50LCB2b2lkICpidWYpOworc3NpemVfdCBwY2lfd3JpdGVfdnBkKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGxvZmZfdCBwb3MsIHNpemVfdCBjb3VudCwgY29uc3Qgdm9pZCAqYnVmKTsKK2ludCBwY2lfdnBkX3RydW5jYXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHNpemVfdCBzaXplKTsKKwogLyogSGVscGVyIGZ1bmN0aW9ucyBmb3IgbG93LWxldmVsIGNvZGUgKGRyaXZlcnMvcGNpL3NldHVwLVtidXMscmVzXS5jKSAqLwogdm9pZCBwY2lfYnVzX2Fzc2lnbl9yZXNvdXJjZXMoc3RydWN0IHBjaV9idXMgKmJ1cyk7CiB2b2lkIHBjaV9idXNfc2l6ZV9icmlkZ2VzKHN0cnVjdCBwY2lfYnVzICpidXMpOwpAQCAtNjg3LDEwICs3MTQsMTMgQEAKIAkJICAgIGludCAoKikoc3RydWN0IHBjaV9kZXYgKiwgdTgsIHU4KSk7CiAjZGVmaW5lIEhBVkVfUENJX1JFUV9SRUdJT05TCTIKIGludCBfX211c3RfY2hlY2sgcGNpX3JlcXVlc3RfcmVnaW9ucyhzdHJ1Y3QgcGNpX2RldiAqLCBjb25zdCBjaGFyICopOworaW50IF9fbXVzdF9jaGVjayBwY2lfcmVxdWVzdF9yZWdpb25zX2V4Y2x1c2l2ZShzdHJ1Y3QgcGNpX2RldiAqLCBjb25zdCBjaGFyICopOwogdm9pZCBwY2lfcmVsZWFzZV9yZWdpb25zKHN0cnVjdCBwY2lfZGV2ICopOwogaW50IF9fbXVzdF9jaGVjayBwY2lfcmVxdWVzdF9yZWdpb24oc3RydWN0IHBjaV9kZXYgKiwgaW50LCBjb25zdCBjaGFyICopOworaW50IF9fbXVzdF9jaGVjayBwY2lfcmVxdWVzdF9yZWdpb25fZXhjbHVzaXZlKHN0cnVjdCBwY2lfZGV2ICosIGludCwgY29uc3QgY2hhciAqKTsKIHZvaWQgcGNpX3JlbGVhc2VfcmVnaW9uKHN0cnVjdCBwY2lfZGV2ICosIGludCk7CiBpbnQgcGNpX3JlcXVlc3Rfc2VsZWN0ZWRfcmVnaW9ucyhzdHJ1Y3QgcGNpX2RldiAqLCBpbnQsIGNvbnN0IGNoYXIgKik7CitpbnQgcGNpX3JlcXVlc3Rfc2VsZWN0ZWRfcmVnaW9uc19leGNsdXNpdmUoc3RydWN0IHBjaV9kZXYgKiwgaW50LCBjb25zdCBjaGFyICopOwogdm9pZCBwY2lfcmVsZWFzZV9zZWxlY3RlZF9yZWdpb25zKHN0cnVjdCBwY2lfZGV2ICosIGludCk7CiAKIC8qIGRyaXZlcnMvcGNpL2J1cy5jICovCkBAIC03ODAsNiArODEwLDEwIEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwY2lfcmVzdG9yZV9tc2lfc3RhdGUoc3RydWN0IHBjaV9kZXYgKmRldikKIHsgfQorc3RhdGljIGlubGluZSBpbnQgcGNpX21zaV9lbmFibGVkKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CiAjZWxzZQogZXh0ZXJuIGludCBwY2lfZW5hYmxlX21zaShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIGV4dGVybiB2b2lkIHBjaV9tc2lfc2h1dGRvd24oc3RydWN0IHBjaV9kZXYgKmRldik7CkBAIC03OTAsNiArODI0LDE2IEBACiBleHRlcm4gdm9pZCBwY2lfZGlzYWJsZV9tc2l4KHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogZXh0ZXJuIHZvaWQgbXNpX3JlbW92ZV9wY2lfaXJxX3ZlY3RvcnMoc3RydWN0IHBjaV9kZXYgKmRldik7CiBleHRlcm4gdm9pZCBwY2lfcmVzdG9yZV9tc2lfc3RhdGUoc3RydWN0IHBjaV9kZXYgKmRldik7CitleHRlcm4gaW50IHBjaV9tc2lfZW5hYmxlZCh2b2lkKTsKKyNlbmRpZgorCisjaWZuZGVmIENPTkZJR19QQ0lFQVNQTQorc3RhdGljIGlubGluZSBpbnQgcGNpZV9hc3BtX2VuYWJsZWQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbHNlCitleHRlcm4gaW50IHBjaWVfYXNwbV9lbmFibGVkKHZvaWQpOwogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfSFRfSVJRCkBAIC0xMTQxLDIwICsxMTg1LDkgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwY2lfbW1jZmdfbGF0ZV9pbml0KHZvaWQpIHsgfQogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfSEFTX0lPTUVNCi1zdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqcGNpX2lvcmVtYXBfYmFyKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgYmFyKQotewotCS8qCi0JICogTWFrZSBzdXJlIHRoZSBCQVIgaXMgYWN0dWFsbHkgYSBtZW1vcnkgcmVzb3VyY2UsIG5vdCBhbiBJTyByZXNvdXJjZQotCSAqLwotCWlmICghKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCBiYXIpICYgSU9SRVNPVVJDRV9NRU0pKSB7Ci0JCVdBUk5fT04oMSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gaW9yZW1hcF9ub2NhY2hlKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBiYXIpLAotCQkJCSAgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCBiYXIpKTsKLX0KLSNlbmRpZgoraW50IHBjaV9leHRfY2ZnX2F2YWlsKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworCit2b2lkIF9faW9tZW0gKnBjaV9pb3JlbWFwX2JhcihzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGJhcik7CiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogTElOVVhfUENJX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpX2hvdHBsdWcuaCBiL2luY2x1ZGUvbGludXgvcGNpX2hvdHBsdWcuaAppbmRleCBhMDBiZDFhLi5mN2NjMjA0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaV9ob3RwbHVnLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2lfaG90cGx1Zy5oCkBAIC0yMjgsNiArMjI4LDggQEAKIAkJCQlzdHJ1Y3QgaG90cGx1Z19wYXJhbXMgKmhwcCk7CiBpbnQgYWNwaV9nZXRfaHBfaHdfY29udHJvbF9mcm9tX2Zpcm13YXJlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHUzMiBmbGFncyk7CiBpbnQgYWNwaV9yb290X2JyaWRnZShhY3BpX2hhbmRsZSBoYW5kbGUpOworaW50IGFjcGlfcGNpX2NoZWNrX2VqZWN0YWJsZShzdHJ1Y3QgcGNpX2J1cyAqcGJ1cywgYWNwaV9oYW5kbGUgaGFuZGxlKTsKK2ludCBhY3BpX3BjaV9kZXRlY3RfZWplY3RhYmxlKHN0cnVjdCBwY2lfYnVzICpwYnVzKTsKICNlbmRpZgogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oIGIvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKaW5kZXggMjE4YzczYi4uZDU0MzM2NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKQEAgLTE2NTgsNiArMTY1OCw3IEBACiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfUk9DS1dFTEwJCTB4MTI3QQogCiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfSVRFCQkweDEyODMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JVEVfODE3MgkJMHg4MTcyCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSVRFXzgyMTEJCTB4ODIxMQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lURV84MjEyCQkweDgyMTIKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JVEVfODIxMwkJMHg4MjEzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaV9yZWdzLmggYi9pbmNsdWRlL2xpbnV4L3BjaV9yZWdzLmgKaW5kZXggZTVlZmZkNC4uMDI3ODE1YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2lfcmVncy5oCisrKyBiL2luY2x1ZGUvbGludXgvcGNpX3JlZ3MuaApAQCAtMjEwLDYgKzIxMCw3IEBACiAjZGVmaW5lICBQQ0lfQ0FQX0lEX0FHUDMJMHgwRQkvKiBBR1AgVGFyZ2V0IFBDSS1QQ0kgYnJpZGdlICovCiAjZGVmaW5lICBQQ0lfQ0FQX0lEX0VYUCAJMHgxMAkvKiBQQ0kgRXhwcmVzcyAqLwogI2RlZmluZSAgUENJX0NBUF9JRF9NU0lYCTB4MTEJLyogTVNJLVggKi8KKyNkZWZpbmUgIFBDSV9DQVBfSURfQUYJCTB4MTMJLyogUENJIEFkdmFuY2VkIEZlYXR1cmVzICovCiAjZGVmaW5lIFBDSV9DQVBfTElTVF9ORVhUCTEJLyogTmV4dCBjYXBhYmlsaXR5IGluIHRoZSBsaXN0ICovCiAjZGVmaW5lIFBDSV9DQVBfRkxBR1MJCTIJLyogQ2FwYWJpbGl0eSBkZWZpbmVkIGZsYWdzICgxNiBiaXRzKSAqLwogI2RlZmluZSBQQ0lfQ0FQX1NJWkVPRgkJNApAQCAtMzE2LDYgKzMxNywxNyBAQAogI2RlZmluZSAgUENJX0NIU1dQX0VYVAkJMHg0MAkvKiBFTlVNIyBzdGF0dXMgLSBleHRyYWN0aW9uICovCiAjZGVmaW5lICBQQ0lfQ0hTV1BfSU5TCQkweDgwCS8qIEVOVU0jIHN0YXR1cyAtIGluc2VydGlvbiAqLwogCisvKiBQQ0kgQWR2YW5jZWQgRmVhdHVyZSByZWdpc3RlcnMgKi8KKworI2RlZmluZSBQQ0lfQUZfTEVOR1RICQkyCisjZGVmaW5lIFBDSV9BRl9DQVAJCTMKKyNkZWZpbmUgIFBDSV9BRl9DQVBfVFAJCTB4MDEKKyNkZWZpbmUgIFBDSV9BRl9DQVBfRkxSCQkweDAyCisjZGVmaW5lIFBDSV9BRl9DVFJMCQk0CisjZGVmaW5lICBQQ0lfQUZfQ1RSTF9GTFIJMHgwMQorI2RlZmluZSBQQ0lfQUZfU1RBVFVTCQk1CisjZGVmaW5lICBQQ0lfQUZfU1RBVFVTX1RQCTB4MDEKKwogLyogUENJLVggcmVnaXN0ZXJzICovCiAKICNkZWZpbmUgUENJX1hfQ01ECQkyCS8qIE1vZGVzICYgRmVhdHVyZXMgKi8KQEAgLTM5OSwyMCArNDExLDcwIEBACiAjZGVmaW5lICBQQ0lfRVhQX0RFVlNUQV9BVVhQRAkweDEwCS8qIEFVWCBQb3dlciBEZXRlY3RlZCAqLwogI2RlZmluZSAgUENJX0VYUF9ERVZTVEFfVFJQTkQJMHgyMAkvKiBUcmFuc2FjdGlvbnMgUGVuZGluZyAqLwogI2RlZmluZSBQQ0lfRVhQX0xOS0NBUAkJMTIJLyogTGluayBDYXBhYmlsaXRpZXMgKi8KLSNkZWZpbmUgIFBDSV9FWFBfTE5LQ0FQX0FTUE1TCTB4YzAwCS8qIEFTUE0gU3VwcG9ydCAqLwotI2RlZmluZSAgUENJX0VYUF9MTktDQVBfTDBTRUwJMHg3MDAwCS8qIEwwcyBFeGl0IExhdGVuY3kgKi8KLSNkZWZpbmUgIFBDSV9FWFBfTE5LQ0FQX0wxRUwJMHgzODAwMAkvKiBMMSBFeGl0IExhdGVuY3kgKi8KLSNkZWZpbmUgIFBDSV9FWFBfTE5LQ0FQX0NMS1BNCTB4NDAwMDAJLyogTDEgQ2xvY2sgUG93ZXIgTWFuYWdlbWVudCAqLworI2RlZmluZSAgUENJX0VYUF9MTktDQVBfU0xTCTB4MDAwMDAwMGYgLyogU3VwcG9ydGVkIExpbmsgU3BlZWRzICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS0NBUF9NTFcJMHgwMDAwMDNmMCAvKiBNYXhpbXVtIExpbmsgV2lkdGggKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ0FQX0FTUE1TCTB4MDAwMDBjMDAgLyogQVNQTSBTdXBwb3J0ICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS0NBUF9MMFNFTAkweDAwMDA3MDAwIC8qIEwwcyBFeGl0IExhdGVuY3kgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ0FQX0wxRUwJMHgwMDAzODAwMCAvKiBMMSBFeGl0IExhdGVuY3kgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ0FQX0NMS1BNCTB4MDAwNDAwMDAgLyogTDEgQ2xvY2sgUG93ZXIgTWFuYWdlbWVudCAqLworI2RlZmluZSAgUENJX0VYUF9MTktDQVBfU0RFUkMJMHgwMDA4MDAwMCAvKiBTdXByaXNlIERvd24gRXJyb3IgUmVwb3J0aW5nIENhcGFibGUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ0FQX0RMTExBUkMJMHgwMDEwMDAwMCAvKiBEYXRhIExpbmsgTGF5ZXIgTGluayBBY3RpdmUgUmVwb3J0aW5nIENhcGFibGUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ0FQX0xCTkMJMHgwMDIwMDAwMCAvKiBMaW5rIEJhbmR3aWR0aCBOb3RpZmljYXRpb24gQ2FwYWJpbGl0eSAqLworI2RlZmluZSAgUENJX0VYUF9MTktDQVBfUE4JMHhmZjAwMDAwMCAvKiBQb3J0IE51bWJlciAqLwogI2RlZmluZSBQQ0lfRVhQX0xOS0NUTAkJMTYJLyogTGluayBDb250cm9sICovCi0jZGVmaW5lICBQQ0lfRVhQX0xOS0NUTF9STAkweDIwCS8qIFJldHJhaW4gTGluayAqLwotI2RlZmluZSAgUENJX0VYUF9MTktDVExfQ0NDCTB4NDAJLyogQ29tbW9uIENsb2NrIENPbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ1RMX0FTUE1DCTB4MDAwMwkvKiBBU1BNIENvbnRyb2wgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ1RMX1JDQgkweDAwMDgJLyogUmVhZCBDb21wbGV0aW9uIEJvdW5kYXJ5ICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS0NUTF9MRAkweDAwMTAJLyogTGluayBEaXNhYmxlICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS0NUTF9STAkweDAwMjAJLyogUmV0cmFpbiBMaW5rICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS0NUTF9DQ0MJMHgwMDQwCS8qIENvbW1vbiBDbG9jayBDb25maWd1cmF0aW9uICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS0NUTF9FUwkweDAwODAJLyogRXh0ZW5kZWQgU3luY2ggKi8KICNkZWZpbmUgIFBDSV9FWFBfTE5LQ1RMX0NMS1JFUV9FTiAweDEwMAkvKiBFbmFibGUgY2xrcmVxICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS0NUTF9IQVdECTB4MDIwMAkvKiBIYXJkd2FyZSBBdXRvbm9tb3VzIFdpZHRoIERpc2FibGUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ1RMX0xCTUlFCTB4MDQwMAkvKiBMaW5rIEJhbmR3aWR0aCBNYW5hZ2VtZW50IEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ1RMX0xBQklFCTB4MDgwMAkvKiBMbmsgQXV0b25vbW91cyBCYW5kd2lkdGggSW50ZXJydXB0IEVuYWJsZSAqLwogI2RlZmluZSBQQ0lfRVhQX0xOS1NUQQkJMTgJLyogTGluayBTdGF0dXMgKi8KLSNkZWZpbmUgIFBDSV9FWFBfTE5LU1RBX0xUCTB4ODAwCS8qIExpbmsgVHJhaW5pbmcgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LU1RBX0NMUwkweDAwMGYJLyogQ3VycmVudCBMaW5rIFNwZWVkICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS1NUQV9OTFcJMHgwM2YwCS8qIE5vZ290aWF0ZWQgTGluayBXaWR0aCAqLworI2RlZmluZSAgUENJX0VYUF9MTktTVEFfTFQJMHgwODAwCS8qIExpbmsgVHJhaW5pbmcgKi8KICNkZWZpbmUgIFBDSV9FWFBfTE5LU1RBX1NMQwkweDEwMDAJLyogU2xvdCBDbG9jayBDb25maWd1cmF0aW9uICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS1NUQV9ETExMQQkweDIwMDAJLyogRGF0YSBMaW5rIExheWVyIExpbmsgQWN0aXZlICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS1NUQV9MQk1TCTB4NDAwMAkvKiBMaW5rIEJhbmR3aWR0aCBNYW5hZ2VtZW50IFN0YXR1cyAqLworI2RlZmluZSAgUENJX0VYUF9MTktTVEFfTEFCUwkweDgwMDAJLyogTGluayBBdXRvbm9tb3VzIEJhbmR3aWR0aCBTdGF0dXMgKi8KICNkZWZpbmUgUENJX0VYUF9TTFRDQVAJCTIwCS8qIFNsb3QgQ2FwYWJpbGl0aWVzICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENBUF9BQlAJMHgwMDAwMDAwMSAvKiBBdHRlbnRpb24gQnV0dG9uIFByZXNlbnQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUQ0FQX1BDUAkweDAwMDAwMDAyIC8qIFBvd2VyIENvbnRyb2xsZXIgUHJlc2VudCAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDQVBfTVJMU1AJMHgwMDAwMDAwNCAvKiBNUkwgU2Vuc29yIFByZXNlbnQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUQ0FQX0FJUAkweDAwMDAwMDA4IC8qIEF0dGVudGlvbiBJbmRpY2F0b3IgUHJlc2VudCAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDQVBfUElQCTB4MDAwMDAwMTAgLyogUG93ZXIgSW5kaWNhdG9yIFByZXNlbnQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUQ0FQX0hQUwkweDAwMDAwMDIwIC8qIEhvdC1QbHVnIFN1cnByaXNlICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENBUF9IUEMJMHgwMDAwMDA0MCAvKiBIb3QtUGx1ZyBDYXBhYmxlICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENBUF9TUExWCTB4MDAwMDdmODAgLyogU2xvdCBQb3dlciBMaW1pdCBWYWx1ZSAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDQVBfU1BMUwkweDAwMDE4MDAwIC8qIFNsb3QgUG93ZXIgTGltaXQgU2NhbGUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUQ0FQX0VJUAkweDAwMDIwMDAwIC8qIEVsZWN0cm9tZWNoYW5pY2FsIEludGVybG9jayBQcmVzZW50ICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENBUF9OQ0NTCTB4MDAwNDAwMDAgLyogTm8gQ29tbWFuZCBDb21wbGV0ZWQgU3VwcG9ydCAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDQVBfUFNOCTB4ZmZmODAwMDAgLyogUGh5c2ljYWwgU2xvdCBOdW1iZXIgKi8KICNkZWZpbmUgUENJX0VYUF9TTFRDVEwJCTI0CS8qIFNsb3QgQ29udHJvbCAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDVExfQUJQRQkweDAwMDEJLyogQXR0ZW50aW9uIEJ1dHRvbiBQcmVzc2VkIEVuYWJsZSAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDVExfUEZERQkweDAwMDIJLyogUG93ZXIgRmF1bHQgRGV0ZWN0ZWQgRW5hYmxlICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENUTF9NUkxTQ0UJMHgwMDA0CS8qIE1STCBTZW5zb3IgQ2hhbmdlZCBFbmFibGUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUQ1RMX1BEQ0UJMHgwMDA4CS8qIFByZXNlbmNlIERldGVjdCBDaGFuZ2VkIEVuYWJsZSAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDVExfQ0NJRQkweDAwMTAJLyogQ29tbWFuZCBDb21wbGV0ZWQgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDVExfSFBJRQkweDAwMjAJLyogSG90LVBsdWcgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDVExfQUlDCTB4MDBjMAkvKiBBdHRlbnRpb24gSW5kaWNhdG9yIENvbnRyb2wgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUQ1RMX1BJQwkweDAzMDAJLyogUG93ZXIgSW5kaWNhdG9yIENvbnRyb2wgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUQ1RMX1BDQwkweDA0MDAJLyogUG93ZXIgQ29udHJvbGxlciBDb250cm9sICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENUTF9FSUMJMHgwODAwCS8qIEVsZWN0cm9tZWNoYW5pY2FsIEludGVybG9jayBDb250cm9sICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENUTF9ETExTQ0UJMHgxMDAwCS8qIERhdGEgTGluayBMYXllciBTdGF0ZSBDaGFuZ2VkIEVuYWJsZSAqLwogI2RlZmluZSBQQ0lfRVhQX1NMVFNUQQkJMjYJLyogU2xvdCBTdGF0dXMgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUU1RBX0FCUAkweDAwMDEJLyogQXR0ZW50aW9uIEJ1dHRvbiBQcmVzc2VkICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVFNUQV9QRkQJMHgwMDAyCS8qIFBvd2VyIEZhdWx0IERldGVjdGVkICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVFNUQV9NUkxTQwkweDAwMDQJLyogTVJMIFNlbnNvciBDaGFuZ2VkICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVFNUQV9QREMJMHgwMDA4CS8qIFByZXNlbmNlIERldGVjdCBDaGFuZ2VkICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVFNUQV9DQwkweDAwMTAJLyogQ29tbWFuZCBDb21wbGV0ZWQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUU1RBX01STFNTCTB4MDAyMAkvKiBNUkwgU2Vuc29yIFN0YXRlICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVFNUQV9QRFMJMHgwMDQwCS8qIFByZXNlbmNlIERldGVjdCBTdGF0ZSAqLworI2RlZmluZSAgUENJX0VYUF9TTFRTVEFfRUlTCTB4MDA4MAkvKiBFbGVjdHJvbWVjaGFuaWNhbCBJbnRlcmxvY2sgU3RhdHVzICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVFNUQV9ETExTQwkweDAxMDAJLyogRGF0YSBMaW5rIExheWVyIFN0YXRlIENoYW5nZWQgKi8KICNkZWZpbmUgUENJX0VYUF9SVENUTAkJMjgJLyogUm9vdCBDb250cm9sICovCiAjZGVmaW5lICBQQ0lfRVhQX1JUQ1RMX1NFQ0VFCTB4MDEJLyogU3lzdGVtIEVycm9yIG9uIENvcnJlY3RhYmxlIEVycm9yICovCiAjZGVmaW5lICBQQ0lfRVhQX1JUQ1RMX1NFTkZFRQkweDAyCS8qIFN5c3RlbSBFcnJvciBvbiBOb24tRmF0YWwgRXJyb3IgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGVyY3B1X2NvdW50ZXIuaCBiL2luY2x1ZGUvbGludXgvcGVyY3B1X2NvdW50ZXIuaAppbmRleCA5MDA3Y2NkLi5hNzY4NGE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BlcmNwdV9jb3VudGVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9wZXJjcHVfY291bnRlci5oCkBAIC0yNCwxNCArMjQsMTggQEAKIAlzMzIgKmNvdW50ZXJzOwogfTsKIAotI2lmIE5SX0NQVVMgPj0gMTYKLSNkZWZpbmUgRkJDX0JBVENICShOUl9DUFVTKjIpCi0jZWxzZQotI2RlZmluZSBGQkNfQkFUQ0gJKE5SX0NQVVMqNCkKLSNlbmRpZgorZXh0ZXJuIGludCBwZXJjcHVfY291bnRlcl9iYXRjaDsKIAotaW50IHBlcmNwdV9jb3VudGVyX2luaXQoc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMsIHM2NCBhbW91bnQpOwotaW50IHBlcmNwdV9jb3VudGVyX2luaXRfaXJxKHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjLCBzNjQgYW1vdW50KTsKK2ludCBfX3BlcmNwdV9jb3VudGVyX2luaXQoc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMsIHM2NCBhbW91bnQsCisJCQkgIHN0cnVjdCBsb2NrX2NsYXNzX2tleSAqa2V5KTsKKworI2RlZmluZSBwZXJjcHVfY291bnRlcl9pbml0KGZiYywgdmFsdWUpCQkJCQlcCisJKHsJCQkJCQkJCVwKKwkJc3RhdGljIHN0cnVjdCBsb2NrX2NsYXNzX2tleSBfX2tleTsJCQlcCisJCQkJCQkJCQlcCisJCV9fcGVyY3B1X2NvdW50ZXJfaW5pdChmYmMsIHZhbHVlLCAmX19rZXkpOwkJXAorCX0pCisKIHZvaWQgcGVyY3B1X2NvdW50ZXJfZGVzdHJveShzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYyk7CiB2b2lkIHBlcmNwdV9jb3VudGVyX3NldChzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYywgczY0IGFtb3VudCk7CiB2b2lkIF9fcGVyY3B1X2NvdW50ZXJfYWRkKHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjLCBzNjQgYW1vdW50LCBzMzIgYmF0Y2gpOwpAQCAtMzksNyArNDMsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgcGVyY3B1X2NvdW50ZXJfYWRkKHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjLCBzNjQgYW1vdW50KQogewotCV9fcGVyY3B1X2NvdW50ZXJfYWRkKGZiYywgYW1vdW50LCBGQkNfQkFUQ0gpOworCV9fcGVyY3B1X2NvdW50ZXJfYWRkKGZiYywgYW1vdW50LCBwZXJjcHVfY291bnRlcl9iYXRjaCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgczY0IHBlcmNwdV9jb3VudGVyX3N1bV9wb3NpdGl2ZShzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYykKQEAgLTg1LDggKzg5LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2RlZmluZSBwZXJjcHVfY291bnRlcl9pbml0X2lycSBwZXJjcHVfY291bnRlcl9pbml0Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBwZXJjcHVfY291bnRlcl9kZXN0cm95KHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjKQogewogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9waWQuaCBiL2luY2x1ZGUvbGludXgvcGlkLmgKaW5kZXggYmIyMDZjNS4uNDlmMWMyZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9waWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BpZC5oCkBAIC0xMjMsNiArMTIzLDI0IEBACiBleHRlcm4gdm9pZCBmcmVlX3BpZChzdHJ1Y3QgcGlkICpwaWQpOwogCiAvKgorICogbnNfb2ZfcGlkKCkgcmV0dXJucyB0aGUgcGlkIG5hbWVzcGFjZSBpbiB3aGljaCB0aGUgc3BlY2lmaWVkIHBpZCB3YXMKKyAqIGFsbG9jYXRlZC4KKyAqCisgKiBOT1RFOgorICogCW5zX29mX3BpZCgpIGlzIGV4cGVjdGVkIHRvIGJlIGNhbGxlZCBmb3IgYSBwcm9jZXNzICh0YXNrKSB0aGF0IGhhcworICogCWFuIGF0dGFjaGVkICdzdHJ1Y3QgcGlkJyAoc2VlIGF0dGFjaF9waWQoKSwgZGV0YWNoX3BpZCgpKSBpLmUgQHBpZAorICogCWlzIGV4cGVjdGVkIHRvIGJlIG5vbi1OVUxMLiBJZiBAcGlkIGlzIE5VTEwsIGNhbGxlciBzaG91bGQgaGFuZGxlCisgKiAJdGhlIHJlc3VsdGluZyBOVUxMIHBpZC1ucy4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqbnNfb2ZfcGlkKHN0cnVjdCBwaWQgKnBpZCkKK3sKKwlzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqbnMgPSBOVUxMOworCWlmIChwaWQpCisJCW5zID0gcGlkLT5udW1iZXJzW3BpZC0+bGV2ZWxdLm5zOworCXJldHVybiBuczsKK30KKworLyoKICAqIHRoZSBoZWxwZXJzIHRvIGdldCB0aGUgcGlkJ3MgaWQgc2VlbiBmcm9tIGRpZmZlcmVudCBuYW1lc3BhY2VzCiAgKgogICogcGlkX25yKCkgICAgOiBnbG9iYWwgaWQsIGkuZS4gdGhlIGlkIHNlZW4gZnJvbSB0aGUgaW5pdCBuYW1lc3BhY2U7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BpZF9uYW1lc3BhY2UuaCBiL2luY2x1ZGUvbGludXgvcGlkX25hbWVzcGFjZS5oCmluZGV4IGQ4MmZlODIuLjM4ZDEwMzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGlkX25hbWVzcGFjZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGlkX25hbWVzcGFjZS5oCkBAIC03OSwxMSArNzksNyBAQAogfQogI2VuZGlmIC8qIENPTkZJR19QSURfTlMgKi8KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqdGFza19hY3RpdmVfcGlkX25zKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQotewotCXJldHVybiB0c2stPm5zcHJveHktPnBpZF9uczsKLX0KLQorZXh0ZXJuIHN0cnVjdCBwaWRfbmFtZXNwYWNlICp0YXNrX2FjdGl2ZV9waWRfbnMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spOwogdm9pZCBwaWRoYXNoX2luaXQodm9pZCk7CiB2b2lkIHBpZG1hcF9pbml0KHZvaWQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RldmljZS5oIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kZXZpY2UuaAppbmRleCA0YjhjYzZhLi45YTM0MjY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGV2aWNlLmgKQEAgLTU1LDcgKzU1LDYgQEAKIAlpbnQgKCpzdXNwZW5kX2xhdGUpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKIAlpbnQgKCpyZXN1bWVfZWFybHkpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKik7CiAJaW50ICgqcmVzdW1lKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICopOwotCXN0cnVjdCBwbV9leHRfb3BzICpwbTsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciBkcml2ZXI7CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BtLmggYi9pbmNsdWRlL2xpbnV4L3BtLmgKaW5kZXggNDJkZTQwMC4uZGUyZTBhOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbS5oCisrKyBiL2luY2x1ZGUvbGludXgvcG0uaApAQCAtNDEsNyArNDEsNyBAQAogfSBwbV9tZXNzYWdlX3Q7CiAKIC8qKgotICogc3RydWN0IHBtX29wcyAtIGRldmljZSBQTSBjYWxsYmFja3MKKyAqIHN0cnVjdCBkZXZfcG1fb3BzIC0gZGV2aWNlIFBNIGNhbGxiYWNrcwogICoKICAqIFNldmVyYWwgZHJpdmVyIHBvd2VyIHN0YXRlIHRyYW5zaXRpb25zIGFyZSBleHRlcm5hbGx5IHZpc2libGUsIGFmZmVjdGluZwogICogdGhlIHN0YXRlIG9mIHBlbmRpbmcgSS9PIHF1ZXVlcyBhbmQgKGZvciBkcml2ZXJzIHRoYXQgdG91Y2ggaGFyZHdhcmUpCkBAIC0xMjYsNDYgKzEyNiw2IEBACiAgKglPbiBtb3N0IHBsYXRmb3JtcywgdGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiBhdmFpbGFiaWxpdHkgb2YKICAqCXJlc291cmNlcyBsaWtlIGNsb2NrcyBkdXJpbmcgQHJlc3RvcmUoKS4KICAqCi0gKiBBbGwgb2YgdGhlIGFib3ZlIGNhbGxiYWNrcywgZXhjZXB0IGZvciBAY29tcGxldGUoKSwgcmV0dXJuIGVycm9yIGNvZGVzLgotICogSG93ZXZlciwgdGhlIGVycm9yIGNvZGVzIHJldHVybmVkIGJ5IHRoZSByZXN1bWUgb3BlcmF0aW9ucywgQHJlc3VtZSgpLAotICogQHRoYXcoKSwgYW5kIEByZXN0b3JlKCksIGRvIG5vdCBjYXVzZSB0aGUgUE0gY29yZSB0byBhYm9ydCB0aGUgcmVzdW1lCi0gKiB0cmFuc2l0aW9uIGR1cmluZyB3aGljaCB0aGV5IGFyZSByZXR1cm5lZC4gIFRoZSBlcnJvciBjb2RlcyByZXR1cm5lZCBpbgotICogdGhhdCBjYXNlcyBhcmUgb25seSBwcmludGVkIGJ5IHRoZSBQTSBjb3JlIHRvIHRoZSBzeXN0ZW0gbG9ncyBmb3IgZGVidWdnaW5nCi0gKiBwdXJwb3Nlcy4gIFN0aWxsLCBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IGRyaXZlcnMgb25seSByZXR1cm4gZXJyb3IgY29kZXMKLSAqIGZyb20gdGhlaXIgcmVzdW1lIG1ldGhvZHMgaW4gY2FzZSBvZiBhbiB1bnJlY292ZXJhYmxlIGZhaWx1cmUgKGkuZS4gd2hlbiB0aGUKLSAqIGRldmljZSBiZWluZyBoYW5kbGVkIHJlZnVzZXMgdG8gcmVzdW1lIGFuZCBiZWNvbWVzIHVudXNhYmxlKSB0byBhbGxvdyB1cyB0bwotICogbW9kaWZ5IHRoZSBQTSBjb3JlIGluIHRoZSBmdXR1cmUsIHNvIHRoYXQgaXQgY2FuIGF2b2lkIGF0dGVtcHRpbmcgdG8gaGFuZGxlCi0gKiBkZXZpY2VzIHRoYXQgZmFpbGVkIHRvIHJlc3VtZSBhbmQgdGhlaXIgY2hpbGRyZW4uCi0gKgotICogSXQgaXMgYWxsb3dlZCB0byB1bnJlZ2lzdGVyIGRldmljZXMgd2hpbGUgdGhlIGFib3ZlIGNhbGxiYWNrcyBhcmUgYmVpbmcKLSAqIGV4ZWN1dGVkLiAgSG93ZXZlciwgaXQgaXMgbm90IGFsbG93ZWQgdG8gdW5yZWdpc3RlciBhIGRldmljZSBmcm9tIHdpdGhpbiBhbnkKLSAqIG9mIGl0cyBvd24gY2FsbGJhY2tzLgotICovCi0KLXN0cnVjdCBwbV9vcHMgewotCWludCAoKnByZXBhcmUpKHN0cnVjdCBkZXZpY2UgKmRldik7Ci0Jdm9pZCAoKmNvbXBsZXRlKShzdHJ1Y3QgZGV2aWNlICpkZXYpOwotCWludCAoKnN1c3BlbmQpKHN0cnVjdCBkZXZpY2UgKmRldik7Ci0JaW50ICgqcmVzdW1lKShzdHJ1Y3QgZGV2aWNlICpkZXYpOwotCWludCAoKmZyZWV6ZSkoc3RydWN0IGRldmljZSAqZGV2KTsKLQlpbnQgKCp0aGF3KShzdHJ1Y3QgZGV2aWNlICpkZXYpOwotCWludCAoKnBvd2Vyb2ZmKShzdHJ1Y3QgZGV2aWNlICpkZXYpOwotCWludCAoKnJlc3RvcmUpKHN0cnVjdCBkZXZpY2UgKmRldik7Ci19OwotCi0vKioKLSAqIHN0cnVjdCBwbV9leHRfb3BzIC0gZXh0ZW5kZWQgZGV2aWNlIFBNIGNhbGxiYWNrcwotICoKLSAqIFNvbWUgZGV2aWNlcyByZXF1aXJlIGNlcnRhaW4gb3BlcmF0aW9ucyByZWxhdGVkIHRvIHN1c3BlbmQgYW5kIGhpYmVybmF0aW9uCi0gKiB0byBiZSBjYXJyaWVkIG91dCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuICBUaHVzLCAnc3RydWN0IHBtX2V4dF9vcHMnIGJlbG93Ci0gKiBpcyBkZWZpbmVkLCBhZGRpbmcgY2FsbGJhY2tzIHRvIGJlIGV4ZWN1dGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCB0bwotICogJ3N0cnVjdCBwbV9vcHMnLgotICoKLSAqIFRoZSBmb2xsb3dpbmcgY2FsbGJhY2tzIGluY2x1ZGVkIGluICdzdHJ1Y3QgcG1fZXh0X29wcycgYXJlIGV4ZWN1dGVkIHdpdGgKLSAqIHRoZSBub25ib290IENQVXMgc3dpdGNoZWQgb2ZmIGFuZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQgb24gdGhlIG9ubHkKLSAqIGZ1bmN0aW9uYWwgQ1BVLiAgVGhleSBhbHNvIGFyZSBleGVjdXRlZCB3aXRoIHRoZSBQTSBjb3JlIGxpc3Qgb2YgZGV2aWNlcwotICogbG9ja2VkLCBzbyB0aGV5IG11c3QgTk9UIHVucmVnaXN0ZXIgYW55IGRldmljZXMuCi0gKgogICogQHN1c3BlbmRfbm9pcnE6IENvbXBsZXRlIHRoZSBvcGVyYXRpb25zIG9mIC0+c3VzcGVuZCgpIGJ5IGNhcnJ5aW5nIG91dCBhbnkKICAqCWFjdGlvbnMgcmVxdWlyZWQgZm9yIHN1c3BlbmRpbmcgdGhlIGRldmljZSB0aGF0IG5lZWQgaW50ZXJydXB0cyB0byBiZQogICoJZGlzYWJsZWQKQEAgLTE5MCwxOCArMTUwLDMyIEBACiAgKglhY3Rpb25zIHJlcXVpcmVkIGZvciByZXN0b3JpbmcgdGhlIG9wZXJhdGlvbnMgb2YgdGhlIGRldmljZSB0aGF0IG5lZWQKICAqCWludGVycnVwdHMgdG8gYmUgZGlzYWJsZWQKICAqCi0gKiBBbGwgb2YgdGhlIGFib3ZlIGNhbGxiYWNrcyByZXR1cm4gZXJyb3IgY29kZXMsIGJ1dCB0aGUgZXJyb3IgY29kZXMgcmV0dXJuZWQKLSAqIGJ5IHRoZSByZXN1bWUgb3BlcmF0aW9ucywgQHJlc3VtZV9ub2lycSgpLCBAdGhhd19ub2lycSgpLCBhbmQKLSAqIEByZXN0b3JlX25vaXJxKCksIGRvIG5vdCBjYXVzZSB0aGUgUE0gY29yZSB0byBhYm9ydCB0aGUgcmVzdW1lIHRyYW5zaXRpb24KLSAqIGR1cmluZyB3aGljaCB0aGV5IGFyZSByZXR1cm5lZC4gIFRoZSBlcnJvciBjb2RlcyByZXR1cm5lZCBpbiB0aGF0IGNhc2VzIGFyZQotICogb25seSBwcmludGVkIGJ5IHRoZSBQTSBjb3JlIHRvIHRoZSBzeXN0ZW0gbG9ncyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgotICogU3RpbGwsIGFzIHN0YXRlZCBhYm92ZSwgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCBkcml2ZXJzIG9ubHkgcmV0dXJuIGVycm9yCi0gKiBjb2RlcyBmcm9tIHRoZWlyIHJlc3VtZSBtZXRob2RzIGlmIHRoZSBkZXZpY2UgYmVpbmcgaGFuZGxlZCBmYWlscyB0byByZXN1bWUKLSAqIGFuZCBpcyBub3QgdXNhYmxlIGFueSBtb3JlLgorICogQWxsIG9mIHRoZSBhYm92ZSBjYWxsYmFja3MsIGV4Y2VwdCBmb3IgQGNvbXBsZXRlKCksIHJldHVybiBlcnJvciBjb2Rlcy4KKyAqIEhvd2V2ZXIsIHRoZSBlcnJvciBjb2RlcyByZXR1cm5lZCBieSB0aGUgcmVzdW1lIG9wZXJhdGlvbnMsIEByZXN1bWUoKSwKKyAqIEB0aGF3KCksIEByZXN0b3JlKCksIEByZXN1bWVfbm9pcnEoKSwgQHRoYXdfbm9pcnEoKSwgYW5kIEByZXN0b3JlX25vaXJxKCkgZG8KKyAqIG5vdCBjYXVzZSB0aGUgUE0gY29yZSB0byBhYm9ydCB0aGUgcmVzdW1lIHRyYW5zaXRpb24gZHVyaW5nIHdoaWNoIHRoZXkgYXJlCisgKiByZXR1cm5lZC4gIFRoZSBlcnJvciBjb2RlcyByZXR1cm5lZCBpbiB0aGF0IGNhc2VzIGFyZSBvbmx5IHByaW50ZWQgYnkgdGhlIFBNCisgKiBjb3JlIHRvIHRoZSBzeXN0ZW0gbG9ncyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLiAgU3RpbGwsIGl0IGlzIHJlY29tbWVuZGVkCisgKiB0aGF0IGRyaXZlcnMgb25seSByZXR1cm4gZXJyb3IgY29kZXMgZnJvbSB0aGVpciByZXN1bWUgbWV0aG9kcyBpbiBjYXNlIG9mIGFuCisgKiB1bnJlY292ZXJhYmxlIGZhaWx1cmUgKGkuZS4gd2hlbiB0aGUgZGV2aWNlIGJlaW5nIGhhbmRsZWQgcmVmdXNlcyB0byByZXN1bWUKKyAqIGFuZCBiZWNvbWVzIHVudXNhYmxlKSB0byBhbGxvdyB1cyB0byBtb2RpZnkgdGhlIFBNIGNvcmUgaW4gdGhlIGZ1dHVyZSwgc28KKyAqIHRoYXQgaXQgY2FuIGF2b2lkIGF0dGVtcHRpbmcgdG8gaGFuZGxlIGRldmljZXMgdGhhdCBmYWlsZWQgdG8gcmVzdW1lIGFuZAorICogdGhlaXIgY2hpbGRyZW4uCisgKgorICogSXQgaXMgYWxsb3dlZCB0byB1bnJlZ2lzdGVyIGRldmljZXMgd2hpbGUgdGhlIGFib3ZlIGNhbGxiYWNrcyBhcmUgYmVpbmcKKyAqIGV4ZWN1dGVkLiAgSG93ZXZlciwgaXQgaXMgbm90IGFsbG93ZWQgdG8gdW5yZWdpc3RlciBhIGRldmljZSBmcm9tIHdpdGhpbiBhbnkKKyAqIG9mIGl0cyBvd24gY2FsbGJhY2tzLgogICovCiAKLXN0cnVjdCBwbV9leHRfb3BzIHsKLQlzdHJ1Y3QgcG1fb3BzIGJhc2U7CitzdHJ1Y3QgZGV2X3BtX29wcyB7CisJaW50ICgqcHJlcGFyZSkoc3RydWN0IGRldmljZSAqZGV2KTsKKwl2b2lkICgqY29tcGxldGUpKHN0cnVjdCBkZXZpY2UgKmRldik7CisJaW50ICgqc3VzcGVuZCkoc3RydWN0IGRldmljZSAqZGV2KTsKKwlpbnQgKCpyZXN1bWUpKHN0cnVjdCBkZXZpY2UgKmRldik7CisJaW50ICgqZnJlZXplKShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCWludCAoKnRoYXcpKHN0cnVjdCBkZXZpY2UgKmRldik7CisJaW50ICgqcG93ZXJvZmYpKHN0cnVjdCBkZXZpY2UgKmRldik7CisJaW50ICgqcmVzdG9yZSkoc3RydWN0IGRldmljZSAqZGV2KTsKIAlpbnQgKCpzdXNwZW5kX25vaXJxKShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogCWludCAoKnJlc3VtZV9ub2lycSkoc3RydWN0IGRldmljZSAqZGV2KTsKIAlpbnQgKCpmcmVlemVfbm9pcnEpKHN0cnVjdCBkZXZpY2UgKmRldik7CkBAIC0yNzgsNyArMjUyLDcgQEAKICNkZWZpbmUgUE1fRVZFTlRfU0xFRVAJCShQTV9FVkVOVF9TVVNQRU5EIHwgUE1fRVZFTlRfSElCRVJOQVRFKQogI2RlZmluZSBQTV9FVkVOVF9VU0VSX1NVU1BFTkQJKFBNX0VWRU5UX1VTRVIgfCBQTV9FVkVOVF9TVVNQRU5EKQogI2RlZmluZSBQTV9FVkVOVF9VU0VSX1JFU1VNRQkoUE1fRVZFTlRfVVNFUiB8IFBNX0VWRU5UX1JFU1VNRSkKLSNkZWZpbmUgUE1fRVZFTlRfUkVNT1RFX1dBS0VVUAkoUE1fRVZFTlRfUkVNT1RFIHwgUE1fRVZFTlRfUkVTVU1FKQorI2RlZmluZSBQTV9FVkVOVF9SRU1PVEVfUkVTVU1FCShQTV9FVkVOVF9SRU1PVEUgfCBQTV9FVkVOVF9SRVNVTUUpCiAjZGVmaW5lIFBNX0VWRU5UX0FVVE9fU1VTUEVORAkoUE1fRVZFTlRfQVVUTyB8IFBNX0VWRU5UX1NVU1BFTkQpCiAjZGVmaW5lIFBNX0VWRU5UX0FVVE9fUkVTVU1FCShQTV9FVkVOVF9BVVRPIHwgUE1fRVZFTlRfUkVTVU1FKQogCkBAIC0yOTEsMTUgKzI2NSwxNSBAQAogI2RlZmluZSBQTVNHX1RIQVcJKChzdHJ1Y3QgcG1fbWVzc2FnZSl7IC5ldmVudCA9IFBNX0VWRU5UX1RIQVcsIH0pCiAjZGVmaW5lIFBNU0dfUkVTVE9SRQkoKHN0cnVjdCBwbV9tZXNzYWdlKXsgLmV2ZW50ID0gUE1fRVZFTlRfUkVTVE9SRSwgfSkKICNkZWZpbmUgUE1TR19SRUNPVkVSCSgoc3RydWN0IHBtX21lc3NhZ2UpeyAuZXZlbnQgPSBQTV9FVkVOVF9SRUNPVkVSLCB9KQotI2RlZmluZSBQTVNHX1VTRVJfU1VTUEVORAkoKHN0cnVjdCBwbV9tZXNzZ2UpIFwKKyNkZWZpbmUgUE1TR19VU0VSX1NVU1BFTkQJKChzdHJ1Y3QgcG1fbWVzc2FnZSkgXAogCQkJCQl7IC5ldmVudCA9IFBNX0VWRU5UX1VTRVJfU1VTUEVORCwgfSkKLSNkZWZpbmUgUE1TR19VU0VSX1JFU1VNRQkoKHN0cnVjdCBwbV9tZXNzZ2UpIFwKKyNkZWZpbmUgUE1TR19VU0VSX1JFU1VNRQkoKHN0cnVjdCBwbV9tZXNzYWdlKSBcCiAJCQkJCXsgLmV2ZW50ID0gUE1fRVZFTlRfVVNFUl9SRVNVTUUsIH0pCi0jZGVmaW5lIFBNU0dfUkVNT1RFX1JFU1VNRQkoKHN0cnVjdCBwbV9tZXNzZ2UpIFwKKyNkZWZpbmUgUE1TR19SRU1PVEVfUkVTVU1FCSgoc3RydWN0IHBtX21lc3NhZ2UpIFwKIAkJCQkJeyAuZXZlbnQgPSBQTV9FVkVOVF9SRU1PVEVfUkVTVU1FLCB9KQotI2RlZmluZSBQTVNHX0FVVE9fU1VTUEVORAkoKHN0cnVjdCBwbV9tZXNzZ2UpIFwKKyNkZWZpbmUgUE1TR19BVVRPX1NVU1BFTkQJKChzdHJ1Y3QgcG1fbWVzc2FnZSkgXAogCQkJCQl7IC5ldmVudCA9IFBNX0VWRU5UX0FVVE9fU1VTUEVORCwgfSkKLSNkZWZpbmUgUE1TR19BVVRPX1JFU1VNRQkJKChzdHJ1Y3QgcG1fbWVzc2dlKSBcCisjZGVmaW5lIFBNU0dfQVVUT19SRVNVTUUJKChzdHJ1Y3QgcG1fbWVzc2FnZSkgXAogCQkJCQl7IC5ldmVudCA9IFBNX0VWRU5UX0FVVE9fUkVTVU1FLCB9KQogCiAvKioKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcG9sbC5oIGIvaW5jbHVkZS9saW51eC9wb2xsLmgKaW5kZXggYmFkZDk4YS4uOGMyNGVmOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wb2xsLmgKKysrIGIvaW5jbHVkZS9saW51eC9wb2xsLmgKQEAgLTQ2LDkgKzQ2LDkgQEAKIH0KIAogc3RydWN0IHBvbGxfdGFibGVfZW50cnkgewotCXN0cnVjdCBmaWxlICogZmlscDsKKwlzdHJ1Y3QgZmlsZSAqZmlscDsKIAl3YWl0X3F1ZXVlX3Qgd2FpdDsKLQl3YWl0X3F1ZXVlX2hlYWRfdCAqIHdhaXRfYWRkcmVzczsKKwl3YWl0X3F1ZXVlX2hlYWRfdCAqd2FpdF9hZGRyZXNzOwogfTsKIAogLyoKQEAgLTU2LDcgKzU2LDkgQEAKICAqLwogc3RydWN0IHBvbGxfd3F1ZXVlcyB7CiAJcG9sbF90YWJsZSBwdDsKLQlzdHJ1Y3QgcG9sbF90YWJsZV9wYWdlICogdGFibGU7CisJc3RydWN0IHBvbGxfdGFibGVfcGFnZSAqdGFibGU7CisJc3RydWN0IHRhc2tfc3RydWN0ICpwb2xsaW5nX3Rhc2s7CisJaW50IHRyaWdnZXJlZDsKIAlpbnQgZXJyb3I7CiAJaW50IGlubGluZV9pbmRleDsKIAlzdHJ1Y3QgcG9sbF90YWJsZV9lbnRyeSBpbmxpbmVfZW50cmllc1tOX0lOTElORV9QT0xMX0VOVFJJRVNdOwpAQCAtNjQsNiArNjYsMTMgQEAKIAogZXh0ZXJuIHZvaWQgcG9sbF9pbml0d2FpdChzdHJ1Y3QgcG9sbF93cXVldWVzICpwd3EpOwogZXh0ZXJuIHZvaWQgcG9sbF9mcmVld2FpdChzdHJ1Y3QgcG9sbF93cXVldWVzICpwd3EpOworZXh0ZXJuIGludCBwb2xsX3NjaGVkdWxlX3RpbWVvdXQoc3RydWN0IHBvbGxfd3F1ZXVlcyAqcHdxLCBpbnQgc3RhdGUsCisJCQkJIGt0aW1lX3QgKmV4cGlyZXMsIHVuc2lnbmVkIGxvbmcgc2xhY2spOworCitzdGF0aWMgaW5saW5lIGludCBwb2xsX3NjaGVkdWxlKHN0cnVjdCBwb2xsX3dxdWV1ZXMgKnB3cSwgaW50IHN0YXRlKQoreworCXJldHVybiBwb2xsX3NjaGVkdWxlX3RpbWVvdXQocHdxLCBzdGF0ZSwgTlVMTCwgMCk7Cit9CiAKIC8qCiAgKiBTY2FsZWFibGUgdmVyc2lvbiBvZiB0aGUgZmRfc2V0LgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wb3dlcl9zdXBwbHkuaCBiL2luY2x1ZGUvbGludXgvcG93ZXJfc3VwcGx5LmgKaW5kZXggZjkzNDhjYi4uOGZmMjVlMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wb3dlcl9zdXBwbHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Bvd2VyX3N1cHBseS5oCkBAIC00NSw2ICs0NSw3IEBACiAJUE9XRVJfU1VQUExZX0hFQUxUSF9ERUFELAogCVBPV0VSX1NVUFBMWV9IRUFMVEhfT1ZFUlZPTFRBR0UsCiAJUE9XRVJfU1VQUExZX0hFQUxUSF9VTlNQRUNfRkFJTFVSRSwKKwlQT1dFUl9TVVBQTFlfSEVBTFRIX0NPTEQsCiB9OwogCiBlbnVtIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcW54NF9mcy5oIGIvaW5jbHVkZS9saW51eC9xbng0X2ZzLmgKaW5kZXggMzRhMTk2ZS4uNzg3ZDE5ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9xbng0X2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9xbng0X2ZzLmgKQEAgLTIsMTQgKzIsMTIgQEAKICAqICBOYW1lICAgICAgICAgICAgICAgICAgICAgICAgIDogcW54NF9mcy5oCiAgKiAgQXV0aG9yICAgICAgICAgICAgICAgICAgICAgICA6IFJpY2hhcmQgRnJvd2lqbgogICogIEZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgOiBxbng0IGdsb2JhbCBmaWxlc3lzdGVtIGRlZmluaXRpb25zCi0gKiAgVmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICA6IDEuMC4yCi0gKiAgTGFzdCBtb2RpZmllZCAgICAgICAgICAgICAgICA6IDIwMDAtMDEtMzEKLSAqCiAgKiAgSGlzdG9yeSAgICAgICAgICAgICAgICAgICAgICA6IDIzLTAzLTE5OTggY3JlYXRlZAogICovCiAjaWZuZGVmIF9MSU5VWF9RTlg0X0ZTX0gKICNkZWZpbmUgX0xJTlVYX1FOWDRfRlNfSAogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9xbnh0eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L21hZ2ljLmg+CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcW54dHlwZXMuaCBiL2luY2x1ZGUvbGludXgvcW54dHlwZXMuaAppbmRleCBhM2ViMTEzLi5iZWJiZTVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3FueHR5cGVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9xbnh0eXBlcy5oCkBAIC0yLDkgKzIsNiBAQAogICogIE5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgOiBxbnh0eXBlcy5oCiAgKiAgQXV0aG9yICAgICAgICAgICAgICAgICAgICAgICA6IFJpY2hhcmQgRnJvd2lqbgogICogIEZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgOiBzdGFuZGFyZCBxbnggdHlwZXMKLSAqICBWZXJzaW9uICAgICAgICAgICAgICAgICAgICAgIDogMS4wLjIKLSAqICBMYXN0IG1vZGlmaWVkICAgICAgICAgICAgICAgIDogMjAwMC0wMS0wNgotICoKICAqICBIaXN0b3J5ICAgICAgICAgICAgICAgICAgICAgIDogMjItMDMtMTk5OCBjcmVhdGVkCiAgKgogICovCkBAIC0xMiw2ICs5LDggQEAKICNpZm5kZWYgX1FOWDRUWVBFU19ICiAjZGVmaW5lIF9RTlg0VFlQRVNfSAogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKwogdHlwZWRlZiBfX2xlMTYgcW54NF9ueHRudF90OwogdHlwZWRlZiBfX3U4ICBxbng0X2Z0eXBlX3Q7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcXVvdGEuaCBiL2luY2x1ZGUvbGludXgvcXVvdGEuaAppbmRleCA0MDQwMWI1Li5kNzJkNWQ4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3F1b3RhLmgKKysrIGIvaW5jbHVkZS9saW51eC9xdW90YS5oCkBAIC0zNiwxNyArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAotI2RlZmluZSBfX0RRVU9UX1ZFUlNJT05fXwkiZHF1b3RfNi41LjEiCi0jZGVmaW5lIF9fRFFVT1RfTlVNX1ZFUlNJT05fXwk2KjEwMDAwKzUqMTAwKzEKLQotLyogU2l6ZSBvZiBibG9ja3MgaW4gd2hpY2ggYXJlIGNvdW50ZWQgc2l6ZSBsaW1pdHMgKi8KLSNkZWZpbmUgUVVPVEFCTE9DS19CSVRTIDEwCi0jZGVmaW5lIFFVT1RBQkxPQ0tfU0laRSAoMSA8PCBRVU9UQUJMT0NLX0JJVFMpCi0KLS8qIENvbnZlcnNpb24gcm91dGluZXMgZnJvbSBhbmQgdG8gcXVvdGEgYmxvY2tzICovCi0jZGVmaW5lIHFiMmtiKHgpICgoeCkgPDwgKFFVT1RBQkxPQ0tfQklUUy0xMCkpCi0jZGVmaW5lIGtiMnFiKHgpICgoeCkgPj4gKFFVT1RBQkxPQ0tfQklUUy0xMCkpCi0jZGVmaW5lIHRvcWIoeCkgKCgoeCkgKyBRVU9UQUJMT0NLX1NJWkUgLSAxKSA+PiBRVU9UQUJMT0NLX0JJVFMpCisjZGVmaW5lIF9fRFFVT1RfVkVSU0lPTl9fCSJkcXVvdF82LjUuMiIKIAogI2RlZmluZSBNQVhRVU9UQVMgMgogI2RlZmluZSBVU1JRVU9UQSAgMAkJLyogZWxlbWVudCB1c2VkIGZvciB1c2VyIHF1b3RhcyAqLwpAQCAtODAsMTYgKzcwLDM0IEBACiAjZGVmaW5lIFFfR0VUUVVPVEEgMHg4MDAwMDcJLyogZ2V0IHVzZXIgcXVvdGEgc3RydWN0dXJlICovCiAjZGVmaW5lIFFfU0VUUVVPVEEgMHg4MDAwMDgJLyogc2V0IHVzZXIgcXVvdGEgc3RydWN0dXJlICovCiAKKy8qIFF1b3RhIGZvcm1hdCB0eXBlIElEcyAqLworI2RlZmluZQlRRk1UX1ZGU19PTEQgMQorI2RlZmluZQlRRk1UX1ZGU19WMCAyCisKKy8qIFNpemUgb2YgYmxvY2sgaW4gd2hpY2ggc3BhY2UgbGltaXRzIGFyZSBwYXNzZWQgdGhyb3VnaCB0aGUgcXVvdGEKKyAqIGludGVyZmFjZSAqLworI2RlZmluZSBRSUZfRFFCTEtTSVpFX0JJVFMgMTAKKyNkZWZpbmUgUUlGX0RRQkxLU0laRSAoMSA8PCBRSUZfRFFCTEtTSVpFX0JJVFMpCisKIC8qCiAgKiBRdW90YSBzdHJ1Y3R1cmUgdXNlZCBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIHVzZXJzcGFjZSB2aWEgcXVvdGFjdGwKICAqIEZvbGxvd2luZyBmbGFncyBhcmUgdXNlZCB0byBzcGVjaWZ5IHdoaWNoIGZpZWxkcyBhcmUgdmFsaWQKICAqLwotI2RlZmluZSBRSUZfQkxJTUlUUwkxCi0jZGVmaW5lIFFJRl9TUEFDRQkyCi0jZGVmaW5lIFFJRl9JTElNSVRTCTQKLSNkZWZpbmUgUUlGX0lOT0RFUwk4Ci0jZGVmaW5lIFFJRl9CVElNRQkxNgotI2RlZmluZSBRSUZfSVRJTUUJMzIKK2VudW0geworCVFJRl9CTElNSVRTX0IgPSAwLAorCVFJRl9TUEFDRV9CLAorCVFJRl9JTElNSVRTX0IsCisJUUlGX0lOT0RFU19CLAorCVFJRl9CVElNRV9CLAorCVFJRl9JVElNRV9CLAorfTsKKworI2RlZmluZSBRSUZfQkxJTUlUUwkoMSA8PCBRSUZfQkxJTUlUU19CKQorI2RlZmluZSBRSUZfU1BBQ0UJKDEgPDwgUUlGX1NQQUNFX0IpCisjZGVmaW5lIFFJRl9JTElNSVRTCSgxIDw8IFFJRl9JTElNSVRTX0IpCisjZGVmaW5lIFFJRl9JTk9ERVMJKDEgPDwgUUlGX0lOT0RFU19CKQorI2RlZmluZSBRSUZfQlRJTUUJKDEgPDwgUUlGX0JUSU1FX0IpCisjZGVmaW5lIFFJRl9JVElNRQkoMSA8PCBRSUZfSVRJTUVfQikKICNkZWZpbmUgUUlGX0xJTUlUUwkoUUlGX0JMSU1JVFMgfCBRSUZfSUxJTUlUUykKICNkZWZpbmUgUUlGX1VTQUdFCShRSUZfU1BBQ0UgfCBRSUZfSU5PREVTKQogI2RlZmluZSBRSUZfVElNRVMJKFFJRl9CVElNRSB8IFFJRl9JVElNRSkKQEAgLTE3Miw3ICsxODAsNyBAQAogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KIAogdHlwZWRlZiBfX2tlcm5lbF91aWQzMl90IHFpZF90OyAvKiBUeXBlIGluIHdoaWNoIHdlIHN0b3JlIGlkcyBpbiBtZW1vcnkgKi8KLXR5cGVkZWYgX191NjQgcXNpemVfdDsgICAgICAgICAgLyogVHlwZSBpbiB3aGljaCB3ZSBzdG9yZSBzaXplcyAqLwordHlwZWRlZiBsb25nIGxvbmcgcXNpemVfdDsJLyogVHlwZSBpbiB3aGljaCB3ZSBzdG9yZSBzaXplcyAqLwogCiBleHRlcm4gc3BpbmxvY2tfdCBkcV9kYXRhX2xvY2s7CiAKQEAgLTE4NywxMiArMTk1LDEyIEBACiAgKiBEYXRhIGZvciBvbmUgdXNlci9ncm91cCBrZXB0IGluIG1lbW9yeQogICovCiBzdHJ1Y3QgbWVtX2RxYmxrIHsKLQlfX3UzMiBkcWJfYmhhcmRsaW1pdDsJLyogYWJzb2x1dGUgbGltaXQgb24gZGlzayBibGtzIGFsbG9jICovCi0JX191MzIgZHFiX2Jzb2Z0bGltaXQ7CS8qIHByZWZlcnJlZCBsaW1pdCBvbiBkaXNrIGJsa3MgKi8KKwlxc2l6ZV90IGRxYl9iaGFyZGxpbWl0OwkvKiBhYnNvbHV0ZSBsaW1pdCBvbiBkaXNrIGJsa3MgYWxsb2MgKi8KKwlxc2l6ZV90IGRxYl9ic29mdGxpbWl0OwkvKiBwcmVmZXJyZWQgbGltaXQgb24gZGlzayBibGtzICovCiAJcXNpemVfdCBkcWJfY3Vyc3BhY2U7CS8qIGN1cnJlbnQgdXNlZCBzcGFjZSAqLwotCV9fdTMyIGRxYl9paGFyZGxpbWl0OwkvKiBhYnNvbHV0ZSBsaW1pdCBvbiBhbGxvY2F0ZWQgaW5vZGVzICovCi0JX191MzIgZHFiX2lzb2Z0bGltaXQ7CS8qIHByZWZlcnJlZCBpbm9kZSBsaW1pdCAqLwotCV9fdTMyIGRxYl9jdXJpbm9kZXM7CS8qIGN1cnJlbnQgIyBhbGxvY2F0ZWQgaW5vZGVzICovCisJcXNpemVfdCBkcWJfaWhhcmRsaW1pdDsJLyogYWJzb2x1dGUgbGltaXQgb24gYWxsb2NhdGVkIGlub2RlcyAqLworCXFzaXplX3QgZHFiX2lzb2Z0bGltaXQ7CS8qIHByZWZlcnJlZCBpbm9kZSBsaW1pdCAqLworCXFzaXplX3QgZHFiX2N1cmlub2RlczsJLyogY3VycmVudCAjIGFsbG9jYXRlZCBpbm9kZXMgKi8KIAl0aW1lX3QgZHFiX2J0aW1lOwkvKiB0aW1lIGxpbWl0IGZvciBleGNlc3NpdmUgZGlzayB1c2UgKi8KIAl0aW1lX3QgZHFiX2l0aW1lOwkvKiB0aW1lIGxpbWl0IGZvciBleGNlc3NpdmUgaW5vZGUgdXNlICovCiB9OwpAQCAtMjEyLDEwICsyMjAsNyBAQAogCXVuc2lnbmVkIGludCBkcWlfaWdyYWNlOwogCXFzaXplX3QgZHFpX21heGJsaW1pdDsKIAlxc2l6ZV90IGRxaV9tYXhpbGltaXQ7Ci0JdW5pb24gewotCQlzdHJ1Y3QgdjFfbWVtX2RxaW5mbyB2MV9pOwotCQlzdHJ1Y3QgdjJfbWVtX2RxaW5mbyB2Ml9pOwotCX0gdTsKKwl2b2lkICpkcWlfcHJpdjsKIH07CiAKIHN0cnVjdCBzdXBlcl9ibG9jazsKQEAgLTI0OSw2ICsyNTQsMTEgQEAKICNkZWZpbmUgRFFfRkFLRV9CCTMJLyogbm8gbGltaXRzIG9ubHkgdXNhZ2UgKi8KICNkZWZpbmUgRFFfUkVBRF9CCTQJLyogZHF1b3Qgd2FzIHJlYWQgaW50byBtZW1vcnkgKi8KICNkZWZpbmUgRFFfQUNUSVZFX0IJNQkvKiBkcXVvdCBpcyBhY3RpdmUgKGRxdW90X3JlbGVhc2Ugbm90IGNhbGxlZCkgKi8KKyNkZWZpbmUgRFFfTEFTVFNFVF9CCTYJLyogRm9sbG93aW5nIDYgYml0cyAoc2VlIFFJRl8pIGFyZSByZXNlcnZlZFwKKwkJCQkgKiBmb3IgdGhlIG1hc2sgb2YgZW50cmllcyBzZXQgdmlhIFNFVFFVT1RBXAorCQkJCSAqIHF1b3RhY3RsLiBUaGV5IGFyZSBzZXQgdW5kZXIgZHFfZGF0YV9sb2NrXAorCQkJCSAqIGFuZCB0aGUgcXVvdGEgZm9ybWF0IGhhbmRsaW5nIGRxdW90IGNhblwKKwkJCQkgKiBjbGVhciB0aGVtIHdoZW4gaXQgc2VlcyBmaXQuICovCiAKIHN0cnVjdCBkcXVvdCB7CiAJc3RydWN0IGhsaXN0X25vZGUgZHFfaGFzaDsJLyogSGFzaCBsaXN0IGluIG1lbW9yeSAqLwpAQCAtMjg3LDExICsyOTcsMTMgQEAKIAlpbnQgKCppbml0aWFsaXplKSAoc3RydWN0IGlub2RlICosIGludCk7CiAJaW50ICgqZHJvcCkgKHN0cnVjdCBpbm9kZSAqKTsKIAlpbnQgKCphbGxvY19zcGFjZSkgKHN0cnVjdCBpbm9kZSAqLCBxc2l6ZV90LCBpbnQpOwotCWludCAoKmFsbG9jX2lub2RlKSAoY29uc3Qgc3RydWN0IGlub2RlICosIHVuc2lnbmVkIGxvbmcpOworCWludCAoKmFsbG9jX2lub2RlKSAoY29uc3Qgc3RydWN0IGlub2RlICosIHFzaXplX3QpOwogCWludCAoKmZyZWVfc3BhY2UpIChzdHJ1Y3QgaW5vZGUgKiwgcXNpemVfdCk7Ci0JaW50ICgqZnJlZV9pbm9kZSkgKGNvbnN0IHN0cnVjdCBpbm9kZSAqLCB1bnNpZ25lZCBsb25nKTsKKwlpbnQgKCpmcmVlX2lub2RlKSAoY29uc3Qgc3RydWN0IGlub2RlICosIHFzaXplX3QpOwogCWludCAoKnRyYW5zZmVyKSAoc3RydWN0IGlub2RlICosIHN0cnVjdCBpYXR0ciAqKTsKIAlpbnQgKCp3cml0ZV9kcXVvdCkgKHN0cnVjdCBkcXVvdCAqKTsJCS8qIE9yZGluYXJ5IGRxdW90IHdyaXRlICovCisJc3RydWN0IGRxdW90ICooKmFsbG9jX2RxdW90KShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50KTsJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBuZXcgZHF1b3QgKi8KKwl2b2lkICgqZGVzdHJveV9kcXVvdCkoc3RydWN0IGRxdW90ICopOwkJLyogRnJlZSBtZW1vcnkgZm9yIGRxdW90ICovCiAJaW50ICgqYWNxdWlyZV9kcXVvdCkgKHN0cnVjdCBkcXVvdCAqKTsJCS8qIFF1b3RhIGlzIGdvaW5nIHRvIGJlIGNyZWF0ZWQgb24gZGlzayAqLwogCWludCAoKnJlbGVhc2VfZHF1b3QpIChzdHJ1Y3QgZHF1b3QgKik7CQkvKiBRdW90YSBpcyBnb2luZyB0byBiZSBkZWxldGVkIGZyb20gZGlzayAqLwogCWludCAoKm1hcmtfZGlydHkpIChzdHJ1Y3QgZHF1b3QgKik7CQkvKiBEcXVvdCBpcyBtYXJrZWQgZGlydHkgKi8KQEAgLTMyMCwxMiArMzMyLDQyIEBACiAJc3RydWN0IHF1b3RhX2Zvcm1hdF90eXBlICpxZl9uZXh0OwogfTsKIAotI2RlZmluZSBEUVVPVF9VU1JfRU5BQkxFRAkweDAxCQkvKiBVc2VyIGRpc2txdW90YXMgZW5hYmxlZCAqLwotI2RlZmluZSBEUVVPVF9HUlBfRU5BQkxFRAkweDAyCQkvKiBHcm91cCBkaXNrcXVvdGFzIGVuYWJsZWQgKi8KLSNkZWZpbmUgRFFVT1RfVVNSX1NVU1BFTkRFRAkweDA0CQkvKiBVc2VyIGRpc2txdW90YXMgYXJlIG9mZiwgYnV0CisvKiBRdW90YSBzdGF0ZSBmbGFncyAtIHRoZXkgYWN0dWFsbHkgY29tZSBpbiB0d28gZmxhdm9ycyAtIGZvciB1c2VycyBhbmQgZ3JvdXBzICovCitlbnVtIHsKKwlfRFFVT1RfVVNBR0VfRU5BQkxFRCA9IDAsCQkvKiBUcmFjayBkaXNrIHVzYWdlIGZvciB1c2VycyAqLworCV9EUVVPVF9MSU1JVFNfRU5BQkxFRCwJCQkvKiBFbmZvcmNlIHF1b3RhIGxpbWl0cyBmb3IgdXNlcnMgKi8KKwlfRFFVT1RfU1VTUEVOREVELAkJCS8qIFVzZXIgZGlza3F1b3RhcyBhcmUgb2ZmLCBidXQKIAkJCQkJCSAqIHdlIGhhdmUgbmVjZXNzYXJ5IGluZm8gaW4KIAkJCQkJCSAqIG1lbW9yeSB0byB0dXJuIHRoZW0gb24gKi8KLSNkZWZpbmUgRFFVT1RfR1JQX1NVU1BFTkRFRAkweDA4CQkvKiBUaGUgc2FtZSBmb3IgZ3JvdXAgcXVvdGFzICovCisJX0RRVU9UX1NUQVRFX0ZMQUdTCit9OworI2RlZmluZSBEUVVPVF9VU0FHRV9FTkFCTEVECSgxIDw8IF9EUVVPVF9VU0FHRV9FTkFCTEVEKQorI2RlZmluZSBEUVVPVF9MSU1JVFNfRU5BQkxFRAkoMSA8PCBfRFFVT1RfTElNSVRTX0VOQUJMRUQpCisjZGVmaW5lIERRVU9UX1NVU1BFTkRFRAkJKDEgPDwgX0RRVU9UX1NVU1BFTkRFRCkKKyNkZWZpbmUgRFFVT1RfU1RBVEVfRkxBR1MJKERRVU9UX1VTQUdFX0VOQUJMRUQgfCBEUVVPVF9MSU1JVFNfRU5BQkxFRCB8IFwKKwkJCQkgRFFVT1RfU1VTUEVOREVEKQorLyogT3RoZXIgcXVvdGEgZmxhZ3MgKi8KKyNkZWZpbmUgRFFVT1RfUVVPVEFfU1lTX0ZJTEUJKDEgPDwgNikJLyogUXVvdGEgZmlsZSBpcyBhIHNwZWNpYWwKKwkJCQkJCSAqIHN5c3RlbSBmaWxlIGFuZCB1c2VyIGNhbm5vdAorCQkJCQkJICogdG91Y2ggaXQuIEZpbGVzeXN0ZW0gaXMKKwkJCQkJCSAqIHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nCisJCQkJCQkgKiBTX05PUVVPVEEsIFNfTk9BVElNRSBmbGFncworCQkJCQkJICovCisjZGVmaW5lIERRVU9UX05FR0FUSVZFX1VTQUdFCSgxIDw8IDcpCS8qIEFsbG93IG5lZ2F0aXZlIHF1b3RhIHVzYWdlICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGRxdW90X3N0YXRlX2ZsYWcodW5zaWduZWQgaW50IGZsYWdzLCBpbnQgdHlwZSkKK3sKKwlpZiAodHlwZSA9PSBVU1JRVU9UQSkKKwkJcmV0dXJuIGZsYWdzOworCXJldHVybiBmbGFncyA8PCBfRFFVT1RfU1RBVEVfRkxBR1M7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGRxdW90X2dlbmVyaWNfZmxhZyh1bnNpZ25lZCBpbnQgZmxhZ3MsIGludCB0eXBlKQoreworCWlmICh0eXBlID09IFVTUlFVT1RBKQorCQlyZXR1cm4gZmxhZ3M7CisJcmV0dXJuIGZsYWdzID4+IF9EUVVPVF9TVEFURV9GTEFHUzsKK30KIAogc3RydWN0IHF1b3RhX2luZm8gewogCXVuc2lnbmVkIGludCBmbGFnczsJCQkvKiBGbGFncyBmb3IgZGlza3F1b3RhcyBvbiB0aGlzIGRldmljZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9xdW90YWlvX3YyLmggYi9pbmNsdWRlL2xpbnV4L3F1b3RhaW9fdjIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAzZDdjYi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L3F1b3RhaW9fdjIuaAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKglEZWZpbml0aW9ucyBvZiBzdHJ1Y3R1cmVzIGZvciB2ZnN2MCBxdW90YSBmb3JtYXQKLSAqLwotCi0jaWZuZGVmIF9MSU5VWF9RVU9UQUlPX1YyX0gKLSNkZWZpbmUgX0xJTlVYX1FVT1RBSU9fVjJfSAotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9xdW90YS5oPgotCi0vKgotICogRGVmaW5pdGlvbnMgb2YgbWFnaWNzIGFuZCB2ZXJzaW9ucyBvZiBjdXJyZW50IHF1b3RhIGZpbGVzCi0gKi8KLSNkZWZpbmUgVjJfSU5JVFFNQUdJQ1Mge1wKLQkweGQ5YzAxZjExLAkvKiBVU1JRVU9UQSAqL1wKLQkweGQ5YzAxOTI3CS8qIEdSUFFVT1RBICovXAotfQotCi0jZGVmaW5lIFYyX0lOSVRRVkVSU0lPTlMge1wKLQkwLAkJLyogVVNSUVVPVEEgKi9cCi0JMAkJLyogR1JQUVVPVEEgKi9cCi19Ci0KLS8qCi0gKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBmb3JtYXQgb2YgdGhlIGRpc2sgcXVvdGEgZmlsZQotICogKGFzIGl0IGFwcGVhcnMgb24gZGlzaykgLSB0aGUgZmlsZSBpcyBhIHJhZGl4IHRyZWUgd2hvc2UgbGVhdmVzIHBvaW50Ci0gKiB0byBibG9ja3Mgb2YgdGhlc2Ugc3RydWN0dXJlcy4KLSAqLwotc3RydWN0IHYyX2Rpc2tfZHFibGsgewotCV9fbGUzMiBkcWJfaWQ7CQkvKiBpZCB0aGlzIHF1b3RhIGFwcGxpZXMgdG8gKi8KLQlfX2xlMzIgZHFiX2loYXJkbGltaXQ7CS8qIGFic29sdXRlIGxpbWl0IG9uIGFsbG9jYXRlZCBpbm9kZXMgKi8KLQlfX2xlMzIgZHFiX2lzb2Z0bGltaXQ7CS8qIHByZWZlcnJlZCBpbm9kZSBsaW1pdCAqLwotCV9fbGUzMiBkcWJfY3VyaW5vZGVzOwkvKiBjdXJyZW50ICMgYWxsb2NhdGVkIGlub2RlcyAqLwotCV9fbGUzMiBkcWJfYmhhcmRsaW1pdDsJLyogYWJzb2x1dGUgbGltaXQgb24gZGlzayBzcGFjZSAoaW4gUVVPVEFCTE9DS19TSVpFKSAqLwotCV9fbGUzMiBkcWJfYnNvZnRsaW1pdDsJLyogcHJlZmVycmVkIGxpbWl0IG9uIGRpc2sgc3BhY2UgKGluIFFVT1RBQkxPQ0tfU0laRSkgKi8KLQlfX2xlNjQgZHFiX2N1cnNwYWNlOwkvKiBjdXJyZW50IHNwYWNlIG9jY3VwaWVkIChpbiBieXRlcykgKi8KLQlfX2xlNjQgZHFiX2J0aW1lOwkvKiB0aW1lIGxpbWl0IGZvciBleGNlc3NpdmUgZGlzayB1c2UgKi8KLQlfX2xlNjQgZHFiX2l0aW1lOwkvKiB0aW1lIGxpbWl0IGZvciBleGNlc3NpdmUgaW5vZGUgdXNlICovCi19OwotCi0vKgotICogSGVyZSBhcmUgaGVhZGVyIHN0cnVjdHVyZXMgYXMgd3JpdHRlbiBvbiBkaXNrIGFuZCB0aGVpciBpbi1tZW1vcnkgY29waWVzCi0gKi8KLS8qIEZpcnN0IGdlbmVyaWMgaGVhZGVyICovCi1zdHJ1Y3QgdjJfZGlza19kcWhlYWRlciB7Ci0JX19sZTMyIGRxaF9tYWdpYzsJLyogTWFnaWMgbnVtYmVyIGlkZW50aWZ5aW5nIGZpbGUgKi8KLQlfX2xlMzIgZHFoX3ZlcnNpb247CS8qIEZpbGUgdmVyc2lvbiAqLwotfTsKLQotLyogSGVhZGVyIHdpdGggdHlwZSBhbmQgdmVyc2lvbiBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLwotc3RydWN0IHYyX2Rpc2tfZHFpbmZvIHsKLQlfX2xlMzIgZHFpX2JncmFjZTsJLyogVGltZSBiZWZvcmUgYmxvY2sgc29mdCBsaW1pdCBiZWNvbWVzIGhhcmQgbGltaXQgKi8KLQlfX2xlMzIgZHFpX2lncmFjZTsJLyogVGltZSBiZWZvcmUgaW5vZGUgc29mdCBsaW1pdCBiZWNvbWVzIGhhcmQgbGltaXQgKi8KLQlfX2xlMzIgZHFpX2ZsYWdzOwkvKiBGbGFncyBmb3IgcXVvdGFmaWxlIChEUUZfKikgKi8KLQlfX2xlMzIgZHFpX2Jsb2NrczsJLyogTnVtYmVyIG9mIGJsb2NrcyBpbiBmaWxlICovCi0JX19sZTMyIGRxaV9mcmVlX2JsazsJLyogTnVtYmVyIG9mIGZpcnN0IGZyZWUgYmxvY2sgaW4gdGhlIGxpc3QgKi8KLQlfX2xlMzIgZHFpX2ZyZWVfZW50cnk7CS8qIE51bWJlciBvZiBibG9jayB3aXRoIGF0IGxlYXN0IG9uZSBmcmVlIGVudHJ5ICovCi19OwotCi0vKgotICogIFN0cnVjdHVyZSBvZiBoZWFkZXIgb2YgYmxvY2sgd2l0aCBxdW90YSBzdHJ1Y3R1cmVzLiBJdCBpcyBwYWRkZWQgdG8gMTYgYnl0ZXMgc28KLSAqICB0aGVyZSB3aWxsIGJlIHNwYWNlIGZvciBleGFjdGx5IDIxIHF1b3RhLWVudHJpZXMgaW4gYSBibG9jawotICovCi1zdHJ1Y3QgdjJfZGlza19kcWRiaGVhZGVyIHsKLQlfX2xlMzIgZHFkaF9uZXh0X2ZyZWU7CS8qIE51bWJlciBvZiBuZXh0IGJsb2NrIHdpdGggZnJlZSBlbnRyeSAqLwotCV9fbGUzMiBkcWRoX3ByZXZfZnJlZTsJLyogTnVtYmVyIG9mIHByZXZpb3VzIGJsb2NrIHdpdGggZnJlZSBlbnRyeSAqLwotCV9fbGUxNiBkcWRoX2VudHJpZXM7CS8qIE51bWJlciBvZiB2YWxpZCBlbnRyaWVzIGluIGJsb2NrICovCi0JX19sZTE2IGRxZGhfcGFkMTsKLQlfX2xlMzIgZHFkaF9wYWQyOwotfTsKLQotI2RlZmluZSBWMl9EUUlORk9PRkYJc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxaGVhZGVyKQkvKiBPZmZzZXQgb2YgaW5mbyBoZWFkZXIgaW4gZmlsZSAqLwotI2RlZmluZSBWMl9EUUJMS1NJWkVfQklUUwkxMAotI2RlZmluZSBWMl9EUUJMS1NJWkUJKDEgPDwgVjJfRFFCTEtTSVpFX0JJVFMpCS8qIFNpemUgb2YgYmxvY2sgd2l0aCBxdW90YSBzdHJ1Y3R1cmVzICovCi0jZGVmaW5lIFYyX0RRVFJFRU9GRgkxCQkvKiBPZmZzZXQgb2YgdHJlZSBpbiBmaWxlIGluIGJsb2NrcyAqLwotI2RlZmluZSBWMl9EUVRSRUVERVBUSAk0CQkvKiBEZXB0aCBvZiBxdW90YSB0cmVlICovCi0jZGVmaW5lIFYyX0RRU1RSSU5CTEsJKChWMl9EUUJMS1NJWkUgLSBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFkYmhlYWRlcikpIC8gc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxYmxrKSkJLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gb25lIGJsb2NrcyAqLwotCi0jZW5kaWYgLyogX0xJTlVYX1FVT1RBSU9fVjJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9xdW90YW9wcy5oIGIvaW5jbHVkZS9saW51eC9xdW90YW9wcy5oCmluZGV4IGE1NThhNGMuLjIxYjc4MWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcXVvdGFvcHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3F1b3Rhb3BzLmgKQEAgLTI0LDEyICsyNCwyMSBAQAogCiBpbnQgZHF1b3RfaW5pdGlhbGl6ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSk7CiBpbnQgZHF1b3RfZHJvcChzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKK2ludCBkcXVvdF9kcm9wX2xvY2tlZChzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKK3N0cnVjdCBkcXVvdCAqZHFnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgaW50IGlkLCBpbnQgdHlwZSk7Cit2b2lkIGRxcHV0KHN0cnVjdCBkcXVvdCAqZHF1b3QpOworaW50IGRxdW90X2lzX2NhY2hlZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBpbnQgaWQsIGludCB0eXBlKTsKK2ludCBkcXVvdF9zY2FuX2FjdGl2ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkgICAgICBpbnQgKCpmbikoc3RydWN0IGRxdW90ICpkcXVvdCwgdW5zaWduZWQgbG9uZyBwcml2KSwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBwcml2KTsKK3N0cnVjdCBkcXVvdCAqZHF1b3RfYWxsb2Moc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpOwordm9pZCBkcXVvdF9kZXN0cm95KHN0cnVjdCBkcXVvdCAqZHF1b3QpOwogCiBpbnQgZHF1b3RfYWxsb2Nfc3BhY2Uoc3RydWN0IGlub2RlICppbm9kZSwgcXNpemVfdCBudW1iZXIsIGludCBwcmVhbGxvYyk7Ci1pbnQgZHF1b3RfYWxsb2NfaW5vZGUoY29uc3Qgc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgbG9uZyBudW1iZXIpOworaW50IGRxdW90X2FsbG9jX2lub2RlKGNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vZGUsIHFzaXplX3QgbnVtYmVyKTsKIAogaW50IGRxdW90X2ZyZWVfc3BhY2Uoc3RydWN0IGlub2RlICppbm9kZSwgcXNpemVfdCBudW1iZXIpOwotaW50IGRxdW90X2ZyZWVfaW5vZGUoY29uc3Qgc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgbG9uZyBudW1iZXIpOworaW50IGRxdW90X2ZyZWVfaW5vZGUoY29uc3Qgc3RydWN0IGlub2RlICppbm9kZSwgcXNpemVfdCBudW1iZXIpOwogCiBpbnQgZHF1b3RfdHJhbnNmZXIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlhdHRyICppYXR0cik7CiBpbnQgZHF1b3RfY29tbWl0KHN0cnVjdCBkcXVvdCAqZHF1b3QpOwpAQCAtNDAsMTEgKzQ5LDE0IEBACiAKIGludCB2ZnNfcXVvdGFfb24oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIGludCBmb3JtYXRfaWQsCiAgCWNoYXIgKnBhdGgsIGludCByZW1vdW50KTsKK2ludCB2ZnNfcXVvdGFfZW5hYmxlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlLCBpbnQgZm9ybWF0X2lkLAorCXVuc2lnbmVkIGludCBmbGFncyk7CiBpbnQgdmZzX3F1b3RhX29uX3BhdGgoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIGludCBmb3JtYXRfaWQsCiAgCXN0cnVjdCBwYXRoICpwYXRoKTsKIGludCB2ZnNfcXVvdGFfb25fbW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY2hhciAqcWZfbmFtZSwKICAJaW50IGZvcm1hdF9pZCwgaW50IHR5cGUpOwogaW50IHZmc19xdW90YV9vZmYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIGludCByZW1vdW50KTsKK2ludCB2ZnNfcXVvdGFfZGlzYWJsZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IGZsYWdzKTsKIGludCB2ZnNfcXVvdGFfc3luYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSk7CiBpbnQgdmZzX2dldF9kcWluZm8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIHN0cnVjdCBpZl9kcWluZm8gKmlpKTsKIGludCB2ZnNfc2V0X2RxaW5mbyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwgc3RydWN0IGlmX2RxaW5mbyAqaWkpOwpAQCAtNjQsMjQgKzc2LDIyIEBACiAgKiBGdW5jdGlvbnMgZm9yIGNoZWNraW5nIHN0YXR1cyBvZiBxdW90YQogICovCiAKLXN0YXRpYyBpbmxpbmUgaW50IHNiX2hhc19xdW90YV9lbmFibGVkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQorc3RhdGljIGlubGluZSBpbnQgc2JfaGFzX3F1b3RhX3VzYWdlX2VuYWJsZWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpCiB7Ci0JaWYgKHR5cGUgPT0gVVNSUVVPVEEpCi0JCXJldHVybiBzYl9kcW9wdChzYiktPmZsYWdzICYgRFFVT1RfVVNSX0VOQUJMRUQ7Ci0JcmV0dXJuIHNiX2Rxb3B0KHNiKS0+ZmxhZ3MgJiBEUVVPVF9HUlBfRU5BQkxFRDsKKwlyZXR1cm4gc2JfZHFvcHQoc2IpLT5mbGFncyAmCisJCQkJZHF1b3Rfc3RhdGVfZmxhZyhEUVVPVF9VU0FHRV9FTkFCTEVELCB0eXBlKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgc2JfYW55X3F1b3RhX2VuYWJsZWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3N0YXRpYyBpbmxpbmUgaW50IHNiX2hhc19xdW90YV9saW1pdHNfZW5hYmxlZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKIHsKLQlyZXR1cm4gc2JfaGFzX3F1b3RhX2VuYWJsZWQoc2IsIFVTUlFVT1RBKSB8fAotCQlzYl9oYXNfcXVvdGFfZW5hYmxlZChzYiwgR1JQUVVPVEEpOworCXJldHVybiBzYl9kcW9wdChzYiktPmZsYWdzICYKKwkJCQlkcXVvdF9zdGF0ZV9mbGFnKERRVU9UX0xJTUlUU19FTkFCTEVELCB0eXBlKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgc2JfaGFzX3F1b3RhX3N1c3BlbmRlZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKIHsKLQlpZiAodHlwZSA9PSBVU1JRVU9UQSkKLQkJcmV0dXJuIHNiX2Rxb3B0KHNiKS0+ZmxhZ3MgJiBEUVVPVF9VU1JfU1VTUEVOREVEOwotCXJldHVybiBzYl9kcW9wdChzYiktPmZsYWdzICYgRFFVT1RfR1JQX1NVU1BFTkRFRDsKKwlyZXR1cm4gc2JfZHFvcHQoc2IpLT5mbGFncyAmCisJCQkJZHF1b3Rfc3RhdGVfZmxhZyhEUVVPVF9TVVNQRU5ERUQsIHR5cGUpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBzYl9hbnlfcXVvdGFfc3VzcGVuZGVkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCkBAIC05MCw2ICsxMDAsMzEgQEAKIAkJc2JfaGFzX3F1b3RhX3N1c3BlbmRlZChzYiwgR1JQUVVPVEEpOwogfQogCisvKiBEb2VzIGtlcm5lbCBrbm93IGFib3V0IGFueSBxdW90YSBpbmZvcm1hdGlvbiBmb3IgZ2l2ZW4gc2IgKyB0eXBlPyAqLworc3RhdGljIGlubGluZSBpbnQgc2JfaGFzX3F1b3RhX2xvYWRlZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKK3sKKwkvKiBDdXJyZW50bHkgaWYgYW55dGhpbmcgaXMgb24sIHRoZW4gcXVvdGEgdXNhZ2UgaXMgb24gYXMgd2VsbCAqLworCXJldHVybiBzYl9oYXNfcXVvdGFfdXNhZ2VfZW5hYmxlZChzYiwgdHlwZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNiX2FueV9xdW90YV9sb2FkZWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlyZXR1cm4gc2JfaGFzX3F1b3RhX2xvYWRlZChzYiwgVVNSUVVPVEEpIHx8CisJCXNiX2hhc19xdW90YV9sb2FkZWQoc2IsIEdSUFFVT1RBKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2JfaGFzX3F1b3RhX2FjdGl2ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKK3sKKwlyZXR1cm4gc2JfaGFzX3F1b3RhX2xvYWRlZChzYiwgdHlwZSkgJiYKKwkgICAgICAgIXNiX2hhc19xdW90YV9zdXNwZW5kZWQoc2IsIHR5cGUpOworfQorCitzdGF0aWMgaW5saW5lIGludCBzYl9hbnlfcXVvdGFfYWN0aXZlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJcmV0dXJuIHNiX2hhc19xdW90YV9hY3RpdmUoc2IsIFVTUlFVT1RBKSB8fAorCSAgICAgICBzYl9oYXNfcXVvdGFfYWN0aXZlKHNiLCBHUlBRVU9UQSk7Cit9CisKIC8qCiAgKiBPcGVyYXRpb25zIHN1cHBvcnRlZCBmb3IgZGlza3F1b3Rhcy4KICAqLwpAQCAtMTA0LDcgKzEzOSw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgdmZzX2RxX2luaXQoc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAlCVUdfT04oIWlub2RlLT5pX3NiKTsKLQlpZiAoc2JfYW55X3F1b3RhX2VuYWJsZWQoaW5vZGUtPmlfc2IpICYmICFJU19OT1FVT1RBKGlub2RlKSkKKwlpZiAoc2JfYW55X3F1b3RhX2FjdGl2ZShpbm9kZS0+aV9zYikgJiYgIUlTX05PUVVPVEEoaW5vZGUpKQogCQlpbm9kZS0+aV9zYi0+ZHFfb3AtPmluaXRpYWxpemUoaW5vZGUsIC0xKTsKIH0KIApAQCAtMTEyLDcgKzE0Nyw3IEBACiAgKiBhIHRyYW5zYWN0aW9uIChkZWFkbG9ja3MgcG9zc2libGUgb3RoZXJ3aXNlKSAqLwogc3RhdGljIGlubGluZSBpbnQgdmZzX2RxX3ByZWFsbG9jX3NwYWNlX25vZGlydHkoc3RydWN0IGlub2RlICppbm9kZSwgcXNpemVfdCBucikKIHsKLQlpZiAoc2JfYW55X3F1b3RhX2VuYWJsZWQoaW5vZGUtPmlfc2IpKSB7CisJaWYgKHNiX2FueV9xdW90YV9hY3RpdmUoaW5vZGUtPmlfc2IpKSB7CiAJCS8qIFVzZWQgc3BhY2UgaXMgdXBkYXRlZCBpbiBhbGxvY19zcGFjZSgpICovCiAJCWlmIChpbm9kZS0+aV9zYi0+ZHFfb3AtPmFsbG9jX3NwYWNlKGlub2RlLCBuciwgMSkgPT0gTk9fUVVPVEEpCiAJCQlyZXR1cm4gMTsKQEAgLTEzMiw3ICsxNjcsNyBAQAogCiBzdGF0aWMgaW5saW5lIGludCB2ZnNfZHFfYWxsb2Nfc3BhY2Vfbm9kaXJ0eShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBxc2l6ZV90IG5yKQogewotCWlmIChzYl9hbnlfcXVvdGFfZW5hYmxlZChpbm9kZS0+aV9zYikpIHsKKwlpZiAoc2JfYW55X3F1b3RhX2FjdGl2ZShpbm9kZS0+aV9zYikpIHsKIAkJLyogVXNlZCBzcGFjZSBpcyB1cGRhdGVkIGluIGFsbG9jX3NwYWNlKCkgKi8KIAkJaWYgKGlub2RlLT5pX3NiLT5kcV9vcC0+YWxsb2Nfc3BhY2UoaW5vZGUsIG5yLCAwKSA9PSBOT19RVU9UQSkKIAkJCXJldHVybiAxOwpAQCAtMTUyLDcgKzE4Nyw3IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IHZmc19kcV9hbGxvY19pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotCWlmIChzYl9hbnlfcXVvdGFfZW5hYmxlZChpbm9kZS0+aV9zYikpIHsKKwlpZiAoc2JfYW55X3F1b3RhX2FjdGl2ZShpbm9kZS0+aV9zYikpIHsKIAkJdmZzX2RxX2luaXQoaW5vZGUpOwogCQlpZiAoaW5vZGUtPmlfc2ItPmRxX29wLT5hbGxvY19pbm9kZShpbm9kZSwgMSkgPT0gTk9fUVVPVEEpCiAJCQlyZXR1cm4gMTsKQEAgLTE2Miw3ICsxOTcsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgdmZzX2RxX2ZyZWVfc3BhY2Vfbm9kaXJ0eShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBxc2l6ZV90IG5yKQogewotCWlmIChzYl9hbnlfcXVvdGFfZW5hYmxlZChpbm9kZS0+aV9zYikpCisJaWYgKHNiX2FueV9xdW90YV9hY3RpdmUoaW5vZGUtPmlfc2IpKQogCQlpbm9kZS0+aV9zYi0+ZHFfb3AtPmZyZWVfc3BhY2UoaW5vZGUsIG5yKTsKIAllbHNlCiAJCWlub2RlX3N1Yl9ieXRlcyhpbm9kZSwgbnIpOwpAQCAtMTc2LDcgKzIxMSw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB2ZnNfZHFfZnJlZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotCWlmIChzYl9hbnlfcXVvdGFfZW5hYmxlZChpbm9kZS0+aV9zYikpCisJaWYgKHNiX2FueV9xdW90YV9hY3RpdmUoaW5vZGUtPmlfc2IpKQogCQlpbm9kZS0+aV9zYi0+ZHFfb3AtPmZyZWVfaW5vZGUoaW5vZGUsIDEpOwogfQogCkBAIC0xOTcsMTIgKzIzMiwxMiBAQAogCiAjZWxzZQogCi1zdGF0aWMgaW5saW5lIGludCBzYl9oYXNfcXVvdGFfZW5hYmxlZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKK3N0YXRpYyBpbmxpbmUgaW50IHNiX2hhc19xdW90YV91c2FnZV9lbmFibGVkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQogewogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBzYl9hbnlfcXVvdGFfZW5hYmxlZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQorc3RhdGljIGlubGluZSBpbnQgc2JfaGFzX3F1b3RhX2xpbWl0c19lbmFibGVkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQogewogCXJldHVybiAwOwogfQpAQCAtMjE3LDYgKzI1MiwyNyBAQAogCXJldHVybiAwOwogfQogCisvKiBEb2VzIGtlcm5lbCBrbm93IGFib3V0IGFueSBxdW90YSBpbmZvcm1hdGlvbiBmb3IgZ2l2ZW4gc2IgKyB0eXBlPyAqLworc3RhdGljIGlubGluZSBpbnQgc2JfaGFzX3F1b3RhX2xvYWRlZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2JfYW55X3F1b3RhX2xvYWRlZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBzYl9oYXNfcXVvdGFfYWN0aXZlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBzYl9hbnlfcXVvdGFfYWN0aXZlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBOTy1PUCB3aGVuIHF1b3RhIG5vdCBjb25maWd1cmVkLgogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JhZGl4LXRyZWUuaCBiL2luY2x1ZGUvbGludXgvcmFkaXgtdHJlZS5oCmluZGV4IGE5MTZjNjYuLjM1NWY2ZTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmFkaXgtdHJlZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcmFkaXgtdHJlZS5oCkBAIC0xMzYsNyArMTM2LDcgQEAKICAqLwogc3RhdGljIGlubGluZSB2b2lkICpyYWRpeF90cmVlX2RlcmVmX3Nsb3Qodm9pZCAqKnBzbG90KQogewotCXZvaWQgKnJldCA9ICpwc2xvdDsKKwl2b2lkICpyZXQgPSByY3VfZGVyZWZlcmVuY2UoKnBzbG90KTsKIAlpZiAodW5saWtlbHkocmFkaXhfdHJlZV9pc19pbmRpcmVjdF9wdHIocmV0KSkpCiAJCXJldCA9IFJBRElYX1RSRUVfUkVUUlk7CiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmFpZC9tZF9rLmggYi9pbmNsdWRlL2xpbnV4L3JhaWQvbWRfay5oCmluZGV4IDhmYzkwOWUuLjk3NDNlNGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmFpZC9tZF9rLmgKKysrIGIvaW5jbHVkZS9saW51eC9yYWlkL21kX2suaApAQCAtMTM3LDYgKzEzNyw5IEBACiAJc3RydWN0IGdlbmRpc2sJCQkqZ2VuZGlzazsKIAogCXN0cnVjdCBrb2JqZWN0CQkJa29iajsKKwlpbnQJCQkJaG9sZF9hY3RpdmU7CisjZGVmaW5lCVVOVElMX0lPQ1RMCTEKKyNkZWZpbmUJVU5USUxfU1RPUAkyCiAKIAkvKiBTdXBlcmJsb2NrIGluZm9ybWF0aW9uICovCiAJaW50CQkJCW1ham9yX3ZlcnNpb24sCkBAIC0yMTUsNiArMjE4LDkgQEAKICNkZWZpbmUJTURfUkVDT1ZFUllfRlJPWkVOCTkKIAogCXVuc2lnbmVkIGxvbmcJCQlyZWNvdmVyeTsKKwlpbnQJCQkJcmVjb3ZlcnlfZGlzYWJsZWQ7IC8qIGlmIHdlIGRldGVjdCB0aGF0IHJlY292ZXJ5CisJCQkJCQkJICAgICogd2lsbCBhbHdheXMgZmFpbCwgc2V0IHRoaXMKKwkJCQkJCQkgICAgKiBzbyB3ZSBkb24ndCBsb29wIHRyeWluZyAqLwogCiAJaW50CQkJCWluX3N5bmM7CS8qIGtub3cgdG8gbm90IG5lZWQgcmVzeW5jICovCiAJc3RydWN0IG11dGV4CQkJcmVjb25maWdfbXV0ZXg7CkBAIC0yNDQsNiArMjUwLDkgQEAKIAlzdHJ1Y3Qgc3lzZnNfZGlyZW50CQkqc3lzZnNfc3RhdGU7CS8qIGhhbmRsZSBmb3IgJ2FycmF5X3N0YXRlJwogCQkJCQkJCSAqIGZpbGUgaW4gc3lzZnMuCiAJCQkJCQkJICovCisJc3RydWN0IHN5c2ZzX2RpcmVudAkJKnN5c2ZzX2FjdGlvbjsgIC8qIGhhbmRsZSBmb3IgJ3N5bmNfYWN0aW9uJyAqLworCisJc3RydWN0IHdvcmtfc3RydWN0IGRlbF93b3JrOwkvKiB1c2VkIGZvciBkZWxheWVkIHN5c2ZzIHJlbW92YWwgKi8KIAogCXNwaW5sb2NrX3QJCQl3cml0ZV9sb2NrOwogCXdhaXRfcXVldWVfaGVhZF90CQlzYl93YWl0OwkvKiBmb3Igd2FpdGluZyBvbiBzdXBlcmJsb2NrIHVwZGF0ZXMgKi8KQEAgLTMzNCwxNyArMzQzLDE0IEBACiAgKiBpdGVyYXRlcyB0aHJvdWdoIHNvbWUgcmRldiByaW5nbGlzdC4gSXQncyBzYWZlIHRvIHJlbW92ZSB0aGUKICAqIGN1cnJlbnQgJ3JkZXYnLiBEb250IHRvdWNoICd0bXAnIHRob3VnaC4KICAqLwotI2RlZmluZSByZGV2X2Zvcl9lYWNoX2xpc3QocmRldiwgdG1wLCBsaXN0KQkJCQlcCi0JCQkJCQkJCQlcCi0JZm9yICgodG1wKSA9IChsaXN0KS5uZXh0OwkJCQkJXAotCQkocmRldikgPSAobGlzdF9lbnRyeSgodG1wKSwgbWRrX3JkZXZfdCwgc2FtZV9zZXQpKSwJXAotCQkJKHRtcCkgPSAodG1wKS0+bmV4dCwgKHRtcCktPnByZXYgIT0gJihsaXN0KQlcCi0JCTsgKQorI2RlZmluZSByZGV2X2Zvcl9lYWNoX2xpc3QocmRldiwgdG1wLCBoZWFkKQkJCQlcCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJkZXYsIHRtcCwgaGVhZCwgc2FtZV9zZXQpCisKIC8qCiAgKiBpdGVyYXRlcyB0aHJvdWdoIHRoZSAnc2FtZSBhcnJheSBkaXNrcycgcmluZ2xpc3QKICAqLwogI2RlZmluZSByZGV2X2Zvcl9lYWNoKHJkZXYsIHRtcCwgbWRkZXYpCQkJCVwKLQlyZGV2X2Zvcl9lYWNoX2xpc3QocmRldiwgdG1wLCAobWRkZXYpLT5kaXNrcykKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmRldiwgdG1wLCAmKChtZGRldiktPmRpc2tzKSwgc2FtZV9zZXQpCiAKICNkZWZpbmUgcmRldl9mb3JfZWFjaF9yY3UocmRldiwgbWRkZXYpCQkJCVwKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShyZGV2LCAmKChtZGRldiktPmRpc2tzKSwgc2FtZV9zZXQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JhaWQvbWRfcC5oIGIvaW5jbHVkZS9saW51eC9yYWlkL21kX3AuaAppbmRleCA4YjRkZTRhLi45NDkxMDI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JhaWQvbWRfcC5oCisrKyBiL2luY2x1ZGUvbGludXgvcmFpZC9tZF9wLmgKQEAgLTE5NCw2ICsxOTQsOCBAQAogCXJldHVybiAoZXY8PDMyKXwgc2ItPmV2ZW50c19sbzsKIH0KIAorI2RlZmluZSBNRF9TVVBFUkJMT0NLXzFfVElNRV9TRUNfTUFTSyAoKDFVTEw8PDQwKSAtIDEpCisKIC8qCiAgKiBUaGUgdmVyc2lvbi0xIHN1cGVyYmxvY2sgOgogICogQWxsIG51bWVyaWMgZmllbGRzIGFyZSBsaXR0bGUtZW5kaWFuLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yYWlkL3JhaWQwLmggYi9pbmNsdWRlL2xpbnV4L3JhaWQvcmFpZDAuaAppbmRleCAxYjJkZGEwLi5mZDQyYWE4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JhaWQvcmFpZDAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JhaWQvcmFpZDAuaApAQCAtNSw5ICs1LDkgQEAKIAogc3RydWN0IHN0cmlwX3pvbmUKIHsKLQlzZWN0b3JfdCB6b25lX29mZnNldDsJLyogWm9uZSBvZmZzZXQgaW4gbWRfZGV2ICovCi0Jc2VjdG9yX3QgZGV2X29mZnNldDsJLyogWm9uZSBvZmZzZXQgaW4gcmVhbCBkZXYgKi8KLQlzZWN0b3JfdCBzaXplOwkJLyogWm9uZSBzaXplICovCisJc2VjdG9yX3Qgem9uZV9zdGFydDsJLyogWm9uZSBvZmZzZXQgaW4gbWRfZGV2IChpbiBzZWN0b3JzKSAqLworCXNlY3Rvcl90IGRldl9zdGFydDsJLyogWm9uZSBvZmZzZXQgaW4gcmVhbCBkZXYgKGluIHNlY3RvcnMpICovCisJc2VjdG9yX3Qgc2VjdG9yczsJLyogWm9uZSBzaXplIGluIHNlY3RvcnMgKi8KIAlpbnQgbmJfZGV2OwkJLyogIyBvZiBkZXZpY2VzIGF0dGFjaGVkIHRvIHRoZSB6b25lICovCiAJbWRrX3JkZXZfdCAqKmRldjsJLyogRGV2aWNlcyBhdHRhY2hlZCB0byB0aGUgem9uZSAqLwogfTsKQEAgLTE5LDggKzE5LDggQEAKIAltZGtfcmRldl90ICoqZGV2bGlzdDsgLyogbGlzdHMgb2YgcmRldnMsIHBvaW50ZWQgdG8gYnkgc3RyaXBfem9uZS0+ZGV2ICovCiAJaW50IG5yX3N0cmlwX3pvbmVzOwogCi0Jc2VjdG9yX3QgaGFzaF9zcGFjaW5nOwotCWludCBwcmVzaGlmdDsJCQkvKiBzaGlmdCB0aGlzIGJlZm9yZSBkaXZpZGUgYnkgaGFzaF9zcGFjaW5nICovCisJc2VjdG9yX3Qgc3BhY2luZzsKKwlpbnQgc2VjdG9yX3NoaWZ0OyAvKiBzaGlmdCB0aGlzIGJlZm9yZSBkaXZpZGUgYnkgc3BhY2luZyAqLwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgcmFpZDBfcHJpdmF0ZV9kYXRhIHJhaWQwX2NvbmZfdDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmN1cGRhdGUuaCBiL2luY2x1ZGUvbGludXgvcmN1cGRhdGUuaAppbmRleCAxMTY4ZmJjLi45MjEzNDBhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmgKKysrIGIvaW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oCkBAIC0yMDQsMTggKzIwNCw2IEBACiAKIGV4dGVybiB2b2lkIHdha2VtZV9hZnRlcl9yY3Uoc3RydWN0IHJjdV9oZWFkICAqaGVhZCk7CiAKLSNkZWZpbmUgc3luY2hyb25pemVfcmN1X3h4eChuYW1lLCBmdW5jKSBcCi12b2lkIG5hbWUodm9pZCkgXAoteyBcCi0Jc3RydWN0IHJjdV9zeW5jaHJvbml6ZSByY3U7IFwKLQlcCi0JaW5pdF9jb21wbGV0aW9uKCZyY3UuY29tcGxldGlvbik7IFwKLQkvKiBXaWxsIHdha2UgbWUgYWZ0ZXIgUkNVIGZpbmlzaGVkLiAqLyBcCi0JZnVuYygmcmN1LmhlYWQsIHdha2VtZV9hZnRlcl9yY3UpOyBcCi0JLyogV2FpdCBmb3IgaXQuICovIFwKLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZyY3UuY29tcGxldGlvbik7IFwKLX0KLQogLyoqCiAgKiBzeW5jaHJvbml6ZV9zY2hlZCAtIGJsb2NrIHVudGlsIGFsbCBDUFVzIGhhdmUgZXhpdGVkIGFueSBub24tcHJlZW1wdGl2ZQogICoga2VybmVsIGNvZGUgc2VxdWVuY2VzLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaCBiL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmgKaW5kZXggYWZkYzQ1NS4uODAxYmY3NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oCkBAIC0xMDQsMTAgKzEwNCwxMCBAQAogLyoqCiAgKiBzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSAtIERhdGEgdXNlZCBmb3IgYnVsayByZWd1bGF0b3Igb3BlcmF0aW9ucy4KICAqCi0gKiBAc3VwcGx5ICAgVGhlIG5hbWUgb2YgdGhlIHN1cHBseS4gIEluaXRpYWxpc2VkIGJ5IHRoZSB1c2VyIGJlZm9yZQotICogICAgICAgICAgIHVzaW5nIHRoZSBidWxrIHJlZ3VsYXRvciBBUElzLgotICogQGNvbnN1bWVyIFRoZSByZWd1bGF0b3IgY29uc3VtZXIgZm9yIHRoZSBzdXBwbHkuICBUaGlzIHdpbGwgYmUgbWFuYWdlZAotICogICAgICAgICAgIGJ5IHRoZSBidWxrIEFQSS4KKyAqIEBzdXBwbHk6ICAgVGhlIG5hbWUgb2YgdGhlIHN1cHBseS4gIEluaXRpYWxpc2VkIGJ5IHRoZSB1c2VyIGJlZm9yZQorICogICAgICAgICAgICB1c2luZyB0aGUgYnVsayByZWd1bGF0b3IgQVBJcy4KKyAqIEBjb25zdW1lcjogVGhlIHJlZ3VsYXRvciBjb25zdW1lciBmb3IgdGhlIHN1cHBseS4gIFRoaXMgd2lsbCBiZSBtYW5hZ2VkCisgKiAgICAgICAgICAgIGJ5IHRoZSBidWxrIEFQSS4KICAqCiAgKiBUaGUgcmVndWxhdG9yIEFQSXMgcHJvdmlkZSBhIHNlcmllcyBvZiByZWd1bGF0b3JfYnVsa18oKSBBUEkgY2FsbHMgYXMKICAqIGEgY29udmVuaWVuY2UgdG8gY29uc3VtZXJzIHdoaWNoIHJlcXVpcmUgbXVsdGlwbGUgc3VwcGxpZXMuICBUaGlzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaCBiL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2RyaXZlci5oCmluZGV4IGUzN2Q4MDUuLjJkYWUwNTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2RyaXZlci5oCisrKyBiL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2RyaXZlci5oCkBAIC0yNCw3ICsyNCwzMyBAQAogLyoqCiAgKiBzdHJ1Y3QgcmVndWxhdG9yX29wcyAtIHJlZ3VsYXRvciBvcGVyYXRpb25zLgogICoKLSAqIFRoaXMgc3RydWN0IGRlc2NyaWJlcyByZWd1bGF0b3Igb3BlcmF0aW9ucy4KKyAqIFRoaXMgc3RydWN0IGRlc2NyaWJlcyByZWd1bGF0b3Igb3BlcmF0aW9ucyB3aGljaCBjYW4gYmUgaW1wbGVtZW50ZWQgYnkKKyAqIHJlZ3VsYXRvciBjaGlwIGRyaXZlcnMuCisgKgorICogQGVuYWJsZTogRW5hYmxlIHRoZSByZWd1bGF0b3IuCisgKiBAZGlzYWJsZTogRGlzYWJsZSB0aGUgcmVndWxhdG9yLgorICogQGlzX2VuYWJsZWQ6IFJldHVybiAxIGlmIHRoZSByZWd1bGF0b3IgaXMgZW5hYmxlZCwgMCBvdGhlcndpc2UuCisgKgorICogQHNldF92b2x0YWdlOiBTZXQgdGhlIHZvbHRhZ2UgZm9yIHRoZSByZWd1bGF0b3Igd2l0aGluIHRoZSByYW5nZSBzcGVjaWZpZWQuCisgKiAgICAgICAgICAgICAgIFRoZSBkcml2ZXIgc2hvdWxkIHNlbGVjdCB0aGUgdm9sdGFnZSBjbG9zZXN0IHRvIG1pbl91Vi4KKyAqIEBnZXRfdm9sdGFnZTogUmV0dXJuIHRoZSBjdXJyZW50bHkgY29uZmlndXJlZCB2b2x0YWdlIGZvciB0aGUgcmVndWxhdG9yLgorICoKKyAqIEBzZXRfY3VycmVudF9saW1pdDogQ29uZmlndXJlIGEgbGltaXQgZm9yIGEgY3VycmVudC1saW1pdGVkIHJlZ3VsYXRvci4KKyAqIEBnZXRfY3VycmVudF9saW1pdDogR2V0IHRoZSBsaW1pdCBmb3IgYSBjdXJyZW50LWxpbWl0ZWQgcmVndWxhdG9yLgorICoKKyAqIEBzZXRfbW9kZTogU2V0IHRoZSBvcGVyYXRpbmcgbW9kZSBmb3IgdGhlIHJlZ3VsYXRvci4KKyAqIEBnZXRfbW9kZTogR2V0IHRoZSBjdXJyZW50IG9wZXJhdGluZyBtb2RlIGZvciB0aGUgcmVndWxhdG9yLgorICogQGdldF9vcHRpbXVtX21vZGU6IEdldCB0aGUgbW9zdCBlZmZpY2llbnQgb3BlcmF0aW5nIG1vZGUgZm9yIHRoZSByZWd1bGF0b3IKKyAqICAgICAgICAgICAgICAgICAgICB3aGVuIHJ1bm5pbmcgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCisgKgorICogQHNldF9zdXNwZW5kX3ZvbHRhZ2U6IFNldCB0aGUgdm9sdGFnZSBmb3IgdGhlIHJlZ3VsYXRvciB3aGVuIHRoZSBzeXN0ZW0KKyAqICAgICAgICAgICAgICAgICAgICAgICBpcyBzdXNwZW5kZWQuCisgKiBAc2V0X3N1c3BlbmRfZW5hYmxlOiBNYXJrIHRoZSByZWd1bGF0b3IgYXMgZW5hYmxlZCB3aGVuIHRoZSBzeXN0ZW0gaXMKKyAqICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbmRlZC4KKyAqIEBzZXRfc3VzcGVuZF9kaXNhYmxlOiBNYXJrIHRoZSByZWd1bGF0b3IgYXMgZGlzYWJsZWQgd2hlbiB0aGUgc3lzdGVtIGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuZGVkLgorICogQHNldF9zdXNwZW5kX21vZGU6IFNldCB0aGUgb3BlcmF0aW5nIG1vZGUgZm9yIHRoZSByZWd1bGF0b3Igd2hlbiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICBzeXN0ZW0gaXMgc3VzcGVuZGVkLgogICovCiBzdHJ1Y3QgcmVndWxhdG9yX29wcyB7CiAKQEAgLTc1LDYgKzEwMSwxNSBAQAogLyoqCiAgKiBzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgLSBSZWd1bGF0b3IgZGVzY3JpcHRvcgogICoKKyAqIEVhY2ggcmVndWxhdG9yIHJlZ2lzdGVyZWQgd2l0aCB0aGUgY29yZSBpcyBkZXNjcmliZWQgd2l0aCBhIHN0cnVjdHVyZSBvZgorICogdGhpcyB0eXBlLgorICoKKyAqIEBuYW1lOiBJZGVudGlmeWluZyBuYW1lIGZvciB0aGUgcmVndWxhdG9yLgorICogQGlkOiBOdW1lcmljYWwgaWRlbnRpZmllciBmb3IgdGhlIHJlZ3VsYXRvci4KKyAqIEBvcHM6IFJlZ3VsYXRvciBvcGVyYXRpb25zIHRhYmxlLgorICogQGlycTogSW50ZXJydXB0IG51bWJlciBmb3IgdGhlIHJlZ3VsYXRvci4KKyAqIEB0eXBlOiBJbmRpY2F0ZXMgaWYgdGhlIHJlZ3VsYXRvciBpcyBhIHZvbHRhZ2Ugb3IgY3VycmVudCByZWd1bGF0b3IuCisgKiBAb3duZXI6IE1vZHVsZSBwcm92aWRpbmcgdGhlIHJlZ3VsYXRvciwgdXNlZCBmb3IgcmVmY291bnRpbmcuCiAgKi8KIHN0cnVjdCByZWd1bGF0b3JfZGVzYyB7CiAJY29uc3QgY2hhciAqbmFtZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL21hY2hpbmUuaCBiL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL21hY2hpbmUuaAppbmRleCBjNmQ2OTMzLi4zNzk0NzczIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmgKKysrIGIvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvbWFjaGluZS5oCkBAIC00NCw2ICs0NCwxMCBAQAogICogc3RydWN0IHJlZ3VsYXRvcl9zdGF0ZSAtIHJlZ3VsYXRvciBzdGF0ZSBkdXJpbmcgbG93IHBvd2VyIHN5YXRlbSBzdGF0ZXMKICAqCiAgKiBUaGlzIGRlc2NyaWJlcyBhIHJlZ3VsYXRvcnMgc3RhdGUgZHVyaW5nIGEgc3lzdGVtIHdpZGUgbG93IHBvd2VyIHN0YXRlLgorICoKKyAqIEB1VjogT3BlcmF0aW5nIHZvbHRhZ2UgZHVyaW5nIHN1c3BlbmQuCisgKiBAbW9kZTogT3BlcmF0aW5nIG1vZGUgZHVyaW5nIHN1c3BlbmQuCisgKiBAZW5hYmxlZDogRW5hYmxlZCBkdXJpbmcgc3VzcGVuZC4KICAqLwogc3RydWN0IHJlZ3VsYXRvcl9zdGF0ZSB7CiAJaW50IHVWOwkvKiBzdXNwZW5kIHZvbHRhZ2UgKi8KQEAgLTU1LDYgKzU5LDMwIEBACiAgKiBzdHJ1Y3QgcmVndWxhdGlvbl9jb25zdHJhaW50cyAtIHJlZ3VsYXRvciBvcGVyYXRpbmcgY29uc3RyYWludHMuCiAgKgogICogVGhpcyBzdHJ1Y3QgZGVzY3JpYmVzIHJlZ3VsYXRvciBhbmQgYm9hcmQvbWFjaGluZSBzcGVjaWZpYyBjb25zdHJhaW50cy4KKyAqCisgKiBAbmFtZTogRGVzY3JpcHRpdmUgbmFtZSBmb3IgdGhlIGNvbnN0cmFpbnRzLCB1c2VkIGZvciBkaXNwbGF5IHB1cnBvc2VzLgorICoKKyAqIEBtaW5fdVY6IFNtYWxsZXN0IHZvbHRhZ2UgY29uc3VtZXJzIG1heSBzZXQuCisgKiBAbWF4X3VWOiBMYXJnZXN0IHZvbHRhZ2UgY29uc3VtZXJzIG1heSBzZXQuCisgKgorICogQG1pbl91QTogU21hbGxlc3QgY29uc3VtZXJzIGNvbnN1bWVycyBtYXkgc2V0LgorICogQG1heF91QTogTGFyZ2VzdCBjdXJyZW50IGNvbnN1bWVycyBtYXkgc2V0LgorICoKKyAqIEB2YWxpZF9tb2Rlc19tYXNrOiBNYXNrIG9mIG1vZGVzIHdoaWNoIG1heSBiZSBjb25maWd1cmVkIGJ5IGNvbnN1bWVycy4KKyAqIEB2YWxpZF9vcHNfbWFzazogT3BlcmF0aW9ucyB3aGljaCBtYXkgYmUgcGVyZm9ybWVkIGJ5IGNvbnN1bWVycy4KKyAqCisgKiBAYWx3YXlzX29uOiBTZXQgaWYgdGhlIHJlZ3VsYXRvciBzaG91bGQgbmV2ZXIgYmUgZGlzYWJsZWQuCisgKiBAYm9vdF9vbjogU2V0IGlmIHRoZSByZWd1bGF0b3IgaXMgZW5hYmxlZCB3aGVuIHRoZSBzeXN0ZW0gaXMgaW5pdGlhbGx5CisgKiAgICAgICAgICAgc3RhcnRlZC4KKyAqIEBhcHBseV91VjogQXBwbHkgdGhlIHZvbHRhZ2UgY29uc3RyYWludCB3aGVuIGluaXRpYWxpc2luZy4KKyAqCisgKiBAaW5wdXRfdVY6IElucHV0IHZvbHRhZ2UgZm9yIHJlZ3VsYXRvciB3aGVuIHN1cHBsaWVkIGJ5IGFub3RoZXIgcmVndWxhdG9yLgorICoKKyAqIEBzdGF0ZV9kaXNrOiBTdGF0ZSBmb3IgcmVndWxhdG9yIHdoZW4gc3lzdGVtIGlzIHN1c3BlbmRlZCBpbiBkaXNrIG1vZGUuCisgKiBAc3RhdGVfbWVtOiBTdGF0ZSBmb3IgcmVndWxhdG9yIHdoZW4gc3lzdGVtIGlzIHN1c3BlbmRlZCBpbiBtZW0gbW9kZS4KKyAqIEBzdGF0ZV9zdGFuZGJ5OiBTdGF0ZSBmb3IgcmVndWxhdG9yIHdoZW4gc3lzdGVtIGlzIHN1c3BlbmRlZCBpbiBzdGFuZGJ5CisgKiAgICAgICAgICAgICAgICAgbW9kZS4KKyAqIEBpbml0aWFsX3N0YXRlOiBTdXNwZW5kIHN0YXRlIHRvIHNldCBieSBkZWZhdWx0LgogICovCiBzdHJ1Y3QgcmVndWxhdGlvbl9jb25zdHJhaW50cyB7CiAKQEAgLTkzLDYgKzEyMSw5IEBACiAgKiBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSAtIHN1cHBseSAtPiBkZXZpY2UgbWFwcGluZwogICoKICAqIFRoaXMgbWFwcyBhIHN1cHBseSBuYW1lIHRvIGEgZGV2aWNlLgorICoKKyAqIEBkZXY6IERldmljZSBzdHJ1Y3R1cmUgZm9yIHRoZSBjb25zdW1lci4KKyAqIEBzdXBwbHk6IE5hbWUgZm9yIHRoZSBzdXBwbHkuCiAgKi8KIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CS8qIGNvbnN1bWVyICovCkBAIC0xMDMsNiArMTM0LDE2IEBACiAgKiBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSAtIHJlZ3VsYXRvciBwbGF0Zm9ybSBpbml0aWFsaXNhdGlvbiBkYXRhLgogICoKICAqIEluaXRpYWxpc2F0aW9uIGNvbnN0cmFpbnRzLCBvdXIgc3VwcGx5IGFuZCBjb25zdW1lcnMgc3VwcGxpZXMuCisgKgorICogQHN1cHBseV9yZWd1bGF0b3JfZGV2OiBQYXJlbnQgcmVndWxhdG9yIChpZiBhbnkpLgorICoKKyAqIEBjb25zdHJhaW50czogQ29uc3RyYWludHMuICBUaGVzZSBtdXN0IGJlIHNwZWNpZmllZCBmb3IgdGhlIHJlZ3VsYXRvciB0bworICogICAgICAgICAgICAgICBiZSB1c2FibGUuCisgKiBAbnVtX2NvbnN1bWVyX3N1cHBsaWVzOiBOdW1iZXIgb2YgY29uc3VtZXIgZGV2aWNlIHN1cHBsaWVzLgorICogQGNvbnN1bWVyX3N1cHBsaWVzOiBDb25zdW1lciBkZXZpY2Ugc3VwcGx5IGNvbmZpZ3VyYXRpb24uCisgKgorICogQHJlZ3VsYXRvcl9pbml0OiBDYWxsYmFjayBpbnZva2VkIHdoZW4gdGhlIHJlZ3VsYXRvciBoYXMgYmVlbiByZWdpc3RlcmVkLgorICogQGRyaXZlcl9kYXRhOiBEYXRhIHBhc3NlZCB0byByZWd1bGF0b3JfaW5pdC4KICAqLwogc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgewogCXN0cnVjdCBkZXZpY2UgKnN1cHBseV9yZWd1bGF0b3JfZGV2OyAvKiBvciBOVUxMIGZvciBMSU5FICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Jlc19jb3VudGVyLmggYi9pbmNsdWRlL2xpbnV4L3Jlc19jb3VudGVyLmgKaW5kZXggMjcxYzFjMi4uZGVkZTBhMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yZXNfY291bnRlci5oCisrKyBiL2luY2x1ZGUvbGludXgvcmVzX2NvdW50ZXIuaApAQCAtNDMsNiArNDMsMTAgQEAKIAkgKiB0aGUgcm91dGluZXMgYmVsb3cgY29uc2lkZXIgdGhpcyB0byBiZSBJUlEtc2FmZQogCSAqLwogCXNwaW5sb2NrX3QgbG9jazsKKwkvKgorCSAqIFBhcmVudCBjb3VudGVyLCB1c2VkIGZvciBoaWVyYXJjaGlhbCByZXNvdXJjZSBhY2NvdW50aW5nCisJICovCisJc3RydWN0IHJlc19jb3VudGVyICpwYXJlbnQ7CiB9OwogCiAvKioKQEAgLTg3LDcgKzkxLDcgQEAKICAqIGhlbHBlcnMgZm9yIGFjY291bnRpbmcKICAqLwogCi12b2lkIHJlc19jb3VudGVyX2luaXQoc3RydWN0IHJlc19jb3VudGVyICpjb3VudGVyKTsKK3ZvaWQgcmVzX2NvdW50ZXJfaW5pdChzdHJ1Y3QgcmVzX2NvdW50ZXIgKmNvdW50ZXIsIHN0cnVjdCByZXNfY291bnRlciAqcGFyZW50KTsKIAogLyoKICAqIGNoYXJnZSAtIHRyeSB0byBjb25zdW1lIG1vcmUgcmVzb3VyY2UuCkBAIC0xMDMsNyArMTA3LDcgQEAKIGludCBfX211c3RfY2hlY2sgcmVzX2NvdW50ZXJfY2hhcmdlX2xvY2tlZChzdHJ1Y3QgcmVzX2NvdW50ZXIgKmNvdW50ZXIsCiAJCXVuc2lnbmVkIGxvbmcgdmFsKTsKIGludCBfX211c3RfY2hlY2sgcmVzX2NvdW50ZXJfY2hhcmdlKHN0cnVjdCByZXNfY291bnRlciAqY291bnRlciwKLQkJdW5zaWduZWQgbG9uZyB2YWwpOworCQl1bnNpZ25lZCBsb25nIHZhbCwgc3RydWN0IHJlc19jb3VudGVyICoqbGltaXRfZmFpbF9hdCk7CiAKIC8qCiAgKiB1bmNoYXJnZSAtIHRlbGwgdGhhdCBzb21lIHBvcnRpb24gb2YgdGhlIHJlc291cmNlIGlzIHJlbGVhc2VkCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Jpb19kcnYuaCBiL2luY2x1ZGUvbGludXgvcmlvX2Rydi5oCmluZGV4IDMyYzA1NDcuLmM5M2E1OGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmlvX2Rydi5oCisrKyBiL2luY2x1ZGUvbGludXgvcmlvX2Rydi5oCkBAIC0zOTEsNyArMzkxLDYgQEAKICAqIHJpb19nZXRfaW5iX21lc3NhZ2UgLSBHZXQgQSBSSU8gbWVzc2FnZSBmcm9tIGFuIGluYm91bmQgbWFpbGJveCBxdWV1ZQogICogQG1wb3J0OiBNYXN0ZXIgcG9ydCBjb250YWluaW5nIHRoZSBpbmJvdW5kIG1haWxib3gKICAqIEBtYm94OiBUaGUgaW5ib3VuZCBtYWlsYm94IG51bWJlcgotICogQGJ1ZmZlcjogUG9pbnRlciB0byB0aGUgbWVzc2FnZSBidWZmZXIKICAqCiAgKiBHZXQgYSBSSU8gbWVzc2FnZSBmcm9tIGFuIGluYm91bmQgbWFpbGJveCBxdWV1ZS4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcm1hcC5oIGIvaW5jbHVkZS9saW51eC9ybWFwLmgKaW5kZXggODlmMDU2NC4uYjM1YmMwZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ybWFwLmgKKysrIGIvaW5jbHVkZS9saW51eC9ybWFwLmgKQEAgLTYzLDE2ICs2MywxMyBAQAogdm9pZCBhbm9uX3ZtYV9saW5rKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKTsKIHZvaWQgX19hbm9uX3ZtYV9saW5rKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKTsKIAotZXh0ZXJuIHN0cnVjdCBhbm9uX3ZtYSAqcGFnZV9sb2NrX2Fub25fdm1hKHN0cnVjdCBwYWdlICpwYWdlKTsKLWV4dGVybiB2b2lkIHBhZ2VfdW5sb2NrX2Fub25fdm1hKHN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEpOwotCiAvKgogICogcm1hcCBpbnRlcmZhY2VzIGNhbGxlZCB3aGVuIGFkZGluZyBvciByZW1vdmluZyBwdGUgb2YgcGFnZQogICovCiB2b2lkIHBhZ2VfYWRkX2Fub25fcm1hcChzdHJ1Y3QgcGFnZSAqLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiwgdW5zaWduZWQgbG9uZyk7CiB2b2lkIHBhZ2VfYWRkX25ld19hbm9uX3JtYXAoc3RydWN0IHBhZ2UgKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICosIHVuc2lnbmVkIGxvbmcpOwogdm9pZCBwYWdlX2FkZF9maWxlX3JtYXAoc3RydWN0IHBhZ2UgKik7Ci12b2lkIHBhZ2VfcmVtb3ZlX3JtYXAoc3RydWN0IHBhZ2UgKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOwordm9pZCBwYWdlX3JlbW92ZV9ybWFwKHN0cnVjdCBwYWdlICopOwogCiAjaWZkZWYgQ09ORklHX0RFQlVHX1ZNCiB2b2lkIHBhZ2VfZHVwX3JtYXAoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zY2hlZC5oIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCmluZGV4IDM4YTNmNGIuLjRjYWU5YjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2NoZWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKQEAgLTM4Niw2ICszODYsOSBAQAogCQkobW0pLT5oaXdhdGVyX3ZtID0gKG1tKS0+dG90YWxfdm07CVwKIH0gd2hpbGUgKDApCiAKKyNkZWZpbmUgZ2V0X21tX2hpd2F0ZXJfcnNzKG1tKQltYXgoKG1tKS0+aGl3YXRlcl9yc3MsIGdldF9tbV9yc3MobW0pKQorI2RlZmluZSBnZXRfbW1faGl3YXRlcl92bShtbSkJbWF4KChtbSktPmhpd2F0ZXJfdm0sIChtbSktPnRvdGFsX3ZtKQorCiBleHRlcm4gdm9pZCBzZXRfZHVtcGFibGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIGludCB2YWx1ZSk7CiBleHRlcm4gaW50IGdldF9kdW1wYWJsZShzdHJ1Y3QgbW1fc3RydWN0ICptbSk7CiAKQEAgLTkxMiw3ICs5MTUsNiBAQAogCiBleHRlcm4gdm9pZCBwYXJ0aXRpb25fc2NoZWRfZG9tYWlucyhpbnQgbmRvbXNfbmV3LCBzdHJ1Y3QgY3B1bWFzayAqZG9tc19uZXcsCiAJCQkJICAgIHN0cnVjdCBzY2hlZF9kb21haW5fYXR0ciAqZGF0dHJfbmV3KTsKLWV4dGVybiBpbnQgYXJjaF9yZWluaXRfc2NoZWRfZG9tYWlucyh2b2lkKTsKIAogLyogVGVzdCBhIGZsYWcgaW4gcGFyZW50IHNjaGVkIGRvbWFpbiAqLwogc3RhdGljIGlubGluZSBpbnQgdGVzdF9zZF9wYXJlbnQoc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIGludCBmbGFnKQpAQCAtMTcwNCwxNiArMTcwNiwxNiBAQAogc3RhdGljIGlubGluZSB2b2lkIHdha2VfdXBfaWRsZV9jcHUoaW50IGNwdSkgeyB9CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19TQ0hFRF9ERUJVRwogZXh0ZXJuIHVuc2lnbmVkIGludCBzeXNjdGxfc2NoZWRfbGF0ZW5jeTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgc3lzY3RsX3NjaGVkX21pbl9ncmFudWxhcml0eTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgc3lzY3RsX3NjaGVkX3dha2V1cF9ncmFudWxhcml0eTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgc3lzY3RsX3NjaGVkX3NoYXJlc19yYXRlbGltaXQ7CitleHRlcm4gdW5zaWduZWQgaW50IHN5c2N0bF9zY2hlZF9zaGFyZXNfdGhyZXNoOworI2lmZGVmIENPTkZJR19TQ0hFRF9ERUJVRwogZXh0ZXJuIHVuc2lnbmVkIGludCBzeXNjdGxfc2NoZWRfY2hpbGRfcnVuc19maXJzdDsKIGV4dGVybiB1bnNpZ25lZCBpbnQgc3lzY3RsX3NjaGVkX2ZlYXR1cmVzOwogZXh0ZXJuIHVuc2lnbmVkIGludCBzeXNjdGxfc2NoZWRfbWlncmF0aW9uX2Nvc3Q7CiBleHRlcm4gdW5zaWduZWQgaW50IHN5c2N0bF9zY2hlZF9ucl9taWdyYXRlOwotZXh0ZXJuIHVuc2lnbmVkIGludCBzeXNjdGxfc2NoZWRfc2hhcmVzX3JhdGVsaW1pdDsKLWV4dGVybiB1bnNpZ25lZCBpbnQgc3lzY3RsX3NjaGVkX3NoYXJlc190aHJlc2g7CiAKIGludCBzY2hlZF9ucl9sYXRlbmN5X2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKIAkJc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVuZ3RoLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oIGIvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oCmluZGV4IGI5MmI1ZTQuLjFmMmFiNjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VjdXJpdHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlY3VyaXR5LmgKQEAgLTQ4LDcgKzQ4LDggQEAKICAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgaW4gc2VjdXJpdHkvY2FwYWJpbGl0eS5jIGFuZCBhcmUgdXNlZAogICogYXMgdGhlIGRlZmF1bHQgY2FwYWJpbGl0aWVzIGZ1bmN0aW9ucwogICovCi1leHRlcm4gaW50IGNhcF9jYXBhYmxlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBpbnQgY2FwLCBpbnQgYXVkaXQpOworZXh0ZXJuIGludCBjYXBfY2FwYWJsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQsCisJCSAgICAgICBpbnQgY2FwLCBpbnQgYXVkaXQpOwogZXh0ZXJuIGludCBjYXBfc2V0dGltZShzdHJ1Y3QgdGltZXNwZWMgKnRzLCBzdHJ1Y3QgdGltZXpvbmUgKnR6KTsKIGV4dGVybiBpbnQgY2FwX3B0cmFjZV9tYXlfYWNjZXNzKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIHVuc2lnbmVkIGludCBtb2RlKTsKIGV4dGVybiBpbnQgY2FwX3B0cmFjZV90cmFjZW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqcGFyZW50KTsKQEAgLTEyNTEsOSArMTI1MiwxMiBAQAogICoJQHBlcm1pdHRlZCBjb250YWlucyB0aGUgcGVybWl0dGVkIGNhcGFiaWxpdHkgc2V0LgogICoJUmV0dXJuIDAgYW5kIHVwZGF0ZSBAbmV3IGlmIHBlcm1pc3Npb24gaXMgZ3JhbnRlZC4KICAqIEBjYXBhYmxlOgotICoJQ2hlY2sgd2hldGhlciB0aGUgQHRzayBwcm9jZXNzIGhhcyB0aGUgQGNhcCBjYXBhYmlsaXR5LgorICoJQ2hlY2sgd2hldGhlciB0aGUgQHRzayBwcm9jZXNzIGhhcyB0aGUgQGNhcCBjYXBhYmlsaXR5IGluIHRoZSBpbmRpY2F0ZWQKKyAqCWNyZWRlbnRpYWxzLgogICoJQHRzayBjb250YWlucyB0aGUgdGFza19zdHJ1Y3QgZm9yIHRoZSBwcm9jZXNzLgorICoJQGNyZWQgY29udGFpbnMgdGhlIGNyZWRlbnRpYWxzIHRvIHVzZS4KICAqCUBjYXAgY29udGFpbnMgdGhlIGNhcGFiaWxpdHkgPGluY2x1ZGUvbGludXgvY2FwYWJpbGl0eS5oPi4KKyAqCUBhdWRpdDogV2hldGhlciB0byB3cml0ZSBhbiBhdWRpdCBtZXNzYWdlIG9yIG5vdAogICoJUmV0dXJuIDAgaWYgdGhlIGNhcGFiaWxpdHkgaXMgZ3JhbnRlZCBmb3IgQHRzay4KICAqIEBhY2N0OgogICoJQ2hlY2sgcGVybWlzc2lvbiBiZWZvcmUgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIHByb2Nlc3MgYWNjb3VudGluZy4gIElmCkBAIC0xMzQ2LDcgKzEzNTAsOCBAQAogCQkgICAgICAgY29uc3Qga2VybmVsX2NhcF90ICplZmZlY3RpdmUsCiAJCSAgICAgICBjb25zdCBrZXJuZWxfY2FwX3QgKmluaGVyaXRhYmxlLAogCQkgICAgICAgY29uc3Qga2VybmVsX2NhcF90ICpwZXJtaXR0ZWQpOwotCWludCAoKmNhcGFibGUpIChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IGNhcCwgaW50IGF1ZGl0KTsKKwlpbnQgKCpjYXBhYmxlKSAoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGNvbnN0IHN0cnVjdCBjcmVkICpjcmVkLAorCQkJaW50IGNhcCwgaW50IGF1ZGl0KTsKIAlpbnQgKCphY2N0KSAoc3RydWN0IGZpbGUgKmZpbGUpOwogCWludCAoKnN5c2N0bCkgKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgb3ApOwogCWludCAoKnF1b3RhY3RsKSAoaW50IGNtZHMsIGludCB0eXBlLCBpbnQgaWQsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwpAQCAtMTYyOCw4ICsxNjMzLDkgQEAKIAkJICAgIGNvbnN0IGtlcm5lbF9jYXBfdCAqZWZmZWN0aXZlLAogCQkgICAgY29uc3Qga2VybmVsX2NhcF90ICppbmhlcml0YWJsZSwKIAkJICAgIGNvbnN0IGtlcm5lbF9jYXBfdCAqcGVybWl0dGVkKTsKLWludCBzZWN1cml0eV9jYXBhYmxlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBpbnQgY2FwKTsKLWludCBzZWN1cml0eV9jYXBhYmxlX25vYXVkaXQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGludCBjYXApOworaW50IHNlY3VyaXR5X2NhcGFibGUoaW50IGNhcCk7CitpbnQgc2VjdXJpdHlfcmVhbF9jYXBhYmxlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBpbnQgY2FwKTsKK2ludCBzZWN1cml0eV9yZWFsX2NhcGFibGVfbm9hdWRpdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IGNhcCk7CiBpbnQgc2VjdXJpdHlfYWNjdChzdHJ1Y3QgZmlsZSAqZmlsZSk7CiBpbnQgc2VjdXJpdHlfc3lzY3RsKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgb3ApOwogaW50IHNlY3VyaXR5X3F1b3RhY3RsKGludCBjbWRzLCBpbnQgdHlwZSwgaW50IGlkLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKQEAgLTE4MjYsMTQgKzE4MzIsMzEgQEAKIAlyZXR1cm4gY2FwX2NhcHNldChuZXcsIG9sZCwgZWZmZWN0aXZlLCBpbmhlcml0YWJsZSwgcGVybWl0dGVkKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgc2VjdXJpdHlfY2FwYWJsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IGNhcCkKK3N0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X2NhcGFibGUoaW50IGNhcCkKIHsKLQlyZXR1cm4gY2FwX2NhcGFibGUodHNrLCBjYXAsIFNFQ1VSSVRZX0NBUF9BVURJVCk7CisJcmV0dXJuIGNhcF9jYXBhYmxlKGN1cnJlbnQsIGN1cnJlbnRfY3JlZCgpLCBjYXAsIFNFQ1VSSVRZX0NBUF9BVURJVCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X2NhcGFibGVfbm9hdWRpdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IGNhcCkKK3N0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X3JlYWxfY2FwYWJsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IGNhcCkKIHsKLQlyZXR1cm4gY2FwX2NhcGFibGUodHNrLCBjYXAsIFNFQ1VSSVRZX0NBUF9OT0FVRElUKTsKKwlpbnQgcmV0OworCisJcmN1X3JlYWRfbG9jaygpOworCXJldCA9IGNhcF9jYXBhYmxlKHRzaywgX190YXNrX2NyZWQodHNrKSwgY2FwLCBTRUNVUklUWV9DQVBfQVVESVQpOworCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUKK2ludCBzZWN1cml0eV9yZWFsX2NhcGFibGVfbm9hdWRpdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IGNhcCkKK3sKKwlpbnQgcmV0OworCisJcmN1X3JlYWRfbG9jaygpOworCXJldCA9IGNhcF9jYXBhYmxlKHRzaywgX190YXNrX2NyZWQodHNrKSwgY2FwLAorCQkJICAgICAgIFNFQ1VSSVRZX0NBUF9OT0FVRElUKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW5saW5lIGludCBzZWN1cml0eV9hY2N0KHN0cnVjdCBmaWxlICpmaWxlKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZXJpYWxfY29yZS5oIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfY29yZS5oCmluZGV4IGI0MTk5ODQuLjkwYmJiZjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlcmlhbF9jb3JlLmgKQEAgLTE2MSw2ICsxNjEsOSBAQAogCiAjZGVmaW5lIFBPUlRfUzNDNjQwMAk4NAogCisvKiBOV1BTRVJJQUwgKi8KKyNkZWZpbmUgUE9SVF9OV1BTRVJJQUwJODUKKwogI2lmZGVmIF9fS0VSTkVMX18KIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NlcmlvLmggYi9pbmNsdWRlL2xpbnV4L3NlcmlvLmgKaW5kZXggMjU2NDFkOS4uMWJjYjM1NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZXJpby5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VyaW8uaApAQCAtMjEzLDUgKzIxMyw2IEBACiAjZGVmaW5lIFNFUklPX1pIRU5IVUEJMHgzNgogI2RlZmluZSBTRVJJT19JTkVYSU8JMHgzNwogI2RlZmluZSBTRVJJT19UT1VDSElUMjEzCTB4MzcKKyNkZWZpbmUgU0VSSU9fVzgwMDEJMHgzOQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3BpL3NwaS5oIGIvaW5jbHVkZS9saW51eC9zcGkvc3BpLmgKaW5kZXggODIyMjkzMS4uNjhiYjFjNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zcGkvc3BpLmgKKysrIGIvaW5jbHVkZS9saW51eC9zcGkvc3BpLmgKQEAgLTMyNyw5ICszMjcsOSBAQAogICogQHR4X2RtYTogRE1BIGFkZHJlc3Mgb2YgdHhfYnVmLCBpZiBAc3BpX21lc3NhZ2UuaXNfZG1hX21hcHBlZAogICogQHJ4X2RtYTogRE1BIGFkZHJlc3Mgb2YgcnhfYnVmLCBpZiBAc3BpX21lc3NhZ2UuaXNfZG1hX21hcHBlZAogICogQGxlbjogc2l6ZSBvZiByeCBhbmQgdHggYnVmZmVycyAoaW4gYnl0ZXMpCi0gKiBAc3BlZWRfaHo6IFNlbGVjdCBhIHNwZWVkIG90aGVyIHRoZW4gdGhlIGRldmljZSBkZWZhdWx0IGZvciB0aGlzCisgKiBAc3BlZWRfaHo6IFNlbGVjdCBhIHNwZWVkIG90aGVyIHRoYW4gdGhlIGRldmljZSBkZWZhdWx0IGZvciB0aGlzCiAgKiAgICAgIHRyYW5zZmVyLiBJZiAwIHRoZSBkZWZhdWx0IChmcm9tIEBzcGlfZGV2aWNlKSBpcyB1c2VkLgotICogQGJpdHNfcGVyX3dvcmQ6IHNlbGVjdCBhIGJpdHNfcGVyX3dvcmQgb3RoZXIgdGhlbiB0aGUgZGV2aWNlIGRlZmF1bHQKKyAqIEBiaXRzX3Blcl93b3JkOiBzZWxlY3QgYSBiaXRzX3Blcl93b3JkIG90aGVyIHRoYW4gdGhlIGRldmljZSBkZWZhdWx0CiAgKiAgICAgIGZvciB0aGlzIHRyYW5zZmVyLiBJZiAwIHRoZSBkZWZhdWx0IChmcm9tIEBzcGlfZGV2aWNlKSBpcyB1c2VkLgogICogQGNzX2NoYW5nZTogYWZmZWN0cyBjaGlwc2VsZWN0IGFmdGVyIHRoaXMgdHJhbnNmZXIgY29tcGxldGVzCiAgKiBAZGVsYXlfdXNlY3M6IG1pY3Jvc2Vjb25kcyB0byBkZWxheSBhZnRlciB0aGlzIHRyYW5zZmVyIGJlZm9yZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zcGkvc3BpX2dwaW8uaCBiL2luY2x1ZGUvbGludXgvc3BpL3NwaV9ncGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYwMWEwZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvc3BpL3NwaV9ncGlvLmgKQEAgLTAsMCArMSw2MCBAQAorI2lmbmRlZiBfX0xJTlVYX1NQSV9HUElPX0gKKyNkZWZpbmUgX19MSU5VWF9TUElfR1BJT19ICisKKy8qCisgKiBGb3IgZWFjaCBiaXRiYW5nZWQgU1BJIGJ1cywgc2V0IHVwIGEgcGxhdGZvcm1fZGV2aWNlIG5vZGUgd2l0aDoKKyAqICAgLSBuYW1lICJzcGlfZ3BpbyIKKyAqICAgLSBpZCB0aGUgc2FtZSBhcyB0aGUgU1BJIGJ1cyBudW1iZXIgaXQgaW1wbGVtZW50cworICogICAtIGRldi5wbGF0Zm9ybSBkYXRhIHBvaW50aW5nIHRvIGEgc3RydWN0IHNwaV9ncGlvX3BsYXRmb3JtX2RhdGEKKyAqCisgKiBPciwgc2VlIHRoZSBkcml2ZXIgY29kZSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgc3BlZWR1cHMgdGhhdCBhcmUKKyAqIHBvc3NpYmxlIG9uIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgaW5saW5lZCBhY2Nlc3MgZm9yIEdQSU9zIChubworICogc3BpX2dwaW9fcGxhdGZvcm1fZGF0YSBpcyB1c2VkKS4KKyAqCisgKiBVc2Ugc3BpX2JvYXJkX2luZm8gd2l0aCB0aGVzZSBidXNzZXMgaW4gdGhlIHVzdWFsIHdheSwgYmVpbmcgc3VyZQorICogdGhhdCB0aGUgY29udHJvbGxlcl9kYXRhIGJlaW5nIHRoZSBHUElPIHVzZWQgZm9yIGVhY2ggZGV2aWNlJ3MKKyAqIGNoaXBzZWxlY3Q6CisgKgorICoJc3RhdGljIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyAuLi4gW10gPSB7CisgKgkuLi4KKyAqCQkvLyB0aGlzIHNsYXZlIHVzZXMgR1BJTyA0MiBmb3IgaXRzIGNoaXBzZWxlY3QKKyAqCQkuY29udHJvbGxlcl9kYXRhID0gKHZvaWQgKikgNDIsCisgKgkuLi4KKyAqCQkvLyB0aGlzIG9uZSB1c2VzIEdQSU8gODYgZm9yIGl0cyBjaGlwc2VsZWN0CisgKgkJLmNvbnRyb2xsZXJfZGF0YSA9ICh2b2lkICopIDg2LAorICoJLi4uCisgKgl9OworICoKKyAqIElmIHRoZSBiaXRiYW5nZWQgYnVzIGlzIGxhdGVyIHN3aXRjaGVkIHRvIGEgIm5hdGl2ZSIgY29udHJvbGxlciwKKyAqIHRoYXQgcGxhdGZvcm1fZGV2aWNlIGFuZCBjb250cm9sbGVyX2RhdGEgc2hvdWxkIGJlIHJlbW92ZWQuCisgKi8KKworLyoqCisgKiBzdHJ1Y3Qgc3BpX2dwaW9fcGxhdGZvcm1fZGF0YSAtIHBhcmFtZXRlciBmb3IgYml0YmFuZ2VkIFNQSSBtYXN0ZXIKKyAqIEBzY2s6IG51bWJlciBvZiB0aGUgR1BJTyB1c2VkIGZvciBjbG9jayBvdXRwdXQKKyAqIEBtb3NpOiBudW1iZXIgb2YgdGhlIEdQSU8gdXNlZCBmb3IgTWFzdGVyIE91dHB1dCwgU2xhdmUgSW4gKE1PU0kpIGRhdGEKKyAqIEBtaXNvOiBudW1iZXIgb2YgdGhlIEdQSU8gdXNlZCBmb3IgTWFzdGVyIElucHV0LCBTbGF2ZSBPdXRwdXQgKE1JU08pIGRhdGEKKyAqIEBudW1fY2hpcHNlbGVjdDogaG93IG1hbnkgc2xhdmVzIHRvIGFsbG93CisgKgorICogQWxsIEdQSU8gc2lnbmFscyB1c2VkIHdpdGggdGhlIFNQSSBidXMgbWFuYWdlZCB0aHJvdWdoIHRoaXMgZHJpdmVyCisgKiAoY2hpcHNlbGVjdHMsIE1PU0ksIE1JU08sIFNDSykgbXVzdCBiZSBjb25maWd1cmVkIGFzIEdQSU9zLCBpbnN0ZWFkCisgKiBvZiBzb21lIGFsdGVybmF0ZSBmdW5jdGlvbi4KKyAqCisgKiBJdCBjYW4gYmUgY29udmVuaWVudCB0byB1c2UgdGhpcyBkcml2ZXIgd2l0aCBwaW5zIHRoYXQgaGF2ZSBhbHRlcm5hdGUKKyAqIGZ1bmN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYSAibmF0aXZlIiBTUEkgY29udHJvbGxlciBpZiBhIGRyaXZlciBmb3IgdGhhdAorICogY29udHJvbGxlciBpcyBub3QgYXZhaWxhYmxlLCBvciBpcyBtaXNzaW5nIGltcG9ydGFudCBmdW5jdGlvbmFsaXR5LgorICoKKyAqIE9uIHBsYXRmb3JtcyB3aGljaCBjYW4gZG8gc28sIGNvbmZpZ3VyZSBNSVNPIHdpdGggYSB3ZWFrIHB1bGx1cCB1bmxlc3MKKyAqIHRoZXJlJ3MgYW4gZXh0ZXJuYWwgcHVsbHVwIG9uIHRoYXQgc2lnbmFsLiAgVGhhdCBzYXZlcyBwb3dlciBieSBhdm9pZGluZworICogZmxvYXRpbmcgc2lnbmFscy4gIChBIHdlYWsgcHVsbGRvd24gd291bGQgc2F2ZSBwb3dlciB0b28sIGJ1dCBtYW55CisgKiBkcml2ZXJzIGV4cGVjdCB0byBzZWUgYWxsLW9uZXMgZGF0YSBhcyB0aGUgbm8gc2xhdmUgInJlc3BvbnNlIi4pCisgKi8KK3N0cnVjdCBzcGlfZ3Bpb19wbGF0Zm9ybV9kYXRhIHsKKwl1bnNpZ25lZAlzY2s7CisJdW5zaWduZWQJbW9zaTsKKwl1bnNpZ25lZAltaXNvOworCisJdTE2CQludW1fY2hpcHNlbGVjdDsKK307CisKKyNlbmRpZiAvKiBfX0xJTlVYX1NQSV9HUElPX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3RvcF9tYWNoaW5lLmggYi9pbmNsdWRlL2xpbnV4L3N0b3BfbWFjaGluZS5oCmluZGV4IDc0ZDU5YTYuLmJhYmEzYTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3RvcF9tYWNoaW5lLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdG9wX21hY2hpbmUuaApAQCAtMzUsNiArMzUsMjQgQEAKICAqIHdvbid0IGNvbWUgb3IgZ28gd2hpbGUgaXQncyBiZWluZyBjYWxsZWQuICBVc2VkIGJ5IGhvdHBsdWcgY3B1LgogICovCiBpbnQgX19zdG9wX21hY2hpbmUoaW50ICgqZm4pKHZvaWQgKiksIHZvaWQgKmRhdGEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVzKTsKKworLyoqCisgKiBzdG9wX21hY2hpbmVfY3JlYXRlOiBjcmVhdGUgYWxsIHN0b3BfbWFjaGluZSB0aHJlYWRzCisgKgorICogRGVzY3JpcHRpb246IFRoaXMgY2F1c2VzIGFsbCBzdG9wX21hY2hpbmUgdGhyZWFkcyB0byBiZSBjcmVhdGVkIGJlZm9yZQorICogc3RvcF9tYWNoaW5lIGFjdHVhbGx5IGdldHMgY2FsbGVkLiBUaGlzIGNhbiBiZSB1c2VkIGJ5IHN1YnN5c3RlbXMgdGhhdAorICogbmVlZCBhIG5vbiBmYWlsaW5nIHN0b3BfbWFjaGluZSBpbmZyYXN0cnVjdHVyZS4KKyAqLworaW50IHN0b3BfbWFjaGluZV9jcmVhdGUodm9pZCk7CisKKy8qKgorICogc3RvcF9tYWNoaW5lX2Rlc3Ryb3k6IGRlc3Ryb3kgYWxsIHN0b3BfbWFjaGluZSB0aHJlYWRzCisgKgorICogRGVzY3JpcHRpb246IFRoaXMgY2F1c2VzIGFsbCBzdG9wX21hY2hpbmUgdGhyZWFkcyB3aGljaCB3ZXJlIGNyZWF0ZWQgd2l0aAorICogc3RvcF9tYWNoaW5lX2NyZWF0ZSB0byBiZSBkZXN0cm95ZWQgYWdhaW4uCisgKi8KK3ZvaWQgc3RvcF9tYWNoaW5lX2Rlc3Ryb3kodm9pZCk7CisKICNlbHNlCiAKIHN0YXRpYyBpbmxpbmUgaW50IHN0b3BfbWFjaGluZShpbnQgKCpmbikodm9pZCAqKSwgdm9pZCAqZGF0YSwKQEAgLTQ2LDUgKzY0LDkgQEAKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJcmV0dXJuIHJldDsKIH0KKworc3RhdGljIGlubGluZSBpbnQgc3RvcF9tYWNoaW5lX2NyZWF0ZSh2b2lkKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgc3RvcF9tYWNoaW5lX2Rlc3Ryb3kodm9pZCkgeyB9CisKICNlbmRpZiAvKiBDT05GSUdfU01QICovCiAjZW5kaWYgLyogX0xJTlVYX1NUT1BfTUFDSElORSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjLmggYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmMuaAppbmRleCAzYWZlN2ZiLi4zNDM1ZDI0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmMuaApAQCAtNTgsMTAgKzU4LDEzIEBACiAJc3RydWN0IHN2Y19zdGF0ICoJc3Zfc3RhdHM7CS8qIFJQQyBzdGF0aXN0aWNzICovCiAJc3BpbmxvY2tfdAkJc3ZfbG9jazsKIAl1bnNpZ25lZCBpbnQJCXN2X25ydGhyZWFkczsJLyogIyBvZiBzZXJ2ZXIgdGhyZWFkcyAqLworCXVuc2lnbmVkIGludAkJc3ZfbWF4Y29ubjsJLyogbWF4IGNvbm5lY3Rpb25zIGFsbG93ZWQgb3IKKwkJCQkJCSAqICcwJyBjYXVzaW5nIG1heCB0byBiZSBiYXNlZAorCQkJCQkJICogb24gbnVtYmVyIG9mIHRocmVhZHMuICovCisKIAl1bnNpZ25lZCBpbnQJCXN2X21heF9wYXlsb2FkOwkvKiBkYXRhZ3JhbSBwYXlsb2FkIHNpemUgKi8KIAl1bnNpZ25lZCBpbnQJCXN2X21heF9tZXNnOwkvKiBtYXhfcGF5bG9hZCArIDEgcGFnZSBmb3Igb3ZlcmhlYWRzICovCiAJdW5zaWduZWQgaW50CQlzdl94ZHJzaXplOwkvKiBYRFIgYnVmZmVyIHNpemUgKi8KLQogCXN0cnVjdCBsaXN0X2hlYWQJc3ZfcGVybXNvY2tzOwkvKiBhbGwgcGVybWFuZW50IHNvY2tldHMgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCXN2X3RlbXBzb2NrczsJLyogYWxsIHRlbXBvcmFyeSBzb2NrZXRzICovCiAJaW50CQkJc3ZfdG1wY250OwkvKiBjb3VudCBvZiB0ZW1wb3Jhcnkgc29ja2V0cyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zd2FiLmggYi9pbmNsdWRlL2xpbnV4L3N3YWIuaAppbmRleCBiYmVkMjc5Li5iZTUyODRkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N3YWIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N3YWIuaApAQCAtOSwxNyArOSwxNyBAQAogICogY2FzdHMgYXJlIG5lY2Vzc2FyeSBmb3IgY29uc3RhbnRzLCBiZWNhdXNlIHdlIG5ldmVyIGtub3cgaG93IGZvciBzdXJlCiAgKiBob3cgVS9VTC9VTEwgbWFwIHRvIF9fdTE2LCBfX3UzMiwgX191NjQuIEF0IGxlYXN0IG5vdCBpbiBhIHBvcnRhYmxlIHdheS4KICAqLwotI2RlZmluZSBfX2NvbnN0X3N3YWIxNih4KSAoKF9fdTE2KSgJCQkJXAorI2RlZmluZSBfX19jb25zdGFudF9zd2FiMTYoeCkgKChfX3UxNikoCQkJCVwKIAkoKChfX3UxNikoeCkgJiAoX191MTYpMHgwMGZmVSkgPDwgOCkgfAkJCVwKIAkoKChfX3UxNikoeCkgJiAoX191MTYpMHhmZjAwVSkgPj4gOCkpKQogCi0jZGVmaW5lIF9fY29uc3Rfc3dhYjMyKHgpICgoX191MzIpKAkJCQlcCisjZGVmaW5lIF9fX2NvbnN0YW50X3N3YWIzMih4KSAoKF9fdTMyKSgJCQkJXAogCSgoKF9fdTMyKSh4KSAmIChfX3UzMikweDAwMDAwMGZmVUwpIDw8IDI0KSB8CQlcCiAJKCgoX191MzIpKHgpICYgKF9fdTMyKTB4MDAwMGZmMDBVTCkgPDwgIDgpIHwJCVwKIAkoKChfX3UzMikoeCkgJiAoX191MzIpMHgwMGZmMDAwMFVMKSA+PiAgOCkgfAkJXAogCSgoKF9fdTMyKSh4KSAmIChfX3UzMikweGZmMDAwMDAwVUwpID4+IDI0KSkpCiAKLSNkZWZpbmUgX19jb25zdF9zd2FiNjQoeCkgKChfX3U2NCkoCQkJCVwKKyNkZWZpbmUgX19fY29uc3RhbnRfc3dhYjY0KHgpICgoX191NjQpKAkJCQlcCiAJKCgoX191NjQpKHgpICYgKF9fdTY0KTB4MDAwMDAwMDAwMDAwMDBmZlVMTCkgPDwgNTYpIHwJXAogCSgoKF9fdTY0KSh4KSAmIChfX3U2NCkweDAwMDAwMDAwMDAwMGZmMDBVTEwpIDw8IDQwKSB8CVwKIAkoKChfX3U2NCkoeCkgJiAoX191NjQpMHgwMDAwMDAwMDAwZmYwMDAwVUxMKSA8PCAyNCkgfAlcCkBAIC0yOSwxMSArMjksMTEgQEAKIAkoKChfX3U2NCkoeCkgJiAoX191NjQpMHgwMGZmMDAwMDAwMDAwMDAwVUxMKSA+PiA0MCkgfAlcCiAJKCgoX191NjQpKHgpICYgKF9fdTY0KTB4ZmYwMDAwMDAwMDAwMDAwMFVMTCkgPj4gNTYpKSkKIAotI2RlZmluZSBfX2NvbnN0X3N3YWh3MzIoeCkgKChfX3UzMikoCQkJCVwKKyNkZWZpbmUgX19fY29uc3RhbnRfc3dhaHczMih4KSAoKF9fdTMyKSgJCQlcCiAJKCgoX191MzIpKHgpICYgKF9fdTMyKTB4MDAwMGZmZmZVTCkgPDwgMTYpIHwJCVwKIAkoKChfX3UzMikoeCkgJiAoX191MzIpMHhmZmZmMDAwMFVMKSA+PiAxNikpKQogCi0jZGVmaW5lIF9fY29uc3Rfc3dhaGIzMih4KSAoKF9fdTMyKSgJCQkJXAorI2RlZmluZSBfX19jb25zdGFudF9zd2FoYjMyKHgpICgoX191MzIpKAkJCVwKIAkoKChfX3UzMikoeCkgJiAoX191MzIpMHgwMGZmMDBmZlVMKSA8PCA4KSB8CQlcCiAJKCgoX191MzIpKHgpICYgKF9fdTMyKTB4ZmYwMGZmMDBVTCkgPj4gOCkpKQogCkBAIC00Myw1MiArNDMsNTIgQEAKICAqIF9fX3N3YWIxNiwgX19fc3dhYjMyLCBfX19zd2FiNjQsIF9fX3N3YWh3MzIsIF9fX3N3YWhiMzIKICAqLwogCi1zdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MTYgX19fc3dhYjE2KF9fdTE2IHZhbCkKK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UxNiBfX2Zzd2FiMTYoX191MTYgdmFsKQogewogI2lmZGVmIF9fYXJjaF9zd2FiMTYKIAlyZXR1cm4gX19hcmNoX3N3YWIxNih2YWwpOwogI2Vsc2UKLQlyZXR1cm4gX19jb25zdF9zd2FiMTYodmFsKTsKKwlyZXR1cm4gX19fY29uc3RhbnRfc3dhYjE2KHZhbCk7CiAjZW5kaWYKIH0KIAotc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyIF9fX3N3YWIzMihfX3UzMiB2YWwpCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19mc3dhYjMyKF9fdTMyIHZhbCkKIHsKICNpZmRlZiBfX2FyY2hfc3dhYjMyCiAJcmV0dXJuIF9fYXJjaF9zd2FiMzIodmFsKTsKICNlbHNlCi0JcmV0dXJuIF9fY29uc3Rfc3dhYjMyKHZhbCk7CisJcmV0dXJuIF9fX2NvbnN0YW50X3N3YWIzMih2YWwpOwogI2VuZGlmCiB9CiAKLXN0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyBfX3U2NCBfX19zd2FiNjQoX191NjQgdmFsKQorc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTY0IF9fZnN3YWI2NChfX3U2NCB2YWwpCiB7CiAjaWZkZWYgX19hcmNoX3N3YWI2NAogCXJldHVybiBfX2FyY2hfc3dhYjY0KHZhbCk7CiAjZWxpZiBkZWZpbmVkKF9fU1dBQl82NF9USFJVXzMyX18pCiAJX191MzIgaCA9IHZhbCA+PiAzMjsKIAlfX3UzMiBsID0gdmFsICYgKCgxVUxMIDw8IDMyKSAtIDEpOwotCXJldHVybiAoKChfX3U2NClfX19zd2FiMzIobCkpIDw8IDMyKSB8ICgoX191NjQpKF9fX3N3YWIzMihoKSkpOworCXJldHVybiAoKChfX3U2NClfX2Zzd2FiMzIobCkpIDw8IDMyKSB8ICgoX191NjQpKF9fZnN3YWIzMihoKSkpOwogI2Vsc2UKLQlyZXR1cm4gX19jb25zdF9zd2FiNjQodmFsKTsKKwlyZXR1cm4gX19fY29uc3RhbnRfc3dhYjY0KHZhbCk7CiAjZW5kaWYKIH0KIAotc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyIF9fX3N3YWh3MzIoX191MzIgdmFsKQorc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyIF9fZnN3YWh3MzIoX191MzIgdmFsKQogewogI2lmZGVmIF9fYXJjaF9zd2FodzMyCiAJcmV0dXJuIF9fYXJjaF9zd2FodzMyKHZhbCk7CiAjZWxzZQotCXJldHVybiBfX2NvbnN0X3N3YWh3MzIodmFsKTsKKwlyZXR1cm4gX19fY29uc3RhbnRfc3dhaHczMih2YWwpOwogI2VuZGlmCiB9CiAKLXN0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UzMiBfX19zd2FoYjMyKF9fdTMyIHZhbCkKK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UzMiBfX2Zzd2FoYjMyKF9fdTMyIHZhbCkKIHsKICNpZmRlZiBfX2FyY2hfc3dhaGIzMgogCXJldHVybiBfX2FyY2hfc3dhaGIzMih2YWwpOwogI2Vsc2UKLQlyZXR1cm4gX19jb25zdF9zd2FoYjMyKHZhbCk7CisJcmV0dXJuIF9fX2NvbnN0YW50X3N3YWhiMzIodmFsKTsKICNlbmRpZgogfQogCkBAIC05OCw4ICs5OCw4IEBACiAgKi8KICNkZWZpbmUgX19zd2FiMTYoeCkJCQkJXAogCShfX2J1aWx0aW5fY29uc3RhbnRfcCgoX191MTYpKHgpKSA/CVwKLQlfX2NvbnN0X3N3YWIxNigoeCkpIDoJCQlcCi0JX19fc3dhYjE2KCh4KSkpCisJX19fY29uc3RhbnRfc3dhYjE2KHgpIDoJCQlcCisJX19mc3dhYjE2KHgpKQogCiAvKioKICAqIF9fc3dhYjMyIC0gcmV0dXJuIGEgYnl0ZXN3YXBwZWQgMzItYml0IHZhbHVlCkBAIC0xMDcsOCArMTA3LDggQEAKICAqLwogI2RlZmluZSBfX3N3YWIzMih4KQkJCQlcCiAJKF9fYnVpbHRpbl9jb25zdGFudF9wKChfX3UzMikoeCkpID8JXAotCV9fY29uc3Rfc3dhYjMyKCh4KSkgOgkJCVwKLQlfX19zd2FiMzIoKHgpKSkKKwlfX19jb25zdGFudF9zd2FiMzIoeCkgOgkJCVwKKwlfX2Zzd2FiMzIoeCkpCiAKIC8qKgogICogX19zd2FiNjQgLSByZXR1cm4gYSBieXRlc3dhcHBlZCA2NC1iaXQgdmFsdWUKQEAgLTExNiw4ICsxMTYsOCBAQAogICovCiAjZGVmaW5lIF9fc3dhYjY0KHgpCQkJCVwKIAkoX19idWlsdGluX2NvbnN0YW50X3AoKF9fdTY0KSh4KSkgPwlcCi0JX19jb25zdF9zd2FiNjQoKHgpKSA6CQkJXAotCV9fX3N3YWI2NCgoeCkpKQorCV9fX2NvbnN0YW50X3N3YWI2NCh4KSA6CQkJXAorCV9fZnN3YWI2NCh4KSkKIAogLyoqCiAgKiBfX3N3YWh3MzIgLSByZXR1cm4gYSB3b3JkLXN3YXBwZWQgMzItYml0IHZhbHVlCkBAIC0xMjcsOCArMTI3LDggQEAKICAqLwogI2RlZmluZSBfX3N3YWh3MzIoeCkJCQkJXAogCShfX2J1aWx0aW5fY29uc3RhbnRfcCgoX191MzIpKHgpKSA/CVwKLQlfX2NvbnN0X3N3YWh3MzIoKHgpKSA6CQkJXAotCV9fX3N3YWh3MzIoKHgpKSkKKwlfX19jb25zdGFudF9zd2FodzMyKHgpIDoJCVwKKwlfX2Zzd2FodzMyKHgpKQogCiAvKioKICAqIF9fc3dhaGIzMiAtIHJldHVybiBhIGhpZ2ggYW5kIGxvdyBieXRlLXN3YXBwZWQgMzItYml0IHZhbHVlCkBAIC0xMzgsOCArMTM4LDggQEAKICAqLwogI2RlZmluZSBfX3N3YWhiMzIoeCkJCQkJXAogCShfX2J1aWx0aW5fY29uc3RhbnRfcCgoX191MzIpKHgpKSA/CVwKLQlfX2NvbnN0X3N3YWhiMzIoKHgpKSA6CQkJXAotCV9fX3N3YWhiMzIoKHgpKSkKKwlfX19jb25zdGFudF9zd2FoYjMyKHgpIDoJCVwKKwlfX2Zzd2FoYjMyKHgpKQogCiAvKioKICAqIF9fc3dhYjE2cCAtIHJldHVybiBhIGJ5dGVzd2FwcGVkIDE2LWJpdCB2YWx1ZSBmcm9tIGEgcG9pbnRlcgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zd2FwLmggYi9pbmNsdWRlL2xpbnV4L3N3YXAuaAppbmRleCBhM2FmOTViLi5kMzAyMTU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N3YXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N3YXAuaApAQCAtMTIwLDcgKzEyMCw5IEBACiBlbnVtIHsKIAlTV1BfVVNFRAk9ICgxIDw8IDApLAkvKiBpcyBzbG90IGluIHN3YXBfaW5mb1tdIHVzZWQ/ICovCiAJU1dQX1dSSVRFT0sJPSAoMSA8PCAxKSwJLyogb2sgdG8gd3JpdGUgdG8gdGhpcyBzd2FwPwkqLwotCVNXUF9BQ1RJVkUJPSAoU1dQX1VTRUQgfCBTV1BfV1JJVEVPSyksCisJU1dQX0RJU0NBUkRBQkxFID0gKDEgPDwgMiksCS8qIGJsa2RldiBzdXBwb3J0cyBkaXNjYXJkICovCisJU1dQX0RJU0NBUkRJTkcJPSAoMSA8PCAzKSwJLyogbm93IGRpc2NhcmRpbmcgYSBmcmVlIGNsdXN0ZXIgKi8KKwlTV1BfU09MSURTVEFURQk9ICgxIDw8IDQpLAkvKiBibGtkZXYgc2Vla3MgYXJlIGNoZWFwICovCiAJCQkJCS8qIGFkZCBvdGhlcnMgaGVyZSBiZWZvcmUuLi4gKi8KIAlTV1BfU0NBTk5JTkcJPSAoMSA8PCA4KSwJLyogcmVmY291bnQgaW4gc2Nhbl9zd2FwX21hcCAqLwogfTsKQEAgLTEzNCwyMiArMTM2LDI0IEBACiAgKiBUaGUgaW4tbWVtb3J5IHN0cnVjdHVyZSB1c2VkIHRvIHRyYWNrIHN3YXAgYXJlYXMuCiAgKi8KIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0IHsKLQl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcHJpbzsJCQkvKiBzd2FwIHByaW9yaXR5ICovCisJaW50IG5leHQ7CQkJLyogbmV4dCBlbnRyeSBvbiBzd2FwIGxpc3QgKi8KIAlzdHJ1Y3QgZmlsZSAqc3dhcF9maWxlOwogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CiAJc3RydWN0IGxpc3RfaGVhZCBleHRlbnRfbGlzdDsKIAlzdHJ1Y3Qgc3dhcF9leHRlbnQgKmN1cnJfc3dhcF9leHRlbnQ7Ci0JdW5zaWduZWQgb2xkX2Jsb2NrX3NpemU7Ci0JdW5zaWduZWQgc2hvcnQgKiBzd2FwX21hcDsKKwl1bnNpZ25lZCBzaG9ydCAqc3dhcF9tYXA7CiAJdW5zaWduZWQgaW50IGxvd2VzdF9iaXQ7CiAJdW5zaWduZWQgaW50IGhpZ2hlc3RfYml0OworCXVuc2lnbmVkIGludCBsb3dlc3RfYWxsb2M7CS8qIHdoaWxlIHByZXBhcmluZyBkaXNjYXJkIGNsdXN0ZXIgKi8KKwl1bnNpZ25lZCBpbnQgaGlnaGVzdF9hbGxvYzsJLyogd2hpbGUgcHJlcGFyaW5nIGRpc2NhcmQgY2x1c3RlciAqLwogCXVuc2lnbmVkIGludCBjbHVzdGVyX25leHQ7CiAJdW5zaWduZWQgaW50IGNsdXN0ZXJfbnI7CiAJdW5zaWduZWQgaW50IHBhZ2VzOwogCXVuc2lnbmVkIGludCBtYXg7CiAJdW5zaWduZWQgaW50IGludXNlX3BhZ2VzOwotCWludCBuZXh0OwkJCS8qIG5leHQgZW50cnkgb24gc3dhcCBsaXN0ICovCisJdW5zaWduZWQgaW50IG9sZF9ibG9ja19zaXplOwogfTsKIAogc3RydWN0IHN3YXBfbGlzdF90IHsKQEAgLTE2Myw3ICsxNjcsNiBAQAogLyogbGludXgvbW0vcGFnZV9hbGxvYy5jICovCiBleHRlcm4gdW5zaWduZWQgbG9uZyB0b3RhbHJhbV9wYWdlczsKIGV4dGVybiB1bnNpZ25lZCBsb25nIHRvdGFscmVzZXJ2ZV9wYWdlczsKLWV4dGVybiBsb25nIG5yX3N3YXBfcGFnZXM7CiBleHRlcm4gdW5zaWduZWQgaW50IG5yX2ZyZWVfYnVmZmVyX3BhZ2VzKHZvaWQpOwogZXh0ZXJuIHVuc2lnbmVkIGludCBucl9mcmVlX3BhZ2VjYWNoZV9wYWdlcyh2b2lkKTsKIApAQCAtMTc0LDggKzE3Nyw2IEBACiAvKiBsaW51eC9tbS9zd2FwLmMgKi8KIGV4dGVybiB2b2lkIF9fbHJ1X2NhY2hlX2FkZChzdHJ1Y3QgcGFnZSAqLCBlbnVtIGxydV9saXN0IGxydSk7CiBleHRlcm4gdm9pZCBscnVfY2FjaGVfYWRkX2xydShzdHJ1Y3QgcGFnZSAqLCBlbnVtIGxydV9saXN0IGxydSk7Ci1leHRlcm4gdm9pZCBscnVfY2FjaGVfYWRkX2FjdGl2ZV9vcl91bmV2aWN0YWJsZShzdHJ1Y3QgcGFnZSAqLAotCQkJCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKik7CiBleHRlcm4gdm9pZCBhY3RpdmF0ZV9wYWdlKHN0cnVjdCBwYWdlICopOwogZXh0ZXJuIHZvaWQgbWFya19wYWdlX2FjY2Vzc2VkKHN0cnVjdCBwYWdlICopOwogZXh0ZXJuIHZvaWQgbHJ1X2FkZF9kcmFpbih2b2lkKTsKQEAgLTIxMyw3ICsyMTQsOCBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfcGFnZXMoc3RydWN0IHpvbmVsaXN0ICp6b25lbGlzdCwgaW50IG9yZGVyLAogCQkJCQlnZnBfdCBnZnBfbWFzayk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCi0JCQkJCQkJZ2ZwX3QgZ2ZwX21hc2spOworCQkJCQkJICBnZnBfdCBnZnBfbWFzaywgYm9vbCBub3N3YXAsCisJCQkJCQkgIHVuc2lnbmVkIGludCBzd2FwcGluZXNzKTsKIGV4dGVybiBpbnQgX19pc29sYXRlX2xydV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgbW9kZSwgaW50IGZpbGUpOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2hyaW5rX2FsbF9tZW1vcnkodW5zaWduZWQgbG9uZyBucl9wYWdlcyk7CiBleHRlcm4gaW50IHZtX3N3YXBwaW5lc3M7CkBAIC0yODAsNyArMjgyLDcgQEAKIGV4dGVybiBzdHJ1Y3QgYWRkcmVzc19zcGFjZSBzd2FwcGVyX3NwYWNlOwogI2RlZmluZSB0b3RhbF9zd2FwY2FjaGVfcGFnZXMgIHN3YXBwZXJfc3BhY2UubnJwYWdlcwogZXh0ZXJuIHZvaWQgc2hvd19zd2FwX2NhY2hlX2luZm8odm9pZCk7Ci1leHRlcm4gaW50IGFkZF90b19zd2FwKHN0cnVjdCBwYWdlICosIGdmcF90KTsKK2V4dGVybiBpbnQgYWRkX3RvX3N3YXAoc3RydWN0IHBhZ2UgKik7CiBleHRlcm4gaW50IGFkZF90b19zd2FwX2NhY2hlKHN0cnVjdCBwYWdlICosIHN3cF9lbnRyeV90LCBnZnBfdCk7CiBleHRlcm4gdm9pZCBfX2RlbGV0ZV9mcm9tX3N3YXBfY2FjaGUoc3RydWN0IHBhZ2UgKik7CiBleHRlcm4gdm9pZCBkZWxldGVfZnJvbV9zd2FwX2NhY2hlKHN0cnVjdCBwYWdlICopOwpAQCAtMjkzLDYgKzI5NSw3IEBACiAJCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyKTsKIAogLyogbGludXgvbW0vc3dhcGZpbGUuYyAqLworZXh0ZXJuIGxvbmcgbnJfc3dhcF9wYWdlczsKIGV4dGVybiBsb25nIHRvdGFsX3N3YXBfcGFnZXM7CiBleHRlcm4gdm9pZCBzaV9zd2FwaW5mbyhzdHJ1Y3Qgc3lzaW5mbyAqKTsKIGV4dGVybiBzd3BfZW50cnlfdCBnZXRfc3dhcF9wYWdlKHZvaWQpOwpAQCAtMzAwLDE1ICszMDMsMTQgQEAKIGV4dGVybiBpbnQgc3dhcF9kdXBsaWNhdGUoc3dwX2VudHJ5X3QpOwogZXh0ZXJuIGludCB2YWxpZF9zd2FwaGFuZGxlcyhzd3BfZW50cnlfdCwgdW5zaWduZWQgbG9uZyAqKTsKIGV4dGVybiB2b2lkIHN3YXBfZnJlZShzd3BfZW50cnlfdCk7Ci1leHRlcm4gdm9pZCBmcmVlX3N3YXBfYW5kX2NhY2hlKHN3cF9lbnRyeV90KTsKK2V4dGVybiBpbnQgZnJlZV9zd2FwX2FuZF9jYWNoZShzd3BfZW50cnlfdCk7CiBleHRlcm4gaW50IHN3YXBfdHlwZV9vZihkZXZfdCwgc2VjdG9yX3QsIHN0cnVjdCBibG9ja19kZXZpY2UgKiopOwogZXh0ZXJuIHVuc2lnbmVkIGludCBjb3VudF9zd2FwX3BhZ2VzKGludCwgaW50KTsKIGV4dGVybiBzZWN0b3JfdCBtYXBfc3dhcF9wYWdlKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICosIHBnb2ZmX3QpOwogZXh0ZXJuIHNlY3Rvcl90IHN3YXBkZXZfYmxvY2soaW50LCBwZ29mZl90KTsKIGV4dGVybiBzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqZ2V0X3N3YXBfaW5mb19zdHJ1Y3QodW5zaWduZWQpOwotZXh0ZXJuIGludCBjYW5fc2hhcmVfc3dhcF9wYWdlKHN0cnVjdCBwYWdlICopOwotZXh0ZXJuIGludCByZW1vdmVfZXhjbHVzaXZlX3N3YXBfcGFnZShzdHJ1Y3QgcGFnZSAqKTsKLWV4dGVybiBpbnQgcmVtb3ZlX2V4Y2x1c2l2ZV9zd2FwX3BhZ2VfcmVmKHN0cnVjdCBwYWdlICopOworZXh0ZXJuIGludCByZXVzZV9zd2FwX3BhZ2Uoc3RydWN0IHBhZ2UgKik7CitleHRlcm4gaW50IHRyeV90b19mcmVlX3N3YXAoc3RydWN0IHBhZ2UgKik7CiBzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbzsKIAogLyogbGludXgvbW0vdGhyYXNoLmMgKi8KQEAgLTMzMiw5ICszMzQsMjYgQEAKIAlwdXRfc3dhcF90b2tlbihzd2FwX3Rva2VuX21tKTsKIH0KIAorI2lmZGVmIENPTkZJR19DR1JPVVBfTUVNX1JFU19DVExSCitleHRlcm4gdm9pZCBtZW1fY2dyb3VwX3VuY2hhcmdlX3N3YXBjYWNoZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3dwX2VudHJ5X3QgZW50KTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQKK21lbV9jZ3JvdXBfdW5jaGFyZ2Vfc3dhcGNhY2hlKHN0cnVjdCBwYWdlICpwYWdlLCBzd3BfZW50cnlfdCBlbnQpCit7Cit9CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUl9TV0FQCitleHRlcm4gdm9pZCBtZW1fY2dyb3VwX3VuY2hhcmdlX3N3YXAoc3dwX2VudHJ5X3QgZW50KTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgbWVtX2Nncm91cF91bmNoYXJnZV9zd2FwKHN3cF9lbnRyeV90IGVudCkKK3sKK30KKyNlbmRpZgorCiAjZWxzZSAvKiBDT05GSUdfU1dBUCAqLwogCi0jZGVmaW5lIHRvdGFsX3N3YXBfcGFnZXMJCQkwCisjZGVmaW5lIG5yX3N3YXBfcGFnZXMJCQkJMEwKKyNkZWZpbmUgdG90YWxfc3dhcF9wYWdlcwkJCTBMCiAjZGVmaW5lIHRvdGFsX3N3YXBjYWNoZV9wYWdlcwkJCTBVTAogCiAjZGVmaW5lIHNpX3N3YXBpbmZvKHZhbCkgXApAQCAtMzUwLDE0ICszNjksOCBAQAogewogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9zd2FwX2FuZF9jYWNoZShzd3BfZW50cnlfdCBzd3ApCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHN3YXBfZHVwbGljYXRlKHN3cF9lbnRyeV90IHN3cCkKLXsKLQlyZXR1cm4gMDsKLX0KKyNkZWZpbmUgZnJlZV9zd2FwX2FuZF9jYWNoZShzd3ApCWlzX21pZ3JhdGlvbl9lbnRyeShzd3ApCisjZGVmaW5lIHN3YXBfZHVwbGljYXRlKHN3cCkJCWlzX21pZ3JhdGlvbl9lbnRyeShzd3ApCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzd2FwX2ZyZWUoc3dwX2VudHJ5X3Qgc3dwKQogewpAQCAtMzc0LDcgKzM4NywxMCBAQAogCXJldHVybiBOVUxMOwogfQogCi0jZGVmaW5lIGNhbl9zaGFyZV9zd2FwX3BhZ2UocCkJCQkocGFnZV9tYXBjb3VudChwKSA9PSAxKQorc3RhdGljIGlubGluZSBpbnQgYWRkX3RvX3N3YXAoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcmV0dXJuIDA7Cit9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGFkZF90b19zd2FwX2NhY2hlKHN0cnVjdCBwYWdlICpwYWdlLCBzd3BfZW50cnlfdCBlbnRyeSwKIAkJCQkJCQlnZnBfdCBnZnBfbWFzaykKQEAgLTM5MCwxNCArNDA2LDkgQEAKIHsKIH0KIAotI2RlZmluZSBzd2FwX3Rva2VuX2RlZmF1bHRfdGltZW91dAkJMAorI2RlZmluZSByZXVzZV9zd2FwX3BhZ2UocGFnZSkJKHBhZ2VfbWFwY291bnQocGFnZSkgPT0gMSkKIAotc3RhdGljIGlubGluZSBpbnQgcmVtb3ZlX2V4Y2x1c2l2ZV9zd2FwX3BhZ2Uoc3RydWN0IHBhZ2UgKnApCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHJlbW92ZV9leGNsdXNpdmVfc3dhcF9wYWdlX3JlZihzdHJ1Y3QgcGFnZSAqcGFnZSkKK3N0YXRpYyBpbmxpbmUgaW50IHRyeV90b19mcmVlX3N3YXAoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiAJcmV0dXJuIDA7CiB9CkBAIC00MTUsNiArNDI2LDEyIEBACiAjZGVmaW5lIGhhc19zd2FwX3Rva2VuKHgpIDAKICNkZWZpbmUgZGlzYWJsZV9zd2FwX3Rva2VuKCkgZG8geyB9IHdoaWxlKDApCiAKK3N0YXRpYyBpbmxpbmUgaW50IG1lbV9jZ3JvdXBfY2FjaGVfY2hhcmdlX3N3YXBpbihzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBnZnBfdCBtYXNrLCBib29sIGxvY2tlZCkKK3sKKwlyZXR1cm4gMDsKK30KKwogI2VuZGlmIC8qIENPTkZJR19TV0FQICovCiAjZW5kaWYgLyogX19LRVJORUxfXyovCiAjZW5kaWYgLyogX0xJTlVYX1NXQVBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zd2lvdGxiLmggYi9pbmNsdWRlL2xpbnV4L3N3aW90bGIuaAppbmRleCAzMjVhZjFkLi5kZWRkM2MwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N3aW90bGIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N3aW90bGIuaApAQCAtMjcsNyArMjcsOCBAQAogZXh0ZXJuIHZvaWQgKnN3aW90bGJfYWxsb2NfYm9vdChzaXplX3QgYnl0ZXMsIHVuc2lnbmVkIGxvbmcgbnNsYWJzKTsKIGV4dGVybiB2b2lkICpzd2lvdGxiX2FsbG9jKHVuc2lnbmVkIG9yZGVyLCB1bnNpZ25lZCBsb25nIG5zbGFicyk7CiAKLWV4dGVybiBkbWFfYWRkcl90IHN3aW90bGJfcGh5c190b19idXMocGh5c19hZGRyX3QgYWRkcmVzcyk7CitleHRlcm4gZG1hX2FkZHJfdCBzd2lvdGxiX3BoeXNfdG9fYnVzKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LAorCQkJCSAgICAgIHBoeXNfYWRkcl90IGFkZHJlc3MpOwogZXh0ZXJuIHBoeXNfYWRkcl90IHN3aW90bGJfYnVzX3RvX3BoeXMoZG1hX2FkZHJfdCBhZGRyZXNzKTsKIAogZXh0ZXJuIGludCBzd2lvdGxiX2FyY2hfcmFuZ2VfbmVlZHNfbWFwcGluZyh2b2lkICpwdHIsIHNpemVfdCBzaXplKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3lzY2FsbHMuaCBiL2luY2x1ZGUvbGludXgvc3lzY2FsbHMuaAppbmRleCAwNGZiNDdiLi4xOGQwYTI0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N5c2NhbGxzLmgKKysrIGIvaW5jbHVkZS9saW51eC9zeXNjYWxscy5oCkBAIC01NDksNyArNTQ5LDcgQEAKIGFzbWxpbmthZ2UgbG9uZyBzeXNfaW5vdGlmeV9pbml0MShpbnQgZmxhZ3MpOwogYXNtbGlua2FnZSBsb25nIHN5c19pbm90aWZ5X2FkZF93YXRjaChpbnQgZmQsIGNvbnN0IGNoYXIgX191c2VyICpwYXRoLAogCQkJCQl1MzIgbWFzayk7Ci1hc21saW5rYWdlIGxvbmcgc3lzX2lub3RpZnlfcm1fd2F0Y2goaW50IGZkLCB1MzIgd2QpOworYXNtbGlua2FnZSBsb25nIHN5c19pbm90aWZ5X3JtX3dhdGNoKGludCBmZCwgX19zMzIgd2QpOwogCiBhc21saW5rYWdlIGxvbmcgc3lzX3NwdV9ydW4oaW50IGZkLCBfX3UzMiBfX3VzZXIgKnVucGMsCiAJCQkJIF9fdTMyIF9fdXNlciAqdXN0YXR1cyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RpbWUuaCBiL2luY2x1ZGUvbGludXgvdGltZS5oCmluZGV4IGNlMzIxYWMuLmZiYmQyYTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdGltZS5oCisrKyBiL2luY2x1ZGUvbGludXgvdGltZS5oCkBAIC0xMDUsNiArMTA1LDcgQEAKIGV4dGVybiBpbnQgdXBkYXRlX3BlcnNpc3RlbnRfY2xvY2soc3RydWN0IHRpbWVzcGVjIG5vdyk7CiBleHRlcm4gaW50IG5vX3N5bmNfY21vc19jbG9jayBfX3JlYWRfbW9zdGx5Owogdm9pZCB0aW1la2VlcGluZ19pbml0KHZvaWQpOworZXh0ZXJuIGludCB0aW1la2VlcGluZ19zdXNwZW5kZWQ7CiAKIHVuc2lnbmVkIGxvbmcgZ2V0X3NlY29uZHModm9pZCk7CiBzdHJ1Y3QgdGltZXNwZWMgY3VycmVudF9rZXJuZWxfdGltZSh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdHlwZXMuaCBiL2luY2x1ZGUvbGludXgvdHlwZXMuaAppbmRleCAxMjFmMzQ5Li43MTJjYTUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3R5cGVzLmgKKysrIGIvaW5jbHVkZS9saW51eC90eXBlcy5oCkBAIC0xNzYsMTAgKzE3Niw5IEBACiB0eXBlZGVmIF9fdTE2IF9fYml0d2lzZSBfX2JlMTY7CiB0eXBlZGVmIF9fdTMyIF9fYml0d2lzZSBfX2xlMzI7CiB0eXBlZGVmIF9fdTMyIF9fYml0d2lzZSBfX2JlMzI7Ci0jaWYgZGVmaW5lZChfX0dOVUNfXykKIHR5cGVkZWYgX191NjQgX19iaXR3aXNlIF9fbGU2NDsKIHR5cGVkZWYgX191NjQgX19iaXR3aXNlIF9fYmU2NDsKLSNlbmRpZgorCiB0eXBlZGVmIF9fdTE2IF9fYml0d2lzZSBfX3N1bTE2OwogdHlwZWRlZiBfX3UzMiBfX2JpdHdpc2UgX193c3VtOwogCkBAIC0xOTUsNiArMTk0LDE2IEBACiAKIHR5cGVkZWYgcGh5c19hZGRyX3QgcmVzb3VyY2Vfc2l6ZV90OwogCit0eXBlZGVmIHN0cnVjdCB7CisJdm9sYXRpbGUgaW50IGNvdW50ZXI7Cit9IGF0b21pY190OworCisjaWZkZWYgQ09ORklHXzY0QklUCit0eXBlZGVmIHN0cnVjdCB7CisJdm9sYXRpbGUgbG9uZyBjb3VudGVyOworfSBhdG9taWM2NF90OworI2VuZGlmCisKIHN0cnVjdCB1c3RhdCB7CiAJX19rZXJuZWxfZGFkZHJfdAlmX3RmcmVlOwogCV9fa2VybmVsX2lub190CQlmX3Rpbm9kZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdWlvX2RyaXZlci5oIGIvaW5jbHVkZS9saW51eC91aW9fZHJpdmVyLmgKaW5kZXggY2RmMzM4ZC4uYTBiYjZiZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91aW9fZHJpdmVyLmgKKysrIGIvaW5jbHVkZS9saW51eC91aW9fZHJpdmVyLmgKQEAgLTM4LDYgKzM4LDI0IEBACiAKICNkZWZpbmUgTUFYX1VJT19NQVBTCTUKIAorc3RydWN0IHVpb19wb3J0aW87CisKKy8qKgorICogc3RydWN0IHVpb19wb3J0IC0gZGVzY3JpcHRpb24gb2YgYSBVSU8gcG9ydCByZWdpb24KKyAqIEBzdGFydDoJCXN0YXJ0IG9mIHBvcnQgcmVnaW9uCisgKiBAc2l6ZToJCXNpemUgb2YgcG9ydCByZWdpb24KKyAqIEBwb3J0dHlwZToJCXR5cGUgb2YgcG9ydCAoc2VlIFVJT19QT1JUXyogYmVsb3cpCisgKiBAcG9ydGlvOgkJZm9yIHVzZSBieSB0aGUgVUlPIGNvcmUgb25seS4KKyAqLworc3RydWN0IHVpb19wb3J0IHsKKwl1bnNpZ25lZCBsb25nCQlzdGFydDsKKwl1bnNpZ25lZCBsb25nCQlzaXplOworCWludAkJCXBvcnR0eXBlOworCXN0cnVjdCB1aW9fcG9ydGlvCSpwb3J0aW87Cit9OworCisjZGVmaW5lIE1BWF9VSU9fUE9SVF9SRUdJT05TCTUKKwogc3RydWN0IHVpb19kZXZpY2U7CiAKIC8qKgpAQCAtNDYsNiArNjQsNyBAQAogICogQG5hbWU6CQlkZXZpY2UgbmFtZQogICogQHZlcnNpb246CQlkZXZpY2UgZHJpdmVyIHZlcnNpb24KICAqIEBtZW06CQlsaXN0IG9mIG1hcHBhYmxlIG1lbW9yeSByZWdpb25zLCBzaXplPT0wIGZvciBlbmQgb2YgbGlzdAorICogQHBvcnQ6CQlsaXN0IG9mIHBvcnQgcmVnaW9ucywgc2l6ZT09MCBmb3IgZW5kIG9mIGxpc3QKICAqIEBpcnE6CQlpbnRlcnJ1cHQgbnVtYmVyIG9yIFVJT19JUlFfQ1VTVE9NCiAgKiBAaXJxX2ZsYWdzOgkJZmxhZ3MgZm9yIHJlcXVlc3RfaXJxKCkKICAqIEBwcml2OgkJb3B0aW9uYWwgcHJpdmF0ZSBkYXRhCkBAIC01Nyw5ICs3NiwxMCBAQAogICovCiBzdHJ1Y3QgdWlvX2luZm8gewogCXN0cnVjdCB1aW9fZGV2aWNlCSp1aW9fZGV2OwotCWNoYXIJCQkqbmFtZTsKLQljaGFyCQkJKnZlcnNpb247CisJY29uc3QgY2hhcgkJKm5hbWU7CisJY29uc3QgY2hhcgkJKnZlcnNpb247CiAJc3RydWN0IHVpb19tZW0JCW1lbVtNQVhfVUlPX01BUFNdOworCXN0cnVjdCB1aW9fcG9ydAkJcG9ydFtNQVhfVUlPX1BPUlRfUkVHSU9OU107CiAJbG9uZwkJCWlycTsKIAl1bnNpZ25lZCBsb25nCQlpcnFfZmxhZ3M7CiAJdm9pZAkJCSpwcml2OwpAQCAtOTIsNCArMTEyLDEwIEBACiAjZGVmaW5lIFVJT19NRU1fTE9HSUNBTAkyCiAjZGVmaW5lIFVJT19NRU1fVklSVFVBTCAzCiAKKy8qIGRlZmluZXMgZm9yIHVpb19wb3J0LT5wb3J0dHlwZSAqLworI2RlZmluZSBVSU9fUE9SVF9OT05FCTAKKyNkZWZpbmUgVUlPX1BPUlRfWDg2CTEKKyNkZWZpbmUgVUlPX1BPUlRfR1BJTwkyCisjZGVmaW5lIFVJT19QT1JUX09USEVSCTMKKwogI2VuZGlmIC8qIF9MSU5VWF9VSU9fRFJJVkVSX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Vud2luZC5oIGIvaW5jbHVkZS9saW51eC91bndpbmQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc2MDg2MC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L3Vud2luZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotI2lmbmRlZiBfTElOVVhfVU5XSU5EX0gKLSNkZWZpbmUgX0xJTlVYX1VOV0lORF9ICi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNiBOb3ZlbGwsIEluYy4KLSAqCUphbiBCZXVsaWNoIDxqYmV1bGljaEBub3ZlbGwuY29tPgotICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHZlcnNpb24gMiBvZiB0aGUgR05VIEdQTC4KLSAqCi0gKiBBIHNpbXBsZSBBUEkgZm9yIHVud2luZGluZyBrZXJuZWwgc3RhY2tzLiAgVGhpcyBpcyB1c2VkIGZvcgotICogZGVidWdnaW5nIGFuZCBlcnJvciByZXBvcnRpbmcgcHVycG9zZXMuICBUaGUga2VybmVsIGRvZXNuJ3QgbmVlZAotICogZnVsbC1ibG93biBzdGFjayB1bndpbmRpbmcgd2l0aCBhbGwgdGhlIGJlbGxzIGFuZCB3aGlzdGxlcywgc28gdGhlcmUKLSAqIGlzIG5vdCBtdWNoIHBvaW50IGluIGltcGxlbWVudGluZyB0aGUgZnVsbCBEd2FyZjIgdW53aW5kIEFQSS4KLSAqLwotCi1zdHJ1Y3QgbW9kdWxlOwotCi1zdHJ1Y3QgdW53aW5kX2ZyYW1lX2luZm8ge307Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB1bndpbmRfaW5pdCh2b2lkKSB7fQotc3RhdGljIGlubGluZSB2b2lkIHVud2luZF9zZXR1cCh2b2lkKSB7fQotCi0jaWZkZWYgQ09ORklHX01PRFVMRVMKLQotc3RhdGljIGlubGluZSB2b2lkICp1bndpbmRfYWRkX3RhYmxlKHN0cnVjdCBtb2R1bGUgKm1vZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICp0YWJsZV9zdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHRhYmxlX3NpemUpCi17Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB1bndpbmRfcmVtb3ZlX3RhYmxlKHZvaWQgKmhhbmRsZSwgaW50IGluaXRfb25seSkKLXsKLX0KLQotI2VuZGlmCi0KLXN0YXRpYyBpbmxpbmUgaW50IHVud2luZF9pbml0X2ZyYW1lX2luZm8oc3RydWN0IHVud2luZF9mcmFtZV9pbmZvICppbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JcmV0dXJuIC1FTk9TWVM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHVud2luZF9pbml0X2Jsb2NrZWQoc3RydWN0IHVud2luZF9mcmFtZV9pbmZvICppbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKLXsKLQlyZXR1cm4gLUVOT1NZUzsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgdW53aW5kX2luaXRfcnVubmluZyhzdHJ1Y3QgdW53aW5kX2ZyYW1lX2luZm8gKmluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzbWxpbmthZ2UgaW50ICgqY2IpKHN0cnVjdCB1bndpbmRfZnJhbWVfaW5mbyAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmcpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmcpCi17Ci0JcmV0dXJuIC1FTk9TWVM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHVud2luZChzdHJ1Y3QgdW53aW5kX2ZyYW1lX2luZm8gKmluZm8pCi17Ci0JcmV0dXJuIC1FTk9TWVM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHVud2luZF90b191c2VyKHN0cnVjdCB1bndpbmRfZnJhbWVfaW5mbyAqaW5mbykKLXsKLQlyZXR1cm4gLUVOT1NZUzsKLX0KLQotI2VuZGlmIC8qIF9MSU5VWF9VTldJTkRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IuaCBiL2luY2x1ZGUvbGludXgvdXNiLmgKaW5kZXggZjcyYWE1MS4uODVlZTliZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2IuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi5oCkBAIC0xMDgsNiArMTA4LDcgQEAKICAqCShpbiBwcm9iZSgpKSwgYm91bmQgdG8gYSBkcml2ZXIsIG9yIHVuYmluZGluZyAoaW4gZGlzY29ubmVjdCgpKQogICogQGlzX2FjdGl2ZTogZmxhZyBzZXQgd2hlbiB0aGUgaW50ZXJmYWNlIGlzIGJvdW5kIGFuZCBub3Qgc3VzcGVuZGVkLgogICogQHN5c2ZzX2ZpbGVzX2NyZWF0ZWQ6IHN5c2ZzIGF0dHJpYnV0ZXMgZXhpc3QKKyAqIEBlcF9kZXZzX2NyZWF0ZWQ6IGVuZHBvaW50IGNoaWxkIHBzZXVkby1kZXZpY2VzIGV4aXN0CiAgKiBAdW5yZWdpc3RlcmluZzogZmxhZyBzZXQgd2hlbiB0aGUgaW50ZXJmYWNlIGlzIGJlaW5nIHVucmVnaXN0ZXJlZAogICogQG5lZWRzX3JlbW90ZV93YWtldXA6IGZsYWcgc2V0IHdoZW4gdGhlIGRyaXZlciByZXF1aXJlcyByZW1vdGUtd2FrZXVwCiAgKgljYXBhYmlsaXR5IGR1cmluZyBhdXRvc3VzcGVuZC4KQEAgLTEyMCw2ICsxMjEsMTEgQEAKICAqCXRvIHRoZSBzeXNmcyByZXByZXNlbnRhdGlvbiBmb3IgdGhhdCBkZXZpY2UuCiAgKiBAcG1fdXNhZ2VfY250OiBQTSB1c2FnZSBjb3VudGVyIGZvciB0aGlzIGludGVyZmFjZTsgYXV0b3N1c3BlbmQgaXMgbm90CiAgKglhbGxvd2VkIHVubGVzcyB0aGUgY291bnRlciBpcyAwLgorICogQHJlc2V0X3dzOiBVc2VkIGZvciBzY2hlZHVsaW5nIHJlc2V0cyBmcm9tIGF0b21pYyBjb250ZXh0LgorICogQHJlc2V0X3J1bm5pbmc6IHNldCB0byAxIGlmIHRoZSBpbnRlcmZhY2UgaXMgY3VycmVudGx5IHJ1bm5pbmcgYQorICogICAgICBxdWV1ZWQgcmVzZXQgc28gdGhhdCB1c2JfY2FuY2VsX3F1ZXVlZF9yZXNldCgpIGRvZXNuJ3QgdHJ5IHRvCisgKiAgICAgIHJlbW92ZSBmcm9tIHRoZSB3b3JrcXVldWUgd2hlbiBydW5uaW5nIGluc2lkZSB0aGUgd29ya2VyCisgKiAgICAgIHRocmVhZC4gU2VlIF9fdXNiX3F1ZXVlX3Jlc2V0X2RldmljZSgpLgogICoKICAqIFVTQiBkZXZpY2UgZHJpdmVycyBhdHRhY2ggdG8gaW50ZXJmYWNlcyBvbiBhIHBoeXNpY2FsIGRldmljZS4gIEVhY2gKICAqIGludGVyZmFjZSBlbmNhcHN1bGF0ZXMgYSBzaW5nbGUgaGlnaCBsZXZlbCBmdW5jdGlvbiwgc3VjaCBhcyBmZWVkaW5nCkBAIC0xNjQsMTQgKzE3MCwxNyBAQAogCWVudW0gdXNiX2ludGVyZmFjZV9jb25kaXRpb24gY29uZGl0aW9uOwkJLyogc3RhdGUgb2YgYmluZGluZyAqLwogCXVuc2lnbmVkIGlzX2FjdGl2ZToxOwkJLyogdGhlIGludGVyZmFjZSBpcyBub3Qgc3VzcGVuZGVkICovCiAJdW5zaWduZWQgc3lzZnNfZmlsZXNfY3JlYXRlZDoxOwkvKiB0aGUgc3lzZnMgYXR0cmlidXRlcyBleGlzdCAqLworCXVuc2lnbmVkIGVwX2RldnNfY3JlYXRlZDoxOwkvKiBlbmRwb2ludCAiZGV2aWNlcyIgZXhpc3QgKi8KIAl1bnNpZ25lZCB1bnJlZ2lzdGVyaW5nOjE7CS8qIHVucmVnaXN0cmF0aW9uIGlzIGluIHByb2dyZXNzICovCiAJdW5zaWduZWQgbmVlZHNfcmVtb3RlX3dha2V1cDoxOwkvKiBkcml2ZXIgcmVxdWlyZXMgcmVtb3RlIHdha2V1cCAqLwogCXVuc2lnbmVkIG5lZWRzX2FsdHNldHRpbmcwOjE7CS8qIHN3aXRjaCB0byBhbHRzZXR0aW5nIDAgaXMgcGVuZGluZyAqLwogCXVuc2lnbmVkIG5lZWRzX2JpbmRpbmc6MTsJLyogbmVlZHMgZGVsYXllZCB1bmJpbmQvcmViaW5kICovCisJdW5zaWduZWQgcmVzZXRfcnVubmluZzoxOwogCiAJc3RydWN0IGRldmljZSBkZXY7CQkvKiBpbnRlcmZhY2Ugc3BlY2lmaWMgZGV2aWNlIGluZm8gKi8KIAlzdHJ1Y3QgZGV2aWNlICp1c2JfZGV2OwogCWludCBwbV91c2FnZV9jbnQ7CQkvKiB1c2FnZSBjb3VudGVyIGZvciBhdXRvc3VzcGVuZCAqLworCXN0cnVjdCB3b3JrX3N0cnVjdCByZXNldF93czsJLyogZm9yIHJlc2V0cyBpbiBhdG9taWMgY29udGV4dCAqLwogfTsKICNkZWZpbmUJdG9fdXNiX2ludGVyZmFjZShkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IHVzYl9pbnRlcmZhY2UsIGRldikKICNkZWZpbmUJaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKSBcCkBAIC0zMjksNyArMzM4LDcgQEAKICNlbmRpZgogCXN0cnVjdCBkZXZpY2UgKmRldjsJCS8qIGRldmljZSBmb3IgdGhpcyBidXMgKi8KIAotI2lmIGRlZmluZWQoQ09ORklHX1VTQl9NT04pCisjaWYgZGVmaW5lZChDT05GSUdfVVNCX01PTikgfHwgZGVmaW5lZChDT05GSUdfVVNCX01PTl9NT0RVTEUpCiAJc3RydWN0IG1vbl9idXMgKm1vbl9idXM7CS8qIG5vbi1udWxsIHdoZW4gYXNzb2NpYXRlZCAqLwogCWludCBtb25pdG9yZWQ7CQkJLyogbm9uLXplcm8gd2hlbiBtb25pdG9yZWQgKi8KICNlbmRpZgpAQCAtMzk4LDYgKzQwNyw3IEBACiAgKiBAdXJibnVtOiBudW1iZXIgb2YgVVJCcyBzdWJtaXR0ZWQgZm9yIHRoZSB3aG9sZSBkZXZpY2UKICAqIEBhY3RpdmVfZHVyYXRpb246IHRvdGFsIHRpbWUgZGV2aWNlIGlzIG5vdCBzdXNwZW5kZWQKICAqIEBhdXRvc3VzcGVuZDogZm9yIGRlbGF5ZWQgYXV0b3N1c3BlbmRzCisgKiBAYXV0b3Jlc3VtZTogZm9yIGF1dG9yZXN1bWVzIHJlcXVlc3RlZCB3aGlsZSBpbl9pbnRlcnJ1cHQKICAqIEBwbV9tdXRleDogcHJvdGVjdHMgUE0gb3BlcmF0aW9ucwogICogQGxhc3RfYnVzeTogdGltZSBvZiBsYXN0IHVzZQogICogQGF1dG9zdXNwZW5kX2RlbGF5OiBpbiBqaWZmaWVzCkBAIC00NzYsNiArNDg2LDcgQEAKIAogI2lmZGVmIENPTkZJR19QTQogCXN0cnVjdCBkZWxheWVkX3dvcmsgYXV0b3N1c3BlbmQ7CisJc3RydWN0IHdvcmtfc3RydWN0IGF1dG9yZXN1bWU7CiAJc3RydWN0IG11dGV4IHBtX211dGV4OwogCiAJdW5zaWduZWQgbG9uZyBsYXN0X2J1c3k7CkBAIC01MDUsNiArNTE2LDcgQEAKIAogLyogVVNCIHBvcnQgcmVzZXQgZm9yIGRldmljZSByZWluaXRpYWxpemF0aW9uICovCiBleHRlcm4gaW50IHVzYl9yZXNldF9kZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCB1c2JfcXVldWVfcmVzZXRfZGV2aWNlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICpkZXYpOwogCiBleHRlcm4gc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9maW5kX2RldmljZSh1MTYgdmVuZG9yX2lkLCB1MTYgcHJvZHVjdF9pZCk7CiAKQEAgLTUxMyw2ICs1MjUsOCBAQAogZXh0ZXJuIGludCB1c2JfYXV0b3BtX3NldF9pbnRlcmZhY2Uoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOwogZXh0ZXJuIGludCB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2Uoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOwogZXh0ZXJuIHZvaWQgdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKK2V4dGVybiBpbnQgdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlX2FzeW5jKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKK2V4dGVybiB2b2lkIHVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZV9hc3luYyhzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB1c2JfYXV0b3BtX2VuYWJsZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKQEAgLTUzOSw4ICs1NTMsMTMgQEAKIHN0YXRpYyBpbmxpbmUgaW50IHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsgcmV0dXJuIDA7IH0KIAorc3RhdGljIGlubGluZSBpbnQgdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlX2FzeW5jKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreyByZXR1cm4gMDsgfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlX2FzeW5jKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgdXNiX2F1dG9wbV9lbmFibGUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCB1c2JfYXV0b3BtX2Rpc2FibGUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCkBAIC0xMDUwLDcgKzEwNjksNyBAQAogCXZvaWQgKCpkaXNjb25uZWN0KSAoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpOwogCiAJaW50ICgqc3VzcGVuZCkgKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBwbV9tZXNzYWdlX3QgbWVzc2FnZSk7Ci0JaW50ICgqcmVzdW1lKSAoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpOworCWludCAoKnJlc3VtZSkgKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBwbV9tZXNzYWdlX3QgbWVzc2FnZSk7CiAJc3RydWN0IHVzYmRydl93cmFwIGRydndyYXA7CiAJdW5zaWduZWQgaW50IHN1cHBvcnRzX2F1dG9zdXNwZW5kOjE7CiB9OwpAQCAtMTMyMSw3ICsxMzQwLDcgQEAKIAlzdHJ1Y3Qga3JlZiBrcmVmOwkJLyogcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBVUkIgKi8KIAl2b2lkICpoY3ByaXY7CQkJLyogcHJpdmF0ZSBkYXRhIGZvciBob3N0IGNvbnRyb2xsZXIgKi8KIAlhdG9taWNfdCB1c2VfY291bnQ7CQkvKiBjb25jdXJyZW50IHN1Ym1pc3Npb25zIGNvdW50ZXIgKi8KLQl1OCByZWplY3Q7CQkJLyogc3VibWlzc2lvbnMgd2lsbCBmYWlsICovCisJYXRvbWljX3QgcmVqZWN0OwkJLyogc3VibWlzc2lvbnMgd2lsbCBmYWlsICovCiAJaW50IHVubGlua2VkOwkJCS8qIHVubGluayBlcnJvciBjb2RlICovCiAKIAkvKiBwdWJsaWM6IGRvY3VtZW50ZWQgZmllbGRzIGluIHRoZSB1cmIgdGhhdCBjYW4gYmUgdXNlZCBieSBkcml2ZXJzICovCkBAIC0xNDY2LDYgKzE0ODUsNyBAQAogZXh0ZXJuIHZvaWQgdXNiX3VucG9pc29uX3VyYihzdHJ1Y3QgdXJiICp1cmIpOwogZXh0ZXJuIHZvaWQgdXNiX2tpbGxfYW5jaG9yZWRfdXJicyhzdHJ1Y3QgdXNiX2FuY2hvciAqYW5jaG9yKTsKIGV4dGVybiB2b2lkIHVzYl9wb2lzb25fYW5jaG9yZWRfdXJicyhzdHJ1Y3QgdXNiX2FuY2hvciAqYW5jaG9yKTsKK2V4dGVybiB2b2lkIHVzYl91bnBvaXNvbl9hbmNob3JlZF91cmJzKHN0cnVjdCB1c2JfYW5jaG9yICphbmNob3IpOwogZXh0ZXJuIHZvaWQgdXNiX3VubGlua19hbmNob3JlZF91cmJzKHN0cnVjdCB1c2JfYW5jaG9yICphbmNob3IpOwogZXh0ZXJuIHZvaWQgdXNiX2FuY2hvcl91cmIoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgdXNiX2FuY2hvciAqYW5jaG9yKTsKIGV4dGVybiB2b2lkIHVzYl91bmFuY2hvcl91cmIoc3RydWN0IHVyYiAqdXJiKTsKQEAgLTE3MjIsMTAgKzE3NDIsNiBAQAogCiAjZGVmaW5lIGVycihmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fRVJSIEtCVUlMRF9NT0ROQU1FICI6ICIgXAogCWZvcm1hdCAiXG4iICwgIyMgYXJnKQotI2RlZmluZSBpbmZvKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9JTkZPIEtCVUlMRF9NT0ROQU1FICI6ICIgXAotCWZvcm1hdCAiXG4iICwgIyMgYXJnKQotI2RlZmluZSB3YXJuKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9XQVJOSU5HIEtCVUlMRF9NT0ROQU1FICI6ICIgXAotCWZvcm1hdCAiXG4iICwgIyMgYXJnKQogCiAjZW5kaWYgIC8qIF9fS0VSTkVMX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IvYXNzb2NpYXRpb24uaCBiL2luY2x1ZGUvbGludXgvdXNiL2Fzc29jaWF0aW9uLmgKaW5kZXggMDdjNWUzYy4uMGE0YTE4YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2IvYXNzb2NpYXRpb24uaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9hc3NvY2lhdGlvbi5oCkBAIC0yOCwxNyArMjgsMTcgQEAKIH07CiAKIC8qIERpZmZlcmVudCBmaWVsZHMgZGVmaW5lZCBieSB0aGUgc3BlYyAqLwotI2RlZmluZSBXVVNCX0FSX0Fzc29jaWF0aW9uVHlwZUlkCXsgLmlkID0gMHgwMDAwLCAubGVuID0gIDIgfQotI2RlZmluZSBXVVNCX0FSX0Fzc29jaWF0aW9uU3ViVHlwZUlkCXsgLmlkID0gMHgwMDAxLCAubGVuID0gIDIgfQotI2RlZmluZSBXVVNCX0FSX0xlbmd0aAkJCXsgLmlkID0gMHgwMDAyLCAubGVuID0gIDQgfQotI2RlZmluZSBXVVNCX0FSX0Fzc29jaWF0aW9uU3RhdHVzCXsgLmlkID0gMHgwMDA0LCAubGVuID0gIDQgfQotI2RlZmluZSBXVVNCX0FSX0xhbmdJRAkJCXsgLmlkID0gMHgwMDA4LCAubGVuID0gIDIgfQotI2RlZmluZSBXVVNCX0FSX0RldmljZUZyaWVuZGx5TmFtZQl7IC5pZCA9IDB4MDAwYiwgLmxlbiA9IDY0IH0gLyogbWF4ICovCi0jZGVmaW5lIFdVU0JfQVJfSG9zdEZyaWVuZGx5TmFtZQl7IC5pZCA9IDB4MDAwYywgLmxlbiA9IDY0IH0gLyogbWF4ICovCi0jZGVmaW5lIFdVU0JfQVJfQ0hJRAkJCXsgLmlkID0gMHgxMDAwLCAubGVuID0gMTYgfQotI2RlZmluZSBXVVNCX0FSX0NESUQJCQl7IC5pZCA9IDB4MTAwMSwgLmxlbiA9IDE2IH0KLSNkZWZpbmUgV1VTQl9BUl9Db25uZWN0aW9uQ29udGV4dAl7IC5pZCA9IDB4MTAwMiwgLmxlbiA9IDQ4IH0KLSNkZWZpbmUgV1VTQl9BUl9CYW5kR3JvdXBzCQl7IC5pZCA9IDB4MTAwNCwgLmxlbiA9ICAyIH0KKyNkZWZpbmUgV1VTQl9BUl9Bc3NvY2lhdGlvblR5cGVJZAl7IC5pZCA9IGNwdV90b19sZTE2KDB4MDAwMCksIC5sZW4gPSBjcHVfdG9fbGUxNigyKSB9CisjZGVmaW5lIFdVU0JfQVJfQXNzb2NpYXRpb25TdWJUeXBlSWQJeyAuaWQgPSBjcHVfdG9fbGUxNigweDAwMDEpLCAubGVuID0gY3B1X3RvX2xlMTYoMikgfQorI2RlZmluZSBXVVNCX0FSX0xlbmd0aAkJCXsgLmlkID0gY3B1X3RvX2xlMTYoMHgwMDAyKSwgLmxlbiA9IGNwdV90b19sZTE2KDQpIH0KKyNkZWZpbmUgV1VTQl9BUl9Bc3NvY2lhdGlvblN0YXR1cwl7IC5pZCA9IGNwdV90b19sZTE2KDB4MDAwNCksIC5sZW4gPSBjcHVfdG9fbGUxNig0KSB9CisjZGVmaW5lIFdVU0JfQVJfTGFuZ0lECQkJeyAuaWQgPSBjcHVfdG9fbGUxNigweDAwMDgpLCAubGVuID0gY3B1X3RvX2xlMTYoMikgfQorI2RlZmluZSBXVVNCX0FSX0RldmljZUZyaWVuZGx5TmFtZQl7IC5pZCA9IGNwdV90b19sZTE2KDB4MDAwYiksIC5sZW4gPSBjcHVfdG9fbGUxNig2NCkgfSAvKiBtYXggKi8KKyNkZWZpbmUgV1VTQl9BUl9Ib3N0RnJpZW5kbHlOYW1lCXsgLmlkID0gY3B1X3RvX2xlMTYoMHgwMDBjKSwgLmxlbiA9IGNwdV90b19sZTE2KDY0KSB9IC8qIG1heCAqLworI2RlZmluZSBXVVNCX0FSX0NISUQJCQl7IC5pZCA9IGNwdV90b19sZTE2KDB4MTAwMCksIC5sZW4gPSBjcHVfdG9fbGUxNigxNikgfQorI2RlZmluZSBXVVNCX0FSX0NESUQJCQl7IC5pZCA9IGNwdV90b19sZTE2KDB4MTAwMSksIC5sZW4gPSBjcHVfdG9fbGUxNigxNikgfQorI2RlZmluZSBXVVNCX0FSX0Nvbm5lY3Rpb25Db250ZXh0CXsgLmlkID0gY3B1X3RvX2xlMTYoMHgxMDAyKSwgLmxlbiA9IGNwdV90b19sZTE2KDQ4KSB9CisjZGVmaW5lIFdVU0JfQVJfQmFuZEdyb3VwcwkJeyAuaWQgPSBjcHVfdG9fbGUxNigweDEwMDQpLCAubGVuID0gY3B1X3RvX2xlMTYoMikgfQogCiAvKiBDQkFGIENvbnRyb2wgUmVxdWVzdHMgKEFNUzEuMFtUNC0xXSAqLwogZW51bSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi9ncGlvX3ZidXMuaCBiL2luY2x1ZGUvbGludXgvdXNiL2dwaW9fdmJ1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZjAzY2MKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9ncGlvX3ZidXMuaApAQCAtMCwwICsxLDMwIEBACisvKgorICogQSBzaW1wbGUgR1BJTyBWQlVTIHNlbnNpbmcgZHJpdmVyIGZvciBCIHBlcmlwaGVyYWwgb25seSBkZXZpY2VzCisgKiB3aXRoIGludGVybmFsIHRyYW5zY2VpdmVycy4KKyAqIE9wdGlvbmFsbHkgRCsgcHVsbHVwIGNhbiBiZSBjb250cm9sbGVkIGJ5IGEgc2Vjb25kIEdQSU8uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFBoaWxpcHAgWmFiZWwgPHBoaWxpcHAuemFiZWxAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKy8qKgorICogc3RydWN0IGdwaW9fdmJ1c19tYWNoX2luZm8gLSBjb25maWd1cmF0aW9uIGZvciBncGlvX3ZidXMKKyAqIEBncGlvX3ZidXM6IFZCVVMgc2Vuc2luZyBHUElPCisgKiBAZ3Bpb19wdWxsdXA6IG9wdGlvbmFsIEQrIG9yIEQtIHB1bGx1cCBHUElPIChlbHNlIG5lZ2F0aXZlL2ludmFsaWQpCisgKiBAZ3Bpb192YnVzX2ludmVydGVkOiB0cnVlIGlmIGdwaW9fdmJ1cyBpcyBhY3RpdmUgbG93CisgKiBAZ3Bpb19wdWxsdXBfaW52ZXJ0ZWQ6IHRydWUgaWYgZ3Bpb19wdWxsdXAgaXMgYWN0aXZlIGxvdworICoKKyAqIFRoZSBWQlVTIHNlbnNpbmcgR1BJTyBzaG91bGQgaGF2ZSBhIHB1bGxkb3duLCB3aGljaCB3aWxsIG5vcm1hbGx5IGJlCisgKiBwYXJ0IG9mIGEgcmVzaXN0b3IgbGFkZGVyIHR1cm5pbmcgYSA0LjBWLTUuMjVWIGxldmVsIG9uIFZCVVMgaW50byBhCisgKiB2YWx1ZSB0aGUgR1BJTyBkZXRlY3RzIGFzIGFjdGl2ZS4gIFNvbWUgc3lzdGVtcyB3aWxsIHVzZSBjb21wYXJhdG9ycy4KKyAqLworc3RydWN0IGdwaW9fdmJ1c19tYWNoX2luZm8geworCWludCBncGlvX3ZidXM7CisJaW50IGdwaW9fcHVsbHVwOworCWJvb2wgZ3Bpb192YnVzX2ludmVydGVkOworCWJvb2wgZ3Bpb19wdWxsdXBfaW52ZXJ0ZWQ7Cit9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IvbXVzYi5oIGIvaW5jbHVkZS9saW51eC91c2IvbXVzYi5oCmluZGV4IDYzMDk2MmMuLmQ2YWFkMGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiL211c2IuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9tdXNiLmgKQEAgLTQ3LDYgKzQ3LDExIEBACiAJdTgJCXJhbV9iaXRzOwkvKiByYW0gYWRkcmVzcyBzaXplICovCiAKIAlzdHJ1Y3QgbXVzYl9oZHJjX2Vwc19iaXRzICplcHNfYml0czsKKyNpZmRlZiBDT05GSUdfQkxBQ0tGSU4KKyAgICAgICAgLyogQSBHUElPIGNvbnRyb2xsaW5nIFZSU0VMIGluIEJsYWNrZmluICovCisgICAgICAgIHVuc2lnbmVkIGludCAgICBncGlvX3Zyc2VsOworI2VuZGlmCisKIH07CiAKIHN0cnVjdCBtdXNiX2hkcmNfcGxhdGZvcm1fZGF0YSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi9vdGcuaCBiL2luY2x1ZGUvbGludXgvdXNiL290Zy5oCmluZGV4IDFkYjI1ZDEuLjk0ZGY0ZmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiL290Zy5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiL290Zy5oCkBAIC04NCw2ICs4NCw3IEBACiAKIC8qIGZvciB1c2IgaG9zdCBhbmQgcGVyaXBoZXJhbCBjb250cm9sbGVyIGRyaXZlcnMgKi8KIGV4dGVybiBzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyICpvdGdfZ2V0X3RyYW5zY2VpdmVyKHZvaWQpOworZXh0ZXJuIHZvaWQgb3RnX3B1dF90cmFuc2NlaXZlcihzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyICopOwogCiBzdGF0aWMgaW5saW5lIGludAogb3RnX3N0YXJ0X2hucChzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyICpvdGcpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYl91c3VhbC5oIGIvaW5jbHVkZS9saW51eC91c2JfdXN1YWwuaAppbmRleCBkOWEzYmJlLi4xZWVhMWFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYl91c3VhbC5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiX3VzdWFsLmgKQEAgLTUyLDggKzUyLDExIEBACiAJVVNfRkxBRyhNQVhfU0VDVE9SU19NSU4sMHgwMDAwMjAwMCkJCQlcCiAJCS8qIFNldHMgbWF4X3NlY3RvcnMgdG8gYXJjaCBtaW4gKi8JCVwKIAlVU19GTEFHKEJVTEtfSUdOT1JFX1RBRywweDAwMDA0MDAwKQkJCVwKLQkJLyogSWdub3JlIHRhZyBtaXNtYXRjaCBpbiBidWxrIG9wZXJhdGlvbnMgKi8KLQorCQkvKiBJZ25vcmUgdGFnIG1pc21hdGNoIGluIGJ1bGsgb3BlcmF0aW9ucyAqLyAgICBcCisJVVNfRkxBRyhTQU5FX1NFTlNFLCAgICAgMHgwMDAwODAwMCkJCQlcCisJCS8qIFNhbmUgU2Vuc2UgKD4gMTggYnl0ZXMpICovCQkJXAorCVVTX0ZMQUcoQ0FQQUNJVFlfT0ssCTB4MDAwMTAwMDApCQkJXAorCQkvKiBSRUFEIENBUEFDSVRZIHJlc3BvbnNlIGlzIGNvcnJlY3QgKi8KIAogI2RlZmluZSBVU19GTEFHKG5hbWUsIHZhbHVlKQlVU19GTF8jI25hbWUgPSB2YWx1ZSAsCiBlbnVtIHsgVVNfRE9fQUxMX0ZMQUdTIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZtYWxsb2MuaCBiL2luY2x1ZGUvbGludXgvdm1hbGxvYy5oCmluZGV4IDMwN2I4ODUuLjUwNmU3NjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdm1hbGxvYy5oCisrKyBiL2luY2x1ZGUvbGludXgvdm1hbGxvYy5oCkBAIC05Nyw2ICs5NywxMCBAQAogZXh0ZXJuIHN0cnVjdCB2bV9zdHJ1Y3QgKmFsbG9jX3ZtX2FyZWEoc2l6ZV90IHNpemUpOwogZXh0ZXJuIHZvaWQgZnJlZV92bV9hcmVhKHN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWEpOwogCisvKiBmb3IgL2Rldi9rbWVtICovCitleHRlcm4gbG9uZyB2cmVhZChjaGFyICpidWYsIGNoYXIgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOworZXh0ZXJuIGxvbmcgdndyaXRlKGNoYXIgKmJ1ZiwgY2hhciAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCk7CisKIC8qCiAgKglJbnRlcm5hbHMuICBEb250J3QgdXNlLi4KICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC93aW1heC5oIGIvaW5jbHVkZS9saW51eC93aW1heC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4OWRlN2YKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3dpbWF4LmgKQEAgLTAsMCArMSwyMzQgQEAKKy8qCisgKiBMaW51eCBXaU1heAorICogQVBJIGZvciB1c2VyIHNwYWNlCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqCisgKiBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqICAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqCisgKgorICogVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSB1c2VyL2tlcm5lbCBwcm90b2NvbCB0aGF0IGlzIHNwb2tlbiBvdmVyCisgKiBHZW5lcmljIE5ldGxpbmssIGFzIHdlbGwgYXMgYW55IHR5cGUgZGVjbGFyYXRpb24gdGhhdCBpcyB0byBiZSB1c2VkCisgKiBieSBrZXJuZWwgYW5kIHVzZXIgc3BhY2UuCisgKgorICogSXQgaXMgaW50ZW5kZWQgZm9yIHVzZXIgc3BhY2UgdG8gY2xvbmUgaXQgdmVyYmF0aW0gdG8gdXNlIGl0IGFzIGEKKyAqIHByaW1hcnkgcmVmZXJlbmNlIGZvciBkZWZpbml0aW9ucy4KKyAqCisgKiBTdHVmZiBpbnRlbmRlZCBmb3Iga2VybmVsIHVzYWdlIGFzIHdlbGwgYXMgZnVsbCBwcm90b2NvbCBhbmQgc3RhY2sKKyAqIGRvY3VtZW50YXRpb24gaXMgcm9vdGVkIGluIGluY2x1ZGUvbmV0L3dpbWF4LmguCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX19XSU1BWF9IX18KKyNkZWZpbmUgX19MSU5VWF9fV0lNQVhfSF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitlbnVtIHsKKwkvKioKKwkgKiBWZXJzaW9uIG9mIHRoZSBpbnRlcmZhY2UgKHVuc2lnbmVkIGRlY2ltYWwsIE1NbSwgbWF4IDI1LjUpCisJICogTSAtIE1ham9yOiBjaGFuZ2UgaWYgcmVtb3Zpbmcgb3IgbW9kaWZ5aW5nIGFuIGV4aXN0aW5nIGNhbGwuCisJICogbSAtIG1pbm9yOiBjaGFuZ2Ugd2hlbiBhZGRpbmcgYSBuZXcgY2FsbAorCSAqLworCVdJTUFYX0dOTF9WRVJTSU9OID0gMDAsCisJLyogR2VuZXJpYyBOZXRMaW5rIGF0dHJpYnV0ZXMgKi8KKwlXSU1BWF9HTkxfQVRUUl9JTlZBTElEID0gMHgwMCwKKwlXSU1BWF9HTkxfQVRUUl9NQVggPSAxMCwKK307CisKKworLyoKKyAqIEdlbmVyaWMgTmV0TGluayBvcGVyYXRpb25zCisgKgorICogTW9zdCBvZiB0aGVzZSBtYXAgdG8gYW4gQVBJIGNhbGw7IF9PUF8gc3RhbmRzIGZvciBvcGVyYXRpb24sIF9SUF8KKyAqIGZvciByZXBseSBhbmQgX1JFXyBmb3IgcmVwb3J0IChha2E6IHNpZ25hbCkuCisgKi8KK2VudW0geworCVdJTUFYX0dOTF9PUF9NU0dfRlJPTV9VU0VSLAkvKiBVc2VyIHRvIGtlcm5lbCBtZXNzYWdlICovCisJV0lNQVhfR05MX09QX01TR19UT19VU0VSLAkvKiBLZXJuZWwgdG8gdXNlciBtZXNzYWdlICovCisJV0lNQVhfR05MX09QX1JGS0lMTCwJLyogUnVuIHdpbWF4X3Jma2lsbCgpICovCisJV0lNQVhfR05MX09QX1JFU0VULAkvKiBSdW4gd2ltYXhfcmZraWxsKCkgKi8KKwlXSU1BWF9HTkxfUkVfU1RBVEVfQ0hBTkdFLAkvKiBSZXBvcnQ6IHN0YXR1cyBjaGFuZ2UgKi8KK307CisKKworLyogTWVzc2FnZSBmcm9tIHVzZXIgLyB0byB1c2VyICovCitlbnVtIHsKKwlXSU1BWF9HTkxfTVNHX0lGSURYID0gMSwKKwlXSU1BWF9HTkxfTVNHX1BJUEVfTkFNRSwKKwlXSU1BWF9HTkxfTVNHX0RBVEEsCit9OworCisKKy8qCisgKiB3aW1heF9yZmtpbGwoKQorICoKKyAqIFRoZSBzdGF0ZSBvZiB0aGUgcmFkaW8gKE9OL09GRikgaXMgbWFwcGVkIHRvIHRoZSByZmtpbGwgc3Vic3lzdGVtJ3MKKyAqIHN3aXRjaCBzdGF0ZSAoRElTQUJMRUQvRU5BQkxFRCkuCisgKi8KK2VudW0gd2ltYXhfcmZfc3RhdGUgeworCVdJTUFYX1JGX09GRiA9IDAsCS8qIFJhZGlvIGlzIG9mZiwgcmZraWxsIG9uL2VuYWJsZWQgKi8KKwlXSU1BWF9SRl9PTiA9IDEsCS8qIFJhZGlvIGlzIG9uLCByZmtpbGwgb2ZmL2Rpc2FibGVkICovCisJV0lNQVhfUkZfUVVFUlkgPSAyLAorfTsKKworLyogQXR0cmlidXRlcyAqLworZW51bSB7CisJV0lNQVhfR05MX1JGS0lMTF9JRklEWCA9IDEsCisJV0lNQVhfR05MX1JGS0lMTF9TVEFURSwKK307CisKKworLyogQXR0cmlidXRlcyBmb3Igd2ltYXhfcmVzZXQoKSAqLworZW51bSB7CisJV0lNQVhfR05MX1JFU0VUX0lGSURYID0gMSwKK307CisKKworLyoKKyAqIEF0dHJpYnV0ZXMgZm9yIHRoZSBSZXBvcnQgU3RhdGUgQ2hhbmdlCisgKgorICogRm9yIG5vdyB3ZSBqdXN0IGhhdmUgdGhlIG9sZCBhbmQgbmV3IHN0YXRlczsgbmV3IGF0dHJpYnV0ZXMgbWlnaHQKKyAqIGJlIGFkZGVkIGxhdGVyIG9uLgorICovCitlbnVtIHsKKwlXSU1BWF9HTkxfU1RDSF9JRklEWCA9IDEsCisJV0lNQVhfR05MX1NUQ0hfU1RBVEVfT0xELAorCVdJTUFYX0dOTF9TVENIX1NUQVRFX05FVywKK307CisKKworLyoqCisgKiBlbnVtIHdpbWF4X3N0IC0gVGhlIGRpZmZlcmVudCBzdGF0ZXMgb2YgYSBXaU1BWCBkZXZpY2UKKyAqIEBfX1dJTUFYX1NUX05VTEw6IFRoZSBkZXZpY2Ugc3RydWN0dXJlIGhhcyBiZWVuIGFsbG9jYXRlZCBhbmQgemVyb2VkLAorICogICAgIGJ1dCBzdGlsbCB3aW1heF9kZXZfYWRkKCkgaGFzbid0IGJlZW4gY2FsbGVkLiBUaGVyZSBpcyBubyBzdGF0ZS4KKyAqCisgKiBAV0lNQVhfU1RfRE9XTjogVGhlIGRldmljZSBoYXMgYmVlbiByZWdpc3RlcmVkIHdpdGggdGhlIFdpTUFYIGFuZAorICogICAgIG5ldHdvcmtpbmcgc3RhY2tzLCBidXQgaXQgaXMgbm90IGluaXRpYWxpemVkIChub3JtYWxseSB0aGF0IGlzCisgKiAgICAgZG9uZSB3aXRoICdpZmNvbmZpZyBERVYgdXAnIFtvciBlcXVpdmFsZW50XSwgd2hpY2ggY2FuIHVwbG9hZAorICogICAgIGZpcm13YXJlIGFuZCBlbmFibGUgY29tbXVuaWNhdGlvbnMgd2l0aCB0aGUgZGV2aWNlKS4KKyAqICAgICBJbiB0aGlzIHN0YXRlLCB0aGUgZGV2aWNlIGlzIHBvd2VyZWQgZG93biBhbmQgdXNpbmcgYXMgbGVzcworICogICAgIHBvd2VyIGFzIHBvc3NpYmxlLgorICogICAgIFRoaXMgc3RhdGUgaXMgdGhlIGRlZmF1bHQgYWZ0ZXIgYSBjYWxsIHRvIHdpbWF4X2Rldl9hZGQoKS4gSXQKKyAqICAgICBpcyBvayB0byBoYXZlIGRyaXZlcnMgbW92ZSBkaXJlY3RseSB0byAlV0lNQVhfU1RfVU5JTklUSUFMSVpFRAorICogICAgIG9yICVXSU1BWF9TVF9SQURJT19PRkYgaW4gX3Byb2JlKCkgYWZ0ZXIgdGhlIGNhbGwgdG8KKyAqICAgICB3aW1heF9kZXZfYWRkKCkuCisgKiAgICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGUgZHJpdmVyIGxlYXZlcyB0aGlzIHN0YXRlIHdoZW4KKyAqICAgICBjYWxsaW5nICdpZmNvbmZpZyBERVYgdXAnIGFuZCBlbnRlcnMgaXQgYmFjayBvbiAnaWZjb25maWcgREVWCisgKiAgICAgZG93bicuCisgKgorICogQF9fV0lNQVhfU1RfUVVJRVNDSU5HOiBUaGUgZGV2aWNlIGlzIGJlaW5nIHRvcm4gZG93biwgc28gbm8gQVBJCisgKiAgICAgb3BlcmF0aW9ucyBhcmUgYWxsb3dlZCB0byBwcm9jZWVkIGV4Y2VwdCB0aGUgb25lcyBuZWVkZWQgdG8KKyAqICAgICBjb21wbGV0ZSB0aGUgZGV2aWNlIGNsZWFuIHVwIHByb2Nlc3MuCisgKgorICogQFdJTUFYX1NUX1VOSU5JVElBTElaRUQ6IFtvcHRpb25hbF0gQ29tbXVuaWNhdGlvbiB3aXRoIHRoZSBkZXZpY2UKKyAqICAgICBpcyBzZXR1cCwgYnV0IHRoZSBkZXZpY2Ugc3RpbGwgcmVxdWlyZXMgc29tZSBjb25maWd1cmF0aW9uCisgKiAgICAgYmVmb3JlIGJlaW5nIG9wZXJhdGlvbmFsLgorICogICAgIFNvbWUgV2lNQVggQVBJIGNhbGxzIG1pZ2h0IHdvcmsuCisgKgorICogQFdJTUFYX1NUX1JBRElPX09GRjogVGhlIGRldmljZSBpcyBmdWxseSB1cDsgcmFkaW8gaXMgb2ZmICh3ZXRoZXIKKyAqICAgICBieSBoYXJkd2FyZSBvciBzb2Z0d2FyZSBzd2l0Y2hlcykuCisgKiAgICAgSXQgaXMgcmVjb21tZW5kZWQgdG8gYWx3YXlzIGxlYXZlIHRoZSBkZXZpY2UgaW4gdGhpcyBzdGF0ZQorICogICAgIGFmdGVyIGluaXRpYWxpemF0aW9uLgorICoKKyAqIEBXSU1BWF9TVF9SRUFEWTogVGhlIGRldmljZSBpcyBmdWxseSB1cCBhbmQgcmFkaW8gaXMgb24uCisgKgorICogQFdJTUFYX1NUX1NDQU5OSU5HOiBbb3B0aW9uYWxdIFRoZSBkZXZpY2UgaGFzIGJlZW4gaW5zdHJ1Y3RlZCB0bworICogICAgIHNjYW4uIEluIHRoaXMgc3RhdGUsIHRoZSBkZXZpY2UgY2Fubm90IGJlIGFjdGl2ZWx5IGNvbm5lY3RlZCB0bworICogICAgIGEgbmV0d29yay4KKyAqCisgKiBAV0lNQVhfU1RfQ09OTkVDVElORzogVGhlIGRldmljZSBpcyBjb25uZWN0aW5nIHRvIGEgbmV0d29yay4gVGhpcworICogICAgIHN0YXRlIGV4aXN0cyBiZWNhdXNlIGluIHNvbWUgZGV2aWNlcywgdGhlIGNvbm5lY3QgcHJvY2VzcyBjYW4KKyAqICAgICBpbmNsdWRlIGEgbnVtYmVyIG9mIG5lZ290aWF0aW9ucyBiZXR3ZWVuIHVzZXIgc3BhY2UsIGtlcm5lbAorICogICAgIHNwYWNlIGFuZCB0aGUgZGV2aWNlLiBVc2VyIHNwYWNlIG5lZWRzIHRvIGtub3cgd2hhdCB0aGUgZGV2aWNlCisgKiAgICAgaXMgZG9pbmcuIElmIHRoZSBjb25uZWN0IHNlcXVlbmNlIGluIGEgZGV2aWNlIGlzIGF0b21pYyBhbmQKKyAqICAgICBmYXN0LCB0aGUgZGV2aWNlIGNhbiB0cmFuc2l0aW9uIGRpcmVjdGx5IHRvIENPTk5FQ1RFRAorICoKKyAqIEBXSU1BWF9TVF9DT05ORUNURUQ6IFRoZSBkZXZpY2UgaXMgY29ubmVjdGVkIHRvIGEgbmV0d29yay4KKyAqCisgKiBAX19XSU1BWF9TVF9JTlZBTElEOiBUaGlzIGlzIGFuIGludmFsaWQgc3RhdGUgdXNlZCB0byBtYXJrIHRoZQorICogICAgIG1heGltdW0gbnVtZXJpYyB2YWx1ZSBvZiBzdGF0ZXMuCisgKgorICogRGVzY3JpcHRpb246CisgKgorICogVHJhbnNpdGlvbnMgZnJvbSBvbmUgc3RhdGUgdG8gYW5vdGhlciBvbmUgYXJlIGF0b21pYyBhbmQgY2FuIG9ubHkKKyAqIGJlIGNhdXNlZCBpbiBrZXJuZWwgc3BhY2Ugd2l0aCB3aW1heF9zdGF0ZV9jaGFuZ2UoKS4gVG8gcmVhZCB0aGUKKyAqIHN0YXRlLCB1c2Ugd2ltYXhfc3RhdGVfZ2V0KCkuCisgKgorICogU3RhdGVzIHN0YXJ0aW5nIHdpdGggX18gYXJlIGludGVybmFsIGFuZCBzaGFsbCBub3QgYmUgdXNlZCBvcgorICogcmVmZXJyZWQgdG8gYnkgZHJpdmVycyBvciB1c2Vyc3BhY2UuIFRoZXkgbG9vayB1Z2x5LCBidXQgdGhhdCdzIHRoZQorICogcG9pbnQgLS0gaWYgYW55IHVzZSBpcyBtYWRlIG5vbi1pbnRlcm5hbCB0byB0aGUgc3RhY2ssIGl0IGlzIGVhc2llcgorICogdG8gY2F0Y2ggb24gcmV2aWV3LgorICoKKyAqIEFsbCBBUEkgb3BlcmF0aW9ucyBbd2l0aCB3ZWxsIGRlZmluZWQgZXhjZXB0aW9uc10gd2lsbCB0YWtlIHRoZQorICogZGV2aWNlIG11dGV4IGJlZm9yZSBzdGFydGluZyBhbmQgdGhlbiBjaGVjayB0aGUgc3RhdGUuIElmIHRoZSBzdGF0ZQorICogaXMgJV9fV0lNQVhfU1RfTlVMTCwgJVdJTUFYX1NUX0RPV04sICVXSU1BWF9TVF9VTklOSVRJQUxJWkVEIG9yCisgKiAlX19XSU1BWF9TVF9RVUlFU0NJTkcsIGl0IHdpbGwgZHJvcCB0aGUgbG9jayBhbmQgcXVpdCB3aXRoCisgKiAtJUVJTlZBTCwgLSVFTk9NRURJVU0sIC0lRU5PVENPTk4gb3IgLSVFU0hVVERPV04uCisgKgorICogVGhlIG9yZGVyIG9mIHRoZSBkZWZpbml0aW9ucyBpcyBpbXBvcnRhbnQsIHNvIHdlIGNhbiBkbyBudW1lcmljYWwKKyAqIGNvbXBhcmlzb25zIChlZzogPCAlV0lNQVhfU1RfUkFESU9fT0ZGIG1lYW5zIHRoZSBkZXZpY2UgaXMgbm90IHJlYWR5CisgKiB0byBvcGVyYXRlKS4KKyAqLworLyoKKyAqIFRoZSBhbGxvd2VkIHN0YXRlIHRyYW5zaXRpb25zIGFyZSBkZXNjcmliZWQgaW4gdGhlIHRhYmxlIGJlbG93CisgKiAoc3RhdGVzIGluIHJvd3MgY2FuIGdvIHRvIHN0YXRlcyBpbiBjb2x1bW5zIHdoZXJlIHRoZXJlIGlzIGFuIFgpOgorICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOSU5JICAgUkFESU8gUkVBRFkgU0NBTiBDT05ORUMgQ09OTkVDCisgKiAgICAgICAgICAgICBOVUxMIERPV04gUVVJRVNDSU5HIFRJQUxJWkVEICBPRkYgICAgICAgIE5JTkcgIFRJTkcgICBURUQKKyAqIE5VTEwgICAgICAgICAtICAgIHgKKyAqIERPV04gICAgICAgICAgICAgIC0gICAgICB4ICAgICAgICB4ICAgICAgIHgKKyAqIFFVSUVTQ0lORyAgICAgICAgIHggICAgICAtCisgKiBVTklOSVRJQUxJWkVEICAgICAgICAgICAgeCAgICAgICAgLSAgICAgICB4CisgKiBSQURJT19PRkYgICAgICAgICAgICAgICAgeCAgICAgICAgICAgICAgICAtICAgICB4CisgKiBSRUFEWSAgICAgICAgICAgICAgICAgICAgeCAgICAgICAgICAgICAgICB4ICAgICAtICAgICB4ICAgICB4ICAgICAgeAorICogU0NBTk5JTkcgICAgICAgICAgICAgICAgIHggICAgICAgICAgICAgICAgeCAgICAgeCAgICAgLSAgICAgeCAgICAgIHgKKyAqIENPTk5FQ1RJTkcgICAgICAgICAgICAgICB4ICAgICAgICAgICAgICAgIHggICAgIHggICAgIHggICAgIC0gICAgICB4CisgKiBDT05ORUNURUQgICAgICAgICAgICAgICAgeCAgICAgICAgICAgICAgICB4ICAgICB4ICAgICAgICAgICAgICAgICAgLQorICoKKyAqIFRoaXMgdGFibGUgbm90IGF2YWlsYWJsZSBpbiBrZXJuZWwtZG9jIGJlY2F1c2UgdGhlIGZvcm1hdHRpbmcgbWVzc2VzIGl0IHVwLgorICovCisgZW51bSB3aW1heF9zdCB7CisJX19XSU1BWF9TVF9OVUxMID0gMCwKKwlXSU1BWF9TVF9ET1dOLAorCV9fV0lNQVhfU1RfUVVJRVNDSU5HLAorCVdJTUFYX1NUX1VOSU5JVElBTElaRUQsCisJV0lNQVhfU1RfUkFESU9fT0ZGLAorCVdJTUFYX1NUX1JFQURZLAorCVdJTUFYX1NUX1NDQU5OSU5HLAorCVdJTUFYX1NUX0NPTk5FQ1RJTkcsCisJV0lNQVhfU1RfQ09OTkVDVEVELAorCV9fV0lNQVhfU1RfSU5WQUxJRAkJCS8qIEFsd2F5cyBrZWVwIGxhc3QgKi8KK307CisKKworI2VuZGlmIC8qICNpZm5kZWYgX19MSU5VWF9fV0lNQVhfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3dpbWF4L0tidWlsZCBiL2luY2x1ZGUvbGludXgvd2ltYXgvS2J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYjRmMjYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3dpbWF4L0tidWlsZApAQCAtMCwwICsxIEBACitoZWFkZXIteSArPSBpMjQwMG0uaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC93aW1heC9kZWJ1Zy5oIGIvaW5jbHVkZS9saW51eC93aW1heC9kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMGM0OTMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3dpbWF4L2RlYnVnLmgKQEAgLTAsMCArMSw0NTMgQEAKKy8qCisgKiBMaW51eCBXaU1BWAorICogQ29sbGVjdGlvbiBvZiB0b29scyB0byBtYW5hZ2UgZGVidWcgb3BlcmF0aW9ucy4KKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDcgSW50ZWwgQ29ycG9yYXRpb24KKyAqIEluYWt5IFBlcmV6LUdvbnphbGV6IDxpbmFreS5wZXJlei1nb256YWxlekBpbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqCisgKiBEb24ndCAjaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHksIHJlYWQgb24hCisgKgorICoKKyAqIEVYRUNVVElORyBERUJVR0dJTkcgQUNUSU9OUyBPUiBOT1QKKyAqCisgKiBUaGUgbWFpbiB0aGluZyB0aGlzIGZyYW1ld29yayBwcm92aWRlcyBpcyBkZWNpc3Npb24gcG93ZXIgdG8gdGFrZSBhCisgKiBkZWJ1ZyBhY3Rpb24gKGxpa2UgcHJpbnRpbmcgYSBtZXNzYWdlKSBpZiB0aGUgY3VycmVudCBkZWJ1ZyBsZXZlbAorICogYWxsb3dzIGl0LgorICoKKyAqIFRoZSBkZWNpc3Npb24gcG93ZXIgaXMgYXQgdHdvIGxldmVsczogYXQgY29tcGlsZS10aW1lICh3aGF0IGRvZXMKKyAqIG5vdCBtYWtlIGl0IGlzIGNvbXBpbGVkIG91dCkgYW5kIGF0IHJ1bi10aW1lLiBUaGUgcnVuLXRpbWUKKyAqIHNlbGVjdGlvbiBpcyBkb25lIHBlci1zdWJtb2R1bGUgKGFzIHRoZXkgYXJlIGRlY2xhcmVkIGJ5IHRoZSB1c2VyCisgKiBvZiB0aGUgZnJhbWV3b3JrKS4KKyAqCisgKiBBIGNhbGwgdG8gZF90ZXN0KEwpIChMIGJlaW5nIHRoZSB0YXJnZXQgZGVidWcgbGV2ZWwpIHJldHVybnMgdHJ1ZQorICogaWYgdGhlIGFjdGlvbiBzaG91bGQgYmUgdGFrZW4gYmVjYXVzZSB0aGUgY3VycmVudCBkZWJ1ZyBsZXZlbHMKKyAqIGFsbG93IGl0IChib3RoIGNvbXBpbGUgYW5kIHJ1biB0aW1lKS4KKyAqCisgKiBJdCBmb2xsb3dzIHRoYXQgYSBjYWxsIHRvIGRfdGVzdCgpIHRoYXQgY2FuIGJlIGRldGVybWluZWQgdG8gYmUKKyAqIGFsd2F5cyBmYWxzZSBhdCBjb21waWxlIHRpbWUgd2lsbCBnZXQgdGhlIGNvZGUgZGVwZW5kaW5nIG9uIGl0CisgKiBjb21waWxlZCBvdXQgYnkgb3B0aW1pemF0aW9uLgorICoKKyAqCisgKiBERUJVRyBMRVZFTFMKKyAqCisgKiBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIGRlZmluZSBob3cgbXVjaCBhIGRlYnVnZ2luZyBsZXZlbCBpcy4KKyAqCisgKiBDb252ZW50aW9uIHNldHMgMCBhcyAibm8gZGVidWciIChzbyBhbiBhY3Rpb24gbWFya2VkIGFzIGRlYnVnIGxldmVsIDAKKyAqIHdpbGwgYWx3YXlzIGJlIHRha2VuKS4gVGhlIGluY3JlYXNpbmcgZGVidWcgbGV2ZWxzIGFyZSB1c2VkIGZvcgorICogaW5jcmVhc2VkIHZlcmJvc2l0eS4KKyAqCisgKgorICogVVNBR0UKKyAqCisgKiBHcm91cCB0aGUgY29kZSBpbiBtb2R1bGVzIGFuZCBzdWJtb2R1bGVzIGluc2lkZSBlYWNoIG1vZHVsZSBbd2hpY2gKKyAqIGluIG1vc3QgY2FzZXMgbWFwcyB0byBMaW51eCBtb2R1bGVzIGFuZCAuYyBmaWxlcyB0aGF0IGNvbXBvc2UKKyAqIHRob3NlXS4KKyAqCisgKgorICogRm9yIGVhY2ggbW9kdWxlLCB0aGVyZSBpczoKKyAqCisgKiAgLSBhIE1PRFVMRU5BTUUgKHNpbmdsZSB3b3JkLCBsZWdhbCBDIGlkZW50aWZpZXIpCisgKgorICogIC0gYSBkZWJ1Zy1sZXZlbHMuaCBoZWFkZXIgZmlsZSB0aGF0IGRlY2xhcmVzIHRoZSBsaXN0IG9mCisgKiAgICBzdWJtb2R1bGVzIGFuZCB0aGF0IGlzIGluY2x1ZGVkIGJ5IGFsbCAuYyBmaWxlcyB0aGF0IHVzZQorICogICAgdGhlIGRlYnVnZ2luZyB0b29scy4gVGhlIGZpbGUgbmFtZSBjYW4gYmUgYW55dGhpbmcuCisgKgorICogIC0gc29tZSAob3B0aW9uYWwpIC5jIGNvZGUgdG8gbWFuaXB1bGF0ZSB0aGUgcnVudGltZSBkZWJ1ZyBsZXZlbHMKKyAqICAgIHRocm91Z2ggZGVidWdmcy4KKyAqCisgKiBUaGUgZGVidWctbGV2ZWxzLmggZmlsZSB3b3VsZCBsb29rIGxpa2U6CisgKgorICogICAgICNpZm5kZWYgX19kZWJ1Z19sZXZlbHNfX2hfXworICogICAgICNkZWZpbmUgX19kZWJ1Z19sZXZlbHNfX2hfXworICoKKyAqICAgICAjZGVmaW5lIERfTU9EVUxFTkFNRSBtb2R1bGVuYW1lCisgKiAgICAgI2RlZmluZSBEX01BU1RFUiAxMAorICoKKyAqICAgICAjaW5jbHVkZSA8bGludXgvd2ltYXgvZGVidWcuaD4KKyAqCisgKiAgICAgZW51bSBkX21vZHVsZSB7CisgKiAgICAgICAgICAgICBEX1NVQk1PRFVMRV9ERUNMQVJFKHN1Ym1vZHVsZV8xKSwKKyAqICAgICAgICAgICAgIERfU1VCTU9EVUxFX0RFQ0xBUkUoc3VibW9kdWxlXzIpLAorICogICAgICAgICAgICAgLi4uCisgKiAgICAgICAgICAgICBEX1NVQk1PRFVMRV9ERUNMQVJFKHN1Ym1vZHVsZV9OKQorICogICAgIH07CisgKgorICogICAgICNlbmRpZgorICoKKyAqIERfTUFTVEVSIGlzIHRoZSBtYXhpbXVtIGNvbXBpbGUtdGltZSBkZWJ1ZyBsZXZlbDsgYW55IGRlYnVnIGFjdGlvbnMKKyAqIGFib3ZlIHRoaXMgd2lsbCBiZSBvdXQuIERfTU9EVUxFTkFNRSBpcyB0aGUgbW9kdWxlIG5hbWUgKGxlZ2FsIEMKKyAqIGlkZW50aWZpZXIpLCB3aGljaCBoYXMgdG8gYmUgdW5pcXVlIGZvciBlYWNoIG1vZHVsZSAodG8gYXZvaWQKKyAqIG5hbWVzcGFjZSBjb2xsaXNpb25zIGR1cmluZyBsaW5rYWdlKS4gTm90ZSB0aG9zZSAjZGVmaW5lcyBuZWVkIHRvCisgKiBiZSBkb25lIGJlZm9yZSAjaW5jbHVkaW5nIGRlYnVnLmgKKyAqCisgKiBXZSBkZWNsYXJlIE4gZGlmZmVyZW50IHN1Ym1vZHVsZXMgd2hvc2UgZGVidWcgbGV2ZWwgY2FuIGJlCisgKiBpbmRlcGVuZGVudGx5IGNvbnRyb2xsZWQgZHVyaW5nIHJ1bnRpbWUuCisgKgorICogSW4gYSAuYyBmaWxlIG9mIHRoZSBtb2R1bGUgKGFuZCBvbmx5IGluIG9uZSBvZiB0aGVtKSwgZGVmaW5lIHRoZQorICogZm9sbG93aW5nIGNvZGU6CisgKgorICogICAgIHN0cnVjdCBkX2xldmVsIERfTEVWRUxbXSA9IHsKKyAqICAgICAgICAgICAgIERfU1VCTU9EVUxFX0RFRklORShzdWJtb2R1bGVfMSksCisgKiAgICAgICAgICAgICBEX1NVQk1PRFVMRV9ERUZJTkUoc3VibW9kdWxlXzIpLAorICogICAgICAgICAgICAgLi4uCisgKiAgICAgICAgICAgICBEX1NVQk1PRFVMRV9ERUZJTkUoc3VibW9kdWxlX04pLAorICogICAgIH07CisgKiAgICAgc2l6ZV90IERfTEVWRUxfU0laRSA9IEFSUkFZX1NJWkUoRF9MRVZFTCk7CisgKgorICogRXh0ZXJucyBmb3IgZF9sZXZlbF9NT0RVTEVOQU1FIGFuZCBkX2xldmVsX3NpemVfTU9EVUxFTkFNRSBhcmUgdXNlZAorICogYW5kIGRlY2xhcmVkIGluIHRoaXMgZmlsZSB1c2luZyB0aGUgRF9MRVZFTCBhbmQgRF9MRVZFTF9TSVpFIG1hY3JvcworICogI2RlZmluZWQgYWxzbyBpbiB0aGlzIGZpbGUuCisgKgorICogVG8gbWFuaXB1bGF0ZSBmcm9tIHVzZXIgc3BhY2UgdGhlIGxldmVscywgY3JlYXRlIGEgZGVidWdmcyBkZW50cnkKKyAqIGFuZCB0aGVuIHJlZ2lzdGVyIGVhY2ggc3VibW9kdWxlIHdpdGg6CisgKgorICogICAgIHJlc3VsdCA9IGRfbGV2ZWxfcmVnaXN0ZXJfZGVidWdmcygiUFJFRklYXyIsIHN1Ym1vZHVsZV9YLCBwYXJlbnQpOworICogICAgIGlmIChyZXN1bHQgPCAwKQorICogICAgICAgICAgICBnb3RvIGVycm9yOworICoKKyAqIFdoZXJlIFBSRUZJWF8gaXMgYSBuYW1lIG9mIHlvdXIgY2hvc2luZy4gVGhpcyB3aWxsIGNyZWF0ZSBkZWJ1Z2ZzCisgKiBmaWxlIHdpdGggYSBzaW5nbGUgbnVtZXJpYyB2YWx1ZSB0aGF0IGNhbiBiZSB1c2UgdG8gdHdlYWsgaXQuIFRvCisgKiByZW1vdmUgdGhlIGVudGlyZXMsIGp1c3QgdXNlIGRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZSgpIG9uICdwYXJlbnQnLgorICoKKyAqIE5PVEU6IHJlbWVtYmVyIHRoYXQgZXZlbiBpZiB0aGlzIHdpbGwgc2hvdyBhdHRhY2hlZCB0byBzb21lCisgKiAgICAgcGFydGljdWxhciBpbnN0YW5jZSBvZiBhIGRldmljZSwgdGhlIHNldHRpbmdzIGFyZSAqZ2xvYmFsKi4KKyAqCisgKgorICogT24gZWFjaCBzdWJtb2R1bGUgKGZvciBleGFtcGxlLCAuYyBmaWxlcyksIHRoZSBkZWJ1ZyBpbmZyYXN0cnVjdHVyZQorICogc2hvdWxkIGJlIGluY2x1ZGVkIGxpa2UgdGhpczoKKyAqCisgKiAgICAgI2RlZmluZSBEX1NVQk1PRFVMRSBzdWJtb2R1bGVfeCAgICAgLy8gbWF0Y2hlcyBvbmUgaW4gZGVidWctbGV2ZWxzLmgKKyAqICAgICAjaW5jbHVkZSAiZGVidWctbGV2ZWxzLmgiCisgKgorICogYWZ0ZXIgI2luY2x1ZGluZyBhbGwgeW91ciBpbmNsdWRlIGZpbGVzLgorICoKKyAqCisgKiBOb3cgeW91IGNhbiB1c2UgdGhlIGRfKigpIG1hY3JvcyBiZWxvdyBbZF90ZXN0KCksIGRfZm5zdGFydCgpLAorICogZF9mbmVuZCgpLCBkX3ByaW50ZigpLCBkX2R1bXAoKV0uCisgKgorICogSWYgdGhlaXIgZGVidWcgbGV2ZWwgaXMgZ3JlYXRlciB0aGFuIERfTUFTVEVSLCB0aGV5IHdpbGwgYmUKKyAqIGNvbXBpbGVkIG91dC4KKyAqCisgKiBJZiB0aGVpciBkZWJ1ZyBsZXZlbCBpcyBsb3dlciBvciBlcXVhbCB0aGFuIERfTUFTVEVSIGJ1dCBncmVhdGVyCisgKiB0aGFuIHRoZSBjdXJyZW50IGRlYnVnIGxldmVsIG9mIHRoZWlyIHN1Ym1vZHVsZSwgdGhleSdsbCBiZQorICogaWdub3JlZC4KKyAqCisgKiBPdGhlcndpc2UsIHRoZSBhY3Rpb24gd2lsbCBiZSBwZXJmb3JtZWQuCisgKi8KKyNpZm5kZWYgX19kZWJ1Z19faF9fCisjZGVmaW5lIF9fZGVidWdfX2hfXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworCisvKiBCYWNrZW5kIHN0dWZmICovCisKKy8qCisgKiBEZWJ1ZyBiYWNrZW5kOiBnZW5lcmF0ZSBhIG1lc3NhZ2UgaGVhZGVyIGZyb20gYSAnc3RydWN0IGRldmljZScKKyAqCisgKiBAaGVhZDogYnVmZmVyIHdoZXJlIHRvIHBsYWNlIHRoZSBoZWFkZXIKKyAqIEBoZWFkX3NpemU6IGxlbmd0aCBvZiBAaGVhZAorICogQGRldjogcG9pbnRlciB0byBkZXZpY2UgdXNlZCB0byBnZW5lcmF0ZSBhIGhlYWRlciBmcm9tLiBJZiBOVUxMLAorICogICAgIGFuIGVtcHR5ICgiIikgaGVhZGVyIGlzIGdlbmVyYXRlZC4KKyAqLworc3RhdGljIGlubGluZQordm9pZCBfX2RfaGVhZChjaGFyICpoZWFkLCBzaXplX3QgaGVhZF9zaXplLAorCSAgICAgIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpZiAoZGV2ID09IE5VTEwpCisJCWhlYWRbMF0gPSAwOworCWVsc2UgaWYgKCh1bnNpZ25lZCBsb25nKWRldiA8IDQwOTYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFOiBDb3JydXB0IGRldiAlcFxuIiwgZGV2KTsKKwkJV0FSTl9PTigxKTsKKwl9IGVsc2UKKwkJc25wcmludGYoaGVhZCwgaGVhZF9zaXplLCAiJXMgJXM6ICIsCisJCQkgZGV2X2RyaXZlcl9zdHJpbmcoZGV2KSwgZGV2LT5idXNfaWQpOworfQorCisKKy8qCisgKiBEZWJ1ZyBiYWNrZW5kOiBsb2cgc29tZSBtZXNzYWdlIGlmIGRlYnVnZ2luZyBpcyBlbmFibGVkCisgKgorICogQGw6IGludGVuZGVkIGRlYnVnIGxldmVsCisgKiBAdGFnOiB0YWcgdG8gcHJlZml4IHRoZSBtZXNzYWdlIHdpdGgKKyAqIEBkZXY6ICdzdHJ1Y3QgZGV2aWNlJyBhc3NvY2lhdGVkIHRvIHRoaXMgbWVzc2FnZQorICogQGY6IHByaW50Zi1saWtlIGZvcm1hdCBhbmQgYXJndW1lbnRzCisgKgorICogTm90ZSB0aGlzIGlzIG9wdGltaXplZCBvdXQgaWYgaXQgZG9lc24ndCBwYXNzIHRoZSBjb21waWxlLXRpbWUKKyAqIGNoZWNrOyBob3dldmVyLCBpdCBpcyAqYWx3YXlzKiBjb21waWxlZC4gVGhpcyBpcyB1c2VmdWwgdG8gbWFrZQorICogc3VyZSB0aGUgcHJpbnRmLWxpa2UgZm9ybWF0cyBhbmQgdmFyaWFibGVzIGFyZSBhbHdheXMgY2hlY2tlZCBhbmQKKyAqIHRoZXkgZG9uJ3QgZ2V0IGJpdCByb3QgaWYgeW91IGhhdmUgYWxsIHRoZSBkZWJ1Z2dpbmcgZGlzYWJsZWQuCisgKi8KKyNkZWZpbmUgX2RfcHJpbnRmKGwsIHRhZywgZGV2LCBmLCBhLi4uKQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwljaGFyIGhlYWRbNjRdOwkJCQkJCQlcCisJaWYgKCFkX3Rlc3QobCkpCQkJCQkJCVwKKwkJYnJlYWs7CQkJCQkJCVwKKwlfX2RfaGVhZChoZWFkLCBzaXplb2YoaGVhZCksIGRldik7CQkJCVwKKwlwcmludGsoS0VSTl9FUlIgIiVzJXMlczogIiBmLCBoZWFkLCBfX2Z1bmNfXywgdGFnLCAjI2EpOwlcCit9IHdoaWxlICgwKQorCisKKy8qCisgKiBDUFAgc2ludGF0aWMgc3VnYXIgdG8gZ2VuZXJhdGUgQV9CIGxpa2Ugc3ltYm9sIG5hbWVzIHdoZW4gb25lIG9mCisgKiB0aGUgYXJndW1lbnRzIGlzIGEgYSBwcmVwcm9jZXNzb3IgI2RlZmluZS4KKyAqLworI2RlZmluZSBfX0RfUEFTVEVfXyh2YXJuYW1lLCBtb2R1bGVuYW1lKSB2YXJuYW1lIyNfIyNtb2R1bGVuYW1lCisjZGVmaW5lIF9fRF9QQVNURSh2YXJuYW1lLCBtb2R1bGVuYW1lKSAoX19EX1BBU1RFX18odmFybmFtZSwgbW9kdWxlbmFtZSkpCisjZGVmaW5lIF9EX1NVQk1PRFVMRV9JTkRFWChfbmFtZSkgKERfU1VCTU9EVUxFX0RFQ0xBUkUoX25hbWUpKQorCisKKy8qCisgKiBTdG9yZSBhIHN1Ym1vZHVsZSdzIHJ1bnRpbWUgZGVidWcgbGV2ZWwgYW5kIG5hbWUKKyAqLworc3RydWN0IGRfbGV2ZWwgeworCXU4IGxldmVsOworCWNvbnN0IGNoYXIgKm5hbWU7Cit9OworCisKKy8qCisgKiBMaXN0IG9mIGF2YWlsYWJsZSBzdWJtb2R1bGVzIGFuZCB0aGVpciBkZWJ1ZyBsZXZlbHMKKyAqCisgKiBXZSBjYWxsIHRoZW0gZF9sZXZlbF9NT0RVTEVOQU1FIGFuZCBkX2xldmVsX3NpemVfTU9EVUxFTkFNRTsgdGhlCisgKiBtYWNyb3MgRF9MRVZFTCBhbmQgRF9MRVZFTF9TSVpFIGNvbnRhaW4gdGhlIG5hbWUgYWxyZWFkeSBmb3IKKyAqIGNvbnZlbmllbmNlLgorICoKKyAqIFRoaXMgYXJyYXkgYW5kIHRoZSBzaXplIGFyZSBkZWZpbmVkIG9uIHNvbWUgLmMgZmlsZSB0aGF0IGlzIHBhcnQgb2YKKyAqIHRoZSBjdXJyZW50IG1vZHVsZS4KKyAqLworI2RlZmluZSBEX0xFVkVMIF9fRF9QQVNURShkX2xldmVsLCBEX01PRFVMRU5BTUUpCisjZGVmaW5lIERfTEVWRUxfU0laRSBfX0RfUEFTVEUoZF9sZXZlbF9zaXplLCBEX01PRFVMRU5BTUUpCisKK2V4dGVybiBzdHJ1Y3QgZF9sZXZlbCBEX0xFVkVMW107CitleHRlcm4gc2l6ZV90IERfTEVWRUxfU0laRTsKKworCisvKgorICogRnJvbnRlbmQgc3R1ZmYKKyAqCisgKgorICogU3R1ZmYgeW91IG5lZWQgdG8gZGVjbGFyZSBwcmlvciB0byB1c2luZyB0aGUgYWN0dWFsICJkZWJ1ZyIgYWN0aW9ucworICogKGRlZmluZWQgYmVsb3cpLgorICovCisKKyNpZm5kZWYgRF9NT0RVTEVOQU1FCisjZXJyb3IgRF9NT0RVTEVOQU1FIGlzIG5vdCBkZWZpbmVkIGluIHlvdXIgZGVidWctbGV2ZWxzLmggZmlsZQorLyoqCisgKiBEX01PRFVMRSAtIE5hbWUgb2YgdGhlIGN1cnJlbnQgbW9kdWxlCisgKgorICogI2RlZmluZSBpbiB5b3VyIG1vZHVsZSdzIGRlYnVnLWxldmVscy5oLCBtYWtpbmcgc3VyZSBpdCBpcworICogdW5pcXVlLiBUaGlzIGhhcyB0byBiZSBhIGxlZ2FsIEMgaWRlbnRpZmllci4KKyAqLworI2RlZmluZSBEX01PRFVMRU5BTUUgdW5kZWZpbmVkX21vZHVsZW5hbWUKKyNlbmRpZgorCisKKyNpZm5kZWYgRF9NQVNURVIKKyN3YXJuaW5nIERfTUFTVEVSIG5vdCBkZWZpbmVkLCBidXQgZGVidWcuaCBpbmNsdWRlZCEgW3NlZSBkb2NzXQorLyoqCisgKiBEX01BU1RFUiAtIENvbXBpbGUgdGltZSBtYXhpbXVtIGRlYnVnIGxldmVsCisgKgorICogI2RlZmluZSBpbiB5b3VyIGRlYnVnLWxldmVscy5oIGZpbGUgdG8gdGhlIG1heGltdW0gZGVidWcgbGV2ZWwgdGhlCisgKiBydW50aW1lIGNvZGUgd2lsbCBiZSBhbGxvd2VkIHRvIGhhdmUuIFRoaXMgYWxsb3dzIHlvdSB0byBwcm92aWRlIGEKKyAqIG1haW4ga25vYi4KKyAqCisgKiBBbnl0aGluZyBhYm92ZSB0aGF0IGxldmVsIHdpbGwgYmUgb3B0aW1pemVkIG91dCBvZiB0aGUgY29tcGlsZS4KKyAqCisgKiBEZWZhdWx0cyB0byB6ZXJvIChubyBkZWJ1ZyBjb2RlIGNvbXBpbGVkIGluKS4KKyAqCisgKiBNYXhpbXVtIG9uZSBkZWZpbml0aW9uIHBlciBtb2R1bGUgKGF0IHRoZSBkZWJ1Zy1sZXZlbHMuaCBmaWxlKS4KKyAqLworI2RlZmluZSBEX01BU1RFUiAwCisjZW5kaWYKKworI2lmbmRlZiBEX1NVQk1PRFVMRQorI2Vycm9yIERfU1VCTU9EVUxFIG5vdCBkZWZpbmVkLCBidXQgZGVidWcuaCBpbmNsdWRlZCEgW3NlZSBkb2NzXQorLyoqCisgKiBEX1NVQk1PRFVMRSAtIE5hbWUgb2YgdGhlIGN1cnJlbnQgc3VibW9kdWxlCisgKgorICogI2RlZmluZSBpbiB5b3VyIHN1Ym1vZHVsZSAuYyBmaWxlIGJlZm9yZSAjaW5jbHVkaW5nIGRlYnVnLWxldmVscy5oCisgKiB0byB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBzdWJtb2R1bGUgYXMgcHJldmlvdXNseSBkZWNsYXJlZCBhbmQKKyAqIGRlZmluZWQgd2l0aCBEX1NVQk1PRFVMRV9ERUNMQVJFKCkgKGluIHlvdXIgbW9kdWxlJ3MKKyAqIGRlYnVnLWxldmVscy5oKSBhbmQgRF9TVUJNT0RVTEVfREVGSU5FKCkuCisgKgorICogVGhpcyBpcyB1c2VkIHRvIHByb3ZpZGUgcnVudGltZS1jb250cm9sIG92ZXIgdGhlIGRlYnVnIGxldmVscy4KKyAqCisgKiBNYXhpbXVtIG9uZSBwZXIgLmMgZmlsZSEgQ2FuIGJlIHNoYXJlZCBhbW9uZyBkaWZmZXJlbnQgLmMgZmlsZXMKKyAqIChtZWFuaW5nIHRoZXkgYmVsb25nIHRvIHRoZSBzYW1lIHN1Ym1vZHVsZSBjYXRlZ29yaXphdGlvbikuCisgKi8KKyNkZWZpbmUgRF9TVUJNT0RVTEUgdW5kZWZpbmVkX21vZHVsZQorI2VuZGlmCisKKworLyoqCisgKiBEX1NVQk1PRFVMRV9ERUNMQVJFIC0gRGVjbGFyZSBhIHN1Ym1vZHVsZSBmb3IgcnVudGltZSBkZWJ1ZyBsZXZlbCBjb250cm9sCisgKgorICogQF9uYW1lOiBuYW1lIG9mIHRoZSBzdWJtb2R1bGUsIHJlc3RyaWN0ZWQgdG8gdGhlIGNoYXJzIHRoYXQgbWFrZSB1cCBhCisgKiAgICAgdmFsaWQgQyBpZGVudGlmaWVyIChbYS16QS1aMC05X10pLgorICoKKyAqIERlY2xhcmUgaW4gdGhlIG1vZHVsZSdzIGRlYnVnLWxldmVscy5oIGhlYWRlciBmaWxlIGFzOgorICoKKyAqIGVudW0gZF9tb2R1bGUgeworICogICAgICAgICBEX1NVQk1PRFVMRV9ERUNMQVJFKHN1Ym1vZHVsZV8xKSwKKyAqICAgICAgICAgRF9TVUJNT0RVTEVfREVDTEFSRShzdWJtb2R1bGVfMiksCisgKiAgICAgICAgIERfU1VCTU9EVUxFX0RFQ0xBUkUoc3VibW9kdWxlXzMpLAorICogfTsKKyAqCisgKiBTb21lIGNvcnJlc3BvbmRpbmcgLmMgZmlsZSBuZWVkcyB0byBoYXZlIGEgbWF0Y2hpbmcKKyAqIERfU1VCTU9EVUxFX0RFRklORSgpLgorICovCisjZGVmaW5lIERfU1VCTU9EVUxFX0RFQ0xBUkUoX25hbWUpIF9fRF9TVUJNT0RVTEVfIyNfbmFtZQorCisKKy8qKgorICogRF9TVUJNT0RVTEVfREVGSU5FIC0gRGVmaW5lIGEgc3VibW9kdWxlIGZvciBydW50aW1lIGRlYnVnIGxldmVsIGNvbnRyb2wKKyAqCisgKiBAX25hbWU6IG5hbWUgb2YgdGhlIHN1Ym1vZHVsZSwgcmVzdHJpY3RlZCB0byB0aGUgY2hhcnMgdGhhdCBtYWtlIHVwIGEKKyAqICAgICB2YWxpZCBDIGlkZW50aWZpZXIgKFthLXpBLVowLTlfXSkuCisgKgorICogVXNlIG9uY2UgcGVyIG1vZHVsZSAoaW4gc29tZSAuYyBmaWxlKSBhczoKKyAqCisgKiBzdGF0aWMKKyAqIHN0cnVjdCBkX2xldmVsIGRfbGV2ZWxfU1VCTU9EVUxFTkFNRVtdID0geworICogICAgICAgICBEX1NVQk1PRFVMRV9ERUZJTkUoc3VibW9kdWxlXzEpLAorICogICAgICAgICBEX1NVQk1PRFVMRV9ERUZJTkUoc3VibW9kdWxlXzIpLAorICogICAgICAgICBEX1NVQk1PRFVMRV9ERUZJTkUoc3VibW9kdWxlXzMpLAorICogfTsKKyAqIHNpemVfdCBkX2xldmVsX3NpemVfU1VCRE1PRFVMRU5BTUUgPSBBUlJBWV9TSVpFKGRfbGV2ZWxfU1VCRE1PRFVMRU5BTUUpOworICoKKyAqIE1hdGNoaW5nIERfU1VCTU9EVUxFX0RFQ0xBUkUoKXMgaGF2ZSB0byBiZSBwcmVzZW50IGluIGEKKyAqIGRlYnVnLWxldmVscy5oIGhlYWRlciBmaWxlLgorICovCisjZGVmaW5lIERfU1VCTU9EVUxFX0RFRklORShfbmFtZSkJCVwKK1tfX0RfU1VCTU9EVUxFXyMjX25hbWVdID0gewkJCVwKKwkubGV2ZWwgPSAwLAkJCQlcCisJLm5hbWUgPSAjX25hbWUJCQkJXAorfQorCisKKworLyogVGhlIGFjdHVhbCAiZGVidWciIG9wZXJhdGlvbnMgKi8KKworCisvKioKKyAqIGRfdGVzdCAtIFJldHVybnMgdHJ1ZSBpZiBkZWJ1Z2dpbmcgc2hvdWxkIGJlIGVuYWJsZWQKKyAqCisgKiBAbDogaW50ZW5kZWQgZGVidWcgbGV2ZWwgKHVuc2lnbmVkKQorICoKKyAqIElmIHRoZSBtYXN0ZXIgZGVidWcgc3dpdGNoIGlzIGVuYWJsZWQgYW5kIHRoZSBjdXJyZW50IHNldHRpbmdzIGFyZQorICogaGlnaGVyIG9yIGVxdWFsIHRvIHRoZSByZXF1ZXN0ZWQgbGV2ZWwsIHRoZW4gZGVidWdnaW5nCisgKiBvdXRwdXQvYWN0aW9ucyBzaG91bGQgYmUgZW5hYmxlZC4KKyAqCisgKiBOT1RFOgorICoKKyAqIFRoaXMgbmVlZHMgdG8gYmUgY29kZWQgc28gdGhhdCBpdCBjYW4gYmUgZXZhbHVhdGVkIGluIGNvbXBpbGUKKyAqIHRpbWU7IHRoaXMgaXMgd2h5IHRoZSB1Z2x5IEJVR19PTigpIGlzIHBsYWNlZCBpbiB0aGVyZSwgc28gdGhlCisgKiBEX01BU1RFUiBldmFsdWF0aW9uIGNvbXBpbGVzIGFsbCBvdXQgaWYgaXQgaXMgY29tcGlsZS10aW1lIGZhbHNlLgorICovCisjZGVmaW5lIGRfdGVzdChsKQkJCQkJCQlcCisoewkJCQkJCQkJCVwKKwl1bnNpZ25lZCBfX2wgPSBsOwkvKiB0eXBlIGVuZm9yY2VyICovCQkJXAorCShEX01BU1RFUikgPj0gX19sCQkJCQkJXAorCSYmICh7CQkJCQkJCQlcCisJCUJVR19PTihfRF9TVUJNT0RVTEVfSU5ERVgoRF9TVUJNT0RVTEUpID49IERfTEVWRUxfU0laRSk7XAorCQlEX0xFVkVMW19EX1NVQk1PRFVMRV9JTkRFWChEX1NVQk1PRFVMRSldLmxldmVsID49IF9fbDsJXAorCX0pOwkJCQkJCQkJXAorfSkKKworCisvKioKKyAqIGRfZm5zdGFydCAtIGxvZyBtZXNzYWdlIGF0IGZ1bmN0aW9uIHN0YXJ0IGlmIGRlYnVnZ2luZyBlbmFibGVkCisgKgorICogQGw6IGludGVuZGVkIGRlYnVnIGxldmVsCisgKiBAX2RldjogJ3N0cnVjdCBkZXZpY2UnIHBvaW50ZXIsIE5VTEwgaWYgbm9uZSAoZm9yIGNvbnRleHQpCisgKiBAZjogcHJpbnRmLWxpa2UgZm9ybWF0IGFuZCBhcmd1bWVudHMKKyAqLworI2RlZmluZSBkX2Zuc3RhcnQobCwgX2RldiwgZiwgYS4uLikgX2RfcHJpbnRmKGwsICIgRk5TVEFSVCIsIF9kZXYsIGYsICMjIGEpCisKKworLyoqCisgKiBkX2ZuZW5kIC0gbG9nIG1lc3NhZ2UgYXQgZnVuY3Rpb24gZW5kIGlmIGRlYnVnZ2luZyBlbmFibGVkCisgKgorICogQGw6IGludGVuZGVkIGRlYnVnIGxldmVsCisgKiBAX2RldjogJ3N0cnVjdCBkZXZpY2UnIHBvaW50ZXIsIE5VTEwgaWYgbm9uZSAoZm9yIGNvbnRleHQpCisgKiBAZjogcHJpbnRmLWxpa2UgZm9ybWF0IGFuZCBhcmd1bWVudHMKKyAqLworI2RlZmluZSBkX2ZuZW5kKGwsIF9kZXYsIGYsIGEuLi4pIF9kX3ByaW50ZihsLCAiIEZORU5EIiwgX2RldiwgZiwgIyMgYSkKKworCisvKioKKyAqIGRfcHJpbnRmIC0gbG9nIG1lc3NhZ2UgaWYgZGVidWdnaW5nIGVuYWJsZWQKKyAqCisgKiBAbDogaW50ZW5kZWQgZGVidWcgbGV2ZWwKKyAqIEBfZGV2OiAnc3RydWN0IGRldmljZScgcG9pbnRlciwgTlVMTCBpZiBub25lIChmb3IgY29udGV4dCkKKyAqIEBmOiBwcmludGYtbGlrZSBmb3JtYXQgYW5kIGFyZ3VtZW50cworICovCisjZGVmaW5lIGRfcHJpbnRmKGwsIF9kZXYsIGYsIGEuLi4pIF9kX3ByaW50ZihsLCAiIiwgX2RldiwgZiwgIyMgYSkKKworCisvKioKKyAqIGRfZHVtcCAtIGxvZyBidWZmZXIgaGV4IGR1bXAgaWYgZGVidWdnaW5nIGVuYWJsZWQKKyAqCisgKiBAbDogaW50ZW5kZWQgZGVidWcgbGV2ZWwKKyAqIEBfZGV2OiAnc3RydWN0IGRldmljZScgcG9pbnRlciwgTlVMTCBpZiBub25lIChmb3IgY29udGV4dCkKKyAqIEBmOiBwcmludGYtbGlrZSBmb3JtYXQgYW5kIGFyZ3VtZW50cworICovCisjZGVmaW5lIGRfZHVtcChsLCBkZXYsIHB0ciwgc2l6ZSkJCQlcCitkbyB7CQkJCQkJCVwKKwljaGFyIGhlYWRbNjRdOwkJCQkJXAorCWlmICghZF90ZXN0KGwpKQkJCQkJXAorCQlicmVhazsJCQkJCVwKKwlfX2RfaGVhZChoZWFkLCBzaXplb2YoaGVhZCksIGRldik7CQlcCisJcHJpbnRfaGV4X2R1bXAoS0VSTl9FUlIsIGhlYWQsIDAsIDE2LCAxLAlcCisJCSAgICAgICAoKHZvaWQgKikgcHRyKSwgKHNpemUpLCAwKTsJXAorfSB3aGlsZSAoMCkKKworCisvKioKKyAqIEV4cG9ydCBhIHN1Ym1vZHVsZSdzIGRlYnVnIGxldmVsIG92ZXIgZGVidWdmcyBhcyBQUkVGSVhTVUJNT0RVTEUKKyAqCisgKiBAcHJlZml4OiBzdHJpbmcgdG8gcHJlZml4IHRoZSBuYW1lIHdpdGgKKyAqIEBzdWJtb2R1bGU6IG5hbWUgb2Ygc3VibW9kdWxlIChub3QgYSBzdHJpbmcsIGp1c3QgdGhlIG5hbWUpCisgKiBAZGVudHJ5OiBkZWJ1Z2ZzIHBhcmVudCBkZW50cnkKKyAqCisgKiBSZXR1cm5zOiAwIGlmIG9rLCA8IDAgZXJybm8gb24gZXJyb3IuCisgKgorICogRm9yIHJlbW92aW5nLCBqdXN0IHVzZSBkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoKSBvbiB0aGUgcGFyZW50LgorICovCisjZGVmaW5lIGRfbGV2ZWxfcmVnaXN0ZXJfZGVidWdmcyhwcmVmaXgsIG5hbWUsIHBhcmVudCkJCQlcCisoewkJCQkJCQkJCVwKKwlpbnQgcmM7CQkJCQkJCQlcCisJc3RydWN0IGRlbnRyeSAqZmQ7CQkJCQkJXAorCXN0cnVjdCBkZW50cnkgKnZlcmlmeV9wYXJlbnRfdHlwZSA9IHBhcmVudDsJCQlcCisJZmQgPSBkZWJ1Z2ZzX2NyZWF0ZV91OCgJCQkJCQlcCisJCXByZWZpeCAjbmFtZSwgMDYwMCwgdmVyaWZ5X3BhcmVudF90eXBlLAkJCVwKKwkJJihEX0xFVkVMW19fRF9TVUJNT0RVTEVfICMjIG5hbWVdLmxldmVsKSk7CQlcCisJcmMgPSBQVFJfRVJSKGZkKTsJCQkJCQlcCisJaWYgKElTX0VSUihmZCkgJiYgcmMgIT0gLUVOT0RFVikJCQkJXAorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW4ndCBjcmVhdGUgZGVidWdmcyBlbnRyeSAlczogIglcCisJCSAgICAgICAiJWRcbiIsIF9fZnVuY19fLCBwcmVmaXggI25hbWUsIHJjKTsJCVwKKwllbHNlCQkJCQkJCQlcCisJCXJjID0gMDsJCQkJCQkJXAorCXJjOwkJCQkJCQkJXAorfSkKKworCisjZW5kaWYgLyogI2lmbmRlZiBfX2RlYnVnX19oX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvd2ltYXgvaTI0MDBtLmggYi9pbmNsdWRlL2xpbnV4L3dpbWF4L2kyNDAwbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MTk4ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3dpbWF4L2kyNDAwbS5oCkBAIC0wLDAgKzEsNTEyIEBACisvKgorICogSW50ZWwgV2lyZWxlc3MgV2lNYXggQ29ubmVjdGlvbiAyNDAwbQorICogSG9zdC1EZXZpY2UgcHJvdG9jb2wgaW50ZXJmYWNlIGRlZmluaXRpb25zCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqCisgKiBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqICAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqCisgKgorICogVGhpcyBoZWFkZXIgZGVmaW5lcyB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBjb25zdGFudHMgdXNlZCB0bworICogY29tbXVuaWNhdGUgd2l0aCB0aGUgZGV2aWNlLgorICoKKyAqIEJPT1RNT0RFL0JPT1RST00vRklSTVdBUkUgVVBMT0FEIFBST1RPQ09MCisgKgorICogVGhlIGZpcm13YXJlIHVwbG9hZCBwcm90b2NvbCBpcyBxdWl0ZSBzaW1wbGUgYW5kIG9ubHkgcmVxdWlyZXMgYQorICogaGFuZGZ1bCBvZiBjb21tYW5kcy4gU2VlIGRyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9mdy5jIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICoKKyAqIFRoZSBCQ0YgZGF0YSBzdHJ1Y3R1cmUgaXMgZm9yIHRoZSBmaXJtd2FyZSBmaWxlIGhlYWRlci4KKyAqCisgKgorICogVEhFIERBVEEgLyBDT05UUk9MIFBST1RPQ09MCisgKgorICogVGhpcyBpcyB0aGUgbm9ybWFsIHByb3RvY29sIHNwb2tlbiB3aXRoIHRoZSBkZXZpY2Ugb25jZSB0aGUKKyAqIGZpcm13YXJlIGlzIHVwbG9hZGVkLiBJdCB0cmFuc3BvcnRzIGRhdGEgcGF5bG9hZHMgYW5kIGNvbnRyb2wKKyAqIG1lc3NhZ2VzIGJhY2sgYW5kIGZvcnRoLgorICoKKyAqIEl0IGNvbnNpc3RzICdtZXNzYWdlcycgdGhhdCBwYWNrIG9uZSBvciBtb3JlIHBheWxvYWRzIGVhY2guIFRoZQorICogZm9ybWF0IGlzIGRlc2NyaWJlZCBpbiBkZXRhaWwgaW4gZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3J4LmMgYW5kCisgKiB0eC5jLgorICoKKyAqCisgKiBUSEUgTDNMNCBQUk9UT0NPTAorICoKKyAqIFRoZSB0ZXJtIEwzTDQgcmVmZXJzIHRvIExheWVyIDMgKHRoZSBkZXZpY2UpLCBMYXllciA0ICh0aGUKKyAqIGRyaXZlci9ob3N0IHNvZnR3YXJlKS4KKyAqCisgKiBUaGlzIGlzIHRoZSBjb250cm9sIHByb3RvY29sIHVzZWQgYnkgdGhlIGhvc3QgdG8gY29udHJvbCB0aGUgaTI0MDBtCisgKiBkZXZpY2UgKHNjYW4sIGNvbm5lY3QsIGRpc2Nvbm5lY3QuLi4pLiBUaGlzIGlzIHNlbnQgdG8gLyByZWNlaXZlZAorICogYXMgY29udHJvbCBmcmFtZXMuIFRoZXNlIGZyYW1lcyBjb25zaXN0IG9mIGEgaGVhZGVyIGFuZCB6ZXJvIG9yCisgKiBtb3JlIFRMVnMgd2l0aCBpbmZvcm1hdGlvbi4gV2UgY2FsbCBlYWNoIGNvbnRyb2wgZnJhbWUgYSAibWVzc2FnZSIuCisgKgorICogRWFjaCBtZXNzYWdlIGlzIGNvbXBvc2VkIG9mOgorICoKKyAqIEhFQURFUgorICogW1RMVjAgKyBQQVlMT0FEMF0KKyAqIFtUTFYxICsgUEFZTE9BRDFdCisgKiBbLi4uXQorICogW1RMVk4gKyBQQVlMT0FETl0KKyAqCisgKiBUaGUgSEVBREVSIGlzIGRlZmluZWQgYnkgJ3N0cnVjdCBpMjQwMG1fbDNsNF9oZHInLiBUaGUgcGF5bG9hZHMgYXJlCisgKiBkZWZpbmVkIGJ5IGEgVExWIHN0cnVjdHVyZSAoVHlwZSBMZW5ndGggVmFsdWUpIHdoaWNoIGlzIGEgJ2hlYWRlcicKKyAqIChzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIpIGFuZCB0aGVuIHRoZSBwYXlsb2FkLgorICoKKyAqIEFsbCBpbnRlZ2VycyBhcmUgcmVwcmVzZW50ZWQgYXMgTGl0dGxlIEVuZGlhbi4KKyAqCisgKiAtIFJFUVVFU1RTIEFORCBFVkVOVFMKKyAqCisgKiBUaGUgcmVxdWVzdHMgY2FuIGJlIGNsYXNpZmllZCBhcyBmb2xsb3dzOgorICoKKyAqICAgQ09NTUFORDogIGltcGxpZXMgYSByZXF1ZXN0IGZyb20gdGhlIGhvc3QgdG8gdGhlIGRldmljZSByZXF1ZXN0aW5nCisgKiAgICAgICAgICAgICBhbiBhY3Rpb24gYmVpbmcgcGVyZm9ybWVkLiBUaGUgZGV2aWNlIHdpbGwgcmVwbHkgd2l0aCBhCisgKiAgICAgICAgICAgICBtZXNzYWdlICh3aXRoIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGNvbW1hbmQpLCBzdGF0dXMgYW5kCisgKiAgICAgICAgICAgICBubyAoVExWKSBwYXlsb2FkLiBFeGVjdXRpb24gb2YgYSBjb21tYW5kIG1pZ2h0IGNhdXNlCisgKiAgICAgICAgICAgICBldmVudHMgKG9mIGRpZmZlcmVudCB0eXBlKSB0byBiZSBzZW50IGxhdGVyIG9uIGFzCisgKiAgICAgICAgICAgICBkZXZpY2UncyBzdGF0ZSBjaGFuZ2VzLgorICoKKyAqICAgR0VUL1NFVDogIHNpbWlsYXIgdG8gQ09NTUFORCwgYnV0IHdpbGwgbm90IGNhdXNlIG90aGVyCisgKiAgICAgICAgICAgICBFVkVOVHMuIFRoZSByZXBseSwgaW4gdGhlIGNhc2Ugb2YgR0VULCB3aWxsIGNvbnRhaW4KKyAqICAgICAgICAgICAgIFRMVnMgd2l0aCB0aGUgcmVxdWVzdGVkIGluZm9ybWF0aW9uLgorICoKKyAqICAgRVZFTlQ6ICAgIGFzeW5jaHJvbm91cyBtZXNzYWdlcyBzZW50IGZyb20gdGhlIGRldmljZSwgbWF5YmUgYXMgYQorICogICAgICAgICAgICAgY29uc2VxdWVuY2Ugb2YgcHJldmlvdXMgQ09NTUFORHMgYnV0IGRpc2Fzc29jaWF0ZWQgZnJvbQorICogICAgICAgICAgICAgdGhlbS4KKyAqCisgKiBPbmx5IG9uZSByZXF1ZXN0IG1pZ2h0IGJlIHBlbmRpbmcgYXQgdGhlIHNhbWUgdGltZSAoaWU6IGRvbid0CisgKiBwYXJhbGxlbGl6ZSBub3IgcG9zdCBhbm90aGVyIEdFVCByZXF1ZXN0IGJlZm9yZSB0aGUgcHJldmlvdXMKKyAqIENPTU1BTkQgaGFzIGJlZW4gYWNrbm93bGVkZ2VkIHdpdGggaXQncyBjb3JyZXNwb25kaW5nIHJlcGx5IGJ5IHRoZQorICogZGV2aWNlKS4KKyAqCisgKiBUaGUgZGlmZmVyZW50IHJlcXVlc3RzIGFuZCB0aGVpciBmb3JtYXRzIGFyZSBkZXNjcmliZWQgYmVsb3c6CisgKgorICogIEkyNDAwTV9NVF8qICAgTWVzc2FnZSB0eXBlcworICogIEkyNDAwTV9NU18qICAgTWVzc2FnZSBzdGF0dXMgKGZvciByZXBsaWVzLCBldmVudHMpCisgKiAgaTI0MDBtX3Rsdl8qICBUTFZzCisgKgorICogZGF0YSB0eXBlcyBhcmUgbmFtZWQgJ3N0cnVjdCBpMjQwMG1fbXNnX09QTkFNRScsIE9QTkFNRSBtYXRjaGluZyB0aGUKKyAqIG9wZXJhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfX1dJTUFYX19JMjQwME1fSF9fCisjZGVmaW5lIF9fTElOVVhfX1dJTUFYX19JMjQwME1fSF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisKKy8qCisgKiBIb3N0IERldmljZSBJbnRlcmZhY2UgKEhESSkgY29tbW9uIHRvIGFsbCBidXNzZXMKKyAqLworCisvKiBCb290LW1vZGUgKGZpcm13YXJlIHVwbG9hZCBtb2RlKSBjb21tYW5kcyAqLworCisvKiBIZWFkZXIgZm9yIHRoZSBmaXJtd2FyZSBmaWxlICovCitzdHJ1Y3QgaTI0MDBtX2JjZl9oZHIgeworCV9fbGUzMiBtb2R1bGVfdHlwZTsKKwlfX2xlMzIgaGVhZGVyX2xlbjsKKwlfX2xlMzIgaGVhZGVyX3ZlcnNpb247CisJX19sZTMyIG1vZHVsZV9pZDsKKwlfX2xlMzIgbW9kdWxlX3ZlbmRvcjsKKwlfX2xlMzIgZGF0ZTsJCS8qIEJDRCBZWVlNTUREICovCisJX19sZTMyIHNpemU7CisJX19sZTMyIGtleV9zaXplOwkvKiBpbiBkd29yZHMgKi8KKwlfX2xlMzIgbW9kdWx1c19zaXplOwkvKiBpbiBkd29yZHMgKi8KKwlfX2xlMzIgZXhwb25lbnRfc2l6ZTsJLyogaW4gZHdvcmRzICovCisJX191OCByZXNlcnZlZFs4OF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogQm9vdCBtb2RlIG9wY29kZXMgKi8KK2VudW0gaTI0MDBtX2JyaF9vcGNvZGUgeworCUkyNDAwTV9CUkhfUkVBRCA9IDEsCisJSTI0MDBNX0JSSF9XUklURSA9IDIsCisJSTI0MDBNX0JSSF9KVU1QID0gMywKKwlJMjQwME1fQlJIX1NJR05FRF9KVU1QID0gOCwKKwlJMjQwME1fQlJIX0hBU0hfUEFZTE9BRF9PTkxZID0gOSwKK307CisKKy8qIEJvb3QgbW9kZSBjb21tYW5kIG1hc2tzIGFuZCBzdHVmZiAqLworZW51bSBpMjQwMG1fYnJoIHsKKwlJMjQwME1fQlJIX1NJR05BVFVSRSA9IDB4Y2JiYzAwMDAsCisJSTI0MDBNX0JSSF9TSUdOQVRVUkVfTUFTSyA9IDB4ZmZmZjAwMDAsCisJSTI0MDBNX0JSSF9TSUdOQVRVUkVfU0hJRlQgPSAxNiwKKwlJMjQwME1fQlJIX09QQ09ERV9NQVNLID0gMHgwMDAwMDAwZiwKKwlJMjQwME1fQlJIX1JFU1BPTlNFX01BU0sgPSAweDAwMDAwMGYwLAorCUkyNDAwTV9CUkhfUkVTUE9OU0VfU0hJRlQgPSA0LAorCUkyNDAwTV9CUkhfRElSRUNUX0FDQ0VTUyA9IDB4MDAwMDA0MDAsCisJSTI0MDBNX0JSSF9SRVNQT05TRV9SRVFVSVJFRCA9IDB4MDAwMDAyMDAsCisJSTI0MDBNX0JSSF9VU0VfQ0hFQ0tTVU0gPSAweDAwMDAwMTAwLAorfTsKKworCisvKiBDb25zdGFudHMgZm9yIGJjZi0+bW9kdWxlX2lkICovCitlbnVtIGkyNDAwbV9iY2ZfbW9kX2lkIHsKKwkvKiBGaXJtd2FyZSBmaWxlIGNhcnJpZXMgaXRzIG93biBwb2tlcyAtLSBwb2tlcyBhcmUgYSBzZXQgb2YKKwkgKiBtYWdpY2FsIHZhbHVlcyB0aGF0IGhhdmUgdG8gYmUgd3JpdHRlbiBpbiBjZXJ0YWluIG1lbW9yeQorCSAqIGFkZHJlc3NlcyB0byBnZXQgdGhlIGRldmljZSB1cCBhbmQgcmVhZHkgZm9yIGZpcm13YXJlCisJICogZG93bmxvYWQgd2hlbiBpdCBpcyBpbiBub24tc2lnbmVkIGJvb3QgbW9kZS4gKi8KKwlJMjQwME1fQkNGX01PRF9JRF9QT0tFUyA9IDB4MDAwMDAwMDAxLAorfTsKKworCisvKioKKyAqIGkyNDAwbV9ib290cm9tX2hlYWRlciAtIEhlYWRlciBmb3IgYSBib290LW1vZGUgY29tbWFuZAorICoKKyAqIEBjbWQ6IHRoZSBhYm92ZSBjb21tYW5kIGRlc2NyaXB0b3IKKyAqIEB0YXJnZXRfYWRkcjogd2hlcmUgb24gdGhlIGRldmljZSBtZW1vcnkgc2hvdWxkIHRoZSBhY3Rpb24gYmUgcGVyZm9ybWVkLgorICogQGRhdGFfc2l6ZTogZm9yIHJlYWQvd3JpdGUsIGFtb3VudCBvZiBkYXRhIHRvIGJlIHJlYWQvd3JpdHRlbgorICogQGJsb2NrX2NoZWNrc3VtOiBjaGVja3N1bSB2YWx1ZSAoaWYgYXBwbGljYWJsZSkKKyAqIEBwYXlsb2FkOiB0aGUgYmVnaW5uaW5nIG9mIGRhdGEgYXR0YWNoZWQgdG8gdGhpcyBoZWFkZXIKKyAqLworc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciB7CisJX19sZTMyIGNvbW1hbmQ7CQkvKiBDb21wb3NlIHdpdGggZW51bSBpMjQwMF9icmggKi8KKwlfX2xlMzIgdGFyZ2V0X2FkZHI7CisJX19sZTMyIGRhdGFfc2l6ZTsKKwlfX2xlMzIgYmxvY2tfY2hlY2tzdW07CisJY2hhciBwYXlsb2FkWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworLyoKKyAqIERhdGEgLyBjb250cm9sIHByb3RvY29sCisgKi8KKworLyogUGFja2V0IHR5cGVzIGZvciB0aGUgaG9zdC1kZXZpY2UgaW50ZXJmYWNlICovCitlbnVtIGkyNDAwbV9wdCB7CisJSTI0MDBNX1BUX0RBVEEgPSAwLAorCUkyNDAwTV9QVF9DVFJMLAorCUkyNDAwTV9QVF9UUkFDRSwJLyogRm9yIGRldmljZSBkZWJ1ZyAqLworCUkyNDAwTV9QVF9SRVNFVF9XQVJNLAkvKiBkZXZpY2UgcmVzZXQgKi8KKwlJMjQwME1fUFRfUkVTRVRfQ09MRCwJLyogVVNCW3RyYW5zcG9ydF0gcmVzZXQsIGxpa2UgcmVjb25uZWN0ICovCisJSTI0MDBNX1BUX0lMTEVHQUwKK307CisKKworLyoKKyAqIFBheWxvYWQgZm9yIGEgZGF0YSBwYWNrZXQKKyAqCisgKiBUaGlzIGlzIHByZWZpeGVkIHRvIGVhY2ggYW5kIGV2ZXJ5IG91dGdvaW5nIERBVEEgdHlwZS4KKyAqLworc3RydWN0IGkyNDAwbV9wbF9kYXRhX2hkciB7CisJX19sZTMyIHJlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCisvKiBNaXNjIGNvbnN0YW50cyAqLworZW51bSB7CisJSTI0MDBNX1BMX1BBRCA9IDE2LAkvKiBQYXlsb2FkIGRhdGEgc2l6ZSBhbGlnbm1lbnQgKi8KKwlJMjQwME1fUExfU0laRV9NQVggPSAweDNFRkYsCisJSTI0MDBNX01BWF9QTFNfSU5fTVNHID0gNjAsCisJLyogcHJvdG9jb2wgYmFya2Vyczogc3luYyBzZXF1ZW5jZXM7IGZvciBub3RpZmljYXRpb25zIHRoZXkKKwkgKiBhcmUgc2VudCBpbiBncm91cHMgb2YgZm91ci4gKi8KKwlJMjQwME1fSDJEX1BSRVZJRVdfQkFSS0VSID0gMHhjYWZlOTAwZCwKKwlJMjQwME1fQ09MRF9SRVNFVF9CQVJLRVIgPSAweGMwMWRjMDFkLAorCUkyNDAwTV9XQVJNX1JFU0VUX0JBUktFUiA9IDB4NTBmNzUwZjcsCisJSTI0MDBNX05CT09UX0JBUktFUiA9IDB4ZGVhZGJlZWYsCisJSTI0MDBNX1NCT09UX0JBUktFUiA9IDB4MGZmMWMxYTEsCisJSTI0MDBNX0FDS19CQVJLRVIgPSAweGZlZWRiYWJlLAorCUkyNDAwTV9EMkhfTVNHX0JBUktFUiA9IDB4YmVlZmJhYmUsCit9OworCisKKy8qCisgKiBIYXJkd2FyZSBwYXlsb2FkIGRlc2NyaXB0b3IKKyAqCisgKiBCaXRmaWVsZHMgZW5jb2RlZCBpbiBhIHN0cnVjdCB0byBlbmZvcmNlIHR5cGluZyBzZW1hbnRpY3MuCisgKgorICogTG9vayBpbiByeC5jIGFuZCB0eC5jIGZvciBhIGZ1bGwgZGVzY3JpcHRpb24gb2YgdGhlIGZvcm1hdC4KKyAqLworc3RydWN0IGkyNDAwbV9wbGQgeworCV9fbGUzMiB2YWw7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBJMjQwME1fUExEX1NJWkVfTUFTSyAweDAwMDAzZmZmCisjZGVmaW5lIEkyNDAwTV9QTERfVFlQRV9TSElGVCAxNgorI2RlZmluZSBJMjQwME1fUExEX1RZUEVfTUFTSyAweDAwMGYwMDAwCisKKy8qCisgKiBIZWFkZXIgZm9yIGEgVFggbWVzc2FnZSBvciBSWCBtZXNzYWdlCisgKgorICogQGJhcmtlcjogcHJlYW1ibGUKKyAqIEBzaXplOiB1c2VkIGZvciBtYW5hZ2VtZW50IG9mIHRoZSBGSUZPIHF1ZXVlIGJ1ZmZlcjsgYmVmb3JlCisgKiAgICAgc2VuZGluZywgdGhpcyBpcyBjb252ZXJ0ZWQgdG8gYmUgYSByZWFsIHByZWFtYmxlLiBUaGlzCisgKiAgICAgaW5kaWNhdGVzIHRoZSByZWFsIHNpemUgb2YgdGhlIFRYIG1lc3NhZ2UgdGhhdCBzdGFydHMgYXQgdGhpcworICogICAgIHBvaW50LiBJZiB0aGUgaGlnaGVzdCBiaXQgaXMgc2V0LCB0aGVuIHRoaXMgbWVzc2FnZSBpcyB0byBiZQorICogICAgIHNraXBwZWQuCisgKiBAc2VxdWVuY2U6IHNlcXVlbmNlIG51bWJlciBvZiB0aGlzIG1lc3NhZ2UKKyAqIEBvZmZzZXQ6IG9mZnNldCB3aGVyZSB0aGUgbWVzc2FnZSBpdHNlbGYgc3RhcnRzIC0tIHNlZSB0aGUgY29tbWVudHMKKyAqICAgICBpbiB0aGUgZmlsZSBoZWFkZXIgYWJvdXQgbWVzc2FnZSBoZWFkZXIgYW5kIHBheWxvYWQgZGVzY3JpcHRvcgorICogICAgIGFsaWdubWVudC4KKyAqIEBudW1fcGxzOiBudW1iZXIgb2YgcGF5bG9hZHMgaW4gdGhpcyBtZXNzYWdlCisgKiBAcGFkZGluZzogYW1vdW50IG9mIHBhZGRpbmcgYnl0ZXMgYXQgdGhlIGVuZCBvZiB0aGUgbWVzc2FnZSB0byBtYWtlCisgKiAgICAgICAgICAgaXQgYmUgb2YgYmxvY2stc2l6ZSBhbGlnbmVkCisgKgorICogTG9vayBpbiByeC5jIGFuZCB0eC5jIGZvciBhIGZ1bGwgZGVzY3JpcHRpb24gb2YgdGhlIGZvcm1hdC4KKyAqLworc3RydWN0IGkyNDAwbV9tc2dfaGRyIHsKKwl1bmlvbiB7CisJCV9fbGUzMiBiYXJrZXI7CisJCV9fdTMyIHNpemU7CS8qIHNhbWUgc2l6ZSB0eXBlIGFzIGJhcmtlciEhICovCisJfTsKKwl1bmlvbiB7CisJCV9fbGUzMiBzZXF1ZW5jZTsKKwkJX191MzIgb2Zmc2V0OwkvKiBzYW1lIHNpemUgdHlwZSBhcyBiYXJrZXIhISAqLworCX07CisJX19sZTE2IG51bV9wbHM7CisJX19sZTE2IHJzdjE7CisJX19sZTE2IHBhZGRpbmc7CisJX19sZTE2IHJzdjI7CisJc3RydWN0IGkyNDAwbV9wbGQgcGxkWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworCisvKgorICogTDMvTDQgY29udHJvbCBwcm90b2NvbAorICovCisKK2VudW0geworCS8qIEludGVyZmFjZSB2ZXJzaW9uICovCisJSTI0MDBNX0wzTDRfVkVSU0lPTiAgICAgICAgICAgICA9IDB4MDEwMCwKK307CisKKy8qIE1lc3NhZ2UgdHlwZXMgKi8KK2VudW0gaTI0MDBtX210IHsKKwlJMjQwME1fTVRfUkVTRVJWRUQgICAgICAgICAgICAgID0gMHgwMDAwLAorCUkyNDAwTV9NVF9JTlZBTElEICAgICAgICAgICAgICAgPSAweGZmZmYsCisJSTI0MDBNX01UX1JFUE9SVF9NQVNLCQk9IDB4ODAwMCwKKworCUkyNDAwTV9NVF9HRVRfU0NBTl9SRVNVTFQgIAk9IDB4NDIwMiwKKwlJMjQwME1fTVRfU0VUX1NDQU5fUEFSQU0gICAJPSAweDQ0MDIsCisJSTI0MDBNX01UX0NNRF9SRl9DT05UUk9MICAgCT0gMHg0NjAyLAorCUkyNDAwTV9NVF9DTURfU0NBTiAgICAgICAgIAk9IDB4NDYwMywKKwlJMjQwME1fTVRfQ01EX0NPTk5FQ1QgICAgICAJPSAweDQ2MDQsCisJSTI0MDBNX01UX0NNRF9ESVNDT05ORUNUICAgCT0gMHg0NjA1LAorCUkyNDAwTV9NVF9DTURfRVhJVF9JRExFICAgCT0gMHg0NjA2LAorCUkyNDAwTV9NVF9HRVRfTE1fVkVSU0lPTiAgIAk9IDB4NTIwMSwKKwlJMjQwME1fTVRfR0VUX0RFVklDRV9JTkZPICAJPSAweDUyMDIsCisJSTI0MDBNX01UX0dFVF9MSU5LX1NUQVRVUyAgCT0gMHg1MjAzLAorCUkyNDAwTV9NVF9HRVRfU1RBVElTVElDUyAgIAk9IDB4NTIwNCwKKwlJMjQwME1fTVRfR0VUX1NUQVRFICAgICAgICAJPSAweDUyMDUsCisJSTI0MDBNX01UX0dFVF9NRURJQV9TVEFUVVMJPSAweDUyMDYsCisJSTI0MDBNX01UX1NFVF9JTklUX0NPTkZJRwk9IDB4NTQwNCwKKwlJMjQwME1fTVRfQ01EX0lOSVQJICAgICAgICA9IDB4NTYwMSwKKwlJMjQwME1fTVRfQ01EX1RFUk1JTkFURQkJPSAweDU2MDIsCisJSTI0MDBNX01UX0NNRF9NT0RFX09GX09QCT0gMHg1NjAzLAorCUkyNDAwTV9NVF9DTURfUkVTRVRfREVWSUNFCT0gMHg1NjA0LAorCUkyNDAwTV9NVF9DTURfTU9OSVRPUl9DT05UUk9MICAgPSAweDU2MDUsCisJSTI0MDBNX01UX0NNRF9FTlRFUl9QT1dFUlNBVkUgICA9IDB4NTYwNiwKKwlJMjQwME1fTVRfR0VUX1RMU19PUEVSQVRJT05fUkVTVUxUID0gMHg2MjAxLAorCUkyNDAwTV9NVF9TRVRfRUFQX1NVQ0NFU1MgICAgICAgPSAweDY0MDIsCisJSTI0MDBNX01UX1NFVF9FQVBfRkFJTCAgICAgICAgICA9IDB4NjQwMywKKwlJMjQwME1fTVRfU0VUX0VBUF9LRVkgICAgICAgICAgCT0gMHg2NDA0LAorCUkyNDAwTV9NVF9DTURfU0VORF9FQVBfUkVTUE9OU0UgPSAweDY2MDIsCisJSTI0MDBNX01UX1JFUE9SVF9TQ0FOX1JFU1VMVCAgICA9IDB4YzAwMiwKKwlJMjQwME1fTVRfUkVQT1JUX1NUQVRFCQk9IDB4ZDAwMiwKKwlJMjQwME1fTVRfUkVQT1JUX1BPV0VSU0FWRV9SRUFEWSA9IDB4ZDAwNSwKKwlJMjQwME1fTVRfUkVQT1JUX0VBUF9SRVFVRVNUICAgID0gMHhlMDAyLAorCUkyNDAwTV9NVF9SRVBPUlRfRUFQX1JFU1RBUlQgICAgPSAweGUwMDMsCisJSTI0MDBNX01UX1JFUE9SVF9BTFRfQUNDRVBUICAgIAk9IDB4ZTAwNCwKKwlJMjQwME1fTVRfUkVQT1JUX0tFWV9SRVFVRVNUIAk9IDB4ZTAwNSwKK307CisKKworLyoKKyAqIE1lc3NhZ2UgQWNrIFN0YXR1cyBjb2RlcworICoKKyAqIFdoZW4gYSBtZXNzYWdlIGlzIHJlcGxpZWQtdG8sIHRoaXMgc3RhdHVzIGlzIHJlcG9ydGVkLgorICovCitlbnVtIGkyNDAwbV9tcyB7CisJSTI0MDBNX01TX0RPTkVfT0sgICAgICAgICAgICAgICAgICA9IDAsCisJSTI0MDBNX01TX0RPTkVfSU5fUFJPR1JFU1MgICAgICAgICA9IDEsCisJSTI0MDBNX01TX0lOVkFMSURfT1AgICAgICAgICAgICAgICA9IDIsCisJSTI0MDBNX01TX0JBRF9TVEFURSAgICAgICAgICAgICAgICA9IDMsCisJSTI0MDBNX01TX0lMTEVHQUxfVkFMVUUgICAgICAgICAgICA9IDQsCisJSTI0MDBNX01TX01JU1NJTkdfUEFSQU1TICAgICAgICAgICA9IDUsCisJSTI0MDBNX01TX1ZFUlNJT05fRVJST1IgICAgICAgICAgICA9IDYsCisJSTI0MDBNX01TX0FDQ0VTU0lCSUxJVFlfRVJST1IgICAgICA9IDcsCisJSTI0MDBNX01TX0JVU1kgICAgICAgICAgICAgICAgICAgICA9IDgsCisJSTI0MDBNX01TX0NPUlJVUFRFRF9UTFYgICAgICAgICAgICA9IDksCisJSTI0MDBNX01TX1VOSU5JVElBTElaRUQgICAgICAgICAgICA9IDEwLAorCUkyNDAwTV9NU19VTktOT1dOX0VSUk9SICAgICAgICAgICAgPSAxMSwKKwlJMjQwME1fTVNfUFJPRFVDVElPTl9FUlJPUiAgICAgICAgID0gMTIsCisJSTI0MDBNX01TX05PX1JGICAgICAgICAgICAgICAgICAgICA9IDEzLAorCUkyNDAwTV9NU19OT1RfUkVBRFlfRk9SX1BPV0VSU0FWRSAgPSAxNCwKKwlJMjQwME1fTVNfVEhFUk1BTF9DUklUSUNBTCAgICAgICAgID0gMTUsCisJSTI0MDBNX01TX01BWAorfTsKKworCisvKioKKyAqIGkyNDAwbV90bHYgLSBlbnVtZXJhdGlvbiBvZiB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIFRMVnMKKyAqCisgKiBUTFZzIHN0YW5kIGZvciB0eXBlLWxlbmd0aC12YWx1ZSBhbmQgYXJlIHRoZSBoZWFkZXIgZm9yIGEgcGF5bG9hZAorICogY29tcG9zZWQgb2YgYWxtb3N0IGFueXRoaW5nLiBFYWNoIHBheWxvYWQgaGFzIGEgdHlwZSBhc3NpZ25lZAorICogYW5kIGEgbGVuZ3RoLgorICovCitlbnVtIGkyNDAwbV90bHYgeworCUkyNDAwTV9UTFZfTDRfTUVTU0FHRV9WRVJTSU9OUyA9IDEyOSwKKwlJMjQwME1fVExWX1NZU1RFTV9TVEFURSA9IDE0MSwKKwlJMjQwME1fVExWX01FRElBX1NUQVRVUyA9IDE2MSwKKwlJMjQwME1fVExWX1JGX09QRVJBVElPTiA9IDE2MiwKKwlJMjQwME1fVExWX1JGX1NUQVRVUyA9IDE2MywKKwlJMjQwME1fVExWX0RFVklDRV9SRVNFVF9UWVBFID0gMTMyLAorCUkyNDAwTV9UTFZfQ09ORklHX0lETEVfUEFSQU1FVEVSUyA9IDYwMSwKK307CisKKworc3RydWN0IGkyNDAwbV90bHZfaGRyIHsKKwlfX2xlMTYgdHlwZTsKKwlfX2xlMTYgbGVuZ3RoOwkJLyogcGF5bG9hZCdzICovCisJX191OCAgIHBsWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCitzdHJ1Y3QgaTI0MDBtX2wzbDRfaGRyIHsKKwlfX2xlMTYgdHlwZTsKKwlfX2xlMTYgbGVuZ3RoOwkJLyogcGF5bG9hZCdzICovCisJX19sZTE2IHZlcnNpb247CisJX19sZTE2IHJlc3YxOworCV9fbGUxNiBzdGF0dXM7CisJX19sZTE2IHJlc3YyOworCXN0cnVjdCBpMjQwMG1fdGx2X2hkciBwbFswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworLyoqCisgKiBpMjQwMG1fc3lzdGVtX3N0YXRlIC0gZGlmZmVyZW50IHN0YXRlcyBvZiB0aGUgZGV2aWNlCisgKi8KK2VudW0gaTI0MDBtX3N5c3RlbV9zdGF0ZSB7CisJSTI0MDBNX1NTX1VOSU5JVElBTElaRUQgPSAxLAorCUkyNDAwTV9TU19JTklULAorCUkyNDAwTV9TU19SRUFEWSwKKwlJMjQwME1fU1NfU0NBTiwKKwlJMjQwME1fU1NfU1RBTkRCWSwKKwlJMjQwME1fU1NfQ09OTkVDVElORywKKwlJMjQwME1fU1NfV0lNQVhfQ09OTkVDVEVELAorCUkyNDAwTV9TU19EQVRBX1BBVEhfQ09OTkVDVEVELAorCUkyNDAwTV9TU19JRExFLAorCUkyNDAwTV9TU19ESVNDT05ORUNUSU5HLAorCUkyNDAwTV9TU19PVVRfT0ZfWk9ORSwKKwlJMjQwME1fU1NfU0xFRVBBQ1RJVkUsCisJSTI0MDBNX1NTX1BST0RVQ1RJT04sCisJSTI0MDBNX1NTX0NPTkZJRywKKwlJMjQwME1fU1NfUkZfT0ZGLAorCUkyNDAwTV9TU19SRl9TSFVURE9XTiwKKwlJMjQwME1fU1NfREVWSUNFX0RJU0NPTk5FQ1QsCisJSTI0MDBNX1NTX01BWCwKK307CisKKworLyoqCisgKiBpMjQwMG1fdGx2X3N5c3RlbV9zdGF0ZSAtIHJlcG9ydCBvbiB0aGUgc3RhdGUgb2YgdGhlIHN5c3RlbQorICoKKyAqIEBzdGF0ZTogc2VlIGVudW0gaTI0MDBtX3N5c3RlbV9zdGF0ZQorICovCitzdHJ1Y3QgaTI0MDBtX3Rsdl9zeXN0ZW1fc3RhdGUgeworCXN0cnVjdCBpMjQwMG1fdGx2X2hkciBoZHI7CisJX19sZTMyIHN0YXRlOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCitzdHJ1Y3QgaTI0MDBtX3Rsdl9sNF9tZXNzYWdlX3ZlcnNpb25zIHsKKwlzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIgaGRyOworCV9fbGUxNiBtYWpvcjsKKwlfX2xlMTYgbWlub3I7CisJX19sZTE2IGJyYW5jaDsKKwlfX2xlMTYgcmVzZXJ2ZWQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKK3N0cnVjdCBpMjQwMG1fdGx2X2RldGFpbGVkX2RldmljZV9pbmZvIHsKKwlzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIgaGRyOworCV9fdTggcmVzZXJ2ZWQxWzQwMF07CisJX191OCBtYWNfYWRkcmVzc1s2XTsKKwlfX3U4IHJlc2VydmVkMlsyXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworZW51bSBpMjQwMG1fcmZfc3dpdGNoX3N0YXR1cyB7CisJSTI0MDBNX1JGX1NXSVRDSF9PTiA9IDEsCisJSTI0MDBNX1JGX1NXSVRDSF9PRkYgPSAyLAorfTsKKworc3RydWN0IGkyNDAwbV90bHZfcmZfc3dpdGNoZXNfc3RhdHVzIHsKKwlzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIgaGRyOworCV9fdTggc3dfcmZfc3dpdGNoOwkvKiAxIE9OLCAyIE9GRiAqLworCV9fdTggaHdfcmZfc3dpdGNoOwkvKiAxIE9OLCAyIE9GRiAqLworCV9fdTggcmVzZXJ2ZWRbMl07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKK2VudW0geworCWkyNDAwbV9yZl9vcGVyYXRpb25fb24gPSAxLAorCWkyNDAwbV9yZl9vcGVyYXRpb25fb2ZmID0gMgorfTsKKworc3RydWN0IGkyNDAwbV90bHZfcmZfb3BlcmF0aW9uIHsKKwlzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIgaGRyOworCV9fbGUzMiBzdGF0dXM7CS8qIDEgT04sIDIgT0ZGICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKK2VudW0gaTI0MDBtX3Rsdl9yZXNldF90eXBlIHsKKwlJMjQwME1fUkVTRVRfVFlQRV9DT0xEID0gMSwKKwlJMjQwME1fUkVTRVRfVFlQRV9XQVJNCit9OworCitzdHJ1Y3QgaTI0MDBtX3Rsdl9kZXZpY2VfcmVzZXRfdHlwZSB7CisJc3RydWN0IGkyNDAwbV90bHZfaGRyIGhkcjsKKwlfX2xlMzIgcmVzZXRfdHlwZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworc3RydWN0IGkyNDAwbV90bHZfY29uZmlnX2lkbGVfcGFyYW1ldGVycyB7CisJc3RydWN0IGkyNDAwbV90bHZfaGRyIGhkcjsKKwlfX2xlMzIgaWRsZV90aW1lb3V0OwkvKiAxMDAgdG8gMzAwMDAwIG1zIFs1bWluXSwgMTAwIGluY3JlbWVudHMKKwkJCQkgKiAwIGRpc2FibGVkICovCisJX19sZTMyIGlkbGVfcGFnaW5nX2ludGVydmFsOwkvKiBmcmFtZXMgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworZW51bSBpMjQwMG1fbWVkaWFfc3RhdHVzIHsKKwlJMjQwME1fTUVESUFfU1RBVFVTX0xJTktfVVAgPSAxLAorCUkyNDAwTV9NRURJQV9TVEFUVVNfTElOS19ET1dOLAorCUkyNDAwTV9NRURJQV9TVEFUVVNfTElOS19SRU5FVywKK307CisKK3N0cnVjdCBpMjQwMG1fdGx2X21lZGlhX3N0YXR1cyB7CisJc3RydWN0IGkyNDAwbV90bHZfaGRyIGhkcjsKKwlfX2xlMzIgbWVkaWFfc3RhdHVzOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2VuZGlmIC8qICNpZm5kZWYgX19MSU5VWF9fV0lNQVhfX0kyNDAwTV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvd3JpdGViYWNrLmggYi9pbmNsdWRlL2xpbnV4L3dyaXRlYmFjay5oCmluZGV4IGU1ODU2NTcuLjczMDBlY2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvd3JpdGViYWNrLmgKKysrIGIvaW5jbHVkZS9saW51eC93cml0ZWJhY2suaApAQCAtMzAsNyArMzAsNiBAQAogZW51bSB3cml0ZWJhY2tfc3luY19tb2RlcyB7CiAJV0JfU1lOQ19OT05FLAkvKiBEb24ndCB3YWl0IG9uIGFueXRoaW5nICovCiAJV0JfU1lOQ19BTEwsCS8qIFdhaXQgb24gZXZlcnkgbWFwcGluZyAqLwotCVdCX1NZTkNfSE9MRCwJLyogSG9sZCB0aGUgaW5vZGUgb24gc2JfZGlydHkgZm9yIHN5c19zeW5jKCkgKi8KIH07CiAKIC8qCkBAIC0xMDcsNyArMTA2LDkgQEAKIAogLyogVGhlc2UgYXJlIGV4cG9ydGVkIHRvIHN5c2N0bC4gKi8KIGV4dGVybiBpbnQgZGlydHlfYmFja2dyb3VuZF9yYXRpbzsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGRpcnR5X2JhY2tncm91bmRfYnl0ZXM7CiBleHRlcm4gaW50IHZtX2RpcnR5X3JhdGlvOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdm1fZGlydHlfYnl0ZXM7CiBleHRlcm4gaW50IGRpcnR5X3dyaXRlYmFja19pbnRlcnZhbDsKIGV4dGVybiBpbnQgZGlydHlfZXhwaXJlX2ludGVydmFsOwogZXh0ZXJuIGludCB2bV9oaWdobWVtX2lzX2RpcnR5YWJsZTsKQEAgLTExNiwxNyArMTE3LDI2IEBACiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGRldGVybWluZV9kaXJ0eWFibGVfbWVtb3J5KHZvaWQpOwogCitleHRlcm4gaW50IGRpcnR5X2JhY2tncm91bmRfcmF0aW9faGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAorCQlzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLAorCQlsb2ZmX3QgKnBwb3MpOworZXh0ZXJuIGludCBkaXJ0eV9iYWNrZ3JvdW5kX2J5dGVzX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKKwkJc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwKKwkJbG9mZl90ICpwcG9zKTsKIGV4dGVybiBpbnQgZGlydHlfcmF0aW9faGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAogCQlzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLAogCQlsb2ZmX3QgKnBwb3MpOworZXh0ZXJuIGludCBkaXJ0eV9ieXRlc19oYW5kbGVyKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCisJCXN0cnVjdCBmaWxlICpmaWxwLCB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsCisJCWxvZmZfdCAqcHBvcyk7CiAKIHN0cnVjdCBjdGxfdGFibGU7CiBzdHJ1Y3QgZmlsZTsKIGludCBkaXJ0eV93cml0ZWJhY2tfY2VudGlzZWNzX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqLCBpbnQsIHN0cnVjdCBmaWxlICosCiAJCQkJICAgICAgdm9pZCBfX3VzZXIgKiwgc2l6ZV90ICosIGxvZmZfdCAqKTsKIAotdm9pZCBnZXRfZGlydHlfbGltaXRzKGxvbmcgKnBiYWNrZ3JvdW5kLCBsb25nICpwZGlydHksIGxvbmcgKnBiZGlfZGlydHksCi0JCSBzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpKTsKK3ZvaWQgZ2V0X2RpcnR5X2xpbWl0cyh1bnNpZ25lZCBsb25nICpwYmFja2dyb3VuZCwgdW5zaWduZWQgbG9uZyAqcGRpcnR5LAorCQkgICAgICB1bnNpZ25lZCBsb25nICpwYmRpX2RpcnR5LCBzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpKTsKIAogdm9pZCBwYWdlX3dyaXRlYmFja19pbml0KHZvaWQpOwogdm9pZCBiYWxhbmNlX2RpcnR5X3BhZ2VzX3JhdGVsaW1pdGVkX25yKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tdGQvdWJpLXVzZXIuaCBiL2luY2x1ZGUvbXRkL3ViaS11c2VyLmgKaW5kZXggY2NkYzU2Mi4uMmRjMmViMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tdGQvdWJpLXVzZXIuaAorKysgYi9pbmNsdWRlL210ZC91YmktdXNlci5oCkBAIC0yNTMsNyArMjUzLDcgQEAKICAqCiAgKiBSZS1zaXppbmcgaXMgcG9zc2libGUgZm9yIGJvdGggZHluYW1pYyBhbmQgc3RhdGljIHZvbHVtZXMuIEJ1dCB3aGlsZSBkeW5hbWljCiAgKiB2b2x1bWVzIG1heSBiZSByZS1zaXplZCBhcmJpdHJhcmlseSwgc3RhdGljIHZvbHVtZXMgY2Fubm90IGJlIG1hZGUgdG8gYmUKLSAqIHNtYWxsZXIgdGhlbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoZXkgYmVhci4gVG8gYXJiaXRyYXJpbHkgc2hyaW5rIGEgc3RhdGljCisgKiBzbWFsbGVyIHRoYW4gdGhlIG51bWJlciBvZiBieXRlcyB0aGV5IGJlYXIuIFRvIGFyYml0cmFyaWx5IHNocmluayBhIHN0YXRpYwogICogdm9sdW1lLCBpdCBtdXN0IGJlIHdpcGVkIG91dCBmaXJzdCAoYnkgbWVhbnMgb2Ygdm9sdW1lIHVwZGF0ZSBvcGVyYXRpb24gd2l0aAogICogemVybyBudW1iZXIgb2YgYnl0ZXMpLgogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9jaXBzb19pcHY0LmggYi9pbmNsdWRlL25ldC9jaXBzb19pcHY0LmgKaW5kZXggOTkwOTc3NC4uYmVkYzdmNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvY2lwc29faXB2NC5oCisrKyBiL2luY2x1ZGUvbmV0L2NpcHNvX2lwdjQuaApAQCAtMTMxLDcgKzEzMSw4IEBACiAgKi8KIAogI2lmZGVmIENPTkZJR19ORVRMQUJFTAotaW50IGNpcHNvX3Y0X2RvaV9hZGQoc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZik7CitpbnQgY2lwc29fdjRfZG9pX2FkZChzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmLAorCQkgICAgIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pOwogdm9pZCBjaXBzb192NF9kb2lfZnJlZShzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmKTsKIGludCBjaXBzb192NF9kb2lfcmVtb3ZlKHUzMiBkb2ksIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pOwogc3RydWN0IGNpcHNvX3Y0X2RvaSAqY2lwc29fdjRfZG9pX2dldGRlZih1MzIgZG9pKTsKQEAgLTE0MCw3ICsxNDEsOCBAQAogCQkgICAgIGludCAoKmNhbGxiYWNrKSAoc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZiwgdm9pZCAqYXJnKSwKIAkgICAgICAgICAgICAgdm9pZCAqY2JfYXJnKTsKICNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBjaXBzb192NF9kb2lfYWRkKHN0cnVjdCBjaXBzb192NF9kb2kgKmRvaV9kZWYpCitzdGF0aWMgaW5saW5lIGludCBjaXBzb192NF9kb2lfYWRkKHN0cnVjdCBjaXBzb192NF9kb2kgKmRvaV9kZWYsCisJCQkJICAgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbykKIHsKIAlyZXR1cm4gLUVOT1NZUzsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25kaXNjLmggYi9pbmNsdWRlL25ldC9uZGlzYy5oCmluZGV4IGNlNTMyZjIuLjE0NTllZDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25kaXNjLmgKKysrIGIvaW5jbHVkZS9uZXQvbmRpc2MuaApAQCAtMTU1LDkgKzE1NSw5IEBACiB7CiAKIAlpZiAoZGV2KQotCQlyZXR1cm4gX19uZWlnaF9sb29rdXAoJm5kX3RibCwgYWRkciwgZGV2LCAxKTsKKwkJcmV0dXJuIF9fbmVpZ2hfbG9va3VwX2Vycm5vKCZuZF90YmwsIGFkZHIsIGRldik7CiAKLQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKIH0KIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRkbWEuaCBiL2luY2x1ZGUvbmV0L25ldGRtYS5oCmluZGV4IGYyOGM2ZTAuLjhiYThjZTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGRtYS5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGRtYS5oCkBAIC0yNCwxNyArMjQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBkbWFfY2hhbiAqZ2V0X3NvZnRuZXRfZG1hKHZvaWQpCi17Ci0Jc3RydWN0IGRtYV9jaGFuICpjaGFuOwotCXJjdV9yZWFkX2xvY2soKTsKLQljaGFuID0gcmN1X2RlcmVmZXJlbmNlKF9fZ2V0X2NwdV92YXIoc29mdG5ldF9kYXRhKS5uZXRfZG1hKTsKLQlpZiAoY2hhbikKLQkJZG1hX2NoYW5fZ2V0KGNoYW4pOwotCXJjdV9yZWFkX3VubG9jaygpOwotCXJldHVybiBjaGFuOwotfQotCiBpbnQgZG1hX3NrYl9jb3B5X2RhdGFncmFtX2lvdmVjKHN0cnVjdCBkbWFfY2hhbiogY2hhbiwKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG9mZnNldCwgc3RydWN0IGlvdmVjICp0bywKIAkJc2l6ZV90IGxlbiwgc3RydWN0IGRtYV9waW5uZWRfbGlzdCAqcGlubmVkX2xpc3QpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0bGFiZWwuaCBiL2luY2x1ZGUvbmV0L25ldGxhYmVsLmgKaW5kZXggMTdjNDQyYS4uNzQ5MDExZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0bGFiZWwuaAorKysgYi9pbmNsdWRlL25ldC9uZXRsYWJlbC5oCkBAIC0zMyw2ICszMyw4IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXQuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgogI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogCkBAIC0zNTMsMTMgKzM1NSwzNyBAQAogLyoKICAqIExTTSBjb25maWd1cmF0aW9uIG9wZXJhdGlvbnMKICAqLwotaW50IG5ldGxibF9jZmdfbWFwX2RlbChjb25zdCBjaGFyICpkb21haW4sIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pOwotaW50IG5ldGxibF9jZmdfdW5sYmxfYWRkX21hcChjb25zdCBjaGFyICpkb21haW4sCitpbnQgbmV0bGJsX2NmZ19tYXBfZGVsKGNvbnN0IGNoYXIgKmRvbWFpbiwKKwkJICAgICAgIHUxNiBmYW1pbHksCisJCSAgICAgICBjb25zdCB2b2lkICphZGRyLAorCQkgICAgICAgY29uc3Qgdm9pZCAqbWFzaywKKwkJICAgICAgIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pOworaW50IG5ldGxibF9jZmdfdW5sYmxfbWFwX2FkZChjb25zdCBjaGFyICpkb21haW4sCisJCQkgICAgIHUxNiBmYW1pbHksCisJCQkgICAgIGNvbnN0IHZvaWQgKmFkZHIsCisJCQkgICAgIGNvbnN0IHZvaWQgKm1hc2ssCiAJCQkgICAgIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pOwotaW50IG5ldGxibF9jZmdfY2lwc292NF9hZGRfbWFwKHN0cnVjdCBjaXBzb192NF9kb2kgKmRvaV9kZWYsCitpbnQgbmV0bGJsX2NmZ191bmxibF9zdGF0aWNfYWRkKHN0cnVjdCBuZXQgKm5ldCwKKwkJCQljb25zdCBjaGFyICpkZXZfbmFtZSwKKwkJCQljb25zdCB2b2lkICphZGRyLAorCQkJCWNvbnN0IHZvaWQgKm1hc2ssCisJCQkJdTE2IGZhbWlseSwKKwkJCQl1MzIgc2VjaWQsCisJCQkJc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbyk7CitpbnQgbmV0bGJsX2NmZ191bmxibF9zdGF0aWNfZGVsKHN0cnVjdCBuZXQgKm5ldCwKKwkJCQljb25zdCBjaGFyICpkZXZfbmFtZSwKKwkJCQljb25zdCB2b2lkICphZGRyLAorCQkJCWNvbnN0IHZvaWQgKm1hc2ssCisJCQkJdTE2IGZhbWlseSwKKwkJCQlzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKTsKK2ludCBuZXRsYmxfY2ZnX2NpcHNvdjRfYWRkKHN0cnVjdCBjaXBzb192NF9kb2kgKmRvaV9kZWYsCisJCQkgICBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKTsKK3ZvaWQgbmV0bGJsX2NmZ19jaXBzb3Y0X2RlbCh1MzIgZG9pLCBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKTsKK2ludCBuZXRsYmxfY2ZnX2NpcHNvdjRfbWFwX2FkZCh1MzIgZG9pLAogCQkJICAgICAgIGNvbnN0IGNoYXIgKmRvbWFpbiwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciAqYWRkciwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciAqbWFzaywKIAkJCSAgICAgICBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKTsKLQogLyoKICAqIExTTSBzZWN1cml0eSBhdHRyaWJ1dGUgb3BlcmF0aW9ucwogICovCkBAIC00MDEsMTkgKzQyNyw2MiBAQAogdm9pZCBuZXRsYmxfY2FjaGVfaW52YWxpZGF0ZSh2b2lkKTsKIGludCBuZXRsYmxfY2FjaGVfYWRkKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCiAJCSAgICAgY29uc3Qgc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciAqc2VjYXR0cik7CisKKy8qCisgKiBQcm90b2NvbCBlbmdpbmUgb3BlcmF0aW9ucworICovCitzdHJ1Y3QgYXVkaXRfYnVmZmVyICpuZXRsYmxfYXVkaXRfc3RhcnQoaW50IHR5cGUsCisJCQkJCXN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgaW50IG5ldGxibF9jZmdfbWFwX2RlbChjb25zdCBjaGFyICpkb21haW4sCisJCQkJICAgICB1MTYgZmFtaWx5LAorCQkJCSAgICAgY29uc3Qgdm9pZCAqYWRkciwKKwkJCQkgICAgIGNvbnN0IHZvaWQgKm1hc2ssCiAJCQkJICAgICBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKQogewogCXJldHVybiAtRU5PU1lTOwogfQotc3RhdGljIGlubGluZSBpbnQgbmV0bGJsX2NmZ191bmxibF9hZGRfbWFwKGNvbnN0IGNoYXIgKmRvbWFpbiwKK3N0YXRpYyBpbmxpbmUgaW50IG5ldGxibF9jZmdfdW5sYmxfbWFwX2FkZChjb25zdCBjaGFyICpkb21haW4sCisJCQkJCSAgIHUxNiBmYW1pbHksCisJCQkJCSAgIHZvaWQgKmFkZHIsCisJCQkJCSAgIHZvaWQgKm1hc2ssCiAJCQkJCSAgIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pCiB7CiAJcmV0dXJuIC1FTk9TWVM7CiB9Ci1zdGF0aWMgaW5saW5lIGludCBuZXRsYmxfY2ZnX2NpcHNvdjRfYWRkX21hcChzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmLAorc3RhdGljIGlubGluZSBpbnQgbmV0bGJsX2NmZ191bmxibF9zdGF0aWNfYWRkKHN0cnVjdCBuZXQgKm5ldCwKKwkJCQkJICAgICAgY29uc3QgY2hhciAqZGV2X25hbWUsCisJCQkJCSAgICAgIGNvbnN0IHZvaWQgKmFkZHIsCisJCQkJCSAgICAgIGNvbnN0IHZvaWQgKm1hc2ssCisJCQkJCSAgICAgIHUxNiBmYW1pbHksCisJCQkJCSAgICAgIHUzMiBzZWNpZCwKKwkJCQkJICAgICAgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbykKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KK3N0YXRpYyBpbmxpbmUgaW50IG5ldGxibF9jZmdfdW5sYmxfc3RhdGljX2RlbChzdHJ1Y3QgbmV0ICpuZXQsCisJCQkJCSAgICAgIGNvbnN0IGNoYXIgKmRldl9uYW1lLAorCQkJCQkgICAgICBjb25zdCB2b2lkICphZGRyLAorCQkJCQkgICAgICBjb25zdCB2b2lkICptYXNrLAorCQkJCQkgICAgICB1MTYgZmFtaWx5LAorCQkJCQkgICAgICBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKQoreworCXJldHVybiAtRU5PU1lTOworfQorc3RhdGljIGlubGluZSBpbnQgbmV0bGJsX2NmZ19jaXBzb3Y0X2FkZChzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmLAorCQkJCQkgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbykKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBuZXRsYmxfY2ZnX2NpcHNvdjRfZGVsKHUzMiBkb2ksCisJCQkJCSAgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbykKK3sKKwlyZXR1cm47Cit9CitzdGF0aWMgaW5saW5lIGludCBuZXRsYmxfY2ZnX2NpcHNvdjRfbWFwX2FkZCh1MzIgZG9pLAogCQkJCQkgICAgIGNvbnN0IGNoYXIgKmRvbWFpbiwKKwkJCQkJICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciAqYWRkciwKKwkJCQkJICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciAqbWFzaywKIAkJCQkJICAgICBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKQogewogCXJldHVybiAtRU5PU1lTOwpAQCAtNDk1LDYgKzU2NCwxMSBAQAogewogCXJldHVybiAwOwogfQorc3RhdGljIGlubGluZSBzdHJ1Y3QgYXVkaXRfYnVmZmVyICpuZXRsYmxfYXVkaXRfc3RhcnQoaW50IHR5cGUsCisJCQkJCQlzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKQoreworCXJldHVybiBOVUxMOworfQogI2VuZGlmIC8qIENPTkZJR19ORVRMQUJFTCAqLwogCiAjZW5kaWYgLyogX05FVExBQkVMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3Byb3RvY29sLmggYi9pbmNsdWRlL25ldC9wcm90b2NvbC5oCmluZGV4IGNiMjk2NWEuLmZmYTViOGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3Byb3RvY29sLmgKKysrIGIvaW5jbHVkZS9uZXQvcHJvdG9jb2wuaApAQCAtNTksNiArNTksOSBAQAogCWludAkoKmdzb19zZW5kX2NoZWNrKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqKCpnc29fc2VnbWVudCkoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkgICAgICAgaW50IGZlYXR1cmVzKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqKigqZ3JvX3JlY2VpdmUpKHN0cnVjdCBza19idWZmICoqaGVhZCwKKwkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYik7CisJaW50CSgqZ3JvX2NvbXBsZXRlKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAogCXVuc2lnbmVkIGludAlmbGFnczsJLyogSU5FVDZfUFJPVE9feHh4ICovCiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvd2ltYXguaCBiL2luY2x1ZGUvbmV0L3dpbWF4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDczODA5YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmV0L3dpbWF4LmgKQEAgLTAsMCArMSw1MjMgQEAKKy8qCisgKiBMaW51eCBXaU1BWAorICogS2VybmVsIHNwYWNlIEFQSSBmb3IgYWNjZXNzaW5nIFdpTUFYIGRldmljZXMKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggSW50ZWwgQ29ycG9yYXRpb24gPGxpbnV4LXdpbWF4QGludGVsLmNvbT4KKyAqIEluYWt5IFBlcmV6LUdvbnphbGV6IDxpbmFreS5wZXJlei1nb256YWxlekBpbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqCisgKiBUaGUgV2lNQVggc3RhY2sgcHJvdmlkZXMgYW4gQVBJIGZvciBjb250cm9sbGluZyBhbmQgbWFuYWdpbmcgdGhlCisgKiBzeXN0ZW0ncyBXaU1BWCBkZXZpY2VzLiBUaGlzIEFQSSBhZmZlY3RzIHRoZSBjb250cm9sIHBsYW5lOyB0aGUKKyAqIGRhdGEgcGxhbmUgaXMgYWNjZXNzZWQgdmlhIHRoZSBuZXR3b3JrIHN0YWNrIChuZXRkZXYpLgorICoKKyAqIFBhcnRzIG9mIHRoZSBXaU1BWCBzdGFjayBBUEkgYW5kIG5vdGlmaWNhdGlvbnMgYXJlIGV4cG9ydGVkIHRvCisgKiB1c2VyIHNwYWNlIHZpYSBHZW5lcmljIE5ldGxpbmsuIEluIHVzZXIgc3BhY2UsIGxpYndpbWF4IChwYXJ0IG9mCisgKiB0aGUgd2ltYXgtdG9vbHMgcGFja2FnZSkgcHJvdmlkZXMgYSBzaGltIGxheWVyIGZvciBhY2Nlc3NpbmcgdGhvc2UKKyAqIGNhbGxzLgorICoKKyAqIFRoZSBBUEkgaXMgc3RhbmRhcml6ZWQgZm9yIGFsbCBXaU1BWCBkZXZpY2VzIGFuZCBkaWZmZXJlbnQgZHJpdmVycworICogaW1wbGVtZW50IHRoZSBiYWNrZW5kIHN1cHBvcnQgZm9yIGl0LiBIb3dldmVyLCBkZXZpY2Utc3BlY2lmaWMKKyAqIG1lc3NhZ2luZyBwaXBlcyBhcmUgcHJvdmlkZWQgdGhhdCBjYW4gYmUgdXNlZCB0byBpc3N1ZSBjb21tYW5kcyBhbmQKKyAqIHJlY2VpdmUgbm90aWZpY2F0aW9ucyBpbiBmcmVlIGZvcm0uCisgKgorICogQ3VycmVudGx5IHRoZSBtZXNzYWdpbmcgcGlwZXMgYXJlIHRoZSBvbmx5IG1lYW5zIG9mIGNvbnRyb2wgYXMgaXQKKyAqIGlzIG5vdCBrbm93biAoZHVlIHRvIHRoZSBsYWNrIG9mIG1vcmUgZGV2aWNlcyBpbiB0aGUgbWFya2V0KSB3aGF0CisgKiB3aWxsIGJlIGEgZ29vZCBhYnN0cmFjdGlvbiBsYXllci4gRXhwZWN0IHRoaXMgdG8gY2hhbmdlIGFzIG1vcmUKKyAqIGRldmljZXMgc2hvdyBpbiB0aGUgbWFya2V0LiBUaGlzIEFQSSBpcyBkZXNpZ25lZCB0byBiZSBncm93YWJsZSBpbgorICogb3JkZXIgdG8gYWRkcmVzcyB0aGlzIHByb2JsZW0uCisgKgorICogVVNBR0UKKyAqCisgKiBFbWJlZCBhIGBzdHJ1Y3Qgd2ltYXhfZGV2YCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0aGUgZGV2aWNlJ3MKKyAqIHByaXZhdGUgc3RydWN0dXJlLCBpbml0aWFsaXplIGFuZCByZWdpc3RlciBpdC4gRm9yIGRldGFpbHMsIHNlZQorICogYHN0cnVjdCB3aW1heF9kZXZgcyBkb2N1bWVudGF0aW9uLgorICoKKyAqIE9uY2UgdGhpcyBpcyBkb25lLCB3aW1heC10b29scydzIGxpYndpbWF4bGwgY2FuIGJlIHVzZWQgdG8KKyAqIGNvbW11bmljYXRlIHdpdGggdGhlIGRyaXZlciBmcm9tIHVzZXIgc3BhY2UuIFlvdSB1c2VyIHNwYWNlCisgKiBhcHBsaWNhdGlvbiBkb2VzIG5vdCBoYXZlIHRvIGZvcmNpYmlseSB1c2UgbGlid2ltYXhsbCBhbmQgY2FuIHRhbGsKKyAqIHRoZSBnZW5lcmljIG5ldGxpbmsgcHJvdG9jb2wgZGlyZWN0bHkgaWYgZGVzaXJlZC4KKyAqCisgKiBSZW1lbWJlciB0aGlzIGlzIGEgdmVyeSBsb3cgbGV2ZWwgQVBJIHRoYXQgd2lsbCB0byBwcm92aWRlIGFsbCBvZgorICogV2lNQVggZmVhdHVyZXMuIE90aGVyIGRhZW1vbnMgYW5kIHNlcnZpY2VzIHJ1bm5pbmcgaW4gdXNlciBzcGFjZQorICogYXJlIHRoZSBleHBlY3RlZCBjbGllbnRzIG9mIGl0LiBUaGV5IG9mZmVyIGEgaGlnaGVyIGxldmVsIEFQSSB0aGF0CisgKiBhcHBsaWNhdGlvbnMgc2hvdWxkIHVzZSAoYW4gZXhhbXBsZSBvZiB0aGlzIGlzIHRoZSBJbnRlbCdzIFdpTUFYCisgKiBOZXR3b3JrIFNlcnZpY2UgZm9yIHRoZSBpMjQwMG0pLgorICoKKyAqIERFU0lHTgorICoKKyAqIEFsdGhvdWdoIG5vdCBzZXQgb24gZmluYWwgc3RvbmUsIHRoaXMgdmVyeSBiYXNpYyBpbnRlcmZhY2UgaXMKKyAqIG1vc3RseSBjb21wbGV0ZWQuIFJlbWVtYmVyIHRoaXMgaXMgbWVhbnQgdG8gZ3JvdyBhcyBuZXcgY29tbW9uCisgKiBvcGVyYXRpb25zIGFyZSBkZWNpZGVkIHVwb24uIE5ldyBvcGVyYXRpb25zIHdpbGwgYmUgYWRkZWQgdG8gdGhlCisgKiBpbnRlcmZhY2UsIGludGVudCBiZWluZyBvbiBrZWVwaW5nIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGFzIG11Y2gKKyAqIGFzIHBvc3NpYmxlLgorICoKKyAqIFRoaXMgbGF5ZXIgaW1wbGVtZW50cyBhIHNldCBvZiBjYWxscyB0byBjb250cm9sIGEgV2lNQVggZGV2aWNlLAorICogZXhwb3NpbmcgYSBmcm9udGVuZCB0byB0aGUgcmVzdCBvZiB0aGUga2VybmVsIGFuZCB1c2VyIHNwYWNlICh2aWEKKyAqIGdlbmVyaWMgbmV0bGluaykgYW5kIGEgYmFja2VuZCBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgZHJpdmVyIHRocm91Z2gKKyAqIGZ1bmN0aW9uIHBvaW50ZXJzLgorICoKKyAqIFdpTUFYIGRldmljZXMgaGF2ZSBhIHN0YXRlLCBhbmQgYSBrZXJuZWwtb25seSBBUEkgYWxsb3dzIHRoZQorICogZHJpdmVycyB0byBtYW5pcHVsYXRlIHRoYXQgc3RhdGUuIFN0YXRlIHRyYW5zaXRpb25zIGFyZSBhdG9taWMsIGFuZAorICogb25seSBzb21lIG9mIHRoZW0gYXJlIGFsbG93ZWQgKHNlZSBgZW51bSB3aW1heF9zdGApLgorICoKKyAqIE1vc3QgQVBJIGNhbGxzIHdpbGwgc2V0IHRoZSBzdGF0ZSBhdXRvbWF0aWNhbGx5OyBpbiBtb3N0IGNhc2VzCisgKiBkcml2ZXJzIGhhdmUgdG8gb25seSByZXBvcnQgc3RhdGUgY2hhbmdlcyBkdWUgdG8gZXh0ZXJuYWwKKyAqIGNvbmRpdGlvbnMuCisgKgorICogQWxsIEFQSSBvcGVyYXRpb25zIGFyZSAnYXRvbWljJywgc2VyaWFsaXplZCB0aG9yb3VnaCBhIG11dGV4IGluIHRoZQorICogYHN0cnVjdCB3aW1heF9kZXZgLgorICoKKyAqIEVYUE9SVElORyBUTyBVU0VSIFNQQUNFIFRIUk9VR0ggR0VORVJJQyBORVRMSU5LCisgKgorICogVGhlIEFQSSBpcyBleHBvcnRlZCB0byB1c2VyIHNwYWNlIHVzaW5nIGdlbmVyaWMgbmV0bGluayAob3RoZXIKKyAqIG1ldGhvZHMgY2FuIGJlIGFkZGVkIGFzIG5lZWRlZCkuCisgKgorICogVGhlcmUgaXMgYSBHZW5lcmljIE5ldGxpbmsgRmFtaWx5IG5hbWVkICJXaU1BWCIsIHdoZXJlIGludGVyZmFjZXMKKyAqIHN1cHBvcnRpbmcgdGhlIFdpTUFYIGludGVyZmFjZSByZWNlaXZlIGNvbW1hbmRzIGFuZCBicm9hZGNhc3QgdGhlaXIKKyAqIHNpZ25hbHMgb3ZlciBhIG11bHRpY2FzdCBncm91cCBuYW1lZCAibXNnIi4KKyAqCisgKiBNYXBwaW5nIHRvIHRoZSBzb3VyY2UvZGVzdGluYXRpb24gaW50ZXJmYWNlIGlzIGRvbmUgYnkgYW4gaW50ZXJmYWNlCisgKiBpbmRleCBhdHRyaWJ1dGUuCisgKgorICogRm9yIHVzZXItdG8ta2VybmVsIHRyYWZmaWMgKGNvbW1hbmRzKSB3ZSB1c2UgYSBmdW5jdGlvbiBjYWxsCisgKiBtYXJzaGFsbGluZyBtZWNoYW5pc20sIHdoZXJlIGEgbWVzc2FnZSBYIHdpdGggYXR0cmlidXRlcyBBLCBCLCBDCisgKiBzZW50IGZyb20gdXNlciBzcGFjZSB0byBrZXJuZWwgc3BhY2UgbWVhbnMgZXhlY3V0aW5nIHRoZSBXaU1BWCBBUEkKKyAqIGNhbGwgd2ltYXhfWChBLCBCLCBDKSwgc2VuZGluZyB0aGUgcmVzdWx0cyBiYWNrIGFzIGEgbWVzc2FnZS4KKyAqCisgKiBLZXJuZWwtdG8tdXNlciAobm90aWZpY2F0aW9ucyBvciBzaWduYWxzKSBjb21tdW5pY2F0aW9uIGlzIHNlbnQKKyAqIG92ZXIgbXVsdGljYXN0IGdyb3Vwcy4gVGhpcyBhbGxvd3MgdG8gaGF2ZSBtdWx0aXBsZSBhcHBsaWNhdGlvbnMKKyAqIG1vbml0b3JpbmcgdGhlbS4KKyAqCisgKiBFYWNoIGNvbW1hbmQvc2lnbmFsIGdldHMgYXNzaWduZWQgaXQncyBvd24gYXR0cmlidXRlIHBvbGljeS4gVGhpcworICogd2F5IHRoZSB2YWxpZGF0b3Igd2lsbCB2ZXJpZnkgdGhhdCBhbGwgdGhlIGF0dHJpYnV0ZXMgaW4gdGhlcmUgYXJlCisgKiBvbmx5IHRoZSBvbmVzIHRoYXQgc2hvdWxkIGJlIGZvciBlYWNoIGNvbW1hbmQvc2lnbmFsLiBUaGluZyBvZiBhbgorICogYXR0cmlidXRlIG1hcHBpbmcgdG8gYSB0eXBlK2FyZ3VtZW50bmFtZSBmb3IgZWFjaCBjb21tYW5kL3NpZ25hbC4KKyAqCisgKiBJZiB3ZSBoYWQgYSBzaW5nbGUgcG9saWN5IGZvciAqYWxsKiBjb21tYW5kcy9zaWduYWxzLCBhZnRlciBydW5uaW5nCisgKiB0aGUgdmFsaWRhdG9yIHdlJ2QgaGF2ZSB0byBjaGVjayAiZG9lcyB0aGlzIGF0dHJpYnV0ZSBiZWxvbmcgaW4KKyAqIGhlcmUiPyAgZm9yIGVhY2ggb25lLiBJdCBjYW4gYmUgZG9uZSBtYW51YWxseSwgYnV0IGl0J3MganVzdCBlYXNpZXIKKyAqIHRvIGhhdmUgdGhlIHZhbGlkYXRvciBkbyB0aGF0IGpvYiB3aXRoIG11bHRpcGxlIHBvbGljaWVzLiBBcyB3ZWxsLAorICogaXQgbWFrZXMgaXQgZWFzaWVyIHRvIGxhdGVyIGV4cGFuZCBlYWNoIGNvbW1hbmQvc2lnbmFsIHNpZ25hdHVyZQorICogd2l0aG91dCBhZmZlY3Rpbmcgb3RoZXJzIGFuZCBrZWVwaW5nIHRoZSBuYW1lc3BhY2UgbW9yZSBvciBsZXNzCisgKiBzYW5lLiBOb3QgdGhhdCBpdCBpcyB0b28gY29tcGxpY2F0ZWQsIGJ1dCBpdCBtYWtlcyBpdCBldmVuIGVhc2llci4KKyAqCisgKiBObyBzdGF0ZSBpbmZvcm1hdGlvbiBpcyBtYWludGFpbmVkIGluIHRoZSBrZXJuZWwgZm9yIGVhY2ggdXNlcgorICogc3BhY2UgY29ubmVjdGlvbiAodGhlIGNvbm5lY3Rpb24gaXMgc3RhdGVsZXNzKS4KKyAqCisgKiBURVNUSU5HIEZPUiBUSEUgSU5URVJGQUNFIEFORCBWRVJTSU9OSU5HCisgKgorICogSWYgbmV0d29yayBpbnRlcmZhY2UgWCBpcyBhIFdpTUFYIGRldmljZSwgdGhlcmUgd2lsbCBiZSBhIEdlbmVyaWMKKyAqIE5ldGxpbmsgZmFtaWx5IG5hbWVkICJXaU1BWCBYIiBhbmQgdGhlIGRldmljZSB3aWxsIHByZXNlbnQgYQorICogIndpbWF4IiBkaXJlY3RvcnkgaW4gaXQncyBuZXR3b3JrIHN5c2ZzIGRpcmVjdG9yeQorICogKC9zeXMvY2xhc3MvbmV0L0RFVklDRS93aW1heCkgW3VzZWQgYnkgSEFMXS4KKyAqCisgKiBUaGUgaW5leGlzdGVuY2Ugb2YgYW55IG9mIHRoZXNlIG1lYW5zIHRoZSBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydAorICogdGhpcyBXaU1BWCBBUEkuCisgKgorICogQnkgcXVlcnlpbmcgdGhlIGdlbmVyaWMgbmV0bGluayBjb250cm9sbGVyLCB2ZXJzaW9uaW5nIGluZm9ybWF0aW9uCisgKiBhbmQgdGhlIG11bHRpY2FzdCBncm91cHMgYXZhaWxhYmxlIGNhbiBiZSBmb3VuZC4gQXBwbGljYXRpb25zIHVzaW5nCisgKiB0aGUgaW50ZXJmYWNlIGNhbiBlaXRoZXIgcmVseSBvbiB0aGF0IG9yIHVzZSB0aGUgZ2VuZXJpYyBuZXRsaW5rCisgKiBjb250cm9sbGVyIHRvIGZpZ3VyZSBvdXQgd2hpY2ggZ2VuZXJpYyBuZXRsaW5rIGNvbW1hbmRzL3NpZ25hbHMgYXJlCisgKiBzdXBwb3J0ZWQuCisgKgorICogTk9URTogdGhpcyB2ZXJzaW9uaW5nIGlzIGEgbGFzdCByZXNvcnQgdG8gYXZvaWQgaGFyZAorICogICAgaW5jb21wYXRpYmlsaXRpZXMuIEl0IGlzIHRoZSBpbnRlbnRpb24gb2YgdGhlIGRlc2lnbiBvZiB0aGlzCisgKiAgICBzdGFjayBub3QgdG8gaW50cm9kdWNlIGJhY2t3YXJkIGluY29tcGF0aWJsZSBjaGFuZ2VzLgorICoKKyAqIFRoZSB2ZXJzaW9uIGNvZGUgaGFzIHRvIGZpdCBpbiBvbmUgYnl0ZSAocmVzdHJpY3Rpb25zIGltcG9zZWQgYnkKKyAqIGdlbmVyaWMgbmV0bGluayk7IHdlIHVzZSBgdmVyc2lvbiAvIDEwYCBmb3IgdGhlIG1ham9yIHZlcnNpb24gYW5kCisgKiBgdmVyc2lvbiAlIDEwYCBmb3IgdGhlIG1pbm9yLiBUaGlzIGdpdmVzIDkgbWlub3JzIGZvciBlYWNoIG1ham9yCisgKiBhbmQgMjUgbWFqb3JzLgorICoKKyAqIFRoZSB2ZXJzaW9uIGNoYW5nZSBwcm90b2NvbCBpcyBhcyBmb2xsb3c6CisgKgorICogLSBNYWpvciB2ZXJzaW9uczogbmVlZHMgdG8gYmUgaW5jcmVhc2VkIGlmIGFuIGV4aXN0aW5nIG1lc3NhZ2UvQVBJCisgKiAgIGNhbGwgaXMgY2hhbmdlZCBvciByZW1vdmVkLiBEb2Vzbid0IG5lZWQgdG8gYmUgY2hhbmdlZCBpZiBhIG5ldworICogICBtZXNzYWdlIGlzIGFkZGVkLgorICoKKyAqIC0gTWlub3IgdmVyc2lvbjogbmVlZHMgdG8gYmUgaW5jcmVhc2VkIGlmIG5ldyBtZXNzYWdlcy9BUEkgY2FsbHMgYXJlCisgKiAgIGJlaW5nIGFkZGVkIG9yIHNvbWUgb3RoZXIgY29uc2lkZXJhdGlvbiB0aGF0IGRvZXNuJ3QgaW1wYWN0IHRoZQorICogICB1c2VyLWtlcm5lbCBpbnRlcmZhY2UgdG9vIG11Y2ggKGxpa2Ugc29tZSBraW5kIG9mIGJ1ZyBmaXgpIGFuZAorICogICB0aGF0IGlzIGtpbmQgb2YgbGVmdCB1cCBpbiB0aGUgYWlyIHRvIGNvbW1vbiBzZW5zZS4KKyAqCisgKiBVc2VyIHNwYWNlIGNvZGUgc2hvdWxkIG5vdCB0cnkgdG8gd29yayBpZiB0aGUgbWFqb3IgdmVyc2lvbiBpdCB3YXMKKyAqIGNvbXBpbGVkIGZvciBkaWZmZXJzIGZyb20gd2hhdCB0aGUga2VybmVsIG9mZmVycy4gQXMgd2VsbCwgaWYgdGhlCisgKiBtaW5vciB2ZXJzaW9uIG9mIHRoZSBrZXJuZWwgaW50ZXJmYWNlIGlzIGxvd2VyIHRoYW4gdGhlIG9uZSB1c2VyCisgKiBzcGFjZSBpcyBleHBlY3RpbmcgKHRoZSBvbmUgaXQgd2FzIGNvbXBpbGVkIGZvciksIHRoZSBrZXJuZWwKKyAqIG1pZ2h0IGJlIG1pc3NpbmcgQVBJIGNhbGxzOyB1c2VyIHNwYWNlIHNoYWxsIGJlIHJlYWR5IHRvIGhhbmRsZQorICogc2FpZCBjb25kaXRpb24uIFVzZSB0aGUgZ2VuZXJpYyBuZXRsaW5rIGNvbnRyb2xsZXIgb3BlcmF0aW9ucyB0bworICogZmluZCB3aGljaCBvbmVzIGFyZSBzdXBwb3J0ZWQgYW5kIHdoaWNoIG5vdC4KKyAqCisgKiBsaWJ3aW1heGxsOndpbWF4bGxfb3BlbigpIHRha2VzIGNhcmUgb2YgY2hlY2tpbmcgdmVyc2lvbnMuCisgKgorICogVEhFIE9QRVJBVElPTlM6CisgKgorICogRWFjaCBvcGVyYXRpb24gaXMgZGVmaW5lZCBpbiBpdHMgb24gZmlsZSAoZHJpdmVycy9uZXQvd2ltYXgvb3AtKi5jKQorICogZm9yIGNsYXJpdHkuIFRoZSBwYXJ0cyBuZWVkZWQgZm9yIGFuIG9wZXJhdGlvbiBhcmU6CisgKgorICogIC0gYSBmdW5jdGlvbiBwb2ludGVyIGluIGBzdHJ1Y3Qgd2ltYXhfZGV2YDogb3B0aW9uYWwsIGFzIHRoZQorICogICAgb3BlcmF0aW9uIG1pZ2h0IGJlIGltcGxlbWVudGVkIGJ5IHRoZSBzdGFjayBhbmQgbm90IGJ5IHRoZQorICogICAgZHJpdmVyLgorICoKKyAqICAgIEFsbCBmdW5jdGlvbiBwb2ludGVycyBhcmUgbmFtZWQgd2ltYXhfZGV2LT5vcF8qKCksIGFuZCBkcml2ZXJzCisgKiAgICBtdXN0IGltcGxlbWVudCB0aGVtIGV4Y2VwdCB3aGVyZSBub3RlZCBvdGhlcndpc2UuCisgKgorICogIC0gV2hlbiBleHBvcnRlZCB0byB1c2VyIHNwYWNlLCBhIGBzdHJ1Y3QgbmxhX3BvbGljeWAgdG8gZGVmaW5lIHRoZQorICogICAgYXR0cmlidXRlcyBvZiB0aGUgZ2VuZXJpYyBuZXRsaW5rIGNvbW1hbmQgYW5kIGEgYHN0cnVjdCBnZW5sX29wc2AKKyAqICAgIHRvIGRlZmluZSB0aGUgb3BlcmF0aW9uLgorICoKKyAqIEFsbCB0aGUgZGVjbGFyYXRpb25zIGZvciB0aGUgb3BlcmF0aW9uIGNvZGVzIChXSU1BWF9HTkxfT1BfPE5BTUU+KQorICogYW5kIGdlbmVyaWMgbmV0bGluayBhdHRyaWJ1dGVzIChXSU1BWF9HTkxfPE5BTUU+XyopIGFyZSBkZWNsYXJlZCBpbgorICogaW5jbHVkZS9saW51eC93aW1heC5oOyB0aGlzIGZpbGUgaXMgaW50ZW5kZWQgdG8gYmUgY2xvbmVkIGJ5IHVzZXIKKyAqIHNwYWNlIHRvIGdhaW4gYWNjZXNzIHRvIHRob3NlIGRlY2xhcmF0aW9ucy4KKyAqCisgKiBBIGZldyBjYXZlYXRzIHRvIHJlbWVtYmVyOgorICoKKyAqICAtIE5lZWQgdG8gZGVmaW5lIGF0dHJpYnV0ZSBudW1iZXJzIHN0YXJ0aW5nIGluIDE7IG90aGVyd2lzZSBpdAorICogICAgZmFpbHMuCisgKgorICogIC0gdGhlIGBzdHJ1Y3QgZ2VubF9mYW1pbHlgIHJlcXVpcmVzIGEgbWF4aW11bSBhdHRyaWJ1dGUgaWQ7IHdoZW4KKyAqICAgIGRlZmluaW5nIHRoZSBgc3RydWN0IG5sYV9wb2xpY3lgIGZvciBlYWNoIG1lc3NhZ2UsIGl0IGhhcyB0byBoYXZlCisgKiAgICBhbiBhcnJheSBzaXplIG9mIFdJTUFYX0dOTF9BVFRSX01BWCsxLgorICoKKyAqIFRIRSBQSVBFIElOVEVSRkFDRToKKyAqCisgKiBUaGlzIGludGVyZmFjZSBpcyBrZXB0IGludGVudGlvbmFsbHkgc2ltcGxlLiBUaGUgZHJpdmVyIGNhbiBzZW5kCisgKiBhbmQgcmVjZWl2ZSBmcmVlLWZvcm0gbWVzc2FnZXMgdG8vZnJvbSB1c2VyIHNwYWNlIHRocm91Z2ggYQorICogcGlwZS4gU2VlIGRyaXZlcnMvbmV0L3dpbWF4L29wLW1zZy5jIGZvciBkZXRhaWxzLgorICoKKyAqIFRoZSBrZXJuZWwtdG8tdXNlciBtZXNzYWdlcyBhcmUgc2VudCB3aXRoCisgKiB3aW1heF9tc2coKS4gdXNlci10by1rZXJuZWwgbWVzc2FnZXMgYXJlIGRlbGl2ZXJlZCB2aWEKKyAqIHdpbWF4X2Rldi0+b3BfbXNnX2Zyb21fdXNlcigpLgorICoKKyAqIFJGS0lMTDoKKyAqCisgKiBSRktJTEwgc3VwcG9ydCBpcyBidWlsdCBpbnRvIHRoZSB3aW1heF9kZXYgbGF5ZXI7IHRoZSBkcml2ZXIganVzdAorICogbmVlZHMgdG8gY2FsbCB3aW1heF9yZXBvcnRfcmZraWxsX3todyxzd30oKSB0byBpbmZvcm0gb2YgY2hhbmdlcyBpbgorICogdGhlIGhhcmR3YXJlIG9yIHNvZnR3YXJlIFJGIGtpbGwgc3dpdGNoZXMuIFdoZW4gdGhlIHN0YWNrIHdhbnRzIHRvCisgKiB0dXJuIHRoZSByYWRpbyBvZmYsIGl0IHdpbGwgY2FsbCB3aW1heF9kZXYtPm9wX3Jma2lsbF9zd190b2dnbGUoKSwKKyAqIHdoaWNoIHRoZSBkcml2ZXIgaW1wbGVtZW50cy4KKyAqCisgKiBVc2VyIHNwYWNlIGNhbiBzZXQgdGhlIHNvZnR3YXJlIFJGIEtpbGwgc3dpdGNoIGJ5IGNhbGxpbmcKKyAqIHdpbWF4X3Jma2lsbCgpLgorICoKKyAqIFRoZSBjb2RlIGZvciBub3cgb25seSBzdXBwb3J0cyBkZXZpY2VzIHRoYXQgZG9uJ3QgcmVxdWlyZSBwb2xsaW5nOworICogSWYgdGhlIGRldmljZSBuZWVkcyB0byBiZSBwb2xsZWQsIGNyZWF0ZSBhIHNlbGYtcmVhcm1pbmcgZGVsYXllZAorICogd29yayBzdHJ1Y3QgZm9yIHBvbGxpbmcgb3IgbG9vayBpbnRvIGFkZGluZyBwb2xsZWQgc3VwcG9ydCB0byB0aGUKKyAqIFdpTUFYIHN0YWNrLgorICoKKyAqIFdoZW4gaW5pdGlhbGl6aW5nIHRoZSBoYXJkd2FyZSAoX3Byb2JlKSwgYWZ0ZXIgY2FsbGluZworICogd2ltYXhfZGV2X2FkZCgpLCBxdWVyeSB0aGUgZGV2aWNlIGZvciBpdCdzIFJGIEtpbGwgc3dpdGNoZXMgc3RhdHVzCisgKiBhbmQgZmVlZCBpdCBiYWNrIHRvIHRoZSBXaU1BWCBzdGFjayB1c2luZworICogd2ltYXhfcmVwb3J0X3Jma2lsbF97aHcsc3d9KCkuIElmIGFueSBzd2l0Y2ggaXMgbWlzc2luZywgYWx3YXlzCisgKiByZXBvcnQgaXQgYXMgT04uCisgKgorICogTk9URTogdGhlIHdpbWF4IHN0YWNrIHVzZXMgYW4gaW52ZXJ0ZWQgdGVybWlub2xvZ3kgdG8gdGhhdCBvZiB0aGUKKyAqIFJGS0lMTCBzdWJzeXN0ZW06CisgKgorICogIC0gT046IHJhZGlvIGlzIE9OLCBSRktJTEwgaXMgRElTQUJMRUQgb3IgT0ZGLgorICogIC0gT0ZGOiByYWRpbyBpcyBPRkYsIFJGS0lMTCBpcyBFTkFCTEVEIG9yIE9OLgorICoKKyAqIE1JU0NFTExBTkVPVVMgT1BTOgorICoKKyAqIHdpbWF4X3Jlc2V0KCkgY2FuIGJlIHVzZWQgdG8gcmVzZXQgdGhlIGRldmljZSB0byBwb3dlciBvbiBzdGF0ZTsgYnkKKyAqIGRlZmF1bHQgaXQgaXNzdWVzIGEgd2FybSByZXNldCB0aGF0IG1haW50YWlucyB0aGUgc2FtZSBkZXZpY2UKKyAqIG5vZGUuIElmIHRoYXQgaXMgbm90IHBvc3NpYmxlLCBpdCBmYWxscyBiYWNrIHRvIGEgY29sZCByZXNldAorICogKGRldmljZSByZWNvbm5lY3QpLiBUaGUgZHJpdmVyIGltcGxlbWVudHMgdGhlIGJhY2tlbmQgdG8gdGhpcworICogdGhyb3VnaCB3aW1heF9kZXYtPm9wX3Jlc2V0KCkuCisgKi8KKworI2lmbmRlZiBfX05FVF9fV0lNQVhfSF9fCisjZGVmaW5lIF9fTkVUX19XSU1BWF9IX18KKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC93aW1heC5oPgorI2luY2x1ZGUgPG5ldC9nZW5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKworc3RydWN0IG5ldF9kZXZpY2U7CitzdHJ1Y3QgZ2VubF9pbmZvOworc3RydWN0IHdpbWF4X2RldjsKK3N0cnVjdCBpbnB1dF9kZXY7CisKKy8qKgorICogc3RydWN0IHdpbWF4X2RldiAtIEdlbmVyaWMgV2lNQVggZGV2aWNlCisgKgorICogQG5ldF9kZXY6IFtmaWxsXSBQb2ludGVyIHRvIHRoZSAmc3RydWN0IG5ldF9kZXZpY2UgdGhpcyBXaU1BWAorICogICAgIGRldmljZSBpbXBsZW1lbnRzLgorICoKKyAqIEBvcF9tc2dfZnJvbV91c2VyOiBbZmlsbF0gRHJpdmVyLXNwZWNpZmljIG9wZXJhdGlvbiB0bworICogICAgIGhhbmRsZSBhIHJhdyBtZXNzYWdlIGZyb20gdXNlciBzcGFjZSB0byB0aGUgZHJpdmVyLiBUaGUKKyAqICAgICBkcml2ZXIgY2FuIHNlbmQgbWVzc2FnZXMgdG8gdXNlciBzcGFjZSB1c2luZyB3aXRoCisgKiAgICAgd2ltYXhfbXNnX3RvX3VzZXIoKS4KKyAqCisgKiBAb3BfcmZraWxsX3N3X3RvZ2dsZTogW2ZpbGxdIERyaXZlci1zcGVjaWZpYyBvcGVyYXRpb24gdG8gYWN0IG9uCisgKiAgICAgdXNlcnNwYWNlIChvciBhbnkgb3RoZXIgYWdlbnQpIHJlcXVlc3RpbmcgdGhlIFdpTUFYIGRldmljZSB0bworICogICAgIGNoYW5nZSB0aGUgUkYgS2lsbCBzb2Z0d2FyZSBzd2l0Y2ggKFdJTUFYX1JGX09OIG9yCisgKiAgICAgV0lNQVhfUkZfT0ZGKS4KKyAqICAgICBJZiBzdWNoIGhhcmR3YXJlIHN1cHBvcnQgaXMgbm90IHByZXNlbnQsIGl0IGlzIGFzc3VtZWQgdGhlCisgKiAgICAgcmFkaW8gY2Fubm90IGJlIHN3aXRjaGVkIG9mZiBhbmQgaXQgaXMgYWx3YXlzIG9uIChhbmQgdGhlIHN0YWNrCisgKiAgICAgd2lsbCBlcnJvciBvdXQgd2hlbiB0cnlpbmcgdG8gc3dpdGNoIGl0IG9mZikuIEluIHN1Y2ggY2FzZSwKKyAqICAgICB0aGlzIGZ1bmN0aW9uIHBvaW50ZXIgY2FuIGJlIGxlZnQgYXMgTlVMTC4KKyAqCisgKiBAb3BfcmVzZXQ6IFtmaWxsXSBEcml2ZXIgc3BlY2lmaWMgb3BlcmF0aW9uIHRvIHJlc2V0IHRoZQorICogICAgIGRldmljZS4KKyAqICAgICBUaGlzIG9wZXJhdGlvbiBzaG91bGQgYWx3YXlzIGF0dGVtcHQgZmlyc3QgYSB3YXJtIHJlc2V0IHRoYXQKKyAqICAgICBkb2VzIG5vdCBkaXNjb25uZWN0IHRoZSBkZXZpY2UgZnJvbSB0aGUgYnVzIGFuZCByZXR1cm4gMC4KKyAqICAgICBJZiB0aGF0IGZhaWxzLCBpdCBzaG91bGQgcmVzb3J0IHRvIHNvbWUgc29ydCBvZiBjb2xkIG9yIGJ1cworICogICAgIHJlc2V0IChldmVuIGlmIGl0IGltcGxpZXMgYSBidXMgZGlzY29ubmVjdGlvbiBhbmQgZGV2aWNlCisgKiAgICAgZGlzc2FwZWFyYW5jZSkuIEluIHRoYXQgY2FzZSwgLUVOT0RFViBzaG91bGQgYmUgcmV0dXJuZWQgdG8KKyAqICAgICBpbmRpY2F0ZSB0aGUgZGV2aWNlIGlzIGdvbmUuCisgKiAgICAgVGhpcyBvcGVyYXRpb24gaGFzIHRvIGJlIHN5bmNocm9ub3VzLCBhbmQgcmV0dXJuIG9ubHkgd2hlbiB0aGUKKyAqICAgICByZXNldCBpcyBjb21wbGV0ZS4gSW4gY2FzZSBvZiBoYXZpbmcgaGFkIHRvIHJlc29ydCB0byBidXMvY29sZAorICogICAgIHJlc2V0IGltcGx5aW5nIGEgZGV2aWNlIGRpc2Nvbm5lY3Rpb24sIHRoZSBjYWxsIGlzIGFsbG93ZWQgdG8KKyAqICAgICByZXR1cm4gaW5tZWRpYXRlbHkuCisgKiAgICAgTk9URTogd2ltYXhfZGV2LT5tdXRleCBpcyBOT1QgbG9ja2VkIHdoZW4gdGhpcyBvcCBpcyBiZWluZworICogICAgIGNhbGxlZDsgaG93ZXZlciwgd2ltYXhfZGV2LT5tdXRleF9yZXNldCBJUyBsb2NrZWQgdG8gZW5zdXJlCisgKiAgICAgc2VyaWFsaXphdGlvbiBvZiBjYWxscyB0byB3aW1heF9yZXNldCgpLgorICogICAgIFNlZSB3aW1heF9yZXNldCgpJ3MgZG9jdW1lbnRhdGlvbi4KKyAqCisgKiBAbmFtZTogW2ZpbGxdIEEgd2F5IHRvIGlkZW50aWZ5IHRoaXMgZGV2aWNlLiBXZSBuZWVkIHRvIHJlZ2lzdGVyIGEKKyAqICAgICBuYW1lIHdpdGggbWFueSBzdWJzeXN0ZW1zIChpbnB1dCBmb3IgUkZLSUxMLCB3b3JrcXVldWUKKyAqICAgICBjcmVhdGlvbiwgZXRjKS4gV2UgY2FuJ3QgdXNlIHRoZSBuZXR3b3JrIGRldmljZSBuYW1lIGFzIHRoYXQKKyAqICAgICBtaWdodCBjaGFuZ2UgYW5kIGluIHNvbWUgaW5zdGFuY2VzIHdlIGRvbid0IGtub3cgaXQgeWV0ICh1bnRpbAorICogICAgIHdlIGRvbid0IGNhbGwgcmVnaXN0ZXJfbmV0ZGV2KCkpLiBTbyB3ZSBnZW5lcmF0ZSBhbiB1bmlxdWUgb25lCisgKiAgICAgdXNpbmcgdGhlIGRyaXZlciBuYW1lIGFuZCBkZXZpY2UgYnVzIGlkLCBwbGFjZSBpdCBoZXJlIGFuZCB1c2UKKyAqICAgICBpdCBhY3Jvc3MgdGhlIGJvYXJkLiBSZWNvbW1lbmRlZCBuYW1pbmc6CisgKiAgICAgRFJJVkVSTkFNRS1CVVNOQU1FOkJVU0lEIChkZXYtPmJ1cy0+bmFtZSwgZGV2LT5idXNfaWQpLgorICoKKyAqIEBpZF90YWJsZV9ub2RlOiBbcHJpdmF0ZV0gbGluayB0byB0aGUgbGlzdCBvZiB3aW1heCBkZXZpY2VzIGtlcHQgYnkKKyAqICAgICBpZC10YWJsZS5jLiBQcm90ZWN0ZWQgYnkgaXQncyBvd24gc3BpbmxvY2suCisgKgorICogQG11dGV4OiBbcHJpdmF0ZV0gU2VyaWFsaXplcyBhbGwgY29uY3VycmVudCBhY2Nlc3MgYW5kIGV4ZWN1dGlvbiBvZgorICogICAgIG9wZXJhdGlvbnMuCisgKgorICogQG11dGV4X3Jlc2V0OiBbcHJpdmF0ZV0gU2VyaWFsaXplcyByZXNldCBvcGVyYXRpb25zLiBOZWVkcyB0byBiZSBhCisgKiAgICAgZGlmZmVyZW50IG11dGV4IGJlY2F1c2UgYXMgcGFydCBvZiB0aGUgcmVzZXQgb3BlcmF0aW9uLCB0aGUKKyAqICAgICBkcml2ZXIgaGFzIHRvIGNhbGwgYmFjayBpbnRvIHRoZSBzdGFjayB0byBkbyB0aGluZ3Mgc3VjaCBhcworICogICAgIHN0YXRlIGNoYW5nZSwgdGhhdCByZXF1aXJlIHdpbWF4X2Rldi0+bXV0ZXguCisgKgorICogQHN0YXRlOiBbcHJpdmF0ZV0gQ3VycmVudCBzdGF0ZSBvZiB0aGUgV2lNQVggZGV2aWNlLgorICoKKyAqIEByZmtpbGw6IFtwcml2YXRlXSBpbnRlZ3JhdGlvbiBpbnRvIHRoZSBSRi1LaWxsIGluZnJhc3RydWN0dXJlLgorICoKKyAqIEByZmtpbGxfaW5wdXQ6IFtwcml2YXRlXSB2aXJ0dWFsIGlucHV0IGRldmljZSB0byBwcm9jZXNzIHRoZQorICogICAgIGhhcmR3YXJlIFJGIEtpbGwgc3dpdGNoZXMuCisgKgorICogQHJmX3N3OiBbcHJpdmF0ZV0gU3RhdGUgb2YgdGhlIHNvZnR3YXJlIHJhZGlvIHN3aXRjaCAoT0ZGL09OKQorICoKKyAqIEByZl9odzogW3ByaXZhdGVdIFN0YXRlIG9mIHRoZSBoYXJkd2FyZSByYWRpbyBzd2l0Y2ggKE9GRi9PTikKKyAqCisgKiBAZGVidWZzX2RlbnRyeTogW3ByaXZhdGVdIFVzZWQgdG8gaG9vayB1cCBhIGRlYnVnZnMgZW50cnkuIFRoaXMKKyAqICAgICBzaG93cyB1cCBpbiB0aGUgZGVidWdmcyByb290IGFzIHdpbWF4OkRFVklDRU5BTUUuCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGEgY29tbW9uIGludGVyZmFjZSB0byBhY2Nlc3MgYWxsIFdpTUFYCisgKiBkZXZpY2VzIGZyb20gZGlmZmVyZW50IHZlbmRvcnMgYW5kIHByb3ZpZGVzIGEgY29tbW9uIEFQSSBhcyB3ZWxsIGFzCisgKiBhIGZyZWUtZm9ybSBkZXZpY2Utc3BlY2lmaWMgbWVzc2FnaW5nIGNoYW5uZWwuCisgKgorICogVXNhZ2U6CisgKiAgMS4gRW1iZWQgYSAmc3RydWN0IHdpbWF4X2RldiBhdCAqdGhlIGJlZ2lubmluZyogdGhlIG5ldHdvcmsKKyAqICAgICBkZXZpY2Ugc3RydWN0dXJlIHNvIHRoYXQgbmV0ZGV2X3ByaXYoKSBwb2ludHMgdG8gaXQuCisgKgorICogIDIuIG1lbXNldCgpIGl0IHRvIHplcm8KKyAqCisgKiAgMy4gSW5pdGlhbGl6ZSB3aXRoIHdpbWF4X2Rldl9pbml0KCkuIFRoaXMgd2lsbCBsZWF2ZSB0aGUgV2lNQVgKKyAqICAgICBkZXZpY2UgaW4gdGhlICVfX1dJTUFYX1NUX05VTEwgc3RhdGUuCisgKgorICogIDQuIEZpbGwgYWxsIHRoZSBmaWVsZHMgbWFya2VkIHdpdGggW2ZpbGxdOyBvbmNlIGNhbGxlZAorICogICAgIHdpbWF4X2Rldl9hZGQoKSwgdGhvc2UgZmllbGRzIENBTk5PVCBiZSBtb2RpZmllZC4KKyAqCisgKiAgNS4gQ2FsbCB3aW1heF9kZXZfYWRkKCkgKmFmdGVyKiByZWdpc3RlcmluZyB0aGUgbmV0d29yaworICogICAgIGRldmljZS4gVGhpcyB3aWxsIGxlYXZlIHRoZSBXaU1BWCBkZXZpY2UgaW4gdGhlICVXSU1BWF9TVF9ET1dOCisgKiAgICAgc3RhdGUuCisgKiAgICAgUHJvdGVjdCB0aGUgZHJpdmVyJ3MgbmV0X2RldmljZS0+b3BlbigpIGFnYWluc3Qgc3VjY2VlZGluZyBpZgorICogICAgIHRoZSB3aW1heCBkZXZpY2Ugc3RhdGUgaXMgbG93ZXIgdGhhbiAlV0lNQVhfU1RfRE9XTi4KKyAqCisgKiAgNi4gU2VsZWN0IHdoZW4gdGhlIGRldmljZSBpcyBnb2luZyB0byBiZSB0dXJuZWQgb24vaW5pdGlhbGl6ZWQ7CisgKiAgICAgZm9yIGV4YW1wbGUsIGl0IGNvdWxkIGJlIGluaXRpYWxpemVkIG9uICdpZmNvbmZpZyB1cCcgKHdoZW4gdGhlCisgKiAgICAgbmV0ZGV2IG9wICdvcGVuKCknIGlzIGNhbGxlZCBvbiB0aGUgZHJpdmVyKS4KKyAqCisgKiBXaGVuIHRoZSBkZXZpY2UgaXMgaW5pdGlhbGl6ZWQgKGF0IGBpZmNvbmZpZyB1cGAgdGltZSwgb3IgcmlnaHQKKyAqIGFmdGVyIGNhbGxpbmcgd2ltYXhfZGV2X2FkZCgpIGZyb20gX3Byb2JlKCksIG1ha2Ugc3VyZSB0aGUKKyAqIGZvbGxvd2luZyBzdGVwcyBhcmUgdGFrZW4KKyAqCisgKiAgYS4gTW92ZSB0aGUgZGV2aWNlIHRvICVXSU1BWF9TVF9VTklOSVRJQUxJWkVELiBUaGlzIGlzIG5lZWRlZCBzbworICogICAgIHNvbWUgQVBJIGNhbGxzIHRoYXQgc2hvdWxkbid0IHdvcmsgdW50aWwgdGhlIGRldmljZSBpcyByZWFkeQorICogICAgIGNhbiBiZSBibG9ja2VkLgorICoKKyAqICBiLiBJbml0aWFsaXplIHRoZSBkZXZpY2UuIE1ha2Ugc3VyZSB0byB0dXJuIHRoZSBTVyByYWRpbyBzd2l0Y2gKKyAqICAgICBvZmYgYW5kIG1vdmUgdGhlIGRldmljZSB0byBzdGF0ZSAlV0lNQVhfU1RfUkFESU9fT0ZGIHdoZW4KKyAqICAgICBkb25lLiBXaGVuIGp1c3QgaW5pdGlhbGl6ZWQsIGEgZGV2aWNlIHNob3VsZCBiZSBsZWZ0IGluIFJBRElPCisgKiAgICAgT0ZGIHN0YXRlIHVudGlsIHVzZXIgc3BhY2UgZGV2aWNlcyB0byB0dXJuIGl0IG9uLgorICoKKyAqICBjLiBRdWVyeSB0aGUgZGV2aWNlIGZvciB0aGUgc3RhdGUgb2YgdGhlIGhhcmR3YXJlIHJma2lsbCBzd2l0Y2gKKyAqICAgICBhbmQgY2FsbCB3aW1heF9yZmtpbGxfcmVwb3J0X2h3KCkgYW5kIHdpbWF4X3Jma2lsbF9yZXBvcnRfc3coKQorICogICAgIGFzIG5lZWRlZC4gU2VlIGJlbG93LgorICoKKyAqIHdpbWF4X2Rldl9ybSgpIHVuZG9lcyBiZWZvcmUgdW5yZWdpc3RlcmluZyB0aGUgbmV0d29yayBkZXZpY2UuIE9uY2UKKyAqIHdpbWF4X2Rldl9hZGQoKSBpcyBjYWxsZWQsIHRoZSBkcml2ZXIgY2FuIGdldCBjYWxsZWQgb24gdGhlCisgKiB3aW1heF9kZXYtPm9wXyogZnVuY3Rpb24gcG9pbnRlcnMKKyAqCisgKiBDT05DVVJSRU5DWToKKyAqCisgKiBUaGUgc3RhY2sgcHJvdmlkZXMgYSBtdXRleCBmb3IgZWFjaCBkZXZpY2UgdGhhdCB3aWxsIGRpc2FsbG93IEFQSQorICogY2FsbHMgaGFwcGVuaW5nIGNvbmN1cnJlbnRseTsgdGh1cywgb3AgY2FsbHMgaW50byB0aGUgZHJpdmVyCisgKiB0aHJvdWdoIHRoZSB3aW1heF9kZXYtPm9wKigpIGZ1bmN0aW9uIHBvaW50ZXJzIHdpbGwgYWx3YXlzIGJlCisgKiBzZXJpYWxpemVkIGFuZCAqbmV2ZXIqIGNvbmN1cnJlbnQuCisgKgorICogRm9yIGxvY2tpbmcsIHRha2Ugd2ltYXhfZGV2LT5tdXRleCBpcyB0YWtlbjsgKG1vc3QpIG9wZXJhdGlvbnMgaW4KKyAqIHRoZSBBUEkgaGF2ZSB0byBjaGVjayBmb3Igd2ltYXhfZGV2X2lzX3JlYWR5KCkgdG8gcmV0dXJuIDAgYmVmb3JlCisgKiBjb250aW51aW5nICh0aGlzIGlzIGRvbmUgaW50ZXJuYWxseSkuCisgKgorICogUkVGRVJFTkNFIENPVU5USU5HOgorICoKKyAqIFRoZSBXaU1BWCBkZXZpY2UgaXMgcmVmZXJlbmNlIGNvdW50ZWQgYnkgdGhlIGFzc29jaWF0ZWQgbmV0d29yaworICogZGV2aWNlLiBUaGUgb25seSBvcGVyYXRpb24gdGhhdCBjYW4gYmUgdXNlZCB0byByZWZlcmVuY2UgdGhlIGRldmljZQorICogaXMgd2ltYXhfZGV2X2dldF9ieV9nZW5sX2luZm8oKSwgYW5kIHRoZSByZWZlcmVuY2UgaXQgYWNxdWlyZXMgaGFzCisgKiB0byBiZSByZWxlYXNlZCB3aXRoIGRldl9wdXQod2ltYXhfZGV2LT5uZXRfZGV2KS4KKyAqCisgKiBSRktJTEw6CisgKgorICogQXQgc3RhcnR1cCwgYm90aCBIVyBhbmQgU1cgcmFkaW8gc3dpdGNoZXNzIGFyZSBhc3N1bWVkIHRvIGJlIG9mZi4KKyAqCisgKiBBdCBpbml0aWFsaXphdGlvbiB0aW1lIFthZnRlciBjYWxsaW5nIHdpbWF4X2Rldl9hZGQoKV0sIGhhdmUgdGhlCisgKiBkcml2ZXIgcXVlcnkgdGhlIGRldmljZSBmb3IgdGhlIHN0YXR1cyBvZiB0aGUgc29mdHdhcmUgYW5kIGhhcmR3YXJlCisgKiBSRiBraWxsIHN3aXRjaGVzIGFuZCBjYWxsIHdpbWF4X3JlcG9ydF9yZmtpbGxfaHcoKSBhbmQKKyAqIHdpbWF4X3Jma2lsbF9yZXBvcnRfc3coKSB0byBpbmRpY2F0ZSB0aGVpciBzdGF0ZS4gSWYgYW55IGlzCisgKiBtaXNzaW5nLCBqdXN0IGNhbGwgaXQgdG8gaW5kaWNhdGUgaXQgaXMgT04gKHJhZGlvIGFsd2F5cyBvbikuCisgKgorICogV2hlbmV2ZXIgdGhlIGRyaXZlciBkZXRlY3RzIGEgY2hhbmdlIGluIHRoZSBzdGF0ZSBvZiB0aGUgUkYga2lsbAorICogc3dpdGNoZXMsIGl0IHNob3VsZCBjYWxsIHdpbWF4X3JlcG9ydF9yZmtpbGxfaHcoKSBvcgorICogd2ltYXhfcmVwb3J0X3Jma2lsbF9zdygpIHRvIHJlcG9ydCBpdCB0byB0aGUgc3RhY2suCisgKi8KK3N0cnVjdCB3aW1heF9kZXYgeworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2OworCXN0cnVjdCBsaXN0X2hlYWQgaWRfdGFibGVfbm9kZTsKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CQkvKiBQcm90ZWN0cyBhbGwgbWVtYmVycyBhbmQgQVBJIGNhbGxzICovCisJc3RydWN0IG11dGV4IG11dGV4X3Jlc2V0OworCWVudW0gd2ltYXhfc3Qgc3RhdGU7CisKKwlpbnQgKCpvcF9tc2dfZnJvbV91c2VyKShzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYsCisJCQkJY29uc3QgY2hhciAqLAorCQkJCWNvbnN0IHZvaWQgKiwgc2l6ZV90LAorCQkJCWNvbnN0IHN0cnVjdCBnZW5sX2luZm8gKmluZm8pOworCWludCAoKm9wX3Jma2lsbF9zd190b2dnbGUpKHN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldiwKKwkJCQkgICBlbnVtIHdpbWF4X3JmX3N0YXRlKTsKKwlpbnQgKCpvcF9yZXNldCkoc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2KTsKKworCXN0cnVjdCByZmtpbGwgKnJma2lsbDsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpyZmtpbGxfaW5wdXQ7CisJdW5zaWduZWQgcmZfaHc7CisJdW5zaWduZWQgcmZfc3c7CisJY2hhciBuYW1lWzMyXTsKKworCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfZGVudHJ5OworfTsKKworCisKKy8qCisgKiBXaU1BWCBzdGFjayBwdWJsaWMgQVBJIGZvciBkZXZpY2UgZHJpdmVycworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCBleHBvcnRlZCB0byB1c2VyIHNwYWNlLgorICovCitleHRlcm4gdm9pZCB3aW1heF9kZXZfaW5pdChzdHJ1Y3Qgd2ltYXhfZGV2ICopOworZXh0ZXJuIGludCB3aW1heF9kZXZfYWRkKHN0cnVjdCB3aW1heF9kZXYgKiwgc3RydWN0IG5ldF9kZXZpY2UgKik7CitleHRlcm4gdm9pZCB3aW1heF9kZXZfcm0oc3RydWN0IHdpbWF4X2RldiAqKTsKKworc3RhdGljIGlubGluZQorc3RydWN0IHdpbWF4X2RldiAqbmV0X2Rldl90b193aW1heChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlyZXR1cm4gbmV0ZGV2X3ByaXYobmV0X2Rldik7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCBkZXZpY2UgKndpbWF4X2Rldl90b19kZXYoc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2KQoreworCXJldHVybiB3aW1heF9kZXYtPm5ldF9kZXYtPmRldi5wYXJlbnQ7Cit9CisKK2V4dGVybiB2b2lkIHdpbWF4X3N0YXRlX2NoYW5nZShzdHJ1Y3Qgd2ltYXhfZGV2ICosIGVudW0gd2ltYXhfc3QpOworZXh0ZXJuIGVudW0gd2ltYXhfc3Qgd2ltYXhfc3RhdGVfZ2V0KHN0cnVjdCB3aW1heF9kZXYgKik7CisKKy8qCisgKiBSYWRpbyBTd2l0Y2ggc3RhdGUgcmVwb3J0aW5nLgorICoKKyAqIGVudW0gd2ltYXhfcmZfc3RhdGUgaXMgZGVjbGFyZWQgaW4gbGludXgvd2ltYXguaCBzbyB0aGUgZXhwb3J0cworICogdG8gdXNlciBzcGFjZSBjYW4gdXNlIGl0LgorICovCitleHRlcm4gdm9pZCB3aW1heF9yZXBvcnRfcmZraWxsX2h3KHN0cnVjdCB3aW1heF9kZXYgKiwgZW51bSB3aW1heF9yZl9zdGF0ZSk7CitleHRlcm4gdm9pZCB3aW1heF9yZXBvcnRfcmZraWxsX3N3KHN0cnVjdCB3aW1heF9kZXYgKiwgZW51bSB3aW1heF9yZl9zdGF0ZSk7CisKKworLyoKKyAqIEZyZWUtZm9ybSBtZXNzYWdpbmcgdG8vZnJvbSB1c2VyIHNwYWNlCisgKgorICogU2VuZGluZyBhIG1lc3NhZ2U6CisgKgorICogICB3aW1heF9tc2cod2ltYXhfZGV2LCBwaXBlX25hbWUsIGJ1ZiwgYnVmX3NpemUsIEdGUF9LRVJORUwpOworICoKKyAqIEJyb2tlbiB1cDoKKyAqCisgKiAgIHNrYiA9IHdpbWF4X21zZ19hbGxvYyh3aW1heF9kZXYsIHBpcGVfbmFtZSwgYnVmX3NpemUsIEdGUF9LRVJORUwpOworICogICAuLi5maWxsIHVwIHNrYi4uLgorICogICB3aW1heF9tc2dfc2VuZCh3aW1heF9kZXYsIHBpcGVfbmFtZSwgc2tiKTsKKyAqCisgKiBCZSBzdXJlIG5vdCB0byBtb2RpZnkgc2tiLT5kYXRhIGluIHRoZSBtaWRkbGUgKGllOiBkb24ndCB1c2UKKyAqIHNrYl9wdXNoKCkvc2tiX3B1bGwoKS9za2JfcmVzZXJ2ZSgpIG9uIHRoZSBza2IpLgorICoKKyAqICJwaXBlX25hbWUiIGlzIGFueSBzdHJpbmcsIHRoYW4gY2FuIGJlIGludGVycHJldGVkIGFzIHRoZSBuYW1lIG9mCisgKiB0aGUgcGlwZSBvciBkZXN0aW5hdGFyeTsgdGhlIGludGVycHJldGF0aW9uIG9mIGl0IGlzIGRyaXZlcgorICogc3BlY2lmaWMsIHNvIHRoZSByZWNpcGllbnQgY2FuIG11bHRpcGxleCBpdCBhcyB3aXNoZWQuIEl0IGNhbiBiZQorICogTlVMTCwgaXQgd29uJ3QgYmUgdXNlZCAtIGFuIGV4YW1wbGUgaXMgdXNpbmcgYSAiZGlhZ25vc3RpY3MiIHRhZyB0bworICogc2VuZCBkaWFnbm9zdGljcyBpbmZvcm1hdGlvbiB0aGF0IGEgZGV2aWNlLXNwZWNpZmljIGRpYWdub3N0aWNzCisgKiB0b29sIHdvdWxkIGJlIGludGVyZXN0ZWQgaW4uCisgKi8KK2V4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqd2ltYXhfbXNnX2FsbG9jKHN0cnVjdCB3aW1heF9kZXYgKiwgY29uc3QgY2hhciAqLAorCQkJCSAgICAgICBjb25zdCB2b2lkICosIHNpemVfdCwgZ2ZwX3QpOworZXh0ZXJuIGludCB3aW1heF9tc2dfc2VuZChzdHJ1Y3Qgd2ltYXhfZGV2ICosIHN0cnVjdCBza19idWZmICopOworZXh0ZXJuIGludCB3aW1heF9tc2coc3RydWN0IHdpbWF4X2RldiAqLCBjb25zdCBjaGFyICosCisJCSAgICAgY29uc3Qgdm9pZCAqLCBzaXplX3QsIGdmcF90KTsKKworZXh0ZXJuIGNvbnN0IHZvaWQgKndpbWF4X21zZ19kYXRhX2xlbihzdHJ1Y3Qgc2tfYnVmZiAqLCBzaXplX3QgKik7CitleHRlcm4gY29uc3Qgdm9pZCAqd2ltYXhfbXNnX2RhdGEoc3RydWN0IHNrX2J1ZmYgKik7CitleHRlcm4gc3NpemVfdCB3aW1heF9tc2dfbGVuKHN0cnVjdCBza19idWZmICopOworCisKKy8qCisgKiBXaU1BWCBzdGFjayB1c2VyIHNwYWNlIEFQSQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBUaGlzIEFQSSBpcyB3aGF0IGdldHMgZXhwb3J0ZWQgdG8gdXNlciBzcGFjZSBmb3IgZ2VuZXJhbAorICogb3BlcmF0aW9ucy4gQXMgd2VsbCwgdGhleSBjYW4gYmUgY2FsbGVkIGZyb20gd2l0aGluIHRoZSBrZXJuZWwsCisgKiAod2l0aCBhIHByb3Blcmx5IHJlZmVyZW5jZWQgYHN0cnVjdCB3aW1heF9kZXZgKS4KKyAqCisgKiBQcm9wZXJseSByZWZlcmVuY2VkIG1lYW5zOiB0aGUgJ3N0cnVjdCBuZXRfZGV2aWNlJyB0aGF0IGVtYmVkcyB0aGUKKyAqIGRldmljZSdzIGNvbnRyb2wgc3RydWN0dXJlIGFuZCAoYXMgc3VjaCkgdGhlICdzdHJ1Y3Qgd2ltYXhfZGV2JyBpcworICogcmVmZXJlbmNlZCBieSB0aGUgY2FsbGVyLgorICovCitleHRlcm4gaW50IHdpbWF4X3Jma2lsbChzdHJ1Y3Qgd2ltYXhfZGV2ICosIGVudW0gd2ltYXhfcmZfc3RhdGUpOworZXh0ZXJuIGludCB3aW1heF9yZXNldChzdHJ1Y3Qgd2ltYXhfZGV2ICopOworCisjZWxzZQorLyogWW91IG1pZ2h0IGJlIGxvb2tpbmcgZm9yIGxpbnV4L3dpbWF4LmggKi8KKyNlcnJvciBUaGlzIGZpbGUgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBmcm9tIHVzZXIgc3BhY2UuCisjZW5kaWYgLyogI2lmZGVmIF9fS0VSTkVMX18gKi8KKyNlbmRpZiAvKiAjaWZuZGVmIF9fTkVUX19XSU1BWF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5oIGIvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmgKaW5kZXggNmUwNGU2Zi4uYzkxODRmNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmgKKysrIGIvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmgKQEAgLTM1OCw2ICszNTgsNyBAQAogI2RlZmluZSBGQ19SUE9SVF9ERVZMT1NTX1BFTkRJTkcJMHgwMQogI2RlZmluZSBGQ19SUE9SVF9TQ0FOX1BFTkRJTkcJCTB4MDIKICNkZWZpbmUgRkNfUlBPUlRfRkFTVF9GQUlMX1RJTUVET1VUCTB4MDQKKyNkZWZpbmUgRkNfUlBPUlRfREVWTE9TU19DQUxMQktfRE9ORQkweDA4CiAKICNkZWZpbmUJZGV2X3RvX3Jwb3J0KGQpCQkJCVwKIAljb250YWluZXJfb2YoZCwgc3RydWN0IGZjX3Jwb3J0LCBkZXYpCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3NvYy1kYXBtLmggYi9pbmNsdWRlL3NvdW5kL3NvYy1kYXBtLmgKaW5kZXggN2VlMmY3MC4uNGFmMTA4MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9zb2MtZGFwbS5oCisrKyBiL2luY2x1ZGUvc291bmQvc29jLWRhcG0uaApAQCAtODUsNiArODUsMTAgQEAKICNkZWZpbmUgU05EX1NPQ19EQVBNX01VWCh3bmFtZSwgd3JlZywgd3NoaWZ0LCB3aW52ZXJ0LCB3Y29udHJvbHMpIFwKIHsJLmlkID0gc25kX3NvY19kYXBtX211eCwgLm5hbWUgPSB3bmFtZSwgLnJlZyA9IHdyZWcsIC5zaGlmdCA9IHdzaGlmdCwgXAogCS5pbnZlcnQgPSB3aW52ZXJ0LCAua2NvbnRyb2xzID0gd2NvbnRyb2xzLCAubnVtX2tjb250cm9scyA9IDF9CisjZGVmaW5lIFNORF9TT0NfREFQTV9WQUxVRV9NVVgod25hbWUsIHdyZWcsIHdzaGlmdCwgd2ludmVydCwgd2NvbnRyb2xzKSBcCit7CS5pZCA9IHNuZF9zb2NfZGFwbV92YWx1ZV9tdXgsIC5uYW1lID0gd25hbWUsIC5yZWcgPSB3cmVnLCBcCisJLnNoaWZ0ID0gd3NoaWZ0LCAuaW52ZXJ0ID0gd2ludmVydCwgLmtjb250cm9scyA9IHdjb250cm9scywgXAorCS5udW1fa2NvbnRyb2xzID0gMX0KIAogLyogcGF0aCBkb21haW4gd2l0aCBldmVudCAtIGV2ZW50IGhhbmRsZXIgbXVzdCByZXR1cm4gMCBmb3Igc3VjY2VzcyAqLwogI2RlZmluZSBTTkRfU09DX0RBUE1fUEdBX0Uod25hbWUsIHdyZWcsIHdzaGlmdCwgd2ludmVydCwgd2NvbnRyb2xzLCBcCkBAIC0xNzIsNiArMTc2LDEyIEBACiAgCS5nZXQgPSBzbmRfc29jX2RhcG1fZ2V0X2VudW1fZG91YmxlLCBcCiAgCS5wdXQgPSBzbmRfc29jX2RhcG1fcHV0X2VudW1fZG91YmxlLCBcCiAgIAkucHJpdmF0ZV92YWx1ZSA9ICh1bnNpZ25lZCBsb25nKSZ4ZW51bSB9CisjZGVmaW5lIFNPQ19EQVBNX1ZBTFVFX0VOVU0oeG5hbWUsIHhlbnVtKSBcCit7CS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCBcCisJLmluZm8gPSBzbmRfc29jX2luZm9fdmFsdWVfZW51bV9kb3VibGUsIFwKKwkuZ2V0ID0gc25kX3NvY19kYXBtX2dldF92YWx1ZV9lbnVtX2RvdWJsZSwgXAorCS5wdXQgPSBzbmRfc29jX2RhcG1fcHV0X3ZhbHVlX2VudW1fZG91YmxlLCBcCisJLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmeGVudW0gfQogCiAvKiBkYXBtIHN0cmVhbSBvcGVyYXRpb25zICovCiAjZGVmaW5lIFNORF9TT0NfREFQTV9TVFJFQU1fTk9QCQkJMHgwCkBAIC0yMTQsNiArMjI0LDEwIEBACiAJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpOwogaW50IHNuZF9zb2NfZGFwbV9wdXRfZW51bV9kb3VibGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpOworaW50IHNuZF9zb2NfZGFwbV9nZXRfdmFsdWVfZW51bV9kb3VibGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpOworaW50IHNuZF9zb2NfZGFwbV9wdXRfdmFsdWVfZW51bV9kb3VibGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpOwogaW50IHNuZF9zb2NfZGFwbV9uZXdfY29udHJvbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCiAJY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCk7CiBpbnQgc25kX3NvY19kYXBtX25ld19jb250cm9scyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCkBAIC0yNDcsNiArMjYxLDcgQEAKIAlzbmRfc29jX2RhcG1faW5wdXQgPSAwLAkJLyogaW5wdXQgcGluICovCiAJc25kX3NvY19kYXBtX291dHB1dCwJCS8qIG91dHB1dCBwaW4gKi8KIAlzbmRfc29jX2RhcG1fbXV4LAkJCS8qIHNlbGVjdHMgMSBhbmFsb2cgc2lnbmFsIGZyb20gbWFueSBpbnB1dHMgKi8KKwlzbmRfc29jX2RhcG1fdmFsdWVfbXV4LAkJCS8qIHNlbGVjdHMgMSBhbmFsb2cgc2lnbmFsIGZyb20gbWFueSBpbnB1dHMgKi8KIAlzbmRfc29jX2RhcG1fbWl4ZXIsCQkJLyogbWl4ZXMgc2V2ZXJhbCBhbmFsb2cgc2lnbmFscyB0b2dldGhlciAqLwogCXNuZF9zb2NfZGFwbV9wZ2EsCQkJLyogcHJvZ3JhbW1hYmxlIGdhaW4vYXR0ZW51YXRpb24gKHZvbHVtZSkgKi8KIAlzbmRfc29jX2RhcG1fYWRjLAkJCS8qIGFuYWxvZyB0byBkaWdpdGFsIGNvbnZlcnRlciAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9zb2MuaCBiL2luY2x1ZGUvc291bmQvc29jLmgKaW5kZXggZjg2ZTQ1NS4uOWI5MzBkMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9zb2MuaAorKysgYi9pbmNsdWRlL3NvdW5kL3NvYy5oCkBAIC05NCwxMSArOTQsMjIgQEAKIAlTT0NfRU5VTV9ET1VCTEUoeHJlZywgeHNoaWZ0LCB4c2hpZnQsIHhtYXgsIHh0ZXh0cykKICNkZWZpbmUgU09DX0VOVU1fU0lOR0xFX0VYVCh4bWF4LCB4dGV4dHMpIFwKIHsJLm1heCA9IHhtYXgsIC50ZXh0cyA9IHh0ZXh0cyB9CisjZGVmaW5lIFNPQ19WQUxVRV9FTlVNX0RPVUJMRSh4cmVnLCB4c2hpZnRfbCwgeHNoaWZ0X3IsIHhtYXNrLCB4bWF4LCB4dGV4dHMsIHh2YWx1ZXMpIFwKK3sJLnJlZyA9IHhyZWcsIC5zaGlmdF9sID0geHNoaWZ0X2wsIC5zaGlmdF9yID0geHNoaWZ0X3IsIFwKKwkubWFzayA9IHhtYXNrLCAubWF4ID0geG1heCwgLnRleHRzID0geHRleHRzLCAudmFsdWVzID0geHZhbHVlc30KKyNkZWZpbmUgU09DX1ZBTFVFX0VOVU1fU0lOR0xFKHhyZWcsIHhzaGlmdCwgeG1hc2ssIHhtYXgsIHh0ZXh0cywgeHZhbHVlcykgXAorCVNPQ19WQUxVRV9FTlVNX0RPVUJMRSh4cmVnLCB4c2hpZnQsIHhzaGlmdCwgeG1hc2ssIHhtYXgsIHh0ZXh0cywgeHZhbHVlcykKICNkZWZpbmUgU09DX0VOVU0oeG5hbWUsIHhlbnVtKSBcCiB7CS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLFwKIAkuaW5mbyA9IHNuZF9zb2NfaW5mb19lbnVtX2RvdWJsZSwgXAogCS5nZXQgPSBzbmRfc29jX2dldF9lbnVtX2RvdWJsZSwgLnB1dCA9IHNuZF9zb2NfcHV0X2VudW1fZG91YmxlLCBcCiAJLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmeGVudW0gfQorI2RlZmluZSBTT0NfVkFMVUVfRU5VTSh4bmFtZSwgeGVudW0pIFwKK3sJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsXAorCS5pbmZvID0gc25kX3NvY19pbmZvX3ZhbHVlX2VudW1fZG91YmxlLCBcCisJLmdldCA9IHNuZF9zb2NfZ2V0X3ZhbHVlX2VudW1fZG91YmxlLCBcCisJLnB1dCA9IHNuZF9zb2NfcHV0X3ZhbHVlX2VudW1fZG91YmxlLCBcCisJLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmeGVudW0gfQogI2RlZmluZSBTT0NfU0lOR0xFX0VYVCh4bmFtZSwgeHJlZywgeHNoaWZ0LCB4bWF4LCB4aW52ZXJ0LFwKIAkgeGhhbmRsZXJfZ2V0LCB4aGFuZGxlcl9wdXQpIFwKIHsJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIFwKQEAgLTIwMCw2ICsyMTEsMTIgQEAKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7CiBpbnQgc25kX3NvY19wdXRfZW51bV9kb3VibGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpOworaW50IHNuZF9zb2NfaW5mb192YWx1ZV9lbnVtX2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKTsKK2ludCBzbmRfc29jX2dldF92YWx1ZV9lbnVtX2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7CitpbnQgc25kX3NvY19wdXRfdmFsdWVfZW51bV9kb3VibGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpOwogaW50IHNuZF9zb2NfaW5mb192b2xzdyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKTsKIGludCBzbmRfc29jX2luZm9fdm9sc3dfZXh0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLApAQCAtNDA2LDYgKzQyMywxOSBAQAogCXZvaWQgKmRhcG07CiB9OwogCisvKiBzZW1pIGVudW1lcmF0ZWQga2NvbnRyb2wgKi8KK3N0cnVjdCBzb2NfdmFsdWVfZW51bSB7CisJdW5zaWduZWQgc2hvcnQgcmVnOworCXVuc2lnbmVkIHNob3J0IHJlZzI7CisJdW5zaWduZWQgY2hhciBzaGlmdF9sOworCXVuc2lnbmVkIGNoYXIgc2hpZnRfcjsKKwl1bnNpZ25lZCBpbnQgbWF4OworCXVuc2lnbmVkIGludCBtYXNrOworCWNvbnN0IGNoYXIgKip0ZXh0czsKKwljb25zdCB1bnNpZ25lZCBpbnQgKnZhbHVlczsKKwl2b2lkICpkYXBtOworfTsKKwogI2luY2x1ZGUgPHNvdW5kL3NvYy1kYWkuaD4KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3hlbi94ZW5idXMuaCBiL2luY2x1ZGUveGVuL3hlbmJ1cy5oCmluZGV4IDYzNjlkODkuLmY4N2Y5NjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUveGVuL3hlbmJ1cy5oCisrKyBiL2luY2x1ZGUveGVuL3hlbmJ1cy5oCkBAIC0xMzYsOCArMTM2LDYgQEAKIC8qIE5pbCB0cmFuc2FjdGlvbiBJRC4gKi8KICNkZWZpbmUgWEJUX05JTCAoKHN0cnVjdCB4ZW5idXNfdHJhbnNhY3Rpb24pIHsgMCB9KQogCi1pbnQgX19pbml0IHhlbmJ1c19kZXZfaW5pdCh2b2lkKTsKLQogY2hhciAqKnhlbmJ1c19kaXJlY3Rvcnkoc3RydWN0IHhlbmJ1c190cmFuc2FjdGlvbiB0LAogCQkJY29uc3QgY2hhciAqZGlyLCBjb25zdCBjaGFyICpub2RlLCB1bnNpZ25lZCBpbnQgKm51bSk7CiB2b2lkICp4ZW5idXNfcmVhZChzdHJ1Y3QgeGVuYnVzX3RyYW5zYWN0aW9uIHQsCmRpZmYgLS1naXQgYS9pbml0L0tjb25maWcgYi9pbml0L0tjb25maWcKaW5kZXggZjYyODE3MS4uYTcyNGExNCAxMDA2NDQKLS0tIGEvaW5pdC9LY29uZmlnCisrKyBiL2luaXQvS2NvbmZpZwpAQCAtMjcxLDExICsyNzEsNzUgQEAKIAkJICAgICAxMyA9PiAgOCBLQgogCQkgICAgIDEyID0+ICA0IEtCCiAKKyMKKyMgQXJjaGl0ZWN0dXJlcyB3aXRoIGFuIHVucmVsaWFibGUgc2NoZWRfY2xvY2soKSBzaG91bGQgc2VsZWN0IHRoaXM6CisjCitjb25maWcgSEFWRV9VTlNUQUJMRV9TQ0hFRF9DTE9DSworCWJvb2wKKworY29uZmlnIEdST1VQX1NDSEVECisJYm9vbCAiR3JvdXAgQ1BVIHNjaGVkdWxlciIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFRoaXMgZmVhdHVyZSBsZXRzIENQVSBzY2hlZHVsZXIgcmVjb2duaXplIHRhc2sgZ3JvdXBzIGFuZCBjb250cm9sIENQVQorCSAgYmFuZHdpZHRoIGFsbG9jYXRpb24gdG8gc3VjaCB0YXNrIGdyb3Vwcy4KKwkgIEluIG9yZGVyIHRvIGNyZWF0ZSBhIGdyb3VwIGZyb20gYXJiaXRyYXJ5IHNldCBvZiBwcm9jZXNzZXMsIHVzZQorCSAgQ09ORklHX0NHUk9VUFMuIChTZWUgQ29udHJvbCBHcm91cCBzdXBwb3J0LikKKworY29uZmlnIEZBSVJfR1JPVVBfU0NIRUQKKwlib29sICJHcm91cCBzY2hlZHVsaW5nIGZvciBTQ0hFRF9PVEhFUiIKKwlkZXBlbmRzIG9uIEdST1VQX1NDSEVECisJZGVmYXVsdCBHUk9VUF9TQ0hFRAorCitjb25maWcgUlRfR1JPVVBfU0NIRUQKKwlib29sICJHcm91cCBzY2hlZHVsaW5nIGZvciBTQ0hFRF9SUi9GSUZPIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBHUk9VUF9TQ0hFRAorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFRoaXMgZmVhdHVyZSBsZXRzIHlvdSBleHBsaWNpdGx5IGFsbG9jYXRlIHJlYWwgQ1BVIGJhbmR3aWR0aAorCSAgdG8gdXNlcnMgb3IgY29udHJvbCBncm91cHMgKGRlcGVuZGluZyBvbiB0aGUgIkJhc2lzIGZvciBncm91cGluZyB0YXNrcyIKKwkgIHNldHRpbmcgYmVsb3cuIElmIGVuYWJsZWQsIGl0IHdpbGwgYWxzbyBtYWtlIGl0IGltcG9zc2libGUgdG8KKwkgIHNjaGVkdWxlIHJlYWx0aW1lIHRhc2tzIGZvciBub24tcm9vdCB1c2VycyB1bnRpbCB5b3UgYWxsb2NhdGUKKwkgIHJlYWx0aW1lIGJhbmR3aWR0aCBmb3IgdGhlbS4KKwkgIFNlZSBEb2N1bWVudGF0aW9uL3NjaGVkdWxlci9zY2hlZC1ydC1ncm91cC50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK2Nob2ljZQorCWRlcGVuZHMgb24gR1JPVVBfU0NIRUQKKwlwcm9tcHQgIkJhc2lzIGZvciBncm91cGluZyB0YXNrcyIKKwlkZWZhdWx0IFVTRVJfU0NIRUQKKworY29uZmlnIFVTRVJfU0NIRUQKKwlib29sICJ1c2VyIGlkIgorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIHdpbGwgY2hvb3NlIHVzZXJpZCBhcyB0aGUgYmFzaXMgZm9yIGdyb3VwaW5nCisJICB0YXNrcywgdGh1cyBwcm92aWRpbmcgZXF1YWwgQ1BVIGJhbmR3aWR0aCB0byBlYWNoIHVzZXIuCisKK2NvbmZpZyBDR1JPVVBfU0NIRUQKKwlib29sICJDb250cm9sIGdyb3VwcyIKKyAJZGVwZW5kcyBvbiBDR1JPVVBTCisgCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gY3JlYXRlIGFyYml0cmFyeSB0YXNrIGdyb3VwcworCSAgdXNpbmcgdGhlICJjZ3JvdXAiIHBzZXVkbyBmaWxlc3lzdGVtIGFuZCBjb250cm9sCisJICB0aGUgY3B1IGJhbmR3aWR0aCBhbGxvY2F0ZWQgdG8gZWFjaCBzdWNoIHRhc2sgZ3JvdXAuCisJICBSZWZlciB0byBEb2N1bWVudGF0aW9uL2Nncm91cHMudHh0IGZvciBtb3JlIGluZm9ybWF0aW9uCisJICBvbiAiY2dyb3VwIiBwc2V1ZG8gZmlsZXN5c3RlbS4KKworZW5kY2hvaWNlCisKK21lbnUgIkNvbnRyb2wgR3JvdXAgc3VwcG9ydCIKIGNvbmZpZyBDR1JPVVBTCiAJYm9vbCAiQ29udHJvbCBHcm91cCBzdXBwb3J0IgogCWhlbHAKLQkgIFRoaXMgb3B0aW9uIHdpbGwgbGV0IHlvdSB1c2UgcHJvY2VzcyBjZ3JvdXAgc3Vic3lzdGVtcwotCSAgc3VjaCBhcyBDcHVzZXRzCisJICBUaGlzIG9wdGlvbiBhZGQgc3VwcG9ydCBmb3IgZ3JvdXBpbmcgc2V0cyBvZiBwcm9jZXNzZXMgdG9nZXRoZXIsIGZvcgorCSAgdXNlIHdpdGggcHJvY2VzcyBjb250cm9sIHN1YnN5c3RlbXMgc3VjaCBhcyBDcHVzZXRzLCBDRlMsIG1lbW9yeQorCSAgY29udHJvbHMgb3IgZGV2aWNlIGlzb2xhdGlvbi4KKwkgIFNlZQorCQktIERvY3VtZW50YXRpb24vY3B1c2V0cy50eHQJKENwdXNldHMpCisJCS0gRG9jdW1lbnRhdGlvbi9zY2hlZHVsZXIvc2NoZWQtZGVzaWduLUNGUy50eHQJKENGUykKKwkJLSBEb2N1bWVudGF0aW9uL2Nncm91cHMvIChmZWF0dXJlcyBmb3IgZ3JvdXBpbmcsIGlzb2xhdGlvbikKKwkJLSBEb2N1bWVudGF0aW9uL2NvbnRyb2xsZXJzLyAoZmVhdHVyZXMgZm9yIHJlc291cmNlIGNvbnRyb2wpCiAKIAkgIFNheSBOIGlmIHVuc3VyZS4KIApAQCAtMzI0LDYxICszODgsNiBAQAogCiAJICBTYXkgTiBpZiB1bnN1cmUuCiAKLSMKLSMgQXJjaGl0ZWN0dXJlcyB3aXRoIGFuIHVucmVsaWFibGUgc2NoZWRfY2xvY2soKSBzaG91bGQgc2VsZWN0IHRoaXM6Ci0jCi1jb25maWcgSEFWRV9VTlNUQUJMRV9TQ0hFRF9DTE9DSwotCWJvb2wKLQotY29uZmlnIEdST1VQX1NDSEVECi0JYm9vbCAiR3JvdXAgQ1BVIHNjaGVkdWxlciIKLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAotCWRlZmF1bHQgbgotCWhlbHAKLQkgIFRoaXMgZmVhdHVyZSBsZXRzIENQVSBzY2hlZHVsZXIgcmVjb2duaXplIHRhc2sgZ3JvdXBzIGFuZCBjb250cm9sIENQVQotCSAgYmFuZHdpZHRoIGFsbG9jYXRpb24gdG8gc3VjaCB0YXNrIGdyb3Vwcy4KLQotY29uZmlnIEZBSVJfR1JPVVBfU0NIRUQKLQlib29sICJHcm91cCBzY2hlZHVsaW5nIGZvciBTQ0hFRF9PVEhFUiIKLQlkZXBlbmRzIG9uIEdST1VQX1NDSEVECi0JZGVmYXVsdCBHUk9VUF9TQ0hFRAotCi1jb25maWcgUlRfR1JPVVBfU0NIRUQKLQlib29sICJHcm91cCBzY2hlZHVsaW5nIGZvciBTQ0hFRF9SUi9GSUZPIgotCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCi0JZGVwZW5kcyBvbiBHUk9VUF9TQ0hFRAotCWRlZmF1bHQgbgotCWhlbHAKLQkgIFRoaXMgZmVhdHVyZSBsZXRzIHlvdSBleHBsaWNpdGx5IGFsbG9jYXRlIHJlYWwgQ1BVIGJhbmR3aWR0aAotCSAgdG8gdXNlcnMgb3IgY29udHJvbCBncm91cHMgKGRlcGVuZGluZyBvbiB0aGUgIkJhc2lzIGZvciBncm91cGluZyB0YXNrcyIKLQkgIHNldHRpbmcgYmVsb3cuIElmIGVuYWJsZWQsIGl0IHdpbGwgYWxzbyBtYWtlIGl0IGltcG9zc2libGUgdG8KLQkgIHNjaGVkdWxlIHJlYWx0aW1lIHRhc2tzIGZvciBub24tcm9vdCB1c2VycyB1bnRpbCB5b3UgYWxsb2NhdGUKLQkgIHJlYWx0aW1lIGJhbmR3aWR0aCBmb3IgdGhlbS4KLQkgIFNlZSBEb2N1bWVudGF0aW9uL3NjaGVkdWxlci9zY2hlZC1ydC1ncm91cC50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLWNob2ljZQotCWRlcGVuZHMgb24gR1JPVVBfU0NIRUQKLQlwcm9tcHQgIkJhc2lzIGZvciBncm91cGluZyB0YXNrcyIKLQlkZWZhdWx0IFVTRVJfU0NIRUQKLQotY29uZmlnIFVTRVJfU0NIRUQKLQlib29sICJ1c2VyIGlkIgotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIHdpbGwgY2hvb3NlIHVzZXJpZCBhcyB0aGUgYmFzaXMgZm9yIGdyb3VwaW5nCi0JICB0YXNrcywgdGh1cyBwcm92aWRpbmcgZXF1YWwgQ1BVIGJhbmR3aWR0aCB0byBlYWNoIHVzZXIuCi0KLWNvbmZpZyBDR1JPVVBfU0NIRUQKLQlib29sICJDb250cm9sIGdyb3VwcyIKLSAJZGVwZW5kcyBvbiBDR1JPVVBTCi0gCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gY3JlYXRlIGFyYml0cmFyeSB0YXNrIGdyb3VwcwotCSAgdXNpbmcgdGhlICJjZ3JvdXAiIHBzZXVkbyBmaWxlc3lzdGVtIGFuZCBjb250cm9sCi0JICB0aGUgY3B1IGJhbmR3aWR0aCBhbGxvY2F0ZWQgdG8gZWFjaCBzdWNoIHRhc2sgZ3JvdXAuCi0JICBSZWZlciB0byBEb2N1bWVudGF0aW9uL2Nncm91cHMudHh0IGZvciBtb3JlIGluZm9ybWF0aW9uCi0JICBvbiAiY2dyb3VwIiBwc2V1ZG8gZmlsZXN5c3RlbS4KLQotZW5kY2hvaWNlCi0KIGNvbmZpZyBDR1JPVVBfQ1BVQUNDVAogCWJvb2wgIlNpbXBsZSBDUFUgYWNjb3VudGluZyBjZ3JvdXAgc3Vic3lzdGVtIgogCWRlcGVuZHMgb24gQ0dST1VQUwpAQCAtMzkzLDkgKzQwMiw2IEBACiAgICAgICAgICAgaW5mcmFzdHJ1Y3R1cmUgdGhhdCB3b3JrcyB3aXRoIGNncm91cHMKIAlkZXBlbmRzIG9uIENHUk9VUFMKIAotY29uZmlnIE1NX09XTkVSCi0JYm9vbAotCiBjb25maWcgQ0dST1VQX01FTV9SRVNfQ1RMUgogCWJvb2wgIk1lbW9yeSBSZXNvdXJjZSBDb250cm9sbGVyIGZvciBDb250cm9sIEdyb3VwcyIKIAlkZXBlbmRzIG9uIENHUk9VUFMgJiYgUkVTT1VSQ0VfQ09VTlRFUlMKQEAgLTQxNCwzNiArNDIwLDY4IEBACiAJICBzdXJlIHlvdSBuZWVkIHRoZSBtZW1vcnkgcmVzb3VyY2UgY29udHJvbGxlci4gRXZlbiB3aGVuIHlvdSBlbmFibGUKIAkgIHRoaXMsIHlvdSBjYW4gc2V0ICJjZ3JvdXBfZGlzYWJsZT1tZW1vcnkiIGF0IHlvdXIgYm9vdCBvcHRpb24gdG8KIAkgIGRpc2FibGUgbWVtb3J5IHJlc291cmNlIGNvbnRyb2xsZXIgYW5kIHlvdSBjYW4gYXZvaWQgb3ZlcmhlYWRzLgotCSAgKGFuZCBsb3NlIGJlbmVmaXRzIG9mIG1lbW9yeSByZXNvdXJjZSBjb250b2xsZXIpCisJICAoYW5kIGxvc2UgYmVuZWZpdHMgb2YgbWVtb3J5IHJlc291cmNlIGNvbnRyb2xsZXIpCiAKIAkgIFRoaXMgY29uZmlnIG9wdGlvbiBhbHNvIHNlbGVjdHMgTU1fT1dORVIgY29uZmlnIG9wdGlvbiwgd2hpY2gKIAkgIGNvdWxkIGluIHR1cm4gYWRkIHNvbWUgZm9yay9leGl0IG92ZXJoZWFkLgogCitjb25maWcgTU1fT1dORVIKKwlib29sCisKK2NvbmZpZyBDR1JPVVBfTUVNX1JFU19DVExSX1NXQVAKKwlib29sICJNZW1vcnkgUmVzb3VyY2UgQ29udHJvbGxlciBTd2FwIEV4dGVuc2lvbihFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gQ0dST1VQX01FTV9SRVNfQ1RMUiAmJiBTV0FQICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIEFkZCBzd2FwIG1hbmFnZW1lbnQgZmVhdHVyZSB0byBtZW1vcnkgcmVzb3VyY2UgY29udHJvbGxlci4gV2hlbiB5b3UKKwkgIGVuYWJsZSB0aGlzLCB5b3UgY2FuIGxpbWl0IG1lbStzd2FwIHVzYWdlIHBlciBjZ3JvdXAuIEluIG90aGVyIHdvcmRzLAorCSAgd2hlbiB5b3UgZGlzYWJsZSB0aGlzLCBtZW1vcnkgcmVzb3VyY2UgY29udHJvbGxlciBoYXMgbm8gY2FyZXMgdG8KKwkgIHVzYWdlIG9mIHN3YXAuLi5hIHByb2Nlc3MgY2FuIGV4aGF1c3QgYWxsIG9mIHRoZSBzd2FwLiBUaGlzIGV4dGVuc2lvbgorCSAgaXMgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gYXZvaWQgZXhoYXVzdGlvbiBzd2FwIGJ1dCB0aGlzIGl0c2VsZgorCSAgYWRkcyBtb3JlIG92ZXJoZWFkcyBhbmQgY29uc3VtZXMgbWVtb3J5IGZvciByZW1lbWJlcmluZyBpbmZvcm1hdGlvbi4KKwkgIEVzcGVjaWFsbHkgaWYgeW91IHVzZSAzMmJpdCBzeXN0ZW0gb3Igc21hbGwgbWVtb3J5IHN5c3RlbSwgcGxlYXNlCisJICBiZSBjYXJlZnVsIGFib3V0IGVuYWJsaW5nIHRoaXMuIFdoZW4gbWVtb3J5IHJlc291cmNlIGNvbnRyb2xsZXIKKwkgIGlzIGRpc2FibGVkIGJ5IGJvb3Qgb3B0aW9uLCB0aGlzIHdpbGwgYmUgYXV0b21hdGljYWxseSBkaXNhYmxlZCBhbmQKKwkgIHRoZXJlIHdpbGwgYmUgbm8gb3ZlcmhlYWQgZnJvbSB0aGlzLiBFdmVuIHdoZW4geW91IHNldCB0aGlzIGNvbmZpZz15LAorCSAgaWYgYm9vdCBvcHRpb24gIm5vc3dhcGFjY291bnQiIGlzIHNldCwgc3dhcCB3aWxsIG5vdCBiZSBhY2NvdW50ZWQuCisKKworZW5kbWVudQorCiBjb25maWcgU1lTRlNfREVQUkVDQVRFRAogCWJvb2wKIAogY29uZmlnIFNZU0ZTX0RFUFJFQ0FURURfVjIKLQlib29sICJDcmVhdGUgZGVwcmVjYXRlZCBzeXNmcyBmaWxlcyIKKwlib29sICJDcmVhdGUgZGVwcmVjYXRlZCBzeXNmcyBsYXlvdXQgZm9yIG9sZGVyIHVzZXJzcGFjZSB0b29scyIKIAlkZXBlbmRzIG9uIFNZU0ZTCiAJZGVmYXVsdCB5CiAJc2VsZWN0IFNZU0ZTX0RFUFJFQ0FURUQKIAloZWxwCi0JICBUaGlzIG9wdGlvbiBjcmVhdGVzIGRlcHJlY2F0ZWQgc3ltbGlua3Mgc3VjaCBhcyB0aGUKLQkgICJkZXZpY2UiLWxpbmssIHRoZSA8c3Vic3lzdGVtPjo8bmFtZT4tbGluaywgYW5kIHRoZQotCSAgImJ1cyItbGluay4gSXQgbWF5IGFsc28gYWRkIGRlcHJlY2F0ZWQga2V5IGluIHRoZQotCSAgdWV2ZW50IGVudmlyb25tZW50LgotCSAgTm9uZSBvZiB0aGVzZSBmZWF0dXJlcyBvciB2YWx1ZXMgc2hvdWxkIGJlIHVzZWQgdG9kYXksIGFzCi0JICB0aGV5IGV4cG9ydCBkcml2ZXIgY29yZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIHRvIHVzZXJzcGFjZQotCSAgb3IgZXhwb3J0IHByb3BlcnRpZXMgd2hpY2ggY2FuJ3QgYmUga2VwdCBzdGFibGUgYWNyb3NzIGtlcm5lbAotCSAgcmVsZWFzZXMuCisJICBUaGlzIG9wdGlvbiBzd2l0Y2hlcyB0aGUgbGF5b3V0IG9mIHN5c2ZzIHRvIHRoZSBkZXByZWNhdGVkCisJICB2ZXJzaW9uLgogCi0JICBJZiBlbmFibGVkLCB0aGlzIG9wdGlvbiB3aWxsIGFsc28gbW92ZSBhbnkgZGV2aWNlIHN0cnVjdHVyZXMKLQkgIHRoYXQgYmVsb25nIHRvIGEgY2xhc3MsIGJhY2sgaW50byB0aGUgL3N5cy9jbGFzcyBoaWVyYXJjaHksIGluCi0JICBvcmRlciB0byBzdXBwb3J0IG9sZGVyIHZlcnNpb25zIG9mIHVkZXYgYW5kIHNvbWUgdXNlcnNwYWNlCi0JICBwcm9ncmFtcy4KKwkgIFRoZSBjdXJyZW50IHN5c2ZzIGxheW91dCBmZWF0dXJlcyBhIHVuaWZpZWQgZGV2aWNlIHRyZWUgYXQKKwkgIC9zeXMvZGV2aWNlcy8sIHdoaWNoIGlzIGFibGUgdG8gZXhwcmVzcyBhIGhpZXJhcmNoeSBiZXR3ZWVuCisJICBjbGFzcyBkZXZpY2VzLiBJZiB0aGUgZGVwcmVjYXRlZCBvcHRpb24gaXMgc2V0IHRvIFksIHRoZQorCSAgdW5pZmllZCBkZXZpY2UgdHJlZSBpcyBzcGxpdCBpbnRvIGEgYnVzIGRldmljZSB0cmVlIGF0CisJICAvc3lzL2RldmljZXMvIGFuZCBzZXZlcmFsIGluZGl2aWR1YWwgY2xhc3MgZGV2aWNlIHRyZWVzIGF0CisJICAvc3lzL2NsYXNzLy4gVGhlIGNsYXNzIGFuZCBidXMgZGV2aWNlcyB3aWxsIGJlIGNvbm5lY3RlZCBieQorCSAgIjxzdWJzeXN0ZW0+OjxuYW1lPiIgYW5kIHRoZSAiZGV2aWNlIiBsaW5rcy4gVGhlICJibG9jayIKKwkgIGNsYXNzIGRldmljZXMsIHdpbGwgbm90IHNob3cgdXAgaW4gL3N5cy9jbGFzcy9ibG9jay8uIFNvbWUKKwkgIHN1YnN5c3RlbXMgd2lsbCBzdXBwcmVzcyB0aGUgY3JlYXRpb24gb2Ygc29tZSBkZXZpY2VzIHdoaWNoCisJICBkZXBlbmQgb24gdGhlIHVuaWZpZWQgZGV2aWNlIHRyZWUuCiAKLQkgIElmIHlvdSBhcmUgdXNpbmcgYSBkaXN0cm8gd2l0aCB0aGUgbW9zdCByZWNlbnQgdXNlcnNwYWNlCi0JICBwYWNrYWdlcywgaXQgc2hvdWxkIGJlIHNhZmUgdG8gc2F5IE4gaGVyZS4KKwkgIFRoaXMgb3B0aW9uIGlzIG5vdCBhIHB1cmUgY29tcGF0aWJpbGl0eSBvcHRpb24gdGhhdCBjYW4KKwkgIGJlIHNhZmVseSBlbmFibGVkIG9uIG5ld2VyIGRpc3RyaWJ1dGlvbnMuIEl0IHdpbGwgY2hhbmdlIHRoZQorCSAgbGF5b3V0IG9mIHN5c2ZzIHRvIHRoZSBub24tZXh0ZW5zaWJsZSBkZXByZWNhdGVkIHZlcnNpb24sCisJICBhbmQgZGlzYWJsZSBzb21lIGZlYXR1cmVzLCB3aGljaCBjYW4gbm90IGJlIGV4cG9ydGVkIHdpdGhvdXQKKwkgIGNvbmZ1c2luZyBvbGRlciB1c2Vyc3BhY2UgdG9vbHMuIFNpbmNlIDIwMDcvMjAwOCBhbGwgbWFqb3IKKwkgIGRpc3RyaWJ1dGlvbnMgZG8gbm90IGVuYWJsZSB0aGlzIG9wdGlvbiwgYW5kIHNoaXAgbm8gdG9vbHMgd2hpY2gKKwkgIGRlcGVuZCBvbiB0aGUgZGVwcmVjYXRlZCBsYXlvdXQgb3IgdGhpcyBvcHRpb24uCisKKwkgIElmIHlvdSBhcmUgdXNpbmcgYSBuZXcga2VybmVsIG9uIGFuIG9sZGVyIGRpc3RyaWJ1dGlvbiwgb3IgdXNlCisJICBvbGRlciB1c2Vyc3BhY2UgdG9vbHMsIHlvdSBtaWdodCBuZWVkIHRvIHNheSBZIGhlcmUuIERvIG5vdCBzYXkgWSwKKwkgIGlmIHRoZSBvcmlnaW5hbCBrZXJuZWwsIHRoYXQgY2FtZSB3aXRoIHlvdXIgZGlzdHJpYnV0aW9uLCBoYXMKKwkgIHRoaXMgb3B0aW9uIHNldCB0byBOLgogCiBjb25maWcgUFJPQ19QSURfQ1BVU0VUCiAJYm9vbCAiSW5jbHVkZSBsZWdhY3kgL3Byb2MvPHBpZD4vY3B1c2V0IGZpbGUiCkBAIC04MzgsMTAgKzg3Niw2IEBACiAJYm9vbGVhbgogCXNlbGVjdCBQTElTVAogCi1jb25maWcgVElOWV9TSE1FTQotCWRlZmF1bHQgIVNITUVNCi0JYm9vbAotCiBjb25maWcgQkFTRV9TTUFMTAogCWludAogCWRlZmF1bHQgMCBpZiBCQVNFX0ZVTEwKQEAgLTkxNiwxMiArOTUwLDYgQEAKIAkgIHRoZSB2ZXJzaW9uKS4gIFdpdGggdGhpcyBvcHRpb24sIHN1Y2ggYSAic3JjdmVyc2lvbiIgZmllbGQKIAkgIHdpbGwgYmUgY3JlYXRlZCBmb3IgYWxsIG1vZHVsZXMuICBJZiB1bnN1cmUsIHNheSBOLgogCi1jb25maWcgS01PRAotCWRlZl9ib29sIHkKLQloZWxwCi0JICBUaGlzIGlzIGJlaW5nIHJlbW92ZWQgc29vbi4gIFRoZXNlIGRheXMsIENPTkZJR19NT0RVTEVTCi0JICBpbXBsaWVzIENPTkZJR19LTU9ELCBzbyB1c2UgdGhhdCBpbnN0ZWFkLgotCiBlbmRpZiAjIE1PRFVMRVMKIAogY29uZmlnIElOSVRfQUxMX1BPU1NJQkxFCmRpZmYgLS1naXQgYS9pbml0L2RvX21vdW50cy5jIGIvaW5pdC9kb19tb3VudHMuYwppbmRleCBkMDU1YjE5Li43MDgxMDVlIDEwMDY0NAotLS0gYS9pbml0L2RvX21vdW50cy5jCisrKyBiL2luaXQvZG9fbW91bnRzLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KKyNpbmNsdWRlIDxsaW51eC9hc3luYy5oPgogCiAjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzX2ZzX3NiLmg+CkBAIC0yMjAsMTAgKzIyMSwxMCBAQAogCiAJc3lzX2NoZGlyKCIvcm9vdCIpOwogCVJPT1RfREVWID0gY3VycmVudC0+ZnMtPnB3ZC5tbnQtPm1udF9zYi0+c19kZXY7Ci0JcHJpbnRrKCJWRlM6IE1vdW50ZWQgcm9vdCAoJXMgZmlsZXN5c3RlbSklcy5cbiIsCisJcHJpbnRrKCJWRlM6IE1vdW50ZWQgcm9vdCAoJXMgZmlsZXN5c3RlbSklcyBvbiBkZXZpY2UgJXU6JXUuXG4iLAogCSAgICAgICBjdXJyZW50LT5mcy0+cHdkLm1udC0+bW50X3NiLT5zX3R5cGUtPm5hbWUsCiAJICAgICAgIGN1cnJlbnQtPmZzLT5wd2QubW50LT5tbnRfc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkgPwotCSAgICAgICAiIHJlYWRvbmx5IiA6ICIiKTsKKwkgICAgICAgIiByZWFkb25seSIgOiAiIiwgTUFKT1IoUk9PVF9ERVYpLCBNSU5PUihST09UX0RFVikpOwogCXJldHVybiAwOwogfQogCkBAIC0zNzIsNiArMzczLDcgQEAKIAkvKiB3YWl0IGZvciB0aGUga25vd24gZGV2aWNlcyB0byBjb21wbGV0ZSB0aGVpciBwcm9iaW5nICovCiAJd2hpbGUgKGRyaXZlcl9wcm9iZV9kb25lKCkgIT0gMCkKIAkJbXNsZWVwKDEwMCk7CisJYXN5bmNfc3luY2hyb25pemVfZnVsbCgpOwogCiAJbWRfcnVuX3NldHVwKCk7CiAKZGlmZiAtLWdpdCBhL2luaXQvZG9fbW91bnRzX21kLmMgYi9pbml0L2RvX21vdW50c19tZC5jCmluZGV4IGQ2ZGE1Y2QuLmZmOTVlMzEgMTAwNjQ0Ci0tLSBhL2luaXQvZG9fbW91bnRzX21kLmMKKysrIGIvaW5pdC9kb19tb3VudHNfbWQuYwpAQCAtMjcxLDcgKzI3MSw3IEBACiBfX3NldHVwKCJyYWlkPSIsIHJhaWRfc2V0dXApOwogX19zZXR1cCgibWQ9IiwgbWRfc2V0dXApOwogCi1zdGF0aWMgdm9pZCBhdXRvZGV0ZWN0X3JhaWQodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBhdXRvZGV0ZWN0X3JhaWQodm9pZCkKIHsKIAlpbnQgZmQ7CiAKZGlmZiAtLWdpdCBhL2luaXQvbWFpbi5jIGIvaW5pdC9tYWluLmMKaW5kZXggY2QxNjhlYi4uODQ0MjA5NCAxMDA2NDQKLS0tIGEvaW5pdC9tYWluLmMKKysrIGIvaW5pdC9tYWluLmMKQEAgLTUwLDcgKzUwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9ybWFwLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtcG9saWN5Lmg+CiAjaW5jbHVkZSA8bGludXgva2V5Lmg+Ci0jaW5jbHVkZSA8bGludXgvdW53aW5kLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlX2Nncm91cC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnX2xvY2tzLmg+CkBAIC02Myw2ICs2Miw3IEBACiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CiAjaW5jbHVkZSA8bGludXgvaWRyLmg+CiAjaW5jbHVkZSA8bGludXgvZnRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvYXN5bmMuaD4KICNpbmNsdWRlIDx0cmFjZS9ib290Lmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTEwOCw3ICsxMDgsNyBAQAogCiBleHRlcm4gdm9pZCB0aW1lX2luaXQodm9pZCk7CiAvKiBEZWZhdWx0IGxhdGUgdGltZSBpbml0IGlzIE5VTEwuIGFyY2hzIGNhbiBvdmVycmlkZSB0aGlzIGxhdGVyLiAqLwotdm9pZCAoKmxhdGVfdGltZV9pbml0KSh2b2lkKTsKK3ZvaWQgKCpfX2luaXRkYXRhIGxhdGVfdGltZV9pbml0KSh2b2lkKTsKIGV4dGVybiB2b2lkIHNvZnRpcnFfaW5pdCh2b2lkKTsKIAogLyogVW50b3VjaGVkIGNvbW1hbmQgbGluZSBzYXZlZCBieSBhcmNoLXNwZWNpZmljIGNvZGUuICovCkBAIC00NDcsNyArNDQ3LDcgQEAKICAqIGdjYy0zLjQgYWNjaWRlbnRhbGx5IGlubGluZXMgdGhpcyBmdW5jdGlvbiwgc28gdXNlIG5vaW5saW5lLgogICovCiAKLXN0YXRpYyB2b2lkIG5vaW5saW5lIF9faW5pdF9yZWZvayByZXN0X2luaXQodm9pZCkKK3N0YXRpYyBub2lubGluZSB2b2lkIF9faW5pdF9yZWZvayByZXN0X2luaXQodm9pZCkKIAlfX3JlbGVhc2VzKGtlcm5lbF9sb2NrKQogewogCWludCBwaWQ7CkBAIC01MzcsNyArNTM3LDYgQEAKIAkgKiBOZWVkIHRvIHJ1biBhcyBlYXJseSBhcyBwb3NzaWJsZSwgdG8gaW5pdGlhbGl6ZSB0aGUKIAkgKiBsb2NrZGVwIGhhc2g6CiAJICovCi0JdW53aW5kX2luaXQoKTsKIAlsb2NrZGVwX2luaXQoKTsKIAlkZWJ1Z19vYmplY3RzX2Vhcmx5X2luaXQoKTsKIAljZ3JvdXBfaW5pdF9lYXJseSgpOwpAQCAtNTU5LDcgKzU1OCw2IEBACiAJc2V0dXBfYXJjaCgmY29tbWFuZF9saW5lKTsKIAltbV9pbml0X293bmVyKCZpbml0X21tLCAmaW5pdF90YXNrKTsKIAlzZXR1cF9jb21tYW5kX2xpbmUoY29tbWFuZF9saW5lKTsKLQl1bndpbmRfc2V0dXAoKTsKIAlzZXR1cF9wZXJfY3B1X2FyZWFzKCk7CiAJc2V0dXBfbnJfY3B1X2lkcygpOwogCXNtcF9wcmVwYXJlX2Jvb3RfY3B1KCk7CS8qIGFyY2gtc3BlY2lmaWMgYm9vdC1jcHUgaG9va3MgKi8KQEAgLTYwMiw3ICs2MDAsOCBAQAogCXNjaGVkX2Nsb2NrX2luaXQoKTsKIAlwcm9maWxlX2luaXQoKTsKIAlpZiAoIWlycXNfZGlzYWJsZWQoKSkKLQkJcHJpbnRrKCJzdGFydF9rZXJuZWwoKTogYnVnOiBpbnRlcnJ1cHRzIHdlcmUgZW5hYmxlZCBlYXJseVxuIik7CisJCXByaW50ayhLRVJOX0NSSVQgInN0YXJ0X2tlcm5lbCgpOiBidWc6IGludGVycnVwdHMgd2VyZSAiCisJCQkJICJlbmFibGVkIGVhcmx5XG4iKTsKIAllYXJseV9ib290X2lycXNfb24oKTsKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAKQEAgLTY4Nyw3ICs2ODYsNyBAQAogCXJlc3RfaW5pdCgpOwogfQogCi1zdGF0aWMgaW50IGluaXRjYWxsX2RlYnVnOworaW50IGluaXRjYWxsX2RlYnVnOwogY29yZV9wYXJhbShpbml0Y2FsbF9kZWJ1ZywgaW5pdGNhbGxfZGVidWcsIGJvb2wsIDA2NDQpOwogCiBpbnQgZG9fb25lX2luaXRjYWxsKGluaXRjYWxsX3QgZm4pCkBAIC03ODYsOCArNzg1LDEwIEBACiAvKiBUaGlzIGlzIGEgbm9uIF9faW5pdCBmdW5jdGlvbi4gRm9yY2UgaXQgdG8gYmUgbm9pbmxpbmUgb3RoZXJ3aXNlIGdjYwogICogbWFrZXMgaXQgaW5saW5lIHRvIGluaXQoKSBhbmQgaXQgYmVjb21lcyBwYXJ0IG9mIGluaXQudGV4dCBzZWN0aW9uCiAgKi8KLXN0YXRpYyBpbnQgbm9pbmxpbmUgaW5pdF9wb3N0KHZvaWQpCitzdGF0aWMgbm9pbmxpbmUgaW50IGluaXRfcG9zdCh2b2lkKQogeworCS8qIG5lZWQgdG8gZmluaXNoIGFsbCBhc3luYyBfX2luaXQgY29kZSBiZWZvcmUgZnJlZWluZyB0aGUgbWVtb3J5ICovCisJYXN5bmNfc3luY2hyb25pemVfZnVsbCgpOwogCWZyZWVfaW5pdG1lbSgpOwogCXVubG9ja19rZXJuZWwoKTsKIAltYXJrX3JvZGF0YV9ybygpOwpkaWZmIC0tZ2l0IGEvaXBjL2lwY19zeXNjdGwuYyBiL2lwYy9pcGNfc3lzY3RsLmMKaW5kZXggMGRmZWJjNS4uNGE3YTEyYyAxMDA2NDQKLS0tIGEvaXBjL2lwY19zeXNjdGwuYworKysgYi9pcGMvaXBjX3N5c2N0bC5jCkBAIC0yNiwyOSArMjYsNiBAQAogCXJldHVybiB3aGljaDsKIH0KIAotLyoKLSAqIFJvdXRpbmUgdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgZmlsZSAiYXV0b19tc2dtbmkiIGhhcyBzdWNjZXNzZnVsbHkgYmVlbgotICogd3JpdHRlbi4KLSAqIFR3byB2YWx1ZXMgYXJlIGFsbG93ZWQ6Ci0gKiAwOiB1bnJlZ2lzdGVyIG1zZ21uaSdzIGNhbGxiYWNrIHJvdXRpbmUgZnJvbSB0aGUgaXBjIG5hbWVzcGFjZSBub3RpZmllcgotICogICAgY2hhaW4uIFRoaXMgbWVhbnMgdGhhdCBtc2dtbmkgd29uJ3QgYmUgcmVjb21wdXRlZCBhbnltb3JlIHVwb24gbWVtb3J5Ci0gKiAgICBhZGQvcmVtb3ZlIG9yIGlwYyBuYW1lc3BhY2UgY3JlYXRpb24vcmVtb3ZhbC4KLSAqIDE6IHJlZ2lzdGVyIGJhY2sgdGhlIGNhbGxiYWNrIHJvdXRpbmUuCi0gKi8KLXN0YXRpYyB2b2lkIGlwY19hdXRvX2NhbGxiYWNrKGludCB2YWwpCi17Ci0JaWYgKCF2YWwpCi0JCXVucmVnaXN0ZXJfaXBjbnNfbm90aWZpZXIoY3VycmVudC0+bnNwcm94eS0+aXBjX25zKTsKLQllbHNlIHsKLQkJLyoKLQkJICogUmUtZW5hYmxlIGF1dG9tYXRpYyByZWNvbXB1dGluZyBvbmx5IGlmIG5vdCBhbHJlYWR5Ci0JCSAqIGVuYWJsZWQuCi0JCSAqLwotCQlyZWNvbXB1dGVfbXNnbW5pKGN1cnJlbnQtPm5zcHJveHktPmlwY19ucyk7Ci0JCWNvbmRfcmVnaXN0ZXJfaXBjbnNfbm90aWZpZXIoY3VycmVudC0+bnNwcm94eS0+aXBjX25zKTsKLQl9Ci19Ci0KICNpZmRlZiBDT05GSUdfUFJPQ19GUwogc3RhdGljIGludCBwcm9jX2lwY19kb2ludHZlYyhjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCXZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQpAQCAtOTQsNiArNzEsMjkgQEAKIAkJCQkJbGVucCwgcHBvcyk7CiB9CiAKKy8qCisgKiBSb3V0aW5lIHRoYXQgaXMgY2FsbGVkIHdoZW4gdGhlIGZpbGUgImF1dG9fbXNnbW5pIiBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4KKyAqIHdyaXR0ZW4uCisgKiBUd28gdmFsdWVzIGFyZSBhbGxvd2VkOgorICogMDogdW5yZWdpc3RlciBtc2dtbmkncyBjYWxsYmFjayByb3V0aW5lIGZyb20gdGhlIGlwYyBuYW1lc3BhY2Ugbm90aWZpZXIKKyAqICAgIGNoYWluLiBUaGlzIG1lYW5zIHRoYXQgbXNnbW5pIHdvbid0IGJlIHJlY29tcHV0ZWQgYW55bW9yZSB1cG9uIG1lbW9yeQorICogICAgYWRkL3JlbW92ZSBvciBpcGMgbmFtZXNwYWNlIGNyZWF0aW9uL3JlbW92YWwuCisgKiAxOiByZWdpc3RlciBiYWNrIHRoZSBjYWxsYmFjayByb3V0aW5lLgorICovCitzdGF0aWMgdm9pZCBpcGNfYXV0b19jYWxsYmFjayhpbnQgdmFsKQoreworCWlmICghdmFsKQorCQl1bnJlZ2lzdGVyX2lwY25zX25vdGlmaWVyKGN1cnJlbnQtPm5zcHJveHktPmlwY19ucyk7CisJZWxzZSB7CisJCS8qCisJCSAqIFJlLWVuYWJsZSBhdXRvbWF0aWMgcmVjb21wdXRpbmcgb25seSBpZiBub3QgYWxyZWFkeQorCQkgKiBlbmFibGVkLgorCQkgKi8KKwkJcmVjb21wdXRlX21zZ21uaShjdXJyZW50LT5uc3Byb3h5LT5pcGNfbnMpOworCQljb25kX3JlZ2lzdGVyX2lwY25zX25vdGlmaWVyKGN1cnJlbnQtPm5zcHJveHktPmlwY19ucyk7CisJfQorfQorCiBzdGF0aWMgaW50IHByb2NfaXBjYXV0b19kb2ludHZlY19taW5tYXgoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAogCXN0cnVjdCBmaWxlICpmaWxwLCB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKZGlmZiAtLWdpdCBhL2lwYy9tcXVldWUuYyBiL2lwYy9tcXVldWUuYwppbmRleCBkNDQ4YjY5Li4yM2ZkYjg0IDEwMDY0NAotLS0gYS9pcGMvbXF1ZXVlLmMKKysrIGIvaXBjL21xdWV1ZS5jCkBAIC0xMjAsNyArMTIwLDYgQEAKIAkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CiAJCWlub2RlLT5pX3VpZCA9IGN1cnJlbnRfZnN1aWQoKTsKIAkJaW5vZGUtPmlfZ2lkID0gY3VycmVudF9mc2dpZCgpOwotCQlpbm9kZS0+aV9ibG9ja3MgPSAwOwogCQlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gaW5vZGUtPmlfYXRpbWUgPQogCQkJCUNVUlJFTlRfVElNRTsKIApAQCAtNTA2LDcgKzUwNSw4IEBACiAJCQlzaWdfaS5zaV9lcnJubyA9IDA7CiAJCQlzaWdfaS5zaV9jb2RlID0gU0lfTUVTR1E7CiAJCQlzaWdfaS5zaV92YWx1ZSA9IGluZm8tPm5vdGlmeS5zaWdldl92YWx1ZTsKLQkJCXNpZ19pLnNpX3BpZCA9IHRhc2tfdGdpZF92bnIoY3VycmVudCk7CisJCQlzaWdfaS5zaV9waWQgPSB0YXNrX3RnaWRfbnJfbnMoY3VycmVudCwKKwkJCQkJCW5zX29mX3BpZChpbmZvLT5ub3RpZnlfb3duZXIpKTsKIAkJCXNpZ19pLnNpX3VpZCA9IGN1cnJlbnRfdWlkKCk7CiAKIAkJCWtpbGxfcGlkX2luZm8oaW5mby0+bm90aWZ5LnNpZ2V2X3NpZ25vLApkaWZmIC0tZ2l0IGEvaXBjL3NlbS5jIGIvaXBjL3NlbS5jCmluZGV4IDA4MjEyMjQuLmM2OGNkM2YgMTAwNjQ0Ci0tLSBhL2lwYy9zZW0uYworKysgYi9pcGMvc2VtLmMKQEAgLTU4LDcgKzU4LDcgQEAKICAqIFNNUC10aHJlYWRlZCwgc3lzY3RsJ3MgYWRkZWQKICAqIChjKSAxOTk5IE1hbmZyZWQgU3ByYXVsIDxtYW5mcmVkQGNvbG9yZnVsbGlmZS5jb20+CiAgKiBFbmZvcmNlZCByYW5nZSBsaW1pdCBvbiBTRU1fVU5ETwotICogKGMpIDIwMDEgUmVkIEhhdCBJbmMgPGFsYW5AcmVkaGF0LmNvbT4KKyAqIChjKSAyMDAxIFJlZCBIYXQgSW5jCiAgKiBMb2NrbGVzcyB3YWtldXAKICAqIChjKSAyMDAzIE1hbmZyZWQgU3ByYXVsIDxtYW5mcmVkQGNvbG9yZnVsbGlmZS5jb20+CiAgKgpAQCAtMTIxNiw3ICsxMjE2LDYgQEAKIAlpZiAodGltZW91dCAmJiBqaWZmaWVzX2xlZnQgPT0gMCkKIAkJZXJyb3IgPSAtRUFHQUlOOwogCWxpc3RfZGVsKCZxdWV1ZS5saXN0KTsKLQlnb3RvIG91dF91bmxvY2tfZnJlZTsKIAogb3V0X3VubG9ja19mcmVlOgogCXNlbV91bmxvY2soc21hKTsKZGlmZiAtLWdpdCBhL2lwYy9zaG0uYyBiL2lwYy9zaG0uYwppbmRleCA1N2RkNTAwLi5iMTI1YjU2IDEwMDY0NAotLS0gYS9pcGMvc2htLmMKKysrIGIvaXBjL3NobS5jCkBAIC03NSw3ICs3NSw3IEBACiAJbnMtPnNobV9jdGxhbGwgPSBTSE1BTEw7CiAJbnMtPnNobV9jdGxtbmkgPSBTSE1NTkk7CiAJbnMtPnNobV90b3QgPSAwOwotCWlwY19pbml0X2lkcygmbnMtPmlkc1tJUENfU0hNX0lEU10pOworCWlwY19pbml0X2lkcygmc2htX2lkcyhucykpOwogfQogCiAvKgpAQCAtNjQ0LDcgKzY0NCw3IEBACiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwogCi0JCW1lbXNldCgmc2htaW5mbywwLHNpemVvZihzaG1pbmZvKSk7CisJCW1lbXNldCgmc2htaW5mbywgMCwgc2l6ZW9mKHNobWluZm8pKTsKIAkJc2htaW5mby5zaG1tbmkgPSBzaG1pbmZvLnNobXNlZyA9IG5zLT5zaG1fY3RsbW5pOwogCQlzaG1pbmZvLnNobW1heCA9IG5zLT5zaG1fY3RsbWF4OwogCQlzaG1pbmZvLnNobWFsbCA9IG5zLT5zaG1fY3RsYWxsOwpAQCAtNjY5LDcgKzY2OSw3IEBACiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwogCi0JCW1lbXNldCgmc2htX2luZm8sMCxzaXplb2Yoc2htX2luZm8pKTsKKwkJbWVtc2V0KCZzaG1faW5mbywgMCwgc2l6ZW9mKHNobV9pbmZvKSk7CiAJCWRvd25fcmVhZCgmc2htX2lkcyhucykucndfbXV0ZXgpOwogCQlzaG1faW5mby51c2VkX2lkcyA9IHNobV9pZHMobnMpLmluX3VzZTsKIAkJc2htX2dldF9zdGF0IChucywgJnNobV9pbmZvLnNobV9yc3MsICZzaG1faW5mby5zaG1fc3dwKTsKQEAgLTY3OCw3ICs2NzgsNyBAQAogCQlzaG1faW5mby5zd2FwX3N1Y2Nlc3NlcyA9IDA7CiAJCWVyciA9IGlwY19nZXRfbWF4aWQoJnNobV9pZHMobnMpKTsKIAkJdXBfcmVhZCgmc2htX2lkcyhucykucndfbXV0ZXgpOwotCQlpZihjb3B5X3RvX3VzZXIgKGJ1ZiwgJnNobV9pbmZvLCBzaXplb2Yoc2htX2luZm8pKSkgeworCQlpZiAoY29weV90b191c2VyKGJ1ZiwgJnNobV9pbmZvLCBzaXplb2Yoc2htX2luZm8pKSkgewogCQkJZXJyID0gLUVGQVVMVDsKIAkJCWdvdG8gb3V0OwogCQl9CkBAIC02OTIsMTEgKzY5Miw2IEBACiAJCXN0cnVjdCBzaG1pZDY0X2RzIHRidWY7CiAJCWludCByZXN1bHQ7CiAKLQkJaWYgKCFidWYpIHsKLQkJCWVyciA9IC1FRkFVTFQ7Ci0JCQlnb3RvIG91dDsKLQkJfQotCiAJCWlmIChjbWQgPT0gU0hNX1NUQVQpIHsKIAkJCXNocCA9IHNobV9sb2NrKG5zLCBzaG1pZCk7CiAJCQlpZiAoSVNfRVJSKHNocCkpIHsKQEAgLTcxMiw3ICs3MDcsNyBAQAogCQkJfQogCQkJcmVzdWx0ID0gMDsKIAkJfQotCQllcnI9LUVBQ0NFUzsKKwkJZXJyID0gLUVBQ0NFUzsKIAkJaWYgKGlwY3Blcm1zICgmc2hwLT5zaG1fcGVybSwgU19JUlVHTykpCiAJCQlnb3RvIG91dF91bmxvY2s7CiAJCWVyciA9IHNlY3VyaXR5X3NobV9zaG1jdGwoc2hwLCBjbWQpOwpkaWZmIC0tZ2l0IGEva2VybmVsL01ha2VmaWxlIGIva2VybmVsL01ha2VmaWxlCmluZGV4IGUxYzViZjMuLjI5MjFkOTAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9NYWtlZmlsZQorKysgYi9rZXJuZWwvTWFrZWZpbGUKQEAgLTksNyArOSw4IEBACiAJICAgIHJjdXBkYXRlLm8gZXh0YWJsZS5vIHBhcmFtcy5vIHBvc2l4LXRpbWVycy5vIFwKIAkgICAga3RocmVhZC5vIHdhaXQubyBrZmlmby5vIHN5c19uaS5vIHBvc2l4LWNwdS10aW1lcnMubyBtdXRleC5vIFwKIAkgICAgaHJ0aW1lci5vIHJ3c2VtLm8gbnNwcm94eS5vIHNyY3UubyBzZW1hcGhvcmUubyBcCi0JICAgIG5vdGlmaWVyLm8ga3N5c2ZzLm8gcG1fcW9zX3BhcmFtcy5vIHNjaGVkX2Nsb2NrLm8gY3JlZC5vCisJICAgIG5vdGlmaWVyLm8ga3N5c2ZzLm8gcG1fcW9zX3BhcmFtcy5vIHNjaGVkX2Nsb2NrLm8gY3JlZC5vIFwKKwkgICAgYXN5bmMubwogCiBpZmRlZiBDT05GSUdfRlVOQ1RJT05fVFJBQ0VSCiAjIERvIG5vdCB0cmFjZSBkZWJ1ZyBmaWxlcyBhbmQgaW50ZXJuYWwgZnRyYWNlIGZpbGVzCmRpZmYgLS1naXQgYS9rZXJuZWwvYXN5bmMuYyBiL2tlcm5lbC9hc3luYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0Y2M5MTYKLS0tIC9kZXYvbnVsbAorKysgYi9rZXJuZWwvYXN5bmMuYwpAQCAtMCwwICsxLDMyMyBAQAorLyoKKyAqIGFzeW5jLmM6IEFzeW5jaHJvbm91cyBmdW5jdGlvbiBjYWxscyBmb3IgYm9vdCBwZXJmb3JtYW5jZQorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBBcmphbiB2YW4gZGUgVmVuIDxhcmphbkBsaW51eC5pbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLgorICovCisKKworLyoKKworR29hbHMgYW5kIFRoZW9yeSBvZiBPcGVyYXRpb24KKworVGhlIHByaW1hcnkgZ29hbCBvZiB0aGlzIGZlYXR1cmUgaXMgdG8gcmVkdWNlIHRoZSBrZXJuZWwgYm9vdCB0aW1lLAorYnkgZG9pbmcgdmFyaW91cyBpbmRlcGVuZGVudCBoYXJkd2FyZSBkZWxheXMgYW5kIGRpc2NvdmVyeSBvcGVyYXRpb25zCitkZWNvdXBsZWQgYW5kIG5vdCBzdHJpY3RseSBzZXJpYWxpemVkLgorCitNb3JlIHNwZWNpZmljYWxseSwgdGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiBjYWxsIGNvbmNlcHQgYWxsb3dzCitjZXJ0YWluIG9wZXJhdGlvbnMgKHByaW1hcmlseSBkdXJpbmcgc3lzdGVtIGJvb3QpIHRvIGhhcHBlbgorYXN5bmNocm9ub3VzbHksIG91dCBvZiBvcmRlciwgd2hpbGUgdGhlc2Ugb3BlcmF0aW9ucyBzdGlsbAoraGF2ZSB0aGVpciBleHRlcm5hbGx5IHZpc2libGUgcGFydHMgaGFwcGVuIHNlcXVlbnRpYWxseSBhbmQgaW4tb3JkZXIuCisobm90IHVubGlrZSBob3cgb3V0LW9mLW9yZGVyIENQVXMgcmV0aXJlIHRoZWlyIGluc3RydWN0aW9ucyBpbiBvcmRlcikKKworS2V5IHRvIHRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24gY2FsbCBpbXBsZW1lbnRhdGlvbiBpcyB0aGUgY29uY2VwdCBvZgorYSAic2VxdWVuY2UgY29va2llIiAod2hpY2gsIGFsdGhvdWdoIGl0IGhhcyBhbiBhYnN0cmFjdGVkIHR5cGUsIGNhbiBiZQordGhvdWdodCBvZiBhcyBhIG1vbm90b25pY2FsbHkgaW5jcmVtZW50aW5nIG51bWJlcikuCisKK1RoZSBhc3luYyBjb3JlIHdpbGwgYXNzaWduIGVhY2ggc2NoZWR1bGVkIGV2ZW50IHN1Y2ggYSBzZXF1ZW5jZSBjb29raWUgYW5kCitwYXNzIHRoaXMgdG8gdGhlIGNhbGxlZCBmdW5jdGlvbnMuCisKK1RoZSBhc3luY2hyb25vdXNseSBjYWxsZWQgZnVuY3Rpb24gc2hvdWxkIGJlZm9yZSBkb2luZyBhIGdsb2JhbGx5IHZpc2libGUKK29wZXJhdGlvbiwgc3VjaCBhcyByZWdpc3RlcmluZyBkZXZpY2UgbnVtYmVycywgY2FsbCB0aGUKK2FzeW5jX3N5bmNocm9uaXplX2Nvb2tpZSgpIGZ1bmN0aW9uIGFuZCBwYXNzIGluIGl0cyBvd24gY29va2llLiBUaGUKK2FzeW5jX3N5bmNocm9uaXplX2Nvb2tpZSgpIGZ1bmN0aW9uIHdpbGwgbWFrZSBzdXJlIHRoYXQgYWxsIGFzeW5jaHJvbm91cworb3BlcmF0aW9ucyB0aGF0IHdlcmUgc2NoZWR1bGVkIHByaW9yIHRvIHRoZSBvcGVyYXRpb24gY29ycmVzcG9uZGluZyB3aXRoIHRoZQorY29va2llIGhhdmUgY29tcGxldGVkLgorCitTdWJzeXN0ZW0vZHJpdmVyIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBzY2hlZHVsZWQgYXN5bmNocm9ub3VzIHByb2JlCitmdW5jdGlvbnMsIGJ1dCB3aGljaCBzaGFyZXMgZ2xvYmFsIHJlc291cmNlcyB3aXRoIG90aGVyIGRyaXZlcnMvc3Vic3lzdGVtcwordGhhdCBkbyBub3QgdXNlIHRoZSBhc3luY2hyb25vdXMgY2FsbCBmZWF0dXJlLCBuZWVkIHRvIGRvIGEgZnVsbAorc3luY2hyb25pemF0aW9uIHdpdGggdGhlIGFzeW5jX3N5bmNocm9uaXplX2Z1bGwoKSBmdW5jdGlvbiwgYmVmb3JlIHJldHVybmluZworZnJvbSB0aGVpciBpbml0IGZ1bmN0aW9uLiBUaGlzIGlzIHRvIG1haW50YWluIHN0cmljdCBvcmRlcmluZyBiZXR3ZWVuIHRoZQorYXN5bmNocm9ub3VzIGFuZCBzeW5jaHJvbm91cyBwYXJ0cyBvZiB0aGUga2VybmVsLgorCisqLworCisjaW5jbHVkZSA8bGludXgvYXN5bmMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKworc3RhdGljIGFzeW5jX2Nvb2tpZV90IG5leHRfY29va2llID0gMTsKKworI2RlZmluZSBNQVhfVEhSRUFEUwkyNTYKKyNkZWZpbmUgTUFYX1dPUksJMzI3NjgKKworc3RhdGljIExJU1RfSEVBRChhc3luY19wZW5kaW5nKTsKK3N0YXRpYyBMSVNUX0hFQUQoYXN5bmNfcnVubmluZyk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGFzeW5jX2xvY2spOworCitzdHJ1Y3QgYXN5bmNfZW50cnkgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlhc3luY19jb29raWVfdCAgIGNvb2tpZTsKKwlhc3luY19mdW5jX3B0cgkgKmZ1bmM7CisJdm9pZCAgICAgICAgICAgICAqZGF0YTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpydW5uaW5nOworfTsKKworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGFzeW5jX2RvbmUpOworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGFzeW5jX25ldyk7CisKK3N0YXRpYyBhdG9taWNfdCBlbnRyeV9jb3VudDsKK3N0YXRpYyBhdG9taWNfdCB0aHJlYWRfY291bnQ7CisKK2V4dGVybiBpbnQgaW5pdGNhbGxfZGVidWc7CisKKworLyoKKyAqIE1VU1QgYmUgY2FsbGVkIHdpdGggdGhlIGxvY2sgaGVsZCEKKyAqLworc3RhdGljIGFzeW5jX2Nvb2tpZV90ICBfX2xvd2VzdF9pbl9wcm9ncmVzcyhzdHJ1Y3QgbGlzdF9oZWFkICpydW5uaW5nKQoreworCXN0cnVjdCBhc3luY19lbnRyeSAqZW50cnk7CisJaWYgKCFsaXN0X2VtcHR5KCZhc3luY19wZW5kaW5nKSkgeworCQllbnRyeSA9IGxpc3RfZmlyc3RfZW50cnkoJmFzeW5jX3BlbmRpbmcsCisJCQlzdHJ1Y3QgYXN5bmNfZW50cnksIGxpc3QpOworCQlyZXR1cm4gZW50cnktPmNvb2tpZTsKKwl9IGVsc2UgaWYgKCFsaXN0X2VtcHR5KHJ1bm5pbmcpKSB7CisJCWVudHJ5ID0gbGlzdF9maXJzdF9lbnRyeShydW5uaW5nLAorCQkJc3RydWN0IGFzeW5jX2VudHJ5LCBsaXN0KTsKKwkJcmV0dXJuIGVudHJ5LT5jb29raWU7CisJfSBlbHNlIHsKKwkJLyogbm90aGluZyBpbiBwcm9ncmVzcy4uLiBuZXh0X2Nvb2tpZSBpcyAiaW5maW5pdHkiICovCisJCXJldHVybiBuZXh0X2Nvb2tpZTsKKwl9CisKK30KKy8qCisgKiBwaWNrIHRoZSBmaXJzdCBwZW5kaW5nIGVudHJ5IGFuZCBydW4gaXQKKyAqLworc3RhdGljIHZvaWQgcnVuX29uZV9lbnRyeSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGFzeW5jX2VudHJ5ICplbnRyeTsKKwlrdGltZV90IGNhbGx0aW1lLCBkZWx0YSwgcmV0dGltZTsKKworCS8qIDEpIHBpY2sgb25lIHRhc2sgZnJvbSB0aGUgcGVuZGluZyBxdWV1ZSAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFzeW5jX2xvY2ssIGZsYWdzKTsKKwlpZiAobGlzdF9lbXB0eSgmYXN5bmNfcGVuZGluZykpCisJCWdvdG8gb3V0OworCWVudHJ5ID0gbGlzdF9maXJzdF9lbnRyeSgmYXN5bmNfcGVuZGluZywgc3RydWN0IGFzeW5jX2VudHJ5LCBsaXN0KTsKKworCS8qIDIpIG1vdmUgaXQgdG8gdGhlIHJ1bm5pbmcgcXVldWUgKi8KKwlsaXN0X2RlbCgmZW50cnktPmxpc3QpOworCWxpc3RfYWRkX3RhaWwoJmVudHJ5LT5saXN0LCAmYXN5bmNfcnVubmluZyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXN5bmNfbG9jaywgZmxhZ3MpOworCisJLyogMykgcnVuIGl0IChhbmQgcHJpbnQgZHVyYXRpb24pKi8KKwlpZiAoaW5pdGNhbGxfZGVidWcgJiYgc3lzdGVtX3N0YXRlID09IFNZU1RFTV9CT09USU5HKSB7CisJCXByaW50aygiY2FsbGluZyAgJWxsaV8lcEYgQCAlaVxuIiwgZW50cnktPmNvb2tpZSwgZW50cnktPmZ1bmMsIHRhc2tfcGlkX25yKGN1cnJlbnQpKTsKKwkJY2FsbHRpbWUgPSBrdGltZV9nZXQoKTsKKwl9CisJZW50cnktPmZ1bmMoZW50cnktPmRhdGEsIGVudHJ5LT5jb29raWUpOworCWlmIChpbml0Y2FsbF9kZWJ1ZyAmJiBzeXN0ZW1fc3RhdGUgPT0gU1lTVEVNX0JPT1RJTkcpIHsKKwkJcmV0dGltZSA9IGt0aW1lX2dldCgpOworCQlkZWx0YSA9IGt0aW1lX3N1YihyZXR0aW1lLCBjYWxsdGltZSk7CisJCXByaW50aygiaW5pdGNhbGwgJWxsaV8lcEYgcmV0dXJuZWQgMCBhZnRlciAlbGxkIHVzZWNzXG4iLCBlbnRyeS0+Y29va2llLAorCQkJZW50cnktPmZ1bmMsIGt0aW1lX3RvX25zKGRlbHRhKSA+PiAxMCk7CisJfQorCisJLyogNCkgcmVtb3ZlIGl0IGZyb20gdGhlIHJ1bm5pbmcgcXVldWUgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmYXN5bmNfbG9jaywgZmxhZ3MpOworCWxpc3RfZGVsKCZlbnRyeS0+bGlzdCk7CisKKwkvKiA1KSBmcmVlIHRoZSBlbnRyeSAgKi8KKwlrZnJlZShlbnRyeSk7CisJYXRvbWljX2RlYygmZW50cnlfY291bnQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXN5bmNfbG9jaywgZmxhZ3MpOworCisJLyogNikgd2FrZSB1cCBhbnkgd2FpdGVycy4gKi8KKwl3YWtlX3VwKCZhc3luY19kb25lKTsKKwlyZXR1cm47CisKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhc3luY19sb2NrLCBmbGFncyk7Cit9CisKKworc3RhdGljIGFzeW5jX2Nvb2tpZV90IF9fYXN5bmNfc2NoZWR1bGUoYXN5bmNfZnVuY19wdHIgKnB0ciwgdm9pZCAqZGF0YSwgc3RydWN0IGxpc3RfaGVhZCAqcnVubmluZykKK3sKKwlzdHJ1Y3QgYXN5bmNfZW50cnkgKmVudHJ5OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJYXN5bmNfY29va2llX3QgbmV3Y29va2llOworCQorCisJLyogYWxsb3cgaXJxLW9mZiBjYWxsZXJzICovCisJZW50cnkgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXN5bmNfZW50cnkpLCBHRlBfQVRPTUlDKTsKKworCS8qCisJICogSWYgd2UncmUgb3V0IG9mIG1lbW9yeSBvciBpZiB0aGVyZSdzIHRvbyBtdWNoIHdvcmsKKwkgKiBwZW5kaW5nIGFscmVhZHksIHdlIGV4ZWN1dGUgc3luY2hyb25vdXNseS4KKwkgKi8KKwlpZiAoIWVudHJ5IHx8IGF0b21pY19yZWFkKCZlbnRyeV9jb3VudCkgPiBNQVhfV09SSykgeworCQlrZnJlZShlbnRyeSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZhc3luY19sb2NrLCBmbGFncyk7CisJCW5ld2Nvb2tpZSA9IG5leHRfY29va2llKys7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFzeW5jX2xvY2ssIGZsYWdzKTsKKworCQkvKiBsb3cgb24gbWVtb3J5Li4gcnVuIHN5bmNocm9ub3VzbHkgKi8KKwkJcHRyKGRhdGEsIG5ld2Nvb2tpZSk7CisJCXJldHVybiBuZXdjb29raWU7CisJfQorCWVudHJ5LT5mdW5jID0gcHRyOworCWVudHJ5LT5kYXRhID0gZGF0YTsKKwllbnRyeS0+cnVubmluZyA9IHJ1bm5pbmc7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYXN5bmNfbG9jaywgZmxhZ3MpOworCW5ld2Nvb2tpZSA9IGVudHJ5LT5jb29raWUgPSBuZXh0X2Nvb2tpZSsrOworCWxpc3RfYWRkX3RhaWwoJmVudHJ5LT5saXN0LCAmYXN5bmNfcGVuZGluZyk7CisJYXRvbWljX2luYygmZW50cnlfY291bnQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFzeW5jX2xvY2ssIGZsYWdzKTsKKwl3YWtlX3VwKCZhc3luY19uZXcpOworCXJldHVybiBuZXdjb29raWU7Cit9CisKK2FzeW5jX2Nvb2tpZV90IGFzeW5jX3NjaGVkdWxlKGFzeW5jX2Z1bmNfcHRyICpwdHIsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIF9fYXN5bmNfc2NoZWR1bGUocHRyLCBkYXRhLCAmYXN5bmNfcGVuZGluZyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhc3luY19zY2hlZHVsZSk7CisKK2FzeW5jX2Nvb2tpZV90IGFzeW5jX3NjaGVkdWxlX3NwZWNpYWwoYXN5bmNfZnVuY19wdHIgKnB0ciwgdm9pZCAqZGF0YSwgc3RydWN0IGxpc3RfaGVhZCAqcnVubmluZykKK3sKKwlyZXR1cm4gX19hc3luY19zY2hlZHVsZShwdHIsIGRhdGEsIHJ1bm5pbmcpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXN5bmNfc2NoZWR1bGVfc3BlY2lhbCk7CisKK3ZvaWQgYXN5bmNfc3luY2hyb25pemVfZnVsbCh2b2lkKQoreworCWRvIHsKKwkJYXN5bmNfc3luY2hyb25pemVfY29va2llKG5leHRfY29va2llKTsKKwl9IHdoaWxlICghbGlzdF9lbXB0eSgmYXN5bmNfcnVubmluZykgfHwgIWxpc3RfZW1wdHkoJmFzeW5jX3BlbmRpbmcpKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFzeW5jX3N5bmNocm9uaXplX2Z1bGwpOworCit2b2lkIGFzeW5jX3N5bmNocm9uaXplX2Z1bGxfc3BlY2lhbChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQoreworCWFzeW5jX3N5bmNocm9uaXplX2Nvb2tpZV9zcGVjaWFsKG5leHRfY29va2llLCBsaXN0KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFzeW5jX3N5bmNocm9uaXplX2Z1bGxfc3BlY2lhbCk7CisKK3ZvaWQgYXN5bmNfc3luY2hyb25pemVfY29va2llX3NwZWNpYWwoYXN5bmNfY29va2llX3QgY29va2llLCBzdHJ1Y3QgbGlzdF9oZWFkICpydW5uaW5nKQoreworCWt0aW1lX3Qgc3RhcnR0aW1lLCBkZWx0YSwgZW5kdGltZTsKKworCWlmIChpbml0Y2FsbF9kZWJ1ZyAmJiBzeXN0ZW1fc3RhdGUgPT0gU1lTVEVNX0JPT1RJTkcpIHsKKwkJcHJpbnRrKCJhc3luY193YWl0aW5nIEAgJWlcbiIsIHRhc2tfcGlkX25yKGN1cnJlbnQpKTsKKwkJc3RhcnR0aW1lID0ga3RpbWVfZ2V0KCk7CisJfQorCisJd2FpdF9ldmVudChhc3luY19kb25lLCBfX2xvd2VzdF9pbl9wcm9ncmVzcyhydW5uaW5nKSA+PSBjb29raWUpOworCisJaWYgKGluaXRjYWxsX2RlYnVnICYmIHN5c3RlbV9zdGF0ZSA9PSBTWVNURU1fQk9PVElORykgeworCQllbmR0aW1lID0ga3RpbWVfZ2V0KCk7CisJCWRlbHRhID0ga3RpbWVfc3ViKGVuZHRpbWUsIHN0YXJ0dGltZSk7CisKKwkJcHJpbnRrKCJhc3luY19jb250aW51aW5nIEAgJWkgYWZ0ZXIgJWxsaSB1c2VjXG4iLAorCQkJdGFza19waWRfbnIoY3VycmVudCksIGt0aW1lX3RvX25zKGRlbHRhKSA+PiAxMCk7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoYXN5bmNfc3luY2hyb25pemVfY29va2llX3NwZWNpYWwpOworCit2b2lkIGFzeW5jX3N5bmNocm9uaXplX2Nvb2tpZShhc3luY19jb29raWVfdCBjb29raWUpCit7CisJYXN5bmNfc3luY2hyb25pemVfY29va2llX3NwZWNpYWwoY29va2llLCAmYXN5bmNfcnVubmluZyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhc3luY19zeW5jaHJvbml6ZV9jb29raWUpOworCisKK3N0YXRpYyBpbnQgYXN5bmNfdGhyZWFkKHZvaWQgKnVudXNlZCkKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3cSwgY3VycmVudCk7CisJYWRkX3dhaXRfcXVldWUoJmFzeW5jX25ldywgJndxKTsKKworCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CisJCWludCByZXQgPSBIWjsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJLyoKKwkJICogY2hlY2sgdGhlIGxpc3QgaGVhZCB3aXRob3V0IGxvY2suLiBmYWxzZSBwb3NpdGl2ZXMKKwkJICogYXJlIGRlYWx0IHdpdGggaW5zaWRlIHJ1bl9vbmVfZW50cnkoKSB3aGlsZSBob2xkaW5nCisJCSAqIHRoZSBsb2NrLgorCQkgKi8KKwkJcm1iKCk7CisJCWlmICghbGlzdF9lbXB0eSgmYXN5bmNfcGVuZGluZykpCisJCQlydW5fb25lX2VudHJ5KCk7CisJCWVsc2UKKwkJCXJldCA9IHNjaGVkdWxlX3RpbWVvdXQoSFopOworCisJCWlmIChyZXQgPT0gMCkgeworCQkJLyoKKwkJCSAqIHdlIHRpbWVkIG91dCwgdGhpcyBtZWFucyB3ZSBhcyB0aHJlYWQgYXJlIHJlZHVuZGFudC4KKwkJCSAqIHdlIHNpZ24gb2ZmIGFuZCBkaWUsIGJ1dCB3ZSB0byBhdm9pZCBhbnkgcmFjZXMgdGhlcmUKKwkJCSAqIGlzIGEgbGFzdC1zdHJhdyBjaGVjayB0byBzZWUgaWYgd29yayBzbnVjayBpbi4KKwkJCSAqLworCQkJYXRvbWljX2RlYygmdGhyZWFkX2NvdW50KTsKKwkJCXdtYigpOyAvKiBtYW5hZ2VyIG11c3Qgc2VlIG91ciBkZXBhcnR1cmUgZmlyc3QgKi8KKwkJCWlmIChsaXN0X2VtcHR5KCZhc3luY19wZW5kaW5nKSkKKwkJCQlicmVhazsKKwkJCS8qCisJCQkgKiB3b29wcyB3b3JrIGNhbWUgaW4gYmV0d2VlbiB1cyB0aW1pbmcgb3V0IGFuZCB1cworCQkJICogc2lnbmluZyBvZmY7IHdlIG5lZWQgdG8gc3RheSBhbGl2ZSBhbmQga2VlcCB3b3JraW5nLgorCQkJICovCisJCQlhdG9taWNfaW5jKCZ0aHJlYWRfY291bnQpOworCQl9CisJfQorCXJlbW92ZV93YWl0X3F1ZXVlKCZhc3luY19uZXcsICZ3cSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhc3luY19tYW5hZ2VyX3RocmVhZCh2b2lkICp1bnVzZWQpCit7CisJREVDTEFSRV9XQUlUUVVFVUUod3EsIGN1cnJlbnQpOworCWFkZF93YWl0X3F1ZXVlKCZhc3luY19uZXcsICZ3cSk7CisKKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQlpbnQgdGMsIGVjOworCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisKKwkJdGMgPSBhdG9taWNfcmVhZCgmdGhyZWFkX2NvdW50KTsKKwkJcm1iKCk7CisJCWVjID0gYXRvbWljX3JlYWQoJmVudHJ5X2NvdW50KTsKKworCQl3aGlsZSAodGMgPCBlYyAmJiB0YyA8IE1BWF9USFJFQURTKSB7CisJCQlrdGhyZWFkX3J1bihhc3luY190aHJlYWQsIE5VTEwsICJhc3luYy8laSIsIHRjKTsKKwkJCWF0b21pY19pbmMoJnRocmVhZF9jb3VudCk7CisJCQl0YysrOworCQl9CisKKwkJc2NoZWR1bGUoKTsKKwl9CisJcmVtb3ZlX3dhaXRfcXVldWUoJmFzeW5jX25ldywgJndxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhc3luY19pbml0KHZvaWQpCit7CisJa3RocmVhZF9ydW4oYXN5bmNfbWFuYWdlcl90aHJlYWQsIE5VTEwsICJhc3luYy9tZ3IiKTsKKwlyZXR1cm4gMDsKK30KKworY29yZV9pbml0Y2FsbChhc3luY19pbml0KTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9jYXBhYmlsaXR5LmMgYi9rZXJuZWwvY2FwYWJpbGl0eS5jCmluZGV4IGM1OThkOWQuLjY4ODkyNmUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jYXBhYmlsaXR5LmMKKysrIGIva2VybmVsL2NhcGFiaWxpdHkuYwpAQCAtMzA2LDcgKzMwNiw3IEBACiAJCUJVRygpOwogCX0KIAotCWlmIChoYXNfY2FwYWJpbGl0eShjdXJyZW50LCBjYXApKSB7CisJaWYgKHNlY3VyaXR5X2NhcGFibGUoY2FwKSA9PSAwKSB7CiAJCWN1cnJlbnQtPmZsYWdzIHw9IFBGX1NVUEVSUFJJVjsKIAkJcmV0dXJuIDE7CiAJfQpkaWZmIC0tZ2l0IGEva2VybmVsL2Nncm91cC5jIGIva2VybmVsL2Nncm91cC5jCmluZGV4IDg5MWE4NGUuLmMyOTgzMTAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jZ3JvdXAuYworKysgYi9rZXJuZWwvY2dyb3VwLmMKQEAgLTg0LDcgKzg0LDcgQEAKIAkvKiBUcmFja3MgaG93IG1hbnkgY2dyb3VwcyBhcmUgY3VycmVudGx5IGRlZmluZWQgaW4gaGllcmFyY2h5LiovCiAJaW50IG51bWJlcl9vZl9jZ3JvdXBzOwogCi0JLyogQSBsaXN0IHJ1bm5pbmcgdGhyb3VnaCB0aGUgbW91bnRlZCBoaWVyYXJjaGllcyAqLworCS8qIEEgbGlzdCBydW5uaW5nIHRocm91Z2ggdGhlIGFjdGl2ZSBoaWVyYXJjaGllcyAqLwogCXN0cnVjdCBsaXN0X2hlYWQgcm9vdF9saXN0OwogCiAJLyogSGllcmFyY2h5LXNwZWNpZmljIGZsYWdzICovCkBAIC0xMTYsNyArMTE2LDYgQEAKICAqIGJlIGNhbGxlZC4KICAqLwogc3RhdGljIGludCBuZWVkX2ZvcmtleGl0X2NhbGxiYWNrIF9fcmVhZF9tb3N0bHk7Ci1zdGF0aWMgaW50IG5lZWRfbW1fb3duZXJfY2FsbGJhY2sgX19yZWFkX21vc3RseTsKIAogLyogY29udmVuaWVudCB0ZXN0cyBmb3IgdGhlc2UgYml0cyAqLwogaW5saW5lIGludCBjZ3JvdXBfaXNfcmVtb3ZlZChjb25zdCBzdHJ1Y3QgY2dyb3VwICpjZ3JwKQpAQCAtMTQ5LDggKzE0OCw4IEBACiAjZGVmaW5lIGZvcl9lYWNoX3N1YnN5cyhfcm9vdCwgX3NzKSBcCiBsaXN0X2Zvcl9lYWNoX2VudHJ5KF9zcywgJl9yb290LT5zdWJzeXNfbGlzdCwgc2libGluZykKIAotLyogZm9yX2VhY2hfcm9vdCgpIGFsbG93cyB5b3UgdG8gaXRlcmF0ZSBhY3Jvc3MgdGhlIGFjdGl2ZSBoaWVyYXJjaGllcyAqLwotI2RlZmluZSBmb3JfZWFjaF9yb290KF9yb290KSBcCisvKiBmb3JfZWFjaF9hY3RpdmVfcm9vdCgpIGFsbG93cyB5b3UgdG8gaXRlcmF0ZSBhY3Jvc3MgdGhlIGFjdGl2ZSBoaWVyYXJjaGllcyAqLworI2RlZmluZSBmb3JfZWFjaF9hY3RpdmVfcm9vdChfcm9vdCkgXAogbGlzdF9mb3JfZWFjaF9lbnRyeShfcm9vdCwgJnJvb3RzLCByb290X2xpc3QpCiAKIC8qIHRoZSBsaXN0IG9mIGNncm91cHMgZWxpZ2libGUgZm9yIGF1dG9tYXRpYyByZWxlYXNlLiBQcm90ZWN0ZWQgYnkKQEAgLTI3Miw3ICsyNzEsNyBAQAogCiAJcmN1X3JlYWRfbG9jaygpOwogCWZvciAoaSA9IDA7IGkgPCBDR1JPVVBfU1VCU1lTX0NPVU5UOyBpKyspIHsKLQkJc3RydWN0IGNncm91cCAqY2dycCA9IGNnLT5zdWJzeXNbaV0tPmNncm91cDsKKwkJc3RydWN0IGNncm91cCAqY2dycCA9IHJjdV9kZXJlZmVyZW5jZShjZy0+c3Vic3lzW2ldLT5jZ3JvdXApOwogCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmY2dycC0+Y291bnQpICYmCiAJCSAgICBub3RpZnlfb25fcmVsZWFzZShjZ3JwKSkgewogCQkJaWYgKHRhc2tleGl0KQpAQCAtMzg1LDYgKzM4NCwyNSBAQAogCXJldHVybiAwOwogfQogCisvKioKKyAqIGxpbmtfY3NzX3NldCAtIGEgaGVscGVyIGZ1bmN0aW9uIHRvIGxpbmsgYSBjc3Nfc2V0IHRvIGEgY2dyb3VwCisgKiBAdG1wX2NnX2xpbmtzOiBjZ19jZ3JvdXBfbGluayBvYmplY3RzIGFsbG9jYXRlZCBieSBhbGxvY2F0ZV9jZ19saW5rcygpCisgKiBAY2c6IHRoZSBjc3Nfc2V0IHRvIGJlIGxpbmtlZAorICogQGNncnA6IHRoZSBkZXN0aW5hdGlvbiBjZ3JvdXAKKyAqLworc3RhdGljIHZvaWQgbGlua19jc3Nfc2V0KHN0cnVjdCBsaXN0X2hlYWQgKnRtcF9jZ19saW5rcywKKwkJCSBzdHJ1Y3QgY3NzX3NldCAqY2csIHN0cnVjdCBjZ3JvdXAgKmNncnApCit7CisJc3RydWN0IGNnX2Nncm91cF9saW5rICpsaW5rOworCisJQlVHX09OKGxpc3RfZW1wdHkodG1wX2NnX2xpbmtzKSk7CisJbGluayA9IGxpc3RfZmlyc3RfZW50cnkodG1wX2NnX2xpbmtzLCBzdHJ1Y3QgY2dfY2dyb3VwX2xpbmssCisJCQkJY2dycF9saW5rX2xpc3QpOworCWxpbmstPmNnID0gY2c7CisJbGlzdF9tb3ZlKCZsaW5rLT5jZ3JwX2xpbmtfbGlzdCwgJmNncnAtPmNzc19zZXRzKTsKKwlsaXN0X2FkZCgmbGluay0+Y2dfbGlua19saXN0LCAmY2ctPmNnX2xpbmtzKTsKK30KKwogLyoKICAqIGZpbmRfY3NzX3NldCgpIHRha2VzIGFuIGV4aXN0aW5nIGNncm91cCBncm91cCBhbmQgYQogICogY2dyb3VwIG9iamVjdCwgYW5kIHJldHVybnMgYSBjc3Nfc2V0IG9iamVjdCB0aGF0J3MKQEAgLTQwMCw3ICs0MTgsNiBAQAogCWludCBpOwogCiAJc3RydWN0IGxpc3RfaGVhZCB0bXBfY2dfbGlua3M7Ci0Jc3RydWN0IGNnX2Nncm91cF9saW5rICpsaW5rOwogCiAJc3RydWN0IGhsaXN0X2hlYWQgKmhoZWFkOwogCkBAIC00NDUsMjYgKzQ2MiwxMSBAQAogCQkgKiBvbmx5IGRvIGl0IGZvciB0aGUgZmlyc3Qgc3Vic3lzdGVtIGluIGVhY2gKIAkJICogaGllcmFyY2h5CiAJCSAqLwotCQlpZiAoc3MtPnJvb3QtPnN1YnN5c19saXN0Lm5leHQgPT0gJnNzLT5zaWJsaW5nKSB7Ci0JCQlCVUdfT04obGlzdF9lbXB0eSgmdG1wX2NnX2xpbmtzKSk7Ci0JCQlsaW5rID0gbGlzdF9lbnRyeSh0bXBfY2dfbGlua3MubmV4dCwKLQkJCQkJICBzdHJ1Y3QgY2dfY2dyb3VwX2xpbmssCi0JCQkJCSAgY2dycF9saW5rX2xpc3QpOwotCQkJbGlzdF9kZWwoJmxpbmstPmNncnBfbGlua19saXN0KTsKLQkJCWxpc3RfYWRkKCZsaW5rLT5jZ3JwX2xpbmtfbGlzdCwgJmNncnAtPmNzc19zZXRzKTsKLQkJCWxpbmstPmNnID0gcmVzOwotCQkJbGlzdF9hZGQoJmxpbmstPmNnX2xpbmtfbGlzdCwgJnJlcy0+Y2dfbGlua3MpOwotCQl9CisJCWlmIChzcy0+cm9vdC0+c3Vic3lzX2xpc3QubmV4dCA9PSAmc3MtPnNpYmxpbmcpCisJCQlsaW5rX2Nzc19zZXQoJnRtcF9jZ19saW5rcywgcmVzLCBjZ3JwKTsKIAl9Ci0JaWYgKGxpc3RfZW1wdHkoJnJvb3Rub2RlLnN1YnN5c19saXN0KSkgewotCQlsaW5rID0gbGlzdF9lbnRyeSh0bXBfY2dfbGlua3MubmV4dCwKLQkJCQkgIHN0cnVjdCBjZ19jZ3JvdXBfbGluaywKLQkJCQkgIGNncnBfbGlua19saXN0KTsKLQkJbGlzdF9kZWwoJmxpbmstPmNncnBfbGlua19saXN0KTsKLQkJbGlzdF9hZGQoJmxpbmstPmNncnBfbGlua19saXN0LCAmZHVtbXl0b3AtPmNzc19zZXRzKTsKLQkJbGluay0+Y2cgPSByZXM7Ci0JCWxpc3RfYWRkKCZsaW5rLT5jZ19saW5rX2xpc3QsICZyZXMtPmNnX2xpbmtzKTsKLQl9CisJaWYgKGxpc3RfZW1wdHkoJnJvb3Rub2RlLnN1YnN5c19saXN0KSkKKwkJbGlua19jc3Nfc2V0KCZ0bXBfY2dfbGlua3MsIHJlcywgZHVtbXl0b3ApOwogCiAJQlVHX09OKCFsaXN0X2VtcHR5KCZ0bXBfY2dfbGlua3MpKTsKIApAQCAtNTczLDcgKzU3NSw2IEBACiAJCWlub2RlLT5pX21vZGUgPSBtb2RlOwogCQlpbm9kZS0+aV91aWQgPSBjdXJyZW50X2ZzdWlkKCk7CiAJCWlub2RlLT5pX2dpZCA9IGN1cnJlbnRfZnNnaWQoKTsKLQkJaW5vZGUtPmlfYmxvY2tzID0gMDsKIAkJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCQlpbm9kZS0+aV9tYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvID0gJmNncm91cF9iYWNraW5nX2Rldl9pbmZvOwogCX0KQEAgLTU4OCwxMSArNTg5LDE4IEBACiB7CiAJc3RydWN0IGNncm91cF9zdWJzeXMgKnNzOwogCWZvcl9lYWNoX3N1YnN5cyhjZ3JwLT5yb290LCBzcykKLQkJaWYgKHNzLT5wcmVfZGVzdHJveSAmJiBjZ3JwLT5zdWJzeXNbc3MtPnN1YnN5c19pZF0pCisJCWlmIChzcy0+cHJlX2Rlc3Ryb3kpCiAJCQlzcy0+cHJlX2Rlc3Ryb3koc3MsIGNncnApOwogCXJldHVybjsKIH0KIAorc3RhdGljIHZvaWQgZnJlZV9jZ3JvdXBfcmN1KHN0cnVjdCByY3VfaGVhZCAqb2JqKQoreworCXN0cnVjdCBjZ3JvdXAgKmNncnAgPSBjb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgY2dyb3VwLCByY3VfaGVhZCk7CisKKwlrZnJlZShjZ3JwKTsKK30KKwogc3RhdGljIHZvaWQgY2dyb3VwX2RpcHV0KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAkvKiBpcyBkZW50cnkgYSBkaXJlY3RvcnkgPyBpZiBzbywga2ZyZWUoKSBhc3NvY2lhdGVkIGNncm91cCAqLwpAQCAtNjEyLDE5ICs2MjAsMTkgQEAKIAkJLyoKIAkJICogUmVsZWFzZSB0aGUgc3Vic3lzdGVtIHN0YXRlIG9iamVjdHMuCiAJCSAqLwotCQlmb3JfZWFjaF9zdWJzeXMoY2dycC0+cm9vdCwgc3MpIHsKLQkJCWlmIChjZ3JwLT5zdWJzeXNbc3MtPnN1YnN5c19pZF0pCi0JCQkJc3MtPmRlc3Ryb3koc3MsIGNncnApOwotCQl9CisJCWZvcl9lYWNoX3N1YnN5cyhjZ3JwLT5yb290LCBzcykKKwkJCXNzLT5kZXN0cm95KHNzLCBjZ3JwKTsKIAogCQljZ3JwLT5yb290LT5udW1iZXJfb2ZfY2dyb3Vwcy0tOwogCQltdXRleF91bmxvY2soJmNncm91cF9tdXRleCk7CiAKLQkJLyogRHJvcCB0aGUgYWN0aXZlIHN1cGVyYmxvY2sgcmVmZXJlbmNlIHRoYXQgd2UgdG9vayB3aGVuIHdlCi0JCSAqIGNyZWF0ZWQgdGhlIGNncm91cCAqLworCQkvKgorCQkgKiBEcm9wIHRoZSBhY3RpdmUgc3VwZXJibG9jayByZWZlcmVuY2UgdGhhdCB3ZSB0b29rIHdoZW4gd2UKKwkJICogY3JlYXRlZCB0aGUgY2dyb3VwCisJCSAqLwogCQlkZWFjdGl2YXRlX3N1cGVyKGNncnAtPnJvb3QtPnNiKTsKIAotCQlrZnJlZShjZ3JwKTsKKwkJY2FsbF9yY3UoJmNncnAtPnJjdV9oZWFkLCBmcmVlX2Nncm91cF9yY3UpOwogCX0KIAlpcHV0KGlub2RlKTsKIH0KQEAgLTcxNCwyMyArNzIyLDI2IEBACiAJCQlCVUdfT04oY2dycC0+c3Vic3lzW2ldKTsKIAkJCUJVR19PTighZHVtbXl0b3AtPnN1YnN5c1tpXSk7CiAJCQlCVUdfT04oZHVtbXl0b3AtPnN1YnN5c1tpXS0+Y2dyb3VwICE9IGR1bW15dG9wKTsKKwkJCW11dGV4X2xvY2soJnNzLT5oaWVyYXJjaHlfbXV0ZXgpOwogCQkJY2dycC0+c3Vic3lzW2ldID0gZHVtbXl0b3AtPnN1YnN5c1tpXTsKIAkJCWNncnAtPnN1YnN5c1tpXS0+Y2dyb3VwID0gY2dycDsKLQkJCWxpc3RfYWRkKCZzcy0+c2libGluZywgJnJvb3QtPnN1YnN5c19saXN0KTsKLQkJCXJjdV9hc3NpZ25fcG9pbnRlcihzcy0+cm9vdCwgcm9vdCk7CisJCQlsaXN0X21vdmUoJnNzLT5zaWJsaW5nLCAmcm9vdC0+c3Vic3lzX2xpc3QpOworCQkJc3MtPnJvb3QgPSByb290OwogCQkJaWYgKHNzLT5iaW5kKQogCQkJCXNzLT5iaW5kKHNzLCBjZ3JwKTsKLQorCQkJbXV0ZXhfdW5sb2NrKCZzcy0+aGllcmFyY2h5X211dGV4KTsKIAkJfSBlbHNlIGlmIChiaXQgJiByZW1vdmVkX2JpdHMpIHsKIAkJCS8qIFdlJ3JlIHJlbW92aW5nIHRoaXMgc3Vic3lzdGVtICovCiAJCQlCVUdfT04oY2dycC0+c3Vic3lzW2ldICE9IGR1bW15dG9wLT5zdWJzeXNbaV0pOwogCQkJQlVHX09OKGNncnAtPnN1YnN5c1tpXS0+Y2dyb3VwICE9IGNncnApOworCQkJbXV0ZXhfbG9jaygmc3MtPmhpZXJhcmNoeV9tdXRleCk7CiAJCQlpZiAoc3MtPmJpbmQpCiAJCQkJc3MtPmJpbmQoc3MsIGR1bW15dG9wKTsKIAkJCWR1bW15dG9wLT5zdWJzeXNbaV0tPmNncm91cCA9IGR1bW15dG9wOwogCQkJY2dycC0+c3Vic3lzW2ldID0gTlVMTDsKLQkJCXJjdV9hc3NpZ25fcG9pbnRlcihzdWJzeXNbaV0tPnJvb3QsICZyb290bm9kZSk7Ci0JCQlsaXN0X2RlbCgmc3MtPnNpYmxpbmcpOworCQkJc3Vic3lzW2ldLT5yb290ID0gJnJvb3Rub2RlOworCQkJbGlzdF9tb3ZlKCZzcy0+c2libGluZywgJnJvb3Rub2RlLnN1YnN5c19saXN0KTsKKwkJCW11dGV4X3VubG9jaygmc3MtPmhpZXJhcmNoeV9tdXRleCk7CiAJCX0gZWxzZSBpZiAoYml0ICYgZmluYWxfYml0cykgewogCQkJLyogU3Vic3lzdGVtIHN0YXRlIHNob3VsZCBhbHJlYWR5IGV4aXN0ICovCiAJCQlCVUdfT04oIWNncnAtPnN1YnN5c1tpXSk7CkBAIC05OTIsNyArMTAwMyw3IEBACiAJCXJvb3QgPSBOVUxMOwogCX0gZWxzZSB7CiAJCS8qIE5ldyBzdXBlcmJsb2NrICovCi0JCXN0cnVjdCBjZ3JvdXAgKmNncnAgPSAmcm9vdC0+dG9wX2Nncm91cDsKKwkJc3RydWN0IGNncm91cCAqcm9vdF9jZ3JwID0gJnJvb3QtPnRvcF9jZ3JvdXA7CiAJCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJCWludCBpOwogCkBAIC0xMDMzLDcgKzEwNDQsNyBAQAogCQlsaXN0X2FkZCgmcm9vdC0+cm9vdF9saXN0LCAmcm9vdHMpOwogCQlyb290X2NvdW50Kys7CiAKLQkJc2ItPnNfcm9vdC0+ZF9mc2RhdGEgPSAmcm9vdC0+dG9wX2Nncm91cDsKKwkJc2ItPnNfcm9vdC0+ZF9mc2RhdGEgPSByb290X2NncnA7CiAJCXJvb3QtPnRvcF9jZ3JvdXAuZGVudHJ5ID0gc2ItPnNfcm9vdDsKIAogCQkvKiBMaW5rIHRoZSB0b3AgY2dyb3VwIGluIHRoaXMgaGllcmFyY2h5IGludG8gYWxsCkBAIC0xMDQ0LDI5ICsxMDU1LDE4IEBACiAJCQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKIAkJCXN0cnVjdCBjc3Nfc2V0ICpjZzsKIAotCQkJaGxpc3RfZm9yX2VhY2hfZW50cnkoY2csIG5vZGUsIGhoZWFkLCBobGlzdCkgewotCQkJCXN0cnVjdCBjZ19jZ3JvdXBfbGluayAqbGluazsKLQotCQkJCUJVR19PTihsaXN0X2VtcHR5KCZ0bXBfY2dfbGlua3MpKTsKLQkJCQlsaW5rID0gbGlzdF9lbnRyeSh0bXBfY2dfbGlua3MubmV4dCwKLQkJCQkJCSAgc3RydWN0IGNnX2Nncm91cF9saW5rLAotCQkJCQkJICBjZ3JwX2xpbmtfbGlzdCk7Ci0JCQkJbGlzdF9kZWwoJmxpbmstPmNncnBfbGlua19saXN0KTsKLQkJCQlsaW5rLT5jZyA9IGNnOwotCQkJCWxpc3RfYWRkKCZsaW5rLT5jZ3JwX2xpbmtfbGlzdCwKLQkJCQkJICZyb290LT50b3BfY2dyb3VwLmNzc19zZXRzKTsKLQkJCQlsaXN0X2FkZCgmbGluay0+Y2dfbGlua19saXN0LCAmY2ctPmNnX2xpbmtzKTsKLQkJCX0KKwkJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGNnLCBub2RlLCBoaGVhZCwgaGxpc3QpCisJCQkJbGlua19jc3Nfc2V0KCZ0bXBfY2dfbGlua3MsIGNnLCByb290X2NncnApOwogCQl9CiAJCXdyaXRlX3VubG9jaygmY3NzX3NldF9sb2NrKTsKIAogCQlmcmVlX2NnX2xpbmtzKCZ0bXBfY2dfbGlua3MpOwogCi0JCUJVR19PTighbGlzdF9lbXB0eSgmY2dycC0+c2libGluZykpOwotCQlCVUdfT04oIWxpc3RfZW1wdHkoJmNncnAtPmNoaWxkcmVuKSk7CisJCUJVR19PTighbGlzdF9lbXB0eSgmcm9vdF9jZ3JwLT5zaWJsaW5nKSk7CisJCUJVR19PTighbGlzdF9lbXB0eSgmcm9vdF9jZ3JwLT5jaGlsZHJlbikpOwogCQlCVUdfT04ocm9vdC0+bnVtYmVyX29mX2Nncm91cHMgIT0gMSk7CiAKLQkJY2dyb3VwX3BvcHVsYXRlX2RpcihjZ3JwKTsKKwkJY2dyb3VwX3BvcHVsYXRlX2Rpcihyb290X2NncnApOwogCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAkJbXV0ZXhfdW5sb2NrKCZjZ3JvdXBfbXV0ZXgpOwogCX0KQEAgLTExMTUsMTAgKzExMTUsOSBAQAogCX0KIAl3cml0ZV91bmxvY2soJmNzc19zZXRfbG9jayk7CiAKLQlpZiAoIWxpc3RfZW1wdHkoJnJvb3QtPnJvb3RfbGlzdCkpIHsKLQkJbGlzdF9kZWwoJnJvb3QtPnJvb3RfbGlzdCk7Ci0JCXJvb3RfY291bnQtLTsKLQl9CisJbGlzdF9kZWwoJnJvb3QtPnJvb3RfbGlzdCk7CisJcm9vdF9jb3VudC0tOworCiAJbXV0ZXhfdW5sb2NrKCZjZ3JvdXBfbXV0ZXgpOwogCiAJa2ZyZWUocm9vdCk7CkBAIC0xMTQ3LDE0ICsxMTQ2LDE2IEBACiAgKiBAYnVmOiB0aGUgYnVmZmVyIHRvIHdyaXRlIHRoZSBwYXRoIGludG8KICAqIEBidWZsZW46IHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlcgogICoKLSAqIENhbGxlZCB3aXRoIGNncm91cF9tdXRleCBoZWxkLiBXcml0ZXMgcGF0aCBvZiBjZ3JvdXAgaW50byBidWYuCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLWVycm5vIG9uIGVycm9yLgorICogQ2FsbGVkIHdpdGggY2dyb3VwX211dGV4IGhlbGQgb3IgZWxzZSB3aXRoIGFuIFJDVS1wcm90ZWN0ZWQgY2dyb3VwCisgKiByZWZlcmVuY2UuICBXcml0ZXMgcGF0aCBvZiBjZ3JvdXAgaW50byBidWYuICBSZXR1cm5zIDAgb24gc3VjY2VzcywKKyAqIC1lcnJubyBvbiBlcnJvci4KICAqLwogaW50IGNncm91cF9wYXRoKGNvbnN0IHN0cnVjdCBjZ3JvdXAgKmNncnAsIGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbikKIHsKIAljaGFyICpzdGFydDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSByY3VfZGVyZWZlcmVuY2UoY2dycC0+ZGVudHJ5KTsKIAotCWlmIChjZ3JwID09IGR1bW15dG9wKSB7CisJaWYgKCFkZW50cnkgfHwgY2dycCA9PSBkdW1teXRvcCkgewogCQkvKgogCQkgKiBJbmFjdGl2ZSBzdWJzeXN0ZW1zIGhhdmUgbm8gZGVudHJ5IGZvciB0aGVpciByb290CiAJCSAqIGNncm91cApAQCAtMTE2NywxMyArMTE2OCwxNCBAQAogCiAJKi0tc3RhcnQgPSAnXDAnOwogCWZvciAoOzspIHsKLQkJaW50IGxlbiA9IGNncnAtPmRlbnRyeS0+ZF9uYW1lLmxlbjsKKwkJaW50IGxlbiA9IGRlbnRyeS0+ZF9uYW1lLmxlbjsKIAkJaWYgKChzdGFydCAtPSBsZW4pIDwgYnVmKQogCQkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CiAJCW1lbWNweShzdGFydCwgY2dycC0+ZGVudHJ5LT5kX25hbWUubmFtZSwgbGVuKTsKIAkJY2dycCA9IGNncnAtPnBhcmVudDsKIAkJaWYgKCFjZ3JwKQogCQkJYnJlYWs7CisJCWRlbnRyeSA9IHJjdV9kZXJlZmVyZW5jZShjZ3JwLT5kZW50cnkpOwogCQlpZiAoIWNncnAtPnBhcmVudCkKIAkJCWNvbnRpbnVlOwogCQlpZiAoLS1zdGFydCA8IGJ1ZikKQEAgLTEyMTgsNyArMTIyMCw3IEBACiAJaW50IHJldHZhbCA9IDA7CiAJc3RydWN0IGNncm91cF9zdWJzeXMgKnNzOwogCXN0cnVjdCBjZ3JvdXAgKm9sZGNncnA7Ci0Jc3RydWN0IGNzc19zZXQgKmNnID0gdHNrLT5jZ3JvdXBzOworCXN0cnVjdCBjc3Nfc2V0ICpjZzsKIAlzdHJ1Y3QgY3NzX3NldCAqbmV3Y2c7CiAJc3RydWN0IGNncm91cGZzX3Jvb3QgKnJvb3QgPSBjZ3JwLT5yb290OwogCWludCBzdWJzeXNfaWQ7CkBAIC0xMjM4LDExICsxMjQwLDE2IEBACiAJCX0KIAl9CiAKKwl0YXNrX2xvY2sodHNrKTsKKwljZyA9IHRzay0+Y2dyb3VwczsKKwlnZXRfY3NzX3NldChjZyk7CisJdGFza191bmxvY2sodHNrKTsKIAkvKgogCSAqIExvY2F0ZSBvciBhbGxvY2F0ZSBhIG5ldyBjc3Nfc2V0IGZvciB0aGlzIHRhc2ssCiAJICogYmFzZWQgb24gaXRzIGZpbmFsIHNldCBvZiBjZ3JvdXBzCiAJICovCiAJbmV3Y2cgPSBmaW5kX2Nzc19zZXQoY2csIGNncnApOworCXB1dF9jc3Nfc2V0KGNnKTsKIAlpZiAoIW5ld2NnKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMTQ0Nyw3ICsxNDU0LDcgQEAKIAlzdHJ1Y3QgY2Z0eXBlICpjZnQgPSBfX2RfY2Z0KGZpbGUtPmZfZGVudHJ5KTsKIAlzdHJ1Y3QgY2dyb3VwICpjZ3JwID0gX19kX2NncnAoZmlsZS0+Zl9kZW50cnktPmRfcGFyZW50KTsKIAotCWlmICghY2Z0IHx8IGNncm91cF9pc19yZW1vdmVkKGNncnApKQorCWlmIChjZ3JvdXBfaXNfcmVtb3ZlZChjZ3JwKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAJaWYgKGNmdC0+d3JpdGUpCiAJCXJldHVybiBjZnQtPndyaXRlKGNncnAsIGNmdCwgZmlsZSwgYnVmLCBuYnl0ZXMsIHBwb3MpOwpAQCAtMTQ5Miw3ICsxNDk5LDcgQEAKIAlzdHJ1Y3QgY2Z0eXBlICpjZnQgPSBfX2RfY2Z0KGZpbGUtPmZfZGVudHJ5KTsKIAlzdHJ1Y3QgY2dyb3VwICpjZ3JwID0gX19kX2NncnAoZmlsZS0+Zl9kZW50cnktPmRfcGFyZW50KTsKIAotCWlmICghY2Z0IHx8IGNncm91cF9pc19yZW1vdmVkKGNncnApKQorCWlmIChjZ3JvdXBfaXNfcmVtb3ZlZChjZ3JwKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpZiAoY2Z0LT5yZWFkKQpAQCAtMTU1NiwxMCArMTU2Myw4IEBACiAJZXJyID0gZ2VuZXJpY19maWxlX29wZW4oaW5vZGUsIGZpbGUpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7Ci0KIAljZnQgPSBfX2RfY2Z0KGZpbGUtPmZfZGVudHJ5KTsKLQlpZiAoIWNmdCkKLQkJcmV0dXJuIC1FTk9ERVY7CisKIAlpZiAoY2Z0LT5yZWFkX21hcCB8fCBjZnQtPnJlYWRfc2VxX3N0cmluZykgewogCQlzdHJ1Y3QgY2dyb3VwX3NlcWZpbGVfc3RhdGUgKnN0YXRlID0KIAkJCWt6YWxsb2Moc2l6ZW9mKCpzdGF0ZSksIEdGUF9VU0VSKTsKQEAgLTE2NzMsNyArMTY3OCw3IEBACiAJaWYgKCFlcnJvcikgewogCQlkZW50cnktPmRfZnNkYXRhID0gY2dycDsKIAkJaW5jX25saW5rKHBhcmVudC0+ZF9pbm9kZSk7Ci0JCWNncnAtPmRlbnRyeSA9IGRlbnRyeTsKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKGNncnAtPmRlbnRyeSwgZGVudHJ5KTsKIAkJZGdldChkZW50cnkpOwogCX0KIAlkcHV0KGRlbnRyeSk7CkBAIC0xODE0LDYgKzE4MTksNyBAQAogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqcmVzOwogCXN0cnVjdCBsaXN0X2hlYWQgKmwgPSBpdC0+dGFzazsKKwlzdHJ1Y3QgY2dfY2dyb3VwX2xpbmsgKmxpbms7CiAKIAkvKiBJZiB0aGUgaXRlcmF0b3IgY2cgaXMgTlVMTCwgd2UgaGF2ZSBubyB0YXNrcyAqLwogCWlmICghaXQtPmNnX2xpbmspCkBAIC0xODIxLDcgKzE4MjcsOCBAQAogCXJlcyA9IGxpc3RfZW50cnkobCwgc3RydWN0IHRhc2tfc3RydWN0LCBjZ19saXN0KTsKIAkvKiBBZHZhbmNlIGl0ZXJhdG9yIHRvIGZpbmQgbmV4dCBlbnRyeSAqLwogCWwgPSBsLT5uZXh0OwotCWlmIChsID09ICZyZXMtPmNncm91cHMtPnRhc2tzKSB7CisJbGluayA9IGxpc3RfZW50cnkoaXQtPmNnX2xpbmssIHN0cnVjdCBjZ19jZ3JvdXBfbGluaywgY2dycF9saW5rX2xpc3QpOworCWlmIChsID09ICZsaW5rLT5jZy0+dGFza3MpIHsKIAkJLyogV2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoaXMgdGFzayBsaXN0IC0gbW92ZSBvbiB0bwogCQkgKiB0aGUgbmV4dCBjZ19jZ3JvdXBfbGluayAqLwogCQljZ3JvdXBfYWR2YW5jZV9pdGVyKGNncnAsIGl0KTsKQEAgLTIwMTUsMTQgKzIwMjIsMTYgQEAKICAqLwogc3RhdGljIGludCBwaWRfYXJyYXlfbG9hZChwaWRfdCAqcGlkYXJyYXksIGludCBucGlkcywgc3RydWN0IGNncm91cCAqY2dycCkKIHsKLQlpbnQgbiA9IDA7CisJaW50IG4gPSAwLCBwaWQ7CiAJc3RydWN0IGNncm91cF9pdGVyIGl0OwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOwogCWNncm91cF9pdGVyX3N0YXJ0KGNncnAsICZpdCk7CiAJd2hpbGUgKCh0c2sgPSBjZ3JvdXBfaXRlcl9uZXh0KGNncnAsICZpdCkpKSB7CiAJCWlmICh1bmxpa2VseShuID09IG5waWRzKSkKIAkJCWJyZWFrOwotCQlwaWRhcnJheVtuKytdID0gdGFza19waWRfdm5yKHRzayk7CisJCXBpZCA9IHRhc2tfcGlkX3Zucih0c2spOworCQlpZiAocGlkID4gMCkKKwkJCXBpZGFycmF5W24rK10gPSBwaWQ7CiAJfQogCWNncm91cF9pdGVyX2VuZChjZ3JwLCAmaXQpOwogCXJldHVybiBuOwpAQCAtMjA1NCw3ICsyMDYzLDYgQEAKIAogCXJldCA9IDA7CiAJY2dycCA9IGRlbnRyeS0+ZF9mc2RhdGE7Ci0JcmN1X3JlYWRfbG9jaygpOwogCiAJY2dyb3VwX2l0ZXJfc3RhcnQoY2dycCwgJml0KTsKIAl3aGlsZSAoKHRzayA9IGNncm91cF9pdGVyX25leHQoY2dycCwgJml0KSkpIHsKQEAgLTIwNzksNyArMjA4Nyw2IEBACiAJfQogCWNncm91cF9pdGVyX2VuZChjZ3JwLCAmaXQpOwogCi0JcmN1X3JlYWRfdW5sb2NrKCk7CiBlcnI6CiAJcmV0dXJuIHJldDsKIH0KQEAgLTIzMjYsNyArMjMzMyw3IEBACiAJCQkgICAgICAgc3RydWN0IGNncm91cCAqY2dycCkKIHsKIAljc3MtPmNncm91cCA9IGNncnA7Ci0JYXRvbWljX3NldCgmY3NzLT5yZWZjbnQsIDApOworCWF0b21pY19zZXQoJmNzcy0+cmVmY250LCAxKTsKIAljc3MtPmZsYWdzID0gMDsKIAlpZiAoY2dycCA9PSBkdW1teXRvcCkKIAkJc2V0X2JpdChDU1NfUk9PVCwgJmNzcy0+ZmxhZ3MpOwpAQCAtMjMzNCw2ICsyMzQxLDI5IEBACiAJY2dycC0+c3Vic3lzW3NzLT5zdWJzeXNfaWRdID0gY3NzOwogfQogCitzdGF0aWMgdm9pZCBjZ3JvdXBfbG9ja19oaWVyYXJjaHkoc3RydWN0IGNncm91cGZzX3Jvb3QgKnJvb3QpCit7CisJLyogV2UgbmVlZCB0byB0YWtlIGVhY2ggaGllcmFyY2h5X211dGV4IGluIGEgY29uc2lzdGVudCBvcmRlciAqLworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IENHUk9VUF9TVUJTWVNfQ09VTlQ7IGkrKykgeworCQlzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MgPSBzdWJzeXNbaV07CisJCWlmIChzcy0+cm9vdCA9PSByb290KQorCQkJbXV0ZXhfbG9ja19uZXN0ZWQoJnNzLT5oaWVyYXJjaHlfbXV0ZXgsIGkpOworCX0KK30KKworc3RhdGljIHZvaWQgY2dyb3VwX3VubG9ja19oaWVyYXJjaHkoc3RydWN0IGNncm91cGZzX3Jvb3QgKnJvb3QpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ0dST1VQX1NVQlNZU19DT1VOVDsgaSsrKSB7CisJCXN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcyA9IHN1YnN5c1tpXTsKKwkJaWYgKHNzLT5yb290ID09IHJvb3QpCisJCQltdXRleF91bmxvY2soJnNzLT5oaWVyYXJjaHlfbXV0ZXgpOworCX0KK30KKwogLyoKICAqIGNncm91cF9jcmVhdGUgLSBjcmVhdGUgYSBjZ3JvdXAKICAqIEBwYXJlbnQ6IGNncm91cCB0aGF0IHdpbGwgYmUgcGFyZW50IG9mIHRoZSBuZXcgY2dyb3VwCkBAIC0yMzgyLDcgKzI0MTIsOSBAQAogCQlpbml0X2Nncm91cF9jc3MoY3NzLCBzcywgY2dycCk7CiAJfQogCisJY2dyb3VwX2xvY2tfaGllcmFyY2h5KHJvb3QpOwogCWxpc3RfYWRkKCZjZ3JwLT5zaWJsaW5nLCAmY2dycC0+cGFyZW50LT5jaGlsZHJlbik7CisJY2dyb3VwX3VubG9ja19oaWVyYXJjaHkocm9vdCk7CiAJcm9vdC0+bnVtYmVyX29mX2Nncm91cHMrKzsKIAogCWVyciA9IGNncm91cF9jcmVhdGVfZGlyKGNncnAsIGRlbnRyeSwgbW9kZSk7CkBAIC0yNDMzLDcgKzI0NjUsNyBAQAogewogCS8qIENoZWNrIHRoZSByZWZlcmVuY2UgY291bnQgb24gZWFjaCBzdWJzeXN0ZW0uIFNpbmNlIHdlCiAJICogYWxyZWFkeSBlc3RhYmxpc2hlZCB0aGF0IHRoZXJlIGFyZSBubyB0YXNrcyBpbiB0aGUKLQkgKiBjZ3JvdXAsIGlmIHRoZSBjc3MgcmVmY291bnQgaXMgYWxzbyAwLCB0aGVuIHRoZXJlIHNob3VsZAorCSAqIGNncm91cCwgaWYgdGhlIGNzcyByZWZjb3VudCBpcyBhbHNvIDEsIHRoZW4gdGhlcmUgc2hvdWxkCiAJICogYmUgbm8gb3V0c3RhbmRpbmcgcmVmZXJlbmNlcywgc28gdGhlIHN1YnN5c3RlbSBpcyBzYWZlIHRvCiAJICogZGVzdHJveS4gV2Ugc2NhbiBhY3Jvc3MgYWxsIHN1YnN5c3RlbXMgcmF0aGVyIHRoYW4gdXNpbmcKIAkgKiB0aGUgcGVyLWhpZXJhcmNoeSBsaW5rZWQgbGlzdCBvZiBtb3VudGVkIHN1YnN5c3RlbXMgc2luY2UKQEAgLTI0NTQsMTkgKzI0ODYsNjcgQEAKIAkJICogbWF0dGVyLCBzaW5jZSBpdCBjYW4gb25seSBoYXBwZW4gaWYgdGhlIGNncm91cAogCQkgKiBoYXMgYmVlbiBkZWxldGVkIGFuZCBoZW5jZSBubyBsb25nZXIgbmVlZHMgdGhlCiAJCSAqIHJlbGVhc2UgYWdlbnQgdG8gYmUgY2FsbGVkIGFueXdheS4gKi8KLQkJaWYgKGNzcyAmJiBhdG9taWNfcmVhZCgmY3NzLT5yZWZjbnQpKQorCQlpZiAoY3NzICYmIChhdG9taWNfcmVhZCgmY3NzLT5yZWZjbnQpID4gMSkpCiAJCQlyZXR1cm4gMTsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBBdG9taWNhbGx5IG1hcmsgYWxsIChvciBlbHNlIG5vbmUpIG9mIHRoZSBjZ3JvdXAncyBDU1Mgb2JqZWN0cyBhcworICogQ1NTX1JFTU9WRUQuIFJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIG9yIGZhbHNlIGlmIHRoZSBjZ3JvdXAgaGFzCisgKiBidXN5IHN1YnN5c3RlbXMuIENhbGwgd2l0aCBjZ3JvdXBfbXV0ZXggaGVsZAorICovCisKK3N0YXRpYyBpbnQgY2dyb3VwX2NsZWFyX2Nzc19yZWZzKHN0cnVjdCBjZ3JvdXAgKmNncnApCit7CisJc3RydWN0IGNncm91cF9zdWJzeXMgKnNzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJYm9vbCBmYWlsZWQgPSBmYWxzZTsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJZm9yX2VhY2hfc3Vic3lzKGNncnAtPnJvb3QsIHNzKSB7CisJCXN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3MgPSBjZ3JwLT5zdWJzeXNbc3MtPnN1YnN5c19pZF07CisJCWludCByZWZjbnQ7CisJCWRvIHsKKwkJCS8qIFdlIGNhbiBvbmx5IHJlbW92ZSBhIENTUyB3aXRoIGEgcmVmY250PT0xICovCisJCQlyZWZjbnQgPSBhdG9taWNfcmVhZCgmY3NzLT5yZWZjbnQpOworCQkJaWYgKHJlZmNudCA+IDEpIHsKKwkJCQlmYWlsZWQgPSB0cnVlOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJCUJVR19PTighcmVmY250KTsKKwkJCS8qCisJCQkgKiBEcm9wIHRoZSByZWZjbnQgdG8gMCB3aGlsZSB3ZSBjaGVjayBvdGhlcgorCQkJICogc3Vic3lzdGVtcy4gVGhpcyB3aWxsIGNhdXNlIGFueSByYWNpbmcKKwkJCSAqIGNzc190cnlnZXQoKSB0byBzcGluIHVudGlsIHdlIHNldCB0aGUKKwkJCSAqIENTU19SRU1PVkVEIGJpdHMgb3IgYWJvcnQKKwkJCSAqLworCQl9IHdoaWxlIChhdG9taWNfY21weGNoZygmY3NzLT5yZWZjbnQsIHJlZmNudCwgMCkgIT0gcmVmY250KTsKKwl9CisgZG9uZToKKwlmb3JfZWFjaF9zdWJzeXMoY2dycC0+cm9vdCwgc3MpIHsKKwkJc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzcyA9IGNncnAtPnN1YnN5c1tzcy0+c3Vic3lzX2lkXTsKKwkJaWYgKGZhaWxlZCkgeworCQkJLyoKKwkJCSAqIFJlc3RvcmUgb2xkIHJlZmNudCBpZiB3ZSBwcmV2aW91c2x5IG1hbmFnZWQKKwkJCSAqIHRvIGNsZWFyIGl0IGZyb20gMSB0byAwCisJCQkgKi8KKwkJCWlmICghYXRvbWljX3JlYWQoJmNzcy0+cmVmY250KSkKKwkJCQlhdG9taWNfc2V0KCZjc3MtPnJlZmNudCwgMSk7CisJCX0gZWxzZSB7CisJCQkvKiBDb21taXQgdGhlIGZhY3QgdGhhdCB0aGUgQ1NTIGlzIHJlbW92ZWQgKi8KKwkJCXNldF9iaXQoQ1NTX1JFTU9WRUQsICZjc3MtPmZsYWdzKTsKKwkJfQorCX0KKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuICFmYWlsZWQ7Cit9CisKIHN0YXRpYyBpbnQgY2dyb3VwX3JtZGlyKHN0cnVjdCBpbm9kZSAqdW51c2VkX2Rpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewogCXN0cnVjdCBjZ3JvdXAgKmNncnAgPSBkZW50cnktPmRfZnNkYXRhOwogCXN0cnVjdCBkZW50cnkgKmQ7CiAJc3RydWN0IGNncm91cCAqcGFyZW50OwotCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7Ci0Jc3RydWN0IGNncm91cGZzX3Jvb3QgKnJvb3Q7CiAKIAkvKiB0aGUgdmZzIGhvbGRzIGJvdGggaW5vZGUtPmlfbXV0ZXggYWxyZWFkeSAqLwogCkBAIC0yNDg5LDEyICsyNTY5LDEwIEBACiAKIAltdXRleF9sb2NrKCZjZ3JvdXBfbXV0ZXgpOwogCXBhcmVudCA9IGNncnAtPnBhcmVudDsKLQlyb290ID0gY2dycC0+cm9vdDsKLQlzYiA9IHJvb3QtPnNiOwogCiAJaWYgKGF0b21pY19yZWFkKCZjZ3JwLT5jb3VudCkKIAkgICAgfHwgIWxpc3RfZW1wdHkoJmNncnAtPmNoaWxkcmVuKQotCSAgICB8fCBjZ3JvdXBfaGFzX2Nzc19yZWZzKGNncnApKSB7CisJICAgIHx8ICFjZ3JvdXBfY2xlYXJfY3NzX3JlZnMoY2dycCkpIHsKIAkJbXV0ZXhfdW5sb2NrKCZjZ3JvdXBfbXV0ZXgpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTI1MDQsOCArMjU4MiwxMiBAQAogCWlmICghbGlzdF9lbXB0eSgmY2dycC0+cmVsZWFzZV9saXN0KSkKIAkJbGlzdF9kZWwoJmNncnAtPnJlbGVhc2VfbGlzdCk7CiAJc3Bpbl91bmxvY2soJnJlbGVhc2VfbGlzdF9sb2NrKTsKLQkvKiBkZWxldGUgbXkgc2libGluZyBmcm9tIHBhcmVudC0+Y2hpbGRyZW4gKi8KKworCWNncm91cF9sb2NrX2hpZXJhcmNoeShjZ3JwLT5yb290KTsKKwkvKiBkZWxldGUgdGhpcyBjZ3JvdXAgZnJvbSBwYXJlbnQtPmNoaWxkcmVuICovCiAJbGlzdF9kZWwoJmNncnAtPnNpYmxpbmcpOworCWNncm91cF91bmxvY2tfaGllcmFyY2h5KGNncnAtPnJvb3QpOworCiAJc3Bpbl9sb2NrKCZjZ3JwLT5kZW50cnktPmRfbG9jayk7CiAJZCA9IGRnZXQoY2dycC0+ZGVudHJ5KTsKIAlzcGluX3VubG9jaygmZC0+ZF9sb2NrKTsKQEAgLTI1MjcsNiArMjYwOSw3IEBACiAJcHJpbnRrKEtFUk5fSU5GTyAiSW5pdGlhbGl6aW5nIGNncm91cCBzdWJzeXMgJXNcbiIsIHNzLT5uYW1lKTsKIAogCS8qIENyZWF0ZSB0aGUgdG9wIGNncm91cCBzdGF0ZSBmb3IgdGhpcyBzdWJzeXN0ZW0gKi8KKwlsaXN0X2FkZCgmc3MtPnNpYmxpbmcsICZyb290bm9kZS5zdWJzeXNfbGlzdCk7CiAJc3MtPnJvb3QgPSAmcm9vdG5vZGU7CiAJY3NzID0gc3MtPmNyZWF0ZShzcywgZHVtbXl0b3ApOwogCS8qIFdlIGRvbid0IGhhbmRsZSBlYXJseSBmYWlsdXJlcyBncmFjZWZ1bGx5ICovCkBAIC0yNTQwLDEzICsyNjIzLDEzIEBACiAJaW5pdF9jc3Nfc2V0LnN1YnN5c1tzcy0+c3Vic3lzX2lkXSA9IGR1bW15dG9wLT5zdWJzeXNbc3MtPnN1YnN5c19pZF07CiAKIAluZWVkX2ZvcmtleGl0X2NhbGxiYWNrIHw9IHNzLT5mb3JrIHx8IHNzLT5leGl0OwotCW5lZWRfbW1fb3duZXJfY2FsbGJhY2sgfD0gISFzcy0+bW1fb3duZXJfY2hhbmdlZDsKIAogCS8qIEF0IHN5c3RlbSBib290LCBiZWZvcmUgYWxsIHN1YnN5c3RlbXMgaGF2ZSBiZWVuCiAJICogcmVnaXN0ZXJlZCwgbm8gdGFza3MgaGF2ZSBiZWVuIGZvcmtlZCwgc28gd2UgZG9uJ3QKIAkgKiBuZWVkIHRvIGludm9rZSBmb3JrIGNhbGxiYWNrcyBoZXJlLiAqLwogCUJVR19PTighbGlzdF9lbXB0eSgmaW5pdF90YXNrLnRhc2tzKSk7CiAKKwltdXRleF9pbml0KCZzcy0+aGllcmFyY2h5X211dGV4KTsKIAlzcy0+YWN0aXZlID0gMTsKIH0KIApAQCAtMjU2NSw3ICsyNjQ4LDYgQEAKIAlJTklUX0hMSVNUX05PREUoJmluaXRfY3NzX3NldC5obGlzdCk7CiAJY3NzX3NldF9jb3VudCA9IDE7CiAJaW5pdF9jZ3JvdXBfcm9vdCgmcm9vdG5vZGUpOwotCWxpc3RfYWRkKCZyb290bm9kZS5yb290X2xpc3QsICZyb290cyk7CiAJcm9vdF9jb3VudCA9IDE7CiAJaW5pdF90YXNrLmNncm91cHMgPSAmaW5pdF9jc3Nfc2V0OwogCkBAIC0yNjcyLDE1ICsyNzU0LDEyIEBACiAKIAltdXRleF9sb2NrKCZjZ3JvdXBfbXV0ZXgpOwogCi0JZm9yX2VhY2hfcm9vdChyb290KSB7CisJZm9yX2VhY2hfYWN0aXZlX3Jvb3Qocm9vdCkgewogCQlzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3M7CiAJCXN0cnVjdCBjZ3JvdXAgKmNncnA7CiAJCWludCBzdWJzeXNfaWQ7CiAJCWludCBjb3VudCA9IDA7CiAKLQkJLyogU2tpcCB0aGlzIGhpZXJhcmNoeSBpZiBpdCBoYXMgbm8gYWN0aXZlIHN1YnN5c3RlbXMgKi8KLQkJaWYgKCFyb290LT5hY3R1YWxfc3Vic3lzX2JpdHMpCi0JCQljb250aW51ZTsKIAkJc2VxX3ByaW50ZihtLCAiJWx1OiIsIHJvb3QtPnN1YnN5c19iaXRzKTsKIAkJZm9yX2VhY2hfc3Vic3lzKHJvb3QsIHNzKQogCQkJc2VxX3ByaW50ZihtLCAiJXMlcyIsIGNvdW50KysgPyAiLCIgOiAiIiwgc3MtPm5hbWUpOwpAQCAtMjc5MCwzNyArMjg2OSw2IEBACiAJfQogfQogCi0jaWZkZWYgQ09ORklHX01NX09XTkVSCi0vKioKLSAqIGNncm91cF9tbV9vd25lcl9jYWxsYmFja3MgLSBydW4gY2FsbGJhY2tzIHdoZW4gdGhlIG1tLT5vd25lciBjaGFuZ2VzCi0gKiBAcDogdGhlIG5ldyBvd25lcgotICoKLSAqIENhbGxlZCBvbiBldmVyeSBjaGFuZ2UgdG8gbW0tPm93bmVyLiBtbV9pbml0X293bmVyKCkgZG9lcyBub3QKLSAqIGludm9rZSB0aGlzIHJvdXRpbmUsIHNpbmNlIGl0IGFzc2lnbnMgdGhlIG1tLT5vd25lciB0aGUgZmlyc3QgdGltZQotICogYW5kIGRvZXMgbm90IGNoYW5nZSBpdC4KLSAqCi0gKiBUaGUgY2FsbGJhY2tzIGFyZSBpbnZva2VkIHdpdGggbW1hcF9zZW0gaGVsZCBpbiByZWFkIG1vZGUuCi0gKi8KLXZvaWQgY2dyb3VwX21tX293bmVyX2NhbGxiYWNrcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKm9sZCwgc3RydWN0IHRhc2tfc3RydWN0ICpuZXcpCi17Ci0Jc3RydWN0IGNncm91cCAqb2xkY2dycCwgKm5ld2NncnAgPSBOVUxMOwotCi0JaWYgKG5lZWRfbW1fb3duZXJfY2FsbGJhY2spIHsKLQkJaW50IGk7Ci0JCWZvciAoaSA9IDA7IGkgPCBDR1JPVVBfU1VCU1lTX0NPVU5UOyBpKyspIHsKLQkJCXN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcyA9IHN1YnN5c1tpXTsKLQkJCW9sZGNncnAgPSB0YXNrX2Nncm91cChvbGQsIHNzLT5zdWJzeXNfaWQpOwotCQkJaWYgKG5ldykKLQkJCQluZXdjZ3JwID0gdGFza19jZ3JvdXAobmV3LCBzcy0+c3Vic3lzX2lkKTsKLQkJCWlmIChvbGRjZ3JwID09IG5ld2NncnApCi0JCQkJY29udGludWU7Ci0JCQlpZiAoc3MtPm1tX293bmVyX2NoYW5nZWQpCi0JCQkJc3MtPm1tX293bmVyX2NoYW5nZWQoc3MsIG9sZGNncnAsIG5ld2NncnAsIG5ldyk7Ci0JCX0KLQl9Ci19Ci0jZW5kaWYgLyogQ09ORklHX01NX09XTkVSICovCi0KIC8qKgogICogY2dyb3VwX3Bvc3RfZm9yayAtIGNhbGxlZCBvbiBhIG5ldyB0YXNrIGFmdGVyIGFkZGluZyBpdCB0byB0aGUgdGFzayBsaXN0CiAgKiBAY2hpbGQ6IHRoZSB0YXNrIGluIHF1ZXN0aW9uCkBAIC0yODM0LDggKzI4ODIsMTAgQEAKIHsKIAlpZiAodXNlX3Rhc2tfY3NzX3NldF9saW5rcykgewogCQl3cml0ZV9sb2NrKCZjc3Nfc2V0X2xvY2spOworCQl0YXNrX2xvY2soY2hpbGQpOwogCQlpZiAobGlzdF9lbXB0eSgmY2hpbGQtPmNnX2xpc3QpKQogCQkJbGlzdF9hZGQoJmNoaWxkLT5jZ19saXN0LCAmY2hpbGQtPmNncm91cHMtPnRhc2tzKTsKKwkJdGFza191bmxvY2soY2hpbGQpOwogCQl3cml0ZV91bmxvY2soJmNzc19zZXRfbG9jayk7CiAJfQogfQpAQCAtMjk0MSw2ICsyOTkxLDcgQEAKIAkJbXV0ZXhfdW5sb2NrKCZjZ3JvdXBfbXV0ZXgpOwogCQlyZXR1cm4gMDsKIAl9CisJdGFza19sb2NrKHRzayk7CiAJY2cgPSB0c2stPmNncm91cHM7CiAJcGFyZW50ID0gdGFza19jZ3JvdXAodHNrLCBzdWJzeXMtPnN1YnN5c19pZCk7CiAKQEAgLTI5NTMsNiArMzAwNCw3IEBACiAKIAkvKiBLZWVwIHRoZSBjZ3JvdXAgYWxpdmUgKi8KIAlnZXRfY3NzX3NldChjZyk7CisJdGFza191bmxvY2sodHNrKTsKIAltdXRleF91bmxvY2soJmNncm91cF9tdXRleCk7CiAKIAkvKiBOb3cgZG8gdGhlIFZGUyB3b3JrIHRvIGNyZWF0ZSBhIGNncm91cCAqLwpAQCAtMjk3MSw3ICszMDIzLDcgQEAKIAl9CiAKIAkvKiBDcmVhdGUgdGhlIGNncm91cCBkaXJlY3RvcnksIHdoaWNoIGFsc28gY3JlYXRlcyB0aGUgY2dyb3VwICovCi0JcmV0ID0gdmZzX21rZGlyKGlub2RlLCBkZW50cnksIFNfSUZESVIgfCAwNzU1KTsKKwlyZXQgPSB2ZnNfbWtkaXIoaW5vZGUsIGRlbnRyeSwgMDc1NSk7CiAJY2hpbGQgPSBfX2RfY2dycChkZW50cnkpOwogCWRwdXQoZGVudHJ5KTsKIAlpZiAocmV0KSB7CkBAIC0yOTgxLDEzICszMDMzLDYgQEAKIAkJZ290byBvdXRfcmVsZWFzZTsKIAl9CiAKLQlpZiAoIWNoaWxkKSB7Ci0JCXByaW50ayhLRVJOX0lORk8KLQkJICAgICAgICJDb3VsZG4ndCBmaW5kIG5ldyBjZ3JvdXAgJXNcbiIsIG5vZGVuYW1lKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXRfcmVsZWFzZTsKLQl9Ci0KIAkvKiBUaGUgY2dyb3VwIG5vdyBleGlzdHMuIFJldGFrZSBjZ3JvdXBfbXV0ZXggYW5kIGNoZWNrCiAJICogdGhhdCB3ZSdyZSBzdGlsbCBpbiB0aGUgc2FtZSBzdGF0ZSB0aGF0IHdlIHRob3VnaHQgd2UKIAkgKiB3ZXJlLiAqLwpAQCAtMzA4Myw3ICszMTI4LDggQEAKIHsKIAlzdHJ1Y3QgY2dyb3VwICpjZ3JwID0gY3NzLT5jZ3JvdXA7CiAJcmN1X3JlYWRfbG9jaygpOwotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZjc3MtPnJlZmNudCkgJiYgbm90aWZ5X29uX3JlbGVhc2UoY2dycCkpIHsKKwlpZiAoKGF0b21pY19kZWNfcmV0dXJuKCZjc3MtPnJlZmNudCkgPT0gMSkgJiYKKwkgICAgbm90aWZ5X29uX3JlbGVhc2UoY2dycCkpIHsKIAkJc2V0X2JpdChDR1JQX1JFTEVBU0FCTEUsICZjZ3JwLT5mbGFncyk7CiAJCWNoZWNrX2Zvcl9yZWxlYXNlKGNncnApOwogCX0KZGlmZiAtLWdpdCBhL2tlcm5lbC9jb21wYXQuYyBiL2tlcm5lbC9jb21wYXQuYwppbmRleCBkNTJlMmVjLi40MmQ1NjU0IDEwMDY0NAotLS0gYS9rZXJuZWwvY29tcGF0LmMKKysrIGIva2VybmVsL2NvbXBhdC5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvbWlncmF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Bvc2l4LXRpbWVycy5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVzLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCkBAIC0yMjksNiArMjMwLDcgQEAKIAkJaWYgKGNvcHlfdG9fdXNlcih0YnVmLCAmdG1wLCBzaXplb2YodG1wKSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAl9CisJZm9yY2Vfc3VjY2Vzc2Z1bF9zeXNjYWxsX3JldHVybigpOwogCXJldHVybiBjb21wYXRfamlmZmllc190b19jbG9ja190KGppZmZpZXMpOwogfQogCkBAIC04OTQsOCArODk2LDkgQEAKIAogCWlmICh0bG9jKSB7CiAJCWlmIChwdXRfdXNlcihpLHRsb2MpKQotCQkJaSA9IC1FRkFVTFQ7CisJCQlyZXR1cm4gLUVGQVVMVDsKIAl9CisJZm9yY2Vfc3VjY2Vzc2Z1bF9zeXNjYWxsX3JldHVybigpOwogCXJldHVybiBpOwogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvY3B1LmMgYi9rZXJuZWwvY3B1LmMKaW5kZXggNDdmZmYzYi4uNzllNDBmMCAxMDA2NDQKLS0tIGEva2VybmVsL2NwdS5jCisrKyBiL2tlcm5lbC9jcHUuYwpAQCAtMjY5LDggKzI2OSwxMSBAQAogCiBpbnQgX19yZWYgY3B1X2Rvd24odW5zaWduZWQgaW50IGNwdSkKIHsKLQlpbnQgZXJyID0gMDsKKwlpbnQgZXJyOwogCisJZXJyID0gc3RvcF9tYWNoaW5lX2NyZWF0ZSgpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAJY3B1X21hcHNfdXBkYXRlX2JlZ2luKCk7CiAKIAlpZiAoY3B1X2hvdHBsdWdfZGlzYWJsZWQpIHsKQEAgLTI5Nyw2ICszMDAsNyBAQAogCiBvdXQ6CiAJY3B1X21hcHNfdXBkYXRlX2RvbmUoKTsKKwlzdG9wX21hY2hpbmVfZGVzdHJveSgpOwogCXJldHVybiBlcnI7CiB9CiBFWFBPUlRfU1lNQk9MKGNwdV9kb3duKTsKQEAgLTM3NSw4ICszNzksMTEgQEAKIAogaW50IGRpc2FibGVfbm9uYm9vdF9jcHVzKHZvaWQpCiB7Ci0JaW50IGNwdSwgZmlyc3RfY3B1LCBlcnJvciA9IDA7CisJaW50IGNwdSwgZmlyc3RfY3B1LCBlcnJvcjsKIAorCWVycm9yID0gc3RvcF9tYWNoaW5lX2NyZWF0ZSgpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOwogCWNwdV9tYXBzX3VwZGF0ZV9iZWdpbigpOwogCWZpcnN0X2NwdSA9IGNwdW1hc2tfZmlyc3QoY3B1X29ubGluZV9tYXNrKTsKIAkvKiBXZSB0YWtlIGRvd24gYWxsIG9mIHRoZSBub24tYm9vdCBDUFVzIGluIG9uZSBzaG90IHRvIGF2b2lkIHJhY2VzCkBAIC00MDUsNiArNDEyLDcgQEAKIAkJcHJpbnRrKEtFUk5fRVJSICJOb24tYm9vdCBDUFVzIGFyZSBub3QgZGlzYWJsZWRcbiIpOwogCX0KIAljcHVfbWFwc191cGRhdGVfZG9uZSgpOworCXN0b3BfbWFjaGluZV9kZXN0cm95KCk7CiAJcmV0dXJuIGVycm9yOwogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvY3B1c2V0LmMgYi9rZXJuZWwvY3B1c2V0LmMKaW5kZXggMzljMWE0Yy4uNjQ3Yzc3YSAxMDA2NDQKLS0tIGEva2VybmVsL2NwdXNldC5jCisrKyBiL2tlcm5lbC9jcHVzZXQuYwpAQCAtODQsNyArODQsNyBAQAogCXN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlIGNzczsKIAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CQkvKiAidW5zaWduZWQgbG9uZyIgc28gYml0b3BzIHdvcmsgKi8KLQljcHVtYXNrX3QgY3B1c19hbGxvd2VkOwkJLyogQ1BVcyBhbGxvd2VkIHRvIHRhc2tzIGluIGNwdXNldCAqLworCWNwdW1hc2tfdmFyX3QgY3B1c19hbGxvd2VkOwkvKiBDUFVzIGFsbG93ZWQgdG8gdGFza3MgaW4gY3B1c2V0ICovCiAJbm9kZW1hc2tfdCBtZW1zX2FsbG93ZWQ7CS8qIE1lbW9yeSBOb2RlcyBhbGxvd2VkIHRvIHRhc2tzICovCiAKIAlzdHJ1Y3QgY3B1c2V0ICpwYXJlbnQ7CQkvKiBteSBwYXJlbnQgKi8KQEAgLTE5NSw4ICsxOTUsNiBAQAogCiBzdGF0aWMgc3RydWN0IGNwdXNldCB0b3BfY3B1c2V0ID0gewogCS5mbGFncyA9ICgoMSA8PCBDU19DUFVfRVhDTFVTSVZFKSB8ICgxIDw8IENTX01FTV9FWENMVVNJVkUpKSwKLQkuY3B1c19hbGxvd2VkID0gQ1BVX01BU0tfQUxMLAotCS5tZW1zX2FsbG93ZWQgPSBOT0RFX01BU0tfQUxMLAogfTsKIAogLyoKQEAgLTI0MCw2ICsyMzgsMTcgQEAKIHN0YXRpYyBERUZJTkVfTVVURVgoY2FsbGJhY2tfbXV0ZXgpOwogCiAvKgorICogY3B1c2V0X2J1ZmZlcl9sb2NrIHByb3RlY3RzIGJvdGggdGhlIGNwdXNldF9uYW1lIGFuZCBjcHVzZXRfbm9kZWxpc3QKKyAqIGJ1ZmZlcnMuICBUaGV5IGFyZSBzdGF0aWNhbGx5IGFsbG9jYXRlZCB0byBwcmV2ZW50IHVzaW5nIGV4Y2VzcyBzdGFjaworICogd2hlbiBjYWxsaW5nIGNwdXNldF9wcmludF90YXNrX21lbXNfYWxsb3dlZCgpLgorICovCisjZGVmaW5lIENQVVNFVF9OQU1FX0xFTgkJKDEyOCkKKyNkZWZpbmUJQ1BVU0VUX05PREVMSVNUX0xFTgkoMjU2KQorc3RhdGljIGNoYXIgY3B1c2V0X25hbWVbQ1BVU0VUX05BTUVfTEVOXTsKK3N0YXRpYyBjaGFyIGNwdXNldF9ub2RlbGlzdFtDUFVTRVRfTk9ERUxJU1RfTEVOXTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soY3B1c2V0X2J1ZmZlcl9sb2NrKTsKKworLyoKICAqIFRoaXMgaXMgdWdseSwgYnV0IHByZXNlcnZlcyB0aGUgdXNlcnNwYWNlIEFQSSBmb3IgZXhpc3RpbmcgY3B1c2V0CiAgKiB1c2Vycy4gSWYgc29tZW9uZSB0cmllcyB0byBtb3VudCB0aGUgImNwdXNldCIgZmlsZXN5c3RlbSwgd2UKICAqIHNpbGVudGx5IHN3aXRjaCBpdCB0byBtb3VudCAiY2dyb3VwIiBpbnN0ZWFkCkBAIC0yNjcsNyArMjc2LDcgQEAKIH07CiAKIC8qCi0gKiBSZXR1cm4gaW4gKnBtYXNrIHRoZSBwb3J0aW9uIG9mIGEgY3B1c2V0cydzIGNwdXNfYWxsb3dlZCB0aGF0CisgKiBSZXR1cm4gaW4gcG1hc2sgdGhlIHBvcnRpb24gb2YgYSBjcHVzZXRzJ3MgY3B1c19hbGxvd2VkIHRoYXQKICAqIGFyZSBvbmxpbmUuICBJZiBub25lIGFyZSBvbmxpbmUsIHdhbGsgdXAgdGhlIGNwdXNldCBoaWVyYXJjaHkKICAqIHVudGlsIHdlIGZpbmQgb25lIHRoYXQgZG9lcyBoYXZlIHNvbWUgb25saW5lIGNwdXMuICBJZiB3ZSBnZXQKICAqIGFsbCB0aGUgd2F5IHRvIHRoZSB0b3AgYW5kIHN0aWxsIGhhdmVuJ3QgZm91bmQgYW55IG9ubGluZSBjcHVzLApAQCAtMjgwLDE1ICsyODksMTYgQEAKICAqIENhbGwgd2l0aCBjYWxsYmFja19tdXRleCBoZWxkLgogICovCiAKLXN0YXRpYyB2b2lkIGd1YXJhbnRlZV9vbmxpbmVfY3B1cyhjb25zdCBzdHJ1Y3QgY3B1c2V0ICpjcywgY3B1bWFza190ICpwbWFzaykKK3N0YXRpYyB2b2lkIGd1YXJhbnRlZV9vbmxpbmVfY3B1cyhjb25zdCBzdHJ1Y3QgY3B1c2V0ICpjcywKKwkJCQkgIHN0cnVjdCBjcHVtYXNrICpwbWFzaykKIHsKLQl3aGlsZSAoY3MgJiYgIWNwdXNfaW50ZXJzZWN0cyhjcy0+Y3B1c19hbGxvd2VkLCBjcHVfb25saW5lX21hcCkpCisJd2hpbGUgKGNzICYmICFjcHVtYXNrX2ludGVyc2VjdHMoY3MtPmNwdXNfYWxsb3dlZCwgY3B1X29ubGluZV9tYXNrKSkKIAkJY3MgPSBjcy0+cGFyZW50OwogCWlmIChjcykKLQkJY3B1c19hbmQoKnBtYXNrLCBjcy0+Y3B1c19hbGxvd2VkLCBjcHVfb25saW5lX21hcCk7CisJCWNwdW1hc2tfYW5kKHBtYXNrLCBjcy0+Y3B1c19hbGxvd2VkLCBjcHVfb25saW5lX21hc2spOwogCWVsc2UKLQkJKnBtYXNrID0gY3B1X29ubGluZV9tYXA7Ci0JQlVHX09OKCFjcHVzX2ludGVyc2VjdHMoKnBtYXNrLCBjcHVfb25saW5lX21hcCkpOworCQljcHVtYXNrX2NvcHkocG1hc2ssIGNwdV9vbmxpbmVfbWFzayk7CisJQlVHX09OKCFjcHVtYXNrX2ludGVyc2VjdHMocG1hc2ssIGNwdV9vbmxpbmVfbWFzaykpOwogfQogCiAvKgpAQCAtMzY0LDE0ICszNzQsOSBAQAogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKIAlzdHJ1Y3QgY3B1c2V0ICpjczsKIAotCWlmICh0YXNrX2NzKHRzaykgPT0gJnRvcF9jcHVzZXQpIHsKLQkJLyogRG9uJ3QgbmVlZCByY3UgZm9yIHRvcF9jcHVzZXQuICBJdCdzIG5ldmVyIGZyZWVkLiAqLwotCQlteV9jcHVzZXRzX21lbV9nZW4gPSB0b3BfY3B1c2V0Lm1lbXNfZ2VuZXJhdGlvbjsKLQl9IGVsc2UgewotCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCW15X2NwdXNldHNfbWVtX2dlbiA9IHRhc2tfY3ModHNrKS0+bWVtc19nZW5lcmF0aW9uOwotCQlyY3VfcmVhZF91bmxvY2soKTsKLQl9CisJcmN1X3JlYWRfbG9jaygpOworCW15X2NwdXNldHNfbWVtX2dlbiA9IHRhc2tfY3ModHNrKS0+bWVtc19nZW5lcmF0aW9uOworCXJjdV9yZWFkX3VubG9jaygpOwogCiAJaWYgKG15X2NwdXNldHNfbWVtX2dlbiAhPSB0c2stPmNwdXNldF9tZW1zX2dlbmVyYXRpb24pIHsKIAkJbXV0ZXhfbG9jaygmY2FsbGJhY2tfbXV0ZXgpOwpAQCAtNDAzLDEyICs0MDgsNDMgQEAKIAogc3RhdGljIGludCBpc19jcHVzZXRfc3Vic2V0KGNvbnN0IHN0cnVjdCBjcHVzZXQgKnAsIGNvbnN0IHN0cnVjdCBjcHVzZXQgKnEpCiB7Ci0JcmV0dXJuCWNwdXNfc3Vic2V0KHAtPmNwdXNfYWxsb3dlZCwgcS0+Y3B1c19hbGxvd2VkKSAmJgorCXJldHVybgljcHVtYXNrX3N1YnNldChwLT5jcHVzX2FsbG93ZWQsIHEtPmNwdXNfYWxsb3dlZCkgJiYKIAkJbm9kZXNfc3Vic2V0KHAtPm1lbXNfYWxsb3dlZCwgcS0+bWVtc19hbGxvd2VkKSAmJgogCQlpc19jcHVfZXhjbHVzaXZlKHApIDw9IGlzX2NwdV9leGNsdXNpdmUocSkgJiYKIAkJaXNfbWVtX2V4Y2x1c2l2ZShwKSA8PSBpc19tZW1fZXhjbHVzaXZlKHEpOwogfQogCisvKioKKyAqIGFsbG9jX3RyaWFsX2NwdXNldCAtIGFsbG9jYXRlIGEgdHJpYWwgY3B1c2V0CisgKiBAY3M6IHRoZSBjcHVzZXQgdGhhdCB0aGUgdHJpYWwgY3B1c2V0IGR1cGxpY2F0ZXMKKyAqLworc3RhdGljIHN0cnVjdCBjcHVzZXQgKmFsbG9jX3RyaWFsX2NwdXNldChjb25zdCBzdHJ1Y3QgY3B1c2V0ICpjcykKK3sKKwlzdHJ1Y3QgY3B1c2V0ICp0cmlhbDsKKworCXRyaWFsID0ga21lbWR1cChjcywgc2l6ZW9mKCpjcyksIEdGUF9LRVJORUwpOworCWlmICghdHJpYWwpCisJCXJldHVybiBOVUxMOworCisJaWYgKCFhbGxvY19jcHVtYXNrX3ZhcigmdHJpYWwtPmNwdXNfYWxsb3dlZCwgR0ZQX0tFUk5FTCkpIHsKKwkJa2ZyZWUodHJpYWwpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJY3B1bWFza19jb3B5KHRyaWFsLT5jcHVzX2FsbG93ZWQsIGNzLT5jcHVzX2FsbG93ZWQpOworCisJcmV0dXJuIHRyaWFsOworfQorCisvKioKKyAqIGZyZWVfdHJpYWxfY3B1c2V0IC0gZnJlZSB0aGUgdHJpYWwgY3B1c2V0CisgKiBAdHJpYWw6IHRoZSB0cmlhbCBjcHVzZXQgdG8gYmUgZnJlZWQKKyAqLworc3RhdGljIHZvaWQgZnJlZV90cmlhbF9jcHVzZXQoc3RydWN0IGNwdXNldCAqdHJpYWwpCit7CisJZnJlZV9jcHVtYXNrX3Zhcih0cmlhbC0+Y3B1c19hbGxvd2VkKTsKKwlrZnJlZSh0cmlhbCk7Cit9CisKIC8qCiAgKiB2YWxpZGF0ZV9jaGFuZ2UoKSAtIFVzZWQgdG8gdmFsaWRhdGUgdGhhdCBhbnkgcHJvcG9zZWQgY3B1c2V0IGNoYW5nZQogICoJCSAgICAgICBmb2xsb3dzIHRoZSBzdHJ1Y3R1cmFsIHJ1bGVzIGZvciBjcHVzZXRzLgpAQCAtNDU4LDcgKzQ5NCw3IEBACiAJCWMgPSBjZ3JvdXBfY3MoY29udCk7CiAJCWlmICgoaXNfY3B1X2V4Y2x1c2l2ZSh0cmlhbCkgfHwgaXNfY3B1X2V4Y2x1c2l2ZShjKSkgJiYKIAkJICAgIGMgIT0gY3VyICYmCi0JCSAgICBjcHVzX2ludGVyc2VjdHModHJpYWwtPmNwdXNfYWxsb3dlZCwgYy0+Y3B1c19hbGxvd2VkKSkKKwkJICAgIGNwdW1hc2tfaW50ZXJzZWN0cyh0cmlhbC0+Y3B1c19hbGxvd2VkLCBjLT5jcHVzX2FsbG93ZWQpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWlmICgoaXNfbWVtX2V4Y2x1c2l2ZSh0cmlhbCkgfHwgaXNfbWVtX2V4Y2x1c2l2ZShjKSkgJiYKIAkJICAgIGMgIT0gY3VyICYmCkBAIC00NjgsNyArNTA0LDcgQEAKIAogCS8qIENwdXNldHMgd2l0aCB0YXNrcyBjYW4ndCBoYXZlIGVtcHR5IGNwdXNfYWxsb3dlZCBvciBtZW1zX2FsbG93ZWQgKi8KIAlpZiAoY2dyb3VwX3Rhc2tfY291bnQoY3VyLT5jc3MuY2dyb3VwKSkgewotCQlpZiAoY3B1c19lbXB0eSh0cmlhbC0+Y3B1c19hbGxvd2VkKSB8fAorCQlpZiAoY3B1bWFza19lbXB0eSh0cmlhbC0+Y3B1c19hbGxvd2VkKSB8fAogCQkgICAgbm9kZXNfZW1wdHkodHJpYWwtPm1lbXNfYWxsb3dlZCkpIHsKIAkJCXJldHVybiAtRU5PU1BDOwogCQl9CkBAIC00ODMsNyArNTE5LDcgQEAKICAqLwogc3RhdGljIGludCBjcHVzZXRzX292ZXJsYXAoc3RydWN0IGNwdXNldCAqYSwgc3RydWN0IGNwdXNldCAqYikKIHsKLQlyZXR1cm4gY3B1c19pbnRlcnNlY3RzKGEtPmNwdXNfYWxsb3dlZCwgYi0+Y3B1c19hbGxvd2VkKTsKKwlyZXR1cm4gY3B1bWFza19pbnRlcnNlY3RzKGEtPmNwdXNfYWxsb3dlZCwgYi0+Y3B1c19hbGxvd2VkKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTUwOCw3ICs1NDQsNyBAQAogCQljcCA9IGxpc3RfZmlyc3RfZW50cnkoJnEsIHN0cnVjdCBjcHVzZXQsIHN0YWNrX2xpc3QpOwogCQlsaXN0X2RlbChxLm5leHQpOwogCi0JCWlmIChjcHVzX2VtcHR5KGNwLT5jcHVzX2FsbG93ZWQpKQorCQlpZiAoY3B1bWFza19lbXB0eShjcC0+Y3B1c19hbGxvd2VkKSkKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChpc19zY2hlZF9sb2FkX2JhbGFuY2UoY3ApKQpAQCAtNTc1LDcgKzYxMSw4IEBACiAgKgllbGVtZW50IG9mIHRoZSBwYXJ0aXRpb24gKG9uZSBzY2hlZCBkb21haW4pIHRvIGJlIHBhc3NlZCB0bwogICoJcGFydGl0aW9uX3NjaGVkX2RvbWFpbnMoKS4KICAqLwotc3RhdGljIGludCBnZW5lcmF0ZV9zY2hlZF9kb21haW5zKGNwdW1hc2tfdCAqKmRvbWFpbnMsCisvKiBGSVhNRTogc2VlIHRoZSBGSVhNRSBpbiBwYXJ0aXRpb25fc2NoZWRfZG9tYWlucygpICovCitzdGF0aWMgaW50IGdlbmVyYXRlX3NjaGVkX2RvbWFpbnMoc3RydWN0IGNwdW1hc2sgKipkb21haW5zLAogCQkJc3RydWN0IHNjaGVkX2RvbWFpbl9hdHRyICoqYXR0cmlidXRlcykKIHsKIAlMSVNUX0hFQUQocSk7CQkvKiBxdWV1ZSBvZiBjcHVzZXRzIHRvIGJlIHNjYW5uZWQgKi8KQEAgLTU4MywxMCArNjIwLDEwIEBACiAJc3RydWN0IGNwdXNldCAqKmNzYTsJLyogYXJyYXkgb2YgYWxsIGNwdXNldCBwdHJzICovCiAJaW50IGNzbjsJCS8qIGhvdyBtYW55IGNwdXNldCBwdHJzIGluIGNzYSBzbyBmYXIgKi8KIAlpbnQgaSwgaiwgazsJCS8qIGluZGljZXMgZm9yIHBhcnRpdGlvbiBmaW5kaW5nIGxvb3BzICovCi0JY3B1bWFza190ICpkb21zOwkvKiByZXN1bHRpbmcgcGFydGl0aW9uOyBpLmUuIHNjaGVkIGRvbWFpbnMgKi8KKwlzdHJ1Y3QgY3B1bWFzayAqZG9tczsJLyogcmVzdWx0aW5nIHBhcnRpdGlvbjsgaS5lLiBzY2hlZCBkb21haW5zICovCiAJc3RydWN0IHNjaGVkX2RvbWFpbl9hdHRyICpkYXR0cjsgIC8qIGF0dHJpYnV0ZXMgZm9yIGN1c3RvbSBkb21haW5zICovCiAJaW50IG5kb21zID0gMDsJCS8qIG51bWJlciBvZiBzY2hlZCBkb21haW5zIGluIHJlc3VsdCAqLwotCWludCBuc2xvdDsJCS8qIG5leHQgZW1wdHkgZG9tc1tdIGNwdW1hc2tfdCBzbG90ICovCisJaW50IG5zbG90OwkJLyogbmV4dCBlbXB0eSBkb21zW10gc3RydWN0IGNwdW1hc2sgc2xvdCAqLwogCiAJZG9tcyA9IE5VTEw7CiAJZGF0dHIgPSBOVUxMOwpAQCAtNTk0LDcgKzYzMSw3IEBACiAKIAkvKiBTcGVjaWFsIGNhc2UgZm9yIHRoZSA5OSUgb2Ygc3lzdGVtcyB3aXRoIG9uZSwgZnVsbCwgc2NoZWQgZG9tYWluICovCiAJaWYgKGlzX3NjaGVkX2xvYWRfYmFsYW5jZSgmdG9wX2NwdXNldCkpIHsKLQkJZG9tcyA9IGttYWxsb2Moc2l6ZW9mKGNwdW1hc2tfdCksIEdGUF9LRVJORUwpOworCQlkb21zID0ga21hbGxvYyhjcHVtYXNrX3NpemUoKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghZG9tcykKIAkJCWdvdG8gZG9uZTsKIApAQCAtNjAzLDcgKzY0MCw3IEBACiAJCQkqZGF0dHIgPSBTRF9BVFRSX0lOSVQ7CiAJCQl1cGRhdGVfZG9tYWluX2F0dHJfdHJlZShkYXR0ciwgJnRvcF9jcHVzZXQpOwogCQl9Ci0JCSpkb21zID0gdG9wX2NwdXNldC5jcHVzX2FsbG93ZWQ7CisJCWNwdW1hc2tfY29weShkb21zLCB0b3BfY3B1c2V0LmNwdXNfYWxsb3dlZCk7CiAKIAkJbmRvbXMgPSAxOwogCQlnb3RvIGRvbmU7CkBAIC02MjIsNyArNjU5LDcgQEAKIAkJY3AgPSBsaXN0X2ZpcnN0X2VudHJ5KCZxLCBzdHJ1Y3QgY3B1c2V0LCBzdGFja19saXN0KTsKIAkJbGlzdF9kZWwocS5uZXh0KTsKIAotCQlpZiAoY3B1c19lbXB0eShjcC0+Y3B1c19hbGxvd2VkKSkKKwkJaWYgKGNwdW1hc2tfZW1wdHkoY3AtPmNwdXNfYWxsb3dlZCkpCiAJCQljb250aW51ZTsKIAogCQkvKgpAQCAtNjczLDcgKzcxMCw3IEBACiAJICogTm93IHdlIGtub3cgaG93IG1hbnkgZG9tYWlucyB0byBjcmVhdGUuCiAJICogQ29udmVydCA8Y3NuLCBjc2E+IHRvIDxuZG9tcywgZG9tcz4gYW5kIHBvcHVsYXRlIGNwdSBtYXNrcy4KIAkgKi8KLQlkb21zID0ga21hbGxvYyhuZG9tcyAqIHNpemVvZihjcHVtYXNrX3QpLCBHRlBfS0VSTkVMKTsKKwlkb21zID0ga21hbGxvYyhuZG9tcyAqIGNwdW1hc2tfc2l6ZSgpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRvbXMpCiAJCWdvdG8gZG9uZTsKIApAQCAtNjg1LDcgKzcyMiw3IEBACiAKIAlmb3IgKG5zbG90ID0gMCwgaSA9IDA7IGkgPCBjc247IGkrKykgewogCQlzdHJ1Y3QgY3B1c2V0ICphID0gY3NhW2ldOwotCQljcHVtYXNrX3QgKmRwOworCQlzdHJ1Y3QgY3B1bWFzayAqZHA7CiAJCWludCBhcG4gPSBhLT5wbjsKIAogCQlpZiAoYXBuIDwgMCkgewpAQCAtNzA4LDE0ICs3NDUsMTQgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJY3B1c19jbGVhcigqZHApOworCQljcHVtYXNrX2NsZWFyKGRwKTsKIAkJaWYgKGRhdHRyKQogCQkJKihkYXR0ciArIG5zbG90KSA9IFNEX0FUVFJfSU5JVDsKIAkJZm9yIChqID0gaTsgaiA8IGNzbjsgaisrKSB7CiAJCQlzdHJ1Y3QgY3B1c2V0ICpiID0gY3NhW2pdOwogCiAJCQlpZiAoYXBuID09IGItPnBuKSB7Ci0JCQkJY3B1c19vcigqZHAsICpkcCwgYi0+Y3B1c19hbGxvd2VkKTsKKwkJCQljcHVtYXNrX29yKGRwLCBkcCwgYi0+Y3B1c19hbGxvd2VkKTsKIAkJCQlpZiAoZGF0dHIpCiAJCQkJCXVwZGF0ZV9kb21haW5fYXR0cl90cmVlKGRhdHRyICsgbnNsb3QsIGIpOwogCkBAIC03NTUsNyArNzkyLDcgQEAKIHN0YXRpYyB2b2lkIGRvX3JlYnVpbGRfc2NoZWRfZG9tYWlucyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnVudXNlZCkKIHsKIAlzdHJ1Y3Qgc2NoZWRfZG9tYWluX2F0dHIgKmF0dHI7Ci0JY3B1bWFza190ICpkb21zOworCXN0cnVjdCBjcHVtYXNrICpkb21zOwogCWludCBuZG9tczsKIAogCWdldF9vbmxpbmVfY3B1cygpOwpAQCAtODI0LDcgKzg2MSw3IEBACiBzdGF0aWMgaW50IGNwdXNldF90ZXN0X2NwdW1hc2soc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCiAJCQkgICAgICAgc3RydWN0IGNncm91cF9zY2FubmVyICpzY2FuKQogewotCXJldHVybiAhY3B1c19lcXVhbCh0c2stPmNwdXNfYWxsb3dlZCwKKwlyZXR1cm4gIWNwdW1hc2tfZXF1YWwoJnRzay0+Y3B1c19hbGxvd2VkLAogCQkJKGNncm91cF9jcyhzY2FuLT5jZykpLT5jcHVzX2FsbG93ZWQpOwogfQogCkBAIC04NDIsNyArODc5LDcgQEAKIHN0YXRpYyB2b2lkIGNwdXNldF9jaGFuZ2VfY3B1bWFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKIAkJCQkgIHN0cnVjdCBjZ3JvdXBfc2Nhbm5lciAqc2NhbikKIHsKLQlzZXRfY3B1c19hbGxvd2VkX3B0cih0c2ssICYoKGNncm91cF9jcyhzY2FuLT5jZykpLT5jcHVzX2FsbG93ZWQpKTsKKwlzZXRfY3B1c19hbGxvd2VkX3B0cih0c2ssICgoY2dyb3VwX2NzKHNjYW4tPmNnKSktPmNwdXNfYWxsb3dlZCkpOwogfQogCiAvKioKQEAgLTg3NCwxMCArOTExLDEwIEBACiAgKiBAY3M6IHRoZSBjcHVzZXQgdG8gY29uc2lkZXIKICAqIEBidWY6IGJ1ZmZlciBvZiBjcHUgbnVtYmVycyB3cml0dGVuIHRvIHRoaXMgY3B1c2V0CiAgKi8KLXN0YXRpYyBpbnQgdXBkYXRlX2NwdW1hc2soc3RydWN0IGNwdXNldCAqY3MsIGNvbnN0IGNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgdXBkYXRlX2NwdW1hc2soc3RydWN0IGNwdXNldCAqY3MsIHN0cnVjdCBjcHVzZXQgKnRyaWFsY3MsCisJCQkgIGNvbnN0IGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgcHRyX2hlYXAgaGVhcDsKLQlzdHJ1Y3QgY3B1c2V0IHRyaWFsY3M7CiAJaW50IHJldHZhbDsKIAlpbnQgaXNfbG9hZF9iYWxhbmNlZDsKIApAQCAtODg1LDggKzkyMiw2IEBACiAJaWYgKGNzID09ICZ0b3BfY3B1c2V0KQogCQlyZXR1cm4gLUVBQ0NFUzsKIAotCXRyaWFsY3MgPSAqY3M7Ci0KIAkvKgogCSAqIEFuIGVtcHR5IGNwdXNfYWxsb3dlZCBpcyBvayBvbmx5IGlmIHRoZSBjcHVzZXQgaGFzIG5vIHRhc2tzLgogCSAqIFNpbmNlIGNwdWxpc3RfcGFyc2UoKSBmYWlscyBvbiBhbiBlbXB0eSBtYXNrLCB3ZSBzcGVjaWFsIGNhc2UKQEAgLTg5NCwzMSArOTI5LDMxIEBACiAJICogd2l0aCB0YXNrcyBoYXZlIGNwdXMuCiAJICovCiAJaWYgKCEqYnVmKSB7Ci0JCWNwdXNfY2xlYXIodHJpYWxjcy5jcHVzX2FsbG93ZWQpOworCQljcHVtYXNrX2NsZWFyKHRyaWFsY3MtPmNwdXNfYWxsb3dlZCk7CiAJfSBlbHNlIHsKLQkJcmV0dmFsID0gY3B1bGlzdF9wYXJzZShidWYsICZ0cmlhbGNzLmNwdXNfYWxsb3dlZCk7CisJCXJldHZhbCA9IGNwdWxpc3RfcGFyc2UoYnVmLCB0cmlhbGNzLT5jcHVzX2FsbG93ZWQpOwogCQlpZiAocmV0dmFsIDwgMCkKIAkJCXJldHVybiByZXR2YWw7CiAKLQkJaWYgKCFjcHVzX3N1YnNldCh0cmlhbGNzLmNwdXNfYWxsb3dlZCwgY3B1X29ubGluZV9tYXApKQorCQlpZiAoIWNwdW1hc2tfc3Vic2V0KHRyaWFsY3MtPmNwdXNfYWxsb3dlZCwgY3B1X29ubGluZV9tYXNrKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCX0KLQlyZXR2YWwgPSB2YWxpZGF0ZV9jaGFuZ2UoY3MsICZ0cmlhbGNzKTsKKwlyZXR2YWwgPSB2YWxpZGF0ZV9jaGFuZ2UoY3MsIHRyaWFsY3MpOwogCWlmIChyZXR2YWwgPCAwKQogCQlyZXR1cm4gcmV0dmFsOwogCiAJLyogTm90aGluZyB0byBkbyBpZiB0aGUgY3B1cyBkaWRuJ3QgY2hhbmdlICovCi0JaWYgKGNwdXNfZXF1YWwoY3MtPmNwdXNfYWxsb3dlZCwgdHJpYWxjcy5jcHVzX2FsbG93ZWQpKQorCWlmIChjcHVtYXNrX2VxdWFsKGNzLT5jcHVzX2FsbG93ZWQsIHRyaWFsY3MtPmNwdXNfYWxsb3dlZCkpCiAJCXJldHVybiAwOwogCiAJcmV0dmFsID0gaGVhcF9pbml0KCZoZWFwLCBQQUdFX1NJWkUsIEdGUF9LRVJORUwsIE5VTEwpOwogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CiAKLQlpc19sb2FkX2JhbGFuY2VkID0gaXNfc2NoZWRfbG9hZF9iYWxhbmNlKCZ0cmlhbGNzKTsKKwlpc19sb2FkX2JhbGFuY2VkID0gaXNfc2NoZWRfbG9hZF9iYWxhbmNlKHRyaWFsY3MpOwogCiAJbXV0ZXhfbG9jaygmY2FsbGJhY2tfbXV0ZXgpOwotCWNzLT5jcHVzX2FsbG93ZWQgPSB0cmlhbGNzLmNwdXNfYWxsb3dlZDsKKwljcHVtYXNrX2NvcHkoY3MtPmNwdXNfYWxsb3dlZCwgdHJpYWxjcy0+Y3B1c19hbGxvd2VkKTsKIAltdXRleF91bmxvY2soJmNhbGxiYWNrX211dGV4KTsKIAogCS8qCkBAIC0xMDA2LDcgKzEwNDEsNyBAQAogCWNwdXNldF9iZWluZ19yZWJvdW5kID0gY3M7CQkvKiBjYXVzZXMgbXBvbF9kdXAoKSByZWJpbmQgKi8KIAogCWZ1ZGdlID0gMTA7CQkJCS8qIHNwYXJlIG1tYXJyYXlbXSBzbG90cyAqLwotCWZ1ZGdlICs9IGNwdXNfd2VpZ2h0KGNzLT5jcHVzX2FsbG93ZWQpOwkvKiBpbWFnaW5lIG9uZSBmb3JrLWJvbWIvY3B1ICovCisJZnVkZ2UgKz0gY3B1bWFza193ZWlnaHQoY3MtPmNwdXNfYWxsb3dlZCk7LyogaW1hZ2luZSAxIGZvcmstYm9tYi9jcHUgKi8KIAlyZXR2YWwgPSAtRU5PTUVNOwogCiAJLyoKQEAgLTEwOTMsOSArMTEyOCw5IEBACiAgKiBsb2NrIGVhY2ggc3VjaCB0YXNrcyBtbS0+bW1hcF9zZW0sIHNjYW4gaXRzIHZtYSdzIGFuZCByZWJpbmQKICAqIHRoZWlyIG1lbXBvbGljaWVzIHRvIHRoZSBjcHVzZXRzIG5ldyBtZW1zX2FsbG93ZWQuCiAgKi8KLXN0YXRpYyBpbnQgdXBkYXRlX25vZGVtYXNrKHN0cnVjdCBjcHVzZXQgKmNzLCBjb25zdCBjaGFyICpidWYpCitzdGF0aWMgaW50IHVwZGF0ZV9ub2RlbWFzayhzdHJ1Y3QgY3B1c2V0ICpjcywgc3RydWN0IGNwdXNldCAqdHJpYWxjcywKKwkJCSAgIGNvbnN0IGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgY3B1c2V0IHRyaWFsY3M7CiAJbm9kZW1hc2tfdCBvbGRtZW07CiAJaW50IHJldHZhbDsKIApAQCAtMTEwNiw4ICsxMTQxLDYgQEAKIAlpZiAoY3MgPT0gJnRvcF9jcHVzZXQpCiAJCXJldHVybiAtRUFDQ0VTOwogCi0JdHJpYWxjcyA9ICpjczsKLQogCS8qCiAJICogQW4gZW1wdHkgbWVtc19hbGxvd2VkIGlzIG9rIGlmZiB0aGVyZSBhcmUgbm8gdGFza3MgaW4gdGhlIGNwdXNldC4KIAkgKiBTaW5jZSBub2RlbGlzdF9wYXJzZSgpIGZhaWxzIG9uIGFuIGVtcHR5IG1hc2ssIHdlIHNwZWNpYWwgY2FzZQpAQCAtMTExNSwyNyArMTE0OCwyNyBAQAogCSAqIHdpdGggdGFza3MgaGF2ZSBtZW1vcnkuCiAJICovCiAJaWYgKCEqYnVmKSB7Ci0JCW5vZGVzX2NsZWFyKHRyaWFsY3MubWVtc19hbGxvd2VkKTsKKwkJbm9kZXNfY2xlYXIodHJpYWxjcy0+bWVtc19hbGxvd2VkKTsKIAl9IGVsc2UgewotCQlyZXR2YWwgPSBub2RlbGlzdF9wYXJzZShidWYsIHRyaWFsY3MubWVtc19hbGxvd2VkKTsKKwkJcmV0dmFsID0gbm9kZWxpc3RfcGFyc2UoYnVmLCB0cmlhbGNzLT5tZW1zX2FsbG93ZWQpOwogCQlpZiAocmV0dmFsIDwgMCkKIAkJCWdvdG8gZG9uZTsKIAotCQlpZiAoIW5vZGVzX3N1YnNldCh0cmlhbGNzLm1lbXNfYWxsb3dlZCwKKwkJaWYgKCFub2Rlc19zdWJzZXQodHJpYWxjcy0+bWVtc19hbGxvd2VkLAogCQkJCW5vZGVfc3RhdGVzW05fSElHSF9NRU1PUlldKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCX0KIAlvbGRtZW0gPSBjcy0+bWVtc19hbGxvd2VkOwotCWlmIChub2Rlc19lcXVhbChvbGRtZW0sIHRyaWFsY3MubWVtc19hbGxvd2VkKSkgeworCWlmIChub2Rlc19lcXVhbChvbGRtZW0sIHRyaWFsY3MtPm1lbXNfYWxsb3dlZCkpIHsKIAkJcmV0dmFsID0gMDsJCS8qIFRvbyBlYXN5IC0gbm90aGluZyB0byBkbyAqLwogCQlnb3RvIGRvbmU7CiAJfQotCXJldHZhbCA9IHZhbGlkYXRlX2NoYW5nZShjcywgJnRyaWFsY3MpOworCXJldHZhbCA9IHZhbGlkYXRlX2NoYW5nZShjcywgdHJpYWxjcyk7CiAJaWYgKHJldHZhbCA8IDApCiAJCWdvdG8gZG9uZTsKIAogCW11dGV4X2xvY2soJmNhbGxiYWNrX211dGV4KTsKLQljcy0+bWVtc19hbGxvd2VkID0gdHJpYWxjcy5tZW1zX2FsbG93ZWQ7CisJY3MtPm1lbXNfYWxsb3dlZCA9IHRyaWFsY3MtPm1lbXNfYWxsb3dlZDsKIAljcy0+bWVtc19nZW5lcmF0aW9uID0gY3B1c2V0X21lbXNfZ2VuZXJhdGlvbisrOwogCW11dGV4X3VubG9jaygmY2FsbGJhY2tfbXV0ZXgpOwogCkBAIC0xMTU2LDcgKzExODksOCBAQAogCiAJaWYgKHZhbCAhPSBjcy0+cmVsYXhfZG9tYWluX2xldmVsKSB7CiAJCWNzLT5yZWxheF9kb21haW5fbGV2ZWwgPSB2YWw7Ci0JCWlmICghY3B1c19lbXB0eShjcy0+Y3B1c19hbGxvd2VkKSAmJiBpc19zY2hlZF9sb2FkX2JhbGFuY2UoY3MpKQorCQlpZiAoIWNwdW1hc2tfZW1wdHkoY3MtPmNwdXNfYWxsb3dlZCkgJiYKKwkJICAgIGlzX3NjaGVkX2xvYWRfYmFsYW5jZShjcykpCiAJCQlhc3luY19yZWJ1aWxkX3NjaGVkX2RvbWFpbnMoKTsKIAl9CiAKQEAgLTExNzUsMzEgKzEyMDksMzYgQEAKIHN0YXRpYyBpbnQgdXBkYXRlX2ZsYWcoY3B1c2V0X2ZsYWdiaXRzX3QgYml0LCBzdHJ1Y3QgY3B1c2V0ICpjcywKIAkJICAgICAgIGludCB0dXJuaW5nX29uKQogewotCXN0cnVjdCBjcHVzZXQgdHJpYWxjczsKKwlzdHJ1Y3QgY3B1c2V0ICp0cmlhbGNzOwogCWludCBlcnI7CiAJaW50IGJhbGFuY2VfZmxhZ19jaGFuZ2VkOwogCi0JdHJpYWxjcyA9ICpjczsKLQlpZiAodHVybmluZ19vbikKLQkJc2V0X2JpdChiaXQsICZ0cmlhbGNzLmZsYWdzKTsKLQllbHNlCi0JCWNsZWFyX2JpdChiaXQsICZ0cmlhbGNzLmZsYWdzKTsKKwl0cmlhbGNzID0gYWxsb2NfdHJpYWxfY3B1c2V0KGNzKTsKKwlpZiAoIXRyaWFsY3MpCisJCXJldHVybiAtRU5PTUVNOwogCi0JZXJyID0gdmFsaWRhdGVfY2hhbmdlKGNzLCAmdHJpYWxjcyk7CisJaWYgKHR1cm5pbmdfb24pCisJCXNldF9iaXQoYml0LCAmdHJpYWxjcy0+ZmxhZ3MpOworCWVsc2UKKwkJY2xlYXJfYml0KGJpdCwgJnRyaWFsY3MtPmZsYWdzKTsKKworCWVyciA9IHZhbGlkYXRlX2NoYW5nZShjcywgdHJpYWxjcyk7CiAJaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7CisJCWdvdG8gb3V0OwogCiAJYmFsYW5jZV9mbGFnX2NoYW5nZWQgPSAoaXNfc2NoZWRfbG9hZF9iYWxhbmNlKGNzKSAhPQotCQkgCQkJaXNfc2NoZWRfbG9hZF9iYWxhbmNlKCZ0cmlhbGNzKSk7CisJCQkJaXNfc2NoZWRfbG9hZF9iYWxhbmNlKHRyaWFsY3MpKTsKIAogCW11dGV4X2xvY2soJmNhbGxiYWNrX211dGV4KTsKLQljcy0+ZmxhZ3MgPSB0cmlhbGNzLmZsYWdzOworCWNzLT5mbGFncyA9IHRyaWFsY3MtPmZsYWdzOwogCW11dGV4X3VubG9jaygmY2FsbGJhY2tfbXV0ZXgpOwogCi0JaWYgKCFjcHVzX2VtcHR5KHRyaWFsY3MuY3B1c19hbGxvd2VkKSAmJiBiYWxhbmNlX2ZsYWdfY2hhbmdlZCkKKwlpZiAoIWNwdW1hc2tfZW1wdHkodHJpYWxjcy0+Y3B1c19hbGxvd2VkKSAmJiBiYWxhbmNlX2ZsYWdfY2hhbmdlZCkKIAkJYXN5bmNfcmVidWlsZF9zY2hlZF9kb21haW5zKCk7CiAKLQlyZXR1cm4gMDsKK291dDoKKwlmcmVlX3RyaWFsX2NwdXNldCh0cmlhbGNzKTsKKwlyZXR1cm4gZXJyOwogfQogCiAvKgpAQCAtMTMwMCw0MiArMTMzOSw0NyBAQAogCXJldHVybiB2YWw7CiB9CiAKKy8qIFByb3RlY3RlZCBieSBjZ3JvdXBfbG9jayAqLworc3RhdGljIGNwdW1hc2tfdmFyX3QgY3B1c19hdHRhY2g7CisKIC8qIENhbGxlZCBieSBjZ3JvdXBzIHRvIGRldGVybWluZSBpZiBhIGNwdXNldCBpcyB1c2FibGU7IGNncm91cF9tdXRleCBoZWxkICovCiBzdGF0aWMgaW50IGNwdXNldF9jYW5fYXR0YWNoKHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcywKIAkJCSAgICAgc3RydWN0IGNncm91cCAqY29udCwgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7CiAJc3RydWN0IGNwdXNldCAqY3MgPSBjZ3JvdXBfY3MoY29udCk7CisJaW50IHJldCA9IDA7CiAKLQlpZiAoY3B1c19lbXB0eShjcy0+Y3B1c19hbGxvd2VkKSB8fCBub2Rlc19lbXB0eShjcy0+bWVtc19hbGxvd2VkKSkKKwlpZiAoY3B1bWFza19lbXB0eShjcy0+Y3B1c19hbGxvd2VkKSB8fCBub2Rlc19lbXB0eShjcy0+bWVtc19hbGxvd2VkKSkKIAkJcmV0dXJuIC1FTk9TUEM7Ci0JaWYgKHRzay0+ZmxhZ3MgJiBQRl9USFJFQURfQk9VTkQpIHsKLQkJY3B1bWFza190IG1hc2s7CiAKKwlpZiAodHNrLT5mbGFncyAmIFBGX1RIUkVBRF9CT1VORCkgewogCQltdXRleF9sb2NrKCZjYWxsYmFja19tdXRleCk7Ci0JCW1hc2sgPSBjcy0+Y3B1c19hbGxvd2VkOworCQlpZiAoIWNwdW1hc2tfZXF1YWwoJnRzay0+Y3B1c19hbGxvd2VkLCBjcy0+Y3B1c19hbGxvd2VkKSkKKwkJCXJldCA9IC1FSU5WQUw7CiAJCW11dGV4X3VubG9jaygmY2FsbGJhY2tfbXV0ZXgpOwotCQlpZiAoIWNwdXNfZXF1YWwodHNrLT5jcHVzX2FsbG93ZWQsIG1hc2spKQotCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcmV0dXJuIHNlY3VyaXR5X3Rhc2tfc2V0c2NoZWR1bGVyKHRzaywgMCwgTlVMTCk7CisJcmV0dXJuIHJldCA8IDAgPyByZXQgOiBzZWN1cml0eV90YXNrX3NldHNjaGVkdWxlcih0c2ssIDAsIE5VTEwpOwogfQogCiBzdGF0aWMgdm9pZCBjcHVzZXRfYXR0YWNoKHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcywKIAkJCSAgc3RydWN0IGNncm91cCAqY29udCwgc3RydWN0IGNncm91cCAqb2xkY29udCwKIAkJCSAgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7Ci0JY3B1bWFza190IGNwdXM7CiAJbm9kZW1hc2tfdCBmcm9tLCB0bzsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKIAlzdHJ1Y3QgY3B1c2V0ICpjcyA9IGNncm91cF9jcyhjb250KTsKIAlzdHJ1Y3QgY3B1c2V0ICpvbGRjcyA9IGNncm91cF9jcyhvbGRjb250KTsKIAlpbnQgZXJyOwogCi0JbXV0ZXhfbG9jaygmY2FsbGJhY2tfbXV0ZXgpOwotCWd1YXJhbnRlZV9vbmxpbmVfY3B1cyhjcywgJmNwdXMpOwotCWVyciA9IHNldF9jcHVzX2FsbG93ZWRfcHRyKHRzaywgJmNwdXMpOwotCW11dGV4X3VubG9jaygmY2FsbGJhY2tfbXV0ZXgpOworCWlmIChjcyA9PSAmdG9wX2NwdXNldCkgeworCQljcHVtYXNrX2NvcHkoY3B1c19hdHRhY2gsIGNwdV9wb3NzaWJsZV9tYXNrKTsKKwl9IGVsc2UgeworCQltdXRleF9sb2NrKCZjYWxsYmFja19tdXRleCk7CisJCWd1YXJhbnRlZV9vbmxpbmVfY3B1cyhjcywgY3B1c19hdHRhY2gpOworCQltdXRleF91bmxvY2soJmNhbGxiYWNrX211dGV4KTsKKwl9CisJZXJyID0gc2V0X2NwdXNfYWxsb3dlZF9wdHIodHNrLCBjcHVzX2F0dGFjaCk7CiAJaWYgKGVycikKIAkJcmV0dXJuOwogCkBAIC0xMzQ4LDcgKzEzOTIsNiBAQAogCQkJY3B1c2V0X21pZ3JhdGVfbW0obW0sICZmcm9tLCAmdG8pOwogCQltbXB1dChtbSk7CiAJfQotCiB9CiAKIC8qIFRoZSB2YXJpb3VzIHR5cGVzIG9mIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBpbiBhIGNwdXNldCBmaWxlIHN5c3RlbSAqLwpAQCAtMTQ0MywyMSArMTQ4NiwyOSBAQAogCQkJCWNvbnN0IGNoYXIgKmJ1ZikKIHsKIAlpbnQgcmV0dmFsID0gMDsKKwlzdHJ1Y3QgY3B1c2V0ICpjcyA9IGNncm91cF9jcyhjZ3JwKTsKKwlzdHJ1Y3QgY3B1c2V0ICp0cmlhbGNzOwogCiAJaWYgKCFjZ3JvdXBfbG9ja19saXZlX2dyb3VwKGNncnApKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCXRyaWFsY3MgPSBhbGxvY190cmlhbF9jcHVzZXQoY3MpOworCWlmICghdHJpYWxjcykKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlzd2l0Y2ggKGNmdC0+cHJpdmF0ZSkgewogCWNhc2UgRklMRV9DUFVMSVNUOgotCQlyZXR2YWwgPSB1cGRhdGVfY3B1bWFzayhjZ3JvdXBfY3MoY2dycCksIGJ1Zik7CisJCXJldHZhbCA9IHVwZGF0ZV9jcHVtYXNrKGNzLCB0cmlhbGNzLCBidWYpOwogCQlicmVhazsKIAljYXNlIEZJTEVfTUVNTElTVDoKLQkJcmV0dmFsID0gdXBkYXRlX25vZGVtYXNrKGNncm91cF9jcyhjZ3JwKSwgYnVmKTsKKwkJcmV0dmFsID0gdXBkYXRlX25vZGVtYXNrKGNzLCB0cmlhbGNzLCBidWYpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR2YWwgPSAtRUlOVkFMOwogCQlicmVhazsKIAl9CisKKwlmcmVlX3RyaWFsX2NwdXNldCh0cmlhbGNzKTsKIAljZ3JvdXBfdW5sb2NrKCk7CiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTE0NzYsMTMgKzE1MjcsMTMgQEAKIAogc3RhdGljIGludCBjcHVzZXRfc3ByaW50Zl9jcHVsaXN0KGNoYXIgKnBhZ2UsIHN0cnVjdCBjcHVzZXQgKmNzKQogewotCWNwdW1hc2tfdCBtYXNrOworCWludCByZXQ7CiAKIAltdXRleF9sb2NrKCZjYWxsYmFja19tdXRleCk7Ci0JbWFzayA9IGNzLT5jcHVzX2FsbG93ZWQ7CisJcmV0ID0gY3B1bGlzdF9zY25wcmludGYocGFnZSwgUEFHRV9TSVpFLCBjcy0+Y3B1c19hbGxvd2VkKTsKIAltdXRleF91bmxvY2soJmNhbGxiYWNrX211dGV4KTsKIAotCXJldHVybiBjcHVsaXN0X3NjbnByaW50ZihwYWdlLCBQQUdFX1NJWkUsICZtYXNrKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGNwdXNldF9zcHJpbnRmX21lbWxpc3QoY2hhciAqcGFnZSwgc3RydWN0IGNwdXNldCAqY3MpCkBAIC0xNzE4LDcgKzE3NjksNyBAQAogCXBhcmVudF9jcyA9IGNncm91cF9jcyhwYXJlbnQpOwogCiAJY3MtPm1lbXNfYWxsb3dlZCA9IHBhcmVudF9jcy0+bWVtc19hbGxvd2VkOwotCWNzLT5jcHVzX2FsbG93ZWQgPSBwYXJlbnRfY3MtPmNwdXNfYWxsb3dlZDsKKwljcHVtYXNrX2NvcHkoY3MtPmNwdXNfYWxsb3dlZCwgcGFyZW50X2NzLT5jcHVzX2FsbG93ZWQpOwogCXJldHVybjsKIH0KIApAQCAtMTc0NCw2ICsxNzk1LDEwIEBACiAJY3MgPSBrbWFsbG9jKHNpemVvZigqY3MpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNzKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKCZjcy0+Y3B1c19hbGxvd2VkLCBHRlBfS0VSTkVMKSkgeworCQlrZnJlZShjcyk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KIAogCWNwdXNldF91cGRhdGVfdGFza19tZW1vcnlfc3RhdGUoKTsKIAljcy0+ZmxhZ3MgPSAwOwpAQCAtMTc1Miw3ICsxODA3LDcgQEAKIAlpZiAoaXNfc3ByZWFkX3NsYWIocGFyZW50KSkKIAkJc2V0X2JpdChDU19TUFJFQURfU0xBQiwgJmNzLT5mbGFncyk7CiAJc2V0X2JpdChDU19TQ0hFRF9MT0FEX0JBTEFOQ0UsICZjcy0+ZmxhZ3MpOwotCWNwdXNfY2xlYXIoY3MtPmNwdXNfYWxsb3dlZCk7CisJY3B1bWFza19jbGVhcihjcy0+Y3B1c19hbGxvd2VkKTsKIAlub2Rlc19jbGVhcihjcy0+bWVtc19hbGxvd2VkKTsKIAljcy0+bWVtc19nZW5lcmF0aW9uID0gY3B1c2V0X21lbXNfZ2VuZXJhdGlvbisrOwogCWZtZXRlcl9pbml0KCZjcy0+Zm1ldGVyKTsKQEAgLTE3NzksNiArMTgzNCw3IEBACiAJCXVwZGF0ZV9mbGFnKENTX1NDSEVEX0xPQURfQkFMQU5DRSwgY3MsIDApOwogCiAJbnVtYmVyX29mX2NwdXNldHMtLTsKKwlmcmVlX2NwdW1hc2tfdmFyKGNzLT5jcHVzX2FsbG93ZWQpOwogCWtmcmVlKGNzKTsKIH0KIApAQCAtMTgwMiw2ICsxODU4LDggQEAKIAogaW50IF9faW5pdCBjcHVzZXRfaW5pdF9lYXJseSh2b2lkKQogeworCWFsbG9jX2Jvb3RtZW1fY3B1bWFza192YXIoJnRvcF9jcHVzZXQuY3B1c19hbGxvd2VkKTsKKwogCXRvcF9jcHVzZXQubWVtc19nZW5lcmF0aW9uID0gY3B1c2V0X21lbXNfZ2VuZXJhdGlvbisrOwogCXJldHVybiAwOwogfQpAQCAtMTgxNyw3ICsxODc1LDcgQEAKIHsKIAlpbnQgZXJyID0gMDsKIAotCWNwdXNfc2V0YWxsKHRvcF9jcHVzZXQuY3B1c19hbGxvd2VkKTsKKwljcHVtYXNrX3NldGFsbCh0b3BfY3B1c2V0LmNwdXNfYWxsb3dlZCk7CiAJbm9kZXNfc2V0YWxsKHRvcF9jcHVzZXQubWVtc19hbGxvd2VkKTsKIAogCWZtZXRlcl9pbml0KCZ0b3BfY3B1c2V0LmZtZXRlcik7CkBAIC0xODI5LDYgKzE4ODcsOSBAQAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCisJaWYgKCFhbGxvY19jcHVtYXNrX3ZhcigmY3B1c19hdHRhY2gsIEdGUF9LRVJORUwpKQorCQlCVUcoKTsKKwogCW51bWJlcl9vZl9jcHVzZXRzID0gMTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE5MDMsNyArMTk2NCw3IEBACiAJICogaGFzIG9ubGluZSBjcHVzLCBzbyBjYW4ndCBiZSBlbXB0eSkuCiAJICovCiAJcGFyZW50ID0gY3MtPnBhcmVudDsKLQl3aGlsZSAoY3B1c19lbXB0eShwYXJlbnQtPmNwdXNfYWxsb3dlZCkgfHwKKwl3aGlsZSAoY3B1bWFza19lbXB0eShwYXJlbnQtPmNwdXNfYWxsb3dlZCkgfHwKIAkJCW5vZGVzX2VtcHR5KHBhcmVudC0+bWVtc19hbGxvd2VkKSkKIAkJcGFyZW50ID0gcGFyZW50LT5wYXJlbnQ7CiAKQEAgLTE5NDQsNyArMjAwNSw3IEBACiAJCX0KIAogCQkvKiBDb250aW51ZSBwYXN0IGNwdXNldHMgd2l0aCBhbGwgY3B1cywgbWVtcyBvbmxpbmUgKi8KLQkJaWYgKGNwdXNfc3Vic2V0KGNwLT5jcHVzX2FsbG93ZWQsIGNwdV9vbmxpbmVfbWFwKSAmJgorCQlpZiAoY3B1bWFza19zdWJzZXQoY3AtPmNwdXNfYWxsb3dlZCwgY3B1X29ubGluZV9tYXNrKSAmJgogCQkgICAgbm9kZXNfc3Vic2V0KGNwLT5tZW1zX2FsbG93ZWQsIG5vZGVfc3RhdGVzW05fSElHSF9NRU1PUlldKSkKIAkJCWNvbnRpbnVlOwogCkBAIC0xOTUyLDEzICsyMDEzLDE0IEBACiAKIAkJLyogUmVtb3ZlIG9mZmxpbmUgY3B1cyBhbmQgbWVtcyBmcm9tIHRoaXMgY3B1c2V0LiAqLwogCQltdXRleF9sb2NrKCZjYWxsYmFja19tdXRleCk7Ci0JCWNwdXNfYW5kKGNwLT5jcHVzX2FsbG93ZWQsIGNwLT5jcHVzX2FsbG93ZWQsIGNwdV9vbmxpbmVfbWFwKTsKKwkJY3B1bWFza19hbmQoY3AtPmNwdXNfYWxsb3dlZCwgY3AtPmNwdXNfYWxsb3dlZCwKKwkJCSAgICBjcHVfb25saW5lX21hc2spOwogCQlub2Rlc19hbmQoY3AtPm1lbXNfYWxsb3dlZCwgY3AtPm1lbXNfYWxsb3dlZCwKIAkJCQkJCW5vZGVfc3RhdGVzW05fSElHSF9NRU1PUlldKTsKIAkJbXV0ZXhfdW5sb2NrKCZjYWxsYmFja19tdXRleCk7CiAKIAkJLyogTW92ZSB0YXNrcyBmcm9tIHRoZSBlbXB0eSBjcHVzZXQgdG8gYSBwYXJlbnQgKi8KLQkJaWYgKGNwdXNfZW1wdHkoY3AtPmNwdXNfYWxsb3dlZCkgfHwKKwkJaWYgKGNwdW1hc2tfZW1wdHkoY3AtPmNwdXNfYWxsb3dlZCkgfHwKIAkJICAgICBub2Rlc19lbXB0eShjcC0+bWVtc19hbGxvd2VkKSkKIAkJCXJlbW92ZV90YXNrc19pbl9lbXB0eV9jcHVzZXQoY3ApOwogCQllbHNlIHsKQEAgLTE5ODQsNyArMjA0Niw3IEBACiAJCQkJdW5zaWduZWQgbG9uZyBwaGFzZSwgdm9pZCAqdW51c2VkX2NwdSkKIHsKIAlzdHJ1Y3Qgc2NoZWRfZG9tYWluX2F0dHIgKmF0dHI7Ci0JY3B1bWFza190ICpkb21zOworCXN0cnVjdCBjcHVtYXNrICpkb21zOwogCWludCBuZG9tczsKIAogCXN3aXRjaCAocGhhc2UpIHsKQEAgLTE5OTksNyArMjA2MSw3IEBACiAJfQogCiAJY2dyb3VwX2xvY2soKTsKLQl0b3BfY3B1c2V0LmNwdXNfYWxsb3dlZCA9IGNwdV9vbmxpbmVfbWFwOworCWNwdW1hc2tfY29weSh0b3BfY3B1c2V0LmNwdXNfYWxsb3dlZCwgY3B1X29ubGluZV9tYXNrKTsKIAlzY2FuX2Zvcl9lbXB0eV9jcHVzZXRzKCZ0b3BfY3B1c2V0KTsKIAluZG9tcyA9IGdlbmVyYXRlX3NjaGVkX2RvbWFpbnMoJmRvbXMsICZhdHRyKTsKIAljZ3JvdXBfdW5sb2NrKCk7CkBAIC0yMDQ0LDcgKzIxMDYsNyBAQAogCiB2b2lkIF9faW5pdCBjcHVzZXRfaW5pdF9zbXAodm9pZCkKIHsKLQl0b3BfY3B1c2V0LmNwdXNfYWxsb3dlZCA9IGNwdV9vbmxpbmVfbWFwOworCWNwdW1hc2tfY29weSh0b3BfY3B1c2V0LmNwdXNfYWxsb3dlZCwgY3B1X29ubGluZV9tYXNrKTsKIAl0b3BfY3B1c2V0Lm1lbXNfYWxsb3dlZCA9IG5vZGVfc3RhdGVzW05fSElHSF9NRU1PUlldOwogCiAJaG90Y3B1X25vdGlmaWVyKGNwdXNldF90cmFja19vbmxpbmVfY3B1cywgMCk7CkBAIC0yMDU0LDE1ICsyMTE2LDE1IEBACiAvKioKICAqIGNwdXNldF9jcHVzX2FsbG93ZWQgLSByZXR1cm4gY3B1c19hbGxvd2VkIG1hc2sgZnJvbSBhIHRhc2tzIGNwdXNldC4KICAqIEB0c2s6IHBvaW50ZXIgdG8gdGFza19zdHJ1Y3QgZnJvbSB3aGljaCB0byBvYnRhaW4gY3B1c2V0LT5jcHVzX2FsbG93ZWQuCi0gKiBAcG1hc2s6IHBvaW50ZXIgdG8gY3B1bWFza190IHZhcmlhYmxlIHRvIHJlY2VpdmUgY3B1c19hbGxvd2VkIHNldC4KKyAqIEBwbWFzazogcG9pbnRlciB0byBzdHJ1Y3QgY3B1bWFzayB2YXJpYWJsZSB0byByZWNlaXZlIGNwdXNfYWxsb3dlZCBzZXQuCiAgKgotICogRGVzY3JpcHRpb246IFJldHVybnMgdGhlIGNwdW1hc2tfdCBjcHVzX2FsbG93ZWQgb2YgdGhlIGNwdXNldAorICogRGVzY3JpcHRpb246IFJldHVybnMgdGhlIGNwdW1hc2tfdmFyX3QgY3B1c19hbGxvd2VkIG9mIHRoZSBjcHVzZXQKICAqIGF0dGFjaGVkIHRvIHRoZSBzcGVjaWZpZWQgQHRzay4gIEd1YXJhbnRlZWQgdG8gcmV0dXJuIHNvbWUgbm9uLWVtcHR5CiAgKiBzdWJzZXQgb2YgY3B1X29ubGluZV9tYXAsIGV2ZW4gaWYgdGhpcyBtZWFucyBnb2luZyBvdXRzaWRlIHRoZQogICogdGFza3MgY3B1c2V0LgogICoqLwogCi12b2lkIGNwdXNldF9jcHVzX2FsbG93ZWQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGNwdW1hc2tfdCAqcG1hc2spCit2b2lkIGNwdXNldF9jcHVzX2FsbG93ZWQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBjcHVtYXNrICpwbWFzaykKIHsKIAltdXRleF9sb2NrKCZjYWxsYmFja19tdXRleCk7CiAJY3B1c2V0X2NwdXNfYWxsb3dlZF9sb2NrZWQodHNrLCBwbWFzayk7CkBAIC0yMDczLDcgKzIxMzUsNyBAQAogICogY3B1c2V0X2NwdXNfYWxsb3dlZF9sb2NrZWQgLSByZXR1cm4gY3B1c19hbGxvd2VkIG1hc2sgZnJvbSBhIHRhc2tzIGNwdXNldC4KICAqIE11c3QgYmUgY2FsbGVkIHdpdGggY2FsbGJhY2tfbXV0ZXggaGVsZC4KICAqKi8KLXZvaWQgY3B1c2V0X2NwdXNfYWxsb3dlZF9sb2NrZWQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGNwdW1hc2tfdCAqcG1hc2spCit2b2lkIGNwdXNldF9jcHVzX2FsbG93ZWRfbG9ja2VkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgY3B1bWFzayAqcG1hc2spCiB7CiAJdGFza19sb2NrKHRzayk7CiAJZ3VhcmFudGVlX29ubGluZV9jcHVzKHRhc2tfY3ModHNrKSwgcG1hc2spOwpAQCAtMjM1Niw2ICsyNDE4LDI5IEBACiAJcmV0dXJuIG5vZGVzX2ludGVyc2VjdHModHNrMS0+bWVtc19hbGxvd2VkLCB0c2syLT5tZW1zX2FsbG93ZWQpOwogfQogCisvKioKKyAqIGNwdXNldF9wcmludF90YXNrX21lbXNfYWxsb3dlZCAtIHByaW50cyB0YXNrJ3MgY3B1c2V0IGFuZCBtZW1zX2FsbG93ZWQKKyAqIEB0YXNrOiBwb2ludGVyIHRvIHRhc2tfc3RydWN0IG9mIHNvbWUgdGFzay4KKyAqCisgKiBEZXNjcmlwdGlvbjogUHJpbnRzIEB0YXNrJ3MgbmFtZSwgY3B1c2V0IG5hbWUsIGFuZCBjYWNoZWQgY29weSBvZiBpdHMKKyAqIG1lbXNfYWxsb3dlZCB0byB0aGUga2VybmVsIGxvZy4gIE11c3QgaG9sZCB0YXNrX2xvY2sodGFzaykgdG8gYWxsb3cKKyAqIGRlcmVmZXJlbmNpbmcgdGFza19jcyh0YXNrKS4KKyAqLwordm9pZCBjcHVzZXRfcHJpbnRfdGFza19tZW1zX2FsbG93ZWQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCisJZGVudHJ5ID0gdGFza19jcyh0c2spLT5jc3MuY2dyb3VwLT5kZW50cnk7CisJc3Bpbl9sb2NrKCZjcHVzZXRfYnVmZmVyX2xvY2spOworCXNucHJpbnRmKGNwdXNldF9uYW1lLCBDUFVTRVRfTkFNRV9MRU4sCisJCSBkZW50cnkgPyAoY29uc3QgY2hhciAqKWRlbnRyeS0+ZF9uYW1lLm5hbWUgOiAiLyIpOworCW5vZGVsaXN0X3NjbnByaW50ZihjcHVzZXRfbm9kZWxpc3QsIENQVVNFVF9OT0RFTElTVF9MRU4sCisJCQkgICB0c2stPm1lbXNfYWxsb3dlZCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXMgY3B1c2V0PSVzIG1lbXNfYWxsb3dlZD0lc1xuIiwKKwkgICAgICAgdHNrLT5jb21tLCBjcHVzZXRfbmFtZSwgY3B1c2V0X25vZGVsaXN0KTsKKwlzcGluX3VubG9jaygmY3B1c2V0X2J1ZmZlcl9sb2NrKTsKK30KKwogLyoKICAqIENvbGxlY3Rpb24gb2YgbWVtb3J5X3ByZXNzdXJlIGlzIHN1cHByZXNzZWQgdW5sZXNzCiAgKiB0aGlzIGZsYWcgaXMgZW5hYmxlZCBieSB3cml0aW5nICIxIiB0byB0aGUgc3BlY2lhbApkaWZmIC0tZ2l0IGEva2VybmVsL2RtYS1jb2hlcmVudC5jIGIva2VybmVsL2RtYS1jb2hlcmVudC5jCmluZGV4IGYwMTNhMGMuLjAzODcwNzQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9kbWEtY29oZXJlbnQuYworKysgYi9rZXJuZWwvZG1hLWNvaGVyZW50LmMKQEAgLTEwOSwyMCArMTA5LDQwIEBACiBpbnQgZG1hX2FsbG9jX2Zyb21fY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzc2l6ZV90IHNpemUsCiAJCQkJICAgICAgIGRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsIHZvaWQgKipyZXQpCiB7Ci0Jc3RydWN0IGRtYV9jb2hlcmVudF9tZW0gKm1lbSA9IGRldiA/IGRldi0+ZG1hX21lbSA6IE5VTEw7CisJc3RydWN0IGRtYV9jb2hlcmVudF9tZW0gKm1lbTsKIAlpbnQgb3JkZXIgPSBnZXRfb3JkZXIoc2l6ZSk7CisJaW50IHBhZ2VubzsKIAotCWlmIChtZW0pIHsKLQkJaW50IHBhZ2UgPSBiaXRtYXBfZmluZF9mcmVlX3JlZ2lvbihtZW0tPmJpdG1hcCwgbWVtLT5zaXplLAotCQkJCQkJICAgICBvcmRlcik7Ci0JCWlmIChwYWdlID49IDApIHsKLQkJCSpkbWFfaGFuZGxlID0gbWVtLT5kZXZpY2VfYmFzZSArIChwYWdlIDw8IFBBR0VfU0hJRlQpOwotCQkJKnJldCA9IG1lbS0+dmlydF9iYXNlICsgKHBhZ2UgPDwgUEFHRV9TSElGVCk7Ci0JCQltZW1zZXQoKnJldCwgMCwgc2l6ZSk7Ci0JCX0gZWxzZSBpZiAobWVtLT5mbGFncyAmIERNQV9NRU1PUllfRVhDTFVTSVZFKQotCQkJKnJldCA9IE5VTEw7CisJaWYgKCFkZXYpCisJCXJldHVybiAwOworCW1lbSA9IGRldi0+ZG1hX21lbTsKKwlpZiAoIW1lbSkKKwkJcmV0dXJuIDA7CisJaWYgKHVubGlrZWx5KHNpemUgPiBtZW0tPnNpemUpKQorIAkJcmV0dXJuIDA7CisKKwlwYWdlbm8gPSBiaXRtYXBfZmluZF9mcmVlX3JlZ2lvbihtZW0tPmJpdG1hcCwgbWVtLT5zaXplLCBvcmRlcik7CisJaWYgKHBhZ2VubyA+PSAwKSB7CisJCS8qCisJCSAqIE1lbW9yeSB3YXMgZm91bmQgaW4gdGhlIHBlci1kZXZpY2UgYXJlbmEuCisJCSAqLworCQkqZG1hX2hhbmRsZSA9IG1lbS0+ZGV2aWNlX2Jhc2UgKyAocGFnZW5vIDw8IFBBR0VfU0hJRlQpOworCQkqcmV0ID0gbWVtLT52aXJ0X2Jhc2UgKyAocGFnZW5vIDw8IFBBR0VfU0hJRlQpOworCQltZW1zZXQoKnJldCwgMCwgc2l6ZSk7CisJfSBlbHNlIGlmIChtZW0tPmZsYWdzICYgRE1BX01FTU9SWV9FWENMVVNJVkUpIHsKKwkJLyoKKwkJICogVGhlIHBlci1kZXZpY2UgYXJlbmEgaXMgZXhoYXVzdGVkIGFuZCB3ZSBhcmUgbm90CisJCSAqIHBlcm1pdHRlZCB0byBmYWxsIGJhY2sgdG8gZ2VuZXJpYyBtZW1vcnkuCisJCSAqLworCQkqcmV0ID0gTlVMTDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBUaGUgcGVyLWRldmljZSBhcmVuYSBpcyBleGhhdXN0ZWQgYW5kIHdlIGFyZQorCQkgKiBwZXJtaXR0ZWQgdG8gZmFsbCBiYWNrIHRvIGdlbmVyaWMgbWVtb3J5LgorCQkgKi8KKwkJIHJldHVybiAwOwogCX0KLQlyZXR1cm4gKG1lbSAhPSBOVUxMKTsKKwlyZXR1cm4gMTsKIH0KIEVYUE9SVF9TWU1CT0woZG1hX2FsbG9jX2Zyb21fY29oZXJlbnQpOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvZXhpdC5jIGIva2VybmVsL2V4aXQuYwppbmRleCBjOWU1YTFjLi5jNzc0MGZhIDEwMDY0NAotLS0gYS9rZXJuZWwvZXhpdC5jCisrKyBiL2tlcm5lbC9leGl0LmMKQEAgLTY0MiwzNSArNjQyLDMxIEBACiAJLyoKIAkgKiBXZSBmb3VuZCBubyBvd25lciB5ZXQgbW1fdXNlcnMgPiAxOiB0aGlzIGltcGxpZXMgdGhhdCB3ZSBhcmUKIAkgKiBtb3N0IGxpa2VseSByYWNpbmcgd2l0aCBzd2Fwb2ZmICh0cnlfdG9fdW51c2UoKSkgb3IgL3Byb2Mgb3IKLQkgKiBwdHJhY2Ugb3IgcGFnZSBtaWdyYXRpb24gKGdldF90YXNrX21tKCkpLiAgTWFyayBvd25lciBhcyBOVUxMLAotCSAqIHNvIHRoYXQgc3Vic3lzdGVtcyBjYW4gdW5kZXJzdGFuZCB0aGUgY2FsbGJhY2sgYW5kIHRha2UgYWN0aW9uLgorCSAqIHB0cmFjZSBvciBwYWdlIG1pZ3JhdGlvbiAoZ2V0X3Rhc2tfbW0oKSkuICBNYXJrIG93bmVyIGFzIE5VTEwuCiAJICovCi0JZG93bl93cml0ZSgmbW0tPm1tYXBfc2VtKTsKLQljZ3JvdXBfbW1fb3duZXJfY2FsbGJhY2tzKG1tLT5vd25lciwgTlVMTCk7CiAJbW0tPm93bmVyID0gTlVMTDsKLQl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKIAlyZXR1cm47CiAKIGFzc2lnbl9uZXdfb3duZXI6CiAJQlVHX09OKGMgPT0gcCk7CiAJZ2V0X3Rhc2tfc3RydWN0KGMpOwotCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQlkb3duX3dyaXRlKCZtbS0+bW1hcF9zZW0pOwogCS8qCiAJICogVGhlIHRhc2tfbG9jayBwcm90ZWN0cyBjLT5tbSBmcm9tIGNoYW5naW5nLgogCSAqIFdlIGFsd2F5cyB3YW50IG1tLT5vd25lci0+bW0gPT0gbW0KIAkgKi8KIAl0YXNrX2xvY2soYyk7CisJLyoKKwkgKiBEZWxheSByZWFkX3VubG9jaygpIHRpbGwgd2UgaGF2ZSB0aGUgdGFza19sb2NrKCkKKwkgKiB0byBlbnN1cmUgdGhhdCBjIGRvZXMgbm90IHNsaXAgYXdheSB1bmRlcm5lYXRoIHVzCisJICovCisJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwogCWlmIChjLT5tbSAhPSBtbSkgewogCQl0YXNrX3VubG9jayhjKTsKLQkJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CiAJCXB1dF90YXNrX3N0cnVjdChjKTsKIAkJZ290byByZXRyeTsKIAl9Ci0JY2dyb3VwX21tX293bmVyX2NhbGxiYWNrcyhtbS0+b3duZXIsIGMpOwogCW1tLT5vd25lciA9IGM7CiAJdGFza191bmxvY2soYyk7Ci0JdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CiAJcHV0X3Rhc2tfc3RydWN0KGMpOwogfQogI2VuZGlmIC8qIENPTkZJR19NTV9PV05FUiAqLwpAQCAtMTA1NSwxMCArMTA1MSw3IEBACiAJCQkJcHJlZW1wdF9jb3VudCgpKTsKIAogCWFjY3RfdXBkYXRlX2ludGVncmFscyh0c2spOwotCWlmICh0c2stPm1tKSB7Ci0JCXVwZGF0ZV9oaXdhdGVyX3Jzcyh0c2stPm1tKTsKLQkJdXBkYXRlX2hpd2F0ZXJfdm0odHNrLT5tbSk7Ci0JfQorCiAJZ3JvdXBfZGVhZCA9IGF0b21pY19kZWNfYW5kX3Rlc3QoJnRzay0+c2lnbmFsLT5saXZlKTsKIAlpZiAoZ3JvdXBfZGVhZCkgewogCQlocnRpbWVyX2NhbmNlbCgmdHNrLT5zaWduYWwtPnJlYWxfdGltZXIpOwpkaWZmIC0tZ2l0IGEva2VybmVsL2ZvcmsuYyBiL2tlcm5lbC9mb3JrLmMKaW5kZXggNDNjYmYzMC4uNDAxODMwOCAxMDA2NDQKLS0tIGEva2VybmVsL2ZvcmsuYworKysgYi9rZXJuZWwvZm9yay5jCkBAIC00MDAsNiArNDAwLDE4IEBACiAjZGVmaW5lIGFsbG9jYXRlX21tKCkJKGttZW1fY2FjaGVfYWxsb2MobW1fY2FjaGVwLCBHRlBfS0VSTkVMKSkKICNkZWZpbmUgZnJlZV9tbShtbSkJKGttZW1fY2FjaGVfZnJlZShtbV9jYWNoZXAsIChtbSkpKQogCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkZWZhdWx0X2R1bXBfZmlsdGVyID0gTU1GX0RVTVBfRklMVEVSX0RFRkFVTFQ7CisKK3N0YXRpYyBpbnQgX19pbml0IGNvcmVkdW1wX2ZpbHRlcl9zZXR1cChjaGFyICpzKQoreworCWRlZmF1bHRfZHVtcF9maWx0ZXIgPQorCQkoc2ltcGxlX3N0cnRvdWwocywgTlVMTCwgMCkgPDwgTU1GX0RVTVBfRklMVEVSX1NISUZUKSAmCisJCU1NRl9EVU1QX0ZJTFRFUl9NQVNLOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJjb3JlZHVtcF9maWx0ZXI9IiwgY29yZWR1bXBfZmlsdGVyX3NldHVwKTsKKwogI2luY2x1ZGUgPGxpbnV4L2luaXRfdGFzay5oPgogCiBzdGF0aWMgc3RydWN0IG1tX3N0cnVjdCAqIG1tX2luaXQoc3RydWN0IG1tX3N0cnVjdCAqIG1tLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCkBAIC00MDgsOCArNDIwLDcgQEAKIAlhdG9taWNfc2V0KCZtbS0+bW1fY291bnQsIDEpOwogCWluaXRfcndzZW0oJm1tLT5tbWFwX3NlbSk7CiAJSU5JVF9MSVNUX0hFQUQoJm1tLT5tbWxpc3QpOwotCW1tLT5mbGFncyA9IChjdXJyZW50LT5tbSkgPyBjdXJyZW50LT5tbS0+ZmxhZ3MKLQkJCQkgIDogTU1GX0RVTVBfRklMVEVSX0RFRkFVTFQ7CisJbW0tPmZsYWdzID0gKGN1cnJlbnQtPm1tKSA/IGN1cnJlbnQtPm1tLT5mbGFncyA6IGRlZmF1bHRfZHVtcF9maWx0ZXI7CiAJbW0tPmNvcmVfc3RhdGUgPSBOVUxMOwogCW1tLT5ucl9wdGVzID0gMDsKIAlzZXRfbW1fY291bnRlcihtbSwgZmlsZV9yc3MsIDApOwpAQCAtNzU4LDcgKzc2OSw3IEBACiB7CiAJc3RydWN0IHNpZ2hhbmRfc3RydWN0ICpzaWc7CiAKLQlpZiAoY2xvbmVfZmxhZ3MgJiAoQ0xPTkVfU0lHSEFORCB8IENMT05FX1RIUkVBRCkpIHsKKwlpZiAoY2xvbmVfZmxhZ3MgJiBDTE9ORV9TSUdIQU5EKSB7CiAJCWF0b21pY19pbmMoJmN1cnJlbnQtPnNpZ2hhbmQtPmNvdW50KTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMTExNSwxMiArMTEyNiwxMiBAQAogCiAJaWYgKHBpZCAhPSAmaW5pdF9zdHJ1Y3RfcGlkKSB7CiAJCXJldHZhbCA9IC1FTk9NRU07Ci0JCXBpZCA9IGFsbG9jX3BpZCh0YXNrX2FjdGl2ZV9waWRfbnMocCkpOworCQlwaWQgPSBhbGxvY19waWQocC0+bnNwcm94eS0+cGlkX25zKTsKIAkJaWYgKCFwaWQpCiAJCQlnb3RvIGJhZF9mb3JrX2NsZWFudXBfaW87CiAKIAkJaWYgKGNsb25lX2ZsYWdzICYgQ0xPTkVfTkVXUElEKSB7Ci0JCQlyZXR2YWwgPSBwaWRfbnNfcHJlcGFyZV9wcm9jKHRhc2tfYWN0aXZlX3BpZF9ucyhwKSk7CisJCQlyZXR2YWwgPSBwaWRfbnNfcHJlcGFyZV9wcm9jKHAtPm5zcHJveHktPnBpZF9ucyk7CiAJCQlpZiAocmV0dmFsIDwgMCkKIAkJCQlnb3RvIGJhZF9mb3JrX2ZyZWVfcGlkOwogCQl9CmRpZmYgLS1naXQgYS9rZXJuZWwvZnV0ZXguYyBiL2tlcm5lbC9mdXRleC5jCmluZGV4IDdjNmNiYWIuLjAwMmFhMTggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9mdXRleC5jCisrKyBiL2tlcm5lbC9mdXRleC5jCkBAIC0xNzAsOCArMTcwLDExIEBACiAgKi8KIHN0YXRpYyB2b2lkIGRyb3BfZnV0ZXhfa2V5X3JlZnModW5pb24gZnV0ZXhfa2V5ICprZXkpCiB7Ci0JaWYgKCFrZXktPmJvdGgucHRyKQorCWlmICgha2V5LT5ib3RoLnB0cikgeworCQkvKiBJZiB3ZSdyZSBoZXJlIHRoZW4gd2UgdHJpZWQgdG8gcHV0IGEga2V5IHdlIGZhaWxlZCB0byBnZXQgKi8KKwkJV0FSTl9PTl9PTkNFKDEpOwogCQlyZXR1cm47CisJfQogCiAJc3dpdGNoIChrZXktPmJvdGgub2Zmc2V0ICYgKEZVVF9PRkZfSU5PREV8RlVUX09GRl9NTVNIQVJFRCkpIHsKIAljYXNlIEZVVF9PRkZfSU5PREU6CkBAIC03MzAsOCArNzMzLDggQEAKIAl9CiAKIAlzcGluX3VubG9jaygmaGItPmxvY2spOwotb3V0OgogCXB1dF9mdXRleF9rZXkoZnNoYXJlZCwgJmtleSk7CitvdXQ6CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNzU1LDcgKzc1OCw3IEBACiAJCWdvdG8gb3V0OwogCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIyLCBmc2hhcmVkLCAma2V5Mik7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X3B1dF9rZXkxOwogCiAJaGIxID0gaGFzaF9mdXRleCgma2V5MSk7CiAJaGIyID0gaGFzaF9mdXRleCgma2V5Mik7CkBAIC03NzcsMTIgKzc4MCwxMiBAQAogCQkgKiBidXQgd2UgbWlnaHQgZ2V0IHRoZW0gZnJvbSByYW5nZSBjaGVja2luZwogCQkgKi8KIAkJcmV0ID0gb3BfcmV0OwotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfcHV0X2tleXM7CiAjZW5kaWYKIAogCQlpZiAodW5saWtlbHkob3BfcmV0ICE9IC1FRkFVTFQpKSB7CiAJCQlyZXQgPSBvcF9yZXQ7Ci0JCQlnb3RvIG91dDsKKwkJCWdvdG8gb3V0X3B1dF9rZXlzOwogCQl9CiAKIAkJLyoKQEAgLTc5Niw3ICs3OTksNyBAQAogCQkJcmV0ID0gZnV0ZXhfaGFuZGxlX2ZhdWx0KCh1bnNpZ25lZCBsb25nKXVhZGRyMiwKIAkJCQkJCSBhdHRlbXB0KTsKIAkJCWlmIChyZXQpCi0JCQkJZ290byBvdXQ7CisJCQkJZ290byBvdXRfcHV0X2tleXM7CiAJCQlnb3RvIHJldHJ5OwogCQl9CiAKQEAgLTgzNCwxMCArODM3LDExIEBACiAJc3Bpbl91bmxvY2soJmhiMS0+bG9jayk7CiAJaWYgKGhiMSAhPSBoYjIpCiAJCXNwaW5fdW5sb2NrKCZoYjItPmxvY2spOwotb3V0Ogorb3V0X3B1dF9rZXlzOgogCXB1dF9mdXRleF9rZXkoZnNoYXJlZCwgJmtleTIpOworb3V0X3B1dF9rZXkxOgogCXB1dF9mdXRleF9rZXkoZnNoYXJlZCwgJmtleTEpOwotCitvdXQ6CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtODU0LDEzICs4NTgsMTMgQEAKIAlzdHJ1Y3QgZnV0ZXhfcSAqdGhpcywgKm5leHQ7CiAJaW50IHJldCwgZHJvcF9jb3VudCA9IDA7CiAKLSByZXRyeToKK3JldHJ5OgogCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIxLCBmc2hhcmVkLCAma2V5MSk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKIAkJZ290byBvdXQ7CiAJcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkcjIsIGZzaGFyZWQsICZrZXkyKTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKQotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfcHV0X2tleTE7CiAKIAloYjEgPSBoYXNoX2Z1dGV4KCZrZXkxKTsKIAloYjIgPSBoYXNoX2Z1dGV4KCZrZXkyKTsKQEAgLTg4Miw3ICs4ODYsNyBAQAogCQkJaWYgKCFyZXQpCiAJCQkJZ290byByZXRyeTsKIAotCQkJcmV0dXJuIHJldDsKKwkJCWdvdG8gb3V0X3B1dF9rZXlzOwogCQl9CiAJCWlmIChjdXJ2YWwgIT0gKmNtcHZhbCkgewogCQkJcmV0ID0gLUVBR0FJTjsKQEAgLTkyNyw5ICs5MzEsMTEgQEAKIAl3aGlsZSAoLS1kcm9wX2NvdW50ID49IDApCiAJCWRyb3BfZnV0ZXhfa2V5X3JlZnMoJmtleTEpOwogCi1vdXQ6CitvdXRfcHV0X2tleXM6CiAJcHV0X2Z1dGV4X2tleShmc2hhcmVkLCAma2V5Mik7CitvdXRfcHV0X2tleTE6CiAJcHV0X2Z1dGV4X2tleShmc2hhcmVkLCAma2V5MSk7CitvdXQ6CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtOTkwLDcgKzk5Niw3IEBACiAJaW50IHJldCA9IDA7CiAKIAkvKiBJbiB0aGUgY29tbW9uIGNhc2Ugd2UgZG9uJ3QgdGFrZSB0aGUgc3BpbmxvY2ssIHdoaWNoIGlzIG5pY2UuICovCi0gcmV0cnk6CityZXRyeToKIAlsb2NrX3B0ciA9IHEtPmxvY2tfcHRyOwogCWJhcnJpZXIoKTsKIAlpZiAobG9ja19wdHIgIT0gTlVMTCkgewpAQCAtMTE3MiwxMSArMTE3OCwxMSBAQAogCiAJcS5waV9zdGF0ZSA9IE5VTEw7CiAJcS5iaXRzZXQgPSBiaXRzZXQ7Ci0gcmV0cnk6CityZXRyeToKIAlxLmtleSA9IEZVVEVYX0tFWV9JTklUOwogCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIsIGZzaGFyZWQsICZxLmtleSk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKLQkJZ290byBvdXRfcmVsZWFzZV9zZW07CisJCWdvdG8gb3V0OwogCiAJaGIgPSBxdWV1ZV9sb2NrKCZxKTsKIApAQCAtMTIwNCw2ICsxMjEwLDcgQEAKIAogCWlmICh1bmxpa2VseShyZXQpKSB7CiAJCXF1ZXVlX3VubG9jaygmcSwgaGIpOworCQlwdXRfZnV0ZXhfa2V5KGZzaGFyZWQsICZxLmtleSk7CiAKIAkJcmV0ID0gZ2V0X3VzZXIodXZhbCwgdWFkZHIpOwogCkBAIC0xMjEzLDcgKzEyMjAsNyBAQAogCX0KIAlyZXQgPSAtRVdPVUxEQkxPQ0s7CiAJaWYgKHV2YWwgIT0gdmFsKQotCQlnb3RvIG91dF91bmxvY2tfcmVsZWFzZV9zZW07CisJCWdvdG8gb3V0X3VubG9ja19wdXRfa2V5OwogCiAJLyogT25seSBhY3R1YWxseSBxdWV1ZSBpZiAqdWFkZHIgY29udGFpbmVkIHZhbC4gICovCiAJcXVldWVfbWUoJnEsIGhiKTsKQEAgLTEzMDUsMTEgKzEzMTIsMTEgQEAKIAkJcmV0dXJuIC1FUkVTVEFSVF9SRVNUQVJUQkxPQ0s7CiAJfQogCi0gb3V0X3VubG9ja19yZWxlYXNlX3NlbToKK291dF91bmxvY2tfcHV0X2tleToKIAlxdWV1ZV91bmxvY2soJnEsIGhiKTsKLQotIG91dF9yZWxlYXNlX3NlbToKIAlwdXRfZnV0ZXhfa2V5KGZzaGFyZWQsICZxLmtleSk7CisKK291dDoKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMzU4LDE2ICsxMzY1LDE2IEBACiAJfQogCiAJcS5waV9zdGF0ZSA9IE5VTEw7Ci0gcmV0cnk6CityZXRyeToKIAlxLmtleSA9IEZVVEVYX0tFWV9JTklUOwogCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIsIGZzaGFyZWQsICZxLmtleSk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKLQkJZ290byBvdXRfcmVsZWFzZV9zZW07CisJCWdvdG8gb3V0OwogCi0gcmV0cnlfdW5sb2NrZWQ6CityZXRyeV91bmxvY2tlZDoKIAloYiA9IHF1ZXVlX2xvY2soJnEpOwogCi0gcmV0cnlfbG9ja2VkOgorcmV0cnlfbG9ja2VkOgogCXJldCA9IGxvY2tfdGFrZW4gPSAwOwogCiAJLyoKQEAgLTEzODgsMTQgKzEzOTUsMTQgQEAKIAkgKi8KIAlpZiAodW5saWtlbHkoKGN1cnZhbCAmIEZVVEVYX1RJRF9NQVNLKSA9PSB0YXNrX3BpZF92bnIoY3VycmVudCkpKSB7CiAJCXJldCA9IC1FREVBRExLOwotCQlnb3RvIG91dF91bmxvY2tfcmVsZWFzZV9zZW07CisJCWdvdG8gb3V0X3VubG9ja19wdXRfa2V5OwogCX0KIAogCS8qCiAJICogU3VycHJpc2UgLSB3ZSBnb3QgdGhlIGxvY2suIEp1c3QgcmV0dXJuIHRvIHVzZXJzcGFjZToKIAkgKi8KIAlpZiAodW5saWtlbHkoIWN1cnZhbCkpCi0JCWdvdG8gb3V0X3VubG9ja19yZWxlYXNlX3NlbTsKKwkJZ290byBvdXRfdW5sb2NrX3B1dF9rZXk7CiAKIAl1dmFsID0gY3VydmFsOwogCkBAIC0xNDMxLDcgKzE0MzgsNyBAQAogCSAqIFdlIHRvb2sgdGhlIGxvY2sgZHVlIHRvIG93bmVyIGRpZWQgdGFrZSBvdmVyLgogCSAqLwogCWlmICh1bmxpa2VseShsb2NrX3Rha2VuKSkKLQkJZ290byBvdXRfdW5sb2NrX3JlbGVhc2Vfc2VtOworCQlnb3RvIG91dF91bmxvY2tfcHV0X2tleTsKIAogCS8qCiAJICogV2UgZG9udCBoYXZlIHRoZSBsb2NrLiBMb29rIHVwIHRoZSBQSSBzdGF0ZSAob3IgY3JlYXRlIGl0IGlmCkBAIC0xNDcwLDcgKzE0NzcsNyBAQAogCQkJCWdvdG8gcmV0cnlfbG9ja2VkOwogCQkJfQogCQlkZWZhdWx0OgotCQkJZ290byBvdXRfdW5sb2NrX3JlbGVhc2Vfc2VtOworCQkJZ290byBvdXRfdW5sb2NrX3B1dF9rZXk7CiAJCX0KIAl9CiAKQEAgLTE1NjEsMTYgKzE1NjgsMTcgQEAKIAkJZGVzdHJveV9ocnRpbWVyX29uX3N0YWNrKCZ0by0+dGltZXIpOwogCXJldHVybiByZXQgIT0gLUVJTlRSID8gcmV0IDogLUVSRVNUQVJUTk9JTlRSOwogCi0gb3V0X3VubG9ja19yZWxlYXNlX3NlbToKK291dF91bmxvY2tfcHV0X2tleToKIAlxdWV1ZV91bmxvY2soJnEsIGhiKTsKIAotIG91dF9yZWxlYXNlX3NlbToKK291dF9wdXRfa2V5OgogCXB1dF9mdXRleF9rZXkoZnNoYXJlZCwgJnEua2V5KTsKK291dDoKIAlpZiAodG8pCiAJCWRlc3Ryb3lfaHJ0aW1lcl9vbl9zdGFjaygmdG8tPnRpbWVyKTsKIAlyZXR1cm4gcmV0OwogCi0gdWFkZHJfZmF1bHRlZDoKK3VhZGRyX2ZhdWx0ZWQ6CiAJLyoKIAkgKiBXZSBoYXZlIHRvIHIvdyAgKihpbnQgX191c2VyICopdWFkZHIsIGFuZCB3ZSBoYXZlIHRvIG1vZGlmeSBpdAogCSAqIGF0b21pY2FsbHkuICBUaGVyZWZvcmUsIGlmIHdlIGNvbnRpbnVlIHRvIGZhdWx0IGFmdGVyIGdldF91c2VyKCkKQEAgLTE1ODMsNyArMTU5MSw3IEBACiAJaWYgKGF0dGVtcHQrKykgewogCQlyZXQgPSBmdXRleF9oYW5kbGVfZmF1bHQoKHVuc2lnbmVkIGxvbmcpdWFkZHIsIGF0dGVtcHQpOwogCQlpZiAocmV0KQotCQkJZ290byBvdXRfcmVsZWFzZV9zZW07CisJCQlnb3RvIG91dF9wdXRfa2V5OwogCQlnb3RvIHJldHJ5X3VubG9ja2VkOwogCX0KIApAQCAtMTY3NSw5ICsxNjgzLDkgQEAKIAogb3V0X3VubG9jazoKIAlzcGluX3VubG9jaygmaGItPmxvY2spOwotb3V0OgogCXB1dF9mdXRleF9rZXkoZnNoYXJlZCwgJmtleSk7CiAKK291dDoKIAlyZXR1cm4gcmV0OwogCiBwaV9mYXVsdGVkOgpkaWZmIC0tZ2l0IGEva2VybmVsL2hydGltZXIuYyBiL2tlcm5lbC9ocnRpbWVyLmMKaW5kZXggZWIyYmZlZi4uMTQ1NWI3NiAxMDA2NDQKLS0tIGEva2VybmVsL2hydGltZXIuYworKysgYi9rZXJuZWwvaHJ0aW1lci5jCkBAIC02MzQsNyArNjM0LDYgQEAKIHsKIH0KIAotc3RhdGljIHZvaWQgX19ydW5faHJ0aW1lcihzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpOwogCiAvKgogICogV2hlbiBIaWdoIHJlc29sdXRpb24gdGltZXJzIGFyZSBhY3RpdmUsIHRyeSB0byByZXByb2dyYW0uIE5vdGUsIHRoYXQgaW4gY2FzZQpAQCAtNjQ2LDEzICs2NDUsOSBAQAogCQkJCQkgICAgc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSAqYmFzZSkKIHsKIAlpZiAoYmFzZS0+Y3B1X2Jhc2UtPmhyZXNfYWN0aXZlICYmIGhydGltZXJfcmVwcm9ncmFtKHRpbWVyLCBiYXNlKSkgewotCQkvKgotCQkgKiBYWFg6IHJlY3Vyc2lvbiBjaGVjaz8KLQkJICogaHJ0aW1lcl9mb3J3YXJkKCkgc2hvdWxkIHJvdW5kIHVwIHdpdGggdGltZXIgZ3JhbnVsYXJpdHkKLQkJICogc28gdGhhdCB3ZSBuZXZlciBnZXQgaW50byBpbmYgcmVjdXJzaW9uIGhlcmUsCi0JCSAqIGl0IGRvZXNuJ3QgZG8gdGhhdCB0aG91Z2gKLQkJICovCi0JCV9fcnVuX2hydGltZXIodGltZXIpOworCQlzcGluX3VubG9jaygmYmFzZS0+Y3B1X2Jhc2UtPmxvY2spOworCQlyYWlzZV9zb2Z0aXJxX2lycW9mZihIUlRJTUVSX1NPRlRJUlEpOworCQlzcGluX2xvY2soJmJhc2UtPmNwdV9iYXNlLT5sb2NrKTsKIAkJcmV0dXJuIDE7CiAJfQogCXJldHVybiAwOwpAQCAtNzA1LDExICs3MDAsNiBAQAogfQogc3RhdGljIGlubGluZSB2b2lkIGhydGltZXJfaW5pdF9ocmVzKHN0cnVjdCBocnRpbWVyX2NwdV9iYXNlICpiYXNlKSB7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBocnRpbWVyX2luaXRfdGltZXJfaHJlcyhzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpIHsgfQotc3RhdGljIGlubGluZSBpbnQgaHJ0aW1lcl9yZXByb2dyYW0oc3RydWN0IGhydGltZXIgKnRpbWVyLAotCQkJCSAgICBzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpiYXNlKQotewotCXJldHVybiAwOwotfQogCiAjZW5kaWYgLyogQ09ORklHX0hJR0hfUkVTX1RJTUVSUyAqLwogCkBAIC03ODAsOSArNzcwLDExIEBACiAgKgogICogVGhlIHRpbWVyIGlzIGluc2VydGVkIGluIGV4cGlyeSBvcmRlci4gSW5zZXJ0aW9uIGludG8gdGhlCiAgKiByZWQgYmxhY2sgdHJlZSBpcyBPKGxvZyhuKSkuIE11c3QgaG9sZCB0aGUgYmFzZSBsb2NrLgorICoKKyAqIFJldHVybnMgMSB3aGVuIHRoZSBuZXcgdGltZXIgaXMgdGhlIGxlZnRtb3N0IHRpbWVyIGluIHRoZSB0cmVlLgogICovCi1zdGF0aWMgdm9pZCBlbnF1ZXVlX2hydGltZXIoc3RydWN0IGhydGltZXIgKnRpbWVyLAotCQkJICAgIHN0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2UgKmJhc2UsIGludCByZXByb2dyYW0pCitzdGF0aWMgaW50IGVucXVldWVfaHJ0aW1lcihzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsCisJCQkgICBzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpiYXNlKQogewogCXN0cnVjdCByYl9ub2RlICoqbGluayA9ICZiYXNlLT5hY3RpdmUucmJfbm9kZTsKIAlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKQEAgLTgxNCwyMCArODA2LDggQEAKIAkgKiBJbnNlcnQgdGhlIHRpbWVyIHRvIHRoZSByYnRyZWUgYW5kIGNoZWNrIHdoZXRoZXIgaXQKIAkgKiByZXBsYWNlcyB0aGUgZmlyc3QgcGVuZGluZyB0aW1lcgogCSAqLwotCWlmIChsZWZ0bW9zdCkgewotCQkvKgotCQkgKiBSZXByb2dyYW0gdGhlIGNsb2NrIGV2ZW50IGRldmljZS4gV2hlbiB0aGUgdGltZXIgaXMgYWxyZWFkeQotCQkgKiBleHBpcmVkIGhydGltZXJfZW5xdWV1ZV9yZXByb2dyYW0gaGFzIGVpdGhlciBjYWxsZWQgdGhlCi0JCSAqIGNhbGxiYWNrIG9yIGFkZGVkIGl0IHRvIHRoZSBwZW5kaW5nIGxpc3QgYW5kIHJhaXNlZCB0aGUKLQkJICogc29mdGlycS4KLQkJICoKLQkJICogVGhpcyBpcyBhIE5PUCBmb3IgIUhJR0hSRVMKLQkJICovCi0JCWlmIChyZXByb2dyYW0gJiYgaHJ0aW1lcl9lbnF1ZXVlX3JlcHJvZ3JhbSh0aW1lciwgYmFzZSkpCi0JCQlyZXR1cm47Ci0KKwlpZiAobGVmdG1vc3QpCiAJCWJhc2UtPmZpcnN0ID0gJnRpbWVyLT5ub2RlOwotCX0KIAogCXJiX2xpbmtfbm9kZSgmdGltZXItPm5vZGUsIHBhcmVudCwgbGluayk7CiAJcmJfaW5zZXJ0X2NvbG9yKCZ0aW1lci0+bm9kZSwgJmJhc2UtPmFjdGl2ZSk7CkBAIC04MzYsNiArODE2LDggQEAKIAkgKiBzdGF0ZSBvZiBhIHBvc3NpYmx5IHJ1bm5pbmcgY2FsbGJhY2suCiAJICovCiAJdGltZXItPnN0YXRlIHw9IEhSVElNRVJfU1RBVEVfRU5RVUVVRUQ7CisKKwlyZXR1cm4gbGVmdG1vc3Q7CiB9CiAKIC8qCkBAIC05MTIsNyArODk0LDcgQEAKIHsKIAlzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpiYXNlLCAqbmV3X2Jhc2U7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0OworCWludCByZXQsIGxlZnRtb3N0OwogCiAJYmFzZSA9IGxvY2tfaHJ0aW1lcl9iYXNlKHRpbWVyLCAmZmxhZ3MpOwogCkBAIC05NDAsMTIgKzkyMiwxNiBAQAogCiAJdGltZXJfc3RhdHNfaHJ0aW1lcl9zZXRfc3RhcnRfaW5mbyh0aW1lcik7CiAKKwlsZWZ0bW9zdCA9IGVucXVldWVfaHJ0aW1lcih0aW1lciwgbmV3X2Jhc2UpOworCiAJLyoKIAkgKiBPbmx5IGFsbG93IHJlcHJvZ3JhbW1pbmcgaWYgdGhlIG5ldyBiYXNlIGlzIG9uIHRoaXMgQ1BVLgogCSAqIChpdCBtaWdodCBzdGlsbCBiZSBvbiBhbm90aGVyIENQVSBpZiB0aGUgdGltZXIgd2FzIHBlbmRpbmcpCisJICoKKwkgKiBYWFggc2VuZF9yZW1vdGVfc29mdGlycSgpID8KIAkgKi8KLQllbnF1ZXVlX2hydGltZXIodGltZXIsIG5ld19iYXNlLAotCQkJbmV3X2Jhc2UtPmNwdV9iYXNlID09ICZfX2dldF9jcHVfdmFyKGhydGltZXJfYmFzZXMpKTsKKwlpZiAobGVmdG1vc3QgJiYgbmV3X2Jhc2UtPmNwdV9iYXNlID09ICZfX2dldF9jcHVfdmFyKGhydGltZXJfYmFzZXMpKQorCQlocnRpbWVyX2VucXVldWVfcmVwcm9ncmFtKHRpbWVyLCBuZXdfYmFzZSk7CiAKIAl1bmxvY2tfaHJ0aW1lcl9iYXNlKHRpbWVyLCAmZmxhZ3MpOwogCkBAIC0xMTU3LDEzICsxMTQzLDEzIEBACiAJc3Bpbl9sb2NrKCZjcHVfYmFzZS0+bG9jayk7CiAKIAkvKgotCSAqIE5vdGU6IFdlIGNsZWFyIHRoZSBDQUxMQkFDSyBiaXQgYWZ0ZXIgZW5xdWV1ZV9ocnRpbWVyIHRvIGF2b2lkCi0JICogcmVwcm9ncmFtbWluZyBvZiB0aGUgZXZlbnQgaGFyZHdhcmUuIFRoaXMgaGFwcGVucyBhdCB0aGUgZW5kIG9mIHRoaXMKLQkgKiBmdW5jdGlvbiBhbnl3YXkuCisJICogTm90ZTogV2UgY2xlYXIgdGhlIENBTExCQUNLIGJpdCBhZnRlciBlbnF1ZXVlX2hydGltZXIgYW5kCisJICogd2UgZG8gbm90IHJlcHJvZ3JhbW0gdGhlIGV2ZW50IGhhcmR3YXJlLiBIYXBwZW5zIGVpdGhlciBpbgorCSAqIGhydGltZXJfc3RhcnRfcmFuZ2VfbnMoKSBvciBpbiBocnRpbWVyX2ludGVycnVwdCgpCiAJICovCiAJaWYgKHJlc3RhcnQgIT0gSFJUSU1FUl9OT1JFU1RBUlQpIHsKIAkJQlVHX09OKHRpbWVyLT5zdGF0ZSAhPSBIUlRJTUVSX1NUQVRFX0NBTExCQUNLKTsKLQkJZW5xdWV1ZV9ocnRpbWVyKHRpbWVyLCBiYXNlLCAwKTsKKwkJZW5xdWV1ZV9ocnRpbWVyKHRpbWVyLCBiYXNlKTsKIAl9CiAJdGltZXItPnN0YXRlICY9IH5IUlRJTUVSX1NUQVRFX0NBTExCQUNLOwogfQpAQCAtMTI0Myw2ICsxMjI5LDIyIEBACiAJfQogfQogCisvKgorICogbG9jYWwgdmVyc2lvbiBvZiBocnRpbWVyX3BlZWtfYWhlYWRfdGltZXJzKCkgY2FsbGVkIHdpdGggaW50ZXJydXB0cworICogZGlzYWJsZWQuCisgKi8KK3N0YXRpYyB2b2lkIF9faHJ0aW1lcl9wZWVrX2FoZWFkX3RpbWVycyh2b2lkKQoreworCXN0cnVjdCB0aWNrX2RldmljZSAqdGQ7CisKKwlpZiAoIWhydGltZXJfaHJlc19hY3RpdmUoKSkKKwkJcmV0dXJuOworCisJdGQgPSAmX19nZXRfY3B1X3Zhcih0aWNrX2NwdV9kZXZpY2UpOworCWlmICh0ZCAmJiB0ZC0+ZXZ0ZGV2KQorCQlocnRpbWVyX2ludGVycnVwdCh0ZC0+ZXZ0ZGV2KTsKK30KKwogLyoqCiAgKiBocnRpbWVyX3BlZWtfYWhlYWRfdGltZXJzIC0tIHJ1biBzb2Z0LWV4cGlyZWQgdGltZXJzIG5vdwogICoKQEAgLTEyNTQsMjAgKzEyNTYsMjMgQEAKICAqLwogdm9pZCBocnRpbWVyX3BlZWtfYWhlYWRfdGltZXJzKHZvaWQpCiB7Ci0Jc3RydWN0IHRpY2tfZGV2aWNlICp0ZDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKCFocnRpbWVyX2hyZXNfYWN0aXZlKCkpCi0JCXJldHVybjsKLQogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQl0ZCA9ICZfX2dldF9jcHVfdmFyKHRpY2tfY3B1X2RldmljZSk7Ci0JaWYgKHRkICYmIHRkLT5ldnRkZXYpCi0JCWhydGltZXJfaW50ZXJydXB0KHRkLT5ldnRkZXYpOworCV9faHJ0aW1lcl9wZWVrX2FoZWFkX3RpbWVycygpOwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAotI2VuZGlmCS8qIENPTkZJR19ISUdIX1JFU19USU1FUlMgKi8KK3N0YXRpYyB2b2lkIHJ1bl9ocnRpbWVyX3NvZnRpcnEoc3RydWN0IHNvZnRpcnFfYWN0aW9uICpoKQoreworCWhydGltZXJfcGVla19haGVhZF90aW1lcnMoKTsKK30KKworI2Vsc2UgLyogQ09ORklHX0hJR0hfUkVTX1RJTUVSUyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgX19ocnRpbWVyX3BlZWtfYWhlYWRfdGltZXJzKHZvaWQpIHsgfQorCisjZW5kaWYJLyogIUNPTkZJR19ISUdIX1JFU19USU1FUlMgKi8KIAogLyoKICAqIENhbGxlZCBmcm9tIHRpbWVyIHNvZnRpcnEgZXZlcnkgamlmZnksIGV4cGlyZSBocnRpbWVyczoKQEAgLTE1MTMsMzkgKzE1MTgsMzYgQEAKIAkJX19yZW1vdmVfaHJ0aW1lcih0aW1lciwgb2xkX2Jhc2UsIEhSVElNRVJfU1RBVEVfTUlHUkFURSwgMCk7CiAJCXRpbWVyLT5iYXNlID0gbmV3X2Jhc2U7CiAJCS8qCi0JCSAqIEVucXVldWUgdGhlIHRpbWVycyBvbiB0aGUgbmV3IGNwdSwgYnV0IGRvIG5vdCByZXByb2dyYW0gCi0JCSAqIHRoZSB0aW1lciBhcyB0aGF0IHdvdWxkIGVuYWJsZSBhIGRlYWRsb2NrIGJldHdlZW4KLQkJICogaHJ0aW1lcl9lbnF1ZXVlX3JlcHJvZ3JhbW0oKSBydW5uaW5nIHRoZSB0aW1lciBhbmQgdXMgc3RpbGwKLQkJICogaG9sZGluZyBhIG5lc3RlZCBiYXNlIGxvY2suCi0JCSAqCi0JCSAqIEluc3RlYWQgd2UgdGlja2xlIHRoZSBocnRpbWVyIGludGVycnVwdCBhZnRlciB0aGUgbWlncmF0aW9uCi0JCSAqIGlzIGRvbmUsIHdoaWNoIHdpbGwgcnVuIGFsbCBleHBpcmVkIHRpbWVycyBhbmQgcmUtcHJvZ3JhbW0KLQkJICogdGhlIHRpbWVyIGRldmljZS4KKwkJICogRW5xdWV1ZSB0aGUgdGltZXJzIG9uIHRoZSBuZXcgY3B1LiBUaGlzIGRvZXMgbm90CisJCSAqIHJlcHJvZ3JhbSB0aGUgZXZlbnQgZGV2aWNlIGluIGNhc2UgdGhlIHRpbWVyCisJCSAqIGV4cGlyZXMgYmVmb3JlIHRoZSBlYXJsaWVzdCBvbiB0aGlzIENQVSwgYnV0IHdlIHJ1bgorCQkgKiBocnRpbWVyX2ludGVycnVwdCBhZnRlciB3ZSBtaWdyYXRlZCBldmVyeXRoaW5nIHRvCisJCSAqIHNvcnQgb3V0IGFscmVhZHkgZXhwaXJlZCB0aW1lcnMgYW5kIHJlcHJvZ3JhbSB0aGUKKwkJICogZXZlbnQgZGV2aWNlLgogCQkgKi8KLQkJZW5xdWV1ZV9ocnRpbWVyKHRpbWVyLCBuZXdfYmFzZSwgMCk7CisJCWVucXVldWVfaHJ0aW1lcih0aW1lciwgbmV3X2Jhc2UpOwogCiAJCS8qIENsZWFyIHRoZSBtaWdyYXRpb24gc3RhdGUgYml0ICovCiAJCXRpbWVyLT5zdGF0ZSAmPSB+SFJUSU1FUl9TVEFURV9NSUdSQVRFOwogCX0KIH0KIAotc3RhdGljIGludCBtaWdyYXRlX2hydGltZXJzKGludCBzY3B1KQorc3RhdGljIHZvaWQgbWlncmF0ZV9ocnRpbWVycyhpbnQgc2NwdSkKIHsKIAlzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZSAqb2xkX2Jhc2UsICpuZXdfYmFzZTsKLQlpbnQgZGNwdSwgaTsKKwlpbnQgaTsKIAogCUJVR19PTihjcHVfb25saW5lKHNjcHUpKTsKLQlvbGRfYmFzZSA9ICZwZXJfY3B1KGhydGltZXJfYmFzZXMsIHNjcHUpOwotCW5ld19iYXNlID0gJmdldF9jcHVfdmFyKGhydGltZXJfYmFzZXMpOwotCi0JZGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQogCXRpY2tfY2FuY2VsX3NjaGVkX3RpbWVyKHNjcHUpOworCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlvbGRfYmFzZSA9ICZwZXJfY3B1KGhydGltZXJfYmFzZXMsIHNjcHUpOworCW5ld19iYXNlID0gJl9fZ2V0X2NwdV92YXIoaHJ0aW1lcl9iYXNlcyk7CiAJLyoKIAkgKiBUaGUgY2FsbGVyIGlzIGdsb2JhbGx5IHNlcmlhbGl6ZWQgYW5kIG5vYm9keSBlbHNlCiAJICogdGFrZXMgdHdvIGxvY2tzIGF0IG9uY2UsIGRlYWRsb2NrIGlzIG5vdCBwb3NzaWJsZS4KIAkgKi8KLQlzcGluX2xvY2tfaXJxKCZuZXdfYmFzZS0+bG9jayk7CisJc3Bpbl9sb2NrKCZuZXdfYmFzZS0+bG9jayk7CiAJc3Bpbl9sb2NrX25lc3RlZCgmb2xkX2Jhc2UtPmxvY2ssIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTsKIAogCWZvciAoaSA9IDA7IGkgPCBIUlRJTUVSX01BWF9DTE9DS19CQVNFUzsgaSsrKSB7CkBAIC0xNTU0LDE1ICsxNTU2LDExIEBACiAJfQogCiAJc3Bpbl91bmxvY2soJm9sZF9iYXNlLT5sb2NrKTsKLQlzcGluX3VubG9ja19pcnEoJm5ld19iYXNlLT5sb2NrKTsKLQlwdXRfY3B1X3ZhcihocnRpbWVyX2Jhc2VzKTsKKwlzcGluX3VubG9jaygmbmV3X2Jhc2UtPmxvY2spOwogCi0JcmV0dXJuIGRjcHU7Ci19Ci0KLXN0YXRpYyB2b2lkIHRpY2tsZV90aW1lcnModm9pZCAqYXJnKQotewotCWhydGltZXJfcGVla19haGVhZF90aW1lcnMoKTsKKwkvKiBDaGVjaywgaWYgd2UgZ290IGV4cGlyZWQgd29yayB0byBkbyAqLworCV9faHJ0aW1lcl9wZWVrX2FoZWFkX3RpbWVycygpOworCWxvY2FsX2lycV9lbmFibGUoKTsKIH0KIAogI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHX0NQVSAqLwpAQCAtMTU4MywxMSArMTU4MSw4IEBACiAJY2FzZSBDUFVfREVBRDoKIAljYXNlIENQVV9ERUFEX0ZST1pFTjoKIAl7Ci0JCWludCBkY3B1OwotCiAJCWNsb2NrZXZlbnRzX25vdGlmeShDTE9DS19FVlRfTk9USUZZX0NQVV9ERUFELCAmc2NwdSk7Ci0JCWRjcHUgPSBtaWdyYXRlX2hydGltZXJzKHNjcHUpOwotCQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoZGNwdSwgdGlja2xlX3RpbWVycywgTlVMTCwgMCk7CisJCW1pZ3JhdGVfaHJ0aW1lcnMoc2NwdSk7CiAJCWJyZWFrOwogCX0KICNlbmRpZgpAQCAtMTYwOCw2ICsxNjAzLDkgQEAKIAlocnRpbWVyX2NwdV9ub3RpZnkoJmhydGltZXJzX25iLCAodW5zaWduZWQgbG9uZylDUFVfVVBfUFJFUEFSRSwKIAkJCSAgKHZvaWQgKikobG9uZylzbXBfcHJvY2Vzc29yX2lkKCkpOwogCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmaHJ0aW1lcnNfbmIpOworI2lmZGVmIENPTkZJR19ISUdIX1JFU19USU1FUlMKKwlvcGVuX3NvZnRpcnEoSFJUSU1FUl9TT0ZUSVJRLCBydW5faHJ0aW1lcl9zb2Z0aXJxKTsKKyNlbmRpZgogfQogCiAvKioKZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvYXV0b3Byb2JlLmMgYi9rZXJuZWwvaXJxL2F1dG9wcm9iZS5jCmluZGV4IGNjMGY3MzIuLjFkZTk3MDAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvYXV0b3Byb2JlLmMKKysrIGIva2VybmVsL2lycS9hdXRvcHJvYmUuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvYXN5bmMuaD4KIAogI2luY2x1ZGUgImludGVybmFscy5oIgogCkBAIC0zNCw2ICszNSwxMCBAQAogCXVuc2lnbmVkIGludCBzdGF0dXM7CiAJaW50IGk7CiAKKwkvKgorCSAqIHF1aWVzY2UgdGhlIGtlcm5lbCwgb3IgYXQgbGVhc3QgdGhlIGFzeW5jaHJvbm91cyBwb3J0aW9uCisJICovCisJYXN5bmNfc3luY2hyb25pemVfZnVsbCgpOwogCW11dGV4X2xvY2soJnByb2JpbmdfYWN0aXZlKTsKIAkvKgogCSAqIHNvbWV0aGluZyBtYXkgaGF2ZSBnZW5lcmF0ZWQgYW4gaXJxIGxvbmcgYWdvIGFuZCB3ZSB3YW50IHRvCmRpZmYgLS1naXQgYS9rZXJuZWwva21vZC5jIGIva2VybmVsL2ttb2QuYwppbmRleCBiNDZkYmI5Li5hMjdhNWY2IDEwMDY0NAotLS0gYS9rZXJuZWwva21vZC5jCisrKyBiL2tlcm5lbC9rbW9kLmMKQEAgLTUxLDggKzUxLDggQEAKIAogLyoqCiAgKiByZXF1ZXN0X21vZHVsZSAtIHRyeSB0byBsb2FkIGEga2VybmVsIG1vZHVsZQotICogQGZtdDogICAgIHByaW50ZiBzdHlsZSBmb3JtYXQgc3RyaW5nIGZvciB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlCi0gKiBAdmFyYXJnczogYXJndWVtZW50cyBhcyBzcGVjaWZpZWQgaW4gdGhlIGZvcm1hdCBzdHJpbmcKKyAqIEBmbXQ6IHByaW50ZiBzdHlsZSBmb3JtYXQgc3RyaW5nIGZvciB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlCisgKiBALi4uOiBhcmd1bWVudHMgYXMgc3BlY2lmaWVkIGluIHRoZSBmb3JtYXQgc3RyaW5nCiAgKgogICogTG9hZCBhIG1vZHVsZSB1c2luZyB0aGUgdXNlciBtb2RlIG1vZHVsZSBsb2FkZXIuIFRoZSBmdW5jdGlvbiByZXR1cm5zCiAgKiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJubyBjb2RlIG9uIGZhaWx1cmUuIE5vdGUgdGhhdCBhCmRpZmYgLS1naXQgYS9rZXJuZWwva3Byb2Jlcy5jIGIva2VybmVsL2twcm9iZXMuYwppbmRleCA5ZjhhM2YyLi4xYjljYmRjIDEwMDY0NAotLS0gYS9rZXJuZWwva3Byb2Jlcy5jCisrKyBiL2tlcm5lbC9rcHJvYmVzLmMKQEAgLTY5LDcgKzY5LDcgQEAKIC8qIE5PVEU6IGNoYW5nZSB0aGlzIHZhbHVlIG9ubHkgd2l0aCBrcHJvYmVfbXV0ZXggaGVsZCAqLwogc3RhdGljIGJvb2wga3Byb2JlX2VuYWJsZWQ7CiAKLURFRklORV9NVVRFWChrcHJvYmVfbXV0ZXgpOwkJLyogUHJvdGVjdHMga3Byb2JlX3RhYmxlICovCitzdGF0aWMgREVGSU5FX01VVEVYKGtwcm9iZV9tdXRleCk7CS8qIFByb3RlY3RzIGtwcm9iZV90YWJsZSAqLwogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBrcHJvYmUgKiwga3Byb2JlX2luc3RhbmNlKSA9IE5VTEw7CiBzdGF0aWMgc3RydWN0IHsKIAlzcGlubG9ja190IGxvY2sgX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKQEAgLTExNSw2ICsxMTUsNyBAQAogCVNMT1RfVVNFRCA9IDIsCiB9OwogCitzdGF0aWMgREVGSU5FX01VVEVYKGtwcm9iZV9pbnNuX211dGV4KTsJLyogUHJvdGVjdHMga3Byb2JlX2luc25fcGFnZXMgKi8KIHN0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZCBrcHJvYmVfaW5zbl9wYWdlczsKIHN0YXRpYyBpbnQga3Byb2JlX2dhcmJhZ2Vfc2xvdHM7CiBzdGF0aWMgaW50IGNvbGxlY3RfZ2FyYmFnZV9zbG90cyh2b2lkKTsKQEAgLTE0NCwxMCArMTQ1LDEwIEBACiB9CiAKIC8qKgotICogZ2V0X2luc25fc2xvdCgpIC0gRmluZCBhIHNsb3Qgb24gYW4gZXhlY3V0YWJsZSBwYWdlIGZvciBhbiBpbnN0cnVjdGlvbi4KKyAqIF9fZ2V0X2luc25fc2xvdCgpIC0gRmluZCBhIHNsb3Qgb24gYW4gZXhlY3V0YWJsZSBwYWdlIGZvciBhbiBpbnN0cnVjdGlvbi4KICAqIFdlIGFsbG9jYXRlIGFuIGV4ZWN1dGFibGUgcGFnZSBpZiB0aGVyZSdzIG5vIHJvb20gb24gZXhpc3Rpbmcgb25lcy4KICAqLwota3Byb2JlX29wY29kZV90IF9fa3Byb2JlcyAqZ2V0X2luc25fc2xvdCh2b2lkKQorc3RhdGljIGtwcm9iZV9vcGNvZGVfdCBfX2twcm9iZXMgKl9fZ2V0X2luc25fc2xvdCh2b2lkKQogewogCXN0cnVjdCBrcHJvYmVfaW5zbl9wYWdlICpraXA7CiAJc3RydWN0IGhsaXN0X25vZGUgKnBvczsKQEAgLTE5Niw2ICsxOTcsMTUgQEAKIAlyZXR1cm4ga2lwLT5pbnNuczsKIH0KIAora3Byb2JlX29wY29kZV90IF9fa3Byb2JlcyAqZ2V0X2luc25fc2xvdCh2b2lkKQoreworCWtwcm9iZV9vcGNvZGVfdCAqcmV0OworCW11dGV4X2xvY2soJmtwcm9iZV9pbnNuX211dGV4KTsKKwlyZXQgPSBfX2dldF9pbnNuX3Nsb3QoKTsKKwltdXRleF91bmxvY2soJmtwcm9iZV9pbnNuX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCiAvKiBSZXR1cm4gMSBpZiBhbGwgZ2FyYmFnZXMgYXJlIGNvbGxlY3RlZCwgb3RoZXJ3aXNlIDAuICovCiBzdGF0aWMgaW50IF9fa3Byb2JlcyBjb2xsZWN0X29uZV9zbG90KHN0cnVjdCBrcHJvYmVfaW5zbl9wYWdlICpraXAsIGludCBpZHgpCiB7CkBAIC0yMjYsOSArMjM2LDEzIEBACiB7CiAJc3RydWN0IGtwcm9iZV9pbnNuX3BhZ2UgKmtpcDsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zLCAqbmV4dDsKKwlpbnQgc2FmZXR5OwogCiAJLyogRW5zdXJlIG5vLW9uZSBpcyBwcmVlcG10ZWQgb24gdGhlIGdhcmJhZ2VzICovCi0JaWYgKGNoZWNrX3NhZmV0eSgpICE9IDApCisJbXV0ZXhfdW5sb2NrKCZrcHJvYmVfaW5zbl9tdXRleCk7CisJc2FmZXR5ID0gY2hlY2tfc2FmZXR5KCk7CisJbXV0ZXhfbG9jaygma3Byb2JlX2luc25fbXV0ZXgpOworCWlmIChzYWZldHkgIT0gMCkKIAkJcmV0dXJuIC1FQUdBSU47CiAKIAlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGtpcCwgcG9zLCBuZXh0LCAma3Byb2JlX2luc25fcGFnZXMsIGhsaXN0KSB7CkBAIC0yNTEsNiArMjY1LDcgQEAKIAlzdHJ1Y3Qga3Byb2JlX2luc25fcGFnZSAqa2lwOwogCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7CiAKKwltdXRleF9sb2NrKCZrcHJvYmVfaW5zbl9tdXRleCk7CiAJaGxpc3RfZm9yX2VhY2hfZW50cnkoa2lwLCBwb3MsICZrcHJvYmVfaW5zbl9wYWdlcywgaGxpc3QpIHsKIAkJaWYgKGtpcC0+aW5zbnMgPD0gc2xvdCAmJgogCQkgICAgc2xvdCA8IGtpcC0+aW5zbnMgKyAoSU5TTlNfUEVSX1BBR0UgKiBNQVhfSU5TTl9TSVpFKSkgewpAQCAtMjY3LDYgKzI4Miw4IEBACiAKIAlpZiAoZGlydHkgJiYgKytrcHJvYmVfZ2FyYmFnZV9zbG90cyA+IElOU05TX1BFUl9QQUdFKQogCQljb2xsZWN0X2dhcmJhZ2Vfc2xvdHMoKTsKKworCW11dGV4X3VubG9jaygma3Byb2JlX2luc25fbXV0ZXgpOwogfQogI2VuZGlmCiAKQEAgLTMxMCw3ICszMjcsNyBAQAogCXN0cnVjdCBrcHJvYmUgKmtwOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uoa3AsICZwLT5saXN0LCBsaXN0KSB7Ci0JCWlmIChrcC0+cHJlX2hhbmRsZXIpIHsKKwkJaWYgKGtwLT5wcmVfaGFuZGxlciAmJiAha3Byb2JlX2dvbmUoa3ApKSB7CiAJCQlzZXRfa3Byb2JlX2luc3RhbmNlKGtwKTsKIAkJCWlmIChrcC0+cHJlX2hhbmRsZXIoa3AsIHJlZ3MpKQogCQkJCXJldHVybiAxOwpAQCAtMzI2LDcgKzM0Myw3IEBACiAJc3RydWN0IGtwcm9iZSAqa3A7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShrcCwgJnAtPmxpc3QsIGxpc3QpIHsKLQkJaWYgKGtwLT5wb3N0X2hhbmRsZXIpIHsKKwkJaWYgKGtwLT5wb3N0X2hhbmRsZXIgJiYgIWtwcm9iZV9nb25lKGtwKSkgewogCQkJc2V0X2twcm9iZV9pbnN0YW5jZShrcCk7CiAJCQlrcC0+cG9zdF9oYW5kbGVyKGtwLCByZWdzLCBmbGFncyk7CiAJCQlyZXNldF9rcHJvYmVfaW5zdGFuY2UoKTsKQEAgLTM5Myw3ICs0MTAsNyBAQAogCQlobGlzdF9hZGRfaGVhZCgmcmktPmhsaXN0LCBoZWFkKTsKIH0KIAotdm9pZCBrcmV0cHJvYmVfaGFzaF9sb2NrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAordm9pZCBfX2twcm9iZXMga3JldHByb2JlX2hhc2hfbG9jayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKIAkJCSBzdHJ1Y3QgaGxpc3RfaGVhZCAqKmhlYWQsIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQogewogCXVuc2lnbmVkIGxvbmcgaGFzaCA9IGhhc2hfcHRyKHRzaywgS1BST0JFX0hBU0hfQklUUyk7CkBAIC00MDQsMTMgKzQyMSwxNSBAQAogCXNwaW5fbG9ja19pcnFzYXZlKGhsaXN0X2xvY2ssICpmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIGtyZXRwcm9iZV90YWJsZV9sb2NrKHVuc2lnbmVkIGxvbmcgaGFzaCwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCitzdGF0aWMgdm9pZCBfX2twcm9iZXMga3JldHByb2JlX3RhYmxlX2xvY2sodW5zaWduZWQgbG9uZyBoYXNoLAorCXVuc2lnbmVkIGxvbmcgKmZsYWdzKQogewogCXNwaW5sb2NrX3QgKmhsaXN0X2xvY2sgPSBrcmV0cHJvYmVfdGFibGVfbG9ja19wdHIoaGFzaCk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoaGxpc3RfbG9jaywgKmZsYWdzKTsKIH0KIAotdm9pZCBrcmV0cHJvYmVfaGFzaF91bmxvY2soc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQordm9pZCBfX2twcm9iZXMga3JldHByb2JlX2hhc2hfdW5sb2NrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAorCXVuc2lnbmVkIGxvbmcgKmZsYWdzKQogewogCXVuc2lnbmVkIGxvbmcgaGFzaCA9IGhhc2hfcHRyKHRzaywgS1BST0JFX0hBU0hfQklUUyk7CiAJc3BpbmxvY2tfdCAqaGxpc3RfbG9jazsKQEAgLTQxOSw3ICs0MzgsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaGxpc3RfbG9jaywgKmZsYWdzKTsKIH0KIAotdm9pZCBrcmV0cHJvYmVfdGFibGVfdW5sb2NrKHVuc2lnbmVkIGxvbmcgaGFzaCwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCit2b2lkIF9fa3Byb2JlcyBrcmV0cHJvYmVfdGFibGVfdW5sb2NrKHVuc2lnbmVkIGxvbmcgaGFzaCwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCiB7CiAJc3BpbmxvY2tfdCAqaGxpc3RfbG9jayA9IGtyZXRwcm9iZV90YWJsZV9sb2NrX3B0cihoYXNoKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhsaXN0X2xvY2ssICpmbGFncyk7CkBAIC01MjYsOSArNTQ1LDEwIEBACiAJYXAtPmFkZHIgPSBwLT5hZGRyOwogCWFwLT5wcmVfaGFuZGxlciA9IGFnZ3JfcHJlX2hhbmRsZXI7CiAJYXAtPmZhdWx0X2hhbmRsZXIgPSBhZ2dyX2ZhdWx0X2hhbmRsZXI7Ci0JaWYgKHAtPnBvc3RfaGFuZGxlcikKKwkvKiBXZSBkb24ndCBjYXJlIHRoZSBrcHJvYmUgd2hpY2ggaGFzIGdvbmUuICovCisJaWYgKHAtPnBvc3RfaGFuZGxlciAmJiAha3Byb2JlX2dvbmUocCkpCiAJCWFwLT5wb3N0X2hhbmRsZXIgPSBhZ2dyX3Bvc3RfaGFuZGxlcjsKLQlpZiAocC0+YnJlYWtfaGFuZGxlcikKKwlpZiAocC0+YnJlYWtfaGFuZGxlciAmJiAha3Byb2JlX2dvbmUocCkpCiAJCWFwLT5icmVha19oYW5kbGVyID0gYWdncl9icmVha19oYW5kbGVyOwogCiAJSU5JVF9MSVNUX0hFQUQoJmFwLT5saXN0KTsKQEAgLTU0NywxNyArNTY3LDQxIEBACiAJaW50IHJldCA9IDA7CiAJc3RydWN0IGtwcm9iZSAqYXA7CiAKKwlpZiAoa3Byb2JlX2dvbmUob2xkX3ApKSB7CisJCS8qCisJCSAqIEF0dGVtcHRpbmcgdG8gaW5zZXJ0IG5ldyBwcm9iZSBhdCB0aGUgc2FtZSBsb2NhdGlvbiB0aGF0CisJCSAqIGhhZCBhIHByb2JlIGluIHRoZSBtb2R1bGUgdmFkZHIgYXJlYSB3aGljaCBhbHJlYWR5CisJCSAqIGZyZWVkLiBTbywgdGhlIGluc3RydWN0aW9uIHNsb3QgaGFzIGFscmVhZHkgYmVlbgorCQkgKiByZWxlYXNlZC4gV2UgbmVlZCBhIG5ldyBzbG90IGZvciB0aGUgbmV3IHByb2JlLgorCQkgKi8KKwkJcmV0ID0gYXJjaF9wcmVwYXJlX2twcm9iZShvbGRfcCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KIAlpZiAob2xkX3AtPnByZV9oYW5kbGVyID09IGFnZ3JfcHJlX2hhbmRsZXIpIHsKIAkJY29weV9rcHJvYmUob2xkX3AsIHApOwogCQlyZXQgPSBhZGRfbmV3X2twcm9iZShvbGRfcCwgcCk7CisJCWFwID0gb2xkX3A7CiAJfSBlbHNlIHsKIAkJYXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qga3Byb2JlKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghYXApCisJCWlmICghYXApIHsKKwkJCWlmIChrcHJvYmVfZ29uZShvbGRfcCkpCisJCQkJYXJjaF9yZW1vdmVfa3Byb2JlKG9sZF9wKTsKIAkJCXJldHVybiAtRU5PTUVNOworCQl9CiAJCWFkZF9hZ2dyX2twcm9iZShhcCwgb2xkX3ApOwogCQljb3B5X2twcm9iZShhcCwgcCk7CiAJCXJldCA9IGFkZF9uZXdfa3Byb2JlKGFwLCBwKTsKIAl9CisJaWYgKGtwcm9iZV9nb25lKG9sZF9wKSkgeworCQkvKgorCQkgKiBJZiB0aGUgb2xkX3AgaGFzIGdvbmUsIGl0cyBicmVha3BvaW50IGhhcyBiZWVuIGRpc2FybWVkLgorCQkgKiBXZSBoYXZlIHRvIGFybSBpdCBhZ2FpbiBhZnRlciBwcmVwYXJpbmcgcmVhbCBrcHJvYmVzLgorCQkgKi8KKwkJYXAtPmZsYWdzICY9IH5LUFJPQkVfRkxBR19HT05FOworCQlpZiAoa3Byb2JlX2VuYWJsZWQpCisJCQlhcmNoX2FybV9rcHJvYmUoYXApOworCX0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC02MDAsOCArNjQ0LDcgQEAKIAlyZXR1cm4gKGtwcm9iZV9vcGNvZGVfdCAqKSgoKGNoYXIgKilhZGRyKSArIHAtPm9mZnNldCk7CiB9CiAKLXN0YXRpYyBpbnQgX19rcHJvYmVzIF9fcmVnaXN0ZXJfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnAsCi0JdW5zaWduZWQgbG9uZyBjYWxsZWRfZnJvbSkKK2ludCBfX2twcm9iZXMgcmVnaXN0ZXJfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCiB7CiAJaW50IHJldCA9IDA7CiAJc3RydWN0IGtwcm9iZSAqb2xkX3A7CkBAIC02MjAsMjggKzY2MywzMCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlwLT5tb2RfcmVmY291bnRlZCA9IDA7Ci0KKwlwLT5mbGFncyA9IDA7CiAJLyoKIAkgKiBDaGVjayBpZiBhcmUgd2UgcHJvYmluZyBhIG1vZHVsZS4KIAkgKi8KIAlwcm9iZWRfbW9kID0gX19tb2R1bGVfdGV4dF9hZGRyZXNzKCh1bnNpZ25lZCBsb25nKSBwLT5hZGRyKTsKIAlpZiAocHJvYmVkX21vZCkgewotCQlzdHJ1Y3QgbW9kdWxlICpjYWxsaW5nX21vZDsKLQkJY2FsbGluZ19tb2QgPSBfX21vZHVsZV90ZXh0X2FkZHJlc3MoY2FsbGVkX2Zyb20pOwogCQkvKgotCQkgKiBXZSBtdXN0IGFsbG93IG1vZHVsZXMgdG8gcHJvYmUgdGhlbXNlbGYgYW5kIGluIHRoaXMgY2FzZQotCQkgKiBhdm9pZCBpbmNyZW1lbnRpbmcgdGhlIG1vZHVsZSByZWZjb3VudCwgc28gYXMgdG8gYWxsb3cKLQkJICogdW5sb2FkaW5nIG9mIHNlbGYgcHJvYmluZyBtb2R1bGVzLgorCQkgKiBXZSBtdXN0IGhvbGQgYSByZWZjb3VudCBvZiB0aGUgcHJvYmVkIG1vZHVsZSB3aGlsZSB1cGRhdGluZworCQkgKiBpdHMgY29kZSB0byBwcm9oaWJpdCB1bmV4cGVjdGVkIHVubG9hZGluZy4KIAkJICovCi0JCWlmIChjYWxsaW5nX21vZCAmJiBjYWxsaW5nX21vZCAhPSBwcm9iZWRfbW9kKSB7Ci0JCQlpZiAodW5saWtlbHkoIXRyeV9tb2R1bGVfZ2V0KHByb2JlZF9tb2QpKSkgewotCQkJCXByZWVtcHRfZW5hYmxlKCk7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0JCQlwLT5tb2RfcmVmY291bnRlZCA9IDE7Ci0JCX0gZWxzZQotCQkJcHJvYmVkX21vZCA9IE5VTEw7CisJCWlmICh1bmxpa2VseSghdHJ5X21vZHVsZV9nZXQocHJvYmVkX21vZCkpKSB7CisJCQlwcmVlbXB0X2VuYWJsZSgpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJLyoKKwkJICogSWYgdGhlIG1vZHVsZSBmcmVlZCAuaW5pdC50ZXh0LCB3ZSBjb3VsZG4ndCBpbnNlcnQKKwkJICoga3Byb2JlcyBpbiB0aGVyZS4KKwkJICovCisJCWlmICh3aXRoaW5fbW9kdWxlX2luaXQoKHVuc2lnbmVkIGxvbmcpcC0+YWRkciwgcHJvYmVkX21vZCkgJiYKKwkJICAgIHByb2JlZF9tb2QtPnN0YXRlICE9IE1PRFVMRV9TVEFURV9DT01JTkcpIHsKKwkJCW1vZHVsZV9wdXQocHJvYmVkX21vZCk7CisJCQlwcmVlbXB0X2VuYWJsZSgpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KIAl9CiAJcHJlZW1wdF9lbmFibGUoKTsKIApAQCAtNjY4LDggKzcxMyw5IEBACiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZrcHJvYmVfbXV0ZXgpOwogCi0JaWYgKHJldCAmJiBwcm9iZWRfbW9kKQorCWlmIChwcm9iZWRfbW9kKQogCQltb2R1bGVfcHV0KHByb2JlZF9tb2QpOworCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNjk3LDE2ICs3NDMsMTYgQEAKIAkgICAgIGxpc3RfaXNfc2luZ3VsYXIoJm9sZF9wLT5saXN0KSkpIHsKIAkJLyoKIAkJICogT25seSBwcm9iZSBvbiB0aGUgaGFzaCBsaXN0LiBEaXNhcm0gb25seSBpZiBrcHJvYmVzIGFyZQotCQkgKiBlbmFibGVkIC0gb3RoZXJ3aXNlLCB0aGUgYnJlYWtwb2ludCB3b3VsZCBhbHJlYWR5IGhhdmUKLQkJICogYmVlbiByZW1vdmVkLiBXZSBzYXZlIG9uIGZsdXNoaW5nIGljYWNoZS4KKwkJICogZW5hYmxlZCBhbmQgbm90IGdvbmUgLSBvdGhlcndpc2UsIHRoZSBicmVha3BvaW50IHdvdWxkCisJCSAqIGFscmVhZHkgaGF2ZSBiZWVuIHJlbW92ZWQuIFdlIHNhdmUgb24gZmx1c2hpbmcgaWNhY2hlLgogCQkgKi8KLQkJaWYgKGtwcm9iZV9lbmFibGVkKQorCQlpZiAoa3Byb2JlX2VuYWJsZWQgJiYgIWtwcm9iZV9nb25lKG9sZF9wKSkKIAkJCWFyY2hfZGlzYXJtX2twcm9iZShwKTsKIAkJaGxpc3RfZGVsX3JjdSgmb2xkX3AtPmhsaXN0KTsKIAl9IGVsc2UgewotCQlpZiAocC0+YnJlYWtfaGFuZGxlcikKKwkJaWYgKHAtPmJyZWFrX2hhbmRsZXIgJiYgIWtwcm9iZV9nb25lKHApKQogCQkJb2xkX3AtPmJyZWFrX2hhbmRsZXIgPSBOVUxMOwotCQlpZiAocC0+cG9zdF9oYW5kbGVyKSB7CisJCWlmIChwLT5wb3N0X2hhbmRsZXIgJiYgIWtwcm9iZV9nb25lKHApKSB7CiAJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShsaXN0X3AsICZvbGRfcC0+bGlzdCwgbGlzdCkgewogCQkJCWlmICgobGlzdF9wICE9IHApICYmIChsaXN0X3AtPnBvc3RfaGFuZGxlcikpCiAJCQkJCWdvdG8gbm9jbGVhbjsKQEAgLTcyMSwzOSArNzY3LDI3IEBACiAKIHN0YXRpYyB2b2lkIF9fa3Byb2JlcyBfX3VucmVnaXN0ZXJfa3Byb2JlX2JvdHRvbShzdHJ1Y3Qga3Byb2JlICpwKQogewotCXN0cnVjdCBtb2R1bGUgKm1vZDsKIAlzdHJ1Y3Qga3Byb2JlICpvbGRfcDsKIAotCWlmIChwLT5tb2RfcmVmY291bnRlZCkgewotCQkvKgotCQkgKiBTaW5jZSB3ZSd2ZSBhbHJlYWR5IGluY3JlbWVudGVkIHJlZmNvdW50LAotCQkgKiB3ZSBkb24ndCBuZWVkIHRvIGRpc2FibGUgcHJlZW1wdGlvbi4KLQkJICovCi0JCW1vZCA9IG1vZHVsZV90ZXh0X2FkZHJlc3MoKHVuc2lnbmVkIGxvbmcpcC0+YWRkcik7Ci0JCWlmIChtb2QpCi0JCQltb2R1bGVfcHV0KG1vZCk7Ci0JfQotCi0JaWYgKGxpc3RfZW1wdHkoJnAtPmxpc3QpIHx8IGxpc3RfaXNfc2luZ3VsYXIoJnAtPmxpc3QpKSB7Ci0JCWlmICghbGlzdF9lbXB0eSgmcC0+bGlzdCkpIHsKLQkJCS8qICJwIiBpcyB0aGUgbGFzdCBjaGlsZCBvZiBhbiBhZ2dyX2twcm9iZSAqLwotCQkJb2xkX3AgPSBsaXN0X2VudHJ5KHAtPmxpc3QubmV4dCwgc3RydWN0IGtwcm9iZSwgbGlzdCk7Ci0JCQlsaXN0X2RlbCgmcC0+bGlzdCk7Ci0JCQlrZnJlZShvbGRfcCk7Ci0JCX0KKwlpZiAobGlzdF9lbXB0eSgmcC0+bGlzdCkpCiAJCWFyY2hfcmVtb3ZlX2twcm9iZShwKTsKKwllbHNlIGlmIChsaXN0X2lzX3Npbmd1bGFyKCZwLT5saXN0KSkgeworCQkvKiAicCIgaXMgdGhlIGxhc3QgY2hpbGQgb2YgYW4gYWdncl9rcHJvYmUgKi8KKwkJb2xkX3AgPSBsaXN0X2VudHJ5KHAtPmxpc3QubmV4dCwgc3RydWN0IGtwcm9iZSwgbGlzdCk7CisJCWxpc3RfZGVsKCZwLT5saXN0KTsKKwkJYXJjaF9yZW1vdmVfa3Byb2JlKG9sZF9wKTsKKwkJa2ZyZWUob2xkX3ApOwogCX0KIH0KIAotc3RhdGljIGludCBfX3JlZ2lzdGVyX2twcm9iZXMoc3RydWN0IGtwcm9iZSAqKmtwcywgaW50IG51bSwKLQl1bnNpZ25lZCBsb25nIGNhbGxlZF9mcm9tKQoraW50IF9fa3Byb2JlcyByZWdpc3Rlcl9rcHJvYmVzKHN0cnVjdCBrcHJvYmUgKiprcHMsIGludCBudW0pCiB7CiAJaW50IGksIHJldCA9IDA7CiAKIAlpZiAobnVtIDw9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewotCQlyZXQgPSBfX3JlZ2lzdGVyX2twcm9iZShrcHNbaV0sIGNhbGxlZF9mcm9tKTsKKwkJcmV0ID0gcmVnaXN0ZXJfa3Byb2JlKGtwc1tpXSk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQlpZiAoaSA+IDApCiAJCQkJdW5yZWdpc3Rlcl9rcHJvYmVzKGtwcywgaSk7CkBAIC03NjMsMjYgKzc5NywxMSBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qCi0gKiBSZWdpc3RyYXRpb24gYW5kIHVucmVnaXN0cmF0aW9uIGZ1bmN0aW9ucyBmb3Iga3Byb2JlLgotICovCi1pbnQgX19rcHJvYmVzIHJlZ2lzdGVyX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQotewotCXJldHVybiBfX3JlZ2lzdGVyX2twcm9iZXMoJnAsIDEsCi0JCQkJICAodW5zaWduZWQgbG9uZylfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwotfQotCiB2b2lkIF9fa3Byb2JlcyB1bnJlZ2lzdGVyX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQogewogCXVucmVnaXN0ZXJfa3Byb2JlcygmcCwgMSk7CiB9CiAKLWludCBfX2twcm9iZXMgcmVnaXN0ZXJfa3Byb2JlcyhzdHJ1Y3Qga3Byb2JlICoqa3BzLCBpbnQgbnVtKQotewotCXJldHVybiBfX3JlZ2lzdGVyX2twcm9iZXMoa3BzLCBudW0sCi0JCQkJICAodW5zaWduZWQgbG9uZylfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwotfQotCiB2b2lkIF9fa3Byb2JlcyB1bnJlZ2lzdGVyX2twcm9iZXMoc3RydWN0IGtwcm9iZSAqKmtwcywgaW50IG51bSkKIHsKIAlpbnQgaTsKQEAgLTgxMSw4ICs4MzAsNyBAQAogCXJldHVybiAodW5zaWduZWQgbG9uZyllbnRyeTsKIH0KIAotc3RhdGljIGludCBfX3JlZ2lzdGVyX2pwcm9iZXMoc3RydWN0IGpwcm9iZSAqKmpwcywgaW50IG51bSwKLQl1bnNpZ25lZCBsb25nIGNhbGxlZF9mcm9tKQoraW50IF9fa3Byb2JlcyByZWdpc3Rlcl9qcHJvYmVzKHN0cnVjdCBqcHJvYmUgKipqcHMsIGludCBudW0pCiB7CiAJc3RydWN0IGpwcm9iZSAqanA7CiAJaW50IHJldCA9IDAsIGk7CkBAIC04MzAsNyArODQ4LDcgQEAKIAkJCS8qIFRvZG86IFZlcmlmeSBwcm9iZXBvaW50IGlzIGEgZnVuY3Rpb24gZW50cnkgcG9pbnQgKi8KIAkJCWpwLT5rcC5wcmVfaGFuZGxlciA9IHNldGptcF9wcmVfaGFuZGxlcjsKIAkJCWpwLT5rcC5icmVha19oYW5kbGVyID0gbG9uZ2ptcF9icmVha19oYW5kbGVyOwotCQkJcmV0ID0gX19yZWdpc3Rlcl9rcHJvYmUoJmpwLT5rcCwgY2FsbGVkX2Zyb20pOworCQkJcmV0ID0gcmVnaXN0ZXJfa3Byb2JlKCZqcC0+a3ApOwogCQl9CiAJCWlmIChyZXQgPCAwKSB7CiAJCQlpZiAoaSA+IDApCkBAIC04NDMsOCArODYxLDcgQEAKIAogaW50IF9fa3Byb2JlcyByZWdpc3Rlcl9qcHJvYmUoc3RydWN0IGpwcm9iZSAqanApCiB7Ci0JcmV0dXJuIF9fcmVnaXN0ZXJfanByb2JlcygmanAsIDEsCi0JCSh1bnNpZ25lZCBsb25nKV9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CisJcmV0dXJuIHJlZ2lzdGVyX2pwcm9iZXMoJmpwLCAxKTsKIH0KIAogdm9pZCBfX2twcm9iZXMgdW5yZWdpc3Rlcl9qcHJvYmUoc3RydWN0IGpwcm9iZSAqanApCkBAIC04NTIsMTIgKzg2OSw2IEBACiAJdW5yZWdpc3Rlcl9qcHJvYmVzKCZqcCwgMSk7CiB9CiAKLWludCBfX2twcm9iZXMgcmVnaXN0ZXJfanByb2JlcyhzdHJ1Y3QganByb2JlICoqanBzLCBpbnQgbnVtKQotewotCXJldHVybiBfX3JlZ2lzdGVyX2pwcm9iZXMoanBzLCBudW0sCi0JCSh1bnNpZ25lZCBsb25nKV9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7Ci19Ci0KIHZvaWQgX19rcHJvYmVzIHVucmVnaXN0ZXJfanByb2JlcyhzdHJ1Y3QganByb2JlICoqanBzLCBpbnQgbnVtKQogewogCWludCBpOwpAQCAtOTIwLDggKzkzMSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19rcHJvYmVzIF9fcmVnaXN0ZXJfa3JldHByb2JlKHN0cnVjdCBrcmV0cHJvYmUgKnJwLAotCQkJCQkgIHVuc2lnbmVkIGxvbmcgY2FsbGVkX2Zyb20pCitpbnQgX19rcHJvYmVzIHJlZ2lzdGVyX2tyZXRwcm9iZShzdHJ1Y3Qga3JldHByb2JlICpycCkKIHsKIAlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3Qga3JldHByb2JlX2luc3RhbmNlICppbnN0OwpAQCAtOTY3LDIxICs5NzcsMjAgQEAKIAogCXJwLT5ubWlzc2VkID0gMDsKIAkvKiBFc3RhYmxpc2ggZnVuY3Rpb24gZW50cnkgcHJvYmUgcG9pbnQgKi8KLQlyZXQgPSBfX3JlZ2lzdGVyX2twcm9iZSgmcnAtPmtwLCBjYWxsZWRfZnJvbSk7CisJcmV0ID0gcmVnaXN0ZXJfa3Byb2JlKCZycC0+a3ApOwogCWlmIChyZXQgIT0gMCkKIAkJZnJlZV9ycF9pbnN0KHJwKTsKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IF9fcmVnaXN0ZXJfa3JldHByb2JlcyhzdHJ1Y3Qga3JldHByb2JlICoqcnBzLCBpbnQgbnVtLAotCXVuc2lnbmVkIGxvbmcgY2FsbGVkX2Zyb20pCitpbnQgX19rcHJvYmVzIHJlZ2lzdGVyX2tyZXRwcm9iZXMoc3RydWN0IGtyZXRwcm9iZSAqKnJwcywgaW50IG51bSkKIHsKIAlpbnQgcmV0ID0gMCwgaTsKIAogCWlmIChudW0gPD0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7Ci0JCXJldCA9IF9fcmVnaXN0ZXJfa3JldHByb2JlKHJwc1tpXSwgY2FsbGVkX2Zyb20pOworCQlyZXQgPSByZWdpc3Rlcl9rcmV0cHJvYmUocnBzW2ldKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCWlmIChpID4gMCkKIAkJCQl1bnJlZ2lzdGVyX2tyZXRwcm9iZXMocnBzLCBpKTsKQEAgLTk5MSwyMyArMTAwMCwxMSBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBfX2twcm9iZXMgcmVnaXN0ZXJfa3JldHByb2JlKHN0cnVjdCBrcmV0cHJvYmUgKnJwKQotewotCXJldHVybiBfX3JlZ2lzdGVyX2tyZXRwcm9iZXMoJnJwLCAxLAotCQkJKHVuc2lnbmVkIGxvbmcpX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKLX0KLQogdm9pZCBfX2twcm9iZXMgdW5yZWdpc3Rlcl9rcmV0cHJvYmUoc3RydWN0IGtyZXRwcm9iZSAqcnApCiB7CiAJdW5yZWdpc3Rlcl9rcmV0cHJvYmVzKCZycCwgMSk7CiB9CiAKLWludCBfX2twcm9iZXMgcmVnaXN0ZXJfa3JldHByb2JlcyhzdHJ1Y3Qga3JldHByb2JlICoqcnBzLCBpbnQgbnVtKQotewotCXJldHVybiBfX3JlZ2lzdGVyX2tyZXRwcm9iZXMocnBzLCBudW0sCi0JCQkodW5zaWduZWQgbG9uZylfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwotfQotCiB2b2lkIF9fa3Byb2JlcyB1bnJlZ2lzdGVyX2tyZXRwcm9iZXMoc3RydWN0IGtyZXRwcm9iZSAqKnJwcywgaW50IG51bSkKIHsKIAlpbnQgaTsKQEAgLTEwNTUsNiArMTA1Miw3MiBAQAogCiAjZW5kaWYgLyogQ09ORklHX0tSRVRQUk9CRVMgKi8KIAorLyogU2V0IHRoZSBrcHJvYmUgZ29uZSBhbmQgcmVtb3ZlIGl0cyBpbnN0cnVjdGlvbiBidWZmZXIuICovCitzdGF0aWMgdm9pZCBfX2twcm9iZXMga2lsbF9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKK3sKKwlzdHJ1Y3Qga3Byb2JlICprcDsKKwlwLT5mbGFncyB8PSBLUFJPQkVfRkxBR19HT05FOworCWlmIChwLT5wcmVfaGFuZGxlciA9PSBhZ2dyX3ByZV9oYW5kbGVyKSB7CisJCS8qCisJCSAqIElmIHRoaXMgaXMgYW4gYWdncl9rcHJvYmUsIHdlIGhhdmUgdG8gbGlzdCBhbGwgdGhlCisJCSAqIGNoYWluZWQgcHJvYmVzIGFuZCBtYXJrIHRoZW0gR09ORS4KKwkJICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGtwLCAmcC0+bGlzdCwgbGlzdCkKKwkJCWtwLT5mbGFncyB8PSBLUFJPQkVfRkxBR19HT05FOworCQlwLT5wb3N0X2hhbmRsZXIgPSBOVUxMOworCQlwLT5icmVha19oYW5kbGVyID0gTlVMTDsKKwl9CisJLyoKKwkgKiBIZXJlLCB3ZSBjYW4gcmVtb3ZlIGluc25fc2xvdCBzYWZlbHksIGJlY2F1c2Ugbm8gdGhyZWFkIGNhbGxzCisJICogdGhlIG9yaWdpbmFsIHByb2JlZCBmdW5jdGlvbiAod2hpY2ggd2lsbCBiZSBmcmVlZCBzb29uKSBhbnkgbW9yZS4KKwkgKi8KKwlhcmNoX3JlbW92ZV9rcHJvYmUocCk7Cit9CisKKy8qIE1vZHVsZSBub3RpZmllciBjYWxsIGJhY2ssIGNoZWNraW5nIGtwcm9iZXMgb24gdGhlIG1vZHVsZSAqLworc3RhdGljIGludCBfX2twcm9iZXMga3Byb2Jlc19tb2R1bGVfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCQkJICAgICB1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbW9kdWxlICptb2QgPSBkYXRhOworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCXN0cnVjdCBrcHJvYmUgKnA7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGNoZWNrY29yZSA9ICh2YWwgPT0gTU9EVUxFX1NUQVRFX0dPSU5HKTsKKworCWlmICh2YWwgIT0gTU9EVUxFX1NUQVRFX0dPSU5HICYmIHZhbCAhPSBNT0RVTEVfU1RBVEVfTElWRSkKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCisJLyoKKwkgKiBXaGVuIE1PRFVMRV9TVEFURV9HT0lORyB3YXMgbm90aWZpZWQsIGJvdGggb2YgbW9kdWxlIC50ZXh0IGFuZAorCSAqIC5pbml0LnRleHQgc2VjdGlvbnMgd291bGQgYmUgZnJlZWQuIFdoZW4gTU9EVUxFX1NUQVRFX0xJVkUgd2FzCisJICogbm90aWZpZWQsIG9ubHkgLmluaXQudGV4dCBzZWN0aW9uIHdvdWxkIGJlIGZyZWVkLiBXZSBuZWVkIHRvCisJICogZGlzYWJsZSBrcHJvYmVzIHdoaWNoIGhhdmUgYmVlbiBpbnNlcnRlZCBpbiB0aGUgc2VjdGlvbnMuCisJICovCisJbXV0ZXhfbG9jaygma3Byb2JlX211dGV4KTsKKwlmb3IgKGkgPSAwOyBpIDwgS1BST0JFX1RBQkxFX1NJWkU7IGkrKykgeworCQloZWFkID0gJmtwcm9iZV90YWJsZVtpXTsKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHAsIG5vZGUsIGhlYWQsIGhsaXN0KQorCQkJaWYgKHdpdGhpbl9tb2R1bGVfaW5pdCgodW5zaWduZWQgbG9uZylwLT5hZGRyLCBtb2QpIHx8CisJCQkgICAgKGNoZWNrY29yZSAmJgorCQkJICAgICB3aXRoaW5fbW9kdWxlX2NvcmUoKHVuc2lnbmVkIGxvbmcpcC0+YWRkciwgbW9kKSkpIHsKKwkJCQkvKgorCQkJCSAqIFRoZSB2YWRkciB0aGlzIHByb2JlIGlzIGluc3RhbGxlZCB3aWxsIHNvb24KKwkJCQkgKiBiZSB2ZnJlZWQgYnV5IG5vdCBzeW5jZWQgdG8gZGlzay4gSGVuY2UsCisJCQkJICogZGlzYXJtaW5nIHRoZSBicmVha3BvaW50IGlzbid0IG5lZWRlZC4KKwkJCQkgKi8KKwkJCQlraWxsX2twcm9iZShwKTsKKwkJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZrcHJvYmVfbXV0ZXgpOworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBrcHJvYmVfbW9kdWxlX25iID0geworCS5ub3RpZmllcl9jYWxsID0ga3Byb2Jlc19tb2R1bGVfY2FsbGJhY2ssCisJLnByaW9yaXR5ID0gMAorfTsKKwogc3RhdGljIGludCBfX2luaXQgaW5pdF9rcHJvYmVzKHZvaWQpCiB7CiAJaW50IGksIGVyciA9IDA7CkBAIC0xMTExLDYgKzExNzQsOSBAQAogCWVyciA9IGFyY2hfaW5pdF9rcHJvYmVzKCk7CiAJaWYgKCFlcnIpCiAJCWVyciA9IHJlZ2lzdGVyX2RpZV9ub3RpZmllcigma3Byb2JlX2V4Y2VwdGlvbnNfbmIpOworCWlmICghZXJyKQorCQllcnIgPSByZWdpc3Rlcl9tb2R1bGVfbm90aWZpZXIoJmtwcm9iZV9tb2R1bGVfbmIpOworCiAJa3Byb2Jlc19pbml0aWFsaXplZCA9IChlcnIgPT0gMCk7CiAKIAlpZiAoIWVycikKQEAgLTExMzEsMTAgKzExOTcsMTIgQEAKIAllbHNlCiAJCWtwcm9iZV90eXBlID0gImsiOwogCWlmIChzeW0pCi0JCXNlcV9wcmludGYocGksICIlcCAgJXMgICVzKzB4JXggICVzXG4iLCBwLT5hZGRyLCBrcHJvYmVfdHlwZSwKLQkJCXN5bSwgb2Zmc2V0LCAobW9kbmFtZSA/IG1vZG5hbWUgOiAiICIpKTsKKwkJc2VxX3ByaW50ZihwaSwgIiVwICAlcyAgJXMrMHgleCAgJXMgJXNcbiIsIHAtPmFkZHIsIGtwcm9iZV90eXBlLAorCQkJc3ltLCBvZmZzZXQsIChtb2RuYW1lID8gbW9kbmFtZSA6ICIgIiksCisJCQkoa3Byb2JlX2dvbmUocCkgPyAiW0dPTkVdIiA6ICIiKSk7CiAJZWxzZQotCQlzZXFfcHJpbnRmKHBpLCAiJXAgICVzICAlcFxuIiwgcC0+YWRkciwga3Byb2JlX3R5cGUsIHAtPmFkZHIpOworCQlzZXFfcHJpbnRmKHBpLCAiJXAgICVzICAlcCAlc1xuIiwgcC0+YWRkciwga3Byb2JlX3R5cGUsIHAtPmFkZHIsCisJCQkoa3Byb2JlX2dvbmUocCkgPyAiW0dPTkVdIiA6ICIiKSk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fa3Byb2JlcyAqa3Byb2JlX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIGxvZmZfdCAqcG9zKQpAQCAtMTIxNSw3ICsxMjgzLDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgS1BST0JFX1RBQkxFX1NJWkU7IGkrKykgewogCQloZWFkID0gJmtwcm9iZV90YWJsZVtpXTsKIAkJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHAsIG5vZGUsIGhlYWQsIGhsaXN0KQotCQkJYXJjaF9hcm1fa3Byb2JlKHApOworCQkJaWYgKCFrcHJvYmVfZ29uZShwKSkKKwkJCQlhcmNoX2FybV9rcHJvYmUocCk7CiAJfQogCiAJa3Byb2JlX2VuYWJsZWQgPSB0cnVlOwpAQCAtMTI0NCw3ICsxMzEzLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgS1BST0JFX1RBQkxFX1NJWkU7IGkrKykgewogCQloZWFkID0gJmtwcm9iZV90YWJsZVtpXTsKIAkJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHAsIG5vZGUsIGhlYWQsIGhsaXN0KSB7Ci0JCQlpZiAoIWFyY2hfdHJhbXBvbGluZV9rcHJvYmUocCkpCisJCQlpZiAoIWFyY2hfdHJhbXBvbGluZV9rcHJvYmUocCkgJiYgIWtwcm9iZV9nb25lKHApKQogCQkJCWFyY2hfZGlzYXJtX2twcm9iZShwKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2tlcm5lbC9rc3lzZnMuYyBiL2tlcm5lbC9rc3lzZnMuYwppbmRleCAwOGRkOGVkLi41MjhkZDc4IDEwMDY0NAotLS0gYS9rZXJuZWwva3N5c2ZzLmMKKysrIGIva2VybmVsL2tzeXNmcy5jCkBAIC0yNCw3ICsyNCw3IEBACiBzdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIF9uYW1lIyNfYXR0ciA9IFwKIAlfX0FUVFIoX25hbWUsIDA2NDQsIF9uYW1lIyNfc2hvdywgX25hbWUjI19zdG9yZSkKIAotI2lmIGRlZmluZWQoQ09ORklHX0hPVFBMVUcpICYmIGRlZmluZWQoQ09ORklHX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19IT1RQTFVHKQogLyogY3VycmVudCB1ZXZlbnQgc2VxdWVuY2UgbnVtYmVyICovCiBzdGF0aWMgc3NpemVfdCB1ZXZlbnRfc2VxbnVtX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCiAJCQkJICBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKQEAgLTEzNyw3ICsxMzcsNyBAQAogRVhQT1JUX1NZTUJPTF9HUEwoa2VybmVsX2tvYmopOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqIGtlcm5lbF9hdHRyc1tdID0gewotI2lmIGRlZmluZWQoQ09ORklHX0hPVFBMVUcpICYmIGRlZmluZWQoQ09ORklHX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19IT1RQTFVHKQogCSZ1ZXZlbnRfc2VxbnVtX2F0dHIuYXR0ciwKIAkmdWV2ZW50X2hlbHBlcl9hdHRyLmF0dHIsCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2tlcm5lbC9tb2R1bGUuYyBiL2tlcm5lbC9tb2R1bGUuYwppbmRleCBkZDJhNTQxLi5jOTMzMmM5IDEwMDY0NAotLS0gYS9rZXJuZWwvbW9kdWxlLmMKKysrIGIva2VybmVsL21vZHVsZS5jCkBAIC00Myw3ICs0Myw2IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC91bndpbmQuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VsaXN0Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgpAQCAtNTEsNiArNTAsNyBAQAogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGxpbnV4L3RyYWNlcG9pbnQuaD4KICNpbmNsdWRlIDxsaW51eC9mdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9hc3luYy5oPgogCiAjaWYgMAogI2RlZmluZSBERUJVR1AgcHJpbnRrCkBAIC03NTcsOCArNzU3LDE2IEBACiAJCXJldHVybiAtRUZBVUxUOwogCW5hbWVbTU9EVUxFX05BTUVfTEVOLTFdID0gJ1wwJzsKIAotCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJm1vZHVsZV9tdXRleCkgIT0gMCkKLQkJcmV0dXJuIC1FSU5UUjsKKwkvKiBDcmVhdGUgc3RvcF9tYWNoaW5lIHRocmVhZHMgc2luY2UgZnJlZV9tb2R1bGUgcmVsaWVzIG9uCisJICogYSBub24tZmFpbGluZyBzdG9wX21hY2hpbmUgY2FsbC4gKi8KKwlyZXQgPSBzdG9wX21hY2hpbmVfY3JlYXRlKCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJm1vZHVsZV9tdXRleCkgIT0gMCkgeworCQlyZXQgPSAtRUlOVFI7CisJCWdvdG8gb3V0X3N0b3A7CisJfQogCiAJbW9kID0gZmluZF9tb2R1bGUobmFtZSk7CiAJaWYgKCFtb2QpIHsKQEAgLTgwOSw2ICs4MTcsNyBAQAogCQltb2QtPmV4aXQoKTsKIAlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZtb2R1bGVfbm90aWZ5X2xpc3QsCiAJCQkJICAgICBNT0RVTEVfU1RBVEVfR09JTkcsIG1vZCk7CisJYXN5bmNfc3luY2hyb25pemVfZnVsbCgpOwogCW11dGV4X2xvY2soJm1vZHVsZV9tdXRleCk7CiAJLyogU3RvcmUgdGhlIG5hbWUgb2YgdGhlIGxhc3QgdW5sb2FkZWQgbW9kdWxlIGZvciBkaWFnbm9zdGljIHB1cnBvc2VzICovCiAJc3RybGNweShsYXN0X3VubG9hZGVkX21vZHVsZSwgbW9kLT5uYW1lLCBzaXplb2YobGFzdF91bmxvYWRlZF9tb2R1bGUpKTsKQEAgLTgxNywxMCArODI2LDEyIEBACiAKICBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZtb2R1bGVfbXV0ZXgpOworb3V0X3N0b3A6CisJc3RvcF9tYWNoaW5lX2Rlc3Ryb3koKTsKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBwcmludF91bmxvYWRfaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBtb2R1bGUgKm1vZCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmludF91bmxvYWRfaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBtb2R1bGUgKm1vZCkKIHsKIAlzdHJ1Y3QgbW9kdWxlX3VzZSAqdXNlOwogCWludCBwcmludGVkX3NvbWV0aGluZyA9IDA7CkBAIC04OTMsNyArOTA0LDcgQEAKIEVYUE9SVF9TWU1CT0wobW9kdWxlX3B1dCk7CiAKICNlbHNlIC8qICFDT05GSUdfTU9EVUxFX1VOTE9BRCAqLwotc3RhdGljIHZvaWQgcHJpbnRfdW5sb2FkX2luZm8oc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgbW9kdWxlICptb2QpCitzdGF0aWMgaW5saW5lIHZvaWQgcHJpbnRfdW5sb2FkX2luZm8oc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgbW9kdWxlICptb2QpCiB7CiAJLyogV2UgZG9uJ3Qga25vdyB0aGUgdXNhZ2UgY291bnQsIG9yIHdoYXQgbW9kdWxlcyBhcmUgdXNpbmcuICovCiAJc2VxX3ByaW50ZihtLCAiIC0gLSIpOwpAQCAtMTQzOSw4ICsxNDUwLDYgQEAKIAlyZW1vdmVfc2VjdF9hdHRycyhtb2QpOwogCW1vZF9rb2JqZWN0X3JlbW92ZShtb2QpOwogCi0JdW53aW5kX3JlbW92ZV90YWJsZShtb2QtPnVud2luZF9pbmZvLCAwKTsKLQogCS8qIEFyY2gtc3BlY2lmaWMgY2xlYW51cC4gKi8KIAltb2R1bGVfYXJjaF9jbGVhbnVwKG1vZCk7CiAKQEAgLTE1NzgsMTEgKzE1ODcsMjEgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKiBBZGRpdGlvbmFsIGJ5dGVzIG5lZWRlZCBieSBhcmNoIGluIGZyb250IG9mIGluZGl2aWR1YWwgc2VjdGlvbnMgKi8KK3Vuc2lnbmVkIGludCBfX3dlYWsgYXJjaF9tb2Rfc2VjdGlvbl9wcmVwZW5kKHN0cnVjdCBtb2R1bGUgKm1vZCwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgc2VjdGlvbikKK3sKKwkvKiBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGp1c3QgcmV0dXJucyB6ZXJvICovCisJcmV0dXJuIDA7Cit9CisKIC8qIFVwZGF0ZSBzaXplIHdpdGggdGhpcyBzZWN0aW9uOiByZXR1cm4gb2Zmc2V0LiAqLwotc3RhdGljIGxvbmcgZ2V0X29mZnNldCh1bnNpZ25lZCBpbnQgKnNpemUsIEVsZl9TaGRyICpzZWNoZHIpCitzdGF0aWMgbG9uZyBnZXRfb2Zmc2V0KHN0cnVjdCBtb2R1bGUgKm1vZCwgdW5zaWduZWQgaW50ICpzaXplLAorCQkgICAgICAgRWxmX1NoZHIgKnNlY2hkciwgdW5zaWduZWQgaW50IHNlY3Rpb24pCiB7CiAJbG9uZyByZXQ7CiAKKwkqc2l6ZSArPSBhcmNoX21vZF9zZWN0aW9uX3ByZXBlbmQobW9kLCBzZWN0aW9uKTsKIAlyZXQgPSBBTElHTigqc2l6ZSwgc2VjaGRyLT5zaF9hZGRyYWxpZ24gPzogMSk7CiAJKnNpemUgPSByZXQgKyBzZWNoZHItPnNoX3NpemU7CiAJcmV0dXJuIHJldDsKQEAgLTE2MjIsNyArMTY0MSw3IEBACiAJCQkgICAgfHwgc3RybmNtcChzZWNzdHJpbmdzICsgcy0+c2hfbmFtZSwKIAkJCQkgICAgICAgIi5pbml0IiwgNSkgPT0gMCkKIAkJCQljb250aW51ZTsKLQkJCXMtPnNoX2VudHNpemUgPSBnZXRfb2Zmc2V0KCZtb2QtPmNvcmVfc2l6ZSwgcyk7CisJCQlzLT5zaF9lbnRzaXplID0gZ2V0X29mZnNldChtb2QsICZtb2QtPmNvcmVfc2l6ZSwgcywgaSk7CiAJCQlERUJVR1AoIlx0JXNcbiIsIHNlY3N0cmluZ3MgKyBzLT5zaF9uYW1lKTsKIAkJfQogCQlpZiAobSA9PSAwKQpAQCAtMTY0MCw3ICsxNjU5LDcgQEAKIAkJCSAgICB8fCBzdHJuY21wKHNlY3N0cmluZ3MgKyBzLT5zaF9uYW1lLAogCQkJCSAgICAgICAiLmluaXQiLCA1KSAhPSAwKQogCQkJCWNvbnRpbnVlOwotCQkJcy0+c2hfZW50c2l6ZSA9IChnZXRfb2Zmc2V0KCZtb2QtPmluaXRfc2l6ZSwgcykKKwkJCXMtPnNoX2VudHNpemUgPSAoZ2V0X29mZnNldChtb2QsICZtb2QtPmluaXRfc2l6ZSwgcywgaSkKIAkJCQkJIHwgSU5JVF9PRkZTRVRfTUFTSyk7CiAJCQlERUJVR1AoIlx0JXNcbiIsIHNlY3N0cmluZ3MgKyBzLT5zaF9uYW1lKTsKIAkJfQpAQCAtMTcyNSwxNSArMTc0NCwxNSBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgaW50IGlzX2V4cG9ydGVkKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHN0cnVjdCBtb2R1bGUgKm1vZCkKK3N0YXRpYyBpbnQgaXNfZXhwb3J0ZWQoY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyB2YWx1ZSwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBtb2R1bGUgKm1vZCkKIHsKLQlpZiAoIW1vZCAmJiBsb29rdXBfc3ltYm9sKG5hbWUsIF9fc3RhcnRfX19rc3ltdGFiLCBfX3N0b3BfX19rc3ltdGFiKSkKLQkJcmV0dXJuIDE7CisJY29uc3Qgc3RydWN0IGtlcm5lbF9zeW1ib2wgKmtzOworCWlmICghbW9kKQorCQlrcyA9IGxvb2t1cF9zeW1ib2wobmFtZSwgX19zdGFydF9fX2tzeW10YWIsIF9fc3RvcF9fX2tzeW10YWIpOwogCWVsc2UKLQkJaWYgKG1vZCAmJiBsb29rdXBfc3ltYm9sKG5hbWUsIG1vZC0+c3ltcywgbW9kLT5zeW1zICsgbW9kLT5udW1fc3ltcykpCi0JCQlyZXR1cm4gMTsKLQkJZWxzZQotCQkJcmV0dXJuIDA7CisJCWtzID0gbG9va3VwX3N5bWJvbChuYW1lLCBtb2QtPnN5bXMsIG1vZC0+c3ltcyArIG1vZC0+bnVtX3N5bXMpOworCXJldHVybiBrcyAhPSBOVUxMICYmIGtzLT52YWx1ZSA9PSB2YWx1ZTsKIH0KIAogLyogQXMgcGVyIG5tICovCkBAIC0xODQ3LDcgKzE4NjYsNiBAQAogCXVuc2lnbmVkIGludCBzeW1pbmRleCA9IDA7CiAJdW5zaWduZWQgaW50IHN0cmluZGV4ID0gMDsKIAl1bnNpZ25lZCBpbnQgbW9kaW5kZXgsIHZlcnNpbmRleCwgaW5mb2luZGV4LCBwY3B1aW5kZXg7Ci0JdW5zaWduZWQgaW50IHVud2luZGV4ID0gMDsKIAl1bnNpZ25lZCBpbnQgbnVtX2twLCBudW1fbWNvdW50OwogCXN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwOwogCXN0cnVjdCBtb2R1bGUgKm1vZDsKQEAgLTE4NjUsNiArMTg4MywxMyBAQAogCS8qIHZtYWxsb2MgYmFyZnMgb24gInVudXN1YWwiIG51bWJlcnMuICBDaGVjayBoZXJlICovCiAJaWYgKGxlbiA+IDY0ICogMTAyNCAqIDEwMjQgfHwgKGhkciA9IHZtYWxsb2MobGVuKSkgPT0gTlVMTCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwkvKiBDcmVhdGUgc3RvcF9tYWNoaW5lIHRocmVhZHMgc2luY2UgdGhlIGVycm9yIHBhdGggcmVsaWVzIG9uCisJICogYSBub24tZmFpbGluZyBzdG9wX21hY2hpbmUgY2FsbC4gKi8KKwllcnIgPSBzdG9wX21hY2hpbmVfY3JlYXRlKCk7CisJaWYgKGVycikKKwkJZ290byBmcmVlX2hkcjsKKwogCWlmIChjb3B5X2Zyb21fdXNlcihoZHIsIHVtb2QsIGxlbikgIT0gMCkgewogCQllcnIgPSAtRUZBVUxUOwogCQlnb3RvIGZyZWVfaGRyOwpAQCAtMTkzMCw5ICsxOTU1LDYgQEAKIAl2ZXJzaW5kZXggPSBmaW5kX3NlYyhoZHIsIHNlY2hkcnMsIHNlY3N0cmluZ3MsICJfX3ZlcnNpb25zIik7CiAJaW5mb2luZGV4ID0gZmluZF9zZWMoaGRyLCBzZWNoZHJzLCBzZWNzdHJpbmdzLCAiLm1vZGluZm8iKTsKIAlwY3B1aW5kZXggPSBmaW5kX3BjcHVzZWMoaGRyLCBzZWNoZHJzLCBzZWNzdHJpbmdzKTsKLSNpZmRlZiBBUkNIX1VOV0lORF9TRUNUSU9OX05BTUUKLQl1bndpbmRleCA9IGZpbmRfc2VjKGhkciwgc2VjaGRycywgc2Vjc3RyaW5ncywgQVJDSF9VTldJTkRfU0VDVElPTl9OQU1FKTsKLSNlbmRpZgogCiAJLyogRG9uJ3Qga2VlcCBtb2RpbmZvIGFuZCB2ZXJzaW9uIHNlY3Rpb25zLiAqLwogCXNlY2hkcnNbaW5mb2luZGV4XS5zaF9mbGFncyAmPSB+KHVuc2lnbmVkIGxvbmcpU0hGX0FMTE9DOwpAQCAtMTk0Miw4ICsxOTY0LDYgQEAKIAlzZWNoZHJzW3N5bWluZGV4XS5zaF9mbGFncyB8PSBTSEZfQUxMT0M7CiAJc2VjaGRyc1tzdHJpbmRleF0uc2hfZmxhZ3MgfD0gU0hGX0FMTE9DOwogI2VuZGlmCi0JaWYgKHVud2luZGV4KQotCQlzZWNoZHJzW3Vud2luZGV4XS5zaF9mbGFncyB8PSBTSEZfQUxMT0M7CiAKIAkvKiBDaGVjayBtb2R1bGUgc3RydWN0IHZlcnNpb24gbm93LCBiZWZvcmUgd2UgdHJ5IHRvIHVzZSBtb2R1bGUuICovCiAJaWYgKCFjaGVja19tb2RzdHJ1Y3RfdmVyc2lvbihzZWNoZHJzLCB2ZXJzaW5kZXgsIG1vZCkpIHsKQEAgLTIyNDAsMTQgKzIyNjAsMTAgQEAKIAlhZGRfc2VjdF9hdHRycyhtb2QsIGhkci0+ZV9zaG51bSwgc2Vjc3RyaW5ncywgc2VjaGRycyk7CiAJYWRkX25vdGVzX2F0dHJzKG1vZCwgaGRyLT5lX3NobnVtLCBzZWNzdHJpbmdzLCBzZWNoZHJzKTsKIAotCS8qIFNpemUgb2Ygc2VjdGlvbiAwIGlzIDAsIHNvIHRoaXMgd29ya3Mgd2VsbCBpZiBubyB1bndpbmQgaW5mby4gKi8KLQltb2QtPnVud2luZF9pbmZvID0gdW53aW5kX2FkZF90YWJsZShtb2QsCi0JCQkJCSAgICAodm9pZCAqKXNlY2hkcnNbdW53aW5kZXhdLnNoX2FkZHIsCi0JCQkJCSAgICBzZWNoZHJzW3Vud2luZGV4XS5zaF9zaXplKTsKLQogCS8qIEdldCByaWQgb2YgdGVtcG9yYXJ5IGNvcHkgKi8KIAl2ZnJlZShoZHIpOwogCisJc3RvcF9tYWNoaW5lX2Rlc3Ryb3koKTsKIAkvKiBEb25lISAqLwogCXJldHVybiBtb2Q7CiAKQEAgLTIyNzAsNiArMjI4Niw3IEBACiAJa2ZyZWUoYXJncyk7CiAgZnJlZV9oZHI6CiAJdmZyZWUoaGRyKTsKKwlzdG9wX21hY2hpbmVfZGVzdHJveSgpOwogCXJldHVybiBFUlJfUFRSKGVycik7CiAKICB0cnVuY2F0ZWQ6CkBAIC0yMzM3LDExICsyMzU0LDEyIEBACiAJLyogTm93IGl0J3MgYSBmaXJzdCBjbGFzcyBjaXRpemVuISAgV2FrZSB1cCBhbnlvbmUgd2FpdGluZyBmb3IgaXQuICovCiAJbW9kLT5zdGF0ZSA9IE1PRFVMRV9TVEFURV9MSVZFOwogCXdha2VfdXAoJm1vZHVsZV93cSk7CisJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmbW9kdWxlX25vdGlmeV9saXN0LAorCQkJCSAgICAgTU9EVUxFX1NUQVRFX0xJVkUsIG1vZCk7CiAKIAltdXRleF9sb2NrKCZtb2R1bGVfbXV0ZXgpOwogCS8qIERyb3AgaW5pdGlhbCByZWZlcmVuY2UuICovCiAJbW9kdWxlX3B1dChtb2QpOwotCXVud2luZF9yZW1vdmVfdGFibGUobW9kLT51bndpbmRfaW5mbywgMSk7CiAJbW9kdWxlX2ZyZWUobW9kLCBtb2QtPm1vZHVsZV9pbml0KTsKIAltb2QtPm1vZHVsZV9pbml0ID0gTlVMTDsKIAltb2QtPmluaXRfc2l6ZSA9IDA7CkBAIC0yMzc2LDcgKzIzOTQsNyBAQAogCXVuc2lnbmVkIGxvbmcgbmV4dHZhbDsKIAogCS8qIEF0IHdvcnNlLCBuZXh0IHZhbHVlIGlzIGF0IGVuZCBvZiBtb2R1bGUgKi8KLQlpZiAod2l0aGluKGFkZHIsIG1vZC0+bW9kdWxlX2luaXQsIG1vZC0+aW5pdF9zaXplKSkKKwlpZiAod2l0aGluX21vZHVsZV9pbml0KGFkZHIsIG1vZCkpCiAJCW5leHR2YWwgPSAodW5zaWduZWQgbG9uZyltb2QtPm1vZHVsZV9pbml0K21vZC0+aW5pdF90ZXh0X3NpemU7CiAJZWxzZQogCQluZXh0dmFsID0gKHVuc2lnbmVkIGxvbmcpbW9kLT5tb2R1bGVfY29yZSttb2QtPmNvcmVfdGV4dF9zaXplOwpAQCAtMjQyNCw4ICsyNDQyLDggQEAKIAogCXByZWVtcHRfZGlzYWJsZSgpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KG1vZCwgJm1vZHVsZXMsIGxpc3QpIHsKLQkJaWYgKHdpdGhpbihhZGRyLCBtb2QtPm1vZHVsZV9pbml0LCBtb2QtPmluaXRfc2l6ZSkKLQkJICAgIHx8IHdpdGhpbihhZGRyLCBtb2QtPm1vZHVsZV9jb3JlLCBtb2QtPmNvcmVfc2l6ZSkpIHsKKwkJaWYgKHdpdGhpbl9tb2R1bGVfaW5pdChhZGRyLCBtb2QpIHx8CisJCSAgICB3aXRoaW5fbW9kdWxlX2NvcmUoYWRkciwgbW9kKSkgewogCQkJaWYgKG1vZG5hbWUpCiAJCQkJKm1vZG5hbWUgPSBtb2QtPm5hbWU7CiAJCQlyZXQgPSBnZXRfa3N5bWJvbChtb2QsIGFkZHIsIHNpemUsIG9mZnNldCk7CkBAIC0yNDQ3LDggKzI0NjUsOCBAQAogCiAJcHJlZW1wdF9kaXNhYmxlKCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UobW9kLCAmbW9kdWxlcywgbGlzdCkgewotCQlpZiAod2l0aGluKGFkZHIsIG1vZC0+bW9kdWxlX2luaXQsIG1vZC0+aW5pdF9zaXplKSB8fAotCQkgICAgd2l0aGluKGFkZHIsIG1vZC0+bW9kdWxlX2NvcmUsIG1vZC0+Y29yZV9zaXplKSkgeworCQlpZiAod2l0aGluX21vZHVsZV9pbml0KGFkZHIsIG1vZCkgfHwKKwkJICAgIHdpdGhpbl9tb2R1bGVfY29yZShhZGRyLCBtb2QpKSB7CiAJCQljb25zdCBjaGFyICpzeW07CiAKIAkJCXN5bSA9IGdldF9rc3ltYm9sKG1vZCwgYWRkciwgTlVMTCwgTlVMTCk7CkBAIC0yNDcxLDggKzI0ODksOCBAQAogCiAJcHJlZW1wdF9kaXNhYmxlKCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UobW9kLCAmbW9kdWxlcywgbGlzdCkgewotCQlpZiAod2l0aGluKGFkZHIsIG1vZC0+bW9kdWxlX2luaXQsIG1vZC0+aW5pdF9zaXplKSB8fAotCQkgICAgd2l0aGluKGFkZHIsIG1vZC0+bW9kdWxlX2NvcmUsIG1vZC0+Y29yZV9zaXplKSkgeworCQlpZiAod2l0aGluX21vZHVsZV9pbml0KGFkZHIsIG1vZCkgfHwKKwkJICAgIHdpdGhpbl9tb2R1bGVfY29yZShhZGRyLCBtb2QpKSB7CiAJCQljb25zdCBjaGFyICpzeW07CiAKIAkJCXN5bSA9IGdldF9rc3ltYm9sKG1vZCwgYWRkciwgc2l6ZSwgb2Zmc2V0KTsKQEAgLTI1MDQsNyArMjUyMiw3IEBACiAJCQlzdHJsY3B5KG5hbWUsIG1vZC0+c3RydGFiICsgbW9kLT5zeW10YWJbc3ltbnVtXS5zdF9uYW1lLAogCQkJCUtTWU1fTkFNRV9MRU4pOwogCQkJc3RybGNweShtb2R1bGVfbmFtZSwgbW9kLT5uYW1lLCBNT0RVTEVfTkFNRV9MRU4pOwotCQkJKmV4cG9ydGVkID0gaXNfZXhwb3J0ZWQobmFtZSwgbW9kKTsKKwkJCSpleHBvcnRlZCA9IGlzX2V4cG9ydGVkKG5hbWUsICp2YWx1ZSwgbW9kKTsKIAkJCXByZWVtcHRfZW5hYmxlKCk7CiAJCQlyZXR1cm4gMDsKIAkJfQpAQCAtMjY5MSw3ICsyNzA5LDcgQEAKIAlwcmVlbXB0X2Rpc2FibGUoKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KG1vZCwgJm1vZHVsZXMsIGxpc3QpIHsKLQkJaWYgKHdpdGhpbihhZGRyLCBtb2QtPm1vZHVsZV9jb3JlLCBtb2QtPmNvcmVfc2l6ZSkpIHsKKwkJaWYgKHdpdGhpbl9tb2R1bGVfY29yZShhZGRyLCBtb2QpKSB7CiAJCQlwcmVlbXB0X2VuYWJsZSgpOwogCQkJcmV0dXJuIDE7CiAJCX0KZGlmZiAtLWdpdCBhL2tlcm5lbC9uc19jZ3JvdXAuYyBiL2tlcm5lbC9uc19jZ3JvdXAuYwppbmRleCA0M2MyMTExLi43OGJjM2ZkIDEwMDY0NAotLS0gYS9rZXJuZWwvbnNfY2dyb3VwLmMKKysrIGIva2VybmVsL25zX2Nncm91cC5jCkBAIC0xMyw3ICsxMyw2IEBACiAKIHN0cnVjdCBuc19jZ3JvdXAgewogCXN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlIGNzczsKLQlzcGlubG9ja190IGxvY2s7CiB9OwogCiBzdHJ1Y3QgY2dyb3VwX3N1YnN5cyBuc19zdWJzeXM7CkBAIC04NCw3ICs4Myw2IEBACiAJbnNfY2dyb3VwID0ga3phbGxvYyhzaXplb2YoKm5zX2Nncm91cCksIEdGUF9LRVJORUwpOwogCWlmICghbnNfY2dyb3VwKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQlzcGluX2xvY2tfaW5pdCgmbnNfY2dyb3VwLT5sb2NrKTsKIAlyZXR1cm4gJm5zX2Nncm91cC0+Y3NzOwogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvcGFuaWMuYyBiL2tlcm5lbC9wYW5pYy5jCmluZGV4IDEzZjA2MzQuLjJhMmZmMzYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wYW5pYy5jCisrKyBiL2tlcm5lbC9wYW5pYy5jCkBAIC0yOTksNiArMjk5LDggQEAKIHsKIAlpZiAoIW9vcHNfaWQpCiAJCWdldF9yYW5kb21fYnl0ZXMoJm9vcHNfaWQsIHNpemVvZihvb3BzX2lkKSk7CisJZWxzZQorCQlvb3BzX2lkKys7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9waWQuYyBiL2tlcm5lbC9waWQuYwppbmRleCAwNjRlNzZhLi4xYjM1ODZmIDEwMDY0NAotLS0gYS9rZXJuZWwvcGlkLmMKKysrIGIva2VybmVsL3BpZC5jCkBAIC00NzQsOCArNDc0LDE0IEBACiB9CiBFWFBPUlRfU1lNQk9MKHRhc2tfc2Vzc2lvbl9ucl9ucyk7CiAKK3N0cnVjdCBwaWRfbmFtZXNwYWNlICp0YXNrX2FjdGl2ZV9waWRfbnMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisJcmV0dXJuIG5zX29mX3BpZCh0YXNrX3BpZCh0c2spKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHRhc2tfYWN0aXZlX3BpZF9ucyk7CisKIC8qCi0gKiBVc2VkIGJ5IHByb2MgdG8gZmluZCB0aGUgZmlyc3QgcGlkIHRoYXQgaXMgZ3JlYXRlciB0aGVuIG9yIGVxdWFsIHRvIG5yLgorICogVXNlZCBieSBwcm9jIHRvIGZpbmQgdGhlIGZpcnN0IHBpZCB0aGF0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBuci4KICAqCiAgKiBJZiB0aGVyZSBpcyBhIHBpZCBhdCBuciB0aGlzIGZ1bmN0aW9uIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgZmluZF9waWRfbnMuCiAgKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9tYWluLmMgYi9rZXJuZWwvcG93ZXIvbWFpbi5jCmluZGV4IDYxM2YxNjkuLjIzOTk4ODggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9tYWluLmMKKysrIGIva2VybmVsL3Bvd2VyL21haW4uYwpAQCAtNjE1LDcgKzYxNSw3IEBACiAJLyogdGhpcyBtYXkgZmFpbCBpZiB0aGUgUlRDIGhhc24ndCBiZWVuIGluaXRpYWxpemVkICovCiAJc3RhdHVzID0gcnRjX3JlYWRfdGltZShydGMsICZhbG0udGltZSk7CiAJaWYgKHN0YXR1cyA8IDApIHsKLQkJcHJpbnRrKGVycl9yZWFkdGltZSwgcnRjLT5kZXYuYnVzX2lkLCBzdGF0dXMpOworCQlwcmludGsoZXJyX3JlYWR0aW1lLCBkZXZfbmFtZSgmcnRjLT5kZXYpLCBzdGF0dXMpOwogCQlyZXR1cm47CiAJfQogCXJ0Y190bV90b190aW1lKCZhbG0udGltZSwgJm5vdyk7CkBAIC02MjYsNyArNjI2LDcgQEAKIAogCXN0YXR1cyA9IHJ0Y19zZXRfYWxhcm0ocnRjLCAmYWxtKTsKIAlpZiAoc3RhdHVzIDwgMCkgewotCQlwcmludGsoZXJyX3dha2VhbGFybSwgcnRjLT5kZXYuYnVzX2lkLCBzdGF0dXMpOworCQlwcmludGsoZXJyX3dha2VhbGFybSwgZGV2X25hbWUoJnJ0Yy0+ZGV2KSwgc3RhdHVzKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNjYwLDcgKzY2MCw3IEBACiAJaWYgKCFkZXZpY2VfbWF5X3dha2V1cChjYW5kaWRhdGUtPmRldi5wYXJlbnQpKQogCQlyZXR1cm4gMDsKIAotCSooY2hhciAqKiluYW1lX3B0ciA9IGRldi0+YnVzX2lkOworCSooY29uc3QgY2hhciAqKiluYW1lX3B0ciA9IGRldl9uYW1lKGRldik7CiAJcmV0dXJuIDE7CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9wcmludGsuYyBiL2tlcm5lbC9wcmludGsuYwppbmRleCBlNjUxYWIwLi43MDE1NzMzIDEwMDY0NAotLS0gYS9rZXJuZWwvcHJpbnRrLmMKKysrIGIva2VybmVsL3ByaW50ay5jCkBAIC02MTksNyArNjE5LDcgQEAKIHN0YXRpYyBjb25zdCBjaGFyIHJlY3Vyc2lvbl9idWdfbXNnIFtdID0KIAkJS0VSTl9DUklUICJCVUc6IHJlY2VudCBwcmludGsgcmVjdXJzaW9uIVxuIjsKIHN0YXRpYyBpbnQgcmVjdXJzaW9uX2J1ZzsKLQlzdGF0aWMgaW50IG5ld190ZXh0X2xpbmUgPSAxOworc3RhdGljIGludCBuZXdfdGV4dF9saW5lID0gMTsKIHN0YXRpYyBjaGFyIHByaW50a19idWZbMTAyNF07CiAKIGFzbWxpbmthZ2UgaW50IHZwcmludGsoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpCmRpZmYgLS1naXQgYS9rZXJuZWwvcHJvZmlsZS5jIGIva2VybmVsL3Byb2ZpbGUuYwppbmRleCBkMThlMmQyLi43ODQ5MzNhYyAxMDA2NDQKLS0tIGEva2VybmVsL3Byb2ZpbGUuYworKysgYi9rZXJuZWwvcHJvZmlsZS5jCkBAIC00NDUsNyArNDQ1LDYgQEAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KIAogc3RhdGljIGludCBwcm9mX2NwdV9tYXNrX3JlYWRfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKIAkJCWludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1cGRhdGUuYyBiL2tlcm5lbC9yY3VwZGF0ZS5jCmluZGV4IGFkNjNhZjguLmQ5MmE3NmEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yY3VwZGF0ZS5jCisrKyBiL2tlcm5lbC9yY3VwZGF0ZS5jCkBAIC03Nyw4ICs3NywxNSBAQAogICogc2VjdGlvbnMgYXJlIGRlbGltaXRlZCBieSByY3VfcmVhZF9sb2NrKCkgYW5kIHJjdV9yZWFkX3VubG9jaygpLAogICogYW5kIG1heSBiZSBuZXN0ZWQuCiAgKi8KLXZvaWQgc3luY2hyb25pemVfcmN1KHZvaWQpOwkvKiBNYWtlcyBrZXJuZWwtZG9jIHRvb2xzIGhhcHB5ICovCi1zeW5jaHJvbml6ZV9yY3VfeHh4KHN5bmNocm9uaXplX3JjdSwgY2FsbF9yY3UpCit2b2lkIHN5bmNocm9uaXplX3JjdSh2b2lkKQoreworCXN0cnVjdCByY3Vfc3luY2hyb25pemUgcmN1OworCWluaXRfY29tcGxldGlvbigmcmN1LmNvbXBsZXRpb24pOworCS8qIFdpbGwgd2FrZSBtZSBhZnRlciBSQ1UgZmluaXNoZWQuICovCisJY2FsbF9yY3UoJnJjdS5oZWFkLCB3YWtlbWVfYWZ0ZXJfcmN1KTsKKwkvKiBXYWl0IGZvciBpdC4gKi8KKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZyY3UuY29tcGxldGlvbik7Cit9CiBFWFBPUlRfU1lNQk9MX0dQTChzeW5jaHJvbml6ZV9yY3UpOwogCiBzdGF0aWMgdm9pZCByY3VfYmFycmllcl9jYWxsYmFjayhzdHJ1Y3QgcmN1X2hlYWQgKm5vdHVzZWQpCmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1cHJlZW1wdC5jIGIva2VybmVsL3JjdXByZWVtcHQuYwppbmRleCBmOWRjOGYzLi4zM2NmYzUwIDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1cHJlZW1wdC5jCisrKyBiL2tlcm5lbC9yY3VwcmVlbXB0LmMKQEAgLTExNzcsNyArMTE3NywxNiBAQAogICogaW4gLXJ0IHRoaXMgZG9lcyAtbm90LSBuZWNlc3NhcmlseSByZXN1bHQgaW4gYWxsIGN1cnJlbnRseSBleGVjdXRpbmcKICAqIGludGVycnVwdCAtaGFuZGxlcnMtIGhhdmluZyBjb21wbGV0ZWQuCiAgKi8KLXN5bmNocm9uaXplX3JjdV94eHgoX19zeW5jaHJvbml6ZV9zY2hlZCwgY2FsbF9yY3Vfc2NoZWQpCit2b2lkIF9fc3luY2hyb25pemVfc2NoZWQodm9pZCkKK3sKKwlzdHJ1Y3QgcmN1X3N5bmNocm9uaXplIHJjdTsKKworCWluaXRfY29tcGxldGlvbigmcmN1LmNvbXBsZXRpb24pOworCS8qIFdpbGwgd2FrZSBtZSBhZnRlciBSQ1UgZmluaXNoZWQuICovCisJY2FsbF9yY3Vfc2NoZWQoJnJjdS5oZWFkLCB3YWtlbWVfYWZ0ZXJfcmN1KTsKKwkvKiBXYWl0IGZvciBpdC4gKi8KKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZyY3UuY29tcGxldGlvbik7Cit9CiBFWFBPUlRfU1lNQk9MX0dQTChfX3N5bmNocm9uaXplX3NjaGVkKTsKIAogLyoKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3V0b3J0dXJlLmMgYi9rZXJuZWwvcmN1dG9ydHVyZS5jCmluZGV4IDMyNDViNDAuLjFjZmYyOGQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yY3V0b3J0dXJlLmMKKysrIGIva2VybmVsL3JjdXRvcnR1cmUuYwpAQCAtMTM2LDcgKzEzNiw3IEBACiAjZW5kaWYKIGludCByY3V0b3J0dXJlX3J1bm5hYmxlID0gUkNVVE9SVFVSRV9SVU5OQUJMRV9JTklUOwogCi0jZGVmaW5lIEZVTExTVE9QX1NJR05BTEVEIDEJLyogQmFpbCBkdWUgdG8gc2lnbmFsLiAqLworI2RlZmluZSBGVUxMU1RPUF9TSFVURE9XTiAxCS8qIEJhaWwgZHVlIHRvIHN5c3RlbSBzaHV0ZG93bi9wYW5pYy4gKi8KICNkZWZpbmUgRlVMTFNUT1BfQ0xFQU5VUCAgMgkvKiBPcmRlcmx5IHNodXRkb3duLiAqLwogc3RhdGljIGludCBmdWxsc3RvcDsJCS8qIHN0b3AgZ2VuZXJhdGluZyBjYWxsYmFja3MgYXQgdGVzdCBlbmQuICovCiBERUZJTkVfTVVURVgoZnVsbHN0b3BfbXV0ZXgpOwkvKiBwcm90ZWN0IGZ1bGxzdG9wIHRyYW5zaXRpb25zIGFuZCAqLwpAQCAtMTUxLDEyICsxNTEsMTAgQEAKIHsKIAlpZiAoZnVsbHN0b3ApCiAJCXJldHVybiBOT1RJRllfRE9ORTsKLQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJbXV0ZXhfbG9jaygmZnVsbHN0b3BfbXV0ZXgpOwotCQlpZiAoIUFDQ0VTU19PTkNFKGZ1bGxzdG9wKSkKLQkJCWZ1bGxzdG9wID0gRlVMTFNUT1BfU0lHTkFMRUQ7Ci0JCW11dGV4X3VubG9jaygmZnVsbHN0b3BfbXV0ZXgpOwotCX0KKwltdXRleF9sb2NrKCZmdWxsc3RvcF9tdXRleCk7CisJaWYgKCFmdWxsc3RvcCkKKwkJZnVsbHN0b3AgPSBGVUxMU1RPUF9TSFVURE9XTjsKKwltdXRleF91bmxvY2soJmZ1bGxzdG9wX211dGV4KTsKIAlyZXR1cm4gTk9USUZZX0RPTkU7CiB9CiAKQEAgLTYyNCw3ICs2MjIsNyBAQAogCQlyY3Vfc3R1dHRlcl93YWl0KCk7CiAJfSB3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSAmJiAhZnVsbHN0b3ApOwogCVZFUkJPU0VfUFJJTlRLX1NUUklORygicmN1X3RvcnR1cmVfd3JpdGVyIHRhc2sgc3RvcHBpbmciKTsKLQl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSAmJiBmdWxsc3RvcCAhPSBGVUxMU1RPUF9TSUdOQUxFRCkKKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSAmJiBmdWxsc3RvcCAhPSBGVUxMU1RPUF9TSFVURE9XTikKIAkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CiAJcmV0dXJuIDA7CiB9CkBAIC02NDksNyArNjQ3LDcgQEAKIAl9IHdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpICYmICFmdWxsc3RvcCk7CiAKIAlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX2Zha2V3cml0ZXIgdGFzayBzdG9wcGluZyIpOwotCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpICYmIGZ1bGxzdG9wICE9IEZVTExTVE9QX1NJR05BTEVEKQorCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpICYmIGZ1bGxzdG9wICE9IEZVTExTVE9QX1NIVVRET1dOKQogCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTc1OSw3ICs3NTcsNyBAQAogCVZFUkJPU0VfUFJJTlRLX1NUUklORygicmN1X3RvcnR1cmVfcmVhZGVyIHRhc2sgc3RvcHBpbmciKTsKIAlpZiAoaXJxcmVhZGVyICYmIGN1cl9vcHMtPmlycWNhcGFibGUpCiAJCWRlbF90aW1lcl9zeW5jKCZ0KTsKLQl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSAmJiBmdWxsc3RvcCAhPSBGVUxMU1RPUF9TSUdOQUxFRCkKKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSAmJiBmdWxsc3RvcCAhPSBGVUxMU1RPUF9TSFVURE9XTikKIAkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1dHJlZS5jIGIva2VybmVsL3JjdXRyZWUuYwppbmRleCBhMzQyYjAzLi5mMmQ4NjM4IDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1dHJlZS5jCisrKyBiL2tlcm5lbC9yY3V0cmVlLmMKQEAgLTc5LDcgKzc5LDEwIEBACiBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcmN1X2RhdGEsIHJjdV9iaF9kYXRhKTsKIAogI2lmZGVmIENPTkZJR19OT19IWgotREVGSU5FX1BFUl9DUFUoc3RydWN0IHJjdV9keW50aWNrcywgcmN1X2R5bnRpY2tzKTsKK0RFRklORV9QRVJfQ1BVKHN0cnVjdCByY3VfZHludGlja3MsIHJjdV9keW50aWNrcykgPSB7CisJLmR5bnRpY2tzX25lc3RpbmcgPSAxLAorCS5keW50aWNrcyA9IDEsCit9OwogI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfTk9fSFogKi8KIAogc3RhdGljIGludCBibGltaXQgPSAxMDsJCS8qIE1heGltdW0gY2FsbGJhY2tzIHBlciBzb2Z0aXJxLiAqLwpAQCAtNTcyLDYgKzU3NSw3IEBACiAJLyogU3BlY2lhbC1jYXNlIHRoZSBjb21tb24gc2luZ2xlLWxldmVsIGNhc2UuICovCiAJaWYgKE5VTV9SQ1VfTk9ERVMgPT0gMSkgewogCQlybnAtPnFzbWFzayA9IHJucC0+cXNtYXNraW5pdDsKKwkJcnNwLT5zaWduYWxlZCA9IFJDVV9TSUdOQUxfSU5JVDsgLyogZm9yY2VfcXVpZXNjZW50X3N0YXRlIE9LLiAqLwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZybnAtPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOwogCX0KQEAgLTEzNzksMTMgKzEzODMsNiBAQAogCiBzdGF0aWMgdm9pZCBfX2NwdWluaXQgcmN1X29ubGluZV9jcHUoaW50IGNwdSkKIHsKLSNpZmRlZiBDT05GSUdfTk9fSFoKLQlzdHJ1Y3QgcmN1X2R5bnRpY2tzICpyZHRwID0gJnBlcl9jcHUocmN1X2R5bnRpY2tzLCBjcHUpOwotCi0JcmR0cC0+ZHludGlja3NfbmVzdGluZyA9IDE7Ci0JcmR0cC0+ZHludGlja3MgfD0gMTsgCS8qIG5lZWQgY29uc2VjdXRpdmUgI3MgZXZlbiBmb3IgaG90cGx1Zy4gKi8KLQlyZHRwLT5keW50aWNrc19ubWkgPSAocmR0cC0+ZHludGlja3Nfbm1pICsgMSkgJiB+MHgxOwotI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfTk9fSFogKi8KIAlyY3VfaW5pdF9wZXJjcHVfZGF0YShjcHUsICZyY3Vfc3RhdGUpOwogCXJjdV9pbml0X3BlcmNwdV9kYXRhKGNwdSwgJnJjdV9iaF9zdGF0ZSk7CiAJb3Blbl9zb2Z0aXJxKFJDVV9TT0ZUSVJRLCByY3VfcHJvY2Vzc19jYWxsYmFja3MpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3Jlc19jb3VudGVyLmMgYi9rZXJuZWwvcmVzX2NvdW50ZXIuYwppbmRleCBmMjc1YzhlLi5iZjhlNzUzIDEwMDY0NAotLS0gYS9rZXJuZWwvcmVzX2NvdW50ZXIuYworKysgYi9rZXJuZWwvcmVzX2NvdW50ZXIuYwpAQCAtMTUsMTAgKzE1LDExIEBACiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAKLXZvaWQgcmVzX2NvdW50ZXJfaW5pdChzdHJ1Y3QgcmVzX2NvdW50ZXIgKmNvdW50ZXIpCit2b2lkIHJlc19jb3VudGVyX2luaXQoc3RydWN0IHJlc19jb3VudGVyICpjb3VudGVyLCBzdHJ1Y3QgcmVzX2NvdW50ZXIgKnBhcmVudCkKIHsKIAlzcGluX2xvY2tfaW5pdCgmY291bnRlci0+bG9jayk7CiAJY291bnRlci0+bGltaXQgPSAodW5zaWduZWQgbG9uZyBsb25nKUxMT05HX01BWDsKKwljb3VudGVyLT5wYXJlbnQgPSBwYXJlbnQ7CiB9CiAKIGludCByZXNfY291bnRlcl9jaGFyZ2VfbG9ja2VkKHN0cnVjdCByZXNfY291bnRlciAqY291bnRlciwgdW5zaWduZWQgbG9uZyB2YWwpCkBAIC0zNCwxNCArMzUsMzQgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHJlc19jb3VudGVyX2NoYXJnZShzdHJ1Y3QgcmVzX2NvdW50ZXIgKmNvdW50ZXIsIHVuc2lnbmVkIGxvbmcgdmFsKQoraW50IHJlc19jb3VudGVyX2NoYXJnZShzdHJ1Y3QgcmVzX2NvdW50ZXIgKmNvdW50ZXIsIHVuc2lnbmVkIGxvbmcgdmFsLAorCQkJc3RydWN0IHJlc19jb3VudGVyICoqbGltaXRfZmFpbF9hdCkKIHsKIAlpbnQgcmV0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHJlc19jb3VudGVyICpjLCAqdTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZjb3VudGVyLT5sb2NrLCBmbGFncyk7Ci0JcmV0ID0gcmVzX2NvdW50ZXJfY2hhcmdlX2xvY2tlZChjb3VudGVyLCB2YWwpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvdW50ZXItPmxvY2ssIGZsYWdzKTsKKwkqbGltaXRfZmFpbF9hdCA9IE5VTEw7CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWZvciAoYyA9IGNvdW50ZXI7IGMgIT0gTlVMTDsgYyA9IGMtPnBhcmVudCkgeworCQlzcGluX2xvY2soJmMtPmxvY2spOworCQlyZXQgPSByZXNfY291bnRlcl9jaGFyZ2VfbG9ja2VkKGMsIHZhbCk7CisJCXNwaW5fdW5sb2NrKCZjLT5sb2NrKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCSpsaW1pdF9mYWlsX2F0ID0gYzsKKwkJCWdvdG8gdW5kbzsKKwkJfQorCX0KKwlyZXQgPSAwOworCWdvdG8gZG9uZTsKK3VuZG86CisJZm9yICh1ID0gY291bnRlcjsgdSAhPSBjOyB1ID0gdS0+cGFyZW50KSB7CisJCXNwaW5fbG9jaygmdS0+bG9jayk7CisJCXJlc19jb3VudGVyX3VuY2hhcmdlX2xvY2tlZCh1LCB2YWwpOworCQlzcGluX3VubG9jaygmdS0+bG9jayk7CisJfQorZG9uZToKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNTYsMTAgKzc3LDE1IEBACiB2b2lkIHJlc19jb3VudGVyX3VuY2hhcmdlKHN0cnVjdCByZXNfY291bnRlciAqY291bnRlciwgdW5zaWduZWQgbG9uZyB2YWwpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcmVzX2NvdW50ZXIgKmM7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmY291bnRlci0+bG9jaywgZmxhZ3MpOwotCXJlc19jb3VudGVyX3VuY2hhcmdlX2xvY2tlZChjb3VudGVyLCB2YWwpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvdW50ZXItPmxvY2ssIGZsYWdzKTsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJZm9yIChjID0gY291bnRlcjsgYyAhPSBOVUxMOyBjID0gYy0+cGFyZW50KSB7CisJCXNwaW5fbG9jaygmYy0+bG9jayk7CisJCXJlc19jb3VudGVyX3VuY2hhcmdlX2xvY2tlZChjLCB2YWwpOworCQlzcGluX3VubG9jaygmYy0+bG9jayk7CisJfQorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAogCmRpZmYgLS1naXQgYS9rZXJuZWwvcmVzb3VyY2UuYyBiL2tlcm5lbC9yZXNvdXJjZS5jCmluZGV4IGU2MzMxMDYuLmNhNmExNTMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yZXNvdXJjZS5jCisrKyBiL2tlcm5lbC9yZXNvdXJjZS5jCkBAIC02MjMsNyArNjIzLDcgQEAKICAqLwogc3RydWN0IHJlc291cmNlICogX19yZXF1ZXN0X3JlZ2lvbihzdHJ1Y3QgcmVzb3VyY2UgKnBhcmVudCwKIAkJCQkgICByZXNvdXJjZV9zaXplX3Qgc3RhcnQsIHJlc291cmNlX3NpemVfdCBuLAotCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUpCisJCQkJICAgY29uc3QgY2hhciAqbmFtZSwgaW50IGZsYWdzKQogewogCXN0cnVjdCByZXNvdXJjZSAqcmVzID0ga3phbGxvYyhzaXplb2YoKnJlcyksIEdGUF9LRVJORUwpOwogCkBAIC02MzQsNiArNjM0LDcgQEAKIAlyZXMtPnN0YXJ0ID0gc3RhcnQ7CiAJcmVzLT5lbmQgPSBzdGFydCArIG4gLSAxOwogCXJlcy0+ZmxhZ3MgPSBJT1JFU09VUkNFX0JVU1k7CisJcmVzLT5mbGFncyB8PSBmbGFnczsKIAogCXdyaXRlX2xvY2soJnJlc291cmNlX2xvY2spOwogCkBAIC02NzksNyArNjgwLDcgQEAKIHsKIAlzdHJ1Y3QgcmVzb3VyY2UgKiByZXM7CiAKLQlyZXMgPSBfX3JlcXVlc3RfcmVnaW9uKHBhcmVudCwgc3RhcnQsIG4sICJjaGVjay1yZWdpb24iKTsKKwlyZXMgPSBfX3JlcXVlc3RfcmVnaW9uKHBhcmVudCwgc3RhcnQsIG4sICJjaGVjay1yZWdpb24iLCAwKTsKIAlpZiAoIXJlcykKIAkJcmV0dXJuIC1FQlVTWTsKIApAQCAtNzc2LDcgKzc3Nyw3IEBACiAJZHItPnN0YXJ0ID0gc3RhcnQ7CiAJZHItPm4gPSBuOwogCi0JcmVzID0gX19yZXF1ZXN0X3JlZ2lvbihwYXJlbnQsIHN0YXJ0LCBuLCBuYW1lKTsKKwlyZXMgPSBfX3JlcXVlc3RfcmVnaW9uKHBhcmVudCwgc3RhcnQsIG4sIG5hbWUsIDApOwogCWlmIChyZXMpCiAJCWRldnJlc19hZGQoZGV2LCBkcik7CiAJZWxzZQpAQCAtODc2LDMgKzg3Nyw1NyBAQAogCiAJcmV0dXJuIGVycjsKIH0KKworI2lmZGVmIENPTkZJR19TVFJJQ1RfREVWTUVNCitzdGF0aWMgaW50IHN0cmljdF9pb21lbV9jaGVja3MgPSAxOworI2Vsc2UKK3N0YXRpYyBpbnQgc3RyaWN0X2lvbWVtX2NoZWNrczsKKyNlbmRpZgorCisvKgorICogY2hlY2sgaWYgYW4gYWRkcmVzcyBpcyByZXNlcnZlZCBpbiB0aGUgaW9tZW0gcmVzb3VyY2UgdHJlZQorICogcmV0dXJucyAxIGlmIHJlc2VydmVkLCAwIGlmIG5vdCByZXNlcnZlZC4KKyAqLworaW50IGlvbWVtX2lzX2V4Y2x1c2l2ZSh1NjQgYWRkcikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnAgPSAmaW9tZW1fcmVzb3VyY2U7CisJaW50IGVyciA9IDA7CisJbG9mZl90IGw7CisJaW50IHNpemUgPSBQQUdFX1NJWkU7CisKKwlpZiAoIXN0cmljdF9pb21lbV9jaGVja3MpCisJCXJldHVybiAwOworCisJYWRkciA9IGFkZHIgJiBQQUdFX01BU0s7CisKKwlyZWFkX2xvY2soJnJlc291cmNlX2xvY2spOworCWZvciAocCA9IHAtPmNoaWxkOyBwIDsgcCA9IHJfbmV4dChOVUxMLCBwLCAmbCkpIHsKKwkJLyoKKwkJICogV2UgY2FuIHByb2JhYmx5IHNraXAgdGhlIHJlc291cmNlcyB3aXRob3V0CisJCSAqIElPUkVTT1VSQ0VfSU8gYXR0cmlidXRlPworCQkgKi8KKwkJaWYgKHAtPnN0YXJ0ID49IGFkZHIgKyBzaXplKQorCQkJYnJlYWs7CisJCWlmIChwLT5lbmQgPCBhZGRyKQorCQkJY29udGludWU7CisJCWlmIChwLT5mbGFncyAmIElPUkVTT1VSQ0VfQlVTWSAmJgorCQkgICAgIHAtPmZsYWdzICYgSU9SRVNPVVJDRV9FWENMVVNJVkUpIHsKKwkJCWVyciA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZWFkX3VubG9jaygmcmVzb3VyY2VfbG9jayk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzdHJpY3RfaW9tZW0oY2hhciAqc3RyKQoreworCWlmIChzdHJzdHIoc3RyLCAicmVsYXhlZCIpKQorCQlzdHJpY3RfaW9tZW1fY2hlY2tzID0gMDsKKwlpZiAoc3Ryc3RyKHN0ciwgInN0cmljdCIpKQorCQlzdHJpY3RfaW9tZW1fY2hlY2tzID0gMTsKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgiaW9tZW09Iiwgc3RyaWN0X2lvbWVtKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC5jIGIva2VybmVsL3NjaGVkLmMKaW5kZXggNTQ1YzZmYy4uZGViNWFjOCAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkLmMKKysrIGIva2VybmVsL3NjaGVkLmMKQEAgLTM3MjgsOCArMzcyOCwxMyBAQAogCQl9CiAKIAkJZG91YmxlX3VubG9ja19iYWxhbmNlKHRoaXNfcnEsIGJ1c2llc3QpOworCQkvKgorCQkgKiBTaG91bGQgbm90IGNhbGwgdHR3dSB3aGlsZSBob2xkaW5nIGEgcnEtPmxvY2sKKwkJICovCisJCXNwaW5fdW5sb2NrKCZ0aGlzX3JxLT5sb2NrKTsKIAkJaWYgKGFjdGl2ZV9iYWxhbmNlKQogCQkJd2FrZV91cF9wcm9jZXNzKGJ1c2llc3QtPm1pZ3JhdGlvbl90aHJlYWQpOworCQlzcGluX2xvY2soJnRoaXNfcnEtPmxvY2spOwogCiAJfSBlbHNlCiAJCXNkLT5ucl9iYWxhbmNlX2ZhaWxlZCA9IDA7CkBAIC02OTU3LDcgKzY5NjIsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJxLT5sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBpbnQgaW5pdF9yb290ZG9tYWluKHN0cnVjdCByb290X2RvbWFpbiAqcmQsIGJvb2wgYm9vdG1lbSkKK3N0YXRpYyBpbnQgX19pbml0X3JlZm9rIGluaXRfcm9vdGRvbWFpbihzdHJ1Y3Qgcm9vdF9kb21haW4gKnJkLCBib29sIGJvb3RtZW0pCiB7CiAJbWVtc2V0KHJkLCAwLCBzaXplb2YoKnJkKSk7CiAKQEAgLTY5NzAsNyArNjk3NSw3IEBACiAJfQogCiAJaWYgKCFhbGxvY19jcHVtYXNrX3ZhcigmcmQtPnNwYW4sIEdGUF9LRVJORUwpKQotCQlnb3RvIGZyZWVfcmQ7CisJCWdvdG8gb3V0OwogCWlmICghYWxsb2NfY3B1bWFza192YXIoJnJkLT5vbmxpbmUsIEdGUF9LRVJORUwpKQogCQlnb3RvIGZyZWVfc3BhbjsKIAlpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKCZyZC0+cnRvX21hc2ssIEdGUF9LRVJORUwpKQpAQCAtNjk4Niw4ICs2OTkxLDcgQEAKIAlmcmVlX2NwdW1hc2tfdmFyKHJkLT5vbmxpbmUpOwogZnJlZV9zcGFuOgogCWZyZWVfY3B1bWFza192YXIocmQtPnNwYW4pOwotZnJlZV9yZDoKLQlrZnJlZShyZCk7CitvdXQ6CiAJcmV0dXJuIC1FTk9NRU07CiB9CiAKQEAgLTc5ODcsNyArNzk5MSw3IEBACiB9CiAKICNpZiBkZWZpbmVkKENPTkZJR19TQ0hFRF9NQykgfHwgZGVmaW5lZChDT05GSUdfU0NIRURfU01UKQotaW50IGFyY2hfcmVpbml0X3NjaGVkX2RvbWFpbnModm9pZCkKK3N0YXRpYyB2b2lkIGFyY2hfcmVpbml0X3NjaGVkX2RvbWFpbnModm9pZCkKIHsKIAlnZXRfb25saW5lX2NwdXMoKTsKIApAQCAtNzk5NiwxMyArODAwMCwxMCBAQAogCiAJcmVidWlsZF9zY2hlZF9kb21haW5zKCk7CiAJcHV0X29ubGluZV9jcHVzKCk7Ci0KLQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHNzaXplX3Qgc2NoZWRfcG93ZXJfc2F2aW5nc19zdG9yZShjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IHNtdCkKIHsKLQlpbnQgcmV0OwogCXVuc2lnbmVkIGludCBsZXZlbCA9IDA7CiAKIAlpZiAoc3NjYW5mKGJ1ZiwgIiV1IiwgJmxldmVsKSAhPSAxKQpAQCAtODAyMyw5ICs4MDI0LDkgQEAKIAllbHNlCiAJCXNjaGVkX21jX3Bvd2VyX3NhdmluZ3MgPSBsZXZlbDsKIAotCXJldCA9IGFyY2hfcmVpbml0X3NjaGVkX2RvbWFpbnMoKTsKKwlhcmNoX3JlaW5pdF9zY2hlZF9kb21haW5zKCk7CiAKLQlyZXR1cm4gcmV0ID8gcmV0IDogY291bnQ7CisJcmV0dXJuIGNvdW50OwogfQogCiAjaWZkZWYgQ09ORklHX1NDSEVEX01DCkBAIC04MDYwLDcgKzgwNjEsNyBAQAogCQkgICBzY2hlZF9zbXRfcG93ZXJfc2F2aW5nc19zdG9yZSk7CiAjZW5kaWYKIAotaW50IHNjaGVkX2NyZWF0ZV9zeXNmc19wb3dlcl9zYXZpbmdzX2VudHJpZXMoc3RydWN0IHN5c2Rldl9jbGFzcyAqY2xzKQoraW50IF9faW5pdCBzY2hlZF9jcmVhdGVfc3lzZnNfcG93ZXJfc2F2aW5nc19lbnRyaWVzKHN0cnVjdCBzeXNkZXZfY2xhc3MgKmNscykKIHsKIAlpbnQgZXJyID0gMDsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkX2Nsb2NrLmMgYi9rZXJuZWwvc2NoZWRfY2xvY2suYwppbmRleCBlOGFiMDk2Li5hMGIwODUyIDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWRfY2xvY2suYworKysgYi9rZXJuZWwvc2NoZWRfY2xvY2suYwpAQCAtMTI0LDcgKzEyNCw3IEBACiAKIAljbG9jayA9IHNjZC0+dGlja19ndG9kICsgZGVsdGE7CiAJbWluX2Nsb2NrID0gd3JhcF9tYXgoc2NkLT50aWNrX2d0b2QsIHNjZC0+Y2xvY2spOwotCW1heF9jbG9jayA9IHNjZC0+dGlja19ndG9kICsgVElDS19OU0VDOworCW1heF9jbG9jayA9IHdyYXBfbWF4KHNjZC0+Y2xvY2ssIHNjZC0+dGlja19ndG9kICsgVElDS19OU0VDKTsKIAogCWNsb2NrID0gd3JhcF9tYXgoY2xvY2ssIG1pbl9jbG9jayk7CiAJY2xvY2sgPSB3cmFwX21pbihjbG9jaywgbWF4X2Nsb2NrKTsKQEAgLTIyNyw2ICsyMjcsOSBAQAogICovCiB2b2lkIHNjaGVkX2Nsb2NrX2lkbGVfd2FrZXVwX2V2ZW50KHU2NCBkZWx0YV9ucykKIHsKKwlpZiAodGltZWtlZXBpbmdfc3VzcGVuZGVkKQorCQlyZXR1cm47CisKIAlzY2hlZF9jbG9ja190aWNrKCk7CiAJdG91Y2hfc29mdGxvY2t1cF93YXRjaGRvZygpOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkX2NwdXByaS5jIGIva2VybmVsL3NjaGVkX2NwdXByaS5jCmluZGV4IDAxOGI3YmUuLjFlMDBiZmEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZF9jcHVwcmkuYworKysgYi9rZXJuZWwvc2NoZWRfY3B1cHJpLmMKQEAgLTE1MSw3ICsxNTEsNyBAQAogICoKICAqIFJldHVybnM6IC1FTk9NRU0gaWYgbWVtb3J5IGZhaWxzLgogICovCi1pbnQgY3B1cHJpX2luaXQoc3RydWN0IGNwdXByaSAqY3AsIGJvb2wgYm9vdG1lbSkKK2ludCBfX2luaXRfcmVmb2sgY3B1cHJpX2luaXQoc3RydWN0IGNwdXByaSAqY3AsIGJvb2wgYm9vdG1lbSkKIHsKIAlpbnQgaTsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkX2ZhaXIuYyBiL2tlcm5lbC9zY2hlZF9mYWlyLmMKaW5kZXggNTZjMGVmZS4uOGUxMzUyYyAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkX2ZhaXIuYworKysgYi9rZXJuZWwvc2NoZWRfZmFpci5jCkBAIC0zODYsMjAgKzM4Niw2IEBACiAjZW5kaWYKIAogLyoKLSAqIGRlbHRhICo9IFBbdyAvIHJ3XQotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKLWNhbGNfZGVsdGFfd2VpZ2h0KHVuc2lnbmVkIGxvbmcgZGVsdGEsIHN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlKQotewotCWZvcl9lYWNoX3NjaGVkX2VudGl0eShzZSkgewotCQlkZWx0YSA9IGNhbGNfZGVsdGFfbWluZShkZWx0YSwKLQkJCQlzZS0+bG9hZC53ZWlnaHQsICZjZnNfcnFfb2Yoc2UpLT5sb2FkKTsKLQl9Ci0KLQlyZXR1cm4gZGVsdGE7Ci19Ci0KLS8qCiAgKiBkZWx0YSAvPSB3CiAgKi8KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwpAQCAtNDQwLDEyICs0MjYsMjAgQEAKICAqLwogc3RhdGljIHU2NCBzY2hlZF9zbGljZShzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEsIHN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlKQogewotCXVuc2lnbmVkIGxvbmcgbnJfcnVubmluZyA9IGNmc19ycS0+bnJfcnVubmluZzsKKwl1NjQgc2xpY2UgPSBfX3NjaGVkX3BlcmlvZChjZnNfcnEtPm5yX3J1bm5pbmcgKyAhc2UtPm9uX3JxKTsKIAotCWlmICh1bmxpa2VseSghc2UtPm9uX3JxKSkKLQkJbnJfcnVubmluZysrOworCWZvcl9lYWNoX3NjaGVkX2VudGl0eShzZSkgeworCQlzdHJ1Y3QgbG9hZF93ZWlnaHQgKmxvYWQgPSAmY2ZzX3JxLT5sb2FkOwogCi0JcmV0dXJuIGNhbGNfZGVsdGFfd2VpZ2h0KF9fc2NoZWRfcGVyaW9kKG5yX3J1bm5pbmcpLCBzZSk7CisJCWlmICh1bmxpa2VseSghc2UtPm9uX3JxKSkgeworCQkJc3RydWN0IGxvYWRfd2VpZ2h0IGx3ID0gY2ZzX3JxLT5sb2FkOworCisJCQl1cGRhdGVfbG9hZF9hZGQoJmx3LCBzZS0+bG9hZC53ZWlnaHQpOworCQkJbG9hZCA9ICZsdzsKKwkJfQorCQlzbGljZSA9IGNhbGNfZGVsdGFfbWluZShzbGljZSwgc2UtPmxvYWQud2VpZ2h0LCBsb2FkKTsKKwl9CisJcmV0dXJuIHNsaWNlOwogfQogCiAvKgpAQCAtMTYyMyw4ICsxNjE3LDYgQEAKIAl9CiB9CiAKLSNkZWZpbmUgc3dhcChhLCBiKSBkbyB7IHR5cGVvZihhKSB0bXAgPSAoYSk7IChhKSA9IChiKTsgKGIpID0gdG1wOyB9IHdoaWxlICgwKQotCiAvKgogICogU2hhcmUgdGhlIGZhaXJuZXNzIHJ1bnRpbWUgYmV0d2VlbiBwYXJlbnQgYW5kIGNoaWxkLCB0aHVzIHRoZQogICogdG90YWwgYW1vdW50IG9mIHByZXNzdXJlIGZvciBDUFUgc3RheXMgZXF1YWwgLSBuZXcgdGFza3MKZGlmZiAtLWdpdCBhL2tlcm5lbC9zaWduYWwuYyBiL2tlcm5lbC9zaWduYWwuYwppbmRleCA4ZTk1ODU1Li4zMTUyYWMzIDEwMDY0NAotLS0gYS9rZXJuZWwvc2lnbmFsLmMKKysrIGIva2VybmVsL3NpZ25hbC5jCkBAIC04NTgsNyArODU4LDggQEAKIAkJCXEtPmluZm8uc2lfc2lnbm8gPSBzaWc7CiAJCQlxLT5pbmZvLnNpX2Vycm5vID0gMDsKIAkJCXEtPmluZm8uc2lfY29kZSA9IFNJX1VTRVI7Ci0JCQlxLT5pbmZvLnNpX3BpZCA9IHRhc2tfcGlkX3ZucihjdXJyZW50KTsKKwkJCXEtPmluZm8uc2lfcGlkID0gdGFza190Z2lkX25yX25zKGN1cnJlbnQsCisJCQkJCQkJdGFza19hY3RpdmVfcGlkX25zKHQpKTsKIAkJCXEtPmluZm8uc2lfdWlkID0gY3VycmVudF91aWQoKTsKIAkJCWJyZWFrOwogCQljYXNlICh1bnNpZ25lZCBsb25nKSBTRU5EX1NJR19QUklWOgpkaWZmIC0tZ2l0IGEva2VybmVsL3N0b3BfbWFjaGluZS5jIGIva2VybmVsL3N0b3BfbWFjaGluZS5jCmluZGV4IDI4NmM0MTcuLjBjZDQxNWUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zdG9wX21hY2hpbmUuYworKysgYi9rZXJuZWwvc3RvcF9tYWNoaW5lLmMKQEAgLTM4LDcgKzM4LDEwIEBACiBzdGF0aWMgdW5zaWduZWQgaW50IG51bV90aHJlYWRzOwogc3RhdGljIGF0b21pY190IHRocmVhZF9hY2s7CiBzdGF0aWMgREVGSU5FX01VVEVYKGxvY2spOwotCisvKiBzZXR1cF9sb2NrIHByb3RlY3RzIHJlZmNvdW50LCBzdG9wX21hY2hpbmVfd3EgYW5kIHN0b3BfbWFjaGluZV93b3JrLiAqLworc3RhdGljIERFRklORV9NVVRFWChzZXR1cF9sb2NrKTsKKy8qIFVzZXJzIG9mIHN0b3BfbWFjaGluZS4gKi8KK3N0YXRpYyBpbnQgcmVmY291bnQ7CiBzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnN0b3BfbWFjaGluZV93cTsKIHN0YXRpYyBzdHJ1Y3Qgc3RvcF9tYWNoaW5lX2RhdGEgYWN0aXZlLCBpZGxlOwogc3RhdGljIGNvbnN0IGNwdW1hc2tfdCAqYWN0aXZlX2NwdXM7CkBAIC0xMDksNiArMTEyLDQzIEBACiAJcmV0dXJuIDA7CiB9CiAKK2ludCBzdG9wX21hY2hpbmVfY3JlYXRlKHZvaWQpCit7CisJbXV0ZXhfbG9jaygmc2V0dXBfbG9jayk7CisJaWYgKHJlZmNvdW50KQorCQlnb3RvIGRvbmU7CisJc3RvcF9tYWNoaW5lX3dxID0gY3JlYXRlX3J0X3dvcmtxdWV1ZSgia3N0b3AiKTsKKwlpZiAoIXN0b3BfbWFjaGluZV93cSkKKwkJZ290byBlcnJfb3V0OworCXN0b3BfbWFjaGluZV93b3JrID0gYWxsb2NfcGVyY3B1KHN0cnVjdCB3b3JrX3N0cnVjdCk7CisJaWYgKCFzdG9wX21hY2hpbmVfd29yaykKKwkJZ290byBlcnJfb3V0OworZG9uZToKKwlyZWZjb3VudCsrOworCW11dGV4X3VubG9jaygmc2V0dXBfbG9jayk7CisJcmV0dXJuIDA7CisKK2Vycl9vdXQ6CisJaWYgKHN0b3BfbWFjaGluZV93cSkKKwkJZGVzdHJveV93b3JrcXVldWUoc3RvcF9tYWNoaW5lX3dxKTsKKwltdXRleF91bmxvY2soJnNldHVwX2xvY2spOworCXJldHVybiAtRU5PTUVNOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3RvcF9tYWNoaW5lX2NyZWF0ZSk7CisKK3ZvaWQgc3RvcF9tYWNoaW5lX2Rlc3Ryb3kodm9pZCkKK3sKKwltdXRleF9sb2NrKCZzZXR1cF9sb2NrKTsKKwlyZWZjb3VudC0tOworCWlmIChyZWZjb3VudCkKKwkJZ290byBkb25lOworCWRlc3Ryb3lfd29ya3F1ZXVlKHN0b3BfbWFjaGluZV93cSk7CisJZnJlZV9wZXJjcHUoc3RvcF9tYWNoaW5lX3dvcmspOworZG9uZToKKwltdXRleF91bmxvY2soJnNldHVwX2xvY2spOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3RvcF9tYWNoaW5lX2Rlc3Ryb3kpOworCiBpbnQgX19zdG9wX21hY2hpbmUoaW50ICgqZm4pKHZvaWQgKiksIHZvaWQgKmRhdGEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVzKQogewogCXN0cnVjdCB3b3JrX3N0cnVjdCAqc21fd29yazsKQEAgLTE0NiwxOSArMTg2LDE0IEBACiB7CiAJaW50IHJldDsKIAorCXJldCA9IHN0b3BfbWFjaGluZV9jcmVhdGUoKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCS8qIE5vIENQVXMgY2FuIGNvbWUgdXAgb3IgZG93biBkdXJpbmcgdGhpcy4gKi8KIAlnZXRfb25saW5lX2NwdXMoKTsKIAlyZXQgPSBfX3N0b3BfbWFjaGluZShmbiwgZGF0YSwgY3B1cyk7CiAJcHV0X29ubGluZV9jcHVzKCk7Ci0KKwlzdG9wX21hY2hpbmVfZGVzdHJveSgpOwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzdG9wX21hY2hpbmUpOwotCi1zdGF0aWMgaW50IF9faW5pdCBzdG9wX21hY2hpbmVfaW5pdCh2b2lkKQotewotCXN0b3BfbWFjaGluZV93cSA9IGNyZWF0ZV9ydF93b3JrcXVldWUoImtzdG9wIik7Ci0Jc3RvcF9tYWNoaW5lX3dvcmsgPSBhbGxvY19wZXJjcHUoc3RydWN0IHdvcmtfc3RydWN0KTsKLQlyZXR1cm4gMDsKLX0KLWNvcmVfaW5pdGNhbGwoc3RvcF9tYWNoaW5lX2luaXQpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3N5cy5jIGIva2VybmVsL3N5cy5jCmluZGV4IGQzNTZkNzkuLjc2M2MzYzEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXMuYworKysgYi9rZXJuZWwvc3lzLmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxsaW51eC90YXNrX2lvX2FjY291bnRpbmdfb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VjY29tcC5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogCiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KQEAgLTkyNyw2ICs5MjgsNyBAQAogCQlpZiAoY29weV90b191c2VyKHRidWYsICZ0bXAsIHNpemVvZihzdHJ1Y3QgdG1zKSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAl9CisJZm9yY2Vfc3VjY2Vzc2Z1bF9zeXNjYWxsX3JldHVybigpOwogCXJldHVybiAobG9uZykgamlmZmllc182NF90b19jbG9ja190KGdldF9qaWZmaWVzXzY0KCkpOwogfQogCkBAIC0xNjI3LDYgKzE2MjksOCBAQAogCXV0aW1lID0gc3RpbWUgPSBjcHV0aW1lX3plcm87CiAKIAlpZiAod2hvID09IFJVU0FHRV9USFJFQUQpIHsKKwkJdXRpbWUgPSB0YXNrX3V0aW1lKGN1cnJlbnQpOworCQlzdGltZSA9IHRhc2tfc3RpbWUoY3VycmVudCk7CiAJCWFjY3VtdWxhdGVfdGhyZWFkX3J1c2FnZShwLCByKTsKIAkJZ290byBvdXQ7CiAJfQpkaWZmIC0tZ2l0IGEva2VybmVsL3N5c2N0bC5jIGIva2VybmVsL3N5c2N0bC5jCmluZGV4IGZmNmQ0NWMuLjkyZjZlNWIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXNjdGwuYworKysgYi9rZXJuZWwvc3lzY3RsLmMKQEAgLTg3LDEwICs4Nyw2IEBACiAjZW5kaWYgLyogI2lmZGVmIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUICovCiAKIC8qIENvbnN0YW50cyB1c2VkIGZvciBtaW5pbXVtIGFuZCAgbWF4aW11bSAqLwotI2lmIGRlZmluZWQoQ09ORklHX0hJR0hNRU0pIHx8IGRlZmluZWQoQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQKQotc3RhdGljIGludCBvbmUgPSAxOwotI2VuZGlmCi0KICNpZmRlZiBDT05GSUdfREVURUNUX1NPRlRMT0NLVVAKIHN0YXRpYyBpbnQgc2l4dHkgPSA2MDsKIHN0YXRpYyBpbnQgbmVnX29uZSA9IC0xOwpAQCAtMTAxLDYgKzk3LDcgQEAKICNlbmRpZgogCiBzdGF0aWMgaW50IHplcm87CitzdGF0aWMgaW50IG9uZSA9IDE7CiBzdGF0aWMgaW50IG9uZV9odW5kcmVkID0gMTAwOwogCiAvKiB0aGlzIGlzIG5lZWRlZCBmb3IgdGhlIHByb2NfZG9pbnR2ZWNfbWlubWF4IGZvciBbZnNfXW92ZXJmbG93IFVJRCBhbmQgR0lEICovCkBAIC05NTIsMTIgKzk0OSwyMiBAQAogCQkuZGF0YQkJPSAmZGlydHlfYmFja2dyb3VuZF9yYXRpbywKIAkJLm1heGxlbgkJPSBzaXplb2YoZGlydHlfYmFja2dyb3VuZF9yYXRpbyksCiAJCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19taW5tYXgsCisJCS5wcm9jX2hhbmRsZXIJPSAmZGlydHlfYmFja2dyb3VuZF9yYXRpb19oYW5kbGVyLAogCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKIAkJLmV4dHJhMQkJPSAmemVybywKIAkJLmV4dHJhMgkJPSAmb25lX2h1bmRyZWQsCiAJfSwKIAl7CisJCS5jdGxfbmFtZQk9IENUTF9VTk5VTUJFUkVELAorCQkucHJvY25hbWUJPSAiZGlydHlfYmFja2dyb3VuZF9ieXRlcyIsCisJCS5kYXRhCQk9ICZkaXJ0eV9iYWNrZ3JvdW5kX2J5dGVzLAorCQkubWF4bGVuCQk9IHNpemVvZihkaXJ0eV9iYWNrZ3JvdW5kX2J5dGVzKSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZkaXJ0eV9iYWNrZ3JvdW5kX2J5dGVzX2hhbmRsZXIsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfaW50dmVjLAorCQkuZXh0cmExCQk9ICZvbmUsCisJfSwKKwl7CiAJCS5jdGxfbmFtZQk9IFZNX0RJUlRZX1JBVElPLAogCQkucHJvY25hbWUJPSAiZGlydHlfcmF0aW8iLAogCQkuZGF0YQkJPSAmdm1fZGlydHlfcmF0aW8sCkBAIC05NjksNiArOTc2LDE2IEBACiAJCS5leHRyYTIJCT0gJm9uZV9odW5kcmVkLAogCX0sCiAJeworCQkuY3RsX25hbWUJPSBDVExfVU5OVU1CRVJFRCwKKwkJLnByb2NuYW1lCT0gImRpcnR5X2J5dGVzIiwKKwkJLmRhdGEJCT0gJnZtX2RpcnR5X2J5dGVzLAorCQkubWF4bGVuCQk9IHNpemVvZih2bV9kaXJ0eV9ieXRlcyksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmZGlydHlfYnl0ZXNfaGFuZGxlciwKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9pbnR2ZWMsCisJCS5leHRyYTEJCT0gJm9uZSwKKwl9LAorCXsKIAkJLnByb2NuYW1lCT0gImRpcnR5X3dyaXRlYmFja19jZW50aXNlY3MiLAogCQkuZGF0YQkJPSAmZGlydHlfd3JpdGViYWNrX2ludGVydmFsLAogCQkubWF4bGVuCQk9IHNpemVvZihkaXJ0eV93cml0ZWJhY2tfaW50ZXJ2YWwpLApkaWZmIC0tZ2l0IGEva2VybmVsL3Rlc3Rfa3Byb2Jlcy5jIGIva2VybmVsL3Rlc3Rfa3Byb2Jlcy5jCmluZGV4IDA2YjYzOTUuLjRmMTA0NTEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90ZXN0X2twcm9iZXMuYworKysgYi9rZXJuZWwvdGVzdF9rcHJvYmVzLmMKQEAgLTIyLDIxICsyMiwxMSBAQAogCiBzdGF0aWMgdTMyIHJhbmQxLCBwcmVoX3ZhbCwgcG9zdGhfdmFsLCBqcGhfdmFsOwogc3RhdGljIGludCBlcnJvcnMsIGhhbmRsZXJfZXJyb3JzLCBudW1fdGVzdHM7CitzdGF0aWMgdTMyICgqdGFyZ2V0KSh1MzIgdmFsdWUpOworc3RhdGljIHUzMiAoKnRhcmdldDIpKHUzMiB2YWx1ZSk7CiAKIHN0YXRpYyBub2lubGluZSB1MzIga3Byb2JlX3RhcmdldCh1MzIgdmFsdWUpCiB7Ci0JLyoKLQkgKiBnY2MgaWdub3JlcyBub2lubGluZSBvbiBzb21lIGFyY2hpdGVjdHVyZXMgdW5sZXNzIHdlIHN0dWZmCi0JICogc3VmZmljaWVudCBsYXJkIGludG8gdGhlIGZ1bmN0aW9uLiBUaGUgZ2V0X2twcm9iZSgpIGhlcmUgaXMKLQkgKiBqdXN0IGZvciB0aGF0LgotCSAqCi0JICogTk9URTogV2UgYXJlbid0IGNvbmNlcm5lZCBhYm91dCB0aGUgY29ycmVjdG5lc3Mgb2YgZ2V0X2twcm9iZSgpCi0JICogaGVyZTsgaGVuY2UsIHRoaXMgY2FsbCBpcyBuZWl0aGVyIHVuZGVyICFwcmVlbXB0IG5vciB3aXRoIHRoZQotCSAqIGtwcm9iZV9tdXRleCBoZWxkLiBUaGlzIGlzIGZpbmUodG0pCi0JICovCi0JaWYgKGdldF9rcHJvYmUoKHZvaWQgKikweGRlYWRiZWVmKSkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiS3Byb2JlIHNtb2tlIHRlc3Q6IHByb2JlIG9uIDB4ZGVhZGJlZWYhXG4iKTsKLQogCXJldHVybiAodmFsdWUgLyBkaXZfZmFjdG9yKTsKIH0KIApAQCAtNzQsNyArNjQsNyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCXJldCA9IGtwcm9iZV90YXJnZXQocmFuZDEpOworCXJldCA9IHRhcmdldChyYW5kMSk7CiAJdW5yZWdpc3Rlcl9rcHJvYmUoJmtwKTsKIAogCWlmIChwcmVoX3ZhbCA9PSAwKSB7CkBAIC05Miw2ICs4Miw4NCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgbm9pbmxpbmUgdTMyIGtwcm9iZV90YXJnZXQyKHUzMiB2YWx1ZSkKK3sKKwlyZXR1cm4gKHZhbHVlIC8gZGl2X2ZhY3RvcikgKyAxOworfQorCitzdGF0aWMgaW50IGtwX3ByZV9oYW5kbGVyMihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlwcmVoX3ZhbCA9IChyYW5kMSAvIGRpdl9mYWN0b3IpICsgMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQga3BfcG9zdF9oYW5kbGVyMihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlpZiAocHJlaF92YWwgIT0gKHJhbmQxIC8gZGl2X2ZhY3RvcikgKyAxKSB7CisJCWhhbmRsZXJfZXJyb3JzKys7CisJCXByaW50ayhLRVJOX0VSUiAiS3Byb2JlIHNtb2tlIHRlc3QgZmFpbGVkOiAiCisJCQkJImluY29ycmVjdCB2YWx1ZSBpbiBwb3N0X2hhbmRsZXIyXG4iKTsKKwl9CisJcG9zdGhfdmFsID0gcHJlaF92YWwgKyBkaXZfZmFjdG9yOworfQorCitzdGF0aWMgc3RydWN0IGtwcm9iZSBrcDIgPSB7CisJLnN5bWJvbF9uYW1lID0gImtwcm9iZV90YXJnZXQyIiwKKwkucHJlX2hhbmRsZXIgPSBrcF9wcmVfaGFuZGxlcjIsCisJLnBvc3RfaGFuZGxlciA9IGtwX3Bvc3RfaGFuZGxlcjIKK307CisKK3N0YXRpYyBpbnQgdGVzdF9rcHJvYmVzKHZvaWQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qga3Byb2JlICprcHNbMl0gPSB7JmtwLCAma3AyfTsKKworCWtwLmFkZHIgPSAwOyAvKiBhZGRyIHNob3VsZCBiZSBjbGVhcmQgZm9yIHJldXNpbmcga3Byb2JlLiAqLworCXJldCA9IHJlZ2lzdGVyX2twcm9iZXMoa3BzLCAyKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIktwcm9iZSBzbW9rZSB0ZXN0IGZhaWxlZDogIgorCQkJCSJyZWdpc3Rlcl9rcHJvYmVzIHJldHVybmVkICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXByZWhfdmFsID0gMDsKKwlwb3N0aF92YWwgPSAwOworCXJldCA9IHRhcmdldChyYW5kMSk7CisKKwlpZiAocHJlaF92YWwgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIktwcm9iZSBzbW9rZSB0ZXN0IGZhaWxlZDogIgorCQkJCSJrcHJvYmUgcHJlX2hhbmRsZXIgbm90IGNhbGxlZFxuIik7CisJCWhhbmRsZXJfZXJyb3JzKys7CisJfQorCisJaWYgKHBvc3RoX3ZhbCA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiS3Byb2JlIHNtb2tlIHRlc3QgZmFpbGVkOiAiCisJCQkJImtwcm9iZSBwb3N0X2hhbmRsZXIgbm90IGNhbGxlZFxuIik7CisJCWhhbmRsZXJfZXJyb3JzKys7CisJfQorCisJcHJlaF92YWwgPSAwOworCXBvc3RoX3ZhbCA9IDA7CisJcmV0ID0gdGFyZ2V0MihyYW5kMSk7CisKKwlpZiAocHJlaF92YWwgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIktwcm9iZSBzbW9rZSB0ZXN0IGZhaWxlZDogIgorCQkJCSJrcHJvYmUgcHJlX2hhbmRsZXIyIG5vdCBjYWxsZWRcbiIpOworCQloYW5kbGVyX2Vycm9ycysrOworCX0KKworCWlmIChwb3N0aF92YWwgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIktwcm9iZSBzbW9rZSB0ZXN0IGZhaWxlZDogIgorCQkJCSJrcHJvYmUgcG9zdF9oYW5kbGVyMiBub3QgY2FsbGVkXG4iKTsKKwkJaGFuZGxlcl9lcnJvcnMrKzsKKwl9CisKKwl1bnJlZ2lzdGVyX2twcm9iZXMoa3BzLCAyKTsKKwlyZXR1cm4gMDsKKworfQorCiBzdGF0aWMgdTMyIGpfa3Byb2JlX3RhcmdldCh1MzIgdmFsdWUpCiB7CiAJaWYgKHZhbHVlICE9IHJhbmQxKSB7CkBAIC0xMjEsNyArMTg5LDcgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXQgPSBrcHJvYmVfdGFyZ2V0KHJhbmQxKTsKKwlyZXQgPSB0YXJnZXQocmFuZDEpOwogCXVucmVnaXN0ZXJfanByb2JlKCZqcCk7CiAJaWYgKGpwaF92YWwgPT0gMCkgewogCQlwcmludGsoS0VSTl9FUlIgIktwcm9iZSBzbW9rZSB0ZXN0IGZhaWxlZDogIgpAQCAtMTMyLDYgKzIwMCw0MyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IGpwcm9iZSBqcDIgPSB7CisJLmVudHJ5ICAgICAgICAgID0gal9rcHJvYmVfdGFyZ2V0LAorCS5rcC5zeW1ib2xfbmFtZSA9ICJrcHJvYmVfdGFyZ2V0MiIKK307CisKK3N0YXRpYyBpbnQgdGVzdF9qcHJvYmVzKHZvaWQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QganByb2JlICpqcHNbMl0gPSB7JmpwLCAmanAyfTsKKworCWpwLmtwLmFkZHIgPSAwOyAvKiBhZGRyIHNob3VsZCBiZSBjbGVhcmQgZm9yIHJldXNpbmcga3Byb2JlLiAqLworCXJldCA9IHJlZ2lzdGVyX2pwcm9iZXMoanBzLCAyKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIktwcm9iZSBzbW9rZSB0ZXN0IGZhaWxlZDogIgorCQkJCSJyZWdpc3Rlcl9qcHJvYmVzIHJldHVybmVkICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWpwaF92YWwgPSAwOworCXJldCA9IHRhcmdldChyYW5kMSk7CisJaWYgKGpwaF92YWwgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIktwcm9iZSBzbW9rZSB0ZXN0IGZhaWxlZDogIgorCQkJCSJqcHJvYmUgaGFuZGxlciBub3QgY2FsbGVkXG4iKTsKKwkJaGFuZGxlcl9lcnJvcnMrKzsKKwl9CisKKwlqcGhfdmFsID0gMDsKKwlyZXQgPSB0YXJnZXQyKHJhbmQxKTsKKwlpZiAoanBoX3ZhbCA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiS3Byb2JlIHNtb2tlIHRlc3QgZmFpbGVkOiAiCisJCQkJImpwcm9iZSBoYW5kbGVyMiBub3QgY2FsbGVkXG4iKTsKKwkJaGFuZGxlcl9lcnJvcnMrKzsKKwl9CisJdW5yZWdpc3Rlcl9qcHJvYmVzKGpwcywgMik7CisKKwlyZXR1cm4gMDsKK30KICNpZmRlZiBDT05GSUdfS1JFVFBST0JFUwogc3RhdGljIHUzMiBrcnBoX3ZhbDsKIApAQCAtMTc3LDcgKzI4Miw3IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JcmV0ID0ga3Byb2JlX3RhcmdldChyYW5kMSk7CisJcmV0ID0gdGFyZ2V0KHJhbmQxKTsKIAl1bnJlZ2lzdGVyX2tyZXRwcm9iZSgmcnApOwogCWlmIChrcnBoX3ZhbCAhPSByYW5kMSkgewogCQlwcmludGsoS0VSTl9FUlIgIktwcm9iZSBzbW9rZSB0ZXN0IGZhaWxlZDogIgpAQCAtMTg3LDEyICsyOTIsNzIgQEAKIAogCXJldHVybiAwOwogfQorCitzdGF0aWMgaW50IHJldHVybl9oYW5kbGVyMihzdHJ1Y3Qga3JldHByb2JlX2luc3RhbmNlICpyaSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyByZXQgPSByZWdzX3JldHVybl92YWx1ZShyZWdzKTsKKworCWlmIChyZXQgIT0gKHJhbmQxIC8gZGl2X2ZhY3RvcikgKyAxKSB7CisJCWhhbmRsZXJfZXJyb3JzKys7CisJCXByaW50ayhLRVJOX0VSUiAiS3Byb2JlIHNtb2tlIHRlc3QgZmFpbGVkOiAiCisJCQkJImluY29ycmVjdCB2YWx1ZSBpbiBrcmV0cHJvYmUgaGFuZGxlcjJcbiIpOworCX0KKwlpZiAoa3JwaF92YWwgPT0gMCkgeworCQloYW5kbGVyX2Vycm9ycysrOworCQlwcmludGsoS0VSTl9FUlIgIktwcm9iZSBzbW9rZSB0ZXN0IGZhaWxlZDogIgorCQkJCSJjYWxsIHRvIGtyZXRwcm9iZSBlbnRyeSBoYW5kbGVyIGZhaWxlZFxuIik7CisJfQorCisJa3JwaF92YWwgPSByYW5kMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBrcmV0cHJvYmUgcnAyID0geworCS5oYW5kbGVyCT0gcmV0dXJuX2hhbmRsZXIyLAorCS5lbnRyeV9oYW5kbGVyICA9IGVudHJ5X2hhbmRsZXIsCisJLmtwLnN5bWJvbF9uYW1lID0gImtwcm9iZV90YXJnZXQyIgorfTsKKworc3RhdGljIGludCB0ZXN0X2tyZXRwcm9iZXModm9pZCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBrcmV0cHJvYmUgKnJwc1syXSA9IHsmcnAsICZycDJ9OworCisJcnAua3AuYWRkciA9IDA7IC8qIGFkZHIgc2hvdWxkIGJlIGNsZWFyZCBmb3IgcmV1c2luZyBrcHJvYmUuICovCisJcmV0ID0gcmVnaXN0ZXJfa3JldHByb2JlcyhycHMsIDIpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiS3Byb2JlIHNtb2tlIHRlc3QgZmFpbGVkOiAiCisJCQkJInJlZ2lzdGVyX2tyZXRwcm9iZSByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlrcnBoX3ZhbCA9IDA7CisJcmV0ID0gdGFyZ2V0KHJhbmQxKTsKKwlpZiAoa3JwaF92YWwgIT0gcmFuZDEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJLcHJvYmUgc21va2UgdGVzdCBmYWlsZWQ6ICIKKwkJCQkia3JldHByb2JlIGhhbmRsZXIgbm90IGNhbGxlZFxuIik7CisJCWhhbmRsZXJfZXJyb3JzKys7CisJfQorCisJa3JwaF92YWwgPSAwOworCXJldCA9IHRhcmdldDIocmFuZDEpOworCWlmIChrcnBoX3ZhbCAhPSByYW5kMSkgeworCQlwcmludGsoS0VSTl9FUlIgIktwcm9iZSBzbW9rZSB0ZXN0IGZhaWxlZDogIgorCQkJCSJrcmV0cHJvYmUgaGFuZGxlcjIgbm90IGNhbGxlZFxuIik7CisJCWhhbmRsZXJfZXJyb3JzKys7CisJfQorCXVucmVnaXN0ZXJfa3JldHByb2JlcyhycHMsIDIpOworCXJldHVybiAwOworfQogI2VuZGlmIC8qIENPTkZJR19LUkVUUFJPQkVTICovCiAKIGludCBpbml0X3Rlc3RfcHJvYmVzKHZvaWQpCiB7CiAJaW50IHJldDsKIAorCXRhcmdldCA9IGtwcm9iZV90YXJnZXQ7CisJdGFyZ2V0MiA9IGtwcm9iZV90YXJnZXQyOworCiAJZG8gewogCQlyYW5kMSA9IHJhbmRvbTMyKCk7CiAJfSB3aGlsZSAocmFuZDEgPD0gZGl2X2ZhY3Rvcik7CkBAIC0yMDQsMTUgKzM2OSwzMCBAQAogCQllcnJvcnMrKzsKIAogCW51bV90ZXN0cysrOworCXJldCA9IHRlc3Rfa3Byb2JlcygpOworCWlmIChyZXQgPCAwKQorCQllcnJvcnMrKzsKKworCW51bV90ZXN0cysrOwogCXJldCA9IHRlc3RfanByb2JlKCk7CiAJaWYgKHJldCA8IDApCiAJCWVycm9ycysrOwogCisJbnVtX3Rlc3RzKys7CisJcmV0ID0gdGVzdF9qcHJvYmVzKCk7CisJaWYgKHJldCA8IDApCisJCWVycm9ycysrOworCiAjaWZkZWYgQ09ORklHX0tSRVRQUk9CRVMKIAludW1fdGVzdHMrKzsKIAlyZXQgPSB0ZXN0X2tyZXRwcm9iZSgpOwogCWlmIChyZXQgPCAwKQogCQllcnJvcnMrKzsKKworCW51bV90ZXN0cysrOworCXJldCA9IHRlc3Rfa3JldHByb2JlcygpOworCWlmIChyZXQgPCAwKQorCQllcnJvcnMrKzsKICNlbmRpZiAvKiBDT05GSUdfS1JFVFBST0JFUyAqLwogCiAJaWYgKGVycm9ycykKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lLmMgYi9rZXJuZWwvdGltZS5jCmluZGV4IGQ2M2E0MzMuLjQ4ODZlM2MgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lLmMKKysrIGIva2VybmVsL3RpbWUuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L21hdGg2NC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CkBAIC02NSw4ICs2Niw5IEBACiAKIAlpZiAodGxvYykgewogCQlpZiAocHV0X3VzZXIoaSx0bG9jKSkKLQkJCWkgPSAtRUZBVUxUOworCQkJcmV0dXJuIC1FRkFVTFQ7CiAJfQorCWZvcmNlX3N1Y2Nlc3NmdWxfc3lzY2FsbF9yZXR1cm4oKTsKIAlyZXR1cm4gaTsKIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvamlmZmllcy5jIGIva2VybmVsL3RpbWUvamlmZmllcy5jCmluZGV4IDFjYTk5NTUuLjA2ZjE5NzUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL2ppZmZpZXMuYworKysgYi9rZXJuZWwvdGltZS9qaWZmaWVzLmMKQEAgLTQ1LDcgKzQ1LDcgQEAKICAqCiAgKiBUaGUgdmFsdWUgOCBpcyBzb21ld2hhdCBjYXJlZnVsbHkgY2hvc2VuLCBhcyBhbnl0aGluZwogICogbGFyZ2VyIGNhbiByZXN1bHQgaW4gb3ZlcmZsb3dzLiBOU0VDX1BFUl9KSUZGWSBncm93cyBhcwotICogSFogc2hyaW5rcywgc28gdmFsdWVzIGdyZWF0ZXIgdGhlbiA4IG92ZXJmbG93IDMyYml0cyB3aGVuCisgKiBIWiBzaHJpbmtzLCBzbyB2YWx1ZXMgZ3JlYXRlciB0aGFuIDggb3ZlcmZsb3cgMzJiaXRzIHdoZW4KICAqIEhaPTEwMC4KICAqLwogI2RlZmluZSBKSUZGSUVTX1NISUZUCTgKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nLmMgYi9rZXJuZWwvdGltZS90aW1la2VlcGluZy5jCmluZGV4IGZhMDVlODguLjkwMGYxYjYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nLmMKKysrIGIva2VybmVsL3RpbWUvdGltZWtlZXBpbmcuYwpAQCAtNDYsNiArNDYsOSBAQAogc3RydWN0IHRpbWVzcGVjIHdhbGxfdG9fbW9ub3RvbmljIF9fYXR0cmlidXRlX18gKChhbGlnbmVkICgxNikpKTsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHRvdGFsX3NsZWVwX3RpbWU7CQkvKiBzZWNvbmRzICovCiAKKy8qIGZsYWcgZm9yIGlmIHRpbWVrZWVwaW5nIGlzIHN1c3BlbmRlZCAqLworaW50IF9fcmVhZF9tb3N0bHkgdGltZWtlZXBpbmdfc3VzcGVuZGVkOworCiBzdGF0aWMgc3RydWN0IHRpbWVzcGVjIHh0aW1lX2NhY2hlIF9fYXR0cmlidXRlX18gKChhbGlnbmVkICgxNikpKTsKIHZvaWQgdXBkYXRlX3h0aW1lX2NhY2hlKHU2NCBuc2VjKQogewpAQCAtOTIsNiArOTUsOCBAQAogCXVuc2lnbmVkIGxvbmcgc2VxOwogCXM2NCBuc2VjczsKIAorCVdBUk5fT04odGltZWtlZXBpbmdfc3VzcGVuZGVkKTsKKwogCWRvIHsKIAkJc2VxID0gcmVhZF9zZXFiZWdpbigmeHRpbWVfbG9jayk7CiAKQEAgLTI5OSw4ICszMDQsNiBAQAogCXdyaXRlX3NlcXVubG9ja19pcnFyZXN0b3JlKCZ4dGltZV9sb2NrLCBmbGFncyk7CiB9CiAKLS8qIGZsYWcgZm9yIGlmIHRpbWVrZWVwaW5nIGlzIHN1c3BlbmRlZCAqLwotc3RhdGljIGludCB0aW1la2VlcGluZ19zdXNwZW5kZWQ7CiAvKiB0aW1lIGluIHNlY29uZHMgd2hlbiBzdXNwZW5kIGJlZ2FuICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyB0aW1la2VlcGluZ19zdXNwZW5kX3RpbWU7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90c2FjY3QuYyBiL2tlcm5lbC90c2FjY3QuYwppbmRleCAyZGMwNmFiLi40M2Y4OTFiIDEwMDY0NAotLS0gYS9rZXJuZWwvdHNhY2N0LmMKKysrIGIva2VybmVsL3RzYWNjdC5jCkBAIC05Miw4ICs5Miw4IEBACiAJbW0gPSBnZXRfdGFza19tbShwKTsKIAlpZiAobW0pIHsKIAkJLyogYWRqdXN0IHRvIEtCIHVuaXQgKi8KLQkJc3RhdHMtPmhpd2F0ZXJfcnNzICAgPSBtbS0+aGl3YXRlcl9yc3MgKiBQQUdFX1NJWkUgLyBLQjsKLQkJc3RhdHMtPmhpd2F0ZXJfdm0gICAgPSBtbS0+aGl3YXRlcl92bSAqIFBBR0VfU0laRSAvIEtCOworCQlzdGF0cy0+aGl3YXRlcl9yc3MgICA9IGdldF9tbV9oaXdhdGVyX3JzcyhtbSkgKiBQQUdFX1NJWkUgLyBLQjsKKwkJc3RhdHMtPmhpd2F0ZXJfdm0gICAgPSBnZXRfbW1faGl3YXRlcl92bShtbSkgICogUEFHRV9TSVpFIC8gS0I7CiAJCW1tcHV0KG1tKTsKIAl9CiAJc3RhdHMtPnJlYWRfY2hhcgk9IHAtPmlvYWMucmNoYXI7CmRpZmYgLS1naXQgYS9saWIvYnVzdF9zcGlubG9ja3MuYyBiL2xpYi9idXN0X3NwaW5sb2Nrcy5jCmluZGV4IDQ4NmRhNjIuLjk2ODFkNTQgMTAwNjQ0Ci0tLSBhL2xpYi9idXN0X3NwaW5sb2Nrcy5jCisrKyBiL2xpYi9idXN0X3NwaW5sb2Nrcy5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L3Z0X2tlcm4uaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAKIAogdm9pZCBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgYnVzdF9zcGlubG9ja3MoaW50IHllcykKQEAgLTIyLDYgKzIzLDcgQEAKICNpZmRlZiBDT05GSUdfVlQKIAkJdW5ibGFua19zY3JlZW4oKTsKICNlbmRpZgorCQljb25zb2xlX3VuYmxhbmsoKTsKIAkJaWYgKC0tb29wc19pbl9wcm9ncmVzcyA9PSAwKQogCQkJd2FrZV91cF9rbG9nZCgpOwogCX0KZGlmZiAtLWdpdCBhL2xpYi9keW5hbWljX3ByaW50ay5jIGIvbGliL2R5bmFtaWNfcHJpbnRrLmMKaW5kZXggOGUzMDI5NS4uMTY1YTE5NyAxMDA2NDQKLS0tIGEvbGliL2R5bmFtaWNfcHJpbnRrLmMKKysrIGIvbGliL2R5bmFtaWNfcHJpbnRrLmMKQEAgLTI3Nyw0MCArMjc3LDM0IEBACiAJCQkJZHluYW1pY19lbmFibGVkID0gRFlOQU1JQ19FTkFCTEVEX05PTkU7CiAJCQl9CiAJCQllcnIgPSAwOwotCQl9IGVsc2UgewotCQkJaWYgKGVsZW0pIHsKLQkJCQlpZiAodmFsdWUgJiYgKGVsZW0tPmVuYWJsZSA9PSAwKSkgewotCQkJCQlkeW5hbWljX3ByaW50a19lbmFibGVkIHw9Ci0JCQkJCQkJKDFMTCA8PCBlbGVtLT5oYXNoMSk7Ci0JCQkJCWR5bmFtaWNfcHJpbnRrX2VuYWJsZWQyIHw9Ci0JCQkJCQkJKDFMTCA8PCBlbGVtLT5oYXNoMik7Ci0JCQkJCWVsZW0tPmVuYWJsZSA9IDE7Ci0JCQkJCW51bV9lbmFibGVkKys7Ci0JCQkJCWR5bmFtaWNfZW5hYmxlZCA9IERZTkFNSUNfRU5BQkxFRF9TT01FOwotCQkJCQllcnIgPSAwOwotCQkJCQlwcmludGsoS0VSTl9ERUJVRwotCQkJCQkgICAgICAgImRlYnVnZ2luZyBlbmFibGVkIGZvciBtb2R1bGUgJXNcbiIsCi0JCQkJCSAgICAgICBlbGVtLT5uYW1lKTsKLQkJCQl9IGVsc2UgaWYgKCF2YWx1ZSAmJiAoZWxlbS0+ZW5hYmxlID09IDEpKSB7Ci0JCQkJCWVsZW0tPmVuYWJsZSA9IDA7Ci0JCQkJCW51bV9lbmFibGVkLS07Ci0JCQkJCWlmIChkaXNhYmxlZF9oYXNoKGVsZW0tPmhhc2gxLCB0cnVlKSkKLQkJCQkJCWR5bmFtaWNfcHJpbnRrX2VuYWJsZWQgJj0KKwkJfSBlbHNlIGlmIChlbGVtKSB7CisJCQlpZiAodmFsdWUgJiYgKGVsZW0tPmVuYWJsZSA9PSAwKSkgeworCQkJCWR5bmFtaWNfcHJpbnRrX2VuYWJsZWQgfD0gKDFMTCA8PCBlbGVtLT5oYXNoMSk7CisJCQkJZHluYW1pY19wcmludGtfZW5hYmxlZDIgfD0gKDFMTCA8PCBlbGVtLT5oYXNoMik7CisJCQkJZWxlbS0+ZW5hYmxlID0gMTsKKwkJCQludW1fZW5hYmxlZCsrOworCQkJCWR5bmFtaWNfZW5hYmxlZCA9IERZTkFNSUNfRU5BQkxFRF9TT01FOworCQkJCWVyciA9IDA7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkJImRlYnVnZ2luZyBlbmFibGVkIGZvciBtb2R1bGUgJXNcbiIsCisJCQkJCWVsZW0tPm5hbWUpOworCQkJfSBlbHNlIGlmICghdmFsdWUgJiYgKGVsZW0tPmVuYWJsZSA9PSAxKSkgeworCQkJCWVsZW0tPmVuYWJsZSA9IDA7CisJCQkJbnVtX2VuYWJsZWQtLTsKKwkJCQlpZiAoZGlzYWJsZWRfaGFzaChlbGVtLT5oYXNoMSwgdHJ1ZSkpCisJCQkJCWR5bmFtaWNfcHJpbnRrX2VuYWJsZWQgJj0KIAkJCQkJCQl+KDFMTCA8PCBlbGVtLT5oYXNoMSk7Ci0JCQkJCWlmIChkaXNhYmxlZF9oYXNoKGVsZW0tPmhhc2gyLCBmYWxzZSkpCi0JCQkJCQlkeW5hbWljX3ByaW50a19lbmFibGVkMiAmPQorCQkJCWlmIChkaXNhYmxlZF9oYXNoKGVsZW0tPmhhc2gyLCBmYWxzZSkpCisJCQkJCWR5bmFtaWNfcHJpbnRrX2VuYWJsZWQyICY9CiAJCQkJCQkJfigxTEwgPDwgZWxlbS0+aGFzaDIpOwotCQkJCQlpZiAobnVtX2VuYWJsZWQpCi0JCQkJCQlkeW5hbWljX2VuYWJsZWQgPQotCQkJCQkJCURZTkFNSUNfRU5BQkxFRF9TT01FOwotCQkJCQllbHNlCi0JCQkJCQlkeW5hbWljX2VuYWJsZWQgPQotCQkJCQkJCURZTkFNSUNfRU5BQkxFRF9OT05FOwotCQkJCQllcnIgPSAwOwotCQkJCQlwcmludGsoS0VSTl9ERUJVRwotCQkJCQkgICAgICAgImRlYnVnZ2luZyBkaXNhYmxlZCBmb3IgbW9kdWxlICIKLQkJCQkJICAgICAgICIlc1xuIiwgZWxlbS0+bmFtZSk7Ci0JCQkJfQorCQkJCWlmIChudW1fZW5hYmxlZCkKKwkJCQkJZHluYW1pY19lbmFibGVkID0gRFlOQU1JQ19FTkFCTEVEX1NPTUU7CisJCQkJZWxzZQorCQkJCQlkeW5hbWljX2VuYWJsZWQgPSBEWU5BTUlDX0VOQUJMRURfTk9ORTsKKwkJCQllcnIgPSAwOworCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJCSJkZWJ1Z2dpbmcgZGlzYWJsZWQgZm9yIG1vZHVsZSAlc1xuIiwKKwkJCQkJZWxlbS0+bmFtZSk7CiAJCQl9CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9saWIvZmF1bHQtaW5qZWN0LmMgYi9saWIvZmF1bHQtaW5qZWN0LmMKaW5kZXggYTUwYTMxMS4uZjk3YWY1NWIgMTAwNjQ0Ci0tLSBhL2xpYi9mYXVsdC1pbmplY3QuYworKysgYi9saWIvZmF1bHQtaW5qZWN0LmMKQEAgLTYsNyArNiw2IEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC91bndpbmQuaD4KICNpbmNsdWRlIDxsaW51eC9zdGFja3RyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxsaW51eC9mYXVsdC1pbmplY3QuaD4KZGlmZiAtLWdpdCBhL2xpYi9rbGlzdC5jIGIvbGliL2tsaXN0LmMKaW5kZXggYmJkZDMwMS4uNTczZDYwNiAxMDA2NDQKLS0tIGEvbGliL2tsaXN0LmMKKysrIGIvbGliL2tsaXN0LmMKQEAgLTM2LDYgKzM2LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAogLyoKICAqIFVzZSB0aGUgbG93ZXN0IGJpdCBvZiBuX2tsaXN0IHRvIG1hcmsgZGVsZXRlZCBub2RlcyBhbmQgZXhjbHVkZQpAQCAtMTA4LDcgKzEwOSw2IEBACiBzdGF0aWMgdm9pZCBrbGlzdF9ub2RlX2luaXQoc3RydWN0IGtsaXN0ICprLCBzdHJ1Y3Qga2xpc3Rfbm9kZSAqbikKIHsKIAlJTklUX0xJU1RfSEVBRCgmbi0+bl9ub2RlKTsKLQlpbml0X2NvbXBsZXRpb24oJm4tPm5fcmVtb3ZlZCk7CiAJa3JlZl9pbml0KCZuLT5uX3JlZik7CiAJa25vZGVfc2V0X2tsaXN0KG4sIGspOwogCWlmIChrLT5nZXQpCkBAIC0xNzEsMTMgKzE3MSwzNCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoa2xpc3RfYWRkX2JlZm9yZSk7CiAKK3N0cnVjdCBrbGlzdF93YWl0ZXIgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3Qga2xpc3Rfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByb2Nlc3M7CisJaW50IHdva2VuOworfTsKKworc3RhdGljIERFRklORV9TUElOTE9DSyhrbGlzdF9yZW1vdmVfbG9jayk7CitzdGF0aWMgTElTVF9IRUFEKGtsaXN0X3JlbW92ZV93YWl0ZXJzKTsKKwogc3RhdGljIHZvaWQga2xpc3RfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqa3JlZikKIHsKKwlzdHJ1Y3Qga2xpc3Rfd2FpdGVyICp3YWl0ZXIsICp0bXA7CiAJc3RydWN0IGtsaXN0X25vZGUgKm4gPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGtsaXN0X25vZGUsIG5fcmVmKTsKIAogCVdBUk5fT04oIWtub2RlX2RlYWQobikpOwogCWxpc3RfZGVsKCZuLT5uX25vZGUpOwotCWNvbXBsZXRlKCZuLT5uX3JlbW92ZWQpOworCXNwaW5fbG9jaygma2xpc3RfcmVtb3ZlX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh3YWl0ZXIsIHRtcCwgJmtsaXN0X3JlbW92ZV93YWl0ZXJzLCBsaXN0KSB7CisJCWlmICh3YWl0ZXItPm5vZGUgIT0gbikKKwkJCWNvbnRpbnVlOworCisJCXdhaXRlci0+d29rZW4gPSAxOworCQltYigpOworCQl3YWtlX3VwX3Byb2Nlc3Mod2FpdGVyLT5wcm9jZXNzKTsKKwkJbGlzdF9kZWwoJndhaXRlci0+bGlzdCk7CisJfQorCXNwaW5fdW5sb2NrKCZrbGlzdF9yZW1vdmVfbG9jayk7CiAJa25vZGVfc2V0X2tsaXN0KG4sIE5VTEwpOwogfQogCkBAIC0yMTcsOCArMjM4LDI0IEBACiAgKi8KIHZvaWQga2xpc3RfcmVtb3ZlKHN0cnVjdCBrbGlzdF9ub2RlICpuKQogeworCXN0cnVjdCBrbGlzdF93YWl0ZXIgd2FpdGVyOworCisJd2FpdGVyLm5vZGUgPSBuOworCXdhaXRlci5wcm9jZXNzID0gY3VycmVudDsKKwl3YWl0ZXIud29rZW4gPSAwOworCXNwaW5fbG9jaygma2xpc3RfcmVtb3ZlX2xvY2spOworCWxpc3RfYWRkKCZ3YWl0ZXIubGlzdCwgJmtsaXN0X3JlbW92ZV93YWl0ZXJzKTsKKwlzcGluX3VubG9jaygma2xpc3RfcmVtb3ZlX2xvY2spOworCiAJa2xpc3RfZGVsKG4pOwotCXdhaXRfZm9yX2NvbXBsZXRpb24oJm4tPm5fcmVtb3ZlZCk7CisKKwlmb3IgKDs7KSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKHdhaXRlci53b2tlbikKKwkJCWJyZWFrOworCQlzY2hlZHVsZSgpOworCX0KKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChrbGlzdF9yZW1vdmUpOwogCmRpZmYgLS1naXQgYS9saWIva29iamVjdF91ZXZlbnQuYyBiL2xpYi9rb2JqZWN0X3VldmVudC5jCmluZGV4IDNmOTE0NzIuLjMxODMyOGQgMTAwNjQ0Ci0tLSBhL2xpYi9rb2JqZWN0X3VldmVudC5jCisrKyBiL2xpYi9rb2JqZWN0X3VldmVudC5jCkBAIC0xNjUsNyArMTY1LDcgQEAKIAkvKiBrZXlzIHBhc3NlZCBpbiBmcm9tIHRoZSBjYWxsZXIgKi8KIAlpZiAoZW52cF9leHQpIHsKIAkJZm9yIChpID0gMDsgZW52cF9leHRbaV07IGkrKykgewotCQkJcmV0dmFsID0gYWRkX3VldmVudF92YXIoZW52LCBlbnZwX2V4dFtpXSk7CisJCQlyZXR2YWwgPSBhZGRfdWV2ZW50X3ZhcihlbnYsICIlcyIsIGVudnBfZXh0W2ldKTsKIAkJCWlmIChyZXR2YWwpCiAJCQkJZ290byBleGl0OwogCQl9CkBAIC0yMjUsOCArMjI1LDEwIEBACiAJCQl9CiAKIAkJCU5FVExJTktfQ0Ioc2tiKS5kc3RfZ3JvdXAgPSAxOwotCQkJbmV0bGlua19icm9hZGNhc3QodWV2ZW50X3NvY2ssIHNrYiwgMCwgMSwgR0ZQX0tFUk5FTCk7Ci0JCX0KKwkJCXJldHZhbCA9IG5ldGxpbmtfYnJvYWRjYXN0KHVldmVudF9zb2NrLCBza2IsIDAsIDEsCisJCQkJCQkgICBHRlBfS0VSTkVMKTsKKwkJfSBlbHNlCisJCQlyZXR2YWwgPSAtRU5PTUVNOwogCX0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9saWIvcGVyY3B1X2NvdW50ZXIuYyBiL2xpYi9wZXJjcHVfY291bnRlci5jCmluZGV4IGIyNTViOTMuLmFlYWE2ZDcgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJjcHVfY291bnRlci5jCisrKyBiL2xpYi9wZXJjcHVfY291bnRlci5jCkBAIC05LDEwICs5LDggQEAKICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogc3RhdGljIExJU1RfSEVBRChwZXJjcHVfY291bnRlcnMpOwogc3RhdGljIERFRklORV9NVVRFWChwZXJjcHVfY291bnRlcnNfbG9jayk7Ci0jZW5kaWYKIAogdm9pZCBwZXJjcHVfY291bnRlcl9zZXQoc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMsIHM2NCBhbW91bnQpCiB7CkBAIC02OCwxMSArNjYsMTEgQEAKIH0KIEVYUE9SVF9TWU1CT0woX19wZXJjcHVfY291bnRlcl9zdW0pOwogCi1zdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IHBlcmNwdV9jb3VudGVyX2lycXNhZmU7Ci0KLWludCBwZXJjcHVfY291bnRlcl9pbml0KHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjLCBzNjQgYW1vdW50KQoraW50IF9fcGVyY3B1X2NvdW50ZXJfaW5pdChzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYywgczY0IGFtb3VudCwKKwkJCSAgc3RydWN0IGxvY2tfY2xhc3Nfa2V5ICprZXkpCiB7CiAJc3Bpbl9sb2NrX2luaXQoJmZiYy0+bG9jayk7CisJbG9ja2RlcF9zZXRfY2xhc3MoJmZiYy0+bG9jaywga2V5KTsKIAlmYmMtPmNvdW50ID0gYW1vdW50OwogCWZiYy0+Y291bnRlcnMgPSBhbGxvY19wZXJjcHUoczMyKTsKIAlpZiAoIWZiYy0+Y291bnRlcnMpCkBAIC04NCwxNyArODIsNyBAQAogI2VuZGlmCiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKHBlcmNwdV9jb3VudGVyX2luaXQpOwotCi1pbnQgcGVyY3B1X2NvdW50ZXJfaW5pdF9pcnEoc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMsIHM2NCBhbW91bnQpCi17Ci0JaW50IGVycjsKLQotCWVyciA9IHBlcmNwdV9jb3VudGVyX2luaXQoZmJjLCBhbW91bnQpOwotCWlmICghZXJyKQotCQlsb2NrZGVwX3NldF9jbGFzcygmZmJjLT5sb2NrLCAmcGVyY3B1X2NvdW50ZXJfaXJxc2FmZSk7Ci0JcmV0dXJuIGVycjsKLX0KK0VYUE9SVF9TWU1CT0woX19wZXJjcHVfY291bnRlcl9pbml0KTsKIAogdm9pZCBwZXJjcHVfY291bnRlcl9kZXN0cm95KHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjKQogewpAQCAtMTExLDEzICs5OSwyNCBAQAogfQogRVhQT1JUX1NZTUJPTChwZXJjcHVfY291bnRlcl9kZXN0cm95KTsKIAotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQoraW50IHBlcmNwdV9jb3VudGVyX2JhdGNoIF9fcmVhZF9tb3N0bHkgPSAzMjsKK0VYUE9SVF9TWU1CT0wocGVyY3B1X2NvdW50ZXJfYmF0Y2gpOworCitzdGF0aWMgdm9pZCBjb21wdXRlX2JhdGNoX3ZhbHVlKHZvaWQpCit7CisJaW50IG5yID0gbnVtX29ubGluZV9jcHVzKCk7CisKKwlwZXJjcHVfY291bnRlcl9iYXRjaCA9IG1heCgzMiwgbnIqMik7Cit9CisKIHN0YXRpYyBpbnQgX19jcHVpbml0IHBlcmNwdV9jb3VudGVyX2hvdGNwdV9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAogCQkJCQl1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKIHsKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIAl1bnNpZ25lZCBpbnQgY3B1OwogCXN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjOwogCisJY29tcHV0ZV9iYXRjaF92YWx1ZSgpOwogCWlmIChhY3Rpb24gIT0gQ1BVX0RFQUQpCiAJCXJldHVybiBOT1RJRllfT0s7CiAKQEAgLTEzNCwxMyArMTMzLDE0IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZiYy0+bG9jaywgZmxhZ3MpOwogCX0KIAltdXRleF91bmxvY2soJnBlcmNwdV9jb3VudGVyc19sb2NrKTsKKyNlbmRpZgogCXJldHVybiBOT1RJRllfT0s7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IHBlcmNwdV9jb3VudGVyX3N0YXJ0dXAodm9pZCkKIHsKKwljb21wdXRlX2JhdGNoX3ZhbHVlKCk7CiAJaG90Y3B1X25vdGlmaWVyKHBlcmNwdV9jb3VudGVyX2hvdGNwdV9jYWxsYmFjaywgMCk7CiAJcmV0dXJuIDA7CiB9CiBtb2R1bGVfaW5pdChwZXJjcHVfY291bnRlcl9zdGFydHVwKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL3ByaW9faGVhcC5jIGIvbGliL3ByaW9faGVhcC5jCmluZGV4IDQ3MTk0NGEuLmE3YWY2ZjggMTAwNjQ0Ci0tLSBhL2xpYi9wcmlvX2hlYXAuYworKysgYi9saWIvcHJpb19oZWFwLmMKQEAgLTMxLDcgKzMxLDcgQEAKIAogCWlmIChoZWFwLT5zaXplIDwgaGVhcC0+bWF4KSB7CiAJCS8qIEhlYXAgaW5zZXJ0aW9uICovCi0JCWludCBwb3MgPSBoZWFwLT5zaXplKys7CisJCXBvcyA9IGhlYXAtPnNpemUrKzsKIAkJd2hpbGUgKHBvcyA+IDAgJiYgaGVhcC0+Z3QocCwgcHRyc1socG9zLTEpLzJdKSkgewogCQkJcHRyc1twb3NdID0gcHRyc1socG9zLTEpLzJdOwogCQkJcG9zID0gKHBvcy0xKS8yOwpkaWZmIC0tZ2l0IGEvbGliL3Byb3BvcnRpb25zLmMgYi9saWIvcHJvcG9ydGlvbnMuYwppbmRleCA0ZjM4N2E2Li5kNTA3NDZhIDEwMDY0NAotLS0gYS9saWIvcHJvcG9ydGlvbnMuYworKysgYi9saWIvcHJvcG9ydGlvbnMuYwpAQCAtODMsMTEgKzgzLDExIEBACiAJcGQtPmluZGV4ID0gMDsKIAlwZC0+cGdbMF0uc2hpZnQgPSBzaGlmdDsKIAltdXRleF9pbml0KCZwZC0+bXV0ZXgpOwotCWVyciA9IHBlcmNwdV9jb3VudGVyX2luaXRfaXJxKCZwZC0+cGdbMF0uZXZlbnRzLCAwKTsKKwllcnIgPSBwZXJjcHVfY291bnRlcl9pbml0KCZwZC0+cGdbMF0uZXZlbnRzLCAwKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIAotCWVyciA9IHBlcmNwdV9jb3VudGVyX2luaXRfaXJxKCZwZC0+cGdbMV0uZXZlbnRzLCAwKTsKKwllcnIgPSBwZXJjcHVfY291bnRlcl9pbml0KCZwZC0+cGdbMV0uZXZlbnRzLCAwKTsKIAlpZiAoZXJyKQogCQlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZwZC0+cGdbMF0uZXZlbnRzKTsKIApAQCAtMTQ3LDYgKzE0Nyw3IEBACiAgKiB0aGlzIGlzIHVzZWQgdG8gdHJhY2sgdGhlIGFjdGl2ZSByZWZlcmVuY2VzLgogICovCiBzdGF0aWMgc3RydWN0IHByb3BfZ2xvYmFsICpwcm9wX2dldF9nbG9iYWwoc3RydWN0IHByb3BfZGVzY3JpcHRvciAqcGQpCitfX2FjcXVpcmVzKFJDVSkKIHsKIAlpbnQgaW5kZXg7CiAKQEAgLTE2MCw2ICsxNjEsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBwcm9wX3B1dF9nbG9iYWwoc3RydWN0IHByb3BfZGVzY3JpcHRvciAqcGQsIHN0cnVjdCBwcm9wX2dsb2JhbCAqcGcpCitfX3JlbGVhc2VzKFJDVSkKIHsKIAlyY3VfcmVhZF91bmxvY2soKTsKIH0KQEAgLTE5MSw3ICsxOTMsNyBAQAogCXNwaW5fbG9ja19pbml0KCZwbC0+bG9jayk7CiAJcGwtPnNoaWZ0ID0gMDsKIAlwbC0+cGVyaW9kID0gMDsKLQlyZXR1cm4gcGVyY3B1X2NvdW50ZXJfaW5pdF9pcnEoJnBsLT5ldmVudHMsIDApOworCXJldHVybiBwZXJjcHVfY291bnRlcl9pbml0KCZwbC0+ZXZlbnRzLCAwKTsKIH0KIAogdm9pZCBwcm9wX2xvY2FsX2Rlc3Ryb3lfcGVyY3B1KHN0cnVjdCBwcm9wX2xvY2FsX3BlcmNwdSAqcGwpCmRpZmYgLS1naXQgYS9saWIvcmFkaXgtdHJlZS5jIGIvbGliL3JhZGl4LXRyZWUuYwppbmRleCBiZTg2YjMyLi40YmI0MmEwIDEwMDY0NAotLS0gYS9saWIvcmFkaXgtdHJlZS5jCisrKyBiL2xpYi9yYWRpeC10cmVlLmMKQEAgLTgxLDcgKzgxLDcgQEAKIAlpbnQgbnI7CiAJc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZXNbUkFESVhfVFJFRV9NQVhfUEFUSF07CiB9OwotREVGSU5FX1BFUl9DUFUoc3RydWN0IHJhZGl4X3RyZWVfcHJlbG9hZCwgcmFkaXhfdHJlZV9wcmVsb2FkcykgPSB7IDAsIH07CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHJhZGl4X3RyZWVfcHJlbG9hZCwgcmFkaXhfdHJlZV9wcmVsb2FkcykgPSB7IDAsIH07CiAKIHN0YXRpYyBpbmxpbmUgZ2ZwX3Qgcm9vdF9nZnBfbWFzayhzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290KQogewpAQCAtNjQwLDEzICs2NDAsMTQgQEAKICAqCiAgKglSZXR1cm5zOiB0aGUgaW5kZXggb2YgdGhlIGhvbGUgaWYgZm91bmQsIG90aGVyd2lzZSByZXR1cm5zIGFuIGluZGV4CiAgKglvdXRzaWRlIG9mIHRoZSBzZXQgc3BlY2lmaWVkIChpbiB3aGljaCBjYXNlICdyZXR1cm4gLSBpbmRleCA+PSBtYXhfc2NhbicKLSAqCXdpbGwgYmUgdHJ1ZSkuCisgKgl3aWxsIGJlIHRydWUpLiBJbiByYXJlIGNhc2VzIG9mIGluZGV4IHdyYXAtYXJvdW5kLCAwIHdpbGwgYmUgcmV0dXJuZWQuCiAgKgogICoJcmFkaXhfdHJlZV9uZXh0X2hvbGUgbWF5IGJlIGNhbGxlZCB1bmRlciByY3VfcmVhZF9sb2NrLiBIb3dldmVyLCBsaWtlCi0gKglyYWRpeF90cmVlX2dhbmdfbG9va3VwLCB0aGlzIHdpbGwgbm90IGF0b21pY2FsbHkgc2VhcmNoIGEgc25hcHNob3Qgb2YgdGhlCi0gKgl0cmVlIGF0IGEgc2luZ2xlIHBvaW50IGluIHRpbWUuIEZvciBleGFtcGxlLCBpZiBhIGhvbGUgaXMgY3JlYXRlZCBhdCBpbmRleAotICoJNSwgdGhlbiBzdWJzZXF1ZW50bHkgYSBob2xlIGlzIGNyZWF0ZWQgYXQgaW5kZXggMTAsIHJhZGl4X3RyZWVfbmV4dF9ob2xlCi0gKgljb3ZlcmluZyBib3RoIGluZGV4ZXMgbWF5IHJldHVybiAxMCBpZiBjYWxsZWQgdW5kZXIgcmN1X3JlYWRfbG9jay4KKyAqCXJhZGl4X3RyZWVfZ2FuZ19sb29rdXAsIHRoaXMgd2lsbCBub3QgYXRvbWljYWxseSBzZWFyY2ggYSBzbmFwc2hvdCBvZgorICoJdGhlIHRyZWUgYXQgYSBzaW5nbGUgcG9pbnQgaW4gdGltZS4gRm9yIGV4YW1wbGUsIGlmIGEgaG9sZSBpcyBjcmVhdGVkCisgKglhdCBpbmRleCA1LCB0aGVuIHN1YnNlcXVlbnRseSBhIGhvbGUgaXMgY3JlYXRlZCBhdCBpbmRleCAxMCwKKyAqCXJhZGl4X3RyZWVfbmV4dF9ob2xlIGNvdmVyaW5nIGJvdGggaW5kZXhlcyBtYXkgcmV0dXJuIDEwIGlmIGNhbGxlZAorICoJdW5kZXIgcmN1X3JlYWRfbG9jay4KICAqLwogdW5zaWduZWQgbG9uZyByYWRpeF90cmVlX25leHRfaG9sZShzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LAogCQkJCXVuc2lnbmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGxvbmcgbWF4X3NjYW4pCmRpZmYgLS1naXQgYS9saWIvc29ydC5jIGIvbGliL3NvcnQuYwppbmRleCA2YWJiYWYzLi45MjZkMDA0IDEwMDY0NAotLS0gYS9saWIvc29ydC5jCisrKyBiL2xpYi9zb3J0LmMKQEAgLTMyLDExICszMiwxMSBAQAogICogQGJhc2U6IHBvaW50ZXIgdG8gZGF0YSB0byBzb3J0CiAgKiBAbnVtOiBudW1iZXIgb2YgZWxlbWVudHMKICAqIEBzaXplOiBzaXplIG9mIGVhY2ggZWxlbWVudAotICogQGNtcDogcG9pbnRlciB0byBjb21wYXJpc29uIGZ1bmN0aW9uCi0gKiBAc3dhcDogcG9pbnRlciB0byBzd2FwIGZ1bmN0aW9uIG9yIE5VTEwKKyAqIEBjbXBfZnVuYzogcG9pbnRlciB0byBjb21wYXJpc29uIGZ1bmN0aW9uCisgKiBAc3dhcF9mdW5jOiBwb2ludGVyIHRvIHN3YXAgZnVuY3Rpb24gb3IgTlVMTAogICoKICAqIFRoaXMgZnVuY3Rpb24gZG9lcyBhIGhlYXBzb3J0IG9uIHRoZSBnaXZlbiBhcnJheS4gWW91IG1heSBwcm92aWRlIGEKLSAqIHN3YXAgZnVuY3Rpb24gb3B0aW1pemVkIHRvIHlvdXIgZWxlbWVudCB0eXBlLgorICogc3dhcF9mdW5jIGZ1bmN0aW9uIG9wdGltaXplZCB0byB5b3VyIGVsZW1lbnQgdHlwZS4KICAqCiAgKiBTb3J0aW5nIHRpbWUgaXMgTyhuIGxvZyBuKSBib3RoIG9uIGF2ZXJhZ2UgYW5kIHdvcnN0LWNhc2UuIFdoaWxlCiAgKiBxc29ydCBpcyBhYm91dCAyMCUgZmFzdGVyIG9uIGF2ZXJhZ2UsIGl0IHN1ZmZlcnMgZnJvbSBleHBsb2l0YWJsZQpAQCAtNDUsMzcgKzQ1LDM5IEBACiAgKi8KIAogdm9pZCBzb3J0KHZvaWQgKmJhc2UsIHNpemVfdCBudW0sIHNpemVfdCBzaXplLAotCSAgaW50ICgqY21wKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKiksCi0JICB2b2lkICgqc3dhcCkodm9pZCAqLCB2b2lkICosIGludCBzaXplKSkKKwkgIGludCAoKmNtcF9mdW5jKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKiksCisJICB2b2lkICgqc3dhcF9mdW5jKSh2b2lkICosIHZvaWQgKiwgaW50IHNpemUpKQogewogCS8qIHByZS1zY2FsZSBjb3VudGVycyBmb3IgcGVyZm9ybWFuY2UgKi8KIAlpbnQgaSA9IChudW0vMiAtIDEpICogc2l6ZSwgbiA9IG51bSAqIHNpemUsIGMsIHI7CiAKLQlpZiAoIXN3YXApCi0JCXN3YXAgPSAoc2l6ZSA9PSA0ID8gdTMyX3N3YXAgOiBnZW5lcmljX3N3YXApOworCWlmICghc3dhcF9mdW5jKQorCQlzd2FwX2Z1bmMgPSAoc2l6ZSA9PSA0ID8gdTMyX3N3YXAgOiBnZW5lcmljX3N3YXApOwogCiAJLyogaGVhcGlmeSAqLwogCWZvciAoIDsgaSA+PSAwOyBpIC09IHNpemUpIHsKIAkJZm9yIChyID0gaTsgciAqIDIgKyBzaXplIDwgbjsgciAgPSBjKSB7CiAJCQljID0gciAqIDIgKyBzaXplOwotCQkJaWYgKGMgPCBuIC0gc2l6ZSAmJiBjbXAoYmFzZSArIGMsIGJhc2UgKyBjICsgc2l6ZSkgPCAwKQorCQkJaWYgKGMgPCBuIC0gc2l6ZSAmJgorCQkJCQljbXBfZnVuYyhiYXNlICsgYywgYmFzZSArIGMgKyBzaXplKSA8IDApCiAJCQkJYyArPSBzaXplOwotCQkJaWYgKGNtcChiYXNlICsgciwgYmFzZSArIGMpID49IDApCisJCQlpZiAoY21wX2Z1bmMoYmFzZSArIHIsIGJhc2UgKyBjKSA+PSAwKQogCQkJCWJyZWFrOwotCQkJc3dhcChiYXNlICsgciwgYmFzZSArIGMsIHNpemUpOworCQkJc3dhcF9mdW5jKGJhc2UgKyByLCBiYXNlICsgYywgc2l6ZSk7CiAJCX0KIAl9CiAKIAkvKiBzb3J0ICovCiAJZm9yIChpID0gbiAtIHNpemU7IGkgPiAwOyBpIC09IHNpemUpIHsKLQkJc3dhcChiYXNlLCBiYXNlICsgaSwgc2l6ZSk7CisJCXN3YXBfZnVuYyhiYXNlLCBiYXNlICsgaSwgc2l6ZSk7CiAJCWZvciAociA9IDA7IHIgKiAyICsgc2l6ZSA8IGk7IHIgPSBjKSB7CiAJCQljID0gciAqIDIgKyBzaXplOwotCQkJaWYgKGMgPCBpIC0gc2l6ZSAmJiBjbXAoYmFzZSArIGMsIGJhc2UgKyBjICsgc2l6ZSkgPCAwKQorCQkJaWYgKGMgPCBpIC0gc2l6ZSAmJgorCQkJCQljbXBfZnVuYyhiYXNlICsgYywgYmFzZSArIGMgKyBzaXplKSA8IDApCiAJCQkJYyArPSBzaXplOwotCQkJaWYgKGNtcChiYXNlICsgciwgYmFzZSArIGMpID49IDApCisJCQlpZiAoY21wX2Z1bmMoYmFzZSArIHIsIGJhc2UgKyBjKSA+PSAwKQogCQkJCWJyZWFrOwotCQkJc3dhcChiYXNlICsgciwgYmFzZSArIGMsIHNpemUpOworCQkJc3dhcF9mdW5jKGJhc2UgKyByLCBiYXNlICsgYywgc2l6ZSk7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9saWIvc3dpb3RsYi5jIGIvbGliL3N3aW90bGIuYwppbmRleCBmYTJkYzRlLi4xZjk5MWFjIDEwMDY0NAotLS0gYS9saWIvc3dpb3RsYi5jCisrKyBiL2xpYi9zd2lvdGxiLmMKQEAgLTE0LDYgKzE0LDcgQEAKICAqIDA0LzA3Ly4uIGFrCQlCZXR0ZXIgb3ZlcmZsb3cgaGFuZGxpbmcuIEFzc29ydGVkIGZpeGVzLgogICogMDUvMDkvMTAgbGludmlsbGUJQWRkIHN1cHBvcnQgZm9yIHN5bmNpbmcgcmFuZ2VzLCBzdXBwb3J0IHN5bmNpbmcgZm9yCiAgKgkJCURNQV9CSURJUkVDVElPTkFMIG1hcHBpbmdzLCBtaXNjZWxsYW5lb3VzIGNsZWFudXAuCisgKiAwOC8xMi8xMSBiZWNreWIJQWRkIGhpZ2htZW0gc3VwcG9ydAogICovCiAKICNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgpAQCAtMjEsOSArMjIsOSBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9zd2lvdGxiLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc3dpb3RsYi5oPgorI2luY2x1ZGUgPGxpbnV4L3Bmbi5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CkBAIC04OSwxMCArOTAsNyBAQAogICogV2UgbmVlZCB0byBzYXZlIGF3YXkgdGhlIG9yaWdpbmFsIGFkZHJlc3MgY29ycmVzcG9uZGluZyB0byBhIG1hcHBlZCBlbnRyeQogICogZm9yIHRoZSBzeW5jIG9wZXJhdGlvbnMuCiAgKi8KLXN0YXRpYyBzdHJ1Y3Qgc3dpb3RsYl9waHlzX2FkZHIgewotCXN0cnVjdCBwYWdlICpwYWdlOwotCXVuc2lnbmVkIGludCBvZmZzZXQ7Ci19ICppb190bGJfb3JpZ19hZGRyOworc3RhdGljIHBoeXNfYWRkcl90ICppb190bGJfb3JpZ19hZGRyOwogCiAvKgogICogUHJvdGVjdCB0aGUgYWJvdmUgZGF0YSBzdHJ1Y3R1cmVzIGluIHRoZSBtYXAgYW5kIHVubWFwIGNhbGxzCkBAIC0xMTYsNyArMTE0LDcgQEAKIF9fc2V0dXAoInN3aW90bGI9Iiwgc2V0dXBfaW9fdGxiX25wYWdlcyk7CiAvKiBtYWtlIGlvX3RsYl9vdmVyZmxvdyB0dW5hYmxlIHRvbz8gKi8KIAotdm9pZCAqIF9fd2VhayBzd2lvdGxiX2FsbG9jX2Jvb3Qoc2l6ZV90IHNpemUsIHVuc2lnbmVkIGxvbmcgbnNsYWJzKQordm9pZCAqIF9fd2VhayBfX2luaXQgc3dpb3RsYl9hbGxvY19ib290KHNpemVfdCBzaXplLCB1bnNpZ25lZCBsb25nIG5zbGFicykKIHsKIAlyZXR1cm4gYWxsb2NfYm9vdG1lbV9sb3dfcGFnZXMoc2l6ZSk7CiB9CkBAIC0xMjYsNyArMTI0LDcgQEAKIAlyZXR1cm4gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9ETUEgfCBfX0dGUF9OT1dBUk4sIG9yZGVyKTsKIH0KIAotZG1hX2FkZHJfdCBfX3dlYWsgc3dpb3RsYl9waHlzX3RvX2J1cyhwaHlzX2FkZHJfdCBwYWRkcikKK2RtYV9hZGRyX3QgX193ZWFrIHN3aW90bGJfcGh5c190b19idXMoc3RydWN0IGRldmljZSAqaHdkZXYsIHBoeXNfYWRkcl90IHBhZGRyKQogewogCXJldHVybiBwYWRkcjsKIH0KQEAgLTEzNiw5ICsxMzQsMTAgQEAKIAlyZXR1cm4gYmFkZHI7CiB9CiAKLXN0YXRpYyBkbWFfYWRkcl90IHN3aW90bGJfdmlydF90b19idXModm9sYXRpbGUgdm9pZCAqYWRkcmVzcykKK3N0YXRpYyBkbWFfYWRkcl90IHN3aW90bGJfdmlydF90b19idXMoc3RydWN0IGRldmljZSAqaHdkZXYsCisJCQkJICAgICAgdm9sYXRpbGUgdm9pZCAqYWRkcmVzcykKIHsKLQlyZXR1cm4gc3dpb3RsYl9waHlzX3RvX2J1cyh2aXJ0X3RvX3BoeXMoYWRkcmVzcykpOworCXJldHVybiBzd2lvdGxiX3BoeXNfdG9fYnVzKGh3ZGV2LCB2aXJ0X3RvX3BoeXMoYWRkcmVzcykpOwogfQogCiBzdGF0aWMgdm9pZCAqc3dpb3RsYl9idXNfdG9fdmlydChkbWFfYWRkcl90IGFkZHJlc3MpCkBAIC0xNTEsMzUgKzE1MCwxOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgZG1hX2FkZHJfdCBzd2lvdGxiX3NnX3RvX2J1cyhzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnKQotewotCXJldHVybiBzd2lvdGxiX3BoeXNfdG9fYnVzKHBhZ2VfdG9fcGh5cyhzZ19wYWdlKHNnKSkgKyBzZy0+b2Zmc2V0KTsKLX0KLQogc3RhdGljIHZvaWQgc3dpb3RsYl9wcmludF9pbmZvKHVuc2lnbmVkIGxvbmcgYnl0ZXMpCiB7CiAJcGh5c19hZGRyX3QgcHN0YXJ0LCBwZW5kOwotCWRtYV9hZGRyX3QgYnN0YXJ0LCBiZW5kOwogCiAJcHN0YXJ0ID0gdmlydF90b19waHlzKGlvX3RsYl9zdGFydCk7CiAJcGVuZCA9IHZpcnRfdG9fcGh5cyhpb190bGJfZW5kKTsKIAotCWJzdGFydCA9IHN3aW90bGJfcGh5c190b19idXMocHN0YXJ0KTsKLQliZW5kID0gc3dpb3RsYl9waHlzX3RvX2J1cyhwZW5kKTsKLQogCXByaW50ayhLRVJOX0lORk8gIlBsYWNpbmcgJWx1TUIgc29mdHdhcmUgSU8gVExCIGJldHdlZW4gJXAgLSAlcFxuIiwKIAkgICAgICAgYnl0ZXMgPj4gMjAsIGlvX3RsYl9zdGFydCwgaW9fdGxiX2VuZCk7Ci0JaWYgKHBzdGFydCAhPSBic3RhcnQgfHwgcGVuZCAhPSBiZW5kKQotCQlwcmludGsoS0VSTl9JTkZPICJzb2Z0d2FyZSBJTyBUTEIgYXQgcGh5cyAlI2xseCAtICUjbGx4IgotCQkgICAgICAgIiBidXMgJSNsbHggLSAlI2xseFxuIiwKLQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcHN0YXJ0LAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwZW5kLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylic3RhcnQsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJlbmQpOwotCWVsc2UKLQkJcHJpbnRrKEtFUk5fSU5GTyAic29mdHdhcmUgSU8gVExCIGF0IHBoeXMgJSNsbHggLSAlI2xseFxuIiwKLQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcHN0YXJ0LAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwZW5kKTsKKwlwcmludGsoS0VSTl9JTkZPICJzb2Z0d2FyZSBJTyBUTEIgYXQgcGh5cyAlI2xseCAtICUjbGx4XG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXBzdGFydCwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwZW5kKTsKIH0KIAogLyoKQEAgLTIxNSw3ICsxOTcsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBpb190bGJfbnNsYWJzOyBpKyspCiAgCQlpb190bGJfbGlzdFtpXSA9IElPX1RMQl9TRUdTSVpFIC0gT0ZGU0VUKGksIElPX1RMQl9TRUdTSVpFKTsKIAlpb190bGJfaW5kZXggPSAwOwotCWlvX3RsYl9vcmlnX2FkZHIgPSBhbGxvY19ib290bWVtKGlvX3RsYl9uc2xhYnMgKiBzaXplb2Yoc3RydWN0IHN3aW90bGJfcGh5c19hZGRyKSk7CisJaW9fdGxiX29yaWdfYWRkciA9IGFsbG9jX2Jvb3RtZW0oaW9fdGxiX25zbGFicyAqIHNpemVvZihwaHlzX2FkZHJfdCkpOwogCiAJLyoKIAkgKiBHZXQgdGhlIG92ZXJmbG93IGVtZXJnZW5jeSBidWZmZXIKQEAgLTI4OSwxMiArMjcxLDE0IEBACiAgCQlpb190bGJfbGlzdFtpXSA9IElPX1RMQl9TRUdTSVpFIC0gT0ZGU0VUKGksIElPX1RMQl9TRUdTSVpFKTsKIAlpb190bGJfaW5kZXggPSAwOwogCi0JaW9fdGxiX29yaWdfYWRkciA9IChzdHJ1Y3Qgc3dpb3RsYl9waHlzX2FkZHIgKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X29yZGVyKGlvX3RsYl9uc2xhYnMgKiBzaXplb2Yoc3RydWN0IHN3aW90bGJfcGh5c19hZGRyKSkpOworCWlvX3RsYl9vcmlnX2FkZHIgPSAocGh5c19hZGRyX3QgKikKKwkJX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLAorCQkJCSBnZXRfb3JkZXIoaW9fdGxiX25zbGFicyAqCisJCQkJCSAgIHNpemVvZihwaHlzX2FkZHJfdCkpKTsKIAlpZiAoIWlvX3RsYl9vcmlnX2FkZHIpCiAJCWdvdG8gY2xlYW51cDM7CiAKLQltZW1zZXQoaW9fdGxiX29yaWdfYWRkciwgMCwgaW9fdGxiX25zbGFicyAqIHNpemVvZihzdHJ1Y3Qgc3dpb3RsYl9waHlzX2FkZHIpKTsKKwltZW1zZXQoaW9fdGxiX29yaWdfYWRkciwgMCwgaW9fdGxiX25zbGFicyAqIHNpemVvZihwaHlzX2FkZHJfdCkpOwogCiAJLyoKIAkgKiBHZXQgdGhlIG92ZXJmbG93IGVtZXJnZW5jeSBidWZmZXIKQEAgLTMwOSw4ICsyOTMsOCBAQAogCXJldHVybiAwOwogCiBjbGVhbnVwNDoKLQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWlvX3RsYl9vcmlnX2FkZHIsIGdldF9vcmRlcihpb190bGJfbnNsYWJzICoKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY2hhciAqKSkpOworCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpaW9fdGxiX29yaWdfYWRkciwKKwkJICAgZ2V0X29yZGVyKGlvX3RsYl9uc2xhYnMgKiBzaXplb2YocGh5c19hZGRyX3QpKSk7CiAJaW9fdGxiX29yaWdfYWRkciA9IE5VTEw7CiBjbGVhbnVwMzoKIAlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWlvX3RsYl9saXN0LCBnZXRfb3JkZXIoaW9fdGxiX25zbGFicyAqCkBAIC0zNDEsNTEgKzMyNSw0NCBAQAogCXJldHVybiBhZGRyID49IGlvX3RsYl9zdGFydCAmJiBhZGRyIDwgaW9fdGxiX2VuZDsKIH0KIAotc3RhdGljIHN0cnVjdCBzd2lvdGxiX3BoeXNfYWRkciBzd2lvdGxiX2J1c190b19waHlzX2FkZHIoY2hhciAqZG1hX2FkZHIpCisvKgorICogQm91bmNlOiBjb3B5IHRoZSBzd2lvdGxiIGJ1ZmZlciBiYWNrIHRvIHRoZSBvcmlnaW5hbCBkbWEgbG9jYXRpb24KKyAqLworc3RhdGljIHZvaWQgc3dpb3RsYl9ib3VuY2UocGh5c19hZGRyX3QgcGh5cywgY2hhciAqZG1hX2FkZHIsIHNpemVfdCBzaXplLAorCQkJICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQogewotCWludCBpbmRleCA9IChkbWFfYWRkciAtIGlvX3RsYl9zdGFydCkgPj4gSU9fVExCX1NISUZUOwotCXN0cnVjdCBzd2lvdGxiX3BoeXNfYWRkciBidWZmZXIgPSBpb190bGJfb3JpZ19hZGRyW2luZGV4XTsKLQlidWZmZXIub2Zmc2V0ICs9IChsb25nKWRtYV9hZGRyICYgKCgxIDw8IElPX1RMQl9TSElGVCkgLSAxKTsKLQlidWZmZXIucGFnZSArPSBidWZmZXIub2Zmc2V0ID4+IFBBR0VfU0hJRlQ7Ci0JYnVmZmVyLm9mZnNldCAmPSBQQUdFX1NJWkUgLSAxOwotCXJldHVybiBidWZmZXI7Ci19CisJdW5zaWduZWQgbG9uZyBwZm4gPSBQRk5fRE9XTihwaHlzKTsKIAotc3RhdGljIHZvaWQKLV9fc3luY19zaW5nbGUoc3RydWN0IHN3aW90bGJfcGh5c19hZGRyIGJ1ZmZlciwgY2hhciAqZG1hX2FkZHIsIHNpemVfdCBzaXplLCBpbnQgZGlyKQotewotCWlmIChQYWdlSGlnaE1lbShidWZmZXIucGFnZSkpIHsKLQkJc2l6ZV90IGxlbiwgYnl0ZXM7Ci0JCWNoYXIgKmRldiwgKmhvc3QsICprbXA7CisJaWYgKFBhZ2VIaWdoTWVtKHBmbl90b19wYWdlKHBmbikpKSB7CisJCS8qIFRoZSBidWZmZXIgZG9lcyBub3QgaGF2ZSBhIG1hcHBpbmcuICBNYXAgaXQgaW4gYW5kIGNvcHkgKi8KKwkJdW5zaWduZWQgaW50IG9mZnNldCA9IHBoeXMgJiB+UEFHRV9NQVNLOworCQljaGFyICpidWZmZXI7CisJCXVuc2lnbmVkIGludCBzeiA9IDA7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQkJbGVuID0gc2l6ZTsKLQkJd2hpbGUgKGxlbiAhPSAwKSB7Ci0JCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQl3aGlsZSAoc2l6ZSkgeworCQkJc3ogPSBtaW4oUEFHRV9TSVpFIC0gb2Zmc2V0LCBzaXplKTsKIAotCQkJYnl0ZXMgPSBsZW47Ci0JCQlpZiAoKGJ5dGVzICsgYnVmZmVyLm9mZnNldCkgPiBQQUdFX1NJWkUpCi0JCQkJYnl0ZXMgPSBQQUdFX1NJWkUgLSBidWZmZXIub2Zmc2V0OwotCQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOyAvKiBwcm90ZWN0cyBLTV9CT1VOQ0VfUkVBRCAqLwotCQkJa21wICA9IGttYXBfYXRvbWljKGJ1ZmZlci5wYWdlLCBLTV9CT1VOQ0VfUkVBRCk7Ci0JCQlkZXYgID0gZG1hX2FkZHIgKyBzaXplIC0gbGVuOwotCQkJaG9zdCA9IGttcCArIGJ1ZmZlci5vZmZzZXQ7Ci0JCQlpZiAoZGlyID09IERNQV9GUk9NX0RFVklDRSkKLQkJCQltZW1jcHkoaG9zdCwgZGV2LCBieXRlcyk7CisJCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCQlidWZmZXIgPSBrbWFwX2F0b21pYyhwZm5fdG9fcGFnZShwZm4pLAorCQkJCQkgICAgIEtNX0JPVU5DRV9SRUFEKTsKKwkJCWlmIChkaXIgPT0gRE1BX1RPX0RFVklDRSkKKwkJCQltZW1jcHkoZG1hX2FkZHIsIGJ1ZmZlciArIG9mZnNldCwgc3opOwogCQkJZWxzZQotCQkJCW1lbWNweShkZXYsIGhvc3QsIGJ5dGVzKTsKLQkJCWt1bm1hcF9hdG9taWMoa21wLCBLTV9CT1VOQ0VfUkVBRCk7CisJCQkJbWVtY3B5KGJ1ZmZlciArIG9mZnNldCwgZG1hX2FkZHIsIHN6KTsKKwkJCWt1bm1hcF9hdG9taWMoYnVmZmVyLCBLTV9CT1VOQ0VfUkVBRCk7CiAJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JCQlsZW4gLT0gYnl0ZXM7Ci0JCQlidWZmZXIucGFnZSsrOwotCQkJYnVmZmVyLm9mZnNldCA9IDA7CisKKwkJCXNpemUgLT0gc3o7CisJCQlwZm4rKzsKKwkJCWRtYV9hZGRyICs9IHN6OworCQkJb2Zmc2V0ID0gMDsKIAkJfQogCX0gZWxzZSB7Ci0JCXZvaWQgKnYgPSBwYWdlX2FkZHJlc3MoYnVmZmVyLnBhZ2UpICsgYnVmZmVyLm9mZnNldDsKLQogCQlpZiAoZGlyID09IERNQV9UT19ERVZJQ0UpCi0JCQltZW1jcHkoZG1hX2FkZHIsIHYsIHNpemUpOworCQkJbWVtY3B5KGRtYV9hZGRyLCBwaHlzX3RvX3ZpcnQocGh5cyksIHNpemUpOwogCQllbHNlCi0JCQltZW1jcHkodiwgZG1hX2FkZHIsIHNpemUpOworCQkJbWVtY3B5KHBoeXNfdG9fdmlydChwaHlzKSwgZG1hX2FkZHIsIHNpemUpOwogCX0KIH0KIApAQCAtMzkzLDcgKzM3MCw3IEBACiAgKiBBbGxvY2F0ZXMgYm91bmNlIGJ1ZmZlciBhbmQgcmV0dXJucyBpdHMga2VybmVsIHZpcnR1YWwgYWRkcmVzcy4KICAqLwogc3RhdGljIHZvaWQgKgotbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc3RydWN0IHN3aW90bGJfcGh5c19hZGRyIGJ1ZmZlciwgc2l6ZV90IHNpemUsIGludCBkaXIpCittYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBwaHlzX2FkZHJfdCBwaHlzLCBzaXplX3Qgc2l6ZSwgaW50IGRpcikKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWNoYXIgKmRtYV9hZGRyOwpAQCAtNDAzLDEwICszODAsOSBAQAogCXVuc2lnbmVkIGxvbmcgbWFzazsKIAl1bnNpZ25lZCBsb25nIG9mZnNldF9zbG90czsKIAl1bnNpZ25lZCBsb25nIG1heF9zbG90czsKLQlzdHJ1Y3Qgc3dpb3RsYl9waHlzX2FkZHIgc2xvdF9idWY7CiAKIAltYXNrID0gZG1hX2dldF9zZWdfYm91bmRhcnkoaHdkZXYpOwotCXN0YXJ0X2RtYV9hZGRyID0gc3dpb3RsYl92aXJ0X3RvX2J1cyhpb190bGJfc3RhcnQpICYgbWFzazsKKwlzdGFydF9kbWFfYWRkciA9IHN3aW90bGJfdmlydF90b19idXMoaHdkZXYsIGlvX3RsYl9zdGFydCkgJiBtYXNrOwogCiAJb2Zmc2V0X3Nsb3RzID0gQUxJR04oc3RhcnRfZG1hX2FkZHIsIDEgPDwgSU9fVExCX1NISUZUKSA+PiBJT19UTEJfU0hJRlQ7CiAKQEAgLTQ4OCwxNSArNDY0LDEwIEBACiAJICogVGhpcyBpcyBuZWVkZWQgd2hlbiB3ZSBzeW5jIHRoZSBtZW1vcnkuICBUaGVuIHdlIHN5bmMgdGhlIGJ1ZmZlciBpZgogCSAqIG5lZWRlZC4KIAkgKi8KLQlzbG90X2J1ZiA9IGJ1ZmZlcjsKLQlmb3IgKGkgPSAwOyBpIDwgbnNsb3RzOyBpKyspIHsKLQkJc2xvdF9idWYucGFnZSArPSBzbG90X2J1Zi5vZmZzZXQgPj4gUEFHRV9TSElGVDsKLQkJc2xvdF9idWYub2Zmc2V0ICY9IFBBR0VfU0laRSAtIDE7Ci0JCWlvX3RsYl9vcmlnX2FkZHJbaW5kZXgraV0gPSBzbG90X2J1ZjsKLQkJc2xvdF9idWYub2Zmc2V0ICs9IDEgPDwgSU9fVExCX1NISUZUOwotCX0KKwlmb3IgKGkgPSAwOyBpIDwgbnNsb3RzOyBpKyspCisJCWlvX3RsYl9vcmlnX2FkZHJbaW5kZXgraV0gPSBwaHlzICsgKGkgPDwgSU9fVExCX1NISUZUKTsKIAlpZiAoZGlyID09IERNQV9UT19ERVZJQ0UgfHwgZGlyID09IERNQV9CSURJUkVDVElPTkFMKQotCQlfX3N5bmNfc2luZ2xlKGJ1ZmZlciwgZG1hX2FkZHIsIHNpemUsIERNQV9UT19ERVZJQ0UpOworCQlzd2lvdGxiX2JvdW5jZShwaHlzLCBkbWFfYWRkciwgc2l6ZSwgRE1BX1RPX0RFVklDRSk7CiAKIAlyZXR1cm4gZG1hX2FkZHI7CiB9CkBAIC01MTAsMTcgKzQ4MSwxMyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGksIGNvdW50LCBuc2xvdHMgPSBBTElHTihzaXplLCAxIDw8IElPX1RMQl9TSElGVCkgPj4gSU9fVExCX1NISUZUOwogCWludCBpbmRleCA9IChkbWFfYWRkciAtIGlvX3RsYl9zdGFydCkgPj4gSU9fVExCX1NISUZUOwotCXN0cnVjdCBzd2lvdGxiX3BoeXNfYWRkciBidWZmZXIgPSBzd2lvdGxiX2J1c190b19waHlzX2FkZHIoZG1hX2FkZHIpOworCXBoeXNfYWRkcl90IHBoeXMgPSBpb190bGJfb3JpZ19hZGRyW2luZGV4XTsKIAogCS8qCiAJICogRmlyc3QsIHN5bmMgdGhlIG1lbW9yeSBiZWZvcmUgdW5tYXBwaW5nIHRoZSBlbnRyeQogCSAqLwotCWlmICgoZGlyID09IERNQV9GUk9NX0RFVklDRSkgfHwgKGRpciA9PSBETUFfQklESVJFQ1RJT05BTCkpCi0JCS8qCi0JCSAqIGJvdW5jZS4uLiBjb3B5IHRoZSBkYXRhIGJhY2sgaW50byB0aGUgb3JpZ2luYWwgYnVmZmVyICogYW5kCi0JCSAqIGRlbGV0ZSB0aGUgYm91bmNlIGJ1ZmZlci4KLQkJICovCi0JCV9fc3luY19zaW5nbGUoYnVmZmVyLCBkbWFfYWRkciwgc2l6ZSwgRE1BX0ZST01fREVWSUNFKTsKKwlpZiAocGh5cyAmJiAoKGRpciA9PSBETUFfRlJPTV9ERVZJQ0UpIHx8IChkaXIgPT0gRE1BX0JJRElSRUNUSU9OQUwpKSkKKwkJc3dpb3RsYl9ib3VuY2UocGh5cywgZG1hX2FkZHIsIHNpemUsIERNQV9GUk9NX0RFVklDRSk7CiAKIAkvKgogCSAqIFJldHVybiB0aGUgYnVmZmVyIHRvIHRoZSBmcmVlIGxpc3QgYnkgc2V0dGluZyB0aGUgY29ycmVzcG9uZGluZwpAQCAtNTUyLDE4ICs1MTksMjEgQEAKIHN5bmNfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBjaGFyICpkbWFfYWRkciwgc2l6ZV90IHNpemUsCiAJICAgIGludCBkaXIsIGludCB0YXJnZXQpCiB7Ci0Jc3RydWN0IHN3aW90bGJfcGh5c19hZGRyIGJ1ZmZlciA9IHN3aW90bGJfYnVzX3RvX3BoeXNfYWRkcihkbWFfYWRkcik7CisJaW50IGluZGV4ID0gKGRtYV9hZGRyIC0gaW9fdGxiX3N0YXJ0KSA+PiBJT19UTEJfU0hJRlQ7CisJcGh5c19hZGRyX3QgcGh5cyA9IGlvX3RsYl9vcmlnX2FkZHJbaW5kZXhdOworCisJcGh5cyArPSAoKHVuc2lnbmVkIGxvbmcpZG1hX2FkZHIgJiAoKDEgPDwgSU9fVExCX1NISUZUKSAtIDEpKTsKIAogCXN3aXRjaCAodGFyZ2V0KSB7CiAJY2FzZSBTWU5DX0ZPUl9DUFU6CiAJCWlmIChsaWtlbHkoZGlyID09IERNQV9GUk9NX0RFVklDRSB8fCBkaXIgPT0gRE1BX0JJRElSRUNUSU9OQUwpKQotCQkJX19zeW5jX3NpbmdsZShidWZmZXIsIGRtYV9hZGRyLCBzaXplLCBETUFfRlJPTV9ERVZJQ0UpOworCQkJc3dpb3RsYl9ib3VuY2UocGh5cywgZG1hX2FkZHIsIHNpemUsIERNQV9GUk9NX0RFVklDRSk7CiAJCWVsc2UKIAkJCUJVR19PTihkaXIgIT0gRE1BX1RPX0RFVklDRSk7CiAJCWJyZWFrOwogCWNhc2UgU1lOQ19GT1JfREVWSUNFOgogCQlpZiAobGlrZWx5KGRpciA9PSBETUFfVE9fREVWSUNFIHx8IGRpciA9PSBETUFfQklESVJFQ1RJT05BTCkpCi0JCQlfX3N5bmNfc2luZ2xlKGJ1ZmZlciwgZG1hX2FkZHIsIHNpemUsIERNQV9UT19ERVZJQ0UpOworCQkJc3dpb3RsYl9ib3VuY2UocGh5cywgZG1hX2FkZHIsIHNpemUsIERNQV9UT19ERVZJQ0UpOwogCQllbHNlCiAJCQlCVUdfT04oZGlyICE9IERNQV9GUk9NX0RFVklDRSk7CiAJCWJyZWFrOwpAQCAtNTg1LDcgKzU1NSw5IEBACiAJCWRtYV9tYXNrID0gaHdkZXYtPmNvaGVyZW50X2RtYV9tYXNrOwogCiAJcmV0ID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKGZsYWdzLCBvcmRlcik7Ci0JaWYgKHJldCAmJiAhaXNfYnVmZmVyX2RtYV9jYXBhYmxlKGRtYV9tYXNrLCBzd2lvdGxiX3ZpcnRfdG9fYnVzKHJldCksIHNpemUpKSB7CisJaWYgKHJldCAmJgorCSAgICAhaXNfYnVmZmVyX2RtYV9jYXBhYmxlKGRtYV9tYXNrLCBzd2lvdGxiX3ZpcnRfdG9fYnVzKGh3ZGV2LCByZXQpLAorCQkJCSAgIHNpemUpKSB7CiAJCS8qCiAJCSAqIFRoZSBhbGxvY2F0ZWQgbWVtb3J5IGlzbid0IHJlYWNoYWJsZSBieSB0aGUgZGV2aWNlLgogCQkgKiBGYWxsIGJhY2sgb24gc3dpb3RsYl9tYXBfc2luZ2xlKCkuCkBAIC02MDAsMTYgKzU3MiwxMyBAQAogCQkgKiBzd2lvdGxiX21hcF9zaW5nbGUoKSwgd2hpY2ggd2lsbCBncmFiIG1lbW9yeSBmcm9tCiAJCSAqIHRoZSBsb3dlc3QgYXZhaWxhYmxlIGFkZHJlc3MgcmFuZ2UuCiAJCSAqLwotCQlzdHJ1Y3Qgc3dpb3RsYl9waHlzX2FkZHIgYnVmZmVyOwotCQlidWZmZXIucGFnZSA9IHZpcnRfdG9fcGFnZShOVUxMKTsKLQkJYnVmZmVyLm9mZnNldCA9IDA7Ci0JCXJldCA9IG1hcF9zaW5nbGUoaHdkZXYsIGJ1ZmZlciwgc2l6ZSwgRE1BX0ZST01fREVWSUNFKTsKKwkJcmV0ID0gbWFwX3NpbmdsZShod2RldiwgMCwgc2l6ZSwgRE1BX0ZST01fREVWSUNFKTsKIAkJaWYgKCFyZXQpCiAJCQlyZXR1cm4gTlVMTDsKIAl9CiAKIAltZW1zZXQocmV0LCAwLCBzaXplKTsKLQlkZXZfYWRkciA9IHN3aW90bGJfdmlydF90b19idXMocmV0KTsKKwlkZXZfYWRkciA9IHN3aW90bGJfdmlydF90b19idXMoaHdkZXYsIHJldCk7CiAKIAkvKiBDb25maXJtIGFkZHJlc3MgY2FuIGJlIERNQSdkIGJ5IGRldmljZSAqLwogCWlmICghaXNfYnVmZmVyX2RtYV9jYXBhYmxlKGRtYV9tYXNrLCBkZXZfYWRkciwgc2l6ZSkpIHsKQEAgLTYyNCw2ICs1OTMsNyBAQAogCSpkbWFfaGFuZGxlID0gZGV2X2FkZHI7CiAJcmV0dXJuIHJldDsKIH0KK0VYUE9SVF9TWU1CT0woc3dpb3RsYl9hbGxvY19jb2hlcmVudCk7CiAKIHZvaWQKIHN3aW90bGJfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc2l6ZV90IHNpemUsIHZvaWQgKnZhZGRyLApAQCAtNjM2LDYgKzYwNiw3IEBACiAJCS8qIERNQV9UT19ERVZJQ0UgdG8gYXZvaWQgbWVtY3B5IGluIHVubWFwX3NpbmdsZSAqLwogCQl1bm1hcF9zaW5nbGUoaHdkZXYsIHZhZGRyLCBzaXplLCBETUFfVE9fREVWSUNFKTsKIH0KK0VYUE9SVF9TWU1CT0woc3dpb3RsYl9mcmVlX2NvaGVyZW50KTsKIAogc3RhdGljIHZvaWQKIHN3aW90bGJfZnVsbChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLCBpbnQgZGlyLCBpbnQgZG9fcGFuaWMpCkBAIC02NDgsNyArNjE5LDcgQEAKIAkgKiB0aGUgZGFtYWdlLCBvciBwYW5pYyB3aGVuIHRoZSB0cmFuc2ZlciBpcyB0b28gYmlnLgogCSAqLwogCXByaW50ayhLRVJOX0VSUiAiRE1BOiBPdXQgb2YgU1ctSU9NTVUgc3BhY2UgZm9yICV6dSBieXRlcyBhdCAiCi0JICAgICAgICJkZXZpY2UgJXNcbiIsIHNpemUsIGRldiA/IGRldi0+YnVzX2lkIDogIj8iKTsKKwkgICAgICAgImRldmljZSAlc1xuIiwgc2l6ZSwgZGV2ID8gZGV2X25hbWUoZGV2KSA6ICI/Iik7CiAKIAlpZiAoc2l6ZSA+IGlvX3RsYl9vdmVyZmxvdyAmJiBkb19wYW5pYykgewogCQlpZiAoZGlyID09IERNQV9GUk9NX0RFVklDRSB8fCBkaXIgPT0gRE1BX0JJRElSRUNUSU9OQUwpCkBAIC02NjksOSArNjQwLDggQEAKIHN3aW90bGJfbWFwX3NpbmdsZV9hdHRycyhzdHJ1Y3QgZGV2aWNlICpod2Rldiwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwKIAkJCSBpbnQgZGlyLCBzdHJ1Y3QgZG1hX2F0dHJzICphdHRycykKIHsKLQlkbWFfYWRkcl90IGRldl9hZGRyID0gc3dpb3RsYl92aXJ0X3RvX2J1cyhwdHIpOworCWRtYV9hZGRyX3QgZGV2X2FkZHIgPSBzd2lvdGxiX3ZpcnRfdG9fYnVzKGh3ZGV2LCBwdHIpOwogCXZvaWQgKm1hcDsKLQlzdHJ1Y3Qgc3dpb3RsYl9waHlzX2FkZHIgYnVmZmVyOwogCiAJQlVHX09OKGRpciA9PSBETUFfTk9ORSk7CiAJLyoKQEAgLTY4NiwxNSArNjU2LDEzIEBACiAJLyoKIAkgKiBPaCB3ZWxsLCBoYXZlIHRvIGFsbG9jYXRlIGFuZCBtYXAgYSBib3VuY2UgYnVmZmVyLgogCSAqLwotCWJ1ZmZlci5wYWdlICAgPSB2aXJ0X3RvX3BhZ2UocHRyKTsKLQlidWZmZXIub2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpcHRyICYgflBBR0VfTUFTSzsKLQltYXAgPSBtYXBfc2luZ2xlKGh3ZGV2LCBidWZmZXIsIHNpemUsIGRpcik7CisJbWFwID0gbWFwX3NpbmdsZShod2RldiwgdmlydF90b19waHlzKHB0ciksIHNpemUsIGRpcik7CiAJaWYgKCFtYXApIHsKIAkJc3dpb3RsYl9mdWxsKGh3ZGV2LCBzaXplLCBkaXIsIDEpOwogCQltYXAgPSBpb190bGJfb3ZlcmZsb3dfYnVmZmVyOwogCX0KIAotCWRldl9hZGRyID0gc3dpb3RsYl92aXJ0X3RvX2J1cyhtYXApOworCWRldl9hZGRyID0gc3dpb3RsYl92aXJ0X3RvX2J1cyhod2RldiwgbWFwKTsKIAogCS8qCiAJICogRW5zdXJlIHRoYXQgdGhlIGFkZHJlc3MgcmV0dXJuZWQgaXMgRE1BJ2JsZQpAQCAtNzExLDYgKzY3OSw3IEBACiB7CiAJcmV0dXJuIHN3aW90bGJfbWFwX3NpbmdsZV9hdHRycyhod2RldiwgcHRyLCBzaXplLCBkaXIsIE5VTEwpOwogfQorRVhQT1JUX1NZTUJPTChzd2lvdGxiX21hcF9zaW5nbGUpOwogCiAvKgogICogVW5tYXAgYSBzaW5nbGUgc3RyZWFtaW5nIG1vZGUgRE1BIHRyYW5zbGF0aW9uLiAgVGhlIGRtYV9hZGRyIGFuZCBzaXplIG11c3QKQEAgLTc0MCw2ICs3MDksOCBAQAogewogCXJldHVybiBzd2lvdGxiX3VubWFwX3NpbmdsZV9hdHRycyhod2RldiwgZGV2X2FkZHIsIHNpemUsIGRpciwgTlVMTCk7CiB9CitFWFBPUlRfU1lNQk9MKHN3aW90bGJfdW5tYXBfc2luZ2xlKTsKKwogLyoKICAqIE1ha2UgcGh5c2ljYWwgbWVtb3J5IGNvbnNpc3RlbnQgZm9yIGEgc2luZ2xlIHN0cmVhbWluZyBtb2RlIERNQSB0cmFuc2xhdGlvbgogICogYWZ0ZXIgYSB0cmFuc2Zlci4KQEAgLTc2OSw2ICs3NDAsNyBAQAogewogCXN3aW90bGJfc3luY19zaW5nbGUoaHdkZXYsIGRldl9hZGRyLCBzaXplLCBkaXIsIFNZTkNfRk9SX0NQVSk7CiB9CitFWFBPUlRfU1lNQk9MKHN3aW90bGJfc3luY19zaW5nbGVfZm9yX2NwdSk7CiAKIHZvaWQKIHN3aW90bGJfc3luY19zaW5nbGVfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpod2RldiwgZG1hX2FkZHJfdCBkZXZfYWRkciwKQEAgLTc3Niw2ICs3NDgsNyBAQAogewogCXN3aW90bGJfc3luY19zaW5nbGUoaHdkZXYsIGRldl9hZGRyLCBzaXplLCBkaXIsIFNZTkNfRk9SX0RFVklDRSk7CiB9CitFWFBPUlRfU1lNQk9MKHN3aW90bGJfc3luY19zaW5nbGVfZm9yX2RldmljZSk7CiAKIC8qCiAgKiBTYW1lIGFzIGFib3ZlLCBidXQgZm9yIGEgc3ViLXJhbmdlIG9mIHRoZSBtYXBwaW5nLgpAQCAtODAxLDYgKzc3NCw3IEBACiAJc3dpb3RsYl9zeW5jX3NpbmdsZV9yYW5nZShod2RldiwgZGV2X2FkZHIsIG9mZnNldCwgc2l6ZSwgZGlyLAogCQkJCSAgU1lOQ19GT1JfQ1BVKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHN3aW90bGJfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2NwdSk7CiAKIHZvaWQKIHN3aW90bGJfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpod2RldiwgZG1hX2FkZHJfdCBkZXZfYWRkciwKQEAgLTgwOSw5ICs3ODMsOCBAQAogCXN3aW90bGJfc3luY19zaW5nbGVfcmFuZ2UoaHdkZXYsIGRldl9hZGRyLCBvZmZzZXQsIHNpemUsIGRpciwKIAkJCQkgIFNZTkNfRk9SX0RFVklDRSk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChzd2lvdGxiX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9kZXZpY2UpOwogCi12b2lkIHN3aW90bGJfdW5tYXBfc2dfYXR0cnMoc3RydWN0IGRldmljZSAqLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiwgaW50LCBpbnQsCi0JCQkgICAgc3RydWN0IGRtYV9hdHRycyAqKTsKIC8qCiAgKiBNYXAgYSBzZXQgb2YgYnVmZmVycyBkZXNjcmliZWQgYnkgc2NhdHRlcmxpc3QgaW4gc3RyZWFtaW5nIG1vZGUgZm9yIERNQS4KICAqIFRoaXMgaXMgdGhlIHNjYXR0ZXItZ2F0aGVyIHZlcnNpb24gb2YgdGhlIGFib3ZlIHN3aW90bGJfbWFwX3NpbmdsZQpAQCAtODMzLDIwICs4MDYsMTggQEAKIAkJICAgICBpbnQgZGlyLCBzdHJ1Y3QgZG1hX2F0dHJzICphdHRycykKIHsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwotCXN0cnVjdCBzd2lvdGxiX3BoeXNfYWRkciBidWZmZXI7Ci0JZG1hX2FkZHJfdCBkZXZfYWRkcjsKIAlpbnQgaTsKIAogCUJVR19PTihkaXIgPT0gRE1BX05PTkUpOwogCiAJZm9yX2VhY2hfc2coc2dsLCBzZywgbmVsZW1zLCBpKSB7Ci0JCWRldl9hZGRyID0gc3dpb3RsYl9zZ190b19idXMoc2cpOwotCQlpZiAocmFuZ2VfbmVlZHNfbWFwcGluZyhzZ192aXJ0KHNnKSwgc2ctPmxlbmd0aCkgfHwKKwkJdm9pZCAqYWRkciA9IHNnX3ZpcnQoc2cpOworCQlkbWFfYWRkcl90IGRldl9hZGRyID0gc3dpb3RsYl92aXJ0X3RvX2J1cyhod2RldiwgYWRkcik7CisKKwkJaWYgKHJhbmdlX25lZWRzX21hcHBpbmcoYWRkciwgc2ctPmxlbmd0aCkgfHwKIAkJICAgIGFkZHJlc3NfbmVlZHNfbWFwcGluZyhod2RldiwgZGV2X2FkZHIsIHNnLT5sZW5ndGgpKSB7Ci0JCQl2b2lkICptYXA7Ci0JCQlidWZmZXIucGFnZSAgID0gc2dfcGFnZShzZyk7Ci0JCQlidWZmZXIub2Zmc2V0ID0gc2ctPm9mZnNldDsKLQkJCW1hcCA9IG1hcF9zaW5nbGUoaHdkZXYsIGJ1ZmZlciwgc2ctPmxlbmd0aCwgZGlyKTsKKwkJCXZvaWQgKm1hcCA9IG1hcF9zaW5nbGUoaHdkZXYsIHNnX3BoeXMoc2cpLAorCQkJCQkgICAgICAgc2ctPmxlbmd0aCwgZGlyKTsKIAkJCWlmICghbWFwKSB7CiAJCQkJLyogRG9uJ3QgcGFuaWMgaGVyZSwgd2UgZXhwZWN0IG1hcF9zZyB1c2VycwogCQkJCSAgIHRvIGRvIHByb3BlciBlcnJvciBoYW5kbGluZy4gKi8KQEAgLTg1Niw3ICs4MjcsNyBAQAogCQkJCXNnbFswXS5kbWFfbGVuZ3RoID0gMDsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KLQkJCXNnLT5kbWFfYWRkcmVzcyA9IHN3aW90bGJfdmlydF90b19idXMobWFwKTsKKwkJCXNnLT5kbWFfYWRkcmVzcyA9IHN3aW90bGJfdmlydF90b19idXMoaHdkZXYsIG1hcCk7CiAJCX0gZWxzZQogCQkJc2ctPmRtYV9hZGRyZXNzID0gZGV2X2FkZHI7CiAJCXNnLT5kbWFfbGVuZ3RoID0gc2ctPmxlbmd0aDsKQEAgLTg3MSw2ICs4NDIsNyBAQAogewogCXJldHVybiBzd2lvdGxiX21hcF9zZ19hdHRycyhod2Rldiwgc2dsLCBuZWxlbXMsIGRpciwgTlVMTCk7CiB9CitFWFBPUlRfU1lNQk9MKHN3aW90bGJfbWFwX3NnKTsKIAogLyoKICAqIFVubWFwIGEgc2V0IG9mIHN0cmVhbWluZyBtb2RlIERNQSB0cmFuc2xhdGlvbnMuICBBZ2FpbiwgY3B1IHJlYWQgcnVsZXMKQEAgLTg4NiwxMSArODU4LDExIEBACiAJQlVHX09OKGRpciA9PSBETUFfTk9ORSk7CiAKIAlmb3JfZWFjaF9zZyhzZ2wsIHNnLCBuZWxlbXMsIGkpIHsKLQkJaWYgKHNnLT5kbWFfYWRkcmVzcyAhPSBzd2lvdGxiX3NnX3RvX2J1cyhzZykpCisJCWlmIChzZy0+ZG1hX2FkZHJlc3MgIT0gc3dpb3RsYl92aXJ0X3RvX2J1cyhod2Rldiwgc2dfdmlydChzZykpKQogCQkJdW5tYXBfc2luZ2xlKGh3ZGV2LCBzd2lvdGxiX2J1c190b192aXJ0KHNnLT5kbWFfYWRkcmVzcyksCiAJCQkJICAgICBzZy0+ZG1hX2xlbmd0aCwgZGlyKTsKIAkJZWxzZSBpZiAoZGlyID09IERNQV9GUk9NX0RFVklDRSkKLQkJCWRtYV9tYXJrX2NsZWFuKHN3aW90bGJfYnVzX3RvX3ZpcnQoc2ctPmRtYV9hZGRyZXNzKSwgc2ctPmRtYV9sZW5ndGgpOworCQkJZG1hX21hcmtfY2xlYW4oc2dfdmlydChzZyksIHNnLT5kbWFfbGVuZ3RoKTsKIAl9CiB9CiBFWFBPUlRfU1lNQk9MKHN3aW90bGJfdW5tYXBfc2dfYXR0cnMpOwpAQCAtOTAxLDYgKzg3Myw3IEBACiB7CiAJcmV0dXJuIHN3aW90bGJfdW5tYXBfc2dfYXR0cnMoaHdkZXYsIHNnbCwgbmVsZW1zLCBkaXIsIE5VTEwpOwogfQorRVhQT1JUX1NZTUJPTChzd2lvdGxiX3VubWFwX3NnKTsKIAogLyoKICAqIE1ha2UgcGh5c2ljYWwgbWVtb3J5IGNvbnNpc3RlbnQgZm9yIGEgc2V0IG9mIHN0cmVhbWluZyBtb2RlIERNQSB0cmFuc2xhdGlvbnMKQEAgLTkxOSwxMSArODkyLDExIEBACiAJQlVHX09OKGRpciA9PSBETUFfTk9ORSk7CiAKIAlmb3JfZWFjaF9zZyhzZ2wsIHNnLCBuZWxlbXMsIGkpIHsKLQkJaWYgKHNnLT5kbWFfYWRkcmVzcyAhPSBzd2lvdGxiX3NnX3RvX2J1cyhzZykpCisJCWlmIChzZy0+ZG1hX2FkZHJlc3MgIT0gc3dpb3RsYl92aXJ0X3RvX2J1cyhod2Rldiwgc2dfdmlydChzZykpKQogCQkJc3luY19zaW5nbGUoaHdkZXYsIHN3aW90bGJfYnVzX3RvX3ZpcnQoc2ctPmRtYV9hZGRyZXNzKSwKIAkJCQkgICAgc2ctPmRtYV9sZW5ndGgsIGRpciwgdGFyZ2V0KTsKIAkJZWxzZSBpZiAoZGlyID09IERNQV9GUk9NX0RFVklDRSkKLQkJCWRtYV9tYXJrX2NsZWFuKHN3aW90bGJfYnVzX3RvX3ZpcnQoc2ctPmRtYV9hZGRyZXNzKSwgc2ctPmRtYV9sZW5ndGgpOworCQkJZG1hX21hcmtfY2xlYW4oc2dfdmlydChzZyksIHNnLT5kbWFfbGVuZ3RoKTsKIAl9CiB9CiAKQEAgLTkzMyw2ICs5MDYsNyBAQAogewogCXN3aW90bGJfc3luY19zZyhod2Rldiwgc2csIG5lbGVtcywgZGlyLCBTWU5DX0ZPUl9DUFUpOwogfQorRVhQT1JUX1NZTUJPTChzd2lvdGxiX3N5bmNfc2dfZm9yX2NwdSk7CiAKIHZvaWQKIHN3aW90bGJfc3luY19zZ19mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLApAQCAtOTQwLDEyICs5MTQsMTQgQEAKIHsKIAlzd2lvdGxiX3N5bmNfc2coaHdkZXYsIHNnLCBuZWxlbXMsIGRpciwgU1lOQ19GT1JfREVWSUNFKTsKIH0KK0VYUE9SVF9TWU1CT0woc3dpb3RsYl9zeW5jX3NnX2Zvcl9kZXZpY2UpOwogCiBpbnQKIHN3aW90bGJfZG1hX21hcHBpbmdfZXJyb3Ioc3RydWN0IGRldmljZSAqaHdkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIpCiB7Ci0JcmV0dXJuIChkbWFfYWRkciA9PSBzd2lvdGxiX3ZpcnRfdG9fYnVzKGlvX3RsYl9vdmVyZmxvd19idWZmZXIpKTsKKwlyZXR1cm4gKGRtYV9hZGRyID09IHN3aW90bGJfdmlydF90b19idXMoaHdkZXYsIGlvX3RsYl9vdmVyZmxvd19idWZmZXIpKTsKIH0KK0VYUE9SVF9TWU1CT0woc3dpb3RsYl9kbWFfbWFwcGluZ19lcnJvcik7CiAKIC8qCiAgKiBSZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gZGV2aWNlIERNQSBhZGRyZXNzIG1hc2sgY2FuIGJlIHN1cHBvcnRlZApAQCAtOTU2LDIwICs5MzIsNiBAQAogaW50CiBzd2lvdGxiX2RtYV9zdXBwb3J0ZWQoc3RydWN0IGRldmljZSAqaHdkZXYsIHU2NCBtYXNrKQogewotCXJldHVybiBzd2lvdGxiX3ZpcnRfdG9fYnVzKGlvX3RsYl9lbmQgLSAxKSA8PSBtYXNrOworCXJldHVybiBzd2lvdGxiX3ZpcnRfdG9fYnVzKGh3ZGV2LCBpb190bGJfZW5kIC0gMSkgPD0gbWFzazsKIH0KLQotRVhQT1JUX1NZTUJPTChzd2lvdGxiX21hcF9zaW5nbGUpOwotRVhQT1JUX1NZTUJPTChzd2lvdGxiX3VubWFwX3NpbmdsZSk7Ci1FWFBPUlRfU1lNQk9MKHN3aW90bGJfbWFwX3NnKTsKLUVYUE9SVF9TWU1CT0woc3dpb3RsYl91bm1hcF9zZyk7Ci1FWFBPUlRfU1lNQk9MKHN3aW90bGJfc3luY19zaW5nbGVfZm9yX2NwdSk7Ci1FWFBPUlRfU1lNQk9MKHN3aW90bGJfc3luY19zaW5nbGVfZm9yX2RldmljZSk7Ci1FWFBPUlRfU1lNQk9MX0dQTChzd2lvdGxiX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9jcHUpOwotRVhQT1JUX1NZTUJPTF9HUEwoc3dpb3RsYl9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfZGV2aWNlKTsKLUVYUE9SVF9TWU1CT0woc3dpb3RsYl9zeW5jX3NnX2Zvcl9jcHUpOwotRVhQT1JUX1NZTUJPTChzd2lvdGxiX3N5bmNfc2dfZm9yX2RldmljZSk7Ci1FWFBPUlRfU1lNQk9MKHN3aW90bGJfZG1hX21hcHBpbmdfZXJyb3IpOwotRVhQT1JUX1NZTUJPTChzd2lvdGxiX2FsbG9jX2NvaGVyZW50KTsKLUVYUE9SVF9TWU1CT0woc3dpb3RsYl9mcmVlX2NvaGVyZW50KTsKIEVYUE9SVF9TWU1CT0woc3dpb3RsYl9kbWFfc3VwcG9ydGVkKTsKZGlmZiAtLWdpdCBhL2xpYi92c3ByaW50Zi5jIGIvbGliL3ZzcHJpbnRmLmMKaW5kZXggOThkNjMyMi4uMGZiZDAxMiAxMDA2NDQKLS0tIGEvbGliL3ZzcHJpbnRmLmMKKysrIGIvbGliL3ZzcHJpbnRmLmMKQEAgLTE3MCw2ICsxNzAsOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGNwLCAmdGFpbCwgYmFzZSk7CisJaWYgKHRhaWwgPT0gY3ApCisJCXJldHVybiAtRUlOVkFMOwogCWlmICgoKnRhaWwgPT0gJ1wwJykgfHwKIAkJKChsZW4gPT0gKHNpemVfdCkodGFpbCAtIGNwKSArIDEpICYmICgqdGFpbCA9PSAnXG4nKSkpIHsKIAkJKnJlcyA9IHZhbDsKQEAgLTI0MSw2ICsyNDMsOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXZhbCA9IHNpbXBsZV9zdHJ0b3VsbChjcCwgJnRhaWwsIGJhc2UpOworCWlmICh0YWlsID09IGNwKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoKCp0YWlsID09ICdcMCcpIHx8CiAJCSgobGVuID09IChzaXplX3QpKHRhaWwgLSBjcCkgKyAxKSAmJiAoKnRhaWwgPT0gJ1xuJykpKSB7CiAJCSpyZXMgPSB2YWw7CmRpZmYgLS1naXQgYS9tbS9LY29uZmlnIGIvbW0vS2NvbmZpZwppbmRleCA1YjU3OTBmLi5hNWI3NzgxIDEwMDY0NAotLS0gYS9tbS9LY29uZmlnCisrKyBiL21tL0tjb25maWcKQEAgLTE4MSwxMiArMTgxLDYgQEAKIAkgIGV4YW1wbGUgb24gTlVNQSBzeXN0ZW1zIHRvIHB1dCBwYWdlcyBuZWFyZXIgdG8gdGhlIHByb2Nlc3NvcnMgYWNjZXNzaW5nCiAJICB0aGUgcGFnZS4KIAotY29uZmlnIFJFU09VUkNFU182NEJJVAotCWJvb2wgIjY0IGJpdCBNZW1vcnkgYW5kIElPIHJlc291cmNlcyAoRVhQRVJJTUVOVEFMKSIgaWYgKCE2NEJJVCAmJiBFWFBFUklNRU5UQUwpCi0JZGVmYXVsdCA2NEJJVAotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGFsbG93cyBtZW1vcnkgYW5kIElPIHJlc291cmNlcyB0byBiZSA2NCBiaXQuCi0KIGNvbmZpZyBQSFlTX0FERFJfVF82NEJJVAogCWRlZl9ib29sIDY0QklUIHx8IEFSQ0hfUEhZU19BRERSX1RfNjRCSVQKIApkaWZmIC0tZ2l0IGEvbW0vTWFrZWZpbGUgYi9tbS9NYWtlZmlsZQppbmRleCA1MWMyNzcwLi43MjI1NWJlIDEwMDY0NAotLS0gYS9tbS9NYWtlZmlsZQorKysgYi9tbS9NYWtlZmlsZQpAQCAtOSw3ICs5LDcgQEAKIAogb2JqLXkJCQk6PSBib290bWVtLm8gZmlsZW1hcC5vIG1lbXBvb2wubyBvb21fa2lsbC5vIGZhZHZpc2UubyBcCiAJCQkgICBtYWNjZXNzLm8gcGFnZV9hbGxvYy5vIHBhZ2Utd3JpdGViYWNrLm8gcGRmbHVzaC5vIFwKLQkJCSAgIHJlYWRhaGVhZC5vIHN3YXAubyB0cnVuY2F0ZS5vIHZtc2Nhbi5vIFwKKwkJCSAgIHJlYWRhaGVhZC5vIHN3YXAubyB0cnVuY2F0ZS5vIHZtc2Nhbi5vIHNobWVtLm8gXAogCQkJICAgcHJpb190cmVlLm8gdXRpbC5vIG1tem9uZS5vIHZtc3RhdC5vIGJhY2tpbmctZGV2Lm8gXAogCQkJICAgcGFnZV9pc29sYXRpb24ubyBtbV9pbml0Lm8gJChtbXUteSkKIApAQCAtMjEsOSArMjEsNyBAQAogb2JqLSQoQ09ORklHX05VTUEpIAkrPSBtZW1wb2xpY3kubwogb2JqLSQoQ09ORklHX1NQQVJTRU1FTSkJKz0gc3BhcnNlLm8KIG9iai0kKENPTkZJR19TUEFSU0VNRU1fVk1FTU1BUCkgKz0gc3BhcnNlLXZtZW1tYXAubwotb2JqLSQoQ09ORklHX1NITUVNKSArPSBzaG1lbS5vCiBvYmotJChDT05GSUdfVE1QRlNfUE9TSVhfQUNMKSArPSBzaG1lbV9hY2wubwotb2JqLSQoQ09ORklHX1RJTllfU0hNRU0pICs9IHRpbnktc2htZW0ubwogb2JqLSQoQ09ORklHX1NMT0IpICs9IHNsb2Iubwogb2JqLSQoQ09ORklHX01NVV9OT1RJRklFUikgKz0gbW11X25vdGlmaWVyLm8KIG9iai0kKENPTkZJR19TTEFCKSArPSBzbGFiLm8KZGlmZiAtLWdpdCBhL21tL2JhY2tpbmctZGV2LmMgYi9tbS9iYWNraW5nLWRldi5jCmluZGV4IDgwMWMwOGIuLjhlODU4NzQgMTAwNjQ0Ci0tLSBhL21tL2JhY2tpbmctZGV2LmMKKysrIGIvbW0vYmFja2luZy1kZXYuYwpAQCAtMjQsOSArMjQsOSBAQAogc3RhdGljIGludCBiZGlfZGVidWdfc3RhdHNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiB7CiAJc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSA9IG0tPnByaXZhdGU7Ci0JbG9uZyBiYWNrZ3JvdW5kX3RocmVzaDsKLQlsb25nIGRpcnR5X3RocmVzaDsKLQlsb25nIGJkaV90aHJlc2g7CisJdW5zaWduZWQgbG9uZyBiYWNrZ3JvdW5kX3RocmVzaDsKKwl1bnNpZ25lZCBsb25nIGRpcnR5X3RocmVzaDsKKwl1bnNpZ25lZCBsb25nIGJkaV90aHJlc2g7CiAKIAlnZXRfZGlydHlfbGltaXRzKCZiYWNrZ3JvdW5kX3RocmVzaCwgJmRpcnR5X3RocmVzaCwgJmJkaV90aHJlc2gsIGJkaSk7CiAKQEAgLTIyMyw3ICsyMjMsNyBAQAogCWJkaS0+bWF4X3Byb3BfZnJhYyA9IFBST1BfRlJBQ19CQVNFOwogCiAJZm9yIChpID0gMDsgaSA8IE5SX0JESV9TVEFUX0lURU1TOyBpKyspIHsKLQkJZXJyID0gcGVyY3B1X2NvdW50ZXJfaW5pdF9pcnEoJmJkaS0+YmRpX3N0YXRbaV0sIDApOworCQllcnIgPSBwZXJjcHVfY291bnRlcl9pbml0KCZiZGktPmJkaV9zdGF0W2ldLCAwKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gZXJyOwogCX0KZGlmZiAtLWdpdCBhL21tL2Jvb3RtZW0uYyBiL21tL2Jvb3RtZW0uYwppbmRleCBhYzVhODkxLi41MWEwY2NmIDEwMDY0NAotLS0gYS9tbS9ib290bWVtLmMKKysrIGIvbW0vYm9vdG1lbS5jCkBAIC00MzUsNiArNDM1LDEwIEBACiAJdW5zaWduZWQgbG9uZyBmYWxsYmFjayA9IDA7CiAJdW5zaWduZWQgbG9uZyBtaW4sIG1heCwgc3RhcnQsIHNpZHgsIG1pZHgsIHN0ZXA7CiAKKwliZGVidWcoIm5pZD0ldGQgc2l6ZT0lbHggWyVsdSBwYWdlc10gYWxpZ249JWx4IGdvYWw9JWx4IGxpbWl0PSVseFxuIiwKKwkJYmRhdGEgLSBib290bWVtX25vZGVfZGF0YSwgc2l6ZSwgUEFHRV9BTElHTihzaXplKSA+PiBQQUdFX1NISUZULAorCQlhbGlnbiwgZ29hbCwgbGltaXQpOworCiAJQlVHX09OKCFzaXplKTsKIAlCVUdfT04oYWxpZ24gJiAoYWxpZ24gLSAxKSk7CiAJQlVHX09OKGxpbWl0ICYmIGdvYWwgKyBzaXplID4gbGltaXQpOwpAQCAtNDQyLDEwICs0NDYsNiBAQAogCWlmICghYmRhdGEtPm5vZGVfYm9vdG1lbV9tYXApCiAJCXJldHVybiBOVUxMOwogCi0JYmRlYnVnKCJuaWQ9JXRkIHNpemU9JWx4IFslbHUgcGFnZXNdIGFsaWduPSVseCBnb2FsPSVseCBsaW1pdD0lbHhcbiIsCi0JCWJkYXRhIC0gYm9vdG1lbV9ub2RlX2RhdGEsIHNpemUsIFBBR0VfQUxJR04oc2l6ZSkgPj4gUEFHRV9TSElGVCwKLQkJYWxpZ24sIGdvYWwsIGxpbWl0KTsKLQogCW1pbiA9IGJkYXRhLT5ub2RlX21pbl9wZm47CiAJbWF4ID0gYmRhdGEtPm5vZGVfbG93X3BmbjsKIApkaWZmIC0tZ2l0IGEvbW0vZmlsZW1hcC5jIGIvbW0vZmlsZW1hcC5jCmluZGV4IGY4YzY5MjcuLmNlYmEwYmQgMTAwNjQ0Ci0tLSBhL21tL2ZpbGVtYXAuYworKysgYi9tbS9maWxlbWFwLmMKQEAgLTIxMCw3ICsyMTAsNyBAQAogCWludCByZXQ7CiAJc3RydWN0IHdyaXRlYmFja19jb250cm9sIHdiYyA9IHsKIAkJLnN5bmNfbW9kZSA9IHN5bmNfbW9kZSwKLQkJLm5yX3RvX3dyaXRlID0gbWFwcGluZy0+bnJwYWdlcyAqIDIsCisJCS5ucl90b193cml0ZSA9IExPTkdfTUFYLAogCQkucmFuZ2Vfc3RhcnQgPSBzdGFydCwKIAkJLnJhbmdlX2VuZCA9IGVuZCwKIAl9OwpAQCAtNDYwLDcgKzQ2MCw3IEBACiAJVk1fQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKIAogCWVycm9yID0gbWVtX2Nncm91cF9jYWNoZV9jaGFyZ2UocGFnZSwgY3VycmVudC0+bW0sCi0JCQkJCWdmcF9tYXNrICYgfl9fR0ZQX0hJR0hNRU0pOworCQkJCQlnZnBfbWFzayAmIEdGUF9SRUNMQUlNX01BU0spOwogCWlmIChlcnJvcikKIAkJZ290byBvdXQ7CiAKQEAgLTc0MSw3ICs3NDEsMTQgQEAKIAkJcGFnZSA9IF9fcGFnZV9jYWNoZV9hbGxvYyhnZnBfbWFzayk7CiAJCWlmICghcGFnZSkKIAkJCXJldHVybiBOVUxMOwotCQllcnIgPSBhZGRfdG9fcGFnZV9jYWNoZV9scnUocGFnZSwgbWFwcGluZywgaW5kZXgsIGdmcF9tYXNrKTsKKwkJLyoKKwkJICogV2Ugd2FudCBhIHJlZ3VsYXIga2VybmVsIG1lbW9yeSAobm90IGhpZ2htZW0gb3IgRE1BIGV0YykKKwkJICogYWxsb2NhdGlvbiBmb3IgdGhlIHJhZGl4IHRyZWUgbm9kZXMsIGJ1dCB3ZSBuZWVkIHRvIGhvbm91cgorCQkgKiB0aGUgY29udGV4dC1zcGVjaWZpYyByZXF1aXJlbWVudHMgdGhlIGNhbGxlciBoYXMgYXNrZWQgZm9yLgorCQkgKiBHRlBfUkVDTEFJTV9NQVNLIGNvbGxlY3RzIHRob3NlIHJlcXVpcmVtZW50cy4KKwkJICovCisJCWVyciA9IGFkZF90b19wYWdlX2NhY2hlX2xydShwYWdlLCBtYXBwaW5nLCBpbmRleCwKKwkJCShnZnBfbWFzayAmIEdGUF9SRUNMQUlNX01BU0spKTsKIAkJaWYgKHVubGlrZWx5KGVycikpIHsKIAkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAkJCXBhZ2UgPSBOVUxMOwpAQCAtOTUwLDcgKzk1Nyw3IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAlwYWdlID0gX19wYWdlX2NhY2hlX2FsbG9jKG1hcHBpbmdfZ2ZwX21hc2sobWFwcGluZykgJiB+X19HRlBfRlMpOwotCWlmIChwYWdlICYmIGFkZF90b19wYWdlX2NhY2hlX2xydShwYWdlLCBtYXBwaW5nLCBpbmRleCwgR0ZQX0tFUk5FTCkpIHsKKwlpZiAocGFnZSAmJiBhZGRfdG9fcGFnZV9jYWNoZV9scnUocGFnZSwgbWFwcGluZywgaW5kZXgsIEdGUF9OT0ZTKSkgewogCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJCXBhZ2UgPSBOVUxMOwogCX0KQEAgLTEzMTcsNyArMTMyNCw4IEBACiAJCQlnb3RvIG91dDsgLyogc2tpcCBhdGltZSAqLwogCQlzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOwogCQlpZiAocG9zIDwgc2l6ZSkgewotCQkJcmV0dmFsID0gZmlsZW1hcF93cml0ZV9hbmRfd2FpdChtYXBwaW5nKTsKKwkJCXJldHZhbCA9IGZpbGVtYXBfd3JpdGVfYW5kX3dhaXRfcmFuZ2UobWFwcGluZywgcG9zLAorCQkJCQlwb3MgKyBpb3ZfbGVuZ3RoKGlvdiwgbnJfc2VncykgLSAxKTsKIAkJCWlmICghcmV0dmFsKSB7CiAJCQkJcmV0dmFsID0gbWFwcGluZy0+YV9vcHMtPmRpcmVjdF9JTyhSRUFELCBpb2NiLAogCQkJCQkJCWlvdiwgcG9zLCBucl9zZWdzKTsKQEAgLTE1MzAsNyArMTUzOCw2IEBACiAJLyoKIAkgKiBGb3VuZCB0aGUgcGFnZSBhbmQgaGF2ZSBhIHJlZmVyZW5jZSBvbiBpdC4KIAkgKi8KLQltYXJrX3BhZ2VfYWNjZXNzZWQocGFnZSk7CiAJcmEtPnByZXZfcG9zID0gKGxvZmZfdClwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUOwogCXZtZi0+cGFnZSA9IHBhZ2U7CiAJcmV0dXJuIHJldCB8IFZNX0ZBVUxUX0xPQ0tFRDsKQEAgLTE3NjYsNyArMTc3Myw3IEBACiAJaWYgKHVubGlrZWx5KChtb2RlICYgU19JU0dJRCkgJiYgKG1vZGUgJiBTX0lYR1JQKSkpCiAJCWtpbGwgfD0gQVRUUl9LSUxMX1NHSUQ7CiAKLQlpZiAodW5saWtlbHkoa2lsbCAmJiAhY2FwYWJsZShDQVBfRlNFVElEKSkpCisJaWYgKHVubGlrZWx5KGtpbGwgJiYgIWNhcGFibGUoQ0FQX0ZTRVRJRCkgJiYgU19JU1JFRyhtb2RlKSkpCiAJCXJldHVybiBraWxsOwogCiAJcmV0dXJuIDA7CkBAIC0yMDYwLDE4ICsyMDY3LDEwIEBACiAJaWYgKGNvdW50ICE9IG9jb3VudCkKIAkJKm5yX3NlZ3MgPSBpb3Zfc2hvcnRlbigoc3RydWN0IGlvdmVjICopaW92LCAqbnJfc2VncywgY291bnQpOwogCi0JLyoKLQkgKiBVbm1hcCBhbGwgbW1hcHBpbmdzIG9mIHRoZSBmaWxlIHVwLWZyb250LgotCSAqCi0JICogVGhpcyB3aWxsIGNhdXNlIGFueSBwdGUgZGlydHkgYml0cyB0byBiZSBwcm9wYWdhdGVkIGludG8gdGhlCi0JICogcGFnZWZyYW1lcyBmb3IgdGhlIHN1YnNlcXVlbnQgZmlsZW1hcF93cml0ZV9hbmRfd2FpdCgpLgotCSAqLwogCXdyaXRlX2xlbiA9IGlvdl9sZW5ndGgoaW92LCAqbnJfc2Vncyk7CiAJZW5kID0gKHBvcyArIHdyaXRlX2xlbiAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7Ci0JaWYgKG1hcHBpbmdfbWFwcGVkKG1hcHBpbmcpKQotCQl1bm1hcF9tYXBwaW5nX3JhbmdlKG1hcHBpbmcsIHBvcywgd3JpdGVfbGVuLCAwKTsKIAotCXdyaXR0ZW4gPSBmaWxlbWFwX3dyaXRlX2FuZF93YWl0KG1hcHBpbmcpOworCXdyaXR0ZW4gPSBmaWxlbWFwX3dyaXRlX2FuZF93YWl0X3JhbmdlKG1hcHBpbmcsIHBvcywgcG9zICsgd3JpdGVfbGVuIC0gMSk7CiAJaWYgKHdyaXR0ZW4pCiAJCWdvdG8gb3V0OwogCkBAIC0yMjkxLDcgKzIyOTAsOCBAQAogCSAqIHRoZSBmaWxlIGRhdGEgaGVyZSwgdG8gdHJ5IHRvIGhvbm91ciBPX0RJUkVDVCBleHBlY3RhdGlvbnMuCiAJICovCiAJaWYgKHVubGlrZWx5KGZpbGUtPmZfZmxhZ3MgJiBPX0RJUkVDVCkgJiYgd3JpdHRlbikKLQkJc3RhdHVzID0gZmlsZW1hcF93cml0ZV9hbmRfd2FpdChtYXBwaW5nKTsKKwkJc3RhdHVzID0gZmlsZW1hcF93cml0ZV9hbmRfd2FpdF9yYW5nZShtYXBwaW5nLAorCQkJCQlwb3MsIHBvcyArIHdyaXR0ZW4gLSAxKTsKIAogCXJldHVybiB3cml0dGVuID8gd3JpdHRlbiA6IHN0YXR1czsKIH0KZGlmZiAtLWdpdCBhL21tL2ZpbGVtYXBfeGlwLmMgYi9tbS9maWxlbWFwX3hpcC5jCmluZGV4IGI1MTY3ZGYuLjBjMDQ2MTUgMTAwNjQ0Ci0tLSBhL21tL2ZpbGVtYXBfeGlwLmMKKysrIGIvbW0vZmlsZW1hcF94aXAuYwpAQCAtMTkzLDcgKzE5Myw3IEBACiAJCQkvKiBOdWtlIHRoZSBwYWdlIHRhYmxlIGVudHJ5LiAqLwogCQkJZmx1c2hfY2FjaGVfcGFnZSh2bWEsIGFkZHJlc3MsIHB0ZV9wZm4oKnB0ZSkpOwogCQkJcHRldmFsID0gcHRlcF9jbGVhcl9mbHVzaF9ub3RpZnkodm1hLCBhZGRyZXNzLCBwdGUpOwotCQkJcGFnZV9yZW1vdmVfcm1hcChwYWdlLCB2bWEpOworCQkJcGFnZV9yZW1vdmVfcm1hcChwYWdlKTsKIAkJCWRlY19tbV9jb3VudGVyKG1tLCBmaWxlX3Jzcyk7CiAJCQlCVUdfT04ocHRlX2RpcnR5KHB0ZXZhbCkpOwogCQkJcHRlX3VubWFwX3VubG9jayhwdGUsIHB0bCk7CmRpZmYgLS1naXQgYS9tbS9mcmVtYXAuYyBiL21tL2ZyZW1hcC5jCmluZGV4IDdkMTJjYTcuLjYyZDViYmQgMTAwNjQ0Ci0tLSBhL21tL2ZyZW1hcC5jCisrKyBiL21tL2ZyZW1hcC5jCkBAIC0zNyw3ICszNyw3IEBACiAJCWlmIChwYWdlKSB7CiAJCQlpZiAocHRlX2RpcnR5KHB0ZSkpCiAJCQkJc2V0X3BhZ2VfZGlydHkocGFnZSk7Ci0JCQlwYWdlX3JlbW92ZV9ybWFwKHBhZ2UsIHZtYSk7CisJCQlwYWdlX3JlbW92ZV9ybWFwKHBhZ2UpOwogCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwogCQkJdXBkYXRlX2hpd2F0ZXJfcnNzKG1tKTsKIAkJCWRlY19tbV9jb3VudGVyKG1tLCBmaWxlX3Jzcyk7CmRpZmYgLS1naXQgYS9tbS9odWdldGxiLmMgYi9tbS9odWdldGxiLmMKaW5kZXggNjA1OGI1My4uNjE4ZTk4MyAxMDA2NDQKLS0tIGEvbW0vaHVnZXRsYi5jCisrKyBiL21tL2h1Z2V0bGIuYwpAQCAtMjIwLDYgKzIyMCwzNSBAQAogfQogCiAvKgorICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBwYWdlcyBhbGxvY2F0ZWQgd2hlbiBiYWNraW5nIGEgVk1BLiBJbiB0aGUgbWFqb3JpdHkKKyAqIGNhc2VzIHRoaXMgd2lsbCBiZSBzYW1lIHNpemUgYXMgdXNlZCBieSB0aGUgcGFnZSB0YWJsZSBlbnRyaWVzLgorICovCit1bnNpZ25lZCBsb25nIHZtYV9rZXJuZWxfcGFnZXNpemUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IGhzdGF0ZSAqaHN0YXRlOworCisJaWYgKCFpc192bV9odWdldGxiX3BhZ2Uodm1hKSkKKwkJcmV0dXJuIFBBR0VfU0laRTsKKworCWhzdGF0ZSA9IGhzdGF0ZV92bWEodm1hKTsKKworCXJldHVybiAxVUwgPDwgKGhzdGF0ZS0+b3JkZXIgKyBQQUdFX1NISUZUKTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgcGFnZSBzaXplIGJlaW5nIHVzZWQgYnkgdGhlIE1NVSB0byBiYWNrIGEgVk1BLiBJbiB0aGUgbWFqb3JpdHkKKyAqIG9mIGNhc2VzLCB0aGUgcGFnZSBzaXplIHVzZWQgYnkgdGhlIGtlcm5lbCBtYXRjaGVzIHRoZSBNTVUgc2l6ZS4gT24KKyAqIGFyY2hpdGVjdHVyZXMgd2hlcmUgaXQgZGlmZmVycywgYW4gYXJjaGl0ZWN0dXJlLXNwZWNpZmljIHZlcnNpb24gb2YgdGhpcworICogZnVuY3Rpb24gaXMgcmVxdWlyZWQuCisgKi8KKyNpZm5kZWYgdm1hX21tdV9wYWdlc2l6ZQordW5zaWduZWQgbG9uZyB2bWFfbW11X3BhZ2VzaXplKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXJldHVybiB2bWFfa2VybmVsX3BhZ2VzaXplKHZtYSk7Cit9CisjZW5kaWYKKworLyoKICAqIEZsYWdzIGZvciBNQVBfUFJJVkFURSByZXNlcnZhdGlvbnMuICBUaGVzZSBhcmUgc3RvcmVkIGluIHRoZSBib3R0b20KICAqIGJpdHMgb2YgdGhlIHJlc2VydmF0aW9uIG1hcCBwb2ludGVyLCB3aGljaCBhcmUgYWx3YXlzIGNsZWFyIGR1ZSB0bwogICogYWxpZ25tZW50LgpAQCAtMzcxLDggKzQwMCwxMCBAQAogewogCWludCBpOwogCi0JaWYgKHVubGlrZWx5KHN6ID4gTUFYX09SREVSX05SX1BBR0VTKSkKLQkJcmV0dXJuIGNsZWFyX2dpZ2FudGljX3BhZ2UocGFnZSwgYWRkciwgc3opOworCWlmICh1bmxpa2VseShzeiA+IE1BWF9PUkRFUl9OUl9QQUdFUykpIHsKKwkJY2xlYXJfZ2lnYW50aWNfcGFnZShwYWdlLCBhZGRyLCBzeik7CisJCXJldHVybjsKKwl9CiAKIAltaWdodF9zbGVlcCgpOwogCWZvciAoaSA9IDA7IGkgPCBzei9QQUdFX1NJWkU7IGkrKykgewpAQCAtNDA0LDggKzQzNSwxMCBAQAogCWludCBpOwogCXN0cnVjdCBoc3RhdGUgKmggPSBoc3RhdGVfdm1hKHZtYSk7CiAKLQlpZiAodW5saWtlbHkocGFnZXNfcGVyX2h1Z2VfcGFnZShoKSA+IE1BWF9PUkRFUl9OUl9QQUdFUykpCi0JCXJldHVybiBjb3B5X2dpZ2FudGljX3BhZ2UoZHN0LCBzcmMsIGFkZHIsIHZtYSk7CisJaWYgKHVubGlrZWx5KHBhZ2VzX3Blcl9odWdlX3BhZ2UoaCkgPiBNQVhfT1JERVJfTlJfUEFHRVMpKSB7CisJCWNvcHlfZ2lnYW50aWNfcGFnZShkc3QsIHNyYywgYWRkciwgdm1hKTsKKwkJcmV0dXJuOworCX0KIAogCW1pZ2h0X3NsZWVwKCk7CiAJZm9yIChpID0gMDsgaSA8IHBhZ2VzX3Blcl9odWdlX3BhZ2UoaCk7IGkrKykgewpAQCAtOTcyLDcgKzEwMDUsNyBAQAogCXJldHVybiBwYWdlOwogfQogCi1fX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgaW50IGFsbG9jX2Jvb3RtZW1faHVnZV9wYWdlKHN0cnVjdCBoc3RhdGUgKmgpCitpbnQgX193ZWFrIGFsbG9jX2Jvb3RtZW1faHVnZV9wYWdlKHN0cnVjdCBoc3RhdGUgKmgpCiB7CiAJc3RydWN0IGh1Z2VfYm9vdG1lbV9wYWdlICptOwogCWludCBucl9ub2RlcyA9IG5vZGVzX3dlaWdodChub2RlX29ubGluZV9tYXApOwpAQCAtOTkxLDggKzEwMjQsNyBAQAogCQkJICogcHV0cyB0aGVtIGludG8gdGhlIG1lbV9tYXApLgogCQkJICovCiAJCQltID0gYWRkcjsKLQkJCWlmIChtKQotCQkJCWdvdG8gZm91bmQ7CisJCQlnb3RvIGZvdW5kOwogCQl9CiAJCWhzdGF0ZV9uZXh0X25vZGUoaCk7CiAJCW5yX25vZGVzLS07CmRpZmYgLS1naXQgYS9tbS9pbnRlcm5hbC5oIGIvbW0vaW50ZXJuYWwuaAppbmRleCAxMzMzM2JjLi40NzgyMjNiIDEwMDY0NAotLS0gYS9tbS9pbnRlcm5hbC5oCisrKyBiL21tL2ludGVybmFsLmgKQEAgLTQ5LDYgKzQ5LDcgQEAKIC8qCiAgKiBpbiBtbS9wYWdlX2FsbG9jLmMKICAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaGlnaGVzdF9tZW1tYXBfcGZuOwogZXh0ZXJuIHZvaWQgX19mcmVlX3BhZ2VzX2Jvb3RtZW0oc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGludCBvcmRlcik7CiAKIC8qCkBAIC0yNzUsNiArMjc2LDcgQEAKICNkZWZpbmUgR1VQX0ZMQUdTX1dSSVRFICAgICAgICAgICAgICAgICAgMHgxCiAjZGVmaW5lIEdVUF9GTEFHU19GT1JDRSAgICAgICAgICAgICAgICAgIDB4MgogI2RlZmluZSBHVVBfRkxBR1NfSUdOT1JFX1ZNQV9QRVJNSVNTSU9OUyAweDQKKyNkZWZpbmUgR1VQX0ZMQUdTX0lHTk9SRV9TSUdLSUxMICAgICAgICAgMHg4CiAKIGludCBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0LCBpbnQgbGVuLCBpbnQgZmxhZ3MsCmRpZmYgLS1naXQgYS9tbS9tZW1jb250cm9sLmMgYi9tbS9tZW1jb250cm9sLmMKaW5kZXggODY2ZGNjNy4uZTI5OTZiOCAxMDA2NDQKLS0tIGEvbW0vbWVtY29udHJvbC5jCisrKyBiL21tL21lbWNvbnRyb2wuYwpAQCAtMjEsMTEgKzIxLDEzIEBACiAjaW5jbHVkZSA8bGludXgvbWVtY29udHJvbC5oPgogI2luY2x1ZGUgPGxpbnV4L2Nncm91cC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2UtZmxhZ3MuaD4KICNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdF9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CkBAIC0zNCwxMiArMzYsMjMgQEAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvbW1faW5saW5lLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZV9jZ3JvdXAuaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAogc3RydWN0IGNncm91cF9zdWJzeXMgbWVtX2Nncm91cF9zdWJzeXMgX19yZWFkX21vc3RseTsKICNkZWZpbmUgTUVNX0NHUk9VUF9SRUNMQUlNX1JFVFJJRVMJNQogCisjaWZkZWYgQ09ORklHX0NHUk9VUF9NRU1fUkVTX0NUTFJfU1dBUAorLyogVHVybmVkIG9uIG9ubHkgd2hlbiBtZW1vcnkgY2dyb3VwIGlzIGVuYWJsZWQgJiYgcmVhbGx5X2RvX3N3YXBfYWNjb3VudCA9IDAgKi8KK2ludCBkb19zd2FwX2FjY291bnQgX19yZWFkX21vc3RseTsKK3N0YXRpYyBpbnQgcmVhbGx5X2RvX3N3YXBfYWNjb3VudCBfX2luaXRkYXRhID0gMTsgLyogZm9yIHJlbWVtYmVyIGJvb3Qgb3B0aW9uKi8KKyNlbHNlCisjZGVmaW5lIGRvX3N3YXBfYWNjb3VudAkJKDApCisjZW5kaWYKKworc3RhdGljIERFRklORV9NVVRFWChtZW1jZ190YXNrbGlzdCk7CS8qIGNhbiBiZSBob2xkIHVuZGVyIGNncm91cF9tdXRleCAqLworCiAvKgogICogU3RhdGlzdGljcyBmb3IgbWVtb3J5IGNncm91cC4KICAqLwpAQCAtNjAsNyArNzMsNyBAQAogfSBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOwogCiBzdHJ1Y3QgbWVtX2Nncm91cF9zdGF0IHsKLQlzdHJ1Y3QgbWVtX2Nncm91cF9zdGF0X2NwdSBjcHVzdGF0W05SX0NQVVNdOworCXN0cnVjdCBtZW1fY2dyb3VwX3N0YXRfY3B1IGNwdXN0YXRbMF07CiB9OwogCiAvKgpAQCAtODksOSArMTAyLDEwIEBACiAJLyoKIAkgKiBzcGluX2xvY2sgdG8gcHJvdGVjdCB0aGUgcGVyIGNncm91cCBMUlUKIAkgKi8KLQlzcGlubG9ja190CQlscnVfbG9jazsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3RzW05SX0xSVV9MSVNUU107CiAJdW5zaWduZWQgbG9uZwkJY291bnRbTlJfTFJVX0xJU1RTXTsKKworCXN0cnVjdCB6b25lX3JlY2xhaW1fc3RhdCByZWNsYWltX3N0YXQ7CiB9OwogLyogTWFjcm8gZm9yIGFjY2Vzc2luZyBjb3VudGVyICovCiAjZGVmaW5lIE1FTV9DR1JPVVBfWlNUQVQobXosIGlkeCkJKChteiktPmNvdW50WyhpZHgpXSkKQEAgLTEyMiw0NCArMTM2LDczIEBACiAJICovCiAJc3RydWN0IHJlc19jb3VudGVyIHJlczsKIAkvKgorCSAqIHRoZSBjb3VudGVyIHRvIGFjY291bnQgZm9yIG1lbStzd2FwIHVzYWdlLgorCSAqLworCXN0cnVjdCByZXNfY291bnRlciBtZW1zdzsKKwkvKgogCSAqIFBlciBjZ3JvdXAgYWN0aXZlIGFuZCBpbmFjdGl2ZSBsaXN0LCBzaW1pbGFyIHRvIHRoZQogCSAqIHBlciB6b25lIExSVSBsaXN0cy4KIAkgKi8KIAlzdHJ1Y3QgbWVtX2Nncm91cF9scnVfaW5mbyBpbmZvOwogCi0JaW50CXByZXZfcHJpb3JpdHk7CS8qIGZvciByZWNvcmRpbmcgcmVjbGFpbSBwcmlvcml0eSAqLwogCS8qCi0JICogc3RhdGlzdGljcy4KKwkgIHByb3RlY3QgYWdhaW5zdCByZWNsYWltIHJlbGF0ZWQgbWVtYmVyLgorCSovCisJc3BpbmxvY2tfdCByZWNsYWltX3BhcmFtX2xvY2s7CisKKwlpbnQJcHJldl9wcmlvcml0eTsJLyogZm9yIHJlY29yZGluZyByZWNsYWltIHByaW9yaXR5ICovCisKKwkvKgorCSAqIFdoaWxlIHJlY2xhaW1pbmcgaW4gYSBoaWVhcmNoeSwgd2UgY2FjaGUgdGhlIGxhc3QgY2hpbGQgd2UKKwkgKiByZWNsYWltZWQgZnJvbS4gUHJvdGVjdGVkIGJ5IGhpZXJhcmNoeV9tdXRleAorCSAqLworCXN0cnVjdCBtZW1fY2dyb3VwICpsYXN0X3NjYW5uZWRfY2hpbGQ7CisJLyoKKwkgKiBTaG91bGQgdGhlIGFjY291bnRpbmcgYW5kIGNvbnRyb2wgYmUgaGllcmFyY2hpY2FsLCBwZXIgc3VidHJlZT8KKwkgKi8KKwlib29sIHVzZV9oaWVyYXJjaHk7CisJdW5zaWduZWQgbG9uZwlsYXN0X29vbV9qaWZmaWVzOworCWF0b21pY190CXJlZmNudDsKKworCXVuc2lnbmVkIGludAlzd2FwcGluZXNzOworCisJLyoKKwkgKiBzdGF0aXN0aWNzLiBUaGlzIG11c3QgYmUgcGxhY2VkIGF0IHRoZSBlbmQgb2YgbWVtY2cuCiAJICovCiAJc3RydWN0IG1lbV9jZ3JvdXBfc3RhdCBzdGF0OwogfTsKLXN0YXRpYyBzdHJ1Y3QgbWVtX2Nncm91cCBpbml0X21lbV9jZ3JvdXA7CiAKIGVudW0gY2hhcmdlX3R5cGUgewogCU1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfQ0FDSEUgPSAwLAogCU1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfTUFQUEVELAogCU1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfU0hNRU0sCS8qIHVzZWQgYnkgcGFnZSBtaWdyYXRpb24gb2Ygc2htZW0gKi8KIAlNRU1fQ0dST1VQX0NIQVJHRV9UWVBFX0ZPUkNFLAkvKiB1c2VkIGJ5IGZvcmNlX2VtcHR5ICovCisJTUVNX0NHUk9VUF9DSEFSR0VfVFlQRV9TV0FQT1VULAkvKiBmb3IgYWNjb3VudGluZyBzd2FwY2FjaGUgKi8KIAlOUl9DSEFSR0VfVFlQRSwKIH07CiAKIC8qIG9ubHkgZm9yIGhlcmUgKGZvciBlYXN5IHJlYWRpbmcuKSAqLwogI2RlZmluZSBQQ0dGX0NBQ0hFCSgxVUwgPDwgUENHX0NBQ0hFKQogI2RlZmluZSBQQ0dGX1VTRUQJKDFVTCA8PCBQQ0dfVVNFRCkKLSNkZWZpbmUgUENHRl9BQ1RJVkUJKDFVTCA8PCBQQ0dfQUNUSVZFKQogI2RlZmluZSBQQ0dGX0xPQ0sJKDFVTCA8PCBQQ0dfTE9DSykKLSNkZWZpbmUgUENHRl9GSUxFCSgxVUwgPDwgUENHX0ZJTEUpCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZwogcGNnX2RlZmF1bHRfZmxhZ3NbTlJfQ0hBUkdFX1RZUEVdID0gewotCVBDR0ZfQ0FDSEUgfCBQQ0dGX0ZJTEUgfCBQQ0dGX1VTRUQgfCBQQ0dGX0xPQ0ssIC8qIEZpbGUgQ2FjaGUgKi8KLQlQQ0dGX0FDVElWRSB8IFBDR0ZfVVNFRCB8IFBDR0ZfTE9DSywgLyogQW5vbiAqLwotCVBDR0ZfQUNUSVZFIHwgUENHRl9DQUNIRSB8IFBDR0ZfVVNFRCB8IFBDR0ZfTE9DSywgLyogU2htZW0gKi8KKwlQQ0dGX0NBQ0hFIHwgUENHRl9VU0VEIHwgUENHRl9MT0NLLCAvKiBGaWxlIENhY2hlICovCisJUENHRl9VU0VEIHwgUENHRl9MT0NLLCAvKiBBbm9uICovCisJUENHRl9DQUNIRSB8IFBDR0ZfVVNFRCB8IFBDR0ZfTE9DSywgLyogU2htZW0gKi8KIAkwLCAvKiBGT1JDRSAqLwogfTsKIAotLyoKLSAqIEFsd2F5cyBtb2RpZmllZCB1bmRlciBscnUgbG9jay4gVGhlbiwgbm90IG5lY2Vzc2FyeSB0byBwcmVlbXB0X2Rpc2FibGUoKQotICovCisvKiBmb3IgZW5jb2RpbmcgY2Z0LT5wcml2YXRlIHZhbHVlIG9uIGZpbGUgKi8KKyNkZWZpbmUgX01FTQkJCSgwKQorI2RlZmluZSBfTUVNU1dBUAkJKDEpCisjZGVmaW5lIE1FTUZJTEVfUFJJVkFURSh4LCB2YWwpCSgoKHgpIDw8IDE2KSB8ICh2YWwpKQorI2RlZmluZSBNRU1GSUxFX1RZUEUodmFsKQkoKCh2YWwpID4+IDE2KSAmIDB4ZmZmZikKKyNkZWZpbmUgTUVNRklMRV9BVFRSKHZhbCkJKCh2YWwpICYgMHhmZmZmKQorCitzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX2dldChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKTsKK3N0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfcHV0KHN0cnVjdCBtZW1fY2dyb3VwICptZW0pOworCiBzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX2NoYXJnZV9zdGF0aXN0aWNzKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCiAJCQkJCSBzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjLAogCQkJCQkgYm9vbCBjaGFyZ2UpCkBAIC0xNjcsMTAgKzIxMCw5IEBACiAJaW50IHZhbCA9IChjaGFyZ2UpPyAxIDogLTE7CiAJc3RydWN0IG1lbV9jZ3JvdXBfc3RhdCAqc3RhdCA9ICZtZW0tPnN0YXQ7CiAJc3RydWN0IG1lbV9jZ3JvdXBfc3RhdF9jcHUgKmNwdXN0YXQ7CisJaW50IGNwdSA9IGdldF9jcHUoKTsKIAotCVZNX0JVR19PTighaXJxc19kaXNhYmxlZCgpKTsKLQotCWNwdXN0YXQgPSAmc3RhdC0+Y3B1c3RhdFtzbXBfcHJvY2Vzc29yX2lkKCldOworCWNwdXN0YXQgPSAmc3RhdC0+Y3B1c3RhdFtjcHVdOwogCWlmIChQYWdlQ2dyb3VwQ2FjaGUocGMpKQogCQlfX21lbV9jZ3JvdXBfc3RhdF9hZGRfc2FmZShjcHVzdGF0LCBNRU1fQ0dST1VQX1NUQVRfQ0FDSEUsIHZhbCk7CiAJZWxzZQpAQCAtMTgyLDYgKzIyNCw3IEBACiAJZWxzZQogCQlfX21lbV9jZ3JvdXBfc3RhdF9hZGRfc2FmZShjcHVzdGF0LAogCQkJCU1FTV9DR1JPVVBfU1RBVF9QR1BHT1VUX0NPVU5ULCAxKTsKKwlwdXRfY3B1KCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqCkBAIC0xOTcsNiArMjQwLDkgQEAKIAlpbnQgbmlkID0gcGFnZV9jZ3JvdXBfbmlkKHBjKTsKIAlpbnQgemlkID0gcGFnZV9jZ3JvdXBfemlkKHBjKTsKIAorCWlmICghbWVtKQorCQlyZXR1cm4gTlVMTDsKKwogCXJldHVybiBtZW1fY2dyb3VwX3pvbmVpbmZvKG1lbSwgbmlkLCB6aWQpOwogfQogCkBAIC0yMzYsNzkgKzI4MiwxNTQgQEAKIAkJCQlzdHJ1Y3QgbWVtX2Nncm91cCwgY3NzKTsKIH0KIAotc3RhdGljIHZvaWQgX19tZW1fY2dyb3VwX3JlbW92ZV9saXN0KHN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICpteiwKLQkJCXN0cnVjdCBwYWdlX2Nncm91cCAqcGMpCitzdGF0aWMgc3RydWN0IG1lbV9jZ3JvdXAgKnRyeV9nZXRfbWVtX2Nncm91cF9mcm9tX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogewotCWludCBscnUgPSBMUlVfQkFTRTsKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtID0gTlVMTDsKKwkvKgorCSAqIEJlY2F1c2Ugd2UgaGF2ZSBubyBsb2NrcywgbW0tPm93bmVyJ3MgbWF5IGJlIGJlaW5nIG1vdmVkIHRvIG90aGVyCisJICogY2dyb3VwLiBXZSB1c2UgY3NzX3RyeWdldCgpIGhlcmUgZXZlbiBpZiB0aGlzIGxvb2tzCisJICogcGVzc2ltaXN0aWMgKHJhdGhlciB0aGFuIGFkZGluZyBsb2NrcyBoZXJlKS4KKwkgKi8KKwlyY3VfcmVhZF9sb2NrKCk7CisJZG8geworCQltZW0gPSBtZW1fY2dyb3VwX2Zyb21fdGFzayhyY3VfZGVyZWZlcmVuY2UobW0tPm93bmVyKSk7CisJCWlmICh1bmxpa2VseSghbWVtKSkKKwkJCWJyZWFrOworCX0gd2hpbGUgKCFjc3NfdHJ5Z2V0KCZtZW0tPmNzcykpOworCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiBtZW07Cit9CiAKLQlpZiAoUGFnZUNncm91cFVuZXZpY3RhYmxlKHBjKSkKLQkJbHJ1ID0gTFJVX1VORVZJQ1RBQkxFOwotCWVsc2UgewotCQlpZiAoUGFnZUNncm91cEFjdGl2ZShwYykpCi0JCQlscnUgKz0gTFJVX0FDVElWRTsKLQkJaWYgKFBhZ2VDZ3JvdXBGaWxlKHBjKSkKLQkJCWxydSArPSBMUlVfRklMRTsKLQl9CitzdGF0aWMgYm9vbCBtZW1fY2dyb3VwX2lzX29ic29sZXRlKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCit7CisJaWYgKCFtZW0pCisJCXJldHVybiB0cnVlOworCXJldHVybiBjc3NfaXNfcmVtb3ZlZCgmbWVtLT5jc3MpOworfQogCisvKgorICogRm9sbG93aW5nIExSVSBmdW5jdGlvbnMgYXJlIGFsbG93ZWQgdG8gYmUgdXNlZCB3aXRob3V0IFBDR19MT0NLLgorICogT3BlcmF0aW9ucyBhcmUgY2FsbGVkIGJ5IHJvdXRpbmUgb2YgZ2xvYmFsIExSVSBpbmRlcGVuZGVudGx5IGZyb20gbWVtY2cuCisgKiBXaGF0IHdlIGhhdmUgdG8gdGFrZSBjYXJlIG9mIGhlcmUgaXMgdmFsaWRuZXNzIG9mIHBjLT5tZW1fY2dyb3VwLgorICoKKyAqIENoYW5nZXMgdG8gcGMtPm1lbV9jZ3JvdXAgaGFwcGVucyB3aGVuCisgKiAxLiBjaGFyZ2UKKyAqIDIuIG1vdmluZyBhY2NvdW50CisgKiBJbiB0eXBpY2FsIGNhc2UsICJjaGFyZ2UiIGlzIGRvbmUgYmVmb3JlIGFkZC10by1scnUuIEV4Y2VwdGlvbiBpcyBTd2FwQ2FjaGUuCisgKiBJdCBpcyBhZGRlZCB0byBMUlUgYmVmb3JlIGNoYXJnZS4KKyAqIElmIFBDR19VU0VEIGJpdCBpcyBub3Qgc2V0LCBwYWdlX2Nncm91cCBpcyBub3QgYWRkZWQgdG8gdGhpcyBwcml2YXRlIExSVS4KKyAqIFdoZW4gbW92aW5nIGFjY291bnQsIHRoZSBwYWdlIGlzIG5vdCBvbiBMUlUuIEl0J3MgaXNvbGF0ZWQuCisgKi8KKwordm9pZCBtZW1fY2dyb3VwX2RlbF9scnVfbGlzdChzdHJ1Y3QgcGFnZSAqcGFnZSwgZW51bSBscnVfbGlzdCBscnUpCit7CisJc3RydWN0IHBhZ2VfY2dyb3VwICpwYzsKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtOworCXN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICptejsKKworCWlmIChtZW1fY2dyb3VwX2Rpc2FibGVkKCkpCisJCXJldHVybjsKKwlwYyA9IGxvb2t1cF9wYWdlX2Nncm91cChwYWdlKTsKKwkvKiBjYW4gaGFwcGVuIHdoaWxlIHdlIGhhbmRsZSBzd2FwY2FjaGUuICovCisJaWYgKGxpc3RfZW1wdHkoJnBjLT5scnUpIHx8ICFwYy0+bWVtX2Nncm91cCkKKwkJcmV0dXJuOworCS8qCisJICogV2UgZG9uJ3QgY2hlY2sgUENHX1VTRUQgYml0LiBJdCdzIGNsZWFyZWQgd2hlbiB0aGUgInBhZ2UiIGlzIGZpbmFsbHkKKwkgKiByZW1vdmVkIGZyb20gZ2xvYmFsIExSVS4KKwkgKi8KKwlteiA9IHBhZ2VfY2dyb3VwX3pvbmVpbmZvKHBjKTsKKwltZW0gPSBwYy0+bWVtX2Nncm91cDsKIAlNRU1fQ0dST1VQX1pTVEFUKG16LCBscnUpIC09IDE7Ci0KLQltZW1fY2dyb3VwX2NoYXJnZV9zdGF0aXN0aWNzKHBjLT5tZW1fY2dyb3VwLCBwYywgZmFsc2UpOwotCWxpc3RfZGVsKCZwYy0+bHJ1KTsKKwlsaXN0X2RlbF9pbml0KCZwYy0+bHJ1KTsKKwlyZXR1cm47CiB9CiAKLXN0YXRpYyB2b2lkIF9fbWVtX2Nncm91cF9hZGRfbGlzdChzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqbXosCi0JCQkJc3RydWN0IHBhZ2VfY2dyb3VwICpwYykKK3ZvaWQgbWVtX2Nncm91cF9kZWxfbHJ1KHN0cnVjdCBwYWdlICpwYWdlKQogewotCWludCBscnUgPSBMUlVfQkFTRTsKLQotCWlmIChQYWdlQ2dyb3VwVW5ldmljdGFibGUocGMpKQotCQlscnUgPSBMUlVfVU5FVklDVEFCTEU7Ci0JZWxzZSB7Ci0JCWlmIChQYWdlQ2dyb3VwQWN0aXZlKHBjKSkKLQkJCWxydSArPSBMUlVfQUNUSVZFOwotCQlpZiAoUGFnZUNncm91cEZpbGUocGMpKQotCQkJbHJ1ICs9IExSVV9GSUxFOwotCX0KLQotCU1FTV9DR1JPVVBfWlNUQVQobXosIGxydSkgKz0gMTsKLQlsaXN0X2FkZCgmcGMtPmxydSwgJm16LT5saXN0c1tscnVdKTsKLQotCW1lbV9jZ3JvdXBfY2hhcmdlX3N0YXRpc3RpY3MocGMtPm1lbV9jZ3JvdXAsIHBjLCB0cnVlKTsKKwltZW1fY2dyb3VwX2RlbF9scnVfbGlzdChwYWdlLCBwYWdlX2xydShwYWdlKSk7CiB9CiAKLXN0YXRpYyB2b2lkIF9fbWVtX2Nncm91cF9tb3ZlX2xpc3RzKHN0cnVjdCBwYWdlX2Nncm91cCAqcGMsIGVudW0gbHJ1X2xpc3QgbHJ1KQordm9pZCBtZW1fY2dyb3VwX3JvdGF0ZV9scnVfbGlzdChzdHJ1Y3QgcGFnZSAqcGFnZSwgZW51bSBscnVfbGlzdCBscnUpCiB7Ci0Jc3RydWN0IG1lbV9jZ3JvdXBfcGVyX3pvbmUgKm16ID0gcGFnZV9jZ3JvdXBfem9uZWluZm8ocGMpOwotCWludCBhY3RpdmUgICAgPSBQYWdlQ2dyb3VwQWN0aXZlKHBjKTsKLQlpbnQgZmlsZSAgICAgID0gUGFnZUNncm91cEZpbGUocGMpOwotCWludCB1bmV2aWN0YWJsZSA9IFBhZ2VDZ3JvdXBVbmV2aWN0YWJsZShwYyk7Ci0JZW51bSBscnVfbGlzdCBmcm9tID0gdW5ldmljdGFibGUgPyBMUlVfVU5FVklDVEFCTEUgOgotCQkJCShMUlVfRklMRSAqICEhZmlsZSArICEhYWN0aXZlKTsKKwlzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqbXo7CisJc3RydWN0IHBhZ2VfY2dyb3VwICpwYzsKIAotCWlmIChscnUgPT0gZnJvbSkKKwlpZiAobWVtX2Nncm91cF9kaXNhYmxlZCgpKQogCQlyZXR1cm47CiAKLQlNRU1fQ0dST1VQX1pTVEFUKG16LCBmcm9tKSAtPSAxOwotCS8qCi0JICogSG93ZXZlciB0aGlzIGlzIGRvbmUgdW5kZXIgbXotPmxydV9sb2NrLCBhbm90aGVyIGZsYWdzLCB3aGljaAotCSAqIGFyZSBub3QgcmVsYXRlZCB0byBMUlUsIHdpbGwgYmUgbW9kaWZpZWQgZnJvbSBvdXQtb2YtbG9jay4KLQkgKiBXZSBoYXZlIHRvIHVzZSBhdG9taWMgc2V0L2NsZWFyIGZsYWdzLgotCSAqLwotCWlmIChpc191bmV2aWN0YWJsZV9scnUobHJ1KSkgewotCQlDbGVhclBhZ2VDZ3JvdXBBY3RpdmUocGMpOwotCQlTZXRQYWdlQ2dyb3VwVW5ldmljdGFibGUocGMpOwotCX0gZWxzZSB7Ci0JCWlmIChpc19hY3RpdmVfbHJ1KGxydSkpCi0JCQlTZXRQYWdlQ2dyb3VwQWN0aXZlKHBjKTsKLQkJZWxzZQotCQkJQ2xlYXJQYWdlQ2dyb3VwQWN0aXZlKHBjKTsKLQkJQ2xlYXJQYWdlQ2dyb3VwVW5ldmljdGFibGUocGMpOwotCX0KLQotCU1FTV9DR1JPVVBfWlNUQVQobXosIGxydSkgKz0gMTsKKwlwYyA9IGxvb2t1cF9wYWdlX2Nncm91cChwYWdlKTsKKwlzbXBfcm1iKCk7CisJLyogdW51c2VkIHBhZ2UgaXMgbm90IHJvdGF0ZWQuICovCisJaWYgKCFQYWdlQ2dyb3VwVXNlZChwYykpCisJCXJldHVybjsKKwlteiA9IHBhZ2VfY2dyb3VwX3pvbmVpbmZvKHBjKTsKIAlsaXN0X21vdmUoJnBjLT5scnUsICZtei0+bGlzdHNbbHJ1XSk7CiB9CiAKK3ZvaWQgbWVtX2Nncm91cF9hZGRfbHJ1X2xpc3Qoc3RydWN0IHBhZ2UgKnBhZ2UsIGVudW0gbHJ1X2xpc3QgbHJ1KQoreworCXN0cnVjdCBwYWdlX2Nncm91cCAqcGM7CisJc3RydWN0IG1lbV9jZ3JvdXBfcGVyX3pvbmUgKm16OworCisJaWYgKG1lbV9jZ3JvdXBfZGlzYWJsZWQoKSkKKwkJcmV0dXJuOworCXBjID0gbG9va3VwX3BhZ2VfY2dyb3VwKHBhZ2UpOworCS8qIGJhcnJpZXIgdG8gc3luYyB3aXRoICJjaGFyZ2UiICovCisJc21wX3JtYigpOworCWlmICghUGFnZUNncm91cFVzZWQocGMpKQorCQlyZXR1cm47CisKKwlteiA9IHBhZ2VfY2dyb3VwX3pvbmVpbmZvKHBjKTsKKwlNRU1fQ0dST1VQX1pTVEFUKG16LCBscnUpICs9IDE7CisJbGlzdF9hZGQoJnBjLT5scnUsICZtei0+bGlzdHNbbHJ1XSk7Cit9CisKKy8qCisgKiBBdCBoYW5kbGluZyBTd2FwQ2FjaGUsIHBjLT5tZW1fY2dyb3VwIG1heSBiZSBjaGFuZ2VkIHdoaWxlIGl0J3MgbGlua2VkIHRvCisgKiBscnUgYmVjYXVzZSB0aGUgcGFnZSBtYXkuYmUgcmV1c2VkIGFmdGVyIGl0J3MgZnVsbHkgdW5jaGFyZ2VkIChiZWNhdXNlIG9mCisgKiBTd2FwQ2FjaGUgYmVoYXZpb3IpLlRvIGhhbmRsZSB0aGF0LCB1bmxpbmsgcGFnZV9jZ3JvdXAgZnJvbSBMUlUgd2hlbiBjaGFyZ2UKKyAqIGl0IGFnYWluLiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgdXNlZCB0byBjaGFyZ2UgU3dhcENhY2hlLiBJdCdzIGRvbmUgdW5kZXIKKyAqIGxvY2tfcGFnZSBhbmQgZXhwZWN0ZWQgdGhhdCB6b25lLT5scnVfbG9jayBpcyBuZXZlciBoZWxkLgorICovCitzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX2xydV9kZWxfYmVmb3JlX2NvbW1pdF9zd2FwY2FjaGUoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgem9uZSAqem9uZSA9IHBhZ2Vfem9uZShwYWdlKTsKKwlzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjID0gbG9va3VwX3BhZ2VfY2dyb3VwKHBhZ2UpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnpvbmUtPmxydV9sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBGb3JnZXQgb2xkIExSVSB3aGVuIHRoaXMgcGFnZV9jZ3JvdXAgaXMgKm5vdCogdXNlZC4gVGhpcyBVc2VkIGJpdAorCSAqIGlzIGd1YXJkZWQgYnkgbG9ja19wYWdlKCkgYmVjYXVzZSB0aGUgcGFnZSBpcyBTd2FwQ2FjaGUuCisJICovCisJaWYgKCFQYWdlQ2dyb3VwVXNlZChwYykpCisJCW1lbV9jZ3JvdXBfZGVsX2xydV9saXN0KHBhZ2UsIHBhZ2VfbHJ1KHBhZ2UpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ6b25lLT5scnVfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX2xydV9hZGRfYWZ0ZXJfY29tbWl0X3N3YXBjYWNoZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB6b25lICp6b25lID0gcGFnZV96b25lKHBhZ2UpOworCXN0cnVjdCBwYWdlX2Nncm91cCAqcGMgPSBsb29rdXBfcGFnZV9jZ3JvdXAocGFnZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmem9uZS0+bHJ1X2xvY2ssIGZsYWdzKTsKKwkvKiBsaW5rIHdoZW4gdGhlIHBhZ2UgaXMgbGlua2VkIHRvIExSVSBidXQgcGFnZV9jZ3JvdXAgaXNuJ3QgKi8KKwlpZiAoUGFnZUxSVShwYWdlKSAmJiBsaXN0X2VtcHR5KCZwYy0+bHJ1KSkKKwkJbWVtX2Nncm91cF9hZGRfbHJ1X2xpc3QocGFnZSwgcGFnZV9scnUocGFnZSkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnpvbmUtPmxydV9sb2NrLCBmbGFncyk7Cit9CisKKwordm9pZCBtZW1fY2dyb3VwX21vdmVfbGlzdHMoc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkgICBlbnVtIGxydV9saXN0IGZyb20sIGVudW0gbHJ1X2xpc3QgdG8pCit7CisJaWYgKG1lbV9jZ3JvdXBfZGlzYWJsZWQoKSkKKwkJcmV0dXJuOworCW1lbV9jZ3JvdXBfZGVsX2xydV9saXN0KHBhZ2UsIGZyb20pOworCW1lbV9jZ3JvdXBfYWRkX2xydV9saXN0KHBhZ2UsIHRvKTsKK30KKwogaW50IHRhc2tfaW5fbWVtX2Nncm91cChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGNvbnN0IHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCiB7CiAJaW50IHJldDsKQEAgLTMyMCwzNyArNDQxLDYgQEAKIH0KIAogLyoKLSAqIFRoaXMgcm91dGluZSBhc3N1bWVzIHRoYXQgdGhlIGFwcHJvcHJpYXRlIHpvbmUncyBscnUgbG9jayBpcyBhbHJlYWR5IGhlbGQKLSAqLwotdm9pZCBtZW1fY2dyb3VwX21vdmVfbGlzdHMoc3RydWN0IHBhZ2UgKnBhZ2UsIGVudW0gbHJ1X2xpc3QgbHJ1KQotewotCXN0cnVjdCBwYWdlX2Nncm91cCAqcGM7Ci0Jc3RydWN0IG1lbV9jZ3JvdXBfcGVyX3pvbmUgKm16OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAobWVtX2Nncm91cF9zdWJzeXMuZGlzYWJsZWQpCi0JCXJldHVybjsKLQotCS8qCi0JICogV2UgY2Fubm90IGxvY2tfcGFnZV9jZ3JvdXAgd2hpbGUgaG9sZGluZyB6b25lJ3MgbHJ1X2xvY2ssCi0JICogYmVjYXVzZSBvdGhlciBob2xkZXJzIG9mIGxvY2tfcGFnZV9jZ3JvdXAgY2FuIGJlIGludGVycnVwdGVkCi0JICogd2l0aCBhbiBhdHRlbXB0IHRvIHJvdGF0ZV9yZWNsYWltYWJsZV9wYWdlLiAgQnV0IHdlIGNhbm5vdAotCSAqIHNhZmVseSBnZXQgdG8gcGFnZV9jZ3JvdXAgd2l0aG91dCBpdCwgc28ganVzdCB0cnlfbG9jayBpdDoKLQkgKiBtZW1fY2dyb3VwX2lzb2xhdGVfcGFnZXMgYWxsb3dzIGZvciBwYWdlIGxlZnQgb24gd3JvbmcgbGlzdC4KLQkgKi8KLQlwYyA9IGxvb2t1cF9wYWdlX2Nncm91cChwYWdlKTsKLQlpZiAoIXRyeWxvY2tfcGFnZV9jZ3JvdXAocGMpKQotCQlyZXR1cm47Ci0JaWYgKHBjICYmIFBhZ2VDZ3JvdXBVc2VkKHBjKSkgewotCQlteiA9IHBhZ2VfY2dyb3VwX3pvbmVpbmZvKHBjKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJm16LT5scnVfbG9jaywgZmxhZ3MpOwotCQlfX21lbV9jZ3JvdXBfbW92ZV9saXN0cyhwYywgbHJ1KTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXotPmxydV9sb2NrLCBmbGFncyk7Ci0JfQotCXVubG9ja19wYWdlX2Nncm91cChwYyk7Ci19Ci0KLS8qCiAgKiBDYWxjdWxhdGUgbWFwcGVkX3JhdGlvIHVuZGVyIG1lbW9yeSBjb250cm9sbGVyLiBUaGlzIHdpbGwgYmUgdXNlZCBpbgogICogdm1zY2FuLmMgZm9yIGRldGVyZW1pbmluZyB3ZSBoYXZlIHRvIHJlY2xhaW0gbWFwcGVkIHBhZ2VzLgogICovCkBAIC0zNzIsMzkgKzQ2MiwxMDggQEAKICAqLwogaW50IG1lbV9jZ3JvdXBfZ2V0X3JlY2xhaW1fcHJpb3JpdHkoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKIHsKLQlyZXR1cm4gbWVtLT5wcmV2X3ByaW9yaXR5OworCWludCBwcmV2X3ByaW9yaXR5OworCisJc3Bpbl9sb2NrKCZtZW0tPnJlY2xhaW1fcGFyYW1fbG9jayk7CisJcHJldl9wcmlvcml0eSA9IG1lbS0+cHJldl9wcmlvcml0eTsKKwlzcGluX3VubG9jaygmbWVtLT5yZWNsYWltX3BhcmFtX2xvY2spOworCisJcmV0dXJuIHByZXZfcHJpb3JpdHk7CiB9CiAKIHZvaWQgbWVtX2Nncm91cF9ub3RlX3JlY2xhaW1fcHJpb3JpdHkoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwgaW50IHByaW9yaXR5KQogeworCXNwaW5fbG9jaygmbWVtLT5yZWNsYWltX3BhcmFtX2xvY2spOwogCWlmIChwcmlvcml0eSA8IG1lbS0+cHJldl9wcmlvcml0eSkKIAkJbWVtLT5wcmV2X3ByaW9yaXR5ID0gcHJpb3JpdHk7CisJc3Bpbl91bmxvY2soJm1lbS0+cmVjbGFpbV9wYXJhbV9sb2NrKTsKIH0KIAogdm9pZCBtZW1fY2dyb3VwX3JlY29yZF9yZWNsYWltX3ByaW9yaXR5KHN0cnVjdCBtZW1fY2dyb3VwICptZW0sIGludCBwcmlvcml0eSkKIHsKKwlzcGluX2xvY2soJm1lbS0+cmVjbGFpbV9wYXJhbV9sb2NrKTsKIAltZW0tPnByZXZfcHJpb3JpdHkgPSBwcmlvcml0eTsKKwlzcGluX3VubG9jaygmbWVtLT5yZWNsYWltX3BhcmFtX2xvY2spOwogfQogCi0vKgotICogQ2FsY3VsYXRlICMgb2YgcGFnZXMgdG8gYmUgc2Nhbm5lZCBpbiB0aGlzIHByaW9yaXR5L3pvbmUuCi0gKiBTZWUgYWxzbyB2bXNjYW4uYwotICoKLSAqIHByaW9yaXR5IHN0YXJ0cyBmcm9tICJERUZfUFJJT1JJVFkiIGFuZCBkZWNyZW1lbnRlZCBpbiBlYWNoIGxvb3AuCi0gKiAoc2VlIGluY2x1ZGUvbGludXgvbW16b25lLmgpCi0gKi8KLQotbG9uZyBtZW1fY2dyb3VwX2NhbGNfcmVjbGFpbShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLCBzdHJ1Y3Qgem9uZSAqem9uZSwKLQkJCQkJaW50IHByaW9yaXR5LCBlbnVtIGxydV9saXN0IGxydSkKK3N0YXRpYyBpbnQgY2FsY19pbmFjdGl2ZV9yYXRpbyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIHVuc2lnbmVkIGxvbmcgKnByZXNlbnRfcGFnZXMpCiB7Ci0JbG9uZyBucl9wYWdlczsKKwl1bnNpZ25lZCBsb25nIGFjdGl2ZTsKKwl1bnNpZ25lZCBsb25nIGluYWN0aXZlOworCXVuc2lnbmVkIGxvbmcgZ2I7CisJdW5zaWduZWQgbG9uZyBpbmFjdGl2ZV9yYXRpbzsKKworCWluYWN0aXZlID0gbWVtX2Nncm91cF9nZXRfYWxsX3pvbmVzdGF0KG1lbWNnLCBMUlVfSU5BQ1RJVkVfQU5PTik7CisJYWN0aXZlID0gbWVtX2Nncm91cF9nZXRfYWxsX3pvbmVzdGF0KG1lbWNnLCBMUlVfQUNUSVZFX0FOT04pOworCisJZ2IgPSAoaW5hY3RpdmUgKyBhY3RpdmUpID4+ICgzMCAtIFBBR0VfU0hJRlQpOworCWlmIChnYikKKwkJaW5hY3RpdmVfcmF0aW8gPSBpbnRfc3FydCgxMCAqIGdiKTsKKwllbHNlCisJCWluYWN0aXZlX3JhdGlvID0gMTsKKworCWlmIChwcmVzZW50X3BhZ2VzKSB7CisJCXByZXNlbnRfcGFnZXNbMF0gPSBpbmFjdGl2ZTsKKwkJcHJlc2VudF9wYWdlc1sxXSA9IGFjdGl2ZTsKKwl9CisKKwlyZXR1cm4gaW5hY3RpdmVfcmF0aW87Cit9CisKK2ludCBtZW1fY2dyb3VwX2luYWN0aXZlX2Fub25faXNfbG93KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZykKK3sKKwl1bnNpZ25lZCBsb25nIGFjdGl2ZTsKKwl1bnNpZ25lZCBsb25nIGluYWN0aXZlOworCXVuc2lnbmVkIGxvbmcgcHJlc2VudF9wYWdlc1syXTsKKwl1bnNpZ25lZCBsb25nIGluYWN0aXZlX3JhdGlvOworCisJaW5hY3RpdmVfcmF0aW8gPSBjYWxjX2luYWN0aXZlX3JhdGlvKG1lbWNnLCBwcmVzZW50X3BhZ2VzKTsKKworCWluYWN0aXZlID0gcHJlc2VudF9wYWdlc1swXTsKKwlhY3RpdmUgPSBwcmVzZW50X3BhZ2VzWzFdOworCisJaWYgKGluYWN0aXZlICogaW5hY3RpdmVfcmF0aW8gPCBhY3RpdmUpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGxvbmcgbWVtX2Nncm91cF96b25lX25yX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKKwkJCQkgICAgICAgc3RydWN0IHpvbmUgKnpvbmUsCisJCQkJICAgICAgIGVudW0gbHJ1X2xpc3QgbHJ1KQorewogCWludCBuaWQgPSB6b25lLT56b25lX3BnZGF0LT5ub2RlX2lkOwogCWludCB6aWQgPSB6b25lX2lkeCh6b25lKTsKLQlzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqbXogPSBtZW1fY2dyb3VwX3pvbmVpbmZvKG1lbSwgbmlkLCB6aWQpOworCXN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICpteiA9IG1lbV9jZ3JvdXBfem9uZWluZm8obWVtY2csIG5pZCwgemlkKTsKIAotCW5yX3BhZ2VzID0gTUVNX0NHUk9VUF9aU1RBVChteiwgbHJ1KTsKKwlyZXR1cm4gTUVNX0NHUk9VUF9aU1RBVChteiwgbHJ1KTsKK30KIAotCXJldHVybiAobnJfcGFnZXMgPj4gcHJpb3JpdHkpOworc3RydWN0IHpvbmVfcmVjbGFpbV9zdGF0ICptZW1fY2dyb3VwX2dldF9yZWNsYWltX3N0YXQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAorCQkJCQkJICAgICAgc3RydWN0IHpvbmUgKnpvbmUpCit7CisJaW50IG5pZCA9IHpvbmUtPnpvbmVfcGdkYXQtPm5vZGVfaWQ7CisJaW50IHppZCA9IHpvbmVfaWR4KHpvbmUpOworCXN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICpteiA9IG1lbV9jZ3JvdXBfem9uZWluZm8obWVtY2csIG5pZCwgemlkKTsKKworCXJldHVybiAmbXotPnJlY2xhaW1fc3RhdDsKK30KKworc3RydWN0IHpvbmVfcmVjbGFpbV9zdGF0ICoKK21lbV9jZ3JvdXBfZ2V0X3JlY2xhaW1fc3RhdF9mcm9tX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJc3RydWN0IHBhZ2VfY2dyb3VwICpwYzsKKwlzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqbXo7CisKKwlpZiAobWVtX2Nncm91cF9kaXNhYmxlZCgpKQorCQlyZXR1cm4gTlVMTDsKKworCXBjID0gbG9va3VwX3BhZ2VfY2dyb3VwKHBhZ2UpOworCW16ID0gcGFnZV9jZ3JvdXBfem9uZWluZm8ocGMpOworCWlmICghbXopCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuICZtei0+cmVjbGFpbV9zdGF0OwogfQogCiB1bnNpZ25lZCBsb25nIG1lbV9jZ3JvdXBfaXNvbGF0ZV9wYWdlcyh1bnNpZ25lZCBsb25nIG5yX3RvX3NjYW4sCkBAIC00MjksNDQgKzU4OCw0NjMgQEAKIAlteiA9IG1lbV9jZ3JvdXBfem9uZWluZm8obWVtX2NvbnQsIG5pZCwgemlkKTsKIAlzcmMgPSAmbXotPmxpc3RzW2xydV07CiAKLQlzcGluX2xvY2soJm16LT5scnVfbG9jayk7CiAJc2NhbiA9IDA7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX3JldmVyc2UocGMsIHRtcCwgc3JjLCBscnUpIHsKIAkJaWYgKHNjYW4gPj0gbnJfdG9fc2NhbikKIAkJCWJyZWFrOworCisJCXBhZ2UgPSBwYy0+cGFnZTsKIAkJaWYgKHVubGlrZWx5KCFQYWdlQ2dyb3VwVXNlZChwYykpKQogCQkJY29udGludWU7Ci0JCXBhZ2UgPSBwYy0+cGFnZTsKLQogCQlpZiAodW5saWtlbHkoIVBhZ2VMUlUocGFnZSkpKQogCQkJY29udGludWU7CiAKLQkJLyoKLQkJICogVE9ETzogcGxheSBiZXR0ZXIgd2l0aCBsdW1weSByZWNsYWltLCBncmFiYmluZyBhbnl0aGluZy4KLQkJICovCi0JCWlmIChQYWdlVW5ldmljdGFibGUocGFnZSkgfHwKLQkJICAgIChQYWdlQWN0aXZlKHBhZ2UpICYmICFhY3RpdmUpIHx8Ci0JCSAgICAoIVBhZ2VBY3RpdmUocGFnZSkgJiYgYWN0aXZlKSkgewotCQkJX19tZW1fY2dyb3VwX21vdmVfbGlzdHMocGMsIHBhZ2VfbHJ1KHBhZ2UpKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KIAkJc2NhbisrOwotCQlsaXN0X21vdmUoJnBjLT5scnUsICZwY19saXN0KTsKLQogCQlpZiAoX19pc29sYXRlX2xydV9wYWdlKHBhZ2UsIG1vZGUsIGZpbGUpID09IDApIHsKIAkJCWxpc3RfbW92ZSgmcGFnZS0+bHJ1LCBkc3QpOwogCQkJbnJfdGFrZW4rKzsKIAkJfQogCX0KIAotCWxpc3Rfc3BsaWNlKCZwY19saXN0LCBzcmMpOwotCXNwaW5fdW5sb2NrKCZtei0+bHJ1X2xvY2spOwotCiAJKnNjYW5uZWQgPSBzY2FuOwogCXJldHVybiBucl90YWtlbjsKIH0KIAorI2RlZmluZSBtZW1fY2dyb3VwX2Zyb21fcmVzX2NvdW50ZXIoY291bnRlciwgbWVtYmVyKQlcCisJY29udGFpbmVyX29mKGNvdW50ZXIsIHN0cnVjdCBtZW1fY2dyb3VwLCBtZW1iZXIpCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgZmluZHMgdGhlIERGUyB3YWxrIHN1Y2Nlc3Nvci4gVGhpcyByb3V0aW5lIHNob3VsZCBiZQorICogY2FsbGVkIHdpdGggaGllcmFyY2h5X211dGV4IGhlbGQKKyAqLworc3RhdGljIHN0cnVjdCBtZW1fY2dyb3VwICoKK21lbV9jZ3JvdXBfZ2V0X25leHRfbm9kZShzdHJ1Y3QgbWVtX2Nncm91cCAqY3Vyciwgc3RydWN0IG1lbV9jZ3JvdXAgKnJvb3RfbWVtKQoreworCXN0cnVjdCBjZ3JvdXAgKmNncm91cCwgKmN1cnJfY2dyb3VwLCAqcm9vdF9jZ3JvdXA7CisKKwljdXJyX2Nncm91cCA9IGN1cnItPmNzcy5jZ3JvdXA7CisJcm9vdF9jZ3JvdXAgPSByb290X21lbS0+Y3NzLmNncm91cDsKKworCWlmICghbGlzdF9lbXB0eSgmY3Vycl9jZ3JvdXAtPmNoaWxkcmVuKSkgeworCQkvKgorCQkgKiBXYWxrIGRvd24gdG8gY2hpbGRyZW4KKwkJICovCisJCW1lbV9jZ3JvdXBfcHV0KGN1cnIpOworCQljZ3JvdXAgPSBsaXN0X2VudHJ5KGN1cnJfY2dyb3VwLT5jaGlsZHJlbi5uZXh0LAorCQkJCQkJc3RydWN0IGNncm91cCwgc2libGluZyk7CisJCWN1cnIgPSBtZW1fY2dyb3VwX2Zyb21fY29udChjZ3JvdXApOworCQltZW1fY2dyb3VwX2dldChjdXJyKTsKKwkJZ290byBkb25lOworCX0KKwordmlzaXRfcGFyZW50OgorCWlmIChjdXJyX2Nncm91cCA9PSByb290X2Nncm91cCkgeworCQltZW1fY2dyb3VwX3B1dChjdXJyKTsKKwkJY3VyciA9IHJvb3RfbWVtOworCQltZW1fY2dyb3VwX2dldChjdXJyKTsKKwkJZ290byBkb25lOworCX0KKworCS8qCisJICogR290byBuZXh0IHNpYmxpbmcKKwkgKi8KKwlpZiAoY3Vycl9jZ3JvdXAtPnNpYmxpbmcubmV4dCAhPSAmY3Vycl9jZ3JvdXAtPnBhcmVudC0+Y2hpbGRyZW4pIHsKKwkJbWVtX2Nncm91cF9wdXQoY3Vycik7CisJCWNncm91cCA9IGxpc3RfZW50cnkoY3Vycl9jZ3JvdXAtPnNpYmxpbmcubmV4dCwgc3RydWN0IGNncm91cCwKKwkJCQkJCXNpYmxpbmcpOworCQljdXJyID0gbWVtX2Nncm91cF9mcm9tX2NvbnQoY2dyb3VwKTsKKwkJbWVtX2Nncm91cF9nZXQoY3Vycik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKgorCSAqIEdvIHVwIHRvIG5leHQgcGFyZW50IGFuZCBuZXh0IHBhcmVudCdzIHNpYmxpbmcgaWYgbmVlZCBiZQorCSAqLworCWN1cnJfY2dyb3VwID0gY3Vycl9jZ3JvdXAtPnBhcmVudDsKKwlnb3RvIHZpc2l0X3BhcmVudDsKKworZG9uZToKKwlyb290X21lbS0+bGFzdF9zY2FubmVkX2NoaWxkID0gY3VycjsKKwlyZXR1cm4gY3VycjsKK30KKworLyoKKyAqIFZpc2l0IHRoZSBmaXJzdCBjaGlsZCAobmVlZCBub3QgYmUgdGhlIGZpcnN0IGNoaWxkIGFzIHBlciB0aGUgb3JkZXJpbmcKKyAqIG9mIHRoZSBjZ3JvdXAgbGlzdCwgc2luY2Ugd2UgdHJhY2sgbGFzdF9zY2FubmVkX2NoaWxkKSBvZiBAbWVtIGFuZCB1c2UKKyAqIHRoYXQgdG8gcmVjbGFpbSBmcmVlIHBhZ2VzIGZyb20uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbWVtX2Nncm91cCAqCittZW1fY2dyb3VwX2dldF9maXJzdF9ub2RlKHN0cnVjdCBtZW1fY2dyb3VwICpyb290X21lbSkKK3sKKwlzdHJ1Y3QgY2dyb3VwICpjZ3JvdXA7CisJc3RydWN0IG1lbV9jZ3JvdXAgKnJldDsKKwlib29sIG9ic29sZXRlOworCisJb2Jzb2xldGUgPSBtZW1fY2dyb3VwX2lzX29ic29sZXRlKHJvb3RfbWVtLT5sYXN0X3NjYW5uZWRfY2hpbGQpOworCisJLyoKKwkgKiBTY2FuIGFsbCBjaGlsZHJlbiB1bmRlciB0aGUgbWVtX2Nncm91cCBtZW0KKwkgKi8KKwltdXRleF9sb2NrKCZtZW1fY2dyb3VwX3N1YnN5cy5oaWVyYXJjaHlfbXV0ZXgpOworCWlmIChsaXN0X2VtcHR5KCZyb290X21lbS0+Y3NzLmNncm91cC0+Y2hpbGRyZW4pKSB7CisJCXJldCA9IHJvb3RfbWVtOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKCFyb290X21lbS0+bGFzdF9zY2FubmVkX2NoaWxkIHx8IG9ic29sZXRlKSB7CisKKwkJaWYgKG9ic29sZXRlICYmIHJvb3RfbWVtLT5sYXN0X3NjYW5uZWRfY2hpbGQpCisJCQltZW1fY2dyb3VwX3B1dChyb290X21lbS0+bGFzdF9zY2FubmVkX2NoaWxkKTsKKworCQljZ3JvdXAgPSBsaXN0X2ZpcnN0X2VudHJ5KCZyb290X21lbS0+Y3NzLmNncm91cC0+Y2hpbGRyZW4sCisJCQkJc3RydWN0IGNncm91cCwgc2libGluZyk7CisJCXJldCA9IG1lbV9jZ3JvdXBfZnJvbV9jb250KGNncm91cCk7CisJCW1lbV9jZ3JvdXBfZ2V0KHJldCk7CisJfSBlbHNlCisJCXJldCA9IG1lbV9jZ3JvdXBfZ2V0X25leHRfbm9kZShyb290X21lbS0+bGFzdF9zY2FubmVkX2NoaWxkLAorCQkJCQkJcm9vdF9tZW0pOworCitkb25lOgorCXJvb3RfbWVtLT5sYXN0X3NjYW5uZWRfY2hpbGQgPSByZXQ7CisJbXV0ZXhfdW5sb2NrKCZtZW1fY2dyb3VwX3N1YnN5cy5oaWVyYXJjaHlfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBib29sIG1lbV9jZ3JvdXBfY2hlY2tfdW5kZXJfbGltaXQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKK3sKKwlpZiAoZG9fc3dhcF9hY2NvdW50KSB7CisJCWlmIChyZXNfY291bnRlcl9jaGVja191bmRlcl9saW1pdCgmbWVtLT5yZXMpICYmCisJCQlyZXNfY291bnRlcl9jaGVja191bmRlcl9saW1pdCgmbWVtLT5tZW1zdykpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9IGVsc2UKKwkJaWYgKHJlc19jb3VudGVyX2NoZWNrX3VuZGVyX2xpbWl0KCZtZW0tPnJlcykpCisJCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X3N3YXBwaW5lc3Moc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQoreworCXN0cnVjdCBjZ3JvdXAgKmNncnAgPSBtZW1jZy0+Y3NzLmNncm91cDsKKwl1bnNpZ25lZCBpbnQgc3dhcHBpbmVzczsKKworCS8qIHJvb3QgPyAqLworCWlmIChjZ3JwLT5wYXJlbnQgPT0gTlVMTCkKKwkJcmV0dXJuIHZtX3N3YXBwaW5lc3M7CisKKwlzcGluX2xvY2soJm1lbWNnLT5yZWNsYWltX3BhcmFtX2xvY2spOworCXN3YXBwaW5lc3MgPSBtZW1jZy0+c3dhcHBpbmVzczsKKwlzcGluX3VubG9jaygmbWVtY2ctPnJlY2xhaW1fcGFyYW1fbG9jayk7CisKKwlyZXR1cm4gc3dhcHBpbmVzczsKK30KKworLyoKKyAqIERhbmNlIGRvd24gdGhlIGhpZXJhcmNoeSBpZiBuZWVkZWQgdG8gcmVjbGFpbSBtZW1vcnkuIFdlIHJlbWVtYmVyIHRoZQorICogbGFzdCBjaGlsZCB3ZSByZWNsYWltZWQgZnJvbSwgc28gdGhhdCB3ZSBkb24ndCBlbmQgdXAgcGVuYWxpemluZworICogb25lIGNoaWxkIGV4dGVuc2l2ZWx5IGJhc2VkIG9uIGl0cyBwb3NpdGlvbiBpbiB0aGUgY2hpbGRyZW4gbGlzdC4KKyAqCisgKiByb290X21lbSBpcyB0aGUgb3JpZ2luYWwgYW5jZXN0b3IgdGhhdCB3ZSd2ZSBiZWVuIHJlY2xhaW0gZnJvbS4KKyAqLworc3RhdGljIGludCBtZW1fY2dyb3VwX2hpZXJhcmNoaWNhbF9yZWNsYWltKHN0cnVjdCBtZW1fY2dyb3VwICpyb290X21lbSwKKwkJCQkJCWdmcF90IGdmcF9tYXNrLCBib29sIG5vc3dhcCkKK3sKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbmV4dF9tZW07CisJaW50IHJldCA9IDA7CisKKwkvKgorCSAqIFJlY2xhaW0gdW5jb25kaXRpb25hbGx5IGFuZCBkb24ndCBjaGVjayBmb3IgcmV0dXJuIHZhbHVlLgorCSAqIFdlIG5lZWQgdG8gcmVjbGFpbSBpbiB0aGUgY3VycmVudCBncm91cCBhbmQgZG93biB0aGUgdHJlZS4KKwkgKiBPbmUgbWlnaHQgdGhpbmsgYWJvdXQgY2hlY2tpbmcgZm9yIGNoaWxkcmVuIGJlZm9yZSByZWNsYWltaW5nLAorCSAqIGJ1dCB0aGVyZSBtaWdodCBiZSBsZWZ0IG92ZXIgYWNjb3VudGluZywgZXZlbiBhZnRlciBjaGlsZHJlbgorCSAqIGhhdmUgbGVmdC4KKwkgKi8KKwlyZXQgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKHJvb3RfbWVtLCBnZnBfbWFzaywgbm9zd2FwLAorCQkJCQkgICBnZXRfc3dhcHBpbmVzcyhyb290X21lbSkpOworCWlmIChtZW1fY2dyb3VwX2NoZWNrX3VuZGVyX2xpbWl0KHJvb3RfbWVtKSkKKwkJcmV0dXJuIDA7CisJaWYgKCFyb290X21lbS0+dXNlX2hpZXJhcmNoeSkKKwkJcmV0dXJuIHJldDsKKworCW5leHRfbWVtID0gbWVtX2Nncm91cF9nZXRfZmlyc3Rfbm9kZShyb290X21lbSk7CisKKwl3aGlsZSAobmV4dF9tZW0gIT0gcm9vdF9tZW0pIHsKKwkJaWYgKG1lbV9jZ3JvdXBfaXNfb2Jzb2xldGUobmV4dF9tZW0pKSB7CisJCQltZW1fY2dyb3VwX3B1dChuZXh0X21lbSk7CisJCQluZXh0X21lbSA9IG1lbV9jZ3JvdXBfZ2V0X2ZpcnN0X25vZGUocm9vdF9tZW0pOworCQkJY29udGludWU7CisJCX0KKwkJcmV0ID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhuZXh0X21lbSwgZ2ZwX21hc2ssIG5vc3dhcCwKKwkJCQkJCSAgIGdldF9zd2FwcGluZXNzKG5leHRfbWVtKSk7CisJCWlmIChtZW1fY2dyb3VwX2NoZWNrX3VuZGVyX2xpbWl0KHJvb3RfbWVtKSkKKwkJCXJldHVybiAwOworCQltdXRleF9sb2NrKCZtZW1fY2dyb3VwX3N1YnN5cy5oaWVyYXJjaHlfbXV0ZXgpOworCQluZXh0X21lbSA9IG1lbV9jZ3JvdXBfZ2V0X25leHRfbm9kZShuZXh0X21lbSwgcm9vdF9tZW0pOworCQltdXRleF91bmxvY2soJm1lbV9jZ3JvdXBfc3Vic3lzLmhpZXJhcmNoeV9tdXRleCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK2Jvb2wgbWVtX2Nncm91cF9vb21fY2FsbGVkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlib29sIHJldCA9IGZhbHNlOworCXN0cnVjdCBtZW1fY2dyb3VwICptZW07CisJc3RydWN0IG1tX3N0cnVjdCAqbW07CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbW0gPSB0YXNrLT5tbTsKKwlpZiAoIW1tKQorCQltbSA9ICZpbml0X21tOworCW1lbSA9IG1lbV9jZ3JvdXBfZnJvbV90YXNrKHJjdV9kZXJlZmVyZW5jZShtbS0+b3duZXIpKTsKKwlpZiAobWVtICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIG1lbS0+bGFzdF9vb21famlmZmllcyArIEhaLzEwKSkKKwkJcmV0ID0gdHJ1ZTsKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gcmV0OworfQorLyoKKyAqIFVubGlrZSBleHBvcnRlZCBpbnRlcmZhY2UsICJvb20iIHBhcmFtZXRlciBpcyBhZGRlZC4gaWYgb29tPT10cnVlLAorICogb29tLWtpbGxlciBjYW4gYmUgaW52b2tlZC4KKyAqLworc3RhdGljIGludCBfX21lbV9jZ3JvdXBfdHJ5X2NoYXJnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCWdmcF90IGdmcF9tYXNrLCBzdHJ1Y3QgbWVtX2Nncm91cCAqKm1lbWNnLAorCQkJYm9vbCBvb20pCit7CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwgKm1lbV9vdmVyX2xpbWl0OworCWludCBucl9yZXRyaWVzID0gTUVNX0NHUk9VUF9SRUNMQUlNX1JFVFJJRVM7CisJc3RydWN0IHJlc19jb3VudGVyICpmYWlsX3JlczsKKworCWlmICh1bmxpa2VseSh0ZXN0X3RocmVhZF9mbGFnKFRJRl9NRU1ESUUpKSkgeworCQkvKiBEb24ndCBhY2NvdW50IHRoaXMhICovCisJCSptZW1jZyA9IE5VTEw7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogV2UgYWx3YXlzIGNoYXJnZSB0aGUgY2dyb3VwIHRoZSBtbV9zdHJ1Y3QgYmVsb25ncyB0by4KKwkgKiBUaGUgbW1fc3RydWN0J3MgbWVtX2Nncm91cCBjaGFuZ2VzIG9uIHRhc2sgbWlncmF0aW9uIGlmIHRoZQorCSAqIHRocmVhZCBncm91cCBsZWFkZXIgbWlncmF0ZXMuIEl0J3MgcG9zc2libGUgdGhhdCBtbSBpcyBub3QKKwkgKiBzZXQsIGlmIHNvIGNoYXJnZSB0aGUgaW5pdF9tbSAoaGFwcGVucyBmb3IgcGFnZWNhY2hlIHVzYWdlKS4KKwkgKi8KKwltZW0gPSAqbWVtY2c7CisJaWYgKGxpa2VseSghbWVtKSkgeworCQltZW0gPSB0cnlfZ2V0X21lbV9jZ3JvdXBfZnJvbV9tbShtbSk7CisJCSptZW1jZyA9IG1lbTsKKwl9IGVsc2UgeworCQljc3NfZ2V0KCZtZW0tPmNzcyk7CisJfQorCWlmICh1bmxpa2VseSghbWVtKSkKKwkJcmV0dXJuIDA7CisKKwlWTV9CVUdfT04obWVtX2Nncm91cF9pc19vYnNvbGV0ZShtZW0pKTsKKworCXdoaWxlICgxKSB7CisJCWludCByZXQ7CisJCWJvb2wgbm9zd2FwID0gZmFsc2U7CisKKwkJcmV0ID0gcmVzX2NvdW50ZXJfY2hhcmdlKCZtZW0tPnJlcywgUEFHRV9TSVpFLCAmZmFpbF9yZXMpOworCQlpZiAobGlrZWx5KCFyZXQpKSB7CisJCQlpZiAoIWRvX3N3YXBfYWNjb3VudCkKKwkJCQlicmVhazsKKwkJCXJldCA9IHJlc19jb3VudGVyX2NoYXJnZSgmbWVtLT5tZW1zdywgUEFHRV9TSVpFLAorCQkJCQkJCSZmYWlsX3Jlcyk7CisJCQlpZiAobGlrZWx5KCFyZXQpKQorCQkJCWJyZWFrOworCQkJLyogbWVtK3N3YXAgY291bnRlciBmYWlscyAqLworCQkJcmVzX2NvdW50ZXJfdW5jaGFyZ2UoJm1lbS0+cmVzLCBQQUdFX1NJWkUpOworCQkJbm9zd2FwID0gdHJ1ZTsKKwkJCW1lbV9vdmVyX2xpbWl0ID0gbWVtX2Nncm91cF9mcm9tX3Jlc19jb3VudGVyKGZhaWxfcmVzLAorCQkJCQkJCQkJbWVtc3cpOworCQl9IGVsc2UKKwkJCS8qIG1lbSBjb3VudGVyIGZhaWxzICovCisJCQltZW1fb3Zlcl9saW1pdCA9IG1lbV9jZ3JvdXBfZnJvbV9yZXNfY291bnRlcihmYWlsX3JlcywKKwkJCQkJCQkJCXJlcyk7CisKKwkJaWYgKCEoZ2ZwX21hc2sgJiBfX0dGUF9XQUlUKSkKKwkJCWdvdG8gbm9tZW07CisKKwkJcmV0ID0gbWVtX2Nncm91cF9oaWVyYXJjaGljYWxfcmVjbGFpbShtZW1fb3Zlcl9saW1pdCwgZ2ZwX21hc2ssCisJCQkJCQkJbm9zd2FwKTsKKworCQkvKgorCQkgKiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCkgbWlnaHQgbm90IGdpdmUgdXMgYSBmdWxsCisJCSAqIHBpY3R1cmUgb2YgcmVjbGFpbS4gU29tZSBwYWdlcyBhcmUgcmVjbGFpbWVkIGFuZCBtaWdodCBiZQorCQkgKiBtb3ZlZCB0byBzd2FwIGNhY2hlIG9yIGp1c3QgdW5tYXBwZWQgZnJvbSB0aGUgY2dyb3VwLgorCQkgKiBDaGVjayB0aGUgbGltaXQgYWdhaW4gdG8gc2VlIGlmIHRoZSByZWNsYWltIHJlZHVjZWQgdGhlCisJCSAqIGN1cnJlbnQgdXNhZ2Ugb2YgdGhlIGNncm91cCBiZWZvcmUgZ2l2aW5nIHVwCisJCSAqCisJCSAqLworCQlpZiAobWVtX2Nncm91cF9jaGVja191bmRlcl9saW1pdChtZW1fb3Zlcl9saW1pdCkpCisJCQljb250aW51ZTsKKworCQlpZiAoIW5yX3JldHJpZXMtLSkgeworCQkJaWYgKG9vbSkgeworCQkJCW11dGV4X2xvY2soJm1lbWNnX3Rhc2tsaXN0KTsKKwkJCQltZW1fY2dyb3VwX291dF9vZl9tZW1vcnkobWVtX292ZXJfbGltaXQsIGdmcF9tYXNrKTsKKwkJCQltdXRleF91bmxvY2soJm1lbWNnX3Rhc2tsaXN0KTsKKwkJCQltZW1fb3Zlcl9saW1pdC0+bGFzdF9vb21famlmZmllcyA9IGppZmZpZXM7CisJCQl9CisJCQlnb3RvIG5vbWVtOworCQl9CisJfQorCXJldHVybiAwOworbm9tZW06CisJY3NzX3B1dCgmbWVtLT5jc3MpOworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgc3RydWN0IG1lbV9jZ3JvdXAgKnRyeV9nZXRfbWVtX2Nncm91cF9mcm9tX3N3YXBjYWNoZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtOworCXN3cF9lbnRyeV90IGVudDsKKworCWlmICghUGFnZVN3YXBDYWNoZShwYWdlKSkKKwkJcmV0dXJuIE5VTEw7CisKKwllbnQudmFsID0gcGFnZV9wcml2YXRlKHBhZ2UpOworCW1lbSA9IGxvb2t1cF9zd2FwX2Nncm91cChlbnQpOworCWlmICghbWVtKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoIWNzc190cnlnZXQoJm1lbS0+Y3NzKSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIG1lbTsKK30KKworLyoKKyAqIGNvbW1pdCBhIGNoYXJnZSBnb3QgYnkgX19tZW1fY2dyb3VwX3RyeV9jaGFyZ2UoKSBhbmQgbWFrZXMgcGFnZV9jZ3JvdXAgdG8gYmUKKyAqIFVTRUQgc3RhdGUuIElmIGFscmVhZHkgVVNFRCwgdW5jaGFyZ2UgYW5kIHJldHVybi4KKyAqLworCitzdGF0aWMgdm9pZCBfX21lbV9jZ3JvdXBfY29tbWl0X2NoYXJnZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLAorCQkJCSAgICAgc3RydWN0IHBhZ2VfY2dyb3VwICpwYywKKwkJCQkgICAgIGVudW0gY2hhcmdlX3R5cGUgY3R5cGUpCit7CisJLyogdHJ5X2NoYXJnZSgpIGNhbiByZXR1cm4gTlVMTCB0byAqbWVtY2csIHRha2luZyBjYXJlIG9mIGl0LiAqLworCWlmICghbWVtKQorCQlyZXR1cm47CisKKwlsb2NrX3BhZ2VfY2dyb3VwKHBjKTsKKwlpZiAodW5saWtlbHkoUGFnZUNncm91cFVzZWQocGMpKSkgeworCQl1bmxvY2tfcGFnZV9jZ3JvdXAocGMpOworCQlyZXNfY291bnRlcl91bmNoYXJnZSgmbWVtLT5yZXMsIFBBR0VfU0laRSk7CisJCWlmIChkb19zd2FwX2FjY291bnQpCisJCQlyZXNfY291bnRlcl91bmNoYXJnZSgmbWVtLT5tZW1zdywgUEFHRV9TSVpFKTsKKwkJY3NzX3B1dCgmbWVtLT5jc3MpOworCQlyZXR1cm47CisJfQorCXBjLT5tZW1fY2dyb3VwID0gbWVtOworCXNtcF93bWIoKTsKKwlwYy0+ZmxhZ3MgPSBwY2dfZGVmYXVsdF9mbGFnc1tjdHlwZV07CisKKwltZW1fY2dyb3VwX2NoYXJnZV9zdGF0aXN0aWNzKG1lbSwgcGMsIHRydWUpOworCisJdW5sb2NrX3BhZ2VfY2dyb3VwKHBjKTsKK30KKworLyoqCisgKiBtZW1fY2dyb3VwX21vdmVfYWNjb3VudCAtIG1vdmUgYWNjb3VudCBvZiB0aGUgcGFnZQorICogQHBjOglwYWdlX2Nncm91cCBvZiB0aGUgcGFnZS4KKyAqIEBmcm9tOiBtZW1fY2dyb3VwIHdoaWNoIHRoZSBwYWdlIGlzIG1vdmVkIGZyb20uCisgKiBAdG86CW1lbV9jZ3JvdXAgd2hpY2ggdGhlIHBhZ2UgaXMgbW92ZWQgdG8uIEBmcm9tICE9IEB0by4KKyAqCisgKiBUaGUgY2FsbGVyIG11c3QgY29uZmlybSBmb2xsb3dpbmcuCisgKiAtIHBhZ2UgaXMgbm90IG9uIExSVSAoaXNvbGF0ZV9wYWdlKCkgaXMgdXNlZnVsLikKKyAqCisgKiByZXR1cm5zIDAgYXQgc3VjY2VzcywKKyAqIHJldHVybnMgLUVCVVNZIHdoZW4gbG9jayBpcyBidXN5IG9yICJwYyIgaXMgdW5zdGFibGUuCisgKgorICogVGhpcyBmdW5jdGlvbiBkb2VzICJ1bmNoYXJnZSIgZnJvbSBvbGQgY2dyb3VwIGJ1dCBkb2Vzbid0IGRvICJjaGFyZ2UiIHRvCisgKiBuZXcgY2dyb3VwLiBJdCBzaG91bGQgYmUgZG9uZSBieSBhIGNhbGxlci4KKyAqLworCitzdGF0aWMgaW50IG1lbV9jZ3JvdXBfbW92ZV9hY2NvdW50KHN0cnVjdCBwYWdlX2Nncm91cCAqcGMsCisJc3RydWN0IG1lbV9jZ3JvdXAgKmZyb20sIHN0cnVjdCBtZW1fY2dyb3VwICp0bykKK3sKKwlzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqZnJvbV9teiwgKnRvX216OworCWludCBuaWQsIHppZDsKKwlpbnQgcmV0ID0gLUVCVVNZOworCisJVk1fQlVHX09OKGZyb20gPT0gdG8pOworCVZNX0JVR19PTihQYWdlTFJVKHBjLT5wYWdlKSk7CisKKwluaWQgPSBwYWdlX2Nncm91cF9uaWQocGMpOworCXppZCA9IHBhZ2VfY2dyb3VwX3ppZChwYyk7CisJZnJvbV9teiA9ICBtZW1fY2dyb3VwX3pvbmVpbmZvKGZyb20sIG5pZCwgemlkKTsKKwl0b19teiA9ICBtZW1fY2dyb3VwX3pvbmVpbmZvKHRvLCBuaWQsIHppZCk7CisKKwlpZiAoIXRyeWxvY2tfcGFnZV9jZ3JvdXAocGMpKQorCQlyZXR1cm4gcmV0OworCisJaWYgKCFQYWdlQ2dyb3VwVXNlZChwYykpCisJCWdvdG8gb3V0OworCisJaWYgKHBjLT5tZW1fY2dyb3VwICE9IGZyb20pCisJCWdvdG8gb3V0OworCisJY3NzX3B1dCgmZnJvbS0+Y3NzKTsKKwlyZXNfY291bnRlcl91bmNoYXJnZSgmZnJvbS0+cmVzLCBQQUdFX1NJWkUpOworCW1lbV9jZ3JvdXBfY2hhcmdlX3N0YXRpc3RpY3MoZnJvbSwgcGMsIGZhbHNlKTsKKwlpZiAoZG9fc3dhcF9hY2NvdW50KQorCQlyZXNfY291bnRlcl91bmNoYXJnZSgmZnJvbS0+bWVtc3csIFBBR0VfU0laRSk7CisJcGMtPm1lbV9jZ3JvdXAgPSB0bzsKKwltZW1fY2dyb3VwX2NoYXJnZV9zdGF0aXN0aWNzKHRvLCBwYywgdHJ1ZSk7CisJY3NzX2dldCgmdG8tPmNzcyk7CisJcmV0ID0gMDsKK291dDoKKwl1bmxvY2tfcGFnZV9jZ3JvdXAocGMpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBtb3ZlIGNoYXJnZXMgdG8gaXRzIHBhcmVudC4KKyAqLworCitzdGF0aWMgaW50IG1lbV9jZ3JvdXBfbW92ZV9wYXJlbnQoc3RydWN0IHBhZ2VfY2dyb3VwICpwYywKKwkJCQkgIHN0cnVjdCBtZW1fY2dyb3VwICpjaGlsZCwKKwkJCQkgIGdmcF90IGdmcF9tYXNrKQoreworCXN0cnVjdCBwYWdlICpwYWdlID0gcGMtPnBhZ2U7CisJc3RydWN0IGNncm91cCAqY2cgPSBjaGlsZC0+Y3NzLmNncm91cDsKKwlzdHJ1Y3QgY2dyb3VwICpwY2cgPSBjZy0+cGFyZW50OworCXN0cnVjdCBtZW1fY2dyb3VwICpwYXJlbnQ7CisJaW50IHJldDsKKworCS8qIElzIFJPT1QgPyAqLworCWlmICghcGNnKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCisJcGFyZW50ID0gbWVtX2Nncm91cF9mcm9tX2NvbnQocGNnKTsKKworCisJcmV0ID0gX19tZW1fY2dyb3VwX3RyeV9jaGFyZ2UoTlVMTCwgZ2ZwX21hc2ssICZwYXJlbnQsIGZhbHNlKTsKKwlpZiAocmV0IHx8ICFwYXJlbnQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoIWdldF9wYWdlX3VubGVzc196ZXJvKHBhZ2UpKQorCQlyZXR1cm4gLUVCVVNZOworCisJcmV0ID0gaXNvbGF0ZV9scnVfcGFnZShwYWdlKTsKKworCWlmIChyZXQpCisJCWdvdG8gY2FuY2VsOworCisJcmV0ID0gbWVtX2Nncm91cF9tb3ZlX2FjY291bnQocGMsIGNoaWxkLCBwYXJlbnQpOworCisJLyogZHJvcCBleHRyYSByZWZjbnQgYnkgdHJ5X2NoYXJnZSgpIChtb3ZlX2FjY291bnQgaW5jcmVtZW50IG9uZSkgKi8KKwljc3NfcHV0KCZwYXJlbnQtPmNzcyk7CisJcHV0YmFja19scnVfcGFnZShwYWdlKTsKKwlpZiAoIXJldCkgeworCQlwdXRfcGFnZShwYWdlKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIHVuY2hhcmdlIGlmIG1vdmUgZmFpbHMgKi8KK2NhbmNlbDoKKwlyZXNfY291bnRlcl91bmNoYXJnZSgmcGFyZW50LT5yZXMsIFBBR0VfU0laRSk7CisJaWYgKGRvX3N3YXBfYWNjb3VudCkKKwkJcmVzX2NvdW50ZXJfdW5jaGFyZ2UoJnBhcmVudC0+bWVtc3csIFBBR0VfU0laRSk7CisJcHV0X3BhZ2UocGFnZSk7CisJcmV0dXJuIHJldDsKK30KKwogLyoKICAqIENoYXJnZSB0aGUgbWVtb3J5IGNvbnRyb2xsZXIgZm9yIHBhZ2UgdXNhZ2UuCiAgKiBSZXR1cm4KQEAgLTQ3OSw5NSArMTA1NywyNyBAQAogewogCXN0cnVjdCBtZW1fY2dyb3VwICptZW07CiAJc3RydWN0IHBhZ2VfY2dyb3VwICpwYzsKLQl1bnNpZ25lZCBsb25nIG5yX3JldHJpZXMgPSBNRU1fQ0dST1VQX1JFQ0xBSU1fUkVUUklFUzsKLQlzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqbXo7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OwogCiAJcGMgPSBsb29rdXBfcGFnZV9jZ3JvdXAocGFnZSk7CiAJLyogY2FuIGhhcHBlbiBhdCBib290ICovCiAJaWYgKHVubGlrZWx5KCFwYykpCiAJCXJldHVybiAwOwogCXByZWZldGNodyhwYyk7Ci0JLyoKLQkgKiBXZSBhbHdheXMgY2hhcmdlIHRoZSBjZ3JvdXAgdGhlIG1tX3N0cnVjdCBiZWxvbmdzIHRvLgotCSAqIFRoZSBtbV9zdHJ1Y3QncyBtZW1fY2dyb3VwIGNoYW5nZXMgb24gdGFzayBtaWdyYXRpb24gaWYgdGhlCi0JICogdGhyZWFkIGdyb3VwIGxlYWRlciBtaWdyYXRlcy4gSXQncyBwb3NzaWJsZSB0aGF0IG1tIGlzIG5vdAotCSAqIHNldCwgaWYgc28gY2hhcmdlIHRoZSBpbml0X21tIChoYXBwZW5zIGZvciBwYWdlY2FjaGUgdXNhZ2UpLgotCSAqLwogCi0JaWYgKGxpa2VseSghbWVtY2cpKSB7Ci0JCXJjdV9yZWFkX2xvY2soKTsKLQkJbWVtID0gbWVtX2Nncm91cF9mcm9tX3Rhc2socmN1X2RlcmVmZXJlbmNlKG1tLT5vd25lcikpOwotCQlpZiAodW5saWtlbHkoIW1lbSkpIHsKLQkJCXJjdV9yZWFkX3VubG9jaygpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJLyoKLQkJICogRm9yIGV2ZXJ5IGNoYXJnZSBmcm9tIHRoZSBjZ3JvdXAsIGluY3JlbWVudCByZWZlcmVuY2UgY291bnQKLQkJICovCi0JCWNzc19nZXQoJm1lbS0+Y3NzKTsKLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JfSBlbHNlIHsKLQkJbWVtID0gbWVtY2c7Ci0JCWNzc19nZXQoJm1lbWNnLT5jc3MpOwotCX0KKwltZW0gPSBtZW1jZzsKKwlyZXQgPSBfX21lbV9jZ3JvdXBfdHJ5X2NoYXJnZShtbSwgZ2ZwX21hc2ssICZtZW0sIHRydWUpOworCWlmIChyZXQgfHwgIW1lbSkKKwkJcmV0dXJuIHJldDsKIAotCXdoaWxlICh1bmxpa2VseShyZXNfY291bnRlcl9jaGFyZ2UoJm1lbS0+cmVzLCBQQUdFX1NJWkUpKSkgewotCQlpZiAoIShnZnBfbWFzayAmIF9fR0ZQX1dBSVQpKQotCQkJZ290byBvdXQ7Ci0KLQkJaWYgKHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtLCBnZnBfbWFzaykpCi0JCQljb250aW51ZTsKLQotCQkvKgotCQkgKiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCkgbWlnaHQgbm90IGdpdmUgdXMgYSBmdWxsCi0JCSAqIHBpY3R1cmUgb2YgcmVjbGFpbS4gU29tZSBwYWdlcyBhcmUgcmVjbGFpbWVkIGFuZCBtaWdodCBiZQotCQkgKiBtb3ZlZCB0byBzd2FwIGNhY2hlIG9yIGp1c3QgdW5tYXBwZWQgZnJvbSB0aGUgY2dyb3VwLgotCQkgKiBDaGVjayB0aGUgbGltaXQgYWdhaW4gdG8gc2VlIGlmIHRoZSByZWNsYWltIHJlZHVjZWQgdGhlCi0JCSAqIGN1cnJlbnQgdXNhZ2Ugb2YgdGhlIGNncm91cCBiZWZvcmUgZ2l2aW5nIHVwCi0JCSAqLwotCQlpZiAocmVzX2NvdW50ZXJfY2hlY2tfdW5kZXJfbGltaXQoJm1lbS0+cmVzKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmICghbnJfcmV0cmllcy0tKSB7Ci0JCQltZW1fY2dyb3VwX291dF9vZl9tZW1vcnkobWVtLCBnZnBfbWFzayk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQotCi0JbG9ja19wYWdlX2Nncm91cChwYyk7Ci0JaWYgKHVubGlrZWx5KFBhZ2VDZ3JvdXBVc2VkKHBjKSkpIHsKLQkJdW5sb2NrX3BhZ2VfY2dyb3VwKHBjKTsKLQkJcmVzX2NvdW50ZXJfdW5jaGFyZ2UoJm1lbS0+cmVzLCBQQUdFX1NJWkUpOwotCQljc3NfcHV0KCZtZW0tPmNzcyk7Ci0KLQkJZ290byBkb25lOwotCX0KLQlwYy0+bWVtX2Nncm91cCA9IG1lbTsKLQkvKgotCSAqIElmIGEgcGFnZSBpcyBhY2NvdW50ZWQgYXMgYSBwYWdlIGNhY2hlLCBpbnNlcnQgdG8gaW5hY3RpdmUgbGlzdC4KLQkgKiBJZiBhbm9uLCBpbnNlcnQgdG8gYWN0aXZlIGxpc3QuCi0JICovCi0JcGMtPmZsYWdzID0gcGNnX2RlZmF1bHRfZmxhZ3NbY3R5cGVdOwotCi0JbXogPSBwYWdlX2Nncm91cF96b25laW5mbyhwYyk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXotPmxydV9sb2NrLCBmbGFncyk7Ci0JX19tZW1fY2dyb3VwX2FkZF9saXN0KG16LCBwYyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXotPmxydV9sb2NrLCBmbGFncyk7Ci0JdW5sb2NrX3BhZ2VfY2dyb3VwKHBjKTsKLQotZG9uZToKKwlfX21lbV9jZ3JvdXBfY29tbWl0X2NoYXJnZShtZW0sIHBjLCBjdHlwZSk7CiAJcmV0dXJuIDA7Ci1vdXQ6Ci0JY3NzX3B1dCgmbWVtLT5jc3MpOwotCXJldHVybiAtRU5PTUVNOwogfQogCi1pbnQgbWVtX2Nncm91cF9jaGFyZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBnZnBfdCBnZnBfbWFzaykKK2ludCBtZW1fY2dyb3VwX25ld3BhZ2VfY2hhcmdlKHN0cnVjdCBwYWdlICpwYWdlLAorCQkJICAgICAgc3RydWN0IG1tX3N0cnVjdCAqbW0sIGdmcF90IGdmcF9tYXNrKQogewotCWlmIChtZW1fY2dyb3VwX3N1YnN5cy5kaXNhYmxlZCkKKwlpZiAobWVtX2Nncm91cF9kaXNhYmxlZCgpKQogCQlyZXR1cm4gMDsKIAlpZiAoUGFnZUNvbXBvdW5kKHBhZ2UpKQogCQlyZXR1cm4gMDsKQEAgLTU4OSw3ICsxMDk5LDEwIEBACiBpbnQgbWVtX2Nncm91cF9jYWNoZV9jaGFyZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkJCWdmcF90IGdmcF9tYXNrKQogewotCWlmIChtZW1fY2dyb3VwX3N1YnN5cy5kaXNhYmxlZCkKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtID0gTlVMTDsKKwlpbnQgcmV0OworCisJaWYgKG1lbV9jZ3JvdXBfZGlzYWJsZWQoKSkKIAkJcmV0dXJuIDA7CiAJaWYgKFBhZ2VDb21wb3VuZChwYWdlKSkKIAkJcmV0dXJuIDA7CkBAIC02MDEsNiArMTExNCw4IEBACiAJICogRm9yIEdGUF9OT1dBSVQgY2FzZSwgdGhlIHBhZ2UgbWF5IGJlIHByZS1jaGFyZ2VkIGJlZm9yZSBjYWxsaW5nCiAJICogYWRkX3RvX3BhZ2VfY2FjaGUoKS4gKFNlZSBzaG1lbS5jKSBjaGVjayBpdCBoZXJlIGFuZCBhdm9pZCB0byBjYWxsCiAJICogY2hhcmdlIHR3aWNlLiAoSXQgd29ya3MgYnV0IGhhcyB0byBwYXkgYSBiaXQgbGFyZ2VyIGNvc3QuKQorCSAqIEFuZCB3aGVuIHRoZSBwYWdlIGlzIFN3YXBDYWNoZSwgaXQgc2hvdWxkIHRha2Ugc3dhcCBpbmZvcm1hdGlvbgorCSAqIGludG8gYWNjb3VudC4gVGhpcyBpcyB1bmRlciBsb2NrX3BhZ2UoKSBub3cuCiAJICovCiAJaWYgKCEoZ2ZwX21hc2sgJiBfX0dGUF9XQUlUKSkgewogCQlzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjOwpAQCAtNjE3LDU4ICsxMTMyLDE5OCBAQAogCQl1bmxvY2tfcGFnZV9jZ3JvdXAocGMpOwogCX0KIAotCWlmICh1bmxpa2VseSghbW0pKQorCWlmIChkb19zd2FwX2FjY291bnQgJiYgUGFnZVN3YXBDYWNoZShwYWdlKSkgeworCQltZW0gPSB0cnlfZ2V0X21lbV9jZ3JvdXBfZnJvbV9zd2FwY2FjaGUocGFnZSk7CisJCWlmIChtZW0pCisJCQltbSA9IE5VTEw7CisJCSAgZWxzZQorCQkJbWVtID0gTlVMTDsKKwkJLyogU3dhcENhY2hlIG1heSBiZSBzdGlsbCBsaW5rZWQgdG8gTFJVIG5vdy4gKi8KKwkJbWVtX2Nncm91cF9scnVfZGVsX2JlZm9yZV9jb21taXRfc3dhcGNhY2hlKHBhZ2UpOworCX0KKworCWlmICh1bmxpa2VseSghbW0gJiYgIW1lbSkpCiAJCW1tID0gJmluaXRfbW07CiAKIAlpZiAocGFnZV9pc19maWxlX2NhY2hlKHBhZ2UpKQogCQlyZXR1cm4gbWVtX2Nncm91cF9jaGFyZ2VfY29tbW9uKHBhZ2UsIG1tLCBnZnBfbWFzaywKIAkJCQlNRU1fQ0dST1VQX0NIQVJHRV9UWVBFX0NBQ0hFLCBOVUxMKTsKLQllbHNlCi0JCXJldHVybiBtZW1fY2dyb3VwX2NoYXJnZV9jb21tb24ocGFnZSwgbW0sIGdmcF9tYXNrLAotCQkJCU1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfU0hNRU0sIE5VTEwpOworCisJcmV0ID0gbWVtX2Nncm91cF9jaGFyZ2VfY29tbW9uKHBhZ2UsIG1tLCBnZnBfbWFzaywKKwkJCQlNRU1fQ0dST1VQX0NIQVJHRV9UWVBFX1NITUVNLCBtZW0pOworCWlmIChtZW0pCisJCWNzc19wdXQoJm1lbS0+Y3NzKTsKKwlpZiAoUGFnZVN3YXBDYWNoZShwYWdlKSkKKwkJbWVtX2Nncm91cF9scnVfYWRkX2FmdGVyX2NvbW1pdF9zd2FwY2FjaGUocGFnZSk7CisKKwlpZiAoZG9fc3dhcF9hY2NvdW50ICYmICFyZXQgJiYgUGFnZVN3YXBDYWNoZShwYWdlKSkgeworCQlzd3BfZW50cnlfdCBlbnQgPSB7LnZhbCA9IHBhZ2VfcHJpdmF0ZShwYWdlKX07CisJCS8qIGF2b2lkIGRvdWJsZSBjb3VudGluZyAqLworCQltZW0gPSBzd2FwX2Nncm91cF9yZWNvcmQoZW50LCBOVUxMKTsKKwkJaWYgKG1lbSkgeworCQkJcmVzX2NvdW50ZXJfdW5jaGFyZ2UoJm1lbS0+bWVtc3csIFBBR0VfU0laRSk7CisJCQltZW1fY2dyb3VwX3B1dChtZW0pOworCQl9CisJfQorCXJldHVybiByZXQ7CiB9CiAKIC8qCisgKiBXaGlsZSBzd2FwLWluLCB0cnlfY2hhcmdlIC0+IGNvbW1pdCBvciBjYW5jZWwsIHRoZSBwYWdlIGlzIGxvY2tlZC4KKyAqIEFuZCB3aGVuIHRyeV9jaGFyZ2UoKSBzdWNjZXNzZnVsbHkgcmV0dXJucywgb25lIHJlZmNudCB0byBtZW1jZyB3aXRob3V0CisgKiBzdHJ1Y3QgcGFnZV9jZ3JvdXAgaXMgYXF1aXJlZC4gVGhpcyByZWZjbnQgd2lsbCBiZSBjdW1zdW1lZCBieQorICogImNvbW1pdCgpIiBvciByZW1vdmVkIGJ5ICJjYW5jZWwoKSIKKyAqLworaW50IG1lbV9jZ3JvdXBfdHJ5X2NoYXJnZV9zd2FwaW4oc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCQkJIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCSBnZnBfdCBtYXNrLCBzdHJ1Y3QgbWVtX2Nncm91cCAqKnB0cikKK3sKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtOworCWludCByZXQ7CisKKwlpZiAobWVtX2Nncm91cF9kaXNhYmxlZCgpKQorCQlyZXR1cm4gMDsKKworCWlmICghZG9fc3dhcF9hY2NvdW50KQorCQlnb3RvIGNoYXJnZV9jdXJfbW07CisJLyoKKwkgKiBBIHJhY2luZyB0aHJlYWQncyBmYXVsdCwgb3Igc3dhcG9mZiwgbWF5IGhhdmUgYWxyZWFkeSB1cGRhdGVkCisJICogdGhlIHB0ZSwgYW5kIGV2ZW4gcmVtb3ZlZCBwYWdlIGZyb20gc3dhcCBjYWNoZTogcmV0dXJuIHN1Y2Nlc3MKKwkgKiB0byBnbyBvbiB0byBkb19zd2FwX3BhZ2UoKSdzIHB0ZV9zYW1lKCkgdGVzdCwgd2hpY2ggc2hvdWxkIGZhaWwuCisJICovCisJaWYgKCFQYWdlU3dhcENhY2hlKHBhZ2UpKQorCQlyZXR1cm4gMDsKKwltZW0gPSB0cnlfZ2V0X21lbV9jZ3JvdXBfZnJvbV9zd2FwY2FjaGUocGFnZSk7CisJaWYgKCFtZW0pCisJCWdvdG8gY2hhcmdlX2N1cl9tbTsKKwkqcHRyID0gbWVtOworCXJldCA9IF9fbWVtX2Nncm91cF90cnlfY2hhcmdlKE5VTEwsIG1hc2ssIHB0ciwgdHJ1ZSk7CisJLyogZHJvcCBleHRyYSByZWZjbnQgZnJvbSB0cnlnZXQgKi8KKwljc3NfcHV0KCZtZW0tPmNzcyk7CisJcmV0dXJuIHJldDsKK2NoYXJnZV9jdXJfbW06CisJaWYgKHVubGlrZWx5KCFtbSkpCisJCW1tID0gJmluaXRfbW07CisJcmV0dXJuIF9fbWVtX2Nncm91cF90cnlfY2hhcmdlKG1tLCBtYXNrLCBwdHIsIHRydWUpOworfQorCit2b2lkIG1lbV9jZ3JvdXBfY29tbWl0X2NoYXJnZV9zd2FwaW4oc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBtZW1fY2dyb3VwICpwdHIpCit7CisJc3RydWN0IHBhZ2VfY2dyb3VwICpwYzsKKworCWlmIChtZW1fY2dyb3VwX2Rpc2FibGVkKCkpCisJCXJldHVybjsKKwlpZiAoIXB0cikKKwkJcmV0dXJuOworCXBjID0gbG9va3VwX3BhZ2VfY2dyb3VwKHBhZ2UpOworCW1lbV9jZ3JvdXBfbHJ1X2RlbF9iZWZvcmVfY29tbWl0X3N3YXBjYWNoZShwYWdlKTsKKwlfX21lbV9jZ3JvdXBfY29tbWl0X2NoYXJnZShwdHIsIHBjLCBNRU1fQ0dST1VQX0NIQVJHRV9UWVBFX01BUFBFRCk7CisJbWVtX2Nncm91cF9scnVfYWRkX2FmdGVyX2NvbW1pdF9zd2FwY2FjaGUocGFnZSk7CisJLyoKKwkgKiBOb3cgc3dhcCBpcyBvbi1tZW1vcnkuIFRoaXMgbWVhbnMgdGhpcyBwYWdlIG1heSBiZQorCSAqIGNvdW50ZWQgYm90aCBhcyBtZW0gYW5kIHN3YXAuLi4uZG91YmxlIGNvdW50LgorCSAqIEZpeCBpdCBieSB1bmNoYXJnaW5nIGZyb20gbWVtc3cuIEJhc2ljYWxseSwgdGhpcyBTd2FwQ2FjaGUgaXMgc3RhYmxlCisJICogdW5kZXIgbG9ja19wYWdlKCkuIEJ1dCBpbiBkb19zd2FwX3BhZ2UoKTo6bWVtb3J5LmMsIHJldXNlX3N3YXBfcGFnZSgpCisJICogbWF5IGNhbGwgZGVsZXRlX2Zyb21fc3dhcF9jYWNoZSgpIGJlZm9yZSByZWFjaCBoZXJlLgorCSAqLworCWlmIChkb19zd2FwX2FjY291bnQgJiYgUGFnZVN3YXBDYWNoZShwYWdlKSkgeworCQlzd3BfZW50cnlfdCBlbnQgPSB7LnZhbCA9IHBhZ2VfcHJpdmF0ZShwYWdlKX07CisJCXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZzsKKwkJbWVtY2cgPSBzd2FwX2Nncm91cF9yZWNvcmQoZW50LCBOVUxMKTsKKwkJaWYgKG1lbWNnKSB7CisJCQlyZXNfY291bnRlcl91bmNoYXJnZSgmbWVtY2ctPm1lbXN3LCBQQUdFX1NJWkUpOworCQkJbWVtX2Nncm91cF9wdXQobWVtY2cpOworCQl9CisKKwl9CisJLyogYWRkIHRoaXMgcGFnZShwYWdlX2Nncm91cCkgdG8gdGhlIExSVSB3ZSB3YW50LiAqLworCit9CisKK3ZvaWQgbWVtX2Nncm91cF9jYW5jZWxfY2hhcmdlX3N3YXBpbihzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKQoreworCWlmIChtZW1fY2dyb3VwX2Rpc2FibGVkKCkpCisJCXJldHVybjsKKwlpZiAoIW1lbSkKKwkJcmV0dXJuOworCXJlc19jb3VudGVyX3VuY2hhcmdlKCZtZW0tPnJlcywgUEFHRV9TSVpFKTsKKwlpZiAoZG9fc3dhcF9hY2NvdW50KQorCQlyZXNfY291bnRlcl91bmNoYXJnZSgmbWVtLT5tZW1zdywgUEFHRV9TSVpFKTsKKwljc3NfcHV0KCZtZW0tPmNzcyk7Cit9CisKKworLyoKICAqIHVuY2hhcmdlIGlmICFwYWdlX21hcHBlZChwYWdlKQogICovCi1zdGF0aWMgdm9pZAorc3RhdGljIHN0cnVjdCBtZW1fY2dyb3VwICoKIF9fbWVtX2Nncm91cF91bmNoYXJnZV9jb21tb24oc3RydWN0IHBhZ2UgKnBhZ2UsIGVudW0gY2hhcmdlX3R5cGUgY3R5cGUpCiB7CiAJc3RydWN0IHBhZ2VfY2dyb3VwICpwYzsKLQlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtOworCXN0cnVjdCBtZW1fY2dyb3VwICptZW0gPSBOVUxMOwogCXN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICptejsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKG1lbV9jZ3JvdXBfc3Vic3lzLmRpc2FibGVkKQotCQlyZXR1cm47CisJaWYgKG1lbV9jZ3JvdXBfZGlzYWJsZWQoKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoUGFnZVN3YXBDYWNoZShwYWdlKSkKKwkJcmV0dXJuIE5VTEw7CiAKIAkvKgogCSAqIENoZWNrIGlmIG91ciBwYWdlX2Nncm91cCBpcyB2YWxpZAogCSAqLwogCXBjID0gbG9va3VwX3BhZ2VfY2dyb3VwKHBhZ2UpOwogCWlmICh1bmxpa2VseSghcGMgfHwgIVBhZ2VDZ3JvdXBVc2VkKHBjKSkpCi0JCXJldHVybjsKKwkJcmV0dXJuIE5VTEw7CiAKIAlsb2NrX3BhZ2VfY2dyb3VwKHBjKTsKLQlpZiAoKGN0eXBlID09IE1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfTUFQUEVEICYmIHBhZ2VfbWFwcGVkKHBhZ2UpKQotCSAgICAgfHwgIVBhZ2VDZ3JvdXBVc2VkKHBjKSkgewotCQkvKiBUaGlzIGhhcHBlbnMgYXQgcmFjZSBpbiB6YXBfcHRlX3JhbmdlKCkgYW5kIGRvX3N3YXBfcGFnZSgpKi8KLQkJdW5sb2NrX3BhZ2VfY2dyb3VwKHBjKTsKLQkJcmV0dXJuOwotCX0KLQlDbGVhclBhZ2VDZ3JvdXBVc2VkKHBjKTsKKwogCW1lbSA9IHBjLT5tZW1fY2dyb3VwOwogCi0JbXogPSBwYWdlX2Nncm91cF96b25laW5mbyhwYyk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJm16LT5scnVfbG9jaywgZmxhZ3MpOwotCV9fbWVtX2Nncm91cF9yZW1vdmVfbGlzdChteiwgcGMpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm16LT5scnVfbG9jaywgZmxhZ3MpOwotCXVubG9ja19wYWdlX2Nncm91cChwYyk7CisJaWYgKCFQYWdlQ2dyb3VwVXNlZChwYykpCisJCWdvdG8gdW5sb2NrX291dDsKKworCXN3aXRjaCAoY3R5cGUpIHsKKwljYXNlIE1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfTUFQUEVEOgorCQlpZiAocGFnZV9tYXBwZWQocGFnZSkpCisJCQlnb3RvIHVubG9ja19vdXQ7CisJCWJyZWFrOworCWNhc2UgTUVNX0NHUk9VUF9DSEFSR0VfVFlQRV9TV0FQT1VUOgorCQlpZiAoIVBhZ2VBbm9uKHBhZ2UpKSB7CS8qIFNoYXJlZCBtZW1vcnkgKi8KKwkJCWlmIChwYWdlLT5tYXBwaW5nICYmICFwYWdlX2lzX2ZpbGVfY2FjaGUocGFnZSkpCisJCQkJZ290byB1bmxvY2tfb3V0OworCQl9IGVsc2UgaWYgKHBhZ2VfbWFwcGVkKHBhZ2UpKSAvKiBBbm9uICovCisJCQkJZ290byB1bmxvY2tfb3V0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CiAKIAlyZXNfY291bnRlcl91bmNoYXJnZSgmbWVtLT5yZXMsIFBBR0VfU0laRSk7Ci0JY3NzX3B1dCgmbWVtLT5jc3MpOworCWlmIChkb19zd2FwX2FjY291bnQgJiYgKGN0eXBlICE9IE1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfU1dBUE9VVCkpCisJCXJlc19jb3VudGVyX3VuY2hhcmdlKCZtZW0tPm1lbXN3LCBQQUdFX1NJWkUpOwogCi0JcmV0dXJuOworCW1lbV9jZ3JvdXBfY2hhcmdlX3N0YXRpc3RpY3MobWVtLCBwYywgZmFsc2UpOworCUNsZWFyUGFnZUNncm91cFVzZWQocGMpOworCS8qCisJICogcGMtPm1lbV9jZ3JvdXAgaXMgbm90IGNsZWFyZWQgaGVyZS4gSXQgd2lsbCBiZSBhY2Nlc3NlZCB3aGVuIGl0J3MKKwkgKiBmcmVlZCBmcm9tIExSVS4gVGhpcyBpcyBzYWZlIGJlY2F1c2UgdW5jaGFyZ2VkIHBhZ2UgaXMgZXhwZWN0ZWQgbm90CisJICogdG8gYmUgcmV1c2VkIChmcmVlZCBzb29uKS4gRXhjZXB0aW9uIGlzIFN3YXBDYWNoZSwgaXQncyBoYW5kbGVkIGJ5CisJICogc3BlY2lhbCBmdW5jdGlvbnMuCisJICovCisKKwlteiA9IHBhZ2VfY2dyb3VwX3pvbmVpbmZvKHBjKTsKKwl1bmxvY2tfcGFnZV9jZ3JvdXAocGMpOworCisJLyogYXQgc3dhcG91dCwgdGhpcyBtZW1jZyB3aWxsIGJlIGFjY2Vzc2VkIHRvIHJlY29yZCB0byBzd2FwICovCisJaWYgKGN0eXBlICE9IE1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfU1dBUE9VVCkKKwkJY3NzX3B1dCgmbWVtLT5jc3MpOworCisJcmV0dXJuIG1lbTsKKwordW5sb2NrX291dDoKKwl1bmxvY2tfcGFnZV9jZ3JvdXAocGMpOworCXJldHVybiBOVUxMOwogfQogCiB2b2lkIG1lbV9jZ3JvdXBfdW5jaGFyZ2VfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKQEAgLTY4OSwxNiArMTM0NCw1NSBAQAogfQogCiAvKgotICogQmVmb3JlIHN0YXJ0aW5nIG1pZ3JhdGlvbiwgYWNjb3VudCBhZ2FpbnN0IG5ldyBwYWdlLgorICogY2FsbGVkIGZyb20gX19kZWxldGVfZnJvbV9zd2FwX2NhY2hlKCkgYW5kIGRyb3AgInBhZ2UiIGFjY291bnQuCisgKiBtZW1jZyBpbmZvcm1hdGlvbiBpcyByZWNvcmRlZCB0byBzd2FwX2Nncm91cCBvZiAiZW50IgogICovCi1pbnQgbWVtX2Nncm91cF9wcmVwYXJlX21pZ3JhdGlvbihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHBhZ2UgKm5ld3BhZ2UpCit2b2lkIG1lbV9jZ3JvdXBfdW5jaGFyZ2Vfc3dhcGNhY2hlKHN0cnVjdCBwYWdlICpwYWdlLCBzd3BfZW50cnlfdCBlbnQpCit7CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnOworCisJbWVtY2cgPSBfX21lbV9jZ3JvdXBfdW5jaGFyZ2VfY29tbW9uKHBhZ2UsCisJCQkJCU1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfU1dBUE9VVCk7CisJLyogcmVjb3JkIG1lbWNnIGluZm9ybWF0aW9uICovCisJaWYgKGRvX3N3YXBfYWNjb3VudCAmJiBtZW1jZykgeworCQlzd2FwX2Nncm91cF9yZWNvcmQoZW50LCBtZW1jZyk7CisJCW1lbV9jZ3JvdXBfZ2V0KG1lbWNnKTsKKwl9CisJaWYgKG1lbWNnKQorCQljc3NfcHV0KCZtZW1jZy0+Y3NzKTsKK30KKworI2lmZGVmIENPTkZJR19DR1JPVVBfTUVNX1JFU19DVExSX1NXQVAKKy8qCisgKiBjYWxsZWQgZnJvbSBzd2FwX2VudHJ5X2ZyZWUoKS4gcmVtb3ZlIHJlY29yZCBpbiBzd2FwX2Nncm91cCBhbmQKKyAqIHVuY2hhcmdlICJtZW1zdyIgYWNjb3VudC4KKyAqLwordm9pZCBtZW1fY2dyb3VwX3VuY2hhcmdlX3N3YXAoc3dwX2VudHJ5X3QgZW50KQoreworCXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZzsKKworCWlmICghZG9fc3dhcF9hY2NvdW50KQorCQlyZXR1cm47CisKKwltZW1jZyA9IHN3YXBfY2dyb3VwX3JlY29yZChlbnQsIE5VTEwpOworCWlmIChtZW1jZykgeworCQlyZXNfY291bnRlcl91bmNoYXJnZSgmbWVtY2ctPm1lbXN3LCBQQUdFX1NJWkUpOworCQltZW1fY2dyb3VwX3B1dChtZW1jZyk7CisJfQorfQorI2VuZGlmCisKKy8qCisgKiBCZWZvcmUgc3RhcnRpbmcgbWlncmF0aW9uLCBhY2NvdW50IFBBR0VfU0laRSB0byBtZW1fY2dyb3VwIHRoYXQgdGhlIG9sZAorICogcGFnZSBiZWxvbmdzIHRvLgorICovCitpbnQgbWVtX2Nncm91cF9wcmVwYXJlX21pZ3JhdGlvbihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IG1lbV9jZ3JvdXAgKipwdHIpCiB7CiAJc3RydWN0IHBhZ2VfY2dyb3VwICpwYzsKIAlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtID0gTlVMTDsKLQllbnVtIGNoYXJnZV90eXBlIGN0eXBlID0gTUVNX0NHUk9VUF9DSEFSR0VfVFlQRV9NQVBQRUQ7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAobWVtX2Nncm91cF9zdWJzeXMuZGlzYWJsZWQpCisJaWYgKG1lbV9jZ3JvdXBfZGlzYWJsZWQoKSkKIAkJcmV0dXJuIDA7CiAKIAlwYyA9IGxvb2t1cF9wYWdlX2Nncm91cChwYWdlKTsKQEAgLTcwNiw0MSArMTQwMCw2NyBAQAogCWlmIChQYWdlQ2dyb3VwVXNlZChwYykpIHsKIAkJbWVtID0gcGMtPm1lbV9jZ3JvdXA7CiAJCWNzc19nZXQoJm1lbS0+Y3NzKTsKLQkJaWYgKFBhZ2VDZ3JvdXBDYWNoZShwYykpIHsKLQkJCWlmIChwYWdlX2lzX2ZpbGVfY2FjaGUocGFnZSkpCi0JCQkJY3R5cGUgPSBNRU1fQ0dST1VQX0NIQVJHRV9UWVBFX0NBQ0hFOwotCQkJZWxzZQotCQkJCWN0eXBlID0gTUVNX0NHUk9VUF9DSEFSR0VfVFlQRV9TSE1FTTsKLQkJfQogCX0KIAl1bmxvY2tfcGFnZV9jZ3JvdXAocGMpOworCiAJaWYgKG1lbSkgewotCQlyZXQgPSBtZW1fY2dyb3VwX2NoYXJnZV9jb21tb24obmV3cGFnZSwgTlVMTCwgR0ZQX0tFUk5FTCwKLQkJCWN0eXBlLCBtZW0pOworCQlyZXQgPSBfX21lbV9jZ3JvdXBfdHJ5X2NoYXJnZShOVUxMLCBHRlBfS0VSTkVMLCAmbWVtLCBmYWxzZSk7CiAJCWNzc19wdXQoJm1lbS0+Y3NzKTsKIAl9CisJKnB0ciA9IG1lbTsKIAlyZXR1cm4gcmV0OwogfQogCiAvKiByZW1vdmUgcmVkdW5kYW50IGNoYXJnZSBpZiBtaWdyYXRpb24gZmFpbGVkKi8KLXZvaWQgbWVtX2Nncm91cF9lbmRfbWlncmF0aW9uKHN0cnVjdCBwYWdlICpuZXdwYWdlKQordm9pZCBtZW1fY2dyb3VwX2VuZF9taWdyYXRpb24oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwKKwkJc3RydWN0IHBhZ2UgKm9sZHBhZ2UsIHN0cnVjdCBwYWdlICpuZXdwYWdlKQogeworCXN0cnVjdCBwYWdlICp0YXJnZXQsICp1bnVzZWQ7CisJc3RydWN0IHBhZ2VfY2dyb3VwICpwYzsKKwllbnVtIGNoYXJnZV90eXBlIGN0eXBlOworCisJaWYgKCFtZW0pCisJCXJldHVybjsKKworCS8qIGF0IG1pZ3JhdGlvbiBzdWNjZXNzLCBvbGRwYWdlLT5tYXBwaW5nIGlzIE5VTEwuICovCisJaWYgKG9sZHBhZ2UtPm1hcHBpbmcpIHsKKwkJdGFyZ2V0ID0gb2xkcGFnZTsKKwkJdW51c2VkID0gTlVMTDsKKwl9IGVsc2UgeworCQl0YXJnZXQgPSBuZXdwYWdlOworCQl1bnVzZWQgPSBvbGRwYWdlOworCX0KKworCWlmIChQYWdlQW5vbih0YXJnZXQpKQorCQljdHlwZSA9IE1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfTUFQUEVEOworCWVsc2UgaWYgKHBhZ2VfaXNfZmlsZV9jYWNoZSh0YXJnZXQpKQorCQljdHlwZSA9IE1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfQ0FDSEU7CisJZWxzZQorCQljdHlwZSA9IE1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfU0hNRU07CisKKwkvKiB1bnVzZWQgcGFnZSBpcyBub3Qgb24gcmFkaXgtdHJlZSBub3cuICovCisJaWYgKHVudXNlZCkKKwkJX19tZW1fY2dyb3VwX3VuY2hhcmdlX2NvbW1vbih1bnVzZWQsIGN0eXBlKTsKKworCXBjID0gbG9va3VwX3BhZ2VfY2dyb3VwKHRhcmdldCk7CiAJLyoKLQkgKiBBdCBzdWNjZXNzLCBwYWdlLT5tYXBwaW5nIGlzIG5vdCBOVUxMLgotCSAqIHNwZWNpYWwgcm9sbGJhY2sgY2FyZSBpcyBuZWNlc3Nhcnkgd2hlbgotCSAqIDEuIGF0IG1pZ3JhdGlvbiBmYWlsdXJlLiAobmV3cGFnZS0+bWFwcGluZyBpcyBjbGVhcmVkIGluIHRoaXMgY2FzZSkKLQkgKiAyLiB0aGUgbmV3cGFnZSB3YXMgbW92ZWQgYnV0IG5vdCByZW1hcHBlZCBhZ2FpbiBiZWNhdXNlIHRoZSB0YXNrCi0JICogICAgZXhpdHMgYW5kIHRoZSBuZXdwYWdlIGlzIG9ic29sZXRlLiBJbiB0aGlzIGNhc2UsIHRoZSBuZXcgcGFnZQotCSAqICAgIG1heSBiZSBhIHN3YXBjYWNoZS4gU28sIHdlIGp1c3QgY2FsbCBtZW1fY2dyb3VwX3VuY2hhcmdlX3BhZ2UoKQotCSAqICAgIGFsd2F5cyBmb3IgYXZvaWRpbmcgbWVzcy4gVGhlICBwYWdlX2Nncm91cCB3aWxsIGJlIHJlbW92ZWQgaWYKLQkgKiAgICB1bm5lY2Vzc2FyeS4gRmlsZSBjYWNoZSBwYWdlcyBpcyBzdGlsbCBvbiByYWRpeC10cmVlLiBEb24ndAotCSAqICAgIGNhcmUgaXQuCisJICogX19tZW1fY2dyb3VwX2NvbW1pdF9jaGFyZ2UoKSBjaGVjayBQQ0dfVVNFRCBiaXQgb2YgcGFnZV9jZ3JvdXAuCisJICogU28sIGRvdWJsZS1jb3VudGluZyBpcyBlZmZlY3RpdmVseSBhdm9pZGVkLgogCSAqLwotCWlmICghbmV3cGFnZS0+bWFwcGluZykKLQkJX19tZW1fY2dyb3VwX3VuY2hhcmdlX2NvbW1vbihuZXdwYWdlLAotCQkJCU1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfRk9SQ0UpOwotCWVsc2UgaWYgKFBhZ2VBbm9uKG5ld3BhZ2UpKQotCQltZW1fY2dyb3VwX3VuY2hhcmdlX3BhZ2UobmV3cGFnZSk7CisJX19tZW1fY2dyb3VwX2NvbW1pdF9jaGFyZ2UobWVtLCBwYywgY3R5cGUpOworCisJLyoKKwkgKiBCb3RoIG9mIG9sZHBhZ2UgYW5kIG5ld3BhZ2UgYXJlIHN0aWxsIHVuZGVyIGxvY2tfcGFnZSgpLgorCSAqIFRoZW4sIHdlIGRvbid0IGhhdmUgdG8gY2FyZSBhYm91dCByYWNlIGluIHJhZGl4LXRyZWUuCisJICogQnV0IHdlIGhhdmUgdG8gYmUgY2FyZWZ1bCB0aGF0IHRoaXMgcGFnZSBpcyB1bm1hcHBlZCBvciBub3QuCisJICoKKwkgKiBUaGVyZSBpcyBhIGNhc2UgZm9yICFwYWdlX21hcHBlZCgpLiBBdCB0aGUgc3RhcnQgb2YKKwkgKiBtaWdyYXRpb24sIG9sZHBhZ2Ugd2FzIG1hcHBlZC4gQnV0IG5vdywgaXQncyB6YXBwZWQuCisJICogQnV0IHdlIGtub3cgKnRhcmdldCogcGFnZSBpcyBub3QgZnJlZWQvcmV1c2VkIHVuZGVyIHVzLgorCSAqIG1lbV9jZ3JvdXBfdW5jaGFyZ2VfcGFnZSgpIGRvZXMgYWxsIG5lY2Vzc2FyeSBjaGVja3MuCisJICovCisJaWYgKGN0eXBlID09IE1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfTUFQUEVEKQorCQltZW1fY2dyb3VwX3VuY2hhcmdlX3BhZ2UodGFyZ2V0KTsKIH0KIAogLyoKQEAgLTc0OCwyOSArMTQ2OCwyNiBAQAogICogVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgcGFnZSByZWNsYWltaW5nIGZvciBzaG1lbSBmb3IgcmVkdWNpbmcgc2lkZQogICogZWZmZWN0IG9mIHBhZ2UgYWxsb2NhdGlvbiBmcm9tIHNobWVtLCB3aGljaCBpcyB1c2VkIGJ5IHNvbWUgbWVtX2Nncm91cC4KICAqLwotaW50IG1lbV9jZ3JvdXBfc2hyaW5rX3VzYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBnZnBfdCBnZnBfbWFzaykKK2ludCBtZW1fY2dyb3VwX3Nocmlua191c2FnZShzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCSAgICBzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCSAgICBnZnBfdCBnZnBfbWFzaykKIHsKLQlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtOworCXN0cnVjdCBtZW1fY2dyb3VwICptZW0gPSBOVUxMOwogCWludCBwcm9ncmVzcyA9IDA7CiAJaW50IHJldHJ5ID0gTUVNX0NHUk9VUF9SRUNMQUlNX1JFVFJJRVM7CiAKLQlpZiAobWVtX2Nncm91cF9zdWJzeXMuZGlzYWJsZWQpCisJaWYgKG1lbV9jZ3JvdXBfZGlzYWJsZWQoKSkKIAkJcmV0dXJuIDA7Ci0JaWYgKCFtbSkKKwlpZiAocGFnZSkKKwkJbWVtID0gdHJ5X2dldF9tZW1fY2dyb3VwX2Zyb21fc3dhcGNhY2hlKHBhZ2UpOworCWlmICghbWVtICYmIG1tKQorCQltZW0gPSB0cnlfZ2V0X21lbV9jZ3JvdXBfZnJvbV9tbShtbSk7CisJaWYgKHVubGlrZWx5KCFtZW0pKQogCQlyZXR1cm4gMDsKIAotCXJjdV9yZWFkX2xvY2soKTsKLQltZW0gPSBtZW1fY2dyb3VwX2Zyb21fdGFzayhyY3VfZGVyZWZlcmVuY2UobW0tPm93bmVyKSk7Ci0JaWYgKHVubGlrZWx5KCFtZW0pKSB7Ci0JCXJjdV9yZWFkX3VubG9jaygpOwotCQlyZXR1cm4gMDsKLQl9Ci0JY3NzX2dldCgmbWVtLT5jc3MpOwotCXJjdV9yZWFkX3VubG9jaygpOwotCiAJZG8gewotCQlwcm9ncmVzcyA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtLCBnZnBfbWFzayk7Ci0JCXByb2dyZXNzICs9IHJlc19jb3VudGVyX2NoZWNrX3VuZGVyX2xpbWl0KCZtZW0tPnJlcyk7CisJCXByb2dyZXNzID0gbWVtX2Nncm91cF9oaWVyYXJjaGljYWxfcmVjbGFpbShtZW0sIGdmcF9tYXNrLCB0cnVlKTsKKwkJcHJvZ3Jlc3MgKz0gbWVtX2Nncm91cF9jaGVja191bmRlcl9saW1pdChtZW0pOwogCX0gd2hpbGUgKCFwcm9ncmVzcyAmJiAtLXJldHJ5KTsKIAogCWNzc19wdXQoJm1lbS0+Y3NzKTsKQEAgLTc3OSwxMTYgKzE0OTYsMjk1IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBtZW1fY2dyb3VwX3Jlc2l6ZV9saW1pdChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWwpCitzdGF0aWMgREVGSU5FX01VVEVYKHNldF9saW1pdF9tdXRleCk7CisKK3N0YXRpYyBpbnQgbWVtX2Nncm91cF9yZXNpemVfbGltaXQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAorCQkJCXVuc2lnbmVkIGxvbmcgbG9uZyB2YWwpCiB7CiAKIAlpbnQgcmV0cnlfY291bnQgPSBNRU1fQ0dST1VQX1JFQ0xBSU1fUkVUUklFUzsKIAlpbnQgcHJvZ3Jlc3M7CisJdTY0IG1lbXN3bGltaXQ7CiAJaW50IHJldCA9IDA7CiAKLQl3aGlsZSAocmVzX2NvdW50ZXJfc2V0X2xpbWl0KCZtZW1jZy0+cmVzLCB2YWwpKSB7CisJd2hpbGUgKHJldHJ5X2NvdW50KSB7CiAJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewogCQkJcmV0ID0gLUVJTlRSOwogCQkJYnJlYWs7CiAJCX0KLQkJaWYgKCFyZXRyeV9jb3VudCkgewotCQkJcmV0ID0gLUVCVVNZOworCQkvKgorCQkgKiBSYXRoZXIgdGhhbiBoaWRlIGFsbCBpbiBzb21lIGZ1bmN0aW9uLCBJIGRvIHRoaXMgaW4KKwkJICogb3BlbiBjb2RlZCBtYW5uZXIuIFlvdSBzZWUgd2hhdCB0aGlzIHJlYWxseSBkb2VzLgorCQkgKiBXZSBoYXZlIHRvIGd1YXJhbnRlZSBtZW0tPnJlcy5saW1pdCA8IG1lbS0+bWVtc3cubGltaXQuCisJCSAqLworCQltdXRleF9sb2NrKCZzZXRfbGltaXRfbXV0ZXgpOworCQltZW1zd2xpbWl0ID0gcmVzX2NvdW50ZXJfcmVhZF91NjQoJm1lbWNnLT5tZW1zdywgUkVTX0xJTUlUKTsKKwkJaWYgKG1lbXN3bGltaXQgPCB2YWwpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQltdXRleF91bmxvY2soJnNldF9saW1pdF9tdXRleCk7CiAJCQlicmVhazsKIAkJfQotCQlwcm9ncmVzcyA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIEdGUF9LRVJORUwpOwotCQlpZiAoIXByb2dyZXNzKQorCQlyZXQgPSByZXNfY291bnRlcl9zZXRfbGltaXQoJm1lbWNnLT5yZXMsIHZhbCk7CisJCW11dGV4X3VubG9jaygmc2V0X2xpbWl0X211dGV4KTsKKworCQlpZiAoIXJldCkKKwkJCWJyZWFrOworCisJCXByb2dyZXNzID0gbWVtX2Nncm91cF9oaWVyYXJjaGljYWxfcmVjbGFpbShtZW1jZywgR0ZQX0tFUk5FTCwKKwkJCQkJCQkgICBmYWxzZSk7CisgIAkJaWYgKCFwcm9ncmVzcykJCQlyZXRyeV9jb3VudC0tOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK2ludCBtZW1fY2dyb3VwX3Jlc2l6ZV9tZW1zd19saW1pdChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCisJCQkJdW5zaWduZWQgbG9uZyBsb25nIHZhbCkKK3sKKwlpbnQgcmV0cnlfY291bnQgPSBNRU1fQ0dST1VQX1JFQ0xBSU1fUkVUUklFUzsKKwl1NjQgbWVtbGltaXQsIG9sZHVzYWdlLCBjdXJ1c2FnZTsKKwlpbnQgcmV0OworCisJaWYgKCFkb19zd2FwX2FjY291bnQpCisJCXJldHVybiAtRUlOVkFMOworCisJd2hpbGUgKHJldHJ5X2NvdW50KSB7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmV0ID0gLUVJTlRSOworCQkJYnJlYWs7CisJCX0KKwkJLyoKKwkJICogUmF0aGVyIHRoYW4gaGlkZSBhbGwgaW4gc29tZSBmdW5jdGlvbiwgSSBkbyB0aGlzIGluCisJCSAqIG9wZW4gY29kZWQgbWFubmVyLiBZb3Ugc2VlIHdoYXQgdGhpcyByZWFsbHkgZG9lcy4KKwkJICogV2UgaGF2ZSB0byBndWFyYW50ZWUgbWVtLT5yZXMubGltaXQgPCBtZW0tPm1lbXN3LmxpbWl0LgorCQkgKi8KKwkJbXV0ZXhfbG9jaygmc2V0X2xpbWl0X211dGV4KTsKKwkJbWVtbGltaXQgPSByZXNfY291bnRlcl9yZWFkX3U2NCgmbWVtY2ctPnJlcywgUkVTX0xJTUlUKTsKKwkJaWYgKG1lbWxpbWl0ID4gdmFsKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJbXV0ZXhfdW5sb2NrKCZzZXRfbGltaXRfbXV0ZXgpOworCQkJYnJlYWs7CisJCX0KKwkJcmV0ID0gcmVzX2NvdW50ZXJfc2V0X2xpbWl0KCZtZW1jZy0+bWVtc3csIHZhbCk7CisJCW11dGV4X3VubG9jaygmc2V0X2xpbWl0X211dGV4KTsKKworCQlpZiAoIXJldCkKKwkJCWJyZWFrOworCisJCW9sZHVzYWdlID0gcmVzX2NvdW50ZXJfcmVhZF91NjQoJm1lbWNnLT5tZW1zdywgUkVTX1VTQUdFKTsKKwkJbWVtX2Nncm91cF9oaWVyYXJjaGljYWxfcmVjbGFpbShtZW1jZywgR0ZQX0tFUk5FTCwgdHJ1ZSk7CisJCWN1cnVzYWdlID0gcmVzX2NvdW50ZXJfcmVhZF91NjQoJm1lbWNnLT5tZW1zdywgUkVTX1VTQUdFKTsKKwkJaWYgKGN1cnVzYWdlID49IG9sZHVzYWdlKQogCQkJcmV0cnlfY291bnQtLTsKIAl9CiAJcmV0dXJuIHJldDsKIH0KIAotCiAvKgogICogVGhpcyByb3V0aW5lIHRyYXZlcnNlIHBhZ2VfY2dyb3VwIGluIGdpdmVuIGxpc3QgYW5kIGRyb3AgdGhlbSBhbGwuCiAgKiAqQW5kKiB0aGlzIHJvdXRpbmUgZG9lc24ndCByZWNsYWltIHBhZ2UgaXRzZWxmLCBqdXN0IHJlbW92ZXMgcGFnZV9jZ3JvdXAuCiAgKi8KLSNkZWZpbmUgRk9SQ0VfVU5DSEFSR0VfQkFUQ0gJKDEyOCkKLXN0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfZm9yY2VfZW1wdHlfbGlzdChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLAotCQkJICAgIHN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICpteiwKLQkJCSAgICBlbnVtIGxydV9saXN0IGxydSkKK3N0YXRpYyBpbnQgbWVtX2Nncm91cF9mb3JjZV9lbXB0eV9saXN0KHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCisJCQkJaW50IG5vZGUsIGludCB6aWQsIGVudW0gbHJ1X2xpc3QgbHJ1KQogewotCXN0cnVjdCBwYWdlX2Nncm91cCAqcGM7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JaW50IGNvdW50ID0gRk9SQ0VfVU5DSEFSR0VfQkFUQ0g7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgem9uZSAqem9uZTsKKwlzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqbXo7CisJc3RydWN0IHBhZ2VfY2dyb3VwICpwYywgKmJ1c3k7CisJdW5zaWduZWQgbG9uZyBmbGFncywgbG9vcDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCWludCByZXQgPSAwOwogCisJem9uZSA9ICZOT0RFX0RBVEEobm9kZSktPm5vZGVfem9uZXNbemlkXTsKKwlteiA9IG1lbV9jZ3JvdXBfem9uZWluZm8obWVtLCBub2RlLCB6aWQpOwogCWxpc3QgPSAmbXotPmxpc3RzW2xydV07CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXotPmxydV9sb2NrLCBmbGFncyk7Ci0Jd2hpbGUgKCFsaXN0X2VtcHR5KGxpc3QpKSB7Ci0JCXBjID0gbGlzdF9lbnRyeShsaXN0LT5wcmV2LCBzdHJ1Y3QgcGFnZV9jZ3JvdXAsIGxydSk7Ci0JCXBhZ2UgPSBwYy0+cGFnZTsKLQkJaWYgKCFQYWdlQ2dyb3VwVXNlZChwYykpCi0JCQlicmVhazsKLQkJZ2V0X3BhZ2UocGFnZSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm16LT5scnVfbG9jaywgZmxhZ3MpOwotCQkvKgotCQkgKiBDaGVjayBpZiB0aGlzIHBhZ2UgaXMgb24gTFJVLiAhTFJVIHBhZ2UgY2FuIGJlIGZvdW5kCi0JCSAqIGlmIGl0J3MgdW5kZXIgcGFnZSBtaWdyYXRpb24uCi0JCSAqLwotCQlpZiAoUGFnZUxSVShwYWdlKSkgewotCQkJX19tZW1fY2dyb3VwX3VuY2hhcmdlX2NvbW1vbihwYWdlLAotCQkJCQlNRU1fQ0dST1VQX0NIQVJHRV9UWVBFX0ZPUkNFKTsKLQkJCXB1dF9wYWdlKHBhZ2UpOwotCQkJaWYgKC0tY291bnQgPD0gMCkgewotCQkJCWNvdW50ID0gRk9SQ0VfVU5DSEFSR0VfQkFUQ0g7Ci0JCQkJY29uZF9yZXNjaGVkKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmbXotPmxydV9sb2NrLCBmbGFncyk7CisJbG9vcCA9IE1FTV9DR1JPVVBfWlNUQVQobXosIGxydSk7CisJLyogZ2l2ZSBzb21lIG1hcmdpbiBhZ2FpbnN0IEVCVVNZIGV0Yy4uLiovCisJbG9vcCArPSAyNTY7CisJYnVzeSA9IE5VTEw7CisJd2hpbGUgKGxvb3AtLSkgeworCQlyZXQgPSAwOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmem9uZS0+bHJ1X2xvY2ssIGZsYWdzKTsKKwkJaWYgKGxpc3RfZW1wdHkobGlzdCkpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnpvbmUtPmxydV9sb2NrLCBmbGFncyk7CiAJCQlicmVhazsKIAkJfQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmbXotPmxydV9sb2NrLCBmbGFncyk7CisJCXBjID0gbGlzdF9lbnRyeShsaXN0LT5wcmV2LCBzdHJ1Y3QgcGFnZV9jZ3JvdXAsIGxydSk7CisJCWlmIChidXN5ID09IHBjKSB7CisJCQlsaXN0X21vdmUoJnBjLT5scnUsIGxpc3QpOworCQkJYnVzeSA9IDA7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ6b25lLT5scnVfbG9jaywgZmxhZ3MpOworCQkJY29udGludWU7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmem9uZS0+bHJ1X2xvY2ssIGZsYWdzKTsKKworCQlyZXQgPSBtZW1fY2dyb3VwX21vdmVfcGFyZW50KHBjLCBtZW0sIEdGUF9LRVJORUwpOworCQlpZiAocmV0ID09IC1FTk9NRU0pCisJCQlicmVhazsKKworCQlpZiAocmV0ID09IC1FQlVTWSB8fCByZXQgPT0gLUVJTlZBTCkgeworCQkJLyogZm91bmQgbG9jayBjb250ZW50aW9uIG9yICJwYyIgaXMgb2Jzb2xldGUuICovCisJCQlidXN5ID0gcGM7CisJCQljb25kX3Jlc2NoZWQoKTsKKwkJfSBlbHNlCisJCQlidXN5ID0gTlVMTDsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXotPmxydV9sb2NrLCBmbGFncyk7CisKKwlpZiAoIXJldCAmJiAhbGlzdF9lbXB0eShsaXN0KSkKKwkJcmV0dXJuIC1FQlVTWTsKKwlyZXR1cm4gcmV0OwogfQogCiAvKgogICogbWFrZSBtZW1fY2dyb3VwJ3MgY2hhcmdlIHRvIGJlIDAgaWYgdGhlcmUgaXMgbm8gdGFzay4KICAqIFRoaXMgZW5hYmxlcyBkZWxldGluZyB0aGlzIG1lbV9jZ3JvdXAuCiAgKi8KLXN0YXRpYyBpbnQgbWVtX2Nncm91cF9mb3JjZV9lbXB0eShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKQorc3RhdGljIGludCBtZW1fY2dyb3VwX2ZvcmNlX2VtcHR5KHN0cnVjdCBtZW1fY2dyb3VwICptZW0sIGJvb2wgZnJlZV9hbGwpCiB7Ci0JaW50IHJldCA9IC1FQlVTWTsKLQlpbnQgbm9kZSwgemlkOworCWludCByZXQ7CisJaW50IG5vZGUsIHppZCwgc2hyaW5rOworCWludCBucl9yZXRyaWVzID0gTUVNX0NHUk9VUF9SRUNMQUlNX1JFVFJJRVM7CisJc3RydWN0IGNncm91cCAqY2dycCA9IG1lbS0+Y3NzLmNncm91cDsKIAogCWNzc19nZXQoJm1lbS0+Y3NzKTsKLQkvKgotCSAqIHBhZ2UgcmVjbGFpbSBjb2RlIChrc3dhcGQgZXRjLi4pIHdpbGwgbW92ZSBwYWdlcyBiZXR3ZWVuCi0JICogYWN0aXZlX2xpc3QgPC0+IGluYWN0aXZlX2xpc3Qgd2hpbGUgd2UgZG9uJ3QgdGFrZSBhIGxvY2suCi0JICogU28sIHdlIGhhdmUgdG8gZG8gbG9vcCBoZXJlIHVudGlsIGFsbCBsaXN0cyBhcmUgZW1wdHkuCi0JICovCisKKwlzaHJpbmsgPSAwOworCS8qIHNob3VsZCBmcmVlIGFsbCA/ICovCisJaWYgKGZyZWVfYWxsKQorCQlnb3RvIHRyeV90b19mcmVlOworbW92ZV9hY2NvdW50OgogCXdoaWxlIChtZW0tPnJlcy51c2FnZSA+IDApIHsKLQkJaWYgKGF0b21pY19yZWFkKCZtZW0tPmNzcy5jZ3JvdXAtPmNvdW50KSA+IDApCisJCXJldCA9IC1FQlVTWTsKKwkJaWYgKGNncm91cF90YXNrX2NvdW50KGNncnApIHx8ICFsaXN0X2VtcHR5KCZjZ3JwLT5jaGlsZHJlbikpCisJCQlnb3RvIG91dDsKKwkJcmV0ID0gLUVJTlRSOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCiAJCQlnb3RvIG91dDsKIAkJLyogVGhpcyBpcyBmb3IgbWFraW5nIGFsbCAqdXNlZCogcGFnZXMgdG8gYmUgb24gTFJVLiAqLwogCQlscnVfYWRkX2RyYWluX2FsbCgpOwotCQlmb3JfZWFjaF9ub2RlX3N0YXRlKG5vZGUsIE5fUE9TU0lCTEUpCi0JCQlmb3IgKHppZCA9IDA7IHppZCA8IE1BWF9OUl9aT05FUzsgemlkKyspIHsKLQkJCQlzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqbXo7CisJCXJldCA9IDA7CisJCWZvcl9lYWNoX25vZGVfc3RhdGUobm9kZSwgTl9QT1NTSUJMRSkgeworCQkJZm9yICh6aWQgPSAwOyAhcmV0ICYmIHppZCA8IE1BWF9OUl9aT05FUzsgemlkKyspIHsKIAkJCQllbnVtIGxydV9saXN0IGw7Ci0JCQkJbXogPSBtZW1fY2dyb3VwX3pvbmVpbmZvKG1lbSwgbm9kZSwgemlkKTsKLQkJCQlmb3JfZWFjaF9scnUobCkKLQkJCQkJbWVtX2Nncm91cF9mb3JjZV9lbXB0eV9saXN0KG1lbSwgbXosIGwpOworCQkJCWZvcl9lYWNoX2xydShsKSB7CisJCQkJCXJldCA9IG1lbV9jZ3JvdXBfZm9yY2VfZW1wdHlfbGlzdChtZW0sCisJCQkJCQkJbm9kZSwgemlkLCBsKTsKKwkJCQkJaWYgKHJldCkKKwkJCQkJCWJyZWFrOworCQkJCX0KIAkJCX0KKwkJCWlmIChyZXQpCisJCQkJYnJlYWs7CisJCX0KKwkJLyogaXQgc2VlbXMgcGFyZW50IGNncm91cCBkb2Vzbid0IGhhdmUgZW5vdWdoIG1lbSAqLworCQlpZiAocmV0ID09IC1FTk9NRU0pCisJCQlnb3RvIHRyeV90b19mcmVlOwogCQljb25kX3Jlc2NoZWQoKTsKIAl9CiAJcmV0ID0gMDsKIG91dDoKIAljc3NfcHV0KCZtZW0tPmNzcyk7CiAJcmV0dXJuIHJldDsKKwordHJ5X3RvX2ZyZWU6CisJLyogcmV0dXJucyBFQlVTWSBpZiB0aGVyZSBpcyBhIHRhc2sgb3IgaWYgd2UgY29tZSBoZXJlIHR3aWNlLiAqLworCWlmIChjZ3JvdXBfdGFza19jb3VudChjZ3JwKSB8fCAhbGlzdF9lbXB0eSgmY2dycC0+Y2hpbGRyZW4pIHx8IHNocmluaykgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKwkvKiB3ZSBjYWxsIHRyeS10by1mcmVlIHBhZ2VzIGZvciBtYWtlIHRoaXMgY2dyb3VwIGVtcHR5ICovCisJbHJ1X2FkZF9kcmFpbl9hbGwoKTsKKwkvKiB0cnkgdG8gZnJlZSBhbGwgcGFnZXMgaW4gdGhpcyBjZ3JvdXAgKi8KKwlzaHJpbmsgPSAxOworCXdoaWxlIChucl9yZXRyaWVzICYmIG1lbS0+cmVzLnVzYWdlID4gMCkgeworCQlpbnQgcHJvZ3Jlc3M7CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyZXQgPSAtRUlOVFI7CisJCQlnb3RvIG91dDsKKwkJfQorCQlwcm9ncmVzcyA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtLCBHRlBfS0VSTkVMLAorCQkJCQkJZmFsc2UsIGdldF9zd2FwcGluZXNzKG1lbSkpOworCQlpZiAoIXByb2dyZXNzKSB7CisJCQlucl9yZXRyaWVzLS07CisJCQkvKiBtYXliZSBzb21lIHdyaXRlYmFjayBpcyBuZWNlc3NhcnkgKi8KKwkJCWNvbmdlc3Rpb25fd2FpdChXUklURSwgSFovMTApOworCQl9CisKKwl9CisJbHJ1X2FkZF9kcmFpbigpOworCS8qIHRyeSBtb3ZlX2FjY291bnQuLi50aGVyZSBtYXkgYmUgc29tZSAqbG9ja2VkKiBwYWdlcy4gKi8KKwlpZiAobWVtLT5yZXMudXNhZ2UpCisJCWdvdG8gbW92ZV9hY2NvdW50OworCXJldCA9IDA7CisJZ290byBvdXQ7Cit9CisKK2ludCBtZW1fY2dyb3VwX2ZvcmNlX2VtcHR5X3dyaXRlKHN0cnVjdCBjZ3JvdXAgKmNvbnQsIHVuc2lnbmVkIGludCBldmVudCkKK3sKKwlyZXR1cm4gbWVtX2Nncm91cF9mb3JjZV9lbXB0eShtZW1fY2dyb3VwX2Zyb21fY29udChjb250KSwgdHJ1ZSk7Cit9CisKKworc3RhdGljIHU2NCBtZW1fY2dyb3VwX2hpZXJhcmNoeV9yZWFkKHN0cnVjdCBjZ3JvdXAgKmNvbnQsIHN0cnVjdCBjZnR5cGUgKmNmdCkKK3sKKwlyZXR1cm4gbWVtX2Nncm91cF9mcm9tX2NvbnQoY29udCktPnVzZV9oaWVyYXJjaHk7Cit9CisKK3N0YXRpYyBpbnQgbWVtX2Nncm91cF9oaWVyYXJjaHlfd3JpdGUoc3RydWN0IGNncm91cCAqY29udCwgc3RydWN0IGNmdHlwZSAqY2Z0LAorCQkJCQl1NjQgdmFsKQoreworCWludCByZXR2YWwgPSAwOworCXN0cnVjdCBtZW1fY2dyb3VwICptZW0gPSBtZW1fY2dyb3VwX2Zyb21fY29udChjb250KTsKKwlzdHJ1Y3QgY2dyb3VwICpwYXJlbnQgPSBjb250LT5wYXJlbnQ7CisJc3RydWN0IG1lbV9jZ3JvdXAgKnBhcmVudF9tZW0gPSBOVUxMOworCisJaWYgKHBhcmVudCkKKwkJcGFyZW50X21lbSA9IG1lbV9jZ3JvdXBfZnJvbV9jb250KHBhcmVudCk7CisKKwljZ3JvdXBfbG9jaygpOworCS8qCisJICogSWYgcGFyZW50J3MgdXNlX2hpZWFyY2h5IGlzIHNldCwgd2UgY2FuJ3QgbWFrZSBhbnkgbW9kaWZpY2F0aW9ucworCSAqIGluIHRoZSBjaGlsZCBzdWJ0cmVlcy4gSWYgaXQgaXMgdW5zZXQsIHRoZW4gdGhlIGNoYW5nZSBjYW4KKwkgKiBvY2N1ciwgcHJvdmlkZWQgdGhlIGN1cnJlbnQgY2dyb3VwIGhhcyBubyBjaGlsZHJlbi4KKwkgKgorCSAqIEZvciB0aGUgcm9vdCBjZ3JvdXAsIHBhcmVudF9tZW0gaXMgTlVMTCwgd2UgYWxsb3cgdmFsdWUgdG8gYmUKKwkgKiBzZXQgaWYgdGhlcmUgYXJlIG5vIGNoaWxkcmVuLgorCSAqLworCWlmICgoIXBhcmVudF9tZW0gfHwgIXBhcmVudF9tZW0tPnVzZV9oaWVyYXJjaHkpICYmCisJCQkJKHZhbCA9PSAxIHx8IHZhbCA9PSAwKSkgeworCQlpZiAobGlzdF9lbXB0eSgmY29udC0+Y2hpbGRyZW4pKQorCQkJbWVtLT51c2VfaGllcmFyY2h5ID0gdmFsOworCQllbHNlCisJCQlyZXR2YWwgPSAtRUJVU1k7CisJfSBlbHNlCisJCXJldHZhbCA9IC1FSU5WQUw7CisJY2dyb3VwX3VubG9jaygpOworCisJcmV0dXJuIHJldHZhbDsKIH0KIAogc3RhdGljIHU2NCBtZW1fY2dyb3VwX3JlYWQoc3RydWN0IGNncm91cCAqY29udCwgc3RydWN0IGNmdHlwZSAqY2Z0KQogewotCXJldHVybiByZXNfY291bnRlcl9yZWFkX3U2NCgmbWVtX2Nncm91cF9mcm9tX2NvbnQoY29udCktPnJlcywKLQkJCQkgICAgY2Z0LT5wcml2YXRlKTsKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtID0gbWVtX2Nncm91cF9mcm9tX2NvbnQoY29udCk7CisJdTY0IHZhbCA9IDA7CisJaW50IHR5cGUsIG5hbWU7CisKKwl0eXBlID0gTUVNRklMRV9UWVBFKGNmdC0+cHJpdmF0ZSk7CisJbmFtZSA9IE1FTUZJTEVfQVRUUihjZnQtPnByaXZhdGUpOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgX01FTToKKwkJdmFsID0gcmVzX2NvdW50ZXJfcmVhZF91NjQoJm1lbS0+cmVzLCBuYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBfTUVNU1dBUDoKKwkJaWYgKGRvX3N3YXBfYWNjb3VudCkKKwkJCXZhbCA9IHJlc19jb3VudGVyX3JlYWRfdTY0KCZtZW0tPm1lbXN3LCBuYW1lKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gdmFsOwogfQogLyoKICAqIFRoZSB1c2VyIG9mIHRoaXMgZnVuY3Rpb24gaXMuLi4KQEAgLTg5OCwxNSArMTc5NCwyMiBAQAogCQkJICAgIGNvbnN0IGNoYXIgKmJ1ZmZlcikKIHsKIAlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cgPSBtZW1fY2dyb3VwX2Zyb21fY29udChjb250KTsKKwlpbnQgdHlwZSwgbmFtZTsKIAl1bnNpZ25lZCBsb25nIGxvbmcgdmFsOwogCWludCByZXQ7CiAKLQlzd2l0Y2ggKGNmdC0+cHJpdmF0ZSkgeworCXR5cGUgPSBNRU1GSUxFX1RZUEUoY2Z0LT5wcml2YXRlKTsKKwluYW1lID0gTUVNRklMRV9BVFRSKGNmdC0+cHJpdmF0ZSk7CisJc3dpdGNoIChuYW1lKSB7CiAJY2FzZSBSRVNfTElNSVQ6CiAJCS8qIFRoaXMgZnVuY3Rpb24gZG9lcyBhbGwgbmVjZXNzYXJ5IHBhcnNlLi4ucmV1c2UgaXQgKi8KIAkJcmV0ID0gcmVzX2NvdW50ZXJfbWVtcGFyc2Vfd3JpdGVfc3RyYXRlZ3koYnVmZmVyLCAmdmFsKTsKLQkJaWYgKCFyZXQpCisJCWlmIChyZXQpCisJCQlicmVhazsKKwkJaWYgKHR5cGUgPT0gX01FTSkKIAkJCXJldCA9IG1lbV9jZ3JvdXBfcmVzaXplX2xpbWl0KG1lbWNnLCB2YWwpOworCQllbHNlCisJCQlyZXQgPSBtZW1fY2dyb3VwX3Jlc2l6ZV9tZW1zd19saW1pdChtZW1jZywgdmFsKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0ID0gLUVJTlZBTDsgLyogc2hvdWxkIGJlIEJVRygpID8gKi8KQEAgLTkxNSwyNyArMTgxOCw1OSBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyB2b2lkIG1lbWNnX2dldF9oaWVyYXJjaGljYWxfbGltaXQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAorCQl1bnNpZ25lZCBsb25nIGxvbmcgKm1lbV9saW1pdCwgdW5zaWduZWQgbG9uZyBsb25nICptZW1zd19saW1pdCkKK3sKKwlzdHJ1Y3QgY2dyb3VwICpjZ3JvdXA7CisJdW5zaWduZWQgbG9uZyBsb25nIG1pbl9saW1pdCwgbWluX21lbXN3X2xpbWl0LCB0bXA7CisKKwltaW5fbGltaXQgPSByZXNfY291bnRlcl9yZWFkX3U2NCgmbWVtY2ctPnJlcywgUkVTX0xJTUlUKTsKKwltaW5fbWVtc3dfbGltaXQgPSByZXNfY291bnRlcl9yZWFkX3U2NCgmbWVtY2ctPm1lbXN3LCBSRVNfTElNSVQpOworCWNncm91cCA9IG1lbWNnLT5jc3MuY2dyb3VwOworCWlmICghbWVtY2ctPnVzZV9oaWVyYXJjaHkpCisJCWdvdG8gb3V0OworCisJd2hpbGUgKGNncm91cC0+cGFyZW50KSB7CisJCWNncm91cCA9IGNncm91cC0+cGFyZW50OworCQltZW1jZyA9IG1lbV9jZ3JvdXBfZnJvbV9jb250KGNncm91cCk7CisJCWlmICghbWVtY2ctPnVzZV9oaWVyYXJjaHkpCisJCQlicmVhazsKKwkJdG1wID0gcmVzX2NvdW50ZXJfcmVhZF91NjQoJm1lbWNnLT5yZXMsIFJFU19MSU1JVCk7CisJCW1pbl9saW1pdCA9IG1pbihtaW5fbGltaXQsIHRtcCk7CisJCXRtcCA9IHJlc19jb3VudGVyX3JlYWRfdTY0KCZtZW1jZy0+bWVtc3csIFJFU19MSU1JVCk7CisJCW1pbl9tZW1zd19saW1pdCA9IG1pbihtaW5fbWVtc3dfbGltaXQsIHRtcCk7CisJfQorb3V0OgorCSptZW1fbGltaXQgPSBtaW5fbGltaXQ7CisJKm1lbXN3X2xpbWl0ID0gbWluX21lbXN3X2xpbWl0OworCXJldHVybjsKK30KKwogc3RhdGljIGludCBtZW1fY2dyb3VwX3Jlc2V0KHN0cnVjdCBjZ3JvdXAgKmNvbnQsIHVuc2lnbmVkIGludCBldmVudCkKIHsKIAlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtOworCWludCB0eXBlLCBuYW1lOwogCiAJbWVtID0gbWVtX2Nncm91cF9mcm9tX2NvbnQoY29udCk7Ci0Jc3dpdGNoIChldmVudCkgeworCXR5cGUgPSBNRU1GSUxFX1RZUEUoZXZlbnQpOworCW5hbWUgPSBNRU1GSUxFX0FUVFIoZXZlbnQpOworCXN3aXRjaCAobmFtZSkgewogCWNhc2UgUkVTX01BWF9VU0FHRToKLQkJcmVzX2NvdW50ZXJfcmVzZXRfbWF4KCZtZW0tPnJlcyk7CisJCWlmICh0eXBlID09IF9NRU0pCisJCQlyZXNfY291bnRlcl9yZXNldF9tYXgoJm1lbS0+cmVzKTsKKwkJZWxzZQorCQkJcmVzX2NvdW50ZXJfcmVzZXRfbWF4KCZtZW0tPm1lbXN3KTsKIAkJYnJlYWs7CiAJY2FzZSBSRVNfRkFJTENOVDoKLQkJcmVzX2NvdW50ZXJfcmVzZXRfZmFpbGNudCgmbWVtLT5yZXMpOworCQlpZiAodHlwZSA9PSBfTUVNKQorCQkJcmVzX2NvdW50ZXJfcmVzZXRfZmFpbGNudCgmbWVtLT5yZXMpOworCQllbHNlCisJCQlyZXNfY291bnRlcl9yZXNldF9mYWlsY250KCZtZW0tPm1lbXN3KTsKIAkJYnJlYWs7CiAJfQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1lbV9mb3JjZV9lbXB0eV93cml0ZShzdHJ1Y3QgY2dyb3VwICpjb250LCB1bnNpZ25lZCBpbnQgZXZlbnQpCi17Ci0JcmV0dXJuIG1lbV9jZ3JvdXBfZm9yY2VfZW1wdHkobWVtX2Nncm91cF9mcm9tX2NvbnQoY29udCkpOwotfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IG1lbV9jZ3JvdXBfc3RhdF9kZXNjIHsKIAljb25zdCBjaGFyICptc2c7CiAJdTY0IHVuaXQ7CkBAIC05ODQsNDMgKzE5MTksMTYzIEBACiAJCWNiLT5maWxsKGNiLCAidW5ldmljdGFibGUiLCB1bmV2aWN0YWJsZSAqIFBBR0VfU0laRSk7CiAKIAl9CisJeworCQl1bnNpZ25lZCBsb25nIGxvbmcgbGltaXQsIG1lbXN3X2xpbWl0OworCQltZW1jZ19nZXRfaGllcmFyY2hpY2FsX2xpbWl0KG1lbV9jb250LCAmbGltaXQsICZtZW1zd19saW1pdCk7CisJCWNiLT5maWxsKGNiLCAiaGllcmFyY2hpY2FsX21lbW9yeV9saW1pdCIsIGxpbWl0KTsKKwkJaWYgKGRvX3N3YXBfYWNjb3VudCkKKwkJCWNiLT5maWxsKGNiLCAiaGllcmFyY2hpY2FsX21lbXN3X2xpbWl0IiwgbWVtc3dfbGltaXQpOworCX0KKworI2lmZGVmIENPTkZJR19ERUJVR19WTQorCWNiLT5maWxsKGNiLCAiaW5hY3RpdmVfcmF0aW8iLCBjYWxjX2luYWN0aXZlX3JhdGlvKG1lbV9jb250LCBOVUxMKSk7CisKKwl7CisJCWludCBuaWQsIHppZDsKKwkJc3RydWN0IG1lbV9jZ3JvdXBfcGVyX3pvbmUgKm16OworCQl1bnNpZ25lZCBsb25nIHJlY2VudF9yb3RhdGVkWzJdID0gezAsIDB9OworCQl1bnNpZ25lZCBsb25nIHJlY2VudF9zY2FubmVkWzJdID0gezAsIDB9OworCisJCWZvcl9lYWNoX29ubGluZV9ub2RlKG5pZCkKKwkJCWZvciAoemlkID0gMDsgemlkIDwgTUFYX05SX1pPTkVTOyB6aWQrKykgeworCQkJCW16ID0gbWVtX2Nncm91cF96b25laW5mbyhtZW1fY29udCwgbmlkLCB6aWQpOworCisJCQkJcmVjZW50X3JvdGF0ZWRbMF0gKz0KKwkJCQkJbXotPnJlY2xhaW1fc3RhdC5yZWNlbnRfcm90YXRlZFswXTsKKwkJCQlyZWNlbnRfcm90YXRlZFsxXSArPQorCQkJCQltei0+cmVjbGFpbV9zdGF0LnJlY2VudF9yb3RhdGVkWzFdOworCQkJCXJlY2VudF9zY2FubmVkWzBdICs9CisJCQkJCW16LT5yZWNsYWltX3N0YXQucmVjZW50X3NjYW5uZWRbMF07CisJCQkJcmVjZW50X3NjYW5uZWRbMV0gKz0KKwkJCQkJbXotPnJlY2xhaW1fc3RhdC5yZWNlbnRfc2Nhbm5lZFsxXTsKKwkJCX0KKwkJY2ItPmZpbGwoY2IsICJyZWNlbnRfcm90YXRlZF9hbm9uIiwgcmVjZW50X3JvdGF0ZWRbMF0pOworCQljYi0+ZmlsbChjYiwgInJlY2VudF9yb3RhdGVkX2ZpbGUiLCByZWNlbnRfcm90YXRlZFsxXSk7CisJCWNiLT5maWxsKGNiLCAicmVjZW50X3NjYW5uZWRfYW5vbiIsIHJlY2VudF9zY2FubmVkWzBdKTsKKwkJY2ItPmZpbGwoY2IsICJyZWNlbnRfc2Nhbm5lZF9maWxlIiwgcmVjZW50X3NjYW5uZWRbMV0pOworCX0KKyNlbmRpZgorCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB1NjQgbWVtX2Nncm91cF9zd2FwcGluZXNzX3JlYWQoc3RydWN0IGNncm91cCAqY2dycCwgc3RydWN0IGNmdHlwZSAqY2Z0KQoreworCXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IG1lbV9jZ3JvdXBfZnJvbV9jb250KGNncnApOworCisJcmV0dXJuIGdldF9zd2FwcGluZXNzKG1lbWNnKTsKK30KKworc3RhdGljIGludCBtZW1fY2dyb3VwX3N3YXBwaW5lc3Nfd3JpdGUoc3RydWN0IGNncm91cCAqY2dycCwgc3RydWN0IGNmdHlwZSAqY2Z0LAorCQkJCSAgICAgICB1NjQgdmFsKQoreworCXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IG1lbV9jZ3JvdXBfZnJvbV9jb250KGNncnApOworCXN0cnVjdCBtZW1fY2dyb3VwICpwYXJlbnQ7CisJaWYgKHZhbCA+IDEwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY2dycC0+cGFyZW50ID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJcGFyZW50ID0gbWVtX2Nncm91cF9mcm9tX2NvbnQoY2dycC0+cGFyZW50KTsKKwkvKiBJZiB1bmRlciBoaWVyYXJjaHksIG9ubHkgZW1wdHktcm9vdCBjYW4gc2V0IHRoaXMgdmFsdWUgKi8KKwlpZiAoKHBhcmVudC0+dXNlX2hpZXJhcmNoeSkgfHwKKwkgICAgKG1lbWNnLT51c2VfaGllcmFyY2h5ICYmICFsaXN0X2VtcHR5KCZjZ3JwLT5jaGlsZHJlbikpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9jaygmbWVtY2ctPnJlY2xhaW1fcGFyYW1fbG9jayk7CisJbWVtY2ctPnN3YXBwaW5lc3MgPSB2YWw7CisJc3Bpbl91bmxvY2soJm1lbWNnLT5yZWNsYWltX3BhcmFtX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKKwogc3RhdGljIHN0cnVjdCBjZnR5cGUgbWVtX2Nncm91cF9maWxlc1tdID0gewogCXsKIAkJLm5hbWUgPSAidXNhZ2VfaW5fYnl0ZXMiLAotCQkucHJpdmF0ZSA9IFJFU19VU0FHRSwKKwkJLnByaXZhdGUgPSBNRU1GSUxFX1BSSVZBVEUoX01FTSwgUkVTX1VTQUdFKSwKIAkJLnJlYWRfdTY0ID0gbWVtX2Nncm91cF9yZWFkLAogCX0sCiAJewogCQkubmFtZSA9ICJtYXhfdXNhZ2VfaW5fYnl0ZXMiLAotCQkucHJpdmF0ZSA9IFJFU19NQVhfVVNBR0UsCisJCS5wcml2YXRlID0gTUVNRklMRV9QUklWQVRFKF9NRU0sIFJFU19NQVhfVVNBR0UpLAogCQkudHJpZ2dlciA9IG1lbV9jZ3JvdXBfcmVzZXQsCiAJCS5yZWFkX3U2NCA9IG1lbV9jZ3JvdXBfcmVhZCwKIAl9LAogCXsKIAkJLm5hbWUgPSAibGltaXRfaW5fYnl0ZXMiLAotCQkucHJpdmF0ZSA9IFJFU19MSU1JVCwKKwkJLnByaXZhdGUgPSBNRU1GSUxFX1BSSVZBVEUoX01FTSwgUkVTX0xJTUlUKSwKIAkJLndyaXRlX3N0cmluZyA9IG1lbV9jZ3JvdXBfd3JpdGUsCiAJCS5yZWFkX3U2NCA9IG1lbV9jZ3JvdXBfcmVhZCwKIAl9LAogCXsKIAkJLm5hbWUgPSAiZmFpbGNudCIsCi0JCS5wcml2YXRlID0gUkVTX0ZBSUxDTlQsCisJCS5wcml2YXRlID0gTUVNRklMRV9QUklWQVRFKF9NRU0sIFJFU19GQUlMQ05UKSwKIAkJLnRyaWdnZXIgPSBtZW1fY2dyb3VwX3Jlc2V0LAogCQkucmVhZF91NjQgPSBtZW1fY2dyb3VwX3JlYWQsCiAJfSwKIAl7Ci0JCS5uYW1lID0gImZvcmNlX2VtcHR5IiwKLQkJLnRyaWdnZXIgPSBtZW1fZm9yY2VfZW1wdHlfd3JpdGUsCi0JfSwKLQl7CiAJCS5uYW1lID0gInN0YXQiLAogCQkucmVhZF9tYXAgPSBtZW1fY29udHJvbF9zdGF0X3Nob3csCiAJfSwKKwl7CisJCS5uYW1lID0gImZvcmNlX2VtcHR5IiwKKwkJLnRyaWdnZXIgPSBtZW1fY2dyb3VwX2ZvcmNlX2VtcHR5X3dyaXRlLAorCX0sCisJeworCQkubmFtZSA9ICJ1c2VfaGllcmFyY2h5IiwKKwkJLndyaXRlX3U2NCA9IG1lbV9jZ3JvdXBfaGllcmFyY2h5X3dyaXRlLAorCQkucmVhZF91NjQgPSBtZW1fY2dyb3VwX2hpZXJhcmNoeV9yZWFkLAorCX0sCisJeworCQkubmFtZSA9ICJzd2FwcGluZXNzIiwKKwkJLnJlYWRfdTY0ID0gbWVtX2Nncm91cF9zd2FwcGluZXNzX3JlYWQsCisJCS53cml0ZV91NjQgPSBtZW1fY2dyb3VwX3N3YXBwaW5lc3Nfd3JpdGUsCisJfSwKIH07CiAKKyNpZmRlZiBDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUl9TV0FQCitzdGF0aWMgc3RydWN0IGNmdHlwZSBtZW1zd19jZ3JvdXBfZmlsZXNbXSA9IHsKKwl7CisJCS5uYW1lID0gIm1lbXN3LnVzYWdlX2luX2J5dGVzIiwKKwkJLnByaXZhdGUgPSBNRU1GSUxFX1BSSVZBVEUoX01FTVNXQVAsIFJFU19VU0FHRSksCisJCS5yZWFkX3U2NCA9IG1lbV9jZ3JvdXBfcmVhZCwKKwl9LAorCXsKKwkJLm5hbWUgPSAibWVtc3cubWF4X3VzYWdlX2luX2J5dGVzIiwKKwkJLnByaXZhdGUgPSBNRU1GSUxFX1BSSVZBVEUoX01FTVNXQVAsIFJFU19NQVhfVVNBR0UpLAorCQkudHJpZ2dlciA9IG1lbV9jZ3JvdXBfcmVzZXQsCisJCS5yZWFkX3U2NCA9IG1lbV9jZ3JvdXBfcmVhZCwKKwl9LAorCXsKKwkJLm5hbWUgPSAibWVtc3cubGltaXRfaW5fYnl0ZXMiLAorCQkucHJpdmF0ZSA9IE1FTUZJTEVfUFJJVkFURShfTUVNU1dBUCwgUkVTX0xJTUlUKSwKKwkJLndyaXRlX3N0cmluZyA9IG1lbV9jZ3JvdXBfd3JpdGUsCisJCS5yZWFkX3U2NCA9IG1lbV9jZ3JvdXBfcmVhZCwKKwl9LAorCXsKKwkJLm5hbWUgPSAibWVtc3cuZmFpbGNudCIsCisJCS5wcml2YXRlID0gTUVNRklMRV9QUklWQVRFKF9NRU1TV0FQLCBSRVNfRkFJTENOVCksCisJCS50cmlnZ2VyID0gbWVtX2Nncm91cF9yZXNldCwKKwkJLnJlYWRfdTY0ID0gbWVtX2Nncm91cF9yZWFkLAorCX0sCit9OworCitzdGF0aWMgaW50IHJlZ2lzdGVyX21lbXN3X2ZpbGVzKHN0cnVjdCBjZ3JvdXAgKmNvbnQsIHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcykKK3sKKwlpZiAoIWRvX3N3YXBfYWNjb3VudCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGNncm91cF9hZGRfZmlsZXMoY29udCwgc3MsIG1lbXN3X2Nncm91cF9maWxlcywKKwkJCQlBUlJBWV9TSVpFKG1lbXN3X2Nncm91cF9maWxlcykpOworfTsKKyNlbHNlCitzdGF0aWMgaW50IHJlZ2lzdGVyX21lbXN3X2ZpbGVzKHN0cnVjdCBjZ3JvdXAgKmNvbnQsIHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcykKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCiBzdGF0aWMgaW50IGFsbG9jX21lbV9jZ3JvdXBfcGVyX3pvbmVfaW5mbyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLCBpbnQgbm9kZSkKIHsKIAlzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfbm9kZSAqcG47CkBAIC0xMDQ2LDcgKzIxMDEsNiBAQAogCiAJZm9yICh6b25lID0gMDsgem9uZSA8IE1BWF9OUl9aT05FUzsgem9uZSsrKSB7CiAJCW16ID0gJnBuLT56b25laW5mb1t6b25lXTsKLQkJc3Bpbl9sb2NrX2luaXQoJm16LT5scnVfbG9jayk7CiAJCWZvcl9lYWNoX2xydShsKQogCQkJSU5JVF9MSVNUX0hFQUQoJm16LT5saXN0c1tsXSk7CiAJfQpAQCAtMTA1OCw1NSArMjExMiwxMTMgQEAKIAlrZnJlZShtZW0tPmluZm8ubm9kZWluZm9bbm9kZV0pOwogfQogCitzdGF0aWMgaW50IG1lbV9jZ3JvdXBfc2l6ZSh2b2lkKQoreworCWludCBjcHVzdGF0X3NpemUgPSBucl9jcHVfaWRzICogc2l6ZW9mKHN0cnVjdCBtZW1fY2dyb3VwX3N0YXRfY3B1KTsKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBtZW1fY2dyb3VwKSArIGNwdXN0YXRfc2l6ZTsKK30KKwogc3RhdGljIHN0cnVjdCBtZW1fY2dyb3VwICptZW1fY2dyb3VwX2FsbG9jKHZvaWQpCiB7CiAJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbTsKKwlpbnQgc2l6ZSA9IG1lbV9jZ3JvdXBfc2l6ZSgpOwogCi0JaWYgKHNpemVvZigqbWVtKSA8IFBBR0VfU0laRSkKLQkJbWVtID0ga21hbGxvYyhzaXplb2YoKm1lbSksIEdGUF9LRVJORUwpOworCWlmIChzaXplIDwgUEFHRV9TSVpFKQorCQltZW0gPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwogCWVsc2UKLQkJbWVtID0gdm1hbGxvYyhzaXplb2YoKm1lbSkpOworCQltZW0gPSB2bWFsbG9jKHNpemUpOwogCiAJaWYgKG1lbSkKLQkJbWVtc2V0KG1lbSwgMCwgc2l6ZW9mKCptZW0pKTsKKwkJbWVtc2V0KG1lbSwgMCwgc2l6ZSk7CiAJcmV0dXJuIG1lbTsKIH0KIAotc3RhdGljIHZvaWQgbWVtX2Nncm91cF9mcmVlKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCisvKgorICogQXQgZGVzdHJveWluZyBtZW1fY2dyb3VwLCByZWZlcmVuY2VzIGZyb20gc3dhcF9jZ3JvdXAgY2FuIHJlbWFpbi4KKyAqIChzY2FubmluZyBhbGwgYXQgZm9yY2VfZW1wdHkgaXMgdG9vIGNvc3RseS4uLikKKyAqCisgKiBJbnN0ZWFkIG9mIGNsZWFyaW5nIGFsbCByZWZlcmVuY2VzIGF0IGZvcmNlX2VtcHR5LCB3ZSByZW1lbWJlcgorICogdGhlIG51bWJlciBvZiByZWZlcmVuY2UgZnJvbSBzd2FwX2Nncm91cCBhbmQgZnJlZSBtZW1fY2dyb3VwIHdoZW4KKyAqIGl0IGdvZXMgZG93biB0byAwLgorICoKKyAqIFJlbW92YWwgb2YgY2dyb3VwIGl0c2VsZiBzdWNjZWVkcyByZWdhcmRsZXNzIG9mIHJlZnMgZnJvbSBzd2FwLgorICovCisKK3N0YXRpYyB2b2lkIF9fbWVtX2Nncm91cF9mcmVlKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCiB7Ci0JaWYgKHNpemVvZigqbWVtKSA8IFBBR0VfU0laRSkKKwlpbnQgbm9kZTsKKworCWZvcl9lYWNoX25vZGVfc3RhdGUobm9kZSwgTl9QT1NTSUJMRSkKKwkJZnJlZV9tZW1fY2dyb3VwX3Blcl96b25lX2luZm8obWVtLCBub2RlKTsKKworCWlmIChtZW1fY2dyb3VwX3NpemUoKSA8IFBBR0VfU0laRSkKIAkJa2ZyZWUobWVtKTsKIAllbHNlCiAJCXZmcmVlKG1lbSk7CiB9CiAKK3N0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfZ2V0KHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCit7CisJYXRvbWljX2luYygmbWVtLT5yZWZjbnQpOworfQorCitzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX3B1dChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKQoreworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZtZW0tPnJlZmNudCkpCisJCV9fbWVtX2Nncm91cF9mcmVlKG1lbSk7Cit9CisKKworI2lmZGVmIENPTkZJR19DR1JPVVBfTUVNX1JFU19DVExSX1NXQVAKK3N0YXRpYyB2b2lkIF9faW5pdCBlbmFibGVfc3dhcF9jZ3JvdXAodm9pZCkKK3sKKwlpZiAoIW1lbV9jZ3JvdXBfZGlzYWJsZWQoKSAmJiByZWFsbHlfZG9fc3dhcF9hY2NvdW50KQorCQlkb19zd2FwX2FjY291bnQgPSAxOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIF9faW5pdCBlbmFibGVfc3dhcF9jZ3JvdXAodm9pZCkKK3sKK30KKyNlbmRpZgogCiBzdGF0aWMgc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKgogbWVtX2Nncm91cF9jcmVhdGUoc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLCBzdHJ1Y3QgY2dyb3VwICpjb250KQogewotCXN0cnVjdCBtZW1fY2dyb3VwICptZW07CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwgKnBhcmVudDsKIAlpbnQgbm9kZTsKIAotCWlmICh1bmxpa2VseSgoY29udC0+cGFyZW50KSA9PSBOVUxMKSkgewotCQltZW0gPSAmaW5pdF9tZW1fY2dyb3VwOwotCX0gZWxzZSB7Ci0JCW1lbSA9IG1lbV9jZ3JvdXBfYWxsb2MoKTsKLQkJaWYgKCFtZW0pCi0JCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQl9Ci0KLQlyZXNfY291bnRlcl9pbml0KCZtZW0tPnJlcyk7CisJbWVtID0gbWVtX2Nncm91cF9hbGxvYygpOworCWlmICghbWVtKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAogCWZvcl9lYWNoX25vZGVfc3RhdGUobm9kZSwgTl9QT1NTSUJMRSkKIAkJaWYgKGFsbG9jX21lbV9jZ3JvdXBfcGVyX3pvbmVfaW5mbyhtZW0sIG5vZGUpKQogCQkJZ290byBmcmVlX291dDsKKwkvKiByb290ID8gKi8KKwlpZiAoY29udC0+cGFyZW50ID09IE5VTEwpIHsKKwkJZW5hYmxlX3N3YXBfY2dyb3VwKCk7CisJCXBhcmVudCA9IE5VTEw7CisJfSBlbHNlIHsKKwkJcGFyZW50ID0gbWVtX2Nncm91cF9mcm9tX2NvbnQoY29udC0+cGFyZW50KTsKKwkJbWVtLT51c2VfaGllcmFyY2h5ID0gcGFyZW50LT51c2VfaGllcmFyY2h5OworCX0KIAorCWlmIChwYXJlbnQgJiYgcGFyZW50LT51c2VfaGllcmFyY2h5KSB7CisJCXJlc19jb3VudGVyX2luaXQoJm1lbS0+cmVzLCAmcGFyZW50LT5yZXMpOworCQlyZXNfY291bnRlcl9pbml0KCZtZW0tPm1lbXN3LCAmcGFyZW50LT5tZW1zdyk7CisJfSBlbHNlIHsKKwkJcmVzX2NvdW50ZXJfaW5pdCgmbWVtLT5yZXMsIE5VTEwpOworCQlyZXNfY291bnRlcl9pbml0KCZtZW0tPm1lbXN3LCBOVUxMKTsKKwl9CisJbWVtLT5sYXN0X3NjYW5uZWRfY2hpbGQgPSBOVUxMOworCXNwaW5fbG9ja19pbml0KCZtZW0tPnJlY2xhaW1fcGFyYW1fbG9jayk7CisKKwlpZiAocGFyZW50KQorCQltZW0tPnN3YXBwaW5lc3MgPSBnZXRfc3dhcHBpbmVzcyhwYXJlbnQpOworCWF0b21pY19zZXQoJm1lbS0+cmVmY250LCAxKTsKIAlyZXR1cm4gJm1lbS0+Y3NzOwogZnJlZV9vdXQ6Ci0JZm9yX2VhY2hfbm9kZV9zdGF0ZShub2RlLCBOX1BPU1NJQkxFKQotCQlmcmVlX21lbV9jZ3JvdXBfcGVyX3pvbmVfaW5mbyhtZW0sIG5vZGUpOwotCWlmIChjb250LT5wYXJlbnQgIT0gTlVMTCkKLQkJbWVtX2Nncm91cF9mcmVlKG1lbSk7CisJX19tZW1fY2dyb3VwX2ZyZWUobWVtKTsKIAlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIH0KIApAQCAtMTExNCwyNiArMjIyNiwyNiBAQAogCQkJCQlzdHJ1Y3QgY2dyb3VwICpjb250KQogewogCXN0cnVjdCBtZW1fY2dyb3VwICptZW0gPSBtZW1fY2dyb3VwX2Zyb21fY29udChjb250KTsKLQltZW1fY2dyb3VwX2ZvcmNlX2VtcHR5KG1lbSk7CisJbWVtX2Nncm91cF9mb3JjZV9lbXB0eShtZW0sIGZhbHNlKTsKIH0KIAogc3RhdGljIHZvaWQgbWVtX2Nncm91cF9kZXN0cm95KHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcywKIAkJCQlzdHJ1Y3QgY2dyb3VwICpjb250KQogewotCWludCBub2RlOwotCXN0cnVjdCBtZW1fY2dyb3VwICptZW0gPSBtZW1fY2dyb3VwX2Zyb21fY29udChjb250KTsKLQotCWZvcl9lYWNoX25vZGVfc3RhdGUobm9kZSwgTl9QT1NTSUJMRSkKLQkJZnJlZV9tZW1fY2dyb3VwX3Blcl96b25lX2luZm8obWVtLCBub2RlKTsKLQotCW1lbV9jZ3JvdXBfZnJlZShtZW1fY2dyb3VwX2Zyb21fY29udChjb250KSk7CisJbWVtX2Nncm91cF9wdXQobWVtX2Nncm91cF9mcm9tX2NvbnQoY29udCkpOwogfQogCiBzdGF0aWMgaW50IG1lbV9jZ3JvdXBfcG9wdWxhdGUoc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLAogCQkJCXN0cnVjdCBjZ3JvdXAgKmNvbnQpCiB7Ci0JcmV0dXJuIGNncm91cF9hZGRfZmlsZXMoY29udCwgc3MsIG1lbV9jZ3JvdXBfZmlsZXMsCi0JCQkJCUFSUkFZX1NJWkUobWVtX2Nncm91cF9maWxlcykpOworCWludCByZXQ7CisKKwlyZXQgPSBjZ3JvdXBfYWRkX2ZpbGVzKGNvbnQsIHNzLCBtZW1fY2dyb3VwX2ZpbGVzLAorCQkJCUFSUkFZX1NJWkUobWVtX2Nncm91cF9maWxlcykpOworCisJaWYgKCFyZXQpCisJCXJldCA9IHJlZ2lzdGVyX21lbXN3X2ZpbGVzKGNvbnQsIHNzKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX21vdmVfdGFzayhzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsCkBAIC0xMTQxLDI1ICsyMjUzLDEyIEBACiAJCQkJc3RydWN0IGNncm91cCAqb2xkX2NvbnQsCiAJCQkJc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewotCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOwotCXN0cnVjdCBtZW1fY2dyb3VwICptZW0sICpvbGRfbWVtOwotCi0JbW0gPSBnZXRfdGFza19tbShwKTsKLQlpZiAobW0gPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JbWVtID0gbWVtX2Nncm91cF9mcm9tX2NvbnQoY29udCk7Ci0Jb2xkX21lbSA9IG1lbV9jZ3JvdXBfZnJvbV9jb250KG9sZF9jb250KTsKLQorCW11dGV4X2xvY2soJm1lbWNnX3Rhc2tsaXN0KTsKIAkvKgotCSAqIE9ubHkgdGhyZWFkIGdyb3VwIGxlYWRlcnMgYXJlIGFsbG93ZWQgdG8gbWlncmF0ZSwgdGhlIG1tX3N0cnVjdCBpcwotCSAqIGluIGVmZmVjdCBvd25lZCBieSB0aGUgbGVhZGVyCisJICogRklYTUU6IEl0J3MgYmV0dGVyIHRvIG1vdmUgY2hhcmdlcyBvZiB0aGlzIHByb2Nlc3MgZnJvbSBvbGQKKwkgKiBtZW1jZyB0byBuZXcgbWVtY2cuIEJ1dCBpdCdzIGp1c3Qgb24gVE9ETy1MaXN0IG5vdy4KIAkgKi8KLQlpZiAoIXRocmVhZF9ncm91cF9sZWFkZXIocCkpCi0JCWdvdG8gb3V0OwotCi1vdXQ6Ci0JbW1wdXQobW0pOworCW11dGV4X3VubG9jaygmbWVtY2dfdGFza2xpc3QpOwogfQogCiBzdHJ1Y3QgY2dyb3VwX3N1YnN5cyBtZW1fY2dyb3VwX3N1YnN5cyA9IHsKQEAgLTExNzIsMyArMjI3MSwxMyBAQAogCS5hdHRhY2ggPSBtZW1fY2dyb3VwX21vdmVfdGFzaywKIAkuZWFybHlfaW5pdCA9IDAsCiB9OworCisjaWZkZWYgQ09ORklHX0NHUk9VUF9NRU1fUkVTX0NUTFJfU1dBUAorCitzdGF0aWMgaW50IF9faW5pdCBkaXNhYmxlX3N3YXBfYWNjb3VudChjaGFyICpzKQoreworCXJlYWxseV9kb19zd2FwX2FjY291bnQgPSAwOworCXJldHVybiAxOworfQorX19zZXR1cCgibm9zd2FwYWNjb3VudCIsIGRpc2FibGVfc3dhcF9hY2NvdW50KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbW0vbWVtb3J5LmMgYi9tbS9tZW1vcnkuYwppbmRleCAwYTIwMTBhLi5lMDA5Y2U4IDEwMDY0NAotLS0gYS9tbS9tZW1vcnkuYworKysgYi9tbS9tZW1vcnkuYwpAQCAtNTIsNiArNTIsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgogI2luY2x1ZGUgPGxpbnV4L21lbWNvbnRyb2wuaD4KICNpbmNsdWRlIDxsaW51eC9tbXVfbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N3YXBvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9lbGYuaD4KIAogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTU5LDkgKzYyLDYgQEAKICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogCi0jaW5jbHVkZSA8bGludXgvc3dhcG9wcy5oPgotI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgotCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogI2lmbmRlZiBDT05GSUdfTkVFRF9NVUxUSVBMRV9OT0RFUwpAQCAtMzc1LDE1ICszNzUsNjUgQEAKICAqCiAgKiBUaGUgY2FsbGluZyBmdW5jdGlvbiBtdXN0IHN0aWxsIGhhbmRsZSB0aGUgZXJyb3IuCiAgKi8KLXN0YXRpYyB2b2lkIHByaW50X2JhZF9wdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHB0ZV90IHB0ZSwKLQkJCSAgdW5zaWduZWQgbG9uZyB2YWRkcikKK3N0YXRpYyB2b2lkIHByaW50X2JhZF9wdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCSAgcHRlX3QgcHRlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLQlwcmludGsoS0VSTl9FUlIgIkJhZCBwdGUgPSAlMDhsbHgsIHByb2Nlc3MgPSAlcywgIgotCQkJInZtX2ZsYWdzID0gJWx4LCB2YWRkciA9ICVseFxuIiwKLQkJKGxvbmcgbG9uZylwdGVfdmFsKHB0ZSksCi0JCSh2bWEtPnZtX21tID09IGN1cnJlbnQtPm1tID8gY3VycmVudC0+Y29tbSA6ICI/Pz8iKSwKLQkJdm1hLT52bV9mbGFncywgdmFkZHIpOworCXBnZF90ICpwZ2QgPSBwZ2Rfb2Zmc2V0KHZtYS0+dm1fbW0sIGFkZHIpOworCXB1ZF90ICpwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgYWRkcik7CisJcG1kX3QgKnBtZCA9IHBtZF9vZmZzZXQocHVkLCBhZGRyKTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKKwlwZ29mZl90IGluZGV4OworCXN0YXRpYyB1bnNpZ25lZCBsb25nIHJlc3VtZTsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBucl9zaG93bjsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBucl91bnNob3duOworCisJLyoKKwkgKiBBbGxvdyBhIGJ1cnN0IG9mIDYwIHJlcG9ydHMsIHRoZW4ga2VlcCBxdWlldCBmb3IgdGhhdCBtaW51dGU7CisJICogb3IgYWxsb3cgYSBzdGVhZHkgZHJpcCBvZiBvbmUgcmVwb3J0IHBlciBzZWNvbmQuCisJICovCisJaWYgKG5yX3Nob3duID09IDYwKSB7CisJCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCByZXN1bWUpKSB7CisJCQlucl91bnNob3duKys7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKG5yX3Vuc2hvd24pIHsKKwkJCXByaW50ayhLRVJOX0FMRVJUCisJCQkJIkJVRzogQmFkIHBhZ2UgbWFwOiAlbHUgbWVzc2FnZXMgc3VwcHJlc3NlZFxuIiwKKwkJCQlucl91bnNob3duKTsKKwkJCW5yX3Vuc2hvd24gPSAwOworCQl9CisJCW5yX3Nob3duID0gMDsKKwl9CisJaWYgKG5yX3Nob3duKysgPT0gMCkKKwkJcmVzdW1lID0gamlmZmllcyArIDYwICogSFo7CisKKwltYXBwaW5nID0gdm1hLT52bV9maWxlID8gdm1hLT52bV9maWxlLT5mX21hcHBpbmcgOiBOVUxMOworCWluZGV4ID0gbGluZWFyX3BhZ2VfaW5kZXgodm1hLCBhZGRyKTsKKworCXByaW50ayhLRVJOX0FMRVJUCisJCSJCVUc6IEJhZCBwYWdlIG1hcCBpbiBwcm9jZXNzICVzICBwdGU6JTA4bGx4IHBtZDolMDhsbHhcbiIsCisJCWN1cnJlbnQtPmNvbW0sCisJCShsb25nIGxvbmcpcHRlX3ZhbChwdGUpLCAobG9uZyBsb25nKXBtZF92YWwoKnBtZCkpOworCWlmIChwYWdlKSB7CisJCXByaW50ayhLRVJOX0FMRVJUCisJCSJwYWdlOiVwIGZsYWdzOiVwIGNvdW50OiVkIG1hcGNvdW50OiVkIG1hcHBpbmc6JXAgaW5kZXg6JWx4XG4iLAorCQlwYWdlLCAodm9pZCAqKXBhZ2UtPmZsYWdzLCBwYWdlX2NvdW50KHBhZ2UpLAorCQlwYWdlX21hcGNvdW50KHBhZ2UpLCBwYWdlLT5tYXBwaW5nLCBwYWdlLT5pbmRleCk7CisJfQorCXByaW50ayhLRVJOX0FMRVJUCisJCSJhZGRyOiVwIHZtX2ZsYWdzOiUwOGx4IGFub25fdm1hOiVwIG1hcHBpbmc6JXAgaW5kZXg6JWx4XG4iLAorCQkodm9pZCAqKWFkZHIsIHZtYS0+dm1fZmxhZ3MsIHZtYS0+YW5vbl92bWEsIG1hcHBpbmcsIGluZGV4KTsKKwkvKgorCSAqIENob29zZSB0ZXh0IGJlY2F1c2UgZGF0YSBzeW1ib2xzIGRlcGVuZCBvbiBDT05GSUdfS0FMTFNZTVNfQUxMPXkKKwkgKi8KKwlpZiAodm1hLT52bV9vcHMpCisJCXByaW50X3N5bWJvbChLRVJOX0FMRVJUICJ2bWEtPnZtX29wcy0+ZmF1bHQ6ICVzXG4iLAorCQkJCSh1bnNpZ25lZCBsb25nKXZtYS0+dm1fb3BzLT5mYXVsdCk7CisJaWYgKHZtYS0+dm1fZmlsZSAmJiB2bWEtPnZtX2ZpbGUtPmZfb3ApCisJCXByaW50X3N5bWJvbChLRVJOX0FMRVJUICJ2bWEtPnZtX2ZpbGUtPmZfb3AtPm1tYXA6ICVzXG4iLAorCQkJCSh1bnNpZ25lZCBsb25nKXZtYS0+dm1fZmlsZS0+Zl9vcC0+bW1hcCk7CiAJZHVtcF9zdGFjaygpOworCWFkZF90YWludChUQUlOVF9CQURfUEFHRSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGlzX2Nvd19tYXBwaW5nKHVuc2lnbmVkIGludCBmbGFncykKQEAgLTQ0MSwyMSArNDkxLDE4IEBACiBzdHJ1Y3QgcGFnZSAqdm1fbm9ybWFsX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwKIAkJCQlwdGVfdCBwdGUpCiB7Ci0JdW5zaWduZWQgbG9uZyBwZm47CisJdW5zaWduZWQgbG9uZyBwZm4gPSBwdGVfcGZuKHB0ZSk7CiAKIAlpZiAoSEFWRV9QVEVfU1BFQ0lBTCkgewotCQlpZiAobGlrZWx5KCFwdGVfc3BlY2lhbChwdGUpKSkgewotCQkJVk1fQlVHX09OKCFwZm5fdmFsaWQocHRlX3BmbihwdGUpKSk7Ci0JCQlyZXR1cm4gcHRlX3BhZ2UocHRlKTsKLQkJfQotCQlWTV9CVUdfT04oISh2bWEtPnZtX2ZsYWdzICYgKFZNX1BGTk1BUCB8IFZNX01JWEVETUFQKSkpOworCQlpZiAobGlrZWx5KCFwdGVfc3BlY2lhbChwdGUpKSkKKwkJCWdvdG8gY2hlY2tfcGZuOworCQlpZiAoISh2bWEtPnZtX2ZsYWdzICYgKFZNX1BGTk1BUCB8IFZNX01JWEVETUFQKSkpCisJCQlwcmludF9iYWRfcHRlKHZtYSwgYWRkciwgcHRlLCBOVUxMKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCiAJLyogIUhBVkVfUFRFX1NQRUNJQUwgY2FzZSBmb2xsb3dzOiAqLwogCi0JcGZuID0gcHRlX3BmbihwdGUpOwotCiAJaWYgKHVubGlrZWx5KHZtYS0+dm1fZmxhZ3MgJiAoVk1fUEZOTUFQfFZNX01JWEVETUFQKSkpIHsKIAkJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9NSVhFRE1BUCkgewogCQkJaWYgKCFwZm5fdmFsaWQocGZuKSkKQEAgLTQ3MSwxMSArNTE4LDE0IEBACiAJCX0KIAl9CiAKLQlWTV9CVUdfT04oIXBmbl92YWxpZChwZm4pKTsKK2NoZWNrX3BmbjoKKwlpZiAodW5saWtlbHkocGZuID4gaGlnaGVzdF9tZW1tYXBfcGZuKSkgeworCQlwcmludF9iYWRfcHRlKHZtYSwgYWRkciwgcHRlLCBOVUxMKTsKKwkJcmV0dXJuIE5VTEw7CisJfQogCiAJLyoKIAkgKiBOT1RFISBXZSBzdGlsbCBoYXZlIFBhZ2VSZXNlcnZlZCgpIHBhZ2VzIGluIHRoZSBwYWdlIHRhYmxlcy4KLQkgKgogCSAqIGVnLiBWRFNPIG1hcHBpbmdzIGNhbiBjYXVzZSB0aGVtIHRvIGV4aXN0LgogCSAqLwogb3V0OgpAQCAtNzY3LDExICs4MTcsMTQgQEAKIAkJCWVsc2UgewogCQkJCWlmIChwdGVfZGlydHkocHRlbnQpKQogCQkJCQlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKLQkJCQlpZiAocHRlX3lvdW5nKHB0ZW50KSkKLQkJCQkJU2V0UGFnZVJlZmVyZW5jZWQocGFnZSk7CisJCQkJaWYgKHB0ZV95b3VuZyhwdGVudCkgJiYKKwkJCQkgICAgbGlrZWx5KCFWTV9TZXF1ZW50aWFsUmVhZEhpbnQodm1hKSkpCisJCQkJCW1hcmtfcGFnZV9hY2Nlc3NlZChwYWdlKTsKIAkJCQlmaWxlX3Jzcy0tOwogCQkJfQotCQkJcGFnZV9yZW1vdmVfcm1hcChwYWdlLCB2bWEpOworCQkJcGFnZV9yZW1vdmVfcm1hcChwYWdlKTsKKwkJCWlmICh1bmxpa2VseShwYWdlX21hcGNvdW50KHBhZ2UpIDwgMCkpCisJCQkJcHJpbnRfYmFkX3B0ZSh2bWEsIGFkZHIsIHB0ZW50LCBwYWdlKTsKIAkJCXRsYl9yZW1vdmVfcGFnZSh0bGIsIHBhZ2UpOwogCQkJY29udGludWU7CiAJCX0KQEAgLTc4MSw4ICs4MzQsMTIgQEAKIAkJICovCiAJCWlmICh1bmxpa2VseShkZXRhaWxzKSkKIAkJCWNvbnRpbnVlOwotCQlpZiAoIXB0ZV9maWxlKHB0ZW50KSkKLQkJCWZyZWVfc3dhcF9hbmRfY2FjaGUocHRlX3RvX3N3cF9lbnRyeShwdGVudCkpOworCQlpZiAocHRlX2ZpbGUocHRlbnQpKSB7CisJCQlpZiAodW5saWtlbHkoISh2bWEtPnZtX2ZsYWdzICYgVk1fTk9OTElORUFSKSkpCisJCQkJcHJpbnRfYmFkX3B0ZSh2bWEsIGFkZHIsIHB0ZW50LCBOVUxMKTsKKwkJfSBlbHNlIGlmCisJCSAgKHVubGlrZWx5KCFmcmVlX3N3YXBfYW5kX2NhY2hlKHB0ZV90b19zd3BfZW50cnkocHRlbnQpKSkpCisJCQlwcmludF9iYWRfcHRlKHZtYSwgYWRkciwgcHRlbnQsIE5VTEwpOwogCQlwdGVfY2xlYXJfbm90X3ByZXNlbnRfZnVsbChtbSwgYWRkciwgcHRlLCB0bGItPmZ1bGxtbSk7CiAJfSB3aGlsZSAocHRlKyssIGFkZHIgKz0gUEFHRV9TSVpFLCAoYWRkciAhPSBlbmQgJiYgKnphcF93b3JrID4gMCkpOwogCkBAIC0xMTUzLDYgKzEyMTAsNyBAQAogCWludCB3cml0ZSA9ICEhKGZsYWdzICYgR1VQX0ZMQUdTX1dSSVRFKTsKIAlpbnQgZm9yY2UgPSAhIShmbGFncyAmIEdVUF9GTEFHU19GT1JDRSk7CiAJaW50IGlnbm9yZSA9ICEhKGZsYWdzICYgR1VQX0ZMQUdTX0lHTk9SRV9WTUFfUEVSTUlTU0lPTlMpOworCWludCBpZ25vcmVfc2lna2lsbCA9ICEhKGZsYWdzICYgR1VQX0ZMQUdTX0lHTk9SRV9TSUdLSUxMKTsKIAogCWlmIChsZW4gPD0gMCkKIAkJcmV0dXJuIDA7CkBAIC0xMjMxLDEyICsxMjg5LDE1IEBACiAJCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAogCQkJLyoKLQkJCSAqIElmIHRzayBpcyBvb21pbmcsIGN1dCBvZmYgaXRzIGFjY2VzcyB0byBsYXJnZSBtZW1vcnkKLQkJCSAqIGFsbG9jYXRpb25zLiBJdCBoYXMgYSBwZW5kaW5nIFNJR0tJTEwsIGJ1dCBpdCBjYW4ndAotCQkJICogYmUgcHJvY2Vzc2VkIHVudGlsIHJldHVybmluZyB0byB1c2VyIHNwYWNlLgorCQkJICogSWYgd2UgaGF2ZSBhIHBlbmRpbmcgU0lHS0lMTCwgZG9uJ3Qga2VlcCBmYXVsdGluZworCQkJICogcGFnZXMgYW5kIHBvdGVudGlhbGx5IGFsbG9jYXRpbmcgbWVtb3J5LCB1bmxlc3MKKwkJCSAqIGN1cnJlbnQgaXMgaGFuZGxpbmcgbXVubG9jay0tZS5nLiwgb24gZXhpdC4gSW4KKwkJCSAqIHRoYXQgY2FzZSwgd2UgYXJlIG5vdCBhbGxvY2F0aW5nIG1lbW9yeS4gIFJhdGhlciwKKwkJCSAqIHdlJ3JlIG9ubHkgdW5sb2NraW5nIGFscmVhZHkgcmVzaWRlbnQvbWFwcGVkIHBhZ2VzLgogCQkJICovCi0JCQlpZiAodW5saWtlbHkodGVzdF90c2tfdGhyZWFkX2ZsYWcodHNrLCBUSUZfTUVNRElFKSkpCi0JCQkJcmV0dXJuIGkgPyBpIDogLUVOT01FTTsKKwkJCWlmICh1bmxpa2VseSghaWdub3JlX3NpZ2tpbGwgJiYKKwkJCQkJZmF0YWxfc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpKQorCQkJCXJldHVybiBpID8gaSA6IC1FUkVTVEFSVFNZUzsKIAogCQkJaWYgKHdyaXRlKQogCQkJCWZvbGxfZmxhZ3MgfD0gRk9MTF9XUklURTsKQEAgLTEyNjMsOSArMTMyNCwxNSBAQAogCQkJCSAqIGRvX3dwX3BhZ2UgaGFzIGJyb2tlbiBDT1cgd2hlbiBuZWNlc3NhcnksCiAJCQkJICogZXZlbiBpZiBtYXliZV9ta3dyaXRlIGRlY2lkZWQgbm90IHRvIHNldAogCQkJCSAqIHB0ZV93cml0ZS4gV2UgY2FuIHRodXMgc2FmZWx5IGRvIHN1YnNlcXVlbnQKLQkJCQkgKiBwYWdlIGxvb2t1cHMgYXMgaWYgdGhleSB3ZXJlIHJlYWRzLgorCQkJCSAqIHBhZ2UgbG9va3VwcyBhcyBpZiB0aGV5IHdlcmUgcmVhZHMuIEJ1dCBvbmx5CisJCQkJICogZG8gc28gd2hlbiBsb29waW5nIGZvciBwdGVfd3JpdGUgaXMgZnV0aWxlOgorCQkJCSAqIGluIHNvbWUgY2FzZXMgdXNlcnNwYWNlIG1heSBhbHNvIGJlIHdhbnRpbmcKKwkJCQkgKiB0byB3cml0ZSB0byB0aGUgZ290dGVuIHVzZXIgcGFnZSwgd2hpY2ggYQorCQkJCSAqIHJlYWQgZmF1bHQgaGVyZSBtaWdodCBwcmV2ZW50IChhIHJlYWRvbmx5CisJCQkJICogcGFnZSBtaWdodCBnZXQgcmVDT1dlZCBieSB1c2Vyc3BhY2Ugd3JpdGUpLgogCQkJCSAqLwotCQkJCWlmIChyZXQgJiBWTV9GQVVMVF9XUklURSkKKwkJCQlpZiAoKHJldCAmIFZNX0ZBVUxUX1dSSVRFKSAmJgorCQkJCSAgICAhKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkpCiAJCQkJCWZvbGxfZmxhZ3MgJj0gfkZPTExfV1JJVEU7CiAKIAkJCQljb25kX3Jlc2NoZWQoKTsKQEAgLTE2NDQsNiArMTcxMSw4IEBACiAKIAlCVUdfT04ocG1kX2h1Z2UoKnBtZCkpOwogCisJYXJjaF9lbnRlcl9sYXp5X21tdV9tb2RlKCk7CisKIAl0b2tlbiA9IHBtZF9wZ3RhYmxlKCpwbWQpOwogCiAJZG8gewpAQCAtMTY1Miw2ICsxNzIxLDggQEAKIAkJCWJyZWFrOwogCX0gd2hpbGUgKHB0ZSsrLCBhZGRyICs9IFBBR0VfU0laRSwgYWRkciAhPSBlbmQpOwogCisJYXJjaF9sZWF2ZV9sYXp5X21tdV9tb2RlKCk7CisKIAlpZiAobW0gIT0gJmluaXRfbW0pCiAJCXB0ZV91bm1hcF91bmxvY2socHRlLTEsIHB0bCk7CiAJcmV0dXJuIGVycjsKQEAgLTE4MzcsMTAgKzE5MDgsMjEgQEAKIAkgKiBub3QgZGlydHkgYWNjb3VudGFibGUuCiAJICovCiAJaWYgKFBhZ2VBbm9uKG9sZF9wYWdlKSkgewotCQlpZiAodHJ5bG9ja19wYWdlKG9sZF9wYWdlKSkgewotCQkJcmV1c2UgPSBjYW5fc2hhcmVfc3dhcF9wYWdlKG9sZF9wYWdlKTsKLQkJCXVubG9ja19wYWdlKG9sZF9wYWdlKTsKKwkJaWYgKCF0cnlsb2NrX3BhZ2Uob2xkX3BhZ2UpKSB7CisJCQlwYWdlX2NhY2hlX2dldChvbGRfcGFnZSk7CisJCQlwdGVfdW5tYXBfdW5sb2NrKHBhZ2VfdGFibGUsIHB0bCk7CisJCQlsb2NrX3BhZ2Uob2xkX3BhZ2UpOworCQkJcGFnZV90YWJsZSA9IHB0ZV9vZmZzZXRfbWFwX2xvY2sobW0sIHBtZCwgYWRkcmVzcywKKwkJCQkJCQkgJnB0bCk7CisJCQlpZiAoIXB0ZV9zYW1lKCpwYWdlX3RhYmxlLCBvcmlnX3B0ZSkpIHsKKwkJCQl1bmxvY2tfcGFnZShvbGRfcGFnZSk7CisJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKG9sZF9wYWdlKTsKKwkJCQlnb3RvIHVubG9jazsKKwkJCX0KKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShvbGRfcGFnZSk7CiAJCX0KKwkJcmV1c2UgPSByZXVzZV9zd2FwX3BhZ2Uob2xkX3BhZ2UpOworCQl1bmxvY2tfcGFnZShvbGRfcGFnZSk7CiAJfSBlbHNlIGlmICh1bmxpa2VseSgodm1hLT52bV9mbGFncyAmIChWTV9XUklURXxWTV9TSEFSRUQpKSA9PQogCQkJCQkoVk1fV1JJVEV8Vk1fU0hBUkVEKSkpIHsKIAkJLyoKQEAgLTE5MTgsNyArMjAwMCw3IEBACiAJY293X3VzZXJfcGFnZShuZXdfcGFnZSwgb2xkX3BhZ2UsIGFkZHJlc3MsIHZtYSk7CiAJX19TZXRQYWdlVXB0b2RhdGUobmV3X3BhZ2UpOwogCi0JaWYgKG1lbV9jZ3JvdXBfY2hhcmdlKG5ld19wYWdlLCBtbSwgR0ZQX0tFUk5FTCkpCisJaWYgKG1lbV9jZ3JvdXBfbmV3cGFnZV9jaGFyZ2UobmV3X3BhZ2UsIG1tLCBHRlBfS0VSTkVMKSkKIAkJZ290byBvb21fZnJlZV9uZXc7CiAKIAkvKgpAQCAtMTk0MywxMSArMjAyNSw3IEBACiAJCSAqIHRocmVhZCBkb2luZyBDT1cuCiAJCSAqLwogCQlwdGVwX2NsZWFyX2ZsdXNoX25vdGlmeSh2bWEsIGFkZHJlc3MsIHBhZ2VfdGFibGUpOwotCQlTZXRQYWdlU3dhcEJhY2tlZChuZXdfcGFnZSk7Ci0JCWxydV9jYWNoZV9hZGRfYWN0aXZlX29yX3VuZXZpY3RhYmxlKG5ld19wYWdlLCB2bWEpOwogCQlwYWdlX2FkZF9uZXdfYW5vbl9ybWFwKG5ld19wYWdlLCB2bWEsIGFkZHJlc3MpOwotCi0vL1RPRE86ICBpcyB0aGlzIHNhZmU/ICBkb19hbm9ueW1vdXNfcGFnZSgpIGRvZXMgaXQgdGhpcyB3YXkuCiAJCXNldF9wdGVfYXQobW0sIGFkZHJlc3MsIHBhZ2VfdGFibGUsIGVudHJ5KTsKIAkJdXBkYXRlX21tdV9jYWNoZSh2bWEsIGFkZHJlc3MsIGVudHJ5KTsKIAkJaWYgKG9sZF9wYWdlKSB7CkBAIC0xOTczLDcgKzIwNTEsNyBAQAogCQkJICogbWFwY291bnQgaXMgdmlzaWJsZS4gU28gdHJhbnNpdGl2ZWx5LCBUTEJzIHRvCiAJCQkgKiBvbGQgcGFnZSB3aWxsIGJlIGZsdXNoZWQgYmVmb3JlIGl0IGNhbiBiZSByZXVzZWQuCiAJCQkgKi8KLQkJCXBhZ2VfcmVtb3ZlX3JtYXAob2xkX3BhZ2UsIHZtYSk7CisJCQlwYWdlX3JlbW92ZV9ybWFwKG9sZF9wYWdlKTsKIAkJfQogCiAJCS8qIEZyZWUgdGhlIG9sZCBwYWdlLi4gKi8KQEAgLTIyNjYsNyArMjM0NCw3IEBACiAJCXVubWFwX21hcHBpbmdfcmFuZ2UobWFwcGluZywgb2Zmc2V0ICsgUEFHRV9TSVpFIC0gMSwgMCwgMSk7CiAJfQogCi0JaWYgKGlub2RlLT5pX29wICYmIGlub2RlLT5pX29wLT50cnVuY2F0ZSkKKwlpZiAoaW5vZGUtPmlfb3AtPnRydW5jYXRlKQogCQlpbm9kZS0+aV9vcC0+dHJ1bmNhdGUoaW5vZGUpOwogCXJldHVybiAwOwogCkBAIC0yMjg2LDcgKzIzNjQsNyBAQAogCSAqIGEgd2F5IHRvIHRydW5jYXRlIGEgcmFuZ2Ugb2YgYmxvY2tzIChwdW5jaCBhIGhvbGUpIC0KIAkgKiB3ZSBzaG91bGQgcmV0dXJuIGZhaWx1cmUgcmlnaHQgbm93LgogCSAqLwotCWlmICghaW5vZGUtPmlfb3AgfHwgIWlub2RlLT5pX29wLT50cnVuY2F0ZV9yYW5nZSkKKwlpZiAoIWlub2RlLT5pX29wLT50cnVuY2F0ZV9yYW5nZSkKIAkJcmV0dXJuIC1FTk9TWVM7CiAKIAltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CkBAIC0yMzE0LDYgKzIzOTIsNyBAQAogCXN0cnVjdCBwYWdlICpwYWdlOwogCXN3cF9lbnRyeV90IGVudHJ5OwogCXB0ZV90IHB0ZTsKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqcHRyID0gTlVMTDsKIAlpbnQgcmV0ID0gMDsKIAogCWlmICghcHRlX3VubWFwX3NhbWUobW0sIHBtZCwgcGFnZV90YWJsZSwgb3JpZ19wdGUpKQpAQCAtMjM1Miw3ICsyNDMxLDcgQEAKIAlsb2NrX3BhZ2UocGFnZSk7CiAJZGVsYXlhY2N0X2NsZWFyX2ZsYWcoREVMQVlBQ0NUX1BGX1NXQVBJTik7CiAKLQlpZiAobWVtX2Nncm91cF9jaGFyZ2UocGFnZSwgbW0sIEdGUF9LRVJORUwpKSB7CisJaWYgKG1lbV9jZ3JvdXBfdHJ5X2NoYXJnZV9zd2FwaW4obW0sIHBhZ2UsIEdGUF9LRVJORUwsICZwdHIpKSB7CiAJCXJldCA9IFZNX0ZBVUxUX09PTTsKIAkJdW5sb2NrX3BhZ2UocGFnZSk7CiAJCWdvdG8gb3V0OwpAQCAtMjM3MCwyMiArMjQ0OSwzNSBAQAogCQlnb3RvIG91dF9ub21hcDsKIAl9CiAKLQkvKiBUaGUgcGFnZSBpc24ndCBwcmVzZW50IHlldCwgZ28gYWhlYWQgd2l0aCB0aGUgZmF1bHQuICovCisJLyoKKwkgKiBUaGUgcGFnZSBpc24ndCBwcmVzZW50IHlldCwgZ28gYWhlYWQgd2l0aCB0aGUgZmF1bHQuCisJICoKKwkgKiBCZSBjYXJlZnVsIGFib3V0IHRoZSBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGhlcmUuCisJICogVG8gZ2V0IGl0cyBhY2NvdW50aW5nIHJpZ2h0LCByZXVzZV9zd2FwX3BhZ2UoKSBtdXN0IGJlIGNhbGxlZAorCSAqIHdoaWxlIHRoZSBwYWdlIGlzIGNvdW50ZWQgb24gc3dhcCBidXQgbm90IHlldCBpbiBtYXBjb3VudCBpLmUuCisJICogYmVmb3JlIHBhZ2VfYWRkX2Fub25fcm1hcCgpIGFuZCBzd2FwX2ZyZWUoKTsgdHJ5X3RvX2ZyZWVfc3dhcCgpCisJICogbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIHN3YXBfZnJlZSgpLCBvciBpdCB3aWxsIG5ldmVyIHN1Y2NlZWQuCisJICogQmVjYXVzZSBkZWxldGVfZnJvbV9zd2FwX3BhZ2UoKSBtYXkgYmUgY2FsbGVkIGJ5IHJldXNlX3N3YXBfcGFnZSgpLAorCSAqIG1lbV9jZ3JvdXBfY29tbWl0X2NoYXJnZV9zd2FwaW4oKSBtYXkgbm90IGJlIGFibGUgdG8gZmluZCBzd3BfZW50cnkKKwkgKiBpbiBwYWdlLT5wcml2YXRlLiBJbiB0aGlzIGNhc2UsIGEgcmVjb3JkIGluIHN3YXBfY2dyb3VwICBpcyBzaWxlbnRseQorCSAqIGRpc2NhcmRlZCBhdCBzd2FwX2ZyZWUoKS4KKwkgKi8KIAogCWluY19tbV9jb3VudGVyKG1tLCBhbm9uX3Jzcyk7CiAJcHRlID0gbWtfcHRlKHBhZ2UsIHZtYS0+dm1fcGFnZV9wcm90KTsKLQlpZiAod3JpdGVfYWNjZXNzICYmIGNhbl9zaGFyZV9zd2FwX3BhZ2UocGFnZSkpIHsKKwlpZiAod3JpdGVfYWNjZXNzICYmIHJldXNlX3N3YXBfcGFnZShwYWdlKSkgewogCQlwdGUgPSBtYXliZV9ta3dyaXRlKHB0ZV9ta2RpcnR5KHB0ZSksIHZtYSk7CiAJCXdyaXRlX2FjY2VzcyA9IDA7CiAJfQotCiAJZmx1c2hfaWNhY2hlX3BhZ2Uodm1hLCBwYWdlKTsKIAlzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwYWdlX3RhYmxlLCBwdGUpOwogCXBhZ2VfYWRkX2Fub25fcm1hcChwYWdlLCB2bWEsIGFkZHJlc3MpOworCS8qIEl0J3MgYmV0dGVyIHRvIGNhbGwgY29tbWl0LWNoYXJnZSBhZnRlciBybWFwIGlzIGVzdGFibGlzaGVkICovCisJbWVtX2Nncm91cF9jb21taXRfY2hhcmdlX3N3YXBpbihwYWdlLCBwdHIpOwogCiAJc3dhcF9mcmVlKGVudHJ5KTsKIAlpZiAodm1fc3dhcF9mdWxsKCkgfHwgKHZtYS0+dm1fZmxhZ3MgJiBWTV9MT0NLRUQpIHx8IFBhZ2VNbG9ja2VkKHBhZ2UpKQotCQlyZW1vdmVfZXhjbHVzaXZlX3N3YXBfcGFnZShwYWdlKTsKKwkJdHJ5X3RvX2ZyZWVfc3dhcChwYWdlKTsKIAl1bmxvY2tfcGFnZShwYWdlKTsKIAogCWlmICh3cml0ZV9hY2Nlc3MpIHsKQEAgLTI0MDIsNyArMjQ5NCw3IEBACiBvdXQ6CiAJcmV0dXJuIHJldDsKIG91dF9ub21hcDoKLQltZW1fY2dyb3VwX3VuY2hhcmdlX3BhZ2UocGFnZSk7CisJbWVtX2Nncm91cF9jYW5jZWxfY2hhcmdlX3N3YXBpbihwdHIpOwogCXB0ZV91bm1hcF91bmxvY2socGFnZV90YWJsZSwgcHRsKTsKIAl1bmxvY2tfcGFnZShwYWdlKTsKIAlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CkBAIC0yNDMyLDcgKzI1MjQsNyBAQAogCQlnb3RvIG9vbTsKIAlfX1NldFBhZ2VVcHRvZGF0ZShwYWdlKTsKIAotCWlmIChtZW1fY2dyb3VwX2NoYXJnZShwYWdlLCBtbSwgR0ZQX0tFUk5FTCkpCisJaWYgKG1lbV9jZ3JvdXBfbmV3cGFnZV9jaGFyZ2UocGFnZSwgbW0sIEdGUF9LRVJORUwpKQogCQlnb3RvIG9vbV9mcmVlX3BhZ2U7CiAKIAllbnRyeSA9IG1rX3B0ZShwYWdlLCB2bWEtPnZtX3BhZ2VfcHJvdCk7CkBAIC0yNDQyLDggKzI1MzQsNiBAQAogCWlmICghcHRlX25vbmUoKnBhZ2VfdGFibGUpKQogCQlnb3RvIHJlbGVhc2U7CiAJaW5jX21tX2NvdW50ZXIobW0sIGFub25fcnNzKTsKLQlTZXRQYWdlU3dhcEJhY2tlZChwYWdlKTsKLQlscnVfY2FjaGVfYWRkX2FjdGl2ZV9vcl91bmV2aWN0YWJsZShwYWdlLCB2bWEpOwogCXBhZ2VfYWRkX25ld19hbm9uX3JtYXAocGFnZSwgdm1hLCBhZGRyZXNzKTsKIAlzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwYWdlX3RhYmxlLCBlbnRyeSk7CiAKQEAgLTI1MjUsNyArMjYxNSw3IEBACiAJCQkJcmV0ID0gVk1fRkFVTFRfT09NOwogCQkJCWdvdG8gb3V0OwogCQkJfQotCQkJaWYgKG1lbV9jZ3JvdXBfY2hhcmdlKHBhZ2UsIG1tLCBHRlBfS0VSTkVMKSkgeworCQkJaWYgKG1lbV9jZ3JvdXBfbmV3cGFnZV9jaGFyZ2UocGFnZSwgbW0sIEdGUF9LRVJORUwpKSB7CiAJCQkJcmV0ID0gVk1fRkFVTFRfT09NOwogCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAkJCQlnb3RvIG91dDsKQEAgLTI1OTEsOCArMjY4MSw2IEBACiAJCQllbnRyeSA9IG1heWJlX21rd3JpdGUocHRlX21rZGlydHkoZW50cnkpLCB2bWEpOwogCQlpZiAoYW5vbikgewogCQkJaW5jX21tX2NvdW50ZXIobW0sIGFub25fcnNzKTsKLQkJCVNldFBhZ2VTd2FwQmFja2VkKHBhZ2UpOwotCQkJbHJ1X2NhY2hlX2FkZF9hY3RpdmVfb3JfdW5ldmljdGFibGUocGFnZSwgdm1hKTsKIAkJCXBhZ2VfYWRkX25ld19hbm9uX3JtYXAocGFnZSwgdm1hLCBhZGRyZXNzKTsKIAkJfSBlbHNlIHsKIAkJCWluY19tbV9jb3VudGVyKG1tLCBmaWxlX3Jzcyk7CkBAIC0yNjAyLDcgKzI2OTAsNiBAQAogCQkJCWdldF9wYWdlKGRpcnR5X3BhZ2UpOwogCQkJfQogCQl9Ci0vL1RPRE86ICBpcyB0aGlzIHNhZmU/ICBkb19hbm9ueW1vdXNfcGFnZSgpIGRvZXMgaXQgdGhpcyB3YXkuCiAJCXNldF9wdGVfYXQobW0sIGFkZHJlc3MsIHBhZ2VfdGFibGUsIGVudHJ5KTsKIAogCQkvKiBubyBuZWVkIHRvIGludmFsaWRhdGU6IGEgbm90LXByZXNlbnQgcGFnZSB3b24ndCBiZSBjYWNoZWQgKi8KQEAgLTI2NjYsMTIgKzI3NTMsMTEgQEAKIAlpZiAoIXB0ZV91bm1hcF9zYW1lKG1tLCBwbWQsIHBhZ2VfdGFibGUsIG9yaWdfcHRlKSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAodW5saWtlbHkoISh2bWEtPnZtX2ZsYWdzICYgVk1fTk9OTElORUFSKSB8fAotCQkJISh2bWEtPnZtX2ZsYWdzICYgVk1fQ0FOX05PTkxJTkVBUikpKSB7CisJaWYgKHVubGlrZWx5KCEodm1hLT52bV9mbGFncyAmIFZNX05PTkxJTkVBUikpKSB7CiAJCS8qCiAJCSAqIFBhZ2UgdGFibGUgY29ycnVwdGVkOiBzaG93IHB0ZSBhbmQga2lsbCBwcm9jZXNzLgogCQkgKi8KLQkJcHJpbnRfYmFkX3B0ZSh2bWEsIG9yaWdfcHRlLCBhZGRyZXNzKTsKKwkJcHJpbnRfYmFkX3B0ZSh2bWEsIGFkZHJlc3MsIG9yaWdfcHRlLCBOVUxMKTsKIAkJcmV0dXJuIFZNX0ZBVUxUX09PTTsKIAl9CiAKQEAgLTI5NTMsNyArMzAzOSw3IEBACiB7CiAJcmVzb3VyY2Vfc2l6ZV90IHBoeXNfYWRkcjsKIAl1bnNpZ25lZCBsb25nIHByb3QgPSAwOwotCXZvaWQgKm1hZGRyOworCXZvaWQgX19pb21lbSAqbWFkZHI7CiAJaW50IG9mZnNldCA9IGFkZHIgJiAoUEFHRV9TSVpFLTEpOwogCiAJaWYgKGZvbGxvd19waHlzKHZtYSwgYWRkciwgd3JpdGUsICZwcm90LCAmcGh5c19hZGRyKSkKZGlmZiAtLWdpdCBhL21tL21lbW9yeV9ob3RwbHVnLmMgYi9tbS9tZW1vcnlfaG90cGx1Zy5jCmluZGV4IGIxNzM3MTEuLmMwODNjZjUgMTAwNjQ0Ci0tLSBhL21tL21lbW9yeV9ob3RwbHVnLmMKKysrIGIvbW0vbWVtb3J5X2hvdHBsdWcuYwpAQCAtMjE2LDcgKzIxNiw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19tZW1pbml0IF9fYWRkX3NlY3Rpb24oc3RydWN0IHpvbmUgKnpvbmUsIHVuc2lnbmVkIGxvbmcgcGh5c19zdGFydF9wZm4pCitzdGF0aWMgaW50IF9fbWVtaW5pdCBfX2FkZF9zZWN0aW9uKGludCBuaWQsIHN0cnVjdCB6b25lICp6b25lLAorCQkJCQl1bnNpZ25lZCBsb25nIHBoeXNfc3RhcnRfcGZuKQogewogCWludCBucl9wYWdlcyA9IFBBR0VTX1BFUl9TRUNUSU9OOwogCWludCByZXQ7CkBAIC0yMzQsNyArMjM1LDcgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCXJldHVybiByZWdpc3Rlcl9uZXdfbWVtb3J5KF9fcGZuX3RvX3NlY3Rpb24ocGh5c19zdGFydF9wZm4pKTsKKwlyZXR1cm4gcmVnaXN0ZXJfbmV3X21lbW9yeShuaWQsIF9fcGZuX3RvX3NlY3Rpb24ocGh5c19zdGFydF9wZm4pKTsKIH0KIAogI2lmZGVmIENPTkZJR19TUEFSU0VNRU1fVk1FTU1BUApAQCAtMjczLDggKzI3NCw4IEBACiAgKiBjYWxsIHRoaXMgZnVuY3Rpb24gYWZ0ZXIgZGVjaWRpbmcgdGhlIHpvbmUgdG8gd2hpY2ggdG8KICAqIGFkZCB0aGUgbmV3IHBhZ2VzLgogICovCi1pbnQgX19yZWYgX19hZGRfcGFnZXMoc3RydWN0IHpvbmUgKnpvbmUsIHVuc2lnbmVkIGxvbmcgcGh5c19zdGFydF9wZm4sCi0JCSB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKQoraW50IF9fcmVmIF9fYWRkX3BhZ2VzKGludCBuaWQsIHN0cnVjdCB6b25lICp6b25lLCB1bnNpZ25lZCBsb25nIHBoeXNfc3RhcnRfcGZuLAorCQkJdW5zaWduZWQgbG9uZyBucl9wYWdlcykKIHsKIAl1bnNpZ25lZCBsb25nIGk7CiAJaW50IGVyciA9IDA7CkBAIC0yODQsNyArMjg1LDcgQEAKIAllbmRfc2VjID0gcGZuX3RvX3NlY3Rpb25fbnIocGh5c19zdGFydF9wZm4gKyBucl9wYWdlcyAtIDEpOwogCiAJZm9yIChpID0gc3RhcnRfc2VjOyBpIDw9IGVuZF9zZWM7IGkrKykgewotCQllcnIgPSBfX2FkZF9zZWN0aW9uKHpvbmUsIGkgPDwgUEZOX1NFQ1RJT05fU0hJRlQpOworCQllcnIgPSBfX2FkZF9zZWN0aW9uKG5pZCwgem9uZSwgaSA8PCBQRk5fU0VDVElPTl9TSElGVCk7CiAKIAkJLyoKIAkJICogRUVYSVNUIGlzIGZpbmFsbHkgZGVhbHQgd2l0aCBieSBpb3Jlc291cmNlIGNvbGxpc2lvbgpAQCAtNjI2LDE1ICs2MjcsMTIgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBwYWdlICoKLWhvdHJlbW92ZV9taWdyYXRlX2FsbG9jKHN0cnVjdCBwYWdlICpwYWdlLAotCQkJdW5zaWduZWQgbG9uZyBwcml2YXRlLAotCQkJaW50ICoqeCkKK2hvdHJlbW92ZV9taWdyYXRlX2FsbG9jKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIHByaXZhdGUsIGludCAqKngpCiB7Ci0JLyogVGhpcyBzaG91bGQgYmUgaW1wcm9vb29vb3ZlZCEhICovCi0JcmV0dXJuIGFsbG9jX3BhZ2UoR0ZQX0hJR0hVU0VSX1BBR0VDQUNIRSk7CisJLyogVGhpcyBzaG91bGQgYmUgaW1wcm9vb29vdmVkISEgKi8KKwlyZXR1cm4gYWxsb2NfcGFnZShHRlBfSElHSFVTRVJfTU9WQUJMRSk7CiB9CiAKLQogI2RlZmluZSBOUl9PRkZMSU5FX0FUX09OQ0VfUEFHRVMJKDI1NikKIHN0YXRpYyBpbnQKIGRvX21pZ3JhdGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbikKZGlmZiAtLWdpdCBhL21tL21pZ3JhdGUuYyBiL21tL21pZ3JhdGUuYwppbmRleCAyMTYzMWFiLi5hMzBlYTVmIDEwMDY0NAotLS0gYS9tbS9taWdyYXRlLmMKKysrIGIvbW0vbWlncmF0ZS5jCkBAIC0xMjEsMjAgKzEyMSw2IEBACiAJaWYgKCFpc19taWdyYXRpb25fZW50cnkoZW50cnkpIHx8IG1pZ3JhdGlvbl9lbnRyeV90b19wYWdlKGVudHJ5KSAhPSBvbGQpCiAJCWdvdG8gb3V0OwogCi0JLyoKLQkgKiBZZXMsIGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIGZyb20gYSBHRlBfQVRPTUlDIG1lbV9jZ3JvdXBfY2hhcmdlLgotCSAqIEZhaWx1cmUgaXMgbm90IGFuIG9wdGlvbiBoZXJlOiB3ZSdyZSBub3cgZXhwZWN0ZWQgdG8gcmVtb3ZlIGV2ZXJ5Ci0JICogbWlncmF0aW9uIHB0ZSwgYW5kIHdpbGwgY2F1c2UgY3Jhc2hlcyBvdGhlcndpc2UuICBOb3JtYWxseSB0aGlzCi0JICogaXMgbm90IGFuIGlzc3VlOiBtZW1fY2dyb3VwX3ByZXBhcmVfbWlncmF0aW9uIGJ1bXBlZCB1cCB0aGUgb2xkCi0JICogcGFnZV9jZ3JvdXAgY291bnQgZm9yIHNhZmV0eSwgdGhhdCdzIG5vdyBhdHRhY2hlZCB0byB0aGUgbmV3IHBhZ2UsCi0JICogc28gdGhpcyBjaGFyZ2Ugc2hvdWxkIGp1c3QgYmUgYW5vdGhlciBpbmNyZW1lbnRhdGlvbiBvZiB0aGUgY291bnQsCi0JICogdG8ga2VlcCBpbiBiYWxhbmNlIHdpdGggcm1hcC5jJ3MgbWVtX2Nncm91cF91bmNoYXJnaW5nLiAgQnV0IGlmCi0JICogdGhlcmUncyBiZWVuIGEgZm9yY2VfZW1wdHksIHRob3NlIHJlZmVyZW5jZSBjb3VudHMgbWF5IG5vIGxvbmdlcgotCSAqIGJlIHJlbGlhYmxlLCBhbmQgdGhpcyBjaGFyZ2UgY2FuIGFjdHVhbGx5IGZhaWw6IG9oIHdlbGwsIHdlIGRvbid0Ci0JICogbWFrZSB0aGUgc2l0dWF0aW9uIGFueSB3b3JzZSBieSBwcm9jZWVkaW5nIGFzIGlmIGl0IGhhZCBzdWNjZWVkZWQuCi0JICovCi0JbWVtX2Nncm91cF9jaGFyZ2UobmV3LCBtbSwgR0ZQX0FUT01JQyk7Ci0KIAlnZXRfcGFnZShuZXcpOwogCXB0ZSA9IHB0ZV9ta29sZChta19wdGUobmV3LCB2bWEtPnZtX3BhZ2VfcHJvdCkpOwogCWlmIChpc193cml0ZV9taWdyYXRpb25fZW50cnkoZW50cnkpKQpAQCAtMzAwLDEyICsyODYsMTAgQEAKIAkgKiBOb3cgd2Uga25vdyB0aGF0IG5vIG9uZSBlbHNlIGlzIGxvb2tpbmcgYXQgdGhlIHBhZ2UuCiAJICovCiAJZ2V0X3BhZ2UobmV3cGFnZSk7CS8qIGFkZCBjYWNoZSByZWZlcmVuY2UgKi8KLSNpZmRlZiBDT05GSUdfU1dBUAogCWlmIChQYWdlU3dhcENhY2hlKHBhZ2UpKSB7CiAJCVNldFBhZ2VTd2FwQ2FjaGUobmV3cGFnZSk7CiAJCXNldF9wYWdlX3ByaXZhdGUobmV3cGFnZSwgcGFnZV9wcml2YXRlKHBhZ2UpKTsKIAl9Ci0jZW5kaWYKIAogCXJhZGl4X3RyZWVfcmVwbGFjZV9zbG90KHBzbG90LCBuZXdwYWdlKTsKIApAQCAtMzczLDE4ICszNTcsMTMgQEAKIAogCW1sb2NrX21pZ3JhdGVfcGFnZShuZXdwYWdlLCBwYWdlKTsKIAotI2lmZGVmIENPTkZJR19TV0FQCiAJQ2xlYXJQYWdlU3dhcENhY2hlKHBhZ2UpOwotI2VuZGlmCiAJQ2xlYXJQYWdlUHJpdmF0ZShwYWdlKTsKIAlzZXRfcGFnZV9wcml2YXRlKHBhZ2UsIDApOwogCS8qIHBhZ2UtPm1hcHBpbmcgY29udGFpbnMgYSBmbGFnIGZvciBQYWdlQW5vbigpICovCiAJYW5vbiA9IFBhZ2VBbm9uKHBhZ2UpOwogCXBhZ2UtPm1hcHBpbmcgPSBOVUxMOwogCi0JaWYgKCFhbm9uKSAvKiBUaGlzIHBhZ2Ugd2FzIHJlbW92ZWQgZnJvbSByYWRpeC10cmVlLiAqLwotCQltZW1fY2dyb3VwX3VuY2hhcmdlX2NhY2hlX3BhZ2UocGFnZSk7Ci0KIAkvKgogCSAqIElmIGFueSB3YWl0ZXJzIGhhdmUgYWNjdW11bGF0ZWQgb24gdGhlIG5ldyBwYWdlIHRoZW4KIAkgKiB3YWtlIHRoZW0gdXAuCkBAIC02MTgsNiArNTk3LDcgQEAKIAlzdHJ1Y3QgcGFnZSAqbmV3cGFnZSA9IGdldF9uZXdfcGFnZShwYWdlLCBwcml2YXRlLCAmcmVzdWx0KTsKIAlpbnQgcmN1X2xvY2tlZCA9IDA7CiAJaW50IGNoYXJnZSA9IDA7CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbTsKIAogCWlmICghbmV3cGFnZSkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC02MjcsMjQgKzYwNywyNiBAQAogCQlnb3RvIG1vdmVfbmV3cGFnZTsKIAl9CiAKLQljaGFyZ2UgPSBtZW1fY2dyb3VwX3ByZXBhcmVfbWlncmF0aW9uKHBhZ2UsIG5ld3BhZ2UpOwotCWlmIChjaGFyZ2UgPT0gLUVOT01FTSkgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gbW92ZV9uZXdwYWdlOwotCX0KIAkvKiBwcmVwYXJlIGNncm91cCBqdXN0IHJldHVybnMgMCBvciAtRU5PTUVNICovCi0JQlVHX09OKGNoYXJnZSk7Ci0KIAlyYyA9IC1FQUdBSU47CisKIAlpZiAoIXRyeWxvY2tfcGFnZShwYWdlKSkgewogCQlpZiAoIWZvcmNlKQogCQkJZ290byBtb3ZlX25ld3BhZ2U7CiAJCWxvY2tfcGFnZShwYWdlKTsKIAl9CiAKKwkvKiBjaGFyZ2UgYWdhaW5zdCBuZXcgcGFnZSAqLworCWNoYXJnZSA9IG1lbV9jZ3JvdXBfcHJlcGFyZV9taWdyYXRpb24ocGFnZSwgJm1lbSk7CisJaWYgKGNoYXJnZSA9PSAtRU5PTUVNKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byB1bmxvY2s7CisJfQorCUJVR19PTihjaGFyZ2UpOworCiAJaWYgKFBhZ2VXcml0ZWJhY2socGFnZSkpIHsKIAkJaWYgKCFmb3JjZSkKLQkJCWdvdG8gdW5sb2NrOworCQkJZ290byB1bmNoYXJnZTsKIAkJd2FpdF9vbl9wYWdlX3dyaXRlYmFjayhwYWdlKTsKIAl9CiAJLyoKQEAgLTY5Nyw3ICs2NzksOSBAQAogcmN1X3VubG9jazoKIAlpZiAocmN1X2xvY2tlZCkKIAkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0KK3VuY2hhcmdlOgorCWlmICghY2hhcmdlKQorCQltZW1fY2dyb3VwX2VuZF9taWdyYXRpb24obWVtLCBwYWdlLCBuZXdwYWdlKTsKIHVubG9jazoKIAl1bmxvY2tfcGFnZShwYWdlKTsKIApAQCAtNzEzLDggKzY5Nyw2IEBACiAJfQogCiBtb3ZlX25ld3BhZ2U6Ci0JaWYgKCFjaGFyZ2UpCi0JCW1lbV9jZ3JvdXBfZW5kX21pZ3JhdGlvbihuZXdwYWdlKTsKIAogCS8qCiAJICogTW92ZSB0aGUgbmV3IHBhZ2UgdG8gdGhlIExSVS4gSWYgbWlncmF0aW9uIHdhcyBub3Qgc3VjY2Vzc2Z1bApAQCAtODQ4LDEyICs4MzAsNiBAQAogCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKIAkJc3RydWN0IHBhZ2UgKnBhZ2U7CiAKLQkJLyoKLQkJICogQSB2YWxpZCBwYWdlIHBvaW50ZXIgdGhhdCB3aWxsIG5vdCBtYXRjaCBhbnkgb2YgdGhlCi0JCSAqIHBhZ2VzIHRoYXQgd2lsbCBiZSBtb3ZlZC4KLQkJICovCi0JCXBwLT5wYWdlID0gWkVST19QQUdFKDApOwotCiAJCWVyciA9IC1FRkFVTFQ7CiAJCXZtYSA9IGZpbmRfdm1hKG1tLCBwcC0+YWRkcik7CiAJCWlmICghdm1hIHx8ICF2bWFfbWlncmF0YWJsZSh2bWEpKQpAQCAtOTE5LDQxICs4OTUsNDMgQEAKIAkJCSBjb25zdCBpbnQgX191c2VyICpub2RlcywKIAkJCSBpbnQgX191c2VyICpzdGF0dXMsIGludCBmbGFncykKIHsKLQlzdHJ1Y3QgcGFnZV90b19ub2RlICpwbSA9IE5VTEw7CisJc3RydWN0IHBhZ2VfdG9fbm9kZSAqcG07CiAJbm9kZW1hc2tfdCB0YXNrX25vZGVzOwotCWludCBlcnIgPSAwOwotCWludCBpOworCXVuc2lnbmVkIGxvbmcgY2h1bmtfbnJfcGFnZXM7CisJdW5zaWduZWQgbG9uZyBjaHVua19zdGFydDsKKwlpbnQgZXJyOwogCiAJdGFza19ub2RlcyA9IGNwdXNldF9tZW1zX2FsbG93ZWQodGFzayk7CiAKLQkvKiBMaW1pdCBucl9wYWdlcyBzbyB0aGF0IHRoZSBtdWx0aXBsaWNhdGlvbiBtYXkgbm90IG92ZXJmbG93ICovCi0JaWYgKG5yX3BhZ2VzID49IFVMT05HX01BWCAvIHNpemVvZihzdHJ1Y3QgcGFnZV90b19ub2RlKSAtIDEpIHsKLQkJZXJyID0gLUUyQklHOworCWVyciA9IC1FTk9NRU07CisJcG0gPSAoc3RydWN0IHBhZ2VfdG9fbm9kZSAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIXBtKQogCQlnb3RvIG91dDsKLQl9Ci0KLQlwbSA9IHZtYWxsb2MoKG5yX3BhZ2VzICsgMSkgKiBzaXplb2Yoc3RydWN0IHBhZ2VfdG9fbm9kZSkpOwotCWlmICghcG0pIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCiAJLyoKLQkgKiBHZXQgcGFyYW1ldGVycyBmcm9tIHVzZXIgc3BhY2UgYW5kIGluaXRpYWxpemUgdGhlIHBtCi0JICogYXJyYXkuIFJldHVybiB2YXJpb3VzIGVycm9ycyBpZiB0aGUgdXNlciBkaWQgc29tZXRoaW5nIHdyb25nLgorCSAqIFN0b3JlIGEgY2h1bmsgb2YgcGFnZV90b19ub2RlIGFycmF5IGluIGEgcGFnZSwKKwkgKiBidXQga2VlcCB0aGUgbGFzdCBvbmUgYXMgYSBtYXJrZXIKIAkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXM7IGkrKykgewotCQljb25zdCB2b2lkIF9fdXNlciAqcDsKKwljaHVua19ucl9wYWdlcyA9IChQQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IHBhZ2VfdG9fbm9kZSkpIC0gMTsKIAotCQllcnIgPSAtRUZBVUxUOwotCQlpZiAoZ2V0X3VzZXIocCwgcGFnZXMgKyBpKSkKLQkJCWdvdG8gb3V0X3BtOworCWZvciAoY2h1bmtfc3RhcnQgPSAwOworCSAgICAgY2h1bmtfc3RhcnQgPCBucl9wYWdlczsKKwkgICAgIGNodW5rX3N0YXJ0ICs9IGNodW5rX25yX3BhZ2VzKSB7CisJCWludCBqOwogCi0JCXBtW2ldLmFkZHIgPSAodW5zaWduZWQgbG9uZylwOwotCQlpZiAobm9kZXMpIHsKKwkJaWYgKGNodW5rX3N0YXJ0ICsgY2h1bmtfbnJfcGFnZXMgPiBucl9wYWdlcykKKwkJCWNodW5rX25yX3BhZ2VzID0gbnJfcGFnZXMgLSBjaHVua19zdGFydDsKKworCQkvKiBmaWxsIHRoZSBjaHVuayBwbSB3aXRoIGFkZHJzIGFuZCBub2RlcyBmcm9tIHVzZXItc3BhY2UgKi8KKwkJZm9yIChqID0gMDsgaiA8IGNodW5rX25yX3BhZ2VzOyBqKyspIHsKKwkJCWNvbnN0IHZvaWQgX191c2VyICpwOwogCQkJaW50IG5vZGU7CiAKLQkJCWlmIChnZXRfdXNlcihub2RlLCBub2RlcyArIGkpKQorCQkJZXJyID0gLUVGQVVMVDsKKwkJCWlmIChnZXRfdXNlcihwLCBwYWdlcyArIGogKyBjaHVua19zdGFydCkpCisJCQkJZ290byBvdXRfcG07CisJCQlwbVtqXS5hZGRyID0gKHVuc2lnbmVkIGxvbmcpIHA7CisKKwkJCWlmIChnZXRfdXNlcihub2RlLCBub2RlcyArIGogKyBjaHVua19zdGFydCkpCiAJCQkJZ290byBvdXRfcG07CiAKIAkJCWVyciA9IC1FTk9ERVY7CkBAIC05NjQsMjIgKzk0MiwyOSBAQAogCQkJaWYgKCFub2RlX2lzc2V0KG5vZGUsIHRhc2tfbm9kZXMpKQogCQkJCWdvdG8gb3V0X3BtOwogCi0JCQlwbVtpXS5ub2RlID0gbm9kZTsKLQkJfSBlbHNlCi0JCQlwbVtpXS5ub2RlID0gMDsJLyogYW55dGhpbmcgdG8gbm90IG1hdGNoIE1BWF9OVU1OT0RFUyAqLwotCX0KLQkvKiBFbmQgbWFya2VyICovCi0JcG1bbnJfcGFnZXNdLm5vZGUgPSBNQVhfTlVNTk9ERVM7CisJCQlwbVtqXS5ub2RlID0gbm9kZTsKKwkJfQogCi0JZXJyID0gZG9fbW92ZV9wYWdlX3RvX25vZGVfYXJyYXkobW0sIHBtLCBmbGFncyAmIE1QT0xfTUZfTU9WRV9BTEwpOwotCWlmIChlcnIgPj0gMCkKKwkJLyogRW5kIG1hcmtlciBmb3IgdGhpcyBjaHVuayAqLworCQlwbVtjaHVua19ucl9wYWdlc10ubm9kZSA9IE1BWF9OVU1OT0RFUzsKKworCQkvKiBNaWdyYXRlIHRoaXMgY2h1bmsgKi8KKwkJZXJyID0gZG9fbW92ZV9wYWdlX3RvX25vZGVfYXJyYXkobW0sIHBtLAorCQkJCQkJIGZsYWdzICYgTVBPTF9NRl9NT1ZFX0FMTCk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBvdXRfcG07CisKIAkJLyogUmV0dXJuIHN0YXR1cyBpbmZvcm1hdGlvbiAqLwotCQlmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXM7IGkrKykKLQkJCWlmIChwdXRfdXNlcihwbVtpXS5zdGF0dXMsIHN0YXR1cyArIGkpKQorCQlmb3IgKGogPSAwOyBqIDwgY2h1bmtfbnJfcGFnZXM7IGorKykKKwkJCWlmIChwdXRfdXNlcihwbVtqXS5zdGF0dXMsIHN0YXR1cyArIGogKyBjaHVua19zdGFydCkpIHsKIAkJCQllcnIgPSAtRUZBVUxUOworCQkJCWdvdG8gb3V0X3BtOworCQkJfQorCX0KKwllcnIgPSAwOwogCiBvdXRfcG06Ci0JdmZyZWUocG0pOworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwbSk7CiBvdXQ6CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL21tL21sb2NrLmMgYi9tbS9tbG9jay5jCmluZGV4IDMwMzVhNTYuLmUxMjUxNTYgMTAwNjQ0Ci0tLSBhL21tL21sb2NrLmMKKysrIGIvbW0vbWxvY2suYwpAQCAtMTczLDEyICsxNzMsMTMgQEAKIAkJICAoYXRvbWljX3JlYWQoJm1tLT5tbV91c2VycykgIT0gMCkpOwogCiAJLyoKLQkgKiBtbG9jazogICBkb24ndCBwYWdlIHBvcHVsYXRlIGlmIHBhZ2UgaGFzIFBST1RfTk9ORSBwZXJtaXNzaW9uLgotCSAqIG11bmxvY2s6IHRoZSBwYWdlcyBhbHdheXMgZG8gbXVubG9jayBhbHRocm91Z2gKLQkgKiAgICAgICAgICBpdHMgaGFzIFBST1RfTk9ORSBwZXJtaXNzaW9uLgorCSAqIG1sb2NrOiAgIGRvbid0IHBhZ2UgcG9wdWxhdGUgaWYgdm1hIGhhcyBQUk9UX05PTkUgcGVybWlzc2lvbi4KKwkgKiBtdW5sb2NrOiBhbHdheXMgZG8gbXVubG9jayBhbHRob3VnaCB0aGUgdm1hIGhhcyBQUk9UX05PTkUKKwkgKiAgICAgICAgICBwZXJtaXNzaW9uLCBvciBTSUdLSUxMIGlzIHBlbmRpbmcuCiAJICovCiAJaWYgKCFtbG9jaykKLQkJZ3VwX2ZsYWdzIHw9IEdVUF9GTEFHU19JR05PUkVfVk1BX1BFUk1JU1NJT05TOworCQlndXBfZmxhZ3MgfD0gR1VQX0ZMQUdTX0lHTk9SRV9WTUFfUEVSTUlTU0lPTlMgfAorCQkJICAgICBHVVBfRkxBR1NfSUdOT1JFX1NJR0tJTEw7CiAKIAlpZiAodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKQogCQlndXBfZmxhZ3MgfD0gR1VQX0ZMQUdTX1dSSVRFOwpkaWZmIC0tZ2l0IGEvbW0vbW1hcC5jIGIvbW0vbW1hcC5jCmluZGV4IGQ0ODU1YTYuLmE5MTBjMDQ1IDEwMDY0NAotLS0gYS9tbS9tbWFwLmMKKysrIGIvbW0vbW1hcC5jCkBAIC0zLDcgKzMsNyBAQAogICoKICAqIFdyaXR0ZW4gYnkgb2J6LgogICoKLSAqIEFkZHJlc3Mgc3BhY2UgYWNjb3VudGluZyBjb2RlCTxhbGFuQHJlZGhhdC5jb20+CisgKiBBZGRyZXNzIHNwYWNlIGFjY291bnRpbmcgY29kZQk8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgogICovCiAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC00MTMsNyArNDEzLDcgQEAKIAogc3RhdGljIHZvaWQgX192bWFfbGlua19maWxlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewotCXN0cnVjdCBmaWxlICogZmlsZTsKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKIAogCWZpbGUgPSB2bWEtPnZtX2ZpbGU7CiAJaWYgKGZpbGUpIHsKQEAgLTQ3NCwxMSArNDc0LDEwIEBACiAgKiBpbnNlcnQgdm0gc3RydWN0dXJlIGludG8gbGlzdCBhbmQgcmJ0cmVlIGFuZCBhbm9uX3ZtYSwKICAqIGJ1dCBpdCBoYXMgYWxyZWFkeSBiZWVuIGluc2VydGVkIGludG8gcHJpb190cmVlIGVhcmxpZXIuCiAgKi8KLXN0YXRpYyB2b2lkCi1fX2luc2VydF92bV9zdHJ1Y3Qoc3RydWN0IG1tX3N0cnVjdCAqIG1tLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWEpCitzdGF0aWMgdm9pZCBfX2luc2VydF92bV9zdHJ1Y3Qoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewotCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIF9fdm1hLCAqIHByZXY7Ci0Jc3RydWN0IHJiX25vZGUgKiogcmJfbGluaywgKiByYl9wYXJlbnQ7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICpfX3ZtYSwgKnByZXY7CisJc3RydWN0IHJiX25vZGUgKipyYl9saW5rLCAqcmJfcGFyZW50OwogCiAJX192bWEgPSBmaW5kX3ZtYV9wcmVwYXJlKG1tLCB2bWEtPnZtX3N0YXJ0LCZwcmV2LCAmcmJfbGluaywgJnJiX3BhcmVudCk7CiAJQlVHX09OKF9fdm1hICYmIF9fdm1hLT52bV9zdGFydCA8IHZtYS0+dm1fZW5kKTsKQEAgLTkwOCw3ICs5MDcsNyBAQAogICogVGhlIGNhbGxlciBtdXN0IGhvbGQgZG93bl93cml0ZShjdXJyZW50LT5tbS0+bW1hcF9zZW0pLgogICovCiAKLXVuc2lnbmVkIGxvbmcgZG9fbW1hcF9wZ29mZihzdHJ1Y3QgZmlsZSAqIGZpbGUsIHVuc2lnbmVkIGxvbmcgYWRkciwKK3Vuc2lnbmVkIGxvbmcgZG9fbW1hcF9wZ29mZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgbG9uZyBhZGRyLAogCQkJdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgcHJvdCwKIAkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgcGdvZmYpCiB7CkBAIC0xNDY0LDcgKzE0NjMsNyBAQAogRVhQT1JUX1NZTUJPTChnZXRfdW5tYXBwZWRfYXJlYSk7CiAKIC8qIExvb2sgdXAgdGhlIGZpcnN0IFZNQSB3aGljaCBzYXRpc2ZpZXMgIGFkZHIgPCB2bV9lbmQsICBOVUxMIGlmIG5vbmUuICovCi1zdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiBmaW5kX3ZtYShzdHJ1Y3QgbW1fc3RydWN0ICogbW0sIHVuc2lnbmVkIGxvbmcgYWRkcikKK3N0cnVjdCB2bV9hcmVhX3N0cnVjdCAqZmluZF92bWEoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IE5VTEw7CiAKQEAgLTE1MDcsNyArMTUwNiw3IEBACiAJCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKipwcHJldikKIHsKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IE5VTEwsICpwcmV2ID0gTlVMTDsKLQlzdHJ1Y3QgcmJfbm9kZSAqIHJiX25vZGU7CisJc3RydWN0IHJiX25vZGUgKnJiX25vZGU7CiAJaWYgKCFtbSkKIAkJZ290byBvdXQ7CiAKQEAgLTE1NDEsNyArMTU0MCw3IEBACiAgKiB1cGRhdGUgYWNjb3VudGluZy4gVGhpcyBpcyBzaGFyZWQgd2l0aCBib3RoIHRoZQogICogZ3Jvdy11cCBhbmQgZ3Jvdy1kb3duIGNhc2VzLgogICovCi1zdGF0aWMgaW50IGFjY3Rfc3RhY2tfZ3Jvd3RoKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYSwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGdyb3cpCitzdGF0aWMgaW50IGFjY3Rfc3RhY2tfZ3Jvd3RoKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZ3JvdykKIHsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS0+dm1fbW07CiAJc3RydWN0IHJsaW1pdCAqcmxpbSA9IGN1cnJlbnQtPnNpZ25hbC0+cmxpbTsKQEAgLTIwOTEsNiArMjA5MCw5IEBACiAJYXJjaF9leGl0X21tYXAobW0pOwogCW1tdV9ub3RpZmllcl9yZWxlYXNlKG1tKTsKIAorCWlmICghbW0tPm1tYXApCS8qIENhbiBoYXBwZW4gaWYgZHVwX21tYXAoKSByZWNlaXZlZCBhbiBPT00gKi8KKwkJcmV0dXJuOworCiAJaWYgKG1tLT5sb2NrZWRfdm0pIHsKIAkJdm1hID0gbW0tPm1tYXA7CiAJCXdoaWxlICh2bWEpIHsKQEAgLTIxMDMsNyArMjEwNSw3IEBACiAJbHJ1X2FkZF9kcmFpbigpOwogCWZsdXNoX2NhY2hlX21tKG1tKTsKIAl0bGIgPSB0bGJfZ2F0aGVyX21tdShtbSwgMSk7Ci0JLyogRG9uJ3QgdXBkYXRlX2hpd2F0ZXJfcnNzKG1tKSBoZXJlLCBkb19leGl0IGFscmVhZHkgZGlkICovCisJLyogdXBkYXRlX2hpd2F0ZXJfcnNzKG1tKSBoZXJlPyBidXQgbm9ib2R5IHNob3VsZCBiZSBsb29raW5nICovCiAJLyogVXNlIC0xIGhlcmUgdG8gZW5zdXJlIGFsbCBWTUFzIGluIHRoZSBtbSBhcmUgdW5tYXBwZWQgKi8KIAllbmQgPSB1bm1hcF92bWFzKCZ0bGIsIHZtYSwgMCwgLTEsICZucl9hY2NvdW50ZWQsIE5VTEwpOwogCXZtX3VuYWNjdF9tZW1vcnkobnJfYWNjb3VudGVkKTsKZGlmZiAtLWdpdCBhL21tL21wcm90ZWN0LmMgYi9tbS9tcHJvdGVjdC5jCmluZGV4IGZkZWQwNmYuLmQwZjZlN2MgMTAwNjQ0Ci0tLSBhL21tL21wcm90ZWN0LmMKKysrIGIvbW0vbXByb3RlY3QuYwpAQCAtNCw3ICs0LDcgQEAKICAqICAoQykgQ29weXJpZ2h0IDE5OTQgTGludXMgVG9ydmFsZHMKICAqICAoQykgQ29weXJpZ2h0IDIwMDIgQ2hyaXN0b3BoIEhlbGx3aWcKICAqCi0gKiAgQWRkcmVzcyBzcGFjZSBhY2NvdW50aW5nIGNvZGUJPGFsYW5AcmVkaGF0LmNvbT4KKyAqICBBZGRyZXNzIHNwYWNlIGFjY291bnRpbmcgY29kZQk8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgogICogIChDKSBDb3B5cmlnaHQgMjAwMiBSZWQgSGF0IEluYywgQWxsIFJpZ2h0cyBSZXNlcnZlZAogICovCiAKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8bGludXgvc3dhcG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L21tdV9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L21pZ3JhdGUuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KQEAgLTU5LDggKzYwLDcgQEAKIAkJCQlwdGVudCA9IHB0ZV9ta3dyaXRlKHB0ZW50KTsKIAogCQkJcHRlcF9tb2RpZnlfcHJvdF9jb21taXQobW0sIGFkZHIsIHB0ZSwgcHRlbnQpOwotI2lmZGVmIENPTkZJR19NSUdSQVRJT04KLQkJfSBlbHNlIGlmICghcHRlX2ZpbGUob2xkcHRlKSkgeworCQl9IGVsc2UgaWYgKFBBR0VfTUlHUkFUSU9OICYmICFwdGVfZmlsZShvbGRwdGUpKSB7CiAJCQlzd3BfZW50cnlfdCBlbnRyeSA9IHB0ZV90b19zd3BfZW50cnkob2xkcHRlKTsKIAogCQkJaWYgKGlzX3dyaXRlX21pZ3JhdGlvbl9lbnRyeShlbnRyeSkpIHsKQEAgLTcyLDkgKzcyLDcgQEAKIAkJCQlzZXRfcHRlX2F0KG1tLCBhZGRyLCBwdGUsCiAJCQkJCXN3cF9lbnRyeV90b19wdGUoZW50cnkpKTsKIAkJCX0KLSNlbmRpZgogCQl9Ci0KIAl9IHdoaWxlIChwdGUrKywgYWRkciArPSBQQUdFX1NJWkUsIGFkZHIgIT0gZW5kKTsKIAlhcmNoX2xlYXZlX2xhenlfbW11X21vZGUoKTsKIAlwdGVfdW5tYXBfdW5sb2NrKHB0ZSAtIDEsIHB0bCk7CmRpZmYgLS1naXQgYS9tbS9tcmVtYXAuYyBiL21tL21yZW1hcC5jCmluZGV4IDU4YTI5MDguLjY0NmRlOTUgMTAwNjQ0Ci0tLSBhL21tL21yZW1hcC5jCisrKyBiL21tL21yZW1hcC5jCkBAIC0zLDcgKzMsNyBAQAogICoKICAqCShDKSBDb3B5cmlnaHQgMTk5NiBMaW51cyBUb3J2YWxkcwogICoKLSAqCUFkZHJlc3Mgc3BhY2UgYWNjb3VudGluZyBjb2RlCTxhbGFuQHJlZGhhdC5jb20+CisgKglBZGRyZXNzIHNwYWNlIGFjY291bnRpbmcgY29kZQk8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgogICoJKEMpIENvcHlyaWdodCAyMDAyIFJlZCBIYXQgSW5jLCBBbGwgUmlnaHRzIFJlc2VydmVkCiAgKi8KIApkaWZmIC0tZ2l0IGEvbW0vbXN5bmMuYyBiL21tL21zeW5jLmMKaW5kZXggMTQ0YTc1Ny4uMDdkYWUwOCAxMDA2NDQKLS0tIGEvbW0vbXN5bmMuYworKysgYi9tbS9tc3luYy5jCkBAIC04Miw3ICs4Miw3IEBACiAJCQkJKHZtYS0+dm1fZmxhZ3MgJiBWTV9TSEFSRUQpKSB7CiAJCQlnZXRfZmlsZShmaWxlKTsKIAkJCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7Ci0JCQllcnJvciA9IGRvX2ZzeW5jKGZpbGUsIDApOworCQkJZXJyb3IgPSB2ZnNfZnN5bmMoZmlsZSwgZmlsZS0+Zl9wYXRoLmRlbnRyeSwgMCk7CiAJCQlmcHV0KGZpbGUpOwogCQkJaWYgKGVycm9yIHx8IHN0YXJ0ID49IGVuZCkKIAkJCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL21tL25vbW11LmMgYi9tbS9ub21tdS5jCmluZGV4IDc2OTVkYzguLjFjMjhlYTMgMTAwNjQ0Ci0tLSBhL21tL25vbW11LmMKKysrIGIvbW0vbm9tbXUuYwpAQCAtODYsNyArODYsNyBAQAogCWlfc2l6ZV93cml0ZShpbm9kZSwgb2Zmc2V0KTsKIAogb3V0X3RydW5jYXRlOgotCWlmIChpbm9kZS0+aV9vcCAmJiBpbm9kZS0+aV9vcC0+dHJ1bmNhdGUpCisJaWYgKGlub2RlLT5pX29wLT50cnVuY2F0ZSkKIAkJaW5vZGUtPmlfb3AtPnRydW5jYXRlKGlub2RlKTsKIAlyZXR1cm4gMDsKIG91dF9zaWc6CmRpZmYgLS1naXQgYS9tbS9vb21fa2lsbC5jIGIvbW0vb29tX2tpbGwuYwppbmRleCA1NThmOWFmLi40MGJhMDUwIDEwMDY0NAotLS0gYS9tbS9vb21fa2lsbC5jCisrKyBiL21tL29vbV9raWxsLmMKQEAgLTMxLDcgKzMxLDcgQEAKIGludCBzeXNjdGxfcGFuaWNfb25fb29tOwogaW50IHN5c2N0bF9vb21fa2lsbF9hbGxvY2F0aW5nX3Rhc2s7CiBpbnQgc3lzY3RsX29vbV9kdW1wX3Rhc2tzOwotc3RhdGljIERFRklORV9TUElOTE9DSyh6b25lX3NjYW5fbXV0ZXgpOworc3RhdGljIERFRklORV9TUElOTE9DSyh6b25lX3NjYW5fbG9jayk7CiAvKiAjZGVmaW5lIERFQlVHICovCiAKIC8qKgpAQCAtMzkyLDYgKzM5Miw5IEBACiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzIGludm9rZWQgb29tLWtpbGxlcjogIgogCQkJImdmcF9tYXNrPTB4JXgsIG9yZGVyPSVkLCBvb21raWxsYWRqPSVkXG4iLAogCQkJY3VycmVudC0+Y29tbSwgZ2ZwX21hc2ssIG9yZGVyLCBjdXJyZW50LT5vb21raWxsYWRqKTsKKwkJdGFza19sb2NrKGN1cnJlbnQpOworCQljcHVzZXRfcHJpbnRfdGFza19tZW1zX2FsbG93ZWQoY3VycmVudCk7CisJCXRhc2tfdW5sb2NrKGN1cnJlbnQpOwogCQlkdW1wX3N0YWNrKCk7CiAJCXNob3dfbWVtKCk7CiAJCWlmIChzeXNjdGxfb29tX2R1bXBfdGFza3MpCkBAIC00MjYsNyArNDI5LDYgQEAKIAl1bnNpZ25lZCBsb25nIHBvaW50cyA9IDA7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpwOwogCi0JY2dyb3VwX2xvY2soKTsKIAlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwogcmV0cnk6CiAJcCA9IHNlbGVjdF9iYWRfcHJvY2VzcygmcG9pbnRzLCBtZW0pOwpAQCAtNDQxLDcgKzQ0Myw2IEBACiAJCWdvdG8gcmV0cnk7CiBvdXQ6CiAJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwotCWNncm91cF91bmxvY2soKTsKIH0KICNlbmRpZgogCkBAIC00NzAsNyArNDcxLDcgQEAKIAlzdHJ1Y3Qgem9uZSAqem9uZTsKIAlpbnQgcmV0ID0gMTsKIAotCXNwaW5fbG9jaygmem9uZV9zY2FuX211dGV4KTsKKwlzcGluX2xvY2soJnpvbmVfc2Nhbl9sb2NrKTsKIAlmb3JfZWFjaF96b25lX3pvbmVsaXN0KHpvbmUsIHosIHpvbmVsaXN0LCBnZnBfem9uZShnZnBfbWFzaykpIHsKIAkJaWYgKHpvbmVfaXNfb29tX2xvY2tlZCh6b25lKSkgewogCQkJcmV0ID0gMDsKQEAgLTQ4MCw3ICs0ODEsNyBAQAogCiAJZm9yX2VhY2hfem9uZV96b25lbGlzdCh6b25lLCB6LCB6b25lbGlzdCwgZ2ZwX3pvbmUoZ2ZwX21hc2spKSB7CiAJCS8qCi0JCSAqIExvY2sgZWFjaCB6b25lIGluIHRoZSB6b25lbGlzdCB1bmRlciB6b25lX3NjYW5fbXV0ZXggc28gYQorCQkgKiBMb2NrIGVhY2ggem9uZSBpbiB0aGUgem9uZWxpc3QgdW5kZXIgem9uZV9zY2FuX2xvY2sgc28gYQogCQkgKiBwYXJhbGxlbCBpbnZvY2F0aW9uIG9mIHRyeV9zZXRfem9uZV9vb20oKSBkb2Vzbid0IHN1Y2NlZWQKIAkJICogd2hlbiBpdCBzaG91bGRuJ3QuCiAJCSAqLwpAQCAtNDg4LDcgKzQ4OSw3IEBACiAJfQogCiBvdXQ6Ci0Jc3Bpbl91bmxvY2soJnpvbmVfc2Nhbl9tdXRleCk7CisJc3Bpbl91bmxvY2soJnpvbmVfc2Nhbl9sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC01MDIsMTEgKzUwMyw4MiBAQAogCXN0cnVjdCB6b25lcmVmICp6OwogCXN0cnVjdCB6b25lICp6b25lOwogCi0Jc3Bpbl9sb2NrKCZ6b25lX3NjYW5fbXV0ZXgpOworCXNwaW5fbG9jaygmem9uZV9zY2FuX2xvY2spOwogCWZvcl9lYWNoX3pvbmVfem9uZWxpc3Qoem9uZSwgeiwgem9uZWxpc3QsIGdmcF96b25lKGdmcF9tYXNrKSkgewogCQl6b25lX2NsZWFyX2ZsYWcoem9uZSwgWk9ORV9PT01fTE9DS0VEKTsKIAl9Ci0Jc3Bpbl91bmxvY2soJnpvbmVfc2Nhbl9tdXRleCk7CisJc3Bpbl91bmxvY2soJnpvbmVfc2Nhbl9sb2NrKTsKK30KKworLyoKKyAqIE11c3QgYmUgY2FsbGVkIHdpdGggdGFza2xpc3RfbG9jayBoZWxkIGZvciByZWFkLgorICovCitzdGF0aWMgdm9pZCBfX291dF9vZl9tZW1vcnkoZ2ZwX3QgZ2ZwX21hc2ssIGludCBvcmRlcikKK3sKKwlpZiAoc3lzY3RsX29vbV9raWxsX2FsbG9jYXRpbmdfdGFzaykgeworCQlvb21fa2lsbF9wcm9jZXNzKGN1cnJlbnQsIGdmcF9tYXNrLCBvcmRlciwgMCwgTlVMTCwKKwkJCQkiT3V0IG9mIG1lbW9yeSAob29tX2tpbGxfYWxsb2NhdGluZ190YXNrKSIpOworCisJfSBlbHNlIHsKKwkJdW5zaWduZWQgbG9uZyBwb2ludHM7CisJCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKKworcmV0cnk6CisJCS8qCisJCSAqIFJhbWJvIG1vZGU6IFNob290IGRvd24gYSBwcm9jZXNzIGFuZCBob3BlIGl0IHNvbHZlcyB3aGF0ZXZlcgorCQkgKiBpc3N1ZXMgd2UgbWF5IGhhdmUuCisJCSAqLworCQlwID0gc2VsZWN0X2JhZF9wcm9jZXNzKCZwb2ludHMsIE5VTEwpOworCisJCWlmIChQVFJfRVJSKHApID09IC0xVUwpCisJCQlyZXR1cm47CisKKwkJLyogRm91bmQgbm90aGluZz8hPyEgRWl0aGVyIHdlIGhhbmcgZm9yZXZlciwgb3Igd2UgcGFuaWMuICovCisJCWlmICghcCkgeworCQkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCQkJcGFuaWMoIk91dCBvZiBtZW1vcnkgYW5kIG5vIGtpbGxhYmxlIHByb2Nlc3Nlcy4uLlxuIik7CisJCX0KKworCQlpZiAob29tX2tpbGxfcHJvY2VzcyhwLCBnZnBfbWFzaywgb3JkZXIsIHBvaW50cywgTlVMTCwKKwkJCQkgICAgICJPdXQgb2YgbWVtb3J5IikpCisJCQlnb3RvIHJldHJ5OworCX0KK30KKworLyoKKyAqIHBhZ2VmYXVsdCBoYW5kbGVyIGNhbGxzIGludG8gaGVyZSBiZWNhdXNlIGl0IGlzIG91dCBvZiBtZW1vcnkgYnV0CisgKiBkb2Vzbid0IGtub3cgZXhhY3RseSBob3cgb3Igd2h5LgorICovCit2b2lkIHBhZ2VmYXVsdF9vdXRfb2ZfbWVtb3J5KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmcmVlZCA9IDA7CisKKwlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZvb21fbm90aWZ5X2xpc3QsIDAsICZmcmVlZCk7CisJaWYgKGZyZWVkID4gMCkKKwkJLyogR290IHNvbWUgbWVtb3J5IGJhY2sgaW4gdGhlIGxhc3Qgc2Vjb25kLiAqLworCQlyZXR1cm47CisKKwkvKgorCSAqIElmIHRoaXMgaXMgZnJvbSBtZW1jZywgb29tLWtpbGxlciBpcyBhbHJlYWR5IGludm9rZWQuCisJICogYW5kIG5vdCB3b3J0aCB0byBnbyBzeXN0ZW0td2lkZS1vb20uCisJICovCisJaWYgKG1lbV9jZ3JvdXBfb29tX2NhbGxlZChjdXJyZW50KSkKKwkJZ290byByZXN0X2FuZF9yZXR1cm47CisKKwlpZiAoc3lzY3RsX3BhbmljX29uX29vbSkKKwkJcGFuaWMoIm91dCBvZiBtZW1vcnkgZnJvbSBwYWdlIGZhdWx0LiBwYW5pY19vbl9vb20gaXMgc2VsZWN0ZWQuXG4iKTsKKworCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CisJX19vdXRfb2ZfbWVtb3J5KDAsIDApOyAvKiB1bmtub3duIGdmcF9tYXNrIGFuZCBvcmRlciAqLworCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKworCS8qCisJICogR2l2ZSAicCIgYSBnb29kIGNoYW5jZSBvZiBraWxsaW5nIGl0c2VsZiBiZWZvcmUgd2UKKwkgKiByZXRyeSB0byBhbGxvY2F0ZSBtZW1vcnkuCisJICovCityZXN0X2FuZF9yZXR1cm46CisJaWYgKCF0ZXN0X3RocmVhZF9mbGFnKFRJRl9NRU1ESUUpKQorCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKIH0KIAogLyoqCkBAIC01MjIsOCArNTk0LDYgQEAKICAqLwogdm9pZCBvdXRfb2ZfbWVtb3J5KHN0cnVjdCB6b25lbGlzdCAqem9uZWxpc3QsIGdmcF90IGdmcF9tYXNrLCBpbnQgb3JkZXIpCiB7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICpwOwotCXVuc2lnbmVkIGxvbmcgcG9pbnRzID0gMDsKIAl1bnNpZ25lZCBsb25nIGZyZWVkID0gMDsKIAllbnVtIG9vbV9jb25zdHJhaW50IGNvbnN0cmFpbnQ7CiAKQEAgLTU0NCw3ICs2MTQsNyBAQAogCiAJc3dpdGNoIChjb25zdHJhaW50KSB7CiAJY2FzZSBDT05TVFJBSU5UX01FTU9SWV9QT0xJQ1k6Ci0JCW9vbV9raWxsX3Byb2Nlc3MoY3VycmVudCwgZ2ZwX21hc2ssIG9yZGVyLCBwb2ludHMsIE5VTEwsCisJCW9vbV9raWxsX3Byb2Nlc3MoY3VycmVudCwgZ2ZwX21hc2ssIG9yZGVyLCAwLCBOVUxMLAogCQkJCSJObyBhdmFpbGFibGUgbWVtb3J5IChNUE9MX0JJTkQpIik7CiAJCWJyZWFrOwogCkBAIC01NTMsMzUgKzYyMywxMCBAQAogCQkJcGFuaWMoIm91dCBvZiBtZW1vcnkuIHBhbmljX29uX29vbSBpcyBzZWxlY3RlZFxuIik7CiAJCS8qIEZhbGwtdGhyb3VnaCAqLwogCWNhc2UgQ09OU1RSQUlOVF9DUFVTRVQ6Ci0JCWlmIChzeXNjdGxfb29tX2tpbGxfYWxsb2NhdGluZ190YXNrKSB7Ci0JCQlvb21fa2lsbF9wcm9jZXNzKGN1cnJlbnQsIGdmcF9tYXNrLCBvcmRlciwgcG9pbnRzLCBOVUxMLAotCQkJCQkiT3V0IG9mIG1lbW9yeSAob29tX2tpbGxfYWxsb2NhdGluZ190YXNrKSIpOwotCQkJYnJlYWs7Ci0JCX0KLXJldHJ5OgotCQkvKgotCQkgKiBSYW1ibyBtb2RlOiBTaG9vdCBkb3duIGEgcHJvY2VzcyBhbmQgaG9wZSBpdCBzb2x2ZXMgd2hhdGV2ZXIKLQkJICogaXNzdWVzIHdlIG1heSBoYXZlLgotCQkgKi8KLQkJcCA9IHNlbGVjdF9iYWRfcHJvY2VzcygmcG9pbnRzLCBOVUxMKTsKLQotCQlpZiAoUFRSX0VSUihwKSA9PSAtMVVMKQotCQkJZ290byBvdXQ7Ci0KLQkJLyogRm91bmQgbm90aGluZz8hPyEgRWl0aGVyIHdlIGhhbmcgZm9yZXZlciwgb3Igd2UgcGFuaWMuICovCi0JCWlmICghcCkgewotCQkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwotCQkJcGFuaWMoIk91dCBvZiBtZW1vcnkgYW5kIG5vIGtpbGxhYmxlIHByb2Nlc3Nlcy4uLlxuIik7Ci0JCX0KLQotCQlpZiAob29tX2tpbGxfcHJvY2VzcyhwLCBnZnBfbWFzaywgb3JkZXIsIHBvaW50cywgTlVMTCwKLQkJCQkgICAgICJPdXQgb2YgbWVtb3J5IikpCi0JCQlnb3RvIHJldHJ5OwotCisJCV9fb3V0X29mX21lbW9yeShnZnBfbWFzaywgb3JkZXIpOwogCQlicmVhazsKIAl9CiAKLW91dDoKIAlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvbW0vcGFnZS13cml0ZWJhY2suYyBiL21tL3BhZ2Utd3JpdGViYWNrLmMKaW5kZXggMjk3MGUzNS4uYjQ5M2RiNyAxMDA2NDQKLS0tIGEvbW0vcGFnZS13cml0ZWJhY2suYworKysgYi9tbS9wYWdlLXdyaXRlYmFjay5jCkBAIC02OSw2ICs2OSwxMiBAQAogaW50IGRpcnR5X2JhY2tncm91bmRfcmF0aW8gPSA1OwogCiAvKgorICogZGlydHlfYmFja2dyb3VuZF9ieXRlcyBzdGFydHMgYXQgMCAoZGlzYWJsZWQpIHNvIHRoYXQgaXQgaXMgYSBmdW5jdGlvbiBvZgorICogZGlydHlfYmFja2dyb3VuZF9yYXRpbyAqIHRoZSBhbW91bnQgb2YgZGlydHlhYmxlIG1lbW9yeQorICovCit1bnNpZ25lZCBsb25nIGRpcnR5X2JhY2tncm91bmRfYnl0ZXM7CisKKy8qCiAgKiBmcmVlIGhpZ2htZW0gd2lsbCBub3QgYmUgc3VidHJhY3RlZCBmcm9tIHRoZSB0b3RhbCBmcmVlIG1lbW9yeQogICogZm9yIGNhbGN1bGF0aW5nIGZyZWUgcmF0aW9zIGlmIHZtX2hpZ2htZW1faXNfZGlydHlhYmxlIGlzIHRydWUKICAqLwpAQCAtODAsNiArODYsMTIgQEAKIGludCB2bV9kaXJ0eV9yYXRpbyA9IDEwOwogCiAvKgorICogdm1fZGlydHlfYnl0ZXMgc3RhcnRzIGF0IDAgKGRpc2FibGVkKSBzbyB0aGF0IGl0IGlzIGEgZnVuY3Rpb24gb2YKKyAqIHZtX2RpcnR5X3JhdGlvICogdGhlIGFtb3VudCBvZiBkaXJ0eWFibGUgbWVtb3J5CisgKi8KK3Vuc2lnbmVkIGxvbmcgdm1fZGlydHlfYnl0ZXM7CisKKy8qCiAgKiBUaGUgaW50ZXJ2YWwgYmV0d2VlbiBga3VwZGF0ZSctc3R5bGUgd3JpdGViYWNrcywgaW4gamlmZmllcwogICovCiBpbnQgZGlydHlfd3JpdGViYWNrX2ludGVydmFsID0gNSAqIEhaOwpAQCAtMTM1LDIzICsxNDcsNzUgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGRpcnR5X3RvdGFsOwogCi0JZGlydHlfdG90YWwgPSAodm1fZGlydHlfcmF0aW8gKiBkZXRlcm1pbmVfZGlydHlhYmxlX21lbW9yeSgpKSAvIDEwMDsKKwlpZiAodm1fZGlydHlfYnl0ZXMpCisJCWRpcnR5X3RvdGFsID0gdm1fZGlydHlfYnl0ZXMgLyBQQUdFX1NJWkU7CisJZWxzZQorCQlkaXJ0eV90b3RhbCA9ICh2bV9kaXJ0eV9yYXRpbyAqIGRldGVybWluZV9kaXJ0eWFibGVfbWVtb3J5KCkpIC8KKwkJCQkxMDA7CiAJcmV0dXJuIDIgKyBpbG9nMihkaXJ0eV90b3RhbCAtIDEpOwogfQogCiAvKgotICogdXBkYXRlIHRoZSBwZXJpb2Qgd2hlbiB0aGUgZGlydHkgcmF0aW8gY2hhbmdlcy4KKyAqIHVwZGF0ZSB0aGUgcGVyaW9kIHdoZW4gdGhlIGRpcnR5IHRocmVzaG9sZCBjaGFuZ2VzLgogICovCitzdGF0aWMgdm9pZCB1cGRhdGVfY29tcGxldGlvbl9wZXJpb2Qodm9pZCkKK3sKKwlpbnQgc2hpZnQgPSBjYWxjX3BlcmlvZF9zaGlmdCgpOworCXByb3BfY2hhbmdlX3NoaWZ0KCZ2bV9jb21wbGV0aW9ucywgc2hpZnQpOworCXByb3BfY2hhbmdlX3NoaWZ0KCZ2bV9kaXJ0aWVzLCBzaGlmdCk7Cit9CisKK2ludCBkaXJ0eV9iYWNrZ3JvdW5kX3JhdGlvX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKKwkJc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwKKwkJbG9mZl90ICpwcG9zKQoreworCWludCByZXQ7CisKKwlyZXQgPSBwcm9jX2RvaW50dmVjX21pbm1heCh0YWJsZSwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJaWYgKHJldCA9PSAwICYmIHdyaXRlKQorCQlkaXJ0eV9iYWNrZ3JvdW5kX2J5dGVzID0gMDsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgZGlydHlfYmFja2dyb3VuZF9ieXRlc19oYW5kbGVyKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCisJCXN0cnVjdCBmaWxlICpmaWxwLCB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsCisJCWxvZmZfdCAqcHBvcykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gcHJvY19kb3Vsb25ndmVjX21pbm1heCh0YWJsZSwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJaWYgKHJldCA9PSAwICYmIHdyaXRlKQorCQlkaXJ0eV9iYWNrZ3JvdW5kX3JhdGlvID0gMDsKKwlyZXR1cm4gcmV0OworfQorCiBpbnQgZGlydHlfcmF0aW9faGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAogCQlzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLAogCQlsb2ZmX3QgKnBwb3MpCiB7CiAJaW50IG9sZF9yYXRpbyA9IHZtX2RpcnR5X3JhdGlvOwotCWludCByZXQgPSBwcm9jX2RvaW50dmVjX21pbm1heCh0YWJsZSwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJaW50IHJldDsKKworCXJldCA9IHByb2NfZG9pbnR2ZWNfbWlubWF4KHRhYmxlLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKIAlpZiAocmV0ID09IDAgJiYgd3JpdGUgJiYgdm1fZGlydHlfcmF0aW8gIT0gb2xkX3JhdGlvKSB7Ci0JCWludCBzaGlmdCA9IGNhbGNfcGVyaW9kX3NoaWZ0KCk7Ci0JCXByb3BfY2hhbmdlX3NoaWZ0KCZ2bV9jb21wbGV0aW9ucywgc2hpZnQpOwotCQlwcm9wX2NoYW5nZV9zaGlmdCgmdm1fZGlydGllcywgc2hpZnQpOworCQl1cGRhdGVfY29tcGxldGlvbl9wZXJpb2QoKTsKKwkJdm1fZGlydHlfYnl0ZXMgPSAwOworCX0KKwlyZXR1cm4gcmV0OworfQorCisKK2ludCBkaXJ0eV9ieXRlc19oYW5kbGVyKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCisJCXN0cnVjdCBmaWxlICpmaWxwLCB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsCisJCWxvZmZfdCAqcHBvcykKK3sKKwlpbnQgb2xkX2J5dGVzID0gdm1fZGlydHlfYnl0ZXM7CisJaW50IHJldDsKKworCXJldCA9IHByb2NfZG91bG9uZ3ZlY19taW5tYXgodGFibGUsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCWlmIChyZXQgPT0gMCAmJiB3cml0ZSAmJiB2bV9kaXJ0eV9ieXRlcyAhPSBvbGRfYnl0ZXMpIHsKKwkJdXBkYXRlX2NvbXBsZXRpb25fcGVyaW9kKCk7CisJCXZtX2RpcnR5X3JhdGlvID0gMDsKIAl9CiAJcmV0dXJuIHJldDsKIH0KQEAgLTM2MiwyNiArNDI2LDMyIEBACiB9CiAKIHZvaWQKLWdldF9kaXJ0eV9saW1pdHMobG9uZyAqcGJhY2tncm91bmQsIGxvbmcgKnBkaXJ0eSwgbG9uZyAqcGJkaV9kaXJ0eSwKLQkJIHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGkpCitnZXRfZGlydHlfbGltaXRzKHVuc2lnbmVkIGxvbmcgKnBiYWNrZ3JvdW5kLCB1bnNpZ25lZCBsb25nICpwZGlydHksCisJCSB1bnNpZ25lZCBsb25nICpwYmRpX2RpcnR5LCBzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpKQogewotCWludCBiYWNrZ3JvdW5kX3JhdGlvOwkJLyogUGVyY2VudGFnZXMgKi8KLQlpbnQgZGlydHlfcmF0aW87Ci0JbG9uZyBiYWNrZ3JvdW5kOwotCWxvbmcgZGlydHk7CisJdW5zaWduZWQgbG9uZyBiYWNrZ3JvdW5kOworCXVuc2lnbmVkIGxvbmcgZGlydHk7CiAJdW5zaWduZWQgbG9uZyBhdmFpbGFibGVfbWVtb3J5ID0gZGV0ZXJtaW5lX2RpcnR5YWJsZV9tZW1vcnkoKTsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKIAotCWRpcnR5X3JhdGlvID0gdm1fZGlydHlfcmF0aW87Ci0JaWYgKGRpcnR5X3JhdGlvIDwgNSkKLQkJZGlydHlfcmF0aW8gPSA1OworCWlmICh2bV9kaXJ0eV9ieXRlcykKKwkJZGlydHkgPSBESVZfUk9VTkRfVVAodm1fZGlydHlfYnl0ZXMsIFBBR0VfU0laRSk7CisJZWxzZSB7CisJCWludCBkaXJ0eV9yYXRpbzsKIAotCWJhY2tncm91bmRfcmF0aW8gPSBkaXJ0eV9iYWNrZ3JvdW5kX3JhdGlvOwotCWlmIChiYWNrZ3JvdW5kX3JhdGlvID49IGRpcnR5X3JhdGlvKQotCQliYWNrZ3JvdW5kX3JhdGlvID0gZGlydHlfcmF0aW8gLyAyOworCQlkaXJ0eV9yYXRpbyA9IHZtX2RpcnR5X3JhdGlvOworCQlpZiAoZGlydHlfcmF0aW8gPCA1KQorCQkJZGlydHlfcmF0aW8gPSA1OworCQlkaXJ0eSA9IChkaXJ0eV9yYXRpbyAqIGF2YWlsYWJsZV9tZW1vcnkpIC8gMTAwOworCX0KIAotCWJhY2tncm91bmQgPSAoYmFja2dyb3VuZF9yYXRpbyAqIGF2YWlsYWJsZV9tZW1vcnkpIC8gMTAwOwotCWRpcnR5ID0gKGRpcnR5X3JhdGlvICogYXZhaWxhYmxlX21lbW9yeSkgLyAxMDA7CisJaWYgKGRpcnR5X2JhY2tncm91bmRfYnl0ZXMpCisJCWJhY2tncm91bmQgPSBESVZfUk9VTkRfVVAoZGlydHlfYmFja2dyb3VuZF9ieXRlcywgUEFHRV9TSVpFKTsKKwllbHNlCisJCWJhY2tncm91bmQgPSAoZGlydHlfYmFja2dyb3VuZF9yYXRpbyAqIGF2YWlsYWJsZV9tZW1vcnkpIC8gMTAwOworCisJaWYgKGJhY2tncm91bmQgPj0gZGlydHkpCisJCWJhY2tncm91bmQgPSBkaXJ0eSAvIDI7CiAJdHNrID0gY3VycmVudDsKIAlpZiAodHNrLT5mbGFncyAmIFBGX0xFU1NfVEhST1RUTEUgfHwgcnRfdGFzayh0c2spKSB7CiAJCWJhY2tncm91bmQgKz0gYmFja2dyb3VuZCAvIDQ7CkBAIC00MjMsOSArNDkzLDkgQEAKIHsKIAlsb25nIG5yX3JlY2xhaW1hYmxlLCBiZGlfbnJfcmVjbGFpbWFibGU7CiAJbG9uZyBucl93cml0ZWJhY2ssIGJkaV9ucl93cml0ZWJhY2s7Ci0JbG9uZyBiYWNrZ3JvdW5kX3RocmVzaDsKLQlsb25nIGRpcnR5X3RocmVzaDsKLQlsb25nIGJkaV90aHJlc2g7CisJdW5zaWduZWQgbG9uZyBiYWNrZ3JvdW5kX3RocmVzaDsKKwl1bnNpZ25lZCBsb25nIGRpcnR5X3RocmVzaDsKKwl1bnNpZ25lZCBsb25nIGJkaV90aHJlc2g7CiAJdW5zaWduZWQgbG9uZyBwYWdlc193cml0dGVuID0gMDsKIAl1bnNpZ25lZCBsb25nIHdyaXRlX2NodW5rID0gc3luY193cml0ZWJhY2tfcGFnZXMoKTsKIApAQCAtNTgwLDggKzY1MCw4IEBACiAKIHZvaWQgdGhyb3R0bGVfdm1fd3JpdGVvdXQoZ2ZwX3QgZ2ZwX21hc2spCiB7Ci0JbG9uZyBiYWNrZ3JvdW5kX3RocmVzaDsKLQlsb25nIGRpcnR5X3RocmVzaDsKKwl1bnNpZ25lZCBsb25nIGJhY2tncm91bmRfdGhyZXNoOworCXVuc2lnbmVkIGxvbmcgZGlydHlfdGhyZXNoOwogCiAgICAgICAgIGZvciAoIDsgOyApIHsKIAkJZ2V0X2RpcnR5X2xpbWl0cygmYmFja2dyb3VuZF90aHJlc2gsICZkaXJ0eV90aHJlc2gsIE5VTEwsIE5VTEwpOwpAQCAtNjI0LDggKzY5NCw4IEBACiAJfTsKIAogCWZvciAoIDsgOyApIHsKLQkJbG9uZyBiYWNrZ3JvdW5kX3RocmVzaDsKLQkJbG9uZyBkaXJ0eV90aHJlc2g7CisJCXVuc2lnbmVkIGxvbmcgYmFja2dyb3VuZF90aHJlc2g7CisJCXVuc2lnbmVkIGxvbmcgZGlydHlfdGhyZXNoOwogCiAJCWdldF9kaXJ0eV9saW1pdHMoJmJhY2tncm91bmRfdGhyZXNoLCAmZGlydHlfdGhyZXNoLCBOVUxMLCBOVUxMKTsKIAkJaWYgKGdsb2JhbF9wYWdlX3N0YXRlKE5SX0ZJTEVfRElSVFkpICsKQEAgLTg2OCw5ICs5MzgsMTEgQEAKIAlpbnQgZG9uZSA9IDA7CiAJc3RydWN0IHBhZ2V2ZWMgcHZlYzsKIAlpbnQgbnJfcGFnZXM7CisJcGdvZmZfdCB1bmluaXRpYWxpemVkX3Zhcih3cml0ZWJhY2tfaW5kZXgpOwogCXBnb2ZmX3QgaW5kZXg7CiAJcGdvZmZfdCBlbmQ7CQkvKiBJbmNsdXNpdmUgKi8KLQlpbnQgc2Nhbm5lZCA9IDA7CisJcGdvZmZfdCBkb25lX2luZGV4OworCWludCBjeWNsZWQ7CiAJaW50IHJhbmdlX3dob2xlID0gMDsKIAlsb25nIG5yX3RvX3dyaXRlID0gd2JjLT5ucl90b193cml0ZTsKIApAQCAtODgxLDgzICs5NTMsMTM0IEBACiAKIAlwYWdldmVjX2luaXQoJnB2ZWMsIDApOwogCWlmICh3YmMtPnJhbmdlX2N5Y2xpYykgewotCQlpbmRleCA9IG1hcHBpbmctPndyaXRlYmFja19pbmRleDsgLyogU3RhcnQgZnJvbSBwcmV2IG9mZnNldCAqLworCQl3cml0ZWJhY2tfaW5kZXggPSBtYXBwaW5nLT53cml0ZWJhY2tfaW5kZXg7IC8qIHByZXYgb2Zmc2V0ICovCisJCWluZGV4ID0gd3JpdGViYWNrX2luZGV4OworCQlpZiAoaW5kZXggPT0gMCkKKwkJCWN5Y2xlZCA9IDE7CisJCWVsc2UKKwkJCWN5Y2xlZCA9IDA7CiAJCWVuZCA9IC0xOwogCX0gZWxzZSB7CiAJCWluZGV4ID0gd2JjLT5yYW5nZV9zdGFydCA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCQllbmQgPSB3YmMtPnJhbmdlX2VuZCA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCQlpZiAod2JjLT5yYW5nZV9zdGFydCA9PSAwICYmIHdiYy0+cmFuZ2VfZW5kID09IExMT05HX01BWCkKIAkJCXJhbmdlX3dob2xlID0gMTsKLQkJc2Nhbm5lZCA9IDE7CisJCWN5Y2xlZCA9IDE7IC8qIGlnbm9yZSByYW5nZV9jeWNsaWMgdGVzdHMgKi8KIAl9CiByZXRyeToKLQl3aGlsZSAoIWRvbmUgJiYgKGluZGV4IDw9IGVuZCkgJiYKLQkgICAgICAgKG5yX3BhZ2VzID0gcGFnZXZlY19sb29rdXBfdGFnKCZwdmVjLCBtYXBwaW5nLCAmaW5kZXgsCi0JCQkJCSAgICAgIFBBR0VDQUNIRV9UQUdfRElSVFksCi0JCQkJCSAgICAgIG1pbihlbmQgLSBpbmRleCwgKHBnb2ZmX3QpUEFHRVZFQ19TSVpFLTEpICsgMSkpKSB7Ci0JCXVuc2lnbmVkIGk7CisJZG9uZV9pbmRleCA9IGluZGV4OworCXdoaWxlICghZG9uZSAmJiAoaW5kZXggPD0gZW5kKSkgeworCQlpbnQgaTsKIAotCQlzY2FubmVkID0gMTsKKwkJbnJfcGFnZXMgPSBwYWdldmVjX2xvb2t1cF90YWcoJnB2ZWMsIG1hcHBpbmcsICZpbmRleCwKKwkJCSAgICAgIFBBR0VDQUNIRV9UQUdfRElSVFksCisJCQkgICAgICBtaW4oZW5kIC0gaW5kZXgsIChwZ29mZl90KVBBR0VWRUNfU0laRS0xKSArIDEpOworCQlpZiAobnJfcGFnZXMgPT0gMCkKKwkJCWJyZWFrOworCiAJCWZvciAoaSA9IDA7IGkgPCBucl9wYWdlczsgaSsrKSB7CiAJCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHB2ZWMucGFnZXNbaV07CiAKIAkJCS8qCi0JCQkgKiBBdCB0aGlzIHBvaW50IHdlIGhvbGQgbmVpdGhlciBtYXBwaW5nLT50cmVlX2xvY2sgbm9yCi0JCQkgKiBsb2NrIG9uIHRoZSBwYWdlIGl0c2VsZjogdGhlIHBhZ2UgbWF5IGJlIHRydW5jYXRlZCBvcgotCQkJICogaW52YWxpZGF0ZWQgKGNoYW5naW5nIHBhZ2UtPm1hcHBpbmcgdG8gTlVMTCksIG9yIGV2ZW4KLQkJCSAqIHN3aXp6bGVkIGJhY2sgZnJvbSBzd2FwcGVyX3NwYWNlIHRvIHRtcGZzIGZpbGUKLQkJCSAqIG1hcHBpbmcKKwkJCSAqIEF0IHRoaXMgcG9pbnQsIHRoZSBwYWdlIG1heSBiZSB0cnVuY2F0ZWQgb3IKKwkJCSAqIGludmFsaWRhdGVkIChjaGFuZ2luZyBwYWdlLT5tYXBwaW5nIHRvIE5VTEwpLCBvcgorCQkJICogZXZlbiBzd2l6emxlZCBiYWNrIGZyb20gc3dhcHBlcl9zcGFjZSB0byB0bXBmcyBmaWxlCisJCQkgKiBtYXBwaW5nLiBIb3dldmVyLCBwYWdlLT5pbmRleCB3aWxsIG5vdCBjaGFuZ2UKKwkJCSAqIGJlY2F1c2Ugd2UgaGF2ZSBhIHJlZmVyZW5jZSBvbiB0aGUgcGFnZS4KIAkJCSAqLworCQkJaWYgKHBhZ2UtPmluZGV4ID4gZW5kKSB7CisJCQkJLyoKKwkJCQkgKiBjYW4ndCBiZSByYW5nZV9jeWNsaWMgKDFzdCBwYXNzKSBiZWNhdXNlCisJCQkJICogZW5kID09IC0xIGluIHRoYXQgY2FzZS4KKwkJCQkgKi8KKwkJCQlkb25lID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJZG9uZV9pbmRleCA9IHBhZ2UtPmluZGV4ICsgMTsKKwogCQkJbG9ja19wYWdlKHBhZ2UpOwogCisJCQkvKgorCQkJICogUGFnZSB0cnVuY2F0ZWQgb3IgaW52YWxpZGF0ZWQuIFdlIGNhbiBmcmVlbHkgc2tpcCBpdAorCQkJICogdGhlbiwgZXZlbiBmb3IgZGF0YSBpbnRlZ3JpdHkgb3BlcmF0aW9uczogdGhlIHBhZ2UKKwkJCSAqIGhhcyBkaXNhcHBlYXJlZCBjb25jdXJyZW50bHksIHNvIHRoZXJlIGNvdWxkIGJlIG5vCisJCQkgKiByZWFsIGV4cGVjdGF0aW9uIG9mIHRoaXMgZGF0YSBpbnRlcml0eSBvcGVyYXRpb24KKwkJCSAqIGV2ZW4gaWYgdGhlcmUgaXMgbm93IGEgbmV3LCBkaXJ0eSBwYWdlIGF0IHRoZSBzYW1lCisJCQkgKiBwYWdlY2FjaGUgYWRkcmVzcy4KKwkJCSAqLwogCQkJaWYgKHVubGlrZWx5KHBhZ2UtPm1hcHBpbmcgIT0gbWFwcGluZykpIHsKK2NvbnRpbnVlX3VubG9jazoKIAkJCQl1bmxvY2tfcGFnZShwYWdlKTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAotCQkJaWYgKCF3YmMtPnJhbmdlX2N5Y2xpYyAmJiBwYWdlLT5pbmRleCA+IGVuZCkgewotCQkJCWRvbmUgPSAxOwotCQkJCXVubG9ja19wYWdlKHBhZ2UpOwotCQkJCWNvbnRpbnVlOworCQkJaWYgKCFQYWdlRGlydHkocGFnZSkpIHsKKwkJCQkvKiBzb21lb25lIHdyb3RlIGl0IGZvciB1cyAqLworCQkJCWdvdG8gY29udGludWVfdW5sb2NrOwogCQkJfQogCi0JCQlpZiAod2JjLT5zeW5jX21vZGUgIT0gV0JfU1lOQ19OT05FKQotCQkJCXdhaXRfb25fcGFnZV93cml0ZWJhY2socGFnZSk7Ci0KLQkJCWlmIChQYWdlV3JpdGViYWNrKHBhZ2UpIHx8Ci0JCQkgICAgIWNsZWFyX3BhZ2VfZGlydHlfZm9yX2lvKHBhZ2UpKSB7Ci0JCQkJdW5sb2NrX3BhZ2UocGFnZSk7Ci0JCQkJY29udGludWU7CisJCQlpZiAoUGFnZVdyaXRlYmFjayhwYWdlKSkgeworCQkJCWlmICh3YmMtPnN5bmNfbW9kZSAhPSBXQl9TWU5DX05PTkUpCisJCQkJCXdhaXRfb25fcGFnZV93cml0ZWJhY2socGFnZSk7CisJCQkJZWxzZQorCQkJCQlnb3RvIGNvbnRpbnVlX3VubG9jazsKIAkJCX0KIAorCQkJQlVHX09OKFBhZ2VXcml0ZWJhY2socGFnZSkpOworCQkJaWYgKCFjbGVhcl9wYWdlX2RpcnR5X2Zvcl9pbyhwYWdlKSkKKwkJCQlnb3RvIGNvbnRpbnVlX3VubG9jazsKKwogCQkJcmV0ID0gKCp3cml0ZXBhZ2UpKHBhZ2UsIHdiYywgZGF0YSk7CisJCQlpZiAodW5saWtlbHkocmV0KSkgeworCQkJCWlmIChyZXQgPT0gQU9QX1dSSVRFUEFHRV9BQ1RJVkFURSkgeworCQkJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCQkJcmV0ID0gMDsKKwkJCQl9IGVsc2UgeworCQkJCQkvKgorCQkJCQkgKiBkb25lX2luZGV4IGlzIHNldCBwYXN0IHRoaXMgcGFnZSwKKwkJCQkJICogc28gbWVkaWEgZXJyb3JzIHdpbGwgbm90IGNob2tlCisJCQkJCSAqIGJhY2tncm91bmQgd3JpdGVvdXQgZm9yIHRoZSBlbnRpcmUKKwkJCQkJICogZmlsZS4gVGhpcyBoYXMgY29uc2VxdWVuY2VzIGZvcgorCQkJCQkgKiByYW5nZV9jeWNsaWMgc2VtYW50aWNzIChpZS4gaXQgbWF5CisJCQkJCSAqIG5vdCBiZSBzdWl0YWJsZSBmb3IgZGF0YSBpbnRlZ3JpdHkKKwkJCQkJICogd3JpdGVvdXQpLgorCQkJCQkgKi8KKwkJCQkJZG9uZSA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KKyAJCQl9CiAKLQkJCWlmICh1bmxpa2VseShyZXQgPT0gQU9QX1dSSVRFUEFHRV9BQ1RJVkFURSkpIHsKLQkJCQl1bmxvY2tfcGFnZShwYWdlKTsKLQkJCQlyZXQgPSAwOworCQkJaWYgKHdiYy0+c3luY19tb2RlID09IFdCX1NZTkNfTk9ORSkgeworCQkJCXdiYy0+bnJfdG9fd3JpdGUtLTsKKwkJCQlpZiAod2JjLT5ucl90b193cml0ZSA8PSAwKSB7CisJCQkJCWRvbmUgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CiAJCQl9Ci0JCQlpZiAocmV0IHx8ICgtLW5yX3RvX3dyaXRlIDw9IDApKQotCQkJCWRvbmUgPSAxOwogCQkJaWYgKHdiYy0+bm9uYmxvY2tpbmcgJiYgYmRpX3dyaXRlX2Nvbmdlc3RlZChiZGkpKSB7CiAJCQkJd2JjLT5lbmNvdW50ZXJlZF9jb25nZXN0aW9uID0gMTsKIAkJCQlkb25lID0gMTsKKwkJCQlicmVhazsKIAkJCX0KIAkJfQogCQlwYWdldmVjX3JlbGVhc2UoJnB2ZWMpOwogCQljb25kX3Jlc2NoZWQoKTsKIAl9Ci0JaWYgKCFzY2FubmVkICYmICFkb25lKSB7CisJaWYgKCFjeWNsZWQpIHsKIAkJLyoKKwkJICogcmFuZ2VfY3ljbGljOgogCQkgKiBXZSBoaXQgdGhlIGxhc3QgcGFnZSBhbmQgdGhlcmUgaXMgbW9yZSB3b3JrIHRvIGJlIGRvbmU6IHdyYXAKIAkJICogYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIGZpbGUKIAkJICovCi0JCXNjYW5uZWQgPSAxOworCQljeWNsZWQgPSAxOwogCQlpbmRleCA9IDA7CisJCWVuZCA9IHdyaXRlYmFja19pbmRleCAtIDE7CiAJCWdvdG8gcmV0cnk7CiAJfQogCWlmICghd2JjLT5ub19ucndyaXRlX2luZGV4X3VwZGF0ZSkgewogCQlpZiAod2JjLT5yYW5nZV9jeWNsaWMgfHwgKHJhbmdlX3dob2xlICYmIG5yX3RvX3dyaXRlID4gMCkpCi0JCQltYXBwaW5nLT53cml0ZWJhY2tfaW5kZXggPSBpbmRleDsKKwkJCW1hcHBpbmctPndyaXRlYmFja19pbmRleCA9IGRvbmVfaW5kZXg7CiAJCXdiYy0+bnJfdG9fd3JpdGUgPSBucl90b193cml0ZTsKIAl9CiAKZGlmZiAtLWdpdCBhL21tL3BhZ2VfYWxsb2MuYyBiL21tL3BhZ2VfYWxsb2MuYwppbmRleCBkOGFjMDE0Li41Njc1YjMwIDEwMDY0NAotLS0gYS9tbS9wYWdlX2FsbG9jLmMKKysrIGIvbW0vcGFnZV9hbGxvYy5jCkBAIC02OSw3ICs2OSw3IEBACiAKIHVuc2lnbmVkIGxvbmcgdG90YWxyYW1fcGFnZXMgX19yZWFkX21vc3RseTsKIHVuc2lnbmVkIGxvbmcgdG90YWxyZXNlcnZlX3BhZ2VzIF9fcmVhZF9tb3N0bHk7Ci1sb25nIG5yX3N3YXBfcGFnZXM7Cit1bnNpZ25lZCBsb25nIGhpZ2hlc3RfbWVtbWFwX3BmbiBfX3JlYWRfbW9zdGx5OwogaW50IHBlcmNwdV9wYWdlbGlzdF9mcmFjdGlvbjsKIAogI2lmZGVmIENPTkZJR19IVUdFVExCX1BBR0VfU0laRV9WQVJJQUJMRQpAQCAtMjIzLDE5ICsyMjMsNDEgQEAKIAogc3RhdGljIHZvaWQgYmFkX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0JcHJpbnRrKEtFUk5fRU1FUkcgIkJhZCBwYWdlIHN0YXRlIGluIHByb2Nlc3MgJyVzJ1xuIiBLRVJOX0VNRVJHCi0JCSJwYWdlOiVwIGZsYWdzOjB4JTAqbHggbWFwcGluZzolcCBtYXBjb3VudDolZCBjb3VudDolZFxuIiwKLQkJY3VycmVudC0+Y29tbSwgcGFnZSwgKGludCkoMipzaXplb2YodW5zaWduZWQgbG9uZykpLAotCQkodW5zaWduZWQgbG9uZylwYWdlLT5mbGFncywgcGFnZS0+bWFwcGluZywKLQkJcGFnZV9tYXBjb3VudChwYWdlKSwgcGFnZV9jb3VudChwYWdlKSk7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgcmVzdW1lOworCXN0YXRpYyB1bnNpZ25lZCBsb25nIG5yX3Nob3duOworCXN0YXRpYyB1bnNpZ25lZCBsb25nIG5yX3Vuc2hvd247CiAKLQlwcmludGsoS0VSTl9FTUVSRyAiVHJ5aW5nIHRvIGZpeCBpdCB1cCwgYnV0IGEgcmVib290IGlzIG5lZWRlZFxuIgotCQlLRVJOX0VNRVJHICJCYWNrdHJhY2U6XG4iKTsKKwkvKgorCSAqIEFsbG93IGEgYnVyc3Qgb2YgNjAgcmVwb3J0cywgdGhlbiBrZWVwIHF1aWV0IGZvciB0aGF0IG1pbnV0ZTsKKwkgKiBvciBhbGxvdyBhIHN0ZWFkeSBkcmlwIG9mIG9uZSByZXBvcnQgcGVyIHNlY29uZC4KKwkgKi8KKwlpZiAobnJfc2hvd24gPT0gNjApIHsKKwkJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHJlc3VtZSkpIHsKKwkJCW5yX3Vuc2hvd24rKzsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChucl91bnNob3duKSB7CisJCQlwcmludGsoS0VSTl9BTEVSVAorCQkJICAgICAgIkJVRzogQmFkIHBhZ2Ugc3RhdGU6ICVsdSBtZXNzYWdlcyBzdXBwcmVzc2VkXG4iLAorCQkJCW5yX3Vuc2hvd24pOworCQkJbnJfdW5zaG93biA9IDA7CisJCX0KKwkJbnJfc2hvd24gPSAwOworCX0KKwlpZiAobnJfc2hvd24rKyA9PSAwKQorCQlyZXN1bWUgPSBqaWZmaWVzICsgNjAgKiBIWjsKKworCXByaW50ayhLRVJOX0FMRVJUICJCVUc6IEJhZCBwYWdlIHN0YXRlIGluIHByb2Nlc3MgJXMgIHBmbjolMDVseFxuIiwKKwkJY3VycmVudC0+Y29tbSwgcGFnZV90b19wZm4ocGFnZSkpOworCXByaW50ayhLRVJOX0FMRVJUCisJCSJwYWdlOiVwIGZsYWdzOiVwIGNvdW50OiVkIG1hcGNvdW50OiVkIG1hcHBpbmc6JXAgaW5kZXg6JWx4XG4iLAorCQlwYWdlLCAodm9pZCAqKXBhZ2UtPmZsYWdzLCBwYWdlX2NvdW50KHBhZ2UpLAorCQlwYWdlX21hcGNvdW50KHBhZ2UpLCBwYWdlLT5tYXBwaW5nLCBwYWdlLT5pbmRleCk7CisKIAlkdW1wX3N0YWNrKCk7Ci0JcGFnZS0+ZmxhZ3MgJj0gflBBR0VfRkxBR1NfQ0xFQVJfV0hFTl9CQUQ7Ci0Jc2V0X3BhZ2VfY291bnQocGFnZSwgMCk7Ci0JcmVzZXRfcGFnZV9tYXBjb3VudChwYWdlKTsKLQlwYWdlLT5tYXBwaW5nID0gTlVMTDsKK291dDoKKwkvKiBMZWF2ZSBiYWQgZmllbGRzIGZvciBkZWJ1ZywgZXhjZXB0IFBhZ2VCdWRkeSBjb3VsZCBtYWtlIHRyb3VibGUgKi8KKwlfX0NsZWFyUGFnZUJ1ZGR5KHBhZ2UpOwogCWFkZF90YWludChUQUlOVF9CQURfUEFHRSk7CiB9CiAKQEAgLTI5MiwyNSArMzE0LDMxIEBACiB9CiAjZW5kaWYKIAotc3RhdGljIHZvaWQgZGVzdHJveV9jb21wb3VuZF9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG9yZGVyKQorc3RhdGljIGludCBkZXN0cm95X2NvbXBvdW5kX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgb3JkZXIpCiB7CiAJaW50IGk7CiAJaW50IG5yX3BhZ2VzID0gMSA8PCBvcmRlcjsKKwlpbnQgYmFkID0gMDsKIAotCWlmICh1bmxpa2VseShjb21wb3VuZF9vcmRlcihwYWdlKSAhPSBvcmRlcikpCisJaWYgKHVubGlrZWx5KGNvbXBvdW5kX29yZGVyKHBhZ2UpICE9IG9yZGVyKSB8fAorCSAgICB1bmxpa2VseSghUGFnZUhlYWQocGFnZSkpKSB7CiAJCWJhZF9wYWdlKHBhZ2UpOworCQliYWQrKzsKKwl9CiAKLQlpZiAodW5saWtlbHkoIVBhZ2VIZWFkKHBhZ2UpKSkKLQkJCWJhZF9wYWdlKHBhZ2UpOwogCV9fQ2xlYXJQYWdlSGVhZChwYWdlKTsKKwogCWZvciAoaSA9IDE7IGkgPCBucl9wYWdlczsgaSsrKSB7CiAJCXN0cnVjdCBwYWdlICpwID0gcGFnZSArIGk7CiAKLQkJaWYgKHVubGlrZWx5KCFQYWdlVGFpbChwKSB8Ci0JCQkJKHAtPmZpcnN0X3BhZ2UgIT0gcGFnZSkpKQorCQlpZiAodW5saWtlbHkoIVBhZ2VUYWlsKHApIHwgKHAtPmZpcnN0X3BhZ2UgIT0gcGFnZSkpKSB7CiAJCQliYWRfcGFnZShwYWdlKTsKKwkJCWJhZCsrOworCQl9CiAJCV9fQ2xlYXJQYWdlVGFpbChwKTsKIAl9CisKKwlyZXR1cm4gYmFkOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcHJlcF96ZXJvX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBvcmRlciwgZ2ZwX3QgZ2ZwX2ZsYWdzKQpAQCAtNDMwLDcgKzQ1OCw4IEBACiAJaW50IG1pZ3JhdGV0eXBlID0gZ2V0X3BhZ2VibG9ja19taWdyYXRldHlwZShwYWdlKTsKIAogCWlmICh1bmxpa2VseShQYWdlQ29tcG91bmQocGFnZSkpKQotCQlkZXN0cm95X2NvbXBvdW5kX3BhZ2UocGFnZSwgb3JkZXIpOworCQlpZiAodW5saWtlbHkoZGVzdHJveV9jb21wb3VuZF9wYWdlKHBhZ2UsIG9yZGVyKSkpCisJCQlyZXR1cm47CiAKIAlwYWdlX2lkeCA9IHBhZ2VfdG9fcGZuKHBhZ2UpICYgKCgxIDw8IE1BWF9PUkRFUikgLSAxKTsKIApAQCAtNDY3LDE4ICs0OTYsMTMgQEAKIAlpZiAodW5saWtlbHkocGFnZV9tYXBjb3VudChwYWdlKSB8CiAJCShwYWdlLT5tYXBwaW5nICE9IE5VTEwpICB8CiAJCShwYWdlX2NvdW50KHBhZ2UpICE9IDApICB8Ci0JCShwYWdlLT5mbGFncyAmIFBBR0VfRkxBR1NfQ0hFQ0tfQVRfRlJFRSkpKQorCQkocGFnZS0+ZmxhZ3MgJiBQQUdFX0ZMQUdTX0NIRUNLX0FUX0ZSRUUpKSkgewogCQliYWRfcGFnZShwYWdlKTsKLQlpZiAoUGFnZURpcnR5KHBhZ2UpKQotCQlfX0NsZWFyUGFnZURpcnR5KHBhZ2UpOwotCWlmIChQYWdlU3dhcEJhY2tlZChwYWdlKSkKLQkJX19DbGVhclBhZ2VTd2FwQmFja2VkKHBhZ2UpOwotCS8qCi0JICogRm9yIG5vdywgd2UgcmVwb3J0IGlmIFBHX3Jlc2VydmVkIHdhcyBmb3VuZCBzZXQsIGJ1dCBkbyBub3QKLQkgKiBjbGVhciBpdCwgYW5kIGRvIG5vdCBmcmVlIHRoZSBwYWdlLiAgQnV0IHdlIHNoYWxsIHNvb24gbmVlZAotCSAqIHRvIGRvIG1vcmUsIGZvciB3aGVuIHRoZSBaRVJPX1BBR0UgY291bnQgd3JhcHMgbmVnYXRpdmUuCi0JICovCi0JcmV0dXJuIFBhZ2VSZXNlcnZlZChwYWdlKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmIChwYWdlLT5mbGFncyAmIFBBR0VfRkxBR1NfQ0hFQ0tfQVRfUFJFUCkKKwkJcGFnZS0+ZmxhZ3MgJj0gflBBR0VfRkxBR1NfQ0hFQ0tfQVRfUFJFUDsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTUyMywxMSArNTQ3LDExIEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgaTsKLQlpbnQgcmVzZXJ2ZWQgPSAwOworCWludCBiYWQgPSAwOwogCiAJZm9yIChpID0gMCA7IGkgPCAoMSA8PCBvcmRlcikgOyArK2kpCi0JCXJlc2VydmVkICs9IGZyZWVfcGFnZXNfY2hlY2socGFnZSArIGkpOwotCWlmIChyZXNlcnZlZCkKKwkJYmFkICs9IGZyZWVfcGFnZXNfY2hlY2socGFnZSArIGkpOworCWlmIChiYWQpCiAJCXJldHVybjsKIAogCWlmICghUGFnZUhpZ2hNZW0ocGFnZSkpIHsKQEAgLTYxMiwyMyArNjM2LDExIEBACiAJaWYgKHVubGlrZWx5KHBhZ2VfbWFwY291bnQocGFnZSkgfAogCQkocGFnZS0+bWFwcGluZyAhPSBOVUxMKSAgfAogCQkocGFnZV9jb3VudChwYWdlKSAhPSAwKSAgfAotCQkocGFnZS0+ZmxhZ3MgJiBQQUdFX0ZMQUdTX0NIRUNLX0FUX1BSRVApKSkKKwkJKHBhZ2UtPmZsYWdzICYgUEFHRV9GTEFHU19DSEVDS19BVF9QUkVQKSkpIHsKIAkJYmFkX3BhZ2UocGFnZSk7Ci0KLQkvKgotCSAqIEZvciBub3csIHdlIHJlcG9ydCBpZiBQR19yZXNlcnZlZCB3YXMgZm91bmQgc2V0LCBidXQgZG8gbm90Ci0JICogY2xlYXIgaXQsIGFuZCBkbyBub3QgYWxsb2NhdGUgdGhlIHBhZ2U6IGFzIGEgc2FmZXR5IG5ldC4KLQkgKi8KLQlpZiAoUGFnZVJlc2VydmVkKHBhZ2UpKQogCQlyZXR1cm4gMTsKKwl9CiAKLQlwYWdlLT5mbGFncyAmPSB+KDEgPDwgUEdfdXB0b2RhdGUgfCAxIDw8IFBHX2Vycm9yIHwgMSA8PCBQR19yZWNsYWltIHwKLQkJCTEgPDwgUEdfcmVmZXJlbmNlZCB8IDEgPDwgUEdfYXJjaF8xIHwKLQkJCTEgPDwgUEdfb3duZXJfcHJpdl8xIHwgMSA8PCBQR19tYXBwZWR0b2Rpc2sKLSNpZmRlZiBDT05GSUdfVU5FVklDVEFCTEVfTFJVCi0JCQl8IDEgPDwgUEdfbWxvY2tlZAotI2VuZGlmCi0JCQkpOwogCXNldF9wYWdlX3ByaXZhdGUocGFnZSwgMCk7CiAJc2V0X3BhZ2VfcmVmY291bnRlZChwYWdlKTsKIApAQCAtMjYwOSw2ICsyNjIxLDkgQEAKIAl1bnNpZ25lZCBsb25nIHBmbjsKIAlzdHJ1Y3Qgem9uZSAqejsKIAorCWlmIChoaWdoZXN0X21lbW1hcF9wZm4gPCBlbmRfcGZuIC0gMSkKKwkJaGlnaGVzdF9tZW1tYXBfcGZuID0gZW5kX3BmbiAtIDE7CisKIAl6ID0gJk5PREVfREFUQShuaWQpLT5ub2RlX3pvbmVzW3pvbmVdOwogCWZvciAocGZuID0gc3RhcnRfcGZuOyBwZm4gPCBlbmRfcGZuOyBwZm4rKykgewogCQkvKgpAQCAtMzM4MSwxMCArMzM5Niw4IEBACiB7CiAJdW5zaWduZWQgbG9uZyB1c2VtYXBzaXplID0gdXNlbWFwX3NpemUoem9uZXNpemUpOwogCXpvbmUtPnBhZ2VibG9ja19mbGFncyA9IE5VTEw7Ci0JaWYgKHVzZW1hcHNpemUpIHsKKwlpZiAodXNlbWFwc2l6ZSkKIAkJem9uZS0+cGFnZWJsb2NrX2ZsYWdzID0gYWxsb2NfYm9vdG1lbV9ub2RlKHBnZGF0LCB1c2VtYXBzaXplKTsKLQkJbWVtc2V0KHpvbmUtPnBhZ2VibG9ja19mbGFncywgMCwgdXNlbWFwc2l6ZSk7Ci0JfQogfQogI2Vsc2UKIHN0YXRpYyB2b2lkIGlubGluZSBzZXR1cF91c2VtYXAoc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCwKQEAgLTM0NjksOSArMzQ4MiwxMCBAQAogCQkJUEFHRV9BTElHTihzaXplICogc2l6ZW9mKHN0cnVjdCBwYWdlKSkgPj4gUEFHRV9TSElGVDsKIAkJaWYgKHJlYWxzaXplID49IG1lbW1hcF9wYWdlcykgewogCQkJcmVhbHNpemUgLT0gbWVtbWFwX3BhZ2VzOwotCQkJcHJpbnRrKEtFUk5fREVCVUcKLQkJCQkiICAlcyB6b25lOiAlbHUgcGFnZXMgdXNlZCBmb3IgbWVtbWFwXG4iLAotCQkJCXpvbmVfbmFtZXNbal0sIG1lbW1hcF9wYWdlcyk7CisJCQlpZiAobWVtbWFwX3BhZ2VzKQorCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJICAgICAgICIgICVzIHpvbmU6ICVsdSBwYWdlcyB1c2VkIGZvciBtZW1tYXBcbiIsCisJCQkJICAgICAgIHpvbmVfbmFtZXNbal0sIG1lbW1hcF9wYWdlcyk7CiAJCX0gZWxzZQogCQkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkJCSIgICVzIHpvbmU6ICVsdSBwYWdlcyBleGNlZWRzIHJlYWxzaXplICVsdVxuIiwKQEAgLTM1MDksMTAgKzM1MjMsMTAgQEAKIAkJCUlOSVRfTElTVF9IRUFEKCZ6b25lLT5scnVbbF0ubGlzdCk7CiAJCQl6b25lLT5scnVbbF0ubnJfc2NhbiA9IDA7CiAJCX0KLQkJem9uZS0+cmVjZW50X3JvdGF0ZWRbMF0gPSAwOwotCQl6b25lLT5yZWNlbnRfcm90YXRlZFsxXSA9IDA7Ci0JCXpvbmUtPnJlY2VudF9zY2FubmVkWzBdID0gMDsKLQkJem9uZS0+cmVjZW50X3NjYW5uZWRbMV0gPSAwOworCQl6b25lLT5yZWNsYWltX3N0YXQucmVjZW50X3JvdGF0ZWRbMF0gPSAwOworCQl6b25lLT5yZWNsYWltX3N0YXQucmVjZW50X3JvdGF0ZWRbMV0gPSAwOworCQl6b25lLT5yZWNsYWltX3N0YXQucmVjZW50X3NjYW5uZWRbMF0gPSAwOworCQl6b25lLT5yZWNsYWltX3N0YXQucmVjZW50X3NjYW5uZWRbMV0gPSAwOwogCQl6YXBfem9uZV92bV9zdGF0cyh6b25lKTsKIAkJem9uZS0+ZmxhZ3MgPSAwOwogCQlpZiAoIXNpemUpCkBAIC00MzE2LDcgKzQzMzAsNyBAQAogICogICAgMVRCICAgICAxMDEgICAgICAgIDEwR0IKICAqICAgMTBUQiAgICAgMzIwICAgICAgICAzMkdCCiAgKi8KLXZvaWQgc2V0dXBfcGVyX3pvbmVfaW5hY3RpdmVfcmF0aW8odm9pZCkKK3N0YXRpYyB2b2lkIHNldHVwX3Blcl96b25lX2luYWN0aXZlX3JhdGlvKHZvaWQpCiB7CiAJc3RydWN0IHpvbmUgKnpvbmU7CiAKQEAgLTQ1NzMsMTkgKzQ1ODcsNiBAQAogCXJldHVybiB0YWJsZTsKIH0KIAotI2lmZGVmIENPTkZJR19PVVRfT0ZfTElORV9QRk5fVE9fUEFHRQotc3RydWN0IHBhZ2UgKnBmbl90b19wYWdlKHVuc2lnbmVkIGxvbmcgcGZuKQotewotCXJldHVybiBfX3Bmbl90b19wYWdlKHBmbik7Ci19Ci11bnNpZ25lZCBsb25nIHBhZ2VfdG9fcGZuKHN0cnVjdCBwYWdlICpwYWdlKQotewotCXJldHVybiBfX3BhZ2VfdG9fcGZuKHBhZ2UpOwotfQotRVhQT1JUX1NZTUJPTChwZm5fdG9fcGFnZSk7Ci1FWFBPUlRfU1lNQk9MKHBhZ2VfdG9fcGZuKTsKLSNlbmRpZiAvKiBDT05GSUdfT1VUX09GX0xJTkVfUEZOX1RPX1BBR0UgKi8KLQogLyogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgYml0bWFwIHN0b3JpbmcgYml0cyBhZmZlY3RpbmcgYSBibG9jayBvZiBwYWdlcyAqLwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nICpnZXRfcGFnZWJsb2NrX2JpdG1hcChzdHJ1Y3Qgem9uZSAqem9uZSwKIAkJCQkJCQl1bnNpZ25lZCBsb25nIHBmbikKZGlmZiAtLWdpdCBhL21tL3BhZ2VfY2dyb3VwLmMgYi9tbS9wYWdlX2Nncm91cC5jCmluZGV4IGFiMjdmZjcuLjcwMDZhMTEgMTAwNjQ0Ci0tLSBhL21tL3BhZ2VfY2dyb3VwLmMKKysrIGIvbW0vcGFnZV9jZ3JvdXAuYwpAQCAtOCw2ICs4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tZW1vcnkuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvY2dyb3VwLmg+CisjaW5jbHVkZSA8bGludXgvc3dhcG9wcy5oPgogCiBzdGF0aWMgdm9pZCBfX21lbWluaXQKIF9faW5pdF9wYWdlX2Nncm91cChzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjLCB1bnNpZ25lZCBsb25nIHBmbikKQEAgLTE1LDYgKzE2LDcgQEAKIAlwYy0+ZmxhZ3MgPSAwOwogCXBjLT5tZW1fY2dyb3VwID0gTlVMTDsKIAlwYy0+cGFnZSA9IHBmbl90b19wYWdlKHBmbik7CisJSU5JVF9MSVNUX0hFQUQoJnBjLT5scnUpOwogfQogc3RhdGljIHVuc2lnbmVkIGxvbmcgdG90YWxfdXNhZ2U7CiAKQEAgLTcyLDcgKzc0LDcgQEAKIAogCWludCBuaWQsIGZhaWw7CiAKLQlpZiAobWVtX2Nncm91cF9zdWJzeXMuZGlzYWJsZWQpCisJaWYgKG1lbV9jZ3JvdXBfZGlzYWJsZWQoKSkKIAkJcmV0dXJuOwogCiAJZm9yX2VhY2hfb25saW5lX25vZGUobmlkKSAgewpAQCAtMTAxLDE1ICsxMDMsMTMgQEAKIH0KIAogLyogX19hbGxvY19ib290bWVtLi4uKCkgaXMgcHJvdGVjdGVkIGJ5ICFzbGFiX2F2YWlsYWJsZSgpICovCi1pbnQgX19pbml0X3JlZm9rIGluaXRfc2VjdGlvbl9wYWdlX2Nncm91cCh1bnNpZ25lZCBsb25nIHBmbikKK3N0YXRpYyBpbnQgX19pbml0X3JlZm9rIGluaXRfc2VjdGlvbl9wYWdlX2Nncm91cCh1bnNpZ25lZCBsb25nIHBmbikKIHsKLQlzdHJ1Y3QgbWVtX3NlY3Rpb24gKnNlY3Rpb247CisJc3RydWN0IG1lbV9zZWN0aW9uICpzZWN0aW9uID0gX19wZm5fdG9fc2VjdGlvbihwZm4pOwogCXN0cnVjdCBwYWdlX2Nncm91cCAqYmFzZSwgKnBjOwogCXVuc2lnbmVkIGxvbmcgdGFibGVfc2l6ZTsKIAlpbnQgbmlkLCBpbmRleDsKIAotCXNlY3Rpb24gPSBfX3Bmbl90b19zZWN0aW9uKHBmbik7Ci0KIAlpZiAoIXNlY3Rpb24tPnBhZ2VfY2dyb3VwKSB7CiAJCW5pZCA9IHBhZ2VfdG9fbmlkKHBmbl90b19wYWdlKHBmbikpOwogCQl0YWJsZV9zaXplID0gc2l6ZW9mKHN0cnVjdCBwYWdlX2Nncm91cCkgKiBQQUdFU19QRVJfU0VDVElPTjsKQEAgLTE0NSw3ICsxNDUsNiBAQAogCQlfX2luaXRfcGFnZV9jZ3JvdXAocGMsIHBmbiArIGluZGV4KTsKIAl9CiAKLQlzZWN0aW9uID0gX19wZm5fdG9fc2VjdGlvbihwZm4pOwogCXNlY3Rpb24tPnBhZ2VfY2dyb3VwID0gYmFzZSAtIHBmbjsKIAl0b3RhbF91c2FnZSArPSB0YWJsZV9zaXplOwogCXJldHVybiAwOwpAQCAtMjQ4LDcgKzI0Nyw3IEBACiAJdW5zaWduZWQgbG9uZyBwZm47CiAJaW50IGZhaWwgPSAwOwogCi0JaWYgKG1lbV9jZ3JvdXBfc3Vic3lzLmRpc2FibGVkKQorCWlmIChtZW1fY2dyb3VwX2Rpc2FibGVkKCkpCiAJCXJldHVybjsKIAogCWZvciAocGZuID0gMDsgIWZhaWwgJiYgcGZuIDwgbWF4X3BmbjsgcGZuICs9IFBBR0VTX1BFUl9TRUNUSU9OKSB7CkBAIC0yNzMsMyArMjcyLDE5OSBAQAogfQogCiAjZW5kaWYKKworCisjaWZkZWYgQ09ORklHX0NHUk9VUF9NRU1fUkVTX0NUTFJfU1dBUAorCitzdGF0aWMgREVGSU5FX01VVEVYKHN3YXBfY2dyb3VwX211dGV4KTsKK3N0cnVjdCBzd2FwX2Nncm91cF9jdHJsIHsKKwlzdHJ1Y3QgcGFnZSAqKm1hcDsKKwl1bnNpZ25lZCBsb25nIGxlbmd0aDsKK307CisKK3N0cnVjdCBzd2FwX2Nncm91cF9jdHJsIHN3YXBfY2dyb3VwX2N0cmxbTUFYX1NXQVBGSUxFU107CisKKy8qCisgKiBUaGlzIDhieXRlcyBzZWVtcyBiaWcuLm1heWJlIHdlIGNhbiByZWR1Y2UgdGhpcyB3aGVuIHdlIGNhbiB1c2UgImlkIiBmb3IKKyAqIGNncm91cCByYXRoZXIgdGhhbiBwb2ludGVyLgorICovCitzdHJ1Y3Qgc3dhcF9jZ3JvdXAgeworCXN0cnVjdCBtZW1fY2dyb3VwCSp2YWw7Cit9OworI2RlZmluZSBTQ19QRVJfUEFHRQkoUEFHRV9TSVpFL3NpemVvZihzdHJ1Y3Qgc3dhcF9jZ3JvdXApKQorI2RlZmluZSBTQ19QT1NfTUFTSwkoU0NfUEVSX1BBR0UgLSAxKQorCisvKgorICogU3dhcENncm91cCBpbXBsZW1lbnRzICJsb29rdXAiIGFuZCAiZXhjaGFuZ2UiIG9wZXJhdGlvbnMuCisgKiBJbiB0eXBpY2FsIHVzYWdlLCB0aGlzIHN3YXBfY2dyb3VwIGlzIGFjY2Vzc2VkIHZpYSBtZW1jZydzIGNoYXJnZS91bmNoYXJnZQorICogYWdhaW5zdCBTd2FwQ2FjaGUuIEF0IHN3YXBfZnJlZSgpLCB0aGlzIGlzIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gc3dhcC4KKyAqCisgKiBUaGlzIG1lYW5zLAorICogIC0gd2UgaGF2ZSBubyByYWNlIGluICJleGNoYW5nZSIgd2hlbiB3ZSdyZSBhY2Nlc3NlZCB2aWEgU3dhcENhY2hlIGJlY2F1c2UKKyAqICAgIFN3YXBDYWNoZShhbmQgaXRzIHN3cF9lbnRyeSkgaXMgdW5kZXIgbG9jay4KKyAqICAtIFdoZW4gY2FsbGVkIHZpYSBzd2FwX2ZyZWUoKSwgdGhlcmUgaXMgbm8gdXNlciBvZiB0aGlzIGVudHJ5IGFuZCBubyByYWNlLgorICogVGhlbiwgd2UgZG9uJ3QgbmVlZCBsb2NrIGFyb3VuZCAiZXhjaGFuZ2UiLgorICoKKyAqIFRPRE86IHdlIGNhbiBwdXNoIHRoZXNlIGJ1ZmZlcnMgb3V0IHRvIEhJR0hNRU0uCisgKi8KKworLyoKKyAqIGFsbG9jYXRlIGJ1ZmZlciBmb3Igc3dhcF9jZ3JvdXAuCisgKi8KK3N0YXRpYyBpbnQgc3dhcF9jZ3JvdXBfcHJlcGFyZShpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlzdHJ1Y3Qgc3dhcF9jZ3JvdXBfY3RybCAqY3RybDsKKwl1bnNpZ25lZCBsb25nIGlkeCwgbWF4OworCisJaWYgKCFkb19zd2FwX2FjY291bnQpCisJCXJldHVybiAwOworCWN0cmwgPSAmc3dhcF9jZ3JvdXBfY3RybFt0eXBlXTsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgY3RybC0+bGVuZ3RoOyBpZHgrKykgeworCQlwYWdlID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7CisJCWlmICghcGFnZSkKKwkJCWdvdG8gbm90X2Vub3VnaF9wYWdlOworCQljdHJsLT5tYXBbaWR4XSA9IHBhZ2U7CisJfQorCXJldHVybiAwOworbm90X2Vub3VnaF9wYWdlOgorCW1heCA9IGlkeDsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IG1heDsgaWR4KyspCisJCV9fZnJlZV9wYWdlKGN0cmwtPm1hcFtpZHhdKTsKKworCXJldHVybiAtRU5PTUVNOworfQorCisvKioKKyAqIHN3YXBfY2dyb3VwX3JlY29yZCAtIHJlY29yZCBtZW1fY2dyb3VwIGZvciB0aGlzIHN3cF9lbnRyeS4KKyAqIEBlbnQ6IHN3YXAgZW50cnkgdG8gYmUgcmVjb3JkZWQgaW50bworICogQG1lbTogbWVtX2Nncm91cCB0byBiZSByZWNvcmRlZAorICoKKyAqIFJldHVybnMgb2xkIHZhbHVlIGF0IHN1Y2Nlc3MsIE5VTEwgYXQgZmFpbHVyZS4KKyAqIChPZiBjb3Vyc2UsIG9sZCB2YWx1ZSBjYW4gYmUgTlVMTC4pCisgKi8KK3N0cnVjdCBtZW1fY2dyb3VwICpzd2FwX2Nncm91cF9yZWNvcmQoc3dwX2VudHJ5X3QgZW50LCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKQoreworCWludCB0eXBlID0gc3dwX3R5cGUoZW50KTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IHN3cF9vZmZzZXQoZW50KTsKKwl1bnNpZ25lZCBsb25nIGlkeCA9IG9mZnNldCAvIFNDX1BFUl9QQUdFOworCXVuc2lnbmVkIGxvbmcgcG9zID0gb2Zmc2V0ICYgU0NfUE9TX01BU0s7CisJc3RydWN0IHN3YXBfY2dyb3VwX2N0cmwgKmN0cmw7CisJc3RydWN0IHBhZ2UgKm1hcHBhZ2U7CisJc3RydWN0IHN3YXBfY2dyb3VwICpzYzsKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqb2xkOworCisJaWYgKCFkb19zd2FwX2FjY291bnQpCisJCXJldHVybiBOVUxMOworCisJY3RybCA9ICZzd2FwX2Nncm91cF9jdHJsW3R5cGVdOworCisJbWFwcGFnZSA9IGN0cmwtPm1hcFtpZHhdOworCXNjID0gcGFnZV9hZGRyZXNzKG1hcHBhZ2UpOworCXNjICs9IHBvczsKKwlvbGQgPSBzYy0+dmFsOworCXNjLT52YWwgPSBtZW07CisKKwlyZXR1cm4gb2xkOworfQorCisvKioKKyAqIGxvb2t1cF9zd2FwX2Nncm91cCAtIGxvb2t1cCBtZW1fY2dyb3VwIHRpZWQgdG8gc3dhcCBlbnRyeQorICogQGVudDogc3dhcCBlbnRyeSB0byBiZSBsb29rZWQgdXAuCisgKgorICogUmV0dXJucyBwb2ludGVyIHRvIG1lbV9jZ3JvdXAgYXQgc3VjY2Vzcy4gTlVMTCBhdCBmYWlsdXJlLgorICovCitzdHJ1Y3QgbWVtX2Nncm91cCAqbG9va3VwX3N3YXBfY2dyb3VwKHN3cF9lbnRyeV90IGVudCkKK3sKKwlpbnQgdHlwZSA9IHN3cF90eXBlKGVudCk7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSBzd3Bfb2Zmc2V0KGVudCk7CisJdW5zaWduZWQgbG9uZyBpZHggPSBvZmZzZXQgLyBTQ19QRVJfUEFHRTsKKwl1bnNpZ25lZCBsb25nIHBvcyA9IG9mZnNldCAmIFNDX1BPU19NQVNLOworCXN0cnVjdCBzd2FwX2Nncm91cF9jdHJsICpjdHJsOworCXN0cnVjdCBwYWdlICptYXBwYWdlOworCXN0cnVjdCBzd2FwX2Nncm91cCAqc2M7CisJc3RydWN0IG1lbV9jZ3JvdXAgKnJldDsKKworCWlmICghZG9fc3dhcF9hY2NvdW50KQorCQlyZXR1cm4gTlVMTDsKKworCWN0cmwgPSAmc3dhcF9jZ3JvdXBfY3RybFt0eXBlXTsKKwltYXBwYWdlID0gY3RybC0+bWFwW2lkeF07CisJc2MgPSBwYWdlX2FkZHJlc3MobWFwcGFnZSk7CisJc2MgKz0gcG9zOworCXJldCA9IHNjLT52YWw7CisJcmV0dXJuIHJldDsKK30KKworaW50IHN3YXBfY2dyb3VwX3N3YXBvbihpbnQgdHlwZSwgdW5zaWduZWQgbG9uZyBtYXhfcGFnZXMpCit7CisJdm9pZCAqYXJyYXk7CisJdW5zaWduZWQgbG9uZyBhcnJheV9zaXplOworCXVuc2lnbmVkIGxvbmcgbGVuZ3RoOworCXN0cnVjdCBzd2FwX2Nncm91cF9jdHJsICpjdHJsOworCisJaWYgKCFkb19zd2FwX2FjY291bnQpCisJCXJldHVybiAwOworCisJbGVuZ3RoID0gKChtYXhfcGFnZXMvU0NfUEVSX1BBR0UpICsgMSk7CisJYXJyYXlfc2l6ZSA9IGxlbmd0aCAqIHNpemVvZih2b2lkICopOworCisJYXJyYXkgPSB2bWFsbG9jKGFycmF5X3NpemUpOworCWlmICghYXJyYXkpCisJCWdvdG8gbm9tZW07CisKKwltZW1zZXQoYXJyYXksIDAsIGFycmF5X3NpemUpOworCWN0cmwgPSAmc3dhcF9jZ3JvdXBfY3RybFt0eXBlXTsKKwltdXRleF9sb2NrKCZzd2FwX2Nncm91cF9tdXRleCk7CisJY3RybC0+bGVuZ3RoID0gbGVuZ3RoOworCWN0cmwtPm1hcCA9IGFycmF5OworCWlmIChzd2FwX2Nncm91cF9wcmVwYXJlKHR5cGUpKSB7CisJCS8qIG1lbW9yeSBzaG9ydGFnZSAqLworCQljdHJsLT5tYXAgPSBOVUxMOworCQljdHJsLT5sZW5ndGggPSAwOworCQl2ZnJlZShhcnJheSk7CisJCW11dGV4X3VubG9jaygmc3dhcF9jZ3JvdXBfbXV0ZXgpOworCQlnb3RvIG5vbWVtOworCX0KKwltdXRleF91bmxvY2soJnN3YXBfY2dyb3VwX211dGV4KTsKKworCXByaW50ayhLRVJOX0lORk8KKwkJInN3YXBfY2dyb3VwOiB1c2VzICVsZCBieXRlcyBvZiB2bWFsbG9jIGZvciBwb2ludGVyIGFycmF5IHNwYWNlIgorCQkiIGFuZCAlbGQgYnl0ZXMgdG8gaG9sZCBtZW1fY2dyb3VwIHBvaW50ZXJzIG9uIHN3YXBcbiIsCisJCWFycmF5X3NpemUsIGxlbmd0aCAqIFBBR0VfU0laRSk7CisJcHJpbnRrKEtFUk5fSU5GTworCSJzd2FwX2Nncm91cCBjYW4gYmUgZGlzYWJsZWQgYnkgbm9zd2FwYWNjb3VudCBib290IG9wdGlvbi5cbiIpOworCisJcmV0dXJuIDA7Citub21lbToKKwlwcmludGsoS0VSTl9JTkZPICJjb3VsZG4ndCBhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5IGZvciBzd2FwX2Nncm91cC5cbiIpOworCXByaW50ayhLRVJOX0lORk8KKwkJInN3YXBfY2dyb3VwIGNhbiBiZSBkaXNhYmxlZCBieSBub3N3YXBhY2NvdW50IGJvb3Qgb3B0aW9uXG4iKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKwordm9pZCBzd2FwX2Nncm91cF9zd2Fwb2ZmKGludCB0eXBlKQoreworCWludCBpOworCXN0cnVjdCBzd2FwX2Nncm91cF9jdHJsICpjdHJsOworCisJaWYgKCFkb19zd2FwX2FjY291bnQpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJnN3YXBfY2dyb3VwX211dGV4KTsKKwljdHJsID0gJnN3YXBfY2dyb3VwX2N0cmxbdHlwZV07CisJaWYgKGN0cmwtPm1hcCkgeworCQlmb3IgKGkgPSAwOyBpIDwgY3RybC0+bGVuZ3RoOyBpKyspIHsKKwkJCXN0cnVjdCBwYWdlICpwYWdlID0gY3RybC0+bWFwW2ldOworCQkJaWYgKHBhZ2UpCisJCQkJX19mcmVlX3BhZ2UocGFnZSk7CisJCX0KKwkJdmZyZWUoY3RybC0+bWFwKTsKKwkJY3RybC0+bWFwID0gTlVMTDsKKwkJY3RybC0+bGVuZ3RoID0gMDsKKwl9CisJbXV0ZXhfdW5sb2NrKCZzd2FwX2Nncm91cF9tdXRleCk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbW0vcGFnZV9pby5jIGIvbW0vcGFnZV9pby5jCmluZGV4IDA2NWM0NDguLmRjNmNlMGEgMTAwNjQ0Ci0tLSBhL21tL3BhZ2VfaW8uYworKysgYi9tbS9wYWdlX2lvLmMKQEAgLTk4LDcgKzk4LDcgQEAKIAlzdHJ1Y3QgYmlvICpiaW87CiAJaW50IHJldCA9IDAsIHJ3ID0gV1JJVEU7CiAKLQlpZiAocmVtb3ZlX2V4Y2x1c2l2ZV9zd2FwX3BhZ2UocGFnZSkpIHsKKwlpZiAodHJ5X3RvX2ZyZWVfc3dhcChwYWdlKSkgewogCQl1bmxvY2tfcGFnZShwYWdlKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMTI1LDggKzEyNSw4IEBACiAJc3RydWN0IGJpbyAqYmlvOwogCWludCByZXQgPSAwOwogCi0JQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKLQlCVUdfT04oUGFnZVVwdG9kYXRlKHBhZ2UpKTsKKwlWTV9CVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOworCVZNX0JVR19PTihQYWdlVXB0b2RhdGUocGFnZSkpOwogCWJpbyA9IGdldF9zd2FwX2JpbyhHRlBfS0VSTkVMLCBwYWdlX3ByaXZhdGUocGFnZSksIHBhZ2UsCiAJCQkJZW5kX3N3YXBfYmlvX3JlYWQpOwogCWlmIChiaW8gPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvbW0vcm1hcC5jIGIvbW0vcm1hcC5jCmluZGV4IDEwOTkzOTQuLmFjNGFmOGMgMTAwNjQ0Ci0tLSBhL21tL3JtYXAuYworKysgYi9tbS9ybWFwLmMKQEAgLTQ3LDkgKzQ3LDkgQEAKICNpbmNsdWRlIDxsaW51eC9ybWFwLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgogI2luY2x1ZGUgPGxpbnV4L21lbWNvbnRyb2wuaD4KICNpbmNsdWRlIDxsaW51eC9tbXVfbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9taWdyYXRlLmg+CiAKICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KIApAQCAtMTkxLDcgKzE5MSw3IEBACiAgKiBHZXR0aW5nIGEgbG9jayBvbiBhIHN0YWJsZSBhbm9uX3ZtYSBmcm9tIGEgcGFnZSBvZmYgdGhlIExSVSBpcwogICogdHJpY2t5OiBwYWdlX2xvY2tfYW5vbl92bWEgcmVseSBvbiBSQ1UgdG8gZ3VhcmQgYWdhaW5zdCB0aGUgcmFjZXMuCiAgKi8KLXN0cnVjdCBhbm9uX3ZtYSAqcGFnZV9sb2NrX2Fub25fdm1hKHN0cnVjdCBwYWdlICpwYWdlKQorc3RhdGljIHN0cnVjdCBhbm9uX3ZtYSAqcGFnZV9sb2NrX2Fub25fdm1hKHN0cnVjdCBwYWdlICpwYWdlKQogewogCXN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWE7CiAJdW5zaWduZWQgbG9uZyBhbm9uX21hcHBpbmc7CkBAIC0yMTEsNyArMjExLDcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBwYWdlX3VubG9ja19hbm9uX3ZtYShzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hKQorc3RhdGljIHZvaWQgcGFnZV91bmxvY2tfYW5vbl92bWEoc3RydWN0IGFub25fdm1hICphbm9uX3ZtYSkKIHsKIAlzcGluX3VubG9jaygmYW5vbl92bWEtPmxvY2spOwogCXJjdV9yZWFkX3VubG9jaygpOwpAQCAtMzU5LDggKzM1OSwxNyBAQAogCQlnb3RvIG91dF91bm1hcDsKIAl9CiAKLQlpZiAocHRlcF9jbGVhcl9mbHVzaF95b3VuZ19ub3RpZnkodm1hLCBhZGRyZXNzLCBwdGUpKQotCQlyZWZlcmVuY2VkKys7CisJaWYgKHB0ZXBfY2xlYXJfZmx1c2hfeW91bmdfbm90aWZ5KHZtYSwgYWRkcmVzcywgcHRlKSkgeworCQkvKgorCQkgKiBEb24ndCB0cmVhdCBhIHJlZmVyZW5jZSB0aHJvdWdoIGEgc2VxdWVudGlhbGx5IHJlYWQKKwkJICogbWFwcGluZyBhcyBzdWNoLiAgSWYgdGhlIHBhZ2UgaGFzIGJlZW4gdXNlZCBpbgorCQkgKiBhbm90aGVyIG1hcHBpbmcsIHdlIHdpbGwgY2F0Y2ggaXQ7IGlmIHRoaXMgb3RoZXIKKwkJICogbWFwcGluZyBpcyBhbHJlYWR5IGdvbmUsIHRoZSB1bm1hcCBwYXRoIHdpbGwgaGF2ZQorCQkgKiBzZXQgUEdfcmVmZXJlbmNlZCBvciBhY3RpdmF0ZWQgdGhlIHBhZ2UuCisJCSAqLworCQlpZiAobGlrZWx5KCFWTV9TZXF1ZW50aWFsUmVhZEhpbnQodm1hKSkpCisJCQlyZWZlcmVuY2VkKys7CisJfQogCiAJLyogUHJldGVuZCB0aGUgcGFnZSBpcyByZWZlcmVuY2VkIGlmIHRoZSB0YXNrIGhhcyB0aGUKIAkgICBzd2FwIHRva2VuIGFuZCBpcyBpbiB0aGUgbWlkZGxlIG9mIGEgcGFnZSBmYXVsdC4gKi8KQEAgLTY2MSw5ICs2NzAsMTQgQEAKIHZvaWQgcGFnZV9hZGRfbmV3X2Fub25fcm1hcChzdHJ1Y3QgcGFnZSAqcGFnZSwKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewotCUJVR19PTihhZGRyZXNzIDwgdm1hLT52bV9zdGFydCB8fCBhZGRyZXNzID49IHZtYS0+dm1fZW5kKTsKLQlhdG9taWNfc2V0KCZwYWdlLT5fbWFwY291bnQsIDApOyAvKiBlbGV2YXRlIGNvdW50IGJ5IDEgKHN0YXJ0cyBhdCAtMSkgKi8KKwlWTV9CVUdfT04oYWRkcmVzcyA8IHZtYS0+dm1fc3RhcnQgfHwgYWRkcmVzcyA+PSB2bWEtPnZtX2VuZCk7CisJU2V0UGFnZVN3YXBCYWNrZWQocGFnZSk7CisJYXRvbWljX3NldCgmcGFnZS0+X21hcGNvdW50LCAwKTsgLyogaW5jcmVtZW50IGNvdW50IChzdGFydHMgYXQgLTEpICovCiAJX19wYWdlX3NldF9hbm9uX3JtYXAocGFnZSwgdm1hLCBhZGRyZXNzKTsKKwlpZiAocGFnZV9ldmljdGFibGUocGFnZSwgdm1hKSkKKwkJbHJ1X2NhY2hlX2FkZF9scnUocGFnZSwgTFJVX0FDVElWRV9BTk9OKTsKKwllbHNlCisJCWFkZF9wYWdlX3RvX3VuZXZpY3RhYmxlX2xpc3QocGFnZSk7CiB9CiAKIC8qKgpAQCAtNjkzLDcgKzcwNyw2IEBACiAgKi8KIHZvaWQgcGFnZV9kdXBfcm1hcChzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKLQlCVUdfT04ocGFnZV9tYXBjb3VudChwYWdlKSA9PSAwKTsKIAlpZiAoUGFnZUFub24ocGFnZSkpCiAJCV9fcGFnZV9jaGVja19hbm9uX3JtYXAocGFnZSwgdm1hLCBhZGRyZXNzKTsKIAlhdG9taWNfaW5jKCZwYWdlLT5fbWFwY291bnQpOwpAQCAtNzAzLDI4ICs3MTYsMTIgQEAKIC8qKgogICogcGFnZV9yZW1vdmVfcm1hcCAtIHRha2UgZG93biBwdGUgbWFwcGluZyBmcm9tIGEgcGFnZQogICogQHBhZ2U6IHBhZ2UgdG8gcmVtb3ZlIG1hcHBpbmcgZnJvbQotICogQHZtYTogdGhlIHZtIGFyZWEgaW4gd2hpY2ggdGhlIG1hcHBpbmcgaXMgcmVtb3ZlZAogICoKICAqIFRoZSBjYWxsZXIgbmVlZHMgdG8gaG9sZCB0aGUgcHRlIGxvY2suCiAgKi8KLXZvaWQgcGFnZV9yZW1vdmVfcm1hcChzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit2b2lkIHBhZ2VfcmVtb3ZlX3JtYXAoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiAJaWYgKGF0b21pY19hZGRfbmVnYXRpdmUoLTEsICZwYWdlLT5fbWFwY291bnQpKSB7Ci0JCWlmICh1bmxpa2VseShwYWdlX21hcGNvdW50KHBhZ2UpIDwgMCkpIHsKLQkJCXByaW50ayAoS0VSTl9FTUVSRyAiRWVlayEgcGFnZV9tYXBjb3VudChwYWdlKSB3ZW50IG5lZ2F0aXZlISAoJWQpXG4iLCBwYWdlX21hcGNvdW50KHBhZ2UpKTsKLQkJCXByaW50ayAoS0VSTl9FTUVSRyAiICBwYWdlIHBmbiA9ICVseFxuIiwgcGFnZV90b19wZm4ocGFnZSkpOwotCQkJcHJpbnRrIChLRVJOX0VNRVJHICIgIHBhZ2UtPmZsYWdzID0gJWx4XG4iLCBwYWdlLT5mbGFncyk7Ci0JCQlwcmludGsgKEtFUk5fRU1FUkcgIiAgcGFnZS0+Y291bnQgPSAleFxuIiwgcGFnZV9jb3VudChwYWdlKSk7Ci0JCQlwcmludGsgKEtFUk5fRU1FUkcgIiAgcGFnZS0+bWFwcGluZyA9ICVwXG4iLCBwYWdlLT5tYXBwaW5nKTsKLQkJCXByaW50X3N5bWJvbCAoS0VSTl9FTUVSRyAiICB2bWEtPnZtX29wcyA9ICVzXG4iLCAodW5zaWduZWQgbG9uZyl2bWEtPnZtX29wcyk7Ci0JCQlpZiAodm1hLT52bV9vcHMpIHsKLQkJCQlwcmludF9zeW1ib2wgKEtFUk5fRU1FUkcgIiAgdm1hLT52bV9vcHMtPmZhdWx0ID0gJXNcbiIsICh1bnNpZ25lZCBsb25nKXZtYS0+dm1fb3BzLT5mYXVsdCk7Ci0JCQl9Ci0JCQlpZiAodm1hLT52bV9maWxlICYmIHZtYS0+dm1fZmlsZS0+Zl9vcCkKLQkJCQlwcmludF9zeW1ib2wgKEtFUk5fRU1FUkcgIiAgdm1hLT52bV9maWxlLT5mX29wLT5tbWFwID0gJXNcbiIsICh1bnNpZ25lZCBsb25nKXZtYS0+dm1fZmlsZS0+Zl9vcC0+bW1hcCk7Ci0JCQlCVUcoKTsKLQkJfQotCiAJCS8qCiAJCSAqIE5vdyB0aGF0IHRoZSBsYXN0IHB0ZSBoYXMgZ29uZSwgczM5MCBtdXN0IHRyYW5zZmVyIGRpcnR5CiAJCSAqIGZsYWcgZnJvbSBzdG9yYWdlIGtleSB0byBzdHJ1Y3QgcGFnZS4gIFdlIGNhbiB1c3VhbGx5IHNraXAKQEAgLTgxOCw4ICs4MTUsNyBAQAogCQkJCXNwaW5fdW5sb2NrKCZtbWxpc3RfbG9jayk7CiAJCQl9CiAJCQlkZWNfbW1fY291bnRlcihtbSwgYW5vbl9yc3MpOwotI2lmZGVmIENPTkZJR19NSUdSQVRJT04KLQkJfSBlbHNlIHsKKwkJfSBlbHNlIGlmIChQQUdFX01JR1JBVElPTikgewogCQkJLyoKIAkJCSAqIFN0b3JlIHRoZSBwZm4gb2YgdGhlIHBhZ2UgaW4gYSBzcGVjaWFsIG1pZ3JhdGlvbgogCQkJICogcHRlLiBkb19zd2FwX3BhZ2UoKSB3aWxsIHdhaXQgdW50aWwgdGhlIG1pZ3JhdGlvbgpAQCAtODI3LDIzICs4MjMsMTkgQEAKIAkJCSAqLwogCQkJQlVHX09OKCFtaWdyYXRpb24pOwogCQkJZW50cnkgPSBtYWtlX21pZ3JhdGlvbl9lbnRyeShwYWdlLCBwdGVfd3JpdGUocHRldmFsKSk7Ci0jZW5kaWYKIAkJfQogCQlzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdGUsIHN3cF9lbnRyeV90b19wdGUoZW50cnkpKTsKIAkJQlVHX09OKHB0ZV9maWxlKCpwdGUpKTsKLQl9IGVsc2UKLSNpZmRlZiBDT05GSUdfTUlHUkFUSU9OCi0JaWYgKG1pZ3JhdGlvbikgeworCX0gZWxzZSBpZiAoUEFHRV9NSUdSQVRJT04gJiYgbWlncmF0aW9uKSB7CiAJCS8qIEVzdGFibGlzaCBtaWdyYXRpb24gZW50cnkgZm9yIGEgZmlsZSBwYWdlICovCiAJCXN3cF9lbnRyeV90IGVudHJ5OwogCQllbnRyeSA9IG1ha2VfbWlncmF0aW9uX2VudHJ5KHBhZ2UsIHB0ZV93cml0ZShwdGV2YWwpKTsKIAkJc2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHRlLCBzd3BfZW50cnlfdG9fcHRlKGVudHJ5KSk7CiAJfSBlbHNlCi0jZW5kaWYKIAkJZGVjX21tX2NvdW50ZXIobW0sIGZpbGVfcnNzKTsKIAogCi0JcGFnZV9yZW1vdmVfcm1hcChwYWdlLCB2bWEpOworCXBhZ2VfcmVtb3ZlX3JtYXAocGFnZSk7CiAJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwogCiBvdXRfdW5tYXA6CkBAIC05NTgsNyArOTUwLDcgQEAKIAkJaWYgKHB0ZV9kaXJ0eShwdGV2YWwpKQogCQkJc2V0X3BhZ2VfZGlydHkocGFnZSk7CiAKLQkJcGFnZV9yZW1vdmVfcm1hcChwYWdlLCB2bWEpOworCQlwYWdlX3JlbW92ZV9ybWFwKHBhZ2UpOwogCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJCWRlY19tbV9jb3VudGVyKG1tLCBmaWxlX3Jzcyk7CiAJCSgqbWFwY291bnQpLS07CmRpZmYgLS1naXQgYS9tbS9zaG1lbS5jIGIvbW0vc2htZW0uYwppbmRleCBmMWIwZDQ4Li41ZDBkZTk2IDEwMDY0NAotLS0gYS9tbS9zaG1lbS5jCisrKyBiL21tL3NobWVtLmMKQEAgLTE0LDMxICsxNCwzOSBAQAogICogQ29weXJpZ2h0IChjKSAyMDA0LCBMdWtlIEtlbm5ldGggQ2Fzc29uIExlaWdodG9uIDxsa2NsQGxrY2wubmV0PgogICogQ29weXJpZ2h0IChjKSAyMDA0IFJlZCBIYXQsIEluYy4sIEphbWVzIE1vcnJpcyA8am1vcnJpc0ByZWRoYXQuY29tPgogICoKKyAqIHRpbnktc2htZW06CisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggTWF0dCBNYWNrYWxsIDxtcG1Ac2VsZW5pYy5jb20+CisgKgogICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3dhcC5oPgorCitzdGF0aWMgc3RydWN0IHZmc21vdW50ICpzaG1fbW50OworCisjaWZkZWYgQ09ORklHX1NITUVNCiAvKgogICogVGhpcyB2aXJ0dWFsIG1lbW9yeSBmaWxlc3lzdGVtIGlzIGhlYXZpbHkgYmFzZWQgb24gdGhlIHJhbWZzLiBJdAogICogZXh0ZW5kcyByYW1mcyBieSB0aGUgYWJpbGl0eSB0byB1c2Ugc3dhcCBhbmQgaG9ub3IgcmVzb3VyY2UgbGltaXRzCiAgKiB3aGljaCBtYWtlcyBpdCBhIGNvbXBsZXRlbHkgdXNhYmxlIGZpbGVzeXN0ZW0uCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3hhdHRyLmg+CiAjaW5jbHVkZSA8bGludXgvZXhwb3J0ZnMuaD4KICNpbmNsdWRlIDxsaW51eC9nZW5lcmljX2FjbC5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW1hbi5oPgotI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgogI2luY2x1ZGUgPGxpbnV4L3NobWVtX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW91bnQuaD4KICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KICNpbmNsdWRlIDxsaW51eC92ZnMuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KQEAgLTkyMCw3ICs5MjgsMTEgQEAKIAllcnJvciA9IDE7CiAJaWYgKCFpbm9kZSkKIAkJZ290byBvdXQ7Ci0JLyogUHJlY2hhcmdlIHBhZ2UgdXNpbmcgR0ZQX0tFUk5FTCB3aGlsZSB3ZSBjYW4gd2FpdCAqLworCS8qCisJICogQ2hhcmdlIHBhZ2UgdXNpbmcgR0ZQX0tFUk5FTCB3aGlsZSB3ZSBjYW4gd2FpdC4KKwkgKiBDaGFyZ2VkIGJhY2sgdG8gdGhlIHVzZXIobm90IHRvIGNhbGxlcikgd2hlbiBzd2FwIGFjY291bnQgaXMgdXNlZC4KKwkgKiBhZGRfdG9fcGFnZV9jYWNoZSgpIHdpbGwgYmUgY2FsbGVkIHdpdGggR0ZQX05PV0FJVC4KKwkgKi8KIAllcnJvciA9IG1lbV9jZ3JvdXBfY2FjaGVfY2hhcmdlKHBhZ2UsIGN1cnJlbnQtPm1tLCBHRlBfS0VSTkVMKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0OwpAQCAtMTMxMiwxNSArMTMyNCwxOSBAQAogCQl9IGVsc2UgewogCQkJc2htZW1fc3dwX3VubWFwKGVudHJ5KTsKIAkJCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKLQkJCXVubG9ja19wYWdlKHN3YXBwYWdlKTsKLQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShzd2FwcGFnZSk7CiAJCQlpZiAoZXJyb3IgPT0gLUVOT01FTSkgewogCQkJCS8qIGFsbG93IHJlY2xhaW0gZnJvbSB0aGlzIG1lbW9yeSBjZ3JvdXAgKi8KLQkJCQllcnJvciA9IG1lbV9jZ3JvdXBfc2hyaW5rX3VzYWdlKGN1cnJlbnQtPm1tLAorCQkJCWVycm9yID0gbWVtX2Nncm91cF9zaHJpbmtfdXNhZ2Uoc3dhcHBhZ2UsCisJCQkJCQkJCWN1cnJlbnQtPm1tLAogCQkJCQkJCQlnZnApOwotCQkJCWlmIChlcnJvcikKKwkJCQlpZiAoZXJyb3IpIHsKKwkJCQkJdW5sb2NrX3BhZ2Uoc3dhcHBhZ2UpOworCQkJCQlwYWdlX2NhY2hlX3JlbGVhc2Uoc3dhcHBhZ2UpOwogCQkJCQlnb3RvIGZhaWxlZDsKKwkJCQl9CiAJCQl9CisJCQl1bmxvY2tfcGFnZShzd2FwcGFnZSk7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2Uoc3dhcHBhZ2UpOwogCQkJZ290byByZXBlYXQ7CiAJCX0KIAl9IGVsc2UgaWYgKHNncCA9PSBTR1BfUkVBRCAmJiAhZmlsZXBhZ2UpIHsKQEAgLTEzNzEsNyArMTM4Nyw3IEBACiAKIAkJCS8qIFByZWNoYXJnZSBwYWdlIHdoaWxlIHdlIGNhbiB3YWl0LCBjb21wZW5zYXRlIGFmdGVyICovCiAJCQllcnJvciA9IG1lbV9jZ3JvdXBfY2FjaGVfY2hhcmdlKGZpbGVwYWdlLCBjdXJyZW50LT5tbSwKLQkJCQkJCQlnZnAgJiB+X19HRlBfSElHSE1FTSk7CisJCQkJCUdGUF9LRVJORUwpOwogCQkJaWYgKGVycm9yKSB7CiAJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKGZpbGVwYWdlKTsKIAkJCQlzaG1lbV91bmFjY3RfYmxvY2tzKGluZm8tPmZsYWdzLCAxKTsKQEAgLTE0NDQsNyArMTQ2MCw2IEBACiAJaWYgKGVycm9yKQogCQlyZXR1cm4gKChlcnJvciA9PSAtRU5PTUVNKSA/IFZNX0ZBVUxUX09PTSA6IFZNX0ZBVUxUX1NJR0JVUyk7CiAKLQltYXJrX3BhZ2VfYWNjZXNzZWQodm1mLT5wYWdlKTsKIAlyZXR1cm4gcmV0IHwgVk1fRkFVTFRfTE9DS0VEOwogfQogCkBAIC0yNDg2LDcgKzI1MDEsNiBAQAogCS5nZXRfc2IJCT0gc2htZW1fZ2V0X3NiLAogCS5raWxsX3NiCT0ga2lsbF9saXR0ZXJfc3VwZXIsCiB9Owotc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqc2htX21udDsKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF90bXBmcyh2b2lkKQogewpAQCAtMjUyNSw3ICsyNTM5LDUxIEBACiAJc2htX21udCA9IEVSUl9QVFIoZXJyb3IpOwogCXJldHVybiBlcnJvcjsKIH0KLW1vZHVsZV9pbml0KGluaXRfdG1wZnMpCisKKyNlbHNlIC8qICFDT05GSUdfU0hNRU0gKi8KKworLyoKKyAqIHRpbnktc2htZW06IHNpbXBsZSBzaG1lbWZzIGFuZCB0bXBmcyB1c2luZyByYW1mcyBjb2RlCisgKgorICogVGhpcyBpcyBpbnRlbmRlZCBmb3Igc21hbGwgc3lzdGVtIHdoZXJlIHRoZSBiZW5lZml0cyBvZiB0aGUgZnVsbAorICogc2htZW0gY29kZSAoc3dhcC1iYWNrZWQgYW5kIHJlc291cmNlLWxpbWl0ZWQpIGFyZSBvdXR3ZWlnaGVkIGJ5CisgKiB0aGVpciBjb21wbGV4aXR5LiBPbiBzeXN0ZW1zIHdpdGhvdXQgc3dhcCB0aGlzIGNvZGUgc2hvdWxkIGJlCisgKiBlZmZlY3RpdmVseSBlcXVpdmFsZW50LCBidXQgbXVjaCBsaWdodGVyIHdlaWdodC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcmFtZnMuaD4KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHRtcGZzX2ZzX3R5cGUgPSB7CisJLm5hbWUJCT0gInRtcGZzIiwKKwkuZ2V0X3NiCQk9IHJhbWZzX2dldF9zYiwKKwkua2lsbF9zYgk9IGtpbGxfbGl0dGVyX3N1cGVyLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF90bXBmcyh2b2lkKQoreworCUJVR19PTihyZWdpc3Rlcl9maWxlc3lzdGVtKCZ0bXBmc19mc190eXBlKSAhPSAwKTsKKworCXNobV9tbnQgPSBrZXJuX21vdW50KCZ0bXBmc19mc190eXBlKTsKKwlCVUdfT04oSVNfRVJSKHNobV9tbnQpKTsKKworCXJldHVybiAwOworfQorCitpbnQgc2htZW1fdW51c2Uoc3dwX2VudHJ5X3QgZW50cnksIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXJldHVybiAwOworfQorCisjZGVmaW5lIHNobWVtX2ZpbGVfb3BlcmF0aW9ucyByYW1mc19maWxlX29wZXJhdGlvbnMKKyNkZWZpbmUgc2htZW1fdm1fb3BzIGdlbmVyaWNfZmlsZV92bV9vcHMKKyNkZWZpbmUgc2htZW1fZ2V0X2lub2RlIHJhbWZzX2dldF9pbm9kZQorI2RlZmluZSBzaG1lbV9hY2N0X3NpemUoYSwgYikgMAorI2RlZmluZSBzaG1lbV91bmFjY3Rfc2l6ZShhLCBiKSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgU0hNRU1fTUFYX0JZVEVTIExMT05HX01BWAorCisjZW5kaWYgLyogQ09ORklHX1NITUVNICovCisKKy8qIGNvbW1vbiBjb2RlICovCiAKIC8qKgogICogc2htZW1fZmlsZV9zZXR1cCAtIGdldCBhbiB1bmxpbmtlZCBmaWxlIGxpdmluZyBpbiB0bXBmcwpAQCAtMjU2OSwxMiArMjYyNywyMCBAQAogCWlmICghaW5vZGUpCiAJCWdvdG8gY2xvc2VfZmlsZTsKIAorI2lmZGVmIENPTkZJR19TSE1FTQogCVNITUVNX0koaW5vZGUpLT5mbGFncyA9IGZsYWdzICYgVk1fQUNDT1VOVDsKKyNlbmRpZgogCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CiAJaW5vZGUtPmlfc2l6ZSA9IHNpemU7CiAJaW5vZGUtPmlfbmxpbmsgPSAwOwkvKiBJdCBpcyB1bmxpbmtlZCAqLwogCWluaXRfZmlsZShmaWxlLCBzaG1fbW50LCBkZW50cnksIEZNT0RFX1dSSVRFIHwgRk1PREVfUkVBRCwKLQkJCSZzaG1lbV9maWxlX29wZXJhdGlvbnMpOworCQkgICZzaG1lbV9maWxlX29wZXJhdGlvbnMpOworCisjaWZuZGVmIENPTkZJR19NTVUKKwllcnJvciA9IHJhbWZzX25vbW11X2V4cGFuZF9mb3JfbWFwcGluZyhpbm9kZSwgc2l6ZSk7CisJaWYgKGVycm9yKQorCQlnb3RvIGNsb3NlX2ZpbGU7CisjZW5kaWYKIAlyZXR1cm4gZmlsZTsKIAogY2xvc2VfZmlsZToKQEAgLTI2MDYsMyArMjY3Miw1IEBACiAJdm1hLT52bV9vcHMgPSAmc2htZW1fdm1fb3BzOwogCXJldHVybiAwOwogfQorCittb2R1bGVfaW5pdChpbml0X3RtcGZzKQpkaWZmIC0tZ2l0IGEvbW0vc2x1Yi5jIGIvbW0vc2x1Yi5jCmluZGV4IGYwZTI4OTIuLjYzOTJhZTUgMTAwNjQ0Ci0tLSBhL21tL3NsdWIuYworKysgYi9tbS9zbHViLmMKQEAgLTIyNTQsNyArMjI1NCw3IEBACiAJCSAqIEFkZCBzb21lIGVtcHR5IHBhZGRpbmcgc28gdGhhdCB3ZSBjYW4gY2F0Y2gKIAkJICogb3ZlcndyaXRlcyBmcm9tIGVhcmxpZXIgb2JqZWN0cyByYXRoZXIgdGhhbiBsZXQKIAkJICogdHJhY2tpbmcgaW5mb3JtYXRpb24gb3IgdGhlIGZyZWUgcG9pbnRlciBiZQotCQkgKiBjb3JydXB0ZWQgaWYgYW4gdXNlciB3cml0ZXMgYmVmb3JlIHRoZSBzdGFydAorCQkgKiBjb3JydXB0ZWQgaWYgYSB1c2VyIHdyaXRlcyBiZWZvcmUgdGhlIHN0YXJ0CiAJCSAqIG9mIHRoZSBvYmplY3QuCiAJCSAqLwogCQlzaXplICs9IHNpemVvZih2b2lkICopOwpkaWZmIC0tZ2l0IGEvbW0vc3dhcC5jIGIvbW0vc3dhcC5jCmluZGV4IGIxMzVlYzkuLjhhZGI5ZmUgMTAwNjQ0Ci0tLSBhL21tL3N3YXAuYworKysgYi9tbS9zd2FwLmMKQEAgLTE1MSw2ICsxNTEsMjYgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIHVwZGF0ZV9wYWdlX3JlY2xhaW1fc3RhdChzdHJ1Y3Qgem9uZSAqem9uZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJICAgICBpbnQgZmlsZSwgaW50IHJvdGF0ZWQpCit7CisJc3RydWN0IHpvbmVfcmVjbGFpbV9zdGF0ICpyZWNsYWltX3N0YXQgPSAmem9uZS0+cmVjbGFpbV9zdGF0OworCXN0cnVjdCB6b25lX3JlY2xhaW1fc3RhdCAqbWVtY2dfcmVjbGFpbV9zdGF0OworCisJbWVtY2dfcmVjbGFpbV9zdGF0ID0gbWVtX2Nncm91cF9nZXRfcmVjbGFpbV9zdGF0X2Zyb21fcGFnZShwYWdlKTsKKworCXJlY2xhaW1fc3RhdC0+cmVjZW50X3NjYW5uZWRbZmlsZV0rKzsKKwlpZiAocm90YXRlZCkKKwkJcmVjbGFpbV9zdGF0LT5yZWNlbnRfcm90YXRlZFtmaWxlXSsrOworCisJaWYgKCFtZW1jZ19yZWNsYWltX3N0YXQpCisJCXJldHVybjsKKworCW1lbWNnX3JlY2xhaW1fc3RhdC0+cmVjZW50X3NjYW5uZWRbZmlsZV0rKzsKKwlpZiAocm90YXRlZCkKKwkJbWVtY2dfcmVjbGFpbV9zdGF0LT5yZWNlbnRfcm90YXRlZFtmaWxlXSsrOworfQorCiAvKgogICogRklYTUU6IHNwZWVkIHRoaXMgdXA/CiAgKi8KQEAgLTE2OCwxMCArMTg4LDggQEAKIAkJbHJ1ICs9IExSVV9BQ1RJVkU7CiAJCWFkZF9wYWdlX3RvX2xydV9saXN0KHpvbmUsIHBhZ2UsIGxydSk7CiAJCV9fY291bnRfdm1fZXZlbnQoUEdBQ1RJVkFURSk7Ci0JCW1lbV9jZ3JvdXBfbW92ZV9saXN0cyhwYWdlLCBscnUpOwogCi0JCXpvbmUtPnJlY2VudF9yb3RhdGVkWyEhZmlsZV0rKzsKLQkJem9uZS0+cmVjZW50X3NjYW5uZWRbISFmaWxlXSsrOworCQl1cGRhdGVfcGFnZV9yZWNsYWltX3N0YXQoem9uZSwgcGFnZSwgISFmaWxlLCAxKTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxKCZ6b25lLT5scnVfbG9jayk7CiB9CkBAIC0yNDYsMjUgKzI2NCw2IEBACiAJc3Bpbl91bmxvY2tfaXJxKCZ6b25lLT5scnVfbG9jayk7CiB9CiAKLS8qKgotICogbHJ1X2NhY2hlX2FkZF9hY3RpdmVfb3JfdW5ldmljdGFibGUKLSAqIEBwYWdlOiAgdGhlIHBhZ2UgdG8gYmUgYWRkZWQgdG8gTFJVCi0gKiBAdm1hOiAgIHZtYSBpbiB3aGljaCBwYWdlIGlzIG1hcHBlZCBmb3IgZGV0ZXJtaW5pbmcgcmVjbGFpbWFiaWxpdHkKLSAqCi0gKiBwbGFjZSBAcGFnZSBvbiBhY3RpdmUgb3IgdW5ldmljdGFibGUgTFJVIGxpc3QsIGRlcGVuZGluZyBvbgotICogcGFnZV9ldmljdGFibGUoKS4gIE5vdGUgdGhhdCBpZiB0aGUgcGFnZSBpcyBub3QgZXZpY3RhYmxlLAotICogaXQgZ29lcyBkaXJlY3RseSBiYWNrIG9udG8gaXQncyB6b25lJ3MgdW5ldmljdGFibGUgbGlzdC4gIEl0IGRvZXMKLSAqIE5PVCB1c2UgYSBwZXIgY3B1IHBhZ2V2ZWMuCi0gKi8KLXZvaWQgbHJ1X2NhY2hlX2FkZF9hY3RpdmVfb3JfdW5ldmljdGFibGUoc3RydWN0IHBhZ2UgKnBhZ2UsCi0JCQkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQotewotCWlmIChwYWdlX2V2aWN0YWJsZShwYWdlLCB2bWEpKQotCQlscnVfY2FjaGVfYWRkX2xydShwYWdlLCBMUlVfQUNUSVZFICsgcGFnZV9pc19maWxlX2NhY2hlKHBhZ2UpKTsKLQllbHNlCi0JCWFkZF9wYWdlX3RvX3VuZXZpY3RhYmxlX2xpc3QocGFnZSk7Ci19Ci0KIC8qCiAgKiBEcmFpbiBwYWdlcyBvdXQgb2YgdGhlIGNwdSdzIHBhZ2V2ZWNzLgogICogRWl0aGVyICJjcHUiIGlzIHRoZSBjdXJyZW50IENQVSwgYW5kIHByZWVtcHRpb24gaGFzIGFscmVhZHkgYmVlbgpAQCAtMzk4LDI4ICszOTcsNiBAQAogRVhQT1JUX1NZTUJPTChfX3BhZ2V2ZWNfcmVsZWFzZSk7CiAKIC8qCi0gKiBwYWdldmVjX3JlbGVhc2UoKSBmb3IgcGFnZXMgd2hpY2ggYXJlIGtub3duIHRvIG5vdCBiZSBvbiB0aGUgTFJVCi0gKgotICogVGhpcyBmdW5jdGlvbiByZWluaXRpYWxpc2VzIHRoZSBjYWxsZXIncyBwYWdldmVjLgotICovCi12b2lkIF9fcGFnZXZlY19yZWxlYXNlX25vbmxydShzdHJ1Y3QgcGFnZXZlYyAqcHZlYykKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgcGFnZXZlYyBwYWdlc190b19mcmVlOwotCi0JcGFnZXZlY19pbml0KCZwYWdlc190b19mcmVlLCBwdmVjLT5jb2xkKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXZlY19jb3VudChwdmVjKTsgaSsrKSB7Ci0JCXN0cnVjdCBwYWdlICpwYWdlID0gcHZlYy0+cGFnZXNbaV07Ci0KLQkJVk1fQlVHX09OKFBhZ2VMUlUocGFnZSkpOwotCQlpZiAocHV0X3BhZ2VfdGVzdHplcm8ocGFnZSkpCi0JCQlwYWdldmVjX2FkZCgmcGFnZXNfdG9fZnJlZSwgcGFnZSk7Ci0JfQotCXBhZ2V2ZWNfZnJlZSgmcGFnZXNfdG9fZnJlZSk7Ci0JcGFnZXZlY19yZWluaXQocHZlYyk7Ci19Ci0KLS8qCiAgKiBBZGQgdGhlIHBhc3NlZCBwYWdlcyB0byB0aGUgTFJVLCB0aGVuIGRyb3AgdGhlIGNhbGxlcidzIHJlZmNvdW50CiAgKiBvbiB0aGVtLiAgUmVpbml0aWFsaXNlcyB0aGUgY2FsbGVyJ3MgcGFnZXZlYy4KICAqLwpAQCAtNDI3LDEyICs0MDQsMTQgQEAKIHsKIAlpbnQgaTsKIAlzdHJ1Y3Qgem9uZSAqem9uZSA9IE5VTEw7CisKIAlWTV9CVUdfT04oaXNfdW5ldmljdGFibGVfbHJ1KGxydSkpOwogCiAJZm9yIChpID0gMDsgaSA8IHBhZ2V2ZWNfY291bnQocHZlYyk7IGkrKykgewogCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHB2ZWMtPnBhZ2VzW2ldOwogCQlzdHJ1Y3Qgem9uZSAqcGFnZXpvbmUgPSBwYWdlX3pvbmUocGFnZSk7CiAJCWludCBmaWxlOworCQlpbnQgYWN0aXZlOwogCiAJCWlmIChwYWdlem9uZSAhPSB6b25lKSB7CiAJCQlpZiAoem9uZSkKQEAgLTQ0NCwxMiArNDIzLDExIEBACiAJCVZNX0JVR19PTihQYWdlVW5ldmljdGFibGUocGFnZSkpOwogCQlWTV9CVUdfT04oUGFnZUxSVShwYWdlKSk7CiAJCVNldFBhZ2VMUlUocGFnZSk7CisJCWFjdGl2ZSA9IGlzX2FjdGl2ZV9scnUobHJ1KTsKIAkJZmlsZSA9IGlzX2ZpbGVfbHJ1KGxydSk7Ci0JCXpvbmUtPnJlY2VudF9zY2FubmVkW2ZpbGVdKys7Ci0JCWlmIChpc19hY3RpdmVfbHJ1KGxydSkpIHsKKwkJaWYgKGFjdGl2ZSkKIAkJCVNldFBhZ2VBY3RpdmUocGFnZSk7Ci0JCQl6b25lLT5yZWNlbnRfcm90YXRlZFtmaWxlXSsrOwotCQl9CisJCXVwZGF0ZV9wYWdlX3JlY2xhaW1fc3RhdCh6b25lLCBwYWdlLCBmaWxlLCBhY3RpdmUpOwogCQlhZGRfcGFnZV90b19scnVfbGlzdCh6b25lLCBwYWdlLCBscnUpOwogCX0KIAlpZiAoem9uZSkKQEAgLTQ5NSw4ICs0NzMsNyBAQAogCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHB2ZWMtPnBhZ2VzW2ldOwogCiAJCWlmIChQYWdlU3dhcENhY2hlKHBhZ2UpICYmIHRyeWxvY2tfcGFnZShwYWdlKSkgewotCQkJaWYgKFBhZ2VTd2FwQ2FjaGUocGFnZSkpCi0JCQkJcmVtb3ZlX2V4Y2x1c2l2ZV9zd2FwX3BhZ2VfcmVmKHBhZ2UpOworCQkJdHJ5X3RvX2ZyZWVfc3dhcChwYWdlKTsKIAkJCXVubG9ja19wYWdlKHBhZ2UpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvbW0vc3dhcF9zdGF0ZS5jIGIvbW0vc3dhcF9zdGF0ZS5jCmluZGV4IDMzNTNjOTAuLjNlY2VhOTggMTAwNjQ0Ci0tLSBhL21tL3N3YXBfc3RhdGUuYworKysgYi9tbS9zd2FwX3N0YXRlLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2V2ZWMuaD4KICNpbmNsdWRlIDxsaW51eC9taWdyYXRlLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZV9jZ3JvdXAuaD4KIAogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAKQEAgLTcyLDEwICs3MywxMCBAQAogewogCWludCBlcnJvcjsKIAotCUJVR19PTighUGFnZUxvY2tlZChwYWdlKSk7Ci0JQlVHX09OKFBhZ2VTd2FwQ2FjaGUocGFnZSkpOwotCUJVR19PTihQYWdlUHJpdmF0ZShwYWdlKSk7Ci0JQlVHX09OKCFQYWdlU3dhcEJhY2tlZChwYWdlKSk7CisJVk1fQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKKwlWTV9CVUdfT04oUGFnZVN3YXBDYWNoZShwYWdlKSk7CisJVk1fQlVHX09OKCFQYWdlU3dhcEJhY2tlZChwYWdlKSk7CisKIAllcnJvciA9IHJhZGl4X3RyZWVfcHJlbG9hZChnZnBfbWFzayk7CiAJaWYgKCFlcnJvcikgewogCQlwYWdlX2NhY2hlX2dldChwYWdlKTsKQEAgLTEwOCwxMCArMTA5LDExIEBACiAgKi8KIHZvaWQgX19kZWxldGVfZnJvbV9zd2FwX2NhY2hlKHN0cnVjdCBwYWdlICpwYWdlKQogewotCUJVR19PTighUGFnZUxvY2tlZChwYWdlKSk7Ci0JQlVHX09OKCFQYWdlU3dhcENhY2hlKHBhZ2UpKTsKLQlCVUdfT04oUGFnZVdyaXRlYmFjayhwYWdlKSk7Ci0JQlVHX09OKFBhZ2VQcml2YXRlKHBhZ2UpKTsKKwlzd3BfZW50cnlfdCBlbnQgPSB7LnZhbCA9IHBhZ2VfcHJpdmF0ZShwYWdlKX07CisKKwlWTV9CVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOworCVZNX0JVR19PTighUGFnZVN3YXBDYWNoZShwYWdlKSk7CisJVk1fQlVHX09OKFBhZ2VXcml0ZWJhY2socGFnZSkpOwogCiAJcmFkaXhfdHJlZV9kZWxldGUoJnN3YXBwZXJfc3BhY2UucGFnZV90cmVlLCBwYWdlX3ByaXZhdGUocGFnZSkpOwogCXNldF9wYWdlX3ByaXZhdGUocGFnZSwgMCk7CkBAIC0xMTksNiArMTIxLDcgQEAKIAl0b3RhbF9zd2FwY2FjaGVfcGFnZXMtLTsKIAlfX2RlY196b25lX3BhZ2Vfc3RhdGUocGFnZSwgTlJfRklMRV9QQUdFUyk7CiAJSU5DX0NBQ0hFX0lORk8oZGVsX3RvdGFsKTsKKwltZW1fY2dyb3VwX3VuY2hhcmdlX3N3YXBjYWNoZShwYWdlLCBlbnQpOwogfQogCiAvKioKQEAgLTEyOSwxMyArMTMyLDEzIEBACiAgKiBBbGxvY2F0ZSBzd2FwIHNwYWNlIGZvciB0aGUgcGFnZSBhbmQgYWRkIHRoZSBwYWdlIHRvIHRoZQogICogc3dhcCBjYWNoZS4gIENhbGxlciBuZWVkcyB0byBob2xkIHRoZSBwYWdlIGxvY2suIAogICovCi1pbnQgYWRkX3RvX3N3YXAoc3RydWN0IHBhZ2UgKiBwYWdlLCBnZnBfdCBnZnBfbWFzaykKK2ludCBhZGRfdG9fc3dhcChzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAlzd3BfZW50cnlfdCBlbnRyeTsKIAlpbnQgZXJyOwogCi0JQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKLQlCVUdfT04oIVBhZ2VVcHRvZGF0ZShwYWdlKSk7CisJVk1fQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKKwlWTV9CVUdfT04oIVBhZ2VVcHRvZGF0ZShwYWdlKSk7CiAKIAlmb3IgKDs7KSB7CiAJCWVudHJ5ID0gZ2V0X3N3YXBfcGFnZSgpOwpAQCAtMTU0LDcgKzE1Nyw3IEBACiAJCSAqIEFkZCBpdCB0byB0aGUgc3dhcCBjYWNoZSBhbmQgbWFyayBpdCBkaXJ0eQogCQkgKi8KIAkJZXJyID0gYWRkX3RvX3N3YXBfY2FjaGUocGFnZSwgZW50cnksCi0JCQkJZ2ZwX21hc2t8X19HRlBfTk9NRU1BTExPQ3xfX0dGUF9OT1dBUk4pOworCQkJCV9fR0ZQX0hJR0h8X19HRlBfTk9NRU1BTExPQ3xfX0dGUF9OT1dBUk4pOwogCiAJCXN3aXRjaCAoZXJyKSB7CiAJCWNhc2UgMDoJCQkJLyogU3VjY2VzcyAqLwpAQCAtMTk2LDE0ICsxOTksMTQgQEAKICAqIElmIHdlIGFyZSB0aGUgb25seSB1c2VyLCB0aGVuIHRyeSB0byBmcmVlIHVwIHRoZSBzd2FwIGNhY2hlLiAKICAqIAogICogSXRzIG9rIHRvIGNoZWNrIGZvciBQYWdlU3dhcENhY2hlIHdpdGhvdXQgdGhlIHBhZ2UgbG9jawotICogaGVyZSBiZWNhdXNlIHdlIGFyZSBnb2luZyB0byByZWNoZWNrIGFnYWluIGluc2lkZSAKLSAqIGV4Y2x1c2l2ZV9zd2FwX3BhZ2UoKSBfd2l0aF8gdGhlIGxvY2suIAorICogaGVyZSBiZWNhdXNlIHdlIGFyZSBnb2luZyB0byByZWNoZWNrIGFnYWluIGluc2lkZQorICogdHJ5X3RvX2ZyZWVfc3dhcCgpIF93aXRoXyB0aGUgbG9jay4KICAqIAkJCQkJLSBNYXJjZWxvCiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX3N3YXBfY2FjaGUoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0JaWYgKFBhZ2VTd2FwQ2FjaGUocGFnZSkgJiYgdHJ5bG9ja19wYWdlKHBhZ2UpKSB7Ci0JCXJlbW92ZV9leGNsdXNpdmVfc3dhcF9wYWdlKHBhZ2UpOworCWlmIChQYWdlU3dhcENhY2hlKHBhZ2UpICYmICFwYWdlX21hcHBlZChwYWdlKSAmJiB0cnlsb2NrX3BhZ2UocGFnZSkpIHsKKwkJdHJ5X3RvX2ZyZWVfc3dhcChwYWdlKTsKIAkJdW5sb2NrX3BhZ2UocGFnZSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvbW0vc3dhcGZpbGUuYyBiL21tL3N3YXBmaWxlLmMKaW5kZXggNTRhOWY4Ny4uZGE0MjJjNCAxMDA2NDQKLS0tIGEvbW0vc3dhcGZpbGUuYworKysgYi9tbS9zd2FwZmlsZS5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KICNpbmNsdWRlIDxsaW51eC9zaG0uaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KQEAgLTMyLDkgKzMzLDExIEBACiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlIDxsaW51eC9zd2Fwb3BzLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZV9jZ3JvdXAuaD4KIAogc3RhdGljIERFRklORV9TUElOTE9DSyhzd2FwX2xvY2spOwogc3RhdGljIHVuc2lnbmVkIGludCBucl9zd2FwZmlsZXM7Citsb25nIG5yX3N3YXBfcGFnZXM7CiBsb25nIHRvdGFsX3N3YXBfcGFnZXM7CiBzdGF0aWMgaW50IHN3YXBfb3ZlcmZsb3c7CiBzdGF0aWMgaW50IGxlYXN0X3ByaW9yaXR5OwpAQCAtODMsMTUgKzg2LDk2IEBACiAJdXBfcmVhZCgmc3dhcF91bnBsdWdfc2VtKTsKIH0KIAorLyoKKyAqIHN3YXBvbiB0ZWxsIGRldmljZSB0aGF0IGFsbCB0aGUgb2xkIHN3YXAgY29udGVudHMgY2FuIGJlIGRpc2NhcmRlZCwKKyAqIHRvIGFsbG93IHRoZSBzd2FwIGRldmljZSB0byBvcHRpbWl6ZSBpdHMgd2Vhci1sZXZlbGxpbmcuCisgKi8KK3N0YXRpYyBpbnQgZGlzY2FyZF9zd2FwKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSkKK3sKKwlzdHJ1Y3Qgc3dhcF9leHRlbnQgKnNlOworCWludCBlcnIgPSAwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzZSwgJnNpLT5leHRlbnRfbGlzdCwgbGlzdCkgeworCQlzZWN0b3JfdCBzdGFydF9ibG9jayA9IHNlLT5zdGFydF9ibG9jayA8PCAoUEFHRV9TSElGVCAtIDkpOworCQlzZWN0b3JfdCBucl9ibG9ja3MgPSAoc2VjdG9yX3Qpc2UtPm5yX3BhZ2VzIDw8IChQQUdFX1NISUZUIC0gOSk7CisKKwkJaWYgKHNlLT5zdGFydF9wYWdlID09IDApIHsKKwkJCS8qIERvIG5vdCBkaXNjYXJkIHRoZSBzd2FwIGhlYWRlciBwYWdlISAqLworCQkJc3RhcnRfYmxvY2sgKz0gMSA8PCAoUEFHRV9TSElGVCAtIDkpOworCQkJbnJfYmxvY2tzIC09IDEgPDwgKFBBR0VfU0hJRlQgLSA5KTsKKwkJCWlmICghbnJfYmxvY2tzKQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJZXJyID0gYmxrZGV2X2lzc3VlX2Rpc2NhcmQoc2ktPmJkZXYsIHN0YXJ0X2Jsb2NrLAorCQkJCQkJbnJfYmxvY2tzLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCisJCWNvbmRfcmVzY2hlZCgpOworCX0KKwlyZXR1cm4gZXJyOwkJLyogVGhhdCB3aWxsIG9mdGVuIGJlIC1FT1BOT1RTVVBQICovCit9CisKKy8qCisgKiBzd2FwIGFsbG9jYXRpb24gdGVsbCBkZXZpY2UgdGhhdCBhIGNsdXN0ZXIgb2Ygc3dhcCBjYW4gbm93IGJlIGRpc2NhcmRlZCwKKyAqIHRvIGFsbG93IHRoZSBzd2FwIGRldmljZSB0byBvcHRpbWl6ZSBpdHMgd2Vhci1sZXZlbGxpbmcuCisgKi8KK3N0YXRpYyB2b2lkIGRpc2NhcmRfc3dhcF9jbHVzdGVyKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwKKwkJCQkgcGdvZmZfdCBzdGFydF9wYWdlLCBwZ29mZl90IG5yX3BhZ2VzKQoreworCXN0cnVjdCBzd2FwX2V4dGVudCAqc2UgPSBzaS0+Y3Vycl9zd2FwX2V4dGVudDsKKwlpbnQgZm91bmRfZXh0ZW50ID0gMDsKKworCXdoaWxlIChucl9wYWdlcykgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICpsaDsKKworCQlpZiAoc2UtPnN0YXJ0X3BhZ2UgPD0gc3RhcnRfcGFnZSAmJgorCQkgICAgc3RhcnRfcGFnZSA8IHNlLT5zdGFydF9wYWdlICsgc2UtPm5yX3BhZ2VzKSB7CisJCQlwZ29mZl90IG9mZnNldCA9IHN0YXJ0X3BhZ2UgLSBzZS0+c3RhcnRfcGFnZTsKKwkJCXNlY3Rvcl90IHN0YXJ0X2Jsb2NrID0gc2UtPnN0YXJ0X2Jsb2NrICsgb2Zmc2V0OworCQkJc2VjdG9yX3QgbnJfYmxvY2tzID0gc2UtPm5yX3BhZ2VzIC0gb2Zmc2V0OworCisJCQlpZiAobnJfYmxvY2tzID4gbnJfcGFnZXMpCisJCQkJbnJfYmxvY2tzID0gbnJfcGFnZXM7CisJCQlzdGFydF9wYWdlICs9IG5yX2Jsb2NrczsKKwkJCW5yX3BhZ2VzIC09IG5yX2Jsb2NrczsKKworCQkJaWYgKCFmb3VuZF9leHRlbnQrKykKKwkJCQlzaS0+Y3Vycl9zd2FwX2V4dGVudCA9IHNlOworCisJCQlzdGFydF9ibG9jayA8PD0gUEFHRV9TSElGVCAtIDk7CisJCQlucl9ibG9ja3MgPDw9IFBBR0VfU0hJRlQgLSA5OworCQkJaWYgKGJsa2Rldl9pc3N1ZV9kaXNjYXJkKHNpLT5iZGV2LCBzdGFydF9ibG9jaywKKwkJCQkJCQlucl9ibG9ja3MsIEdGUF9OT0lPKSkKKwkJCQlicmVhazsKKwkJfQorCisJCWxoID0gc2UtPmxpc3QubmV4dDsKKwkJaWYgKGxoID09ICZzaS0+ZXh0ZW50X2xpc3QpCisJCQlsaCA9IGxoLT5uZXh0OworCQlzZSA9IGxpc3RfZW50cnkobGgsIHN0cnVjdCBzd2FwX2V4dGVudCwgbGlzdCk7CisJfQorfQorCitzdGF0aWMgaW50IHdhaXRfZm9yX2Rpc2NhcmQodm9pZCAqd29yZCkKK3sKKwlzY2hlZHVsZSgpOworCXJldHVybiAwOworfQorCiAjZGVmaW5lIFNXQVBGSUxFX0NMVVNURVIJMjU2CiAjZGVmaW5lIExBVEVOQ1lfTElNSVQJCTI1NgogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgc2Nhbl9zd2FwX21hcChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kpCiB7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQsIGxhc3RfaW5fY2x1c3RlcjsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwl1bnNpZ25lZCBsb25nIHNjYW5fYmFzZTsKKwl1bnNpZ25lZCBsb25nIGxhc3RfaW5fY2x1c3RlciA9IDA7CiAJaW50IGxhdGVuY3lfcmF0aW9uID0gTEFURU5DWV9MSU1JVDsKKwlpbnQgZm91bmRfZnJlZV9jbHVzdGVyID0gMDsKIAotCS8qIAorCS8qCiAJICogV2UgdHJ5IHRvIGNsdXN0ZXIgc3dhcCBwYWdlcyBieSBhbGxvY2F0aW5nIHRoZW0gc2VxdWVudGlhbGx5CiAJICogaW4gc3dhcC4gIE9uY2Ugd2UndmUgYWxsb2NhdGVkIFNXQVBGSUxFX0NMVVNURVIgcGFnZXMgdGhpcwogCSAqIHdheSwgaG93ZXZlciwgd2UgcmVzb3J0IHRvIGZpcnN0LWZyZWUgYWxsb2NhdGlvbiwgc3RhcnRpbmcKQEAgLTk5LDE2ICsxODMsNDIgQEAKIAkgKiBhbGwgb3ZlciB0aGUgZW50aXJlIHN3YXAgcGFydGl0aW9uLCBzbyB0aGF0IHdlIHJlZHVjZQogCSAqIG92ZXJhbGwgZGlzayBzZWVrIHRpbWVzIGJldHdlZW4gc3dhcCBwYWdlcy4gIC0tIHNjdAogCSAqIEJ1dCB3ZSBkbyBub3cgdHJ5IHRvIGZpbmQgYW4gZW1wdHkgY2x1c3Rlci4gIC1BbmRyZWEKKwkgKiBBbmQgd2UgbGV0IHN3YXAgcGFnZXMgZ28gYWxsIG92ZXIgYW4gU1NEIHBhcnRpdGlvbi4gIEh1Z2gKIAkgKi8KIAogCXNpLT5mbGFncyArPSBTV1BfU0NBTk5JTkc7Ci0JaWYgKHVubGlrZWx5KCFzaS0+Y2x1c3Rlcl9ucikpIHsKLQkJc2ktPmNsdXN0ZXJfbnIgPSBTV0FQRklMRV9DTFVTVEVSIC0gMTsKLQkJaWYgKHNpLT5wYWdlcyAtIHNpLT5pbnVzZV9wYWdlcyA8IFNXQVBGSUxFX0NMVVNURVIpCi0JCQlnb3RvIGxvd2VzdDsKKwlzY2FuX2Jhc2UgPSBvZmZzZXQgPSBzaS0+Y2x1c3Rlcl9uZXh0OworCisJaWYgKHVubGlrZWx5KCFzaS0+Y2x1c3Rlcl9uci0tKSkgeworCQlpZiAoc2ktPnBhZ2VzIC0gc2ktPmludXNlX3BhZ2VzIDwgU1dBUEZJTEVfQ0xVU1RFUikgeworCQkJc2ktPmNsdXN0ZXJfbnIgPSBTV0FQRklMRV9DTFVTVEVSIC0gMTsKKwkJCWdvdG8gY2hlY2tzOworCQl9CisJCWlmIChzaS0+ZmxhZ3MgJiBTV1BfRElTQ0FSREFCTEUpIHsKKwkJCS8qCisJCQkgKiBTdGFydCByYW5nZSBjaGVjayBvbiByYWNpbmcgYWxsb2NhdGlvbnMsIGluIGNhc2UKKwkJCSAqIHRoZXkgb3ZlcmxhcCB0aGUgY2x1c3RlciB3ZSBldmVudHVhbGx5IGRlY2lkZSBvbgorCQkJICogKHdlIHNjYW4gd2l0aG91dCBzd2FwX2xvY2sgdG8gYWxsb3cgcHJlZW1wdGlvbikuCisJCQkgKiBJdCdzIGhhcmRseSBjb25jZWl2YWJsZSB0aGF0IGNsdXN0ZXJfbnIgY291bGQgYmUKKwkJCSAqIHdyYXBwZWQgZHVyaW5nIG91ciBzY2FuLCBidXQgZG9uJ3QgZGVwZW5kIG9uIGl0LgorCQkJICovCisJCQlpZiAoc2ktPmxvd2VzdF9hbGxvYykKKwkJCQlnb3RvIGNoZWNrczsKKwkJCXNpLT5sb3dlc3RfYWxsb2MgPSBzaS0+bWF4OworCQkJc2ktPmhpZ2hlc3RfYWxsb2MgPSAwOworCQl9CiAJCXNwaW5fdW5sb2NrKCZzd2FwX2xvY2spOwogCi0JCW9mZnNldCA9IHNpLT5sb3dlc3RfYml0OworCQkvKgorCQkgKiBJZiBzZWVrIGlzIGV4cGVuc2l2ZSwgc3RhcnQgc2VhcmNoaW5nIGZvciBuZXcgY2x1c3RlciBmcm9tCisJCSAqIHN0YXJ0IG9mIHBhcnRpdGlvbiwgdG8gbWluaW1pemUgdGhlIHNwYW4gb2YgYWxsb2NhdGVkIHN3YXAuCisJCSAqIEJ1dCBpZiBzZWVrIGlzIGNoZWFwLCBzZWFyY2ggZnJvbSBvdXIgY3VycmVudCBwb3NpdGlvbiwgc28KKwkJICogdGhhdCBzd2FwIGlzIGFsbG9jYXRlZCBmcm9tIGFsbCBvdmVyIHRoZSBwYXJ0aXRpb246IGlmIHRoZQorCQkgKiBGbGFzaCBUcmFuc2xhdGlvbiBMYXllciBvbmx5IHJlbWFwcyB3aXRoaW4gbGltaXRlZCB6b25lcywKKwkJICogd2UgZG9uJ3Qgd2FudCB0byB3ZWFyIG91dCB0aGUgZmlyc3Qgem9uZSB0b28gcXVpY2tseS4KKwkJICovCisJCWlmICghKHNpLT5mbGFncyAmIFNXUF9TT0xJRFNUQVRFKSkKKwkJCXNjYW5fYmFzZSA9IG9mZnNldCA9IHNpLT5sb3dlc3RfYml0OwogCQlsYXN0X2luX2NsdXN0ZXIgPSBvZmZzZXQgKyBTV0FQRklMRV9DTFVTVEVSIC0gMTsKIAogCQkvKiBMb2NhdGUgdGhlIGZpcnN0IGVtcHR5ICh1bmFsaWduZWQpIGNsdXN0ZXIgKi8KQEAgLTExNyw0MyArMjI3LDEyNCBAQAogCQkJCWxhc3RfaW5fY2x1c3RlciA9IG9mZnNldCArIFNXQVBGSUxFX0NMVVNURVI7CiAJCQllbHNlIGlmIChvZmZzZXQgPT0gbGFzdF9pbl9jbHVzdGVyKSB7CiAJCQkJc3Bpbl9sb2NrKCZzd2FwX2xvY2spOwotCQkJCXNpLT5jbHVzdGVyX25leHQgPSBvZmZzZXQtU1dBUEZJTEVfQ0xVU1RFUisxOwotCQkJCWdvdG8gY2x1c3RlcjsKKwkJCQlvZmZzZXQgLT0gU1dBUEZJTEVfQ0xVU1RFUiAtIDE7CisJCQkJc2ktPmNsdXN0ZXJfbmV4dCA9IG9mZnNldDsKKwkJCQlzaS0+Y2x1c3Rlcl9uciA9IFNXQVBGSUxFX0NMVVNURVIgLSAxOworCQkJCWZvdW5kX2ZyZWVfY2x1c3RlciA9IDE7CisJCQkJZ290byBjaGVja3M7CiAJCQl9CiAJCQlpZiAodW5saWtlbHkoLS1sYXRlbmN5X3JhdGlvbiA8IDApKSB7CiAJCQkJY29uZF9yZXNjaGVkKCk7CiAJCQkJbGF0ZW5jeV9yYXRpb24gPSBMQVRFTkNZX0xJTUlUOwogCQkJfQogCQl9CisKKwkJb2Zmc2V0ID0gc2ktPmxvd2VzdF9iaXQ7CisJCWxhc3RfaW5fY2x1c3RlciA9IG9mZnNldCArIFNXQVBGSUxFX0NMVVNURVIgLSAxOworCisJCS8qIExvY2F0ZSB0aGUgZmlyc3QgZW1wdHkgKHVuYWxpZ25lZCkgY2x1c3RlciAqLworCQlmb3IgKDsgbGFzdF9pbl9jbHVzdGVyIDwgc2Nhbl9iYXNlOyBvZmZzZXQrKykgeworCQkJaWYgKHNpLT5zd2FwX21hcFtvZmZzZXRdKQorCQkJCWxhc3RfaW5fY2x1c3RlciA9IG9mZnNldCArIFNXQVBGSUxFX0NMVVNURVI7CisJCQllbHNlIGlmIChvZmZzZXQgPT0gbGFzdF9pbl9jbHVzdGVyKSB7CisJCQkJc3Bpbl9sb2NrKCZzd2FwX2xvY2spOworCQkJCW9mZnNldCAtPSBTV0FQRklMRV9DTFVTVEVSIC0gMTsKKwkJCQlzaS0+Y2x1c3Rlcl9uZXh0ID0gb2Zmc2V0OworCQkJCXNpLT5jbHVzdGVyX25yID0gU1dBUEZJTEVfQ0xVU1RFUiAtIDE7CisJCQkJZm91bmRfZnJlZV9jbHVzdGVyID0gMTsKKwkJCQlnb3RvIGNoZWNrczsKKwkJCX0KKwkJCWlmICh1bmxpa2VseSgtLWxhdGVuY3lfcmF0aW9uIDwgMCkpIHsKKwkJCQljb25kX3Jlc2NoZWQoKTsKKwkJCQlsYXRlbmN5X3JhdGlvbiA9IExBVEVOQ1lfTElNSVQ7CisJCQl9CisJCX0KKworCQlvZmZzZXQgPSBzY2FuX2Jhc2U7CiAJCXNwaW5fbG9jaygmc3dhcF9sb2NrKTsKLQkJZ290byBsb3dlc3Q7CisJCXNpLT5jbHVzdGVyX25yID0gU1dBUEZJTEVfQ0xVU1RFUiAtIDE7CisJCXNpLT5sb3dlc3RfYWxsb2MgPSAwOwogCX0KIAotCXNpLT5jbHVzdGVyX25yLS07Ci1jbHVzdGVyOgotCW9mZnNldCA9IHNpLT5jbHVzdGVyX25leHQ7Ci0JaWYgKG9mZnNldCA+IHNpLT5oaWdoZXN0X2JpdCkKLWxvd2VzdDoJCW9mZnNldCA9IHNpLT5sb3dlc3RfYml0OwotY2hlY2tzOglpZiAoIShzaS0+ZmxhZ3MgJiBTV1BfV1JJVEVPSykpCitjaGVja3M6CisJaWYgKCEoc2ktPmZsYWdzICYgU1dQX1dSSVRFT0spKQogCQlnb3RvIG5vX3BhZ2U7CiAJaWYgKCFzaS0+aGlnaGVzdF9iaXQpCiAJCWdvdG8gbm9fcGFnZTsKLQlpZiAoIXNpLT5zd2FwX21hcFtvZmZzZXRdKSB7Ci0JCWlmIChvZmZzZXQgPT0gc2ktPmxvd2VzdF9iaXQpCi0JCQlzaS0+bG93ZXN0X2JpdCsrOwotCQlpZiAob2Zmc2V0ID09IHNpLT5oaWdoZXN0X2JpdCkKLQkJCXNpLT5oaWdoZXN0X2JpdC0tOwotCQlzaS0+aW51c2VfcGFnZXMrKzsKLQkJaWYgKHNpLT5pbnVzZV9wYWdlcyA9PSBzaS0+cGFnZXMpIHsKLQkJCXNpLT5sb3dlc3RfYml0ID0gc2ktPm1heDsKLQkJCXNpLT5oaWdoZXN0X2JpdCA9IDA7Ci0JCX0KLQkJc2ktPnN3YXBfbWFwW29mZnNldF0gPSAxOwotCQlzaS0+Y2x1c3Rlcl9uZXh0ID0gb2Zmc2V0ICsgMTsKLQkJc2ktPmZsYWdzIC09IFNXUF9TQ0FOTklORzsKLQkJcmV0dXJuIG9mZnNldDsKLQl9CisJaWYgKG9mZnNldCA+IHNpLT5oaWdoZXN0X2JpdCkKKwkJc2Nhbl9iYXNlID0gb2Zmc2V0ID0gc2ktPmxvd2VzdF9iaXQ7CisJaWYgKHNpLT5zd2FwX21hcFtvZmZzZXRdKQorCQlnb3RvIHNjYW47CiAKKwlpZiAob2Zmc2V0ID09IHNpLT5sb3dlc3RfYml0KQorCQlzaS0+bG93ZXN0X2JpdCsrOworCWlmIChvZmZzZXQgPT0gc2ktPmhpZ2hlc3RfYml0KQorCQlzaS0+aGlnaGVzdF9iaXQtLTsKKwlzaS0+aW51c2VfcGFnZXMrKzsKKwlpZiAoc2ktPmludXNlX3BhZ2VzID09IHNpLT5wYWdlcykgeworCQlzaS0+bG93ZXN0X2JpdCA9IHNpLT5tYXg7CisJCXNpLT5oaWdoZXN0X2JpdCA9IDA7CisJfQorCXNpLT5zd2FwX21hcFtvZmZzZXRdID0gMTsKKwlzaS0+Y2x1c3Rlcl9uZXh0ID0gb2Zmc2V0ICsgMTsKKwlzaS0+ZmxhZ3MgLT0gU1dQX1NDQU5OSU5HOworCisJaWYgKHNpLT5sb3dlc3RfYWxsb2MpIHsKKwkJLyoKKwkJICogT25seSBzZXQgd2hlbiBTV1BfRElTQ0FSREFCTEUsIGFuZCB0aGVyZSdzIGEgc2NhbgorCQkgKiBmb3IgYSBmcmVlIGNsdXN0ZXIgaW4gcHJvZ3Jlc3Mgb3IganVzdCBjb21wbGV0ZWQuCisJCSAqLworCQlpZiAoZm91bmRfZnJlZV9jbHVzdGVyKSB7CisJCQkvKgorCQkJICogVG8gb3B0aW1pemUgd2Vhci1sZXZlbGxpbmcsIGRpc2NhcmQgdGhlCisJCQkgKiBvbGQgZGF0YSBvZiB0aGUgY2x1c3RlciwgdGFraW5nIGNhcmUgbm90IHRvCisJCQkgKiBkaXNjYXJkIGFueSBvZiBpdHMgcGFnZXMgdGhhdCBoYXZlIGFscmVhZHkKKwkJCSAqIGJlZW4gYWxsb2NhdGVkIGJ5IHJhY2luZyB0YXNrcyAob2Zmc2V0IGhhcworCQkJICogYWxyZWFkeSBzdGVwcGVkIG92ZXIgYW55IGF0IHRoZSBiZWdpbm5pbmcpLgorCQkJICovCisJCQlpZiAob2Zmc2V0IDwgc2ktPmhpZ2hlc3RfYWxsb2MgJiYKKwkJCSAgICBzaS0+bG93ZXN0X2FsbG9jIDw9IGxhc3RfaW5fY2x1c3RlcikKKwkJCQlsYXN0X2luX2NsdXN0ZXIgPSBzaS0+bG93ZXN0X2FsbG9jIC0gMTsKKwkJCXNpLT5mbGFncyB8PSBTV1BfRElTQ0FSRElORzsKKwkJCXNwaW5fdW5sb2NrKCZzd2FwX2xvY2spOworCisJCQlpZiAob2Zmc2V0IDwgbGFzdF9pbl9jbHVzdGVyKQorCQkJCWRpc2NhcmRfc3dhcF9jbHVzdGVyKHNpLCBvZmZzZXQsCisJCQkJCWxhc3RfaW5fY2x1c3RlciAtIG9mZnNldCArIDEpOworCisJCQlzcGluX2xvY2soJnN3YXBfbG9jayk7CisJCQlzaS0+bG93ZXN0X2FsbG9jID0gMDsKKwkJCXNpLT5mbGFncyAmPSB+U1dQX0RJU0NBUkRJTkc7CisKKwkJCXNtcF9tYigpOwkvKiB3YWtlX3VwX2JpdCBhZHZpc2VzIHRoaXMgKi8KKwkJCXdha2VfdXBfYml0KCZzaS0+ZmxhZ3MsIGlsb2cyKFNXUF9ESVNDQVJESU5HKSk7CisKKwkJfSBlbHNlIGlmIChzaS0+ZmxhZ3MgJiBTV1BfRElTQ0FSRElORykgeworCQkJLyoKKwkJCSAqIERlbGF5IHVzaW5nIHBhZ2VzIGFsbG9jYXRlZCBieSByYWNpbmcgdGFza3MKKwkJCSAqIHVudGlsIHRoZSB3aG9sZSBkaXNjYXJkIGhhcyBiZWVuIGlzc3VlZC4gV2UKKwkJCSAqIGNvdWxkIGRlZmVyIHRoYXQgZGVsYXkgdW50aWwgc3dhcF93cml0ZXBhZ2UsCisJCQkgKiBidXQgaXQncyBlYXNpZXIgdG8ga2VlcCB0aGlzIHNlbGYtY29udGFpbmVkLgorCQkJICovCisJCQlzcGluX3VubG9jaygmc3dhcF9sb2NrKTsKKwkJCXdhaXRfb25fYml0KCZzaS0+ZmxhZ3MsIGlsb2cyKFNXUF9ESVNDQVJESU5HKSwKKwkJCQl3YWl0X2Zvcl9kaXNjYXJkLCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQlzcGluX2xvY2soJnN3YXBfbG9jayk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogTm90ZSBwYWdlcyBhbGxvY2F0ZWQgYnkgcmFjaW5nIHRhc2tzIHdoaWxlCisJCQkgKiBzY2FuIGZvciBhIGZyZWUgY2x1c3RlciBpcyBpbiBwcm9ncmVzcywgc28KKwkJCSAqIHRoYXQgaXRzIGZpbmFsIGRpc2NhcmQgY2FuIGV4Y2x1ZGUgdGhlbS4KKwkJCSAqLworCQkJaWYgKG9mZnNldCA8IHNpLT5sb3dlc3RfYWxsb2MpCisJCQkJc2ktPmxvd2VzdF9hbGxvYyA9IG9mZnNldDsKKwkJCWlmIChvZmZzZXQgPiBzaS0+aGlnaGVzdF9hbGxvYykKKwkJCQlzaS0+aGlnaGVzdF9hbGxvYyA9IG9mZnNldDsKKwkJfQorCX0KKwlyZXR1cm4gb2Zmc2V0OworCitzY2FuOgogCXNwaW5fdW5sb2NrKCZzd2FwX2xvY2spOwogCXdoaWxlICgrK29mZnNldCA8PSBzaS0+aGlnaGVzdF9iaXQpIHsKIAkJaWYgKCFzaS0+c3dhcF9tYXBbb2Zmc2V0XSkgewpAQCAtMTY1LDggKzM1NiwxOCBAQAogCQkJbGF0ZW5jeV9yYXRpb24gPSBMQVRFTkNZX0xJTUlUOwogCQl9CiAJfQorCW9mZnNldCA9IHNpLT5sb3dlc3RfYml0OworCXdoaWxlICgrK29mZnNldCA8IHNjYW5fYmFzZSkgeworCQlpZiAoIXNpLT5zd2FwX21hcFtvZmZzZXRdKSB7CisJCQlzcGluX2xvY2soJnN3YXBfbG9jayk7CisJCQlnb3RvIGNoZWNrczsKKwkJfQorCQlpZiAodW5saWtlbHkoLS1sYXRlbmN5X3JhdGlvbiA8IDApKSB7CisJCQljb25kX3Jlc2NoZWQoKTsKKwkJCWxhdGVuY3lfcmF0aW9uID0gTEFURU5DWV9MSU1JVDsKKwkJfQorCX0KIAlzcGluX2xvY2soJnN3YXBfbG9jayk7Ci0JZ290byBsb3dlc3Q7CiAKIG5vX3BhZ2U6CiAJc2ktPmZsYWdzIC09IFNXUF9TQ0FOTklORzsKQEAgLTI2OCwxMCArNDY5LDExIEBACiAJcHJpbnRrKEtFUk5fRVJSICJzd2FwX2ZyZWU6ICVzJTA4bHhcbiIsIEJhZF9maWxlLCBlbnRyeS52YWwpOwogb3V0OgogCXJldHVybiBOVUxMOwotfQkKK30KIAotc3RhdGljIGludCBzd2FwX2VudHJ5X2ZyZWUoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnAsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQorc3RhdGljIGludCBzd2FwX2VudHJ5X2ZyZWUoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnAsIHN3cF9lbnRyeV90IGVudCkKIHsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IHN3cF9vZmZzZXQoZW50KTsKIAlpbnQgY291bnQgPSBwLT5zd2FwX21hcFtvZmZzZXRdOwogCiAJaWYgKGNvdW50IDwgU1dBUF9NQVBfTUFYKSB7CkBAIC0yODYsNiArNDg4LDcgQEAKIAkJCQlzd2FwX2xpc3QubmV4dCA9IHAgLSBzd2FwX2luZm87CiAJCQlucl9zd2FwX3BhZ2VzKys7CiAJCQlwLT5pbnVzZV9wYWdlcy0tOworCQkJbWVtX2Nncm91cF91bmNoYXJnZV9zd2FwKGVudCk7CiAJCX0KIAl9CiAJcmV0dXJuIGNvdW50OwpAQCAtMzAxLDcgKzUwNCw3IEBACiAKIAlwID0gc3dhcF9pbmZvX2dldChlbnRyeSk7CiAJaWYgKHApIHsKLQkJc3dhcF9lbnRyeV9mcmVlKHAsIHN3cF9vZmZzZXQoZW50cnkpKTsKKwkJc3dhcF9lbnRyeV9mcmVlKHAsIGVudHJ5KTsKIAkJc3Bpbl91bmxvY2soJnN3YXBfbG9jayk7CiAJfQogfQpAQCAtMzI2LDEwMSArNTI5LDYyIEBACiB9CiAKIC8qCi0gKiBXZSBjYW4gdXNlIHRoaXMgc3dhcCBjYWNoZSBlbnRyeSBkaXJlY3RseQotICogaWYgdGhlcmUgYXJlIG5vIG90aGVyIHJlZmVyZW5jZXMgdG8gaXQuCisgKiBXZSBjYW4gd3JpdGUgdG8gYW4gYW5vbiBwYWdlIHdpdGhvdXQgQ09XIGlmIHRoZXJlIGFyZSBubyBvdGhlciByZWZlcmVuY2VzCisgKiB0byBpdC4gIEFuZCBhcyBhIHNpZGUtZWZmZWN0LCBmcmVlIHVwIGl0cyBzd2FwOiBiZWNhdXNlIHRoZSBvbGQgY29udGVudAorICogb24gZGlzayB3aWxsIG5ldmVyIGJlIHJlYWQsIGFuZCBzZWVraW5nIGJhY2sgdGhlcmUgdG8gd3JpdGUgbmV3IGNvbnRlbnQKKyAqIGxhdGVyIHdvdWxkIG9ubHkgd2FzdGUgdGltZSBhd2F5IGZyb20gY2x1c3RlcmluZy4KICAqLwotaW50IGNhbl9zaGFyZV9zd2FwX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCitpbnQgcmV1c2Vfc3dhcF9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQogewogCWludCBjb3VudDsKIAotCUJVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CisJVk1fQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKIAljb3VudCA9IHBhZ2VfbWFwY291bnQocGFnZSk7Ci0JaWYgKGNvdW50IDw9IDEgJiYgUGFnZVN3YXBDYWNoZShwYWdlKSkKKwlpZiAoY291bnQgPD0gMSAmJiBQYWdlU3dhcENhY2hlKHBhZ2UpKSB7CiAJCWNvdW50ICs9IHBhZ2Vfc3dhcGNvdW50KHBhZ2UpOworCQlpZiAoY291bnQgPT0gMSAmJiAhUGFnZVdyaXRlYmFjayhwYWdlKSkgeworCQkJZGVsZXRlX2Zyb21fc3dhcF9jYWNoZShwYWdlKTsKKwkJCVNldFBhZ2VEaXJ0eShwYWdlKTsKKwkJfQorCX0KIAlyZXR1cm4gY291bnQgPT0gMTsKIH0KIAogLyoKLSAqIFdvcmsgb3V0IGlmIHRoZXJlIGFyZSBhbnkgb3RoZXIgcHJvY2Vzc2VzIHNoYXJpbmcgdGhpcwotICogc3dhcCBjYWNoZSBwYWdlLiBGcmVlIGl0IGlmIHlvdSBjYW4uIFJldHVybiBzdWNjZXNzLgorICogSWYgc3dhcCBpcyBnZXR0aW5nIGZ1bGwsIG9yIGlmIHRoZXJlIGFyZSBubyBtb3JlIG1hcHBpbmdzIG9mIHRoaXMgcGFnZSwKKyAqIHRoZW4gdHJ5X3RvX2ZyZWVfc3dhcCBpcyBjYWxsZWQgdG8gZnJlZSBpdHMgc3dhcCBzcGFjZS4KICAqLwotc3RhdGljIGludCByZW1vdmVfZXhjbHVzaXZlX3N3YXBfcGFnZV9jb3VudChzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IGNvdW50KQoraW50IHRyeV90b19mcmVlX3N3YXAoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0JaW50IHJldHZhbDsKLQlzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqIHA7Ci0Jc3dwX2VudHJ5X3QgZW50cnk7Ci0KLQlCVUdfT04oUGFnZVByaXZhdGUocGFnZSkpOwotCUJVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CisJVk1fQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKIAogCWlmICghUGFnZVN3YXBDYWNoZShwYWdlKSkKIAkJcmV0dXJuIDA7CiAJaWYgKFBhZ2VXcml0ZWJhY2socGFnZSkpCiAJCXJldHVybiAwOwotCWlmIChwYWdlX2NvdW50KHBhZ2UpICE9IGNvdW50KSAvKiB1cyArIGNhY2hlICsgcHRlcyAqLworCWlmIChwYWdlX3N3YXBjb3VudChwYWdlKSkKIAkJcmV0dXJuIDA7CiAKLQllbnRyeS52YWwgPSBwYWdlX3ByaXZhdGUocGFnZSk7Ci0JcCA9IHN3YXBfaW5mb19nZXQoZW50cnkpOwotCWlmICghcCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBJcyB0aGUgb25seSBzd2FwIGNhY2hlIHVzZXIgdGhlIGNhY2hlIGl0c2VsZj8gKi8KLQlyZXR2YWwgPSAwOwotCWlmIChwLT5zd2FwX21hcFtzd3Bfb2Zmc2V0KGVudHJ5KV0gPT0gMSkgewotCQkvKiBSZWNoZWNrIHRoZSBwYWdlIGNvdW50IHdpdGggdGhlIHN3YXBjYWNoZSBsb2NrIGhlbGQuLiAqLwotCQlzcGluX2xvY2tfaXJxKCZzd2FwcGVyX3NwYWNlLnRyZWVfbG9jayk7Ci0JCWlmICgocGFnZV9jb3VudChwYWdlKSA9PSBjb3VudCkgJiYgIVBhZ2VXcml0ZWJhY2socGFnZSkpIHsKLQkJCV9fZGVsZXRlX2Zyb21fc3dhcF9jYWNoZShwYWdlKTsKLQkJCVNldFBhZ2VEaXJ0eShwYWdlKTsKLQkJCXJldHZhbCA9IDE7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfaXJxKCZzd2FwcGVyX3NwYWNlLnRyZWVfbG9jayk7Ci0JfQotCXNwaW5fdW5sb2NrKCZzd2FwX2xvY2spOwotCi0JaWYgKHJldHZhbCkgewotCQlzd2FwX2ZyZWUoZW50cnkpOwotCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JfQotCi0JcmV0dXJuIHJldHZhbDsKLX0KLQotLyoKLSAqIE1vc3Qgb2YgdGhlIHRpbWUgdGhlIHBhZ2Ugc2hvdWxkIGhhdmUgdHdvIHJlZmVyZW5jZXM6IG9uZSBmb3IgdGhlCi0gKiBwcm9jZXNzIGFuZCBvbmUgZm9yIHRoZSBzd2FwIGNhY2hlLgotICovCi1pbnQgcmVtb3ZlX2V4Y2x1c2l2ZV9zd2FwX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCi17Ci0JcmV0dXJuIHJlbW92ZV9leGNsdXNpdmVfc3dhcF9wYWdlX2NvdW50KHBhZ2UsIDIpOwotfQotCi0vKgotICogVGhlIHBhZ2VvdXQgY29kZSBob2xkcyBhbiBleHRyYSByZWZlcmVuY2UgdG8gdGhlIHBhZ2UuICBUaGF0IHJhaXNlcwotICogdGhlIHJlZmVyZW5jZSBjb3VudCB0byB0ZXN0IGZvciB0byAyIGZvciBhIHBhZ2UgdGhhdCBpcyBvbmx5IGluIHRoZQotICogc3dhcCBjYWNoZSBwbHVzIDEgZm9yIGVhY2ggcHJvY2VzcyB0aGF0IG1hcHMgdGhlIHBhZ2UuCi0gKi8KLWludCByZW1vdmVfZXhjbHVzaXZlX3N3YXBfcGFnZV9yZWYoc3RydWN0IHBhZ2UgKnBhZ2UpCi17Ci0JcmV0dXJuIHJlbW92ZV9leGNsdXNpdmVfc3dhcF9wYWdlX2NvdW50KHBhZ2UsIDIgKyBwYWdlX21hcGNvdW50KHBhZ2UpKTsKKwlkZWxldGVfZnJvbV9zd2FwX2NhY2hlKHBhZ2UpOworCVNldFBhZ2VEaXJ0eShwYWdlKTsKKwlyZXR1cm4gMTsKIH0KIAogLyoKICAqIEZyZWUgdGhlIHN3YXAgZW50cnkgbGlrZSBhYm92ZSwgYnV0IGFsc28gdHJ5IHRvCiAgKiBmcmVlIHRoZSBwYWdlIGNhY2hlIGVudHJ5IGlmIGl0IGlzIHRoZSBsYXN0IHVzZXIuCiAgKi8KLXZvaWQgZnJlZV9zd2FwX2FuZF9jYWNoZShzd3BfZW50cnlfdCBlbnRyeSkKK2ludCBmcmVlX3N3YXBfYW5kX2NhY2hlKHN3cF9lbnRyeV90IGVudHJ5KQogewotCXN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICogcDsKKwlzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqcDsKIAlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7CiAKIAlpZiAoaXNfbWlncmF0aW9uX2VudHJ5KGVudHJ5KSkKLQkJcmV0dXJuOworCQlyZXR1cm4gMTsKIAogCXAgPSBzd2FwX2luZm9fZ2V0KGVudHJ5KTsKIAlpZiAocCkgewotCQlpZiAoc3dhcF9lbnRyeV9mcmVlKHAsIHN3cF9vZmZzZXQoZW50cnkpKSA9PSAxKSB7CisJCWlmIChzd2FwX2VudHJ5X2ZyZWUocCwgZW50cnkpID09IDEpIHsKIAkJCXBhZ2UgPSBmaW5kX2dldF9wYWdlKCZzd2FwcGVyX3NwYWNlLCBlbnRyeS52YWwpOwogCQkJaWYgKHBhZ2UgJiYgIXRyeWxvY2tfcGFnZShwYWdlKSkgewogCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKQEAgLTQzMCwyMCArNTk0LDE5IEBACiAJCXNwaW5fdW5sb2NrKCZzd2FwX2xvY2spOwogCX0KIAlpZiAocGFnZSkgewotCQlpbnQgb25lX3VzZXI7Ci0KLQkJQlVHX09OKFBhZ2VQcml2YXRlKHBhZ2UpKTsKLQkJb25lX3VzZXIgPSAocGFnZV9jb3VudChwYWdlKSA9PSAyKTsKLQkJLyogT25seSBjYWNoZSB1c2VyICgrdXMpLCBvciBzd2FwIHNwYWNlIGZ1bGw/IEZyZWUgaXQhICovCi0JCS8qIEFsc28gcmVjaGVjayBQYWdlU3dhcENhY2hlIGFmdGVyIHBhZ2UgaXMgbG9ja2VkIChhYm92ZSkgKi8KKwkJLyoKKwkJICogTm90IG1hcHBlZCBlbHNld2hlcmUsIG9yIHN3YXAgc3BhY2UgZnVsbD8gRnJlZSBpdCEKKwkJICogQWxzbyByZWNoZWNrIFBhZ2VTd2FwQ2FjaGUgbm93IHBhZ2UgaXMgbG9ja2VkIChhYm92ZSkuCisJCSAqLwogCQlpZiAoUGFnZVN3YXBDYWNoZShwYWdlKSAmJiAhUGFnZVdyaXRlYmFjayhwYWdlKSAmJgotCQkJCQkob25lX3VzZXIgfHwgdm1fc3dhcF9mdWxsKCkpKSB7CisJCQkJKCFwYWdlX21hcHBlZChwYWdlKSB8fCB2bV9zd2FwX2Z1bGwoKSkpIHsKIAkJCWRlbGV0ZV9mcm9tX3N3YXBfY2FjaGUocGFnZSk7CiAJCQlTZXRQYWdlRGlydHkocGFnZSk7CiAJCX0KIAkJdW5sb2NrX3BhZ2UocGFnZSk7CiAJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAl9CisJcmV0dXJuIHAgIT0gTlVMTDsKIH0KIAogI2lmZGVmIENPTkZJR19ISUJFUk5BVElPTgpAQCAtNTMwLDE3ICs2OTMsMTggQEAKIHN0YXRpYyBpbnQgdW51c2VfcHRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwbWRfdCAqcG1kLAogCQl1bnNpZ25lZCBsb25nIGFkZHIsIHN3cF9lbnRyeV90IGVudHJ5LCBzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqcHRyID0gTlVMTDsKIAlzcGlubG9ja190ICpwdGw7CiAJcHRlX3QgKnB0ZTsKIAlpbnQgcmV0ID0gMTsKIAotCWlmIChtZW1fY2dyb3VwX2NoYXJnZShwYWdlLCB2bWEtPnZtX21tLCBHRlBfS0VSTkVMKSkKKwlpZiAobWVtX2Nncm91cF90cnlfY2hhcmdlX3N3YXBpbih2bWEtPnZtX21tLCBwYWdlLCBHRlBfS0VSTkVMLCAmcHRyKSkKIAkJcmV0ID0gLUVOT01FTTsKIAogCXB0ZSA9IHB0ZV9vZmZzZXRfbWFwX2xvY2sodm1hLT52bV9tbSwgcG1kLCBhZGRyLCAmcHRsKTsKIAlpZiAodW5saWtlbHkoIXB0ZV9zYW1lKCpwdGUsIHN3cF9lbnRyeV90b19wdGUoZW50cnkpKSkpIHsKIAkJaWYgKHJldCA+IDApCi0JCQltZW1fY2dyb3VwX3VuY2hhcmdlX3BhZ2UocGFnZSk7CisJCQltZW1fY2dyb3VwX2NhbmNlbF9jaGFyZ2Vfc3dhcGluKHB0cik7CiAJCXJldCA9IDA7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTU1MCw2ICs3MTQsNyBAQAogCXNldF9wdGVfYXQodm1hLT52bV9tbSwgYWRkciwgcHRlLAogCQkgICBwdGVfbWtvbGQobWtfcHRlKHBhZ2UsIHZtYS0+dm1fcGFnZV9wcm90KSkpOwogCXBhZ2VfYWRkX2Fub25fcm1hcChwYWdlLCB2bWEsIGFkZHIpOworCW1lbV9jZ3JvdXBfY29tbWl0X2NoYXJnZV9zd2FwaW4ocGFnZSwgcHRyKTsKIAlzd2FwX2ZyZWUoZW50cnkpOwogCS8qCiAJICogTW92ZSB0aGUgcGFnZSB0byB0aGUgYWN0aXZlIGxpc3Qgc28gaXQgaXMgbm90CkBAIC03NzYsMTAgKzk0MSwxMCBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQkvKiAKKwkJLyoKIAkJICogR2V0IGEgcGFnZSBmb3IgdGhlIGVudHJ5LCB1c2luZyB0aGUgZXhpc3Rpbmcgc3dhcAogCQkgKiBjYWNoZSBwYWdlIGlmIHRoZXJlIGlzIG9uZS4gIE90aGVyd2lzZSwgZ2V0IGEgY2xlYW4KLQkJICogcGFnZSBhbmQgcmVhZCB0aGUgc3dhcCBpbnRvIGl0LiAKKwkJICogcGFnZSBhbmQgcmVhZCB0aGUgc3dhcCBpbnRvIGl0LgogCQkgKi8KIAkJc3dhcF9tYXAgPSAmc2ktPnN3YXBfbWFwW2ldOwogCQllbnRyeSA9IHN3cF9lbnRyeSh0eXBlLCBpKTsKQEAgLTkzMCw3ICsxMDk1LDE2IEBACiAJCQlsb2NrX3BhZ2UocGFnZSk7CiAJCQl3YWl0X29uX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOwogCQl9Ci0JCWlmIChQYWdlU3dhcENhY2hlKHBhZ2UpKQorCisJCS8qCisJCSAqIEl0IGlzIGNvbmNlaXZhYmxlIHRoYXQgYSByYWNpbmcgdGFzayByZW1vdmVkIHRoaXMgcGFnZSBmcm9tCisJCSAqIHN3YXAgY2FjaGUganVzdCBiZWZvcmUgd2UgYWNxdWlyZWQgdGhlIHBhZ2UgbG9jayBhdCB0aGUgdG9wLAorCQkgKiBvciB3aGlsZSB3ZSBkcm9wcGVkIGl0IGluIHVudXNlX21tKCkuICBUaGUgcGFnZSBtaWdodCBldmVuCisJCSAqIGJlIGJhY2sgaW4gc3dhcCBjYWNoZSBvbiBhbm90aGVyIHN3YXAgYXJlYTogdGhhdCB3ZSBtdXN0IG5vdAorCQkgKiBkZWxldGUsIHNpbmNlIGl0IG1heSBub3QgaGF2ZSBiZWVuIHdyaXR0ZW4gb3V0IHRvIHN3YXAgeWV0LgorCQkgKi8KKwkJaWYgKFBhZ2VTd2FwQ2FjaGUocGFnZSkgJiYKKwkJICAgIGxpa2VseShwYWdlX3ByaXZhdGUocGFnZSkgPT0gZW50cnkudmFsKSkKIAkJCWRlbGV0ZV9mcm9tX3N3YXBfY2FjaGUocGFnZSk7CiAKIAkJLyoKQEAgLTEyMDMsMjYgKzEzNzcsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLSNpZiAwCS8qIFdlIGRvbid0IG5lZWQgdGhpcyB5ZXQgKi8KLSNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgotaW50IHBhZ2VfcXVldWVfY29uZ2VzdGVkKHN0cnVjdCBwYWdlICpwYWdlKQotewotCXN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGk7Ci0KLQlCVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOwkvKiBJdCBwaW5zIHRoZSBzd2FwX2luZm9fc3RydWN0ICovCi0KLQlpZiAoUGFnZVN3YXBDYWNoZShwYWdlKSkgewotCQlzd3BfZW50cnlfdCBlbnRyeSA9IHsgLnZhbCA9IHBhZ2VfcHJpdmF0ZShwYWdlKSB9OwotCQlzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2lzOwotCi0JCXNpcyA9IGdldF9zd2FwX2luZm9fc3RydWN0KHN3cF90eXBlKGVudHJ5KSk7Ci0JCWJkaSA9IHNpcy0+YmRldi0+YmRfaW5vZGUtPmlfbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbzsKLQl9IGVsc2UKLQkJYmRpID0gcGFnZS0+bWFwcGluZy0+YmFja2luZ19kZXZfaW5mbzsKLQlyZXR1cm4gYmRpX3dyaXRlX2Nvbmdlc3RlZChiZGkpOwotfQotI2VuZGlmCi0KIGFzbWxpbmthZ2UgbG9uZyBzeXNfc3dhcG9mZihjb25zdCBjaGFyIF9fdXNlciAqIHNwZWNpYWxmaWxlKQogewogCXN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICogcCA9IE5VTEw7CkBAIC0xMjMzLDcgKzEzODcsNyBAQAogCWNoYXIgKiBwYXRobmFtZTsKIAlpbnQgaSwgdHlwZSwgcHJldjsKIAlpbnQgZXJyOwotCQorCiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQogCQlyZXR1cm4gLUVQRVJNOwogCkBAIC0xMjUzLDcgKzE0MDcsNyBAQAogCXNwaW5fbG9jaygmc3dhcF9sb2NrKTsKIAlmb3IgKHR5cGUgPSBzd2FwX2xpc3QuaGVhZDsgdHlwZSA+PSAwOyB0eXBlID0gc3dhcF9pbmZvW3R5cGVdLm5leHQpIHsKIAkJcCA9IHN3YXBfaW5mbyArIHR5cGU7Ci0JCWlmICgocC0+ZmxhZ3MgJiBTV1BfQUNUSVZFKSA9PSBTV1BfQUNUSVZFKSB7CisJCWlmIChwLT5mbGFncyAmIFNXUF9XUklURU9LKSB7CiAJCQlpZiAocC0+c3dhcF9maWxlLT5mX21hcHBpbmcgPT0gbWFwcGluZykKIAkJCQlicmVhazsKIAkJfQpAQCAtMTM0Myw2ICsxNDk3LDkgQEAKIAlzcGluX3VubG9jaygmc3dhcF9sb2NrKTsKIAltdXRleF91bmxvY2soJnN3YXBvbl9tdXRleCk7CiAJdmZyZWUoc3dhcF9tYXApOworCS8qIERlc3Ryb3kgc3dhcCBhY2NvdW50IGluZm9ybWF0aW4gKi8KKwlzd2FwX2Nncm91cF9zd2Fwb2ZmKHR5cGUpOworCiAJaW5vZGUgPSBtYXBwaW5nLT5ob3N0OwogCWlmIChTX0lTQkxLKGlub2RlLT5pX21vZGUpKSB7CiAJCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBJX0JERVYoaW5vZGUpOwpAQCAtMTQyNiwxMiArMTU4MywxMiBAQAogCWZpbGUgPSBwdHItPnN3YXBfZmlsZTsKIAlsZW4gPSBzZXFfcGF0aChzd2FwLCAmZmlsZS0+Zl9wYXRoLCAiIFx0XG5cXCIpOwogCXNlcV9wcmludGYoc3dhcCwgIiUqcyVzXHQldVx0JXVcdCVkXG4iLAotCQkgICAgICAgbGVuIDwgNDAgPyA0MCAtIGxlbiA6IDEsICIgIiwKLQkJICAgICAgIFNfSVNCTEsoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSA/CisJCQlsZW4gPCA0MCA/IDQwIC0gbGVuIDogMSwgIiAiLAorCQkJU19JU0JMSyhmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpID8KIAkJCQkicGFydGl0aW9uIiA6ICJmaWxlXHQiLAotCQkgICAgICAgcHRyLT5wYWdlcyA8PCAoUEFHRV9TSElGVCAtIDEwKSwKLQkJICAgICAgIHB0ci0+aW51c2VfcGFnZXMgPDwgKFBBR0VfU0hJRlQgLSAxMCksCi0JCSAgICAgICBwdHItPnByaW8pOworCQkJcHRyLT5wYWdlcyA8PCAoUEFHRV9TSElGVCAtIDEwKSwKKwkJCXB0ci0+aW51c2VfcGFnZXMgPDwgKFBBR0VfU0hJRlQgLSAxMCksCisJCQlwdHItPnByaW8pOwogCXJldHVybiAwOwogfQogCkBAIC0xNDg3LDEyICsxNjQ0LDExIEBACiAJaW50IGksIHByZXY7CiAJaW50IGVycm9yOwogCXVuaW9uIHN3YXBfaGVhZGVyICpzd2FwX2hlYWRlciA9IE5VTEw7Ci0JaW50IHN3YXBfaGVhZGVyX3ZlcnNpb247CiAJdW5zaWduZWQgaW50IG5yX2dvb2RfcGFnZXMgPSAwOwogCWludCBucl9leHRlbnRzID0gMDsKIAlzZWN0b3JfdCBzcGFuOwogCXVuc2lnbmVkIGxvbmcgbWF4cGFnZXMgPSAxOwotCWludCBzd2FwZmlsZXNpemU7CisJdW5zaWduZWQgbG9uZyBzd2FwZmlsZXBhZ2VzOwogCXVuc2lnbmVkIHNob3J0ICpzd2FwX21hcCA9IE5VTEw7CiAJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOwpAQCAtMTU3MCw3ICsxNzI2LDcgQEAKIAkJZ290byBiYWRfc3dhcDsKIAl9CiAKLQlzd2FwZmlsZXNpemUgPSBpX3NpemVfcmVhZChpbm9kZSkgPj4gUEFHRV9TSElGVDsKKwlzd2FwZmlsZXBhZ2VzID0gaV9zaXplX3JlYWQoaW5vZGUpID4+IFBBR0VfU0hJRlQ7CiAKIAkvKgogCSAqIFJlYWQgdGhlIHN3YXAgaGVhZGVyLgpAQCAtMTU4NCwxMDIgKzE3NDAsOTIgQEAKIAkJZXJyb3IgPSBQVFJfRVJSKHBhZ2UpOwogCQlnb3RvIGJhZF9zd2FwOwogCX0KLQlrbWFwKHBhZ2UpOwotCXN3YXBfaGVhZGVyID0gcGFnZV9hZGRyZXNzKHBhZ2UpOworCXN3YXBfaGVhZGVyID0ga21hcChwYWdlKTsKIAotCWlmICghbWVtY21wKCJTV0FQLVNQQUNFIixzd2FwX2hlYWRlci0+bWFnaWMubWFnaWMsMTApKQotCQlzd2FwX2hlYWRlcl92ZXJzaW9uID0gMTsKLQllbHNlIGlmICghbWVtY21wKCJTV0FQU1BBQ0UyIixzd2FwX2hlYWRlci0+bWFnaWMubWFnaWMsMTApKQotCQlzd2FwX2hlYWRlcl92ZXJzaW9uID0gMjsKLQllbHNlIHsKKwlpZiAobWVtY21wKCJTV0FQU1BBQ0UyIiwgc3dhcF9oZWFkZXItPm1hZ2ljLm1hZ2ljLCAxMCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gZmluZCBzd2FwLXNwYWNlIHNpZ25hdHVyZVxuIik7CiAJCWVycm9yID0gLUVJTlZBTDsKIAkJZ290byBiYWRfc3dhcDsKIAl9Ci0JCi0Jc3dpdGNoIChzd2FwX2hlYWRlcl92ZXJzaW9uKSB7Ci0JY2FzZSAxOgotCQlwcmludGsoS0VSTl9FUlIgInZlcnNpb24gMCBzd2FwIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuICIKLQkJCSJVc2UgbWtzd2FwIC12MSAlc1xuIiwgbmFtZSk7CisKKwkvKiBzd2FwIHBhcnRpdGlvbiBlbmRpYW5lc3MgaGFjay4uLiAqLworCWlmIChzd2FiMzIoc3dhcF9oZWFkZXItPmluZm8udmVyc2lvbikgPT0gMSkgeworCQlzd2FiMzJzKCZzd2FwX2hlYWRlci0+aW5mby52ZXJzaW9uKTsKKwkJc3dhYjMycygmc3dhcF9oZWFkZXItPmluZm8ubGFzdF9wYWdlKTsKKwkJc3dhYjMycygmc3dhcF9oZWFkZXItPmluZm8ubnJfYmFkcGFnZXMpOworCQlmb3IgKGkgPSAwOyBpIDwgc3dhcF9oZWFkZXItPmluZm8ubnJfYmFkcGFnZXM7IGkrKykKKwkJCXN3YWIzMnMoJnN3YXBfaGVhZGVyLT5pbmZvLmJhZHBhZ2VzW2ldKTsKKwl9CisJLyogQ2hlY2sgdGhlIHN3YXAgaGVhZGVyJ3Mgc3ViLXZlcnNpb24gKi8KKwlpZiAoc3dhcF9oZWFkZXItPmluZm8udmVyc2lvbiAhPSAxKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJVbmFibGUgdG8gaGFuZGxlIHN3YXAgaGVhZGVyIHZlcnNpb24gJWRcbiIsCisJCSAgICAgICBzd2FwX2hlYWRlci0+aW5mby52ZXJzaW9uKTsKIAkJZXJyb3IgPSAtRUlOVkFMOwogCQlnb3RvIGJhZF9zd2FwOwotCWNhc2UgMjoKLQkJLyogc3dhcCBwYXJ0aXRpb24gZW5kaWFuZXNzIGhhY2suLi4gKi8KLQkJaWYgKHN3YWIzMihzd2FwX2hlYWRlci0+aW5mby52ZXJzaW9uKSA9PSAxKSB7Ci0JCQlzd2FiMzJzKCZzd2FwX2hlYWRlci0+aW5mby52ZXJzaW9uKTsKLQkJCXN3YWIzMnMoJnN3YXBfaGVhZGVyLT5pbmZvLmxhc3RfcGFnZSk7Ci0JCQlzd2FiMzJzKCZzd2FwX2hlYWRlci0+aW5mby5ucl9iYWRwYWdlcyk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgc3dhcF9oZWFkZXItPmluZm8ubnJfYmFkcGFnZXM7IGkrKykKLQkJCQlzd2FiMzJzKCZzd2FwX2hlYWRlci0+aW5mby5iYWRwYWdlc1tpXSk7Ci0JCX0KLQkJLyogQ2hlY2sgdGhlIHN3YXAgaGVhZGVyJ3Mgc3ViLXZlcnNpb24gYW5kIHRoZSBzaXplIG9mCi0gICAgICAgICAgICAgICAgICAgdGhlIHN3YXAgZmlsZSBhbmQgYmFkIGJsb2NrIGxpc3RzICovCi0JCWlmIChzd2FwX2hlYWRlci0+aW5mby52ZXJzaW9uICE9IDEpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSAgICAgICAiVW5hYmxlIHRvIGhhbmRsZSBzd2FwIGhlYWRlciB2ZXJzaW9uICVkXG4iLAotCQkJICAgICAgIHN3YXBfaGVhZGVyLT5pbmZvLnZlcnNpb24pOworCX0KKworCXAtPmxvd2VzdF9iaXQgID0gMTsKKwlwLT5jbHVzdGVyX25leHQgPSAxOworCisJLyoKKwkgKiBGaW5kIG91dCBob3cgbWFueSBwYWdlcyBhcmUgYWxsb3dlZCBmb3IgYSBzaW5nbGUgc3dhcAorCSAqIGRldmljZS4gVGhlcmUgYXJlIHR3byBsaW1pdGluZyBmYWN0b3JzOiAxKSB0aGUgbnVtYmVyIG9mCisJICogYml0cyBmb3IgdGhlIHN3YXAgb2Zmc2V0IGluIHRoZSBzd3BfZW50cnlfdCB0eXBlIGFuZAorCSAqIDIpIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgYSBzd2FwIHB0ZSBhcyBkZWZpbmVkIGJ5CisJICogdGhlIGRpZmZlcmVudCBhcmNoaXRlY3R1cmVzLiBJbiBvcmRlciB0byBmaW5kIHRoZQorCSAqIGxhcmdlc3QgcG9zc2libGUgYml0IG1hc2sgYSBzd2FwIGVudHJ5IHdpdGggc3dhcCB0eXBlIDAKKwkgKiBhbmQgc3dhcCBvZmZzZXQgfjBVTCBpcyBjcmVhdGVkLCBlbmNvZGVkIHRvIGEgc3dhcCBwdGUsCisJICogZGVjb2RlZCB0byBhIHN3cF9lbnRyeV90IGFnYWluIGFuZCBmaW5hbGx5IHRoZSBzd2FwCisJICogb2Zmc2V0IGlzIGV4dHJhY3RlZC4gVGhpcyB3aWxsIG1hc2sgYWxsIHRoZSBiaXRzIGZyb20KKwkgKiB0aGUgaW5pdGlhbCB+MFVMIG1hc2sgdGhhdCBjYW4ndCBiZSBlbmNvZGVkIGluIGVpdGhlcgorCSAqIHRoZSBzd3BfZW50cnlfdCBvciB0aGUgYXJjaGl0ZWN0dXJlIGRlZmluaXRpb24gb2YgYQorCSAqIHN3YXAgcHRlLgorCSAqLworCW1heHBhZ2VzID0gc3dwX29mZnNldChwdGVfdG9fc3dwX2VudHJ5KAorCQkJc3dwX2VudHJ5X3RvX3B0ZShzd3BfZW50cnkoMCwgfjBVTCkpKSkgLSAxOworCWlmIChtYXhwYWdlcyA+IHN3YXBfaGVhZGVyLT5pbmZvLmxhc3RfcGFnZSkKKwkJbWF4cGFnZXMgPSBzd2FwX2hlYWRlci0+aW5mby5sYXN0X3BhZ2U7CisJcC0+aGlnaGVzdF9iaXQgPSBtYXhwYWdlcyAtIDE7CisKKwllcnJvciA9IC1FSU5WQUw7CisJaWYgKCFtYXhwYWdlcykKKwkJZ290byBiYWRfc3dhcDsKKwlpZiAoc3dhcGZpbGVwYWdlcyAmJiBtYXhwYWdlcyA+IHN3YXBmaWxlcGFnZXMpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIlN3YXAgYXJlYSBzaG9ydGVyIHRoYW4gc2lnbmF0dXJlIGluZGljYXRlc1xuIik7CisJCWdvdG8gYmFkX3N3YXA7CisJfQorCWlmIChzd2FwX2hlYWRlci0+aW5mby5ucl9iYWRwYWdlcyAmJiBTX0lTUkVHKGlub2RlLT5pX21vZGUpKQorCQlnb3RvIGJhZF9zd2FwOworCWlmIChzd2FwX2hlYWRlci0+aW5mby5ucl9iYWRwYWdlcyA+IE1BWF9TV0FQX0JBRFBBR0VTKQorCQlnb3RvIGJhZF9zd2FwOworCisJLyogT0ssIHNldCB1cCB0aGUgc3dhcCBtYXAgYW5kIGFwcGx5IHRoZSBiYWQgYmxvY2sgbGlzdCAqLworCXN3YXBfbWFwID0gdm1hbGxvYyhtYXhwYWdlcyAqIHNpemVvZihzaG9ydCkpOworCWlmICghc3dhcF9tYXApIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIGJhZF9zd2FwOworCX0KKworCW1lbXNldChzd2FwX21hcCwgMCwgbWF4cGFnZXMgKiBzaXplb2Yoc2hvcnQpKTsKKwlmb3IgKGkgPSAwOyBpIDwgc3dhcF9oZWFkZXItPmluZm8ubnJfYmFkcGFnZXM7IGkrKykgeworCQlpbnQgcGFnZV9uciA9IHN3YXBfaGVhZGVyLT5pbmZvLmJhZHBhZ2VzW2ldOworCQlpZiAocGFnZV9uciA8PSAwIHx8IHBhZ2VfbnIgPj0gc3dhcF9oZWFkZXItPmluZm8ubGFzdF9wYWdlKSB7CiAJCQllcnJvciA9IC1FSU5WQUw7CiAJCQlnb3RvIGJhZF9zd2FwOwogCQl9Ci0KLQkJcC0+bG93ZXN0X2JpdCAgPSAxOwotCQlwLT5jbHVzdGVyX25leHQgPSAxOwotCi0JCS8qCi0JCSAqIEZpbmQgb3V0IGhvdyBtYW55IHBhZ2VzIGFyZSBhbGxvd2VkIGZvciBhIHNpbmdsZSBzd2FwCi0JCSAqIGRldmljZS4gVGhlcmUgYXJlIHR3byBsaW1pdGluZyBmYWN0b3JzOiAxKSB0aGUgbnVtYmVyIG9mCi0JCSAqIGJpdHMgZm9yIHRoZSBzd2FwIG9mZnNldCBpbiB0aGUgc3dwX2VudHJ5X3QgdHlwZSBhbmQKLQkJICogMikgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBhIHN3YXAgcHRlIGFzIGRlZmluZWQgYnkKLQkJICogdGhlIGRpZmZlcmVudCBhcmNoaXRlY3R1cmVzLiBJbiBvcmRlciB0byBmaW5kIHRoZQotCQkgKiBsYXJnZXN0IHBvc3NpYmxlIGJpdCBtYXNrIGEgc3dhcCBlbnRyeSB3aXRoIHN3YXAgdHlwZSAwCi0JCSAqIGFuZCBzd2FwIG9mZnNldCB+MFVMIGlzIGNyZWF0ZWQsIGVuY29kZWQgdG8gYSBzd2FwIHB0ZSwKLQkJICogZGVjb2RlZCB0byBhIHN3cF9lbnRyeV90IGFnYWluIGFuZCBmaW5hbGx5IHRoZSBzd2FwCi0JCSAqIG9mZnNldCBpcyBleHRyYWN0ZWQuIFRoaXMgd2lsbCBtYXNrIGFsbCB0aGUgYml0cyBmcm9tCi0JCSAqIHRoZSBpbml0aWFsIH4wVUwgbWFzayB0aGF0IGNhbid0IGJlIGVuY29kZWQgaW4gZWl0aGVyCi0JCSAqIHRoZSBzd3BfZW50cnlfdCBvciB0aGUgYXJjaGl0ZWN0dXJlIGRlZmluaXRpb24gb2YgYQotCQkgKiBzd2FwIHB0ZS4KLQkJICovCi0JCW1heHBhZ2VzID0gc3dwX29mZnNldChwdGVfdG9fc3dwX2VudHJ5KHN3cF9lbnRyeV90b19wdGUoc3dwX2VudHJ5KDAsfjBVTCkpKSkgLSAxOwotCQlpZiAobWF4cGFnZXMgPiBzd2FwX2hlYWRlci0+aW5mby5sYXN0X3BhZ2UpCi0JCQltYXhwYWdlcyA9IHN3YXBfaGVhZGVyLT5pbmZvLmxhc3RfcGFnZTsKLQkJcC0+aGlnaGVzdF9iaXQgPSBtYXhwYWdlcyAtIDE7Ci0KLQkJZXJyb3IgPSAtRUlOVkFMOwotCQlpZiAoIW1heHBhZ2VzKQotCQkJZ290byBiYWRfc3dhcDsKLQkJaWYgKHN3YXBmaWxlc2l6ZSAmJiBtYXhwYWdlcyA+IHN3YXBmaWxlc2l6ZSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJICAgICAgICJTd2FwIGFyZWEgc2hvcnRlciB0aGFuIHNpZ25hdHVyZSBpbmRpY2F0ZXNcbiIpOwotCQkJZ290byBiYWRfc3dhcDsKLQkJfQotCQlpZiAoc3dhcF9oZWFkZXItPmluZm8ubnJfYmFkcGFnZXMgJiYgU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKLQkJCWdvdG8gYmFkX3N3YXA7Ci0JCWlmIChzd2FwX2hlYWRlci0+aW5mby5ucl9iYWRwYWdlcyA+IE1BWF9TV0FQX0JBRFBBR0VTKQotCQkJZ290byBiYWRfc3dhcDsKLQotCQkvKiBPSywgc2V0IHVwIHRoZSBzd2FwIG1hcCBhbmQgYXBwbHkgdGhlIGJhZCBibG9jayBsaXN0ICovCi0JCXN3YXBfbWFwID0gdm1hbGxvYyhtYXhwYWdlcyAqIHNpemVvZihzaG9ydCkpOwotCQlpZiAoIXN3YXBfbWFwKSB7Ci0JCQllcnJvciA9IC1FTk9NRU07Ci0JCQlnb3RvIGJhZF9zd2FwOwotCQl9Ci0KLQkJZXJyb3IgPSAwOwotCQltZW1zZXQoc3dhcF9tYXAsIDAsIG1heHBhZ2VzICogc2l6ZW9mKHNob3J0KSk7Ci0JCWZvciAoaSA9IDA7IGkgPCBzd2FwX2hlYWRlci0+aW5mby5ucl9iYWRwYWdlczsgaSsrKSB7Ci0JCQlpbnQgcGFnZV9uciA9IHN3YXBfaGVhZGVyLT5pbmZvLmJhZHBhZ2VzW2ldOwotCQkJaWYgKHBhZ2VfbnIgPD0gMCB8fCBwYWdlX25yID49IHN3YXBfaGVhZGVyLT5pbmZvLmxhc3RfcGFnZSkKLQkJCQllcnJvciA9IC1FSU5WQUw7Ci0JCQllbHNlCi0JCQkJc3dhcF9tYXBbcGFnZV9ucl0gPSBTV0FQX01BUF9CQUQ7Ci0JCX0KLQkJbnJfZ29vZF9wYWdlcyA9IHN3YXBfaGVhZGVyLT5pbmZvLmxhc3RfcGFnZSAtCi0JCQkJc3dhcF9oZWFkZXItPmluZm8ubnJfYmFkcGFnZXMgLQotCQkJCTEgLyogaGVhZGVyIHBhZ2UgKi87Ci0JCWlmIChlcnJvcikKLQkJCWdvdG8gYmFkX3N3YXA7CisJCXN3YXBfbWFwW3BhZ2VfbnJdID0gU1dBUF9NQVBfQkFEOwogCX0KIAorCWVycm9yID0gc3dhcF9jZ3JvdXBfc3dhcG9uKHR5cGUsIG1heHBhZ2VzKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gYmFkX3N3YXA7CisKKwlucl9nb29kX3BhZ2VzID0gc3dhcF9oZWFkZXItPmluZm8ubGFzdF9wYWdlIC0KKwkJCXN3YXBfaGVhZGVyLT5pbmZvLm5yX2JhZHBhZ2VzIC0KKwkJCTEgLyogaGVhZGVyIHBhZ2UgKi87CisKIAlpZiAobnJfZ29vZF9wYWdlcykgewogCQlzd2FwX21hcFswXSA9IFNXQVBfTUFQX0JBRDsKIAkJcC0+bWF4ID0gbWF4cGFnZXM7CkBAIC0xNjk3LDYgKzE4NDMsMTMgQEAKIAkJZ290byBiYWRfc3dhcDsKIAl9CiAKKwlpZiAoYmxrX3F1ZXVlX25vbnJvdChiZGV2X2dldF9xdWV1ZShwLT5iZGV2KSkpIHsKKwkJcC0+ZmxhZ3MgfD0gU1dQX1NPTElEU1RBVEU7CisJCXAtPmNsdXN0ZXJfbmV4dCA9IDEgKyAocmFuZG9tMzIoKSAlIHAtPmhpZ2hlc3RfYml0KTsKKwl9CisJaWYgKGRpc2NhcmRfc3dhcChwKSA9PSAwKQorCQlwLT5mbGFncyB8PSBTV1BfRElTQ0FSREFCTEU7CisKIAltdXRleF9sb2NrKCZzd2Fwb25fbXV0ZXgpOwogCXNwaW5fbG9jaygmc3dhcF9sb2NrKTsKIAlpZiAoc3dhcF9mbGFncyAmIFNXQVBfRkxBR19QUkVGRVIpCkBAIC0xNzA1LDE0ICsxODU4LDE2IEBACiAJZWxzZQogCQlwLT5wcmlvID0gLS1sZWFzdF9wcmlvcml0eTsKIAlwLT5zd2FwX21hcCA9IHN3YXBfbWFwOwotCXAtPmZsYWdzID0gU1dQX0FDVElWRTsKKwlwLT5mbGFncyB8PSBTV1BfV1JJVEVPSzsKIAlucl9zd2FwX3BhZ2VzICs9IG5yX2dvb2RfcGFnZXM7CiAJdG90YWxfc3dhcF9wYWdlcyArPSBucl9nb29kX3BhZ2VzOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiQWRkaW5nICV1ayBzd2FwIG9uICVzLiAgIgotCQkJIlByaW9yaXR5OiVkIGV4dGVudHM6JWQgYWNyb3NzOiVsbHVrXG4iLAorCQkJIlByaW9yaXR5OiVkIGV4dGVudHM6JWQgYWNyb3NzOiVsbHVrICVzJXNcbiIsCiAJCW5yX2dvb2RfcGFnZXM8PChQQUdFX1NISUZULTEwKSwgbmFtZSwgcC0+cHJpbywKLQkJbnJfZXh0ZW50cywgKHVuc2lnbmVkIGxvbmcgbG9uZylzcGFuPDwoUEFHRV9TSElGVC0xMCkpOworCQlucl9leHRlbnRzLCAodW5zaWduZWQgbG9uZyBsb25nKXNwYW48PChQQUdFX1NISUZULTEwKSwKKwkJKHAtPmZsYWdzICYgU1dQX1NPTElEU1RBVEUpID8gIlNTIiA6ICIiLAorCQkocC0+ZmxhZ3MgJiBTV1BfRElTQ0FSREFCTEUpID8gIkQiIDogIiIpOwogCiAJLyogaW5zZXJ0IHN3YXAgc3BhY2UgaW50byBzd2FwX2xpc3Q6ICovCiAJcHJldiA9IC0xOwpAQCAtMTczOCw2ICsxODkzLDcgQEAKIAkJYmRfcmVsZWFzZShiZGV2KTsKIAl9CiAJZGVzdHJveV9zd2FwX2V4dGVudHMocCk7CisJc3dhcF9jZ3JvdXBfc3dhcG9mZih0eXBlKTsKIGJhZF9zd2FwXzI6CiAJc3Bpbl9sb2NrKCZzd2FwX2xvY2spOwogCXAtPnN3YXBfZmlsZSA9IE5VTEw7CmRpZmYgLS1naXQgYS9tbS90aW55LXNobWVtLmMgYi9tbS90aW55LXNobWVtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNjdkNTcuLjAwMDAwMDAKLS0tIGEvbW0vdGlueS1zaG1lbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qCi0gKiB0aW55LXNobWVtLmM6IHNpbXBsZSBzaG1lbWZzIGFuZCB0bXBmcyB1c2luZyByYW1mcyBjb2RlCi0gKgotICogTWF0dCBNYWNrYWxsIDxtcG1Ac2VsZW5pYy5jb20+IEphbnVhcnksIDIwMDQKLSAqIGRlcml2ZWQgZnJvbSBtbS9zaG1lbS5jIGFuZCBmcy9yYW1mcy9pbm9kZS5jCi0gKgotICogVGhpcyBpcyBpbnRlbmRlZCBmb3Igc21hbGwgc3lzdGVtIHdoZXJlIHRoZSBiZW5lZml0cyBvZiB0aGUgZnVsbAotICogc2htZW0gY29kZSAoc3dhcC1iYWNrZWQgYW5kIHJlc291cmNlLWxpbWl0ZWQpIGFyZSBvdXR3ZWlnaGVkIGJ5Ci0gKiB0aGVpciBjb21wbGV4aXR5LiBPbiBzeXN0ZW1zIHdpdGhvdXQgc3dhcCB0aGlzIGNvZGUgc2hvdWxkIGJlCi0gKiBlZmZlY3RpdmVseSBlcXVpdmFsZW50LCBidXQgbXVjaCBsaWdodGVyIHdlaWdodC4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdmZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW91bnQuaD4KLSNpbmNsdWRlIDxsaW51eC9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zd2FwLmg+Ci0jaW5jbHVkZSA8bGludXgvcmFtZnMuaD4KLQotc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHRtcGZzX2ZzX3R5cGUgPSB7Ci0JLm5hbWUJCT0gInRtcGZzIiwKLQkuZ2V0X3NiCQk9IHJhbWZzX2dldF9zYiwKLQkua2lsbF9zYgk9IGtpbGxfbGl0dGVyX3N1cGVyLAotfTsKLQotc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqc2htX21udDsKLQotc3RhdGljIGludCBfX2luaXQgaW5pdF90bXBmcyh2b2lkKQotewotCUJVR19PTihyZWdpc3Rlcl9maWxlc3lzdGVtKCZ0bXBmc19mc190eXBlKSAhPSAwKTsKLQotCXNobV9tbnQgPSBrZXJuX21vdW50KCZ0bXBmc19mc190eXBlKTsKLQlCVUdfT04oSVNfRVJSKHNobV9tbnQpKTsKLQotCXJldHVybiAwOwotfQotbW9kdWxlX2luaXQoaW5pdF90bXBmcykKLQotLyoqCi0gKiBzaG1lbV9maWxlX3NldHVwIC0gZ2V0IGFuIHVubGlua2VkIGZpbGUgbGl2aW5nIGluIHRtcGZzCi0gKiBAbmFtZTogbmFtZSBmb3IgZGVudHJ5ICh0byBiZSBzZWVuIGluIC9wcm9jLzxwaWQ+L21hcHMKLSAqIEBzaXplOiBzaXplIHRvIGJlIHNldCBmb3IgdGhlIGZpbGUKLSAqIEBmbGFnczogdm1fZmxhZ3MKLSAqLwotc3RydWN0IGZpbGUgKnNobWVtX2ZpbGVfc2V0dXAoY2hhciAqbmFtZSwgbG9mZl90IHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0JaW50IGVycm9yOwotCXN0cnVjdCBmaWxlICpmaWxlOwotCXN0cnVjdCBpbm9kZSAqaW5vZGU7Ci0Jc3RydWN0IGRlbnRyeSAqZGVudHJ5LCAqcm9vdDsKLQlzdHJ1Y3QgcXN0ciB0aGlzOwotCi0JaWYgKElTX0VSUihzaG1fbW50KSkKLQkJcmV0dXJuICh2b2lkICopc2htX21udDsKLQotCWVycm9yID0gLUVOT01FTTsKLQl0aGlzLm5hbWUgPSBuYW1lOwotCXRoaXMubGVuID0gc3RybGVuKG5hbWUpOwotCXRoaXMuaGFzaCA9IDA7IC8qIHdpbGwgZ28gKi8KLQlyb290ID0gc2htX21udC0+bW50X3Jvb3Q7Ci0JZGVudHJ5ID0gZF9hbGxvYyhyb290LCAmdGhpcyk7Ci0JaWYgKCFkZW50cnkpCi0JCWdvdG8gcHV0X21lbW9yeTsKLQotCWVycm9yID0gLUVORklMRTsKLQlmaWxlID0gZ2V0X2VtcHR5X2ZpbHAoKTsKLQlpZiAoIWZpbGUpCi0JCWdvdG8gcHV0X2RlbnRyeTsKLQotCWVycm9yID0gLUVOT1NQQzsKLQlpbm9kZSA9IHJhbWZzX2dldF9pbm9kZShyb290LT5kX3NiLCBTX0lGUkVHIHwgU19JUldYVUdPLCAwKTsKLQlpZiAoIWlub2RlKQotCQlnb3RvIGNsb3NlX2ZpbGU7Ci0KLQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwotCWlub2RlLT5pX3NpemUgPSBzaXplOwotCWlub2RlLT5pX25saW5rID0gMDsJLyogSXQgaXMgdW5saW5rZWQgKi8KLQlpbml0X2ZpbGUoZmlsZSwgc2htX21udCwgZGVudHJ5LCBGTU9ERV9XUklURSB8IEZNT0RFX1JFQUQsCi0JCQkmcmFtZnNfZmlsZV9vcGVyYXRpb25zKTsKLQotI2lmbmRlZiBDT05GSUdfTU1VCi0JZXJyb3IgPSByYW1mc19ub21tdV9leHBhbmRfZm9yX21hcHBpbmcoaW5vZGUsIHNpemUpOwotCWlmIChlcnJvcikKLQkJZ290byBjbG9zZV9maWxlOwotI2VuZGlmCi0JcmV0dXJuIGZpbGU7Ci0KLWNsb3NlX2ZpbGU6Ci0JcHV0X2ZpbHAoZmlsZSk7Ci1wdXRfZGVudHJ5OgotCWRwdXQoZGVudHJ5KTsKLXB1dF9tZW1vcnk6Ci0JcmV0dXJuIEVSUl9QVFIoZXJyb3IpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc2htZW1fZmlsZV9zZXR1cCk7Ci0KLS8qKgotICogc2htZW1femVyb19zZXR1cCAtIHNldHVwIGEgc2hhcmVkIGFub255bW91cyBtYXBwaW5nCi0gKiBAdm1hOiB0aGUgdm1hIHRvIGJlIG1tYXBwZWQgaXMgcHJlcGFyZWQgYnkgZG9fbW1hcF9wZ29mZgotICovCi1pbnQgc2htZW1femVyb19zZXR1cChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQlzdHJ1Y3QgZmlsZSAqZmlsZTsKLQlsb2ZmX3Qgc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKLQotCWZpbGUgPSBzaG1lbV9maWxlX3NldHVwKCJkZXYvemVybyIsIHNpemUsIHZtYS0+dm1fZmxhZ3MpOwotCWlmIChJU19FUlIoZmlsZSkpCi0JCXJldHVybiBQVFJfRVJSKGZpbGUpOwotCi0JaWYgKHZtYS0+dm1fZmlsZSkKLQkJZnB1dCh2bWEtPnZtX2ZpbGUpOwotCXZtYS0+dm1fZmlsZSA9IGZpbGU7Ci0Jdm1hLT52bV9vcHMgPSAmZ2VuZXJpY19maWxlX3ZtX29wczsKLQlyZXR1cm4gMDsKLX0KLQotaW50IHNobWVtX3VudXNlKHN3cF9lbnRyeV90IGVudHJ5LCBzdHJ1Y3QgcGFnZSAqcGFnZSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotI2lmbmRlZiBDT05GSUdfTU1VCi11bnNpZ25lZCBsb25nIHNobWVtX2dldF91bm1hcHBlZF9hcmVhKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWRkciwKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nIGxlbiwKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nIHBnb2ZmLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0JcmV0dXJuIHJhbWZzX25vbW11X2dldF91bm1hcHBlZF9hcmVhKGZpbGUsIGFkZHIsIGxlbiwgcGdvZmYsIGZsYWdzKTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbW0vdm1hbGxvYy5jIGIvbW0vdm1hbGxvYy5jCmluZGV4IDc0NjVmMjIuLmM1ZGI5YTcgMTAwNjQ0Ci0tLSBhL21tL3ZtYWxsb2MuYworKysgYi9tbS92bWFsbG9jLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KQEAgLTM4MSw4ICszODIsOSBAQAogCQkJZ290byByZXRyeTsKIAkJfQogCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAidm1hcCBhbGxvY2F0aW9uIGZhaWxlZDogIgotCQkJCSAidXNlIHZtYWxsb2M9PHNpemU+IHRvIGluY3JlYXNlIHNpemUuXG4iKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkidm1hcCBhbGxvY2F0aW9uIGZvciBzaXplICVsdSBmYWlsZWQ6ICIKKwkJCQkidXNlIHZtYWxsb2M9PHNpemU+IHRvIGluY3JlYXNlIHNpemUuXG4iLCBzaXplKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVCVVNZKTsKIAl9CiAKQEAgLTQzMiw2ICs0MzQsMjcgQEAKIAl2dW5tYXBfcGFnZV9yYW5nZSh2YS0+dmFfc3RhcnQsIHZhLT52YV9lbmQpOwogfQogCitzdGF0aWMgdm9pZCB2bWFwX2RlYnVnX2ZyZWVfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJLyoKKwkgKiBVbm1hcCBwYWdlIHRhYmxlcyBhbmQgZm9yY2UgYSBUTEIgZmx1c2ggaW1tZWRpYXRlbHkgaWYKKwkgKiBDT05GSUdfREVCVUdfUEFHRUFMTE9DIGlzIHNldC4gVGhpcyBjYXRjaGVzIHVzZSBhZnRlciBmcmVlCisJICogYnVncyBzaW1pbGFybHkgdG8gdGhvc2UgaW4gbGluZWFyIGtlcm5lbCB2aXJ0dWFsIGFkZHJlc3MKKwkgKiBzcGFjZSBhZnRlciBhIHBhZ2UgaGFzIGJlZW4gZnJlZWQuCisJICoKKwkgKiBBbGwgdGhlIGxhenkgZnJlZWluZyBsb2dpYyBpcyBzdGlsbCByZXRhaW5lZCwgaW4gb3JkZXIgdG8KKwkgKiBtaW5pbWlzZSBpbnRydXNpdmVuZXNzIG9mIHRoaXMgZGVidWdnaW5nIGZlYXR1cmUuCisJICoKKwkgKiBUaGlzIGlzIGdvaW5nIHRvIGJlICpzbG93KiAobGluZWFyIGtlcm5lbCB2aXJ0dWFsIGFkZHJlc3MKKwkgKiBkZWJ1Z2dpbmcgZG9lc24ndCBkbyBhIGJyb2FkY2FzdCBUTEIgZmx1c2ggc28gaXQgaXMgYSBsb3QKKwkgKiBmYXN0ZXIpLgorCSAqLworI2lmZGVmIENPTkZJR19ERUJVR19QQUdFQUxMT0MKKwl2dW5tYXBfcGFnZV9yYW5nZShzdGFydCwgZW5kKTsKKwlmbHVzaF90bGJfa2VybmVsX3JhbmdlKHN0YXJ0LCBlbmQpOworI2VuZGlmCit9CisKIC8qCiAgKiBsYXp5X21heF9wYWdlcyBpcyB0aGUgbWF4aW11bSBhbW91bnQgb2YgdmlydHVhbCBhZGRyZXNzIHNwYWNlIHdlIGdhdGhlciB1cAogICogYmVmb3JlIGF0dGVtcHRpbmcgdG8gcHVyZ2Ugd2l0aCBhIFRMQiBmbHVzaC4KQEAgLTQ3Miw3ICs0OTUsNyBAQAogc3RhdGljIHZvaWQgX19wdXJnZV92bWFwX2FyZWFfbGF6eSh1bnNpZ25lZCBsb25nICpzdGFydCwgdW5zaWduZWQgbG9uZyAqZW5kLAogCQkJCQlpbnQgc3luYywgaW50IGZvcmNlX2ZsdXNoKQogewotCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0socHVyZ2VfbG9jayk7CisJc3RhdGljIERFRklORV9NVVRFWChwdXJnZV9sb2NrKTsKIAlMSVNUX0hFQUQodmFsaXN0KTsKIAlzdHJ1Y3Qgdm1hcF9hcmVhICp2YTsKIAlpbnQgbnIgPSAwOwpAQCAtNDgzLDEwICs1MDYsMTAgQEAKIAkgKiB0aGUgY2FzZSB0aGF0IGlzbid0IGFjdHVhbGx5IHVzZWQgYXQgdGhlIG1vbWVudCBhbnl3YXkuCiAJICovCiAJaWYgKCFzeW5jICYmICFmb3JjZV9mbHVzaCkgewotCQlpZiAoIXNwaW5fdHJ5bG9jaygmcHVyZ2VfbG9jaykpCisJCWlmICghbXV0ZXhfdHJ5bG9jaygmcHVyZ2VfbG9jaykpCiAJCQlyZXR1cm47CiAJfSBlbHNlCi0JCXNwaW5fbG9jaygmcHVyZ2VfbG9jayk7CisJCW11dGV4X2xvY2soJnB1cmdlX2xvY2spOwogCiAJcmN1X3JlYWRfbG9jaygpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHZhLCAmdm1hcF9hcmVhX2xpc3QsIGxpc3QpIHsKQEAgLTUxOCw3ICs1NDEsNyBAQAogCQkJX19mcmVlX3ZtYXBfYXJlYSh2YSk7CiAJCXNwaW5fdW5sb2NrKCZ2bWFwX2FyZWFfbG9jayk7CiAJfQotCXNwaW5fdW5sb2NrKCZwdXJnZV9sb2NrKTsKKwltdXRleF91bmxvY2soJnB1cmdlX2xvY2spOwogfQogCiAvKgpAQCAtOTEyLDYgKzkzNSw3IEBACiAJQlVHX09OKGFkZHIgJiAoUEFHRV9TSVpFLTEpKTsKIAogCWRlYnVnX2NoZWNrX25vX2xvY2tzX2ZyZWVkKG1lbSwgc2l6ZSk7CisJdm1hcF9kZWJ1Z19mcmVlX3JhbmdlKGFkZHIsIGFkZHIrc2l6ZSk7CiAKIAlpZiAobGlrZWx5KGNvdW50IDw9IFZNQVBfTUFYX0FMTE9DKSkKIAkJdmJfZnJlZShtZW0sIHNpemUpOwpAQCAtMTEyOCw2ICsxMTUyLDggQEAKIAlpZiAodmEgJiYgdmEtPmZsYWdzICYgVk1fVk1fQVJFQSkgewogCQlzdHJ1Y3Qgdm1fc3RydWN0ICp2bSA9IHZhLT5wcml2YXRlOwogCQlzdHJ1Y3Qgdm1fc3RydWN0ICp0bXAsICoqcDsKKworCQl2bWFwX2RlYnVnX2ZyZWVfcmFuZ2UodmEtPnZhX3N0YXJ0LCB2YS0+dmFfZW5kKTsKIAkJZnJlZV91bm1hcF92bWFwX2FyZWEodmEpOwogCQl2bS0+c2l6ZSAtPSBQQUdFX1NJWkU7CiAKQEAgLTEzNzUsNyArMTQwMSw4IEBACiAJc3RydWN0IHZtX3N0cnVjdCAqYXJlYTsKIAl2b2lkICpyZXQ7CiAKLQlyZXQgPSBfX3ZtYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX0hJR0hNRU0gfCBfX0dGUF9aRVJPLCBQQUdFX0tFUk5FTCk7CisJcmV0ID0gX192bWFsbG9jX25vZGUoc2l6ZSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX0hJR0hNRU0gfCBfX0dGUF9aRVJPLAorCQkJICAgICBQQUdFX0tFUk5FTCwgLTEsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CiAJaWYgKHJldCkgewogCQlhcmVhID0gZmluZF92bV9hcmVhKHJldCk7CiAJCWFyZWEtPmZsYWdzIHw9IFZNX1VTRVJNQVA7CkBAIC0xNDIwLDcgKzE0NDcsOCBAQAogCiB2b2lkICp2bWFsbG9jX2V4ZWModW5zaWduZWQgbG9uZyBzaXplKQogewotCXJldHVybiBfX3ZtYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX0hJR0hNRU0sIFBBR0VfS0VSTkVMX0VYRUMpOworCXJldHVybiBfX3ZtYWxsb2Nfbm9kZShzaXplLCBHRlBfS0VSTkVMIHwgX19HRlBfSElHSE1FTSwgUEFHRV9LRVJORUxfRVhFQywKKwkJCSAgICAgIC0xLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwogfQogCiAjaWYgZGVmaW5lZChDT05GSUdfNjRCSVQpICYmIGRlZmluZWQoQ09ORklHX1pPTkVfRE1BMzIpCkBAIC0xNDQwLDcgKzE0NjgsOCBAQAogICovCiB2b2lkICp2bWFsbG9jXzMyKHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKLQlyZXR1cm4gX192bWFsbG9jKHNpemUsIEdGUF9WTUFMTE9DMzIsIFBBR0VfS0VSTkVMKTsKKwlyZXR1cm4gX192bWFsbG9jX25vZGUoc2l6ZSwgR0ZQX1ZNQUxMT0MzMiwgUEFHRV9LRVJORUwsCisJCQkgICAgICAtMSwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKIH0KIEVYUE9SVF9TWU1CT0wodm1hbGxvY18zMik7CiAKQEAgLTE0NTYsNyArMTQ4NSw4IEBACiAJc3RydWN0IHZtX3N0cnVjdCAqYXJlYTsKIAl2b2lkICpyZXQ7CiAKLQlyZXQgPSBfX3ZtYWxsb2Moc2l6ZSwgR0ZQX1ZNQUxMT0MzMiB8IF9fR0ZQX1pFUk8sIFBBR0VfS0VSTkVMKTsKKwlyZXQgPSBfX3ZtYWxsb2Nfbm9kZShzaXplLCBHRlBfVk1BTExPQzMyIHwgX19HRlBfWkVSTywgUEFHRV9LRVJORUwsCisJCQkgICAgIC0xLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwogCWlmIChyZXQpIHsKIAkJYXJlYSA9IGZpbmRfdm1fYXJlYShyZXQpOwogCQlhcmVhLT5mbGFncyB8PSBWTV9VU0VSTUFQOwpkaWZmIC0tZ2l0IGEvbW0vdm1zY2FuLmMgYi9tbS92bXNjYW4uYwppbmRleCBkMTk2ZjQ2Li45YTI3YzQ0IDEwMDY0NAotLS0gYS9tbS92bXNjYW4uYworKysgYi9tbS92bXNjYW4uYwpAQCAtNTIsNiArNTIsOSBAQAogCS8qIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgaW5hY3RpdmUgcGFnZXMgdGhhdCB3ZXJlIHNjYW5uZWQgKi8KIAl1bnNpZ25lZCBsb25nIG5yX3NjYW5uZWQ7CiAKKwkvKiBOdW1iZXIgb2YgcGFnZXMgZnJlZWQgc28gZmFyIGR1cmluZyBhIGNhbGwgdG8gc2hyaW5rX3pvbmVzKCkgKi8KKwl1bnNpZ25lZCBsb25nIG5yX3JlY2xhaW1lZDsKKwogCS8qIFRoaXMgY29udGV4dCdzIEdGUCBtYXNrICovCiAJZ2ZwX3QgZ2ZwX21hc2s7CiAKQEAgLTEyMiwxMSArMTI1LDMwIEBACiBzdGF0aWMgREVDTEFSRV9SV1NFTShzaHJpbmtlcl9yd3NlbSk7CiAKICNpZmRlZiBDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUgotI2RlZmluZSBzY2FuX2dsb2JhbF9scnUoc2MpCSghKHNjKS0+bWVtX2Nncm91cCkKKyNkZWZpbmUgc2Nhbm5pbmdfZ2xvYmFsX2xydShzYykJKCEoc2MpLT5tZW1fY2dyb3VwKQogI2Vsc2UKLSNkZWZpbmUgc2Nhbl9nbG9iYWxfbHJ1KHNjKQkoMSkKKyNkZWZpbmUgc2Nhbm5pbmdfZ2xvYmFsX2xydShzYykJKDEpCiAjZW5kaWYKIAorc3RhdGljIHN0cnVjdCB6b25lX3JlY2xhaW1fc3RhdCAqZ2V0X3JlY2xhaW1fc3RhdChzdHJ1Y3Qgem9uZSAqem9uZSwKKwkJCQkJCSAgc3RydWN0IHNjYW5fY29udHJvbCAqc2MpCit7CisJaWYgKCFzY2FubmluZ19nbG9iYWxfbHJ1KHNjKSkKKwkJcmV0dXJuIG1lbV9jZ3JvdXBfZ2V0X3JlY2xhaW1fc3RhdChzYy0+bWVtX2Nncm91cCwgem9uZSk7CisKKwlyZXR1cm4gJnpvbmUtPnJlY2xhaW1fc3RhdDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgem9uZV9ucl9wYWdlcyhzdHJ1Y3Qgem9uZSAqem9uZSwgc3RydWN0IHNjYW5fY29udHJvbCAqc2MsCisJCQkJICAgZW51bSBscnVfbGlzdCBscnUpCit7CisJaWYgKCFzY2FubmluZ19nbG9iYWxfbHJ1KHNjKSkKKwkJcmV0dXJuIG1lbV9jZ3JvdXBfem9uZV9ucl9wYWdlcyhzYy0+bWVtX2Nncm91cCwgem9uZSwgbHJ1KTsKKworCXJldHVybiB6b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfTFJVX0JBU0UgKyBscnUpOworfQorCisKIC8qCiAgKiBBZGQgYSBzaHJpbmtlciBjYWxsYmFjayB0byBiZSBjYWxsZWQgZnJvbSB0aGUgdm0KICAqLwpAQCAtNTA5LDcgKzUzMSw2IEBACiAJCWxydSA9IExSVV9VTkVWSUNUQUJMRTsKIAkJYWRkX3BhZ2VfdG9fdW5ldmljdGFibGVfbGlzdChwYWdlKTsKIAl9Ci0JbWVtX2Nncm91cF9tb3ZlX2xpc3RzKHBhZ2UsIGxydSk7CiAKIAkvKgogCSAqIHBhZ2UncyBzdGF0dXMgY2FuIGNoYW5nZSB3aGlsZSB3ZSBtb3ZlIGl0IGFtb25nIGxydS4gSWYgYW4gZXZpY3RhYmxlCkBAIC01NDQsNyArNTY1LDYgQEAKIAogCWxydSA9ICEhVGVzdENsZWFyUGFnZUFjdGl2ZShwYWdlKSArIHBhZ2VfaXNfZmlsZV9jYWNoZShwYWdlKTsKIAlscnVfY2FjaGVfYWRkX2xydShwYWdlLCBscnUpOwotCW1lbV9jZ3JvdXBfbW92ZV9saXN0cyhwYWdlLCBscnUpOwogCXB1dF9wYWdlKHBhZ2UpOwogfQogI2VuZGlmIC8qIENPTkZJR19VTkVWSUNUQUJMRV9MUlUgKi8KQEAgLTYxNyw3ICs2MzcsNiBAQAogCQkJCQlyZWZlcmVuY2VkICYmIHBhZ2VfbWFwcGluZ19pbnVzZShwYWdlKSkKIAkJCWdvdG8gYWN0aXZhdGVfbG9ja2VkOwogCi0jaWZkZWYgQ09ORklHX1NXQVAKIAkJLyoKIAkJICogQW5vbnltb3VzIHByb2Nlc3MgbWVtb3J5IGhhcyBiYWNraW5nIHN0b3JlPwogCQkgKiBUcnkgdG8gYWxsb2NhdGUgaXQgc29tZSBzd2FwIHNwYWNlIGhlcmUuCkBAIC02MjUsMjAgKzY0NCwxMCBAQAogCQlpZiAoUGFnZUFub24ocGFnZSkgJiYgIVBhZ2VTd2FwQ2FjaGUocGFnZSkpIHsKIAkJCWlmICghKHNjLT5nZnBfbWFzayAmIF9fR0ZQX0lPKSkKIAkJCQlnb3RvIGtlZXBfbG9ja2VkOwotCQkJc3dpdGNoICh0cnlfdG9fbXVubG9jayhwYWdlKSkgewotCQkJY2FzZSBTV0FQX0ZBSUw6CQkvKiBzaG91bGRuJ3QgaGFwcGVuICovCi0JCQljYXNlIFNXQVBfQUdBSU46Ci0JCQkJZ290byBrZWVwX2xvY2tlZDsKLQkJCWNhc2UgU1dBUF9NTE9DSzoKLQkJCQlnb3RvIGN1bGxfbWxvY2tlZDsKLQkJCWNhc2UgU1dBUF9TVUNDRVNTOgotCQkJCTsgLyogZmFsbCB0aHJ1JzsgYWRkIHRvIHN3YXAgY2FjaGUgKi8KLQkJCX0KLQkJCWlmICghYWRkX3RvX3N3YXAocGFnZSwgR0ZQX0FUT01JQykpCisJCQlpZiAoIWFkZF90b19zd2FwKHBhZ2UpKQogCQkJCWdvdG8gYWN0aXZhdGVfbG9ja2VkOwogCQkJbWF5X2VudGVyX2ZzID0gMTsKIAkJfQotI2VuZGlmIC8qIENPTkZJR19TV0FQICovCiAKIAkJbWFwcGluZyA9IHBhZ2VfbWFwcGluZyhwYWdlKTsKIApAQCAtNzUyLDYgKzc2MSw4IEBACiAJCWNvbnRpbnVlOwogCiBjdWxsX21sb2NrZWQ6CisJCWlmIChQYWdlU3dhcENhY2hlKHBhZ2UpKQorCQkJdHJ5X3RvX2ZyZWVfc3dhcChwYWdlKTsKIAkJdW5sb2NrX3BhZ2UocGFnZSk7CiAJCXB1dGJhY2tfbHJ1X3BhZ2UocGFnZSk7CiAJCWNvbnRpbnVlOwpAQCAtNzU5LDcgKzc3MCw3IEBACiBhY3RpdmF0ZV9sb2NrZWQ6CiAJCS8qIE5vdCBhIGNhbmRpZGF0ZSBmb3Igc3dhcHBpbmcsIHNvIHJlY2xhaW0gc3dhcCBzcGFjZS4gKi8KIAkJaWYgKFBhZ2VTd2FwQ2FjaGUocGFnZSkgJiYgdm1fc3dhcF9mdWxsKCkpCi0JCQlyZW1vdmVfZXhjbHVzaXZlX3N3YXBfcGFnZV9yZWYocGFnZSk7CisJCQl0cnlfdG9fZnJlZV9zd2FwKHBhZ2UpOwogCQlWTV9CVUdfT04oUGFnZUFjdGl2ZShwYWdlKSk7CiAJCVNldFBhZ2VBY3RpdmUocGFnZSk7CiAJCXBnYWN0aXZhdGUrKzsKQEAgLTgxOSw2ICs4MzAsNyBAQAogCQlyZXR1cm4gcmV0OwogCiAJcmV0ID0gLUVCVVNZOworCiAJaWYgKGxpa2VseShnZXRfcGFnZV91bmxlc3NfemVybyhwYWdlKSkpIHsKIAkJLyoKIAkJICogQmUgY2FyZWZ1bCBub3QgdG8gY2xlYXIgUGFnZUxSVSB1bnRpbCBhZnRlciB3ZSdyZQpAQCAtODI3LDYgKzgzOSw3IEBACiAJCSAqLwogCQlDbGVhclBhZ2VMUlUocGFnZSk7CiAJCXJldCA9IDA7CisJCW1lbV9jZ3JvdXBfZGVsX2xydShwYWdlKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwpAQCAtMTAzNSw2ICsxMDQ4LDcgQEAKIAlzdHJ1Y3QgcGFnZXZlYyBwdmVjOwogCXVuc2lnbmVkIGxvbmcgbnJfc2Nhbm5lZCA9IDA7CiAJdW5zaWduZWQgbG9uZyBucl9yZWNsYWltZWQgPSAwOworCXN0cnVjdCB6b25lX3JlY2xhaW1fc3RhdCAqcmVjbGFpbV9zdGF0ID0gZ2V0X3JlY2xhaW1fc3RhdCh6b25lLCBzYyk7CiAKIAlwYWdldmVjX2luaXQoJnB2ZWMsIDEpOwogCkBAIC0xMDc2LDEzICsxMDkwLDE0IEBACiAJCV9fbW9kX3pvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9JTkFDVElWRV9BTk9OLAogCQkJCQkJLWNvdW50W0xSVV9JTkFDVElWRV9BTk9OXSk7CiAKLQkJaWYgKHNjYW5fZ2xvYmFsX2xydShzYykpIHsKKwkJaWYgKHNjYW5uaW5nX2dsb2JhbF9scnUoc2MpKQogCQkJem9uZS0+cGFnZXNfc2Nhbm5lZCArPSBucl9zY2FuOwotCQkJem9uZS0+cmVjZW50X3NjYW5uZWRbMF0gKz0gY291bnRbTFJVX0lOQUNUSVZFX0FOT05dOwotCQkJem9uZS0+cmVjZW50X3NjYW5uZWRbMF0gKz0gY291bnRbTFJVX0FDVElWRV9BTk9OXTsKLQkJCXpvbmUtPnJlY2VudF9zY2FubmVkWzFdICs9IGNvdW50W0xSVV9JTkFDVElWRV9GSUxFXTsKLQkJCXpvbmUtPnJlY2VudF9zY2FubmVkWzFdICs9IGNvdW50W0xSVV9BQ1RJVkVfRklMRV07Ci0JCX0KKworCQlyZWNsYWltX3N0YXQtPnJlY2VudF9zY2FubmVkWzBdICs9IGNvdW50W0xSVV9JTkFDVElWRV9BTk9OXTsKKwkJcmVjbGFpbV9zdGF0LT5yZWNlbnRfc2Nhbm5lZFswXSArPSBjb3VudFtMUlVfQUNUSVZFX0FOT05dOworCQlyZWNsYWltX3N0YXQtPnJlY2VudF9zY2FubmVkWzFdICs9IGNvdW50W0xSVV9JTkFDVElWRV9GSUxFXTsKKwkJcmVjbGFpbV9zdGF0LT5yZWNlbnRfc2Nhbm5lZFsxXSArPSBjb3VudFtMUlVfQUNUSVZFX0ZJTEVdOworCiAJCXNwaW5fdW5sb2NrX2lycSgmem9uZS0+bHJ1X2xvY2spOwogCiAJCW5yX3NjYW5uZWQgKz0gbnJfc2NhbjsKQEAgLTExMTQsNyArMTEyOSw3IEBACiAJCWlmIChjdXJyZW50X2lzX2tzd2FwZCgpKSB7CiAJCQlfX2NvdW50X3pvbmVfdm1fZXZlbnRzKFBHU0NBTl9LU1dBUEQsIHpvbmUsIG5yX3NjYW4pOwogCQkJX19jb3VudF92bV9ldmVudHMoS1NXQVBEX1NURUFMLCBucl9mcmVlZCk7Ci0JCX0gZWxzZSBpZiAoc2Nhbl9nbG9iYWxfbHJ1KHNjKSkKKwkJfSBlbHNlIGlmIChzY2FubmluZ19nbG9iYWxfbHJ1KHNjKSkKIAkJCV9fY291bnRfem9uZV92bV9ldmVudHMoUEdTQ0FOX0RJUkVDVCwgem9uZSwgbnJfc2Nhbik7CiAKIAkJX19jb3VudF96b25lX3ZtX2V2ZW50cyhQR1NURUFMLCB6b25lLCBucl9mcmVlZCk7CkBAIC0xMTQwLDEwICsxMTU1LDkgQEAKIAkJCVNldFBhZ2VMUlUocGFnZSk7CiAJCQlscnUgPSBwYWdlX2xydShwYWdlKTsKIAkJCWFkZF9wYWdlX3RvX2xydV9saXN0KHpvbmUsIHBhZ2UsIGxydSk7Ci0JCQltZW1fY2dyb3VwX21vdmVfbGlzdHMocGFnZSwgbHJ1KTsKLQkJCWlmIChQYWdlQWN0aXZlKHBhZ2UpICYmIHNjYW5fZ2xvYmFsX2xydShzYykpIHsKKwkJCWlmIChQYWdlQWN0aXZlKHBhZ2UpKSB7CiAJCQkJaW50IGZpbGUgPSAhIXBhZ2VfaXNfZmlsZV9jYWNoZShwYWdlKTsKLQkJCQl6b25lLT5yZWNlbnRfcm90YXRlZFtmaWxlXSsrOworCQkJCXJlY2xhaW1fc3RhdC0+cmVjZW50X3JvdGF0ZWRbZmlsZV0rKzsKIAkJCX0KIAkJCWlmICghcGFnZXZlY19hZGQoJnB2ZWMsIHBhZ2UpKSB7CiAJCQkJc3Bpbl91bmxvY2tfaXJxKCZ6b25lLT5scnVfbG9jayk7CkBAIC0xMTczLDExICsxMTg3LDYgQEAKIAkJem9uZS0+cHJldl9wcmlvcml0eSA9IHByaW9yaXR5OwogfQogCi1zdGF0aWMgaW5saW5lIGludCB6b25lX2lzX25lYXJfb29tKHN0cnVjdCB6b25lICp6b25lKQotewotCXJldHVybiB6b25lLT5wYWdlc19zY2FubmVkID49ICh6b25lX2xydV9wYWdlcyh6b25lKSAqIDMpOwotfQotCiAvKgogICogVGhpcyBtb3ZlcyBwYWdlcyBmcm9tIHRoZSBhY3RpdmUgbGlzdCB0byB0aGUgaW5hY3RpdmUgbGlzdC4KICAqCkBAIC0xMjA4LDYgKzEyMTcsNyBAQAogCXN0cnVjdCBwYWdlICpwYWdlOwogCXN0cnVjdCBwYWdldmVjIHB2ZWM7CiAJZW51bSBscnVfbGlzdCBscnU7CisJc3RydWN0IHpvbmVfcmVjbGFpbV9zdGF0ICpyZWNsYWltX3N0YXQgPSBnZXRfcmVjbGFpbV9zdGF0KHpvbmUsIHNjKTsKIAogCWxydV9hZGRfZHJhaW4oKTsKIAlzcGluX2xvY2tfaXJxKCZ6b25lLT5scnVfbG9jayk7CkBAIC0xMjE4LDEwICsxMjI4LDEwIEBACiAJICogem9uZS0+cGFnZXNfc2Nhbm5lZCBpcyB1c2VkIGZvciBkZXRlY3Qgem9uZSdzIG9vbQogCSAqIG1lbV9jZ3JvdXAgcmVtZW1iZXJzIG5yX3NjYW4gYnkgaXRzZWxmLgogCSAqLwotCWlmIChzY2FuX2dsb2JhbF9scnUoc2MpKSB7CisJaWYgKHNjYW5uaW5nX2dsb2JhbF9scnUoc2MpKSB7CiAJCXpvbmUtPnBhZ2VzX3NjYW5uZWQgKz0gcGdzY2FubmVkOwotCQl6b25lLT5yZWNlbnRfc2Nhbm5lZFshIWZpbGVdICs9IHBnbW92ZWQ7CiAJfQorCXJlY2xhaW1fc3RhdC0+cmVjZW50X3NjYW5uZWRbISFmaWxlXSArPSBwZ21vdmVkOwogCiAJaWYgKGZpbGUpCiAJCV9fbW9kX3pvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9BQ1RJVkVfRklMRSwgLXBnbW92ZWQpOwpAQCAtMTI0OCw2ICsxMjU4LDEzIEBACiAJCWxpc3RfYWRkKCZwYWdlLT5scnUsICZsX2luYWN0aXZlKTsKIAl9CiAKKwkvKgorCSAqIE1vdmUgdGhlIHBhZ2VzIHRvIHRoZSBbZmlsZSBvciBhbm9uXSBpbmFjdGl2ZSBsaXN0LgorCSAqLworCXBhZ2V2ZWNfaW5pdCgmcHZlYywgMSk7CisJcGdtb3ZlZCA9IDA7CisJbHJ1ID0gTFJVX0JBU0UgKyBmaWxlICogTFJVX0ZJTEU7CisKIAlzcGluX2xvY2tfaXJxKCZ6b25lLT5scnVfbG9jayk7CiAJLyoKIAkgKiBDb3VudCByZWZlcmVuY2VkIHBhZ2VzIGZyb20gY3VycmVudGx5IHVzZWQgbWFwcGluZ3MgYXMKQEAgLTEyNTUsMTUgKzEyNzIsOCBAQAogCSAqIFRoaXMgaGVscHMgYmFsYW5jZSBzY2FuIHByZXNzdXJlIGJldHdlZW4gZmlsZSBhbmQgYW5vbnltb3VzCiAJICogcGFnZXMgaW4gZ2V0X3NjYW5fcmF0aW8uCiAJICovCi0Jem9uZS0+cmVjZW50X3JvdGF0ZWRbISFmaWxlXSArPSBwZ21vdmVkOworCXJlY2xhaW1fc3RhdC0+cmVjZW50X3JvdGF0ZWRbISFmaWxlXSArPSBwZ21vdmVkOwogCi0JLyoKLQkgKiBNb3ZlIHRoZSBwYWdlcyB0byB0aGUgW2ZpbGUgb3IgYW5vbl0gaW5hY3RpdmUgbGlzdC4KLQkgKi8KLQlwYWdldmVjX2luaXQoJnB2ZWMsIDEpOwotCi0JcGdtb3ZlZCA9IDA7Ci0JbHJ1ID0gTFJVX0JBU0UgKyBmaWxlICogTFJVX0ZJTEU7CiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZsX2luYWN0aXZlKSkgewogCQlwYWdlID0gbHJ1X3RvX3BhZ2UoJmxfaW5hY3RpdmUpOwogCQlwcmVmZXRjaHdfcHJldl9scnVfcGFnZShwYWdlLCAmbF9pbmFjdGl2ZSwgZmxhZ3MpOwpAQCAtMTI3Myw3ICsxMjgzLDcgQEAKIAkJQ2xlYXJQYWdlQWN0aXZlKHBhZ2UpOwogCiAJCWxpc3RfbW92ZSgmcGFnZS0+bHJ1LCAmem9uZS0+bHJ1W2xydV0ubGlzdCk7Ci0JCW1lbV9jZ3JvdXBfbW92ZV9saXN0cyhwYWdlLCBscnUpOworCQltZW1fY2dyb3VwX2FkZF9scnVfbGlzdChwYWdlLCBscnUpOwogCQlwZ21vdmVkKys7CiAJCWlmICghcGFnZXZlY19hZGQoJnB2ZWMsIHBhZ2UpKSB7CiAJCQlfX21vZF96b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfTFJVX0JBU0UgKyBscnUsIHBnbW92ZWQpOwpAQCAtMTMwMiw2ICsxMzEyLDM4IEBACiAJcGFnZXZlY19yZWxlYXNlKCZwdmVjKTsKIH0KIAorc3RhdGljIGludCBpbmFjdGl2ZV9hbm9uX2lzX2xvd19nbG9iYWwoc3RydWN0IHpvbmUgKnpvbmUpCit7CisJdW5zaWduZWQgbG9uZyBhY3RpdmUsIGluYWN0aXZlOworCisJYWN0aXZlID0gem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0FDVElWRV9BTk9OKTsKKwlpbmFjdGl2ZSA9IHpvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9JTkFDVElWRV9BTk9OKTsKKworCWlmIChpbmFjdGl2ZSAqIHpvbmUtPmluYWN0aXZlX3JhdGlvIDwgYWN0aXZlKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGluYWN0aXZlX2Fub25faXNfbG93IC0gY2hlY2sgaWYgYW5vbnltb3VzIHBhZ2VzIG5lZWQgdG8gYmUgZGVhY3RpdmF0ZWQKKyAqIEB6b25lOiB6b25lIHRvIGNoZWNrCisgKiBAc2M6ICAgc2NhbiBjb250cm9sIG9mIHRoaXMgY29udGV4dAorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgem9uZSBkb2VzIG5vdCBoYXZlIGVub3VnaCBpbmFjdGl2ZSBhbm9uIHBhZ2VzLAorICogbWVhbmluZyBzb21lIGFjdGl2ZSBhbm9uIHBhZ2VzIG5lZWQgdG8gYmUgZGVhY3RpdmF0ZWQuCisgKi8KK3N0YXRpYyBpbnQgaW5hY3RpdmVfYW5vbl9pc19sb3coc3RydWN0IHpvbmUgKnpvbmUsIHN0cnVjdCBzY2FuX2NvbnRyb2wgKnNjKQoreworCWludCBsb3c7CisKKwlpZiAoc2Nhbm5pbmdfZ2xvYmFsX2xydShzYykpCisJCWxvdyA9IGluYWN0aXZlX2Fub25faXNfbG93X2dsb2JhbCh6b25lKTsKKwllbHNlCisJCWxvdyA9IG1lbV9jZ3JvdXBfaW5hY3RpdmVfYW5vbl9pc19sb3coc2MtPm1lbV9jZ3JvdXApOworCXJldHVybiBsb3c7Cit9CisKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHNocmlua19saXN0KGVudW0gbHJ1X2xpc3QgbHJ1LCB1bnNpZ25lZCBsb25nIG5yX3RvX3NjYW4sCiAJc3RydWN0IHpvbmUgKnpvbmUsIHN0cnVjdCBzY2FuX2NvbnRyb2wgKnNjLCBpbnQgcHJpb3JpdHkpCiB7CkBAIC0xMzEyLDggKzEzNTQsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAobHJ1ID09IExSVV9BQ1RJVkVfQU5PTiAmJgotCSAgICAoIXNjYW5fZ2xvYmFsX2xydShzYykgfHwgaW5hY3RpdmVfYW5vbl9pc19sb3coem9uZSkpKSB7CisJaWYgKGxydSA9PSBMUlVfQUNUSVZFX0FOT04gJiYgaW5hY3RpdmVfYW5vbl9pc19sb3coem9uZSwgc2MpKSB7CiAJCXNocmlua19hY3RpdmVfbGlzdChucl90b19zY2FuLCB6b25lLCBzYywgcHJpb3JpdHksIGZpbGUpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xMzM1LDEyICsxMzc2LDcgQEAKIAl1bnNpZ25lZCBsb25nIGFub24sIGZpbGUsIGZyZWU7CiAJdW5zaWduZWQgbG9uZyBhbm9uX3ByaW8sIGZpbGVfcHJpbzsKIAl1bnNpZ25lZCBsb25nIGFwLCBmcDsKLQotCWFub24gID0gem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0FDVElWRV9BTk9OKSArCi0JCXpvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9JTkFDVElWRV9BTk9OKTsKLQlmaWxlICA9IHpvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9BQ1RJVkVfRklMRSkgKwotCQl6b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfSU5BQ1RJVkVfRklMRSk7Ci0JZnJlZSAgPSB6b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfRlJFRV9QQUdFUyk7CisJc3RydWN0IHpvbmVfcmVjbGFpbV9zdGF0ICpyZWNsYWltX3N0YXQgPSBnZXRfcmVjbGFpbV9zdGF0KHpvbmUsIHNjKTsKIAogCS8qIElmIHdlIGhhdmUgbm8gc3dhcCBzcGFjZSwgZG8gbm90IGJvdGhlciBzY2FubmluZyBhbm9uIHBhZ2VzLiAqLwogCWlmIChucl9zd2FwX3BhZ2VzIDw9IDApIHsKQEAgLTEzNDksMTEgKzEzODUsMjAgQEAKIAkJcmV0dXJuOwogCX0KIAotCS8qIElmIHdlIGhhdmUgdmVyeSBmZXcgcGFnZSBjYWNoZSBwYWdlcywgZm9yY2Utc2NhbiBhbm9uIHBhZ2VzLiAqLwotCWlmICh1bmxpa2VseShmaWxlICsgZnJlZSA8PSB6b25lLT5wYWdlc19oaWdoKSkgewotCQlwZXJjZW50WzBdID0gMTAwOwotCQlwZXJjZW50WzFdID0gMDsKLQkJcmV0dXJuOworCWFub24gID0gem9uZV9ucl9wYWdlcyh6b25lLCBzYywgTFJVX0FDVElWRV9BTk9OKSArCisJCXpvbmVfbnJfcGFnZXMoem9uZSwgc2MsIExSVV9JTkFDVElWRV9BTk9OKTsKKwlmaWxlICA9IHpvbmVfbnJfcGFnZXMoem9uZSwgc2MsIExSVV9BQ1RJVkVfRklMRSkgKworCQl6b25lX25yX3BhZ2VzKHpvbmUsIHNjLCBMUlVfSU5BQ1RJVkVfRklMRSk7CisKKwlpZiAoc2Nhbm5pbmdfZ2xvYmFsX2xydShzYykpIHsKKwkJZnJlZSAgPSB6b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfRlJFRV9QQUdFUyk7CisJCS8qIElmIHdlIGhhdmUgdmVyeSBmZXcgcGFnZSBjYWNoZSBwYWdlcywKKwkJICAgZm9yY2Utc2NhbiBhbm9uIHBhZ2VzLiAqLworCQlpZiAodW5saWtlbHkoZmlsZSArIGZyZWUgPD0gem9uZS0+cGFnZXNfaGlnaCkpIHsKKwkJCXBlcmNlbnRbMF0gPSAxMDA7CisJCQlwZXJjZW50WzFdID0gMDsKKwkJCXJldHVybjsKKwkJfQogCX0KIAogCS8qCkBAIC0xMzY3LDE3ICsxNDEyLDE3IEBACiAJICoKIAkgKiBhbm9uIGluIFswXSwgZmlsZSBpbiBbMV0KIAkgKi8KLQlpZiAodW5saWtlbHkoem9uZS0+cmVjZW50X3NjYW5uZWRbMF0gPiBhbm9uIC8gNCkpIHsKKwlpZiAodW5saWtlbHkocmVjbGFpbV9zdGF0LT5yZWNlbnRfc2Nhbm5lZFswXSA+IGFub24gLyA0KSkgewogCQlzcGluX2xvY2tfaXJxKCZ6b25lLT5scnVfbG9jayk7Ci0JCXpvbmUtPnJlY2VudF9zY2FubmVkWzBdIC89IDI7Ci0JCXpvbmUtPnJlY2VudF9yb3RhdGVkWzBdIC89IDI7CisJCXJlY2xhaW1fc3RhdC0+cmVjZW50X3NjYW5uZWRbMF0gLz0gMjsKKwkJcmVjbGFpbV9zdGF0LT5yZWNlbnRfcm90YXRlZFswXSAvPSAyOwogCQlzcGluX3VubG9ja19pcnEoJnpvbmUtPmxydV9sb2NrKTsKIAl9CiAKLQlpZiAodW5saWtlbHkoem9uZS0+cmVjZW50X3NjYW5uZWRbMV0gPiBmaWxlIC8gNCkpIHsKKwlpZiAodW5saWtlbHkocmVjbGFpbV9zdGF0LT5yZWNlbnRfc2Nhbm5lZFsxXSA+IGZpbGUgLyA0KSkgewogCQlzcGluX2xvY2tfaXJxKCZ6b25lLT5scnVfbG9jayk7Ci0JCXpvbmUtPnJlY2VudF9zY2FubmVkWzFdIC89IDI7Ci0JCXpvbmUtPnJlY2VudF9yb3RhdGVkWzFdIC89IDI7CisJCXJlY2xhaW1fc3RhdC0+cmVjZW50X3NjYW5uZWRbMV0gLz0gMjsKKwkJcmVjbGFpbV9zdGF0LT5yZWNlbnRfcm90YXRlZFsxXSAvPSAyOwogCQlzcGluX3VubG9ja19pcnEoJnpvbmUtPmxydV9sb2NrKTsKIAl9CiAKQEAgLTEzOTMsMTEgKzE0MzgsMTEgQEAKIAkgKiBwcm9wb3J0aW9uYWwgdG8gdGhlIGZyYWN0aW9uIG9mIHJlY2VudGx5IHNjYW5uZWQgcGFnZXMgb24KIAkgKiBlYWNoIGxpc3QgdGhhdCB3ZXJlIHJlY2VudGx5IHJlZmVyZW5jZWQgYW5kIGluIGFjdGl2ZSB1c2UuCiAJICovCi0JYXAgPSAoYW5vbl9wcmlvICsgMSkgKiAoem9uZS0+cmVjZW50X3NjYW5uZWRbMF0gKyAxKTsKLQlhcCAvPSB6b25lLT5yZWNlbnRfcm90YXRlZFswXSArIDE7CisJYXAgPSAoYW5vbl9wcmlvICsgMSkgKiAocmVjbGFpbV9zdGF0LT5yZWNlbnRfc2Nhbm5lZFswXSArIDEpOworCWFwIC89IHJlY2xhaW1fc3RhdC0+cmVjZW50X3JvdGF0ZWRbMF0gKyAxOwogCi0JZnAgPSAoZmlsZV9wcmlvICsgMSkgKiAoem9uZS0+cmVjZW50X3NjYW5uZWRbMV0gKyAxKTsKLQlmcCAvPSB6b25lLT5yZWNlbnRfcm90YXRlZFsxXSArIDE7CisJZnAgPSAoZmlsZV9wcmlvICsgMSkgKiAocmVjbGFpbV9zdGF0LT5yZWNlbnRfc2Nhbm5lZFsxXSArIDEpOworCWZwIC89IHJlY2xhaW1fc3RhdC0+cmVjZW50X3JvdGF0ZWRbMV0gKyAxOwogCiAJLyogTm9ybWFsaXplIHRvIHBlcmNlbnRhZ2VzICovCiAJcGVyY2VudFswXSA9IDEwMCAqIGFwIC8gKGFwICsgZnAgKyAxKTsKQEAgLTE0MDgsNjkgKzE0NTMsNzIgQEAKIC8qCiAgKiBUaGlzIGlzIGEgYmFzaWMgcGVyLXpvbmUgcGFnZSBmcmVlci4gIFVzZWQgYnkgYm90aCBrc3dhcGQgYW5kIGRpcmVjdCByZWNsYWltLgogICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzaHJpbmtfem9uZShpbnQgcHJpb3JpdHksIHN0cnVjdCB6b25lICp6b25lLAorc3RhdGljIHZvaWQgc2hyaW5rX3pvbmUoaW50IHByaW9yaXR5LCBzdHJ1Y3Qgem9uZSAqem9uZSwKIAkJCQlzdHJ1Y3Qgc2Nhbl9jb250cm9sICpzYykKIHsKIAl1bnNpZ25lZCBsb25nIG5yW05SX0xSVV9MSVNUU107CiAJdW5zaWduZWQgbG9uZyBucl90b19zY2FuOwotCXVuc2lnbmVkIGxvbmcgbnJfcmVjbGFpbWVkID0gMDsKIAl1bnNpZ25lZCBsb25nIHBlcmNlbnRbMl07CS8qIGFub24gQCAwOyBmaWxlIEAgMSAqLwogCWVudW0gbHJ1X2xpc3QgbDsKKwl1bnNpZ25lZCBsb25nIG5yX3JlY2xhaW1lZCA9IHNjLT5ucl9yZWNsYWltZWQ7CisJdW5zaWduZWQgbG9uZyBzd2FwX2NsdXN0ZXJfbWF4ID0gc2MtPnN3YXBfY2x1c3Rlcl9tYXg7CiAKIAlnZXRfc2Nhbl9yYXRpbyh6b25lLCBzYywgcGVyY2VudCk7CiAKIAlmb3JfZWFjaF9ldmljdGFibGVfbHJ1KGwpIHsKLQkJaWYgKHNjYW5fZ2xvYmFsX2xydShzYykpIHsKLQkJCWludCBmaWxlID0gaXNfZmlsZV9scnUobCk7Ci0JCQlpbnQgc2NhbjsKKwkJaW50IGZpbGUgPSBpc19maWxlX2xydShsKTsKKwkJaW50IHNjYW47CiAKLQkJCXNjYW4gPSB6b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfTFJVX0JBU0UgKyBsKTsKLQkJCWlmIChwcmlvcml0eSkgewotCQkJCXNjYW4gPj49IHByaW9yaXR5OwotCQkJCXNjYW4gPSAoc2NhbiAqIHBlcmNlbnRbZmlsZV0pIC8gMTAwOwotCQkJfQorCQlzY2FuID0gem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0xSVV9CQVNFICsgbCk7CisJCWlmIChwcmlvcml0eSkgeworCQkJc2NhbiA+Pj0gcHJpb3JpdHk7CisJCQlzY2FuID0gKHNjYW4gKiBwZXJjZW50W2ZpbGVdKSAvIDEwMDsKKwkJfQorCQlpZiAoc2Nhbm5pbmdfZ2xvYmFsX2xydShzYykpIHsKIAkJCXpvbmUtPmxydVtsXS5ucl9zY2FuICs9IHNjYW47CiAJCQlucltsXSA9IHpvbmUtPmxydVtsXS5ucl9zY2FuOwotCQkJaWYgKG5yW2xdID49IHNjLT5zd2FwX2NsdXN0ZXJfbWF4KQorCQkJaWYgKG5yW2xdID49IHN3YXBfY2x1c3Rlcl9tYXgpCiAJCQkJem9uZS0+bHJ1W2xdLm5yX3NjYW4gPSAwOwogCQkJZWxzZQogCQkJCW5yW2xdID0gMDsKLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBUaGlzIHJlY2xhaW0gb2NjdXJzIG5vdCBiZWNhdXNlIHpvbmUgbWVtb3J5IHNob3J0YWdlCi0JCQkgKiBidXQgYmVjYXVzZSBtZW1vcnkgY29udHJvbGxlciBoaXRzIGl0cyBsaW1pdC4KLQkJCSAqIERvbid0IG1vZGlmeSB6b25lIHJlY2xhaW0gcmVsYXRlZCBkYXRhLgotCQkJICovCi0JCQlucltsXSA9IG1lbV9jZ3JvdXBfY2FsY19yZWNsYWltKHNjLT5tZW1fY2dyb3VwLCB6b25lLAotCQkJCQkJCQlwcmlvcml0eSwgbCk7Ci0JCX0KKwkJfSBlbHNlCisJCQlucltsXSA9IHNjYW47CiAJfQogCiAJd2hpbGUgKG5yW0xSVV9JTkFDVElWRV9BTk9OXSB8fCBucltMUlVfQUNUSVZFX0ZJTEVdIHx8CiAJCQkJCW5yW0xSVV9JTkFDVElWRV9GSUxFXSkgewogCQlmb3JfZWFjaF9ldmljdGFibGVfbHJ1KGwpIHsKIAkJCWlmIChucltsXSkgewotCQkJCW5yX3RvX3NjYW4gPSBtaW4obnJbbF0sCi0JCQkJCSh1bnNpZ25lZCBsb25nKXNjLT5zd2FwX2NsdXN0ZXJfbWF4KTsKKwkJCQlucl90b19zY2FuID0gbWluKG5yW2xdLCBzd2FwX2NsdXN0ZXJfbWF4KTsKIAkJCQlucltsXSAtPSBucl90b19zY2FuOwogCiAJCQkJbnJfcmVjbGFpbWVkICs9IHNocmlua19saXN0KGwsIG5yX3RvX3NjYW4sCi0JCQkJCQkJem9uZSwgc2MsIHByaW9yaXR5KTsKKwkJCQkJCQkgICAgem9uZSwgc2MsIHByaW9yaXR5KTsKIAkJCX0KIAkJfQorCQkvKgorCQkgKiBPbiBsYXJnZSBtZW1vcnkgc3lzdGVtcywgc2NhbiA+PiBwcmlvcml0eSBjYW4gYmVjb21lCisJCSAqIHJlYWxseSBsYXJnZS4gVGhpcyBpcyBmaW5lIGZvciB0aGUgc3RhcnRpbmcgcHJpb3JpdHk7CisJCSAqIHdlIHdhbnQgdG8gcHV0IGVxdWFsIHNjYW5uaW5nIHByZXNzdXJlIG9uIGVhY2ggem9uZS4KKwkJICogSG93ZXZlciwgaWYgdGhlIFZNIGhhcyBhIGhhcmRlciB0aW1lIG9mIGZyZWVpbmcgcGFnZXMsCisJCSAqIHdpdGggbXVsdGlwbGUgcHJvY2Vzc2VzIHJlY2xhaW1pbmcgcGFnZXMsIHRoZSB0b3RhbAorCQkgKiBmcmVlaW5nIHRhcmdldCBjYW4gZ2V0IHVucmVhc29uYWJseSBsYXJnZS4KKwkJICovCisJCWlmIChucl9yZWNsYWltZWQgPiBzd2FwX2NsdXN0ZXJfbWF4ICYmCisJCQlwcmlvcml0eSA8IERFRl9QUklPUklUWSAmJiAhY3VycmVudF9pc19rc3dhcGQoKSkKKwkJCWJyZWFrOwogCX0KIAorCXNjLT5ucl9yZWNsYWltZWQgPSBucl9yZWNsYWltZWQ7CisKIAkvKgogCSAqIEV2ZW4gaWYgd2UgZGlkIG5vdCB0cnkgdG8gZXZpY3QgYW5vbiBwYWdlcyBhdCBhbGwsIHdlIHdhbnQgdG8KIAkgKiByZWJhbGFuY2UgdGhlIGFub24gbHJ1IGFjdGl2ZS9pbmFjdGl2ZSByYXRpby4KIAkgKi8KLQlpZiAoIXNjYW5fZ2xvYmFsX2xydShzYykgfHwgaW5hY3RpdmVfYW5vbl9pc19sb3coem9uZSkpCi0JCXNocmlua19hY3RpdmVfbGlzdChTV0FQX0NMVVNURVJfTUFYLCB6b25lLCBzYywgcHJpb3JpdHksIDApOwotCWVsc2UgaWYgKCFzY2FuX2dsb2JhbF9scnUoc2MpKQorCWlmIChpbmFjdGl2ZV9hbm9uX2lzX2xvdyh6b25lLCBzYykpCiAJCXNocmlua19hY3RpdmVfbGlzdChTV0FQX0NMVVNURVJfTUFYLCB6b25lLCBzYywgcHJpb3JpdHksIDApOwogCiAJdGhyb3R0bGVfdm1fd3JpdGVvdXQoc2MtPmdmcF9tYXNrKTsKLQlyZXR1cm4gbnJfcmVjbGFpbWVkOwogfQogCiAvKgpAQCAtMTQ4NCwxNiArMTUzMiwxMyBAQAogICogYikgVGhlIHpvbmVzIG1heSBiZSBvdmVyIHBhZ2VzX2hpZ2ggYnV0IHRoZXkgbXVzdCBnbyAqb3ZlciogcGFnZXNfaGlnaCB0bwogICogICAgc2F0aXNmeSB0aGUgYGluY3JlbWVudGFsIG1pbicgem9uZSBkZWZlbnNlIGFsZ29yaXRobS4KICAqCi0gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcmVjbGFpbWVkIHBhZ2VzLgotICoKICAqIElmIGEgem9uZSBpcyBkZWVtZWQgdG8gYmUgZnVsbCBvZiBwaW5uZWQgcGFnZXMgdGhlbiBqdXN0IGdpdmUgaXQgYSBsaWdodAogICogc2NhbiB0aGVuIGdpdmUgdXAgb24gaXQuCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNocmlua196b25lcyhpbnQgcHJpb3JpdHksIHN0cnVjdCB6b25lbGlzdCAqem9uZWxpc3QsCitzdGF0aWMgdm9pZCBzaHJpbmtfem9uZXMoaW50IHByaW9yaXR5LCBzdHJ1Y3Qgem9uZWxpc3QgKnpvbmVsaXN0LAogCQkJCQlzdHJ1Y3Qgc2Nhbl9jb250cm9sICpzYykKIHsKIAllbnVtIHpvbmVfdHlwZSBoaWdoX3pvbmVpZHggPSBnZnBfem9uZShzYy0+Z2ZwX21hc2spOwotCXVuc2lnbmVkIGxvbmcgbnJfcmVjbGFpbWVkID0gMDsKIAlzdHJ1Y3Qgem9uZXJlZiAqejsKIAlzdHJ1Y3Qgem9uZSAqem9uZTsKIApAQCAtMTUwNSw3ICsxNTUwLDcgQEAKIAkJICogVGFrZSBjYXJlIG1lbW9yeSBjb250cm9sbGVyIHJlY2xhaW1pbmcgaGFzIHNtYWxsIGluZmx1ZW5jZQogCQkgKiB0byBnbG9iYWwgTFJVLgogCQkgKi8KLQkJaWYgKHNjYW5fZ2xvYmFsX2xydShzYykpIHsKKwkJaWYgKHNjYW5uaW5nX2dsb2JhbF9scnUoc2MpKSB7CiAJCQlpZiAoIWNwdXNldF96b25lX2FsbG93ZWRfaGFyZHdhbGwoem9uZSwgR0ZQX0tFUk5FTCkpCiAJCQkJY29udGludWU7CiAJCQlub3RlX3pvbmVfc2Nhbm5pbmdfcHJpb3JpdHkoem9uZSwgcHJpb3JpdHkpOwpAQCAtMTUyNCwxMCArMTU2OSw4IEBACiAJCQkJCQkJcHJpb3JpdHkpOwogCQl9CiAKLQkJbnJfcmVjbGFpbWVkICs9IHNocmlua196b25lKHByaW9yaXR5LCB6b25lLCBzYyk7CisJCXNocmlua196b25lKHByaW9yaXR5LCB6b25lLCBzYyk7CiAJfQotCi0JcmV0dXJuIG5yX3JlY2xhaW1lZDsKIH0KIAogLyoKQEAgLTE1NTIsNyArMTU5NSw2IEBACiAJaW50IHByaW9yaXR5OwogCXVuc2lnbmVkIGxvbmcgcmV0ID0gMDsKIAl1bnNpZ25lZCBsb25nIHRvdGFsX3NjYW5uZWQgPSAwOwotCXVuc2lnbmVkIGxvbmcgbnJfcmVjbGFpbWVkID0gMDsKIAlzdHJ1Y3QgcmVjbGFpbV9zdGF0ZSAqcmVjbGFpbV9zdGF0ZSA9IGN1cnJlbnQtPnJlY2xhaW1fc3RhdGU7CiAJdW5zaWduZWQgbG9uZyBscnVfcGFnZXMgPSAwOwogCXN0cnVjdCB6b25lcmVmICp6OwpAQCAtMTU2MSwxMiArMTYwMywxMiBAQAogCiAJZGVsYXlhY2N0X2ZyZWVwYWdlc19zdGFydCgpOwogCi0JaWYgKHNjYW5fZ2xvYmFsX2xydShzYykpCisJaWYgKHNjYW5uaW5nX2dsb2JhbF9scnUoc2MpKQogCQljb3VudF92bV9ldmVudChBTExPQ1NUQUxMKTsKIAkvKgogCSAqIG1lbV9jZ3JvdXAgd2lsbCBub3QgZG8gc2hyaW5rX3NsYWIuCiAJICovCi0JaWYgKHNjYW5fZ2xvYmFsX2xydShzYykpIHsKKwlpZiAoc2Nhbm5pbmdfZ2xvYmFsX2xydShzYykpIHsKIAkJZm9yX2VhY2hfem9uZV96b25lbGlzdCh6b25lLCB6LCB6b25lbGlzdCwgaGlnaF96b25laWR4KSB7CiAKIAkJCWlmICghY3B1c2V0X3pvbmVfYWxsb3dlZF9oYXJkd2FsbCh6b25lLCBHRlBfS0VSTkVMKSkKQEAgLTE1ODAsMjEgKzE2MjIsMjEgQEAKIAkJc2MtPm5yX3NjYW5uZWQgPSAwOwogCQlpZiAoIXByaW9yaXR5KQogCQkJZGlzYWJsZV9zd2FwX3Rva2VuKCk7Ci0JCW5yX3JlY2xhaW1lZCArPSBzaHJpbmtfem9uZXMocHJpb3JpdHksIHpvbmVsaXN0LCBzYyk7CisJCXNocmlua196b25lcyhwcmlvcml0eSwgem9uZWxpc3QsIHNjKTsKIAkJLyoKIAkJICogRG9uJ3Qgc2hyaW5rIHNsYWJzIHdoZW4gcmVjbGFpbWluZyBtZW1vcnkgZnJvbQogCQkgKiBvdmVyIGxpbWl0IGNncm91cHMKIAkJICovCi0JCWlmIChzY2FuX2dsb2JhbF9scnUoc2MpKSB7CisJCWlmIChzY2FubmluZ19nbG9iYWxfbHJ1KHNjKSkgewogCQkJc2hyaW5rX3NsYWIoc2MtPm5yX3NjYW5uZWQsIHNjLT5nZnBfbWFzaywgbHJ1X3BhZ2VzKTsKIAkJCWlmIChyZWNsYWltX3N0YXRlKSB7Ci0JCQkJbnJfcmVjbGFpbWVkICs9IHJlY2xhaW1fc3RhdGUtPnJlY2xhaW1lZF9zbGFiOworCQkJCXNjLT5ucl9yZWNsYWltZWQgKz0gcmVjbGFpbV9zdGF0ZS0+cmVjbGFpbWVkX3NsYWI7CiAJCQkJcmVjbGFpbV9zdGF0ZS0+cmVjbGFpbWVkX3NsYWIgPSAwOwogCQkJfQogCQl9CiAJCXRvdGFsX3NjYW5uZWQgKz0gc2MtPm5yX3NjYW5uZWQ7Ci0JCWlmIChucl9yZWNsYWltZWQgPj0gc2MtPnN3YXBfY2x1c3Rlcl9tYXgpIHsKLQkJCXJldCA9IG5yX3JlY2xhaW1lZDsKKwkJaWYgKHNjLT5ucl9yZWNsYWltZWQgPj0gc2MtPnN3YXBfY2x1c3Rlcl9tYXgpIHsKKwkJCXJldCA9IHNjLT5ucl9yZWNsYWltZWQ7CiAJCQlnb3RvIG91dDsKIAkJfQogCkBAIC0xNjE2LDggKzE2NTgsOCBAQAogCQkJY29uZ2VzdGlvbl93YWl0KFdSSVRFLCBIWi8xMCk7CiAJfQogCS8qIHRvcCBwcmlvcml0eSBzaHJpbmtfem9uZXMgc3RpbGwgaGFkIG1vcmUgdG8gZG8/IGRvbid0IE9PTSwgdGhlbiAqLwotCWlmICghc2MtPmFsbF91bnJlY2xhaW1hYmxlICYmIHNjYW5fZ2xvYmFsX2xydShzYykpCi0JCXJldCA9IG5yX3JlY2xhaW1lZDsKKwlpZiAoIXNjLT5hbGxfdW5yZWNsYWltYWJsZSAmJiBzY2FubmluZ19nbG9iYWxfbHJ1KHNjKSkKKwkJcmV0ID0gc2MtPm5yX3JlY2xhaW1lZDsKIG91dDoKIAkvKgogCSAqIE5vdyB0aGF0IHdlJ3ZlIHNjYW5uZWQgYWxsIHRoZSB6b25lcyBhdCB0aGlzIHByaW9yaXR5IGxldmVsLCBub3RlCkBAIC0xNjI5LDcgKzE2NzEsNyBAQAogCWlmIChwcmlvcml0eSA8IDApCiAJCXByaW9yaXR5ID0gMDsKIAotCWlmIChzY2FuX2dsb2JhbF9scnUoc2MpKSB7CisJaWYgKHNjYW5uaW5nX2dsb2JhbF9scnUoc2MpKSB7CiAJCWZvcl9lYWNoX3pvbmVfem9uZWxpc3Qoem9uZSwgeiwgem9uZWxpc3QsIGhpZ2hfem9uZWlkeCkgewogCiAJCQlpZiAoIWNwdXNldF96b25lX2FsbG93ZWRfaGFyZHdhbGwoem9uZSwgR0ZQX0tFUk5FTCkpCkBAIC0xNjY1LDE5ICsxNzA3LDI0IEBACiAjaWZkZWYgQ09ORklHX0NHUk9VUF9NRU1fUkVTX0NUTFIKIAogdW5zaWduZWQgbG9uZyB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1fY29udCwKLQkJCQkJCWdmcF90IGdmcF9tYXNrKQorCQkJCQkgICBnZnBfdCBnZnBfbWFzaywKKwkJCQkJICAgYm9vbCBub3N3YXAsCisJCQkJCSAgIHVuc2lnbmVkIGludCBzd2FwcGluZXNzKQogewogCXN0cnVjdCBzY2FuX2NvbnRyb2wgc2MgPSB7CiAJCS5tYXlfd3JpdGVwYWdlID0gIWxhcHRvcF9tb2RlLAogCQkubWF5X3N3YXAgPSAxLAogCQkuc3dhcF9jbHVzdGVyX21heCA9IFNXQVBfQ0xVU1RFUl9NQVgsCi0JCS5zd2FwcGluZXNzID0gdm1fc3dhcHBpbmVzcywKKwkJLnN3YXBwaW5lc3MgPSBzd2FwcGluZXNzLAogCQkub3JkZXIgPSAwLAogCQkubWVtX2Nncm91cCA9IG1lbV9jb250LAogCQkuaXNvbGF0ZV9wYWdlcyA9IG1lbV9jZ3JvdXBfaXNvbGF0ZV9wYWdlcywKIAl9OwogCXN0cnVjdCB6b25lbGlzdCAqem9uZWxpc3Q7CiAKKwlpZiAobm9zd2FwKQorCQlzYy5tYXlfc3dhcCA9IDA7CisKIAlzYy5nZnBfbWFzayA9IChnZnBfbWFzayAmIEdGUF9SRUNMQUlNX01BU0spIHwKIAkJCShHRlBfSElHSFVTRVJfTU9WQUJMRSAmIH5HRlBfUkVDTEFJTV9NQVNLKTsKIAl6b25lbGlzdCA9IE5PREVfREFUQShudW1hX25vZGVfaWQoKSktPm5vZGVfem9uZWxpc3RzOwpAQCAtMTcxMiw3ICsxNzU5LDYgQEAKIAlpbnQgcHJpb3JpdHk7CiAJaW50IGk7CiAJdW5zaWduZWQgbG9uZyB0b3RhbF9zY2FubmVkOwotCXVuc2lnbmVkIGxvbmcgbnJfcmVjbGFpbWVkOwogCXN0cnVjdCByZWNsYWltX3N0YXRlICpyZWNsYWltX3N0YXRlID0gY3VycmVudC0+cmVjbGFpbV9zdGF0ZTsKIAlzdHJ1Y3Qgc2Nhbl9jb250cm9sIHNjID0gewogCQkuZ2ZwX21hc2sgPSBHRlBfS0VSTkVMLApAQCAtMTczMSw3ICsxNzc3LDcgQEAKIAogbG9vcF9hZ2FpbjoKIAl0b3RhbF9zY2FubmVkID0gMDsKLQlucl9yZWNsYWltZWQgPSAwOworCXNjLm5yX3JlY2xhaW1lZCA9IDA7CiAJc2MubWF5X3dyaXRlcGFnZSA9ICFsYXB0b3BfbW9kZTsKIAljb3VudF92bV9ldmVudChQQUdFT1VUUlVOKTsKIApAQCAtMTc2Niw3ICsxODEyLDcgQEAKIAkJCSAqIERvIHNvbWUgYmFja2dyb3VuZCBhZ2luZyBvZiB0aGUgYW5vbiBsaXN0LCB0byBnaXZlCiAJCQkgKiBwYWdlcyBhIGNoYW5jZSB0byBiZSByZWZlcmVuY2VkIGJlZm9yZSByZWNsYWltaW5nLgogCQkJICovCi0JCQlpZiAoaW5hY3RpdmVfYW5vbl9pc19sb3coem9uZSkpCisJCQlpZiAoaW5hY3RpdmVfYW5vbl9pc19sb3coem9uZSwgJnNjKSkKIAkJCQlzaHJpbmtfYWN0aXZlX2xpc3QoU1dBUF9DTFVTVEVSX01BWCwgem9uZSwKIAkJCQkJCQkmc2MsIHByaW9yaXR5LCAwKTsKIApAQCAtMTgxNywxMSArMTg2MywxMSBAQAogCQkJICovCiAJCQlpZiAoIXpvbmVfd2F0ZXJtYXJrX29rKHpvbmUsIG9yZGVyLCA4KnpvbmUtPnBhZ2VzX2hpZ2gsCiAJCQkJCQllbmRfem9uZSwgMCkpCi0JCQkJbnJfcmVjbGFpbWVkICs9IHNocmlua196b25lKHByaW9yaXR5LCB6b25lLCAmc2MpOworCQkJCXNocmlua196b25lKHByaW9yaXR5LCB6b25lLCAmc2MpOwogCQkJcmVjbGFpbV9zdGF0ZS0+cmVjbGFpbWVkX3NsYWIgPSAwOwogCQkJbnJfc2xhYiA9IHNocmlua19zbGFiKHNjLm5yX3NjYW5uZWQsIEdGUF9LRVJORUwsCiAJCQkJCQlscnVfcGFnZXMpOwotCQkJbnJfcmVjbGFpbWVkICs9IHJlY2xhaW1fc3RhdGUtPnJlY2xhaW1lZF9zbGFiOworCQkJc2MubnJfcmVjbGFpbWVkICs9IHJlY2xhaW1fc3RhdGUtPnJlY2xhaW1lZF9zbGFiOwogCQkJdG90YWxfc2Nhbm5lZCArPSBzYy5ucl9zY2FubmVkOwogCQkJaWYgKHpvbmVfaXNfYWxsX3VucmVjbGFpbWFibGUoem9uZSkpCiAJCQkJY29udGludWU7CkBAIC0xODM1LDcgKzE4ODEsNyBAQAogCQkJICogZXZlbiBpbiBsYXB0b3AgbW9kZQogCQkJICovCiAJCQlpZiAodG90YWxfc2Nhbm5lZCA+IFNXQVBfQ0xVU1RFUl9NQVggKiAyICYmCi0JCQkgICAgdG90YWxfc2Nhbm5lZCA+IG5yX3JlY2xhaW1lZCArIG5yX3JlY2xhaW1lZCAvIDIpCisJCQkgICAgdG90YWxfc2Nhbm5lZCA+IHNjLm5yX3JlY2xhaW1lZCArIHNjLm5yX3JlY2xhaW1lZCAvIDIpCiAJCQkJc2MubWF5X3dyaXRlcGFnZSA9IDE7CiAJCX0KIAkJaWYgKGFsbF96b25lc19vaykKQEAgLTE4NTMsNyArMTg5OSw3IEBACiAJCSAqIG1hdGNoZXMgdGhlIGRpcmVjdCByZWNsYWltIHBhdGggYmVoYXZpb3VyIGluIHRlcm1zIG9mIGltcGFjdAogCQkgKiBvbiB6b25lLT4qX3ByaW9yaXR5LgogCQkgKi8KLQkJaWYgKG5yX3JlY2xhaW1lZCA+PSBTV0FQX0NMVVNURVJfTUFYKQorCQlpZiAoc2MubnJfcmVjbGFpbWVkID49IFNXQVBfQ0xVU1RFUl9NQVgpCiAJCQlicmVhazsKIAl9CiBvdXQ6CkBAIC0xODcyLDEwICsxOTE4LDI3IEBACiAKIAkJdHJ5X3RvX2ZyZWV6ZSgpOwogCisJCS8qCisJCSAqIEZyYWdtZW50YXRpb24gbWF5IG1lYW4gdGhhdCB0aGUgc3lzdGVtIGNhbm5vdCBiZQorCQkgKiByZWJhbGFuY2VkIGZvciBoaWdoLW9yZGVyIGFsbG9jYXRpb25zIGluIGFsbCB6b25lcy4KKwkJICogQXQgdGhpcyBwb2ludCwgaWYgbnJfcmVjbGFpbWVkIDwgU1dBUF9DTFVTVEVSX01BWCwKKwkJICogaXQgbWVhbnMgdGhlIHpvbmVzIGhhdmUgYmVlbiBmdWxseSBzY2FubmVkIGFuZCBhcmUgc3RpbGwKKwkJICogbm90IGJhbGFuY2VkLiBGb3IgaGlnaC1vcmRlciBhbGxvY2F0aW9ucywgdGhlcmUgaXMKKwkJICogbGl0dGxlIHBvaW50IHRyeWluZyBhbGwgb3ZlciBhZ2FpbiBhcyBrc3dhcGQgbWF5CisJCSAqIGluZmluaXRlIGxvb3AuCisJCSAqCisJCSAqIEluc3RlYWQsIHJlY2hlY2sgYWxsIHdhdGVybWFya3MgYXQgb3JkZXItMCBhcyB0aGV5CisJCSAqIGFyZSB0aGUgbW9zdCBpbXBvcnRhbnQuIElmIHdhdGVybWFya3MgYXJlIG9rLCBrc3dhcGQgd2lsbCBnbworCQkgKiBiYWNrIHRvIHNsZWVwLiBIaWdoLW9yZGVyIHVzZXJzIGNhbiBzdGlsbCBwZXJmb3JtIGRpcmVjdAorCQkgKiByZWNsYWltIGlmIHRoZXkgd2lzaC4KKwkJICovCisJCWlmIChzYy5ucl9yZWNsYWltZWQgPCBTV0FQX0NMVVNURVJfTUFYKQorCQkJb3JkZXIgPSBzYy5vcmRlciA9IDA7CisKIAkJZ290byBsb29wX2FnYWluOwogCX0KIAotCXJldHVybiBucl9yZWNsYWltZWQ7CisJcmV0dXJuIHNjLm5yX3JlY2xhaW1lZDsKIH0KIAogLyoKQEAgLTIyMjcsNyArMjI5MCw2IEBACiAJc3RydWN0IHRhc2tfc3RydWN0ICpwID0gY3VycmVudDsKIAlzdHJ1Y3QgcmVjbGFpbV9zdGF0ZSByZWNsYWltX3N0YXRlOwogCWludCBwcmlvcml0eTsKLQl1bnNpZ25lZCBsb25nIG5yX3JlY2xhaW1lZCA9IDA7CiAJc3RydWN0IHNjYW5fY29udHJvbCBzYyA9IHsKIAkJLm1heV93cml0ZXBhZ2UgPSAhISh6b25lX3JlY2xhaW1fbW9kZSAmIFJFQ0xBSU1fV1JJVEUpLAogCQkubWF5X3N3YXAgPSAhISh6b25lX3JlY2xhaW1fbW9kZSAmIFJFQ0xBSU1fU1dBUCksCkBAIC0yMjYwLDkgKzIzMjIsOSBAQAogCQlwcmlvcml0eSA9IFpPTkVfUkVDTEFJTV9QUklPUklUWTsKIAkJZG8gewogCQkJbm90ZV96b25lX3NjYW5uaW5nX3ByaW9yaXR5KHpvbmUsIHByaW9yaXR5KTsKLQkJCW5yX3JlY2xhaW1lZCArPSBzaHJpbmtfem9uZShwcmlvcml0eSwgem9uZSwgJnNjKTsKKwkJCXNocmlua196b25lKHByaW9yaXR5LCB6b25lLCAmc2MpOwogCQkJcHJpb3JpdHktLTsKLQkJfSB3aGlsZSAocHJpb3JpdHkgPj0gMCAmJiBucl9yZWNsYWltZWQgPCBucl9wYWdlcyk7CisJCX0gd2hpbGUgKHByaW9yaXR5ID49IDAgJiYgc2MubnJfcmVjbGFpbWVkIDwgbnJfcGFnZXMpOwogCX0KIAogCXNsYWJfcmVjbGFpbWFibGUgPSB6b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfU0xBQl9SRUNMQUlNQUJMRSk7CkBAIC0yMjg2LDEzICsyMzQ4LDEzIEBACiAJCSAqIFVwZGF0ZSBucl9yZWNsYWltZWQgYnkgdGhlIG51bWJlciBvZiBzbGFiIHBhZ2VzIHdlCiAJCSAqIHJlY2xhaW1lZCBmcm9tIHRoaXMgem9uZS4KIAkJICovCi0JCW5yX3JlY2xhaW1lZCArPSBzbGFiX3JlY2xhaW1hYmxlIC0KKwkJc2MubnJfcmVjbGFpbWVkICs9IHNsYWJfcmVjbGFpbWFibGUgLQogCQkJem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX1NMQUJfUkVDTEFJTUFCTEUpOwogCX0KIAogCXAtPnJlY2xhaW1fc3RhdGUgPSBOVUxMOwogCWN1cnJlbnQtPmZsYWdzICY9IH4oUEZfTUVNQUxMT0MgfCBQRl9TV0FQV1JJVEUpOwotCXJldHVybiBucl9yZWNsYWltZWQgPj0gbnJfcGFnZXM7CisJcmV0dXJuIHNjLm5yX3JlY2xhaW1lZCA+PSBucl9wYWdlczsKIH0KIAogaW50IHpvbmVfcmVjbGFpbShzdHJ1Y3Qgem9uZSAqem9uZSwgZ2ZwX3QgZ2ZwX21hc2ssIHVuc2lnbmVkIGludCBvcmRlcikKQEAgLTIzOTMsNiArMjQ1NSw3IEBACiAKIAkJX19kZWNfem9uZV9zdGF0ZSh6b25lLCBOUl9VTkVWSUNUQUJMRSk7CiAJCWxpc3RfbW92ZSgmcGFnZS0+bHJ1LCAmem9uZS0+bHJ1W2xdLmxpc3QpOworCQltZW1fY2dyb3VwX21vdmVfbGlzdHMocGFnZSwgTFJVX1VORVZJQ1RBQkxFLCBsKTsKIAkJX19pbmNfem9uZV9zdGF0ZSh6b25lLCBOUl9JTkFDVElWRV9BTk9OICsgbCk7CiAJCV9fY291bnRfdm1fZXZlbnQoVU5FVklDVEFCTEVfUEdSRVNDVUVEKTsKIAl9IGVsc2UgewpAQCAtMjQwMSw2ICsyNDY0LDcgQEAKIAkJICovCiAJCVNldFBhZ2VVbmV2aWN0YWJsZShwYWdlKTsKIAkJbGlzdF9tb3ZlKCZwYWdlLT5scnUsICZ6b25lLT5scnVbTFJVX1VORVZJQ1RBQkxFXS5saXN0KTsKKwkJbWVtX2Nncm91cF9yb3RhdGVfbHJ1X2xpc3QocGFnZSwgTFJVX1VORVZJQ1RBQkxFKTsKIAkJaWYgKHBhZ2VfZXZpY3RhYmxlKHBhZ2UsIE5VTEwpKQogCQkJZ290byByZXRyeTsKIAl9CkBAIC0yNDcyLDcgKzI1MzYsNyBAQAogICogYmFjayBvbnRvIEB6b25lJ3MgdW5ldmljdGFibGUgbGlzdC4KICAqLwogI2RlZmluZSBTQ0FOX1VORVZJQ1RBQkxFX0JBVENIX1NJWkUgMTZVTCAvKiBhcmJpdHJhcnkgbG9jayBob2xkIGJhdGNoIHNpemUgKi8KLXZvaWQgc2Nhbl96b25lX3VuZXZpY3RhYmxlX3BhZ2VzKHN0cnVjdCB6b25lICp6b25lKQorc3RhdGljIHZvaWQgc2Nhbl96b25lX3VuZXZpY3RhYmxlX3BhZ2VzKHN0cnVjdCB6b25lICp6b25lKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKmxfdW5ldmljdGFibGUgPSAmem9uZS0+bHJ1W0xSVV9VTkVWSUNUQUJMRV0ubGlzdDsKIAl1bnNpZ25lZCBsb25nIHNjYW47CkBAIC0yNTE0LDcgKzI1NzgsNyBAQAogICogdGhhdCBoYXMgcG9zc2libHkvcHJvYmFibHkgbWFkZSBzb21lIHByZXZpb3VzbHkgdW5ldmljdGFibGUgcGFnZXMKICAqIGV2aWN0YWJsZS4KICAqLwotdm9pZCBzY2FuX2FsbF96b25lc191bmV2aWN0YWJsZV9wYWdlcyh2b2lkKQorc3RhdGljIHZvaWQgc2Nhbl9hbGxfem9uZXNfdW5ldmljdGFibGVfcGFnZXModm9pZCkKIHsKIAlzdHJ1Y3Qgem9uZSAqem9uZTsKIApkaWZmIC0tZ2l0IGEvbmV0LzgwMjFxL3ZsYW5fY29yZS5jIGIvbmV0LzgwMjFxL3ZsYW5fY29yZS5jCmluZGV4IGRkODZhMWQuLjZjMTMyMzkgMTAwNjQ0Ci0tLSBhL25ldC84MDIxcS92bGFuX2NvcmUuYworKysgYi9uZXQvODAyMXEvdmxhbl9jb3JlLmMKQEAgLTMsNDYgKzMsMzUgQEAKICNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CiAjaW5jbHVkZSAidmxhbi5oIgogCi1zdHJ1Y3Qgdmxhbl9od2FjY2VsX2NiIHsKLQlzdHJ1Y3QgbmV0X2RldmljZQkqZGV2OwotfTsKLQotc3RhdGljIGlubGluZSBzdHJ1Y3Qgdmxhbl9od2FjY2VsX2NiICp2bGFuX2h3YWNjZWxfY2Ioc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlyZXR1cm4gKHN0cnVjdCB2bGFuX2h3YWNjZWxfY2IgKilza2ItPmNiOwotfQotCiAvKiBWTEFOIHJ4IGh3IGFjY2VsZXJhdGlvbiBoZWxwZXIuICBUaGlzIGFjdHMgbGlrZSBuZXRpZl97cngscmVjZWl2ZV9za2J9KCkuICovCiBpbnQgX192bGFuX2h3YWNjZWxfcngoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCwKIAkJICAgICAgdTE2IHZsYW5fdGNpLCBpbnQgcG9sbGluZykKIHsKLQlzdHJ1Y3Qgdmxhbl9od2FjY2VsX2NiICpjYiA9IHZsYW5faHdhY2NlbF9jYihza2IpOwotCi0JaWYgKHNrYl9ib25kX3Nob3VsZF9kcm9wKHNrYikpIHsKLQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCX0KKwlpZiAoc2tiX2JvbmRfc2hvdWxkX2Ryb3Aoc2tiKSkKKwkJZ290byBkcm9wOwogCiAJc2tiLT52bGFuX3RjaSA9IHZsYW5fdGNpOwotCWNiLT5kZXYgPSB2bGFuX2dyb3VwX2dldF9kZXZpY2UoZ3JwLCB2bGFuX3RjaSAmIFZMQU5fVklEX01BU0spOworCXNrYi0+ZGV2ID0gdmxhbl9ncm91cF9nZXRfZGV2aWNlKGdycCwgdmxhbl90Y2kgJiBWTEFOX1ZJRF9NQVNLKTsKKworCWlmICghc2tiLT5kZXYpCisJCWdvdG8gZHJvcDsKIAogCXJldHVybiAocG9sbGluZyA/IG5ldGlmX3JlY2VpdmVfc2tiKHNrYikgOiBuZXRpZl9yeChza2IpKTsKKworZHJvcDoKKwlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCXJldHVybiBORVRfUlhfRFJPUDsKIH0KIEVYUE9SVF9TWU1CT0woX192bGFuX2h3YWNjZWxfcngpOwogCiBpbnQgdmxhbl9od2FjY2VsX2RvX3JlY2VpdmUoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3Qgdmxhbl9od2FjY2VsX2NiICpjYiA9IHZsYW5faHdhY2NlbF9jYihza2IpOwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBjYi0+ZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBza2ItPmRldjsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHM7CiAKKwlza2ItPmRldiA9IHZsYW5fZGV2X2luZm8oZGV2KS0+cmVhbF9kZXY7CiAJbmV0aWZfbml0X2RlbGl2ZXIoc2tiKTsKIAotCWlmIChkZXYgPT0gTlVMTCkgewotCQlrZnJlZV9za2Ioc2tiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQogCXNrYi0+ZGV2ID0gZGV2OwogCXNrYi0+cHJpb3JpdHkgPSB2bGFuX2dldF9pbmdyZXNzX3ByaW9yaXR5KGRldiwgc2tiLT52bGFuX3RjaSk7CiAJc2tiLT52bGFuX3RjaSA9IDA7CkBAIC04MCwzICs2OSw3OSBAQAogCXJldHVybiB2bGFuX2Rldl9pbmZvKGRldiktPnZsYW5faWQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh2bGFuX2Rldl92bGFuX2lkKTsKKworc3RhdGljIGludCB2bGFuX2dyb19jb21tb24oc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwLAorCQkJICAgdW5zaWduZWQgaW50IHZsYW5fdGNpLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBza19idWZmICpwOworCisJaWYgKHNrYl9ib25kX3Nob3VsZF9kcm9wKHNrYikpCisJCWdvdG8gZHJvcDsKKworCXNrYi0+dmxhbl90Y2kgPSB2bGFuX3RjaTsKKwlza2ItPmRldiA9IHZsYW5fZ3JvdXBfZ2V0X2RldmljZShncnAsIHZsYW5fdGNpICYgVkxBTl9WSURfTUFTSyk7CisKKwlpZiAoIXNrYi0+ZGV2KQorCQlnb3RvIGRyb3A7CisKKwlmb3IgKHAgPSBuYXBpLT5ncm9fbGlzdDsgcDsgcCA9IHAtPm5leHQpIHsKKwkJTkFQSV9HUk9fQ0IocCktPnNhbWVfZmxvdyA9IHAtPmRldiA9PSBza2ItPmRldjsKKwkJTkFQSV9HUk9fQ0IocCktPmZsdXNoID0gMDsKKwl9CisKKwlyZXR1cm4gZGV2X2dyb19yZWNlaXZlKG5hcGksIHNrYik7CisKK2Ryb3A6CisJcmV0dXJuIDI7Cit9CisKK2ludCB2bGFuX2dyb19yZWNlaXZlKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCwKKwkJICAgICB1bnNpZ25lZCBpbnQgdmxhbl90Y2ksIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IGVyciA9IE5FVF9SWF9TVUNDRVNTOworCisJc3dpdGNoICh2bGFuX2dyb19jb21tb24obmFwaSwgZ3JwLCB2bGFuX3RjaSwgc2tiKSkgeworCWNhc2UgLTE6CisJCXJldHVybiBuZXRpZl9yZWNlaXZlX3NrYihza2IpOworCisJY2FzZSAyOgorCQllcnIgPSBORVRfUlhfRFJPUDsKKwkJLyogZmFsbCB0aHJvdWdoICovCisKKwljYXNlIDE6CisJCWtmcmVlX3NrYihza2IpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTCh2bGFuX2dyb19yZWNlaXZlKTsKKworaW50IHZsYW5fZ3JvX2ZyYWdzKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCwKKwkJICAgdW5zaWduZWQgaW50IHZsYW5fdGNpLCBzdHJ1Y3QgbmFwaV9ncm9fZnJhZ2luZm8gKmluZm8pCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IG5hcGlfZnJhZ2luZm9fc2tiKG5hcGksIGluZm8pOworCWludCBlcnIgPSBORVRfUlhfRFJPUDsKKworCWlmICghc2tiKQorCQlnb3RvIG91dDsKKworCWVyciA9IE5FVF9SWF9TVUNDRVNTOworCisJc3dpdGNoICh2bGFuX2dyb19jb21tb24obmFwaSwgZ3JwLCB2bGFuX3RjaSwgc2tiKSkgeworCWNhc2UgLTE6CisJCXJldHVybiBuZXRpZl9yZWNlaXZlX3NrYihza2IpOworCisJY2FzZSAyOgorCQllcnIgPSBORVRfUlhfRFJPUDsKKwkJLyogZmFsbCB0aHJvdWdoICovCisKKwljYXNlIDE6CisJCW5hcGlfcmV1c2Vfc2tiKG5hcGksIHNrYik7CisJCWJyZWFrOworCX0KKworb3V0OgorCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKHZsYW5fZ3JvX2ZyYWdzKTsKZGlmZiAtLWdpdCBhL25ldC84MDIxcS92bGFuX2Rldi5jIGIvbmV0LzgwMjFxL3ZsYW5fZGV2LmMKaW5kZXggODlhM2JiZC4uNGExOWFjZCAxMDA2NDQKLS0tIGEvbmV0LzgwMjFxL3ZsYW5fZGV2LmMKKysrIGIvbmV0LzgwMjFxL3ZsYW5fZGV2LmMKQEAgLTU0Niw2ICs1NDYsMTggQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgaW50IHZsYW5fZGV2X25laWdoX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBuZWlnaF9wYXJtcyAqcGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKnJlYWxfZGV2ID0gdmxhbl9kZXZfaW5mbyhkZXYpLT5yZWFsX2RldjsKKwljb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgKm9wcyA9IHJlYWxfZGV2LT5uZXRkZXZfb3BzOworCWludCBlcnIgPSAwOworCisJaWYgKG5ldGlmX2RldmljZV9wcmVzZW50KHJlYWxfZGV2KSAmJiBvcHMtPm5kb19uZWlnaF9zZXR1cCkKKwkJZXJyID0gb3BzLT5uZG9fbmVpZ2hfc2V0dXAoZGV2LCBwYSk7CisKKwlyZXR1cm4gZXJyOworfQorCiBzdGF0aWMgdm9pZCB2bGFuX2Rldl9jaGFuZ2VfcnhfZmxhZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNoYW5nZSkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYgPSB2bGFuX2Rldl9pbmZvKGRldiktPnJlYWxfZGV2OwpAQCAtNzEzLDYgKzcyNSw3IEBACiAJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QJPSB2bGFuX2Rldl9zZXRfcnhfbW9kZSwKIAkubmRvX2NoYW5nZV9yeF9mbGFncwk9IHZsYW5fZGV2X2NoYW5nZV9yeF9mbGFncywKIAkubmRvX2RvX2lvY3RsCQk9IHZsYW5fZGV2X2lvY3RsLAorCS5uZG9fbmVpZ2hfc2V0dXAJPSB2bGFuX2Rldl9uZWlnaF9zZXR1cCwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgdmxhbl9uZXRkZXZfYWNjZWxfb3BzID0gewpAQCAtNzI4LDYgKzc0MSw3IEBACiAJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QJPSB2bGFuX2Rldl9zZXRfcnhfbW9kZSwKIAkubmRvX2NoYW5nZV9yeF9mbGFncwk9IHZsYW5fZGV2X2NoYW5nZV9yeF9mbGFncywKIAkubmRvX2RvX2lvY3RsCQk9IHZsYW5fZGV2X2lvY3RsLAorCS5uZG9fbmVpZ2hfc2V0dXAJPSB2bGFuX2Rldl9uZWlnaF9zZXR1cCwKIH07CiAKIHZvaWQgdmxhbl9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvbmV0L0tjb25maWcgYi9uZXQvS2NvbmZpZwppbmRleCA2ZWMyY2NlLi5iZjI3NzYwIDEwMDY0NAotLS0gYS9uZXQvS2NvbmZpZworKysgYi9uZXQvS2NvbmZpZwpAQCAtMjU0LDYgKzI1NCw4IEBACiAKIGVuZGlmICMgV0lSRUxFU1MKIAorc291cmNlICJuZXQvd2ltYXgvS2NvbmZpZyIKKwogc291cmNlICJuZXQvcmZraWxsL0tjb25maWciCiBzb3VyY2UgIm5ldC85cC9LY29uZmlnIgogCmRpZmYgLS1naXQgYS9uZXQvTWFrZWZpbGUgYi9uZXQvTWFrZWZpbGUKaW5kZXggYmE0NDYwNC4uMGZjY2U4OSAxMDA2NDQKLS0tIGEvbmV0L01ha2VmaWxlCisrKyBiL25ldC9NYWtlZmlsZQpAQCAtNjMsMyArNjMsNCBAQAogaWZlcSAoJChDT05GSUdfTkVUKSx5KQogb2JqLSQoQ09ORklHX1NZU0NUTCkJCSs9IHN5c2N0bF9uZXQubwogZW5kaWYKK29iai0kKENPTkZJR19XSU1BWCkJCSs9IHdpbWF4LwpkaWZmIC0tZ2l0IGEvbmV0L2FwcGxldGFsay9hYXJwLmMgYi9uZXQvYXBwbGV0YWxrL2FhcnAuYwppbmRleCBiMDNmZjU4Li44OWY5OWQzIDEwMDY0NAotLS0gYS9uZXQvYXBwbGV0YWxrL2FhcnAuYworKysgYi9uZXQvYXBwbGV0YWxrL2FhcnAuYwpAQCAtNDQzLDEzICs0NDMsMTQgQEAKIHsKIAlzdHJ1Y3QgaWZyZXEgYXRyZXE7CiAJc3RydWN0IHNvY2thZGRyX2F0ICpzYSA9IChzdHJ1Y3Qgc29ja2FkZHJfYXQgKikmYXRyZXEuaWZyX2FkZHI7CisJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzICpvcHMgPSBpZmFjZS0+ZGV2LT5uZXRkZXZfb3BzOwogCiAJc2EtPnNhdF9hZGRyLnNfbm9kZSA9IGlmYWNlLT5hZGRyZXNzLnNfbm9kZTsKIAlzYS0+c2F0X2FkZHIuc19uZXQgPSBudG9ocyhpZmFjZS0+YWRkcmVzcy5zX25ldCk7CiAKIAkvKiBXZSBwYXNzIHRoZSBOZXQ6Tm9kZSB0byB0aGUgZHJpdmVycy9jYXJkcyBieSBhIERldmljZSBpb2N0bC4gKi8KLQlpZiAoIShpZmFjZS0+ZGV2LT5kb19pb2N0bChpZmFjZS0+ZGV2LCAmYXRyZXEsIFNJT0NTSUZBRERSKSkpIHsKLQkJKHZvaWQpaWZhY2UtPmRldi0+ZG9faW9jdGwoaWZhY2UtPmRldiwgJmF0cmVxLCBTSU9DR0lGQUREUik7CisJaWYgKCEob3BzLT5uZG9fZG9faW9jdGwoaWZhY2UtPmRldiwgJmF0cmVxLCBTSU9DU0lGQUREUikpKSB7CisJCW9wcy0+bmRvX2RvX2lvY3RsKGlmYWNlLT5kZXYsICZhdHJlcSwgU0lPQ0dJRkFERFIpOwogCQlpZiAoaWZhY2UtPmFkZHJlc3Muc19uZXQgIT0gaHRvbnMoc2EtPnNhdF9hZGRyLnNfbmV0KSB8fAogCQkgICAgaWZhY2UtPmFkZHJlc3Muc19ub2RlICE9IHNhLT5zYXRfYWRkci5zX25vZGUpCiAJCQlpZmFjZS0+c3RhdHVzIHw9IEFUSUZfUFJPQkVfRkFJTDsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvYm5lcC9ibmVwLmggYi9uZXQvYmx1ZXRvb3RoL2JuZXAvYm5lcC5oCmluZGV4IGQyMGY4YTQuLjBkOWU1MDYgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvYm5lcC9ibmVwLmgKKysrIGIvbmV0L2JsdWV0b290aC9ibmVwL2JuZXAuaApAQCAtMTY1LDcgKzE2NSw2IEBACiAKIAlzdHJ1Y3Qgc29ja2V0ICAgICpzb2NrOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CiB9OwogCiB2b2lkIGJuZXBfbmV0X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9ibmVwL2NvcmUuYyBiL25ldC9ibHVldG9vdGgvYm5lcC9jb3JlLmMKaW5kZXggNzBmZWE4Yi4uNTJhNmNlMCAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9ibmVwL2NvcmUuYworKysgYi9uZXQvYmx1ZXRvb3RoL2JuZXAvY29yZS5jCkBAIC0zMDYsNyArMzA2LDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYjsKIAl1OCB0eXBlOwogCi0Jcy0+c3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKIAogCXR5cGUgPSAqKHU4ICopIHNrYi0+ZGF0YTsgc2tiX3B1bGwoc2tiLCAxKTsKIApAQCAtMzQzLDcgKzM0Myw3IEBACiAJICogbWF5IG5vdCBiZSBtb2RpZmllZCBhbmQgYmVjYXVzZSBvZiB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50cy4gKi8KIAluc2tiID0gYWxsb2Nfc2tiKDIgKyBFVEhfSExFTiArIHNrYi0+bGVuLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW5za2IpIHsKLQkJcy0+c3RhdHMucnhfZHJvcHBlZCsrOworCQlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTM3OCwxNCArMzc4LDE0IEBACiAJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIF9fc2tiX3B1dChuc2tiLCBza2ItPmxlbiksIHNrYi0+bGVuKTsKIAlrZnJlZV9za2Ioc2tiKTsKIAotCXMtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKIAluc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwogCW5za2ItPnByb3RvY29sICA9IGV0aF90eXBlX3RyYW5zKG5za2IsIGRldik7CiAJbmV0aWZfcnhfbmkobnNrYik7CiAJcmV0dXJuIDA7CiAKIGJhZGZyYW1lOgotCXMtPnN0YXRzLnJ4X2Vycm9ycysrOworCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CiAJa2ZyZWVfc2tiKHNrYik7CiAJcmV0dXJuIDA7CiB9CkBAIC00NDgsOCArNDQ4LDggQEAKIAlrZnJlZV9za2Ioc2tiKTsKIAogCWlmIChsZW4gPiAwKSB7Ci0JCXMtPnN0YXRzLnR4X2J5dGVzICs9IGxlbjsKLQkJcy0+c3RhdHMudHhfcGFja2V0cysrOworCQlzLT5kZXYtPnN0YXRzLnR4X2J5dGVzICs9IGxlbjsKKwkJcy0+ZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CiAJCXJldHVybiAwOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9ibmVwL25ldGRldi5jIGIvbmV0L2JsdWV0b290aC9ibmVwL25ldGRldi5jCmluZGV4IGY4OTdkYTYuLmQ3YTBlOTcgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvYm5lcC9uZXRkZXYuYworKysgYi9uZXQvYmx1ZXRvb3RoL2JuZXAvbmV0ZGV2LmMKQEAgLTU1LDEyICs1NSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYm5lcF9uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGJuZXBfc2Vzc2lvbiAqcyA9IG5ldGRldl9wcml2KGRldik7Ci0JcmV0dXJuICZzLT5zdGF0czsKLX0KLQogc3RhdGljIHZvaWQgYm5lcF9uZXRfc2V0X21jX2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKICNpZmRlZiBDT05GSUdfQlRfQk5FUF9NQ19GSUxURVIKQEAgLTEyOCwxMSArMTIyLDYgQEAKIAluZXRpZl93YWtlX3F1ZXVlKGRldik7CiB9CiAKLXN0YXRpYyBpbnQgYm5lcF9uZXRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCi17Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KICNpZmRlZiBDT05GSUdfQlRfQk5FUF9NQ19GSUxURVIKIHN0YXRpYyBpbmxpbmUgaW50IGJuZXBfbmV0X21jX2ZpbHRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgYm5lcF9zZXNzaW9uICpzKQogewpAQCAtMjE3LDYgKzIwNiwxOCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGJuZXBfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4gICAgICAgICAgICA9IGJuZXBfbmV0X29wZW4sCisJLm5kb19zdG9wICAgICAgICAgICAgPSBibmVwX25ldF9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJICAgICA9IGJuZXBfbmV0X3htaXQsCisJLm5kb192YWxpZGF0ZV9hZGRyICAgPSBldGhfdmFsaWRhdGVfYWRkciwKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IGJuZXBfbmV0X3NldF9tY19saXN0LAorCS5uZG9fc2V0X21hY19hZGRyZXNzID0gYm5lcF9uZXRfc2V0X21hY19hZGRyLAorCS5uZG9fdHhfdGltZW91dCAgICAgID0gYm5lcF9uZXRfdGltZW91dCwKKwkubmRvX2NoYW5nZV9tdHUJICAgICA9IGV0aF9jaGFuZ2VfbXR1LAorCit9OworCiB2b2lkIGJuZXBfbmV0X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAKQEAgLTIyNCwxNSArMjI1LDcgQEAKIAlkZXYtPmFkZHJfbGVuID0gRVRIX0FMRU47CiAKIAlldGhlcl9zZXR1cChkZXYpOwotCi0JZGV2LT5vcGVuICAgICAgICAgICAgPSBibmVwX25ldF9vcGVuOwotCWRldi0+c3RvcCAgICAgICAgICAgID0gYm5lcF9uZXRfY2xvc2U7Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBibmVwX25ldF94bWl0OwotCWRldi0+Z2V0X3N0YXRzICAgICAgID0gYm5lcF9uZXRfZ2V0X3N0YXRzOwotCWRldi0+ZG9faW9jdGwgICAgICAgID0gYm5lcF9uZXRfaW9jdGw7Ci0JZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBibmVwX25ldF9zZXRfbWFjX2FkZHI7Ci0JZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBibmVwX25ldF9zZXRfbWNfbGlzdDsKKwlkZXYtPm5ldGRldl9vcHMgPSAmYm5lcF9uZXRkZXZfb3BzOwogCiAJZGV2LT53YXRjaGRvZ190aW1lbyAgPSBIWiAqIDI7Ci0JZGV2LT50eF90aW1lb3V0ICAgICAgPSBibmVwX25ldF90aW1lb3V0OwogfQpkaWZmIC0tZ2l0IGEvbmV0L2Nhbi9hZl9jYW4uYyBiL25ldC9jYW4vYWZfY2FuLmMKaW5kZXggM2RhZGIzMy4uZmE0MTdjYSAxMDA2NDQKLS0tIGEvbmV0L2Nhbi9hZl9jYW4uYworKysgYi9uZXQvY2FuL2FmX2Nhbi5jCkBAIC00MTQsNiArNDE0LDEyIEBACiAgKiAgVGhlIGZpbHRlciBjYW4gYmUgaW52ZXJ0ZWQgKENBTl9JTlZfRklMVEVSIGJpdCBzZXQgaW4gY2FuX2lkKSBvciBpdCBjYW4KICAqICBmaWx0ZXIgZm9yIGVycm9yIGZyYW1lcyAoQ0FOX0VSUl9GTEFHIGJpdCBzZXQgaW4gbWFzaykuCiAgKgorICogIFRoZSBwcm92aWRlZCBwb2ludGVyIHRvIHRoZSBza19idWZmIGlzIGd1YXJhbnRlZWQgdG8gYmUgdmFsaWQgYXMgbG9uZyBhcworICogIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBpcyBydW5uaW5nLiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gbXVzdCAqbm90KiBmcmVlCisgKiAgdGhlIGdpdmVuIHNrX2J1ZmYgd2hpbGUgcHJvY2Vzc2luZyBpdCdzIHRhc2suIFdoZW4gdGhlIGdpdmVuIHNrX2J1ZmYgaXMKKyAqICBuZWVkZWQgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gaXQgbXVzdCBiZSBjbG9uZWQgaW5zaWRlCisgKiAgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGggc2tiX2Nsb25lKCkuCisgKgogICogUmV0dXJuOgogICogIDAgb24gc3VjY2VzcwogICogIC1FTk9NRU0gb24gbWlzc2luZyBjYWNoZSBtZW0gdG8gY3JlYXRlIHN1YnNjcmlwdGlvbiBlbnRyeQpAQCAtNTY5LDEzICs1NzUsOCBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgZGVsaXZlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgcmVjZWl2ZXIgKnIpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKmNsb25lID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7Ci0KLQlpZiAoY2xvbmUpIHsKLQkJY2xvbmUtPnNrID0gc2tiLT5zazsKLQkJci0+ZnVuYyhjbG9uZSwgci0+ZGF0YSk7Ci0JCXItPm1hdGNoZXMrKzsKLQl9CisJci0+ZnVuYyhza2IsIHItPmRhdGEpOworCXItPm1hdGNoZXMrKzsKIH0KIAogc3RhdGljIGludCBjYW5fcmN2X2ZpbHRlcihzdHJ1Y3QgZGV2X3Jjdl9saXN0cyAqZCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKZGlmZiAtLWdpdCBhL25ldC9jYW4vYmNtLmMgYi9uZXQvY2FuL2JjbS5jCmluZGV4IGRhMGQ0MjYuLjE2NDljOGEgMTAwNjQ0Ci0tLSBhL25ldC9jYW4vYmNtLmMKKysrIGIvbmV0L2Nhbi9iY20uYwpAQCAtNzAsNyArNzAsNyBAQAogCiAjZGVmaW5lIENBTl9CQ01fVkVSU0lPTiBDQU5fVkVSU0lPTgogc3RhdGljIF9faW5pdGRhdGEgY29uc3QgY2hhciBiYW5uZXJbXSA9IEtFUk5fSU5GTwotCSJjYW46IGJyb2FkY2FzdCBtYW5hZ2VyIHByb3RvY29sIChyZXYgIiBDQU5fQkNNX1ZFUlNJT04gIilcbiI7CisJImNhbjogYnJvYWRjYXN0IG1hbmFnZXIgcHJvdG9jb2wgKHJldiAiIENBTl9CQ01fVkVSU0lPTiAiIHQpXG4iOwogCiBNT0RVTEVfREVTQ1JJUFRJT04oIlBGX0NBTiBicm9hZGNhc3QgbWFuYWdlciBwcm90b2NvbCIpOwogTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwpAQCAtOTAsNiArOTAsNyBAQAogCXVuc2lnbmVkIGxvbmcgZnJhbWVzX2FicywgZnJhbWVzX2ZpbHRlcmVkOwogCXN0cnVjdCB0aW1ldmFsIGl2YWwxLCBpdmFsMjsKIAlzdHJ1Y3QgaHJ0aW1lciB0aW1lciwgdGhydGltZXI7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IHRza2xldCwgdGhydHNrbGV0OwogCWt0aW1lX3Qgcnhfc3RhbXAsIGt0X2l2YWwxLCBrdF9pdmFsMiwga3RfbGFzdG1zZzsKIAlpbnQgcnhfaWZpbmRleDsKIAlpbnQgY291bnQ7CkBAIC0zNDEsNiArMzQyLDIzIEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBiY21fdHhfdGltZW91dF90c2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBiY21fb3AgKm9wID0gKHN0cnVjdCBiY21fb3AgKilkYXRhOworCXN0cnVjdCBiY21fbXNnX2hlYWQgbXNnX2hlYWQ7CisKKwkvKiBjcmVhdGUgbm90aWZpY2F0aW9uIHRvIHVzZXIgKi8KKwltc2dfaGVhZC5vcGNvZGUgID0gVFhfRVhQSVJFRDsKKwltc2dfaGVhZC5mbGFncyAgID0gb3AtPmZsYWdzOworCW1zZ19oZWFkLmNvdW50ICAgPSBvcC0+Y291bnQ7CisJbXNnX2hlYWQuaXZhbDEgICA9IG9wLT5pdmFsMTsKKwltc2dfaGVhZC5pdmFsMiAgID0gb3AtPml2YWwyOworCW1zZ19oZWFkLmNhbl9pZCAgPSBvcC0+Y2FuX2lkOworCW1zZ19oZWFkLm5mcmFtZXMgPSAwOworCisJYmNtX3NlbmRfdG9fdXNlcihvcCwgJm1zZ19oZWFkLCBOVUxMLCAwKTsKK30KKwogLyoKICAqIGJjbV90eF90aW1lb3V0X2hhbmRsZXIgLSBwZXJmb3JtZXMgY3ljbGljIENBTiBmcmFtZSB0cmFuc21pc3Npb25zCiAgKi8KQEAgLTM1MiwyMCArMzcwLDggQEAKIAlpZiAob3AtPmt0X2l2YWwxLnR2NjQgJiYgKG9wLT5jb3VudCA+IDApKSB7CiAKIAkJb3AtPmNvdW50LS07Ci0JCWlmICghb3AtPmNvdW50ICYmIChvcC0+ZmxhZ3MgJiBUWF9DT1VOVEVWVCkpIHsKLQkJCXN0cnVjdCBiY21fbXNnX2hlYWQgbXNnX2hlYWQ7Ci0KLQkJCS8qIGNyZWF0ZSBub3RpZmljYXRpb24gdG8gdXNlciAqLwotCQkJbXNnX2hlYWQub3Bjb2RlICA9IFRYX0VYUElSRUQ7Ci0JCQltc2dfaGVhZC5mbGFncyAgID0gb3AtPmZsYWdzOwotCQkJbXNnX2hlYWQuY291bnQgICA9IG9wLT5jb3VudDsKLQkJCW1zZ19oZWFkLml2YWwxICAgPSBvcC0+aXZhbDE7Ci0JCQltc2dfaGVhZC5pdmFsMiAgID0gb3AtPml2YWwyOwotCQkJbXNnX2hlYWQuY2FuX2lkICA9IG9wLT5jYW5faWQ7Ci0JCQltc2dfaGVhZC5uZnJhbWVzID0gMDsKLQotCQkJYmNtX3NlbmRfdG9fdXNlcihvcCwgJm1zZ19oZWFkLCBOVUxMLCAwKTsKLQkJfQorCQlpZiAoIW9wLT5jb3VudCAmJiAob3AtPmZsYWdzICYgVFhfQ09VTlRFVlQpKQorCQkJdGFza2xldF9zY2hlZHVsZSgmb3AtPnRza2xldCk7CiAJfQogCiAJaWYgKG9wLT5rdF9pdmFsMS50djY0ICYmIChvcC0+Y291bnQgPiAwKSkgewpAQCAtNDAyLDYgKzQwOCw5IEBACiAJaWYgKG9wLT5mcmFtZXNfZmlsdGVyZWQgPiBVTE9OR19NQVgvMTAwKQogCQlvcC0+ZnJhbWVzX2ZpbHRlcmVkID0gb3AtPmZyYW1lc19hYnMgPSAwOwogCisJLyogdGhpcyBlbGVtZW50IGlzIG5vdCB0aHJvdHRsZWQgYW55bW9yZSAqLworCWRhdGEtPmNhbl9kbGMgJj0gKEJDTV9DQU5fRExDX01BU0t8UlhfUkVDVik7CisKIAloZWFkLm9wY29kZSAgPSBSWF9DSEFOR0VEOwogCWhlYWQuZmxhZ3MgICA9IG9wLT5mbGFnczsKIAloZWFkLmNvdW50ICAgPSBvcC0+Y291bnQ7CkBAIC00MjAsMzcgKzQyOSwzMiBAQAogICovCiBzdGF0aWMgdm9pZCBiY21fcnhfdXBkYXRlX2FuZF9zZW5kKHN0cnVjdCBiY21fb3AgKm9wLAogCQkJCSAgIHN0cnVjdCBjYW5fZnJhbWUgKmxhc3RkYXRhLAotCQkJCSAgIHN0cnVjdCBjYW5fZnJhbWUgKnJ4ZGF0YSkKKwkJCQkgICBjb25zdCBzdHJ1Y3QgY2FuX2ZyYW1lICpyeGRhdGEpCiB7CiAJbWVtY3B5KGxhc3RkYXRhLCByeGRhdGEsIENGU0laKTsKIAotCS8qIG1hcmsgYXMgdXNlZCAqLwotCWxhc3RkYXRhLT5jYW5fZGxjIHw9IFJYX1JFQ1Y7CisJLyogbWFyayBhcyB1c2VkIGFuZCB0aHJvdHRsZWQgYnkgZGVmYXVsdCAqLworCWxhc3RkYXRhLT5jYW5fZGxjIHw9IChSWF9SRUNWfFJYX1RIUik7CiAKLQkvKiB0aHJvdHRlbGluZyBtb2RlIGluYWN0aXZlIE9SIGRhdGEgdXBkYXRlIGFscmVhZHkgb24gdGhlIHJ1biA/ICovCi0JaWYgKCFvcC0+a3RfaXZhbDIudHY2NCB8fCBocnRpbWVyX2NhbGxiYWNrX3J1bm5pbmcoJm9wLT50aHJ0aW1lcikpIHsKKwkvKiB0aHJvdHRlbGluZyBtb2RlIGluYWN0aXZlID8gKi8KKwlpZiAoIW9wLT5rdF9pdmFsMi50djY0KSB7CiAJCS8qIHNlbmQgUlhfQ0hBTkdFRCB0byB0aGUgdXNlciBpbW1lZGlhdGVseSAqLwotCQliY21fcnhfY2hhbmdlZChvcCwgcnhkYXRhKTsKKwkJYmNtX3J4X2NoYW5nZWQob3AsIGxhc3RkYXRhKTsKIAkJcmV0dXJuOwogCX0KIAotCWlmIChocnRpbWVyX2FjdGl2ZSgmb3AtPnRocnRpbWVyKSkgewotCQkvKiBtYXJrIGFzICd0aHJvdHRsZWQnICovCi0JCWxhc3RkYXRhLT5jYW5fZGxjIHw9IFJYX1RIUjsKKwkvKiB3aXRoIGFjdGl2ZSB0aHJvdHRsaW5nIHRpbWVyIHdlIGFyZSBqdXN0IGRvbmUgaGVyZSAqLworCWlmIChocnRpbWVyX2FjdGl2ZSgmb3AtPnRocnRpbWVyKSkKIAkJcmV0dXJuOwotCX0KIAotCWlmICghb3AtPmt0X2xhc3Rtc2cudHY2NCkgewotCQkvKiBzZW5kIGZpcnN0IFJYX0NIQU5HRUQgdG8gdGhlIHVzZXIgaW1tZWRpYXRlbHkgKi8KLQkJYmNtX3J4X2NoYW5nZWQob3AsIHJ4ZGF0YSk7Ci0JCW9wLT5rdF9sYXN0bXNnID0ga3RpbWVfZ2V0KCk7Ci0JCXJldHVybjsKLQl9CisJLyogZmlyc3QgcmVjZWlwdGlvbiB3aXRoIGVuYWJsZWQgdGhyb3R0bGluZyBtb2RlICovCisJaWYgKCFvcC0+a3RfbGFzdG1zZy50djY0KQorCQlnb3RvIHJ4X2NoYW5nZWRfc2V0dGltZTsKIAorCS8qIGdvdCBhIHNlY29uZCBmcmFtZSBpbnNpZGUgYSBwb3RlbnRpYWwgdGhyb3R0bGUgcGVyaW9kPyAqLwogCWlmIChrdGltZV91c19kZWx0YShrdGltZV9nZXQoKSwgb3AtPmt0X2xhc3Rtc2cpIDwKIAkgICAga3RpbWVfdG9fdXMob3AtPmt0X2l2YWwyKSkgewotCQkvKiBtYXJrIGFzICd0aHJvdHRsZWQnIGFuZCBzdGFydCB0aW1lciAqLwotCQlsYXN0ZGF0YS0+Y2FuX2RsYyB8PSBSWF9USFI7CisJCS8qIGRvIG5vdCBzZW5kIHRoZSBzYXZlZCBkYXRhIC0gb25seSBzdGFydCB0aHJvdHRsZSB0aW1lciAqLwogCQlocnRpbWVyX3N0YXJ0KCZvcC0+dGhydGltZXIsCiAJCQkgICAgICBrdGltZV9hZGQob3AtPmt0X2xhc3Rtc2csIG9wLT5rdF9pdmFsMiksCiAJCQkgICAgICBIUlRJTUVSX01PREVfQUJTKTsKQEAgLTQ1OCw3ICs0NjIsOCBAQAogCX0KIAogCS8qIHRoZSBnYXAgd2FzIHRoYXQgYmlnLCB0aGF0IHRocm90dGxpbmcgd2FzIG5vdCBuZWVkZWQgaGVyZSAqLwotCWJjbV9yeF9jaGFuZ2VkKG9wLCByeGRhdGEpOworcnhfY2hhbmdlZF9zZXR0aW1lOgorCWJjbV9yeF9jaGFuZ2VkKG9wLCBsYXN0ZGF0YSk7CiAJb3AtPmt0X2xhc3Rtc2cgPSBrdGltZV9nZXQoKTsKIH0KIApAQCAtNDY3LDcgKzQ3Miw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWQgZGF0YSBzdG9yZWQgaW4gb3AtPmxhc3RfZnJhbWVzW10KICAqLwogc3RhdGljIHZvaWQgYmNtX3J4X2NtcF90b19pbmRleChzdHJ1Y3QgYmNtX29wICpvcCwgaW50IGluZGV4LAotCQkJCXN0cnVjdCBjYW5fZnJhbWUgKnJ4ZGF0YSkKKwkJCQljb25zdCBzdHJ1Y3QgY2FuX2ZyYW1lICpyeGRhdGEpCiB7CiAJLyoKIAkgKiBubyBvbmUgdXNlcyB0aGUgTVNCcyBvZiBjYW5fZGxjIGZvciBjb21wYXJhdGlvbiwKQEAgLTUxMSwxNCArNTE2LDEyIEBACiAJCWhydGltZXJfc3RhcnQoJm9wLT50aW1lciwgb3AtPmt0X2l2YWwxLCBIUlRJTUVSX01PREVfUkVMKTsKIH0KIAotLyoKLSAqIGJjbV9yeF90aW1lb3V0X2hhbmRsZXIgLSB3aGVuIHRoZSAoY3ljbGljKSBDQU4gZnJhbWUgcmVjZWlwdGlvbiB0aW1lZCBvdXQKLSAqLwotc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IGJjbV9yeF90aW1lb3V0X2hhbmRsZXIoc3RydWN0IGhydGltZXIgKmhydGltZXIpCitzdGF0aWMgdm9pZCBiY21fcnhfdGltZW91dF90c2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQogewotCXN0cnVjdCBiY21fb3AgKm9wID0gY29udGFpbmVyX29mKGhydGltZXIsIHN0cnVjdCBiY21fb3AsIHRpbWVyKTsKKwlzdHJ1Y3QgYmNtX29wICpvcCA9IChzdHJ1Y3QgYmNtX29wICopZGF0YTsKIAlzdHJ1Y3QgYmNtX21zZ19oZWFkIG1zZ19oZWFkOwogCisJLyogY3JlYXRlIG5vdGlmaWNhdGlvbiB0byB1c2VyICovCiAJbXNnX2hlYWQub3Bjb2RlICA9IFJYX1RJTUVPVVQ7CiAJbXNnX2hlYWQuZmxhZ3MgICA9IG9wLT5mbGFnczsKIAltc2dfaGVhZC5jb3VudCAgID0gb3AtPmNvdW50OwpAQCAtNTI4LDYgKzUzMSwxNyBAQAogCW1zZ19oZWFkLm5mcmFtZXMgPSAwOwogCiAJYmNtX3NlbmRfdG9fdXNlcihvcCwgJm1zZ19oZWFkLCBOVUxMLCAwKTsKK30KKworLyoKKyAqIGJjbV9yeF90aW1lb3V0X2hhbmRsZXIgLSB3aGVuIHRoZSAoY3ljbGljKSBDQU4gZnJhbWUgcmVjZWlwdGlvbiB0aW1lZCBvdXQKKyAqLworc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IGJjbV9yeF90aW1lb3V0X2hhbmRsZXIoc3RydWN0IGhydGltZXIgKmhydGltZXIpCit7CisJc3RydWN0IGJjbV9vcCAqb3AgPSBjb250YWluZXJfb2YoaHJ0aW1lciwgc3RydWN0IGJjbV9vcCwgdGltZXIpOworCisJLyogc2NoZWR1bGUgYmVmb3JlIE5FVF9SWF9TT0ZUSVJRICovCisJdGFza2xldF9oaV9zY2hlZHVsZSgmb3AtPnRza2xldCk7CiAKIAkvKiBubyByZXN0YXJ0IG9mIHRoZSB0aW1lciBpcyBkb25lIGhlcmUhICovCiAKQEAgLTU0MSw5ICs1NTUsMjUgQEAKIH0KIAogLyoKLSAqIGJjbV9yeF90aHJfZmx1c2ggLSBDaGVjayBmb3IgdGhyb3R0bGVkIGRhdGEgYW5kIHNlbmQgaXQgdG8gdGhlIHVzZXJzcGFjZQorICogYmNtX3J4X2RvX2ZsdXNoIC0gaGVscGVyIGZvciBiY21fcnhfdGhyX2ZsdXNoCiAgKi8KLXN0YXRpYyBpbnQgYmNtX3J4X3Rocl9mbHVzaChzdHJ1Y3QgYmNtX29wICpvcCkKK3N0YXRpYyBpbmxpbmUgaW50IGJjbV9yeF9kb19mbHVzaChzdHJ1Y3QgYmNtX29wICpvcCwgaW50IHVwZGF0ZSwgaW50IGluZGV4KQoreworCWlmICgob3AtPmxhc3RfZnJhbWVzKSAmJiAob3AtPmxhc3RfZnJhbWVzW2luZGV4XS5jYW5fZGxjICYgUlhfVEhSKSkgeworCQlpZiAodXBkYXRlKQorCQkJYmNtX3J4X2NoYW5nZWQob3AsICZvcC0+bGFzdF9mcmFtZXNbaW5kZXhdKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogYmNtX3J4X3Rocl9mbHVzaCAtIENoZWNrIGZvciB0aHJvdHRsZWQgZGF0YSBhbmQgc2VuZCBpdCB0byB0aGUgdXNlcnNwYWNlCisgKgorICogdXBkYXRlID09IDAgOiBqdXN0IGNoZWNrIGlmIHRocm90dGxlZCBkYXRhIGlzIGF2YWlsYWJsZSAgKGFueSBpcnEgY29udGV4dCkKKyAqIHVwZGF0ZSA9PSAxIDogY2hlY2sgYW5kIHNlbmQgdGhyb3R0bGVkIGRhdGEgdG8gdXNlcnNwYWNlIChzb2Z0X2lycSBjb250ZXh0KQorICovCitzdGF0aWMgaW50IGJjbV9yeF90aHJfZmx1c2goc3RydWN0IGJjbV9vcCAqb3AsIGludCB1cGRhdGUpCiB7CiAJaW50IHVwZGF0ZWQgPSAwOwogCkBAIC01NTEsMjcgKzU4MSwyNSBAQAogCQlpbnQgaTsKIAogCQkvKiBmb3IgTVVYIGZpbHRlciB3ZSBzdGFydCBhdCBpbmRleCAxICovCi0JCWZvciAoaSA9IDE7IGkgPCBvcC0+bmZyYW1lczsgaSsrKSB7Ci0JCQlpZiAoKG9wLT5sYXN0X2ZyYW1lcykgJiYKLQkJCSAgICAob3AtPmxhc3RfZnJhbWVzW2ldLmNhbl9kbGMgJiBSWF9USFIpKSB7Ci0JCQkJb3AtPmxhc3RfZnJhbWVzW2ldLmNhbl9kbGMgJj0gflJYX1RIUjsKLQkJCQliY21fcnhfY2hhbmdlZChvcCwgJm9wLT5sYXN0X2ZyYW1lc1tpXSk7Ci0JCQkJdXBkYXRlZCsrOwotCQkJfQotCQl9CisJCWZvciAoaSA9IDE7IGkgPCBvcC0+bmZyYW1lczsgaSsrKQorCQkJdXBkYXRlZCArPSBiY21fcnhfZG9fZmx1c2gob3AsIHVwZGF0ZSwgaSk7CiAKIAl9IGVsc2UgewogCQkvKiBmb3IgUlhfRklMVEVSX0lEIGFuZCBzaW1wbGUgZmlsdGVyICovCi0JCWlmIChvcC0+bGFzdF9mcmFtZXMgJiYgKG9wLT5sYXN0X2ZyYW1lc1swXS5jYW5fZGxjICYgUlhfVEhSKSkgewotCQkJb3AtPmxhc3RfZnJhbWVzWzBdLmNhbl9kbGMgJj0gflJYX1RIUjsKLQkJCWJjbV9yeF9jaGFuZ2VkKG9wLCAmb3AtPmxhc3RfZnJhbWVzWzBdKTsKLQkJCXVwZGF0ZWQrKzsKLQkJfQorCQl1cGRhdGVkICs9IGJjbV9yeF9kb19mbHVzaChvcCwgdXBkYXRlLCAwKTsKIAl9CiAKIAlyZXR1cm4gdXBkYXRlZDsKIH0KIAorc3RhdGljIHZvaWQgYmNtX3J4X3Rocl90c2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBiY21fb3AgKm9wID0gKHN0cnVjdCBiY21fb3AgKilkYXRhOworCisJLyogcHVzaCB0aGUgY2hhbmdlZCBkYXRhIHRvIHRoZSB1c2Vyc3BhY2UgKi8KKwliY21fcnhfdGhyX2ZsdXNoKG9wLCAxKTsKK30KKwogLyoKICAqIGJjbV9yeF90aHJfaGFuZGxlciAtIHRoZSB0aW1lIGZvciBibG9ja2VkIGNvbnRlbnQgdXBkYXRlcyBpcyBvdmVyIG5vdzoKICAqICAgICAgICAgICAgICAgICAgICAgIENoZWNrIGZvciB0aHJvdHRsZWQgZGF0YSBhbmQgc2VuZCBpdCB0byB0aGUgdXNlcnNwYWNlCkBAIC01ODAsNyArNjA4LDkgQEAKIHsKIAlzdHJ1Y3QgYmNtX29wICpvcCA9IGNvbnRhaW5lcl9vZihocnRpbWVyLCBzdHJ1Y3QgYmNtX29wLCB0aHJ0aW1lcik7CiAKLQlpZiAoYmNtX3J4X3Rocl9mbHVzaChvcCkpIHsKKwl0YXNrbGV0X3NjaGVkdWxlKCZvcC0+dGhydHNrbGV0KTsKKworCWlmIChiY21fcnhfdGhyX2ZsdXNoKG9wLCAwKSkgewogCQlocnRpbWVyX2ZvcndhcmQoaHJ0aW1lciwga3RpbWVfZ2V0KCksIG9wLT5rdF9pdmFsMik7CiAJCXJldHVybiBIUlRJTUVSX1JFU1RBUlQ7CiAJfSBlbHNlIHsKQEAgLTU5NiwyOSArNjI2LDIxIEBACiBzdGF0aWMgdm9pZCBiY21fcnhfaGFuZGxlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBiY21fb3AgKm9wID0gKHN0cnVjdCBiY21fb3AgKilkYXRhOwotCXN0cnVjdCBjYW5fZnJhbWUgcnhmcmFtZTsKKwljb25zdCBzdHJ1Y3QgY2FuX2ZyYW1lICpyeGZyYW1lID0gKHN0cnVjdCBjYW5fZnJhbWUgKilza2ItPmRhdGE7CiAJaW50IGk7CiAKIAkvKiBkaXNhYmxlIHRpbWVvdXQgKi8KIAlocnRpbWVyX2NhbmNlbCgmb3AtPnRpbWVyKTsKIAotCWlmIChza2ItPmxlbiA9PSBzaXplb2YocnhmcmFtZSkpIHsKLQkJbWVtY3B5KCZyeGZyYW1lLCBza2ItPmRhdGEsIHNpemVvZihyeGZyYW1lKSk7Ci0JCS8qIHNhdmUgcnggdGltZXN0YW1wICovCi0JCW9wLT5yeF9zdGFtcCA9IHNrYi0+dHN0YW1wOwotCQkvKiBzYXZlIG9yaWdpbmF0b3IgZm9yIHJlY3Zmcm9tKCkgKi8KLQkJb3AtPnJ4X2lmaW5kZXggPSBza2ItPmRldi0+aWZpbmRleDsKLQkJLyogdXBkYXRlIHN0YXRpc3RpY3MgKi8KLQkJb3AtPmZyYW1lc19hYnMrKzsKLQkJa2ZyZWVfc2tiKHNrYik7Ci0KLQl9IGVsc2UgewotCQlrZnJlZV9za2Ioc2tiKTsKKwlpZiAob3AtPmNhbl9pZCAhPSByeGZyYW1lLT5jYW5faWQpCiAJCXJldHVybjsKLQl9CiAKLQlpZiAob3AtPmNhbl9pZCAhPSByeGZyYW1lLmNhbl9pZCkKLQkJcmV0dXJuOworCS8qIHNhdmUgcnggdGltZXN0YW1wICovCisJb3AtPnJ4X3N0YW1wID0gc2tiLT50c3RhbXA7CisJLyogc2F2ZSBvcmlnaW5hdG9yIGZvciByZWN2ZnJvbSgpICovCisJb3AtPnJ4X2lmaW5kZXggPSBza2ItPmRldi0+aWZpbmRleDsKKwkvKiB1cGRhdGUgc3RhdGlzdGljcyAqLworCW9wLT5mcmFtZXNfYWJzKys7CiAKIAlpZiAob3AtPmZsYWdzICYgUlhfUlRSX0ZSQU1FKSB7CiAJCS8qIHNlbmQgcmVwbHkgZm9yIFJUUi1yZXF1ZXN0IChwbGFjZWQgaW4gb3AtPmZyYW1lc1swXSkgKi8KQEAgLTYyOCwxNiArNjUwLDE0IEBACiAKIAlpZiAob3AtPmZsYWdzICYgUlhfRklMVEVSX0lEKSB7CiAJCS8qIHRoZSBlYXNpZXN0IGNhc2UgKi8KLQkJYmNtX3J4X3VwZGF0ZV9hbmRfc2VuZChvcCwgJm9wLT5sYXN0X2ZyYW1lc1swXSwgJnJ4ZnJhbWUpOwotCQliY21fcnhfc3RhcnR0aW1lcihvcCk7Ci0JCXJldHVybjsKKwkJYmNtX3J4X3VwZGF0ZV9hbmRfc2VuZChvcCwgJm9wLT5sYXN0X2ZyYW1lc1swXSwgcnhmcmFtZSk7CisJCWdvdG8gcnhfc3RhcnR0aW1lcjsKIAl9CiAKIAlpZiAob3AtPm5mcmFtZXMgPT0gMSkgewogCQkvKiBzaW1wbGUgY29tcGFyZSB3aXRoIGluZGV4IDAgKi8KLQkJYmNtX3J4X2NtcF90b19pbmRleChvcCwgMCwgJnJ4ZnJhbWUpOwotCQliY21fcnhfc3RhcnR0aW1lcihvcCk7Ci0JCXJldHVybjsKKwkJYmNtX3J4X2NtcF90b19pbmRleChvcCwgMCwgcnhmcmFtZSk7CisJCWdvdG8gcnhfc3RhcnR0aW1lcjsKIAl9CiAKIAlpZiAob3AtPm5mcmFtZXMgPiAxKSB7CkBAIC02NDksMTUgKzY2OSwxNyBAQAogCQkgKi8KIAogCQlmb3IgKGkgPSAxOyBpIDwgb3AtPm5mcmFtZXM7IGkrKykgewotCQkJaWYgKChHRVRfVTY0KCZvcC0+ZnJhbWVzWzBdKSAmIEdFVF9VNjQoJnJ4ZnJhbWUpKSA9PQorCQkJaWYgKChHRVRfVTY0KCZvcC0+ZnJhbWVzWzBdKSAmIEdFVF9VNjQocnhmcmFtZSkpID09CiAJCQkgICAgKEdFVF9VNjQoJm9wLT5mcmFtZXNbMF0pICYKIAkJCSAgICAgR0VUX1U2NCgmb3AtPmZyYW1lc1tpXSkpKSB7Ci0JCQkJYmNtX3J4X2NtcF90b19pbmRleChvcCwgaSwgJnJ4ZnJhbWUpOworCQkJCWJjbV9yeF9jbXBfdG9faW5kZXgob3AsIGksIHJ4ZnJhbWUpOwogCQkJCWJyZWFrOwogCQkJfQogCQl9Ci0JCWJjbV9yeF9zdGFydHRpbWVyKG9wKTsKIAl9CisKK3J4X3N0YXJ0dGltZXI6CisJYmNtX3J4X3N0YXJ0dGltZXIob3ApOwogfQogCiAvKgpAQCAtNjgxLDYgKzcwMywxMiBAQAogCWhydGltZXJfY2FuY2VsKCZvcC0+dGltZXIpOwogCWhydGltZXJfY2FuY2VsKCZvcC0+dGhydGltZXIpOwogCisJaWYgKG9wLT50c2tsZXQuZnVuYykKKwkJdGFza2xldF9raWxsKCZvcC0+dHNrbGV0KTsKKworCWlmIChvcC0+dGhydHNrbGV0LmZ1bmMpCisJCXRhc2tsZXRfa2lsbCgmb3AtPnRocnRza2xldCk7CisKIAlpZiAoKG9wLT5mcmFtZXMpICYmIChvcC0+ZnJhbWVzICE9ICZvcC0+c2ZyYW1lKSkKIAkJa2ZyZWUob3AtPmZyYW1lcyk7CiAKQEAgLTg5MSw2ICs5MTksMTAgQEAKIAkJaHJ0aW1lcl9pbml0KCZvcC0+dGltZXIsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX1JFTCk7CiAJCW9wLT50aW1lci5mdW5jdGlvbiA9IGJjbV90eF90aW1lb3V0X2hhbmRsZXI7CiAKKwkJLyogaW5pdGlhbGl6ZSB0YXNrbGV0IGZvciB0eCBjb3VudGV2ZW50IG5vdGlmaWNhdGlvbiAqLworCQl0YXNrbGV0X2luaXQoJm9wLT50c2tsZXQsIGJjbV90eF90aW1lb3V0X3Rza2xldCwKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIG9wKTsKKwogCQkvKiBjdXJyZW50bHkgdW51c2VkIGluIHR4X29wcyAqLwogCQlocnRpbWVyX2luaXQoJm9wLT50aHJ0aW1lciwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfUkVMKTsKIApAQCAtMTA1NCw5ICsxMDg2LDE3IEBACiAJCWhydGltZXJfaW5pdCgmb3AtPnRpbWVyLCBDTE9DS19NT05PVE9OSUMsIEhSVElNRVJfTU9ERV9SRUwpOwogCQlvcC0+dGltZXIuZnVuY3Rpb24gPSBiY21fcnhfdGltZW91dF9oYW5kbGVyOwogCisJCS8qIGluaXRpYWxpemUgdGFza2xldCBmb3IgcnggdGltZW91dCBub3RpZmljYXRpb24gKi8KKwkJdGFza2xldF9pbml0KCZvcC0+dHNrbGV0LCBiY21fcnhfdGltZW91dF90c2tsZXQsCisJCQkgICAgICh1bnNpZ25lZCBsb25nKSBvcCk7CisKIAkJaHJ0aW1lcl9pbml0KCZvcC0+dGhydGltZXIsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX1JFTCk7CiAJCW9wLT50aHJ0aW1lci5mdW5jdGlvbiA9IGJjbV9yeF90aHJfaGFuZGxlcjsKIAorCQkvKiBpbml0aWFsaXplIHRhc2tsZXQgZm9yIHJ4IHRocm90dGxlIGhhbmRsaW5nICovCisJCXRhc2tsZXRfaW5pdCgmb3AtPnRocnRza2xldCwgYmNtX3J4X3Rocl90c2tsZXQsCisJCQkgICAgICh1bnNpZ25lZCBsb25nKSBvcCk7CisKIAkJLyogYWRkIHRoaXMgYmNtX29wIHRvIHRoZSBsaXN0IG9mIHRoZSByeF9vcHMgKi8KIAkJbGlzdF9hZGQoJm9wLT5saXN0LCAmYm8tPnJ4X29wcyk7CiAKQEAgLTExMDIsNyArMTE0Miw3IEBACiAJCQkgKi8KIAkJCW9wLT5rdF9sYXN0bXNnID0ga3RpbWVfc2V0KDAsIDApOwogCQkJaHJ0aW1lcl9jYW5jZWwoJm9wLT50aHJ0aW1lcik7Ci0JCQliY21fcnhfdGhyX2ZsdXNoKG9wKTsKKwkJCWJjbV9yeF90aHJfZmx1c2gob3AsIDEpOwogCQl9CiAKIAkJaWYgKChvcC0+ZmxhZ3MgJiBTVEFSVFRJTUVSKSAmJiBvcC0+a3RfaXZhbDEudHY2NCkKZGlmZiAtLWdpdCBhL25ldC9jYW4vcmF3LmMgYi9uZXQvY2FuL3Jhdy5jCmluZGV4IDI3YWFiNjMuLjA3MDNjYmEgMTAwNjQ0Ci0tLSBhL25ldC9jYW4vcmF3LmMKKysrIGIvbmV0L2Nhbi9yYXcuYwpAQCAtOTksMTMgKzk5LDE0IEBACiAJc3RydWN0IHJhd19zb2NrICpybyA9IHJhd19zayhzayk7CiAJc3RydWN0IHNvY2thZGRyX2NhbiAqYWRkcjsKIAotCWlmICghcm8tPnJlY3Zfb3duX21zZ3MpIHsKLQkJLyogY2hlY2sgdGhlIHJlY2VpdmVkIHR4IHNvY2sgcmVmZXJlbmNlICovCi0JCWlmIChza2ItPnNrID09IHNrKSB7Ci0JCQlrZnJlZV9za2Ioc2tiKTsKLQkJCXJldHVybjsKLQkJfQotCX0KKwkvKiBjaGVjayB0aGUgcmVjZWl2ZWQgdHggc29jayByZWZlcmVuY2UgKi8KKwlpZiAoIXJvLT5yZWN2X293bl9tc2dzICYmIHNrYi0+c2sgPT0gc2spCisJCXJldHVybjsKKworCS8qIGNsb25lIHRoZSBnaXZlbiBza2IgdG8gYmUgYWJsZSB0byBlbnF1ZXVlIGl0IGludG8gdGhlIHJjdiBxdWV1ZSAqLworCXNrYiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOworCWlmICghc2tiKQorCQlyZXR1cm47CiAKIAkvKgogCSAqICBQdXQgdGhlIGRhdGFncmFtIHRvIHRoZSBxdWV1ZSBzbyB0aGF0IHJhd19yZWN2bXNnKCkgY2FuCmRpZmYgLS1naXQgYS9uZXQvY29yZS9kZXYuYyBiL25ldC9jb3JlL2Rldi5jCmluZGV4IDA5YzY2YTQuLjVmNzM2ZjEgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2Rldi5jCisrKyBiL25ldC9jb3JlL2Rldi5jCkBAIC0xMzIsNiArMTMyLDkgQEAKIC8qIEluc3RlYWQgb2YgaW5jcmVhc2luZyB0aGlzLCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIGhhc2ggdGFibGUuICovCiAjZGVmaW5lIE1BWF9HUk9fU0tCUyA4CiAKKy8qIFRoaXMgc2hvdWxkIGJlIGluY3JlYXNlZCBpZiBhIHByb3RvY29sIHdpdGggYSBiaWdnZXIgaGVhZCBpcyBhZGRlZC4gKi8KKyNkZWZpbmUgR1JPX01BWF9IRUFEIChNQVhfSEVBREVSICsgMTI4KQorCiAvKgogICoJVGhlIGxpc3Qgb2YgcGFja2V0IHR5cGVzIHdlIHdpbGwgcmVjZWl2ZSAoYXMgb3Bwb3NlZCB0byBkaXNjYXJkKQogICoJYW5kIHRoZSByb3V0aW5lcyB0byBpbnZva2UuCkBAIC0xNjcsMjUgKzE3MCw2IEBACiBzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBwdHlwZV9iYXNlW1BUWVBFX0hBU0hfU0laRV0gX19yZWFkX21vc3RseTsKIHN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHB0eXBlX2FsbCBfX3JlYWRfbW9zdGx5OwkvKiBUYXBzICovCiAKLSNpZmRlZiBDT05GSUdfTkVUX0RNQQotc3RydWN0IG5ldF9kbWEgewotCXN0cnVjdCBkbWFfY2xpZW50IGNsaWVudDsKLQlzcGlubG9ja190IGxvY2s7Ci0JY3B1bWFza190IGNoYW5uZWxfbWFzazsKLQlzdHJ1Y3QgZG1hX2NoYW4gKipjaGFubmVsczsKLX07Ci0KLXN0YXRpYyBlbnVtIGRtYV9zdGF0ZV9jbGllbnQKLW5ldGRldl9kbWFfZXZlbnQoc3RydWN0IGRtYV9jbGllbnQgKmNsaWVudCwgc3RydWN0IGRtYV9jaGFuICpjaGFuLAotCWVudW0gZG1hX3N0YXRlIHN0YXRlKTsKLQotc3RhdGljIHN0cnVjdCBuZXRfZG1hIG5ldF9kbWEgPSB7Ci0JLmNsaWVudCA9IHsKLQkJLmV2ZW50X2NhbGxiYWNrID0gbmV0ZGV2X2RtYV9ldmVudCwKLQl9LAotfTsKLSNlbmRpZgotCiAvKgogICogVGhlIEBkZXZfYmFzZV9oZWFkIGxpc3QgaXMgcHJvdGVjdGVkIGJ5IEBkZXZfYmFzZV9sb2NrIGFuZCB0aGUgcnRubAogICogc2VtYXBob3JlLgpAQCAtMjM0NSw3ICsyMzI5LDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gJnB0eXBlX2Jhc2VbbnRvaHModHlwZSkgJiBQVFlQRV9IQVNIX01BU0tdOwogCWludCBlcnIgPSAtRU5PRU5UOwogCi0JaWYgKCFza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCkKKwlpZiAoTkFQSV9HUk9fQ0Ioc2tiKS0+Y291bnQgPT0gMSkKIAkJZ290byBvdXQ7CiAKIAlyY3VfcmVhZF9sb2NrKCk7CkBAIC0yMzY1LDYgKzIzNDksNyBAQAogCX0KIAogb3V0OgorCXNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUgPSAwOwogCV9fc2tiX3B1c2goc2tiLCAtc2tiX25ldHdvcmtfb2Zmc2V0KHNrYikpOwogCXJldHVybiBuZXRpZl9yZWNlaXZlX3NrYihza2IpOwogfQpAQCAtMjM4Myw3ICsyMzY4LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0wobmFwaV9ncm9fZmx1c2gpOwogCi1pbnQgbmFwaV9ncm9fcmVjZWl2ZShzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIHN0cnVjdCBza19idWZmICpza2IpCitpbnQgZGV2X2dyb19yZWNlaXZlKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqKnBwID0gTlVMTDsKIAlzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0eXBlOwpAQCAtMjM5Miw2ICsyMzc3LDcgQEAKIAlpbnQgY291bnQgPSAwOwogCWludCBzYW1lX2Zsb3c7CiAJaW50IG1hY19sZW47CisJaW50IGZyZWU7CiAKIAlpZiAoIShza2ItPmRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0dSTykpCiAJCWdvdG8gbm9ybWFsOwpAQCAtMjQwOCwxNCArMjM5NCwxOCBAQAogCQlza2ItPm1hY19sZW4gPSBtYWNfbGVuOwogCQlOQVBJX0dST19DQihza2IpLT5zYW1lX2Zsb3cgPSAwOwogCQlOQVBJX0dST19DQihza2IpLT5mbHVzaCA9IDA7CisJCU5BUElfR1JPX0NCKHNrYiktPmZyZWUgPSAwOwogCiAJCWZvciAocCA9IG5hcGktPmdyb19saXN0OyBwOyBwID0gcC0+bmV4dCkgewogCQkJY291bnQrKzsKLQkJCU5BUElfR1JPX0NCKHApLT5zYW1lX2Zsb3cgPQotCQkJCXAtPm1hY19sZW4gPT0gbWFjX2xlbiAmJgotCQkJCSFtZW1jbXAoc2tiX21hY19oZWFkZXIocCksIHNrYl9tYWNfaGVhZGVyKHNrYiksCi0JCQkJCW1hY19sZW4pOwotCQkJTkFQSV9HUk9fQ0IocCktPmZsdXNoID0gMDsKKworCQkJaWYgKCFOQVBJX0dST19DQihwKS0+c2FtZV9mbG93KQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAocC0+bWFjX2xlbiAhPSBtYWNfbGVuIHx8CisJCQkgICAgbWVtY21wKHNrYl9tYWNfaGVhZGVyKHApLCBza2JfbWFjX2hlYWRlcihza2IpLAorCQkJCSAgIG1hY19sZW4pKQorCQkJCU5BUElfR1JPX0NCKHApLT5zYW1lX2Zsb3cgPSAwOwogCQl9CiAKIAkJcHAgPSBwdHlwZS0+Z3JvX3JlY2VpdmUoJm5hcGktPmdyb19saXN0LCBza2IpOwpAQCAtMjQyNyw2ICsyNDE3LDcgQEAKIAkJZ290byBub3JtYWw7CiAKIAlzYW1lX2Zsb3cgPSBOQVBJX0dST19DQihza2IpLT5zYW1lX2Zsb3c7CisJZnJlZSA9IE5BUElfR1JPX0NCKHNrYiktPmZyZWU7CiAKIAlpZiAocHApIHsKIAkJc3RydWN0IHNrX2J1ZmYgKm5za2IgPSAqcHA7CkBAIC0yNDQ2LDE3ICsyNDM3LDEyNCBAQAogCX0KIAogCU5BUElfR1JPX0NCKHNrYiktPmNvdW50ID0gMTsKKwlza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplID0gc2tiLT5sZW47CiAJc2tiLT5uZXh0ID0gbmFwaS0+Z3JvX2xpc3Q7CiAJbmFwaS0+Z3JvX2xpc3QgPSBza2I7CiAKIG9rOgotCXJldHVybiBORVRfUlhfU1VDQ0VTUzsKKwlyZXR1cm4gZnJlZTsKIAogbm9ybWFsOgotCXJldHVybiBuZXRpZl9yZWNlaXZlX3NrYihza2IpOworCXJldHVybiAtMTsKK30KK0VYUE9SVF9TWU1CT0woZGV2X2dyb19yZWNlaXZlKTsKKworc3RhdGljIGludCBfX25hcGlfZ3JvX3JlY2VpdmUoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBza19idWZmICpwOworCisJZm9yIChwID0gbmFwaS0+Z3JvX2xpc3Q7IHA7IHAgPSBwLT5uZXh0KSB7CisJCU5BUElfR1JPX0NCKHApLT5zYW1lX2Zsb3cgPSAxOworCQlOQVBJX0dST19DQihwKS0+Zmx1c2ggPSAwOworCX0KKworCXJldHVybiBkZXZfZ3JvX3JlY2VpdmUobmFwaSwgc2tiKTsKK30KKworaW50IG5hcGlfZ3JvX3JlY2VpdmUoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN3aXRjaCAoX19uYXBpX2dyb19yZWNlaXZlKG5hcGksIHNrYikpIHsKKwljYXNlIC0xOgorCQlyZXR1cm4gbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKworCWNhc2UgMToKKwkJa2ZyZWVfc2tiKHNrYik7CisJCWJyZWFrOworCX0KKworCXJldHVybiBORVRfUlhfU1VDQ0VTUzsKIH0KIEVYUE9SVF9TWU1CT0wobmFwaV9ncm9fcmVjZWl2ZSk7CiAKK3ZvaWQgbmFwaV9yZXVzZV9za2Ioc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPSAwOworCisJc2tiLT5sZW4gLT0gc2tiLT5kYXRhX2xlbjsKKwlza2ItPnRydWVzaXplIC09IHNrYi0+ZGF0YV9sZW47CisJc2tiLT5kYXRhX2xlbiA9IDA7CisKKwlfX3NrYl9wdWxsKHNrYiwgc2tiX2hlYWRsZW4oc2tiKSk7CisJc2tiX3Jlc2VydmUoc2tiLCBORVRfSVBfQUxJR04gLSBza2JfaGVhZHJvb20oc2tiKSk7CisKKwluYXBpLT5za2IgPSBza2I7Cit9CitFWFBPUlRfU1lNQk9MKG5hcGlfcmV1c2Vfc2tiKTsKKworc3RydWN0IHNrX2J1ZmYgKm5hcGlfZnJhZ2luZm9fc2tiKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwKKwkJCQkgIHN0cnVjdCBuYXBpX2dyb19mcmFnaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmFwaS0+ZGV2OworCXN0cnVjdCBza19idWZmICpza2IgPSBuYXBpLT5za2I7CisKKwluYXBpLT5za2IgPSBOVUxMOworCisJaWYgKCFza2IpIHsKKwkJc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihkZXYsIEdST19NQVhfSEVBRCArIE5FVF9JUF9BTElHTik7CisJCWlmICghc2tiKQorCQkJZ290byBvdXQ7CisKKwkJc2tiX3Jlc2VydmUoc2tiLCBORVRfSVBfQUxJR04pOworCX0KKworCUJVR19PTihpbmZvLT5ucl9mcmFncyA+IE1BWF9TS0JfRlJBR1MpOworCXNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPSBpbmZvLT5ucl9mcmFnczsKKwltZW1jcHkoc2tiX3NoaW5mbyhza2IpLT5mcmFncywgaW5mby0+ZnJhZ3MsIHNpemVvZihpbmZvLT5mcmFncykpOworCisJc2tiLT5kYXRhX2xlbiA9IGluZm8tPmxlbjsKKwlza2ItPmxlbiArPSBpbmZvLT5sZW47CisJc2tiLT50cnVlc2l6ZSArPSBpbmZvLT5sZW47CisKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBFVEhfSExFTikpIHsKKwkJbmFwaV9yZXVzZV9za2IobmFwaSwgc2tiKTsKKwkJZ290byBvdXQ7CisJfQorCisJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKworCXNrYi0+aXBfc3VtbWVkID0gaW5mby0+aXBfc3VtbWVkOworCXNrYi0+Y3N1bSA9IGluZm8tPmNzdW07CisKK291dDoKKwlyZXR1cm4gc2tiOworfQorRVhQT1JUX1NZTUJPTChuYXBpX2ZyYWdpbmZvX3NrYik7CisKK2ludCBuYXBpX2dyb19mcmFncyhzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIHN0cnVjdCBuYXBpX2dyb19mcmFnaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gbmFwaV9mcmFnaW5mb19za2IobmFwaSwgaW5mbyk7CisJaW50IGVyciA9IE5FVF9SWF9EUk9QOworCisJaWYgKCFza2IpCisJCWdvdG8gb3V0OworCisJZXJyID0gTkVUX1JYX1NVQ0NFU1M7CisKKwlzd2l0Y2ggKF9fbmFwaV9ncm9fcmVjZWl2ZShuYXBpLCBza2IpKSB7CisJY2FzZSAtMToKKwkJcmV0dXJuIG5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CisKKwljYXNlIDA6CisJCWdvdG8gb3V0OworCX0KKworCW5hcGlfcmV1c2Vfc2tiKG5hcGksIHNrYik7CisKK291dDoKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTChuYXBpX2dyb19mcmFncyk7CisKIHN0YXRpYyBpbnQgcHJvY2Vzc19iYWNrbG9nKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IHF1b3RhKQogewogCWludCB3b3JrID0gMDsKQEAgLTI1MzUsMTEgKzI2MzMsMTIgQEAKIHsKIAlJTklUX0xJU1RfSEVBRCgmbmFwaS0+cG9sbF9saXN0KTsKIAluYXBpLT5ncm9fbGlzdCA9IE5VTEw7CisJbmFwaS0+c2tiID0gTlVMTDsKIAluYXBpLT5wb2xsID0gcG9sbDsKIAluYXBpLT53ZWlnaHQgPSB3ZWlnaHQ7CiAJbGlzdF9hZGQoJm5hcGktPmRldl9saXN0LCAmZGV2LT5uYXBpX2xpc3QpOwotI2lmZGVmIENPTkZJR19ORVRQT0xMCiAJbmFwaS0+ZGV2ID0gZGV2OworI2lmZGVmIENPTkZJR19ORVRQT0xMCiAJc3Bpbl9sb2NrX2luaXQoJm5hcGktPnBvbGxfbG9jayk7CiAJbmFwaS0+cG9sbF9vd25lciA9IC0xOwogI2VuZGlmCkBAIC0yNTUyLDYgKzI2NTEsNyBAQAogCXN0cnVjdCBza19idWZmICpza2IsICpuZXh0OwogCiAJbGlzdF9kZWxfaW5pdCgmbmFwaS0+ZGV2X2xpc3QpOworCWtmcmVlKG5hcGktPnNrYik7CiAKIAlmb3IgKHNrYiA9IG5hcGktPmdyb19saXN0OyBza2I7IHNrYiA9IG5leHQpIHsKIAkJbmV4dCA9IHNrYi0+bmV4dDsKQEAgLTI2MzUsMTQgKzI3MzUsNyBAQAogCSAqIFRoZXJlIG1heSBub3QgYmUgYW55IG1vcmUgc2tfYnVmZnMgY29taW5nIHJpZ2h0IG5vdywgc28gcHVzaAogCSAqIGFueSBwZW5kaW5nIERNQSBjb3BpZXMgdG8gaGFyZHdhcmUKIAkgKi8KLQlpZiAoIWNwdXNfZW1wdHkobmV0X2RtYS5jaGFubmVsX21hc2spKSB7Ci0JCWludCBjaGFuX2lkeDsKLQkJZm9yX2VhY2hfY3B1X21hc2tfbnIoY2hhbl9pZHgsIG5ldF9kbWEuY2hhbm5lbF9tYXNrKSB7Ci0JCQlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4gPSBuZXRfZG1hLmNoYW5uZWxzW2NoYW5faWR4XTsKLQkJCWlmIChjaGFuKQotCQkJCWRtYV9hc3luY19tZW1jcHlfaXNzdWVfcGVuZGluZyhjaGFuKTsKLQkJfQotCX0KKwlkbWFfaXNzdWVfcGVuZGluZ19hbGwoKTsKICNlbmRpZgogCiAJcmV0dXJuOwpAQCAtNDgzMywxMjIgKzQ5MjYsNiBAQAogCXJldHVybiBOT1RJRllfT0s7CiB9CiAKLSNpZmRlZiBDT05GSUdfTkVUX0RNQQotLyoqCi0gKiBuZXRfZG1hX3JlYmFsYW5jZSAtIHRyeSB0byBtYWludGFpbiBvbmUgRE1BIGNoYW5uZWwgcGVyIENQVQotICogQG5ldF9kbWE6IERNQSBjbGllbnQgYW5kIGFzc29jaWF0ZWQgZGF0YSAobG9jaywgY2hhbm5lbHMsIGNoYW5uZWxfbWFzaykKLSAqCi0gKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgYWxsb2NhdGVkIHRvIHRoZSBuZXRfZG1hIGNsaWVudAotICogY2hhbmdlcy4gIFRoZSBuZXRfZG1hIGNsaWVudCB0cmllcyB0byBoYXZlIG9uZSBETUEgY2hhbm5lbCBwZXIgQ1BVLgotICovCi0KLXN0YXRpYyB2b2lkIG5ldF9kbWFfcmViYWxhbmNlKHN0cnVjdCBuZXRfZG1hICpuZXRfZG1hKQotewotCXVuc2lnbmVkIGludCBjcHUsIGksIG4sIGNoYW5faWR4OwotCXN0cnVjdCBkbWFfY2hhbiAqY2hhbjsKLQotCWlmIChjcHVzX2VtcHR5KG5ldF9kbWEtPmNoYW5uZWxfbWFzaykpIHsKLQkJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCi0JCQlyY3VfYXNzaWduX3BvaW50ZXIocGVyX2NwdShzb2Z0bmV0X2RhdGEsIGNwdSkubmV0X2RtYSwgTlVMTCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpID0gMDsKLQljcHUgPSBmaXJzdF9jcHUoY3B1X29ubGluZV9tYXApOwotCi0JZm9yX2VhY2hfY3B1X21hc2tfbnIoY2hhbl9pZHgsIG5ldF9kbWEtPmNoYW5uZWxfbWFzaykgewotCQljaGFuID0gbmV0X2RtYS0+Y2hhbm5lbHNbY2hhbl9pZHhdOwotCi0JCW4gPSAoKG51bV9vbmxpbmVfY3B1cygpIC8gY3B1c193ZWlnaHQobmV0X2RtYS0+Y2hhbm5lbF9tYXNrKSkKLQkJICAgKyAoaSA8IChudW1fb25saW5lX2NwdXMoKSAlCi0JCQljcHVzX3dlaWdodChuZXRfZG1hLT5jaGFubmVsX21hc2spKSA/IDEgOiAwKSk7Ci0KLQkJd2hpbGUobikgewotCQkJcGVyX2NwdShzb2Z0bmV0X2RhdGEsIGNwdSkubmV0X2RtYSA9IGNoYW47Ci0JCQljcHUgPSBuZXh0X2NwdShjcHUsIGNwdV9vbmxpbmVfbWFwKTsKLQkJCW4tLTsKLQkJfQotCQlpKys7Ci0JfQotfQotCi0vKioKLSAqIG5ldGRldl9kbWFfZXZlbnQgLSBldmVudCBjYWxsYmFjayBmb3IgdGhlIG5ldF9kbWFfY2xpZW50Ci0gKiBAY2xpZW50OiBzaG91bGQgYWx3YXlzIGJlIG5ldF9kbWFfY2xpZW50Ci0gKiBAY2hhbjogRE1BIGNoYW5uZWwgZm9yIHRoZSBldmVudAotICogQHN0YXRlOiBETUEgc3RhdGUgdG8gYmUgaGFuZGxlZAotICovCi1zdGF0aWMgZW51bSBkbWFfc3RhdGVfY2xpZW50Ci1uZXRkZXZfZG1hX2V2ZW50KHN0cnVjdCBkbWFfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwKLQllbnVtIGRtYV9zdGF0ZSBzdGF0ZSkKLXsKLQlpbnQgaSwgZm91bmQgPSAwLCBwb3MgPSAtMTsKLQlzdHJ1Y3QgbmV0X2RtYSAqbmV0X2RtYSA9Ci0JCWNvbnRhaW5lcl9vZihjbGllbnQsIHN0cnVjdCBuZXRfZG1hLCBjbGllbnQpOwotCWVudW0gZG1hX3N0YXRlX2NsaWVudCBhY2sgPSBETUFfRFVQOyAvKiBkZWZhdWx0OiB0YWtlIG5vIGFjdGlvbiAqLwotCi0Jc3Bpbl9sb2NrKCZuZXRfZG1hLT5sb2NrKTsKLQlzd2l0Y2ggKHN0YXRlKSB7Ci0JY2FzZSBETUFfUkVTT1VSQ0VfQVZBSUxBQkxFOgotCQlmb3IgKGkgPSAwOyBpIDwgbnJfY3B1X2lkczsgaSsrKQotCQkJaWYgKG5ldF9kbWEtPmNoYW5uZWxzW2ldID09IGNoYW4pIHsKLQkJCQlmb3VuZCA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgaWYgKG5ldF9kbWEtPmNoYW5uZWxzW2ldID09IE5VTEwgJiYgcG9zIDwgMCkKLQkJCQlwb3MgPSBpOwotCi0JCWlmICghZm91bmQgJiYgcG9zID49IDApIHsKLQkJCWFjayA9IERNQV9BQ0s7Ci0JCQluZXRfZG1hLT5jaGFubmVsc1twb3NdID0gY2hhbjsKLQkJCWNwdV9zZXQocG9zLCBuZXRfZG1hLT5jaGFubmVsX21hc2spOwotCQkJbmV0X2RtYV9yZWJhbGFuY2UobmV0X2RtYSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBETUFfUkVTT1VSQ0VfUkVNT1ZFRDoKLQkJZm9yIChpID0gMDsgaSA8IG5yX2NwdV9pZHM7IGkrKykKLQkJCWlmIChuZXRfZG1hLT5jaGFubmVsc1tpXSA9PSBjaGFuKSB7Ci0JCQkJZm91bmQgPSAxOwotCQkJCXBvcyA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJaWYgKGZvdW5kKSB7Ci0JCQlhY2sgPSBETUFfQUNLOwotCQkJY3B1X2NsZWFyKHBvcywgbmV0X2RtYS0+Y2hhbm5lbF9tYXNrKTsKLQkJCW5ldF9kbWEtPmNoYW5uZWxzW2ldID0gTlVMTDsKLQkJCW5ldF9kbWFfcmViYWxhbmNlKG5ldF9kbWEpOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlzcGluX3VubG9jaygmbmV0X2RtYS0+bG9jayk7Ci0KLQlyZXR1cm4gYWNrOwotfQotCi0vKioKLSAqIG5ldGRldl9kbWFfcmVnaXN0ZXIgLSByZWdpc3RlciB0aGUgbmV0d29ya2luZyBzdWJzeXN0ZW0gYXMgYSBETUEgY2xpZW50Ci0gKi8KLXN0YXRpYyBpbnQgX19pbml0IG5ldGRldl9kbWFfcmVnaXN0ZXIodm9pZCkKLXsKLQluZXRfZG1hLmNoYW5uZWxzID0ga3phbGxvYyhucl9jcHVfaWRzICogc2l6ZW9mKHN0cnVjdCBuZXRfZG1hKSwKLQkJCQkJCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKHVubGlrZWx5KCFuZXRfZG1hLmNoYW5uZWxzKSkgewotCQlwcmludGsoS0VSTl9OT1RJQ0UKLQkJCQkibmV0ZGV2X2RtYTogbm8gbWVtb3J5IGZvciBuZXRfZG1hLmNoYW5uZWxzXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCXNwaW5fbG9ja19pbml0KCZuZXRfZG1hLmxvY2spOwotCWRtYV9jYXBfc2V0KERNQV9NRU1DUFksIG5ldF9kbWEuY2xpZW50LmNhcF9tYXNrKTsKLQlkbWFfYXN5bmNfY2xpZW50X3JlZ2lzdGVyKCZuZXRfZG1hLmNsaWVudCk7Ci0JZG1hX2FzeW5jX2NsaWVudF9jaGFuX3JlcXVlc3QoJm5ldF9kbWEuY2xpZW50KTsKLQlyZXR1cm4gMDsKLX0KLQotI2Vsc2UKLXN0YXRpYyBpbnQgX19pbml0IG5ldGRldl9kbWFfcmVnaXN0ZXIodm9pZCkgeyByZXR1cm4gLUVOT0RFVjsgfQotI2VuZGlmIC8qIENPTkZJR19ORVRfRE1BICovCiAKIC8qKgogICoJbmV0ZGV2X2luY3JlbWVudF9mZWF0dXJlcyAtIGluY3JlbWVudCBmZWF0dXJlIHNldCBieSBvbmUKQEAgLTUxNjgsMTQgKzUxNDUsMTUgQEAKIAlpZiAocmVnaXN0ZXJfcGVybmV0X2RldmljZSgmZGVmYXVsdF9kZXZpY2Vfb3BzKSkKIAkJZ290byBvdXQ7CiAKLQluZXRkZXZfZG1hX3JlZ2lzdGVyKCk7Ci0KIAlvcGVuX3NvZnRpcnEoTkVUX1RYX1NPRlRJUlEsIG5ldF90eF9hY3Rpb24pOwogCW9wZW5fc29mdGlycShORVRfUlhfU09GVElSUSwgbmV0X3J4X2FjdGlvbik7CiAKIAlob3RjcHVfbm90aWZpZXIoZGV2X2NwdV9jYWxsYmFjaywgMCk7CiAJZHN0X2luaXQoKTsKIAlkZXZfbWNhc3RfaW5pdCgpOworCSNpZmRlZiBDT05GSUdfTkVUX0RNQQorCWRtYWVuZ2luZV9nZXQoKTsKKwkjZW5kaWYKIAlyYyA9IDA7CiBvdXQ6CiAJcmV0dXJuIHJjOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvc2tidWZmLmMgYi9uZXQvY29yZS9za2J1ZmYuYwppbmRleCBiOGQwYWJiLi41MTEwYjM1IDEwMDY0NAotLS0gYS9uZXQvY29yZS9za2J1ZmYuYworKysgYi9uZXQvY29yZS9za2J1ZmYuYwpAQCAtMjU5NCw2ICsyNTk0LDE3IEBACiAKIAlpZiAoc2tiX3NoaW5mbyhwKS0+ZnJhZ19saXN0KQogCQlnb3RvIG1lcmdlOworCWVsc2UgaWYgKCFza2JfaGVhZGxlbihwKSAmJiAhc2tiX2hlYWRsZW4oc2tiKSAmJgorCQkgc2tiX3NoaW5mbyhwKS0+bnJfZnJhZ3MgKyBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzIDwKKwkJIE1BWF9TS0JfRlJBR1MpIHsKKwkJbWVtY3B5KHNrYl9zaGluZm8ocCktPmZyYWdzICsgc2tiX3NoaW5mbyhwKS0+bnJfZnJhZ3MsCisJCSAgICAgICBza2Jfc2hpbmZvKHNrYiktPmZyYWdzLAorCQkgICAgICAgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyAqIHNpemVvZihza2JfZnJhZ190KSk7CisKKwkJc2tiX3NoaW5mbyhwKS0+bnJfZnJhZ3MgKz0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKwkJTkFQSV9HUk9fQ0Ioc2tiKS0+ZnJlZSA9IDE7CisJCWdvdG8gZG9uZTsKKwl9CiAKIAloZWFkcm9vbSA9IHNrYl9oZWFkcm9vbShwKTsKIAluc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihwLT5kZXYsIGhlYWRyb29tKTsKQEAgLTI2MTMsNiArMjYyNCw3IEBACiAKIAkqTkFQSV9HUk9fQ0IobnNrYikgPSAqTkFQSV9HUk9fQ0IocCk7CiAJc2tiX3NoaW5mbyhuc2tiKS0+ZnJhZ19saXN0ID0gcDsKKwlza2Jfc2hpbmZvKG5za2IpLT5nc29fc2l6ZSA9IHNrYl9zaGluZm8ocCktPmdzb19zaXplOwogCXNrYl9oZWFkZXJfcmVsZWFzZShwKTsKIAluc2tiLT5wcmV2ID0gcDsKIApAQCAtMjYyNywxMSArMjYzOSwxMiBAQAogCXAgPSBuc2tiOwogCiBtZXJnZToKLQlOQVBJX0dST19DQihwKS0+Y291bnQrKzsKIAlwLT5wcmV2LT5uZXh0ID0gc2tiOwogCXAtPnByZXYgPSBza2I7CiAJc2tiX2hlYWRlcl9yZWxlYXNlKHNrYik7CiAKK2RvbmU6CisJTkFQSV9HUk9fQ0IocCktPmNvdW50Kys7CiAJcC0+ZGF0YV9sZW4gKz0gc2tiLT5sZW47CiAJcC0+dHJ1ZXNpemUgKz0gc2tiLT5sZW47CiAJcC0+bGVuICs9IHNrYi0+bGVuOwpkaWZmIC0tZ2l0IGEvbmV0L2RjYi9kY2JubC5jIGIvbmV0L2RjYi9kY2JubC5jCmluZGV4IDVkYmZlNWYuLjgzNzk0OTYgMTAwNjQ0Ci0tLSBhL25ldC9kY2IvZGNibmwuYworKysgYi9uZXQvZGNiL2RjYm5sLmMKQEAgLTE5MSw3ICsxOTEsNyBAQAogCXJldHVybiAwOwogbmxtc2dfZmFpbHVyZToKIGVycjoKLQlrZnJlZShkY2JubF9za2IpOworCWtmcmVlX3NrYihkY2JubF9za2IpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTI3Miw3ICsyNzIsNyBAQAogCXJldHVybiAwOwogbmxtc2dfZmFpbHVyZToKIGVycjoKLQlrZnJlZShkY2JubF9za2IpOworCWtmcmVlX3NrYihkY2JubF9za2IpOwogZXJyX291dDoKIAlyZXR1cm4gLUVJTlZBTDsKIH0KQEAgLTMxNCw3ICszMTQsNyBAQAogCiBubG1zZ19mYWlsdXJlOgogZXJyOgotCWtmcmVlKGRjYm5sX3NrYik7CisJa2ZyZWVfc2tiKGRjYm5sX3NrYik7CiBlcnJfb3V0OgogCXJldHVybiAtRUlOVkFMOwogfQpAQCAtMzgwLDcgKzM4MCw3IEBACiAJcmV0dXJuIDA7CiBubG1zZ19mYWlsdXJlOgogZXJyOgotCWtmcmVlKGRjYm5sX3NrYik7CisJa2ZyZWVfc2tiKGRjYm5sX3NrYik7CiBlcnJfb3V0OgogCXJldHVybiAtRUlOVkFMOwogfQpAQCAtNDU4LDcgKzQ1OCw3IEBACiAJcmV0dXJuIDA7CiBubG1zZ19mYWlsdXJlOgogZXJyOgotCWtmcmVlKGRjYm5sX3NrYik7CisJa2ZyZWVfc2tiKGRjYm5sX3NrYik7CiBlcnJfb3V0OgogCXJldHVybiByZXQ7CiB9CkBAIC02ODcsNyArNjg3LDcgQEAKIAlubGFfbmVzdF9jYW5jZWwoZGNibmxfc2tiLCBwZ19uZXN0KTsKIG5sbXNnX2ZhaWx1cmU6CiBlcnI6Ci0Ja2ZyZWUoZGNibmxfc2tiKTsKKwlrZnJlZV9za2IoZGNibmxfc2tiKTsKIGVycl9vdXQ6CiAJcmV0ICA9IC1FSU5WQUw7CiAJcmV0dXJuIHJldDsKQEAgLTk0OSw3ICs5NDksNyBAQAogCW5sYV9uZXN0X2NhbmNlbChkY2JubF9za2IsIGJjbl9uZXN0KTsKIG5sbXNnX2ZhaWx1cmU6CiBlcnI6Ci0Ja2ZyZWUoZGNibmxfc2tiKTsKKwlrZnJlZV9za2IoZGNibmxfc2tiKTsKIGVycl9vdXQ6CiAJcmV0ICA9IC1FSU5WQUw7CiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL25ldC9kY2NwL0tjb25maWcgYi9uZXQvZGNjcC9LY29uZmlnCmluZGV4IDdhYTJhN2EuLmFkNmRmZmQgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL0tjb25maWcKKysrIGIvbmV0L2RjY3AvS2NvbmZpZwpAQCAtMSw3ICsxLDYgQEAKIG1lbnVjb25maWcgSVBfRENDUAogCXRyaXN0YXRlICJUaGUgRENDUCBQcm90b2NvbCAoRVhQRVJJTUVOVEFMKSIKIAlkZXBlbmRzIG9uIElORVQgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IElQX0RDQ1BfQ0NJRDIKIAktLS1oZWxwLS0tCiAJICBEYXRhZ3JhbSBDb25nZXN0aW9uIENvbnRyb2wgUHJvdG9jb2wgKFJGQyA0MzQwKQogCkBAIC0yNSw5ICsyNCw2IEBACiAJZGVmX3RyaXN0YXRlIHkgaWYgKElQX0RDQ1AgPSB5ICYmIElORVRfRElBRyA9IHkpCiAJZGVmX3RyaXN0YXRlIG0KIAotY29uZmlnIElQX0RDQ1BfQUNLVkVDCi0JYm9vbAotCiBzb3VyY2UgIm5ldC9kY2NwL2NjaWRzL0tjb25maWciCiAKIG1lbnUgIkRDQ1AgS2VybmVsIEhhY2tpbmciCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9NYWtlZmlsZSBiL25ldC9kY2NwL01ha2VmaWxlCmluZGV4IGY0Zjg3OTMuLjI5OTFlZmMgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL01ha2VmaWxlCisrKyBiL25ldC9kY2NwL01ha2VmaWxlCkBAIC0yLDE0ICsyLDIzIEBACiAKIGRjY3AteSA6PSBjY2lkLm8gZmVhdC5vIGlucHV0Lm8gbWluaXNvY2tzLm8gb3B0aW9ucy5vIG91dHB1dC5vIHByb3RvLm8gdGltZXIubwogCisjCisjIENDSUQgYWxnb3JpdGhtcyB0byBiZSB1c2VkIGJ5IGRjY3Aua28KKyMKKyMgQ0NJRC0yIGlzIGRlZmF1bHQgKFJGQyA0MzQwLCBwLiA3NykgYW5kIGhhcyBBY2sgVmVjdG9ycyBhcyBkZXBlbmRlbmN5CitkY2NwLXkgKz0gY2NpZHMvY2NpZDIubyBhY2t2ZWMubworZGNjcC0kKENPTkZJR19JUF9EQ0NQX0NDSUQzKQkrPSBjY2lkcy9jY2lkMy5vCitkY2NwLSQoQ09ORklHX0lQX0RDQ1BfVEZSQ19MSUIpICs9IGNjaWRzL2xpYi90ZnJjLm8JCVwKKwkJCQkgICBjY2lkcy9saWIvdGZyY19lcXVhdGlvbi5vCVwKKwkJCQkgICBjY2lkcy9saWIvcGFja2V0X2hpc3RvcnkubwlcCisJCQkJICAgY2NpZHMvbGliL2xvc3NfaW50ZXJ2YWwubworCiBkY2NwX2lwdjQteSA6PSBpcHY0Lm8KIAogIyBidWlsZCBkY2NwX2lwdjYgYXMgbW9kdWxlIHdoZW5ldmVyIGVpdGhlciBJUHY2IG9yIERDQ1AgaXMgYSBtb2R1bGUKIG9iai0kKHN1YnN0IHksJChDT05GSUdfSVBfRENDUCksJChDT05GSUdfSVBWNikpICs9IGRjY3BfaXB2Ni5vCiBkY2NwX2lwdjYteSA6PSBpcHY2Lm8KIAotZGNjcC0kKENPTkZJR19JUF9EQ0NQX0FDS1ZFQykgKz0gYWNrdmVjLm8KLQogb2JqLSQoQ09ORklHX0lORVRfRENDUF9ESUFHKSArPSBkY2NwX2RpYWcubwogb2JqLSQoQ09ORklHX05FVF9EQ0NQUFJPQkUpICs9IGRjY3BfcHJvYmUubwogCkBAIC0xNyw1ICsyNiwzIEBACiAKIGRjY3BfZGlhZy15IDo9IGRpYWcubwogZGNjcF9wcm9iZS15IDo9IHByb2JlLm8KLQotb2JqLXkgKz0gY2NpZHMvCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9hY2t2ZWMuaCBiL25ldC9kY2NwL2Fja3ZlYy5oCmluZGV4IDRjY2VlMDMuLjQ1Zjk1ZTUgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2Fja3ZlYy5oCisrKyBiL25ldC9kY2NwL2Fja3ZlYy5oCkBAIC04NCw3ICs4NCw2IEBACiBzdHJ1Y3Qgc29jazsKIHN0cnVjdCBza19idWZmOwogCi0jaWZkZWYgQ09ORklHX0lQX0RDQ1BfQUNLVkVDCiBleHRlcm4gaW50IGRjY3BfYWNrdmVjX2luaXQodm9pZCk7CiBleHRlcm4gdm9pZCBkY2NwX2Fja3ZlY19leGl0KHZvaWQpOwogCkBAIC0xMDYsNTIgKzEwNSw0IEBACiB7CiAJcmV0dXJuIGF2LT5hdl92ZWNfbGVuOwogfQotI2Vsc2UgLyogQ09ORklHX0lQX0RDQ1BfQUNLVkVDICovCi1zdGF0aWMgaW5saW5lIGludCBkY2NwX2Fja3ZlY19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkY2NwX2Fja3ZlY19leGl0KHZvaWQpCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGRjY3BfYWNrdmVjICpkY2NwX2Fja3ZlY19hbGxvYyhjb25zdCBnZnBfdCBwcmlvcml0eSkKLXsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGRjY3BfYWNrdmVjX2ZyZWUoc3RydWN0IGRjY3BfYWNrdmVjICphdikKLXsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgZGNjcF9hY2t2ZWNfYWRkKHN0cnVjdCBkY2NwX2Fja3ZlYyAqYXYsIGNvbnN0IHN0cnVjdCBzb2NrICpzaywKLQkJCQkgIGNvbnN0IHU2NCBhY2tubywgY29uc3QgdTggc3RhdGUpCi17Ci0JcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZGNjcF9hY2t2ZWNfY2hlY2tfcmN2X2Fja25vKHN0cnVjdCBkY2NwX2Fja3ZlYyAqYXYsCi0JCQkJCSAgICAgICBzdHJ1Y3Qgc29jayAqc2ssIGNvbnN0IHU2NCBhY2tubykKLXsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgZGNjcF9hY2t2ZWNfcGFyc2Uoc3RydWN0IHNvY2sgKnNrLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgICBjb25zdCB1NjQgKmFja25vLCBjb25zdCB1OCBvcHQsCi0JCQkJICAgIGNvbnN0IHU4ICp2YWx1ZSwgY29uc3QgdTggbGVuKQotewotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgZGNjcF9pbnNlcnRfb3B0aW9uX2Fja3ZlYyhjb25zdCBzdHJ1Y3Qgc29jayAqc2ssCi0JCQkJCSAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgZGNjcF9hY2t2ZWNfcGVuZGluZyhjb25zdCBzdHJ1Y3QgZGNjcF9hY2t2ZWMgKmF2KQotewotCXJldHVybiAwOwotfQotI2VuZGlmIC8qIENPTkZJR19JUF9EQ0NQX0FDS1ZFQyAqLwogI2VuZGlmIC8qIF9BQ0tWRUNfSCAqLwpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvY2NpZC5jIGIvbmV0L2RjY3AvY2NpZC5jCmluZGV4IGJjYzY0M2YuLmYzZTliYTEgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2NjaWQuYworKysgYi9uZXQvZGNjcC9jY2lkLmMKQEAgLTEyLDU2ICsxMiw3MCBAQAogICovCiAKICNpbmNsdWRlICJjY2lkLmgiCisjaW5jbHVkZSAiY2NpZHMvbGliL3RmcmMuaCIKIAotc3RhdGljIHU4IGJ1aWx0aW5fY2NpZHNbXSA9IHsKLQlEQ0NQQ19DQ0lEMiwJCS8qIENDSUQyIGlzIHN1cHBvcnRlZCBieSBkZWZhdWx0ICovCi0jaWYgZGVmaW5lZChDT05GSUdfSVBfRENDUF9DQ0lEMykgfHwgZGVmaW5lZChDT05GSUdfSVBfRENDUF9DQ0lEM19NT0RVTEUpCi0JRENDUENfQ0NJRDMsCitzdGF0aWMgc3RydWN0IGNjaWRfb3BlcmF0aW9ucyAqY2NpZHNbXSA9IHsKKwkmY2NpZDJfb3BzLAorI2lmZGVmIENPTkZJR19JUF9EQ0NQX0NDSUQzCisJJmNjaWQzX29wcywKICNlbmRpZgogfTsKIAotc3RhdGljIHN0cnVjdCBjY2lkX29wZXJhdGlvbnMgKmNjaWRzW0NDSURfTUFYXTsKLSNpZiBkZWZpbmVkKENPTkZJR19TTVApIHx8IGRlZmluZWQoQ09ORklHX1BSRUVNUFQpCi1zdGF0aWMgYXRvbWljX3QgY2NpZHNfbG9ja2N0ID0gQVRPTUlDX0lOSVQoMCk7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGNjaWRzX2xvY2spOworc3RhdGljIHN0cnVjdCBjY2lkX29wZXJhdGlvbnMgKmNjaWRfYnlfbnVtYmVyKGNvbnN0IHU4IGlkKQoreworCWludCBpOwogCi0vKgotICogVGhlIHN0cmF0ZWd5IGlzOiBtb2RpZmljYXRpb25zIGNjaWRzIHZlY3RvciBhcmUgc2hvcnQsIGRvIG5vdCBzbGVlcCBhbmQKLSAqIHZlZWVyeSByYXJlLCBidXQgcmVhZCBhY2Nlc3Mgc2hvdWxkIGJlIGZyZWUgb2YgYW55IGV4Y2x1c2l2ZSBsb2Nrcy4KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjY2lkcyk7IGkrKykKKwkJaWYgKGNjaWRzW2ldLT5jY2lkX2lkID09IGlkKQorCQkJcmV0dXJuIGNjaWRzW2ldOworCXJldHVybiBOVUxMOworfQorCisvKiBjaGVjayB0aGF0IHVwIHRvIEBhcnJheV9sZW4gbWVtYmVycyBpbiBAY2NpZF9hcnJheSBhcmUgc3VwcG9ydGVkICovCitib29sIGNjaWRfc3VwcG9ydF9jaGVjayh1OCBjb25zdCAqY2NpZF9hcnJheSwgdTggYXJyYXlfbGVuKQoreworCXdoaWxlIChhcnJheV9sZW4gPiAwKQorCQlpZiAoY2NpZF9ieV9udW1iZXIoY2NpZF9hcnJheVstLWFycmF5X2xlbl0pID09IE5VTEwpCisJCQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogY2NpZF9nZXRfYnVpbHRpbl9jY2lkcyAgLSAgUG9wdWxhdGUgYSBsaXN0IG9mIGJ1aWx0LWluIENDSURzCisgKiBAY2NpZF9hcnJheTogcG9pbnRlciB0byBjb3B5IGludG8KKyAqIEBhcnJheV9sZW46IHZhbHVlIHRvIHJldHVybiBsZW5ndGggaW50bworICogVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgbWVtb3J5IC0gY2FsbGVyIG11c3Qgc2VlIHRoYXQgaXQgaXMgZnJlZWQgYWZ0ZXIgdXNlLgogICovCi1zdGF0aWMgdm9pZCBjY2lkc193cml0ZV9sb2NrKHZvaWQpCitpbnQgY2NpZF9nZXRfYnVpbHRpbl9jY2lkcyh1OCAqKmNjaWRfYXJyYXksIHU4ICphcnJheV9sZW4pCiB7Ci0Jc3Bpbl9sb2NrKCZjY2lkc19sb2NrKTsKLQl3aGlsZSAoYXRvbWljX3JlYWQoJmNjaWRzX2xvY2tjdCkgIT0gMCkgewotCQlzcGluX3VubG9jaygmY2NpZHNfbG9jayk7Ci0JCXlpZWxkKCk7Ci0JCXNwaW5fbG9jaygmY2NpZHNfbG9jayk7Ci0JfQorCSpjY2lkX2FycmF5ID0ga21hbGxvYyhBUlJBWV9TSVpFKGNjaWRzKSwgZ2ZwX2FueSgpKTsKKwlpZiAoKmNjaWRfYXJyYXkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9CVUZTOworCisJZm9yICgqYXJyYXlfbGVuID0gMDsgKmFycmF5X2xlbiA8IEFSUkFZX1NJWkUoY2NpZHMpOyAqYXJyYXlfbGVuICs9IDEpCisJCSgqY2NpZF9hcnJheSlbKmFycmF5X2xlbl0gPSBjY2lkc1sqYXJyYXlfbGVuXS0+Y2NpZF9pZDsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGNjaWRzX3dyaXRlX3VubG9jayh2b2lkKQoraW50IGNjaWRfZ2V0c29ja29wdF9idWlsdGluX2NjaWRzKHN0cnVjdCBzb2NrICpzaywgaW50IGxlbiwKKwkJCQkgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbikKIHsKLQlzcGluX3VubG9jaygmY2NpZHNfbG9jayk7Ci19CisJdTggKmNjaWRfYXJyYXksIGFycmF5X2xlbjsKKwlpbnQgZXJyID0gMDsKIAotc3RhdGljIGlubGluZSB2b2lkIGNjaWRzX3JlYWRfbG9jayh2b2lkKQotewotCWF0b21pY19pbmMoJmNjaWRzX2xvY2tjdCk7Ci0Jc21wX21iX19hZnRlcl9hdG9taWNfaW5jKCk7Ci0Jc3Bpbl91bmxvY2tfd2FpdCgmY2NpZHNfbG9jayk7Ci19CisJaWYgKGxlbiA8IEFSUkFZX1NJWkUoY2NpZHMpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotc3RhdGljIGlubGluZSB2b2lkIGNjaWRzX3JlYWRfdW5sb2NrKHZvaWQpCi17Ci0JYXRvbWljX2RlYygmY2NpZHNfbG9ja2N0KTsKLX0KKwlpZiAoY2NpZF9nZXRfYnVpbHRpbl9jY2lkcygmY2NpZF9hcnJheSwgJmFycmF5X2xlbikpCisJCXJldHVybiAtRU5PQlVGUzsKIAotI2Vsc2UKLSNkZWZpbmUgY2NpZHNfd3JpdGVfbG9jaygpIGRvIHsgfSB3aGlsZSgwKQotI2RlZmluZSBjY2lkc193cml0ZV91bmxvY2soKSBkbyB7IH0gd2hpbGUoMCkKLSNkZWZpbmUgY2NpZHNfcmVhZF9sb2NrKCkgZG8geyB9IHdoaWxlKDApCi0jZGVmaW5lIGNjaWRzX3JlYWRfdW5sb2NrKCkgZG8geyB9IHdoaWxlKDApCi0jZW5kaWYKKwlpZiAocHV0X3VzZXIoYXJyYXlfbGVuLCBvcHRsZW4pIHx8CisJICAgIGNvcHlfdG9fdXNlcihvcHR2YWwsIGNjaWRfYXJyYXksIGFycmF5X2xlbikpCisJCWVyciA9IC1FRkFVTFQ7CisKKwlrZnJlZShjY2lkX2FycmF5KTsKKwlyZXR1cm4gZXJyOworfQogCiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmNjaWRfa21lbV9jYWNoZV9jcmVhdGUoaW50IG9ial9zaXplLCBjb25zdCBjaGFyICpmbXQsLi4uKQogewpAQCAtOTMsNDggKzEwNyw3IEBACiAJfQogfQogCi0vKiBjaGVjayB0aGF0IHVwIHRvIEBhcnJheV9sZW4gbWVtYmVycyBpbiBAY2NpZF9hcnJheSBhcmUgc3VwcG9ydGVkICovCi1ib29sIGNjaWRfc3VwcG9ydF9jaGVjayh1OCBjb25zdCAqY2NpZF9hcnJheSwgdTggYXJyYXlfbGVuKQotewotCXU4IGksIGosIGZvdW5kOwotCi0JZm9yIChpID0gMCwgZm91bmQgPSAwOyBpIDwgYXJyYXlfbGVuOyBpKyssIGZvdW5kID0gMCkgewotCQlmb3IgKGogPSAwOyAhZm91bmQgJiYgaiA8IEFSUkFZX1NJWkUoYnVpbHRpbl9jY2lkcyk7IGorKykKLQkJCWZvdW5kID0gKGNjaWRfYXJyYXlbaV0gPT0gYnVpbHRpbl9jY2lkc1tqXSk7Ci0JCWlmICghZm91bmQpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXJldHVybiB0cnVlOwotfQotCi0vKioKLSAqIGNjaWRfZ2V0X2J1aWx0aW5fY2NpZHMgIC0gIFByb3ZpZGUgY29weSBvZiBgYnVpbHRpbicgQ0NJRCBhcnJheQotICogQGNjaWRfYXJyYXk6IHBvaW50ZXIgdG8gY29weSBpbnRvCi0gKiBAYXJyYXlfbGVuOiB2YWx1ZSB0byByZXR1cm4gbGVuZ3RoIGludG8KLSAqIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIG1lbW9yeSAtIGNhbGxlciBtdXN0IHNlZSB0aGF0IGl0IGlzIGZyZWVkIGFmdGVyIHVzZS4KLSAqLwotaW50IGNjaWRfZ2V0X2J1aWx0aW5fY2NpZHModTggKipjY2lkX2FycmF5LCB1OCAqYXJyYXlfbGVuKQotewotCSpjY2lkX2FycmF5ID0ga21lbWR1cChidWlsdGluX2NjaWRzLCBzaXplb2YoYnVpbHRpbl9jY2lkcyksIGdmcF9hbnkoKSk7Ci0JaWYgKCpjY2lkX2FycmF5ID09IE5VTEwpCi0JCXJldHVybiAtRU5PQlVGUzsKLQkqYXJyYXlfbGVuID0gQVJSQVlfU0laRShidWlsdGluX2NjaWRzKTsKLQlyZXR1cm4gMDsKLX0KLQotaW50IGNjaWRfZ2V0c29ja29wdF9idWlsdGluX2NjaWRzKHN0cnVjdCBzb2NrICpzaywgaW50IGxlbiwKLQkJCQkgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQotewotCWlmIChsZW4gPCBzaXplb2YoYnVpbHRpbl9jY2lkcykpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKHB1dF91c2VyKHNpemVvZihidWlsdGluX2NjaWRzKSwgb3B0bGVuKSB8fAotCSAgICBjb3B5X3RvX3VzZXIob3B0dmFsLCBidWlsdGluX2NjaWRzLCBzaXplb2YoYnVpbHRpbl9jY2lkcykpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlyZXR1cm4gMDsKLX0KLQotaW50IGNjaWRfcmVnaXN0ZXIoc3RydWN0IGNjaWRfb3BlcmF0aW9ucyAqY2NpZF9vcHMpCitzdGF0aWMgaW50IGNjaWRfYWN0aXZhdGUoc3RydWN0IGNjaWRfb3BlcmF0aW9ucyAqY2NpZF9vcHMpCiB7CiAJaW50IGVyciA9IC1FTk9CVUZTOwogCkBAIC0xNTIsNzkgKzEyNSw0MCBAQAogCWlmIChjY2lkX29wcy0+Y2NpZF9oY190eF9zbGFiID09IE5VTEwpCiAJCWdvdG8gb3V0X2ZyZWVfcnhfc2xhYjsKIAotCWNjaWRzX3dyaXRlX2xvY2soKTsKLQllcnIgPSAtRUVYSVNUOwotCWlmIChjY2lkc1tjY2lkX29wcy0+Y2NpZF9pZF0gPT0gTlVMTCkgewotCQljY2lkc1tjY2lkX29wcy0+Y2NpZF9pZF0gPSBjY2lkX29wczsKLQkJZXJyID0gMDsKLQl9Ci0JY2NpZHNfd3JpdGVfdW5sb2NrKCk7Ci0JaWYgKGVyciAhPSAwKQotCQlnb3RvIG91dF9mcmVlX3R4X3NsYWI7Ci0KLQlwcl9pbmZvKCJDQ0lEOiBSZWdpc3RlcmVkIENDSUQgJWQgKCVzKVxuIiwKKwlwcl9pbmZvKCJDQ0lEOiBBY3RpdmF0ZWQgQ0NJRCAlZCAoJXMpXG4iLAogCQljY2lkX29wcy0+Y2NpZF9pZCwgY2NpZF9vcHMtPmNjaWRfbmFtZSk7CisJZXJyID0gMDsKIG91dDoKIAlyZXR1cm4gZXJyOwotb3V0X2ZyZWVfdHhfc2xhYjoKLQljY2lkX2ttZW1fY2FjaGVfZGVzdHJveShjY2lkX29wcy0+Y2NpZF9oY190eF9zbGFiKTsKLQljY2lkX29wcy0+Y2NpZF9oY190eF9zbGFiID0gTlVMTDsKLQlnb3RvIG91dDsKIG91dF9mcmVlX3J4X3NsYWI6CiAJY2NpZF9rbWVtX2NhY2hlX2Rlc3Ryb3koY2NpZF9vcHMtPmNjaWRfaGNfcnhfc2xhYik7CiAJY2NpZF9vcHMtPmNjaWRfaGNfcnhfc2xhYiA9IE5VTEw7CiAJZ290byBvdXQ7CiB9CiAKLUVYUE9SVF9TWU1CT0xfR1BMKGNjaWRfcmVnaXN0ZXIpOwotCi1pbnQgY2NpZF91bnJlZ2lzdGVyKHN0cnVjdCBjY2lkX29wZXJhdGlvbnMgKmNjaWRfb3BzKQorc3RhdGljIHZvaWQgY2NpZF9kZWFjdGl2YXRlKHN0cnVjdCBjY2lkX29wZXJhdGlvbnMgKmNjaWRfb3BzKQogewotCWNjaWRzX3dyaXRlX2xvY2soKTsKLQljY2lkc1tjY2lkX29wcy0+Y2NpZF9pZF0gPSBOVUxMOwotCWNjaWRzX3dyaXRlX3VubG9jaygpOwotCiAJY2NpZF9rbWVtX2NhY2hlX2Rlc3Ryb3koY2NpZF9vcHMtPmNjaWRfaGNfdHhfc2xhYik7CiAJY2NpZF9vcHMtPmNjaWRfaGNfdHhfc2xhYiA9IE5VTEw7CiAJY2NpZF9rbWVtX2NhY2hlX2Rlc3Ryb3koY2NpZF9vcHMtPmNjaWRfaGNfcnhfc2xhYik7CiAJY2NpZF9vcHMtPmNjaWRfaGNfcnhfc2xhYiA9IE5VTEw7CiAKLQlwcl9pbmZvKCJDQ0lEOiBVbnJlZ2lzdGVyZWQgQ0NJRCAlZCAoJXMpXG4iLAorCXByX2luZm8oIkNDSUQ6IERlYWN0aXZhdGVkIENDSUQgJWQgKCVzKVxuIiwKIAkJY2NpZF9vcHMtPmNjaWRfaWQsIGNjaWRfb3BzLT5jY2lkX25hbWUpOwotCXJldHVybiAwOwogfQogCi1FWFBPUlRfU1lNQk9MX0dQTChjY2lkX3VucmVnaXN0ZXIpOwotCi1zdHJ1Y3QgY2NpZCAqY2NpZF9uZXcodW5zaWduZWQgY2hhciBpZCwgc3RydWN0IHNvY2sgKnNrLCBpbnQgcngsIGdmcF90IGdmcCkKK3N0cnVjdCBjY2lkICpjY2lkX25ldyhjb25zdCB1OCBpZCwgc3RydWN0IHNvY2sgKnNrLCBib29sIHJ4KQogewotCXN0cnVjdCBjY2lkX29wZXJhdGlvbnMgKmNjaWRfb3BzOworCXN0cnVjdCBjY2lkX29wZXJhdGlvbnMgKmNjaWRfb3BzID0gY2NpZF9ieV9udW1iZXIoaWQpOwogCXN0cnVjdCBjY2lkICpjY2lkID0gTlVMTDsKIAotCWNjaWRzX3JlYWRfbG9jaygpOwotI2lmZGVmIENPTkZJR19NT0RVTEVTCi0JaWYgKGNjaWRzW2lkXSA9PSBOVUxMKSB7Ci0JCS8qIFdlIG9ubHkgdHJ5IHRvIGxvYWQgaWYgaW4gcHJvY2VzcyBjb250ZXh0ICovCi0JCWNjaWRzX3JlYWRfdW5sb2NrKCk7Ci0JCWlmIChnZnAgJiBHRlBfQVRPTUlDKQotCQkJZ290byBvdXQ7Ci0JCXJlcXVlc3RfbW9kdWxlKCJuZXQtZGNjcC1jY2lkLSVkIiwgaWQpOwotCQljY2lkc19yZWFkX2xvY2soKTsKLQl9Ci0jZW5kaWYKLQljY2lkX29wcyA9IGNjaWRzW2lkXTsKIAlpZiAoY2NpZF9vcHMgPT0gTlVMTCkKLQkJZ290byBvdXRfdW5sb2NrOwotCi0JaWYgKCF0cnlfbW9kdWxlX2dldChjY2lkX29wcy0+Y2NpZF9vd25lcikpCi0JCWdvdG8gb3V0X3VubG9jazsKLQotCWNjaWRzX3JlYWRfdW5sb2NrKCk7CisJCWdvdG8gb3V0OwogCiAJY2NpZCA9IGttZW1fY2FjaGVfYWxsb2MocnggPyBjY2lkX29wcy0+Y2NpZF9oY19yeF9zbGFiIDoKLQkJCQkgICAgIGNjaWRfb3BzLT5jY2lkX2hjX3R4X3NsYWIsIGdmcCk7CisJCQkJICAgICBjY2lkX29wcy0+Y2NpZF9oY190eF9zbGFiLCBnZnBfYW55KCkpOwogCWlmIChjY2lkID09IE5VTEwpCi0JCWdvdG8gb3V0X21vZHVsZV9wdXQ7CisJCWdvdG8gb3V0OwogCWNjaWQtPmNjaWRfb3BzID0gY2NpZF9vcHM7CiAJaWYgKHJ4KSB7CiAJCW1lbXNldChjY2lkICsgMSwgMCwgY2NpZF9vcHMtPmNjaWRfaGNfcnhfb2JqX3NpemUpOwpAQCAtMjM5LDUzICsxNzMsNTcgQEAKIAl9CiBvdXQ6CiAJcmV0dXJuIGNjaWQ7Ci1vdXRfdW5sb2NrOgotCWNjaWRzX3JlYWRfdW5sb2NrKCk7Ci0JZ290byBvdXQ7CiBvdXRfZnJlZV9jY2lkOgogCWttZW1fY2FjaGVfZnJlZShyeCA/IGNjaWRfb3BzLT5jY2lkX2hjX3J4X3NsYWIgOgogCQkJY2NpZF9vcHMtPmNjaWRfaGNfdHhfc2xhYiwgY2NpZCk7CiAJY2NpZCA9IE5VTEw7Ci1vdXRfbW9kdWxlX3B1dDoKLQltb2R1bGVfcHV0KGNjaWRfb3BzLT5jY2lkX293bmVyKTsKIAlnb3RvIG91dDsKIH0KIAotRVhQT1JUX1NZTUJPTF9HUEwoY2NpZF9uZXcpOwotCi1zdGF0aWMgdm9pZCBjY2lkX2RlbGV0ZShzdHJ1Y3QgY2NpZCAqY2NpZCwgc3RydWN0IHNvY2sgKnNrLCBpbnQgcngpCi17Ci0Jc3RydWN0IGNjaWRfb3BlcmF0aW9ucyAqY2NpZF9vcHM7Ci0KLQlpZiAoY2NpZCA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQljY2lkX29wcyA9IGNjaWQtPmNjaWRfb3BzOwotCWlmIChyeCkgewotCQlpZiAoY2NpZF9vcHMtPmNjaWRfaGNfcnhfZXhpdCAhPSBOVUxMKQotCQkJY2NpZF9vcHMtPmNjaWRfaGNfcnhfZXhpdChzayk7Ci0JCWttZW1fY2FjaGVfZnJlZShjY2lkX29wcy0+Y2NpZF9oY19yeF9zbGFiLCAgY2NpZCk7Ci0JfSBlbHNlIHsKLQkJaWYgKGNjaWRfb3BzLT5jY2lkX2hjX3R4X2V4aXQgIT0gTlVMTCkKLQkJCWNjaWRfb3BzLT5jY2lkX2hjX3R4X2V4aXQoc2spOwotCQlrbWVtX2NhY2hlX2ZyZWUoY2NpZF9vcHMtPmNjaWRfaGNfdHhfc2xhYiwgIGNjaWQpOwotCX0KLQljY2lkc19yZWFkX2xvY2soKTsKLQlpZiAoY2NpZHNbY2NpZF9vcHMtPmNjaWRfaWRdICE9IE5VTEwpCi0JCW1vZHVsZV9wdXQoY2NpZF9vcHMtPmNjaWRfb3duZXIpOwotCWNjaWRzX3JlYWRfdW5sb2NrKCk7Ci19Ci0KIHZvaWQgY2NpZF9oY19yeF9kZWxldGUoc3RydWN0IGNjaWQgKmNjaWQsIHN0cnVjdCBzb2NrICpzaykKIHsKLQljY2lkX2RlbGV0ZShjY2lkLCBzaywgMSk7CisJaWYgKGNjaWQgIT0gTlVMTCkgeworCQlpZiAoY2NpZC0+Y2NpZF9vcHMtPmNjaWRfaGNfcnhfZXhpdCAhPSBOVUxMKQorCQkJY2NpZC0+Y2NpZF9vcHMtPmNjaWRfaGNfcnhfZXhpdChzayk7CisJCWttZW1fY2FjaGVfZnJlZShjY2lkLT5jY2lkX29wcy0+Y2NpZF9oY19yeF9zbGFiLCBjY2lkKTsKKwl9CiB9CiAKLUVYUE9SVF9TWU1CT0xfR1BMKGNjaWRfaGNfcnhfZGVsZXRlKTsKLQogdm9pZCBjY2lkX2hjX3R4X2RlbGV0ZShzdHJ1Y3QgY2NpZCAqY2NpZCwgc3RydWN0IHNvY2sgKnNrKQogewotCWNjaWRfZGVsZXRlKGNjaWQsIHNrLCAwKTsKKwlpZiAoY2NpZCAhPSBOVUxMKSB7CisJCWlmIChjY2lkLT5jY2lkX29wcy0+Y2NpZF9oY190eF9leGl0ICE9IE5VTEwpCisJCQljY2lkLT5jY2lkX29wcy0+Y2NpZF9oY190eF9leGl0KHNrKTsKKwkJa21lbV9jYWNoZV9mcmVlKGNjaWQtPmNjaWRfb3BzLT5jY2lkX2hjX3R4X3NsYWIsIGNjaWQpOworCX0KIH0KIAotRVhQT1JUX1NZTUJPTF9HUEwoY2NpZF9oY190eF9kZWxldGUpOworaW50IF9faW5pdCBjY2lkX2luaXRpYWxpemVfYnVpbHRpbnModm9pZCkKK3sKKwlpbnQgaSwgZXJyID0gdGZyY19saWJfaW5pdCgpOworCisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNjaWRzKTsgaSsrKSB7CisJCWVyciA9IGNjaWRfYWN0aXZhdGUoY2NpZHNbaV0pOworCQlpZiAoZXJyKQorCQkJZ290byB1bndpbmRfcmVnaXN0cmF0aW9uczsKKwl9CisJcmV0dXJuIDA7CisKK3Vud2luZF9yZWdpc3RyYXRpb25zOgorCXdoaWxlKC0taSA+PSAwKQorCQljY2lkX2RlYWN0aXZhdGUoY2NpZHNbaV0pOworCXRmcmNfbGliX2V4aXQoKTsKKwlyZXR1cm4gZXJyOworfQorCit2b2lkIGNjaWRfY2xlYW51cF9idWlsdGlucyh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2NpZHMpOyBpKyspCisJCWNjaWRfZGVhY3RpdmF0ZShjY2lkc1tpXSk7CisJdGZyY19saWJfZXhpdCgpOworfQpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvY2NpZC5oIGIvbmV0L2RjY3AvY2NpZC5oCmluZGV4IDE4ZjY5NDIzLi5mYWNlZGQyIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9jY2lkLmgKKysrIGIvbmV0L2RjY3AvY2NpZC5oCkBAIC0yOSw3ICsyOSw2IEBACiAgKiAgQGNjaWRfaWQ6IG51bWVyaWNhbCBDQ0lEIElEICh1cCB0byAlQ0NJRF9NQVgsIGNmLiB0YWJsZSA1IGluIFJGQyA0MzQwLCAxMC4pCiAgKiAgQGNjaWRfY2NtcHM6IHRoZSBDQ01QUyBpbmNsdWRpbmcgbmV0d29yay90cmFuc3BvcnQgaGVhZGVycyAoMCB3aGVuIGRpc2FibGVkKQogICogIEBjY2lkX25hbWU6IGFscGhhYmV0aWNhbCBpZGVudGlmaWVyIHN0cmluZyBmb3IgQGNjaWRfaWQKLSAqICBAY2NpZF9vd25lcjogbW9kdWxlIHdoaWNoIGltcGxlbWVudHMvb3ducyB0aGlzIENDSUQKICAqICBAY2NpZF9oY197cix0fXhfc2xhYjogbWVtb3J5IHBvb2wgZm9yIHRoZSByZWNlaXZlci9zZW5kZXIgaGFsZi1jb25uZWN0aW9uCiAgKiAgQGNjaWRfaGNfe3IsdH14X29ial9zaXplOiBzaXplIG9mIHRoZSByZWNlaXZlci9zZW5kZXIgaGFsZi1jb25uZWN0aW9uIHNvY2tldAogICoKQEAgLTQ4LDcgKzQ3LDYgQEAKIAl1bnNpZ25lZCBjaGFyCQljY2lkX2lkOwogCV9fdTMyCQkJY2NpZF9jY21wczsKIAljb25zdCBjaGFyCQkqY2NpZF9uYW1lOwotCXN0cnVjdCBtb2R1bGUJCSpjY2lkX293bmVyOwogCXN0cnVjdCBrbWVtX2NhY2hlCSpjY2lkX2hjX3J4X3NsYWIsCiAJCQkJKmNjaWRfaGNfdHhfc2xhYjsKIAlfX3UzMgkJCWNjaWRfaGNfcnhfb2JqX3NpemUsCkBAIC05MCw4ICs4OCwxMyBAQAogCQkJCQkJIGludCBfX3VzZXIgKm9wdGxlbik7CiB9OwogCi1leHRlcm4gaW50IGNjaWRfcmVnaXN0ZXIoc3RydWN0IGNjaWRfb3BlcmF0aW9ucyAqY2NpZF9vcHMpOwotZXh0ZXJuIGludCBjY2lkX3VucmVnaXN0ZXIoc3RydWN0IGNjaWRfb3BlcmF0aW9ucyAqY2NpZF9vcHMpOworZXh0ZXJuIHN0cnVjdCBjY2lkX29wZXJhdGlvbnMgY2NpZDJfb3BzOworI2lmZGVmIENPTkZJR19JUF9EQ0NQX0NDSUQzCitleHRlcm4gc3RydWN0IGNjaWRfb3BlcmF0aW9ucyBjY2lkM19vcHM7CisjZW5kaWYKKworZXh0ZXJuIGludCAgY2NpZF9pbml0aWFsaXplX2J1aWx0aW5zKHZvaWQpOworZXh0ZXJuIHZvaWQgY2NpZF9jbGVhbnVwX2J1aWx0aW5zKHZvaWQpOwogCiBzdHJ1Y3QgY2NpZCB7CiAJc3RydWN0IGNjaWRfb3BlcmF0aW9ucyAqY2NpZF9vcHM7CkBAIC0xMDgsOCArMTExLDcgQEAKIGV4dGVybiBpbnQgIGNjaWRfZ2V0c29ja29wdF9idWlsdGluX2NjaWRzKHN0cnVjdCBzb2NrICpzaywgaW50IGxlbiwKIAkJCQkJICBjaGFyIF9fdXNlciAqLCBpbnQgX191c2VyICopOwogCi1leHRlcm4gc3RydWN0IGNjaWQgKmNjaWRfbmV3KHVuc2lnbmVkIGNoYXIgaWQsIHN0cnVjdCBzb2NrICpzaywgaW50IHJ4LAotCQkJICAgICBnZnBfdCBnZnApOworZXh0ZXJuIHN0cnVjdCBjY2lkICpjY2lkX25ldyhjb25zdCB1OCBpZCwgc3RydWN0IHNvY2sgKnNrLCBib29sIHJ4KTsKIAogc3RhdGljIGlubGluZSBpbnQgY2NpZF9nZXRfY3VycmVudF9yeF9jY2lkKHN0cnVjdCBkY2NwX3NvY2sgKmRwKQogewpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvY2NpZHMvS2NvbmZpZyBiL25ldC9kY2NwL2NjaWRzL0tjb25maWcKaW5kZXggMTIyNzU5NC4uYjI4YmY5NiAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvY2NpZHMvS2NvbmZpZworKysgYi9uZXQvZGNjcC9jY2lkcy9LY29uZmlnCkBAIC0xLDgwICsxLDUxIEBACiBtZW51ICJEQ0NQIENDSURzIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKIAotY29uZmlnIElQX0RDQ1BfQ0NJRDIKLQl0cmlzdGF0ZSAiQ0NJRDIgKFRDUC1MaWtlKSAoRVhQRVJJTUVOVEFMKSIKLQlkZWZfdHJpc3RhdGUgSVBfRENDUAotCXNlbGVjdCBJUF9EQ0NQX0FDS1ZFQwotCS0tLWhlbHAtLS0KLQkgIENDSUQgMiwgVENQLWxpa2UgQ29uZ2VzdGlvbiBDb250cm9sLCBkZW5vdGVzIEFkZGl0aXZlIEluY3JlYXNlLAotCSAgTXVsdGlwbGljYXRpdmUgRGVjcmVhc2UgKEFJTUQpIGNvbmdlc3Rpb24gY29udHJvbCB3aXRoIGJlaGF2aW9yCi0JICBtb2RlbGxlZCBkaXJlY3RseSBvbiBUQ1AsIGluY2x1ZGluZyBjb25nZXN0aW9uIHdpbmRvdywgc2xvdyBzdGFydCwKLQkgIHRpbWVvdXRzLCBhbmQgc28gZm9ydGggW1JGQyAyNTgxXS4gIENDSUQgMiBhY2hpZXZlcyBtYXhpbXVtCi0JICBiYW5kd2lkdGggb3ZlciB0aGUgbG9uZyB0ZXJtLCBjb25zaXN0ZW50IHdpdGggdGhlIHVzZSBvZiBlbmQtdG8tZW5kCi0JICBjb25nZXN0aW9uIGNvbnRyb2wsIGJ1dCBoYWx2ZXMgaXRzIGNvbmdlc3Rpb24gd2luZG93IGluIHJlc3BvbnNlIHRvCi0JICBlYWNoIGNvbmdlc3Rpb24gZXZlbnQuICBUaGlzIGxlYWRzIHRvIHRoZSBhYnJ1cHQgcmF0ZSBjaGFuZ2VzCi0JICB0eXBpY2FsIG9mIFRDUC4gIEFwcGxpY2F0aW9ucyBzaG91bGQgdXNlIENDSUQgMiBpZiB0aGV5IHByZWZlcgotCSAgbWF4aW11bSBiYW5kd2lkdGggdXRpbGl6YXRpb24gdG8gc3RlYWRpbmVzcyBvZiByYXRlLiAgVGhpcyBpcyBvZnRlbgotCSAgdGhlIGNhc2UgZm9yIGFwcGxpY2F0aW9ucyB0aGF0IGFyZSBub3QgcGxheWluZyB0aGVpciBkYXRhIGRpcmVjdGx5Ci0JICB0byB0aGUgdXNlci4gIEZvciBleGFtcGxlLCBhIGh5cG90aGV0aWNhbCBhcHBsaWNhdGlvbiB0aGF0Ci0JICB0cmFuc2ZlcnJlZCBmaWxlcyBvdmVyIERDQ1AsIHVzaW5nIGFwcGxpY2F0aW9uLWxldmVsIHJldHJhbnNtaXNzaW9ucwotCSAgZm9yIGxvc3QgcGFja2V0cywgd291bGQgcHJlZmVyIENDSUQgMiB0byBDQ0lEIDMuICBPbi1saW5lIGdhbWVzIG1heQotCSAgYWxzbyBwcmVmZXIgQ0NJRCAyLiAgU2VlIFJGQyA0MzQxIGZvciBmdXJ0aGVyIGRldGFpbHMuCi0KLQkgIENDSUQyIGlzIHRoZSBkZWZhdWx0IENDSUQgdXNlZCBieSBEQ0NQLgotCiBjb25maWcgSVBfRENDUF9DQ0lEMl9ERUJVRwotCSAgYm9vbCAiQ0NJRDIgZGVidWdnaW5nIG1lc3NhZ2VzIgotCSAgZGVwZW5kcyBvbiBJUF9EQ0NQX0NDSUQyCi0JICAtLS1oZWxwLS0tCi0JICAgIEVuYWJsZSBDQ0lEMi1zcGVjaWZpYyBkZWJ1Z2dpbmcgbWVzc2FnZXMuCisJYm9vbCAiQ0NJRC0yIGRlYnVnZ2luZyBtZXNzYWdlcyIKKwktLS1oZWxwLS0tCisJICBFbmFibGUgQ0NJRC0yIHNwZWNpZmljIGRlYnVnZ2luZyBtZXNzYWdlcy4KIAotCSAgICBXaGVuIGNvbXBpbGluZyBDQ0lEMiBhcyBhIG1vZHVsZSwgdGhpcyBkZWJ1Z2dpbmcgb3V0cHV0IGNhbgotCSAgICBhZGRpdGlvbmFsbHkgYmUgdG9nZ2xlZCBieSBzZXR0aW5nIHRoZSBjY2lkMl9kZWJ1ZyBtb2R1bGUKLQkgICAgcGFyYW1ldGVyIHRvIDAgb3IgMS4KKwkgIFRoZSBkZWJ1Z2dpbmcgb3V0cHV0IGNhbiBhZGRpdGlvbmFsbHkgYmUgdG9nZ2xlZCBieSBzZXR0aW5nIHRoZQorCSAgY2NpZDJfZGVidWcgcGFyYW1ldGVyIHRvIDAgb3IgMS4KIAotCSAgICBJZiBpbiBkb3VidCwgc2F5IE4uCisJICBJZiBpbiBkb3VidCwgc2F5IE4uCiAKIGNvbmZpZyBJUF9EQ0NQX0NDSUQzCi0JdHJpc3RhdGUgIkNDSUQzIChUQ1AtRnJpZW5kbHkpIChFWFBFUklNRU5UQUwpIgotCWRlZl90cmlzdGF0ZSBJUF9EQ0NQCi0Jc2VsZWN0IElQX0RDQ1BfVEZSQ19MSUIKKwlib29sICJDQ0lELTMgKFRDUC1GcmllbmRseSkgKEVYUEVSSU1FTlRBTCkiCisJZGVmX2Jvb2wgeSBpZiAoSVBfRENDUCA9IHkgfHwgSVBfRENDUCA9IG0pCiAJLS0taGVscC0tLQotCSAgQ0NJRCAzIGRlbm90ZXMgVENQLUZyaWVuZGx5IFJhdGUgQ29udHJvbCAoVEZSQyksIGFuIGVxdWF0aW9uLWJhc2VkCisJICBDQ0lELTMgZGVub3RlcyBUQ1AtRnJpZW5kbHkgUmF0ZSBDb250cm9sIChURlJDKSwgYW4gZXF1YXRpb24tYmFzZWQKIAkgIHJhdGUtY29udHJvbGxlZCBjb25nZXN0aW9uIGNvbnRyb2wgbWVjaGFuaXNtLiAgVEZSQyBpcyBkZXNpZ25lZCB0bwogCSAgYmUgcmVhc29uYWJseSBmYWlyIHdoZW4gY29tcGV0aW5nIGZvciBiYW5kd2lkdGggd2l0aCBUQ1AtbGlrZSBmbG93cywKIAkgIHdoZXJlIGEgZmxvdyBpcyAicmVhc29uYWJseSBmYWlyIiBpZiBpdHMgc2VuZGluZyByYXRlIGlzIGdlbmVyYWxseQogCSAgd2l0aGluIGEgZmFjdG9yIG9mIHR3byBvZiB0aGUgc2VuZGluZyByYXRlIG9mIGEgVENQIGZsb3cgdW5kZXIgdGhlCiAJICBzYW1lIGNvbmRpdGlvbnMuICBIb3dldmVyLCBURlJDIGhhcyBhIG11Y2ggbG93ZXIgdmFyaWF0aW9uIG9mCi0JICB0aHJvdWdocHV0IG92ZXIgdGltZSBjb21wYXJlZCB3aXRoIFRDUCwgd2hpY2ggbWFrZXMgQ0NJRCAzIG1vcmUKLQkgIHN1aXRhYmxlIHRoYW4gQ0NJRCAyIGZvciBhcHBsaWNhdGlvbnMgc3VjaCBzdHJlYW1pbmcgbWVkaWEgd2hlcmUgYQorCSAgdGhyb3VnaHB1dCBvdmVyIHRpbWUgY29tcGFyZWQgd2l0aCBUQ1AsIHdoaWNoIG1ha2VzIENDSUQtMyBtb3JlCisJICBzdWl0YWJsZSB0aGFuIENDSUQtMiBmb3IgYXBwbGljYXRpb25zIHN1Y2ggc3RyZWFtaW5nIG1lZGlhIHdoZXJlIGEKIAkgIHJlbGF0aXZlbHkgc21vb3RoIHNlbmRpbmcgcmF0ZSBpcyBvZiBpbXBvcnRhbmNlLgogCi0JICBDQ0lEIDMgaXMgZnVydGhlciBkZXNjcmliZWQgaW4gUkZDIDQzNDIsCisJICBDQ0lELTMgaXMgZnVydGhlciBkZXNjcmliZWQgaW4gUkZDIDQzNDIsCiAJICBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmM0MzQyLnR4dAogCiAJICBUaGUgVEZSQyBjb25nZXN0aW9uIGNvbnRyb2wgYWxnb3JpdGhtcyB3ZXJlIGluaXRpYWxseSBkZXNjcmliZWQgaW4KLQkgIFJGQyAzNDQ4LgorCSAgUkZDIDU0NDguCiAKIAkgIFRoaXMgdGV4dCB3YXMgZXh0cmFjdGVkIGZyb20gUkZDIDQzNDAgKHNlYy4gMTAuMiksCiAJICBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmM0MzQwLnR4dAotCSAgCi0JICBUbyBjb21waWxlIHRoaXMgQ0NJRCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCi0JICBjYWxsZWQgZGNjcF9jY2lkMy4KIAotCSAgSWYgaW4gZG91YnQsIHNheSBNLgorCSAgSWYgaW4gZG91YnQsIHNheSBOLgogCiBjb25maWcgSVBfRENDUF9DQ0lEM19ERUJVRwotCSAgYm9vbCAiQ0NJRDMgZGVidWdnaW5nIG1lc3NhZ2VzIgotCSAgZGVwZW5kcyBvbiBJUF9EQ0NQX0NDSUQzCi0JICAtLS1oZWxwLS0tCi0JICAgIEVuYWJsZSBDQ0lEMy1zcGVjaWZpYyBkZWJ1Z2dpbmcgbWVzc2FnZXMuCisJYm9vbCAiQ0NJRC0zIGRlYnVnZ2luZyBtZXNzYWdlcyIKKwlkZXBlbmRzIG9uIElQX0RDQ1BfQ0NJRDMKKwktLS1oZWxwLS0tCisJICBFbmFibGUgQ0NJRC0zIHNwZWNpZmljIGRlYnVnZ2luZyBtZXNzYWdlcy4KIAotCSAgICBXaGVuIGNvbXBpbGluZyBDQ0lEMyBhcyBhIG1vZHVsZSwgdGhpcyBkZWJ1Z2dpbmcgb3V0cHV0IGNhbgotCSAgICBhZGRpdGlvbmFsbHkgYmUgdG9nZ2xlZCBieSBzZXR0aW5nIHRoZSBjY2lkM19kZWJ1ZyBtb2R1bGUKLQkgICAgcGFyYW1ldGVyIHRvIDAgb3IgMS4KKwkgIFRoZSBkZWJ1Z2dpbmcgb3V0cHV0IGNhbiBhZGRpdGlvbmFsbHkgYmUgdG9nZ2xlZCBieSBzZXR0aW5nIHRoZQorCSAgY2NpZDNfZGVidWcgcGFyYW1ldGVyIHRvIDAgb3IgMS4KIAotCSAgICBJZiBpbiBkb3VidCwgc2F5IE4uCisJICBJZiBpbiBkb3VidCwgc2F5IE4uCiAKIGNvbmZpZyBJUF9EQ0NQX0NDSUQzX1JUTwogCSAgaW50ICJVc2UgaGlnaGVyIGJvdW5kIGZvciBub2ZlZWRiYWNrIHRpbWVyIgpAQCAtMTA4LDEyICs3OSw4IEBACiAJICAgIHRoZXJlZm9yZSBub3QgYmUgcGVyZm9ybWVkIG9uIFdBTnMuCiAKIGNvbmZpZyBJUF9EQ0NQX1RGUkNfTElCCi0JdHJpc3RhdGUKLQlkZWZhdWx0IG4KKwlkZWZfYm9vbCB5IGlmIElQX0RDQ1BfQ0NJRDMKIAogY29uZmlnIElQX0RDQ1BfVEZSQ19ERUJVRwotCWJvb2wKLQlkZXBlbmRzIG9uIElQX0RDQ1BfVEZSQ19MSUIKLQlkZWZhdWx0IHkgaWYgSVBfRENDUF9DQ0lEM19ERUJVRwotCisJZGVmX2Jvb2wgeSBpZiBJUF9EQ0NQX0NDSUQzX0RFQlVHCiBlbmRtZW51CmRpZmYgLS1naXQgYS9uZXQvZGNjcC9jY2lkcy9NYWtlZmlsZSBiL25ldC9kY2NwL2NjaWRzL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzhmMjBiLi4wMDAwMDAwCi0tLSBhL25ldC9kY2NwL2NjaWRzL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1vYmotJChDT05GSUdfSVBfRENDUF9DQ0lEMykgKz0gZGNjcF9jY2lkMy5vCi0KLWRjY3BfY2NpZDMteSA6PSBjY2lkMy5vCi0KLW9iai0kKENPTkZJR19JUF9EQ0NQX0NDSUQyKSArPSBkY2NwX2NjaWQyLm8KLQotZGNjcF9jY2lkMi15IDo9IGNjaWQyLm8KLQotb2JqLXkgKz0gbGliLwpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvY2NpZHMvY2NpZDIuYyBiL25ldC9kY2NwL2NjaWRzL2NjaWQyLmMKaW5kZXggYzllYTE5YS4uZDIzNTI5NCAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvY2NpZHMvY2NpZDIuYworKysgYi9uZXQvZGNjcC9jY2lkcy9jY2lkMi5jCkBAIC03NjgsMTAgKzc2OCw5IEBACiAJfQogfQogCi1zdGF0aWMgc3RydWN0IGNjaWRfb3BlcmF0aW9ucyBjY2lkMiA9IHsKK3N0cnVjdCBjY2lkX29wZXJhdGlvbnMgY2NpZDJfb3BzID0gewogCS5jY2lkX2lkCQk9IERDQ1BDX0NDSUQyLAogCS5jY2lkX25hbWUJCT0gIlRDUC1saWtlIiwKLQkuY2NpZF9vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuY2NpZF9oY190eF9vYmpfc2l6ZQk9IHNpemVvZihzdHJ1Y3QgY2NpZDJfaGNfdHhfc29jayksCiAJLmNjaWRfaGNfdHhfaW5pdAk9IGNjaWQyX2hjX3R4X2luaXQsCiAJLmNjaWRfaGNfdHhfZXhpdAk9IGNjaWQyX2hjX3R4X2V4aXQsCkBAIC03ODQsMjIgKzc4Myw1IEBACiAKICNpZmRlZiBDT05GSUdfSVBfRENDUF9DQ0lEMl9ERUJVRwogbW9kdWxlX3BhcmFtKGNjaWQyX2RlYnVnLCBib29sLCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoY2NpZDJfZGVidWcsICJFbmFibGUgZGVidWcgbWVzc2FnZXMiKTsKK01PRFVMRV9QQVJNX0RFU0MoY2NpZDJfZGVidWcsICJFbmFibGUgQ0NJRC0yIGRlYnVnIG1lc3NhZ2VzIik7CiAjZW5kaWYKLQotc3RhdGljIF9faW5pdCBpbnQgY2NpZDJfbW9kdWxlX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gY2NpZF9yZWdpc3RlcigmY2NpZDIpOwotfQotbW9kdWxlX2luaXQoY2NpZDJfbW9kdWxlX2luaXQpOwotCi1zdGF0aWMgX19leGl0IHZvaWQgY2NpZDJfbW9kdWxlX2V4aXQodm9pZCkKLXsKLQljY2lkX3VucmVnaXN0ZXIoJmNjaWQyKTsKLX0KLW1vZHVsZV9leGl0KGNjaWQyX21vZHVsZV9leGl0KTsKLQotTU9EVUxFX0FVVEhPUigiQW5kcmVhIEJpdHRhdSA8YS5iaXR0YXVAY3MudWNsLmFjLnVrPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJEQ0NQIFRDUC1MaWtlIChDQ0lEMikgQ0NJRCIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FMSUFTKCJuZXQtZGNjcC1jY2lkLTIiKTsKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2NjaWRzL2NjaWQzLmMgYi9uZXQvZGNjcC9jY2lkcy9jY2lkMy5jCmluZGV4IDNiOGJkN2MuLmEyN2I3ZjQgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2NjaWRzL2NjaWQzLmMKKysrIGIvbmV0L2RjY3AvY2NpZHMvY2NpZDMuYwpAQCAtOTQwLDEwICs5NDAsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGNjaWRfb3BlcmF0aW9ucyBjY2lkMyA9IHsKK3N0cnVjdCBjY2lkX29wZXJhdGlvbnMgY2NpZDNfb3BzID0gewogCS5jY2lkX2lkCQkgICA9IERDQ1BDX0NDSUQzLAogCS5jY2lkX25hbWUJCSAgID0gIlRDUC1GcmllbmRseSBSYXRlIENvbnRyb2wiLAotCS5jY2lkX293bmVyCQkgICA9IFRISVNfTU9EVUxFLAogCS5jY2lkX2hjX3R4X29ial9zaXplCSAgID0gc2l6ZW9mKHN0cnVjdCBjY2lkM19oY190eF9zb2NrKSwKIAkuY2NpZF9oY190eF9pbml0CSAgID0gY2NpZDNfaGNfdHhfaW5pdCwKIAkuY2NpZF9oY190eF9leGl0CSAgID0gY2NpZDNfaGNfdHhfZXhpdCwKQEAgLTk2NCwyMyArOTYzLDUgQEAKIAogI2lmZGVmIENPTkZJR19JUF9EQ0NQX0NDSUQzX0RFQlVHCiBtb2R1bGVfcGFyYW0oY2NpZDNfZGVidWcsIGJvb2wsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhjY2lkM19kZWJ1ZywgIkVuYWJsZSBkZWJ1ZyBtZXNzYWdlcyIpOworTU9EVUxFX1BBUk1fREVTQyhjY2lkM19kZWJ1ZywgIkVuYWJsZSBDQ0lELTMgZGVidWcgbWVzc2FnZXMiKTsKICNlbmRpZgotCi1zdGF0aWMgX19pbml0IGludCBjY2lkM19tb2R1bGVfaW5pdCh2b2lkKQotewotCXJldHVybiBjY2lkX3JlZ2lzdGVyKCZjY2lkMyk7Ci19Ci1tb2R1bGVfaW5pdChjY2lkM19tb2R1bGVfaW5pdCk7Ci0KLXN0YXRpYyBfX2V4aXQgdm9pZCBjY2lkM19tb2R1bGVfZXhpdCh2b2lkKQotewotCWNjaWRfdW5yZWdpc3RlcigmY2NpZDMpOwotfQotbW9kdWxlX2V4aXQoY2NpZDNfbW9kdWxlX2V4aXQpOwotCi1NT0RVTEVfQVVUSE9SKCJJYW4gTWNEb25hbGQgPGlhbi5tY2RvbmFsZEBqYW5kaS5jby5uej4sICIKLQkgICAgICAiQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGdob3N0cHJvdG9jb2xzLm5ldD4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiRENDUCBURlJDIENDSUQzIENDSUQiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BTElBUygibmV0LWRjY3AtY2NpZC0zIik7CmRpZmYgLS1naXQgYS9uZXQvZGNjcC9jY2lkcy9saWIvTWFrZWZpbGUgYi9uZXQvZGNjcC9jY2lkcy9saWIvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YzkzZTMuLjAwMDAwMDAKLS0tIGEvbmV0L2RjY3AvY2NpZHMvbGliL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1vYmotJChDT05GSUdfSVBfRENDUF9URlJDX0xJQikgKz0gZGNjcF90ZnJjX2xpYi5vCi0KLWRjY3BfdGZyY19saWIteSA6PSB0ZnJjLm8gdGZyY19lcXVhdGlvbi5vIHBhY2tldF9oaXN0b3J5Lm8gbG9zc19pbnRlcnZhbC5vCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9jY2lkcy9saWIvbG9zc19pbnRlcnZhbC5jIGIvbmV0L2RjY3AvY2NpZHMvbGliL2xvc3NfaW50ZXJ2YWwuYwppbmRleCA1YjNjZTA2Li40ZDFlNDAxIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9jY2lkcy9saWIvbG9zc19pbnRlcnZhbC5jCisrKyBiL25ldC9kY2NwL2NjaWRzL2xpYi9sb3NzX2ludGVydmFsLmMKQEAgLTYwLDcgKzYwLDYgQEAKIAkJCWxoLT5yaW5nW0xJSF9JTkRFWChsaC0+Y291bnRlcildID0gTlVMTDsKIAkJfQogfQotRVhQT1JUX1NZTUJPTF9HUEwodGZyY19saF9jbGVhbnVwKTsKIAogc3RhdGljIHZvaWQgdGZyY19saF9jYWxjX2lfbWVhbihzdHJ1Y3QgdGZyY19sb3NzX2hpc3QgKmxoKQogewpAQCAtMTIxLDcgKzEyMCw2IEBACiAKIAlyZXR1cm4gKGxoLT5pX21lYW4gPCBvbGRfaV9tZWFuKTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHRmcmNfbGhfdXBkYXRlX2lfbWVhbik7CiAKIC8qIERldGVybWluZSBpZiBgbmV3X2xvc3MnIGRvZXMgYmVnaW4gYSBuZXcgbG9zcyBpbnRlcnZhbCBbUkZDIDQzNDIsIDEwLjJdICovCiBzdGF0aWMgaW5saW5lIHU4IHRmcmNfbGhfaXNfbmV3X2xvc3Moc3RydWN0IHRmcmNfbG9zc19pbnRlcnZhbCAqY3VyLApAQCAtMTY5LDcgKzE2Nyw2IEBACiAJfQogCXJldHVybiAxOwogfQotRVhQT1JUX1NZTUJPTF9HUEwodGZyY19saF9pbnRlcnZhbF9hZGQpOwogCiBpbnQgX19pbml0IHRmcmNfbGlfaW5pdCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvY2NpZHMvbGliL3BhY2tldF9oaXN0b3J5LmMgYi9uZXQvZGNjcC9jY2lkcy9saWIvcGFja2V0X2hpc3RvcnkuYwppbmRleCA2Y2MxMDhhLi5iNzc4NWIzIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9jY2lkcy9saWIvcGFja2V0X2hpc3RvcnkuYworKysgYi9uZXQvZGNjcC9jY2lkcy9saWIvcGFja2V0X2hpc3RvcnkuYwpAQCAtOTQsNyArOTQsNiBAQAogCSpoZWFkcAkgICAgID0gZW50cnk7CiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTCh0ZnJjX3R4X2hpc3RfYWRkKTsKIAogdm9pZCB0ZnJjX3R4X2hpc3RfcHVyZ2Uoc3RydWN0IHRmcmNfdHhfaGlzdF9lbnRyeSAqKmhlYWRwKQogewpAQCAtMTA5LDcgKzEwOCw2IEBACiAKIAkqaGVhZHAgPSBOVUxMOwogfQotRVhQT1JUX1NZTUJPTF9HUEwodGZyY190eF9oaXN0X3B1cmdlKTsKIAogdTMyIHRmcmNfdHhfaGlzdF9ydHQoc3RydWN0IHRmcmNfdHhfaGlzdF9lbnRyeSAqaGVhZCwgY29uc3QgdTY0IHNlcW5vLAogCQkgICAgIGNvbnN0IGt0aW1lX3Qgbm93KQpAQCAtMTI3LDcgKzEyNSw2IEBACiAKIAlyZXR1cm4gcnR0OwogfQotRVhQT1JUX1NZTUJPTF9HUEwodGZyY190eF9oaXN0X3J0dCk7CiAKIAogLyoKQEAgLTE3Miw3ICsxNjksNiBAQAogCiAJdGZyY19yeF9oaXN0X2VudHJ5X2Zyb21fc2tiKGVudHJ5LCBza2IsIG5kcCk7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTCh0ZnJjX3J4X2hpc3RfYWRkX3BhY2tldCk7CiAKIC8qIGhhcyB0aGUgcGFja2V0IGNvbnRhaW5lZCBpbiBza2IgYmVlbiBzZWVuIGJlZm9yZT8gKi8KIGludCB0ZnJjX3J4X2hpc3RfZHVwbGljYXRlKHN0cnVjdCB0ZnJjX3J4X2hpc3QgKmgsIHN0cnVjdCBza19idWZmICpza2IpCkBAIC0xODksNyArMTg1LDYgQEAKIAogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTF9HUEwodGZyY19yeF9oaXN0X2R1cGxpY2F0ZSk7CiAKIHN0YXRpYyB2b2lkIHRmcmNfcnhfaGlzdF9zd2FwKHN0cnVjdCB0ZnJjX3J4X2hpc3QgKmgsIGNvbnN0IHU4IGEsIGNvbnN0IHU4IGIpCiB7CkBAIC0zOTAsNyArMzg1LDYgQEAKIAl9CiAJcmV0dXJuIGlzX25ld19sb3NzOwogfQotRVhQT1JUX1NZTUJPTF9HUEwodGZyY19yeF9oYW5kbGVfbG9zcyk7CiAKIGludCB0ZnJjX3J4X2hpc3RfYWxsb2Moc3RydWN0IHRmcmNfcnhfaGlzdCAqaCkKIHsKQEAgLTQxMiw3ICs0MDYsNiBAQAogCX0KIAlyZXR1cm4gLUVOT0JVRlM7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTCh0ZnJjX3J4X2hpc3RfYWxsb2MpOwogCiB2b2lkIHRmcmNfcnhfaGlzdF9wdXJnZShzdHJ1Y3QgdGZyY19yeF9oaXN0ICpoKQogewpAQCAtNDI0LDcgKzQxNyw2IEBACiAJCQloLT5yaW5nW2ldID0gTlVMTDsKIAkJfQogfQotRVhQT1JUX1NZTUJPTF9HUEwodGZyY19yeF9oaXN0X3B1cmdlKTsKIAogLyoqCiAgKiB0ZnJjX3J4X2hpc3RfcnR0X2xhc3RfcyAtIHJlZmVyZW5jZSBlbnRyeSB0byBjb21wdXRlIFJUVCBzYW1wbGVzIGFnYWluc3QKQEAgLTQ5NSw0ICs0ODcsMyBAQAogCiAJcmV0dXJuIHNhbXBsZTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHRmcmNfcnhfaGlzdF9zYW1wbGVfcnR0KTsKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2NjaWRzL2xpYi90ZnJjLmMgYi9uZXQvZGNjcC9jY2lkcy9saWIvdGZyYy5jCmluZGV4IDE4NTkxNjIuLjYwYzQxMmMgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2NjaWRzL2xpYi90ZnJjLmMKKysrIGIvbmV0L2RjY3AvY2NpZHMvbGliL3RmcmMuYwpAQCAtMSwyMCArMSwxOCBAQAogLyoKLSAqIFRGUkM6IG1haW4gbW9kdWxlIGhvbGRpbmcgdGhlIHBpZWNlcyBvZiB0aGUgVEZSQyBsaWJyYXJ5IHRvZ2V0aGVyCisgKiBURlJDIGxpYnJhcnkgaW5pdGlhbGlzYXRpb24KICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDcgVGhlIFVuaXZlcnNpdHkgb2YgQWJlcmRlZW4sIFNjb3RsYW5kLCBVSwogICogQ29weXJpZ2h0IChjKSAyMDA3IEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUByZWRoYXQuY29tPgogICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlICJ0ZnJjLmgiCiAKICNpZmRlZiBDT05GSUdfSVBfRENDUF9URlJDX0RFQlVHCiBpbnQgdGZyY19kZWJ1ZzsKIG1vZHVsZV9wYXJhbSh0ZnJjX2RlYnVnLCBib29sLCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0ModGZyY19kZWJ1ZywgIkVuYWJsZSBkZWJ1ZyBtZXNzYWdlcyIpOworTU9EVUxFX1BBUk1fREVTQyh0ZnJjX2RlYnVnLCAiRW5hYmxlIFRGUkMgZGVidWcgbWVzc2FnZXMiKTsKICNlbmRpZgogCi1zdGF0aWMgaW50IF9faW5pdCB0ZnJjX21vZHVsZV9pbml0KHZvaWQpCitpbnQgX19pbml0IHRmcmNfbGliX2luaXQodm9pZCkKIHsKIAlpbnQgcmMgPSB0ZnJjX2xpX2luaXQoKTsKIApAQCAtMzgsMTggKzM2LDkgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCB0ZnJjX21vZHVsZV9leGl0KHZvaWQpCit2b2lkIF9fZXhpdCB0ZnJjX2xpYl9leGl0KHZvaWQpCiB7CiAJdGZyY19yeF9wYWNrZXRfaGlzdG9yeV9leGl0KCk7CiAJdGZyY190eF9wYWNrZXRfaGlzdG9yeV9leGl0KCk7CiAJdGZyY19saV9leGl0KCk7CiB9Ci0KLW1vZHVsZV9pbml0KHRmcmNfbW9kdWxlX2luaXQpOwotbW9kdWxlX2V4aXQodGZyY19tb2R1bGVfZXhpdCk7Ci0KLU1PRFVMRV9BVVRIT1IoIkdlcnJpdCBSZW5rZXIgPGdlcnJpdEBlcmcuYWJkbi5hYy51az4sICIKLQkgICAgICAiSWFuIE1jRG9uYWxkIDxpYW4ubWNkb25hbGRAamFuZGkuY28ubno+LCAiCi0JICAgICAgIkFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUByZWRoYXQuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJEQ0NQIFRGUkMgbGlicmFyeSIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvY2NpZHMvbGliL3RmcmMuaCBiL25ldC9kY2NwL2NjaWRzL2xpYi90ZnJjLmgKaW5kZXggZWQ5ODU3NS4uZTk3MjBiMSAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvY2NpZHMvbGliL3RmcmMuaAorKysgYi9uZXQvZGNjcC9jY2lkcy9saWIvdGZyYy5oCkBAIC0xNyw3ICsxNyw4IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9tYXRoNjQuaD4KICNpbmNsdWRlICIuLi8uLi9kY2NwLmgiCi0vKiBpbnRlcm5hbCBpbmNsdWRlcyB0aGF0IHRoaXMgbW9kdWxlIGV4cG9ydHM6ICovCisKKy8qIGludGVybmFsIGluY2x1ZGVzIHRoYXQgdGhpcyBsaWJyYXJ5IGV4cG9ydHM6ICovCiAjaW5jbHVkZSAibG9zc19pbnRlcnZhbC5oIgogI2luY2x1ZGUgInBhY2tldF9oaXN0b3J5LmgiCiAKQEAgLTY2LDQgKzY3LDEyIEBACiAKIGV4dGVybiBpbnQgIHRmcmNfbGlfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIHRmcmNfbGlfZXhpdCh2b2lkKTsKKworI2lmZGVmIENPTkZJR19JUF9EQ0NQX1RGUkNfTElCCitleHRlcm4gaW50ICB0ZnJjX2xpYl9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgdGZyY19saWJfZXhpdCh2b2lkKTsKKyNlbHNlCisjZGVmaW5lIHRmcmNfbGliX2luaXQoKSAoMCkKKyNkZWZpbmUgdGZyY19saWJfZXhpdCgpCisjZW5kaWYKICNlbmRpZiAvKiBfVEZSQ19IXyAqLwpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvY2NpZHMvbGliL3RmcmNfZXF1YXRpb24uYyBiL25ldC9kY2NwL2NjaWRzL2xpYi90ZnJjX2VxdWF0aW9uLmMKaW5kZXggMmYyMGEyOS4uYzVkM2E5ZSAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvY2NpZHMvbGliL3RmcmNfZXF1YXRpb24uYworKysgYi9uZXQvZGNjcC9jY2lkcy9saWIvdGZyY19lcXVhdGlvbi5jCkBAIC02NTksOCArNjU5LDYgQEAKIAlyZXR1cm4gc2NhbGVkX2RpdjMyKHJlc3VsdCwgZik7CiB9CiAKLUVYUE9SVF9TWU1CT0xfR1BMKHRmcmNfY2FsY194KTsKLQogLyoqCiAgKiAgdGZyY19jYWxjX3hfcmV2ZXJzZV9sb29rdXAgIC0gIHRyeSB0byBmaW5kIHAgZ2l2ZW4gZihwKQogICoKQEAgLTY5Myw1ICs2OTEsMyBAQAogCWluZGV4ID0gdGZyY19iaW5zZWFyY2goZnZhbHVlLCAwKTsKIAlyZXR1cm4gKGluZGV4ICsgMSkgKiAxMDAwMDAwIC8gVEZSQ19DQUxDX1hfQVJSU0laRTsKIH0KLQotRVhQT1JUX1NZTUJPTF9HUEwodGZyY19jYWxjX3hfcmV2ZXJzZV9sb29rdXApOwpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvZGNjcC5oIGIvbmV0L2RjY3AvZGNjcC5oCmluZGV4IDBiYzRjOWEuLmYyMjMwZmMgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2RjY3AuaAorKysgYi9uZXQvZGNjcC9kY2NwLmgKQEAgLTQzMiwxMCArNDMyLDggQEAKIHsKIAljb25zdCBzdHJ1Y3QgZGNjcF9zb2NrICpkcCA9IGRjY3Bfc2soc2spOwogCXJldHVybiBkcC0+ZGNjcHNfdGltZXN0YW1wX2VjaG8gIT0gMCB8fAotI2lmZGVmIENPTkZJR19JUF9EQ0NQX0FDS1ZFQwogCSAgICAgICAoZHAtPmRjY3BzX2hjX3J4X2Fja3ZlYyAhPSBOVUxMICYmCiAJCWRjY3BfYWNrdmVjX3BlbmRpbmcoZHAtPmRjY3BzX2hjX3J4X2Fja3ZlYykpIHx8Ci0jZW5kaWYKIAkgICAgICAgaW5ldF9jc2tfYWNrX3NjaGVkdWxlZChzayk7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2ZlYXQuYyBiL25ldC9kY2NwL2ZlYXQuYwppbmRleCAzMGY5ZmI3Li40MTUyMzA4IDEwMDY0NAotLS0gYS9uZXQvZGNjcC9mZWF0LmMKKysrIGIvbmV0L2RjY3AvZmVhdC5jCkBAIC0zNCw3ICszNCw3IEBACiBzdGF0aWMgaW50IGRjY3BfaGRscl9jY2lkKHN0cnVjdCBzb2NrICpzaywgdTY0IGNjaWQsIGJvb2wgcngpCiB7CiAJc3RydWN0IGRjY3Bfc29jayAqZHAgPSBkY2NwX3NrKHNrKTsKLQlzdHJ1Y3QgY2NpZCAqbmV3X2NjaWQgPSBjY2lkX25ldyhjY2lkLCBzaywgcngsIGdmcF9hbnkoKSk7CisJc3RydWN0IGNjaWQgKm5ld19jY2lkID0gY2NpZF9uZXcoY2NpZCwgc2ssIHJ4KTsKIAogCWlmIChuZXdfY2NpZCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTEyMTQsOCArMTIxNCw2IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLUVYUE9SVF9TWU1CT0xfR1BMKGRjY3BfZmVhdF90eXBlbmFtZSk7Ci0KIGNvbnN0IGNoYXIgKmRjY3BfZmVhdF9uYW1lKGNvbnN0IHU4IGZlYXQpCiB7CiAJc3RhdGljIGNvbnN0IGNoYXIgKmZlYXR1cmVfbmFtZXNbXSA9IHsKQEAgLTEyNDAsNiArMTIzOCw0IEBACiAKIAlyZXR1cm4gZmVhdHVyZV9uYW1lc1tmZWF0XTsKIH0KLQotRVhQT1JUX1NZTUJPTF9HUEwoZGNjcF9mZWF0X25hbWUpOwogI2VuZGlmIC8qIENPTkZJR19JUF9EQ0NQX0RFQlVHICovCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9pbnB1dC5jIGIvbmV0L2RjY3AvaW5wdXQuYwppbmRleCA1ZWI0NDNmLi43NjQ4ZjMxIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9pbnB1dC5jCisrKyBiL25ldC9kY2NwL2lucHV0LmMKQEAgLTc0MSw1ICs3NDEsMyBAQAogCiAJcmV0dXJuIGRlbHRhOwogfQotCi1FWFBPUlRfU1lNQk9MX0dQTChkY2NwX3NhbXBsZV9ydHQpOwpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvcHJvdG8uYyBiL25ldC9kY2NwL3Byb3RvLmMKaW5kZXggMTc0N2NjYS4uOTQ1YjRkNSAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvcHJvdG8uYworKysgYi9uZXQvZGNjcC9wcm90by5jCkBAIC0xMTE4LDkgKzExMTgsMTUgQEAKIAlpZiAocmMpCiAJCWdvdG8gb3V0X2Fja3ZlY19leGl0OwogCisJcmMgPSBjY2lkX2luaXRpYWxpemVfYnVpbHRpbnMoKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0X3N5c2N0bF9leGl0OworCiAJZGNjcF90aW1lc3RhbXBpbmdfaW5pdCgpOwogb3V0OgogCXJldHVybiByYzsKK291dF9zeXNjdGxfZXhpdDoKKwlkY2NwX3N5c2N0bF9leGl0KCk7CiBvdXRfYWNrdmVjX2V4aXQ6CiAJZGNjcF9hY2t2ZWNfZXhpdCgpOwogb3V0X2ZyZWVfZGNjcF9taWI6CkBAIC0xMTQzLDYgKzExNDksNyBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZGNjcF9maW5pKHZvaWQpCiB7CisJY2NpZF9jbGVhbnVwX2J1aWx0aW5zKCk7CiAJZGNjcF9taWJfZXhpdCgpOwogCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpZGNjcF9oYXNoaW5mby5iaGFzaCwKIAkJICAgZ2V0X29yZGVyKGRjY3BfaGFzaGluZm8uYmhhc2hfc2l6ZSAqCmRpZmYgLS1naXQgYS9uZXQvZHNhL3NsYXZlLmMgYi9uZXQvZHNhL3NsYXZlLmMKaW5kZXggYTNhNDEwZC4uYTY4ZmQ3OSAxMDA2NDQKLS0tIGEvbmV0L2RzYS9zbGF2ZS5jCisrKyBiL25ldC9kc2Evc2xhdmUuYwpAQCAtMjg2LDYgKzI4Niw0MiBAQAogCS5nZXRfc3NldF9jb3VudAkJPSBkc2Ffc2xhdmVfZ2V0X3NzZXRfY291bnQsCiB9OwogCisjaWZkZWYgQ09ORklHX05FVF9EU0FfVEFHX0RTQQorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBkc2FfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JIAk9IGRzYV9zbGF2ZV9vcGVuLAorCS5uZG9fc3RvcAkJPSBkc2Ffc2xhdmVfY2xvc2UsCisJLm5kb19zdGFydF94bWl0CQk9IGRzYV94bWl0LAorCS5uZG9fY2hhbmdlX3J4X2ZsYWdzCT0gZHNhX3NsYXZlX2NoYW5nZV9yeF9mbGFncywKKwkubmRvX3NldF9yeF9tb2RlCT0gZHNhX3NsYXZlX3NldF9yeF9tb2RlLAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gZHNhX3NsYXZlX3NldF9yeF9tb2RlLAorCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gZHNhX3NsYXZlX3NldF9tYWNfYWRkcmVzcywKKwkubmRvX2RvX2lvY3RsCQk9IGRzYV9zbGF2ZV9pb2N0bCwKK307CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTkVUX0RTQV9UQUdfRURTQQorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBlZHNhX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCSAJPSBkc2Ffc2xhdmVfb3BlbiwKKwkubmRvX3N0b3AJCT0gZHNhX3NsYXZlX2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdAkJPSBlZHNhX3htaXQsCisJLm5kb19jaGFuZ2VfcnhfZmxhZ3MJPSBkc2Ffc2xhdmVfY2hhbmdlX3J4X2ZsYWdzLAorCS5uZG9fc2V0X3J4X21vZGUJPSBkc2Ffc2xhdmVfc2V0X3J4X21vZGUsCisJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBkc2Ffc2xhdmVfc2V0X3J4X21vZGUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBkc2Ffc2xhdmVfc2V0X21hY19hZGRyZXNzLAorCS5uZG9fZG9faW9jdGwJCT0gZHNhX3NsYXZlX2lvY3RsLAorfTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19ORVRfRFNBX1RBR19UUkFJTEVSCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHRyYWlsZXJfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JIAk9IGRzYV9zbGF2ZV9vcGVuLAorCS5uZG9fc3RvcAkJPSBkc2Ffc2xhdmVfY2xvc2UsCisJLm5kb19zdGFydF94bWl0CQk9IHRyYWlsZXJfeG1pdCwKKwkubmRvX2NoYW5nZV9yeF9mbGFncwk9IGRzYV9zbGF2ZV9jaGFuZ2VfcnhfZmxhZ3MsCisJLm5kb19zZXRfcnhfbW9kZQk9IGRzYV9zbGF2ZV9zZXRfcnhfbW9kZSwKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IGRzYV9zbGF2ZV9zZXRfcnhfbW9kZSwKKwkubmRvX3NldF9tYWNfYWRkcmVzcwk9IGRzYV9zbGF2ZV9zZXRfbWFjX2FkZHJlc3MsCisJLm5kb19kb19pb2N0bAkJPSBkc2Ffc2xhdmVfaW9jdGwsCit9OworI2VuZGlmCiAKIC8qIHNsYXZlIGRldmljZSBzZXR1cCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RydWN0IG5ldF9kZXZpY2UgKgpAQCAtMzA2LDMyICszNDIsMjcgQEAKIAlTRVRfRVRIVE9PTF9PUFMoc2xhdmVfZGV2LCAmZHNhX3NsYXZlX2V0aHRvb2xfb3BzKTsKIAltZW1jcHkoc2xhdmVfZGV2LT5kZXZfYWRkciwgbWFzdGVyLT5kZXZfYWRkciwgRVRIX0FMRU4pOwogCXNsYXZlX2Rldi0+dHhfcXVldWVfbGVuID0gMDsKKwogCXN3aXRjaCAoZHMtPnRhZ19wcm90b2NvbCkgewogI2lmZGVmIENPTkZJR19ORVRfRFNBX1RBR19EU0EKIAljYXNlIGh0b25zKEVUSF9QX0RTQSk6Ci0JCXNsYXZlX2Rldi0+aGFyZF9zdGFydF94bWl0ID0gZHNhX3htaXQ7CisJCXNsYXZlX2Rldi0+bmV0ZGV2X29wcyA9ICZkc2FfbmV0ZGV2X29wczsKIAkJYnJlYWs7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfTkVUX0RTQV9UQUdfRURTQQogCWNhc2UgaHRvbnMoRVRIX1BfRURTQSk6Ci0JCXNsYXZlX2Rldi0+aGFyZF9zdGFydF94bWl0ID0gZWRzYV94bWl0OworCQlzbGF2ZV9kZXYtPm5ldGRldl9vcHMgPSAmZWRzYV9uZXRkZXZfb3BzOwogCQlicmVhazsKICNlbmRpZgogI2lmZGVmIENPTkZJR19ORVRfRFNBX1RBR19UUkFJTEVSCiAJY2FzZSBodG9ucyhFVEhfUF9UUkFJTEVSKToKLQkJc2xhdmVfZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSB0cmFpbGVyX3htaXQ7CisJCXNsYXZlX2Rldi0+bmV0ZGV2X29wcyA9ICZ0cmFpbGVyX25ldGRldl9vcHM7CiAJCWJyZWFrOwogI2VuZGlmCiAJZGVmYXVsdDoKIAkJQlVHKCk7CiAJfQotCXNsYXZlX2Rldi0+b3BlbiA9IGRzYV9zbGF2ZV9vcGVuOwotCXNsYXZlX2Rldi0+c3RvcCA9IGRzYV9zbGF2ZV9jbG9zZTsKLQlzbGF2ZV9kZXYtPmNoYW5nZV9yeF9mbGFncyA9IGRzYV9zbGF2ZV9jaGFuZ2VfcnhfZmxhZ3M7Ci0Jc2xhdmVfZGV2LT5zZXRfcnhfbW9kZSA9IGRzYV9zbGF2ZV9zZXRfcnhfbW9kZTsKLQlzbGF2ZV9kZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IGRzYV9zbGF2ZV9zZXRfcnhfbW9kZTsKLQlzbGF2ZV9kZXYtPnNldF9tYWNfYWRkcmVzcyA9IGRzYV9zbGF2ZV9zZXRfbWFjX2FkZHJlc3M7Ci0Jc2xhdmVfZGV2LT5kb19pb2N0bCA9IGRzYV9zbGF2ZV9pb2N0bDsKKwogCVNFVF9ORVRERVZfREVWKHNsYXZlX2RldiwgcGFyZW50KTsKIAlzbGF2ZV9kZXYtPnZsYW5fZmVhdHVyZXMgPSBtYXN0ZXItPnZsYW5fZmVhdHVyZXM7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2NpcHNvX2lwdjQuYyBiL25ldC9pcHY0L2NpcHNvX2lwdjQuYwppbmRleCBlNTI3OTkwLi42YmIyNjM1IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9jaXBzb19pcHY0LmMKKysrIGIvbmV0L2lwdjQvY2lwc29faXB2NC5jCkBAIC0zOCw2ICszOCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9qaGFzaC5oPgorI2luY2x1ZGUgPGxpbnV4L2F1ZGl0Lmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSA8bmV0L2ljbXAuaD4KICNpbmNsdWRlIDxuZXQvdGNwLmg+CkBAIC00NDksNiArNDUwLDcgQEAKIC8qKgogICogY2lwc29fdjRfZG9pX2FkZCAtIEFkZCBhIG5ldyBET0kgdG8gdGhlIENJUFNPIHByb3RvY29sIGVuZ2luZQogICogQGRvaV9kZWY6IHRoZSBET0kgc3RydWN0dXJlCisgKiBAYXVkaXRfaW5mbzogTmV0TGFiZWwgYXVkaXQgaW5mb3JtYXRpb24KICAqCiAgKiBEZXNjcmlwdGlvbjoKICAqIFRoZSBjYWxsZXIgZGVmaW5lcyBhIG5ldyBET0kgZm9yIHVzZSBieSB0aGUgQ0lQU08gZW5naW5lIGFuZCBjYWxscyB0aGlzCkBAIC00NTgsNTAgKzQ2MCw3OCBAQAogICogemVybyBvbiBzdWNjZXNzIGFuZCBub24temVybyBvbiBmYWlsdXJlLgogICoKICAqLwotaW50IGNpcHNvX3Y0X2RvaV9hZGQoc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZikKK2ludCBjaXBzb192NF9kb2lfYWRkKHN0cnVjdCBjaXBzb192NF9kb2kgKmRvaV9kZWYsCisJCSAgICAgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbykKIHsKKwlpbnQgcmV0X3ZhbCA9IC1FSU5WQUw7CiAJdTMyIGl0ZXI7CisJdTMyIGRvaTsKKwl1MzIgZG9pX3R5cGU7CisJc3RydWN0IGF1ZGl0X2J1ZmZlciAqYXVkaXRfYnVmOworCisJZG9pID0gZG9pX2RlZi0+ZG9pOworCWRvaV90eXBlID0gZG9pX2RlZi0+dHlwZTsKIAogCWlmIChkb2lfZGVmID09IE5VTEwgfHwgZG9pX2RlZi0+ZG9pID09IENJUFNPX1Y0X0RPSV9VTktOT1dOKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJZ290byBkb2lfYWRkX3JldHVybjsKIAlmb3IgKGl0ZXIgPSAwOyBpdGVyIDwgQ0lQU09fVjRfVEFHX01BWENOVDsgaXRlcisrKSB7CiAJCXN3aXRjaCAoZG9pX2RlZi0+dGFnc1tpdGVyXSkgewogCQljYXNlIENJUFNPX1Y0X1RBR19SQklUTUFQOgogCQkJYnJlYWs7CiAJCWNhc2UgQ0lQU09fVjRfVEFHX1JBTkdFOgotCQkJaWYgKGRvaV9kZWYtPnR5cGUgIT0gQ0lQU09fVjRfTUFQX1BBU1MpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJY2FzZSBDSVBTT19WNF9UQUdfSU5WQUxJRDoKLQkJCWlmIChpdGVyID09IDApCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlicmVhazsKIAkJY2FzZSBDSVBTT19WNF9UQUdfRU5VTToKIAkJCWlmIChkb2lfZGVmLT50eXBlICE9IENJUFNPX1Y0X01BUF9QQVNTKQotCQkJCXJldHVybiAtRUlOVkFMOworCQkJCWdvdG8gZG9pX2FkZF9yZXR1cm47CiAJCQlicmVhazsKIAkJY2FzZSBDSVBTT19WNF9UQUdfTE9DQUw6CiAJCQlpZiAoZG9pX2RlZi0+dHlwZSAhPSBDSVBTT19WNF9NQVBfTE9DQUwpCi0JCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJZ290byBkb2lfYWRkX3JldHVybjsKKwkJCWJyZWFrOworCQljYXNlIENJUFNPX1Y0X1RBR19JTlZBTElEOgorCQkJaWYgKGl0ZXIgPT0gMCkKKwkJCQlnb3RvIGRvaV9hZGRfcmV0dXJuOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWdvdG8gZG9pX2FkZF9yZXR1cm47CiAJCX0KIAl9CiAKIAlhdG9taWNfc2V0KCZkb2lfZGVmLT5yZWZjb3VudCwgMSk7CiAKIAlzcGluX2xvY2soJmNpcHNvX3Y0X2RvaV9saXN0X2xvY2spOwotCWlmIChjaXBzb192NF9kb2lfc2VhcmNoKGRvaV9kZWYtPmRvaSkgIT0gTlVMTCkKLQkJZ290byBkb2lfYWRkX2ZhaWx1cmU7CisJaWYgKGNpcHNvX3Y0X2RvaV9zZWFyY2goZG9pX2RlZi0+ZG9pKSAhPSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrKCZjaXBzb192NF9kb2lfbGlzdF9sb2NrKTsKKwkJcmV0X3ZhbCA9IC1FRVhJU1Q7CisJCWdvdG8gZG9pX2FkZF9yZXR1cm47CisJfQogCWxpc3RfYWRkX3RhaWxfcmN1KCZkb2lfZGVmLT5saXN0LCAmY2lwc29fdjRfZG9pX2xpc3QpOwogCXNwaW5fdW5sb2NrKCZjaXBzb192NF9kb2lfbGlzdF9sb2NrKTsKKwlyZXRfdmFsID0gMDsKIAotCXJldHVybiAwOworZG9pX2FkZF9yZXR1cm46CisJYXVkaXRfYnVmID0gbmV0bGJsX2F1ZGl0X3N0YXJ0KEFVRElUX01BQ19DSVBTT1Y0X0FERCwgYXVkaXRfaW5mbyk7CisJaWYgKGF1ZGl0X2J1ZiAhPSBOVUxMKSB7CisJCWNvbnN0IGNoYXIgKnR5cGVfc3RyOworCQlzd2l0Y2ggKGRvaV90eXBlKSB7CisJCWNhc2UgQ0lQU09fVjRfTUFQX1RSQU5TOgorCQkJdHlwZV9zdHIgPSAidHJhbnMiOworCQkJYnJlYWs7CisJCWNhc2UgQ0lQU09fVjRfTUFQX1BBU1M6CisJCQl0eXBlX3N0ciA9ICJwYXNzIjsKKwkJCWJyZWFrOworCQljYXNlIENJUFNPX1Y0X01BUF9MT0NBTDoKKwkJCXR5cGVfc3RyID0gImxvY2FsIjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdHlwZV9zdHIgPSAiKHVua25vd24pIjsKKwkJfQorCQlhdWRpdF9sb2dfZm9ybWF0KGF1ZGl0X2J1ZiwKKwkJCQkgIiBjaXBzb19kb2k9JXUgY2lwc29fdHlwZT0lcyByZXM9JXUiLAorCQkJCSBkb2ksIHR5cGVfc3RyLCByZXRfdmFsID09IDAgPyAxIDogMCk7CisJCWF1ZGl0X2xvZ19lbmQoYXVkaXRfYnVmKTsKKwl9CiAKLWRvaV9hZGRfZmFpbHVyZToKLQlzcGluX3VubG9jaygmY2lwc29fdjRfZG9pX2xpc3RfbG9jayk7Ci0JcmV0dXJuIC1FRVhJU1Q7CisJcmV0dXJuIHJldF92YWw7CiB9CiAKIC8qKgpAQCAtNTU5LDI1ICs1ODksMzkgQEAKICAqLwogaW50IGNpcHNvX3Y0X2RvaV9yZW1vdmUodTMyIGRvaSwgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbykKIHsKKwlpbnQgcmV0X3ZhbDsKIAlzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmOworCXN0cnVjdCBhdWRpdF9idWZmZXIgKmF1ZGl0X2J1ZjsKIAogCXNwaW5fbG9jaygmY2lwc29fdjRfZG9pX2xpc3RfbG9jayk7CiAJZG9pX2RlZiA9IGNpcHNvX3Y0X2RvaV9zZWFyY2goZG9pKTsKIAlpZiAoZG9pX2RlZiA9PSBOVUxMKSB7CiAJCXNwaW5fdW5sb2NrKCZjaXBzb192NF9kb2lfbGlzdF9sb2NrKTsKLQkJcmV0dXJuIC1FTk9FTlQ7CisJCXJldF92YWwgPSAtRU5PRU5UOworCQlnb3RvIGRvaV9yZW1vdmVfcmV0dXJuOwogCX0KIAlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJmRvaV9kZWYtPnJlZmNvdW50KSkgewogCQlzcGluX3VubG9jaygmY2lwc29fdjRfZG9pX2xpc3RfbG9jayk7Ci0JCXJldHVybiAtRUJVU1k7CisJCXJldF92YWwgPSAtRUJVU1k7CisJCWdvdG8gZG9pX3JlbW92ZV9yZXR1cm47CiAJfQogCWxpc3RfZGVsX3JjdSgmZG9pX2RlZi0+bGlzdCk7CiAJc3Bpbl91bmxvY2soJmNpcHNvX3Y0X2RvaV9saXN0X2xvY2spOwogCiAJY2lwc29fdjRfY2FjaGVfaW52YWxpZGF0ZSgpOwogCWNhbGxfcmN1KCZkb2lfZGVmLT5yY3UsIGNpcHNvX3Y0X2RvaV9mcmVlX3JjdSk7CisJcmV0X3ZhbCA9IDA7CiAKLQlyZXR1cm4gMDsKK2RvaV9yZW1vdmVfcmV0dXJuOgorCWF1ZGl0X2J1ZiA9IG5ldGxibF9hdWRpdF9zdGFydChBVURJVF9NQUNfQ0lQU09WNF9ERUwsIGF1ZGl0X2luZm8pOworCWlmIChhdWRpdF9idWYgIT0gTlVMTCkgeworCQlhdWRpdF9sb2dfZm9ybWF0KGF1ZGl0X2J1ZiwKKwkJCQkgIiBjaXBzb19kb2k9JXUgcmVzPSV1IiwKKwkJCQkgZG9pLCByZXRfdmFsID09IDAgPyAxIDogMCk7CisJCWF1ZGl0X2xvZ19lbmQoYXVkaXRfYnVmKTsKKwl9CisKKwlyZXR1cm4gcmV0X3ZhbDsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3AuYyBiL25ldC9pcHY0L3RjcC5jCmluZGV4IGYyOGFjZjEuLmNlNTcyZjkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcC5jCisrKyBiL25ldC9pcHY0L3RjcC5jCkBAIC01ODAsMTAgKzU4MCw2IEBACiAJCWVsc2UgaWYgKCFyZXQpIHsKIAkJCWlmIChzcGxpY2VkKQogCQkJCWJyZWFrOwotCQkJaWYgKGZsYWdzICYgU1BMSUNFX0ZfTk9OQkxPQ0spIHsKLQkJCQlyZXQgPSAtRUFHQUlOOwotCQkJCWJyZWFrOwotCQkJfQogCQkJaWYgKHNvY2tfZmxhZyhzaywgU09DS19ET05FKSkKIAkJCQlicmVhazsKIAkJCWlmIChzay0+c2tfZXJyKSB7CkBAIC0xMzE3LDcgKzEzMTMsNyBAQAogCQlpZiAoKGF2YWlsYWJsZSA8IHRhcmdldCkgJiYKIAkJICAgIChsZW4gPiBzeXNjdGxfdGNwX2RtYV9jb3B5YnJlYWspICYmICEoZmxhZ3MgJiBNU0dfUEVFSykgJiYKIAkJICAgICFzeXNjdGxfdGNwX2xvd19sYXRlbmN5ICYmCi0JCSAgICBfX2dldF9jcHVfdmFyKHNvZnRuZXRfZGF0YSkubmV0X2RtYSkgeworCQkgICAgZG1hX2ZpbmRfY2hhbm5lbChETUFfTUVNQ1BZKSkgewogCQkJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOwogCQkJdHAtPnVjb3B5LnBpbm5lZF9saXN0ID0KIAkJCQkJZG1hX3Bpbl9pb3ZlY19wYWdlcyhtc2ctPm1zZ19pb3YsIGxlbik7CkBAIC0xNTI3LDcgKzE1MjMsNyBAQAogCQlpZiAoIShmbGFncyAmIE1TR19UUlVOQykpIHsKICNpZmRlZiBDT05GSUdfTkVUX0RNQQogCQkJaWYgKCF0cC0+dWNvcHkuZG1hX2NoYW4gJiYgdHAtPnVjb3B5LnBpbm5lZF9saXN0KQotCQkJCXRwLT51Y29weS5kbWFfY2hhbiA9IGdldF9zb2Z0bmV0X2RtYSgpOworCQkJCXRwLT51Y29weS5kbWFfY2hhbiA9IGRtYV9maW5kX2NoYW5uZWwoRE1BX01FTUNQWSk7CiAKIAkJCWlmICh0cC0+dWNvcHkuZG1hX2NoYW4pIHsKIAkJCQl0cC0+dWNvcHkuZG1hX2Nvb2tpZSA9IGRtYV9za2JfY29weV9kYXRhZ3JhbV9pb3ZlYygKQEAgLTE2MzIsNyArMTYyOCw2IEBACiAKIAkJLyogU2FmZSB0byBmcmVlIGVhcmx5LWNvcGllZCBza2JzIG5vdyAqLwogCQlfX3NrYl9xdWV1ZV9wdXJnZSgmc2stPnNrX2FzeW5jX3dhaXRfcXVldWUpOwotCQlkbWFfY2hhbl9wdXQodHAtPnVjb3B5LmRtYV9jaGFuKTsKIAkJdHAtPnVjb3B5LmRtYV9jaGFuID0gTlVMTDsKIAl9CiAJaWYgKHRwLT51Y29weS5waW5uZWRfbGlzdCkgewpAQCAtMjUxOSw5ICsyNTE0LDcgQEAKIAlmbHVzaCB8PSBtZW1jbXAodGggKyAxLCB0aDIgKyAxLCB0aGxlbiAtIHNpemVvZigqdGgpKTsKIAogCXRvdGFsID0gcC0+bGVuOwotCW1zcyA9IHRvdGFsOwotCWlmIChza2Jfc2hpbmZvKHApLT5mcmFnX2xpc3QpCi0JCW1zcyA9IHNrYl9zaGluZm8ocCktPmZyYWdfbGlzdC0+bGVuOworCW1zcyA9IHNrYl9zaGluZm8ocCktPmdzb19zaXplOwogCiAJZmx1c2ggfD0gc2tiLT5sZW4gPiBtc3MgfHwgc2tiLT5sZW4gPD0gMDsKIAlmbHVzaCB8PSBudG9obCh0aDItPnNlcSkgKyB0b3RhbCAhPSBudG9obCh0aC0+c2VxKTsKQEAgLTI1NDgsNiArMjU0MSw3IEBACiAKIAlyZXR1cm4gcHA7CiB9CitFWFBPUlRfU1lNQk9MKHRjcF9ncm9fcmVjZWl2ZSk7CiAKIGludCB0Y3BfZ3JvX2NvbXBsZXRlKHN0cnVjdCBza19idWZmICpza2IpCiB7CkBAIC0yNTU3LDcgKzI1NTEsNiBAQAogCXNrYi0+Y3N1bV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgdGNwaGRyLCBjaGVjayk7CiAJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9QQVJUSUFMOwogCi0Jc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0LT5sZW47CiAJc2tiX3NoaW5mbyhza2IpLT5nc29fc2VncyA9IE5BUElfR1JPX0NCKHNrYiktPmNvdW50OwogCiAJaWYgKHRoLT5jd3IpCkBAIC0yNTY1LDYgKzI1NTgsNyBAQAogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKHRjcF9ncm9fY29tcGxldGUpOwogCiAjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHRjcF9tZDVzaWdfdXNlcnM7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfaW5wdXQuYyBiL25ldC9pcHY0L3RjcF9pbnB1dC5jCmluZGV4IDk5YjdlY2IuLmE2OTYxZDcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9pbnB1dC5jCisrKyBiL25ldC9pcHY0L3RjcF9pbnB1dC5jCkBAIC01MDA1LDcgKzUwMDUsNyBAQAogCQlyZXR1cm4gMDsKIAogCWlmICghdHAtPnVjb3B5LmRtYV9jaGFuICYmIHRwLT51Y29weS5waW5uZWRfbGlzdCkKLQkJdHAtPnVjb3B5LmRtYV9jaGFuID0gZ2V0X3NvZnRuZXRfZG1hKCk7CisJCXRwLT51Y29weS5kbWFfY2hhbiA9IGRtYV9maW5kX2NoYW5uZWwoRE1BX01FTUNQWSk7CiAKIAlpZiAodHAtPnVjb3B5LmRtYV9jaGFuICYmIHNrYl9jc3VtX3VubmVjZXNzYXJ5KHNrYikpIHsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2lwdjQuYyBiL25ldC9pcHY0L3RjcF9pcHY0LmMKaW5kZXggOWQ4MzlmYS4uMTlkN2I0MiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2lwdjQuYworKysgYi9uZXQvaXB2NC90Y3BfaXB2NC5jCkBAIC0xNTk0LDcgKzE1OTQsNyBAQAogI2lmZGVmIENPTkZJR19ORVRfRE1BCiAJCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCQlpZiAoIXRwLT51Y29weS5kbWFfY2hhbiAmJiB0cC0+dWNvcHkucGlubmVkX2xpc3QpCi0JCQl0cC0+dWNvcHkuZG1hX2NoYW4gPSBnZXRfc29mdG5ldF9kbWEoKTsKKwkJCXRwLT51Y29weS5kbWFfY2hhbiA9IGRtYV9maW5kX2NoYW5uZWwoRE1BX01FTUNQWSk7CiAJCWlmICh0cC0+dWNvcHkuZG1hX2NoYW4pCiAJCQlyZXQgPSB0Y3BfdjRfZG9fcmN2KHNrLCBza2IpOwogCQllbHNlCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9hZl9pbmV0Ni5jIGIvbmV0L2lwdjYvYWZfaW5ldDYuYwppbmRleCA0MzdiNzUwLi45NGY3NGY1IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9hZl9pbmV0Ni5jCisrKyBiL25ldC9pcHY2L2FmX2luZXQ2LmMKQEAgLTY3Miw4ICs2NzIsNyBAQAogCiBFWFBPUlRfU1lNQk9MX0dQTChpcHY2X29wdF9hY2NlcHRlZCk7CiAKLXN0YXRpYyBzdHJ1Y3QgaW5ldDZfcHJvdG9jb2wgKmlwdjZfZ3NvX3B1bGxfZXh0aGRycyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQkJICAgIGludCBwcm90bykKK3N0YXRpYyBpbnQgaXB2Nl9nc29fcHVsbF9leHRoZHJzKHN0cnVjdCBza19idWZmICpza2IsIGludCBwcm90bykKIHsKIAlzdHJ1Y3QgaW5ldDZfcHJvdG9jb2wgKm9wcyA9IE5VTEw7CiAKQEAgLTcwNCw3ICs3MDMsNyBAQAogCQlfX3NrYl9wdWxsKHNrYiwgbGVuKTsKIAl9CiAKLQlyZXR1cm4gb3BzOworCXJldHVybiBwcm90bzsKIH0KIAogc3RhdGljIGludCBpcHY2X2dzb19zZW5kX2NoZWNrKHN0cnVjdCBza19idWZmICpza2IpCkBAIC03MjEsNyArNzIwLDkgQEAKIAllcnIgPSAtRVBST1RPTk9TVVBQT1JUOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCW9wcyA9IGlwdjZfZ3NvX3B1bGxfZXh0aGRycyhza2IsIGlwdjZoLT5uZXh0aGRyKTsKKwlvcHMgPSByY3VfZGVyZWZlcmVuY2UoaW5ldDZfcHJvdG9zWworCQlpcHY2X2dzb19wdWxsX2V4dGhkcnMoc2tiLCBpcHY2aC0+bmV4dGhkcildKTsKKwogCWlmIChsaWtlbHkob3BzICYmIG9wcy0+Z3NvX3NlbmRfY2hlY2spKSB7CiAJCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAJCWVyciA9IG9wcy0+Z3NvX3NlbmRfY2hlY2soc2tiKTsKQEAgLTc1Nyw3ICs3NTgsOSBAQAogCXNlZ3MgPSBFUlJfUFRSKC1FUFJPVE9OT1NVUFBPUlQpOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCW9wcyA9IGlwdjZfZ3NvX3B1bGxfZXh0aGRycyhza2IsIGlwdjZoLT5uZXh0aGRyKTsKKwlvcHMgPSByY3VfZGVyZWZlcmVuY2UoaW5ldDZfcHJvdG9zWworCQlpcHY2X2dzb19wdWxsX2V4dGhkcnMoc2tiLCBpcHY2aC0+bmV4dGhkcildKTsKKwogCWlmIChsaWtlbHkob3BzICYmIG9wcy0+Z3NvX3NlZ21lbnQpKSB7CiAJCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAJCXNlZ3MgPSBvcHMtPmdzb19zZWdtZW50KHNrYiwgZmVhdHVyZXMpOwpAQCAtNzc3LDExICs3ODAsMTA1IEBACiAJcmV0dXJuIHNlZ3M7CiB9CiAKK3N0cnVjdCBpcHY2X2dyb19jYiB7CisJc3RydWN0IG5hcGlfZ3JvX2NiIG5hcGk7CisJaW50IHByb3RvOworfTsKKworI2RlZmluZSBJUFY2X0dST19DQihza2IpICgoc3RydWN0IGlwdjZfZ3JvX2NiICopKHNrYiktPmNiKQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKippcHY2X2dyb19yZWNlaXZlKHN0cnVjdCBza19idWZmICoqaGVhZCwKKwkJCQkJIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGluZXQ2X3Byb3RvY29sICpvcHM7CisJc3RydWN0IHNrX2J1ZmYgKipwcCA9IE5VTEw7CisJc3RydWN0IHNrX2J1ZmYgKnA7CisJc3RydWN0IGlwdjZoZHIgKmlwaDsKKwl1bnNpZ25lZCBpbnQgbmxlbjsKKwlpbnQgZmx1c2ggPSAxOworCWludCBwcm90bzsKKworCWlmICh1bmxpa2VseSghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZigqaXBoKSkpKQorCQlnb3RvIG91dDsKKworCWlwaCA9IGlwdjZfaGRyKHNrYik7CisJX19za2JfcHVsbChza2IsIHNpemVvZigqaXBoKSk7CisKKwlmbHVzaCArPSBudG9ocyhpcGgtPnBheWxvYWRfbGVuKSAhPSBza2ItPmxlbjsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlwcm90byA9IGlwdjZfZ3NvX3B1bGxfZXh0aGRycyhza2IsIGlwaC0+bmV4dGhkcik7CisJSVBWNl9HUk9fQ0Ioc2tiKS0+cHJvdG8gPSBwcm90bzsKKwlvcHMgPSByY3VfZGVyZWZlcmVuY2UoaW5ldDZfcHJvdG9zW3Byb3RvXSk7CisJaWYgKCFvcHMgfHwgIW9wcy0+Z3JvX3JlY2VpdmUpCisJCWdvdG8gb3V0X3VubG9jazsKKworCWZsdXNoLS07CisJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKKwlubGVuID0gc2tiX25ldHdvcmtfaGVhZGVyX2xlbihza2IpOworCisJZm9yIChwID0gKmhlYWQ7IHA7IHAgPSBwLT5uZXh0KSB7CisJCXN0cnVjdCBpcHY2aGRyICppcGgyOworCisJCWlmICghTkFQSV9HUk9fQ0IocCktPnNhbWVfZmxvdykKKwkJCWNvbnRpbnVlOworCisJCWlwaDIgPSBpcHY2X2hkcihwKTsKKworCQkvKiBBbGwgZmllbGRzIG11c3QgbWF0Y2ggZXhjZXB0IGxlbmd0aC4gKi8KKwkJaWYgKG5sZW4gIT0gc2tiX25ldHdvcmtfaGVhZGVyX2xlbihwKSB8fAorCQkgICAgbWVtY21wKGlwaCwgaXBoMiwgb2Zmc2V0b2Yoc3RydWN0IGlwdjZoZHIsIHBheWxvYWRfbGVuKSkgfHwKKwkJICAgIG1lbWNtcCgmaXBoLT5uZXh0aGRyLCAmaXBoMi0+bmV4dGhkciwKKwkJCSAgIG5sZW4gLSBvZmZzZXRvZihzdHJ1Y3QgaXB2NmhkciwgbmV4dGhkcikpKSB7CisJCQlOQVBJX0dST19DQihwKS0+c2FtZV9mbG93ID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJTkFQSV9HUk9fQ0IocCktPmZsdXNoIHw9IGZsdXNoOworCX0KKworCU5BUElfR1JPX0NCKHNrYiktPmZsdXNoIHw9IGZsdXNoOworCisJcHAgPSBvcHMtPmdyb19yZWNlaXZlKGhlYWQsIHNrYik7CisKK291dF91bmxvY2s6CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKK291dDoKKwlOQVBJX0dST19DQihza2IpLT5mbHVzaCB8PSBmbHVzaDsKKworCXJldHVybiBwcDsKK30KKworc3RhdGljIGludCBpcHY2X2dyb19jb21wbGV0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpbmV0Nl9wcm90b2NvbCAqb3BzOworCXN0cnVjdCBpcHY2aGRyICppcGggPSBpcHY2X2hkcihza2IpOworCWludCBlcnIgPSAtRU5PU1lTOworCisJaXBoLT5wYXlsb2FkX2xlbiA9IGh0b25zKHNrYi0+bGVuIC0gc2tiX25ldHdvcmtfb2Zmc2V0KHNrYikgLQorCQkJCSBzaXplb2YoKmlwaCkpOworCisJcmN1X3JlYWRfbG9jaygpOworCW9wcyA9IHJjdV9kZXJlZmVyZW5jZShpbmV0Nl9wcm90b3NbSVBWNl9HUk9fQ0Ioc2tiKS0+cHJvdG9dKTsKKwlpZiAoV0FSTl9PTighb3BzIHx8ICFvcHMtPmdyb19jb21wbGV0ZSkpCisJCWdvdG8gb3V0X3VubG9jazsKKworCWVyciA9IG9wcy0+Z3JvX2NvbXBsZXRlKHNrYik7CisKK291dF91bmxvY2s6CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlyZXR1cm4gZXJyOworfQorCiBzdGF0aWMgc3RydWN0IHBhY2tldF90eXBlIGlwdjZfcGFja2V0X3R5cGUgPSB7CiAJLnR5cGUgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQVjYpLAogCS5mdW5jID0gaXB2Nl9yY3YsCiAJLmdzb19zZW5kX2NoZWNrID0gaXB2Nl9nc29fc2VuZF9jaGVjaywKIAkuZ3NvX3NlZ21lbnQgPSBpcHY2X2dzb19zZWdtZW50LAorCS5ncm9fcmVjZWl2ZSA9IGlwdjZfZ3JvX3JlY2VpdmUsCisJLmdyb19jb21wbGV0ZSA9IGlwdjZfZ3JvX2NvbXBsZXRlLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgaXB2Nl9wYWNrZXRfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXB2Nl9zb2NrZ2x1ZS5jIGIvbmV0L2lwdjYvaXB2Nl9zb2NrZ2x1ZS5jCmluZGV4IGVlZWFhZDIuLjQwZjMyNDYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwdjZfc29ja2dsdWUuYworKysgYi9uZXQvaXB2Ni9pcHY2X3NvY2tnbHVlLmMKQEAgLTQwNCw3ICs0MDQsNyBAQAogCQllbHNlIGlmIChvcHRsZW4gPCBzaXplb2Yoc3RydWN0IGluNl9wa3RpbmZvKSB8fCBvcHR2YWwgPT0gTlVMTCkKIAkJCWdvdG8gZV9pbnZhbDsKIAotCQlpZiAoY29weV9mcm9tX3VzZXIoJnBrdCwgb3B0dmFsLCBvcHRsZW4pKSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmcGt0LCBvcHR2YWwsIHNpemVvZihzdHJ1Y3QgaW42X3BrdGluZm8pKSkgewogCQkJCXJldHYgPSAtRUZBVUxUOwogCQkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9yb3V0ZS5jIGIvbmV0L2lwdjYvcm91dGUuYwppbmRleCAxOGM0ODZjLi5jNGE1OTgyIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9yb3V0ZS5jCisrKyBiL25ldC9pcHY2L3JvdXRlLmMKQEAgLTYyNyw2ICs2MjcsOSBAQAogCXJ0ID0gaXA2X3J0X2NvcHkob3J0KTsKIAogCWlmIChydCkgeworCQlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaDsKKwkJaW50IGF0dGVtcHRzID0gIWluX3NvZnRpcnEoKTsKKwogCQlpZiAoIShydC0+cnQ2aV9mbGFncyZSVEZfR0FURVdBWSkpIHsKIAkJCWlmIChydC0+cnQ2aV9kc3QucGxlbiAhPSAxMjggJiYKIAkJCSAgICBpcHY2X2FkZHJfZXF1YWwoJnJ0LT5ydDZpX2RzdC5hZGRyLCBkYWRkcikpCkBAIC02NDYsNyArNjQ5LDM1IEBACiAJCX0KICNlbmRpZgogCi0JCXJ0LT5ydDZpX25leHRob3AgPSBuZGlzY19nZXRfbmVpZ2gocnQtPnJ0NmlfZGV2LCAmcnQtPnJ0NmlfZ2F0ZXdheSk7CisJcmV0cnk6CisJCW5laWdoID0gbmRpc2NfZ2V0X25laWdoKHJ0LT5ydDZpX2RldiwgJnJ0LT5ydDZpX2dhdGV3YXkpOworCQlpZiAoSVNfRVJSKG5laWdoKSkgeworCQkJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChydC0+cnQ2aV9kZXYpOworCQkJaW50IHNhdmVkX3J0X21pbl9pbnRlcnZhbCA9CisJCQkJbmV0LT5pcHY2LnN5c2N0bC5pcDZfcnRfZ2NfbWluX2ludGVydmFsOworCQkJaW50IHNhdmVkX3J0X2VsYXN0aWNpdHkgPQorCQkJCW5ldC0+aXB2Ni5zeXNjdGwuaXA2X3J0X2djX2VsYXN0aWNpdHk7CisKKwkJCWlmIChhdHRlbXB0cy0tID4gMCkgeworCQkJCW5ldC0+aXB2Ni5zeXNjdGwuaXA2X3J0X2djX2VsYXN0aWNpdHkgPSAxOworCQkJCW5ldC0+aXB2Ni5zeXNjdGwuaXA2X3J0X2djX21pbl9pbnRlcnZhbCA9IDA7CisKKwkJCQlpcDZfZHN0X2djKG5ldC0+aXB2Ni5pcDZfZHN0X29wcyk7CisKKwkJCQluZXQtPmlwdjYuc3lzY3RsLmlwNl9ydF9nY19lbGFzdGljaXR5ID0KKwkJCQkJc2F2ZWRfcnRfZWxhc3RpY2l0eTsKKwkJCQluZXQtPmlwdjYuc3lzY3RsLmlwNl9ydF9nY19taW5faW50ZXJ2YWwgPQorCQkJCQlzYXZlZF9ydF9taW5faW50ZXJ2YWw7CisJCQkJZ290byByZXRyeTsKKwkJCX0KKworCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJICAgICAgICJOZWlnaGJvdXIgdGFibGUgb3ZlcmZsb3cuXG4iKTsKKwkJCWRzdF9mcmVlKCZydC0+dS5kc3QpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJcnQtPnJ0NmlfbmV4dGhvcCA9IG5laWdoOwogCiAJfQogCkBAIC05NDUsOCArOTc2LDExIEBACiAJZGV2X2hvbGQoZGV2KTsKIAlpZiAobmVpZ2gpCiAJCW5laWdoX2hvbGQobmVpZ2gpOwotCWVsc2UKKwllbHNlIHsKIAkJbmVpZ2ggPSBuZGlzY19nZXRfbmVpZ2goZGV2LCBhZGRyKTsKKwkJaWYgKElTX0VSUihuZWlnaCkpCisJCQluZWlnaCA9IE5VTEw7CisJfQogCiAJcnQtPnJ0NmlfZGV2CSAgPSBkZXY7CiAJcnQtPnJ0NmlfaWRldiAgICAgPSBpZGV2OwpAQCAtMTg4Nyw2ICsxOTIxLDcgQEAKIHsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KGlkZXYtPmRldik7CiAJc3RydWN0IHJ0Nl9pbmZvICpydCA9IGlwNl9kc3RfYWxsb2MobmV0LT5pcHY2LmlwNl9kc3Rfb3BzKTsKKwlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaDsKIAogCWlmIChydCA9PSBOVUxMKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKQEAgLTE5MDksMTEgKzE5NDQsMTggQEAKIAkJcnQtPnJ0NmlfZmxhZ3MgfD0gUlRGX0FOWUNBU1Q7CiAJZWxzZQogCQlydC0+cnQ2aV9mbGFncyB8PSBSVEZfTE9DQUw7Ci0JcnQtPnJ0NmlfbmV4dGhvcCA9IG5kaXNjX2dldF9uZWlnaChydC0+cnQ2aV9kZXYsICZydC0+cnQ2aV9nYXRld2F5KTsKLQlpZiAocnQtPnJ0NmlfbmV4dGhvcCA9PSBOVUxMKSB7CisJbmVpZ2ggPSBuZGlzY19nZXRfbmVpZ2gocnQtPnJ0NmlfZGV2LCAmcnQtPnJ0NmlfZ2F0ZXdheSk7CisJaWYgKElTX0VSUihuZWlnaCkpIHsKIAkJZHN0X2ZyZWUoJnJ0LT51LmRzdCk7Ci0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJCS8qIFdlIGFyZSBjYXN0aW5nIHRoaXMgYmVjYXVzZSB0aGF0IGlzIHRoZSByZXR1cm4KKwkJICogdmFsdWUgdHlwZS4gIEJ1dCBhbiBlcnJubyBlbmNvZGVkIHBvaW50ZXIgaXMgdGhlCisJCSAqIHNhbWUgcmVnYXJkbGVzcyBvZiB0aGUgdW5kZXJseWluZyBwb2ludGVyIHR5cGUsCisJCSAqIGFuZCB0aGF0J3Mgd2hhdCB3ZSBhcmUgcmV0dXJuaW5nLiAgU28gdGhpcyBpcyBPSy4KKwkJICovCisJCXJldHVybiAoc3RydWN0IHJ0Nl9pbmZvICopIG5laWdoOwogCX0KKwlydC0+cnQ2aV9uZXh0aG9wID0gbmVpZ2g7CiAKIAlpcHY2X2FkZHJfY29weSgmcnQtPnJ0NmlfZHN0LmFkZHIsIGFkZHIpOwogCXJ0LT5ydDZpX2RzdC5wbGVuID0gMTI4OwpAQCAtMjcxMCw3ICsyNzUyLDcgQEAKIAkJa21lbV9jYWNoZV9jcmVhdGUoImlwNl9kc3RfY2FjaGUiLCBzaXplb2Yoc3RydWN0IHJ0Nl9pbmZvKSwgMCwKIAkJCQkgIFNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCk7CiAJaWYgKCFpcDZfZHN0X29wc190ZW1wbGF0ZS5rbWVtX2NhY2hlcCkKLQkJZ290byBvdXQ7OworCQlnb3RvIG91dDsKIAogCXJldCA9IHJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoJmlwNl9yb3V0ZV9uZXRfb3BzKTsKIAlpZiAocmV0KQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvc3lzY3RsX25ldF9pcHY2LmMgYi9uZXQvaXB2Ni9zeXNjdGxfbmV0X2lwdjYuYwppbmRleCA5MDQ4ZmU3Li5hMDMxMDM0IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9zeXNjdGxfbmV0X2lwdjYuYworKysgYi9uZXQvaXB2Ni9zeXNjdGxfbmV0X2lwdjYuYwpAQCAtMTI4LDcgKzEyOCw3IEBACiAKIGludCBpcHY2X3N5c2N0bF9yZWdpc3Rlcih2b2lkKQogewotCWludCBlcnIgPSAtRU5PTUVNOzsKKwlpbnQgZXJyID0gLUVOT01FTTsKIAogCWlwNl9oZWFkZXIgPSByZWdpc3Rlcl9uZXRfc3lzY3RsX3JvdGFibGUobmV0X2lwdjZfY3RsX3BhdGgsIGlwdjZfdGFibGUpOwogCWlmIChpcDZfaGVhZGVyID09IE5VTEwpCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni90Y3BfaXB2Ni5jIGIvbmV0L2lwdjYvdGNwX2lwdjYuYwppbmRleCBlOGI4MzM3Li5lNWI4NWQ0IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni90Y3BfaXB2Ni5jCisrKyBiL25ldC9pcHY2L3RjcF9pcHY2LmMKQEAgLTEwMSw3ICsxMDEsNyBAQAogCX0KIH0KIAotc3RhdGljIF9faW5saW5lX18gX19zdW0xNiB0Y3BfdjZfY2hlY2soc3RydWN0IHRjcGhkciAqdGgsIGludCBsZW4sCitzdGF0aWMgX19pbmxpbmVfXyBfX3N1bTE2IHRjcF92Nl9jaGVjayhpbnQgbGVuLAogCQkJCSAgIHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsCiAJCQkJICAgc3RydWN0IGluNl9hZGRyICpkYWRkciwKIAkJCQkgICBfX3dzdW0gYmFzZSkKQEAgLTUwMSw3ICs1MDEsNyBAQAogCWlmIChza2IpIHsKIAkJc3RydWN0IHRjcGhkciAqdGggPSB0Y3BfaGRyKHNrYik7CiAKLQkJdGgtPmNoZWNrID0gdGNwX3Y2X2NoZWNrKHRoLCBza2ItPmxlbiwKKwkJdGgtPmNoZWNrID0gdGNwX3Y2X2NoZWNrKHNrYi0+bGVuLAogCQkJCQkgJnRyZXEtPmxvY19hZGRyLCAmdHJlcS0+cm10X2FkZHIsCiAJCQkJCSBjc3VtX3BhcnRpYWwodGgsIHNrYi0+bGVuLCBza2ItPmNzdW0pKTsKIApAQCAtOTQyLDYgKzk0Miw0MSBAQAogCXJldHVybiAwOwogfQogCitzdHJ1Y3Qgc2tfYnVmZiAqKnRjcDZfZ3JvX3JlY2VpdmUoc3RydWN0IHNrX2J1ZmYgKipoZWFkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcHY2aGRyICppcGggPSBpcHY2X2hkcihza2IpOworCisJc3dpdGNoIChza2ItPmlwX3N1bW1lZCkgeworCWNhc2UgQ0hFQ0tTVU1fQ09NUExFVEU6CisJCWlmICghdGNwX3Y2X2NoZWNrKHNrYi0+bGVuLCAmaXBoLT5zYWRkciwgJmlwaC0+ZGFkZHIsCisJCQkJICBza2ItPmNzdW0pKSB7CisJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIENIRUNLU1VNX05PTkU6CisJCU5BUElfR1JPX0NCKHNrYiktPmZsdXNoID0gMTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIHRjcF9ncm9fcmVjZWl2ZShoZWFkLCBza2IpOworfQorRVhQT1JUX1NZTUJPTCh0Y3A2X2dyb19yZWNlaXZlKTsKKworaW50IHRjcDZfZ3JvX2NvbXBsZXRlKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlwdjZoZHIgKmlwaCA9IGlwdjZfaGRyKHNrYik7CisJc3RydWN0IHRjcGhkciAqdGggPSB0Y3BfaGRyKHNrYik7CisKKwl0aC0+Y2hlY2sgPSB+dGNwX3Y2X2NoZWNrKHNrYi0+bGVuIC0gc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSwKKwkJCQkgICZpcGgtPnNhZGRyLCAmaXBoLT5kYWRkciwgMCk7CisJc2tiX3NoaW5mbyhza2IpLT5nc29fdHlwZSA9IFNLQl9HU09fVENQVjY7CisKKwlyZXR1cm4gdGNwX2dyb19jb21wbGV0ZShza2IpOworfQorRVhQT1JUX1NZTUJPTCh0Y3A2X2dyb19jb21wbGV0ZSk7CisKIHN0YXRpYyB2b2lkIHRjcF92Nl9zZW5kX3Jlc3BvbnNlKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBzZXEsIHUzMiBhY2ssIHUzMiB3aW4sCiAJCQkJIHUzMiB0cywgc3RydWN0IHRjcF9tZDVzaWdfa2V5ICprZXksIGludCByc3QpCiB7CkBAIC0xNDI5LDE0ICsxNDY0LDE0IEBACiBzdGF0aWMgX19zdW0xNiB0Y3BfdjZfY2hlY2tzdW1faW5pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9DT01QTEVURSkgewotCQlpZiAoIXRjcF92Nl9jaGVjayh0Y3BfaGRyKHNrYiksIHNrYi0+bGVuLCAmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsCisJCWlmICghdGNwX3Y2X2NoZWNrKHNrYi0+bGVuLCAmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsCiAJCQkJICAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsIHNrYi0+Y3N1bSkpIHsKIAkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KIAotCXNrYi0+Y3N1bSA9IH5jc3VtX3VuZm9sZCh0Y3BfdjZfY2hlY2sodGNwX2hkcihza2IpLCBza2ItPmxlbiwKKwlza2ItPmNzdW0gPSB+Y3N1bV91bmZvbGQodGNwX3Y2X2NoZWNrKHNrYi0+bGVuLAogCQkJCQkgICAgICAmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsCiAJCQkJCSAgICAgICZpcHY2X2hkcihza2IpLT5kYWRkciwgMCkpOwogCkBAIC0xNjQwLDcgKzE2NzUsNyBAQAogI2lmZGVmIENPTkZJR19ORVRfRE1BCiAJCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCQlpZiAoIXRwLT51Y29weS5kbWFfY2hhbiAmJiB0cC0+dWNvcHkucGlubmVkX2xpc3QpCi0JCQl0cC0+dWNvcHkuZG1hX2NoYW4gPSBnZXRfc29mdG5ldF9kbWEoKTsKKwkJCXRwLT51Y29weS5kbWFfY2hhbiA9IGRtYV9maW5kX2NoYW5uZWwoRE1BX01FTUNQWSk7CiAJCWlmICh0cC0+dWNvcHkuZG1hX2NoYW4pCiAJCQlyZXQgPSB0Y3BfdjZfZG9fcmN2KHNrLCBza2IpOwogCQllbHNlCkBAIC0yMDYyLDYgKzIwOTcsOCBAQAogCS5lcnJfaGFuZGxlcgk9CXRjcF92Nl9lcnIsCiAJLmdzb19zZW5kX2NoZWNrCT0JdGNwX3Y2X2dzb19zZW5kX2NoZWNrLAogCS5nc29fc2VnbWVudAk9CXRjcF90c29fc2VnbWVudCwKKwkuZ3JvX3JlY2VpdmUJPQl0Y3A2X2dyb19yZWNlaXZlLAorCS5ncm9fY29tcGxldGUJPQl0Y3A2X2dyb19jb21wbGV0ZSwKIAkuZmxhZ3MJCT0JSU5FVDZfUFJPVE9fTk9QT0xJQ1l8SU5FVDZfUFJPVE9fRklOQUwsCiB9OwogCmRpZmYgLS1naXQgYS9uZXQvaXVjdi9hZl9pdWN2LmMgYi9uZXQvaXVjdi9hZl9pdWN2LmMKaW5kZXggYWYzMTkyZC4uZWI4YTJhMCAxMDA2NDQKLS0tIGEvbmV0L2l1Y3YvYWZfaXVjdi5jCisrKyBiL25ldC9pdWN2L2FmX2l1Y3YuYwpAQCAtNDk0LDcgKzQ5NCwyMSBAQAogCWlmIChlcnIpIHsKIAkJaXVjdl9wYXRoX2ZyZWUoaXVjdi0+cGF0aCk7CiAJCWl1Y3YtPnBhdGggPSBOVUxMOwotCQllcnIgPSAtRUNPTk5SRUZVU0VEOworCQlzd2l0Y2ggKGVycikgeworCQljYXNlIDB4MGI6CS8qIFRhcmdldCBjb21tdW5pY2F0b3IgaXMgbm90IGxvZ2dlZCBvbiAqLworCQkJZXJyID0gLUVORVRVTlJFQUNIOworCQkJYnJlYWs7CisJCWNhc2UgMHgwZDoJLyogTWF4IGNvbm5lY3Rpb25zIGZvciB0aGlzIGd1ZXN0IGV4Y2VlZGVkICovCisJCWNhc2UgMHgwZToJLyogTWF4IGNvbm5lY3Rpb25zIGZvciB0YXJnZXQgZ3Vlc3QgZXhjZWVkZWQgKi8KKwkJCWVyciA9IC1FQUdBSU47CisJCQlicmVhazsKKwkJY2FzZSAweDBmOgkvKiBNaXNzaW5nIElVQ1YgYXV0aG9yaXphdGlvbiAqLworCQkJZXJyID0gLUVBQ0NFUzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJyID0gLUVDT05OUkVGVVNFRDsKKwkJCWJyZWFrOworCQl9CiAJCWdvdG8gZG9uZTsKIAl9CiAKQEAgLTUwNyw2ICs1MjEsMTMgQEAKIAkJcmVsZWFzZV9zb2NrKHNrKTsKIAkJcmV0dXJuIC1FQ09OTlJFRlVTRUQ7CiAJfQorCisJaWYgKGVycikgeworCQlpdWN2X3BhdGhfc2V2ZXIoaXVjdi0+cGF0aCwgTlVMTCk7CisJCWl1Y3ZfcGF0aF9mcmVlKGl1Y3YtPnBhdGgpOworCQlpdWN2LT5wYXRoID0gTlVMTDsKKwl9CisKIGRvbmU6CiAJcmVsZWFzZV9zb2NrKHNrKTsKIAlyZXR1cm4gZXJyOwpAQCAtMTAyMSwxMiArMTA0MiwxNCBAQAogCUFTQ0VCQyh1c2VyX2RhdGEsIHNpemVvZih1c2VyX2RhdGEpKTsKIAlpZiAoc2stPnNrX3N0YXRlICE9IElVQ1ZfTElTVEVOKSB7CiAJCWVyciA9IGl1Y3ZfcGF0aF9zZXZlcihwYXRoLCB1c2VyX2RhdGEpOworCQlpdWN2X3BhdGhfZnJlZShwYXRoKTsKIAkJZ290byBmYWlsOwogCX0KIAogCS8qIENoZWNrIGZvciBiYWNrbG9nIHNpemUgKi8KIAlpZiAoc2tfYWNjZXB0cV9pc19mdWxsKHNrKSkgewogCQllcnIgPSBpdWN2X3BhdGhfc2V2ZXIocGF0aCwgdXNlcl9kYXRhKTsKKwkJaXVjdl9wYXRoX2ZyZWUocGF0aCk7CiAJCWdvdG8gZmFpbDsKIAl9CiAKQEAgLTEwMzQsNiArMTA1Nyw3IEBACiAJbnNrID0gaXVjdl9zb2NrX2FsbG9jKE5VTEwsIFNPQ0tfU1RSRUFNLCBHRlBfQVRPTUlDKTsKIAlpZiAoIW5zaykgewogCQllcnIgPSBpdWN2X3BhdGhfc2V2ZXIocGF0aCwgdXNlcl9kYXRhKTsKKwkJaXVjdl9wYXRoX2ZyZWUocGF0aCk7CiAJCWdvdG8gZmFpbDsKIAl9CiAKQEAgLTEwNTcsNiArMTA4MSw4IEBACiAJZXJyID0gaXVjdl9wYXRoX2FjY2VwdChwYXRoLCAmYWZfaXVjdl9oYW5kbGVyLCBudXNlcl9kYXRhLCBuc2spOwogCWlmIChlcnIpIHsKIAkJZXJyID0gaXVjdl9wYXRoX3NldmVyKHBhdGgsIHVzZXJfZGF0YSk7CisJCWl1Y3ZfcGF0aF9mcmVlKHBhdGgpOworCQlpdWN2X3NvY2tfa2lsbChuc2spOwogCQlnb3RvIGZhaWw7CiAJfQogCmRpZmYgLS1naXQgYS9uZXQvaXVjdi9pdWN2LmMgYi9uZXQvaXVjdi9pdWN2LmMKaW5kZXggOGY1N2Q0Zi4uYTM1MjQwZiAxMDA2NDQKLS0tIGEvbmV0L2l1Y3YvaXVjdi5jCisrKyBiL25ldC9pdWN2L2l1Y3YuYwpAQCAtNTAsNyArNTAsNiBAQAogI2luY2x1ZGUgPGFzbS9lYmNkaWMuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vczM5MF9leHQuaD4KLSNpbmNsdWRlIDxhc20vczM5MF9yZGV2Lmg+CiAjaW5jbHVkZSA8YXNtL3NtcC5oPgogCiAvKgpAQCAtNTE3LDYgKzUxNiw3IEBACiAJc2l6ZV90IGFsbG9jX3NpemU7CiAJaW50IGNwdSwgcmM7CiAKKwlnZXRfb25saW5lX2NwdXMoKTsKIAlyYyA9IC1FTk9NRU07CiAJYWxsb2Nfc2l6ZSA9IGl1Y3ZfbWF4X3BhdGhpZCAqIHNpemVvZihzdHJ1Y3QgaXVjdl9wYXRoKTsKIAlpdWN2X3BhdGhfdGFibGUgPSBremFsbG9jKGFsbG9jX3NpemUsIEdGUF9LRVJORUwpOwpAQCAtNTI0LDE5ICs1MjQsMTcgQEAKIAkJZ290byBvdXQ7CiAJLyogRGVjbGFyZSBwZXIgY3B1IGJ1ZmZlcnMuICovCiAJcmMgPSAtRUlPOwotCWdldF9vbmxpbmVfY3B1cygpOwogCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQogCQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY3B1LCBpdWN2X2RlY2xhcmVfY3B1LCBOVUxMLCAxKTsKIAlpZiAoY3B1c19lbXB0eShpdWN2X2J1ZmZlcl9jcHVtYXNrKSkKIAkJLyogTm8gY3B1IGNvdWxkIGRlY2xhcmUgYW4gaXVjdiBidWZmZXIuICovCi0JCWdvdG8gb3V0X3BhdGg7CisJCWdvdG8gb3V0OwogCXB1dF9vbmxpbmVfY3B1cygpOwogCXJldHVybiAwOwotCi1vdXRfcGF0aDoKLQlwdXRfb25saW5lX2NwdXMoKTsKLQlrZnJlZShpdWN2X3BhdGhfdGFibGUpOwogb3V0OgorCWtmcmVlKGl1Y3ZfcGF0aF90YWJsZSk7CisJaXVjdl9wYXRoX3RhYmxlID0gTlVMTDsKKwlwdXRfb25saW5lX2NwdXMoKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTU1MSw4ICs1NDksOSBAQAogewogCWdldF9vbmxpbmVfY3B1cygpOwogCW9uX2VhY2hfY3B1KGl1Y3ZfcmV0cmlldmVfY3B1LCBOVUxMLCAxKTsKLQlwdXRfb25saW5lX2NwdXMoKTsKIAlrZnJlZShpdWN2X3BhdGhfdGFibGUpOworCWl1Y3ZfcGF0aF90YWJsZSA9IE5VTEw7CisJcHV0X29ubGluZV9jcHVzKCk7CiB9CiAKIHN0YXRpYyBpbnQgX19jcHVpbml0IGl1Y3ZfY3B1X25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCkBAIC01ODksMTAgKzU4OCwxNCBAQAogCWNhc2UgQ1BVX09OTElORV9GUk9aRU46CiAJY2FzZSBDUFVfRE9XTl9GQUlMRUQ6CiAJY2FzZSBDUFVfRE9XTl9GQUlMRURfRlJPWkVOOgorCQlpZiAoIWl1Y3ZfcGF0aF90YWJsZSkKKwkJCWJyZWFrOwogCQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY3B1LCBpdWN2X2RlY2xhcmVfY3B1LCBOVUxMLCAxKTsKIAkJYnJlYWs7CiAJY2FzZSBDUFVfRE9XTl9QUkVQQVJFOgogCWNhc2UgQ1BVX0RPV05fUFJFUEFSRV9GUk9aRU46CisJCWlmICghaXVjdl9wYXRoX3RhYmxlKQorCQkJYnJlYWs7CiAJCWNwdW1hc2sgPSBpdWN2X2J1ZmZlcl9jcHVtYXNrOwogCQljcHVfY2xlYXIoY3B1LCBjcHVtYXNrKTsKIAkJaWYgKGNwdXNfZW1wdHkoY3B1bWFzaykpCkBAIC0xNjkyLDcgKzE2OTUsNyBAQAogCXJjID0gcmVnaXN0ZXJfZXh0ZXJuYWxfaW50ZXJydXB0KDB4NDAwMCwgaXVjdl9leHRlcm5hbF9pbnRlcnJ1cHQpOwogCWlmIChyYykKIAkJZ290byBvdXQ7Ci0JaXVjdl9yb290ID0gczM5MF9yb290X2Rldl9yZWdpc3RlcigiaXVjdiIpOworCWl1Y3Zfcm9vdCA9IHJvb3RfZGV2aWNlX3JlZ2lzdGVyKCJpdWN2Iik7CiAJaWYgKElTX0VSUihpdWN2X3Jvb3QpKSB7CiAJCXJjID0gUFRSX0VSUihpdWN2X3Jvb3QpOwogCQlnb3RvIG91dF9pbnQ7CkBAIC0xNzM2LDcgKzE3MzksNyBAQAogCQlrZnJlZShpdWN2X2lycV9kYXRhW2NwdV0pOwogCQlpdWN2X2lycV9kYXRhW2NwdV0gPSBOVUxMOwogCX0KLQlzMzkwX3Jvb3RfZGV2X3VucmVnaXN0ZXIoaXVjdl9yb290KTsKKwlyb290X2RldmljZV91bnJlZ2lzdGVyKGl1Y3Zfcm9vdCk7CiBvdXRfaW50OgogCXVucmVnaXN0ZXJfZXh0ZXJuYWxfaW50ZXJydXB0KDB4NDAwMCwgaXVjdl9leHRlcm5hbF9pbnRlcnJ1cHQpOwogb3V0OgpAQCAtMTc2Niw3ICsxNzY5LDcgQEAKIAkJa2ZyZWUoaXVjdl9pcnFfZGF0YVtjcHVdKTsKIAkJaXVjdl9pcnFfZGF0YVtjcHVdID0gTlVMTDsKIAl9Ci0JczM5MF9yb290X2Rldl91bnJlZ2lzdGVyKGl1Y3Zfcm9vdCk7CisJcm9vdF9kZXZpY2VfdW5yZWdpc3RlcihpdWN2X3Jvb3QpOwogCWJ1c191bnJlZ2lzdGVyKCZpdWN2X2J1cyk7CiAJdW5yZWdpc3Rlcl9leHRlcm5hbF9pbnRlcnJ1cHQoMHg0MDAwLCBpdWN2X2V4dGVybmFsX2ludGVycnVwdCk7CiB9CmRpZmYgLS1naXQgYS9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfY2lwc29fdjQuYyBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9jaXBzb192NC5jCmluZGV4IGZmZjMyYjcuLmJmMWFiMWEgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9jaXBzb192NC5jCisrKyBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9jaXBzb192NC5jCkBAIC0xMzAsNiArMTMwLDcgQEAKIC8qKgogICogbmV0bGJsX2NpcHNvdjRfYWRkX3N0ZCAtIEFkZHMgYSBDSVBTTyBWNCBET0kgZGVmaW5pdGlvbgogICogQGluZm86IHRoZSBHZW5lcmljIE5FVExJTksgaW5mbyBibG9jaworICogQGF1ZGl0X2luZm86IE5ldExhYmVsIGF1ZGl0IGluZm9ybWF0aW9uCiAgKgogICogRGVzY3JpcHRpb246CiAgKiBDcmVhdGUgYSBuZXcgQ0lQU09fVjRfTUFQX1RSQU5TIERPSSBkZWZpbml0aW9uIGJhc2VkIG9uIHRoZSBnaXZlbiBBREQKQEAgLTEzNyw3ICsxMzgsOCBAQAogICogbm9uLXplcm8gb24gZXJyb3IuCiAgKgogICovCi1zdGF0aWMgaW50IG5ldGxibF9jaXBzb3Y0X2FkZF9zdGQoc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKK3N0YXRpYyBpbnQgbmV0bGJsX2NpcHNvdjRfYWRkX3N0ZChzdHJ1Y3QgZ2VubF9pbmZvICppbmZvLAorCQkJCSAgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbykKIHsKIAlpbnQgcmV0X3ZhbCA9IC1FSU5WQUw7CiAJc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZiA9IE5VTEw7CkBAIC0zMTYsNyArMzE4LDcgQEAKIAkJCX0KIAl9CiAKLQlyZXRfdmFsID0gY2lwc29fdjRfZG9pX2FkZChkb2lfZGVmKTsKKwlyZXRfdmFsID0gY2lwc29fdjRfZG9pX2FkZChkb2lfZGVmLCBhdWRpdF9pbmZvKTsKIAlpZiAocmV0X3ZhbCAhPSAwKQogCQlnb3RvIGFkZF9zdGRfZmFpbHVyZTsKIAlyZXR1cm4gMDsKQEAgLTMzMCw2ICszMzIsNyBAQAogLyoqCiAgKiBuZXRsYmxfY2lwc292NF9hZGRfcGFzcyAtIEFkZHMgYSBDSVBTTyBWNCBET0kgZGVmaW5pdGlvbgogICogQGluZm86IHRoZSBHZW5lcmljIE5FVExJTksgaW5mbyBibG9jaworICogQGF1ZGl0X2luZm86IE5ldExhYmVsIGF1ZGl0IGluZm9ybWF0aW9uCiAgKgogICogRGVzY3JpcHRpb246CiAgKiBDcmVhdGUgYSBuZXcgQ0lQU09fVjRfTUFQX1BBU1MgRE9JIGRlZmluaXRpb24gYmFzZWQgb24gdGhlIGdpdmVuIEFERCBtZXNzYWdlCkBAIC0zMzcsNyArMzQwLDggQEAKICAqIGVycm9yLgogICoKICAqLwotc3RhdGljIGludCBuZXRsYmxfY2lwc292NF9hZGRfcGFzcyhzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQorc3RhdGljIGludCBuZXRsYmxfY2lwc292NF9hZGRfcGFzcyhzdHJ1Y3QgZ2VubF9pbmZvICppbmZvLAorCQkJCSAgIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pCiB7CiAJaW50IHJldF92YWw7CiAJc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZiA9IE5VTEw7CkBAIC0zNTQsNyArMzU4LDcgQEAKIAlpZiAocmV0X3ZhbCAhPSAwKQogCQlnb3RvIGFkZF9wYXNzX2ZhaWx1cmU7CiAKLQlyZXRfdmFsID0gY2lwc29fdjRfZG9pX2FkZChkb2lfZGVmKTsKKwlyZXRfdmFsID0gY2lwc29fdjRfZG9pX2FkZChkb2lfZGVmLCBhdWRpdF9pbmZvKTsKIAlpZiAocmV0X3ZhbCAhPSAwKQogCQlnb3RvIGFkZF9wYXNzX2ZhaWx1cmU7CiAJcmV0dXJuIDA7CkBAIC0zNjcsNiArMzcxLDcgQEAKIC8qKgogICogbmV0bGJsX2NpcHNvdjRfYWRkX2xvY2FsIC0gQWRkcyBhIENJUFNPIFY0IERPSSBkZWZpbml0aW9uCiAgKiBAaW5mbzogdGhlIEdlbmVyaWMgTkVUTElOSyBpbmZvIGJsb2NrCisgKiBAYXVkaXRfaW5mbzogTmV0TGFiZWwgYXVkaXQgaW5mb3JtYXRpb24KICAqCiAgKiBEZXNjcmlwdGlvbjoKICAqIENyZWF0ZSBhIG5ldyBDSVBTT19WNF9NQVBfTE9DQUwgRE9JIGRlZmluaXRpb24gYmFzZWQgb24gdGhlIGdpdmVuIEFERApAQCAtMzc0LDcgKzM3OSw4IEBACiAgKiBub24temVybyBvbiBlcnJvci4KICAqCiAgKi8KLXN0YXRpYyBpbnQgbmV0bGJsX2NpcHNvdjRfYWRkX2xvY2FsKHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCitzdGF0aWMgaW50IG5ldGxibF9jaXBzb3Y0X2FkZF9sb2NhbChzdHJ1Y3QgZ2VubF9pbmZvICppbmZvLAorCQkJCSAgICBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKQogewogCWludCByZXRfdmFsOwogCXN0cnVjdCBjaXBzb192NF9kb2kgKmRvaV9kZWYgPSBOVUxMOwpAQCAtMzkxLDcgKzM5Nyw3IEBACiAJaWYgKHJldF92YWwgIT0gMCkKIAkJZ290byBhZGRfbG9jYWxfZmFpbHVyZTsKIAotCXJldF92YWwgPSBjaXBzb192NF9kb2lfYWRkKGRvaV9kZWYpOworCXJldF92YWwgPSBjaXBzb192NF9kb2lfYWRkKGRvaV9kZWYsIGF1ZGl0X2luZm8pOwogCWlmIChyZXRfdmFsICE9IDApCiAJCWdvdG8gYWRkX2xvY2FsX2ZhaWx1cmU7CiAJcmV0dXJuIDA7CkBAIC00MTUsNDggKzQyMSwzMSBAQAogCiB7CiAJaW50IHJldF92YWwgPSAtRUlOVkFMOwotCXUzMiB0eXBlOwotCXUzMiBkb2k7CiAJY29uc3QgY2hhciAqdHlwZV9zdHIgPSAiKHVua25vd24pIjsKLQlzdHJ1Y3QgYXVkaXRfYnVmZmVyICphdWRpdF9idWY7CiAJc3RydWN0IG5ldGxibF9hdWRpdCBhdWRpdF9pbmZvOwogCiAJaWYgKCFpbmZvLT5hdHRyc1tOTEJMX0NJUFNPVjRfQV9ET0ldIHx8CiAJICAgICFpbmZvLT5hdHRyc1tOTEJMX0NJUFNPVjRfQV9NVFlQRV0pCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZG9pID0gbmxhX2dldF91MzIoaW5mby0+YXR0cnNbTkxCTF9DSVBTT1Y0X0FfRE9JXSk7CiAJbmV0bGJsX25ldGxpbmtfYXVkaXRpbmZvKHNrYiwgJmF1ZGl0X2luZm8pOwotCi0JdHlwZSA9IG5sYV9nZXRfdTMyKGluZm8tPmF0dHJzW05MQkxfQ0lQU09WNF9BX01UWVBFXSk7Ci0Jc3dpdGNoICh0eXBlKSB7CisJc3dpdGNoIChubGFfZ2V0X3UzMihpbmZvLT5hdHRyc1tOTEJMX0NJUFNPVjRfQV9NVFlQRV0pKSB7CiAJY2FzZSBDSVBTT19WNF9NQVBfVFJBTlM6CiAJCXR5cGVfc3RyID0gInRyYW5zIjsKLQkJcmV0X3ZhbCA9IG5ldGxibF9jaXBzb3Y0X2FkZF9zdGQoaW5mbyk7CisJCXJldF92YWwgPSBuZXRsYmxfY2lwc292NF9hZGRfc3RkKGluZm8sICZhdWRpdF9pbmZvKTsKIAkJYnJlYWs7CiAJY2FzZSBDSVBTT19WNF9NQVBfUEFTUzoKIAkJdHlwZV9zdHIgPSAicGFzcyI7Ci0JCXJldF92YWwgPSBuZXRsYmxfY2lwc292NF9hZGRfcGFzcyhpbmZvKTsKKwkJcmV0X3ZhbCA9IG5ldGxibF9jaXBzb3Y0X2FkZF9wYXNzKGluZm8sICZhdWRpdF9pbmZvKTsKIAkJYnJlYWs7CiAJY2FzZSBDSVBTT19WNF9NQVBfTE9DQUw6CiAJCXR5cGVfc3RyID0gImxvY2FsIjsKLQkJcmV0X3ZhbCA9IG5ldGxibF9jaXBzb3Y0X2FkZF9sb2NhbChpbmZvKTsKKwkJcmV0X3ZhbCA9IG5ldGxibF9jaXBzb3Y0X2FkZF9sb2NhbChpbmZvLCAmYXVkaXRfaW5mbyk7CiAJCWJyZWFrOwogCX0KIAlpZiAocmV0X3ZhbCA9PSAwKQogCQlhdG9taWNfaW5jKCZuZXRsYWJlbF9tZ210X3Byb3RvY291bnQpOwogCi0JYXVkaXRfYnVmID0gbmV0bGJsX2F1ZGl0X3N0YXJ0X2NvbW1vbihBVURJVF9NQUNfQ0lQU09WNF9BREQsCi0JCQkJCSAgICAgICZhdWRpdF9pbmZvKTsKLQlpZiAoYXVkaXRfYnVmICE9IE5VTEwpIHsKLQkJYXVkaXRfbG9nX2Zvcm1hdChhdWRpdF9idWYsCi0JCQkJICIgY2lwc29fZG9pPSV1IGNpcHNvX3R5cGU9JXMgcmVzPSV1IiwKLQkJCQkgZG9pLAotCQkJCSB0eXBlX3N0ciwKLQkJCQkgcmV0X3ZhbCA9PSAwID8gMSA6IDApOwotCQlhdWRpdF9sb2dfZW5kKGF1ZGl0X2J1Zik7Ci0JfQotCiAJcmV0dXJuIHJldF92YWw7CiB9CiAKQEAgLTcyNSw5ICs3MTQsNyBAQAogc3RhdGljIGludCBuZXRsYmxfY2lwc292NF9yZW1vdmUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKIHsKIAlpbnQgcmV0X3ZhbCA9IC1FSU5WQUw7Ci0JdTMyIGRvaSA9IDA7CiAJc3RydWN0IG5ldGxibF9kb21oc2hfd2Fsa19hcmcgY2JfYXJnOwotCXN0cnVjdCBhdWRpdF9idWZmZXIgKmF1ZGl0X2J1ZjsKIAlzdHJ1Y3QgbmV0bGJsX2F1ZGl0IGF1ZGl0X2luZm87CiAJdTMyIHNraXBfYmt0ID0gMDsKIAl1MzIgc2tpcF9jaGFpbiA9IDA7CkBAIC03MzUsMjkgKzcyMiwxNyBAQAogCWlmICghaW5mby0+YXR0cnNbTkxCTF9DSVBTT1Y0X0FfRE9JXSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlkb2kgPSBubGFfZ2V0X3UzMihpbmZvLT5hdHRyc1tOTEJMX0NJUFNPVjRfQV9ET0ldKTsKIAluZXRsYmxfbmV0bGlua19hdWRpdGluZm8oc2tiLCAmYXVkaXRfaW5mbyk7Ci0KLQljYl9hcmcuZG9pID0gZG9pOworCWNiX2FyZy5kb2kgPSBubGFfZ2V0X3UzMihpbmZvLT5hdHRyc1tOTEJMX0NJUFNPVjRfQV9ET0ldKTsKIAljYl9hcmcuYXVkaXRfaW5mbyA9ICZhdWRpdF9pbmZvOwogCXJldF92YWwgPSBuZXRsYmxfZG9taHNoX3dhbGsoJnNraXBfYmt0LCAmc2tpcF9jaGFpbiwKIAkJCQkgICAgIG5ldGxibF9jaXBzb3Y0X3JlbW92ZV9jYiwgJmNiX2FyZyk7CiAJaWYgKHJldF92YWwgPT0gMCB8fCByZXRfdmFsID09IC1FTk9FTlQpIHsKLQkJcmV0X3ZhbCA9IGNpcHNvX3Y0X2RvaV9yZW1vdmUoZG9pLCAmYXVkaXRfaW5mbyk7CisJCXJldF92YWwgPSBjaXBzb192NF9kb2lfcmVtb3ZlKGNiX2FyZy5kb2ksICZhdWRpdF9pbmZvKTsKIAkJaWYgKHJldF92YWwgPT0gMCkKIAkJCWF0b21pY19kZWMoJm5ldGxhYmVsX21nbXRfcHJvdG9jb3VudCk7CiAJfQogCi0JYXVkaXRfYnVmID0gbmV0bGJsX2F1ZGl0X3N0YXJ0X2NvbW1vbihBVURJVF9NQUNfQ0lQU09WNF9ERUwsCi0JCQkJCSAgICAgICZhdWRpdF9pbmZvKTsKLQlpZiAoYXVkaXRfYnVmICE9IE5VTEwpIHsKLQkJYXVkaXRfbG9nX2Zvcm1hdChhdWRpdF9idWYsCi0JCQkJICIgY2lwc29fZG9pPSV1IHJlcz0ldSIsCi0JCQkJIGRvaSwKLQkJCQkgcmV0X3ZhbCA9PSAwID8gMSA6IDApOwotCQlhdWRpdF9sb2dfZW5kKGF1ZGl0X2J1Zik7Ci0JfQotCiAJcmV0dXJuIHJldF92YWw7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9kb21haW5oYXNoLmMgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfZG9tYWluaGFzaC5jCmluZGV4IDVmYWRmMTAuLjdhMTBiYmUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9kb21haW5oYXNoLmMKKysrIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX2RvbWFpbmhhc2guYwpAQCAtNDgzLDYgKzQ4Myw3MyBAQAogfQogCiAvKioKKyAqIG5ldGxibF9kb21oc2hfcmVtb3ZlX2FmNCAtIFJlbW92ZXMgYW4gYWRkcmVzcyBzZWxlY3RvciBlbnRyeQorICogQGRvbWFpbjogdGhlIGRvbWFpbgorICogQGFkZHI6IElQdjQgYWRkcmVzcworICogQG1hc2s6IElQdjQgYWRkcmVzcyBtYXNrCisgKiBAYXVkaXRfaW5mbzogTmV0TGFiZWwgYXVkaXQgaW5mb3JtYXRpb24KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFJlbW92ZXMgYW4gaW5kaXZpZHVhbCBhZGRyZXNzIHNlbGVjdG9yIGZyb20gYSBkb21haW4gbWFwcGluZyBhbmQgcG90ZW50aWFsbHkKKyAqIHRoZSBlbnRpcmUgbWFwcGluZyBpZiBpdCBpcyBlbXB0eS4gIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZXMKKyAqIG9uIGZhaWx1cmUuCisgKgorICovCitpbnQgbmV0bGJsX2RvbWhzaF9yZW1vdmVfYWY0KGNvbnN0IGNoYXIgKmRvbWFpbiwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGluX2FkZHIgKmFkZHIsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICptYXNrLAorCQkJICAgICBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKQoreworCXN0cnVjdCBuZXRsYmxfZG9tX21hcCAqZW50cnlfbWFwOworCXN0cnVjdCBuZXRsYmxfYWY0bGlzdCAqZW50cnlfYWRkcjsKKwlzdHJ1Y3QgbmV0bGJsX2FmNGxpc3QgKml0ZXI0OworI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorCXN0cnVjdCBuZXRsYmxfYWY2bGlzdCAqaXRlcjY7CisjZW5kaWYgLyogSVB2NiAqLworCXN0cnVjdCBuZXRsYmxfZG9tYWRkcjRfbWFwICplbnRyeTsKKworCXJjdV9yZWFkX2xvY2soKTsKKworCWlmIChkb21haW4pCisJCWVudHJ5X21hcCA9IG5ldGxibF9kb21oc2hfc2VhcmNoKGRvbWFpbik7CisJZWxzZQorCQllbnRyeV9tYXAgPSBuZXRsYmxfZG9taHNoX3NlYXJjaF9kZWYoZG9tYWluKTsKKwlpZiAoZW50cnlfbWFwID09IE5VTEwgfHwgZW50cnlfbWFwLT50eXBlICE9IE5FVExCTF9OTFRZUEVfQUREUlNFTEVDVCkKKwkJZ290byByZW1vdmVfYWY0X2ZhaWx1cmU7CisKKwlzcGluX2xvY2soJm5ldGxibF9kb21oc2hfbG9jayk7CisJZW50cnlfYWRkciA9IG5ldGxibF9hZjRsaXN0X3JlbW92ZShhZGRyLT5zX2FkZHIsIG1hc2stPnNfYWRkciwKKwkJCQkJICAgJmVudHJ5X21hcC0+dHlwZV9kZWYuYWRkcnNlbC0+bGlzdDQpOworCXNwaW5fdW5sb2NrKCZuZXRsYmxfZG9taHNoX2xvY2spOworCisJaWYgKGVudHJ5X2FkZHIgPT0gTlVMTCkKKwkJZ290byByZW1vdmVfYWY0X2ZhaWx1cmU7CisJbmV0bGJsX2FmNGxpc3RfZm9yZWFjaF9yY3UoaXRlcjQsICZlbnRyeV9tYXAtPnR5cGVfZGVmLmFkZHJzZWwtPmxpc3Q0KQorCQlnb3RvIHJlbW92ZV9hZjRfc2luZ2xlX2FkZHI7CisjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisJbmV0bGJsX2FmNmxpc3RfZm9yZWFjaF9yY3UoaXRlcjYsICZlbnRyeV9tYXAtPnR5cGVfZGVmLmFkZHJzZWwtPmxpc3Q2KQorCQlnb3RvIHJlbW92ZV9hZjRfc2luZ2xlX2FkZHI7CisjZW5kaWYgLyogSVB2NiAqLworCS8qIHRoZSBkb21haW4gbWFwcGluZyBpcyBlbXB0eSBzbyByZW1vdmUgaXQgZnJvbSB0aGUgbWFwcGluZyB0YWJsZSAqLworCW5ldGxibF9kb21oc2hfcmVtb3ZlX2VudHJ5KGVudHJ5X21hcCwgYXVkaXRfaW5mbyk7CisKK3JlbW92ZV9hZjRfc2luZ2xlX2FkZHI6CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJLyogeWljaywgd2UgY2FuJ3QgdXNlIGNhbGxfcmN1IGhlcmUgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIGEgcmN1IGhlYWQKKwkgKiBwb2ludGVyIGJ1dCBob3BlZnVsbHkgdGhpcyBzaG91bGQgYmUgYSByYXJlIGNhc2Ugc28gdGhlIHBhdXNlCisJICogc2hvdWxkbid0IGJlIGEgcHJvYmxlbSAqLworCXN5bmNocm9uaXplX3JjdSgpOworCWVudHJ5ID0gbmV0bGJsX2RvbWhzaF9hZGRyNF9lbnRyeShlbnRyeV9hZGRyKTsKKwljaXBzb192NF9kb2lfcHV0ZGVmKGVudHJ5LT50eXBlX2RlZi5jaXBzb3Y0KTsKKwlrZnJlZShlbnRyeSk7CisJcmV0dXJuIDA7CisKK3JlbW92ZV9hZjRfZmFpbHVyZToKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gLUVOT0VOVDsKK30KKworLyoqCiAgKiBuZXRsYmxfZG9taHNoX3JlbW92ZSAtIFJlbW92ZXMgYW4gZW50cnkgZnJvbSB0aGUgZG9tYWluIGhhc2ggdGFibGUKICAqIEBkb21haW46IHRoZSBkb21haW4gdG8gcmVtb3ZlCiAgKiBAYXVkaXRfaW5mbzogTmV0TGFiZWwgYXVkaXQgaW5mb3JtYXRpb24KZGlmZiAtLWdpdCBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9kb21haW5oYXNoLmggYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfZG9tYWluaGFzaC5oCmluZGV4IGJmY2I2NzYuLjAyNjFkZGEgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9kb21haW5oYXNoLmgKKysrIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX2RvbWFpbmhhc2guaApAQCAtOTAsNiArOTAsMTAgQEAKIAkJCSAgICAgIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pOwogaW50IG5ldGxibF9kb21oc2hfcmVtb3ZlX2VudHJ5KHN0cnVjdCBuZXRsYmxfZG9tX21hcCAqZW50cnksCiAJCQkgICAgICAgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbyk7CitpbnQgbmV0bGJsX2RvbWhzaF9yZW1vdmVfYWY0KGNvbnN0IGNoYXIgKmRvbWFpbiwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGluX2FkZHIgKmFkZHIsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICptYXNrLAorCQkJICAgICBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKTsKIGludCBuZXRsYmxfZG9taHNoX3JlbW92ZShjb25zdCBjaGFyICpkb21haW4sIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pOwogaW50IG5ldGxibF9kb21oc2hfcmVtb3ZlX2RlZmF1bHQoc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbyk7CiBzdHJ1Y3QgbmV0bGJsX2RvbV9tYXAgKm5ldGxibF9kb21oc2hfZ2V0ZW50cnkoY29uc3QgY2hhciAqZG9tYWluKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9rYXBpLmMgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfa2FwaS5jCmluZGV4IGIzMmVjZWIuLmZkOTIyOWQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9rYXBpLmMKKysrIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX2thcGkuYwpAQCAtMzEsNyArMzEsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9hdWRpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaW42Lmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KICNpbmNsdWRlIDxuZXQvbmV0bGFiZWwuaD4KICNpbmNsdWRlIDxuZXQvY2lwc29faXB2NC5oPgogI2luY2x1ZGUgPGFzbS9idWcuaD4KQEAgLTQyLDYgKzQ1LDcgQEAKICNpbmNsdWRlICJuZXRsYWJlbF9jaXBzb192NC5oIgogI2luY2x1ZGUgIm5ldGxhYmVsX3VzZXIuaCIKICNpbmNsdWRlICJuZXRsYWJlbF9tZ210LmgiCisjaW5jbHVkZSAibmV0bGFiZWxfYWRkcmxpc3QuaCIKIAogLyoKICAqIENvbmZpZ3VyYXRpb24gRnVuY3Rpb25zCkBAIC01MCw2ICs1NCw5IEBACiAvKioKICAqIG5ldGxibF9jZmdfbWFwX2RlbCAtIFJlbW92ZSBhIE5ldExhYmVsL0xTTSBkb21haW4gbWFwcGluZwogICogQGRvbWFpbjogdGhlIGRvbWFpbiBtYXBwaW5nIHRvIHJlbW92ZQorICogQGZhbWlseTogYWRkcmVzcyBmYW1pbHkKKyAqIEBhZGRyOiBJUCBhZGRyZXNzCisgKiBAbWFzazogSVAgYWRkcmVzcyBtYXNrCiAgKiBAYXVkaXRfaW5mbzogTmV0TGFiZWwgYXVkaXQgaW5mb3JtYXRpb24KICAqCiAgKiBEZXNjcmlwdGlvbjoKQEAgLTU4LDE0ICs2NSwzMiBAQAogICogdmFsdWVzIG9uIGZhaWx1cmUuCiAgKgogICovCi1pbnQgbmV0bGJsX2NmZ19tYXBfZGVsKGNvbnN0IGNoYXIgKmRvbWFpbiwgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbykKK2ludCBuZXRsYmxfY2ZnX21hcF9kZWwoY29uc3QgY2hhciAqZG9tYWluLAorCQkgICAgICAgdTE2IGZhbWlseSwKKwkJICAgICAgIGNvbnN0IHZvaWQgKmFkZHIsCisJCSAgICAgICBjb25zdCB2b2lkICptYXNrLAorCQkgICAgICAgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbykKIHsKLQlyZXR1cm4gbmV0bGJsX2RvbWhzaF9yZW1vdmUoZG9tYWluLCBhdWRpdF9pbmZvKTsKKwlpZiAoYWRkciA9PSBOVUxMICYmIG1hc2sgPT0gTlVMTCkgeworCQlyZXR1cm4gbmV0bGJsX2RvbWhzaF9yZW1vdmUoZG9tYWluLCBhdWRpdF9pbmZvKTsKKwl9IGVsc2UgaWYgKGFkZHIgIT0gTlVMTCAmJiBtYXNrICE9IE5VTEwpIHsKKwkJc3dpdGNoIChmYW1pbHkpIHsKKwkJY2FzZSBBRl9JTkVUOgorCQkJcmV0dXJuIG5ldGxibF9kb21oc2hfcmVtb3ZlX2FmNChkb21haW4sIGFkZHIsIG1hc2ssCisJCQkJCQkJYXVkaXRfaW5mbyk7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVQRk5PU1VQUE9SVDsKKwkJfQorCX0gZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKIH0KIAogLyoqCi0gKiBuZXRsYmxfY2ZnX3VubGJsX2FkZF9tYXAgLSBBZGQgYW4gdW5sYWJlbGVkIE5ldExhYmVsL0xTTSBkb21haW4gbWFwcGluZworICogbmV0bGJsX2NmZ191bmxibF9tYXBfYWRkIC0gQWRkIGEgbmV3IHVubGFiZWxlZCBtYXBwaW5nCiAgKiBAZG9tYWluOiB0aGUgZG9tYWluIG1hcHBpbmcgdG8gYWRkCisgKiBAZmFtaWx5OiBhZGRyZXNzIGZhbWlseQorICogQGFkZHI6IElQIGFkZHJlc3MKKyAqIEBtYXNrOiBJUCBhZGRyZXNzIG1hc2sKICAqIEBhdWRpdF9pbmZvOiBOZXRMYWJlbCBhdWRpdCBpbmZvcm1hdGlvbgogICoKICAqIERlc2NyaXB0aW9uOgpAQCAtNzQsMTEgKzk5LDE5IEBACiAgKiBuZWdhdGl2ZSB2YWx1ZXMgb24gZmFpbHVyZS4KICAqCiAgKi8KLWludCBuZXRsYmxfY2ZnX3VubGJsX2FkZF9tYXAoY29uc3QgY2hhciAqZG9tYWluLAoraW50IG5ldGxibF9jZmdfdW5sYmxfbWFwX2FkZChjb25zdCBjaGFyICpkb21haW4sCisJCQkgICAgIHUxNiBmYW1pbHksCisJCQkgICAgIGNvbnN0IHZvaWQgKmFkZHIsCisJCQkgICAgIGNvbnN0IHZvaWQgKm1hc2ssCiAJCQkgICAgIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pCiB7CiAJaW50IHJldF92YWwgPSAtRU5PTUVNOwogCXN0cnVjdCBuZXRsYmxfZG9tX21hcCAqZW50cnk7CisJc3RydWN0IG5ldGxibF9kb21hZGRyX21hcCAqYWRkcm1hcCA9IE5VTEw7CisJc3RydWN0IG5ldGxibF9kb21hZGRyNF9tYXAgKm1hcDQgPSBOVUxMOworCXN0cnVjdCBuZXRsYmxfZG9tYWRkcjZfbWFwICptYXA2ID0gTlVMTDsKKwljb25zdCBzdHJ1Y3QgaW5fYWRkciAqYWRkcjQsICptYXNrNDsKKwljb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHI2LCAqbWFzazY7CiAKIAllbnRyeSA9IGt6YWxsb2Moc2l6ZW9mKCplbnRyeSksIEdGUF9BVE9NSUMpOwogCWlmIChlbnRyeSA9PSBOVUxMKQpAQCAtODYsNDkgKzExOSwyMjUgQEAKIAlpZiAoZG9tYWluICE9IE5VTEwpIHsKIAkJZW50cnktPmRvbWFpbiA9IGtzdHJkdXAoZG9tYWluLCBHRlBfQVRPTUlDKTsKIAkJaWYgKGVudHJ5LT5kb21haW4gPT0gTlVMTCkKLQkJCWdvdG8gY2ZnX3VubGJsX2FkZF9tYXBfZmFpbHVyZTsKKwkJCWdvdG8gY2ZnX3VubGJsX21hcF9hZGRfZmFpbHVyZTsKIAl9Ci0JZW50cnktPnR5cGUgPSBORVRMQkxfTkxUWVBFX1VOTEFCRUxFRDsKKworCWlmIChhZGRyID09IE5VTEwgJiYgbWFzayA9PSBOVUxMKQorCQllbnRyeS0+dHlwZSA9IE5FVExCTF9OTFRZUEVfVU5MQUJFTEVEOworCWVsc2UgaWYgKGFkZHIgIT0gTlVMTCAmJiBtYXNrICE9IE5VTEwpIHsKKwkJYWRkcm1hcCA9IGt6YWxsb2Moc2l6ZW9mKCphZGRybWFwKSwgR0ZQX0FUT01JQyk7CisJCWlmIChhZGRybWFwID09IE5VTEwpCisJCQlnb3RvIGNmZ191bmxibF9tYXBfYWRkX2ZhaWx1cmU7CisJCUlOSVRfTElTVF9IRUFEKCZhZGRybWFwLT5saXN0NCk7CisJCUlOSVRfTElTVF9IRUFEKCZhZGRybWFwLT5saXN0Nik7CisKKwkJc3dpdGNoIChmYW1pbHkpIHsKKwkJY2FzZSBBRl9JTkVUOgorCQkJYWRkcjQgPSBhZGRyOworCQkJbWFzazQgPSBtYXNrOworCQkJbWFwNCA9IGt6YWxsb2Moc2l6ZW9mKCptYXA0KSwgR0ZQX0FUT01JQyk7CisJCQlpZiAobWFwNCA9PSBOVUxMKQorCQkJCWdvdG8gY2ZnX3VubGJsX21hcF9hZGRfZmFpbHVyZTsKKwkJCW1hcDQtPnR5cGUgPSBORVRMQkxfTkxUWVBFX1VOTEFCRUxFRDsKKwkJCW1hcDQtPmxpc3QuYWRkciA9IGFkZHI0LT5zX2FkZHIgJiBtYXNrNC0+c19hZGRyOworCQkJbWFwNC0+bGlzdC5tYXNrID0gbWFzazQtPnNfYWRkcjsKKwkJCW1hcDQtPmxpc3QudmFsaWQgPSAxOworCQkJcmV0X3ZhbCA9IG5ldGxibF9hZjRsaXN0X2FkZCgmbWFwNC0+bGlzdCwKKwkJCQkJCSAgICAgJmFkZHJtYXAtPmxpc3Q0KTsKKwkJCWlmIChyZXRfdmFsICE9IDApCisJCQkJZ290byBjZmdfdW5sYmxfbWFwX2FkZF9mYWlsdXJlOworCQkJYnJlYWs7CisJCWNhc2UgQUZfSU5FVDY6CisJCQlhZGRyNiA9IGFkZHI7CisJCQltYXNrNiA9IG1hc2s7CisJCQltYXA2ID0ga3phbGxvYyhzaXplb2YoKm1hcDYpLCBHRlBfQVRPTUlDKTsKKwkJCWlmIChtYXA0ID09IE5VTEwpCisJCQkJZ290byBjZmdfdW5sYmxfbWFwX2FkZF9mYWlsdXJlOworCQkJbWFwNi0+dHlwZSA9IE5FVExCTF9OTFRZUEVfVU5MQUJFTEVEOworCQkJaXB2Nl9hZGRyX2NvcHkoJm1hcDYtPmxpc3QuYWRkciwgYWRkcjYpOworCQkJbWFwNi0+bGlzdC5hZGRyLnM2X2FkZHIzMlswXSAmPSBtYXNrNi0+czZfYWRkcjMyWzBdOworCQkJbWFwNi0+bGlzdC5hZGRyLnM2X2FkZHIzMlsxXSAmPSBtYXNrNi0+czZfYWRkcjMyWzFdOworCQkJbWFwNi0+bGlzdC5hZGRyLnM2X2FkZHIzMlsyXSAmPSBtYXNrNi0+czZfYWRkcjMyWzJdOworCQkJbWFwNi0+bGlzdC5hZGRyLnM2X2FkZHIzMlszXSAmPSBtYXNrNi0+czZfYWRkcjMyWzNdOworCQkJaXB2Nl9hZGRyX2NvcHkoJm1hcDYtPmxpc3QubWFzaywgbWFzazYpOworCQkJbWFwNi0+bGlzdC52YWxpZCA9IDE7CisJCQlyZXRfdmFsID0gbmV0bGJsX2FmNGxpc3RfYWRkKCZtYXA0LT5saXN0LAorCQkJCQkJICAgICAmYWRkcm1hcC0+bGlzdDQpOworCQkJaWYgKHJldF92YWwgIT0gMCkKKwkJCQlnb3RvIGNmZ191bmxibF9tYXBfYWRkX2ZhaWx1cmU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gY2ZnX3VubGJsX21hcF9hZGRfZmFpbHVyZTsKKwkJCWJyZWFrOworCQl9CisKKwkJZW50cnktPnR5cGVfZGVmLmFkZHJzZWwgPSBhZGRybWFwOworCQllbnRyeS0+dHlwZSA9IE5FVExCTF9OTFRZUEVfQUREUlNFTEVDVDsKKwl9IGVsc2UgeworCQlyZXRfdmFsID0gLUVJTlZBTDsKKwkJZ290byBjZmdfdW5sYmxfbWFwX2FkZF9mYWlsdXJlOworCX0KIAogCXJldF92YWwgPSBuZXRsYmxfZG9taHNoX2FkZChlbnRyeSwgYXVkaXRfaW5mbyk7CiAJaWYgKHJldF92YWwgIT0gMCkKLQkJZ290byBjZmdfdW5sYmxfYWRkX21hcF9mYWlsdXJlOworCQlnb3RvIGNmZ191bmxibF9tYXBfYWRkX2ZhaWx1cmU7CiAKIAlyZXR1cm4gMDsKIAotY2ZnX3VubGJsX2FkZF9tYXBfZmFpbHVyZToKK2NmZ191bmxibF9tYXBfYWRkX2ZhaWx1cmU6CiAJaWYgKGVudHJ5ICE9IE5VTEwpCiAJCWtmcmVlKGVudHJ5LT5kb21haW4pOwogCWtmcmVlKGVudHJ5KTsKKwlrZnJlZShhZGRybWFwKTsKKwlrZnJlZShtYXA0KTsKKwlrZnJlZShtYXA2KTsKIAlyZXR1cm4gcmV0X3ZhbDsKIH0KIAorCiAvKioKLSAqIG5ldGxibF9jZmdfY2lwc292NF9hZGRfbWFwIC0gQWRkIGEgbmV3IENJUFNPdjQgRE9JIGRlZmluaXRpb24gYW5kIG1hcHBpbmcKLSAqIEBkb2lfZGVmOiB0aGUgRE9JIGRlZmluaXRpb24KLSAqIEBkb21haW46IHRoZSBkb21haW4gbWFwcGluZyB0byBhZGQKKyAqIG5ldGxibF9jZmdfdW5sYmxfc3RhdGljX2FkZCAtIEFkZHMgYSBuZXcgc3RhdGljIGxhYmVsCisgKiBAbmV0OiBuZXR3b3JrIG5hbWVzcGFjZQorICogQGRldl9uYW1lOiBpbnRlcmZhY2UgbmFtZQorICogQGFkZHI6IElQIGFkZHJlc3MgaW4gbmV0d29yayBieXRlIG9yZGVyIChzdHJ1Y3QgaW5bNl1fYWRkcikKKyAqIEBtYXNrOiBhZGRyZXNzIG1hc2sgaW4gbmV0d29yayBieXRlIG9yZGVyIChzdHJ1Y3QgaW5bNl1fYWRkcikKKyAqIEBmYW1pbHk6IGFkZHJlc3MgZmFtaWx5CisgKiBAc2VjaWQ6IExTTSBzZWNpZCB2YWx1ZSBmb3IgdGhlIGVudHJ5CiAgKiBAYXVkaXRfaW5mbzogTmV0TGFiZWwgYXVkaXQgaW5mb3JtYXRpb24KICAqCiAgKiBEZXNjcmlwdGlvbjoKLSAqIEFkZCBhIG5ldyBDSVBTT3Y0IERPSSBkZWZpbml0aW9uIGFuZCBOZXRMYWJlbC9MU00gZG9tYWluIG1hcHBpbmcgZm9yIHRoaXMKLSAqIG5ldyBET0kgZGVmaW5pdGlvbiB0byB0aGUgTmV0TGFiZWwgc3Vic3lzdGVtLiAgQSBAZG9tYWluIHZhbHVlIG9mIE5VTEwgYWRkcwotICogYSBuZXcgZGVmYXVsdCBkb21haW4gbWFwcGluZy4gIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZXMgb24KLSAqIGZhaWx1cmUuCisgKiBBZGRzIGEgbmV3IE5ldExhYmVsIHN0YXRpYyBsYWJlbCB0byBiZSB1c2VkIHdoZW4gcHJvdG9jb2wgcHJvdmlkZWQgbGFiZWxzCisgKiBhcmUgbm90IHByZXNlbnQgb24gaW5jb21pbmcgdHJhZmZpYy4gIElmIEBkZXZfbmFtZSBpcyBOVUxMIHRoZW4gdGhlIGRlZmF1bHQKKyAqIGludGVyZmFjZSB3aWxsIGJlIHVzZWQuICBSZXR1cm5zIHplcm8gb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWVzIG9uIGZhaWx1cmUuCiAgKgogICovCi1pbnQgbmV0bGJsX2NmZ19jaXBzb3Y0X2FkZF9tYXAoc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZiwKK2ludCBuZXRsYmxfY2ZnX3VubGJsX3N0YXRpY19hZGQoc3RydWN0IG5ldCAqbmV0LAorCQkJCWNvbnN0IGNoYXIgKmRldl9uYW1lLAorCQkJCWNvbnN0IHZvaWQgKmFkZHIsCisJCQkJY29uc3Qgdm9pZCAqbWFzaywKKwkJCQl1MTYgZmFtaWx5LAorCQkJCXUzMiBzZWNpZCwKKwkJCQlzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKQoreworCXUzMiBhZGRyX2xlbjsKKworCXN3aXRjaCAoZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOgorCQlhZGRyX2xlbiA9IHNpemVvZihzdHJ1Y3QgaW5fYWRkcik7CisJCWJyZWFrOworCWNhc2UgQUZfSU5FVDY6CisJCWFkZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRVBGTk9TVVBQT1JUOworCX0KKworCXJldHVybiBuZXRsYmxfdW5saHNoX2FkZChuZXQsCisJCQkJIGRldl9uYW1lLCBhZGRyLCBtYXNrLCBhZGRyX2xlbiwKKwkJCQkgc2VjaWQsIGF1ZGl0X2luZm8pOworfQorCisvKioKKyAqIG5ldGxibF9jZmdfdW5sYmxfc3RhdGljX2RlbCAtIFJlbW92ZXMgYW4gZXhpc3Rpbmcgc3RhdGljIGxhYmVsCisgKiBAbmV0OiBuZXR3b3JrIG5hbWVzcGFjZQorICogQGRldl9uYW1lOiBpbnRlcmZhY2UgbmFtZQorICogQGFkZHI6IElQIGFkZHJlc3MgaW4gbmV0d29yayBieXRlIG9yZGVyIChzdHJ1Y3QgaW5bNl1fYWRkcikKKyAqIEBtYXNrOiBhZGRyZXNzIG1hc2sgaW4gbmV0d29yayBieXRlIG9yZGVyIChzdHJ1Y3QgaW5bNl1fYWRkcikKKyAqIEBmYW1pbHk6IGFkZHJlc3MgZmFtaWx5CisgKiBAc2VjaWQ6IExTTSBzZWNpZCB2YWx1ZSBmb3IgdGhlIGVudHJ5CisgKiBAYXVkaXRfaW5mbzogTmV0TGFiZWwgYXVkaXQgaW5mb3JtYXRpb24KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFJlbW92ZXMgYW4gZXhpc3RpbmcgTmV0TGFiZWwgc3RhdGljIGxhYmVsIHVzZWQgd2hlbiBwcm90b2NvbCBwcm92aWRlZCBsYWJlbHMKKyAqIGFyZSBub3QgcHJlc2VudCBvbiBpbmNvbWluZyB0cmFmZmljLiAgSWYgQGRldl9uYW1lIGlzIE5VTEwgdGhlbiB0aGUgZGVmYXVsdAorICogaW50ZXJmYWNlIHdpbGwgYmUgdXNlZC4gIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZXMgb24gZmFpbHVyZS4KKyAqCisgKi8KK2ludCBuZXRsYmxfY2ZnX3VubGJsX3N0YXRpY19kZWwoc3RydWN0IG5ldCAqbmV0LAorCQkJCWNvbnN0IGNoYXIgKmRldl9uYW1lLAorCQkJCWNvbnN0IHZvaWQgKmFkZHIsCisJCQkJY29uc3Qgdm9pZCAqbWFzaywKKwkJCQl1MTYgZmFtaWx5LAorCQkJCXN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pCit7CisJdTMyIGFkZHJfbGVuOworCisJc3dpdGNoIChmYW1pbHkpIHsKKwljYXNlIEFGX0lORVQ6CisJCWFkZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBBRl9JTkVUNjoKKwkJYWRkcl9sZW4gPSBzaXplb2Yoc3RydWN0IGluNl9hZGRyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FUEZOT1NVUFBPUlQ7CisJfQorCisJcmV0dXJuIG5ldGxibF91bmxoc2hfcmVtb3ZlKG5ldCwKKwkJCQkgICAgZGV2X25hbWUsIGFkZHIsIG1hc2ssIGFkZHJfbGVuLAorCQkJCSAgICBhdWRpdF9pbmZvKTsKK30KKworLyoqCisgKiBuZXRsYmxfY2ZnX2NpcHNvdjRfYWRkIC0gQWRkIGEgbmV3IENJUFNPdjQgRE9JIGRlZmluaXRpb24KKyAqIEBkb2lfZGVmOiBDSVBTTyBET0kgZGVmaW5pdGlvbgorICogQGF1ZGl0X2luZm86IE5ldExhYmVsIGF1ZGl0IGluZm9ybWF0aW9uCisgKgorICogRGVzY3JpcHRpb246CisgKiBBZGQgYSBuZXcgQ0lQU08gRE9JIGRlZmluaXRpb24gYXMgZGVmaW5lZCBieSBAZG9pX2RlZi4gIFJldHVybnMgemVybyBvbgorICogc3VjY2VzcyBhbmQgbmVnYXRpdmUgdmFsdWVzIG9uIGZhaWx1cmUuCisgKgorICovCitpbnQgbmV0bGJsX2NmZ19jaXBzb3Y0X2FkZChzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmLAorCQkJICAgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbykKK3sKKwlyZXR1cm4gY2lwc29fdjRfZG9pX2FkZChkb2lfZGVmLCBhdWRpdF9pbmZvKTsKK30KKworLyoqCisgKiBuZXRsYmxfY2ZnX2NpcHNvdjRfZGVsIC0gUmVtb3ZlIGFuIGV4aXN0aW5nIENJUFNPdjQgRE9JIGRlZmluaXRpb24KKyAqIEBkb2k6IENJUFNPIERPSQorICogQGF1ZGl0X2luZm86IE5ldExhYmVsIGF1ZGl0IGluZm9ybWF0aW9uCisgKgorICogRGVzY3JpcHRpb246CisgKiBSZW1vdmUgYW4gZXhpc3RpbmcgQ0lQU08gRE9JIGRlZmluaXRpb24gbWF0Y2hpbmcgQGRvaS4gIFJldHVybnMgemVybyBvbgorICogc3VjY2VzcyBhbmQgbmVnYXRpdmUgdmFsdWVzIG9uIGZhaWx1cmUuCisgKgorICovCit2b2lkIG5ldGxibF9jZmdfY2lwc292NF9kZWwodTMyIGRvaSwgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbykKK3sKKwljaXBzb192NF9kb2lfcmVtb3ZlKGRvaSwgYXVkaXRfaW5mbyk7Cit9CisKKy8qKgorICogbmV0bGJsX2NmZ19jaXBzb3Y0X21hcF9hZGQgLSBBZGQgYSBuZXcgQ0lQU092NCBET0kgbWFwcGluZworICogQGRvaTogdGhlIENJUFNPIERPSQorICogQGRvbWFpbjogdGhlIGRvbWFpbiBtYXBwaW5nIHRvIGFkZAorICogQGFkZHI6IElQIGFkZHJlc3MKKyAqIEBtYXNrOiBJUCBhZGRyZXNzIG1hc2sKKyAqIEBhdWRpdF9pbmZvOiBOZXRMYWJlbCBhdWRpdCBpbmZvcm1hdGlvbgorICoKKyAqIERlc2NyaXB0aW9uOgorICogQWRkIGEgbmV3IE5ldExhYmVsL0xTTSBkb21haW4gbWFwcGluZyBmb3IgdGhlIGdpdmVuIENJUFNPIERPSSB0byB0aGUgTmV0TGFiZWwKKyAqIHN1YnN5c3RlbS4gIEEgQGRvbWFpbiB2YWx1ZSBvZiBOVUxMIGFkZHMgYSBuZXcgZGVmYXVsdCBkb21haW4gbWFwcGluZy4KKyAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZXMgb24gZmFpbHVyZS4KKyAqCisgKi8KK2ludCBuZXRsYmxfY2ZnX2NpcHNvdjRfbWFwX2FkZCh1MzIgZG9pLAogCQkJICAgICAgIGNvbnN0IGNoYXIgKmRvbWFpbiwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciAqYWRkciwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciAqbWFzaywKIAkJCSAgICAgICBzdHJ1Y3QgbmV0bGJsX2F1ZGl0ICphdWRpdF9pbmZvKQogewogCWludCByZXRfdmFsID0gLUVOT01FTTsKLQl1MzIgZG9pOwotCXUzMiBkb2lfdHlwZTsKKwlzdHJ1Y3QgY2lwc29fdjRfZG9pICpkb2lfZGVmOwogCXN0cnVjdCBuZXRsYmxfZG9tX21hcCAqZW50cnk7Ci0JY29uc3QgY2hhciAqdHlwZV9zdHI7Ci0Jc3RydWN0IGF1ZGl0X2J1ZmZlciAqYXVkaXRfYnVmOworCXN0cnVjdCBuZXRsYmxfZG9tYWRkcl9tYXAgKmFkZHJtYXAgPSBOVUxMOworCXN0cnVjdCBuZXRsYmxfZG9tYWRkcjRfbWFwICphZGRyaW5mbyA9IE5VTEw7CiAKLQlkb2kgPSBkb2lfZGVmLT5kb2k7Ci0JZG9pX3R5cGUgPSBkb2lfZGVmLT50eXBlOworCWRvaV9kZWYgPSBjaXBzb192NF9kb2lfZ2V0ZGVmKGRvaSk7CisJaWYgKGRvaV9kZWYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9FTlQ7CiAKIAllbnRyeSA9IGt6YWxsb2Moc2l6ZW9mKCplbnRyeSksIEdGUF9BVE9NSUMpOwogCWlmIChlbnRyeSA9PSBOVUxMKQpAQCAtMTM2LDU2ICszNDUsNTIgQEAKIAlpZiAoZG9tYWluICE9IE5VTEwpIHsKIAkJZW50cnktPmRvbWFpbiA9IGtzdHJkdXAoZG9tYWluLCBHRlBfQVRPTUlDKTsKIAkJaWYgKGVudHJ5LT5kb21haW4gPT0gTlVMTCkKLQkJCWdvdG8gY2ZnX2NpcHNvdjRfYWRkX21hcF9mYWlsdXJlOworCQkJZ290byBjZmdfY2lwc292NF9tYXBfYWRkX2ZhaWx1cmU7CiAJfQogCi0JcmV0X3ZhbCA9IGNpcHNvX3Y0X2RvaV9hZGQoZG9pX2RlZik7Ci0JaWYgKHJldF92YWwgIT0gMCkKLQkJZ290byBjZmdfY2lwc292NF9hZGRfbWFwX2ZhaWx1cmVfcmVtb3ZlX2RvaTsKLQllbnRyeS0+dHlwZSA9IE5FVExCTF9OTFRZUEVfQ0lQU09WNDsKLQllbnRyeS0+dHlwZV9kZWYuY2lwc292NCA9IGNpcHNvX3Y0X2RvaV9nZXRkZWYoZG9pKTsKLQlpZiAoZW50cnktPnR5cGVfZGVmLmNpcHNvdjQgPT0gTlVMTCkgewotCQlyZXRfdmFsID0gLUVOT0VOVDsKLQkJZ290byBjZmdfY2lwc292NF9hZGRfbWFwX2ZhaWx1cmVfcmVtb3ZlX2RvaTsKKwlpZiAoYWRkciA9PSBOVUxMICYmIG1hc2sgPT0gTlVMTCkgeworCQllbnRyeS0+dHlwZV9kZWYuY2lwc292NCA9IGRvaV9kZWY7CisJCWVudHJ5LT50eXBlID0gTkVUTEJMX05MVFlQRV9DSVBTT1Y0OworCX0gZWxzZSBpZiAoYWRkciAhPSBOVUxMICYmIG1hc2sgIT0gTlVMTCkgeworCQlhZGRybWFwID0ga3phbGxvYyhzaXplb2YoKmFkZHJtYXApLCBHRlBfQVRPTUlDKTsKKwkJaWYgKGFkZHJtYXAgPT0gTlVMTCkKKwkJCWdvdG8gY2ZnX2NpcHNvdjRfbWFwX2FkZF9mYWlsdXJlOworCQlJTklUX0xJU1RfSEVBRCgmYWRkcm1hcC0+bGlzdDQpOworCQlJTklUX0xJU1RfSEVBRCgmYWRkcm1hcC0+bGlzdDYpOworCisJCWFkZHJpbmZvID0ga3phbGxvYyhzaXplb2YoKmFkZHJpbmZvKSwgR0ZQX0FUT01JQyk7CisJCWlmIChhZGRyaW5mbyA9PSBOVUxMKQorCQkJZ290byBjZmdfY2lwc292NF9tYXBfYWRkX2ZhaWx1cmU7CisJCWFkZHJpbmZvLT50eXBlX2RlZi5jaXBzb3Y0ID0gZG9pX2RlZjsKKwkJYWRkcmluZm8tPnR5cGUgPSBORVRMQkxfTkxUWVBFX0NJUFNPVjQ7CisJCWFkZHJpbmZvLT5saXN0LmFkZHIgPSBhZGRyLT5zX2FkZHIgJiBtYXNrLT5zX2FkZHI7CisJCWFkZHJpbmZvLT5saXN0Lm1hc2sgPSBtYXNrLT5zX2FkZHI7CisJCWFkZHJpbmZvLT5saXN0LnZhbGlkID0gMTsKKwkJcmV0X3ZhbCA9IG5ldGxibF9hZjRsaXN0X2FkZCgmYWRkcmluZm8tPmxpc3QsICZhZGRybWFwLT5saXN0NCk7CisJCWlmIChyZXRfdmFsICE9IDApCisJCQlnb3RvIGNmZ19jaXBzb3Y0X21hcF9hZGRfZmFpbHVyZTsKKworCQllbnRyeS0+dHlwZV9kZWYuYWRkcnNlbCA9IGFkZHJtYXA7CisJCWVudHJ5LT50eXBlID0gTkVUTEJMX05MVFlQRV9BRERSU0VMRUNUOworCX0gZWxzZSB7CisJCXJldF92YWwgPSAtRUlOVkFMOworCQlnb3RvIGNmZ19jaXBzb3Y0X21hcF9hZGRfZmFpbHVyZTsKIAl9CisKIAlyZXRfdmFsID0gbmV0bGJsX2RvbWhzaF9hZGQoZW50cnksIGF1ZGl0X2luZm8pOwogCWlmIChyZXRfdmFsICE9IDApCi0JCWdvdG8gY2ZnX2NpcHNvdjRfYWRkX21hcF9mYWlsdXJlX3JlbGVhc2VfZG9pOworCQlnb3RvIGNmZ19jaXBzb3Y0X21hcF9hZGRfZmFpbHVyZTsKIAotY2ZnX2NpcHNvdjRfYWRkX21hcF9yZXR1cm46Ci0JYXVkaXRfYnVmID0gbmV0bGJsX2F1ZGl0X3N0YXJ0X2NvbW1vbihBVURJVF9NQUNfQ0lQU09WNF9BREQsCi0JCQkJCSAgICAgIGF1ZGl0X2luZm8pOwotCWlmIChhdWRpdF9idWYgIT0gTlVMTCkgewotCQlzd2l0Y2ggKGRvaV90eXBlKSB7Ci0JCWNhc2UgQ0lQU09fVjRfTUFQX1RSQU5TOgotCQkJdHlwZV9zdHIgPSAidHJhbnMiOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0lQU09fVjRfTUFQX1BBU1M6Ci0JCQl0eXBlX3N0ciA9ICJwYXNzIjsKLQkJCWJyZWFrOwotCQljYXNlIENJUFNPX1Y0X01BUF9MT0NBTDoKLQkJCXR5cGVfc3RyID0gImxvY2FsIjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJdHlwZV9zdHIgPSAiKHVua25vd24pIjsKLQkJfQotCQlhdWRpdF9sb2dfZm9ybWF0KGF1ZGl0X2J1ZiwKLQkJCQkgIiBjaXBzb19kb2k9JXUgY2lwc29fdHlwZT0lcyByZXM9JXUiLAotCQkJCSBkb2ksIHR5cGVfc3RyLCByZXRfdmFsID09IDAgPyAxIDogMCk7Ci0JCWF1ZGl0X2xvZ19lbmQoYXVkaXRfYnVmKTsKLQl9CisJcmV0dXJuIDA7CiAKLQlyZXR1cm4gcmV0X3ZhbDsKLQotY2ZnX2NpcHNvdjRfYWRkX21hcF9mYWlsdXJlX3JlbGVhc2VfZG9pOgorY2ZnX2NpcHNvdjRfbWFwX2FkZF9mYWlsdXJlOgogCWNpcHNvX3Y0X2RvaV9wdXRkZWYoZG9pX2RlZik7Ci1jZmdfY2lwc292NF9hZGRfbWFwX2ZhaWx1cmVfcmVtb3ZlX2RvaToKLQljaXBzb192NF9kb2lfcmVtb3ZlKGRvaSwgYXVkaXRfaW5mbyk7Ci1jZmdfY2lwc292NF9hZGRfbWFwX2ZhaWx1cmU6CiAJaWYgKGVudHJ5ICE9IE5VTEwpCiAJCWtmcmVlKGVudHJ5LT5kb21haW4pOwogCWtmcmVlKGVudHJ5KTsKLQlnb3RvIGNmZ19jaXBzb3Y0X2FkZF9tYXBfcmV0dXJuOworCWtmcmVlKGFkZHJtYXApOworCWtmcmVlKGFkZHJpbmZvKTsKKwlyZXR1cm4gcmV0X3ZhbDsKIH0KIAogLyoKQEAgLTY5MSw2ICs4OTYsMjggQEAKIH0KIAogLyoKKyAqIFByb3RvY29sIEVuZ2luZSBGdW5jdGlvbnMKKyAqLworCisvKioKKyAqIG5ldGxibF9hdWRpdF9zdGFydCAtIFN0YXJ0IGFuIGF1ZGl0IG1lc3NhZ2UKKyAqIEB0eXBlOiBhdWRpdCBtZXNzYWdlIHR5cGUKKyAqIEBhdWRpdF9pbmZvOiBOZXRMYWJlbCBhdWRpdCBpbmZvcm1hdGlvbgorICoKKyAqIERlc2NyaXB0aW9uOgorICogU3RhcnQgYW4gYXVkaXQgbWVzc2FnZSB1c2luZyB0aGUgdHlwZSBzcGVjaWZpZWQgaW4gQHR5cGUgYW5kIGZpbGwgdGhlIGF1ZGl0CisgKiBtZXNzYWdlIHdpdGggc29tZSBmaWVsZHMgY29tbW9uIHRvIGFsbCBOZXRMYWJlbCBhdWRpdCBtZXNzYWdlcy4gIFRoaXMKKyAqIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgcHJvdG9jb2wgZW5naW5lcywgbm90IExTTXMuICBSZXR1cm5zIGEKKyAqIHBvaW50ZXIgdG8gdGhlIGF1ZGl0IGJ1ZmZlciBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmUuCisgKgorICovCitzdHJ1Y3QgYXVkaXRfYnVmZmVyICpuZXRsYmxfYXVkaXRfc3RhcnQoaW50IHR5cGUsCisJCQkJCXN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pCit7CisJcmV0dXJuIG5ldGxibF9hdWRpdF9zdGFydF9jb21tb24odHlwZSwgYXVkaXRfaW5mbyk7Cit9CisKKy8qCiAgKiBTZXR1cCBGdW5jdGlvbnMKICAqLwogCmRpZmYgLS1naXQgYS9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfdW5sYWJlbGVkLmMgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfdW5sYWJlbGVkLmMKaW5kZXggOGMwMzA4MC4uZjNjNWM2OCAxMDA2NDQKLS0tIGEvbmV0L25ldGxhYmVsL25ldGxhYmVsX3VubGFiZWxlZC5jCisrKyBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF91bmxhYmVsZWQuYwpAQCAtNDUwLDEzICs0NTAsMTMgQEAKICAqIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlcyBvbiBmYWlsdXJlLgogICoKICAqLwotc3RhdGljIGludCBuZXRsYmxfdW5saHNoX2FkZChzdHJ1Y3QgbmV0ICpuZXQsCi0JCQkgICAgIGNvbnN0IGNoYXIgKmRldl9uYW1lLAotCQkJICAgICBjb25zdCB2b2lkICphZGRyLAotCQkJICAgICBjb25zdCB2b2lkICptYXNrLAotCQkJICAgICB1MzIgYWRkcl9sZW4sCi0JCQkgICAgIHUzMiBzZWNpZCwKLQkJCSAgICAgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbykKK2ludCBuZXRsYmxfdW5saHNoX2FkZChzdHJ1Y3QgbmV0ICpuZXQsCisJCSAgICAgIGNvbnN0IGNoYXIgKmRldl9uYW1lLAorCQkgICAgICBjb25zdCB2b2lkICphZGRyLAorCQkgICAgICBjb25zdCB2b2lkICptYXNrLAorCQkgICAgICB1MzIgYWRkcl9sZW4sCisJCSAgICAgIHUzMiBzZWNpZCwKKwkJICAgICAgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbykKIHsKIAlpbnQgcmV0X3ZhbDsKIAlpbnQgaWZpbmRleDsKQEAgLTcyMCwxMiArNzIwLDEyIEBACiAgKiBSZXR1cm5zIHplcm8gb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWVzIG9uIGZhaWx1cmUuCiAgKgogICovCi1zdGF0aWMgaW50IG5ldGxibF91bmxoc2hfcmVtb3ZlKHN0cnVjdCBuZXQgKm5ldCwKLQkJCQljb25zdCBjaGFyICpkZXZfbmFtZSwKLQkJCQljb25zdCB2b2lkICphZGRyLAotCQkJCWNvbnN0IHZvaWQgKm1hc2ssCi0JCQkJdTMyIGFkZHJfbGVuLAotCQkJCXN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pCitpbnQgbmV0bGJsX3VubGhzaF9yZW1vdmUoc3RydWN0IG5ldCAqbmV0LAorCQkJIGNvbnN0IGNoYXIgKmRldl9uYW1lLAorCQkJIGNvbnN0IHZvaWQgKmFkZHIsCisJCQkgY29uc3Qgdm9pZCAqbWFzaywKKwkJCSB1MzIgYWRkcl9sZW4sCisJCQkgc3RydWN0IG5ldGxibF9hdWRpdCAqYXVkaXRfaW5mbykKIHsKIAlpbnQgcmV0X3ZhbDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwpkaWZmIC0tZ2l0IGEvbmV0L25ldGxhYmVsL25ldGxhYmVsX3VubGFiZWxlZC5oIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX3VubGFiZWxlZC5oCmluZGV4IDA2YjEzMDEuLjdhYmE2MzUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF91bmxhYmVsZWQuaAorKysgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfdW5sYWJlbGVkLmgKQEAgLTIyMSw2ICsyMjEsMjEgQEAKIC8qIEdlbmVyYWwgVW5sYWJlbGVkIGluaXQgZnVuY3Rpb24gKi8KIGludCBuZXRsYmxfdW5sYWJlbF9pbml0KHUzMiBzaXplKTsKIAorLyogU3RhdGljL0ZhbGxiYWNrIGxhYmVsIG1hbmFnZW1lbnQgZnVuY3Rpb25zICovCitpbnQgbmV0bGJsX3VubGhzaF9hZGQoc3RydWN0IG5ldCAqbmV0LAorCQkgICAgICBjb25zdCBjaGFyICpkZXZfbmFtZSwKKwkJICAgICAgY29uc3Qgdm9pZCAqYWRkciwKKwkJICAgICAgY29uc3Qgdm9pZCAqbWFzaywKKwkJICAgICAgdTMyIGFkZHJfbGVuLAorCQkgICAgICB1MzIgc2VjaWQsCisJCSAgICAgIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pOworaW50IG5ldGxibF91bmxoc2hfcmVtb3ZlKHN0cnVjdCBuZXQgKm5ldCwKKwkJCSBjb25zdCBjaGFyICpkZXZfbmFtZSwKKwkJCSBjb25zdCB2b2lkICphZGRyLAorCQkJIGNvbnN0IHZvaWQgKm1hc2ssCisJCQkgdTMyIGFkZHJfbGVuLAorCQkJIHN0cnVjdCBuZXRsYmxfYXVkaXQgKmF1ZGl0X2luZm8pOworCiAvKiBQcm9jZXNzIFVubGFiZWxlZCBpbmNvbWluZyBuZXR3b3JrIHBhY2tldHMgKi8KIGludCBuZXRsYmxfdW5sYWJlbF9nZXRhdHRyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgICB1MTYgZmFtaWx5LApkaWZmIC0tZ2l0IGEvbmV0L25ldGxpbmsvZ2VuZXRsaW5rLmMgYi9uZXQvbmV0bGluay9nZW5ldGxpbmsuYwppbmRleCAzZTExOTFjLi4xZDNkZDMwIDEwMDY0NAotLS0gYS9uZXQvbmV0bGluay9nZW5ldGxpbmsuYworKysgYi9uZXQvbmV0bGluay9nZW5ldGxpbmsuYwpAQCAtMjI1LDYgKzIyNSw3IEBACiAJX19nZW5sX3VucmVnaXN0ZXJfbWNfZ3JvdXAoZmFtaWx5LCBncnApOwogCWdlbmxfdW5sb2NrKCk7CiB9CitFWFBPUlRfU1lNQk9MKGdlbmxfdW5yZWdpc3Rlcl9tY19ncm91cCk7CiAKIHN0YXRpYyB2b2lkIGdlbmxfdW5yZWdpc3Rlcl9tY19ncm91cHMoc3RydWN0IGdlbmxfZmFtaWx5ICpmYW1pbHkpCiB7CmRpZmYgLS1naXQgYS9uZXQvcGhvbmV0L3BlcC1ncHJzLmMgYi9uZXQvcGhvbmV0L3BlcC1ncHJzLmMKaW5kZXggYjBjZWFjMi4uNmE5MWEzMiAxMDA2NDQKLS0tIGEvbmV0L3Bob25ldC9wZXAtZ3Bycy5jCisrKyBiL25ldC9waG9uZXQvcGVwLWdwcnMuYwpAQCAtMjI3LDYgKzIyNywxMyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGdwcnNfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JPSBncHJzX29wZW4sCisJLm5kb19zdG9wCT0gZ3Byc19jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJPSBncHJzX3htaXQsCisJLm5kb19jaGFuZ2VfbXR1CT0gZ3Byc19zZXRfbXR1LAorfTsKKwogc3RhdGljIHZvaWQgZ3Byc19zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCWRldi0+ZmVhdHVyZXMJCT0gTkVUSUZfRl9GUkFHTElTVDsKQEAgLTIzNywxMSArMjQ0LDggQEAKIAlkZXYtPmFkZHJfbGVuCQk9IDA7CiAJZGV2LT50eF9xdWV1ZV9sZW4JPSAxMDsKIAorCWRldi0+bmV0ZGV2X29wcwkJPSAmZ3Byc19uZXRkZXZfb3BzOwogCWRldi0+ZGVzdHJ1Y3RvcgkJPSBmcmVlX25ldGRldjsKLQlkZXYtPm9wZW4JCT0gZ3Byc19vcGVuOwotCWRldi0+c3RvcAkJPSBncHJzX2Nsb3NlOwotCWRldi0+aGFyZF9zdGFydF94bWl0CT0gZ3Byc194bWl0OyAvKiBtYW5kYXRvcnkgKi8KLQlkZXYtPmNoYW5nZV9tdHUJCT0gZ3Byc19zZXRfbXR1OwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvbmV0L3Jma2lsbC9yZmtpbGwuYyBiL25ldC9yZmtpbGwvcmZraWxsLmMKaW5kZXggM2M5NGY3Ni4uM2VhYTM5NCAxMDA2NDQKLS0tIGEvbmV0L3Jma2lsbC9yZmtpbGwuYworKysgYi9uZXQvcmZraWxsL3Jma2lsbC5jCkBAIC01NCwxMCArNTQsMTAgQEAKIHN0YXRpYyBib29sIHJma2lsbF9lcG9fbG9ja19hY3RpdmU7CiAKIAorI2lmZGVmIENPTkZJR19SRktJTExfTEVEUwogc3RhdGljIHZvaWQgcmZraWxsX2xlZF90cmlnZ2VyKHN0cnVjdCByZmtpbGwgKnJma2lsbCwKIAkJCSAgICAgICBlbnVtIHJma2lsbF9zdGF0ZSBzdGF0ZSkKIHsKLSNpZmRlZiBDT05GSUdfUkZLSUxMX0xFRFMKIAlzdHJ1Y3QgbGVkX3RyaWdnZXIgKmxlZCA9ICZyZmtpbGwtPmxlZF90cmlnZ2VyOwogCiAJaWYgKCFsZWQtPm5hbWUpCkBAIC02NiwxMCArNjYsOCBAQAogCQlsZWRfdHJpZ2dlcl9ldmVudChsZWQsIExFRF9PRkYpOwogCWVsc2UKIAkJbGVkX3RyaWdnZXJfZXZlbnQobGVkLCBMRURfRlVMTCk7Ci0jZW5kaWYgLyogQ09ORklHX1JGS0lMTF9MRURTICovCiB9CiAKLSNpZmRlZiBDT05GSUdfUkZLSUxMX0xFRFMKIHN0YXRpYyB2b2lkIHJma2lsbF9sZWRfdHJpZ2dlcl9hY3RpdmF0ZShzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWQpCiB7CiAJc3RydWN0IHJma2lsbCAqcmZraWxsID0gY29udGFpbmVyX29mKGxlZC0+dHJpZ2dlciwKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfdTMyLmMgYi9uZXQvc2NoZWQvY2xzX3UzMi5jCmluZGV4IDA1ZDE3ODAuLjA3MzcyZjYgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9jbHNfdTMyLmMKKysrIGIvbmV0L3NjaGVkL2Nsc191MzIuYwpAQCAtNjM4LDggKzYzOCw5IEBACiAJCQkJYnJlYWs7CiAKIAkJbi0+bmV4dCA9ICppbnM7Ci0JCXdtYigpOworCQl0Y2ZfdHJlZV9sb2NrKHRwKTsKIAkJKmlucyA9IG47CisJCXRjZl90cmVlX3VubG9jayh0cCk7CiAKIAkJKmFyZyA9ICh1bnNpZ25lZCBsb25nKW47CiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9zZnEuYyBiL25ldC9zY2hlZC9zY2hfc2ZxLmMKaW5kZXggZjM5NjVkZi4uMzMxMzNkMiAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9zZnEuYworKysgYi9uZXQvc2NoZWQvc2NoX3NmcS5jCkBAIC00MzUsNyArNDM1LDcgQEAKIAlpbnQgaTsKIAogCXEtPnBlcnR1cmJfdGltZXIuZnVuY3Rpb24gPSBzZnFfcGVydHVyYmF0aW9uOwotCXEtPnBlcnR1cmJfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXNjaDs7CisJcS0+cGVydHVyYl90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpc2NoOwogCWluaXRfdGltZXJfZGVmZXJyYWJsZSgmcS0+cGVydHVyYl90aW1lcik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgU0ZRX0hBU0hfRElWSVNPUjsgaSsrKQpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF90ZXFsLmMgYi9uZXQvc2NoZWQvc2NoX3RlcWwuYwppbmRleCBjZmM4ZTdjLi5lYzY5N2NlIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX3RlcWwuYworKysgYi9uZXQvc2NoZWQvc2NoX3RlcWwuYwpAQCAtMjg5LDkgKzI4OSw5IEBACiAKIAlkbyB7CiAJCXN0cnVjdCBuZXRfZGV2aWNlICpzbGF2ZSA9IHFkaXNjX2RldihxKTsKLQkJc3RydWN0IG5ldGRldl9xdWV1ZSAqc2xhdmVfdHhxOworCQlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICpzbGF2ZV90eHEgPSBuZXRkZXZfZ2V0X3R4X3F1ZXVlKHNsYXZlLCAwKTsKKwkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzICpzbGF2ZV9vcHMgPSBzbGF2ZS0+bmV0ZGV2X29wczsKIAotCQlzbGF2ZV90eHEgPSBuZXRkZXZfZ2V0X3R4X3F1ZXVlKHNsYXZlLCAwKTsKIAkJaWYgKHNsYXZlX3R4cS0+cWRpc2Nfc2xlZXBpbmcgIT0gcSkKIAkJCWNvbnRpbnVlOwogCQlpZiAoX19uZXRpZl9zdWJxdWV1ZV9zdG9wcGVkKHNsYXZlLCBzdWJxKSB8fApAQCAtMzA1LDcgKzMwNSw3IEBACiAJCQlpZiAoX19uZXRpZl90eF90cnlsb2NrKHNsYXZlX3R4cSkpIHsKIAkJCQlpZiAoIW5ldGlmX3R4X3F1ZXVlX3N0b3BwZWQoc2xhdmVfdHhxKSAmJgogCQkJCSAgICAhbmV0aWZfdHhfcXVldWVfZnJvemVuKHNsYXZlX3R4cSkgJiYKLQkJCQkgICAgc2xhdmUtPmhhcmRfc3RhcnRfeG1pdChza2IsIHNsYXZlKSA9PSAwKSB7CisJCQkJICAgIHNsYXZlX29wcy0+bmRvX3N0YXJ0X3htaXQoc2tiLCBzbGF2ZSkgPT0gMCkgewogCQkJCQlfX25ldGlmX3R4X3VubG9jayhzbGF2ZV90eHEpOwogCQkJCQltYXN0ZXItPnNsYXZlcyA9IE5FWFRfU0xBVkUocSk7CiAJCQkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKQEAgLTQyMCw2ICs0MjAsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyB0ZXFsX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCT0gdGVxbF9tYXN0ZXJfb3BlbiwKKwkubmRvX3N0b3AJPSB0ZXFsX21hc3Rlcl9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJPSB0ZXFsX21hc3Rlcl94bWl0LAorCS5uZG9fZ2V0X3N0YXRzCT0gdGVxbF9tYXN0ZXJfc3RhdHMsCisJLm5kb19jaGFuZ2VfbXR1CT0gdGVxbF9tYXN0ZXJfbXR1LAorfTsKKwogc3RhdGljIF9faW5pdCB2b2lkIHRlcWxfbWFzdGVyX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHRlcWxfbWFzdGVyICptYXN0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwpAQCAtNDM2LDExICs0NDQsNyBAQAogCW9wcy0+ZGVzdHJveQk9CXRlcWxfZGVzdHJveTsKIAlvcHMtPm93bmVyCT0JVEhJU19NT0RVTEU7CiAKLQlkZXYtPm9wZW4JCT0gdGVxbF9tYXN0ZXJfb3BlbjsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IHRlcWxfbWFzdGVyX3htaXQ7Ci0JZGV2LT5zdG9wCQk9IHRlcWxfbWFzdGVyX2Nsb3NlOwotCWRldi0+Z2V0X3N0YXRzCQk9IHRlcWxfbWFzdGVyX3N0YXRzOwotCWRldi0+Y2hhbmdlX210dQkJPSB0ZXFsX21hc3Rlcl9tdHU7CisJZGV2LT5uZXRkZXZfb3BzID0gICAgICAgJnRlcWxfbmV0ZGV2X29wczsKIAlkZXYtPnR5cGUJCT0gQVJQSFJEX1ZPSUQ7CiAJZGV2LT5tdHUJCT0gMTUwMDsKIAlkZXYtPnR4X3F1ZXVlX2xlbgk9IDEwMDsKZGlmZiAtLWdpdCBhL25ldC9zY3RwL2F1dGguYyBiL25ldC9zY3RwL2F1dGguYwppbmRleCA1MmRiNWY2Li41NjkzNWJiIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9hdXRoLmMKKysrIGIvbmV0L3NjdHAvYXV0aC5jCkBAIC0xNDEsOCArMTQxLDggQEAKIC8qIENvbXBhcmUgdHdvIGJ5dGUgdmVjdG9ycyBhcyBudW1iZXJzLiAgUmV0dXJuIHZhbHVlcwogICogYXJlOgogICogCSAgMCAtIHZlY3RvcnMgYXJlIGVxdWFsCi0gKiAJPCAwIC0gdmVjdG9yIDEgaXMgc21hbGxlciB0aGVuIHZlY3RvcjIKLSAqIAk+IDAgLSB2ZWN0b3IgMSBpcyBncmVhdGVyIHRoZW4gdmVjdG9yMgorICogCTwgMCAtIHZlY3RvciAxIGlzIHNtYWxsZXIgdGhhbiB2ZWN0b3IyCisgKiAJPiAwIC0gdmVjdG9yIDEgaXMgZ3JlYXRlciB0aGFuIHZlY3RvcjIKICAqCiAgKiBBbGdvcml0aG0gaXM6CiAgKiAJVGhpcyBpcyBwZXJmb3JtZWQgYnkgc2VsZWN0aW5nIHRoZSBudW1lcmljYWxseSBzbWFsbGVyIGtleSB2ZWN0b3IuLi4KQEAgLTQ4OSw3ICs0ODksNyBAQAogCXJldHVybiAwOwogCiBvdXRfZXJyOgotCS8qIENsZWFuIHVwIGFueSBzdWNjZXNzZnVsbCBhbGxvY2F0aW9ucyAqLworCS8qIENsZWFuIHVwIGFueSBzdWNjZXNzZnVsIGFsbG9jYXRpb25zICovCiAJc2N0cF9hdXRoX2Rlc3Ryb3lfaG1hY3MoZXAtPmF1dGhfaG1hY3MpOwogCXJldHVybiAtRU5PTUVNOwogfQpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc21fc3RhdGVmdW5zLmMgYi9uZXQvc2N0cC9zbV9zdGF0ZWZ1bnMuYwppbmRleCAxYzRlNWQ2Li4zYTBjZDA3IDEwMDY0NAotLS0gYS9uZXQvc2N0cC9zbV9zdGF0ZWZ1bnMuYworKysgYi9uZXQvc2N0cC9zbV9zdGF0ZWZ1bnMuYwpAQCAtNDI2OCw5ICs0MjY4LDkgQEAKIAogLyoKICAqIEhhbmRsZSBhIHByb3RvY29sIHZpb2xhdGlvbiB3aGVuIHRoZSBjaHVuayBsZW5ndGggaXMgaW52YWxpZC4KLSAqICJJbnZhbGlkIiBsZW5ndGggaXMgaWRlbnRpZmllZCBhcyBzbWFsbGVyIHRoZW4gdGhlIG1pbmltYWwgbGVuZ3RoIGEKKyAqICJJbnZhbGlkIiBsZW5ndGggaXMgaWRlbnRpZmllZCBhcyBzbWFsbGVyIHRoYW4gdGhlIG1pbmltYWwgbGVuZ3RoIGEKICAqIGdpdmVuIGNodW5rIGNhbiBiZS4gIEZvciBleGFtcGxlLCBhIFNBQ0sgY2h1bmsgaGFzIGludmFsaWQgbGVuZ3RoCi0gKiBpZiBpdCdzIGxlbmd0aCBpcyBzZXQgdG8gYmUgc21hbGxlciB0aGVuIHRoZSBzaXplIG9mIHNjdHBfc2Fja19jaHVua190LgorICogaWYgaXRzIGxlbmd0aCBpcyBzZXQgdG8gYmUgc21hbGxlciB0aGFuIHRoZSBzaXplIG9mIHNjdHBfc2Fja19jaHVua190LgogICoKICAqIFdlIGluZm9ybSB0aGUgb3RoZXIgZW5kIGJ5IHNlbmRpbmcgYW4gQUJPUlQgd2l0aCBhIFByb3RvY29sIFZpb2xhdGlvbgogICogZXJyb3IgY29kZS4KQEAgLTQzMDAsNyArNDMwMCw3IEBACiAKIC8qCiAgKiBIYW5kbGUgYSBwcm90b2NvbCB2aW9sYXRpb24gd2hlbiB0aGUgcGFyYW1ldGVyIGxlbmd0aCBpcyBpbnZhbGlkLgotICogIkludmFsaWQiIGxlbmd0aCBpcyBpZGVudGlmaWVkIGFzIHNtYWxsZXIgdGhlbiB0aGUgbWluaW1hbCBsZW5ndGggYQorICogIkludmFsaWQiIGxlbmd0aCBpcyBpZGVudGlmaWVkIGFzIHNtYWxsZXIgdGhhbiB0aGUgbWluaW1hbCBsZW5ndGggYQogICogZ2l2ZW4gcGFyYW1ldGVyIGNhbiBiZS4KICAqLwogc3RhdGljIHNjdHBfZGlzcG9zaXRpb25fdCBzY3RwX3NmX3Zpb2xhdGlvbl9wYXJhbWxlbigKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3NvY2tldC5jIGIvbmV0L3NjdHAvc29ja2V0LmMKaW5kZXggYjE0YThmMy4uZmYwYThmOCAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvc29ja2V0LmMKKysrIGIvbmV0L3NjdHAvc29ja2V0LmMKQEAgLTI3MTcsNyArMjcxNyw3IEBACiAJCQkJcGF0aHMrKzsKIAkJCX0KIAotCQkJLyogT25seSB2YWxpZGF0ZSBhc29jbWF4cnh0IGlmIHdlIGhhdmUgbW9yZSB0aGVuCisJCQkvKiBPbmx5IHZhbGlkYXRlIGFzb2NtYXhyeHQgaWYgd2UgaGF2ZSBtb3JlIHRoYW4KIAkJCSAqIG9uZSBwYXRoL3RyYW5zcG9ydC4gIFdlIGRvIHRoaXMgYmVjYXVzZSBwYXRoCiAJCQkgKiByZXRyYW5zbWlzc2lvbnMgYXJlIG9ubHkgY291bnRlZCB3aGVuIHdlIGhhdmUgbW9yZQogCQkJICogdGhlbiBvbmUgcGF0aC4KZGlmZiAtLWdpdCBhL25ldC9zY3RwL3Rzbm1hcC5jIGIvbmV0L3NjdHAvdHNubWFwLmMKaW5kZXggMzVjNzNlOC4uOWJkNjQ1NiAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvdHNubWFwLmMKKysrIGIvbmV0L3NjdHAvdHNubWFwLmMKQEAgLTIyNyw3ICsyMjcsNyBAQAogCQkgKi8KIAkJYml0bWFwX3plcm8obWFwLT50c25fbWFwLCBtYXAtPmxlbik7CiAJfSBlbHNlIHsKLQkJLyogSWYgdGhlIGdhcCBpcyBzbWFsbGVyIHRoZW4gdGhlIG1hcCBzaXplLAorCQkvKiBJZiB0aGUgZ2FwIGlzIHNtYWxsZXIgdGhhbiB0aGUgbWFwIHNpemUsCiAJCSAqIHNoaWZ0IHRoZSBtYXAgYnkgJ2dhcCcgYml0cyBhbmQgdXBkYXRlIGZ1cnRoZXIuCiAJCSAqLwogCQliaXRtYXBfc2hpZnRfcmlnaHQobWFwLT50c25fbWFwLCBtYXAtPnRzbl9tYXAsIGdhcCwgbWFwLT5sZW4pOwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9jYWNoZS5jIGIvbmV0L3N1bnJwYy9jYWNoZS5jCmluZGV4IGM5OTY2NzEuLjQ3MzVjYWEgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvY2FjaGUuYworKysgYi9uZXQvc3VucnBjL2NhY2hlLmMKQEAgLTk4LDcgKzk4LDcgQEAKIAogCXJldHVybiBuZXc7CiB9Ci1FWFBPUlRfU1lNQk9MKHN1bnJwY19jYWNoZV9sb29rdXApOworRVhQT1JUX1NZTUJPTF9HUEwoc3VucnBjX2NhY2hlX2xvb2t1cCk7CiAKIAogc3RhdGljIHZvaWQgcXVldWVfbG9vc2Uoc3RydWN0IGNhY2hlX2RldGFpbCAqZGV0YWlsLCBzdHJ1Y3QgY2FjaGVfaGVhZCAqY2gpOwpAQCAtMTczLDcgKzE3Myw3IEBACiAJY2FjaGVfcHV0KG9sZCwgZGV0YWlsKTsKIAlyZXR1cm4gdG1wOwogfQotRVhQT1JUX1NZTUJPTChzdW5ycGNfY2FjaGVfdXBkYXRlKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHN1bnJwY19jYWNoZV91cGRhdGUpOwogCiBzdGF0aWMgaW50IGNhY2hlX21ha2VfdXBjYWxsKHN0cnVjdCBjYWNoZV9kZXRhaWwgKmRldGFpbCwgc3RydWN0IGNhY2hlX2hlYWQgKmgpOwogLyoKQEAgLTI0NSw3ICsyNDUsNyBAQAogCQljYWNoZV9wdXQoaCwgZGV0YWlsKTsKIAlyZXR1cm4gcnY7CiB9Ci1FWFBPUlRfU1lNQk9MKGNhY2hlX2NoZWNrKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGNhY2hlX2NoZWNrKTsKIAogLyoKICAqIGNhY2hlcyBuZWVkIHRvIGJlIHBlcmlvZGljYWxseSBjbGVhbmVkLgpAQCAtMzczLDcgKzM3Myw3IEBACiAJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjYWNoZV9jbGVhbmVyLCAwKTsKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0woY2FjaGVfcmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTF9HUEwoY2FjaGVfcmVnaXN0ZXIpOwogCiB2b2lkIGNhY2hlX3VucmVnaXN0ZXIoc3RydWN0IGNhY2hlX2RldGFpbCAqY2QpCiB7CkBAIC0zOTksNyArMzk5LDcgQEAKIG91dDoKIAlwcmludGsoS0VSTl9FUlIgIm5mc2Q6IGZhaWxlZCB0byB1bnJlZ2lzdGVyICVzIGNhY2hlXG4iLCBjZC0+bmFtZSk7CiB9Ci1FWFBPUlRfU1lNQk9MKGNhY2hlX3VucmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTF9HUEwoY2FjaGVfdW5yZWdpc3Rlcik7CiAKIC8qIGNsZWFuIGNhY2hlIHRyaWVzIHRvIGZpbmQgc29tZXRoaW5nIHRvIGNsZWFuCiAgKiBhbmQgY2xlYW5zIGl0LgpAQCAtNTE0LDcgKzUxNCw3IEBACiAJd2hpbGUgKGNhY2hlX2NsZWFuKCkgIT0gLTEpCiAJCWNvbmRfcmVzY2hlZCgpOwogfQotRVhQT1JUX1NZTUJPTChjYWNoZV9mbHVzaCk7CitFWFBPUlRfU1lNQk9MX0dQTChjYWNoZV9mbHVzaCk7CiAKIHZvaWQgY2FjaGVfcHVyZ2Uoc3RydWN0IGNhY2hlX2RldGFpbCAqZGV0YWlsKQogewpAQCAtNTIzLDcgKzUyMyw3IEBACiAJY2FjaGVfZmx1c2goKTsKIAlkZXRhaWwtPmZsdXNoX3RpbWUgPSAxOwogfQotRVhQT1JUX1NZTUJPTChjYWNoZV9wdXJnZSk7CitFWFBPUlRfU1lNQk9MX0dQTChjYWNoZV9wdXJnZSk7CiAKIAogLyoKQEAgLTk4OCw3ICs5ODgsNyBAQAogCSpicHAgPSBicDsKIAkqbHAgPSBsZW47CiB9Ci1FWFBPUlRfU1lNQk9MKHF3b3JkX2FkZCk7CitFWFBPUlRfU1lNQk9MX0dQTChxd29yZF9hZGQpOwogCiB2b2lkIHF3b3JkX2FkZGhleChjaGFyICoqYnBwLCBpbnQgKmxwLCBjaGFyICpidWYsIGludCBibGVuKQogewpAQCAtMTAxNyw3ICsxMDE3LDcgQEAKIAkqYnBwID0gYnA7CiAJKmxwID0gbGVuOwogfQotRVhQT1JUX1NZTUJPTChxd29yZF9hZGRoZXgpOworRVhQT1JUX1NZTUJPTF9HUEwocXdvcmRfYWRkaGV4KTsKIAogc3RhdGljIHZvaWQgd2Fybl9ub19saXN0ZW5lcihzdHJ1Y3QgY2FjaGVfZGV0YWlsICpkZXRhaWwpCiB7CkBAIC0xMTQwLDcgKzExNDAsNyBAQAogCSpkZXN0ID0gJ1wwJzsKIAlyZXR1cm4gbGVuOwogfQotRVhQT1JUX1NZTUJPTChxd29yZF9nZXQpOworRVhQT1JUX1NZTUJPTF9HUEwocXdvcmRfZ2V0KTsKIAogCiAvKgpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9ycGNfcGlwZS5jIGIvbmV0L3N1bnJwYy9ycGNfcGlwZS5jCmluZGV4IDE5MjQ1MzIuLjU3NzM4NWEgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvcnBjX3BpcGUuYworKysgYi9uZXQvc3VucnBjL3JwY19waXBlLmMKQEAgLTUyMiw4ICs1MjIsNiBAQAogCWlmICghaW5vZGUpCiAJCXJldHVybiBOVUxMOwogCWlub2RlLT5pX21vZGUgPSBtb2RlOwotCWlub2RlLT5pX3VpZCA9IGlub2RlLT5pX2dpZCA9IDA7Ci0JaW5vZGUtPmlfYmxvY2tzID0gMDsKIAlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAJc3dpdGNoKG1vZGUgJiBTX0lGTVQpIHsKIAkJY2FzZSBTX0lGRElSOgpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9zdGF0cy5jIGIvbmV0L3N1bnJwYy9zdGF0cy5jCmluZGV4IDUwYjA0OWMuLjA4NTM3MmUgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvc3RhdHMuYworKysgYi9uZXQvc3VucnBjL3N0YXRzLmMKQEAgLTEwNiw3ICsxMDYsNyBAQAogCQlzZXFfcHV0YyhzZXEsICdcbicpOwogCX0KIH0KLUVYUE9SVF9TWU1CT0woc3ZjX3NlcV9zaG93KTsKK0VYUE9SVF9TWU1CT0xfR1BMKHN2Y19zZXFfc2hvdyk7CiAKIC8qKgogICogcnBjX2FsbG9jX2lvc3RhdHMgLSBhbGxvY2F0ZSBhbiBycGNfaW9zdGF0cyBzdHJ1Y3R1cmUKQEAgLTI0OSwxNCArMjQ5LDE0IEBACiB7CiAJcmV0dXJuIGRvX3JlZ2lzdGVyKHN0YXRwLT5wcm9ncmFtLT5wZ19uYW1lLCBzdGF0cCwgZm9wcyk7CiB9Ci1FWFBPUlRfU1lNQk9MKHN2Y19wcm9jX3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHN2Y19wcm9jX3JlZ2lzdGVyKTsKIAogdm9pZAogc3ZjX3Byb2NfdW5yZWdpc3Rlcihjb25zdCBjaGFyICpuYW1lKQogewogCXJlbW92ZV9wcm9jX2VudHJ5KG5hbWUsIHByb2NfbmV0X3JwYyk7CiB9Ci1FWFBPUlRfU1lNQk9MKHN2Y19wcm9jX3VucmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTF9HUEwoc3ZjX3Byb2NfdW5yZWdpc3Rlcik7CiAKIHZvaWQKIHJwY19wcm9jX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc3ZjLmMgYi9uZXQvc3VucnBjL3N2Yy5jCmluZGV4IDU0Yzk4ZDguLmM1MWZlZDQgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvc3ZjLmMKKysrIGIvbmV0L3N1bnJwYy9zdmMuYwpAQCAtNDMxLDcgKzQzMSw3IEBACiB7CiAJcmV0dXJuIF9fc3ZjX2NyZWF0ZShwcm9nLCBidWZzaXplLCAvKm5wb29scyovMSwgZmFtaWx5LCBzaHV0ZG93bik7CiB9Ci1FWFBPUlRfU1lNQk9MKHN2Y19jcmVhdGUpOworRVhQT1JUX1NZTUJPTF9HUEwoc3ZjX2NyZWF0ZSk7CiAKIHN0cnVjdCBzdmNfc2VydiAqCiBzdmNfY3JlYXRlX3Bvb2xlZChzdHJ1Y3Qgc3ZjX3Byb2dyYW0gKnByb2csIHVuc2lnbmVkIGludCBidWZzaXplLApAQCAtNDUwLDcgKzQ1MCw3IEBACiAKIAlyZXR1cm4gc2VydjsKIH0KLUVYUE9SVF9TWU1CT0woc3ZjX2NyZWF0ZV9wb29sZWQpOworRVhQT1JUX1NZTUJPTF9HUEwoc3ZjX2NyZWF0ZV9wb29sZWQpOwogCiAvKgogICogRGVzdHJveSBhbiBSUEMgc2VydmljZS4gU2hvdWxkIGJlIGNhbGxlZCB3aXRoIGFwcHJvcHJpYXRlIGxvY2tpbmcgdG8KQEAgLTQ5Miw3ICs0OTIsNyBAQAogCWtmcmVlKHNlcnYtPnN2X3Bvb2xzKTsKIAlrZnJlZShzZXJ2KTsKIH0KLUVYUE9SVF9TWU1CT0woc3ZjX2Rlc3Ryb3kpOworRVhQT1JUX1NZTUJPTF9HUEwoc3ZjX2Rlc3Ryb3kpOwogCiAvKgogICogQWxsb2NhdGUgYW4gUlBDIHNlcnZlcidzIGJ1ZmZlciBzcGFjZS4KQEAgLTU2Nyw3ICs1NjcsNyBAQAogb3V0X2Vub21lbToKIAlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIH0KLUVYUE9SVF9TWU1CT0woc3ZjX3ByZXBhcmVfdGhyZWFkKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHN2Y19wcmVwYXJlX3RocmVhZCk7CiAKIC8qCiAgKiBDaG9vc2UgYSBwb29sIGluIHdoaWNoIHRvIGNyZWF0ZSBhIG5ldyB0aHJlYWQsIGZvciBzdmNfc2V0X251bV90aHJlYWRzCkBAIC02ODksNyArNjg5LDcgQEAKIAogCXJldHVybiBlcnJvcjsKIH0KLUVYUE9SVF9TWU1CT0woc3ZjX3NldF9udW1fdGhyZWFkcyk7CitFWFBPUlRfU1lNQk9MX0dQTChzdmNfc2V0X251bV90aHJlYWRzKTsKIAogLyoKICAqIENhbGxlZCBmcm9tIGEgc2VydmVyIHRocmVhZCBhcyBpdCdzIGV4aXRpbmcuIENhbGxlciBtdXN0IGhvbGQgdGhlIEJLTCBvcgpAQCAtNzE3LDcgKzcxNyw3IEBACiAJaWYgKHNlcnYpCiAJCXN2Y19kZXN0cm95KHNlcnYpOwogfQotRVhQT1JUX1NZTUJPTChzdmNfZXhpdF90aHJlYWQpOworRVhQT1JUX1NZTUJPTF9HUEwoc3ZjX2V4aXRfdGhyZWFkKTsKIAogI2lmZGVmIENPTkZJR19TVU5SUENfUkVHSVNURVJfVjQKIApAQCAtMTIzMSw3ICsxMjMxLDcgQEAKIAlzdmNfcHV0bmwocmVzdiwgbnRvaGwocnBjX3N0YXQpKTsKIAlnb3RvIHNlbmRpdDsKIH0KLUVYUE9SVF9TWU1CT0woc3ZjX3Byb2Nlc3MpOworRVhQT1JUX1NZTUJPTF9HUEwoc3ZjX3Byb2Nlc3MpOwogCiAvKgogICogUmV0dXJuICh0cmFuc3BvcnQtc3BlY2lmaWMpIGxpbWl0IG9uIHRoZSBycGMgcGF5bG9hZC4KZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc3ZjX3hwcnQuYyBiL25ldC9zdW5ycGMvc3ZjX3hwcnQuYwppbmRleCBiZjViNWNkLi5lNTg4ZGY1IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3N2Y194cHJ0LmMKKysrIGIvbmV0L3N1bnJwYy9zdmNfeHBydC5jCkBAIC00NDAsNyArNDQwLDcgQEAKIAkJc3ZjX3hwcnRfZW5xdWV1ZSh4cHJ0KTsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKHN2Y19yZXNlcnZlKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHN2Y19yZXNlcnZlKTsKIAogc3RhdGljIHZvaWQgc3ZjX3hwcnRfcmVsZWFzZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwKQogewpAQCAtNDQ4LDYgKzQ0OCw5IEBACiAKIAlycXN0cC0+cnFfeHBydC0+eHB0X29wcy0+eHBvX3JlbGVhc2VfcnFzdChycXN0cCk7CiAKKwlrZnJlZShycXN0cC0+cnFfZGVmZXJyZWQpOworCXJxc3RwLT5ycV9kZWZlcnJlZCA9IE5VTEw7CisKIAlzdmNfZnJlZV9yZXNfcGFnZXMocnFzdHApOwogCXJxc3RwLT5ycV9yZXMucGFnZV9sZW4gPSAwOwogCXJxc3RwLT5ycV9yZXMucGFnZV9iYXNlID0gMDsKQEAgLTQ5OCw3ICs1MDEsNyBAQAogCQlzcGluX3VubG9ja19iaCgmcG9vbC0+c3BfbG9jayk7CiAJfQogfQotRVhQT1JUX1NZTUJPTChzdmNfd2FrZV91cCk7CitFWFBPUlRfU1lNQk9MX0dQTChzdmNfd2FrZV91cCk7CiAKIGludCBzdmNfcG9ydF9pc19wcml2aWxlZ2VkKHN0cnVjdCBzb2NrYWRkciAqc2luKQogewpAQCAtNTE1LDggKzUxOCwxMCBAQAogfQogCiAvKgotICogTWFrZSBzdXJlIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0b28gbWFueSBhY3RpdmUgY29ubmVjdGlvbnMuICBJZiB3ZQotICogaGF2ZSwgc29tZXRoaW5nIG11c3QgYmUgZHJvcHBlZC4KKyAqIE1ha2Ugc3VyZSB0aGF0IHdlIGRvbid0IGhhdmUgdG9vIG1hbnkgYWN0aXZlIGNvbm5lY3Rpb25zLiBJZiB3ZSBoYXZlLAorICogc29tZXRoaW5nIG11c3QgYmUgZHJvcHBlZC4gSXQncyBub3QgY2xlYXIgd2hhdCB3aWxsIGhhcHBlbiBpZiB3ZSBhbGxvdworICogInRvbyBtYW55IiBjb25uZWN0aW9ucywgYnV0IHdoZW4gZGVhbGluZyB3aXRoIG5ldHdvcmstZmFjaW5nIHNvZnR3YXJlLAorICogd2UgaGF2ZSB0byBjb2RlIGRlZmVuc2l2ZWx5LiBIZXJlIHdlIGRvIHRoYXQgYnkgaW1wb3NpbmcgaGFyZCBsaW1pdHMuCiAgKgogICogVGhlcmUncyBubyBwb2ludCBpbiB0cnlpbmcgdG8gZG8gcmFuZG9tIGRyb3AgaGVyZSBmb3IgRG9TCiAgKiBwcmV2ZW50aW9uLiBUaGUgTkZTIGNsaWVudHMgZG9lcyAxIHJlY29ubmVjdCBpbiAxNSBzZWNvbmRzLiBBbgpAQCAtNTI1LDE5ICs1MzAsMjcgQEAKICAqIFRoZSBvbmx5IHNvbWV3aGF0IGVmZmljaWVudCBtZWNoYW5pc20gd291bGQgYmUgaWYgZHJvcCBvbGQKICAqIGNvbm5lY3Rpb25zIGZyb20gdGhlIHNhbWUgSVAgZmlyc3QuIEJ1dCByaWdodCBub3cgd2UgZG9uJ3QgZXZlbgogICogcmVjb3JkIHRoZSBjbGllbnQgSVAgaW4gc3ZjX3NvY2suCisgKgorICogc2luZ2xlLXRocmVhZGVkIHNlcnZpY2VzIHRoYXQgZXhwZWN0IGEgbG90IG9mIGNsaWVudHMgd2lsbCBwcm9iYWJseQorICogbmVlZCB0byBzZXQgc3ZfbWF4Y29ubiB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCB2YWx1ZSB3aGljaCBpcyBiYXNlZAorICogb24gdGhlIG51bWJlciBvZiB0aHJlYWRzCiAgKi8KIHN0YXRpYyB2b2lkIHN2Y19jaGVja19jb25uX2xpbWl0cyhzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnYpCiB7Ci0JaWYgKHNlcnYtPnN2X3RtcGNudCA+IChzZXJ2LT5zdl9ucnRocmVhZHMrMykqMjApIHsKKwl1bnNpZ25lZCBpbnQgbGltaXQgPSBzZXJ2LT5zdl9tYXhjb25uID8gc2Vydi0+c3ZfbWF4Y29ubiA6CisJCQkJKHNlcnYtPnN2X25ydGhyZWFkcyszKSAqIDIwOworCisJaWYgKHNlcnYtPnN2X3RtcGNudCA+IGxpbWl0KSB7CiAJCXN0cnVjdCBzdmNfeHBydCAqeHBydCA9IE5VTEw7CiAJCXNwaW5fbG9ja19iaCgmc2Vydi0+c3ZfbG9jayk7CiAJCWlmICghbGlzdF9lbXB0eSgmc2Vydi0+c3ZfdGVtcHNvY2tzKSkgewogCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkgewogCQkJCS8qIFRyeSB0byBoZWxwIHRoZSBhZG1pbiAqLwogCQkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IHRvbyBtYW55IG9wZW4gICIKLQkJCQkgICAgICAgImNvbm5lY3Rpb25zLCBjb25zaWRlciBpbmNyZWFzaW5nIHRoZSAiCi0JCQkJICAgICAgICJudW1iZXIgb2YgbmZzZCB0aHJlYWRzXG4iLAotCQkJCSAgICAgICBzZXJ2LT5zdl9uYW1lKTsKKwkJCQkgICAgICAgImNvbm5lY3Rpb25zLCBjb25zaWRlciBpbmNyZWFzaW5nICVzXG4iLAorCQkJCSAgICAgICBzZXJ2LT5zdl9uYW1lLCBzZXJ2LT5zdl9tYXhjb25uID8KKwkJCQkgICAgICAgInRoZSBtYXggbnVtYmVyIG9mIGNvbm5lY3Rpb25zLiIgOgorCQkJCSAgICAgICAidGhlIG51bWJlciBvZiB0aHJlYWRzLiIpOwogCQkJfQogCQkJLyoKIAkJCSAqIEFsd2F5cyBzZWxlY3QgdGhlIG9sZGVzdCBjb25uZWN0aW9uLiBJdCdzIG5vdCBmYWlyLApAQCAtNzMwLDcgKzc0Myw3IEBACiAJCXNlcnYtPnN2X3N0YXRzLT5uZXRjbnQrKzsKIAlyZXR1cm4gbGVuOwogfQotRVhQT1JUX1NZTUJPTChzdmNfcmVjdik7CitFWFBPUlRfU1lNQk9MX0dQTChzdmNfcmVjdik7CiAKIC8qCiAgKiBEcm9wIHJlcXVlc3QKQEAgLTc0MCw3ICs3NTMsNyBAQAogCWRwcmludGsoInN2YzogeHBydCAlcCBkcm9wcGVkIHJlcXVlc3RcbiIsIHJxc3RwLT5ycV94cHJ0KTsKIAlzdmNfeHBydF9yZWxlYXNlKHJxc3RwKTsKIH0KLUVYUE9SVF9TWU1CT0woc3ZjX2Ryb3ApOworRVhQT1JUX1NZTUJPTF9HUEwoc3ZjX2Ryb3ApOwogCiAvKgogICogUmV0dXJuIHJlcGx5IHRvIGNsaWVudC4KQEAgLTgzNyw2ICs4NTAsMTEgQEAKIHZvaWQgc3ZjX2RlbGV0ZV94cHJ0KHN0cnVjdCBzdmNfeHBydCAqeHBydCkKIHsKIAlzdHJ1Y3Qgc3ZjX3NlcnYJKnNlcnYgPSB4cHJ0LT54cHRfc2VydmVyOworCXN0cnVjdCBzdmNfZGVmZXJyZWRfcmVxICpkcjsKKworCS8qIE9ubHkgZG8gdGhpcyBvbmNlICovCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoWFBUX0RFQUQsICZ4cHJ0LT54cHRfZmxhZ3MpKQorCQlyZXR1cm47CiAKIAlkcHJpbnRrKCJzdmM6IHN2Y19kZWxldGVfeHBydCglcClcbiIsIHhwcnQpOwogCXhwcnQtPnhwdF9vcHMtPnhwb19kZXRhY2goeHBydCk7CkBAIC04NTEsMTIgKzg2OSwxNiBAQAogCSAqIHdoaWxlIHN0aWxsIGF0dGFjaGVkIHRvIGEgcXVldWUsIHRoZSBxdWV1ZSBpdHNlbGYKIAkgKiBpcyBhYm91dCB0byBiZSBkZXN0cm95ZWQgKGluIHN2Y19kZXN0cm95KS4KIAkgKi8KLQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoWFBUX0RFQUQsICZ4cHJ0LT54cHRfZmxhZ3MpKSB7Ci0JCUJVR19PTihhdG9taWNfcmVhZCgmeHBydC0+eHB0X3JlZi5yZWZjb3VudCkgPCAyKTsKLQkJaWYgKHRlc3RfYml0KFhQVF9URU1QLCAmeHBydC0+eHB0X2ZsYWdzKSkKLQkJCXNlcnYtPnN2X3RtcGNudC0tOworCWlmICh0ZXN0X2JpdChYUFRfVEVNUCwgJnhwcnQtPnhwdF9mbGFncykpCisJCXNlcnYtPnN2X3RtcGNudC0tOworCisJZm9yIChkciA9IHN2Y19kZWZlcnJlZF9kZXF1ZXVlKHhwcnQpOyBkcjsKKwkgICAgIGRyID0gc3ZjX2RlZmVycmVkX2RlcXVldWUoeHBydCkpIHsKIAkJc3ZjX3hwcnRfcHV0KHhwcnQpOworCQlrZnJlZShkcik7CiAJfQorCisJc3ZjX3hwcnRfcHV0KHhwcnQpOwogCXNwaW5fdW5sb2NrX2JoKCZzZXJ2LT5zdl9sb2NrKTsKIH0KIApAQCAtOTAyLDE3ICs5MjQsMTkgQEAKIAkJY29udGFpbmVyX29mKGRyZXEsIHN0cnVjdCBzdmNfZGVmZXJyZWRfcmVxLCBoYW5kbGUpOwogCXN0cnVjdCBzdmNfeHBydCAqeHBydCA9IGRyLT54cHJ0OwogCi0JaWYgKHRvb19tYW55KSB7CisJc3Bpbl9sb2NrKCZ4cHJ0LT54cHRfbG9jayk7CisJc2V0X2JpdChYUFRfREVGRVJSRUQsICZ4cHJ0LT54cHRfZmxhZ3MpOworCWlmICh0b29fbWFueSB8fCB0ZXN0X2JpdChYUFRfREVBRCwgJnhwcnQtPnhwdF9mbGFncykpIHsKKwkJc3Bpbl91bmxvY2soJnhwcnQtPnhwdF9sb2NrKTsKKwkJZHByaW50aygicmV2aXNpdCBjYW5jZWxlZFxuIik7CiAJCXN2Y194cHJ0X3B1dCh4cHJ0KTsKIAkJa2ZyZWUoZHIpOwogCQlyZXR1cm47CiAJfQogCWRwcmludGsoInJldmlzaXQgcXVldWVkXG4iKTsKIAlkci0+eHBydCA9IE5VTEw7Ci0Jc3Bpbl9sb2NrKCZ4cHJ0LT54cHRfbG9jayk7CiAJbGlzdF9hZGQoJmRyLT5oYW5kbGUucmVjZW50LCAmeHBydC0+eHB0X2RlZmVycmVkKTsKIAlzcGluX3VubG9jaygmeHBydC0+eHB0X2xvY2spOwotCXNldF9iaXQoWFBUX0RFRkVSUkVELCAmeHBydC0+eHB0X2ZsYWdzKTsKIAlzdmNfeHBydF9lbnF1ZXVlKHhwcnQpOwogCXN2Y194cHJ0X3B1dCh4cHJ0KTsKIH0KZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc3ZjYXV0aC5jIGIvbmV0L3N1bnJwYy9zdmNhdXRoLmMKaW5kZXggOGE3M2NiYi4uZTY0MTA5YiAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zdmNhdXRoLmMKKysrIGIvbmV0L3N1bnJwYy9zdmNhdXRoLmMKQEAgLTU3LDEzICs1NywxMyBAQAogCXJxc3RwLT5ycV9hdXRob3AgPSBhb3BzOwogCXJldHVybiBhb3BzLT5hY2NlcHQocnFzdHAsIGF1dGhwKTsKIH0KLUVYUE9SVF9TWU1CT0woc3ZjX2F1dGhlbnRpY2F0ZSk7CitFWFBPUlRfU1lNQk9MX0dQTChzdmNfYXV0aGVudGljYXRlKTsKIAogaW50IHN2Y19zZXRfY2xpZW50KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHApCiB7CiAJcmV0dXJuIHJxc3RwLT5ycV9hdXRob3AtPnNldF9jbGllbnQocnFzdHApOwogfQotRVhQT1JUX1NZTUJPTChzdmNfc2V0X2NsaWVudCk7CitFWFBPUlRfU1lNQk9MX0dQTChzdmNfc2V0X2NsaWVudCk7CiAKIC8qIEEgcmVxdWVzdCwgd2hpY2ggd2FzIGF1dGhlbnRpY2F0ZWQsIGhhcyBub3cgZXhlY3V0ZWQuCiAgKiBUaW1lIHRvIGZpbmFsaXNlIHRoZSBjcmVkZW50aWFscyBhbmQgdmVyaWZpZXIKQEAgLTk1LDcgKzk1LDcgQEAKIAlzcGluX3VubG9jaygmYXV0aHRhYl9sb2NrKTsKIAlyZXR1cm4gcnY7CiB9Ci1FWFBPUlRfU1lNQk9MKHN2Y19hdXRoX3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHN2Y19hdXRoX3JlZ2lzdGVyKTsKIAogdm9pZAogc3ZjX2F1dGhfdW5yZWdpc3RlcihycGNfYXV0aGZsYXZvcl90IGZsYXZvcikKQEAgLTEwNSw3ICsxMDUsNyBAQAogCQlhdXRodGFiW2ZsYXZvcl0gPSBOVUxMOwogCXNwaW5fdW5sb2NrKCZhdXRodGFiX2xvY2spOwogfQotRVhQT1JUX1NZTUJPTChzdmNfYXV0aF91bnJlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHN2Y19hdXRoX3VucmVnaXN0ZXIpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICdhdXRoX2RvbWFpbnMnIGFyZSBzdG9yZWQgaW4gYSBoYXNoIHRhYmxlIGluZGV4ZWQgYnkgbmFtZS4KQEAgLTEzMiw3ICsxMzIsNyBAQAogCQlzcGluX3VubG9jaygmYXV0aF9kb21haW5fbG9jayk7CiAJfQogfQotRVhQT1JUX1NZTUJPTChhdXRoX2RvbWFpbl9wdXQpOworRVhQT1JUX1NZTUJPTF9HUEwoYXV0aF9kb21haW5fcHV0KTsKIAogc3RydWN0IGF1dGhfZG9tYWluICoKIGF1dGhfZG9tYWluX2xvb2t1cChjaGFyICpuYW1lLCBzdHJ1Y3QgYXV0aF9kb21haW4gKm5ldykKQEAgLTE1NywxMCArMTU3LDEwIEBACiAJc3Bpbl91bmxvY2soJmF1dGhfZG9tYWluX2xvY2spOwogCXJldHVybiBuZXc7CiB9Ci1FWFBPUlRfU1lNQk9MKGF1dGhfZG9tYWluX2xvb2t1cCk7CitFWFBPUlRfU1lNQk9MX0dQTChhdXRoX2RvbWFpbl9sb29rdXApOwogCiBzdHJ1Y3QgYXV0aF9kb21haW4gKmF1dGhfZG9tYWluX2ZpbmQoY2hhciAqbmFtZSkKIHsKIAlyZXR1cm4gYXV0aF9kb21haW5fbG9va3VwKG5hbWUsIE5VTEwpOwogfQotRVhQT1JUX1NZTUJPTChhdXRoX2RvbWFpbl9maW5kKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF1dGhfZG9tYWluX2ZpbmQpOwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9zdmNhdXRoX3VuaXguYyBiL25ldC9zdW5ycGMvc3ZjYXV0aF91bml4LmMKaW5kZXggODIyNDBlNi4uNWM4NjVlMiAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zdmNhdXRoX3VuaXguYworKysgYi9uZXQvc3VucnBjL3N2Y2F1dGhfdW5peC5jCkBAIC02NCw3ICs2NCw3IEBACiAJCXJ2ID0gYXV0aF9kb21haW5fbG9va3VwKG5hbWUsICZuZXctPmgpOwogCX0KIH0KLUVYUE9SVF9TWU1CT0wodW5peF9kb21haW5fZmluZCk7CitFWFBPUlRfU1lNQk9MX0dQTCh1bml4X2RvbWFpbl9maW5kKTsKIAogc3RhdGljIHZvaWQgc3ZjYXV0aF91bml4X2RvbWFpbl9yZWxlYXNlKHN0cnVjdCBhdXRoX2RvbWFpbiAqZG9tKQogewpAQCAtMzU4LDcgKzM1OCw3IEBACiAJZWxzZQogCQlyZXR1cm4gLUVOT01FTTsKIH0KLUVYUE9SVF9TWU1CT0woYXV0aF91bml4X2FkZF9hZGRyKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF1dGhfdW5peF9hZGRfYWRkcik7CiAKIGludCBhdXRoX3VuaXhfZm9yZ2V0X29sZChzdHJ1Y3QgYXV0aF9kb21haW4gKmRvbSkKIHsKQEAgLTM3MCw3ICszNzAsNyBAQAogCXVkb20tPmFkZHJfY2hhbmdlcysrOwogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTChhdXRoX3VuaXhfZm9yZ2V0X29sZCk7CitFWFBPUlRfU1lNQk9MX0dQTChhdXRoX3VuaXhfZm9yZ2V0X29sZCk7CiAKIHN0cnVjdCBhdXRoX2RvbWFpbiAqYXV0aF91bml4X2xvb2t1cChzdHJ1Y3QgaW42X2FkZHIgKmFkZHIpCiB7CkBAIC0zOTUsMTMgKzM5NSwxMyBAQAogCWNhY2hlX3B1dCgmaXBtLT5oLCAmaXBfbWFwX2NhY2hlKTsKIAlyZXR1cm4gcnY7CiB9Ci1FWFBPUlRfU1lNQk9MKGF1dGhfdW5peF9sb29rdXApOworRVhQT1JUX1NZTUJPTF9HUEwoYXV0aF91bml4X2xvb2t1cCk7CiAKIHZvaWQgc3ZjYXV0aF91bml4X3B1cmdlKHZvaWQpCiB7CiAJY2FjaGVfcHVyZ2UoJmlwX21hcF9jYWNoZSk7CiB9Ci1FWFBPUlRfU1lNQk9MKHN2Y2F1dGhfdW5peF9wdXJnZSk7CitFWFBPUlRfU1lNQk9MX0dQTChzdmNhdXRoX3VuaXhfcHVyZ2UpOwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBpcF9tYXAgKgogaXBfbWFwX2NhY2hlZF9nZXQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCkKQEAgLTcxNCw3ICs3MTQsNyBAQAogCXJldHVybiBTVkNfT0s7CiB9CiAKLUVYUE9SVF9TWU1CT0woc3ZjYXV0aF91bml4X3NldF9jbGllbnQpOworRVhQT1JUX1NZTUJPTF9HUEwoc3ZjYXV0aF91bml4X3NldF9jbGllbnQpOwogCiBzdGF0aWMgaW50CiBzdmNhdXRoX251bGxfYWNjZXB0KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqYXV0aHApCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3N2Y3NvY2suYyBiL25ldC9zdW5ycGMvc3Zjc29jay5jCmluZGV4IGVmMzIzOGQuLjU3NjNlNjQgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvc3Zjc29jay5jCisrKyBiL25ldC9zdW5ycGMvc3Zjc29jay5jCkBAIC01OSw2ICs1OSw3IEBACiBzdGF0aWMgaW50CQlzdmNfdWRwX3JlY3Zmcm9tKHN0cnVjdCBzdmNfcnFzdCAqKTsKIHN0YXRpYyBpbnQJCXN2Y191ZHBfc2VuZHRvKHN0cnVjdCBzdmNfcnFzdCAqKTsKIHN0YXRpYyB2b2lkCQlzdmNfc29ja19kZXRhY2goc3RydWN0IHN2Y194cHJ0ICopOworc3RhdGljIHZvaWQJCXN2Y190Y3Bfc29ja19kZXRhY2goc3RydWN0IHN2Y194cHJ0ICopOwogc3RhdGljIHZvaWQJCXN2Y19zb2NrX2ZyZWUoc3RydWN0IHN2Y194cHJ0ICopOwogCiBzdGF0aWMgc3RydWN0IHN2Y194cHJ0ICpzdmNfY3JlYXRlX3NvY2tldChzdHJ1Y3Qgc3ZjX3NlcnYgKiwgaW50LApAQCAtMTAyLDcgKzEwMyw2IEBACiBzdGF0aWMgdm9pZCBzdmNfcmVsZWFzZV9za2Ioc3RydWN0IHN2Y19ycXN0ICpycXN0cCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcnFzdHAtPnJxX3hwcnRfY3R4dDsKLQlzdHJ1Y3Qgc3ZjX2RlZmVycmVkX3JlcSAqZHIgPSBycXN0cC0+cnFfZGVmZXJyZWQ7CiAKIAlpZiAoc2tiKSB7CiAJCXN0cnVjdCBzdmNfc29jayAqc3ZzayA9CkBAIC0xMTIsMTAgKzExMiw2IEBACiAJCWRwcmludGsoInN2Yzogc2VydmljZSAlcCwgcmVsZWFzaW5nIHNrYiAlcFxuIiwgcnFzdHAsIHNrYik7CiAJCXNrYl9mcmVlX2RhdGFncmFtKHN2c2stPnNrX3NrLCBza2IpOwogCX0KLQlpZiAoZHIpIHsKLQkJcnFzdHAtPnJxX2RlZmVycmVkID0gTlVMTDsKLQkJa2ZyZWUoZHIpOwotCX0KIH0KIAogdW5pb24gc3ZjX3BrdGluZm9fdSB7CkBAIC0yODksNyArMjg1LDcgQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJcmV0dXJuIGxlbjsKIH0KLUVYUE9SVF9TWU1CT0woc3ZjX3NvY2tfbmFtZXMpOworRVhQT1JUX1NZTUJPTF9HUEwoc3ZjX3NvY2tfbmFtZXMpOwogCiAvKgogICogQ2hlY2sgaW5wdXQgcXVldWUgbGVuZ3RoCkBAIC0xMDE3LDcgKzEwMTMsNyBAQAogCS54cG9fcmVjdmZyb20gPSBzdmNfdGNwX3JlY3Zmcm9tLAogCS54cG9fc2VuZHRvID0gc3ZjX3RjcF9zZW5kdG8sCiAJLnhwb19yZWxlYXNlX3Jxc3QgPSBzdmNfcmVsZWFzZV9za2IsCi0JLnhwb19kZXRhY2ggPSBzdmNfc29ja19kZXRhY2gsCisJLnhwb19kZXRhY2ggPSBzdmNfdGNwX3NvY2tfZGV0YWNoLAogCS54cG9fZnJlZSA9IHN2Y19zb2NrX2ZyZWUsCiAJLnhwb19wcmVwX3JlcGx5X2hkciA9IHN2Y190Y3BfcHJlcF9yZXBseV9oZHIsCiAJLnhwb19oYXNfd3NwYWNlID0gc3ZjX3RjcF9oYXNfd3NwYWNlLApAQCAtMTEwMSw3ICsxMDk3LDcgQEAKIAl9CiAJc3Bpbl91bmxvY2tfYmgoJnNlcnYtPnN2X2xvY2spOwogfQotRVhQT1JUX1NZTUJPTChzdmNfc29ja191cGRhdGVfYnVmcyk7CitFWFBPUlRfU1lNQk9MX0dQTChzdmNfc29ja191cGRhdGVfYnVmcyk7CiAKIC8qCiAgKiBJbml0aWFsaXplIHNvY2tldCBmb3IgUlBDIHVzZSBhbmQgY3JlYXRlIHN2Y19zb2NrIHN0cnVjdApAQCAtMTI4Nyw2ICsxMjgzLDI0IEBACiAJc2stPnNrX3N0YXRlX2NoYW5nZSA9IHN2c2stPnNrX29zdGF0ZTsKIAlzay0+c2tfZGF0YV9yZWFkeSA9IHN2c2stPnNrX29kYXRhOwogCXNrLT5za193cml0ZV9zcGFjZSA9IHN2c2stPnNrX293c3BhY2U7CisKKwlpZiAoc2stPnNrX3NsZWVwICYmIHdhaXRxdWV1ZV9hY3RpdmUoc2stPnNrX3NsZWVwKSkKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKHNrLT5za19zbGVlcCk7Cit9CisKKy8qCisgKiBEaXNjb25uZWN0IHRoZSBzb2NrZXQsIGFuZCByZXNldCB0aGUgY2FsbGJhY2tzCisgKi8KK3N0YXRpYyB2b2lkIHN2Y190Y3Bfc29ja19kZXRhY2goc3RydWN0IHN2Y194cHJ0ICp4cHJ0KQoreworCXN0cnVjdCBzdmNfc29jayAqc3ZzayA9IGNvbnRhaW5lcl9vZih4cHJ0LCBzdHJ1Y3Qgc3ZjX3NvY2ssIHNrX3hwcnQpOworCisJZHByaW50aygic3ZjOiBzdmNfdGNwX3NvY2tfZGV0YWNoKCVwKVxuIiwgc3Zzayk7CisKKwlzdmNfc29ja19kZXRhY2goeHBydCk7CisKKwlpZiAoIXRlc3RfYml0KFhQVF9MSVNURU5FUiwgJnhwcnQtPnhwdF9mbGFncykpCisJCWtlcm5lbF9zb2NrX3NodXRkb3duKHN2c2stPnNrX3NvY2ssIFNIVVRfUkRXUik7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9uZXQvd2ltYXgvS2NvbmZpZyBiL25ldC93aW1heC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NDk1Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvd2ltYXgvS2NvbmZpZwpAQCAtMCwwICsxLDUyIEBACisjCisjIFdpTUFYIExBTiBkZXZpY2UgY29uZmlndXJhdGlvbgorIworIyBOb3RlIHRoZSB1Z2x5ICdkZXBlbmRzIG9uJyBvbiBXSU1BWDogdGhhdCBkaXNhbGxvd3MgUkZLSUxMIHRvIGJlIGEKKyMgbW9kdWxlIGlmIFdJTUFYIGlzIHRvIGJlIGxpbmtlZCBpbi4gVGhlIFdpTUFYIGNvZGUgaXMgZG9uZSBpbiBzdWNoIGEKKyMgd2F5IHRoYXQgaXQgZG9lc24ndCByZXF1aXJlIGFuZCBleHBsaWNpdCBkZXBlbmRlbmN5IG9uIFJGS0lMTCBpbgorIyBjYXNlIGFuIGVtYmVkZGVkIHN5c3RlbSB3YW50cyB0byByaXAgaXQgb3V0LgorIworIyBBcyB3ZWxsLCBlbmFibGVtZW50IG9mIHRoZSBSRktJTEwgY29kZSBtZWFucyB3ZSBuZWVkIHRoZSBJTlBVVCBsYXllcgorIyBzdXBwb3J0IHRvIGluamVjdCBldmVudHMgY29taW5nIGZyb20gaHcgcmZraWxsIHN3aXRjaGVzLiBUaGF0CisjIGRlcGVuZGVuY3kgY291bGQgYmUga2lsbGVkIGlmIGlucHV0LmggcHJvdmlkZWQgYXBwcm9waWF0ZSBtZWFucyB0bworIyB3b3JrIHdoZW4gaW5wdXQgaXMgZGlzYWJsZWQuCisKK2NvbW1lbnQgIldpTUFYIFdpcmVsZXNzIEJyb2FkYmFuZCBzdXBwb3J0IHJlcXVpcmVzIENPTkZJR19JTlBVVCBlbmFibGVkIgorCWRlcGVuZHMgb24gSU5QVVQgPSBuICYmIFJGS0lMTCAhPSBuCisKK21lbnVjb25maWcgV0lNQVgKKwl0cmlzdGF0ZSAiV2lNQVggV2lyZWxlc3MgQnJvYWRiYW5kIHN1cHBvcnQiCisJZGVwZW5kcyBvbiAoeSAmJiBSRktJTEwgIT0gbSkgfHwgbQorCWRlcGVuZHMgb24gKElOUFVUICYmIFJGS0lMTCAhPSBuKSB8fCBSRktJTEwgPSBuCisJaGVscAorCisJICBTZWxlY3QgdG8gY29uZmlndXJlIHN1cHBvcnQgZm9yIGRldmljZXMgdGhhdCBwcm92aWRlCisJICB3aXJlbGVzcyBicm9hZGJhbmQgY29ubmVjdGl2aXR5IHVzaW5nIHRoZSBXaU1BWCBwcm90b2NvbAorCSAgKElFRUUgODAyLjE2KS4KKworCSAgUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG9mIHRoZXNlIGRldmljZXMgcmVxdWlyZSBzaWduaW5nIHVwCisJICBmb3IgYSBzZXJ2aWNlIHBsYW4gd2l0aCBhIHByb3ZpZGVyLgorCisJICBUaGUgZGlmZmVyZW50IFdpTUFYIGRyaXZlcnMgY2FuIGJlIGVuYWJsZWQgaW4gdGhlIG1lbnUgZW50cnkKKworCSAgRGV2aWNlIERyaXZlcnMgPiBOZXR3b3JrIGRldmljZSBzdXBwb3J0ID4gV2lNQVggV2lyZWxlc3MKKwkgIEJyb2FkYmFuZCBkZXZpY2VzCisKKwkgIElmIHVuc3VyZSwgaXQgaXMgc2FmZSB0byBzZWxlY3QgTSAobW9kdWxlKS4KKworY29uZmlnIFdJTUFYX0RFQlVHX0xFVkVMCisJaW50ICJXaU1BWCBkZWJ1ZyBsZXZlbCIKKwlkZXBlbmRzIG9uIFdJTUFYCisJZGVmYXVsdCA4CisJaGVscAorCisJICBTZWxlY3QgdGhlIG1heGltdW0gZGVidWcgdmVyYm9zaXR5IGxldmVsIHRvIGJlIGNvbXBpbGVkIGludG8KKwkgIHRoZSBXaU1BWCBzdGFjayBjb2RlLgorCisJICBCeSBkZWZhdWx0LCBkZWJ1ZyBtZXNzYWdlcyBhcmUgZGlzYWJsZWQgYXQgcnVudGltZSBhbmQgY2FuCisJICBiZSBzZWxlY3RpdmVseSBlbmFibGVkIGZvciBkaWZmZXJlbnQgcGFydHMgb2YgdGhlIGNvZGUgdXNpbmcKKwkgIHRoZSBzeXNmcyBkZWJ1Zy1sZXZlbHMgZmlsZS4KKworCSAgSWYgc2V0IGF0IHplcm8sIHRoaXMgd2lsbCBjb21waWxlIG91dCBhbGwgdGhlIGRlYnVnIGNvZGUuCisKKwkgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgaXQgaXMgbGVmdCBhdCA4LgpkaWZmIC0tZ2l0IGEvbmV0L3dpbWF4L01ha2VmaWxlIGIvbmV0L3dpbWF4L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViODBiOTQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvd2ltYXgvTWFrZWZpbGUKQEAgLTAsMCArMSwxMyBAQAorCitvYmotJChDT05GSUdfV0lNQVgpCQkrPSB3aW1heC5vCisKK3dpbWF4LXkgOj0JCVwKKwlpZC10YWJsZS5vCVwKKwlvcC1tc2cubwlcCisJb3AtcmVzZXQubwlcCisJb3AtcmZraWxsLm8JXAorCXN0YWNrLm8KKword2ltYXgtJChDT05GSUdfREVCVUdfRlMpICs9IGRlYnVnZnMubworCisKZGlmZiAtLWdpdCBhL25ldC93aW1heC9kZWJ1Zy1sZXZlbHMuaCBiL25ldC93aW1heC9kZWJ1Zy1sZXZlbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzI5MTIzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3dpbWF4L2RlYnVnLWxldmVscy5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBMaW51eCBXaU1BWCBTdGFjaworICogRGVidWcgbGV2ZWxzIGNvbnRyb2wgZmlsZSBmb3IgdGhlIHdpbWF4IG1vZHVsZQorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKyNpZm5kZWYgX19kZWJ1Z19sZXZlbHNfX2hfXworI2RlZmluZSBfX2RlYnVnX2xldmVsc19faF9fCisKKy8qIE1heGltdW0gY29tcGlsZSBhbmQgcnVuIHRpbWUgZGVidWcgbGV2ZWwgZm9yIGFsbCBzdWJtb2R1bGVzICovCisjZGVmaW5lIERfTU9EVUxFTkFNRSB3aW1heAorI2RlZmluZSBEX01BU1RFUiBDT05GSUdfV0lNQVhfREVCVUdfTEVWRUwKKworI2luY2x1ZGUgPGxpbnV4L3dpbWF4L2RlYnVnLmg+CisKKy8qIExpc3Qgb2YgYWxsIHRoZSBlbmFibGVkIG1vZHVsZXMgKi8KK2VudW0gZF9tb2R1bGUgeworCURfU1VCTU9EVUxFX0RFQ0xBUkUoZGVidWdmcyksCisJRF9TVUJNT0RVTEVfREVDTEFSRShpZF90YWJsZSksCisJRF9TVUJNT0RVTEVfREVDTEFSRShvcF9tc2cpLAorCURfU1VCTU9EVUxFX0RFQ0xBUkUob3BfcmVzZXQpLAorCURfU1VCTU9EVUxFX0RFQ0xBUkUob3BfcmZraWxsKSwKKwlEX1NVQk1PRFVMRV9ERUNMQVJFKHN0YWNrKSwKK307CisKKyNlbmRpZiAvKiAjaWZuZGVmIF9fZGVidWdfbGV2ZWxzX19oX18gKi8KZGlmZiAtLWdpdCBhL25ldC93aW1heC9kZWJ1Z2ZzLmMgYi9uZXQvd2ltYXgvZGVidWdmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3Y2Y0NDMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvd2ltYXgvZGVidWdmcy5jCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBMaW51eCBXaU1BWAorICogRGVidWdmcyBzdXBwb3J0CisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IEludGVsIENvcnBvcmF0aW9uIDxsaW51eC13aW1heEBpbnRlbC5jb20+CisgKiBJbmFreSBQZXJlei1Hb256YWxleiA8aW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC93aW1heC5oPgorI2luY2x1ZGUgIndpbWF4LWludGVybmFsLmgiCisKKyNkZWZpbmUgRF9TVUJNT0RVTEUgZGVidWdmcworI2luY2x1ZGUgImRlYnVnLWxldmVscy5oIgorCisKKy8qIERlYnVnIGZyYW1ld29yayBjb250cm9sIG9mIGRlYnVnIGxldmVscyAqLworc3RydWN0IGRfbGV2ZWwgRF9MRVZFTFtdID0geworCURfU1VCTU9EVUxFX0RFRklORShkZWJ1Z2ZzKSwKKwlEX1NVQk1PRFVMRV9ERUZJTkUoaWRfdGFibGUpLAorCURfU1VCTU9EVUxFX0RFRklORShvcF9tc2cpLAorCURfU1VCTU9EVUxFX0RFRklORShvcF9yZXNldCksCisJRF9TVUJNT0RVTEVfREVGSU5FKG9wX3Jma2lsbCksCisJRF9TVUJNT0RVTEVfREVGSU5FKHN0YWNrKSwKK307CitzaXplX3QgRF9MRVZFTF9TSVpFID0gQVJSQVlfU0laRShEX0xFVkVMKTsKKworI2RlZmluZSBfX2RlYnVnZnNfcmVnaXN0ZXIocHJlZml4LCBuYW1lLCBwYXJlbnQpCQkJXAorZG8gewkJCQkJCQkJCVwKKwlyZXN1bHQgPSBkX2xldmVsX3JlZ2lzdGVyX2RlYnVnZnMocHJlZml4LCBuYW1lLCBwYXJlbnQpOwlcCisJaWYgKHJlc3VsdCA8IDApCQkJCQkJCVwKKwkJZ290byBlcnJvcjsJCQkJCQlcCit9IHdoaWxlICgwKQorCisKK2ludCB3aW1heF9kZWJ1Z2ZzX2FkZChzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IHdpbWF4X2Rldi0+bmV0X2RldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBuZXRfZGV2LT5kZXYucGFyZW50OworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwljaGFyIGJ1ZlsxMjhdOworCisJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIndpbWF4OiVzIiwgbmV0X2Rldi0+bmFtZSk7CisJZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZGlyKGJ1ZiwgTlVMTCk7CisJcmVzdWx0ID0gUFRSX0VSUihkZW50cnkpOworCWlmIChJU19FUlIoZGVudHJ5KSkgeworCQlpZiAocmVzdWx0ID09IC1FTk9ERVYpCisJCQlyZXN1bHQgPSAwOwkvKiBObyBkZWJ1Z2ZzIHN1cHBvcnQgKi8KKwkJZWxzZQorCQkJZGV2X2VycihkZXYsICJDYW4ndCBjcmVhdGUgZGVidWdmcyBkZW50cnk6ICVkXG4iLAorCQkJCXJlc3VsdCk7CisJCWdvdG8gb3V0OworCX0KKwl3aW1heF9kZXYtPmRlYnVnZnNfZGVudHJ5ID0gZGVudHJ5OworCV9fZGVidWdmc19yZWdpc3Rlcigid2ltYXhfZGxfIiwgZGVidWdmcywgZGVudHJ5KTsKKwlfX2RlYnVnZnNfcmVnaXN0ZXIoIndpbWF4X2RsXyIsIGlkX3RhYmxlLCBkZW50cnkpOworCV9fZGVidWdmc19yZWdpc3Rlcigid2ltYXhfZGxfIiwgb3BfbXNnLCBkZW50cnkpOworCV9fZGVidWdmc19yZWdpc3Rlcigid2ltYXhfZGxfIiwgb3BfcmVzZXQsIGRlbnRyeSk7CisJX19kZWJ1Z2ZzX3JlZ2lzdGVyKCJ3aW1heF9kbF8iLCBvcF9yZmtpbGwsIGRlbnRyeSk7CisJX19kZWJ1Z2ZzX3JlZ2lzdGVyKCJ3aW1heF9kbF8iLCBzdGFjaywgZGVudHJ5KTsKKwlyZXN1bHQgPSAwOworb3V0OgorCXJldHVybiByZXN1bHQ7CisKK2Vycm9yOgorCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZSh3aW1heF9kZXYtPmRlYnVnZnNfZGVudHJ5KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCit2b2lkIHdpbWF4X2RlYnVnZnNfcm0oc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2KQoreworCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZSh3aW1heF9kZXYtPmRlYnVnZnNfZGVudHJ5KTsKK30KKworCmRpZmYgLS1naXQgYS9uZXQvd2ltYXgvaWQtdGFibGUuYyBiL25ldC93aW1heC9pZC10YWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNjg1ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvd2ltYXgvaWQtdGFibGUuYwpAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIExpbnV4IFdpTUFYCisgKiBNYXBwcGluZyBvZiBnZW5lcmljIG5ldGxpbmsgZmFtaWx5IElEcyB0byBuZXQgZGV2aWNlcworICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKgorICoKKyAqIFdlIGFzc2lnbiBhIHNpbmdsZSBnZW5lcmljIG5ldGxpbmsgZmFtaWx5IElEIHRvIGVhY2ggZGV2aWNlICh0bworICogc2ltcGxpZnkgbG9va3VwKS4KKyAqCisgKiBXZSBuZWVkIGEgd2F5IHRvIG1hcCBmYW1pbHkgSUQgdG8gYSB3aW1heF9kZXYgcG9pbnRlci4KKyAqCisgKiBUaGUgaWRlYSBpcyB0byB1c2UgYSB2ZXJ5IHNpbXBsZSBsb29rdXAuIFVzaW5nIGEgbmV0bGluayBhdHRyaWJ1dGUKKyAqIHdpdGggKGZvciBleGFtcGxlKSB0aGUgaW50ZXJmYWNlIG5hbWUgaW1wbGllcyBhIGhlYXZpZXIgc2VhcmNoIG92ZXIKKyAqIGFsbCB0aGUgbmV0d29yayBkZXZpY2VzOyBzZWVtZWQga2luZCBvZiBhIHdhc3RlIGdpdmVuIHRoYXQgd2Uga25vdworICogd2UgYXJlIGxvb2tpbmcgZm9yIGEgV2lNQVggZGV2aWNlIGFuZCB0aGF0IG1vc3Qgc3lzdGVtcyB3aWxsIGhhdmUKKyAqIGp1c3QgYSBzaW5nbGUgV2lNQVggYWRhcHRlci4KKyAqCisgKiBXZSBwdXQgYWxsIHRoZSBXaU1BWCBkZXZpY2VzIGluIHRoZSBzeXN0ZW0gaW4gYSBsaW5rZWQgbGlzdCBhbmQKKyAqIG1hdGNoIHRoZSBnZW5lcmljIGxpbmsgZmFtaWx5IElEIGFnYWluc3QgdGhlIGxpc3QuCisgKgorICogQnkgdXNpbmcgYSBsaW5rZWQgbGlzdCwgdGhlIGNhc2Ugb2YgYSBzaW5nbGUgYWRhcHRlciBpbiB0aGUgc3lzdGVtCisgKiBiZWNvbWVzIChhbG1vc3QpIG5vIG92ZXJoZWFkLCB3aGlsZSBzdGlsbCB3b3JraW5nIGZvciBtYW55IG1vcmUuIElmCisgKiBpdCBldmVyIGdvZXMgYmV5b25kIHR3bywgSSdsbCBiZSBzdXJwcmlzZWQuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxuZXQvZ2VuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dpbWF4Lmg+CisjaW5jbHVkZSAid2ltYXgtaW50ZXJuYWwuaCIKKworCisjZGVmaW5lIERfU1VCTU9EVUxFIGlkX3RhYmxlCisjaW5jbHVkZSAiZGVidWctbGV2ZWxzLmgiCisKKworc3RhdGljIERFRklORV9TUElOTE9DSyh3aW1heF9pZF90YWJsZV9sb2NrKTsKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHdpbWF4X2lkX3RhYmxlID0gTElTVF9IRUFEX0lOSVQod2ltYXhfaWRfdGFibGUpOworCisKKy8qCisgKiB3aW1heF9pZF90YWJsZV9hZGQgLSBhZGQgYSBnZW5uZXRsaW5rIGZhbWlsaXkgSUQgLyB3aW1heF9kZXYgbWFwcGluZworICoKKyAqIEB3aW1heF9kZXY6IFdpTUFYIGRldmljZSBkZXNjcmlwdG9yIHRvIGFzc29jaWF0ZSB0byB0aGUgR2VuZXJpYworICogICAgIE5ldGxpbmsgZmFtaWx5IElELgorICoKKyAqIExvb2sgZm9yIGFuIGVtcHR5IHNwb3QgaW4gdGhlIElEIHRhYmxlOyBpZiBub25lIGZvdW5kLCBkb3VibGUgdGhlCisgKiB0YWJsZSdzIHNpemUgYW5kIGdldCB0aGUgZmlyc3Qgc3BvdC4KKyAqLwordm9pZCB3aW1heF9pZF90YWJsZV9hZGQoc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2KQoreworCWRfZm5zdGFydCgzLCBOVUxMLCAiKHdpbWF4X2RldiAlcClcbiIsIHdpbWF4X2Rldik7CisJc3Bpbl9sb2NrKCZ3aW1heF9pZF90YWJsZV9sb2NrKTsKKwlsaXN0X2FkZCgmd2ltYXhfZGV2LT5pZF90YWJsZV9ub2RlLCAmd2ltYXhfaWRfdGFibGUpOworCXNwaW5fdW5sb2NrKCZ3aW1heF9pZF90YWJsZV9sb2NrKTsKKwlkX2ZuZW5kKDMsIE5VTEwsICIod2ltYXhfZGV2ICVwKVxuIiwgd2ltYXhfZGV2KTsKK30KKworCisvKgorICogd2ltYXhfZ2V0X25ldGRldl9ieV9pbmZvIC0gbG9va3VwIGEgd2ltYXhfZGV2IGZyb20gdGhlIGdlbm5ldGxpbmsgaW5mbworICoKKyAqIFRoZSBnZW5lcmljIG5ldGxpbmsgZmFtaWx5IElEIGhhcyBiZWVuIGZpbGxlZCBvdXQgaW4gdGhlCisgKiBubG1zZ2hkci0+bmxtc2dfdHlwZSBmaWVsZCwgc28gd2UgcHVsbCBpdCBmcm9tIHRoZXJlLCBsb29rIGl0IHVwIGluCisgKiB0aGUgbWFwcGluZyB0YWJsZSBhbmQgcmVmZXJlbmNlIHRoZSB3aW1heF9kZXYuCisgKgorICogV2hlbiBkb25lLCB0aGUgcmVmZXJlbmNlIHNob3VsZCBiZSBkcm9wcGVkIHdpdGgKKyAqICdkZXZfcHV0KHdpbWF4X2Rldi0+bmV0X2RldiknLgorICovCitzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXZfZ2V0X2J5X2dlbmxfaW5mbygKKwlzdHJ1Y3QgZ2VubF9pbmZvICppbmZvLCBpbnQgaWZpbmRleCkKK3sKKwlzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYgPSBOVUxMOworCisJZF9mbnN0YXJ0KDMsIE5VTEwsICIoaW5mbyAlcCBpZmluZGV4ICVkKVxuIiwgaW5mbywgaWZpbmRleCk7CisJc3Bpbl9sb2NrKCZ3aW1heF9pZF90YWJsZV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHdpbWF4X2RldiwgJndpbWF4X2lkX3RhYmxlLCBpZF90YWJsZV9ub2RlKSB7CisJCWlmICh3aW1heF9kZXYtPm5ldF9kZXYtPmlmaW5kZXggPT0gaWZpbmRleCkgeworCQkJZGV2X2hvbGQod2ltYXhfZGV2LT5uZXRfZGV2KTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICh3aW1heF9kZXYgPT0gTlVMTCkKKwkJZF9wcmludGYoMSwgTlVMTCwgIndpbWF4OiBubyBkZXZpY2VzIGZvdW5kIHdpdGggaWZpbmRleCAlZFxuIiwKKwkJCSBpZmluZGV4KTsKKwlzcGluX3VubG9jaygmd2ltYXhfaWRfdGFibGVfbG9jayk7CisJZF9mbmVuZCgzLCBOVUxMLCAiKGluZm8gJXAgaWZpbmRleCAlZCkgPSAlcFxuIiwKKwkJaW5mbywgaWZpbmRleCwgd2ltYXhfZGV2KTsKKwlyZXR1cm4gd2ltYXhfZGV2OworfQorCisKKy8qCisgKiB3aW1heF9pZF90YWJsZV9ybSAtIFJlbW92ZSBhIGdlbm5ldGxpbmsgZmFtaWxpeSBJRCAvIHdpbWF4X2RldiBtYXBwaW5nCisgKgorICogQGlkOiBmYW1pbHkgSUQgdG8gcmVtb3ZlIGZyb20gdGhlIHRhYmxlCisgKi8KK3ZvaWQgd2ltYXhfaWRfdGFibGVfcm0oc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2KQoreworCXNwaW5fbG9jaygmd2ltYXhfaWRfdGFibGVfbG9jayk7CisJbGlzdF9kZWxfaW5pdCgmd2ltYXhfZGV2LT5pZF90YWJsZV9ub2RlKTsKKwlzcGluX3VubG9jaygmd2ltYXhfaWRfdGFibGVfbG9jayk7Cit9CisKKworLyoKKyAqIFJlbGVhc2UgdGhlIGdlbm5ldGxpbmsgZmFtaWx5IGlkIC8gbWFwcGluZyB0YWJsZQorICoKKyAqIE9uIGRlYnVnLCB2ZXJpZnkgdGhhdCB0aGUgdGFibGUgaXMgZW1wdHkgdXBvbiByZW1vdmFsLiBXZSB3YW50IHRoZQorICogY29kZSBhbHdheXMgY29tcGlsZWQsIHRvIGVuc3VyZSBpdCBkb2Vzbid0IGJpdCByb3QuIEl0IHdpbGwgYmUKKyAqIGNvbXBpbGVkIG91dCBpZiBDT05GSUdfQlVHIGlzIGRpc2FibGVkLgorICovCit2b2lkIHdpbWF4X2lkX3RhYmxlX3JlbGVhc2Uodm9pZCkKK3sKKwlzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXY7CisKKyNpZm5kZWYgQ09ORklHX0JVRworCXJldHVybjsKKyNlbmRpZgorCXNwaW5fbG9jaygmd2ltYXhfaWRfdGFibGVfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh3aW1heF9kZXYsICZ3aW1heF9pZF90YWJsZSwgaWRfdGFibGVfbm9kZSkgeworCQlwcmludGsoS0VSTl9FUlIgIkJVRzogJXMgd2ltYXhfZGV2ICVwIGlmaW5kZXggJWQgbm90IGNsZWFyZWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgd2ltYXhfZGV2LCB3aW1heF9kZXYtPm5ldF9kZXYtPmlmaW5kZXgpOworCQlXQVJOX09OKDEpOworCX0KKwlzcGluX3VubG9jaygmd2ltYXhfaWRfdGFibGVfbG9jayk7Cit9CmRpZmYgLS1naXQgYS9uZXQvd2ltYXgvb3AtbXNnLmMgYi9uZXQvd2ltYXgvb3AtbXNnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IzYjRhZAotLS0gL2Rldi9udWxsCisrKyBiL25ldC93aW1heC9vcC1tc2cuYwpAQCAtMCwwICsxLDQyMSBAQAorLyoKKyAqIExpbnV4IFdpTUFYCisgKiBHZW5lcmljIG1lc3NhZ2luZyBpbnRlcmZhY2UgYmV0d2VlbiB1c2Vyc3BhY2UgYW5kIGRyaXZlci9kZXZpY2UKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggSW50ZWwgQ29ycG9yYXRpb24gPGxpbnV4LXdpbWF4QGludGVsLmNvbT4KKyAqIEluYWt5IFBlcmV6LUdvbnphbGV6IDxpbmFreS5wZXJlei1nb256YWxlekBpbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqCisgKiBUaGlzIGltcGxlbWVudHMgYSBkaXJlY3QgY29tbXVuaWNhdGlvbiBjaGFubmVsIGJldHdlZW4gdXNlciBzcGFjZSBhbmQKKyAqIHRoZSBkcml2ZXIvZGV2aWNlLCBieSB3aGljaCBmcmVlIGZvcm0gbWVzc2FnZXMgY2FuIGJlIHNlbnQgYmFjayBhbmQKKyAqIGZvcnRoLgorICoKKyAqIFRoaXMgaXMgaW50ZW5kZWQgZm9yIGRldmljZS1zcGVjaWZpYyBmZWF0dXJlcywgdmVuZG9yIHF1aXJrcywgZXRjLgorICoKKyAqIFNlZSBpbmNsdWRlL25ldC93aW1heC5oCisgKgorICogR0VORVJJQyBORVRMSU5LIEVOQ09ESU5HIEFORCBDQVBBQ0lUWQorICoKKyAqIEEgZGVzdGluYXRpb24gInBpcGUgbmFtZSIgaXMgYWRkZWQgdG8gZWFjaCBtZXNzYWdlOyBpdCBpcyB1cCB0byB0aGUKKyAqIGRyaXZlcnMgdG8gYXNzaWduIG9yIHVzZSB0aG9zZSBuYW1lcyAoaWYgdXNpbmcgdGhlbSBhdCBhbGwpLgorICoKKyAqIE1lc3NhZ2VzIGFyZSBlbmNvZGVkIGFzIGEgYmluYXJ5IG5ldGxpbmsgYXR0cmlidXRlIHVzaW5nIG5sYV9wdXQoKQorICogdXNpbmcgdHlwZSBOTEFfVU5TUEVDIChhcyBzb21lIHZlcnNpb25zIG9mIGxpYm5sIHN0aWxsIGluCisgKiBkZXBsb3ltZW50IGRvbid0IHlldCB1bmRlcnN0YW5kIE5MQV9CSU5BUlkpLgorICoKKyAqIFRoZSBtYXhpbXVtIGNhcGFjaXR5IG9mIHRoaXMgdHJhbnNwb3J0IGlzIFBBR0VTSVpFIHBlciBtZXNzYWdlIChzbworICogdGhlIGFjdHVhbCBwYXlsb2FkIHdpbGwgYmUgYml0IHNtYWxsZXIgZGVwZW5kaW5nIG9uIHRoZQorICogbmV0bGluay9nZW5lcmljIG5ldGxpbmsgYXR0cmlidXRlcyBhbmQgaGVhZGVycykuCisgKgorICogUkVDRVBUSU9OIE9GIE1FU1NBR0VTCisgKgorICogV2hlbiBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgZnJvbSB1c2VyIHNwYWNlLCBpdCBpcyBwYXNzZWQgdmVyYmF0aW0KKyAqIHRvIHRoZSBkcml2ZXIgY2FsbGluZyB3aW1heF9kZXYtPm9wX21zZ19mcm9tX3VzZXIoKS4gVGhlIHJldHVybgorICogdmFsdWUgZnJvbSB0aGlzIGZ1bmN0aW9uIGlzIHBhc3NlZCBiYWNrIHRvIHVzZXIgc3BhY2UgYXMgYW4gYWNrCisgKiBvdmVyIHRoZSBnZW5lcmljIG5ldGxpbmsgcHJvdG9jb2wuCisgKgorICogVGhlIHN0YWNrIGRvZXNuJ3QgZG8gYW55IHByb2Nlc3Npbmcgb3IgaW50ZXJwcmV0YXRpb24gb2YgdGhlc2UKKyAqIG1lc3NhZ2VzLgorICoKKyAqIFNFTkRJTkcgTUVTU0FHRVMKKyAqCisgKiBNZXNzYWdlcyBjYW4gYmUgc2VudCB3aXRoIHdpbWF4X21zZygpLgorICoKKyAqIElmIHRoZSBtZXNzYWdlIGRlbGl2ZXJ5IG5lZWRzIHRvIGhhcHBlbiBvbiBhIGRpZmZlcmVudCBjb250ZXh0IHRvCisgKiB0aGF0IG9mIGl0cyBjcmVhdGlvbiwgd2ltYXhfbXNnX2FsbG9jKCkgY2FuIGJlIHVzZWQgdG8gZ2V0IGEKKyAqIHBvaW50ZXIgdG8gdGhlIG1lc3NhZ2UgdGhhdCBjYW4gYmUgZGVsaXZlcmVkIGxhdGVyIG9uIHdpdGgKKyAqIHdpbWF4X21zZ19zZW5kKCkuCisgKgorICogUk9BRE1BUAorICoKKyAqIHdpbWF4X2dubF9kb2l0X21zZ19mcm9tX3VzZXIoKSAgICBQcm9jZXNzIGEgbWVzc2FnZSBmcm9tIHVzZXIgc3BhY2UKKyAqICAgd2ltYXhfZGV2X2dldF9ieV9nZW5sX2luZm8oKQorICogICB3aW1heF9kZXYtPm9wX21zZ19mcm9tX3VzZXIoKSAgIERlbGl2ZXJ5IG9mIG1lc3NhZ2UgdG8gdGhlIGRyaXZlcgorICoKKyAqIHdpbWF4X21zZygpICAgICAgICAgICAgICAgICAgICAgICBTZW5kIGEgbWVzc2FnZSB0byB1c2VyIHNwYWNlCisgKiAgIHdpbWF4X21zZ19hbGxvYygpCisgKiAgIHdpbWF4X21zZ19zZW5kKCkKKyAqLworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPG5ldC9nZW5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93aW1heC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CisjaW5jbHVkZSAid2ltYXgtaW50ZXJuYWwuaCIKKworCisjZGVmaW5lIERfU1VCTU9EVUxFIG9wX21zZworI2luY2x1ZGUgImRlYnVnLWxldmVscy5oIgorCisKKy8qKgorICogd2ltYXhfbXNnX2FsbG9jIC0gQ3JlYXRlIGEgbmV3IHNrYiBmb3Igc2VuZGluZyBhIG1lc3NhZ2UgdG8gdXNlcnNwYWNlCisgKgorICogQHdpbWF4X2RldjogV2lNQVggZGV2aWNlIGRlc2NyaXB0b3IKKyAqIEBwaXBlX25hbWU6ICJuYW1lZCBwaXBlIiB0aGUgbWVzc2FnZSB3aWxsIGJlIHNlbnQgdG8KKyAqIEBtc2c6IHBvaW50ZXIgdG8gdGhlIG1lc3NhZ2UgZGF0YSB0byBzZW5kCisgKiBAc2l6ZTogc2l6ZSBvZiB0aGUgbWVzc2FnZSB0byBzZW5kIChpbiBieXRlcyksIGluY2x1ZGluZyB0aGUgaGVhZGVyLgorICogQGdmcF9mbGFnczogZmxhZ3MgZm9yIG1lbW9yeSBhbGxvY2F0aW9uLgorICoKKyAqIFJldHVybnM6ICUwIGlmIG9rLCBuZWdhdGl2ZSBlcnJubyBjb2RlIG9uIGVycm9yCisgKgorICogRGVzY3JpcHRpb246CisgKgorICogQWxsb2NhdGVzIGFuIHNrYiB0aGF0IHdpbGwgY29udGFpbiB0aGUgbWVzc2FnZSB0byBzZW5kIHRvIHVzZXIKKyAqIHNwYWNlIG92ZXIgdGhlIG1lc3NhZ2luZyBwaXBlIGFuZCBpbml0aWFsaXplcyBpdCwgY29weWluZyB0aGUKKyAqIHBheWxvYWQuCisgKgorICogT25jZSB0aGlzIGNhbGwgaXMgZG9uZSwgeW91IGNhbiBkZWxpdmVyIGl0IHdpdGgKKyAqIHdpbWF4X21zZ19zZW5kKCkuCisgKgorICogSU1QT1JUQU5UOgorICoKKyAqIERvbid0IHVzZSBza2JfcHVzaCgpL3NrYl9wdWxsKCkvc2tiX3Jlc2VydmUoKSBvbiB0aGUgc2tiLCBhcworICogd2ltYXhfbXNnX3NlbmQoKSBkZXBlbmRzIG9uIHNrYi0+ZGF0YSBiZWluZyBwbGFjZWQgYXQgdGhlCisgKiBiZWdpbm5pbmcgb2YgdGhlIHVzZXIgbWVzc2FnZS4KKyAqLworc3RydWN0IHNrX2J1ZmYgKndpbWF4X21zZ19hbGxvYyhzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYsCisJCQkJY29uc3QgY2hhciAqcGlwZV9uYW1lLAorCQkJCWNvbnN0IHZvaWQgKm1zZywgc2l6ZV90IHNpemUsCisJCQkJZ2ZwX3QgZ2ZwX2ZsYWdzKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gd2ltYXhfZGV2LT5uZXRfZGV2LT5kZXYucGFyZW50OworCXNpemVfdCBtc2dfc2l6ZTsKKwl2b2lkICpnZW5sX21zZzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJbXNnX3NpemUgPSBubGFfdG90YWxfc2l6ZShzaXplKQorCQkrIG5sYV90b3RhbF9zaXplKHNpemVvZih1MzIpKQorCQkrIChwaXBlX25hbWUgPyBubGFfdG90YWxfc2l6ZShzdHJsZW4ocGlwZV9uYW1lKSkgOiAwKTsKKwlyZXN1bHQgPSAtRU5PTUVNOworCXNrYiA9IGdlbmxtc2dfbmV3KG1zZ19zaXplLCBnZnBfZmxhZ3MpOworCWlmIChza2IgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9uZXc7CisJZ2VubF9tc2cgPSBnZW5sbXNnX3B1dChza2IsIDAsIDAsICZ3aW1heF9nbmxfZmFtaWx5LAorCQkJICAgICAgIDAsIFdJTUFYX0dOTF9PUF9NU0dfVE9fVVNFUik7CisJaWYgKGdlbmxfbXNnID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJubyBtZW1vcnkgdG8gY3JlYXRlIGdlbmVyaWMgbmV0bGluayBtZXNzYWdlXG4iKTsKKwkJZ290byBlcnJvcl9nZW5sbXNnX3B1dDsKKwl9CisJcmVzdWx0ID0gbmxhX3B1dF91MzIoc2tiLCBXSU1BWF9HTkxfTVNHX0lGSURYLAorCQkJICAgICB3aW1heF9kZXYtPm5ldF9kZXYtPmlmaW5kZXgpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAibm8gbWVtb3J5IHRvIGFkZCBpZmluZGV4IGF0dHJpYnV0ZVxuIik7CisJCWdvdG8gZXJyb3JfbmxhX3B1dDsKKwl9CisJaWYgKHBpcGVfbmFtZSkgeworCQlyZXN1bHQgPSBubGFfcHV0X3N0cmluZyhza2IsIFdJTUFYX0dOTF9NU0dfUElQRV9OQU1FLAorCQkJCQlwaXBlX25hbWUpOworCQlpZiAocmVzdWx0IDwgMCkgeworCQkJZGV2X2VycihkZXYsICJubyBtZW1vcnkgdG8gYWRkIHBpcGVfbmFtZSBhdHRyaWJ1dGVcbiIpOworCQkJZ290byBlcnJvcl9ubGFfcHV0OworCQl9CisJfQorCXJlc3VsdCA9IG5sYV9wdXQoc2tiLCBXSU1BWF9HTkxfTVNHX0RBVEEsIHNpemUsIG1zZyk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJubyBtZW1vcnkgdG8gYWRkIHBheWxvYWQgaW4gYXR0cmlidXRlXG4iKTsKKwkJZ290byBlcnJvcl9ubGFfcHV0OworCX0KKwlnZW5sbXNnX2VuZChza2IsIGdlbmxfbXNnKTsKKwlyZXR1cm4gc2tiOworCitlcnJvcl9ubGFfcHV0OgorZXJyb3JfZ2VubG1zZ19wdXQ6CitlcnJvcl9uZXc6CisJbmxtc2dfZnJlZShza2IpOworCXJldHVybiBFUlJfUFRSKHJlc3VsdCk7CisKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdpbWF4X21zZ19hbGxvYyk7CisKKworLyoqCisgKiB3aW1heF9tc2dfZGF0YV9sZW4gLSBSZXR1cm4gYSBwb2ludGVyIGFuZCBzaXplIG9mIGEgbWVzc2FnZSdzIHBheWxvYWQKKyAqCisgKiBAbXNnOiBQb2ludGVyIHRvIGEgbWVzc2FnZSBjcmVhdGVkIHdpdGggd2ltYXhfbXNnX2FsbG9jKCkKKyAqIEBzaXplOiBQb2ludGVyIHRvIHdoZXJlIHRvIHN0b3JlIHRoZSBtZXNzYWdlJ3Mgc2l6ZQorICoKKyAqIFJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIG1lc3NhZ2UgZGF0YS4KKyAqLworY29uc3Qgdm9pZCAqd2ltYXhfbXNnX2RhdGFfbGVuKHN0cnVjdCBza19idWZmICptc2csIHNpemVfdCAqc2l6ZSkKK3sKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5saCA9ICh2b2lkICopIG1zZy0+aGVhZDsKKwlzdHJ1Y3QgbmxhdHRyICpubGE7CisKKwlubGEgPSBubG1zZ19maW5kX2F0dHIobmxoLCBzaXplb2Yoc3RydWN0IGdlbmxtc2doZHIpLAorCQkJICAgICAgV0lNQVhfR05MX01TR19EQVRBKTsKKwlpZiAobmxhID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDYW5ub3QgZmluZCBhdHRyaWJ1dGUgV0lNQVhfR05MX01TR19EQVRBXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCSpzaXplID0gbmxhX2xlbihubGEpOworCXJldHVybiBubGFfZGF0YShubGEpOworfQorRVhQT1JUX1NZTUJPTF9HUEwod2ltYXhfbXNnX2RhdGFfbGVuKTsKKworCisvKioKKyAqIHdpbWF4X21zZ19kYXRhIC0gUmV0dXJuIGEgcG9pbnRlciB0byBhIG1lc3NhZ2UncyBwYXlsb2FkCisgKgorICogQG1zZzogUG9pbnRlciB0byBhIG1lc3NhZ2UgY3JlYXRlZCB3aXRoIHdpbWF4X21zZ19hbGxvYygpCisgKi8KK2NvbnN0IHZvaWQgKndpbWF4X21zZ19kYXRhKHN0cnVjdCBza19idWZmICptc2cpCit7CisJc3RydWN0IG5sbXNnaGRyICpubGggPSAodm9pZCAqKSBtc2ctPmhlYWQ7CisJc3RydWN0IG5sYXR0ciAqbmxhOworCisJbmxhID0gbmxtc2dfZmluZF9hdHRyKG5saCwgc2l6ZW9mKHN0cnVjdCBnZW5sbXNnaGRyKSwKKwkJCSAgICAgIFdJTUFYX0dOTF9NU0dfREFUQSk7CisJaWYgKG5sYSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ2Fubm90IGZpbmQgYXR0cmlidXRlIFdJTUFYX0dOTF9NU0dfREFUQVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gbmxhX2RhdGEobmxhKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdpbWF4X21zZ19kYXRhKTsKKworCisvKioKKyAqIHdpbWF4X21zZ19sZW4gLSBSZXR1cm4gYSBtZXNzYWdlJ3MgcGF5bG9hZCBsZW5ndGgKKyAqCisgKiBAbXNnOiBQb2ludGVyIHRvIGEgbWVzc2FnZSBjcmVhdGVkIHdpdGggd2ltYXhfbXNnX2FsbG9jKCkKKyAqLworc3NpemVfdCB3aW1heF9tc2dfbGVuKHN0cnVjdCBza19idWZmICptc2cpCit7CisJc3RydWN0IG5sbXNnaGRyICpubGggPSAodm9pZCAqKSBtc2ctPmhlYWQ7CisJc3RydWN0IG5sYXR0ciAqbmxhOworCisJbmxhID0gbmxtc2dfZmluZF9hdHRyKG5saCwgc2l6ZW9mKHN0cnVjdCBnZW5sbXNnaGRyKSwKKwkJCSAgICAgIFdJTUFYX0dOTF9NU0dfREFUQSk7CisJaWYgKG5sYSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ2Fubm90IGZpbmQgYXR0cmlidXRlIFdJTUFYX0dOTF9NU0dfREFUQVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gbmxhX2xlbihubGEpOworfQorRVhQT1JUX1NZTUJPTF9HUEwod2ltYXhfbXNnX2xlbik7CisKKworLyoqCisgKiB3aW1heF9tc2dfc2VuZCAtIFNlbmQgYSBwcmUtYWxsb2NhdGVkIG1lc3NhZ2UgdG8gdXNlciBzcGFjZQorICoKKyAqIEB3aW1heF9kZXY6IFdpTUFYIGRldmljZSBkZXNjcmlwdG9yCisgKgorICogQHNrYjogJnN0cnVjdCBza19idWZmIHJldHVybmVkIGJ5IHdpbWF4X21zZ19hbGxvYygpLiBOb3RlIHRoZQorICogICAgIG93bmVyc2hpcCBvZiBAc2tiIGlzIHRyYW5zZmVycmVkIHRvIHRoaXMgZnVuY3Rpb24uCisgKgorICogUmV0dXJuczogMCBpZiBvaywgPCAwIGVycm5vIGNvZGUgb24gZXJyb3IKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBTZW5kcyBhIGZyZWUtZm9ybSBtZXNzYWdlIHRoYXQgd2FzIHByZWFsbG9jYXRlZCB3aXRoCisgKiB3aW1heF9tc2dfYWxsb2MoKSBhbmQgZmlsbGVkIHVwLgorICoKKyAqIEFzc3VtZXMgdGhhdCBvbmNlIHlvdSBwYXNzIGFuIHNrYiB0byB0aGlzIGZ1bmN0aW9uIGZvciBzZW5kaW5nLCBpdAorICogb3ducyBpdCBhbmQgd2lsbCByZWxlYXNlIGl0IHdoZW4gZG9uZSAob24gc3VjY2VzcykuCisgKgorICogSU1QT1JUQU5UOgorICoKKyAqIERvbid0IHVzZSBza2JfcHVzaCgpL3NrYl9wdWxsKCkvc2tiX3Jlc2VydmUoKSBvbiB0aGUgc2tiLCBhcworICogd2ltYXhfbXNnX3NlbmQoKSBkZXBlbmRzIG9uIHNrYi0+ZGF0YSBiZWluZyBwbGFjZWQgYXQgdGhlCisgKiBiZWdpbm5pbmcgb2YgdGhlIHVzZXIgbWVzc2FnZS4KKyAqLworaW50IHdpbWF4X21zZ19zZW5kKHN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2Rldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHdpbWF4X2Rldi0+bmV0X2Rldi0+ZGV2LnBhcmVudDsKKwl2b2lkICptc2cgPSBza2ItPmRhdGE7CisJc2l6ZV90IHNpemUgPSBza2ItPmxlbjsKKwltaWdodF9zbGVlcCgpOworCisJZF9wcmludGYoMSwgZGV2LCAiQ1RYOiB3aW1heCBtc2csICV6dSBieXRlc1xuIiwgc2l6ZSk7CisJZF9kdW1wKDIsIGRldiwgbXNnLCBzaXplKTsKKwlyZXN1bHQgPSBnZW5sbXNnX211bHRpY2FzdChza2IsIDAsIHdpbWF4X2dubF9tY2cuaWQsIEdGUF9LRVJORUwpOworCWRfcHJpbnRmKDEsIGRldiwgIkNUWDogZ2VubCBtdWx0aWNhc3QgcmVzdWx0ICVkXG4iLCByZXN1bHQpOworCWlmIChyZXN1bHQgPT0gLUVTUkNIKQkvKiBOb2JvZHkgY29ubmVjdGVkLCBpZ25vcmUgaXQgKi8KKwkJcmVzdWx0ID0gMDsJLyogYnR3LCB0aGUgc2tiIGlzIGZyZWVkIGFscmVhZHkgKi8KKwlyZXR1cm4gcmVzdWx0OworfQorRVhQT1JUX1NZTUJPTF9HUEwod2ltYXhfbXNnX3NlbmQpOworCisKKy8qKgorICogd2ltYXhfbXNnIC0gU2VuZCBhIG1lc3NhZ2UgdG8gdXNlciBzcGFjZQorICoKKyAqIEB3aW1heF9kZXY6IFdpTUFYIGRldmljZSBkZXNjcmlwdG9yIChwcm9wZXJseSByZWZlcmVuY2VkKQorICogQHBpcGVfbmFtZTogIm5hbWVkIHBpcGUiIHRoZSBtZXNzYWdlIHdpbGwgYmUgc2VudCB0bworICogQGJ1ZjogcG9pbnRlciB0byB0aGUgbWVzc2FnZSB0byBzZW5kLgorICogQHNpemU6IHNpemUgb2YgdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IEBidWYgKGluIGJ5dGVzKS4KKyAqIEBnZnBfZmxhZ3M6IGZsYWdzIGZvciBtZW1vcnkgYWxsb2NhdGlvbi4KKyAqCisgKiBSZXR1cm5zOiAlMCBpZiBvaywgbmVnYXRpdmUgZXJybm8gY29kZSBvbiBlcnJvci4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBTZW5kcyBhIGZyZWUtZm9ybSBtZXNzYWdlIHRvIHVzZXIgc3BhY2Ugb24gdGhlIGRldmljZSBAd2ltYXhfZGV2LgorICoKKyAqIE5PVEVTOgorICoKKyAqIE9uY2UgdGhlIEBza2IgaXMgZ2l2ZW4gdG8gdGhpcyBmdW5jdGlvbiwgd2hvIHdpbGwgb3duIGl0IGFuZCB3aWxsCisgKiByZWxlYXNlIGl0IHdoZW4gZG9uZSAodW5sZXNzIGl0IHJldHVybnMgZXJyb3IpLgorICovCitpbnQgd2ltYXhfbXNnKHN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldiwgY29uc3QgY2hhciAqcGlwZV9uYW1lLAorCSAgICAgIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUsIGdmcF90IGdmcF9mbGFncykKK3sKKwlpbnQgcmVzdWx0ID0gLUVOT01FTTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJc2tiID0gd2ltYXhfbXNnX2FsbG9jKHdpbWF4X2RldiwgcGlwZV9uYW1lLCBidWYsIHNpemUsIGdmcF9mbGFncyk7CisJaWYgKHNrYiA9PSBOVUxMKQorCQlnb3RvIGVycm9yX21zZ19uZXc7CisJcmVzdWx0ID0gd2ltYXhfbXNnX3NlbmQod2ltYXhfZGV2LCBza2IpOworZXJyb3JfbXNnX25ldzoKKwlyZXR1cm4gcmVzdWx0OworfQorRVhQT1JUX1NZTUJPTF9HUEwod2ltYXhfbXNnKTsKKworCitzdGF0aWMgY29uc3QKK3N0cnVjdCBubGFfcG9saWN5IHdpbWF4X2dubF9tc2dfcG9saWN5W1dJTUFYX0dOTF9BVFRSX01BWCArIDFdID0geworCVtXSU1BWF9HTkxfTVNHX0lGSURYXSA9IHsKKwkJLnR5cGUgPSBOTEFfVTMyLAorCX0sCisJW1dJTUFYX0dOTF9NU0dfREFUQV0gPSB7CisJCS50eXBlID0gTkxBX1VOU1BFQywJLyogbGlibmwgZG9lc24ndCBncm9rIEJJTkFSWSB5ZXQgKi8KKwl9LAorfTsKKworCisvKgorICogUmVsYXlzIGEgbWVzc2FnZSBmcm9tIHVzZXIgc3BhY2UgdG8gdGhlIGRyaXZlcgorICoKKyAqIFRoZSBza2IgaXMgcGFzc2VkIHRvIHRoZSBkcml2ZXItc3BlY2lmaWMgZnVuY3Rpb24gd2l0aCB0aGUgbmV0bGluaworICogYW5kIGdlbmVyaWMgbmV0bGluayBoZWFkZXJzIGFscmVhZHkgc3RyaXBwZWQuCisgKgorICogVGhpcyBjYWxsIHdpbGwgYmxvY2sgd2hpbGUgaGFuZGxpbmcvcmVsYXlpbmcgdGhlIG1lc3NhZ2UuCisgKi8KK3N0YXRpYworaW50IHdpbWF4X2dubF9kb2l0X21zZ19mcm9tX3VzZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKK3sKKwlpbnQgcmVzdWx0LCBpZmluZGV4OworCXN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IG5sbXNnaGRyICpubGggPSBpbmZvLT5ubGhkcjsKKwljaGFyICpwaXBlX25hbWU7CisJdm9pZCAqbXNnX2J1ZjsKKwlzaXplX3QgbXNnX2xlbjsKKworCW1pZ2h0X3NsZWVwKCk7CisJZF9mbnN0YXJ0KDMsIE5VTEwsICIoc2tiICVwIGluZm8gJXApXG4iLCBza2IsIGluZm8pOworCXJlc3VsdCA9IC1FTk9ERVY7CisJaWYgKGluZm8tPmF0dHJzW1dJTUFYX0dOTF9NU0dfSUZJRFhdID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJXSU1BWF9HTkxfTVNHX0ZST01fVVNFUjogY2FuJ3QgZmluZCBJRklEWCAiCisJCSAgICAgICAiYXR0cmlidXRlXG4iKTsKKwkJZ290byBlcnJvcl9ub193aW1heF9kZXY7CisJfQorCWlmaW5kZXggPSBubGFfZ2V0X3UzMihpbmZvLT5hdHRyc1tXSU1BWF9HTkxfTVNHX0lGSURYXSk7CisJd2ltYXhfZGV2ID0gd2ltYXhfZGV2X2dldF9ieV9nZW5sX2luZm8oaW5mbywgaWZpbmRleCk7CisJaWYgKHdpbWF4X2RldiA9PSBOVUxMKQorCQlnb3RvIGVycm9yX25vX3dpbWF4X2RldjsKKwlkZXYgPSB3aW1heF9kZXZfdG9fZGV2KHdpbWF4X2Rldik7CisKKwkvKiBVbnBhY2sgYXJndW1lbnRzICovCisJcmVzdWx0ID0gLUVJTlZBTDsKKwlpZiAoaW5mby0+YXR0cnNbV0lNQVhfR05MX01TR19EQVRBXSA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAiV0lNQVhfR05MX01TR19GUk9NX1VTRVI6IGNhbid0IGZpbmQgTVNHX0RBVEEgIgorCQkJImF0dHJpYnV0ZVxuIik7CisJCWdvdG8gZXJyb3Jfbm9fZGF0YTsKKwl9CisJbXNnX2J1ZiA9IG5sYV9kYXRhKGluZm8tPmF0dHJzW1dJTUFYX0dOTF9NU0dfREFUQV0pOworCW1zZ19sZW4gPSBubGFfbGVuKGluZm8tPmF0dHJzW1dJTUFYX0dOTF9NU0dfREFUQV0pOworCisJaWYgKGluZm8tPmF0dHJzW1dJTUFYX0dOTF9NU0dfUElQRV9OQU1FXSA9PSBOVUxMKQorCQlwaXBlX25hbWUgPSBOVUxMOworCWVsc2UgeworCQlzdHJ1Y3QgbmxhdHRyICphdHRyID0gaW5mby0+YXR0cnNbV0lNQVhfR05MX01TR19QSVBFX05BTUVdOworCQlzaXplX3QgYXR0cl9sZW4gPSBubGFfbGVuKGF0dHIpOworCQkvKiBsaWJubC0xLjEgZG9lcyBub3QgeWV0IHN1cHBvcnQgTkxBX05VTF9TVFJJTkcgKi8KKwkJcmVzdWx0ID0gLUVOT01FTTsKKwkJcGlwZV9uYW1lID0ga3N0cm5kdXAobmxhX2RhdGEoYXR0ciksIGF0dHJfbGVuICsgMSwgR0ZQX0tFUk5FTCk7CisJCWlmIChwaXBlX25hbWUgPT0gTlVMTCkKKwkJCWdvdG8gZXJyb3JfYWxsb2M7CisJCXBpcGVfbmFtZVthdHRyX2xlbl0gPSAwOworCX0KKwltdXRleF9sb2NrKCZ3aW1heF9kZXYtPm11dGV4KTsKKwlyZXN1bHQgPSB3aW1heF9kZXZfaXNfcmVhZHkod2ltYXhfZGV2KTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBlcnJvcl9ub3RfcmVhZHk7CisJcmVzdWx0ID0gLUVOT1NZUzsKKwlpZiAod2ltYXhfZGV2LT5vcF9tc2dfZnJvbV91c2VyID09IE5VTEwpCisJCWdvdG8gZXJyb3Jfbm9vcDsKKworCWRfcHJpbnRmKDEsIGRldiwKKwkJICJDUlg6IG5sbXNnaGRyIGxlbiAldSB0eXBlICV1IGZsYWdzIDB4JTA0eCBzZXEgMHgleCBwaWQgJXVcbiIsCisJCSBubGgtPm5sbXNnX2xlbiwgbmxoLT5ubG1zZ190eXBlLCBubGgtPm5sbXNnX2ZsYWdzLAorCQkgbmxoLT5ubG1zZ19zZXEsIG5saC0+bmxtc2dfcGlkKTsKKwlkX3ByaW50ZigxLCBkZXYsICJDUlg6IHdpbWF4IG1lc3NhZ2UgJXp1IGJ5dGVzXG4iLCBtc2dfbGVuKTsKKwlkX2R1bXAoMiwgZGV2LCBtc2dfYnVmLCBtc2dfbGVuKTsKKworCXJlc3VsdCA9IHdpbWF4X2Rldi0+b3BfbXNnX2Zyb21fdXNlcih3aW1heF9kZXYsIHBpcGVfbmFtZSwKKwkJCQkJICAgICBtc2dfYnVmLCBtc2dfbGVuLCBpbmZvKTsKK2Vycm9yX25vb3A6CitlcnJvcl9ub3RfcmVhZHk6CisJbXV0ZXhfdW5sb2NrKCZ3aW1heF9kZXYtPm11dGV4KTsKK2Vycm9yX2FsbG9jOgorCWtmcmVlKHBpcGVfbmFtZSk7CitlcnJvcl9ub19kYXRhOgorCWRldl9wdXQod2ltYXhfZGV2LT5uZXRfZGV2KTsKK2Vycm9yX25vX3dpbWF4X2RldjoKKwlkX2ZuZW5kKDMsIE5VTEwsICIoc2tiICVwIGluZm8gJXApID0gJWRcbiIsIHNrYiwgaW5mbywgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKiBHZW5lcmljIE5ldGxpbmsgZ2x1ZQorICovCisKK3N0cnVjdCBnZW5sX29wcyB3aW1heF9nbmxfbXNnX2Zyb21fdXNlciA9IHsKKwkuY21kID0gV0lNQVhfR05MX09QX01TR19GUk9NX1VTRVIsCisJLmZsYWdzID0gR0VOTF9BRE1JTl9QRVJNLAorCS5wb2xpY3kgPSB3aW1heF9nbmxfbXNnX3BvbGljeSwKKwkuZG9pdCA9IHdpbWF4X2dubF9kb2l0X21zZ19mcm9tX3VzZXIsCisJLmR1bXBpdCA9IE5VTEwsCit9OworCmRpZmYgLS1naXQgYS9uZXQvd2ltYXgvb3AtcmVzZXQuYyBiL25ldC93aW1heC9vcC1yZXNldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMjY5MTcKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvd2ltYXgvb3AtcmVzZXQuYwpAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIExpbnV4IFdpTUFYCisgKiBJbXBsZW1lbnQgYW5kIGV4cG9ydCBhIG1ldGhvZCBmb3IgcmVzZXR0aW5nIGEgV2lNQVggZGV2aWNlCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKgorICoKKyAqIFRoaXMgaW1wbGVtZW50cyBhIHNpbXBsZSBzeW5jaHJvbm91cyBjYWxsIHRvIHJlc2V0IGEgV2lNQVggZGV2aWNlLgorICoKKyAqIFJlc2V0cyBhaW0gYXQgYmVpbmcgd2FybSwga2VlcGluZyB0aGUgZGV2aWNlIGhhbmRsZXMgYWN0aXZlOworICogaG93ZXZlciwgd2hlbiB0aGF0IGZhaWxzLCBpdCBmYWxscyBiYWNrIHRvIGEgY29sZCByZXNldCAodGhhdCB3aWxsCisgKiBkaXNjb25uZWN0IGFuZCByZWNvbm5lY3QgdGhlIGRldmljZSkuCisgKi8KKworI2luY2x1ZGUgPG5ldC93aW1heC5oPgorI2luY2x1ZGUgPG5ldC9nZW5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC93aW1heC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CisjaW5jbHVkZSAid2ltYXgtaW50ZXJuYWwuaCIKKworI2RlZmluZSBEX1NVQk1PRFVMRSBvcF9yZXNldAorI2luY2x1ZGUgImRlYnVnLWxldmVscy5oIgorCisKKy8qKgorICogd2ltYXhfcmVzZXQgLSBSZXNldCBhIFdpTUFYIGRldmljZQorICoKKyAqIEB3aW1heF9kZXY6IFdpTUFYIGRldmljZSBkZXNjcmlwdG9yCisgKgorICogUmV0dXJuczoKKyAqCisgKiAlMCBpZiBvayBhbmQgYSB3YXJtIHJlc2V0IHdhcyBkb25lICh0aGUgZGV2aWNlIHN0aWxsIGV4aXN0cyBpbgorICogdGhlIHN5c3RlbSkuCisgKgorICogLSVFTk9ERVYgaWYgYSBjb2xkL2J1cyByZXNldCBoYWQgdG8gYmUgZG9uZSAoZGV2aWNlIGhhcworICogZGlzY29ubmVjdGVkIGFuZCByZWNvbm5lY3RlZCwgc28gY3VycmVudCBoYW5kbGUgaXMgbm90IHZhbGlkCisgKiBhbnkgbW9yZSkuCisgKgorICogLSVFSU5WQUwgaWYgdGhlIGRldmljZSBpcyBub3QgZXZlbiByZWdpc3RlcmVkLgorICoKKyAqIEFueSBvdGhlciBuZWdhdGl2ZSBlcnJvciBjb2RlIHNoYWxsIGJlIGNvbnNpZGVyZWQgYXMKKyAqIG5vbi1yZWNvdmVyYWJsZS4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBDYWxsZWQgd2hlbiB3YW50aW5nIHRvIHJlc2V0IHRoZSBkZXZpY2UgZm9yIGFueSByZWFzb24uIERldmljZSBpcworICogdGFrZW4gYmFjayB0byBwb3dlciBvbiBzdGF0dXMuCisgKgorICogVGhpcyBjYWxsIGJsb2Nrczsgb24gc3VjY2VzZnVsIHJldHVybiwgdGhlIGRldmljZSBoYXMgY29tcGxldGVkIHRoZQorICogcmVzZXQgcHJvY2VzcyBhbmQgaXMgcmVhZHkgdG8gb3BlcmF0ZS4KKyAqLworaW50IHdpbWF4X3Jlc2V0KHN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldikKK3sKKwlpbnQgcmVzdWx0ID0gLUVJTlZBTDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB3aW1heF9kZXZfdG9fZGV2KHdpbWF4X2Rldik7CisJZW51bSB3aW1heF9zdCBzdGF0ZTsKKworCW1pZ2h0X3NsZWVwKCk7CisJZF9mbnN0YXJ0KDMsIGRldiwgIih3aW1heF9kZXYgJXApXG4iLCB3aW1heF9kZXYpOworCW11dGV4X2xvY2soJndpbWF4X2Rldi0+bXV0ZXgpOworCWRldl9ob2xkKHdpbWF4X2Rldi0+bmV0X2Rldik7CisJc3RhdGUgPSB3aW1heF9kZXYtPnN0YXRlOworCW11dGV4X3VubG9jaygmd2ltYXhfZGV2LT5tdXRleCk7CisKKwlpZiAoc3RhdGUgPj0gV0lNQVhfU1RfRE9XTikgeworCQltdXRleF9sb2NrKCZ3aW1heF9kZXYtPm11dGV4X3Jlc2V0KTsKKwkJcmVzdWx0ID0gd2ltYXhfZGV2LT5vcF9yZXNldCh3aW1heF9kZXYpOworCQltdXRleF91bmxvY2soJndpbWF4X2Rldi0+bXV0ZXhfcmVzZXQpOworCX0KKwlkZXZfcHV0KHdpbWF4X2Rldi0+bmV0X2Rldik7CisKKwlkX2ZuZW5kKDMsIGRldiwgIih3aW1heF9kZXYgJXApID0gJWRcbiIsIHdpbWF4X2RldiwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorRVhQT1JUX1NZTUJPTCh3aW1heF9yZXNldCk7CisKKworc3RhdGljIGNvbnN0CitzdHJ1Y3QgbmxhX3BvbGljeSB3aW1heF9nbmxfcmVzZXRfcG9saWN5W1dJTUFYX0dOTF9BVFRSX01BWCArIDFdID0geworCVtXSU1BWF9HTkxfUkVTRVRfSUZJRFhdID0geworCQkudHlwZSA9IE5MQV9VMzIsCisJfSwKK307CisKKworLyoKKyAqIEV4cG9ydGluZyB0byB1c2VyIHNwYWNlIG92ZXIgZ2VuZXJpYyBuZXRsaW5rCisgKgorICogUGFyc2UgdGhlIHJlc2V0IGNvbW1hbmQgZnJvbSB1c2VyIHNwYWNlLCByZXR1cm4gZXJyb3IgY29kZS4KKyAqCisgKiBObyBhdHRyaWJ1dGVzLgorICovCitzdGF0aWMKK2ludCB3aW1heF9nbmxfZG9pdF9yZXNldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQoreworCWludCByZXN1bHQsIGlmaW5kZXg7CisJc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldjsKKworCWRfZm5zdGFydCgzLCBOVUxMLCAiKHNrYiAlcCBpbmZvICVwKVxuIiwgc2tiLCBpbmZvKTsKKwlyZXN1bHQgPSAtRU5PREVWOworCWlmIChpbmZvLT5hdHRyc1tXSU1BWF9HTkxfUkVTRVRfSUZJRFhdID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJXSU1BWF9HTkxfT1BfUkZLSUxMOiBjYW4ndCBmaW5kIElGSURYICIKKwkJCSJhdHRyaWJ1dGVcbiIpOworCQlnb3RvIGVycm9yX25vX3dpbWF4X2RldjsKKwl9CisJaWZpbmRleCA9IG5sYV9nZXRfdTMyKGluZm8tPmF0dHJzW1dJTUFYX0dOTF9SRVNFVF9JRklEWF0pOworCXdpbWF4X2RldiA9IHdpbWF4X2Rldl9nZXRfYnlfZ2VubF9pbmZvKGluZm8sIGlmaW5kZXgpOworCWlmICh3aW1heF9kZXYgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9ub193aW1heF9kZXY7CisJZGV2ID0gd2ltYXhfZGV2X3RvX2Rldih3aW1heF9kZXYpOworCS8qIEV4ZWN1dGUgdGhlIG9wZXJhdGlvbiBhbmQgc2VuZCB0aGUgcmVzdWx0IGJhY2sgdG8gdXNlciBzcGFjZSAqLworCXJlc3VsdCA9IHdpbWF4X3Jlc2V0KHdpbWF4X2Rldik7CisJZGV2X3B1dCh3aW1heF9kZXYtPm5ldF9kZXYpOworZXJyb3Jfbm9fd2ltYXhfZGV2OgorCWRfZm5lbmQoMywgTlVMTCwgIihza2IgJXAgaW5mbyAlcCkgPSAlZFxuIiwgc2tiLCBpbmZvLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKworc3RydWN0IGdlbmxfb3BzIHdpbWF4X2dubF9yZXNldCA9IHsKKwkuY21kID0gV0lNQVhfR05MX09QX1JFU0VULAorCS5mbGFncyA9IEdFTkxfQURNSU5fUEVSTSwKKwkucG9saWN5ID0gd2ltYXhfZ25sX3Jlc2V0X3BvbGljeSwKKwkuZG9pdCA9IHdpbWF4X2dubF9kb2l0X3Jlc2V0LAorCS5kdW1waXQgPSBOVUxMLAorfTsKZGlmZiAtLWdpdCBhL25ldC93aW1heC9vcC1yZmtpbGwuYyBiL25ldC93aW1heC9vcC1yZmtpbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjc1YWVlCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3dpbWF4L29wLXJma2lsbC5jCkBAIC0wLDAgKzEsNTMyIEBACisvKgorICogTGludXggV2lNQVgKKyAqIFJGLWtpbGwgZnJhbWV3b3JrIGludGVncmF0aW9uCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKgorICoKKyAqIFRoaXMgaW50ZWdyYXRlcyBpbnRvIHRoZSBMaW51eCBLZXJuZWwgcmZraWxsIHN1c2J5c3RlbSBzbyB0aGF0IHRoZQorICogZHJpdmVycyBqdXN0IGhhdmUgdG8gZG8gdGhlIGJhcmUgbWluaW1hbCB3b3JrLCB3aGljaCBpcyBwcm92aWRpbmcgYQorICogbWV0aG9kIHRvIHNldCB0aGUgc29mdHdhcmUgUkYtS2lsbCBzd2l0Y2ggYW5kIHRvIHJlcG9ydCBjaGFuZ2VzIGluCisgKiB0aGUgc29mdHdhcmUgYW5kIGhhcmR3YXJlIHN3aXRjaCBzdGF0dXMuCisgKgorICogQSBub24tcG9sbGVkIGdlbmVyaWMgcmZraWxsIGRldmljZSBpcyBlbWJlZGRlZCBpbnRvIHRoZSBXaU1BWAorICogc3Vic3lzdGVtJ3MgcmVwcmVzZW50YXRpb24gb2YgYSBkZXZpY2UuCisgKgorICogRklYTUU6IE5lZWQgcG9sbGVkIHN1cHBvcnQ/IHVzZSBhIHRpbWVyIG9yIGFkZCB0aGUgaW1wbGVtZW50YXRpb24KKyAqICAgICB0byB0aGUgc3RhY2suCisgKgorICogQWxsIGRldmljZSBkcml2ZXJzIGhhdmUgdG8gZG8gaXMgYWZ0ZXIgd2ltYXhfZGV2X2luaXQoKSwgY2FsbAorICogd2ltYXhfcmVwb3J0X3Jma2lsbF9odygpIGFuZCB3aW1heF9yZXBvcnRfcmZraWxsX3N3KCkgdG8gdXBkYXRlCisgKiBpbml0aWFsIHN0YXRlIGFuZCB0aGVuIGV2ZXJ5IHRpbWUgaXQgY2hhbmdlcy4gU2VlIHdpbWF4Lmg6c3RydWN0CisgKiB3aW1heF9kZXYgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKgorICogUk9BRE1BUAorICoKKyAqIHdpbWF4X2dubF9kb2l0X3Jma2lsbCgpICAgICAgVXNlciBzcGFjZSBjYWxsaW5nIHdpbWF4X3Jma2lsbCgpCisgKiAgIHdpbWF4X3Jma2lsbCgpICAgICAgICAgICAgIEtlcm5lbCBjYWxsaW5nIHdpbWF4X3Jma2lsbCgpCisgKiAgICAgX193aW1heF9yZl90b2dnbGVfcmFkaW8oKQorICoKKyAqIHdpbWF4X3Jma2lsbF90b2dnbGVfcmFkaW8oKSAgUkYtS2lsbCBzdWJzeXRlbSBjYWxsaW5nCisgKiAgIF9fd2ltYXhfcmZfdG9nZ2xlX3JhZGlvKCkKKyAqCisgKiBfX3dpbWF4X3JmX3RvZ2dsZV9yYWRpbygpCisgKiAgIHdpbWF4X2Rldi0+b3BfcmZraWxsX3N3X3RvZ2dsZSgpIERyaXZlciBiYWNrZW5kCisgKiAgIF9fd2ltYXhfc3RhdGVfY2hhbmdlKCkKKyAqCisgKiB3aW1heF9yZXBvcnRfcmZraWxsX3N3KCkgICAgIERyaXZlciByZXBvcnRzIHN0YXRlIGNoYW5nZQorICogICBfX3dpbWF4X3N0YXRlX2NoYW5nZSgpCisgKgorICogd2ltYXhfcmVwb3J0X3Jma2lsbF9odygpICAgICBEcml2ZXIgcmVwb3J0cyBzdGF0ZSBjaGFuZ2UKKyAqICAgX193aW1heF9zdGF0ZV9jaGFuZ2UoKQorICoKKyAqIHdpbWF4X3Jma2lsbF9hZGQoKSAgICAgICAgICAgSW5pdGlhbGl6ZS9zaHV0ZG93biByZmtpbGwgc3VwcG9ydAorICogd2ltYXhfcmZraWxsX3JtKCkgICAgICAgICAgICBbY2FsbGVkIGJ5IHdpbWF4X2Rldl9hZGQvcm0oKV0KKyAqLworCisjaW5jbHVkZSA8bmV0L3dpbWF4Lmg+CisjaW5jbHVkZSA8bmV0L2dlbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3dpbWF4Lmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9yZmtpbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgIndpbWF4LWludGVybmFsLmgiCisKKyNkZWZpbmUgRF9TVUJNT0RVTEUgb3BfcmZraWxsCisjaW5jbHVkZSAiZGVidWctbGV2ZWxzLmgiCisKKyNpZiBkZWZpbmVkKENPTkZJR19SRktJTEwpIHx8IGRlZmluZWQoQ09ORklHX1JGS0lMTF9NT0RVTEUpCisKKworLyoqCisgKiB3aW1heF9yZXBvcnRfcmZraWxsX2h3IC0gUmVwb3J0cyBjaGFuZ2VzIGluIHRoZSBoYXJkd2FyZSBSRiBzd2l0Y2gKKyAqCisgKiBAd2ltYXhfZGV2OiBXaU1BWCBkZXZpY2UgZGVzY3JpcHRvcgorICoKKyAqIEBzdGF0ZTogTmV3IHN0YXRlIG9mIHRoZSBSRiBLaWxsIHN3aXRjaC4gJVdJTUFYX1JGX09OIHJhZGlvIG9uLAorICogICAgICVXSU1BWF9SRl9PRkYgcmFkaW8gb2ZmLgorICoKKyAqIFdoZW4gdGhlIGRldmljZSBkZXRlY3RzIGEgY2hhbmdlIGluIHRoZSBzdGF0ZSBvZiB0aGVoYXJkd2FyZSBSRgorICogc3dpdGNoLCBpdCBtdXN0IGNhbGwgdGhpcyBmdW5jdGlvbiB0byBsZXQgdGhlIFdpTUFYIGtlcm5lbCBzdGFjaworICoga25vdyB0aGF0IHRoZSBzdGF0ZSBoYXMgY2hhbmdlZCBzbyBpdCBjYW4gYmUgcHJvcGVybHkgcHJvcGFnYXRlZC4KKyAqCisgKiBUaGUgV2lNQVggc3RhY2sgY2FjaGVzIHRoZSBzdGF0ZSAodGhlIGRyaXZlciBkb2Vzbid0IG5lZWQgdG8pLiBBcworICogd2VsbCwgYXMgdGhlIGNoYW5nZSBpcyBwcm9wYWdhdGVkIGl0IHdpbGwgY29tZSBiYWNrIGFzIGEgcmVxdWVzdCB0bworICogY2hhbmdlIHRoZSBzb2Z0d2FyZSBzdGF0ZSB0byBtaXJyb3IgdGhlIGhhcmR3YXJlIHN0YXRlLgorICoKKyAqIElmIHRoZSBkZXZpY2UgZG9lc24ndCBoYXZlIGEgaGFyZHdhcmUga2lsbCBzd2l0Y2gsIGp1c3QgcmVwb3J0CisgKiBpdCBvbiBpbml0aWFsaXphdGlvbiBhcyBhbHdheXMgb24gKCVXSU1BWF9SRl9PTiwgcmFkaW8gb24pLgorICovCit2b2lkIHdpbWF4X3JlcG9ydF9yZmtpbGxfaHcoc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2LAorCQkJICAgIGVudW0gd2ltYXhfcmZfc3RhdGUgc3RhdGUpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB3aW1heF9kZXZfdG9fZGV2KHdpbWF4X2Rldik7CisJZW51bSB3aW1heF9zdCB3aW1heF9zdGF0ZTsKKwllbnVtIHJma2lsbF9zdGF0ZSByZmtpbGxfc3RhdGU7CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKHdpbWF4X2RldiAlcCBzdGF0ZSAldSlcbiIsIHdpbWF4X2Rldiwgc3RhdGUpOworCUJVR19PTihzdGF0ZSA9PSBXSU1BWF9SRl9RVUVSWSk7CisJQlVHX09OKHN0YXRlICE9IFdJTUFYX1JGX09OICYmIHN0YXRlICE9IFdJTUFYX1JGX09GRik7CisKKwltdXRleF9sb2NrKCZ3aW1heF9kZXYtPm11dGV4KTsKKwlyZXN1bHQgPSB3aW1heF9kZXZfaXNfcmVhZHkod2ltYXhfZGV2KTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBlcnJvcl9ub3RfcmVhZHk7CisKKwlpZiAoc3RhdGUgIT0gd2ltYXhfZGV2LT5yZl9odykgeworCQl3aW1heF9kZXYtPnJmX2h3ID0gc3RhdGU7CisJCXJma2lsbF9zdGF0ZSA9IHN0YXRlID09IFdJTUFYX1JGX09OID8KKwkJCVJGS0lMTF9TVEFURV9PRkYgOiBSRktJTExfU1RBVEVfT047CisJCWlmICh3aW1heF9kZXYtPnJmX2h3ID09IFdJTUFYX1JGX09OCisJCSAgICAmJiB3aW1heF9kZXYtPnJmX3N3ID09IFdJTUFYX1JGX09OKQorCQkJd2ltYXhfc3RhdGUgPSBXSU1BWF9TVF9SRUFEWTsKKwkJZWxzZQorCQkJd2ltYXhfc3RhdGUgPSBXSU1BWF9TVF9SQURJT19PRkY7CisJCV9fd2ltYXhfc3RhdGVfY2hhbmdlKHdpbWF4X2Rldiwgd2ltYXhfc3RhdGUpOworCQlpbnB1dF9yZXBvcnRfa2V5KHdpbWF4X2Rldi0+cmZraWxsX2lucHV0LCBLRVlfV0lNQVgsCisJCQkJIHJma2lsbF9zdGF0ZSk7CisJfQorZXJyb3Jfbm90X3JlYWR5OgorCW11dGV4X3VubG9jaygmd2ltYXhfZGV2LT5tdXRleCk7CisJZF9mbmVuZCgzLCBkZXYsICIod2ltYXhfZGV2ICVwIHN0YXRlICV1KSA9IHZvaWQgWyVkXVxuIiwKKwkJd2ltYXhfZGV2LCBzdGF0ZSwgcmVzdWx0KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdpbWF4X3JlcG9ydF9yZmtpbGxfaHcpOworCisKKy8qKgorICogd2ltYXhfcmVwb3J0X3Jma2lsbF9zdyAtIFJlcG9ydHMgY2hhbmdlcyBpbiB0aGUgc29mdHdhcmUgUkYgc3dpdGNoCisgKgorICogQHdpbWF4X2RldjogV2lNQVggZGV2aWNlIGRlc2NyaXB0b3IKKyAqCisgKiBAc3RhdGU6IE5ldyBzdGF0ZSBvZiB0aGUgUkYga2lsbCBzd2l0Y2guICVXSU1BWF9SRl9PTiByYWRpbyBvbiwKKyAqICAgICAlV0lNQVhfUkZfT0ZGIHJhZGlvIG9mZi4KKyAqCisgKiBSZXBvcnRzIGNoYW5nZXMgaW4gdGhlIHNvZnR3YXJlIFJGIHN3aXRjaCBzdGF0ZSB0byB0aGUgdGhlIFdpTUFYCisgKiBzdGFjay4KKyAqCisgKiBUaGUgbWFpbiB1c2UgaXMgZHVyaW5nIGluaXRpYWxpemF0aW9uLCBzbyB0aGUgZHJpdmVyIGNhbiBxdWVyeSB0aGUKKyAqIGRldmljZSBmb3IgaXRzIGN1cnJlbnQgc29mdHdhcmUgcmFkaW8ga2lsbCBzd2l0Y2ggc3RhdGUgYW5kIGZlZWQgaXQKKyAqIHRvIHRoZSBzeXN0ZW0uCisgKgorICogT24gdGhlIHNpZGUsIHRoZSBkZXZpY2UgZG9lcyBub3QgY2hhbmdlIHRoZSBzb2Z0d2FyZSBzdGF0ZSBieQorICogaXRzZWxmLiBJbiBwcmFjdGljZSwgdGhpcyBjYW4gaGFwcGVuLCBhcyB0aGUgZGV2aWNlIG1pZ2h0IGRlY2lkZSB0bworICogc3dpdGNoIChpbiBzb2Z0d2FyZSkgdGhlIHJhZGlvIG9mZiBmb3IgZGlmZmVyZW50IHJlYXNvbnMuCisgKi8KK3ZvaWQgd2ltYXhfcmVwb3J0X3Jma2lsbF9zdyhzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYsCisJCQkgICAgZW51bSB3aW1heF9yZl9zdGF0ZSBzdGF0ZSkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHdpbWF4X2Rldl90b19kZXYod2ltYXhfZGV2KTsKKwllbnVtIHdpbWF4X3N0IHdpbWF4X3N0YXRlOworCisJZF9mbnN0YXJ0KDMsIGRldiwgIih3aW1heF9kZXYgJXAgc3RhdGUgJXUpXG4iLCB3aW1heF9kZXYsIHN0YXRlKTsKKwlCVUdfT04oc3RhdGUgPT0gV0lNQVhfUkZfUVVFUlkpOworCUJVR19PTihzdGF0ZSAhPSBXSU1BWF9SRl9PTiAmJiBzdGF0ZSAhPSBXSU1BWF9SRl9PRkYpOworCisJbXV0ZXhfbG9jaygmd2ltYXhfZGV2LT5tdXRleCk7CisJcmVzdWx0ID0gd2ltYXhfZGV2X2lzX3JlYWR5KHdpbWF4X2Rldik7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gZXJyb3Jfbm90X3JlYWR5OworCisJaWYgKHN0YXRlICE9IHdpbWF4X2Rldi0+cmZfc3cpIHsKKwkJd2ltYXhfZGV2LT5yZl9zdyA9IHN0YXRlOworCQlpZiAod2ltYXhfZGV2LT5yZl9odyA9PSBXSU1BWF9SRl9PTgorCQkgICAgJiYgd2ltYXhfZGV2LT5yZl9zdyA9PSBXSU1BWF9SRl9PTikKKwkJCXdpbWF4X3N0YXRlID0gV0lNQVhfU1RfUkVBRFk7CisJCWVsc2UKKwkJCXdpbWF4X3N0YXRlID0gV0lNQVhfU1RfUkFESU9fT0ZGOworCQlfX3dpbWF4X3N0YXRlX2NoYW5nZSh3aW1heF9kZXYsIHdpbWF4X3N0YXRlKTsKKwl9CitlcnJvcl9ub3RfcmVhZHk6CisJbXV0ZXhfdW5sb2NrKCZ3aW1heF9kZXYtPm11dGV4KTsKKwlkX2ZuZW5kKDMsIGRldiwgIih3aW1heF9kZXYgJXAgc3RhdGUgJXUpID0gdm9pZCBbJWRdXG4iLAorCQl3aW1heF9kZXYsIHN0YXRlLCByZXN1bHQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwod2ltYXhfcmVwb3J0X3Jma2lsbF9zdyk7CisKKworLyoKKyAqIENhbGxiYWNrIGZvciB0aGUgUkYgS2lsbCB0b2dnbGUgb3BlcmF0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnk6CisgKgorICogLSBUaGUgcmZraWxsIHN1YnN5c3RlbSB3aGVuIHRoZSBSRi1LaWxsIGtleSBpcyBwcmVzc2VkIGluIHRoZQorICogICBoYXJkd2FyZSBhbmQgdGhlIGRyaXZlciBub3RpZmllcyB0aHJvdWdoCisgKiAgIHdpbWF4X3JlcG9ydF9yZmtpbGxfaHcoKS4gVGhlIHJma2lsbCBzdWJzeXN0ZW0gZW5kcyB1cCBjYWxsaW5nIGJhY2sKKyAqICAgaGVyZSBzbyB0aGUgc29mdHdhcmUgUkYgS2lsbCBzd2l0Y2ggc3RhdGUgaXMgY2hhbmdlZCB0byByZWZsZWN0CisgKiAgIHRoZSBoYXJkd2FyZSBzd2l0Y2ggc3RhdGUuCisgKgorICogLSBXaGVuIHRoZSB1c2VyIHNldHMgdGhlIHN0YXRlIHRocm91Z2ggc3lzZnMnIHJma2lsbC9zdGF0ZSBmaWxlCisgKgorICogLSBXaGVuIHRoZSB1c2VyIGNhbGxzIHdpbWF4X3Jma2lsbCgpLgorICoKKyAqIFRoaXMgY2FsbCBibG9ja3MhCisgKgorICogV0FSTklORyEgV2hlbiB3ZSBjYWxsIHJma2lsbF91bnJlZ2lzdGVyKCksIHRoaXMgd2lsbCBiZSBjYWxsZWQgd2l0aAorICogc3RhdGUgMCEKKyAqCisgKiBXQVJOSU5HOiB3aW1heF9kZXYgbXVzdCBiZSBsb2NrZWQKKyAqLworc3RhdGljCitpbnQgX193aW1heF9yZl90b2dnbGVfcmFkaW8oc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2LAorCQkJICAgIGVudW0gd2ltYXhfcmZfc3RhdGUgc3RhdGUpCit7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IGRldmljZSAqZGV2ID0gd2ltYXhfZGV2X3RvX2Rldih3aW1heF9kZXYpOworCWVudW0gd2ltYXhfc3Qgd2ltYXhfc3RhdGU7CisKKwltaWdodF9zbGVlcCgpOworCWRfZm5zdGFydCgzLCBkZXYsICIod2ltYXhfZGV2ICVwIHN0YXRlICV1KVxuIiwgd2ltYXhfZGV2LCBzdGF0ZSk7CisJaWYgKHdpbWF4X2Rldi0+cmZfc3cgPT0gc3RhdGUpCisJCWdvdG8gb3V0X25vX2NoYW5nZTsKKwlpZiAod2ltYXhfZGV2LT5vcF9yZmtpbGxfc3dfdG9nZ2xlICE9IE5VTEwpCisJCXJlc3VsdCA9IHdpbWF4X2Rldi0+b3BfcmZraWxsX3N3X3RvZ2dsZSh3aW1heF9kZXYsIHN0YXRlKTsKKwllbHNlIGlmIChzdGF0ZSA9PSBXSU1BWF9SRl9PRkYpCS8qIE5vIG9wPyBjYW4ndCB0dXJuIG9mZiAqLworCQlyZXN1bHQgPSAtRU5YSU87CisJZWxzZQkJCQkvKiBObyBvcD8gY2FuIHR1cm4gb24gKi8KKwkJcmVzdWx0ID0gMDsJCS8qIHNob3VsZCBuZXZlciBoYXBwZW4gdGhvICovCisJaWYgKHJlc3VsdCA+PSAwKSB7CisJCXJlc3VsdCA9IDA7CisJCXdpbWF4X2Rldi0+cmZfc3cgPSBzdGF0ZTsKKwkJd2ltYXhfc3RhdGUgPSBzdGF0ZSA9PSBXSU1BWF9SRl9PTiA/CisJCQlXSU1BWF9TVF9SRUFEWSA6IFdJTUFYX1NUX1JBRElPX09GRjsKKwkJX193aW1heF9zdGF0ZV9jaGFuZ2Uod2ltYXhfZGV2LCB3aW1heF9zdGF0ZSk7CisJfQorb3V0X25vX2NoYW5nZToKKwlkX2ZuZW5kKDMsIGRldiwgIih3aW1heF9kZXYgJXAgc3RhdGUgJXUpID0gJWRcbiIsCisJCXdpbWF4X2Rldiwgc3RhdGUsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICogVHJhbnNsYXRlIGZyb20gcmZraWxsIHN0YXRlIHRvIHdpbWF4IHN0YXRlCisgKgorICogTk9URTogU3BlY2lhbCBzdGF0ZSBoYW5kbGluZyBydWxlcyBoZXJlCisgKgorICogICAgIEp1c3QgcHJldGVuZCB0aGUgY2FsbCBkaWRuJ3QgaGFwcGVuIGlmIHdlIGFyZSBpbiBhIHN0YXRlIHdoZXJlCisgKiAgICAgd2Uga25vdyBmb3Igc3VyZSBpdCBjYW5ub3QgYmUgaGFuZGxlZCAoV0lNQVhfU1RfRE9XTiBvcgorICogICAgIF9fV0lNQVhfU1RfUVVJRVNDSU5HKS4gcmZraWxsKCkgbmVlZHMgaXQgdG8gcmVnaXN0ZXIgYW5kCisgKiAgICAgdW5yZWdpc3RlciwgYXMgaXQgd2lsbCBydW4gdGhpcyBwYXRoLgorICoKKyAqIE5PVEU6IFRoaXMgY2FsbCB3aWxsIGJsb2NrIHVudGlsIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVkLgorICovCitzdGF0aWMKK2ludCB3aW1heF9yZmtpbGxfdG9nZ2xlX3JhZGlvKHZvaWQgKmRhdGEsIGVudW0gcmZraWxsX3N0YXRlIHN0YXRlKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2ID0gZGF0YTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB3aW1heF9kZXZfdG9fZGV2KHdpbWF4X2Rldik7CisJZW51bSB3aW1heF9yZl9zdGF0ZSByZl9zdGF0ZTsKKworCWRfZm5zdGFydCgzLCBkZXYsICIod2ltYXhfZGV2ICVwIHN0YXRlICV1KVxuIiwgd2ltYXhfZGV2LCBzdGF0ZSk7CisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgUkZLSUxMX1NUQVRFX09OOgorCQlyZl9zdGF0ZSA9IFdJTUFYX1JGX09GRjsKKwkJYnJlYWs7CisJY2FzZSBSRktJTExfU1RBVEVfT0ZGOgorCQlyZl9zdGF0ZSA9IFdJTUFYX1JGX09OOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisJbXV0ZXhfbG9jaygmd2ltYXhfZGV2LT5tdXRleCk7CisJaWYgKHdpbWF4X2Rldi0+c3RhdGUgPD0gX19XSU1BWF9TVF9RVUlFU0NJTkcpCisJCXJlc3VsdCA9IDA7CS8qIGp1c3QgcHJldGVuZCBpdCBkaWRuJ3QgaGFwcGVuICovCisJZWxzZQorCQlyZXN1bHQgPSBfX3dpbWF4X3JmX3RvZ2dsZV9yYWRpbyh3aW1heF9kZXYsIHJmX3N0YXRlKTsKKwltdXRleF91bmxvY2soJndpbWF4X2Rldi0+bXV0ZXgpOworCWRfZm5lbmQoMywgZGV2LCAiKHdpbWF4X2RldiAlcCBzdGF0ZSAldSkgPSAlZFxuIiwKKwkJd2ltYXhfZGV2LCBzdGF0ZSwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qKgorICogd2ltYXhfcmZraWxsIC0gU2V0IHRoZSBzb2Z0d2FyZSBSRiBzd2l0Y2ggc3RhdGUgZm9yIGEgV2lNQVggZGV2aWNlCisgKgorICogQHdpbWF4X2RldjogV2lNQVggZGV2aWNlIGRlc2NyaXB0b3IKKyAqCisgKiBAc3RhdGU6IE5ldyBSRiBzdGF0ZS4KKyAqCisgKiBSZXR1cm5zOgorICoKKyAqID49IDAgdG9nZ2xlIHN0YXRlIGlmIG9rLCA8IDAgZXJybm8gY29kZSBvbiBlcnJvci4gVGhlIHRvZ2dsZSBzdGF0ZQorICogaXMgcmV0dXJuZWQgYXMgYSBiaXRtYXAsIGJpdCAwIGJlaW5nIHRoZSBoYXJkd2FyZSBSRiBzdGF0ZSwgYml0IDEKKyAqIHRoZSBzb2Z0d2FyZSBSRiBzdGF0ZS4KKyAqCisgKiAwIG1lYW5zIGRpc2FibGVkICglV0lNQVhfUkZfT04sIHJhZGlvIG9uKSwgMSBtZWFucyBlbmFibGVkIHJhZGlvCisgKiBvZmYgKCVXSU1BWF9SRl9PRkYpLgorICoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqIENhbGxlZCBieSB0aGUgdXNlciB3aGVuIGhlIHdhbnRzIHRvIHJlcXVlc3QgdGhlIFdpTUFYIHJhZGlvIHRvIGJlCisgKiBzd2l0Y2hlZCBvbiAoJVdJTUFYX1JGX09OKSBvciBvZmYgKCVXSU1BWF9SRl9PRkYpLiBXaXRoCisgKiAlV0lNQVhfUkZfUVVFUlksIGp1c3QgdGhlIGN1cnJlbnQgc3RhdGUgaXMgcmV0dXJuZWQuCisgKgorICogTk9URToKKyAqCisgKiBUaGlzIGNhbGwgd2lsbCBibG9jayB1bnRpbCB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLgorICovCitpbnQgd2ltYXhfcmZraWxsKHN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldiwgZW51bSB3aW1heF9yZl9zdGF0ZSBzdGF0ZSkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHdpbWF4X2Rldl90b19kZXYod2ltYXhfZGV2KTsKKworCWRfZm5zdGFydCgzLCBkZXYsICIod2ltYXhfZGV2ICVwIHN0YXRlICV1KVxuIiwgd2ltYXhfZGV2LCBzdGF0ZSk7CisJbXV0ZXhfbG9jaygmd2ltYXhfZGV2LT5tdXRleCk7CisJcmVzdWx0ID0gd2ltYXhfZGV2X2lzX3JlYWR5KHdpbWF4X2Rldik7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gZXJyb3Jfbm90X3JlYWR5OworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFdJTUFYX1JGX09OOgorCWNhc2UgV0lNQVhfUkZfT0ZGOgorCQlyZXN1bHQgPSBfX3dpbWF4X3JmX3RvZ2dsZV9yYWRpbyh3aW1heF9kZXYsIHN0YXRlKTsKKwkJaWYgKHJlc3VsdCA8IDApCisJCQlnb3RvIGVycm9yOworCQlicmVhazsKKwljYXNlIFdJTUFYX1JGX1FVRVJZOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXN1bHQgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yOworCX0KKwlyZXN1bHQgPSB3aW1heF9kZXYtPnJmX3N3IDw8IDEgfCB3aW1heF9kZXYtPnJmX2h3OworZXJyb3I6CitlcnJvcl9ub3RfcmVhZHk6CisJbXV0ZXhfdW5sb2NrKCZ3aW1heF9kZXYtPm11dGV4KTsKKwlkX2ZuZW5kKDMsIGRldiwgIih3aW1heF9kZXYgJXAgc3RhdGUgJXUpID0gJWRcbiIsCisJCXdpbWF4X2Rldiwgc3RhdGUsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KK0VYUE9SVF9TWU1CT0wod2ltYXhfcmZraWxsKTsKKworCisvKgorICogUmVnaXN0ZXIgYSBuZXcgV2lNQVggZGV2aWNlJ3MgUkYgS2lsbCBzdXBwb3J0CisgKgorICogV0FSTklORzogd2ltYXhfZGV2LT5tdXRleCBtdXN0IGJlIHVubG9ja2VkCisgKi8KK2ludCB3aW1heF9yZmtpbGxfYWRkKHN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldikKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCByZmtpbGwgKnJma2lsbDsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7CisJc3RydWN0IGRldmljZSAqZGV2ID0gd2ltYXhfZGV2X3RvX2Rldih3aW1heF9kZXYpOworCisJZF9mbnN0YXJ0KDMsIGRldiwgIih3aW1heF9kZXYgJXApXG4iLCB3aW1heF9kZXYpOworCS8qIEluaXRpYWxpemUgUkYgS2lsbCAqLworCXJlc3VsdCA9IC1FTk9NRU07CisJcmZraWxsID0gcmZraWxsX2FsbG9jYXRlKGRldiwgUkZLSUxMX1RZUEVfV0lNQVgpOworCWlmIChyZmtpbGwgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9yZmtpbGxfYWxsb2NhdGU7CisJd2ltYXhfZGV2LT5yZmtpbGwgPSByZmtpbGw7CisKKwlyZmtpbGwtPm5hbWUgPSB3aW1heF9kZXYtPm5hbWU7CisJcmZraWxsLT5zdGF0ZSA9IFJGS0lMTF9TVEFURV9PRkY7CisJcmZraWxsLT5kYXRhID0gd2ltYXhfZGV2OworCXJma2lsbC0+dG9nZ2xlX3JhZGlvID0gd2ltYXhfcmZraWxsX3RvZ2dsZV9yYWRpbzsKKwlyZmtpbGwtPnVzZXJfY2xhaW1fdW5zdXBwb3J0ZWQgPSAxOworCisJLyogSW5pdGlhbGl6ZSB0aGUgaW5wdXQgZGV2aWNlIGZvciB0aGUgaHcga2V5ICovCisJaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKGlucHV0X2RldiA9PSBOVUxMKQorCQlnb3RvIGVycm9yX2lucHV0X2FsbG9jYXRlOworCXdpbWF4X2Rldi0+cmZraWxsX2lucHV0ID0gaW5wdXRfZGV2OworCWRfcHJpbnRmKDEsIGRldiwgInJma2lsbCAlcCBpbnB1dCAlcFxuIiwgcmZraWxsLCBpbnB1dF9kZXYpOworCisJaW5wdXRfZGV2LT5uYW1lID0gd2ltYXhfZGV2LT5uYW1lOworCS8qIEZJWE1FOiBnZXQgYSByZWFsIGRldmljZSBidXMgSUQgYW5kIHN0dWZmPyBkbyB3ZSBjYXJlPyAqLworCWlucHV0X2Rldi0+aWQuYnVzdHlwZSA9IEJVU19IT1NUOworCWlucHV0X2Rldi0+aWQudmVuZG9yID0gMHhmZmZmOworCWlucHV0X2Rldi0+ZXZiaXRbMF0gPSBCSVQoRVZfS0VZKTsKKwlzZXRfYml0KEtFWV9XSU1BWCwgaW5wdXRfZGV2LT5rZXliaXQpOworCisJLyogUmVnaXN0ZXIgYm90aCAqLworCXJlc3VsdCA9IGlucHV0X3JlZ2lzdGVyX2RldmljZSh3aW1heF9kZXYtPnJma2lsbF9pbnB1dCk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gZXJyb3JfaW5wdXRfcmVnaXN0ZXI7CisJcmVzdWx0ID0gcmZraWxsX3JlZ2lzdGVyKHdpbWF4X2Rldi0+cmZraWxsKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBlcnJvcl9yZmtpbGxfcmVnaXN0ZXI7CisKKwkvKiBJZiB0aGVyZSBpcyBubyBTVyB0b2dnbGUgb3AsIFNXIFJGS2lsbCBpcyBhbHdheXMgb24gKi8KKwlpZiAod2ltYXhfZGV2LT5vcF9yZmtpbGxfc3dfdG9nZ2xlID09IE5VTEwpCisJCXdpbWF4X2Rldi0+cmZfc3cgPSBXSU1BWF9SRl9PTjsKKworCWRfZm5lbmQoMywgZGV2LCAiKHdpbWF4X2RldiAlcCkgPSAwXG4iLCB3aW1heF9kZXYpOworCXJldHVybiAwOworCisJLyogaWYgcmZraWxsX3JlZ2lzdGVyKCkgc3VjZWVkcywgY2FuJ3QgdXNlIHJma2lsbF9mcmVlKCkgYW55CisJICogbW9yZSwgb25seSByZmtpbGxfdW5yZWdpc3RlcigpIFtpdCBvd25zIHRoZSByZWZjb3VudF07IHdpdGgKKwkgKiB0aGUgaW5wdXQgZGV2aWNlIHdlIGhhdmUgdGhlIHNhbWUgaXNzdWUtLWhlbmNlIHRoZSBpZi4gKi8KK2Vycm9yX3Jma2lsbF9yZWdpc3RlcjoKKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSh3aW1heF9kZXYtPnJma2lsbF9pbnB1dCk7CisJd2ltYXhfZGV2LT5yZmtpbGxfaW5wdXQgPSBOVUxMOworZXJyb3JfaW5wdXRfcmVnaXN0ZXI6CisJaWYgKHdpbWF4X2Rldi0+cmZraWxsX2lucHV0KQorCQlpbnB1dF9mcmVlX2RldmljZSh3aW1heF9kZXYtPnJma2lsbF9pbnB1dCk7CitlcnJvcl9pbnB1dF9hbGxvY2F0ZToKKwlyZmtpbGxfZnJlZSh3aW1heF9kZXYtPnJma2lsbCk7CitlcnJvcl9yZmtpbGxfYWxsb2NhdGU6CisJZF9mbmVuZCgzLCBkZXYsICIod2ltYXhfZGV2ICVwKSA9ICVkXG4iLCB3aW1heF9kZXYsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICogRGVyZWdpc3RlciBhIFdpTUFYIGRldmljZSdzIFJGIEtpbGwgc3VwcG9ydAorICoKKyAqIEljaywgd2UgY2FuJ3QgY2FsbCByZmtpbGxfZnJlZSgpIGFmdGVyIHJma2lsbF91bnJlZ2lzdGVyKCkuLi5vaAorICogd2VsbC4KKyAqCisgKiBXQVJOSU5HOiB3aW1heF9kZXYtPm11dGV4IG11c3QgYmUgdW5sb2NrZWQKKyAqLwordm9pZCB3aW1heF9yZmtpbGxfcm0oc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHdpbWF4X2Rldl90b19kZXYod2ltYXhfZGV2KTsKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKHdpbWF4X2RldiAlcClcbiIsIHdpbWF4X2Rldik7CisJcmZraWxsX3VucmVnaXN0ZXIod2ltYXhfZGV2LT5yZmtpbGwpOwkvKiBmcmVlcyAqLworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHdpbWF4X2Rldi0+cmZraWxsX2lucHV0KTsKKwlkX2ZuZW5kKDMsIGRldiwgIih3aW1heF9kZXYgJXApXG4iLCB3aW1heF9kZXYpOworfQorCisKKyNlbHNlIC8qICNpZmRlZiBDT05GSUdfUkZLSUxMICovCisKK3ZvaWQgd2ltYXhfcmVwb3J0X3Jma2lsbF9odyhzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYsCisJCQkgICAgZW51bSB3aW1heF9yZl9zdGF0ZSBzdGF0ZSkKK3sKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdpbWF4X3JlcG9ydF9yZmtpbGxfaHcpOworCit2b2lkIHdpbWF4X3JlcG9ydF9yZmtpbGxfc3coc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2LAorCQkJICAgIGVudW0gd2ltYXhfcmZfc3RhdGUgc3RhdGUpCit7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh3aW1heF9yZXBvcnRfcmZraWxsX3N3KTsKKworaW50IHdpbWF4X3Jma2lsbChzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYsCisJCSBlbnVtIHdpbWF4X3JmX3N0YXRlIHN0YXRlKQoreworCXJldHVybiBXSU1BWF9SRl9PTiA8PCAxIHwgV0lNQVhfUkZfT047Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh3aW1heF9yZmtpbGwpOworCitpbnQgd2ltYXhfcmZraWxsX2FkZChzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgd2ltYXhfcmZraWxsX3JtKHN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldikKK3sKK30KKworI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfUkZLSUxMICovCisKKworLyoKKyAqIEV4cG9ydGluZyB0byB1c2VyIHNwYWNlIG92ZXIgZ2VuZXJpYyBuZXRsaW5rCisgKgorICogUGFyc2UgdGhlIHJma2lsbCBjb21tYW5kIGZyb20gdXNlciBzcGFjZSwgcmV0dXJuIGEgY29tYmluYXRpb24KKyAqIHZhbHVlIHRoYXQgZGVzY3JpYmUgdGhlIHN0YXRlcyBvZiB0aGUgZGlmZmVyZW50IHRvZ2dsZXMuCisgKgorICogT25seSBvbmUgYXR0cmlidXRlOiB0aGUgbmV3IHN0YXRlIHJlcXVlc3RlZCAob24sIG9mZiBvciBubyBjaGFuZ2UsCisgKiBqdXN0IHF1ZXJ5KS4KKyAqLworCitzdGF0aWMgY29uc3QKK3N0cnVjdCBubGFfcG9saWN5IHdpbWF4X2dubF9yZmtpbGxfcG9saWN5W1dJTUFYX0dOTF9BVFRSX01BWCArIDFdID0geworCVtXSU1BWF9HTkxfUkZLSUxMX0lGSURYXSA9IHsKKwkJLnR5cGUgPSBOTEFfVTMyLAorCX0sCisJW1dJTUFYX0dOTF9SRktJTExfU1RBVEVdID0geworCQkudHlwZSA9IE5MQV9VMzIJCS8qIGVudW0gd2ltYXhfcmZfc3RhdGUgKi8KKwl9LAorfTsKKworCitzdGF0aWMKK2ludCB3aW1heF9nbmxfZG9pdF9yZmtpbGwoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKK3sKKwlpbnQgcmVzdWx0LCBpZmluZGV4OworCXN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJZW51bSB3aW1heF9yZl9zdGF0ZSBuZXdfc3RhdGU7CisKKwlkX2Zuc3RhcnQoMywgTlVMTCwgIihza2IgJXAgaW5mbyAlcClcbiIsIHNrYiwgaW5mbyk7CisJcmVzdWx0ID0gLUVOT0RFVjsKKwlpZiAoaW5mby0+YXR0cnNbV0lNQVhfR05MX1JGS0lMTF9JRklEWF0gPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIldJTUFYX0dOTF9PUF9SRktJTEw6IGNhbid0IGZpbmQgSUZJRFggIgorCQkJImF0dHJpYnV0ZVxuIik7CisJCWdvdG8gZXJyb3Jfbm9fd2ltYXhfZGV2OworCX0KKwlpZmluZGV4ID0gbmxhX2dldF91MzIoaW5mby0+YXR0cnNbV0lNQVhfR05MX1JGS0lMTF9JRklEWF0pOworCXdpbWF4X2RldiA9IHdpbWF4X2Rldl9nZXRfYnlfZ2VubF9pbmZvKGluZm8sIGlmaW5kZXgpOworCWlmICh3aW1heF9kZXYgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9ub193aW1heF9kZXY7CisJZGV2ID0gd2ltYXhfZGV2X3RvX2Rldih3aW1heF9kZXYpOworCXJlc3VsdCA9IC1FSU5WQUw7CisJaWYgKGluZm8tPmF0dHJzW1dJTUFYX0dOTF9SRktJTExfU1RBVEVdID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJXSU1BWF9HTkxfUkZLSUxMOiBjYW4ndCBmaW5kIFJGS0lMTF9TVEFURSAiCisJCQkiYXR0cmlidXRlXG4iKTsKKwkJZ290byBlcnJvcl9ub19waWQ7CisJfQorCW5ld19zdGF0ZSA9IG5sYV9nZXRfdTMyKGluZm8tPmF0dHJzW1dJTUFYX0dOTF9SRktJTExfU1RBVEVdKTsKKworCS8qIEV4ZWN1dGUgdGhlIG9wZXJhdGlvbiBhbmQgc2VuZCB0aGUgcmVzdWx0IGJhY2sgdG8gdXNlciBzcGFjZSAqLworCXJlc3VsdCA9IHdpbWF4X3Jma2lsbCh3aW1heF9kZXYsIG5ld19zdGF0ZSk7CitlcnJvcl9ub19waWQ6CisJZGV2X3B1dCh3aW1heF9kZXYtPm5ldF9kZXYpOworZXJyb3Jfbm9fd2ltYXhfZGV2OgorCWRfZm5lbmQoMywgTlVMTCwgIihza2IgJXAgaW5mbyAlcCkgPSAlZFxuIiwgc2tiLCBpbmZvLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKworc3RydWN0IGdlbmxfb3BzIHdpbWF4X2dubF9yZmtpbGwgPSB7CisJLmNtZCA9IFdJTUFYX0dOTF9PUF9SRktJTEwsCisJLmZsYWdzID0gR0VOTF9BRE1JTl9QRVJNLAorCS5wb2xpY3kgPSB3aW1heF9nbmxfcmZraWxsX3BvbGljeSwKKwkuZG9pdCA9IHdpbWF4X2dubF9kb2l0X3Jma2lsbCwKKwkuZHVtcGl0ID0gTlVMTCwKK307CisKZGlmZiAtLWdpdCBhL25ldC93aW1heC9zdGFjay5jIGIvbmV0L3dpbWF4L3N0YWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRkYTkyZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC93aW1heC9zdGFjay5jCkBAIC0wLDAgKzEsNTk5IEBACisvKgorICogTGludXggV2lNQVgKKyAqIEluaXRpYWxpemF0aW9uLCBhZGRpdGlvbiBhbmQgcmVtb3ZhbCBvZiB3aW1heCBkZXZpY2VzCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IEludGVsIENvcnBvcmF0aW9uIDxsaW51eC13aW1heEBpbnRlbC5jb20+CisgKiBJbmFreSBQZXJlei1Hb256YWxleiA8aW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKgorICogVGhpcyBpbXBsZW1lbnRzOgorICoKKyAqICAgLSBiYXNpYyBsaWZlIGN5Y2xlIG9mICdzdHJ1Y3Qgd2ltYXhfZGV2JyBbd2ltYXhfZGV2XyooKV07IG9uCisgKiAgICAgYWRkaXRpb24vcmVnaXN0cmF0aW9uIGluaXRpYWxpemUgYWxsIHN1YmZpZWxkcyBhbmQgYWxsb2NhdGUKKyAqICAgICBnZW5lcmljIG5ldGxpbmsgcmVzb3VyY2VzIGZvciB1c2VyIHNwYWNlIGNvbW11bmljYXRpb24uIE9uCisgKiAgICAgcmVtb3ZhbC91bnJlZ2lzdHJhdGlvbiwgdW5kbyBhbGwgdGhhdC4KKyAqCisgKiAgIC0gZGV2aWNlIHN0YXRlIG1hY2hpbmUgW3dpbWF4X3N0YXRlX2NoYW5nZSgpXSBhbmQgc3VwcG9ydCB0byBzZW5kCisgKiAgICAgcmVwb3J0cyB0byB1c2VyIHNwYWNlIHdoZW4gdGhlIHN0YXRlIGNoYW5nZXMKKyAqICAgICBbd2ltYXhfZ25sX3JlX3N0YXRlX2NoYW5nZSooKV0uCisgKgorICogU2VlIGluY2x1ZGUvbmV0L3dpbWF4LmggZm9yIHJhdGlvbmFsZXMgYW5kIGRlc2lnbi4KKyAqCisgKiBST0FETUFQCisgKgorICogW19fXXdpbWF4X3N0YXRlX2NoYW5nZSgpICAgICBDYWxsZWQgYnkgZHJpdmVycyB0byB1cGRhdGUgZGV2aWNlJ3Mgc3RhdGUKKyAqICAgd2ltYXhfZ25sX3JlX3N0YXRlX2NoYW5nZV9hbGxvYygpCisgKiAgIHdpbWF4X2dubF9yZV9zdGF0ZV9jaGFuZ2Vfc2VuZCgpCisgKgorICogd2ltYXhfZGV2X2luaXQoKQkgICAgICAgIEluaXQgYSBkZXZpY2UKKyAqIHdpbWF4X2Rldl9hZGQoKSAgICAgICAgICAgICAgUmVnaXN0ZXIKKyAqICAgd2ltYXhfcmZraWxsX2FkZCgpCisgKiAgIHdpbWF4X2dubF9hZGQoKSAgICAgICAgICAgIFJlZ2lzdGVyIGFsbCB0aGUgZ2VuZXJpYyBuZXRsaW5rIHJlc291cmNlcy4KKyAqICAgd2ltYXhfaWRfdGFibGVfYWRkKCkKKyAqIHdpbWF4X2Rldl9ybSgpICAgICAgICAgICAgICAgVW5yZWdpc3RlcgorICogICB3aW1heF9pZF90YWJsZV9ybSgpCisgKiAgIHdpbWF4X2dubF9ybSgpCisgKiAgIHdpbWF4X3Jma2lsbF9ybSgpCisgKi8KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxuZXQvZ2VuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2ltYXguaD4KKyNpbmNsdWRlICJ3aW1heC1pbnRlcm5hbC5oIgorCisKKyNkZWZpbmUgRF9TVUJNT0RVTEUgc3RhY2sKKyNpbmNsdWRlICJkZWJ1Zy1sZXZlbHMuaCIKKworLyoKKyAqIEF1dGhvcml0YXRpdmUgc291cmNlIGZvciB0aGUgUkVfU1RBVEVfQ0hBTkdFIGF0dHJpYnV0ZSBwb2xpY3kKKyAqCisgKiBXZSBkb24ndCByZWFsbHkgdXNlIGl0IGhlcmUsIGJ1dCAvbWUgbGlrZXMgdG8ga2VlcCB0aGUgZGVmaW5pdGlvbgorICogY2xvc2UgdG8gd2hlcmUgdGhlIGRhdGEgaXMgZ2VuZXJhdGVkLgorICovCisvKgorc3RhdGljIGNvbnN0CitzdHJ1Y3QgbmxhX3BvbGljeSB3aW1heF9nbmxfcmVfc3RhdHVzX2NoYW5nZVtXSU1BWF9HTkxfQVRUUl9NQVggKyAxXSA9IHsKKwlbV0lNQVhfR05MX1NUQ0hfU1RBVEVfT0xEXSA9IHsgLnR5cGUgPSBOTEFfVTggfSwKKwlbV0lNQVhfR05MX1NUQ0hfU1RBVEVfTkVXXSA9IHsgLnR5cGUgPSBOTEFfVTggfSwKK307CisqLworCisKKy8qCisgKiBBbGxvY2F0ZSBhIFJlcG9ydCBTdGF0ZSBDaGFuZ2UgbWVzc2FnZQorICoKKyAqIEBoZWFkZXI6IHNhdmUgaXQsIHlvdSBuZWVkIGl0IGZvciBfc2VuZCgpCisgKgorICogQ3JlYXRlcyBhbmQgZmlsbHMgYSBiYXNpYyBzdGF0ZSBjaGFuZ2UgbWVzc2FnZTsgZGlmZmVyZW50IGNvZGUKKyAqIHBhdGhzIGNhbiB0aGVuIGFkZCBtb3JlIGF0dHJpYnV0ZXMgdG8gdGhlIG1lc3NhZ2UgYXMgbmVlZGVkLgorICoKKyAqIFVzZSB3aW1heF9nbmxfcmVfc3RhdGVfY2hhbmdlX3NlbmQoKSB0byBzZW5kIHRoZSByZXR1cm5lZCBza2IuCisgKgorICogUmV0dXJuczogc2tiIHdpdGggdGhlIGdlbmwgbWVzc2FnZSBpZiBvaywgSVNfRVJSKCkgcHRyIG9uIGVycm9yCisgKiAgICAgd2l0aCBhbiBlcnJubyBjb2RlLgorICovCitzdGF0aWMKK3N0cnVjdCBza19idWZmICp3aW1heF9nbmxfcmVfc3RhdGVfY2hhbmdlX2FsbG9jKAorCXN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldiwKKwllbnVtIHdpbWF4X3N0IG5ld19zdGF0ZSwgZW51bSB3aW1heF9zdCBvbGRfc3RhdGUsCisJdm9pZCAqKmhlYWRlcikKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHdpbWF4X2Rldl90b19kZXYod2ltYXhfZGV2KTsKKwl2b2lkICpkYXRhOworCXN0cnVjdCBza19idWZmICpyZXBvcnRfc2tiOworCisJZF9mbnN0YXJ0KDMsIGRldiwgIih3aW1heF9kZXYgJXAgbmV3X3N0YXRlICV1IG9sZF9zdGF0ZSAldSlcbiIsCisJCSAgd2ltYXhfZGV2LCBuZXdfc3RhdGUsIG9sZF9zdGF0ZSk7CisJcmVzdWx0ID0gLUVOT01FTTsKKwlyZXBvcnRfc2tiID0gbmxtc2dfbmV3KE5MTVNHX0RFRkFVTFRfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKHJlcG9ydF9za2IgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgIlJFX1NUQ0g6IGNhbid0IGNyZWF0ZSBtZXNzYWdlXG4iKTsKKwkJZ290byBlcnJvcl9uZXc7CisJfQorCWRhdGEgPSBnZW5sbXNnX3B1dChyZXBvcnRfc2tiLCAwLCB3aW1heF9nbmxfbWNnLmlkLCAmd2ltYXhfZ25sX2ZhbWlseSwKKwkJCSAgIDAsIFdJTUFYX0dOTF9SRV9TVEFURV9DSEFOR0UpOworCWlmIChkYXRhID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJSRV9TVENIOiBjYW4ndCBwdXQgZGF0YSBpbnRvIG1lc3NhZ2VcbiIpOworCQlnb3RvIGVycm9yX3B1dDsKKwl9CisJKmhlYWRlciA9IGRhdGE7CisKKwlyZXN1bHQgPSBubGFfcHV0X3U4KHJlcG9ydF9za2IsIFdJTUFYX0dOTF9TVENIX1NUQVRFX09MRCwgb2xkX3N0YXRlKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIlJFX1NUQ0g6IEVycm9yIGFkZGluZyBPTEQgYXR0cjogJWRcbiIsIHJlc3VsdCk7CisJCWdvdG8gZXJyb3JfcHV0OworCX0KKwlyZXN1bHQgPSBubGFfcHV0X3U4KHJlcG9ydF9za2IsIFdJTUFYX0dOTF9TVENIX1NUQVRFX05FVywgbmV3X3N0YXRlKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIlJFX1NUQ0g6IEVycm9yIGFkZGluZyBORVcgYXR0cjogJWRcbiIsIHJlc3VsdCk7CisJCWdvdG8gZXJyb3JfcHV0OworCX0KKwlyZXN1bHQgPSBubGFfcHV0X3UzMihyZXBvcnRfc2tiLCBXSU1BWF9HTkxfU1RDSF9JRklEWCwKKwkJCSAgICAgd2ltYXhfZGV2LT5uZXRfZGV2LT5pZmluZGV4KTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIlJFX1NUQ0g6IEVycm9yIGFkZGluZyBJRklOREVYIGF0dHJpYnV0ZVxuIik7CisJCWdvdG8gZXJyb3JfcHV0OworCX0KKwlkX2ZuZW5kKDMsIGRldiwgIih3aW1heF9kZXYgJXAgbmV3X3N0YXRlICV1IG9sZF9zdGF0ZSAldSkgPSAlcFxuIiwKKwkJd2ltYXhfZGV2LCBuZXdfc3RhdGUsIG9sZF9zdGF0ZSwgcmVwb3J0X3NrYik7CisJcmV0dXJuIHJlcG9ydF9za2I7CisKK2Vycm9yX3B1dDoKKwlubG1zZ19mcmVlKHJlcG9ydF9za2IpOworZXJyb3JfbmV3OgorCWRfZm5lbmQoMywgZGV2LCAiKHdpbWF4X2RldiAlcCBuZXdfc3RhdGUgJXUgb2xkX3N0YXRlICV1KSA9ICVkXG4iLAorCQl3aW1heF9kZXYsIG5ld19zdGF0ZSwgb2xkX3N0YXRlLCByZXN1bHQpOworCXJldHVybiBFUlJfUFRSKHJlc3VsdCk7Cit9CisKKworLyoKKyAqIFNlbmQgYSBSZXBvcnQgU3RhdGUgQ2hhbmdlIG1lc3NhZ2UgKGFzIGNyZWF0ZWQgd2l0aCBfYWxsb2MpLgorICoKKyAqIEByZXBvcnRfc2tiOiBhcyByZXR1cm5lZCBieSB3aW1heF9nbmxfcmVfc3RhdGVfY2hhbmdlX2FsbG9jKCkKKyAqIEBoZWFkZXI6IGFzIHJldHVybmVkIGJ5IHdpbWF4X2dubF9yZV9zdGF0ZV9jaGFuZ2VfYWxsb2MoKQorICoKKyAqIFJldHVybnM6IDAgaWYgb2ssIDwgMCBlcnJubyBjb2RlIG9uIGVycm9yLgorICoKKyAqIElmIHRoZSBtZXNzYWdlIGlzICBOVUxMLCBwcmV0ZW5kIGl0IGRpZG4ndCBoYXBwZW4uCisgKi8KK3N0YXRpYworaW50IHdpbWF4X2dubF9yZV9zdGF0ZV9jaGFuZ2Vfc2VuZCgKKwlzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYsIHN0cnVjdCBza19idWZmICpyZXBvcnRfc2tiLAorCXZvaWQgKmhlYWRlcikKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB3aW1heF9kZXZfdG9fZGV2KHdpbWF4X2Rldik7CisJZF9mbnN0YXJ0KDMsIGRldiwgIih3aW1heF9kZXYgJXAgcmVwb3J0X3NrYiAlcClcbiIsCisJCSAgd2ltYXhfZGV2LCByZXBvcnRfc2tiKTsKKwlpZiAocmVwb3J0X3NrYiA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwlnZW5sbXNnX2VuZChyZXBvcnRfc2tiLCBoZWFkZXIpOworCXJlc3VsdCA9IGdlbmxtc2dfbXVsdGljYXN0KHJlcG9ydF9za2IsIDAsIHdpbWF4X2dubF9tY2cuaWQsIEdGUF9LRVJORUwpOworCWlmIChyZXN1bHQgPT0gLUVTUkNIKQkvKiBOb2JvZHkgY29ubmVjdGVkLCBpZ25vcmUgaXQgKi8KKwkJcmVzdWx0ID0gMDsJLyogYnR3LCB0aGUgc2tiIGlzIGZyZWVkIGFscmVhZHkgKi8KKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIlJFX1NUQ0g6IEVycm9yIHNlbmRpbmc6ICVkXG4iLCByZXN1bHQpOworCQlubG1zZ19mcmVlKHJlcG9ydF9za2IpOworCX0KK291dDoKKwlkX2ZuZW5kKDMsIGRldiwgIih3aW1heF9kZXYgJXAgcmVwb3J0X3NrYiAlcCkgPSAlZFxuIiwKKwkJd2ltYXhfZGV2LCByZXBvcnRfc2tiLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljCit2b2lkIF9fY2hlY2tfbmV3X3N0YXRlKGVudW0gd2ltYXhfc3Qgb2xkX3N0YXRlLCBlbnVtIHdpbWF4X3N0IG5ld19zdGF0ZSwKKwkJICAgICAgIHVuc2lnbmVkIGFsbG93ZWRfc3RhdGVzX2JtKQoreworCWlmIChXQVJOX09OKCgoMSA8PCBuZXdfc3RhdGUpICYgYWxsb3dlZF9zdGF0ZXNfYm0pID09IDApKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU1cgQlVHISBGb3JiaWRkZW4gc3RhdGUgY2hhbmdlICV1IC0+ICV1XG4iLAorCQkJb2xkX3N0YXRlLCBuZXdfc3RhdGUpOworCX0KK30KKworCisvKgorICogU2V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgV2lNQVggZGV2aWNlIFt1bmxvY2tpbmcgdmVyc2lvbiBvZgorICogd2ltYXhfc3RhdGVfY2hhbmdlKCkuCisgKi8KK3ZvaWQgX193aW1heF9zdGF0ZV9jaGFuZ2Uoc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2LCBlbnVtIHdpbWF4X3N0IG5ld19zdGF0ZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB3aW1heF9kZXZfdG9fZGV2KHdpbWF4X2Rldik7CisJZW51bSB3aW1heF9zdCBvbGRfc3RhdGUgPSB3aW1heF9kZXYtPnN0YXRlOworCXN0cnVjdCBza19idWZmICpzdGNoX3NrYjsKKwl2b2lkICpoZWFkZXI7CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKHdpbWF4X2RldiAlcCBuZXdfc3RhdGUgJXUgW29sZCAldV0pXG4iLAorCQkgIHdpbWF4X2RldiwgbmV3X3N0YXRlLCBvbGRfc3RhdGUpOworCisJaWYgKFdBUk5fT04obmV3X3N0YXRlID49IF9fV0lNQVhfU1RfSU5WQUxJRCkpIHsKKwkJZGV2X2VycihkZXYsICJTVyBCVUc6IHJlcXVlc3RpbmcgaW52YWxpZCBzdGF0ZSAldVxuIiwKKwkJCW5ld19zdGF0ZSk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAob2xkX3N0YXRlID09IG5ld19zdGF0ZSkKKwkJZ290byBvdXQ7CisJaGVhZGVyID0gTlVMTDsJLyogZ2NjIGNvbXBsYWlucz8gY2FuJ3QgZ3JvayB3aHkgKi8KKwlzdGNoX3NrYiA9IHdpbWF4X2dubF9yZV9zdGF0ZV9jaGFuZ2VfYWxsb2MoCisJCXdpbWF4X2RldiwgbmV3X3N0YXRlLCBvbGRfc3RhdGUsICZoZWFkZXIpOworCisJLyogVmVyaWZ5IHRoZSBzdGF0ZSB0cmFuc2l0aW9uIGFuZCBkbyBleGl0LWZyb20tc3RhdGUgYWN0aW9ucyAqLworCXN3aXRjaCAob2xkX3N0YXRlKSB7CisJY2FzZSBfX1dJTUFYX1NUX05VTEw6CisJCV9fY2hlY2tfbmV3X3N0YXRlKG9sZF9zdGF0ZSwgbmV3X3N0YXRlLAorCQkJCSAgMSA8PCBXSU1BWF9TVF9ET1dOKTsKKwkJYnJlYWs7CisJY2FzZSBXSU1BWF9TVF9ET1dOOgorCQlfX2NoZWNrX25ld19zdGF0ZShvbGRfc3RhdGUsIG5ld19zdGF0ZSwKKwkJCQkgIDEgPDwgX19XSU1BWF9TVF9RVUlFU0NJTkcKKwkJCQkgIHwgMSA8PCBXSU1BWF9TVF9VTklOSVRJQUxJWkVECisJCQkJICB8IDEgPDwgV0lNQVhfU1RfUkFESU9fT0ZGKTsKKwkJYnJlYWs7CisJY2FzZSBfX1dJTUFYX1NUX1FVSUVTQ0lORzoKKwkJX19jaGVja19uZXdfc3RhdGUob2xkX3N0YXRlLCBuZXdfc3RhdGUsIDEgPDwgV0lNQVhfU1RfRE9XTik7CisJCWJyZWFrOworCWNhc2UgV0lNQVhfU1RfVU5JTklUSUFMSVpFRDoKKwkJX19jaGVja19uZXdfc3RhdGUob2xkX3N0YXRlLCBuZXdfc3RhdGUsCisJCQkJICAxIDw8IF9fV0lNQVhfU1RfUVVJRVNDSU5HCisJCQkJICB8IDEgPDwgV0lNQVhfU1RfUkFESU9fT0ZGKTsKKwkJYnJlYWs7CisJY2FzZSBXSU1BWF9TVF9SQURJT19PRkY6CisJCV9fY2hlY2tfbmV3X3N0YXRlKG9sZF9zdGF0ZSwgbmV3X3N0YXRlLAorCQkJCSAgMSA8PCBfX1dJTUFYX1NUX1FVSUVTQ0lORworCQkJCSAgfCAxIDw8IFdJTUFYX1NUX1JFQURZKTsKKwkJYnJlYWs7CisJY2FzZSBXSU1BWF9TVF9SRUFEWToKKwkJX19jaGVja19uZXdfc3RhdGUob2xkX3N0YXRlLCBuZXdfc3RhdGUsCisJCQkJICAxIDw8IF9fV0lNQVhfU1RfUVVJRVNDSU5HCisJCQkJICB8IDEgPDwgV0lNQVhfU1RfUkFESU9fT0ZGCisJCQkJICB8IDEgPDwgV0lNQVhfU1RfU0NBTk5JTkcKKwkJCQkgIHwgMSA8PCBXSU1BWF9TVF9DT05ORUNUSU5HCisJCQkJICB8IDEgPDwgV0lNQVhfU1RfQ09OTkVDVEVEKTsKKwkJYnJlYWs7CisJY2FzZSBXSU1BWF9TVF9TQ0FOTklORzoKKwkJX19jaGVja19uZXdfc3RhdGUob2xkX3N0YXRlLCBuZXdfc3RhdGUsCisJCQkJICAxIDw8IF9fV0lNQVhfU1RfUVVJRVNDSU5HCisJCQkJICB8IDEgPDwgV0lNQVhfU1RfUkFESU9fT0ZGCisJCQkJICB8IDEgPDwgV0lNQVhfU1RfUkVBRFkKKwkJCQkgIHwgMSA8PCBXSU1BWF9TVF9DT05ORUNUSU5HCisJCQkJICB8IDEgPDwgV0lNQVhfU1RfQ09OTkVDVEVEKTsKKwkJYnJlYWs7CisJY2FzZSBXSU1BWF9TVF9DT05ORUNUSU5HOgorCQlfX2NoZWNrX25ld19zdGF0ZShvbGRfc3RhdGUsIG5ld19zdGF0ZSwKKwkJCQkgIDEgPDwgX19XSU1BWF9TVF9RVUlFU0NJTkcKKwkJCQkgIHwgMSA8PCBXSU1BWF9TVF9SQURJT19PRkYKKwkJCQkgIHwgMSA8PCBXSU1BWF9TVF9SRUFEWQorCQkJCSAgfCAxIDw8IFdJTUFYX1NUX1NDQU5OSU5HCisJCQkJICB8IDEgPDwgV0lNQVhfU1RfQ09OTkVDVEVEKTsKKwkJYnJlYWs7CisJY2FzZSBXSU1BWF9TVF9DT05ORUNURUQ6CisJCV9fY2hlY2tfbmV3X3N0YXRlKG9sZF9zdGF0ZSwgbmV3X3N0YXRlLAorCQkJCSAgMSA8PCBfX1dJTUFYX1NUX1FVSUVTQ0lORworCQkJCSAgfCAxIDw8IFdJTUFYX1NUX1JBRElPX09GRgorCQkJCSAgfCAxIDw8IFdJTUFYX1NUX1JFQURZKTsKKwkJbmV0aWZfdHhfZGlzYWJsZSh3aW1heF9kZXYtPm5ldF9kZXYpOworCQluZXRpZl9jYXJyaWVyX29mZih3aW1heF9kZXYtPm5ldF9kZXYpOworCQlicmVhazsKKwljYXNlIF9fV0lNQVhfU1RfSU5WQUxJRDoKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRldiwgIlNXIEJVRzogd2ltYXhfZGV2ICVwIGlzIGluIHVua25vd24gc3RhdGUgJXVcbiIsCisJCQl3aW1heF9kZXYsIHdpbWF4X2Rldi0+c3RhdGUpOworCQlXQVJOX09OKDEpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBFeGVjdXRlIHRoZSBhY3Rpb25zIG9mIGVudHJ5IHRvIHRoZSBuZXcgc3RhdGUgKi8KKwlzd2l0Y2ggKG5ld19zdGF0ZSkgeworCWNhc2UgX19XSU1BWF9TVF9OVUxMOgorCQlkZXZfZXJyKGRldiwgIlNXIEJVRzogd2ltYXhfZGV2ICVwIGVudGVyaW5nIE5VTEwgc3RhdGUgIgorCQkJImZyb20gJXVcbiIsIHdpbWF4X2Rldiwgd2ltYXhfZGV2LT5zdGF0ZSk7CisJCVdBUk5fT04oMSk7CQkvKiBOb2JvZHkgY2FuIGVudGVyIHRoaXMgc3RhdGUgKi8KKwkJYnJlYWs7CisJY2FzZSBXSU1BWF9TVF9ET1dOOgorCQlicmVhazsKKwljYXNlIF9fV0lNQVhfU1RfUVVJRVNDSU5HOgorCQlicmVhazsKKwljYXNlIFdJTUFYX1NUX1VOSU5JVElBTElaRUQ6CisJCWJyZWFrOworCWNhc2UgV0lNQVhfU1RfUkFESU9fT0ZGOgorCQlicmVhazsKKwljYXNlIFdJTUFYX1NUX1JFQURZOgorCQlicmVhazsKKwljYXNlIFdJTUFYX1NUX1NDQU5OSU5HOgorCQlicmVhazsKKwljYXNlIFdJTUFYX1NUX0NPTk5FQ1RJTkc6CisJCWJyZWFrOworCWNhc2UgV0lNQVhfU1RfQ09OTkVDVEVEOgorCQluZXRpZl9jYXJyaWVyX29uKHdpbWF4X2Rldi0+bmV0X2Rldik7CisJCW5ldGlmX3dha2VfcXVldWUod2ltYXhfZGV2LT5uZXRfZGV2KTsKKwkJYnJlYWs7CisJY2FzZSBfX1dJTUFYX1NUX0lOVkFMSUQ6CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCV9fd2ltYXhfc3RhdGVfc2V0KHdpbWF4X2RldiwgbmV3X3N0YXRlKTsKKwlpZiAoc3RjaF9za2IpCisJCXdpbWF4X2dubF9yZV9zdGF0ZV9jaGFuZ2Vfc2VuZCh3aW1heF9kZXYsIHN0Y2hfc2tiLCBoZWFkZXIpOworb3V0OgorCWRfZm5lbmQoMywgZGV2LCAiKHdpbWF4X2RldiAlcCBuZXdfc3RhdGUgJXUgW29sZCAldV0pID0gdm9pZFxuIiwKKwkJd2ltYXhfZGV2LCBuZXdfc3RhdGUsIG9sZF9zdGF0ZSk7CisJcmV0dXJuOworfQorCisKKy8qKgorICogd2ltYXhfc3RhdGVfY2hhbmdlIC0gU2V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgV2lNQVggZGV2aWNlCisgKgorICogQHdpbWF4X2RldjogV2lNQVggZGV2aWNlIGRlc2NyaXB0b3IgKHByb3Blcmx5IHJlZmVyZW5jZWQpCisgKiBAbmV3X3N0YXRlOiBOZXcgc3RhdGUgdG8gc3dpdGNoIHRvCisgKgorICogVGhpcyBpbXBsZW1lbnRzIHRoZSBzdGF0ZSBjaGFuZ2VzIGZvciB0aGUgd2ltYXggZGV2aWNlcy4gSXQgd2lsbAorICoKKyAqIC0gdmVyaWZ5IHRoYXQgdGhlIHN0YXRlIHRyYW5zaXRpb24gaXMgbGVnYWwgKGZvciBub3cgaXQnbGwganVzdAorICogICBwcmludCBhIHdhcm5pbmcgaWYgbm90KSBhY2NvcmRpbmcgdG8gdGhlIHRhYmxlIGluCisgKiAgIGxpbnV4L3dpbWF4LmgncyBkb2N1bWVudGF0aW9uIGZvciAnZW51bSB3aW1heF9zdCcuCisgKgorICogLSBwZXJmb3JtIHRoZSBhY3Rpb25zIG5lZWRlZCBmb3IgbGVhdmluZyB0aGUgY3VycmVudCBzdGF0ZSBhbmQKKyAqICAgd2hpY2hldmVyIGFyZSBuZWVkZWQgZm9yIGVudGVyaW5nIHRoZSBuZXcgc3RhdGUuCisgKgorICogLSBpc3N1ZSBhIHJlcG9ydCB0byB1c2VyIHNwYWNlIGluZGljYXRpbmcgdGhlIG5ldyBzdGF0ZSAoYW5kIGFuCisgKiAgIG9wdGlvbmFsIHBheWxvYWQgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbmV3IHN0YXRlKS4KKyAqCisgKiBOT1RFOiBAd2ltYXhfZGV2IG11c3QgYmUgbG9ja2VkCisgKi8KK3ZvaWQgd2ltYXhfc3RhdGVfY2hhbmdlKHN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldiwgZW51bSB3aW1heF9zdCBuZXdfc3RhdGUpCit7CisJbXV0ZXhfbG9jaygmd2ltYXhfZGV2LT5tdXRleCk7CisJX193aW1heF9zdGF0ZV9jaGFuZ2Uod2ltYXhfZGV2LCBuZXdfc3RhdGUpOworCW11dGV4X3VubG9jaygmd2ltYXhfZGV2LT5tdXRleCk7CisJcmV0dXJuOworfQorRVhQT1JUX1NZTUJPTF9HUEwod2ltYXhfc3RhdGVfY2hhbmdlKTsKKworCisvKioKKyAqIHdpbWF4X3N0YXRlX2dldCgpIC0gUmV0dXJuIHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgV2lNQVggZGV2aWNlCisgKgorICogQHdpbWF4X2RldjogV2lNQVggZGV2aWNlIGRlc2NyaXB0b3IKKyAqCisgKiBSZXR1cm5zOiBDdXJyZW50IHN0YXRlIG9mIHRoZSBkZXZpY2UgYWNjb3JkaW5nIHRvIGl0cyBkcml2ZXIuCisgKi8KK2VudW0gd2ltYXhfc3Qgd2ltYXhfc3RhdGVfZ2V0KHN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldikKK3sKKwllbnVtIHdpbWF4X3N0IHN0YXRlOworCW11dGV4X2xvY2soJndpbWF4X2Rldi0+bXV0ZXgpOworCXN0YXRlID0gd2ltYXhfZGV2LT5zdGF0ZTsKKwltdXRleF91bmxvY2soJndpbWF4X2Rldi0+bXV0ZXgpOworCXJldHVybiBzdGF0ZTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdpbWF4X3N0YXRlX2dldCk7CisKKworLyoqCisgKiB3aW1heF9kZXZfaW5pdCAtIGluaXRpYWxpemUgYSBuZXdseSBhbGxvY2F0ZWQgaW5zdGFuY2UKKyAqCisgKiBAd2ltYXhfZGV2OiBXaU1BWCBkZXZpY2UgZGVzY3JpcHRvciB0byBpbml0aWFsaXplLgorICoKKyAqIEluaXRpYWxpemVzIGZpZWxkcyBvZiBhIGZyZXNobHkgYWxsb2NhdGVkIEB3aW1heF9kZXYgaW5zdGFuY2UuIFRoaXMKKyAqIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBhZnRlciBhbGxvY2F0aW9uLCB0aGUgbWVtb3J5IG9jY3VwaWVkIGJ5CisgKiBAd2ltYXhfZGV2IHdhcyB6ZXJvZWQuCisgKi8KK3ZvaWQgd2ltYXhfZGV2X2luaXQoc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2KQoreworCUlOSVRfTElTVF9IRUFEKCZ3aW1heF9kZXYtPmlkX3RhYmxlX25vZGUpOworCV9fd2ltYXhfc3RhdGVfc2V0KHdpbWF4X2RldiwgV0lNQVhfU1RfVU5JTklUSUFMSVpFRCk7CisJbXV0ZXhfaW5pdCgmd2ltYXhfZGV2LT5tdXRleCk7CisJbXV0ZXhfaW5pdCgmd2ltYXhfZGV2LT5tdXRleF9yZXNldCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh3aW1heF9kZXZfaW5pdCk7CisKKy8qCisgKiBUaGlzIGV4dGVybiBpcyBkZWNsYXJlZCBoZXJlIGJlY2F1c2UgaXQncyBlYXNpZXIgdG8ga2VlcCB0cmFjayAtLQorICogYm90aCBkZWNsYXJhdGlvbnMgYXJlIGEgbGlzdCBvZiB0aGUgc2FtZQorICovCitleHRlcm4gc3RydWN0IGdlbmxfb3BzCisJd2ltYXhfZ25sX21zZ19mcm9tX3VzZXIsCisJd2ltYXhfZ25sX3Jlc2V0LAorCXdpbWF4X2dubF9yZmtpbGw7CisKK3N0YXRpYworc3RydWN0IGdlbmxfb3BzICp3aW1heF9nbmxfb3BzW10gPSB7CisJJndpbWF4X2dubF9tc2dfZnJvbV91c2VyLAorCSZ3aW1heF9nbmxfcmVzZXQsCisJJndpbWF4X2dubF9yZmtpbGwsCit9OworCisKK3N0YXRpYworc2l6ZV90IHdpbWF4X2FkZHJfc2NucHJpbnQoY2hhciAqYWRkcl9zdHIsIHNpemVfdCBhZGRyX3N0cl9zaXplLAorCQkJICAgdW5zaWduZWQgY2hhciAqYWRkciwgc2l6ZV90IGFkZHJfbGVuKQoreworCXVuc2lnbmVkIGNudCwgdG90YWw7CisJZm9yICh0b3RhbCA9IGNudCA9IDA7IGNudCA8IGFkZHJfbGVuOyBjbnQrKykKKwkJdG90YWwgKz0gc2NucHJpbnRmKGFkZHJfc3RyICsgdG90YWwsIGFkZHJfc3RyX3NpemUgLSB0b3RhbCwKKwkJCQkgICAiJTAyeCVjIiwgYWRkcltjbnRdLAorCQkJCSAgIGNudCA9PSBhZGRyX2xlbiAtIDEgPyAnXDAnIDogJzonKTsKKwlyZXR1cm4gdG90YWw7Cit9CisKKworLyoqCisgKiB3aW1heF9kZXZfYWRkIC0gUmVnaXN0ZXIgYSBuZXcgV2lNQVggZGV2aWNlCisgKgorICogQHdpbWF4X2RldjogV2lNQVggZGV2aWNlIGRlc2NyaXB0b3IgKGFzIGVtYmVkZGVkIGluIHlvdXIgQG5ldF9kZXYncworICogICAgIHByaXYgZGF0YSkuIFlvdSBtdXN0IGhhdmUgY2FsbGVkIHdpbWF4X2Rldl9pbml0KCkgb24gaXQgYmVmb3JlLgorICoKKyAqIEBuZXRfZGV2OiBuZXQgZGV2aWNlIHRoZSBAd2ltYXhfZGV2IGlzIGFzc29jaWF0ZWQgd2l0aC4gVGhlCisgKiAgICAgZnVuY3Rpb24gZXhwZWN0cyBTRVRfTkVUREVWX0RFVigpIGFuZCByZWdpc3Rlcl9uZXRkZXYoKSB3ZXJlCisgKiAgICAgYWxyZWFkeSBjYWxsZWQgb24gaXQuCisgKgorICogUmVnaXN0ZXJzIHRoZSBuZXcgV2lNQVggZGV2aWNlLCBzZXRzIHVwIHRoZSB1c2VyLWtlcm5lbCBjb250cm9sCisgKiBpbnRlcmZhY2UgKGdlbmVyaWMgbmV0bGluaykgYW5kIGNvbW1vbiBXaU1BWCBpbmZyYXN0cnVjdHVyZS4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIHBhcnRzIHRoYXQgd2lsbCBhbGxvdyBpbnRlcmFjdGlvbiB3aXRoIHVzZXIgc3BhY2UgYXJlCisgKiBzZXR1cCBhdCB0aGUgdmVyeSBlbmQsIHdoZW4gdGhlIHJlc3QgaXMgaW4gcGxhY2UsIGFzIG9uY2UgdGhhdAorICogaGFwcGVucywgdGhlIGRyaXZlciBtaWdodCBnZXQgdXNlciBzcGFjZSBjb250cm9sIHJlcXVlc3RzIHZpYQorICogbmV0bGluayBvciBmcm9tIGRlYnVnZnMgdGhhdCBtaWdodCB0cmFuc2xhdGUgaW50byBjYWxscyBpbnRvCisgKiB3aW1heF9kZXYtPm9wXyooKS4KKyAqLworaW50IHdpbWF4X2Rldl9hZGQoc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IG5ldF9kZXYtPmRldi5wYXJlbnQ7CisJY2hhciBhZGRyX3N0clszMl07CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKHdpbWF4X2RldiAlcCBuZXRfZGV2ICVwKVxuIiwgd2ltYXhfZGV2LCBuZXRfZGV2KTsKKworCS8qIERvIHRoZSBSRktJTEwgc2V0dXAgYmVmb3JlIGxvY2tpbmcsIGFzIFJGS0lMTCB3aWxsIGNhbGwKKwkgKiBpbnRvIG91ciBmdW5jdGlvbnMuICovCisJd2ltYXhfZGV2LT5uZXRfZGV2ID0gbmV0X2RldjsKKwlyZXN1bHQgPSB3aW1heF9yZmtpbGxfYWRkKHdpbWF4X2Rldik7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gZXJyb3JfcmZraWxsX2FkZDsKKworCS8qIFNldCB1cCB1c2VyLXNwYWNlIGludGVyYWN0aW9uICovCisJbXV0ZXhfbG9jaygmd2ltYXhfZGV2LT5tdXRleCk7CisJd2ltYXhfaWRfdGFibGVfYWRkKHdpbWF4X2Rldik7CisJcmVzdWx0ID0gd2ltYXhfZGVidWdmc19hZGQod2ltYXhfZGV2KTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImNhbm5vdCBpbml0aWFsaXplIGRlYnVnZnM6ICVkXG4iLAorCQkJcmVzdWx0KTsKKwkJZ290byBlcnJvcl9kZWJ1Z2ZzX2FkZDsKKwl9CisKKwlfX3dpbWF4X3N0YXRlX3NldCh3aW1heF9kZXYsIFdJTUFYX1NUX0RPV04pOworCW11dGV4X3VubG9jaygmd2ltYXhfZGV2LT5tdXRleCk7CisKKwl3aW1heF9hZGRyX3NjbnByaW50KGFkZHJfc3RyLCBzaXplb2YoYWRkcl9zdHIpLAorCQkJICAgIG5ldF9kZXYtPmRldl9hZGRyLCBuZXRfZGV2LT5hZGRyX2xlbik7CisJZGV2X2VycihkZXYsICJXaU1BWCBpbnRlcmZhY2UgJXMgKCVzKSByZWFkeVxuIiwKKwkJbmV0X2Rldi0+bmFtZSwgYWRkcl9zdHIpOworCWRfZm5lbmQoMywgZGV2LCAiKHdpbWF4X2RldiAlcCBuZXRfZGV2ICVwKSA9IDBcbiIsIHdpbWF4X2RldiwgbmV0X2Rldik7CisJcmV0dXJuIDA7CisKK2Vycm9yX2RlYnVnZnNfYWRkOgorCXdpbWF4X2lkX3RhYmxlX3JtKHdpbWF4X2Rldik7CisJbXV0ZXhfdW5sb2NrKCZ3aW1heF9kZXYtPm11dGV4KTsKKwl3aW1heF9yZmtpbGxfcm0od2ltYXhfZGV2KTsKK2Vycm9yX3Jma2lsbF9hZGQ6CisJZF9mbmVuZCgzLCBkZXYsICIod2ltYXhfZGV2ICVwIG5ldF9kZXYgJXApID0gJWRcbiIsCisJCXdpbWF4X2RldiwgbmV0X2RldiwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorRVhQT1JUX1NZTUJPTF9HUEwod2ltYXhfZGV2X2FkZCk7CisKKworLyoqCisgKiB3aW1heF9kZXZfcm0gLSBVbnJlZ2lzdGVyIGFuIGV4aXN0aW5nIFdpTUFYIGRldmljZQorICoKKyAqIEB3aW1heF9kZXY6IFdpTUFYIGRldmljZSBkZXNjcmlwdG9yCisgKgorICogVW5yZWdpc3RlcnMgYSBXaU1BWCBkZXZpY2UgcHJldmlvdXNseSByZWdpc3RlcmVkIGZvciB1c2Ugd2l0aAorICogd2ltYXhfYWRkX3JtKCkuCisgKgorICogSU1QT1JUQU5UISBNdXN0IGNhbGwgYmVmb3JlIGNhbGxpbmcgdW5yZWdpc3Rlcl9uZXRkZXYoKS4KKyAqCisgKiBBZnRlciB0aGlzIGZ1bmN0aW9uIHJldHVybnMsIHlvdSB3aWxsIG5vdCBnZXQgYW55IG1vcmUgdXNlciBzcGFjZQorICogY29udHJvbCByZXF1ZXN0cyAodmlhIG5ldGxpbmsgb3IgZGVidWdmcykgYW5kIHRodXMgdG8gd2ltYXhfZGV2LT5vcHMuCisgKgorICogUmVlbnRyYW5jeSBjb250cm9sIGlzIGVuc3VyZWQgYnkgc2V0dGluZyB0aGUgc3RhdGUgdG8KKyAqICVfX1dJTUFYX1NUX1FVSUVTQ0lORy4gcmZraWxsIG9wZXJhdGlvbnMgY29taW5nIHRocm91Z2gKKyAqIHdpbWF4XypyZmtpbGwqKCkgd2lsbCBiZSBzdG9wcGVkIGJ5IHRoZSBxdWllc2Npbmcgc3RhdGU7IG9wcyBjb21pbmcKKyAqIGZyb20gdGhlIHJma2lsbCBzdWJzeXN0ZW0gd2lsbCBiZSBzdG9wcGVkIGJ5IHRoZSBzdXBwb3J0IGJlaW5nCisgKiByZW1vdmVkIGJ5IHdpbWF4X3Jma2lsbF9ybSgpLgorICovCit2b2lkIHdpbWF4X2Rldl9ybShzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYpCit7CisJZF9mbnN0YXJ0KDMsIE5VTEwsICIod2ltYXhfZGV2ICVwKVxuIiwgd2ltYXhfZGV2KTsKKworCW11dGV4X2xvY2soJndpbWF4X2Rldi0+bXV0ZXgpOworCV9fd2ltYXhfc3RhdGVfY2hhbmdlKHdpbWF4X2RldiwgX19XSU1BWF9TVF9RVUlFU0NJTkcpOworCXdpbWF4X2RlYnVnZnNfcm0od2ltYXhfZGV2KTsKKwl3aW1heF9pZF90YWJsZV9ybSh3aW1heF9kZXYpOworCV9fd2ltYXhfc3RhdGVfY2hhbmdlKHdpbWF4X2RldiwgV0lNQVhfU1RfRE9XTik7CisJbXV0ZXhfdW5sb2NrKCZ3aW1heF9kZXYtPm11dGV4KTsKKwl3aW1heF9yZmtpbGxfcm0od2ltYXhfZGV2KTsKKwlkX2ZuZW5kKDMsIE5VTEwsICIod2ltYXhfZGV2ICVwKSA9IHZvaWRcbiIsIHdpbWF4X2Rldik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh3aW1heF9kZXZfcm0pOworCitzdHJ1Y3QgZ2VubF9mYW1pbHkgd2ltYXhfZ25sX2ZhbWlseSA9IHsKKwkuaWQgPSBHRU5MX0lEX0dFTkVSQVRFLAorCS5uYW1lID0gIldpTUFYIiwKKwkudmVyc2lvbiA9IFdJTUFYX0dOTF9WRVJTSU9OLAorCS5oZHJzaXplID0gMCwKKwkubWF4YXR0ciA9IFdJTUFYX0dOTF9BVFRSX01BWCwKK307CisKK3N0cnVjdCBnZW5sX211bHRpY2FzdF9ncm91cCB3aW1heF9nbmxfbWNnID0geworCS5uYW1lID0gIm1zZyIsCit9OworCisKKworLyogU2h1dGRvd24gdGhlIHdpbWF4IHN0YWNrICovCitzdGF0aWMKK2ludCBfX2luaXQgd2ltYXhfc3Vic3lzX2luaXQodm9pZCkKK3sKKwlpbnQgcmVzdWx0LCBjbnQ7CisKKwlkX2Zuc3RhcnQoNCwgTlVMTCwgIigpXG4iKTsKKwlzbnByaW50Zih3aW1heF9nbmxfZmFtaWx5Lm5hbWUsIHNpemVvZih3aW1heF9nbmxfZmFtaWx5Lm5hbWUpLAorCQkgIldpTUFYIik7CisJcmVzdWx0ID0gZ2VubF9yZWdpc3Rlcl9mYW1pbHkoJndpbWF4X2dubF9mYW1pbHkpOworCWlmICh1bmxpa2VseShyZXN1bHQgPCAwKSkgeworCQlwcmludGsoS0VSTl9FUlIgImNhbm5vdCByZWdpc3RlciBnZW5lcmljIG5ldGxpbmsgZmFtaWx5OiAlZFxuIiwKKwkJICAgICAgIHJlc3VsdCk7CisJCWdvdG8gZXJyb3JfcmVnaXN0ZXJfZmFtaWx5OworCX0KKworCWZvciAoY250ID0gMDsgY250IDwgQVJSQVlfU0laRSh3aW1heF9nbmxfb3BzKTsgY250KyspIHsKKwkJcmVzdWx0ID0gZ2VubF9yZWdpc3Rlcl9vcHMoJndpbWF4X2dubF9mYW1pbHksCisJCQkJCSAgIHdpbWF4X2dubF9vcHNbY250XSk7CisJCWRfcHJpbnRmKDQsIE5VTEwsICJyZWdpc3RlcmluZyBnZW5lcmljIG5ldGxpbmsgb3AgY29kZSAiCisJCQkgIiV1OiAlZFxuIiwgd2ltYXhfZ25sX29wc1tjbnRdLT5jbWQsIHJlc3VsdCk7CisJCWlmICh1bmxpa2VseShyZXN1bHQgPCAwKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgcmVnaXN0ZXIgZ2VuZXJpYyBuZXRsaW5rIG9wICIKKwkJCSAgICAgICAiY29kZSAldTogJWRcbiIsCisJCQkgICAgICAgd2ltYXhfZ25sX29wc1tjbnRdLT5jbWQsIHJlc3VsdCk7CisJCQlnb3RvIGVycm9yX3JlZ2lzdGVyX29wczsKKwkJfQorCX0KKworCXJlc3VsdCA9IGdlbmxfcmVnaXN0ZXJfbWNfZ3JvdXAoJndpbWF4X2dubF9mYW1pbHksICZ3aW1heF9nbmxfbWNnKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBlcnJvcl9tY19ncm91cDsKKwlkX2ZuZW5kKDQsIE5VTEwsICIoKSA9IDBcbiIpOworCXJldHVybiAwOworCitlcnJvcl9tY19ncm91cDoKK2Vycm9yX3JlZ2lzdGVyX29wczoKKwlmb3IgKGNudC0tOyBjbnQgPj0gMDsgY250LS0pCisJCWdlbmxfdW5yZWdpc3Rlcl9vcHMoJndpbWF4X2dubF9mYW1pbHksCisJCQkJICAgIHdpbWF4X2dubF9vcHNbY250XSk7CisJZ2VubF91bnJlZ2lzdGVyX2ZhbWlseSgmd2ltYXhfZ25sX2ZhbWlseSk7CitlcnJvcl9yZWdpc3Rlcl9mYW1pbHk6CisJZF9mbmVuZCg0LCBOVUxMLCAiKCkgPSAlZFxuIiwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworCit9Cittb2R1bGVfaW5pdCh3aW1heF9zdWJzeXNfaW5pdCk7CisKKworLyogU2h1dGRvd24gdGhlIHdpbWF4IHN0YWNrICovCitzdGF0aWMKK3ZvaWQgX19leGl0IHdpbWF4X3N1YnN5c19leGl0KHZvaWQpCit7CisJaW50IGNudDsKKwl3aW1heF9pZF90YWJsZV9yZWxlYXNlKCk7CisJZ2VubF91bnJlZ2lzdGVyX21jX2dyb3VwKCZ3aW1heF9nbmxfZmFtaWx5LCAmd2ltYXhfZ25sX21jZyk7CisJZm9yIChjbnQgPSBBUlJBWV9TSVpFKHdpbWF4X2dubF9vcHMpIC0gMTsgY250ID49IDA7IGNudC0tKQorCQlnZW5sX3VucmVnaXN0ZXJfb3BzKCZ3aW1heF9nbmxfZmFtaWx5LAorCQkJCSAgICB3aW1heF9nbmxfb3BzW2NudF0pOworCWdlbmxfdW5yZWdpc3Rlcl9mYW1pbHkoJndpbWF4X2dubF9mYW1pbHkpOworfQorbW9kdWxlX2V4aXQod2ltYXhfc3Vic3lzX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMaW51eCBXaU1BWCBzdGFjayIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9uZXQvd2ltYXgvd2ltYXgtaW50ZXJuYWwuaCBiL25ldC93aW1heC93aW1heC1pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNzQzZDIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvd2ltYXgvd2ltYXgtaW50ZXJuYWwuaApAQCAtMCwwICsxLDkxIEBACisvKgorICogTGludXggV2lNQVgKKyAqIEludGVybmFsIEFQSSBmb3Iga2VybmVsIHNwYWNlIFdpTUFYIHN0YWNrCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKgorICoKKyAqIFRoaXMgaGVhZGVyIGZpbGUgaXMgZm9yIGRlY2xhcmF0aW9ucyBhbmQgZGVmaW5pdGlvbnMgaW50ZXJuYWwgdG8KKyAqIHRoZSBXaU1BWCBzdGFjay4gRm9yIHB1YmxpYyBBUElzIGFuZCBkb2N1bWVudGF0aW9uLCBzZWUKKyAqIGluY2x1ZGUvbmV0L3dpbWF4LmggYW5kIGluY2x1ZGUvbGludXgvd2ltYXguaC4KKyAqLworCisjaWZuZGVmIF9fV0lNQVhfSU5URVJOQUxfSF9fCisjZGVmaW5lIF9fV0lNQVhfSU5URVJOQUxfSF9fCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bmV0L3dpbWF4Lmg+CisKKworLyoKKyAqIERlY2lkZSBpZiBhIChsb2NrZWQpIGRldmljZSBpcyByZWFkeSBmb3IgdXNlCisgKgorICogQmVmb3JlIHVzaW5nIHRoZSBkZXZpY2Ugc3RydWN0dXJlLCBpdCBtdXN0IGJlIGxvY2tlZAorICogKHdpbWF4X2Rldi0+bXV0ZXgpLiBBcyB3ZWxsLCBtb3N0IG9wZXJhdGlvbnMgbmVlZCB0byBjYWxsIHRoaXMKKyAqIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHRoZSBzdGF0ZSBpcyB0aGUgcmlnaHQgb25lLgorICoKKyAqIEFuIGVycm9yIHZhbHVlIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIHN0YXRlIGlzIG5vdCB0aGUgcmlnaHQKKyAqIG9uZS4gSW4gdGhhdCBjYXNlLCB0aGUgY2FsbGVyIHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgdGhlIGRldmljZQorICogYW5kIGp1c3QgdW5sb2NrIGl0LgorICovCitzdGF0aWMgaW5saW5lIF9fbXVzdF9jaGVjaworaW50IHdpbWF4X2Rldl9pc19yZWFkeShzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYpCit7CisJaWYgKHdpbWF4X2Rldi0+c3RhdGUgPT0gX19XSU1BWF9TVF9OVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsJLyogRGV2aWNlIGlzIG5vdCBldmVuIHJlZ2lzdGVyZWQhICovCisJaWYgKHdpbWF4X2Rldi0+c3RhdGUgPT0gV0lNQVhfU1RfRE9XTikKKwkJcmV0dXJuIC1FTk9NRURJVU07CisJaWYgKHdpbWF4X2Rldi0+c3RhdGUgPT0gX19XSU1BWF9TVF9RVUlFU0NJTkcpCisJCXJldHVybiAtRVNIVVRET1dOOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgX193aW1heF9zdGF0ZV9zZXQoc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2LCBlbnVtIHdpbWF4X3N0IHN0YXRlKQoreworCXdpbWF4X2Rldi0+c3RhdGUgPSBzdGF0ZTsKK30KK2V4dGVybiB2b2lkIF9fd2ltYXhfc3RhdGVfY2hhbmdlKHN0cnVjdCB3aW1heF9kZXYgKiwgZW51bSB3aW1heF9zdCk7CisKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKK2V4dGVybiBpbnQgd2ltYXhfZGVidWdmc19hZGQoc3RydWN0IHdpbWF4X2RldiAqKTsKK2V4dGVybiB2b2lkIHdpbWF4X2RlYnVnZnNfcm0oc3RydWN0IHdpbWF4X2RldiAqKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCB3aW1heF9kZWJ1Z2ZzX2FkZChzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgd2ltYXhfZGVidWdmc19ybShzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYpIHt9CisjZW5kaWYKKworZXh0ZXJuIHZvaWQgd2ltYXhfaWRfdGFibGVfYWRkKHN0cnVjdCB3aW1heF9kZXYgKik7CitleHRlcm4gc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2X2dldF9ieV9nZW5sX2luZm8oc3RydWN0IGdlbmxfaW5mbyAqLCBpbnQpOworZXh0ZXJuIHZvaWQgd2ltYXhfaWRfdGFibGVfcm0oc3RydWN0IHdpbWF4X2RldiAqKTsKK2V4dGVybiB2b2lkIHdpbWF4X2lkX3RhYmxlX3JlbGVhc2Uodm9pZCk7CisKK2V4dGVybiBpbnQgd2ltYXhfcmZraWxsX2FkZChzdHJ1Y3Qgd2ltYXhfZGV2ICopOworZXh0ZXJuIHZvaWQgd2ltYXhfcmZraWxsX3JtKHN0cnVjdCB3aW1heF9kZXYgKik7CisKK2V4dGVybiBzdHJ1Y3QgZ2VubF9mYW1pbHkgd2ltYXhfZ25sX2ZhbWlseTsKK2V4dGVybiBzdHJ1Y3QgZ2VubF9tdWx0aWNhc3RfZ3JvdXAgd2ltYXhfZ25sX21jZzsKKworI2VuZGlmIC8qICNpZmRlZiBfX0tFUk5FTF9fICovCisjZW5kaWYgLyogI2lmbmRlZiBfX1dJTUFYX0lOVEVSTkFMX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3dleHQuYyBiL25ldC93aXJlbGVzcy93ZXh0LmMKaW5kZXggZTQ5YTJkMS4uY2I2YTViYiAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL3dleHQuYworKysgYi9uZXQvd2lyZWxlc3Mvd2V4dC5jCkBAIC0xMDU1LDggKzEwNTUsOCBAQAogCQkJcmV0dXJuIHByaXZhdGUoZGV2LCBpd3IsIGNtZCwgaW5mbywgaGFuZGxlcik7CiAJfQogCS8qIE9sZCBkcml2ZXIgQVBJIDogY2FsbCBkcml2ZXIgaW9jdGwgaGFuZGxlciAqLwotCWlmIChkZXYtPmRvX2lvY3RsKQotCQlyZXR1cm4gZGV2LT5kb19pb2N0bChkZXYsIGlmciwgY21kKTsKKwlpZiAoZGV2LT5uZXRkZXZfb3BzLT5uZG9fZG9faW9jdGwpCisJCXJldHVybiBkZXYtPm5ldGRldl9vcHMtPm5kb19kb19pb2N0bChkZXYsIGlmciwgY21kKTsKIAlyZXR1cm4gLUVPUE5PVFNVUFA7CiB9CiAKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZmlybXdhcmVfY2xhc3MvZmlybXdhcmVfc2FtcGxlX2RyaXZlci5jIGIvc2FtcGxlcy9maXJtd2FyZV9jbGFzcy9maXJtd2FyZV9zYW1wbGVfZHJpdmVyLmMKaW5kZXggMTExMTRmMy4uMjE5YTI5OCAxMDA2NDQKLS0tIGEvc2FtcGxlcy9maXJtd2FyZV9jbGFzcy9maXJtd2FyZV9zYW1wbGVfZHJpdmVyLmMKKysrIGIvc2FtcGxlcy9maXJtd2FyZV9jbGFzcy9maXJtd2FyZV9zYW1wbGVfZHJpdmVyLmMKQEAgLTEwMCw3ICsxMDAsNyBAQAogCQkgICAgICAgIiByZXF1ZXN0X2Zpcm13YXJlX25vd2FpdCBmYWlsZWRcbiIpOwogfQogCi1zdGF0aWMgaW50IHNhbXBsZV9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBzYW1wbGVfaW5pdCh2b2lkKQogewogCWRldmljZV9pbml0aWFsaXplKCZnaG9zdF9kZXZpY2UpOwogCS8qIHNpbmNlIHRoZXJlIGlzIG5vIHJlYWwgaGFyZHdhcmUgaW5zZXJ0aW9uIEkganVzdCBjYWxsIHRoZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9rb2JqZWN0L2tvYmplY3QtZXhhbXBsZS5jIGIvc2FtcGxlcy9rb2JqZWN0L2tvYmplY3QtZXhhbXBsZS5jCmluZGV4IDA4ZDBkM2YuLjhkOWI1NWEgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMva29iamVjdC9rb2JqZWN0LWV4YW1wbGUuYworKysgYi9zYW1wbGVzL2tvYmplY3Qva29iamVjdC1leGFtcGxlLmMKQEAgLTEwMSw3ICsxMDEsNyBAQAogCiBzdGF0aWMgc3RydWN0IGtvYmplY3QgKmV4YW1wbGVfa29iajsKIAotc3RhdGljIGludCBleGFtcGxlX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGV4YW1wbGVfaW5pdCh2b2lkKQogewogCWludCByZXR2YWw7CiAKQEAgLTEyNiw3ICsxMjYsNyBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyB2b2lkIGV4YW1wbGVfZXhpdCh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IGV4YW1wbGVfZXhpdCh2b2lkKQogewogCWtvYmplY3RfcHV0KGV4YW1wbGVfa29iaik7CiB9CmRpZmYgLS1naXQgYS9zYW1wbGVzL2tvYmplY3Qva3NldC1leGFtcGxlLmMgYi9zYW1wbGVzL2tvYmplY3Qva3NldC1leGFtcGxlLmMKaW5kZXggNzM5NWMwYi4uNDViN2Q1NiAxMDA2NDQKLS0tIGEvc2FtcGxlcy9rb2JqZWN0L2tzZXQtZXhhbXBsZS5jCisrKyBiL3NhbXBsZXMva29iamVjdC9rc2V0LWV4YW1wbGUuYwpAQCAtMjI5LDcgKzIyOSw3IEBACiAJa29iamVjdF9wdXQoJmZvby0+a29iaik7CiB9CiAKLXN0YXRpYyBpbnQgZXhhbXBsZV9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBleGFtcGxlX2luaXQodm9pZCkKIHsKIAkvKgogCSAqIENyZWF0ZSBhIGtzZXQgd2l0aCB0aGUgbmFtZSBvZiAia3NldF9leGFtcGxlIiwKQEAgLTI2NCw3ICsyNjQsNyBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgdm9pZCBleGFtcGxlX2V4aXQodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGFtcGxlX2V4aXQodm9pZCkKIHsKIAlkZXN0cm95X2Zvb19vYmooYmF6X29iaik7CiAJZGVzdHJveV9mb29fb2JqKGJhcl9vYmopOwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9tYXJrZXJzL21hcmtlci1leGFtcGxlLmMgYi9zYW1wbGVzL21hcmtlcnMvbWFya2VyLWV4YW1wbGUuYwppbmRleCBlOTBkYzVkLi5lOWNkOWMwIDEwMDY0NAotLS0gYS9zYW1wbGVzL21hcmtlcnMvbWFya2VyLWV4YW1wbGUuYworKysgYi9zYW1wbGVzL21hcmtlcnMvbWFya2VyLWV4YW1wbGUuYwpAQCAtMzAsNyArMzAsNyBAQAogCS5vcGVuID0gbXlfb3BlbiwKIH07CiAKLXN0YXRpYyBpbnQgZXhhbXBsZV9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBleGFtcGxlX2luaXQodm9pZCkKIHsKIAlwcmludGsoS0VSTl9BTEVSVCAiZXhhbXBsZSBpbml0XG4iKTsKIAlwZW50cnlfZXhhbXBsZSA9IHByb2NfY3JlYXRlKCJtYXJrZXItZXhhbXBsZSIsIDA0NDQsIE5VTEwsICZtYXJrX29wcyk7CkBAIC0zOSw3ICszOSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGV4YW1wbGVfZXhpdCh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IGV4YW1wbGVfZXhpdCh2b2lkKQogewogCXByaW50ayhLRVJOX0FMRVJUICJleGFtcGxlIGV4aXRcbiIpOwogCXJlbW92ZV9wcm9jX2VudHJ5KCJtYXJrZXItZXhhbXBsZSIsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy90cmFjZXBvaW50cy90cmFjZXBvaW50LXByb2JlLXNhbXBsZS5jIGIvc2FtcGxlcy90cmFjZXBvaW50cy90cmFjZXBvaW50LXByb2JlLXNhbXBsZS5jCmluZGV4IGUzYTk2NDguLjllNjBlYjYgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvdHJhY2Vwb2ludHMvdHJhY2Vwb2ludC1wcm9iZS1zYW1wbGUuYworKysgYi9zYW1wbGVzL3RyYWNlcG9pbnRzL3RyYWNlcG9pbnQtcHJvYmUtc2FtcGxlLmMKQEAgLTI4LDcgKzI4LDcgQEAKIAlwcmludGsoS0VSTl9JTkZPICJFdmVudCBCIGlzIGVuY291bnRlcmVkXG4iKTsKIH0KIAotaW50IF9faW5pdCB0cF9zYW1wbGVfdHJhY2VfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgdHBfc2FtcGxlX3RyYWNlX2luaXQodm9pZCkKIHsKIAlpbnQgcmV0OwogCkBAIC00Miw3ICs0Miw3IEBACiAKIG1vZHVsZV9pbml0KHRwX3NhbXBsZV90cmFjZV9pbml0KTsKIAotdm9pZCBfX2V4aXQgdHBfc2FtcGxlX3RyYWNlX2V4aXQodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCB0cF9zYW1wbGVfdHJhY2VfZXhpdCh2b2lkKQogewogCXVucmVnaXN0ZXJfdHJhY2Vfc3Vic3lzX2V2ZW50Yihwcm9iZV9zdWJzeXNfZXZlbnRiKTsKIAl1bnJlZ2lzdGVyX3RyYWNlX3N1YnN5c19ldmVudChwcm9iZV9zdWJzeXNfZXZlbnQpOwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy90cmFjZXBvaW50cy90cmFjZXBvaW50LXByb2JlLXNhbXBsZTIuYyBiL3NhbXBsZXMvdHJhY2Vwb2ludHMvdHJhY2Vwb2ludC1wcm9iZS1zYW1wbGUyLmMKaW5kZXggNjg1YTVhYy4uYmUyYTk2MCAxMDA2NDQKLS0tIGEvc2FtcGxlcy90cmFjZXBvaW50cy90cmFjZXBvaW50LXByb2JlLXNhbXBsZTIuYworKysgYi9zYW1wbGVzL3RyYWNlcG9pbnRzL3RyYWNlcG9pbnQtcHJvYmUtc2FtcGxlMi5jCkBAIC0xOCw3ICsxOCw3IEBACiAJCWlub2RlLT5pX2lubyk7CiB9CiAKLWludCBfX2luaXQgdHBfc2FtcGxlX3RyYWNlX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IHRwX3NhbXBsZV90cmFjZV9pbml0KHZvaWQpCiB7CiAJaW50IHJldDsKIApAQCAtMzAsNyArMzAsNyBAQAogCiBtb2R1bGVfaW5pdCh0cF9zYW1wbGVfdHJhY2VfaW5pdCk7CiAKLXZvaWQgX19leGl0IHRwX3NhbXBsZV90cmFjZV9leGl0KHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgdHBfc2FtcGxlX3RyYWNlX2V4aXQodm9pZCkKIHsKIAl1bnJlZ2lzdGVyX3RyYWNlX3N1YnN5c19ldmVudChwcm9iZV9zdWJzeXNfZXZlbnQpOwogCXRyYWNlcG9pbnRfc3luY2hyb25pemVfdW5yZWdpc3RlcigpOwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy90cmFjZXBvaW50cy90cmFjZXBvaW50LXNhbXBsZS5jIGIvc2FtcGxlcy90cmFjZXBvaW50cy90cmFjZXBvaW50LXNhbXBsZS5jCmluZGV4IDAwZDE2OTcuLjY4ZDVkYzAgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvdHJhY2Vwb2ludHMvdHJhY2Vwb2ludC1zYW1wbGUuYworKysgYi9zYW1wbGVzL3RyYWNlcG9pbnRzL3RyYWNlcG9pbnQtc2FtcGxlLmMKQEAgLTMyLDcgKzMyLDcgQEAKIAkub3BlbiA9IG15X29wZW4sCiB9OwogCi1zdGF0aWMgaW50IGV4YW1wbGVfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgZXhhbXBsZV9pbml0KHZvaWQpCiB7CiAJcHJpbnRrKEtFUk5fQUxFUlQgImV4YW1wbGUgaW5pdFxuIik7CiAJcGVudHJ5X2V4YW1wbGUgPSBwcm9jX2NyZWF0ZSgidHJhY2Vwb2ludC1leGFtcGxlIiwgMDQ0NCwgTlVMTCwKQEAgLTQyLDcgKzQyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZXhhbXBsZV9leGl0KHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhhbXBsZV9leGl0KHZvaWQpCiB7CiAJcHJpbnRrKEtFUk5fQUxFUlQgImV4YW1wbGUgZXhpdFxuIik7CiAJcmVtb3ZlX3Byb2NfZW50cnkoInRyYWNlcG9pbnQtZXhhbXBsZSIsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy8uZ2l0aWdub3JlIGIvc2NyaXB0cy8uZ2l0aWdub3JlCmluZGV4IGI5MzlmYmQuLjA5ZTI0MDYgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvLmdpdGlnbm9yZQorKysgYi9zY3JpcHRzLy5naXRpZ25vcmUKQEAgLTEsNiArMSw3IEBACiAjCiAjIEdlbmVyYXRlZCBmaWxlcwogIworaWhleDJmdwogY29ubWFrZWhhc2gKIGthbGxzeW1zCiBwbm10b2xvZ28KZGlmZiAtLWdpdCBhL3NjcmlwdHMvTWFrZWZpbGUgYi9zY3JpcHRzL01ha2VmaWxlCmluZGV4IGFhZmRmMDYuLjAzNTE4MmUgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvTWFrZWZpbGUKKysrIGIvc2NyaXB0cy9NYWtlZmlsZQpAQCAtMiwxMSArMiwxMiBAQAogIyBzY3JpcHRzIGNvbnRhaW5zIHNvdXJjZXMgZm9yIHZhcmlvdXMgaGVscGVyIHByb2dyYW1zIHVzZWQgdGhyb3VnaG91dAogIyB0aGUga2VybmVsIGZvciB0aGUgYnVpbGQgcHJvY2Vzcy4KICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGloZXgyZnc6ICAgICAgIFBhcnNlci9sb2FkZXIgZm9yIElIRVggZm9ybWF0dGVkIGRhdGEKICMga2FsbHN5bXM6ICAgICAgRmluZCBhbGwgc3ltYm9scyBpbiB2bWxpbnV4CiAjIHBubXR0b2xvZ286ICAgIENvbnZlcnQgcG5tIGZpbGVzIHRvIGxvZ28gZmlsZXMKLSMgY29ubWFrZWhhc2g6ICAgQ3JlYXRlIGNoYXJ0YWJsZQogIyBjb25tYWtlaGFzaDoJIENyZWF0ZSBhcnJheXMgZm9yIGluaXRpYWxpemluZyB0aGUga2VybmVsIGNvbnNvbGUgdGFibGVzCiAKK2hvc3Rwcm9ncy15ICAgICAgICAgICAgICAgICAgICAgIDo9IGloZXgyZncKIGhvc3Rwcm9ncy0kKENPTkZJR19LQUxMU1lNUykgICAgICs9IGthbGxzeW1zCiBob3N0cHJvZ3MtJChDT05GSUdfTE9HTykgICAgICAgICArPSBwbm10b2xvZ28KIGhvc3Rwcm9ncy0kKENPTkZJR19WVCkgICAgICAgICAgICs9IGNvbm1ha2VoYXNoCmRpZmYgLS1naXQgYS9zY3JpcHRzL2Jvb3RncmFwaC5wbCBiL3NjcmlwdHMvYm9vdGdyYXBoLnBsCmluZGV4IGYwYWY5YWEuLjBhNDk4ZTMgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvYm9vdGdyYXBoLnBsCisrKyBiL3NjcmlwdHMvYm9vdGdyYXBoLnBsCkBAIC04OCw3ICs4OCw3IEBACiB9CiAKIHByaW50ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgc3RhbmRhbG9uZT1cIm5vXCI/PiBcbiI7Ci1wcmludCAiPHN2ZyB3aWR0aD1cIjEwMDBcIiBoZWlnaHQ9XCIxMDAlXCIgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiI7CitwcmludCAiPHN2ZyB3aWR0aD1cIjIwMDBcIiBoZWlnaHQ9XCIxMDAlXCIgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiI7CiAKIG15IEBzdHlsZXM7CiAKQEAgLTEwNSw4ICsxMDUsOSBAQAogJHN0eWxlc1sxMF0gPSAiZmlsbDpyZ2IoMjU1LDEyOCwyNTUpO2ZpbGwtb3BhY2l0eTowLjU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlOnJnYigwLDAsMCkiOwogJHN0eWxlc1sxMV0gPSAiZmlsbDpyZ2IoMTI4LDI1NSwyNTUpO2ZpbGwtb3BhY2l0eTowLjU7c3Ryb2tlLXdpZHRoOjE7c3Ryb2tlOnJnYigwLDAsMCkiOwogCi1teSAkbXVsdCA9IDk1MC4wIC8gKCRtYXh0aW1lIC0gJGZpcnN0dGltZSk7Ci1teSAkdGhyZXNob2xkID0gKCRtYXh0aW1lIC0gJGZpcnN0dGltZSkgLyA2MC4wOworbXkgJG11bHQgPSAxOTUwLjAgLyAoJG1heHRpbWUgLSAkZmlyc3R0aW1lKTsKK215ICR0aHJlc2hvbGQyID0gKCRtYXh0aW1lIC0gJGZpcnN0dGltZSkgLyAxMjAuMDsKK215ICR0aHJlc2hvbGQgPSAkdGhyZXNob2xkMi8xMDsKIG15ICRzdHlsZWNvdW50ZXIgPSAwOwogbXkgJXJvd3M7CiBteSAkcm93c2NvdW50ID0gMTsKQEAgLTExNiw3ICsxMTcsNyBAQAogCW15ICRkdXJhdGlvbiA9ICRlbmR7JGtleX0gLSAkc3RhcnR7JGtleX07CiAKIAlpZiAoJGR1cmF0aW9uID49ICR0aHJlc2hvbGQpIHsKLQkJbXkgKCRzLCAkczIsICRlLCAkdywgJHksICR5MiwgJHN0eWxlKTsKKwkJbXkgKCRzLCAkczIsICRzMywgJGUsICR3LCAkeSwgJHkyLCAkc3R5bGUpOwogCQlteSAkcGlkID0gJHBpZHN7JGtleX07CiAKIAkJaWYgKCFkZWZpbmVkKCRyb3dzeyRwaWR9KSkgewpAQCAtMTI1LDYgKzEyNiw3IEBACiAJCX0KIAkJJHMgPSAoJHN0YXJ0eyRrZXl9IC0gJGZpcnN0dGltZSkgKiAkbXVsdDsKIAkJJHMyID0gJHMgKyA2OworCQkkczMgPSAkcyArIDE7CiAJCSRlID0gKCRlbmR7JGtleX0gLSAkZmlyc3R0aW1lKSAqICRtdWx0OwogCQkkdyA9ICRlIC0gJHM7CiAKQEAgLTEzOCw3ICsxNDAsMTEgQEAKIAkJfTsKIAogCQlwcmludCAiPHJlY3QgeD1cIiRzXCIgd2lkdGg9XCIkd1wiIHk9XCIkeVwiIGhlaWdodD1cIjE0NVwiIHN0eWxlPVwiJHN0eWxlXCIvPlxuIjsKLQkJcHJpbnQgIjx0ZXh0IHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgkczIsJHkyKSByb3RhdGUoOTApXCI+JGtleTwvdGV4dD5cbiI7CisJCWlmICgkZHVyYXRpb24gPj0gJHRocmVzaG9sZDIpIHsKKwkJCXByaW50ICI8dGV4dCB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoJHMyLCR5Mikgcm90YXRlKDkwKVwiPiRrZXk8L3RleHQ+XG4iOworCQl9IGVsc2UgeworCQkJcHJpbnQgIjx0ZXh0IHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgkczMsJHkyKSByb3RhdGUoOTApXCIgZm9udC1zaXplPVwiM3B0XCI+JGtleTwvdGV4dD5cbiI7CisJCX0KIAl9CiB9CiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvY2hlY2twYXRjaC5wbCBiL3NjcmlwdHMvY2hlY2twYXRjaC5wbAppbmRleCBmODhiYjNlLi43YmVkNGVkIDEwMDc1NQotLS0gYS9zY3JpcHRzL2NoZWNrcGF0Y2gucGwKKysrIGIvc2NyaXB0cy9jaGVja3BhdGNoLnBsCkBAIC0xLDcgKzEsOCBAQAogIyEvdXNyL2Jpbi9wZXJsIC13CiAjIChjKSAyMDAxLCBEYXZlIEpvbmVzLiA8ZGF2ZWpAcmVkaGF0LmNvbT4gKHRoZSBmaWxlIGhhbmRsaW5nIGJpdCkKICMgKGMpIDIwMDUsIEpvZWwgU2Nob3BwIDxqc2Nob3BwQGF1c3Rpbi5pYm0uY29tPiAodGhlIHVnbHkgYml0KQotIyAoYykgMjAwNywgQW5keSBXaGl0Y3JvZnQgPGFwd0B1ay5pYm0uY29tPiAobmV3IGNvbmRpdGlvbnMsIHRlc3Qgc3VpdGUsIGV0YykKKyMgKGMpIDIwMDcsMjAwOCwgQW5keSBXaGl0Y3JvZnQgPGFwd0B1ay5pYm0uY29tPiAobmV3IGNvbmRpdGlvbnMsIHRlc3Qgc3VpdGUpCisjIChjKSAyMDA4LCBBbmR5IFdoaXRjcm9mdCA8YXB3QGNhbm9uaWNhbC5jb20+CiAjIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBMaWNlbnNlIHZlcnNpb24gMgogCiB1c2Ugc3RyaWN0OwpAQCAtOSw3ICsxMCw3IEBACiBteSAkUCA9ICQwOwogJFAgPX4gc0AuKi9AQGc7CiAKLW15ICRWID0gJzAuMjQnOworbXkgJFYgPSAnMC4yNic7CiAKIHVzZSBHZXRvcHQ6OkxvbmcgcXcoOmNvbmZpZyBub19hdXRvX2FiYnJldik7CiAKQEAgLTY4LDcgKzY5LDkgQEAKIG15ICRkYmdfdHlwZSA9IDA7CiBteSAkZGJnX2F0dHIgPSAwOwogZm9yIG15ICRrZXkgKGtleXMgJWRlYnVnKSB7Ci0JZXZhbCAiXCR7ZGJnXyRrZXl9ID0gJyRkZWJ1Z3ska2V5fSc7IgorCSMjIG5vIGNyaXRpYworCWV2YWwgIlwke2RiZ18ka2V5fSA9ICckZGVidWd7JGtleX0nOyI7CisJZGllICIkQCIgaWYgKCRAKTsKIH0KIAogaWYgKCR0ZXJzZSkgewpAQCAtMTE2LDcgKzExOSw4IEBACiAJCQlfXyg/Om1lbXxjcHV8ZGV2fCkoPzppbml0ZGF0YXxpbml0KXwKIAkJCV9fX19jYWNoZWxpbmVfYWxpZ25lZHwKIAkJCV9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXB8Ci0JCQlfX19fY2FjaGVsaW5lX2ludGVybm9kZWFsaWduZWRfaW5fc21wCisJCQlfX19fY2FjaGVsaW5lX2ludGVybm9kZWFsaWduZWRfaW5fc21wfAorCQkJX193ZWFrCiAJCSAgfXg7CiBvdXIgJE1vZGlmaWVyOwogb3VyICRJbmxpbmUJPSBxcntpbmxpbmV8X19hbHdheXNfaW5saW5lfG5vaW5saW5lfTsKQEAgLTEyNSw2ICsxMjksNyBAQAogCiBvdXIgJENvbnN0YW50CT0gcXJ7KD86WzAtOV0rfDB4WzAtOWEtZkEtRl0rKVtVTF0qfTsKIG91ciAkQXNzaWdubWVudAk9IHFyeyg/OlwqXD18Lz18JT18XCs9fC09fDw8PXw+Pj18Jj18XF49fFx8PXw9KX07CitvdXIgJENvbXBhcmUgICAgPSBxcns8PXw+PXw9PXwhPXw8fD59Owogb3VyICRPcGVyYXRvcnMJPSBxcnsKIAkJCTw9fD49fD09fCE9fAogCQkJPT58LT58PDx8Pj58PHw+fCF8fnwKQEAgLTE5MCw3ICsxOTUsNyBAQAogCQkgIH14OwogCSRUeXBlCT0gcXJ7CiAJCQkkTm9ucHRyVHlwZQotCQkJKD86XHMqXCorXHMqY29uc3R8XHMqXCorfCg/OlxzKlxbXHMqXF0pKyk/CisJCQkoPzpbXHNcKl0rXHMqY29uc3R8W1xzXCpdK3woPzpccypcW1xzKlxdKSspPwogCQkJKD86XHMrJElubGluZXxccyskTW9kaWZpZXIpKgogCQkgIH14OwogCSREZWNsYXJlCT0gcXJ7KD86JFN0b3JhZ2VccyspPyRUeXBlfTsKQEAgLTIwMyw5ICsyMDgsOSBAQAogbXkgQGRlcF9mdW5jdGlvbnMgPSAoKTsKIG15ICRyZW1vdmFsID0gIkRvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dCI7CiBpZiAoJHRyZWUgJiYgLWYgIiRyb290LyRyZW1vdmFsIikgewotCW9wZW4oUkVNT1ZFLCAiPCRyb290LyRyZW1vdmFsIikgfHwKKwlvcGVuKG15ICRSRU1PVkUsICc8JywgIiRyb290LyRyZW1vdmFsIikgfHwKIAkJCQlkaWUgIiRQOiAkcmVtb3ZhbDogb3BlbiBmYWlsZWQgLSAkIVxuIjsKLQl3aGlsZSAoPFJFTU9WRT4pIHsKKwl3aGlsZSAoPCRSRU1PVkU+KSB7CiAJCWlmICgvXkNoZWNrOlxzKyguKlxTKS8pIHsKIAkJCWZvciBteSAkZW50cnkgKHNwbGl0KC9bLCBdKy8sICQxKSkgewogCQkJCWlmICgkZW50cnkgPX4gbUBpbmNsdWRlLyguKilAKSB7CkBAIC0yMTcsMTcgKzIyMiwyMSBAQAogCQkJfQogCQl9CiAJfQorCWNsb3NlKCRSRU1PVkUpOwogfQogCiBteSBAcmF3bGluZXMgPSAoKTsKIG15IEBsaW5lcyA9ICgpOwogbXkgJHZuYW1lOwogZm9yIG15ICRmaWxlbmFtZSAoQEFSR1YpIHsKKwlteSAkRklMRTsKIAlpZiAoJGZpbGUpIHsKLQkJb3BlbihGSUxFLCAiZGlmZiAtdSAvZGV2L251bGwgJGZpbGVuYW1lfCIpIHx8CisJCW9wZW4oJEZJTEUsICctfCcsICJkaWZmIC11IC9kZXYvbnVsbCAkZmlsZW5hbWUiKSB8fAogCQkJZGllICIkUDogJGZpbGVuYW1lOiBkaWZmIGZhaWxlZCAtICQhXG4iOworCX0gZWxzaWYgKCRmaWxlbmFtZSBlcSAnLScpIHsKKwkJb3BlbigkRklMRSwgJzwmU1RESU4nKTsKIAl9IGVsc2UgewotCQlvcGVuKEZJTEUsICI8JGZpbGVuYW1lIikgfHwKKwkJb3BlbigkRklMRSwgJzwnLCAiJGZpbGVuYW1lIikgfHwKIAkJCWRpZSAiJFA6ICRmaWxlbmFtZTogb3BlbiBmYWlsZWQgLSAkIVxuIjsKIAl9CiAJaWYgKCRmaWxlbmFtZSBlcSAnLScpIHsKQEAgLTIzNSwxMSArMjQ0LDExIEBACiAJfSBlbHNlIHsKIAkJJHZuYW1lID0gJGZpbGVuYW1lOwogCX0KLQl3aGlsZSAoPEZJTEU+KSB7CisJd2hpbGUgKDwkRklMRT4pIHsKIAkJY2hvbXA7CiAJCXB1c2goQHJhd2xpbmVzLCAkXyk7CiAJfQotCWNsb3NlKEZJTEUpOworCWNsb3NlKCRGSUxFKTsKIAlpZiAoIXByb2Nlc3MoJGZpbGVuYW1lKSkgewogCQkkZXhpdCA9IDE7CiAJfQpAQCAtMzY2LDcgKzM3NSw3IEBACiAJCQl9CiAJCX0KIAotCQkjcHJpbnQgIlNROiRzYW5pdGlzZV9xdW90ZVxuIjsKKwkJI3ByaW50ICJjPCRjPiBTUTwkc2FuaXRpc2VfcXVvdGU+XG4iOwogCQlpZiAoJG9mZiAhPSAwICYmICRzYW5pdGlzZV9xdW90ZSBlcSAnKi8nICYmICRjIG5lICJcdCIpIHsKIAkJCXN1YnN0cigkcmVzLCAkb2ZmLCAxLCAkOyk7CiAJCX0gZWxzaWYgKCRvZmYgIT0gMCAmJiAkc2FuaXRpc2VfcXVvdGUgJiYgJGMgbmUgIlx0IikgewpAQCAtNDAyLDYgKzQxMSw3IEBACiAKIAlteSAkdHlwZSA9ICcnOwogCW15ICRsZXZlbCA9IDA7CisJbXkgQHN0YWNrID0gKFskdHlwZSwgJGxldmVsXSk7CiAJbXkgJHA7CiAJbXkgJGM7CiAJbXkgJGxlbiA9IDA7CkBAIC00MzMsNiArNDQzLDE2IEBACiAJCSRyZW1haW5kZXIgPSBzdWJzdHIoJGJsaywgJG9mZik7CiAKIAkJI3dhcm4gIkNTQjogYzwkYz4gdHlwZTwkdHlwZT4gbGV2ZWw8JGxldmVsPiByZW1haW5kZXI8JHJlbWFpbmRlcj4gY29mZl9zZXQ8JGNvZmZfc2V0PlxuIjsKKworCQkjIEhhbmRsZSBuZXN0ZWQgI2lmLyNlbHNlLgorCQlpZiAoJHJlbWFpbmRlciA9fiAvXiNccyooPzppZm5kZWZ8aWZkZWZ8aWYpXHMvKSB7CisJCQlwdXNoKEBzdGFjaywgWyAkdHlwZSwgJGxldmVsIF0pOworCQl9IGVsc2lmICgkcmVtYWluZGVyID1+IC9eI1xzKig/OmVsc2V8ZWxpZilcYi8pIHsKKwkJCSgkdHlwZSwgJGxldmVsKSA9IEB7JHN0YWNrWyQjc3RhY2sgLSAxXX07CisJCX0gZWxzaWYgKCRyZW1haW5kZXIgPX4gL14jXHMqZW5kaWZcYi8pIHsKKwkJCSgkdHlwZSwgJGxldmVsKSA9IEB7cG9wKEBzdGFjayl9OworCQl9CisKIAkJIyBTdGF0ZW1lbnQgZW5kcyBhdCB0aGUgJzsnIG9yIGEgY2xvc2UgJ30nIGF0IHRoZQogCQkjIG91dGVybW9zdCBsZXZlbC4KIAkJaWYgKCRsZXZlbCA9PSAwICYmICRjIGVxICc7JykgewpAQCAtNTc5LDExICs1OTksMjIgQEAKIAlteSBAcmVzID0gKCk7CiAKIAlteSAkbGV2ZWwgPSAwOworCW15IEBzdGFjayA9ICgkbGV2ZWwpOwogCWZvciAoJGxpbmUgPSAkc3RhcnQ7ICRyZW1haW4gPiAwOyAkbGluZSsrKSB7CiAJCW5leHQgaWYgKCRyYXdsaW5lc1skbGluZV0gPX4gL14tLyk7CiAJCSRyZW1haW4tLTsKIAogCQkkYmxrIC49ICRyYXdsaW5lc1skbGluZV07CisKKwkJIyBIYW5kbGUgbmVzdGVkICNpZi8jZWxzZS4KKwkJaWYgKCRyYXdsaW5lc1skbGluZV0gPX4gL14uXHMqI1xzKig/OmlmbmRlZnxpZmRlZnxpZilccy8pIHsKKwkJCXB1c2goQHN0YWNrLCAkbGV2ZWwpOworCQl9IGVsc2lmICgkcmF3bGluZXNbJGxpbmVdID1+IC9eLlxzKiNccyooPzplbHNlfGVsaWYpXGIvKSB7CisJCQkkbGV2ZWwgPSAkc3RhY2tbJCNzdGFjayAtIDFdOworCQl9IGVsc2lmICgkcmF3bGluZXNbJGxpbmVdID1+IC9eLlxzKiNccyplbmRpZlxiLykgeworCQkJJGxldmVsID0gcG9wKEBzdGFjayk7CisJCX0KKwogCQlmb3JlYWNoIG15ICRjIChzcGxpdCgvLywgJHJhd2xpbmVzWyRsaW5lXSkpIHsKIAkJCSMjcHJpbnQgIkM8JGM+TDwkbGV2ZWw+PCRvcGVuJGNsb3NlPk88JG9mZj5cbiI7CiAJCQlpZiAoJG9mZiA+IDApIHsKQEAgLTg0MywxMSArODc0LDExIEBACiAJCQkkdHlwZSA9ICdWJzsKIAkJCSRhdl9wZW5kaW5nID0gJ1YnOwogCi0JCX0gZWxzaWYgKCRjdXIgPX4gL14oJElkZW50XHMqKTovKSB7Ci0JCQlpZiAoJHR5cGUgZXEgJ0UnKSB7Ci0JCQkJJGF2X3BlbmRfY29sb24gPSAnTCc7Ci0JCQl9IGVsc2lmICgkdHlwZSBlcSAnVCcpIHsKKwkJfSBlbHNpZiAoJGN1ciA9fiAvXigkSWRlbnRccyopOig/OlxzKlxkK1xzKigsfD18OykpPy8pIHsKKwkJCWlmIChkZWZpbmVkICQyICYmICR0eXBlIGVxICdDJyB8fCAkdHlwZSBlcSAnVCcpIHsKIAkJCQkkYXZfcGVuZF9jb2xvbiA9ICdCJzsKKwkJCX0gZWxzaWYgKCR0eXBlIGVxICdFJykgeworCQkJCSRhdl9wZW5kX2NvbG9uID0gJ0wnOwogCQkJfQogCQkJcHJpbnQgIklERU5UX0NPTE9OKCQxLCR0eXBlPiRhdl9wZW5kX2NvbG9uKVxuIiBpZiAoJGRiZ192YWx1ZXMgPiAxKTsKIAkJCSR0eXBlID0gJ1YnOwpAQCAtODY1LDYgKzg5NiwxMCBAQAogCQkJJHR5cGUgPSAnRSc7CiAJCQkkYXZfcGVuZF9jb2xvbiA9ICdPJzsKIAorCQl9IGVsc2lmICgkY3VyID1+L14oLCkvKSB7CisJCQlwcmludCAiQ09NTUEoJDEpXG4iIGlmICgkZGJnX3ZhbHVlcyA+IDEpOworCQkJJHR5cGUgPSAnQyc7CisKIAkJfSBlbHNpZiAoJGN1ciA9fiAvXihcPykvbykgewogCQkJcHJpbnQgIlFVRVNUSU9OKCQxKVxuIiBpZiAoJGRiZ192YWx1ZXMgPiAxKTsKIAkJCSR0eXBlID0gJ04nOwpAQCAtODgwLDcgKzkxNSw3IEBACiAJCQl9CiAJCQkkYXZfcGVuZF9jb2xvbiA9ICdPJzsKIAotCQl9IGVsc2lmICgkY3VyID1+IC9eKDt8XFspL28pIHsKKwkJfSBlbHNpZiAoJGN1ciA9fiAvXihcWykvbykgewogCQkJcHJpbnQgIkNMT1NFKCQxKVxuIiBpZiAoJGRiZ192YWx1ZXMgPiAxKTsKIAkJCSR0eXBlID0gJ04nOwogCkBAIC0xMDUxLDYgKzEwODYsNyBAQAogCW15ICRpbl9jb21tZW50ID0gMDsKIAlteSAkY29tbWVudF9lZGdlID0gMDsKIAlteSAkZmlyc3RfbGluZSA9IDA7CisJbXkgJHAxX3ByZWZpeCA9ICcnOwogCiAJbXkgJHByZXZfdmFsdWVzID0gJ0UnOwogCkBAIC0xMDk3LDkgKzExMzMsMTIgQEAKIAkJCQkJICRyYXdsaW5lc1skbG4gLSAxXSA9fiAvXi0vKTsKIAkJCQkkY250LS07CiAJCQkJI3ByaW50ICJSQVc8JHJhd2xpbmVzWyRsbiAtIDFdPlxuIjsKLQkJCQkoJGVkZ2UpID0gKGRlZmluZWQgJHJhd2xpbmVzWyRsbiAtIDFdICYmCi0JCQkJCSRyYXdsaW5lc1skbG4gLSAxXSA9fiBtQCgvXCp8XCovKUApOwotCQkJCWxhc3QgaWYgKGRlZmluZWQgJGVkZ2UpOworCQkJCWxhc3QgaWYgKCFkZWZpbmVkICRyYXdsaW5lc1skbG4gLSAxXSk7CisJCQkJaWYgKCRyYXdsaW5lc1skbG4gLSAxXSA9fiBtQCgvXCp8XCovKUAgJiYKKwkJCQkgICAgJHJhd2xpbmVzWyRsbiAtIDFdICF+IG1AIlteIl0qKD86L1wqfFwqLylbXiJdKiJAKSB7CisJCQkJCSgkZWRnZSkgPSAkMTsKKwkJCQkJbGFzdDsKKwkJCQl9CiAJCQl9CiAJCQlpZiAoZGVmaW5lZCAkZWRnZSAmJiAkZWRnZSBlcSAnKi8nKSB7CiAJCQkJJGluX2NvbW1lbnQgPSAxOwpAQCAtMTEwOSw3ICsxMTQ4LDcgQEAKIAkJCSMgaXMgdGhlIHN0YXJ0IG9mIGEgZGlmZiBibG9jayBhbmQgdGhpcyBsaW5lIHN0YXJ0cwogCQkJIyAnIConIHRoZW4gaXQgaXMgdmVyeSBsaWtlbHkgYSBjb21tZW50LgogCQkJaWYgKCFkZWZpbmVkICRlZGdlICYmCi0JCQkgICAgJHJhd2xpbmVzWyRsaW5lbnJdID1+IG1AXi5ccyogXCooPzpcc3wkKUApCisJCQkgICAgJHJhd2xpbmVzWyRsaW5lbnJdID1+IG1AXi5ccyooPzpcKlwqK3wgXCopKD86XHN8JClAKQogCQkJewogCQkJCSRpbl9jb21tZW50ID0gMTsKIAkJCX0KQEAgLTExOTYsNyArMTIzNSwxMiBAQAogCQkjIGV4dHJhY3QgdGhlIGZpbGVuYW1lIGFzIGl0IHBhc3NlcwogCQlpZiAoJGxpbmU9fi9eXCtcK1wrXHMrKFxTKykvKSB7CiAJCQkkcmVhbGZpbGUgPSAkMTsKLQkJCSRyZWFsZmlsZSA9fiBzQF5bXi9dKi9AQDsKKwkJCSRyZWFsZmlsZSA9fiBzQF4oW14vXSopL0BAOworCisJCQkkcDFfcHJlZml4ID0gJDE7CisJCQlpZiAoJHRyZWUgJiYgJHAxX3ByZWZpeCBuZSAnJyAmJiAtZSAiJHJvb3QvJHAxX3ByZWZpeCIpIHsKKwkJCQlXQVJOKCJwYXRjaCBwcmVmaXggJyRwMV9wcmVmaXgnIGV4aXN0cywgYXBwZWFycyB0byBiZSBhIC1wMCBwYXRjaFxuIik7CisJCQl9CiAKIAkJCWlmICgkcmVhbGZpbGUgPX4gbUBeaW5jbHVkZS9hc20vQCkgewogCQkJCUVSUk9SKCJkbyBub3QgbW9kaWZ5IGZpbGVzIGluIGluY2x1ZGUvYXNtLCBjaGFuZ2UgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGZpbGVzIGluIGluY2x1ZGUvYXNtLTxhcmNoaXRlY3R1cmU+XG4iIC4gIiRoZXJlJHJhd2xpbmVcbiIpOwpAQCAtMTMzNiw3ICsxMzgwLDcgQEAKIAkJCX0KIAogCQkJIyBhbnkgKGZvbyAuLi4gKikgaXMgYSBwb2ludGVyIGNhc3QsIGFuZCBmb28gaXMgYSB0eXBlCi0JCQl3aGlsZSAoJHMgPX4gL1woKCRJZGVudCkoPzpccyskU3BhcnNlKSpccypcKitccypcKS9zZykgeworCQkJd2hpbGUgKCRzID1+IC9cKCgkSWRlbnQpKD86XHMrJFNwYXJzZSkqW1xzXCpdK1xzKlwpL3NnKSB7CiAJCQkJcG9zc2libGUoJDEsICJDOiIgLiAkcyk7CiAJCQl9CiAKQEAgLTE1OTQsNyArMTYzOCw3IEBACiAJCQkJJGhlcmVjdXJyKTsKIAkJfQogIyBjaGVjayBmb3Igc3RhdGljIGluaXRpYWxpc2Vycy4KLQkJaWYgKCRsaW5lID1+IC9ccypzdGF0aWNccy4qPVxzKigwfE5VTEx8ZmFsc2UpXHMqOy8pIHsKKwkJaWYgKCRsaW5lID1+IC9cYnN0YXRpY1xzLio9XHMqKDB8TlVMTHxmYWxzZSlccyo7LykgewogCQkJRVJST1IoImRvIG5vdCBpbml0aWFsaXNlIHN0YXRpY3MgdG8gMCBvciBOVUxMXG4iIC4KIAkJCQkkaGVyZWN1cnIpOwogCQl9CkBAIC0xNjAyLDcgKzE2NDYsNyBAQAogIyBjaGVjayBmb3IgbmV3IHR5cGVkZWZzLCBvbmx5IGZ1bmN0aW9uIHBhcmFtZXRlcnMgYW5kIHNwYXJzZSBhbm5vdGF0aW9ucwogIyBtYWtlIHNlbnNlLgogCQlpZiAoJGxpbmUgPX4gL1xidHlwZWRlZlxzLyAmJgotCQkgICAgJGxpbmUgIX4gL1xidHlwZWRlZlxzKyRUeXBlXHMrXChccypcKj8kSWRlbnRccypcKVxzKlwoLyAmJgorCQkgICAgJGxpbmUgIX4gL1xidHlwZWRlZlxzKyRUeXBlXHMqXChccypcKj8kSWRlbnRccypcKVxzKlwoLyAmJgogCQkgICAgJGxpbmUgIX4gL1xidHlwZWRlZlxzKyRUeXBlXHMrJElkZW50XHMqXCgvICYmCiAJCSAgICAkbGluZSAhfiAvXGIkdHlwZVR5cGVkZWZzXGIvICYmCiAJCSAgICAkbGluZSAhfiAvXGJfX2JpdHdpc2UoPzpfX3wpXGIvKSB7CkBAIC0xNjEwLDIxICsxNjU0LDM5IEBACiAJCX0KIAogIyAqIGdvZXMgb24gdmFyaWFibGUgbm90IG9uIHR5cGUKLQkJaWYgKCRsaW5lID1+IG17XCgkTm9ucHRyVHlwZShcKispKD86XHMrY29uc3QpP1wpfSkgewotCQkJRVJST1IoIlwiKGZvbyQxKVwiIHNob3VsZCBiZSBcIihmb28gJDEpXCJcbiIgLgotCQkJCSRoZXJlY3Vycik7CisJCSMgKGNoYXIqWyBjb25zdF0pCisJCWlmICgkbGluZSA9fiBte1woJE5vbnB0clR5cGUoXHMqXCpbXHNcKl0qKD86JE1vZGlmaWVyXHMqKSopXCl9KSB7CisJCQlteSAoJGZyb20sICR0bykgPSAoJDEsICQxKTsKIAotCQl9IGVsc2lmICgkbGluZSA9fiBte1woJE5vbnB0clR5cGVccysoXCorKSg/IVxzK2NvbnN0KVxzK1wpfSkgewotCQkJRVJST1IoIlwiKGZvbyAkMSApXCIgc2hvdWxkIGJlIFwiKGZvbyAkMSlcIlxuIiAuCi0JCQkJJGhlcmVjdXJyKTsKKwkJCSMgU2hvdWxkIHN0YXJ0IHdpdGggYSBzcGFjZS4KKwkJCSR0byA9fiBzL14oXFMpLyAkMS87CisJCQkjIFNob3VsZCBub3QgZW5kIHdpdGggYSBzcGFjZS4KKwkJCSR0byA9fiBzL1xzKyQvLzsKKwkJCSMgJyoncyBzaG91bGQgbm90IGhhdmUgc3BhY2VzIGJldHdlZW4uCisJCQl3aGlsZSAoJHRvID1+IHMvKC4pXHNcKi8kMVwqLykgeworCQkJfQogCi0JCX0gZWxzaWYgKCRsaW5lID1+IG17XGIkTm9ucHRyVHlwZShcKispKD86XHMrKD86JEF0dHJpYnV0ZXwkU3BhcnNlKSk/XHMrW0EtWmEtelxkX10rfSkgewotCQkJRVJST1IoIlwiZm9vJDEgYmFyXCIgc2hvdWxkIGJlIFwiZm9vICQxYmFyXCJcbiIgLgotCQkJCSRoZXJlY3Vycik7CisJCQkjcHJpbnQgImZyb208JGZyb20+IHRvPCR0bz5cbiI7CisJCQlpZiAoJGZyb20gbmUgJHRvKSB7CisJCQkJRVJST1IoIlwiKGZvbyRmcm9tKVwiIHNob3VsZCBiZSBcIihmb28kdG8pXCJcbiIgLiAgJGhlcmVjdXJyKTsKKwkJCX0KKwkJfSBlbHNpZiAoJGxpbmUgPX4gbXtcYiROb25wdHJUeXBlKFxzKlwqW1xzXCpdKig/OiRNb2RpZmllclxzKik/KSgkSWRlbnQpfSkgeworCQkJbXkgKCRmcm9tLCAkdG8sICRpZGVudCkgPSAoJDEsICQxLCAkMik7CiAKLQkJfSBlbHNpZiAoJGxpbmUgPX4gbXtcYiROb25wdHJUeXBlXHMrKFwqKykoPyFccysoPzokQXR0cmlidXRlfCRTcGFyc2UpKVxzK1tBLVphLXpcZF9dK30pIHsKLQkJCUVSUk9SKCJcImZvbyAkMSBiYXJcIiBzaG91bGQgYmUgXCJmb28gJDFiYXJcIlxuIiAuCi0JCQkJJGhlcmVjdXJyKTsKKwkJCSMgU2hvdWxkIHN0YXJ0IHdpdGggYSBzcGFjZS4KKwkJCSR0byA9fiBzL14oXFMpLyAkMS87CisJCQkjIFNob3VsZCBub3QgZW5kIHdpdGggYSBzcGFjZS4KKwkJCSR0byA9fiBzL1xzKyQvLzsKKwkJCSMgJyoncyBzaG91bGQgbm90IGhhdmUgc3BhY2VzIGJldHdlZW4uCisJCQl3aGlsZSAoJHRvID1+IHMvKC4pXHNcKi8kMVwqLykgeworCQkJfQorCQkJIyBNb2RpZmllcnMgc2hvdWxkIGhhdmUgc3BhY2VzLgorCQkJJHRvID1+IHMvKFxiJE1vZGlmaWVyJCkvJDEgLzsKKworCQkJI3ByaW50ICJmcm9tPCRmcm9tPiB0bzwkdG8+XG4iOworCQkJaWYgKCRmcm9tIG5lICR0bykgeworCQkJCUVSUk9SKCJcImZvbyR7ZnJvbX1iYXJcIiBzaG91bGQgYmUgXCJmb28ke3RvfWJhclwiXG4iIC4gICRoZXJlY3Vycik7CisJCQl9CiAJCX0KIAogIyAjIG5vIEJVRygpIG9yIEJVR19PTigpCkBAIC0xNzU5LDcgKzE4MjEsNyBAQAogCQkJCQkkYyA9ICdDJyBpZiAoJGVsZW1lbnRzWyRuICsgMl0gPX4gL14kOy8pOwogCQkJCQkkYyA9ICdCJyBpZiAoJGVsZW1lbnRzWyRuICsgMl0gPX4gL14oXCl8XF18OykvKTsKIAkJCQkJJGMgPSAnTycgaWYgKCRlbGVtZW50c1skbiArIDJdIGVxICcnKTsKLQkJCQkJJGMgPSAnRScgaWYgKCRlbGVtZW50c1skbiArIDJdID1+IC9ccypcXCQvKTsKKwkJCQkJJGMgPSAnRScgaWYgKCRlbGVtZW50c1skbiArIDJdID1+IC9eXHMqXFwkLyk7CiAJCQkJfSBlbHNlIHsKIAkJCQkJJGMgPSAnRSc7CiAJCQkJfQpAQCAtMTk1MCw5ICsyMDEyLDkgQEAKIAkJCW15ICRzcGFjaW5nID0gJDE7CiAJCQlteSAkdmFsdWUgPSAkMjsKIAotCQkJIyBGbGF0dGVuIGFueSBwYXJlbnRoZXNlcyBhbmQgYnJhY2VzCisJCQkjIEZsYXR0ZW4gYW55IHBhcmVudGhlc2VzCiAJCQkkdmFsdWUgPX4gcy9cKVwoL1wpIFwoL2c7Ci0JCQl3aGlsZSAoJHZhbHVlID1+IHMvXChbXlwoXCldKlwpLzEvKSB7CisJCQl3aGlsZSAoJHZhbHVlICF+IC8oPzokSWRlbnR8LT8kQ29uc3RhbnQpXHMqJENvbXBhcmVccyooPzokSWRlbnR8LT8kQ29uc3RhbnQpLyAmJiAkdmFsdWUgPX4gcy9cKFteXChcKV0qXCkvMS8pIHsKIAkJCX0KIAogCQkJaWYgKCR2YWx1ZSA9fiAvXig/OiRJZGVudHwtPyRDb25zdGFudCkkLykgewpAQCAtMTk5Miw3ICsyMDU0LDcgQEAKIAkJICAgICRsaW5lID1+IC9cYig/OmlmfHdoaWxlfGZvcilccypcKC8gJiYgJGxpbmUgIX4gL14uXHMqIy8pIHsKIAkJCW15ICgkcywgJGMpID0gKCRzdGF0LCAkY29uZCk7CiAKLQkJCWlmICgkYyA9fiAvXGJpZlxzKlwoLipbXjw+IT1dPVtePV0uKi8pIHsKKwkJCWlmICgkYyA9fiAvXGJpZlxzKlwoLipbXjw+IT1dPVtePV0uKi9zKSB7CiAJCQkJRVJST1IoImRvIG5vdCB1c2UgYXNzaWdubWVudCBpbiBpZiBjb25kaXRpb25cbiIgLiAkaGVyZWN1cnIpOwogCQkJfQogCkBAIC0yMTY3LDkgKzIyMjksMTAgQEAKIAkJCQlNT0RVTEVfUEFSQU1fREVTQ3wKIAkJCQlERUNMQVJFX1BFUl9DUFV8CiAJCQkJREVGSU5FX1BFUl9DUFV8Ci0JCQkJX190eXBlb2ZfX1woCisJCQkJX190eXBlb2ZfX1wofAorCQkJCVwuJElkZW50XHMqPVxzKgogCQkJfXg7Ci0JCQkjcHJpbnQgIlJFU1Q8JHJlc3Q+XG4iOworCQkJI3ByaW50ICJSRVNUPCRyZXN0PiBkc3RhdDwkZHN0YXQ+XG4iOwogCQkJaWYgKCRyZXN0IG5lICcnKSB7CiAJCQkJaWYgKCRyZXN0ICF+IC93aGlsZVxzKlwoLyAmJgogCQkJCSAgICAkZHN0YXQgIX4gLyRleGNlcHRpb25zLykKQEAgLTIxODksNiArMjI1MiwxNSBAQAogCQkJfQogCQl9CiAKKyMgbWFrZSBzdXJlIHN5bWJvbHMgYXJlIGFsd2F5cyB3cmFwcGVkIHdpdGggVk1MSU5VWF9TWU1CT0woKSAuLi4KKyMgYWxsIGFzc2lnbm1lbnRzIG1heSBoYXZlIG9ubHkgb25lIG9mIHRoZSBmb2xsb3dpbmcgd2l0aCBhbiBhc3NpZ25tZW50OgorIwkuCisjCUFMSUdOKC4uLikKKyMJVk1MSU5VWF9TWU1CT0woLi4uKQorCQlpZiAoJHJlYWxmaWxlIGVxICd2bWxpbnV4Lmxkcy5oJyAmJiAkbGluZSA9fiAvKD86KD86XnxccykkSWRlbnRccyo9fD1ccyokSWRlbnQoPzpcc3wkKSkvKSB7CisJCQlXQVJOKCJ2bWxpbnV4Lmxkcy5oIG5lZWRzIFZNTElOVVhfU1lNQk9MKCkgYXJvdW5kIEMtdmlzaWJsZSBzeW1ib2xzXG4iIC4gJGhlcmVjdXJyKTsKKwkJfQorCiAjIGNoZWNrIGZvciByZWR1bmRhbnQgYnJhY2luZyByb3VuZCBpZiBldGMKIAkJaWYgKCRsaW5lID1+IC8oXi4qKVxiaWZcYi8gJiYgJDEgIX4gL2Vsc2VccyokLykgewogCQkJbXkgKCRsZXZlbCwgJGVuZGxuLCBAY2h1bmtzKSA9CkBAIC0yNDQzLDYgKzI1MTUsMTEgQEAKIAkJaWYgKCRsaW5lID1+IC9eLlxzKl9faW5pdGNhbGxccypcKC8pIHsKIAkJCVdBUk4oInBsZWFzZSB1c2UgZGV2aWNlX2luaXRjYWxsKCkgaW5zdGVhZCBvZiBfX2luaXRjYWxsKClcbiIgLiAkaGVyZWN1cnIpOwogCQl9CisjIGNoZWNrIGZvciBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zLCBlbnN1cmUgdGhleSBhcmUgY29uc3QuCisJCWlmICgkbGluZSA9fiAvXGJzdHJ1Y3RccytmaWxlX29wZXJhdGlvbnNcYi8gJiYKKwkJICAgICRsaW5lICF+IC9cYmNvbnN0XGIvKSB7CisJCQlXQVJOKCJzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNob3VsZCBub3JtYWxseSBiZSBjb25zdFxuIiAuICRoZXJlY3Vycik7CisJCX0KIAogIyB1c2Ugb2YgTlJfQ1BVUyBpcyB1c3VhbGx5IHdyb25nCiAjIGlnbm9yZSBkZWZpbml0aW9ucyBvZiBOUl9DUFVTIGFuZCB1c2FnZSB0byBkZWZpbmUgYXJyYXlzIGFzIGxpa2VseSByaWdodApAQCAtMjQ2Niw2ICsyNTQzLDE1IEBACiAJCQkJbGFzdDsKIAkJCX0KIAkJfQorCisjIHdoaW5lIG1pZ2h0bHkgYWJvdXQgaW5fYXRvbWljCisJCWlmICgkbGluZSA9fiAvXGJpbl9hdG9taWNccypcKC8pIHsKKwkJCWlmICgkcmVhbGZpbGUgPX4gbUBeZHJpdmVycy9AKSB7CisJCQkJRVJST1IoImRvIG5vdCB1c2UgaW5fYXRvbWljIGluIGRyaXZlcnNcbiIgLiAkaGVyZWN1cnIpOworCQkJfSBlbHNlIHsKKwkJCQlXQVJOKCJ1c2Ugb2YgaW5fYXRvbWljKCkgaXMgaW5jb3JyZWN0IG91dHNpZGUgY29yZSBrZXJuZWwgY29kZVxuIiAuICRoZXJlY3Vycik7CisJCQl9CisJCX0KIAl9CiAKIAkjIElmIHdlIGhhdmUgbm8gaW5wdXQgYXQgYWxsLCB0aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gcmVwb3J0IG9uCmRpZmYgLS1naXQgYS9zY3JpcHRzL2NvbmZpZyBiL3NjcmlwdHMvY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY4Yjk3NjEKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2NvbmZpZwpAQCAtMCwwICsxLDE1MCBAQAorIyEvYmluL2Jhc2gKKyMgTWFuaXB1bGF0ZSBvcHRpb25zIGluIGEgLmNvbmZpZyBmaWxlIGZyb20gdGhlIGNvbW1hbmQgbGluZQorCit1c2FnZSgpIHsKKwljYXQgPiYyIDw8RU9MCitNYW5pcHVsYXRlIG9wdGlvbnMgaW4gYSAuY29uZmlnIGZpbGUgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgorVXNhZ2U6Citjb25maWcgb3B0aW9ucyBjb21tYW5kIC4uLgorY29tbWFuZHM6CisJLS1lbmFibGV8LWUgb3B0aW9uICAgRW5hYmxlIG9wdGlvbgorCS0tZGlzYWJsZXwtZCBvcHRpb24gIERpc2FibGUgb3B0aW9uCisJLS1tb2R1bGV8LW0gb3B0aW9uICAgICAgVHVybiBvcHRpb24gaW50byBhIG1vZHVsZQorCS0tc3RhdGV8LXMgb3B0aW9uICAgICAgIFByaW50IHN0YXRlIG9mIG9wdGlvbiAobix5LG0sdW5kZWYpCisKKwktLWVuYWJsZS1hZnRlcnwtRSBiZWZvcmVvcHQgb3B0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuYWJsZSBvcHRpb24gZGlyZWN0bHkgYWZ0ZXIgb3RoZXIgb3B0aW9uCisJLS1kaXNhYmxlLWFmdGVyfC1EIGJlZm9yZW9wdCBvcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzYWJsZSBvcHRpb24gZGlyZWN0bHkgYWZ0ZXIgb3RoZXIgb3B0aW9uCisJLS1tb2R1bGUtYWZ0ZXJ8LU0gYmVmb3Jlb3B0IG9wdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUdXJuIG9wdGlvbiBpbnRvIG1vZHVsZSBkaXJlY3RseSBhZnRlciBvdGhlciBvcHRpb24KKworCWNvbW1hbmRzIGNhbiBiZSByZXBlYXRlZCBtdWx0aXBsZSB0aW1lcworCitvcHRpb25zOgorCS0tZmlsZSAuY29uZmlnIGZpbGUgdG8gY2hhbmdlIChkZWZhdWx0IC5jb25maWcpCisKK2NvbmZpZyBkb2Vzbid0IGNoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgLmNvbmZpZyBmaWxlLiBUaGlzIGlzIGRvbmUgYXQgbmV4dAorIG1ha2UgdGltZS4KK1RoZSBvcHRpb25zIG5lZWQgdG8gYmUgYWxyZWFkeSBpbiB0aGUgZmlsZSBiZWZvcmUgdGhleSBjYW4gYmUgY2hhbmdlZCwKK2J1dCBzb21ldGltZXMgeW91IGNhbiBjaGVhdCB3aXRoIHRoZSAtLSotYWZ0ZXIgb3B0aW9ucy4KK0VPTAorCWV4aXQgMQorfQorCitjaGVja2FyZygpIHsKKwlBUkc9IiQxIgorCWlmIFsgIiRBUkciID0gIiIgXSA7IHRoZW4KKwkJdXNhZ2UKKwlmaQorCWNhc2UgIiRBUkciIGluCisJQ09ORklHXyopCisJCUFSRz0iJHtBUkcvQ09ORklHXy99IgorCQk7OworCWVzYWMKKwlBUkc9ImBlY2hvICRBUkcgfCB0ciBhLXogQS1aYCIKK30KKworcmVwbGFjZSgpIHsKKwlzZWQgLWkgLWUgIiRAIiAkRk4KK30KKworaWYgWyAiJDEiID0gIi0tZmlsZSIgXTsgdGhlbgorCUZOPSIkMiIKKwlpZiBbICIkRk4iID0gIiIgXSA7IHRoZW4KKwkJdXNhZ2UKKwlmaQorCXNoaWZ0CisJc2hpZnQKK2Vsc2UKKwlGTj0uY29uZmlnCitmaQorCit3aGlsZSBbICIkMSIgIT0gIiIgXSA7IGRvCisJQ01EPSIkMSIKKwlzaGlmdAorCWNhc2UgIiRDTUQiIGluCisJLS1lbmFibGV8LWUpCisJCWNoZWNrYXJnICIkMSIKKwkJcmVwbGFjZSAicy8jIENPTkZJR18kQVJHIGlzIG5vdCBzZXQvQ09ORklHXyRBUkc9eS8iCisJCXNoaWZ0CisJCTs7CisKKwktLWRpc2FibGV8LWQpCisJCWNoZWNrYXJnICIkMSIKKwkJcmVwbGFjZSAicy9DT05GSUdfJEFSRz1bbXldLyMgQ09ORklHXyRBUkcgaXMgbm90IHNldC8iCisJCXNoaWZ0CisJCTs7CisKKwktLW1vZHVsZXwtbSkKKwkJY2hlY2thcmcgIiQxIgorCQlyZXBsYWNlICJzL0NPTkZJR18kQVJHPXkvQ09ORklHXyRBUkc9bS8iIFwKKwkJCS1lICJzLyMgQ09ORklHXyRBUkcgaXMgbm90IHNldC9DT05GSUdfJEFSRz1tLyIKKwkJc2hpZnQKKwkJOzsKKworCS0tc3RhdGV8LXMpCisJCWNoZWNrYXJnICIkMSIKKwkJaWYgZ3JlcCAtcSAiIyBDT05GSUdfJEFSRyBpcyBub3Qgc2V0IiAkRk4gOyB0aGVuCisJCQllY2hvIG4KKwkJZWxzZQorCQkJVj0iJChncmVwICJeQ09ORklHXyRBUkc9IiAkRk4pIgorCQkJaWYgWyAkPyAhPSAwIF0gOyB0aGVuCisJCQkJZWNobyB1bmRlZgorCQkJZWxzZQorCQkJCVY9IiR7Vi9DT05GSUdfJEFSRz0vfSIKKwkJCQlWPSIke1YvXCIvfSIKKwkJCQllY2hvICIkViIKKwkJCWZpCisJCWZpCisJCXNoaWZ0CisJCTs7CisKKwktLWVuYWJsZS1hZnRlcnwtRSkKKwkJY2hlY2thcmcgIiQxIgorCQlBPSRBUkcKKwkJY2hlY2thcmcgIiQyIgorCQlCPSRBUkcKKwkJcmVwbGFjZSAiL0NPTkZJR18kQT1bbXldL2FDT05GSUdfJEI9eSIgXAorCQkJLWUgIi8jIENPTkZJR18kQVJHIGlzIG5vdCBzZXQvYS9DT05GSUdfJEFSRz15IiBcCisJCQktZSAicy8jIENPTkZJR18kQVJHIGlzIG5vdCBzZXQvQ09ORklHXyRBUkc9eS8iCisJCXNoaWZ0CisJCXNoaWZ0CisJCTs7CisKKwktLWRpc2FibGUtYWZ0ZXJ8LUQpCisJCWNoZWNrYXJnICIkMSIKKwkJQT0kQVJHCisJCWNoZWNrYXJnICIkMiIKKwkJQj0kQVJHCisJCXJlcGxhY2UgIi9DT05GSUdfJEE9W215XS9hIyBDT05GSUdfJEIgaXMgbm90IHNldCIgXAorCQktZSAiLyMgQ09ORklHXyRBUkcgaXMgbm90IHNldC9hLyMgQ09ORklHXyRBUkcgaXMgbm90IHNldCIgXAorCQktZSAicy9DT05GSUdfJEFSRz1bbXldLyMgQ09ORklHXyRBUkcgaXMgbm90IHNldC8iCisJCXNoaWZ0CisJCXNoaWZ0CisJCTs7CisKKwktLW1vZHVsZS1hZnRlcnwtTSkKKwkJY2hlY2thcmcgIiQxIgorCQlBPSRBUkcKKwkJY2hlY2thcmcgIiQyIgorCQlCPSRBUkcKKwkJcmVwbGFjZSAiL0NPTkZJR18kQT1bbXldL2FDT05GSUdfJEI9bSIgXAorCQkJLWUgIi8jIENPTkZJR18kQVJHIGlzIG5vdCBzZXQvYS9DT05GSUdfJEFSRz1tIiBcCisJCQktZSAicy9DT05GSUdfJEFSRz15L0NPTkZJR18kQVJHPW0vIiBcCisJCQktZSAicy8jIENPTkZJR18kQVJHIGlzIG5vdCBzZXQvQ09ORklHXyRBUkc9bS8iCisJCXNoaWZ0CisJCXNoaWZ0CisJCTs7CisKKwkjIHVuZG9jdW1lbnRlZCBiZWNhdXNlIGl0IGlnbm9yZXMgLS1maWxlIChmaXhtZSkKKwktLXJlZnJlc2gpCisJCXllcyAiIiB8IG1ha2Ugb2xkY29uZmlnCisJCTs7CisKKwkqKQorCQl1c2FnZQorCQk7OworCWVzYWMKK2RvbmUKKwpkaWZmIC0tZ2l0IGEvZmlybXdhcmUvaWhleDJmdy5jIGIvc2NyaXB0cy9paGV4MmZ3LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGZpcm13YXJlL2loZXgyZncuYwpyZW5hbWUgdG8gc2NyaXB0cy9paGV4MmZ3LmMKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbWFya3VwX29vcHMucGwgYi9zY3JpcHRzL21hcmt1cF9vb3BzLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMGE3YTYKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL21hcmt1cF9vb3BzLnBsCkBAIC0wLDAgKzEsMTYyIEBACisjIS91c3IvYmluL3BlcmwgLXcKKworIyBDb3B5cmlnaHQgMjAwOCwgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbAorIworIyBUaGlzIHByb2dyYW0gZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyMKKyMgQXV0aG9yczoKKyMgCUFyamFuIHZhbiBkZSBWZW4gPGFyamFuQGxpbnV4LmludGVsLmNvbT4KKworCitteSAkdm1saW51eF9uYW1lID0gJEFSR1ZbMF07CisKKyMKKyMgU3RlcCAxOiBQYXJzZSB0aGUgb29wcyB0byBmaW5kIHRoZSBFSVAgdmFsdWUKKyMKKworbXkgJHRhcmdldCA9ICIwIjsKK3doaWxlICg8U1RESU4+KSB7CisJaWYgKCRfID1+IC9FSVA6IDAwNjA6XFtcPChbYS16MC05XSspXD5cXS8pIHsKKwkJJHRhcmdldCA9ICQxOworCX0KK30KKworaWYgKCR0YXJnZXQgPX4gL15mOC8pIHsKKwlwcmludCAiVGhpcyBzY3JpcHQgZG9lcyBub3Qgd29yayBvbiBtb2R1bGVzIC4uLiBcbiI7CisJZXhpdDsKK30KKworaWYgKCR0YXJnZXQgZXEgIjAiKSB7CisJcHJpbnQgIk5vIG9vcHMgZm91bmQhXG4iOworCXByaW50ICJVc2FnZTogXG4iOworCXByaW50ICIgICAgZG1lc2cgfCBwZXJsIHNjcmlwdHMvbWFya3VwX29vcHMucGwgdm1saW51eFxuIjsKKwlleGl0OworfQorCitteSAkY291bnRlciA9IDA7CitteSAkc3RhdGUgICA9IDA7CitteSAkY2VudGVyICA9IDA7CitteSBAbGluZXM7CisKK3N1YiBJblJhbmdlIHsKKwlteSAoJGFkZHJlc3MsICR0YXJnZXQpID0gQF87CisJbXkgJGFkID0gIjB4Ii4kYWRkcmVzczsKKwlteSAkdGEgPSAiMHgiLiR0YXJnZXQ7CisJbXkgJGRlbHRhID0gaGV4KCRhZCkgLSBoZXgoJHRhKTsKKworCWlmICgoJGRlbHRhID4gLTQwOTYpICYmICgkZGVsdGEgPCA0MDk2KSkgeworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworCisjIGZpcnN0LCBwYXJzZSB0aGUgaW5wdXQgaW50byB0aGUgbGluZXMgYXJyYXksIGJ1dCB0byBrZWVwIHNpemUgZG93biwKKyMgd2Ugb25seSBkbyB0aGlzIGZvciA0S2IgYXJvdW5kIHRoZSBzd2VldCBzcG90CisKK215ICRmaWxlbmFtZTsKKworb3BlbihGSUxFLCAib2JqZHVtcCAtZFMgJHZtbGludXhfbmFtZSB8IikgfHwgZGllICJDYW5ub3Qgc3RhcnQgb2JqZHVtcCI7CisKK3doaWxlICg8RklMRT4pIHsKKwlteSAkbGluZSA9ICRfOworCWNob21wKCRsaW5lKTsKKwlpZiAoJHN0YXRlID09IDApIHsKKwkJaWYgKCRsaW5lID1+IC9eKFthLWYwLTldKylcOi8pIHsKKwkJCWlmIChJblJhbmdlKCQxLCAkdGFyZ2V0KSkgeworCQkJCSRzdGF0ZSA9IDE7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZiAoJGxpbmUgPX4gL14oW2EtZjAtOV1bYS1mMC05XVthLWYwLTldW2EtZjAtOV1bYS1mMC05XVthLWYwLTldKylcOi8pIHsKKwkJCW15ICR2YWwgPSAkMTsKKwkJCWlmICghSW5SYW5nZSgkdmFsLCAkdGFyZ2V0KSkgeworCQkJCWxhc3Q7CisJCQl9CisJCQlpZiAoJHZhbCBlcSAkdGFyZ2V0KSB7CisJCQkJJGNlbnRlciA9ICRjb3VudGVyOworCQkJfQorCQl9CisJCSRsaW5lc1skY291bnRlcl0gPSAkbGluZTsKKworCQkkY291bnRlciA9ICRjb3VudGVyICsgMTsKKwl9Cit9CisKK2Nsb3NlKEZJTEUpOworCitpZiAoJGNvdW50ZXIgPT0gMCkgeworCXByaW50ICJObyBtYXRjaGluZyBjb2RlIGZvdW5kIFxuIjsKKwlleGl0OworfQorCitpZiAoJGNlbnRlciA9PSAwKSB7CisJcHJpbnQgIk5vIG1hdGNoaW5nIGNvZGUgZm91bmQgXG4iOworCWV4aXQ7Cit9CisKK215ICRzdGFydDsKK215ICRmaW5pc2g7CitteSAkY29kZWxpbmVzID0gMDsKK215ICRiaW5hcnlsaW5lcyA9IDA7CisjIG5vdyB3ZSBnbyB1cCBhbmQgZG93biBpbiB0aGUgYXJyYXkgdG8gZmluZCBob3cgbXVjaCB3ZSB3YW50IHRvIHByaW50CisKKyRzdGFydCA9ICRjZW50ZXI7CisKK3doaWxlICgkc3RhcnQgPiAxKSB7CisJJHN0YXJ0ID0gJHN0YXJ0IC0gMTsKKwlteSAkbGluZSA9ICRsaW5lc1skc3RhcnRdOworCWlmICgkbGluZSA9fiAvXihbYS1mMC05XSspXDovKSB7CisJCSRiaW5hcnlsaW5lcyA9ICRiaW5hcnlsaW5lcyArIDE7CisJfSBlbHNlIHsKKwkJJGNvZGVsaW5lcyA9ICRjb2RlbGluZXMgKyAxOworCX0KKwlpZiAoJGNvZGVsaW5lcyA+IDEwKSB7CisJCWxhc3Q7CisJfQorCWlmICgkYmluYXJ5bGluZXMgPiAyMCkgeworCQlsYXN0OworCX0KK30KKworCiskZmluaXNoID0gJGNlbnRlcjsKKyRjb2RlbGluZXMgPSAwOworJGJpbmFyeWxpbmVzID0gMDsKK3doaWxlICgkZmluaXNoIDwgJGNvdW50ZXIpIHsKKwkkZmluaXNoID0gJGZpbmlzaCArIDE7CisJbXkgJGxpbmUgPSAkbGluZXNbJGZpbmlzaF07CisJaWYgKCRsaW5lID1+IC9eKFthLWYwLTldKylcOi8pIHsKKwkJJGJpbmFyeWxpbmVzID0gJGJpbmFyeWxpbmVzICsgMTsKKwl9IGVsc2UgeworCQkkY29kZWxpbmVzID0gJGNvZGVsaW5lcyArIDE7CisJfQorCWlmICgkY29kZWxpbmVzID4gMTApIHsKKwkJbGFzdDsKKwl9CisJaWYgKCRiaW5hcnlsaW5lcyA+IDIwKSB7CisJCWxhc3Q7CisJfQorfQorCisKK215ICRpOworCitteSAkZnVsbHRleHQgPSAiIjsKKyRpID0gJHN0YXJ0Oword2hpbGUgKCRpIDwgJGZpbmlzaCkgeworCWlmICgkaSA9PSAkY2VudGVyKSB7CisJCSRmdWxsdGV4dCA9ICRmdWxsdGV4dCAuICIqJGxpbmVzWyRpXSAgICAgPC0tLS0tIGZhdWx0aW5nIGluc3RydWN0aW9uXG4iOworCX0gZWxzZSB7CisJCSRmdWxsdGV4dCA9ICRmdWxsdGV4dCAuICAiICRsaW5lc1skaV1cbiI7CisJfQorCSRpID0gJGkgKzE7Cit9CisKK3ByaW50ICRmdWxsdGV4dDsKKwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90YWdzLnNoIGIvc2NyaXB0cy90YWdzLnNoCmluZGV4IDllMzQ1MWQuLmZkYmU3OGIgMTAwNzU1Ci0tLSBhL3NjcmlwdHMvdGFncy5zaAorKysgYi9zY3JpcHRzL3RhZ3Muc2gKQEAgLTI0LDYgKzI0LDExIEBACiAJdHJlZT0ke3NyY3RyZWV9LwogZmkKIAorIyBEZXRlY3QgaWYgQUxMU09VUkNFX0FSQ0hTIGlzIHNldC4gSWYgbm90LCB3ZSBhc3N1bWUgU1JDQVJDSAoraWYgWyAiJHtBTExTT1VSQ0VfQVJDSFN9IiA9ICIiIF07IHRoZW4KKwlBTExTT1VSQ0VfQVJDSFM9JHtTUkNBUkNIfQorZmkKKwogIyBmaW5kIHNvdXJjZXMgaW4gYXJjaC8kQVJDSAogZmluZF9hcmNoX3NvdXJjZXMoKQogewpAQCAtNTQsMjYgKzU5LDI5IEBACiBmaW5kX3NvdXJjZXMoKQogewogCWZpbmRfYXJjaF9zb3VyY2VzICQxICIkMiIKLQlmaW5kX2luY2x1ZGVfc291cmNlcyAiJDIiCi0JZmluZF9vdGhlcl9zb3VyY2VzICIkMiIKIH0KIAogYWxsX3NvdXJjZXMoKQogewotCWZpbmRfc291cmNlcyAkU1JDQVJDSCAnKi5bY2hTXScKKwlmb3IgYXJjaCBpbiAkQUxMU09VUkNFX0FSQ0hTCisJZG8KKwkJZmluZF9zb3VyY2VzICRhcmNoICcqLltjaFNdJworCWRvbmUKIAlpZiBbICEgLXogIiRhcmNoaW5jbHVkZSIgXTsgdGhlbgogCQlmaW5kX2FyY2hfaW5jbHVkZV9zb3VyY2VzICRhcmNoaW5jbHVkZSAnKi5bY2hTXScKIAlmaQorCWZpbmRfaW5jbHVkZV9zb3VyY2VzICcqLltjaFNdJworCWZpbmRfb3RoZXJfc291cmNlcyAnKi5bY2hTXScKIH0KIAogYWxsX2tjb25maWdzKCkKIHsKLQlmaW5kX3NvdXJjZXMgJFNSQ0FSQ0ggJ0tjb25maWcqJworCWZpbmRfc291cmNlcyAkQUxMU09VUkNFX0FSQ0hTICdLY29uZmlnKicKIH0KIAogYWxsX2RlZmNvbmZpZ3MoKQogewotCWZpbmRfc291cmNlcyAkU1JDQVJDSCAiZGVmY29uZmlnIgorCWZpbmRfc291cmNlcyAkQUxMU09VUkNFX0FSQ0hTICJkZWZjb25maWciCiB9CiAKIGRvY3Njb3BlKCkKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2NvbW1vbmNhcC5jIGIvc2VjdXJpdHkvY29tbW9uY2FwLmMKaW5kZXggNzk3MTM1NC4uN2NkNjFhNSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvY29tbW9uY2FwLmMKKysrIGIvc2VjdXJpdHkvY29tbW9uY2FwLmMKQEAgLTQ1LDI2ICs0NSwyMiBAQAogLyoqCiAgKiBjYXBfY2FwYWJsZSAtIERldGVybWluZSB3aGV0aGVyIGEgdGFzayBoYXMgYSBwYXJ0aWN1bGFyIGVmZmVjdGl2ZSBjYXBhYmlsaXR5CiAgKiBAdHNrOiBUaGUgdGFzayB0byBxdWVyeQorICogQGNyZWQ6IFRoZSBjcmVkZW50aWFscyB0byB1c2UKICAqIEBjYXA6IFRoZSBjYXBhYmlsaXR5IHRvIGNoZWNrIGZvcgogICogQGF1ZGl0OiBXaGV0aGVyIHRvIHdyaXRlIGFuIGF1ZGl0IG1lc3NhZ2Ugb3Igbm90CiAgKgogICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIG5vbWluYXRlZCB0YXNrIGhhcyB0aGUgc3BlY2lmaWVkIGNhcGFiaWxpdHkgYW1vbmdzdAogICogaXRzIGVmZmVjdGl2ZSBzZXQsIHJldHVybmluZyAwIGlmIGl0IGRvZXMsIC12ZSBpZiBpdCBkb2VzIG5vdC4KICAqCi0gKiBOT1RFIFdFTEw6IGNhcF9jYXBhYmxlKCkgY2Fubm90IGJlIHVzZWQgbGlrZSB0aGUga2VybmVsJ3MgY2FwYWJsZSgpCi0gKiBmdW5jdGlvbi4gIFRoYXQgaXMsIGl0IGhhcyB0aGUgcmV2ZXJzZSBzZW1hbnRpY3M6IGNhcF9jYXBhYmxlKCkgcmV0dXJucyAwCi0gKiB3aGVuIGEgdGFzayBoYXMgYSBjYXBhYmlsaXR5LCBidXQgdGhlIGtlcm5lbCdzIGNhcGFibGUoKSByZXR1cm5zIDEgZm9yIHRoaXMKLSAqIGNhc2UuCisgKiBOT1RFIFdFTEw6IGNhcF9oYXNfY2FwYWJpbGl0eSgpIGNhbm5vdCBiZSB1c2VkIGxpa2UgdGhlIGtlcm5lbCdzIGNhcGFibGUoKQorICogYW5kIGhhc19jYXBhYmlsaXR5KCkgZnVuY3Rpb25zLiAgVGhhdCBpcywgaXQgaGFzIHRoZSByZXZlcnNlIHNlbWFudGljczoKKyAqIGNhcF9oYXNfY2FwYWJpbGl0eSgpIHJldHVybnMgMCB3aGVuIGEgdGFzayBoYXMgYSBjYXBhYmlsaXR5LCBidXQgdGhlCisgKiBrZXJuZWwncyBjYXBhYmxlKCkgYW5kIGhhc19jYXBhYmlsaXR5KCkgcmV0dXJucyAxIGZvciB0aGlzIGNhc2UuCiAgKi8KLWludCBjYXBfY2FwYWJsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IGNhcCwgaW50IGF1ZGl0KQoraW50IGNhcF9jYXBhYmxlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBjb25zdCBzdHJ1Y3QgY3JlZCAqY3JlZCwgaW50IGNhcCwKKwkJaW50IGF1ZGl0KQogewotCV9fdTMyIGNhcF9yYWlzZWQ7Ci0KLQkvKiBEZXJpdmVkIGZyb20gaW5jbHVkZS9saW51eC9zY2hlZC5oOmNhcGFibGUuICovCi0JcmN1X3JlYWRfbG9jaygpOwotCWNhcF9yYWlzZWQgPSBjYXBfcmFpc2VkKF9fdGFza19jcmVkKHRzayktPmNhcF9lZmZlY3RpdmUsIGNhcCk7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0JcmV0dXJuIGNhcF9yYWlzZWQgPyAwIDogLUVQRVJNOworCXJldHVybiBjYXBfcmFpc2VkKGNyZWQtPmNhcF9lZmZlY3RpdmUsIGNhcCkgPyAwIDogLUVQRVJNOwogfQogCiAvKioKQEAgLTE2MCw3ICsxNTYsOCBAQAogCS8qIHRoZXkgYXJlIHNvIGxpbWl0ZWQgdW5sZXNzIHRoZSBjdXJyZW50IHRhc2sgaGFzIHRoZSBDQVBfU0VUUENBUAogCSAqIGNhcGFiaWxpdHkKIAkgKi8KLQlpZiAoY2FwX2NhcGFibGUoY3VycmVudCwgQ0FQX1NFVFBDQVAsIFNFQ1VSSVRZX0NBUF9BVURJVCkgPT0gMCkKKwlpZiAoY2FwX2NhcGFibGUoY3VycmVudCwgY3VycmVudF9jcmVkKCksIENBUF9TRVRQQ0FQLAorCQkJU0VDVVJJVFlfQ0FQX0FVRElUKSA9PSAwKQogCQlyZXR1cm4gMDsKICNlbmRpZgogCXJldHVybiAxOwpAQCAtMjM4LDcgKzIzNSw3IEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKIAlpbnQgZXJyb3I7CiAKLQlpZiAoIWlub2RlLT5pX29wIHx8ICFpbm9kZS0+aV9vcC0+Z2V0eGF0dHIpCisJaWYgKCFpbm9kZS0+aV9vcC0+Z2V0eGF0dHIpCiAJICAgICAgIHJldHVybiAwOwogCiAJZXJyb3IgPSBpbm9kZS0+aV9vcC0+Z2V0eGF0dHIoZGVudHJ5LCBYQVRUUl9OQU1FX0NBUFMsIE5VTEwsIDApOwpAQCAtMjU5LDcgKzI1Niw3IEBACiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKIAotCWlmICghaW5vZGUtPmlfb3AgfHwgIWlub2RlLT5pX29wLT5yZW1vdmV4YXR0cikKKwlpZiAoIWlub2RlLT5pX29wLT5yZW1vdmV4YXR0cikKIAkgICAgICAgcmV0dXJuIDA7CiAKIAlyZXR1cm4gaW5vZGUtPmlfb3AtPnJlbW92ZXhhdHRyKGRlbnRyeSwgWEFUVFJfTkFNRV9DQVBTKTsKQEAgLTMxNyw3ICszMTQsNyBAQAogCiAJbWVtc2V0KGNwdV9jYXBzLCAwLCBzaXplb2Yoc3RydWN0IGNwdV92ZnNfY2FwX2RhdGEpKTsKIAotCWlmICghaW5vZGUgfHwgIWlub2RlLT5pX29wIHx8ICFpbm9kZS0+aV9vcC0+Z2V0eGF0dHIpCisJaWYgKCFpbm9kZSB8fCAhaW5vZGUtPmlfb3AtPmdldHhhdHRyKQogCQlyZXR1cm4gLUVOT0RBVEE7CiAKIAlzaXplID0gaW5vZGUtPmlfb3AtPmdldHhhdHRyKChzdHJ1Y3QgZGVudHJ5ICopZGVudHJ5LCBYQVRUUl9OQU1FX0NBUFMsICZjYXBzLApAQCAtODY5LDcgKzg2Niw4IEBACiAJCSAgICAgJiAobmV3LT5zZWN1cmViaXRzIF4gYXJnMikpCQkJLypbMV0qLwogCQkgICAgfHwgKChuZXctPnNlY3VyZWJpdHMgJiBTRUNVUkVfQUxMX0xPQ0tTICYgfmFyZzIpKQkvKlsyXSovCiAJCSAgICB8fCAoYXJnMiAmIH4oU0VDVVJFX0FMTF9MT0NLUyB8IFNFQ1VSRV9BTExfQklUUykpCS8qWzNdKi8KLQkJICAgIHx8IChjYXBfY2FwYWJsZShjdXJyZW50LCBDQVBfU0VUUENBUCwgU0VDVVJJVFlfQ0FQX0FVRElUKSAhPSAwKSAvKls0XSovCisJCSAgICB8fCAoY2FwX2NhcGFibGUoY3VycmVudCwgY3VycmVudF9jcmVkKCksIENBUF9TRVRQQ0FQLAorCQkJCSAgICBTRUNVUklUWV9DQVBfQVVESVQpICE9IDApCQkvKls0XSovCiAJCQkvKgogCQkJICogWzFdIG5vIGNoYW5naW5nIG9mIGJpdHMgdGhhdCBhcmUgbG9ja2VkCiAJCQkgKiBbMl0gbm8gdW5sb2NraW5nIG9mIGxvY2tzCkBAIC05NTAsNyArOTQ4LDggQEAKIHsKIAlpbnQgY2FwX3N5c19hZG1pbiA9IDA7CiAKLQlpZiAoY2FwX2NhcGFibGUoY3VycmVudCwgQ0FQX1NZU19BRE1JTiwgU0VDVVJJVFlfQ0FQX05PQVVESVQpID09IDApCisJaWYgKGNhcF9jYXBhYmxlKGN1cnJlbnQsIGN1cnJlbnRfY3JlZCgpLCBDQVBfU1lTX0FETUlOLAorCQkJU0VDVVJJVFlfQ0FQX05PQVVESVQpID09IDApCiAJCWNhcF9zeXNfYWRtaW4gPSAxOwogCXJldHVybiBfX3ZtX2Vub3VnaF9tZW1vcnkobW0sIHBhZ2VzLCBjYXBfc3lzX2FkbWluKTsKIH0KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2RldmljZV9jZ3JvdXAuYyBiL3NlY3VyaXR5L2RldmljZV9jZ3JvdXAuYwppbmRleCA1YmE3ODcwLi4zYWFjZDBmIDEwMDY0NAotLS0gYS9zZWN1cml0eS9kZXZpY2VfY2dyb3VwLmMKKysrIGIvc2VjdXJpdHkvZGV2aWNlX2Nncm91cC5jCkBAIC01MTMsMTEgKzUxMywxNCBAQAogCXN0cnVjdCBkZXZfY2dyb3VwICpkZXZfY2dyb3VwOwogCXN0cnVjdCBkZXZfd2hpdGVsaXN0X2l0ZW0gKndoOwogCisJaWYgKCFTX0lTQkxLKG1vZGUpICYmICFTX0lTQ0hSKG1vZGUpKQorCQlyZXR1cm4gMDsKKwogCXJjdV9yZWFkX2xvY2soKTsKIAogCWRldl9jZ3JvdXAgPSB0YXNrX2RldmNncm91cChjdXJyZW50KTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkod2gsICZkZXZfY2dyb3VwLT53aGl0ZWxpc3QsIGxpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSh3aCwgJmRldl9jZ3JvdXAtPndoaXRlbGlzdCwgbGlzdCkgewogCQlpZiAod2gtPnR5cGUgJiBERVZfQUxMKQogCQkJZ290byBhY2NfY2hlY2s7CiAJCWlmICgod2gtPnR5cGUgJiBERVZfQkxPQ0spICYmICFTX0lTQkxLKG1vZGUpKQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvaW5vZGUuYyBiL3NlY3VyaXR5L2lub2RlLmMKaW5kZXggZWZlYTVhNi4uMDA3ZWYyNSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvaW5vZGUuYworKysgYi9zZWN1cml0eS9pbm9kZS5jCkBAIC02MSw5ICs2MSw2IEBACiAKIAlpZiAoaW5vZGUpIHsKIAkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7Ci0JCWlub2RlLT5pX3VpZCA9IDA7Ci0JCWlub2RlLT5pX2dpZCA9IDA7Ci0JCWlub2RlLT5pX2Jsb2NrcyA9IDA7CiAJCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKIAkJc3dpdGNoIChtb2RlICYgU19JRk1UKSB7CiAJCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9zZWN1cml0eS9rZXlzL2tleWN0bC5jIGIvc2VjdXJpdHkva2V5cy9rZXljdGwuYwppbmRleCA2Njg4NzY1Li4wOTc5Njc5IDEwMDY0NAotLS0gYS9zZWN1cml0eS9rZXlzL2tleWN0bC5jCisrKyBiL3NlY3VyaXR5L2tleXMva2V5Y3RsLmMKQEAgLTEyOTQsNyArMTI5NCw3IEBACiAKIAljYXNlIEtFWUNUTF9HRVRfU0VDVVJJVFk6CiAJCXJldHVybiBrZXljdGxfZ2V0X3NlY3VyaXR5KChrZXlfc2VyaWFsX3QpIGFyZzIsCi0JCQkJCSAgIChjaGFyICopIGFyZzMsCisJCQkJCSAgIChjaGFyIF9fdXNlciAqKSBhcmczLAogCQkJCQkgICAoc2l6ZV90KSBhcmc0KTsKIAogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWN1cml0eS5jIGIvc2VjdXJpdHkvc2VjdXJpdHkuYwppbmRleCA2NzhkNGQwLi5jMzU4NmMwIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWN1cml0eS5jCisrKyBiL3NlY3VyaXR5L3NlY3VyaXR5LmMKQEAgLTE1NCwxNCArMTU0LDMyIEBACiAJCQkJICAgIGVmZmVjdGl2ZSwgaW5oZXJpdGFibGUsIHBlcm1pdHRlZCk7CiB9CiAKLWludCBzZWN1cml0eV9jYXBhYmxlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBpbnQgY2FwKQoraW50IHNlY3VyaXR5X2NhcGFibGUoaW50IGNhcCkKIHsKLQlyZXR1cm4gc2VjdXJpdHlfb3BzLT5jYXBhYmxlKHRzaywgY2FwLCBTRUNVUklUWV9DQVBfQVVESVQpOworCXJldHVybiBzZWN1cml0eV9vcHMtPmNhcGFibGUoY3VycmVudCwgY3VycmVudF9jcmVkKCksIGNhcCwKKwkJCQkgICAgIFNFQ1VSSVRZX0NBUF9BVURJVCk7CiB9CiAKLWludCBzZWN1cml0eV9jYXBhYmxlX25vYXVkaXQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGludCBjYXApCitpbnQgc2VjdXJpdHlfcmVhbF9jYXBhYmxlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBpbnQgY2FwKQogewotCXJldHVybiBzZWN1cml0eV9vcHMtPmNhcGFibGUodHNrLCBjYXAsIFNFQ1VSSVRZX0NBUF9OT0FVRElUKTsKKwljb25zdCBzdHJ1Y3QgY3JlZCAqY3JlZDsKKwlpbnQgcmV0OworCisJY3JlZCA9IGdldF90YXNrX2NyZWQodHNrKTsKKwlyZXQgPSBzZWN1cml0eV9vcHMtPmNhcGFibGUodHNrLCBjcmVkLCBjYXAsIFNFQ1VSSVRZX0NBUF9BVURJVCk7CisJcHV0X2NyZWQoY3JlZCk7CisJcmV0dXJuIHJldDsKK30KKworaW50IHNlY3VyaXR5X3JlYWxfY2FwYWJsZV9ub2F1ZGl0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBpbnQgY2FwKQoreworCWNvbnN0IHN0cnVjdCBjcmVkICpjcmVkOworCWludCByZXQ7CisKKwljcmVkID0gZ2V0X3Rhc2tfY3JlZCh0c2spOworCXJldCA9IHNlY3VyaXR5X29wcy0+Y2FwYWJsZSh0c2ssIGNyZWQsIGNhcCwgU0VDVVJJVFlfQ0FQX05PQVVESVQpOworCXB1dF9jcmVkKGNyZWQpOworCXJldHVybiByZXQ7CiB9CiAKIGludCBzZWN1cml0eV9hY2N0KHN0cnVjdCBmaWxlICpmaWxlKQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9LY29uZmlnIGIvc2VjdXJpdHkvc2VsaW51eC9LY29uZmlnCmluZGV4IDI2MzAxZGQuLmJjYTFiNzQgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvS2NvbmZpZworKysgYi9zZWN1cml0eS9zZWxpbnV4L0tjb25maWcKQEAgLTk0LDMzICs5NCw2IEBACiAKIAkgIElmIHlvdSBhcmUgdW5zdXJlIGhvdyB0byBhbnN3ZXIgdGhpcyBxdWVzdGlvbiwgYW5zd2VyIDEuCiAKLWNvbmZpZyBTRUNVUklUWV9TRUxJTlVYX0VOQUJMRV9TRUNNQVJLX0RFRkFVTFQKLQlib29sICJOU0EgU0VMaW51eCBlbmFibGUgbmV3IHNlY21hcmsgbmV0d29yayBjb250cm9scyBieSBkZWZhdWx0IgotCWRlcGVuZHMgb24gU0VDVVJJVFlfU0VMSU5VWAotCWRlZmF1bHQgbgotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGRldGVybWluZXMgd2hldGhlciB0aGUgbmV3IHNlY21hcmstYmFzZWQgbmV0d29yawotCSAgY29udHJvbHMgd2lsbCBiZSBlbmFibGVkIGJ5IGRlZmF1bHQuICBJZiBub3QsIHRoZSBvbGQgaW50ZXJuYWwKLQkgIHBlci1wYWNrZXQgY29udHJvbHMgd2lsbCBiZSBlbmFibGVkIGJ5IGRlZmF1bHQsIHByZXNlcnZpbmcKLQkgIG9sZCBiZWhhdmlvci4KLQotCSAgSWYgeW91IGVuYWJsZSB0aGUgbmV3IGNvbnRyb2xzLCB5b3Ugd2lsbCBuZWVkIHVwZGF0ZWQKLQkgIFNFTGludXggdXNlcnNwYWNlIGxpYnJhcmllcywgdG9vbHMgYW5kIHBvbGljeS4gIFR5cGljYWxseSwKLQkgIHlvdXIgZGlzdHJpYnV0aW9uIHdpbGwgcHJvdmlkZSB0aGVzZSBhbmQgZW5hYmxlIHRoZSBuZXcgY29udHJvbHMKLQkgIGluIHRoZSBrZXJuZWwgdGhleSBhbHNvIGRpc3RyaWJ1dGUuCi0KLQkgIE5vdGUgdGhhdCB0aGlzIG9wdGlvbiBjYW4gYmUgb3ZlcnJpZGRlbiBhdCBib290IHdpdGggdGhlCi0JICBzZWxpbnV4X2NvbXBhdF9uZXQgcGFyYW1ldGVyLCBhbmQgYWZ0ZXIgYm9vdCB2aWEKLQkgIC9zZWxpbnV4L2NvbXBhdF9uZXQuICBTZWUgRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKLQkgIGZvciBkZXRhaWxzIG9uIHRoaXMgcGFyYW1ldGVyLgotCi0JICBJZiB5b3UgZW5hYmxlIHRoZSBuZXcgbmV0d29yayBjb250cm9scywgeW91IHdpbGwgbGlrZWx5Ci0JICBhbHNvIHJlcXVpcmUgdGhlIFNFQ01BUksgYW5kIENPTk5TRUNNQVJLIHRhcmdldHMsIGFzCi0JICB3ZWxsIGFzIGFueSBjb25udHJhY2sgaGVscGVycyBmb3IgcHJvdG9jb2xzIHdoaWNoIHlvdQotCSAgd2lzaCB0byBjb250cm9sLgotCi0JICBJZiB5b3UgYXJlIHVuc3VyZSB3aGF0IHRvIGRvIGhlcmUsIHNlbGVjdCBOLgotCiBjb25maWcgU0VDVVJJVFlfU0VMSU5VWF9QT0xJQ1lEQl9WRVJTSU9OX01BWAogCWJvb2wgIk5TQSBTRUxpbnV4IG1heGltdW0gc3VwcG9ydGVkIHBvbGljeSBmb3JtYXQgdmVyc2lvbiIKIAlkZXBlbmRzIG9uIFNFQ1VSSVRZX1NFTElOVVgKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvYXZjLmMgYi9zZWN1cml0eS9zZWxpbnV4L2F2Yy5jCmluZGV4IGQ0M2JkNmIuLmViNDFmNDMgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvYXZjLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9hdmMuYwpAQCAtNTMsMTggKzUzLDIwIEBACiAjdW5kZWYgU18KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhdl9pbmhlcml0IGF2X2luaGVyaXRbXSA9IHsKLSNkZWZpbmUgU18oYywgaSwgYikgeyBjLCBjb21tb25fIyNpIyNfcGVybV90b19zdHJpbmcsIGIgfSwKKyNkZWZpbmUgU18oYywgaSwgYikgewkudGNsYXNzID0gYyxcCisJCQkuY29tbW9uX3B0cyA9IGNvbW1vbl8jI2kjI19wZXJtX3RvX3N0cmluZyxcCisJCQkuY29tbW9uX2Jhc2UgPSAgYiB9LAogI2luY2x1ZGUgImF2X2luaGVyaXQuaCIKICN1bmRlZiBTXwogfTsKIAogY29uc3Qgc3RydWN0IHNlbGludXhfY2xhc3NfcGVybSBzZWxpbnV4X2NsYXNzX3Blcm0gPSB7Ci0JYXZfcGVybV90b19zdHJpbmcsCi0JQVJSQVlfU0laRShhdl9wZXJtX3RvX3N0cmluZyksCi0JY2xhc3NfdG9fc3RyaW5nLAotCUFSUkFZX1NJWkUoY2xhc3NfdG9fc3RyaW5nKSwKLQlhdl9pbmhlcml0LAotCUFSUkFZX1NJWkUoYXZfaW5oZXJpdCkKKwkuYXZfcGVybV90b19zdHJpbmcgPSBhdl9wZXJtX3RvX3N0cmluZywKKwkuYXZfcHRzX2xlbiA9IEFSUkFZX1NJWkUoYXZfcGVybV90b19zdHJpbmcpLAorCS5jbGFzc190b19zdHJpbmcgPSBjbGFzc190b19zdHJpbmcsCisJLmN0c19sZW4gPSBBUlJBWV9TSVpFKGNsYXNzX3RvX3N0cmluZyksCisJLmF2X2luaGVyaXQgPSBhdl9pbmhlcml0LAorCS5hdl9pbmhlcml0X2xlbiA9IEFSUkFZX1NJWkUoYXZfaW5oZXJpdCkKIH07CiAKICNkZWZpbmUgQVZDX0NBQ0hFX1NMT1RTCQkJNTEyCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMgYi9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMKaW5kZXggZGJlYWE3OC4uMDA4MTU5NyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYwpAQCAtMTQzMywxMiArMTQzMywxMyBAQAogCiAvKiBDaGVjayB3aGV0aGVyIGEgdGFzayBpcyBhbGxvd2VkIHRvIHVzZSBhIGNhcGFiaWxpdHkuICovCiBzdGF0aWMgaW50IHRhc2tfaGFzX2NhcGFiaWxpdHkoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQsCiAJCQkgICAgICAgaW50IGNhcCwgaW50IGF1ZGl0KQogewogCXN0cnVjdCBhdmNfYXVkaXRfZGF0YSBhZDsKIAlzdHJ1Y3QgYXZfZGVjaXNpb24gYXZkOwogCXUxNiBzY2xhc3M7Ci0JdTMyIHNpZCA9IHRhc2tfc2lkKHRzayk7CisJdTMyIHNpZCA9IGNyZWRfc2lkKGNyZWQpOwogCXUzMiBhdiA9IENBUF9UT19NQVNLKGNhcCk7CiAJaW50IHJjOwogCkBAIC0xODY1LDE1ICsxODY2LDE2IEBACiAJcmV0dXJuIGNyZWRfaGFzX3Blcm0ob2xkLCBuZXcsIFBST0NFU1NfX1NFVENBUCk7CiB9CiAKLXN0YXRpYyBpbnQgc2VsaW51eF9jYXBhYmxlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBpbnQgY2FwLCBpbnQgYXVkaXQpCitzdGF0aWMgaW50IHNlbGludXhfY2FwYWJsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQsCisJCQkgICBpbnQgY2FwLCBpbnQgYXVkaXQpCiB7CiAJaW50IHJjOwogCi0JcmMgPSBzZWNvbmRhcnlfb3BzLT5jYXBhYmxlKHRzaywgY2FwLCBhdWRpdCk7CisJcmMgPSBzZWNvbmRhcnlfb3BzLT5jYXBhYmxlKHRzaywgY3JlZCwgY2FwLCBhdWRpdCk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKLQlyZXR1cm4gdGFza19oYXNfY2FwYWJpbGl0eSh0c2ssIGNhcCwgYXVkaXQpOworCXJldHVybiB0YXNrX2hhc19jYXBhYmlsaXR5KHRzaywgY3JlZCwgY2FwLCBhdWRpdCk7CiB9CiAKIHN0YXRpYyBpbnQgc2VsaW51eF9zeXNjdGxfZ2V0X3NpZChjdGxfdGFibGUgKnRhYmxlLCB1MTYgdGNsYXNzLCB1MzIgKnNpZCkKQEAgLTIwMzcsNyArMjAzOSw4IEBACiB7CiAJaW50IHJjLCBjYXBfc3lzX2FkbWluID0gMDsKIAotCXJjID0gc2VsaW51eF9jYXBhYmxlKGN1cnJlbnQsIENBUF9TWVNfQURNSU4sIFNFQ1VSSVRZX0NBUF9OT0FVRElUKTsKKwlyYyA9IHNlbGludXhfY2FwYWJsZShjdXJyZW50LCBjdXJyZW50X2NyZWQoKSwgQ0FQX1NZU19BRE1JTiwKKwkJCSAgICAgU0VDVVJJVFlfQ0FQX05PQVVESVQpOwogCWlmIChyYyA9PSAwKQogCQljYXBfc3lzX2FkbWluID0gMTsKIApAQCAtMjg4MCw3ICsyODgzLDggQEAKIAkgKiBhbmQgbGFjayBvZiBwZXJtaXNzaW9uIGp1c3QgbWVhbnMgdGhhdCB3ZSBmYWxsIGJhY2sgdG8gdGhlCiAJICogaW4tY29yZSBjb250ZXh0IHZhbHVlLCBub3QgYSBkZW5pYWwuCiAJICovCi0JZXJyb3IgPSBzZWxpbnV4X2NhcGFibGUoY3VycmVudCwgQ0FQX01BQ19BRE1JTiwgU0VDVVJJVFlfQ0FQX05PQVVESVQpOworCWVycm9yID0gc2VsaW51eF9jYXBhYmxlKGN1cnJlbnQsIGN1cnJlbnRfY3JlZCgpLCBDQVBfTUFDX0FETUlOLAorCQkJCVNFQ1VSSVRZX0NBUF9OT0FVRElUKTsKIAlpZiAoIWVycm9yKQogCQllcnJvciA9IHNlY3VyaXR5X3NpZF90b19jb250ZXh0X2ZvcmNlKGlzZWMtPnNpZCwgJmNvbnRleHQsCiAJCQkJCQkgICAgICAmc2l6ZSk7CkBAIC00MTg1LDcgKzQxODksNyBAQAogc3RhdGljIGludCBzZWxpbnV4X3NvY2tfcmN2X3NrYl9jb21wYXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCSAgICAgICB1MTYgZmFtaWx5KQogewotCWludCBlcnI7CisJaW50IGVyciA9IDA7CiAJc3RydWN0IHNrX3NlY3VyaXR5X3N0cnVjdCAqc2tzZWMgPSBzay0+c2tfc2VjdXJpdHk7CiAJdTMyIHBlZXJfc2lkOwogCXUzMiBza19zaWQgPSBza3NlYy0+c2lkOwpAQCAtNDIwMiw3ICs0MjA2LDcgQEAKIAlpZiAoc2VsaW51eF9jb21wYXRfbmV0KQogCQllcnIgPSBzZWxpbnV4X3NvY2tfcmN2X3NrYl9pcHRhYmxlc19jb21wYXQoc2ssIHNrYiwgJmFkLAogCQkJCQkJCSAgIGZhbWlseSwgYWRkcnApOwotCWVsc2UKKwllbHNlIGlmIChzZWxpbnV4X3NlY21hcmtfZW5hYmxlZCgpKQogCQllcnIgPSBhdmNfaGFzX3Blcm0oc2tfc2lkLCBza2ItPnNlY21hcmssIFNFQ0NMQVNTX1BBQ0tFVCwKIAkJCQkgICBQQUNLRVRfX1JFQ1YsICZhZCk7CiAJaWYgKGVycikKQEAgLTQ3MDUsNyArNDcwOSw3IEBACiAJCWlmIChzZWxpbnV4X2lwX3Bvc3Ryb3V0ZV9pcHRhYmxlc19jb21wYXQoc2tiLT5zaywgaWZpbmRleCwKIAkJCQkJCQkgJmFkLCBmYW1pbHksIGFkZHJwKSkKIAkJCXJldHVybiBORl9EUk9QOwotCX0gZWxzZSB7CisJfSBlbHNlIGlmIChzZWxpbnV4X3NlY21hcmtfZW5hYmxlZCgpKSB7CiAJCWlmIChhdmNfaGFzX3Blcm0oc2tzZWMtPnNpZCwgc2tiLT5zZWNtYXJrLAogCQkJCSBTRUNDTEFTU19QQUNLRVQsIFBBQ0tFVF9fU0VORCwgJmFkKSkKIAkJCXJldHVybiBORl9EUk9QOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2F2Y19zcy5oIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2F2Y19zcy5oCmluZGV4IGMwZDMxNGQuLmJiMWVjODAgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9hdmNfc3MuaAorKysgYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvYXZjX3NzLmgKQEAgLTE3LDE2ICsxNywxNiBAQAogfTsKIAogc3RydWN0IGF2X2luaGVyaXQgewotCXUxNiB0Y2xhc3M7CiAJY29uc3QgY2hhciAqKmNvbW1vbl9wdHM7CiAJdTMyIGNvbW1vbl9iYXNlOworCXUxNiB0Y2xhc3M7CiB9OwogCiBzdHJ1Y3Qgc2VsaW51eF9jbGFzc19wZXJtIHsKIAljb25zdCBzdHJ1Y3QgYXZfcGVybV90b19zdHJpbmcgKmF2X3Blcm1fdG9fc3RyaW5nOwogCXUzMiBhdl9wdHNfbGVuOwotCWNvbnN0IGNoYXIgKipjbGFzc190b19zdHJpbmc7CiAJdTMyIGN0c19sZW47CisJY29uc3QgY2hhciAqKmNsYXNzX3RvX3N0cmluZzsKIAljb25zdCBzdHJ1Y3QgYXZfaW5oZXJpdCAqYXZfaW5oZXJpdDsKIAl1MzIgYXZfaW5oZXJpdF9sZW47CiB9OwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zZWxpbnV4ZnMuYyBiL3NlY3VyaXR5L3NlbGludXgvc2VsaW51eGZzLmMKaW5kZXggZTU1MjA5OS4uMDFlYzZkMiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zZWxpbnV4ZnMuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3NlbGludXhmcy5jCkBAIC00NywxMyArNDcsNyBAQAogCiB1bnNpZ25lZCBpbnQgc2VsaW51eF9jaGVja3JlcXByb3QgPSBDT05GSUdfU0VDVVJJVFlfU0VMSU5VWF9DSEVDS1JFUVBST1RfVkFMVUU7CiAKLSNpZmRlZiBDT05GSUdfU0VDVVJJVFlfU0VMSU5VWF9FTkFCTEVfU0VDTUFSS19ERUZBVUxUCi0jZGVmaW5lIFNFTElOVVhfQ09NUEFUX05FVF9WQUxVRSAwCi0jZWxzZQotI2RlZmluZSBTRUxJTlVYX0NPTVBBVF9ORVRfVkFMVUUgMQotI2VuZGlmCi0KLWludCBzZWxpbnV4X2NvbXBhdF9uZXQgPSBTRUxJTlVYX0NPTVBBVF9ORVRfVkFMVUU7CitpbnQgc2VsaW51eF9jb21wYXRfbmV0ID0gMDsKIAogc3RhdGljIGludCBfX2luaXQgY2hlY2tyZXFwcm90X3NldHVwKGNoYXIgKnN0cikKIHsKQEAgLTQ5NCw3ICs0ODgsMTMgQEAKIAlpZiAoc3NjYW5mKHBhZ2UsICIlZCIsICZuZXdfdmFsdWUpICE9IDEpCiAJCWdvdG8gb3V0OwogCi0Jc2VsaW51eF9jb21wYXRfbmV0ID0gbmV3X3ZhbHVlID8gMSA6IDA7CisJaWYgKG5ld192YWx1ZSkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UKKwkJICAgICAgICJTRUxpbnV4OiBjb21wYXRfbmV0IGlzIGRlcHJlY2F0ZWQsIHBsZWFzZSB1c2Ugc2VjbWFyayIKKwkJICAgICAgICIgaW5zdGVhZFxuIik7CisJCXNlbGludXhfY29tcGF0X25ldCA9IDE7CisJfSBlbHNlCisJCXNlbGludXhfY29tcGF0X25ldCA9IDA7CiAJbGVuZ3RoID0gY291bnQ7CiBvdXQ6CiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBwYWdlKTsKQEAgLTg0Nyw4ICs4NDcsNiBAQAogCiAJaWYgKHJldCkgewogCQlyZXQtPmlfbW9kZSA9IG1vZGU7Ci0JCXJldC0+aV91aWQgPSByZXQtPmlfZ2lkID0gMDsKLQkJcmV0LT5pX2Jsb2NrcyA9IDA7CiAJCXJldC0+aV9hdGltZSA9IHJldC0+aV9tdGltZSA9IHJldC0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKIAl9CiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc3MvY29udGV4dC5oIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9jb250ZXh0LmgKaW5kZXggNjU4YzJiZC4uZDlkZDdhMiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9jb250ZXh0LmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9jb250ZXh0LmgKQEAgLTI3LDkgKzI3LDkgQEAKIAl1MzIgdXNlcjsKIAl1MzIgcm9sZTsKIAl1MzIgdHlwZTsKKwl1MzIgbGVuOyAgICAgICAgLyogbGVuZ3RoIG9mIHN0cmluZyBpbiBieXRlcyAqLwogCXN0cnVjdCBtbHNfcmFuZ2UgcmFuZ2U7CiAJY2hhciAqc3RyOwkvKiBzdHJpbmcgcmVwcmVzZW50YXRpb24gaWYgY29udGV4dCBjYW5ub3QgYmUgbWFwcGVkLiAqLwotCXUzMiBsZW47ICAgICAgICAvKiBsZW5ndGggb2Ygc3RyaW5nIGluIGJ5dGVzICovCiB9OwogCiBzdGF0aWMgaW5saW5lIHZvaWQgbWxzX2NvbnRleHRfaW5pdChzdHJ1Y3QgY29udGV4dCAqYykKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrLmggYi9zZWN1cml0eS9zbWFjay9zbWFjay5oCmluZGV4IDMxZGNlNTUuLmI3OTU4MmUgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrLmgKKysrIGIvc2VjdXJpdHkvc21hY2svc21hY2suaApAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KICNpbmNsdWRlIDxuZXQvbmV0bGFiZWwuaD4KIAogLyoKQEAgLTM5LDYgKzQwLDcgQEAKIHN0cnVjdCBzb2NrZXRfc21hY2sgewogCWNoYXIJCSpzbWtfb3V0OwkJCS8qIG91dGJvdW5kIGxhYmVsICovCiAJY2hhcgkJKnNta19pbjsJCQkvKiBpbmJvdW5kIGxhYmVsICovCisJaW50CQlzbWtfbGFiZWxlZDsJCQkvKiBsYWJlbCBzY2hlbWUgKi8KIAljaGFyCQlzbWtfcGFja2V0W1NNS19MQUJFTExFTl07CS8qIFRDUCBwZWVyIGxhYmVsICovCiB9OwogCkBAIC04MCw2ICs4MiwxNiBAQAogfTsKIAogLyoKKyAqIEFuIGVudHJ5IGluIHRoZSB0YWJsZSBpZGVudGlmeWluZyBob3N0cy4KKyAqLworc3RydWN0IHNta19uZXRsYmxhZGRyIHsKKwlzdHJ1Y3Qgc21rX25ldGxibGFkZHIJKnNta19uZXh0OworCXN0cnVjdCBzb2NrYWRkcl9pbglzbWtfaG9zdDsJLyogbmV0d29yayBhZGRyZXNzICovCisJc3RydWN0IGluX2FkZHIJCXNta19tYXNrOwkvKiBuZXR3b3JrIG1hc2sgKi8KKwljaGFyCQkJKnNta19sYWJlbDsJLyogbGFiZWwgKi8KK307CisKKy8qCiAgKiBUaGlzIGlzIHRoZSByZXBvc2l0b3J5IGZvciBsYWJlbHMgc2VlbiBzbyB0aGF0IGl0IGlzCiAgKiBub3QgbmVjZXNzYXJ5IHRvIGtlZXAgYWxsb2NhdGluZyB0aW55IGNodW5ja3Mgb2YgbWVtb3J5CiAgKiBhbmQgc28gdGhhdCB0aGV5IGNhbiBiZSBzaGFyZWQuCkBAIC0xMjcsNiArMTM5LDIwIEBACiAjZGVmaW5lIFhBVFRSX05BTUVfU01BQ0tJUE9VVAlYQVRUUl9TRUNVUklUWV9QUkVGSVggWEFUVFJfU01BQ0tfSVBPVVQKIAogLyoKKyAqIEhvdyBjb21tdW5pY2F0aW9ucyBvbiB0aGlzIHNvY2tldCBhcmUgdHJlYXRlZC4KKyAqIFVzdWFsbHkgaXQncyBkZXRlcm1pbmVkIGJ5IHRoZSB1bmRlcmx5aW5nIG5ldGxhYmVsIGNvZGUKKyAqIGJ1dCB0aGVyZSBhcmUgY2VydGFpbiBjYXNlcywgaW5jbHVkaW5nIHNpbmdsZSBsYWJlbCBob3N0cworICogYW5kIHBvdGVudGlhbGx5IHNpbmdsZSBsYWJlbCBpbnRlcmZhY2VzIGZvciB3aGljaCB0aGUKKyAqIHRyZWF0bWVudCBjYW4gbm90IGJlIGtub3duIGluIGFkdmFuY2UuCisgKgorICogVGhlIHBvc3NpYmlsaXR5IG9mIGFkZGl0aW9uYWwgbGFiZWxpbmcgc2NoZW1lcyBiZWluZworICogaW50cm9kdWNlZCBpbiB0aGUgZnV0dXJlIGV4aXN0cyBhcyB3ZWxsLgorICovCisjZGVmaW5lIFNNQUNLX1VOTEFCRUxFRF9TT0NLRVQJMAorI2RlZmluZSBTTUFDS19DSVBTT19TT0NLRVQJMQorCisvKgorICogc21hY2tmcyBtYWdpYyBudW1iZXIKICAqIHNtYWNrZnMgbWFjaWMgbnVtYmVyCiAgKi8KICNkZWZpbmUgU01BQ0tfTUFHSUMJMHg0MzQxNWQ1MyAvKiAiU01BQyIgKi8KQEAgLTE0MSw2ICsxNjcsNyBAQAogICogQ0lQU08gZGVmYXVsdHMuCiAgKi8KICNkZWZpbmUgU01BQ0tfQ0lQU09fRE9JX0RFRkFVTFQJCTMJLyogSGlzdG9yaWNhbCAqLworI2RlZmluZSBTTUFDS19DSVBTT19ET0lfSU5WQUxJRAkJLTEJLyogTm90IGEgRE9JICovCiAjZGVmaW5lIFNNQUNLX0NJUFNPX0RJUkVDVF9ERUZBVUxUCTI1MAkvKiBBcmJpdHJhcnkgKi8KICNkZWZpbmUgU01BQ0tfQ0lQU09fTUFYQ0FUVkFMCQk2MwkvKiBCaWdnZXIgZ2V0cyBoYXJkZXIgKi8KICNkZWZpbmUgU01BQ0tfQ0lQU09fTUFYTEVWRUwgICAgICAgICAgICAyNTUgICAgIC8qIENJUFNPIDIuMiBzdGFuZGFyZCAqLwpAQCAtMTc2LDcgKzIwMyw2IEBACiAgKiBTaGFyZWQgZGF0YS4KICAqLwogZXh0ZXJuIGludCBzbWFja19jaXBzb19kaXJlY3Q7Ci1leHRlcm4gaW50IHNtYWNrX25ldF9ubHR5cGU7CiBleHRlcm4gY2hhciAqc21hY2tfbmV0X2FtYmllbnQ7CiBleHRlcm4gY2hhciAqc21hY2tfb25seWNhcDsKIApAQCAtMTg2LDkgKzIxMiwxMCBAQAogZXh0ZXJuIHN0cnVjdCBzbWFja19rbm93biBzbWFja19rbm93bl9odWg7CiBleHRlcm4gc3RydWN0IHNtYWNrX2tub3duIHNtYWNrX2tub3duX2ludmFsaWQ7CiBleHRlcm4gc3RydWN0IHNtYWNrX2tub3duIHNtYWNrX2tub3duX3N0YXI7Ci1leHRlcm4gc3RydWN0IHNtYWNrX2tub3duIHNtYWNrX2tub3duX3Vuc2V0OworZXh0ZXJuIHN0cnVjdCBzbWFja19rbm93biBzbWFja19rbm93bl93ZWI7CiAKIGV4dGVybiBzdHJ1Y3Qgc21rX2xpc3RfZW50cnkgKnNtYWNrX2xpc3Q7CitleHRlcm4gc3RydWN0IHNta19uZXRsYmxhZGRyICpzbWFja19uZXRsYmxhZGRyczsKIGV4dGVybiBzdHJ1Y3Qgc2VjdXJpdHlfb3BlcmF0aW9ucyBzbWFja19vcHM7CiAKIC8qCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zbWFjay9zbWFja19hY2Nlc3MuYyBiL3NlY3VyaXR5L3NtYWNrL3NtYWNrX2FjY2Vzcy5jCmluZGV4IDI0N2NlYzMuLjJlMGI4M2UgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrX2FjY2Vzcy5jCisrKyBiL3NlY3VyaXR5L3NtYWNrL3NtYWNrX2FjY2Vzcy5jCkBAIC0xNSwxNSArMTUsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSAic21hY2suaCIKIAotc3RydWN0IHNtYWNrX2tub3duIHNtYWNrX2tub3duX3Vuc2V0ID0gewotCS5zbWtfbmV4dAk9IE5VTEwsCi0JLnNta19rbm93bgk9ICJVTlNFVCIsCi0JLnNta19zZWNpZAk9IDEsCi0JLnNta19jaXBzbwk9IE5VTEwsCi19OwotCiBzdHJ1Y3Qgc21hY2tfa25vd24gc21hY2tfa25vd25faHVoID0gewotCS5zbWtfbmV4dAk9ICZzbWFja19rbm93bl91bnNldCwKKwkuc21rX25leHQJPSBOVUxMLAogCS5zbWtfa25vd24JPSAiPyIsCiAJLnNta19zZWNpZAk9IDIsCiAJLnNta19jaXBzbwk9IE5VTEwsCkBAIC01Nyw3ICs1MCwxNCBAQAogCS5zbWtfY2lwc28JPSBOVUxMLAogfTsKIAotc3RydWN0IHNtYWNrX2tub3duICpzbWFja19rbm93biA9ICZzbWFja19rbm93bl9pbnZhbGlkOworc3RydWN0IHNtYWNrX2tub3duIHNtYWNrX2tub3duX3dlYiA9IHsKKwkuc21rX25leHQJPSAmc21hY2tfa25vd25faW52YWxpZCwKKwkuc21rX2tub3duCT0gIkAiLAorCS5zbWtfc2VjaWQJPSA3LAorCS5zbWtfY2lwc28JPSBOVUxMLAorfTsKKworc3RydWN0IHNtYWNrX2tub3duICpzbWFja19rbm93biA9ICZzbWFja19rbm93bl93ZWI7CiAKIC8qCiAgKiBUaGUgaW5pdGlhbCB2YWx1ZSBuZWVkcyB0byBiZSBiaWdnZXIgdGhhbiBhbnkgb2YgdGhlCkBAIC05OSw2ICs5OSwxNiBAQAogCSAgICBzdHJjbXAoc3ViamVjdF9sYWJlbCwgc21hY2tfa25vd25fc3Rhci5zbWtfa25vd24pID09IDApCiAJCXJldHVybiAtRUFDQ0VTOwogCS8qCisJICogQW4gaW50ZXJuZXQgb2JqZWN0IGNhbiBiZSBhY2Nlc3NlZCBieSBhbnkgc3ViamVjdC4KKwkgKiBUYXNrcyBjYW5ub3QgYmUgYXNzaWduZWQgdGhlIGludGVybmV0IGxhYmVsLgorCSAqIEFuIGludGVybmV0IHN1YmplY3QgY2FuIGFjY2VzcyBhbnkgb2JqZWN0LgorCSAqLworCWlmIChvYmplY3RfbGFiZWwgPT0gc21hY2tfa25vd25fd2ViLnNta19rbm93biB8fAorCSAgICBzdWJqZWN0X2xhYmVsID09IHNtYWNrX2tub3duX3dlYi5zbWtfa25vd24gfHwKKwkgICAgc3RyY21wKG9iamVjdF9sYWJlbCwgc21hY2tfa25vd25fd2ViLnNta19rbm93bikgPT0gMCB8fAorCSAgICBzdHJjbXAoc3ViamVjdF9sYWJlbCwgc21hY2tfa25vd25fd2ViLnNta19rbm93bikgPT0gMCkKKwkJcmV0dXJuIDA7CisJLyoKIAkgKiBBIHN0YXIgb2JqZWN0IGNhbiBiZSBhY2Nlc3NlZCBieSBhbnkgc3ViamVjdC4KIAkgKi8KIAlpZiAob2JqZWN0X2xhYmVsID09IHNtYWNrX2tub3duX3N0YXIuc21rX2tub3duIHx8CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zbWFjay9zbWFja19sc20uYyBiL3NlY3VyaXR5L3NtYWNrL3NtYWNrX2xzbS5jCmluZGV4IDg0ODIxMmYuLjAyNzhiYzAgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrX2xzbS5jCisrKyBiL3NlY3VyaXR5L3NtYWNrL3NtYWNrX2xzbS5jCkBAIC0xMjc3LDYgKzEyNzcsNyBAQAogCiAJc3NwLT5zbWtfaW4gPSBjc3A7CiAJc3NwLT5zbWtfb3V0ID0gY3NwOworCXNzcC0+c21rX2xhYmVsZWQgPSBTTUFDS19DSVBTT19TT0NLRVQ7CiAJc3NwLT5zbWtfcGFja2V0WzBdID0gJ1wwJzsKIAogCXNrLT5za19zZWN1cml0eSA9IHNzcDsKQEAgLTEzNDEsNDUgKzEzNDIsNjkgQEAKIAlzdHJ1Y3Qgc21hY2tfY2lwc28gY2lwc287CiAJaW50IHJjOwogCi0Jc3dpdGNoIChzbWFja19uZXRfbmx0eXBlKSB7Ci0JY2FzZSBORVRMQkxfTkxUWVBFX0NJUFNPVjQ6Ci0JCW5sc3AtPmRvbWFpbiA9IHNtYWNrOwotCQlubHNwLT5mbGFncyA9IE5FVExCTF9TRUNBVFRSX0RPTUFJTiB8IE5FVExCTF9TRUNBVFRSX01MU19MVkw7CisJbmxzcC0+ZG9tYWluID0gc21hY2s7CisJbmxzcC0+ZmxhZ3MgPSBORVRMQkxfU0VDQVRUUl9ET01BSU4gfCBORVRMQkxfU0VDQVRUUl9NTFNfTFZMOwogCi0JCXJjID0gc21hY2tfdG9fY2lwc28oc21hY2ssICZjaXBzbyk7Ci0JCWlmIChyYyA9PSAwKSB7Ci0JCQlubHNwLT5hdHRyLm1scy5sdmwgPSBjaXBzby5zbWtfbGV2ZWw7Ci0JCQlzbWFja19zZXRfY2F0c2V0KGNpcHNvLnNta19jYXRzZXQsIG5sc3ApOwotCQl9IGVsc2UgewotCQkJbmxzcC0+YXR0ci5tbHMubHZsID0gc21hY2tfY2lwc29fZGlyZWN0OwotCQkJc21hY2tfc2V0X2NhdHNldChzbWFjaywgbmxzcCk7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7CisJcmMgPSBzbWFja190b19jaXBzbyhzbWFjaywgJmNpcHNvKTsKKwlpZiAocmMgPT0gMCkgeworCQlubHNwLT5hdHRyLm1scy5sdmwgPSBjaXBzby5zbWtfbGV2ZWw7CisJCXNtYWNrX3NldF9jYXRzZXQoY2lwc28uc21rX2NhdHNldCwgbmxzcCk7CisJfSBlbHNlIHsKKwkJbmxzcC0+YXR0ci5tbHMubHZsID0gc21hY2tfY2lwc29fZGlyZWN0OworCQlzbWFja19zZXRfY2F0c2V0KHNtYWNrLCBubHNwKTsKIAl9CiB9CiAKIC8qKgogICogc21hY2tfbmV0bGFiZWwgLSBTZXQgdGhlIHNlY2F0dHIgb24gYSBzb2NrZXQKICAqIEBzazogdGhlIHNvY2tldAorICogQGxhYmVsZWQ6IHNvY2tldCBsYWJlbCBzY2hlbWUKICAqCiAgKiBDb252ZXJ0IHRoZSBvdXRib3VuZCBzbWFjayB2YWx1ZSAoc21rX291dCkgdG8gYQogICogc2VjYXR0ciBhbmQgYXR0YWNoIGl0IHRvIHRoZSBzb2NrZXQuCiAgKgogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgYW4gZXJyb3IgY29kZQogICovCi1zdGF0aWMgaW50IHNtYWNrX25ldGxhYmVsKHN0cnVjdCBzb2NrICpzaykKK3N0YXRpYyBpbnQgc21hY2tfbmV0bGFiZWwoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGFiZWxlZCkKIHsKIAlzdHJ1Y3Qgc29ja2V0X3NtYWNrICpzc3A7CiAJc3RydWN0IG5ldGxibF9sc21fc2VjYXR0ciBzZWNhdHRyOwotCWludCByYzsKKwlpbnQgcmMgPSAwOwogCiAJc3NwID0gc2stPnNrX3NlY3VyaXR5OwotCW5ldGxibF9zZWNhdHRyX2luaXQoJnNlY2F0dHIpOwotCXNtYWNrX3RvX3NlY2F0dHIoc3NwLT5zbWtfb3V0LCAmc2VjYXR0cik7Ci0JcmMgPSBuZXRsYmxfc29ja19zZXRhdHRyKHNrLCAmc2VjYXR0cik7Ci0JbmV0bGJsX3NlY2F0dHJfZGVzdHJveSgmc2VjYXR0cik7CisJLyoKKwkgKiBVc3VhbGx5IHRoZSBuZXRsYWJlbCBjb2RlIHdpbGwgaGFuZGxlIGNoYW5naW5nIHRoZQorCSAqIHBhY2tldCBsYWJlbGluZyBiYXNlZCBvbiB0aGUgbGFiZWwuCisJICogVGhlIGNhc2Ugb2YgYSBzaW5nbGUgbGFiZWwgaG9zdCBpcyBkaWZmZXJlbnQsIGJlY2F1c2UKKwkgKiBhIHNpbmdsZSBsYWJlbCBob3N0IHNob3VsZCBuZXZlciBnZXQgYSBsYWJlbGVkIHBhY2tldAorCSAqIGV2ZW4gdGhvdWdoIHRoZSBsYWJlbCBpcyB1c3VhbGx5IGFzc29jaWF0ZWQgd2l0aCBhIHBhY2tldAorCSAqIGxhYmVsLgorCSAqLworCWxvY2FsX2JoX2Rpc2FibGUoKTsKKwliaF9sb2NrX3NvY2tfbmVzdGVkKHNrKTsKKworCWlmIChzc3AtPnNta19vdXQgPT0gc21hY2tfbmV0X2FtYmllbnQgfHwKKwkgICAgbGFiZWxlZCA9PSBTTUFDS19VTkxBQkVMRURfU09DS0VUKQorCQluZXRsYmxfc29ja19kZWxhdHRyKHNrKTsKKwllbHNlIHsKKwkJbmV0bGJsX3NlY2F0dHJfaW5pdCgmc2VjYXR0cik7CisJCXNtYWNrX3RvX3NlY2F0dHIoc3NwLT5zbWtfb3V0LCAmc2VjYXR0cik7CisJCXJjID0gbmV0bGJsX3NvY2tfc2V0YXR0cihzaywgJnNlY2F0dHIpOworCQluZXRsYmxfc2VjYXR0cl9kZXN0cm95KCZzZWNhdHRyKTsKKwl9CisKKwliaF91bmxvY2tfc29jayhzayk7CisJbG9jYWxfYmhfZW5hYmxlKCk7CisJLyoKKwkgKiBSZW1lbWJlciB0aGUgbGFiZWwgc2NoZW1lIHVzZWQgc28gdGhhdCBpdCBpcyBub3QKKwkgKiBuZWNlc3NhcnkgdG8gZG8gdGhlIG5ldGxhYmVsIHNldHRpbmcgaWYgaXQgaGFzIG5vdAorCSAqIGNoYW5nZWQgdGhlIG5leHQgdGltZSB0aHJvdWdoLgorCSAqCisJICogVGhlIC1FREVTVEFERFJSRVEgY2FzZSBpcyBhbiBpbmRpY2F0aW9uIHRoYXQgdGhlcmUncworCSAqIGEgc2luZ2xlIGxldmVsIGhvc3QgaW52b2x2ZWQuCisJICovCisJaWYgKHJjID09IDApCisJCXNzcC0+c21rX2xhYmVsZWQgPSBsYWJlbGVkOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtMTQzMiw3ICsxNDU3LDcgQEAKIAkJc3NwLT5zbWtfaW4gPSBzcDsKIAllbHNlIGlmIChzdHJjbXAobmFtZSwgWEFUVFJfU01BQ0tfSVBPVVQpID09IDApIHsKIAkJc3NwLT5zbWtfb3V0ID0gc3A7Ci0JCXJjID0gc21hY2tfbmV0bGFiZWwoc29jay0+c2spOworCQlyYyA9IHNtYWNrX25ldGxhYmVsKHNvY2stPnNrLCBTTUFDS19DSVBTT19TT0NLRVQpOwogCQlpZiAocmMgIT0gMCkKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNtYWNrOiBcIiVzXCIgbmV0bGJsIGVycm9yICVkLlxuIiwKIAkJCSAgICAgICBfX2Z1bmNfXywgLXJjKTsKQEAgLTE0NjIsNyArMTQ4NywxMDggQEAKIAkvKgogCSAqIFNldCB0aGUgb3V0Ym91bmQgbmV0bGJsLgogCSAqLwotCXJldHVybiBzbWFja19uZXRsYWJlbChzb2NrLT5zayk7CisJcmV0dXJuIHNtYWNrX25ldGxhYmVsKHNvY2stPnNrLCBTTUFDS19DSVBTT19TT0NLRVQpOworfQorCisKKy8qKgorICogc21hY2tfaG9zdF9sYWJlbCAtIGNoZWNrIGhvc3QgYmFzZWQgcmVzdHJpY3Rpb25zCisgKiBAc2lwOiB0aGUgb2JqZWN0IGVuZAorICoKKyAqIGxvb2tzIGZvciBob3N0IGJhc2VkIGFjY2VzcyByZXN0cmljdGlvbnMKKyAqCisgKiBUaGlzIHZlcnNpb24gd2lsbCBvbmx5IGJlIGFwcHJvcHJpYXRlIGZvciByZWFsbHkgc21hbGwKKyAqIHNldHMgb2Ygc2luZ2xlIGxhYmVsIGhvc3RzLiBCZWNhdXNlIG9mIHRoZSBtYXNraW5nCisgKiBpdCBjYW5ub3Qgc2hvcnRjdXQgb3V0IG9uIHRoZSBmaXJzdCBtYXRjaC4gVGhlcmUgYXJlCisgKiBudW1lcmlvdXMgd2F5cyB0byBhZGRyZXNzIHRoZSBwcm9ibGVtLCBidXQgbm9uZSBvZiB0aGVtCisgKiBoYXZlIGJlZW4gYXBwbGllZCBoZXJlLgorICoKKyAqIFJldHVybnMgdGhlIGxhYmVsIG9mIHRoZSBmYXIgZW5kIG9yIE5VTEwgaWYgaXQncyBub3Qgc3BlY2lhbC4KKyAqLworc3RhdGljIGNoYXIgKnNtYWNrX2hvc3RfbGFiZWwoc3RydWN0IHNvY2thZGRyX2luICpzaXApCit7CisJc3RydWN0IHNta19uZXRsYmxhZGRyICpzbnA7CisJY2hhciAqYmVzdGxhYmVsID0gTlVMTDsKKwlzdHJ1Y3QgaW5fYWRkciAqc2lhcCA9ICZzaXAtPnNpbl9hZGRyOworCXN0cnVjdCBpbl9hZGRyICpsaWFwOworCXN0cnVjdCBpbl9hZGRyICptaWFwOworCXN0cnVjdCBpbl9hZGRyIGJlc3RtYXNrOworCisJaWYgKHNpYXAtPnNfYWRkciA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCWJlc3RtYXNrLnNfYWRkciA9IDA7CisKKwlmb3IgKHNucCA9IHNtYWNrX25ldGxibGFkZHJzOyBzbnAgIT0gTlVMTDsgc25wID0gc25wLT5zbWtfbmV4dCkgeworCQlsaWFwID0gJnNucC0+c21rX2hvc3Quc2luX2FkZHI7CisJCW1pYXAgPSAmc25wLT5zbWtfbWFzazsKKwkJLyoKKwkJICogSWYgdGhlIGFkZHJlc3NlcyBtYXRjaCBhZnRlciBhcHBseWluZyB0aGUgbGlzdCBlbnRyeSBtYXNrCisJCSAqIHRoZSBlbnRyeSBtYXRjaGVzIHRoZSBhZGRyZXNzLiBJZiBpdCBkb2Vzbid0IG1vdmUgYWxvbmcgdG8KKwkJICogdGhlIG5leHQgZW50cnkuCisJCSAqLworCQlpZiAoKGxpYXAtPnNfYWRkciAmIG1pYXAtPnNfYWRkcikgIT0KKwkJICAgIChzaWFwLT5zX2FkZHIgJiBtaWFwLT5zX2FkZHIpKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIElmIHRoZSBsaXN0IGVudHJ5IG1hc2sgaWRlbnRpZmllcyBhIHNpbmdsZSBhZGRyZXNzCisJCSAqIGl0IGNhbid0IGdldCBhbnkgbW9yZSBzcGVjaWZpYy4KKwkJICovCisJCWlmIChtaWFwLT5zX2FkZHIgPT0gMHhmZmZmZmZmZikKKwkJCXJldHVybiBzbnAtPnNta19sYWJlbDsKKwkJLyoKKwkJICogSWYgdGhlIGxpc3QgZW50cnkgbWFzayBpcyBsZXNzIHNwZWNpZmljIHRoYW4gdGhlIGJlc3QKKwkJICogYWxyZWFkeSBmb3VuZCB0aGlzIGVudHJ5IGlzIHVuaW50ZXJlc3RpbmcuCisJCSAqLworCQlpZiAoKG1pYXAtPnNfYWRkciB8IGJlc3RtYXNrLnNfYWRkcikgPT0gYmVzdG1hc2suc19hZGRyKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIFRoaXMgaXMgYmV0dGVyIHRoYW4gYW55IGVudHJ5IGZvdW5kIHNvIGZhci4KKwkJICovCisJCWJlc3RtYXNrLnNfYWRkciA9IG1pYXAtPnNfYWRkcjsKKwkJYmVzdGxhYmVsID0gc25wLT5zbWtfbGFiZWw7CisJfQorCisJcmV0dXJuIGJlc3RsYWJlbDsKK30KKworLyoqCisgKiBzbWFja19zb2NrZXRfY29ubmVjdCAtIGNvbm5lY3QgYWNjZXNzIGNoZWNrCisgKiBAc29jazogdGhlIHNvY2tldAorICogQHNhcDogdGhlIG90aGVyIGVuZAorICogQGFkZHJsZW46IHNpemUgb2Ygc2FwCisgKgorICogVmVyaWZpZXMgdGhhdCBhIGNvbm5lY3Rpb24gbWF5IGJlIHBvc3NpYmxlCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGFuZCBlcnJvciBjb2RlIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IHNtYWNrX3NvY2tldF9jb25uZWN0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqc2FwLAorCQkJCWludCBhZGRybGVuKQoreworCXN0cnVjdCBzb2NrZXRfc21hY2sgKnNzcCA9IHNvY2stPnNrLT5za19zZWN1cml0eTsKKwljaGFyICpob3N0c3A7CisJaW50IHJjOworCisJaWYgKHNvY2stPnNrID09IE5VTEwgfHwgc29jay0+c2stPnNrX2ZhbWlseSAhPSBQRl9JTkVUKQorCQlyZXR1cm4gMDsKKworCWlmIChhZGRybGVuIDwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpCisJCXJldHVybiAtRUlOVkFMOworCisJaG9zdHNwID0gc21hY2tfaG9zdF9sYWJlbCgoc3RydWN0IHNvY2thZGRyX2luICopc2FwKTsKKwlpZiAoaG9zdHNwID09IE5VTEwpIHsKKwkJaWYgKHNzcC0+c21rX2xhYmVsZWQgIT0gU01BQ0tfQ0lQU09fU09DS0VUKQorCQkJcmV0dXJuIHNtYWNrX25ldGxhYmVsKHNvY2stPnNrLCBTTUFDS19DSVBTT19TT0NLRVQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyYyA9IHNta19hY2Nlc3Moc3NwLT5zbWtfb3V0LCBob3N0c3AsIE1BWV9XUklURSk7CisJaWYgKHJjICE9IDApCisJCXJldHVybiByYzsKKworCWlmIChzc3AtPnNta19sYWJlbGVkICE9IFNNQUNLX1VOTEFCRUxFRF9TT0NLRVQpCisJCXJldHVybiBzbWFja19uZXRsYWJlbChzb2NrLT5zaywgU01BQ0tfVU5MQUJFTEVEX1NPQ0tFVCk7CisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtMjEwMSw4ICsyMjI3LDE0IEBACiAJaWYgKG5ld3NtYWNrID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCisJLyoKKwkgKiBObyBwcm9jZXNzIGlzIGV2ZXIgYWxsb3dlZCB0aGUgd2ViICgiQCIpIGxhYmVsLgorCSAqLworCWlmIChuZXdzbWFjayA9PSBzbWFja19rbm93bl93ZWIuc21rX2tub3duKQorCQlyZXR1cm4gLUVQRVJNOworCiAJbmV3ID0gcHJlcGFyZV9jcmVkcygpOwotCWlmICghbmV3KQorCWlmIChuZXcgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAJbmV3LT5zZWN1cml0eSA9IG5ld3NtYWNrOwogCWNvbW1pdF9jcmVkcyhuZXcpOwpAQCAtMjE0NCw2ICsyMjc2LDQ5IEBACiB9CiAKIC8qKgorICogc21hY2tfc29ja2V0X3NlbmRtc2cgLSBTbWFjayBjaGVjayBiYXNlZCBvbiBkZXN0aW5hdGlvbiBob3N0CisgKiBAc29jazogdGhlIHNvY2tldAorICogQG1zZ2hkcjogdGhlIG1lc3NhZ2UKKyAqIEBzaXplOiB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZQorICoKKyAqIFJldHVybiAwIGlmIHRoZSBjdXJyZW50IHN1YmplY3QgY2FuIHdyaXRlIHRvIHRoZSBkZXN0aW5hdGlvbgorICogaG9zdC4gVGhpcyBpcyBvbmx5IGEgcXVlc3Rpb24gaWYgdGhlIGRlc3RpbmF0aW9uIGlzIGEgc2luZ2xlCisgKiBsYWJlbCBob3N0LgorICovCitzdGF0aWMgaW50IHNtYWNrX3NvY2tldF9zZW5kbXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywKKwkJCQlpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpcCA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgbXNnLT5tc2dfbmFtZTsKKwlzdHJ1Y3Qgc29ja2V0X3NtYWNrICpzc3AgPSBzb2NrLT5zay0+c2tfc2VjdXJpdHk7CisJY2hhciAqaG9zdHNwOworCWludCByYzsKKworCS8qCisJICogUGVyZmVjdGx5IHJlYXNvbmFibGUgZm9yIHRoaXMgdG8gYmUgTlVMTAorCSAqLworCWlmIChzaXAgPT0gTlVMTCB8fCBzaXAtPnNpbl9mYW1pbHkgIT0gUEZfSU5FVCkKKwkJcmV0dXJuIDA7CisKKwlob3N0c3AgPSBzbWFja19ob3N0X2xhYmVsKHNpcCk7CisJaWYgKGhvc3RzcCA9PSBOVUxMKSB7CisJCWlmIChzc3AtPnNta19sYWJlbGVkICE9IFNNQUNLX0NJUFNPX1NPQ0tFVCkKKwkJCXJldHVybiBzbWFja19uZXRsYWJlbChzb2NrLT5zaywgU01BQ0tfQ0lQU09fU09DS0VUKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmMgPSBzbWtfYWNjZXNzKHNzcC0+c21rX291dCwgaG9zdHNwLCBNQVlfV1JJVEUpOworCWlmIChyYyAhPSAwKQorCQlyZXR1cm4gcmM7CisKKwlpZiAoc3NwLT5zbWtfbGFiZWxlZCAhPSBTTUFDS19VTkxBQkVMRURfU09DS0VUKQorCQlyZXR1cm4gc21hY2tfbmV0bGFiZWwoc29jay0+c2ssIFNNQUNLX1VOTEFCRUxFRF9TT0NLRVQpOworCisJcmV0dXJuIDA7CisKK30KKworCisvKioKICAqIHNtYWNrX2Zyb21fc2VjYXR0ciAtIENvbnZlcnQgYSBuZXRsYWJlbCBhdHRyLm1scy5sdmwvYXR0ci5tbHMuY2F0CiAgKiAJcGFpciB0byBzbWFjawogICogQHNhcDogbmV0bGFiZWwgc2VjYXR0cgpAQCAtMjE1NCw0NCArMjMyOSw2NiBAQAogc3RhdGljIHZvaWQgc21hY2tfZnJvbV9zZWNhdHRyKHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNhcCwgY2hhciAqc2lwKQogewogCWNoYXIgc21hY2tbU01LX0xBQkVMTEVOXTsKKwljaGFyICpzcDsKIAlpbnQgcGNhdDsKIAotCWlmICgoc2FwLT5mbGFncyAmIE5FVExCTF9TRUNBVFRSX01MU19MVkwpID09IDApIHsKKwlpZiAoKHNhcC0+ZmxhZ3MgJiBORVRMQkxfU0VDQVRUUl9NTFNfTFZMKSAhPSAwKSB7CiAJCS8qCisJCSAqIExvb2tzIGxpa2UgYSBDSVBTTyBwYWNrZXQuCiAJCSAqIElmIHRoZXJlIGFyZSBmbGFncyBidXQgbm8gbGV2ZWwgbmV0bGFiZWwgaXNuJ3QKIAkJICogYmVoYXZpbmcgdGhlIHdheSB3ZSBleHBlY3QgaXQgdG8uCiAJCSAqCisJCSAqIEdldCB0aGUgY2F0ZWdvcmllcywgaWYgYW55CiAJCSAqIFdpdGhvdXQgZ3VpZGFuY2UgcmVnYXJkaW5nIHRoZSBzbWFjayB2YWx1ZQogCQkgKiBmb3IgdGhlIHBhY2tldCBmYWxsIGJhY2sgb24gdGhlIG5ldHdvcmsKIAkJICogYW1iaWVudCB2YWx1ZS4KIAkJICovCi0JCXN0cm5jcHkoc2lwLCBzbWFja19uZXRfYW1iaWVudCwgU01LX01BWExFTik7Ci0JCXJldHVybjsKLQl9Ci0JLyoKLQkgKiBHZXQgdGhlIGNhdGVnb3JpZXMsIGlmIGFueQotCSAqLwotCW1lbXNldChzbWFjaywgJ1wwJywgU01LX0xBQkVMTEVOKTsKLQlpZiAoKHNhcC0+ZmxhZ3MgJiBORVRMQkxfU0VDQVRUUl9NTFNfQ0FUKSAhPSAwKQotCQlmb3IgKHBjYXQgPSAtMTs7KSB7Ci0JCQlwY2F0ID0gbmV0bGJsX3NlY2F0dHJfY2F0bWFwX3dhbGsoc2FwLT5hdHRyLm1scy5jYXQsCi0JCQkJCQkJICBwY2F0ICsgMSk7Ci0JCQlpZiAocGNhdCA8IDApCi0JCQkJYnJlYWs7Ci0JCQlzbWFja19jYXRzZXRfYml0KHBjYXQsIHNtYWNrKTsKKwkJbWVtc2V0KHNtYWNrLCAnXDAnLCBTTUtfTEFCRUxMRU4pOworCQlpZiAoKHNhcC0+ZmxhZ3MgJiBORVRMQkxfU0VDQVRUUl9NTFNfQ0FUKSAhPSAwKQorCQkJZm9yIChwY2F0ID0gLTE7OykgeworCQkJCXBjYXQgPSBuZXRsYmxfc2VjYXR0cl9jYXRtYXBfd2FsaygKKwkJCQkJc2FwLT5hdHRyLm1scy5jYXQsIHBjYXQgKyAxKTsKKwkJCQlpZiAocGNhdCA8IDApCisJCQkJCWJyZWFrOworCQkJCXNtYWNrX2NhdHNldF9iaXQocGNhdCwgc21hY2spOworCQkJfQorCQkvKgorCQkgKiBJZiBpdCBpcyBDSVBTTyB1c2luZyBzbWFjayBkaXJlY3QgbWFwcGluZworCQkgKiB3ZSBhcmUgYWxyZWFkeSBkb25lLiBXZWVIZWUuCisJCSAqLworCQlpZiAoc2FwLT5hdHRyLm1scy5sdmwgPT0gc21hY2tfY2lwc29fZGlyZWN0KSB7CisJCQltZW1jcHkoc2lwLCBzbWFjaywgU01LX01BWExFTik7CisJCQlyZXR1cm47CiAJCX0KLQkvKgotCSAqIElmIGl0IGlzIENJUFNPIHVzaW5nIHNtYWNrIGRpcmVjdCBtYXBwaW5nCi0JICogd2UgYXJlIGFscmVhZHkgZG9uZS4gV2VlSGVlLgotCSAqLwotCWlmIChzYXAtPmF0dHIubWxzLmx2bCA9PSBzbWFja19jaXBzb19kaXJlY3QpIHsKLQkJbWVtY3B5KHNpcCwgc21hY2ssIFNNS19NQVhMRU4pOworCQkvKgorCQkgKiBMb29rIGl0IHVwIGluIHRoZSBzdXBwbGllZCB0YWJsZSBpZiBpdCBpcyBub3QKKwkJICogYSBkaXJlY3QgbWFwcGluZy4KKwkJICovCisJCXNtYWNrX2Zyb21fY2lwc28oc2FwLT5hdHRyLm1scy5sdmwsIHNtYWNrLCBzaXApOworCQlyZXR1cm47CisJfQorCWlmICgoc2FwLT5mbGFncyAmIE5FVExCTF9TRUNBVFRSX1NFQ0lEKSAhPSAwKSB7CisJCS8qCisJCSAqIExvb2tzIGxpa2UgYSBmYWxsYmFjaywgd2hpY2ggZ2l2ZXMgdXMgYSBzZWNpZC4KKwkJICovCisJCXNwID0gc21hY2tfZnJvbV9zZWNpZChzYXAtPmF0dHIuc2VjaWQpOworCQkvKgorCQkgKiBUaGlzIGhhcyBnb3QgdG8gYmUgYSBidWcgYmVjYXVzZSBpdCBpcworCQkgKiBpbXBvc3NpYmxlIHRvIHNwZWNpZnkgYSBmYWxsYmFjayB3aXRob3V0CisJCSAqIHNwZWNpZnlpbmcgdGhlIGxhYmVsLCB3aGljaCB3aWxsIGVuc3VyZQorCQkgKiBpdCBoYXMgYSBzZWNpZCwgYW5kIHRoZSBvbmx5IHdheSB0byBnZXQgYQorCQkgKiBzZWNpZCBpcyBmcm9tIGEgZmFsbGJhY2suCisJCSAqLworCQlCVUdfT04oc3AgPT0gTlVMTCk7CisJCXN0cm5jcHkoc2lwLCBzcCwgU01LX01BWExFTik7CiAJCXJldHVybjsKIAl9CiAJLyoKLQkgKiBMb29rIGl0IHVwIGluIHRoZSBzdXBwbGllZCB0YWJsZSBpZiBpdCBpcyBub3QgYSBkaXJlY3QgbWFwcGluZy4KKwkgKiBXaXRob3V0IGd1aWRhbmNlIHJlZ2FyZGluZyB0aGUgc21hY2sgdmFsdWUKKwkgKiBmb3IgdGhlIHBhY2tldCBmYWxsIGJhY2sgb24gdGhlIG5ldHdvcmsKKwkgKiBhbWJpZW50IHZhbHVlLgogCSAqLwotCXNtYWNrX2Zyb21fY2lwc28oc2FwLT5hdHRyLm1scy5sdmwsIHNtYWNrLCBzaXApOworCXN0cm5jcHkoc2lwLCBzbWFja19uZXRfYW1iaWVudCwgU01LX01BWExFTik7CiAJcmV0dXJuOwogfQogCkBAIC0yMjA3LDYgKzI0MDQsNyBAQAogCXN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgc2VjYXR0cjsKIAlzdHJ1Y3Qgc29ja2V0X3NtYWNrICpzc3AgPSBzay0+c2tfc2VjdXJpdHk7CiAJY2hhciBzbWFja1tTTUtfTEFCRUxMRU5dOworCWNoYXIgKmNzcDsKIAlpbnQgcmM7CiAKIAlpZiAoc2stPnNrX2ZhbWlseSAhPSBQRl9JTkVUICYmIHNrLT5za19mYW1pbHkgIT0gUEZfSU5FVDYpCkBAIC0yMjE1LDIxICsyNDEzLDI0IEBACiAJLyoKIAkgKiBUcmFuc2xhdGUgd2hhdCBuZXRsYWJlbCBnYXZlIHVzLgogCSAqLwotCW1lbXNldChzbWFjaywgJ1wwJywgU01LX0xBQkVMTEVOKTsKIAluZXRsYmxfc2VjYXR0cl9pbml0KCZzZWNhdHRyKTsKKwogCXJjID0gbmV0bGJsX3NrYnVmZl9nZXRhdHRyKHNrYiwgc2stPnNrX2ZhbWlseSwgJnNlY2F0dHIpOwotCWlmIChyYyA9PSAwKQorCWlmIChyYyA9PSAwKSB7CiAJCXNtYWNrX2Zyb21fc2VjYXR0cigmc2VjYXR0ciwgc21hY2spOwotCWVsc2UKLQkJc3RybmNweShzbWFjaywgc21hY2tfbmV0X2FtYmllbnQsIFNNS19NQVhMRU4pOworCQljc3AgPSBzbWFjazsKKwl9IGVsc2UKKwkJY3NwID0gc21hY2tfbmV0X2FtYmllbnQ7CisKIAluZXRsYmxfc2VjYXR0cl9kZXN0cm95KCZzZWNhdHRyKTsKKwogCS8qCiAJICogUmVjZWl2aW5nIGEgcGFja2V0IHJlcXVpcmVzIHRoYXQgdGhlIG90aGVyIGVuZAogCSAqIGJlIGFibGUgdG8gd3JpdGUgaGVyZS4gUmVhZCBhY2Nlc3MgaXMgbm90IHJlcXVpcmVkLgogCSAqIFRoaXMgaXMgdGhlIHNpbXBsaXN0IHBvc3NpYmxlIHNlY3VyaXR5IG1vZGVsCiAJICogZm9yIG5ldHdvcmtpbmcuCiAJICovCi0JcmMgPSBzbWtfYWNjZXNzKHNtYWNrLCBzc3AtPnNta19pbiwgTUFZX1dSSVRFKTsKKwlyYyA9IHNta19hY2Nlc3MoY3NwLCBzc3AtPnNta19pbiwgTUFZX1dSSVRFKTsKIAlpZiAocmMgIT0gMCkKIAkJbmV0bGJsX3NrYnVmZl9lcnIoc2tiLCByYywgMCk7CiAJcmV0dXJuIHJjOwpAQCAtMjI5OCw3ICsyNDk5LDYgQEAKIAkvKgogCSAqIFRyYW5zbGF0ZSB3aGF0IG5ldGxhYmVsIGdhdmUgdXMuCiAJICovCi0JbWVtc2V0KHNtYWNrLCAnXDAnLCBTTUtfTEFCRUxMRU4pOwogCW5ldGxibF9zZWNhdHRyX2luaXQoJnNlY2F0dHIpOwogCXJjID0gbmV0bGJsX3NrYnVmZl9nZXRhdHRyKHNrYiwgZmFtaWx5LCAmc2VjYXR0cik7CiAJaWYgKHJjID09IDApCkBAIC0yMzQxLDcgKzI1NDEsNyBAQAogCXNzcC0+c21rX2luID0gc3NwLT5zbWtfb3V0ID0gY3VycmVudF9zZWN1cml0eSgpOwogCXNzcC0+c21rX3BhY2tldFswXSA9ICdcMCc7CiAKLQlyYyA9IHNtYWNrX25ldGxhYmVsKHNrKTsKKwlyYyA9IHNtYWNrX25ldGxhYmVsKHNrLCBTTUFDS19DSVBTT19TT0NLRVQpOwogCWlmIChyYyAhPSAwKQogCQlwcmludGsoS0VSTl9XQVJOSU5HICJTbWFjazogXCIlc1wiIG5ldGxibCBlcnJvciAlZC5cbiIsCiAJCSAgICAgICBfX2Z1bmNfXywgLXJjKTsKQEAgLTIzNjcsNyArMjU2Nyw2IEBACiAJaWYgKHNrYiA9PSBOVUxMKQogCQlyZXR1cm4gLUVBQ0NFUzsKIAotCW1lbXNldChzbWFjaywgJ1wwJywgU01LX0xBQkVMTEVOKTsKIAluZXRsYmxfc2VjYXR0cl9pbml0KCZza2Jfc2VjYXR0cik7CiAJcmMgPSBuZXRsYmxfc2tidWZmX2dldGF0dHIoc2tiLCBzay0+c2tfZmFtaWx5LCAmc2tiX3NlY2F0dHIpOwogCWlmIChyYyA9PSAwKQpAQCAtMjczMiw2ICsyOTMxLDggQEAKIAkudW5peF9tYXlfc2VuZCA9IAkJc21hY2tfdW5peF9tYXlfc2VuZCwKIAogCS5zb2NrZXRfcG9zdF9jcmVhdGUgPSAJCXNtYWNrX3NvY2tldF9wb3N0X2NyZWF0ZSwKKwkuc29ja2V0X2Nvbm5lY3QgPQkJc21hY2tfc29ja2V0X2Nvbm5lY3QsCisJLnNvY2tldF9zZW5kbXNnID0JCXNtYWNrX3NvY2tldF9zZW5kbXNnLAogCS5zb2NrZXRfc29ja19yY3Zfc2tiID0gCQlzbWFja19zb2NrZXRfc29ja19yY3Zfc2tiLAogCS5zb2NrZXRfZ2V0cGVlcnNlY19zdHJlYW0gPQlzbWFja19zb2NrZXRfZ2V0cGVlcnNlY19zdHJlYW0sCiAJLnNvY2tldF9nZXRwZWVyc2VjX2RncmFtID0Jc21hY2tfc29ja2V0X2dldHBlZXJzZWNfZGdyYW0sCkBAIC0yNzgzLDcgKzI5ODQsNiBAQAogCS8qCiAJICogSW5pdGlhbGl6ZSBsb2NrcwogCSAqLwotCXNwaW5fbG9ja19pbml0KCZzbWFja19rbm93bl91bnNldC5zbWtfY2lwc29sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmc21hY2tfa25vd25faHVoLnNta19jaXBzb2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZzbWFja19rbm93bl9oYXQuc21rX2NpcHNvbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJnNtYWNrX2tub3duX3N0YXIuc21rX2NpcHNvbG9jayk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zbWFjay9zbWFja2ZzLmMgYi9zZWN1cml0eS9zbWFjay9zbWFja2ZzLmMKaW5kZXggMjQ3ZGM5ZS4uNzFlMmI5MSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc21hY2svc21hY2tmcy5jCisrKyBiL3NlY3VyaXR5L3NtYWNrL3NtYWNrZnMuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KICNpbmNsdWRlIDxuZXQvbmV0bGFiZWwuaD4KICNpbmNsdWRlIDxuZXQvY2lwc29faXB2NC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CkBAIC0zOCw3ICszOSw3IEBACiAJU01LX0RPSQkJPSA1LAkvKiBDSVBTTyBET0kgKi8KIAlTTUtfRElSRUNUCT0gNiwJLyogQ0lQU08gbGV2ZWwgaW5kaWNhdGluZyBkaXJlY3QgbGFiZWwgKi8KIAlTTUtfQU1CSUVOVAk9IDcsCS8qIGludGVybmV0IGFtYmllbnQgbGFiZWwgKi8KLQlTTUtfTkxUWVBFCT0gOCwJLyogbGFiZWwgc2NoZW1lIHRvIHVzZSBieSBkZWZhdWx0ICovCisJU01LX05FVExCTEFERFIJPSA4LAkvKiBzaW5nbGUgbGFiZWwgaG9zdHMgKi8KIAlTTUtfT05MWUNBUAk9IDksCS8qIHRoZSBvbmx5ICJjYXBhYmxlIiBsYWJlbCAqLwogfTsKIApAQCAtNDgsNiArNDksNyBAQAogc3RhdGljIERFRklORV9NVVRFWChzbWFja19saXN0X2xvY2spOwogc3RhdGljIERFRklORV9NVVRFWChzbWFja19jaXBzb19sb2NrKTsKIHN0YXRpYyBERUZJTkVfTVVURVgoc21hY2tfYW1iaWVudF9sb2NrKTsKK3N0YXRpYyBERUZJTkVfTVVURVgoc21rX25ldGxibGFkZHJfbG9jayk7CiAKIC8qCiAgKiBUaGlzIGlzIHRoZSAiYW1iaWVudCIgbGFiZWwgZm9yIG5ldHdvcmsgdHJhZmZpYy4KQEAgLTU3LDEyICs1OSw2IEBACiBjaGFyICpzbWFja19uZXRfYW1iaWVudCA9IHNtYWNrX2tub3duX2Zsb29yLnNta19rbm93bjsKIAogLyoKLSAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgcGFja2V0IG1hcmtpbmcgc2NoZW1lIGZvciBuZXR3b3JrIHRyYWZmaWMuCi0gKiBJdCBjYW4gYmUgcmVzZXQgdmlhIHNtYWNrZnMvbmx0eXBlCi0gKi8KLWludCBzbWFja19uZXRfbmx0eXBlID0gTkVUTEJMX05MVFlQRV9DSVBTT1Y0OwotCi0vKgogICogVGhpcyBpcyB0aGUgbGV2ZWwgaW4gYSBDSVBTTyBoZWFkZXIgdGhhdCBpbmRpY2F0ZXMgYQogICogc21hY2sgbGFiZWwgaXMgY29udGFpbmVkIGRpcmVjdGx5IGluIHRoZSBjYXRlZ29yeSBzZXQuCiAgKiBJdCBjYW4gYmUgcmVzZXQgdmlhIHNtYWNrZnMvZGlyZWN0CkBAIC03OSw2ICs3NSwxMyBAQAogICovCiBjaGFyICpzbWFja19vbmx5Y2FwOwogCisvKgorICogQ2VydGFpbiBJUCBhZGRyZXNzZXMgbWF5IGJlIGRlc2lnbmF0ZWQgYXMgc2luZ2xlIGxhYmVsIGhvc3RzLgorICogUGFja2V0cyBhcmUgc2VudCB0aGVyZSB1bmxhYmVsZWQsIGJ1dCBvbmx5IGZyb20gdGFza3MgdGhhdAorICogY2FuIHdyaXRlIHRvIHRoZSBzcGVjaWZpZWQgbGFiZWwuCisgKi8KK3N0cnVjdCBzbWtfbmV0bGJsYWRkciAqc21hY2tfbmV0bGJsYWRkcnM7CisKIHN0YXRpYyBpbnQgc21rX2NpcHNvX2RvaV92YWx1ZSA9IFNNQUNLX0NJUFNPX0RPSV9ERUZBVUxUOwogc3RydWN0IHNta19saXN0X2VudHJ5ICpzbWFja19saXN0OwogCkBAIC0xMDQsNiArMTA3LDI0IEBACiAjZGVmaW5lIFNNS19BQ0NFU1NMRU4gKHNpemVvZihTTUtfQUNDRVNTKSAtIDEpCiAjZGVmaW5lIFNNS19MT0FETEVOICAgKFNNS19MQUJFTExFTiArIFNNS19MQUJFTExFTiArIFNNS19BQ0NFU1NMRU4pCiAKKy8qKgorICogc21rX25ldGxhYmVsX2F1ZGl0X3NldCAtIGZpbGwgYSBuZXRsYmxfYXVkaXQgc3RydWN0CisgKiBAbmFwOiBzdHJ1Y3R1cmUgdG8gZmlsbAorICovCitzdGF0aWMgdm9pZCBzbWtfbmV0bGFiZWxfYXVkaXRfc2V0KHN0cnVjdCBuZXRsYmxfYXVkaXQgKm5hcCkKK3sKKwluYXAtPmxvZ2ludWlkID0gYXVkaXRfZ2V0X2xvZ2ludWlkKGN1cnJlbnQpOworCW5hcC0+c2Vzc2lvbmlkID0gYXVkaXRfZ2V0X3Nlc3Npb25pZChjdXJyZW50KTsKKwluYXAtPnNlY2lkID0gc21hY2tfdG9fc2VjaWQoY3VycmVudF9zZWN1cml0eSgpKTsKK30KKworLyoKKyAqIFZhbHVlcyBmb3IgcGFyc2luZyBzaW5nbGUgbGFiZWwgaG9zdCBydWxlcworICogIjEuMi4zLjQgWCIKKyAqICIxOTIuMTY4LjEzOC4xMjkvMzIgYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnciCisgKi8KKyNkZWZpbmUgU01LX05FVExCTEFERFJNSU4JOQorI2RlZmluZSBTTUtfTkVUTEJMQUREUk1BWAk0MgogCiAvKgogICogU2VxX2ZpbGUgcmVhZCBvcGVyYXRpb25zIGZvciAvc21hY2svbG9hZApAQCAtMzQ0LDEzICszNjUsMTEgQEAKIHsKIAlpbnQgcmM7CiAJc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pcDsKLQlzdHJ1Y3QgbmV0bGJsX2F1ZGl0IGF1ZGl0X2luZm87CisJc3RydWN0IG5ldGxibF9hdWRpdCBuYWk7CiAKLQlhdWRpdF9pbmZvLmxvZ2ludWlkID0gYXVkaXRfZ2V0X2xvZ2ludWlkKGN1cnJlbnQpOwotCWF1ZGl0X2luZm8uc2Vzc2lvbmlkID0gYXVkaXRfZ2V0X3Nlc3Npb25pZChjdXJyZW50KTsKLQlhdWRpdF9pbmZvLnNlY2lkID0gc21hY2tfdG9fc2VjaWQoY3VycmVudF9zZWN1cml0eSgpKTsKKwlzbWtfbmV0bGFiZWxfYXVkaXRfc2V0KCZuYWkpOwogCi0JcmMgPSBuZXRsYmxfY2ZnX21hcF9kZWwoTlVMTCwgJmF1ZGl0X2luZm8pOworCXJjID0gbmV0bGJsX2NmZ19tYXBfZGVsKE5VTEwsIFBGX0lORVQsIE5VTEwsIE5VTEwsICZuYWkpOwogCWlmIChyYyAhPSAwKQogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczolZCByZW1vdmUgcmMgPSAlZFxuIiwKIAkJICAgICAgIF9fZnVuY19fLCBfX0xJTkVfXywgcmMpOwpAQCAtMzY1LDExICszODQsMTkgQEAKIAlmb3IgKHJjID0gMTsgcmMgPCBDSVBTT19WNF9UQUdfTUFYQ05UOyByYysrKQogCQlkb2lwLT50YWdzW3JjXSA9IENJUFNPX1Y0X1RBR19JTlZBTElEOwogCi0JcmMgPSBuZXRsYmxfY2ZnX2NpcHNvdjRfYWRkX21hcChkb2lwLCBOVUxMLCAmYXVkaXRfaW5mbyk7CisJcmMgPSBuZXRsYmxfY2ZnX2NpcHNvdjRfYWRkKGRvaXAsICZuYWkpOwogCWlmIChyYyAhPSAwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiVkIGFkZCByYyA9ICVkXG4iLAorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczolZCBjaXBzbyBhZGQgcmMgPSAlZFxuIiwKIAkJICAgICAgIF9fZnVuY19fLCBfX0xJTkVfXywgcmMpOwogCQlrZnJlZShkb2lwKTsKKwkJcmV0dXJuOworCX0KKwlyYyA9IG5ldGxibF9jZmdfY2lwc292NF9tYXBfYWRkKGRvaXAtPmRvaSwgTlVMTCwgTlVMTCwgTlVMTCwgJm5haSk7CisJaWYgKHJjICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6JWQgbWFwIGFkZCByYyA9ICVkXG4iLAorCQkgICAgICAgX19mdW5jX18sIF9fTElORV9fLCByYyk7CisJCWtmcmVlKGRvaXApOworCQlyZXR1cm47CiAJfQogfQogCkBAIC0zNzksMjAgKzQwNiwxOSBAQAogc3RhdGljIHZvaWQgc21rX3VubGJsX2FtYmllbnQoY2hhciAqb2xkYW1iaWVudCkKIHsKIAlpbnQgcmM7Ci0Jc3RydWN0IG5ldGxibF9hdWRpdCBhdWRpdF9pbmZvOworCXN0cnVjdCBuZXRsYmxfYXVkaXQgbmFpOwogCi0JYXVkaXRfaW5mby5sb2dpbnVpZCA9IGF1ZGl0X2dldF9sb2dpbnVpZChjdXJyZW50KTsKLQlhdWRpdF9pbmZvLnNlc3Npb25pZCA9IGF1ZGl0X2dldF9zZXNzaW9uaWQoY3VycmVudCk7Ci0JYXVkaXRfaW5mby5zZWNpZCA9IHNtYWNrX3RvX3NlY2lkKGN1cnJlbnRfc2VjdXJpdHkoKSk7CisJc21rX25ldGxhYmVsX2F1ZGl0X3NldCgmbmFpKTsKIAogCWlmIChvbGRhbWJpZW50ICE9IE5VTEwpIHsKLQkJcmMgPSBuZXRsYmxfY2ZnX21hcF9kZWwob2xkYW1iaWVudCwgJmF1ZGl0X2luZm8pOworCQlyYyA9IG5ldGxibF9jZmdfbWFwX2RlbChvbGRhbWJpZW50LCBQRl9JTkVULCBOVUxMLCBOVUxMLCAmbmFpKTsKIAkJaWYgKHJjICE9IDApCiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczolZCByZW1vdmUgcmMgPSAlZFxuIiwKIAkJCSAgICAgICBfX2Z1bmNfXywgX19MSU5FX18sIHJjKTsKIAl9CiAKLQlyYyA9IG5ldGxibF9jZmdfdW5sYmxfYWRkX21hcChzbWFja19uZXRfYW1iaWVudCwgJmF1ZGl0X2luZm8pOworCXJjID0gbmV0bGJsX2NmZ191bmxibF9tYXBfYWRkKHNtYWNrX25ldF9hbWJpZW50LCBQRl9JTkVULAorCQkJCSAgICAgIE5VTEwsIE5VTEwsICZuYWkpOwogCWlmIChyYyAhPSAwKQogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczolZCBhZGQgcmMgPSAlZFxuIiwKIAkJICAgICAgIF9fZnVuY19fLCBfX0xJTkVfXywgcmMpOwpAQCAtNTQzLDcgKzU2OSw3IEBACiAJaWYgKHNrcCA9PSBOVUxMKQogCQlnb3RvIG91dDsKIAotCXJ1bGUgKz0gU01LX0xBQkVMTEVOOzsKKwlydWxlICs9IFNNS19MQUJFTExFTjsKIAlyZXQgPSBzc2NhbmYocnVsZSwgIiVkIiwgJm1hcGxldmVsKTsKIAlpZiAocmV0ICE9IDEgfHwgbWFwbGV2ZWwgPiBTTUFDS19DSVBTT19NQVhMRVZFTCkKIAkJZ290byBvdXQ7CkBAIC02MDMsNiArNjI5LDIwMSBAQAogCS5yZWxlYXNlICAgICAgICA9IHNlcV9yZWxlYXNlLAogfTsKIAorLyoKKyAqIFNlcV9maWxlIHJlYWQgb3BlcmF0aW9ucyBmb3IgL3NtYWNrL25ldGxhYmVsCisgKi8KKworc3RhdGljIHZvaWQgKm5ldGxibGFkZHJfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqcywgbG9mZl90ICpwb3MpCit7CisJaWYgKCpwb3MgPT0gU0VRX1JFQURfRklOSVNIRUQpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIHNtYWNrX25ldGxibGFkZHJzOworfQorCitzdGF0aWMgdm9pZCAqbmV0bGJsYWRkcl9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBzbWtfbmV0bGJsYWRkciAqc2twID0gKChzdHJ1Y3Qgc21rX25ldGxibGFkZHIgKikgdiktPnNta19uZXh0OworCisJaWYgKHNrcCA9PSBOVUxMKQorCQkqcG9zID0gU0VRX1JFQURfRklOSVNIRUQ7CisKKwlyZXR1cm4gc2twOworfQorLyoKKyNkZWZpbmUgQkVNQVNLCTB4ODAwMDAwMDAKKyovCisjZGVmaW5lIEJFTUFTSwkweDAwMDAwMDAxCisjZGVmaW5lIEJFQklUUwkoc2l6ZW9mKF9fYmUzMikgKiA4KQorCisvKgorICogUHJpbnQgaG9zdC9sYWJlbCBwYWlycworICovCitzdGF0aWMgaW50IG5ldGxibGFkZHJfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQoreworCXN0cnVjdCBzbWtfbmV0bGJsYWRkciAqc2twID0gKHN0cnVjdCBzbWtfbmV0bGJsYWRkciAqKSB2OworCXVuc2lnbmVkIGNoYXIgKmhwID0gKGNoYXIgKikgJnNrcC0+c21rX2hvc3Quc2luX2FkZHIuc19hZGRyOworCV9fYmUzMiBiZWJpdHM7CisJaW50IG1hc2tuID0gMDsKKworCWZvciAoYmViaXRzID0gQkVNQVNLOyBiZWJpdHMgIT0gMDsgbWFza24rKywgYmViaXRzIDw8PSAxKQorCQlpZiAoKHNrcC0+c21rX21hc2suc19hZGRyICYgYmViaXRzKSA9PSAwKQorCQkJYnJlYWs7CisKKwlzZXFfcHJpbnRmKHMsICIldS4ldS4ldS4ldS8lZCAlc1xuIiwKKwkJaHBbMF0sIGhwWzFdLCBocFsyXSwgaHBbM10sIG1hc2tuLCBza3AtPnNta19sYWJlbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbmV0bGJsYWRkcl9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCit7CisJLyogTm8tb3AgKi8KK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBuZXRsYmxhZGRyX3NlcV9vcHMgPSB7CisJLnN0YXJ0ID0gbmV0bGJsYWRkcl9zZXFfc3RhcnQsCisJLnN0b3AgID0gbmV0bGJsYWRkcl9zZXFfc3RvcCwKKwkubmV4dCAgPSBuZXRsYmxhZGRyX3NlcV9uZXh0LAorCS5zaG93ICA9IG5ldGxibGFkZHJfc2VxX3Nob3csCit9OworCisvKioKKyAqIHNta19vcGVuX25ldGxibGFkZHIgLSBvcGVuKCkgZm9yIC9zbWFjay9uZXRsYWJlbAorICogQGlub2RlOiBpbm9kZSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGZpbGUKKyAqIEBmaWxlOiAibmV0bGFiZWwiIGZpbGUgcG9pbnRlcgorICoKKyAqIENvbm5lY3Qgb3VyIG5ldGxibGFkZHJfc2VxXyogb3BlcmF0aW9ucyB3aXRoIC9zbWFjay9uZXRsYWJlbAorICogZmlsZV9vcGVyYXRpb25zCisgKi8KK3N0YXRpYyBpbnQgc21rX29wZW5fbmV0bGJsYWRkcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJm5ldGxibGFkZHJfc2VxX29wcyk7Cit9CisKKy8qKgorICogc21rX3dyaXRlX25ldGxibGFkZHIgLSB3cml0ZSgpIGZvciAvc21hY2svbmV0bGFiZWwKKyAqIEBmaWxwOiBmaWxlIHBvaW50ZXIsIG5vdCBhY3R1YWxseSB1c2VkCisgKiBAYnVmOiB3aGVyZSB0byBnZXQgdGhlIGRhdGEgZnJvbQorICogQGNvdW50OiBieXRlcyBzZW50CisgKiBAcHBvczogd2hlcmUgdG8gc3RhcnQKKyAqCisgKiBBY2NlcHRzIG9ubHkgb25lIG5ldGxibGFkZHIgcGVyIHdyaXRlIGNhbGwuCisgKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyB3cml0dGVuIG9yIGVycm9yIGNvZGUsIGFzIGFwcHJvcHJpYXRlCisgKi8KK3N0YXRpYyBzc2l6ZV90IHNta193cml0ZV9uZXRsYmxhZGRyKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBzbWtfbmV0bGJsYWRkciAqc2twOworCXN0cnVjdCBzb2NrYWRkcl9pbiBuZXduYW1lOworCWNoYXIgc21hY2tbU01LX0xBQkVMTEVOXTsKKwljaGFyICpzcDsKKwljaGFyIGRhdGFbU01LX05FVExCTEFERFJNQVhdOworCWNoYXIgKmhvc3QgPSAoY2hhciAqKSZuZXduYW1lLnNpbl9hZGRyLnNfYWRkcjsKKwlpbnQgcmM7CisJc3RydWN0IG5ldGxibF9hdWRpdCBhdWRpdF9pbmZvOworCXN0cnVjdCBpbl9hZGRyIG1hc2s7CisJdW5zaWduZWQgaW50IG07CisJX19iZTMyIGJlYml0cyA9IEJFTUFTSzsKKwlfX2JlMzIgbnNhOworCisJLyoKKwkgKiBNdXN0IGhhdmUgcHJpdmlsZWdlLgorCSAqIE5vIHBhcnRpYWwgd3JpdGVzLgorCSAqIEVub3VnaCBkYXRhIG11c3QgYmUgcHJlc2VudC4KKwkgKiAiPGFkZHIvbWFzaywgYXMgYS5iLmMuZC9lPjxzcGFjZT48bGFiZWw+IgorCSAqICI8YWRkciwgYXMgYS5iLmMuZD48c3BhY2U+PGxhYmVsPiIKKwkgKi8KKwlpZiAoIWNhcGFibGUoQ0FQX01BQ19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisJaWYgKCpwcG9zICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjb3VudCA8IFNNS19ORVRMQkxBRERSTUlOIHx8IGNvdW50ID4gU01LX05FVExCTEFERFJNQVgpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjb3B5X2Zyb21fdXNlcihkYXRhLCBidWYsIGNvdW50KSAhPSAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRhdGFbY291bnRdID0gJ1wwJzsKKworCXJjID0gc3NjYW5mKGRhdGEsICIlaGhkLiVoaGQuJWhoZC4laGhkLyVkICVzIiwKKwkJJmhvc3RbMF0sICZob3N0WzFdLCAmaG9zdFsyXSwgJmhvc3RbM10sICZtLCBzbWFjayk7CisJaWYgKHJjICE9IDYpIHsKKwkJcmMgPSBzc2NhbmYoZGF0YSwgIiVoaGQuJWhoZC4laGhkLiVoaGQgJXMiLAorCQkJJmhvc3RbMF0sICZob3N0WzFdLCAmaG9zdFsyXSwgJmhvc3RbM10sIHNtYWNrKTsKKwkJaWYgKHJjICE9IDUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbSA9IEJFQklUUzsKKwl9CisJaWYgKG0gPiBCRUJJVFMpCisJCXJldHVybiAtRUlOVkFMOworCisJc3AgPSBzbWtfaW1wb3J0KHNtYWNrLCAwKTsKKwlpZiAoc3AgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKG1hc2suc19hZGRyID0gMDsgbSA+IDA7IG0tLSkgeworCQltYXNrLnNfYWRkciB8PSBiZWJpdHM7CisJCWJlYml0cyA8PD0gMTsKKwl9CisJLyoKKwkgKiBPbmx5IGFsbG93IG9uZSB3cml0ZXIgYXQgYSB0aW1lLiBXcml0ZXMgc2hvdWxkIGJlCisJICogcXVpdGUgcmFyZSBhbmQgc21hbGwgaW4gYW55IGNhc2UuCisJICovCisJbXV0ZXhfbG9jaygmc21rX25ldGxibGFkZHJfbG9jayk7CisKKwluc2EgPSBuZXduYW1lLnNpbl9hZGRyLnNfYWRkcjsKKwlmb3IgKHNrcCA9IHNtYWNrX25ldGxibGFkZHJzOyBza3AgIT0gTlVMTDsgc2twID0gc2twLT5zbWtfbmV4dCkKKwkJaWYgKHNrcC0+c21rX2hvc3Quc2luX2FkZHIuc19hZGRyID09IG5zYSAmJgorCQkgICAgc2twLT5zbWtfbWFzay5zX2FkZHIgPT0gbWFzay5zX2FkZHIpCisJCQlicmVhazsKKworCXNta19uZXRsYWJlbF9hdWRpdF9zZXQoJmF1ZGl0X2luZm8pOworCisJaWYgKHNrcCA9PSBOVUxMKSB7CisJCXNrcCA9IGt6YWxsb2Moc2l6ZW9mKCpza3ApLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHNrcCA9PSBOVUxMKQorCQkJcmMgPSAtRU5PTUVNOworCQllbHNlIHsKKwkJCXJjID0gMDsKKwkJCXNrcC0+c21rX2hvc3Quc2luX2FkZHIuc19hZGRyID0gbmV3bmFtZS5zaW5fYWRkci5zX2FkZHI7CisJCQlza3AtPnNta19tYXNrLnNfYWRkciA9IG1hc2suc19hZGRyOworCQkJc2twLT5zbWtfbmV4dCA9IHNtYWNrX25ldGxibGFkZHJzOworCQkJc2twLT5zbWtfbGFiZWwgPSBzcDsKKwkJCXNtYWNrX25ldGxibGFkZHJzID0gc2twOworCQl9CisJfSBlbHNlIHsKKwkJcmMgPSBuZXRsYmxfY2ZnX3VubGJsX3N0YXRpY19kZWwoJmluaXRfbmV0LCBOVUxMLAorCQkJJnNrcC0+c21rX2hvc3Quc2luX2FkZHIsICZza3AtPnNta19tYXNrLAorCQkJUEZfSU5FVCwgJmF1ZGl0X2luZm8pOworCQlza3AtPnNta19sYWJlbCA9IHNwOworCX0KKworCS8qCisJICogTm93IHRlbGwgbmV0bGFiZWwgYWJvdXQgdGhlIHNpbmdsZSBsYWJlbCBuYXR1cmUgb2YKKwkgKiB0aGlzIGhvc3Qgc28gdGhhdCBpbmNvbWluZyBwYWNrZXRzIGdldCBsYWJlbGVkLgorCSAqLworCisJaWYgKHJjID09IDApCisJCXJjID0gbmV0bGJsX2NmZ191bmxibF9zdGF0aWNfYWRkKCZpbml0X25ldCwgTlVMTCwKKwkJCSZza3AtPnNta19ob3N0LnNpbl9hZGRyLCAmc2twLT5zbWtfbWFzaywgUEZfSU5FVCwKKwkJCXNtYWNrX3RvX3NlY2lkKHNrcC0+c21rX2xhYmVsKSwgJmF1ZGl0X2luZm8pOworCisJaWYgKHJjID09IDApCisJCXJjID0gY291bnQ7CisKKwltdXRleF91bmxvY2soJnNta19uZXRsYmxhZGRyX2xvY2spOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzbWtfbmV0bGJsYWRkcl9vcHMgPSB7CisJLm9wZW4gICAgICAgICAgID0gc21rX29wZW5fbmV0bGJsYWRkciwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrICAgICAgICAgPSBzZXFfbHNlZWssCisJLndyaXRlCQk9IHNta193cml0ZV9uZXRsYmxhZGRyLAorCS5yZWxlYXNlICAgICAgICA9IHNlcV9yZWxlYXNlLAorfTsKKwogLyoqCiAgKiBzbWtfcmVhZF9kb2kgLSByZWFkKCkgZm9yIC9zbWFjay9kb2kKICAqIEBmaWxwOiBmaWxlIHBvaW50ZXIsIG5vdCBhY3R1YWxseSB1c2VkCkBAIC04OTEsMTEwICsxMTEyLDYgQEAKIAkud3JpdGUJCT0gc21rX3dyaXRlX29ubHljYXAsCiB9OwogCi1zdHJ1Y3Qgb3B0aW9uX25hbWVzIHsKLQlpbnQJb19udW1iZXI7Ci0JY2hhcgkqb19uYW1lOwotCWNoYXIJKm9fYWxpYXM7Ci19OwotCi1zdGF0aWMgc3RydWN0IG9wdGlvbl9uYW1lcyBuZXRsYmxfY2hvaWNlc1tdID0gewotCXsgTkVUTEJMX05MVFlQRV9SSVBTTywKLQkJTkVUTEJMX05MVFlQRV9SSVBTT19OQU1FLAkicmlwc28iIH0sCi0JeyBORVRMQkxfTkxUWVBFX0NJUFNPVjQsCi0JCU5FVExCTF9OTFRZUEVfQ0lQU09WNF9OQU1FLAkiY2lwc292NCIgfSwKLQl7IE5FVExCTF9OTFRZUEVfQ0lQU09WNCwKLQkJTkVUTEJMX05MVFlQRV9DSVBTT1Y0X05BTUUsCSJjaXBzbyIgfSwKLQl7IE5FVExCTF9OTFRZUEVfQ0lQU09WNiwKLQkJTkVUTEJMX05MVFlQRV9DSVBTT1Y2X05BTUUsCSJjaXBzb3Y2IiB9LAotCXsgTkVUTEJMX05MVFlQRV9VTkxBQkVMRUQsCi0JCU5FVExCTF9OTFRZUEVfVU5MQUJFTEVEX05BTUUsCSJ1bmxhYmVsZWQiIH0sCi19OwotCi0vKioKLSAqIHNta19yZWFkX25sdHlwZSAtIHJlYWQoKSBmb3IgL3NtYWNrL25sdHlwZQotICogQGZpbHA6IGZpbGUgcG9pbnRlciwgbm90IGFjdHVhbGx5IHVzZWQKLSAqIEBidWY6IHdoZXJlIHRvIHB1dCB0aGUgcmVzdWx0Ci0gKiBAY291bnQ6IG1heGltdW0gdG8gc2VuZCBhbG9uZwotICogQHBwb3M6IHdoZXJlIHRvIHN0YXJ0Ci0gKgotICogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgcmVhZCBvciBlcnJvciBjb2RlLCBhcyBhcHByb3ByaWF0ZQotICovCi1zdGF0aWMgc3NpemVfdCBzbWtfcmVhZF9ubHR5cGUoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpidWYsCi0JCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0JY2hhciBib3VuZFs0MF07Ci0Jc3NpemVfdCByYzsKLQlpbnQgaTsKLQotCWlmIChjb3VudCA8IFNNS19MQUJFTExFTikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoKnBwb3MgIT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQlzcHJpbnRmKGJvdW5kLCAidW5rbm93biIpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobmV0bGJsX2Nob2ljZXMpOyBpKyspCi0JCWlmIChzbWFja19uZXRfbmx0eXBlID09IG5ldGxibF9jaG9pY2VzW2ldLm9fbnVtYmVyKSB7Ci0JCQlzcHJpbnRmKGJvdW5kLCAiJXMiLCBuZXRsYmxfY2hvaWNlc1tpXS5vX25hbWUpOwotCQkJYnJlYWs7Ci0JCX0KLQotCXJjID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgYm91bmQsIHN0cmxlbihib3VuZCkpOwotCi0JcmV0dXJuIHJjOwotfQotCi0vKioKLSAqIHNta193cml0ZV9ubHR5cGUgLSB3cml0ZSgpIGZvciAvc21hY2svbmx0eXBlCi0gKiBAZmlscDogZmlsZSBwb2ludGVyLCBub3QgYWN0dWFsbHkgdXNlZAotICogQGJ1Zjogd2hlcmUgdG8gZ2V0IHRoZSBkYXRhIGZyb20KLSAqIEBjb3VudDogYnl0ZXMgc2VudAotICogQHBwb3M6IHdoZXJlIHRvIHN0YXJ0Ci0gKgotICogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBvciBlcnJvciBjb2RlLCBhcyBhcHByb3ByaWF0ZQotICovCi1zdGF0aWMgc3NpemVfdCBzbWtfd3JpdGVfbmx0eXBlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAotCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCWNoYXIgYm91bmRbNDBdOwotCWNoYXIgKmNwOwotCWludCBpOwotCi0JaWYgKCFjYXBhYmxlKENBUF9NQUNfQURNSU4pKQotCQlyZXR1cm4gLUVQRVJNOwotCi0JaWYgKGNvdW50ID49IDQwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChjb3B5X2Zyb21fdXNlcihib3VuZCwgYnVmLCBjb3VudCkgIT0gMCkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlib3VuZFtjb3VudF0gPSAnXDAnOwotCWNwID0gc3RyY2hyKGJvdW5kLCAnICcpOwotCWlmIChjcCAhPSBOVUxMKQotCQkqY3AgPSAnXDAnOwotCWNwID0gc3RyY2hyKGJvdW5kLCAnXG4nKTsKLQlpZiAoY3AgIT0gTlVMTCkKLQkJKmNwID0gJ1wwJzsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG5ldGxibF9jaG9pY2VzKTsgaSsrKQotCQlpZiAoc3RyY21wKGJvdW5kLCBuZXRsYmxfY2hvaWNlc1tpXS5vX25hbWUpID09IDAgfHwKLQkJICAgIHN0cmNtcChib3VuZCwgbmV0bGJsX2Nob2ljZXNbaV0ub19hbGlhcykgPT0gMCkgewotCQkJc21hY2tfbmV0X25sdHlwZSA9IG5ldGxibF9jaG9pY2VzW2ldLm9fbnVtYmVyOwotCQkJcmV0dXJuIGNvdW50OwotCQl9Ci0JLyoKLQkgKiBOb3QgYSB2YWxpZCBjaG9pY2UuCi0JICovCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNta19ubHR5cGVfb3BzID0gewotCS5yZWFkCQk9IHNta19yZWFkX25sdHlwZSwKLQkud3JpdGUJCT0gc21rX3dyaXRlX25sdHlwZSwKLX07Ci0KIC8qKgogICogc21rX2ZpbGxfc3VwZXIgLSBmaWxsIHRoZSAvc21hY2tmcyBzdXBlcmJsb2NrCiAgKiBAc2I6IHRoZSBlbXB0eSBzdXBlcmJsb2NrCkBAIC0xMDIxLDggKzExMzgsOCBAQAogCQkJeyJkaXJlY3QiLCAmc21rX2RpcmVjdF9vcHMsIFNfSVJVR098U19JV1VTUn0sCiAJCVtTTUtfQU1CSUVOVF0JPQogCQkJeyJhbWJpZW50IiwgJnNta19hbWJpZW50X29wcywgU19JUlVHT3xTX0lXVVNSfSwKLQkJW1NNS19OTFRZUEVdCT0KLQkJCXsibmx0eXBlIiwgJnNta19ubHR5cGVfb3BzLCBTX0lSVUdPfFNfSVdVU1J9LAorCQlbU01LX05FVExCTEFERFJdID0KKwkJCXsibmV0bGFiZWwiLCAmc21rX25ldGxibGFkZHJfb3BzLCBTX0lSVUdPfFNfSVdVU1J9LAogCQlbU01LX09OTFlDQVBdCT0KIAkJCXsib25seWNhcCIsICZzbWtfb25seWNhcF9vcHMsIFNfSVJVR098U19JV1VTUn0sCiAJCS8qIGxhc3Qgb25lICovIHsiIn0KZGlmZiAtLWdpdCBhL3NvdW5kL2FybS9weGEyeHgtYWM5Ny1saWIuYyBiL3NvdW5kL2FybS9weGEyeHgtYWM5Ny1saWIuYwppbmRleCBlZjY1MzllLi4zNWFmZDBjIDEwMDY0NAotLS0gYS9zb3VuZC9hcm0vcHhhMnh4LWFjOTctbGliLmMKKysrIGIvc291bmQvYXJtL3B4YTJ4eC1hYzk3LWxpYi5jCkBAIC0zMjEsMTAgKzMyMSw2IEBACiB7CiAJaW50IHJldDsKIAotCXJldCA9IHJlcXVlc3RfaXJxKElSUV9BQzk3LCBweGEyeHhfYWM5N19pcnEsIDAsICJBQzk3IiwgTlVMTCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyOwotCiAJaWYgKGNwdV9pc19weGEyNXgoKSB8fCBjcHVfaXNfcHhhMjd4KCkpIHsKIAkJcHhhX2dwaW9fbW9kZShHUElPMzFfU1lOQ19BQzk3X01EKTsKIAkJcHhhX2dwaW9fbW9kZShHUElPMzBfU0RBVEFfT1VUX0FDOTdfTUQpOwpAQCAtMzM5LDcgKzMzNSw3IEBACiAJCWlmIChJU19FUlIoYWM5N2NvbmZfY2xrKSkgewogCQkJcmV0ID0gUFRSX0VSUihhYzk3Y29uZl9jbGspOwogCQkJYWM5N2NvbmZfY2xrID0gTlVMTDsKLQkJCWdvdG8gZXJyX2lycTsKKwkJCWdvdG8gZXJyX2NvbmY7CiAJCX0KIAl9CiAKQEAgLTM0NywxOSArMzQzLDMwIEBACiAJaWYgKElTX0VSUihhYzk3X2NsaykpIHsKIAkJcmV0ID0gUFRSX0VSUihhYzk3X2Nsayk7CiAJCWFjOTdfY2xrID0gTlVMTDsKLQkJZ290byBlcnJfaXJxOworCQlnb3RvIGVycl9jbGs7CiAJfQogCi0JcmV0dXJuIGNsa19lbmFibGUoYWM5N19jbGspOworCXJldCA9IGNsa19lbmFibGUoYWM5N19jbGspOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2NsazI7CisKKwlyZXQgPSByZXF1ZXN0X2lycShJUlFfQUM5NywgcHhhMnh4X2FjOTdfaXJxLCBJUlFGX0RJU0FCTEVELCAiQUM5NyIsIE5VTEwpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9pcnE7CisKKwlyZXR1cm4gMDsKIAogZXJyX2lycToKIAlHQ1IgfD0gR0NSX0FDTElOS19PRkY7CitlcnJfY2xrMjoKKwljbGtfcHV0KGFjOTdfY2xrKTsKKwlhYzk3X2NsayA9IE5VTEw7CitlcnJfY2xrOgogCWlmIChhYzk3Y29uZl9jbGspIHsKIAkJY2xrX3B1dChhYzk3Y29uZl9jbGspOwogCQlhYzk3Y29uZl9jbGsgPSBOVUxMOwogCX0KLQlmcmVlX2lycShJUlFfQUM5NywgTlVMTCk7Ci1lcnI6CitlcnJfY29uZjoKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwocHhhMnh4X2FjOTdfaHdfcHJvYmUpOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zb3VuZC5jIGIvc291bmQvY29yZS9zb3VuZC5jCmluZGV4IDQ0YTY5YmIuLjc4NzJhMDIgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc291bmQuYworKysgYi9zb3VuZC9jb3JlL3NvdW5kLmMKQEAgLTE1Miw2ICsxNTIsMTAgQEAKIAl9CiAJb2xkX2ZvcHMgPSBmaWxlLT5mX29wOwogCWZpbGUtPmZfb3AgPSBmb3BzX2dldChtcHRyLT5mX29wcyk7CisJaWYgKGZpbGUtPmZfb3AgPT0gTlVMTCkgeworCQlmaWxlLT5mX29wID0gb2xkX2ZvcHM7CisJCXJldHVybiAtRU5PREVWOworCX0KIAlpZiAoZmlsZS0+Zl9vcC0+b3BlbikKIAkJZXJyID0gZmlsZS0+Zl9vcC0+b3Blbihpbm9kZSwgZmlsZSk7CiAJaWYgKGVycikgewpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2FlZHNwMTYuYyBiL3NvdW5kL29zcy9hZWRzcDE2LmMKaW5kZXggYTAyNzRmMy4uM2VlOTkwMCAxMDA2NDQKLS0tIGEvc291bmQvb3NzL2FlZHNwMTYuYworKysgYi9zb3VuZC9vc3MvYWVkc3AxNi5jCkBAIC0xNTcsNyArMTU3LDcgQEAKIAogICAgU3RhcnRlZCBGcmkgTWFyIDE3IDE2OjEzOjE4IE1FVCAxOTk1CiAKLSAgIHYwLjEgKEFMUEhBLCB3YXMgYW4gdXNlci1sZXZlbCBwcm9ncmFtIGNhbGxlZCBBdWRpb0V4Y2VsRFNQMTYuYykKKyAgIHYwLjEgKEFMUEhBLCB3YXMgYSB1c2VyLWxldmVsIHByb2dyYW0gY2FsbGVkIEF1ZGlvRXhjZWxEU1AxNi5jKQogICAgLSBJbml0aWFsIGNvZGUuCiAgICB2MC4yIChBTFBIQSkKICAgIC0gQ2xlYW51cHMuCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NvbmV4YW50LmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2NvbmV4YW50LmMKaW5kZXggYjIwZTFjZS4uNzVkZTQwYSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9jb25leGFudC5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY29uZXhhbnQuYwpAQCAtMjUsNiArMjUsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvamFjay5oPgorCiAjaW5jbHVkZSAiaGRhX2NvZGVjLmgiCiAjaW5jbHVkZSAiaGRhX2xvY2FsLmgiCiAKQEAgLTM3LDcgKzM5LDIwIEBACiAjZGVmaW5lIENPTkVYQU5UX0hQX0VWRU5UCTB4MzcKICNkZWZpbmUgQ09ORVhBTlRfTUlDX0VWRU5UCTB4MzgKIAorLyogQ29uZXhhbnQgNTA1MSBzcGVjaWZpYyAqLwogCisjZGVmaW5lIENYVDUwNTFfU1BESUZfT1VUCTB4MUMKKyNkZWZpbmUgQ1hUNTA1MV9QT1JUQl9FVkVOVAkweDM4CisjZGVmaW5lIENYVDUwNTFfUE9SVENfRVZFTlQJMHgzOQorCisKK3N0cnVjdCBjb25leGFudF9qYWNrIHsKKworCWhkYV9uaWRfdCBuaWQ7CisJaW50IHR5cGU7CisJc3RydWN0IHNuZF9qYWNrICpqYWNrOworCit9OwogCiBzdHJ1Y3QgY29uZXhhbnRfc3BlYyB7CiAKQEAgLTgzLDYgKzk4LDkgQEAKIAogCXVuc2lnbmVkIGludCBzcGRpZl9yb3V0ZTsKIAorCS8qIGphY2sgZGV0ZWN0aW9uICovCisJc3RydWN0IHNuZF9hcnJheSBqYWNrczsKKwogCS8qIGR5bmFtaWMgY29udHJvbHMsIGluaXRfdmVyYnMgYW5kIGlucHV0X211eCAqLwogCXN0cnVjdCBhdXRvX3Bpbl9jZmcgYXV0b2NmZzsKIAlzdHJ1Y3QgaGRhX2lucHV0X211eCBwcml2YXRlX2ltdXg7CkBAIC0zMjksNiArMzQ3LDg2IEBACiAJCQkJICAgICAmc3BlYy0+Y3VyX211eFthZGNfaWR4XSk7CiB9CiAKK3N0YXRpYyBpbnQgY29uZXhhbnRfYWRkX2phY2soc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCWhkYV9uaWRfdCBuaWQsIGludCB0eXBlKQoreworCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjOworCXN0cnVjdCBjb25leGFudF9qYWNrICpqYWNrOworCWNvbnN0IGNoYXIgKm5hbWU7CisKKwlzcGVjID0gY29kZWMtPnNwZWM7CisJc25kX2FycmF5X2luaXQoJnNwZWMtPmphY2tzLCBzaXplb2YoKmphY2spLCAzMik7CisJamFjayA9IHNuZF9hcnJheV9uZXcoJnNwZWMtPmphY2tzKTsKKwluYW1lID0gKHR5cGUgPT0gU05EX0pBQ0tfSEVBRFBIT05FKSA/ICJIZWFkcGhvbmUiIDogIk1pYyIgOworCisJaWYgKCFqYWNrKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWphY2stPm5pZCA9IG5pZDsKKwlqYWNrLT50eXBlID0gdHlwZTsKKworCXJldHVybiBzbmRfamFja19uZXcoY29kZWMtPmJ1cy0+Y2FyZCwgbmFtZSwgdHlwZSwgJmphY2stPmphY2spOworfQorCitzdGF0aWMgdm9pZCBjb25leGFudF9yZXBvcnRfamFjayhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCkKK3sKKwlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXN0cnVjdCBjb25leGFudF9qYWNrICpqYWNrcyA9IHNwZWMtPmphY2tzLmxpc3Q7CisKKwlpZiAoamFja3MpIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBzcGVjLT5qYWNrcy51c2VkOyBpKyspIHsKKwkJCWlmIChqYWNrcy0+bmlkID09IG5pZCkgeworCQkJCXVuc2lnbmVkIGludCBwcmVzZW50OworCQkJCXByZXNlbnQgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIG5pZCwgMCwKKwkJCQkJCUFDX1ZFUkJfR0VUX1BJTl9TRU5TRSwgMCkgJgorCQkJCQlBQ19QSU5TRU5TRV9QUkVTRU5DRTsKKworCQkJCXByZXNlbnQgPSAocHJlc2VudCkgPyBqYWNrcy0+dHlwZSA6IDAgOworCisJCQkJc25kX2phY2tfcmVwb3J0KGphY2tzLT5qYWNrLAorCQkJCQkJcHJlc2VudCk7CisJCQl9CisJCQlqYWNrcysrOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IGNvbmV4YW50X2luaXRfamFja3Moc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisjaWZkZWYgQ09ORklHX1NORF9KQUNLCisJc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzcGVjLT5udW1faW5pdF92ZXJiczsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCBoZGFfdmVyYiAqaHY7CisKKwkJaHYgPSBzcGVjLT5pbml0X3ZlcmJzW2ldOworCQl3aGlsZSAoaHYtPm5pZCkgeworCQkJaW50IGVyciA9IDA7CisJCQlzd2l0Y2ggKGh2LT5wYXJhbSBeIEFDX1VTUlNQX0VOKSB7CisJCQljYXNlIENPTkVYQU5UX0hQX0VWRU5UOgorCQkJCWVyciA9IGNvbmV4YW50X2FkZF9qYWNrKGNvZGVjLCBodi0+bmlkLAorCQkJCQkJU05EX0pBQ0tfSEVBRFBIT05FKTsKKwkJCQljb25leGFudF9yZXBvcnRfamFjayhjb2RlYywgaHYtPm5pZCk7CisJCQkJYnJlYWs7CisJCQljYXNlIENYVDUwNTFfUE9SVENfRVZFTlQ6CisJCQljYXNlIENPTkVYQU5UX01JQ19FVkVOVDoKKwkJCQllcnIgPSBjb25leGFudF9hZGRfamFjayhjb2RlYywgaHYtPm5pZCwKKwkJCQkJCVNORF9KQUNLX01JQ1JPUEhPTkUpOworCQkJCWNvbmV4YW50X3JlcG9ydF9qYWNrKGNvZGVjLCBodi0+bmlkKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCQkrK2h2OworCQl9CisJfQorI2VuZGlmCisJcmV0dXJuIDA7CisKK30KKwogc3RhdGljIGludCBjb25leGFudF9pbml0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CkBAIC0zNDEsNiArNDM5LDE2IEBACiAKIHN0YXRpYyB2b2lkIGNvbmV4YW50X2ZyZWUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CisjaWZkZWYgQ09ORklHX1NORF9KQUNLCisJc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlpZiAoc3BlYy0+amFja3MubGlzdCkgeworCQlzdHJ1Y3QgY29uZXhhbnRfamFjayAqamFja3MgPSBzcGVjLT5qYWNrcy5saXN0OworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IHNwZWMtPmphY2tzLnVzZWQ7IGkrKykKKwkJCXNuZF9kZXZpY2VfZnJlZShjb2RlYy0+YnVzLT5jYXJkLCAmamFja3NbaV0uamFjayk7CisJCXNuZF9hcnJheV9mcmVlKCZzcGVjLT5qYWNrcyk7CisJfQorI2VuZGlmCiAJa2ZyZWUoY29kZWMtPnNwZWMpOwogfQogCkBAIC0xNTI2LDkgKzE2MzQsNiBAQAogLyogQ29uZXhhbnQgNTA1MSBzcGVjaWZpYyAqLwogc3RhdGljIGhkYV9uaWRfdCBjeHQ1MDUxX2RhY19uaWRzWzFdID0geyAweDEwIH07CiBzdGF0aWMgaGRhX25pZF90IGN4dDUwNTFfYWRjX25pZHNbMl0gPSB7IDB4MTQsIDB4MTUgfTsKLSNkZWZpbmUgQ1hUNTA1MV9TUERJRl9PVVQJMHgxQwotI2RlZmluZSBDWFQ1MDUxX1BPUlRCX0VWRU5UCTB4MzgKLSNkZWZpbmUgQ1hUNTA1MV9QT1JUQ19FVkVOVAkweDM5CiAKIHN0YXRpYyBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSBjeHQ1MDUxX21vZGVzWzFdID0gewogCXsgMiwgTlVMTCB9LApAQCAtMTYwOCw2ICsxNzEzLDcgQEAKIHN0YXRpYyB2b2lkIGN4dDUwNTFfaHBfdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCiAJCQkJICAgdW5zaWduZWQgaW50IHJlcykKIHsKKwlpbnQgbmlkID0gKHJlcyAmIEFDX1VOU09MX1JFU19TVUJUQUcpID4+IDIwOwogCXN3aXRjaCAocmVzID4+IDI2KSB7CiAJY2FzZSBDT05FWEFOVF9IUF9FVkVOVDoKIAkJY3h0NTA1MV9ocF9hdXRvbXV0ZShjb2RlYyk7CkBAIC0xNjE5LDYgKzE3MjUsNyBAQAogCQljeHQ1MDUxX3BvcnRjX2F1dG9taWMoY29kZWMpOwogCQlicmVhazsKIAl9CisJY29uZXhhbnRfcmVwb3J0X2phY2soY29kZWMsIG5pZCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBjeHQ1MDUxX21peGVyc1tdID0gewpAQCAtMTY5Myw2ICsxODAwLDcgQEAKIHN0YXRpYyBpbnQgY3h0NTA1MV9pbml0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCWNvbmV4YW50X2luaXQoY29kZWMpOworCWNvbmV4YW50X2luaXRfamFja3MoY29kZWMpOwogCWlmIChjb2RlYy0+cGF0Y2hfb3BzLnVuc29sX2V2ZW50KSB7CiAJCWN4dDUwNTFfaHBfYXV0b211dGUoY29kZWMpOwogCQljeHQ1MDUxX3BvcnRiX2F1dG9taWMoY29kZWMpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYwppbmRleCAwYmQ0ZTZiLi45MDY1ZWJmIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYwpAQCAtODQ2Nyw2ICs4NDY3LDcgQEAKIAlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyYTRmLCAiSFAgU2FtYmEiLCBBTEM4ODhfM1NUX0hQKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgyYTYwLCAiSFAgTHVja25vdyIsIEFMQzg4OF8zU1RfSFApLAogCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDJhNjEsICJIUCBOZXR0bGUiLCBBTEM4ODNfNlNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MmE2NiwgIkhQIEFjYWNpYSIsIEFMQzg4OF8zU1RfSFApLAogCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDE4NzMsICJBc3VzIE05MFYiLCBBTEM4ODhfQVNVU19NOTBWKSwKIAlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4MjQ5LCAiQXN1cyBNMkEtVk0gSERNSSIsIEFMQzg4M18zU1RfNmNoX0RJRyksCiAJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODJmZSwgIkFzdXMgUDVRLUVNIEhETUkiLCBBTEMxMjAwX0FTVVNfUDVRKSwKQEAgLTE2NjM4LDkgKzE2NjM5LDkgQEAKIAkgIC5wYXRjaCA9IHBhdGNoX2FsYzg4MiB9LCAvKiBzaG91bGQgYmUgcGF0Y2hfYWxjODgzKCkgaW4gZnV0dXJlICovCiAJeyAuaWQgPSAweDEwZWMwODg1LCAubmFtZSA9ICJBTEM4ODUiLCAucGF0Y2ggPSBwYXRjaF9hbGM4ODIgfSwKIAl7IC5pZCA9IDB4MTBlYzA4ODcsIC5uYW1lID0gIkFMQzg4NyIsIC5wYXRjaCA9IHBhdGNoX2FsYzg4MyB9LAotCXsgLmlkID0gMHgxMGVjMDg4OCwgLm5hbWUgPSAiQUxDODg4IiwgLnBhdGNoID0gcGF0Y2hfYWxjODgzIH0sCiAJeyAuaWQgPSAweDEwZWMwODg4LCAucmV2ID0gMHgxMDAxMDEsIC5uYW1lID0gIkFMQzEyMDAiLAogCSAgLnBhdGNoID0gcGF0Y2hfYWxjODgzIH0sCisJeyAuaWQgPSAweDEwZWMwODg4LCAubmFtZSA9ICJBTEM4ODgiLCAucGF0Y2ggPSBwYXRjaF9hbGM4ODMgfSwKIAl7IC5pZCA9IDB4MTBlYzA4ODksIC5uYW1lID0gIkFMQzg4OSIsIC5wYXRjaCA9IHBhdGNoX2FsYzg4MyB9LAogCXt9IC8qIHRlcm1pbmF0b3IgKi8KIH07CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzI0LmMgYi9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzI0LmMKaW5kZXggMGRmYTA1NC4uYmI4ZDhjNyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcyNC5jCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MjQuYwpAQCAtMTIzOSw3ICsxMjM5LDcgQEAKIAlpZiAoaWNlLT5mb3JjZV9wZG1hNCB8fCBpY2UtPmZvcmNlX3JkbWExKQogCQluYW1lID0gIklDRTE3MjQgU2Vjb25kYXJ5IjsKIAllbHNlCi0JCW5hbWUgPSAiSUVDMTcyNCBJRUM5NTgiOworCQluYW1lID0gIklDRTE3MjQgSUVDOTU4IjsKIAllcnIgPSBzbmRfcGNtX25ldyhpY2UtPmNhcmQsIG5hbWUsIGRldmljZSwgcGxheSwgY2FwdCwgJnBjbSk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYXRtZWwvc2FtOWcyMF93bTg3MzEuYyBiL3NvdW5kL3NvYy9hdG1lbC9zYW05ZzIwX3dtODczMS5jCmluZGV4IDFmYjU5YTkuLjZlYTA0YmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9hdG1lbC9zYW05ZzIwX3dtODczMS5jCisrKyBiL3NvdW5kL3NvYy9hdG1lbC9zYW05ZzIwX3dtODczMS5jCkBAIC0yMjEsOCArMjIxLDggQEAKIAlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgaW50ZXJjb24sIEFSUkFZX1NJWkUoaW50ZXJjb24pKTsKIAogCS8qIG5vdCBjb25uZWN0ZWQgKi8KLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJSTElORUlOIik7Ci0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiTExJTkVJTiIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJSTElORUlOIik7CisJc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIkxMSU5FSU4iKTsKIAogCS8qIGFsd2F5cyBjb25uZWN0ZWQgKi8KIAlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIkludCBNaWMiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9hdTF4L2RiZG1hMi5jIGIvc291bmQvc29jL2F1MXgvZGJkbWEyLmMKaW5kZXggNzRjODIzZC4uYmM4ZDY1NCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2F1MXgvZGJkbWEyLmMKKysrIGIvc291bmQvc29jL2F1MXgvZGJkbWEyLmMKQEAgLTE4Nyw3ICsxODcsNyBAQAogCQkJCQlhdTF4X3BjbV9kbWF0eF9jYiwgKHZvaWQgKilwY2QpOwogCiAJaWYgKCFwY2QtPmRkbWFfY2hhbikKLQkJcmV0dXJuIC1FTk9NRU07OworCQlyZXR1cm4gLUVOT01FTTsKIAogCWF1MXh4eF9kYmRtYV9zZXRfZGV2d2lkdGgocGNkLT5kZG1hX2NoYW4sIG1zYml0cyk7CiAJYXUxeHh4X2RiZG1hX3JpbmdfYWxsb2MocGNkLT5kZG1hX2NoYW4sIDIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9LY29uZmlnIGIvc291bmQvc29jL2NvZGVjcy9LY29uZmlnCmluZGV4IGM0MTI4OWIuLmQwZTBkNjkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvS2NvbmZpZworKysgYi9zb3VuZC9zb2MvY29kZWNzL0tjb25maWcKQEAgLTEsMyArMSwxMyBAQAorIyBIZWxwZXIgdG8gcmVzb2x2ZSBpc3N1ZXMgd2l0aCBjb25maWdzIHRoYXQgaGF2ZSBTUEkgZW5hYmxlZCBidXQgSTJDCisjIG1vZHVsYXIsIG1lYW5pbmcgd2UgY2FuJ3QgYnVpbGQgdGhlIGNvZGVjIGRyaXZlciBpbiB3aXRoIEkyQyBzdXBwb3J0LgorIyBXZSB1c2UgYW4gb3JkZXJlZCBsaXN0IG9mIGNvbmRpdGlvbmFsIGRlZmF1bHRzIHRvIHBpY2sgdGhlIGFwcHJvcHJpYXRlCisjIHNldHRpbmcgLSBTUEkgY2FuJ3QgYmUgbW9kdWxhciBzbyB0aGF0IGNhc2UgZG9lc24ndCBuZWVkIHRvIGJlIGNvdmVyZWQuCitjb25maWcgU05EX1NPQ19JMkNfQU5EX1NQSQorCXRyaXN0YXRlCisJZGVmYXVsdCBtIGlmIEkyQz1tCisJZGVmYXVsdCB5IGlmIEkyQz15CisJZGVmYXVsdCB5IGlmIFNQSV9NQVNURVI9eQorCiBjb25maWcgU05EX1NPQ19BTExfQ09ERUNTCiAJdHJpc3RhdGUgIkJ1aWxkIGFsbCBBU29DIENPREVDIGRyaXZlcnMiCiAJc2VsZWN0IFNORF9TT0NfQUM5N19DT0RFQyBpZiBTTkRfU09DX0FDOTdfQlVTCkBAIC0xNCwxMiArMjQsMTIgQEAKIAlzZWxlY3QgU05EX1NPQ19VREExMzRYCiAJc2VsZWN0IFNORF9TT0NfVURBMTM4MCBpZiBJMkMKIAlzZWxlY3QgU05EX1NPQ19XTTgzNTAgaWYgTUZEX1dNODM1MAotCXNlbGVjdCBTTkRfU09DX1dNODUxMCBpZiAoSTJDIHx8IFNQSV9NQVNURVIpCisJc2VsZWN0IFNORF9TT0NfV004NTEwIGlmIFNORF9TT0NfSTJDX0FORF9TUEkKIAlzZWxlY3QgU05EX1NPQ19XTTg1ODAgaWYgSTJDCi0Jc2VsZWN0IFNORF9TT0NfV004NzI4IGlmIChJMkMgfHwgU1BJX01BU1RFUikKLQlzZWxlY3QgU05EX1NPQ19XTTg3MzEgaWYgKEkyQyB8fCBTUElfTUFTVEVSKQotCXNlbGVjdCBTTkRfU09DX1dNODc1MCBpZiAoSTJDIHx8IFNQSV9NQVNURVIpCi0Jc2VsZWN0IFNORF9TT0NfV004NzUzIGlmIChJMkMgfHwgU1BJX01BU1RFUikKKwlzZWxlY3QgU05EX1NPQ19XTTg3MjggaWYgU05EX1NPQ19JMkNfQU5EX1NQSQorCXNlbGVjdCBTTkRfU09DX1dNODczMSBpZiBTTkRfU09DX0kyQ19BTkRfU1BJCisJc2VsZWN0IFNORF9TT0NfV004NzUwIGlmIFNORF9TT0NfSTJDX0FORF9TUEkKKwlzZWxlY3QgU05EX1NPQ19XTTg3NTMgaWYgU05EX1NPQ19JMkNfQU5EX1NQSQogCXNlbGVjdCBTTkRfU09DX1dNODkwMCBpZiBJMkMKIAlzZWxlY3QgU05EX1NPQ19XTTg5MDMgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfV004OTcxIGlmIEkyQwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90d2w0MDMwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3R3bDQwMzAuYwppbmRleCA1MTg0ODg4Li5mZDBmMzM4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3R3bDQwMzAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3R3bDQwMzAuYwpAQCAtMTkyLDM5ICsxOTIsNTEgQEAKIAogLyogRWFycGllY2UgKi8KIHN0YXRpYyBjb25zdCBjaGFyICp0d2w0MDMwX2VhcnBpZWNlX3RleHRzW10gPQotCQl7Ik9mZiIsICJEQUNMMSIsICJEQUNMMiIsICJJbnZhbGlkIiwgIkRBQ1IxIn07CisJCXsiT2ZmIiwgIkRBQ0wxIiwgIkRBQ0wyIiwgIkRBQ1IxIn07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHdsNDAzMF9lYXJwaWVjZV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoVFdMNDAzMF9SRUdfRUFSX0NUTCwgMSwKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdHdsNDAzMF9lYXJwaWVjZV92YWx1ZXNbXSA9CisJCXsweDAsIDB4MSwgMHgyLCAweDR9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY192YWx1ZV9lbnVtIHR3bDQwMzBfZWFycGllY2VfZW51bSA9CisJU09DX1ZBTFVFX0VOVU1fU0lOR0xFKFRXTDQwMzBfUkVHX0VBUl9DVEwsIDEsIDB4NywKIAkJCUFSUkFZX1NJWkUodHdsNDAzMF9lYXJwaWVjZV90ZXh0cyksCi0JCQl0d2w0MDMwX2VhcnBpZWNlX3RleHRzKTsKKwkJCXR3bDQwMzBfZWFycGllY2VfdGV4dHMsCisJCQl0d2w0MDMwX2VhcnBpZWNlX3ZhbHVlcyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0d2w0MDMwX2RhcG1fZWFycGllY2VfY29udHJvbCA9Ci1TT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHR3bDQwMzBfZWFycGllY2VfZW51bSk7CitTT0NfREFQTV9WQUxVRV9FTlVNKCJSb3V0ZSIsIHR3bDQwMzBfZWFycGllY2VfZW51bSk7CiAKIC8qIFByZURyaXZlIExlZnQgKi8KIHN0YXRpYyBjb25zdCBjaGFyICp0d2w0MDMwX3ByZWRyaXZlbF90ZXh0c1tdID0KLQkJeyJPZmYiLCAiREFDTDEiLCAiREFDTDIiLCAiSW52YWxpZCIsICJEQUNSMiJ9OworCQl7Ik9mZiIsICJEQUNMMSIsICJEQUNMMiIsICJEQUNSMiJ9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR3bDQwMzBfcHJlZHJpdmVsX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShUV0w0MDMwX1JFR19QUkVETF9DVEwsIDEsCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHR3bDQwMzBfcHJlZHJpdmVsX3ZhbHVlc1tdID0KKwkJezB4MCwgMHgxLCAweDIsIDB4NH07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX3ZhbHVlX2VudW0gdHdsNDAzMF9wcmVkcml2ZWxfZW51bSA9CisJU09DX1ZBTFVFX0VOVU1fU0lOR0xFKFRXTDQwMzBfUkVHX1BSRURMX0NUTCwgMSwgMHg3LAogCQkJQVJSQVlfU0laRSh0d2w0MDMwX3ByZWRyaXZlbF90ZXh0cyksCi0JCQl0d2w0MDMwX3ByZWRyaXZlbF90ZXh0cyk7CisJCQl0d2w0MDMwX3ByZWRyaXZlbF90ZXh0cywKKwkJCXR3bDQwMzBfcHJlZHJpdmVsX3ZhbHVlcyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0d2w0MDMwX2RhcG1fcHJlZHJpdmVsX2NvbnRyb2wgPQotU09DX0RBUE1fRU5VTSgiUm91dGUiLCB0d2w0MDMwX3ByZWRyaXZlbF9lbnVtKTsKK1NPQ19EQVBNX1ZBTFVFX0VOVU0oIlJvdXRlIiwgdHdsNDAzMF9wcmVkcml2ZWxfZW51bSk7CiAKIC8qIFByZURyaXZlIFJpZ2h0ICovCiBzdGF0aWMgY29uc3QgY2hhciAqdHdsNDAzMF9wcmVkcml2ZXJfdGV4dHNbXSA9Ci0JCXsiT2ZmIiwgIkRBQ1IxIiwgIkRBQ1IyIiwgIkludmFsaWQiLCAiREFDTDIifTsKKwkJeyJPZmYiLCAiREFDUjEiLCAiREFDUjIiLCAiREFDTDIifTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0d2w0MDMwX3ByZWRyaXZlcl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoVFdMNDAzMF9SRUdfUFJFRFJfQ1RMLCAxLAorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB0d2w0MDMwX3ByZWRyaXZlcl92YWx1ZXNbXSA9CisJCXsweDAsIDB4MSwgMHgyLCAweDR9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY192YWx1ZV9lbnVtIHR3bDQwMzBfcHJlZHJpdmVyX2VudW0gPQorCVNPQ19WQUxVRV9FTlVNX1NJTkdMRShUV0w0MDMwX1JFR19QUkVEUl9DVEwsIDEsIDB4NywKIAkJCUFSUkFZX1NJWkUodHdsNDAzMF9wcmVkcml2ZXJfdGV4dHMpLAotCQkJdHdsNDAzMF9wcmVkcml2ZXJfdGV4dHMpOworCQkJdHdsNDAzMF9wcmVkcml2ZXJfdGV4dHMsCisJCQl0d2w0MDMwX3ByZWRyaXZlcl92YWx1ZXMpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHdsNDAzMF9kYXBtX3ByZWRyaXZlcl9jb250cm9sID0KLVNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgdHdsNDAzMF9wcmVkcml2ZXJfZW51bSk7CitTT0NfREFQTV9WQUxVRV9FTlVNKCJSb3V0ZSIsIHR3bDQwMzBfcHJlZHJpdmVyX2VudW0pOwogCiAvKiBIZWFkc2V0IExlZnQgKi8KIHN0YXRpYyBjb25zdCBjaGFyICp0d2w0MDMwX2hzb2xfdGV4dHNbXSA9CkBAIC0yOTgsMjggKzMxMCw5MCBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHR3bDQwMzBfZGFwbV9oYW5kc2ZyZWVyX2NvbnRyb2wgPQogU09DX0RBUE1fRU5VTSgiUm91dGUiLCB0d2w0MDMwX2hhbmRzZnJlZXJfZW51bSk7CiAKLXN0YXRpYyBpbnQgb3V0bWl4ZXJfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisvKiBMZWZ0IGFuYWxvZyBtaWNyb3Bob25lIHNlbGVjdGlvbiAqLworc3RhdGljIGNvbnN0IGNoYXIgKnR3bDQwMzBfYW5hbG9nbG1pY190ZXh0c1tdID0KKwkJeyJPZmYiLCAiTWFpbiBtaWMiLCAiSGVhZHNldCBtaWMiLCAiQVVYTCIsICJDYXJraXQgbWljIn07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdHdsNDAzMF9hbmFsb2dsbWljX3ZhbHVlc1tdID0KKwkJezB4MCwgMHgxLCAweDIsIDB4NCwgMHg4fTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfdmFsdWVfZW51bSB0d2w0MDMwX2FuYWxvZ2xtaWNfZW51bSA9CisJU09DX1ZBTFVFX0VOVU1fU0lOR0xFKFRXTDQwMzBfUkVHX0FOQU1JQ0wsIDAsIDB4ZiwKKwkJCUFSUkFZX1NJWkUodHdsNDAzMF9hbmFsb2dsbWljX3RleHRzKSwKKwkJCXR3bDQwMzBfYW5hbG9nbG1pY190ZXh0cywKKwkJCXR3bDQwMzBfYW5hbG9nbG1pY192YWx1ZXMpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHdsNDAzMF9kYXBtX2FuYWxvZ2xtaWNfY29udHJvbCA9CitTT0NfREFQTV9WQUxVRV9FTlVNKCJSb3V0ZSIsIHR3bDQwMzBfYW5hbG9nbG1pY19lbnVtKTsKKworLyogUmlnaHQgYW5hbG9nIG1pY3JvcGhvbmUgc2VsZWN0aW9uICovCitzdGF0aWMgY29uc3QgY2hhciAqdHdsNDAzMF9hbmFsb2dybWljX3RleHRzW10gPQorCQl7Ik9mZiIsICJTdWIgbWljIiwgIkFVWFIifTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB0d2w0MDMwX2FuYWxvZ3JtaWNfdmFsdWVzW10gPQorCQl7MHgwLCAweDEsIDB4NH07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX3ZhbHVlX2VudW0gdHdsNDAzMF9hbmFsb2dybWljX2VudW0gPQorCVNPQ19WQUxVRV9FTlVNX1NJTkdMRShUV0w0MDMwX1JFR19BTkFNSUNSLCAwLCAweDUsCisJCQlBUlJBWV9TSVpFKHR3bDQwMzBfYW5hbG9ncm1pY190ZXh0cyksCisJCQl0d2w0MDMwX2FuYWxvZ3JtaWNfdGV4dHMsCisJCQl0d2w0MDMwX2FuYWxvZ3JtaWNfdmFsdWVzKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHR3bDQwMzBfZGFwbV9hbmFsb2dybWljX2NvbnRyb2wgPQorU09DX0RBUE1fVkFMVUVfRU5VTSgiUm91dGUiLCB0d2w0MDMwX2FuYWxvZ3JtaWNfZW51bSk7CisKKy8qIFRYMSBML1IgQW5hbG9nL0RpZ2l0YWwgbWljcm9waG9uZSBzZWxlY3Rpb24gKi8KK3N0YXRpYyBjb25zdCBjaGFyICp0d2w0MDMwX21pY3BhdGh0eDFfdGV4dHNbXSA9CisJCXsiQW5hbG9nIiwgIkRpZ2ltaWMwIn07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHdsNDAzMF9taWNwYXRodHgxX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShUV0w0MDMwX1JFR19BRENNSUNTRUwsIDAsCisJCQlBUlJBWV9TSVpFKHR3bDQwMzBfbWljcGF0aHR4MV90ZXh0cyksCisJCQl0d2w0MDMwX21pY3BhdGh0eDFfdGV4dHMpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHdsNDAzMF9kYXBtX21pY3BhdGh0eDFfY29udHJvbCA9CitTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHR3bDQwMzBfbWljcGF0aHR4MV9lbnVtKTsKKworLyogVFgyIEwvUiBBbmFsb2cvRGlnaXRhbCBtaWNyb3Bob25lIHNlbGVjdGlvbiAqLworc3RhdGljIGNvbnN0IGNoYXIgKnR3bDQwMzBfbWljcGF0aHR4Ml90ZXh0c1tdID0KKwkJeyJBbmFsb2ciLCAiRGlnaW1pYzEifTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0d2w0MDMwX21pY3BhdGh0eDJfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFRXTDQwMzBfUkVHX0FEQ01JQ1NFTCwgMiwKKwkJCUFSUkFZX1NJWkUodHdsNDAzMF9taWNwYXRodHgyX3RleHRzKSwKKwkJCXR3bDQwMzBfbWljcGF0aHR4Ml90ZXh0cyk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0d2w0MDMwX2RhcG1fbWljcGF0aHR4Ml9jb250cm9sID0KK1NPQ19EQVBNX0VOVU0oIlJvdXRlIiwgdHdsNDAzMF9taWNwYXRodHgyX2VudW0pOworCitzdGF0aWMgaW50IG1pY3BhdGhfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCiAJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKIHsKLQlzdHJ1Y3Qgc29jX2VudW0gKmUgPSAoc3RydWN0IHNvY19lbnVtICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7Ci0JaW50IHJldCA9IDA7Ci0JaW50IHZhbDsKKwlzdHJ1Y3Qgc29jX2VudW0gKmUgPSAoc3RydWN0IHNvY19lbnVtICopdy0+a2NvbnRyb2xzLT5wcml2YXRlX3ZhbHVlOworCXVuc2lnbmVkIGNoYXIgYWRjbWljc2VsLCBtaWNiaWFzX2N0bDsKIAotCXN3aXRjaCAoZS0+cmVnKSB7Ci0JY2FzZSBUV0w0MDMwX1JFR19QUkVETF9DVEw6Ci0JY2FzZSBUV0w0MDMwX1JFR19QUkVEUl9DVEw6Ci0JY2FzZSBUV0w0MDMwX1JFR19FQVJfQ1RMOgotCQl2YWwgPSB3LT52YWx1ZSA+PiBlLT5zaGlmdF9sOwotCQlpZiAodmFsID09IDMpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSJJbnZhbGlkIE1VWCBzZXR0aW5nIGZvciByZWdpc3RlciAweCUwMnggKCVkKVxuIiwKLQkJCSAgICAgIGUtPnJlZywgdmFsKTsKLQkJCXJldCA9IC0xOwotCQl9Ci0JCWJyZWFrOworCWFkY21pY3NlbCA9IHR3bDQwMzBfcmVhZF9yZWdfY2FjaGUody0+Y29kZWMsIFRXTDQwMzBfUkVHX0FEQ01JQ1NFTCk7CisJbWljYmlhc19jdGwgPSB0d2w0MDMwX3JlYWRfcmVnX2NhY2hlKHctPmNvZGVjLCBUV0w0MDMwX1JFR19NSUNCSUFTX0NUTCk7CisJLyogUHJlcGFyZSB0aGUgYml0cyBmb3IgdGhlIGdpdmVuIFRYIHBhdGg6CisJICogc2hpZnRfbCA9PSAwOiBUWDEgbWljcm9waG9uZSBwYXRoCisJICogc2hpZnRfbCA9PSAyOiBUWDIgbWljcm9waG9uZSBwYXRoICovCisJaWYgKGUtPnNoaWZ0X2wpIHsKKwkJLyogVFgyIG1pY3JvcGhvbmUgcGF0aCAqLworCQlpZiAoYWRjbWljc2VsICYgVFdMNDAzMF9UWDJJTl9TRUwpCisJCQltaWNiaWFzX2N0bCB8PSBUV0w0MDMwX01JQ0JJQVMyX0NUTDsgLyogZGlnaW1pYyAqLworCQllbHNlCisJCQltaWNiaWFzX2N0bCAmPSB+VFdMNDAzMF9NSUNCSUFTMl9DVEw7CisJfSBlbHNlIHsKKwkJLyogVFgxIG1pY3JvcGhvbmUgcGF0aCAqLworCQlpZiAoYWRjbWljc2VsICYgVFdMNDAzMF9UWDFJTl9TRUwpCisJCQltaWNiaWFzX2N0bCB8PSBUV0w0MDMwX01JQ0JJQVMxX0NUTDsgLyogZGlnaW1pYyAqLworCQllbHNlCisJCQltaWNiaWFzX2N0bCAmPSB+VFdMNDAzMF9NSUNCSUFTMV9DVEw7CiAJfQogCi0JcmV0dXJuIHJldDsKKwl0d2w0MDMwX3dyaXRlKHctPmNvZGVjLCBUV0w0MDMwX1JFR19NSUNCSUFTX0NUTCwgbWljYmlhc19jdGwpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgaGFuZHNmcmVlX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LApAQCAtNTAzLDE2MiArNTc3LDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IHR3bDQwMzBfZ2V0X2xlZnRfaW5wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0Jc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0ga2NvbnRyb2wtPnByaXZhdGVfZGF0YTsKLQl1OCByZWcgPSB0d2w0MDMwX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBUV0w0MDMwX1JFR19BTkFNSUNMKTsKLQlpbnQgcmVzdWx0ID0gMDsKLQotCS8qIG9uZSBiaXQgbXVzdCBiZSBzZXQgYSB0aW1lICovCi0JcmVnICY9IFRXTDQwMzBfQ0tNSUNfRU4gfCBUV0w0MDMwX0FVWExfRU4gfCBUV0w0MDMwX0hTTUlDX0VOCi0JCQl8IFRXTDQwMzBfTUFJTk1JQ19FTjsKLQlpZiAocmVnICE9IDApIHsKLQkJcmVzdWx0Kys7Ci0JCXdoaWxlICgocmVnICYgMSkgPT0gMCkgewotCQkJcmVzdWx0Kys7Ci0JCQlyZWcgPj49IDE7Ci0JCX0KLQl9Ci0KLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHJlc3VsdDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0d2w0MDMwX3B1dF9sZWZ0X2lucHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGtjb250cm9sLT5wcml2YXRlX2RhdGE7Ci0JaW50IHZhbHVlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0JdTggYW5hbWljbCwgbWljYmlhcywgYXZhZGNfY3RsOwotCi0JYW5hbWljbCA9IHR3bDQwMzBfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFRXTDQwMzBfUkVHX0FOQU1JQ0wpOwotCWFuYW1pY2wgJj0gfihUV0w0MDMwX0NLTUlDX0VOIHwgVFdMNDAzMF9BVVhMX0VOIHwgVFdMNDAzMF9IU01JQ19FTgotCQkJfCBUV0w0MDMwX01BSU5NSUNfRU4pOwotCW1pY2JpYXMgPSB0d2w0MDMwX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBUV0w0MDMwX1JFR19NSUNCSUFTX0NUTCk7Ci0JbWljYmlhcyAmPSB+KFRXTDQwMzBfSFNNSUNCSUFTX0VOIHwgVFdMNDAzMF9NSUNCSUFTMV9FTik7Ci0JYXZhZGNfY3RsID0gdHdsNDAzMF9yZWFkX3JlZ19jYWNoZShjb2RlYywgVFdMNDAzMF9SRUdfQVZBRENfQ1RMKTsKLQotCXN3aXRjaCAodmFsdWUpIHsKLQljYXNlIDE6Ci0JCWFuYW1pY2wgfD0gVFdMNDAzMF9NQUlOTUlDX0VOOwotCQltaWNiaWFzIHw9IFRXTDQwMzBfTUlDQklBUzFfRU47Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJYW5hbWljbCB8PSBUV0w0MDMwX0hTTUlDX0VOOwotCQltaWNiaWFzIHw9IFRXTDQwMzBfSFNNSUNCSUFTX0VOOwotCQlicmVhazsKLQljYXNlIDM6Ci0JCWFuYW1pY2wgfD0gVFdMNDAzMF9BVVhMX0VOOwotCQlicmVhazsKLQljYXNlIDQ6Ci0JCWFuYW1pY2wgfD0gVFdMNDAzMF9DS01JQ19FTjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JLyogSWYgc29tZSBpbnB1dCBpcyBzZWxlY3RlZCwgZW5hYmxlIGFtcCBhbmQgQURDICovCi0JaWYgKHZhbHVlICE9IDApIHsKLQkJYW5hbWljbCB8PSBUV0w0MDMwX01JQ0FNUExfRU47Ci0JCWF2YWRjX2N0bCB8PSBUV0w0MDMwX0FEQ0xfRU47Ci0JfSBlbHNlIHsKLQkJYW5hbWljbCAmPSB+VFdMNDAzMF9NSUNBTVBMX0VOOwotCQlhdmFkY19jdGwgJj0gflRXTDQwMzBfQURDTF9FTjsKLQl9Ci0KLQl0d2w0MDMwX3dyaXRlKGNvZGVjLCBUV0w0MDMwX1JFR19BTkFNSUNMLCBhbmFtaWNsKTsKLQl0d2w0MDMwX3dyaXRlKGNvZGVjLCBUV0w0MDMwX1JFR19NSUNCSUFTX0NUTCwgbWljYmlhcyk7Ci0JdHdsNDAzMF93cml0ZShjb2RlYywgVFdMNDAzMF9SRUdfQVZBRENfQ1RMLCBhdmFkY19jdGwpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgdHdsNDAzMF9nZXRfcmlnaHRfaW5wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0Jc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0ga2NvbnRyb2wtPnByaXZhdGVfZGF0YTsKLQl1OCByZWcgPSB0d2w0MDMwX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBUV0w0MDMwX1JFR19BTkFNSUNSKTsKLQlpbnQgdmFsdWUgPSAwOwotCi0JcmVnICY9IFRXTDQwMzBfU1VCTUlDX0VOfFRXTDQwMzBfQVVYUl9FTjsKLQlzd2l0Y2ggKHJlZykgewotCWNhc2UgVFdMNDAzMF9TVUJNSUNfRU46Ci0JCXZhbHVlID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBUV0w0MDMwX0FVWFJfRU46Ci0JCXZhbHVlID0gMjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB2YWx1ZTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0d2w0MDMwX3B1dF9yaWdodF9pbnB1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOwotCWludCB2YWx1ZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCXU4IGFuYW1pY3IsIG1pY2JpYXMsIGF2YWRjX2N0bDsKLQotCWFuYW1pY3IgPSB0d2w0MDMwX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBUV0w0MDMwX1JFR19BTkFNSUNSKTsKLQlhbmFtaWNyICY9IH4oVFdMNDAzMF9TVUJNSUNfRU58VFdMNDAzMF9BVVhSX0VOKTsKLQltaWNiaWFzID0gdHdsNDAzMF9yZWFkX3JlZ19jYWNoZShjb2RlYywgVFdMNDAzMF9SRUdfTUlDQklBU19DVEwpOwotCW1pY2JpYXMgJj0gflRXTDQwMzBfTUlDQklBUzJfRU47Ci0JYXZhZGNfY3RsID0gdHdsNDAzMF9yZWFkX3JlZ19jYWNoZShjb2RlYywgVFdMNDAzMF9SRUdfQVZBRENfQ1RMKTsKLQotCXN3aXRjaCAodmFsdWUpIHsKLQljYXNlIDE6Ci0JCWFuYW1pY3IgfD0gVFdMNDAzMF9TVUJNSUNfRU47Ci0JCW1pY2JpYXMgfD0gVFdMNDAzMF9NSUNCSUFTMl9FTjsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlhbmFtaWNyIHw9IFRXTDQwMzBfQVVYUl9FTjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKHZhbHVlICE9IDApIHsKLQkJYW5hbWljciB8PSBUV0w0MDMwX01JQ0FNUFJfRU47Ci0JCWF2YWRjX2N0bCB8PSBUV0w0MDMwX0FEQ1JfRU47Ci0JfSBlbHNlIHsKLQkJYW5hbWljciAmPSB+VFdMNDAzMF9NSUNBTVBSX0VOOwotCQlhdmFkY19jdGwgJj0gflRXTDQwMzBfQURDUl9FTjsKLQl9Ci0KLQl0d2w0MDMwX3dyaXRlKGNvZGVjLCBUV0w0MDMwX1JFR19BTkFNSUNSLCBhbmFtaWNyKTsKLQl0d2w0MDMwX3dyaXRlKGNvZGVjLCBUV0w0MDMwX1JFR19NSUNCSUFTX0NUTCwgbWljYmlhcyk7Ci0JdHdsNDAzMF93cml0ZShjb2RlYywgVFdMNDAzMF9SRUdfQVZBRENfQ1RMLCBhdmFkY19jdGwpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICp0d2w0MDMwX2xlZnRfaW5fc2VsW10gPSB7Ci0JIk5vbmUiLAotCSJNYWluIE1pYyIsCi0JIkhlYWRzZXQgTWljIiwKLQkiTGluZSBJbiIsCi0JIkNhcmtpdCBNaWMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKnR3bDQwMzBfcmlnaHRfaW5fc2VsW10gPSB7Ci0JIk5vbmUiLAotCSJTdWIgTWljIiwKLQkiTGluZSBJbiIsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR3bDQwMzBfbGVmdF9pbnB1dF9tdXggPQotCVNPQ19FTlVNX1NJTkdMRV9FWFQoQVJSQVlfU0laRSh0d2w0MDMwX2xlZnRfaW5fc2VsKSwKLQkJdHdsNDAzMF9sZWZ0X2luX3NlbCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHdsNDAzMF9yaWdodF9pbnB1dF9tdXggPQotCVNPQ19FTlVNX1NJTkdMRV9FWFQoQVJSQVlfU0laRSh0d2w0MDMwX3JpZ2h0X2luX3NlbCksCi0JCXR3bDQwMzBfcmlnaHRfaW5fc2VsKTsKLQogLyoKICAqIEZHQUlOIHZvbHVtZSBjb250cm9sOgogICogZnJvbSAtNjIgdG8gMCBkQiBpbiAxIGRCIHN0ZXBzIChtdXRlIGluc3RlYWQgb2YgLTYzIGRCKQpAQCAtNzQxLDE4ICs2NTksMTUgQEAKIAkJVFdMNDAzMF9SRUdfRUFSX0NUTCwgNCwgMywgMCwgb3V0cHV0X3R2bCksCiAKIAkvKiBDb21tb24gY2FwdHVyZSBnYWluIGNvbnRyb2xzICovCi0JU09DX0RPVUJMRV9SX1RMVigiQ2FwdHVyZSBWb2x1bWUiLAorCVNPQ19ET1VCTEVfUl9UTFYoIlRYMSBEaWdpdGFsIENhcHR1cmUgVm9sdW1lIiwKIAkJVFdMNDAzMF9SRUdfQVRYTDFQR0EsIFRXTDQwMzBfUkVHX0FUWFIxUEdBLAogCQkwLCAweDFmLCAwLCBkaWdpdGFsX2NhcHR1cmVfdGx2KSwKKwlTT0NfRE9VQkxFX1JfVExWKCJUWDIgRGlnaXRhbCBDYXB0dXJlIFZvbHVtZSIsCisJCVRXTDQwMzBfUkVHX0FWVFhMMlBHQSwgVFdMNDAzMF9SRUdfQVZUWFIyUEdBLAorCQkwLCAweDFmLCAwLCBkaWdpdGFsX2NhcHR1cmVfdGx2KSwKIAotCVNPQ19ET1VCTEVfVExWKCJJbnB1dCBCb29zdCBWb2x1bWUiLCBUV0w0MDMwX1JFR19BTkFNSUNfR0FJTiwKKwlTT0NfRE9VQkxFX1RMVigiQW5hbG9nIENhcHR1cmUgVm9sdW1lIiwgVFdMNDAzMF9SRUdfQU5BTUlDX0dBSU4sCiAJCTAsIDMsIDUsIDAsIGlucHV0X2dhaW5fdGx2KSwKLQotCS8qIElucHV0IHNvdXJjZSBjb250cm9scyAqLwotCVNPQ19FTlVNX0VYVCgiTGVmdCBJbnB1dCBTb3VyY2UiLCB0d2w0MDMwX2xlZnRfaW5wdXRfbXV4LAotCQl0d2w0MDMwX2dldF9sZWZ0X2lucHV0LCB0d2w0MDMwX3B1dF9sZWZ0X2lucHV0KSwKLQlTT0NfRU5VTV9FWFQoIlJpZ2h0IElucHV0IFNvdXJjZSIsIHR3bDQwMzBfcmlnaHRfaW5wdXRfbXV4LAotCQl0d2w0MDMwX2dldF9yaWdodF9pbnB1dCwgdHdsNDAzMF9wdXRfcmlnaHRfaW5wdXQpLAogfTsKIAogLyogYWRkIG5vbiBkYXBtIGNvbnRyb2xzICovCkBAIC03NzIsOSArNjg3LDE5IEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB0d2w0MDMwX2RhcG1fd2lkZ2V0c1tdID0gewotCVNORF9TT0NfREFQTV9JTlBVVCgiSU5MIiksCi0JU05EX1NPQ19EQVBNX0lOUFVUKCJJTlIiKSwKKwkvKiBMZWZ0IGNoYW5uZWwgaW5wdXRzICovCisJU05EX1NPQ19EQVBNX0lOUFVUKCJNQUlOTUlDIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJIU01JQyIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiQVVYTCIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiQ0FSS0lUTUlDIiksCisJLyogUmlnaHQgY2hhbm5lbCBpbnB1dHMgKi8KKwlTTkRfU09DX0RBUE1fSU5QVVQoIlNVQk1JQyIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiQVVYUiIpLAorCS8qIERpZ2l0YWwgbWljcm9waG9uZXMgKFN0ZXJlbykgKi8KKwlTTkRfU09DX0RBUE1fSU5QVVQoIkRJR0lNSUMwIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJESUdJTUlDMSIpLAogCisJLyogT3V0cHV0cyAqLwogCVNORF9TT0NfREFQTV9PVVRQVVQoIk9VVEwiKSwKIAlTTkRfU09DX0RBUE1fT1VUUFVUKCJPVVRSIiksCiAJU05EX1NPQ19EQVBNX09VVFBVVCgiRUFSUElFQ0UiKSwKQEAgLTgwOSwxNiArNzM0LDEzIEBACiAKIAkvKiBPdXRwdXQgTVVYIGNvbnRyb2xzICovCiAJLyogRWFycGllY2UgKi8KLQlTTkRfU09DX0RBUE1fTVVYX0UoIkVhcnBpZWNlIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJJnR3bDQwMzBfZGFwbV9lYXJwaWVjZV9jb250cm9sLCBvdXRtaXhlcl9ldmVudCwKLQkJU05EX1NPQ19EQVBNX1BSRV9SRUcpLAorCVNORF9TT0NfREFQTV9WQUxVRV9NVVgoIkVhcnBpZWNlIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnR3bDQwMzBfZGFwbV9lYXJwaWVjZV9jb250cm9sKSwKIAkvKiBQcmVEcml2TC9SICovCi0JU05EX1NPQ19EQVBNX01VWF9FKCJQcmVkcml2ZUwgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmdHdsNDAzMF9kYXBtX3ByZWRyaXZlbF9jb250cm9sLCBvdXRtaXhlcl9ldmVudCwKLQkJU05EX1NPQ19EQVBNX1BSRV9SRUcpLAotCVNORF9TT0NfREFQTV9NVVhfRSgiUHJlZHJpdmVSIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJJnR3bDQwMzBfZGFwbV9wcmVkcml2ZXJfY29udHJvbCwgb3V0bWl4ZXJfZXZlbnQsCi0JCVNORF9TT0NfREFQTV9QUkVfUkVHKSwKKwlTTkRfU09DX0RBUE1fVkFMVUVfTVVYKCJQcmVkcml2ZUwgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmdHdsNDAzMF9kYXBtX3ByZWRyaXZlbF9jb250cm9sKSwKKwlTTkRfU09DX0RBUE1fVkFMVUVfTVVYKCJQcmVkcml2ZVIgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmdHdsNDAzMF9kYXBtX3ByZWRyaXZlcl9jb250cm9sKSwKIAkvKiBIZWFkc2V0TC9SICovCiAJU05EX1NPQ19EQVBNX01VWCgiSGVhZHNldEwgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLAogCQkmdHdsNDAzMF9kYXBtX2hzb2xfY29udHJvbCksCkBAIC04MzcsOCArNzU5LDQ4IEBACiAJCSZ0d2w0MDMwX2RhcG1faGFuZHNmcmVlcl9jb250cm9sLCBoYW5kc2ZyZWVfZXZlbnQsCiAJCVNORF9TT0NfREFQTV9QT1NUX1BNVXxTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAogCi0JU05EX1NPQ19EQVBNX0FEQygiQURDTCIsICJMZWZ0IENhcHR1cmUiLCBTTkRfU09DX05PUE0sIDAsIDApLAotCVNORF9TT0NfREFQTV9BREMoIkFEQ1IiLCAiUmlnaHQgQ2FwdHVyZSIsIFNORF9TT0NfTk9QTSwgMCwgMCksCisJLyogSW50cm9kdWNpbmcgZm91ciB2aXJ0dWFsIEFEQywgc2luY2UgVFdMNDAzMCBoYXZlIGZvdXIgY2hhbm5lbCBmb3IKKwkgICBjYXB0dXJlICovCisJU05EX1NPQ19EQVBNX0FEQygiQURDIFZpcnR1YWwgTGVmdDEiLCAiTGVmdCBGcm9udCBDYXB0dXJlIiwKKwkJU05EX1NPQ19OT1BNLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fQURDKCJBREMgVmlydHVhbCBSaWdodDEiLCAiUmlnaHQgRnJvbnQgQ2FwdHVyZSIsCisJCVNORF9TT0NfTk9QTSwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FEQygiQURDIFZpcnR1YWwgTGVmdDIiLCAiTGVmdCBSZWFyIENhcHR1cmUiLAorCQlTTkRfU09DX05PUE0sIDAsIDApLAorCVNORF9TT0NfREFQTV9BREMoIkFEQyBWaXJ0dWFsIFJpZ2h0MiIsICJSaWdodCBSZWFyIENhcHR1cmUiLAorCQlTTkRfU09DX05PUE0sIDAsIDApLAorCisJLyogQW5hbG9nL0RpZ2l0YWwgbWljIHBhdGggc2VsZWN0aW9uLgorCSAgIFRYMSBMZWZ0L1JpZ2h0OiBlaXRoZXIgYW5hbG9nIExlZnQvUmlnaHQgb3IgRGlnaW1pYzAKKwkgICBUWDIgTGVmdC9SaWdodDogZWl0aGVyIGFuYWxvZyBMZWZ0L1JpZ2h0IG9yIERpZ2ltaWMxICovCisJU05EX1NPQ19EQVBNX01VWF9FKCJUWDEgQ2FwdHVyZSBSb3V0ZSIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnR3bDQwMzBfZGFwbV9taWNwYXRodHgxX2NvbnRyb2wsIG1pY3BhdGhfZXZlbnQsCisJCVNORF9TT0NfREFQTV9QT1NUX1BNVXxTTkRfU09DX0RBUE1fUE9TVF9QTUR8CisJCVNORF9TT0NfREFQTV9QT1NUX1JFRyksCisJU05EX1NPQ19EQVBNX01VWF9FKCJUWDIgQ2FwdHVyZSBSb3V0ZSIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJnR3bDQwMzBfZGFwbV9taWNwYXRodHgyX2NvbnRyb2wsIG1pY3BhdGhfZXZlbnQsCisJCVNORF9TT0NfREFQTV9QT1NUX1BNVXxTTkRfU09DX0RBUE1fUE9TVF9QTUR8CisJCVNORF9TT0NfREFQTV9QT1NUX1JFRyksCisKKwkvKiBBbmFsb2cgaW5wdXQgbXV4ZXMgd2l0aCBwb3dlciBzd2l0Y2ggZm9yIHRoZSBwaHlzaWNhbCBBRENML1IgKi8KKwlTTkRfU09DX0RBUE1fVkFMVUVfTVVYKCJBbmFsb2cgTGVmdCBDYXB0dXJlIFJvdXRlIiwKKwkJVFdMNDAzMF9SRUdfQVZBRENfQ1RMLCAzLCAwLCAmdHdsNDAzMF9kYXBtX2FuYWxvZ2xtaWNfY29udHJvbCksCisJU05EX1NPQ19EQVBNX1ZBTFVFX01VWCgiQW5hbG9nIFJpZ2h0IENhcHR1cmUgUm91dGUiLAorCQlUV0w0MDMwX1JFR19BVkFEQ19DVEwsIDEsIDAsICZ0d2w0MDMwX2RhcG1fYW5hbG9ncm1pY19jb250cm9sKSwKKworCVNORF9TT0NfREFQTV9QR0EoIkFuYWxvZyBMZWZ0IEFtcGxpZmllciIsCisJCVRXTDQwMzBfUkVHX0FOQU1JQ0wsIDQsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIkFuYWxvZyBSaWdodCBBbXBsaWZpZXIiLAorCQlUV0w0MDMwX1JFR19BTkFNSUNSLCA0LCAwLCBOVUxMLCAwKSwKKworCVNORF9TT0NfREFQTV9QR0EoIkRpZ2ltaWMwIEVuYWJsZSIsCisJCVRXTDQwMzBfUkVHX0FEQ01JQ1NFTCwgMSwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1BHQSgiRGlnaW1pYzEgRW5hYmxlIiwKKwkJVFdMNDAzMF9SRUdfQURDTUlDU0VMLCAzLCAwLCBOVUxMLCAwKSwKKworCVNORF9TT0NfREFQTV9NSUNCSUFTKCJNaWMgQmlhcyAxIiwgVFdMNDAzMF9SRUdfTUlDQklBU19DVEwsIDAsIDApLAorCVNORF9TT0NfREFQTV9NSUNCSUFTKCJNaWMgQmlhcyAyIiwgVFdMNDAzMF9SRUdfTUlDQklBU19DVEwsIDEsIDApLAorCVNORF9TT0NfREFQTV9NSUNCSUFTKCJIZWFkc2V0IE1pYyBCaWFzIiwgVFdMNDAzMF9SRUdfTUlDQklBU19DVEwsIDIsIDApLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgaW50ZXJjb25bXSA9IHsKQEAgLTg5NCw5ICs4NTYsMzkgQEAKIAl7IkhGTCIsIE5VTEwsICJIYW5kc2ZyZWVMIE11eCJ9LAogCXsiSEZSIiwgTlVMTCwgIkhhbmRzZnJlZVIgTXV4In0sCiAKLQkvKiBpbnB1dHMgKi8KLQl7IkFEQ0wiLCBOVUxMLCAiSU5MIn0sCi0JeyJBRENSIiwgTlVMTCwgIklOUiJ9LAorCS8qIENhcHR1cmUgcGF0aCAqLworCXsiQW5hbG9nIExlZnQgQ2FwdHVyZSBSb3V0ZSIsICJNYWluIG1pYyIsICJNQUlOTUlDIn0sCisJeyJBbmFsb2cgTGVmdCBDYXB0dXJlIFJvdXRlIiwgIkhlYWRzZXQgbWljIiwgIkhTTUlDIn0sCisJeyJBbmFsb2cgTGVmdCBDYXB0dXJlIFJvdXRlIiwgIkFVWEwiLCAiQVVYTCJ9LAorCXsiQW5hbG9nIExlZnQgQ2FwdHVyZSBSb3V0ZSIsICJDYXJraXQgbWljIiwgIkNBUktJVE1JQyJ9LAorCisJeyJBbmFsb2cgUmlnaHQgQ2FwdHVyZSBSb3V0ZSIsICJTdWIgbWljIiwgIlNVQk1JQyJ9LAorCXsiQW5hbG9nIFJpZ2h0IENhcHR1cmUgUm91dGUiLCAiQVVYUiIsICJBVVhSIn0sCisKKwl7IkFuYWxvZyBMZWZ0IEFtcGxpZmllciIsIE5VTEwsICJBbmFsb2cgTGVmdCBDYXB0dXJlIFJvdXRlIn0sCisJeyJBbmFsb2cgUmlnaHQgQW1wbGlmaWVyIiwgTlVMTCwgIkFuYWxvZyBSaWdodCBDYXB0dXJlIFJvdXRlIn0sCisKKwl7IkRpZ2ltaWMwIEVuYWJsZSIsIE5VTEwsICJESUdJTUlDMCJ9LAorCXsiRGlnaW1pYzEgRW5hYmxlIiwgTlVMTCwgIkRJR0lNSUMxIn0sCisKKwkvKiBUWDEgTGVmdCBjYXB0dXJlIHBhdGggKi8KKwl7IlRYMSBDYXB0dXJlIFJvdXRlIiwgIkFuYWxvZyIsICJBbmFsb2cgTGVmdCBBbXBsaWZpZXIifSwKKwl7IlRYMSBDYXB0dXJlIFJvdXRlIiwgIkRpZ2ltaWMwIiwgIkRpZ2ltaWMwIEVuYWJsZSJ9LAorCS8qIFRYMSBSaWdodCBjYXB0dXJlIHBhdGggKi8KKwl7IlRYMSBDYXB0dXJlIFJvdXRlIiwgIkFuYWxvZyIsICJBbmFsb2cgUmlnaHQgQW1wbGlmaWVyIn0sCisJeyJUWDEgQ2FwdHVyZSBSb3V0ZSIsICJEaWdpbWljMCIsICJEaWdpbWljMCBFbmFibGUifSwKKwkvKiBUWDIgTGVmdCBjYXB0dXJlIHBhdGggKi8KKwl7IlRYMiBDYXB0dXJlIFJvdXRlIiwgIkFuYWxvZyIsICJBbmFsb2cgTGVmdCBBbXBsaWZpZXIifSwKKwl7IlRYMiBDYXB0dXJlIFJvdXRlIiwgIkRpZ2ltaWMxIiwgIkRpZ2ltaWMxIEVuYWJsZSJ9LAorCS8qIFRYMiBSaWdodCBjYXB0dXJlIHBhdGggKi8KKwl7IlRYMiBDYXB0dXJlIFJvdXRlIiwgIkFuYWxvZyIsICJBbmFsb2cgUmlnaHQgQW1wbGlmaWVyIn0sCisJeyJUWDIgQ2FwdHVyZSBSb3V0ZSIsICJEaWdpbWljMSIsICJEaWdpbWljMSBFbmFibGUifSwKKworCXsiQURDIFZpcnR1YWwgTGVmdDEiLCBOVUxMLCAiVFgxIENhcHR1cmUgUm91dGUifSwKKwl7IkFEQyBWaXJ0dWFsIFJpZ2h0MSIsIE5VTEwsICJUWDEgQ2FwdHVyZSBSb3V0ZSJ9LAorCXsiQURDIFZpcnR1YWwgTGVmdDIiLCBOVUxMLCAiVFgyIENhcHR1cmUgUm91dGUifSwKKwl7IkFEQyBWaXJ0dWFsIFJpZ2h0MiIsIE5VTEwsICJUWDIgQ2FwdHVyZSBSb3V0ZSJ9LAorCiB9OwogCiBzdGF0aWMgaW50IHR3bDQwMzBfYWRkX3dpZGdldHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQpAQCAtOTIzLDYgKzkxNSw3IEBACiAJdHdsNDAzMF93cml0ZShjb2RlYywgVFdMNDAzMF9SRUdfQU5BTUlDTCwKIAkJYW5hbWljbCB8IFRXTDQwMzBfQ05DTF9PRkZTRVRfU1RBUlQpOwogCisKIAkvKiB3YWl0IGZvciBvZmZzZXQgY2FuY2VsbGF0aW9uIHRvIGNvbXBsZXRlICovCiAJZG8gewogCQkvKiB0aGlzIHRha2VzIGEgbGl0dGxlIHdoaWxlLCBzbyBkb24ndCBzbGFtIGkyYyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90d2w0MDMwLmggYi9zb3VuZC9zb2MvY29kZWNzL3R3bDQwMzAuaAppbmRleCA1NDYxNWM3Li40NDJlNWE4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3R3bDQwMzAuaAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3R3bDQwMzAuaApAQCAtMTQ3LDYgKzE0NywxMyBAQAogI2RlZmluZSBUV0w0MDMwX0FWQURDX0NMS19QUklPUklUWQkweDA0CiAjZGVmaW5lIFRXTDQwMzBfQURDUl9FTgkJCTB4MDIKIAorLyogVFdMNDAzMF9SRUdfQURDTUlDU0VMICgweDA4KSBGaWVsZHMgKi8KKworI2RlZmluZSBUV0w0MDMwX0RJR01JQzFfRU4JCTB4MDgKKyNkZWZpbmUgVFdMNDAzMF9UWDJJTl9TRUwJCTB4MDQKKyNkZWZpbmUgVFdMNDAzMF9ESUdNSUMwX0VOCQkweDAyCisjZGVmaW5lIFRXTDQwMzBfVFgxSU5fU0VMCQkweDAxCisKIC8qIEFVRElPX0lGICgweDBFKSBGaWVsZHMgKi8KIAogI2RlZmluZSBUV0w0MDMwX0FJRl9TTEFWRV9FTgkJMHg4MApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1ldm0uYyBiL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktZXZtLmMKaW5kZXggMDFiOTQ4Yi4uNTQ4NTFmMyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1ldm0uYworKysgYi9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLWV2bS5jCkBAIC0yNiw3ICsyNiw2IEBACiAjaW5jbHVkZSAiZGF2aW5jaS1wY20uaCIKICNpbmNsdWRlICJkYXZpbmNpLWkycy5oIgogCi0jZGVmaW5lIEVWTV9DT0RFQ19DTE9DSyAyMjU3OTIwMAogCiAjZGVmaW5lIEFVRElPX0ZPUk1BVCAoU05EX1NPQ19EQUlGTVRfRFNQX0IgfCBcCiAJCVNORF9TT0NfREFJRk1UX0NCTV9DRk0gfCBTTkRfU09DX0RBSUZNVF9JQl9ORikKQEAgLTM3LDYgKzM2LDIxIEBACiAJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmRhaS0+Y29kZWNfZGFpOwogCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+ZGFpLT5jcHVfZGFpOwogCWludCByZXQgPSAwOworCXVuc2lnbmVkIHN5c2NsazsKKworCS8qIEFTUDEgb24gRE0zNTUgRVZNIGlzIGNsb2NrZWQgYnkgYW4gZXh0ZXJuYWwgb3NjaWxsYXRvciAqLworCWlmIChtYWNoaW5lX2lzX2RhdmluY2lfZG0zNTVfZXZtKCkpCisJCXN5c2NsayA9IDI3MDAwMDAwOworCisJLyogQVNQMCBpbiBETTY0NDYgRVZNIGlzIGNsb2NrZWQgYnkgVTU1LCBhcyBjb25maWd1cmVkIGJ5CisJICogYm9hcmQtZG02NDR4LWV2bS5jIHVzaW5nIEdQSU9zIGZyb20gVTE4LiAgVGhlcmUgYXJlIHNpeAorCSAqIG9wdGlvbnM7IGhlcmUgd2UgImtub3ciIHdlIHVzZSBhIDQ4IEtIeiBzYW1wbGUgcmF0ZS4KKwkgKi8KKwllbHNlIGlmIChtYWNoaW5lX2lzX2RhdmluY2lfZXZtKCkpCisJCXN5c2NsayA9IDEyMjg4MDAwOworCisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIHNldCBjb2RlYyBEQUkgY29uZmlndXJhdGlvbiAqLwogCXJldCA9IHNuZF9zb2NfZGFpX3NldF9mbXQoY29kZWNfZGFpLCBBVURJT19GT1JNQVQpOwpAQCAtNDksOCArNjMsNyBAQAogCQlyZXR1cm4gcmV0OwogCiAJLyogc2V0IHRoZSBjb2RlYyBzeXN0ZW0gY2xvY2sgKi8KLQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGNvZGVjX2RhaSwgMCwgRVZNX0NPREVDX0NMT0NLLAotCQkJCQkgICAgU05EX1NPQ19DTE9DS19PVVQpOworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY29kZWNfZGFpLCAwLCBzeXNjbGssIFNORF9TT0NfQ0xPQ0tfT1VUKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1wY20uYyBiL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktcGNtLmMKaW5kZXggNzRhYmM5Yi4uMzY2MDQ5ZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1wY20uYworKysgYi9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLXBjbS5jCkBAIC0yMTIsNyArMjEyLDcgQEAKIAlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKIAkJY291bnQgPSBzcmMgLSBydW50aW1lLT5kbWFfYWRkcjsKIAllbHNlCi0JCWNvdW50ID0gZHN0IC0gcnVudGltZS0+ZG1hX2FkZHI7OworCQljb3VudCA9IGRzdCAtIHJ1bnRpbWUtPmRtYV9hZGRyOwogCiAJc3Bpbl91bmxvY2soJnBydGQtPmxvY2spOwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLXNmZnNkci5jIGIvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1zZmZzZHIuYwppbmRleCBmNjc1NzlkLi40OTM1ZDFiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLXNmZnNkci5jCisrKyBiL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktc2Zmc2RyLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogCiAjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3BsYXQtc2Zmc2RyL3NmZnNkci1mcGdhLmg+CiAKICNpbmNsdWRlIDxtYWNoL21jYnNwLmg+CkBAIC0xMTUsNiArMTE2LDkgQEAKIHsKIAlpbnQgcmV0OwogCisJaWYgKCFtYWNoaW5lX2lzX3NmZnNkcigpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCXNmZnNkcl9zbmRfZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJzb2MtYXVkaW8iLCAwKTsKIAlpZiAoIXNmZnNkcl9zbmRfZGV2aWNlKSB7CiAJCXByaW50ayhLRVJOX0VSUiAicGxhdGZvcm0gZGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL0tjb25maWcgYi9zb3VuZC9zb2Mvb21hcC9LY29uZmlnCmluZGV4IGE3YjFkNzcuLjRmN2YwNDAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL0tjb25maWcKKysrIGIvc291bmQvc29jL29tYXAvS2NvbmZpZwpAQCAtMTAsNiArMTAsNyBAQAogCXRyaXN0YXRlICJTb0MgQXVkaW8gc3VwcG9ydCBmb3IgTm9raWEgTjgxMCIKIAlkZXBlbmRzIG9uIFNORF9PTUFQX1NPQyAmJiBNQUNIX05PS0lBX044MTAKIAlzZWxlY3QgU05EX09NQVBfU09DX01DQlNQCisJc2VsZWN0IE9NQVBfTVVYCiAJc2VsZWN0IFNORF9TT0NfVExWMzIwQUlDM1gKIAloZWxwCiAJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvIG9uIE5va2lhIE44MTAuCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvb21hcC9vbWFwM3BhbmRvcmEuYyBiL3NvdW5kL3NvYy9vbWFwL29tYXAzcGFuZG9yYS5jCmluZGV4IGJkOTE1OTQuLmZjYzJmNWQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL29tYXAzcGFuZG9yYS5jCisrKyBiL3NvdW5kL3NvYy9vbWFwL29tYXAzcGFuZG9yYS5jCkBAIC0xODAsNiArMTgwLDE5IEBACiB7CiAJaW50IHJldDsKIAorCS8qIEFsbCBUV0w0MDMwIG91dHB1dCBwaW5zIGFyZSBmbG9hdGluZyAqLworCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJPVVRMIiksCisJc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIk9VVFIiKSwKKwlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiRUFSUElFQ0UiKSwKKwlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiUFJFRFJJVkVMIiksCisJc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIlBSRURSSVZFUiIpLAorCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJIU09MIiksCisJc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIkhTT1IiKSwKKwlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiQ0FSS0lUTCIpLAorCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJDQVJLSVRSIiksCisJc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIkhGTCIpLAorCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJIRlIiKSwKKwogCXJldCA9IHNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIG9tYXAzcGFuZG9yYV9pbl9kYXBtX3dpZGdldHMsCiAJCQkJQVJSQVlfU0laRShvbWFwM3BhbmRvcmFfaW5fZGFwbV93aWRnZXRzKSk7CiAJaWYgKHJldCA8IDApCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL3B4YTJ4eC1wY20uYyBiL3NvdW5kL3NvYy9weGEvcHhhMnh4LXBjbS5jCmluZGV4IGM2NzBkMDguLjUzYjlmYjEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9weGEvcHhhMnh4LXBjbS5jCisrKyBiL3NvdW5kL3NvYy9weGEvcHhhMnh4LXBjbS5jCkBAIC02MSw5ICs2MSw5IEBACiAKIAlfX3B4YTJ4eF9wY21faHdfZnJlZShzdWJzdHJlYW0pOwogCi0JaWYgKHBydGQtPmRtYV9jaCkgeworCWlmIChwcnRkLT5kbWFfY2ggPj0gMCkgewogCQlweGFfZnJlZV9kbWEocHJ0ZC0+ZG1hX2NoKTsKLQkJcHJ0ZC0+ZG1hX2NoID0gMDsKKwkJcHJ0ZC0+ZG1hX2NoID0gLTE7CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc29jLWNvcmUuYyBiL3NvdW5kL3NvYy9zb2MtY29yZS5jCmluZGV4IGIwOThjMGIuLjZjYmU3ZTggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zb2MtY29yZS5jCisrKyBiL3NvdW5kL3NvYy9zb2MtY29yZS5jCkBAIC0xMzAwLDYgKzEzMDAsOCBAQAogLyoqCiAgKiBzbmRfc29jX25ld19wY21zIC0gY3JlYXRlIG5ldyBzb3VuZCBjYXJkIGFuZCBwY21zCiAgKiBAc29jZGV2OiB0aGUgU29DIGF1ZGlvIGRldmljZQorICogQGlkeDogQUxTQSBjYXJkIGluZGV4CisgKiBAeGlkOiBjYXJkIGlkZW50aWZpY2F0aW9uCiAgKgogICogQ3JlYXRlIGEgbmV3IHNvdW5kIGNhcmQgYmFzZWQgdXBvbiB0aGUgY29kZWMgYW5kIGludGVyZmFjZSBwY21zLgogICoKQEAgLTE0NzIsNyArMTQ3NCw3IEBACiAgKiBzbmRfc29jX2NuZXcgLSBjcmVhdGUgbmV3IGNvbnRyb2wKICAqIEBfdGVtcGxhdGU6IGNvbnRyb2wgdGVtcGxhdGUKICAqIEBkYXRhOiBjb250cm9sIHByaXZhdGUgZGF0YQotICogQGxubmdfbmFtZTogY29udHJvbCBsb25nIG5hbWUKKyAqIEBsb25nX25hbWU6IGNvbnRyb2wgbG9uZyBuYW1lCiAgKgogICogQ3JlYXRlIGEgbmV3IG1peGVyIGNvbnRyb2wgZnJvbSBhIHRlbXBsYXRlIGNvbnRyb2wuCiAgKgpAQCAtMTUyMiw3ICsxNTI0LDcgQEAKIC8qKgogICogc25kX3NvY19nZXRfZW51bV9kb3VibGUgLSBlbnVtZXJhdGVkIGRvdWJsZSBtaXhlciBnZXQgY2FsbGJhY2sKICAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbAotICogQHVpbmZvOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KKyAqIEB1Y29udHJvbDogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCiAgKgogICogQ2FsbGJhY2sgdG8gZ2V0IHRoZSB2YWx1ZSBvZiBhIGRvdWJsZSBlbnVtZXJhdGVkIG1peGVyLgogICoKQEAgLTE1NTEsNyArMTU1Myw3IEBACiAvKioKICAqIHNuZF9zb2NfcHV0X2VudW1fZG91YmxlIC0gZW51bWVyYXRlZCBkb3VibGUgbWl4ZXIgcHV0IGNhbGxiYWNrCiAgKiBAa2NvbnRyb2w6IG1peGVyIGNvbnRyb2wKLSAqIEB1aW5mbzogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCisgKiBAdWNvbnRyb2w6IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgogICoKICAqIENhbGxiYWNrIHRvIHNldCB0aGUgdmFsdWUgb2YgYSBkb3VibGUgZW51bWVyYXRlZCBtaXhlci4KICAqCkBAIC0xNTgzLDYgKzE1ODUsMTEzIEBACiBFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX3B1dF9lbnVtX2RvdWJsZSk7CiAKIC8qKgorICogc25kX3NvY19pbmZvX3ZhbHVlX2VudW1fZG91YmxlIC0gc2VtaSBlbnVtZXJhdGVkIGRvdWJsZSBtaXhlciBpbmZvIGNhbGxiYWNrCisgKiBAa2NvbnRyb2w6IG1peGVyIGNvbnRyb2wKKyAqIEB1aW5mbzogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCisgKgorICogQ2FsbGJhY2sgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCBhIGRvdWJsZSBzZW1pIGVudW1lcmF0ZWQKKyAqIG1peGVyIGNvbnRyb2wuCisgKgorICogU2VtaSBlbnVtZXJhdGVkIG1peGVyOiB0aGUgZW51bWVyYXRlZCBpdGVtcyBhcmUgcmVmZXJyZWQgYXMgdmFsdWVzLiBDYW4gYmUKKyAqIHVzZWQgZm9yIGhhbmRsaW5nIGJpdGZpZWxkIGNvZGVkIGVudW1lcmF0aW9uIGZvciBleGFtcGxlLgorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcy4KKyAqLworaW50IHNuZF9zb2NfaW5mb192YWx1ZV9lbnVtX2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXN0cnVjdCBzb2NfdmFsdWVfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX3ZhbHVlX2VudW0gKikKKwkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CisJdWluZm8tPmNvdW50ID0gZS0+c2hpZnRfbCA9PSBlLT5zaGlmdF9yID8gMSA6IDI7CisJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSBlLT5tYXg7CisKKwlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+IGUtPm1heCAtIDEpCisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSBlLT5tYXggLSAxOworCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLAorCQllLT50ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2luZm9fdmFsdWVfZW51bV9kb3VibGUpOworCisvKioKKyAqIHNuZF9zb2NfZ2V0X3ZhbHVlX2VudW1fZG91YmxlIC0gc2VtaSBlbnVtZXJhdGVkIGRvdWJsZSBtaXhlciBnZXQgY2FsbGJhY2sKKyAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbAorICogQHVjb250cm9sOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KKyAqCisgKiBDYWxsYmFjayB0byBnZXQgdGhlIHZhbHVlIG9mIGEgZG91YmxlIHNlbWkgZW51bWVyYXRlZCBtaXhlci4KKyAqCisgKiBTZW1pIGVudW1lcmF0ZWQgbWl4ZXI6IHRoZSBlbnVtZXJhdGVkIGl0ZW1zIGFyZSByZWZlcnJlZCBhcyB2YWx1ZXMuIENhbiBiZQorICogdXNlZCBmb3IgaGFuZGxpbmcgYml0ZmllbGQgY29kZWQgZW51bWVyYXRpb24gZm9yIGV4YW1wbGUuCisgKgorICogUmV0dXJucyAwIGZvciBzdWNjZXNzLgorICovCitpbnQgc25kX3NvY19nZXRfdmFsdWVfZW51bV9kb3VibGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzb2NfdmFsdWVfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX3ZhbHVlX2VudW0gKikKKwkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCXVuc2lnbmVkIHNob3J0IHJlZ192YWwsIHZhbCwgbXV4OworCisJcmVnX3ZhbCA9IHNuZF9zb2NfcmVhZChjb2RlYywgZS0+cmVnKTsKKwl2YWwgPSAocmVnX3ZhbCA+PiBlLT5zaGlmdF9sKSAmIGUtPm1hc2s7CisJZm9yIChtdXggPSAwOyBtdXggPCBlLT5tYXg7IG11eCsrKSB7CisJCWlmICh2YWwgPT0gZS0+dmFsdWVzW211eF0pCisJCQlicmVhazsKKwl9CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IG11eDsKKwlpZiAoZS0+c2hpZnRfbCAhPSBlLT5zaGlmdF9yKSB7CisJCXZhbCA9IChyZWdfdmFsID4+IGUtPnNoaWZ0X3IpICYgZS0+bWFzazsKKwkJZm9yIChtdXggPSAwOyBtdXggPCBlLT5tYXg7IG11eCsrKSB7CisJCQlpZiAodmFsID09IGUtPnZhbHVlc1ttdXhdKQorCQkJCWJyZWFrOworCQl9CisJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMV0gPSBtdXg7CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2dldF92YWx1ZV9lbnVtX2RvdWJsZSk7CisKKy8qKgorICogc25kX3NvY19wdXRfdmFsdWVfZW51bV9kb3VibGUgLSBzZW1pIGVudW1lcmF0ZWQgZG91YmxlIG1peGVyIHB1dCBjYWxsYmFjaworICogQGtjb250cm9sOiBtaXhlciBjb250cm9sCisgKiBAdWNvbnRyb2w6IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgorICoKKyAqIENhbGxiYWNrIHRvIHNldCB0aGUgdmFsdWUgb2YgYSBkb3VibGUgc2VtaSBlbnVtZXJhdGVkIG1peGVyLgorICoKKyAqIFNlbWkgZW51bWVyYXRlZCBtaXhlcjogdGhlIGVudW1lcmF0ZWQgaXRlbXMgYXJlIHJlZmVycmVkIGFzIHZhbHVlcy4gQ2FuIGJlCisgKiB1c2VkIGZvciBoYW5kbGluZyBiaXRmaWVsZCBjb2RlZCBlbnVtZXJhdGlvbiBmb3IgZXhhbXBsZS4KKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MuCisgKi8KK2ludCBzbmRfc29jX3B1dF92YWx1ZV9lbnVtX2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNvY192YWx1ZV9lbnVtICplID0gKHN0cnVjdCBzb2NfdmFsdWVfZW51bSAqKQorCQkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJdW5zaWduZWQgc2hvcnQgdmFsOworCXVuc2lnbmVkIHNob3J0IG1hc2s7CisKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA+IGUtPm1heCAtIDEpCisJCXJldHVybiAtRUlOVkFMOworCXZhbCA9IGUtPnZhbHVlc1t1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdXSA8PCBlLT5zaGlmdF9sOworCW1hc2sgPSBlLT5tYXNrIDw8IGUtPnNoaWZ0X2w7CisJaWYgKGUtPnNoaWZ0X2wgIT0gZS0+c2hpZnRfcikgeworCQlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA+IGUtPm1heCAtIDEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJdmFsIHw9IGUtPnZhbHVlc1t1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdXSA8PCBlLT5zaGlmdF9yOworCQltYXNrIHw9IGUtPm1hc2sgPDwgZS0+c2hpZnRfcjsKKwl9CisKKwlyZXR1cm4gc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgZS0+cmVnLCBtYXNrLCB2YWwpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19wdXRfdmFsdWVfZW51bV9kb3VibGUpOworCisvKioKICAqIHNuZF9zb2NfaW5mb19lbnVtX2V4dCAtIGV4dGVybmFsIGVudW1lcmF0ZWQgc2luZ2xlIG1peGVyIGluZm8gY2FsbGJhY2sKICAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbAogICogQHVpbmZvOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KQEAgLTE2NjgsNyArMTc3Nyw3IEBACiAvKioKICAqIHNuZF9zb2NfZ2V0X3ZvbHN3IC0gc2luZ2xlIG1peGVyIGdldCBjYWxsYmFjawogICogQGtjb250cm9sOiBtaXhlciBjb250cm9sCi0gKiBAdWluZm86IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgorICogQHVjb250cm9sOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KICAqCiAgKiBDYWxsYmFjayB0byBnZXQgdGhlIHZhbHVlIG9mIGEgc2luZ2xlIG1peGVyIGNvbnRyb2wuCiAgKgpAQCAtMTcwNyw3ICsxODE2LDcgQEAKIC8qKgogICogc25kX3NvY19wdXRfdm9sc3cgLSBzaW5nbGUgbWl4ZXIgcHV0IGNhbGxiYWNrCiAgKiBAa2NvbnRyb2w6IG1peGVyIGNvbnRyb2wKLSAqIEB1aW5mbzogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCisgKiBAdWNvbnRyb2w6IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgogICoKICAqIENhbGxiYWNrIHRvIHNldCB0aGUgdmFsdWUgb2YgYSBzaW5nbGUgbWl4ZXIgY29udHJvbC4KICAqCkBAIC0xNzc1LDcgKzE4ODQsNyBAQAogLyoqCiAgKiBzbmRfc29jX2dldF92b2xzd18yciAtIGRvdWJsZSBtaXhlciBnZXQgY2FsbGJhY2sKICAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbAotICogQHVpbmZvOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KKyAqIEB1Y29udHJvbDogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCiAgKgogICogQ2FsbGJhY2sgdG8gZ2V0IHRoZSB2YWx1ZSBvZiBhIGRvdWJsZSBtaXhlciBjb250cm9sIHRoYXQgc3BhbnMgMiByZWdpc3RlcnMuCiAgKgpAQCAtMTgxMiw3ICsxOTIxLDcgQEAKIC8qKgogICogc25kX3NvY19wdXRfdm9sc3dfMnIgLSBkb3VibGUgbWl4ZXIgc2V0IGNhbGxiYWNrCiAgKiBAa2NvbnRyb2w6IG1peGVyIGNvbnRyb2wKLSAqIEB1aW5mbzogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCisgKiBAdWNvbnRyb2w6IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgogICoKICAqIENhbGxiYWNrIHRvIHNldCB0aGUgdmFsdWUgb2YgYSBkb3VibGUgbWl4ZXIgY29udHJvbCB0aGF0IHNwYW5zIDIgcmVnaXN0ZXJzLgogICoKQEAgLTE4ODIsNyArMTk5MSw3IEBACiAvKioKICAqIHNuZF9zb2NfZ2V0X3ZvbHN3X3M4IC0gc2lnbmVkIG1peGVyIGdldCBjYWxsYmFjawogICogQGtjb250cm9sOiBtaXhlciBjb250cm9sCi0gKiBAdWluZm86IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgorICogQHVjb250cm9sOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KICAqCiAgKiBDYWxsYmFjayB0byBnZXQgdGhlIHZhbHVlIG9mIGEgc2lnbmVkIG1peGVyIGNvbnRyb2wuCiAgKgpAQCAtMTkwOSw3ICsyMDE4LDcgQEAKIC8qKgogICogc25kX3NvY19wdXRfdm9sc3dfc2duIC0gc2lnbmVkIG1peGVyIHB1dCBjYWxsYmFjawogICogQGtjb250cm9sOiBtaXhlciBjb250cm9sCi0gKiBAdWluZm86IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgorICogQHVjb250cm9sOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KICAqCiAgKiBDYWxsYmFjayB0byBzZXQgdGhlIHZhbHVlIG9mIGEgc2lnbmVkIG1peGVyIGNvbnRyb2wuCiAgKgpAQCAtMTk1NCw3ICsyMDYzLDcgQEAKIC8qKgogICogc25kX3NvY19kYWlfc2V0X2Nsa2RpdiAtIGNvbmZpZ3VyZSBEQUkgY2xvY2sgZGl2aWRlcnMuCiAgKiBAZGFpOiBEQUkKLSAqIEBjbGtfaWQ6IERBSSBzcGVjaWZpYyBjbG9jayBkaXZpZGVyIElECisgKiBAZGl2X2lkOiBEQUkgc3BlY2lmaWMgY2xvY2sgZGl2aWRlciBJRAogICogQGRpdjogbmV3IGNsb2NrIGRpdmlzb3IuCiAgKgogICogQ29uZmlndXJlcyB0aGUgY2xvY2sgZGl2aWRlcnMuIFRoaXMgaXMgdXNlZCB0byBkZXJpdmUgdGhlIGJlc3QgREFJIGJpdCBhbmQKQEAgLTIwNjAsNyArMjE2OSw3IEBACiAvKioKICAqIHNuZF9zb2NfcmVnaXN0ZXJfY2FyZCAtIFJlZ2lzdGVyIGEgY2FyZCB3aXRoIHRoZSBBU29DIGNvcmUKICAqCi0gKiBAcGFyYW0gY2FyZCBDYXJkIHRvIHJlZ2lzdGVyCisgKiBAY2FyZDogQ2FyZCB0byByZWdpc3RlcgogICoKICAqIE5vdGUgdGhhdCBjdXJyZW50bHkgdGhpcyBpcyBhbiBpbnRlcm5hbCBvbmx5IGZ1bmN0aW9uOiBpdCB3aWxsIGJlCiAgKiBleHBvc2VkIHRvIG1hY2hpbmUgZHJpdmVycyBhZnRlciBmdXJ0aGVyIGJhY2twb3J0aW5nIG9mIEFTb0MgdjIKQEAgLTIwODcsNyArMjE5Niw3IEBACiAvKioKICAqIHNuZF9zb2NfdW5yZWdpc3Rlcl9jYXJkIC0gVW5yZWdpc3RlciBhIGNhcmQgd2l0aCB0aGUgQVNvQyBjb3JlCiAgKgotICogQHBhcmFtIGNhcmQgQ2FyZCB0byB1bnJlZ2lzdGVyCisgKiBAY2FyZDogQ2FyZCB0byB1bnJlZ2lzdGVyCiAgKgogICogTm90ZSB0aGF0IGN1cnJlbnRseSB0aGlzIGlzIGFuIGludGVybmFsIG9ubHkgZnVuY3Rpb246IGl0IHdpbGwgYmUKICAqIGV4cG9zZWQgdG8gbWFjaGluZSBkcml2ZXJzIGFmdGVyIGZ1cnRoZXIgYmFja3BvcnRpbmcgb2YgQVNvQyB2MgpAQCAtMjEwNyw3ICsyMjE2LDcgQEAKIC8qKgogICogc25kX3NvY19yZWdpc3Rlcl9kYWkgLSBSZWdpc3RlciBhIERBSSB3aXRoIHRoZSBBU29DIGNvcmUKICAqCi0gKiBAcGFyYW0gZGFpIERBSSB0byByZWdpc3RlcgorICogQGRhaTogREFJIHRvIHJlZ2lzdGVyCiAgKi8KIGludCBzbmRfc29jX3JlZ2lzdGVyX2RhaShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKIHsKQEAgLTIxMzQsNyArMjI0Myw3IEBACiAvKioKICAqIHNuZF9zb2NfdW5yZWdpc3Rlcl9kYWkgLSBVbnJlZ2lzdGVyIGEgREFJIGZyb20gdGhlIEFTb0MgY29yZQogICoKLSAqIEBwYXJhbSBkYWkgREFJIHRvIHVucmVnaXN0ZXIKKyAqIEBkYWk6IERBSSB0byB1bnJlZ2lzdGVyCiAgKi8KIHZvaWQgc25kX3NvY191bnJlZ2lzdGVyX2RhaShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKIHsKQEAgLTIxNDksOCArMjI1OCw4IEBACiAvKioKICAqIHNuZF9zb2NfcmVnaXN0ZXJfZGFpcyAtIFJlZ2lzdGVyIG11bHRpcGxlIERBSXMgd2l0aCB0aGUgQVNvQyBjb3JlCiAgKgotICogQHBhcmFtIGRhaSBBcnJheSBvZiBEQUlzIHRvIHJlZ2lzdGVyCi0gKiBAcGFyYW0gY291bnQgTnVtYmVyIG9mIERBSXMKKyAqIEBkYWk6IEFycmF5IG9mIERBSXMgdG8gcmVnaXN0ZXIKKyAqIEBjb3VudDogTnVtYmVyIG9mIERBSXMKICAqLwogaW50IHNuZF9zb2NfcmVnaXN0ZXJfZGFpcyhzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgc2l6ZV90IGNvdW50KQogewpAQCAtMjE3NSw4ICsyMjg0LDggQEAKIC8qKgogICogc25kX3NvY191bnJlZ2lzdGVyX2RhaXMgLSBVbnJlZ2lzdGVyIG11bHRpcGxlIERBSXMgZnJvbSB0aGUgQVNvQyBjb3JlCiAgKgotICogQHBhcmFtIGRhaSBBcnJheSBvZiBEQUlzIHRvIHVucmVnaXN0ZXIKLSAqIEBwYXJhbSBjb3VudCBOdW1iZXIgb2YgREFJcworICogQGRhaTogQXJyYXkgb2YgREFJcyB0byB1bnJlZ2lzdGVyCisgKiBAY291bnQ6IE51bWJlciBvZiBEQUlzCiAgKi8KIHZvaWQgc25kX3NvY191bnJlZ2lzdGVyX2RhaXMoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksIHNpemVfdCBjb3VudCkKIHsKQEAgLTIxOTAsNyArMjI5OSw3IEBACiAvKioKICAqIHNuZF9zb2NfcmVnaXN0ZXJfcGxhdGZvcm0gLSBSZWdpc3RlciBhIHBsYXRmb3JtIHdpdGggdGhlIEFTb0MgY29yZQogICoKLSAqIEBwYXJhbSBwbGF0Zm9ybSBwbGF0Zm9ybSB0byByZWdpc3RlcgorICogQHBsYXRmb3JtOiBwbGF0Zm9ybSB0byByZWdpc3RlcgogICovCiBpbnQgc25kX3NvY19yZWdpc3Rlcl9wbGF0Zm9ybShzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0pCiB7CkBAIC0yMjEzLDcgKzIzMjIsNyBAQAogLyoqCiAgKiBzbmRfc29jX3VucmVnaXN0ZXJfcGxhdGZvcm0gLSBVbnJlZ2lzdGVyIGEgcGxhdGZvcm0gZnJvbSB0aGUgQVNvQyBjb3JlCiAgKgotICogQHBhcmFtIHBsYXRmb3JtIHBsYXRmb3JtIHRvIHVucmVnaXN0ZXIKKyAqIEBwbGF0Zm9ybTogcGxhdGZvcm0gdG8gdW5yZWdpc3RlcgogICovCiB2b2lkIHNuZF9zb2NfdW5yZWdpc3Rlcl9wbGF0Zm9ybShzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0pCiB7CkBAIC0yMjI4LDcgKzIzMzcsNyBAQAogLyoqCiAgKiBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjIC0gUmVnaXN0ZXIgYSBjb2RlYyB3aXRoIHRoZSBBU29DIGNvcmUKICAqCi0gKiBAcGFyYW0gY29kZWMgY29kZWMgdG8gcmVnaXN0ZXIKKyAqIEBjb2RlYzogY29kZWMgdG8gcmVnaXN0ZXIKICAqLwogaW50IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewpAQCAtMjI1NSw3ICsyMzY0LDcgQEAKIC8qKgogICogc25kX3NvY191bnJlZ2lzdGVyX2NvZGVjIC0gVW5yZWdpc3RlciBhIGNvZGVjIGZyb20gdGhlIEFTb0MgY29yZQogICoKLSAqIEBwYXJhbSBjb2RlYyBjb2RlYyB0byB1bnJlZ2lzdGVyCisgKiBAY29kZWM6IGNvZGVjIHRvIHVucmVnaXN0ZXIKICAqLwogdm9pZCBzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NvYy1kYXBtLmMgYi9zb3VuZC9zb2Mvc29jLWRhcG0uYwppbmRleCA4ODYzZWRkLi5hZDBkODAxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc29jLWRhcG0uYworKysgYi9zb3VuZC9zb2Mvc29jLWRhcG0uYwpAQCAtNTMsMTMgKzUzLDE1IEBACiAvKiBkYXBtIHBvd2VyIHNlcXVlbmNlcyAtIG1ha2UgdGhpcyBwZXIgY29kZWMgaW4gdGhlIGZ1dHVyZSAqLwogc3RhdGljIGludCBkYXBtX3VwX3NlcVtdID0gewogCXNuZF9zb2NfZGFwbV9wcmUsIHNuZF9zb2NfZGFwbV9taWNiaWFzLCBzbmRfc29jX2RhcG1fbWljLAotCXNuZF9zb2NfZGFwbV9tdXgsIHNuZF9zb2NfZGFwbV9kYWMsIHNuZF9zb2NfZGFwbV9taXhlciwgc25kX3NvY19kYXBtX3BnYSwKLQlzbmRfc29jX2RhcG1fYWRjLCBzbmRfc29jX2RhcG1faHAsIHNuZF9zb2NfZGFwbV9zcGssIHNuZF9zb2NfZGFwbV9wb3N0CisJc25kX3NvY19kYXBtX211eCwgc25kX3NvY19kYXBtX3ZhbHVlX211eCwgc25kX3NvY19kYXBtX2RhYywKKwlzbmRfc29jX2RhcG1fbWl4ZXIsIHNuZF9zb2NfZGFwbV9wZ2EsIHNuZF9zb2NfZGFwbV9hZGMsIHNuZF9zb2NfZGFwbV9ocCwKKwlzbmRfc29jX2RhcG1fc3BrLCBzbmRfc29jX2RhcG1fcG9zdAogfTsKIHN0YXRpYyBpbnQgZGFwbV9kb3duX3NlcVtdID0gewogCXNuZF9zb2NfZGFwbV9wcmUsIHNuZF9zb2NfZGFwbV9hZGMsIHNuZF9zb2NfZGFwbV9ocCwgc25kX3NvY19kYXBtX3NwaywKIAlzbmRfc29jX2RhcG1fcGdhLCBzbmRfc29jX2RhcG1fbWl4ZXIsIHNuZF9zb2NfZGFwbV9kYWMsIHNuZF9zb2NfZGFwbV9taWMsCi0Jc25kX3NvY19kYXBtX21pY2JpYXMsIHNuZF9zb2NfZGFwbV9tdXgsIHNuZF9zb2NfZGFwbV9wb3N0CisJc25kX3NvY19kYXBtX21pY2JpYXMsIHNuZF9zb2NfZGFwbV9tdXgsIHNuZF9zb2NfZGFwbV92YWx1ZV9tdXgsCisJc25kX3NvY19kYXBtX3Bvc3QKIH07CiAKIHN0YXRpYyBpbnQgZGFwbV9zdGF0dXMgPSAxOwpAQCAtMTM0LDYgKzEzNiwyNSBAQAogCQl9CiAJfQogCWJyZWFrOworCWNhc2Ugc25kX3NvY19kYXBtX3ZhbHVlX211eDogeworCQlzdHJ1Y3Qgc29jX3ZhbHVlX2VudW0gKmUgPSAoc3RydWN0IHNvY192YWx1ZV9lbnVtICopCisJCQl3LT5rY29udHJvbHNbaV0ucHJpdmF0ZV92YWx1ZTsKKwkJaW50IHZhbCwgaXRlbTsKKworCQl2YWwgPSBzbmRfc29jX3JlYWQody0+Y29kZWMsIGUtPnJlZyk7CisJCXZhbCA9ICh2YWwgPj4gZS0+c2hpZnRfbCkgJiBlLT5tYXNrOworCQlmb3IgKGl0ZW0gPSAwOyBpdGVtIDwgZS0+bWF4OyBpdGVtKyspIHsKKwkJCWlmICh2YWwgPT0gZS0+dmFsdWVzW2l0ZW1dKQorCQkJCWJyZWFrOworCQl9CisKKwkJcC0+Y29ubmVjdCA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBlLT5tYXg7IGkrKykgeworCQkJaWYgKCEoc3RyY21wKHAtPm5hbWUsIGUtPnRleHRzW2ldKSkgJiYgaXRlbSA9PSBpKQorCQkJCXAtPmNvbm5lY3QgPSAxOworCQl9CisJfQorCWJyZWFrOwogCS8qIGRvZXMgbm90IGVmZmVjdCByb3V0aW5nIC0gYWx3YXlzIGNvbm5lY3RlZCAqLwogCWNhc2Ugc25kX3NvY19kYXBtX3BnYToKIAljYXNlIHNuZF9zb2NfZGFwbV9vdXRwdXQ6CkBAIC0xNzksNiArMjAwLDMwIEBACiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKKy8qIGNvbm5lY3QgdmFsdWVfbXV4IHdpZGdldCB0byBpdCdzIGludGVyY29ubmVjdGluZyBhdWRpbyBwYXRocyAqLworc3RhdGljIGludCBkYXBtX2Nvbm5lY3RfdmFsdWVfbXV4KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqc3JjLCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqZGVzdCwKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3BhdGggKnBhdGgsIGNvbnN0IGNoYXIgKmNvbnRyb2xfbmFtZSwKKwljb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqa2NvbnRyb2wpCit7CisJc3RydWN0IHNvY192YWx1ZV9lbnVtICplID0gKHN0cnVjdCBzb2NfdmFsdWVfZW51bSAqKQorCQkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZS0+bWF4OyBpKyspIHsKKwkJaWYgKCEoc3RyY21wKGNvbnRyb2xfbmFtZSwgZS0+dGV4dHNbaV0pKSkgeworCQkJbGlzdF9hZGQoJnBhdGgtPmxpc3QsICZjb2RlYy0+ZGFwbV9wYXRocyk7CisJCQlsaXN0X2FkZCgmcGF0aC0+bGlzdF9zaW5rLCAmZGVzdC0+c291cmNlcyk7CisJCQlsaXN0X2FkZCgmcGF0aC0+bGlzdF9zb3VyY2UsICZzcmMtPnNpbmtzKTsKKwkJCXBhdGgtPm5hbWUgPSAoY2hhciAqKWUtPnRleHRzW2ldOworCQkJZGFwbV9zZXRfcGF0aF9zdGF0dXMoZGVzdCwgcGF0aCwgMCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAtRU5PREVWOworfQorCiAvKiBjb25uZWN0IG1peGVyIHdpZGdldCB0byBpdCdzIGludGVyY29ubmVjdGluZyBhdWRpbyBwYXRocyAqLwogc3RhdGljIGludCBkYXBtX2Nvbm5lY3RfbWl4ZXIoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAogCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpzcmMsIHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpkZXN0LApAQCAtNjUzLDYgKzY5OCw3IEBACiAJCWNhc2Ugc25kX3NvY19kYXBtX3ZtaWQ6CiAJCQljb250aW51ZTsKIAkJY2FzZSBzbmRfc29jX2RhcG1fbXV4OgorCQljYXNlIHNuZF9zb2NfZGFwbV92YWx1ZV9tdXg6CiAJCWNhc2Ugc25kX3NvY19kYXBtX291dHB1dDoKIAkJY2FzZSBzbmRfc29jX2RhcG1faW5wdXQ6CiAJCWNhc2Ugc25kX3NvY19kYXBtX3N3aXRjaDoKQEAgLTcyOCw2ICs3NzQsNDUgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyogdGVzdCBhbmQgdXBkYXRlIHRoZSBwb3dlciBzdGF0dXMgb2YgYSB2YWx1ZV9tdXggd2lkZ2V0ICovCitzdGF0aWMgaW50IGRhcG1fdmFsdWVfbXV4X3VwZGF0ZV9wb3dlcihzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0LAorCQkJCSBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IG1hc2ssCisJCQkJIGludCBtdXgsIGludCB2YWwsIHN0cnVjdCBzb2NfdmFsdWVfZW51bSAqZSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3BhdGggKnBhdGg7CisJaW50IGZvdW5kID0gMDsKKworCWlmICh3aWRnZXQtPmlkICE9IHNuZF9zb2NfZGFwbV92YWx1ZV9tdXgpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKCFzbmRfc29jX3Rlc3RfYml0cyh3aWRnZXQtPmNvZGVjLCBlLT5yZWcsIG1hc2ssIHZhbCkpCisJCXJldHVybiAwOworCisJLyogZmluZCBkYXBtIHdpZGdldCBwYXRoIGFzc29jIHdpdGgga2NvbnRyb2wgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBhdGgsICZ3aWRnZXQtPmNvZGVjLT5kYXBtX3BhdGhzLCBsaXN0KSB7CisJCWlmIChwYXRoLT5rY29udHJvbCAhPSBrY29udHJvbCkKKwkJCWNvbnRpbnVlOworCisJCWlmICghcGF0aC0+bmFtZSB8fCAhZS0+dGV4dHNbbXV4XSkKKwkJCWNvbnRpbnVlOworCisJCWZvdW5kID0gMTsKKwkJLyogd2Ugbm93IG5lZWQgdG8gbWF0Y2ggdGhlIHN0cmluZyBpbiB0aGUgZW51bSB0byB0aGUgcGF0aCAqLworCQlpZiAoIShzdHJjbXAocGF0aC0+bmFtZSwgZS0+dGV4dHNbbXV4XSkpKQorCQkJcGF0aC0+Y29ubmVjdCA9IDE7IC8qIG5ldyBjb25uZWN0aW9uICovCisJCWVsc2UKKwkJCXBhdGgtPmNvbm5lY3QgPSAwOyAvKiBvbGQgY29ubmVjdGlvbiBtdXN0IGJlCisJCQkJCSAgICAgIHBvd2VyZWQgZG93biAqLworCX0KKworCWlmIChmb3VuZCkgeworCQlkYXBtX3Bvd2VyX3dpZGdldHMod2lkZ2V0LT5jb2RlYywgU05EX1NPQ19EQVBNX1NUUkVBTV9OT1ApOworCQlkdW1wX2RhcG0od2lkZ2V0LT5jb2RlYywgIm11eCBwb3dlciB1cGRhdGUiKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogLyogdGVzdCBhbmQgdXBkYXRlIHRoZSBwb3dlciBzdGF0dXMgb2YgYSBtaXhlciBvciBzd2l0Y2ggd2lkZ2V0ICovCiBzdGF0aWMgaW50IGRhcG1fbWl4ZXJfdXBkYXRlX3Bvd2VyKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQsCiAJCQkJICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCByZWcsCkBAIC05NjUsNiArMTA1MCwxMiBAQAogCQlpZiAocmV0ICE9IDApCiAJCQlnb3RvIGVycjsKIAkJYnJlYWs7CisJY2FzZSBzbmRfc29jX2RhcG1fdmFsdWVfbXV4OgorCQlyZXQgPSBkYXBtX2Nvbm5lY3RfdmFsdWVfbXV4KGNvZGVjLCB3c291cmNlLCB3c2luaywgcGF0aCwKKwkJCWNvbnRyb2wsICZ3c2luay0+a2NvbnRyb2xzWzBdKTsKKwkJaWYgKHJldCAhPSAwKQorCQkJZ290byBlcnI7CisJCWJyZWFrOwogCWNhc2Ugc25kX3NvY19kYXBtX3N3aXRjaDoKIAljYXNlIHNuZF9zb2NfZGFwbV9taXhlcjoKIAkJcmV0ID0gZGFwbV9jb25uZWN0X21peGVyKGNvZGVjLCB3c291cmNlLCB3c2luaywgcGF0aCwgY29udHJvbCk7CkBAIC0xMDQ3LDYgKzExMzgsNyBAQAogCQkJZGFwbV9uZXdfbWl4ZXIoY29kZWMsIHcpOwogCQkJYnJlYWs7CiAJCWNhc2Ugc25kX3NvY19kYXBtX211eDoKKwkJY2FzZSBzbmRfc29jX2RhcG1fdmFsdWVfbXV4OgogCQkJZGFwbV9uZXdfbXV4KGNvZGVjLCB3KTsKIAkJCWJyZWFrOwogCQljYXNlIHNuZF9zb2NfZGFwbV9hZGM6CkBAIC0xMDc3LDcgKzExNjksNyBAQAogLyoqCiAgKiBzbmRfc29jX2RhcG1fZ2V0X3ZvbHN3IC0gZGFwbSBtaXhlciBnZXQgY2FsbGJhY2sKICAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbAotICogQHVpbmZvOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KKyAqIEB1Y29udHJvbDogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCiAgKgogICogQ2FsbGJhY2sgdG8gZ2V0IHRoZSB2YWx1ZSBvZiBhIGRhcG0gbWl4ZXIgY29udHJvbC4KICAqCkBAIC0xMTIyLDcgKzEyMTQsNyBAQAogLyoqCiAgKiBzbmRfc29jX2RhcG1fcHV0X3ZvbHN3IC0gZGFwbSBtaXhlciBzZXQgY2FsbGJhY2sKICAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbAotICogQHVpbmZvOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KKyAqIEB1Y29udHJvbDogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCiAgKgogICogQ2FsbGJhY2sgdG8gc2V0IHRoZSB2YWx1ZSBvZiBhIGRhcG0gbWl4ZXIgY29udHJvbC4KICAqCkBAIC0xMTkzLDcgKzEyODUsNyBAQAogLyoqCiAgKiBzbmRfc29jX2RhcG1fZ2V0X2VudW1fZG91YmxlIC0gZGFwbSBlbnVtZXJhdGVkIGRvdWJsZSBtaXhlciBnZXQgY2FsbGJhY2sKICAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbAotICogQHVpbmZvOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KKyAqIEB1Y29udHJvbDogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCiAgKgogICogQ2FsbGJhY2sgdG8gZ2V0IHRoZSB2YWx1ZSBvZiBhIGRhcG0gZW51bWVyYXRlZCBkb3VibGUgbWl4ZXIgY29udHJvbC4KICAqCkBAIC0xMjIxLDcgKzEzMTMsNyBAQAogLyoqCiAgKiBzbmRfc29jX2RhcG1fcHV0X2VudW1fZG91YmxlIC0gZGFwbSBlbnVtZXJhdGVkIGRvdWJsZSBtaXhlciBzZXQgY2FsbGJhY2sKICAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbAotICogQHVpbmZvOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KKyAqIEB1Y29udHJvbDogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCiAgKgogICogQ2FsbGJhY2sgdG8gc2V0IHRoZSB2YWx1ZSBvZiBhIGRhcG0gZW51bWVyYXRlZCBkb3VibGUgbWl4ZXIgY29udHJvbC4KICAqCkBAIC0xMjc0LDYgKzEzNjYsMTA1IEBACiBFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2RhcG1fcHV0X2VudW1fZG91YmxlKTsKIAogLyoqCisgKiBzbmRfc29jX2RhcG1fZ2V0X3ZhbHVlX2VudW1fZG91YmxlIC0gZGFwbSBzZW1pIGVudW1lcmF0ZWQgZG91YmxlIG1peGVyIGdldAorICoJCQkJCWNhbGxiYWNrCisgKiBAa2NvbnRyb2w6IG1peGVyIGNvbnRyb2wKKyAqIEB1Y29udHJvbDogY29udHJvbCBlbGVtZW50IGluZm9ybWF0aW9uCisgKgorICogQ2FsbGJhY2sgdG8gZ2V0IHRoZSB2YWx1ZSBvZiBhIGRhcG0gc2VtaSBlbnVtZXJhdGVkIGRvdWJsZSBtaXhlciBjb250cm9sLgorICoKKyAqIFNlbWkgZW51bWVyYXRlZCBtaXhlcjogdGhlIGVudW1lcmF0ZWQgaXRlbXMgYXJlIHJlZmVycmVkIGFzIHZhbHVlcy4gQ2FuIGJlCisgKiB1c2VkIGZvciBoYW5kbGluZyBiaXRmaWVsZCBjb2RlZCBlbnVtZXJhdGlvbiBmb3IgZXhhbXBsZS4KKyAqCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MuCisgKi8KK2ludCBzbmRfc29jX2RhcG1fZ2V0X3ZhbHVlX2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNvY192YWx1ZV9lbnVtICplID0gKHN0cnVjdCBzb2NfdmFsdWVfZW51bSAqKQorCQkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJdW5zaWduZWQgc2hvcnQgcmVnX3ZhbCwgdmFsLCBtdXg7CisKKwlyZWdfdmFsID0gc25kX3NvY19yZWFkKHdpZGdldC0+Y29kZWMsIGUtPnJlZyk7CisJdmFsID0gKHJlZ192YWwgPj4gZS0+c2hpZnRfbCkgJiBlLT5tYXNrOworCWZvciAobXV4ID0gMDsgbXV4IDwgZS0+bWF4OyBtdXgrKykgeworCQlpZiAodmFsID09IGUtPnZhbHVlc1ttdXhdKQorCQkJYnJlYWs7CisJfQorCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBtdXg7CisJaWYgKGUtPnNoaWZ0X2wgIT0gZS0+c2hpZnRfcikgeworCQl2YWwgPSAocmVnX3ZhbCA+PiBlLT5zaGlmdF9yKSAmIGUtPm1hc2s7CisJCWZvciAobXV4ID0gMDsgbXV4IDwgZS0+bWF4OyBtdXgrKykgeworCQkJaWYgKHZhbCA9PSBlLT52YWx1ZXNbbXV4XSkKKwkJCQlicmVhazsKKwkJfQorCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdID0gbXV4OworCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19kYXBtX2dldF92YWx1ZV9lbnVtX2RvdWJsZSk7CisKKy8qKgorICogc25kX3NvY19kYXBtX3B1dF92YWx1ZV9lbnVtX2RvdWJsZSAtIGRhcG0gc2VtaSBlbnVtZXJhdGVkIGRvdWJsZSBtaXhlciBzZXQKKyAqCQkJCQljYWxsYmFjaworICogQGtjb250cm9sOiBtaXhlciBjb250cm9sCisgKiBAdWNvbnRyb2w6IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgorICoKKyAqIENhbGxiYWNrIHRvIHNldCB0aGUgdmFsdWUgb2YgYSBkYXBtIHNlbWkgZW51bWVyYXRlZCBkb3VibGUgbWl4ZXIgY29udHJvbC4KKyAqCisgKiBTZW1pIGVudW1lcmF0ZWQgbWl4ZXI6IHRoZSBlbnVtZXJhdGVkIGl0ZW1zIGFyZSByZWZlcnJlZCBhcyB2YWx1ZXMuIENhbiBiZQorICogdXNlZCBmb3IgaGFuZGxpbmcgYml0ZmllbGQgY29kZWQgZW51bWVyYXRpb24gZm9yIGV4YW1wbGUuCisgKgorICogUmV0dXJucyAwIGZvciBzdWNjZXNzLgorICovCitpbnQgc25kX3NvY19kYXBtX3B1dF92YWx1ZV9lbnVtX2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzb2NfdmFsdWVfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX3ZhbHVlX2VudW0gKikKKwkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCXVuc2lnbmVkIHNob3J0IHZhbCwgbXV4OworCXVuc2lnbmVkIHNob3J0IG1hc2s7CisJaW50IHJldCA9IDA7CisKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA+IGUtPm1heCAtIDEpCisJCXJldHVybiAtRUlOVkFMOworCW11eCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07CisJdmFsID0gZS0+dmFsdWVzW3Vjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF1dIDw8IGUtPnNoaWZ0X2w7CisJbWFzayA9IGUtPm1hc2sgPDwgZS0+c2hpZnRfbDsKKwlpZiAoZS0+c2hpZnRfbCAhPSBlLT5zaGlmdF9yKSB7CisJCWlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdID4gZS0+bWF4IC0gMSkKKwkJCXJldHVybiAtRUlOVkFMOworCQl2YWwgfD0gZS0+dmFsdWVzW3Vjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMV1dIDw8IGUtPnNoaWZ0X3I7CisJCW1hc2sgfD0gZS0+bWFzayA8PCBlLT5zaGlmdF9yOworCX0KKworCW11dGV4X2xvY2soJndpZGdldC0+Y29kZWMtPm11dGV4KTsKKwl3aWRnZXQtPnZhbHVlID0gdmFsOworCWRhcG1fdmFsdWVfbXV4X3VwZGF0ZV9wb3dlcih3aWRnZXQsIGtjb250cm9sLCBtYXNrLCBtdXgsIHZhbCwgZSk7CisJaWYgKHdpZGdldC0+ZXZlbnQpIHsKKwkJaWYgKHdpZGdldC0+ZXZlbnRfZmxhZ3MgJiBTTkRfU09DX0RBUE1fUFJFX1JFRykgeworCQkJcmV0ID0gd2lkZ2V0LT5ldmVudCh3aWRnZXQsCisJCQkJa2NvbnRyb2wsIFNORF9TT0NfREFQTV9QUkVfUkVHKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWdvdG8gb3V0OworCQl9CisJCXJldCA9IHNuZF9zb2NfdXBkYXRlX2JpdHMod2lkZ2V0LT5jb2RlYywgZS0+cmVnLCBtYXNrLCB2YWwpOworCQlpZiAod2lkZ2V0LT5ldmVudF9mbGFncyAmIFNORF9TT0NfREFQTV9QT1NUX1JFRykKKwkJCXJldCA9IHdpZGdldC0+ZXZlbnQod2lkZ2V0LAorCQkJCWtjb250cm9sLCBTTkRfU09DX0RBUE1fUE9TVF9SRUcpOworCX0gZWxzZQorCQlyZXQgPSBzbmRfc29jX3VwZGF0ZV9iaXRzKHdpZGdldC0+Y29kZWMsIGUtPnJlZywgbWFzaywgdmFsKTsKKworb3V0OgorCW11dGV4X3VubG9jaygmd2lkZ2V0LT5jb2RlYy0+bXV0ZXgpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2RhcG1fcHV0X3ZhbHVlX2VudW1fZG91YmxlKTsKKworLyoqCiAgKiBzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2wgLSBjcmVhdGUgbmV3IGRhcG0gY29udHJvbAogICogQGNvZGVjOiBhdWRpbyBjb2RlYwogICogQHdpZGdldDogd2lkZ2V0IHRlbXBsYXRlCkBAIC0xNDE5LDcgKzE2MTAsNyBAQAogCiAvKioKICAqIHNuZF9zb2NfZGFwbV9lbmFibGVfcGluIC0gZW5hYmxlIHBpbi4KLSAqIEBzbmRfc29jX2NvZGVjOiBTb0MgY29kZWMKKyAqIEBjb2RlYzogU29DIGNvZGVjCiAgKiBAcGluOiBwaW4gbmFtZQogICoKICAqIEVuYWJsZXMgaW5wdXQvb3V0cHV0IHBpbiBhbmQgaXQncyBwYXJlbnRzIG9yIGNoaWxkcmVuIHdpZGdldHMgaWZmIHRoZXJlIGlzCmRpZmYgLS1naXQgYS9zb3VuZC9zcGFyYy9jczQyMzEuYyBiL3NvdW5kL3NwYXJjL2NzNDIzMS5jCmluZGV4IGQ0NGJmOTguLjQxYzM4NzUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NwYXJjL2NzNDIzMS5jCisrKyBiL3NvdW5kL3NwYXJjL2NzNDIzMS5jCkBAIC0yMDU3LDcgKzIwNTcsNyBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlzcHJpbnRmKGNhcmQtPmxvbmduYW1lLCAiJXMgYXQgMHglbHgsIGlycSAlZCIsCisJc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIiVzIGF0IDB4JWxseCwgaXJxICVkIiwKIAkJY2FyZC0+c2hvcnRuYW1lLAogCQlvcC0+cmVzb3VyY2VbMF0uc3RhcnQsCiAJCW9wLT5pcnFzWzBdKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9jYWlhcS9jYWlhcS1kZXZpY2UuYyBiL3NvdW5kL3VzYi9jYWlhcS9jYWlhcS1kZXZpY2UuYwppbmRleCBiMTQzZWY3Li5hNjI1MDBlIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvY2FpYXEvY2FpYXEtZGV2aWNlLmMKKysrIGIvc291bmQvdXNiL2NhaWFxL2NhaWFxLWRldmljZS5jCkBAIC00NDYsNyArNDQ2LDcgQEAKIAlpZiAoIWNhcmQpCiAJCXJldHVybiAtRU5PTUVNOwogCQkJCi0JZGV2X3NldF9kcnZkYXRhKCZpbnRmLT5kZXYsIGNhcmQpOworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgY2FyZCk7CiAJcmV0ID0gaW5pdF9jYXJkKGNhaWFxZGV2KGNhcmQpKTsKIAlpZiAocmV0IDwgMCkgewogCQlsb2coInVuYWJsZSB0byBpbml0IGNhcmQhIChyZXQ9JWQpXG4iLCByZXQpOwpAQCAtNDYwLDcgKzQ2MCw3IEBACiBzdGF0aWMgdm9pZCBzbmRfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKIAlzdHJ1Y3Qgc25kX3VzYl9jYWlhcWRldiAqZGV2OwotCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGRldl9nZXRfZHJ2ZGF0YSgmaW50Zi0+ZGV2KTsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwogCiAJZGVidWcoIiVzKCVwKVxuIiwgX19mdW5jX18sIGludGYpOwogCmRpZmYgLS1naXQgYS9zb3VuZC91c2IvdXNiYXVkaW8uYyBiL3NvdW5kL3VzYi91c2JhdWRpby5jCmluZGV4IGJiZDcwZDUuLmM3MDliOTUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi91c2JhdWRpby5jCisrKyBiL3NvdW5kL3VzYi91c2JhdWRpby5jCkBAIC0zNzA5LDcgKzM3MDksNyBAQAogCXZvaWQgKmNoaXA7CiAJY2hpcCA9IHNuZF91c2JfYXVkaW9fcHJvYmUoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKSwgaW50ZiwgaWQpOwogCWlmIChjaGlwKSB7Ci0JCWRldl9zZXRfZHJ2ZGF0YSgmaW50Zi0+ZGV2LCBjaGlwKTsKKwkJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBjaGlwKTsKIAkJcmV0dXJuIDA7CiAJfSBlbHNlCiAJCXJldHVybiAtRUlPOwpAQCAtMzcxOCwxMyArMzcxOCwxMyBAQAogc3RhdGljIHZvaWQgdXNiX2F1ZGlvX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7CiAJc25kX3VzYl9hdWRpb19kaXNjb25uZWN0KGludGVyZmFjZV90b191c2JkZXYoaW50ZiksCi0JCQkJIGRldl9nZXRfZHJ2ZGF0YSgmaW50Zi0+ZGV2KSk7CisJCQkJIHVzYl9nZXRfaW50ZmRhdGEoaW50ZikpOwogfQogCiAjaWZkZWYgQ09ORklHX1BNCiBzdGF0aWMgaW50IHVzYl9hdWRpb19zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKIHsKLQlzdHJ1Y3Qgc25kX3VzYl9hdWRpbyAqY2hpcCA9IGRldl9nZXRfZHJ2ZGF0YSgmaW50Zi0+ZGV2KTsKKwlzdHJ1Y3Qgc25kX3VzYl9hdWRpbyAqY2hpcCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CiAJc3RydWN0IGxpc3RfaGVhZCAqcDsKIAlzdHJ1Y3Qgc25kX3VzYl9zdHJlYW0gKmFzOwogCkBAIC0zNzQ0LDcgKzM3NDQsNyBAQAogCiBzdGF0aWMgaW50IHVzYl9hdWRpb19yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7Ci0Jc3RydWN0IHNuZF91c2JfYXVkaW8gKmNoaXAgPSBkZXZfZ2V0X2RydmRhdGEoJmludGYtPmRldik7CisJc3RydWN0IHNuZF91c2JfYXVkaW8gKmNoaXAgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwogCiAJaWYgKGNoaXAgPT0gKHZvaWQgKiktMUwpCiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3VzYm1pZGkuYyBiL3NvdW5kL3VzYi91c2JtaWRpLmMKaW5kZXggNmQ5ZjliMS4uMzIwNjQxYSAxMDA2NDQKLS0tIGEvc291bmQvdXNiL3VzYm1pZGkuYworKysgYi9zb3VuZC91c2IvdXNibWlkaS5jCkBAIC0xMzkyLDggKzEzOTIsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBpbnRmZC0+Yk51bUVuZHBvaW50czsgKytpKSB7CiAJCWhvc3RlcCA9ICZob3N0aWYtPmVuZHBvaW50W2ldOwogCQllcCA9IGdldF9lcF9kZXNjKGhvc3RlcCk7Ci0JCWlmICgoZXAtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSAhPSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLICYmCi0JCSAgICAoZXAtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSAhPSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQpCisJCWlmICghdXNiX2VuZHBvaW50X3hmZXJfYnVsayhlcCkgJiYgIXVzYl9lbmRwb2ludF94ZmVyX2ludChlcCkpCiAJCQljb250aW51ZTsKIAkJbXNfZXAgPSAoc3RydWN0IHVzYl9tc19lbmRwb2ludF9kZXNjcmlwdG9yKilob3N0ZXAtPmV4dHJhOwogCQlpZiAoaG9zdGVwLT5leHRyYWxlbiA8IDQgfHwKQEAgLTE0MDEsMTUgKzE0MDAsMTUgQEAKIAkJICAgIG1zX2VwLT5iRGVzY3JpcHRvclR5cGUgIT0gVVNCX0RUX0NTX0VORFBPSU5UIHx8CiAJCSAgICBtc19lcC0+YkRlc2NyaXB0b3JTdWJ0eXBlICE9IE1TX0dFTkVSQUwpCiAJCQljb250aW51ZTsKLQkJaWYgKChlcC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykgPT0gVVNCX0RJUl9PVVQpIHsKKwkJaWYgKHVzYl9lbmRwb2ludF9kaXJfb3V0KGVwKSkgewogCQkJaWYgKGVuZHBvaW50c1tlcGlkeF0ub3V0X2VwKSB7CiAJCQkJaWYgKCsrZXBpZHggPj0gTUlESV9NQVhfRU5EUE9JTlRTKSB7CiAJCQkJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJ0b28gbWFueSBlbmRwb2ludHNcbiIpOwogCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9Ci0JCQllbmRwb2ludHNbZXBpZHhdLm91dF9lcCA9IGVwLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLOwotCQkJaWYgKChlcC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spID09IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCkKKwkJCWVuZHBvaW50c1tlcGlkeF0ub3V0X2VwID0gdXNiX2VuZHBvaW50X251bShlcCk7CisJCQlpZiAodXNiX2VuZHBvaW50X3hmZXJfaW50KGVwKSkKIAkJCQllbmRwb2ludHNbZXBpZHhdLm91dF9pbnRlcnZhbCA9IGVwLT5iSW50ZXJ2YWw7CiAJCQllbHNlIGlmIChzbmRfdXNiX2dldF9zcGVlZCh1bWlkaS0+Y2hpcC0+ZGV2KSA9PSBVU0JfU1BFRURfTE9XKQogCQkJCS8qCkBAIC0xNDI4LDggKzE0MjcsOCBAQAogCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9Ci0JCQllbmRwb2ludHNbZXBpZHhdLmluX2VwID0gZXAtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfTlVNQkVSX01BU0s7Ci0JCQlpZiAoKGVwLT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgPT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UKQorCQkJZW5kcG9pbnRzW2VwaWR4XS5pbl9lcCA9IHVzYl9lbmRwb2ludF9udW0oZXApOworCQkJaWYgKHVzYl9lbmRwb2ludF94ZmVyX2ludChlcCkpCiAJCQkJZW5kcG9pbnRzW2VwaWR4XS5pbl9pbnRlcnZhbCA9IGVwLT5iSW50ZXJ2YWw7CiAJCQllbHNlIGlmIChzbmRfdXNiX2dldF9zcGVlZCh1bWlkaS0+Y2hpcC0+ZGV2KSA9PSBVU0JfU1BFRURfTE9XKQogCQkJCWVuZHBvaW50c1tlcGlkeF0uaW5faW50ZXJ2YWwgPSAxOwpAQCAtMTQ5NSwyMCArMTQ5NCwyMCBAQAogCiAJZm9yIChpID0gMDsgaSA8IGludGZkLT5iTnVtRW5kcG9pbnRzOyArK2kpIHsKIAkJZXBkID0gZ2V0X2VuZHBvaW50KGhvc3RpZiwgaSk7Ci0JCWlmICgoZXBkLT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgIT0gVVNCX0VORFBPSU5UX1hGRVJfQlVMSyAmJgotCQkgICAgKGVwZC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spICE9IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCkKKwkJaWYgKCF1c2JfZW5kcG9pbnRfeGZlcl9idWxrKGVwZCkgJiYKKwkJICAgICF1c2JfZW5kcG9pbnRfeGZlcl9pbnQoZXBkKSkKIAkJCWNvbnRpbnVlOwogCQlpZiAob3V0X2VwcyA8IG1heF9lbmRwb2ludHMgJiYKLQkJICAgIChlcGQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spID09IFVTQl9ESVJfT1VUKSB7Ci0JCQllbmRwb2ludFtvdXRfZXBzXS5vdXRfZXAgPSBlcGQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfTlVNQkVSX01BU0s7Ci0JCQlpZiAoKGVwZC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spID09IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCkKKwkJICAgIHVzYl9lbmRwb2ludF9kaXJfb3V0KGVwZCkpIHsKKwkJCWVuZHBvaW50W291dF9lcHNdLm91dF9lcCA9IHVzYl9lbmRwb2ludF9udW0oZXBkKTsKKwkJCWlmICh1c2JfZW5kcG9pbnRfeGZlcl9pbnQoZXBkKSkKIAkJCQllbmRwb2ludFtvdXRfZXBzXS5vdXRfaW50ZXJ2YWwgPSBlcGQtPmJJbnRlcnZhbDsKIAkJCSsrb3V0X2VwczsKIAkJfQogCQlpZiAoaW5fZXBzIDwgbWF4X2VuZHBvaW50cyAmJgotCQkgICAgKGVwZC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykgPT0gVVNCX0RJUl9JTikgewotCQkJZW5kcG9pbnRbaW5fZXBzXS5pbl9lcCA9IGVwZC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSzsKLQkJCWlmICgoZXBkLT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgPT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UKQorCQkgICAgdXNiX2VuZHBvaW50X2Rpcl9pbihlcGQpKSB7CisJCQllbmRwb2ludFtpbl9lcHNdLmluX2VwID0gdXNiX2VuZHBvaW50X251bShlcGQpOworCQkJaWYgKHVzYl9lbmRwb2ludF94ZmVyX2ludChlcGQpKQogCQkJCWVuZHBvaW50W2luX2Vwc10uaW5faW50ZXJ2YWwgPSBlcGQtPmJJbnRlcnZhbDsKIAkJCSsraW5fZXBzOwogCQl9CkBAIC0xNjA3LDIxICsxNjA2LDE5IEBACiAJfQogCiAJZXBkID0gZ2V0X2VuZHBvaW50KGhvc3RpZiwgMCk7Ci0JaWYgKChlcGQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spICE9IFVTQl9ESVJfSU4gfHwKLQkgICAgKGVwZC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spICE9IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCkgeworCWlmICghdXNiX2VuZHBvaW50X2Rpcl9pbihlcGQpIHx8ICF1c2JfZW5kcG9pbnRfeGZlcl9pbnQoZXBkKSkgewogCQlzbmRfcHJpbnRkZChLRVJOX0VSUiAiZW5kcG9pbnRbMF0gaXNuJ3QgaW50ZXJydXB0XG4iKTsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CiAJZXBkID0gZ2V0X2VuZHBvaW50KGhvc3RpZiwgMik7Ci0JaWYgKChlcGQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spICE9IFVTQl9ESVJfT1VUIHx8Ci0JICAgIChlcGQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSAhPSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLKSB7CisJaWYgKCF1c2JfZW5kcG9pbnRfZGlyX291dChlcGQpIHx8ICF1c2JfZW5kcG9pbnRfeGZlcl9idWxrKGVwZCkpIHsKIAkJc25kX3ByaW50ZGQoS0VSTl9FUlIgImVuZHBvaW50WzJdIGlzbid0IGJ1bGsgb3V0cHV0XG4iKTsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CiAJaWYgKGVuZHBvaW50LT5vdXRfY2FibGVzID4gMHgwMDAxKSB7CiAJCWVwZCA9IGdldF9lbmRwb2ludChob3N0aWYsIDQpOwotCQlpZiAoKGVwZC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykgIT0gVVNCX0RJUl9PVVQgfHwKLQkJICAgIChlcGQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSAhPSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLKSB7CisJCWlmICghdXNiX2VuZHBvaW50X2Rpcl9vdXQoZXBkKSB8fAorCQkgICAgIXVzYl9lbmRwb2ludF94ZmVyX2J1bGsoZXBkKSkgewogCQkJc25kX3ByaW50ZGQoS0VSTl9FUlIgImVuZHBvaW50WzRdIGlzbid0IGJ1bGsgb3V0cHV0XG4iKTsKIAkJCXJldHVybiAtRU5YSU87CiAJCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi91c2JtaXhlci5jIGIvc291bmQvdXNiL3VzYm1peGVyLmMKaW5kZXggYTQ5MjQ2MS4uMDAzOTdjOCAxMDA2NDQKLS0tIGEvc291bmQvdXNiL3VzYm1peGVyLmMKKysrIGIvc291bmQvdXNiL3VzYm1peGVyLmMKQEAgLTE3NTUsMTEgKzE3NTUsMTAgQEAKIAlpZiAoZ2V0X2lmYWNlX2Rlc2MoaG9zdGlmKS0+Yk51bUVuZHBvaW50cyA8IDEpCiAJCXJldHVybiAwOwogCWVwID0gZ2V0X2VuZHBvaW50KGhvc3RpZiwgMCk7Ci0JaWYgKChlcC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykgIT0gVVNCX0RJUl9JTiB8fAotCSAgICAoZXAtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSAhPSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQpCisJaWYgKCF1c2JfZW5kcG9pbnRfZGlyX2luKGVwKSB8fCAhdXNiX2VuZHBvaW50X3hmZXJfaW50KGVwKSkKIAkJcmV0dXJuIDA7CiAKLQllcG51bSA9IGVwLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLOworCWVwbnVtID0gdXNiX2VuZHBvaW50X251bShlcCk7CiAJYnVmZmVyX2xlbmd0aCA9IGxlMTZfdG9fY3B1KGVwLT53TWF4UGFja2V0U2l6ZSk7CiAJdHJhbnNmZXJfYnVmZmVyID0ga21hbGxvYyhidWZmZXJfbGVuZ3RoLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXRyYW5zZmVyX2J1ZmZlcikKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi91c3gyeS91czEyMmwuYyBiL3NvdW5kL3VzYi91c3gyeS91czEyMmwuYwppbmRleCBjMjUxNWI2Li43M2U1OWY0IDEwMDY0NAotLS0gYS9zb3VuZC91c2IvdXN4MnkvdXMxMjJsLmMKKysrIGIvc291bmQvdXNiL3VzeDJ5L3VzMTIybC5jCkBAIC01ODksNyArNTg5LDcgQEAKIAlzdHJ1Y3QgdXMxMjJsICp1czEyMmw7CiAJc3RydWN0IGxpc3RfaGVhZCAqcDsKIAotCWNhcmQgPSBkZXZfZ2V0X2RydmRhdGEoJmludGYtPmRldik7CisJY2FyZCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CiAJaWYgKCFjYXJkKQogCQlyZXR1cm4gMDsKIAlzbmRfcG93ZXJfY2hhbmdlX3N0YXRlKGNhcmQsIFNORFJWX0NUTF9QT1dFUl9EM2hvdCk7CkBAIC02MTUsNyArNjE1LDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwOwogCWludCBlcnI7CiAKLQljYXJkID0gZGV2X2dldF9kcnZkYXRhKCZpbnRmLT5kZXYpOworCWNhcmQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwogCWlmICghY2FyZCkKIAkJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi91c3gyeS91c2J1c3gyeS5jIGIvc291bmQvdXNiL3VzeDJ5L3VzYnVzeDJ5LmMKaW5kZXggZTU5ODFhNi4uMTE2MzliZCAxMDA2NDQKLS0tIGEvc291bmQvdXNiL3VzeDJ5L3VzYnVzeDJ5LmMKKysrIGIvc291bmQvdXNiL3VzeDJ5L3VzYnVzeDJ5LmMKQEAgLTIzOCw3ICsyMzgsNyBAQAogCQkJCQlzZW5kID0gMDsKIAkJCQlmb3IgKGogPSAwOyBqIDwgVVJCU19Bc3luY1NlcSAgJiYgICFlcnI7ICsraikKIAkJCQkJaWYgKDAgPT0gdXNYMlktPkFTMDQudXJiW2pdLT5zdGF0dXMpIHsKLQkJCQkJCXN0cnVjdCB1czQyOF9wNG91dCAqcDRvdXQgPSB1czQyOGN0bHMtPnA0b3V0ICsgc2VuZDsJLy8gRklYTUUgaWYgbW9yZSB0aGVuIDEgcDRvdXQgaXMgbmV3LCAxIGdldHMgbG9zdC4KKwkJCQkJCXN0cnVjdCB1czQyOF9wNG91dCAqcDRvdXQgPSB1czQyOGN0bHMtPnA0b3V0ICsgc2VuZDsJLy8gRklYTUUgaWYgbW9yZSB0aGFuIDEgcDRvdXQgaXMgbmV3LCAxIGdldHMgbG9zdC4KIAkJCQkJCXVzYl9maWxsX2J1bGtfdXJiKHVzWDJZLT5BUzA0LnVyYltqXSwgdXNYMlktPmNoaXAuZGV2LAogCQkJCQkJCQkgIHVzYl9zbmRidWxrcGlwZSh1c1gyWS0+Y2hpcC5kZXYsIDB4MDQpLCAmcDRvdXQtPnZhbC52b2wsIAogCQkJCQkJCQkgIHA0b3V0LT50eXBlID09IGVMVF9MaWdodCA/IHNpemVvZihzdHJ1Y3QgdXM0MjhfbGlnaHRzKSA6IDUsCkBAIC0zOTIsNyArMzkyLDcgQEAKIAl2b2lkICpjaGlwOwogCWNoaXAgPSB1c1gyWV91c2JfcHJvYmUoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKSwgaW50ZiwgaWQpOwogCWlmIChjaGlwKSB7Ci0JCWRldl9zZXRfZHJ2ZGF0YSgmaW50Zi0+ZGV2LCBjaGlwKTsKKwkJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBjaGlwKTsKIAkJcmV0dXJuIDA7CiAJfSBlbHNlCiAJCXJldHVybiAtRUlPOwpAQCAtNDAxLDcgKzQwMSw3IEBACiBzdGF0aWMgdm9pZCBzbmRfdXNYMllfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKIAl1c1gyWV91c2JfZGlzY29ubmVjdChpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpLAotCQkJCSBkZXZfZ2V0X2RydmRhdGEoJmludGYtPmRldikpOworCQkJCSB1c2JfZ2V0X2ludGZkYXRhKGludGYpKTsKIH0KIAogTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHNuZF91c1gyWV91c2JfaWRfdGFibGUpOwo=